Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorafinkbein2009-06-30 16:20:27 +0000
committerafinkbein2009-06-30 16:20:27 +0000
commit1e7356a39e26588ed5e7f58e013ddf96fe13446f (patch)
treeab72a98e773718fba697ecbba96a561baab8232f
parentf84afa8a636edbb008037cef318b404fddcaf276 (diff)
downloadorg.eclipse.osee-MS_0_8_1_20090630.tar.gz
org.eclipse.osee-MS_0_8_1_20090630.tar.xz
org.eclipse.osee-MS_0_8_1_20090630.zip
-rw-r--r--javax.mail.glassfish/.classpath7
-rw-r--r--javax.mail.glassfish/.project28
-rw-r--r--javax.mail.glassfish/.settings/org.eclipse.pde.core.prefs5
-rw-r--r--javax.mail.glassfish/META-INF/LICENSE.txt263
-rw-r--r--javax.mail.glassfish/META-INF/MANIFEST.MF18
-rw-r--r--javax.mail.glassfish/META-INF/javamail.charset.map67
-rw-r--r--javax.mail.glassfish/META-INF/javamail.default.address.map1
-rw-r--r--javax.mail.glassfish/META-INF/javamail.default.providers9
-rw-r--r--javax.mail.glassfish/META-INF/mailcap17
-rw-r--r--javax.mail.glassfish/build.properties5
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/image_gif.classbin0 -> 3402 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/image_jpeg.classbin0 -> 1235 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/message_rfc822.classbin0 -> 3380 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/multipart_mixed.classbin0 -> 2617 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/text_html.classbin0 -> 1237 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/text_plain.classbin0 -> 4518 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/handlers/text_xml.classbin0 -> 1232 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/AString.classbin0 -> 347 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/Argument.classbin0 -> 5088 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/Atom.classbin0 -> 374 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/BadCommandException.classbin0 -> 690 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/ByteArray.classbin0 -> 1386 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/CommandFailedException.classbin0 -> 699 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/ConnectionException.classbin0 -> 928 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/Literal.classbin0 -> 227 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/LiteralException.classbin0 -> 597 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/ParsingException.classbin0 -> 681 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/Protocol.classbin0 -> 8028 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/ProtocolException.classbin0 -> 909 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/Response.classbin0 -> 7493 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/ResponseHandler.classbin0 -> 186 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/iap/ResponseInputStream.classbin0 -> 1989 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/ACL.classbin0 -> 1182 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/AppendUID.classbin0 -> 429 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$1.classbin0 -> 1075 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$2.classbin0 -> 1075 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/DefaultFolder.classbin0 -> 2931 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPBodyPart.classbin0 -> 8853 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$1.classbin0 -> 1058 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$10.classbin0 -> 1304 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$11.classbin0 -> 1330 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$12.classbin0 -> 991 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$13.classbin0 -> 1009 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$14.classbin0 -> 990 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$15.classbin0 -> 1055 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$16.classbin0 -> 1077 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$17.classbin0 -> 994 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$18.classbin0 -> 1136 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$19.classbin0 -> 1321 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$2.classbin0 -> 1461 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$3.classbin0 -> 1077 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$4.classbin0 -> 1058 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$5.classbin0 -> 1076 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$6.classbin0 -> 1710 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$7.classbin0 -> 1527 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$8.classbin0 -> 1034 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$9.classbin0 -> 1207 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$FetchProfileItem.classbin0 -> 674 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$ProtocolCommand.classbin0 -> 365 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPFolder.classbin0 -> 37403 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPInputStream.classbin0 -> 4525 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPMessage$1FetchProfileCondition.classbin0 -> 2507 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPMessage.classbin0 -> 25851 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPMultipartDataSource.classbin0 -> 1731 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPNestedMessage.classbin0 -> 2218 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPSSLStore.classbin0 -> 519 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPStore$ConnectionPool.classbin0 -> 3743 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/IMAPStore.classbin0 -> 26303 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/LengthCounter.classbin0 -> 1551 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/MessageLiteral.classbin0 -> 1652 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/Rights$Right.classbin0 -> 1370 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/Rights.classbin0 -> 3287 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/Utility$Condition.classbin0 -> 249 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/Utility.classbin0 -> 2249 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxDecoder.classbin0 -> 2590 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxEncoder.classbin0 -> 2795 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/BODY.classbin0 -> 1488 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/BODYSTRUCTURE.classbin0 -> 8055 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/ENVELOPE.classbin0 -> 2666 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/FLAGS.classbin0 -> 1777 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/FetchResponse.classbin0 -> 4187 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPAddress.classbin0 -> 2330 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPProtocol.classbin0 -> 35744 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPResponse.classbin0 -> 2514 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator$1.classbin0 -> 2767 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator.classbin0 -> 6352 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/INTERNALDATE.classbin0 -> 2525 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/Item.classbin0 -> 116 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/ListInfo.classbin0 -> 1851 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/MailboxInfo.classbin0 -> 2005 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/MessageSet.classbin0 -> 1845 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces$Namespace.classbin0 -> 1689 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces.classbin0 -> 1844 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822DATA.classbin0 -> 1197 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822SIZE.classbin0 -> 875 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/SaslAuthenticator.classbin0 -> 325 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/SearchSequence.classbin0 -> 10099 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/Status.classbin0 -> 1759 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/UID.classbin0 -> 816 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/imap/protocol/UIDSet.classbin0 -> 1830 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/DefaultFolder.classbin0 -> 3104 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/POP3Folder.classbin0 -> 10194 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/POP3Message.classbin0 -> 6266 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/POP3SSLStore.classbin0 -> 519 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/POP3Store.classbin0 -> 6712 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/Protocol.classbin0 -> 8938 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/Response.classbin0 -> 435 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/SharedByteArrayOutputStream.classbin0 -> 580 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/pop3/Status.classbin0 -> 352 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/DigestMD5.classbin0 -> 5581 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressFailedException.classbin0 -> 1027 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressSucceededException.classbin0 -> 1035 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPMessage.classbin0 -> 3655 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPOutputStream.classbin0 -> 1223 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPSSLTransport.classbin0 -> 539 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPSendFailedException.classbin0 -> 1121 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/smtp/SMTPTransport.classbin0 -> 29035 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/ASCIIUtility.classbin0 -> 3577 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/BASE64DecoderStream.classbin0 -> 5758 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/BASE64EncoderStream.classbin0 -> 3697 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/BEncoderStream.classbin0 -> 526 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/CRLFOutputStream.classbin0 -> 1428 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/FolderClosedIOException.classbin0 -> 781 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/LineInputStream.classbin0 -> 1234 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/LineOutputStream.classbin0 -> 1186 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/MessageRemovedIOException.classbin0 -> 542 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/QDecoderStream.classbin0 -> 1118 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/QEncoderStream.classbin0 -> 1261 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/QPDecoderStream.classbin0 -> 1692 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/QPEncoderStream.classbin0 -> 2193 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/SocketFetcher$1.classbin0 -> 750 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/SocketFetcher.classbin0 -> 7633 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/TraceInputStream.classbin0 -> 1681 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/TraceOutputStream.classbin0 -> 1560 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/UUDecoderStream.classbin0 -> 3277 bytes
-rw-r--r--javax.mail.glassfish/com/sun/mail/util/UUEncoderStream.classbin0 -> 2975 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Address.classbin0 -> 461 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/AuthenticationFailedException.classbin0 -> 556 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Authenticator.classbin0 -> 1612 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/BodyPart.classbin0 -> 562 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/EventQueue$QueueElement.classbin0 -> 661 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/EventQueue.classbin0 -> 2106 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/FetchProfile$Item.classbin0 -> 654 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/FetchProfile.classbin0 -> 1633 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Flags$Flag.classbin0 -> 874 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Flags.classbin0 -> 4799 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Folder$TerminatorEvent.classbin0 -> 723 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Folder.classbin0 -> 11202 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/FolderClosedException.classbin0 -> 771 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/FolderNotFoundException.classbin0 -> 987 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Header.classbin0 -> 587 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/IllegalWriteException.classbin0 -> 526 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Message$RecipientType.classbin0 -> 1362 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Message.classbin0 -> 4391 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/MessageAware.classbin0 -> 176 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/MessageContext.classbin0 -> 1312 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/MessageRemovedException.classbin0 -> 532 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/MessagingException.classbin0 -> 1775 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/MethodNotSupportedException.classbin0 -> 544 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Multipart.classbin0 -> 2692 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/MultipartDataSource.classbin0 -> 297 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/NoSuchProviderException.classbin0 -> 538 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Part.classbin0 -> 1562 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/PasswordAuthentication.classbin0 -> 649 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Provider$Type.classbin0 -> 682 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Provider.classbin0 -> 1616 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Quota$Resource.classbin0 -> 534 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Quota.classbin0 -> 1071 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/QuotaAwareStore.classbin0 -> 294 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/ReadOnlyFolderException.classbin0 -> 777 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/SendFailedException.classbin0 -> 1350 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Service$TerminatorEvent.classbin0 -> 727 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Service.classbin0 -> 6633 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$1.classbin0 -> 730 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$2.classbin0 -> 769 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$3.classbin0 -> 718 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$4.classbin0 -> 766 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$5.classbin0 -> 1407 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$6.classbin0 -> 1322 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session$7.classbin0 -> 659 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Session.classbin0 -> 18579 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Store.classbin0 -> 2961 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/StoreClosedException.classbin0 -> 762 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/StreamLoader.classbin0 -> 201 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Transport.classbin0 -> 4949 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/UIDFolder$FetchProfileItem.classbin0 -> 601 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/UIDFolder.classbin0 -> 573 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/URLName.classbin0 -> 8478 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/Version.classbin0 -> 342 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/ConnectionAdapter.classbin0 -> 668 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/ConnectionEvent.classbin0 -> 1004 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/ConnectionListener.classbin0 -> 262 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/FolderAdapter.classbin0 -> 659 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/FolderEvent.classbin0 -> 1490 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/FolderListener.classbin0 -> 265 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/MailEvent.classbin0 -> 437 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/MessageChangedEvent.classbin0 -> 1097 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/MessageChangedListener.classbin0 -> 242 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/MessageCountAdapter.classbin0 -> 614 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/MessageCountEvent.classbin0 -> 1273 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/MessageCountListener.classbin0 -> 261 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/StoreEvent.classbin0 -> 1044 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/StoreListener.classbin0 -> 213 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/TransportAdapter.classbin0 -> 698 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/TransportEvent.classbin0 -> 1799 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/event/TransportListener.classbin0 -> 295 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/AddressException.classbin0 -> 1504 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/AsciiOutputStream.classbin0 -> 1719 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ContentDisposition.classbin0 -> 2516 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ContentType.classbin0 -> 3479 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/HeaderTokenizer$Token.classbin0 -> 855 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/HeaderTokenizer.classbin0 -> 3824 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/InternetAddress.classbin0 -> 12269 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/InternetHeaders$InternetHeader.classbin0 -> 1392 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/InternetHeaders$matchEnum.classbin0 -> 2064 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/InternetHeaders.classbin0 -> 6560 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MailDateFormat.classbin0 -> 4707 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MailDateParser.classbin0 -> 4831 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimeBodyPart.classbin0 -> 17697 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimeMessage$RecipientType.classbin0 -> 968 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimeMessage.classbin0 -> 21630 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimeMultipart.classbin0 -> 12723 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimePart.classbin0 -> 986 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimePartDataSource.classbin0 -> 3207 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimeUtility$1NullInputStream.classbin0 -> 455 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/MimeUtility.classbin0 -> 18742 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/NewsAddress.classbin0 -> 2907 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParameterList$1.classbin0 -> 220 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParameterList$MultiValue.classbin0 -> 683 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParameterList$ParamEnum.classbin0 -> 784 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParameterList$ToStringBuffer.classbin0 -> 1537 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParameterList$Value.classbin0 -> 706 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParameterList.classbin0 -> 10575 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/ParseException.classbin0 -> 523 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/PreencodedMimeBodyPart.classbin0 -> 1595 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/SharedInputStream.classbin0 -> 211 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/internet/UniqueValue.classbin0 -> 1558 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/AddressStringTerm.classbin0 -> 1032 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/AddressTerm.classbin0 -> 1008 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/AndTerm.classbin0 -> 1573 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/BodyTerm.classbin0 -> 1526 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/ComparisonTerm.classbin0 -> 832 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/DateTerm.classbin0 -> 1365 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/FlagTerm.classbin0 -> 1916 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/FromStringTerm.classbin0 -> 1059 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/FromTerm.classbin0 -> 1039 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/HeaderTerm.classbin0 -> 1585 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/IntegerComparisonTerm.classbin0 -> 1197 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/MessageIDTerm.classbin0 -> 1076 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/MessageNumberTerm.classbin0 -> 923 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/NotTerm.classbin0 -> 1045 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/OrTerm.classbin0 -> 1570 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/ReceivedDateTerm.classbin0 -> 994 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/RecipientStringTerm.classbin0 -> 1642 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/RecipientTerm.classbin0 -> 1623 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/SearchException.classbin0 -> 522 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/SearchTerm.classbin0 -> 425 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/SentDateTerm.classbin0 -> 978 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/SizeTerm.classbin0 -> 908 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/StringTerm.classbin0 -> 1513 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/search/SubjectTerm.classbin0 -> 961 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/util/ByteArrayDataSource$DSByteArrayOutputStream.classbin0 -> 671 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/util/ByteArrayDataSource.classbin0 -> 2663 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/util/SharedByteArrayInputStream.classbin0 -> 1047 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/util/SharedFileInputStream$SharedFile.classbin0 -> 1466 bytes
-rw-r--r--javax.mail.glassfish/javax/mail/util/SharedFileInputStream.classbin0 -> 5455 bytes
-rw-r--r--net.jini/.classpath41
-rw-r--r--net.jini/.project28
-rw-r--r--net.jini/META-INF/MANIFEST.MF133
-rw-r--r--net.jini/build.properties7
-rw-r--r--net.jini/jini2_1/LICENSE201
-rw-r--r--net.jini/jini2_1/NOTICE5
-rw-r--r--net.jini/jini2_1/configentry/ServiceDiscoveryManager9
-rw-r--r--net.jini/jini2_1/configentry/WakeupManager2
-rw-r--r--net.jini/jini2_1/configentry/fiddler-transient46
-rw-r--r--net.jini/jini2_1/configentry/mercury-persistent50
-rw-r--r--net.jini/jini2_1/configentry/norm-activatable56
-rw-r--r--net.jini/jini2_1/configentry/norm-transient46
-rw-r--r--net.jini/jini2_1/configentry/outrigger-persistent63
-rw-r--r--net.jini/jini2_1/configentry/phoenix17
-rw-r--r--net.jini/jini2_1/configentry/phoenix-stop5
-rw-r--r--net.jini/jini2_1/configentry/reggie-activatable66
-rw-r--r--net.jini/jini2_1/configentry/reggie-persistent63
-rw-r--r--net.jini/jini2_1/configentry/reggie-transient57
-rw-r--r--net.jini/jini2_1/configentry/start7
-rw-r--r--net.jini/jini2_1/doc.zipbin0 -> 9575635 bytes
-rw-r--r--net.jini/jini2_1/index.html58
-rw-r--r--net.jini/jini2_1/lib-dl/browser-dl.jarbin0 -> 3505 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/fiddler-dl.jarbin0 -> 35018 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/group-dl.jarbin0 -> 4498 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/jsk-dl.jarbin0 -> 61563 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/mahalo-dl.jarbin0 -> 16470 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/mercury-dl.jarbin0 -> 31208 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/norm-dl.jarbin0 -> 22080 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/outrigger-dl.jarbin0 -> 56751 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/phoenix-dl.jarbin0 -> 19141 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/reggie-dl.jarbin0 -> 58054 bytes
-rw-r--r--net.jini/jini2_1/lib-dl/sdm-dl.jarbin0 -> 3703 bytes
-rw-r--r--net.jini/jini2_1/lib-ext/jsk-policy.jarbin0 -> 31055 bytes
-rw-r--r--net.jini/jini2_1/lib/browser.jarbin0 -> 117949 bytes
-rw-r--r--net.jini/jini2_1/lib/checkconfigurationfile.jarbin0 -> 2761 bytes
-rw-r--r--net.jini/jini2_1/lib/checkser.jarbin0 -> 2750 bytes
-rw-r--r--net.jini/jini2_1/lib/classdep.jarbin0 -> 2751 bytes
-rw-r--r--net.jini/jini2_1/lib/classserver.jarbin0 -> 2750 bytes
-rw-r--r--net.jini/jini2_1/lib/computedigest.jarbin0 -> 2754 bytes
-rw-r--r--net.jini/jini2_1/lib/computehttpmdcodebase.jarbin0 -> 2758 bytes
-rw-r--r--net.jini/jini2_1/lib/destroy.jarbin0 -> 63264 bytes
-rw-r--r--net.jini/jini2_1/lib/envcheck.jarbin0 -> 3237 bytes
-rw-r--r--net.jini/jini2_1/lib/fiddler.jarbin0 -> 119861 bytes
-rw-r--r--net.jini/jini2_1/lib/group.jarbin0 -> 9242 bytes
-rw-r--r--net.jini/jini2_1/lib/jarwrapper.jarbin0 -> 2742 bytes
-rw-r--r--net.jini/jini2_1/lib/jini-core.jarbin0 -> 67582 bytes
-rw-r--r--net.jini/jini2_1/lib/jini-ext.jarbin0 -> 1151933 bytes
-rw-r--r--net.jini/jini2_1/lib/jsk-debug-policy.jarbin0 -> 7159 bytes
-rw-r--r--net.jini/jini2_1/lib/jsk-lib.jarbin0 -> 291877 bytes
-rw-r--r--net.jini/jini2_1/lib/jsk-platform.jarbin0 -> 995179 bytes
-rw-r--r--net.jini/jini2_1/lib/jsk-resources.jarbin0 -> 1722 bytes
-rw-r--r--net.jini/jini2_1/lib/mahalo.jarbin0 -> 107261 bytes
-rw-r--r--net.jini/jini2_1/lib/mercury.jarbin0 -> 120009 bytes
-rw-r--r--net.jini/jini2_1/lib/norm.jarbin0 -> 115257 bytes
-rw-r--r--net.jini/jini2_1/lib/outrigger-logstore.jarbin0 -> 51727 bytes
-rw-r--r--net.jini/jini2_1/lib/outrigger-snaplogstore.jarbin0 -> 37218 bytes
-rw-r--r--net.jini/jini2_1/lib/outrigger.jarbin0 -> 200520 bytes
-rw-r--r--net.jini/jini2_1/lib/phoenix-group.jarbin0 -> 41524 bytes
-rw-r--r--net.jini/jini2_1/lib/phoenix-init.jarbin0 -> 2610 bytes
-rw-r--r--net.jini/jini2_1/lib/phoenix.jarbin0 -> 86902 bytes
-rw-r--r--net.jini/jini2_1/lib/prebuilt-outrigger-logstore.jarbin0 -> 21952 bytes
-rw-r--r--net.jini/jini2_1/lib/preferredlistgen.jarbin0 -> 2755 bytes
-rw-r--r--net.jini/jini2_1/lib/reggie.jarbin0 -> 141059 bytes
-rw-r--r--net.jini/jini2_1/lib/sharedvm.jarbin0 -> 28130 bytes
-rw-r--r--net.jini/jini2_1/lib/start.jarbin0 -> 63029 bytes
-rw-r--r--net.jini/jini2_1/lib/sun-util.jarbin0 -> 127824 bytes
-rw-r--r--net.jini/jini2_1/lib/tools.jarbin0 -> 207818 bytes
-rw-r--r--net.jini/jini2_1/source.zipbin0 -> 3504561 bytes
-rw-r--r--net.jini/jini_config/jsk-all.policy3
-rw-r--r--net.jini/jini_config/start-transient-jeri-services.config40
-rw-r--r--net.jini/jini_config/transient-reggie.config3
-rw-r--r--net.jini/src/net/jini/JiniPlugin.java59
-rw-r--r--org.eclipse.nebula.widgets.xviewer/.classpath7
-rw-r--r--org.eclipse.nebula.widgets.xviewer/.project28
-rw-r--r--org.eclipse.nebula.widgets.xviewer/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.nebula.widgets.xviewer/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.nebula.widgets.xviewer/build.properties4
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/Activator.java74
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/IXViewerFactory.java88
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XPromptChange.java110
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XSubMenuManager.java45
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewer.java590
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerCells.java33
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumn.java244
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnLabelProvider.java44
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnSorter.java43
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerFactory.java161
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerLabelProvider.java144
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerSorter.java243
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerStyledTextLabelProvider.java206
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTextFilter.java124
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTreeReport.java124
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerValueColumn.java76
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnData.java87
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterData.java85
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterDataUI.java63
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeData.java202
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeDataLabelProvider.java55
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeManager.java504
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FileStoreCustomizations.java143
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterData.java52
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterDataUI.java107
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/IXViewerCustomizations.java79
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SearchDataUI.java167
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SortingData.java144
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomMenu.java553
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomizations.java69
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/CustomizationDataSelectionDialog.java168
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/XViewerCustomizeDialog.java1150
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/IXViewerTestTask.java46
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerStyledStringLableProviderTest.java125
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTest.java163
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestContentProvider.java69
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestCustomizations.java131
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestFactory.java74
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestLabelProvider.java94
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestStyledStringLabelProvider.java126
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestTask.java114
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringMultiSelectionDialog.java116
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringSingleSelectionDialog.java43
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/XViewerException.java40
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/ArrayTreeContentProvider.java84
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/CollectionsUtil.java268
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FileUtil.java116
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FilteredTree.java916
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/HtmlUtil.java468
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/MatchFilter.java32
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/OverlayUtil.java122
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/PatternFilter.java337
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringLabelProvider.java45
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringViewerSorter.java40
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerFilteredTree.java65
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLib.java190
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLog.java49
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerTextWidget.java510
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidget.java435
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidgetModifiedListener.java19
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XmlUtil.java155
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DateSelectionDialog.java103
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DialogWithEntry.java245
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/HtmlDialog.java95
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/ListDialogSortable.java58
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/XViewerImageCache.java44
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_disabled.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_enabled.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clear.gifbin0 -> 595 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clock.gifbin0 -> 368 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customize.gifbin0 -> 500 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeD.gifbin0 -> 61 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeG.gifbin0 -> 64 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeP.gifbin0 -> 64 bytes
-rw-r--r--org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizePersonal.gifbin0 -> 508 bytes
-rw-r--r--org.eclipse.osee.ats.config.demo/.classpath7
-rw-r--r--org.eclipse.osee.ats.config.demo/.project28
-rw-r--r--org.eclipse.osee.ats.config.demo/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.ats.config.demo/META-INF/MANIFEST.MF34
-rw-r--r--org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbInit.launch39
-rw-r--r--org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbPopulate.launch42
-rw-r--r--org.eclipse.osee.ats.config.demo/README.txt54
-rw-r--r--org.eclipse.osee.ats.config.demo/build.properties8
-rw-r--r--org.eclipse.osee.ats.config.demo/images/workflow.gifbin0 -> 499 bytes
-rw-r--r--org.eclipse.osee.ats.config.demo/plugin.xml74
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/DemoArtifactImageProvider.java27
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoArtifactFactory.java45
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoCodeTeamWorkflowArtifact.java36
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoReqTeamWorkflowArtifact.java36
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTeamWorkflows.java97
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTestTeamWorkflowArtifact.java36
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddCommonBranchForAtsDemo.java52
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddDbInitDemoChoice.java50
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDatabaseConfig.java168
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbAIs.java37
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbActionData.java125
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbGroups.java60
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbReviews.java179
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbTasks.java63
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbUtil.java97
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/PopulateDemoActions.java574
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/internal/OseeAtsConfigDemoActivator.java52
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/navigate/DemoNavigateViewItems.java132
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/test/MasterTestSuite_DemoDbPopulate.java67
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoImage.java45
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoTeams.java52
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoWorkType.java20
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddDecisionReviewRule.java42
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddPeerToPeerReviewRule.java41
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoCodeWorkFlowDefinition.java38
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoReqWorkFlowDefinition.java40
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoSWDesignWorkFlowDefinition.java73
-rw-r--r--org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoTestWorkFlowDefinition.java37
-rw-r--r--org.eclipse.osee.ats.config.demo/support/DB Demo Config [localhost].launch34
-rw-r--r--org.eclipse.osee.ats.config.demo/support/DB Demo Config [microdoc].launch33
-rw-r--r--org.eclipse.osee.ats.config.demo/support/OSEE Demo Product [microdoc].launch36
-rw-r--r--org.eclipse.osee.ats.config.demo/support/Osee ATS Config Demo.vue1531
-rw-r--r--org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoCommon.xml1269
-rw-r--r--org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoProgram.xml1588
-rw-r--r--org.eclipse.osee.ats.config.demo/support/SAW-SoftwareRequirements.xml3
-rw-r--r--org.eclipse.osee.ats.config.demo/support/SAW-SubsystemRequirements.xml3
-rw-r--r--org.eclipse.osee.ats.config.demo/support/SAW-SystemRequirements.xml2719
-rw-r--r--org.eclipse.osee.ats.feature/.project17
-rw-r--r--org.eclipse.osee.ats.feature/build.properties5
-rw-r--r--org.eclipse.osee.ats.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.ats.feature/feature.properties144
-rw-r--r--org.eclipse.osee.ats.feature/feature.xml32
-rw-r--r--org.eclipse.osee.ats.feature/license.html79
-rw-r--r--org.eclipse.osee.ats.feature/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.ats.feature/sourceTemplateFeature/feature.properties144
-rw-r--r--org.eclipse.osee.ats.help.ui/.classpath7
-rw-r--r--org.eclipse.osee.ats.help.ui/.project28
-rw-r--r--org.eclipse.osee.ats.help.ui/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.ats.help.ui/META-INF/MANIFEST.MF8
-rw-r--r--org.eclipse.osee.ats.help.ui/about.html27
-rw-r--r--org.eclipse.osee.ats.help.ui/build-helper.xml78
-rw-r--r--org.eclipse.osee.ats.help.ui/build.properties8
-rw-r--r--org.eclipse.osee.ats.help.ui/customBuildCallbacks.xml161
-rw-r--r--org.eclipse.osee.ats.help.ui/intro/overviewExtensionContent.xml13
-rw-r--r--org.eclipse.osee.ats.help.ui/intro/tutorialsExtensionContent.xml26
-rw-r--r--org.eclipse.osee.ats.help.ui/plugin.xml48
-rw-r--r--org.eclipse.osee.ats.help.ui/toc.xml46
-rw-r--r--org.eclipse.osee.ats.test/.classpath7
-rw-r--r--org.eclipse.osee.ats.test/.project28
-rw-r--r--org.eclipse.osee.ats.test/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.osee.ats.test/build.properties5
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsDbInitTest.java39
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Config_Suite.java28
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Demo_Suite.java40
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Production_Suite.java23
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_TestDb_Suite.java25
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/MasterTestSuite_DemoDbInit.java37
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsActionableItemToTeamDefinitionTest.java42
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsBranchConfigurationTest.java443
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsDeleteManagerTest.java249
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsImageTest.java24
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToMassEditorTest.java85
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToTaskEditorTest.java155
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToWorldViewTest.java551
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsPurgeTest.java101
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsQueryPerformanceTests.java73
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsTeamDefintionToWorkflowTest.java43
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsValidateAtsDatabaseTest.java50
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsWorkItemDefinitionTest.java54
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/SMAPromptChangeStatusTest.java182
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/CustomizeDemoTableTestUtil.java49
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/DemoTestUtil.java164
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/NavigateTestUtil.java127
-rw-r--r--org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/SMATestUtil.java52
-rw-r--r--org.eclipse.osee.ats/.classpath7
-rw-r--r--org.eclipse.osee.ats/.project28
-rw-r--r--org.eclipse.osee.ats/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.ats/META-INF/MANIFEST.MF83
-rw-r--r--org.eclipse.osee.ats/build.properties8
-rw-r--r--org.eclipse.osee.ats/images/AI.gifbin0 -> 475 bytes
-rw-r--r--org.eclipse.osee.ats/images/D.gifbin0 -> 861 bytes
-rw-r--r--org.eclipse.osee.ats/images/MyWorld.gifbin0 -> 475 bytes
-rw-r--r--org.eclipse.osee.ats/images/P.gifbin0 -> 858 bytes
-rw-r--r--org.eclipse.osee.ats/images/R.gifbin0 -> 863 bytes
-rw-r--r--org.eclipse.osee.ats/images/T.gifbin0 -> 862 bytes
-rw-r--r--org.eclipse.osee.ats/images/X.gifbin0 -> 866 bytes
-rw-r--r--org.eclipse.osee.ats/images/action.gifbin0 -> 864 bytes
-rw-r--r--org.eclipse.osee.ats/images/artView.gifbin0 -> 471 bytes
-rw-r--r--org.eclipse.osee.ats/images/atsNavigate.gifbin0 -> 497 bytes
-rw-r--r--org.eclipse.osee.ats/images/atsPerspective.gifbin0 -> 476 bytes
-rw-r--r--org.eclipse.osee.ats/images/center.gifbin0 -> 465 bytes
-rw-r--r--org.eclipse.osee.ats/images/check.gifbin0 -> 131 bytes
-rw-r--r--org.eclipse.osee.ats/images/community.gifbin0 -> 937 bytes
-rw-r--r--org.eclipse.osee.ats/images/configDef.gifbin0 -> 493 bytes
-rw-r--r--org.eclipse.osee.ats/images/connection_d16.gifbin0 -> 852 bytes
-rw-r--r--org.eclipse.osee.ats/images/connection_d24.gifbin0 -> 913 bytes
-rw-r--r--org.eclipse.osee.ats/images/connection_s16.gifbin0 -> 856 bytes
-rw-r--r--org.eclipse.osee.ats/images/connection_s24.gifbin0 -> 324 bytes
-rw-r--r--org.eclipse.osee.ats/images/copyToClipboard.gifbin0 -> 604 bytes
-rw-r--r--org.eclipse.osee.ats/images/cots.gifbin0 -> 864 bytes
-rw-r--r--org.eclipse.osee.ats/images/currentState.gifbin0 -> 482 bytes
-rw-r--r--org.eclipse.osee.ats/images/customize.gifbin0 -> 500 bytes
-rw-r--r--org.eclipse.osee.ats/images/down.gifbin0 -> 332 bytes
-rw-r--r--org.eclipse.osee.ats/images/downTriangle.gifbin0 -> 77 bytes
-rw-r--r--org.eclipse.osee.ats/images/editAction.gifbin0 -> 590 bytes
-rw-r--r--org.eclipse.osee.ats/images/editPencil.gifbin0 -> 210 bytes
-rw-r--r--org.eclipse.osee.ats/images/ellipse16.gifbin0 -> 879 bytes
-rw-r--r--org.eclipse.osee.ats/images/ellipse24.gifbin0 -> 916 bytes
-rw-r--r--org.eclipse.osee.ats/images/email.gifbin0 -> 362 bytes
-rw-r--r--org.eclipse.osee.ats/images/error.gifbin0 -> 82 bytes
-rw-r--r--org.eclipse.osee.ats/images/favorite.gifbin0 -> 283 bytes
-rw-r--r--org.eclipse.osee.ats/images/filter.gifbin0 -> 211 bytes
-rw-r--r--org.eclipse.osee.ats/images/flashlight.gifbin0 -> 347 bytes
-rw-r--r--org.eclipse.osee.ats/images/folder.gifbin0 -> 916 bytes
-rw-r--r--org.eclipse.osee.ats/images/globe.gifbin0 -> 1060 bytes
-rw-r--r--org.eclipse.osee.ats/images/globe.jpgbin0 -> 4700 bytes
-rw-r--r--org.eclipse.osee.ats/images/globePlus.gifbin0 -> 1048 bytes
-rw-r--r--org.eclipse.osee.ats/images/globePlusSelect.gifbin0 -> 1036 bytes
-rw-r--r--org.eclipse.osee.ats/images/globeSelect.gifbin0 -> 1045 bytes
-rw-r--r--org.eclipse.osee.ats/images/greenBall.gifbin0 -> 1026 bytes
-rw-r--r--org.eclipse.osee.ats/images/greenBug.gifbin0 -> 348 bytes
-rw-r--r--org.eclipse.osee.ats/images/greenPlus.gifbin0 -> 318 bytes
-rw-r--r--org.eclipse.osee.ats/images/group.gifbin0 -> 364 bytes
-rw-r--r--org.eclipse.osee.ats/images/home.gifbin0 -> 539 bytes
-rw-r--r--org.eclipse.osee.ats/images/hyper.gifbin0 -> 474 bytes
-rw-r--r--org.eclipse.osee.ats/images/inHouse.gifbin0 -> 871 bytes
-rw-r--r--org.eclipse.osee.ats/images/info.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.osee.ats/images/info2.gifbin0 -> 121 bytes
-rw-r--r--org.eclipse.osee.ats/images/metric.gifbin0 -> 870 bytes
-rw-r--r--org.eclipse.osee.ats/images/myTasks.gifbin0 -> 88 bytes
-rw-r--r--org.eclipse.osee.ats/images/newAction.gifbin0 -> 508 bytes
-rw-r--r--org.eclipse.osee.ats/images/newCategory.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.osee.ats/images/newNote.gifbin0 -> 486 bytes
-rw-r--r--org.eclipse.osee.ats/images/newTask.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.osee.ats/images/newWorld.gifbin0 -> 480 bytes
-rw-r--r--org.eclipse.osee.ats/images/newWorldSelected.gifbin0 -> 481 bytes
-rw-r--r--org.eclipse.osee.ats/images/note.gifbin0 -> 475 bytes
-rw-r--r--org.eclipse.osee.ats/images/openId.gifbin0 -> 860 bytes
-rw-r--r--org.eclipse.osee.ats/images/openParent.gifbin0 -> 863 bytes
-rw-r--r--org.eclipse.osee.ats/images/orangeR_8_8.gifbin0 -> 281 bytes
-rw-r--r--org.eclipse.osee.ats/images/order.gifbin0 -> 370 bytes
-rw-r--r--org.eclipse.osee.ats/images/personal.gifbin0 -> 863 bytes
-rw-r--r--org.eclipse.osee.ats/images/pinEditor.gifbin0 -> 358 bytes
-rw-r--r--org.eclipse.osee.ats/images/plan.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.ats/images/play.gifbin0 -> 379 bytes
-rw-r--r--org.eclipse.osee.ats/images/print.gifbin0 -> 607 bytes
-rw-r--r--org.eclipse.osee.ats/images/privEdit.gifbin0 -> 577 bytes
-rw-r--r--org.eclipse.osee.ats/images/product.gifbin0 -> 474 bytes
-rw-r--r--org.eclipse.osee.ats/images/productDef.gifbin0 -> 501 bytes
-rw-r--r--org.eclipse.osee.ats/images/publish.gifbin0 -> 862 bytes
-rw-r--r--org.eclipse.osee.ats/images/rank.gifbin0 -> 475 bytes
-rw-r--r--org.eclipse.osee.ats/images/rectangle16.gifbin0 -> 878 bytes
-rw-r--r--org.eclipse.osee.ats/images/rectangle24.gifbin0 -> 911 bytes
-rw-r--r--org.eclipse.osee.ats/images/redCheck.gifbin0 -> 125 bytes
-rw-r--r--org.eclipse.osee.ats/images/redDot.gifbin0 -> 72 bytes
-rw-r--r--org.eclipse.osee.ats/images/redRemove.gifbin0 -> 143 bytes
-rw-r--r--org.eclipse.osee.ats/images/red_user.gifbin0 -> 341 bytes
-rw-r--r--org.eclipse.osee.ats/images/red_user_sm.gifbin0 -> 319 bytes
-rw-r--r--org.eclipse.osee.ats/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.ats/images/relate.gifbin0 -> 160 bytes
-rw-r--r--org.eclipse.osee.ats/images/release.gifbin0 -> 468 bytes
-rw-r--r--org.eclipse.osee.ats/images/remove.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.ats/images/removeAll.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.ats/images/report.gifbin0 -> 648 bytes
-rw-r--r--org.eclipse.osee.ats/images/repository.gifbin0 -> 861 bytes
-rw-r--r--org.eclipse.osee.ats/images/reviewer.gifbin0 -> 502 bytes
-rw-r--r--org.eclipse.osee.ats/images/role.gifbin0 -> 104 bytes
-rw-r--r--org.eclipse.osee.ats/images/route.gifbin0 -> 470 bytes
-rw-r--r--org.eclipse.osee.ats/images/sample.gifbin0 -> 983 bytes
-rw-r--r--org.eclipse.osee.ats/images/search.gifbin0 -> 870 bytes
-rw-r--r--org.eclipse.osee.ats/images/simpleTask.gifbin0 -> 486 bytes
-rw-r--r--org.eclipse.osee.ats/images/star.gifbin0 -> 989 bytes
-rw-r--r--org.eclipse.osee.ats/images/state.gifbin0 -> 472 bytes
-rw-r--r--org.eclipse.osee.ats/images/subscribed.gifbin0 -> 176 bytes
-rw-r--r--org.eclipse.osee.ats/images/subscribedEmail.gifbin0 -> 354 bytes
-rw-r--r--org.eclipse.osee.ats/images/tanBall.gifbin0 -> 1033 bytes
-rw-r--r--org.eclipse.osee.ats/images/task.gifbin0 -> 1008 bytes
-rw-r--r--org.eclipse.osee.ats/images/taskSelected.gifbin0 -> 997 bytes
-rw-r--r--org.eclipse.osee.ats/images/team.gifbin0 -> 946 bytes
-rw-r--r--org.eclipse.osee.ats/images/tool.gifbin0 -> 474 bytes
-rw-r--r--org.eclipse.osee.ats/images/trash.gifbin0 -> 904 bytes
-rw-r--r--org.eclipse.osee.ats/images/up.gifbin0 -> 323 bytes
-rw-r--r--org.eclipse.osee.ats/images/user.gifbin0 -> 542 bytes
-rw-r--r--org.eclipse.osee.ats/images/userAdd.gifbin0 -> 576 bytes
-rw-r--r--org.eclipse.osee.ats/images/user_sm.gifbin0 -> 314 bytes
-rw-r--r--org.eclipse.osee.ats/images/users.gifbin0 -> 257 bytes
-rw-r--r--org.eclipse.osee.ats/images/users2.gifbin0 -> 597 bytes
-rw-r--r--org.eclipse.osee.ats/images/version.gifbin0 -> 477 bytes
-rw-r--r--org.eclipse.osee.ats/images/warn.gifbin0 -> 338 bytes
-rw-r--r--org.eclipse.osee.ats/images/whiteGear.gifbin0 -> 856 bytes
-rw-r--r--org.eclipse.osee.ats/images/whiteT_8_8.gifbin0 -> 449 bytes
-rw-r--r--org.eclipse.osee.ats/images/workflow.gifbin0 -> 499 bytes
-rw-r--r--org.eclipse.osee.ats/images/workflowConfig.gifbin0 -> 470 bytes
-rw-r--r--org.eclipse.osee.ats/images/world.gifbin0 -> 860 bytes
-rw-r--r--org.eclipse.osee.ats/images/yellowBall.gifbin0 -> 1035 bytes
-rw-r--r--org.eclipse.osee.ats/images/yellowN_8_8.gifbin0 -> 308 bytes
-rw-r--r--org.eclipse.osee.ats/images/yellowT_8_8.gifbin0 -> 474 bytes
-rw-r--r--org.eclipse.osee.ats/images/zoom.gifbin0 -> 1848 bytes
-rw-r--r--org.eclipse.osee.ats/images/zoom_in.gifbin0 -> 517 bytes
-rw-r--r--org.eclipse.osee.ats/images/zoom_out.gifbin0 -> 515 bytes
-rw-r--r--org.eclipse.osee.ats/plugin.xml424
-rw-r--r--org.eclipse.osee.ats/reference/DO_NOT_EDIT_HERE.txt3
-rw-r--r--org.eclipse.osee.ats/reference/Priority.html52
-rw-r--r--org.eclipse.osee.ats/reference/ats_action_view.html32
-rw-r--r--org.eclipse.osee.ats/reference/ats_action_view.jpgbin0 -> 33681 bytes
-rw-r--r--org.eclipse.osee.ats/reference/ats_icons.html49
-rw-r--r--org.eclipse.osee.ats/reference/ats_navigator.gifbin0 -> 10936 bytes
-rw-r--r--org.eclipse.osee.ats/reference/ats_navigator.jpgbin0 -> 66981 bytes
-rw-r--r--org.eclipse.osee.ats/reference/ats_navigator_view.html29
-rw-r--r--org.eclipse.osee.ats/reference/ats_world_view.html54
-rw-r--r--org.eclipse.osee.ats/reference/ats_world_view.jpgbin0 -> 123844 bytes
-rw-r--r--org.eclipse.osee.ats/reference/configure/ActionableItems.html41
-rw-r--r--org.eclipse.osee.ats/reference/configure/TeamDefinition.html43
-rw-r--r--org.eclipse.osee.ats/reference/configure/WorkFlowDefinition.html60
-rw-r--r--org.eclipse.osee.ats/reference/configure/WorkPageDefinition.html51
-rw-r--r--org.eclipse.osee.ats/reference/configure/WorkRuleDefinition.html41
-rw-r--r--org.eclipse.osee.ats/reference/configure/WorkWidgetDefinition.html39
-rw-r--r--org.eclipse.osee.ats/reference/configure/WorkflowConfiguration.html51
-rw-r--r--org.eclipse.osee.ats/reference/configure/WorkflowConfigurationEditor.html74
-rw-r--r--org.eclipse.osee.ats/reference/configure/configEditor.JPGbin0 -> 152371 bytes
-rw-r--r--org.eclipse.osee.ats/reference/configure/configure_ats_for_help.html39
-rw-r--r--org.eclipse.osee.ats/reference/configure/configure_ats_for_tracking.html136
-rw-r--r--org.eclipse.osee.ats/reference/configure/contexts.xml11
-rw-r--r--org.eclipse.osee.ats/reference/contexts.xml45
-rw-r--r--org.eclipse.osee.ats/reference/decision_review_workflow/contexts.xml8
-rw-r--r--org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.JPGbin0 -> 37341 bytes
-rw-r--r--org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.html66
-rw-r--r--org.eclipse.osee.ats/reference/newActionWizard/contexts.xml17
-rw-r--r--org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_1.html29
-rw-r--r--org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_2.html50
-rw-r--r--org.eclipse.osee.ats/reference/overview/OSEE ATS Overview.pdfbin0 -> 2136039 bytes
-rw-r--r--org.eclipse.osee.ats/reference/overview/README.txt3
-rw-r--r--org.eclipse.osee.ats/reference/overview/ats_overview.html27
-rw-r--r--org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/contexts.xml8
-rw-r--r--org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReview.html66
-rw-r--r--org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewEditor.JPGbin0 -> 408866 bytes
-rw-r--r--org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewStateMachine.JPGbin0 -> 25922 bytes
-rw-r--r--org.eclipse.osee.ats/reference/report_a_bug.html25
-rw-r--r--org.eclipse.osee.ats/reference/toc.xml56
-rw-r--r--org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor.html32
-rw-r--r--org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.html41
-rw-r--r--org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.jpgbin0 -> 133565 bytes
-rw-r--r--org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.html37
-rw-r--r--org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.jpgbin0 -> 254740 bytes
-rw-r--r--org.eclipse.osee.ats/reference/workflow_editor/current_state.html44
-rw-r--r--org.eclipse.osee.ats/schema/AtsAIandTeamConfig.exsd105
-rw-r--r--org.eclipse.osee.ats/schema/AtsNavigateItem.exsd105
-rw-r--r--org.eclipse.osee.ats/schema/AtsNotification.exsd102
-rw-r--r--org.eclipse.osee.ats/schema/AtsStateItem.exsd105
-rw-r--r--org.eclipse.osee.ats/schema/AtsTeamWorkflow.exsd105
-rw-r--r--org.eclipse.osee.ats/schema/AtsWizardItem.exsd105
-rw-r--r--org.eclipse.osee.ats/schema/AtsWorldEditorItem.exsd102
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/ATSPerspective.java76
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/ActionDebug.java30
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsArtifactImageProvider.java94
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsImage.java86
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsPlugin.java100
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewAction.java85
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewDecisionReviewJob.java69
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewPeerToPeerReviewJob.java61
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ActionableItemFilter.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizard.java44
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizardPage.java200
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsTeamWorkflow.java69
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsWizardItem.java76
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java120
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java198
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage2.java125
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java213
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java201
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNotePage.java133
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNoteWizard.java69
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSArtifact.java58
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSAttributes.java188
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSLog.java342
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSNote.java158
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionArtifact.java1336
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionableItemArtifact.java122
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/AtsArtifactFactory.java53
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java249
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewWorkflowManager.java97
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IFavoriteableArtifact.java33
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IReviewArtifact.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ISubscribableArtifact.java33
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/LogItem.java131
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/NoteItem.java101
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java287
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewWorkflowManager.java95
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ReviewSMArtifact.java206
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java1384
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java434
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskableStateMachineArtifact.java95
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamDefinitionArtifact.java488
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java604
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowExtensions.java86
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowLabelProvider.java45
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowManager.java137
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/VersionArtifact.java180
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsBulkLoadCache.java84
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsCache.java220
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsConfig.java258
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsDatabaseConfig.java65
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizard.java68
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizardPage1.java159
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItem.java139
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItems.java88
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsTaskEditorRenderer.java89
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorkflowRenderer.java115
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorldEditorRenderer.java102
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IAtsStateItem.java74
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAActionableItemHeader.java161
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java918
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditorInput.java32
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAHistoryComposite.java67
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAManager.java897
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPrint.java112
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPromptChangeStatus.java136
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMARelationsHyperlinkComposite.java172
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAReviewInfoComposite.java287
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAStateMetricsHeader.java111
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATargetVersionInfoComposite.java129
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskComposite.java65
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskInfoComposite.java138
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowDebugSection.java193
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowSection.java878
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java547
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkflowMetricsHeader.java134
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/help/WorkAttrHelpResource.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/AddNoteOperation.java97
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/CopyActionDetailsService.java64
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/EmailActionService.java67
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/FavoriteOperation.java74
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInArtifactEditorOperation.java58
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInAtsWorldOperation.java84
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInSkyWalkerOperation.java56
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenParent.java68
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenTeamDefinition.java67
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenVersionArtifact.java83
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/PrivilegedEditService.java105
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ReadOnlyHyperlinkListener.java58
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ServicesArea.java161
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateEstimatedHoursStat.java140
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateHoursSpentStat.java135
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StatePercentCompleteStat.java127
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/SubscribedOperation.java71
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/WorkPageService.java81
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowChangeReportService.java139
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowMergeManagerService.java145
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDebugWorkPage.java35
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewDecisionStateItem.java111
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewPrepareStateItem.java57
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsForceAssigneesToTeamLeadsStateItem.java67
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsHandleAddReviewRuleStateItem.java85
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsLogWorkPage.java53
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewPrepareStateItem.java78
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewReviewStateItem.java66
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportManager.java188
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportPage.java183
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportRenderer.java107
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportWizard.java98
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsEditorHandler.java42
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsExportHandler.java42
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsTaskEditorHandler.java42
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsWorldEditorHandler.java42
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ChangeReportComparer.java101
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/TxImportedValidateChangeReports.java312
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateAtsDatabase.java558
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReportByHrid.java99
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReports.java356
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperItem.java110
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperView.java318
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionSkyWalker.java265
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperItem.java53
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperView.java360
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperView.java1069
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperViewItem.java200
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/IHyperArtifact.java39
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksActionHyperItem.java62
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksHyperViewArtifact.java102
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ArtifactImpactToActionSearchItem.java184
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateComposite.java107
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateQuickSearch.java107
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java290
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/BarChartExample.java170
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ConfigureDBForAts.java80
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CreateNewVersionItem.java117
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/DisplayCurrentOseeEventListeners.java53
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/EmailTeamsItem.java99
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/FirstTimeQualityMetricReportItem.java200
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateFullVersionReportItem.java124
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateReviewParticipationReport.java116
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateVersionReportItem.java46
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/IAtsNavigateItem.java24
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ImportActionsViaSpreadsheet.java48
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/MassEditTeamVersionItem.java107
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NavigateView.java371
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NewPeerToPeerReviewItem.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/OpenChangeReportByIdItem.java119
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/PublishFullVersionReportItem.java130
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ReleaseVersionItem.java131
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java51
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByActionableItem.java56
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByTeamDefinition.java56
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/TeamWorkflowSearchWorkflowSearchItem.java316
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAssigneesRelations.java78
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAtsWorkItemDefinitions.java58
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/VisitedItems.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotification.java75
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationCheckTreeDialog.java153
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationNavigateItem.java79
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/IAtsNotification.java31
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CancelMultipleWorkflows.java74
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CompleteMultipleWorkflows.java82
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ConnectWorkflowToTransaction.java86
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/DuplicateWorkflowBlam.java255
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSimpleList.java160
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSpreadsheet.java160
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ReAssignATSObjectsToUser.java134
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/TaskMetrics.java146
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ActionTeamDateListDialog.java162
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/CreateActionArtifactChangeReportJob.java153
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ExtendedStatusReportJob.java199
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/ITaskEditorProvider.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/IXTaskViewer.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskComposite.java655
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditor.java427
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorInput.java98
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItem.java80
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItemProvider.java80
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorProvider.java61
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorSimpleProvider.java70
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewer.java508
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewerFactory.java76
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXWidgetActionPage.java118
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ActionManager.java61
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ArtifactEmailWizard.java37
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsActionBrowserListener.java35
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactAnnotations.java48
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactChecks.java137
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchAccessHandler.java75
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchManager.java958
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBulkLoad.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsDeleteManager.java125
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsLib.java333
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsNotifyUsers.java160
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPreSaveCacheRemoteEventHandler.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPriority.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsRelation.java128
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DeadlineManager.java75
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DoesNotWorkItem.java370
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Favorites.java77
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportPage.java164
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportWizard.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsActionArtifactExtractor.java320
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsTaskArtifactExtractor.java311
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/TaskImportJob.java56
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/LegacyPCRActions.java96
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/OpenInAtsLoopbackCmd.java95
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Overview.java316
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java573
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/StateManager.java330
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Subscribe.java81
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/TeamBasedDefaultBranchProvider.java53
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/UsersByIds.java55
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionMetrics.java114
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionReportJob.java170
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionTeamMetrics.java120
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java50
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/DecisionOption.java167
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/ReviewManager.java332
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/SMAState.java204
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/TaskManager.java242
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XActionableItemsDam.java88
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XCurrentStateDam.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XDecisionOptions.java91
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XHyperlabelTeamDefinitionSelection.java99
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateAssigneesDam.java113
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateDam.java25
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWidgetProvider.java37
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWorkingBranch.java372
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitStatus.java37
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManager.java128
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManagerFactory.java80
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/ICommitConfigArtifact.java30
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitContentProvider.java55
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitLabelProvider.java148
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitManager.java439
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectContentProvider.java134
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectItem.java271
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectLabelProvider.java95
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectManager.java188
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewer.java532
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewerFactory.java56
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/XDefectViewer.java606
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AICheckTreeDialog.java113
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java75
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionActionableItemListDialog.java134
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamListDialog.java145
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamVersionListDialog.java109
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionableItemListDialog.java50
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AtsPriorityDialog.java125
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SMAStatusDialog.java193
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SimpleTaskResolutionOptionsRule.java62
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListAndTitleDialog.java92
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListDialog.java58
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskOptionStatusDialog.java150
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResOptionDefinition.java190
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResolutionOptionRule.java120
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionCheckTreeDialog.java114
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionDialog.java74
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeContentProvider.java81
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeDialog.java92
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeWithChildrenDialog.java108
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamVersionListDialog.java147
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/UserCommunityListDialog.java67
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionArtifactLabelProvider.java54
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionListDialog.java52
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRole.java191
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleContentProvider.java129
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleLabelProvider.java96
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleManager.java220
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewer.java277
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewerFactory.java45
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/XUserRoleViewer.java459
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerAtsAttributeColumn.java57
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerReviewRoleColumn.java78
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCompletedDateColumn.java66
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCreatedDateColumn.java66
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaStateColumn.java61
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/ATSXWidgetOptionResolver.java68
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/AtsWorkPage.java230
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditor.java457
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorActionBarContributor.java57
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorContextMenuProvider.java69
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorInput.java95
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorPaletteFactory.java205
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigRenderer.java100
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/EditAction.java106
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramTool.java65
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramToolEntry.java33
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CancelledWorkPageShape.java50
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CompletedWorkPageShape.java51
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Connection.java170
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/DefaultTransitionConnection.java54
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/EllipticalShape.java71
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ModelElement.java158
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/RectangleShape.java70
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ReturnTransitionConnection.java43
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Shape.java290
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/TransitionConnection.java107
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkPageShape.java268
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkflowDiagram.java274
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionCreateCommand.java132
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionDeleteCommand.java55
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionReconnectCommand.java185
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeCreateCommand.java91
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeDeleteCommand.java121
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeSetConstraintCommand.java89
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ConnectionEditPart.java110
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramEditPart.java176
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramTreeEditPart.java116
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/LeftAnchor.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/RightAnchor.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeComponentEditPolicy.java41
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeEditPart.java252
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeTreeEditPart.java99
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesEditPartFactory.java69
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesTreeEditPartFactory.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/WorkPageEditPart.java151
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/AtsWorkflowConfigCreationWizard.java212
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/NewWorkflowConfigPage1.java93
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/DecisionWorkflowDefinition.java108
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/PeerToPeerWorkflowDefinition.java92
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/SimpleWorkflowDefinition.java100
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TaskWorkflowDefinition.java80
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TeamWorkflowDefinition.java141
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddDecisionReviewRule.java156
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddPeerToPeerReviewRule.java119
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewDefectXWidgetWorkItem.java30
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewRolesXWidgetWorkItem.java32
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeSoleComboXWidgetWorkItem.java32
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeXWidgetWorkItem.java44
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancellationReasonStateWorkItem.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancelledFromStateWorkItem.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCompletedFromStateWorkItem.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDecisionReviewRule.java31
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDefaultWorkflowRule.java32
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightPeerToPeerReviewRule.java30
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightRule.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightSimpleWorkflowRule.java30
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsWorkDefinitions.java327
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/StateEventType.java18
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAnalyzeWorkPageDefinition.java42
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAuthorizeWorkPageDefinition.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCancelledWorkPageDefinition.java31
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCompletedWorkPageDefinition.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionCompletedWorkPageDefinition.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionDecisionWorkPageDefinition.java41
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionFollowupWorkPageDefinition.java34
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionPrepareWorkPageDefinition.java41
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsEndorseWorkPageDefinition.java44
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsImplementWorkPageDefinition.java36
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerPrepareWorkPageDefinition.java43
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerReviewWorkPageDefinition.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsSimpleInWorkWorkPageDefinition.java35
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsTaskInWorkPageDefinition.java43
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/AtsDbConfig.java21
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/Diagram.java100
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramFactory.java50
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramNode.java169
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/LoadAIsAndTeamsAction.java357
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueDiagram.java94
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueLink.java102
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueNode.java111
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsMetricsComposite.java400
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItem.java39
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItemBase.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItems.java78
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsXWidgetActionFormPage.java190
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsMetricsProvider.java28
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorItem.java45
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorMenuItem.java24
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorParameterProvider.java32
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorProvider.java38
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldViewArtifact.java186
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldAssigneeFilter.java44
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldCompletedFilter.java41
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java792
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java219
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditor.java270
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorInput.java97
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItem.java102
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItemProvider.java204
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorProvider.java76
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorSimpleProvider.java62
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorUISearchItemProvider.java177
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java219
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldViewDragAndDrop.java139
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXNavigateItemAction.java54
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java991
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerFactory.java301
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerSorter.java70
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXWidgetActionPage.java126
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ActionableItemWorldSearchItem.java196
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypeSearchItem.java51
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypesSearchItem.java53
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/AtsAttributeSearchItem.java112
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GroupWorldSearchItem.java125
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/LegacyPCRActionsWorldSearchItem.java86
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MultipleHridSearchItem.java187
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyCompletedSearchItem.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesSearchItem.java60
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyOrigSearchItem.java72
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyReviewWorkflowItem.java89
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MySubscribedSearchItem.java54
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyWorldSearchItem.java74
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/NextVersionSearchItem.java142
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ShowOpenWorkflowsByArtifactType.java82
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/StateWorldSearchItem.java103
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TaskSearchWorldSearchItem.java408
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TeamWorldSearchItem.java226
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserCommunitySearchItem.java111
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserRelatedToAtsObjectSearch.java88
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserSearchItem.java168
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/VersionTargetedForTeamSearchItem.java131
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldSearchItem.java127
-rw-r--r--org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldUISearchItem.java107
-rw-r--r--org.eclipse.osee.ats/support/Action Import.xml101
-rw-r--r--org.eclipse.osee.ats/support/OSEEDay.wavbin0 -> 74764 bytes
-rw-r--r--org.eclipse.osee.ats/support/OseeTypes_ATS.xml1765
-rw-r--r--org.eclipse.osee.ats/support/Task Import.xml112
-rw-r--r--org.eclipse.osee.define.feature/.project17
-rw-r--r--org.eclipse.osee.define.feature/build.properties5
-rw-r--r--org.eclipse.osee.define.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.define.feature/feature.properties144
-rw-r--r--org.eclipse.osee.define.feature/feature.xml31
-rw-r--r--org.eclipse.osee.define.feature/license.html79
-rw-r--r--org.eclipse.osee.define.feature/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.define.feature/sourceTemplateFeature/feature.properties144
-rw-r--r--org.eclipse.osee.define.help.ui/.classpath7
-rw-r--r--org.eclipse.osee.define.help.ui/.project28
-rw-r--r--org.eclipse.osee.define.help.ui/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.define.help.ui/META-INF/MANIFEST.MF8
-rw-r--r--org.eclipse.osee.define.help.ui/about.html27
-rw-r--r--org.eclipse.osee.define.help.ui/build-helper.xml74
-rw-r--r--org.eclipse.osee.define.help.ui/build.properties8
-rw-r--r--org.eclipse.osee.define.help.ui/plugin.xml37
-rw-r--r--org.eclipse.osee.define.help.ui/toc.xml52
-rw-r--r--org.eclipse.osee.define/.classpath7
-rw-r--r--org.eclipse.osee.define/.cvsignore1
-rw-r--r--org.eclipse.osee.define/.project28
-rw-r--r--org.eclipse.osee.define/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.define/META-INF/MANIFEST.MF47
-rw-r--r--org.eclipse.osee.define/build.properties12
-rw-r--r--org.eclipse.osee.define/images/artifact_search.gifbin0 -> 933 bytes
-rw-r--r--org.eclipse.osee.define/images/chkbox_disabled.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.define/images/chkbox_enabled.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.define/images/compass.xcfbin0 -> 1967 bytes
-rw-r--r--org.eclipse.osee.define/images/defineNav.gifbin0 -> 601 bytes
-rw-r--r--org.eclipse.osee.define/images/delete_button.gifbin0 -> 1045 bytes
-rw-r--r--org.eclipse.osee.define/images/gears.gifbin0 -> 951 bytes
-rw-r--r--org.eclipse.osee.define/images/importTrace.gifbin0 -> 316 bytes
-rw-r--r--org.eclipse.osee.define/images/laser_16_16.gifbin0 -> 1092 bytes
-rw-r--r--org.eclipse.osee.define/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.define/images/relate.gifbin0 -> 160 bytes
-rw-r--r--org.eclipse.osee.define/images/relateWizard.gifbin0 -> 533 bytes
-rw-r--r--org.eclipse.osee.define/images/remove.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.define/images/up.gifbin0 -> 323 bytes
-rw-r--r--org.eclipse.osee.define/images/wizard.bmpbin0 -> 1280 bytes
-rw-r--r--org.eclipse.osee.define/plugin.xml233
-rw-r--r--org.eclipse.osee.define/reference/contexts.xml6
-rw-r--r--org.eclipse.osee.define/reference/define_navigator_view.html27
-rw-r--r--org.eclipse.osee.define/reference/toc.xml5
-rw-r--r--org.eclipse.osee.define/schema/DefineNavigateItem.exsd105
-rw-r--r--org.eclipse.osee.define/schema/TraceUnitHandler.exsd112
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/DefineArtifactFactory.java52
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePerspectiveFactory.java71
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePlugin.java38
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Resolver.java54
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Spreadsheet.java33
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/AddEveryoneGroupToBranches.java55
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/ExperimentalBlam.java41
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishRequirements.java211
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishSubsystemToDesignTraceability.java137
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishWithSpecifiedTemplate.java141
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/SubsystemToLowLevelReqTraceReport.java246
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/ErrorHandler.java49
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/Resolver.java17
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/SqlResolver.java37
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/StateValue.java30
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateView.java86
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewItems.java96
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewerSorter.java40
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/IDefineNavigateItem.java23
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/ExtractTestRelations.java136
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/RelationImporter.java174
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/relation/TreeViewerTest.java244
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceParser.java28
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceUnitResourceLocator.java25
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java250
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityPage.java144
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityWizard.java71
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceUnitExtensionManager.java192
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceabilityExtractor.java139
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitActionDelegate.java79
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitEditorAction.java52
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/RemoveTraceMarksFromTraceUnits.java368
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/TraceReportBlam.java524
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/UiToTestBlam.java251
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/BaseTraceDataCache.java78
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/CodeUnitData.java53
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/RequirementData.java142
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TestUnitData.java106
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceMark.java83
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceUnit.java68
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitPage.java437
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitWizard.java83
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/FindTraceUnitJob.java91
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/ImportTraceUnitsJob.java77
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/FindTraceUnitFromResource.java136
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ITraceUnitProcessor.java29
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ResourceToTraceUnit.java220
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitFromResourceOperation.java117
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitReportProcessor.java72
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitToArtifactProcessor.java404
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractArtifactRelationReport.java60
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractReport.java67
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactToRelatedArtifact.java81
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactTraceCount.java85
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactsWithoutRelations.java45
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/IReportDataCollector.java23
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceHandler.java22
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceLocator.java28
-rw-r--r--org.eclipse.osee.define/src/org/eclipse/osee/define/utility/UriResourceContentFinder.java212
-rw-r--r--org.eclipse.osee.define/support/How_To_Template.xml94
-rw-r--r--org.eclipse.osee.define/support/Monster_Process_Template.xml94
-rw-r--r--org.eclipse.osee.define/support/Monster_Process_Template_Diff.xml94
-rw-r--r--org.eclipse.osee.define/support/Work_Instruction_Template.xml3
-rw-r--r--org.eclipse.osee.demo.db.connection/.classpath7
-rw-r--r--org.eclipse.osee.demo.db.connection/.project28
-rw-r--r--org.eclipse.osee.demo.db.connection/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.demo.db.connection/META-INF/MANIFEST.MF20
-rw-r--r--org.eclipse.osee.demo.db.connection/OSGI-INF/demo.authentication.provider.xml7
-rw-r--r--org.eclipse.osee.demo.db.connection/OSGI-INF/demo.connection.contributor.xml7
-rw-r--r--org.eclipse.osee.demo.db.connection/build.properties6
-rw-r--r--org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/Activator.java44
-rw-r--r--org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoAuthenticationProvider.java52
-rw-r--r--org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoDbConnectionInfo.java31
-rw-r--r--org.eclipse.osee.demo.db.connection/support/osee.demo.db.connection.xml50
-rw-r--r--org.eclipse.osee.demo.feature/.project17
-rw-r--r--org.eclipse.osee.demo.feature/build.properties1
-rw-r--r--org.eclipse.osee.demo.feature/feature.xml46
-rw-r--r--org.eclipse.osee.dependancies.updatesite/.project17
-rw-r--r--org.eclipse.osee.dependancies.updatesite/site.xml4
-rw-r--r--org.eclipse.osee.external.feature/.project17
-rw-r--r--org.eclipse.osee.external.feature/build.properties2
-rw-r--r--org.eclipse.osee.external.feature/feature.xml170
-rw-r--r--org.eclipse.osee.framework.antsupport/.classpath7
-rw-r--r--org.eclipse.osee.framework.antsupport/.project28
-rw-r--r--org.eclipse.osee.framework.antsupport/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.antsupport/META-INF/MANIFEST.MF11
-rw-r--r--org.eclipse.osee.framework.antsupport/build.properties6
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/build.properties20
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/changelog.txt50
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/doc/svn.html1132
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/JAVAHL-LICENSE55
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/SVNCLIENTADAPTER-LICENSE185
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnClientAdapter.jarbin0 -> 118768 bytes
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnant.jarbin0 -> 34879 bytes
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnjavahl.jarbin0 -> 43122 bytes
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/license.txt64
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/readme.txt38
-rw-r--r--org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/svn_build.xml35
-rw-r--r--org.eclipse.osee.framework.antsupport/plugin.xml28
-rw-r--r--org.eclipse.osee.framework.antsupport/src/org/eclipse/osee/framework/antsupport/Activator.java60
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/Activator.java105
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactFileServlet.java136
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactUtil.java46
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/DefaultOseeArtifact.java47
-rw-r--r--org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/HttpArtifactFileInfo.java57
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchExchangeServlet.java141
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchManagerServlet.java70
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchCreationInfo.java179
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchExchangeInfo.java108
-rw-r--r--org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/InternalBranchServletActivator.java108
-rw-r--r--org.eclipse.osee.framework.branch.management/.classpath7
-rw-r--r--org.eclipse.osee.framework.branch.management/.project28
-rw-r--r--org.eclipse.osee.framework.branch.management/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.branch.management/META-INF/MANIFEST.MF32
-rw-r--r--org.eclipse.osee.framework.branch.management/OSGI-INF/exchange.provider.xml7
-rw-r--r--org.eclipse.osee.framework.branch.management/OSGI-INF/locator.provider.exchange.xml7
-rw-r--r--org.eclipse.osee.framework.branch.management/build.properties5
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ExportOptions.java18
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchCreation.java21
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchExchange.java31
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IExchangeTaskListener.java23
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ImportOptions.java18
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/BranchExchange.java79
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeDb.java265
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeIntegrity.java170
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeUtil.java111
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportController.java193
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportImportXml.java76
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IdTranslator.java145
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ImportController.java409
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IndexCollector.java128
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/TranslationManager.java100
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractDbExportItem.java54
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractExportItem.java160
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ColumnIdCollector.java70
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ManifestExportItem.java69
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/MetadataExportItem.java176
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItem.java219
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItemWithType.java87
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseDbSaxHandler.java110
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseExportImportSaxHandler.java116
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchData.java129
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDataSaxHandler.java197
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDefinitionsSaxHandler.java66
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/DataToSql.java92
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/ManifestSaxHandler.java172
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaData.java89
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaDataSaxHandler.java170
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalSaxHandler.java206
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalTypeCheckSaxHandler.java75
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeLocatorProvider.java79
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeProvider.java140
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ZipBinaryResource.java80
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/BranchCreation.java176
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/CreateBranchWithFiltering.java240
-rw-r--r--org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/InternalBranchActivator.java105
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/META-INF/MANIFEST.MF21
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/Activator.java38
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfo.java132
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfoServlet.java140
-rw-r--r--org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/InstallLinkPageGenerator.java148
-rw-r--r--org.eclipse.osee.framework.core.client/.classpath7
-rw-r--r--org.eclipse.osee.framework.core.client/.project28
-rw-r--r--org.eclipse.osee.framework.core.client/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.core.client/META-INF/MANIFEST.MF25
-rw-r--r--org.eclipse.osee.framework.core.client/OSGI-INF/application.db.provider.xml7
-rw-r--r--org.eclipse.osee.framework.core.client/build.properties6
-rw-r--r--org.eclipse.osee.framework.core.client/plugin.xml11
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/BaseCredentialProvider.java50
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ClientSessionManager.java106
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CoreClientActivator.java55
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CorePreferences.java37
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/GuestCredentialProvider.java31
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ICredentialProvider.java23
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientProperties.java291
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientSession.java90
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/ClientDatabaseProvider.java52
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/CorePreferenceInitializer.java47
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/InternalClientSessionManager.java248
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/OseeApplicationServer.java154
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpGetMethod.java40
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequest.java231
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequestHandler.java83
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResourceRequest.java103
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResponse.java252
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpServer.java180
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpUrlBuilder.java119
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpMethod.java23
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpServerRequest.java29
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ProgressMonitorTask.java61
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ScheduledTask.java50
-rw-r--r--org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/Scheduler.java94
-rw-r--r--org.eclipse.osee.framework.core.server/.classpath7
-rw-r--r--org.eclipse.osee.framework.core.server/.options5
-rw-r--r--org.eclipse.osee.framework.core.server/.project28
-rw-r--r--org.eclipse.osee.framework.core.server/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.core.server/.settings/org.eclipse.pde.core.prefs5
-rw-r--r--org.eclipse.osee.framework.core.server/META-INF/MANIFEST.MF33
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/application.lookup.server.manager.xml7
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/authentication.manager.xml13
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/authentication.provider.xml7
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/join.cleanup.task.provider.xml7
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/server.application.db.provider.xml7
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/server.task.scheduler.xml13
-rw-r--r--org.eclipse.osee.framework.core.server/OSGI-INF/session.manager.xml7
-rw-r--r--org.eclipse.osee.framework.core.server/build.properties5
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/CoreServerActivator.java126
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerLookup.java23
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerManager.java43
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationManager.java58
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationProvider.java28
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTask.java30
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTaskScheduler.java22
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/ISessionManager.java44
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServiceTracker.java29
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServlet.java35
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeServerProperties.java106
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SchedulingScheme.java19
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SessionData.java48
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/UserDataStore.java68
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerDataStore.java185
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerLookup.java94
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerManager.java230
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/AuthenticationManager.java116
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalHttpServiceTracker.java61
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeHttpServlet.java102
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeServerInfo.java130
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThread.java23
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThreadFactory.java58
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ProcessingStateEnum.java18
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerDatabaseProvider.java48
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerTaskScheduler.java85
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionDataStore.java138
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionManager.java311
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/TrustAllAuthenticationProvider.java58
-rw-r--r--org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/task/CleanJoinTablesServerTask.java94
-rw-r--r--org.eclipse.osee.framework.core/.classpath7
-rw-r--r--org.eclipse.osee.framework.core/.project28
-rw-r--r--org.eclipse.osee.framework.core/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.core/.settings/org.eclipse.pde.core.prefs5
-rw-r--r--org.eclipse.osee.framework.core/META-INF/MANIFEST.MF30
-rw-r--r--org.eclipse.osee.framework.core/build.properties5
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/CoreActivator.java42
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/BaseExchangeData.java87
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUser.java24
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUserInfo.java20
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/JoinUtility.java495
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeClientInfo.java69
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCodeVersion.java51
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCredential.java73
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeDatabaseId.java39
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeInfo.java33
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerContext.java38
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerInfo.java105
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSession.java116
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSessionGrant.java209
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSql.java332
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeUser.java60
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/SystemUser.java68
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchState.java44
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchStorageState.java29
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchType.java33
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictStatus.java44
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictType.java28
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ModificationType.java77
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TransactionDetailsType.java38
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TxChange.java49
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeArbitrationServerException.java43
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationException.java56
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationRequiredException.java44
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidAuthenticationProtocolException.java43
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidSessionException.java43
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractDbTxOperation.java63
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractOperation.java247
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/IOperation.java38
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/OperationJob.java39
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/Operations.java146
-rw-r--r--org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/util/TableWriterAdaptor.java169
-rw-r--r--org.eclipse.osee.framework.database/.classpath7
-rw-r--r--org.eclipse.osee.framework.database/.project29
-rw-r--r--org.eclipse.osee.framework.database/META-INF/MANIFEST.MF32
-rw-r--r--org.eclipse.osee.framework.database/build.properties9
-rw-r--r--org.eclipse.osee.framework.database/plugin.xml50
-rw-r--r--org.eclipse.osee.framework.database/schema/AddDbInitChoice.exsd105
-rw-r--r--org.eclipse.osee.framework.database/schema/IDbInitializationTask.exsd114
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/ConfigDatabase.java44
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/DatabaseActivator.java56
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationRule.java21
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationTask.java17
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/MySqlLaunch.java40
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/NotOnProductionDbInitializationRule.java28
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/PlatformRunnableAvailableInitTasks.java49
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/SkynetTypesEnumGenerator.java292
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/SchemaConfigUtility.java55
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/TableConfigUtility.java235
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/core/IConfigClient.java20
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/AppliesToClause.java94
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnDbData.java36
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnMetadata.java90
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintElement.java141
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintFactory.java35
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintTypes.java34
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ForeignKey.java66
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/IndexElement.java134
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ReferenceClause.java152
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaData.java262
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaDataLookup.java46
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/TableElement.java242
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DatabaseInitializationOperation.java292
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DbFactory.java57
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/ImportDataFromDbService.java217
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PostDatabaseInitialization.java50
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PrintTables.java74
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/BackupTableData.java127
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/RestoreTableData.java129
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/DerbySqlManager.java124
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/MysqlSqlManager.java157
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/OracleSqlManager.java86
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/PostgreSqlManager.java197
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlFactory.java58
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManager.java308
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManagerImpl.java71
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/DerbySqlDataType.java102
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/FoxProDataType.java101
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/MySqlDataType.java102
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/OracleSqlDataType.java113
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/PostgresqlDataType.java102
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/SqlDataType.java192
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseConfigurationData.java162
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataExtractor.java265
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataImporter.java253
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseSchemaExtractor.java500
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DbInit.java177
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/FileUtility.java83
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/GroupSelection.java120
-rw-r--r--org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/IAddDbInitChoice.java18
-rw-r--r--org.eclipse.osee.framework.database/support/dbrelease.xml88
-rw-r--r--org.eclipse.osee.framework.database/support/sqlAnt.xml84
-rw-r--r--org.eclipse.osee.framework.db.connection/.classpath7
-rw-r--r--org.eclipse.osee.framework.db.connection/.project28
-rw-r--r--org.eclipse.osee.framework.db.connection/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.db.connection/META-INF/MANIFEST.MF32
-rw-r--r--org.eclipse.osee.framework.db.connection/OSGI-INF/application.db.provider.consumer.xml13
-rw-r--r--org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.consumer.xml13
-rw-r--r--org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.contributor.consumer.xml13
-rw-r--r--org.eclipse.osee.framework.db.connection/OSGI-INF/uri.connection.contributor.xml7
-rw-r--r--org.eclipse.osee.framework.db.connection/build.properties5
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandler.java376
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandlerStatement.java388
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseConnectionInfo.java101
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseInfoManager.java63
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DbTransaction.java127
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IApplicationDatabaseInfoProvider.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IConnection.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDatabaseInfo.java33
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDbConnectionInformationContributor.java20
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnection.java120
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnectionPool.java106
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeDbConnection.java77
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/StaleConnectionCloser.java44
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/KeyedLevelManager.java193
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/ResultSetProcessor.java93
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/RsetProcessor.java23
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/SequenceManager.java189
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/Query.java55
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryLog.java81
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryRecord.java140
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/LocalAliasTable.java28
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/SkynetDatabase.java58
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/Table.java142
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/View.java31
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/DbTransactionEventCompleted.java31
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionEvent.java18
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionListener.java20
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ArtifactDoesNotExist.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/AttributeDoesNotExist.java25
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchDoesNotExist.java33
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchMergeException.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ConflictDetectionException.java25
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/InvalidTaggerException.java23
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MergeChangesInArtifactException.java25
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleArtifactsExist.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleAttributesExist.java25
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleBranchesExist.java23
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeAccessDeniedException.java23
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeArgumentException.java23
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeCoreException.java40
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeDataStoreException.java41
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeMultipleEnumTypesExist.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeStateException.java24
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeTypeDoesNotExist.java23
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeWrappedException.java40
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/TransactionDoesNotExist.java33
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserInDatabaseMultipleTimes.java36
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserNotInDatabase.java36
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SQL3DataType.java81
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SupportedDatabase.java73
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/ApplicationDatabaseManager.java75
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionFactory.java88
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionInformation.java111
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IApplicationDatabaseManager.java26
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionFactory.java26
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionInformation.java29
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/InternalActivator.java79
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/TransactionMonitor.java118
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/UriDbConnectionInfo.java46
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConfigParser.java208
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConnectionData.java90
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbDetailData.java90
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbInformation.java143
-rw-r--r--org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbSetupData.java68
-rw-r--r--org.eclipse.osee.framework.derby/.classpath7
-rw-r--r--org.eclipse.osee.framework.derby/.project28
-rw-r--r--org.eclipse.osee.framework.derby/META-INF/MANIFEST.MF19
-rw-r--r--org.eclipse.osee.framework.derby/OSGI-INF/derby.client.connection.driver.provider.xml7
-rw-r--r--org.eclipse.osee.framework.derby/OSGI-INF/derby.embed.connection.driver.provider.xml7
-rw-r--r--org.eclipse.osee.framework.derby/build.properties5
-rw-r--r--org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/Activator.java35
-rw-r--r--org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyClientConnection.java55
-rw-r--r--org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyDbServer.java178
-rw-r--r--org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/EmbeddedDerbyConnection.java36
-rw-r--r--org.eclipse.osee.framework.feature/.project17
-rw-r--r--org.eclipse.osee.framework.feature/build.properties6
-rw-r--r--org.eclipse.osee.framework.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.framework.feature/feature.properties144
-rw-r--r--org.eclipse.osee.framework.feature/feature.xml162
-rw-r--r--org.eclipse.osee.framework.feature/license.html79
-rw-r--r--org.eclipse.osee.framework.feature/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.framework.feature/sourceTemplateFeature/feature.properties144
-rw-r--r--org.eclipse.osee.framework.help.ui/.classpath7
-rw-r--r--org.eclipse.osee.framework.help.ui/.project28
-rw-r--r--org.eclipse.osee.framework.help.ui/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.help.ui/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.osee.framework.help.ui/about.html27
-rw-r--r--org.eclipse.osee.framework.help.ui/build-helper.xml73
-rw-r--r--org.eclipse.osee.framework.help.ui/build.properties12
-rw-r--r--org.eclipse.osee.framework.help.ui/customBuildCallbacks.xml161
-rw-r--r--org.eclipse.osee.framework.help.ui/intro/css/overview.css15
-rw-r--r--org.eclipse.osee.framework.help.ui/intro/css/tutorials.css15
-rw-r--r--org.eclipse.osee.framework.help.ui/intro/css/whatsnew.css7
-rw-r--r--org.eclipse.osee.framework.help.ui/intro/overviewExtensionContent.xml20
-rw-r--r--org.eclipse.osee.framework.help.ui/intro/tutorialsExtensionContent.xml26
-rw-r--r--org.eclipse.osee.framework.help.ui/intro/whatsnewExtensionContent.xml18
-rw-r--r--org.eclipse.osee.framework.help.ui/plugin.xml52
-rw-r--r--org.eclipse.osee.framework.help.ui/scripts/ant.setup.txt13
-rw-r--r--org.eclipse.osee.framework.help.ui/scripts/commonImages/home.gifbin0 -> 582 bytes
-rw-r--r--org.eclipse.osee.framework.help.ui/scripts/commonImages/next.gifbin0 -> 327 bytes
-rw-r--r--org.eclipse.osee.framework.help.ui/scripts/commonImages/prev.gifbin0 -> 327 bytes
-rw-r--r--org.eclipse.osee.framework.help.ui/scripts/extract-markup.xsl9
-rw-r--r--org.eclipse.osee.framework.help.ui/scripts/help-build-common.xml110
-rw-r--r--org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/OSEEWikiImageFetcher.java156
-rw-r--r--org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/tasks.properties1
-rw-r--r--org.eclipse.osee.framework.help.ui/toc.xml44
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/.classpath7
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/.project28
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/OSGI-INF/jdbcodbc.connection.driver.provider.xml7
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/build.properties5
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/Activator.java35
-rw-r--r--org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/JdbcOdbcConnection.java36
-rw-r--r--org.eclipse.osee.framework.jdk.core/.classpath7
-rw-r--r--org.eclipse.osee.framework.jdk.core/.project28
-rw-r--r--org.eclipse.osee.framework.jdk.core/.settings/org.eclipse.jdt.core.prefs57
-rw-r--r--org.eclipse.osee.framework.jdk.core/META-INF/MANIFEST.MF34
-rw-r--r--org.eclipse.osee.framework.jdk.core/build.properties8
-rw-r--r--org.eclipse.osee.framework.jdk.core/plugin.xml5
-rw-r--r--org.eclipse.osee.framework.jdk.core/schema/DefaultMailServer.exsd102
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/Tree.java29
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/TreeNode.java60
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/db/DbConfigFileInformation.java33
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/directory/DirectoryPerson.java413
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/TwoWayXmlizable.java19
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/Xmlizable.java21
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportData.java71
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataItem.java42
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataListener.java18
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/IState.java24
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/StateController.java45
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/WaitState.java41
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractComments.java131
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractText.java97
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FileToBufferConvert.java22
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FindResults.java192
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Range.java26
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Rule.java194
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RuleRecord.java49
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RulesLogHandler.java104
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChOps.java58
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChangeSet.java263
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharArrayChange.java95
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharChange.java78
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharacterChanger.java33
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/DeleteChange.java94
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/AdddistributionStatement.java43
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HtmlTableBuilder.java70
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HushHtmlScriptErrors.java80
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/MultilineStrLiteral.java50
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/ReplaceAll.java97
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/Unique.java40
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CompareLists.java77
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CountAscii.java55
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/Find.java234
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FindNonLocalFunctionCalls.java83
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FunctionCallStats.java93
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/ReplaceRcsLog.java103
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/RpcrSignalChanges.java98
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SignalChanges.java102
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SimpleFileToBufferConvert.java29
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SourceCount.java115
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/StripBlockComments.java25
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/AddingDoubleMap.java64
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKey.java86
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyHashMap.java179
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyQuadHashMap.java179
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyTripleHashMap.java172
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CountingMap.java75
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyCountingMap.java182
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyHashMap.java133
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoublePoint.java67
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/FixedSizePriorityQueue.java54
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollection.java91
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlus.java306
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlusMap.java73
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IInputListener.java31
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPlusProvider.java25
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPropertyStore.java177
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IVariantData.java61
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/InputManager.java135
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableBoolean.java36
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableDouble.java42
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableInteger.java47
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectPair.java72
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectTriplet.java23
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/Pair.java47
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStore.java193
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStoreWriter.java276
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/SimpleEnum.java38
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeObject.java69
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeParent.java47
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/VariantData.java185
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AFile.java58
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AHTML.java469
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AXml.java155
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ByteUtil.java197
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ChecksumUtil.java56
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/CmdLineArgs.java43
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Collections.java266
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnhancedProperties.java96
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnumBase.java58
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Enums.java24
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUID.java109
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUIDType.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HtmlReservedCharacters.java147
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpProcessor.java320
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IAbbreviated.java20
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IConsoleInputListener.java15
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/JarCreator.java122
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java1664
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Network.java34
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Objects.java38
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/OseeProperties.java142
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Readers.java149
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/RegExpressLib.java40
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Sets.java45
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/SingletonApplicationInstance.java54
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringDataSource.java50
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringFormat.java58
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java43
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ThreadKeyLocal.java65
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/benchmark/Benchmark.java279
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/Pawprint.jpgbin0 -> 810 bytes
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/done.gifbin0 -> 922 bytes
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/go.gifbin0 -> 885 bytes
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/not_done.gifbin0 -> 864 bytes
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CharBackedInputStream.java202
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CsvReader.java148
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/DriveType.java32
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/EnumBaseBuilder.java158
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/ExtensionFilter.java36
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IEnumValueBuilder.java97
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOInputThread.java54
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOOutputThread.java58
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IZipEntryCompleteCallback.java21
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/InputBufferThread.java245
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/JavaFileBuilder.java287
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/LnkWriter.java826
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MatchFilter.java32
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomConnection.java169
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomOutputThread.java109
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MultipleLinks.java55
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/RenameFiles.java53
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Streams.java77
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Zip.java115
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamCatcher.java60
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamPumper.java46
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSaxHandler.java128
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSheetWriter.java84
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelSaxHandler.java133
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelXmlWriter.java136
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ISheetWriter.java43
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/RowProcessor.java30
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordMlTableWriter.java86
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordSaxHandler.java85
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlStraightener.java47
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlTextInputStream.java281
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/network/PortUtil.java136
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/requirement/RequirementId.java105
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/time/GlobalTime.java30
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/OutlookCalendarEvent.java71
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/Registry.java214
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Jaxp.java610
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/SimpleNamespaceContext.java71
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Xml.java460
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlOutputTransform.java92
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformAsProcess.java183
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformServer.java203
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTranslation.java61
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlUtility.java81
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Cell.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Row.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Style.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Table.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkBook.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkSheet.java28
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/GenericParser.java173
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IProcessingInstructionsListener.java19
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IXmlNodeListener.java21
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlNode.java64
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlTreeUtilities.java120
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/ExpressionValidator.java47
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/FieldValidator.java50
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/IValidator.java22
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredStringValidator.java27
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredValidator.java23
-rw-r--r--org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/Validator.java159
-rw-r--r--org.eclipse.osee.framework.jini/.classpath7
-rw-r--r--org.eclipse.osee.framework.jini/.cvsignore1
-rw-r--r--org.eclipse.osee.framework.jini/.project28
-rw-r--r--org.eclipse.osee.framework.jini/.settings/org.eclipse.jdt.core.prefs57
-rw-r--r--org.eclipse.osee.framework.jini/META-INF/MANIFEST.MF28
-rw-r--r--org.eclipse.osee.framework.jini/build.properties8
-rw-r--r--org.eclipse.osee.framework.jini/oseejinilookup.zipbin0 -> 4657911 bytes
-rw-r--r--org.eclipse.osee.framework.jini/plugin.xml18
-rw-r--r--org.eclipse.osee.framework.jini/release/JINIMANIFEST.MF15
-rw-r--r--org.eclipse.osee.framework.jini/release/all.policy6
-rw-r--r--org.eclipse.osee.framework.jini/release/release.xml62
-rw-r--r--org.eclipse.osee.framework.jini/release/servicerelease.xml75
-rw-r--r--org.eclipse.osee.framework.jini/schema/JiniInterface.exsd111
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/ExperimentalLookup.java214
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniClassServer.java86
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniLookupPlatformRunnable.java82
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniPlugin.java60
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseBundleClassloader.java88
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseJiniClassloader.java132
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IRegistrarListener.java25
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IServiceLookupListener.java24
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/OseeJiniConfiguration.java67
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/RelaxedSecurity.java94
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/ServiceDataStore.java733
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventListener.java18
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventService.java21
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventHandler.java496
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventListener.java21
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedEventListener.java29
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedRemoteType.java39
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteEventListener.java18
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteSubscriber.java26
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEvent.java32
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEventInstance.java49
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/PopupEventType.java33
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeaseGrantor.java39
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeasee.java27
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/LeaseData.java44
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLease.java89
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseGrantor.java180
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseRenewer.java130
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/FormmatedEntry.java18
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/GroupEntry.java41
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/HostEntry.java39
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniJoinManager.java193
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniService.java248
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/KillService.java31
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/OwnerEntry.java29
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/PropertyEntry.java69
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/SimpleFormattedEntry.java40
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/VersionEntry.java31
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/directory/service/IDirectory.java34
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/gssfl/IGssflTaskService.java23
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/interfaces/IService.java21
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/report/IReport.java20
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduleService.java38
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduler.java25
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/BuildTargetPair.java49
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/INabitService.java27
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/IRemotePrintTarget.java18
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/OseeJini.java70
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/RemotePrintStream.java60
-rw-r--r--org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/utility/StartJini.java247
-rw-r--r--org.eclipse.osee.framework.logging/.classpath7
-rw-r--r--org.eclipse.osee.framework.logging/.project28
-rw-r--r--org.eclipse.osee.framework.logging/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.logging/META-INF/MANIFEST.MF12
-rw-r--r--org.eclipse.osee.framework.logging/build.properties4
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/BaseStatus.java102
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ConsoleLogger.java40
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IHealthStatus.java29
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerFilter.java27
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerListener.java22
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListener.java18
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListenerFilter.java18
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLevel.java31
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLog.java128
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLogger.java100
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SevereLoggingMonitor.java65
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeFormatter.java77
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeHandler.java47
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/StatusManager.java98
-rw-r--r--org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/internal/Activator.java34
-rw-r--r--org.eclipse.osee.framework.manager.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.manager.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.manager.servlet/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.manager.servlet/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.osee.framework.manager.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/HttpSystemManagerCreationInfo.java33
-rw-r--r--org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/InternalSystemManagerServletActivator.java70
-rw-r--r--org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/SystemManagerServlet.java307
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/.classpath7
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/.project28
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/META-INF/MANIFEST.MF22
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/build.properties6
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/plugin.xml31
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ASkynetEventListener.java53
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetArtifactEvent.java23
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEvent.java26
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventListener.java20
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventService.java42
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetRelationLinkEvent.java33
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/Sample.java97
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/SkynetEventPlugin.java34
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/ConfigurationModifiedEvent.java25
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkAccessControlArtifactsEvent.java47
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactAddedEvent.java50
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactChangeTypeEvent.java48
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactDeletedEvent.java30
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactModifiedEvent.java61
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactPurgeEvent.java38
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkBroadcastEvent.java55
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkCommitBranchEvent.java43
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkDeletedBranchEvent.java43
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkMergeBranchConflictResolvedEvent.java39
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewBranchEvent.java40
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewRelationLinkEvent.java111
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkDeletedEvent.java23
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkOrderModifiedEvent.java75
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkRationalModifiedEvent.java75
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRenameBranchEvent.java82
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkSender.java38
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkTransactionDeletedEvent.java38
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactEventBase.java75
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactsEventBase.java73
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetAttributeChange.java73
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetChange.java20
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetEventBase.java50
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetRelationLinkEventBase.java102
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/filter/IEventFilter.java28
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/AcceptAllEventFilter.java31
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/EventDispatchRunnable.java74
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventService.java186
-rw-r--r--org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventServicePlatformRunnable.java58
-rw-r--r--org.eclipse.osee.framework.messaging/.classpath7
-rw-r--r--org.eclipse.osee.framework.messaging/.project28
-rw-r--r--org.eclipse.osee.framework.messaging/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.messaging/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.messaging/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.framework.messaging/build.properties4
-rw-r--r--org.eclipse.osee.framework.messaging/design/OSEE Service and Messaging Architecture.xml3
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointReceive.java71
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointSend.java22
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ExceptionHandler.java18
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Message.java22
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/MessagingGateway.java53
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ReceiveListener.java18
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/SendListener.java18
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Source.java18
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/UriSource.java41
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/definitions/PropertyStoreMessage.java57
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/MessageId.java20
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Name.java18
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Namespace.java18
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/ProtocolId.java20
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringId.java58
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringMessageId.java23
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringName.java45
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringNamespace.java44
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringProtocolId.java23
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/Activator.java49
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ApplicationDistributer.java25
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ConcurrentListMap.java66
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointReceiveCollection.java49
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointSendCollection.java135
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessageListenerCollection.java58
-rw-r--r--org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessagingGatewayImpl.java136
-rw-r--r--org.eclipse.osee.framework.oracle/.classpath7
-rw-r--r--org.eclipse.osee.framework.oracle/.project28
-rw-r--r--org.eclipse.osee.framework.oracle/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.oracle/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.framework.oracle/OSGI-INF/oracle.connection.driver.provider.xml7
-rw-r--r--org.eclipse.osee.framework.oracle/build.properties5
-rw-r--r--org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/Activator.java32
-rw-r--r--org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/OracleConnection.java33
-rw-r--r--org.eclipse.osee.framework.osgi/.classpath7
-rw-r--r--org.eclipse.osee.framework.osgi/.project28
-rw-r--r--org.eclipse.osee.framework.osgi/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.osgi/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.osgi/META-INF/MANIFEST.MF12
-rw-r--r--org.eclipse.osee.framework.osgi/build.properties4
-rw-r--r--org.eclipse.osee.framework.osgi/src/org/eclipse/osee/framework/osgi/Activator.java72
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/.classpath7
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/.project28
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/META-INF/MANIFEST.MF13
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/OSGI-INF/testRunner.xml13
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/build.properties5
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/Activator.java32
-rw-r--r--org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/JunitTestRunner.java118
-rw-r--r--org.eclipse.osee.framework.plugin.core/.classpath7
-rw-r--r--org.eclipse.osee.framework.plugin.core/.project28
-rw-r--r--org.eclipse.osee.framework.plugin.core/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.plugin.core/META-INF/MANIFEST.MF22
-rw-r--r--org.eclipse.osee.framework.plugin.core/build.properties9
-rw-r--r--org.eclipse.osee.framework.plugin.core/plugin.xml5
-rw-r--r--org.eclipse.osee.framework.plugin.core/schema/logHandler.exsd105
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/ActivatorHelper.java79
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/OseeActivator.java50
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/PluginCoreActivator.java100
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DBErrorHandler.java17
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorCodeLevel.java15
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerDerby.java21
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerOracle.java25
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/EclipseHandler.java50
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/JiniLookupGroupConfig.java65
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/NonEclipseManifestHeader.java214
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeConsoleHandler.java42
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeRunMode.java57
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/BundleResourceFinder.java56
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassFinder.java34
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServer.java292
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServerPermissions.java60
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/PathResourceFinder.java243
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ResourceFinder.java37
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/resources/classserver.properties15
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Command.java83
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeCommand.java59
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeTaskMaster.java68
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Parameter.java35
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskRequester.java76
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskServerThread.java206
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/CatchAndReleaseJob.java55
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExportClassLoader.java82
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionDefinedObjects.java124
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionPoints.java117
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/IExceptionableRunnable.java23
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/Jobs.java53
-rw-r--r--org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/LogProgressMonitor.java98
-rw-r--r--org.eclipse.osee.framework.postgresql/.classpath7
-rw-r--r--org.eclipse.osee.framework.postgresql/.project28
-rw-r--r--org.eclipse.osee.framework.postgresql/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.postgresql/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.framework.postgresql/OSGI-INF/postgresql.connection.driver.provider.xml7
-rw-r--r--org.eclipse.osee.framework.postgresql/build.properties5
-rw-r--r--org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/Activator.java32
-rw-r--r--org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/PostgresqlConnection.java39
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/.project28
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/META-INF/MANIFEST.MF16
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/OSGI-INF/tests.xml7
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/build.properties5
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/Activator.java31
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/AllResourceLocatorAttributeTests.java24
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/TestResourceLocatorAttribute.java145
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/.project28
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/OSGI-INF/locator.provider.attribute.xml7
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/build.properties5
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/Activator.java32
-rw-r--r--org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/AttributeLocatorProvider.java95
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/.project28
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/OSGI-INF/tests.xml7
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/build.properties5
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/Activator.java31
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/AllResourceManagementServletTests.java24
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/HttpTestUtils.java185
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestFile.txt1
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestResourceManagerServlet.java177
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/META-INF/MANIFEST.MF22
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/Activator.java74
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/ResourceManagerServlet.java164
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/HttpRequestDecoder.java84
-rw-r--r--org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/ServletResourceBridge.java70
-rw-r--r--org.eclipse.osee.framework.resource.management.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.management.test/.project28
-rw-r--r--org.eclipse.osee.framework.resource.management.test/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.management.test/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.framework.resource.management.test/OSGI-INF/tests.xml7
-rw-r--r--org.eclipse.osee.framework.resource.management.test/build.properties5
-rw-r--r--org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/Activator.java59
-rw-r--r--org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/AllResourceManagementTests.java24
-rw-r--r--org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestFile.txt1
-rw-r--r--org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestResourceManager.java247
-rw-r--r--org.eclipse.osee.framework.resource.management/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.management/.project28
-rw-r--r--org.eclipse.osee.framework.resource.management/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.management/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.osee.framework.resource.management/OSGI-INF/resource.locator.consumer.xml13
-rw-r--r--org.eclipse.osee.framework.resource.management/OSGI-INF/resource.provider.consumer.xml13
-rw-r--r--org.eclipse.osee.framework.resource.management/build.properties5
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Activator.java32
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResource.java51
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceListener.java64
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocator.java40
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorManager.java53
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorProvider.java46
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceManager.java83
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceProvider.java59
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Options.java55
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Resource.java58
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/ResourceLocator.java52
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/StandardOptions.java18
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/EmptyResourceException.java35
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/InvalidLocatorException.java36
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/MalformedLocatorException.java46
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceLocatorManager.java80
-rw-r--r--org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceManager.java153
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/.project28
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/META-INF/MANIFEST.MF16
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/OSGI-INF/attribute.provider.xml7
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/build.properties5
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/Activator.java32
-rw-r--r--org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/AttributeProvider.java120
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/.classpath7
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/.project28
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/build.properties4
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/Activator.java26
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/OptionsProcessor.java132
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/CompressedResourceBridge.java66
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Resources.java64
-rw-r--r--org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Streams.java45
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/META-INF/MANIFEST.MF21
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/Activator.java84
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/HttpSearchInfo.java99
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineServlet.java142
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineTaggerServlet.java131
-rw-r--r--org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/TagListener.java111
-rw-r--r--org.eclipse.osee.framework.search.engine.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.search.engine.test/.project28
-rw-r--r--org.eclipse.osee.framework.search.engine.test/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.search.engine.test/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.osee.framework.search.engine.test/OSGI-INF/tests.xml7
-rw-r--r--org.eclipse.osee.framework.search.engine.test/build.properties5
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test1.data.xml3
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test1.expected.txt1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test1.tags.txt4
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test2.data.xml8
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test2.expected.txt1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test2.tags.txt6
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test3.data.xml4847
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test3.expected.txt1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test3.tags.txt8
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test4.data.xml127
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test4.expected.txt1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test4.tags.txt280
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test5.data.xml1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test5.expected.txt1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test5.tags.txt12
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test6.data.xml2
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test6.expected.txt1
-rw-r--r--org.eclipse.osee.framework.search.engine.test/data/test6.tags.txt26
-rw-r--r--org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/Activator.java72
-rw-r--r--org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/AllSearchEngineTests.java27
-rw-r--r--org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchDataStore.java121
-rw-r--r--org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchEngine.java42
-rw-r--r--org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestTagProcessor.java158
-rw-r--r--org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestWordsUtil.java282
-rw-r--r--org.eclipse.osee.framework.search.engine/.classpath7
-rw-r--r--org.eclipse.osee.framework.search.engine/.project28
-rw-r--r--org.eclipse.osee.framework.search.engine/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.search.engine/META-INF/MANIFEST.MF41
-rw-r--r--org.eclipse.osee.framework.search.engine/OSGI-INF/attribute.tagger.provider.consumer.xml13
-rw-r--r--org.eclipse.osee.framework.search.engine/OSGI-INF/default.attribute.tagger.provider.xml7
-rw-r--r--org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.service.xml7
-rw-r--r--org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.tagger.service.xml7
-rw-r--r--org.eclipse.osee.framework.search.engine/OSGI-INF/xml.attribute.tagger.provider.xml7
-rw-r--r--org.eclipse.osee.framework.search.engine/build.properties6
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProvider.java41
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProviderManager.java54
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngine.java44
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngineTagger.java136
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchStatistics.java45
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagItemStatistics.java23
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagListener.java29
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITaggerStatistics.java46
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/MatchLocation.java71
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchOptions.java59
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchResult.java129
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/TagListenerAdapter.java59
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeData.java106
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeDataStore.java201
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeSearch.java70
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeVersion.java50
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/IAttributeLocator.java19
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/SearchTag.java80
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/Activator.java82
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/AttributeTaggerProviderManager.java75
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/BranchTaggerRunnable.java70
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputStreamTagProcessor.java78
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputToTagQueueTx.java119
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngine.java102
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngineTagger.java218
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchStatistics.java81
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/StartUpRunnable.java51
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerRunnable.java227
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerStatistics.java168
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaskStatistics.java53
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/BaseAttributeTaggerProvider.java83
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/DefaultAttributeTaggerProvider.java47
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/XmlAttributeTaggerProvider.java57
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/ITagCollector.java19
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/SearchTagDataStore.java120
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagEncoder.java63
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagProcessor.java121
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordOrderMatcher.java125
-rw-r--r--org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordsUtil.java205
-rw-r--r--org.eclipse.osee.framework.search.engine/support/pluralToSingularExceptions.xml59
-rw-r--r--org.eclipse.osee.framework.search.engine/support/wordsToSkip.txt4
-rw-r--r--org.eclipse.osee.framework.server.admin/.classpath8
-rw-r--r--org.eclipse.osee.framework.server.admin/.project28
-rw-r--r--org.eclipse.osee.framework.server.admin/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.framework.server.admin/META-INF/MANIFEST.MF33
-rw-r--r--org.eclipse.osee.framework.server.admin/OSGI-INF/branch.cmds.xml7
-rw-r--r--org.eclipse.osee.framework.server.admin/OSGI-INF/search.tagger.cmds.xml7
-rw-r--r--org.eclipse.osee.framework.server.admin/OSGI-INF/server.admin.cmds.xml7
-rw-r--r--org.eclipse.osee.framework.server.admin/Server Release Instructions.xml3
-rw-r--r--org.eclipse.osee.framework.server.admin/ant_src/ConfigIniGeneration.java62
-rw-r--r--org.eclipse.osee.framework.server.admin/build.properties7
-rw-r--r--org.eclipse.osee.framework.server.admin/buildsupport.jarbin0 -> 190102 bytes
-rw-r--r--org.eclipse.osee.framework.server.admin/config.ini31
-rw-r--r--org.eclipse.osee.framework.server.admin/plugin.xml18
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/Activator.java99
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BaseCmdWorker.java101
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BranchManagementCommandProvider.java80
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/SearchTaggerCommandProvider.java102
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/ServerAdminCommandProvider.java97
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/app/DataStoreBackupApplication.java137
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchCommands.java126
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchExportWorker.java109
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchImportWorker.java91
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/ExchangeIntegrityWorker.java66
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/CompressedContentFix.java231
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/DbResource.java117
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/Util.java45
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AddServerVersionWorker.java35
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AdminCommands.java113
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/GetServerVersionWorker.java33
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/RemoveServerVersionWorker.java35
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerRequestsWorker.java29
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerShutdownWorker.java32
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerStats.java56
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchStats.java38
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchTaggerCommands.java150
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TagItemWorker.java138
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerAllWorker.java193
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerDropAllWorker.java38
-rw-r--r--org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerStats.java59
-rw-r--r--org.eclipse.osee.framework.server.admin/supportExport.jardesc17
-rw-r--r--org.eclipse.osee.framework.server.external.feature/.project17
-rw-r--r--org.eclipse.osee.framework.server.external.feature/build.properties1
-rw-r--r--org.eclipse.osee.framework.server.external.feature/feature.xml178
-rw-r--r--org.eclipse.osee.framework.server.feature/.project17
-rw-r--r--org.eclipse.osee.framework.server.feature/build.properties4
-rw-r--r--org.eclipse.osee.framework.server.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.framework.server.feature/feature.xml190
-rw-r--r--org.eclipse.osee.framework.server.feature/license.html79
-rw-r--r--org.eclipse.osee.framework.server.feature/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.pde.core.prefs5
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupActivator.java41
-rw-r--r--org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupServlet.java108
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/.project28
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.pde.core.prefs5
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/META-INF/MANIFEST.MF10
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/build.properties4
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/AllSessionTests.java24
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/SessionManagementTestsActivator.java34
-rw-r--r--org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/TestSessionManagement.java25
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/.classpath7
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/.project28
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.pde.core.prefs5
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/META-INF/MANIFEST.MF18
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/build.properties4
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionClientLoopbackServlet.java198
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServlet.java162
-rw-r--r--org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServletActivator.java88
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/.project28
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/META-INF/MANIFEST.MF12
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/build.properties4
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Demo_Suite.java48
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Production_Suite.java35
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactPurgeTest.java167
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryPerformanceTests.java172
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryTest.java97
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/Artifact_setAttributeValues.java113
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchPurgeTest.java112
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchStateTest.java309
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ChangeManagerTest.java110
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTest.java314
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTestManager.java749
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/CsvArtifactTest.java76
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/DeletionTest.java463
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/NativeArtifactTest.java133
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumTypeManagerTest.java243
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumerationValidationTest.java121
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/RelationDeletionTest.java86
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/SevereLogMonitorTest.java47
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/StaticIdManagerTest.java294
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/WordMlLinkHandlerTest.java175
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/util/FrameworkTestUtil.java159
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.expected.xml6
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.link.open_in_osee.data.xml13
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.expected.xml6
-rw-r--r--org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.unlink.open_in_osee.data.xml6
-rw-r--r--org.eclipse.osee.framework.skynet.core/.classpath7
-rw-r--r--org.eclipse.osee.framework.skynet.core/.options12
-rw-r--r--org.eclipse.osee.framework.skynet.core/.project28
-rw-r--r--org.eclipse.osee.framework.skynet.core/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.skynet.core/META-INF/MANIFEST.MF65
-rw-r--r--org.eclipse.osee.framework.skynet.core/build.properties12
-rw-r--r--org.eclipse.osee.framework.skynet.core/dbschemas/SKYNET.VERSIONING.SCHEMA.xml680
-rw-r--r--org.eclipse.osee.framework.skynet.core/plugin.xml229
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/ArtifactAnnotation.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/ArtifactCheck.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/ArtifactFactory.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/AtsLib.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/AttributeDataProvider.exsd121
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/AttributeType.exsd121
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/ClientLoopbackCmd.exsd102
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/CommitActions.exsd102
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/DefaultInitialBranchProvider.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/HttpServerRequest.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/OseeDbImportData.exsd117
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/OseeDbSchema.exsd112
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/OseeTypes.exsd102
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/OseeValidator.exsd102
-rw-r--r--org.eclipse.osee.framework.skynet.core/schema/WebPage.exsd105
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/BootStrapUser.java126
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ClientUser.java124
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ISkynetType.java15
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/OseeGroup.java123
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/SystemGroup.java44
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/User.java204
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/UserManager.java324
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlData.java140
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlManager.java844
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessObject.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/ArtifactAccessObject.java40
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/BranchAccessObject.java31
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/NoPoliciesException.java24
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionEnum.java86
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionList.java43
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java1806
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCache.java167
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChangeListener.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCheck.java40
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChecks.java54
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactData.java57
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactFactory.java111
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoad.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoader.java499
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactModType.java24
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactPersistenceManager.java522
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactProcessor.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTransactionData.java121
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactType.java199
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTypeManager.java308
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactURL.java70
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Branch.java482
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchArchivedState.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchControlled.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchCreator.java263
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java806
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ChangeArtifactType.java174
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/CommitDbTx.java429
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ControlLevel.java34
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/DeleteBranchJob.java57
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GeneralData.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GlobalPreferences.java50
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/HttpBranchCreation.java132
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSArtifact.java23
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSStateMachineArtifact.java19
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IArtifactCheck.java41
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IAttributeSaveListener.java19
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IBranchProvider.java19
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IDefaultInitialBranchesProvider.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ISearchConfirmer.java19
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/MergeBranchManager.java25
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/NativeArtifact.java91
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeBranchOperation.java142
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeDbTransaction.java178
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeTransactionJob.java311
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RevertAction.java186
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RootBranchInitializer.java34
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/StaticIdManager.java135
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UniversalGroup.java90
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UpdateMergeBranch.java193
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WordArtifact.java29
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WorkspaceURL.java23
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/ArtifactAnnotation.java97
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/AttributeAnnotationManager.java88
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/IArtifactAnnotation.java22
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/ArtifactFactoryManager.java85
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/DefaultArtifactFactory.java32
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/SkynetCoreArtifactFactory.java62
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/BaseStyleSheetArtifact.java30
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/IStyleSheetArtifact.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactConditional.java30
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactOperation.java58
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamIf.java37
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamLoop.java45
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/FinishUpdateBranchOperation.java85
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/UpdateBranchOperation.java104
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/WorkflowStep.java33
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AbstractArtifactSearchCriteria.java36
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Active.java20
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ActiveArtifactTypeSearch.java57
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactHridSearch.java78
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactIdSearch.java74
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactInTransactionSearch.java96
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactMatch.java57
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java484
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQueryBuilder.java516
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactTypeSearch.java78
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactXmlQueryResultParser.java209
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeCriteria.java234
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeValueSearch.java127
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/CommittingArtifactSearch.java65
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ConflictingArtifactSearch.java136
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/DepricatedOperator.java29
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/FromArtifactsSearch.java112
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/HttpArtifactQuery.java222
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ISearchPrimitive.java48
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/InRelationSearch.java181
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/NotSearch.java67
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Operator.java28
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/OrphanArtifactSearch.java91
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/QueryType.java20
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToAndOfIDSearch.java73
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToSearch.java84
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationCriteria.java96
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationInTransactionSearch.java101
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/ConflictResolverOperation.java35
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/RebaselineDbTransaction.java94
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/UpdateArtifactHandler.java168
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/Attribute.java326
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeExtensionManager.java136
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeResourceProcessor.java52
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTransactionData.java164
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeType.java212
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTypeManager.java273
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryAttribute.java23
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryBackedAttribute.java30
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BooleanAttribute.java43
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CharacterBackedAttribute.java31
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CompressedContentAttribute.java86
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/DateAttribute.java118
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/EnumeratedAttribute.java48
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/FloatingPointAttribute.java53
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/HttpAttributeTagger.java214
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/IntegerAttribute.java53
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/JavaObjectAttribute.java98
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumType.java261
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumTypeManager.java383
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumerationValidation.java53
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/StringAttribute.java48
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/TypeValidityManager.java208
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordAttribute.java122
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordTemplateAttribute.java24
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordWholeDocumentAttribute.java52
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/AbstractAttributeDataProvider.java35
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ClobAttributeDataProvider.java26
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DataStore.java118
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DefaultAttributeDataProvider.java147
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IAttributeDataProvider.java32
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IBinaryAttributeDataProvider.java25
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ICharacterAttributeDataProvider.java24
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/UriAttributeDataProvider.java174
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AbstractResourceProcessor.java87
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AttributeURL.java67
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/BinaryContentUtils.java68
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ArtifactChanged.java133
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/AttributeChanged.java221
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/Change.java218
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ChangeType.java22
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/RelationChanged.java218
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CatchTrackedChanges.java84
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CommitAction.java22
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflict.java206
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflictBuilder.java53
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflict.java498
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflictBuilder.java68
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/Conflict.java336
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictBuilder.java56
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictManagerExternal.java71
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictStatusManager.java87
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/RelationConflict.java167
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/MasterSkynetTypesImport.java94
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/PostDbUserCleanUp.java72
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbBranchDataImport.java168
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbInit.java192
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/AccessControlEventType.java37
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactModifiedEvent.java57
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactTransactionModifiedEvent.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventListener.java33
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventType.java40
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BroadcastEventType.java38
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/EventType.java26
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/FrameworkTransactionData.java286
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IAccessControlEventListener.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactModifiedEventListener.java22
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsChangeTypeEventListener.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsPurgedEventListener.java22
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBranchEventListener.java23
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBroadcastEventListneer.java20
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IEventListner.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IFrameworkTransactionEventListener.java32
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IMergeBranchEventListener.java22
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRelationModifiedEventListener.java23
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRemoteEventManagerEventListener.java19
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ITransactionsDeletedEventListener.java20
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/InternalEventManager.java976
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/LoadedRelation.java77
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/MergeBranchEventType.java38
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/OseeEventManager.java236
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RelationModifiedEvent.java52
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventManager.java684
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventServiceEventType.java36
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/Sender.java94
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/exportImport/HttpBranchExchange.java87
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/BaseArtifactLoopbackCmd.java67
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientDashboardRequestHandler.java184
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientLoopbackHandler.java61
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/IClientLoopbackCmd.java28
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/DbOseeDataTypeProcessor.java92
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/ExcelOseeTypeDataParser.java322
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/IOseeDataTypeProcessor.java32
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/Activator.java42
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/LinkType.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/WordMlLinkHandler.java396
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/preferences/PreferenceConstants.java24
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/CoreRelationEnumeration.java113
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/IRelationEnumeration.java28
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/LinkSideRestriction.java45
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationLink.java374
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationManager.java849
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationModType.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationSide.java39
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTransactionData.java109
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationType.java142
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeManager.java244
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeSide.java127
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactChange.java189
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorCache.java60
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorResolver.java43
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/AttributeChange.java111
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeData.java141
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeManager.java203
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ConflictManagerInternal.java490
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/HistoryTransactionItem.java102
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IArtifactNameDescriptorResolver.java23
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IAttributeChange.java33
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRelationLinkChange.java40
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRevisionChange.java25
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalChangeManager.java442
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalHistoryManager.java33
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RelationLinkChange.java133
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionChange.java58
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionManager.java370
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/TransactionData.java145
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/EmptyMonitor.java46
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/IStatusMonitor.java24
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/BaseTransactionData.java132
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/SkynetTransaction.java452
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionId.java191
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionIdManager.java225
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/AIFile.java65
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Artifacts.java148
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/CsvArtifact.java93
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/DbUtil.java33
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeEvent.java45
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeType.java18
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileWatcher.java165
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/IFileWatcherListener.java21
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/LoadedArtifacts.java147
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/OseeData.java120
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Requirements.java76
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/IOseeValidator.java29
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/OseeValidator.java140
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordAnnotationHandler.java31
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordUtil.java247
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedArtifact.java69
-rw-r--r--org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedRelation.java81
-rw-r--r--org.eclipse.osee.framework.skynet.core/support/OseeTypes_CommonBranch.xml1048
-rw-r--r--org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramAndCommon.xml701
-rw-r--r--org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramBranch.xml530
-rw-r--r--org.eclipse.osee.framework.skynet.core/support/export.xsd85
-rw-r--r--org.eclipse.osee.framework.skynet.core/support/publish.xsd131
-rw-r--r--org.eclipse.osee.framework.svn/.classpath7
-rw-r--r--org.eclipse.osee.framework.svn/.project28
-rw-r--r--org.eclipse.osee.framework.svn/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.svn/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.osee.framework.svn/build.properties5
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutJob.java50
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutProjectSetJob.java135
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/ClearCaseInfo.java69
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/EclipseVersion.java27
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/NodeKind.java35
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnAPI.java238
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnActivator.java35
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/VersionControl.java85
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/IRepositoryEntry.java27
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/NullRepositoryEntry.java70
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/RepositoryEntry.java106
-rw-r--r--org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/enums/RepositoryEnums.java57
-rw-r--r--org.eclipse.osee.framework.templates/.classpath7
-rw-r--r--org.eclipse.osee.framework.templates/.project28
-rw-r--r--org.eclipse.osee.framework.templates/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.templates/META-INF/MANIFEST.MF7
-rw-r--r--org.eclipse.osee.framework.templates/build.properties5
-rw-r--r--org.eclipse.osee.framework.templates/plugin.xml9
-rw-r--r--org.eclipse.osee.framework.templates/templates/default-templates.xml14
-rw-r--r--org.eclipse.osee.framework.ui.admin/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.admin/.project28
-rw-r--r--org.eclipse.osee.framework.ui.admin/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.ui.admin/META-INF/MANIFEST.MF33
-rw-r--r--org.eclipse.osee.framework.ui.admin/build.properties7
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/admin.gifbin0 -> 155 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/bug.gifbin0 -> 472 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/help.gifbin0 -> 259 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/lockkey.gifbin0 -> 1370 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/needSave.gifbin0 -> 639 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/policy.jpgbin0 -> 848 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/images/saved.gifbin0 -> 378 bytes
-rw-r--r--org.eclipse.osee.framework.ui.admin/plugin.xml20
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminAction.java53
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminPlugin.java53
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminView.java245
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/Group.java120
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/OseeClientsTab.java272
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbCellModifier.java136
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbDescribe.java104
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbItem.java40
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbLabelProvider.java73
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbModel.java77
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableSorter.java77
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableTab.java192
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableViewer.java389
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTaskList.java89
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/ITaskListViewer.java35
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/OseeInfoDbItem.java89
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SiteGssflRpcr.java86
-rw-r--r--org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SkynetUsageDbItem.java69
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/.project28
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/META-INF/MANIFEST.MF26
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/build.properties7
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/help/contexts.xml6
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelc.pngbin0 -> 671 bytes
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelr.pngbin0 -> 619 bytes
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/help/oseeBranchGraph.html35
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/help/toc.xml9
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/images/filter_connections.gifbin0 -> 219 bytes
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/images/graph.gifbin0 -> 209 bytes
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/plugin.xml58
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/BranchGraphActivator.java50
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/OpenBranchGraph.java67
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphActionBarContributor.java193
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditor.java247
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorContextMenuProvider.java41
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorInput.java89
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphOutlinePage.java100
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphPaletteProvider.java126
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/BranchFigure.java44
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/ContainerFigure.java35
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FigureFactory.java152
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FrameFigure.java59
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/PlusMinus.java37
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/TxFigure.java58
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/BranchModel.java211
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphCache.java134
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphLoader.java160
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/IModelListener.java19
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Model.java54
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Node.java54
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/StubBranchModel.java48
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxData.java134
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxModel.java104
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/IProgressListener.java20
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/LoadGraphOperation.java136
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchDataEditPart.java87
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchEditPart.java152
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchSelectionEditPolicy.java61
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/CurrentNodeEditPart.java36
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPart.java447
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPartFactory.java53
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphXYLayoutEditPolicy.java40
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/LabelEditPart.java35
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/TxEditPart.java69
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphColorConstants.java61
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphFigureConstants.java37
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphImageConstants.java49
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphOptions.java31
-rw-r--r--org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphTextFormat.java33
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/.project28
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/META-INF/MANIFEST.MF33
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/build.properties7
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/help/contexts.xml6
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelc.pngbin0 -> 671 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelr.pngbin0 -> 619 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/help/oseeDataModelEditor.html36
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/help/toc.xml9
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_attrib.gifbin0 -> 365 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_relat.gifbin0 -> 369 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/arrows.gifbin0 -> 194 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/datastore.gifbin0 -> 545 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/extractsupertype_wiz.pngbin0 -> 4262 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/file.gifbin0 -> 354 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/geometry.gifbin0 -> 387 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/geometry_disabled.gifbin0 -> 355 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/hierarchy_co.gifbin0 -> 199 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/importsupertype_wiz.pngbin0 -> 4380 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/link.gifbin0 -> 882 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/local_attribute.gifbin0 -> 124 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/one_way_reference.gifbin0 -> 183 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/operation.gifbin0 -> 150 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/package_mode.gifbin0 -> 249 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/two_way_reference.gifbin0 -> 874 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/images/workflowConfig.gifbin0 -> 470 bytes
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/plugin.xml56
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorActivator.java50
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorLauncher.java40
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/OpenODMEditor.java59
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMExportAction.java48
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMImportAction.java48
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeBoundsCommand.java61
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNameCommand.java47
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNamespaceCommand.java48
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateAttributeCommand.java47
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateBendpointCommand.java38
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateConnectionCommand.java85
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateNodeCommand.java63
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateRelationCommand.java47
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteBendpointCommand.java49
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteCommand.java225
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/MoveBendpointCommand.java48
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ReconnectConnectionCommand.java177
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditor.java288
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorActionBarContributor.java80
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorContextMenuProvider.java48
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorInput.java105
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMOutlinePage.java163
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteDropListener.java29
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteFactory.java205
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/ArtifactTypeFigure.java67
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/CompartmentFigure.java58
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/DataTypeFigure.java56
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/SelectableLabel.java91
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/ExcelXmlODMFileHandler.java105
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/IOseeDataTypeHandler.java24
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeConverter.java98
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeDatastore.java147
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeFactory.java112
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ArtifactDataType.java249
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/AttributeDataType.java179
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ConnectionModel.java137
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataType.java120
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeCache.java51
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeSource.java74
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/IModelListener.java19
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/InheritanceLinkModel.java25
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/Model.java54
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/NodeModel.java125
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ODMDiagram.java71
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationDataType.java128
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationLinkModel.java53
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/TypeManager.java95
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeContentProvider.java93
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeLabelProvider.java78
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ContainerModel.java62
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/PackageModel.java60
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ArtifactDataTypeXml.java91
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/AttributeDataTypeXml.java108
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/BaseXmlDataType.java127
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/IDataTypeCollector.java21
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ImportDataTypeXml.java45
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlFactory.java42
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlReader.java64
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlWriter.java118
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/RelationDataTypeXml.java76
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMLoadGraphRunnable.java81
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMToXmlOperation.java114
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/XmlToODMOperation.java36
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/outline/OutlineTreePartFactory.java44
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ArtifactEditPart.java194
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/AttributeEditPart.java48
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/BaseEditPart.java183
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ComponentEditPart.java76
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ConnectionEditPart.java135
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ContainerEditPart.java57
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DataTypeEditPart.java95
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DiagramEditPart.java101
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/InheritanceEditPart.java38
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/LabelDirectEditManager.java149
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/NodeModelEditPart.java121
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ODMEditPartFactory.java70
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationEditPart.java47
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationLinkEditPart.java218
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/StringEditPart.java35
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/ConnectionModelEndpointEditPolicy.java61
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/DiagramLayoutEditPolicy.java182
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/LabelSelectionEditPolicy.java68
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ArtifactPropertySource.java92
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeBaseClassPropertyDescriptor.java61
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributePropertySource.java167
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeProviderPropertyDescriptor.java58
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ConnectionPropertySource.java88
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/DataTypeElementPropertySource.java77
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumPropertySource.java102
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumeratedAttributeValuesPropertyDescriptor.java61
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/NodePropertySource.java91
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/PropertySourceFactory.java62
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/RelationPropertySource.java124
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/Base64Converter.java193
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ImageUtility.java95
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMConstants.java36
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMImages.java53
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderSelectPanel.java201
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderTreeSelecPanel.java319
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportOutputPage.java233
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportWizard.java125
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportPage.java167
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportWizard.java74
-rw-r--r--org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMSelectPage.java300
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/.project28
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/META-INF/MANIFEST.MF16
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/build.properties6
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/images/lock.gifbin0 -> 626 bytes
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/images/sample.gifbin0 -> 983 bytes
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/plugin.xml20
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterAction.java77
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterPlugin.java34
-rw-r--r--org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterView.java248
-rw-r--r--org.eclipse.osee.framework.ui.feature/.project17
-rw-r--r--org.eclipse.osee.framework.ui.feature/build.properties5
-rw-r--r--org.eclipse.osee.framework.ui.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.framework.ui.feature/feature.properties144
-rw-r--r--org.eclipse.osee.framework.ui.feature/feature.xml121
-rw-r--r--org.eclipse.osee.framework.ui.feature/license.html79
-rw-r--r--org.eclipse.osee.framework.ui.feature/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.framework.ui.feature/sourceTemplateFeature/feature.properties144
-rw-r--r--org.eclipse.osee.framework.ui.jdk/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.jdk/.project28
-rw-r--r--org.eclipse.osee.framework.ui.jdk/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.ui.jdk/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.framework.ui.jdk/build.properties5
-rw-r--r--org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/Activator.java60
-rw-r--r--org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/DialogSupport.java25
-rw-r--r--org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/EasyGridConstraint.java223
-rw-r--r--org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/FileListEditor.java164
-rw-r--r--org.eclipse.osee.framework.ui.plugin/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.plugin/.project28
-rw-r--r--org.eclipse.osee.framework.ui.plugin/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.ui.plugin/META-INF/MANIFEST.MF36
-rw-r--r--org.eclipse.osee.framework.ui.plugin/build.properties8
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/browse.gifbin0 -> 351 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/bug.gifbin0 -> 472 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/edit.gifbin0 -> 102 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/errorSm.gifbin0 -> 84 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/faq.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/filter.gifbin0 -> 211 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/lockkey.gifbin0 -> 1370 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/needSave.gifbin0 -> 639 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/new.gifbin0 -> 353 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/open.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/permission.bmpbin0 -> 574 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/publish.gifbin0 -> 862 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/remove.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/report.gifbin0 -> 648 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/sample.gifbin0 -> 983 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/saved.gifbin0 -> 378 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/train.gifbin0 -> 969 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/images/viewMenu.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.framework.ui.plugin/plugin.xml11
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/EclipseErrorLogLogger.java40
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeFormActivator.java47
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseePluginUiActivator.java117
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeUiActivator.java313
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/FormattedTextOutputStream.java81
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/StreamToTextArea.java71
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AEditor.java149
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AIFolder.java27
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AJavaProject.java184
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkbench.java94
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkspace.java582
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AbstractSelectionEnabledHandler.java36
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ArrayTreeContentProvider.java84
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AudioFile.java46
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CancelWatcher.java67
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CommandHandler.java38
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Commands.java91
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CoreDebug.java43
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Debug.java265
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DialogSelectionHelper.java49
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DirectoryOrFileSelector.java183
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Displays.java42
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/FileSelector.java108
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Files.java36
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/GetChildrenJob.java76
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/IShellCloseEvent.java18
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/JobbedNode.java117
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialog.java118
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialogNoSave.java94
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ModelessDialog.java60
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ObjectList.java130
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OseeConsole.java240
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OverlayImage.java123
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Result.java64
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ResultRunnable.java33
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/SelectionCountChangeListener.java48
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringLabelProvider.java45
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringViewerSorter.java40
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ViewPartUtil.java90
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WindowLocal.java96
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Wizards.java48
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WorkspaceSearchInit.java38
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/AbstractPropertySource.java44
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/BooleanPropertyDescriptor.java33
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/CompositePropertySource.java101
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ImagePropertyDescriptor.java106
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/IntegerPropertyDescriptor.java38
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ModelPropertySource.java25
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/PropertyId.java39
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ReadOnlyPropertyDescriptor.java26
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/StringPropertyDescriptor.java30
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/EarlyStartup.java44
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/SafeWorkspaceAccess.java27
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/WrapResourceChangeListener.java21
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/ResourceChangeListenerImpl.java37
-rw-r--r--org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/SafeWorkspaceAccessImpl.java37
-rw-r--r--org.eclipse.osee.framework.ui.product/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.product/.project28
-rw-r--r--org.eclipse.osee.framework.ui.product/META-INF/MANIFEST.MF16
-rw-r--r--org.eclipse.osee.framework.ui.product/about.ini3
-rw-r--r--org.eclipse.osee.framework.ui.product/about.properties9
-rw-r--r--org.eclipse.osee.framework.ui.product/build.properties16
-rw-r--r--org.eclipse.osee.framework.ui.product/images/admin.gifbin0 -> 899 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/browse.gifbin0 -> 351 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/bug.gifbin0 -> 472 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/edit.gifbin0 -> 102 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/errorSm.gifbin0 -> 84 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/faq.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/filter.gifbin0 -> 211 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/lockkey.gifbin0 -> 1370 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/needSave.gifbin0 -> 639 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/new.gifbin0 -> 353 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/open.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/osee_154_152.pngbin0 -> 9847 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/osee_16.pngbin0 -> 839 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/osee_48.pngbin0 -> 5811 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/permission.bmpbin0 -> 574 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/publish.gifbin0 -> 862 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/remove.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/report.gifbin0 -> 648 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/sample.gifbin0 -> 983 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/saved.gifbin0 -> 378 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/train.gifbin0 -> 969 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/images/viewMenu.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/introContent.xml3
-rw-r--r--org.eclipse.osee.framework.ui.product/plugin.properties9
-rw-r--r--org.eclipse.osee.framework.ui.product/plugin.xml69
-rw-r--r--org.eclipse.osee.framework.ui.product/splash.bmpbin0 -> 685954 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/support/images/intro.1.jpgbin0 -> 13743 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/support/images/intro.2.gifbin0 -> 5021 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/support/images/intro.3.jpgbin0 -> 13007 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/support/images/intro.4.jpgbin0 -> 14112 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/support/images/osee_arch.gifbin0 -> 15436 bytes
-rw-r--r--org.eclipse.osee.framework.ui.product/support/intro.html54
-rw-r--r--org.eclipse.osee.framework.ui.product/support/plugin_customization.ini90
-rw-r--r--org.eclipse.osee.framework.ui.security/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.security/.project28
-rw-r--r--org.eclipse.osee.framework.ui.security/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.ui.security/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.framework.ui.security/build.properties5
-rw-r--r--org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/DESEncrypter.java150
-rw-r--r--org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/internal/Activator.java21
-rw-r--r--org.eclipse.osee.framework.ui.service.control/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.service.control/.project28
-rw-r--r--org.eclipse.osee.framework.ui.service.control/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.ui.service.control/META-INF/MANIFEST.MF37
-rw-r--r--org.eclipse.osee.framework.ui.service.control/build.properties7
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/annotate.gifbin0 -> 592 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/config.gifbin0 -> 155 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/connect_folder.gifbin0 -> 348 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/connected_plug.gifbin0 -> 328 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/connection.gifbin0 -> 214 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/disconnected.gifbin0 -> 207 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/file.gifbin0 -> 354 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/group.gifbin0 -> 364 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/help.gifbin0 -> 363 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/monitor.GIFbin0 -> 953 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/rocket.gifbin0 -> 328 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/images/tools.gifbin0 -> 940 bytes
-rw-r--r--org.eclipse.osee.framework.ui.service.control/plugin.xml50
-rw-r--r--org.eclipse.osee.framework.ui.service.control/schema/ServiceLaunch.exsd234
-rw-r--r--org.eclipse.osee.framework.ui.service.control/schema/ServiceView.exsd126
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ControlPlugin.java38
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ServiceControlImage.java34
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/HideLookupsAction.java35
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/InspectLookUpServerAction.java43
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/KillServiceAction.java84
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/LookupUpdates.java128
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeDoubleClicked.java62
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeSelected.java87
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/OpenLaunchWizard.java43
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/RefreshDataStore.java46
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/ServiceUpdates.java58
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateLookupViewerToolTip.java58
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateToolTip.java78
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/CategoryParent.java38
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/GroupParent.java38
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/IJiniService.java22
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ReggieMonitorServiceNode.java86
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNode.java111
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNodeFactory.java76
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialog.java172
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialogHelper.java50
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/PopulateInspectReggieDialog.java97
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/EclipseApplicationLaunchJob.java107
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/StandAloneApplicationLaunchJob.java197
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/TextDisplayHelper.java87
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/UploadRemoteFileJob.java237
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ConnectionManager.java164
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ContributionManager.java184
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ReggieCache.java275
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceConnectionException.java17
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceTreeBuilder.java220
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServicesManager.java66
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/interfaces/IConnectionListener.java21
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/MenuBuilder.java94
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/ServiceManagerMenuItem.java48
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IRenderer.java22
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IServiceRenderer.java24
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ReggieItemHandler.java144
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ServiceItemHandler.java219
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/view/ServiceManagerView.java86
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/IServiceManager.java28
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/LookupViewer.java139
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ManagerMain.java267
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesQuickViewer.java43
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesViewer.java197
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/MultiTextDialog.java99
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/SecureRemoteAccess.java176
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchDataPersist.java181
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchWizard.java69
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchingInformation.java115
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceWizardDialog.java30
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/TextAreaDialog.java78
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/EclipseApplicationFormatter.java67
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ExecutionCommandFormatter.java61
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/JiniGroupSelector.java158
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceItem.java198
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceLaunchConfig.java222
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/StandAloneApplicationFormatter.java41
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ExecutePage.java198
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/HostInfoPage.java184
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalLaunchPage.java169
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalRemotePage.java117
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ServicePage.java152
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/UploadPage.java197
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/EclipseApplicationLaunchWidget.java251
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/ILaunchWidget.java28
-rw-r--r--org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/StandAloneApplicationLaunchWidget.java274
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/.options3
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/.project28
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/META-INF/MANIFEST.MF10
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/build.properties5
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/.options3
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Demo_Suite.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Production_Suite.java26
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_TestDb_Suite.java28
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/DatabaseIntegrityTest.java69
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/FrameworkImageTest.java23
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ImageManagerTest.java155
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/InterArtifactDropTest.java96
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/OseeEmailTest.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/PreviewAndMultiPreviewTest.java333
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ViewWordChangeAndDiffTest.java211
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordEditTest.java188
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordTrackedChangesTest.java168
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/GeneralWordTrackedChangesTest.docbin0 -> 19968 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordEditTest.xml3
-rw-r--r--org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordTrackedChangesTest.xml3
-rw-r--r--org.eclipse.osee.framework.ui.skynet/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.skynet/.options11
-rw-r--r--org.eclipse.osee.framework.ui.skynet/.project28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/.settings/org.eclipse.jdt.ui.prefs8
-rw-r--r--org.eclipse.osee.framework.ui.skynet/META-INF/MANIFEST.MF115
-rw-r--r--org.eclipse.osee.framework.ui.skynet/build.properties12
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/artifactExplorerContexts.xml9
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/artifactSearchContexts.xml8
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/branchManagerContexts.xml30
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/changeReportContexts.xml9
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/contexts.xml17
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/mergeMangerContexts.xml6
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/relationPageContexts.xml9
-rw-r--r--org.eclipse.osee.framework.ui.skynet/contexts/revisionHistoryContexts.xml8
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/A.gifbin0 -> 864 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted.gifbin0 -> 228 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted_small.gifbin0 -> 230 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified.gifbin0 -> 229 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified_small.gifbin0 -> 229 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_New.gifbin0 -> 212 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/DBicon.GIFbin0 -> 967 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/DBicon2.GIFbin0 -> 341 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/DBiconBlue.GIFbin0 -> 541 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/DBiconBlueEdit.GIFbin0 -> 588 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/INCOMING_Deleted.gifbin0 -> 206 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/INCOMING_Modified.gifbin0 -> 209 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/INCOMING_New.gifbin0 -> 211 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Deleted.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Modified.gifbin0 -> 214 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/OUTGOING_New.gifbin0 -> 206 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/WordMlImport.bmpbin0 -> 822 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/accept.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/action.gifbin0 -> 864 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/add.gifbin0 -> 318 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/admin.gifbin0 -> 155 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/alert_8_8.gifbin0 -> 173 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/appserver.gifbin0 -> 118 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/archive.gifbin0 -> 634 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact.gifbin0 -> 558 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact.xcfbin0 -> 1446 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact_editor.gifbin0 -> 615 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.gifbin0 -> 312 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.xcfbin0 -> 1284 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact_search.gifbin0 -> 373 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/artifact_version.gifbin0 -> 608 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/aspect.gifbin0 -> 472 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/attribute.gifbin0 -> 152 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/authenticated.gifbin0 -> 950 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/back.gifbin0 -> 327 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/baseline.gifbin0 -> 202 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/black_check.gifbin0 -> 64 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/blam.gifbin0 -> 115 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/blue_d.gifbin0 -> 594 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch.gifbin0 -> 127 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branchSynch.gifbin0 -> 359 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branchYellow.gifbin0 -> 621 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_baseline.gifbin0 -> 202 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_change.gifbin0 -> 158 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_change.xcfbin0 -> 1835 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.gifbin0 -> 571 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.xcfbin0 -> 1338 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_change_source.gifbin0 -> 562 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_change_source.xcfbin0 -> 1344 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_merge.gifbin0 -> 93 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_top.gifbin0 -> 210 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/branch_working.gifbin0 -> 351 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/bug.gifbin0 -> 472 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/change_managed_branch.gifbin0 -> 100 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gifbin0 -> 100 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/chkbox_red.gifbin0 -> 863 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/chkbox_redslash.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/clear.gifbin0 -> 595 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/clock.gifbin0 -> 368 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/collapseAll.gifbin0 -> 157 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/commit.gifbin0 -> 100 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/commitBranch.gifbin0 -> 187 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/conflict.gifbin0 -> 884 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/copyToClipboard.gifbin0 -> 604 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/customize.gifbin0 -> 500 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/customizeD.gifbin0 -> 61 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/customizeG.gifbin0 -> 64 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/customizeP.gifbin0 -> 64 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/customizePersonal.gifbin0 -> 508 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/delete.gifbin0 -> 351 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/delete_edit.gifbin0 -> 351 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/dirty.gifbin0 -> 120 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/disabled_attribute.gifbin0 -> 901 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/docOrder.gifbin0 -> 517 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/down.gifbin0 -> 332 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/duplicate.gifbin0 -> 224 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/edit.gifbin0 -> 111 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/edit2.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/edit_artifact.gifbin0 -> 315 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/email.gifbin0 -> 362 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/error.gifbin0 -> 82 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/errorRound.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/expandAll.gifbin0 -> 164 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/export_data.gifbin0 -> 568 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/export_table.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/file.gifbin0 -> 354 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/filter.gifbin0 -> 211 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/flashlight.gifbin0 -> 347 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/flat_layout.gifbin0 -> 97 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/folder.gifbin0 -> 916 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/gear.gifbin0 -> 155 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/gears.gifbin0 -> 951 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/greenBug.gifbin0 -> 348 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/greenPlus.gifbin0 -> 318 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/green_light.gifbin0 -> 314 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/green_lock.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/green_s.gifbin0 -> 619 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/group.gifbin0 -> 364 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/heading.gifbin0 -> 118 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/help.gifbin0 -> 259 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/icon_success.gifbin0 -> 990 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/icon_warning.gifbin0 -> 992 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/import.gifbin0 -> 327 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/info_lg.gifbin0 -> 121 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/info_sm.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/issue.gifbin0 -> 121 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/laser_16_16.gifbin0 -> 1092 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/laser_8_8.gifbin0 -> 903 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/line_match.gifbin0 -> 884 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/load.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/lockkey.gifbin0 -> 1370 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/magnify.gifbin0 -> 313 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/major.gifbin0 -> 206 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/merge.gifbin0 -> 222 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/minor.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/molecule.gifbin0 -> 306 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/narrative.gifbin0 -> 617 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/nav_backward.gifbin0 -> 541 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/nav_forward.gifbin0 -> 541 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/newTask.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/not_equal.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/not_equal.xcfbin0 -> 1236 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/old.gifbin0 -> 601 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/old.xcfbin0 -> 1453 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/open.gifbin0 -> 560 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/outline_co.gifbin0 -> 152 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/page.gifbin0 -> 359 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/preview_artifact.gifbin0 -> 147 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/print.gifbin0 -> 607 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/product.gifbin0 -> 474 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/purge.gifbin0 -> 124 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/purple.gifbin0 -> 473 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/query_log.gifbin0 -> 568 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/query_log.xcfbin0 -> 1612 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/rectangle16.gifbin0 -> 878 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/rectangle24.gifbin0 -> 911 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/redExclaim.gifbin0 -> 179 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/redRemove.gifbin0 -> 143 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/red_light.gifbin0 -> 312 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/red_lock.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/red_slash.gifbin0 -> 70 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/red_user_sm.gifbin0 -> 319 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/reject.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/relate.gifbin0 -> 160 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/remove.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/removeAll.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/repository.gifbin0 -> 545 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/results.gifbin0 -> 464 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/rule.gifbin0 -> 159 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/run_exc.gifbin0 -> 379 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/save.gifbin0 -> 639 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/saved.gifbin0 -> 378 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/skywalker.gifbin0 -> 209 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/snapshotSave.gifbin0 -> 184 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/sort.gifbin0 -> 344 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/star.gifbin0 -> 304 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/star_9_9.gifbin0 -> 283 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/switched.gifbin0 -> 65 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/task.gifbin0 -> 857 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/test_procedure.gifbin0 -> 169 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/top.gifbin0 -> 210 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/transaction.gifbin0 -> 82 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/transaction_detail.gifbin0 -> 71 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/trash.gifbin0 -> 904 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/trash_can.gifbin0 -> 521 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/tree_layout.gifbin0 -> 101 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/unarchive.gifbin0 -> 1045 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/undo.gifbin0 -> 355 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/up.gifbin0 -> 323 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/userAdd.gifbin0 -> 576 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/userGrey.gifbin0 -> 315 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/userPurple.gifbin0 -> 314 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/userRed.gifbin0 -> 319 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/userYellow.gifbin0 -> 339 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/users2.gifbin0 -> 597 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/version.gifbin0 -> 477 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/warn.gifbin0 -> 338 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/widget.gifbin0 -> 243 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/workflow.gifbin0 -> 499 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/working.gifbin0 -> 351 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/yellow_light.gifbin0 -> 314 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/images/yellow_m.gifbin0 -> 591 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/plugin.xml1786
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/Merge_1.gifbin0 -> 47295 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/Merge_3.gifbin0 -> 81522 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/Merge_4.gifbin0 -> 21432 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/Merge_5.gifbin0 -> 30528 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/Merge_Manager.html481
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram README.txt2
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram.pdfbin0 -> 19536 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Differences.pdfbin0 -> 10610 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/artifact_explorer_tree.html34
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.gifbin0 -> 74404 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.html39
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/branch_filtering.html26
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/branch_manager_view.html39
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/branch_view.gifbin0 -> 11716 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/change_report_view.gifbin0 -> 15048 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/change_table.html51
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/compare_two_artifacts.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/contexts.xml11
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/create_branch.html40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/creating_new_artifact.html27
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/creating_new_links.html28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/default_branch.html40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/deleting_artifacts.html29
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/deleting_link.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/favorite_branch.html32
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/go_into.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/mass_artifact_editor.html30
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/osee_branching.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/queryLog/contexts.xml9
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/queryLog/delete_log.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.gifbin0 -> 12373 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.html39
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/queryLog/refresh_log.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/all_match_locations_option.html45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/artifact_search.gifbin0 -> 373 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_tagging.html105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_type_filter_option.html45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/by_id_option.html42
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/contexts.xml37
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/include_deleted_option.html41
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelc.pngbin0 -> 671 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelr.pngbin0 -> 619 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quickSearchView.pngbin0 -> 34365 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quick_search_view.html80
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/quickSearch/word_order_match_option.html41
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/refresh_change_report.html26
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/reorder_links.html24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/resource_history_view.GIFbin0 -> 8409 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/result_view.html32
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/result_view.jpgbin0 -> 109605 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/revision_history_view.html27
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/show_change_report.html36
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/skynet_toc.xml32
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/spell_check.gifbin0 -> 18200 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/spell_check.html40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/spell_check.jpgbin0 -> 131904 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/table_customization.html61
-rw-r--r--org.eclipse.osee.framework.ui.skynet/reference/toc.xml3
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/ArtifactExtractor.exsd102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/ArtifactImageProvider.exsd102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/ArtifactRenderer.exsd102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/ArtifactRendererTemplate.exsd119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/AttributeXWidgetProvider.exsd105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/BlamOperation.exsd112
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/DatabaseHealthOperation.exsd102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/IgnorePublishAttribute.exsd102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/OseeDictionary.exsd105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/SimpleTemplateProviderTemplate.exsd120
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/TemplateProvider.exsd105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/WordMlProducer.exsd105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/WordOutlineContentHandler.exsd119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/WorkDefinitionProvider.exsd105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/schema/XWidgetProvider.exsd105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AdminContributionItem.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AlphabeticalRelationComparator.java46
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactContentProvider.java148
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDecorator.java148
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDescriptorDialog.java358
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDoubleClick.java84
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDragDropSupport.java206
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorer.java1503
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorerDragAndDrop.java157
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactImageProvider.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactLabelProvider.java127
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactValidationCheckOperation.java82
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactViewerSorter.java37
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeCellModifier.java149
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeContentProvider.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeLabelProvider.java92
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeMenuSelectionListener.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributesComposite.java336
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/BaseImage.java83
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/DialogPopupLoggerListener.java79
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkArtifactImageProvider.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkImage.java181
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/GenerateTypeEnumAction.java167
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/HTMLTransferFormatter.java70
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/IHelpContextIds.java19
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ImageManager.java366
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AbstractArtifactExtractor.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactExtractor.java41
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportOperation.java166
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportPage.java459
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportWizard.java181
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AttributeTypePage.java152
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/BranchImportPage.java251
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ExcelArtifactExtractor.java219
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IArtifactImportResolver.java24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IWordOutlineContentHandler.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaJob.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaPage.java143
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaWizard.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NativeDocumentExtractor.java62
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NewArtifactImportResolver.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/OutlineContentHandlerPage.java163
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ReqNumbering.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RootAndAttributeBasedArtifactResolver.java131
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifact.java262
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifactKind.java18
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughRelation.java77
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WholeWordDocumentExtractor.java61
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordExtractor.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineContentHandler.java62
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineExtractor.java282
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataExtractor.java75
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataSaxHandler.java63
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/LabelSorter.java103
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ModifyAttributesListener.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithContributionItem.java259
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithMenuListener.java133
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithSelectionListener.java44
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeContributionItem.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeImage.java22
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseePreferencePage.java170
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeServicesStatusContributionItem.java115
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ProgramImage.java48
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationCellModifier.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationContentProvider.java148
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationLabelProvider.java130
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationsComposite.java925
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SessionContributionItem.java175
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetGuiPlugin.java182
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetServiceContributionItem.java110
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TableViewerReport.java106
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ToStringViewerSorter.java40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TreeViewerReport.java114
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XFormToolkit.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XWidgetParser.java197
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyDialog.java237
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyLabelProvider.java98
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableCellModifier.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableViewer.java211
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactPromptChange.java239
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactTransfer.java199
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSelectionDialog.java122
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactAction.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactEditorLoopbackCmd.java106
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/SkynetGuiArtifactFactory.java64
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AnnotationComposite.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AttributeAnnotationHandler.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractArtifactEditor.java129
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractEventArtifactEditor.java261
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditor.java323
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorActionBarContributor.java239
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorContributor.java101
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorInput.java34
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/BaseArtifactEditorInput.java113
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/IActionContributor.java21
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactEditorOutlinePage.java269
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactFormPage.java267
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/AttributeFormPart.java274
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/MessageSummaryNote.java141
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/ArtifactEditorFormSection.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeActionContribution.java151
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeTypeUtil.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributesFormSection.java141
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/DetailsFormSection.java139
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/RelationsFormSection.java106
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditor.java333
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditorInput.java103
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassContentProvider.java119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassLabelProvider.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewer.java333
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewerFactory.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/AtsOpenOption.java22
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IActionable.java25
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IAtsLib.java35
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/NoteType.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/OseeAts.java293
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamContributionManager.java113
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditor.java176
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorActionBarContributor.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorInput.java89
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamOverviewPage.java153
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamParameter.java36
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamWorkflow.java199
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/DynamicBlamOperation.java88
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/ExecuteBlamOperation.java88
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/OperationsPage.java57
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/VariableMap.java111
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowDataPage.java196
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowJob.java44
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/AbstractBlam.java114
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/BlamOperation.java46
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ChangeArtifactTypeBlam.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CheckDefaulHierarchy.java69
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CopyTransactionDataToBaseline.java70
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CreateNewUser.java163
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatabaseHealth.java177
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatastoreStatistics.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteArchivedBranches.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteUnneededUnspecifiedAttributes.java77
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DuplicateRelationOpertions.java247
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExportArtifacts.java150
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExtractReqPriority.java98
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindArtifactsWithMinAttributeContraintProblems.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindInvalidUTF8Chars.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FixTemplateContentArtifacts.java379
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ImageCaptureBlam.java103
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/LoadAllArtifactsOnBranch.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ParseWindowsDirectoryListing.java77
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PruneWorkspace.java72
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeArtifactType.java67
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeAttributeType.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeDeletedAttributes.java96
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeTransaction.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/RelationOrderAnalysisOnBranch.java219
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ReportAttributeTypesUsageBlam.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ResourceManipulation.java471
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SetRequirementCategory.java128
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ShowRevertTransactions.java72
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SortRelationsByBranch.java176
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SwitchParentBranch.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UnicodeConverter.java192
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UniqueNumberOfCurrentOseeUsers.java71
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateArtifactTypeImage.java104
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateCurrentColumn.java536
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateWordFormattedContentAttributes.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ValidateArtifactsToDelete.java102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/XWidgetPopulateExample.java87
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BaseBlamSection.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamInputSection.java151
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamOutputSection.java164
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamUsageSection.java116
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectComposite.java163
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectionDialog.java123
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/RootBranchWizard.java37
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AbstractSelectionChangedHandler.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AccessControlHandler.java71
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ChangeReportHandler.java79
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CollapseTreeHandler.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CompressWordAttributesHandler.java114
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CopyHandler.java99
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/DeleteArtifactHandler.java83
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ExpandTreeHandler.java63
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/Handlers.java94
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenArtifactExplorerHandler.java56
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenMassArtifactEditorHandler.java61
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenSkywalkerEditorHandler.java50
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PasteHandler.java92
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PurgeArtifactHandler.java105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevealInArtifactExplorer.java69
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertArtifactHandler.java107
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertAttributeHandler.java137
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertJob.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowArtifactInResourceHandler.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowPreviewHandler.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewWordChangeReportHandler.java141
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewerReportHandler.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesBetweenCurrentAndParentHandler.java96
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesMadeToHandler.java102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesToParentHandler.java116
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchCompoundContributionItem.java98
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchHandler.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/BranchCreationHandler.java119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/DeleteBranchHandler.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/FlatPresentationHandler.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/HierarchicalPresentationHandler.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/OpenAssociatedArtifactHandler.java75
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeBranchHandler.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeTransactionHandler.java83
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/RenameBranchHandler.java149
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/SetAssociatedBranchArtifactHandler.java77
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowArchivedBranchHandler.java71
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowFavoriteBranchesFirstHandler.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowMergeBranchPresentationHandler.java71
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowTransactionPresentationHandler.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchContributionItem.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchHandler.java62
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitBranchParameter.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitHandler.java207
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoCompoundContributionItem.java122
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoHandler.java25
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentCompoundContributionItem.java119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentHandler.java26
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/UpdateBranchHandler.java148
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/SingleNativeDiffHandler.java136
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/ToggleChangeViewDocOrderHandler.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/BranchIdParameter.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeCompoundContributionItem.java134
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeManagerHandler.java104
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/AbstractEditorHandler.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/ArtifactEditorHandler.java33
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/NativeEditorHandler.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OpenHandler.java62
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OtherEditorHandler.java107
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewTisHandler.java44
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWholeWordHandler.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWithChildWordHandler.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWordHandler.java56
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WholeDocumentEditorHandler.java85
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WordEditorHandler.java85
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareInput.java143
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareItem.java90
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactIdWithoutVersionsCheck.java139
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactTxCurrent.java97
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/AttributeTxCurrent.java102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/BranchStateHealthCheck.java271
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAddressingData.java97
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAttrFromDeletedArt.java56
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpBackingData.java102
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitTransactions.java75
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitedNewAndDeleted.java172
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOperation.java112
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOpsExtensionManager.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateAttributes.java195
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateHRID.java154
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateRelationCheck.java316
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/HealthHelper.java198
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/LocalTxData.java27
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelLinkTxCurrent.java103
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelationDatabaseIntegrityCheck.java240
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RemoveAttributesWithoutArtifacts.java114
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/WordAttributeTrackChangeHealthOperation.java296
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbinit/AddCommonBranch.java64
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/AuthenticationDialog.java246
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/ListDialogSortable.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizard.java97
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizardPage.java236
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportJob.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportPage.java117
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportWizard.java61
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchPage.java137
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchWizard.java63
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupContentProvider.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorer.java546
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerDragAndDrop.java307
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerItem.java174
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupLabelProvider.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupTreeViewer.java51
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/IGroupExplorerProvider.java21
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/ArtifactChangeHandler.java31
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/GeneralWordOutlineHandler.java120
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/SoftwareRequirementHandler.java50
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/listener/IRebuildMenuListener.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactDiffMenu.java120
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTableViewerGlobalMenuHelper.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTreeViewerGlobalMenuHelper.java57
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactsUi.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenu.java253
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuListener.java40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuPermissions.java146
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/IGlobalMenuHelper.java28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/ConflictResolutionWizard.java116
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditAttributeWizardPage.java186
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditWFCAttributeWizardPage.java240
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanAttributeEditor.java132
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanEditor.java48
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateAttributeEditor.java134
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateEditor.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumAttributeEditor.java147
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumEditor.java66
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringAttributeEditor.java144
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringEditor.java121
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbededAttributeEditorFactory.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/IEmbeddedAttributeEditor.java32
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationEvent.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationManager.java64
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotifyUsersJob.java121
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/AuthenticationComposite.java432
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BranchSelectSimpleComposite.java278
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BrowserComposite.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/DetailsBrowserComposite.java54
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/SearchComposite.java297
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ArbitrationServerPage.java157
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ConfigurationDetails.java110
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DefaultWithStringAndIntegerFields.java200
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DiffPreferencePage.java122
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/EditorsPreferencePage.java107
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogContentProvider.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogLabelProvider.java98
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogView.java166
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogXViewerFactory.java64
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModel.java111
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelLabelProvider.java103
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelList.java98
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/IArtifactListViewer.java35
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/OnCloseListener.java17
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationExplorerWindow.java354
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableCellModifier.java105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableSorter.java94
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableViewer.java267
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactEditFileWatcher.java47
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactGuis.java116
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/DefaultArtifactRenderer.java223
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileRenderer.java246
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileSystemRenderer.java176
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IRenderer.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ITemplateRenderer.java25
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IVbaDiffGenerator.java28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/NativeRenderer.java136
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/OpenOfficeWriterRenderer.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/PresentationType.java15
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RendererManager.java311
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/TisRenderer.java120
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateArtifactJob.java356
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateJob.java35
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UrlRenderer.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/VbaWordDiffGenerator.java157
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WholeDocumentRenderer.java231
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordCompareTest.java142
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordImageChecker.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordRenderer.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordTemplateRenderer.java544
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordmlPicture.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/AttributeElement.java77
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/IWordMlProducer.java23
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/Producer.java18
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordMLProducer.java296
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordTemplateProcessor.java566
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/AddTemplateText.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ArtifactProcessing.java157
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/BasicTemplateAttributeHandler.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateAttributeHandler.java26
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateTask.java28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/SRSSpecialPublishingAttributeHandler.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TISAttributeHandler.java45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TemplateAttribute.java142
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordAttributeTypeAttributeHandler.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordTemplateManager.java309
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorProvider.java25
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorTab.java24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditor.java263
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditorInput.java92
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/SkynetTransactionJobTemplate.java111
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/XResultData.java206
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ChartViewerSWT.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/IResultsEditorChartTab.java23
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ResultsEditorChartTab.java98
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/ResultsEditorExample.java224
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/XResultDataExample.java41
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/IResultsEditorHtmlTab.java23
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/ResultsEditorHtmlTab.java159
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserHyperCmd.java44
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserListener.java89
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultPage.java251
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultsComposite.java190
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsEditorTableTab.java28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsXViewerRow.java19
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsEditorTableTab.java108
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsXViewerRow.java57
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewer.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerContentProvider.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerFactory.java48
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerLabelProvider.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertContentProvider.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertDeletionCheck.java47
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertLabelProvider.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizard.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizardPage.java260
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchQuery.java57
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchResult.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractLegacyArtifactSearchQuery.java45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchPage.java598
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchResult.java37
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactTypeFilter.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeFindReplaceDialog.java229
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeValueFilter.java66
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/FilterArtifactSearchQuery.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HistoricalArtifactSearchQuery.java42
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HridValueFilter.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/IdArtifactSearch.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/InRelationFilter.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/MaxMatchCountConfirmer.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/OrphanSearchFilter.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchOptionComposite.java554
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchView.java207
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/RemoteArtifactSearch.java280
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/SearchFilter.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModel.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelLabelProvider.java101
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelList.java99
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableCellModifier.java73
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableViewer.java182
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AbstractArtifactSearchViewPage.java25
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchLabelProvider.java275
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchPage.java553
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTableContentProvider.java83
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTreeContentProvider.java239
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeLineElement.java104
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeMatch.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/DecoratingArtifactSearchLabelProvider.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/IArtifactSearchContentProvider.java22
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/ArtifactSearchEngine.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactMatchAdapter.java36
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchContentProvider.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchResultCollector.java51
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IFilterListViewer.java37
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphContentProvider.java188
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphLabelProvider.java144
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ISkyWalkerOptionsChangeListener.java24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/RelTypeContentProvider.java192
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerArtTypeTabItem.java155
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerLayoutTabItem.java168
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerOptions.java461
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerRelTypeTabItem.java140
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerShowAttributeTabItem.java105
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerTabOptions.java37
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerView.java384
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/status/SwtStatusMonitor.java58
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ArtifactTemplateProvider.java128
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ITemplateProvider.java33
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/SimpleTemplateProviderDbTask.java90
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/TemplateManager.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/InterArtifactExplorerDropHandler.java193
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectArtifactStatusDialog.java50
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectContentProvider.java72
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectDecoratingLabelProvider.java48
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/RevertLabelProvider.java82
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferObject.java41
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferStatus.java35
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactClipboard.java119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactDescriptiveLabelProvider.java46
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameReverseSorter.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameSorter.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeAndDescriptiveLabelProvider.java47
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeLabelProvider.java47
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeNameSorter.java39
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/AttributeCheckListDialog.java158
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ChangeType.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/DbConnectionExceptionComposite.java51
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailGroupsAndUserGroups.java112
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailableJob.java86
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HierarchicalReportDialog.java64
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HtmlExportTable.java130
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IDefineNavigateItem.java23
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IOseeDictionary.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ImageCapture.java45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/KeyEventExample.java241
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeDictionary.java126
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeEmail.java383
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeMainDictionary.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ShowAttributeAction.java80
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetDragAndDrop.java202
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetGuiDebug.java40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetSelections.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetViews.java110
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/TransactionIdLabelProvider.java32
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/WordUiUtil.java82
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/backup/BackupBranchesJob.java115
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailGroup.java45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizard.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizardPage.java314
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTree.java119
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTreeDialog.java139
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTree.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTreeDialog.java153
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/Matrix.java146
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/MatrixItem.java63
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactTypeContentProvider.java54
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeContentProvider.java61
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/DefaultBranchContentProvider.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/HyperLinkLabel.java113
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IArtifactWidget.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IBranchArtifact.java24
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationTypeContentProvider.java60
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/SkynetSpellModifyDictionary.java122
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactList.java38
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactTypeListViewer.java44
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XAttributeTypeListViewer.java47
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectComboWidget.java229
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidget.java238
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidgetProvider.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XButton.java193
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBox.java185
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBoxDam.java77
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCombo.java383
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboBooleanDam.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java96
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboViewer.java305
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDate.java359
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDateDam.java91
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDragAndDrop.java46
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFileTextWithSelectionDialog.java113
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloat.java72
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloatDam.java87
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelGroupSelection.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelDam.java109
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelection.java72
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelSelection.java241
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XInteger.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java84
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabel.java130
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabelDam.java159
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java488
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDam.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDropViewer.java141
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListViewer.java406
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersCombo.java331
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersList.java64
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XModifiedListener.java19
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidget.java254
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetDam.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetFactory.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetTextDam.java95
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetXTextTest.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java109
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercent.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercentDam.java40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButton.java218
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtonTest.java222
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtons.java328
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromDialog.java232
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceBranch.java70
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceDam.java123
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedDam.java332
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedWidget.java480
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XText.java618
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDam.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDescriptiveName.java28
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextResourceDropDam.java114
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellCheckPaintListener.java231
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellModifyDictionary.java21
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTypeListViewer.java43
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java509
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetUtility.java63
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetValidateUtility.java66
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/DateValue.java45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/EnumeratedValue.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/StringValue.java44
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditor.java165
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditorValue.java27
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactCheckTreeDialog.java67
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactListDialog.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeChildrenContentProvider.java117
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeContentProvider.java108
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTypeFilteredTreeDialog.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeCheckTreeDialog.java69
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeLabelProvider.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ChangeTypeDialog.java113
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/CheckBoxDialog.java69
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/DateSelectionDialog.java99
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/Dialogs.java83
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryCheckDialog.java95
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialog.java265
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialogWithBranchSelect.java217
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/GroupListDialog.java122
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/HtmlDialog.java94
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ImageDialog.java106
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserCheckTreeDialog.java97
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserGroupsCheckTreeDialog.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserListDialog.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/AsciiColumnLabelProvider.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/BasicHexTable.java113
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/ByteColumnLabelProvider.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/CustomTextCellEditor.java54
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/DividerLabel.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexEditingSupport.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTable.java99
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableContentProvider.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableRow.java100
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/Highlighter.java81
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/IHexTblHighlighter.java26
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/OffsetColumnLabelProvider.java59
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/AttributeXWidgetManager.java49
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultAttributeXWidgetProvider.java106
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultXWidgetOptionResolver.java35
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayout.java398
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayoutData.java232
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IAttributeXWidgetProvider.java23
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IDynamicWidgetLayoutListener.java30
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IWorkDefinitionProvider.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetOptionResolver.java20
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetProvider.java22
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/UserCommunity.java51
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkDefinitionProvider.java56
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinition.java472
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinitionFactory.java30
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemAttributes.java46
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinition.java259
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinitionFactory.java235
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemWithChildrenDefinition.java95
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPage.java270
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageButton.java94
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinition.java127
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionLabelProvider.java42
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionViewSorter.java31
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageSection.java61
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkRuleDefinition.java76
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkWidgetDefinition.java127
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/XWidgetFactory.java335
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchOptions.java19
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchView.java244
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewImageHandler.java88
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewPresentationPreferences.java173
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewer.java86
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewerFactory.java54
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/FavoriteSorter.java78
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchContentProvider.java247
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchLabelProvider.java206
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchWidget.java392
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryView.java340
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java122
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java56
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryContentProvider.java66
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java110
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java350
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLine.java93
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLineSegment.java51
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java248
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeView.java308
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeViewPresentationPreferences.java126
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewer.java159
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewerFactory.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/DefaultHierSorter.java112
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeContentProvider.java120
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeLabelProvider.java112
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeWidget.java437
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeUtility.java391
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeView.java1019
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewer.java218
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerFactory.java53
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerSorter.java65
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeContentProvider.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeLabelProvider.java170
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeViewer.java731
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/test/Merge Manager Manual GUI testing.docbin0 -> 841502 bytes
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateComposite.java252
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateContentProvider.java88
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItem.java96
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemAction.java97
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemBlam.java39
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemFolder.java40
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateLabelProvider.java75
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateUrlItem.java71
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewFilter.java52
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewItems.java35
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/OseeXViewerTreeReport.java45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/AttributeSortDataType.java36
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetCustomizations.java197
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetUserArtifactCustomizeDefaults.java118
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetXViewerFactory.java148
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerAttributeSortDataType.java36
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerCustomizationArtifact.java74
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactNameColumn.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactTypeColumn.java68
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerAttributeColumn.java69
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerGuidColumn.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerHridColumn.java55
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/AllWords.txt134689
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/README45
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/README.txt5
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.0239
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.151
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.290
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.01835
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.1741
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.26767
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.01899
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.1743
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.26688
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.047158
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.120864
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.237616
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.319708
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW Software Requirement with Recursion.xml3
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL.xml7688
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL_RECURSE.xml7686
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/templates/Word Edit Template.xml3
-rw-r--r--org.eclipse.osee.framework.ui.skynet/support/templates/Word Merge Template.xml3
-rw-r--r--org.eclipse.osee.framework.ui.swt/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.swt/.project28
-rw-r--r--org.eclipse.osee.framework.ui.swt/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.ui.swt/META-INF/MANIFEST.MF18
-rw-r--r--org.eclipse.osee.framework.ui.swt/build.properties7
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ALayout.java64
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Activator.java60
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ColumnSorter.java111
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/CustomTableCellEditor.java51
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DialogUtil.java38
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizard.java398
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizardPage.java48
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnhancedTabFolder.java107
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnumeratedCellEditor.java174
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionComposite.java58
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionDialog.java49
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/FormattedText.java117
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IContentProviderRunnable.java20
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IDirtiableEditor.java18
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IPAddressBox.java260
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITabFolderItem.java17
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITreeNode.java37
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/LatLongBox.java434
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/MenuItems.java49
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonBlankValidator.java37
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonmodalWizardDialog.java123
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/OseeMessageDialog.java207
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/PeriodicDisplayTask.java91
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Search.java157
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCCombo.java1503
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCellEditor.java313
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/StackedViewer.java108
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TabFolderItem.java20
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TextCellEditor.java155
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeNode.java125
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeViewerUtility.java69
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Trees.java35
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Widgets.java825
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ASpellWord.java24
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/IDictionary.java20
-rw-r--r--org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ToolTip.java130
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/.project28
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF19
-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/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/IJarChangeListener.java53
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java181
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java158
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java259
-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.java35
-rw-r--r--org.eclipse.osee.framework.updater/.classpath8
-rw-r--r--org.eclipse.osee.framework.updater/.project28
-rw-r--r--org.eclipse.osee.framework.updater/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--org.eclipse.osee.framework.updater/META-INF/MANIFEST.MF20
-rw-r--r--org.eclipse.osee.framework.updater/build.properties9
-rw-r--r--org.eclipse.osee.framework.updater/buildJar.xml17
-rw-r--r--org.eclipse.osee.framework.updater/plugin.xml12
-rw-r--r--org.eclipse.osee.framework.updater/schema/InstallJob.exsd105
-rw-r--r--org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/Activator.java60
-rw-r--r--org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/BaseInstallJob.java34
-rw-r--r--org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/IInstallJob.java18
-rw-r--r--org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/OseeInstallHandler.java155
-rw-r--r--org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/PostgresTasks.java60
-rw-r--r--org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/WindowsShell.java111
-rw-r--r--org.eclipse.osee.master.feature/.project17
-rw-r--r--org.eclipse.osee.master.feature/build.properties5
-rw-r--r--org.eclipse.osee.master.feature/feature.xml53
-rw-r--r--org.eclipse.osee.ote.client.msg/.classpath7
-rw-r--r--org.eclipse.osee.ote.client.msg/.project28
-rw-r--r--org.eclipse.osee.ote.client.msg/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF21
-rw-r--r--org.eclipse.osee.ote.client.msg/build.properties5
-rw-r--r--org.eclipse.osee.ote.client.msg/plugin.xml6
-rw-r--r--org.eclipse.osee.ote.client.msg/schema/org.wclipse.see.ote.client.msg.dBFactory.exsd102
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java29
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java65
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java23
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java63
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java78
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java163
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java121
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java106
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java152
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java62
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java280
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java418
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java47
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java171
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java58
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java159
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java49
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java130
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java161
-rw-r--r--org.eclipse.osee.ote.client/.classpath7
-rw-r--r--org.eclipse.osee.ote.client/.project28
-rw-r--r--org.eclipse.osee.ote.client/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.ote.client/META-INF/MANIFEST.MF27
-rw-r--r--org.eclipse.osee.ote.client/build.properties5
-rw-r--r--org.eclipse.osee.ote.client/plugin.xml6
-rw-r--r--org.eclipse.osee.ote.client/schema/org.eclipse.osee.ote.client.libraryProvidier.exsd102
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java97
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java76
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java18
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ILibraryLoader.java39
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionary.java38
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionaryListener.java21
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java152
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteRuntimeLibraryProvider.java18
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java42
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java41
-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/MessageSink.java27
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/MessagingGatewayBindTracker.java77
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java100
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java44
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java33
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java232
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/HostFilter.java43
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java144
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointReceive.java41
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointSend.java72
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteServiceStatusListener.java30
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java550
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java89
-rw-r--r--org.eclipse.osee.ote.connection.jini/.classpath7
-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/src/org/eclipse/osee/ote/connection/jini/Activator.java136
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java26
-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.java29
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java66
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java243
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnectorRegistrar.java285
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java183
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java44
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java64
-rw-r--r--org.eclipse.osee.ote.connection.service.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.connection.service.test/.project28
-rw-r--r--org.eclipse.osee.ote.connection.service.test/.settings/org.eclipse.pde.core.prefs4
-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/src/org/eclipse/osee/ote/connection/service/test/Activator.java103
-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/.project28
-rw-r--r--org.eclipse.osee.ote.connection.service/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF16
-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/schema/org.eclipse.osee.connection.service.ext.exsd102
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/Activator.java78
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/ConnectionServiceImpl.java136
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/EventNotifier.java85
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java53
-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.java19
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java74
-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.java138
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java32
-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/.project28
-rw-r--r--org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.core.prefs311
-rw-r--r--org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.ui.prefs5
-rw-r--r--org.eclipse.osee.ote.core/META-INF/MANIFEST.MF43
-rw-r--r--org.eclipse.osee.ote.core/build.properties10
-rw-r--r--org.eclipse.osee.ote.core/help/toc.xml22
-rw-r--r--org.eclipse.osee.ote.core/images/laser_16_16.gifbin0 -> 1092 bytes
-rw-r--r--org.eclipse.osee.ote.core/plugin.xml33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java57
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java112
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java46
-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.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java131
-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/OseeTestThread.java162
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java102
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java441
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java61
-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.java65
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java737
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java113
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Command.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributer.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributerImpl.java81
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandHandler.java21
-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/PropertyStoreCommand.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java19
-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.java38
-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.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java28
-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.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java70
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BasicEnv.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java123
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java106
-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/OteEnvironmentTrackerCustomizer.java56
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java78
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndpointSender.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndprointRecieve.java43
-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.java70
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java745
-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.java85
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java50
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java51
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/UserTestSessionKey.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java99
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java60
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/package.html23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java147
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/package.html23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java78
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java94
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java103
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java25
-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.java32
-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.java29
-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.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java18
-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.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java70
-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.java28
-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.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java85
-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.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java29
-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.java16
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeConfigurationInitilizer.java26
-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.java205
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java69
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/package.html15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java16
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java56
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java41
-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.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusListener.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java215
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java72
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java71
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/package.html23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java97
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java90
-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.java34
-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.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java91
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java51
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java23
-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.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java60
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java62
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java21
-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.java97
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java78
-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/InformationalPrompt.java63
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java51
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java60
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java200
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java86
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java104
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java69
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java65
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java60
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java125
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java149
-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.java33
-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.java51
-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.java184
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java97
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java212
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java290
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/package.html23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/BaseTestRecord.java108
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java81
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java126
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java69
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java63
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java145
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java154
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java107
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/package.html23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java31
-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.java132
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelManager.java391
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/package.html20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/package.html19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java150
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java326
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java77
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java120
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java139
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java50
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java48
-rw-r--r--org.eclipse.osee.ote.core/support/overview.html23
-rw-r--r--org.eclipse.osee.ote.define/.classpath7
-rw-r--r--org.eclipse.osee.ote.define/.project28
-rw-r--r--org.eclipse.osee.ote.define/META-INF/MANIFEST.MF29
-rw-r--r--org.eclipse.osee.ote.define/build.properties11
-rw-r--r--org.eclipse.osee.ote.define/plugin.xml29
-rw-r--r--org.eclipse.osee.ote.define/schema/OutfileParser.exsd109
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ARTIFACTS.java28
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ATTRIBUTES.java55
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_RELATIONS.java66
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/OteDefinePlugin.java42
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunField.java54
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunStorageKey.java24
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/MappedAttributeDataProvider.java213
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteArtifactFetcher.java116
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteToAttributeMap.java140
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/TestRunOperator.java310
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/FindCommitableJob.java91
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/OutfileToArtifactJob.java80
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/RemoteResourceRequestJob.java59
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/AbstractRemoteResourceRequestTemplate.java135
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/ImportOutfileOperation.java153
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/LinkTestRunToTestScriptOperation.java63
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/OutfileToArtifactOperation.java105
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/RemoteResourceRequestOperation.java84
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/BaseOutfileParser.java71
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/CollectionParser.java60
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ICollectionSource.java15
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/IDataListener.java19
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ISaxElementHandler.java20
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/OteOutfileParser.java88
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/SaxChunkCollector.java89
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/AbstractParseHandler.java72
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ConfigHandler.java44
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/CurrentProcessorHandler.java30
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/DemoInfoHandler.java42
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ElapsedTimeHandler.java43
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ExecutionStatusHandler.java33
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/RuntimeVersionsHandler.java38
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/SystemInfoHandler.java39
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/TestPointResultsHandler.java33
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/VersionInformationHandler.java39
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileDataCollector.java74
-rw-r--r--org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileParserExtensionManager.java141
-rw-r--r--org.eclipse.osee.ote.define/support/OseeTypes_OTE.xml1392
-rw-r--r--org.eclipse.osee.ote.feature/.project17
-rw-r--r--org.eclipse.osee.ote.feature/build.properties5
-rw-r--r--org.eclipse.osee.ote.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.ote.feature/feature.properties144
-rw-r--r--org.eclipse.osee.ote.feature/feature.xml130
-rw-r--r--org.eclipse.osee.ote.feature/license.html79
-rw-r--r--org.eclipse.osee.ote.feature/osee_32.pngbin0 -> 2818 bytes
-rw-r--r--org.eclipse.osee.ote.feature/sourceTemplateFeature/feature.properties144
-rw-r--r--org.eclipse.osee.ote.message/.classpath7
-rw-r--r--org.eclipse.osee.ote.message/.cvsignore1
-rw-r--r--org.eclipse.osee.ote.message/.project28
-rw-r--r--org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.core.prefs256
-rw-r--r--org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--org.eclipse.osee.ote.message/ElementTest.launch16
-rw-r--r--org.eclipse.osee.ote.message/META-INF/MANIFEST.MF34
-rw-r--r--org.eclipse.osee.ote.message/build.properties8
-rw-r--r--org.eclipse.osee.ote.message/help/toc.xml3
-rw-r--r--org.eclipse.osee.ote.message/plugin.xml17
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java25
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java20
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java19
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageHeader.java37
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageSendListener.java22
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageTestContext.java21
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java84
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IOteIO.java18
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java20
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/Message.java1172
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java35
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageEventLogger.java133
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageState.java60
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemException.java32
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java61
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java238
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java116
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/OseeURLClassLoader.java70
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/UniversalMessageListener.java22
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java70
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/RecordCommand.java108
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetElementValue.java70
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java84
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java66
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java70
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java65
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java33
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AndCondition.java41
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java56
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java62
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java78
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java41
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java74
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java48
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ICondition.java18
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java16
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java63
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ListCondition.java66
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java281
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java41
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java48
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/OrCondition.java41
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/PulseCondition.java53
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java34
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java68
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java29
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java34
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java65
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/HeaderData.java42
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java18
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MemoryResource.java498
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java536
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MessageData.java727
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/ArrayElement.java85
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/BooleanElement.java82
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/CharElement.java569
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java1557
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Element.java305
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java149
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java219
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java406
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Float32Element.java159
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Float64Element.java177
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java49
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IEnumValue.java16
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java17
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java51
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IntegerElement.java276
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java211
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java35
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/NumericElement.java36
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RealElement.java114
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordElement.java157
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordMap.java122
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java237
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/StringElement.java220
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java1046
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java417
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java450
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java152
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java89
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java90
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java993
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java984
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java88
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java981
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java219
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/ISequenceHandle.java20
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/SequenceHandle.java56
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnum.java40
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnumElementOperations.java80
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestFloat32Operations.java51
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestIntegerOperations.java295
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessage.java61
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageData.java46
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageOperations.java80
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestRecordElement.java22
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestStringOperations.java82
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestAccessor.java672
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestSupport.java434
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java101
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/MemType.java32
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java84
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java26
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java48
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java28
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java23
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java25
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/INamespace.java15
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java23
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java20
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java23
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java20
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java76
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java23
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java41
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java24
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/Namespace.java50
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/Activator.java65
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/MessageWatchActivator.java66
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java24
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java302
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/SPEED.java18
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java60
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/package.html15
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float32ElementTest.java92
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float64ElementTest.java98
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/IntegerElementTest.java246
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/LongIntegerElementTest.java234
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/SignedInteger16ElementTest.java69
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/testStringElement.java140
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/AlarmClock.java49
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java65
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/RealTime.java146
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java166
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/AbstractMessageToolService.java964
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java22
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java30
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/MessageMode.java21
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java50
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java53
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/TransferConfig.java91
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java302
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java135
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java19
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java87
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java128
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java39
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java78
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java43
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java46
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java47
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java47
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java28
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java17
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/MessageRecEntry.java342
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java37
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java62
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java57
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java37
-rw-r--r--org.eclipse.osee.ote.messaging.dds/.classpath7
-rw-r--r--org.eclipse.osee.ote.messaging.dds/.project28
-rw-r--r--org.eclipse.osee.ote.messaging.dds/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF19
-rw-r--r--org.eclipse.osee.ote.messaging.dds/build.properties5
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java52
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java69
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java62
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java51
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java19
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java31
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java19
-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.java41
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java32
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java63
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java38
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java48
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java69
-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.java38
-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.java66
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java75
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java57
-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.java601
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java359
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java34
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java574
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java147
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java133
-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.java39
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java365
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java67
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java278
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java323
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java38
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java238
-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.java75
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java58
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java38
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java23
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java22
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java32
-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.java53
-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.java63
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java33
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java47
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java89
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java111
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java87
-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.java51
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java30
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java74
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java29
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java42
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java60
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java42
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java42
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java60
-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.java49
-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.java42
-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.java225
-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.java77
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java53
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java45
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java119
-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.runtimeManager/.classpath7
-rw-r--r--org.eclipse.osee.ote.runtimeManager/.project28
-rw-r--r--org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.pde.core.prefs4
-rw-r--r--org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF25
-rw-r--r--org.eclipse.osee.ote.runtimeManager/build.properties5
-rw-r--r--org.eclipse.osee.ote.runtimeManager/plugin.xml32
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/BundleInfo.java157
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java44
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java144
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java146
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteBundleLocator.java26
-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/RuntimeManager.java34
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java255
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java71
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java33
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java73
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java56
-rw-r--r--org.eclipse.osee.ote.ui.define/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.define/.project28
-rw-r--r--org.eclipse.osee.ote.ui.define/META-INF/MANIFEST.MF46
-rw-r--r--org.eclipse.osee.ote.ui.define/build.properties12
-rw-r--r--org.eclipse.osee.ote.ui.define/help/contexts.xml6
-rw-r--r--org.eclipse.osee.ote.ui.define/help/testRunView.html14
-rw-r--r--org.eclipse.osee.ote.ui.define/help/testrunview.jpgbin0 -> 97568 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/help/testrunview.xcfbin0 -> 110263 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/help/toc.xml9
-rw-r--r--org.eclipse.osee.ote.ui.define/images/addition.gifbin0 -> 194 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/childBranch.gifbin0 -> 100 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/chkbox_disabled.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/chkbox_enabled.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/collapseState.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/commit.gifbin0 -> 222 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/commit_wiz.pngbin0 -> 4575 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/confauto_ov.gifbin0 -> 194 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/delete.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/deleteAll.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/expandState.gifbin0 -> 91 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/filter_history.gifbin0 -> 219 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/flat_layout.gifbin0 -> 97 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/latest_versions.gifbin0 -> 594 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/obstructed.gifbin0 -> 179 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/obstructed_16x16.gifbin0 -> 186 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/outfile_import.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/parentBranch.gifbin0 -> 127 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/refresh.gifbin0 -> 182 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/remove.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/removeAll.gifbin0 -> 204 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/repository.gifbin0 -> 545 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/switched.gifbin0 -> 829 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/synch.gifbin0 -> 238 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/testRunView.gifbin0 -> 568 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/tree_layout.gifbin0 -> 101 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/images/version_controlled.gifbin0 -> 106 bytes
-rw-r--r--org.eclipse.osee.ote.ui.define/plugin.xml183
-rw-r--r--org.eclipse.osee.ote.ui.define/schema/ITestRunReport.exsd115
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteDefineImage.java28
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteUiDefinePlugin.java50
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/BranchComboDialog.java173
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/CommitDialog.java156
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/OverrideInvalidScriptRevisions.java54
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ReportsDialog.java525
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ResourceSelectionDialog.java72
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/ImportOutfileUIOperation.java128
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportPage.java386
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportWizard.java74
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/AddArtifactsToViewerJob.java59
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitJobDialog.java180
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitTestRunJob.java117
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/ReportErrorsJob.java104
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/CommentComposite.java61
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/GrayableBranchSelectionComposite.java230
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/IOverrideHandler.java27
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/ListSelectionPanel.java104
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/PreviewPanel.java113
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/SelectionComposite.java371
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ExtensionDefinedReports.java162
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HighLevelSummary.java197
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HistoricalTestRunData.java160
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HttpReportRequest.java171
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ITestRunReport.java36
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTable.java219
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTableColumnData.java121
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlTableReport.java76
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ExcelReportWriter.java107
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/HtmlReportWriter.java73
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/IReportWriter.java33
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFactory.java87
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFormat.java33
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ReportWriter.java91
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/test/manager/TestRunArtifactOptions.java92
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/CommitConfiguration.java48
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/EditorUtility.java84
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/HtmlStringUtils.java28
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/SelectionHelper.java79
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/DragDropHandler.java206
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/IDataChangedListener.java19
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewer.java299
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewerFactory.java92
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/XViewerDataManager.java273
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/AbstractActionHandler.java59
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/EditDispositionAction.java74
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/LaunchReportsAction.java59
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedOutfile.java80
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedScript.java85
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenInArtifactEditor.java74
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ArtifactItem.java301
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/BranchItem.java83
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItem.java77
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemContentProvider.java61
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemLabelProvider.java78
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/IXViewerItem.java24
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ScriptItem.java156
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunView.java282
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunViewNavigateItem.java56
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/FlatPresentationHandler.java26
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/GroupedPresentationHandler.java26
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/LongNamesPresentationHandler.java26
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ShortNamesPresentationHandler.java26
-rw-r--r--org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ToggleFilterHandler.java38
-rw-r--r--org.eclipse.osee.ote.ui.define/templates/HtmlActiveTableTemplate43
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/.project28
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/META-INF/MANIFEST.MF22
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/build.properties6
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/images/console.gifbin0 -> 582 bytes
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/images/test_server.gifbin0 -> 605 bytes
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/images/user.gifbin0 -> 542 bytes
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/plugin.xml12
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/CategoryNode.java27
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/ConsoleNode.java51
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/EnvironmentViewer.java285
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TestServerConsoleServiceRenderer.java230
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TreeBuilder.java38
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UiPlugin.java30
-rw-r--r--org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UserNode.java27
-rw-r--r--org.eclipse.osee.ote.ui.markers/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.markers/.project28
-rw-r--r--org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF20
-rw-r--r--org.eclipse.osee.ote.ui.markers/build.properties4
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java56
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java79
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java116
-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.java146
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java139
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java229
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java33
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java58
-rw-r--r--org.eclipse.osee.ote.ui.mux/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.mux/.project28
-rw-r--r--org.eclipse.osee.ote.ui.mux/META-INF/MANIFEST.MF22
-rw-r--r--org.eclipse.osee.ote.ui.mux/build.properties7
-rw-r--r--org.eclipse.osee.ote.ui.mux/help/contexts.xml6
-rw-r--r--org.eclipse.osee.ote.ui.mux/help/muxView.JPGbin0 -> 37732 bytes
-rw-r--r--org.eclipse.osee.ote.ui.mux/help/package.html16
-rw-r--r--org.eclipse.osee.ote.ui.mux/help/toc.xml9
-rw-r--r--org.eclipse.osee.ote.ui.mux/icons/1553.gifbin0 -> 862 bytes
-rw-r--r--org.eclipse.osee.ote.ui.mux/plugin.xml48
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/MuxToolPlugin.java80
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/OteMuxImage.java34
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/MuxViewNavigatorItem.java34
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/OpenMuxViewAction.java38
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DataNode.java66
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordContentProvider.java45
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordLabelProvider.java42
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/RowNode.java48
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/DatawordModel.java79
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/MessageModel.java68
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MessageNode.java187
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgContentProvider.java44
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgLabelProvider.java58
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/IRegistrationListener.java28
-rw-r--r--org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/MuxView.java927
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/.project28
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/.settings/org.eclipse.core.resources.prefs3
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF51
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/build.properties11
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/contexts/tmAdvancedPage.xml8
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/contexts/tmHostsPage.xml6
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/contexts/tmOverviewPage.xml6
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/contexts/tmScriptsPage.xml6
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/SourcePage.JPGbin0 -> 79534 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/advancedPage.JPGbin0 -> 89536 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/advancedPage.html20
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/hostsPage.JPGbin0 -> 110968 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/hostsPage.html27
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/hostsPage2.JPGbin0 -> 112714 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/overview.html24
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/overviewPage.html16
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/overviewPage.jpgbin0 -> 79613 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.JPGbin0 -> 88643 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.html57
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/scriptsPage2.JPGbin0 -> 96180 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/scriptsPage3.JPGbin0 -> 1739274 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/scriptsPage4.JPGbin0 -> 97424 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/sourcePage.html17
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/testing.html19
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/testing.xml8
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/toc.html19
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/toc.xml15
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/train_javadev.html24
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/train_javaprog.html25
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/train_wbench.html32
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/training.html25
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/help/training.xml17
-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.xml202
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_executionOptions.html10
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_markerOptions.html10
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_scriptOptions.html10
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/references/tm_hostsPage.html10
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/references/tm_overviewPage.html10
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/references/tm_scriptsPage.html10
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/schema/AdvancedPageContribution.exsd105
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/Debug.java38
-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.java36
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/TestManagerPlugin.java85
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java54
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java69
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java29
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchDecorator.java71
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchProjectNature.java256
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/AddTestBatchProjectNature.java113
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/RemoveTestBatchProjectNature.java122
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ITestBatchDataListener.java21
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ProjectSetupItem.java52
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/RefreshOteNavigator.java59
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchData.java56
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchRegistry.java101
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupItem.java95
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupViewItems.java57
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/ResourceFinder.java103
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/SelectionUtil.java65
-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.java60
-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.java22
-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.java106
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java136
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java175
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java91
-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.java217
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java41
-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.java40
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java425
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java32
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java188
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java569
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java123
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java154
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java29
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java142
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerModel.java215
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java156
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java172
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java166
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java126
-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.java70
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java178
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java91
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java179
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java131
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/OverviewPage.java201
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java475
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java135
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java94
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ExtensionContributions.java47
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/IAdvancedPageContribution.java33
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java126
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java25
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java42
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java502
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java171
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java133
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java101
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java103
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java70
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java145
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java158
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java150
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java61
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java96
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java137
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java127
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java53
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java308
-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.java163
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java56
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java121
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java54
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java88
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java71
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java64
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java170
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java207
-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/.project28
-rw-r--r--org.eclipse.osee.ote.ui/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF34
-rw-r--r--org.eclipse.osee.ote.ui/build.properties13
-rw-r--r--org.eclipse.osee.ote.ui/help/contexts.xml6
-rw-r--r--org.eclipse.osee.ote.ui/help/toc.xml10
-rw-r--r--org.eclipse.osee.ote.ui/images/checkout.gifbin0 -> 577 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/config.gifbin0 -> 155 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/connected_sm.gifbin0 -> 1049 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/file.gifbin0 -> 354 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/function.gifbin0 -> 371 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/outfile_import.gifbin0 -> 581 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/procedure.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/testrun.gifbin0 -> 558 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/welcome_item3.gifbin0 -> 124 bytes
-rw-r--r--org.eclipse.osee.ote.ui/plugin.xml66
-rw-r--r--org.eclipse.osee.ote.ui/schema/OteNavigateItem.exsd109
-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/OteArtifactImageProvider.java28
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java35
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java101
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java51
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestCoreGuiPlugin.java120
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java75
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/IOteNavigateItem.java23
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteExtensionPointData.java45
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java118
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java125
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java41
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/WorkspaceSetupViewItems.java108
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/oteNavigator.JPGbin0 -> 22824 bytes
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/package.html19
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/testclassserver/ClassServerInst.java145
-rw-r--r--org.eclipse.osee.support.admin/.project11
-rw-r--r--org.eclipse.osee.support.admin/legal/Contribution_Questionnaire.xlsbin0 -> 43520 bytes
-rw-r--r--org.eclipse.osee.support.admin/openDO/meeting.txt74
-rw-r--r--org.eclipse.osee.support.admin/presentations/EclipseCon2009_Developing_High_Integrity_Software.html27
-rw-r--r--org.eclipse.osee.support.admin/presentations/EclipseCon2009_OSEE_Test Environment.html47
-rw-r--r--org.eclipse.osee.support.admin/presentations/EclipseFoundation_2008-02-13.pdfbin0 -> 820024 bytes
-rw-r--r--org.eclipse.osee.support.admin/presentations/SummitEurope_2008-11-19_OSEEintegratedSolution.pdfbin0 -> 829508 bytes
-rw-r--r--org.eclipse.osee.support.build/.classpath7
-rw-r--r--org.eclipse.osee.support.build/.project28
-rw-r--r--org.eclipse.osee.support.build/META-INF/MANIFEST.MF7
-rw-r--r--org.eclipse.osee.support.build/build.properties4
-rw-r--r--org.eclipse.osee.support.build/support/build.properties239
-rw-r--r--org.eclipse.osee.support.build/support/config.ini8
-rw-r--r--org.eclipse.osee.support.build/support/osee.map115
-rw-r--r--org.eclipse.osee.support.build/support/osee_client_build.xml14
-rw-r--r--org.eclipse.osee.support.build/support/osee_common_build.xml49
-rw-r--r--org.eclipse.osee.support.build/support/osee_server_build.xml34
-rw-r--r--org.eclipse.osee.support.config/.project11
-rw-r--r--org.eclipse.osee.support.config/DemoSetup.txt53
-rw-r--r--org.eclipse.osee.support.config/launchConfig/DB Config [localhost, skynet import].launch31
-rw-r--r--org.eclipse.osee.support.config/launchConfig/DB Config [localhost].launch34
-rw-r--r--org.eclipse.osee.support.config/launchConfig/OSEE Application Server [derby].launch24
-rw-r--r--org.eclipse.osee.support.config/launchConfig/OSEE Demo Application Server [localhost].launch24
-rw-r--r--org.eclipse.osee.support.config/launchConfig/OSEE Demo product [localhost].launch31
-rw-r--r--org.eclipse.osee.support.config/launchConfig/OSEE Demo product [microdoc].launch31
-rw-r--r--org.eclipse.osee.support.config/osee_team_3.4.epf915
-rw-r--r--org.eclipse.osee.support.config/projectSets/OseeAppServerProjectSet.psf38
-rw-r--r--org.eclipse.osee.support.config/projectSets/OseeClientProjectSet.psf42
-rw-r--r--org.eclipse.osee.support.dev/.project11
-rw-r--r--org.eclipse.osee.support.dev/database/db_performance.txt112
-rw-r--r--org.eclipse.osee.support.dev/design/openOffice.txt11
-rw-r--r--org.eclipse.osee.support.dev/process/basis.html95
-rw-r--r--org.eclipse.osee.support.dev/techNotes/CDT.txt7
-rw-r--r--org.eclipse.osee.support.test.util/.classpath7
-rw-r--r--org.eclipse.osee.support.test.util/.project28
-rw-r--r--org.eclipse.osee.support.test.util/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.support.test.util/META-INF/MANIFEST.MF16
-rw-r--r--org.eclipse.osee.support.test.util/build.properties4
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/Activator.java60
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/AtsUserCommunity.java18
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoActionableItems.java56
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCISBuilds.java18
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCscis.java18
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoProgramAttributes.java49
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSawBuilds.java18
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSubsystems.java49
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoUsers.java81
-rw-r--r--org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/TestUtil.java149
-rw-r--r--org.eclipse.osee.support.test/.classpath7
-rw-r--r--org.eclipse.osee.support.test/.project28
-rw-r--r--org.eclipse.osee.support.test/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--org.eclipse.osee.support.test/META-INF/MANIFEST.MF25
-rw-r--r--org.eclipse.osee.support.test/MasterTestSuite_DemoDbTests.launch42
-rw-r--r--org.eclipse.osee.support.test/build.properties5
-rw-r--r--org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/Activator.java60
-rw-r--r--org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_DemoDbTests.java42
-rw-r--r--org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_ProductionDbTests.java43
-rw-r--r--org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_TestDbTests.java43
-rw-r--r--org.eclipse.osee.updatesite/.project17
-rw-r--r--org.eclipse.osee.updatesite/site.xml7
5353 files changed, 744465 insertions, 0 deletions
diff --git a/javax.mail.glassfish/.classpath b/javax.mail.glassfish/.classpath
new file mode 100644
index 00000000000..4cd3ce88aac
--- /dev/null
+++ b/javax.mail.glassfish/.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 exported="true" kind="lib" path=""/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/javax.mail.glassfish/.project b/javax.mail.glassfish/.project
new file mode 100644
index 00000000000..24eab6f6f80
--- /dev/null
+++ b/javax.mail.glassfish/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>javax.mail.glassfish</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/javax.mail.glassfish/.settings/org.eclipse.pde.core.prefs b/javax.mail.glassfish/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..3118ec9b60c
--- /dev/null
+++ b/javax.mail.glassfish/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Fri Aug 01 12:17:31 MST 2008
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/javax.mail.glassfish/META-INF/LICENSE.txt b/javax.mail.glassfish/META-INF/LICENSE.txt
new file mode 100644
index 00000000000..62e2ef54d80
--- /dev/null
+++ b/javax.mail.glassfish/META-INF/LICENSE.txt
@@ -0,0 +1,263 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+ 1.1. Contributor. means each individual or entity that creates or contributes to the creation of Modifications.
+
+ 1.2. Contributor Version. means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
+
+ 1.3. Covered Software. means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
+
+ 1.4. Executable. means the Covered Software in any form other than Source Code.
+
+ 1.5. Initial Developer. means the individual or entity that first makes Original Software available under this License.
+
+ 1.6. Larger Work. means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
+
+ 1.7. License. means this document.
+
+ 1.8. Licensable. means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. Modifications. means the Source Code and Executable form of any of the following:
+
+ A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
+
+ B. Any new file that contains any part of the Original Software or previous Modification; or
+
+ C. Any new file that is contributed or otherwise made available under the terms of this License.
+
+ 1.10. Original Software. means the Source Code and Executable form of computer software code that is originally released under this License.
+
+ 1.11. Patent Claims. means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+
+ 1.12. Source Code. means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
+
+ 1.13. You. (or .Your.) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, .You. includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, .control. means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+ 2.1. The Initial Developer Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
+
+ (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
+
+ 2.2. Contributor Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+
+ (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Availability of Source Code.
+ Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
+
+ 3.2. Modifications.
+ The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
+
+ 3.3. Required Notices.
+ You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
+
+ 3.4. Application of Additional Terms.
+ You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients. rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+
+ 3.5. Distribution of Executable Versions.
+ You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient.s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
+
+ 3.6. Larger Works.
+ You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+ 4.1. New Versions.
+ Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
+
+ 4.2. Effect of New Versions.
+ You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
+
+ 4.3. Modified Versions.
+ When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+ COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+ 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+
+ 6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as .Participant.) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
+
+ 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+ The Covered Software is a .commercial item,. as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as that term is defined at 48 C.F.R. º 252.227-7014(a)(1)) and .commercial computer software documentation. as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction.s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys. fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+
+ NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
+
+ The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
+
+
+The GNU General Public License (GPL) Version 2, June 1991
+
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+ One line to give the program's name and a brief idea of what it does.
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ signature of Ty Coon, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
+
+"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
+
+Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
+
+As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
diff --git a/javax.mail.glassfish/META-INF/MANIFEST.MF b/javax.mail.glassfish/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..a9fc97b30c0
--- /dev/null
+++ b/javax.mail.glassfish/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Java Mail Glassfish Plug-in
+Bundle-SymbolicName: javax.mail.glassfish
+Bundle-Version: 1.4.1.qualifier
+Bundle-Vendor: Glassfish
+Export-Package: com.sun.mail.handlers,
+ com.sun.mail.iap,
+ com.sun.mail.imap,
+ com.sun.mail.imap.protocol,
+ com.sun.mail.pop3,
+ com.sun.mail.smtp,
+ com.sun.mail.util,
+ javax.mail,
+ javax.mail.event,
+ javax.mail.internet,
+ javax.mail.search,
+ javax.mail.util
diff --git a/javax.mail.glassfish/META-INF/javamail.charset.map b/javax.mail.glassfish/META-INF/javamail.charset.map
new file mode 100644
index 00000000000..9a3fa0a8332
--- /dev/null
+++ b/javax.mail.glassfish/META-INF/javamail.charset.map
@@ -0,0 +1,67 @@
+### JDK-to-MIME charset mapping table ####
+### This should be the first mapping table ###
+
+8859_1 ISO-8859-1
+iso8859_1 ISO-8859-1
+ISO8859-1 ISO-8859-1
+
+8859_2 ISO-8859-2
+iso8859_2 ISO-8859-2
+ISO8859-2 ISO-8859-2
+
+8859_3 ISO-8859-3
+iso8859_3 ISO-8859-3
+ISO8859-3 ISO-8859-3
+
+8859_4 ISO-8859-4
+iso8859_4 ISO-8859-4
+ISO8859-4 ISO-8859-4
+
+8859_5 ISO-8859-5
+iso8859_5 ISO-8859-5
+ISO8859-5 ISO-8859-5
+
+8859_6 ISO-8859-6
+iso8859_6 ISO-8859-6
+ISO8859-6 ISO-8859-6
+
+8859_7 ISO-8859-7
+iso8859_7 ISO-8859-7
+ISO8859-7 ISO-8859-7
+
+8859_8 ISO-8859-8
+iso8859_8 ISO-8859-8
+ISO8859-8 ISO-8859-8
+
+8859_9 ISO-8859-9
+iso8859_9 ISO-8859-9
+ISO8859-9 ISO-8859-9
+
+SJIS Shift_JIS
+JIS ISO-2022-JP
+ISO2022JP ISO-2022-JP
+EUC_JP euc-jp
+KOI8_R koi8-r
+EUC_CN euc-cn
+EUC_TW euc-tw
+EUC_KR euc-kr
+
+--DIVIDER: this line *must* start with "--" and end with "--" --
+
+#### XXX-to-JDK charset mapping table ####
+
+iso-2022-cn ISO2022CN
+iso-2022-kr ISO2022KR
+utf-8 UTF8
+utf8 UTF8
+ja_jp.iso2022-7 ISO2022JP
+ja_jp.eucjp EUCJIS
+
+# these two are not needed in 1.1.6. (since EUC_KR exists
+# and KSC5601 will map to the correct converter)
+euc-kr KSC5601
+euckr KSC5601
+
+# in JDK 1.1.6 we will no longer need the "us-ascii" convert
+us-ascii ISO-8859-1
+x-us-ascii ISO-8859-1
diff --git a/javax.mail.glassfish/META-INF/javamail.default.address.map b/javax.mail.glassfish/META-INF/javamail.default.address.map
new file mode 100644
index 00000000000..437e6b1e2e9
--- /dev/null
+++ b/javax.mail.glassfish/META-INF/javamail.default.address.map
@@ -0,0 +1 @@
+rfc822=smtp
diff --git a/javax.mail.glassfish/META-INF/javamail.default.providers b/javax.mail.glassfish/META-INF/javamail.default.providers
new file mode 100644
index 00000000000..93d56c10ca4
--- /dev/null
+++ b/javax.mail.glassfish/META-INF/javamail.default.providers
@@ -0,0 +1,9 @@
+# JavaMail IMAP provider Sun Microsystems, Inc
+protocol=imap; type=store; class=com.sun.mail.imap.IMAPStore; vendor=Sun Microsystems, Inc;
+protocol=imaps; type=store; class=com.sun.mail.imap.IMAPSSLStore; vendor=Sun Microsystems, Inc;
+# JavaMail SMTP provider Sun Microsystems, Inc
+protocol=smtp; type=transport; class=com.sun.mail.smtp.SMTPTransport; vendor=Sun Microsystems, Inc;
+protocol=smtps; type=transport; class=com.sun.mail.smtp.SMTPSSLTransport; vendor=Sun Microsystems, Inc;
+# JavaMail POP3 provider Sun Microsystems, Inc
+protocol=pop3; type=store; class=com.sun.mail.pop3.POP3Store; vendor=Sun Microsystems, Inc;
+protocol=pop3s; type=store; class=com.sun.mail.pop3.POP3SSLStore; vendor=Sun Microsystems, Inc;
diff --git a/javax.mail.glassfish/META-INF/mailcap b/javax.mail.glassfish/META-INF/mailcap
new file mode 100644
index 00000000000..5c88ddc5073
--- /dev/null
+++ b/javax.mail.glassfish/META-INF/mailcap
@@ -0,0 +1,17 @@
+#
+# @(#)mailcap 1.8 05/04/20
+#
+# Default mailcap file for the JavaMail System.
+#
+# JavaMail content-handlers:
+#
+text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain
+text/html;; x-java-content-handler=com.sun.mail.handlers.text_html
+text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml
+multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true
+message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822
+#
+# can't support image types because java.awt.Toolkit doesn't work on servers
+#
+#image/gif;; x-java-content-handler=com.sun.mail.handlers.image_gif
+#image/jpeg;; x-java-content-handler=com.sun.mail.handlers.image_jpeg
diff --git a/javax.mail.glassfish/build.properties b/javax.mail.glassfish/build.properties
new file mode 100644
index 00000000000..ba0f7868fc1
--- /dev/null
+++ b/javax.mail.glassfish/build.properties
@@ -0,0 +1,5 @@
+source.. = .
+output.. = .
+bin.includes = META-INF/,\
+ com/,\
+ javax/
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/image_gif.class b/javax.mail.glassfish/com/sun/mail/handlers/image_gif.class
new file mode 100644
index 00000000000..105811e9f0d
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/image_gif.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/image_jpeg.class b/javax.mail.glassfish/com/sun/mail/handlers/image_jpeg.class
new file mode 100644
index 00000000000..ad94ce4e865
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/image_jpeg.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/message_rfc822.class b/javax.mail.glassfish/com/sun/mail/handlers/message_rfc822.class
new file mode 100644
index 00000000000..cb5be4a5526
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/message_rfc822.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/multipart_mixed.class b/javax.mail.glassfish/com/sun/mail/handlers/multipart_mixed.class
new file mode 100644
index 00000000000..5570a58cc49
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/multipart_mixed.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/text_html.class b/javax.mail.glassfish/com/sun/mail/handlers/text_html.class
new file mode 100644
index 00000000000..b0793b28528
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/text_html.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/text_plain.class b/javax.mail.glassfish/com/sun/mail/handlers/text_plain.class
new file mode 100644
index 00000000000..d11bc43a792
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/text_plain.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/handlers/text_xml.class b/javax.mail.glassfish/com/sun/mail/handlers/text_xml.class
new file mode 100644
index 00000000000..925f56b44ad
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/handlers/text_xml.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/AString.class b/javax.mail.glassfish/com/sun/mail/iap/AString.class
new file mode 100644
index 00000000000..3e005d6f193
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/AString.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/Argument.class b/javax.mail.glassfish/com/sun/mail/iap/Argument.class
new file mode 100644
index 00000000000..7dccc334b6f
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/Argument.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/Atom.class b/javax.mail.glassfish/com/sun/mail/iap/Atom.class
new file mode 100644
index 00000000000..71af498ed71
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/Atom.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/BadCommandException.class b/javax.mail.glassfish/com/sun/mail/iap/BadCommandException.class
new file mode 100644
index 00000000000..3f8c6acd1d6
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/BadCommandException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/ByteArray.class b/javax.mail.glassfish/com/sun/mail/iap/ByteArray.class
new file mode 100644
index 00000000000..5b809068454
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/ByteArray.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/CommandFailedException.class b/javax.mail.glassfish/com/sun/mail/iap/CommandFailedException.class
new file mode 100644
index 00000000000..c91c4e9edea
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/CommandFailedException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/ConnectionException.class b/javax.mail.glassfish/com/sun/mail/iap/ConnectionException.class
new file mode 100644
index 00000000000..06bcc55d194
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/ConnectionException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/Literal.class b/javax.mail.glassfish/com/sun/mail/iap/Literal.class
new file mode 100644
index 00000000000..f569e317978
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/Literal.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/LiteralException.class b/javax.mail.glassfish/com/sun/mail/iap/LiteralException.class
new file mode 100644
index 00000000000..0f04ae7bbdd
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/LiteralException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/ParsingException.class b/javax.mail.glassfish/com/sun/mail/iap/ParsingException.class
new file mode 100644
index 00000000000..a77f492eeb7
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/ParsingException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/Protocol.class b/javax.mail.glassfish/com/sun/mail/iap/Protocol.class
new file mode 100644
index 00000000000..fec07baac9f
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/Protocol.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/ProtocolException.class b/javax.mail.glassfish/com/sun/mail/iap/ProtocolException.class
new file mode 100644
index 00000000000..8366a2d7c05
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/ProtocolException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/Response.class b/javax.mail.glassfish/com/sun/mail/iap/Response.class
new file mode 100644
index 00000000000..c0efc253cb7
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/Response.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/ResponseHandler.class b/javax.mail.glassfish/com/sun/mail/iap/ResponseHandler.class
new file mode 100644
index 00000000000..c0f7143e271
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/ResponseHandler.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/iap/ResponseInputStream.class b/javax.mail.glassfish/com/sun/mail/iap/ResponseInputStream.class
new file mode 100644
index 00000000000..2bab689ee77
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/iap/ResponseInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/ACL.class b/javax.mail.glassfish/com/sun/mail/imap/ACL.class
new file mode 100644
index 00000000000..f9a79789ea1
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/ACL.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/AppendUID.class b/javax.mail.glassfish/com/sun/mail/imap/AppendUID.class
new file mode 100644
index 00000000000..e9dfb6fa8db
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/AppendUID.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$1.class b/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$1.class
new file mode 100644
index 00000000000..86366933e34
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$1.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$2.class b/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$2.class
new file mode 100644
index 00000000000..dab23bbb12f
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder$2.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder.class b/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder.class
new file mode 100644
index 00000000000..2564579bebd
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/DefaultFolder.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPBodyPart.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPBodyPart.class
new file mode 100644
index 00000000000..29f92ab44c4
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPBodyPart.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$1.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$1.class
new file mode 100644
index 00000000000..2a7d803dbe7
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$1.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$10.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$10.class
new file mode 100644
index 00000000000..40a91443a4b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$10.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$11.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$11.class
new file mode 100644
index 00000000000..f36a65224ff
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$11.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$12.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$12.class
new file mode 100644
index 00000000000..580e7af4566
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$12.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$13.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$13.class
new file mode 100644
index 00000000000..b0bf488f28c
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$13.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$14.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$14.class
new file mode 100644
index 00000000000..f3ddb6ec705
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$14.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$15.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$15.class
new file mode 100644
index 00000000000..8bdc399f455
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$15.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$16.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$16.class
new file mode 100644
index 00000000000..70fdbf53550
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$16.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$17.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$17.class
new file mode 100644
index 00000000000..da9e9874cef
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$17.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$18.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$18.class
new file mode 100644
index 00000000000..5b4fc2cc973
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$18.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$19.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$19.class
new file mode 100644
index 00000000000..3dbd2957abf
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$19.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$2.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$2.class
new file mode 100644
index 00000000000..016b8150d49
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$2.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$3.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$3.class
new file mode 100644
index 00000000000..8932e76c30c
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$3.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$4.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$4.class
new file mode 100644
index 00000000000..0624c27ad2d
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$4.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$5.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$5.class
new file mode 100644
index 00000000000..72406ffd268
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$5.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$6.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$6.class
new file mode 100644
index 00000000000..f3a2c1bc0a5
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$6.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$7.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$7.class
new file mode 100644
index 00000000000..6cb82cca1a0
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$7.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$8.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$8.class
new file mode 100644
index 00000000000..4c22245fd3b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$8.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$9.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$9.class
new file mode 100644
index 00000000000..79240216f0f
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$9.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$FetchProfileItem.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$FetchProfileItem.class
new file mode 100644
index 00000000000..d2ba71fc39d
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$FetchProfileItem.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$ProtocolCommand.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$ProtocolCommand.class
new file mode 100644
index 00000000000..0cfe8df685b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder$ProtocolCommand.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder.class
new file mode 100644
index 00000000000..5157a8023e5
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPFolder.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPInputStream.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPInputStream.class
new file mode 100644
index 00000000000..3331741f598
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPMessage$1FetchProfileCondition.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPMessage$1FetchProfileCondition.class
new file mode 100644
index 00000000000..647ccd37cd4
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPMessage$1FetchProfileCondition.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPMessage.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPMessage.class
new file mode 100644
index 00000000000..198f65893c8
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPMessage.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPMultipartDataSource.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPMultipartDataSource.class
new file mode 100644
index 00000000000..d4123f0af05
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPMultipartDataSource.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPNestedMessage.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPNestedMessage.class
new file mode 100644
index 00000000000..06ff11f7b0c
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPNestedMessage.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPSSLStore.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPSSLStore.class
new file mode 100644
index 00000000000..950ed1ba2bb
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPSSLStore.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPStore$ConnectionPool.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPStore$ConnectionPool.class
new file mode 100644
index 00000000000..4ff63b73adb
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPStore$ConnectionPool.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/IMAPStore.class b/javax.mail.glassfish/com/sun/mail/imap/IMAPStore.class
new file mode 100644
index 00000000000..45b3fa94a98
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/IMAPStore.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/LengthCounter.class b/javax.mail.glassfish/com/sun/mail/imap/LengthCounter.class
new file mode 100644
index 00000000000..eb18956a39d
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/LengthCounter.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/MessageLiteral.class b/javax.mail.glassfish/com/sun/mail/imap/MessageLiteral.class
new file mode 100644
index 00000000000..b874698a0db
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/MessageLiteral.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/Rights$Right.class b/javax.mail.glassfish/com/sun/mail/imap/Rights$Right.class
new file mode 100644
index 00000000000..dc979cd3d51
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/Rights$Right.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/Rights.class b/javax.mail.glassfish/com/sun/mail/imap/Rights.class
new file mode 100644
index 00000000000..61d9133d1b2
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/Rights.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/Utility$Condition.class b/javax.mail.glassfish/com/sun/mail/imap/Utility$Condition.class
new file mode 100644
index 00000000000..d874df26bc4
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/Utility$Condition.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/Utility.class b/javax.mail.glassfish/com/sun/mail/imap/Utility.class
new file mode 100644
index 00000000000..480946ba846
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/Utility.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxDecoder.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxDecoder.class
new file mode 100644
index 00000000000..d904404cdeb
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxDecoder.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxEncoder.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxEncoder.class
new file mode 100644
index 00000000000..ece4a12b3df
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/BASE64MailboxEncoder.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/BODY.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/BODY.class
new file mode 100644
index 00000000000..d68f20d9b57
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/BODY.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/BODYSTRUCTURE.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/BODYSTRUCTURE.class
new file mode 100644
index 00000000000..6494a3bbfb4
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/BODYSTRUCTURE.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/ENVELOPE.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/ENVELOPE.class
new file mode 100644
index 00000000000..66cccc48184
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/ENVELOPE.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/FLAGS.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/FLAGS.class
new file mode 100644
index 00000000000..642f14190ff
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/FLAGS.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/FetchResponse.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/FetchResponse.class
new file mode 100644
index 00000000000..b3d80ed6a39
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/FetchResponse.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPAddress.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPAddress.class
new file mode 100644
index 00000000000..e0c670a891a
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPAddress.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPProtocol.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPProtocol.class
new file mode 100644
index 00000000000..4123db569f2
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPProtocol.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPResponse.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPResponse.class
new file mode 100644
index 00000000000..a64ece86172
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPResponse.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator$1.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator$1.class
new file mode 100644
index 00000000000..05ba9166a9e
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator$1.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator.class
new file mode 100644
index 00000000000..0ee84aa13ba
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/IMAPSaslAuthenticator.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/INTERNALDATE.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/INTERNALDATE.class
new file mode 100644
index 00000000000..f4ac9ca0fe2
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/INTERNALDATE.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/Item.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/Item.class
new file mode 100644
index 00000000000..0e837767d6b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/Item.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/ListInfo.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/ListInfo.class
new file mode 100644
index 00000000000..e0dc821d0f6
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/ListInfo.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/MailboxInfo.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/MailboxInfo.class
new file mode 100644
index 00000000000..d7dbc232fe4
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/MailboxInfo.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/MessageSet.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/MessageSet.class
new file mode 100644
index 00000000000..31c7bfd21f6
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/MessageSet.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces$Namespace.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces$Namespace.class
new file mode 100644
index 00000000000..26870ff2cd8
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces$Namespace.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces.class
new file mode 100644
index 00000000000..a4a84928515
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/Namespaces.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822DATA.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822DATA.class
new file mode 100644
index 00000000000..a87affe8cde
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822DATA.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822SIZE.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822SIZE.class
new file mode 100644
index 00000000000..2beae0fff70
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/RFC822SIZE.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/SaslAuthenticator.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/SaslAuthenticator.class
new file mode 100644
index 00000000000..3a0f63ed4d1
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/SaslAuthenticator.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/SearchSequence.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/SearchSequence.class
new file mode 100644
index 00000000000..95329c6b284
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/SearchSequence.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/Status.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/Status.class
new file mode 100644
index 00000000000..144b587b690
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/Status.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/UID.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/UID.class
new file mode 100644
index 00000000000..91163e61eb9
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/UID.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/imap/protocol/UIDSet.class b/javax.mail.glassfish/com/sun/mail/imap/protocol/UIDSet.class
new file mode 100644
index 00000000000..06c34b5a6e0
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/imap/protocol/UIDSet.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/DefaultFolder.class b/javax.mail.glassfish/com/sun/mail/pop3/DefaultFolder.class
new file mode 100644
index 00000000000..bec46e51e4c
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/DefaultFolder.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/POP3Folder.class b/javax.mail.glassfish/com/sun/mail/pop3/POP3Folder.class
new file mode 100644
index 00000000000..c12f6294e1a
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/POP3Folder.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/POP3Message.class b/javax.mail.glassfish/com/sun/mail/pop3/POP3Message.class
new file mode 100644
index 00000000000..5d1abcefdd2
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/POP3Message.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/POP3SSLStore.class b/javax.mail.glassfish/com/sun/mail/pop3/POP3SSLStore.class
new file mode 100644
index 00000000000..b6e48810c3b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/POP3SSLStore.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/POP3Store.class b/javax.mail.glassfish/com/sun/mail/pop3/POP3Store.class
new file mode 100644
index 00000000000..1e00257d120
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/POP3Store.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/Protocol.class b/javax.mail.glassfish/com/sun/mail/pop3/Protocol.class
new file mode 100644
index 00000000000..fe07cb2bc35
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/Protocol.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/Response.class b/javax.mail.glassfish/com/sun/mail/pop3/Response.class
new file mode 100644
index 00000000000..ac3bc6d41cf
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/Response.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/SharedByteArrayOutputStream.class b/javax.mail.glassfish/com/sun/mail/pop3/SharedByteArrayOutputStream.class
new file mode 100644
index 00000000000..14b5f9716bb
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/SharedByteArrayOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/pop3/Status.class b/javax.mail.glassfish/com/sun/mail/pop3/Status.class
new file mode 100644
index 00000000000..1b860a1da04
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/pop3/Status.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/DigestMD5.class b/javax.mail.glassfish/com/sun/mail/smtp/DigestMD5.class
new file mode 100644
index 00000000000..68f057c6532
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/DigestMD5.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressFailedException.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressFailedException.class
new file mode 100644
index 00000000000..e3741decc0e
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressFailedException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressSucceededException.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressSucceededException.class
new file mode 100644
index 00000000000..58dac359d25
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPAddressSucceededException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPMessage.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPMessage.class
new file mode 100644
index 00000000000..a7563cb6c3d
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPMessage.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPOutputStream.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPOutputStream.class
new file mode 100644
index 00000000000..3ee29c75152
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPSSLTransport.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPSSLTransport.class
new file mode 100644
index 00000000000..7b9acfd1313
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPSSLTransport.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPSendFailedException.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPSendFailedException.class
new file mode 100644
index 00000000000..bd7ca9a2069
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPSendFailedException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/smtp/SMTPTransport.class b/javax.mail.glassfish/com/sun/mail/smtp/SMTPTransport.class
new file mode 100644
index 00000000000..0fc0e47d289
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/smtp/SMTPTransport.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/ASCIIUtility.class b/javax.mail.glassfish/com/sun/mail/util/ASCIIUtility.class
new file mode 100644
index 00000000000..8edebfb5666
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/ASCIIUtility.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/BASE64DecoderStream.class b/javax.mail.glassfish/com/sun/mail/util/BASE64DecoderStream.class
new file mode 100644
index 00000000000..752c4db0a1c
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/BASE64DecoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/BASE64EncoderStream.class b/javax.mail.glassfish/com/sun/mail/util/BASE64EncoderStream.class
new file mode 100644
index 00000000000..4e9a57d14f5
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/BASE64EncoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/BEncoderStream.class b/javax.mail.glassfish/com/sun/mail/util/BEncoderStream.class
new file mode 100644
index 00000000000..c1c7c5be0ee
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/BEncoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/CRLFOutputStream.class b/javax.mail.glassfish/com/sun/mail/util/CRLFOutputStream.class
new file mode 100644
index 00000000000..c47f15e87c8
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/CRLFOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/FolderClosedIOException.class b/javax.mail.glassfish/com/sun/mail/util/FolderClosedIOException.class
new file mode 100644
index 00000000000..568a02d42c3
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/FolderClosedIOException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/LineInputStream.class b/javax.mail.glassfish/com/sun/mail/util/LineInputStream.class
new file mode 100644
index 00000000000..6c6ad4b713e
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/LineInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/LineOutputStream.class b/javax.mail.glassfish/com/sun/mail/util/LineOutputStream.class
new file mode 100644
index 00000000000..9ab8947fd93
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/LineOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/MessageRemovedIOException.class b/javax.mail.glassfish/com/sun/mail/util/MessageRemovedIOException.class
new file mode 100644
index 00000000000..bdd8cf1e35b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/MessageRemovedIOException.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/QDecoderStream.class b/javax.mail.glassfish/com/sun/mail/util/QDecoderStream.class
new file mode 100644
index 00000000000..d8ec38f68a6
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/QDecoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/QEncoderStream.class b/javax.mail.glassfish/com/sun/mail/util/QEncoderStream.class
new file mode 100644
index 00000000000..ce25308a0cd
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/QEncoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/QPDecoderStream.class b/javax.mail.glassfish/com/sun/mail/util/QPDecoderStream.class
new file mode 100644
index 00000000000..0b53bdae4d8
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/QPDecoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/QPEncoderStream.class b/javax.mail.glassfish/com/sun/mail/util/QPEncoderStream.class
new file mode 100644
index 00000000000..f2a58c77270
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/QPEncoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/SocketFetcher$1.class b/javax.mail.glassfish/com/sun/mail/util/SocketFetcher$1.class
new file mode 100644
index 00000000000..112abe3e51b
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/SocketFetcher$1.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/SocketFetcher.class b/javax.mail.glassfish/com/sun/mail/util/SocketFetcher.class
new file mode 100644
index 00000000000..d80d1875665
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/SocketFetcher.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/TraceInputStream.class b/javax.mail.glassfish/com/sun/mail/util/TraceInputStream.class
new file mode 100644
index 00000000000..9237d2d1a43
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/TraceInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/TraceOutputStream.class b/javax.mail.glassfish/com/sun/mail/util/TraceOutputStream.class
new file mode 100644
index 00000000000..bbef22cd49c
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/TraceOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/UUDecoderStream.class b/javax.mail.glassfish/com/sun/mail/util/UUDecoderStream.class
new file mode 100644
index 00000000000..cac0eaf55f5
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/UUDecoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/com/sun/mail/util/UUEncoderStream.class b/javax.mail.glassfish/com/sun/mail/util/UUEncoderStream.class
new file mode 100644
index 00000000000..7a056f81a31
--- /dev/null
+++ b/javax.mail.glassfish/com/sun/mail/util/UUEncoderStream.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Address.class b/javax.mail.glassfish/javax/mail/Address.class
new file mode 100644
index 00000000000..50f34e9c3bd
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Address.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/AuthenticationFailedException.class b/javax.mail.glassfish/javax/mail/AuthenticationFailedException.class
new file mode 100644
index 00000000000..6fa61d62aa7
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/AuthenticationFailedException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Authenticator.class b/javax.mail.glassfish/javax/mail/Authenticator.class
new file mode 100644
index 00000000000..3fb97d80446
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Authenticator.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/BodyPart.class b/javax.mail.glassfish/javax/mail/BodyPart.class
new file mode 100644
index 00000000000..ff4260681bb
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/BodyPart.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/EventQueue$QueueElement.class b/javax.mail.glassfish/javax/mail/EventQueue$QueueElement.class
new file mode 100644
index 00000000000..156a5e864ea
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/EventQueue$QueueElement.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/EventQueue.class b/javax.mail.glassfish/javax/mail/EventQueue.class
new file mode 100644
index 00000000000..ef5c072aeb4
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/EventQueue.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/FetchProfile$Item.class b/javax.mail.glassfish/javax/mail/FetchProfile$Item.class
new file mode 100644
index 00000000000..02db6c0c82c
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/FetchProfile$Item.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/FetchProfile.class b/javax.mail.glassfish/javax/mail/FetchProfile.class
new file mode 100644
index 00000000000..4162578b839
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/FetchProfile.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Flags$Flag.class b/javax.mail.glassfish/javax/mail/Flags$Flag.class
new file mode 100644
index 00000000000..7a559d1e647
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Flags$Flag.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Flags.class b/javax.mail.glassfish/javax/mail/Flags.class
new file mode 100644
index 00000000000..194a2326f98
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Flags.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Folder$TerminatorEvent.class b/javax.mail.glassfish/javax/mail/Folder$TerminatorEvent.class
new file mode 100644
index 00000000000..ec102be05da
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Folder$TerminatorEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Folder.class b/javax.mail.glassfish/javax/mail/Folder.class
new file mode 100644
index 00000000000..5de994be692
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Folder.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/FolderClosedException.class b/javax.mail.glassfish/javax/mail/FolderClosedException.class
new file mode 100644
index 00000000000..87a2ef6049d
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/FolderClosedException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/FolderNotFoundException.class b/javax.mail.glassfish/javax/mail/FolderNotFoundException.class
new file mode 100644
index 00000000000..019120deb25
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/FolderNotFoundException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Header.class b/javax.mail.glassfish/javax/mail/Header.class
new file mode 100644
index 00000000000..0af3806df49
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Header.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/IllegalWriteException.class b/javax.mail.glassfish/javax/mail/IllegalWriteException.class
new file mode 100644
index 00000000000..39108a366cc
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/IllegalWriteException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Message$RecipientType.class b/javax.mail.glassfish/javax/mail/Message$RecipientType.class
new file mode 100644
index 00000000000..0a13fee7a7c
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Message$RecipientType.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Message.class b/javax.mail.glassfish/javax/mail/Message.class
new file mode 100644
index 00000000000..cd34063b607
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Message.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/MessageAware.class b/javax.mail.glassfish/javax/mail/MessageAware.class
new file mode 100644
index 00000000000..39f07e49688
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/MessageAware.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/MessageContext.class b/javax.mail.glassfish/javax/mail/MessageContext.class
new file mode 100644
index 00000000000..679f11fc80d
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/MessageContext.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/MessageRemovedException.class b/javax.mail.glassfish/javax/mail/MessageRemovedException.class
new file mode 100644
index 00000000000..7f16209d323
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/MessageRemovedException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/MessagingException.class b/javax.mail.glassfish/javax/mail/MessagingException.class
new file mode 100644
index 00000000000..0a2d3a157ec
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/MessagingException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/MethodNotSupportedException.class b/javax.mail.glassfish/javax/mail/MethodNotSupportedException.class
new file mode 100644
index 00000000000..8c465d4361c
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/MethodNotSupportedException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Multipart.class b/javax.mail.glassfish/javax/mail/Multipart.class
new file mode 100644
index 00000000000..3b7d6fdcc13
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Multipart.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/MultipartDataSource.class b/javax.mail.glassfish/javax/mail/MultipartDataSource.class
new file mode 100644
index 00000000000..098ca0bd12d
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/MultipartDataSource.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/NoSuchProviderException.class b/javax.mail.glassfish/javax/mail/NoSuchProviderException.class
new file mode 100644
index 00000000000..c61b49808e7
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/NoSuchProviderException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Part.class b/javax.mail.glassfish/javax/mail/Part.class
new file mode 100644
index 00000000000..4ecd868319d
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Part.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/PasswordAuthentication.class b/javax.mail.glassfish/javax/mail/PasswordAuthentication.class
new file mode 100644
index 00000000000..4eab3f557f6
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/PasswordAuthentication.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Provider$Type.class b/javax.mail.glassfish/javax/mail/Provider$Type.class
new file mode 100644
index 00000000000..e09f5cdd5fd
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Provider$Type.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Provider.class b/javax.mail.glassfish/javax/mail/Provider.class
new file mode 100644
index 00000000000..e0539fd91c9
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Provider.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Quota$Resource.class b/javax.mail.glassfish/javax/mail/Quota$Resource.class
new file mode 100644
index 00000000000..ff26e6e78f3
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Quota$Resource.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Quota.class b/javax.mail.glassfish/javax/mail/Quota.class
new file mode 100644
index 00000000000..a63fc6992bd
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Quota.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/QuotaAwareStore.class b/javax.mail.glassfish/javax/mail/QuotaAwareStore.class
new file mode 100644
index 00000000000..0df9723d9c8
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/QuotaAwareStore.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/ReadOnlyFolderException.class b/javax.mail.glassfish/javax/mail/ReadOnlyFolderException.class
new file mode 100644
index 00000000000..16ef9e09608
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/ReadOnlyFolderException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/SendFailedException.class b/javax.mail.glassfish/javax/mail/SendFailedException.class
new file mode 100644
index 00000000000..f49adb4c041
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/SendFailedException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Service$TerminatorEvent.class b/javax.mail.glassfish/javax/mail/Service$TerminatorEvent.class
new file mode 100644
index 00000000000..7f8ca826137
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Service$TerminatorEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Service.class b/javax.mail.glassfish/javax/mail/Service.class
new file mode 100644
index 00000000000..d75771858bf
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Service.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$1.class b/javax.mail.glassfish/javax/mail/Session$1.class
new file mode 100644
index 00000000000..68c31ff2d4b
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$1.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$2.class b/javax.mail.glassfish/javax/mail/Session$2.class
new file mode 100644
index 00000000000..2c3aab81440
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$2.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$3.class b/javax.mail.glassfish/javax/mail/Session$3.class
new file mode 100644
index 00000000000..5edf81202bb
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$3.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$4.class b/javax.mail.glassfish/javax/mail/Session$4.class
new file mode 100644
index 00000000000..749f82319ed
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$4.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$5.class b/javax.mail.glassfish/javax/mail/Session$5.class
new file mode 100644
index 00000000000..645d0966b06
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$5.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$6.class b/javax.mail.glassfish/javax/mail/Session$6.class
new file mode 100644
index 00000000000..2e2a655f27a
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$6.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session$7.class b/javax.mail.glassfish/javax/mail/Session$7.class
new file mode 100644
index 00000000000..b1a383e762b
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session$7.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Session.class b/javax.mail.glassfish/javax/mail/Session.class
new file mode 100644
index 00000000000..44252e35370
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Session.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Store.class b/javax.mail.glassfish/javax/mail/Store.class
new file mode 100644
index 00000000000..9f6935f7014
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Store.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/StoreClosedException.class b/javax.mail.glassfish/javax/mail/StoreClosedException.class
new file mode 100644
index 00000000000..b8ce2cf5fa2
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/StoreClosedException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/StreamLoader.class b/javax.mail.glassfish/javax/mail/StreamLoader.class
new file mode 100644
index 00000000000..68db9d02aa1
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/StreamLoader.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Transport.class b/javax.mail.glassfish/javax/mail/Transport.class
new file mode 100644
index 00000000000..6d43949519a
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Transport.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/UIDFolder$FetchProfileItem.class b/javax.mail.glassfish/javax/mail/UIDFolder$FetchProfileItem.class
new file mode 100644
index 00000000000..d72546bd0f2
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/UIDFolder$FetchProfileItem.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/UIDFolder.class b/javax.mail.glassfish/javax/mail/UIDFolder.class
new file mode 100644
index 00000000000..d87427a3330
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/UIDFolder.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/URLName.class b/javax.mail.glassfish/javax/mail/URLName.class
new file mode 100644
index 00000000000..15bfdbfb28f
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/URLName.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/Version.class b/javax.mail.glassfish/javax/mail/Version.class
new file mode 100644
index 00000000000..15d33424943
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/Version.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/ConnectionAdapter.class b/javax.mail.glassfish/javax/mail/event/ConnectionAdapter.class
new file mode 100644
index 00000000000..86c2d552dd7
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/ConnectionAdapter.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/ConnectionEvent.class b/javax.mail.glassfish/javax/mail/event/ConnectionEvent.class
new file mode 100644
index 00000000000..f1b4377623d
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/ConnectionEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/ConnectionListener.class b/javax.mail.glassfish/javax/mail/event/ConnectionListener.class
new file mode 100644
index 00000000000..e41c67fe530
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/ConnectionListener.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/FolderAdapter.class b/javax.mail.glassfish/javax/mail/event/FolderAdapter.class
new file mode 100644
index 00000000000..3e54eb869f8
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/FolderAdapter.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/FolderEvent.class b/javax.mail.glassfish/javax/mail/event/FolderEvent.class
new file mode 100644
index 00000000000..40e6be42ae8
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/FolderEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/FolderListener.class b/javax.mail.glassfish/javax/mail/event/FolderListener.class
new file mode 100644
index 00000000000..2ac43c5dd4e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/FolderListener.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/MailEvent.class b/javax.mail.glassfish/javax/mail/event/MailEvent.class
new file mode 100644
index 00000000000..160eb9624df
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/MailEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/MessageChangedEvent.class b/javax.mail.glassfish/javax/mail/event/MessageChangedEvent.class
new file mode 100644
index 00000000000..957ed732750
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/MessageChangedEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/MessageChangedListener.class b/javax.mail.glassfish/javax/mail/event/MessageChangedListener.class
new file mode 100644
index 00000000000..7a800fdd63e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/MessageChangedListener.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/MessageCountAdapter.class b/javax.mail.glassfish/javax/mail/event/MessageCountAdapter.class
new file mode 100644
index 00000000000..258e8c2facd
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/MessageCountAdapter.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/MessageCountEvent.class b/javax.mail.glassfish/javax/mail/event/MessageCountEvent.class
new file mode 100644
index 00000000000..4076d3fa46e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/MessageCountEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/MessageCountListener.class b/javax.mail.glassfish/javax/mail/event/MessageCountListener.class
new file mode 100644
index 00000000000..014fa2e8280
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/MessageCountListener.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/StoreEvent.class b/javax.mail.glassfish/javax/mail/event/StoreEvent.class
new file mode 100644
index 00000000000..b931850dc6a
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/StoreEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/StoreListener.class b/javax.mail.glassfish/javax/mail/event/StoreListener.class
new file mode 100644
index 00000000000..898196271a9
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/StoreListener.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/TransportAdapter.class b/javax.mail.glassfish/javax/mail/event/TransportAdapter.class
new file mode 100644
index 00000000000..d547e18da27
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/TransportAdapter.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/TransportEvent.class b/javax.mail.glassfish/javax/mail/event/TransportEvent.class
new file mode 100644
index 00000000000..0ebdb891da4
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/TransportEvent.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/event/TransportListener.class b/javax.mail.glassfish/javax/mail/event/TransportListener.class
new file mode 100644
index 00000000000..eab0fdfb156
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/event/TransportListener.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/AddressException.class b/javax.mail.glassfish/javax/mail/internet/AddressException.class
new file mode 100644
index 00000000000..eb5de30ec9b
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/AddressException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/AsciiOutputStream.class b/javax.mail.glassfish/javax/mail/internet/AsciiOutputStream.class
new file mode 100644
index 00000000000..e65f5d338a2
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/AsciiOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ContentDisposition.class b/javax.mail.glassfish/javax/mail/internet/ContentDisposition.class
new file mode 100644
index 00000000000..b506c8772e5
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ContentDisposition.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ContentType.class b/javax.mail.glassfish/javax/mail/internet/ContentType.class
new file mode 100644
index 00000000000..263965e4038
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ContentType.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/HeaderTokenizer$Token.class b/javax.mail.glassfish/javax/mail/internet/HeaderTokenizer$Token.class
new file mode 100644
index 00000000000..67d30ad94c8
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/HeaderTokenizer$Token.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/HeaderTokenizer.class b/javax.mail.glassfish/javax/mail/internet/HeaderTokenizer.class
new file mode 100644
index 00000000000..3c41543150c
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/HeaderTokenizer.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/InternetAddress.class b/javax.mail.glassfish/javax/mail/internet/InternetAddress.class
new file mode 100644
index 00000000000..fa8de8ec297
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/InternetAddress.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/InternetHeaders$InternetHeader.class b/javax.mail.glassfish/javax/mail/internet/InternetHeaders$InternetHeader.class
new file mode 100644
index 00000000000..b46001989c2
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/InternetHeaders$InternetHeader.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/InternetHeaders$matchEnum.class b/javax.mail.glassfish/javax/mail/internet/InternetHeaders$matchEnum.class
new file mode 100644
index 00000000000..5f8dfd39475
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/InternetHeaders$matchEnum.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/InternetHeaders.class b/javax.mail.glassfish/javax/mail/internet/InternetHeaders.class
new file mode 100644
index 00000000000..c90378f7cf1
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/InternetHeaders.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MailDateFormat.class b/javax.mail.glassfish/javax/mail/internet/MailDateFormat.class
new file mode 100644
index 00000000000..b238f8ef892
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MailDateFormat.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MailDateParser.class b/javax.mail.glassfish/javax/mail/internet/MailDateParser.class
new file mode 100644
index 00000000000..faeb62b9093
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MailDateParser.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimeBodyPart.class b/javax.mail.glassfish/javax/mail/internet/MimeBodyPart.class
new file mode 100644
index 00000000000..b0b883e5f7a
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimeBodyPart.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimeMessage$RecipientType.class b/javax.mail.glassfish/javax/mail/internet/MimeMessage$RecipientType.class
new file mode 100644
index 00000000000..37adb8198e3
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimeMessage$RecipientType.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimeMessage.class b/javax.mail.glassfish/javax/mail/internet/MimeMessage.class
new file mode 100644
index 00000000000..28bf759bbfb
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimeMessage.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimeMultipart.class b/javax.mail.glassfish/javax/mail/internet/MimeMultipart.class
new file mode 100644
index 00000000000..efa209d9a46
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimeMultipart.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimePart.class b/javax.mail.glassfish/javax/mail/internet/MimePart.class
new file mode 100644
index 00000000000..7b663873eac
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimePart.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimePartDataSource.class b/javax.mail.glassfish/javax/mail/internet/MimePartDataSource.class
new file mode 100644
index 00000000000..106e3fa8536
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimePartDataSource.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimeUtility$1NullInputStream.class b/javax.mail.glassfish/javax/mail/internet/MimeUtility$1NullInputStream.class
new file mode 100644
index 00000000000..462ef148630
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimeUtility$1NullInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/MimeUtility.class b/javax.mail.glassfish/javax/mail/internet/MimeUtility.class
new file mode 100644
index 00000000000..0e4d9cbe39e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/MimeUtility.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/NewsAddress.class b/javax.mail.glassfish/javax/mail/internet/NewsAddress.class
new file mode 100644
index 00000000000..bf4e97e2945
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/NewsAddress.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParameterList$1.class b/javax.mail.glassfish/javax/mail/internet/ParameterList$1.class
new file mode 100644
index 00000000000..62cabb254db
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParameterList$1.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParameterList$MultiValue.class b/javax.mail.glassfish/javax/mail/internet/ParameterList$MultiValue.class
new file mode 100644
index 00000000000..08e9d47c2ad
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParameterList$MultiValue.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParameterList$ParamEnum.class b/javax.mail.glassfish/javax/mail/internet/ParameterList$ParamEnum.class
new file mode 100644
index 00000000000..2f96a912ac2
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParameterList$ParamEnum.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParameterList$ToStringBuffer.class b/javax.mail.glassfish/javax/mail/internet/ParameterList$ToStringBuffer.class
new file mode 100644
index 00000000000..0e6db0cf075
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParameterList$ToStringBuffer.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParameterList$Value.class b/javax.mail.glassfish/javax/mail/internet/ParameterList$Value.class
new file mode 100644
index 00000000000..98bd4c7993c
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParameterList$Value.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParameterList.class b/javax.mail.glassfish/javax/mail/internet/ParameterList.class
new file mode 100644
index 00000000000..f7d3a5f4aa8
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParameterList.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/ParseException.class b/javax.mail.glassfish/javax/mail/internet/ParseException.class
new file mode 100644
index 00000000000..e80ec0f52a8
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/ParseException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/PreencodedMimeBodyPart.class b/javax.mail.glassfish/javax/mail/internet/PreencodedMimeBodyPart.class
new file mode 100644
index 00000000000..6d3d54caf46
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/PreencodedMimeBodyPart.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/SharedInputStream.class b/javax.mail.glassfish/javax/mail/internet/SharedInputStream.class
new file mode 100644
index 00000000000..4cc219323d0
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/SharedInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/internet/UniqueValue.class b/javax.mail.glassfish/javax/mail/internet/UniqueValue.class
new file mode 100644
index 00000000000..9dd3cd56ae5
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/internet/UniqueValue.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/AddressStringTerm.class b/javax.mail.glassfish/javax/mail/search/AddressStringTerm.class
new file mode 100644
index 00000000000..9a89563d413
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/AddressStringTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/AddressTerm.class b/javax.mail.glassfish/javax/mail/search/AddressTerm.class
new file mode 100644
index 00000000000..c20846dd14a
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/AddressTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/AndTerm.class b/javax.mail.glassfish/javax/mail/search/AndTerm.class
new file mode 100644
index 00000000000..c71079620ed
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/AndTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/BodyTerm.class b/javax.mail.glassfish/javax/mail/search/BodyTerm.class
new file mode 100644
index 00000000000..99b3ba2a886
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/BodyTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/ComparisonTerm.class b/javax.mail.glassfish/javax/mail/search/ComparisonTerm.class
new file mode 100644
index 00000000000..659f5c9d849
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/ComparisonTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/DateTerm.class b/javax.mail.glassfish/javax/mail/search/DateTerm.class
new file mode 100644
index 00000000000..d691179359e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/DateTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/FlagTerm.class b/javax.mail.glassfish/javax/mail/search/FlagTerm.class
new file mode 100644
index 00000000000..1bd73e6a5fa
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/FlagTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/FromStringTerm.class b/javax.mail.glassfish/javax/mail/search/FromStringTerm.class
new file mode 100644
index 00000000000..dc2ee745264
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/FromStringTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/FromTerm.class b/javax.mail.glassfish/javax/mail/search/FromTerm.class
new file mode 100644
index 00000000000..5cd0922e5e9
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/FromTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/HeaderTerm.class b/javax.mail.glassfish/javax/mail/search/HeaderTerm.class
new file mode 100644
index 00000000000..f5d9ca44e4b
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/HeaderTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/IntegerComparisonTerm.class b/javax.mail.glassfish/javax/mail/search/IntegerComparisonTerm.class
new file mode 100644
index 00000000000..eb9ab5528a1
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/IntegerComparisonTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/MessageIDTerm.class b/javax.mail.glassfish/javax/mail/search/MessageIDTerm.class
new file mode 100644
index 00000000000..833d3421e45
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/MessageIDTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/MessageNumberTerm.class b/javax.mail.glassfish/javax/mail/search/MessageNumberTerm.class
new file mode 100644
index 00000000000..d99db2cdb1f
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/MessageNumberTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/NotTerm.class b/javax.mail.glassfish/javax/mail/search/NotTerm.class
new file mode 100644
index 00000000000..3afb55ca526
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/NotTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/OrTerm.class b/javax.mail.glassfish/javax/mail/search/OrTerm.class
new file mode 100644
index 00000000000..65f3fd1c202
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/OrTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/ReceivedDateTerm.class b/javax.mail.glassfish/javax/mail/search/ReceivedDateTerm.class
new file mode 100644
index 00000000000..75d8c3c0004
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/ReceivedDateTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/RecipientStringTerm.class b/javax.mail.glassfish/javax/mail/search/RecipientStringTerm.class
new file mode 100644
index 00000000000..68ba380d6a2
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/RecipientStringTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/RecipientTerm.class b/javax.mail.glassfish/javax/mail/search/RecipientTerm.class
new file mode 100644
index 00000000000..c2f4b7aa1bd
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/RecipientTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/SearchException.class b/javax.mail.glassfish/javax/mail/search/SearchException.class
new file mode 100644
index 00000000000..ad551997bbf
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/SearchException.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/SearchTerm.class b/javax.mail.glassfish/javax/mail/search/SearchTerm.class
new file mode 100644
index 00000000000..5774587396e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/SearchTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/SentDateTerm.class b/javax.mail.glassfish/javax/mail/search/SentDateTerm.class
new file mode 100644
index 00000000000..e926c2734b9
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/SentDateTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/SizeTerm.class b/javax.mail.glassfish/javax/mail/search/SizeTerm.class
new file mode 100644
index 00000000000..70fb90ae9aa
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/SizeTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/StringTerm.class b/javax.mail.glassfish/javax/mail/search/StringTerm.class
new file mode 100644
index 00000000000..d5d443af312
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/StringTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/search/SubjectTerm.class b/javax.mail.glassfish/javax/mail/search/SubjectTerm.class
new file mode 100644
index 00000000000..e033e10862e
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/search/SubjectTerm.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/util/ByteArrayDataSource$DSByteArrayOutputStream.class b/javax.mail.glassfish/javax/mail/util/ByteArrayDataSource$DSByteArrayOutputStream.class
new file mode 100644
index 00000000000..dbfdafd6844
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/util/ByteArrayDataSource$DSByteArrayOutputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/util/ByteArrayDataSource.class b/javax.mail.glassfish/javax/mail/util/ByteArrayDataSource.class
new file mode 100644
index 00000000000..d4a80695b8a
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/util/ByteArrayDataSource.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/util/SharedByteArrayInputStream.class b/javax.mail.glassfish/javax/mail/util/SharedByteArrayInputStream.class
new file mode 100644
index 00000000000..562df68d7da
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/util/SharedByteArrayInputStream.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/util/SharedFileInputStream$SharedFile.class b/javax.mail.glassfish/javax/mail/util/SharedFileInputStream$SharedFile.class
new file mode 100644
index 00000000000..7f997e17ad5
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/util/SharedFileInputStream$SharedFile.class
Binary files differ
diff --git a/javax.mail.glassfish/javax/mail/util/SharedFileInputStream.class b/javax.mail.glassfish/javax/mail/util/SharedFileInputStream.class
new file mode 100644
index 00000000000..fcdfae94b87
--- /dev/null
+++ b/javax.mail.glassfish/javax/mail/util/SharedFileInputStream.class
Binary files differ
diff --git a/net.jini/.classpath b/net.jini/.classpath
new file mode 100644
index 00000000000..c434e21c9f7
--- /dev/null
+++ b/net.jini/.classpath
@@ -0,0 +1,41 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/browser.jar" sourcepath="jini2_1/source.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/checkconfigurationfile.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/checkser.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/classdep.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/classserver.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/computedigest.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/computehttpmdcodebase.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/destroy.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/envcheck.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/fiddler.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/group.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jarwrapper.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jini-core.jar" sourcepath="jini2_1/source.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jini-ext.jar" sourcepath="jini2_1/source.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jsk-debug-policy.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jsk-lib.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jsk-platform.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/jsk-resources.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/mahalo.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/mercury.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/norm.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/outrigger.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/outrigger-logstore.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/outrigger-snaplogstore.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/phoenix.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/phoenix-group.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/phoenix-init.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/prebuilt-outrigger-logstore.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/preferredlistgen.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/reggie.jar" sourcepath="jini2_1/source.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/sharedvm.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/start.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/sun-util.jar" sourcepath="net.jinisrc.zip"/>
+ <classpathentry exported="true" kind="lib" path="jini2_1/lib/tools.jar" sourcepath="jini2_1/source.zip"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/net.jini/.project b/net.jini/.project
new file mode 100644
index 00000000000..97cadaa7e9f
--- /dev/null
+++ b/net.jini/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>net.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/net.jini/META-INF/MANIFEST.MF b/net.jini/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..d3c30345eb8
--- /dev/null
+++ b/net.jini/META-INF/MANIFEST.MF
@@ -0,0 +1,133 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Jini Plug-in (Incubation)
+Bundle-SymbolicName: net.jini;singleton:=true
+Bundle-Version: 2.1.0.qualifier
+Bundle-ClassPath: jini.jar,
+ jini2_1/lib/browser.jar,
+ jini2_1/lib/checkconfigurationfile.jar,
+ jini2_1/lib/checkser.jar,
+ jini2_1/lib/classdep.jar,
+ jini2_1/lib/classserver.jar,
+ jini2_1/lib/computedigest.jar,
+ jini2_1/lib/computehttpmdcodebase.jar,
+ jini2_1/lib/destroy.jar,
+ jini2_1/lib/envcheck.jar,
+ jini2_1/lib/fiddler.jar,
+ jini2_1/lib/group.jar,
+ jini2_1/lib/jarwrapper.jar,
+ jini2_1/lib/jini-core.jar,
+ jini2_1/lib/jini-ext.jar,
+ jini2_1/lib/jsk-debug-policy.jar,
+ jini2_1/lib/jsk-lib.jar,
+ jini2_1/lib/jsk-platform.jar,
+ jini2_1/lib/jsk-resources.jar,
+ jini2_1/lib/mahalo.jar,
+ jini2_1/lib/mercury.jar,
+ jini2_1/lib/norm.jar,
+ jini2_1/lib/outrigger.jar,
+ jini2_1/lib/outrigger-logstore.jar,
+ jini2_1/lib/outrigger-snaplogstore.jar,
+ jini2_1/lib/phoenix.jar,
+ jini2_1/lib/phoenix-group.jar,
+ jini2_1/lib/phoenix-init.jar,
+ jini2_1/lib/prebuilt-outrigger-logstore.jar,
+ jini2_1/lib/preferredlistgen.jar,
+ jini2_1/lib/reggie.jar,
+ jini2_1/lib/sharedvm.jar,
+ jini2_1/lib/start.jar,
+ jini2_1/lib/sun-util.jar,
+ jini2_1/lib/tools.jar
+Bundle-Activator: net.jini.JiniPlugin
+Bundle-Vendor: Sun
+Bundle-ActivationPolicy: lazy
+Export-Package: com.sun.jini.action,
+ com.sun.jini.admin,
+ com.sun.jini.collection,
+ com.sun.jini.config,
+ com.sun.jini.constants,
+ com.sun.jini.discovery,
+ com.sun.jini.discovery.internal,
+ com.sun.jini.discovery.kerberos,
+ com.sun.jini.discovery.plaintext,
+ com.sun.jini.discovery.ssl,
+ com.sun.jini.discovery.x500.sha1withdsa,
+ com.sun.jini.discovery.x500.sha1withrsa,
+ com.sun.jini.example.browser,
+ com.sun.jini.fiddler,
+ com.sun.jini.jeri.internal.connection,
+ com.sun.jini.jeri.internal.http,
+ com.sun.jini.jeri.internal.mux,
+ com.sun.jini.jeri.internal.runtime,
+ com.sun.jini.landlord,
+ com.sun.jini.lease,
+ com.sun.jini.loader.pref.internal,
+ com.sun.jini.logging,
+ com.sun.jini.lookup.entry,
+ com.sun.jini.mahalo,
+ com.sun.jini.mahalo.log,
+ com.sun.jini.mercury,
+ com.sun.jini.norm,
+ com.sun.jini.norm.event,
+ com.sun.jini.norm.lookup,
+ com.sun.jini.outrigger,
+ com.sun.jini.outrigger.logstore,
+ com.sun.jini.outrigger.snaplogstore,
+ com.sun.jini.phoenix,
+ com.sun.jini.phoenix.resources,
+ com.sun.jini.proxy,
+ com.sun.jini.reggie,
+ com.sun.jini.reliableLog,
+ com.sun.jini.resource,
+ com.sun.jini.start,
+ com.sun.jini.start.resources,
+ com.sun.jini.system,
+ com.sun.jini.thread,
+ com.sun.jini.tool,
+ com.sun.jini.tool.envcheck,
+ com.sun.jini.tool.envcheck.plugins,
+ com.sun.jini.tool.envcheck.plugins.resources,
+ com.sun.jini.tool.envcheck.resources,
+ com.sun.jini.tool.resources,
+ net.jini,
+ 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
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.osgi
diff --git a/net.jini/build.properties b/net.jini/build.properties
new file mode 100644
index 00000000000..d6bbdfe5342
--- /dev/null
+++ b/net.jini/build.properties
@@ -0,0 +1,7 @@
+source.jini.jar = src/
+output.jini.jar = bin/
+bin.includes = jini.jar,\
+ META-INF/,\
+ src/,\
+ jini2_1/,\
+ jini_config/
diff --git a/net.jini/jini2_1/LICENSE b/net.jini/jini2_1/LICENSE
new file mode 100644
index 00000000000..261eeb9e9f8
--- /dev/null
+++ b/net.jini/jini2_1/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" 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. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/net.jini/jini2_1/NOTICE b/net.jini/jini2_1/NOTICE
new file mode 100644
index 00000000000..7e0e6a56b3a
--- /dev/null
+++ b/net.jini/jini2_1/NOTICE
@@ -0,0 +1,5 @@
+This product includes material developed by Sun Microsystems, Inc.
+(http://www.sun.com).
+
+This product contains code derived from the Ant build script contributed
+to the Jini Community by Geoffrey Arnold (http://www.geoffreyarnold.com).
diff --git a/net.jini/jini2_1/configentry/ServiceDiscoveryManager b/net.jini/jini2_1/configentry/ServiceDiscoveryManager
new file mode 100644
index 00000000000..94a6b3e1d71
--- /dev/null
+++ b/net.jini/jini2_1/configentry/ServiceDiscoveryManager
@@ -0,0 +1,9 @@
+# ServiceDiscoveryManager configuration entries
+net.jini.lookup.ServiceDiscoveryManager.cacheTaskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.ServiceDiscoveryManager.discardTaskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.ServiceDiscoveryManager.discardWait: long
+net.jini.lookup.ServiceDiscoveryManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.ServiceDiscoveryManager.eventLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.ServiceDiscoveryManager.eventListenerExporter: net.jini.export.Exporter
+net.jini.lookup.ServiceDiscoveryManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.ServiceDiscoveryManager.registrarPreparer: net.jini.security.ProxyPreparer
diff --git a/net.jini/jini2_1/configentry/WakeupManager b/net.jini/jini2_1/configentry/WakeupManager
new file mode 100644
index 00000000000..f46cfcabf9b
--- /dev/null
+++ b/net.jini/jini2_1/configentry/WakeupManager
@@ -0,0 +1,2 @@
+# WakeupManager configuration entries
+com.sun.jini.thread.WakeupManager.queueThreadTimeout: long
diff --git a/net.jini/jini2_1/configentry/fiddler-transient b/net.jini/jini2_1/configentry/fiddler-transient
new file mode 100644
index 00000000000..5c7a7890027
--- /dev/null
+++ b/net.jini/jini2_1/configentry/fiddler-transient
@@ -0,0 +1,46 @@
+# transient fiddler configuration entries
+com.sun.jini.fiddler.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.fiddler.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.fiddler.initialLookupGroups: String[]
+com.sun.jini.fiddler.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.fiddler.leaseBound: long
+com.sun.jini.fiddler.leaseMax: long
+com.sun.jini.fiddler.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.fiddler.locatorToDiscoverPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.fiddler.locatorToJoinPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.fiddler.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.fiddler.serverExporter: net.jini.export.Exporter
+com.sun.jini.fiddler.taskManager: com.sun.jini.thread.TaskManager
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/mercury-persistent b/net.jini/jini2_1/configentry/mercury-persistent
new file mode 100644
index 00000000000..e550fe1fa1f
--- /dev/null
+++ b/net.jini/jini2_1/configentry/mercury-persistent
@@ -0,0 +1,50 @@
+# non-activatable persistent mercury configuration entries
+com.sun.jini.mercury.logToSnapshotThreshold: int
+com.sun.jini.mercury.persistenceDirectory: String
+com.sun.jini.mercury.recoveredListenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.mercury.recoveredLocatorToJoinPreparer: net.jini.security.ProxyPreparer
+
+# transient mercury configuration entries
+com.sun.jini.mercury.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.mercury.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.mercury.initialLookupGroups: String[]
+com.sun.jini.mercury.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.mercury.leasePeriodPolicy: com.sun.jini.landlord.LeasePeriodPolicy
+com.sun.jini.mercury.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.mercury.locatorToJoinPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.mercury.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.mercury.notificationsTaskManager: com.sun.jini.thread.TaskManager
+com.sun.jini.mercury.serverExporter: net.jini.export.Exporter
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/norm-activatable b/net.jini/jini2_1/configentry/norm-activatable
new file mode 100644
index 00000000000..0fd717886c6
--- /dev/null
+++ b/net.jini/jini2_1/configentry/norm-activatable
@@ -0,0 +1,56 @@
+# activatable persistent norm configuration entries
+com.sun.jini.norm.activationIdPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.activationSystemPreparer: net.jini.security.ProxyPreparer
+# non-activatable persistent norm configuration entries
+com.sun.jini.norm.persistenceDirectory: String
+com.sun.jini.norm.persistenceSnapshotThreshold: int
+com.sun.jini.norm.persistenceSnapshotWeight: float
+com.sun.jini.norm.recoveredLeasePreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.recoveredListenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.recoveredLocatorPreparer: net.jini.security.ProxyPreparer
+# transient norm configuration entries
+com.sun.jini.norm.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.norm.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.norm.initialLookupGroups: String[]
+com.sun.jini.norm.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.norm.isolateSets: boolean
+com.sun.jini.norm.leaseManager: net.jini.lease.LeaseRenewalManager
+com.sun.jini.norm.leasePolicy: com.sun.jini.landlord.LeasePeriodPolicy
+com.sun.jini.norm.leasePreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.locatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.norm.serverExporter: net.jini.export.Exporter
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/norm-transient b/net.jini/jini2_1/configentry/norm-transient
new file mode 100644
index 00000000000..6547da8f2c6
--- /dev/null
+++ b/net.jini/jini2_1/configentry/norm-transient
@@ -0,0 +1,46 @@
+# transient norm configuration entries
+com.sun.jini.norm.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.norm.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.norm.initialLookupGroups: String[]
+com.sun.jini.norm.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.norm.isolateSets: boolean
+com.sun.jini.norm.leaseManager: net.jini.lease.LeaseRenewalManager
+com.sun.jini.norm.leasePolicy: com.sun.jini.landlord.LeasePeriodPolicy
+com.sun.jini.norm.leasePreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.locatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.norm.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.norm.serverExporter: net.jini.export.Exporter
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/outrigger-persistent b/net.jini/jini2_1/configentry/outrigger-persistent
new file mode 100644
index 00000000000..b7ee5e596a5
--- /dev/null
+++ b/net.jini/jini2_1/configentry/outrigger-persistent
@@ -0,0 +1,63 @@
+# non-activatable persistent outrigger configuration entries
+com.sun.jini.outrigger.gcInterval: int
+com.sun.jini.outrigger.maxOps: int
+com.sun.jini.outrigger.persistenceDirectory: String
+com.sun.jini.outrigger.recoveredListenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.outrigger.recoveredLookupLocatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.outrigger.recoveredTransactionManagerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.outrigger.store: com.sun.jini.outrigger.Store
+# transient outrigger configuration entries
+com.sun.jini.outrigger.contentsLeasePeriodPolicy: com.sun.jini.landlord.LeasePeriodPolicy
+com.sun.jini.outrigger.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.outrigger.entryLeasePeriodPolicy: com.sun.jini.landlord.LeasePeriodPolicy
+com.sun.jini.outrigger.eventLeasePolicy: com.sun.jini.landlord.LeasePeriodPolicy
+com.sun.jini.outrigger.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.outrigger.initialLookupGroups: String[]
+com.sun.jini.outrigger.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.outrigger.iteratorBatchSize: int
+com.sun.jini.outrigger.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.outrigger.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.outrigger.lookupLocatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.outrigger.maxServerQueryTimeout: long
+com.sun.jini.outrigger.maxUnexportDelay: long
+com.sun.jini.outrigger.notificationsTaskManager: com.sun.jini.thread.TaskManager
+com.sun.jini.outrigger.reapingInterval: long
+com.sun.jini.outrigger.reapingPriority: int
+com.sun.jini.outrigger.serverExporter: net.jini.export.Exporter
+com.sun.jini.outrigger.takeMultipleLimit: int
+com.sun.jini.outrigger.transactionManagerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.outrigger.txnMonitorTaskManager: com.sun.jini.thread.TaskManager
+com.sun.jini.outrigger.unexportRetryDelay: long
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/phoenix b/net.jini/jini2_1/configentry/phoenix
new file mode 100644
index 00000000000..7a8179ecfa1
--- /dev/null
+++ b/net.jini/jini2_1/configentry/phoenix
@@ -0,0 +1,17 @@
+# phoenix configuration entries
+com.sun.jini.phoenix.activatorExporter: net.jini.export.Exporter
+com.sun.jini.phoenix.groupConfig: String[]
+com.sun.jini.phoenix.groupLocation: String
+com.sun.jini.phoenix.groupOptions: String[]
+com.sun.jini.phoenix.groupOutputHandler: com.sun.jini.phoenix.GroupOutputHandler
+com.sun.jini.phoenix.groupThrottle: int
+com.sun.jini.phoenix.groupTimeout: int
+com.sun.jini.phoenix.instantiatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.phoenix.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.phoenix.monitorExporter: net.jini.export.Exporter
+com.sun.jini.phoenix.persistenceDirectory: String
+com.sun.jini.phoenix.persistenceSnapshotThreshold: int
+com.sun.jini.phoenix.registryExporter: net.jini.export.Exporter
+com.sun.jini.phoenix.systemExporter: net.jini.export.Exporter
+com.sun.jini.phoenix.unexportTimeout: int
+com.sun.jini.phoenix.unexportWait: int
diff --git a/net.jini/jini2_1/configentry/phoenix-stop b/net.jini/jini2_1/configentry/phoenix-stop
new file mode 100644
index 00000000000..4a2654e14b5
--- /dev/null
+++ b/net.jini/jini2_1/configentry/phoenix-stop
@@ -0,0 +1,5 @@
+# phoenix -stop configuration entries
+com.sun.jini.phoenix.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.phoenix.registryHost: String
+com.sun.jini.phoenix.registryPort: int
+com.sun.jini.phoenix.systemPreparer: net.jini.security.ProxyPreparer
diff --git a/net.jini/jini2_1/configentry/reggie-activatable b/net.jini/jini2_1/configentry/reggie-activatable
new file mode 100644
index 00000000000..fae1235f4c8
--- /dev/null
+++ b/net.jini/jini2_1/configentry/reggie-activatable
@@ -0,0 +1,66 @@
+# activatable persistent reggie configuration entries
+com.sun.jini.reggie.activationIdPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.activationSystemPreparer: net.jini.security.ProxyPreparer
+# non-activatable persistent reggie configuration entries
+com.sun.jini.reggie.persistenceDirectory: String
+com.sun.jini.reggie.persistenceSnapshotThreshold: int
+com.sun.jini.reggie.persistenceSnapshotWeight: float
+com.sun.jini.reggie.recoveredListenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.recoveredLocatorPreparer: net.jini.security.ProxyPreparer
+# transient reggie configuration entries
+com.sun.jini.reggie.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+com.sun.jini.reggie.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.reggie.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.reggie.initialLookupGroups: String[]
+com.sun.jini.reggie.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.reggie.initialMemberGroups: String[]
+com.sun.jini.reggie.initialUnicastDiscoveryPort: int
+com.sun.jini.reggie.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.locatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.reggie.minMaxEventLease: long
+com.sun.jini.reggie.minMaxServiceLease: long
+com.sun.jini.reggie.minRenewalInterval: long
+com.sun.jini.reggie.multicastAnnouncementInterval: long
+com.sun.jini.reggie.multicastInterfaceRetryInterval: int
+com.sun.jini.reggie.multicastInterfaces: java.net.NetworkInterface[]
+com.sun.jini.reggie.multicastRequestSubjectChecker: com.sun.jini.discovery.ClientSubjectChecker
+com.sun.jini.reggie.resourceIdGenerator: com.sun.jini.reggie.UuidGenerator
+com.sun.jini.reggie.serverExporter: net.jini.export.Exporter
+com.sun.jini.reggie.serviceIdGenerator: com.sun.jini.reggie.UuidGenerator
+com.sun.jini.reggie.taskManager: com.sun.jini.thread.TaskManager
+com.sun.jini.reggie.unicastDiscoveryHost: String
+com.sun.jini.reggie.unicastDiscoverySubjectChecker: com.sun.jini.discovery.ClientSubjectChecker
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/reggie-persistent b/net.jini/jini2_1/configentry/reggie-persistent
new file mode 100644
index 00000000000..3b8fd4c2b87
--- /dev/null
+++ b/net.jini/jini2_1/configentry/reggie-persistent
@@ -0,0 +1,63 @@
+# non-activatable persistent reggie configuration entries
+com.sun.jini.reggie.persistenceDirectory: String
+com.sun.jini.reggie.persistenceSnapshotThreshold: int
+com.sun.jini.reggie.persistenceSnapshotWeight: float
+com.sun.jini.reggie.recoveredListenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.recoveredLocatorPreparer: net.jini.security.ProxyPreparer
+# transient reggie configuration entries
+com.sun.jini.reggie.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+com.sun.jini.reggie.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.reggie.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.reggie.initialLookupGroups: String[]
+com.sun.jini.reggie.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.reggie.initialMemberGroups: String[]
+com.sun.jini.reggie.initialUnicastDiscoveryPort: int
+com.sun.jini.reggie.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.locatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.reggie.minMaxEventLease: long
+com.sun.jini.reggie.minMaxServiceLease: long
+com.sun.jini.reggie.minRenewalInterval: long
+com.sun.jini.reggie.multicastAnnouncementInterval: long
+com.sun.jini.reggie.multicastInterfaceRetryInterval: int
+com.sun.jini.reggie.multicastInterfaces: java.net.NetworkInterface[]
+com.sun.jini.reggie.multicastRequestSubjectChecker: com.sun.jini.discovery.ClientSubjectChecker
+com.sun.jini.reggie.resourceIdGenerator: com.sun.jini.reggie.UuidGenerator
+com.sun.jini.reggie.serverExporter: net.jini.export.Exporter
+com.sun.jini.reggie.serviceIdGenerator: com.sun.jini.reggie.UuidGenerator
+com.sun.jini.reggie.taskManager: com.sun.jini.thread.TaskManager
+com.sun.jini.reggie.unicastDiscoveryHost: String
+com.sun.jini.reggie.unicastDiscoverySubjectChecker: com.sun.jini.discovery.ClientSubjectChecker
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/reggie-transient b/net.jini/jini2_1/configentry/reggie-transient
new file mode 100644
index 00000000000..73423fef99e
--- /dev/null
+++ b/net.jini/jini2_1/configentry/reggie-transient
@@ -0,0 +1,57 @@
+# transient reggie configuration entries
+com.sun.jini.reggie.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+com.sun.jini.reggie.discoveryManager: net.jini.discovery.DiscoveryManagement
+com.sun.jini.reggie.initialLookupAttributes: net.jini.core.entry.Entry[]
+com.sun.jini.reggie.initialLookupGroups: String[]
+com.sun.jini.reggie.initialLookupLocators: net.jini.core.discovery.LookupLocator[]
+com.sun.jini.reggie.initialMemberGroups: String[]
+com.sun.jini.reggie.initialUnicastDiscoveryPort: int
+com.sun.jini.reggie.listenerPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.locatorPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.reggie.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.reggie.minMaxEventLease: long
+com.sun.jini.reggie.minMaxServiceLease: long
+com.sun.jini.reggie.minRenewalInterval: long
+com.sun.jini.reggie.multicastAnnouncementInterval: long
+com.sun.jini.reggie.multicastInterfaceRetryInterval: int
+com.sun.jini.reggie.multicastInterfaces: java.net.NetworkInterface[]
+com.sun.jini.reggie.multicastRequestSubjectChecker: com.sun.jini.discovery.ClientSubjectChecker
+com.sun.jini.reggie.resourceIdGenerator: com.sun.jini.reggie.UuidGenerator
+com.sun.jini.reggie.serverExporter: net.jini.export.Exporter
+com.sun.jini.reggie.serviceIdGenerator: com.sun.jini.reggie.UuidGenerator
+com.sun.jini.reggie.taskManager: com.sun.jini.thread.TaskManager
+com.sun.jini.reggie.unicastDiscoveryHost: String
+com.sun.jini.reggie.unicastDiscoverySubjectChecker: com.sun.jini.discovery.ClientSubjectChecker
+# JoinManager configuration entries
+net.jini.lookup.JoinManager.discoveryManager: net.jini.discovery.DiscoveryManagement
+net.jini.lookup.JoinManager.leaseManager: net.jini.lease.LeaseRenewalManager
+net.jini.lookup.JoinManager.maxLeaseDuration: long
+net.jini.lookup.JoinManager.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.registrationPreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.serviceLeasePreparer: net.jini.security.ProxyPreparer
+net.jini.lookup.JoinManager.taskManager: com.sun.jini.thread.TaskManager
+net.jini.lookup.JoinManager.wakeupManager: com.sun.jini.thread.WakeupManager
+net.jini.lookup.JoinManager.wakeupRetries: int
+# LeaseRenewalManager configuration entries
+net.jini.lease.LeaseRenewalManager.renewBatchTimeWindow: long
+net.jini.lease.LeaseRenewalManager.roundTripTime: long
+net.jini.lease.LeaseRenewalManager.taskManager: com.sun.jini.thread.TaskManager
+# LookupDiscovery configuration entries
+net.jini.discovery.LookupDiscovery.discoveryConstraints: net.jini.core.constraint.MethodConstraints
+net.jini.discovery.LookupDiscovery.finalMulticastRequestInterval: long
+net.jini.discovery.LookupDiscovery.initialMulticastRequestDelayRange: long
+net.jini.discovery.LookupDiscovery.multicastAnnouncementInterval: long
+net.jini.discovery.LookupDiscovery.multicastInterfaceRetryInterval: int
+net.jini.discovery.LookupDiscovery.multicastInterfaces: java.net.NetworkInterface[]
+net.jini.discovery.LookupDiscovery.multicastRequestHost: String
+net.jini.discovery.LookupDiscovery.multicastRequestInterval: long
+net.jini.discovery.LookupDiscovery.multicastRequestMax: int
+net.jini.discovery.LookupDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupDiscovery.unicastDelayRange: long
+net.jini.discovery.LookupDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
+# LookupLocatorDiscovery configuration entries
+net.jini.discovery.LookupLocatorDiscovery.initialUnicastDelayRange: long
+net.jini.discovery.LookupLocatorDiscovery.registrarPreparer: net.jini.security.ProxyPreparer
+net.jini.discovery.LookupLocatorDiscovery.taskManager: com.sun.jini.thread.TaskManager
+net.jini.discovery.LookupLocatorDiscovery.wakeupManager: com.sun.jini.thread.WakeupManager
diff --git a/net.jini/jini2_1/configentry/start b/net.jini/jini2_1/configentry/start
new file mode 100644
index 00000000000..373ee011405
--- /dev/null
+++ b/net.jini/jini2_1/configentry/start
@@ -0,0 +1,7 @@
+# start.jar ServiceStarter configuration entries
+com.sun.jini.start.activationIDPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.start.activationSystemPreparer: net.jini.security.ProxyPreparer
+com.sun.jini.start.loginContext: javax.security.auth.login.LoginContext
+com.sun.jini.start.serviceDescriptors: com.sun.jini.start.ServiceDescriptor[]
+com.sun.jini.start.serviceDestructors: com.sun.jini.start.ServiceDescriptor[]
+com.sun.jini.start.servicePreparer: net.jini.security.ProxyPreparer
diff --git a/net.jini/jini2_1/doc.zip b/net.jini/jini2_1/doc.zip
new file mode 100644
index 00000000000..f869f6297cd
--- /dev/null
+++ b/net.jini/jini2_1/doc.zip
Binary files differ
diff --git a/net.jini/jini2_1/index.html b/net.jini/jini2_1/index.html
new file mode 100644
index 00000000000..9aba64f07d0
--- /dev/null
+++ b/net.jini/jini2_1/index.html
@@ -0,0 +1,58 @@
+<!--
+ !
+ ! Copyright 2005, Sun Microsystems, Inc.
+ ! Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">
+ ! Apache License, Version 2.0</a>.
+ !
+ !-->
+<body text="#000000" bgcolor="#ffffff" link="#9b37cc"
+ vlink="#cc1877" alink="#ffffff">
+
+<title>Jini(TM) Technology Starter Kit Index</title>
+
+<center><h1>Jini(TM) Technology Starter Kit<BR>v2.1</h1></center>
+<hr>
+<UL>
+<LI><B><a href="doc/info-index.html">Getting Started & More</a></B>
+<p>
+<LI><B>Informative reading</B>
+ <ul>
+ <li><i><a href="doc/arch2_0.html">Jini(TM) Technology Starter Kit Overview</a></i>
+ <li><i><a href="doc/specs/html/jini-spec.html">Jini(TM) Architecture</a></i></i>
+
+</ul>
+<p>
+<LI><B><a href="doc/release-notes/new.html">What's new in this release</a></B>
+<p>
+<LI><B><a href="doc/release-notes/index.html">Release Notes</a></B>
+<p>
+<LI><B><a href="doc/manpages-index.html">Manual Pages</a></B> for services, utilities, and tools
+<p>
+<LI><B><a href="doc/spec-index.html">Specifications</a></B>
+<p>
+<LI><B>API documentation</B>
+ <UL>
+ <LI><a href="doc/api/index.html"> Frames version</a>
+ <LI><a href="doc/api/overview-summary.html"> No Frames version</a>
+ </UL>
+
+<p>
+
+</UL>
+<p>
+<p>
+<hr>
+Copyright 2005, Sun Microsystems, Inc.<br>
+Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">
+Apache License, Version 2.0</a>.
+
+
+
+</body>
+</html>
+
+
+
+
+
+
diff --git a/net.jini/jini2_1/lib-dl/browser-dl.jar b/net.jini/jini2_1/lib-dl/browser-dl.jar
new file mode 100644
index 00000000000..fdce995bb64
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/browser-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/fiddler-dl.jar b/net.jini/jini2_1/lib-dl/fiddler-dl.jar
new file mode 100644
index 00000000000..60f04a38112
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/fiddler-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/group-dl.jar b/net.jini/jini2_1/lib-dl/group-dl.jar
new file mode 100644
index 00000000000..866b5db89c1
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/group-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/jsk-dl.jar b/net.jini/jini2_1/lib-dl/jsk-dl.jar
new file mode 100644
index 00000000000..c5362a519dd
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/jsk-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/mahalo-dl.jar b/net.jini/jini2_1/lib-dl/mahalo-dl.jar
new file mode 100644
index 00000000000..dbe4ff82dce
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/mahalo-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/mercury-dl.jar b/net.jini/jini2_1/lib-dl/mercury-dl.jar
new file mode 100644
index 00000000000..c8aede7be14
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/mercury-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/norm-dl.jar b/net.jini/jini2_1/lib-dl/norm-dl.jar
new file mode 100644
index 00000000000..388fdc34469
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/norm-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/outrigger-dl.jar b/net.jini/jini2_1/lib-dl/outrigger-dl.jar
new file mode 100644
index 00000000000..e5319effcbc
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/outrigger-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/phoenix-dl.jar b/net.jini/jini2_1/lib-dl/phoenix-dl.jar
new file mode 100644
index 00000000000..cc92fe1e337
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/phoenix-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/reggie-dl.jar b/net.jini/jini2_1/lib-dl/reggie-dl.jar
new file mode 100644
index 00000000000..d8bda8834d6
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/reggie-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-dl/sdm-dl.jar b/net.jini/jini2_1/lib-dl/sdm-dl.jar
new file mode 100644
index 00000000000..4e7a754307b
--- /dev/null
+++ b/net.jini/jini2_1/lib-dl/sdm-dl.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib-ext/jsk-policy.jar b/net.jini/jini2_1/lib-ext/jsk-policy.jar
new file mode 100644
index 00000000000..0dcca10965e
--- /dev/null
+++ b/net.jini/jini2_1/lib-ext/jsk-policy.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/browser.jar b/net.jini/jini2_1/lib/browser.jar
new file mode 100644
index 00000000000..b904b5da304
--- /dev/null
+++ b/net.jini/jini2_1/lib/browser.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/checkconfigurationfile.jar b/net.jini/jini2_1/lib/checkconfigurationfile.jar
new file mode 100644
index 00000000000..e00fcf1302a
--- /dev/null
+++ b/net.jini/jini2_1/lib/checkconfigurationfile.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/checkser.jar b/net.jini/jini2_1/lib/checkser.jar
new file mode 100644
index 00000000000..7b02d20e292
--- /dev/null
+++ b/net.jini/jini2_1/lib/checkser.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/classdep.jar b/net.jini/jini2_1/lib/classdep.jar
new file mode 100644
index 00000000000..bda9e77939b
--- /dev/null
+++ b/net.jini/jini2_1/lib/classdep.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/classserver.jar b/net.jini/jini2_1/lib/classserver.jar
new file mode 100644
index 00000000000..31070f987b7
--- /dev/null
+++ b/net.jini/jini2_1/lib/classserver.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/computedigest.jar b/net.jini/jini2_1/lib/computedigest.jar
new file mode 100644
index 00000000000..1eeec4ab72c
--- /dev/null
+++ b/net.jini/jini2_1/lib/computedigest.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/computehttpmdcodebase.jar b/net.jini/jini2_1/lib/computehttpmdcodebase.jar
new file mode 100644
index 00000000000..4ee1c01fa7f
--- /dev/null
+++ b/net.jini/jini2_1/lib/computehttpmdcodebase.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/destroy.jar b/net.jini/jini2_1/lib/destroy.jar
new file mode 100644
index 00000000000..bf76efb84cd
--- /dev/null
+++ b/net.jini/jini2_1/lib/destroy.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/envcheck.jar b/net.jini/jini2_1/lib/envcheck.jar
new file mode 100644
index 00000000000..5912ac5dfc0
--- /dev/null
+++ b/net.jini/jini2_1/lib/envcheck.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/fiddler.jar b/net.jini/jini2_1/lib/fiddler.jar
new file mode 100644
index 00000000000..2c9e64984ea
--- /dev/null
+++ b/net.jini/jini2_1/lib/fiddler.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/group.jar b/net.jini/jini2_1/lib/group.jar
new file mode 100644
index 00000000000..ed2b03067a8
--- /dev/null
+++ b/net.jini/jini2_1/lib/group.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jarwrapper.jar b/net.jini/jini2_1/lib/jarwrapper.jar
new file mode 100644
index 00000000000..ebc7f04464f
--- /dev/null
+++ b/net.jini/jini2_1/lib/jarwrapper.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jini-core.jar b/net.jini/jini2_1/lib/jini-core.jar
new file mode 100644
index 00000000000..4d0543f82c2
--- /dev/null
+++ b/net.jini/jini2_1/lib/jini-core.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jini-ext.jar b/net.jini/jini2_1/lib/jini-ext.jar
new file mode 100644
index 00000000000..16132547ba6
--- /dev/null
+++ b/net.jini/jini2_1/lib/jini-ext.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jsk-debug-policy.jar b/net.jini/jini2_1/lib/jsk-debug-policy.jar
new file mode 100644
index 00000000000..22aacae1051
--- /dev/null
+++ b/net.jini/jini2_1/lib/jsk-debug-policy.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jsk-lib.jar b/net.jini/jini2_1/lib/jsk-lib.jar
new file mode 100644
index 00000000000..7a65cae3395
--- /dev/null
+++ b/net.jini/jini2_1/lib/jsk-lib.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jsk-platform.jar b/net.jini/jini2_1/lib/jsk-platform.jar
new file mode 100644
index 00000000000..647658db5ea
--- /dev/null
+++ b/net.jini/jini2_1/lib/jsk-platform.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/jsk-resources.jar b/net.jini/jini2_1/lib/jsk-resources.jar
new file mode 100644
index 00000000000..2ef9f7f3393
--- /dev/null
+++ b/net.jini/jini2_1/lib/jsk-resources.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/mahalo.jar b/net.jini/jini2_1/lib/mahalo.jar
new file mode 100644
index 00000000000..f0ef06fa009
--- /dev/null
+++ b/net.jini/jini2_1/lib/mahalo.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/mercury.jar b/net.jini/jini2_1/lib/mercury.jar
new file mode 100644
index 00000000000..3c97d2d4ed0
--- /dev/null
+++ b/net.jini/jini2_1/lib/mercury.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/norm.jar b/net.jini/jini2_1/lib/norm.jar
new file mode 100644
index 00000000000..b8a12ea59b0
--- /dev/null
+++ b/net.jini/jini2_1/lib/norm.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/outrigger-logstore.jar b/net.jini/jini2_1/lib/outrigger-logstore.jar
new file mode 100644
index 00000000000..aa14929826c
--- /dev/null
+++ b/net.jini/jini2_1/lib/outrigger-logstore.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/outrigger-snaplogstore.jar b/net.jini/jini2_1/lib/outrigger-snaplogstore.jar
new file mode 100644
index 00000000000..a2c078f0dc6
--- /dev/null
+++ b/net.jini/jini2_1/lib/outrigger-snaplogstore.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/outrigger.jar b/net.jini/jini2_1/lib/outrigger.jar
new file mode 100644
index 00000000000..ec47189a186
--- /dev/null
+++ b/net.jini/jini2_1/lib/outrigger.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/phoenix-group.jar b/net.jini/jini2_1/lib/phoenix-group.jar
new file mode 100644
index 00000000000..4007b43c2b8
--- /dev/null
+++ b/net.jini/jini2_1/lib/phoenix-group.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/phoenix-init.jar b/net.jini/jini2_1/lib/phoenix-init.jar
new file mode 100644
index 00000000000..d6aa3778e2a
--- /dev/null
+++ b/net.jini/jini2_1/lib/phoenix-init.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/phoenix.jar b/net.jini/jini2_1/lib/phoenix.jar
new file mode 100644
index 00000000000..573a22af15e
--- /dev/null
+++ b/net.jini/jini2_1/lib/phoenix.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/prebuilt-outrigger-logstore.jar b/net.jini/jini2_1/lib/prebuilt-outrigger-logstore.jar
new file mode 100644
index 00000000000..101fe7a5268
--- /dev/null
+++ b/net.jini/jini2_1/lib/prebuilt-outrigger-logstore.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/preferredlistgen.jar b/net.jini/jini2_1/lib/preferredlistgen.jar
new file mode 100644
index 00000000000..92ff5002abc
--- /dev/null
+++ b/net.jini/jini2_1/lib/preferredlistgen.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/reggie.jar b/net.jini/jini2_1/lib/reggie.jar
new file mode 100644
index 00000000000..a85c3bea1e1
--- /dev/null
+++ b/net.jini/jini2_1/lib/reggie.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/sharedvm.jar b/net.jini/jini2_1/lib/sharedvm.jar
new file mode 100644
index 00000000000..d5d62a2a645
--- /dev/null
+++ b/net.jini/jini2_1/lib/sharedvm.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/start.jar b/net.jini/jini2_1/lib/start.jar
new file mode 100644
index 00000000000..d15796e5ec2
--- /dev/null
+++ b/net.jini/jini2_1/lib/start.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/sun-util.jar b/net.jini/jini2_1/lib/sun-util.jar
new file mode 100644
index 00000000000..120ff82d6c0
--- /dev/null
+++ b/net.jini/jini2_1/lib/sun-util.jar
Binary files differ
diff --git a/net.jini/jini2_1/lib/tools.jar b/net.jini/jini2_1/lib/tools.jar
new file mode 100644
index 00000000000..46b96ade654
--- /dev/null
+++ b/net.jini/jini2_1/lib/tools.jar
Binary files differ
diff --git a/net.jini/jini2_1/source.zip b/net.jini/jini2_1/source.zip
new file mode 100644
index 00000000000..27ebb2abe6f
--- /dev/null
+++ b/net.jini/jini2_1/source.zip
Binary files differ
diff --git a/net.jini/jini_config/jsk-all.policy b/net.jini/jini_config/jsk-all.policy
new file mode 100644
index 00000000000..c9ee1cace21
--- /dev/null
+++ b/net.jini/jini_config/jsk-all.policy
@@ -0,0 +1,3 @@
+grant codebase "file:${osee.jini.install}/lib/*" {
+ permission java.security.AllPermission;
+}; \ No newline at end of file
diff --git a/net.jini/jini_config/start-transient-jeri-services.config b/net.jini/jini_config/start-transient-jeri-services.config
new file mode 100644
index 00000000000..2e34dff68b2
--- /dev/null
+++ b/net.jini/jini_config/start-transient-jeri-services.config
@@ -0,0 +1,40 @@
+import com.sun.jini.start.NonActivatableServiceDescriptor;
+import com.sun.jini.start.ServiceDescriptor;
+
+com.sun.jini.start {
+
+ //
+ // HTTPD Service
+ //
+ private static httpd_codebase = "";
+ private static httpd_policy = "${osee.jini.config}/jsk-all.policy";
+ private static httpd_classpath = "${osee.jini.install}/lib/classserver.jar";
+ private static httpd_impl = "com.sun.jini.tool.ClassServer";
+ private static httpd_service =
+ new NonActivatableServiceDescriptor(
+ httpd_codebase, httpd_policy, httpd_classpath, httpd_impl,
+ new String[]{"-port", "${osee.classserver.port}", "-dir", "${osee.jini.install}/lib-dl", "-verbose"});
+
+ //
+ // Fiddler (Lookup Discovery Service)
+ //
+
+ //
+ // Reggie (Lookup Service)
+ //
+ private static reggie_codebase = "http://${osee.classserver.host}:${osee.classserver.port}/reggie-dl.jar"
+ + " http://${osee.classserver.host}:${osee.classserver.port}/jsk-dl.jar";
+ private static reggie_policy = "${osee.jini.config}/jsk-all.policy";
+ private static reggie_classpath = "${osee.jini.install}/lib/reggie.jar";
+ private static reggie_config = "${osee.jini.config}/transient-reggie.config";
+ private static reggie_impl = "com.sun.jini.reggie.TransientRegistrarImpl";
+ private static reggie_service =
+ new NonActivatableServiceDescriptor(
+ reggie_codebase, reggie_policy, reggie_classpath,
+ reggie_impl, new String[] { reggie_config });
+
+ static serviceDescriptors = new ServiceDescriptor[] {
+ httpd_service,
+ reggie_service
+ };
+} \ No newline at end of file
diff --git a/net.jini/jini_config/transient-reggie.config b/net.jini/jini_config/transient-reggie.config
new file mode 100644
index 00000000000..b4919e31f7f
--- /dev/null
+++ b/net.jini/jini_config/transient-reggie.config
@@ -0,0 +1,3 @@
+com.sun.jini.reggie {
+ initialMemberGroups = new String[] { "${osee.jini.lookup.groups}" };
+} \ No newline at end of file
diff --git a/net.jini/src/net/jini/JiniPlugin.java b/net.jini/src/net/jini/JiniPlugin.java
new file mode 100644
index 00000000000..2caa6ec9514
--- /dev/null
+++ b/net.jini/src/net/jini/JiniPlugin.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 net.jini;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plug-in class to be used in the desktop.
+ */
+public class JiniPlugin implements BundleActivator {
+
+ private static JiniPlugin plugin;
+ private String[] serviceGroups;
+ private BundleContext context;
+
+ public static JiniPlugin getInstance() {
+ return plugin;
+ }
+
+ public String[] getJiniVersion() {
+ Bundle bundle = context.getBundle();
+ serviceGroups = new String[1];
+ serviceGroups[0] = (String)bundle.getHeaders().get("Bundle-Version");
+ return serviceGroups;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ plugin = this;
+ this.context = context;
+ serviceGroups = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext arg0) throws Exception {
+ plugin = null;
+ this.context = null;
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/.classpath b/org.eclipse.nebula.widgets.xviewer/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.nebula.widgets.xviewer/.project b/org.eclipse.nebula.widgets.xviewer/.project
new file mode 100644
index 00000000000..f2fedbc79cf
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.nebula.widgets.xviewer</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.nebula.widgets.xviewer/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.nebula.widgets.xviewer/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..37b806cb87c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Wed Jan 14 19:51:13 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.nebula.widgets.xviewer/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.xviewer/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..cc5d74f3792
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Xviewer Plug-in
+Bundle-SymbolicName: org.eclipse.nebula.widgets.xviewer;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.nebula.widgets.xviewer.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.nebula.widgets.calendarcombo,
+ org.eclipse.ui.forms
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.nebula.widgets.xviewer,
+ org.eclipse.nebula.widgets.xviewer.customize,
+ org.eclipse.nebula.widgets.xviewer.customize.dialog,
+ org.eclipse.nebula.widgets.xviewer.util
diff --git a/org.eclipse.nebula.widgets.xviewer/build.properties b/org.eclipse.nebula.widgets.xviewer/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/Activator.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/Activator.java
new file mode 100644
index 00000000000..df84883af8a
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/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.nebula.widgets.xviewer;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ *
+ * @author Donald G. Dunne
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.nebula.widgets.xviewer";
+
+ // The shared instance
+ private static Activator plugin;
+ protected static final String imagePath = "images/";
+ private ImageRegistry imageRegistry;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ 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)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ if (imageRegistry != null) {
+ imageRegistry.dispose();
+ }
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ public static Activator getInstance() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/IXViewerFactory.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/IXViewerFactory.java
new file mode 100644
index 00000000000..a5a9979c32a
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/IXViewerFactory.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.nebula.widgets.xviewer;
+
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomMenu;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IXViewerFactory {
+ /**
+ * Returns the default sorter to use for this xviewer
+ *
+ * @param viewer
+ * @return XViewerSorter
+ */
+ XViewerSorter createNewXSorter(XViewer viewer);
+
+ /**
+ * Returns the default table customization for this viewer including column definitions, sorting and filtering (if
+ * any)
+ *
+ * @return CustomizeData
+ */
+ CustomizeData getDefaultTableCustomizeData();
+
+ /**
+ * Returns the default column definition for the given id
+ *
+ * @param id
+ * @return XViewerColumn
+ */
+ XViewerColumn getDefaultXViewerColumn(String id);
+
+ /**
+ * Provides the storage mechanism for save/load of personal/global customizations
+ *
+ * @return IXViewerCustomizations
+ */
+ IXViewerCustomizations getXViewerCustomizations();
+
+ /**
+ * Provides custom menu for XViewer
+ *
+ * @return XViewerCustomMenu
+ */
+ XViewerCustomMenu getXViewerCustomMenu();
+
+ /**
+ * Unique namespace for this viewer
+ *
+ * @return String
+ */
+ String getNamespace();
+
+ /**
+ * Will enable certain extra functionality based on admin validity
+ *
+ * @return true if admin
+ */
+ boolean isAdmin();
+
+ /**
+ * Provides for ability to customize tree report that is provided
+ *
+ * @return XViewerTreeReport
+ */
+ XViewerTreeReport getXViewerTreeReport(XViewer xViewer);
+
+ public boolean isSearchUiAvailable();
+
+ public boolean isFilterUiAvailable();
+
+ public boolean isLoadedStatusLabelAvailable();
+
+ public boolean isHeaderBarAvailable();
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XPromptChange.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XPromptChange.java
new file mode 100644
index 00000000000..947e7bbff95
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XPromptChange.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.nebula.widgets.xviewer;
+
+import java.util.Collection;
+import java.util.Date;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.nebula.widgets.xviewer.util.EnumStringMultiSelectionDialog;
+import org.eclipse.nebula.widgets.xviewer.util.EnumStringSingleSelectionDialog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.DateSelectionDialog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.DialogWithEntry;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XPromptChange {
+
+ private final static String VALID_FLOAT_REG_EX = "^[0-9\\.]+$";
+ private final static String VALID_INTEGER_REG_EX = "^[0-9]+$";
+ private final static String VALID_PERCENT_REG_EX =
+ "^(0*100{1,1}\\.?((?<=\\.)0*)?%?$)|(^0*\\d{0,2}\\.?((?<=\\.)\\d*)?%?)$";
+ public static enum Option {
+ SINGLE_LINE, MULTI_LINE
+ };
+
+ public static Date promptChangeDate(String displayName, Date currDate) {
+ // prompt that current release is (get from attribute); want to change
+ DateSelectionDialog diag =
+ new DateSelectionDialog("Select " + displayName, "Select " + displayName,
+ currDate != null ? currDate : null);
+ if (diag.open() == 0) {
+ return diag.getSelectedDate();
+ }
+ return null;
+ }
+
+ public static EnumStringSingleSelectionDialog promptChangeSingleSelectEnumeration(String displayName, Collection<String> enums, String currSelected) {
+ final EnumStringSingleSelectionDialog diag =
+ new EnumStringSingleSelectionDialog(displayName, displayName, enums, currSelected);
+ if (diag.open() == 0) {
+ return diag;
+ }
+ return null;
+ }
+
+ public static EnumStringMultiSelectionDialog promptChangeMultiSelectEnumeration(String displayName, Collection<String> enums, Collection<String> currEnums) {
+ final EnumStringMultiSelectionDialog diag = new EnumStringMultiSelectionDialog(displayName, enums, currEnums);
+ if (diag.open() == 0) {
+ return diag;
+ }
+ return null;
+ }
+
+ public static String promptChangeInteger(String displayName, int currEntry) {
+ return promptChangeInteger(displayName, currEntry == 0 ? "" : String.valueOf(currEntry));
+ }
+
+ public static String promptChangeInteger(String displayName, String currEntry) {
+ return promptChangeString(displayName, currEntry, VALID_INTEGER_REG_EX);
+ }
+
+ public static String promptChangePercent(String displayName, String currEntry) {
+ return promptChangeString(displayName, currEntry, VALID_PERCENT_REG_EX);
+ }
+
+ public static String promptChangeFloat(String displayName, double currEntry) {
+ return promptChangeFloat(displayName, currEntry == 0 ? "" : String.valueOf(currEntry));
+ }
+
+ public static String promptChangeFloat(String displayName, String currEntry) {
+ return promptChangeString(displayName, currEntry, VALID_FLOAT_REG_EX);
+ }
+
+ public static String promptChangeString(String displayName, String currEntry, String validationRegEx) {
+ return promptChangeString(displayName, currEntry, validationRegEx, Option.SINGLE_LINE);
+ }
+
+ public static String promptChangeString(String displayName, String currEntry, String validationRegEx, Option option) {
+ DialogWithEntry ed = new DialogWithEntry("Enter " + displayName, "Enter " + displayName);
+ if (option == Option.MULTI_LINE) ed.setFillVertically(true);
+ if (currEntry != null && !currEntry.equals("")) ed.setEntry(currEntry);
+ if (validationRegEx != null) ed.setValidationRegularExpression(validationRegEx);
+ int result = ed.open();
+ if (result == 0) return ed.getEntry();
+ return null;
+ }
+
+ public static Boolean promptChangeBoolean(String displayName, String toggleMessage, boolean currSelection) {
+ MessageDialogWithToggle md =
+ new MessageDialogWithToggle(Display.getCurrent().getActiveShell(), displayName, null, displayName,
+ MessageDialog.QUESTION, new String[] {"Ok", "Cancel"}, MessageDialog.OK,
+ (toggleMessage != null ? toggleMessage : displayName), currSelection);
+ int result = md.open();
+ if (result == 256) {
+ return md.getToggleState();
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XSubMenuManager.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XSubMenuManager.java
new file mode 100644
index 00000000000..dc7266e922e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XSubMenuManager.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.nebula.widgets.xviewer;
+
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class XSubMenuManager extends MenuManager {
+
+ private boolean visible = true;
+
+ /**
+ * @param string
+ */
+ public XSubMenuManager(String string) {
+ super(string);
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.add(new Separator());
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewer.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewer.java
new file mode 100644
index 00000000000..dc4d1af39d9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewer.java
@@ -0,0 +1,590 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.nebula.widgets.xviewer;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.customize.ColumnFilterDataUI;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeManager;
+import org.eclipse.nebula.widgets.xviewer.customize.FilterDataUI;
+import org.eclipse.nebula.widgets.xviewer.customize.SearchDataUI;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewer extends TreeViewer {
+
+ public static final String MENU_GROUP_PRE = "XVIEWER MENU GROUP PRE";
+ public static final String MENU_GROUP_POST = "XVIEWER MENU GROUP POST";
+ private Label statusLabel;
+ private final MenuManager menuManager;
+ private static boolean ctrlKeyDown = false;
+ private static boolean altKeyDown = false;
+ protected final IXViewerFactory xViewerFactory;
+ private final FilterDataUI filterDataUI;
+ private final SearchDataUI searchDataUI;
+ private final ColumnFilterDataUI columnFilterDataUI;
+ private static boolean ctrlKeyListenersSet = false;
+
+ /**
+ * @return the columnFilterDataUI
+ */
+ public ColumnFilterDataUI getColumnFilterDataUI() {
+ return columnFilterDataUI;
+ }
+ private boolean columnMultiEditEnabled = false;
+ private CustomizeManager customizeMgr;
+ private TreeColumn rightClickSelectedColumn = null;
+ private Integer rightClickSelectedColumnNum = null;
+ private TreeItem rightClickSelectedItem = null;
+ private Color searchColor;
+
+ public XViewer(Composite parent, int style, IXViewerFactory xViewerFactory) {
+ this(parent, style, xViewerFactory, false, false);
+ }
+
+ public XViewer(Composite parent, int style, IXViewerFactory xViewerFactory, boolean filterRealTime, boolean searchRealTime) {
+ super(parent, style);
+ this.xViewerFactory = xViewerFactory;
+ this.menuManager = new MenuManager();
+ this.menuManager.setRemoveAllWhenShown(true);
+ this.menuManager.createContextMenu(parent);
+ if (xViewerFactory.isFilterUiAvailable()) {
+ this.filterDataUI = new FilterDataUI(this, filterRealTime);
+ } else {
+ this.filterDataUI = null;
+ }
+ if (xViewerFactory.isSearchUiAvailable()) {
+ this.searchDataUI = new SearchDataUI(this, searchRealTime);
+ } else {
+ this.searchDataUI = null;
+ }
+ this.columnFilterDataUI = new ColumnFilterDataUI(this);
+ try {
+ customizeMgr = new CustomizeManager(this, xViewerFactory);
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ createSupportWidgets(parent);
+
+ Tree tree = getTree();
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ setUseHashlookup(true);
+ setupCtrlKeyListener();
+ }
+
+ public void dispose() {
+ if (searchDataUI != null) searchDataUI.dispose();
+ if (filterDataUI != null) filterDataUI.dispose();
+ columnFilterDataUI.dispose();
+ }
+
+ @Override
+ public void setLabelProvider(IBaseLabelProvider labelProvider) {
+ if (!(labelProvider instanceof XViewerLabelProvider) && !(labelProvider instanceof XViewerStyledTextLabelProvider)) {
+ throw new IllegalArgumentException("Label Provider must extend XViewerLabelProvider");
+ }
+ super.setLabelProvider(labelProvider);
+ }
+
+ public void addCustomizeToViewToolbar(final ViewPart viewPart) {
+ addCustomizeToViewToolbar(viewPart.getViewSite().getActionBars().getToolBarManager());
+ }
+
+ public Action getCustomizeAction() {
+ Action customizeAction = new Action("Customize Table") {
+
+ @Override
+ public void run() {
+ customizeMgr.handleTableCustomization();
+ }
+ };
+ customizeAction.setImageDescriptor(XViewerLib.getImageDescriptor("customize.gif"));
+ customizeAction.setToolTipText("Customize Table");
+ return customizeAction;
+ }
+
+ public void addCustomizeToViewToolbar(IToolBarManager toolbarManager) {
+ toolbarManager.add(getCustomizeAction());
+ }
+
+ protected void createSupportWidgets(Composite parent) {
+
+ searchColor = Display.getDefault().getSystemColor(SWT.COLOR_YELLOW);
+
+ Composite comp = null;
+ if (searchDataUI != null || filterDataUI != null || xViewerFactory.isLoadedStatusLabelAvailable()) {
+ comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(XViewerLib.getZeroMarginLayout(11, false));
+ comp.setLayoutData(new GridData(SWT.FILL, SWT.None, true, false));
+
+ if (filterDataUI != null) {
+ filterDataUI.createWidgets(comp);
+ Label sep1 = new Label(comp, SWT.SEPARATOR);
+ GridData gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ gd.heightHint = 16;
+ sep1.setLayoutData(gd);
+ }
+
+ if (searchDataUI != null) {
+ searchDataUI.createWidgets(comp);
+ Label sep2 = new Label(comp, SWT.SEPARATOR);
+ GridData gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ gd.heightHint = 16;
+ sep2.setLayoutData(gd);
+ }
+
+ if (xViewerFactory.isLoadedStatusLabelAvailable()) {
+ statusLabel = new Label(comp, SWT.NONE);
+ statusLabel.setText(" ");
+ statusLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+ }
+ }
+
+ getTree().addListener(SWT.MouseDown, new Listener() {
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ rightClickSelectedColumn = null;
+ rightClickSelectedColumnNum = null;
+ rightClickSelectedItem = null;
+ Point pt = new Point(event.x, event.y);
+ rightClickSelectedItem = getTree().getItem(pt);
+ if (rightClickSelectedItem == null) return;
+ for (int colNum = 0; colNum < getTree().getColumnCount(); colNum++) {
+ Rectangle rect = rightClickSelectedItem.getBounds(colNum);
+ if (rect.contains(pt)) {
+ rightClickSelectedColumnNum = colNum;
+ rightClickSelectedColumn = getTree().getColumn(colNum);
+ break;
+ }
+ }
+ }
+ }
+ });
+ getTree().addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event event) {
+ Point pt = new Point(event.x, event.y);
+ TreeItem item = getTree().getItem(pt);
+ if (item == null) return;
+ for (int colNum = 0; colNum < getTree().getColumnCount(); colNum++) {
+ Rectangle rect = item.getBounds(colNum);
+ if (rect.contains(pt)) {
+ if (event.button == 1 && !((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL)) {
+ if (((event.stateMask & SWT.MODIFIER_MASK) == SWT.ALT)) {
+ // System.out.println("Column " + colNum);
+ handleAltLeftClick(getTree().getColumns()[colNum], item);
+ } else if ((event.x <= (rect.x + 18))) {
+ handleLeftClickInIconArea(getTree().getColumns()[colNum], item);
+ } else {
+ // System.out.println("Column " + colNum);
+ handleLeftClick(getTree().getColumns()[colNum], item);
+ }
+ }
+ }
+ }
+ updateStatusLabel();
+ }
+ });
+ this.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(org.eclipse.jface.viewers.DoubleClickEvent event) {
+ ISelection sel = event.getSelection();
+ System.out.println(sel);
+ handleDoubleClick();
+ };
+ });
+ getTree().addMouseListener(new MouseListener() {
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ int[] columnOrder = getTree().getColumnOrder();
+ int sum = 0;
+ int count = 0;
+ for (int column : columnOrder) {
+ TreeColumn col = getTree().getColumn(column);
+ sum = sum + col.getWidth();
+ if (sum > e.x) {
+ break;
+ }
+ count++;
+ }
+ handleDoubleClick(getTree().getColumn(columnOrder[count]), getTree().getItem(new Point(e.x, e.y)));
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ }
+ });
+ getTree().setMenu(getMenuManager().getMenu());
+ columnFilterDataUI.createWidgets();
+
+ customizeMgr.loadCustomization();
+ }
+
+ /**
+ * @param col
+ */
+ public void handleDoubleClick(TreeColumn col, TreeItem item) {
+ }
+
+ public void handleDoubleClick() {
+ }
+
+ public int getCurrentColumnWidth(XViewerColumn xCol) {
+ for (TreeColumn col : getTree().getColumns()) {
+ if (col.getText().equals(xCol.getName())) {
+ return col.getWidth();
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ protected void inputChanged(Object input, Object oldInput) {
+ super.inputChanged(input, oldInput);
+ updateStatusLabel();
+ }
+
+ /**
+ * Will be called when Alt-Left-Click is done within table cell
+ *
+ * @param treeColumn
+ * @param treeItem
+ * @return true if handled
+ */
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ return false;
+ }
+
+ /**
+ * Will be called when click is within the first 18 pixels of the cell rectangle where the icon would be. This method
+ * will be called in addition to handleLeftClick since both are true.
+ *
+ * @param treeColumn
+ * @param treeItem
+ * @return true if handled
+ */
+ public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+ return false;
+ }
+
+ /**
+ * Will be called when a cell obtains a mouse left-click. This method will be called in addition to
+ * handleLeftClickInIconArea if both are true
+ *
+ * @param treeColumn
+ * @param treeItem
+ * @return true if handled
+ */
+ public boolean handleLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ return false;
+ }
+
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ }
+
+ public boolean isColumnMultiEditable(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ if (!isColumnMultiEditEnabled()) return false;
+ if (!(treeColumn.getData() instanceof XViewerColumn)) return false;
+ return (!((XViewerColumn) treeColumn.getData()).isMultiColumnEditable());
+ }
+
+ public XViewerColumn getXTreeColumn(int columnIndex) {
+ return (XViewerColumn) getTree().getColumn(columnIndex).getData();
+ }
+
+ // Only create one listener for all XViewers
+ private void setupCtrlKeyListener() {
+ if (ctrlKeyListenersSet == false) {
+ ctrlKeyListenersSet = true;
+ Display.getCurrent().addFilter(SWT.KeyDown, displayKeysListener);
+ Display.getCurrent().addFilter(SWT.KeyUp, displayKeysListener);
+ Display.getCurrent().addFilter(SWT.FocusOut, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ // Clear when focus is lost
+ ctrlKeyDown = false;
+ altKeyDown = false;
+ }
+ });
+ }
+ }
+ Listener displayKeysListener = new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ if (event.keyCode == SWT.CTRL) {
+ if (event.type == SWT.KeyDown) {
+ ctrlKeyDown = true;
+ } else if (event.type == SWT.KeyUp) {
+ ctrlKeyDown = false;
+ }
+ }
+ if (event.keyCode == SWT.ALT) {
+ if (event.type == SWT.KeyDown) {
+ altKeyDown = true;
+ } else if (event.type == SWT.KeyUp) {
+ altKeyDown = false;
+ }
+ }
+ }
+ };
+
+ public void resetDefaultSorter() {
+ customizeMgr.resetDefaultSorter();
+ }
+
+ /**
+ * Override this method if need to perform other tasks upon remove
+ *
+ * @param objects
+ */
+ public void remove(Collection<Object> objects) {
+ super.remove(objects);
+ }
+
+ public void load(Collection<Object> objects) {
+ super.setInput(objects);
+ }
+
+ @Override
+ public void setSorter(ViewerSorter sorter) {
+ super.setSorter(sorter);
+ updateStatusLabel();
+ }
+
+ public MenuManager getMenuManager() {
+ return this.menuManager;
+ }
+
+ public int getVisibleItemCount(TreeItem items[]) {
+ int cnt = items.length;
+ for (TreeItem item : items)
+ if (item.getExpanded()) cnt += getVisibleItemCount(item.getItems());
+ return cnt;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.StructuredViewer#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (getTree() == null || getTree().isDisposed()) return;
+ super.refresh();
+ updateStatusLabel();
+ }
+
+ public boolean isFiltered() {
+ return getFilters().length > 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.StructuredViewer#refresh(boolean)
+ */
+ @Override
+ public void refresh(boolean updateLabels) {
+ super.refresh(updateLabels);
+ updateStatusLabel();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.StructuredViewer#refresh(java.lang.Object, boolean)
+ */
+ @Override
+ public void refresh(Object element, boolean updateLabels) {
+ super.refresh(element, updateLabels);
+ updateStatusLabel();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.StructuredViewer#refresh(java.lang.Object)
+ */
+ @Override
+ public void refresh(Object element) {
+ super.refresh(element);
+ updateStatusLabel();
+ }
+
+ /**
+ * Override this to add information to the status string. eg. extra filters etc.
+ *
+ * @return string to add
+ */
+ public String getStatusString() {
+ return "";
+ }
+
+ public void getStatusLine1(StringBuffer sb) {
+ int loadedNum = 0;
+ if (getRoot() != null && ((ITreeContentProvider) getContentProvider()) != null) {
+ loadedNum = ((ITreeContentProvider) getContentProvider()).getChildren(getRoot()).length;
+ }
+ sb.append(" " + loadedNum + " Loaded - " + getVisibleItemCount(getTree().getItems()) + " Shown - " + ((IStructuredSelection) getSelection()).size() + " Selected - ");
+ customizeMgr.getStatusLabelAddition(sb);
+ if (filterDataUI != null) {
+ filterDataUI.getStatusLabelAddition(sb);
+ }
+ columnFilterDataUI.getStatusLabelAddition(sb);
+ sb.append(getStatusString());
+ }
+
+ public void getStatusLine2(StringBuffer sb) {
+ customizeMgr.getSortingStr(sb);
+ }
+
+ public void updateStatusLabel() {
+ if (!xViewerFactory.isLoadedStatusLabelAvailable()) return;
+ if (getTree().isDisposed() || statusLabel.isDisposed()) return;
+ StringBuffer sb = new StringBuffer();
+ getStatusLine1(sb);
+ if (sb.length() > 0) {
+ sb.append("\n");
+ }
+ getStatusLine2(sb);
+ String str = sb.toString();
+ statusLabel.setText(str);
+ statusLabel.getParent().getParent().layout();
+ statusLabel.setToolTipText(str);
+ }
+
+ public String getViewerNamespace() {
+ return getXViewerFactory().getNamespace();
+ }
+
+ public IXViewerFactory getXViewerFactory() {
+ return xViewerFactory;
+ }
+
+ public Label getStatusLabel() {
+ return statusLabel;
+ }
+
+ /**
+ * @return the textFilterComp
+ */
+ public FilterDataUI getFilterDataUI() {
+ return filterDataUI;
+ }
+
+ public boolean isColumnMultiEditEnabled() {
+ return columnMultiEditEnabled;
+ }
+
+ public void setColumnMultiEditEnabled(boolean columnMultiEditEnabled) {
+ this.columnMultiEditEnabled = columnMultiEditEnabled;
+ }
+
+ /**
+ * @return the rightClickSelectedColumn
+ */
+ public TreeColumn getRightClickSelectedColumn() {
+ return rightClickSelectedColumn;
+ }
+
+ /**
+ * @return the rightClickSelectedItem
+ */
+ public TreeItem getRightClickSelectedItem() {
+ return rightClickSelectedItem;
+ }
+
+ public Integer getRightClickSelectedColumnNum() {
+ return rightClickSelectedColumnNum;
+ }
+
+ public CustomizeManager getCustomizeMgr() {
+ return customizeMgr;
+ }
+
+ public boolean isCtrlKeyDown() {
+ return ctrlKeyDown;
+ }
+
+ public boolean isAltKeyDown() {
+ return altKeyDown;
+ }
+
+ /**
+ * @param text
+ * @return
+ */
+ boolean searchMatch(String text) {
+ if (searchDataUI == null) return false;
+ return searchDataUI.match(text);
+ }
+
+ /**
+ * @return
+ */
+ Color getSearchMatchColor() {
+ return searchColor;
+ }
+
+ /**
+ * @return true if currently searching
+ */
+ public boolean isSearch() {
+ if (searchDataUI == null) return false;
+ return searchDataUI.isSearch();
+ }
+
+ public String getColumnText(Object element, int col) {
+ String returnVal = "";
+ if (getLabelProvider() instanceof XViewerLabelProvider) {
+ returnVal = ((XViewerLabelProvider) getLabelProvider()).getColumnText(element, col);
+ } else {
+ returnVal = ((XViewerStyledTextLabelProvider) getLabelProvider()).getStyledText(element, col).getString();
+ }
+ return returnVal;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerCells.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerCells.java
new file mode 100644
index 00000000000..5748f1cc0b1
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerCells.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.nebula.widgets.xviewer;
+
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerCells {
+
+ public static String getCellExceptionString(String message) {
+ return CELL_ERROR_PREFIX + " - " + message;
+ }
+
+ public static String getCellExceptionString(Exception ex) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex);
+ return CELL_ERROR_PREFIX + " - " + ex.getLocalizedMessage();
+ }
+
+ public static final String CELL_ERROR_PREFIX = "!Error";
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumn.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumn.java
new file mode 100644
index 00000000000..873bd645e10
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumn.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.nebula.widgets.xviewer;
+
+import org.eclipse.nebula.widgets.xviewer.util.internal.XmlUtil;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerColumn {
+
+ private XViewer xViewer;
+ private String id;
+ private String name = "";
+ private String description;
+ private boolean multiColumnEditable = false;
+ private int width;
+ private int align;
+ private boolean sortForward = true; // if true, sort alphabetically; else reverse
+ private boolean show = true;
+ private SortDataType sortDataType = SortDataType.String;
+ private String toolTip = "";
+ public enum SortDataType {
+ Date, Float, Percent, String, String_MultiLine, Boolean, Integer, Paragraph_Number
+ };
+
+ public XViewerColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.width = width;
+ this.align = align;
+ this.show = show;
+ this.sortDataType = sortDataType;
+ this.multiColumnEditable = multiColumnEditable;
+ this.description = description;
+ this.toolTip = this.name;
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerColumn need to extend this method to copy extra stored fields
+ *
+ * @param col
+ */
+ public XViewerColumn copy() {
+ return new XViewerColumn(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ public XViewerColumn(XViewer xViewer, String xml) {
+ this.xViewer = xViewer;
+ setFromXml(xml);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof XViewerColumn) {
+ return ((XViewerColumn) obj).getId().equals(id);
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return getId().hashCode();
+ }
+
+ public static String ID = "id";
+ public static String NAME = "name";
+ public static String WIDTH = "wdth";
+ public static String ALIGN = "algn";
+ public static String SORT_FORWARD = "srtFwd";
+ public static String SHOW = "show";
+ public static String XTREECOLUMN_TAG = "xCol";
+
+ public String toXml() {
+ StringBuffer sb = new StringBuffer("<" + XTREECOLUMN_TAG + ">");
+ sb.append(XmlUtil.addTagData(ID, id));
+ sb.append(XmlUtil.addTagData(NAME, name));
+ sb.append(XmlUtil.addTagData(WIDTH, width + ""));
+ sb.append(XmlUtil.addTagData(ALIGN, getAlignStoreName(align)));
+ sb.append(XmlUtil.addTagData(SORT_FORWARD, sortForward + ""));
+ sb.append(XmlUtil.addTagData(SHOW, show + ""));
+ sb.append("</" + XTREECOLUMN_TAG + ">");
+ return sb.toString();
+ }
+
+ public void setFromXml(String xml) {
+ id = XmlUtil.getTagData(xml, ID);
+ name = XmlUtil.getTagData(xml, NAME);
+ width = XmlUtil.getTagIntData(xml, WIDTH);
+ align = getAlignStoreValue(XmlUtil.getTagData(xml, ALIGN));
+ sortForward = XmlUtil.getTagBooleanData(xml, SORT_FORWARD);
+ show = XmlUtil.getTagBooleanData(xml, SHOW);
+ }
+
+ public static String getColumnId(String xml) {
+ return XmlUtil.getTagData(xml, ID);
+ }
+
+ public String getAlignStoreName(int align) {
+ if (align == SWT.CENTER)
+ return "center";
+ else if (align == SWT.RIGHT)
+ return "right";
+ else
+ return "left";
+ }
+
+ public int getAlignStoreValue(String str) {
+ if (str.equals("center"))
+ return SWT.CENTER;
+ else if (str.equals("right"))
+ return SWT.RIGHT;
+ else
+ return SWT.LEFT;
+ }
+
+ public String getDisplayName() {
+ return name + " - " + id + " - width:" + width + " - show:" + show;
+ }
+
+ @Override
+ public String toString() {
+ return "column:[" + name + "][" + id + "][" + width + "][" + show + "][" + align + "]";
+ }
+
+ public int getAlign() {
+ return align;
+ }
+
+ public void setAlign(int align) {
+ this.align = align;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public XViewer getTreeViewer() {
+ return xViewer;
+ }
+
+ public boolean isSortForward() {
+ return sortForward;
+ }
+
+ public void setSortForward(boolean sortForward) {
+ this.sortForward = sortForward;
+ }
+
+ public void reverseSort() {
+ setSortForward(!sortForward);
+ }
+
+ public boolean isShow() {
+ return show;
+ }
+
+ public void setShow(boolean show) {
+ this.show = show;
+ }
+
+ /**
+ * @return alternateName if exists, otherwise systemName
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the sortDataType
+ */
+ public SortDataType getSortDataType() {
+ return sortDataType;
+ }
+
+ /**
+ * @param sortDataType the sortDataType to set
+ */
+ public void setSortDataType(SortDataType sortDataType) {
+ this.sortDataType = sortDataType;
+ }
+
+ /**
+ * @param treeViewer the treeViewer to set
+ */
+ public void setXViewer(XViewer treeViewer) {
+ this.xViewer = treeViewer;
+ }
+
+ /**
+ * @return the toolTip
+ */
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ /**
+ * @param toolTip the toolTip to set
+ */
+ public void setToolTip(String toolTip) {
+ if (toolTip != null) this.toolTip = toolTip;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ this.toolTip = getName() + ":\n" + getDescription();
+ }
+
+ public boolean isMultiColumnEditable() {
+ return multiColumnEditable;
+ }
+
+ public void setMultiColumnEditable(boolean multiColumnEditable) {
+ this.multiColumnEditable = multiColumnEditable;
+ }
+
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnLabelProvider.java
new file mode 100644
index 00000000000..ef586b64b08
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnLabelProvider.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.nebula.widgets.xviewer;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerColumnLabelProvider implements ILabelProvider {
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ if (!(element instanceof XViewerColumn)) return "";
+ XViewerColumn xCol = (XViewerColumn) element;
+ return xCol.getDisplayName();
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnSorter.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnSorter.java
new file mode 100644
index 00000000000..f3ee404212c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerColumnSorter.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.nebula.widgets.xviewer;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.widgets.TreeColumn;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerColumnSorter extends ViewerSorter {
+
+ public XViewerColumnSorter() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof XViewerColumn) {
+ return getComparator().compare(((XViewerColumn) e1).toString(), ((XViewerColumn) e2).toString());
+ } else if ((e1 instanceof TreeColumn) && ((TreeColumn) e1).getData() instanceof XViewerColumn) {
+
+ return getComparator().compare(((XViewerColumn) ((TreeColumn) e1).getData()).toString(),
+ ((XViewerColumn) ((TreeColumn) e2).getData()).toString());
+ } else
+ return 0;
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerFactory.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerFactory.java
new file mode 100644
index 00000000000..2e04607b3d1
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerFactory.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomMenu;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomizations;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XViewerFactory implements IXViewerFactory {
+
+ private String namespace;
+
+ /**
+ * @param namespace the namespace to set
+ */
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ private final List<XViewerColumn> columns = new ArrayList<XViewerColumn>();
+ private final Map<String, XViewerColumn> idToColumn = new HashMap<String, XViewerColumn>();
+
+ public XViewerFactory(String namespace) {
+ this.namespace = namespace;
+ }
+
+ public void registerColumn(XViewerColumn... columns) {
+ if (columns.length == 0) throw new IllegalArgumentException("columns can't be null");
+ for (XViewerColumn xCol : columns) {
+ if (!columnRegistered(xCol)) {
+ this.columns.add(xCol);
+ idToColumn.put(xCol.getId(), xCol);
+ }
+ }
+ }
+
+ public boolean columnRegistered(XViewerColumn column) {
+ return this.columns.contains(column);
+ }
+
+ public void clearColumnRegistration() {
+ this.columns.clear();
+ idToColumn.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#createNewXSorter(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer)
+ */
+ @Override
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new XViewerSorter(xViewer);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#getDefaultTableCustomizeData(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer)
+ */
+ @Override
+ public CustomizeData getDefaultTableCustomizeData() {
+ CustomizeData custData = new CustomizeData();
+ custData.setNameSpace(namespace);
+ custData.getColumnData().setColumns(getColumns());
+ return custData;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#getDefaultXViewerColumn(java.lang.String)
+ */
+ @Override
+ public XViewerColumn getDefaultXViewerColumn(String id) {
+ // Return a copy so don't corrupt original definition of column
+ XViewerColumn col = idToColumn.get(id);
+ if (col == null) return null;
+ return col.copy();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#getXViewerCustomizations(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer)
+ */
+ @Override
+ public IXViewerCustomizations getXViewerCustomizations() {
+ return new XViewerCustomizations();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#getXViewerCustomMenu()
+ */
+ @Override
+ public XViewerCustomMenu getXViewerCustomMenu() {
+ return new XViewerCustomMenu();
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public List<XViewerColumn> getColumns() {
+ // Return a copy so don't corrupt original definition of column
+ List<XViewerColumn> columnCopy = new ArrayList<XViewerColumn>();
+ for (XViewerColumn xCol : columns) {
+ columnCopy.add(xCol.copy());
+ }
+ return columnCopy;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.IXViewerFactory#getXViewerTreeReport(org.eclipse.nebula.widgets.xviewer.XViewer)
+ */
+ @Override
+ public XViewerTreeReport getXViewerTreeReport(XViewer viewer) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isFilterUiAvailable()
+ */
+ @Override
+ public boolean isFilterUiAvailable() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isHeaderBarAvailable()
+ */
+ @Override
+ public boolean isHeaderBarAvailable() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isLoadedStatusLabelAvailable()
+ */
+ @Override
+ public boolean isLoadedStatusLabelAvailable() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isSearchUiAvailable()
+ */
+ @Override
+ public boolean isSearchUiAvailable() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerLabelProvider.java
new file mode 100644
index 00000000000..f94426ac819
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerLabelProvider.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.nebula.widgets.xviewer;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ITableColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XViewerLabelProvider implements ITableLabelProvider, ITableColorProvider {
+
+ private final XViewer viewer;
+
+ // Store index of columnIndex to XViewerColumns to speed up label providing
+ private final Map<Integer, XViewerColumn> indexToXViewerColumnMap = new HashMap<Integer, XViewerColumn>();
+
+ private XViewerColumn getTreeColumnOffIndex(int columnIndex) {
+ if (!indexToXViewerColumnMap.containsKey(columnIndex)) {
+ XViewerColumn xViewerColumn = viewer.getXTreeColumn(columnIndex);
+ if (xViewerColumn != null) {
+ indexToXViewerColumnMap.put(columnIndex, xViewerColumn);
+ }
+ }
+ return indexToXViewerColumnMap.get(columnIndex);
+ }
+
+ // When columns get re-ordered, need to clear out this cache so indexing can be re-computed
+ public void clearXViewerColumnIndexCache() {
+ indexToXViewerColumnMap.clear();
+ }
+
+ /**
+ * @param viewer
+ */
+ public XViewerLabelProvider(final XViewer viewer) {
+ super();
+ this.viewer = viewer;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn != null) {
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ Image image = ((XViewerValueColumn) xViewerColumn).getColumnImage(element, xViewerColumn, columnIndex);
+ if (image != null) return image;
+ }
+ return getColumnImage(element, xViewerColumn, columnIndex);
+ }
+ } catch (Exception ex) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return "";
+ // First check value column's methods
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ String str = ((XViewerValueColumn) xViewerColumn).getColumnText(element, xViewerColumn, columnIndex);
+ if (str != null) return str;
+ return "";
+ }
+ // Return label provider's value
+ return getColumnText(element, xViewerColumn, columnIndex);
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ }
+
+ @Override
+ public Color getBackground(Object element, int columnIndex) {
+ try {
+ if (viewer.isSearch()) {
+ String text = getColumnText(element, columnIndex);
+ if (viewer.searchMatch(text)) {
+ return viewer.getSearchMatchColor();
+ }
+ }
+
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ Color color = ((XViewerValueColumn) xViewerColumn).getBackground(element, xViewerColumn, columnIndex);
+ if (color != null) return color;
+ }
+ return getBackground(element, xViewerColumn, columnIndex);
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ @Override
+ public Color getForeground(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ Color color = ((XViewerValueColumn) xViewerColumn).getForeground(element, xViewerColumn, columnIndex);
+ if (color != null) return color;
+ }
+ return getForeground(element, xViewerColumn, columnIndex);
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ public Color getBackground(Object element, XViewerColumn xCol, int columnIndex) {
+ return null;
+ }
+
+ public Color getForeground(Object element, XViewerColumn xCol, int columnIndex) {
+ return null;
+ }
+
+ public abstract Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws Exception;
+
+ public abstract String getColumnText(Object element, XViewerColumn xCol, int columnIndex) throws Exception;
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerSorter.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerSorter.java
new file mode 100644
index 00000000000..1171faf2507
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerSorter.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+
+/**
+ * XTreeSorter is equipped to: 1) Sort columns forward and backward by re-selecting the column 2) Sort by multiple
+ * columns
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerSorter extends ViewerSorter {
+ private final XViewer treeViewer;
+ private final static SimpleDateFormat format10 = new SimpleDateFormat("MM/dd/yyyy");
+
+ public XViewerSorter(XViewer treeViewer) {
+ super();
+ this.treeViewer = treeViewer;
+ }
+
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2, int sortXColIndex) {
+ if (treeViewer.getCustomizeMgr().isLoading()) return 0;
+ List<XViewerColumn> sortXCols = treeViewer.getCustomizeMgr().getSortXCols();
+ if (sortXCols == null || sortXCols.size() == 0) return 0;
+ XViewerColumn sortXCol = sortXCols.get(sortXColIndex);
+ try {
+ int columnNum = treeViewer.getCustomizeMgr().getColumnNumFromXViewerColumn(sortXCol);
+
+ String o1Str = treeViewer.getColumnText(o1, columnNum);
+ String o2Str = treeViewer.getColumnText(o2, columnNum);
+
+ // System.out.println("sortForward.get(columnNum) *" +
+ // sortXCol.isSortForward() + "*");
+ int compareInt = 0;
+ if (o1Str == null)
+ compareInt = -1;
+ else if (o2Str == null)
+ compareInt = 1;
+ else if (sortXCol.getSortDataType() == SortDataType.Date)
+ compareInt = getCompareForDate(o1Str, o2Str);
+ else if (sortXCol.getSortDataType() == SortDataType.Percent)
+ compareInt = getCompareForPercent(o1Str, o2Str);
+ else if (sortXCol.getSortDataType() == SortDataType.Float)
+ compareInt = getCompareForFloat(o1Str, o2Str);
+ else if (sortXCol.getSortDataType() == SortDataType.Integer)
+ compareInt = getCompareForInteger(o1Str, o2Str);
+ else if (sortXCol.getSortDataType() == SortDataType.Paragraph_Number)
+ compareInt = paragraphNumberCompare(o1Str, o2Str);
+ else
+ compareInt = getComparator().compare(o1Str, o2Str);
+
+ return getCompareBasedOnDirection(sortXCol, compareInt, viewer, o1, o2, sortXColIndex);
+ } catch (Exception ex) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return 0;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ return compare(viewer, o1, o2, 0);
+ }
+
+ public int paragraphNumberCompare(String s1, String s2) {
+ StringTokenizer st1 = new StringTokenizer(s1, ".");
+ StringTokenizer st2 = new StringTokenizer(s2, ".");
+ while (st1.hasMoreTokens() && st2.hasMoreTokens()) {
+ String t1 = st1.nextToken();
+ String t2 = st2.nextToken();
+
+ int result;
+ try {
+ Integer i1 = new Integer(t1);
+ Integer i2 = new Integer(t2);
+ result = i1.compareTo(i2);
+ } catch (NumberFormatException e) {
+ result = t1.compareTo(t2);
+ }
+ if (result != 0) {
+ return result;
+ }
+ }
+
+ return s1.compareTo(s2);
+ }
+
+ public int getCompareBasedOnDirection(XViewerColumn sortXCol, int compareInt, Viewer viewer, Object o1, Object o2, int sortXColIndex) {
+ List<XViewerColumn> sortXCols = treeViewer.getCustomizeMgr().getSortXCols();
+ int returnInt = (sortXCol.isSortForward() ? 1 : -1) * compareInt;
+ // System.out.println("returnInt *" + returnInt + "*");
+ if (returnInt == 0 && sortXCols.size() > (sortXColIndex + 1)) {
+ returnInt = compare(viewer, o1, o2, (sortXColIndex + 1));
+ }
+ return returnInt;
+ }
+
+ public int getCompareForFloat(String float1, String float2) {
+ double float1Float = 0;
+ try {
+ float1Float = (new Double(float1)).doubleValue();
+ } catch (NumberFormatException ex) {
+ return 0;
+ }
+ double float2Float = 0;
+ try {
+ float2Float = (new Double(float2)).doubleValue();
+ } catch (NumberFormatException ex) {
+ return 1;
+ }
+ return getCompareForFloat(float1Float, float2Float);
+ }
+
+ public int getCompareForInteger(String int1, String int2) {
+ int int1Integer = 0;
+ try {
+ int1Integer = (new Integer(int1)).intValue();
+ } catch (NumberFormatException ex) {
+ return 0;
+ }
+ int int2Integer = 0;
+ try {
+ int2Integer = (new Integer(int2)).intValue();
+ } catch (NumberFormatException ex) {
+ return 1;
+ }
+ return getCompareForInteger(int1Integer, int2Integer);
+ }
+
+ public static int getCompareForFloat(double float1, double float2) {
+ if (float1 == float2)
+ return 0;
+ else if (float1 == 0 || float1 < float2)
+ return -1;
+ else if (float2 == 0 || float2 < float1)
+ return 1;
+ else
+ return 0;
+ }
+
+ public static int getCompareForInteger(int int1, int int2) {
+ if (int1 == int2)
+ return 0;
+ else if (int1 == 0 || int1 < int2)
+ return -1;
+ else if (int2 == 0 || int2 < int1)
+ return 1;
+ else
+ return 0;
+ }
+
+ public int getCompareForDate(String date1, String date2) {
+ if (date1.trim().equals("")) return -1;
+ if (date2.trim().equals("")) return 1;
+ DateFormat format;
+ if (date1.length() == 10) {
+ format = format10;
+ } else {
+ format = SimpleDateFormat.getInstance();
+ }
+ Date date1Date = null;
+ try {
+ date1Date = format.parse(date1);
+ } catch (ParseException ex) {
+ try {
+ date1Date = SimpleDateFormat.getInstance().parse(date1);
+ } catch (ParseException ex2) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex2);
+ return 0;
+ }
+ }
+ Date date2Date = null;
+ try {
+ date2Date = format.parse(date2);
+ } catch (ParseException ex) {
+ try {
+ date2Date = SimpleDateFormat.getInstance().parse(date2);
+ } catch (ParseException ex2) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex2);
+ return 0;
+ }
+ }
+ return getCompareForDate(date1Date, date2Date);
+ }
+
+ public int getCompareForDate(Date date1, Date date2) {
+ return date1.compareTo(date2);
+ }
+
+ public int getCompareForPercent(String percent1, String percent2) {
+ int percent1Int = 0;
+ try {
+ percent1Int = (new Integer(percent1)).intValue();
+ } catch (NumberFormatException ex) {
+ percent1Int = -1;
+ }
+ int percent2Int = 0;
+ try {
+ percent2Int = (new Integer(percent2)).intValue();
+ } catch (NumberFormatException ex) {
+ percent2Int = 1;
+ }
+ return getCompareForPercent(percent1Int, percent2Int);
+ }
+
+ @SuppressWarnings("unchecked")
+ public int getCompareForPercent(int percent1, int percent2) {
+ int compareInt = 0;
+ if (percent1 == percent2)
+ compareInt = 0;
+ else if (percent1 == 0)
+ compareInt = -1;
+ else if (percent2 == 0)
+ compareInt = 1;
+ else if (percent1 == 100)
+ compareInt = 1;
+ else if (percent2 == 100)
+ compareInt = -1;
+ else
+ compareInt = getComparator().compare(String.valueOf(percent1), String.valueOf(percent2));
+ return compareInt;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerStyledTextLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerStyledTextLabelProvider.java
new file mode 100644
index 00000000000..71d339bf356
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerStyledTextLabelProvider.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XViewerStyledTextLabelProvider extends StyledCellLabelProvider {
+
+ private final XViewer viewer;
+
+ // Store index of columnIndex to XViewerColumns to speed up label providing
+ private final Map<Integer, XViewerColumn> indexToXViewerColumnMap = new HashMap<Integer, XViewerColumn>();
+
+ private XViewerColumn getTreeColumnOffIndex(int columnIndex) {
+ if (!indexToXViewerColumnMap.containsKey(columnIndex)) {
+ XViewerColumn xViewerColumn = viewer.getXTreeColumn(columnIndex);
+ if (xViewerColumn != null) {
+ indexToXViewerColumnMap.put(columnIndex, xViewerColumn);
+ }
+ }
+ return indexToXViewerColumnMap.get(columnIndex);
+ }
+
+ // When columns get re-ordered, need to clear out this cache so indexing can
+ // be re-computed
+ public void clearXViewerColumnIndexCache() {
+ indexToXViewerColumnMap.clear();
+ }
+
+ /**
+ * Creates a {@link XViewerStyledTextLabelProvider} that delegates the requests for the styled labels and the images
+ * to a {@link IStyledLabelProvider}.
+ *
+ * @param labelProvider the label provider that provides the styled labels and the images
+ */
+ public XViewerStyledTextLabelProvider(XViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.
+ * jface.viewers.ViewerCell)
+ */
+ @Override
+ public void update(ViewerCell cell) {
+ Object element = cell.getElement();
+
+ StyledString styledString = getStyledText(element, cell.getColumnIndex());
+ String newText = styledString.toString();
+
+ StyleRange[] oldStyleRanges = cell.getStyleRanges();
+ StyleRange[] newStyleRanges = isOwnerDrawEnabled() ? styledString.getStyleRanges() : null;
+
+ if (!Arrays.equals(oldStyleRanges, newStyleRanges)) {
+ cell.setStyleRanges(newStyleRanges);
+ // if (cell.getText().equals(newText)) {
+ // // make sure there will be a refresh from a change
+ // cell.setText(""); //$NON-NLS-1$
+ // }
+ }
+
+ cell.setText(newText);
+ cell.setImage(getColumnImage(element, cell.getColumnIndex()));
+ cell.setFont(getFont(element, cell.getColumnIndex()));
+ cell.setForeground(getForeground(element, cell.getColumnIndex()));
+ cell.setBackground(getBackground(element, cell.getColumnIndex()));
+
+ // no super call required. changes on item will trigger the refresh.
+ }
+
+ /**
+ * @param element
+ * @param columnIndex
+ * @return
+ */
+ private Font getFont(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ return ((XViewerValueColumn) xViewerColumn).getFont(element, xViewerColumn, columnIndex);
+ } else {
+ return getFont(element, xViewerColumn, columnIndex);
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn != null) {
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ Image image = ((XViewerValueColumn) xViewerColumn).getColumnImage(element, xViewerColumn, columnIndex);
+ if (image != null) return image;
+ }
+ return getColumnImage(element, xViewerColumn, columnIndex);
+ }
+ } catch (Exception ex) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ StyledString getStyledText(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return new StyledString("");
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ return ((XViewerValueColumn) xViewerColumn).getStyledText(element, xViewerColumn, columnIndex);
+ }
+ return getStyledText(element, xViewerColumn, columnIndex);
+ } catch (Exception ex) {
+ return new StyledString(XViewerCells.getCellExceptionString(ex));
+ }
+ }
+
+ private Color getBackground(Object element, int columnIndex) {
+ try {
+
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+
+ if (viewer.isSearch()) {
+ StyledString text = getStyledText(element, columnIndex);
+ if (viewer.searchMatch(text.getString())) {
+ return viewer.getSearchMatchColor();
+ }
+ }
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ return ((XViewerValueColumn) xViewerColumn).getBackground(element, xViewerColumn, columnIndex);
+ } else {
+ return getBackground(element, xViewerColumn, columnIndex);
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ /**
+ * @param element
+ * @param viewerColumn
+ * @param columnIndex
+ * @return
+ */
+
+ private Color getForeground(Object element, int columnIndex) {
+ try {
+ XViewerColumn xViewerColumn = getTreeColumnOffIndex(columnIndex);
+ // If not shown, don't process any further
+ if (!xViewerColumn.isShow()) return null;
+ if (xViewerColumn instanceof XViewerValueColumn) {
+ return ((XViewerValueColumn) xViewerColumn).getForeground(element, xViewerColumn, columnIndex);
+ } else {
+ return getForeground(element, xViewerColumn, columnIndex);
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ public abstract Image getColumnImage(Object element, XViewerColumn xCol, int column) throws Exception;
+
+ public abstract StyledString getStyledText(Object element, XViewerColumn xCol, int column) throws Exception;
+
+ public abstract Color getBackground(Object element, XViewerColumn viewerColumn, int columnIndex) throws Exception;
+
+ public abstract Color getForeground(Object element, XViewerColumn viewerColumn, int columnIndex) throws Exception;
+
+ public abstract Font getFont(Object element, XViewerColumn viewerColumn, int columnIndex) throws Exception;
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTextFilter.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTextFilter.java
new file mode 100644
index 00000000000..8379e81672c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTextFilter.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.nebula.widgets.xviewer;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerTextFilter extends ViewerFilter {
+
+ private final XViewer xViewer;
+ // private ITableLabelProvider labelProv;
+ private Pattern textPattern;
+ private Matcher matcher;
+ private final Map<String, Pattern> colIdToPattern = new HashMap<String, Pattern>();
+
+ public XViewerTextFilter(XViewer xViewer) {
+ this.xViewer = xViewer;
+ }
+
+ /**
+ * Setup all patterns for text and column text filters
+ */
+ public void update() {
+ // Update text filter pattern
+ if (xViewer.getCustomizeMgr().getFilterText() == null || xViewer.getCustomizeMgr().getFilterText().equals("")) {
+ textPattern = null;
+ } else {
+ textPattern =
+ Pattern.compile(xViewer.getCustomizeMgr().getFilterText(), Pattern.LITERAL | Pattern.CASE_INSENSITIVE);
+ }
+ // Update column filter patterns
+ colIdToPattern.clear();
+ for (String colId : xViewer.getCustomizeMgr().getColumnFilterData().getColIds()) {
+ String colFilterText = xViewer.getCustomizeMgr().getColumnFilterText(colId);
+ if (colFilterText != null) {
+ boolean isNot = colFilterText.startsWith("!");
+ if (isNot) {
+ colFilterText = colFilterText.replaceFirst("^!", "");
+ }
+ // Handle != case ^(.(?<!big))*$
+ if (isNot) {
+ if (colFilterText.equals("")) {
+ colIdToPattern.put(colId, NOT_EMPTY_STR_PATTERN);
+ } else {
+ colIdToPattern.put(colId, Pattern.compile("^(.(?<!" + colFilterText + "))*$",
+ Pattern.CASE_INSENSITIVE));
+ }
+ }
+ // Handle normal case
+ else {
+ if (colFilterText.equals("")) {
+ colIdToPattern.put(colId, EMPTY_STR_PATTERN);
+ } else {
+ colIdToPattern.put(colId, Pattern.compile(
+ xViewer.getCustomizeMgr().getColumnFilterData().getFilterText(colId), Pattern.CASE_INSENSITIVE));
+ }
+ }
+ }
+ }
+ }
+ private static final Pattern EMPTY_STR_PATTERN = Pattern.compile("");
+ private static final Pattern NOT_EMPTY_STR_PATTERN = Pattern.compile("^.+$");
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (textPattern == null && colIdToPattern.size() == 0) return true;
+ // if (labelProv == null) labelProv = (ITableLabelProvider) xViewer.getLabelProvider();
+ boolean match = true;
+ // Must match all column filters or don't show
+ for (String filteredColId : xViewer.getCustomizeMgr().getColumnFilterData().getColIds()) {
+ XViewerColumn xCol = xViewer.getCustomizeMgr().getCurrentTableColumn(filteredColId);
+ if (xCol.isShow()) {
+ // Check column filters
+ if (colIdToPattern.keySet().contains(xCol.getId())) {
+ String cellStr =
+ xViewer.getColumnText(element, xViewer.getCustomizeMgr().getColumnNumFromXViewerColumn(xCol));
+ if (cellStr != null) {
+ matcher = colIdToPattern.get(xCol.getId()).matcher(cellStr);
+ if (!matcher.find()) {
+ return false;
+ }
+ }
+ }
+ }
+ }
+ if (!match) return false;
+
+ // Must match at least one column for filter text
+ if (textPattern == null) {
+ return match;
+ }
+ if (textPattern != null) {
+ for (XViewerColumn xCol : xViewer.getCustomizeMgr().getCurrentTableColumns()) {
+ if (xCol.isShow()) {
+ // Check text filter
+ String cellStr =
+ xViewer.getColumnText(element, xViewer.getCustomizeMgr().getColumnNumFromXViewerColumn(xCol));
+ if (cellStr != null) {
+ matcher = textPattern.matcher(cellStr);
+ if (matcher.find()) return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTreeReport.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTreeReport.java
new file mode 100644
index 00000000000..d705e1c9169
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerTreeReport.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.nebula.widgets.xviewer;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.nebula.widgets.xviewer.util.internal.HtmlUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerTreeReport {
+
+ protected final XViewer xViewer;
+ protected final String title;
+
+ public XViewerTreeReport(String title, XViewer treeViewer) {
+ this.title = title;
+ this.xViewer = treeViewer;
+ }
+
+ public XViewerTreeReport(XViewer xViewer) {
+ this("Table View Report", xViewer);
+ }
+
+ public void open() {
+ open(xViewer.getTree().getItems());
+ }
+
+ public void open(TreeItem items[]) {
+ try {
+ String html = getHtml(items);
+ final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.SAVE);
+ dialog.setFilterExtensions(new String[] {"*.html"});
+ String filename = dialog.open();
+ if (filename == null || filename.equals("")) {
+ return;
+ }
+ try {
+ XViewerLib.writeStringToFile(html, new File(filename));
+ } catch (IOException ex) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex);
+ return;
+ }
+ Program.launch(filename);
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ private Map<XViewerColumn, Integer> xColToColumnIndex = null;
+
+ public String getHtml(TreeItem items[]) throws XViewerException {
+ StringBuffer sb = new StringBuffer("<html><body>");
+ sb.append(HtmlUtil.beginMultiColumnTable(100, 1));
+ List<XViewerColumn> columns = xViewer.getCustomizeMgr().getCurrentTableColumnsInOrder();
+ List<String> headerStrs = new ArrayList<String>(50);
+ List<XViewerColumn> showCols = new ArrayList<XViewerColumn>(50);
+ xColToColumnIndex = xViewer.getCustomizeMgr().getCurrentTableColumnsIndex();
+ for (XViewerColumn xCol : columns) {
+ if (xCol.isShow()) {
+ showCols.add(xCol);
+ headerStrs.add(xCol.getName());
+ }
+ }
+ sb.append(HtmlUtil.addHeaderRowMultiColumnTable(headerStrs.toArray(new String[headerStrs.size()])));
+ // Get column widths and column name and setup the columns
+ XViewerLabelProvider labelProv = (XViewerLabelProvider) xViewer.getLabelProvider();
+ ArrayList<String[]> list = new ArrayList<String[]>();
+ for (TreeItem item : items) {
+ addRow(item, list, labelProv, showCols, 1);
+ }
+ for (String[] strs : list) {
+ sb.append(HtmlUtil.addRowMultiColumnTable(strs));
+ }
+ sb.append(HtmlUtil.endMultiColumnTable());
+ sb.append("</body></html>");
+ return sb.toString();
+ }
+
+ private void addRow(TreeItem item, ArrayList<String[]> rowData, XViewerLabelProvider labelProv, List<XViewerColumn> showCols, int level) throws XViewerException {
+ List<String> cellData = new ArrayList<String>(showCols.size());
+ boolean firstCell = true;
+ for (XViewerColumn xCol : showCols) {
+ String str = "";
+ if (firstCell) {
+ for (int y = 1; y < level; y++) {
+ str += "&nbsp;&nbsp;&nbsp;&nbsp;";
+ }
+ firstCell = false;
+ }
+ str += labelProv.getColumnText(item.getData(), xColToColumnIndex.get(xCol));
+ cellData.add(HtmlUtil.textToHtml(str));
+ }
+ rowData.add(cellData.toArray(new String[cellData.size()]));
+ if (item.getExpanded()) {
+ for (TreeItem i : item.getItems()) {
+ addRow(i, rowData, labelProv, showCols, level + 1);
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerValueColumn.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerValueColumn.java
new file mode 100644
index 00000000000..c650821390c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/XViewerValueColumn.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.nebula.widgets.xviewer;
+
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * This class provides XViewerColumns another mechanism to providing text, background color and foreground color instead
+ * of through the XViewerLabelProvider. XViewerLabelProvider will call the provided routines to try to populate the
+ * column and only if null/empty string will default to the normal label provider methods. This allows for XViwerColumns
+ * to be shared between XViewers and/or have XViewerColumns provide their own values through the same class that defines
+ * the column.
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerValueColumn extends XViewerColumn {
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn MUST extend this constructor so the correct sub-class is created
+ *
+ * @param col
+ */
+ @Override
+ public XViewerValueColumn copy() {
+ return new XViewerValueColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ public XViewerValueColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ public XViewerValueColumn(XViewer viewer, String xml) {
+ super(viewer, xml);
+ }
+
+ public Image getColumnImage(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ return "unhandled";
+ }
+
+ public Color getBackground(Object element, XViewerColumn xCol, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+ public Color getForeground(Object element, XViewerColumn xCol, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+ //This method will only be called be the XViewerStyledTextLabelProvider
+ public StyledString getStyledText(Object element, XViewerColumn viewerColumn, int columnIndex) throws XViewerException {
+ return new StyledString(getColumnText(element, viewerColumn, columnIndex));
+ }
+
+ //This method will only be called be the XViewerStyledTextLabelProvider
+ public Font getFont(Object element, XViewerColumn viewerColumn, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnData.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnData.java
new file mode 100644
index 00000000000..9bfc77ed3b9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnData.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.nebula.widgets.xviewer.customize;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+
+/**
+ * Provides for xml packing/unpacking of columns
+ *
+ * @author Donald G. Dunne
+ */
+public class ColumnData {
+
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>();
+ Map<String, XViewerColumn> idToColumn = new HashMap<String, XViewerColumn>();
+
+ public List<XViewerColumn> setFromXml(String xml) {
+ columns.clear();
+ Matcher columnMatch =
+ Pattern.compile("<" + XViewerColumn.XTREECOLUMN_TAG + ">(.*?)</" + XViewerColumn.XTREECOLUMN_TAG + ">").matcher(
+ xml);
+ while (columnMatch.find()) {
+ String colXml = columnMatch.group(1);
+ XViewerColumn xCol = new XViewerColumn(null, colXml);
+ columns.add(xCol);
+ idToColumn.put(xCol.getId(), xCol);
+ }
+ return columns;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer("columnData:[");
+ for (XViewerColumn xCol : columns) {
+ sb.append(xCol);
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+
+ public XViewerColumn getXColumn(String id) {
+ return idToColumn.get(id);
+ }
+
+ public String getXml(boolean visibleColumnsOnly) {
+ StringBuffer sb = new StringBuffer();
+ for (XViewerColumn xCol : columns) {
+ if (!visibleColumnsOnly || (visibleColumnsOnly && xCol.isShow())) {
+ sb.append(xCol.toXml());
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * @return the columns
+ */
+ public List<XViewerColumn> getColumns() {
+ return columns;
+ }
+
+ /**
+ * @param columns the columns to set
+ */
+ public void setColumns(List<XViewerColumn> columns) {
+ this.columns = columns;
+ idToColumn.clear();
+ for (XViewerColumn xCol : columns) {
+ idToColumn.put(xCol.getId(), xCol);
+ }
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterData.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterData.java
new file mode 100644
index 00000000000..6353f077c78
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterData.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.nebula.widgets.xviewer.customize;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XmlUtil;
+
+/**
+ * Storage for column filters
+ *
+ * @author Donald G. Dunne
+ */
+public class ColumnFilterData {
+
+ private static final String COLUMN_FILTER_TAG = "xColFilter";
+ private static final String COLUMN_ID_TAG = "id";
+ private static final String FILTER_TEXT_TAG = "str";
+ private final Map<String, String> colIdToFilterText = new HashMap<String, String>();
+ private static Pattern p = Pattern.compile("<" + COLUMN_FILTER_TAG + ">(.*?)</" + COLUMN_FILTER_TAG + ">");
+
+ /**
+ * @return the filterText
+ */
+ public String getFilterText(String colId) {
+ return colIdToFilterText.get(colId);
+ }
+
+ public Set<String> getColIds() {
+ return colIdToFilterText.keySet();
+ }
+
+ /**
+ * @param filterText the filterText to set
+ */
+ public void setFilterText(String colId, String filterText) {
+ colIdToFilterText.put(colId, filterText);
+ }
+
+ public void clear() {
+ colIdToFilterText.clear();
+ }
+
+ public void removeFilterText(String colId) {
+ colIdToFilterText.remove(colId);
+ }
+
+ public String getXml() {
+ StringBuffer sb = new StringBuffer();
+ for (String colId : colIdToFilterText.keySet()) {
+ sb.append(XmlUtil.addTagData(COLUMN_FILTER_TAG, XmlUtil.addTagData(COLUMN_ID_TAG, colId) + XmlUtil.addTagData(
+ FILTER_TEXT_TAG, colIdToFilterText.get(colId))));
+ }
+ return sb.toString();
+ }
+
+ public void setFromXml(String xml) {
+ colIdToFilterText.clear();
+ Matcher columnMatch = p.matcher(xml);
+ while (columnMatch.find()) {
+ colIdToFilterText.put(XmlUtil.getTagData(columnMatch.group(1), COLUMN_ID_TAG), XmlUtil.getTagData(
+ columnMatch.group(1), FILTER_TEXT_TAG));
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "colFilter:[" + colIdToFilterText.toString() + "]";
+ }
+
+ public boolean isFiltered() {
+ return colIdToFilterText.size() > 0;
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterDataUI.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterDataUI.java
new file mode 100644
index 00000000000..326146d7c54
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/ColumnFilterDataUI.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.nebula.widgets.xviewer.customize;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.DialogWithEntry;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * UI for the display of column filter data
+ *
+ * @author Donald G. Dunne
+ */
+public class ColumnFilterDataUI {
+
+ private final XViewer xViewer;
+
+ public ColumnFilterDataUI(XViewer xViewer) {
+ this.xViewer = xViewer;
+ }
+
+ public void createWidgets() {
+ }
+
+ public void dispose() {
+ }
+
+ public void promptSetFilter(String colId) {
+ DialogWithEntry ed =
+ new DialogWithEntry(Display.getCurrent().getActiveShell(), "Filter Column", null,
+ "Enter filter string for " + colId + ":\n\nNote: !string negates the match", MessageDialog.QUESTION,
+ new String[] {"OK", "Clear", "Clear All", "Cancel"}, 0);
+ String str = xViewer.getCustomizeMgr().getColumnFilterData().getFilterText(colId);
+ if (str != null && !str.equals("")) {
+ ed.setEntry(str);
+ }
+ int result = ed.open();
+ if (result == 0) {
+ xViewer.getCustomizeMgr().setColumnFilterText(colId, ed.getEntry());
+ } else if (result == 1) {
+ xViewer.getCustomizeMgr().setColumnFilterText(colId, null);
+ } else if (result == 2) {
+ xViewer.getCustomizeMgr().clearAllColumnFilters();
+ }
+ }
+
+ public void getStatusLabelAddition(StringBuffer sb) {
+ for (String colId : xViewer.getCustomizeMgr().getColumnFilterData().getColIds()) {
+ sb.append("[" + colId + "=" + xViewer.getCustomizeMgr().getColumnFilterData().getFilterText(colId) + "]");
+ }
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeData.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeData.java
new file mode 100644
index 00000000000..96347ef54ab
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeData.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.customize;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.util.internal.OverlayUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.OverlayUtil.Location;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Single customization object storing name, id, sort, filter and column filter
+ *
+ * @author Donald G. Dunne
+ */
+public class CustomizeData {
+
+ private String guid = XViewerLib.generateGuidStr();
+ private String name;
+ private String nameSpace;
+ private boolean personal = false;
+ protected SortingData sortingData = new SortingData(this);
+ protected FilterData filterData = new FilterData();
+ protected ColumnFilterData columnFilterData = new ColumnFilterData();
+
+ /**
+ * @return the columnFilterData
+ */
+ public ColumnFilterData getColumnFilterData() {
+ return columnFilterData;
+ }
+
+ protected ColumnData columnData = new ColumnData();
+ private final Map<String, Image> imageMap = new HashMap<String, Image>();
+
+ public CustomizeData() {
+ }
+
+ public boolean isTableDefaultCustData() {
+ return name.equals(CustomizeManager.TABLE_DEFAULT_LABEL);
+ }
+
+ public boolean isCurrentTableCustData() {
+ return name.equals(CustomizeManager.CURRENT_LABEL);
+ }
+
+ public CustomizeData(String xml) {
+ this();
+ setFromXml(xml);
+ }
+
+ public void resetGuid() {
+ guid = XViewerLib.generateGuidStr();
+ }
+
+ public Image getImage(boolean isDefault) {
+ if (name.equals(CustomizeManager.TABLE_DEFAULT_LABEL) || name.equals(CustomizeManager.CURRENT_LABEL)) {
+ return XViewerLib.getImage("customize.gif");
+ }
+ String index = "" + personal + isDefault;
+ if (imageMap.containsKey(index)) return imageMap.get(index);
+ Image image = XViewerLib.getImage("customize.gif");
+ if (!personal) image =
+ new OverlayUtil(image, XViewerLib.getImageDescriptor("customizeG.gif"), Location.BOT_RIGHT).createImage();
+ if (isDefault) image =
+ new OverlayUtil(image, XViewerLib.getImageDescriptor("customizeD.gif"), Location.TOP_RIGHT).createImage();
+ imageMap.put(index, image);
+ return image;
+ }
+
+ public String getXml(boolean visibleColumnsOnly) {
+ StringBuffer sb =
+ new StringBuffer(
+ "<XTreeProperties name=\"" + name + "\" namespace=\"" + nameSpace + "\" guid=\"" + guid + "\">");
+ sb.append(sortingData.getXml());
+ sb.append(filterData.getXml());
+ sb.append(columnFilterData.getXml());
+ sb.append(columnData.getXml(visibleColumnsOnly));
+ sb.append("</XTreeProperties>");
+ return sb.toString();
+ }
+
+ public void setFromXml(String xml) {
+ Matcher m = Pattern.compile("name=\"(.*?)\".*?namespace=\"(.*?)\".*?guid=\"(.*?)\"").matcher(xml);
+ if (m.find()) {
+ name = m.group(1);
+ nameSpace = m.group(2);
+ guid = m.group(3);
+ } else {
+ name = "Invalid customize format for " + xml.substring(0, 50);
+ XViewerLog.log(Activator.class, Level.SEVERE, new IllegalStateException(name));
+ return;
+ }
+ sortingData.setFromXml(xml);
+ filterData.setFromXml(xml);
+ columnData.setFromXml(xml);
+ columnFilterData.setFromXml(xml);
+ }
+
+ @Override
+ public String toString() {
+ return "[" + name + "][" + nameSpace + "][" + guid + "][" + columnData + "][" + filterData + "][" + columnFilterData + "][" + sortingData + "]";
+ }
+
+ /**
+ * @return the personal
+ */
+ public boolean isPersonal() {
+ return personal;
+ }
+
+ /**
+ * @param personal the personal to set
+ */
+ public void setPersonal(boolean personal) {
+ this.personal = personal;
+ }
+
+ /**
+ * @return the columnData
+ */
+ public ColumnData getColumnData() {
+ return columnData;
+ }
+
+ /**
+ * @return the filterData
+ */
+ public FilterData getFilterData() {
+ return filterData;
+ }
+
+ /**
+ * @return the sortingData
+ */
+ public SortingData getSortingData() {
+ return sortingData;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the nameSpace
+ */
+ public String getNameSpace() {
+ return nameSpace;
+ }
+
+ /**
+ * @param nameSpace the nameSpace to set
+ */
+ public void setNameSpace(String nameSpace) {
+ this.nameSpace = nameSpace;
+ }
+
+ public String getGuid() {
+ return guid;
+ }
+
+ /**
+ * @param guid the guid to set
+ */
+ public void setGuid(String guid) {
+ this.guid = guid;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return (obj instanceof CustomizeData) && ((CustomizeData) obj).getGuid().equals(guid);
+ }
+
+ @Override
+ public int hashCode() {
+ return guid.hashCode();
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeDataLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeDataLabelProvider.java
new file mode 100644
index 00000000000..12b231c2481
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeDataLabelProvider.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.nebula.widgets.xviewer.customize;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class CustomizeDataLabelProvider implements ILabelProvider {
+
+ private final XViewer xViewer;
+
+ public CustomizeDataLabelProvider(XViewer xViewer) {
+ this.xViewer = xViewer;
+ }
+
+ public Image getImage(Object arg0) {
+ return ((CustomizeData) arg0).getImage(xViewer.getCustomizeMgr().isCustomizationUserDefault((CustomizeData) arg0));
+ }
+
+ public String getText(Object arg0) {
+ CustomizeData custom = (CustomizeData) arg0;
+ String text =
+ (xViewer.getCustomizeMgr().isCustomizationUserDefault(custom) ? "(Default) " : "") + custom.getName();
+ return text;
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeManager.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeManager.java
new file mode 100644
index 00000000000..87f30969850
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/CustomizeManager.java
@@ -0,0 +1,504 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.customize;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.IXViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerTextFilter;
+import org.eclipse.nebula.widgets.xviewer.customize.dialog.XViewerCustomizeDialog;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.TreeColumn;
+
+/**
+ * This manages the default table column definitions versus the user modified column data, sorter and filters.
+ *
+ * @author Donald G. Dunne
+ */
+public class CustomizeManager {
+
+ private final IXViewerFactory xViewerFactory;
+ private final XViewer xViewer;
+ private XViewerTextFilter xViewerTextFilter;
+ private CustomizeData currentCustData;
+ public static String CURRENT_LABEL = "-- Current Table View --";
+ public static String TABLE_DEFAULT_LABEL = "-- Table Default --";
+ // Added to keep filter, sorter from working till finished loading
+ public boolean loading = true;
+ public static List<String> REMOVED_COLUMNS_TO_IGNORE = Arrays.asList("Metrics from Tasks");
+
+ public CustomizeManager(XViewer xViewer, IXViewerFactory xViewerFactory) throws XViewerException {
+ this.xViewer = xViewer;
+ this.xViewerFactory = xViewerFactory;
+ // Set customize to be user default, if selected, or table default
+ CustomizeData userCustData = xViewerFactory.getXViewerCustomizations().getUserDefaultCustData();
+ if (userCustData != null) {
+ currentCustData = resolveLoadedCustomizeData(userCustData);
+ } else {
+ currentCustData = getTableDefaultCustData();
+ currentCustData.setNameSpace(xViewerFactory.getNamespace());
+ }
+ xViewerFactory.getXViewerCustomMenu().init(xViewer);
+ }
+
+ private final Map<String, XViewerColumn> oldNameToColumnId = new HashMap<String, XViewerColumn>();
+
+ /**
+ * Since saved customize data is stored as xml, all the columns need to be resolved to the columns available from the
+ * factory
+ *
+ * @param loadedCustData
+ * @return CustomizeData
+ */
+ public CustomizeData resolveLoadedCustomizeData(CustomizeData loadedCustData) {
+ // Otherwise, have to resolve what was saved with what is valid for this table and available from the factory
+ CustomizeData resolvedCustData = new CustomizeData();
+ resolvedCustData.setName(loadedCustData.getName());
+ resolvedCustData.setPersonal(loadedCustData.isPersonal());
+ resolvedCustData.setGuid(loadedCustData.getGuid());
+ resolvedCustData.setNameSpace(loadedCustData.getNameSpace());
+ /*
+ * Need to resolve columns with what factory has which gets correct class/subclass of XViewerColumn and allows for removal of old and addition of new columns
+ */
+ List<XViewerColumn> resolvedColumns = new ArrayList<XViewerColumn>();
+ for (XViewerColumn storedCol : loadedCustData.getColumnData().getColumns()) {
+ XViewerColumn resolvedCol = xViewer.getXViewerFactory().getDefaultXViewerColumn(storedCol.getId());
+ // Handle known stored values
+ if (resolvedCol == null) {
+ String name = storedCol.getName();
+ if (name.equals("Impacted Items")) {
+ resolvedCol = xViewer.getXViewerFactory().getDefaultXViewerColumn("ats.column.actionableItems");
+ } else if (name.equals("State Percent")) {
+ resolvedCol = xViewer.getXViewerFactory().getDefaultXViewerColumn("ats.column.statePercentComplete");
+ }
+ }
+ // if not found, may have been stored without namespace; try to resolve for backward compatibility
+ if (resolvedCol == null) {
+ String name = storedCol.getName().replaceAll(" ", "");
+ resolvedCol = oldNameToColumnId.get(name);
+ // First try to match by .<oldname>
+ if (resolvedCol == null) {
+ for (XViewerColumn xCol : xViewer.getXViewerFactory().getDefaultTableCustomizeData().getColumnData().getColumns()) {
+ String colId = xCol.getId().toLowerCase();
+ String oldName = "." + name.toLowerCase();
+ if (colId.endsWith(oldName)) {
+ resolvedCol = xCol;
+ oldNameToColumnId.put(name, resolvedCol);
+ oldNameToColumnId.put(storedCol.getName(), resolvedCol);
+ break;
+ }
+ }
+ }
+ // Then try to match by id endswith name
+ if (resolvedCol == null) {
+ for (XViewerColumn xCol : xViewer.getXViewerFactory().getDefaultTableCustomizeData().getColumnData().getColumns()) {
+ if (xCol.getId().endsWith(name)) {
+ resolvedCol = xCol;
+ oldNameToColumnId.put(name, resolvedCol);
+ oldNameToColumnId.put(storedCol.getName(), resolvedCol);
+ break;
+ }
+ }
+ }
+ }
+ // Only handle columns that the factory supports and only resolve shown columns (rest will be loaded later)
+ if (resolvedCol != null && resolvedCol.getWidth() > 0) {
+ resolvedCol.setWidth(storedCol.getWidth());
+ resolvedCol.setName(storedCol.getName());
+ resolvedCol.setShow(storedCol.isShow());
+ resolvedCol.setSortForward(storedCol.isSortForward());
+ resolvedColumns.add(resolvedCol);
+ }
+ if (resolvedCol == null) {
+ // Ignore known removed columns
+ if (!REMOVED_COLUMNS_TO_IGNORE.contains(storedCol.getName())) {
+ XViewerLog.log(
+ Activator.class,
+ Level.WARNING,
+ "XViewer Conversion for saved Customization \"" + loadedCustData.getName() + "\" dropped unresolved column Name: \"" + storedCol.getName() + "\" Id: \"" + storedCol.getId() + "\". Delete customization and re-save to resolve.");
+ }
+ }
+ }
+ /*
+ * Add extra columns that were added to the table since storage of this custData
+ */
+ for (XViewerColumn extraCol : xViewer.getXViewerFactory().getDefaultTableCustomizeData().getColumnData().getColumns()) {
+ if (!resolvedColumns.contains(extraCol)) {
+ // Since column wasn't saved, don't show it
+ extraCol.setShow(false);
+ resolvedColumns.add(extraCol);
+ }
+ }
+ resolvedCustData.getColumnData().setColumns(resolvedColumns);
+ resolvedCustData.getColumnFilterData().setFromXml(loadedCustData.getColumnFilterData().getXml());
+ resolvedCustData.getFilterData().setFromXml(loadedCustData.getFilterData().getXml());
+ resolvedCustData.getSortingData().setFromXml(loadedCustData.getSortingData().getXml());
+ return resolvedCustData;
+ }
+
+ public void setFilterText(String text) {
+ currentCustData.filterData.setFilterText(text);
+ xViewerTextFilter.update();
+ xViewer.refresh();
+ }
+
+ public String getFilterText() {
+ return currentCustData.getFilterData().getFilterText();
+ }
+
+ public void setColumnFilterText(String colId, String text) {
+ if (text == null || text.equals("")) {
+ currentCustData.columnFilterData.removeFilterText(colId);
+ } else {
+ currentCustData.columnFilterData.setFilterText(colId, text);
+ }
+ xViewerTextFilter.update();
+ xViewer.refresh();
+ }
+
+ public void clearFilters() {
+ xViewer.getFilterDataUI().clear();
+ currentCustData.columnFilterData.clear();
+ xViewerTextFilter.update();
+ xViewer.refresh();
+ }
+
+ public void clearAllColumnFilters() {
+ currentCustData.columnFilterData.clear();
+ xViewerTextFilter.update();
+ xViewer.refresh();
+ }
+
+ public String getColumnFilterText(String colId) {
+ return currentCustData.getColumnFilterData().getFilterText(colId);
+ }
+
+ public ColumnFilterData getColumnFilterData() {
+ return currentCustData.getColumnFilterData();
+ }
+
+ /**
+ * Clears out current columns, sorting and filtering and loads table customization
+ */
+ public void loadCustomization() {
+ loadCustomization(currentCustData);
+ }
+
+ public void resetDefaultSorter() {
+ XViewerSorter sorter = xViewer.getXViewerFactory().createNewXSorter(xViewer);
+ xViewer.setSorter(sorter);
+ }
+
+ public void clearSorter() {
+ currentCustData.getSortingData().clearSorter();
+ xViewer.setSorter(null);
+ xViewer.updateStatusLabel();
+ }
+
+ public void handleTableCustomization() {
+ (new XViewerCustomizeDialog(xViewer)).open();
+ }
+
+ public void getStatusLabelAddition(StringBuffer sb) {
+ if (currentCustData != null && currentCustData.getName() != null &&
+ //
+ !currentCustData.getName().equals(CURRENT_LABEL) &&
+ //
+ !currentCustData.getName().equals(TABLE_DEFAULT_LABEL) &&
+ //
+ currentCustData.getName() != null) {
+ sb.append("[Custom: " + currentCustData.getName() + "]");
+ }
+ }
+
+ /**
+ * @return the currentCustData
+ */
+ public CustomizeData generateCustDataFromTable() {
+ CustomizeData custData = new CustomizeData();
+ custData.setName(CustomizeManager.CURRENT_LABEL);
+ custData.setNameSpace(xViewer.getXViewerFactory().getNamespace());
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>(15);
+ for (Integer index : xViewer.getTree().getColumnOrder()) {
+ TreeColumn treeCol = xViewer.getTree().getColumn(index);
+ XViewerColumn xCol = (XViewerColumn) treeCol.getData();
+ xCol.setWidth(treeCol.getWidth());
+ xCol.setShow(treeCol.getWidth() > 0);
+ columns.add(xCol);
+ }
+ // Add all columns that are not visible
+ for (XViewerColumn xCol : xViewer.getXViewerFactory().getDefaultTableCustomizeData().getColumnData().getColumns()) {
+ if (!columns.contains(xCol)) {
+ xCol.setShow(false);
+ columns.add(xCol);
+ }
+ }
+ custData.columnData.setColumns(columns);
+ custData.sortingData.setFromXml(currentCustData.sortingData.getXml());
+ custData.filterData.setFromXml(currentCustData.filterData.getXml());
+ custData.columnFilterData.setFromXml(currentCustData.columnFilterData.getXml());
+ return custData;
+ }
+
+ public List<XViewerColumn> getCurrentTableColumns() {
+ return currentCustData.getColumnData().getColumns();
+ }
+
+ public XViewerColumn getCurrentTableColumn(String id) {
+ return currentCustData.getColumnData().getXColumn(id);
+ }
+
+ public List<XViewerColumn> getCurrentTableColumnsInOrder() {
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>(15);
+ for (Integer index : xViewer.getTree().getColumnOrder()) {
+ TreeColumn treeCol = xViewer.getTree().getColumn(index);
+ XViewerColumn xCol = (XViewerColumn) treeCol.getData();
+ columns.add(xCol);
+ }
+ return columns;
+ }
+
+ public List<XViewerColumn> getCurrentVisibleTableColumns() {
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>(15);
+ for (XViewerColumn xCol : getCurrentTableColumns()) {
+ if (xCol.isShow()) {
+ columns.add(xCol);
+ }
+ }
+ return columns;
+ }
+
+ /**
+ * Return index of XColumn to original column index on creation of table. Since table allows drag re-ordering of
+ * columns, this index will provide the map back to the original column index. Used for label providers
+ * getColumnText(object, index)
+ *
+ * @return index
+ */
+ public Map<XViewerColumn, Integer> getCurrentTableColumnsIndex() {
+ int[] index = xViewer.getTree().getColumnOrder();
+ Map<XViewerColumn, Integer> xColToColumnIndex = new HashMap<XViewerColumn, Integer>(index.length);
+ for (int x = 0; x < index.length; x++) {
+ TreeColumn treeCol = xViewer.getTree().getColumn(index[x]);
+ XViewerColumn xCol = (XViewerColumn) treeCol.getData();
+ xColToColumnIndex.put(xCol, index[x]);
+ }
+ return xColToColumnIndex;
+ }
+
+ public int getColumnNumFromXViewerColumn(XViewerColumn xCol) {
+ for (Integer index : xViewer.getTree().getColumnOrder()) {
+ TreeColumn treeCol = xViewer.getTree().getColumn(index);
+ XViewerColumn treeXCol = (XViewerColumn) treeCol.getData();
+ if (xCol.equals(treeXCol)) return index;
+ }
+ return 0;
+ }
+
+ /**
+ * @return the defaultCustData
+ */
+ public CustomizeData getTableDefaultCustData() {
+ CustomizeData custData = xViewer.getXViewerFactory().getDefaultTableCustomizeData();
+ if (custData.getName() == null || custData.getName().equals("")) {
+ custData.setName(TABLE_DEFAULT_LABEL);
+ }
+ custData.setNameSpace(xViewer.getViewerNamespace());
+ return custData;
+ }
+
+ public void getSortingStr(StringBuffer sb) {
+ if (currentCustData.getSortingData().isSorting()) {
+ List<XViewerColumn> cols = getSortXCols();
+ if (cols.size() == 0) return;
+ sb.append("Sort: ");
+ for (XViewerColumn col : getSortXCols()) {
+ if (col != null) {
+ sb.append("[" + col.getName());
+ sb.append(col.isSortForward() ? " (FWD)] " : " (REV)] ");
+ }
+ }
+ }
+ }
+
+ public int getDefaultWidth(String id) {
+ XViewerColumn xCol = xViewerFactory.getDefaultXViewerColumn(id);
+ if (xCol == null)
+ return 75;
+ else
+ return xCol.getWidth();
+ }
+
+ public boolean isCustomizationUserDefault(CustomizeData custData) {
+ return xViewerFactory.getXViewerCustomizations().isCustomizationUserDefault(custData);
+ }
+
+ public List<XViewerColumn> getSortXCols() {
+ // return sort columns depending on default/customize
+ return currentCustData.getSortingData().getSortXCols(oldNameToColumnId);
+ }
+
+ public boolean isLoading() {
+ return loading;
+ }
+
+ public List<CustomizeData> getSavedCustDatas() throws Exception {
+ List<CustomizeData> custDatas = new ArrayList<CustomizeData>();
+ for (CustomizeData savedCustData : xViewerFactory.getXViewerCustomizations().getSavedCustDatas()) {
+ custDatas.add(resolveLoadedCustomizeData(savedCustData));
+ }
+ return custDatas;
+ }
+
+ public void saveCustomization(CustomizeData custData) throws Exception {
+ xViewerFactory.getXViewerCustomizations().saveCustomization(custData);
+ }
+
+ /**
+ * Set to newName or clear if newName == ""
+ *
+ * @param xCol
+ * @param newName
+ */
+ public void customizeColumnName(XViewerColumn xCol, String newName) {
+ if (newName == "") {
+ XViewerColumn defaultXCol = xViewerFactory.getDefaultXViewerColumn(xCol.getId());
+ if (defaultXCol == null) {
+ XViewerLib.popup("ERROR", "Column not defined. Can't retrieve default name.");
+ return;
+ }
+ xCol.setName(xCol.getName());
+ } else {
+ xCol.setName(newName);
+ }
+ }
+
+ public void setUserDefaultCustData(CustomizeData newCustData, boolean set) throws Exception {
+ xViewerFactory.getXViewerCustomizations().setUserDefaultCustData(newCustData, set);
+ }
+
+ public void deleteCustomization(CustomizeData custData) throws Exception {
+ xViewerFactory.getXViewerCustomizations().deleteCustomization(custData);
+
+ }
+
+ public boolean isSorting() {
+ return currentCustData.getSortingData().isSorting();
+ }
+
+ /**
+ * Clears out current columns, sorting and filtering and loads table customization
+ */
+ public void loadCustomization(final CustomizeData newCustData) {
+ loading = true;
+ if (xViewerTextFilter == null) {
+ xViewerTextFilter = new XViewerTextFilter(xViewer);
+ xViewer.addFilter(xViewerTextFilter);
+ }
+ if (xViewer.getTree().isDisposed()) return;
+ currentCustData = newCustData;
+ if (currentCustData.getName() == null || currentCustData.getName().equals("")) {
+ currentCustData.setName(CURRENT_LABEL);
+ }
+ currentCustData.setNameSpace(xViewer.getViewerNamespace());
+ if (currentCustData.getSortingData().isSorting()) {
+ xViewer.resetDefaultSorter();
+ xViewerTextFilter.update();
+ } else
+ xViewer.setSorter(null);
+ // Dispose all existing columns
+ for (TreeColumn treeCol : xViewer.getTree().getColumns())
+ treeCol.dispose();
+ // Create new columns
+ addColumns();
+ xViewer.updateStatusLabel();
+ if (xViewer.getLabelProvider() instanceof XViewerLabelProvider) {
+ ((XViewerLabelProvider) xViewer.getLabelProvider()).clearXViewerColumnIndexCache();
+ }
+ loading = false;
+ }
+
+ public void addColumns() {
+ for (final XViewerColumn xCol : currentCustData.getColumnData().getColumns()) {
+ // Only add visible columns
+ if (!xCol.isShow()) continue;
+ xCol.setXViewer(xViewer);
+ TreeColumn column = new TreeColumn(xViewer.getTree(), xCol.getAlign());
+ column.setMoveable(true);
+ column.setData(xCol);
+ StringBuffer sb = new StringBuffer();
+ sb.append(xCol.getName());
+ if (xCol.getDescription() != null && !xCol.getDescription().equals("") && !xCol.getDescription().equals(
+ xCol.getName())) {
+ sb.append("\n" + xCol.getDescription());
+ }
+ if (xCol.getToolTip() != null && !xCol.getToolTip().equals("") && !xCol.getToolTip().equals(xCol.getName()) && !xCol.getToolTip().equals(
+ xCol.getDescription())) {
+ sb.append("\n" + xCol.getToolTip());
+ }
+ sb.append("\n" + xCol.getId());
+ column.setToolTipText(sb.toString());
+ column.setText(xCol.getName());
+ column.setWidth(xCol.getWidth());
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ // Add sorter if doesn't exist
+ if (xViewer.getSorter() == null) {
+ resetDefaultSorter();
+ }
+ if (xViewer.isAltKeyDown()) {
+ xViewer.getColumnFilterDataUI().promptSetFilter(xCol.getId());
+ } else if (xViewer.isCtrlKeyDown()) {
+ List<XViewerColumn> currSortCols = currentCustData.getSortingData().getSortXCols(oldNameToColumnId);
+ if (currSortCols == null) {
+ currSortCols = new ArrayList<XViewerColumn>();
+ currSortCols.add(xCol);
+ } else {
+ // If already selected this item, reverse the sort
+ if (currSortCols.contains(xCol)) {
+ for (XViewerColumn currXCol : currSortCols)
+ if (currXCol.equals(xCol)) currXCol.reverseSort();
+ } else
+ currSortCols.add(xCol);
+ }
+ currentCustData.getSortingData().setSortXCols(currSortCols);
+ } else {
+
+ List<XViewerColumn> cols = new ArrayList<XViewerColumn>();
+ cols.add(xCol);
+ // If sorter already has this column sorted, reverse the sort
+ List<XViewerColumn> currSortCols = currentCustData.getSortingData().getSortXCols(oldNameToColumnId);
+ if (currSortCols != null && currSortCols.size() == 1 && currSortCols.iterator().next().equals(xCol)) xCol.reverseSort();
+ // Set the newly sorted column
+ currentCustData.getSortingData().setSortXCols(cols);
+ }
+ xViewer.refresh();
+ xViewer.updateStatusLabel();
+ }
+ });
+ }
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FileStoreCustomizations.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FileStoreCustomizations.java
new file mode 100644
index 00000000000..72096fc8b3b
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FileStoreCustomizations.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.nebula.widgets.xviewer.customize;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.util.internal.FileUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class FileStoreCustomizations implements IXViewerCustomizations {
+
+ private final File baseStorage;
+ private final String prefix;
+ private final String postfix;
+ private final String defaultCustomizationFileName;
+ private final CustomizeData defaultCustomData;
+
+ public FileStoreCustomizations(File pathToCustomizations, String fileNamePrefix, String fileNamePostfix, String defaultCustomizationFileName, String defaultCustomDataXml){
+ this.baseStorage = pathToCustomizations;
+ this.prefix = fileNamePrefix;
+ this.postfix = fileNamePostfix;
+ this.defaultCustomizationFileName = defaultCustomizationFileName;
+ this.defaultCustomData = new CustomizeData(defaultCustomDataXml);
+ }
+
+ @Override
+ public void deleteCustomization(CustomizeData custData) throws Exception {
+ File file = new File(getFilename(custData));
+ if (file.exists()) file.delete();
+ }
+
+ @Override
+ public List<CustomizeData> getSavedCustDatas() {
+ List<CustomizeData> custDatas = new ArrayList<CustomizeData>();
+ for (String filename : FileUtil.readListFromDir(getCustomDataDir(), new FilenameFilter(){
+ @Override
+ public boolean accept(File dir, String name) {
+ if(name.endsWith(postfix) && name.startsWith(prefix)){
+ return true;
+ }
+ return false;
+ }
+ })) {
+ try {
+ custDatas.add(new CustomizeData(FileUtil.fileToString(new File(getCustomDataDir(), filename))));
+ } catch (IOException ex) {
+ XViewerLog.log(FileStoreCustomizations.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ return custDatas;
+ }
+
+ @Override
+ public CustomizeData getUserDefaultCustData() {
+ File file = new File(getDefaultFilename());
+ if (!file.exists()) {
+ return defaultCustomData;
+ } else {
+ String defaultGuid;
+ try {
+ defaultGuid = FileUtil.fileToString(file).replaceAll("\\s", "");
+ if (defaultGuid != null) {
+ for (CustomizeData custData : getSavedCustDatas()) {
+ if (custData.getGuid().equals(defaultGuid)) {
+ return custData;
+ }
+ }
+ }
+ } catch (IOException ex) {
+ XViewerLog.log(FileStoreCustomizations.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isCustomizationPersistAvailable() {
+ return true;
+ }
+
+ @Override
+ public boolean isCustomizationUserDefault(CustomizeData custData) {
+ File file = new File(getDefaultFilename());
+ if (!file.exists()) return false;
+ String defaultGuid;
+ try {
+ defaultGuid = FileUtil.fileToString(new File(getDefaultFilename())).replaceAll("\\s", "");
+ return custData.getGuid().equals(defaultGuid);
+ } catch (IOException ex) {
+ XViewerLog.log(FileStoreCustomizations.class, Level.SEVERE, ex.toString(), ex);
+ }
+ return false;
+ }
+
+ @Override
+ public void saveCustomization(CustomizeData custData) throws Exception {
+ FileUtil.writeStringToFile(custData.getXml(true), new File(getFilename(custData)));
+ }
+
+ private String getFilename(CustomizeData custData) {
+ return new File(getCustomDataDir(), prefix + custData.getGuid() + postfix).getAbsolutePath();
+ }
+
+ private String getDefaultFilename() {
+ return new File(getCustomDataDir(), defaultCustomizationFileName).getAbsolutePath();
+ }
+
+ private File getCustomDataDir(){
+ return baseStorage;
+ }
+
+ @Override
+ public void setUserDefaultCustData(CustomizeData newCustData, boolean set) {
+ if (set) {
+ try {
+ FileUtil.writeStringToFile(newCustData.getGuid(), new File(getDefaultFilename()));
+ } catch (IOException ex) {
+ XViewerLog.log(FileStoreCustomizations.class, Level.SEVERE, ex);
+ }
+ } else {
+ File file = new File(getDefaultFilename());
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterData.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterData.java
new file mode 100644
index 00000000000..4ce7110011c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterData.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.nebula.widgets.xviewer.customize;
+
+import org.eclipse.nebula.widgets.xviewer.util.internal.XmlUtil;
+
+/**
+ * Provides storage of filter
+ *
+ * @author Donald G. Dunne
+ */
+public class FilterData {
+
+ private String filterText = "";
+ private static final String FILTER_TAG = "xFilter";
+
+ /**
+ * @return the filterText
+ */
+ public String getFilterText() {
+ return filterText;
+ }
+
+ /**
+ * @param filterText the filterText to set
+ */
+ public void setFilterText(String filterText) {
+ this.filterText = filterText;
+ }
+
+ public String getXml() {
+ return XmlUtil.addTagData(FILTER_TAG, filterText);
+ }
+
+ public void setFromXml(String xml) {
+ filterText = XmlUtil.getTagData(xml, FILTER_TAG);
+ }
+
+ @Override
+ public String toString() {
+ return "filterData:[" + filterText + "]";
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterDataUI.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterDataUI.java
new file mode 100644
index 00000000000..ee4cfc2c4b1
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/FilterDataUI.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.nebula.widgets.xviewer.customize;
+
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.swt.SWT;
+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.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Provides UI for display of current filter
+ *
+ * @author Donald G. Dunne
+ */
+public class FilterDataUI {
+
+ private Text filterText;
+ private Label filterLabel;
+ private final XViewer xViewer;
+ private final boolean filterRealTime;
+
+ public FilterDataUI(XViewer xViewer, boolean filterRealTime) {
+ this.xViewer = xViewer;
+ this.filterRealTime = filterRealTime;
+ }
+
+ public void createWidgets(Composite comp) {
+ Label label = new Label(comp, SWT.NONE);
+ label.setText("Filter:");
+ label.setToolTipText("Type string and press enter to filter.\nClear field to un-filter.");
+ GridData gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ label.setLayoutData(gd);
+
+ filterText = new Text(comp, SWT.SINGLE | SWT.BORDER);
+ gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ gd.widthHint = 100;
+ filterText.setLayoutData(gd);
+
+ filterText.addKeyListener(new KeyListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+ */
+ public void keyPressed(KeyEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+ */
+ public void keyReleased(KeyEvent e) {
+ // System.out.println(e.keyCode);
+ if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR || filterRealTime) {
+ xViewer.getCustomizeMgr().setFilterText(filterText.getText());
+ }
+ }
+ });
+
+ filterLabel = new Label(comp, SWT.NONE);
+ filterLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, false, false));
+ filterLabel.setImage(XViewerLib.getImage("clear.gif"));
+ filterLabel.addListener(SWT.MouseUp, new Listener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ filterText.setText("");
+ xViewer.getCustomizeMgr().setFilterText("");
+ }
+ });
+ }
+
+ public void dispose() {
+ }
+
+ public void clear() {
+ filterText.setText("");
+ xViewer.getCustomizeMgr().setFilterText("");
+ }
+
+ public void getStatusLabelAddition(StringBuffer sb) {
+ if (filterText != null && !filterText.getText().equals("")) {
+ sb.append("[Text Filter]");
+ }
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/IXViewerCustomizations.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/IXViewerCustomizations.java
new file mode 100644
index 00000000000..1fb3bdfc915
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/IXViewerCustomizations.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.nebula.widgets.xviewer.customize;
+
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+
+/**
+ * Methods to implement if this XViewer allows the user to save local/global customizations
+ *
+ * @author Donald G. Dunne
+ */
+public interface IXViewerCustomizations {
+
+ /**
+ * Called to have customization saved
+ *
+ * @param custData
+ * @throws Exception
+ */
+ public void saveCustomization(CustomizeData custData) throws Exception;
+
+ /**
+ * Load and return saved customizations
+ *
+ * @return list of saved customizations
+ * @throws Exception
+ */
+ public List<CustomizeData> getSavedCustDatas() throws Exception;
+
+ /**
+ * Return customization saved as default
+ *
+ * @return default customization
+ * @throws XViewerException
+ */
+ public CustomizeData getUserDefaultCustData() throws XViewerException;
+
+ /**
+ * Return true if given customization is the default
+ *
+ * @param custData
+ * @return true if default
+ */
+ public boolean isCustomizationUserDefault(CustomizeData custData);
+
+ /**
+ * Set given customization as the user default
+ *
+ * @param newCustData
+ * @param set
+ * @throws Exception
+ */
+ public void setUserDefaultCustData(CustomizeData newCustData, boolean set) throws Exception;
+
+ /**
+ * Delete customization
+ *
+ * @param custData
+ * @throws Exception
+ */
+ public void deleteCustomization(CustomizeData custData) throws Exception;
+
+ /**
+ * Return true if this XViewer is allowed to save local/global customizations
+ *
+ * @return true if available
+ */
+ public boolean isCustomizationPersistAvailable();
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SearchDataUI.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SearchDataUI.java
new file mode 100644
index 00000000000..805c36ae8f4
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SearchDataUI.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.nebula.widgets.xviewer.customize;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Provides UI for displaying/entering search string
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class SearchDataUI {
+
+ private Text searchText;
+ private Label searchLabel;
+ private final XViewer xViewer;
+ private Matcher match;
+ private boolean search = false;
+ private Button regularExpression;
+ private boolean regex;
+ private final boolean searchRealTime;
+
+ public SearchDataUI(XViewer xViewer, boolean searchRealTime) {
+ this.xViewer = xViewer;
+ this.searchRealTime = searchRealTime;
+ }
+
+ public void createWidgets(Composite bar) {
+
+ // ExpandBar bar = new ExpandBar(comp, SWT.V_SCROLL);
+
+ Label label = new Label(bar, SWT.NONE);
+ label.setText("Search:");
+ label.setToolTipText("Type string and press enter to filter.\nClear field to un-filter.");
+ GridData gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ label.setLayoutData(gd);
+
+ searchText = new Text(bar, SWT.SINGLE | SWT.BORDER);
+
+ gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ gd.widthHint = 100;
+ searchText.setLayoutData(gd);
+
+ searchText.addKeyListener(new KeyListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+ */
+ public void keyPressed(KeyEvent e) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+ */
+ public void keyReleased(KeyEvent e) {
+ // System.out.println(e.keyCode);
+ if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR || searchRealTime) {
+ // xViewer.getCustomizeMgr().setSearchText(searchText.getText());
+ String newText = searchText.getText();
+ if (newText.trim().length() == 0) {
+ search = false;
+ match = Pattern.compile(searchText.getText()).matcher("");
+ } else {
+ regex = true;
+ if (!regularExpression.getSelection()) {
+ regex = false;
+ newText = newText.replace("*", ".*");
+ newText = ".*" + newText + ".*";
+ }
+ match =
+ Pattern.compile(newText, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher(
+ "");
+ search = true;
+ }
+ xViewer.refresh();
+ }
+ }
+ });
+
+ searchLabel = new Label(bar, SWT.NONE);
+ searchLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, false, false));
+ searchLabel.setImage(XViewerLib.getImage("clear.gif"));
+
+ regularExpression = new Button(bar, SWT.CHECK);
+ regularExpression.setText("RE");
+ regularExpression.setToolTipText("Enable Regular Expression Search");
+ regularExpression.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, false, false));
+ searchLabel.addListener(SWT.MouseUp, new Listener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ searchText.setText("");
+ search = false;
+ match = Pattern.compile(searchText.getText()).matcher("");
+ xViewer.refresh();
+ }
+ });
+ }
+
+ public void dispose() {
+ }
+
+ public void clear() {
+ searchText.setText("");
+ xViewer.getCustomizeMgr().setFilterText("");
+ }
+
+ public void getStatusLabelAddition(StringBuffer sb) {
+ if (searchText != null && !searchText.getText().equals("")) {
+ sb.append("[Text Search]");
+ }
+ }
+
+ /**
+ * @param text
+ * @return true if matched
+ */
+ public boolean match(String textString) {
+ if (search) {
+ if (regex) {
+ match.reset(textString);
+ return match.matches();
+ } else {
+ match.reset(textString);
+ return match.matches();
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @return true if in search mode
+ */
+ public boolean isSearch() {
+ return search;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SortingData.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SortingData.java
new file mode 100644
index 00000000000..e84a7baaa46
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/SortingData.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.customize;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XmlUtil;
+
+/**
+ * Provides object for storage of sorting data
+ *
+ * @author Donald G. Dunne
+ */
+public class SortingData {
+
+ private static String XTREESORTER_TAG = "xSorter";
+ private static String COL_NAME_TAG = "id";
+ private static String OLD_COL_NAME_TAG = "name";
+ private final List<String> sortingIds = new ArrayList<String>();
+ private final CustomizeData custData;
+
+ public SortingData(CustomizeData custData) {
+ this.custData = custData;
+ }
+
+ public SortingData(String xml) {
+ this.custData = null;
+ setFromXml(xml);
+ }
+
+ public void clearSorter() {
+ sortingIds.clear();
+ }
+
+ public boolean isSorting() {
+ return sortingIds.size() > 0;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ for (String str : sortingIds) {
+ sb.append(str + ", ");
+ }
+ return sb.toString().replaceFirst(", $", "");
+ }
+
+ public List<XViewerColumn> getSortXCols(Map<String, XViewerColumn> oldNameToColumnId) {
+ List<XViewerColumn> cols = new ArrayList<XViewerColumn>();
+ for (String id : getSortingIds()) {
+ XViewerColumn xCol = custData.getColumnData().getXColumn(id);
+ // For backward compatibility, try to resolve column name
+ if (xCol == null) {
+ XViewerColumn resolvedCol = oldNameToColumnId.get(id);
+ if (resolvedCol != null) {
+ xCol = custData.getColumnData().getXColumn(resolvedCol.getId());
+ }
+ }
+ if (xCol != null) {
+ cols.add(xCol);
+ } else {
+ // Ignore known removed columns
+ if (!CustomizeManager.REMOVED_COLUMNS_TO_IGNORE.contains(id)) {
+ XViewerLog.log(
+ Activator.class,
+ Level.WARNING,
+ "XViewer Conversion for saved Customization \"" + custData.getName() + "\" dropped unresolved SORTING column Name/Id: \"" + id + "\". Delete customization and re-save to resolve.");
+ }
+ }
+ }
+ return cols;
+ }
+
+ public void setSortXCols(List<XViewerColumn> sortXCols) {
+ sortingIds.clear();
+ for (XViewerColumn xCol : sortXCols) {
+ sortingIds.add(xCol.getId());
+ }
+ }
+
+ public String getXml() {
+ StringBuffer sb = new StringBuffer("<" + XTREESORTER_TAG + ">");
+ // NOTE: Sorting direction is stored as part of the column data
+ for (String item : sortingIds)
+ sb.append(XmlUtil.addTagData(COL_NAME_TAG, item));
+ sb.append("</" + XTREESORTER_TAG + ">");
+ return sb.toString();
+ }
+
+ public void setFromXml(String xml) {
+ // NOTE: Sorting direction is stored as part of the column data
+ sortingIds.clear();
+ String xmlSortStr = XmlUtil.getTagData(xml, XTREESORTER_TAG);
+ Matcher m = Pattern.compile("<" + COL_NAME_TAG + ">(.*?)</" + COL_NAME_TAG + ">").matcher(xmlSortStr);
+ while (m.find()) {
+ sortingIds.add(m.group(1));
+ }
+ Matcher mOld = Pattern.compile("<" + OLD_COL_NAME_TAG + ">(.*?)</" + OLD_COL_NAME_TAG + ">").matcher(xmlSortStr);
+ while (mOld.find()) {
+ sortingIds.add(mOld.group(1));
+ }
+ }
+
+ /**
+ * @return the sortingNames
+ */
+ public List<String> getSortingIds() {
+ return sortingIds;
+ }
+
+ public void removeSortingName(String name) {
+ this.sortingIds.remove(name);
+ }
+
+ public void addSortingName(String name) {
+ if (!this.sortingIds.contains(name)) this.sortingIds.add(name);
+ }
+
+ /**
+ * @param sortingNames the sortingNames to set
+ */
+ public void setSortingNames(String... xViewerColumnId) {
+ this.sortingIds.clear();
+ for (String id : xViewerColumnId) {
+ this.sortingIds.add(id);
+ }
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomMenu.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomMenu.java
new file mode 100644
index 00000000000..05372f68329
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomMenu.java
@@ -0,0 +1,553 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.nebula.widgets.xviewer.customize;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
+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.ArrayContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumnSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.XViewerTreeReport;
+import org.eclipse.nebula.widgets.xviewer.util.internal.CollectionsUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.HtmlUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.HtmlDialog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.ListDialogSortable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * Allow for the customization of the xViewer's right-click menus. Full menu can be used or selected Actions accessed
+ * for partial implementation in existing menus
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerCustomMenu {
+
+ protected XViewer xViewer;
+ private final Clipboard clipboard = new Clipboard(null);
+
+ protected Action filterByColumn;
+ protected Action clearAllSorting;
+ protected Action clearAllFilters;
+ protected Action tableProperties;
+ protected Action viewTableReport;
+ protected Action columnMultiEdit;
+ protected Action removeSelected;
+ protected Action removeNonSelected;
+ protected Action copySelected;
+ protected Action copySelectedCell;
+ protected Action viewSelectedCell;
+
+ /**
+ * @param factory
+ */
+ public XViewerCustomMenu() {
+ }
+
+ public XViewerCustomMenu(XViewer xViewer) {
+ this.xViewer = xViewer;
+ }
+
+ public void init(XViewer xviewer) {
+ this.xViewer = xviewer;
+ setupActions();
+ xViewer.getMenuManager().addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ setupMenu();
+ }
+ });
+ xViewer.getTree().addKeyListener(new KeySelectedListener());
+ xViewer.getTree().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(org.eclipse.swt.events.DisposeEvent e) {
+ if (clipboard != null) clipboard.dispose();
+ };
+ });
+ }
+
+ protected void setupMenu() {
+ MenuManager mm = xViewer.getMenuManager();
+ mm.add(new GroupMarker(XViewer.MENU_GROUP_PRE));
+ mm.add(new Separator());
+ mm.add(tableProperties);
+ mm.add(viewTableReport);
+ if (xViewer.isColumnMultiEditEnabled()) {
+ mm.add(columnMultiEdit);
+ }
+ mm.add(viewSelectedCell);
+ mm.add(copySelected);
+ mm.add(copySelectedCell);
+ mm.add(new Separator());
+ mm.add(filterByColumn);
+ mm.add(clearAllFilters);
+ mm.add(clearAllSorting);
+ mm.add(new Separator());
+ mm.add(removeSelected);
+ mm.add(removeNonSelected);
+ mm.add(new GroupMarker(XViewer.MENU_GROUP_POST));
+ }
+
+ public void createTableCustomizationMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("Table Customization");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+ }
+
+ public void createViewTableReportMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("View Table Report");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ performViewTableReport();
+ }
+ });
+ }
+
+ public void addFilterMenuBlock(Menu popupMenu) {
+ createFilterByColumnMenuItem(popupMenu);
+ createClearAllFiltersMenuItem(popupMenu);
+ createClearAllSortingMenuItem(popupMenu);
+ }
+
+ public void createFilterByColumnMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("Filter By Column");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ performFilterByColumn();
+ }
+ });
+ }
+
+ public void createClearAllFiltersMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("Clear All Filters");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.getCustomizeMgr().clearFilters();
+ }
+ });
+ }
+
+ public void createClearAllSortingMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("Clear All Sorting");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.getCustomizeMgr().clearSorter();
+ }
+ });
+ }
+
+ public void addCopyViewMenuBlock(Menu popupMenu) {
+ createViewSelectedCellMenuItem(popupMenu);
+ createCopyRowsMenuItem(popupMenu);
+ createCopyCellsMenuItem(popupMenu);
+ }
+
+ public void createCopyRowsMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("Copy Selected Row(s)- Ctrl-C");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ performCopy();
+ }
+ });
+ }
+
+ public void createCopyCellsMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("Copy Selected Column - Ctrl-Shift-C");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ performCopyCell();
+ }
+ });
+ }
+
+ public void createViewSelectedCellMenuItem(Menu popupMenu) {
+ final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
+ item.setText("View Selected Cell Data");
+ item.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ performViewCell();
+ }
+ });
+ }
+
+ protected void setupActions() {
+ removeSelected = new Action("Remove Selected from View") {
+ @Override
+ public void run() {
+ performRemoveSelectedRows();
+ };
+ };
+ removeNonSelected = new Action("Remove Non-Selected from View") {
+ @Override
+ public void run() {
+ performRemoveNonSelectedRows();
+ };
+ };
+ copySelected = new Action("Copy Selected Row(s)- Ctrl-C") {
+ @Override
+ public void run() {
+ performCopy();
+ };
+ };
+ viewSelectedCell = new Action("View Selected Cell Data") {
+ @Override
+ public void run() {
+ performViewCell();
+ };
+ };
+ copySelectedCell = new Action("Copy Selected Column - Ctrl-Shift-C") {
+ @Override
+ public void run() {
+ performCopyCell();
+ };
+ };
+ clearAllSorting = new Action("Clear All Sorting") {
+ @Override
+ public void run() {
+ xViewer.getCustomizeMgr().clearSorter();
+ };
+ };
+ clearAllFilters = new Action("Clear All Filters") {
+ @Override
+ public void run() {
+ xViewer.getCustomizeMgr().clearFilters();
+ };
+ };
+ filterByColumn = new Action("Filter By Column") {
+ @Override
+ public void run() {
+ performFilterByColumn();
+ };
+ };
+ tableProperties = new Action("Table Customization") {
+ @Override
+ public void run() {
+ xViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ };
+ viewTableReport = new Action("View Table Report") {
+ @Override
+ public void run() {
+ performViewTableReport();
+ }
+ };
+ columnMultiEdit = new Action("Column Multi Edit") {
+ @Override
+ public void run() {
+ Set<TreeColumn> editableColumns = new HashSet<TreeColumn>();
+ Collection<TreeItem> selectedTreeItems = Arrays.asList(xViewer.getTree().getSelection());
+ for (TreeColumn treeCol : xViewer.getTree().getColumns()) {
+ if (xViewer.isColumnMultiEditable(treeCol, selectedTreeItems)) {
+ editableColumns.add(treeCol);
+ }
+ }
+ if (editableColumns.size() == 0) {
+ XViewerLib.popup("ERROR", "No Columns Are Multi-Editable");
+ return;
+ }
+ ListDialogSortable ld = new ListDialogSortable(new XViewerColumnSorter(), xViewer.getTree().getShell());
+ ld.setMessage("Select Column to Edit");
+ ld.setInput(editableColumns);
+ ld.setLabelProvider(treeColumnLabelProvider);
+ ld.setContentProvider(new ArrayContentProvider());
+ ld.setTitle("Select Column to Edit");
+ int result = ld.open();
+ if (result != 0) return;
+ xViewer.handleColumnMultiEdit((TreeColumn) ld.getResult()[0], selectedTreeItems);
+ }
+ };
+ }
+
+ private void performViewTableReport() {
+ if (xViewer.getXViewerFactory().getXViewerTreeReport(xViewer) != null) {
+ xViewer.getXViewerFactory().getXViewerTreeReport(xViewer).open();
+ } else {
+ new XViewerTreeReport(xViewer).open();
+ }
+ }
+
+ private class KeySelectedListener implements KeyListener {
+ public void keyPressed(KeyEvent e) {
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.keyCode == 'c' && e.stateMask == (SWT.CONTROL | SWT.SHIFT)) {
+ performCopyCell();
+ } else if (e.keyCode == 'c' && e.stateMask == SWT.CONTROL) {
+ performCopy();
+ }
+ }
+ }
+
+ private void performRemoveSelectedRows() {
+ try {
+ TreeItem[] items = xViewer.getTree().getSelection();
+ if (items.length == 0) {
+ XViewerLib.popup("ERROR", "No items to copy");
+ return;
+ }
+ Set<Object> objs = new HashSet<Object>();
+ for (TreeItem item : items) {
+ objs.add(item.getData());
+ }
+ xViewer.remove(objs);
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void performRemoveNonSelectedRows() {
+ try {
+ TreeItem[] items = xViewer.getTree().getSelection();
+ if (items.length == 0) {
+ XViewerLib.popup("ERROR", "No items to copy");
+ return;
+ }
+ Set<Object> keepObjects = new HashSet<Object>();
+ for (TreeItem item : items) {
+ keepObjects.add(item.getData());
+ }
+ xViewer.load(keepObjects);
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void performViewCell() {
+ try {
+ TreeColumn treeCol = xViewer.getRightClickSelectedColumn();
+ TreeItem treeItem = xViewer.getRightClickSelectedItem();
+ if (treeCol != null) {
+ XViewerColumn xCol = (XViewerColumn) treeCol.getData();
+ String data =
+ ((XViewerLabelProvider) xViewer.getLabelProvider()).getColumnText(treeItem.getData(), xCol,
+ xViewer.getRightClickSelectedColumnNum());
+ if (data != null && !data.equals("")) {
+ String html = HtmlUtil.simplePage(HtmlUtil.pre(HtmlUtil.textToHtml(data)));
+ new HtmlDialog(treeCol.getText() + " Data", treeCol.getText() + " Data", html).open();
+ }
+ }
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void performFilterByColumn() {
+ Set<TreeColumn> visibleColumns = new HashSet<TreeColumn>();
+ for (TreeColumn treeCol : xViewer.getTree().getColumns())
+ if (treeCol.getWidth() > 0) visibleColumns.add(treeCol);
+ if (visibleColumns.size() == 0) {
+ XViewerLib.popup("ERROR", "No Columns Are Available");
+ return;
+ }
+ ListDialog ld = new ListDialog(xViewer.getTree().getShell()) {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control control = super.createDialogArea(container);
+ getTableViewer().setSorter(treeColumnSorter);
+ return control;
+ }
+ };
+ ld.setMessage("Select Column to Filter");
+ ld.setInput(visibleColumns);
+ ld.setLabelProvider(treeColumnLabelProvider);
+ ld.setContentProvider(new ArrayContentProvider());
+ ld.setTitle("Select Column to Filter");
+ int result = ld.open();
+ if (result != 0) return;
+ TreeColumn treeCol = (TreeColumn) ld.getResult()[0];
+ String colId = ((XViewerColumn) treeCol.getData()).getId();
+ xViewer.getColumnFilterDataUI().promptSetFilter(colId);
+
+ }
+
+ private void performCopyCell() {
+ Set<TreeColumn> visibleColumns = new HashSet<TreeColumn>();
+ TreeItem[] items = xViewer.getTree().getSelection();
+ if (items.length == 0) {
+ XViewerLib.popup("ERROR", "No items to copy");
+ return;
+ }
+ ArrayList<String> textTransferData = new ArrayList<String>();
+ ITableLabelProvider labelProv = (ITableLabelProvider) xViewer.getLabelProvider();
+ for (TreeColumn treeCol : xViewer.getTree().getColumns())
+ if (treeCol.getWidth() > 0) visibleColumns.add(treeCol);
+ if (visibleColumns.size() == 0) {
+ XViewerLib.popup("ERROR", "No Columns Are Available");
+ return;
+ }
+ ListDialog ld = new ListDialog(xViewer.getTree().getShell()) {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control control = super.createDialogArea(container);
+ getTableViewer().setSorter(treeColumnSorter);
+ return control;
+ }
+ };
+ ld.setMessage("Select Column to Copy");
+ ld.setInput(visibleColumns);
+ ld.setLabelProvider(treeColumnLabelProvider);
+ ld.setContentProvider(new ArrayContentProvider());
+ ld.setTitle("Select Column to Copy");
+ int result = ld.open();
+ if (result != 0) return;
+ TreeColumn treeCol = (TreeColumn) ld.getResult()[0];
+ StringBuffer sb = new StringBuffer();
+ for (TreeItem item : items) {
+ for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
+ if (xViewer.getTree().getColumn(x).equals(treeCol)) {
+ sb.append(labelProv.getColumnText(item.getData(), x) + "\n");
+ }
+ }
+ }
+ textTransferData.add(sb.toString());
+
+ if (textTransferData.size() > 0) clipboard.setContents(new Object[] {CollectionsUtil.toString(textTransferData,
+ null, ", ", null)}, new Transfer[] {TextTransfer.getInstance()});
+ }
+
+ private void performCopy() {
+ TreeItem[] items = xViewer.getTree().getSelection();
+ if (items.length == 0) {
+ XViewerLib.popup("ERROR", "No items to copy");
+ return;
+ }
+ ArrayList<String> textTransferData = new ArrayList<String>();
+ ITableLabelProvider labelProv = (ITableLabelProvider) xViewer.getLabelProvider();
+ if (items != null && items.length > 0) {
+ StringBuffer sb = new StringBuffer();
+ for (TreeItem item : items) {
+ List<String> strs = new ArrayList<String>();
+ for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
+ if (xViewer.getTree().getColumn(x).getWidth() > 0) {
+ String data = labelProv.getColumnText(item.getData(), x);
+ if (data != null) strs.add(data);
+ }
+ }
+ sb.append(CollectionsUtil.toString("\t", strs) + "\n");
+ }
+ textTransferData.add(sb.toString());
+
+ if (textTransferData.size() > 0) clipboard.setContents(new Object[] {CollectionsUtil.toString(
+ textTransferData, null, ", ", null)}, new Transfer[] {TextTransfer.getInstance()});
+ }
+ }
+
+ static LabelProvider treeColumnLabelProvider = new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof TreeColumn) {
+ return ((TreeColumn) element).getText();
+ }
+ return "Unknown element type";
+ }
+ };
+
+ static ViewerSorter treeColumnSorter = new ViewerSorter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((TreeColumn) e1).getText(), ((TreeColumn) e2).getText());
+ }
+ };
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomizations.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomizations.java
new file mode 100644
index 00000000000..16f12ea5881
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/XViewerCustomizations.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.nebula.widgets.xviewer.customize;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Default implementation of IViewerCustomizations interface
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerCustomizations implements IXViewerCustomizations {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#deleteCustomization(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ public void deleteCustomization(CustomizeData custData) throws Exception {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#getCustDatas()
+ */
+ public List<CustomizeData> getSavedCustDatas() {
+ return new ArrayList<CustomizeData>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#getUserDefaultCustData()
+ */
+ public CustomizeData getUserDefaultCustData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#isCustomizationUserDefault(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ public boolean isCustomizationUserDefault(CustomizeData custData) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#saveCustomization(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ public void saveCustomization(CustomizeData custData) throws Exception {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#setUserDefaultCustData(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData, boolean)
+ */
+ public void setUserDefaultCustData(CustomizeData newCustData, boolean set) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#isCustomizationPersistAvailable()
+ */
+ public boolean isCustomizationPersistAvailable() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/CustomizationDataSelectionDialog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/CustomizationDataSelectionDialog.java
new file mode 100644
index 00000000000..6d7ce7894c2
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/CustomizationDataSelectionDialog.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.nebula.widgets.xviewer.customize.dialog;
+
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeDataLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * Provides dialog for saving table customizations.
+ *
+ * @author Donald G. Dunne
+ */
+public class CustomizationDataSelectionDialog extends ListDialog {
+
+ private Text custText;
+ private Label custTextLabel;
+ private String enteredName;
+ private boolean saveGlobal = false;
+ private Button saveGlobalCheck;
+ private Label saveGlobalCheckLabel;
+ private CustomizeData selectedCustData = null;
+ private final XViewer xViewer;
+
+ public CustomizationDataSelectionDialog(XViewer xViewer, List<CustomizeData> custDatas) {
+ this(Display.getCurrent().getActiveShell(), xViewer, custDatas);
+ }
+
+ public CustomizationDataSelectionDialog(Shell parent, XViewer xViewer, List<CustomizeData> custDatas) {
+ super(Display.getCurrent().getActiveShell());
+ this.xViewer = xViewer;
+ setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new CustomizeDataLabelProvider(xViewer));
+ setInput(custDatas);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ setTitle("Save Customization");
+ setMessage("Enter name or select customization.");
+ }
+
+ @Override
+ protected void okPressed() {
+ if (custText.getText().equals("") && getSelectedCustData() == null) {
+ XViewerLib.popup("ERROR", "Must select customization or enter new customization name.");
+ return;
+ }
+ super.okPressed();
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Control c = super.createDialogArea(container);
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ comp.setLayout(new GridLayout(2, true));
+
+ custTextLabel = new Label(comp, SWT.None);
+ custTextLabel.setText("Enter New Customization Name");
+
+ custText = new Text(comp, SWT.BORDER);
+ custText.setFocus();
+ custText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+ custText.addModifyListener(new ModifyListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+ */
+ public void modifyText(ModifyEvent e) {
+ enteredName = custText.getText();
+ }
+ });
+
+ if (xViewer.getXViewerFactory().isAdmin()) {
+ comp = new Composite(container, SWT.NONE);
+ comp.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+ comp.setLayout(new GridLayout(2, false));
+
+ saveGlobalCheckLabel = new Label(comp, SWT.None);
+ saveGlobalCheckLabel.setText("Save Global");
+
+ saveGlobalCheck = new Button(comp, SWT.CHECK);
+ saveGlobalCheck.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ saveGlobal = saveGlobalCheck.getSelection();
+ }
+ });
+ }
+
+ getTableViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ selectedCustData = getSelectedCustomizeData();
+ if (saveGlobalCheck != null) {
+ saveGlobalCheck.setSelection(!selectedCustData.isPersonal());
+ saveGlobal = !selectedCustData.isPersonal();
+ }
+ }
+ });
+ return c;
+ }
+
+ private CustomizeData getSelectedCustomizeData() {
+ IStructuredSelection selection = (IStructuredSelection) getTableViewer().getSelection();
+ if (selection.size() == 0) return null;
+ Iterator<?> i = selection.iterator();
+ return (CustomizeData) i.next();
+ }
+
+ /**
+ * @return the selectedCustData
+ */
+ public CustomizeData getSelectedCustData() {
+ return selectedCustData;
+ }
+
+ public String getEnteredName() {
+ return enteredName;
+ }
+
+ public boolean isSaveGlobal() {
+ return saveGlobal;
+ }
+
+ public void setSaveGlobal(boolean saveGlobal) {
+ this.saveGlobal = saveGlobal;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/XViewerCustomizeDialog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/XViewerCustomizeDialog.java
new file mode 100644
index 00000000000..98cdb9ad765
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/customize/dialog/XViewerCustomizeDialog.java
@@ -0,0 +1,1150 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.customize.dialog;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumnLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumnSorter;
+import org.eclipse.nebula.widgets.xviewer.customize.ColumnFilterData;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeDataLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeManager;
+import org.eclipse.nebula.widgets.xviewer.customize.SortingData;
+import org.eclipse.nebula.widgets.xviewer.util.internal.ArrayTreeContentProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.CollectionsUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.PatternFilter;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerFilteredTree;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.DialogWithEntry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * Provides dialog for table customization
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerCustomizeDialog extends MessageDialog {
+ private String title = "Customize Table";
+ private static String buttons[] = new String[] {"Ok", "Apply", "Cancel"};
+ private final XViewer xViewerToCustomize;
+ private XViewerFilteredTree custTable;
+ private XViewerFilteredTree hiddenColTable;
+ private XViewerFilteredTree visibleColTable;
+ private Text sorterText;
+ private Text filterText;
+ private Text columnFilterText;
+ // Select Customization Buttons
+ Button setDefaultButton, deleteButton;
+ // Config Customization Buttons - Moving items
+ Button addItemButton, addAllItemButton, removeItemButton, removeAllItemButton, moveUpButton, moveDownButton;
+ // Config Customization Buttons
+ Button saveButton, renameButton;
+ private static String SET_AS_DEFAULT = " Set as Default ";
+ private static String REMOVE_DEFAULT = "Remove Default";
+ private CustomizeData defaultTableCustData;
+ boolean isFeedbackAfter = false;
+
+ public XViewerCustomizeDialog(XViewer xViewer) {
+ this(xViewer, Display.getCurrent().getActiveShell());
+ }
+
+ private XViewerCustomizeDialog(XViewer xViewer, Shell parentShell) {
+ super(parentShell, "", null, "", MessageDialog.NONE, buttons, 0);
+ this.xViewerToCustomize = xViewer;
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ DragSourceAdapter hiddenTableDragListener = new DragSourceAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragStart(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ if (hiddenColTable.getViewer().getSelection().isEmpty()) {
+ event.doit = false;
+ }
+ }
+
+ /*
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ List<XViewerColumn> selCols = getHiddenTableSelection();
+ Collection<String> ids = new ArrayList<String>(selCols.size());
+
+ for (XViewerColumn xCol : selCols)
+ ids.add(xCol.getId());
+
+ event.data = CollectionsUtil.toString(ids, null, ", ", null);
+ }
+ }
+ };
+ DropTargetAdapter hiddenTableDropListener = new DropTargetAdapter() {
+
+ @Override
+ public void dragOperationChanged(DropTargetEvent event) {
+ }
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ if (event.data instanceof String) {
+ performHiddenTableTextDrop(event);
+ }
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ performHiddenTableDragOver(event);
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ }
+ };
+
+ /**
+ * Drag should only be from visible table
+ *
+ * @param event
+ */
+ public void performHiddenTableDragOver(DropTargetEvent event) {
+ if (!TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+ // Only allow drag from visibleColTable
+ if (event.widget != visibleColTable) {
+ return;
+ }
+
+ event.detail = DND.DROP_MOVE;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void performHiddenTableTextDrop(DropTargetEvent event) {
+
+ String droppedIds = (String) event.data;
+
+ List<XViewerColumn> droppedVisibleTableXCols = new ArrayList<XViewerColumn>();
+ List<XViewerColumn> orderCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+ for (XViewerColumn xCol : orderCols) {
+ if (droppedIds.contains(xCol.getId())) {
+ droppedVisibleTableXCols.add(xCol);
+ }
+ }
+
+ moveFromVisibleToHidden(droppedVisibleTableXCols);
+ }
+
+ DragSourceAdapter visibleTableDragListener = new DragSourceAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragStart(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ if (visibleColTable.getViewer().getSelection().isEmpty()) {
+ event.doit = false;
+ }
+ }
+
+ /*
+ * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
+ */
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ List<XViewerColumn> selCols = getVisibleTableSelection();
+ Collection<String> ids = new ArrayList<String>(selCols.size());
+
+ for (XViewerColumn xCol : selCols)
+ ids.add(xCol.getId());
+
+ event.data = CollectionsUtil.toString(ids, null, ", ", null);
+ }
+ }
+ };
+ DropTargetAdapter visibleTableDropListener = new DropTargetAdapter() {
+
+ @Override
+ public void dragOperationChanged(DropTargetEvent event) {
+ }
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ if (event.data instanceof String) {
+ performVisibleTableTextDrop(event);
+ }
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ performVisibleTableDragOver(event);
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ }
+ };
+
+ @SuppressWarnings("unchecked")
+ public void performVisibleTableTextDrop(DropTargetEvent event) {
+ Tree tree = visibleColTable.getViewer().getTree();
+ TreeItem dragOverTreeItem = tree.getItem(visibleColTable.getViewer().getTree().toControl(event.x, event.y));
+
+ String droppedIds = (String) event.data;
+
+ // Determine dragOverXCol, if any
+ XViewerColumn dragOverXCol = null;
+ if (dragOverTreeItem != null) {
+ dragOverXCol = (XViewerColumn) dragOverTreeItem.getData();
+ // Don't allow dropping on same item as dragging
+ if (droppedIds.contains(dragOverXCol.getId())) {
+ return;
+ }
+ }
+
+ List<XViewerColumn> droppedXCols = new ArrayList<XViewerColumn>();
+ List<XViewerColumn> orderCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+ for (XViewerColumn xCol : orderCols) {
+ if (droppedIds.contains(xCol.getId())) {
+ droppedXCols.add(xCol);
+ }
+ }
+ for (XViewerColumn xCol : (List<XViewerColumn>) hiddenColTable.getViewer().getInput()) {
+ if (droppedIds.contains(xCol.getId())) {
+ droppedXCols.add(xCol);
+ }
+ }
+ orderCols.removeAll(droppedXCols);
+
+ int dropXColOrderColsIndex = 0;
+ for (XViewerColumn xCol : (List<XViewerColumn>) visibleColTable.getViewer().getInput()) {
+ if (dragOverXCol != null && xCol.getId().equals(dragOverXCol.getId())) {
+ break;
+ }
+ dropXColOrderColsIndex++;
+ }
+
+ if (isFeedbackAfter) {
+ orderCols.addAll(dropXColOrderColsIndex + 1, droppedXCols);
+ } else {
+ orderCols.addAll(dropXColOrderColsIndex, droppedXCols);
+ }
+ visibleColTable.getViewer().setInput(orderCols);
+
+ List<XViewerColumn> hiddenCols = (List<XViewerColumn>) hiddenColTable.getViewer().getInput();
+ hiddenCols.removeAll(droppedXCols);
+ hiddenColTable.getViewer().setInput(hiddenCols);
+ }
+
+ public void performVisibleTableDragOver(DropTargetEvent event) {
+ if (!TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+
+ Tree tree = visibleColTable.getViewer().getTree();
+ TreeItem dragOverTreeItem = tree.getItem(visibleColTable.getViewer().getTree().toControl(event.x, event.y));
+ if (dragOverTreeItem == null) {
+ return;
+ }
+
+ event.feedback = DND.FEEDBACK_EXPAND;
+ event.detail = DND.DROP_NONE;
+
+ if (dragOverTreeItem != null) {
+ IStructuredSelection selectedItem = (IStructuredSelection) visibleColTable.getViewer().getSelection();
+ if (selectedItem == null || selectedItem.isEmpty()) {
+ selectedItem = (IStructuredSelection) hiddenColTable.getViewer().getSelection();
+ }
+ if (selectedItem == null) {
+ return;
+ }
+ Object obj = selectedItem.getFirstElement();
+ if (obj instanceof XViewerColumn) {
+ if (isFeedbackAfter) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ } else {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.detail = DND.DROP_MOVE;
+ }
+ } else {
+ tree.setInsertMark(null, false);
+ }
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+
+ if (getShell() != null) getShell().setText(title);
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ final Composite comp = new Composite(parent, SWT.NONE);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.heightHint = 700;
+ comp.setLayoutData(gd);
+ final GridLayout gridLayout_2 = new GridLayout();
+ gridLayout_2.numColumns = 2;
+ comp.setLayout(gridLayout_2);
+
+ final Label namespaceLabel = new Label(comp, SWT.NONE);
+ GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false);
+ gridData.horizontalSpan = 2;
+ namespaceLabel.setLayoutData(gridData);
+ namespaceLabel.setText("Customization Namespace: " + xViewerToCustomize.getXViewerFactory().getNamespace());
+
+ final Label selectCustomizationLabel = new Label(comp, SWT.NONE);
+ selectCustomizationLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ selectCustomizationLabel.setText("Select Customization");
+
+ // Column Configuration
+ final Group configureColumnsGroup = new Group(comp, SWT.NONE);
+ configureColumnsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
+ configureColumnsGroup.setText("Configure Customization");
+ final GridLayout gridLayout = new GridLayout();
+ gridLayout.marginWidth = 3;
+ gridLayout.marginHeight = 3;
+ gridLayout.numColumns = 3;
+ configureColumnsGroup.setLayout(gridLayout);
+
+ final Composite hiddenTableComp = new Composite(configureColumnsGroup, SWT.NONE);
+ hiddenTableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ final GridLayout gridLayout_4 = new GridLayout();
+ gridLayout_4.marginWidth = 0;
+ gridLayout_4.marginHeight = 0;
+ hiddenTableComp.setLayout(gridLayout_4);
+
+ final Label hiddenColumnsLabel = new Label(hiddenTableComp, SWT.NONE);
+ hiddenColumnsLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ hiddenColumnsLabel.setText("Hidden Columns");
+
+ // Hidden Column Table
+ hiddenColTable = new XViewerFilteredTree(hiddenTableComp);
+ final Tree table_1 = hiddenColTable.getViewer().getTree();
+ final GridData gd_table_1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2);
+ gd_table_1.widthHint = 300;
+ table_1.setLayoutData(gd_table_1);
+ hiddenColTable.getViewer().setLabelProvider(new XViewerColumnLabelProvider());
+ hiddenColTable.getViewer().setContentProvider(new ArrayTreeContentProvider());
+ hiddenColTable.getViewer().setSorter(new XViewerColumnSorter());
+ hiddenColTable.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateButtonEnablements();
+ }
+ });
+
+ final Composite moveButtonComp = new Composite(configureColumnsGroup, SWT.NONE);
+ moveButtonComp.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ final GridLayout gridLayout_5 = new GridLayout();
+ gridLayout_5.marginWidth = 0;
+ gridLayout_5.marginHeight = 0;
+ moveButtonComp.setLayout(gridLayout_5);
+
+ addItemButton = new Button(moveButtonComp, SWT.NONE);
+ addItemButton.setText(">");
+ addItemButton.setToolTipText("Add");
+ addItemButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ addItemButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleAddItemButton();
+ }
+ });
+
+ addAllItemButton = new Button(moveButtonComp, SWT.NONE);
+ addAllItemButton.setText(">>");
+ addAllItemButton.setToolTipText("Add All");
+ addAllItemButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleAddAllItemButton();
+ }
+ });
+
+ removeItemButton = new Button(moveButtonComp, SWT.NONE);
+ removeItemButton.setText("<");
+ removeItemButton.setToolTipText("Remove");
+ removeItemButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ removeItemButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleRemoveItemButton();
+ }
+ });
+
+ removeAllItemButton = new Button(moveButtonComp, SWT.NONE);
+ removeAllItemButton.setText("<<");
+ removeAllItemButton.setToolTipText("Remove All");
+ removeAllItemButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleRemoveAllItemButton();
+ }
+ });
+
+ moveUpButton = new Button(moveButtonComp, SWT.NONE);
+ moveUpButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ moveUpButton.setText("^");
+ moveUpButton.setToolTipText("Move Up");
+ moveUpButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleMoveUpButton();
+ }
+ });
+
+ moveDownButton = new Button(moveButtonComp, SWT.NONE);
+ moveDownButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ moveDownButton.setText("v");
+ moveDownButton.setToolTipText("Move Down");
+ moveDownButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleMoveDownButton();
+ }
+ });
+
+ final Composite visibleTableComp = new Composite(configureColumnsGroup, SWT.NONE);
+ visibleTableComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ final GridLayout gridLayout_6 = new GridLayout();
+ gridLayout_6.marginWidth = 0;
+ gridLayout_6.marginHeight = 0;
+ visibleTableComp.setLayout(gridLayout_6);
+
+ final Label visibleColumnsLabel = new Label(visibleTableComp, SWT.NONE);
+ visibleColumnsLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ visibleColumnsLabel.setText("Visible Columns");
+
+ // Visible Column Table
+ visibleColTable = new XViewerFilteredTree(visibleTableComp);
+ final Tree table = visibleColTable.getViewer().getTree();
+ final GridData gd_table = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_table.widthHint = 300;
+ table.setLayoutData(gd_table);
+ visibleColTable.getViewer().setLabelProvider(new XViewerColumnLabelProvider());
+ visibleColTable.getViewer().setContentProvider(new ArrayTreeContentProvider());
+ visibleColTable.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateButtonEnablements();
+ }
+ });
+ visibleColTable.getViewer().addDragSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()},
+ visibleTableDragListener);
+ visibleColTable.getViewer().addDropSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()},
+ visibleTableDropListener);
+ hiddenColTable.getViewer().addDragSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()},
+ hiddenTableDragListener);
+ hiddenColTable.getViewer().addDropSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()},
+ hiddenTableDropListener);
+
+ gridLayout.numColumns = 3;
+ gridLayout.numColumns = 3;
+
+ // Sorter text block
+ final Composite composite_2 = new Composite(configureColumnsGroup, SWT.NONE);
+ composite_2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
+ final GridLayout gridLayout_3 = new GridLayout();
+ gridLayout_3.numColumns = 3;
+ composite_2.setLayout(gridLayout_3);
+
+ final Label sorterLabel = new Label(composite_2, SWT.NONE);
+ sorterLabel.setText("Sorter:");
+
+ sorterText = new Text(composite_2, SWT.BORDER);
+ sorterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ final Label clearSorterLabel = new Label(composite_2, SWT.PUSH);
+ clearSorterLabel.setImage(XViewerLib.getImage("clear.gif"));
+ clearSorterLabel.addMouseListener(new MouseListener() {
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+
+ public void mouseUp(MouseEvent e) {
+ sorterText.setText("");
+ }
+ });
+
+ // Filter text block
+ final Composite composite_7 = new Composite(composite_2, SWT.NONE);
+ composite_7.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
+ final GridLayout gridLayout_13 = new GridLayout();
+ gridLayout_13.numColumns = 3;
+ composite_7.setLayout(gridLayout_13);
+
+ final Label filterLabel = new Label(composite_7, SWT.NONE);
+ filterLabel.setText("Filter Text:");
+
+ filterText = new Text(composite_7, SWT.BORDER);
+ filterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ final Label clearFilterLabel = new Label(composite_7, SWT.PUSH);
+ clearFilterLabel.setImage(XViewerLib.getImage("clear.gif"));
+ clearFilterLabel.addMouseListener(new MouseListener() {
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+
+ public void mouseUp(MouseEvent e) {
+ filterText.setText("");
+ }
+ });
+
+ // Filter text block
+ final Composite composite_8 = new Composite(composite_2, SWT.NONE);
+ composite_8.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
+ final GridLayout gridLayout_14 = new GridLayout();
+ gridLayout_14.numColumns = 3;
+ composite_8.setLayout(gridLayout_14);
+
+ final Label columnFilterLabel = new Label(composite_8, SWT.NONE);
+ columnFilterLabel.setText("Column Filter:");
+
+ columnFilterText = new Text(composite_8, SWT.BORDER);
+ columnFilterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ final Label clearColumnFilterLabel = new Label(composite_8, SWT.PUSH);
+ clearColumnFilterLabel.setImage(XViewerLib.getImage("clear.gif"));
+ clearColumnFilterLabel.addMouseListener(new MouseListener() {
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+
+ }
+
+ public void mouseUp(MouseEvent e) {
+ columnFilterText.setText("");
+ }
+ });
+
+ // Button block
+ final Composite composite_1 = new Composite(composite_2, SWT.NONE);
+ composite_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+ final GridLayout gridLayout_10 = new GridLayout();
+ gridLayout_10.numColumns = 5;
+ composite_1.setLayout(gridLayout_10);
+
+ // Customization Buttons
+ renameButton = new Button(composite_1, SWT.NONE);
+ renameButton.setText("Rename Column");
+ renameButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleRenameButton();
+ }
+ });
+
+ saveButton = new Button(composite_1, SWT.NONE);
+ saveButton.setText("Save Customization");
+ saveButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleSaveButton();
+ }
+ });
+
+ // Customization Table and Buttons
+ final Composite custComp = new Composite(comp, SWT.NONE);
+ final GridData gd_composite_6 = new GridData(SWT.FILL, SWT.FILL, true, true);
+ custComp.setLayoutData(gd_composite_6);
+ final GridLayout gridLayout_1 = new GridLayout();
+ gridLayout_1.marginWidth = 0;
+ gridLayout_1.marginHeight = 0;
+ custComp.setLayout(gridLayout_1);
+
+ // Customization Table
+ custTable = new XViewerFilteredTree(custComp, SWT.BORDER, new PatternFilter());
+ final Tree table_2 = custTable.getViewer().getTree();
+ final GridData gd_table_2 = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_table_2.heightHint = 270;
+ gd_table_2.widthHint = 200;
+ table_2.setLayoutData(gd_table_2);
+ custTable.getViewer().setLabelProvider(new CustomizeDataLabelProvider(xViewerToCustomize));
+ custTable.getViewer().setContentProvider(new ArrayTreeContentProvider());
+ custTable.getViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (((CustomizeData) e1).getName().startsWith("-"))
+ return -1;
+ else if (((CustomizeData) e2).getName().startsWith("-"))
+ return 1;
+ else
+ return getComparator().compare(((CustomizeData) e1).getName(), ((CustomizeData) e2).getName());
+ }
+ });
+ custTable.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleCustTableSelectionChanged();
+ updateButtonEnablements();
+ storeCustTableSelection();
+ }
+ });
+
+ // Customization Table Buttons
+ final Composite composite = new Composite(comp, SWT.NONE);
+ composite.setLayoutData(new GridData());
+ final GridLayout gridLayout_7 = new GridLayout();
+ gridLayout_7.numColumns = 4;
+ composite.setLayout(gridLayout_7);
+
+ setDefaultButton = new Button(composite, SWT.NONE);
+ setDefaultButton.setLayoutData(new GridData());
+ setDefaultButton.setText(SET_AS_DEFAULT);
+ setDefaultButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleSetDefaultButton();
+ updateButtonEnablements();
+ }
+ });
+
+ deleteButton = new Button(composite, SWT.NONE);
+ deleteButton.setLayoutData(new GridData());
+ deleteButton.setText("Delete");
+ deleteButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ handleDeleteButton();
+ updateButtonEnablements();
+ }
+ });
+
+ try {
+ loadCustomizeTable();
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ updateButtonEnablements();
+
+ return comp;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void handleAddItemButton() {
+ // Remove from hidden
+ List<XViewerColumn> hiddenSelCols = getHiddenTableSelection();
+ if (hiddenSelCols == null) return;
+ List<XViewerColumn> hiddenCols = (List<XViewerColumn>) hiddenColTable.getViewer().getInput();
+ hiddenCols.removeAll(hiddenSelCols);
+ hiddenColTable.getViewer().setInput(hiddenCols);
+
+ // Add to visible
+ List<XViewerColumn> visibleCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+ visibleCols.addAll(hiddenSelCols);
+ visibleColTable.getViewer().setInput(visibleCols);
+ }
+
+ private void handleRemoveItemButton() {
+ List<XViewerColumn> visibleSelCols = getVisibleTableSelection();
+ if (visibleSelCols != null && visibleSelCols.size() != 0) {
+ moveFromVisibleToHidden(visibleSelCols);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void moveFromVisibleToHidden(List<XViewerColumn> visibleSelCols) {
+ // Remove from visible
+ if (visibleSelCols == null || visibleSelCols.size() == 0) return;
+ List<XViewerColumn> visibleCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+ visibleCols.removeAll(visibleSelCols);
+ visibleColTable.getViewer().setInput(visibleCols);
+
+ // Add to hidden
+ List<XViewerColumn> hiddenCols = (List<XViewerColumn>) hiddenColTable.getViewer().getInput();
+ hiddenCols.addAll(visibleSelCols);
+ hiddenColTable.getViewer().setInput(hiddenCols);
+
+ updateSortTextField();
+ updateColumnFilterField();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void updateSortTextField() {
+ // get visible column ids
+ List<String> visibleColumnIds = new ArrayList<String>();
+ for (XViewerColumn xCol : (List<XViewerColumn>) visibleColTable.getViewer().getInput()) {
+ visibleColumnIds.add(xCol.getId());
+ }
+ // get current sortIds
+ SortingData sortingData = new SortingData(sorterText.getText());
+ List<String> currentSortIds = sortingData.getSortingIds();
+
+ // get complement to determine ids that are sorted but not visible == invalid
+ for (String invalidId : CollectionsUtil.setComplement(currentSortIds, visibleColumnIds)) {
+ sortingData.removeSortingName(invalidId);
+ }
+ if (sorterText != null && !sorterText.isDisposed()) {
+ sorterText.setText(sortingData.getXml());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void updateColumnFilterField() {
+ // get visible column ids
+ List<String> visibleColumnIds = new ArrayList<String>();
+ for (XViewerColumn xCol : (List<XViewerColumn>) visibleColTable.getViewer().getInput()) {
+ visibleColumnIds.add(xCol.getId());
+ }
+ // get current columnFilterIds
+ ColumnFilterData columnFilterData = new ColumnFilterData();
+ columnFilterData.setFromXml(columnFilterText.getText());
+ Set<String> currentSortIds = columnFilterData.getColIds();
+
+ // get complement to determine ids that are sorted but not visible == invalid
+ for (String invalidId : CollectionsUtil.setComplement(currentSortIds, visibleColumnIds)) {
+ columnFilterData.removeFilterText(invalidId);
+ }
+ if (columnFilterText != null && !columnFilterText.isDisposed()) {
+ columnFilterText.setText(columnFilterData.getXml());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void handleAddAllItemButton() {
+
+ List<XViewerColumn> hiddenCols = (List<XViewerColumn>) hiddenColTable.getViewer().getInput();
+
+ List<XViewerColumn> visibleCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+
+ visibleCols.addAll(hiddenCols);
+ visibleColTable.getViewer().setInput(visibleCols);
+
+ hiddenCols.clear();
+ hiddenColTable.getViewer().setInput(hiddenCols);
+
+ updateSortTextField();
+ updateColumnFilterField();
+ }
+
+ /**
+ * for testing purposes
+ */
+ protected void handleAddAllItem() {
+ handleAddAllItemButton();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void handleRemoveAllItemButton() {
+
+ List<XViewerColumn> visibleCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+
+ List<XViewerColumn> hiddenCols = (List<XViewerColumn>) hiddenColTable.getViewer().getInput();
+ hiddenCols.addAll(visibleCols);
+ hiddenColTable.getViewer().setInput(hiddenCols);
+
+ // Add to visible
+ visibleCols.clear();
+ visibleColTable.getViewer().setInput(visibleCols);
+
+ updateSortTextField();
+ updateColumnFilterField();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void handleMoveUpButton() {
+ List<XViewerColumn> selCols = getVisibleTableSelection();
+ if (selCols == null) return;
+ List<XViewerColumn> orderCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+ int index = orderCols.indexOf(selCols.iterator().next());
+ if (index > 0) {
+ orderCols.removeAll(selCols);
+ orderCols.addAll(index - 1, selCols);
+ visibleColTable.getViewer().setInput(orderCols);
+ } else
+ return;
+ ArrayList<XViewerColumn> selected = new ArrayList<XViewerColumn>();
+ selected.addAll(selCols);
+ visibleColTable.getViewer().setSelection(new StructuredSelection(selected.toArray(new Object[selected.size()])));
+ visibleColTable.getViewer().getTree().setFocus();
+ updateButtonEnablements();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void handleMoveDownButton() {
+ List<XViewerColumn> selCols = getVisibleTableSelection();
+ if (selCols == null) return;
+ List<XViewerColumn> orderCols = (List<XViewerColumn>) visibleColTable.getViewer().getInput();
+ int index = orderCols.indexOf(selCols.iterator().next());
+ if (index < (orderCols.size() - selCols.size())) {
+ orderCols.removeAll(selCols);
+ orderCols.addAll(index + 1, selCols);
+ visibleColTable.getViewer().setInput(orderCols);
+ } else
+ return;
+ ArrayList<XViewerColumn> selected = new ArrayList<XViewerColumn>();
+ selected.addAll(selCols);
+ visibleColTable.getViewer().setSelection(new StructuredSelection(selected.toArray(new Object[selected.size()])));
+ visibleColTable.getViewer().getTree().setFocus();
+ updateButtonEnablements();
+ }
+
+ /**
+ * @return xColumns from hidden and visible customization lists
+ */
+ private List<XViewerColumn> getConfigCustXViewerColumns() {
+ List<XViewerColumn> xCols = new ArrayList<XViewerColumn>();
+ for (XViewerColumn xCol : getTableXViewerColumns(visibleColTable.getViewer())) {
+ xCol.setShow(true);
+ xCol.setXViewer(xViewerToCustomize);
+ xCols.add(xCol);
+ }
+ for (XViewerColumn xCol : getTableXViewerColumns(hiddenColTable.getViewer())) {
+ xCol.setShow(false);
+ xCol.setXViewer(xViewerToCustomize);
+ xCols.add(xCol);
+ }
+ return xCols;
+ }
+
+ private void handleSaveButton() {
+ try {
+ List<CustomizeData> custDatas = new ArrayList<CustomizeData>();
+ for (CustomizeData custData : xViewerToCustomize.getCustomizeMgr().getSavedCustDatas()) {
+ if (custData.isPersonal())
+ custDatas.add(custData);
+ else if (xViewerToCustomize.getXViewerFactory().isAdmin()) custDatas.add(custData);
+ }
+ CustomizationDataSelectionDialog diag = new CustomizationDataSelectionDialog(xViewerToCustomize, custDatas);
+ if (diag.open() == 0) {
+ String name = diag.getEnteredName();
+ try {
+ CustomizeData diagSelectedCustomizeData = diag.getSelectedCustData();
+ String diagEnteredNewName = diag.getEnteredName();
+ CustomizeData custData = getConfigCustomizeCustData();
+ if (diagEnteredNewName != null) {
+ custData.setName(name);
+ // Set currently selected to newly saved custData
+ selectedCustTableCustData = custData;
+ } else {
+ custData.setName(diagSelectedCustomizeData.getName());
+ custData.setGuid(diagSelectedCustomizeData.getGuid());
+ }
+ custData.setPersonal(!diag.isSaveGlobal());
+ xViewerToCustomize.getCustomizeMgr().saveCustomization(custData);
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ loadCustomizeTable();
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void handleRenameButton() {
+ XViewerColumn xCol = getVisibleTableSelection().iterator().next();
+ DialogWithEntry ed =
+ new DialogWithEntry(Display.getCurrent().getActiveShell(), "Rename Column", null, "Enter new name",
+ MessageDialog.QUESTION, new String[] {"OK", "Use Default", "Cancel"}, 0);
+ int result = ed.open();
+ if (result == 2) return;
+ if (result == 0) {
+ xViewerToCustomize.getCustomizeMgr().customizeColumnName(xCol, ed.getEntry());
+ } else if (result == 1) {
+ xViewerToCustomize.getCustomizeMgr().customizeColumnName(xCol, "");
+ }
+ visibleColTable.getViewer().update(xCol, null);
+ }
+
+ /**
+ * @return CustomizeData represented by the configuration area
+ */
+ private CustomizeData getConfigCustomizeCustData() {
+ CustomizeData custData = new CustomizeData();
+ custData.resetGuid();
+ custData.setNameSpace(xViewerToCustomize.getXViewerFactory().getNamespace());
+ custData.getColumnData().setColumns(getConfigCustXViewerColumns());
+ custData.getSortingData().setFromXml(sorterText.getText());
+ custData.getFilterData().setFilterText(filterText.getText());
+ custData.getColumnFilterData().setFromXml(columnFilterText.getText());
+ return custData;
+ }
+
+ private void handleLoadConfigCustButton() {
+ xViewerToCustomize.getCustomizeMgr().loadCustomization(getConfigCustomizeCustData());
+ xViewerToCustomize.refresh();
+ }
+
+ /**
+ * for testing purposes
+ */
+ protected void handleLoadConfigCust() {
+ handleLoadConfigCustButton();
+ }
+
+ private void handleSetDefaultButton() {
+ try {
+ CustomizeData custData = getCustTableSelection();
+ if (custData.getName().equals(CustomizeManager.TABLE_DEFAULT_LABEL) || custData.getName().equals(
+ CustomizeManager.CURRENT_LABEL)) {
+ XViewerLib.popup("ERROR", "Can't set table default or current as default");
+ System.err.println("Can't set table default or current as default");
+ return;
+ }
+ if (xViewerToCustomize.getCustomizeMgr().isCustomizationUserDefault(custData)) {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Remove Default",
+ "Remove \"" + custData.getName() + "\" as default for this table?")) {
+ xViewerToCustomize.getCustomizeMgr().setUserDefaultCustData(custData, false);
+ }
+ } else if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Set Default",
+ "Set \"" + custData.getName() + "\" as default for this table?")) {
+ xViewerToCustomize.getCustomizeMgr().setUserDefaultCustData(custData, true);
+ }
+ loadCustomizeTable();
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void handleDeleteButton() {
+ try {
+ CustomizeData custSel = getCustTableSelection();
+ if (custSel.getName().equals(CustomizeManager.TABLE_DEFAULT_LABEL) || custSel.getName().equals(
+ CustomizeManager.CURRENT_LABEL)) {
+ XViewerLib.popup("ERROR", "Can't delete defaults.");
+ return;
+ }
+ if (custSel == null) return;
+ if (!custSel.isPersonal() && !xViewerToCustomize.getXViewerFactory().isAdmin()) {
+ XViewerLib.popup("ERROR", "Global Customizations can only be deleted by admin");
+ return;
+ }
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Delete Customization",
+ "Delete \"" + custSel.getName() + "\" customization?")) {
+ xViewerToCustomize.getCustomizeMgr().deleteCustomization(custSel);
+ loadCustomizeTable();
+ updateButtonEnablements();
+ }
+ } catch (Exception ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void updateButtonEnablements() {
+ CustomizeData custData = getCustTableSelection();
+ setDefaultButton.setEnabled(xViewerToCustomize.getXViewerFactory().getXViewerCustomizations().isCustomizationPersistAvailable() && custTable.getViewer().getTree().isFocusControl() && custData != null && !custData.getName().equals(
+ CustomizeManager.TABLE_DEFAULT_LABEL) && !custData.getName().equals(CustomizeManager.CURRENT_LABEL));
+ if (custTable.getViewer().getTree().isFocusControl() && custData != null) {
+ setDefaultButton.setText(xViewerToCustomize.getCustomizeMgr().isCustomizationUserDefault(custData) ? REMOVE_DEFAULT : SET_AS_DEFAULT);
+ setDefaultButton.getParent().layout();
+ }
+ deleteButton.setEnabled(xViewerToCustomize.getXViewerFactory().getXViewerCustomizations().isCustomizationPersistAvailable() && custTable.getViewer().getTree().isFocusControl() && custData != null);
+ addItemButton.setEnabled(hiddenColTable.getViewer().getTree().isFocusControl() && getHiddenTableSelection() != null);
+ removeItemButton.setEnabled(visibleColTable.getViewer().getTree().isFocusControl() && getVisibleTableSelection() != null);
+ renameButton.setEnabled(visibleColTable.getViewer().getTree().isFocusControl() && getVisibleTableSelection() != null && getVisibleTableSelection().size() == 1);
+ moveDownButton.setEnabled(visibleColTable.getViewer().getTree().isFocusControl() && getVisibleTableSelection() != null);
+ moveUpButton.setEnabled(visibleColTable.getViewer().getTree().isFocusControl() && getVisibleTableSelection() != null);
+ saveButton.setEnabled(xViewerToCustomize.getXViewerFactory().getXViewerCustomizations() != null && xViewerToCustomize.getXViewerFactory().getXViewerCustomizations().isCustomizationPersistAvailable());
+ }
+
+ private void loadCustomizeTable() throws Exception {
+ // Add stored customization data
+ List<CustomizeData> custDatas = xViewerToCustomize.getCustomizeMgr().getSavedCustDatas();
+
+ // Add table default customization data
+ defaultTableCustData = xViewerToCustomize.getCustomizeMgr().getTableDefaultCustData();
+ defaultTableCustData.setName(CustomizeManager.TABLE_DEFAULT_LABEL);
+ custDatas.add(defaultTableCustData);
+
+ // Add current customization data generated from actual table
+ CustomizeData currentCustData = xViewerToCustomize.getCustomizeMgr().generateCustDataFromTable();
+ currentCustData.setName(CustomizeManager.CURRENT_LABEL);
+ custDatas.add(currentCustData);
+
+ custTable.getViewer().setInput(custDatas);
+
+ restoreCustTableSelection();
+
+ // If selection not restored, select default
+ if (getCustTableSelection() == null) {
+ ArrayList<Object> sel = new ArrayList<Object>();
+ sel.add(currentCustData);
+ custTable.getViewer().setSelection(new StructuredSelection(sel.toArray(new Object[sel.size()])));
+ custTable.getViewer().getTree().setFocus();
+ }
+
+ updateSortTextField();
+ updateColumnFilterField();
+ updateButtonEnablements();
+ }
+
+ private CustomizeData getCustTableSelection() {
+ IStructuredSelection selection = (IStructuredSelection) custTable.getViewer().getSelection();
+ if (selection.size() == 0) return null;
+ Iterator<?> i = selection.iterator();
+ CustomizeData storedCustData = (CustomizeData) i.next();
+ return storedCustData;
+ }
+
+ private List<XViewerColumn> getVisibleTableSelection() {
+ return getTableSelection(visibleColTable.getViewer());
+ }
+
+ private List<XViewerColumn> getHiddenTableSelection() {
+ return getTableSelection(hiddenColTable.getViewer());
+ }
+
+ private List<XViewerColumn> getTableSelection(TreeViewer xColTableViewer) {
+ List<XViewerColumn> xCols = new ArrayList<XViewerColumn>();
+ IStructuredSelection selection = (IStructuredSelection) xColTableViewer.getSelection();
+ if (selection.size() == 0) return null;
+ Iterator<?> i = selection.iterator();
+ while (i.hasNext())
+ xCols.add((XViewerColumn) i.next());
+ return xCols;
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<XViewerColumn> getTableXViewerColumns(TreeViewer xColTableViewer) {
+ return (List<XViewerColumn>) xColTableViewer.getInput();
+ }
+
+ private void handleCustTableSelectionChanged() {
+ if (getCustTableSelection() == null) return;
+ CustomizeData custData = getCustTableSelection();
+ if (custData == null) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, new IllegalStateException("Can't obtain selection Xml"));
+ return;
+ }
+
+ List<XViewerColumn> hideXCols = new ArrayList<XViewerColumn>();
+ List<XViewerColumn> showXCols = new ArrayList<XViewerColumn>();
+ for (XViewerColumn xCol : custData.getColumnData().getColumns()) {
+ if (xCol.isShow())
+ showXCols.add(xCol);
+ else
+ hideXCols.add(xCol);
+ }
+
+ hiddenColTable.getViewer().setInput(hideXCols);
+ visibleColTable.getViewer().setInput(showXCols);
+
+ sorterText.setText(custData.getSortingData().getXml());
+ sorterText.setData(custData);
+
+ filterText.setText(custData.getFilterData().getFilterText());
+ filterText.setData(custData);
+
+ columnFilterText.setText(custData.getColumnFilterData().getXml());
+ columnFilterText.setData(custData);
+
+ updateSortTextField();
+ updateColumnFilterField();
+ }
+ private CustomizeData selectedCustTableCustData = null;
+
+ public void storeCustTableSelection() {
+ // Store selected so can re-select after event re-draw
+ if (getCustTableSelection() != null) {
+ selectedCustTableCustData = getCustTableSelection();
+ }
+ // System.out.println("Selection " + selectedCustTableCustData.getName() + " - " + selectedCustTableCustData.getGuid());
+ }
+
+ public void restoreCustTableSelection() {
+ if (selectedCustTableCustData != null) {
+ ArrayList<Object> selected = new ArrayList<Object>();
+ selected.add(selectedCustTableCustData);
+ custTable.getViewer().setSelection(new StructuredSelection(selected.toArray(new Object[selected.size()])));
+ // System.out.println("Restoring " + selectedCustTableCustData.getName() + " - " + selectedCustTableCustData.getGuid());
+ }
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ // Ok
+ if (buttonId == 0) {
+ handleLoadConfigCustButton();
+ close();
+ }
+ // Apply
+ else if (buttonId == 1) {
+ handleLoadConfigCustButton();
+ }
+ // Cancel
+ else
+ close();
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/IXViewerTestTask.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/IXViewerTestTask.java
new file mode 100644
index 00000000000..ba155d26a26
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/IXViewerTestTask.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.nebula.widgets.xviewer.test;
+
+import java.util.Date;
+
+/**
+ * Interface for example objects used for example implementation of XViewer
+ *
+ * @author Donald G. Dunne
+ */
+public interface IXViewerTestTask {
+ public enum RunDb {
+ Production_Db, Test_Db
+ };
+
+ public enum TaskType {
+ Regression, Db_Health, Data_Exchange, Backup
+ }
+
+ public String getStartTime();
+
+ public String getEmailAddress();
+
+ public String getId();
+
+ public TaskType getTaskType();
+
+ public String getDescription();
+
+ public RunDb getRunDb();
+
+ public String getCategory();
+
+ public Date getLastRunDate();
+
+ public String getLastRunDateStr();
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerStyledStringLableProviderTest.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerStyledStringLableProviderTest.java
new file mode 100644
index 00000000000..be40e0ee86e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerStyledStringLableProviderTest.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.nebula.widgets.xviewer.test;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.test.IXViewerTestTask.RunDb;
+import org.eclipse.nebula.widgets.xviewer.test.IXViewerTestTask.TaskType;
+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.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Example implementation of XViewer that shows usage of styled string label provider
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class XViewerStyledStringLableProviderTest extends XViewer {
+ private final Set<IXViewerTestTask> runList = new HashSet<IXViewerTestTask>();
+
+ /**
+ * @param parent
+ * @param style
+ * @param namespace
+ * @param viewerFactory
+ */
+ public XViewerStyledStringLableProviderTest(Composite parent, int style) {
+ super(parent, style, new XViewerTestFactory());
+ }
+
+ public boolean isScheduled(IXViewerTestTask autoRunTask) {
+ return true;
+ }
+
+ public boolean isRun(IXViewerTestTask autoRunTask) {
+ return runList.contains(autoRunTask);
+ }
+
+ public void setRun(IXViewerTestTask autoRunTask, boolean run) {
+ if (run)
+ runList.add(autoRunTask);
+ else
+ runList.remove(autoRunTask);
+ }
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ Display Display_1 = Display.getDefault();
+ Shell Shell_1 = new Shell(Display_1, SWT.SHELL_TRIM);
+ Shell_1.setText("XViewer Styled Text Test");
+ Shell_1.setBounds(0, 0, 1000, 500);
+ Shell_1.setLayout(new GridLayout());
+ Shell_1.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ XViewerStyledStringLableProviderTest xViewerTest =
+ new XViewerStyledStringLableProviderTest(Shell_1, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
+ xViewerTest.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ xViewerTest.setContentProvider(new XViewerTestContentProvider());
+ xViewerTest.setLabelProvider(new XViewerTestStyledStringLabelProvider(xViewerTest));
+
+ List<Object> tasks = new ArrayList<Object>();
+ for (int x = 0; x < 1; x++) {
+ tasks.addAll(getTestTasks());
+ }
+ System.err.println("Setting Input...");
+ xViewerTest.setInput(tasks);
+ Shell_1.open();
+ while (!Shell_1.isDisposed()) {
+ if (!Display_1.readAndDispatch()) {
+ Display_1.sleep();
+ }
+ }
+
+ Display_1.dispose();
+ }
+
+ private static List<IXViewerTestTask> getTestTasks() {
+ List<IXViewerTestTask> tasks = new ArrayList<IXViewerTestTask>();
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Backup, "org.eclipse.osee.test1", "10:03",
+ "run to test this", "Suite A", "mark@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Data_Exchange, "org.eclipse.osee.test2", "9:22",
+ "run to test that", "Suite B", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Backup, "org.eclipse.osee.test4", "8:23",
+ "in this world", "Suite A", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Backup, "org.eclipse.osee.test3", "23:01",
+ "now is the time", "Suite B", "mike@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Db_Health, "org.eclipse.osee.test5", "7:32",
+ "may be never", "Suite A", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Data_Exchange, "org.eclipse.osee.test14", "6:11",
+ "how can this solve the problem", "Suite A", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Backup, "org.eclipse.osee.test6", "5:13",
+ "run to test this", "Suite B", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Db_Health, "org.eclipse.osee.test12", "23:15",
+ "run to test this", "Suite A", "mike@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Backup, "org.eclipse.osee.test13", "4:01",
+ "run to test this", "Suite B", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Data_Exchange, "org.eclipse.osee.test11", "3:16",
+ "run to test this", "Suite A", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Backup, "org.eclipse.osee.test10", "5:01",
+ "run to test this", "Suite C", "mike@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Data_Exchange, "org.eclipse.osee.test9", "4:27",
+ "run to test this", "Suite C", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Regression, "org.eclipse.osee.test7", "2:37",
+ "run to test this", "Suite C", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Db_Health, "org.eclipse.osee.test8", "24:00",
+ "run to test this", "Suite C", "mike@eclipse.com"));
+ return tasks;
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTest.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTest.java
new file mode 100644
index 00000000000..529023debd4
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTest.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.test.IXViewerTestTask.RunDb;
+import org.eclipse.nebula.widgets.xviewer.test.IXViewerTestTask.TaskType;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Example implementation of XViewer. Run as application to see sample XViewer.
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTest extends XViewer {
+ private final Set<IXViewerTestTask> runList = new HashSet<IXViewerTestTask>();
+
+ /**
+ * @param parent
+ * @param style
+ * @param namespace
+ * @param viewerFactory
+ */
+ public XViewerTest(Composite parent, int style) {
+ super(parent, style, new XViewerTestFactory());
+ }
+
+ public boolean isScheduled(IXViewerTestTask autoRunTask) {
+ return true;
+ }
+
+ public boolean isRun(IXViewerTestTask autoRunTask) {
+ return runList.contains(autoRunTask);
+ }
+
+ public void setRun(IXViewerTestTask autoRunTask, boolean run) {
+ if (run)
+ runList.add(autoRunTask);
+ else
+ runList.remove(autoRunTask);
+ }
+
+ private static XViewerTest xViewerTest = null;
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ Display Display_1 = Display.getDefault();
+ Shell Shell_1 = new Shell(Display_1, SWT.SHELL_TRIM);
+ Shell_1.setText("XViewer Test");
+ Shell_1.setBounds(0, 0, 1000, 500);
+ Shell_1.setLayout(new GridLayout());
+ Shell_1.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ Label label = new Label(Shell_1, SWT.None);
+ label.setText("Refresh");
+ label.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ List<Object> tasks = new ArrayList<Object>();
+ for (int x = 0; x < 1; x++) {
+ tasks.addAll(getTestTasks());
+ }
+ System.err.println("Refreshing Input...");
+ xViewerTest.setInput(tasks);
+ }
+ });
+
+ xViewerTest = new XViewerTest(Shell_1, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
+ xViewerTest.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ xViewerTest.setContentProvider(new XViewerTestContentProvider());
+ xViewerTest.setLabelProvider(new XViewerTestLabelProvider(xViewerTest));
+
+ List<Object> tasks = new ArrayList<Object>();
+ for (int x = 0; x < 1; x++) {
+ tasks.addAll(getTestTasks());
+ }
+ System.err.println("Setting Input...");
+ xViewerTest.setInput(tasks);
+ Shell_1.open();
+ while (!Shell_1.isDisposed()) {
+ if (!Display_1.readAndDispatch()) {
+ Display_1.sleep();
+ }
+ }
+
+ Display_1.dispose();
+ }
+
+ private static Date date = new Date();
+
+ private static Date getDate() {
+ date = new Date(date.getTime() + (60000 * 60 * 2));
+ return date;
+ }
+
+ private static List<IXViewerTestTask> getTestTasks() {
+ List<IXViewerTestTask> tasks = new ArrayList<IXViewerTestTask>();
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Backup, getDate(), "org.eclipse.osee.test1", "10:03",
+ "run to test this", "Suite A", "mark@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Data_Exchange, getDate(), "org.eclipse.osee.test2",
+ "9:22", "run to test that", "Suite B", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Backup, getDate(), "org.eclipse.osee.test4", "8:23",
+ "in this world", "Suite A", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Backup, getDate(), "org.eclipse.osee.test3", "23:01",
+ "now is the time", "Suite B", "mike@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Db_Health, getDate(), "org.eclipse.osee.test5",
+ "7:32", "may be never", "Suite A", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Data_Exchange, getDate(), "org.eclipse.osee.test14",
+ "6:11", "how can this solve the problem", "Suite A", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Backup, getDate(), "org.eclipse.osee.test6", "5:13",
+ "run to test this", "Suite B", "john@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Db_Health, getDate(), "org.eclipse.osee.test12", "23:15",
+ "run to test this", "Suite A", "mike@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Backup, getDate(), "org.eclipse.osee.test13", "4:01",
+ "run to test this", "Suite B", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Data_Exchange, getDate(), "org.eclipse.osee.test11",
+ "3:16", "run to test this", "Suite A", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Backup, getDate(), "org.eclipse.osee.test10", "5:01",
+ "run to test this", "Suite C", "mike@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Data_Exchange, getDate(), "org.eclipse.osee.test9",
+ "4:27", "run to test this", "Suite C", "steve@eclipse.com"));
+ tasks.add(new XViewerTestTask(RunDb.Production_Db, TaskType.Regression, getDate(), "org.eclipse.osee.test7",
+ "2:37", "run to test this", "Suite C", "john@eclipse.com"));
+ int num = 10;
+ for (String str : Arrays.asList("Now", "Cat", "Dog", "Tree", "Bike", "Sun", "Moon", "Grass", "Can", "Car",
+ "Truck", "Block", "Earth", "Mars", "Venus", "Requirements visualization", "Requirements management",
+ "Feature management", "Modeling", "Design", "Project Management", "Change management",
+ "Configuration Management", "Software Information Management", "Build management", "Testing",
+ "Release Management", "Software Deployment", "Issue management", "Monitoring and reporting", "Workflow")) {
+ tasks.add(new XViewerTestTask(RunDb.Test_Db, TaskType.Db_Health, getDate(), "org.eclipse.osee." + str,
+ "24:" + num++, str + " will run to test this", "Suite C" + num++,
+ str.toLowerCase().replaceAll(" ", ".") + "@eclipse.com"));
+ }
+ return tasks;
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestContentProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestContentProvider.java
new file mode 100644
index 00000000000..2789a6026ec
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestContentProvider.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.nebula.widgets.xviewer.test;
+
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * Content provider for example XViewer implementation
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTestContentProvider implements ITreeContentProvider {
+
+ protected Collection<IXViewerTestTask> rootSet = new HashSet<IXViewerTestTask>();
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public XViewerTestContentProvider() {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) {
+ return (Object[]) parentElement;
+ }
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the rootSet
+ */
+ public Collection<IXViewerTestTask> getRootSet() {
+ return rootSet;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestCustomizations.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestCustomizations.java
new file mode 100644
index 00000000000..c554b5e4bf4
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestCustomizations.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.nebula.widgets.xviewer.test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomizations;
+import org.eclipse.nebula.widgets.xviewer.util.internal.FileUtil;
+import org.eclipse.nebula.widgets.xviewer.util.internal.MatchFilter;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+
+/**
+ * Implementation for example XViewer implementation. Saves customizations as files at C:/UserData
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTestCustomizations extends XViewerCustomizations {
+
+ public XViewerTestCustomizations() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#deleteCustomization(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ @Override
+ public void deleteCustomization(CustomizeData custData) throws Exception {
+ File file = new File(getFilename(custData));
+ if (file.exists()) file.delete();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#getSavedCustDatas()
+ */
+ @Override
+ public List<CustomizeData> getSavedCustDatas() {
+ List<CustomizeData> custDatas = new ArrayList<CustomizeData>();
+ for (String filename : XViewerLib.readListFromDir(new File("C:/UserData/"), new MatchFilter("CustData_.*\\.xml"),
+ true)) {
+ custDatas.add(new CustomizeData(FileUtil.readFile("C:/UserData/" + filename)));
+ }
+ return custDatas;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#getUserDefaultCustData()
+ */
+ @Override
+ public CustomizeData getUserDefaultCustData() {
+ File file = new File(getDefaultFilename());
+ if (!file.exists()) return null;
+ String defaultGuid = FileUtil.readFile(file).replaceAll("\\s", "");
+ if (defaultGuid != null) {
+ for (CustomizeData custData : getSavedCustDatas()) {
+ if (custData.getGuid().equals(defaultGuid)) {
+ return custData;
+ }
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#isCustomizationPersistAvailable()
+ */
+ @Override
+ public boolean isCustomizationPersistAvailable() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#isCustomizationUserDefault(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ @Override
+ public boolean isCustomizationUserDefault(CustomizeData custData) {
+ File file = new File(getDefaultFilename());
+ if (!file.exists()) return false;
+ String defaultGuid = FileUtil.readFile(getDefaultFilename()).replaceAll("\\s", "");
+ return custData.getGuid().equals(defaultGuid);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#saveCustomization(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ @Override
+ public void saveCustomization(CustomizeData custData) throws Exception {
+ XViewerLib.writeStringToFile(custData.getXml(true), new File(getFilename(custData)));
+ Thread.sleep(2000);
+ }
+
+ private String getFilename(CustomizeData custData) {
+ return "C:/UserData/CustData_" + custData.getGuid() + ".xml";
+ }
+
+ private String getDefaultFilename() {
+ return "C:/UserData/CustDataUserDefault.txt";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#setUserDefaultCustData(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData, boolean)
+ */
+ @Override
+ public void setUserDefaultCustData(CustomizeData newCustData, boolean set) {
+ if (set) {
+ try {
+ XViewerLib.writeStringToFile(newCustData.getGuid(), new File(getDefaultFilename()));
+ } catch (IOException ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ } else {
+ File file = new File(getDefaultFilename());
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestFactory.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestFactory.java
new file mode 100644
index 00000000000..b191fd62efc
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestFactory.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.nebula.widgets.xviewer.test;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.swt.SWT;
+
+/**
+ * Columns for example XViewer
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTestFactory extends XViewerFactory {
+
+ private static String COLUMN_NAMESPACE = "xviewer.test";
+ public static XViewerColumn Run_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".run", "Run", 50, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Name_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".name", "Name", 150, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Schedule_Time =
+ new XViewerColumn(COLUMN_NAMESPACE + ".startTime", "Start Time", 40, SWT.CENTER, true, SortDataType.String,
+ false, "Time this task will run");
+ public static XViewerColumn Run_Db =
+ new XViewerColumn(COLUMN_NAMESPACE + ".runDb", "Run DB", 80, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Task_Type =
+ new XViewerColumn(COLUMN_NAMESPACE + ".taskType", "Task Type", 80, SWT.LEFT, true, SortDataType.String, false,
+ "This is the type of task");
+ public static XViewerColumn Last_Run_Date =
+ new XViewerColumn(COLUMN_NAMESPACE + ".lastRunDate", "Last Run", 120, SWT.LEFT, true, SortDataType.Date,
+ false, "This is the last time it was run");
+ public static XViewerColumn Category =
+ new XViewerColumn(COLUMN_NAMESPACE + ".category", "Category", 80, SWT.LEFT, false, SortDataType.String, false,
+ null);
+ public static XViewerColumn Notification =
+ new XViewerColumn(COLUMN_NAMESPACE + ".emailResults", "Email Results To", 150, SWT.LEFT, true,
+ SortDataType.String, false, "Email to send notifications to");
+ public static XViewerColumn Description =
+ new XViewerColumn(COLUMN_NAMESPACE + ".description", "Description", 300, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Other_Description =
+ new XViewerColumn(COLUMN_NAMESPACE + ".otherDescription", "Other Description", 75, SWT.LEFT, false,
+ SortDataType.String, false, null);
+
+ public XViewerTestFactory() {
+ super("xviewer.test");
+ registerColumn(Run_Col, Name_Col, Schedule_Time, Run_Db, Task_Type, Last_Run_Date, Category, Notification,
+ Description, Other_Description);
+ }
+
+ @Override
+ public IXViewerCustomizations getXViewerCustomizations() {
+ return new XViewerTestCustomizations();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.IXViewerFactory#isAdmin()
+ */
+ @Override
+ public boolean isAdmin() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestLabelProvider.java
new file mode 100644
index 00000000000..9f2f5004ca0
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestLabelProvider.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.nebula.widgets.xviewer.test;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Example implementation for XViewerTest XViewer
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTestLabelProvider extends XViewerLabelProvider {
+ Font font = null;
+ private final XViewerTest xViewerTest;
+
+ public XViewerTestLabelProvider(XViewerTest xViewerTest) {
+ super(xViewerTest);
+ this.xViewerTest = xViewerTest;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) {
+ if (element instanceof String) {
+ if (columnIndex == 1)
+ return (String) element;
+ else
+ return "";
+ }
+ IXViewerTestTask task = ((IXViewerTestTask) element);
+ if (task == null) return "";
+ if (xCol.equals(XViewerTestFactory.Run_Col)) return String.valueOf(xViewerTest.isRun(task));
+ if (xCol.equals(XViewerTestFactory.Name_Col)) return task.getId();
+ if (xCol.equals(XViewerTestFactory.Schedule_Time)) return task.getStartTime();
+ if (xCol.equals(XViewerTestFactory.Run_Db)) return task.getRunDb().name();
+ if (xCol.equals(XViewerTestFactory.Task_Type)) return task.getTaskType().name();
+ if (xCol.equals(XViewerTestFactory.Description)) return task.getDescription();
+ if (xCol.equals(XViewerTestFactory.Category)) return task.getCategory();
+ if (xCol.equals(XViewerTestFactory.Notification)) return task.getEmailAddress();
+ if (xCol.equals(XViewerTestFactory.Last_Run_Date)) return task.getLastRunDateStr();
+ return "unhandled column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerLabelProvider#getColumnImage(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) {
+ if (xCol.equals(XViewerTestFactory.Run_Col)) {
+ return xViewerTest.isRun((IXViewerTestTask) element) ? XViewerLib.getImage("chkbox_enabled.gif") : XViewerLib.getImage("chkbox_disabled.gif");
+ }
+ if (xCol.equals(XViewerTestFactory.Name_Col) && xViewerTest.isScheduled((IXViewerTestTask) element)) {
+ return XViewerLib.getImage("clock.gif");
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int)
+ */
+ @Override
+ public Color getBackground(Object element, int columnIndex) {
+ return super.getBackground(element, columnIndex);
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestStyledStringLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestStyledStringLabelProvider.java
new file mode 100644
index 00000000000..979dcbc6c12
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestStyledStringLabelProvider.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.nebula.widgets.xviewer.test;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerStyledTextLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Label provider for example StyledStringLabelProvider implementation
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class XViewerTestStyledStringLabelProvider extends XViewerStyledTextLabelProvider {
+ Font font = null;
+ private final XViewerStyledStringLableProviderTest xViewerTest;
+
+ public XViewerTestStyledStringLabelProvider(XViewerStyledStringLableProviderTest xViewerTest) {
+ super(xViewerTest);
+ this.xViewerTest = xViewerTest;
+ }
+
+ @Override
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerLabelProvider#getColumnImage(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) {
+ if (xCol.equals(XViewerTestFactory.Run_Col)) {
+ return xViewerTest.isRun((IXViewerTestTask) element) ? XViewerLib.getImage("chkbox_enabled.gif") : XViewerLib.getImage("chkbox_disabled.gif");
+ }
+ if (xCol.equals(XViewerTestFactory.Name_Col) && xViewerTest.isScheduled((IXViewerTestTask) element)) {
+ return XViewerLib.getImage("clock.gif");
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerStyledTextLabelProvider#getBackground(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public Color getBackground(Object element, XViewerColumn viewerColumn, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerStyledTextLabelProvider#getFont(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public Font getFont(Object element, XViewerColumn viewerColumn, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerStyledTextLabelProvider#getForeground(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public Color getForeground(Object element, XViewerColumn viewerColumn, int columnIndex) throws XViewerException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerStyledTextLabelProvider#getStyledText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public StyledString getStyledText(Object element, XViewerColumn xCol, int columnIndex) throws XViewerException {
+ if (element instanceof String) {
+ if (columnIndex == 1)
+ return new StyledString((String) element);
+ else
+ return new StyledString("");
+ }
+ IXViewerTestTask task = ((IXViewerTestTask) element);
+ if (task == null) return new StyledString("");
+ if (xCol.equals(XViewerTestFactory.Run_Col)) return new StyledString(String.valueOf(xViewerTest.isRun(task)),
+ StyledString.COUNTER_STYLER);
+ if (xCol.equals(XViewerTestFactory.Name_Col)) return new StyledString(task.getId(),
+ StyledString.DECORATIONS_STYLER);
+ if (xCol.equals(XViewerTestFactory.Schedule_Time)) return new StyledString(task.getStartTime(),
+ StyledString.QUALIFIER_STYLER);
+ if (xCol.equals(XViewerTestFactory.Run_Db)) return new StyledString(task.getRunDb().name(),
+ StyledString.COUNTER_STYLER);
+ if (xCol.equals(XViewerTestFactory.Task_Type)) return new StyledString(task.getTaskType().name(),
+ StyledString.DECORATIONS_STYLER);
+ if (xCol.equals(XViewerTestFactory.Description)) return new StyledString(task.getDescription(),
+ StyledString.COUNTER_STYLER);
+ if (xCol.equals(XViewerTestFactory.Category)) return new StyledString(task.getCategory(),
+ StyledString.DECORATIONS_STYLER);
+ if (xCol.equals(XViewerTestFactory.Notification)) return new StyledString(task.getEmailAddress(),
+ StyledString.QUALIFIER_STYLER);
+ return new StyledString("unhandled column");
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestTask.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestTask.java
new file mode 100644
index 00000000000..53d7147846c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/test/XViewerTestTask.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.test;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Example object for use of example XViewer implementation
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTestTask implements IXViewerTestTask {
+
+ private final RunDb runDb;
+ private final TaskType taskType;
+ private final String id;
+ private final String startTime;
+ private final String description;
+ private final String category;
+ private final String emailAddress;
+ private final Date lastRunDate;
+
+ /**
+ *
+ */
+ public XViewerTestTask(RunDb runDb, TaskType taskType, String id, String startTime, String description, String category, String emailAddress) {
+ this(runDb, taskType, new Date(), id, startTime, description, category, emailAddress);
+ }
+
+ public XViewerTestTask(RunDb runDb, TaskType taskType, Date lastRunDate, String id, String startTime, String description, String category, String emailAddress) {
+ this.runDb = runDb;
+ this.taskType = taskType;
+ this.lastRunDate = lastRunDate;
+ this.id = id;
+ this.startTime = startTime;
+ this.description = description;
+ this.category = category;
+ this.emailAddress = emailAddress;
+ }
+
+ /**
+ * @return the runDb
+ */
+ public RunDb getRunDb() {
+ return runDb;
+ }
+
+ /**
+ * @return the taskType
+ */
+ public TaskType getTaskType() {
+ return taskType;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return the startTime
+ */
+ public String getStartTime() {
+ return startTime;
+ }
+
+ /**
+ * @return the description
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @return the category
+ */
+ public String getCategory() {
+ return category;
+ }
+
+ /**
+ * @return the emailAddress
+ */
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+ /**
+ * @return the lastRunDate
+ */
+ public Date getLastRunDate() {
+ return lastRunDate;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.test.IXViewerTestTask#getLastRunDateStr()
+ */
+ @Override
+ public String getLastRunDateStr() {
+ return new SimpleDateFormat("MM/dd/yyyy hh:mm a").format(getLastRunDate());
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringMultiSelectionDialog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringMultiSelectionDialog.java
new file mode 100644
index 00000000000..0642afcf9f3
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringMultiSelectionDialog.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.util.internal.ArrayTreeContentProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.StringLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.StringViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EnumStringMultiSelectionDialog extends CheckedTreeSelectionDialog {
+
+ private Button addSelectedRadioButton;
+ private Button replaceAllRadioButton;
+ private Button deleteSelectedRadioButton;
+ public static enum Selection {
+ AddSelection, ReplaceAll, DeleteSelected
+ };
+ private Selection selected = Selection.AddSelection;
+
+ /**
+ * @param parent
+ * @param artifacts
+ */
+ public EnumStringMultiSelectionDialog(String displayName, Collection<String> enums, Collection<String> selEnums) {
+ super(Display.getCurrent().getActiveShell(), new StringLabelProvider(), new ArrayTreeContentProvider());
+ setTitle("Select " + displayName);
+ setMessage("Select " + displayName + " to add, delete or replace.");
+ setInput(enums);
+ setComparator(new StringViewerSorter());
+ setInitialSelections(selEnums.toArray());
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+
+ (new Label(comp, SWT.None)).setText("Add selected item(s) to existing if not already chosen.");
+
+ addSelectedRadioButton = new Button(comp, SWT.CHECK);
+ addSelectedRadioButton.setSelection(true);
+ addSelectedRadioButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (addSelectedRadioButton.getSelection()) selected = Selection.AddSelection;
+ }
+ });
+
+ (new Label(comp, SWT.None)).setText("Replace all existing with selected item(s).");
+
+ replaceAllRadioButton = new Button(comp, SWT.CHECK);
+ replaceAllRadioButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (replaceAllRadioButton.getSelection()) selected = Selection.ReplaceAll;
+ }
+ });
+
+ (new Label(comp, SWT.None)).setText("Remove selected item(s) if already chosen.");
+
+ deleteSelectedRadioButton = new Button(comp, SWT.CHECK);
+ deleteSelectedRadioButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (deleteSelectedRadioButton.getSelection()) selected = Selection.DeleteSelected;
+ }
+ });
+ return c;
+ }
+
+ public Selection getSelected() {
+ return selected;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringSingleSelectionDialog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringSingleSelectionDialog.java
new file mode 100644
index 00000000000..3c1bbd17325
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/EnumStringSingleSelectionDialog.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.nebula.widgets.xviewer.util;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.StringLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.util.internal.StringViewerSorter;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EnumStringSingleSelectionDialog extends org.eclipse.ui.dialogs.ListDialog {
+
+ public EnumStringSingleSelectionDialog(String title, String message, Collection<String> options, String currSelected) {
+ super(Display.getCurrent().getActiveShell());
+ this.setTitle(title);
+ this.setMessage(message);
+ this.setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new StringLabelProvider());
+ setInput(options);
+ if (currSelected != null) setInitialSelections(new Object[] {currSelected});
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTableViewer().setSorter(new StringViewerSorter());
+ return c;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/XViewerException.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/XViewerException.java
new file mode 100644
index 00000000000..c6494c680c5
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/XViewerException.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.nebula.widgets.xviewer.util;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XViewerException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param message
+ */
+ public XViewerException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public XViewerException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public XViewerException(Throwable cause) {
+ super(cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/ArrayTreeContentProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/ArrayTreeContentProvider.java
new file mode 100644
index 00000000000..8e94457507f
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/ArrayTreeContentProvider.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.nebula.widgets.xviewer.util.internal;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArrayTreeContentProvider implements ITreeContentProvider {
+
+ /**
+ *
+ */
+ public ArrayTreeContentProvider() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) return ((Collection) parentElement).toArray();
+ return new Object[] {};
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/CollectionsUtil.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/CollectionsUtil.java
new file mode 100644
index 00000000000..a5a8c421ebf
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/CollectionsUtil.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author David Diepenbrock
+ */
+public class CollectionsUtil {
+
+ public static Collection<String> fromString(String string, String seperator) {
+ return Arrays.asList(string.split(seperator));
+ }
+
+ /**
+ * An flexible alternative for converting a Collection to a String.
+ *
+ * @param c The Collection to convert to a String
+ * @param start The String to place at the beginning of the returned String
+ * @param separator The String to place in between elements of the Collection c.
+ * @param end The String to place at the end of the returned String
+ * @return A String which starts with 'start', followed by the elements in the Collection c separated by 'separator',
+ * ending with 'end'.
+ */
+ @SuppressWarnings("unchecked")
+ public static String toString(Collection c, String start, String separator, String end) {
+ Iterator i = c.iterator();
+ StringBuilder myString = new StringBuilder();
+
+ if (start != null) myString.append(start);
+
+ boolean first = true;
+ while (i.hasNext()) {
+ if (!first) myString.append(separator);
+ myString.append(i.next().toString());
+ first = false;
+ }
+
+ if (end != null) myString.append(end);
+
+ return myString.toString();
+ }
+
+ public static String toString(String separator, Object... objects) {
+ Collection<Object> objectsCol = new ArrayList<Object>(objects.length);
+ for (Object obj : objects)
+ objectsCol.add(obj);
+ return toString(objectsCol, null, separator, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static String toString(String separator, Collection c) {
+ return toString(c, null, separator, null);
+ }
+
+ /**
+ * The resultant set is those elements in superSet which are not in the subSet
+ *
+ * @param superSet
+ * @param subList
+ * @return Return complement list reference
+ */
+ public static <T> List<T> setComplement(Collection<T> superSet, Collection<T> subList) {
+ ArrayList<T> complement = new ArrayList<T>(superSet.size());
+ for (T obj : superSet) {
+ if (!subList.contains(obj)) {
+ complement.add(obj);
+ }
+ }
+ return complement;
+ }
+
+ /**
+ * @param listA
+ * @param listB
+ * @return The intersection of two sets A and B is the set of elements common to A and B
+ */
+ public static <T> ArrayList<T> setIntersection(Collection<T> listA, Collection<T> listB) {
+ ArrayList<T> intersection = new ArrayList<T>(listA.size());
+
+ for (T obj : listA) {
+ if (listB.contains(obj)) {
+ intersection.add(obj);
+ }
+ }
+ return intersection;
+ }
+
+ /**
+ * Returns the unique union of the given lists
+ *
+ * @param <T>
+ * @param lists
+ * @return Set
+ */
+ public static <T> Set<T> setUnion(Collection<T>... lists) {
+ Set<T> union = new HashSet<T>(lists[0].size() * 2);
+
+ for (int x = 0; x < lists.length; x++) {
+ union.addAll(lists[x]);
+ }
+ return union;
+ }
+
+ /**
+ * Return true if same objects exist in listA and listB
+ *
+ * @param <T>
+ * @param listA
+ * @param listB
+ * @return boolean
+ */
+ public static <T> boolean isEqual(Collection<T> listA, Collection<T> listB) {
+ if (listA.size() != listB.size()) return false;
+ if (listA.size() != setIntersection(listA, listB).size()) return false;
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static Set toSet(Collection collection) {
+ Set set = null;
+ if (collection instanceof Set) {
+ set = (Set) collection;
+ } else {
+ set = new LinkedHashSet();
+ set.addAll(collection);
+ }
+ return set;
+ }
+
+ /**
+ * Convert an aggregate list of objects into a List
+ *
+ * @param <T>
+ * @param objects
+ * @return list
+ */
+ public static <T> List<T> getAggregate(T... objects) {
+ List<T> objs = new ArrayList<T>();
+ if (objects != null) {
+ for (T obj : objects) {
+ objs.add(obj);
+ }
+ }
+ return objs;
+ }
+
+ public static List<Object> getAggregateTree(List<Object> items, int maxPerList) {
+ if (items == null) throw new IllegalArgumentException("items can not be null");
+ if (maxPerList < 2) throw new IllegalArgumentException("maxPerList can not be less than 2");
+
+ if (items.size() > maxPerList) {
+ return (recursiveAggregateTree(items, maxPerList));
+ } else {
+ return new ArrayList<Object>(items);
+ }
+ }
+
+ private static ArrayList<Object> recursiveAggregateTree(List<Object> items, int maxPerList) {
+ if (items.size() > maxPerList) {
+ ArrayList<Object> aggregateList = new ArrayList<Object>(maxPerList);
+ ArrayList<Object> childList = null;
+
+ for (Object item : items) {
+ if (childList == null || childList.size() == maxPerList) {
+ childList = new ArrayList<Object>(maxPerList);
+ aggregateList.add(childList);
+ }
+ childList.add(item);
+ }
+ childList.trimToSize();
+
+ aggregateList = recursiveAggregateTree(aggregateList, maxPerList);
+
+ aggregateList.trimToSize();
+
+ return aggregateList;
+ } else {
+ // This is a safe blind cast since only subsequent calls of this method will end up here
+ // and this method always uses ArrayList<Object>
+ return (ArrayList<Object>) items;
+ }
+ }
+
+ public static enum CastOption {
+ MATCHING, ALL
+ };
+
+ /**
+ * Cast objects to clazz
+ *
+ * @param <A>
+ * @param objects
+ * @param clazz
+ * @param castOption if ALL, cast all and throw exception if cast fails; if MATCHING, only cast those of type clazz
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ private static <A extends Object> List<A> cast(Class<A> clazz, Collection<? extends Object> objects, CastOption castOption) {
+ List<A> results = new ArrayList<A>(objects.size());
+ for (Object object : objects)
+ if ((castOption == CastOption.ALL) || ((castOption == CastOption.MATCHING) && (object.getClass().isAssignableFrom(clazz)))) {
+ results.add((A) object);
+ }
+ return results;
+ }
+
+ /**
+ * Cast objects to clazz
+ *
+ * @param <A>
+ * @param objects
+ * @return List
+ */
+ @SuppressWarnings("unchecked")
+ public static <A> List<A> castAll(Collection<?> objects) {
+ List<A> results = new ArrayList<A>(objects.size());
+ for (Object object : objects) {
+ results.add((A) object);
+ }
+ return results;
+ }
+
+ /**
+ * Unchecked cast objects to clazz; CastClassException will occur when object sent in does not match clazz<br>
+ * <br>
+ * Use when all objects are expected to be of type class and exception is desired if not
+ *
+ * @param <A>
+ * @param objects
+ * @param clazz
+ * @return List
+ */
+ public static <A extends Object> List<A> castAll(Class<A> clazz, Collection<? extends Object> objects) {
+ return cast(clazz, objects, CastOption.ALL);
+ }
+
+ /**
+ * Cast objects matching class, ignore rest; no ClassCastException will occur<br>
+ * <br>
+ * Use when objects may contain classes that are not desired
+ *
+ * @param <A>
+ * @param objects
+ * @param clazz
+ * @return List
+ */
+ public static <A extends Object> List<A> castMatching(Class<A> clazz, Collection<? extends Object> objects) {
+ return cast(clazz, objects, CastOption.MATCHING);
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FileUtil.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FileUtil.java
new file mode 100644
index 00000000000..9004a9abf9d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FileUtil.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class FileUtil {
+
+ public static String justFilename(String filename) {
+ File file = new File(filename);
+ return file.getName();
+ }
+
+ public static String justPath(String filename) {
+ File file = new File(filename);
+ filename = filename.replaceAll(file.getName(), "");
+ return filename;
+ }
+
+ /**
+ * Use the Lib method directly - the original implementation of this method was not memory efficient and suppressed
+ * exceptions
+ *
+ * @param stream
+ * @return string
+ */
+ public static String readFile(String filename) {
+ return readFile(new File(filename));
+ }
+
+ /**
+ * Use the Lib method directly - the original implementation of this method was not memory efficient and suppressed
+ * exceptions
+ *
+ * @param stream
+ * @return string
+ */
+ public static String readFile(File file) {
+ try {
+ return fileToString(file);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ public static String fileToString(File file) throws IOException {
+ StringBuffer buffer = new StringBuffer();
+ Reader inStream = new InputStreamReader(new FileInputStream(file), "UTF-8");
+ Reader in = new BufferedReader(inStream);
+ int ch;
+ while ((ch = in.read()) > -1) {
+ buffer.append((char) ch);
+ }
+ in.close();
+ return buffer.toString();
+ }
+
+ /**
+ * @param guid
+ * @param file
+ * @throws IOException
+ */
+ public static void writeStringToFile(String str, File file) throws IOException {
+ OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
+ char[] chars = str.toCharArray();
+ out.write(chars, 0, chars.length);
+ out.close();
+ }
+
+ public static ArrayList<String> readListFromDir(File directory, FilenameFilter filter) {
+ ArrayList<String> list = new ArrayList<String>(400);
+
+ if (directory == null) {
+ System.out.println("Invalid path: " + directory);
+ return list;
+ }
+
+ File[] files = directory.listFiles(filter);
+ if (files == null) {
+ System.out.println("Invalid path: " + directory);
+ return list;
+ }
+ if (files.length > 0) {
+ Arrays.sort(files);
+ }
+
+ for (int i = 0; i < files.length; i++) {
+ list.add(files[i].getName());
+ }
+
+ return list;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FilteredTree.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FilteredTree.java
new file mode 100644
index 00000000000..777fe29513c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/FilteredTree.java
@@ -0,0 +1,916 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+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.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+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.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+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.Display;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchMessages;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.progress.WorkbenchJob;
+
+/**
+ * A simple control that provides a text widget and a tree viewer. The contents of the text widget are used to drive a
+ * PatternFilter that is on the viewer.
+ *
+ * @see org.eclipse.ui.dialogs.PatternFilter
+ * @since 3.2
+ */
+@SuppressWarnings("restriction")
+public class FilteredTree extends Composite {
+
+ /**
+ * The filter text widget to be used by this tree. This value may be <code>null</code> if there is no filter widget,
+ * or if the controls have not yet been created.
+ */
+ protected Text filterText;
+
+ /**
+ * The control representing the clear button for the filter text entry. This value may be <code>null</code> if no
+ * such button exists, or if the controls have not yet been created.
+ */
+ protected ToolBarManager filterToolBar;
+
+ /**
+ * The viewer for the filtered tree. This value should never be <code>null</code> after the widget creation methods
+ * are complete.
+ */
+ protected TreeViewer treeViewer;
+
+ /**
+ * The Composite on which the filter controls are created. This is used to set the background color of the filter
+ * controls to match the surrounding controls.
+ */
+ protected Composite filterComposite;
+
+ /**
+ * The pattern filter for the tree. This value must not be <code>null</code>.
+ */
+ private PatternFilter patternFilter;
+
+ /**
+ * The text to initially show in the filter text control.
+ */
+ protected String initialText = ""; //$NON-NLS-1$
+
+ /**
+ * The job used to refresh the tree.
+ */
+ private Job refreshJob;
+
+ /**
+ * The parent composite of the filtered tree.
+ *
+ * @since 3.3
+ */
+ protected Composite parent;
+
+ /**
+ * Whether or not to show the filter controls (text and clear button). The default is to show these controls. This
+ * can be overridden by providing a setting in the product configuration file. The setting to add to not show these
+ * controls is: org.eclipse.ui/SHOW_FILTERED_TEXTS=false
+ */
+ protected boolean showFilterControls;
+
+ /**
+ * @since 3.3
+ */
+ protected Composite treeComposite;
+
+ /**
+ * Image descriptor for enabled clear button.
+ */
+ private static final String CLEAR_ICON = "org.eclipse.ui.internal.dialogs.CLEAR_ICON"; //$NON-NLS-1$
+
+ /**
+ * Image descriptor for disabled clear button.
+ */
+ private static final String DCLEAR_ICON = "org.eclipse.ui.internal.dialogs.DCLEAR_ICON"; //$NON-NLS-1$
+
+ /**
+ * Maximum time spent expanding the tree after the filter text has been updated (this is only used if we were able to
+ * at least expand the visible nodes)
+ */
+ private static final long SOFT_MAX_EXPAND_TIME = 200;
+
+ /**
+ * Get image descriptors for the clear button.
+ */
+ static {
+ ImageDescriptor descriptor = null;
+ if (PlatformUI.isWorkbenchRunning()) {
+ descriptor =
+ AbstractUIPlugin.imageDescriptorFromPlugin(PlatformUI.PLUGIN_ID, "$nl$/icons/full/etool16/clear_co.gif"); //$NON-NLS-1$
+ if (descriptor != null) {
+ JFaceResources.getImageRegistry().put(CLEAR_ICON, descriptor);
+ }
+ descriptor =
+ AbstractUIPlugin.imageDescriptorFromPlugin(PlatformUI.PLUGIN_ID, "$nl$/icons/full/dtool16/clear_co.gif"); //$NON-NLS-1$
+ }
+ if (descriptor != null) {
+ JFaceResources.getImageRegistry().put(DCLEAR_ICON, descriptor);
+ }
+ }
+
+ /**
+ * Create a new instance of the receiver.
+ *
+ * @param parent the parent <code>Composite</code>
+ * @param treeStyle the style bits for the <code>Tree</code>
+ * @param filter the filter to be used
+ */
+ public FilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, SWT.NONE);
+ this.parent = parent;
+ init(treeStyle, filter);
+ }
+
+ /**
+ * Create a new instance of the receiver. Subclasses that wish to override the default creation behavior may use this
+ * constructor, but must ensure that the <code>init(composite, int, PatternFilter)</code> method is called in the
+ * overriding constructor.
+ *
+ * @param parent the parent <code>Composite</code>
+ * @see #init(int, PatternFilter)
+ * @since 3.3
+ */
+ protected FilteredTree(Composite parent) {
+ super(parent, SWT.NONE);
+ this.parent = parent;
+ }
+
+ /**
+ * Create the filtered tree.
+ *
+ * @param treeStyle the style bits for the <code>Tree</code>
+ * @param filter the filter to be used
+ * @since 3.3
+ */
+ protected void init(int treeStyle, PatternFilter filter) {
+ patternFilter = filter;
+ showFilterControls = true;
+ if (PlatformUI.isWorkbenchRunning()) {
+ showFilterControls =
+ PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.SHOW_FILTERED_TEXTS);
+ }
+ createControl(parent, treeStyle);
+ createRefreshJob();
+ setInitialText(WorkbenchMessages.FilteredTree_FilterMessage);
+ setFont(parent.getFont());
+ }
+
+ /**
+ * Create the filtered tree's controls. Subclasses should override.
+ *
+ * @param parent
+ * @param treeStyle
+ */
+ protected void createControl(Composite parent, int treeStyle) {
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ setLayout(layout);
+ setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ if (showFilterControls) {
+ filterComposite = new Composite(this, SWT.NONE);
+ GridLayout filterLayout = new GridLayout(2, false);
+ filterLayout.marginHeight = 0;
+ filterLayout.marginWidth = 0;
+ filterComposite.setLayout(filterLayout);
+ filterComposite.setFont(parent.getFont());
+
+ createFilterControls(filterComposite);
+ filterComposite.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
+ }
+
+ treeComposite = new Composite(this, SWT.NONE);
+ GridLayout treeCompositeLayout = new GridLayout();
+ treeCompositeLayout.marginHeight = 0;
+ treeCompositeLayout.marginWidth = 0;
+ treeComposite.setLayout(treeCompositeLayout);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ treeComposite.setLayoutData(data);
+ createTreeControl(treeComposite, treeStyle);
+ }
+
+ /**
+ * Create the filter controls. By default, a text and corresponding tool bar button that clears the contents of the
+ * text is created. Subclasses may override.
+ *
+ * @param parent parent <code>Composite</code> of the filter controls
+ * @return the <code>Composite</code> that contains the filter controls
+ */
+ protected Composite createFilterControls(Composite parent) {
+ createFilterText(parent);
+ createClearText(parent);
+ if (filterToolBar != null) {
+ filterToolBar.update(false);
+ // initially there is no text to clear
+ filterToolBar.getControl().setVisible(false);
+ }
+ return parent;
+ }
+
+ /**
+ * Creates and set up the tree and tree viewer. This method calls {@link #doCreateTreeViewer(Composite, int)} to
+ * create the tree viewer. Subclasses should override {@link #doCreateTreeViewer(Composite, int)} instead of
+ * overriding this method.
+ *
+ * @param parent parent <code>Composite</code>
+ * @param style SWT style bits used to create the tree
+ * @return the tree
+ */
+ protected Control createTreeControl(Composite parent, int style) {
+ treeViewer = doCreateTreeViewer(parent, style);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ treeViewer.getControl().setLayoutData(data);
+ treeViewer.getControl().addDisposeListener(new DisposeListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+ */
+ public void widgetDisposed(DisposeEvent e) {
+ refreshJob.cancel();
+ }
+ });
+ if (treeViewer instanceof NotifyingTreeViewer) {
+ patternFilter.setUseCache(true);
+ }
+ treeViewer.addFilter(patternFilter);
+ return treeViewer.getControl();
+ }
+
+ /**
+ * Creates the tree viewer. Subclasses may override.
+ *
+ * @param parent the parent composite
+ * @param style SWT style bits used to create the tree viewer
+ * @return the tree viewer
+ * @since 3.3
+ */
+ protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
+ return new NotifyingTreeViewer(parent, style);
+ }
+
+ /**
+ * Return the first item in the tree that matches the filter pattern.
+ *
+ * @param items
+ * @return the first matching TreeItem
+ */
+ private TreeItem getFirstMatchingItem(TreeItem[] items) {
+ for (int i = 0; i < items.length; i++) {
+ if (patternFilter.isLeafMatch(treeViewer, items[i].getData()) && patternFilter.isElementSelectable(items[i].getData())) {
+ return items[i];
+ }
+ return getFirstMatchingItem(items[i].getItems());
+ }
+ return null;
+ }
+
+ /**
+ * Create the refresh job for the receiver.
+ */
+ private void createRefreshJob() {
+ refreshJob = doCreateRefreshJob();
+ refreshJob.setSystem(true);
+ }
+
+ /**
+ * Creates a workbench job that will refresh the tree based on the current filter text. Subclasses may override.
+ *
+ * @return a workbench job that can be scheduled to refresh the tree
+ * @since 3.4
+ */
+ protected WorkbenchJob doCreateRefreshJob() {
+ return new WorkbenchJob("Refresh Filter") {//$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (treeViewer.getControl().isDisposed()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ String text = getFilterString();
+ if (text == null) {
+ return Status.OK_STATUS;
+ }
+
+ boolean initial = initialText != null && initialText.equals(text);
+ if (initial) {
+ patternFilter.setPattern(null);
+ } else if (text != null) {
+ patternFilter.setPattern(text);
+ }
+
+ Control redrawFalseControl = treeComposite != null ? treeComposite : treeViewer.getControl();
+ try {
+ // don't want the user to see updates that will be made to
+ // the tree
+ // we are setting redraw(false) on the composite to avoid
+ // dancing scrollbar
+ redrawFalseControl.setRedraw(false);
+ if (!narrowingDown) {
+ // collapse all
+ TreeItem[] is = treeViewer.getTree().getItems();
+ for (int i = 0; i < is.length; i++) {
+ TreeItem item = is[i];
+ if (item.getExpanded()) {
+ treeViewer.setExpandedState(item.getData(), false);
+ }
+ }
+ }
+ treeViewer.refresh(true);
+
+ if (text.length() > 0 && !initial) {
+ /*
+ * Expand elements one at a time. After each is
+ * expanded, check to see if the filter text has been
+ * modified. If it has, then cancel the refresh job so
+ * the user doesn't have to endure expansion of all the
+ * nodes.
+ */
+ TreeItem[] items = getViewer().getTree().getItems();
+ int treeHeight = getViewer().getTree().getBounds().height;
+ int numVisibleItems = treeHeight / getViewer().getTree().getItemHeight();
+ long stopTime = SOFT_MAX_EXPAND_TIME + System.currentTimeMillis();
+ boolean cancel = false;
+ if (items.length > 0 && recursiveExpand(items, monitor, stopTime, new int[] {numVisibleItems})) {
+ cancel = true;
+ }
+
+ // enabled toolbar - there is text to clear
+ // and the list is currently being filtered
+ updateToolbar(true);
+
+ if (cancel) {
+ return Status.CANCEL_STATUS;
+ }
+ } else {
+ // disabled toolbar - there is no text to clear
+ // and the list is currently not filtered
+ updateToolbar(false);
+ }
+ } finally {
+ // done updating the tree - set redraw back to true
+ TreeItem[] items = getViewer().getTree().getItems();
+ if (items.length > 0 && getViewer().getTree().getSelectionCount() == 0) {
+ treeViewer.getTree().setTopItem(items[0]);
+ }
+ redrawFalseControl.setRedraw(true);
+ }
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * Returns true if the job should be canceled (because of timeout or actual cancellation).
+ *
+ * @param items
+ * @param monitor
+ * @param cancelTime
+ * @param numItemsLeft
+ * @return true if canceled
+ */
+ private boolean recursiveExpand(TreeItem[] items, IProgressMonitor monitor, long cancelTime, int[] numItemsLeft) {
+ boolean canceled = false;
+ for (int i = 0; !canceled && i < items.length; i++) {
+ TreeItem item = items[i];
+ boolean visible = numItemsLeft[0]-- >= 0;
+ if (monitor.isCanceled() || (!visible && System.currentTimeMillis() > cancelTime)) {
+ canceled = true;
+ } else {
+ Object itemData = item.getData();
+ if (itemData != null) {
+ if (!item.getExpanded()) {
+ // do the expansion through the viewer so that
+ // it can refresh children appropriately.
+ treeViewer.setExpandedState(itemData, true);
+ }
+ TreeItem[] children = item.getItems();
+ if (items.length > 0) {
+ canceled = recursiveExpand(children, monitor, cancelTime, numItemsLeft);
+ }
+ }
+ }
+ }
+ return canceled;
+ }
+
+ };
+ }
+
+ protected void updateToolbar(boolean visible) {
+ if (filterToolBar != null) {
+ filterToolBar.getControl().setVisible(visible);
+ }
+ }
+
+ /**
+ * Creates the filter text and adds listeners. This method calls {@link #doCreateFilterText(Composite)} to create the
+ * text control. Subclasses should override {@link #doCreateFilterText(Composite)} instead of overriding this method.
+ *
+ * @param parent <code>Composite</code> of the filter text
+ */
+ protected void createFilterText(Composite parent) {
+ filterText = doCreateFilterText(parent);
+ filterText.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.accessibility.AccessibleListener#getName(org.eclipse.swt.accessibility.AccessibleEvent)
+ */
+ @Override
+ public void getName(AccessibleEvent e) {
+ String filterTextString = filterText.getText();
+ if (filterTextString.length() == 0 || filterTextString.equals(initialText)) {
+ e.result = initialText;
+ } else {
+ e.result =
+ NLS.bind(WorkbenchMessages.FilteredTree_AccessibleListenerFiltered, new String[] {
+ filterTextString, String.valueOf(getFilteredItemsCount())});
+ }
+ }
+
+ /**
+ * Return the number of filtered items
+ *
+ * @return int
+ */
+ private int getFilteredItemsCount() {
+ int total = 0;
+ TreeItem[] items = getViewer().getTree().getItems();
+ for (int i = 0; i < items.length; i++) {
+ total += itemCount(items[i]);
+
+ }
+ return total;
+ }
+
+ /**
+ * Return the count of treeItem and it's children to infinite depth.
+ *
+ * @param treeItem
+ * @return int
+ */
+ private int itemCount(TreeItem treeItem) {
+ int count = 1;
+ TreeItem[] children = treeItem.getItems();
+ for (int i = 0; i < children.length; i++) {
+ count += itemCount(children[i]);
+
+ }
+ return count;
+ }
+ });
+
+ filterText.addFocusListener(new FocusAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
+ */
+ @Override
+ public void focusGained(FocusEvent e) {
+ /*
+ * Running in an asyncExec because the selectAll() does not
+ * appear to work when using mouse to give focus to text.
+ */
+ Display display = filterText.getDisplay();
+ display.asyncExec(new Runnable() {
+ public void run() {
+ if (!filterText.isDisposed()) {
+ if (getInitialText().equals(filterText.getText().trim())) {
+ filterText.selectAll();
+ }
+ }
+ }
+ });
+ }
+ });
+
+ filterText.addKeyListener(new KeyAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
+ */
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // on a CR we want to transfer focus to the list
+ boolean hasItems = getViewer().getTree().getItemCount() > 0;
+ if (hasItems && e.keyCode == SWT.ARROW_DOWN) {
+ treeViewer.getTree().setFocus();
+ } else if (e.character == SWT.CR) {
+ return;
+ }
+ }
+ });
+
+ // enter key set focus to tree
+ filterText.addTraverseListener(new TraverseListener() {
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_RETURN) {
+ e.doit = false;
+ if (getViewer().getTree().getItemCount() == 0) {
+ Display.getCurrent().beep();
+ } else {
+ // if the initial filter text hasn't changed, do not try
+ // to match
+ boolean hasFocus = getViewer().getTree().setFocus();
+ boolean textChanged = !getInitialText().equals(filterText.getText().trim());
+ if (hasFocus && textChanged && filterText.getText().trim().length() > 0) {
+ TreeItem item = getFirstMatchingItem(getViewer().getTree().getItems());
+ if (item != null) {
+ getViewer().getTree().setSelection(new TreeItem[] {item});
+ ISelection sel = getViewer().getSelection();
+ getViewer().setSelection(sel, true);
+ }
+ }
+ }
+ }
+ }
+ });
+
+ filterText.addModifyListener(new ModifyListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+ */
+ public void modifyText(ModifyEvent e) {
+ textChanged();
+ }
+ });
+
+ // if we're using a field with built in cancel we need to listen for
+ // default selection changes (which tell us the cancel button has been
+ // pressed)
+ if ((filterText.getStyle() & SWT.CANCEL) != 0) {
+ filterText.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ if (e.detail == SWT.CANCEL) clearText();
+ }
+ });
+ }
+
+ GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
+ // if the text widget supported cancel then it will have it's own
+ // integrated button. We can take all of the space.
+ if ((filterText.getStyle() & SWT.CANCEL) != 0) gridData.horizontalSpan = 2;
+ filterText.setLayoutData(gridData);
+ }
+
+ /**
+ * Creates the text control for entering the filter text. Subclasses may override.
+ *
+ * @param parent the parent composite
+ * @return the text widget
+ * @since 3.3
+ */
+ protected Text doCreateFilterText(Composite parent) {
+ return new Text(parent, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.CANCEL);
+ }
+
+ private String previousFilterText;
+
+ private boolean narrowingDown;
+
+ /**
+ * Update the receiver after the text has changed.
+ */
+ protected void textChanged() {
+ narrowingDown = previousFilterText == null || getFilterString().startsWith(previousFilterText);
+ previousFilterText = getFilterString();
+ // cancel currently running job first, to prevent unnecessary redraw
+ refreshJob.cancel();
+ refreshJob.schedule(200);
+ }
+
+ /**
+ * Set the background for the widgets that support the filter text area.
+ *
+ * @param background background <code>Color</code> to set
+ */
+ @Override
+ public void setBackground(Color background) {
+ super.setBackground(background);
+ if (filterComposite != null) {
+ filterComposite.setBackground(background);
+ }
+ if (filterToolBar != null && filterToolBar.getControl() != null) {
+ filterToolBar.getControl().setBackground(background);
+ }
+ }
+
+ /**
+ * Create the button that clears the text.
+ *
+ * @param parent parent <code>Composite</code> of toolbar button
+ */
+ private void createClearText(Composite parent) {
+ // only create the button if the text widget doesn't support one
+ // natively
+ if ((filterText.getStyle() & SWT.CANCEL) == 0) {
+ filterToolBar = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
+ filterToolBar.createControl(parent);
+
+ IAction clearTextAction = new Action("", IAction.AS_PUSH_BUTTON) {//$NON-NLS-1$
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ clearText();
+ }
+ };
+
+ clearTextAction.setToolTipText(WorkbenchMessages.FilteredTree_ClearToolTip);
+ clearTextAction.setImageDescriptor(JFaceResources.getImageRegistry().getDescriptor(CLEAR_ICON));
+ clearTextAction.setDisabledImageDescriptor(JFaceResources.getImageRegistry().getDescriptor(DCLEAR_ICON));
+
+ filterToolBar.add(clearTextAction);
+ }
+ }
+
+ /**
+ * Clears the text in the filter text widget. Also removes the optional additional filter that is provided via
+ * addFilter(ViewerFilter).
+ */
+ protected void clearText() {
+ setFilterText(""); //$NON-NLS-1$
+ textChanged();
+ }
+
+ /**
+ * Set the text in the filter control.
+ *
+ * @param string
+ */
+ protected void setFilterText(String string) {
+ if (filterText != null) {
+ filterText.setText(string);
+ selectAll();
+ }
+ }
+
+ /**
+ * Returns the pattern filter used by this tree.
+ *
+ * @return The pattern filter; never <code>null</code>.
+ */
+ public final PatternFilter getPatternFilter() {
+ return patternFilter;
+ }
+
+ /**
+ * Get the tree viewer of the receiver.
+ *
+ * @return the tree viewer
+ */
+ public TreeViewer getViewer() {
+ return treeViewer;
+ }
+
+ /**
+ * Get the filter text for the receiver, if it was created. Otherwise return <code>null</code>.
+ *
+ * @return the filter Text, or null if it was not created
+ */
+ public Text getFilterControl() {
+ return filterText;
+ }
+
+ /**
+ * Convenience method to return the text of the filter control. If the text widget is not created, then null is
+ * returned.
+ *
+ * @return String in the text, or null if the text does not exist
+ */
+ protected String getFilterString() {
+ return filterText != null ? filterText.getText() : null;
+ }
+
+ /**
+ * Set the text that will be shown until the first focus. A default value is provided, so this method only need be
+ * called if overriding the default initial text is desired.
+ *
+ * @param text initial text to appear in text field
+ */
+ public void setInitialText(String text) {
+ initialText = text;
+ setFilterText(initialText);
+ textChanged();
+ }
+
+ /**
+ * Select all text in the filter text field.
+ */
+ protected void selectAll() {
+ if (filterText != null) {
+ filterText.selectAll();
+ }
+ }
+
+ /**
+ * Get the initial text for the receiver.
+ *
+ * @return String
+ */
+ protected String getInitialText() {
+ return initialText;
+ }
+
+ /**
+ * Return a bold font if the given element matches the given pattern. Clients can opt to call this method from a
+ * Viewer's label provider to get a bold font for which to highlight the given element in the tree.
+ *
+ * @param element element for which a match should be determined
+ * @param tree FilteredTree in which the element resides
+ * @param filter PatternFilter which determines a match
+ * @return bold font
+ */
+ public static Font getBoldFont(Object element, FilteredTree tree, PatternFilter filter) {
+ String filterText = tree.getFilterString();
+
+ if (filterText == null) {
+ return null;
+ }
+
+ // Do nothing if it's empty string
+ String initialText = tree.getInitialText();
+ if (!("".equals(filterText) || initialText.equals(filterText))) {//$NON-NLS-1$
+ boolean initial = initialText != null && initialText.equals(filterText);
+ if (initial) {
+ filter.setPattern(null);
+ } else if (filterText != null) {
+ filter.setPattern(filterText);
+ }
+
+ if (filter.isElementVisible(tree.getViewer(), element) && filter.isLeafMatch(tree.getViewer(), element)) {
+ return JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Custom tree viewer subclass that clears the caches in patternFilter on any change to the tree. See bug 187200.
+ *
+ * @since 3.3
+ */
+ class NotifyingTreeViewer extends TreeViewer {
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public NotifyingTreeViewer(Composite parent, int style) {
+ super(parent, style);
+ }
+
+ @Override
+ public void add(Object parentElementOrTreePath, Object childElement) {
+ getPatternFilter().clearCaches();
+ super.add(parentElementOrTreePath, childElement);
+ }
+
+ @Override
+ public void add(Object parentElementOrTreePath, Object[] childElements) {
+ getPatternFilter().clearCaches();
+ super.add(parentElementOrTreePath, childElements);
+ }
+
+ @Override
+ protected void inputChanged(Object input, Object oldInput) {
+ getPatternFilter().clearCaches();
+ super.inputChanged(input, oldInput);
+ }
+
+ @Override
+ public void insert(Object parentElementOrTreePath, Object element, int position) {
+ getPatternFilter().clearCaches();
+ super.insert(parentElementOrTreePath, element, position);
+ }
+
+ @Override
+ public void refresh() {
+ getPatternFilter().clearCaches();
+ super.refresh();
+ }
+
+ @Override
+ public void refresh(boolean updateLabels) {
+ getPatternFilter().clearCaches();
+ super.refresh(updateLabels);
+ }
+
+ @Override
+ public void refresh(Object element) {
+ getPatternFilter().clearCaches();
+ super.refresh(element);
+ }
+
+ @Override
+ public void refresh(Object element, boolean updateLabels) {
+ getPatternFilter().clearCaches();
+ super.refresh(element, updateLabels);
+ }
+
+ @Override
+ public void remove(Object elementsOrTreePaths) {
+ getPatternFilter().clearCaches();
+ super.remove(elementsOrTreePaths);
+ }
+
+ @Override
+ public void remove(Object parent, Object[] elements) {
+ getPatternFilter().clearCaches();
+ super.remove(parent, elements);
+ }
+
+ @Override
+ public void remove(Object[] elementsOrTreePaths) {
+ getPatternFilter().clearCaches();
+ super.remove(elementsOrTreePaths);
+ }
+
+ @Override
+ public void replace(Object parentElementOrTreePath, int index, Object element) {
+ getPatternFilter().clearCaches();
+ super.replace(parentElementOrTreePath, index, element);
+ }
+
+ @Override
+ public void setChildCount(Object elementOrTreePath, int count) {
+ getPatternFilter().clearCaches();
+ super.setChildCount(elementOrTreePath, count);
+ }
+
+ @Override
+ public void setContentProvider(IContentProvider provider) {
+ getPatternFilter().clearCaches();
+ super.setContentProvider(provider);
+ }
+
+ @Override
+ public void setHasChildren(Object elementOrTreePath, boolean hasChildren) {
+ getPatternFilter().clearCaches();
+ super.setHasChildren(elementOrTreePath, hasChildren);
+ }
+
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/HtmlUtil.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/HtmlUtil.java
new file mode 100644
index 00000000000..f308a73ffa7
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/HtmlUtil.java
@@ -0,0 +1,468 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class HtmlUtil {
+ private static final String HTTP_CHARSET_ENCODING =
+ "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">";
+ private static final String begin = "<table ";
+ public final static String LABEL_FONT = "<font color=\"black\" face=\"Arial\" size=\"-1\">";
+
+ public static String getHyperlink(String url, String name) {
+ return String.format("<a href=\"%s\">%s</a>", url, name);
+ }
+
+ public static String textToHtml(String text) {
+ if (text == null) {
+ return "";
+ }
+ text = text.replaceAll("&", "&amp;");
+ text = text.replaceAll(">", "&gt;");
+ text = text.replaceAll("<", "&lt;");
+ text = text.replaceAll("\"", "&quot;");
+ text = text.replaceAll("\\n", "<br/>");
+ text = text.replaceAll("[\\x0B\\f\\r]+", "");
+ return text;
+ }
+
+ public static String htmlToText(String html) {
+ if (html == null) {
+ return "";
+ }
+ html = html.replaceAll("&amp;", "&");
+ html = html.replaceAll("&gt;", ">");
+ html = html.replaceAll("&lt;", "<");
+ html = html.replaceAll("&quot;", "\"");
+ html = html.replaceAll("&nbsp;", " ");
+ return html;
+ }
+
+ public static String getUrlPageHtml(String urlStr, InetSocketAddress addr) {
+ StringBuffer buffer = new StringBuffer();
+ try {
+ URL url = new URL(urlStr);
+ URLConnection connection = url.openConnection(new Proxy(Proxy.Type.HTTP, addr));
+ BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ String line = null;
+ while ((line = rd.readLine()) != null) {
+ buffer.append(line);
+ }
+ rd.close();
+ return buffer.toString();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return simplePage("Exception opening url " + ex.getLocalizedMessage());
+ }
+ }
+
+ public static String titledPage(String title, String text) {
+ return simplePage("<head><title>" + title + "</title></head>" + text);
+ }
+
+ public static String pageEncoding(String html) {
+ return HTTP_CHARSET_ENCODING + html;
+ }
+
+ public static String simplePage(String text) {
+ return pageEncoding("<html>" + text + "</html>");
+ }
+
+ public static String simplePageNoPageEncoding(String text) {
+ return "<html>" + text + "</html>";
+ }
+
+ public static String getLabelStr(String labelFont, String str) {
+ return labelFont + "<b>" + textToHtml(str) + "</b></font>";
+ }
+
+ public static String getLabelValueStr(String labelFont, String label, String value) {
+ return getLabelStr(labelFont, label) + value;
+ }
+
+ public static String getLabelValueStr(String label, String value) {
+ return getLabelStr(LABEL_FONT, label + ":") + "&nbsp;&nbsp;" + value;
+ }
+
+ public static String color(String color, String str) {
+ return "<font color=\"" + color + "\">" + str + "</font>";
+ }
+
+ public static String boldColor(String color, String str) {
+ return "<font color=\"" + color + "\"><b>" + textToHtml(str) + "</b></font>";
+ }
+
+ public static String bold(String str) {
+ return "<b>" + textToHtml(str) + "</b>";
+ }
+
+ public static String boldColorTags(String color, String str) {
+ return "<font color=\"" + color + "\"><b>" + str + "</b></font>";
+ }
+
+ public static String imageBlock(String description, String filename) {
+ String filenames[] = new String[1];
+ filenames[0] = filename;
+ return imageBlock(description, filenames);
+ }
+
+ public static String imageBlock(String description, String filenames[]) {
+ String str = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td>";
+ if (!description.equals("")) {
+ str += description;
+ str += HtmlUtil.newline();
+ }
+ for (int i = 0; i < filenames.length; i++) {
+ str += "<IMG SRC=\"" + filenames[i] + "\"><br>";
+ }
+ str += "</td></tr></table>";
+ return str;
+ }
+
+ public static String urlBlock(String description, String urls[]) {
+ String str = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
+ if (!description.equals("")) {
+ str += description;
+ str += HtmlUtil.newline();
+ }
+ for (int i = 0; i < urls.length; i++) {
+ str += "<A HREF=\"" + urls[i] + "\">" + urls[i] + "</A><br>";
+ }
+ str += "</td></tr></table>";
+ return str;
+ }
+
+ public static String heading(int heading, String str, String id) {
+ return "<h" + heading + (id != null && !id.equals("") ? " id=\"" + id + "\"" : "") + ">" + textToHtml(str) + "</h" + heading + ">";
+ }
+
+ public static String heading(int heading, String str) {
+ return heading(heading, str, null);
+ }
+
+ public static String padSpace(int num, String str) {
+ String out = "";
+ for (int i = 0; i < num; i++) {
+ out += "&nbsp;";
+ }
+ out += str;
+ return out;
+ }
+
+ public static String addSpace(int num) {
+ String out = "";
+ for (int i = 0; i < num; i++) {
+ out += "&nbsp;";
+ }
+ return out;
+ }
+
+ public static String para(String str) {
+ return "<p>" + textToHtml(str) + "</p>";
+ }
+
+ public static String italics(String str) {
+ return "<i>" + textToHtml(str) + "</i>";
+ }
+
+ public static String pre(String str) {
+ return "<pre>" + str + "</pre>";
+ }
+
+ public static String newline() {
+ return newline(1);
+ }
+
+ public static String newline(int num) {
+ String str = "";
+ for (int i = 0; i < num; i++) {
+ str += "<br>";
+ }
+ return str + "";
+ }
+
+ public static String name(int num) {
+ return nameTarget("" + num);
+ }
+
+ /**
+ * Create target for hyperlink to jump to
+ *
+ * @param str
+ * @return Return name target string
+ */
+ public static String nameTarget(String str) {
+ if (str == null) {
+ return "";
+ }
+ return "<A NAME=\"" + str + "\">";
+ }
+
+ /**
+ * Create &lt;a href> hyperlink to nameTarget
+ *
+ * @param num
+ * @param text
+ * @return Return name link string
+ */
+ public static String nameLink(int num, String text) {
+ return nameLink("" + num, text);
+ }
+
+ /**
+ * Create &lt;a href> hyperlink to nameTarget
+ *
+ * @param name
+ * @param text
+ * @return Return name link string
+ */
+ public static String nameLink(String name, String text) {
+ return "<A HREF=\"#" + name + "\">" + text + "</A>";
+ }
+
+ /**
+ * Create &lt;a href> hyperlink to nameTarget using name as hyperlink tag and display text
+ *
+ * @param name
+ * @return Return name link string
+ */
+ public static String nameLink(String name) {
+ return "<A HREF=\"#" + name + "\">" + name + "</A>";
+ }
+
+ public static String simpleTable(String str) {
+ return simpleTable(str, 100);
+ }
+
+ /**
+ * Create a table with one row/colum containing str
+ *
+ * @param str
+ * @param width
+ * @return return simple table string
+ */
+ public static String simpleTable(String str, int width) {
+ return new String(
+ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\">" + "<tr><td>" + str + "</td></tr>" + "</table>");
+ }
+
+ /**
+ * Create a table with one row/colum containing str
+ *
+ * @param str
+ * @param width
+ * @param bgcolor
+ * @return Return border table string
+ */
+ public static String borderTable(String str, int width, String bgcolor, String caption) {
+ return startBorderTable(width, bgcolor, caption) + str + endBorderTable();
+ }
+
+ public static String startBorderTable(int width, String bgcolor, String caption) {
+ String capStr = "";
+ if (!caption.equals("")) capStr = "<caption ALIGN=top>" + caption + "</caption>";
+ return "<table border=\"1\" align=\"center\" bgcolor=\"" + bgcolor + "\" cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\">" + capStr + "<tr><td>";
+ }
+
+ public static String endBorderTable() {
+ return "</td></tr></table>";
+ }
+
+ /**
+ * Create a table with one row multi column containing str[]
+ *
+ * @param str = array of strings for columns
+ * @return Return multi-column table string
+ */
+ public static String multiColumnTable(String[] str) {
+ return multiColumnTable(str, 85);
+ }
+
+ /**
+ * Create a table with one row multi column containing str[]
+ *
+ * @param str - array of strings for columns
+ * @param width - percent (1..100) of screen for table
+ * @return Return multi-column table string
+ */
+ public static String multiColumnTable(String[] str, int width) {
+ String s = "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\"><tr>";
+ for (int i = 0; i < str.length; i++) {
+ s += "<td>" + str[i] + "</td>";
+ }
+ s += "</tr></table>";
+ return s;
+ }
+
+ public static String beginMultiColumnTable(int width) {
+ return beginMultiColumnTable(width, 0);
+ }
+
+ public static String beginMultiColumnTable(int width, int border) {
+ return beginMultiColumnTable(width, border, null);
+ }
+
+ public static String beginMultiColumnTable(int width, int border, Integer color) {
+ return "<table border=\"" + border + "\" " + (color != null ? "color=\"" + color + "\"" : "") + " cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\">";
+ }
+
+ public static String endMultiColumnTable() {
+ return "</table>";
+ }
+
+ public static String addRowMultiColumnTable(String... str) {
+ return addRowMultiColumnTable(str, null, null);
+ }
+
+ public static String addRowMultiColumnTable(String[] str, String[] colOptions) {
+ return addRowMultiColumnTable(str, colOptions, null);
+ }
+
+ public static String addRowMultiColumnTable(String[] str, String[] colOptions, String backgroundColor) {
+ String s = "<tr>";
+ if (backgroundColor != null) s = "<tr bgcolor=\"" + backgroundColor + "\">";
+ String show = "";
+ for (int i = 0; i < str.length; i++) {
+ show = str[i];
+ if (show == null || show.equals("")) show = HtmlUtil.addSpace(1);
+ String colOptionStr = "";
+ if (colOptions != null) colOptionStr = colOptions[i];
+ s += "<td" + ((colOptionStr != null && !colOptionStr.equals("")) ? colOptionStr : "") + ">" + show + "</td>";
+ }
+ s += "</tr>";
+ return s;
+ }
+
+ public static String addRowSpanMultiColumnTable(String str, int span) {
+ return "<tr><td colspan=" + span + ">" + str + "</td></tr>";
+ }
+
+ public static class CellItem {
+ String text;
+ private final String fgColor;
+ private final String bgColor;
+
+ public CellItem(String text) {
+ this(text, null, null);
+ }
+
+ public CellItem(String text, String fgColor, String bgColor) {
+ this.text = text;
+ this.fgColor = fgColor;
+ this.bgColor = bgColor;
+ }
+ }
+
+ public static String addRowMultiColumnTable(Collection<CellItem> items) {
+ String s = "<tr>";
+ for (CellItem item : items) {
+ if (item.text == null || item.text.equals("")) item.text = ".";
+ if (item.fgColor != null && item.bgColor != null)
+ s += "<td bgcolor=\"" + item.bgColor + "\">" + HtmlUtil.color(item.fgColor, item.text) + "</td>";
+ else if (item.bgColor != null)
+ s += "<td bgcolor=\"" + item.bgColor + "\">" + item.text + "</td>";
+ else if (item.fgColor != null)
+ s += "<td>" + HtmlUtil.color(item.fgColor, item.text) + "</td>";
+ else
+ s += "<td>" + item.text + "</td>";
+ }
+ s += "</tr>";
+ return s;
+ }
+
+ public static String addHeaderRowMultiColumnTable(String[] str) {
+ return addHeaderRowMultiColumnTable(str, null);
+ }
+
+ public static String addHeaderRowMultiColumnTable(String[] str, Integer width[]) {
+ String s = "<tr>";
+ String widthStr = "";
+ for (int i = 0; i < str.length; i++) {
+ if (width != null) widthStr = " width =\"" + width[i] + "\"";
+ s += "<th" + widthStr + ">" + str[i] + "</th>";
+ }
+ s += "</tr>";
+ return s;
+ }
+
+ public static String addSimpleTableRow(String str) {
+ String s = "<tr><td>" + str + "</td></tr>";
+ return s;
+ }
+
+ public static String beginSimpleTable() {
+ return new String("<table border=\"0\" cellpadding=\"10\" cellspacing=\"0\" width=\"100%\">");
+ }
+
+ public static String beginSimpleTable(int border, int width) {
+ return new String("<table border=\"" + border + "\" cellpadding=\"10\" cellspacing=\"0\" width=\"+width+%\">");
+ }
+
+ public static String endSimpleTable() {
+ return new String("</table>");
+ }
+
+ public static String createTable(List<String> datas, String[] headers, int numColumns, int cellPadding, int border) {
+ StringBuilder table = new StringBuilder(begin);
+
+ if (datas == null) {
+ throw new IllegalArgumentException("The data can not be null");
+ }
+ if (datas.size() % numColumns != 0) {
+ throw new IllegalArgumentException(
+ "The table could not be created becuase the data does not match the column size");
+ }
+ if (border > 0) {
+ table.append("border=\"" + border + "\"");
+ }
+ if (cellPadding > 0) {
+ table.append("cellpadding=\"" + cellPadding + "\"");
+ }
+ table.append(">");
+
+ if (headers != null && headers.length == numColumns) {
+ table.append("<tr>");
+ for (String header : headers) {
+ table.append("<th>" + header + "</th>");
+ }
+ table.append("</tr>");
+ }
+
+ int colIndex = 0;
+ for (String data : datas) {
+
+ if (colIndex == 0) {
+ table.append("<tr>");
+ }
+ table.append("<td>" + data + "</td>");
+ colIndex++;
+
+ if (colIndex == numColumns) {
+ table.append("</tr>");
+ colIndex = 0;
+ }
+ }
+ return table.toString();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/MatchFilter.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/MatchFilter.java
new file mode 100644
index 00000000000..6b56080bf75
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/MatchFilter.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.nebula.widgets.xviewer.util.internal;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class MatchFilter implements FilenameFilter {
+ protected Matcher matcher;
+
+ public MatchFilter(String pattern) {
+ this.matcher = Pattern.compile(pattern).matcher("");
+ }
+
+ public boolean accept(File dir, String fileName) {
+ matcher.reset(fileName);
+ return matcher.matches();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/OverlayUtil.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/OverlayUtil.java
new file mode 100644
index 00000000000..1ffbb05cd6e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/OverlayUtil.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.nebula.widgets.xviewer.util.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OverlayUtil extends CompositeImageDescriptor {
+
+ private final Image baseImage;
+ private ImageDescriptor overlayImageDescriptor;
+ private int xValue = 0;
+ private int yValue = 0;
+ private Collection<ImageInfo> imageInfo;
+
+ public static enum Location {
+ TOP_LEFT, TOP_RIGHT, BOT_LEFT, BOT_RIGHT
+ };
+
+ public static class ImageInfo {
+ public ImageDescriptor descriptor;
+ public Location location;
+
+ public ImageInfo(ImageDescriptor descriptor, Location location) {
+ this.descriptor = descriptor;
+ this.location = location;
+ }
+ }
+
+ public OverlayUtil(Image baseImage, Collection<ImageInfo> imageInfo) {
+ this.baseImage = baseImage;
+ this.imageInfo = imageInfo;
+ }
+
+ public OverlayUtil(Image baseImage, ImageDescriptor overlayImageDescriptor, Location location) {
+ this.baseImage = baseImage;
+ this.overlayImageDescriptor = overlayImageDescriptor;
+ this.imageInfo = new ArrayList<ImageInfo>(2);
+ imageInfo.add(new ImageInfo(overlayImageDescriptor, location));
+ }
+
+ public OverlayUtil(Image baseImage, ImageDescriptor overlayImageDescriptor) {
+ this(baseImage, overlayImageDescriptor, 0, 0);
+ }
+
+ public OverlayUtil(Image baseImage, ImageDescriptor overlayImageDescriptor, int xValue, int yValue) {
+ if (baseImage == null) throw new IllegalArgumentException("baseImage can not be null");
+ if (overlayImageDescriptor == null) throw new IllegalArgumentException("overlayImageDescriptor can not be null");
+
+ this.baseImage = baseImage;
+ this.overlayImageDescriptor = overlayImageDescriptor;
+ this.xValue = xValue;
+ this.yValue = yValue;
+ }
+
+ /**
+ * Set x,y pixel to draw the overlay image eg: 8,8 for bottom right of a 16x16 image 0,0 for top left
+ *
+ * @param xValue
+ * @param yValue
+ */
+ public void setXY(int xValue, int yValue) {
+ this.xValue = xValue;
+ this.yValue = yValue;
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ // To draw a composite image, the base image should be
+ // drawn first (first layer) and then the overlay image
+ // (second layer)
+ // Draw the base image using the base image's image data
+ drawImage(baseImage.getImageData(), 0, 0);
+
+ if (imageInfo == null) {
+ // Overlaying the icon in the top left corner i.e. x and y
+ // coordinates are both zero
+ drawImage(overlayImageDescriptor.getImageData(), xValue, yValue);
+ } else {
+ for (ImageInfo info : imageInfo) {
+ if (info.location == Location.TOP_LEFT)
+ drawImage(info.descriptor.getImageData(), 0, 0);
+ else if (info.location == Location.BOT_LEFT)
+ drawImage(info.descriptor.getImageData(), 0, 8);
+ else if (info.location == Location.TOP_RIGHT)
+ drawImage(info.descriptor.getImageData(), 8, 0);
+ else if (info.location == Location.BOT_RIGHT) drawImage(info.descriptor.getImageData(), 8, 8);
+ }
+ }
+ }
+
+ @Override
+ protected Point getSize() {
+ // System.err.println("Width = " + baseImage.getBounds().width);
+ // System.err.println("Height = " + baseImage.getBounds().height);
+ int baseWidth = baseImage.getBounds().width;
+ int baseHeight = baseImage.getBounds().height;
+
+ Image overImg = overlayImageDescriptor.createImage();
+ int overWidth = overImg.getBounds().width;
+ int overHeight = overImg.getBounds().height;
+ overlayImageDescriptor.destroyResource(overImg);
+
+ return new Point(baseWidth > overWidth ? baseWidth : overWidth, baseHeight > overHeight ? baseHeight : overHeight);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/PatternFilter.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/PatternFilter.java
new file mode 100644
index 00000000000..38bc26461b6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/PatternFilter.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.nebula.widgets.xviewer.util.internal;
+
+import java.text.BreakIterator;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.ui.internal.misc.StringMatcher;
+
+/**
+ * A filter used in conjunction with <code>FilteredTree</code>. In order to determine if a node should be filtered it
+ * uses the content provider of the tree to do pattern matching on its children. This causes the entire tree structure
+ * to be realized.
+ *
+ * @see org.eclipse.ui.dialogs.FilteredTree
+ * @since 3.2
+ */
+@SuppressWarnings("restriction")
+public class PatternFilter extends ViewerFilter {
+ /*
+ * Cache of filtered elements in the tree
+ */
+ @SuppressWarnings( {"unchecked"})
+ private final Map cache = new HashMap();
+
+ /*
+ * Maps parent elements to TRUE or FALSE
+ */
+ @SuppressWarnings( {"unchecked"})
+ private final Map foundAnyCache = new HashMap();
+
+ private boolean useCache = false;
+
+ /**
+ * Whether to include a leading wildcard for all provided patterns. A trailing wildcard is always included.
+ */
+ private boolean includeLeadingWildcard = false;
+
+ /**
+ * The string pattern matcher used for this pattern filter.
+ */
+ private StringMatcher matcher;
+
+ private boolean useEarlyReturnIfMatcherIsNull = true;
+
+ private static Object[] EMPTY = new Object[0];
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerFilter#filter(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object[])
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public final Object[] filter(Viewer viewer, Object parent, Object[] elements) {
+ // we don't want to optimize if we've extended the filter ... this
+ // needs to be addressed in 3.4
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=186404
+ if (matcher == null && useEarlyReturnIfMatcherIsNull) {
+ return elements;
+ }
+
+ if (!useCache) {
+ return super.filter(viewer, parent, elements);
+ }
+
+ Object[] filtered = (Object[]) cache.get(parent);
+ if (filtered == null) {
+ Boolean foundAny = (Boolean) foundAnyCache.get(parent);
+ if (foundAny != null && !foundAny.booleanValue()) {
+ filtered = EMPTY;
+ } else {
+ filtered = super.filter(viewer, parent, elements);
+ }
+ cache.put(parent, filtered);
+ }
+ return filtered;
+ }
+
+ /**
+ * Returns true if any of the elements makes it through the filter. This method uses caching if enabled; the
+ * computation is done in computeAnyVisible.
+ *
+ * @param viewer
+ * @param parent
+ * @param elements the elements (must not be an empty array)
+ * @return true if any of the elements makes it through the filter.
+ */
+ @SuppressWarnings("unchecked")
+ private boolean isAnyVisible(Viewer viewer, Object parent, Object[] elements) {
+ if (matcher == null) {
+ return true;
+ }
+
+ if (!useCache) {
+ return computeAnyVisible(viewer, elements);
+ }
+
+ Object[] filtered = (Object[]) cache.get(parent);
+ if (filtered != null) {
+ return filtered.length > 0;
+ }
+ Boolean foundAny = (Boolean) foundAnyCache.get(parent);
+ if (foundAny == null) {
+ foundAny = computeAnyVisible(viewer, elements) ? Boolean.TRUE : Boolean.FALSE;
+ foundAnyCache.put(parent, foundAny);
+ }
+ return foundAny.booleanValue();
+ }
+
+ /**
+ * Returns true if any of the elements makes it through the filter.
+ *
+ * @param viewer
+ * @param elements
+ * @return
+ */
+ private boolean computeAnyVisible(Viewer viewer, Object[] elements) {
+ boolean elementFound = false;
+ for (int i = 0; i < elements.length && !elementFound; i++) {
+ Object element = elements[i];
+ elementFound = isElementVisible(viewer, element);
+ }
+ return elementFound;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public final boolean select(Viewer viewer, Object parentElement, Object element) {
+ return isElementVisible(viewer, element);
+ }
+
+ /**
+ * Sets whether a leading wildcard should be attached to each pattern string.
+ *
+ * @param includeLeadingWildcard Whether a leading wildcard should be added.
+ */
+ public final void setIncludeLeadingWildcard(final boolean includeLeadingWildcard) {
+ this.includeLeadingWildcard = includeLeadingWildcard;
+ }
+
+ /**
+ * The pattern string for which this filter should select elements in the viewer.
+ *
+ * @param patternString
+ */
+ public void setPattern(String patternString) {
+ // these 2 strings allow the PatternFilter to be extended in
+ // 3.3 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=186404
+ if ("org.eclipse.ui.keys.optimization.true".equals(patternString)) { //$NON-NLS-1$
+ useEarlyReturnIfMatcherIsNull = true;
+ return;
+ } else if ("org.eclipse.ui.keys.optimization.false".equals(patternString)) { //$NON-NLS-1$
+ useEarlyReturnIfMatcherIsNull = false;
+ return;
+ }
+ clearCaches();
+ if (patternString == null || patternString.equals("")) { //$NON-NLS-1$
+ matcher = null;
+ } else {
+ String pattern = patternString + "*"; //$NON-NLS-1$
+ if (includeLeadingWildcard) {
+ pattern = "*" + pattern; //$NON-NLS-1$
+ }
+ matcher = new StringMatcher(pattern, true, false);
+ }
+ }
+
+ /**
+ * Clears the caches used for optimizing this filter. Needs to be called whenever the tree content changes.
+ */
+ /* package */void clearCaches() {
+ cache.clear();
+ foundAnyCache.clear();
+ }
+
+ /**
+ * Answers whether the given String matches the pattern.
+ *
+ * @param string the String to test
+ * @return whether the string matches the pattern
+ */
+ private boolean match(String string) {
+ if (matcher == null) {
+ return true;
+ }
+ return matcher.match(string);
+ }
+
+ /**
+ * Answers whether the given element is a valid selection in the filtered tree. For example, if a tree has items that
+ * are categorized, the category itself may not be a valid selection since it is used merely to organize the
+ * elements.
+ *
+ * @param element
+ * @return true if this element is eligible for automatic selection
+ */
+ public boolean isElementSelectable(Object element) {
+ return element != null;
+ }
+
+ /**
+ * Answers whether the given element in the given viewer matches the filter pattern. This is a default implementation
+ * that will show a leaf element in the tree based on whether the provided filter text matches the text of the given
+ * element's text, or that of it's children (if the element has any). Subclasses may override this method.
+ *
+ * @param viewer the tree viewer in which the element resides
+ * @param element the element in the tree to check for a match
+ * @return true if the element matches the filter pattern
+ */
+ public boolean isElementVisible(Viewer viewer, Object element) {
+ return isParentMatch(viewer, element) || isLeafMatch(viewer, element);
+ }
+
+ /**
+ * Check if the parent (category) is a match to the filter text. The default behavior returns true if the element has
+ * at least one child element that is a match with the filter text. Subclasses may override this method.
+ *
+ * @param viewer the viewer that contains the element
+ * @param element the tree element to check
+ * @return true if the given element has children that matches the filter text
+ */
+ protected boolean isParentMatch(Viewer viewer, Object element) {
+ Object[] children =
+ ((ITreeContentProvider) ((AbstractTreeViewer) viewer).getContentProvider()).getChildren(element);
+
+ if ((children != null) && (children.length > 0)) {
+ return isAnyVisible(viewer, element, children);
+ }
+ return false;
+ }
+
+ /**
+ * Check if the current (leaf) element is a match with the filter text. The default behavior checks that the label of
+ * the element is a match. Subclasses should override this method.
+ *
+ * @param viewer the viewer that contains the element
+ * @param element the tree element to check
+ * @return true if the given element's label matches the filter text
+ */
+ protected boolean isLeafMatch(Viewer viewer, Object element) {
+ String labelText = ((ILabelProvider) ((StructuredViewer) viewer).getLabelProvider()).getText(element);
+
+ if (labelText == null) {
+ return false;
+ }
+ return wordMatches(labelText);
+ }
+
+ /**
+ * Take the given filter text and break it down into words using a BreakIterator.
+ *
+ * @param text
+ * @return an array of words
+ */
+ @SuppressWarnings("unchecked")
+ private String[] getWords(String text) {
+ List words = new ArrayList();
+ // Break the text up into words, separating based on whitespace and
+ // common punctuation.
+ // Previously used String.split(..., "\\W"), where "\W" is a regular
+ // expression (see the Javadoc for class Pattern).
+ // Need to avoid both String.split and regular expressions, in order to
+ // compile against JCL Foundation (bug 80053).
+ // Also need to do this in an NL-sensitive way. The use of BreakIterator
+ // was suggested in bug 90579.
+ BreakIterator iter = BreakIterator.getWordInstance();
+ iter.setText(text);
+ int i = iter.first();
+ while (i != java.text.BreakIterator.DONE && i < text.length()) {
+ int j = iter.following(i);
+ if (j == java.text.BreakIterator.DONE) {
+ j = text.length();
+ }
+ // match the word
+ if (Character.isLetterOrDigit(text.charAt(i))) {
+ String word = text.substring(i, j);
+ words.add(word);
+ }
+ i = j;
+ }
+ return (String[]) words.toArray(new String[words.size()]);
+ }
+
+ /**
+ * Return whether or not if any of the words in text satisfy the match critera.
+ *
+ * @param text the text to match
+ * @return boolean <code>true</code> if one of the words in text satisifes the match criteria.
+ */
+ protected boolean wordMatches(String text) {
+ if (text == null) {
+ return false;
+ }
+
+ //If the whole text matches we are all set
+ if (match(text)) {
+ return true;
+ }
+
+ // Otherwise check if any of the words of the text matches
+ String[] words = getWords(text);
+ for (int i = 0; i < words.length; i++) {
+ String word = words[i];
+ if (match(word)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Can be called by the filtered tree to turn on caching.
+ *
+ * @param useCache The useCache to set.
+ */
+ void setUseCache(boolean useCache) {
+ this.useCache = useCache;
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringLabelProvider.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringLabelProvider.java
new file mode 100644
index 00000000000..202040d7cec
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringLabelProvider.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.nebula.widgets.xviewer.util.internal;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Artifact Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class StringLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ return ((String) arg0);
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringViewerSorter.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringViewerSorter.java
new file mode 100644
index 00000000000..221747d56c6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/StringViewerSorter.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.nebula.widgets.xviewer.util.internal;
+
+import java.text.Collator;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StringViewerSorter extends ViewerSorter {
+
+ /**
+ *
+ */
+ public StringViewerSorter() {
+ }
+
+ /**
+ * @param collator
+ */
+ public StringViewerSorter(Collator collator) {
+ super(collator);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare((String) e1, (String) e2);
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerFilteredTree.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerFilteredTree.java
new file mode 100644
index 00000000000..2e1a52a35b3
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerFilteredTree.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.nebula.widgets.xviewer.util.internal;
+
+import org.eclipse.swt.SWT;
+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.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerFilteredTree extends FilteredTree {
+
+ public XViewerFilteredTree(Composite parent) {
+ this(parent, SWT.BORDER | SWT.MULTI, new PatternFilter());
+ }
+
+ /**
+ * @param parent
+ * @param treeStyle
+ * @param filter
+ */
+ public XViewerFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+ setInitialText("");
+ }
+
+ @Override
+ protected Composite createFilterControls(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(XViewerLib.getZeroMarginLayout(3, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ (new Label(comp, SWT.NONE)).setText("Filter: ");
+ super.createFilterControls(comp);
+
+ return comp;
+ }
+
+ @Override
+ protected void createFilterText(Composite parent) {
+ super.createFilterText(parent);
+ filterText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ filterText.setFocus();
+ }
+
+ public void keyReleased(KeyEvent e) {
+ filterText.setFocus();
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLib.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLib.java
new file mode 100644
index 00000000000..97caa1c1e57
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLib.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.nebula.widgets.xviewer.util.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Random;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.util.internal.images.XViewerImageCache;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerLib {
+ static Random random = new Random();
+
+ public static String generateGuidStr() {
+ long rand = (random.nextLong() & 0x7FFFFFFFFFFFFFFFL) | 0x4000000000000000L;
+ return Long.toString(rand, 32) + Long.toString(System.currentTimeMillis() & 0xFFFFFFFFFFFFFL, 32);
+ }
+
+ public static void writeStringToFile(String str, File outFile) throws IOException {
+ OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8");
+ char[] chars = str.toCharArray();
+ out.write(chars, 0, chars.length);
+ out.close();
+ }
+
+ public static void popup(final String title, final String message) {
+ if (!PlatformUI.isWorkbenchRunning()) {
+ XViewerLog.log(Activator.class, Level.SEVERE, message);
+ } else {
+ ensureInDisplayThread(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title,
+ message);
+ }
+ });
+ }
+ }
+
+ public static GridLayout getZeroMarginLayout(int numColumns, boolean equalColumnWidth) {
+ GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ layout.makeColumnsEqualWidth = equalColumnWidth;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ return layout;
+ }
+
+ public static GridLayout getZeroMarginLayout() {
+ return getZeroMarginLayout(1, false);
+ }
+
+ public static ArrayList<String> readListFromDir(File directory, FilenameFilter filter, boolean keepExtension) {
+ ArrayList<String> list = new ArrayList<String>(400);
+
+ if (directory == null) {
+ System.out.println("Invalid path: " + directory);
+ return list;
+ }
+
+ File[] files = directory.listFiles(filter);
+ if (files == null) {
+ System.out.println("Invalid path: " + directory);
+ return list;
+ }
+ if (files.length > 0) {
+ Arrays.sort(files);
+ }
+
+ if (keepExtension) {
+ for (int i = 0; i < files.length; i++) {
+ list.add(files[i].getName());
+ }
+ } else {
+ for (int i = 0; i < files.length; i++) {
+ list.add(removeExtension(files[i].getName()));
+ }
+ }
+
+ return list;
+ }
+
+ public static ArrayList<String> readListFromDir(String directory, FilenameFilter filter) {
+ return readListFromDir(new File(directory), filter, false);
+ }
+
+ /**
+ * Remove the file extension from the file path
+ *
+ * @param filepath
+ * @return modified file path
+ */
+ public static String removeExtension(String filepath) {
+ String ext = getExtension(filepath);
+ if (ext != null && ext.length() > 0) {
+ filepath = filepath.substring(0, filepath.length() - (ext.length() + 1));
+ }
+ return filepath;
+ }
+
+ /**
+ * Determine is OS is windows
+ *
+ * @return <b>true</b> if OS is windows
+ */
+ public static boolean isWindows() {
+ return System.getProperty("os.name").indexOf("indows") != -1;
+ }
+
+ /**
+ * Get file extension from the file path
+ *
+ * @param filepath
+ * @return file extension
+ */
+ public static String getExtension(String filepath) {
+ filepath = filepath.trim();
+ String separatorRegEx = File.separator;
+ if (isWindows()) {
+ separatorRegEx = "\\\\";
+ }
+ String[] pathsArray = filepath.split(separatorRegEx);
+
+ String fileName = pathsArray[0];
+ if (pathsArray.length > 0) {
+ fileName = pathsArray[pathsArray.length - 1];
+ }
+
+ int index = fileName.lastIndexOf('.');
+ if (index >= 0 && index + 1 < fileName.length()) {
+ return fileName.substring(index + 1);
+ } else {
+ return "";
+ }
+ }
+
+ public static void ensureInDisplayThread(Runnable runnable) {
+ ensureInDisplayThread(runnable, false);
+ }
+
+ public static void ensureInDisplayThread(Runnable runnable, boolean forcePend) {
+ if (isDisplayThread()) {
+ // No need to check for force since this will always pend
+ runnable.run();
+ } else {
+ if (forcePend) {
+ Display.getDefault().syncExec(runnable);
+ } else {
+ Display.getDefault().asyncExec(runnable);
+ }
+ }
+ }
+
+ public static boolean isDisplayThread() {
+ if (Display.getCurrent() == null) return false;
+
+ return Display.getCurrent().getThread() == Thread.currentThread();
+ }
+
+ public static Image getImage(String imageName) {
+ return XViewerImageCache.getImage(imageName);
+ }
+
+ public static ImageDescriptor getImageDescriptor(String imageName) {
+ return XViewerImageCache.getImageDescriptor(imageName);
+ }
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLog.java
new file mode 100644
index 00000000000..856a37d8a8a
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerLog.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.nebula.widgets.xviewer.util.internal;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerLog {
+
+ public static Logger logger = Logger.getLogger("XViewer Log");
+
+ public static void logAndPopup(Class<?> activatorClass, Level level, String message) {
+ log(activatorClass, level, message);
+ XViewerLib.popup("ERROR", message);
+ }
+
+ public static void log(Class<?> activatorClass, Level level, String message) {
+ if (level.intValue() >= Level.SEVERE.intValue()) {
+ logger.log(level, message, new Exception("used to get a stack trace"));
+ } else {
+ logger.log(level, message);
+ }
+ }
+
+ public static void logAndPopup(Class<?> activatorClass, Level level, Throwable th) {
+ log(activatorClass, level, th.getLocalizedMessage(), th);
+ XViewerLib.popup("ERROR", th.getLocalizedMessage());
+ }
+
+ public static void log(Class<?> activatorClass, Level level, Throwable th) {
+ logger.log(level, th.getLocalizedMessage(), th);
+ }
+
+ public static void log(Class<?> activatorClass, Level level, String message, Throwable th) {
+ logger.log(level, message, th);
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerTextWidget.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerTextWidget.java
new file mode 100644
index 00000000000..dcc5d2554ce
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerTextWidget.java
@@ -0,0 +1,510 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+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.graphics.Font;
+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.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * Generic label and text field object for use by single entry artifact attributes
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerTextWidget extends XViewerWidget {
+
+ protected StyledText sText; // Contains visable representation of text
+ private Composite parent;
+ protected String text = ""; // Where actual text with xml tags is stored
+ private int maxTextChars = 0;
+
+ private final boolean debug = false;
+ private int width = 0;
+ private int height = 0;
+ private Font font;
+
+ public XViewerTextWidget() {
+ super("AText", "text");
+ }
+
+ public XViewerTextWidget(String displayLabel) {
+ this(displayLabel, "text");
+ }
+
+ public XViewerTextWidget(String displayLabel, String xmlRoot) {
+ this(displayLabel, xmlRoot, "");
+ }
+
+ public XViewerTextWidget(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ }
+
+ public void setEnabled(boolean enabled) {
+ sText.setEnabled(enabled);
+ }
+
+ public void setSize(int width, int height) {
+ this.width = width;
+ this.height = height;
+ if (sText != null && !sText.isDisposed()) sText.setSize(width, height);
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ if (sText != null && !sText.isDisposed()) sText.setSize(sText.getSize().x, height);
+ }
+
+ @Override
+ public String toString() {
+ return label + ": *" + text + "*";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return sText;
+ }
+
+ /**
+ * Create Text Widgets. Widgets Created: Label: "text entry" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2
+ */
+ @Override
+ public void createWidgets(Composite parent, int horizontalSpan) {
+ createWidgets(parent, horizontalSpan, true);
+ }
+
+ public void createWidgets(Composite parent, int horizontalSpan, boolean fillText) {
+
+ if (!verticalLabel && (horizontalSpan < 2)) {
+ horizontalSpan = 2;
+ }
+
+ this.parent = parent;
+ Composite composite = null;
+
+ ModifyListener textListener = new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ if (sText != null) {
+ debug("modifyText");
+ text = sText.getText();
+ setLabelError();
+ notifyXModifiedListeners();
+ }
+ }
+ };
+
+ if (fillVertically) {
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = XViewerLib.getZeroMarginLayout(1, false);
+ layout.verticalSpacing = 4;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ } else {
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = XViewerLib.getZeroMarginLayout(2, false);
+ layout.verticalSpacing = 4;
+ composite.setLayout(layout);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = horizontalSpan;
+ composite.setLayoutData(gd);
+ }
+ // composite = parent;
+
+ // Create Text Widgets
+ if (displayLabel && !label.equals("")) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(label + ":");
+ if (toolTip != null) {
+ labelWidget.setToolTipText(toolTip);
+ }
+ }
+ if (fillVertically) {
+ sText = new StyledText(composite, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL);
+ } else {
+ sText = new StyledText(composite, SWT.BORDER | SWT.SINGLE);
+ }
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ if (verticalLabel)
+ gd.horizontalSpan = horizontalSpan;
+ else
+ gd.horizontalSpan = horizontalSpan - 1;
+ gd.grabExcessHorizontalSpace = true;
+ gd.horizontalAlignment = GridData.FILL;
+ if (fillVertically) {
+ gd.grabExcessVerticalSpace = true;
+ gd.verticalAlignment = GridData.FILL;
+ }
+ if (fillVertically) {
+ if (height > 0) gd.heightHint = height;
+ }
+
+ sText.setLayoutData(gd);
+ sText.setMenu(getDefaultMenu());
+ sText.addModifyListener(textListener);
+ if (text != null) sText.setText(text);
+ if (width != 0 && height != 0) sText.setSize(width, height);
+
+ if (maxTextChars > 0) {
+ sText.setTextLimit(maxTextChars);
+ }
+ if (fillText) updateTextWidget();
+ setLabelError();
+ sText.setEditable(editable);
+ if (font != null) sText.setFont(font);
+ parent.layout();
+ }
+
+ /**
+ * @return text including xml tags replaced for references
+ */
+ public String getText() {
+ String text = sText.getText();
+ return text;
+ }
+
+ /**
+ * @param text
+ */
+ public void setText(String text) {
+ this.text = text;
+ if (sText != null) sText.setText(text);
+ }
+
+ public Menu getDefaultMenu() {
+ Menu menu = new Menu(sText.getShell());
+ MenuItem cut = new MenuItem(menu, SWT.NONE);
+ cut.setText("Cut");
+ cut.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sText.cut();
+ sText.redraw();
+ }
+ });
+ MenuItem copy = new MenuItem(menu, SWT.NONE);
+ copy.setText("Copy");
+ copy.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sText.copy();
+ }
+ });
+ MenuItem paste = new MenuItem(menu, SWT.NONE);
+ paste.setText("Paste");
+ paste.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sText.paste();
+ sText.redraw();
+ }
+ });
+ return menu;
+ }
+
+ @Override
+ public void dispose() {
+ if (labelWidget != null) labelWidget.dispose();
+ if (sText != null) {
+ sText.dispose();
+ sText = null;
+ }
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ @Override
+ public void setFocus() {
+ if (sText != null) sText.setFocus();
+ }
+
+ @Override
+ public void setEditable(boolean editable) {
+ super.setEditable(editable);
+ if (sText != null && !sText.isDisposed()) {
+ sText.setEditable(editable);
+ }
+ }
+
+ /**
+ * Set max character limit on text field
+ *
+ * @param limit - if 0, then limit is 999, else sets to limit
+ */
+ public void setMaxTextLimit(int limit) {
+ this.maxTextChars = limit;
+ if (sText != null) {
+ if (limit == 0) {
+ sText.setTextLimit(999);
+ } else {
+ sText.setTextLimit(limit);
+ }
+ }
+ }
+
+ public void forceFocus() {
+ if (sText != null) {
+ sText.forceFocus();
+ }
+ }
+
+ @Override
+ public void setFillVertically(boolean fillVertically) {
+ super.setFillVertically(fillVertically);
+ }
+
+ public boolean isInteger() {
+ try {
+ new Integer(text);
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean isFloat() {
+ try {
+ new Float(text);
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+
+ public int getInteger() {
+ Integer num;
+ try {
+ num = new Integer(text);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ return num.intValue();
+ }
+
+ public double getFloat() {
+ Double num;
+ try {
+ num = new Double(text);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ return num.doubleValue();
+ }
+
+ @Override
+ public void setRequiredEntry(boolean requiredEntry) {
+ super.setRequiredEntry(requiredEntry);
+ setLabelError();
+ }
+
+ public boolean requiredEntry() {
+ return requiredEntry;
+ }
+
+ public void addModifyListener(ModifyListener modifyListener) {
+ if (sText != null) sText.addModifyListener(modifyListener);
+ }
+
+ public String get() {
+ if (debug) System.err.println("text set *" + text + "*");
+ return text;
+ }
+
+ @Override
+ public String getXmlData() {
+ if (sText == null || sText.isDisposed())
+ return XmlUtil.textToXml(text);
+ else
+ try {
+ return XmlUtil.textToXml(sText.getText());
+ } catch (SWTException e) {
+ return XmlUtil.textToXml(text);
+ }
+ }
+
+ @Override
+ public String toXml() {
+ if (xmlSubRoot.equals("")) {
+ return toXml(xmlRoot);
+ } else {
+ return toXml(xmlRoot, xmlSubRoot);
+ }
+ }
+
+ @Override
+ public String toXml(String xmlRoot) {
+ String s = "<" + xmlRoot + ">" + getXmlData() + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ @Override
+ public String toXml(String xmlRoot, String xmlSubRoot) {
+ String s =
+ "<" + xmlRoot + ">" + "<" + xmlSubRoot + ">" + getXmlData() + "</" + xmlSubRoot + ">" + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ set(str);
+ if (debug) System.err.println("setFromXml *" + str + "*");
+ }
+
+ @Override
+ public void setFromXml(String xml) {
+ Matcher m;
+ m = Pattern.compile("<" + xmlRoot + ">(.*?)</" + xmlRoot + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(xml);
+
+ if (m.find()) {
+ String xmlStr = m.group(1);
+ if (debug) System.err.println("xmlStr *" + xmlStr + "*");
+ String str = XmlUtil.xmlToText(xmlStr);
+ if (debug) System.err.println("str *" + str + "*");
+ setXmlData(str);
+ }
+ }
+
+ public int getInt() {
+ Integer percent = new Integer(0);
+ try {
+ percent = new Integer(text);
+ } catch (NumberFormatException e) {
+ }
+ return percent.intValue();
+ }
+
+ protected void updateTextWidget() {
+ if (sText == null || sText.isDisposed()) return;
+ if (text.equals(sText.getText())) return;
+ // Disable Listeners so not to fill Undo List
+ sText.setText(text);
+ // Reenable Listeners
+ setLabelError();
+ }
+
+ public void set(String text) {
+ if (text == null)
+ this.text = "";
+ else
+ this.text = text;
+ if (debug) System.err.println("set *" + text + "*");
+ updateTextWidget();
+ }
+
+ public void set(XViewerTextWidget text) {
+ set(text.get());
+ }
+
+ public void append(String text) {
+ this.text = this.text + text;
+ updateTextWidget();
+ }
+
+ @Override
+ public void refresh() {
+ updateTextWidget();
+ }
+
+ @Override
+ public String getReportData() {
+ String s = "";
+ String textStr = new String(text);
+ if (fillVertically) {
+ s = s + "\n";
+ textStr = textStr.replaceAll("\n", "\n" + " ");
+ textStr = " " + textStr;
+ }
+ s = s + textStr;
+ s = s.replaceAll("\n$", "");
+ return s;
+ }
+
+ public String toHTML(String labelFont, boolean newLineText) {
+ String s = HtmlUtil.getLabelStr(labelFont, label + ": ");
+ if (newLineText) s = "<dl><dt>" + s + "<dd>";
+ s += text;
+ if (newLineText) s += "</dl>";
+ return s;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return toHTML(labelFont, false);
+ }
+
+ public void debug(String str) {
+ if (debug) System.err.println("AText :" + str);
+ }
+
+ @Override
+ public boolean isValid() {
+ if (isRequiredEntry() && get().equals("")) {
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return sText.getText();
+ }
+
+ /**
+ * @return the sText
+ */
+ public StyledText getStyledText() {
+ return sText;
+ }
+
+ /**
+ * @return the font
+ */
+ public Font getFont() {
+ return font;
+ }
+
+ /**
+ * @param font the font to set
+ */
+ public void setFont(Font font) {
+ this.font = font;
+ if (sText != null) {
+ sText.setFont(font);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidget.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidget.java
new file mode 100644
index 00000000000..815d3bec9a9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidget.java
@@ -0,0 +1,435 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Abstract class for all widgets used in Wizards and Editors
+ *
+ * @author Donald G. Dunne
+ */
+public abstract class XViewerWidget {
+
+ protected Label labelWidget = null;
+ protected String label = "";
+ protected String xmlRoot = "";
+ protected String xmlSubRoot = "";
+ protected String toolTip = null;
+ protected boolean requiredEntry = false;
+ protected boolean editable = true;
+ protected boolean verticalLabel = false;
+ protected boolean fillVertically = false;
+ protected boolean fillHorizontally = false;
+
+ /**
+ * @return the fillHorizontally
+ */
+ public boolean isFillHorizontally() {
+ return fillHorizontally;
+ }
+
+ protected boolean displayLabel = true;
+ private final Set<XViewerWidgetModifiedListener> modifiedListeners =
+ new LinkedHashSet<XViewerWidgetModifiedListener>();
+ private MouseListener mouseLabelListener;
+
+ /**
+ * Display "label: data"
+ */
+ public final static int RPT_NONE = 0;
+ /**
+ * Display "label: data\n\n" Default of AAtribute
+ */
+ public final static int RPT_SINGLE_LINE = 1;
+ /**
+ * Display "label:\n data\n\n"
+ */
+ public final static int RPT_MULTI_LINE = 2;
+ protected int reportType = RPT_SINGLE_LINE;
+ protected FormToolkit toolkit;
+
+ public XViewerWidget(String label) {
+ this.label = label;
+ }
+
+ public XViewerWidget(String label, String xmlRoot) {
+ this.label = label;
+ this.xmlRoot = xmlRoot;
+ }
+
+ public XViewerWidget(String label, String xmlRoot, String xmlSubRoot) {
+ this.label = label;
+ this.xmlRoot = xmlRoot;
+ this.xmlSubRoot = xmlSubRoot;
+ }
+
+ public void setToolTip(String toolTip) {
+ this.toolTip = toolTip;
+ if (this.labelWidget != null && !labelWidget.isDisposed()) this.labelWidget.setToolTipText(toolTip);
+ }
+
+ public void addXModifiedListener(XViewerWidgetModifiedListener listener) {
+ modifiedListeners.add(listener);
+ }
+
+ public void notifyXModifiedListeners() {
+ for (XViewerWidgetModifiedListener listener : modifiedListeners)
+ listener.widgetModified(this);
+ }
+
+ public void setLabelError() {
+ if (labelWidget == null || labelWidget.isDisposed()) {
+ return;
+ }
+ if (!isValid()) {
+ labelWidget.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ labelWidget.setForeground(null);
+ }
+ if (mouseLabelListener == null) {
+ mouseLabelListener = new MouseListener() {
+ public void mouseDoubleClick(MouseEvent e) {
+ openHelp();
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseUp(MouseEvent e) {
+ }
+ };
+ labelWidget.addMouseListener(mouseLabelListener);
+ }
+ }
+
+ public abstract Control getControl();
+
+ public void openHelp() {
+ try {
+ if (toolTip != null && label != null) MessageDialog.openInformation(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), label + " Tool Tip", toolTip);
+ } catch (Exception ex) {
+ XViewerLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * Create Widgets used to display label and entry for wizards and editors
+ */
+ public abstract void createWidgets(Composite parent, int horizontalSpan);
+
+ public void createWidgets(FormToolkit toolkit, Composite parent, int horizontalSpan) {
+ this.toolkit = toolkit;
+ createWidgets(parent, horizontalSpan);
+ adaptControls(toolkit);
+ }
+
+ public void adaptControls(FormToolkit toolkit) {
+ if (getControl() != null) toolkit.adapt(getControl(), true, true);
+ if (labelWidget != null) {
+ toolkit.adapt(labelWidget, true, true);
+ toolkit.adapt(labelWidget.getParent(), true, true);
+ }
+ }
+
+ /**
+ * Create Widgets used to display label and entry for wizards and editors
+ */
+ public abstract void dispose();
+
+ /**
+ * Set focus to the entry widget
+ */
+ public abstract void setFocus();
+
+ /**
+ * Refresh the entry widget
+ */
+ public abstract void refresh();
+
+ /**
+ * Return true if entry is valid
+ *
+ * @return Return boolean validity indication.
+ */
+ public abstract boolean isValid();
+
+ /**
+ * Called with string found between xml tags Used by setFromXml() String will be sent through AXml.xmlToText() before
+ * being sent to setXmlData implementation. Used by: setFromXml
+ *
+ * @param str - value to set
+ */
+ public abstract void setXmlData(String str);
+
+ /**
+ * Return string to save off between xml tags Used by call to toXml() String returned will be sent through
+ * AXml.textToXml() before being saved Used by: toXml
+ *
+ * @return Return Xml data string.
+ */
+ public abstract String getXmlData();
+
+ public abstract String toHTML(String labelFont);
+
+ public String toXml() throws Exception {
+ if (xmlSubRoot.equals("")) {
+ return toXml(xmlRoot);
+ } else {
+ return toXml(xmlRoot, xmlSubRoot);
+ }
+ }
+
+ public String toXml(String xmlRoot) throws Exception {
+ String s = "<" + xmlRoot + ">" + XmlUtil.textToXml(getXmlData()) + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ public String toXml(String xmlRoot, String xmlSubRoot) throws Exception {
+ String s =
+ "<" + xmlRoot + ">" + "<" + xmlSubRoot + ">" + XmlUtil.textToXml(getXmlData()) + "</" + xmlSubRoot + ">" + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ public void setFromXml(String xml) throws IllegalStateException {
+ Matcher m;
+ m = Pattern.compile("<" + xmlRoot + ">(.*?)</" + xmlRoot + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(xml);
+ if (m.find()) setXmlData(XmlUtil.xmlToText(m.group(1)));
+ }
+
+ /**
+ * @return Returns vector of Strings.
+ */
+ public Vector<String> getDisplayLabels() {
+ Vector<String> l = new Vector<String>();
+ l.add(label);
+ return l;
+ }
+
+ /**
+ * @param displayLabel The displayLabel to set.
+ */
+ public void setDisplayLabel(String displayLabel) {
+ this.label = displayLabel;
+ }
+
+ /**
+ * @return Returns the editable.
+ */
+ public boolean isEditable() {
+ return editable;
+ }
+
+ /**
+ * @param editable The editable to set.
+ */
+ public void setEditable(boolean editable) {
+ this.editable = editable;
+ }
+
+ /**
+ * @return Returns the verticalLabel.
+ */
+ public boolean isVerticalLabel() {
+ return verticalLabel;
+ }
+
+ /**
+ * @param verticalLabel The verticalLabel to set.
+ */
+ public void setVerticalLabel(boolean verticalLabel) {
+ this.verticalLabel = verticalLabel;
+ }
+
+ /**
+ * @return Returns the xmlRoot.
+ */
+ public String getXmlRoot() {
+ return xmlRoot;
+ }
+
+ /**
+ * @param xmlRoot The xmlRoot to set.
+ */
+ public void setXmlRoot(String xmlRoot) {
+ this.xmlRoot = xmlRoot;
+ }
+
+ /**
+ * @return Returns the xmlSubRoot.
+ */
+ public String getXmlSubRoot() {
+ return xmlSubRoot;
+ }
+
+ /**
+ * @param xmlSubRoot The xmlSubRoot to set.
+ */
+ public void setXmlSubRoot(String xmlSubRoot) {
+ this.xmlSubRoot = xmlSubRoot;
+ }
+
+ /**
+ * @return Returns the toolTip.
+ */
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ /**
+ * @return Returns the fillVertically.
+ */
+ public boolean isFillVertically() {
+ return fillVertically;
+ }
+
+ /**
+ * @param fillVertically The fillVertically to set.
+ */
+ public void setFillVertically(boolean fillVertically) {
+ this.fillVertically = fillVertically;
+ }
+
+ /**
+ * @return Returns the label.
+ */
+ public String getLabel() {
+ return label;
+ }
+
+ /**
+ * @param label The label to set.
+ */
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ /**
+ * @return Returns the labelWidget.
+ */
+ public Label getLabelWidget() {
+ return labelWidget;
+ }
+
+ /**
+ * @param labelWidget The labelWidget to set.
+ */
+ public void setLabelWidget(Label labelWidget) {
+ this.labelWidget = labelWidget;
+ }
+
+ /**
+ * @return Returns the requiredEntry.
+ */
+ public boolean isRequiredEntry() {
+ return requiredEntry;
+ }
+
+ /**
+ * @param requiredEntry The requiredEntry to set.
+ */
+ public void setRequiredEntry(boolean requiredEntry) {
+ this.requiredEntry = requiredEntry;
+ }
+
+ /**
+ * @return Returns the reportType.
+ */
+ public int getReportType() {
+ return reportType;
+ }
+
+ /**
+ * @param reportType The reportType to set.
+ */
+ public void setReportType(int reportType) {
+ this.reportType = reportType;
+ }
+
+ /**
+ * Return data for display in Report (without label) NOTE: There should be no newlines at end of String
+ *
+ * @return Return string.
+ */
+ public abstract String getReportData();
+
+ @Override
+ public String toString() {
+ return toReport();
+ }
+
+ public String toReport() {
+ return toReport(reportType);
+ }
+
+ /**
+ * RPT_NONE (label: data), RPT_SINGLE_LINE (label: data\n\n), RPT_MULTI_LINE (label:\n data\n\n)
+ *
+ * @return String report
+ */
+ public String toReport(int rptType) {
+ String s = label + ": ";
+ switch (rptType) {
+ case RPT_SINGLE_LINE:
+ s += getReportData() + "\n\n";
+ break;
+ case RPT_MULTI_LINE:
+ String data = getReportData();
+ data = data.replaceAll("\n", "\n ");
+ s += "\n" + data + "\n\n";
+ break;
+ default:
+ s += getReportData();
+ break;
+ }
+ return s;
+ }
+
+ /**
+ * If set, label will be displayed with entry widget.
+ *
+ * @param displayLabel The displayLabel to set.
+ */
+ public void setDisplayLabel(boolean displayLabel) {
+ this.displayLabel = displayLabel;
+ }
+
+ public void setFillHorizontally(boolean fillHorizontally) {
+ this.fillHorizontally = fillHorizontally;
+ }
+
+ public abstract Object getData();
+
+ /**
+ * @return the displayLabel
+ */
+ public boolean isDisplayLabel() {
+ return displayLabel;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidgetModifiedListener.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidgetModifiedListener.java
new file mode 100644
index 00000000000..ab4f842e9a5
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XViewerWidgetModifiedListener.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.nebula.widgets.xviewer.util.internal;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface XViewerWidgetModifiedListener {
+
+ public void widgetModified(XViewerWidget widget);
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XmlUtil.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XmlUtil.java
new file mode 100644
index 00000000000..9882aa2edab
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/XmlUtil.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util.internal;
+
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XmlUtil {
+
+ public static String getRootTag(String xmlStr) {
+ Matcher m;
+ m = Pattern.compile("^[\r\n \t]*<.*?>[\r\n \t]*<(.*?)>", Pattern.MULTILINE | Pattern.DOTALL).matcher(xmlStr);
+ if (m.find()) {
+ return m.group(1);
+ }
+ return "";
+ }
+
+ /**
+ * Returns <elementName>data</elementName> NOTE: data is not sent through AXml.textToXml
+ *
+ * @param elementName
+ * @param data
+ * @return String <elementName>data</elementName>
+ */
+ public static String addTagData(String elementName, String data) {
+ return addTagData(elementName, data, false);
+ }
+
+ public static String addTagData(String elementName, String data, boolean newLine) {
+ String str = "<" + elementName + ">" + data + "</" + elementName + ">";
+ if (newLine)
+ return str + "\n";
+ else
+ return str;
+ }
+
+ /**
+ * Parse <xmlRoot name="this.is.name" value="this.is.value"> and return name, value
+ *
+ * @param xmlRoot xml tag name
+ * @param xmlStr string containing xml
+ * @return String[]{name, value}
+ */
+ public static String[] getNameValue(String xmlRoot, String xmlStr) {
+ String[] strs = new String[] {"", ""};
+ Matcher m;
+ m =
+ Pattern.compile("<" + xmlRoot + " name=\"(.*?)\" value=\"(.*?)\" />", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xmlStr);
+ if (m.find()) {
+ strs[0] = m.group(1);
+ strs[1] = m.group(2);
+ }
+ return strs;
+ }
+
+ public static String getNameValueXml(String xmlRoot, String name, String value) {
+ return String.format("<%s name=\"%s\" value=\"%s\"/>", xmlRoot, name, value);
+ }
+
+ public static String[] getTagDataArray(String xmlStr, String xmlRoot) {
+ Vector<String> v = new Vector<String>();
+ Matcher m;
+ m =
+ Pattern.compile("<" + xmlRoot + ">(.*?)</" + xmlRoot + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xmlStr);
+ while (m.find()) {
+ v.add(xmlToText(m.group(1)));
+ }
+ return v.toArray(new String[v.size()]);
+ }
+
+ /**
+ * Returns data between <xmlRoot> and </xmlRoot> from xmlStr
+ *
+ * @param xmlStr
+ * @param xmlRoot
+ * @return Return tag string
+ */
+ public static String getTagData(String xmlStr, String xmlRoot) {
+ String tags[] = getTagDataArray(xmlStr, xmlRoot);
+ if (tags.length > 0) {
+ return tags[0];
+ }
+ return "";
+ }
+
+ public static int getTagIntData(String xmlStr, String xmlRoot) {
+ String tags[] = getTagDataArray(xmlStr, xmlRoot);
+ if (tags.length > 0) {
+ String intStr = tags[0];
+ return (new Integer(intStr)).intValue();
+ }
+ return 0;
+ }
+
+ public static Boolean getTagBooleanData(String xmlStr, String xmlRoot) {
+ String tags[] = getTagDataArray(xmlStr, xmlRoot);
+ if (tags.length > 0) {
+ String intStr = tags[0];
+ return (intStr.equals("true") ? true : false);
+ }
+ return false;
+ }
+
+ /**
+ * Given text strings containing xml reserved characters, replace with valid xml representation characters > => & gt;
+ * < => & lt; & => & amp; ' => & apos; " => & quot;
+ *
+ * @param text text to be converted to valid XML representation characters
+ * @return String valid xml string
+ */
+ public static String textToXml(String text) {
+ if (text == null || text.equals("")) return "";
+ String str = new String(text);
+ str = str.replaceAll("&", "&amp;");
+ str = str.replaceAll(">", "&gt;");
+ str = str.replaceAll("<", "&lt;");
+ str = str.replaceAll("'", "&apos;");
+ str = str.replaceAll("\"", "&quot;");
+ return str;
+ }
+
+ /**
+ * Given xml strings containing xml reserved characters, replace with displayable characters > <= & gt; < <= & lt; &
+ * <= & amp; ' <= & apos; " <= & quot;
+ *
+ * @param xml
+ * @return displayable string
+ */
+ public static String xmlToText(String xml) {
+ if (xml == null || xml.equals("")) return "";
+ String str = new String(xml);
+ str = str.replaceAll("&gt;", ">");
+ str = str.replaceAll("&lt;", "<");
+ str = str.replaceAll("&apos;", "'");
+ str = str.replaceAll("&quot;", "\"");
+ str = str.replaceAll("&amp;", "&");
+ return str;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DateSelectionDialog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DateSelectionDialog.java
new file mode 100644
index 00000000000..ebaf907eb35
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DateSelectionDialog.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.nebula.widgets.xviewer.util.internal.dialog;
+
+import java.util.Calendar;
+import java.util.Date;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarListenerAdapter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DateSelectionDialog extends MessageDialog {
+
+ private Date selectedDate;
+
+ private final String dialogMessage;
+ private boolean noneSelected = false;
+
+ public DateSelectionDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex, Date selectedDate) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.selectedDate = selectedDate;
+ this.dialogMessage = dialogMessage;
+ }
+
+ public DateSelectionDialog(String dialogTitle, String dialogMessage, Date selectedDate) {
+ this(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.NONE, new String[] {
+ "Ok", "Cancel"}, 0, selectedDate);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Composite filterComp = new Composite(container, SWT.NONE);
+
+ filterComp.setLayout(new GridLayout(1, false));
+ filterComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ (new Label(filterComp, SWT.None)).setText(dialogMessage);
+
+ final CalendarCombo dp = new CalendarCombo(filterComp, SWT.SINGLE | SWT.FLAT);
+ if (selectedDate != null) dp.setDate(selectedDate);
+ dp.addCalendarListener(new CalendarListenerAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.calendarcombo.ICalendarListener#dateChanged(java.util.Calendar)
+ */
+ @Override
+ public void dateChanged(Calendar date) {
+ if (date == null) {
+ noneSelected = true;
+ } else {
+ noneSelected = false;
+ selectedDate = dp.getDate().getTime();
+ }
+ }
+ });
+
+ // set selected date if != null
+ return filterComp;
+ }
+
+ /**
+ * @return the selectedDate
+ */
+ public Date getSelectedDate() {
+ return selectedDate;
+ }
+
+ /**
+ * @param selectedDate the selectedDate to set
+ */
+ public void setSelectedDate(Date selectedDate) {
+ this.selectedDate = selectedDate;
+ }
+
+ /**
+ * @return the noneSelected
+ */
+ public boolean isNoneSelected() {
+ return noneSelected;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DialogWithEntry.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DialogWithEntry.java
new file mode 100644
index 00000000000..fe0e2146420
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/DialogWithEntry.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.xviewer.util.internal.dialog;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerTextWidget;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DialogWithEntry extends MessageDialog {
+
+ XViewerTextWidget text;
+ Composite comp;
+ String entryText = "";
+ String validationRegularExpression = null;
+ String validationErrorString = "";
+ Button ok;
+ MouseMoveListener listener;
+ Label errorLabel;
+ boolean fillVertically = false;
+ private static Font font = null;
+ private Button fontButton;
+
+ public DialogWithEntry(String dialogTitle, String dialogMessage) {
+ super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.QUESTION,
+ new String[] {"OK", "Cancel"}, 0);
+ }
+
+ public DialogWithEntry(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+ listener = new MouseMoveListener() {
+
+ public void mouseMove(MouseEvent e) {
+ setInitialButtonState();
+ }
+ };
+ comp.addMouseMoveListener(listener);
+
+ Composite headerComp = new Composite(comp, SWT.NONE);
+ headerComp.setLayout(new GridLayout(3, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 2;
+ headerComp.setLayoutData(gd);
+
+ if (fillVertically) { // Create error label
+ Button button = new Button(headerComp, SWT.PUSH);
+ button.setText("Clear");
+ button.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ text.setText("");
+ }
+ });
+ // Create error label
+ fontButton = new Button(headerComp, SWT.CHECK);
+ fontButton.setText("Fixed Font");
+ fontButton.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (fontButton.getSelection()) {
+ if (font == null) {
+ font = new Font(Display.getCurrent(), "Courier New", 8, SWT.NORMAL);
+ }
+ text.setFont(font);
+ } else
+ text.setFont(null);
+ }
+ });
+ }
+
+ // Create error label
+ errorLabel = new Label(headerComp, SWT.NONE);
+ errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ errorLabel.setText("");
+ if (!fillVertically) {
+ gd = new GridData();
+ gd.horizontalSpan = 3;
+ errorLabel.setLayoutData(gd);
+ }
+
+ text = new XViewerTextWidget();
+ text.setFillHorizontally(true);
+ text.setFocus();
+ text.setDisplayLabel(false);
+ if (fillVertically) {
+ text.setFillVertically(true);
+ text.setHeight(200);
+ text.setFont(font);
+ }
+ text.createWidgets(comp, 2);
+ if (!entryText.equals("")) text.set(entryText);
+
+ ModifyListener modifyListener = new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ handleModified();
+ }
+ };
+ text.addModifyListener(modifyListener);
+ createExtendedArea(comp);
+ comp.layout();
+ parent.layout();
+ return comp;
+ }
+
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ /**
+ * Override to provide other widgets
+ *
+ * @param parent
+ */
+ protected void createExtendedArea(Composite parent) {
+ }
+
+ public void setInitialButtonState() {
+ if (ok == null) {
+ ok = getButton(0);
+ handleModified();
+ }
+ comp.removeMouseMoveListener(listener);
+ }
+
+ public void handleModified() {
+ if (text != null) {
+ entryText = text.get();
+ if (!isEntryValid()) {
+ getButton(getDefaultButtonIndex()).setEnabled(false);
+ errorLabel.setText(validationErrorString);
+ errorLabel.update();
+ comp.layout();
+ } else {
+ getButton(getDefaultButtonIndex()).setEnabled(true);
+ errorLabel.setText("");
+ errorLabel.update();
+ comp.layout();
+ }
+ }
+ }
+
+ public String getEntry() {
+ return entryText;
+ }
+
+ public void setEntry(String entry) {
+ if (text != null) text.set(entry);
+ this.entryText = entry;
+ }
+
+ /**
+ * override this method to make own checks on entry this will be called with every keystroke
+ *
+ * @return true if entry is valid
+ */
+ public boolean isEntryValid() {
+ if (validationRegularExpression == null) {
+ return true;
+ }
+ // verify title is alpha-numeric with spaces and dashes
+ Matcher m = Pattern.compile(validationRegularExpression).matcher(text.get());
+ return m.find();
+ }
+
+ public void setValidationRegularExpression(String regExp) {
+ validationRegularExpression = regExp;
+ }
+
+ public void setValidationErrorString(String errorText) {
+ validationErrorString = errorText;
+ }
+
+ /**
+ * Calling will enable dialog to loose focus
+ */
+ public void setModeless() {
+ setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS);
+ setBlockOnOpen(false);
+ }
+
+ public void setSelectionListener(SelectionListener listener) {
+ for (int i = 0; i < getButtonLabels().length; i++) {
+ Button button = getButton(i);
+ button.addSelectionListener(listener);
+ }
+ }
+
+ public boolean isFillVertically() {
+ return fillVertically;
+ }
+
+ public void setFillVertically(boolean fillVertically) {
+ this.fillVertically = fillVertically;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/HtmlDialog.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/HtmlDialog.java
new file mode 100644
index 00000000000..a1cf22d60e0
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/HtmlDialog.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.nebula.widgets.xviewer.util.internal.dialog;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.Activator;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
+import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class HtmlDialog extends MessageDialog {
+ protected Browser b;
+ private LocationListener listener;
+ private final String html;
+
+ public HtmlDialog(String title, String message, String html) {
+ super(Display.getCurrent().getActiveShell(), title, null, message, SWT.NONE, new String[] {"OK", "Cancel"}, 0);
+ this.html = html;
+ }
+
+ /**
+ * Add listener to browser widget.
+ *
+ * @param listener
+ */
+ public void addLocationListener(LocationListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite c = (Composite) super.createDialogArea(parent);
+ b = new Browser(c, SWT.BORDER);
+ GridData gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+ b.setLayoutData(gd);
+ b.setText(html);
+ b.setSize(500, 500);
+ if (listener != null) b.addLocationListener(listener);
+ b.setMenu(pageOverviewGetPopup());
+
+ return c;
+ }
+
+ public Menu pageOverviewGetPopup() {
+ Menu menu = new Menu(b.getShell());
+ MenuItem item = new MenuItem(menu, SWT.NONE);
+ item.setText("View Source");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String file = System.getProperty("user.home") + File.separator + "out.html";
+ try {
+ XViewerLib.writeStringToFile(html, new File(file));
+ } catch (IOException ex) {
+ XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
+ }
+ Program.launch(file);
+ }
+ });
+ return menu;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/ListDialogSortable.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/ListDialogSortable.java
new file mode 100644
index 00000000000..492fa0d80b5
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/dialog/ListDialogSortable.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.nebula.widgets.xviewer.util.internal.dialog;
+
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumnSorter;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ListDialogSortable extends ListDialog {
+
+ private ViewerSorter viewerSorter;
+
+ /**
+ * @param parent
+ */
+ public ListDialogSortable(Shell parent) {
+ super(parent);
+ }
+
+ /**
+ * @param parent
+ */
+ public ListDialogSortable(ViewerSorter viewerSorter, Shell parent) {
+ super(parent);
+ this.viewerSorter = viewerSorter;
+ }
+
+ public void setSorter(ViewerSorter viewerSorter) {
+ this.viewerSorter = viewerSorter;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control control = super.createDialogArea(container);
+ if (viewerSorter != null) {
+ getTableViewer().setSorter(new XViewerColumnSorter());
+ }
+ return control;
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/XViewerImageCache.java b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/XViewerImageCache.java
new file mode 100644
index 00000000000..cf9b44659bc
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/XViewerImageCache.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.nebula.widgets.xviewer.util.internal.images;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerImageCache {
+
+ static Map<String, Image> imageCache = new HashMap<String, Image>();
+
+ /**
+ * Return image
+ *
+ * @param example clear.gif
+ * @return the clearImage
+ */
+ public static Image getImage(String imageName) {
+ if (!imageCache.containsKey(imageName)) {
+ imageCache.put(imageName, getImageDescriptor(imageName).createImage());
+ }
+ return imageCache.get(imageName);
+ }
+
+ public static ImageDescriptor getImageDescriptor(String imageName) {
+ URL url = XViewerImageCache.class.getResource(imageName);
+ return ImageDescriptor.createFromURL(url);
+ }
+
+}
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_disabled.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_disabled.gif
new file mode 100644
index 00000000000..7aa131aedb6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_disabled.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_enabled.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_enabled.gif
new file mode 100644
index 00000000000..9cacb96dca9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/chkbox_enabled.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clear.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clear.gif
new file mode 100644
index 00000000000..af30a42f83d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clear.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clock.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clock.gif
new file mode 100644
index 00000000000..c984fba7039
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/clock.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customize.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customize.gif
new file mode 100644
index 00000000000..e9540ff77dd
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customize.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeD.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeD.gif
new file mode 100644
index 00000000000..f0ce638b800
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeD.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeG.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeG.gif
new file mode 100644
index 00000000000..7447efda55d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeG.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeP.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeP.gif
new file mode 100644
index 00000000000..3e88710663b
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizeP.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizePersonal.gif b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizePersonal.gif
new file mode 100644
index 00000000000..b6d9161b68f
--- /dev/null
+++ b/org.eclipse.nebula.widgets.xviewer/src/org/eclipse/nebula/widgets/xviewer/util/internal/images/customizePersonal.gif
Binary files differ
diff --git a/org.eclipse.osee.ats.config.demo/.classpath b/org.eclipse.osee.ats.config.demo/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ats.config.demo/.project b/org.eclipse.osee.ats.config.demo/.project
new file mode 100644
index 00000000000..5ef532e88f3
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ats.config.demo</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.ats.config.demo/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ats.config.demo/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.ats.config.demo/META-INF/MANIFEST.MF b/org.eclipse.osee.ats.config.demo/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c3f558b54f2
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Demo Plug-in
+Bundle-SymbolicName: org.eclipse.osee.ats.config.demo;singleton:=true
+Bundle-Version: 1.0.1.qualifier
+Bundle-Activator: org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator
+Bundle-Vendor: Boeing
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.database,
+ org.eclipse.osee.ats,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.ui.jdk,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.ui.plugin,
+ org.junit4,
+ org.eclipse.osee.framework.core,
+ org.eclipse.ui.forms;bundle-version="3.3.101",
+ org.eclipse.osee.support.test.util;bundle-version="1.0.0"
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Export-Package:
+ org.eclipse.osee.ats.config.demo.artifact,
+ org.eclipse.osee.ats.config.demo.config,
+ org.eclipse.osee.ats.config.demo.navigate,
+ org.eclipse.osee.ats.config.demo.util
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbInit.launch b/org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbInit.launch
new file mode 100644
index 00000000000..71c28143ddf
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbInit.launch
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="askclear" value="false"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="true"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="includeOptional" value="false"/>
+<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/MasterTestSuite_DemoDbInit.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.osee.ats.test.MasterTestSuite_DemoDbInit"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osee.ats.test"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dequinox.ds.debug=true&#13;&#10;-Dosee.application.server=http://localhost:8089&#13;&#10;-Dosee.authentication.protocol=demo"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="false"/>
+<booleanAttribute key="useProduct" value="true"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbPopulate.launch b/org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbPopulate.launch
new file mode 100644
index 00000000000..85c2ba62dd1
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/MasterTestSuite_DemoDbPopulate.launch
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="askclear" value="false"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="true"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+<booleanAttribute key="default" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/test/MasterTestSuite_DemoDbPopulate.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.osee.ats.config.demo.test.MasterTestSuite_DemoDbPopulate"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osee.ats.config.demo"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dequinox.ds.debug=true &#13;&#10;-Dosee.application.server=http://localhost:8089&#13;&#10;-Dosee.authentication.protocol=demo"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
+<stringAttribute key="selected_target_plugins" value="com.ibm.icu,com.ibm.icu.source,com.jcraft.jsch,com.lowagie.itext,javax.activation,javax.servlet,javax.servlet.jsp,javax.servlet.jsp.source,javax.servlet.source,javax.wsdl,javax.xml,org.apache.ant,org.apache.ant.source,org.apache.batik.bridge,org.apache.batik.css,org.apache.batik.dom,org.apache.batik.dom.svg,org.apache.batik.ext.awt,org.apache.batik.extension,org.apache.batik.parser,org.apache.batik.pdf,org.apache.batik.svggen,org.apache.batik.swing,org.apache.batik.transcoder,org.apache.batik.util,org.apache.batik.util.gui,org.apache.batik.xml,org.apache.commons.codec,org.apache.commons.el,org.apache.commons.el.source,org.apache.commons.httpclient,org.apache.commons.logging,org.apache.commons.logging.source,org.apache.jasper,org.apache.jasper.source,org.apache.lucene,org.apache.lucene.analysis,org.apache.lucene.analysis.source,org.apache.lucene.source,org.apache.oro,org.apache.xerces,org.apache.xml.resolver,org.apache.xml.serializer,org.eclipse.ant.core,org.eclipse.ant.core.source,org.eclipse.ant.ui,org.eclipse.ant.ui.source,org.eclipse.birt.chart.device.extension,org.eclipse.birt.chart.device.pdf,org.eclipse.birt.chart.device.svg,org.eclipse.birt.chart.device.swt,org.eclipse.birt.chart.engine,org.eclipse.birt.chart.engine.extension,org.eclipse.birt.chart.runtime,org.eclipse.birt.core,org.eclipse.compare,org.eclipse.compare.source,org.eclipse.core.boot,org.eclipse.core.commands,org.eclipse.core.commands.source,org.eclipse.core.contenttype,org.eclipse.core.contenttype.source,org.eclipse.core.databinding,org.eclipse.core.databinding.beans,org.eclipse.core.databinding.beans.source,org.eclipse.core.databinding.source,org.eclipse.core.expressions,org.eclipse.core.expressions.source,org.eclipse.core.filebuffers,org.eclipse.core.filebuffers.source,org.eclipse.core.filesystem,org.eclipse.core.filesystem.source,org.eclipse.core.filesystem.win32.x86,org.eclipse.core.jobs,org.eclipse.core.jobs.source,org.eclipse.core.net,org.eclipse.core.net.source,org.eclipse.core.net.win32.x86,org.eclipse.core.resources,org.eclipse.core.resources.compatibility,org.eclipse.core.resources.compatibility.source,org.eclipse.core.resources.source,org.eclipse.core.resources.win32.x86,org.eclipse.core.runtime,org.eclipse.core.runtime.compatibility,org.eclipse.core.runtime.compatibility.auth,org.eclipse.core.runtime.compatibility.auth.source,org.eclipse.core.runtime.compatibility.registry,org.eclipse.core.runtime.compatibility.registry.source,org.eclipse.core.runtime.compatibility.source,org.eclipse.core.runtime.source,org.eclipse.core.variables,org.eclipse.core.variables.source,org.eclipse.cvs,org.eclipse.cvs.source,org.eclipse.datatools.connectivity,org.eclipse.datatools.connectivity.console.profile,org.eclipse.datatools.connectivity.db.generic,org.eclipse.datatools.connectivity.oda,org.eclipse.datatools.connectivity.oda.consumer,org.eclipse.datatools.connectivity.oda.design,org.eclipse.datatools.connectivity.oda.design.ui,org.eclipse.datatools.connectivity.oda.flatfile,org.eclipse.datatools.connectivity.oda.flatfile.ui,org.eclipse.datatools.connectivity.oda.profile,org.eclipse.datatools.connectivity.oda.template.ui,org.eclipse.datatools.connectivity.sqm.core,org.eclipse.datatools.connectivity.sqm.core.ui,org.eclipse.datatools.connectivity.sqm.server.ui,org.eclipse.datatools.connectivity.ui,org.eclipse.datatools.connectivity.ui.dse,org.eclipse.datatools.doc.user,org.eclipse.datatools.enablement.oda.ws,org.eclipse.datatools.enablement.oda.xml,org.eclipse.datatools.help,org.eclipse.datatools.modelbase.dbdefinition,org.eclipse.datatools.modelbase.sql,org.eclipse.datatools.modelbase.sql.edit,org.eclipse.datatools.modelbase.sql.query,org.eclipse.datatools.modelbase.sql.query.edit,org.eclipse.datatools.modelbase.sql.xml.query,org.eclipse.datatools.oda.cshelp,org.eclipse.debug.core,org.eclipse.debug.core.source,org.eclipse.debug.ui,org.eclipse.debug.ui.source,org.eclipse.draw2d,org.eclipse.draw2d.doc.isv,org.eclipse.draw2d.source,org.eclipse.ecf,org.eclipse.ecf.filetransfer,org.eclipse.ecf.identity,org.eclipse.ecf.provider.filetransfer,org.eclipse.ecf.provider.filetransfer.ssl,org.eclipse.ecf.ssl,org.eclipse.emf,org.eclipse.emf.ant,org.eclipse.emf.codegen,org.eclipse.emf.codegen.ecore,org.eclipse.emf.codegen.ecore.ui,org.eclipse.emf.codegen.ui,org.eclipse.emf.common,org.eclipse.emf.common.ui,org.eclipse.emf.converter,org.eclipse.emf.databinding,org.eclipse.emf.databinding.edit,org.eclipse.emf.ecore,org.eclipse.emf.ecore.change,org.eclipse.emf.ecore.change.edit,org.eclipse.emf.ecore.edit,org.eclipse.emf.ecore.editor,org.eclipse.emf.ecore.xmi,org.eclipse.emf.edit,org.eclipse.emf.edit.ui,org.eclipse.emf.exporter,org.eclipse.emf.importer,org.eclipse.emf.importer.ecore,org.eclipse.emf.importer.java,org.eclipse.emf.importer.rose,org.eclipse.emf.mapping,org.eclipse.emf.mapping.ecore,org.eclipse.emf.mapping.ecore.editor,org.eclipse.emf.mapping.ecore2ecore,org.eclipse.emf.mapping.ecore2ecore.editor,org.eclipse.emf.mapping.ecore2xml,org.eclipse.emf.mapping.ecore2xml.ui,org.eclipse.emf.mapping.ui,org.eclipse.equinox.app,org.eclipse.equinox.app.source,org.eclipse.equinox.common,org.eclipse.equinox.common.source,org.eclipse.equinox.ds,org.eclipse.equinox.frameworkadmin,org.eclipse.equinox.frameworkadmin.equinox,org.eclipse.equinox.frameworkadmin.equinox.source,org.eclipse.equinox.frameworkadmin.source,org.eclipse.equinox.http.jetty,org.eclipse.equinox.http.jetty.source,org.eclipse.equinox.http.registry,org.eclipse.equinox.http.registry.source,org.eclipse.equinox.http.servlet,org.eclipse.equinox.http.servlet.source,org.eclipse.equinox.jsp.jasper,org.eclipse.equinox.jsp.jasper.registry,org.eclipse.equinox.jsp.jasper.registry.source,org.eclipse.equinox.jsp.jasper.source,org.eclipse.equinox.launcher,org.eclipse.equinox.launcher.source,org.eclipse.equinox.launcher.win32.win32.x86,org.eclipse.equinox.p2.artifact.repository,org.eclipse.equinox.p2.artifact.repository.source,org.eclipse.equinox.p2.console,org.eclipse.equinox.p2.console.source,org.eclipse.equinox.p2.core,org.eclipse.equinox.p2.core.source,org.eclipse.equinox.p2.director,org.eclipse.equinox.p2.director.app,org.eclipse.equinox.p2.director.app.source,org.eclipse.equinox.p2.director.source,org.eclipse.equinox.p2.directorywatcher,org.eclipse.equinox.p2.directorywatcher.source,org.eclipse.equinox.p2.engine,org.eclipse.equinox.p2.engine.source,org.eclipse.equinox.p2.exemplarysetup,org.eclipse.equinox.p2.exemplarysetup.source,org.eclipse.equinox.p2.extensionlocation,org.eclipse.equinox.p2.extensionlocation.source,org.eclipse.equinox.p2.garbagecollector,org.eclipse.equinox.p2.garbagecollector.source,org.eclipse.equinox.p2.jarprocessor,org.eclipse.equinox.p2.jarprocessor.source,org.eclipse.equinox.p2.metadata,org.eclipse.equinox.p2.metadata.generator,org.eclipse.equinox.p2.metadata.generator.source,org.eclipse.equinox.p2.metadata.repository,org.eclipse.equinox.p2.metadata.repository.source,org.eclipse.equinox.p2.metadata.source,org.eclipse.equinox.p2.reconciler.dropins,org.eclipse.equinox.p2.reconciler.dropins.source,org.eclipse.equinox.p2.touchpoint.eclipse,org.eclipse.equinox.p2.touchpoint.eclipse.source,org.eclipse.equinox.p2.touchpoint.natives,org.eclipse.equinox.p2.touchpoint.natives.source,org.eclipse.equinox.p2.ui,org.eclipse.equinox.p2.ui.sdk,org.eclipse.equinox.p2.ui.sdk.source,org.eclipse.equinox.p2.ui.source,org.eclipse.equinox.p2.updatechecker,org.eclipse.equinox.p2.updatechecker.source,org.eclipse.equinox.p2.updatesite,org.eclipse.equinox.p2.updatesite.source,org.eclipse.equinox.preferences,org.eclipse.equinox.preferences.source,org.eclipse.equinox.registry,org.eclipse.equinox.registry.source,org.eclipse.equinox.security,org.eclipse.equinox.security.source,org.eclipse.equinox.security.ui,org.eclipse.equinox.security.ui.source,org.eclipse.equinox.security.win32.x86,org.eclipse.equinox.security.win32.x86.source,org.eclipse.equinox.simpleconfigurator,org.eclipse.equinox.simpleconfigurator.manipulator,org.eclipse.equinox.simpleconfigurator.manipulator.source,org.eclipse.equinox.simpleconfigurator.source,org.eclipse.equinox.util,org.eclipse.gef,org.eclipse.gef.doc.isv,org.eclipse.gef.examples.ui.pde,org.eclipse.gef.source,org.eclipse.help,org.eclipse.help.appserver,org.eclipse.help.appserver.source,org.eclipse.help.base,org.eclipse.help.base.source,org.eclipse.help.source,org.eclipse.help.ui,org.eclipse.help.ui.source,org.eclipse.help.webapp,org.eclipse.help.webapp.source,org.eclipse.jdt,org.eclipse.jdt.apt.core,org.eclipse.jdt.apt.core.source,org.eclipse.jdt.apt.pluggable.core,org.eclipse.jdt.apt.pluggable.core.source,org.eclipse.jdt.apt.ui,org.eclipse.jdt.apt.ui.source,org.eclipse.jdt.compiler.apt,org.eclipse.jdt.compiler.apt.source,org.eclipse.jdt.compiler.tool,org.eclipse.jdt.compiler.tool.source,org.eclipse.jdt.core,org.eclipse.jdt.core.manipulation,org.eclipse.jdt.core.manipulation.source,org.eclipse.jdt.core.source,org.eclipse.jdt.debug,org.eclipse.jdt.debug.source,org.eclipse.jdt.debug.ui,org.eclipse.jdt.debug.ui.source,org.eclipse.jdt.doc.isv,org.eclipse.jdt.doc.user,org.eclipse.jdt.junit,org.eclipse.jdt.junit.runtime,org.eclipse.jdt.junit.runtime.source,org.eclipse.jdt.junit.source,org.eclipse.jdt.junit4.runtime,org.eclipse.jdt.junit4.runtime.source,org.eclipse.jdt.launching,org.eclipse.jdt.launching.source,org.eclipse.jdt.source,org.eclipse.jdt.ui,org.eclipse.jdt.ui.source,org.eclipse.jface,org.eclipse.jface.databinding,org.eclipse.jface.databinding.source,org.eclipse.jface.source,org.eclipse.jface.text,org.eclipse.jface.text.source,org.eclipse.jsch.core,org.eclipse.jsch.core.source,org.eclipse.jsch.ui,org.eclipse.jsch.ui.source,org.eclipse.ltk.core.refactoring,org.eclipse.ltk.core.refactoring.source,org.eclipse.ltk.ui.refactoring,org.eclipse.ltk.ui.refactoring.source,org.eclipse.nebula.widgets.calendarcombo,org.eclipse.nebula.widgets.calendarcombo,org.eclipse.osgi,org.eclipse.osgi.services,org.eclipse.osgi.services.source,org.eclipse.osgi.source,org.eclipse.osgi.util,org.eclipse.osgi.util.source,org.eclipse.pde,org.eclipse.pde.api.tools,org.eclipse.pde.api.tools.source,org.eclipse.pde.api.tools.ui,org.eclipse.pde.api.tools.ui.source,org.eclipse.pde.build,org.eclipse.pde.build.source,org.eclipse.pde.core,org.eclipse.pde.core.source,org.eclipse.pde.doc.user,org.eclipse.pde.junit.runtime,org.eclipse.pde.junit.runtime.source,org.eclipse.pde.p2.ui,org.eclipse.pde.p2.ui.source,org.eclipse.pde.runtime,org.eclipse.pde.runtime.source,org.eclipse.pde.source,org.eclipse.pde.ui,org.eclipse.pde.ui.source,org.eclipse.pde.ui.templates,org.eclipse.pde.ui.templates.source,org.eclipse.platform,org.eclipse.platform.doc.isv,org.eclipse.platform.doc.user,org.eclipse.platform.source,org.eclipse.rcp,org.eclipse.rcp.source,org.eclipse.sdk,org.eclipse.search,org.eclipse.search.source,org.eclipse.swt,org.eclipse.swt.win32.win32.x86,org.eclipse.swt.win32.win32.x86.source,org.eclipse.team.core,org.eclipse.team.core.source,org.eclipse.team.cvs.core,org.eclipse.team.cvs.core.source,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh.source,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ssh2.source,org.eclipse.team.cvs.ui,org.eclipse.team.cvs.ui.source,org.eclipse.team.svn,org.eclipse.team.svn.core,org.eclipse.team.svn.help,org.eclipse.team.svn.ui,org.eclipse.team.ui,org.eclipse.team.ui.source,org.eclipse.text,org.eclipse.text.source,org.eclipse.ui,org.eclipse.ui.browser,org.eclipse.ui.browser.source,org.eclipse.ui.cheatsheets,org.eclipse.ui.cheatsheets.source,org.eclipse.ui.console,org.eclipse.ui.console.source,org.eclipse.ui.editors,org.eclipse.ui.editors.source,org.eclipse.ui.externaltools,org.eclipse.ui.externaltools.source,org.eclipse.ui.forms,org.eclipse.ui.forms.source,org.eclipse.ui.ide,org.eclipse.ui.ide.application,org.eclipse.ui.ide.application.source,org.eclipse.ui.ide.source,org.eclipse.ui.intro,org.eclipse.ui.intro.source,org.eclipse.ui.intro.universal,org.eclipse.ui.intro.universal.source,org.eclipse.ui.navigator,org.eclipse.ui.navigator.resources,org.eclipse.ui.navigator.resources.source,org.eclipse.ui.navigator.source,org.eclipse.ui.net,org.eclipse.ui.net.source,org.eclipse.ui.presentations.r21,org.eclipse.ui.presentations.r21.source,org.eclipse.ui.source,org.eclipse.ui.views,org.eclipse.ui.views.log,org.eclipse.ui.views.log.source,org.eclipse.ui.views.properties.tabbed,org.eclipse.ui.views.properties.tabbed.source,org.eclipse.ui.views.source,org.eclipse.ui.win32,org.eclipse.ui.win32.source,org.eclipse.ui.workbench,org.eclipse.ui.workbench.compatibility,org.eclipse.ui.workbench.compatibility.source,org.eclipse.ui.workbench.source,org.eclipse.ui.workbench.texteditor,org.eclipse.ui.workbench.texteditor.source,org.eclipse.update.configurator,org.eclipse.update.configurator.source,org.eclipse.update.core,org.eclipse.update.core.source,org.eclipse.update.core.win32,org.eclipse.update.core.win32.source,org.eclipse.update.scheduler,org.eclipse.update.scheduler.source,org.eclipse.update.ui,org.eclipse.update.ui.source,org.eclipse.zest.core,org.eclipse.zest.layouts,org.eclipse.zest.source,org.junit,org.junit.source,org.junit4,org.junit4.source,org.mortbay.jetty,org.mortbay.jetty.source,org.mozilla.rhino,org.objectweb.asm,org.objectweb.asm.source,org.polarion.eclipse.team.svn.connector,org.polarion.eclipse.team.svn.connector.svnkit15,org.sat4j.core,org.sat4j.pb,org.w3c.css.sac,org.w3c.dom.smil,org.w3c.dom.svg"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.osee.framework.search.engine.servlet,org.eclipse.osee.framework.session.management.servlet,org.eclipse.osee.framework.database,org.eclipse.osee.framework.resource.provider.common,org.eclipse.nebula.widgets.xviewer,org.eclipse.osee.ats.feature.source,org.eclipse.osee.framework.branch.management,org.eclipse.osee.framework.jdbcodbc,org.eclipse.osee.framework.ui.service.control,org.eclipse.osee.framework.resource.locator.attribute.test,org.eclipse.osee.framework.ui.encrypter,org.eclipse.osee.ats,org.eclipse.osee.framework.derby,org.eclipse.osee.framework.updater,org.eclipse.osee.ats.test,org.eclipse.osee.framework.client.info.servlet,org.eclipse.osee.framework.resource.management.test,org.eclipse.osee.framework.ui.skynet.test,org.eclipse.osee.ats.config.demo,org.eclipse.osee.framework.ui.skynet,org.eclipse.osee.framework.skynet.core.test,org.eclipse.osee.framework.svn,org.eclipse.osee.framework.antsupport,org.eclipse.osee.framework.core,org.eclipse.osee.framework.feature.source,org.apache.commons.net,org.eclipse.osee.framework.db.connection,org.eclipse.osee.framework.messaging,org.eclipse.osee.framework.plugin.core,org.eclipse.osee.demo.db.connection,org.eclipse.osee.framework.server.lookup.servlet,org.eclipse.osee.framework.postgresql,org.eclipse.osee.framework.ui.swt,org.eclipse.osee.framework.ui.admin,org.eclipse.osee.framework.osgitest,org.eclipse.osee.framework.search.engine,org.eclipse.osee.framework.resource.management,org.eclipse.osee.framework.resource.management.servlet,org.eclipse.osee.framework.jini,org.eclipse.osee.framework.skynet.core,derby.driver,org.eclipse.osee.define.feature.source,org.eclipse.osee.framework.ui.skynet.zest,org.eclipse.osee.framework.core.server,org.eclipse.osee.framework.logging,org.eclipse.osee.framework.core.client,org.eclipse.osee.framework.templates,org.eclipse.osee.framework.resource.locator.attribute,org.eclipse.osee.support.test.util,org.eclipse.osee.framework.messaging.event.skynet,org.eclipse.osee.framework.server.admin,org.eclipse.osee.framework.ui.jdk,org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.ui.product,org.eclipse.osee.framework.branch.management.servlet,net.jini,org.eclipse.osee.define,javax.mail.glassfish,org.eclipse.osee.framework.search.engine.test,org.eclipse.osee.framework.oracle,org.postgresql.driver,jakarta.commons.net,org.eclipse.osee.framework.resource.management.servlet.test,org.eclipse.osee.framework.ui.security,oracle.driver,org.apache.commons.lang,org.eclipse.osee.framework.ui.plugin,org.eclipse.osee.framework.resource.provider.attribute,org.eclipse.osee.framework.session.management.servlet.test,org.eclipse.osee.framework.ui.feature.source,org.eclipse.osee.framework.artifact.servlet"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="false"/>
+<booleanAttribute key="useProduct" value="true"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.ats.config.demo/README.txt b/org.eclipse.osee.ats.config.demo/README.txt
new file mode 100644
index 00000000000..93e54f98917
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/README.txt
@@ -0,0 +1,54 @@
+The org.eclipse.osee.ats.config.demo plugin is a sample plugin that shows
+how to configure a company and it's teams to use ATS. In addition, it provides
+for the creation of Actions that can be used to test out ATS functionality,
+train users or for demo purposes where live program data shouldn't be used.
+
+ATS does not REQUIRE that a plugin (like this one) be created in order to
+configure and track items. ATS can be configured for new Teams, Actionable Items
+through the normal Artifact framework during runtime.
+
+However, in order to perform some of the advanced configuration of ATS such
+as placing conditions on state transactions, adding new fields and extending
+the ATS Navigator to add convenience items, a plugin must be created.
+
+Steps to create a database and load actions for training or demo use:
+1) Make sure this plugin is included in your workspace
+2) Create the database using the config runtime for the appropriate db
+3) Select the "OSEE Demo Database" selection during the database configuration
+4) Upon completion of the database creation, kickoff a runtime OSEE against that database
+5) XYZ Admin (and other XYZ convenience items should show in the ATS Navigator)
+
+OSEE can be used at this point to create new Actions against XYZ configured items.
+
+To create sample Actions written against XYZ configured items:
+1) Under XYZ Admin - Demo Data, select "Populate Demo Actions" and confirm
+
+This will create approx 38 sample Actions transitioned to different states and assigned
+to fictitious users.
+
+-----------------
+
+OSEE Demo Installer
+
+This installer will install the open source PostgreSQL (http://www.postgresql.org/) database, a demo version of the database and a copy of OSEE. If you already have PostgreSQL or OSEE installed, it will un-install and re-install fresh.
+
+- Ensure you have Java 1.5.0 installed (http://java.sun.com/j2se/1.5.0/)
+- Download the installer zip to your harddrive
+- Double-click to open and then double-click the self-extracting jar
+- After un-packed, an OSEE Installer window will appear.
+- Accept the installation directory or choose your own
+- If you already have PostGreSQL installed, it will be removed (NOTE: Windows will sometimes hang on the PostGreSQL un-install, simply kill and restart the installer and you should be ok
+- After a successful installation, you should have an OSEE icon on your desktop
+
+OSEE Demo Quickstart
+
+- During launch OSEE, you will want to sign in with the name "Terry Stevens" or "Jason Baker" and with "osee" entered in the password and domain. This will run your instance of OSEE as that person.
+
+- After launch of OSEE, you will be in the Resource perspective
+- Select Open Perspective and select Define
+- The Artifact Explorer shows the requirements that have been imported and stored
+
+- Select Open Perspective and select ATS
+- Select "My World" in the ATS Navigator. This shows all of the Actions (Change Requests) that are assigned to you
+
+A more detailed description of the Demo will be provided at http://www.eclipse.org/osee/ \ No newline at end of file
diff --git a/org.eclipse.osee.ats.config.demo/build.properties b/org.eclipse.osee.ats.config.demo/build.properties
new file mode 100644
index 00000000000..8fcddc4a951
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ support/,\
+ src/,\
+ images/
diff --git a/org.eclipse.osee.ats.config.demo/images/workflow.gif b/org.eclipse.osee.ats.config.demo/images/workflow.gif
new file mode 100644
index 00000000000..d4f14922643
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/images/workflow.gif
Binary files differ
diff --git a/org.eclipse.osee.ats.config.demo/plugin.xml b/org.eclipse.osee.ats.config.demo/plugin.xml
new file mode 100644
index 00000000000..c49006b291d
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/plugin.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.osee.framework.database.AddDbInitChoice">
+ <dbInitChoice
+ classname="org.eclipse.osee.ats.config.demo.config.AddDbInitDemoChoice">
+ </dbInitChoice>
+ </extension>
+ <extension
+ id="AtsConfigDemoDatabaseConfig"
+ name="AtsConfigDemoDatabaseConfig"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ DbInitRule="org.eclipse.osee.framework.database.NotOnProductionDbInitializationRule"
+ classname="org.eclipse.osee.ats.config.demo.config.DemoDatabaseConfig">
+ </DatabaseTask>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ats.AtsAIandTeamConfig">
+ <AtsAIandTeamConfig
+ vueFilename="support/Osee ATS Config Demo.vue">
+ </AtsAIandTeamConfig>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ats.AtsNavigateItem">
+ <AtsNavigateItem
+ classname="org.eclipse.osee.ats.config.demo.navigate.DemoNavigateViewItems">
+ </AtsNavigateItem>
+ </extension>
+ <extension
+ id="AddCommonBranchForAtsDemo"
+ name="AddCommonBranchForAtsDemo"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.ats.config.demo.config.AddCommonBranchForAtsDemo">
+ </DatabaseTask>
+ </extension>
+ <extension
+ id="OseeTypes_DemoCommon"
+ name="OseeTypes_DemoCommon"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_DemoCommon.xml">
+ </ExcelFile>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ats.AtsTeamWorkflow">
+ <AtsTeamWorkflow
+ classname="org.eclipse.osee.ats.config.demo.artifact.DemoTeamWorkflows">
+ </AtsTeamWorkflow>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ArtifactFactory">
+ <ArtifactFactory
+ classname="org.eclipse.osee.ats.config.demo.artifact.DemoArtifactFactory">
+ </ArtifactFactory>
+ </extension>
+ <extension
+ id="OseeTypes_DemoProgram"
+ name="OseeTypes_DemoProgram"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_DemoProgram.xml">
+ </ExcelFile>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider">
+ <ArtifactImageProvider
+ class="org.eclipse.osee.ats.config.demo.DemoArtifactImageProvider">
+ </ArtifactImageProvider>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/DemoArtifactImageProvider.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/DemoArtifactImageProvider.java
new file mode 100644
index 00000000000..79953f9fc11
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/DemoArtifactImageProvider.java
@@ -0,0 +1,27 @@
+/*
+ * Created on Jun 8, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ats.config.demo;
+
+import org.eclipse.osee.ats.config.demo.util.DemoImage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoArtifactImageProvider extends ArtifactImageProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider#init()
+ */
+ @Override
+ public void init() throws OseeCoreException {
+ ImageManager.registerBaseImage("Demo Code Team Workflow", DemoImage.DEMO_WORKFLOW);
+ ImageManager.registerBaseImage("Demo Req Team Workflow", DemoImage.DEMO_WORKFLOW);
+ ImageManager.registerBaseImage("Demo Test Team Workflow", DemoImage.DEMO_WORKFLOW);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoArtifactFactory.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoArtifactFactory.java
new file mode 100644
index 00000000000..70d0a19057c
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoArtifactFactory.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.ats.config.demo.artifact;
+
+import java.util.Arrays;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * Provides the factory for the loading of the XYZ demo artifact types.
+ *
+ * @author Donald G. Dunne
+ */
+public class DemoArtifactFactory extends ArtifactFactory {
+ public DemoArtifactFactory() {
+ super(Arrays.asList(DemoCodeTeamWorkflowArtifact.ARTIFACT_NAME, DemoTestTeamWorkflowArtifact.ARTIFACT_NAME,
+ DemoReqTeamWorkflowArtifact.ARTIFACT_NAME));
+ }
+
+ @Override
+ public Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException {
+ if (artifactType.getName().equals(DemoCodeTeamWorkflowArtifact.ARTIFACT_NAME)) {
+ return new DemoCodeTeamWorkflowArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (artifactType.getName().equals(DemoTestTeamWorkflowArtifact.ARTIFACT_NAME)) {
+ return new DemoTestTeamWorkflowArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (artifactType.getName().equals(DemoReqTeamWorkflowArtifact.ARTIFACT_NAME)) {
+ return new DemoReqTeamWorkflowArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ throw new IllegalArgumentException("did not recognize the artifact type: " + artifactType.getName());
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoCodeTeamWorkflowArtifact.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoCodeTeamWorkflowArtifact.java
new file mode 100644
index 00000000000..4fe7b056ecc
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoCodeTeamWorkflowArtifact.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.ats.config.demo.artifact;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoCodeTeamWorkflowArtifact extends TeamWorkFlowArtifact {
+
+ public static String ARTIFACT_NAME = TestUtil.DEMO_CODE_TEAM_WORKFLOW_ARTIFACT;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public DemoCodeTeamWorkflowArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoReqTeamWorkflowArtifact.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoReqTeamWorkflowArtifact.java
new file mode 100644
index 00000000000..9b1e90cd151
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoReqTeamWorkflowArtifact.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.ats.config.demo.artifact;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoReqTeamWorkflowArtifact extends TeamWorkFlowArtifact {
+
+ public static String ARTIFACT_NAME = TestUtil.DEMO_REQ_TEAM_WORKFLOW_ARTIFACT;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public DemoReqTeamWorkflowArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTeamWorkflows.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTeamWorkflows.java
new file mode 100644
index 00000000000..7a154997f11
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTeamWorkflows.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.ats.config.demo.artifact;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.osee.ats.actions.wizard.IAtsTeamWorkflow;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoTeamWorkflows implements IAtsTeamWorkflow {
+
+ private static List<String> workflowArtifactNames;
+
+ /**
+ *
+ */
+ public DemoTeamWorkflows() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.actions.wizard.IAtsTeamWorflow#getTeamWorkflowArtifactName(org.eclipse.osee.ats.artifact.TeamDefinitionArtifact,
+ * java.util.Collection, java.util.Collection)
+ */
+ public String getTeamWorkflowArtifactName(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems) throws OseeCoreException {
+ if (teamDef.getDescriptiveName().contains("Code"))
+ return DemoCodeTeamWorkflowArtifact.ARTIFACT_NAME;
+ else if (teamDef.getDescriptiveName().contains("Test"))
+ return DemoTestTeamWorkflowArtifact.ARTIFACT_NAME;
+ else if (teamDef.getDescriptiveName().contains("Requirements"))
+ return DemoReqTeamWorkflowArtifact.ARTIFACT_NAME;
+ else if (teamDef.getDescriptiveName().contains("SAW HW")) return DemoReqTeamWorkflowArtifact.ARTIFACT_NAME;
+ return TeamWorkFlowArtifact.ARTIFACT_NAME;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.actions.wizard.IAtsTeamWorflow#isResponsibleForTeamWorkflowCreation(org.eclipse.osee.ats.artifact.TeamDefinitionArtifact,
+ * java.util.Collection, java.util.Collection)
+ */
+ public boolean isResponsibleForTeamWorkflowCreation(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems) throws OseeCoreException {
+ return (teamDef.getDescriptiveName().contains("SAW") || teamDef.getDescriptiveName().contains("CIS"));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.actions.wizard.IAtsTeamWorflow#teamWorkflowCreated(org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact)
+ */
+ public void teamWorkflowCreated(TeamWorkFlowArtifact teamArt) {
+ return;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.actions.wizard.IAtsTeamWorkflow#getTeamWorkflowArtifactNames()
+ */
+ public Collection<String> getTeamWorkflowArtifactNames() throws OseeCoreException {
+ if (workflowArtifactNames == null) {
+ if (TestUtil.isDemoDb()) {
+ workflowArtifactNames =
+ Arrays.asList(DemoCodeTeamWorkflowArtifact.ARTIFACT_NAME, DemoTestTeamWorkflowArtifact.ARTIFACT_NAME,
+ DemoReqTeamWorkflowArtifact.ARTIFACT_NAME);
+ } else
+ workflowArtifactNames = Collections.emptyList();
+ }
+ return workflowArtifactNames;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.actions.wizard.IAtsTeamWorkflow#teamWorkflowCreated(org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact, org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact)
+ */
+ @Override
+ public void teamWorkflowDuplicating(TeamWorkFlowArtifact teamArt, TeamWorkFlowArtifact dupTeamArt) throws OseeCoreException {
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTestTeamWorkflowArtifact.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTestTeamWorkflowArtifact.java
new file mode 100644
index 00000000000..9a2937f650d
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/artifact/DemoTestTeamWorkflowArtifact.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.ats.config.demo.artifact;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoTestTeamWorkflowArtifact extends TeamWorkFlowArtifact {
+
+ public static String ARTIFACT_NAME = TestUtil.DEMO_TEST_TEAM_WORKFLOW_ARTIFACT;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public DemoTestTeamWorkflowArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddCommonBranchForAtsDemo.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddCommonBranchForAtsDemo.java
new file mode 100644
index 00000000000..b0e21b35129
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddCommonBranchForAtsDemo.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.ats.config.demo.config;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.GlobalPreferences;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.dbinit.AddCommonBranch;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.XViewerCustomizationArtifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AddCommonBranchForAtsDemo extends AddCommonBranch {
+
+ @Override
+ public void run() throws OseeCoreException {
+ super.run();
+
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ // Create Default Users
+ for (SystemUser userEnum : SystemUser.values()) {
+ UserManager.createUser(userEnum, transaction);
+ }
+ // Create Global Preferences artifact that lives on common branch
+ GlobalPreferences.createGlobalPreferencesArtifact(transaction);
+
+ // Create XViewer Customization artifact that lives on common branch
+ XViewerCustomizationArtifact.getAtsCustArtifactOrCreate(true, transaction);
+ transaction.execute();
+ }
+
+ @Override
+ public List<String> getSkynetDbTypeExtensionIds() {
+ return Arrays.asList("org.eclipse.osee.framework.skynet.core.OseeTypes_CommonBranch",
+ "org.eclipse.osee.framework.skynet.core.OseeTypes_ProgramAndCommon", "org.eclipse.osee.ats.OseeTypes_ATS",
+ "org.eclipse.osee.ats.config.demo.OseeTypes_DemoCommon");
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddDbInitDemoChoice.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddDbInitDemoChoice.java
new file mode 100644
index 00000000000..3a99e58e5e5
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/AddDbInitDemoChoice.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.ats.config.demo.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.database.utility.GroupSelection;
+import org.eclipse.osee.framework.database.utility.IAddDbInitChoice;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AddDbInitDemoChoice implements IAddDbInitChoice {
+
+ /**
+ * Add the ability to wipe an OSEE database and configure it for the ATS Demo Configuration which will showcase ATS
+ * functionality.
+ */
+ public AddDbInitDemoChoice() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.database.utility.IAddDbInitChoice#addDbInitChoice()
+ */
+ public void addDbInitChoice(GroupSelection groupSelection) {
+ addDemoDbInitChoice(groupSelection);
+ }
+
+ public void addDemoDbInitChoice(GroupSelection groupSelection) {
+ List<String> dbInitTasks = new ArrayList<String>();
+
+ dbInitTasks.add("org.eclipse.osee.ats.config.demo.AddCommonBranchForAtsDemo");
+ dbInitTasks.add("org.eclipse.osee.framework.ui.skynet.SimpleTemplateProviderTask");
+ dbInitTasks.add("org.eclipse.osee.ats.AtsDatabaseConfig");
+ dbInitTasks.add("org.eclipse.osee.ats.config.demo.AtsConfigDemoDatabaseConfig");
+
+ groupSelection.addChoice("OSEE Demo Database", dbInitTasks, false);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDatabaseConfig.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDatabaseConfig.java
new file mode 100644
index 00000000000..bf3ab49cba5
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDatabaseConfig.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.ats.config.demo.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.ats.config.demo.util.DemoTeams;
+import org.eclipse.osee.ats.config.demo.util.DemoTeams.Team;
+import org.eclipse.osee.ats.config.demo.workflow.DemoCodeWorkFlowDefinition;
+import org.eclipse.osee.ats.config.demo.workflow.DemoReqWorkFlowDefinition;
+import org.eclipse.osee.ats.config.demo.workflow.DemoSWDesignWorkFlowDefinition;
+import org.eclipse.osee.ats.config.demo.workflow.DemoTestWorkFlowDefinition;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.workflow.vue.AtsDbConfig;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+import org.eclipse.osee.support.test.util.DemoCISBuilds;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.DemoSubsystems;
+import org.eclipse.osee.support.test.util.DemoUsers;
+
+/**
+ * Initialization class that will load configuration information for a sample DB.
+ *
+ * @author Donald G. Dunne
+ */
+public class DemoDatabaseConfig extends AtsDbConfig implements IDbInitializationTask {
+ public void run() throws OseeCoreException {
+
+ new DemoCodeWorkFlowDefinition().config(WriteType.New, null);
+ new DemoTestWorkFlowDefinition().config(WriteType.New, null);
+ new DemoReqWorkFlowDefinition().config(WriteType.New, null);
+ new DemoSWDesignWorkFlowDefinition().config(WriteType.New, null);
+
+ // Creates Actionable Items and Teams
+ // Teams are related to workflow by id specified in team object in VUE diagram
+ executeLoadAIsAndTeamsAction(OseeAtsConfigDemoActivator.PLUGIN_ID);
+
+ // Create initial version artifacts for Widget teams
+ createVersionArtifacts();
+
+ // Create SAW_Bld_1 branch
+ createProgramBranch(DemoSawBuilds.SAW_Bld_1.name());
+ populateProgramBranch(DemoSawBuilds.SAW_Bld_1.name());
+
+ // Create build one branch for CIS
+ createProgramBranch(DemoCISBuilds.CIS_Bld_1.name());
+ populateProgramBranch(DemoCISBuilds.CIS_Bld_1.name());
+
+ // Map team definitions versions to their related branches
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ mapTeamVersionToBranch(DemoTeams.getInstance().getTeamDef(Team.SAW_SW), DemoSawBuilds.SAW_Bld_1.name(),
+ DemoSawBuilds.SAW_Bld_1.name(), transaction);
+ mapTeamVersionToBranch(DemoTeams.getInstance().getTeamDef(Team.CIS_SW), DemoCISBuilds.CIS_Bld_1.name(),
+ DemoCISBuilds.CIS_Bld_1.name(), transaction);
+
+ // Set Joe Smith as Priviledged Member of SAW Test
+ Artifact teamDef =
+ ArtifactQuery.getArtifactFromTypeAndName(TeamDefinitionArtifact.ARTIFACT_NAME, "SAW Test",
+ AtsPlugin.getAtsBranch());
+ teamDef.addRelation(AtsRelation.PrivilegedMember_Member, DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith));
+ teamDef.persistAttributesAndRelations(transaction);
+
+ transaction.execute();
+
+ OseeInfo.putValue("osee.db.type", "demo");
+ }
+
+ public static void mapTeamVersionToBranch(TeamDefinitionArtifact teamDef, String versionName, String branchName, SkynetTransaction transaction) throws OseeCoreException {
+ Branch branch = BranchManager.getBranch(branchName);
+ VersionArtifact verArt = teamDef.getVersionArtifact(versionName, false);
+ verArt.setSoleAttributeValue(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(), branch.getBranchId());
+ verArt.persistAttributes(transaction);
+ }
+
+ private void populateProgramBranch(String branchName) throws OseeCoreException {
+
+ Branch programBranch = BranchManager.getKeyedBranch(branchName);
+ Artifact sawProduct =
+ ArtifactTypeManager.addArtifact(Requirements.COMPONENT, programBranch, "SAW Product Decomposition");
+
+ for (String subsystem : DemoSubsystems.getSubsystems()) {
+ sawProduct.addChild(ArtifactTypeManager.addArtifact(Requirements.COMPONENT, programBranch, subsystem));
+ }
+
+ Artifact programRoot = ArtifactQuery.getDefaultHierarchyRootArtifact(programBranch);
+ programRoot.addChild(sawProduct);
+
+ for (String name : new String[] {Requirements.SYSTEM_REQUIREMENTS, Requirements.SUBSYSTEM_REQUIREMENTS,
+ Requirements.SOFTWARE_REQUIREMENTS, Requirements.HARDWARE_REQUIREMENTS, "Verification Tests",
+ "Validation Tests", "Integration Tests"}) {
+ programRoot.addChild(ArtifactTypeManager.addArtifact("Folder", programBranch, name));
+ }
+
+ sawProduct.persistAttributesAndRelations();
+ programRoot.persistAttributesAndRelations();
+
+ }
+
+ private void createProgramBranch(String branchName) throws OseeCoreException {
+
+ List<String> skynetTypeImport = new ArrayList<String>();
+ skynetTypeImport.add("org.eclipse.osee.framework.skynet.core.OseeTypes_ProgramAndCommon");
+ skynetTypeImport.add("org.eclipse.osee.framework.skynet.core.OseeTypes_ProgramBranch");
+ skynetTypeImport.add("org.eclipse.osee.ats.config.demo.OseeTypes_DemoProgram");
+
+ BranchManager.createTopLevelBranch(branchName, branchName, skynetTypeImport, true);
+ }
+
+ private void createVersionArtifacts() throws OseeCoreException {
+
+ // Setup some sample builds for Widget A
+ for (String verName : new String[] {DemoSawBuilds.SAW_Bld_1.name(), DemoSawBuilds.SAW_Bld_2.name(),
+ DemoSawBuilds.SAW_Bld_3.name()}) {
+ VersionArtifact ver =
+ (VersionArtifact) ArtifactTypeManager.addArtifact(VersionArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), verName);
+ if (verName.contains("1")) {
+ ver.setReleased(true);
+ }
+ if (verName.contains("2")) {
+ ver.setSoleAttributeValue(ATSAttributes.NEXT_VERSION_ATTRIBUTE.getStoreName(), true);
+ ver.setSoleAttributeValue(ATSAttributes.ALLOW_COMMIT_BRANCH.getStoreName(), true);
+ ver.setSoleAttributeValue(ATSAttributes.ALLOW_CREATE_BRANCH.getStoreName(), true);
+ }
+ DemoTeams.getInstance().getTeamDef(Team.SAW_SW).addRelation(AtsRelation.TeamDefinitionToVersion_Version, ver);
+ ver.persistAttributesAndRelations();
+ }
+
+ // Setup some sample builds for Widget B
+ for (String verName : new String[] {DemoCISBuilds.CIS_Bld_1.name(), DemoCISBuilds.CIS_Bld_2.name(),
+ DemoCISBuilds.CIS_Bld_3.name()}) {
+ VersionArtifact ver =
+ (VersionArtifact) ArtifactTypeManager.addArtifact(VersionArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), verName);
+ if (verName.contains("1")) {
+ ver.setReleased(true);
+ }
+ if (verName.contains("2")) {
+ ver.setSoleAttributeValue(ATSAttributes.NEXT_VERSION_ATTRIBUTE.getStoreName(), true);
+ }
+ DemoTeams.getInstance().getTeamDef(Team.CIS_SW).addRelation(AtsRelation.TeamDefinitionToVersion_Version, ver);
+ ver.persistAttributesAndRelations();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbAIs.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbAIs.java
new file mode 100644
index 00000000000..9c2e01d027b
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbAIs.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.ats.config.demo.config;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoDbAIs {
+ Computers,
+ Network,
+ Config_Mgmt,
+ Reviews,
+ Timesheet,
+ Website,
+ Reader,
+ CIS_Code,
+ CIS_Test,
+ CIS_Requirements,
+ CIS_SW_Design,
+ SAW_Code,
+ SAW_Test,
+ SAW_Requirements,
+ SAW_SW_Design,
+ Adapter;
+
+ public String getAIName() {
+ return name().replaceAll("_", " ");
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbActionData.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbActionData.java
new file mode 100644
index 00000000000..12b21482624
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbActionData.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.ats.config.demo.config;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.UserCommunity;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoDbActionData {
+ public final String postFixTitle;
+ public final PriorityType priority;
+ public final String[] actionableItems;
+ public final DefaultTeamState toState;
+ public final Integer[] userCommunityIndecies;
+ public String[] configuredUserCommunities;
+ public final String[] prefixTitles;
+ private final CreateReview[] createReviews;
+ public enum CreateReview {
+ Decision, Peer, None
+ };
+
+ public DemoDbActionData(String[] prefixTitles, String postFixTitle, PriorityType priority, String[] actionableItems, Integer[] userCommunityIndecies, DefaultTeamState toState, CreateReview... createReviews) {
+ this.prefixTitles = prefixTitles;
+ this.postFixTitle = postFixTitle;
+ this.priority = priority;
+ this.actionableItems = actionableItems;
+ this.userCommunityIndecies = userCommunityIndecies;
+ this.toState = toState;
+ this.createReviews = createReviews;
+ }
+
+ public Set<String> getUserCommunities() {
+ if (configuredUserCommunities == null) {
+ configuredUserCommunities =
+ UserCommunity.getInstance().getUserCommunityNames().toArray(
+ new String[UserCommunity.getInstance().getUserCommunityNames().size()]);
+ }
+ Set<String> userComms = new HashSet<String>();
+ for (Integer index : userCommunityIndecies)
+ userComms.add(configuredUserCommunities[index]);
+ return userComms;
+ }
+
+ public Collection<ActionableItemArtifact> getActionableItems() throws OseeCoreException {
+ Set<ActionableItemArtifact> aias = new HashSet<ActionableItemArtifact>();
+ for (String str : actionableItems) {
+ for (ActionableItemArtifact aia : ActionableItemArtifact.getActionableItems()) {
+ if (str.equals(aia.getDescriptiveName())) aias.add(aia);
+ }
+ }
+ return aias;
+ }
+
+ public static Set<DemoDbActionData> getReqSawActionsData() {
+ Set<DemoDbActionData> actionDatas = new HashSet<DemoDbActionData>();
+ actionDatas.add(new DemoDbActionData(new String[] {"SAW (committed) Reqt Changes for"}, "Diagram View",
+ PriorityType.Priority_1, new String[] {DemoDbAIs.SAW_Requirements.getAIName(),
+ DemoDbAIs.SAW_Code.getAIName(), DemoDbAIs.SAW_Test.getAIName()}, new Integer[] {1},
+ DefaultTeamState.Implement));
+ actionDatas.add(new DemoDbActionData(new String[] {"SAW (uncommitted) More Reqt Changes for"}, "Diagram View",
+ PriorityType.Priority_3, new String[] {DemoDbAIs.SAW_Code.getAIName(), DemoDbAIs.SAW_SW_Design.getAIName(),
+ DemoDbAIs.SAW_Requirements.getAIName(), DemoDbAIs.SAW_Test.getAIName()}, new Integer[] {1},
+ DefaultTeamState.Implement));
+ actionDatas.add(new DemoDbActionData(new String[] {"SAW (no-branch) Even More Requirement Changes for"},
+ "Diagram View", PriorityType.Priority_3, new String[] {DemoDbAIs.SAW_Code.getAIName(),
+ DemoDbAIs.SAW_SW_Design.getAIName(), DemoDbAIs.SAW_Requirements.getAIName(),
+ DemoDbAIs.SAW_Test.getAIName()}, new Integer[] {1}, DefaultTeamState.Implement));
+ actionDatas.add(new DemoDbActionData(new String[] {"SAW (uncommitted-conflicted) More Requirement Changes for"},
+ "Diagram View", PriorityType.Priority_3, new String[] {DemoDbAIs.SAW_Requirements.getAIName()},
+ new Integer[] {1}, DefaultTeamState.Implement));
+ return actionDatas;
+ }
+
+ public static Set<DemoDbActionData> getNonReqSawActionData() {
+ Set<DemoDbActionData> actionDatas = new HashSet<DemoDbActionData>();
+ actionDatas.add(new DemoDbActionData(new String[] {"Workaround for"}, "Graph View", PriorityType.Priority_1,
+ new String[] {DemoDbAIs.Adapter.getAIName()}, new Integer[] {1}, DefaultTeamState.Implement));
+ actionDatas.add(new DemoDbActionData(new String[] {"Working with"}, "Diagram Tree", PriorityType.Priority_3,
+ new String[] {DemoDbAIs.SAW_SW_Design.getAIName()}, new Integer[] {0, 2}, DefaultTeamState.Endorse));
+ return actionDatas;
+ }
+
+ public static Set<DemoDbActionData> getGenericActionData() {
+ Set<DemoDbActionData> actionDatas = new HashSet<DemoDbActionData>();
+ actionDatas.add(new DemoDbActionData(new String[] {"Problem with the", "Can't see the"}, "Graph View",
+ PriorityType.Priority_1, new String[] {DemoDbAIs.Adapter.getAIName()}, new Integer[] {1},
+ DefaultTeamState.Implement));
+ actionDatas.add(new DemoDbActionData(new String[] {"Problem in", "Can't load"}, "Diagram Tree",
+ PriorityType.Priority_3, new String[] {DemoDbAIs.CIS_Test.getAIName()}, new Integer[] {0, 2},
+ DefaultTeamState.Endorse));
+ actionDatas.add(new DemoDbActionData(new String[] {"Button W doesn't work on"}, "Situation Page",
+ PriorityType.Priority_3, new String[] {DemoDbAIs.CIS_Test.getAIName()}, new Integer[] {0, 2},
+ DefaultTeamState.Analyze));
+ actionDatas.add(new DemoDbActionData(new String[] {"Problem with the"}, "user window", PriorityType.Priority_4,
+ new String[] {DemoDbAIs.Timesheet.getAIName()}, new Integer[] {1}, DefaultTeamState.Implement));
+ actionDatas.add(new DemoDbActionData(new String[] {"Button S doesn't work on"}, "help", PriorityType.Priority_3,
+ new String[] {DemoDbAIs.Reader.getAIName()}, new Integer[] {1}, DefaultTeamState.Completed,
+ CreateReview.Decision));
+ return actionDatas;
+ }
+
+ /**
+ * @return the createReviews
+ */
+ public CreateReview[] getCreateReviews() {
+ return createReviews;
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbGroups.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbGroups.java
new file mode 100644
index 00000000000..c27febd1790
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbGroups.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.ats.config.demo.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.config.demo.artifact.DemoCodeTeamWorkflowArtifact;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoDbGroups {
+ public static String TEST_GROUP_NAME = "Test Group";
+
+ public static List<TeamWorkFlowArtifact> createGroups() throws Exception {
+
+ // Create group of all resulting objects
+ List<TeamWorkFlowArtifact> codeWorkflows = new ArrayList<TeamWorkFlowArtifact>();
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Create Groups and add objects");
+ Artifact groupArt = UniversalGroup.addGroup(TEST_GROUP_NAME, AtsPlugin.getAtsBranch());
+ for (DemoCodeTeamWorkflowArtifact codeArt : DemoDbUtil.getSampleCodeWorkflows()) {
+
+ // Add Action to Universal Group
+ groupArt.addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, codeArt.getParentActionArtifact());
+
+ // Add All Team Workflows to Universal Group
+ for (Artifact teamWorkflow : codeArt.getParentActionArtifact().getTeamWorkFlowArtifacts()) {
+ groupArt.addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, teamWorkflow);
+ }
+
+ codeArt.persistAttributesAndRelations();
+ }
+
+ // Add all Tasks to Group
+ for (Artifact task : ArtifactQuery.getArtifactsFromType(TaskArtifact.ARTIFACT_NAME, AtsPlugin.getAtsBranch())) {
+ groupArt.addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, task);
+ }
+ groupArt.persistRelations();
+
+ return codeWorkflows;
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbReviews.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbReviews.java
new file mode 100644
index 00000000000..245c96564d8
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbReviews.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.ats.config.demo.config;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.DecisionReviewWorkflowManager;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewWorkflowManager;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.config.demo.artifact.DemoTestTeamWorkflowArtifact;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Disposition;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.InjectionActivity;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.ats.util.widgets.role.UserRole.Role;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.support.test.util.DemoUsers;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoDbReviews {
+
+ public static void createReviews() throws Exception {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ createPeerToPeerReviews(transaction);
+ createDecisionReviews(transaction);
+ transaction.execute();
+ }
+
+ /**
+ * Create Decision Reviews<br>
+ * 1) ALREADY CREATED: Decision review created through the validation flag being set on a workflow<br>
+ * 2) Decision in ReWork state w Joe Smith assignee and 2 reviewers<br>
+ * 3) Decision in Complete state w Joe Smith assignee and completed<br>
+ * <br>
+ *
+ * @param transaction
+ * @param codeWorkflows
+ * @throws Exception
+ */
+ public static void createDecisionReviews(SkynetTransaction transaction) throws Exception {
+
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Create Decision reviews");
+ TeamWorkFlowArtifact firstTestArt = getSampleReviewTestWorkflows().get(0);
+ TeamWorkFlowArtifact secondTestArt = getSampleReviewTestWorkflows().get(1);
+
+ // Create a Decision review and transition to ReWork
+ DecisionReviewArtifact reviewArt =
+ firstTestArt.getSmaMgr().getReviewManager().createValidateReview(true, transaction);
+ Result result =
+ DecisionReviewWorkflowManager.transitionTo(reviewArt, DecisionReviewArtifact.DecisionReviewState.Followup,
+ UserManager.getUser(), false, transaction);
+ if (result.isFalse()) {
+ throw new IllegalStateException("Failed transitioning review to Followup: " + result.getText());
+ }
+ reviewArt.persistAttributesAndRelations(transaction);
+
+ // Create a Decision review and transition to Completed
+ reviewArt = secondTestArt.getSmaMgr().getReviewManager().createValidateReview(true, transaction);
+ DecisionReviewWorkflowManager.transitionTo(reviewArt, DecisionReviewArtifact.DecisionReviewState.Completed,
+ UserManager.getUser(), false, transaction);
+ if (result.isFalse()) {
+ throw new IllegalStateException("Failed transitioning review to Completed: " + result.getText());
+ }
+ reviewArt.persistAttributesAndRelations(transaction);
+
+ }
+
+ private static List<DemoTestTeamWorkflowArtifact> reviewTestArts;
+
+ private static List<DemoTestTeamWorkflowArtifact> getSampleReviewTestWorkflows() throws Exception {
+ if (reviewTestArts == null) {
+ reviewTestArts = new ArrayList<DemoTestTeamWorkflowArtifact>();
+ for (String actionName : new String[] {"Button W doesn't work on%", "%Diagram Tree"}) {
+ DemoTestTeamWorkflowArtifact testArt = null;
+ for (Artifact art : ArtifactQuery.getArtifactsFromName(actionName, AtsPlugin.getAtsBranch(), false)) {
+ if (art instanceof DemoTestTeamWorkflowArtifact) {
+ testArt = (DemoTestTeamWorkflowArtifact) art;
+ reviewTestArts.add(testArt);
+ }
+ }
+ }
+ }
+ return reviewTestArts;
+ }
+
+ /**
+ * Create<br>
+ * 1) PeerToPeer in Prepare state w Joe Smith assignee<br>
+ * 2) PeerToPeer in Review state w Joe Smith assignee and 2 reviewers<br>
+ * 3) PeerToPeer in Prepare state w Joe Smith assignee and completed<br>
+ * <br>
+ *
+ * @param transaction
+ * @param codeWorkflows
+ * @throws Exception
+ */
+ public static void createPeerToPeerReviews(SkynetTransaction transaction) throws Exception {
+
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Create Peer To Peer reviews");
+ TeamWorkFlowArtifact firstCodeArt = DemoDbUtil.getSampleCodeWorkflows().get(0);
+ TeamWorkFlowArtifact secondCodeArt = DemoDbUtil.getSampleCodeWorkflows().get(1);
+
+ // Create a PeerToPeer review and leave in Prepare state
+ PeerToPeerReviewArtifact reviewArt =
+ firstCodeArt.getSmaMgr().getReviewManager().createNewPeerToPeerReview(
+ "Peer Review first set of code changes",
+ firstCodeArt.getSmaMgr().getStateMgr().getCurrentStateName(), transaction);
+ reviewArt.persistAttributesAndRelations(transaction);
+
+ // Create a PeerToPeer review and transition to Review state
+ reviewArt =
+ firstCodeArt.getSmaMgr().getReviewManager().createNewPeerToPeerReview("Peer Review algorithm used in code",
+ firstCodeArt.getSmaMgr().getStateMgr().getCurrentStateName(), transaction);
+ List<UserRole> roles = new ArrayList<UserRole>();
+ roles.add(new UserRole(Role.Author, DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith)));
+ roles.add(new UserRole(Role.Reviewer, DemoDbUtil.getDemoUser(DemoUsers.Kay_Jones)));
+ roles.add(new UserRole(Role.Reviewer, DemoDbUtil.getDemoUser(DemoUsers.Alex_Kay), 2.0, true));
+ Result result =
+ PeerToPeerReviewWorkflowManager.transitionTo(reviewArt,
+ PeerToPeerReviewArtifact.PeerToPeerReviewState.Review, roles, null, UserManager.getUser(), false,
+ transaction);
+ if (result.isFalse()) {
+ throw new IllegalStateException("Failed transitioning review to Review: " + result.getText());
+ }
+ reviewArt.persistAttributesAndRelations(transaction);
+
+ // Create a PeerToPeer review and transition to Completed
+ reviewArt =
+ secondCodeArt.getSmaMgr().getReviewManager().createNewPeerToPeerReview("Review new logic",
+ firstCodeArt.getSmaMgr().getStateMgr().getCurrentStateName(),
+ DemoDbUtil.getDemoUser(DemoUsers.Kay_Jones), new Date(), transaction);
+ roles = new ArrayList<UserRole>();
+ roles.add(new UserRole(Role.Author, DemoDbUtil.getDemoUser(DemoUsers.Kay_Jones), 2.3, true));
+ roles.add(new UserRole(Role.Reviewer, DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith), 4.5, true));
+ roles.add(new UserRole(Role.Reviewer, DemoDbUtil.getDemoUser(DemoUsers.Alex_Kay), 2.0, true));
+
+ List<DefectItem> defects = new ArrayList<DefectItem>();
+ defects.add(new DefectItem(DemoDbUtil.getDemoUser(DemoUsers.Alex_Kay), Severity.Issue, Disposition.Accept,
+ InjectionActivity.Code, "Problem with logic", "Fixed", "Line 234", new Date()));
+ defects.add(new DefectItem(DemoDbUtil.getDemoUser(DemoUsers.Alex_Kay), Severity.Issue, Disposition.Accept,
+ InjectionActivity.Code, "Using getInteger instead", "Fixed", "MyWorld.java:Line 33", new Date()));
+ defects.add(new DefectItem(DemoDbUtil.getDemoUser(DemoUsers.Alex_Kay), Severity.Major, Disposition.Reject,
+ InjectionActivity.Code, "Spelling incorrect", "Is correct", "MyWorld.java:Line 234", new Date()));
+ defects.add(new DefectItem(DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith), Severity.Minor, Disposition.Reject,
+ InjectionActivity.Code, "Remove unused code", "", "Here.java:Line 234", new Date()));
+ defects.add(new DefectItem(DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith), Severity.Major, Disposition.Accept,
+ InjectionActivity.Code, "Negate logic", "Fixed", "There.java:Line 234", new Date()));
+ result =
+ PeerToPeerReviewWorkflowManager.transitionTo(reviewArt,
+ PeerToPeerReviewArtifact.PeerToPeerReviewState.Completed, roles, defects, UserManager.getUser(),
+ false, transaction);
+ reviewArt.persistAttributesAndRelations(transaction);
+ if (result.isFalse()) {
+ throw new IllegalStateException("Failed transitioning review to Completed: " + result.getText());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbTasks.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbTasks.java
new file mode 100644
index 00000000000..2c1b2b3bf11
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbTasks.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.ats.config.demo.config;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.support.test.util.DemoUsers;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoDbTasks {
+
+ public static void createTasks() throws Exception {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Create tasks off code workflows");
+ boolean firstTaskWorkflow = true;
+ for (TeamWorkFlowArtifact codeArt : DemoDbUtil.getSampleCodeWorkflows()) {
+ for (String title : getTaskTitles(firstTaskWorkflow)) {
+ TaskArtifact taskArt =
+ codeArt.getSmaMgr().getTaskMgr().createNewTask(
+ (firstTaskWorkflow ? Arrays.asList(DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith),
+ DemoDbUtil.getDemoUser(DemoUsers.Kay_Jones)) : Arrays.asList(DemoDbUtil.getDemoUser(DemoUsers.Joe_Smith))),
+ title);
+ taskArt.persistAttributesAndRelations();
+ }
+ firstTaskWorkflow = false;
+ }
+ }
+
+ /**
+ * Return different set of task titles for first and second workflow that make request
+ *
+ * @return
+ */
+ public static Collection<String> getTaskTitles(boolean firstTaskWorkflow) {
+ if (firstTaskWorkflow) {
+ firstTaskWorkflow = false;
+ return Arrays.asList("Look into Graph View.", "Redesign how view shows values.",
+ "Discuss new design with Senior Engineer", "Develop prototype", "Show prototype to management",
+ "Create development plan", "Create test plan", "Make changes");
+ } else
+ return Arrays.asList("Document how Graph View works", "Update help contents", "Review new documentation",
+ "Publish documentation to website", "Remove old viewer", "Deploy release");
+ }
+
+ public static int getNumTasks() {
+ return getTaskTitles(false).size() + getTaskTitles(true).size();
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbUtil.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbUtil.java
new file mode 100644
index 00000000000..eede6bec1e0
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/DemoDbUtil.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.ats.config.demo.config;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.config.demo.artifact.DemoCodeTeamWorkflowArtifact;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.support.test.util.DemoUsers;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoDbUtil {
+
+ public static String INTERFACE_INITIALIZATION = "Interface Initialization";
+ private static List<DemoCodeTeamWorkflowArtifact> codeArts;
+
+ public static List<DemoCodeTeamWorkflowArtifact> getSampleCodeWorkflows() throws Exception {
+ if (codeArts == null) {
+ codeArts = new ArrayList<DemoCodeTeamWorkflowArtifact>();
+ for (String actionName : new String[] {"SAW (committed) Reqt Changes for Diagram View",
+ "SAW (uncommitted) More Reqt Changes for Diagram View"}) {
+ DemoCodeTeamWorkflowArtifact codeArt = null;
+ for (Artifact art : ArtifactQuery.getArtifactsFromName(actionName, AtsPlugin.getAtsBranch(), false)) {
+ if (art instanceof DemoCodeTeamWorkflowArtifact) {
+ codeArt = (DemoCodeTeamWorkflowArtifact) art;
+ codeArts.add(codeArt);
+ }
+ }
+ }
+ }
+ return codeArts;
+ }
+
+ public static void sleep(long milliseconds) throws Exception {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Sleeping " + milliseconds);
+ Thread.sleep(milliseconds);
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Awake");
+ }
+
+ public static Result isDbPopulatedWithDemoData(Branch branch) throws Exception {
+ if (DemoDbUtil.getSoftwareRequirements(SoftwareRequirementStrs.Robot, branch).size() != 6) return new Result(
+ "Expected at least 6 Software Requirements with word \"Robot\". Database is not be populated with demo data.");
+ return Result.TrueResult;
+ }
+
+ public static Collection<Artifact> getSoftwareRequirements(SoftwareRequirementStrs str, Branch branch) throws Exception {
+ return getArtTypeRequirements(Requirements.SOFTWARE_REQUIREMENT, str.name(), branch);
+ }
+
+ public static Collection<Artifact> getArtTypeRequirements(String artifactType, String artifactNameStr, Branch branch) throws Exception {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ "Getting \"" + artifactNameStr + "\" requirement(s) from Branch " + branch.getBranchName());
+ Collection<Artifact> arts =
+ ArtifactQuery.getArtifactsFromTypeAndName(artifactType, "%" + artifactNameStr + "%", branch);
+
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Found " + arts.size() + " Artifacts");
+ return arts;
+ }
+ public static enum SoftwareRequirementStrs {
+ Robot, CISST, daVinci, Functional, Event, Haptic
+ };
+ public static String HAPTIC_CONSTRAINTS_REQ = "Haptic Constraints";
+
+ public static Artifact getInterfaceInitializationSoftwareRequirement(Branch branch) throws Exception {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ "Getting \"" + INTERFACE_INITIALIZATION + "\" requirement.");
+ return ArtifactQuery.getArtifactFromTypeAndName(Requirements.SOFTWARE_REQUIREMENT, INTERFACE_INITIALIZATION,
+ branch);
+ }
+
+ public static User getDemoUser(DemoUsers demoUser) throws OseeCoreException {
+ return UserManager.getUserByName(demoUser.getName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/PopulateDemoActions.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/PopulateDemoActions.java
new file mode 100644
index 00000000000..ebe143ff05e
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/config/PopulateDemoActions.java
@@ -0,0 +1,574 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.config.demo.config;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowManager;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.config.demo.artifact.DemoCodeTeamWorkflowArtifact;
+import org.eclipse.osee.ats.config.demo.config.DemoDbActionData.CreateReview;
+import org.eclipse.osee.ats.config.demo.config.DemoDbUtil.SoftwareRequirementStrs;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.ats.config.demo.util.DemoTeams;
+import org.eclipse.osee.ats.config.demo.util.DemoTeams.Team;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.Favorites;
+import org.eclipse.osee.ats.util.Subscribe;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor;
+import org.eclipse.osee.framework.ui.skynet.Import.ArtifactImportOperation;
+import org.eclipse.osee.framework.ui.skynet.Import.IArtifactImportResolver;
+import org.eclipse.osee.framework.ui.skynet.Import.NewArtifactImportResolver;
+import org.eclipse.osee.framework.ui.skynet.Import.WordOutlineExtractor;
+import org.eclipse.osee.framework.ui.skynet.handler.GeneralWordOutlineHandler;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.support.test.util.DemoCscis;
+import org.eclipse.osee.support.test.util.DemoProgramAttributes;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.DemoSubsystems;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Run from the ATS Navigator after the DB is configured for "OSEE Demo Database", this class will populate the database
+ * with sample actions written against XYZ configured teams
+ *
+ * @author Donald G. Dunne
+ */
+public class PopulateDemoActions extends XNavigateItemAction {
+
+ private final String[] TITLE_PREFIX =
+ new String[] {"Problem with the", "Can't see the", "Button A doesn't work on", "Add to the",
+ "Make new Button for ", "User can't load "};
+ private final ChangeType[] CHANGE_TYPE =
+ new ChangeType[] {ChangeType.Problem, ChangeType.Problem, ChangeType.Problem, ChangeType.Improvement,
+ ChangeType.Improvement, ChangeType.Support, ChangeType.Improvement, ChangeType.Support};
+
+ private static final String UPDATE_BRANCH_TYPE = "update osee_branch set branch_type = ? where branch_id = ?";
+
+ public PopulateDemoActions(XNavigateItem parent) {
+ super(parent, "Populate Demo Actions", FrameworkImage.ADMIN);
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ run(true);
+ }
+
+ public void run(boolean prompt) throws Exception {
+ AtsPlugin.setEmailEnabled(false);
+ if (AtsPlugin.isProductionDb()) throw new IllegalStateException(
+ "PopulateDemoActions should not be run on production DB");
+ if (SkynetDbInit.isDbInit() || (!SkynetDbInit.isDbInit() && (!prompt || (prompt && MessageDialog.openConfirm(
+ Display.getCurrent().getActiveShell(), getName(), getName()))))) {
+
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+
+ Branch saw1Branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name());
+
+ // Import all requirements on SAW_Bld_1 Branch
+ demoDbImportReqsTx();
+
+ DemoDbUtil.sleep(5000);
+
+ // Create traceability between System, Subsystem and Software requirements
+ SkynetTransaction demoDbTraceability = new SkynetTransaction(saw1Branch);
+ demoDbTraceabilityTx(demoDbTraceability, saw1Branch);
+ demoDbTraceability.execute();
+
+ DemoDbUtil.sleep(5000);
+
+ // Create SAW_Bld_2 Child Main Working Branch off SAW_Bld_1
+ createMainWorkingBranchTx();
+
+ // Create SAW_Bld_2 Actions
+ SkynetTransaction sawActionsTransaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Set<ActionArtifact> actionArts =
+ createActions(DemoDbActionData.getReqSawActionsData(), DemoSawBuilds.SAW_Bld_2.toString(), null,
+ sawActionsTransaction);
+ sawActionsTransaction.execute();
+ // Sleep to wait for the persist of the actions
+ DemoDbUtil.sleep(3000);
+
+ for (ActionArtifact actionArt : actionArts) {
+ if (actionArt.getDescriptiveName().contains("(committed)")) {
+ // Working Branch off SAW_Bld_2, Make Changes, Commit
+ makeAction1ReqChanges(actionArt);
+ } else if (actionArt.getDescriptiveName().contains("(uncommitted)")) {
+ // Working Branch off SAW_Bld_2, Make Changes, DON'T Commit
+ makeAction2ReqChanges(actionArt);
+ } else if (actionArt.getDescriptiveName().contains("(uncommitted-conflicted)")) {
+ // Working Branch off SAW_Bld_2, Make Conflicted Changes, DON'T Commit
+ makeAction3ReqChanges(actionArt);
+ }
+ }
+
+ // Create actions against non-requirement AIs and Teams
+ createNonReqChangeDemoActions();
+
+ // Mark all CIS Code "Team Workflows" as Favorites for "Joe Smith"
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Add Favorites");
+ for (Artifact art : ArtifactQuery.getArtifactsFromTypeAndName(DemoCodeTeamWorkflowArtifact.ARTIFACT_NAME,
+ "%Diagram View%", AtsPlugin.getAtsBranch())) {
+ new Favorites((StateMachineArtifact) art).toggleFavorite(false);
+ }
+
+ // Mark all Tools Team "Team Workflows" as Subscribed for "Joe Smith"
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Add Subscribed");
+ for (Artifact art : ArtifactQuery.getArtifactsFromTypeAndName(DemoCodeTeamWorkflowArtifact.ARTIFACT_NAME,
+ "%Even%", AtsPlugin.getAtsBranch())) {
+ new Subscribe((StateMachineArtifact) art).toggleSubscribe(false);
+ }
+
+ // Create some tasks off sample workflows
+ DemoDbTasks.createTasks();
+
+ // Create group of sample artifacts
+ DemoDbGroups.createGroups();
+
+ // Create and transition reviews off sample workflows
+ DemoDbReviews.createReviews();
+
+ TestUtil.severeLoggingEnd(monitorLog);
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Populate Complete");
+ }
+ }
+
+ private void createMainWorkingBranchTx() throws OseeCoreException {
+ try {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Creating SAW_Bld_2 branch off SAW_Bld_1");
+ // Create SAW_Bld_2 branch off SAW_Bld_1
+ Branch branch = createChildMainWorkingBranch(DemoSawBuilds.SAW_Bld_1.name(), DemoSawBuilds.SAW_Bld_2.name());
+ DemoDbUtil.sleep(5000);
+ // need to update the branch type;
+ ConnectionHandler.runPreparedUpdate(UPDATE_BRANCH_TYPE, new Object[] {BranchType.BASELINE.getValue(),
+ branch.getBranchId()});
+ BranchManager.refreshBranches();
+ // Map team definitions versions to their related branches
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ DemoDatabaseConfig.mapTeamVersionToBranch(DemoTeams.getInstance().getTeamDef(Team.SAW_SW),
+ DemoSawBuilds.SAW_Bld_2.name(), DemoSawBuilds.SAW_Bld_2.name(), transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static Branch createChildMainWorkingBranch(String parentBrachName, String childBranchName) throws Exception {
+ Branch parentBranch = BranchManager.getKeyedBranch(parentBrachName);
+
+ Branch childBranch =
+ BranchManager.createWorkingBranch(parentBranch, childBranchName, UserManager.getUser(SystemUser.OseeSystem));
+ BranchManager.setKeyedBranch(childBranchName, childBranch);
+ return childBranch;
+ }
+
+ private void makeAction1ReqChanges(ActionArtifact actionArt) throws Exception {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Making Action 1 Requirement Changes");
+ TeamWorkFlowArtifact reqTeam = null;
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ if (team.getTeamDefinition().getDescriptiveName().contains("Req")) reqTeam = team;
+ }
+
+ if (reqTeam == null) throw new IllegalArgumentException("Can't locate Req team.");
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Creating working branch");
+ Result result = reqTeam.getSmaMgr().getBranchMgr().createWorkingBranch(null, false);
+ if (result.isFalse()) throw new IllegalArgumentException(
+ (new StringBuilder("Error creating working branch: ")).append(result.getText()).toString());
+
+ DemoDbUtil.sleep(5000);
+
+ for (Artifact art : DemoDbUtil.getSoftwareRequirements(SoftwareRequirementStrs.Robot,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch())) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Modifying artifact => ")).append(art).toString());
+ art.setSoleAttributeValue(DemoProgramAttributes.CSCI.name(), DemoCscis.Navigation.name());
+ art.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "A");
+ art.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(), DemoSubsystems.Navigation.name());
+ Artifact navArt =
+ ArtifactQuery.getArtifactFromTypeAndName(Requirements.COMPONENT, DemoSubsystems.Navigation.name(),
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch());
+ art.addRelation(CoreRelationEnumeration.ALLOCATION__COMPONENT, navArt);
+ art.persistAttributesAndRelations();
+ }
+
+ for (Artifact art : DemoDbUtil.getSoftwareRequirements(SoftwareRequirementStrs.Event,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch())) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Modifying artifact => ")).append(art).toString());
+ art.setSoleAttributeValue(DemoProgramAttributes.CSCI.name(), DemoCscis.Interface.name());
+ art.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "D");
+ art.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(), DemoSubsystems.Communications.name());
+ Artifact robotArt =
+ ArtifactQuery.getArtifactFromTypeAndName(Requirements.COMPONENT, DemoSubsystems.Robot_API.name(),
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch());
+ art.addRelation(CoreRelationEnumeration.ALLOCATION__COMPONENT, robotArt);
+ art.persistAttributesAndRelations();
+ }
+
+ // Delete two artifacts
+ for (Artifact art : DemoDbUtil.getSoftwareRequirements(SoftwareRequirementStrs.daVinci,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch())) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Deleting artifact => ")).append(art).toString());
+ art.deleteAndPersist();
+ }
+
+ // Add three new artifacts
+ Artifact parentArt =
+ DemoDbUtil.getInterfaceInitializationSoftwareRequirement(reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch());
+ for (int x = 1; x < 4; x++) {
+ String name = "Robot Interface Init " + x;
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Adding artifact => " + name);
+ Artifact newArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, parentArt.getBranch(), name);
+ newArt.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "D");
+ newArt.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(), DemoSubsystems.Communications.name());
+ newArt.persistAttributesAndRelations();
+ parentArt.addChild(newArt);
+ parentArt.persistAttributesAndRelations();
+ }
+
+ DemoDbUtil.sleep(2000L);
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Committing branch");
+ reqTeam.getSmaMgr().getBranchMgr().commitWorkingBranch(false, true,
+ reqTeam.getSmaMgr().getTargetedForVersion().getParentBranch(), true);
+
+ DemoDbUtil.sleep(5000);
+
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Completing Action");
+ }
+
+ private void makeAction3ReqChanges(ActionArtifact actionArt) throws Exception {
+ TeamWorkFlowArtifact reqTeam = null;
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ if (team.getTeamDefinition().getDescriptiveName().contains("Req")) reqTeam = team;
+ }
+
+ if (reqTeam == null) throw new IllegalArgumentException("Can't locate Req team.");
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Creating working branch");
+ Result result = reqTeam.getSmaMgr().getBranchMgr().createWorkingBranch(null, false);
+ if (result.isFalse()) throw new IllegalArgumentException(
+ (new StringBuilder("Error creating working branch: ")).append(result.getText()).toString());
+
+ DemoDbUtil.sleep(5000);
+
+ Artifact branchArtifact =
+ DemoDbUtil.getArtTypeRequirements(Requirements.SOFTWARE_REQUIREMENT, DemoDbUtil.HAPTIC_CONSTRAINTS_REQ,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch()).iterator().next();
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Modifying branch artifact => ")).append(branchArtifact).toString());
+ branchArtifact.setSoleAttributeValue(DemoProgramAttributes.CSCI.name(), DemoCscis.Interface.name());
+ branchArtifact.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "D");
+ branchArtifact.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(), DemoSubsystems.Communications.name());
+ Artifact comArt =
+ ArtifactQuery.getArtifactFromTypeAndName(Requirements.COMPONENT, DemoSubsystems.Robot_API.name(),
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch());
+ branchArtifact.addRelation(CoreRelationEnumeration.ALLOCATION__COMPONENT, comArt);
+ branchArtifact.persistAttributesAndRelations();
+
+ Artifact parentArtifact =
+ DemoDbUtil.getArtTypeRequirements(Requirements.SOFTWARE_REQUIREMENT, DemoDbUtil.HAPTIC_CONSTRAINTS_REQ,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch()).iterator().next();
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Modifying parent artifact => ")).append(parentArtifact).toString());
+ parentArtifact.setSoleAttributeValue(DemoProgramAttributes.CSCI.name(), DemoCscis.Navigation.name());
+ parentArtifact.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "E");
+ parentArtifact.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(),
+ DemoSubsystems.Cognitive_Decision_Aiding.name());
+ parentArtifact.persistAttributesAndRelations();
+
+ }
+
+ private void makeAction2ReqChanges(ActionArtifact actionArt) throws Exception {
+ TeamWorkFlowArtifact reqTeam = null;
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ if (team.getTeamDefinition().getDescriptiveName().contains("Req")) reqTeam = team;
+ }
+
+ if (reqTeam == null) throw new IllegalArgumentException("Can't locate Req team.");
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Creating working branch");
+ Result result = reqTeam.getSmaMgr().getBranchMgr().createWorkingBranch(null, false);
+ if (result.isFalse()) throw new IllegalArgumentException(
+ (new StringBuilder("Error creating working branch: ")).append(result.getText()).toString());
+
+ DemoDbUtil.sleep(5000);
+
+ for (Artifact art : DemoDbUtil.getSoftwareRequirements(SoftwareRequirementStrs.Functional,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch())) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Modifying artifact => ")).append(art).toString());
+ art.setSoleAttributeValue(DemoProgramAttributes.CSCI.name(), DemoCscis.Interface.name());
+ art.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "D");
+ art.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(), DemoSubsystems.Communications.name());
+ Artifact comArt =
+ ArtifactQuery.getArtifactFromTypeAndName(Requirements.COMPONENT, DemoSubsystems.Robot_API.name(),
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch());
+
+ art.addRelation(CoreRelationEnumeration.ALLOCATION__COMPONENT, comArt);
+ art.persistAttributesAndRelations();
+ }
+
+ // Delete one artifacts
+ for (Artifact art : DemoDbUtil.getSoftwareRequirements(SoftwareRequirementStrs.CISST,
+ reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch())) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ (new StringBuilder("Deleting artifact => ")).append(art).toString());
+ art.deleteAndPersist();
+ }
+
+ // Add two new artifacts
+ Artifact parentArt =
+ DemoDbUtil.getInterfaceInitializationSoftwareRequirement(reqTeam.getSmaMgr().getBranchMgr().getWorkingBranch());
+ for (int x = 15; x < 17; x++) {
+ String name = "Claw Interface Init " + x;
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Adding artifact => " + name);
+ Artifact newArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, parentArt.getBranch(), name);
+ newArt.setSoleAttributeValue(DemoProgramAttributes.Safety_Criticality.toString(), "D");
+ newArt.setSoleAttributeValue(DemoProgramAttributes.Subsystem.name(), DemoSubsystems.Communications.name());
+ parentArt.addChild(newArt);
+
+ newArt.persistAttributesAndRelations();
+ }
+
+ }
+
+ private void createNonReqChangeDemoActions() throws Exception {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "createNonReqChangeDemoActions - SAW_Bld_3");
+ createActions(DemoDbActionData.getNonReqSawActionData(), DemoSawBuilds.SAW_Bld_3.toString(), null, transaction);
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "createNonReqChangeDemoActions - SAW_Bld_2");
+ createActions(DemoDbActionData.getNonReqSawActionData(), DemoSawBuilds.SAW_Bld_2.toString(), null, transaction);
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "createNonReqChangeDemoActions - SAW_Bld_1");
+ createActions(DemoDbActionData.getNonReqSawActionData(), DemoSawBuilds.SAW_Bld_1.toString(),
+ DefaultTeamState.Completed, transaction);
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "createNonReqChangeDemoActions - getGenericActionData");
+ createActions(DemoDbActionData.getGenericActionData(), null, null, transaction);
+ transaction.execute();
+ }
+
+ private Set<ActionArtifact> createActions(Set<DemoDbActionData> actionDatas, String versionStr, DefaultTeamState toStateOverride, SkynetTransaction transaction) throws Exception {
+ Set<ActionArtifact> actionArts = new HashSet<ActionArtifact>();
+ int currNum = 1;
+ for (DemoDbActionData aData : actionDatas) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO, "Creating " + currNum++ + "/" + actionDatas.size());
+ int x = 0;
+ for (String prefixTitle : aData.prefixTitles) {
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, prefixTitle + " " + aData.postFixTitle,
+ TITLE_PREFIX[x] + " " + aData.postFixTitle, CHANGE_TYPE[x], PriorityType.Priority_1,
+ aData.getUserCommunities(), false, null, aData.getActionableItems(), transaction);
+ actionArts.add(actionArt);
+ for (TeamWorkFlowArtifact teamWf : actionArt.getTeamWorkFlowArtifacts()) {
+ TeamWorkflowManager dtwm = new TeamWorkflowManager(teamWf);
+ // Add validation required flag if Decision review is required
+ if (aData.getCreateReviews().length > 0) {
+ for (CreateReview createReview : aData.getCreateReviews()) {
+ if (createReview == CreateReview.Decision) teamWf.setSoleAttributeValue(
+ ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), true);
+ }
+ }
+ // Transition to desired state
+ dtwm.transitionTo((toStateOverride != null ? toStateOverride : aData.toState), null, false, transaction);
+ teamWf.persistAttributesAndRelations(transaction);
+ if (versionStr != null && !versionStr.equals("")) {
+ VersionArtifact verArt =
+ (VersionArtifact) ArtifactQuery.getArtifactFromTypeAndName(VersionArtifact.ARTIFACT_NAME,
+ versionStr, AtsPlugin.getAtsBranch());
+ teamWf.addRelation(AtsRelation.TeamWorkflowTargetedForVersion_Version, verArt);
+ teamWf.persistAttributesAndRelations(transaction);
+ }
+ }
+ }
+ }
+ return actionArts;
+ }
+
+ private void demoDbImportReqsTx() throws OseeCoreException {
+ try {
+ importRequirements(DemoSawBuilds.SAW_Bld_1.name(), Requirements.SOFTWARE_REQUIREMENT + "s",
+ Requirements.SOFTWARE_REQUIREMENT, "support/SAW-SoftwareRequirements.xml");
+ importRequirements(DemoSawBuilds.SAW_Bld_1.name(), Requirements.SYSTEM_REQUIREMENT + "s",
+ Requirements.SYSTEM_REQUIREMENT, "support/SAW-SystemRequirements.xml");
+ importRequirements(DemoSawBuilds.SAW_Bld_1.name(), Requirements.SUBSYSTEM_REQUIREMENT + "s",
+ Requirements.SUBSYSTEM_REQUIREMENT, "support/SAW-SubsystemRequirements.xml");
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void importRequirements(String buildName, String rootArtifactName, String requirementArtifactName, String filename) throws Exception {
+
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.INFO,
+ "Importing \"" + rootArtifactName + "\" requirements on branch \"" + buildName + "\"");
+ Branch branch = BranchManager.getKeyedBranch(buildName);
+ Artifact systemReq = ArtifactQuery.getArtifactFromTypeAndName("Folder", rootArtifactName, branch);
+
+ File file = OseeAtsConfigDemoActivator.getInstance().getPluginFile(filename);
+ IArtifactImportResolver artifactResolver =
+ new NewArtifactImportResolver(ArtifactTypeManager.getType(requirementArtifactName),
+ ArtifactTypeManager.getType("Heading"));
+ ArtifactExtractor extractor = new WordOutlineExtractor(0, new GeneralWordOutlineHandler());
+ new ArtifactImportOperation(file, systemReq, extractor, branch, artifactResolver).run(new NullProgressMonitor());
+
+ // Validate that something was imported
+ if (systemReq.getChildren().size() == 0) throw new IllegalStateException("Artifacts were not imported");
+
+ }
+
+ private void relate(IRelationEnumeration relationSide, Artifact artifact, Collection<Artifact> artifacts) throws OseeCoreException {
+ for (Artifact otherArtifact : artifacts) {
+ artifact.addRelation(relationSide, otherArtifact);
+ }
+ }
+
+ private void demoDbTraceabilityTx(SkynetTransaction transaction, Branch branch) throws OseeCoreException {
+ try {
+ Collection<Artifact> systemArts =
+ DemoDbUtil.getArtTypeRequirements(Requirements.SYSTEM_REQUIREMENT, "Robot", branch);
+
+ Collection<Artifact> component = DemoDbUtil.getArtTypeRequirements(Requirements.COMPONENT, "API", branch);
+ component.addAll(DemoDbUtil.getArtTypeRequirements(Requirements.COMPONENT, "Hardware", branch));
+ component.addAll(DemoDbUtil.getArtTypeRequirements(Requirements.COMPONENT, "Sensor", branch));
+
+ Collection<Artifact> subSystemArts =
+ DemoDbUtil.getArtTypeRequirements(Requirements.SUBSYSTEM_REQUIREMENT, "Robot", branch);
+ subSystemArts.addAll(DemoDbUtil.getArtTypeRequirements(Requirements.SUBSYSTEM_REQUIREMENT, "Video", branch));
+ subSystemArts.addAll(DemoDbUtil.getArtTypeRequirements(Requirements.SUBSYSTEM_REQUIREMENT, "Interface", branch));
+
+ Collection<Artifact> softArts =
+ DemoDbUtil.getArtTypeRequirements(Requirements.SOFTWARE_REQUIREMENT, "Robot", branch);
+ softArts.addAll(DemoDbUtil.getArtTypeRequirements(Requirements.SOFTWARE_REQUIREMENT, "Interface", branch));
+
+ // Relate System to SubSystem to Software Requirements
+ for (Artifact systemArt : systemArts) {
+ relate(CoreRelationEnumeration.REQUIREMENT_TRACE__LOWER_LEVEL, systemArt, subSystemArts);
+ systemArt.persistRelations(transaction);
+
+ for (Artifact subSystemArt : subSystemArts) {
+ relate(CoreRelationEnumeration.REQUIREMENT_TRACE__LOWER_LEVEL, subSystemArt, softArts);
+ subSystemArt.persistRelations(transaction);
+ }
+ }
+
+ // Relate System, SubSystem and Software Requirements to Componets
+ for (Artifact art : systemArts) {
+ relate(CoreRelationEnumeration.ALLOCATION__COMPONENT, art, component);
+ art.persistRelations(transaction);
+ }
+ for (Artifact art : subSystemArts) {
+ relate(CoreRelationEnumeration.ALLOCATION__COMPONENT, art, component);
+ art.persistRelations(transaction);
+ }
+ for (Artifact art : softArts) {
+ relate(CoreRelationEnumeration.ALLOCATION__COMPONENT, art, component);
+ }
+
+ // Create Test Script Artifacts
+ Set<Artifact> verificationTests = new HashSet<Artifact>();
+ Artifact verificationHeader = ArtifactQuery.getArtifactFromTypeAndName("Folder", "Verification Tests", branch);
+ if (verificationHeader == null) throw new IllegalStateException("Could not find Verification Tests header");
+ for (String str : new String[] {"A", "B", "C"}) {
+ Artifact newArt =
+ ArtifactTypeManager.addArtifact(Requirements.TEST_CASE, verificationHeader.getBranch(),
+ "Verification Test " + str);
+ verificationTests.add(newArt);
+ verificationHeader.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, newArt);
+ newArt.persistAttributesAndRelations(transaction);
+ }
+ Artifact verificationTestsArray[] = verificationTests.toArray(new Artifact[verificationTests.size()]);
+
+ // Create Validation Test Procedure Artifacts
+ Set<Artifact> validationTests = new HashSet<Artifact>();
+ Artifact validationHeader = ArtifactQuery.getArtifactFromTypeAndName("Folder", "Validation Tests", branch);
+ if (validationHeader == null) throw new IllegalStateException("Could not find Validation Tests header");
+ for (String str : new String[] {"1", "2", "3"}) {
+ Artifact newArt =
+ ArtifactTypeManager.addArtifact(Requirements.TEST_PROCEDURE, validationHeader.getBranch(),
+ "Validation Test " + str);
+ validationTests.add(newArt);
+ validationHeader.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, newArt);
+ newArt.persistAttributesAndRelations(transaction);
+ }
+ Artifact validationTestsArray[] = validationTests.toArray(new Artifact[validationTests.size()]);
+
+ // Create Integration Test Procedure Artifacts
+ Set<Artifact> integrationTests = new HashSet<Artifact>();
+ Artifact integrationHeader = ArtifactQuery.getArtifactFromTypeAndName("Folder", "Integration Tests", branch);
+ if (integrationHeader == null) throw new IllegalStateException("Could not find integration Tests header");
+ for (String str : new String[] {"X", "Y", "Z"}) {
+ Artifact newArt =
+ ArtifactTypeManager.addArtifact(Requirements.TEST_PROCEDURE, integrationHeader.getBranch(),
+ "integration Test " + str);
+ integrationTests.add(newArt);
+ integrationHeader.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, newArt);
+ newArt.persistAttributesAndRelations(transaction);
+ }
+ Artifact integrationTestsArray[] = integrationTests.toArray(new Artifact[integrationTests.size()]);
+
+ // Relate Software Artifacts to Tests
+ Artifact softReqsArray[] = softArts.toArray(new Artifact[softArts.size()]);
+ softReqsArray[0].addRelation(CoreRelationEnumeration.Validation__Validator, verificationTestsArray[0]);
+ softReqsArray[0].addRelation(CoreRelationEnumeration.Validation__Validator, verificationTestsArray[1]);
+ softReqsArray[1].addRelation(CoreRelationEnumeration.Validation__Validator, verificationTestsArray[0]);
+ softReqsArray[1].addRelation(CoreRelationEnumeration.Validation__Validator, validationTestsArray[1]);
+ softReqsArray[2].addRelation(CoreRelationEnumeration.Validation__Validator, validationTestsArray[0]);
+ softReqsArray[2].addRelation(CoreRelationEnumeration.Validation__Validator, integrationTestsArray[1]);
+ softReqsArray[3].addRelation(CoreRelationEnumeration.Validation__Validator, integrationTestsArray[0]);
+ softReqsArray[4].addRelation(CoreRelationEnumeration.Validation__Validator, integrationTestsArray[2]);
+ softReqsArray[5].addRelation(CoreRelationEnumeration.Validation__Validator, validationTestsArray[2]);
+
+ for (Artifact artifact : softArts) {
+ artifact.persistAttributesAndRelations(transaction);
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/internal/OseeAtsConfigDemoActivator.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/internal/OseeAtsConfigDemoActivator.java
new file mode 100644
index 00000000000..44ad3b47af3
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/internal/OseeAtsConfigDemoActivator.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.ats.config.demo.internal;
+
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class OseeAtsConfigDemoActivator extends OseeActivator {
+ // The shared instance.
+ private static OseeAtsConfigDemoActivator plugin;
+ public static final String PLUGIN_ID = "org.eclipse.osee.ats.config.demo";
+
+ /**
+ * The constructor.
+ */
+ public OseeAtsConfigDemoActivator() {
+ super();
+ plugin = this;
+ }
+
+ public static OseeAtsConfigDemoActivator getInstance() {
+ return plugin;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.plugin.core.OseeActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/navigate/DemoNavigateViewItems.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/navigate/DemoNavigateViewItems.java
new file mode 100644
index 00000000000..fcb22723827
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/navigate/DemoNavigateViewItems.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.config.demo.navigate;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.ats.config.demo.config.PopulateDemoActions;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.ats.config.demo.util.DemoTeams;
+import org.eclipse.osee.ats.config.demo.util.DemoTeams.Team;
+import org.eclipse.osee.ats.health.ValidateAtsDatabase;
+import org.eclipse.osee.ats.navigate.CreateNewVersionItem;
+import org.eclipse.osee.ats.navigate.IAtsNavigateItem;
+import org.eclipse.osee.ats.navigate.ReleaseVersionItem;
+import org.eclipse.osee.ats.navigate.SearchNavigateItem;
+import org.eclipse.osee.ats.world.search.ArtifactTypeSearchItem;
+import org.eclipse.osee.ats.world.search.ArtifactTypesSearchItem;
+import org.eclipse.osee.ats.world.search.NextVersionSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem;
+import org.eclipse.osee.ats.world.search.VersionTargetedForTeamSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem.ReleasedOption;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.LoadView;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemFolder;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateUrlItem;
+
+/**
+ * Provides the ATS Navigator items for the sample XYZ company's teams
+ *
+ * @author Donald G. Dunne
+ */
+public class DemoNavigateViewItems implements IAtsNavigateItem {
+
+ public DemoNavigateViewItems() {
+ super();
+ }
+
+ public List<XNavigateItem> getNavigateItems() throws OseeCoreException {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+
+ if (AtsPlugin.areOSEEServicesAvailable().isFalse()) return items;
+
+ // If Demo Teams not configured, ignore these navigate items
+ try {
+ if (DemoTeams.getInstance().getTeamDef(Team.Process_Team) == null) return items;
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.WARNING, "Demo Teams Not Cofigured", ex);
+ return items;
+ }
+ // If Demo Teams not configured, ignore these navigate items
+ try {
+ if (DemoTeams.getInstance().getTeamDef(Team.Process_Team) == null) return items;
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.WARNING, "Demo Teams Not Cofigured", ex);
+ return items;
+ }
+ XNavigateItem jhuItem = new XNavigateItemFolder(null, "John Hopkins Univ (JHU)");
+ new XNavigateUrlItem(jhuItem, "Open JHU Website - Externally", "http://www.jhu.edu/", true);
+ new XNavigateUrlItem(jhuItem, "Open JHU Website - Internally", "http://www.jhu.edu/", false);
+
+ items.add(jhuItem);
+
+ for (Team team : Team.values()) {
+ try {
+ TeamDefinitionArtifact teamDef = DemoTeams.getInstance().getTeamDef(team);
+ XNavigateItem teamItems = new XNavigateItemFolder(jhuItem, "JHU " + team.name().replaceAll("_", " "));
+ new SearchNavigateItem(teamItems, new TeamWorldSearchItem("Show Open " + teamDef + " Actions",
+ Arrays.asList(DemoTeams.getInstance().getTeamDef(team)), false, true, true, null, null,
+ ReleasedOption.Both));
+ new SearchNavigateItem(teamItems, new TeamWorldSearchItem("Show Open " + teamDef + " Workflows",
+ Arrays.asList(DemoTeams.getInstance().getTeamDef(team)), false, false, true, null, null,
+ ReleasedOption.Both));
+ // Handle all children teams
+ for (TeamDefinitionArtifact childTeamDef : Artifacts.getChildrenOfTypeSet(
+ DemoTeams.getInstance().getTeamDef(team), TeamDefinitionArtifact.class, true)) {
+ new SearchNavigateItem(teamItems, new TeamWorldSearchItem("Show Open " + childTeamDef + " Workflows",
+ Arrays.asList(childTeamDef), false, false, false, null, null, ReleasedOption.Both));
+ }
+ if (teamDef.isTeamUsesVersions()) {
+ if (team.name().contains("SAW"))
+ new XNavigateUrlItem(teamItems, "Open SAW Website", "http://www.cisst.org/cisst/saw/", false);
+ else if (team.name().contains("CIS")) new XNavigateUrlItem(teamItems, "Open CIS Website",
+ "http://www.cisst.org/cisst/cis/", false);
+
+ new SearchNavigateItem(teamItems, new NextVersionSearchItem(teamDef, LoadView.WorldEditor));
+ new SearchNavigateItem(teamItems, new VersionTargetedForTeamSearchItem(teamDef, null, false,
+ LoadView.WorldEditor));
+ new SearchNavigateItem(teamItems, new TeamWorldSearchItem("Show Un-Released Team Workflows",
+ Arrays.asList(teamDef), true, false, true, null, null, ReleasedOption.UnReleased));
+ new ReleaseVersionItem(teamItems, teamDef);
+ new CreateNewVersionItem(teamItems, teamDef);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ XNavigateItem adminItems = new XNavigateItem(jhuItem, "JHU Admin", FrameworkImage.LASER);
+
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all Actions", "Actions"));
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all Decision Review", "Decision Review"));
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all PeerToPeer Review", "PeerToPeer Review"));
+ new SearchNavigateItem(adminItems, new ArtifactTypesSearchItem("Show all Team Workflows",
+ TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames()));
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all Tasks", "Task"));
+
+ XNavigateItem healthItems = new XNavigateItem(adminItems, "Health", FrameworkImage.LASER);
+ new ValidateAtsDatabase(healthItems);
+
+ XNavigateItem demoItems = new XNavigateItem(adminItems, "Demo Data", FrameworkImage.ADMIN);
+ new PopulateDemoActions(demoItems);
+
+ return items;
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/test/MasterTestSuite_DemoDbPopulate.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/test/MasterTestSuite_DemoDbPopulate.java
new file mode 100644
index 00000000000..bdc0b04a91e
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/test/MasterTestSuite_DemoDbPopulate.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.ats.config.demo.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.config.demo.config.PopulateDemoActions;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.junit.Before;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MasterTestSuite_DemoDbPopulate {
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Before
+ public void setUp() throws Exception {
+ try {
+ assertTrue("Demo Application Server must be running",
+ ClientSessionManager.getAuthenticationProtocols().contains("demo"));
+ // Confirm user is Joe Smith
+ assertTrue("User \"Joe Smith\" does not exist in DB. Run Demo DBInit prior to this test.",
+ UserManager.getUserByUserId("Joe Smith") != null);
+ // Confirm user is Joe Smith
+ assertTrue(
+ "Authenticated user should be \"Joe Smith\" and is not. Check that Demo Application Server is being run.",
+ UserManager.getUser().getUserId().equals("Joe Smith"));
+ } catch (OseeAuthenticationException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ fail("Can't authenticate, either Demo Application Server is not running or Demo DbInit has not been performed");
+ }
+ // This test should only be run on test db
+ assertFalse(AtsPlugin.isProductionDb());
+ System.out.println("Validating OSEE Application Server...");
+ if (!OseeLog.isStatusOk()) {
+ System.err.println(OseeLog.getStatusReport() + ". \nExiting.");
+ return;
+ }
+ }
+
+ /**
+ * Test method for {@link org.eclipse.osee.ats.config.demo.config.PopulateDemoActions#run()}.
+ */
+ @org.junit.Test
+ public void testPopulateDemoDb() throws Exception {
+ PopulateDemoActions populateDemoActions = new PopulateDemoActions(null);
+ populateDemoActions.run(false);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoImage.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoImage.java
new file mode 100644
index 00000000000..423992ccc9a
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoImage.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.ats.config.demo.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoImage implements OseeImage {
+ DEMO_WORKFLOW("workflow.gif");
+
+ private final String fileName;
+
+ private DemoImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#createImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(OseeAtsConfigDemoActivator.PLUGIN_ID, "images", fileName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageKey()
+ */
+ @Override
+ public String getImageKey() {
+ return OseeAtsConfigDemoActivator.PLUGIN_ID + "." + fileName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoTeams.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoTeams.java
new file mode 100644
index 00000000000..59dfd76d7bf
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoTeams.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.ats.config.demo.util;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.config.demo.internal.OseeAtsConfigDemoActivator;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * Convenience method for demo plugin to retrieve configured teams for use mostly in DemoNavigateViewItem.
+ *
+ * @author Donald G. Dunne
+ */
+public class DemoTeams {
+
+ public static enum Team {
+ Process_Team, Tools_Team, SAW_HW, SAW_SW, CIS_SW, Facilities_Team
+ };
+ private static DemoTeams instance = new DemoTeams();
+
+ private DemoTeams() {
+ }
+
+ public static DemoTeams getInstance() {
+ return instance;
+ }
+
+ public TeamDefinitionArtifact getTeamDef(Team team) throws OseeCoreException {
+ // Add check to keep exception from occurring for OSEE developers running against production
+ if (ClientSessionManager.isProductionDataStore()) return null;
+ try {
+ return (TeamDefinitionArtifact) ArtifactQuery.getArtifactFromTypeAndName(TeamDefinitionArtifact.ARTIFACT_NAME,
+ team.name().replaceAll("_", " "), AtsPlugin.getAtsBranch());
+ } catch (Exception ex) {
+ OseeLog.log(OseeAtsConfigDemoActivator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoWorkType.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoWorkType.java
new file mode 100644
index 00000000000..132576d4dbe
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/util/DemoWorkType.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.ats.config.demo.util;
+
+/**
+ * Declares the different work types for Widget_A and Widget_B
+ *
+ * @author Donald G. Dunne
+ */
+public enum DemoWorkType {
+ Code, Test, Requirements, SW_Design, All
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddDecisionReviewRule.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddDecisionReviewRule.java
new file mode 100644
index 00000000000..0b8353f815e
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddDecisionReviewRule.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.ats.config.demo.workflow;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule;
+import org.eclipse.osee.ats.workflow.item.StateEventType;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoAddDecisionReviewRule extends AtsAddDecisionReviewRule {
+
+ public static String ID = "atsAddDecisionReview.test.addDecisionReview";
+
+ public DemoAddDecisionReviewRule(String forState, ReviewBlockType reviewBlockType, StateEventType stateEventType) {
+ super(ID + "." + forState + "." + reviewBlockType.name() + "." + stateEventType,
+ ID + "." + forState + "." + reviewBlockType.name() + "." + stateEventType);
+ setDescription("This is a rule created to test the Review rules.");
+ setDecisionParameterValue(this, DecisionParameter.title, "Auto-created Decision Review from ruleId: " + getId());
+ setDecisionParameterValue(this, DecisionParameter.reviewBlockingType, reviewBlockType.name());
+ setDecisionParameterValue(this, DecisionParameter.forState, forState);
+ setDecisionParameterValue(this, DecisionParameter.forEvent, stateEventType.name());
+ try {
+ setDecisionParameterValue(this, DecisionParameter.assignees, "<99999997>");
+ setDecisionParameterValue(this, DecisionParameter.options, "Completed;Completed;");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddPeerToPeerReviewRule.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddPeerToPeerReviewRule.java
new file mode 100644
index 00000000000..6d9029e7211
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoAddPeerToPeerReviewRule.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.ats.config.demo.workflow;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule;
+import org.eclipse.osee.ats.workflow.item.StateEventType;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoAddPeerToPeerReviewRule extends AtsAddDecisionReviewRule {
+
+ public static String ID = "atsAddPeerToPeerReview.test.addPeerToPeerReview";
+
+ public DemoAddPeerToPeerReviewRule(String forState, ReviewBlockType reviewBlockType, StateEventType stateEventType) {
+ super(ID + "." + forState + "." + reviewBlockType.name() + "." + stateEventType,
+ ID + "." + forState + "." + reviewBlockType.name() + "." + stateEventType);
+ setDescription("This is a rule created to test the Review rules.");
+ setDecisionParameterValue(this, DecisionParameter.title, "Auto-created Decision Review from ruleId " + getId());
+ setDecisionParameterValue(this, DecisionParameter.reviewBlockingType, reviewBlockType.name());
+ setDecisionParameterValue(this, DecisionParameter.forState, forState);
+ setDecisionParameterValue(this, DecisionParameter.forEvent, stateEventType.name());
+ try {
+ setDecisionParameterValue(this, DecisionParameter.assignees, "<99999997>");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoCodeWorkFlowDefinition.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoCodeWorkFlowDefinition.java
new file mode 100644
index 00000000000..e877db23d2a
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoCodeWorkFlowDefinition.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.ats.config.demo.workflow;
+
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightDefaultWorkflowRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoCodeWorkFlowDefinition extends TeamWorkflowDefinition {
+
+ public static String ID = "demo.code";
+
+ public DemoCodeWorkFlowDefinition() {
+ super(ID, ID);
+ addWorkItem(AtsStatePercentCompleteWeightDefaultWorkflowRule.ID);
+ }
+
+ @Override
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData,
+ TeamWorkflowDefinition.getWorkPageDefinitionsForId(getId()));
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, new DemoCodeWorkFlowDefinition());
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoReqWorkFlowDefinition.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoReqWorkFlowDefinition.java
new file mode 100644
index 00000000000..8cd7c5f83d1
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoReqWorkFlowDefinition.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.ats.config.demo.workflow;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightDefaultWorkflowRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoReqWorkFlowDefinition extends TeamWorkflowDefinition {
+
+ public static String ID = "demo.req";
+
+ public DemoReqWorkFlowDefinition() {
+ super(ID, ID, TeamWorkflowDefinition.ID);
+ addWorkItem(AtsStatePercentCompleteWeightDefaultWorkflowRule.ID);
+ }
+
+ @Override
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData,
+ TeamWorkflowDefinition.getWorkPageDefinitionsForId(getId()));
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, new DemoReqWorkFlowDefinition());
+ AtsWorkDefinitions.relatePageToBranchCommitRules(ID + "." + DefaultTeamState.Implement.name());
+ }
+
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoSWDesignWorkFlowDefinition.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoSWDesignWorkFlowDefinition.java
new file mode 100644
index 00000000000..cab6b0c4a83
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoSWDesignWorkFlowDefinition.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.ats.config.demo.workflow;
+
+import java.util.Arrays;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightDefaultWorkflowRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.item.StateEventType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoSWDesignWorkFlowDefinition extends TeamWorkflowDefinition {
+
+ public static String ID = "demo.swdesign";
+
+ public DemoSWDesignWorkFlowDefinition() {
+ super(ID, ID, TeamWorkflowDefinition.ID);
+ addWorkItem(AtsStatePercentCompleteWeightDefaultWorkflowRule.ID);
+ }
+
+ @Override
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ // Create decision and peer rules
+ DemoAddDecisionReviewRule decisionTransitionToRule =
+ new DemoAddDecisionReviewRule(DefaultTeamState.Analyze.name(), ReviewBlockType.None,
+ StateEventType.TransitionTo);
+ DemoAddDecisionReviewRule decisionCreateBranchRule =
+ new DemoAddDecisionReviewRule(DefaultTeamState.Implement.name(), ReviewBlockType.None,
+ StateEventType.CreateBranch);
+ DemoAddPeerToPeerReviewRule peerTransitionToRule =
+ new DemoAddPeerToPeerReviewRule(DefaultTeamState.Authorize.name(), ReviewBlockType.None,
+ StateEventType.TransitionTo);
+ DemoAddPeerToPeerReviewRule peerCommitBranchRule =
+ new DemoAddPeerToPeerReviewRule(DefaultTeamState.Implement.name(), ReviewBlockType.None,
+ StateEventType.CommitBranch);
+ // Import decision and peer rules into database
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, null, Arrays.asList(decisionTransitionToRule,
+ decisionCreateBranchRule, peerTransitionToRule, peerCommitBranchRule));
+
+ // Add Normal SW_Design workflows
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData,
+ TeamWorkflowDefinition.getWorkPageDefinitionsForId(getId()));
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, new DemoSWDesignWorkFlowDefinition());
+ AtsWorkDefinitions.relatePageToBranchCommitRules(ID + "." + DefaultTeamState.Implement.name());
+
+ // Add Non-blocking createBranch decision review to Implement state
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(ID + "." + DefaultTeamState.Analyze.name(),
+ decisionTransitionToRule.getId());
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(ID + "." + DefaultTeamState.Implement.name(),
+ decisionCreateBranchRule.getId());
+
+ // Add Non-blocking commitBranch peerToPeer review to Implement state
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(ID + "." + DefaultTeamState.Authorize.name(),
+ peerTransitionToRule.getId());
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(ID + "." + DefaultTeamState.Implement.name(),
+ peerCommitBranchRule.getId());
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoTestWorkFlowDefinition.java b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoTestWorkFlowDefinition.java
new file mode 100644
index 00000000000..b826e0d38ef
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/src/org/eclipse/osee/ats/config/demo/workflow/DemoTestWorkFlowDefinition.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.ats.config.demo.workflow;
+
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightDefaultWorkflowRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoTestWorkFlowDefinition extends TeamWorkflowDefinition {
+
+ public static String ID = "demo.test";
+
+ public DemoTestWorkFlowDefinition() {
+ super(ID, ID, TeamWorkflowDefinition.ID);
+ addWorkItem(AtsStatePercentCompleteWeightDefaultWorkflowRule.ID);
+ }
+
+ @Override
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData,
+ TeamWorkflowDefinition.getWorkPageDefinitionsForId(getId()));
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, new DemoTestWorkFlowDefinition());
+ }
+}
diff --git a/org.eclipse.osee.ats.config.demo/support/DB Demo Config [localhost].launch b/org.eclipse.osee.ats.config.demo/support/DB Demo Config [localhost].launch
new file mode 100644
index 00000000000..3afc9349591
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/DB Demo Config [localhost].launch
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<stringAttribute key="application" value="org.eclipse.osee.framework.database.configClient"/>
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/DB Demo Config [postgresql localhost]"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace"/>
+<stringAttribute key="location1" value="runtime-workspace"/>
+<stringAttribute key="location2" value="/lba_ws/andrew.m.finkbeiner/workspaces/runtime-workspace"/>
+<stringAttribute key="location3" value="C:\UserData\runtime-workspace"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx768M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.application.server=http://localhost:8089"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.osee.framework.messaging.event.skynet.EventServiceProd"/>
+<booleanAttribute key="restart" value="false"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="false"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.ats.config.demo/support/DB Demo Config [microdoc].launch b/org.eclipse.osee.ats.config.demo/support/DB Demo Config [microdoc].launch
new file mode 100644
index 00000000000..3b2d5134738
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/DB Demo Config [microdoc].launch
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<stringAttribute key="application" value="org.eclipse.osee.framework.database.configClient"/>
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/DB Demo Config [postgresql microdoc]"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace"/>
+<stringAttribute key="location1" value="runtime-workspace"/>
+<stringAttribute key="location2" value="/lba_ws/andrew.m.finkbeiner/workspaces/runtime-workspace"/>
+<stringAttribute key="location3" value="C:\UserData\runtime-workspace"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx768M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.application.server=http://osee.microdoc.com:8089"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.osee.framework.messaging.event.skynet.EventServiceProd"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="false"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.ats.config.demo/support/OSEE Demo Product [microdoc].launch b/org.eclipse.osee.ats.config.demo/support/OSEE Demo Product [microdoc].launch
new file mode 100644
index 00000000000..501039a303e
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/OSEE Demo Product [microdoc].launch
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/OSEE Demo Product [postgresql microdoc]"/>
+<booleanAttribute key="default" value="false"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="false"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace-demo"/>
+<stringAttribute key="location1" value="/lba_ws/andrew.m.finkbeiner/runtime_workbench"/>
+<stringAttribute key="location2" value="/lba_ws/ken.j.aguilar/runtime_workbench"/>
+<stringAttribute key="location3" value="/lba_ws/ken.j.aguilar"/>
+<stringAttribute key="location4" value="C:\UserData\runtime-workspace"/>
+<stringAttribute key="location5" value="C:\UserData\runtime-workspace1"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.arbitration.server=http://osee.microdoc.com:8089/&#13;&#10;-Dosee.authentication.protocol=demo"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.osee.framework.ui.product.osee"/>
+<stringAttribute key="selected_target_plugins" value="org.eclipse.pde.build,org.eclipse.update.core,org.eclipse.core.filesystem,external.osee.xslt.transform.engine,javax.servlet,org.eclipse.pde.runtime,org.polarion.eclipse.team.svn.connector,org.eclipse.ui.workbench.texteditor,org.eclipse.help.base,org.eclipse.jdt.debug.ui,org.eclipse.equinox.common,org.eclipse.ant.core,org.eclipse.compare,org.eclipse.core.runtime.compatibility.registry,org.postgresql.driver,org.eclipse.core.jobs,org.eclipse.jdt.junit,org.eclipse.ui,javax.activation,org.eclipse.ui.views.properties.tabbed,org.eclipse.ltk.ui.refactoring,org.eclipse.platform,org.eclipse.equinox.http.jetty,org.eclipse.jdt.junit.runtime,org.eclipse.ui.ide,org.eclipse.ui.win32,org.eclipse.ui.console,org.eclipse.core.resources.compatibility,javax.mail.glassfish,org.eclipse.update.ui,org.eclipse.jdt.core.manipulation,org.eclipse.core.resources,org.apache.commons.logging,org.eclipse.equinox.preferences,org.eclipse.ui.views.log,org.eclipse.equinox.http.servlet,org.eclipse.core.runtime.compatibility.auth,org.eclipse.ui.navigator,org.eclipse.debug.ui,org.eclipse.ui.externaltools,org.eclipse.zest.core,org.apache.lucene.analysis,org.eclipse.pde.ui,org.eclipse.ui.workbench,org.eclipse.ui.intro.universal,org.eclipse.swt.win32.win32.x86,org.eclipse.ui.intro,org.eclipse.core.filesystem.win32.x86,org.eclipse.core.expressions,org.eclipse.draw2d,org.eclipse.equinox.security.win32.x86,org.eclipse.ui.navigator.resources,org.eclipse.equinox.registry,org.eclipse.ui.cheatsheets,org.eclipse.equinox.security,org.eclipse.zest.layouts,org.eclipse.update.core.win32,org.eclipse.ui.ide.application,org.eclipse.core.filebuffers,org.eclipse.gef,org.eclipse.team.svn.ui.nl1,org.eclipse.jdt.compiler.tool,org.eclipse.ltk.core.refactoring,org.eclipse.core.contenttype,org.eclipse.jface.databinding,org.eclipse.jface.text,org.eclipse.pde.core,com.jcraft.jsch,org.eclipse.nebula.widgets.calendarcombo,org.eclipse.jdt.debug,org.eclipse.core.net,org.eclipse.core.databinding,org.mortbay.jetty,org.eclipse.team.svn.ui,org.eclipse.osgi,org.eclipse.ant.ui,org.eclipse.search,org.eclipse.core.variables,org.eclipse.ui.forms,org.eclipse.text,org.eclipse.help,org.eclipse.ui.editors,org.eclipse.team.svn,org.eclipse.jface,org.eclipse.ui.views,org.eclipse.equinox.app,org.eclipse.jdt.ui,org.eclipse.core.net.win32.x86,net.jini,org.eclipse.core.runtime,org.eclipse.jdt.core,com.ibm.icu,org.eclipse.osgi.services,org.apache.lucene,org.eclipse.jdt.compiler.apt,org.eclipse.jdt.launching,org.junit,org.eclipse.update.configurator,org.eclipse.team.ui,org.eclipse.team.svn.core.nl1,org.apache.ant,org.eclipse.debug.core,org.eclipse.core.resources.win32.x86,org.eclipse.team.core,org.eclipse.swt,org.eclipse.team.svn.core,org.eclipse.core.commands"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.osee.framework.database,org.eclipse.osee.framework.ui.service.control,org.eclipse.osee.ats,org.eclipse.osee.ats.test,org.eclipse.osee.framework.ui.skynet.test,org.eclipse.osee.ats.config.demo,org.eclipse.osee.framework.ui.skynet,org.eclipse.osee.framework.svn,org.eclipse.osee.framework.db.connection,org.eclipse.osee.demo.db.connection,org.eclipse.osee.framework.plugin.core,org.eclipse.osee.framework.ui.swt,org.eclipse.osee.framework.postgresql,org.eclipse.osee.framework.ui.admin,org.eclipse.osee.framework.jini,org.eclipse.osee.framework.skynet.core,org.eclipse.osee.framework.ui.skynet.zest,org.eclipse.osee.framework.logging,org.eclipse.osee.framework.messaging.event.skynet,org.eclipse.osee.framework.ui.jdk,org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.ui.product,org.eclipse.osee.define,org.eclipse.osee.framework.ui.security,org.apache.commons.lang,org.eclipse.osee.framework.ui.plugin"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="true"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.ats.config.demo/support/Osee ATS Config Demo.vue b/org.eclipse.osee.ats.config.demo/support/Osee ATS Config Demo.vue
new file mode 100644
index 00000000000..dbffad58577
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/Osee ATS Config Demo.vue
@@ -0,0 +1,1531 @@
+<!-- Do Not Remove: VUE mapping @version(1.1) jar:file:/C:/Program%20Files/VUE/VUE.jar!/tufts/vue/resources/lw_mapping_1_1.xml -->
+<!-- Do Not Remove: Saved date Wed Jun 11 10:13:51 MST 2008 by b0727536 on platform Windows XP 5.1 in JVM 1.5.0_07-b03 -->
+<!-- Do Not Remove: Saving version @(#)VUE: built October 17 2006 at 0400 by vue on Linux 2.4.21-37.EL i386 JVM 1.5.0_06-b05 -->
+<?xml version="1.0" encoding="US-ASCII"?>
+<LW-MAP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="none" ID="0"
+ label="Osee ATS Config Demo.vue" x="-1334.7498" y="-359.0"
+ width="1967.59" height="689.9575" strokeWidth="0.0" autoSized="false">
+ <fillColor>#ffffff</fillColor>
+ <strokeColor>#404040</strokeColor>
+ <font>SansSerif-plain-14</font>
+ <nodeFilter/>
+ <child ID="411" label="SAW CSCI" x="-188.51242" y="-299.1973"
+ width="107.35" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>NotActionable</notes>
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="67" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="412" label="SAW Requirements" x="-195.81241"
+ y="-147.1973" width="138.15" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="123" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="413" label="SAW Code" x="-307.61246" y="-249.1973"
+ width="81.45" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="69" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="414" label="SAW Test" x="-2.6124573" y="-261.1973"
+ width="75.149994" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="63" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="415" x="-236.51596" y="-276.1973" width="71.30705"
+ height="27.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-165.20891" y="-276.1973"/>
+ <point2 x="-236.51596" y="-249.1973"/>
+ <ID1>411</ID1>
+ <ID2>413</ID2>
+ </child>
+ <child ID="416" x="-83.450554" y="-276.19727" width="80.8381"
+ height="18.090973" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-83.450554" y="-276.1973"/>
+ <point2 x="-2.6124573" y="-258.10632"/>
+ <ID1>411</ID1>
+ <ID2>414</ID2>
+ </child>
+ <child ID="417" x="-135.78741" y="-276.19727" width="10.0"
+ height="129.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-134.22458" y="-276.19727"/>
+ <point2 x="-127.350235" y="-147.19727"/>
+ <ID1>411</ID1>
+ <ID2>412</ID2>
+ </child>
+ <child ID="418" label="COMM" x="-287.26245" y="-155.1973"
+ width="54.149998" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="43" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="419" label="NAV" x="-256.26245" y="-197.1973"
+ width="37.35" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="27" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="420" label="MSM" x="-348.26245" y="-150.1973"
+ width="41.55" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="31" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="421" label="COMM" x="-208.18744" y="-80.197296"
+ width="54.149998" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="43" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="422" label="NAV" x="-159.18744" y="-36.197296"
+ width="37.35" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="27" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="423" label="MSM" x="-128.18744" y="-77.197296"
+ width="41.55" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="31" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="424" label="COMM" x="-70.962494" y="-193.1973"
+ width="54.149998" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="43" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="425" label="RunLists" x="9.037506" y="-148.1973"
+ width="66.75" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="55" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="426" label="NAV" x="4.037506" y="-195.1973" width="37.35"
+ height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="27" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="427" x="23.837523" y="-238.1973" width="10.0"
+ height="43.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="32.828064" y="-238.1973"/>
+ <point2 x="24.846981" y="-195.1973"/>
+ <ID1>414</ID1>
+ <ID2>426</ID2>
+ </child>
+ <child ID="428" x="33.687523" y="-238.19727" width="10.0"
+ height="90.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="35.720726" y="-238.19727"/>
+ <point2 x="41.654324" y="-148.19727"/>
+ <ID1>414</ID1>
+ <ID2>425</ID2>
+ </child>
+ <child ID="429" x="-30.55256" y="-238.1973" width="52.180176"
+ height="45.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="21.627615" y="-238.1973"/>
+ <point2 x="-30.55256" y="-193.1973"/>
+ <ID1>414</ID1>
+ <ID2>424</ID2>
+ </child>
+ <child ID="430" x="-123.56259" y="-124.197296" width="12.975334"
+ height="47.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-123.56259" y="-124.197296"/>
+ <point2 x="-110.58726" y="-77.197296"/>
+ <ID1>412</ID1>
+ <ID2>423</ID2>
+ </child>
+ <child ID="431" x="-139.0853" y="-124.197266" width="10.920731"
+ height="88.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-128.16457" y="-124.197266"/>
+ <point2 x="-139.0853" y="-36.197266"/>
+ <ID1>412</ID1>
+ <ID2>422</ID2>
+ </child>
+ <child ID="432" x="-171.77942" y="-124.197296" width="35.70897"
+ height="44.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-136.07045" y="-124.197296"/>
+ <point2 x="-171.77942" y="-80.197296"/>
+ <ID1>412</ID1>
+ <ID2>421</ID2>
+ </child>
+ <child ID="433" x="-320.44806" y="-226.1973" width="46.52118"
+ height="75.99997" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-273.92688" y="-226.1973"/>
+ <point2 x="-320.44806" y="-150.19733"/>
+ <ID1>413</ID1>
+ <ID2>420</ID2>
+ </child>
+ <child ID="434" x="-260.40765" y="-226.1973" width="16.340393"
+ height="29.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-260.40765" y="-226.1973"/>
+ <point2 x="-244.06726" y="-197.1973"/>
+ <ID1>413</ID1>
+ <ID2>419</ID2>
+ </child>
+ <child ID="435" x="-268.53745" y="-226.19751" width="10.0"
+ height="71.000244" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-266.06778" y="-226.19751"/>
+ <point2 x="-261.0071" y="-155.19727"/>
+ <ID1>413</ID1>
+ <ID2>418</ID2>
+ </child>
+ <child ID="436" label="SAW Code" x="-330.94748" y="0.9427185"
+ width="122.34" height="29.89" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>Lead:Joe Smith%nl;AtsTeamUsesVersions%nl;StaticId:saw.code%nl;WorkflowId:demo.code</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="69" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="437" label="SAW Requirements" x="-184.53745"
+ y="43.577698" width="182.38" height="33.229996"
+ strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>Lead:Joe Smith%nl;AtsTeamUsesVersions%nl;StaticId:saw.requirements%nl;WorkflowId:demo.req</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="123" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="438" label="SAW Test" x="-53.537445" y="-46.42227"
+ width="115.78" height="29.629997" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Lead:Kay Jones%nl;AtsTeamUsesVersions%nl;StaticId:saw.test%nl;WorkflowId:demo.test</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="63" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="439" x="-130.96346" y="-17.358871" width="124.34966"
+ height="161.56557" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-130.96346" y="144.2067"/>
+ <point2 x="-6.6137934" y="-17.358875"/>
+ <ID1>447</ID1>
+ <ID2>438</ID2>
+ </child>
+ <child ID="440" x="6.4169397" y="-238.19727" width="26.931517"
+ height="191.88167" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="6.4169407" y="-46.315613"/>
+ <point2 x="33.348457" y="-238.19728"/>
+ <ID1>438</ID1>
+ <ID2>414</ID2>
+ </child>
+ <child ID="441" x="-273.31287" y="-226.19531" width="10.0"
+ height="227.14844" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-269.60724" y="0.953125"/>
+ <point2 x="-267.01852" y="-226.19531"/>
+ <ID1>436</ID1>
+ <ID2>413</ID2>
+ </child>
+ <child ID="445" x="-134.7478" y="76.511154" width="33.33925"
+ height="67.49013" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-134.7478" y="144.00128"/>
+ <point2 x="-101.408554" y="76.511154"/>
+ <ID1>447</ID1>
+ <ID2>437</ID2>
+ </child>
+ <child ID="446" x="-256.91876" y="30.198456" width="102.52498"
+ height="114.10228" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-154.39378" y="144.30074"/>
+ <point2 x="-256.91876" y="30.198456"/>
+ <ID1>447</ID1>
+ <ID2>436</ID2>
+ </child>
+ <child ID="447" label="SAW SW" x="-196.42252" y="143.6177"
+ width="109.21999" height="29.370003" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Full Name:SAW Software%nl;Lead:Kay Jason%nl;Member:Maichael Johnson%nl;%nl;Member:Steven Kohn%nl;WorkflowId:osee.ats.teamWorkflow%nl;AtsTeamUsesVersions%nl;StaticId:saw.teamDefHoldingVersions%nl;NotActionable</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="57" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="448" label="ADT" x="89.93753" y="-166.1973"
+ width="38.399998" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="28" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="449" x="43.941605" y="-238.1973" width="56.216854"
+ height="72.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="43.94161" y="-238.1973"/>
+ <point2 x="100.15846" y="-166.1973"/>
+ <ID1>414</ID1>
+ <ID2>448</ID2>
+ </child>
+ <child ID="450" label="Test Page" x="-384.0625" y="-200.1973"
+ width="77.25" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="65" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="451" x="-327.00226" y="-226.1973" width="41.679596"
+ height="26.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-285.32266" y="-226.1973"/>
+ <point2 x="-327.00226" y="-200.1973"/>
+ <ID1>413</ID1>
+ <ID2>450</ID2>
+ </child>
+ <child ID="452" x="-131.35172" y="-335.5" width="11.0035095"
+ height="36.302704" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-120.348206" y="-335.5"/>
+ <point2 x="-131.35172" y="-299.1973"/>
+ <ID1>455</ID1>
+ <ID2>411</ID2>
+ </child>
+ <child ID="453" x="-124.77719" y="-124.197266" width="28.615334"
+ height="167.87848" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-96.161865" y="43.681213"/>
+ <point2 x="-124.7772" y="-124.197266"/>
+ <ID1>437</ID1>
+ <ID2>412</ID2>
+ </child>
+ <child ID="454" x="-139.67986" y="172.87189" width="19.069695"
+ height="130.27472" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-120.61016" y="303.1466"/>
+ <point2 x="-139.67986" y="172.87189"/>
+ <ID1>456</ID1>
+ <ID2>447</ID2>
+ </child>
+ <child ID="455" label="Actionable Items" x="-189.4375" y="-358.5"
+ width="145.15" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>NotActionable</notes>
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="103" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="456" label="Teams" x="-164.90997" y="303.02753"
+ width="92.57999" height="27.43" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>NotActionable</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="43" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="457" label="MSM" x="93.36252" y="-208.5" width="41.55"
+ height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="31" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="458" x="52.240723" y="-238.1973" width="44.618626"
+ height="29.697296" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="52.24072" y="-238.1973"/>
+ <point2 x="96.859344" y="-208.5"/>
+ <ID1>414</ID1>
+ <ID2>457</ID2>
+ </child>
+ <child ID="459" label="CIS CSCI" x="367.20007" y="-312.63025"
+ width="97.899994" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>NotActionable</notes>
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="58" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="460" label="CIS Requirements" x="249.90009"
+ y="-192.63025" width="128.7" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="114" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="461" label="CIS Code" x="180.10004" y="-233.63025"
+ width="72.0" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="60" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="462" label="CIS Test" x="406.10004" y="-228.63025"
+ width="65.7" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="54" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="463" x="245.22125" y="-289.63025" width="141.80762"
+ height="56.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="387.02887" y="-289.63025"/>
+ <point2 x="245.22125" y="-233.63025"/>
+ <ID1>459</ID1>
+ <ID2>461</ID2>
+ </child>
+ <child ID="464" x="419.2715" y="-289.63025" width="16.557129"
+ height="61.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="419.2715" y="-289.63025"/>
+ <point2 x="435.82864" y="-228.63025"/>
+ <ID1>459</ID1>
+ <ID2>462</ID2>
+ </child>
+ <child ID="465" x="324.0155" y="-289.63025" width="82.36917"
+ height="97.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="406.38467" y="-289.63025"/>
+ <point2 x="324.0155" y="-192.63025"/>
+ <ID1>459</ID1>
+ <ID2>460</ID2>
+ </child>
+ <child ID="484" x="429.67383" y="-205.62988" width="10.0"
+ height="208.18262" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="430.82306" y="2.5527344"/>
+ <point2 x="438.5246" y="-205.62988"/>
+ <ID1>499</ID1>
+ <ID2>462</ID2>
+ </child>
+ <child ID="485" x="209.66116" y="-210.62988" width="10.0"
+ height="120.53613" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="213.45288" y="-90.09375"/>
+ <point2 x="215.86946" y="-210.62988"/>
+ <ID1>497</ID1>
+ <ID2>461</ID2>
+ </child>
+ <child ID="493" x="-44.287506" y="-340.7544" width="411.48758"
+ height="35.41162" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-44.287506" y="-340.7544"/>
+ <point2 x="367.20007" y="-305.34277"/>
+ <ID1>455</ID1>
+ <ID2>459</ID2>
+ </child>
+ <child ID="494" x="310.1399" y="-169.63086" width="10.0"
+ height="123.16211" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="315.88965" y="-46.46875"/>
+ <point2 x="314.3901" y="-169.63086"/>
+ <ID1>498</ID1>
+ <ID2>460</ID2>
+ </child>
+ <child ID="497" label="CIS Code" x="157.1625" y="-90.110245"
+ width="112.0" height="29.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>Lead:Jason Michael%nl;Member:Jason Michael%nl;AtsTeamUsesVersions%nl;StaticId:cis.code%nl;WorkflowId:demo.code</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="60" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="498" label="CIS Requirements" x="229.57254"
+ y="-46.475266" width="173.04" height="33.339996"
+ strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>Lead:Joe Smith%nl;Lead:Joe Smith%nl;WorkflowId:demo.req%nl;AtsTeamUsesVersions%nl;StaticId:cis.requirements</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="114" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="499" label="CIS Test" x="377.5725" y="2.524765"
+ width="105.44" height="28.739998" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Lead:Kay Jones%nl;AtsTeamUsesVersions%nl;StaticId:cis.test%nl;WorkflowId:demo.test</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="54" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="500" x="321.96094" y="-13.363525" width="54.64737"
+ height="153.10773" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="376.6083" y="139.7442"/>
+ <point2 x="321.96094" y="-13.363525"/>
+ <ID1>503</ID1>
+ <ID2>498</ID2>
+ </child>
+ <child ID="501" x="223.41898" y="-61.646423" width="148.13765"
+ height="201.68442" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="371.5566" y="140.038"/>
+ <point2 x="223.41896" y="-61.646423"/>
+ <ID1>503</ID1>
+ <ID2>497</ID2>
+ </child>
+ <child ID="502" x="386.55457" y="30.988647" width="38.720093"
+ height="108.75488" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="386.55457" y="139.74353"/>
+ <point2 x="425.27466" y="30.988647"/>
+ <ID1>503</ID1>
+ <ID2>499</ID2>
+ </child>
+ <child ID="503" label="CIS SW" x="332.14752" y="139.45474"
+ width="98.87999" height="28.48" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Full Name:CIS Software%nl;Lead:Kay Jason%nl;Member:Maichael Johnson%nl;%nl;Member:Steven Kohn%nl;WorkflowId:osee.ats.teamWorkflow%nl;AtsTeamUsesVersions%nl;StaticId:cis.teamDefHoldingVersions%nl;NotActionable</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="48" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="504" x="-87.7357" y="164.25906" width="436.91336"
+ height="142.41641" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-87.735695" y="306.67548"/>
+ <point2 x="349.17767" y="164.25906"/>
+ <ID1>456</ID1>
+ <ID2>503</ID2>
+ </child>
+ <child ID="505" label="Tools Team" x="-651.8525" y="81.45474"
+ width="128.9" height="30.150002" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Full Name:Tools Team%nl;Lead:Jeffery Kay%nl;Member:Jeffery Kay%nl;Member:Roland Stevens%nl;WorkflowId:osee.ats.teamWorkflow</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="75" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="506" x="-558.9597" y="109.89084" width="416.08856"
+ height="195.45956" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-142.87114" y="305.3504"/>
+ <point2 x="-558.9597" y="109.89084"/>
+ <ID1>456</ID1>
+ <ID2>505</ID2>
+ </child>
+ <child ID="507" label="Tools" x="-648.1875" y="-272.63025"
+ width="73.75" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>NotActionable</notes>
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="35" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="508" x="-574.4375" y="-335.5" width="391.35632"
+ height="67.96576" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-183.08118" y="-335.5"/>
+ <point2 x="-574.4375" y="-267.53424"/>
+ <ID1>455</ID1>
+ <ID2>507</ID2>
+ </child>
+ <child ID="509" label="Timesheet" x="-620.5494" y="-131.86516"
+ width="78.299995" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="66" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="510" label="Reader" x="-604.5494" y="-197.86517"
+ width="58.35" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="47" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="511" label="Website" x="-707.5494" y="-138.86516"
+ width="62.55" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="51" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="512" x="-670.6895" y="-249.63025" width="53.792114"
+ height="110.76514" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-616.8974" y="-249.63025"/>
+ <point2 x="-670.6895" y="-138.86511"/>
+ <ID1>507</ID1>
+ <ID2>511</ID2>
+ </child>
+ <child ID="513" x="-605.78467" y="-249.63025" width="24.882507"
+ height="51.765137" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-605.78467" y="-249.63025"/>
+ <point2 x="-580.90216" y="-197.86511"/>
+ <ID1>507</ID1>
+ <ID2>510</ID2>
+ </child>
+ <child ID="514" x="-608.8687" y="-249.63037" width="25.025513"
+ height="117.76514" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-608.8687" y="-249.63037"/>
+ <point2 x="-583.8432" y="-131.86523"/>
+ <ID1>507</ID1>
+ <ID2>509</ID2>
+ </child>
+ <child ID="515" x="-610.5437" y="-249.62988" width="22.136658"
+ height="331.13184" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-588.40704" y="81.50195"/>
+ <point2 x="-610.5437" y="-249.62988"/>
+ <ID1>505</ID1>
+ <ID2>507</ID2>
+ </child>
+ <child ID="517" label="Results Reporter" x="-747.3494"
+ y="-199.86517" width="121.35" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="107" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="518" x="-674.76404" y="-249.63025" width="51.541138"
+ height="49.765076" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-623.2229" y="-249.63025"/>
+ <point2 x="-674.76404" y="-199.86517"/>
+ <ID1>507</ID1>
+ <ID2>517</ID2>
+ </child>
+ <child ID="519" label="Web Team" x="-766.3125" y="-2.205246"
+ width="122.34" height="29.89" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>Full Name:Company Website Team%nl;Lead:Karmen John%nl;Member:Jeffery Kay%nl;Member:Roland Stevens%nl;WorkflowId:osee.ats.simpleTeamWorkflow</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="69" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="521" x="-702.0941" y="-115.865234" width="23.450256"
+ height="113.8103" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-702.0941" y="-2.0549316"/>
+ <point2 x="-678.64386" y="-115.865234"/>
+ <ID1>519</ID1>
+ <ID2>511</ID2>
+ </child>
+ <child ID="522" x="-685.5033" y="26.716034" width="78.2359"
+ height="55.67679" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-607.2674" y="82.39282"/>
+ <point2 x="-685.5033" y="26.716034"/>
+ <ID1>505</ID1>
+ <ID2>519</ID2>
+ </child>
+ <child ID="523" label="SAW HW" x="-429.85248" y="91.45474"
+ width="109.21999" height="29.370003" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Full Name:SAW Hardware%nl;Lead:Jason Michael%nl;Member:Jason Michael%nl;AtsTeamUsesVersions%nl;WorkflowId:osee.ats.teamWorkflow</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="57" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="524" label="SAW HW" x="-485.1875" y="-250.63025"
+ width="68.85" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="57" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="525" label="Screen" x="-427.63745" y="-135.74515"
+ width="56.249996" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="45" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="526" label="Manual" x="-438.63745" y="-173.74515"
+ width="57.3" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="46" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="527" label="Adapter" x="-506.63745" y="-125.74515"
+ width="61.499996" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="50" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="528" x="-473.57382" y="-227.63037" width="20.497742"
+ height="101.885254" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-453.07608" y="-227.63037"/>
+ <point2 x="-473.57382" y="-125.74512"/>
+ <ID1>524</ID1>
+ <ID2>527</ID2>
+ </child>
+ <child ID="529" x="-444.66364" y="-227.63025" width="28.57727"
+ height="53.88507" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-444.66364" y="-227.63025"/>
+ <point2 x="-416.08636" y="-173.74518"/>
+ <ID1>524</ID1>
+ <ID2>526</ID2>
+ </child>
+ <child ID="530" x="-445.6324" y="-227.63025" width="40.989807"
+ height="91.88513" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-445.6324" y="-227.63025"/>
+ <point2 x="-404.64258" y="-135.74512"/>
+ <ID1>524</ID1>
+ <ID2>525</ID2>
+ </child>
+ <child ID="531" x="-448.24713" y="-227.63025" width="69.83032"
+ height="319.25732" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-378.4168" y="91.627075"/>
+ <point2 x="-448.24713" y="-227.63025"/>
+ <ID1>523</ID1>
+ <ID2>524</ID2>
+ </child>
+ <child ID="532" label="Case" x="-524.4375" y="-180.74515"
+ width="43.649998" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="33" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="533" x="-494.08026" y="-227.63025" width="34.785553"
+ height="46.88513" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-459.29474" y="-227.63025"/>
+ <point2 x="-494.0803" y="-180.74512"/>
+ <ID1>524</ID1>
+ <ID2>532</ID2>
+ </child>
+ <child ID="534" x="-333.4332" y="115.482574" width="149.8114"
+ height="33.477303" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-183.6218" y="148.95987"/>
+ <point2 x="-333.4332" y="115.48257"/>
+ <ID1>447</ID1>
+ <ID2>523</ID2>
+ </child>
+ <child ID="535" x="-416.3375" y="-279.44586" width="227.82507"
+ height="35.023468" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-188.51242" y="-279.44586"/>
+ <point2 x="-416.3375" y="-244.4224"/>
+ <ID1>411</ID1>
+ <ID2>524</ID2>
+ </child>
+ <child ID="536" label="Process Team" x="-927.83997" y="71.21979"
+ width="147.06" height="31.509998" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Full Name:Processes Team%nl;Lead:Alex Kay%nl;Member:Michael Alex%nl;Member:Janice Michael%nl;Member:Keith Johnson%nl;WorkflowId:osee.ats.teamWorkflow</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="91" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="537" label="Processes" x="-904.175" y="-282.8652"
+ width="78.299995" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="66" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="538" x="-825.875" y="-339.66315" width="636.4375"
+ height="64.34006" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-189.4375" y="-339.66312"/>
+ <point2 x="-825.875" y="-275.32306"/>
+ <ID1>455</ID1>
+ <ID2>537</ID2>
+ </child>
+ <child ID="539" label="Reviews" x="-836.53687" y="-131.1001"
+ width="63.6" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="52" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="540" label="Config Mgmt" x="-841.53687" y="-210.10013"
+ width="91.95" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="79" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="541" label="Coding Standards" x="-994.53687"
+ y="-146.1001" width="128.7" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="114" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="542" x="-924.70776" y="-259.86523" width="54.203552"
+ height="113.76514" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-870.50415" y="-259.86523"/>
+ <point2 x="-924.7077" y="-146.1001"/>
+ <ID1>537</ID1>
+ <ID2>541</ID2>
+ </child>
+ <child ID="543" x="-854.0468" y="-259.86523" width="47.506836"
+ height="49.765137" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-854.0468" y="-259.86523"/>
+ <point2 x="-806.54" y="-210.1001"/>
+ <ID1>537</ID1>
+ <ID2>540</ID2>
+ </child>
+ <child ID="544" x="-860.45667" y="-259.86523" width="51.15143"
+ height="128.76514" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-860.45667" y="-259.86523"/>
+ <point2 x="-809.30524" y="-131.1001"/>
+ <ID1>537</ID1>
+ <ID2>539</ID2>
+ </child>
+ <child ID="545" x="-864.7308" y="-259.86523" width="10.0"
+ height="331.10547" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-854.78046" y="71.240234"/>
+ <point2 x="-864.6811" y="-259.86523"/>
+ <ID1>536</ID1>
+ <ID2>537</ID2>
+ </child>
+ <child ID="546" label="New Employee Manual" x="-1024.3369"
+ y="-210.10013" width="158.09999" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="142" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="547" x="-932.60205" y="-259.86523" width="54.892395"
+ height="49.765137" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-877.7097" y="-259.86523"/>
+ <point2 x="-932.6021" y="-210.1001"/>
+ <ID1>537</ID1>
+ <ID2>546</ID2>
+ </child>
+ <child ID="551" x="-813.47705" y="99.72755" width="663.1499"
+ height="207.11229" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-150.32718" y="306.83984"/>
+ <point2 x="-813.4771" y="99.727554"/>
+ <ID1>456</ID1>
+ <ID2>536</ID2>
+ </child>
+ <child ID="552" label="Facilities Team" x="-1205.7528" y="93.64368"
+ width="151.1" height="31.349998" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Full Name:Facilities Team%nl;Lead:John Stevens%nl;Member:Jason Stevens%nl;Member:Michael John%nl;Member:Steven Michael%nl;WorkflowId:osee.ats.simpleTeamWorkflow%nl;Member:John Stevens%nl;</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="95" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="553" label="Facilities" x="-1214.0879" y="-281.44128"
+ width="66.75" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="55" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="554" x="-1147.3379" y="-341.7431" width="957.9004"
+ height="69.38434" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-189.4375" y="-341.7431"/>
+ <point2 x="-1147.3379" y="-272.35876"/>
+ <ID1>455</ID1>
+ <ID2>553</ID2>
+ </child>
+ <child ID="555" label="Computers" x="-1146.4497" y="-129.67621"
+ width="81.45" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="69" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="556" label="Vending Machines" x="-1188.4497"
+ y="-199.67624" width="130.79999" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="116" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="557" label="Network" x="-1270.4497" y="-137.67621"
+ width="61.499996" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="50" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="558" x="-1234.9812" y="-258.44165" width="49.549927"
+ height="120.76538" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1185.4313" y="-258.44165"/>
+ <point2 x="-1234.9812" y="-137.67627"/>
+ <ID1>553</ID1>
+ <ID2>557</ID2>
+ </child>
+ <child ID="559" x="-1172.6027" y="-258.44116" width="41.44287"
+ height="58.765015" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1172.6027" y="-258.44116"/>
+ <point2 x="-1131.1598" y="-199.67615"/>
+ <ID1>553</ID1>
+ <ID2>556</ID2>
+ </child>
+ <child ID="560" x="-1175.0308" y="-258.4414" width="63.62378"
+ height="128.76514" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1175.0308" y="-258.4414"/>
+ <point2 x="-1111.407" y="-129.67627"/>
+ <ID1>553</ID1>
+ <ID2>555</ID2>
+ </child>
+ <child ID="561" x="-1179.1814" y="-258.4414" width="46.902588"
+ height="352.17188" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1132.2788" y="93.73047"/>
+ <point2 x="-1179.1814" y="-258.4414"/>
+ <ID1>552</ID1>
+ <ID2>553</ID2>
+ </child>
+ <child ID="562" label="Break Room" x="-1334.2498" y="-208.67624"
+ width="90.899994" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="78" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="563" x="-1271.7175" y="-258.44128" width="73.92224"
+ height="49.765015" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1197.7952" y="-258.44128"/>
+ <point2 x="-1271.7174" y="-208.67627"/>
+ <ID1>553</ID1>
+ <ID2>562</ID2>
+ </child>
+ <child ID="564" x="-1076.4965" y="120.331085" width="919.8511"
+ height="188.61435" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-156.6454" y="308.94543"/>
+ <point2 x="-1076.4965" y="120.331085"/>
+ <ID1>456</ID1>
+ <ID2>552</ID2>
+ </child>
+ <child ID="565" label="IT Team" x="-1111.2998" y="-10.868973"
+ width="102.92" height="28.32" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <notes>Full Name:IT Team%nl;Lead:Kay Wheeler%nl;Member:Jason Stevens%nl;Member:Michael John%nl;Member:Steven Michael</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="52" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="566" label="Backups" x="-1191.4998" y="-90.69397"
+ width="65.7" height="23.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="54" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="567" x="-1179.3828" y="-258.4414" width="19.40271"
+ height="167.74707" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1179.3827" y="-258.4414"/>
+ <point2 x="-1159.98" y="-90.694336"/>
+ <ID1>553</ID1>
+ <ID2>566</ID2>
+ </child>
+ <child ID="568" x="-1101.3806" y="-106.67627" width="36.301758"
+ height="96.09839" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1065.0789" y="-10.577881"/>
+ <point2 x="-1101.3806" y="-106.67627"/>
+ <ID1>565</ID1>
+ <ID2>555</ID2>
+ </child>
+ <child ID="569" x="-1144.8738" y="-67.69403" width="69.12988"
+ height="57.708557" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1075.7439" y="-9.985474"/>
+ <point2 x="-1144.8738" y="-67.69403"/>
+ <ID1>565</ID1>
+ <ID2>566</ID2>
+ </child>
+ <child ID="570" x="-1223.7236" y="-114.67621" width="145.62158"
+ height="104.821655" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1078.102" y="-9.854553"/>
+ <point2 x="-1223.7236" y="-114.67621"/>
+ <ID1>565</ID1>
+ <ID2>557</ID2>
+ </child>
+ <child ID="571" x="-1120.0817" y="16.947632" width="51.178955"
+ height="77.119995" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-1120.0817" y="94.06763"/>
+ <point2 x="-1068.9027" y="16.947632"/>
+ <ID1>552</ID1>
+ <ID2>565</ID2>
+ </child>
+ <child ID="572" label="CIS SW Design" x="496.02527" y="-266.69397"
+ width="109.799995" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="96" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="573" label="SAW SW Design" x="37.97522" y="-302.69397"
+ width="119.24999" height="23.0" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <fillColor>#f2ae45</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="105" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="rectangle"/>
+ </child>
+ <child ID="576" x="449.89062" y="-289.63025" width="67.29419"
+ height="22.93628" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="449.89062" y="-289.63025"/>
+ <point2 x="517.1848" y="-266.69397"/>
+ <ID1>459</ID1>
+ <ID2>572</ID2>
+ </child>
+ <child ID="577" label="CIS SW Design" x="479.98022" y="-42.738968"
+ width="152.35999" height="31.559998" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Lead:Kay Jones%nl;AtsTeamUsesVersions%nl;StaticId:cis.sw_design%nl;WorkflowId:demo.swdesign</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="96" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="578" label="SAW SW Design" x="3.5202637" y="95.85103"
+ width="162.70001" height="32.45" strokeWidth="1.0"
+ autoSized="true" xsi:type="node">
+ <notes>Lead:Kay Jones%nl;AtsTeamUsesVersions%nl;StaticId:saw.sw_design%nl;WorkflowId:demo.swdesign</notes>
+ <fillColor>#a7c2e9</fillColor>
+ <strokeColor>#776d6d</strokeColor>
+ <font>Arial-plain-14</font>
+ <textBox width="105" height="17"/>
+ <nodeFilter/>
+ <shape xsi:type="ellipse"/>
+ </child>
+ <child ID="579" x="85.38179" y="-279.6941" width="11.855415"
+ height="375.56567" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="85.38179" y="95.87158"/>
+ <point2 x="97.237206" y="-279.6941"/>
+ <ID1>578</ID1>
+ <ID2>573</ID2>
+ </child>
+ <child ID="580" x="-81.16242" y="-294.40088" width="119.13764"
+ height="10.0" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-81.16242" y="-288.50473"/>
+ <point2 x="37.97522" y="-290.297"/>
+ <ID1>411</ID1>
+ <ID2>573</ID2>
+ </child>
+ <child ID="581" x="394.61615" y="-11.791931" width="146.8876"
+ height="152.00424" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="394.61612" y="140.21231"/>
+ <point2 x="541.5037" y="-11.791931"/>
+ <ID1>503</ID1>
+ <ID2>577</ID2>
+ </child>
+ <child ID="582" x="548.49384" y="-243.6914" width="10.0"
+ height="200.9668" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="555.7986" y="-42.72461"/>
+ <point2 x="551.1891" y="-243.6914"/>
+ <ID1>577</ID1>
+ <ID2>572</ID2>
+ </child>
+ <child ID="583" x="-98.46167" y="123.651245" width="126.57034"
+ height="25.811073" strokeWidth="1.0" autoSized="false"
+ controlCount="0" arrowState="2" xsi:type="link">
+ <strokeColor>#404040</strokeColor>
+ <textColor>#404040</textColor>
+ <font>Arial-plain-12</font>
+ <nodeFilter/>
+ <point1 x="-98.46167" y="149.46231"/>
+ <point2 x="28.10867" y="123.65124"/>
+ <ID1>447</ID1>
+ <ID2>578</ID2>
+ </child>
+ <userZoom>1.0</userZoom>
+ <userOrigin x="-1441.7498" y="-629.194"/>
+ <PathwayList currentPathway="0" revealerIndex="-1">
+ <pathway label="Untitled Pathway" x="0.0" y="0.0"
+ width="1.4E-45" height="1.4E-45" hidden="true"
+ strokeWidth="0.0" autoSized="false" currentIndex="-1"
+ locked="false" open="true">
+ <strokeColor>#993333</strokeColor>
+ <font>SansSerif-plain-14</font>
+ <nodeFilter/>
+ </pathway>
+ </PathwayList>
+ <date>2006-12-19</date>
+ <mapFilterModel/>
+</LW-MAP>
diff --git a/org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoCommon.xml b/org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoCommon.xml
new file mode 100644
index 00000000000..3f59adc4552
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoCommon.xml
@@ -0,0 +1,1269 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <LastAuthor>Donald G. Dunne</LastAuthor>
+ <Created>2006-03-10T14:37:59Z</Created>
+ <LastSaved>2007-01-13T19:14:53Z</LastSaved>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>11490</WindowHeight>
+ <WindowWidth>4875</WindowWidth>
+ <WindowTopX>11685</WindowTopX>
+ <WindowTopY>-15</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s20" ss:Name="Percent">
+ <NumberFormat ss:Format="0%"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s24">
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s25">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ </Style>
+ <Style ss:ID="s31">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="SkyNet_LbaBlk3Mp">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase"
+ ss:RefersTo="=SkyNet_LbaBlk3Mp!R203C1:R203C5" ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="11" ss:ExpandedRowCount="212" x:FullColumns="1"
+ x:FullRows="1">
+ <Column ss:AutoFitWidth="0" ss:Width="343.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="323.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="156.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="126"/>
+ <Column ss:AutoFitWidth="0" ss:Width="162.75"/>
+ <Column ss:Width="78"/>
+ <Column ss:Index="10" ss:AutoFitWidth="0" ss:Width="63"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Factory to Artifact Mapping</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.config.demo.artifact.DemoArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.config.demo.artifact.DemoArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.config.demo.artifact.DemoArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Attribute definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Attribute Data Provider</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Tip Text</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">User Visible</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Category</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;Category&gt;&lt;Enum&gt;Code Problem&lt;/Enum&gt;&lt;Enum&gt;Design/Implementation&lt;/Enum&gt;&lt;Enum&gt;Comment Change Only&lt;/Enum&gt;&lt;Enum&gt;Non-Mission&lt;/Enum&gt;&lt;Enum&gt;Workaround&lt;/Enum&gt;&lt;/Category&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Close Detection</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Code Change Req</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.CSCI</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s31"><Data ss:Type="String">&lt;CSCI&gt;&lt;Enum&gt;Navigation&lt;/Enum&gt;&lt;Enum&gt;Sights&lt;/Enum&gt;&lt;Enum&gt;Visual&lt;/Enum&gt;&lt;Enum&gt;Interface&lt;/Enum&gt;&lt;Enum&gt;Unspecified&lt;/Enum&gt;&lt;/CSCI&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Defect Code</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s24"><Data ss:Type="String">&lt;DefectCode&gt;&lt;Enum&gt;CL01 - Requirements Implemented Incorrectly&lt;/Enum&gt;&lt;Enum&gt;CL02 - Initialization Error&lt;/Enum&gt;&lt;Enum&gt;CL03 - Out of Range Error&lt;/Enum&gt;&lt;Enum&gt;CL04 - Data Conversion Error&lt;/Enum&gt;&lt;Enum&gt;CL05 - Buffer Sizing Error&lt;/Enum&gt;&lt;Enum&gt;CL06 - Timing Problem&lt;/Enum&gt;&lt;Enum&gt;CL07 - Interface Error&lt;/Enum&gt;&lt;Enum&gt;CL08 - Logic Control Error&lt;/Enum&gt;&lt;Enum&gt;CL09 - TYPO&lt;/Enum&gt;&lt;Enum&gt;CL10 - Multiple Code Logic Problems&lt;/Enum&gt;&lt;Enum&gt;CL99 - Other Code Logic Problem&lt;/Enum&gt;&lt;Enum&gt;NC01 - Requirement Error&lt;/Enum&gt;&lt;Enum&gt;NC02 - Test Script Error&lt;/Enum&gt;&lt;Enum&gt;NC03 - CTE Error&lt;/Enum&gt;&lt;Enum&gt;NC04 - Hardware Error&lt;/Enum&gt;&lt;Enum&gt;NC99 - Other NON-CODE Problem&lt;/Enum&gt;&lt;Enum&gt;SV01 - Coding Standard Violation&lt;/Enum&gt;&lt;Enum&gt;TE01 - Compiler/Linker/Assembler Problem&lt;/Enum&gt;&lt;Enum&gt;TE02 - APEX Problem&lt;/Enum&gt;&lt;Enum&gt;TE99 - Other Tool Error&lt;/Enum&gt;&lt;/DefectCode&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Detection</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;Detection&gt;&lt;Enum&gt;Test Script(s)&lt;/Enum&gt;&lt;Enum&gt;Inspection (Test)&lt;/Enum&gt;&lt;Enum&gt;Hot Bench&lt;/Enum&gt;&lt;Enum&gt;Aircraft&lt;/Enum&gt;&lt;Enum&gt;Peer Review&lt;/Enum&gt;&lt;Enum&gt;TRAX Issue&lt;/Enum&gt;&lt;Enum&gt;Other&lt;/Enum&gt;&lt;/Detection&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Include Build</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.LOC Affected</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Originating Build</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Req Doc</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;ReqDoc&gt;&lt;Enum&gt;Unknown&lt;/Enum&gt;&lt;Enum&gt;SubDD&lt;/Enum&gt;&lt;Enum&gt;CSID&lt;/Enum&gt;&lt;Enum&gt;SRS&lt;/Enum&gt;&lt;Enum&gt;Other&lt;/Enum&gt;&lt;/ReqDoc&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Subsystem</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Build</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Mode</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Notes</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Script</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Change Type</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Action</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Volume</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Date</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verifyer</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Note</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Detection</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Hold Start</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Hold End</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Mode</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verified Build</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Peer Review Reqd</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Peer Review Id</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Ref PCR</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.References</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Requirement Id</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup CPCR No</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup CSCI</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup CPCR Type</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup of CPCR no seq</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Librarian</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Promote Date</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Authorization Notes</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Rework Letter</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Problem No</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.DP Effectivity</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.SP Effectivity</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.WP Effectivity</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Map attribute to artifact type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Change Type</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Action</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Category</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Close Detection</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Code Change Req</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.CSCI</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Defect Code</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Detection</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Include Build</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.LOC Affected</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Originating Build</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Req Doc</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Subsystem</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Build</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Mode</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Notes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Test Script</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Volume</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Date</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verifyer</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Note</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Detection</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Hold Start</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Hold End</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verify Mode</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Verified Build</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Peer Review Reqd</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Peer Review Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Ref PCR</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.References</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Requirement Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup CPCR No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup CSCI</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup CPCR Type</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Dup of CPCR no seq</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Librarian</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Promote Date</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Authorization Notes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Rework Letter</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.Problem No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.DP Effectivity</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.SP Effectivity</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">demo.code.WP Effectivity</Data></Cell>
+ </Row>
+ <Row ss:Index="100">
+ <Cell><Data ss:Type="String"># Attributes common to Team Workflow - have to copy due to no inheritance</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Weekly Benefit</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Percent Rework</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Transaction Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Work Package</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category3</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.User Community</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Change Type</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Definition</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Priority</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Problem</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Proposed Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Validation Required</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Metrics from Tasks</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">#</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Weekly Benefit</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Percent Rework</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Transaction Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Work Package</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Category2</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Category3</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.User Community</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Change Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Priority</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Problem</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Proposed Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Validation Required</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Metrics from Tasks</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">#</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Weekly Benefit</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Percent Rework</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Transaction Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Work Package</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Category2</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Category3</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.User Community</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Change Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Priority</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Problem</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Proposed Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Validation Required</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Metrics from Tasks</Data></Cell>
+ </Row>
+ <Row ss:Index="194">
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Relation Type definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Short Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># NOTE: The way relations are added and because All Artifacts are of SuperType &quot;Artifact&quot;, line Defect,ArtifactToDef will set Defect's max with 0,0 and Artifact,ArtifactToDefect will add n,0 to all other artifact types</Data></Cell>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># Resolution: Always define specific artifact side first, then define the &quot;Artifact&quot; side second; eg: Route State, RouteFromState,1,0 THEN Artifact,RouteFromState,0,1</Data></Cell>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ <Cell ss:StyleID="s22"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String"># Valid artifact types per side of a relation</Data></Cell>
+ </Row>
+ <Row>
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># Although 1 Action can have N Product Impacts, this table describes it by the number of relation lines. There can only be one Product Impact on Side B, but side A can have UNLIMITED Actions on left</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># In otherwords: How many ActionProductImpact links can be attached to the same Product Impact = 1; How many ActionProductiMpact linkds can be attached to one ActionArtifact = n</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Side (unused)</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ActionToWorkflow</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ActionToWorkflow</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ActionToWorkflow</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowTargetedForVersion</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowTargetedForVersion</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowTargetedForVersion</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Code Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Test Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Demo Req Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Layout x:Orientation="Landscape"/>
+ </PageSetup>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>300</HorizontalResolution>
+ <VerticalResolution>300</VerticalResolution>
+ </Print>
+ <Zoom>75</Zoom>
+ <Selected/>
+ <LeftColumnVisible>1</LeftColumnVisible>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>11</ActiveRow>
+ <ActiveCol>6</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <AutoFilter x:Range="R203C1:R203C5"
+ xmlns="urn:schemas-microsoft-com:office:excel">
+ </AutoFilter>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Attribute Base Type</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoProgram.xml b/org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoProgram.xml
new file mode 100644
index 00000000000..ec3d7298579
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/OseeTypes_DemoProgram.xml
@@ -0,0 +1,1588 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Robert Fisher</Author>
+ <LastAuthor>b1565043</LastAuthor>
+ <LastPrinted>2006-03-15T03:49:16Z</LastPrinted>
+ <Created>2005-07-01T21:31:12Z</Created>
+ <LastSaved>2007-08-08T20:50:45Z</LastSaved>
+ <Company>The Boeing Company</Company>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>6990</WindowHeight>
+ <WindowWidth>20880</WindowWidth>
+ <WindowTopX>-15</WindowTopX>
+ <WindowTopY>-15</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s29">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s31">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s32">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s33">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s34">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s35">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s36">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s37">
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s38">
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s39">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s40">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s41">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s42">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="block III">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="='block III'!R97C1:R112C4"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="256" ss:ExpandedRowCount="114" x:FullColumns="1"
+ x:FullRows="1" ss:StyleID="s21" ss:DefaultRowHeight="12">
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="326.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="294"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="159.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="145.5"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="106.5"/>
+ <Column ss:StyleID="s21" ss:Width="71.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="289.5"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="105.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="108.75"/>
+ <Column ss:StyleID="s21" ss:Width="56.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Hardware Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Narrative</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Software Design</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Design</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Indirect Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">System Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Design</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Design</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Supporting Content</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">FileArtifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">System Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Procedure WML</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">MS Word</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Procedure</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">FileArtifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Case</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:Index="6" ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Attribute Data Provider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Tip Text</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">User Visible</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Crew Interface Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Timing Critical</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Obsolescence date</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s26"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Complexity Factor</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">20</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Weight</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Content URL</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Imported Paragraph Number</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">This is the corresponding section number from the outline of document from which this artifact was imported</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Legacy Id</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">SLATE unique identifier (caution: not guaranteed to be immutable)</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Level 2 IPT</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Level 2 Integrated Product Team</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Level 3 IPT</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Level 3 Integrated Product Team</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Support IPT</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Support Integrated Product Team</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">System Security Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Training Effectivity</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">CSCI</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Unspecified</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">&lt;CSCI&gt;&lt;Enum&gt;Navigation&lt;/Enum&gt;&lt;Enum&gt;Sights&lt;/Enum&gt;&lt;Enum&gt;Visual&lt;/Enum&gt;&lt;Enum&gt;Interface&lt;/Enum&gt;&lt;Enum&gt;Unspecified&lt;/Enum&gt;&lt;/CSCI&gt;</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Unspecified</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">&lt;Subsystems&gt;&lt;Enum&gt;Robot_Survivability_Equipment&lt;/Enum&gt;&lt;Enum&gt;Robot_Systems_Management&lt;/Enum&gt;&lt;Enum&gt;Chasis&lt;/Enum&gt;&lt;Enum&gt;Cognitive_Decision_Aiding&lt;/Enum&gt;&lt;Enum&gt;Communications&lt;/Enum&gt;&lt;Enum&gt;Controls_and_Displays&lt;/Enum&gt;&lt;Enum&gt;Data_Management&lt;/Enum&gt;&lt;Enum&gt;Drive_Train&lt;/Enum&gt;&lt;Enum&gt;Electrical&lt;/Enum&gt;&lt;Enum&gt;Controls&lt;/Enum&gt;&lt;Enum&gt;Hydraulics&lt;/Enum&gt;&lt;Enum&gt;Mission_Systems_Management&lt;/Enum&gt;&lt;Enum&gt;Navigation&lt;/Enum&gt;&lt;Enum&gt;Propulsion&lt;/Enum&gt;&lt;Enum&gt;Sights&lt;/Enum&gt;&lt;Enum&gt;Unknown&lt;/Enum&gt;&lt;Enum&gt;Unspecified&lt;/Enum&gt;&lt;/Subsystems&gt;</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Qualification Method</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Unspecified</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">&lt;Qual&gt;&lt;Enum&gt;Visual Demonstration&lt;/Enum&gt;&lt;Enum&gt;Test&lt;/Enum&gt;&lt;Enum&gt;Analysis&lt;/Enum&gt;&lt;Enum&gt;Inspection&lt;/Enum&gt;&lt;Enum&gt;Special Qualification&lt;/Enum&gt;&lt;Enum&gt;Legacy&lt;/Enum&gt;&lt;Enum&gt;Unspecified&lt;/Enum&gt;&lt;/Qual&gt;</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">a. Visual Demonstration: The operation of the system, or a part of the system, that relies on&#10;observable functional operation not requiring the use of instrumentation, special test&#10;equipment, or subsequent analysis.&#10;b. Test: The operation of the system, or a part of the system, using instrumentation or other&#10;special test equipment to collect data for later analysis.&#10;c. Analysis: The processing of accumulated data obtained from other qualification methods.&#10;Examples are reduction, interpolation, or extrapolation of test results.&#10;d. Inspection: The visual examination of system components, documentation, etc.&#10;e. Special qualification methods. Any special qualification methods for the system, such as&#10;special tools, techniques, procedures, facilities, acceptance limits, use of standard&#10;samples, preproduction or periodic production samples, pilot models, or pilot lots.&#10;f. Legacy: Requirement, design, or implementation has not changed since last qualification (use sparingly - Not to be used with functions implemented in Boeing Software).</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Execution Date</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Date script was executed</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Status</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">&lt;TestRunStatus&gt;&lt;Enum&gt;Pass&lt;/Enum&gt;&lt;Enum&gt;Fail&lt;/Enum&gt;&lt;Enum&gt;Aborted&lt;/Enum&gt;&lt;Enum&gt;Exception&lt;/Enum&gt;&lt;/TestRunStatus&gt;</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Test Status</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Pass</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Fail</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Version</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Version</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Repository Type</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Repository Type</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Modification Flag</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">File Modification Flag from Repository</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.CompressedContentAttribute</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Log</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Compressed Data</Data></Cell>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s33"><Data ss:Type="String">Safety Criticality</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">E</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">&lt;Criticality&gt;&lt;Enum&gt;A&lt;/Enum&gt;&lt;Enum&gt;B&lt;/Enum&gt;&lt;Enum&gt;C&lt;/Enum&gt;&lt;Enum&gt;D&lt;/Enum&gt;&lt;Enum&gt;E&lt;/Enum&gt;&lt;/Criticality&gt;</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Criticality Classification</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Span="1"/>
+ <Row ss:Index="46" ss:AutoFitHeight="0" ss:Height="11.25"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Attribute Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Heading</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Imported Paragraph Number</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Narrative</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Level 2 IPT</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Narrative</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Level 3 IPT</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Narrative</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Legacy Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Narrative</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Support IPT</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Imported Paragraph Number</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Qualification Method</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Word Template Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Page Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Safety Criticality</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Word Ole Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Imported Paragraph Number</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Design</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Word Template Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Safety Criticality</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Word Ole Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Crew Interface Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">System Security Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">CSCI</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Training Effectivity</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Indirect Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Crew Interface Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Indirect Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">System Security Requirement</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Indirect Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">CSCI</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Indirect Software Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Training Effectivity</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Subsystem Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Imported Paragraph Number</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Legacy Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">System Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Level 2 IPT</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">System Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Level 3 IPT</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">System Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Legacy Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">System Requirement</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Support IPT</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem Design</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Test Procedure WML</Data></Cell>
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Subsystem</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Side &quot;A/B&quot; Name should be a free text descriptive name for the user - links between sides and artifact types are performed in the table below.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Short Name</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Ordered</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Allocation</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">is allocated to</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">component</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">receives from</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Alloc</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Code-Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">code</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">satisfies</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">is satisfied by</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">C-Req</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Component-Requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">component</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">has</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">is a requirement of</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">CR</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Design</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">is designed by</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">design</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">designs</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Dsgn</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qualification</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">is qualified by</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">test</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">qualifies</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qual</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement Trace</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">higher-level requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">is addressed by</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">lower-level requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">traces to</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Trace</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Validation</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">is validated by</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">validator</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">validates</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Val</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:Span="1"/>
+ <Row ss:Index="94" ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s37"><Data ss:Type="String">#the first max values specified for an &lt;artifact type, relation type&gt; pair is used, so put the constraint for a concreate type before the constraint for a supertype</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;A&quot;, &quot;Side A Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;B&quot;, &quot;Side B Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Allocation</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Component</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Allocation</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Code Unit</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Code-Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Software Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Code-Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Indirect Software Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Code-Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Component-Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Component</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Component-Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Design</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Design</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Design</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qualification</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:Index="10" ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Test Procedure</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qualification</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:Index="8" ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">Test Case</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qualification</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:Index="6" ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement Trace</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:Index="6" ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ <Cell ss:StyleID="s39"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Requirement</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Validation</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Validation</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s42"><Data ss:Type="String">#need method to record whether allocation has been verified as complete and re-verify if changes potentially impact the allocation</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Layout x:Orientation="Landscape"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>15</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <AutoFilter x:Range="R97C1:R112C4"
+ xmlns="urn:schemas-microsoft-com:office:excel">
+ </AutoFilter>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Relation Type</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.ats.config.demo/support/SAW-SoftwareRequirements.xml b/org.eclipse.osee.ats.config.demo/support/SAW-SoftwareRequirements.xml
new file mode 100644
index 00000000000..b4c1fbfe729
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/SAW-SoftwareRequirements.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>1</o:Title><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>Ryan D. Brooks</o:LastAuthor><o:Revision>3</o:Revision><o:TotalTime>6</o:TotalTime><o:Created>2007-11-08T00:17:00Z</o:Created><o:LastSaved>2007-11-08T00:37:00Z</o:LastSaved><o:Pages>2</o:Pages><o:Words>525</o:Words><o:Characters>2993</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>24</o:Lines><o:Paragraphs>7</o:Paragraphs><o:CharactersWithSpaces>3511</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="APODLF+TimesNewRoman"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="27052676"/><w:plt w:val="Multilevel"/><w:tmpl w:val="53543520"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="0"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:kern w:val="32"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading8"/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/><w:i-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="006A3C0C"/><w:pPr><w:pStyle w:val="Heading9"/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style></w:styles><w:docPr><w:view w:val="normal"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="006A3C0C"/><wsp:rsid wsp:val="00032983"/><wsp:rsid wsp:val="00057F8D"/><wsp:rsid wsp:val="00074DC0"/><wsp:rsid wsp:val="000B3338"/><wsp:rsid wsp:val="000C033F"/><wsp:rsid wsp:val="000C1E6F"/><wsp:rsid wsp:val="000C2E64"/><wsp:rsid wsp:val="000D7B67"/><wsp:rsid wsp:val="00121DE1"/><wsp:rsid wsp:val="00140AA7"/><wsp:rsid wsp:val="001C0EA3"/><wsp:rsid wsp:val="001F44D7"/><wsp:rsid wsp:val="002417BF"/><wsp:rsid wsp:val="00246911"/><wsp:rsid wsp:val="0026273B"/><wsp:rsid wsp:val="0026750B"/><wsp:rsid wsp:val="002A4BDF"/><wsp:rsid wsp:val="002E251C"/><wsp:rsid wsp:val="00322364"/><wsp:rsid wsp:val="00333DE9"/><wsp:rsid wsp:val="00345668"/><wsp:rsid wsp:val="00381AD0"/><wsp:rsid wsp:val="00385A5D"/><wsp:rsid wsp:val="003A0B4B"/><wsp:rsid wsp:val="003E0161"/><wsp:rsid wsp:val="00402D48"/><wsp:rsid wsp:val="00416C9D"/><wsp:rsid wsp:val="00420233"/><wsp:rsid wsp:val="0061272D"/><wsp:rsid wsp:val="006141BE"/><wsp:rsid wsp:val="00633862"/><wsp:rsid wsp:val="0066564A"/><wsp:rsid wsp:val="00676F12"/><wsp:rsid wsp:val="006A3C0C"/><wsp:rsid wsp:val="00747618"/><wsp:rsid wsp:val="00763A67"/><wsp:rsid wsp:val="00784E1D"/><wsp:rsid wsp:val="00791E6A"/><wsp:rsid wsp:val="007A69F5"/><wsp:rsid wsp:val="007E6A54"/><wsp:rsid wsp:val="007F3A83"/><wsp:rsid wsp:val="0081123D"/><wsp:rsid wsp:val="00820625"/><wsp:rsid wsp:val="008376DC"/><wsp:rsid wsp:val="00850AC3"/><wsp:rsid wsp:val="00872E7A"/><wsp:rsid wsp:val="00872F8E"/><wsp:rsid wsp:val="008A35E9"/><wsp:rsid wsp:val="00932EF4"/><wsp:rsid wsp:val="00A4305E"/><wsp:rsid wsp:val="00A51DE8"/><wsp:rsid wsp:val="00A540B8"/><wsp:rsid wsp:val="00A569AD"/><wsp:rsid wsp:val="00AB1386"/><wsp:rsid wsp:val="00AD7FD0"/><wsp:rsid wsp:val="00AF2E8E"/><wsp:rsid wsp:val="00B21FF0"/><wsp:rsid wsp:val="00B327AE"/><wsp:rsid wsp:val="00B62463"/><wsp:rsid wsp:val="00B91691"/><wsp:rsid wsp:val="00B93554"/><wsp:rsid wsp:val="00BF020D"/><wsp:rsid wsp:val="00C04D90"/><wsp:rsid wsp:val="00C25C84"/><wsp:rsid wsp:val="00C54B54"/><wsp:rsid wsp:val="00CA52DF"/><wsp:rsid wsp:val="00CC1964"/><wsp:rsid wsp:val="00CD088E"/><wsp:rsid wsp:val="00CE3D5F"/><wsp:rsid wsp:val="00D17844"/><wsp:rsid wsp:val="00D2292E"/><wsp:rsid wsp:val="00D30EC1"/><wsp:rsid wsp:val="00D35D56"/><wsp:rsid wsp:val="00D72411"/><wsp:rsid wsp:val="00DB754D"/><wsp:rsid wsp:val="00DC28CF"/><wsp:rsid wsp:val="00E034A8"/><wsp:rsid wsp:val="00E54E52"/><wsp:rsid wsp:val="00E8683A"/><wsp:rsid wsp:val="00EA00A4"/><wsp:rsid wsp:val="00EB184C"/><wsp:rsid wsp:val="00EB1B08"/><wsp:rsid wsp:val="00EE2795"/><wsp:rsid wsp:val="00EF3917"/><wsp:rsid wsp:val="00F4296D"/><wsp:rsid wsp:val="00F53898"/><wsp:rsid wsp:val="00F549F0"/><wsp:rsid wsp:val="00F7158B"/><wsp:rsid wsp:val="00FC1791"/><wsp:rsid wsp:val="00FD5B6E"/><wsp:rsid wsp:val="00FE71C8"/><wsp:rsid wsp:val="00FF16F2"/></wsp:rsids></w:docPr><w:body><wx:sect><wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00174D8A"><w:t>Robot API</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Robot Interfaces</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r><w:t>The robot API shall provide an interface to the different robots that may be attached to the system, including:</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Research </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> systems</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>Via the read-write research interface (Reference 2.1.2). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.1.2 "/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Clinical </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> systems</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>Via the read-only research interface (older V4.x interface mentioned in Reference 2.1.2). </w:t></w:r></w:p><w:proofErr w:type="spellStart"/></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.1.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>DaVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> master and slave arms</w:t></w:r></w:p><w:proofErr w:type="gramStart"/><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="00E54E52" wsp:rsidP="00E54E52"><w:pPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>V</w:t></w:r><w:r wsp:rsidR="006A3C0C"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>ia the JHU controller.</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r wsp:rsidR="006A3C0C"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t> </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.1.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>JHU robots</w:t></w:r></w:p><w:proofErr w:type="gramStart"/><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>Such as the “snake†robot and the steady hand robot for retinal surgery.</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Interface</w:t></w:r><w:r><w:t> Initialization</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The robot API shall provide method(s) to initialize the interface.</w:t></w:r><w:r><w:t> </w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>For the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> research API, this would encompass t</w:t></w:r><w:r><w:t>he stream management functions.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Robot collaboration</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The robot API shall provide an interface to individual robots (e.g., </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> PSM or MTM) and collaborations of multiple robots: </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Robot Object</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>Each individual robot shall be represented by an instance of a robot object. The methods of that object shall provide the API for a single robot. This is analogous to the “manipulator†commands in the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> research API. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.3.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>C</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>ollaborative </w:t></w:r><w:r><w:t>R</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>obot</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>Collaborative groups of robots (such as master-slave pairs) shall be represented by an instance of a “collaborative robot†object, which shall contain two or more robot objects, as well as other devices, such as surgeon console buttons (see Section 4.3.1). This is analogous to the “supervisor†commands in the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> research API. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Read-only Robots</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>Individual and collaborative robots can be “read-only†(i.e., provide only state information) or “read-write†(i.e., provide state inform</w:t></w:r><w:r><w:t>ation and allow state changes).</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>CISST fundamental data types</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The robot API for the individual and collaborative robot objects shall use the CISST fundamental data types (vectors, matrices, transformations), rather than the math support functio</w:t></w:r><w:r><w:t>ns in the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:t> research API. </w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>This may require translation from CISST data types to ISI data types (e.g., array of floats) and vice-versa. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>F</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>unctional </w:t></w:r><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>pecification</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The methods of the individual and collaborative robot objects shall be documented in an external database/document, which shall become the functional specification for the robot API. This database shall contain the following information: </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.6.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Method name </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.6.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Number and types of parameters </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.6.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Functional description </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Events</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The API shall generate events to notify the user application about asynchronous actions detected by the lower level software. The events of the individual and collaborative robot objects shall be documented in an external database/document. </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.7.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Individual robot events</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>Individual robot events shall include:</w:t></w:r><w:r><w:t> </w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>Emergency stop signaled, power amplifier fault, hardware limit reached, etc. (if available for that robot). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.7.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Collaborative robot events</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>Collaborative robot events shall include all individual robot events and master console events such as buttons or pedals pressed. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.7.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>E</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>xtendable </w:t></w:r><w:r><w:t>Events A</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>rchitecture</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The API shall have an extendable architecture to allow new events to be added. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.7.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Event Implementation</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r><w:t>I</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>ndividual and collaborative robots are not required to implement all defined events. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.1.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Virtual fixtures</w:t></w:r></w:p><w:proofErr w:type="spellStart"/><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.8.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>H</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>aptic</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> </w:t></w:r><w:r><w:t>C</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>onstraints</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>The API shall include commands for specifying and enabling </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00EB2959"><w:t>haptic</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00EB2959"><w:t> constraints, such as virtual fixtures. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.1.8.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>JHU and the ISI </w:t></w:r><w:r><w:t>C</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>onstraint </w:t></w:r><w:r><w:t>P</w:t></w:r><w:r wsp:rsidRPr="00EB2959"><w:t>rimitives</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="006A3C0C" wsp:rsidP="00E54E52"><w:r wsp:rsidRPr="00EB2959"><w:t>This interface shall be designed to incorporate, as seamlessly as possible, both the JHU constrained optimization implementation (Reference 2.3.1) and the ISI embedded constraint primitives (e.g., infinite planes, triangle patches, detents) described in Reference </w:t></w:r><w:r><w:t>2.1.2</w:t></w:r></w:p><w:sectPr wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidSect="00CA52DF"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1080" w:right="1080" w:bottom="1080" w:left="1080" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sub-section></wx:sub-section></wx:sub-section></wx:sub-section></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.ats.config.demo/support/SAW-SubsystemRequirements.xml b/org.eclipse.osee.ats.config.demo/support/SAW-SubsystemRequirements.xml
new file mode 100644
index 00000000000..324be4301d2
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/SAW-SubsystemRequirements.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>Ryan D. Brooks</o:LastAuthor><o:Revision>3</o:Revision><o:TotalTime>4</o:TotalTime><o:Created>2007-11-08T00:23:00Z</o:Created><o:LastSaved>2007-11-08T00:57:00Z</o:LastSaved><o:Pages>6</o:Pages><o:Words>1398</o:Words><o:Characters>7969</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>66</o:Lines><o:Paragraphs>18</o:Paragraphs><o:CharactersWithSpaces>9349</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="APODLF+TimesNewRoman"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="APOBEE+TimesNewRoman,Bold"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="APODLD+TimesNewRoman,Italic"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="051F140B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="56CC694C"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="27052676"/><w:plt w:val="Multilevel"/><w:tmpl w:val="53543520"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="28F27417"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DE367966"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="6A186F94"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="BACCBC98"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="74E71559"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="36E2C870"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="797F5C7B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="5CF487D8"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="1"/></w:list><w:list w:ilfo="2"><w:ilst w:val="2"/></w:list><w:list w:ilfo="3"><w:ilst w:val="5"/></w:list><w:list w:ilfo="4"><w:ilst w:val="0"/></w:list><w:list w:ilfo="5"><w:ilst w:val="4"/></w:list><w:list w:ilfo="6"><w:ilst w:val="3"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00E1538C"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:kern w:val="32"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading8"/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/><w:i-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Heading9"/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="Default"><w:name w:val="Default"/><w:rsid w:val="00E1538C"/><w:pPr><w:pStyle w:val="Default"/><w:widowControl w:val="off"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><w:rFonts w:ascii="APOBEE+TimesNewRoman,Bold" w:h-ansi="APOBEE+TimesNewRoman,Bold" w:cs="APOBEE+TimesNewRoman,Bold"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="000000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style></w:styles><w:docPr><w:view w:val="normal"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="0085555F"/><wsp:rsid wsp:val="00032983"/><wsp:rsid wsp:val="00057F8D"/><wsp:rsid wsp:val="00074DC0"/><wsp:rsid wsp:val="000B3338"/><wsp:rsid wsp:val="000C033F"/><wsp:rsid wsp:val="000C1E6F"/><wsp:rsid wsp:val="000C2E64"/><wsp:rsid wsp:val="000D7B67"/><wsp:rsid wsp:val="00121DE1"/><wsp:rsid wsp:val="00140AA7"/><wsp:rsid wsp:val="001A5C18"/><wsp:rsid wsp:val="001C0EA3"/><wsp:rsid wsp:val="001F44D7"/><wsp:rsid wsp:val="002417BF"/><wsp:rsid wsp:val="00246911"/><wsp:rsid wsp:val="0026273B"/><wsp:rsid wsp:val="0026750B"/><wsp:rsid wsp:val="002A4BDF"/><wsp:rsid wsp:val="002E251C"/><wsp:rsid wsp:val="00322364"/><wsp:rsid wsp:val="00333DE9"/><wsp:rsid wsp:val="00345668"/><wsp:rsid wsp:val="00381AD0"/><wsp:rsid wsp:val="00385A5D"/><wsp:rsid wsp:val="003A0B4B"/><wsp:rsid wsp:val="003E0161"/><wsp:rsid wsp:val="00402D48"/><wsp:rsid wsp:val="00416C9D"/><wsp:rsid wsp:val="00420233"/><wsp:rsid wsp:val="0061272D"/><wsp:rsid wsp:val="006141BE"/><wsp:rsid wsp:val="00633862"/><wsp:rsid wsp:val="0066564A"/><wsp:rsid wsp:val="00676F12"/><wsp:rsid wsp:val="00747618"/><wsp:rsid wsp:val="00763A67"/><wsp:rsid wsp:val="00784E1D"/><wsp:rsid wsp:val="00791E6A"/><wsp:rsid wsp:val="007A69F5"/><wsp:rsid wsp:val="007E6A54"/><wsp:rsid wsp:val="007F3A83"/><wsp:rsid wsp:val="0081123D"/><wsp:rsid wsp:val="00820625"/><wsp:rsid wsp:val="008376DC"/><wsp:rsid wsp:val="00850AC3"/><wsp:rsid wsp:val="0085555F"/><wsp:rsid wsp:val="00872E7A"/><wsp:rsid wsp:val="00872F8E"/><wsp:rsid wsp:val="008A35E9"/><wsp:rsid wsp:val="00932EF4"/><wsp:rsid wsp:val="00A4305E"/><wsp:rsid wsp:val="00A51DE8"/><wsp:rsid wsp:val="00A540B8"/><wsp:rsid wsp:val="00A569AD"/><wsp:rsid wsp:val="00AB1386"/><wsp:rsid wsp:val="00AD7FD0"/><wsp:rsid wsp:val="00AF2E8E"/><wsp:rsid wsp:val="00B21FF0"/><wsp:rsid wsp:val="00B327AE"/><wsp:rsid wsp:val="00B62463"/><wsp:rsid wsp:val="00B91691"/><wsp:rsid wsp:val="00B93554"/><wsp:rsid wsp:val="00BF020D"/><wsp:rsid wsp:val="00C04D90"/><wsp:rsid wsp:val="00C25C84"/><wsp:rsid wsp:val="00C54B54"/><wsp:rsid wsp:val="00CC1964"/><wsp:rsid wsp:val="00CD088E"/><wsp:rsid wsp:val="00CE3D5F"/><wsp:rsid wsp:val="00D17844"/><wsp:rsid wsp:val="00D2292E"/><wsp:rsid wsp:val="00D30EC1"/><wsp:rsid wsp:val="00D35D56"/><wsp:rsid wsp:val="00D72411"/><wsp:rsid wsp:val="00DB754D"/><wsp:rsid wsp:val="00DC28CF"/><wsp:rsid wsp:val="00E034A8"/><wsp:rsid wsp:val="00E1538C"/><wsp:rsid wsp:val="00E8683A"/><wsp:rsid wsp:val="00EA00A4"/><wsp:rsid wsp:val="00EB184C"/><wsp:rsid wsp:val="00EB1B08"/><wsp:rsid wsp:val="00EE2795"/><wsp:rsid wsp:val="00EF3917"/><wsp:rsid wsp:val="00F4296D"/><wsp:rsid wsp:val="00F53898"/><wsp:rsid wsp:val="00F549F0"/><wsp:rsid wsp:val="00F7158B"/><wsp:rsid wsp:val="00FC1791"/><wsp:rsid wsp:val="00FD5B6E"/><wsp:rsid wsp:val="00FE71C8"/><wsp:rsid wsp:val="00FF16F2"/></wsp:rsids></w:docPr><w:body><wx:sect><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="001A5C18" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="1. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Subsystem</w:t></w:r><w:r wsp:rsidR="00E1538C"><w:t> </w:t></w:r><w:r wsp:rsidR="00E1538C" wsp:rsidRPr="00174D8A"><w:t>Requirements </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00174D8A"><w:t>Robot API</w:t></w:r></w:p><w:p wsp:rsidR="001A5C18" wsp:rsidRPr="001A5C18" wsp:rsidRDefault="001A5C18" wsp:rsidP="001A5C18"><w:r><w:t>The </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>robot Application Programming Interface with provide</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> the software interface to all robots attached to the system.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Video processing</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.2.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Video C</w:t></w:r><w:r wsp:rsidRPr="00A04D4C"><w:t>apture</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r wsp:rsidRPr="00A04D4C"><w:t>The system shall include hardware to capture video images from a number of sources, including stereo cameras and ultrasound. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.2.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00A04D4C"><w:t>3D surface reconstruction</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r wsp:rsidRPr="00A04D4C"><w:t>The software shall include a method for 3D surface reconstruction from</w:t></w:r><w:r><w:t> stereo video images (see 4.3).</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.2.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>V</w:t></w:r><w:r wsp:rsidRPr="00A04D4C"><w:t>olumetric </w:t></w:r><w:r><w:t>I</w:t></w:r><w:r wsp:rsidRPr="00A04D4C"><w:t>mages</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r wsp:rsidRPr="00A04D4C"><w:t>In addition to video, the software shall accept inputs from other sources, such as prior volumetric images and models. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.2.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Video Files</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r wsp:rsidRPr="00A04D4C"><w:t>The software should work with recorded data (e.g., video files). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.2.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Frame Synchronization</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r wsp:rsidRPr="00A04D4C"><w:t>The software shall have a method for synchronizing the video frames to other data, such as robot feedback (see 4.7.7). One possibility is to utilize an image format that enables additional information to be stored as meta-data. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Other device interfaces </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00A04D4C"><w:t>Input Devices</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The software shall provide interfaces to various user input devices, such as foot pedals, switches, and buttons (including those on the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> master console). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.3.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00A04D4C"><w:t>ensors</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The software shall provide an interface to sensors that can measure forces and torques, including full 6-dof force/torque data. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00A04D4C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.3.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00A04D4C"><w:t>Additional Device Integration</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The architecture shall be extensible, allowing the integration of other devices not yet specified. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration and registration</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.4.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The system shall support calibration of the following: </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="007704C0" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Ultrasound probe</w:t></w:r></w:p><w:proofErr w:type="gramStart"/><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>Position/orientation of the 2D image plane with respect to a 3D reference frame on the probe.</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="007704C0" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.1.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Camera calibration (intrinsic)</w:t></w:r></w:p><w:proofErr w:type="gramStart"/><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The determination of camera parameters such as focal length, resolution, optical center, and lens distortion.</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="007704C0" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.1.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Stereo camera calibration (extrinsic)</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:rPr><w:rFonts w:ascii="APODLD+TimesNewRoman,Italic" w:h-ansi="APODLD+TimesNewRoman,Italic" w:cs="APODLD+TimesNewRoman,Italic"/><wx:font wx:val="APODLD+TimesNewRoman,Italic"/></w:rPr><w:t>T</w:t></w:r><w:r><w:t>he transformation between two camera systems (or one camera moved between two positions). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="007704C0" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.1.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Robot kinematics</w:t></w:r></w:p><w:proofErr w:type="gramStart"/><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:rPr><w:rFonts w:ascii="APODLD+TimesNewRoman,Italic" w:h-ansi="APODLD+TimesNewRoman,Italic" w:cs="APODLD+TimesNewRoman,Italic"/><wx:font wx:val="APODLD+TimesNewRoman,Italic"/></w:rPr><w:t>T</w:t></w:r><w:r><w:t>he transformation between a frame on the final link of the robot and a frame on the base of the robot.</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="007704C0" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.1.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Tool tip</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:rPr><w:rFonts w:ascii="APODLD+TimesNewRoman,Italic" w:h-ansi="APODLD+TimesNewRoman,Italic" w:cs="APODLD+TimesNewRoman,Italic"/><wx:font wx:val="APODLD+TimesNewRoman,Italic"/></w:rPr><w:t>T</w:t></w:r><w:r><w:t>he transformation between a frame on the tip of a (rigid) tool and a frame defined elsewhere on the tool. This calibration may not require a full transformation; for example, a translation vector is sufficient if only the tip position is required. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.4.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration Methods</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The system shall support each calibration listed under “</w:t></w:r><w:r wsp:rsidRPr="007704C0"><w:t>Calibration</w:t></w:r><w:r><w:t>†by providing the following: </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.2.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Data Collection</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>system may</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> (optionally) provide functions for collecting calibration data. Otherwise, this can be provided by external software. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.2.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration Parameters</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>system may</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> (optionally) provide functions to compute the calibration parameters. Otherwise, this can be done by external software (e.g., </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:t>Matlab</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:t> program). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.2.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration Results</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The system shall have a method for using the results of the calibration (e.g., by reading the results from a file). </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.4.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Registration</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Coordinate Systems Registration</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The system shall provide routines to register the following coordinate systems (i.e., find the transformation from one coordinate system to another coordinate system): </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>stereo video image </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>ultrasound image </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>preoperative image (e.g., CT) or model (e.g., segmented volume) </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>robot </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>external measurement device (e.g., </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:t>Optotrak</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:t>) </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"/><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>Registration between any two of these coordinate systems shall either be computed directly or obtained by composition of two or more known registrations. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.4.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Coordinate Computation Methods</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>The system shall provide implementations of the following coordinate computation methods (for calibration and/or registration): </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.4.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Pivot Calibration</w:t></w:r></w:p><w:proofErr w:type="gramStart"/><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>A “pivot calibration†method, where the transformation is computed from data obtained by pivoting a tool about a fixed position.</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.4.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Paired-point Rigid Registration</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>Paired-point rigid registration, using a method such as the one proposed in Reference 2.2.1 or in Reference 2.2.2 (enhanced in Reference 2.2.3). </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><wx:t wx:val="1.4.4.2.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>External Measurement</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>This method may be used to register the robot to the external measurement device. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><wx:t wx:val="1.4.4.2.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Preoperative Image</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>This method may be used to register the preoperative image or model to the robot or external measurement device. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.4.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Iterative methods for registering sets of points/surfaces</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>An example is the Iterative Closest Point (ICP) algorithm proposed in Reference </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>2.2.5. This method may be used to register prior models to the anatomy without requiring </w:t></w:r><w:proofErr w:type="spellStart"/><w:proofErr w:type="gramStart"/><w:r><w:t>fiducials</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:t> .</w:t></w:r><w:proofErr w:type="gramEnd"/></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.4.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Matrix Equation</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>Solving the matrix equation AX = XB, where </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>A and</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> B are known and X is unknown. This method may be used for ultrasound calibration (see Reference 2.2.4). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading4"/><w:listPr><wx:t wx:val="1.4.4.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Deformable (non-rigid) registration </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:r><w:t>This method may be used for video overlay on organs. </w:t></w:r></w:p></wx:sub-section></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Tool tracking</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.5.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tool Positions/Orientations</w:t></w:r><w:r wsp:rsidRPr="007704C0"><w:t> </w:t></w:r><w:r><w:t>Estimation</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The software shall be able to estimate tool positions/orientations using a combination of stereo video images and joint encoder feedback. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="007704C0" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.5.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Position Prediction</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The software shall be able to predict the position and shape of tools in the 3D frames (i.e., to provide input to the video rendering). </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>User Interface (Visualization) </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="002F3B05" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.6.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="002F3B05"><w:t>Supported Hardware</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The system shall contain hardware to display the captured stereo images</w:t></w:r><w:r><w:rPr><w:color w:val="auto"/></w:rPr><w:t>. </w:t></w:r><w:r><w:rPr><w:color w:val="auto"/></w:rPr><w:tab wx:wTab="525" wx:tlc="none" wx:cTlc="8"/></w:r><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>At a minimum, the following hardware shall be supported: </w:t></w:r></w:p><w:proofErr w:type="spellStart"/><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> master console display </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Head-mounted display </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="002F3B05" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.6.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="002F3B05"><w:t>Windowing System</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The software shall include a windowing system to: </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Manage the display of multiple windows. </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Render visual objects, including menus, buttons, toolbars, and images (see 4.6.3), in the 3D viewing space. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="002F3B05" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.6.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="002F3B05"><w:t>Image Rendering</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The system shall be capable of rendering the following images: </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="5"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>2D images </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="5"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>3D volume models </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="5"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>3D surface models </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="5"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>2D image projected onto a 3D plane (e.g., laparoscopic ultrasound) </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="002F3B05" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.6.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="002F3B05"><w:t>Image Fusion</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The system shall be capable of performing image fusion, i.e., the ability to combine multiple images with different blending/overlay parameters. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="002F3B05" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.6.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="002F3B05"><w:t>Object Manipulation</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The system shall support the manipulation of virtual objects in the surgeon’s field of view, where the virtual objects may be 2D or 3D images or models, or widgets such as “in volume†menus and virtual push-buttons, and similar functions. The manipulation functions shall be designed to accept position/orientation inputs from a generic user input device. One embodiment shall include the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> master </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>telemanipulators</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> and associated surgeon console controls. The manipulation functions shall include controls for manipulating the virtual objects (e.g., repositioning, rotating, scaling) and for turning them on and off. </w:t></w:r></w:p><w:proofErr w:type="spellStart"/></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="007704C0"><w:t>Telesurgery</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="007704C0"><w:t> application framework </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall integrate all functions listed above. </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>Event Loop</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall contain an event loop to handle events from the subsystem components.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>Video Data Pipeline</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall include a real-time data pipeline that can be used by video processing subsystem (4.2). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>CISST</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall include the CISST Interactive Research Environment (IRE), which is a Python-based shell for interactive development.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>Plug-in Modules</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall allow users to dynamically load “plug-in†modules for research purposes.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>Modular Architecture</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall have a modular architecture, allowing it to be implemented on different physical architectures (i.e., different boxes), within the performance (bandwidth and latency) limitations of the interconnections. Supported physical architectures shall include any of the following: </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="6"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Ultrasound acquisition on a separate computer. </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="6"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Robot control on a separate computer (e.g., </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>daVinci</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> embedded controller or external JHU controller). </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="6"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Collaborative robots controlled by different computers. </w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="6"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>All functions specified in this requirement on a single PC. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>Data Logging</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The application framework shall include a flexible data logging mechanism to allow the recording of relevant state information, including video. This can, for example, be used for research in gesture recognition.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>Time Synchronization</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The data logging shall support time synchronization, either by ensuring that all data are captured at the same time or by associating a system-wide “timestamp†with each data item. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00E16903" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.7.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00E16903"><w:t>System Recovery</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The system shall provide a method to save an occasional “snapshot†of the state for recovery from system restart (e.g., due to power failure, computer crash, etc.). </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="1.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Volume viewer</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.1 "/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Functions</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The volume viewer shall be implemented using the functions specified in Section 4.6.5. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Volume Data Sets</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The volume viewer shall provide functions for selecting and loading volume data sets from a menu of choices. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Scaling</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The volume viewer shall provide functions for scaling the data set from </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>voxels</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> to physical coordinates and placing it at a specified position within the stereoscopic visualization coordinate system (i.e., in camera coordinates). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Fused Visualizations</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The volume viewer shall provide functions for turning visualization on and off and providing “fused†visualizations by video blending (see Section 4.6.4). </w:t></w:r></w:p><w:proofErr w:type="spellStart"/></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Haptic</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00FD64F9"><w:t> Interaction</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The volume viewer shall provide functions to enable </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>haptic</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> interaction with volumetric data (Phase 2) </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Motion Compensation</w:t></w:r></w:p><w:p wsp:rsidR="00E1538C" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>The volume viewer shall update the visualization to compensate for camera motion, so that the volumetric data set appears to be fixed to the tissue (Phase 2). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00E1538C" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00E1538C" wsp:rsidP="00E1538C"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="1.8.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Third-party Integration</w:t></w:r></w:p><w:p wsp:rsidR="00820625" wsp:rsidRPr="001A5C18" wsp:rsidRDefault="00E1538C" wsp:rsidP="001A5C18"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:t>The interface between the input device(s) and volume viewer shall be as generic as possible to facilitate integration of third-party volume viewer software.</w:t></w:r></w:p><w:sectPr wsp:rsidR="00820625" wsp:rsidRPr="001A5C18" wsp:rsidSect="00E1538C"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1080" w:right="1080" w:bottom="1080" w:left="1080" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sub-section></wx:sub-section></wx:sub-section></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.ats.config.demo/support/SAW-SystemRequirements.xml b/org.eclipse.osee.ats.config.demo/support/SAW-SystemRequirements.xml
new file mode 100644
index 00000000000..4000a88dbee
--- /dev/null
+++ b/org.eclipse.osee.ats.config.demo/support/SAW-SystemRequirements.xml
@@ -0,0 +1,2719 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>Microsoft Word - SAW-SystemRequirements-Rev2.doc</o:Title><o:Author>Peter</o:Author><o:LastAuthor>Donald G. Dunne</o:LastAuthor><o:Revision>9</o:Revision><o:TotalTime>32</o:TotalTime><o:Created>2007-11-08T00:15:00Z</o:Created><o:LastSaved>2008-03-08T22:11:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>1836</o:Words><o:Characters>10469</o:Characters><o:Lines>87</o:Lines><o:Paragraphs>24</o:Paragraphs><o:CharactersWithSpaces>12281</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font><w:font w:name="APODLF+TimesNewRoman"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="APOBEE+TimesNewRoman,Bold"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="27052676"/><w:plt w:val="Multilevel"/><w:tmpl w:val="53543520"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="4F745A43"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="2B64EB84"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="690C37D0"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="EE90C016"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="713254E8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FED6E646"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="0"/></w:list><w:list w:ilfo="2"><w:ilst w:val="3"/></w:list><w:list w:ilfo="3"><w:ilst w:val="1"/></w:list><w:list w:ilfo="4"><w:ilst w:val="2"/></w:list><w:list w:ilfo="5"><w:ilst w:val="0"/></w:list><w:list w:ilfo="6"><w:ilst w:val="0"/></w:list><w:list w:ilfo="7"><w:ilst w:val="0"/></w:list><w:list w:ilfo="8"><w:ilst w:val="0"/></w:list><w:list w:ilfo="9"><w:ilst w:val="0"/></w:list><w:list w:ilfo="10"><w:ilst w:val="0"/></w:list><w:list w:ilfo="11"><w:ilst w:val="0"/></w:list><w:list w:ilfo="12"><w:ilst w:val="0"/></w:list><w:ilfoMacAtCleanup w:val="4"/></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="001D5940"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0056103B"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:kern w:val="32"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading8"/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/><w:i-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AE56EF"/><w:pPr><w:pStyle w:val="Heading9"/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="1"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="Default"><w:name w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="Default"/><w:widowControl w:val="off"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><w:rFonts w:ascii="APOBEE+TimesNewRoman,Bold" w:h-ansi="APOBEE+TimesNewRoman,Bold" w:cs="APOBEE+TimesNewRoman,Bold"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="000000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM1"><w:name w:val="CM1"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM1"/><w:spacing w:line="368" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM2"><w:name w:val="CM2"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM2"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM3"><w:name w:val="CM3"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM3"/><w:spacing w:line="276" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM26"><w:name w:val="CM26"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM26"/><w:spacing w:after="240"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM4"><w:name w:val="CM4"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM4"/><w:spacing w:line="276" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM29"><w:name w:val="CM29"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM29"/><w:spacing w:after="138"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM5"><w:name w:val="CM5"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM5"/><w:spacing w:line="276" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM23"><w:name w:val="CM23"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM23"/><w:spacing w:line="276" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM24"><w:name w:val="CM24"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM24"/><w:spacing w:line="276" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM25"><w:name w:val="CM25"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM25"/><w:spacing w:line="276" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CM28"><w:name w:val="CM28"/><w:basedOn w:val="Default"/><w:next w:val="Default"/><w:rsid w:val="001D5940"/><w:pPr><w:pStyle w:val="CM28"/><w:spacing w:after="333"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="APOBEE+TimesNewRoman,Bold"/><w:color w:val="auto"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="000F30F7"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="2050"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="normal"/><w:zoom w:percent="100"/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:drawingGridHorizontalSpacing w:val="120"/><w:drawingGridVerticalSpacing w:val="120"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="3"/><w:useMarginsForDrawingGridOrigin/><w:doNotShadeFormData/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:doNotUnderlineInvalidXML/><w:compat><w:spaceForUL/><w:balanceSingleByteDoubleByteWidth/><w:doNotLeaveBackslashAlone/><w:ulTrailSpace/><w:doNotExpandShiftReturn/><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:adjustLineHeightInTable/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00932067"/><wsp:rsid wsp:val="000C7F38"/><wsp:rsid wsp:val="000F30F7"/><wsp:rsid wsp:val="00174D8A"/><wsp:rsid wsp:val="001C74F6"/><wsp:rsid wsp:val="001D5940"/><wsp:rsid wsp:val="002524D4"/><wsp:rsid wsp:val="00282CC6"/><wsp:rsid wsp:val="002F3B05"/><wsp:rsid wsp:val="004113C0"/><wsp:rsid wsp:val="00472BD6"/><wsp:rsid wsp:val="0056103B"/><wsp:rsid wsp:val="005C57DC"/><wsp:rsid wsp:val="006B1AA5"/><wsp:rsid wsp:val="007704C0"/><wsp:rsid wsp:val="00932067"/><wsp:rsid wsp:val="00976243"/><wsp:rsid wsp:val="009C60DF"/><wsp:rsid wsp:val="009E5734"/><wsp:rsid wsp:val="009F2FE2"/><wsp:rsid wsp:val="00A04D4C"/><wsp:rsid wsp:val="00AE56EF"/><wsp:rsid wsp:val="00C10128"/><wsp:rsid wsp:val="00D118A9"/><wsp:rsid wsp:val="00DD3A6B"/><wsp:rsid wsp:val="00DE58D4"/><wsp:rsid wsp:val="00E16903"/><wsp:rsid wsp:val="00E91EE7"/><wsp:rsid wsp:val="00EB2959"/><wsp:rsid wsp:val="00EC0396"/><wsp:rsid wsp:val="00F61047"/><wsp:rsid wsp:val="00F6579C"/><wsp:rsid wsp:val="00FD64F9"/></wsp:rsids></w:docPr><w:body><wx:sect><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="1. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Objective </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:r><w:t>This document defines the requirements for the Surgical Assistant Workstation for Teleoperated</w:t></w:r><w:r wsp:rsidR="00AE56EF"><w:t> </w:t></w:r><w:r><w:t>Surgical Robots (SAWTSR) being developed by Johns Hopkins University and Intuitive Surgical. This document provides requirements for the workstation system and does not include application requirements. It is expected that applications developed on this workstation would define their own requirements (i.e., in a separate document). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="2. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>References </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="2.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Project-Specific </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>“Development of a Surgical Assistant Workstation for Teleoperated Surgical Robots,†proposal for NSF ERC Supplement, July 2006. </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>“Intuitive Surgical daVinci API v5.0 Reference Manualâ€, generated July 14, 2006. </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>J. Leven, D. Burschka, R. Kumar, G. Zhang, S. J. Blumenkranz, X. Dai, M. Awad, G. Hager, M. Marohn, M. Choti, C. Hasser and R. H. Taylor “DaVinci Canvas: A Telerobotic Surgical System with Integrated, Robot-Assisted, Laparoscopic Ultrasound Capability,†in MICCAI, vol. LNCS 3749, J. Duncan and G. Gerig, Eds. Palm Springs, CA: Springer-Verlag, 2005, pp. 811-818. </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>J. Leven, “A Telerobotic Surgical Systems with Integrated Robot-Assisted Laparoscopic Ultrasound Capabilityâ€, MS Thesis, Computer Science, Johns Hopkins University, Baltimore, 2005. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="2.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration and Registration Techniques </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>B.K.P. Horn, “Closed-form</w:t></w:r><w:r><w:tab wx:wTab="345" wx:tlc="none" wx:cTlc="5"/><w:t> solution of absolute orientation using unit quaternions,†J. Opt. Soc. Amer. A, Vol. 4, No. 4, pp. 629–642, Apr. 1987. </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>K.S. Arun, T.S. Huang, S.D. Blostein, “Least-Squares Fitting of Two 3D Point Setsâ€, IEEE PAMI, Vol. 9, No. 4, pp. 698-700, Sept. 1987. </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>S.</w:t></w:r><w:r wsp:rsidR="00AE56EF"><w:t> </w:t></w:r><w:r><w:t>Umeyama, “Least-Squares Estimation of</w:t></w:r><w:r wsp:rsidR="00AE56EF"><w:t> Transformation Parameters </w:t></w:r><w:r><w:t>Between Two Point Patternsâ€, IEEE PAMI, Vol. 13,</w:t></w:r><w:r wsp:rsidR="00AE56EF"><w:t> No. 4, pp. 376-380, Apr. 1991.</w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>Boctor, A. Viswanathan, M. Choti, R. Taylor, G. Fichtinger, G. Hager, “A Novel Closed Form Solution for Ultrasound Calibration,†IEEE Intl. Symp. Bio. Imag. (ISBI), Arling</w:t></w:r><w:r wsp:rsidR="00AE56EF"><w:t>ton, VA, pp 527-530, Apr. 2004.</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>P. J. Besl and N. D. McKay, "A Method for Registration of 3-D Shapes," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 14, pp. 239256, Feb. 1992. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="2.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Virtual Fixtures and Constrained Optimization </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>Kapoor, M. Li, R.H. Taylor, “Constrained Control for Surgical Assistant Robotsâ€, Proc. IEEE Intl. Conf. on Robotics and Automation, Orlando, FL, May 2006, pp 231-236. </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>M. Li, A. Kapoor and R. H. Taylor “A Constrained Optimization Approach to Virtual Fixtures,†in IROS. Edmonton, Alberta, Canada, 2005. </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>M. Li and R. H. Taylor, “Performance of Teleoperated and cooperatively controlled surgical robots with automatically generated spatial virtual fixtures.,†in IEEE International Conference on Robotics and Automation. Barcelona, Spain, 2005. </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>M. Li, “Intelligent Robotic Surgical Assistance for Sinus Surgeryâ€, Ph.D. Thesis, Computer Science, The Johns Hopkins University, Baltimore, Maryland, 2005. </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00AE56EF"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="4"/><wx:t wx:val="§" wx:wTabBefore="360" wx:wTabAfter="255"/><wx:font wx:val="Wingdings"/></w:listPr></w:pPr><w:r><w:t>M. Li and R. H. Taylor, “Spatial Motion Constraints in Medical Robots Using Virtual Fixtures Generated by Anatomy,†in IEEE Conf. on Robotics and Automation. New Orleans, 2004, pp. 1270-1275. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="002524D4" wsp:rsidRDefault="00D118A9" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="3. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Robot </w:t></w:r><w:r wsp:rsidR="002524D4"><w:t>System Overview</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="CM4"/><w:spacing w:after="383"/><w:ind w:left="360"/><w:jc w:val="both"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>The goal is to create a unified assistive environment for surgery that integrates robotic devices; fused information environments combining preoperative images &amp; models, intraoperative images &amp; other sensors; surgical task modeling; and human-machine cooperative manipulation, as shown in Figure 1 (from Reference 2.1.1). </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="000C7F38"><w:pPr><w:pStyle w:val="Default"/><w:spacing w:after="160"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r wsp:rsidRPr="000C7F38"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><w:binData w:name="wordml://02000001.jpg">/9j/4AAQSkZJRgABAgEAlgCZAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdC
+IFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA
+AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFj
+cHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA
+ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD
+TAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJD
+AAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5
+OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEA
+AAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
+AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAA
+AA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo
+dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt
+IHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt
+IHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg
+Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENv
+bmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA
+ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA
+AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAK
+AA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
+mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy
+ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMC
+DAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMh
+Ay0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4E
+jASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3
+BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
+RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqY
+Cq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN
+Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBh
+EH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT
+5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu
+F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9oc
+AhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCY
+IMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZcl
+xyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2
+K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIx
+SjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec
+N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+
+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXe
+RiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN
+3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYP
+VlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1f
+D19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
+aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfBy
+S3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB
+fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH
+n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj
+k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6f
+HZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1
+q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm4
+0blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZG
+xsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU
+y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj
+4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz
+GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7gAOQWRvYmUA
+ZIAAAAAB/9sAQwAMCAgICAgMCAgMEAsLCxAUDg0NDhQYEhMTExIYFBIUFBQUEhQUGx4eHhsUJCcn
+JyckMjU1NTI7Ozs7Ozs7Ozs7/9sAQwENCwsOCw4SDw8SFBERERQXFBQUFBceFxgYGBceJR4eHh4e
+HiUjKCgoKCgjLDAwMDAsNzs7Ozc7Ozs7Ozs7Ozs7/8AAEQgCBQKyAwEiAAIRAQMRAf/EAB8AAAEF
+AQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFB
+BhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV
+VldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC
+w8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAA
+AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
+kaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo
+aWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
+1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9VooooAKKSg0ALRXPah4z07T
+7mS0aKaSSJtjbQAu70BLVBH47snALW0q9+qn+tK4HUUVQ0rV7bV4XmtgwCNtYPgc/gTV6mAtFFFA
+BRSGigBaKKKACiiigAooooAKKKKACkpaQ/rQAHpXK6r4vltNQmsYUQLEwXzT83OBnIq9qN7Kl+0S
+OQigcds4yawrzw8l2zz2TkTOSxjl5DE88NTRLY9vFuqo2d0Tj/dz+oNP/wCEz1FhjZEhPcqcf+hV
+gCGaCVradTG69UYYIoZcVagmK7Okh8XX6MFuo4Sp/iXOP/Qq1rfxHZS4E2I84+YHIri9OSE6hCly
+2UkyqRnoX6rk/ga39Q021uLItbR7ZFBZGjAUAjtUONnuS5tMoa1qEt/cSSSylY7VpBGYsD5f72TU
+vhy4ik1u3WMzODvwzsCpHlvyR5h/lWKhW3GbkkxHG8bsEgfeGeazZ7LWdZnhfwhcNab0kMUbSLHO
+TGrNtWaJV27guByOvJxUOOpstj16O7tZp5rWGaOSe22+fErAvH5g3JvUHK7hyM9amry/4R6D4j0X
+VdUXUreSztRGkckcyEebMrtseJ9pV1RQ+SrY+Yda6DX9M+Jdxq083h/VrO105tnkQzIpdcIofJNp
+L1fJ+8aoR2FFcv4X0/x/a6hJJ4q1K1vbMwsscduoVhLuQqxxbQ8bQ3eq+v6Z8S7jVp5vD+rWdrpz
+bPIhmRS64RQ+SbSXq+T940AdhRXL+F9P8f2uoSSeKtStb2zMLLHHbqFYS7kKscW0PG0N3qvr+mfE
+u41aebw/q1na6c2zyIZkUuuEUPkm0l6vk/eNAHYUVy/hfT/H9rqEknirUrW9szCyxx26hWEu5CrH
+FtDxtDd6r6/pnxLuNWnm8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2FFc/wCFLPxlafav+Etv7e/3
++X9l+zqF2Y3+ZuxBB1yuOtZ+v6Z8S7jVp5vD+rWdrpzbPIhmRS64RQ+SbSXq+T940AdhRXP+FLPx
+lafav+Etv7e/3+X9l+zqF2Y3+ZuxBB1yuOtZ+v6Z8S7jVp5vD+rWdrpzbPIhmRS64RQ+SbSXq+T9
+40AdhRXP+FLPxlafav8AhLb+3v8Af5f2X7OoXZjf5m7EEHXK461n6/pnxLuNWnm8P6tZ2unNs8iG
+ZFLrhFD5JtJer5P3jQB2FFc/4Us/GVp9q/4S2/t7/f5f2X7OoXZjf5m7EEHXK461n6/pnxLuNWnm
+8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2FFc/wCFLPxlafav+Etv7e/3+X9l+zqF2Y3+ZuxBB1yu
+OtZ+v6Z8S7jVp5vD+rWdrpzbPIhmRS64RQ+SbSXq+T940AdhRXP+FLPxlafav+Etv7e/3+X9l+zq
+F2Y3+ZuxBB1yuOtZ+v6Z8S7jVp5vD+rWdrpzbPIhmRS64RQ+SbSXq+T940AdhRXP+FLPxlafav8A
+hLb+3v8Af5f2X7OoXZjf5m7EEHXK461n6/pnxLuNWnm8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2
+FFc/4Us/GVp9q/4S2/t7/f5f2X7OoXZjf5m7EEHXK461n6/pnxLuNWnm8P6tZ2unNs8iGZFLrhFD
+5JtJer5P3jQB2FFc/wCFLPxlafav+Etv7e/3+X9l+zqF2Y3+ZuxBB1yuOtZ+v6Z8S7jVp5vD+rWd
+rpzbPIhmRS64RQ+SbSXq+T940AdhRXP+FLPxlafav+Etv7e/3+X9l+zqF2Y3+ZuxBB1yuOtZ+v6Z
+8S7jVp5vD+rWdrpzbPIhmRS64RQ+SbSXq+T940AdhRXP+FLPxlafav8AhLb+3v8Af5f2X7OoXZjf
+5m7EEHXK461n6/pnxLuNWnm8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2FFc/4Us/GVp9q/4S2/t7
+/f5f2X7OoXZjf5m7EEHXK461n6/pnxLuNWnm8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2FFc/wCF
+LPxlafav+Etv7e/3+X9l+zqF2Y3+ZuxBB1yuOtZ+v6Z8S7jVp5vD+rWdrpzbPIhmRS64RQ+SbSXq
++T940AdhRXP+FLPxlafav+Etv7e/3+X9l+zqF2Y3+ZuxBB1yuOtZ+v6Z8S7jVp5vD+rWdrpzbPIh
+mRS64RQ+SbSXq+T940AdhRXP+FLPxlafav8AhLb+3v8Af5f2X7OoXZjf5m7EEHXK461n6/pnxLuN
+Wnm8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2FFc/4Us/GVp9q/4S2/t7/f5f2X7OoXZjf5m7EEHX
+K461n6/pnxLuNWnm8P6tZ2unNs8iGZFLrhFD5JtJer5P3jQB2FFc/wCFLPxlafav+Etv7e/3+X9l
++zqF2Y3+ZuxBB1yuOtc/4p1jxfovjXSbdL6NdH1e8hhhtljjZwim3jnDs8O4bmkOMOfwoA9Aoooo
+AKKz9S13T9JdUvRcDfs2tFa3E6Zkby0XzIIZF3M3AXOeR6iix13T9RunsrYXCzxRiZ0ntbi3wjEq
+pzPDGPmKnHrg+hoA0KKKKACiismXxDCNq2lrcXsklxNbRxQeUHf7NlZ5f300QEcci+WWbHzYxkMp
+IBrUVDaXUF9aw3tq3mQXMaTRPgjckgDKcMARkHvU1ABRRUN3dQWNrNe3TeXBbRvNK+CdqRgsxwoJ
+OAO1AE1FZL+IYY7pLaW1uEX/AEdLif8AdNHbzXRCRW8pSZm8zcy5CBgNyknac1rUAFFFFABRRRQA
+VW1CZ4LSSSM4YYwfqQKsVS1g4sWH95lA/MUMFuc5qGn2E4MlxBukJRzJgEsSfm/SmQWNgYo/NjQf
+Oq4ZR93Y5Pb1q1qUtxDbh4EV3GMITjOeOtZM17qMOySa2eX+8sRUhf8AgRIzUPyNNDsbOXTLdBFb
+tFEWAyq4XJxVN9TuHvJFRwI45PLCgDB981zi373IBmhe1AJy0wB5x22mtGyeZ5NnlOf3gAO3AP8A
+tU1dolo6tSSAT6U6mqMADpxis668R6JZ3n2C5vYo7nj92x5GfWqJNKg8DNUY9Whl1ZtJQEstut15
+oxtKs20D9Ktyr5kbIedykY6dRQBQbxDpKTeQblS+SMDnGPU1fimjmXdEwYYByPQ8ivNLmzlsbtra
+ZNoz8244zknGWrrvCLlo51Lq20RjC5wv3/WoU03YfJJK9tO50NFFFWIKKKKACiiigApkjBAWbOAM
+nAJP/juTT6jmbZGzjqFJ/IUAcvdzpc3ss6Z2MRt3AqcY/utg1PAwyKz4ZpJD5kjb2Y5Zj3NaEWCA
+aBFfxPCrWVnfgDfFJ5TMOpVhx/6DXKyzY/PgV0XjeZ4PCNy8blXR42Qg853rXlVtc6pfXUVs08re
+Y4U89Mn/AArSErRJZ2VnBLfTJNwIoX3Fmzyeny4+tdD5ki2wtd2YwCuAAuR74rNYi1tgkf3UwijO
+eM4qwrMCATnArKTU3c5pVptct/dKt5pkFzC0YLRkqQCCCB+BzUPgvTVtfEtmxuGdo/NAQ7AD+6kH
+RUB71pPisLwmkkfxBhRlHMk7Z74aCVqcdb6mlCpJ3Tuz1yiiig6AooooAKKKKACiiigAooooAKKK
+KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKz9S0DSdXurK91CDzp9Nk860fe6+W+UbOEZQ3Ma/ezWhXn/AMR/+Rp8F/8AYQP/AKOsqAPQKKKK
+AMnxCI0htbvz/s9xa3HmWn7l7rfI0U0LJ9mgKyyfupHOEIxjcflBqro80t/qq3d7NJLPb28sUIGm
+3enxhJngaTe120gdswptAYd+D2seJkk+z2lzBK1vPa3SzRSpZz35B2Soy+TbMrYZHZSx4APGG2kQ
+6Hq91fahLZ3N0szRwiVohpl5YMoZtqOZLuV1IO1gBjJwcfdNAG9RRRQAVylr9j/tu4/s/wDtDd9n
+1L7Js+y+T5n2iD7d9n83955n2nGPO+TOcfJiurrj5LKKTUZLzR7fWHgSS7hc2c1osMjzTA3wQ3k6
+3Ee6WHB2FMEZTGdxAOl0n7B/ZVn/AGX/AMeP2eL7J97/AFOxfK/1nzfdx15q3VTSfsH9lWf9l/8A
+Hj9ni+yfe/1OxfK/1nzfdx15q3QAVU1b7B/ZV5/an/Hj9nl+1/e/1OxvN/1fzfdz05q3VTVvsH9l
+Xn9qf8eP2eX7X97/AFOxvN/1fzfdz05oA5+x+x+TP/aP9obv7Ytvtn2z7Lv+0+VafZN/2L5fL3eR
+jZzu+98m6urrj7eyitrrzNUt9YjtJ7y3mAvJrR4UuVMEFoXa0ne5kwY40G8uM/M/PzV2FABRRRQB
+Xu7yG0C+aTl8hVUZJxRaXkN4hkhz8p2kEYINZPid/Ke1l67RKf1irB0XxHdwTTRosRhMm5g2QxyM
+cHPtSvYDtprmKDHmNgnkDqahvIv7QtgsDjG4MCenFc5Brsmqa7c2xRUS0hXaQSSS2c55q6+qSWFn
+bxwgbrgyEO3YKcUX6DMjxPevaCW1VGZ4QhLryPmAxgfjWfO00t2IY32KyqX46HAz0PWqXj3VLy2a
+3liY+ZdqTLKMDhNmAABiuZs/E2pQsGdhMOpEg5z/ALy4NCQ7ndpO7DacusbFQ7dyRtzWnZ310JCs
+8j7wOCD6f3e1c74W8Y6U001rqsQgjmQKrllAzk7slymOtdFqemR2MkFzHdNMJciNTt2hMDDZUDP1
+ptBcq6n47/4R+KSO6BvLrH7hVG1Xz0cv2HqK8uvNXl1C7mu7ojNxOZn2gE5bsrHnA7V1nizTNVu9
+Je7mmhkS3PmiBYyrhScFg+5ieOuRXnocknnj1/lQlcTO38IeNo9Fvri51JpbkNAIIehYBDvVTXq+
+mazY6naQ3EUqBpUWQxbwWXcM7TXz5b25azkuX3o6sBEAuVkOeRkkfpXVf8JnBN4XltprW3TUrcxx
+W8wGHKkHe+Nwb5ce4pa3sgt3PQvFniXw/o22G+iW5uZVICBVYqDxucnoKpfDiczHUSX3j9wR6AN5
+x4rzSTTbqHSo9cuG897onZGctIiDpJJkDr/D2rtfg07P/a+5ixH2Xr2z9op2E99D0uiiigAooooA
+KKKKACo5lLRuB1KkD8RUlIaAOCs3+RQeo4/KtOCTj/GufmuZ7K8ntym4RSuuAcHAY4qK41TVJ0MV
+pF5ef4iRQShvjC7n1m2Om2rpHHDKGkDnBfb24rnrOa10y9hN0PLQghZONqvju3XFTjSr6N3hnl8x
+ZcyEyDc244zhutX7bRdJyqzp5237omYsM/Rs1bSaJnPluhkOswajqcFtayb4hueZhnb8o+Vc+5ra
+UsrYbrjP51UurC28tUhHl9hs+UA8YpUkcYMjcgBQOvT1rNqxyySdrFlnzz6VT0CJx8QbG4U/LKJl
+cd8pBL/jUpb3x9aq+GjeTfEKzkSKX7JH5qmQodmfIl53EeuKcTSkvePWKKKKDqCiiigAooooAKKK
+KACiiigAooooAKKKKACiiigAoopCcUALRSZozQAtFQy3dtAQJpUjLdA7BSfzqVWDDI5B5GKL9B2a
+V7C0UUUCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKz9S0DSdXurK91CDzp9Nk860f
+e6+W+UbOEZQ3Ma/ezWhXn/xH/wCRp8F/9hA/+jrKgD0CiiigDP1u8msrVJLe4jt5GkCL5ltLeNJw
+xKRwW8sUjNgbuM4UE4xyM/R52v8AVVur668y6t7eWOCL7BcadmOV4GmfbePI0m1ooxlMbc/N95au
+63BFMLKQ3LWlzBdB7JlQS752jlh2PFtLOmyRi+0qQoLblxuFLR5Y7/WGurq/+1XtnHcWkcUVq9nB
+sEsS3DR+eZWlZZYVVmSQqOBgE5IB0FFFFABXHyW93K9+mkya49pcXFwHaybTIolk3NFOsH2jy5k2
+yKwzxlsvkk7j2Fc5aac15Dez6VcXVnA11dr9jWdQk8qSyJOzSvbzTW4kmV/9S/A+cYYkUAaGgW8c
+WnwzWt9Ne2c8MT2gljgiWOLblPLS3trbAKkcMOMdq06o6G9lJounyadG0Nm9rC1tG/LJEY1Mat8z
+8hcdzV6gAqpqzWq6VeNfP5dqLeU3EmwSbYwjb22OkithexU59DVuqmrfYP7KvP7U/wCPH7PL9r+9
+/qdjeb/q/m+7npzQBy5tL3baQanca9bW0M0KRzXR0qZBKWWG383ylnkkPmOuCythsMcY3DrbWGS3
+gWGaeS6dc5mmCB2ySeRDHEnHThRWLNp8MEdnPq1zqE1qbi28q0nkiK20xdPs3nPbhZZdsu1PmkkB
+YhmzjeOgoAKKKKAMPxKQpti3AxLn/wAcNcdbafpUsjTzzeUshYITyNw598da6XxtM8Qswhxu83Jw
+D08v1BrjBb26y+cAVbOeMAZPtjFUocyvcXOk7HT2FnaW13LcRTx5fCsVABbjjNM1ANFtMlwJ1YlI
+1H8Jb5jj8qr2HiI2uxZ1EyqeAVUk9jk4pJp7GSZriG3a5hLtKiQsAyMcdupocGmCkmZGsWFtrdj9
+nMojngDSRBzjH94dRxxXDT2V1aqrzxsisPlbqh91fpXpNzeaPId9zp8+4cA5Ge1VdmhgC3tUmsvP
+ydsm14ev8cbZX9KV7DPOmY424JB69+K9D01fEltb2a6gk0mnCHIk8hpDEuMjowJX86saB4LstQ1X
+7U0MRsYGyzIpVZm/u4JIxkc4r0f5EUKCFA4A4AApS94L2PHrvxPLqVrc6ZH5Nn5uYTLcSMmVPXC7
+Gx071z+o2en6baR2yXUV7cSYkZoNxSL0BkZVyfoK9T8V+D9C1SVtQe5+x3BAzjEkTkDq8Iwc+4Ne
+caxp11C8NjbW8clrbtu8yEMvmt3Mm/5qaaWjY7OWqQ/S9JW50O5uAypKwEVrbbQ8kkjFepGOn97t
+Wc+nvpNwzaoUcsoGAQ5O4fdTI4YeuK6rR9IvLdrnUrB4I4Z1Vfs0jeWQTyyoGz371bghVbyWW4sj
+cykBTsiRhkfw8sxNCT1aQLV66HO+HfD2ta3E0VvcLY6cWIaWdwq59AOCxr0rwN4esNAF4tlcC5M3
+lCUq4fBj8wdABtzuNc9eXczjYukm1BXZwoUj3A2iug8CJIgvd6MgIhxuGM/6yq5fdbZF1eydzq6K
+KKgoKKKKACiiigArifHWu65o99ELJ3hs3iTdKI1ZBKzSDBYqecAV21Q3NvBdRNBcxrLE4wyONyke
+4NNOwmm1oeOpq9zJdPcX5Mplbc0oxn/gQXArcs7mKVC0bh+O1bep/DjSZwZNKd7GXqEyXi/FW5A+
+lcLqem32kXbWV+hhmx8joflcf3laqVmyVdGtdzKLqMZGSduCeuaz9ale0tvt1uAJIMSLkAjIPcHg
+j2rnZ47+G4+0xybtpyjEZYH6Gi88S3T2cun3cSyNIu3zQduAf9nGKppXRElzTv5Fm98eX9wYWS1t
+7d1z5wRW2Sk4wdhPyY/2aE8X3UkbzJZqVjxvZWbauTgZzmsCW2QqHaRRlQQCe3tWjoaQyaZqkEjs
+I3WDeyDJGJewJApSiky3CL6HoHgSw1fXZxqupLbjTApCwoRI7uegbaxxj3rsryXZ4h0q1TKqEmOB
+wMbCBx/wGuP+HGpeGdGWTTYLq486/kUj7UiqhcArhNjNyfevRvKiaQTMimRMhXIG4Dpwai6TZSSW
+yJKKKKQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKa+cEr1wcA9DTqQ0Aefw+Mbl7lpvPNu
+7nDQzDdDlePlZRkdPSuhtPFcLBRqERty3SRSJIm+jrkfnXL+H7W3l1x7K7jWWEzzxlHAYH73r9K3
+bzwQkbNLody9mW5MD/vIW9iDk/zqpPTQUd9S9/ZthqF7PqNxGlyjsgty4V02JHjIHuztnPoK09Pe
+B7ZHtSrQEHyjHypGf4ccY9Ko2EEem2CxzFIjEga4wx8tH2gyEbjhV79vWsnTPFMEamO1R7uzRm2y
+Dc0oUsWBYMWc9ep5PfmvJwkpVcXWlJzXK3p07anRO8oLd2skddRVKx1jT9QXNtKrEdVJww+oNXNw
+r1DAWikzS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWfqWgaTq91ZXuoQedPpsnnWj73X
+y3yjZwjKG5jX72a0K8/+I/8AyNPgv/sIH/0dZUAegUUUUAZPiERpDa3fn/Z7i1uPMtP3L3W+Ropo
+WT7NAVlk/dSOcIRjG4/KDWb4Xm0q4l0+GyuZrhtM0mO3hL2k9srxSmIGcvOgUiT7KvlgHs33v4dX
+WREJtLlkZo2ivlMcm0NErPFPDibLJgOshRDn/WMnB6FmnaF9guoZBPvt7G3ezsIdmGihlMLMkkm5
+vM2+QiocKQv3t7fNQBrUUUUAFclPHY31xt03Tlea7urtXtjeTWdvNHaOYLq5uooEeKQtOQm1kcur
+KW4yF62uXitZ7u7utS0jToSjtd2XmS6jc2zDE3l3TRwQ280cReaDdvQhj944YmgDd0m4tbvSrO6s
+Y/ItZ7eKS3i2hNkborIm1MqMKcYFW6qaTcWt3pVndWMfkWs9vFJbxbQmyN0VkTamVGFOMCrdABVH
+XHso9F1CTUY2ms0tZmuY04Z4hGxkVfmTkrnuKvVU1a4tbTSry6vo/PtYLeWS4i2h98aIzOm18Kcq
+MYNAHNOJ0vUi1B7i90+xuLGKZGuhiC+mkhMEabLSCa4WIyxMWmlwQ2SGda7CuXitZ9IWNtQ06EWs
+t9BJI66jc3spuJWitIJGW6t494VvL4Z/l27gNyiuooAKKKKAM/VdGttW8r7R/wAsd23r/Ftz0Yf3
+aof8Idp3t+Tf/F1v0VSnJKyYnFMwR4Q08dNv/fLf/HKX/hErIHKlQfXa2f8A0ZW7RRzy7hyo5DxG
+tr4Zslv5oEvlllWBYiTFtyrvu3Avn7npW4PDukiUTG1hZ1+6zIWx3/iY1hfFD/kAW/8A1+J/6Lmr
+sKuaXs4S6ycr/KwLsYuu3MWiaWZlCgbwkUSAoGZjk8jcBwCelUtP02312wS+hnMZckPGfnKOPvL9
+/wDEe1WPGlnbTaLJdypumttvktkjb5kkatwDg5HrWLp3iPTfCukaaslpeXdzq5uGWOyXziTbthj5
+bSrj5WH3R256VxqrVWJ9npycnN+J3uhQ/s9Vve9r7bkb6bXtvtb8TWbwgG/5e8f9ss/+1KjbwSrE
+H7X05x5Xf/v5UH/CxoP+gBrv/gGP/j1H/CxoP+gBrv8A4Bj/AOPV03bd/wBDgTS6/iSnwOrfevTj
+0Ef/ANsq3b+FhbpsW5x7rHgn65dqz/8AhY0H/QA13/wDH/x6j/hY0H/QA13/AMAx/wDHqbnJitEt
+3HhGScqWv3O05AdC6/8AfJkxV/RdGbSBMGuPP83Zj5Nm3bu9Gb+9Umga3a+ItJg1mySSOC537FmA
+Djy3aI5Cs46p61oUudtWHZBRRRUjCiue13xrZaFqiaQ9jf31y9uLrbYwrNiMu0eSPMVvvL6VS/4W
+NB/0ANd/8Ax/8eoC6Ouorkf+FjQf9ADXf/AMf/HqP+FjQf8AQA13/wAAx/8AHqLCuu511JXG3HxP
+0+zha4u9F1qCFMbpJbVUQZIUZZpgOprq9PvYtT0+21GAMsV3DHcRq+AwWVQ6hgCRnB9aBk9Zuu6F
+p+vWn2W+XBXJilXh4z6qf6Vp0lAHkuqeCPEGmTbYYTqMBPySQj5vbcmQRVvRfhb/AGkpvPEPmWrl
+/lt4ypYx443EZwa7fxdf3el+Hru+sX8q4i8vY+A2N0sanhww6GrmjTy3WkWN3O2+ae2hkkbAGWdF
+ZjgYHU1paXJzaWvyisrnh/jTR7fSfE1xptvGttAiRLa+buKspVWLbj3znNV/D72Ng122ovBJFPCy
+BAS3z7sqQFHavY/GumaDeaUbnWrYXJtwRbIZHTMj8KP3csZPqeegNct4R8G+CtXt5be908PdQHdn
+z5lLxt0OFn/hPB49KwlXgqipN+9JXOiGEqzoSxCX7uElF99TidMtJtb1COz0OF55y4y4BWKMA53s
+x9K9+jGFAznAAzXBXXinS/A1/N4d0zSf3EAQ7/tL8l0WTGJElI+9/eqa2+JpmkKPpZjG3crGfOe3
+/PEVb03MLHdUVxp+Iqj/AJcP/I3/ANqpF+I0ZPzWO0evnE/+0aV0B2dFcf8A8LEtv+fX/wAiH/41
+UVz8S7aCIyCz3EY+XzSOv/bGi6A7WisjTdfGoWaXYg2bxnbvzjgHrsHrWG3xItlJH2TkHH+tPb/t
+jT6XA7OiuAvvistmiOumeZvOAPtGP/aBpr/Fnyw2/SsMF3Kv2jr7f6ipc4rdlRhKV7LY9BorE8Je
+JG8UabJqDWv2MxztB5fmeZnasb7t2xP7/pTde8X6f4euRa3cFxM7RCbMCowCksv8cif3Kq5Ju0Vw
+0fxg8MyyLGLa+Bc4BMcWOf8At4pZvi74bhdo2tr4lTg4SL/5IoA7iiuEHxj8MswQWt/knH+ri7/9
+vFbMvjjSobQ3ksNwqKoYqVj3fN0X/W4z+NAHRUVysHxF0WeR41gulZEaQ7lj+6ozniY0q/EPRGkW
+IQ3QZyQMpH2Utn/W+1AHU0hrnZPHWjxQSXLx3ASJo0c7U480sFP+s/2aS68daVbxpcLBc3ED9JoU
+R1B9D+9DD8qAOeaSPRvEV3PfCS3H2h5baQqfLO89S3411dpr8cqB3IkQ8+ZGQR+NX4/smr2EM8kQ
+eC5iWVY5lBIV1DDcOecGuf1XwbbQKbrRna3lLKpgLEwtvYKcjkjrSnPlhJ2vZNkVOZRbjq7bFbxR
+eWMrFLKZUfUI1iuWUkF44myq/KM5+Zl9wTWZew2Om6vBLah7FHt0IgVMs68/NuzjnFdLqFnoum27
+X08Zi8vbtMeS5KkbVVeck7f6n1rkdY1GPV9Rs5reTzyYzF0wwOScHP1rmwFeOJUqihyyv7z7jvV5
+VGo47vSOxrPo+pJF9veOS6jYB42hVFuArDd1SQZ/I02x8VXUMclukrSTLwkV1tjkH1NdTpF3CLG3
+tpW2SxRqjK3qoxUmo6LperLtvrdJTjAfGHH0dcGuvq3YerSV9inp3iWznVIb0/ZrnADLJwCfY1so
+wblTkeorhNf0Cbw9Zm7tLk3FmGVDbXC7yu44+Ru1b/g2Tfpbj+5MwAyTgYU98+tK2m421fRG9RRR
+QAUVzXiTx7o/he/j07UIrmSWSETqYFRl2szp/HKhzlD2rHHxl8MFxH9lvwSccxxf/JFAHe0VwR+M
+3hcEg2t/kHH+rh7f9vFJ/wALo8L/APPrqH/fuH/5IoA76iuB/wCF0eF/+fXUP+/cP/yRUtv8X/Dd
+1IY47W/yFLEmOLGAM9rg0BudzRXNxeO9Im3lYbkbCAcqndQ3/PX3pW8daQoP7q444I2p/wDHa1jQ
+qzSlGLaY3Fo6Oiuf/wCE20rGfKuMdfup3/7aUW/jTSrm6itI4rgPO6xqSqbcuQoziQ+tN4aqt4ML
+M6CiiisRBWPrfhfT9e1DTNRvJJkl0eb7RbrEyhWbdE+JNyMSMxDoRWxXD+PtR1Cz8SeEoLO5mt4r
+q+KXEcUjIsq+baDbIqkBhhj19aAO4ooooA5TxiLW5vLC2vdT0e1ggk+1PaaqgkL5juYRJsa5iDrl
++FwORndxtpvhmy0Vda+2adf6LNLHayxNb6Pbx27Mskluxkl2XVwWCmIAcfxVv3un3d1KJINSurJQ
+oUx262zKTkncftFtM2efXFV7WS8sNVi0m5upL9Lq3muUmnWNJIzbvbxsn7iKJGVvtAI+UEYPLZG0
+A1qKKKAGTGVYnMCq8oUmNHYorNj5QzBXIGe+0/SuPFrfagt3e22h2rIs0ySwQapcQRXksTMs++3W
+0ihkLSK0bGZfmxzlMGuzrlGsbjUpri70uy225uJ4/wDkL3tjukhleGd/s1pE8S7pUY5B+b7x+Ymg
+DoNJmguNKs7i1SOOCW3ieJIciNUZFKrHuSI7QOmUX6CrdQ2kfk2sMPlR2/lxonkwnMce0AbIzsj+
+Veg+UfQVNQAVU1YOdKvBHHHM5t5dsUyNLG52NhZIolZ3U91UEntVuqmrW91d6VeWtjJ5F1Pbyx28
+u4pskdGVH3JlhhjnIoAwtOPhqWW2cWGpI5aNoLa8tb94LWTI2bI5UktoTH0DJgKOh211Fc/NHqd7
+HZ6fb6V/Z32G4tpPPaWEQRxwOnmpaeQzynfFujUNHHlGO7H3T0FABRRRQAUUUUAFFFFAHH/FD/kA
+W/8A1+J/6LmrsK4/4of8gC3/AOvxP/Rc1dhW0/4NP1n+gurMnxTDNcaDdQ28bSyN5e1EBZjiRCcA
+ZPQVwqyXieIPClhd2ktt9l/tHa8oZfM8yPecBlX7v1NehatrNhokMVzqLmOGWTyfMClgrFXcbguW
+x8mOBXL+KLi3u/FfhK4tZUnif+0tskbB1OIUBwy5HUVzewftY1rtacm2jOh4q2EnhnFO8/aKV3dO
+1vyNqiiiug8wKKKKAOE8M+I9TsfBWn6fbQm3jcXCi7OcuDPIx8o4AG3dg9fwNdZZeJ9YSzgT+xrm
+42xIPPy58zCj58+S33uvWmfDSGG48AabDcRrLG3n7kcBlOLmYjIOR1FdYiJGixxqERAFVVGAAOAA
+BXC6FX2kpKq0nsrLQ9tYzDKhCm8NGUovWXNJc3npr8jnP+Ep1j/oA3P/AI//APGKP+Ep1j/oA3P/
+AI//APGK6WqOrazYaJDFc6i5jhlk8nzApYKxV3G4LlsfJjgVao1pOyqyb/wx/wAiPrOG/wCgWH/g
+yp/mcVDqFzqPxDM91aPYuui7BFJnJAuc7vmRPX0rp6xL2SOb4kRyxMJI5NAVkdSCrKbokEEdQa26
+6KacYpN3fc83EyjKo3GPIntG7dvvCiiirMTm/iJ/yJ2of9sf/R8VY1n4x8RQWuiafHbvBBDBZ+XA
+isst2iCIL85UnbIYzjYOhx81bPxE/wCRO1D/ALY/+j4q6fwzb29x4W0P7REkvlWVpLHvUNtdYU2u
+uejDsacJxpyvKKlob0lePzMj/hNdf/6Fi8/OT/5Fo/4TXX/+hYvPzk/+Ra7Cij2lP/n0v/ApGln3
+PO/E3ijV9R0O5s7rQrmxik8vdcSb9qbZEYZ3QIOSMda7Tw9/yANM/wCvO3/9FpWf49/5FO+/7Y/+
+joq0PD3/ACANM/687f8A9FpVTlGVFOMeX33pe/RdwW4a9DDNo9550ayeXBLIm8BtrqjYZc9CPWsf
+wDDD/Zs1x5a+d57R+Zgb9myJtu7rjPatvWv+QPf/APXtN/6A1Y/gH/kDzf8AXy3/AKBFXmzS+tU/
+8Ej0qUn/AGdWV3/FgcX4ujgXxvezXS7wnkyIjD5WxDEP6VW1GeRkW43KQvRAABt644ro/GlklzqF
+zIB88YX/AL52LmuDtLwMNjSB4Tkox6Y9D71vCEZ1HGp1Wj7HHF2jdK7jq4/zI2IIpLqJZoBuR+h4
+/wAad/Z14x4jH1z/APXqDw3qcEdy+mO+fMJaJjjaMds11AXaeKL20ZM4pNqLujAOk3uM7R/31VHV
+dPuorGSRlBC44Bz3/wDr112fxrI8RX1pZac5nOGk4jQdWIIz/Ki/kSlY6nwn8+iwZ7AfqkdcJd6X
+eea+3bje3JJ9T7V3PgyYTaJA4+64BA+qJXF614gs4FmSP5pt0iFRxtIZl5/KqfwxF1MGaRZ76OEs
+Ntqp3EdC9LLBJOCyHcQVUD+8x5b8hWPukaYBfvE5J/8AHmrpNGgb7ILufOZSSi9lToPxYCs5xtZn
+RSrKnGStqz0T4XwvBoFwj9ftjn/yHDWX8R4pW1aGRUYobVUZgDjl5uM1u/D7H9izYOf9Kf8A9FxV
+U8ba9bWF4unSwvI0sCybyP3W0u42sfX5ar7KtqZR1k7s8gk0y7jlKrE0iZ424PH6U6PRNTuRv8pk
+ToGk44/WvUrK90CaNBbvAhAHyZGQTnj5uatSHzWETIjwbenv9e1Z+2ktOU2WGVr83Q8xsvC90Zo3
+uCgVXUlc9QDk/wANdNq1kdVjjsgWEe4zy4IUcfKgz+HSro1C2s79d9pIIYpGVnlGFkUcHbn+7TNR
+1RL+1kMBLcuI9g2l0/g3e9aptowcUmZFvpFtpVrczR+ZyogDOSR87qWAOAOi1Z0+1SJjeXLhY3yq
+d8k8dAprUlnS5sIn1NBEyBW8ssGGQPb61Tl1DyfKmF1BbxnnCt5ku0cYSOMNyffFNPQTKWtSyWWl
+3E0oHkzXkIUHnciRtzgH+81VdIv7VZQ0fyhweVPy9zyCxp2pakL6ZCVZbeBAkMUh3Hn7zv15NZIW
+3ti0kKCMMckk4XPPrxRcR7vpLB9KsnByGt4jn6otT3ALQsASpIwGGMjPcZyKp+HW3eH9Mbg5s7c8
+dOY0q84BGD0PFTUh7SEoXtzRa77oDG1h0hit7l5An2e4jkVTkmQ8p5a4yckN/kc1T1LRtI1N/M+w
+XEM/aeBPLbPPLcqDVa51S3u9bg04jcLO5ERVyWy5ZdrHK44AIByTzXXYrny/Dzw1NxnvzOwS1d0c
+FJbeJNJnSFIpdQhfOzenzjH95kLCrlj4pSOQ28rvaTDgwXIxg+xNdliql/pGn6nGY76BJh2ZgNw+
+jDkV283kTy+Zz/ijUY73w7cxsuH+RlI5U4den4VL4Fk3WdynpIrf99L/APWqhq3gq+t4JF0O4LW7
+j57aZv8A0FiP51r+ENKn06xMtx8r3AXMeQduzI6jI70Ow0rG/RRRUjPHPjBBLN4rtfKRnxp6fdBP
+SW4rz4lwxSQc/wB08GvcvGWrWlnqcVrqVitzaSQKzTfxqxeQbQTgds9awpPBnhnxCHbTrooDtdSM
+NLGf4g0bYJB+lNRuB5lGsNyAkjFJP4WIzn6jv+FNksp0DNgOqfeZDuA+vcfjXo17D4W8Dov2bSpt
+UvQQEuLkAoCT/CCGAP8AwGnarr/hiZbjT7iw/s26lIJkADGOTb/y1xjKrzT5bCPMgCuG/I9uK63Q
+dKNnplzdzj55YzgH+Fef8ai/4Q+7+zW+otIJbSe4VIDEGdWjP8bHHy5x/Fiuh1NBDpsq7sFht/Ec
+V14SinGpUfSLS+4uC1M4Tyq88aNgblHyjLZCKKntbe4wwK8Mc5br0q7bRQRrlgqSA5fP3icDrTZ9
+WsbT55pkXHqRn8q7cNCNKjDmmvhvv3KeruJHHcpEIsrwMZ6nFTaNbvHq9izncTcwnP8AwNay08U6
+ZM+0TAYPVvlHt2rZ0e5E2q2LIMhriHBHTG9aqThKMrST0ezEen0UUV4ZAVj634X0/XtQ0zUbySZJ
+dHm+0W6xMoVm3RPiTcjEjMQ6EVsVw/j7UdQs/EnhKCzuZreK6vilxHFIyLKvm2g2yKpAYYY9fWgD
+uKKKKAKN7pFpqEomnkukZVCAW93c264BJ5S3mjUnnrjNPsdLs9O3m2EjPLjfLPLJcSELnavmzvI+
+1dxwucDJ9TVuigAooooAqatff2XpV5qezzfsdvLceXnbv8pGfbuw2M7euKyl0fS5tcv7UC8ikMcF
+9NLFqF3GJHuWnh/1cc6qNq2oA9sDAArV1ax/tTSrzTN/lfbLeW38zG7Z5qMm7blc43dM1mJpPiSP
+UJtRGpWPm3EMNu6mxl2hYGndSB/aOc5nbPPpQBoaHdLfaLp96iNGtxawzKjyNKyh41YK0r/M5Gfv
+Hk1eqppNj/ZelWemb/N+x28Vv5mNu/ykVN23LYzt6Zq3QAVmeIBdf2eXs9Lh1mVGx9knkSLKyK8T
+lGljkTOyQgg4ypPPY6dUdYGrtZFNE8kXLsFLzuYwiH77IRDON+Pu7lIzyc42kA5rR4dOutQiSDw/
+otpcRMsxU+ZBdxorL+/iguNKt5CFJ+VuBu43Zrs65m00fWDdQ3Gq2lvfOkiOZ7nUJZthUjEsVqNP
+htlkQfdKIh9+ST01ABRRRQAUUUUAFFFFAGbr2g2fiGzSyvXkjjjkEwMJUNuCsv8AEr8fPWD/AMKv
+0D/n4vP++4//AIzXYUVpCtUgrRk0hWTOB1b4YwrDENElkadpMSG6dfLWPa5LfJEGzuCjjPWs+fwr
+b+GfFfhpY53uJbn7f5rsAq/u4fl2IMkcPzljXp1cz4x8H3PiiawuLTU30qbT/O2yRIWc+eI1OGWW
+Irwn45qpYipOPLKV1+YnFNMtUVzH/CsfEf8A0OF7/wB8y/8AyZR/wrHxH/0OF7/3zL/8mVHOZexf
+c6eiuY/4Vj4j/wChwvf++Zf/AJMo/wCFY+I/+hwvf++Zf/kyjnD2L7lTwL4D0jWvCtjqV1NcpLP5
+u5Y2QKNk0qDAaJj0X1re/wCFX6B/z8Xn/fcf/wAZrb8LaF/wjWhWuief9p+zeZ++2eXu8yR5fu7n
+xjfjrWrVLEVYpJTdkbWRx/8Awq/QP+fi8/77j/8AjNUdW+GMKwxDRJZGnaTEhunXy1j2uS3yRBs7
+go4z1rvqKpYqsnfmb9Q5UeaaX4fj8N+OxYJMbhn0YzPIVCAs11t+VctgbVHc119ZnirwLe+IdZj1
+mx1mXSZEtVtCIY2LMod5fvpPEcEv09qy/wDhWPiP/ocL3/vmX/5MrN1HJty1bM50+Z3TOnorz3Xf
+C+t6HcwWz+Kr6YyjfJtEqlEztDAG6w2cNxkdK2U+GniCRFkj8ZXjo4DKyrIQQeQQReVEa8JSlFO7
+juvUueCq04QqSVoVL8j72JfiJ/yJ2of9sf8A0fFVrw74J0q78P6ZdSS3Aeezt5GCsmAXjRjjMZ9a
+zbj4T61eQtb3fiu6nhfG6OWKR0OCGGVa7I6iu90mx/svSrPTN/m/Y7eK38zG3f5SKm7blsZ29M1N
+WnCtbnje3c1wtathL+ym4uW9jF/4QHR/+e1z/wB9J/8AGqP+EB0f/ntc/wDfSf8AxqulorL6pQ/k
+idP9p4z/AJ/TOG8TeFdP0XQ7nUrWSZ5YPL2rIylTvkRDkKino3rVrSvBel32mWd7LLcCS5gimcKy
+BQzorHGYzxzV/wAe/wDIp33/AGx/9HRVoeHv+QBpn/Xnb/8AotK1eDw/sVL2cb87X4IX9p4y/wDG
+mZX/AAgOj/8APa5/76T/AONVr6RpFtots1ras7o7mQmQgnJCr/Cq/wB2r1FRChSpvmjFJkVcbiK8
+eSpUlKPZnGeIhu1S6Udwo/ONa8bEv2ZmTHKOcqfukdOlexeIW/4nNwP9z89iV5P4j02fTtSk3jMU
+ztJE/YhjnH1FUt2YXa2KahywKjLD5k64z1r0bQtaj1a1zxHPCNssWemOjD2NcVpItri3cPIEuIju
+jU89CCeO/wBK0Y55rbW7bULWBmiA8q5EQ4wTjOP1pyak7DSOwvrqOxtJbyQFkhQuVHVsfw9q801X
+VLnV7lrifgMNqIOir2ArrvGBlks44YCSRlii/wAQHSuKksLtbX7Y8brHnbkqQM+lCWgmeueAp1Xw
+7a5PzEKAPwC5rzHXrVodYu5D0lup9q+u1zzXpHgorDokMIxuiVVYE4IOOf51yvi6wd9REkCj/WnJ
+HQFiabdkhI5azgea4W1U7ZJn8vnoB1euzZRHGsa8KgCgDpgcVm2UQGoK5RFMCeUcDO5gMM+Tjqa0
+JW4qZajR3vw9/wCQLP8A9fT/APouKsjx+In1iGOTvar24+/LWt8PDnRZ/wDr6f8A9FxVk+P3A1q3
+R3AVrdPk7sd8vGaNooOpyF3bQwRGWVQuz0A3N6Bf8a0tF1z7Jay2qyFHlcZR8vuQdg5zjvmql1LH
+IqRIGlcyLvKcgY5256dqnRrW0s0c2/8ApMsjl5Hb/VxrgbRjI5zQtehV2iO7nbUtu+UpIXEciADL
+AdCAP51YIt7GIfNtC4wpH+eaglmihmxBtG7G4g78D0yB1+lEdldXzNcRwyPFCQg44Un+83QtVvQl
+O5WnubnUJmeTKxIAfLPU88E1RkKQLvldYl5PzdevbHNad1DcWzeVIu0tnjPJxz2zWbf6FNfJ5oXE
+qc/NnJHoR2qb3BpozLnWIQCtspZjx5j8Z/4DUVtBLrGpJb78GXJ5OQu1S39Kp3MbxSsjLsZeCD2q
+9pen3Nysc2ly/wCmKWBi+6QMYzu9xmmI+gNAhNtoOm25OTDaQRkjvtjVf6Vbnmit4nnndYoolLyS
+OQqqqjLMzHAAA71T8PrMmg6alz/rls4BLzn5xGm7n61D4i/fW9ppg66heQwkH7jRxE3dxHJ6rJBb
+umMHOcHgmmBlSzarcTwanaaPb2/2kKyi9nMF196Nh50cdtOqNwf4ycdcH5a17HUr9r86dqtrDayv
+D9otmgna4WVUYJMCWt4CpQyR9Rzu46HEmr/Klu+M4uIx9ATUOpfuNa0e6Tl5pLiwYHp5csL3bEf7
+W+xQDtgnjphXu7DtojWooopiENAGOlLRQAUUUUAeafEvxIdJ1yKyZS6SWSyYIDKSzzJ0/wCA9a8v
+h1O9glMsMjRtnIwTkew6GvSfipoT6jrtvdrIE22iRAEcEiSduv415/caFqEI3GLzB/ejOf0607gX
+7PxPdTSLFqV5cRRcbpEAlYYPYPg120eo/DLVNLTS7ifuXM1wrrOXY7ncy7TyfTNeXNCMhAGR84O7
+j+dIbZl3Hghfvcg0uZgdAPGuqWM09rp0gbTsGCO3cfIYlJ2N1yG9xXUadd6LrejtepKwuogqzWtw
+dqkbgPkZc15yqK42AEyMQEAGetX9JsNS/tZLFEeKViN8ZyOARyw9K1hWlTTV2ovca10XU7DxPo9v
+dXF3Hbxok4VcSRu0mTgd64CGwuZ2xj2Jb2r1C40fU4r+5lSSOVXIx5SZHA69c1ktokUCGZ2GM4IH
+ynJ9utc2LxtKMIRh8UbqWjSOmnhub4tjmbbQXAJLnJGD0I/Wtrw1Z3tnrmmRpMxi+2QZRuRjzFzi
+pWh+zYaI8HoGORWhoTrLrNiMbWW5hJB9nXpXBHGYjmXLL3W7aHS6NKMX7vQ9aooor0zzArH1vwvp
++vahpmo3kkyS6PN9ot1iZQrNuifEm5GJGYh0IrYrh/H2o6hZ+JPCUFnczW8V1fFLiOKRkWVfNtBt
+kVSAwwx6+tAHcUlLSUAFRpOjcbgDkjBPORTzWKjxz3UxERzE7AuSB8wPHy5zUt2a+YdG+xtilpq/
+dp1UAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUN5dR2NnPe
+ygmO2jeZwuCxVFLHGSOeKEr6ATUVx/8AwtDQP+fe8/74j/8Aj1H/AAtDQP8An3vP++I//j1bfVq3
+8jFdHYUVx/8AwtDQP+fe8/74j/8Aj1H/AAtDQP8An3vP++I//j1H1at/IwuhfE2laadZtHuBO8mq
+SiJikiIqbfKiBCmFyeG9a6ews00+ziso3eRIRtVpTubGSQMgDp0HtXBav410nVL3TryBJo00+XzZ
+VlCBmG6NsRgSNk/uz6Vq/wDC0NA/597z/viP/wCPVzUcJUVas1Taaa6d0mzuxVdzwuGi5392V1e9
+uWTjH00Oworj/wDhaGgf8+95/wB8R/8Ax6j/AIWhoH/Pvef98R//AB6un6tW/kZw3R2FFcf/AMLQ
+0D/n3vP++I//AI9R/wALQ0D/AJ97z/viP/49R9WrfyMLo0PHv/Ip33/bH/0dFWh4e/5AGmf9edv/
+AOi0ri/E3jzSNa0O5021huUln8va0ioFGyRHOSsrHovpXaeHv+QBpn/Xnb/+i0qpwlTopSVnzv8A
+JAndmhRRRXOM4XxI+NbuR/1z/wDRaVlXUEF7C0FwodXBXBGSM9wa0PE7Y166H/XP/wBFpWbv461H
+VjONTRILFb171trxA/ZmB29OhP51LomquY5LFjvZzlfUnp6+pqz4pt7mcCO3QuHUM2O+OKyNHtpr
+S7DylE3jbgupbnpgAk5qtLXA6y9iuIxb3TDf5UYSTHVSOc/Tmn6fJp2uwz2t2wMUMi5Rn2kqvO7J
+96mhuxPZPK/30RlkAPQgf161xrWVvb6rAl++yORldtxO1lPOc8cUugHT3LGF5RC5SJThSjZB9+Ki
+uHacxWcbZIBdjjGCBxmkS8SFGhs5lmtyxlPQhkHIUHH4fhUNlcKfNvJCczEhe/yilYCiLq4trtjI
+vmMGO7Aqwup20wxnY3oaYxK3jXG3KknA9c+1V7lYJjuEexvVeppsD1T4bsG0OcqQf9Lfp/1zhqp4
+20x9U1NbeNxuNoPkxg4EknO709qk+FaKnh64C5x9sc8nP/LKCt3UYV+3CcgbvKCZ743E1M5OMLou
+nFTlZq5wT6LfQKE2AKgAAjxzj64qEwTRAiJXQ9/lB3fXPFdvIFI5H51QnWMDkCudV5o6vq1N9zk0
+02Z3yqbSx5OMHn+VdBpdlHY22xByTubnOW9aWe5tLYb53WNR1JIH86pHWradVa1LtE+7bJtO1tvD
+YOKHKpU6BGFKl1RV1G3t5dfsrgxs80g2ls5X5WX+HP8AtV0V1rWmxzXVm1uvnLIUMZBXKLj5t2Md
++1ZkGm29xcW95NOnmQ8qqsDgEgn89tS6ystzfRmA+YRFgsDnBJJ610U04xSZzVWpTbRz3inw8Ndv
+rc6XFDabIT5vzZ3ZPUkDNSaV4N07SGFxeSedNjhmJQDPB2ovNaAuxaysZpRaL5S7iQWdyGPEa4Yk
+/Ssy78/UZGIL29t/CN2J3Pq7DO36Cr06mbPVdNCLp1qsf3BBGFxnoFGOtQavazzGzvLZfNk064Ny
+IMhTKDDPbsisxChts5Zc8EjBKg7g/RE8vRrCPJO21hXLHJOEXqe9XDTEc5qHiO2ls/31nqNrNHMo
+aKSyuH2lJNp/ewRzQsDjIKuc1bjaXWtQs7pbeaCxsGkuEkuEMLzTtG1ugWKT94EVJZd29EJOwrlc
+1c1fI02cqMlV3Ae4ORVqNg6Bx0YAj8ahRtOT7pfgPoPoooqxBRRRQAUUUUAeefEIn+3IBk4+yrxn
+jO+asCORjGEOODkHv2roPiCM65B/16p/6MlrARahvUB0ltaXCYuIllznIZR+hrOuPCmnTDdA727H
+oB8wH4GtZRUigdT260KVgtc5NfDM0sggtZt85l2qcYVR/eyORXp2k6WYbFY2c3F95YSe6YDzGQZx
+t9q57RGjiY3bIGDuTg49625PEkGnxxhAZpWBwIztKKv99m9c15GIxlWpVUEn7NX5uX8z0IUFSgpJ
+e/6k8+jtDaJcpxgDd6g9c9axNXmi+zpO8imVSykZBJ24KkgZ55NS634pv9TsWRFS0twMmQlssfTj
+HpWESZp0baBnGc/QZrS6px11uuptGrOpC0rcyd0zVsdPg1O3E+4Bdu/bjJ684HtV6x0CSDVbSW3Z
+ZoormFiwHQb92cfhVTS53jkeGNcJD8yPg4K/hW1pF+q38YypM0qLtDdNzCoi4KcVZrVWaJk5OLd+
+jO0ooor2Tywrn/EnhT/hINV0XU/tX2f+xbj7R5fl7/N+eF9u7em3/U9cHrXQVx/jXX9W0jX/AAxZ
+afP5MGpXhhu02I3mJ5lquMurFeJG+7igDsKSlpKAENYsX72+uJ14VSYQfUgszH9cVtEViwlorua2
+bDAM8wI7B2bKn8aiVrxv5j+xK3l+ZtL92nU1fuinVYjG1TxNDpmoHThZXV3KsKXDNb+SFVZWlRQf
+PuITnMLdBWjp17FqWn22owBliu4Y7iNXADBZVDqGwSM4PrXL63/yNNx/2D7P/wBHX9bfhP8A5FbR
+v+wfa/8AomOtJwUacJdZc1/kyIyblJdrfiatFFFZlhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
+RQAUUUUAFFFZM3inQbeaS3mutskTFHXy5DhlOCMhCOoqZTjD4pKPq7GlOjUrNqnCU7b8sXL8jWrP
+8Q/8gDU/+vO4/wDRb1avLy2sLZ7u7fy4Y8bmwWxuIUcKCeprA1nxRoV3pF9a29zvlntpo418uQZZ
+0ZVGSgHU0/a06c4qc4x1T1aQ6eHrVouVOnOa2vGLkr/Ig8E6NpF34Ysri6sbaeV/N3SSQo7HEsgG
+WZSegrc/4R7QP+gZZ/8AgPH/APEVk+Dry2sPBVnd3b+XDH5u5sFsbp5FHCgnqau/8Jf4d/5+/wDy
+HL/8brTEV1TqzUqij7z0crdRUsNWrR5qdKc1teMXJX+RZ/4R7QP+gZZ/+A8f/wARR/wj2gf9Ayz/
+APAeP/4irV5eW1hbPd3b+XDHjc2C2NxCjhQT1NZn/CX+Hf8An7/8hy//ABus5YhQdpVFF+crDp4a
+tWXNTpTmr2vGLkr/ACItQtfC+nXNpaz6Vbs98/lxFLeEgHKL82QP74q9/wAI9oH/AEDLP/wHj/8A
+iKzvElrcz6roskETyJDcbpWRSwQb4TliBx0NdDShVqOdRNu0WrfcVWpU4UaEo/FOMnP5SaX4Gf8A
+8I9oH/QMs/8AwHj/APiKP+Ee0D/oGWf/AIDx/wDxFaFFac8v5n95hYz/APhHtA/6Bln/AOA8f/xF
+H/CPaB/0DLP/AMB4/wD4itCijnl/M/vCxn/8I9oH/QMs/wDwHj/+Iq9HHHDGsUSiOOMBURQAqqBg
+AAdAKdRScm922AUUUUgPPfFCyP4guhGrN/q+gJ/5ZpWeba6C5aPYP7zkKP1NepUVNn3Hc8e1PTYr
++2aCaaFCejhtxH02A1n6boWm6ZdLci5eeVQQP3YwM9/mxXuNFHK+/wCAXXY8ZZ4YrjMQdoZVKTKz
+YyeoIwKciC9lEdrapJIo4yN5Cj3Y10nxe8Tf2ZoyaFaybbrU/wDW7ThktlPzZ2urDzG+XkEFd4qr
+8GfEf2mwn8M3B/eWWbi146wu37xeEA+WRs5LZO/0FR7OT+3+BXNFfZOVu2lV5Ld1EROUdVAHX6fS
+o45HCbMnC8D6V7xRS9k/5vwHzr+U+fLhJjIzMzCJvu7TyKqqkiNnfgjp6/jX0bRWiTSs3chu7ucX
+8KJHk8O3Jc5IvXH/AJCgrf1Vwk65YKCg6kDu1atRyW8ExBmjSQjoWUH+dKcOeNiqc+SXMcNr/iax
+0WT7NNIWuCAwhQEnB6e3NczPrPiPV2Isovs0R/5aSfKf516rcaHol3L591p9rPLgDzJYY3bA6fMy
+k09dJ0pBtSzt1A7CJAP/AEGpjRUTSddy2ujymDQY2Il1GV7mXqQzHZ+Aq3cWlu0GyOIho1Ig8s4C
+85wy5AINeiajDo+m6fc6jPZxNFaQyXEipEhYrEpdgoOBnA9a8Y8IeL2i8XLd61sex1CR45on5gt/
+PbcrxrLJtRUbAyc4TNWotGTd9zeto3kYPepKigY8q2QDp6GTAxUsq3Lyf6L/AKFEvTLeY7fXqor0
+3+zNN/59IP8Av2v+FJ/Zemf8+cH/AH6T/wCJpu76iujy6CyWHa5dpZQCN7ktwTn5Qen4VM3BBP8A
+9evS/wCytL/587f/AL9J/wDE0h0nSj1s7f8A79J/8TS5QuGk/wDIKsv+veL/ANAWrVIiJGixxqFR
+QFVVGAAOAABTqoRBexedayRf3xj8zRZZ+yxbuoQA/hxU2KAABgdqAFooooAKKKKACiiigDiPG2nX
+93q8MtrbTToLdVLRxs4B3yHGVB9axV0bVf8AnyuB/wBsn/8Aia9RqGO7tZp5rWGaOSe22+fErAvH
+5g3JvUHK7hyM9alwuFzzpdG1PvZ3H/fp/wD4mnto2pshT7JOMjH+qf8A+Jr0iijkC55amja1GjpD
+aXKk4AHkv17kErVnSvCdyJjLdwTDbgkMrYc9e47V6TRXL9Rim2pPXyOj61LlUbbHH61pznTfs8dj
+JPI+FUpEx2j8BWFH4f1LO9rOf2Bjb/CvTaKJ4GM7e+xwxTh9lHmUGk6sX+ayuFAJABicDB/4D7VZ
+07S9Rj1a0keznVFniZmMTgKA65JO2vRKKFgYpp8z0B4pu/uoKKKK7DmCuf8AEnhT/hINV0XU/tX2
+f+xbj7R5fl7/ADfnhfbu3pt/1PXB610Fcf411/VtI1/wxZafP5MGpXhhu02I3mJ5lquMurFeJG+7
+igDsKSlpKAErFh+a8u3XJQvtBx1Kghq26x2/5CLRZbaZACB0w2Calx5pJduZ/gH2Wu+n4mwvSlpB
+wMUtUBx+t/8AI03H/YPs/wD0df1t+E/+RW0b/sH2v/omOsTW/wDkabj/ALB9n/6Ov62/Cf8AyK2j
+f9g+1/8ARMdb1P4NL/t/8zOHxz/7dNWs3xBf3WnaY1zZeWJ2ntoEMyl0H2ieGAsVV4ycCTP3hWlW
+N4t/5A6/9fun/wDpbbVgW9ir9q8U/wDP5p//AIBTf/LCs3RfEXinWPt/7/T4fsF7NY/8ekzb/J2/
+P/x/LjO7pWzXN+C/+Y7/ANhu8/8AadXyowVSVnqbkOqa/Dqen217NZzwXs7wOIbaSF12wXE4YM13
+MOsOPu10lcxP/wAhjQ/+v2T/ANIr6unqZKzNabco3YUUUUiwooooAKKKKACiiigAooooAKKKKACs
+az8M2cF5e3d2Irz7ZKZVWWJT5eWdiAWLZzu9ulbNYegale3upavb3Um+O0n2QrtUbV3zDGVAJ4Ud
+ayqcjnTUldtvl+46aHtlSrSpy5YxjHn7tcytb5mzNDDcRmG4jWWNsbkcBlODkZByOorH13SdLh0T
+UJYrO3jkjtZ2R1iQMrCNiCCF4IrbrP8AEP8AyANT/wCvO4/9FvWsYRlON0nqt0YRqTgrRlKPo7GZ
+4IhhuPB9lDcRrLG3m7kcBlOJ5CMg5HUVrf2Lo/8Az4W3/flP/iazPAX/ACKdj/22/wDR0tdBVV4x
+lVndJ+9L8whUnBWjKUfR2GTQw3EZhuI1ljbG5HAZTg5GQcjqKq/2Lo//AD4W3/flP/iau0VDjGW6
+THGpOCtGUo+jsFFFFMgKKKKACiiigAooooAKKKKACiiigAooooA4z4qadp8nhG/1GS2he8hWBI7l
+o1MqKbiL5VkI3AfOe/ej4V6dp8fhGw1GO2hS8mWdJLlY1ErqLiX5WkA3EfIO/arHxR/5ETU/+3f/
+ANKIaPhd/wAiJpn/AG8f+lE1AHV0UUUAFFFFABRRRQAUUUUAQ3Vpa30DWt7DHcwSY3xTKJEbBDDK
+sCDgjNeS+CdJ0q7+JOv2N1Z289rB9s8q3kiR402XUaLsRlKjCnAxXsFeVeAf+Sp+I/8At+/9K4qA
+PVaKKKACiiigAooooAhu7qCxtZr26by4LaNppXwTtSMFmOFBJwB2rg/h38Q7nxJq99pmqsqNMzXO
+nIdgKxgndb7h5e8quCvy5IDEmun8X+Hp/FGjNo8N59hSWRGmfyhNvRDuCYLpj5wrZB7Y715R8K/D
+Mutau2rQ3rWbaNNbylEQsZlkMm+PcJE2hljKng5BoA9yooooAKKKKACiiigDP1/WYPD+jXesXI3J
+axlgnI3uSFjTKq+NzsFzjjOa8V8BeMJ9K8XG91KbMGryMl+7EIm+Vtyzkbo412yHk9lLYFe6XVpa
+30DWt7DHcwSY3xTKJEbBDDKsCDgjNeS+CdJ0q7+JOv2N1Z289rB9s8q3kiR402XUaLsRlKjCnAxQ
+B7BRRRQAUUUUAFFFFABRRRQAUUUUAFc/4k8Kf8JBqui6n9q+z/2LcfaPL8vf5vzwvt3b02/6nrg9
+a6CuP8a6/q2ka/4YstPn8mDUrww3abEbzE8y1XGXVivEjfdxQB2FJS0lACE4rmtHme91iVySUDPK
+cfkv6GtfW7wWWnSyZw7DYnrub0ql4XhhEE1zCSVd9ilhg4Uen41K+JvtG3/gX/DDt7vz/I3BS0gp
+aoRx+t/8jTcf9g+z/wDR1/W34T/5FbRv+wfa/wDomOsTW/8Akabj/sH2f/o6/rb8J/8AIraN/wBg
++1/9Ex1vU/g0v+3/AMzOHxz/AO3TVrG8W/8AIHX/AK/dP/8AS22rZrlNevtW1SS80ixtLfy7G8tC
+Z5rl0ZmhNpf48tLWQAENtzu96xRcmktS/XN+C/8AmO/9hu8/9p1pef4j/wCfGy/8DJf/AJArN0XT
+vEej/b/9Hspvt97Nff8AH1Kuzztvyf8AHk2cbetWcy2Zsz/8hjQ/+v2T/wBIr6unrjJP+Eje8sbv
+7HZD7DO0+37ZL8+6Ge325+w8f67P4V1Gk339qaVZ6ns8r7ZbxXHl53bPNRX27sLnG7riplubUvhs
+W6KKKk0CiiigAooooAKKKKACiiigAooooAKzNK0b+zLy/u/O837fL5u3bt2fNI2M7jn79adYegal
+e3upavb3Um+O0n2QrtUbV3zDGVAJ4Udazm4c9O69675fLTU6KKqOjXcJJQUY+0Xdcytb5m5Wf4h/
+5AGp/wDXncf+i3rQrB8aatDpeiTpPFI63sctqjx7SqySRtt37nVsHnoD0remnKcUu5zsb4C/5FOx
+/wC23/o6Wugrk/hxqlvd6GNNjVxLp+fNZgNp86SZ12EMT0HOQK6yqrpqrO/8z/ES2CiiishhRRRQ
+AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBynxR/5ETU/+3f8A9KIaPhd/yImmf9vH/pRNWB8Zptdt
+rCD7Pcf8Se9xb3Vvsj4mRvPjbzDmT5gvQcDZ71D8GbzxBdRz280udEsIzFDEY1H7+V/OO2QR5baN
+24F+Nw4oA9QooooAKKKKACiiigAooooAK8q8A/8AJU/Ef/b9/wClcVei6/caraaNd3WiRxz30EZk
+hilV3V9hDMgWLDFioIUD+LFeIeEvEWvjxjLfaRBby6jrUkkbJKkjQp9olWaR8RvvCptyTzhc0Ae/
+0UUUAFFFFABRRRQBR1fWdO0GyOoapI0NsrBGkWOSUKW4Xd5SOQM8ZPGeO9eUfB7X9J0i6vrLUJ/J
+n1KS0htE2O3mPmZcZRWC8yL97FetarplrrOm3Ol3q7oLqNo34BIz0ddwYblPKnHBFeYfC7wfe2Hi
+vULrU4cf2NvtkciRQ08nG+LKqGXySTz2dTjmgD1qiiigAooooAKKKKAM/X7jVbTRru60SOOe+gjM
+kMUqu6vsIZkCxYYsVBCgfxYrxXwRruuTeOGutMjtze61JKs/mKzRxpLILmZ0Tzoj8gjJA389Ote9
+Vx/h34f2uheK9S19RGYJv+QdEuMw+b80/wAvlKEwflj2n7hINAHYUUVz82k6Vqnim9/tOzt7zytP
+sfL+0RJLs3Tahu271bGdozQB0FFZX/CJ+Fv+gNp//gLD/wDG6ZN4Y8IW8Tzz6TpsUUSl5JHtoVVV
+UZZmYpgACgDYorHfwx4QjaNJNJ01GmbZGrW0ILsFZ9qgpydqE/QUJ4Y8ISNIkek6a7QtskVbaElG
+Kq+1gE4O1wfoaANiisKfRPA1rFNPc6fpMMVswSeSSG3VYmYIVWRmUBSRIuM+o9aZY6T4B1Tf/Zln
+o955WPM+zxW0uzdnbu2K2M7TigDoKKyv+ET8Lf8AQG0//wABYf8A43R/wifhb/oDaf8A+AsP/wAb
+oA1a5/xJ4U/4SDVdF1P7V9n/ALFuPtHl+Xv8354X27t6bf8AU9cHrTLzQ9F03VtDn07T7W0la+kR
+pLeGOJipsr47SyKDjIFUvGuv6tpGv+GLLT5/Jg1K8MN2mxG8xPMtVxl1YrxI33cUAdhTadTT3zQD
+Od8UTiSSK0Xlx+8A9CTgN+Fa+kQCGwj4wZMuf+Bcj9K55ib7WJh1aWRVU+kY4GP++Sa6xQFUKBgA
+YA+lTHVt/IueijHsr/eLS0UVRBx+t/8AI03H/YPs/wD0df1t+E/+RW0b/sH2v/omOsTW/wDkabj/
+ALB9n/6Ov62/Cf8AyK2jf9g+1/8ARMdb1P4NL/t/8zOHxz/7dNWuYg/5DGuf9fsf/pFY109cxB/y
+GNc/6/Y//SKxrKO4VfhLdFFFWc4VP4T/AORW0b/sH2v/AKJjqCp/Cf8AyK2jf9g+1/8ARMdRPobU
+evyNWiiipNipq19/ZelXmp7PN+x28tx5edu/ykZ9u7DYzt64qr9p8U/9A7T/APwPm/8AlbR4s/5F
+bWf+wfdf+iZK1aAMr7T4p/6B2n/+B83/AMraPtPin/oHaf8A+B83/wAra1aKAMr7T4p/6B2n/wDg
+fN/8raPtPin/AKB2n/8AgfN/8ra1ar317Fp8KzzBmV5oLcBACd1xLHboeSOA0gz7UAUvtPin/oHa
+f/4Hzf8Ayto+0+Kf+gdp/wD4Hzf/ACtrVqul7FJqE2nAN5tvDDcOxA2lZ2nRQDnOcwNnj0oApfaf
+FP8A0DtP/wDA+b/5W0fafFP/AEDtP/8AA+b/AOVtatVJdQSCS1hnikje9uJLaIHaeY0nm3ttc/Ky
+QEjvyMgc4AKv2nxT/wBA7T//AAPm/wDlbWZpWn+KdMvL+7+yafL9vl83b9tmXZ80jYz/AGec/frp
+YnaRSzxtEQzLtfaSQrFQ3yMwwwGR3wecHin1LgpNSa1jt8y41ZwjOEXaNRJSXezujK+0+Kf+gdp/
+/gfN/wDK2qesWviTWNMuNNm0/T1W4TaG+3zHaw+ZHwNPXO1gDjPNdDVG91QWsotre2mv7kqJGgtv
+LDJGSVEjtPLCigsMKN2WwcA7Wxabi01uiDE8OaV4k8O6Yunx2WnzMXaSWX7dMu9m4ztNg+MKAOva
+tT7T4p/6B2n/APgfN/8AK2rVjqCXu+NopLW5hx51rPt8xA+djfu3kRlbacMrEcEfeVgLdEpOTcm7
+tgZX2nxT/wBA7T//AAPm/wDlbR9p8U/9A7T/APwPm/8AlbWrRSAyvtPin/oHaf8A+B83/wAraPtP
+in/oHaf/AOB83/ytrVooAyvtPin/AKB2n/8AgfN/8raPtPin/oHaf/4Hzf8AytrVooAyvtPin/oH
+af8A+B83/wAraPtPin/oHaf/AOB83/ytrVooAzNN1LULjULrTtRtYbaW2hguFa3nadWWdrhMHfb2
+5BBtz2PWtOsq2/5GnUf+wfYf+jtSrVoAyrrU9V/tWXTNMs7efyLeG4kkuLl4P9e9wiqqpa3GcfZz
+k5HWj7T4p/6B2n/+B83/AMraLb/kadR/7B9h/wCjtSrVoAyvtPin/oHaf/4Hzf8Ayto+0+Kf+gdp
+/wD4Hzf/ACtrVooAyvtPin/oHaf/AOB83/yto+0+Kf8AoHaf/wCB83/ytrVooA5TxPpvi3xFo0+j
+raaXClzgSPJd3EuAp3KUCWkGGDhWBJI4wQar+D9D8X+FdL/sk22k3MSsXSSOeaCRmYsWaZvskoc4
+2qOBgDHNdnRQBlfafFP/AEDtP/8AA+b/AOVtH2nxT/0DtP8A/A+b/wCVtS6prdrpO/7SkjeXZ3N+
+fLAP7uz8rzF+Zl+Y+cNv8xVjUb2LTNPudRnDNFaQyXEioAWKxKXYKCQM4HrQBS+0+Kf+gdp//gfN
+/wDK2j7T4p/6B2n/APgfN/8AK2rqXsUmoTacA3m28MNw7EDaVnadFAOc5zA2ePShL2KTUJtOAbzb
+eGG4diBtKztOigHOc5gbPHpQBS+0+Kf+gdp//gfN/wDK2j7T4p/6B2n/APgfN/8AK2nXetPb6g+n
+W2n3V9LFDHcSNbm3VVWZpUQE3FzCc5hboKsWOoJe742iktbmHHnWs+3zED52N+7eRGVtpwysRwR9
+5WAAKv2nxT/0DtP/APA+b/5W0fafFP8A0DtP/wDA+b/5W1q1X069i1PT7bUYAyxXcMdxGrgBgsqh
+1DAEjOD60AUvtPin/oHaf/4Hzf8AytrlNB8C6roHiO88Q29jp7/aN32W2N26pbead0mwjTf+ApgL
+hSRz1r0Cq9texXU13BGGDWUwt5CwGCzRQ3GVwTxtmH40AUvtPin/AKB2n/8AgfN/8raPtPin/oHa
+f/4Hzf8Aytq6l7FJqE2nAN5tvDDcOxA2lZ2nRQDnOcwNnj0qxQBlfafFP/QO0/8A8D5v/lbR9p8U
+/wDQO0//AMD5v/lbV3Tr2LU9PttRgDLFdwx3EauAGCyqHUMASM4PrVigDK+0+Kf+gdp//gfN/wDK
+2j7T4p/6B2n/APgfN/8AK2pzqg/tf+yI7aaRkhS4luF8sRRrKZljDbpVkJYwN91D71eoAyvtPin/
+AKB2n/8AgfN/8raPtPin/oHaf/4Hzf8AytrVooAyvtPin/oHaf8A+B83/wAraPtPin/oHaf/AOB8
+3/ytrVooAyvtPin/AKB2n/8AgfN/8raPtPin/oHaf/4Hzf8AytrVooAyvtPin/oHaf8A+B83/wAr
+aPtPin/oHaf/AOB83/ytrVooAyvtPin/AKB2n/8AgfN/8raPtPin/oHaf/4Hzf8AytrVooAzNN1L
+ULjULrTtRtYbaW2hguFa3nadWWdrhMHfb25BBtz2PWm23/I06j/2D7D/ANHalRbf8jTqP/YPsP8A
+0dqVFt/yNOo/9g+w/wDR2pUAatZPiz/kVdZ/7B91/wCiZK1qhu7WC+tZrK6XzILmN4ZUyRuSQFWG
+VIIyD2oAwryXWpNW0Maja2tvF9ukKvb3Mk7FvsV9gFXtIBjGed34Vmz6na+GvEGs6/eNstZ7g2lw
+FI3vJBp9nd2oHmFV+6s6jBGWdRz1Xr5rWC4kgmmXc9rIZoTkja5SSEng8/JKw59aifS7CTzt8Wft
+FxFeS/M3zTW/k+U/3uNv2dOBxxz3oA5KxspdP0vULW5KvcjXtKkunQkq9xKdHluJFyF4aV2bGB14
+A6V0GrRKdd0OaIt9oSa4RwjMP9Fa3lMu9FOCnnJByRw23uatXOjaddRXMM0bbbyaO5nKSSRsZYRC
+I3V43VlK+Qn3SOlFlo9jYSmeHzpJSpQSXNxNcsqkgsqNcyylAxUbtuM4GegoAtwo0cSRvI0zIoVp
+H2hnIGCzbFRcn2AFPqvp1tLZ6fbWc87XUtvDHFJcPndKyKFaRssxyxGepqxQBlaz/wAhHQv+whJ/
+6Q39ZnizwvqGva14f1GzkhSLR7o3FwsrMGZfMt3xHtRgTiI9SK09Z/5COhf9hCT/ANIb+szxZ4o1
+DQda8P6dZxwvFrF0be4aVWLKvmW6Zj2uoBxKeoNAHUVU1K4W1sppmIXC4BPqeBVuopoI7hDFMiuh
+6qwyOKAW+pz3hq3L3BuXHzKDnPYnhR/3zXSjpVN1sdGtLm8b9zBCjTzNgttSNSzHAyeAO1O0rVLD
+WrCLU9Ml8+1n3eXJtZM7GZG+V1VvvKe1JKysOT5m2W6yvFn/ACK2s/8AYPuv/RMlatUdcspdS0XU
+NOgKrLd2s1vGzkhQ0sbIpbAJxk+lMRxP9g6F/wBA60/78R//ABNavgy0tLLWdVis4Y7dDa2TFIkC
+KWL3wzhQOeKyddvrzw15H9tnT7b7Tv8AJ/0i6k3eXt3f6rTXxjeOtdN4c0jVbC+vb3U1t0+0xW8M
+aW8rzf6lrlmLF4IcZ84Y6124irSnC0Gr37WOelCcZXlt6m/XIajNfaNqGp3k2nXE9rd3luYZ4Wt9
+pMsNnZqu2S4jcHzVx9336V19ZviCwutR0xray8szrPbToJmKIfs88M5UsqSEZEePumuNOxvJcysY
+f9q33/QGvf8Avuz/APkyq1l4mbUfP+x6VeyfZZ3tZubVdsseN6/NdjOM9RxWp9l8U/8APnp//gbN
+/wDK+ud8FR6nd2uo3ujHT7+C71Ge4Z/tFzD5byCNjFiXTgW2gj5qrmXcx9nL+U1G1q7WaC3bSL0S
+XTmKFd1p8zhHmIz9swPkjY810Ph61nsdA0yyul8ue2s4IZUyDteONFYZUkHBHasuHS9fm1PT7m9h
+s4ILKd53MNzJM7boLiAKFa0hHWbP3q6Spk7mlOPKtVZhRRRSLMrxZ/yK2s/9g+6/9EyVq1leLP8A
+kVtZ/wCwfdf+iZK1aACiiigArJ8S/wDIOh/7CGm/+l1rWtTJYYplCTIsihlcK4DAMjB0bB7qygj3
+oA4/VdPsntvF+qyQq95Zs8lpO/zNbvHp1pIkkGc+W+7B3Lg8Dn5RjVt9O09vGd/em2hNyljZOk5j
+XzFZ3v4mYPjdkoiqfYAVsNaWrpPG8MbJdZ+0KUBEuVER8wY+b5FC89himvp2nyXseoyW0L3kK7I7
+lo1MqKd3yrIRuA+c9+9AHL6Rd2suleB44po3dtu1VcEnydOu4pcAH+ByFb0PBpg07T9QXSEv7aG6
+X+3tWTbNGsg2ltWcrhweC0an6geldRDpOlW873VvZ28U8knnPKkSK7SEOvmMwXJbErjP+0fWi50n
+SryAWt3Z288AkaYRSxI6eY5Zmk2spG4l2JPuaAOftv8AQ7GLXE4NlqmoxTnt9kudQmjnLMchFjIS
+Zmx0jxkAk025TUP7JsLh4FaXXL5Z9Ttrpmt49s8EghtZ3WKQqEMcEP3B5hG1h87A9ObS1MElqYYz
+BNv82LYNj+aWaXcuMHeWJb1zT5oYriJ4J0WWKVSkkbgMrKwwysp4IIoAxPDsVxbXt/aGG1s7aFYN
+llZSPNFDK3mtKQzW1uiF0MZMa9PvkDflrGmf6Pq+rW8/ySXdwl5bqf8AlpCttaW7Oh6HbJGQw6jj
+PDLnQtbS1sYFtbKGO2gjzsihQRouSWOFUADJOabe6dp+pxCDUbaG7iVg6x3EayqGAIDBXBGcE0AZ
++vagosbiK2mZWt5rRL2SPcvlQTTRfaMzLjYVtyzMQwZFIfj5TWP4itLXS7XVLHSIY7W1k0PUJru3
+t0CRiQCNLaRkQBUZ1MoB437ec7BjqrW0tbGBbWyhjtoI87IoUEaLkljhVAAyTmorfSdKtLWSxtbO
+3gtZ93m28cSJG+8bG3oqhTlRg5oAxJ9A0ZNfsrEWkZt7izu5rqIgstzJDJZLHJd5J89l85yDLu+Y
+7vvc1VS1gvLXRrG5XfbLrmowCHJCeTCNXSOHCkfuwiBNn3dvy428V1phiaVZyimVFZEkIG5VcqWU
+N1wSi5+gpi2lquzbDGPLkeaPCAbZJN++ReOGbzGye+T60AchfaVpsOm+KZ4raNH0rzf7NwuFsyth
+bXIa0T7sLebIXLIAS3J6Cu1qFrS1dJ43hjZLrP2hSgIlyoiPmDHzfIoXnsMU8wxNKs5RTKisiSED
+cquVLKG64JRc/QUAPooooAKKKKAMq2/5GnUf+wfYf+jtSrVrKtv+Rp1H/sH2H/o7Uq1aAMq2/wCR
+p1H/ALB9h/6O1KtWsq2/5GnUf+wfYf8Ao7Uq1aACiiigAooooAKr6jexaZp9zqM4ZorSGS4kVACx
+WJS7BQSBnA9asUUAcf4uu7W58/7NNHNu8N6tMPLcNmOX7H5cnyk/K207T3xVjxPpN/H4b1aR9avp
+lSxuWaN0swrgROSrbLJGwfYg1tW2h6LZxTwWen2tvFdLsuI4oY0WVcMNsiqoDDDHr61bmhiuIngn
+RZYpVKSRuAysrDDKynggigDMg+TxVe7/AJfO0+08rPG/yZr3zdnrs85N2Om4Z6ii0+fxPqUifMi2
+djCzDkCRXvpWjJ/vBJkYj0YHuKvXunafqcQg1G2hu4lYOsdxGsqhgCAwVwRnBNOtbS1sYFtbKGO2
+gjzsihQRouSWOFUADJOaAMWaPVZPFV7/AGZcW9vjT7HzPtED3G799qO3bsubfbjnPWoYZNS/sPV9
+WB3+IFt5reRII+I5rRZjBFDAxkYqWk8xC+WcODwpVV6MQxLK04RRK6qjyADcyoWKqW64BdsfU0CG
+JZWnCKJXVUeQAbmVCxVS3XALtj6mgDCW102w1DSZdBWNf7Qkc3UkB3m5thbzSefM+WMv77yv3rEn
+LY3fOd2Volrptr4X0DVNJWP+0Z/7Pga5jO+aUM8SXcLvlmdUiWTKHIQJkBdg29bbadp9nLPPZ20N
+vLdNvuJIo1RpWyx3SMoBY5Y9fWmW2k6VZzm6tLO3gnMawmWKJEfy0Cqse5VB2gIoA9hQBzt1DE+j
+6rrUiKddtJryO0uCB9oikSWRbCCL+JRIhi2xjiTfyG8w7r+g6dp8Ota9dw20Mdwb4IZkjVXKvaWM
+zrvAzhpGLH3561rPp2nyXseoyW0L3kK7I7lo1MqKd3yrIRuA+c9+9Cadp8d7JqMdtCl5MuyS5WNR
+K6jb8rSAbiPkHftQBzniP/mav+xfi/8AcrVsaVptlr9vZW1tGkF9p979tQru+0lJLFVa5LZMrYlf
+5nyfmb1NbUlpazeb50Mcn2iMQzb0DeZGN+I3yPmX943B9T608wxNKs5RTKisiSEDcquVLKG64JRc
+/QUAcbaW32Twf4cg021t/J1D7L/aETn7NDP5to3/AB8SxxSH95MsanKnecIchsUy+08y2F/o13b2
+ttp73Wkwtp9lLJJFG015H54D/Z7YRmSNkJjTp9/gvlutt9J0q0tZLG1s7eC1n3ebbxxIkb7xsbei
+qFOVGDmnw6dp9vapZQW0MVtEweOBI1WNWV/NVlQDaCH+b680AYmm6Hotl4svHs9PtbdoLGzeJooY
+0KNJJqCSMhVRgsqgHHUVjyR5ttL8QJFZ2rXt5p7Q3sp87U7tLqeElWmCW4hbyS2+NPMXZlF2otdw
+IYllacIoldVR5ABuZULFVLdcAu2PqaqJoeix3El3Hp9qlxM2+SZYYw7sHWbczhck+Ygb6jPWgDCW
+30adk1TXJPI1SHWHt7e4DFLgMLh47W1XHPly27LlMbWVjIepeqV0mpzQ6lqZtbFb+3urmC31Ke4l
+W7tyJWSzRII7KVgCjR7YlbEobkHzDnsH07T5L2PUZLaF7yFdkdy0amVFO75VkI3AfOe/eh9O0+S9
+j1GS2he8hXZHctGplRTu+VZCNwHznv3oA5rWLFYb7VNavLWx1WztlWZ5Wdo7+wEMKvLFbsscmDtA
+ljAeIhnJzzurraqXGk6Vd3Ud9dWdvPdQbfKuJIkeRNh3rsdlLDDHIxVugAooooAKKKKACiiigDKt
+v+Rp1H/sH2H/AKO1Ki2/5GnUf+wfYf8Ao7UqLb/kadR/7B9h/wCjtSotv+Rp1H/sH2H/AKO1KgDV
+rJ8QrqbQ2q6clxJGbjF7HZvDHM1uYpsqj3DxhcybMlWDAfdINa1VNQtbq5SJrK5+yzwSeYhZTJE+
+VeMpNGskRdcPkDcPmCntigDnW1a7t9KEmhvNuN1p6mz1bzorq3W5nSORWkuI55HSQnaGw2359rtt
+VBLqPjaLTJriG6FjE2nqpvIZL0R3DMYo7hxaQtB++G2QBCxTc2RgdatXHh/ULtLie5vYTfzNZFJY
+7dlgVbC4N3EDC1y7sWd2DHzBxjAGOZl0nV4Zp5bW/hhF8yS3h+zFn80RRW7vbM1xsjGyFSodJMHr
+uHFADJ/EM8E2qO1l/oOi7jdXHmje4W2ju8QRbPmb95hgzKOhBPIWpbeNbVvtX2lrOb7LZz35/su7
+F9iO22eYr7orfYx8wbOueeRjnTk0OKeDWLWeVjFrTMZNgCtGr20NmwUncCcRbs479KY+lalf2t3Z
+azexywXdvJbFLOD7PgTDazkyzXRLAfdxgcnIbjAA+y1LUG1A6dqtrDayvCbi2a3na4WVUYJMCWt4
+CpjMkfUc7uOhxp1mWmm6h/aCajql1DcSwQyW8C20DW6hZ2ieQuJLi4LHMC7cEY565406AMrWf+Qj
+oX/YQk/9Ib+szxZ4X1DXta8P6jZyQpFo90bi4WVmDMvmW74j2owJxEepFaes/wDIR0L/ALCEn/pD
+f1meLPFGoaDrXh/TrOOF4tYujb3DSqxZV8y3TMe11AOJT1BoA6iiiigDK8Wf8itrP/YPuv8A0TJW
+T8Lv+RE0z/t4/wDSiaulu/sv2Wb7d5f2Xy2+0edjy/Lwd/mb/l27euai0v8Asr7BF/Yn2f7D83k/
+Y9nk/ebds8r5fvZzjvQBbooooA8q+Of/ADBP+3v/ANtq9VrK13/hFv3H/CTf2f8Ax/Z/7Q8n/Z8z
+y/P/AOA5x7Vq0AFFFFABXn/wV/5Fa6/7CEn/AKJt69ArP0T+wPsr/wDCOfY/svmHf9g8vy/Mwud3
+k/Lu27f0oA0KKKKACiiigDK8Wf8AIraz/wBg+6/9EyVq1leLP+RW1n/sH3X/AKJkrVoAKKKKACii
+igAooooAzPE80tv4b1aeB2ilisbl45EJVlZYnKsrDkEGmXWq6kNVl0nTbKO4eG3huXmnn8iMCZ7i
+PZ8kM77v3GR8uOuSMDdY1yyl1PRdQ06Aqst3azW8bOSFDSxsiliATjJ9KIrKWPWrrUSV8q4tba3R
+QTuDQSXbsSMYxidcc+tAGUurahf61otzp0amwv8ATZrpkmmaJgryWLFmiSKVC8aSDb83O5hlf4rc
+2vSxrPfpbK+k2bSpdXRlKyj7OzJO8dv5R3JGykNl1Y7W2q3y7q9jo+q6d/YPlrbzf2bp50683Sum
+N/2LdJDiB9+Psx4bbnI5FV5vB1u1xPEun6bNFdzS3D6hcQpJdxmd2lkURvbukhDMQjM4CgjKNt+c
+AZ4h1vXGs/EVvp1nHHBpdu6G/a7aKTe1qtwzQxR27ndGJB1dc8YPXGrC+o6fYW9nBaebePvOx7qa
+eFFVtxaW+nhaTow2jYWycAbVLLFeaJdXFh4itUeMPrPmfZyScLvs4LQeZ8vHzxE8Z4/Kn69pMuoy
+20wtrXUYoFlR7G/YrAzSGIrPnybgb4xGyj5OjnkdCAQ2XimK+tC9ukNxdm6NhEltOJreWfyRdfJc
++WvyLEcudmRtYAMcBpotcvRblLzT2ttRa6aygtjJuimcIZ1kjuNg/deUCzMUyNrLtLAKa8Oiarvn
+1C4e3+3f2gNSto4y/k/8ecdiYJGZd33d43gdcPt6x0XOh6lq9kG10Wd1cQ3jXltZFfMtFQRtAlvI
+7x7nyrs3mbPlc52lV2kA0tP1CW4llsr2Jbe9t1SSWKNzLGY5S4jkjkKRkgmNgQVUgqeMbWa9WToW
+jppnnzi0s7B7nYDbWEaiNRHuwWlEMLyMd5OSoA4AHVm1qACiiigAooooAKKKKAMq2/5GnUf+wfYf
++jtSrVrKtv8AkadR/wCwfYf+jtSrVoAo3uh6LqUon1HT7W7lVQiyXEMcrBQSdoZ1JxkmoP8AhE/C
+3/QG0/8A8BYf/jdatFAGV/wifhb/AKA2n/8AgLD/APG6P+ET8Lf9AbT/APwFh/8AjdatFAGV/wAI
+n4W/6A2n/wDgLD/8bo/4RPwt/wBAbT//AAFh/wDjdatFAGV/wifhb/oDaf8A+AsP/wAbrjPijH4b
+8O6CLex0uxhv9SYxQyJbRK0caYM0it5JGcEL1B+bI6V6RXCfFjQNJuPDt54gmg3ajaxwQwz73G1D
+cICNgbYf9a3Ud6AKXwuj8N+ItBNvfaXYzX+msIppHtomaSN8mGRm8kDOAV6k/Lk9a7P/AIRPwt/0
+BtP/APAWH/43XM/CfQNJt/Dtn4ghg26jdRzwzT73O5BcOANhbYP9UvQdq7ugDK/4RPwt/wBAbT//
+AAFh/wDjdH/CJ+Fv+gNp/wD4Cw//AButWigDK/4RPwt/0BtP/wDAWH/43R/wifhb/oDaf/4Cw/8A
+xutWigDK/wCET8Lf9AbT/wDwFh/+N0f8In4W/wCgNp//AICw/wDxutWigDK/4RPwt/0BtP8A/AWH
+/wCN0f8ACJ+Fv+gNp/8A4Cw//G61aKAMr/hE/C3/AEBtP/8AAWH/AON0f8In4W/6A2n/APgLD/8A
+G61aKAMr/hE/C3/QG0//AMBYf/jdH/CJ+Fv+gNp//gLD/wDG61aKAMr/AIRPwt/0BtP/APAWH/43
+Wfr+meDvD+jXesXOi6eyWsZYJ9liG9yQsaZWJ8bnYLnHGc10tQ3Vpa30DWt7DHcwSY3xTKJEbBDD
+KsCDgjNAHhHw81HTP+EpW21yztbq31VvJxLbxMsc7tmJo0ELbQWOzau1fmyeFr2j/hE/C3/QG0//
+AMBYf/jdeaeCdJ0q7+JOv2N1Z289rB9s8q3kiR402XUaLsRlKjCnAxXsFAGV/wAIn4W/6A2n/wDg
+LD/8bo/4RPwt/wBAbT//AAFh/wDjdatFAGV/wifhb/oDaf8A+AsP/wAbo/4RPwt/0BtP/wDAWH/4
+3WrRQBlf8In4W/6A2n/+AsP/AMbo/wCET8Lf9AbT/wDwFh/+N1q0UAZX/CJ+Fv8AoDaf/wCAsP8A
+8bo/4RPwt/0BtP8A/AWH/wCN1q0UAVLHSdK0vf8A2ZZ29n5uPM+zxJFv2527tirnG44qrbf8jTqP
+/YPsP/R2pVq1lW3/ACNOo/8AYPsP/R2pUAatFFFABXP3dtqh1+Cyj1i8igure7uSiR2h2GGS0VEQ
+vZsduLg/eyeBz69BVGWylk1q11EFfKt7W5t3Uk7i08lo6kDGMYgbPPpQBSh1me00adrwfadR0+QW
+MicR/aLljGttyqlE+0edG3cJvwT8prVtI54bWGG6m+0zxxoss+0R+Y4ADPsXhdx5wOlZ9xonnazH
+fB8Wp2zXNvn5ZLmAbLeQpt2t8shLE87o4sfdrWoAKKKKAMrWf+QjoX/YQk/9Ib+szxZ4X1DXta8P
+6jZyQpFo90bi4WVmDMvmW74j2owJxEepFaes/wDIR0L/ALCEn/pDf1meLPFGoaDrXh/TrOOF4tYu
+jb3DSqxZV8y3TMe11AOJT1BoA6iiiigDK8Wf8itrP/YPuv8A0TJWT8Lv+RE0z/t4/wDSiaulu/sv
+2Wb7d5f2Xy2+0edjy/Lwd/mb/l27euai0v8Asr7BF/Yn2f7D83k/Y9nk/ebds8r5fvZzjvQBbooo
+oA8q+Of/ADBP+3v/ANtq9VrK13/hFv3H/CTf2f8Ax/Z/7Q8n/Z8zy/P/AOA5x7Vq0AFFFFABXn/w
+V/5Fa6/7CEn/AKJt69ArP0T+wPsr/wDCOfY/svmHf9g8vy/Mwud3k/Lu27f0oA0KKKKACiiigCjr
+llLqWi6hp0BVZbu1mt42ckKGljZFLYBOMn0qD7T4p/6B2n/+B83/AMra1aKAMr7T4p/6B2n/APgf
+N/8AK2j7T4p/6B2n/wDgfN/8ra1aKAMr7T4p/wCgdp//AIHzf/K2j7T4p/6B2n/+B83/AMra1aKA
+Mr7T4p/6B2n/APgfN/8AK2j7T4p/6B2n/wDgfN/8ra1aKAMr7T4p/wCgdp//AIHzf/K2j7T4p/6B
+2n/+B83/AMra1aKAMr7T4p/6B2n/APgfN/8AK2j7T4p/6B2n/wDgfN/8ra1aKAOM1/x5qHhvULHT
+tRsbES6g2FZNQbbCpZU82ffYoVTLH5sH7p9K3vtPin/oHaf/AOB83/ytrxr4n2fiBPEc2pa3F5UF
+1JJFp5EiupgtyqrtUSOUyGDEHHzMeK9i8JNrf9g2sPiKBoNQt18mUs6yeYE4SXeksuSy43EnO7PG
+MUAP+0+Kf+gdp/8A4Hzf/K2j7T4p/wCgdp//AIHzf/K2tWigDK+0+Kf+gdp//gfN/wDK2j7T4p/6
+B2n/APgfN/8AK2tWigDK+0+Kf+gdp/8A4Hzf/K2j7T4p/wCgdp//AIHzf/K2tWigDK+0+Kf+gdp/
+/gfN/wDK2j7T4p/6B2n/APgfN/8AK2tWigDK+0+Kf+gdp/8A4Hzf/K2j7T4p/wCgdp//AIHzf/K2
+tWigDK0y11X+1bzU9Tit4PPt7a3jjt5nn/1D3TszM9vb4z9oGBg9K1aKKACiiigAooooAKKKKACu
+U+KP/Iian/27/wDpRDXV1ynxR/5ETU/+3f8A9KIaAD4Xf8iJpn/bx/6UTV1dcp8Lv+RE0z/t4/8A
+SiauroAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPKvAP/JU/Ef/AG/f+lcVeq15V4B/5Kn4
+j/7fv/SuKvVaACiiigAooooAKKKKACiiigArHubbWrfWp9R06C1uYrm1t7dluLiSBlaCS6fI2Wtw
+CCLgdx0rYooAyvtPin/oHaf/AOB83/yto+0+Kf8AoHaf/wCB83/ytrVooAyvtPin/oHaf/4Hzf8A
+yto+0+Kf+gdp/wD4Hzf/ACtrVrlPibfalZ+EbpdMgkme6/0ed413+TAyu00jjY/y7EKk8Y3ZzQBp
+w33iS4iSeCx02WKVQ8ciahKysrDKsrDTsEEU/wC0+Kf+gdp//gfN/wDK2uU+Dd9qU3h+axu4JEtb
+WTdZXDLtSRJWk8xEOwBtkiMSdx+9jjFegUAZX2nxT/0DtP8A/A+b/wCVtH2nxT/0DtP/APA+b/5W
+1q0UAYjW+v32oadNe21nbQWNw9w7Q3Ukztm3uLcKEazgHWfOd3asrxroGravr/hi90+DzoNNvDNd
+vvRfLTzLVs4dlLcRt93NdhXP+JPFf/CP6roumfZftH9tXH2fzPM2eV88Kbtux93+u6ZHSgDoKKKK
+AMrxZ/yK2s/9g+6/9EyVk/C7/kRNM/7eP/Siaulu/sv2Wb7d5f2Xy2+0edjy/Lwd/mb/AJdu3rmo
+tL/sr7BF/Yn2f7D83k/Y9nk/ebds8r5fvZzjvQBbooooA8q+Of8AzBP+3v8A9tq9VrK13/hFv3H/
+AAk39n/x/Z/7Q8n/AGfM8vz/APgOce1atABRRRQAV5/8Ff8AkVrr/sISf+ibevQKz9E/sD7K/wDw
+jn2P7L5h3/YPL8vzMLnd5Py7tu39KANCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8q
++Of/ADBP+3v/ANtq9Vrw34sarrV1r39k6tDDHFYNI9lJCsi+ZBcbCrM0jEMQIwp2gDcGFeteEr/V
+9V0G11TWkhiuLxfOSO3UqqxPzFndLLksvzduuMZFAGxRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
+RRQAUUUUAFFFFABXKfFH/kRNT/7d/wD0ohrq68y+MevavZQpoSww/wBmanCrGdgTL5sEqyOq4kwA
+B5fVe/5AHRfC7/kRNM/7eP8A0omrq683+Dmq61e6c+nSQwrpOmqyRzBZBK880jTbd5YxkKGO7gEZ
+WvSKACiiigAooooAKKKKACiiigAooooAKKKKACiisrxU2sp4fvZPD7+XqMUfmQHYJCfLZXdFQpJu
+ZkBVRjqaAPP/AAD/AMlT8R/9v3/pXFXqtfPXhDUPEt54uVtIu/I1HV5HW5ufLif5JG8+d/LkATjZ
+uwMdMCvoWgAooooAKKKKACiiigAooooAKKKKACiiigAqG7+y/ZZvt3l/ZfLb7R52PL8vB3+Zv+Xb
+t65qauc+Id7Lp/gvVZ4QrM8ItyHBI23DpbueCOQshx70AbGl/wBlfYIv7E+z/Yfm8n7Hs8n7zbtn
+lfL97Ocd6t1ynwu/5ETTP+3j/wBKJq6ugAooooAK4/xroGravr/hi90+DzoNNvDNdvvRfLTzLVs4
+dlLcRt93NdhXP+JPFf8Awj+q6Lpn2X7R/bVx9n8zzNnlfPCm7bsfd/rumR0oA6CiiigDl/iJr1vo
+nhu6juoZpF1KGeyjkiCFUllicIJN8iNg88qD0+mc/wCEWqxXvhWPTo4ZlbTWdJJnUCJ2mklm2xOG
+OSqsN3AxkV1Gv6NB4g0a70e5O1LqMqH5OxwQ0b4VkztdQ2M84xVfwl4fi8M6Da6SgUyou+5kXHzz
+vzI27YhIz8q5GdoAoA2KKKKAPHfjVqsV1qllpIhmjlsFkd5JFCxyLcCEq0LbiWAMbKeByMV6vpWo
+Jq2m22pxRSQR3cazRpNt37H5Qny3kX5lwev15rC8X+BrLxZe6ZdzbUNnNi6yMGa15dosphs7gAvz
+DaGY8muooAKKKKAKOtarFoel3GrTwzXEVqoeSO3UPJtyAzBSyjCg7m54AJrzv4Ma9brbz+G1hme5
+eaW9aVQnlJFsgiyxaQNncMYCnr9cenzQxXETwTossUqlJI3AZWVhhlZTwQRXO+CPBkHg+C9RJPOk
+vLhmD5JIgjLC3RvuqWCsSxCjlsdAKAOlooooAKKKKAOE0T4geJfEVq97o3hj7TBHIYWf+0Io8OAr
+EYliQ9HFbdxqvjKG1juI9At7iSTbuto9RAkj3Dcd5ltY4/lPB2ufbI5rP+Fmm2uneFk+y3sd99rk
+F1L5eP3EkkMG63fa7/MmOc4+ldhQBz9jqvjK73/aNAt7DZjb9o1ENvznO37Paz9Mc5xVeHX/ABzJ
+Kkb+FVhV2CtI+pQlUBONzbInbA9gTXUUUAc1da342t52hh8MR3SLjE0OpRBGyAeBNDE/HTlRUtxq
+vjKG1juI9At7iSTbuto9RAkj3Dcd5ltY4/lPB2ufbI5roKKAOfsdV8ZXe/7RoFvYbMbftGoht+c5
+2/Z7WfpjnOKrw6/45klSN/Cqwq7BWkfUoSqAnG5tkTtgewJrqKKAOautb8bW87Qw+GI7pFxiaHUo
+gjZAPAmhifjpyoqW41XxlDax3EegW9xJJt3W0eogSR7huO8y2scfyng7XPtkc10FFAHP2Oq+Mrvf
+9o0C3sNmNv2jUQ2/Oc7fs9rP0xznFV4df8cySpG/hVYVdgrSPqUJVATjc2yJ2wPYE11FFAHl/jfw
+34o8R65ZXr+Ho5UstqXDQ36FLqEMsvlAyC3ePG5xu2Z59hXYXGq+MobWO4j0C3uJJNu62j1ECSPc
+Nx3mW1jj+U8Ha59sjmugooA5y21jxpPFNJL4chtmhXckcuooWmOGO2PyreRQeP4yo5+tRQ6/45kl
+SN/Cqwq7BWkfUoSqAnG5tkTtgewJrqKKAOautb8bW87Qw+GI7pFxiaHUogjZAPAmhifjpyoqW41X
+xlDax3EegW9xJJt3W0eogSR7huO8y2scfyng7XPtkc10FFAHOW2seNJ4ppJfDkNs0K7kjl1FC0xw
+x2x+VbyKDx/GVHP1ptrrfja4nWGbwxHao2czTalEUXAJ5EMMr89OFNdLRQBzV1rfja3naGHwxHdI
+uMTQ6lEEbIB4E0MT8dOVFS3Gq+MobWO4j0C3uJJNu62j1ECSPcNx3mW1jj+U8Ha59sjmugooA5y2
+1jxpPFNJL4chtmhXckcuooWmOGO2PyreRQeP4yo5+tNtdb8bXE6wzeGI7VGzmabUoii4BPIhhlfn
+pwprpaKAOautb8bW87Qw+GI7pFxiaHUogjZAPAmhifjpyoqjY+M/FWpxTyWHhlZmtLqWyuYxqEat
+HLAELA74VUg7+CpPQ+2ezrnPBVtFBDrEscyzNc61fyyIuMwsJfK8tsMeSsYftw340ACax40aykum
+8OQpKjbVtG1FPNcfL8ylbcxY57uDx9MllrHjS6lMc/hyGyUKWElxqKMpOQNo+z28zZ59MV0dFAHL
+za/45jleNPCqzKjFVkTUoQrgHG5d8SNg+4Bqxfar4ytNn2fQLe/353fZ9RC7MYxu+0WsHXPGM10F
+FAHOJrHjRrKS6bw5CkqNtW0bUU81x8vzKVtzFjnu4PH0yWWseNLqUxz+HIbJQpYSXGooyk5A2j7P
+bzNnn0xXR0UAcvNr/jmOV408KrMqMVWRNShCuAcbl3xI2D7gGszx7pvivxFow0pdEt53aRZop7e/
+z5DxnGWSeC13bkdlHJ9fSu7ooA4fwrbeKvDXhlLK38PQmWBiXje/jWe4dypeX93bGLHOBukyFXHP
+GdWy1jxpdSmOfw5DZKFLCS41FGUnIG0fZ7eZs8+mK6OigDl5tf8AHMcrxp4VWZUYqsialCFcA43L
+viRsH3ANWL7VfGVps+z6Bb3+/O77PqIXZjGN32i1g654xmugooA5xNY8aNZSXTeHIUlRtq2jainm
+uPl+ZStuYsc93B4+mSy1jxpdSmOfw5DZKFLCS41FGUnIG0fZ7eZs8+mK6OigDl5tf8cxyvGnhVZl
+RiqyJqUIVwDjcu+JGwfcA1Le6x40tZRHB4chvVKhjJb6iiqDkjaftFvC2ePTFdHRQByWo+LfE2j6
+Jca7qmgw2sVqyq0DX4eVg7JGrL5VrImN0ndgeKhPjXxI2g2viCDw21xFetiO2gnle4VTv2yvGLHG
+whMhs9x61veKdC/4SXQrrRPP+zfafL/fbPM2+XIkv3dyZzsx1q1pNj/ZelWemb/N+x28Vv5mNu/y
+kVN23LYzt6ZoA5/QvFHinXPP/wCKd/s7yNn/ACELiaDzN+7/AFf+gNnG3n6is+08f+Kbu6htf+EQ
+vIPPkWPzZnmSNN5C75G+xHCjOSa7uigDitU8b+KdLv5bH/hFLi88rb/pFnJNLC+5Vf5H+wrnG7B9
+6lm8YeKYdGg1n/hGJJPtEhj+xRzTNdx4Mg3yQ/YPlX931z3HrXYUUAcpoXijxTrnn/8AFO/2d5Gz
+/kIXE0Hmb93+r/0Bs428/UVn2nj/AMU3d1Da/wDCIXkHnyLH5szzJGm8hd8jfYjhRnJNd3RQB5LY
+rrHgfxXq93aeF7i++1bRC1m0rQQpJieWOJ0s1Vl3FQPkG3bjnk11+oeKPFNhpVtqn/CO/aftPl/6
+JbXE0lzF5iGT97F9gG3bjDc8GurooA5TQvFHinXPP/4p3+zvI2f8hC4mg8zfu/1f+gNnG3n6is+0
+8f8Aim7uobX/AIRC8g8+RY/NmeZI03kLvkb7EcKM5Jru6KAOK1Txv4p0u/lsf+EUuLzytv8ApFnJ
+NLC+5Vf5H+wrnG7B96tah4o8U2GlW2qf8I79p+0+X/oltcTSXMXmIZP3sX2AbduMNzwa6uigDlNC
+8UeKdc8//inf7O8jZ/yELiaDzN+7/V/6A2cbefqKz7Tx/wCKbu6htf8AhELyDz5Fj82Z5kjTeQu+
+RvsRwozkmu7ooA4fWvHviTQ7m4gn8LzXEVqoeS7t5pXt9uwSMwlNkowoPzemDVWH4m+JLiJJ4PB1
+9LFKoeORGlZWVhlWVhZ4IIrtNcspdS0XUNOgKrLd2s1vGzkhQ0sbIpbAJxk+lGh2Uum6Lp+nTlWl
+tLWG3kZCSpaKNUYrkA4yPSgDC13xR4p0PyP+Kd/tHz9//IPuJp/L2bf9Z/oC4zu4+hqKHxh4pm0a
+fWf+EYkj+zyCP7FJNMt3JkxjfHD9g+Zf3nXPY+ldhRQBx+ieMPFOtXT2v/CMSafsjMnm3800EZwV
+XYrfYG+b5s49jVS78f8Aim0uprX/AIRC8n8iRo/NheZ432Ervjb7EMqcZBru6KAOP1vxh4p0W6S1
+/wCEYk1DfGJPNsJpp4xksuxm+wL83y5x7iql9ret+IPC95NqfhSR7USJHJp0lxcR3cu14nV440sl
+YqGYHO7+E13dFAHCeENb1vy10LTPCkmkWttG8kZv7i4jj+Z9zIsj2UjFi0hOPrRd+P8AxTaXU1r/
+AMIheT+RI0fmwvM8b7CV3xt9iGVOMg13dFAHH634w8U6LdJa/wDCMSahvjEnm2E008YyWXYzfYF+
+b5c49xUv/CUeKf7C/t3/AIR3/tw+0TfbP9Z5X+o+wf8AAuv3ea6uigDj9E8YeKdauntf+EYk0/ZG
+ZPNv5poIzgquxW+wN83zZx7GuV8X6p4p1XX9Luf+EavF/wCEfvHkzCJpo7jbJE37uT7KmFPkcNg9
+a9aooA4/W/GHinRbpLX/AIRiTUN8Yk82wmmnjGSy7Gb7AvzfLnHuKr6p8QNa0bQbbxBqOhLbxXU3
+2dbaS6kS4Rv3vMkb2SgAiIkc9xXcVxmoaPqF18U9N1aOJhZ2WmsZJ2VthZjcxeUrhSu/98G256c0
+AZupfFXVtItbK91Dw75MGpR+daP9uRvMTCNnCQMV4kX72Kl0/wCJWu6ppVzrdj4b82xs/M+0Tfb4
+12eUglf5XhVjhWzwK9AooA810v4v3+tX8WmaZ4f8+6n3eXH9tVM7FZ2+Z7dV+6p71Dd/GmexuprK
+60Ly57aRoZU+2A7XjJVhlbcg4I7V6hRQB5/rvxK13w15H9t+G/s32nf5P+nxybvL27v9VC+Mbx1o
+0/4la7qmlXOt2PhvzbGz8z7RN9vjXZ5SCV/leFWOFbPAr0CigDzXS/i/f61fxaZpnh/z7qfd5cf2
+1UzsVnb5nt1X7qnvUN38aZ7G6msrrQvLntpGhlT7YDteMlWGVtyDgjtXqFFAHn+u/ErXfDXkf234
+b+zfad/k/wCnxybvL27v9VC+Mbx1o0/4la7qmlXOt2PhvzbGz8z7RN9vjXZ5SCV/leFWOFbPAr0C
+igDzXS/i/f61fxaZpnh/z7qfd5cf21UzsVnb5nt1X7qnvUN38aZ7G6msrrQvLntpGhlT7YDteMlW
+GVtyDgjtXqFYnjPW7rw74avNZskjkntvK2LMCUPmSxxHIVkPR/WgDhf+F5/9QT/yb/8AuaivKqKA
+Pb/g5aXVp4Wm+1QyQefeNNF5ilN8bw2+2RNwGVOOCK7uuK+EmqX+qeFm+3S+b9juDZ2/yquyGKGD
+YnyKucbup5rtaACiiigAooooAKKKKAOf0LxN9sg1i61iS3s4NL1S4sFlJ8pPLiMaxtI0jkbiXx2+
+laS65ory3ECahatLaK73MYmjLQrEcSNKu7KhT97PSvONT/5ETxt/2ME3/pRaVtan4f0PTPGHhSys
+LC3ggmj1GGZFjX96i2qqBMSCZOGP3s9TQBu+G/Fun6/olrrEzw2TXczWwgeZWIn3MqQ7iEy7qAwX
+GcGtj7Xa/avsPnR/avL877PvHmeXnZ5mzO7bu4zXlGlzafb+A/Cc4eGIReIoXvZMqu1lkuDumbsR
+Ft+9/DjtXUafqum6t8UJZdMuY7uODQ/JeSFt6b/tKSYDj5W+WQdD7daALVr4z8m60LStSm0+6utY
++0ebc2Fxm3j8sssGwPuZvMYbOo+YEDPStXTNW82ee11C80952vLiGzitJcuY4QrGORXbPnIDmQL0
+4rzjwvDp6n4fT3aQgu2qIZJQvzMkkht13N3Er/J/tHjmtCC2ZNL1/X7aNpLzQfE13fxCN1iZokMP
+2qIyEEhHh3bgOuB16UAej/a7X7V9h86P7V5fnfZ948zy87PM2Z3bd3GaisdW0rVN/wDZl5b3nlY8
+z7PKkuzdnbu2M2M7TivOtY+1az4a8VeMrTzGTUPKtNOKZZ1sLSVI53RuHSObDs8ZUYwSc9aPBsLL
+4o0u5sZ9DSNrOWKaDRhcPJJbhFdDciWNxGyybPmkKMehLHigD0jUb2LTNPudRnDNFaQyXEioAWKx
+KXYKCQM4HrXP+B/FGoeIY7uDVo4UvLVbW4zaqwiMF7AtxCP3ju28c7u3TGai+JRlvNEh8OWarJea
+5dQ2sSliCiownknKqrsUTyxvIHyg5rPgPiTS/Henap4pWx26payaTHLYtKsUTK32qMSG4X78jDai
+7ufw5ALFnrfj7WrrU/7GTR0tdP1C4sF+1i5Eh8gjDHymZfusPT6UQ+OtSm03TpXtI7e+bXItC1OJ
+/nRX585oGST6YyTjkfN1Of4b0rxLfXXiGbRtd/sqAa5eq0H2OK53OChL75WBGQQMe1S614fg8N6b
+4csopZLmaXxJZ3F3dTEl555PM8yU5LYztHH55OSQD0CiiigAooooAK5fwJDLGviB5EZFm16/eNmB
+AdQyJuXPUbkI+orqK5rwPdT3EeuQzNuS11y/hhGANqFxMRwOfnlY8+tAHS0UVR1vVItE0i81abaV
+tIXlCO4jDso+SPcQcF2wo46mgDndO8a3V54vfRnijGnS3F3YWjKpE/2mwjglmaU+YU8s722YGemQ
+Kl1vW/FX/CVJ4c8OJp//ACDxfu9+Jv8Ans0JVTC3+7/D681x7aR400XwhpNzdwWcunaFcQawLaPz
+1vjiRpWjl3RlF2ee2/j5QPat7VYNR1b4iQt4f1RdPZ9BWZbtIY7tZIjcthVDnbhtwO4elAFpPFni
+HT21jStftbVdTsNNl1a0mtC7WssUa7cMsj+YCJOO2eenBbpdDvZdT0XT9RnCrLd2sNxIqAhQ0sau
+wUEk4yfWuYvfC0+maP4h1zWNRk1fVLjS7m3FwyCBI4FiZvKSFGZRllyT/L5id/wn/wAiro3/AGD7
+X/0THQBi3Gt+NL7xLq2jeH00sQaV9my18Jw7faYvN6wsQcEHsO1aumXev2MFzdeM5tLtoI/L8qW0
+eSNFySrea1yQBklQuK4+5ttKuPHfiT+09euNB2/YfL+z3iWfnZtxu3bwd+zAx6Z96m8UjSofh1rN
+rpmtSa5tkt5JJZ7pLySPfPAqpuT7q/uyQPrQB251zRVW5dtQtQtkwS7YzR4gZmKBZTu+QlhjnvUz
+ajp6RW873MKxXbIltIZFCzNKMxrE2cMWH3cda4pPDWgx/EGLRksYf7Ph0VLkWhXMTzxzyW6TSoeJ
+HEcrDc+TznrWJYzRW/w/8GTzusUUWvRPJI5CqqrPeFmZjwABQB6LrmsRaZp+oPBLC1/aWM19HbOw
+LFYlba7Rhg+zeMZpljr1r/YGnazrNxb2X223gkZpHEUfmSxiUohlb64Ga4rXNV03VvE+vS6Zcx3c
+cHhO6heSFt6b9/mYDj5W+WQdD7daq3dzBcf8I7pMg0u3P/CP28rX+ssZY4kl8uM/ZreVhB5w2bss
+PmxgkAcgHa654z0rSINMuopre6g1S8S1WVbhFRIyWWW4DDeGWIgBunXkitW+1bStL2f2neW9n5uf
+L+0SpFv243bd7LnG4Zrx+wi0ptAtLi5a3ubVPGCobqSFII2tnjjMh8tgFjjdUBZOgx7V01//AMIv
+/wAJv4i/4TXy/L+x239n/bd+37P5X+kfZc8bvM6bPm3btvO6gDv7i7tbTy/tU0cHnyLDF5jhN8j/
+AHY03EZY44Aotbu1voFurKaO5gkzslhcSI2CVOGUkHBGK8wNq998PvBtlqyySJc6xbwyJKWDNBI9
+0qAHIYKYiNuP4cYr0+1tLWxgW1soY7aCPOyKFBGi5JY4VQAMk5oAwPiPaXV94M1G1soZLmeTyNkU
+KmR2xPCxwqgk4AzWl4Yhlt/DekwTo0UsVjbJJG4KsrLEgZWU8gg1X8Z63deHfDV5rNkkck9t5WxZ
+gSh8yWOI5Csh6P61d0O9l1LRdP1GcKst3aw3EioCFDSxq7BcknGT60AP1a+/svSrzU9nm/Y7eW48
+vO3f5SM+3dhsZ29cVyWieCNO1zSLPXdfuLq+1e9hS7S/86SJ7YzDzo1tlR9iCJnyvy4z2x8o7K7t
+YL61msrpfMguY3hlTJG5JAVYZUgjIPauS08eP/D9lD4fh0+11ZIF8m01TzxbpHEP3cP2m3K72Mag
+Fth5HGS2TQBVsPGl7oegrHqEM2sXFlrT6A8qH9/OE3Msyx7W3PtwuwtljyWyal1Hxnqk2ka7ptxp
+c2l65Z2L3McAnDA27AI11FcoqrmLcTgdxgHOduf4g0PUNC0HQ4UlhuNZu/EUF5cTuGWCS9n85tzK
+vIQHavygZAzgE1dbRfFGuT63ruqWUenz3GjzaPY6csqTO+8GXzHmVhGMyHA6e+MZYAfpGpLcP4Ib
+WLFpNSu7W6MF29wzNEEt03SsF4kNxHg/NyufWmWPxOnubWz1O50O4g068ke2Fwkgld7kCVo4beFY
+w8u/ywob5RuJH8Oam07Rdda58F3F3ZfZ/wCxbe7t75fNjfy/3C28LZVvm8zZnC5xnmqlj4W12Hwn
+4W0yS123WmaxFeXkfmRny4VmuXZ9wfa3yyDhSTQBpp4obVNJ8R2euaS1pcaRas15Ym4WRZYpoHlV
+RPCBgsqkHA4478CGDxH4gstJtJdJ8NK+kx2NvNDO+owxKkRgjkKt567sR5K7m64zT7jQNWe98azL
+BlNZs4YbA70/eulrLCw+98vzsB82KqRHxpYw6bp//CO/b7TTbO0VF+2wQq1zHFHveRW37vKcYQdA
+w38nYUANtvEWsjRrK7XQrh9Uv9xTTg4CxKpLbri6dFSL5MEBhu3Hbjrjktf8f6jq/hLVzYWzWN5Y
+TWqTz2l7HMsUU7bkljuLfG8lk8tlXpu69QNLxZpPiDxJa6LeXWi+elvJcG/0P7cseS4KQSeemxDt
+27uORux/erKl8H+JZ9J8VRLpNvYyav8A2c1lZ2kkSxAQvvkTO5FDIv3zgBmyV4oA6X+17C38VfaN
+UsPsd9F4f+23d15zS+TCs2Zbby41KvsYE7xyai07x/Pc3VidS0a407TNYkMOm37uJPMdjiESxImY
+/MH3eT7ZXLAu9A1bWtfmvbqD7DBqHht9Nlfek3kXM8hZo8Kyl9gbqMA+tZ9novjLUP7C0PVrK3sb
+Hw9cRXDX6SiX7T9i/d26xRBgyb1PzFvrx90gGreeMdWGu6hoGjaHJqU+neQzSC4SGMpNGJCXeVMK
+2WAVed3J4xWx4b1yLxJolrrUMTQLdKxMTkEqyM0bjI6jchwe47DpVLRtLv7TxZ4j1O4i2WuofYfs
+sm5Tv8iFkk+UMWGGPcCjwFpd/ovhOx0zU4vIuoPO8yPcr43zSuvzIzL91h3oAu+J4Zbjw3q0ECNL
+LLY3KRxoCzMzROFVVHJJNHhiGW38N6TBOjRSxWNskkbgqyssSBlZTyCDUuuXsum6LqGowBWltLWa
+4jVwSpaKNnUNgg4yPWjQ72XUtF0/UZwqy3drDcSKgIUNLGrsFyScZPrQBeorB8Pa9e6lqmt6RqMK
+w3Gk3QWPyx8rWs4L2zE+Y+XKqS3TqO+apN4m1W5/4SGSxk0+3tdKuIbOzvL8vFCZl2C8S4beG+Vm
+2oQACSOtAHV0VRvdc0XTJRBqOoWtpKyh1juJo4mKkkBgrsDjINWPtdr9q+w+dH9q8vzvs+8eZ5ed
+nmbM7tu7jNAE1FV11HT3iuJ0uYWitGdLmQSKVhaIZkWVs4UqPvZ6Uyx1bStU3/2ZeW955WPM+zyp
+Ls3Z27tjNjO04oAt0VyXh7xXqGq6XourX8+m2cV6t699HK7RSFbYuEa1V3YYUJul3Hgc1tQ+J/Dd
+xKkEGrWMssrBI40uYmZmY4VVUPkkmgDToqje65oumSiDUdQtbSVlDrHcTRxMVJIDBXYHGQapf8JR
+a/8ACXf8IniPzPsf2rzfNG7zN3/Hv5WM7vL/AHnX7vbHNAG3RWTperf8SKLVNbvNP/i867s5f9D/
+ANY0abJZW+gOT96rf9raV9g/tT7Zb/Yf+fvzU8n73l/63dt+9x160AW65LVvEGoR/EPRfDMZVLOa
+F7yRl3B3YRXqbGw+0p8gbG3qM10Vvq2lXd1JY2t5bz3UG7zbeOVHkTYdjb0Viwwxwc1lXl9oVp4y
+sLfZv1y/t2t92ZBss1E9xuxgxH97BjH3ufSgDoKKKKAIbu6gsbWa9um8uC2jeaV8E7UjBZjhQScA
+dqLS6gvrWG9tW8yC5jSaJ8EbkkAZThgCMg96fNDFcRPBOiyxSqUkjcBlZWGGVlPBBFedWWqS+HPA
+ereH4dx1PS7qbSbVFcxXE7Xcha3uIogC4LLMXQDO7YcH0AOys/FOhX/9n/ZLrzP7X8/7D+7kXzfs
+2fO+8g27cfxYz2q3qmqWGi2Eup6nL5FrBt8yTaz43sqL8qKzfeYdq50favDWq+EfC1jKq2csN3Fd
+qkSIJmt4EcSYwxUmQljhuSec1yPiHUPFfiHwJfeJ7i7t49KvZFVNLEeWhhjuI40dbgBWaTzY+Qfl
+2kng4UAHrdFeb+LvG2oW/iO90aDWIfD8WnQoY3e2a7a7nmRJVDYhlEaKGxnr3w2cLdfxfrOu6b4b
+ttDaOwvfEPneddyIHEH2LH2nyoW8wNuKts3Hp1wTlQDu6K5nwlqmsy3+r+Htdlju7rRpIcX0aiPz
+o7pWlj3xKoVWVRzj6dtx6agArK8U/wBhf2Fdf8JN/wAgv939o/1n/PRPL/1Hz/f29K1axPGeiXXi
+Lw1eaNZPHHPc+VsaYkIPLljlOSqueielAHzhRRRQB718LJtGm8LJ/Y0Elv5cgjvfMJPmXawwedIm
+ZJPlbjHT6CuwrgvhzdeG/DfhuOCfXbFpb1lvZI3miiaFpYoQ0LKZWOVKdePpXW3XiHQLGdrW91Oz
+tp48b4pp443XIDDKs4IyDmgDQorP/wCEh0D7L9u/tOz+y+Z5P2jz4/L8zG/y9+/bu284ot/EOgXf
+mfZdTs5/IjaaXy5432Rp96R9rnCjPJNAGhRWV/wlnhb/AKDOn/8AgVD/APHKluvEOgWM7Wt7qdnb
+Tx43xTTxxuuQGGVZwRkHNAGhRVF9c0WOyj1GTULVLOZtkdy00Yidhu+VZC20n5D37U238Q6Bd+Z9
+l1Ozn8iNppfLnjfZGn3pH2ucKM8k0AStpOlPBPavZ27QXUhmuIjEhSWQkMZJF24ZsqDk+lSyWlrN
+PDdTQxyT227yJWQF4/MG19jEZXcODjrVD/hLPC3/AEGdP/8AAqH/AOOVLdeIdAsZ2tb3U7O2njxv
+imnjjdcgMMqzgjIOaAHJoeix2UmnR6fapZzNvktlhjETsNvzNGF2k/IO3an2uk6VYusllZ29s8cZ
+hRoYkjKxljKYwVUYUud2PXmmPrmix2UeoyahapZzNsjuWmjETsN3yrIW2k/Ie/am2/iHQLvzPsup
+2c/kRtNL5c8b7I0+9I+1zhRnkmgBw0PRVW2RdPtQtkxe0UQx4gZmDloht+QlhnjvVi3tLW08z7LD
+HB58jTS+WgTfI/3pH2gZY45Jqh/wlnhb/oM6f/4FQ/8AxypbrxDoFjO1re6nZ208eN8U08cbrkBh
+lWcEZBzQBdhhit4kggRYoolCRxoAqqqjCqqjgACq9jpOlaXv/syzt7PzceZ9niSLftzt3bFXONxx
+TH1zRY7KPUZNQtUs5m2R3LTRiJ2G75VkLbSfkPftTbfxDoF35n2XU7OfyI2ml8ueN9kafekfa5wo
+zyTQBaktLWaeG6mhjkntt3kSsgLx+YNr7GIyu4cHHWi4tLW78v7VDHP5EizReYgfZIn3ZE3A4YZ4
+Iqh/wlnhb/oM6f8A+BUP/wAcqW68Q6BYzta3up2dtPHjfFNPHG65AYZVnBGQc0AWre0tbTzPssMc
+HnyNNL5aBN8j/ekfaBljjkmi4tLW78v7VDHP5EizReYgfZIn3ZE3A4YZ4IqrJ4h0CGCG6m1Ozjgu
+d3kStPGEk8s7X2MXw208HHSi38Q6Bd+Z9l1Ozn8iNppfLnjfZGn3pH2ucKM8k0AaFFZX/CWeFv8A
+oM6f/wCBUP8A8cqW68Q6BYzta3up2dtPHjfFNPHG65AYZVnBGQc0AaFFZ8niHQIYIbqbU7OOC53e
+RK08YSTyztfYxfDbTwcdKLfxDoF35n2XU7OfyI2ml8ueN9kafekfa5wozyTQBoVzngp7JodYW1jZ
+JU1q/W7Zujy+buDL8x48ooO3I/E6EPifw3cSpBBq1jLLKwSONLmJmZmOFVVD5JJrF8OXui+Hzq0W
+p6na2tzeate3bW1xLHDJGrybI8rI4Yh0jDqcDIYfWgDrahurS1voGtb2GO5gkxvimQSI2CGGVYEH
+BGar3OuaLZxQz3moWtvFdLvt5JZo0WVcKd0bMwDDDDp60+31bSru1kvrW8t57WDd5txHKjxpsG9t
+7qxUYU5OaALE0MVxE8E6LLFKpSSNwGVlYYZWU8EEVFDp2n28qTwW0MUsUIto5EjVWWBTlYVYDIQH
++HpVe18Q6BfTra2Wp2dzPJnZFDPHI7YBY4VXJOAM0XXiHQLGdrW91Oztp48b4pp443XIDDKs4IyD
+mgC7NDFcRPBOiyxSqUkjcBlZWGGVlPBBFEMMVvEkECLFFEoSONAFVVUYVVUcAAVUudc0WzihnvNQ
+tbeK6XfbySzRosq4U7o2ZgGGGHT1p9vq2lXdrJfWt5bz2sG7zbiOVHjTYN7b3Viowpyc0ARXXh7Q
+L6drq90yzuZ5Mb5ZreOR2wAoyzIScAYoj8PaBDBNaw6ZZxwXO3z4lt4wknlncm9QmG2nkZ6UWviH
+QL6dbWy1OzuZ5M7IoZ45HbALHCq5JwBmmTeJ/DdvK8E+rWMUsTFJI3uYlZWU4ZWUvkEGgC79ktft
+X27yY/tXl+T9o2DzPLzv8vfjdt3c4qL+ydK+wf2X9jt/sP8Az6eUnk/e8z/Vbdv3uenWmXOuaLZx
+Qz3moWtvFdLvt5JZo0WVcKd0bMwDDDDp60+31bSru1kvrW8t57WDd5txHKjxpsG9t7qxUYU5OaAG
+RaHosKlIdPtY1MLWxVIY1Bgdi7w4C/cZmJK9M0XOh6LeRQQXmn2txFarst45YY3WJcKNsaspCjCj
+p6U218Q6BfTra2Wp2dzPJnZFDPHI7YBY4VXJOAM0ybxP4bt5Xgn1axiliYpJG9zErKynDKyl8gg0
+ASzaHotxE8E+n2ssUsxuZI3hjZWnYYaZlK4LkfxdaffaTpWqbP7Ts7e88rPl/aIkl2bsbtu9Wxna
+M0X2raVpez+07y3s/Nz5f2iVIt+3G7bvZc43DNFvq2lXdrJfWt5bz2sG7zbiOVHjTYN7b3Viowpy
+c0AS3Fpa3fl/aoY5/IkWaLzED7JE+7Im4HDDPBFTVn2viHQL6dbWy1OzuZ5M7IoZ45HbALHCq5Jw
+BmmTeJ/DdvK8E+rWMUsTFJI3uYlZWU4ZWUvkEGgBvin+wv7Cuv8AhJv+QX+7+0f6z/nonl/6j5/v
+7elWtJ+wf2VZ/wBl/wDHj9ni+yfe/wBTsXyv9Z833cdeax/HlrFq2gS+H1vLW0vNTaJLRbuURCRo
+5oXKqMMzHtwDyRWrodlLpui6fp05VpbS1ht5GQkqWijVGK5AOMj0oAvUUUUAVNQ0uw1T7N9ui837
+HcR3lv8AMy7Jos7H+Rlzjd0PFS3V3a2MDXV7NHbQR43yzOI0XJCjLMQBknFTVmeJdHXX9BvtIIUt
+cwssW8sqiVfnhZinOFkVT/jQBoTTRW8TzzusUUSl5JHIVVVRlmZjwABUUOo6fcSpBBcwyyywi5jj
+SRWZoGOFmVQclCf4ulcPea7Pqfw00yK0kkF7rv2fRVnnw2ZnY29w8zEudriKT5sFuQevS7qOpr4e
+1q50/TrK1VdL8MyXdtM6M04FvIUjt2l37jF8gO3rnnNAHZ0V5Zr2peNtX0/w3ql1BpttDd6lYy2M
+e6VpPtDKxiebBKiJ+Wwp3AEDqDXcaVrd1feJdd0aZIxBpX2PyGUEO32mJpX3ksQcEcYAoA26ZNNF
+bxPPO6xRRKXkkchVVVGWZmPAAFcrp3i3VL3wNb+I2htVvLlmjLSyC3tIP30kCzTNNLu2LtGQpLMe
+B14wYvG2o63a+I9Cv30+68jR7udbnTPOEYaMNE8Z+0D587wQy/L7nPAB6RDNFcRJPA6yxSqHjkQh
+lZWGVZWHBBFPrJ8J/wDIq6N/2D7X/wBEx1rUAFFFFAFTVvsH9lXn9qf8eP2eX7X97/U7G83/AFfz
+fdz05o0n7B/ZVn/Zf/Hj9ni+yfe/1OxfK/1nzfdx15pmuWUupaLqGnQFVlu7Wa3jZyQoaWNkUtgE
+4yfSjQ7KXTdF0/TpyrS2lrDbyMhJUtFGqMVyAcZHpQBzHia+/wCER8UJ4kCbrXUdPuLe5TPkxm5s
+0a5t2kkwytJIoMSAjPpnpWZrely6V8Hp4rrc15cLBd3jyoUlae4uYZX87cSxddwQlufl/CvQL3Tt
+P1OIQajbQ3cSsHWO4jWVQwBAYK4IzgmnXVpa30DWt7DHcwSY3xTIJEbBDDKsCDgjNAHmvjOPQ7PX
+dX1RJtP1G58u3XU9G1JVik2eWPnsLptjCTygOEz1zy21a0LHVNDsfGmnXfnR6dp0vheAWgu5Fj2o
+04aKMtI5ywQf3j0rsr3Q9F1OUT6jp9rdyqoRZLiGOVgoJIUM6k4yTT77SdK1TZ/adnb3nlZ8v7RE
+kuzdjdt3q2M7RmgDy9NXs38N6ldQx293Bqfix1t2vnkitAJAkyS3KIULxgLko/HcjjFXvA8dvF8Q
+blLe7sbw/wBks0v9lwJBaxO88LmGMxcShAw/eHk9DyK9CbSdKeCe1ezt2gupDNcRGJCkshIYySLt
+wzZUHJ9KLXSdKsXWSys7e2eOMwo0MSRlYyxlMYKqMKXO7HrzQB5f4a+y/ZfAn27y/svl679o87Hl
++XiXf5m/5du3rmum0r/hAb/Ura/t/wCx7by5FOnW0X2aOd5D8qTSquHDHP7uL+H7zfPhY+n/ALD0
+URRQDT7XyrdZUhj8mPbGs4ImVF24USA/Njr3qKHwx4bt5Ung0mxiliYPHIltErKynKsrBMgg0AeX
++I7my1FvEk0kmk6aLa6uYh56fbdUupYlWBUT7QWMcTn7pjA8vHHAJrb8LQ6fH4w0J5EhSabwravG
+zBQ7zgqm5SeS/koR67R6V3U2h6LcXT3s+n2stzKpSSd4Y2kZWTymVnK7iCny/TinrpOlJPBdJZ26
+z2sYht5REgeKMAqI4225VcMRgetAHlWl/YP7C8C/27/yBftGofavN3fZvO8yT7L52Pl+9n73GN2f
+l3Uap9g/sLx1/YX/ACBftGn/AGXyt32bzvMj+1eTn5fvY+7xjbj5dteq/wBk6V9g/sv7Hb/Yf+fT
+yk8n73mf6rbt+9z060f2TpX2D+y/sdv9h/59PKTyfveZ/qtu373PTrQByV9omkaJ428Iw6TZw2il
+dQRzEgVnEdsoXzH+85GTyxJrTvPDvnePLDxPcTxxw29m1pbRb9sklyfPYjayYZfJkc8Nnj0Brfkt
+LWaeG6mhjkntt3kSsgLx+YNr7GIyu4cHHWuK1O1nuPjBpM0K7ktdLeaY5A2oTdwg8nn55VHHrQB3
+dFc/rPjXTdI1IaPFbXmqXwj86W302H7Q8KfLtMo3rt3bh/XqM2vD/iXTfEkEstl5kU1tIYbq0uF8
+ueBwSMSx5bGdvHPt1BAANauZvfBMF74oi8QG42QeZBc3NlsJ865tEmjt5vO8wFdgkHygYOOc5rpq
+z9A1u18RaTBrNkkkcFzv2LMAHHlu0RyFZx1T1oAh1HQvt+u6Rrfn+X/ZH2n9zs3eb9pjEX39w27c
+Z6HNc1e/DGeawudEs9cuLXRpZPPttPMYkWFyyuVaRpA7x/eITI+bDHJBz3dFAHM6p4Sv5dZl13w9
+q8mjXV3Gsd8PJW6jm8sKsT+XKwVWVRjP5Y+bL9V8HLe2WnJZahdWuo6Qxez1KV2uZcvjzvOEjASC
+QDkcDt93Kno6qapqlhothLqepy+RawbfMk2s+N7Ki/Kis33mHagDP8NeGv7B+13V1dyajqWoyCS8
+vJBs37NwiRIgzKiorYAH8sAbdFFABXNfEe7urHwZqN1ZTSW08fkbJYWMbrmeFThlIIyDiulrK8U6
+7/wjWhXWt+R9p+zeX+53+Xu8yRIvvbXxjfnpQB81UUUUAetfCzwXplzpSa3rOnyLfQ3gmsppDLFm
+NUglhkRQyqy7iSDg5rsNU8BeE9av5dT1Ox8+6n2+ZJ50yZ2KqL8qSqv3VHas/wCFmt3WteFk+1JG
+n9nyCwi8sEZjghg2s+5m+b5ucY+ldhQBlah4W0LVNKttEvrXzbGz8v7PD5ki7PKQxJ8yOrHCtjk1
+Dpvgzw1pFre2Wn2fkwalH5N2nmyt5iYdcZeRivEjfdxW3RQBz+l+AvCei38Wp6ZY+RdQbvLk86Z8
+b1ZG+V5WX7rHtRqngLwnrV/Lqep2Pn3U+3zJPOmTOxVRflSVV+6o7V0FFAGVqHhbQtU0q20S+tfN
+sbPy/s8PmSLs8pDEnzI6scK2OTUOm+DPDWkWt7ZafZ+TBqUfk3aebK3mJh1xl5GK8SN93FbdFAHP
+6X4C8J6Lfxanplj5F1Bu8uTzpnxvVkb5XlZfuse1GqeAvCetX8up6nY+fdT7fMk86ZM7FVF+VJVX
+7qjtXQUUAZWoeFtC1TSrbRL6182xs/L+zw+ZIuzykMSfMjqxwrY5NQ6b4M8NaRa3tlp9n5MGpR+T
+dp5sreYmHXGXkYrxI33cVt0UAc/pfgLwnot/FqemWPkXUG7y5POmfG9WRvleVl+6x7Uap4C8J61f
+y6nqdj591Pt8yTzpkzsVUX5UlVfuqO1dBXBeKJIrjxzHp2o67daHYDSVuFa3vBaK0/2h0AJf5CSm
+e2ePagDqNQ8LaFqmlW2iX1r5tjZ+X9nh8yRdnlIYk+ZHVjhWxyah03wZ4a0i1vbLT7PyYNSj8m7T
+zZW8xMOuMvIxXiRvu4rmtFvP7P8AGVlpOh67ceIbG+t5Xv1uJftv2bygxilW4jwqb2O0r+fVcav/
+AAsrw39v+zf6R9j+0fY/7W8sfYPO279nn7/1xjv935qALel+AvCei38Wp6ZY+RdQbvLk86Z8b1ZG
++V5WX7rHtRqngLwnrV/Lqep2Pn3U+3zJPOmTOxVRflSVV+6o7VhS+Ml0Dxd4lhvxfX0US2csFrao
+0wgiS333E21mVI0DOu45HJFb+o+NdBsNLtNVSVr1NRZUsYbRfMnuGYhSscZKnKk/NnGDx97AoAfq
+Xgzw1q9rZWWoWfnQabH5Nonmyr5aYRcZSRS3Ea/ezRpvgzw1pFre2Wn2fkwalH5N2nmyt5iYdcZe
+RivEjfdxWfdeN7W98Kavq2jrcJe6dHJHJavEPtNtNyiPLCxYbVPzE8jAPcEVq+FNSn1fw3p2pXSy
+LPPboZTKgjZ3A2tIFXja5G5cfwkUAVdL8BeE9Fv4tT0yx8i6g3eXJ50z43qyN8rysv3WPajVPAXh
+PWr+XU9TsfPup9vmSedMmdiqi/Kkqr91R2rn/Geqa5NrF42gzSCPwtZxX1xHHI0SSTySxymG5Xen
+mx/ZY2bC+4zk4rQ8b3r32laA+l3txawatqlnF9otHaCRoLlJOh4IyCDgj8KANXUvBnhrV7WystQs
+/Og02PybRPNlXy0wi4ykiluI1+9mptP8LaFpelXOiWNr5VjeeZ9oh8yRt/moIn+Z3ZhlVxwa5fUr
+S98Gavok1nrl9fDUr6OwnstTn+0B4pioaWMfIVMZxyB1YdshtfwRd3V3/b/2qaSfyNcvIYvMcvsj
+Ty9sabicKM8AUATaX4C8J6Lfxanplj5F1Bu8uTzpnxvVkb5XlZfuse1GqeAvCetX8up6nY+fdT7f
+Mk86ZM7FVF+VJVX7qjtXQUUAYmpeDPDWr2tlZahZ+dBpsfk2iebKvlphFxlJFLcRr97NTaf4W0LS
+9KudEsbXyrG88z7RD5kjb/NQRP8AM7swyq44NatFAHP6X4C8J6Lfxanplj5F1Bu8uTzpnxvVkb5X
+lZfuse1GqeAvCetX8up6nY+fdT7fMk86ZM7FVF+VJVX7qjtXQUUAYmpeDPDWr2tlZahZ+dBpsfk2
+iebKvlphFxlJFLcRr97NTaf4W0LS9KudEsbXyrG88z7RD5kjb/NQRP8AM7swyq44NatFAHP6X4C8
+J6Lfxanplj5F1Bu8uTzpnxvVkb5XlZfuse1RXfw48GX11Ne3WneZPcyNNK/nzjc8hLMcLMAMk9q6
+WigDE1LwZ4a1e1srLULPzoNNj8m0TzZV8tMIuMpIpbiNfvZqbT/C2haXpVzolja+VY3nmfaIfMkb
+f5qCJ/md2YZVccGtWigDn9L8BeE9Fv4tT0yx8i6g3eXJ50z43qyN8rysv3WPaorv4ceDL66mvbrT
+vMnuZGmlfz5xueQlmOFmAGSe1dLRQBj6v4S0DXorWHWLZrtbJSkBeabcAwQNudZAzk7ByxJp+n+F
+tC0vSrnRLG18qxvPM+0Q+ZI2/wA1BE/zO7MMquODWrRQBz+l+AvCei38Wp6ZY+RdQbvLk86Z8b1Z
+G+V5WX7rHtUV38OPBl9dTXt1p3mT3MjTSv5843PISzHCzADJPaulooA4r4taXYXfhO41O4i33Wn7
+Pssm5hs8+aBJPlDBTlR3BroPCf8AyK2jf9g+1/8ARMdQ+M9buvDvhq81mySOSe28rYswJQ+ZLHEc
+hWQ9H9au6Hey6loun6jOFWW7tYbiRUBChpY1dguSTjJ9aAL1FFFABRRXKP8AEK1+1Xdra6NrF79i
+uJLSWW0tRLH5kR2sAyy/jzQBFp3gq6s/F76y8sZ06K4u7+0VWJn+038cEUyyjywnljY2zBz0yTVj
+XPC+oanrWoajBJCsV3oM2kRq7MGE8sjOrMAhGzB65z7VpWev/bP7P/4luoQf2j5/+vg2fZvIz/x9
+fMfL8zHydc1rUAclq3hfWrjw3oGnadJai/0OayuGa4aTyGa0iZCAUTeQXx2HHpRd+H/Flt4j1LVP
+D91YxW+tLbrcSXSSPPbmBDDugRf3bkA7hvOCeOnJ6LT9UsNU+0/YZfN+x3ElncfKy7Josb0+dVzj
+d1HFW6AOEPgPVT4I0rQPMs5L7SrwXuyYPJaTYlnfypPlVtpWbn5eenfNEXg3xPcXV/ealPp6m70O
+bR7e3s1eKG3LH90iAoSYwBuJ6gnAGAK7uigCjodlLpmi6fp05VpbS1ht5GQkqWijVGKkgHGR6Veo
+ooAKKKKAMzxPNLb+G9WngdopYrG5eORCVZWWJyrKw5BBo8MTS3HhvSZ53aWWWxtnkkclmZmiQszM
+eSSasatff2XpV5qezzfsdvLceXnbv8pGfbuw2M7euKNJvv7U0qz1PZ5X2y3iuPLzu2eaivt3YXON
+3XFAFuvMtOjl12W7h8Q+KL7RvEbzNGdMhnNrBAzkpbxxRMcTAhQ2Y35DDnJ3H02uEudY1OzsH0fx
+Z4dvPEV1bySvbXMdpDPbXKhpFglcR71hYqcFdpYDnnOKAN2y1i90xtG0LxGVn1fUluF8+0H7gm1X
+zCzb/LYFkI6LjdnoKyPHfib/AIkXiKx0yS4tb7RvsPmXCHy/+PqSJ18p0fd93IbpWYmm694bt/B1
+7qFndak2jrfR3kdkPtUsf2lMQRhdwyEX5SR8oxgHpmlqtrrmsWHjS8OkXls+pf2U1pbvGzSSJEy8
+gIDlggDOozs6HpQB2ujeN9G1rUjpcK3FrO8fn2n2uIwi7hO7E1tuOWXC55AOO3BxUvfiPo1jdXMM
+lpqElrY3H2S61GO3LWkUgKo4eTcG+Vmwfl+mcjNW3l1nxL4v0m+m0m40qDQY7n7W93gCSa5j8kx2
+xUESqpTO8cEenG7H1ptXs9euLrw1ompafrH24b2gUzaZqMRwqyXR3xxoSHLZA+Uk7ju+ZQDurHxB
+p982pIxa0bSJmhu1utsZVVXeJ8bziJ15VjjIBrHb4iaaY7I2+m6pdT31u14lrBbb5kgDmJJZFEmN
+rkfKQTxjpkZzfiJpt7ayx3uiTrb3HiNotAu43X91IJixjnbaPvqqmPcVY7G+XBFHjLT7W0ls7W10
+bUgbWx8jTtY0bfLcWzIdggeNXRimzu787iF53EAEs/jxr3XvC66Ol0+m6uszTgQKd5OYVXc2SDby
+IWl2nAXn5hWhqfxE0HS9QnsXjurlLJo0vry1i823tWkbYFnkDZBB64B9PvZFY6S+JJ7/AMEatrdh
+cPdR/bI77yISfK+0KkEMk4X5Y8qwZ84x83AxisfUPD+qWmr61YXVvr00eqXU1zaDR5gtjMt2W+S6
+MkZWM9Fdmzx2wAWAO41vxrpuh6qmizW15dXstuLmGGzh85pQXZCiAODuARmOcDaOueKr23xE0G7u
+rGCGO6aLUGhhW7EW63juJ0EiWssqsR5uCNwXOM8ng4r6TpF1p3jSzXyJBa2vhuKy8/mSMSRzr+78
+7y4lZtoz91c9cCsTTtJ1VPBfg+1ezuFntdchmuIjE4eKMT3TGSRduVXDA5PrQB6XXKan4l1K3+IO
+k+F4fLWyurd7mZtuZGIS7wm4nAXMSngZ4644rq65zULnw5B4002KSFZteuYWijdt+YbUJcy+YuVM
+eS8ZTs2G9OKAK81k8viXU7vwpqMdvqkUcI1ayuoGlgmfyn+xlpMoyfKeTGx7ZHXOL4k126j8P+Jo
+/Ij03X9O/s4Xt7pzlRN5zQmN0m2xS8LuXa2cDjJrqtb8J2GtXSah9ovNPvkjEH2uwnaCQwgs/kt9
+5du5t33c8Dmq8HgPQYdEvdDcTTLqbGS8u5X3XUsm7zEkeXaMlG5Axj1By2QBmvXd1D408L2sM0kc
+Fz/aHnxK5CSeXArJvUHDbTyM9K4XSItZ0T4e2fjKx1a4V7GQ+Xpxx9jaFrl4HjkiUjczPIzbyc44
+GMBh3Wn+A9NsNWtNce91C+vrPzAk17P5xZJEMfltlB8q7mK4xyxzmqtl8LfDdn9mjMt5cWttJ55s
+p5g9tNN8wE00IRVLBWC8YBAAIPOQDK8axazaazdajql/qljockcMVld6VMBHayMNjG8tl2uy7yWL
+A+i5JIC7GpXl7od7oniCW/a+0yeGPTtSlBxb5m2tBqCxowhjDScO5bAUgLU+s+A9N1i/utQ+26hY
+vfxpFex2U/lxzhFMa+ajI+fkO3HT25OW+LZJdM8PDw3oml3V619avp1qLdS0UC7EgUzzOTsAV8gt
+1xyR1oA5ef8A4SvxCkvibT7nUJNHuNQnBttMuPImNjbL5ME9qkoZgxZZDJHwXbb8o6hmueVqHwqu
+7u31m61SCK6SaJpyFnRWljT7JeHLmQoZN2fXaR8oFdbL4E02fStJ0/7RcWc+jR7ILzT2+yyZdAk7
+YAcDzSNzd/fk5ePAukf8I5deGjNdPDfzfabq5eQPcSSl0kLs7IVyfLUfd/XmgDnfF9/qVtrmneF4
+rjWJLG109bqV9IXzNQncM9urTS7l+X5QWOOSeRyCteXU/FM3hbRbaae+0y/GvQ6cl5cxtFPNAyyG
+KWaBsBhhgGUswYryxrrdU8FabqqWDy3N5BfabGIYtTt5tl4yBSjCSbYd27JJ46k4xk5d/wAIbpAs
+rGyQzKLC+j1Tzt4aW4uo9xMlzI6sXLlvm6e2BxQByFzaaun/AAlGkx65qQtvDkK30EhnJuppZrXz
+VSW46+Uhib5FAzuyTwK6LUpNN1b4dwXHiq6kgtbuzs5ry5hX597mCQEKkUg+aTHRK05PC+nyTa3O
+0k27xBClvdgMuEWOJrcGL5ODtfvnms/xZ4dubjwHL4b0VGuZYoba3t0dkVmWCSHlmby1ztjz2oA+
+faKKKAPf/hp/YX/CLQf2F/sfb/8AWf8AH55MPn/638Pu/L6V1dcf8LNEutF8LJ9qeN/7QkF/F5ZJ
+xHPDBtV9yr83y84z9a7CgAooooAKKKKACiiigAooooAKKKKACuSvdDi1P4iCfUdPW7sF0UIslxCJ
+YBOLkkKGdSm/YT74rraKAOP0PSZPCXiu7sLOzkl0rXc3UVzFEgS0mj8xnt5WjUERkEeXnAH3QCdz
+VzX2HxJ/wif/AArP+x7j7Z9o8r+0ufsHk+d9s8/z9v4bcZ/4F8leq0UAcFLqWr+HPF3iXUI9EvtR
+tr1bMQSWsZYNLFb4Vfu5KE7gzrnaQARyKqQaDr3hjS/CeovZNfvoTXYvrS0PmThdQJAMagYcxhvm
+APXvtyw9IooA4K0s9X1Gx8Za/NYTWY1y1MNlZSg/amFtbzQBniC5UyEjC9fqME9L4PaVvC2lpPbz
+WssNrHbyQ3KGORWgXyWJQ84JTK+2K2KKAPP9M8GT+Jv7S17WbzVNMfWLiUfY4XFqxs48wQR3UJhO
+WCA9yCp9zVS40nVdS8KaF4f1azuLh9N1yGxvCInVHtIfOjE0bIqN5PlOq+Zgf1r0uigDB0fwN4V0
+G9GoaVYLDcqpRZGkklKhuG2+bI4Bxxkc4471X8EWl1af2/8AaoZIPP1y8mi8xCm+N/L2yJuAypxw
+RXTUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAZXin+wv7Cuv+Em/wCQX+7+
+0f6z/nonl/6j5/v7elWtJ+wf2VZ/2X/x4/Z4vsn3v9TsXyv9Z833cdeaz/GeiXXiLw1eaNZPHHPc
++VsaYkIPLljlOSqueielXdDspdN0XT9OnKtLaWsNvIyElS0UaoxXIBxkelAF6iiigArzrw3/AMJp
+9q8Q/wDCOf2X9l/ty93/AG/z/M8zKZ2+T8u3bt/WvRaz9I0S10X7b9leR/7QvJb+XzCDiSfbuVNq
+r8vy8Zz9aAMLWJtTPiTwnp95O0RvYb9NQjs5ZYopHW2QnbtZXwrklCeR161meGrrXNR8Qf8ACNah
+q8dxH4ZkZ5pYJGWbUAyhYFlCEN+4bPnfMQWwrBj81dbqWg2+p6jY6q800Fzpq3C2zQlMA3UflMzL
+JHICVAyvbPXNUrLwPoemppY09ZLaTR5HlhmQqXlMyiOfz96MreYoGTgEYG0qKAOEjiutE8F+Mrqy
+v7wTw6wbZJWmO8eVPApl3LtPmSCXEjfxYFdrr13dQ+NPC9rDNJHBc/2h58SuQknlwKyb1Bw208jP
+Sn/8ILpDWus2U011Lb69Mbm4ieQbYpS5l3wBUXad2Ouc7RnIpmn+A9NsNWtNce91C+vrPzAk17P5
+xZJEMfltlB8q7mK4xyxzmgDktKv9e0z4dzeNX1a6vL1oWt7eG5bzIIle7WHzCjZMkqncVdj0IXGB
+V7wbd65a+ILa0KeILqxu7do7yTW4WRIZ41MizROWl2q+CuzI6j5m4x1th4V0ix8OL4WdGu9PCujL
+ckMzCR2lOWRUwQzfKRgjjvVfQvBWm6FPHci5vNQkto/JszfzecLVCArC3UIipuUAHjoMdM5AOS0l
+Nb07xDY2fifWNSsNVnunlRpZVuNLv4g5DQwoPLETuGwqsPl4wAzKB6bXKWXw40axuraaO71CS1sb
+j7Xa6dJcFrSKQFnQpHtDfKzZHzfXOTnq6ACiiigCpq1va3elXlrfSeRaz28sdxLuCbI3Rld9z5UY
+U5yaNJt7W00qztbGTz7WC3ijt5dwffGiKqPuTCnKjORUXiG1nvtA1OytV8ye5s54YkyBueSN1UZY
+gDJPejw9az2OgaZZXS+XPbWcEMqZB2vHGisMqSDgjtQBoUUUUAFFFFABRRRQBjnwxZP4jXxLPcXU
+9xCrLbW8kube3LosTtDGAMFlXnnHOeuMbFFFABRRRQAUUUUAFcvqHhyWfx/pviiS5hht7a1a1jhY
+nzZpyLk7VBwMCOQt1J+Xpjmuorh9Wm1CT4saLaRvM9nDYvcyQqWMSMVvYfOZB8oPzhd3vigDuKKK
+KACiiigAooooAKKKKACiiigArmviPd3Vj4M1G6sppLaePyNksLGN1zPCpwykEZBxXS1ieM9StdI8
+NXmoXtlHqUEPlb7SbGyTdLGgzuSQfKW3fd7UAfOFFFFAHtXwn1O6/wCELvLq6a4vfsVxKsUSkyye
+XFBAywwqx/BVFdBpfi/+1L+Kx/sXWLPzd3+kXlp5UKbVZ/nfzGxnbge9c/8ABX/kVrr/ALCEn/om
+3r0CgDmrvxt9kuprX+wNcn8iRo/Nhs98b7CV3xt5gypxkGtDXdf/ALD8j/iW6hqPn7/+QfB5/l7N
+v+s+ZcZ3cfQ1q0UAZWn6/wDb9KudU/s3ULb7N5n+iXMHl3MvloJP3UW47t2cLzyaqaX4v/tS/isf
+7F1iz83d/pF5aeVCm1Wf538xsZ24HvXQUUAc1d+Nvsl1Na/2Brk/kSNH5sNnvjfYSu+NvMGVOMg1
+oa7r/wDYfkf8S3UNR8/f/wAg+Dz/AC9m3/WfMuM7uPoa1aKAMrT9f+36Vc6p/ZuoW32bzP8ARLmD
+y7mXy0En7qLcd27OF55NVNL8X/2pfxWP9i6xZ+bu/wBIvLTyoU2qz/O/mNjO3A966CigDmrvxt9k
+uprX+wNcn8iRo/Nhs98b7CV3xt5gypxkGtDXdf8A7D8j/iW6hqPn7/8AkHwef5ezb/rPmXGd3H0N
+atFAGJD4n87Rp9Z/snVI/s8gj+xSW227kyYxvjh3/Mv7zrnsfSotL8X/ANqX8Vj/AGLrFn5u7/SL
+y08qFNqs/wA7+Y2M7cD3roKKAOau/G32S6mtf7A1yfyJGj82Gz3xvsJXfG3mDKnGQa0Nd1/+w/I/
+4luoaj5+/wD5B8Hn+Xs2/wCs+ZcZ3cfQ1q0UAYkPifztGn1n+ydUj+zyCP7FJbbbuTJjG+OHf8y/
+vOuex9KNE8T/ANtXT2v9k6pp+yMyebf23kRnBVditvb5vmzj2NbdFAHNXfjb7JdTWv8AYGuT+RI0
+fmw2e+N9hK7428wZU4yDWhruv/2H5H/Et1DUfP3/APIPg8/y9m3/AFnzLjO7j6GtWigDEh8T+do0
++s/2Tqkf2eQR/YpLbbdyZMY3xw7/AJl/edc9j6UaJ4n/ALauntf7J1TT9kZk82/tvIjOCq7Fbe3z
+fNnHsa26KAOau/G32S6mtf7A1yfyJGj82Gz3xvsJXfG3mDKnGQa0Nd1/+w/I/wCJbqGo+fv/AOQf
+B5/l7Nv+s+ZcZ3cfQ1q0UAYkPifztGn1n+ydUj+zyCP7FJbbbuTJjG+OHf8AMv7zrnsfSjRPE/8A
+bV09r/ZOqafsjMnm39t5EZwVXYrb2+b5s49jW3RQBzV342+yXU1r/YGuT+RI0fmw2e+N9hK7428w
+ZU4yDWhruv8A9h+R/wAS3UNR8/f/AMg+Dz/L2bf9Z8y4zu4+hrVooAxIfE/naNPrP9k6pH9nkEf2
+KS223cmTGN8cO/5l/edc9j6UaJ4n/tq6e1/snVNP2RmTzb+28iM4KrsVt7fN82cexrbooA5q78bf
+ZLqa1/sDXJ/IkaPzYbPfG+wld8beYMqcZBq1rfif+xbpLX+ydU1DfGJPNsLbz4xksuxm3r83y5x7
+ituigDEh8T+do0+s/wBk6pH9nkEf2KS223cmTGN8cO/5l/edc9j6UaJ4n/tq6e1/snVNP2RmTzb+
+28iM4KrsVt7fN82cexrbooA5q78bfZLqa1/sDXJ/IkaPzYbPfG+wld8beYMqcZBq1rfif+xbpLX+
+ydU1DfGJPNsLbz4xksuxm3r83y5x7ituigDK/t//AIkX9u/2bqH/AF4eR/pn+s8r/Ubv+Bdfu81D
+onif+2rp7X+ydU0/ZGZPNv7byIzgquxW3t83zZx7GtuigDmrvxt9kuprX+wNcn8iRo/Nhs98b7CV
+3xt5gypxkGrWt+J/7Fuktf7J1TUN8Yk82wtvPjGSy7GbevzfLnHuK26KAMr+3/8AiRf27/Zuof8A
+Xh5H+mf6zyv9Ru/4F1+7zUOieJ/7auntf7J1TT9kZk82/tvIjOCq7Fbe3zfNnHsa26KAPP8Ax94y
+uotF1KxstP1ixnikWNNS8kwwDZMgLrcLJna4GFPfPvWqfFtr4a8F6LrOsi4uftNvaxs0eJJGkkg8
+0u5lkTOdhyc11dFAHL6J8QtF17T9T1Gzhuki0eH7RcLKkYZl2yviPbKwJxEepFZ+nfF3w3qWoW2n
+QW18st3NHbxs8cQUNKwRS2JycZPpXcUUAcfr/wAUNA8O6tPo17b3kk9ts3tCkZQ+YiyjBaZD0f0r
+Q1fxrpWi6BZeI7qK4e11DyvKSNUMg8+Npl3hpFX7q84Y10FFAHL6J8QtF17T9T1Gzhuki0eH7RcL
+KkYZl2yviPbKwJxEepFV9A+KGgeItWg0ayt7yOe537GmSMIPLRpTkrM56J6V2FFAHH6/8UNA8O6t
+Po17b3kk9ts3tCkZQ+YiyjBaZD0f0rQ1fxrpWi6BZeI7qK4e11DyvKSNUMg8+Npl3hpFX7q84Y10
+FFAHL6J8QtF17T9T1Gzhuki0eH7RcLKkYZl2yviPbKwJxEepFV9A+KGgeItWg0ayt7yOe537GmSM
+IPLRpTkrM56J6V2FFAHH6/8AFDQPDurT6Ne295JPbbN7QpGUPmIsowWmQ9H9K0NX8a6VougWXiO6
+iuHtdQ8rykjVDIPPjaZd4aRV+6vOGNdBRQBy+ifELRde0/U9Rs4bpItHh+0XCypGGZdsr4j2ysCc
+RHqRVfQPihoHiLVoNGsre8jnud+xpkjCDy0aU5KzOeieldhRQBwnjX4kaVpB1Tw4EvE1Fbdo4riE
+IESSaEPE4fzlcbfMHO2rFl470/SvAukeINSW6uFnWOzdlCvK08ayJI7F5VyGaBjnOa7OigDn/Cnj
+XSvGH2r+zIriL7H5fmfaFRc+bv27dkkn/PM5rH074u+G9S1C206C2vllu5o7eNnjiChpWCKWxOTj
+J9K7iigDl/FHxC0XwlqEenajDdSyywrcK1ukbLtZnTB3yxnOYz2oufiFotr4ZtPFUkN0bO9mNvHG
+qR+aGUzDLKZQuP3J/irqKKAOf8KeNdK8Yfav7MiuIvsfl+Z9oVFz5u/bt2SSf88zmsfTvi74b1LU
+LbToLa+WW7mjt42eOIKGlYIpbE5OMn0ruKKAOP1/4oaB4d1afRr23vJJ7bZvaFIyh8xFlGC0yHo/
+pVi5+IWi2vhm08VSQ3Rs72Y28capH5oZTMMsplC4/cn+KuoooA5/wp410rxh9q/syK4i+x+X5n2h
+UXPm79u3ZJJ/zzOax9O+LvhvUtQttOgtr5ZbuaO3jZ44goaVgilsTk4yfSu4ooA4/X/ihoHh3Vp9
+Gvbe8knttm9oUjKHzEWUYLTIej+lWLn4haLa+GbTxVJDdGzvZjbxxqkfmhlMwyymULj9yf4q6iig
+Dn/CnjXSvGH2r+zIriL7H5fmfaFRc+bv27dkkn/PM5rmoPi5Zar4g0vTNOtbiK1uLhYp5ZfL3sZV
+khSPywXAUSPGxYPngjHr6LRQBy/ij4haL4S1CPTtRhupZZYVuFa3SNl2szpg75YznMZ7VY/4TXSv
++ET/AOEx8q4+w/8APPannf677N93zNv3v9rpXQUUAcv4X+IWi+LdQk07TobqKWKFrhmuEjVdqsiY
+GyWQ5zIO1Z+nfF3w3qWoW2nQW18st3NHbxs8cQUNKwRS2JycZPpXcUUAcv4o+IWi+EtQj07UYbqW
+WWFbhWt0jZdrM6YO+WM5zGe1WP8AhNdK/wCET/4THyrj7D/zz2p53+u+zfd8zb97/a6V0FFAHL+F
+/iFovi3UJNO06G6iliha4ZrhI1XarImBslkOcyDtWfp3xd8N6lqFtp0FtfLLdzR28bPHEFDSsEUt
+icnGT6V3FFAHL+KPiFovhLUI9O1GG6lllhW4VrdI2XazOmDvljOcxntRc/ELRbXwzaeKpIbo2d7M
+beONUj80MpmGWUyhcfuT/FXUUUAcv4X+IWi+LdQk07TobqKWKFrhmuEjVdqsiYGyWQ5zIO1c7qnx
+I8F+LbM+HL1NQtYL+SKN7jEEYjxIjh2dppAqgr8x2nivSqyvFn/Iraz/ANg+6/8ARMlAHzVRRRQB
+7V8Ff+RWuv8AsISf+ibevQK8/wDgr/yK11/2EJP/AETb16BQAUUUUAFFFFABRRRQAUUUUAFFFFAB
+RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZXiHxPo3he1W61efy/M3CGJAWklZRuKoo
+/LJwoyMkZrVryfwvp6/Efxhf+KdXiaTSrNhHaQS7gjFT+5jZT5ikKo3yKGxuYcFWIoA29H+J2oa7
+qEUOneHbqWwlultmvg7MsasyjfKEt2VSqsGZd/Hr3rvaZDDFbxJBAixRRKEjjQBVVVGFVVHAAFPo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
+ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArK8Wf8itrP8A
+2D7r/wBEyVq1leLP+RW1n/sH3X/omSgD5qooooA9q+Cv/IrXX/YQk/8ARNvXoFef/BX/AJFa6/7C
+En/om3r0CgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
+oooAK8/+Cv8AyK11/wBhCT/0Tb16BXn/AMFf+RWuv+whJ/6Jt6APQKKKKACiiq+o3sWmafc6jOGa
+K0hkuJFQAsViUuwUEgZwPWgCxRXDw698SLjS08RQadpstlKouo9PRpmvWt2O5VVgfLLmPnp/wHPy
+1sWnjC1u/EkPh3yvIkn09L/984SZJHIP2WSDBIkEZ3kbunbHNAHQUVU/tbSvt/8AZf2y3+3f8+nm
+p533fM/1W7d93np0ok1bSopzay3luk6yRwtE0qBxJMC0UZUtnc4BKjv2oAt0VU/tbSvt/wDZf2y3
++3f8+nmp533fM/1W7d93np0ovtW0rS9n9p3lvZ+bny/tEqRb9uN23ey5xuGaALdFFUbnXNFsmkS8
+1C1t2gZElWWaNCjSKXjVwzDBZVJGeooAvUVXutR0+xZEvbmG3aRZHRZpFQssS75WUMRkIvLegqG5
+1zRbOKCe81C1t4rpd9vJLNGiyrhTujZmAYYYdPWgC9RUN1d2tjA11ezR20EeN8sziNFyQoyzEAZJ
+xTYtR0+ayOow3MMlmFZzcpIrRBUzvbzAduF2nPNAFiiq9lqOn6nEZ9OuYbuJWKNJbyLKoYAEqWQk
+ZwRUNlrmi6nKYNO1C1u5VUu0dvNHKwUEAsVRicZIoAvUVRl1zRYb0adNqFrHeFlQWzzRrKWfGxfL
+LbstuGOKrrq32e/1T+07zT4rGz+z+XiXbND5q/N9s3sFTexHl+ooA1qKqW+raVd3Ulja3lvPdQbv
+Nt45UeRNh2NvRWLDDHBzTJ9c0W1lmgudQtYZbZQ88ck0atErFArSKzAqCZFxn1HrQBeooooAKKKK
+ACiiigAooooAKKo65ey6ZouoajAFaW0tZriNXBKloo2dQwBBxketGh3sup6Lp+ozhVlu7WG4kVAQ
+oaWNXYKCScZPrQBeorn/AAt4m/tTwna+I9bkt7PzfM858+VCm2Z4U5ldsZ2jq3WtJNc0WSyk1GPU
+LV7OFtklys0ZiRjt+VpA20H5x370AXqKr22o6feSzwWdzDcS2rbLiOKRXaJssNsiqSVOVPX0rnIP
+Gf8Aa+k6xdaTNp9rPpd4bWOW+uN1s8YdFS4kaPYVWUFgnXkdTQB1dFVL7VtK0vZ/ad5b2fm58v7R
+KkW/bjdt3sucbhmi+1bStL2f2neW9n5ufL+0SpFv243bd7LnG4ZoAt0UyGaK4iSeB1lilUPHIhDK
+ysMqysOCCKfQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZXiz/AJFbWf8AsH3X/omStWsr
+xZ/yK2s/9g+6/wDRMlAHzVRRRQB7V8Ff+RWuv+whJ/6Jt69Arz/4K/8AIrXX/YQk/wDRNvXoFABR
+RRQAUUUUAFFFFABRRRQAUUUUAFFFcJoGt/EnxFpMGs2SaHHBc79izC6Djy3aI5Cs46p60Ad3RXOe
+H9c1qTV7rw74nitYtQhhS8tnsjIYprdz5bMBJkqUkGDuIzngYGT0dABRRRQAUUUUAFFFFABRRRQA
+UVif23df8Jp/wjmyP7L/AGX9v34PmeZ5/k7c7tu3b/s/jW3QAUUUUAFef/BX/kVrr/sISf8Aom3r
+0CvP/gr/AMitdf8AYQk/9E29AHoFFFFAHKeH/CWq6T4u1nX7rUPtFrqWfKgy5b5mDr5gY7R5KjYm
+M/Kf4eldLdyTw2s01rD9pnjjdooNwj8xwCVTe3C7jxk9KmooA8ybUvB9p4ebxF4c1ZtDvTDLdf2X
+a3IdGu5U2eXJZTpIpCuNoKxqMfN0AI0NMaKb4i6fe6nbw22oXnh2K4eNkEbi7Z8SBVf596xqy/3t
+ox0FdfLoeizXo1GbT7WS8DK4uXhjaUMmNjeYV3ZXaMc1M+nafJex6jJbQveQrsjuWjUyop3fKshG
+4D5z370AeJaZDeS6YrmfR7XVYNQEpluxdPrQvFmGAYhHM0mWIG0Iy9yNwJHoGj6Vpt98RfE17eW0
+c89l/Z32Z5F3eWXgDFkDcBsxLhuo7d66r+ydK+3/ANqfY7f7d/z9+Unnfd8v/W7d33eOvSpY7S1h
+nmuoYY457nb58qoA8nljam9gMttHAz0oA8Q0yG8l0xXM+j2uqwagJTLdi6fWheLMMAxCOZpMsQNo
+Rl7kbgSOwv8A/hF/+E38Rf8ACa+X5f2O2/s/7bv2/Z/K/wBI+y543eZ02fNu3bed1d1/ZOlfb/7U
++x2/27/n78pPO+75f+t27vu8delF9pOlaps/tOzt7zys+X9oiSXZuxu271bGdozQBifDf7V/whGl
+fbPM8zy32+bnd5fmyeTjdzt8vbt/2cY4rmrj/hDf+E78U/8ACW/Z/wDj3tfI+05/1f2dPP8AKx/y
+0+5t2/P/AHe9el1zlv4Uik8Qa5qOrwWt7Z6m1m9tDKglKNbQvCzOkibQfn4wTxQBxWj6euqRfD6y
+1yFriN11NzFc7juSMCW3yG6ptRNo6Fcdq0LmHwlb+Mdfg8XJDFbRWNqmlx3IZY1tVixMtmv3QQ/3
+fL+bO7b/ABV6FJaWs08N1NDHJPbbvIlZAXj8wbX2MRldw4OOtRX2k6Vqmz+07O3vPKz5f2iJJdm7
+G7bvVsZ2jNAHl9p5f9jeBP8AhKfM/srzLz7R9q3+Ruy39n+bn5du37m75dmf4c1b8X/8I7/wiLf8
+Ij5f9m/24n9qeX9o+ybtvz+Z5XzeTu8v/V/L02c4r0q6tLW+ga1vYY7mCTG+KZBIjYIYZVgQcEZp
+sWnafDZHTobaGOzKshtkjVYir53r5YG3DbjnigDzrw/bQi9183l3pMWmXWkt/aMfh8SvFGF3os24
+wyRo4jMnyK2T12HrTPB7aHY+JdJ0wLp+qMbeRtL1fTwtvOD5TGVNQt0kzu8vhS4z/wACLbfSLLTt
+P0yIwadbQ2kTMXaO3jWJSxABYqgAzgCobLQ9F0yUz6dp9raSspRpLeGOJipIJUsig4yBQB5hro8L
+aXqGp3btY65YXOpSDVLKZVg1O1k3DzDaTboZJE8w8gcYGM8u1WPGH/NQf+4L/wC069Hl0PRZr0aj
+Np9rJeBlcXLwxtKGTGxvMK7srtGOafNpOlXH2j7RZ28v2zZ9q3xI3neV/q/Nyp37MfLnpQByV9om
+kaJ428Iw6TZw2ildQRzEgVnEdsoXzH+85GTyxJrh7v8A4Rf/AIV1N9u8v/hKftj/AGjzt/237R55
+3+Zv+fb5PXPy7v8Abr2qS0tZp4bqaGOSe23eRKyAvH5g2vsYjK7hwcda4W68EeK9YdrLWrjSza3E
+gF7qdtb+XqVzBGwkjjc+V5a8xp06bR97GGAPQKKKKACiiigAooooAK5Tw/4S1XSfF2s6/dah9otd
+Sz5UGXLfMwdfMDHaPJUbExn5T/D0rq6KAMnxZ/yKus/9g+6/9EyVzXh7wR9r0DTLr+39cg8+zt5P
+KhvNkab40bZGvlnCjOAK7iaGK4ieCdFlilUpJG4DKysMMrKeCCKIYYreJIIEWKKJQkcaAKqqowqq
+o4AAoA8isr2OLwh4RsWh0+R7mTUJEl1mRxYxeVJLnzYlZUZm8zCM2dp6feyKTR28Xh/xxFa3cN/F
+G2loLm2gS2icrMQ2yKH5AA2RleG+93r199D0WSyj06TT7V7OFt8ds0MZiRju+ZYyu0H5z271leKf
+CkWq+HL/AEnRYLWzub1bdPM2CJSts8ZRXaJGbCom1eOOlAHO2H/CL/8ACb+Hf+EK8vy/sdz/AGh9
+i37fs/lf6P8AascbvM67/m3bd3O2se7h0+38E+OILVIYpYtaKGOMKrLAtzAIF2ryEB37O3XHevVb
+bTtPs5Z57O2ht5bpt9xJFGqNK2WO6RlALHLHr61CdD0VluUbT7UresHu1MMeJ2Vi4aUbfnIY5570
+AcRf/wDCL/8ACb+Iv+E18vy/sdt/Z/23ft+z+V/pH2XPG7zOmz5t27bzuqHxNb+GxdadqGk3mn/a
+LfR4/semaxEGtLmzyfI2y3OzZJycZbccDOF3E+gX2k6Vqmz+07O3vPKz5f2iJJdm7G7bvVsZ2jNF
+9pOlaps/tOzt7zys+X9oiSXZuxu271bGdozQBmeBp9LuvCthPo1s1lZushS2dzIY28yQSjezMWHm
+bsE9uw6VvUyGGK3iSCBFiiiUJHGgCqqqMKqqOAAKfQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
+UUUAFZXiz/kVtZ/7B91/6JkrVrK8Wf8AIraz/wBg+6/9EyUAfNVFFFAHtXwV/wCRWuv+whJ/6Jt6
+9Arz/wCCv/IrXX/YQk/9E29egUAFFFFABRRRQAUUUUAFFFFABRRRQAV5Z4Ru/iDYeBra80K3027s
+oVmeKBxO124E0vmfKrIhO7cQAckep4r1OsTwZol14d8NWejXrxyT23m72hJKHzJZJRgsqHo/pQBl
+eA7e61Yf8Jxqt5He3eo2/wBngSGIxJawrNK7wDON/wA+OWXI28Mw5PNXl3YeIdc1ObxNpOsa0mnX
+lxYWcOnRM1nDHGyDcTHJG/nNty+W6EcdMdloPhm48Pa9qMuntDHoeoKsyWa7w0F0MK3lpkxhHGSc
+Y/hUDC1VuPDfiTR9XutR8G3NqLfU2ae8sdSMrRLcMQTPCYssC/8AEM/mNoUAqeDpvEM2n63pVtDd
+WFvbrjQH1OB4pIhMsuyJjIZt6QMqgfeOOvGFHKWkXg7Slgg8ZaZq2ma1I0pl1iV5SDcIzMbiGWKT
+5yGKlSsbckZLfePpenaNqC6fdrq9/NLf6krefLbu0cdtuUoqWSNkRiMHhsbmPzN6Dn5tB+JFxpb+
+HZ9R02WylU2smoOszXrW7HazMpHllzHx1/4Fn5qAKXjDUkvtYsfDt4uoavo50+LUXTSUWSa7fzdq
+PcGLYphKpn5NvzMCP4cHhaSbT/FFrZ+HNI1TS9DvI5Bf2+o28ojSaNHeO4jleaXaz4VCOBwOpxt2
+tT8HXUH9m6h4Wuvs2qaRbxWMZuiWhubSPA8m5Ea/8Cyq9f8AgJW7o+neJJb0al4nu4fMgUx21lpr
+Spa/N96abzCGkfsob5V6jk8AHFajp/g6SW50/WpdS8XeIY2kW4lsElaW3ViT+6jV/IRImfG3LYc4
+xj5Rt6RqF7qnwkuL3UJmuLh9Nv0eV+WYR/aIl3HudqDk8nvzT9N8MeNdEgbQNH1Szg0dJHa1u5YT
+LfQo583Z5eFhb5yQS3YkjHCi7pXhfUNP8EXXhN5IXlMN5bW04Zgrrcea0byrsyhzL8yjd06mgDn0
+sLXwh4AHjHSVZtam021Rru4d5SFuDbrtEbN5eIwQE+XgKM55zpr8MLC2ggutOvri21+GQTtrJLSv
+LISTL5kLybCr7iMf99Fud20vhqC88I2/hfV/nRbOC2maFiPnhVMPGxA6OmRkfUdqxR4W8Y6lZx+H
+/Eeo2dzo8UiNJMiSteXkUMiukU5ZkVNyjl1JbIHLckgEOt6T/bfxJSwkuJILV9DBvI4vla4hF026
+3LjDIrsRuK8lcr3qbQNNg8M+O7jw/o7SRaXc6WNRNozmREnEy2+9C+5hlV555/BcbX9iXX/Caf8A
+CR74/sv9l/YNmT5nmef527G3bt2/7X4Uf2Jdf8Jp/wAJHvj+y/2X9g2ZPmeZ5/nbsbdu3b/tfhQB
+t0UUUAFef/BX/kVrr/sISf8Aom3r0CvP/gr/AMitdf8AYQk/9E29AHoFFFFAEMd3azTzWsM0ck9t
+t8+JXBePzBuTeoOV3DkZ60Xcc81rNDazfZp5I3WKfaJPLcghX2Nw2084PWuf0PwPa6J4n1PxLFcy
+SvqW/bAygCPznWaXLD73zqNvAwODnrXTUAef+V47/wCEq/4Rn/hJ/wDmH/2j9o/s+3/57eR5fl/r
+nd+FdFqPirRPC0VpZeI9SX7Y8KlnETFpSoCtKYoFk2Bmzjt1x0ql/wA1T/7l/wD9vKx9Q1TSPCnj
+HxBe+J7Vvs+sWsH2GUwiZZ0hiWK4tgecF225VsDgbsDbkA7PUtf0bSNNXV9Qu44rKTZ5cwJkEnmc
+p5YjDF8jn5c8c9KwvE3i6KTwNe+I/Ct6rtC0aRzqgJRjNFG6tHMnB2v/ABL0OfSuXt7Kfw3pPgvV
+fEFlItnpUl4b7KCQ25vH3WskkfLDDEN0yp4+9gVX1dotQ8P+NvEWn27RaXqc2nizlZBEJmgmVJ5V
+TrhpGzuI5J5+bIAB6V4l1hdA0G+1clQ1tCzRbwzKZW+SFWCc4aRlH+FZll480IaHpeqavdx2z6lb
+vJ9yQIZLdR9pRcq33XyFBPzfw5rQ8Wf8irrP/YPuv/RMlcbYS2Wp3fw5dAs8SWt2nzrwJbW2iQ8O
+OqSxcH1GRQB1Wo+OfCulRWk1/frEt/CtzbARyOzROAVcokbMoOeNwHf0NXv7f0b+xv8AhIftcf8A
+Zvl+b9pydu3O3GMbt275duN27jGeK4TxFqvk+L9U069v7jRoJY7XyIdLtMX2pt5bFdl2EZtyy/ux
+ztI+Xj5jVK3t2k+Fvh29e1a9tNN1L7bfwoqyE2sU92JT5bkBhhuR6deMmgDpfEPjmyuvB2p6z4Sv
+1e4smgQuI/mjMksS8xXEfRlYgHbjrjkVsat4l0m3kvNHW/8As2ow2cty7xwvcfZkVGbzpAiMny8N
+tYjPA/iGeS8W6/oPiHwd4jvNDgYhGsknvzB5S3LCWHaodgruYl4O4DGRjg0BLfw1aeK/Cl5Ir3Vx
+Y3N/Y3k2wXF7BJDOzrK6Ll3ikD8u245JACigDpT408OaTZWiavqqvNJYw3nntC6GeOTbGJljRDgu
+3OwcgdsCrtv4q8P3WjSeIIL2NtOg3ebOdy7CpxtZGUOGORhcZORjqK5LwtDFJ4s0J5EV2h8I2rxs
+wBKMZFTcpPQ7XI+hrKu7dpNI1W9e1a9tNN8ZTXt/CirITaxACU+W5AYYbkenXjJoA9A0fxd4c1+4
+FppF6tzMYTc7FR1IjV/KJbei7Tu/hPOOcYOa2K4LQdX0vXPiXNqWkI32eTRSPtDRGIXDLcRqZV3h
+WYDHl7iOq46Cu9oAKKKKACiiigAooooAKKKKACiiigAqGO7tZp5rWGaOSe22+fErgvH5g3JvUHK7
+hyM9amrmdD8D2uieJ9T8SxXMkr6lv2wMoAj851mlyw+986jbwMDg560AdBdxzzWs0NrN9mnkjdYp
+9ok8tyCFfY3DbTzg9a4XyvHf/CVf8Iz/AMJP/wAw/wDtH7R/Z9v/AM9vI8vy/wBc7vwr0CuU/wCa
+p/8Acv8A/t5QBd1HxVonhaK0svEepL9seFSziJi0pUBWlMUCybAzZx2646U+88aeF7DTbXVrrUI1
+tL7P2aRQ7mTH3sJGrP8AL0bI+U8HBrj/ABFqvk+L9U069v7jRoJY7XyIdLtMX2pt5bFdl2EZtyy/
+uxztI+Xj5jWfps2jWvgjwveancXmmXEMl8bHVbVDJHbyGWb5LhPm3LJgfJt+baRkLuoA67V/F0V1
+ZaHqHhq9WS3vdatrC4dUGTG+/wAyJllTchOAegOORwa3bPX9J1DUrrSbKfz7qwx9qVEcpGTxtaXb
+5e7P8O7PB9DXm8t1L4h8LaKZ41tJbjxNDBJf2CG3+1MVkRr+LMUZDsT97b95e33R1fgGW302K88I
+TiGLUtImYSCNUja5gYIYLspGMZaNlVuWYYG45NAG1rHiTRPD7QprF0tqblZXi3qxDCBQ8nKqRnBG
+B1J4GTVJvH3hBI7KZ9SjRNR3fZi6yLkK5hLPuQeWu9SNz4HB9DVLxPDFN458IJMiyKG1BwrgMAyQ
+xujYPdWUEe9cpqUMS+CfHM4RRK+vSo8gA3MqXNsVUt1wC7Y+poA9F1zxJonhuKKbWrpbVZ2KRAqz
+sxAycJGrtgdzjA49RT/7f0b+xv8AhIftcf8AZvl+b9pydu3O3GMbt275duN27jGeK5fxFe2Xh3x9
+Z+I9ciZNNk01rKG9EfmrDdCSSXB2bnUmMkAgc5PbdjnP7Pk/4RH+2f7Lk/sr/hJP7b+yeWm7+zNu
+3Pkbtu3bxt6befu80Addo/i6LX/GQtNIvVudJOkm52KgUi4W58olt6LIp2fwntzjnNaWm+NPC+r6
+k2k6bqEc92u/EYDgP5f3vLdlCP6/KTxz0rjXvbLxV4s1mTw9E0gvfDNxBFK0fkC6lMgiDqZdhIzi
+Pc2OVx0FZnhZZL+60HT49VuGvNJuFZ9Ki0xIJLNUJW6E115kWI2xtf5izbhlC3FAHVw+IL+XQvEl
+3far/Zv9n6xPZ2999nWfyIUkgVE8lE+fO/bk5POe1a+p+OfCujXU9lqV+sFxbNGksRjkZgZU81MB
+I23Db1IyBxnBIriNT/5ETxt/2ME3/pRaV1Hh6GJviB4snKKZUXTkSQgblV4MsobrglFz9BQBr3Hi
+rw/a6NH4gnvY106fb5U43NvLHG1UVS5YYOVxkYOehp+j+JNE8QNMmj3S3RtlieXYrAKJ1Lx8soGc
+A5HUHg4Nea6Q0Wn+H/BPiLULdpdL0ybUBeSqglELTzMkErJ1wsi53AcEcfNgHpfAl7Zaj4q8VX+n
+xNDbXDWMsYePyi4aOY+dsODiU/OCeSGyetAHcUUUUAFFFFABRRRQAUUUUAFZXiz/AJFbWf8AsH3X
+/omStWsrxZ/yK2s/9g+6/wDRMlAHzVRRRQB7V8Ff+RWuv+whJ/6Jt69Arz/4K/8AIrXX/YQk/wDR
+NvXoFABRRRQAUUUUAFFFFABRRRQAUV51pOvaq/iC18TT3EjaJrmoXWl26s7mARqsaWMkVvuLJJLL
+A4csvrwua7rVNUsNFsJdT1OXyLWDb5km1nxvZUX5UVm+8w7UAW6KxP8AhNPC/wDbP/CP/wBoR/2h
+5nk+Vh9vmY/1fm7fL3Z4xu+98vXirGoeJNE0q4mtdQult5be1+3SB1bAg3+Tu3BdpJf5QoO4noKA
+NOiszQ/EmieJIpZtFululgYJKArIykjIykio2D2OMHn0NcvY6hHLoXiiTXdUvLO1t9cuYReQSP50
+EayW4jjhZVlZV3HbgDoTQB3dFZmueJNE8NxRTa1dLarOxSIFWdmIGThI1dsDucYHHqKl0fWtL1+y
+GoaRcLc25YpvUFSGXqrK4VlPfkdOehoAvUVzkvxE8Fw3osH1WEyllTcgd4svjH79EMWOeTuwO9Uv
+HXjODw7daXZR3n2aeS8t5r1PKMmbAmVZjkxuOqfw/N6UAdhRXPx6zoWsX+h31pqVwPtX2v7DbxeZ
+HDd+Wuybz0aP/lltyu7bz0zTtY8c+FdBvTp+q36w3KqHaNY5JSobld3lRuAcc4POOe9AG9RVebUL
+KHT31V5lNnHCblp0+dTEq+YXXZu3DbzxWPP4+8IW09vbT6lHHJdxxTRArJgJOA0RkbZtjyrA/ORg
+cnigDoKKo6xrWl6BZHUNXuFtrcME3sCxLN0VVQMzHvwOnPQVV0Pxd4c8RyywaNercywqHeMo8bbS
+cbgsqISM9cdOM9RQBsUUUyaaK3ieed1iiiUvJI5CqqqMszMeAAKAGXd1BY2s17dN5cFtG00r4J2p
+GCzHCgk4A7VwvwV/5Fa6/wCwhJ/6Jt6peOfHK6+v/CHeDt1/c37GGeeEsqhVb5o42+UMGC/O/wBz
+Z65JXuPCuif8I74fstGL+Y9tH+9bOQZJGaWXadqfLvc7eOlAGrRRRQAUViaX4v0bV9cv/D9m0hu9
+Oz5pZCqPsYRy7G/2HIU5A9sjmpfFn/Iq6z/2D7r/ANEyUAa1FcVB4pn0HRPCmnWunSalPqunosSR
+OEYPDbwlQdykbSX+ZiRtXLc0yb4k3UFi9/Jokxi0+Y2+sssybbSQTeQI42ZVE74wxC4A3L83PAB3
+FFYniHX7/SNsem6ZJqMgja4nd5FtLaGFPvM91OPL3Z/g64yTgdcq3+I1rL4bk1uSyk+1JeNpkVjA
+4uPOu8bo0hmiBVlZTndj1xu4yAdhRXKaf43nfVbnStd0uTR3sdPk1K5eSUTqEjcD935SHzF2NncP
+4gVxxTdJ8dXV9e2Iv9Hm03TdXZ006/mlQiRhlolkjwvlmVR8nzHcfu7hzQB1tFVNWvv7L0q81PZ5
+v2O3luPLzt3+UjPt3YbGdvXFc0nj+ddD/t280a4t47nyItKh3iSW9nnVz5aoibkUMnysw+ZeQMkL
+QB2FFc5pXi5pm1G38Q2LaJd6ZCLyWF5VuA9rtLGaJolBcKVIbapwcDOeBmw/EO/d9Okn0C4t7LWb
+yK1sbqWVcNHKxXzZEVCUbG1lQ/eGSGwMkA7WszX9KvdWskh0/UZtKuYZknjuIRuBKZ+SWMlQ6EHl
+ScZxnPSuXXxdpvh7TdWvbLTNkj+IJ7Bozc7UmuW2s9xJNP8ALCrKvToPpkiv4u8UeJn8JaoZNJut
+EvLWa2R50uAVWKVlYSw3EYTzDuURuq9N3XqKAOj0DwtPpmpXGuaxqMmr6pcRi3FwyCBI4F2t5SQo
+zKMsuSf5fMT0FcpqHjHVrTVbbQrbQ5LvUbnT474wx3CBYnZykkUkrJsCptPz55bAxzmm+I/G+o6G
+080GjNNYWzGJ7y7uY7ESSqpdkt4p13yjaPlKj5jnbnGSAdbRXD6p4h1S58VeEJNMgm/s/U4ZLgoZ
+xEJVmjVnEsQJGbeMiTnOScLzT7XxTpOh6brV7a6dIk39uXNklrC7zPe3zbfmGVPl+Zj7o4GOMngg
+Ha0Vylt43nCarbaxpcmm6ppdnJqIs2lEqTwIu7elwibfvfKeDj3wwFe08f6jM2lXN5oM1ppmsTQ2
+sF488ZfzZ1O39xtD7N4OGOMr82OQKAOzooooAKKKKACiiigAoorE0vxfo2r65f8Ah+zaQ3enZ80s
+hVH2MI5djf7DkKcge2RzQBt0VX1FL2TT7mPTpFhvHhkW2kflUlKkRs3yvwGx2NeX22heDkso7bX2
+vtB8TSM5GqX7SoWu4sTSXEU+/wCzugc4B3BiO+4hqAPWKK4K91OLw948in1edrqZPDscGYowJbu4
+N1tCwwJ/HIw4UdPoM1dj1d77WvDE2uaL9j1C8+3NZ5uWZ7VFgRmMkYijUtIvG0/d+uQADsKK8q/+
+eBXpuo3sWmafc6jOGaK0hkuJFQAsViUuwUEgZwPWgCxRXm/gtL3RNa0q5vpFkbxjYzXU5i533aSP
+erLJuVNg+zz7cJxu7d629W8b6jba3faJoujNqsumQpNc4uY4Xw6iT91CVd5AFZfujOTjHTIB1tFc
+pqnja8t9SsNH0nSJLy+vrMX/ANnuZ47J0Rs4jxLu3SLtbcvbHfnD7vxrLb6XpkyaTdNq+sM0dtpM
+gMUgaI4mMkjJhUUchiOQQcAZKgHUUVz+meLUutK1K91KzksLvRfN+32BdZJEEaGVWQ/JuWRPuNwD
+zjjmqnhzxjq2tz2f2nQ5Lax1GN3t76C4S7iBjG7bN5aL5Xdfm53fLjrgA6uiuM0Xx/qOty29xa6D
+M+k3N0bQXsM8c0kRJIVp7aNS0Y6FtzYAOcnjLZfiNPFNfO2jyDTtK1BrG/1AzARxJ5qQrKi+WXkb
+5iWRR8vHPzcAG74g0bVNUa1n0jVptIuLRnOUQTRSrIu0iWB2VWIx8pPTnjPIZ4a8Nf2D9rurq7k1
+HUtRkEl5eSDZv2bhEiRBmVFRWwAP5YAr6H4sutT1qXRdQ0qbS5TajULXzpEdpLcyeUDKi8xPkj5D
+nHOenOfD8RWmlS+TSZh4dkuhZrrTyKigsdgmaF1UrF5nG8tj/gXy0AdnRXKXnjHVhruoaBo2hyal
+Pp3kM0guEhjKTRiQl3lTCtlgFXndyeMVjnxfqmta94PvdNtZorLUVujND9oCrIy7oZw6DhhbhPMU
+kfNngA0Aeh0UUUAFFFFABRRRQAVleLP+RW1n/sH3X/omStWsrxZ/yK2s/wDYPuv/AETJQB81UUUU
+Ae1fBX/kVrr/ALCEn/om3r0CvP8A4K/8itdf9hCT/wBE29egUAFFFFABRRRQAUUUUAFc/wCOdTut
+O8Pyx6a2NR1GSPT7EZKkzXLbPldSuxgm5lYkAEV0FZ+oaJa6nf6ffXTyN/ZkjzRW+QYXkZdiySIy
+tlo+qEYwaAOE1Lwz4+i8KLoyR6OINMjSa3ayFz9sElt+9EkB2Y85yDyAMlj61e8W6wuv/CaXVwVL
+XMNq0uwMqiVbiFJlUPzhZFYf413tcJ440S10L4e61a2TyGCa4S5SJyNkPm3MDGKBVVQkYPIX3NAG
+h4o0vw2nw/uraKK3GnW1m01gQw2LJsZoJI5N3LO7DnPz7uc7jnF0y1guvHGgf28u+9h8N280a3ZP
+mfbEkbcSrnLSKN7c8jG7qM1uv8O9BkvY5pJLp7GGb7THpDS509JDuOVtyvA3OW25xzjG3is/WNHs
+tb+I5sr0MANBEsM0R2SwypeZjmhkHKup6H+mRQBY1W1gh+JGhXOnrturi3vP7TMJOWgSNVt2uFU4
+2+ZwrMOSAP4RjmtT/wCRE8bf9jBN/wClFpXdaB4S03w/PcXsUtxfX13gS319J505RQoWPftX5flH
+6Z6DEU/grSrjSdU0Z5bgQazeNf3DBk3rI7xylYz5eAuYh1B+tAGZo8VldfEvxDNeFZbyxhs0sBI2
+5oopIcz+ShPA3OMkDjd/tHOgYfB0M3iRAixyGFX19UEqgxvFI4bC8ZaNnJ8vnPXmrGv+EtN8QT29
+7LLcWN9aZEV9YyeTOEYMGj37W+X5j+uOpzY0rw7pekafNp0CNNFdM0l21yxna4kkVUlkmMmQS4X5
+hjHtQBxWoy69feDLmDR9EsdL8PRWMk0YvZfOlmtyhmjlhjg3BJQBvPmE/OQc5BNWNS/5FXwH/wBh
+DR//AESa04vhj4cVTbXEt9d6erM8GmzXT/ZYGZi26JI9jAjcwGWPU5yeav3Xg/T7zQbPQJ7i62ac
+0T2l2jrHcRNBkRMrxxqmVQ7fu+/3uaAKXiL/AJHvwj/3E/8A0nSqvwutdNuvCH2p1jubrUZJ/wC1
+XkPmvM/mSDbPvLH/AFbA7T/ez/Ec7Vv4VtYZ9Jupru8u59F+0+RLcyiR5PtY2v5zFMttHC4xiqWq
+fD3SNSvbu9hur7TTqK7b2GwmEMVwfmBaWMxuGLBznsfqSSAYXh8wL4E8X21lJ5lja3Gqw2IDmRFg
+EIZBGxZvl+bPXnOe9aFvpWm2vwnkhgto1SfR2vJQV3b52t/O81t2csHAIPbAx0FdKdC01dDk8O20
+f2Wxkt3tQkPBVJFZWILBvm+YnJzk8nNH9iWv9gf8I5vk+y/Y/sG/I8zy/L8ndnbt3bf9n8KAOSm0
+ZtT0Lwfdafd2tvrNhawTafb3u1orgeTA0ylMM+VVAwZBlfY4ZbWma3rY8R2OleM9HtY7ydroaXqN
+qyuuIkUy7VdpJEDJ/FkE8Db1rV1DwbpGpaRYaTMZkOlLEtleROEuoTCEUMkgXGSEGeMd+oGG6N4K
+03SNSOsS3N5ql8I/JiuNSm+0PCnzbhEdi7d24/06nIB0Fcl4y+HWn+L7gX8l3NaXkcKW8bKFeIKr
+tJloyFYk7yPviutooA8atbTWfhDri317DHqGlX2bd7mFRv2BiwAZgDHJhd2zdtbpkldy+v2l1BfW
+sN7at5kFzGs0T4I3JIAynDAEZB71Q8VaX/bXhzUdMWLz5J7d/Ij3bMzIN8PzblH+sVepx68Vznwe
+vZbrweIJAoWyupbeMqDkqwS4y2Sed0x/CgDuKKKKAM+z0DRtP1K61eztI4b2+x9omUHLdzgZwu48
+ttxuPJyaPENrPfaBqdlar5k9zZ3EMSZA3PJG6qMsQBknvWhTJporeJ553WKKJS8kjkKqqoyzMx4A
+AoA5K30DVkvfBUzQYTRrOaG/O9P3TvaxQqPvfN86kfLms++8La7N4T8U6ZHa7rrU9YlvLOPzIx5k
+LTWzq+4vtX5YzwxBrvYZoriJJ4HWWKVQ8ciEMrKwyrKw4IIp9AHD+MtA1S+8SWerLpC+IbCC18tL
+J7oWyxXAl8wzMsnyMGTC4wc4+boM5SeF9b0/w9IlwLHT9Th8Rf2pp1sXVLW5dUURW8H7xSochtin
+B4wcdR6bVHWNF0vX7I6fq9utzblg+xiVIZejKyFWU9uD046GgDhbf+1PEfjbU7HV4odMuLrw7Nae
+RFKLp7ZZZVUeeyFVLnfvAGPlK96i8NeA7u11CxS98P2trLp0yyy6v9smmWfyGyhhtUnUq7kKcv8A
+KOfl6LXdaH4b0Tw3FLDotqtqs7B5SGZ2YgYGXkZ2wOwzgc+prToAz/ENrPfaBqdlar5k9zZ3EMSZ
+A3PJG6qMsQBknvXNa94S1LV/Amk6SkcZvtLjtJmtJm+SZ7eExSW5kjkXbu3H5g34j7w7WoZLu1hn
+htZpo457nd5ETOA8nljc+xScttHJx0oA4XRPB8cFrq9zc6Vb+F4bnT5rEl7p72QLKN0k7yNOIVjU
+AfLjdwfmA65V1c+II4PCGj6rb2cNraapYpbXUFwsxvUiPlxTwIpJEYjI3lupZcAdK9SmhiuIngnR
+ZYpVKSRuAysrDDKynggisTR/A3hXQb0ahpVgsNyqlFkaSSUqG4bb5sjgHHGRzjjvQBixaP4jsNL1
+pItLtdRN7r014bG8ZGW4spDGQyHcUV9ygjf0x0zgVlJ4U8VP4O17RksmtYbqa3fStKkuo7hoQJUl
+uMT/ACLsPVQWzwe5y3ptFAHM2mn6tN40h8QXVp9mgk0NLaUeYknl3JnEzQ/KcttH8QGDXK6n4Q8Q
+SX+vn+wrfU7nUpLhrTV7q6VligkVTFFHbyHIkQLsR+Nrd9gr0q3u7W78z7LNHP5EjQy+W4fZIn3o
+32k4YZ5BqagDim0XXbe58EXENl5/9j27W+oL5saeT50EFuzZLHfswxwuc496qTeEvED6bqMttHHH
+fW/iSXXdPimZWS4RMeWpZJBs35PUjpg4zkegUUAcI2i+KNcn1vXdUso9PnuNHm0ex05ZUmd94Mvm
+PMrCMZkOB098Yy1u+0DVptA8JWUcGZ9KvNNmvU3oPLS2jKzHJbDbT/dzntXUTajp9vK8E9zDFLFC
+bmSN5FVlgU4aZlJyEB/i6VLDNFcRJPA6yxSqHjkQhlZWGVZWHBBFAD6KKKACioftdr9q+w+dH9q8
+vzvs+8eZ5ednmbM7tu7jNTUAFFFFABWfZ6Bo2n6ldavZ2kcN7fY+0TKDlu5wM4XceW243Hk5NaFF
+AEN3b/a7Wa18ySDz43j82FtkibwV3xtzhhnINcVdD4iSaG3hWXSre5kltxYyaz9sBiZJFEbzNFIF
+mLBGO4/3uQCOK7iaaK3ieed1iiiUvJI5CqqqMszMeAAKzP8AhLPCv/QZ0/8A8Cof/jlAHMXvw+bU
+NTisb2NZrC38Ox6ZDfMFyl3DLmORYhJvBC/N1xj5c8mrVtZeJ9S1Xwrqer2LW82lrex6i7SwMC0k
+CRpMohfpIw6AfKfbBPZ0UAef/wDCLa7/AM+v/M4f2v8A6yP/AI8/+e33/wDx373tXReNLDVNW0Q6
+PpSsG1CaK3uJ0cIYLdmDTS7WZPMG1dpQHkNW9RQBw+qfD3TtIW11jwbYtHqen3UNwIkuJFNxEG2z
+QeZPMUQMjcnB4GO9ReONI8R6tezpa6HDebFhk0vVrW5S0u7WSPcxEjSnLgSEkKuBg9d3K97RQBw/
+inSfEeo2VnYX2jWviCM2IjuLiKZLW6gvfk8yaGWVQoRtoICpzj5uODS1jwd4k1Xw/oE+rRR6xqOl
+eYLywlmMZuI52UBftKPHiSNEXJzycnLdG9FooA5Lwj4eu9F0/Urmy0y10a7vVAtrNp5rra0KuIzc
+z+a6sGdycRqML3J6ZnhjRPEtv4og1P8AsePw9aSW5TVYYLiKS2uXRNsTQ20QbymDnPXpnnJO/wBA
+qH7Xa/avsPnR/avL877PvHmeXnZ5mzO7bu4zQBwFvoni+TxPYap/Y9vpF1FcMupalZXEYtry2Z2e
+QNa4eQs4+6zc55bHGyW+8La7N4T8U6ZHa7rrU9YlvLOPzIx5kLTWzq+4vtX5YzwxBr0CigDn/wCy
+7/8A4T7+2/K/0H+x/sfnbl/132nzdmzdu+7znGK4ey+Gt3bSnR7rQrW8AmITXpLqZI/IJD5ksorh
+HL7cqApUZxzgFj6xRQBz+jaXf2nizxHqdxFstdQ+w/ZZNynf5ELJJ8oYsMMe4Fc1onhrxLpcfg1m
+sN76TJfrfp50Q8lLx9qvne27COWwuemOK9FooAKKKKACiiigAooooAKyvFn/ACK2s/8AYPuv/RMl
+atZXiz/kVtZ/7B91/wCiZKAPmqiiigD2r4K/8itdf9hCT/0Tb16BXn/wV/5Fa6/7CEn/AKJt69Ao
+AKKKwdc8UNpuoRaJplhNqurTwm5S2jKxRrEG2F5p5PlQHBxweRjjIoA3qK5/QPFM+p6lcaHrGnSa
+RqlvGLgW7OJ0kgbavmpMiqpwzYI/n8wFS88bzx67qHhvTtLkv9Rs/INvFHKEWVJIxNLJJI6bIlj3
+BeSdzMAKAOrorB0DxVFq0V8mo27aTe6S2NQtrhgVhUhmSUTYVGRkUnd/TBObb+P57rzNUt9GuH8O
+QyMj6uHG7YnyvOtoU81o1bqR0UE4yCtAHVWt3a30C3VlNHcwSZ2SwuJEbBKnDKSDgjFPmmit4nnn
+dYoolLySOQqqqjLMzHgACuX+Fv8AyImmf9vH/pRPVf4hNFDdaHd6xbtc+Hra6eTUwEEipIU8u0kl
+UfPsDu24dD0IJIBAOjtfEOgX062tlqdnczyZ2RQ3EcjtgFjhVck4AzWhXCfYvhx4vtfsvh6azsNQ
+Em+zns41tLuOaIeYrpGVhkdQOT29CCMjoJtZn0rU9C8P3Q+2z6nHOst7xF89pCsjP5Kqw/eE9ARi
+gDbqGO7tZp5rWGaOSe22+fErgvH5g3JvUHK7hyM9az9R137BrukaJ5Hmf2v9p/fb9vlfZoxL9zad
+27OOoxXKxa1PpfjvxPa6dYyanqN3/Z5t7SNhEpSK3/eySTONkarvA56sQB7AHoFFcpa/ELTVsNRm
+1yCTS7/R/wDj805j5smGZUiaFgFEiuXUbuAMjPykMS08V+KG8m51PwtcWtjJsMk0VwlzNGsmArG0
+SNZjgsNwxuAzxxigDq6KybLXftPiDUdAmg+zvYxwTQSM/NzHMp3yIhVfljcbCQTz6VSbxpZQxa5f
+3MLJpuhzLa/aUO9p5wFEsSxFVKlJHVMk7TnOcUAdHRXKWnivxQ3k3Op+Fri1sZNhkmiuEuZo1kwF
+Y2iRrMcFhuGNwGeOMVleLtR12Hx3oP2TSPtP2b7Z9h/0mOP7X5lvH533h+68r/a+92oA9AorlJvG
+OrTTpZaHocmp3UMedR23CRQWs4CF7UXLIY5JEL/MB/jjV8P+IbXX4Jdi+Re2Uht7+yZgz28yEqyl
+l4Zcqdrjg/XIABrUVw9t8R9Ru9Ej8Qw+Hbp7BGf7bMs0eI0RgpkgUgPMApJY7VAIIzwSLFx4/ntf
+L1S40a4Tw5NIqJq5cbtj/Kk7WgTzVjZuhPVSDjJC0AdhRWJ4l8S/2D9ktbW0k1HUtRkMdnZxnZv2
+bTK7ylWVFRWySf5ZIZo+u63c3ostc0ObSjKpa3mSVbyJinLrLJAuIjg/Lu4bnvwQDeooooAK8/8A
+gr/yK11/2EJP/RNvXoFef/BX/kVrr/sISf8Aom3oA9AooooA5nQ/HFrrfifU/DUVtJE+m79s7MCJ
+PJdYZcqPu/Ow28nI5OOlaHiz/kVdZ/7B91/6JkrQjtLWGea6hhjjnudvnyqgDyeWNqb2Ay20cDPS
+q+uWUup6LqGnQFVlu7Wa3jZyQoaWNkUsQCcZPpQBySa/rmmaX4O0nQre3uZtW0/aRcllCGG2gZX3
+Kw+VdxZhgkgYGDWP4v1zxJfeGfEWi6vFYrcaTNYG6ltTLseC5KyIIhJzvWRUyTxgnjIyerh8L6hH
+d+E52kh2+H7WW3uwGbLtJbR24MXycjcnfHFUte8Farqn/CU/Z5bdf7e/s/7LvZxs+x7fM83EbYzt
++XGfwoAd4h8X6vpV7p+gQnTbfU5rVbu9u7+Uw2KD5oysWXWRi0inHcDseStd/iBqUvhvTdT0+1t7
+jUZ9UTSby0V8xmXD7lhmDbPnwpVsuo3fxYqx4h8Iavqt7p+vwjTbjU4bVbS9tL+IzWLj5pC0WUaR
+SsjHHcjuOQz28GX/APZuk26PZxz2usQavdpbxLbQKse4NFbpDFltowFaT5m7kdAAGt+IvE+iWFql
+42j2l60cs9zd3MzraMI2OIbWFWNzJJsZSflx2GSRiLSfiE8vg3UPE+oQRzPptw9tizLLHOcxCJ0E
+43op85c7snvj+GrHiTwxrV34ktvEmirps8sNqLXydUSRljZJfPSeIxAnfk4zxj3zxDY+BL2TwzrX
+h/W71ZZdWvpbwXkC4JLGF0d4iqqCXiyyKcY4Dd6AK+qXXxAk8N6zDrdlp8SPpckyzwO+2MkYuLeR
+C7sZPKLFWX5AwHJzxFp2oarb2fguxW20+W+vNPu/s1xNG7eT5Vqr2218hk3qVE2OvOK04dH8d32n
+6jZ+IL6xdbjTZLG3itUYK88isv2meRo1ZT2IQbefujHJp/hfWo5vCk99Ja7vD8N1b3IhaTDrJELe
+Ax705O1BvzjnpQAXHjDUP+EV0zUbe3WHVtUuodNSG6RlijuzI0M3mosnmKgMT45LdMjrWTq/xH1S
+DUNSOmppqWWjzfZ5re+uBFe3TRMRObZBJgAD7uVOe2T8g27DwWtn4tn18zK1nulurS1AbdFd3ipH
+dyl93IZYuAcj5jgLt5yrzwBqker382mDSbiz1WY3MkuqWouLq1klLecbf93tcDO5Vc47Y6lgDsvt
+T32lfbdGaOR7m386yeYMI2MiboTIAA4U5Ge9c7ceMNQ/4RXTNRt7dYdW1S6h01IbpGWKO7MjQzea
+iyeYqAxPjkt0yOtdPaWyWdrDaRnKQRpEp2qnCAKPliVEHToqgegrnbDwWtn4tn18zK1nulurS1Ab
+dFd3ipHdyl93IZYuAcj5jgLt5AMe48YXuk6NrGoWNjZwvB4gm095VikWFEymbu7WHc7sfuswxkkf
+Q2Lnxb4p0/wrqmuXkOmztaNAbG8spGmtLlZZEhlAUS+ZmMkgkkZPbjm3b+HfFOmWWpnRry1gvLvW
+ptTjEqtJFJby7f3ExMe5CcZJTPTAPORmW/w91h/D+v6Zcz2dpJrEkU0FrZCU2cDwsshKiU7l81lA
+bA+UAYyMKADpdV1u6sfEuhaNCkZg1X7Z57MCXX7NEsqbCGAGSecg1zvi3x1rWiXV0LZ9JtYrVvKS
+1vZJJ72ZtnmCRYbNmEaOOE8zHq2MgVdt9A8Y3viXSde1+40/y9M+0r9mshKABNF5YdWlUszMx+YE
+gAKMck1n3PgfxPHPrkOly6XHb63JcyNeyxOb5UuQHa23bWURll2nrwSwG7AoAiu9W+06/Nrv2eNv
+O8Fve/Zpv3sZ3SGXypPu7l5wema0E1Lxuuj2ep6auh2umyWdrJFFKl0HUyRRfukig3D/AFjbY0XJ
+PA5NH/CFar/z1t/+RX/sH7z/APHz/f8A9X/q/fr7UR6J4+sTYR2L6PNBptnb21st0bklJEhWKeUC
+NVG5juUMeicDG59wBdv9b8TaboNjLfR6baapdsVnnupxDYWx+aRUbdKZHdkG3CZG7JztHPFa34w1
+bxT4L12CT7DKthNZGa5tROiSQTPkCJLhVcOssa5LcEZwOAT1WveGPEmuxaPqFyukz6nprXIntbhJ
+ZLCVbgbVIDBnyqopwR97nPHNK58C+J7+w8SLf3dnLe6/9haN03xxxm1YM6EeWx2qPlQ8lsZbBNAG
+nNrsumeJHTVrW1aW08OnUbu5toyZy0Uv72GGSRgfKyCVVu/U1UsPGHimOXSdQ1ywtY9I1+Zbe0+y
+uzXEDXB3Wpn3vsYMnJ2gepwflOhN4X1DU9afUdWkhWK70E6RdrbMwYTyyb5WhEiEbME7Sxz6is+w
+8H+KZJdJ0/XL+1k0jQJluLT7KjLcTtbnbaifemxQqcHaT6HJ+YAEUnizxtcxa7eaba6alnoN1eRP
+LcmXdKlsNwRI43++qrliSAdwxjBrstJvv7U0qz1PZ5X2y3iuPLzu2eaivt3YXON3XFYVp4X1C30X
+xNpzyQmXXLq/uLZgzbVW7jCRiU7Mgg/ewD+NbWh2UumaLp+nTlWltLWG3kZCSpaKNUYqSAcZHpQB
+ermdD8cWut+J9T8NRW0kT6bv2zswIk8l1hlyo+787Dbycjk46V01Qx2lrDPNdQwxxz3O3z5VQB5P
+LG1N7AZbaOBnpQBn+LP+RV1n/sH3X/omSvPbbV/Cdt4bsbe98H3U9xcWsNrHObCONbq4eIBfKuQf
+MzIRlWUbu4Ga9K1yyl1PRdQ06Aqst3azW8bOSFDSxsiliATjJ9KzZ/CcGpeDrfwxqgjeSCzigWYA
+uIp4ohGs0f8Aq2+VvpkcHgmgDnxrGs+B/C+g6BcfZzrF55kYmvpwLS2jjfzD50pdSfLjkVAqnt8u
+cAM8/ELUF8K6xfkWMuraLNFG/wBmZp7SWOeRFimRlfoyswxvyCvOPu1a1nwlr2u6XpNzfzWM2u6S
+zllmj8ywuVkKq4lRot2SiKcheGzgDgrFc+B9UuvCuqaaf7NtdQ1RoD5VlALa0iW3kRwA6RGZywDE
+l84JwAByQB6+I/HD6rJ4fNjp8epXFvHf2oMkjQ21sXkSRbtwd0kgZUQeUuMndnAq1a+OP+KBXxne
+23ziM77eFuGkExthhm+6rPz32j+9jnQ/sS6/4TT/AISPfH9l/sv7BsyfM8zz/O3Y27du3/a/Cs2w
+8Eyt8P18GanOqSlXDT22XVW89rmMjzFQkZ27hx3570AQ2niLxnbajBouv2djFeavayyaXLbs5iju
+IY2keG7BkdsDjJT8N2cri+GfEl74Y+GNleNFDNLc3Ulppil/LQGSSU7rp5GRVCukh4OMbeRyR0Gk
++HfFNzrdjrXi28tZW0iF47OKwVgJJJlMc005kjTkrjheM9NuCGz4PAGry+CIfDV/cWqXmm3Ru9Pk
+iBlgYje6rcrPH8wLSuDhcYxweQQDS8JeLLrVtSvNE1WXT57u3jS5gn0qUzQSwt8j8kvtaN8A7iCc
+8DHJq+Kf7V/4WD4U+zfZ/J/0rZ5m/f8AcH2vdt4/1OPL/wBrrxV/wt4cv9MuptR1OHS7SZ4/Ijt9
+Htlij2ZDtJJK8YmLEgDbnaMZwT0m1/RNVvvEGg6zpr24TSpJ/tK3BcFo7lY4n8sIpywQNjJHOKAO
+c1f4j6pBqGpHTU01LLR5vs81vfXAivbpomInNsgkwAB93KnPbJ+QW5tYso/HL6+haazTwqb1Sgwz
+xC484FVfZyV7HFRXngDVI9Xv5tMGk3FnqsxuZJdUtRcXVrJKW842/wC72uBncqucdsdS2rN4OabW
+nmeRRpsmgnQ2CbUnBaTJdUSJYlGz0GM/w4oAx9E+IepXWpad/ap0tbHV5GhhhtLjzby1d+bYXKKz
+53/d4UYJ+bb92rGveL/EkHia58P6Qmm27QQxSWyam0qPfNIOlqwMcZO87ApbrnnrtZoHgXVtOurS
+G/XR/smnSCSO8trNPt9wIifKWVpYiidizLl+PvZJarHjDw34s19ruxtpdNutKuljaGK/SRJbSVFK
+l4JLdckk/Nlieu3G3O4A07TX9Sm8VQ6FdW8dskmjpqUsefMkjnMwiaLzFbYyr7LzWJd+OtchtZpr
+W0t7mePxI+hxQfNH5kIBK/O0mFkY8bj8o/u1bu/DXiqy1Wx1nQruzurqDS00q5bUxMPM8txL54MT
+OxZ265PHvnipaeBdchtYYbq7t7mePxImuSz/ADR+ZCAA3yLHhZGPO0fKP71AFu61/wAYpe2Xhm0t
+9Pk1yS3e+vZ2MosY4BI8UewbhMWJCg+h7EHK0v8AhYeqQeHr7Ub6xhi1CPVpNHtbbzAIo5Aisv2m
+Z5ApCfNuYEA4/hHIl8WTLp/iy11PStXsbDV1sTDNbasWjtZbRpHKsJVXhxL/AAhsnHoDux9A8Nz+
+K/COpBbrfO2uT6lY3s0AWG6dFVBJJA6MPLkJbIxwexwVIBsab461CS31u2vn0241DTLGTUbSXTZG
+ntZo0RshvmJUpIAGBZSc8DHJLTxZ4sht9K17XbWxttE1BoY5TCZHnhE6ER3Ers4hjiaTaTkkqrAc
+tUtl4P1T+z9WF5FpNld31jNYW8Ol24hgHmqf3sszReeSWwNo+UAZwT0057fRtI8HW+l+LJLcWkNn
+FaXHmMdkjxRDIi+67N+7JTaN3HHNAEtlrd1feK9R0aFIxZaVbweezAiZrm5zKmwhipjEQ5yAd3tW
+3XKfDPTZ7DwpDc3jSPdapI+oztK4kLGfGx9wyfmjVWOSTknPpXV0AFFFFABWV4s/5FbWf+wfdf8A
+omStWsrxZ/yK2s/9g+6/9EyUAfNVFFFAHtXwV/5Fa6/7CEn/AKJt69Arz/4K/wDIrXX/AGEJP/RN
+vXoFABXH+Ldfv7bXLPQYdSj8PQXFu9yNUnhWZJZEbb9lHnbYkwvzEk/3Rxn5uwqve6dp+pxCDUba
+G7iVg6x3EayqGAIDBXBGcE0Aef8Ag99Lb4iXCaTqt1rUUWkvHJc3kpmZZFuY90aSFEBTGCCuRzwa
+3fDv/I9+Lv8AuGf+k710Y07T1a2dbaENZKUtGEa5gVlCFYjj5AVGOO1OjtLWGea6hhjjnudvnyqg
+DyeWNqb2Ay20cDPSgDjYbKXU/EPj7ToCqy3drZ28bOSFDS2cqKWIBOMn0qXw5410G08LWkFxKyX+
+nQx2EumFcXrXEKpB5UVvnexZ/u/rjBx1sdpawzzXUMMcc9zt8+VUAeTyxtTewGW2jgZ6VF/ZOlfb
+/wC1Psdv9u/5+/KTzvu+X/rdu77vHXpQBz/wt/5ETTP+3j/0onqx4g8VHwxq9qdXCx6Hdwun2pI5
+JHiu0O4LKUyAjx/dwpbIPYVu2tpa2MC2tlDHbQR52RQoI0XJLHCqABknNPmhiuIngnRZYpVKSRuA
+ysrDDKynggigDgvGP/CuL/Srryf7PudUufM+x/YNslzLeSJJ5W77Hl23Of4/lJxntUutXU+m6v4I
+1TxG3kGGO4h1C5cDy0uZ7aNMO8Y8td0m724J6CutstD0XTJTPp2n2tpKylGkt4Y4mKkglSyKDjIF
+WLq0tb6BrW9hjuYJMb4pkEiNghhlWBBwRmgDir/XdN1j4heGodMk+0x2n28PcxfNAzyWwby45QSr
+sigFsdNw79Cw13TdH+IXiWHU5Ps0d39gCXMvywK8dsW8uSUkKjOpJXPXae/XsIdJ0q3+z/Z7O3i+
+x7/suyJF8nzf9Z5WFGzfn5sdaJtJ0q4+0faLO3l+2bPtW+JG87yv9X5uVO/Zj5c9KAOFv9Q0bWdb
+1vxJJbSaroOnaWulXXkxl/Pka4E7tbnKqywr8zPuG3hhxg1mXl1F4btbbUfBniybUiVgt7XRLhhe
+tNvdcRiJSrQjYMY8sMPu7gWxXqVraWtjAtrZQx20EedkUKCNFySxwqgAZJzVW18PaBYzrdWWmWdt
+PHnZLDbxxuuQVOGVARkHFAHP+Nbj/hGdS0/xvFHJKkOdO1KOJdxe0my6NubKp5coBHTcWClhVfR7
+ey0z4Yi48Q2ranFdwm+1BYF82WYXUnmiV2YxsXRHUs5bK7cg8CtDxjYa34gMXhq2sl/sm8aF7/Uj
+MqtGkcnmPFFFgtvPlrtbBHOCO46igDye8uovDdrbaj4M8WTakSsFva6JcML1pt7riMRKVaEbBjHl
+hh93cC2K6jxZd2tj408J3V7NHbQR/wBpb5ZnEaLmCNRlmIAyTiugtfD2gWM63VlplnbTx52Sw28c
+brkFThlQEZBxVi907T9TiEGo20N3ErB1juI1lUMAQGCuCM4JoA8y0620r+3NZttY17UNBe6vJtSs
+zb3iW1ndWly26KeKTDI7Hvz0/wB1sdV4I0/SrefVL/SrnUNRS5kiifUb+RJUuGtw6Zt5AFd1TdtL
+EbTj5ScVu3Oh6LeRQQXmn2txFarst45YY3WJcKNsaspCjCjp6Vbhhit4kggRYoolCRxoAqqqjCqq
+jgACgDgvDX/JGpv+wfqX/oV1R4l/5I1D/wBg/Tf/AEK1ruItO0+GyOnQ20MdmVZDbJGqxFXzvXyw
+NuG3HPFEunafNZDTpraGSzCqgtnjVogqY2L5ZG3C7RjigDnPHf8Awjcn9mW3iH7RaedcH7Hq1viP
+7HMm113TnPl+ZjjgjjJxt3DH8PX97p3i200PTvELeJtPvFuZ7kOPtDWiKo8lmuld8ksoXHA5+6Cw
+rvbq0tb6BrW9hjuYJMb4pkEiNghhlWBBwRmorHSdK0vf/Zlnb2fm48z7PEkW/bnbu2KucbjigC3R
+RRQAV5/8Ff8AkVrr/sISf+ibevQK8/8Agr/yK11/2EJP/RNvQB6BRRRQAVX1G9i0zT7nUZwzRWkM
+lxIqAFisSl2CgkDOB61znh/UPGVx4u1m01m28vR4c/YpPLCrwwEPlyA5ffHln67W4+XpWr4s/wCR
+V1n/ALB91/6JkoAvadexanp9tqMAZYruGO4jVwAwWVQ6hgCRnB9ax9N8a6Vqn9j/AGeK4X+3vtX2
+XeqDZ9jz5nm4kbGdvy4z+FWvCf8AyKujf9g+1/8ARMdedeGrf7Xa+BLXzJIPPj12PzYW2SJvEq74
+25wwzkGgD1DS9UsNasItT0yXz7Wfd5cm1kzsZkb5XVW+8p7VbryTSRqVp8PvDY0vULizn1LXEj80
+NuWIO9xDsWP5Q0eYw5Q8Fs+tbfiMT2E1j4UtNQ1y+nW3kuEisWAu5HeUpHLeag/Cw5YpgJ8vVui0
+AegUV5lph8aat4PvbKynumvdP1p7aaNrpFuzaxBGkt1vSm3eHf7/AKD0wtOt/EE+k+ENf1XR9WvL
+ya2kiiS01lQ95YStItvJ5pLHduzuQY2gjGCd1AHpdFcPZWur+FPFWjaU+r3WrW2tQ3CXK37GQpLa
+R+b5sDFiUDFsbeeOpbjBp+o6g/hvxrO9zM0tpfaqltIZGLQrFEDGsTZyoU/dx0oA7iivN7NNX1/W
+tH0w6xfWVvN4Ztby6NtKRJK/mAFg7btrlipZ8ZIBXoaiXV9eh0G40W31KYyy+Jn8PxX9x+9uIrd/
+4w+UJfPf34xxgA73+27X+3/+Ec2Sfavsf2/fgeX5fmeTtzu3bt3+z+NaFcJomlz6R8SXs5r+41FB
+oZaGW8IeZEa6XKPKAN/z7iCR0OO1d3QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVynh/UPGVx
+4u1m01m28vR4c/YpPLCrwwEPlyA5ffHln67W4+XpQB0eo3sWmafc6jOGaK0hkuJFQAsViUuwUEgZ
+wPWuah+IkVxEk8Hh/XpYpVDxyJZBlZWGVZWEuCCK1/Fn/Iq6z/2D7r/0TJXNeHv+Fk/2Bpn2H+w/
+sv2O3+z+d9q8zy/LTZ5mz5d23rigDq7TXLC7uodP/eQX09mmofZJo2SRIXIT95wVDBjtK7s1oVxX
+9n/8Xc+0fabj/kD/AGny/M/d/wCt+zeVtx/q/wDlpt/v/NVfwjY694jtbLxnPrt1DPc3TyyWCc2X
+2eN3ga3WAvjJCff7ehb5qAO9ooooAKKKKACiiigAooooAKKKKACiiigCpfaTpWqbP7Ts7e88rPl/
+aIkl2bsbtu9WxnaM1Yhhit4kggRYoolCRxoAqqqjCqqjgACn0UAFV73TtP1OIQajbQ3cSsHWO4jW
+VQwBAYK4IzgmrFFABRRRQAUUUUAFZXiz/kVtZ/7B91/6JkrVrK8Wf8itrP8A2D7r/wBEyUAfNVFF
+FAHtXwV/5Fa6/wCwhJ/6Jt69Arz/AOCv/IrXX/YQk/8ARNvXoFABRRRQAUUUUAFFFFABRRRQAUUU
+UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV5/8Ff+RWuv+whJ/wCibevQK8/+Cv8A
+yK11/wBhCT/0Tb0AegUUUUAFFFFAHKf8K50lP9Htr/VLbTuh0uK8cWhQ/wCsjKNufbJk7vn7npWq
+3hrTftmj3cXmRf2DHJDZxK2U2SxrAQ+8MzbVUY+b65rWooA5my8BaVY6bZaWl1eSwadqCapb+bIj
+FZI+kf8AqgBGSSSAByTzVjXPCFlreoRaqLy+068ihNsZ9Pn8lniLeYEf5X4Dc8Y988Y3qKAOXT4d
+6DDpEmjW0l1BCb7+0oJIpdstvOAqL5L7eiquBu3HvnODVjT/AARo1la6ha3TXGqf2tsF5LqEpmkk
+WIbYl3AJjZ1Uj5h68DHQUUAc5oPgXSNBvV1BJrq/uYYVtraS/kExt4l3DZBhECjDY+nAxk5r3vw4
+0a+nvXe71CK21GR57ixiuCts00g5m8vacsHAcZJGQONvFdXRQBj6d4X0/TNQttRgkmaW002PSI1d
+lKmCJg6swCA78jrnHtVebwPodzpuo6XdLJPDql5LqLs5XfFPNj54GCDbtxxnPcHIOK6CigDn9E8F
+aboeqvrUNzeXV7Lbm2mmvJvOaUF1cO5KA7gEVRjA2jpnmugoooAKKKKACiiigAooooAKKKKACiii
+gAooooAKKKKAK+o2UWp6fc6dOWWK7hkt5GQgMFlUoxUkEZwfSuah+HcVvEkEHiDXooolCRxpehVV
+VGFVVEWAAK62igDEi8K2sWs2Ou/a7x7qws1sPnlBWeNQ/wA1x8m52LPuPP3gDiqUPw70G31RNRgk
+uooIroX8empLtsluFGFlWELkEHn73t935a6iigCp/Z//ABNf7U+03H/Hv9m+yeZ/o33/ADPN8rH+
+s7bs9Kt0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZXiz/kVtZ/7B91/6
+JkrVrK8Wf8itrP8A2D7r/wBEyUAfNVFFFAHtXwV/5Fa6/wCwhJ/6Jt69Arz/AOCv/IrXX/YQk/8A
+RNvXoFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
+AV5l8GNTWGLUvDFzG0N5BM13scMGIxHBKrKVG0xsi9Tn5unFem1wXi74f3suqJ4q8GyrZatGzSyx
+52LM+Cd6cFQ7/dYN8rZ+bHO4A72ivP8AQfGfjhbq30jX/DlxJIbhLaXUI0kjjVCVjaV9sUkbYOWL
+KwU9sCvQKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
+iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKyv
+Fn/Iraz/ANg+6/8ARMlatZXiz/kVtZ/7B91/6JkoA+aqKKKAO18Ff8LJ/sqX/hDv+PH7Q3mf8ev+
+u2R7v+Pn5vu7faug/wCL6/5/s+iigA/4vr/n+z6P+L6/5/s+iigA/wCL6/5/s+j/AIvr/n+z6KKA
+D/i+v+f7Po/4vr/n+z6KKAD/AIvr/n+z6P8Ai+v+f7PoooAP+L6/5/s+j/i+v+f7PoooAP8Ai+v+
+f7Po/wCL6/5/s+iigA/4vr/n+z6P+L6/5/s+iigA/wCL6/5/s+j/AIvr/n+z6KKAD/i+v+f7Po/4
+vr/n+z6KKAD/AIvr/n+z6P8Ai+v+f7PoooAP+L6/5/s+j/i+v+f7PoooAP8Ai+v+f7Po/wCL6/5/
+s+iigA/4vr/n+z6P+L6/5/s+iigA/wCL6/5/s+j/AIvr/n+z6KKAD/i+v+f7Po/4vr/n+z6KKAD/
+AIvr/n+z6P8Ai+v+f7PoooAP+L6/5/s+j/i+v+f7PoooAP8Ai+v+f7Po/wCL6/5/s+iigA/4vr/n
++z6P+L6/5/s+iigA/wCL6/5/s+j/AIvr/n+z6KKAD/i+v+f7Po/4vr/n+z6KKAD/AIvr/n+z6P8A
+i+v+f7PoooAP+L6/5/s+j/i+v+f7PoooAP8Ai+v+f7Po/wCL6/5/s+iigA/4vr/n+z6P+L6/5/s+
+iigA/wCL6/5/s+j/AIvr/n+z6KKAD/i+v+f7Po/4vr/n+z6KKAD/AIvr/n+z6P8Ai+v+f7PoooAP
++L6/5/s+j/i+v+f7PoooAP8Ai+v+f7Po/wCL6/5/s+iigA/4vr/n+z6P+L6/5/s+iigA/wCL6/5/
+s+j/AIvr/n+z6KKAD/i+v+f7Po/4vr/n+z6KKAD/AIvr/n+z6P8Ai+v+f7PoooAP+L6/5/s+j/i+
+v+f7PoooAP8Ai+v+f7Po/wCL6/5/s+iigA/4vr/n+z6P+L6/5/s+iigA/wCL6/5/s+j/AIvr/n+z
+6KKAD/i+v+f7Po/4vr/n+z6KKAD/AIvr/n+z6P8Ai+v+f7PoooAP+L6/5/s+j/i+v+f7PoooAP8A
+i+v+f7Pqpq3/AAuf+yrz+1P+PH7PL9r/AOPH/U7G83/V/N93PTmiigDzWiiigD//2T==
+</w:binData><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:330.75pt;height:243pt"><v:imagedata src="wordml://02000001.jpg" o:title=""/></v:shape></w:pict></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="000F30F7"><w:pPr><w:pStyle w:val="CM2"/><w:jc w:val="center"/><w:outlineLvl w:val="0"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>Figure 1: Overview of SAWTSR Architecture </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="CM29"/><w:spacing w:line="276" w:line-rule="at-least"/><w:jc w:val="both"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>In this document, the system requirements are categorized by the major subsystem: </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00EB2959" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="00EB2959" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>Robot API</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> Subsystem</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>T</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>his subsystem corresponds to the interface to the robot or robots; although the design shall be influenced by the existing daVinci research API, it shall be usable for other robot systems. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00AE56EF"><w:t>Video processing</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> Subsystem</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t> T</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>his subsystem provides the processing of 2D (e.g., ultrasound) and 3D (e.g., stereo video) images, using image pipelines. </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:b/><w:b-cs/><w:color w:val="auto"/></w:rPr></w:pPr></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Other device interfaces</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> Subsystem</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>Th</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>is subsystem provides interfaces to devices other than robots and video systems, including force sensors, foot pedals, tissue oxygenation sensors, etc. </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:b/><w:b-cs/><w:color w:val="auto"/></w:rPr></w:pPr></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Calibration and registration</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> Subsystem</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>T</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>his subsystem provides tools for calibrating devices or (at a minimum) for reading the calibration results produced by an external system (e.g., Matlab programs). It also provides methods for computing coordinate transformations (e.g., registration). </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:b/><w:b-cs/><w:color w:val="auto"/></w:rPr></w:pPr></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tool tracking</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> Subsystem</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>T</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>his subsystem provides the capability for tracking the positions of tools using some combination of sensor feedback (e.g., joint encoder positions and stereo video images). </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:b/><w:b-cs/><w:color w:val="auto"/></w:rPr></w:pPr></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>User Interface (Visualization)</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> Subsystem</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>T</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>his subsystem provides the 2D and 3D graphical displays and accepts control information from input devices (including the master manipulators in a telesurgical system). </w:t></w:r></w:p><w:p wsp:rsidR="00AE56EF" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:b/><w:b-cs/><w:color w:val="auto"/></w:rPr></w:pPr></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Telesurgery application framework</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00AE56EF"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>T</w:t></w:r><w:r wsp:rsidR="009F2FE2"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:t>his corresponds to a working “skeleton†application, which the researcher can customize. System-level requirements are listed in this category. </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="000C7F38"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr></w:pPr><w:r wsp:rsidRPr="000C7F38"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/><w:color w:val="auto"/></w:rPr><w:pict><w:binData w:name="wordml://02000002.jpg">/9j/4AAQSkZJRgABAgEAyADIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdC
+IFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA
+AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFj
+cHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA
+ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD
+TAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJD
+AAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5
+OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEA
+AAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
+AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAA
+AA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo
+dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt
+IHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt
+IHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg
+Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENv
+bmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA
+ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA
+AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAK
+AA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
+mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy
+ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMC
+DAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMh
+Ay0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4E
+jASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3
+BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
+RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqY
+Cq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN
+Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBh
+EH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT
+5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu
+F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9oc
+AhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCY
+IMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZcl
+xyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2
+K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIx
+SjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec
+N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+
+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXe
+RiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN
+3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYP
+VlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1f
+D19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
+aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfBy
+S3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB
+fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH
+n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj
+k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6f
+HZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1
+q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm4
+0blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZG
+xsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU
+y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj
+4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz
+GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7gAOQWRvYmUA
+ZIAAAAAB/9sAQwAMCAgNCA0RDg4RFxUWFRcbGRkZGRsiFxcXFxciIBsdHR0dGyAiJycnJyciLC8v
+Ly8sNzs7Ozc7Ozs7Ozs7Ozs7/9sAQwENCwsOCw4SDw8SFBERERQXFBQUFBceFxgYGBceJR4eHh4e
+HiUjKCgoKCgjLDAwMDAsNzs7Ozc7Ozs7Ozs7Ozs7/8AAEQgC3gPVAwEiAAIRAQMRAf/EAB8AAAEF
+AQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFB
+BhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV
+VldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC
+w8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAA
+AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
+kaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo
+aWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
+1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9VooooAKKKKACiiigAooooAK
+KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
+ooAKKKKACvH/AAVoeteMLKS7/t67h2TNFt3SSZ2qjZz5y/3vSvYK8X+Hmn+J7rT5W0e9gghE7Blk
+UFjJsTLcwycY296ANXXdD8Q+CIRqsWsyXSQEGSOYybWDssYXYXcMDu55UjqOenpGk339qWVtd7dn
+nQxy7c7tvmKGxnAzjPpXkunx6z421GTRtc1J7cw8tBtVHnwVYqoQKjYA3Bju/vKCMkdF8RohGND0
+KImO2uJ0icKx3+XEYo0XJJyBvz8wPIU9qAOztfEOmX0qw297byu2cIkyO5wMnCqxPQVy/wAXdRut
+M0mGS1nkhY3SKWjdo2K+XKcZUjjipfF3gfRhol15VpHE1vA8kbxqFk3QoSNz4ywOMNuznr1wa5Xx
+lrFxr3gzTby5IMr3WGIG0MYxcR7sep25OOM9MUAepf2tZfafsf2mHz/+ePmL5vTf9zO77vPTpVuu
+K8UeBNHh0GdEtkV7a3Z0mVVSZngQkF3VRu3Y+bPXrwcEcvqesXXiLR/DdlcuQt9OY52Ut5jrBKsK
+5LFsk7tzbgfmANAHptr4h0y+lWG3vbeV2zhEmR3OBk4VWJ6Cua8beMn0XUdLs7e5hQPcL9ryVLxx
+Zj4fdnYrK5OcA8cHrTvF3gfRhol15VpHE1vA8kbxqFk3QoSNz4ywOMNuznr1wa43UJ18QHwte3UM
+LTXVwyXDCNR54imihHmf3vlHTpycADigD2KGZLhFkjYMrAMrKdysrcggjqDTLu6isYZLiZtqRIzu
+cE4RBuY4GT0FPhhS3RY41CqoCqqjaqqvAAA6AVxXxc14aVpBtVYiW7OwYJUiNCGkOQOQeFK5GQ31
+oA5LT9f1ix+weILu4m+z3N9KkqNKz2yQtgDZCHLfL+92jnGxeOm71LxPM9vpN/JGxVltZmVlO1lZ
+Y2III6EV5Vq/jXQr3w6ujRQzho44xHIYIgvmx4JfAmO0yfNuIyfmPXv2Gma8PEPgy5lLEyR2c8Mu
+4lmMkcRG4swGSww3frjOaAMLwt4V1rxLpsF//wAJBdxebv8AkzI+3Y7J97z1/u56VatLvWvAutWd
+hf3j3tpevsR3+aTzG2p/GxZdrFcjcV2kkDd0z/Bmp+LrfSLdNN0+3ltx5nlu7AO2ZHLZzOnRsj7t
+bGl+F9e8Q6vb6pr/AJcSWxzFbo2QHUAqy7HYAbvmJLEkrtI24wAW9J1G6k8balatPIYUtVZYi7GN
+Wxb8qmcA/MfzruK8/wBG/wCR+1X/AK9E/wDQbavQKACiiigAooooAKKKKACiiigAooooAKKKKACi
+iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
+KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
+ooooAKKKKACiiigAooooAK4/4X6BfeHdMlt76Lyna4ZwNyv8hSNc5RmHVTXYUUAcf8QfCc+tJb3+
+nDF7aOrRYCfvBuU4ZpMD5D8y5OOox81HiHw5f+KrCwuQEtdRtXWVd/zRrIMeYPkaRdpZQy53dADj
+JrsKKAOE1Ofxb4gsjp/9mw2hmQpNcPcJJHsKneFjTcy7+g+9jP8AwIReMfBFy3hyy0nTI/OaCZGb
+5gm75JN7/vH43O+cZ4zxxXoFFAHCanH4u1OyOktbW6tIhjlvvNHlSRlTuxFt3qzfdJ29c4AGCJtX
++HrNpenW+nSpHc6e6vFK4bYzkhpCR8+Nz4fo2MbehrtaKAOE1Ofxb4gsjp/9mw2hmQpNcPcJJHsK
+neFjTcy7+g+9jP8AwIV/EHgm8sYdCGlwi4/s2Tc6bxE0jFo5GcGQkAMyHPJxuGAR09DooAhtJJZo
+Y3mj8p2RS8e4P5bkZZdw4ODxmuVvNAvtX8VQXtxFts7OH90WZZElmI+8I92UYFuu3/lmPbHYUUAF
+ef2XhbUtKfxDZQwbrW8hle2IdEjWWRWHlLFu+X7+3d8o+Qe2PQKKAOf8BaXc6LolraXaeXLH5m5c
+hsbpHYcqSOhHeugoooA4/TNAvrfxdqGpPFi3lt1RJNync4EAxtDbh9xuorsKKKACiiigAooooAKK
+KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
+oAKKKKACiiigAqjqmt2WjKhuplQuQqLy0kjEhcJGoLMcsPug1erlPFlnLeajYiC4kt3W3u2V0Ctz
+ut1w6uCGX5s49hyKFqJuyuW28UTzqTaabcNl9qtMY7eMgNtLsGcyquOR+6yfSke/1ud1CpZ26gHJ
+LSXbM3G0AYt9o65OT2qkJdYgcgraTqQMHMlqytzkEYuMjpg5FJ/bt1HF5kumXQIXcyo0EmCBkhcT
+Bm9vlyfSq5TL2je1i3INYuCoa+ijUHLGC22yMMEbd08k6gZwfuZ4pfsl9/0FLr/vi2/+RqrReJba
+RFYxXSEgEq1pPuXPY7YyMj2JpU8U6WxZXuo4mU4ZJj9nkHAb7k2xsYPXFOyFzTHjRd7M895eSsxz
+n7Q8IGABgJbmJAOP7vWnf2JD/wA9rv8A8DLn/wCPUz/hJtJ/5/7X/v8AR/8AxVXLO+t9QQyW00cq
+g7S0bB1DdcZUnnmiyFeXdlb+xIf+e13/AOBlz/8AHqgtvCOjWsYjSxgIGcF4xI3Jzyz7mP4mteii
+wcz7szP+EZ0n/nwtf+/Mf/xNH/CM6T/z4Wv/AH5j/wDia06KBXfczP8AhGdJ/wCfC1/78x//ABNH
+/CM6T/z4Wv8A35j/APia06KAu+5mReHbS3XZCZ4kyxCRXM8Ua7iWO1EkVVGT0Ap/9iQ/89rv/wAD
+Ln/49WhTJZUgRpJGCqoLMzHCqo5JJPaiyHzPuyl/YkP/AD2u/wDwMuf/AI9RDp97CiouqXZCgAbh
+bu2BxyzW5JPuTmmf8JNpP/P/AGv/AH+j/wDiqP8AhJtJ/wCf+1/7/R//ABVFkO8vMkNvqkTK8WpO
+xB5WeGKSNlwRjEKQNnODnf2p73OuRgMstnIQVyhhkh3Lkbh5nnS7TjODsb6VVi8T2UyK6C4ZWAKs
+LW4Ksp5BBEXShdfaYt5NjdyKpxuKJCG4B4W4kifHOM7aLIOeS6l0a9qMLgTacHUg829wsjKwxgMs
+62/B55BPTpVjT/E9pfzJbMssE779sU8ZjZvKOG2PzG/HzfI7cc1iLqOs3KSmOxhhOWEfn3GWP912
+SGNxj1Xf+Peqmp6Xcytaz3d2ZDHf2jpHHGsUKkyxxdDvkJ+Zj/rO/Tik4lRqO9nY72iiipNQoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
+ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
+iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
+KACiiigAooooAKKKKACiiigAooooAKKKKACuf1r/AJCtl/17Xf8A6Ha10Fc/rX/IVsv+va7/APQ7
+WmtyZ/CySiiitDlCiuO04a1rst88WqeQkN5NAqfZ45PljIx8xwehxV2w1i50q7uLHU51lEVt9qWd
+Y9hMSswk8xVJGQfuhR096VyuXzOkqjcaHp95IZZrSCR2xlniRmOBgZJGelVrHxXpepSPHBcqxSLz
+WOGVVjwpLFmAUY3DIzkd+hptp4w0i+uDbRXaGTOADlVZs7cIzAKxJ6bSc9qNAtJdGT/8I1pX/Phb
+f9+U/wDiaP8AhGtK/wCfC2/78p/8TTtX16x0FEe8mEYckLwWZsdcKoJwO5/xotdesb6ze+hmDwoG
+LMAfl8sZbK43ZxzjFGge9vqN/wCEa0r/AJ8Lb/vyn/xNH/CNaV/z4W3/AH5T/wCJqpF440SWVYhe
+puYAgkMqcru5dgFBx2J68deKv6rrVlokYkvJ1iB6A8s3IB2qMs2MjOBxRoHveZH/AMI1pX/Phbf9
++U/+Jo/4RrSv+fC2/wC/Kf8AxNFp4j06/tpLqC4V44lLyEZ3Iq55ZMbh904457U3TfE+m6xMbe0n
+EjhBIQFb7h29yMZ+YZGcjoeho0D3vMd/wjWlf8+Ft/35T/4mj/hGtK/58Lb/AL8p/wDE1WtvGmj3
+dyLWK7VpGYoBhtrN6Byu057c89qqXPi2K28QLp0koWPyVXGxizXUrrsUnB42HjtzyfQ0C0vM6ais
+Sy1u3g83z7zzd181sn7op5ch+7BwPm2/3zwfWtLUdRt9Jt3ubl9kaY3NgtjcQo4UE9TTFZlmisjV
+fFel6LIIrq5VH7qAzsvAPzBAxXg8Z61pW1zFeRiWGRZEbOGRgynBwcEcdaAsyWqOsf6qH/r7s/8A
+0phq9VHWP9VD/wBfdn/6Uw0nsxx+Jep1VFFFZnUFFFFABRRRQBiyeMNNjd03TEo7I222ndd8bFGA
+ZYiDggjg03/hMtN9bj/wEuf/AIzWBZf8vH/X3d/+lEtWa7YYOMoxlzPVJmqpJpO5rf8ACZab63H/
+AICXP/xmj/hMtN9bj/wEuf8A4zWTRVfUo/zMfsl3Nb/hMtN9bj/wEuf/AIzR/wAJlpvrcf8AgJc/
+/GayaKPqUf5mHsl3Nb/hMtN9bj/wEuf/AIzR/wAJlpvrcf8AgJc//GayaKPqUf5mHsl3Nb/hMtN9
+bj/wEuf/AIzR/wAJlpvrcf8AgJc//GayaKPqUf5mHsl3Nb/hMtN9bj/wEuf/AIzR/wAJlpvrcf8A
+gJc//GayaKPqUf5mHsl3Nb/hMtN9bj/wEuf/AIzR/wAJlpvrcf8AgJc//GayaKPqUf5mHsl3Oi0z
+XbTWGkS3Zy0YUsHikhID7tpxKi5ztPT0rQrl/C//ACEr7/r3tf8A0O5rqK46keSbj2MpKzaCiiio
+EFFFFABRRRQAVDd3UVjDJcTNtSJGdzgnCINzHA56VNWV4s/5Aupf9ek//otqAI/+EtsPS5/8A7n/
+AOM0f8JbYelz/wCAdz/8ZplFcf1uX8qOr6qu7H/8JbYelz/4B3P/AMZo/wCEtsPS5/8AAO5/+M0y
+ij63L+VB9VXdj/8AhLbD0uf/AADuf/jNH/CW2Hpc/wDgHc//ABmmUUfW5fyoPqq7sf8A8JbYelz/
+AOAdz/8AGaP+EtsPS5/8A7n/AOM0yij63L+VB9VXdj/+EtsPS5/8A7n/AOM0f8JbYelz/wCAdz/8
+ZplFH1uX8qD6qu7H/wDCW2Hpc/8AgHc//GaVPFmns6ITOpd1RS9rcIu+Rgigs8QAySByajqjrH+q
+h/6+7P8A9KYaqOJcpJWWrSFLDqMW7vRHVVjp4v0hi6veRwshwyXBNtIDgN/q5wjYwRzjFbFFdRzE
+Nrdw30SzW8iSo2cOjB0ODg4ZeOtTVj3nhPTrp3mSM28zhwZrZ2tpSZMFmZoiu85APz7hmqkmpX3h
+p/8AiYsbm0Ic/aUiPmwFdz4uI4gQV2cCRFUAj5lGc0AdHRTIZkuEWSNgysAysp3KytyCCOoNPoAK
+KKKACsq58TWNpNJAxmLxkB/Lt5pVVmVXA3RxsudrA9a1a5iD/j/1T/r5T/0mt6zqz9nHmSuXSh7S
+Vi9/wlth6XP/AIB3P/xmj/hLbD0uf/AO5/8AjNMorn+ty/lRv9VXdj/+EtsPS5/8A7n/AOM0f8Jb
+Yelz/wCAdz/8ZplFH1uX8qD6qu7H/wDCW2Hpc/8AgHc//GaP+EtsPS5/8A7n/wCM0yij63L+VB9V
+Xdj/APhLbD0uf/AO5/8AjNH/AAlth6XP/gHc/wDxmmUUfW5fyoPqq7sf/wAJbYelz/4B3P8A8Zo/
+4S2w9Ln/AMA7n/4zTKKPrcv5UH1Vd2P/AOEtsPS5/wDAO5/+M0f8JbYelz/4B3P/AMZplFH1uX8q
+D6qu7H/8JbYelz/4B3P/AMZo/wCEtsPS5/8AAO5/+M0yij63L+VB9VXdj/8AhLbD0uf/AADuf/jN
+H/CW2Hpc/wDgHc//ABmmUUfW5fyoPqq7sf8A8JbYelz/AOAdz/8AGaP+EtsPS5/8A7n/AOM0yij6
+3L+VB9VXdj/+EtsPS5/8A7n/AOM1PYeILPUZvs8RlD7GcCSCWHKIVViDKig4LD86q1Ba/wDIatv+
+vS6/9GWtXTxDnNRstSalBQi5X2OjooorpOcKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
+gAooooAKKKKACiiigAooooAKKKKACiiigArn9a/5Ctl/17Xf/odrXQVz+tf8hWy/69rv/wBDtaa3
+Jn8LJKKKK0OU4XQdN1O8l1N7PUfsyDULgFPISbLZHzbnOemBj2rSvdCbT9P1O6ubhrm4ks5UaRlV
+AqIjkLGqj5Ac/MM8kZrfstOt9O83yE2+bK0r8k7pH+83JOM46DipLm2jvIpIZRuSRWRhkjKsMEZH
+PSlYty1OR1SJ4vBii2UqfssBIjGPlbY0pO3sQWLfjmql5pc13p0EkmuqbctH5Hl2aBhIDiMQiI7w
+46YXkcj1ruba2js4o4YhtSNVRRknCqMAZPPSsu08H6RY3BuYrRBJnIJyyq2d2UViVUg9NoGO1FgU
+/wA7mXY/Z/8AhKb77V/rvKh+yb8/6vYfN8rPHX05+9/tVnaj9n/tLW/sX3P7Mm+0bM+X9q+b738O
+/bn8d3fdXXavoNjryIl5CJAhJXkqy564ZSDg9x/hVa40GGx0i6sdPhCb4Zgqg/ekkUjlnPXoMk/p
+RYFJfkjL/wBE/wCEQ/5ZbPsP+zs87Z+W/wA38d3vWTcLevqWkrJeNaSNp8apJNF52bk8SIPN4WRh
+jcevRe9b+h+C9Os0tLmW0VbmOKLcckgSqgUnaG2ZzznHXnrzWzqmk2uswm3u4hImQcHIww6EFcEH
+6H2osPmSf3nIXGmyWbau82o/aZjp8glRYBCo+U+W0jRnZvxkKG+bafStvTVtrbw3EZY8wixDSIg2
+llaPdJjBXlsnv1q7aeHNOsLaS1gt1SOVSkgGdzq2eGfO4/eOOeO1Xba2js4o4YhtSNVRRknCqMAZ
+PPSiwnK55xr/APaknhxJLia2gtzFAIoIlZmlVthVWaViQUAz8uc85rqP+Zr/AO4Z/wC16lg8B6Hb
+79tmp3KUO5nfhv7u9jtP+0OR61dufDtheS2880O+S32+W5Zt42EFdzbsvgjPzZ7+posxuS/P8Tnt
+K0sazp+u2hAzJf3QXJIUSDYyElecBgDTLC/k8V3OlxOGP2RTPdh1CYuY8xRg7PuvvDNsO3K9u1db
+Zadb6d5vkJt82VpX5J3SP95uScZx0HFFrpttZSTSwxKjTNvkKjBdsYyf89ST1JosLm3/AAOK0e2v
+7zUtVjg1L7LN9pdmje3WWR4RxE+6TBKAHCgcAY/vVv8Agu0js7KRIrr7ShnkKuIzDGOm5Yl+7s3Z
+OU+XJOKt6v4Y03XnR7yASMgIDbmRtp5wShXI9M/1q/bW0VnGIoY1jRc4VFCqMnJwBx1oSCUrolqj
+rH+qh/6+7P8A9KYavVR1j/VQ/wDX3Z/+lMND2Yo/EvU6qiiiszqCiiigAooooA4Sy/5eP+vu7/8A
+SiWrNVrL/l4/6+7v/wBKJas169L+HD/CvyOmPwr0CiiirGFFFFABRRRQAUUUUAFFFFABRRRQBP4c
+mS3v9QkkYKq21szMx2qqq10SST0Aqaz+IWk6jqkel2rvM77/AN4ijyQYwzMNxIJ4XgqCDkc1ymq+
+DX8Y3F1HHcmJoobdlU8xSMTdAbwOhHZucAtwc1geH/h7q1jrsFvdJcQJ+8/0m2YgABHClZQCF3EY
+w2Dg9BmvKxH8WXqc8/iZ7fRXKf8ACA/9RnVv/Ar/AOwo/wCEB/6jOrf+BX/2FZEnV0Vyn/CA/wDU
+Z1b/AMCv/sKP+EB/6jOrf+BX/wBhQB1dFcp/wgP/AFGdW/8AAr/7Cj/hAf8AqM6t/wCBX/2FAG3r
++tw+HbGW+uFdki25CAF/nZUGNxUdW9aytT1+w8QaDqUtjcJKBaT5A4dco4G5Gwy5wcZHPauf8Z+B
+ZodIuGt77U7tx5eIHmM6SfvEzmNUycDn8M1zVn8LL/T7C71C+m+zmK3nYRRndI2I5AVd1O0KeMgb
+tykg7aAPTqqXer2Vg4S4uYYmIyFkkVGK9M4YjjirdcP4hvNMsvEavqgQxGwAXzIzKvmec2PlCtzj
+PNebCPM7a7dD0Jy5VfTfqdbaavZX7lLe5hlYDJWORXYL0zhSeOat159NdaRq2oaauhRDzo7hZJHh
+iMCpbDiXecJkHI9e4/iwdufXtT1S8mt9Hih2W5KSzXIcRmYHmOPZzle5/lxubp9tNNebSwlU+f8A
+h1udDc3MVnGZZpFjRcZZ2CqMnAyTx1qWuD8Q68+r+HtQhuIjDdW5hWeMj5QzSJtZD3VsZHP5jBOp
+ca5rOjqLzUYLYWxZA4jdzNbrIwG5zgq+3OCEHJ6cUeydvO9rfdsHtFfytc6imSypCjO7BVUEsxOF
+VRySSe1YGqa9ezXx07SYkeWMBp5JgwgiVhlF+XBLN7frzt5zxZr17daXeafeRJFcxGN5MBvKmtvM
+ULJCeed5UEN2z3yFI0nJrzt62YSqKKfl+Z6LRVbTvtf2dPtvledzv8rd5fU427+emM+9VtYsb3UP
+Lit7n7PGd3msq7pmHACxk8JkFvm6g7cd6i2tr/Mu+l7F22uYryMSwyLIjZwyMGU4ODgjjrVbWP8A
+VQ/9fdn/AOlMNZPw7/5ANp/21/8ARr1rax/qof8Ar7s//SmGriuWql2nb8SJPmpt94/odVRRRXon
+AFFFFAHP6AraLdzaQxcxKgmtCxZ8W/CPDuKD/VPjGWY7XX0roKyrn/kNWf8A16Xf/oy0rVoAKKKK
+ACuYg/4/9U/6+U/9JreunrmIP+P/AFT/AK+U/wDSa3rDE/w/mjbD/H8i3RRRXCdgUUUUAFFFFABR
+RRQAUUUUAFFFFABRRRQAUUUUAFFFFABUFr/yGrb/AK9Lr/0Za1PUFr/yGrb/AK9Lr/0Za1rh/wCJ
+H5/kZ1/4cvl+Z0dFFFegcIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
+FFFABRRRQAUUUUAFFFFABXP61/yFbL/r2u//AEO1roK5/Wv+QrZf9e13/wCh2tNbkz+FklFFFaHK
+Zvh3WP7fsIb3y/L8zd8m7fjYzJ1wPT0rSrzOCD7T4b0OLeyb9QVdyHa67pJhuU9iO1aV94YtNL1S
+xsrQywwXyzJcRpI22RYFEgGWyw3Z2tg/dyBjJyrluKu9e/4HdUVxlnYp4e1e6sLKY28Elg1x858y
+OCYN5fmjzOwAycnnvwBjm7wxWliNR0+wuknjEbvfTM0WXcr+8WNpHEglydw6Dd3BouChfqer0Vyu
+t239va5Dps7H7Mlq08kYZl85mfYFfay8KQrD8fWoNJ0e30TxK0FtuEZ08sqMxcR5mGVTdkgEjd16
+k0XFy6b9LnY1Fc3MdnFJNKdqRqzscE4VRknA56V5pp9re+IIRqEmly3MsjO0dwt95Ji+dtqwoxOw
+Rt93Oefat3U31CTRLLTbrKXd26W77W3yLErfPKdrNvGxRv8Amx83OOlFxuFnuSR+Pyt1p9vPZlPt
+qI4IkD7POdkj42jIOFJ5GM9Mit/XtXTQbGa8dC4jA+UHG5mIVRnsMnk/zrlfEejrqeq3FlEuM6Ri
+NEwg3Rzho1GeAMqB9PSpxqg8WzaLEpBwPts+0FfLaD92u3f/AA+buUjk9845pXG4rR/edD4d1j+3
+7CG98vy/M3fJu342MydcD09K0q88028ubfwxpkNrJ5TXVz9mMgGWjWWWXLLyOeP8MHmrOueG7fwZ
+aDVNLZopbfaH3EutyjsqFZATjrz8uPpnBV3E4q9r9bI7qs3RdY/tj7V+72fZ7mS3+9u3eVj5ugxn
+PSsDT9GtfF1xqE+pK0vk3kkESeY6xxJEFGVVWGC/Vvf0rESa50zTbu2tXld5dZa33+ZsncfKeJeg
+diuCxGOTxRcFFbddD0ys3RdY/tj7V+72fZ7mS3+9u3eVj5ugxnPSuT0vR9R069tpLLSWs080Cf8A
+0wTRyRHKndHuySgJK+/Y1teC/wDmK/8AYTuf/ZKLg4pJ9TpKo6x/qof+vuz/APSmGr1UdY/1UP8A
+192f/pTDQ9mKPxL1OqooorM6gooooAKKKKAOEsv+Xj/r7u//AEolqzVay/5eP+vu7/8ASiWrNevS
+/hw/wr8jpj8K9AoooqxhRRRQAUUUUAFFFFABRRRQAUUUUAWvC/8AyEr7/r3tf/Q7muorl/C//ISv
+v+ve1/8AQ7muorysR/Fl6nPP4mFFFFZEhRRRQAUUUUAFZXiz/kC6l/16T/8Aotq1ayvFn/IF1L/r
+0n/9FtQBBWB9ml/4SXz/AC28v+z9m/adm/zs7d3TOOcVv0V5adr+asei1e3qczPa3WhavHcWqvJa
+3r7biNEDLDMQAswwRgN/GcepOSVxWhmvPCN5do9pNdW91M9yj2yGSRJJCN0ci56eh/nkhevoqvad
+1fSzFydnbW559qOk6je6Tqt9NAVmvjblbZFZ5I44XULu77tvJGOMdug0NZvbvxVatpa6dcwPI0Ym
+kkVRDEqOpdkfcBLgjgDG4c12NFP2vktHdeW3+QvZ+b1Vn5/1c5W9+2eG9Wnv0t3ure8EYcQqWnhk
+hTavy5+ZW9f8Buxta0vUvEsGoakbZot0CwQW7D9+8ccySs7gng/KcL1PbsW9DooVW1nZXVtfQHTv
+dXdtdPUrade/2jbpP5UsW7PySrskXBI+ZecZxke1WaKKzZZgeA7aWz0W1imjaN18zKupVhmRyMg8
+9K0dY/1UP/X3Z/8ApTDV6qOsf6qH/r7s/wD0phrSL5qqfeSf4kSXLTa7R/Q6qiiivROAKKKKAMq5
+/wCQ1Z/9el3/AOjLStWsq5/5DVn/ANel3/6MtK1aACiiigArmIP+P/VP+vlP/Sa3rp65iD/j/wBU
+/wCvlP8A0mt6wxP8P5o2w/x/It0UUVwnYFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
+VBa/8hq2/wCvS6/9GWtT1Ba/8hq2/wCvS6/9GWta4f8AiR+f5Gdf+HL5fmdHRRRXoHCFFFFABRRR
+QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVz+tf8hWy/
+69rv/wBDta6Cud12VI9WsAzAFre7CgnG5t1s2B6nAJ/CmtyZ/CyaiiitDlObt/B/kWGn2X2jP2O5
+W437P9ZtZ3243cff65NaV9o/22/sb3zNv2Xzvk253+coTrnjH0NaVFKw+Z/15mRc+Ho7zUJLyV9y
+SWbWrRYIyrPvLbw2enHT8ax5PA95d2f2G61V3gVAsaJCkWGQYj3kEl1X+7nng5yK6+iiw1Jo47xZ
+JbWtzaz3E8tpcRRHZeJb+Zbs0nytGy/Oc4DFVz8uc5NReEYZb/VZtR+0y3Mf2YRefJEYUldnz+4T
+GNiBMN/tZPeu2oosHNpY5k+DpbWaU6dfPaQTkGWBEVvm6MYmY/uyR6Dj6AAW7TwvFZ3NnKj/ALqz
+gaOGPaARI/DzFlxksvBBXGeetbdFFg5mZv8AY/8AxNf7S8z/AJdvs/l7f9vzN27P4YxVTQPCyaHd
+XVwJA4lOIl2bfs8Rd5DGnzH5ct0AA4zit2inYXM9jAtfB9sujppN0fOVdxDhdjKzMzBl5bBG7/Hg
+4qtD4NuLmSD+1L9r2KDlImjEalwMBpCGJfA/vfngkHqKKVkPmZzs/he5t5pptM1B7Xz3MkqGNbiM
+yH+JA/3Sec888dABTbTwRbR2NzY3UjXCzTvMHbiVGYABt3OXGPvd88jHFdJRRZBzM52w8L3KywSa
+hqD3YtyGiQxqiBtpXdJ94uw6qxOQee9aGi6P/Y/2r95v+0XMlx93bt83Hy9TnGOtaVFFhOTYVR1j
+/VQ/9fdn/wClMNXqzNbuYohaxPIqvJd2mxSwDPtuIS20dTgdcUPZjh8S9Tr6KKKzOoKKKKACiiig
+DhLL/l4/6+7v/wBKJas1Wsv+Xj/r7u//AEolqzXr0v4cP8K/I6Y/CvQKKKKsYUUUUAFFFFABRRRQ
+AUUUUAFFFFAFrwv/AMhK+/697X/0O5rqK5fwv/yEr7/r3tf/AEO5rqK8rEfxZepzz+JhRRRWRIUU
+UUAFFFFABWZ4nhe40m/jjUszWsyqqjczM0bAAAdSa06KAOV/tiL/AJ43f/gHc/8Axmj+2Iv+eN3/
+AOAdz/8AGa6qiuf6rDvI3+sz7ROV/tiL/njd/wDgHc//ABmj+2Iv+eN3/wCAdz/8ZrqqKPqsO8g+
+sz7ROV/tiL/njd/+Adz/APGaP7Yi/wCeN3/4B3P/AMZrqqKPqsO8g+sz7ROV/tiL/njd/wDgHc//
+ABmj+2Iv+eN3/wCAdz/8ZrqqKPqsO8g+sz7ROV/tiL/njd/+Adz/APGaP7Yi/wCeN3/4B3P/AMZr
+qqKPqsO8g+sz7ROV/tiL/njd/wDgHc//ABmq95efbvIiigut32q1b5rWdFCpPG7Es8YUAKCeTXZU
+U44aEWmm9HcTxEpJqy1CiiitzEKKKKAMq5/5DVn/ANel3/6MtK1ayrn/AJDVn/16Xf8A6MtK1aAC
+iiigArmIP+P/AFT/AK+U/wDSa3rp65iD/j/1T/r5T/0mt6wxP8P5o2w/x/It0UUVwnYFFFFABRRR
+QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVBa/8AIatv+vS6/wDRlrU9QWv/ACGrb/r0uv8A0Za1
+rh/4kfn+RnX/AIcvl+Z0dFFFegcIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
+UUUUAFFFFABRRRQAUUUUAFFFFABVTU9KtNZhNveQpKhzwwzgkFdynqrYJwRyKt0UAYR8JRxuWt7y
+8hBABXzROuVz83+lJMQeecEDpUSaDqkQKjUIXGWwZLUmTaSSAxjnjUkDjIQfSuiop3ZLjF9EczFa
+a4EUPBZlsDcRcyKpbuQDbHA9smmltVgcrLp28YBDW88ci55yref9nII46Ajmuooo5mL2UexzHn3/
+AP0C7n/vu2/+SKjl1C5tipn067RWONyqk+04J5W3klfHGM7cV1dFPmYvZROV/tiL/njd/wDgHc//
+ABmj+2Iv+eN3/wCAdz/8ZrqqKOZh7GPdnK/2xF/zxu//AADuf/jNVLvxXZWMkEUy3CNO+xA1tMhY
++waMFucDC5OSOK7WvP8A4j/8hrw1/wBfZ/8ARlvRzMPYx8zW/tiL/njd/wDgHc//ABmj+2Iv+eN3
+/wCAdz/8ZrqqKOZh7GPdnK/2xF/zxu//AADuf/jNNOrF2VILO8lZjjH2d4QMAnJe4ESAcf3q6yij
+mYexj5nMeff/APQLuf8Avu2/+SKa82psAItMm3EqMySwJGASAWZklkbAHPCE11NFHMw9lE5z7LrX
+/Ptaf+BUn/yLRDpGsyLukubSMkn5FgkmCrk7R5hmi3HGMnYtdHRS5mP2cexzyeFJplAu9SuHy+5l
+hEdvGQG3BFKqZVGOD+9yfWtDTfD9hpMjy28OJH+9K7NLMwwo2mSQs+35RxnFaNFK5SSWyCiiigYU
+UUUAFFFFAHCWX/Lx/wBfd3/6US1ZqtZf8vH/AF93f/pRLVmvXpfw4f4V+R0x+FegUUUVYwooooAK
+KKKACiiigAooooAKKKKALXhf/kJX3/Xva/8AodzXUVy/hf8A5CV9/wBe9r/6Hc11FeViP4svU55/
+EwooorIkKKKKACiiigAooooAKKKKACiiigAoorlNA8df25rV5pP2Xy/s3m/vPM3b/JkWL7uwYznP
+U0AdXRRRQAUUUUAFFFFABRRRQAUUUUAZVz/yGrP/AK9Lv/0ZaVq1lXP/ACGrP/r0u/8A0ZaVq0AF
+FFFABXMQf8f+qf8AXyn/AKTW9dPXMQf8f+qf9fKf+k1vWGJ/h/NG2H+P5FuiiiuE7AooooAKKKKA
+CiiigAooooAKKKKACiiigAooooAKKKKACoLX/kNW3/Xpdf8Aoy1qeoLX/kNW3/Xpdf8Aoy1rXD/x
+I/P8jOv/AA5fL8zo6KKK9A4QooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8/+I//ACGvDX/X2f8A0Zb16BXn
+/wAR/wDkNeGv+vs/+jLegD0CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA4Sy/5eP+vu
+7/8ASiWrNVrL/l4/6+7v/wBKJas169L+HD/CvyOmPwr0CquqXLWVpcToAWjidwD0yilhmrVUNf8A
++Qbef9e8v/oDVUtIv0G9jKs7nxFewRToLALIiuAfNzhxuGa0fD+rPq1uzSx+XLFI0Mqg5XzExu2n
+J45//X1rm/L1nTtJt7uK/JjWKJjGtuhaOEgZ2nndsHrjjnNWroJo3hyaawuGdpMOZ8/PI8rqjtz9
+09vUf73NYRm46vm0jzPma19CE7d9rnRpqlpLL5C3ERkyRsDqXyvUbc54xzVKfW/supm1laNIRaiY
+ux2kOZPLwWJxj+tZmq+HtLs9IaSAKhhj82KdWAkaQDch8wddx/n8uOMQWdvFrWq2b3iLKTpccp3A
+FTIzYJK9P4j2pynO6jpe6e+g23sdbBcRXSCSJ1dTnDKQynHHBFQvqlpFL5DXEQkyBsLqHy3Qbc55
+zxXOXQGh6jfLZKsIOmtOVVRt82JmVGAxgYHboe9P0rw9pd5pCyThXM0fmyzswMiyEbnPmHptP8vm
+zzmvaSbskrq99dNA5nsacmvxR6qNPZo1Hk7ySw3GVmVUjA9cc46nI/HXrg/CYGpahbTXKrI5sS5Z
+lBYvHcGNHJx94KoG7rXeUUZuacn1enoOLurhRRRWoy14X/5CV9/172v/AKHc11Fcv4X/AOQlff8A
+Xva/+h3NdRXlYj+LL1OefxMKKKKyJCiiigAooooAKKKKACiiigAooooAKKK5TQPAv9h61eat9q8z
+7T5v7vy9uzzpFl+9vOcYx0FAHV0UUUAFFFFABRRRQAUUUUAFFFFAGVc/8hqz/wCvS7/9GWlatZVz
+/wAhqz/69Lv/ANGWlatABRRRQAVzEH/H/qn/AF8p/wCk1vXT1zEH/H/qn/Xyn/pNb1hif4fzRth/
+j+RbooorhOwKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqC1/5DVt/16XX/AKMtanqC
+1/5DVt/16XX/AKMta1w/8SPz/Izr/wAOXy/M6OiiivQOEKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvP/iP
+/wAhrw1/19n/ANGW9egV4h4v8fS6lqdi81j5L6bcMXj84Sb3V0LLuCADmPGeaAPb6Kx/CevP4m06
+O/aEQiQvtUP5h2oxTLHYmDkHjnjv2GxQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcJZf8A
+Lx/193f/AKUS1ZqtZf8ALx/193f/AKUS1Zr16X8OH+FfkdMfhXoFQ3lst7BLA5IWRGQkdcONpxU1
+ZF74s0rT5TFNcqGHUKGfBBxg7AcHjp1pylFL3mkvMbaW5o2dstlBFAhJWNFQE9cINozVbTdFt9Lt
+3tY9zRMzHZId6qr9UGf4fY56nNWbS7iv4kngcOjjKsO/+e4qaiydn5aegaHPxeCbKNkBkneJHLrb
+vJugU8/wY7Z9frnmrOp+GrfVLkXTSTRyrGI1aJ9hQZJyDjqckemD0rXqE3cQnFvvHmFDJt77AQu7
+8z/nBpezglaysLlXYraXo0Ok72RpJHkx5kkrl5H2525J44BxwKzpfBNlIzgSTpE7h2t0k2wMeP4M
+d8ev0xxXQUUOnBpJpWQcq7GZceH7ea5gukaSFoVVAIm2I0ancI2XH3fYY/lWnRRVKKV7LcdrBRRR
+TAteF/8AkJX3/Xva/wDodzXUVy/hf/kJX3/Xva/+h3NdRXlYj+LL1OefxMKKKKyJCiiigAooooAK
+KKKACiiigAooooAK5TQPHX9ua1eaT9l8v7N5v7zzN2/yZFi+7sGM5z1NdXRQAUUUUAFFFFABRRRQ
+AUUUUAFFFFAGVc/8hqz/AOvS7/8ARlpWrWPqDm31fTnKErJHc2+4YwsjiKdd2TnBWB+gPNbFABRR
+RQAVzEH/AB/6p/18p/6TW9dPXMQf8f8Aqn/Xyn/pNb1hif4fzRth/j+RboorG8Q6pNam2s7QgXF2
+5RGIz5UajdLLg4DFB0Unn36VxJczsdjdlc2aK5mXwrfRI01vq10bnBIMjBrYyHr+52kBTzgc7e2c
+Vfn15dJ01LzU18lwoDxjBJl/ux7WYHJHy/N0645w3H+V8wuburGvRWJpXiy21O5No0U9tNt3rHcJ
+5TSLzkpyc4x/nBxzljqV2+i6HKZ5S8uoRpIxdtzoZJRtY5yRgDg01TfXTb8b/wCQnUXTU76isbVP
+E8OmzG3SC4uZFALrbR+b5W77vmcjBbsP/rVneKNdF34eubuzkeN1KKcExzQyCRFdHA5VhnBH9DQo
+SbXm0vvBzSv5I6qisC28aWlxLGjQ3MSSsqQzSQssMzOcIEbk/MORkDirut6/baDGjTbmaRgkcUY3
+yysSBhFyM4z/AJJApckrpW1Y+aNr3NKisKz8YWd3HdMUmiktUaSSCVBHP5arv3BS3T8fTOMjLbHx
+pZXsbz+XPFAkXmGeSPbCeVUorZO5wx24A5IOM0ezl2Dnj3N+isKy8XQ3UyQzWt1a+YdqNcReVG8h
+6IGyfmPOB3+tUtI8QzXOv6haPFcFAY0jyn7qHy1dmZzngSHlD/EMe1P2ctfJXFzrTzdjqqK5u08Q
+Wmnx3Mpa5dP7QeCRpSrLA7EDIO4BIFOMZ6ZrW1jVotFt/PlVmyyoqIA0kjucBUUkbj3x6UnBp27j
+Ula5eorAufGlpbyyIsNzKkTMk00cLNDCyHDh24Pyjk4B4ratrmO8ijmiO5JFV1OCMqwyDg89KTi1
+ugUk9mS1Ba/8hq2/69Lr/wBGWtT1Ba/8hq2/69Lr/wBGWtaYf+JH5/kRX/hy+X5nR0UUV6BwhRRR
+QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAZ17r9
+pp832eTzS4RXIjglmwjllUkxRsBkq3X0qH/hKbL+5df+Adz/APGaiP8AyGrr/r0tf/Rl3V6s5VHF
+2sZTquMmrFb/AISmy/uXX/gHc/8Axmj/AISmy/uXX/gHc/8AxmrNFT7V9ifbvsVv+Epsv7l1/wCA
+dz/8Zo/4Smy/uXX/AIB3P/xmrNFHtX2D277Fb/hKbL+5df8AgHc//GaP+Epsv7l1/wCAdz/8ZqzR
+R7V9g9u+xW/4Smy/uXX/AIB3P/xmj/hKbL+5df8AgHc//Gas0Ue1fYPbvsVv+Epsv7l1/wCAdz/8
+ZrzX4g6HHr+rW93ZRXW2faly32O4/dbCqiXDoN3yfwqP4fU16nRR7V9g9u+xQtNf06xhjt4Y7pUi
+RUQfY7o4RBtUZMOelTf8JTZf3Lr/AMA7n/4zVmij2r7B7d9it/wlNl/cuv8AwDuf/jNH/CU2X9y6
+/wDAO5/+M1Zoo9q+we3fYrf8JTZf3Lr/AMA7n/4zR/wlNl/cuv8AwDuf/jNWaKPavsHt32K3/CU2
+X9y6/wDAO5/+M0f8JTZf3Lr/AMA7n/4zVmij2r7B7d9it/wlNl/cuv8AwDuf/jNH/CU2X9y6/wDA
+O5/+M1Zoo9q+we3fYpy+LtPgRpJBcqqgszNZ3IVVHJJJh4ArarnfFH/II1D/AK9Z/wD0W1dFVwlz
+GlOfOmFFFFWWFFFFAHCWX/Lx/wBfd3/6US1ZqtZf8vH/AF93f/pRLVmvXpfw4f4V+R0x+FegVymk
+m88JRNay2TzRK7bJrcBnk3cjfFnd04LewHPWunuIEuonikGVdSrDOMqwwRxXP2j61okSWgtEu1jG
+1JVlWH92OFVlcfeAHb9Tk1NTdPVWvqlf8AluistxDb211e6Q7KY5I5J7UqsYRYhiSPYy/ISPvMM5
+K4FaWtas5t7VbGTD3ckaxuF3MsbfO0nlsOQF69MZ7U7w/p11A9xeXoRZ7kxlljJKIsaBVHP8XXPJ
+HpWL4a0v/ibTlWL21kZI4AdyiOSU7nVc/e25ZWJPPyn0xHvJJbc+na2u/wBxOunmFjrd5q0jMupR
+W0ofAs5YgMMGKrGZGwzbsfNt5Geg4FWHt7yXxIrC4EZ+yI7KEDjyxIA8IY46tk78Z9qbrlhqOqq9
+vJptvI5wi3e8KFTdkMEOZF2g8jcec/eHBsx6VeaVqFnLDEJ41tEtXbcIymxwTJtbOeOw/wD1q0no
++Z2knf3vy/y0DXz38ytr3icw30lmLxbNYlQlzCZ3d2G7ao5XbtIyTg59qrnxbcTaVfvFMry2zRBZ
+kj2rIkjKoYpJ/Fw24Yx6Vq31jf6Zfvf2CC4W4CrNCzLGcxrhHRz+o/ysOq6fquqaVdpMqmWZozFC
+jLtiRWRtpchct13HJH92iXtLz1lf3tk/lrewO+u/UjvrjWtGeCSS4hn+0SCHyinlpFLL9wqy5ZlU
+jnPOPc5Fi3uNR0rUbe0u7hblLlX2tsETxvENx4XggjHf8sc2/ENjNffYvJXd5V5DK/IGI03bjyRR
+qVjNcanp1wi5SHz/ADDkfL5iBV4Jycn0qnGSbs5aSjbVvfcdmu+6Neiiityi14X/AOQlff8AXva/
++h3NdRXL+F/+Qlff9e9r/wCh3NdRXlYj+LL1OefxMKKKKyJCiiigAooooAKKKzPE8z2+k38kbFWW
+1mZWU7WVljYggjoRQBp0Vyv9jxf89rv/AMDLn/49R/Y8X/Pa7/8AAy5/+PVz/WodpG/1afeJ1VFc
+r/Y8X/Pa7/8AAy5/+PUf2PF/z2u//Ay5/wDj1H1qHaQfVp94nVUVyv8AY8X/AD2u/wDwMuf/AI9R
+/Y8X/Pa7/wDAy5/+PUfWodpB9Wn3idVRXK/2PF/z2u//AAMuf/j1H9jxf89rv/wMuf8A49R9ah2k
+H1afeJ1VFcr/AGPF/wA9rv8A8DLn/wCPUf2PF/z2u/8AwMuf/j1H1qHaQfVp94nVUVyv9jxf89rv
+/wADLn/49Ve8s/sPkSxT3W77Var811O6lXnjRgVeQqQVJHIpxxMJNJJ6uwnh5RTd1odlRRRW5iFF
+FFAGfrmkLrVt5O/y3V0lhl2q5hmiO5HAYY6jBHcEjvVfQ9ce8d7K9QQ3kIBkjB+SROgmhJ+9G35q
+flbnrsVn6vodtrSp529Xj3eVNE5imhLqVJR1wenUHIPcGgDQormr+91Tw1F5s1zaXMX7wL9oYWMz
+PndGnmDdE7bcj7kfQH1o03x3bakx22d8qDdiYW5nhco20hHtjKG5zyOOOtAHS1zEH/H/AKp/18p/
+6TW9dDa3KXkSyoHAbOA6NE/Bxykiqw/EVz0H/H/qn/Xyn/pNb1hif4fzRth/j+RbrnfFET2lzp+q
+BS6WjyCUAfdhnXY8vGTiPGSAD+GK6KiuKL5Xf+tTrkrqxiXPjPR7e2Nz9ricBQwRGBlbPRRHndn6
+4x3xWPr906y6Lq19alIojIZlA837O0yqIi4KqcqcE/LwRgZOM9LbaHp9nIJYbSCN1zhkiRWGRg4I
+GelW5YkmRkdQysCGUjKsp4IIParUoxeif/DkuMpLVr/hjkfEGoWmvX2mW1iVuJYrmO4d49rrFAh+
+fdIDgZOOPYd9ucnT/wDkA+H/APsJx/8Ao2au+s9NtNO3fZoIot2N3loqbsdM7QM4zQum2iRxxCCI
+JEweNQi7UcEncoxgHJPIpqokkknZP/P/ADE6bbbb1f8AwP8AI5XU7hpNXu4TfJpsYSAOxWJZbxWD
+ZdJX2sCg+QEbsH8qwlaN/C2smKRpUN8Ssjkl3XfBhmyAckcnivRbvSLK/cPcW0MrAYDSRq7BeuMs
+DxzTpdNtJ/N8yCJvN2+ZuRT5mz7u/I+bb2z0pqqlbTbl/AHTbvrvf8Tl/GGt2OtaQ1rZ3MUsty0K
+RRq43szSIwDL1XgfxYx0PNSaxPFpHiK2vrxNsD232dJiAUjn3s3zH+DKkjPue27HSQabaW0rzxQR
+JI+dzqiq7bjk7mAycnmpLm2ivIzFNGsiNjKuoZTg5GQeOtSppaJO2vrqNwb1bV9PwOD8VXdvrl6X
+sQJRaWV2Z5kwYwssLiNPM/iOc8D1P+1jXu5zbeEo5BCJiLKHClQ6j5U+cqysCE+/yO1dDBptpbRP
+BFBEkb53IqKqNuGDuUDByOKk+zReV5Hlr5e3Zs2jZsxjbt6Yxxim6i91W0iwUH7zvrJHnuqOj3el
+mTWPt0xvoMJHsWFY1b7xjiyN+T94nJBxjit/RrmKLxFrETyKryfZdilgGfbES20dTgdcVtR6Hp8U
+bxJaQKkmN6iJAr7Tldwxg4PTNTvY28ky3DQoZVGFkKgyKvPAbGQOT+dDqJq1ulvxuJQad/O/6HL6
+DpyatZ65avjEt/dLkru2sQu1seqnkVW0K4m8R3llDOpH9mI32kM3m7rvLQpuz1YbDIHG7GcZzzXZ
+wW0Vtv8AKjVN7F22qF3O3Vmx1J9ackSRliqgFjliBjc2AuT6nAA/Cl7TfTfby6D9ntr6+fU800C1
+s7O1kt7/AFS9sZ7YsJIBOIk5JcGJcHcCP7ucn2Iz2/hS2gtdLtkthKIipdBKVMm2Ri4LeX8vO7I9
+uvNXp9NtLmVJ5YInkTG12RWddpyNrEZGDzVmidTn+buEKfJ91gqC1/5DVt/16XX/AKMtanrmdb8G
+WfinWLdbl5Vzayn92VH+pki2/eRv+ezZ/Cqw/wDEXz/IVf8Ahv5HoVFef/8ACldF/wCe93/33H/8
+ao/4Urov/Pe7/wC+4/8A41XecJ6BRXn/APwpXRf+e93/AN9x/wDxqj/hSui/897v/vuP/wCNUAeg
+UV5//wAKV0X/AJ73f/fcf/xqj/hSui/897v/AL7j/wDjVAHoFFef/wDCldF/573f/fcf/wAao/4U
+rov/AD3u/wDvuP8A+NUAegUV5/8A8KV0X/nvd/8Afcf/AMao/wCFK6L/AM97v/vuP/41QB6BRXn/
+APwpXRf+e93/AN9x/wDxqj/hSui/897v/vuP/wCNUAegUV5//wAKV0X/AJ73f/fcf/xqj/hSui/8
+97v/AL7j/wDjVAHoFFef/wDCldF/573f/fcf/wAao/4Urov/AD3u/wDvuP8A+NUAegUV5/8A8KV0
+X/nvd/8Afcf/AMao/wCFK6L/AM97v/vuP/41QB6BRXn/APwpXRf+e93/AN9x/wDxqj/hSui/897v
+/vuP/wCNUAegUV5//wAKV0X/AJ73f/fcf/xqj/hSui/897v/AL7j/wDjVAHoFFef/wDCldF/573f
+/fcf/wAao/4Urov/AD3u/wDvuP8A+NUAegUV5/8A8KV0X/nvd/8Afcf/AMao/wCFK6L/AM97v/vu
+P/41QB6BRXn/APwpXRf+e93/AN9x/wDxqj/hSui/897v/vuP/wCNUAegVxlr8UdMOoXGn3gNs0U8
+kSyMd0T7H2AlgBsJ5PI2gDlqpf8ACldF/wCe93/33H/8arjbX4U6nqOoXEUaGC2jnkRZp+GeNHwC
+qgAuSpyDgKf7woA9TimS41a4kjYMrWdoysp3KytJdEEEdQa0a5vw34atPCt/dWlpvKm3tnZnO52d
+pLoZOAB0AHAHT1rpK56nxM5avxspPrFpHerp7SgTvH5iocgsmSODjBPB4znjPSrUsqQI0kjBVUFm
+ZjhVUckknoBXN+Oo5rSG21a2TfLYS+YRzlrdxsmUfKw5GMsR8oBIo8bX8k+nxWdgyPLqLrDGQQw8
+lxukkwA2U2feYdA27NK17CUb28zd0zU7fWLdLq1ffE+drYK52kqeGAPUVLdXMdlDJPK21I0Z3OCc
+Kg3E4HPSua1e8u4Lm10DRwIWEKyNM+HWC1jPljar53txjn+u5czV9S1TRo7zTNTkF0t1aXLW9wqL
+EwaKFmkjkjXoB2PPXvn5Xy3BRv8A5dbHcWtzHewxzxNuSRFdDgjKuNwODz0qWuO07U7i1Phi1jfE
+Vxav5q4B3eVboyckZGD6Vp/2ncf8JH9h3/ufsHnbMD/W+ds3bsZ+72zik4g4m9RXnWm6h4lvdEGs
+/wBoRYiSSTyTAuJkhZi3mOACrEAgBQOAOQSTVrUNY1ywsY9fNxE0DeXI1l5YAWCbCqBPjeX+ZSeA
+M57DaXyea7D5Htddvmd3RXHeM/FraVeQ2CXSWYeIyyXDQtOVG7aixouQWJVt24Yx0OaPBni1tVvJ
+rB7pLwJEJY7hYWgLDdtdZEbADAsu3aMY6nNLldri5Ha50l5rFpp89vbzyhJLgssQOcOy4yN2MA8j
+GTz0FXawfGunTahprtbDNxbulxB1JEsJ3cKAdzFdwAIIJNQar4pI0BdRtQDLcRosKKwdvPmwuxfl
+O9kJPy7edpGBRa9rBy3St6F+z8V6XfyxwwXAdpJJY02qxVngUPJhtu3AVgc5we2a1q5C0SfwzceH
+9JiYLG8dwJ1X5lkkjjEhIZxuA3knjH9KydW8cNPfXUA1VNPS3laJR9la4llKYV2c/MoUMDtxyR94
+dKfLfYfJd6HotFcPpfjC91RNPvAQYhdyWl0IYzsd5MC3kTzPmWMFlySVOTjB6VesPFEtzr0to0kZ
+tmMsEICt5n2m1WN5snHT94w9Pk4/2lysXI0dVRXDy+ML3TtGbUpiM3V2RaedGQsVs5ynnLHhsbEY
+5XcTletUtJ8cNBfWsB1VNQS4lWJh9la3liL5VGQ/KpUsRuzyB90dafIx8j1PRaK47Qp9b1u8u3+3
+JHb2t/LEEEKu8scbDMbNxtULgBhluTnoK7GpasS1Yy/FH/II1D/r1n/9FtXRVzHjGf7Pot+2x3zb
+yLhBuPzjZu+i5yx7AE1H/wAJ9/1BtW/8Bf8A7OtqWzNqGzOrorlP+E+/6g2rf+Av/wBnR/wn3/UG
+1b/wF/8As60Njq6K4/8A4WTD532f+y9T83Z5nl/Zh5nl5279vmZ254zRQBUsv+Xj/r7u/wD0olqz
+Vay/5eP+vu7/APSiWrNevS/hw/wr8jpj8K9Aoooqxle+sYdSha3uF3I2MjJXO0hhypB6im6dpttp
+MQhtowiZJwMnJPck5J/Gqmq3rNc21hCxDTEtIVGSkCD5uQwKbzhFb645Ap2p6/Dpsog8uaaUqH8u
+GMyOI8kbz0GMjHWobim27aaX/QV1uadFU9M1SHVojJDuG1ijqylHSQAFkYHuM80anqkOkxCSbcdz
+BEVVLu8hBKooHc44quZWvfTuO63LlFYlp4rt7q6itDBcRSy7iFlj2EKq7tx56HBAxnkVt0oyUtnc
+E09goooqgCiiigC14X/5CV9/172v/odzXUVy/hf/AJCV9/172v8A6Hc11FeViP4svU55/EwooorI
+kKKKKACiiigArK8Wf8gXUv8Ar0n/APRbVq1leLP+QLqX/XpP/wCi2oAgoorhfCmgy67pkF5NqeoK
+8m/IS4IX5XZBjIJ6D1rzIxTTbdrW/E9FyaaSV7ndUVzPhK6mS61HTnuTcpavH5crndL+9DMyO2eS
+hGPrn2AJviBp8TyFYriSGNxG9zHHvtlY4B+cHoN3pz2zkZfs5XaWv/BFzq13p/wDpqK5XxLro03U
+NImWR2hkFwSsJL+flF8oBV4clmG361p6T4lt9Wla38qeCYKX8qeMxuYwQu8dRjJx1zScGknbQFNX
+aNeiud1HxvZ2E00KQ3Fx5AzM0EYkji65DtuGCMc/4g4oa14u8u/0prQTz28iyysIE3+f8rIqr0JM
+ZyXU9OM8jhqnJ9AdSK6nY0UVw8uu3mmeIbxnkJsle2ilViSsPnx/JIM4VFDj5znv0JxhRg53t0Vx
+yko2v1djuKo6x/qof+vuz/8ASmGs7WbmWLWtHiSRlST7VvUMQr7YwV3DocHpmtHWP9VD/wBfdn/6
+Uw1UFacH3af4kzd4z8k/yOqooor0TgCiiigArnE1O88SyuumyiC0jO1rvYJHndWG9bYN8m0AFTIw
+YE/dBxmpvFO++FvpUchT7aZFlZU3stoiEzEE/KpYlI9zdN/AJrahhS3RY41CqoCqqjaqqvAAA6AU
+AZumeGLDS3EyxeZOMZuJj51yx2iPJlfLDKjoMD0FatFFABXMQf8AH/qn/Xyn/pNb109cxB/x/wCq
+f9fKf+k1vWGJ/h/NG2H+P5FuiiiuE7AooooAKKKKAOS07xbq+rW6XNto++N87W+1RrnaSp4ZQeor
+W0DX/wC2fPilga3uLdgssTHdt3Z2Mr4AYMB/kYJ4/wAPX2v6Z4fS5tUs3t4llcB/M87aruXJ+ZV4
+5PXp71taOstjp+oa208VxPcRNNmMHyAIEby0AO1uOjZwe3UEnecIrmsktbKzf4mUJt2u3td3t+B1
+tZv9sf8AE1/s3y/+Xb7R5m7/AG/L27cfjnNc3p/gm31ixS+uJpWvbhUnFyGKtE7BWQKikLheB/Lb
+xjL0aMeNNQtX1HLbtOYyKhMay+XcvGN+3HHAbAx8wHbipVOOrve2+nUbnLTS19tT0qiuX0e3XQtb
+k0y2LC3azWdY2dnETrIUIj3E4DZy3vWbofhu38Z2h1TVGaWW43BNpKLbIjMgWMA468/Nn6ZyWXIl
+q3pp011HzvZLXXr2OqvdXSyvLOzKEtdGXBzhVWFN5J9+gA/ydCvL4LJdc1OxttS/0gxT3lo0hLI0
+0dqivGWw3UM55HJ75r1CipBQ5V1tr94Qk5X9f0CiiisywooooAKgtf8AkNW3/Xpdf+jLWp6gtf8A
+kNW3/Xpdf+jLWtcP/Ej8/wAjOv8Aw5fL8zo6KKK9A4QooooAKKKKACiiigAooooAKKKKACiiigAo
+oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMM/8hq6/wCvS1/9GXdXqon/AJDV1/16Wv8A
+6Mu6vVz1PiZy1fjZFdW0d7DJBKu5JEZHGSMq42kZHPSuO8K6Dq6Xlq2qRoI9Pt3ht2Dqd7u23zFC
+AHb5QC4f2OMk47aiknZWJUrJo5rxDpN/Dfw6xpgEsqRiCW3cqqzQFt3yufusCc//AKtrZl7omseJ
+muLy+hFuYba4itLVXSRmkniKM8ko4wc4A4/DGW7iihSaGpNHHXeh6lb22iXVrEklxp8QR7dmC+YJ
+I0ikCyZ2hlxx2784wZdHtNXutdbUr60S3jNkYVVZFlKkShtrkdWPLZAxjA65rrKKOYObyOT0XQ7y
+08KPp0sWLg29ygTcp+aUybBuB287h3o1rQ7y78KJp0UWbgW9shTco+aIx7xuJ28bT3rrKKOZ3v53
+Dmd7+dzmvEOk38N/DrGmASypGIJbdyqrNAW3fK5+6wJz/wDq2tc0RtXuppLjUES3jKKsVsrrKVIJ
+3vI4Tljxt2tjHUZ5rZoovpYXNpYK4TTfDGpQ31vZSxINOs7qa5hPmA5DfNAgA/ebo2ZidxweeoC5
+7uihOwKVrmDq+mXF1rOk3UaZit/tPmtkDb5sYVOCcnJ9KzvsOseGL25fT7cXttdyPOYzIkEkE7kb
+vnb7yt247dsZbr6KOYfMc/caJe6to1zZ6jJHJPMJCNuVhjfO6EKVVW2qQp+bceuciudu/Ceo3OmQ
+SJaxrfy3N00+ZP3caXyyRSNw5GAvl4xk8dD82fQqKFJoFNr7zB1/wz/aGnwW1nJ5D2jxyWxPzKrw
+DbGH3biVx9fXnoYNOufEWpS24uraOyjjIaciRJXuPlPyxrtcIu772Tux91utdLRRcXNpYwfCmmXG
+m/2j9oTb51/PNHyDuik27W+UnGcdDzW9RRSbuDd9TL8Uf8gjUP8Ar1n/APRbV0Vc74o/5BGof9es
+/wD6LauirWlszahswooorU2OU/5nP/uE/wDtxRR/zOf/AHCf/biigDPsv+Xj/r7u/wD0olqzVay/
+5eP+vu7/APSiWrNevS/hw/wr8jpj8K9AoooqxmC/7vxGjNwHsSqE8BnWXcVX1IHJHpWRqFtFFrdz
+9ruri0W4WNopI5BFHJ5aBXDtzyO2f6jPUalp5uzDLGQssD70JA5yNrxk4YhXU4JHTg84xU9zZwXq
+hJ4kkUHIDqHGfXDVjKm5XX97mRLjf77mH4aSxt2vriC4mlXcqyTzurIxiUk7W4OFDck8enFR+JJo
+Y73Sb2Ta0CyOpfKlA0yjy25PQY3bu2M+ldF9ni8rydi7Nu3ZgbNmMbdvTGO1UNUsbt4kSxeFVVSp
+hlj3QyowChTt5UKM8Dr0PFNwahZdNdO97g1pYyr3U7W/1zS1t5kkKC4LbCGA3x8cjj+E8V0iXEUj
+vGrqWTG9QQWXdyNw7Z7Vh6T4fniuY7m6FsnlBxHFbIUjDSBQ0hJwSxUbcEY6VuJbxRu8iooZ8b2A
+AZtvA3HvjtTpqWratzSv8rWHG+t+4QXEV0gkidXU5wykMpxxwRUlVdNsV02BYVxgFm4G1cuxchV7
+Lk8DsO5q1Vq9lfcYUUUUwMHVfGT+Dri6kjtjK0sNuqseIo2BuiN5HUnsvGQG5GKwPD/xC1a+12C4
+unuJ0/ef6NbKSCCjlQsQIDbSc5bJwOpxXonhyFLi/wBQjkUMrW1srKw3Kys10CCD1Bqaz+Huk6dq
+keqWqPC6b/3aMPJJkDKx2kEjhuApAGBxXlYj+LL1OefxMh/4T7/qDat/4C//AGdH/Cff9QbVv/AX
+/wCzrq6KyJOU/wCE+/6g2rf+Av8A9nR/wn3/AFBtW/8AAX/7OurooA5T/hPv+oNq3/gL/wDZ0f8A
+Cff9QbVv/AX/AOzrq6KAPOvGfjqabSLhbex1O0c+Xid4TAkf7xM5kV8jI4/HFc1Z/FO/1Cwu9Pvo
+ftBlt51EsY2yLmOQlnRRtKjjJG3aoJO6vWtf0SHxFYy2Nwzqku3JQgP8jK4xuDDqvpWVqegWHh/Q
+dSisbdIgbSfJHLthHI3O2WbGTjJ47UAWa848PeB7DXfD6TCPbcyLLtl3sBvV3CZHK44APy9PevR6
+itraKzjEUMaxoucKihVGTk4A4615sZuCdtHdP7j0JQUmr66P8Tk9B8q+0K+sLW2WC4jWeGWFXDfv
+2Uru3MxOGPALHtjJC5o0fxPo9hoixXBVDBF5U1sygStIo2yL5R+9vY9enPzY+bHWR20UUjypGqvJ
+jewUBn2jC7j1OB0zUMmkWUs32h7aFpcg+YY1Mm5fundjORjinzxd7p2bvuLkatZra2xwdh/xT3/C
+Nfb/ANxt+2bt/GzzvubvT74znp3xzW7dX1vrOv6X9jmSb7OlzJKY2DKiSKsa8g4zu7Dnv0ro7ixt
+7sqZoUkKhgC6hsLINrgZHRhwfWi0sbewQpbwpEpOSsahFLdM4UDnim6ietvetJeXvX/zEqbWl9Lr
+10t/kch4M1ix8P6c9lestrcWzOZkkwrOWJZWTH+s+XAGMngdtucfRnjsL/TruVRbQTXWoTReZtiV
+YJIo1j4zhR2H6cYr0O70iyv3D3FtDKwGA0kauwXrjLA8c1Jd2NvfoEuIUlUHIWRQ6humcMDzzT9q
+rt2fvb/8APZuyV17uxPXL6ZbR3ms6/DKNySLaowyRlWhYEZHPSuoqKO2iikeVI1V5Mb2CgM+0YXc
+epwOmazjKyfmv1uW1e3k/wBDhreWS117StLlVs2f2lUkOMS27xfuTwq8qq7G46r1NdhrH+qh/wCv
+uz/9KYasyW0UsiSvGrPHnYxUFk3DDbT1GR1xVbWP9VD/ANfdn/6Uw1alzThpazX5kOPLCeu6f5HV
+UUUV6BwhRRRQBlXP/Ias/wDr0u//AEZaVq1lXP8AyGrP/r0u/wD0ZaVq0AFFFFABXMQf8f8Aqn/X
+yn/pNb109cxB/wAf+qf9fKf+k1vWGJ/h/NG2H+P5FuiiiuE7AooooAKKKKAM3w7o/wDYFhDZeZ5n
+l7vn27M72Z+mT6+tQaP4bj0c3kasHt7ly4gKKFj3jEi8feVuABjgDHrWzRVcz11+LcXKtPLY5JvA
+9xHHJZ2+pSxWUjEm3CBmVGILosrNuAPPbvzu5zPc+DCl1Fc6ddGz8m3EEapGHX75cl9x+cHceD/F
+hs5rpqKftZd/wQvZx7fiZGj6E2nyyXVzcNc3EiqjSMqoFRCSFjVR8gOfmGeSM1nTeDbi2kn/ALLv
+2sop+XiWMSKHIwWjJYFMj+7+eAAOoopc8k73/DT7g5I2sczN4Ijt47MabObWS1MhWTYs2/zlCyM4
+bGWOBz26Y6Y6aiik5OW41FR2CiiikMKKKKACoLX/AJDVt/16XX/oy1qeoLX/AJDVt/16XX/oy1rX
+D/xI/P8AIzr/AMOXy/M6OiiivQOEKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
+KKKKACiiigAooooAKKKKACiiigDnL66Fhq08kkU5WS1t1Vo4JZlLJJclhmJGwRuXr60/+37f/nld
+/wDgFc//ABmugoqHTUnfUzlSUnd3Of8A7ft/+eV3/wCAVz/8Zo/t+3/55Xf/AIBXP/xmugopeyj5
+i9jHuzn/AO37f/nld/8AgFc//GaP7ft/+eV3/wCAVz/8ZroKKPZR8w9jHuzn/wC37f8A55Xf/gFc
+/wDxmj+37f8A55Xf/gFc/wDxmugoo9lHzD2Me7Of/t+3/wCeV3/4BXP/AMZo/t+3/wCeV3/4BXP/
+AMZroKKPZR8w9jHuzn/7ft/+eV3/AOAVz/8AGaP7ft/+eV3/AOAVz/8AGa6Cij2UfMPYx7s5/wDt
++3/55Xf/AIBXP/xmj+37f/nld/8AgFc//Ga6Cij2UfMPYx7s5/8At+3/AOeV3/4BXP8A8Zo/t+3/
+AOeV3/4BXP8A8ZroKKPZR8w9jHuzn/7ft/8Anld/+AVz/wDGaP7ft/8Anld/+AVz/wDGa6Cij2Uf
+MPYx7s5/+37f/nld/wDgFc//ABmj+37f/nld/wDgFc//ABmugoo9lHzD2Me7Of8A7ft/+eV3/wCA
+Vz/8Zo/t+3/55Xf/AIBXP/xmugoo9lHzD2Me7OQ17VUvdNvIIoLtnkt5UQfY7kZZ0YAZMWOtdfRR
+VRio7FwgobBRRRVFHKf8zn/3Cf8A24oo/wCZz/7hP/txRQBn2X/Lx/193f8A6US1ZqtZf8vH/X3d
+/wDpRLVmvXpfw4f4V+R0x+Feg2SRYlZ3YKqgkknAAHUk1kTa+r31jBbPFLHOZg7Kd+0xIHABVsd+
+c1B4hjW81HS7SZQ8TvM7IRwzRJlM/TJ46HvVe90y1sNc0treFIy4uA2wBQdkfHA4/iPNTOcr6bKU
+U++tv8xNv8Ubz6paRS+Q1xEJMgbC6h8t0G3Oec8VUvtUnsdQtYWVPs84ZN5yGSYZYAn7vzdFHUnP
+pXKNbtdadcPa2MLRBZ2+2XDLJNMil9zDCK4fupbpity+sZNX0CBgzmZIIp42G5pPORA3GDks3I/H
+PWp9pKSdlsuZefkHM3+ZtanfLplrNctjEaFsE7dxA4XP+0eBVLSb2+uHiW7Nupa38xol3LOrs3Hy
+N0ULgH/arM1K7TxONNtV+5cfv5gj7tscQ5jfbjhn+Xdxhh61c/5mT/uH/wDtanztyun7t0vv1C+p
+pLq9ixRRcwkyfcAkXL5O35eeeRjjvVqSRYlZ3YKqgkknAAHUk1w+k6LZTeGZJ3gQyGKd95Hz7oy2
+3DdRjaOBx+Zq7N/xMToFvcfvEljMsgb5t8kcKspYnk8sc+vfNCqysm0tVFr/ALedgUnb7vxOhbUI
+ri2lmtZoW2q2HLholdRn52U8Ad/aoJ9Teyt7a4lMbI2xZnQ/IplwBIrM33Nx+uDntznanpNhp0eo
+PbsI5JLKTdAjBUKhSBJ5Y/LPTr3JqR41l8NYZQR9gBwRnlYtwP4EZFNylqnuot6eQXf4HQUVS0SR
+pdPtHdizNBESSckkoMkmrtaJ3SZRa8L/APISvv8Ar3tf/Q7muorl/C//ACEr7/r3tf8A0O5rqK8v
+EfxZepzz+JhRRRWRIUUUUAFFFFABWV4s/wCQLqX/AF6T/wDotq1ahu7WK+hkt5l3JKjI4yRlHG1h
+kc9KAMmin/8ACJWHrc/+Blz/APHqP+ESsPW5/wDAy5/+PVx/VJfzI6vrS7MZRT/+ESsPW5/8DLn/
+AOPUf8IlYetz/wCBlz/8eo+qS/mQfWl2Yyin/wDCJWHrc/8AgZc//HqP+ESsPW5/8DLn/wCPUfVJ
+fzIPrS7MZRT/APhErD1uf/Ay5/8Aj1H/AAiVh63P/gZc/wDx6j6pL+ZB9aXZjKKf/wAIlYetz/4G
+XP8A8eo/4RKw9bn/AMDLn/49R9Ul/Mg+tLsxlUdY/wBVD/192f8A6Uw1o/8ACJWHrc/+Blz/APHq
+VPCenq6OROxR1dQ91cOu+Ng6kq8pBwQDyKqOGcZJ3WjTFLEKUWrPVGxRRRXUcwUUUUAZVz/yGrP/
+AK9Lv/0ZaVq1lXP/ACGrP/r0u/8A0ZaVq0AFFFFABXMQf8f+qf8AXyn/AKTW9dPXMQf8f+qf9fKf
++k1vWGJ/h/NG2H+P5FuiiiuE7AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACoLX/kNW
+3/Xpdf8Aoy1qeoLX/kNW3/Xpdf8Aoy1rXD/xI/P8jOv/AA5fL8zo6KKK9A4QooooAKKKKACiiigA
+ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
+iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlP8Amc/+4T/7cUUf8zn/ANwn
+/wBuKKAM+y/5eP8Ar7u//SiWrNVrL/l4/wCvu7/9KJas169L+HD/AAr8jpj8K9Clqmj22rqomU7k
+O6N1JWSNv7ysPz9OBVG08KW9rdRXZnuJZYtwDSybyVZdu08dBkkYxya26KbhFu7Wo7IwT4NtGLK0
+1wYWZm+z+ZttxuJbARAuADyOa1rCzGn28durMwjUKpbG7avQHaFHA46VYoojCMXdKwJJGRpHhi00
+WZ5oTISVKKHbcscZbeUT2z65/nm3/ZkX277dlt/k+TjI2bN2/PTOc+9XKKFCKVkttQskZ1rocFpp
+505WcxlHTJI34l3Z5xj+LjiifQra5tIbR9+2EJ5bhisiNGu1XBXHzD6Y9q0aKOSNrW6W+QWRjWvh
+a1to7lS8sj3CGN5pGDzbCu3aGx/T69BRqWms9lDpkG/awSN33bSkEe3edwXBZgNu3vn0BrZopezj
+ayVugrIbHGsSqiKFVQAABgADoAKdRRVjLXhf/kJX3/Xva/8AodzXUVy/hf8A5CV9/wBe9r/6Hc11
+FeViP4svU55/EwooorIkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
+igDKuf8AkNWf/Xpd/wDoy0rVrKuf+Q1Z/wDXpd/+jLStWgAooooAK5iD/j/1T/r5T/0mt66euYg/
+4/8AVP8Ar5T/ANJresMT/D+aNsP8fyLdFFFcJ2BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
+UUUUAFQWv/Iatv8Ar0uv/RlrU9QWv/Iatv8Ar0uv/RlrWuH/AIkfn+RnX/hy+X5nR0UUV6BwhRRR
+QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
+BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHKf8zn/3Cf8A
+24oo/wCZz/7hP/txRQBn2X/Lx/193f8A6US1ZqtZf8vH/X3d/wDpRLVmvXpfw4f4V+R0x+FegUUU
+VYwooooAKKKKACiiigAooooAKKKKALXhf/kJX3/Xva/+h3NdRXL+F/8AkJX3/Xva/wDodzXUV5WI
+/iy9Tnn8TCiiisiQooooAKKKKACq+o3qabaz3UgJWGN5GC/eKxqWOM454qxWV4s/5Aupf9ek/wD6
+LagBv9u3P/QLu/8Avq2/+SaP7duf+gXd/wDfVt/8k1fory/7Qq9ofc/8y+VFD+3bn/oF3f8A31bf
+/JNH9u3P/QLu/wDvq2/+Sav0Uf2hV7Q+5/5hyoof27c/9Au7/wC+rb/5Jo/t25/6Bd3/AN9W3/yT
+V+ij+0KvaH3P/MOVFD+3bn/oF3f/AH1bf/JNH9u3P/QLu/8Avq2/+Sav0Uf2hV7Q+5/5hyoof27c
+/wDQLu/++rb/AOSaP7duf+gXd/8AfVt/8k1foo/tCr2h9z/zDlRQ/t25/wCgXd/99W3/AMk0x/Eb
+wlPO0+6jV5I497G3Kq0zrGuQlwzY3MOgNaVZniH/AI9ov+vuy/8ASmGrp46pOcYtR1kl16/MHFG3
+RRRXokBRRRQBlXP/ACGrP/r0u/8A0ZaVq1lXP/Ias/8Ar0u//RlpWrQAUUUUAFcxB/x/6p/18p/6
+TW9dPXMQf8f+qf8AXyn/AKTW9YYn+H80bYf4/kW6KKK4TsCiiigAooooAKKKKACiiigAooooAKKK
+KACiiigAooooAKgtf+Q1bf8AXpdf+jLWp6gtf+Q1bf8AXpdf+jLWtcP/ABI/P8jOv/Dl8vzOjooo
+r0DhCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
+ooAKKo3uuafpriO6u4IWI3BZJUjYr0zhiOOKg/4SzRf+glaf9/4//iqANWisr/hLNF/6CVp/3/j/
+APiqP+Es0X/oJWn/AH/j/wDiqANWisr/AISzRf8AoJWn/f8Aj/8AiqP+Es0X/oJWn/f+P/4qgDVo
+rK/4SzRf+glaf9/4/wD4qj/hLNF/6CVp/wB/4/8A4qgDVorK/wCEs0X/AKCVp/3/AI//AIqj/hLN
+F/6CVp/3/j/+KoA1aKyv+Es0X/oJWn/f+P8A+Ko/4SzRf+glaf8Af+P/AOKoA1aKyv8AhLNF/wCg
+laf9/wCP/wCKo/4SzRf+glaf9/4//iqANWisr/hLNF/6CVp/3/j/APiqP+Es0X/oJWn/AH/j/wDi
+qANWisr/AISzRf8AoJWn/f8Aj/8AiqP+Es0X/oJWn/f+P/4qgDVorK/4SzRf+glaf9/4/wD4qj/h
+LNF/6CVp/wB/4/8A4qgDVorK/wCEs0X/AKCVp/3/AI//AIqnQ+J9JuHWOO/tWZiFVVmjZmZuAAA3
+JNAGnRRRQAUUUUAcp/zOf/cJ/wDbiij/AJnP/uE/+3FFAGfZf8vH/X3d/wDpRLVmq1l/y8f9fd3/
+AOlEtWa9el/Dh/hX5HTH4V6BRRRVjCiiigAooooAKKKKACiiigAooooAteF/+Qlff9e9r/6Hc11F
+cv4X/wCQlff9e9r/AOh3NdRXlYj+LL1OefxMKKKKyJCiiigAooooAKyvFn/IF1L/AK9J/wD0W1S6
+/rcPh2xlvrhXZItuQgBf52VBjcVHVvWsrU9fsPEGg6lLY3CSgWk+QOHXKOBuRsMucHGRz2oA3ayt
+c8T6d4c8r7fN5Xm7tnyO+7Zjd9xW/vCtWuM8aX/9ma1odx5Ms2z7Z+7hXzJW3RovyrkZxnJ9q8Ol
+BTlZ32b002VzRmvpPjbRtcnFtaXQeQgkKVdCwXrjeq5PfA5xz2rcrz/V9ZTxJqGkRPY3NoI7xZPP
+uofKG5FLrChJ6ylQPvDkDhq6Hwlqdzqf9pfaH3+TqE8MfAXbFHt2r8oGcZ6nmqqUuVcyutNU3frb
+dAma9/fwaXBJc3MgjjjGWY9AP6k9AByTwKJ7+C2mhgkkAknLCNf4nKKXbA9AByenTuRXnes397rn
+gVbyefLlwZTsX96qzmNV+UALg7TkD+HHc1a17S9WGr6HCdTzMUugs32dPlZVLM3l5wdyFUx227up
+qlQW0pJNOae/2FfsFz0KiuU1LUtU1rVJdL0uUWq2oRrm5ZFlYtKu6OOONuoPc8dO2PnxdY8VazoF
+pqFjcyA3UEaTwXSKm2W3edIvnjIIVhux0/kGaY0JSsk43dtOtn1C56LRXGXF3rvh26sZr27iuYru
+4S3eFYhEIHn5UxPyzKuD97qO2TlX+MPEU9jf29gt4NPjkj8wXTQ+eskm7Z5PzfKoAO5mJ446DqlR
+baSad03dX6fK4XOwrM8Q/wDHtF/192X/AKUw1H4bkvHgY3F3BeJn91cxYUyr/EHRMoCrZAKscjqA
+RzJ4h/49ov8Ar7sv/SmGnSXLWgv78fzB7G3RRRXtGYUUUUAZVz/yGrP/AK9Lv/0ZaVq1lXP/ACGr
+P/r0u/8A0ZaVq0AFFFFABXMQf8f+qf8AXyn/AKTW9dPXMQf8f+qf9fKf+k1vWGJ/h/NG2H+P5Fui
+iiuE7AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACoLX/kNW3/Xpdf8Aoy1qeoLX/kNW
+3/Xpdf8Aoy1rXD/xI/P8jOv/AA5fL8zo6KKK9A4QooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKK5/T/AB1pN/ezWHneVPFM8OyXCeYyME/dtkq25j8o
+zuP92gCpqv8AyGp/+vS2/wDRl1SUuq/8hqf/AK9Lb/0ZdUlaR2PWwn8GPz/MKKbJIsKs7sFVQSST
+gADqSao/8JDpn/P7b/8Af1P/AIqmbOSW7SNCiobW8gvlLwSpIoOCUYOM+mVqagad9gooqOa4it9v
+mOqb2CLuIXc7dFGepPpQBJRRWf8A8JDpn/P7b/8Af1P/AIqgTaW7saFFV7TULa/3fZ545duN2x1f
+bnpnaT6VYoBNPYKKKKBhRUb3EUbpGzqHfOxSQGfaMttHfHenSSLCrO7BVUEkk4AA6kmgLjqKbHIs
+yq6MGVgCCDkEHoQadQAUUUUAFVdQ6W//AF92f/pRFVqquodLf/r7s/8A0oipPZmdb+HP/DL8jtqK
+KKzPGCiiigDlP+Zz/wC4T/7cUUf8zn/3Cf8A24ooAz7L/l4/6+7v/wBKJas1Wsv+Xj/r7u//AEol
+qzXr0v4cP8K/I6Y/CvQKKKKsYUUUUAFFFFABRRRQAUUUUAFFFFAGOfDN9r2p3JtdUms9kEBIjB+b
+c0wA+R4+m0nnP3jVr/hXGtf9DLd/lJ/8kVseF/8AkJX3/Xva/wDodzXUV5Vf+LL1OefxM8//AOFc
+a1/0Mt3+Un/yRR/wrjWv+hlu/wApP/kivQKKyJPP/wDhXGtf9DLd/lJ/8kUf8K41r/oZbv8AKT/5
+Ir0CigDz/wD4VxrX/Qy3f5Sf/JFH/CuNa/6GW7/KT/5Ir0CigDyfxb4E1aw0yaV9ZurwAxr9nIkI
+lZ5ERRgzPk5II+U81hWHwz1aGwudRuX+yCK3lkCcmaQeXkqyqRsV1LKcnPYrXutZXiz/AJAupf8A
+XpP/AOi2oAu1y3iy01H+0dLv7C0+0/ZvtG9PNSH/AFyKi/M/49j0rqaK8KEuR3sno1r5qxqcVrEO
+v+MLV9Om0+OxjkKGSZ7hZzsR1bCJEB83GeeMAjjINOt7TXfDt1fQ2VpFcxXdw9wkzSiIQPPwwlTl
+mVcD7vUd8nC9nRV+2duXljy/y67/AH3FY4SPwrqEngz+yjGFucMdhZcZE5mA3KSuSvTnGeuKt6vD
+rN3NpOqx6eDNbG4Elr9oQMBMvlqRLjaRgZPfkD1I7Cij27u20neUpdftqzQWOU1LTdU0XVJdU0uI
+XS3QRbm2Z1iYNEu2OSORugHcc9e+fkxdY8K6zr9pqF9cxgXU8aQQWqMm2K3SdJfnkJAZjtz1/mFX
+0WiiNeUbNKN1bXrZdAsYHi3TLnU/7N+zpv8AJ1CCaTkLtij3bm+YjOM9BzT/ABIdQwqwWMF/A42y
+QOyxuHB3K+6TcjLx93bkHBye25RUKbXLony/qFjlPA3h2fSHvrueCO1N3IpW2jO9YEj34+YEjLbs
+4XgdsfdXY8Q/8e0X/X3Zf+lMNadZniH/AI9ov+vuy/8ASmGtITdSvCT6yiD0Rt0UUV7JmFFFZWs+
+IItLYW8Ub3F06bo7eMEuw3BAztjbGm48u+B1xnGKAGO5m12NVQ4gs5C7cbc3UsflqOc5/wBHfPGO
+nrWxWV4f0ZtLikluCj3Vw5kuJF3YZyTtRS5LbI1+RB6DOBk1q0AFFFFABXMQf8f+qf8AXyn/AKTW
+9dPXMQf8f+qf9fKf+k1vWGJ/h/NG2H+P5FuiiiuE7AooooAKKKKACiiigAooooAKKKKACiiigAoo
+ooAKKKKACuZ1vw7ea5rFuLbUpbPNrLzHu/5ZyRbvuyJ9/wAxc/7g69umqC1/5DVt/wBel1/6Mta2
+w/8AEXz/ACM6/wDDfyML/hXGtf8AQy3f5Sf/ACRR/wAK41r/AKGW7/KT/wCSK9AorvOE8/8A+Fca
+1/0Mt3+Un/yRR/wrjWv+hlu/yk/+SK9AooA8/wD+Fca1/wBDLd/lJ/8AJFH/AArjWv8AoZbv8pP/
+AJIr0CigDz//AIVxrX/Qy3f5Sf8AyRR/wrjWv+hlu/yk/wDkivQKKAPP/wDhXGtf9DLd/lJ/8kUf
+8K41r/oZbv8AKT/5Ir0CigDz/wD4VxrX/Qy3f5Sf/JFH/CuNa/6GW7/KT/5Ir0CigDz/AP4VxrX/
+AEMt3+Un/wAkUf8ACuNa/wChlu/yk/8AkivQKKAPP/8AhXGtf9DLd/lJ/wDJFH/CuNa/6GW7/KT/
+AOSK9AooA8//AOFca1/0Mt3+Un/yRR/wrjWv+hlu/wApP/kivQKKAPP/APhXGtf9DLd/lJ/8kUf8
+K41r/oZbv8pP/kivQKKAPP8A/hXGtf8AQy3f5Sf/ACRR/wAK41r/AKGW7/KT/wCSK9AooA8//wCF
+ca1/0Mt3+Un/AMkUf8K41r/oZbv8pP8A5Ir0CigDz/8A4VxrX/Qy3f5Sf/JFH/CuNa/6GW7/ACk/
++SK9AooA8/8A+Fca1/0Mt3+Un/yRR/wrjWv+hlu/yk/+SK9AooA8/wD+Fca1/wBDLd/lJ/8AJFcF
+B8PNZ1vULqOIF1SeVGupsokjI7qXydzMSynO3dg9fWvfaKAPPNK0B/DV3LaPdSXJFrbne/RV33Cq
+iKS21VAHGeufpWvS6r/yGp/+vS2/9GXVJWkdj1sJ/Bj8/wAxskazKyOoZWBBBGQQeoIrldW0axj1
+jSo1tYQj/ad6iNQr7YwV3DHOO1dZWHq1vLJrGlSKjFE+072AJVN0YC7j2z2oZdWKaWl/ej/6Ug1W
++i8ORR29haqZ7hiIYo0CIzgDc77cDCjGf6DJEMOtajpt1FBqsUWychIpbcOUEpPCPv5+bt/XnbJ4
+ms7oSWuo2iCV7QyEwnOZElAVtpH8QA4GPz6GnNNdeKbq1RLWW2gtpUuHe4Qo7uhO1EXP5n/6wYM5
+OSk0rp3XLFLRrqWJta1HUrqWDSootkBKSy3AcIZQeUTZz8vf+nG7Mv8AWm1VbGKeIw3MGo2yzRkc
+AnftZT3VsZHP5jBNuGa68LXV0j2stzBcyvcI9uhd0dyNyOufyP8A9cLQfS7+5kh1GeEq9zf2khhV
+SxhhhDqGkP0PzcDHtnARE3Jq13e75lbRLodzXJ+KdGsbf+z/AC7WFN99AjbY1XcjbsqcDkH0rrKw
+/FNvLcf2f5aM+y+gdtoLbUXdljjoB602b1knB6XDW3i8L6dcXVjbwo42cBAqtlwvzbNucbjjmmtq
+Gs28LPLbRF5XRIEj3v5O/OWuGH8KcZK/pnNO8a28t1o9zHCjO58vCqCzHEiHgCjxhby3NkqqjSRi
+aIzxoC0ksIb5lQDnOcHqOnWgmd05WulGCsltd3IbHXbyHUI7C/Nszyhtv2ZmJjKLv/eq/I3L93/O
+C41jVL+S5XS4oGS3do2aZmzLIoBZEUbdu08ZY4PGDWVYWiLqOnzWmmTW0ETSo7uh81nlQ7dy/M+0
+f3ycDOOMVdjubnwvJep9inuFnnknieFQwJkCko4BJTaeM455OOKRCnJrVtR5t12t6dyHUtYQ3mjX
+10jWyhbsusoIZCEC4x1OT93jJ445xVyHWL2/sb2+kgjS38mRoI5FLSSqqk7pPmxtb0xznrjlq99p
+tzq11o51G3VsfaGmVAzQodoaMMefQZycE5HIqOxtbnT7HVNJaORljjmNs+1iJI5VJ2BggBYE8+pJ
+A4FAk5qUr35X9/NyLcsTa7ewx6TFZwQlruEnacokZWNGG3B4Vc5I5OBgc1c0jV71r2TT9QjjEojE
+yPCT5TxZCnhjuBDf59aMFnOJ/DxMT4igkEh2n92TCigP/d545q99nl/4SHztjeX9h2b8HZv83O3d
+0zjtTKi5Xvd/FFW6W5UVbbXNV1gPc6fBAbdHZVEjOstwEP3oztCruHAz0Oc1peGdUl1nTobqYKHf
+fkKCF+V2XjJPp61i6PdXnhm3/s6SxnnZHcQPGg8qRGYlDI+8hMtnOfujFXvAX/IEtf8Atp/6MehB
+Sk3KKbd3FuSfR6HQVV1Dpb/9fdn/AOlEVWqyfEqXkltEtk6JIbm3AZ84VjKmxhw3R9ucg8ZoezNK
+38Kf+F/kehUV5/8A2N4+/wCgraf98L/8jUf2N4+/6Ctp/wB8L/8AI1ZnjHoFV01G1kuHtVnjMyDc
+0QdTIq8csmcgfMPzrh/7G8ff9BW0/wC+F/8AkavOPEdnrK69LFO5nvlMbbrdTuLLGrqUCIhyq46L
+2z70Aeuf8zn/ANwn/wBuKK4D+z/GP9o+V53+m/2djG+Pzfsvm+Xt8zG3fu+fdu3Y/i3cUUAdfZf8
+vH/X3d/+lEtWapRyPaPcI9vdZ+1XLfLbTupV55HUhkjIIIIPBqT7b/073f8A4CXH/wAar1KVWChF
+OUfhXU6IyVlqtizRVb7b/wBO93/4CXH/AMao+2/9O93/AOAlx/8AGqv2tP8Anj96HzR7os0VW+2/
+9O93/wCAlx/8ao+2/wDTvd/+Alx/8ao9rT/nj96Dmj3RZoqt9t/6d7v/AMBLj/41R9t/6d7v/wAB
+Lj/41R7Wn/PH70HNHuizRVb7b/073f8A4CXH/wAao+2/9O93/wCAlx/8ao9rT/nj96Dmj3RZoqt9
+t/6d7v8A8BLj/wCNUfbf+ne7/wDAS4/+NUe1p/zx+9BzR7os0VW+2/8ATvd/+Alx/wDGqPtv/Tvd
+/wDgJcf/ABqj2tP+eP3oOaPdGn4X/wCQlff9e9r/AOh3NdRXLeEw8l7eymKZFMNsoMsUkO5la4LA
+eYq5xuH511NeZXadSTTvqYT1kwooorMkKKKKACiiigArP8Q2st9pl7bwrueW3mRBkDLujKoyeOta
+FFAGL/al5/0C7v8A77tf/kmj+1Lz/oF3f/fdr/8AJNbVFcv1Gj2f3lczMX+1Lz/oF3f/AH3a/wDy
+TR/al5/0C7v/AL7tf/kmtqij6jR7P7w5mYv9qXn/AEC7v/vu1/8Akmj+1Lz/AKBd3/33a/8AyTW1
+RR9Ro9n94czMX+1Lz/oF3f8A33a//JNH9qXn/QLu/wDvu1/+Sa2qKPqNHs/vDmZi/wBqXn/QLu/+
++7X/AOSaP7UvP+gXd/8Afdr/APJNbVFH1Gj2f3hzMxf7UvP+gXd/992v/wAk1Vv5b3UlihGnXEf+
+kWzl3e32qkU0crE7J2b7qnoDXSUU44OlFqSTunfcXMwrHfVtSkKLBpcgJPLXE0McargnOYXncnOB
+jZ361sUV0iMKaw1nVQyXF1HZxEkbbUGScoU2/wDHxKFCncc/LFkYGGq/pmi2ejhxawhDISzvy0kj
+ElsySOS7nLH7xNXqKACiiigAooooAK5eaG+tL6+ZbGaZJpkkR43hClRDDGeJJkbO5D2rqKKmcFNW
+ZUJuDujmPPv/APoF3P8A33bf/JFHn3//AEC7n/vu2/8AkiunorL6tT8/vNPrE/I5jz7/AP6Bdz/3
+3bf/ACRR59//ANAu5/77tv8A5Irp6KPq1Pz+8PrE/I5jz7//AKBdz/33bf8AyRR59/8A9Au5/wC+
+7b/5Irp6KPq1Pz+8PrE/I5jz7/8A6Bdz/wB923/yRR59/wD9Au5/77tv/kiunoo+rU/P7w+sT8jm
+PPv/APoF3P8A33bf/JFHn3//AEC7n/vu2/8Akiunoo+rU/P7w+sT8jmPPv8A/oF3P/fdt/8AJFHn
+3/8A0C7n/vu2/wDkiunoo+rU/P7w+sT8jmPPv/8AoF3P/fdt/wDJFHn3/wD0C7n/AL7tv/kiunoo
++rU/P7w+sT8jmPPv/wDoF3P/AH3bf/JFHn3/AP0C7n/vu2/+SK6eij6tT8/vD6xPyOY8+/8A+gXc
+/wDfdt/8kUeff/8AQLuf++7b/wCSK6eij6tT8/vD6xPyOY8+/wD+gXc/9923/wAkU/S4bybU47iW
+0lgRLeZCZGiOXkeBlAEUrnohrpKKqNCEGpK90TKtOaswooorUzCiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5TVf+Q1P/16W3/oy6pKbrrvbatJ
+IYZ2V7WBQ0cEsy7kkuCwzEjYI3Dr61X/ALQH/Pvd/wDgHcf/ABqri1Y9PC1IRpRTlFPXd+Zaoqr/
+AGgP+fe7/wDAO4/+NUf2gP8An3u//AO4/wDjVO67m3tqf88f/AkWqKq/2gP+fe7/APAO4/8AjVH9
+oD/n3u//AADuP/jVF13D21P+eP8A4Ei1RVX+0B/z73f/AIB3H/xqj+0B/wA+93/4B3H/AMaouu4e
+2p/zx/8AAkWqKq/2gP8An3u//AO4/wDjVH9oD/n3u/8AwDuP/jVF13D21P8Anj/4Ei1RVKbVo7dG
+kkiulVQWZmtLhVVV5JJMXAFMtdbt76JZrdLiVGzh0tZ3Q4ODhlix1ouu4e2p/wA8f/AkaFFVf7QH
+/Pvd/wDgHcf/ABqj+0B/z73f/gHcf/GqLruHtqf88f8AwJFqiqv9oD/n3u//AADuP/jVH9oD/n3u
+/wDwDuP/AI1Rddw9tT/nj/4Ei1RVX+0B/wA+93/4B3H/AMao/tAf8+93/wCAdx/8aouu4e2p/wA8
+f/AkZP8AwhdqvyR3F0kPT7OszeSVP3lwcnDc5+bvW5b26WsSQxjCIoVRknCqMAc1D/aA/wCfe7/8
+A7j/AONUf2gP+fe7/wDAO4/+NUaExnRjtKC+aLVVdQ6W/wD192f/AKURUf2gP+fe7/8AAO4/+NVF
+PO141vHHb3WftVq3zWs6KFSeN2JZ4wAAATyaG1YVWrTdOaU4/C+q7Hd0UUVmeSFQx2kMMskyRory
+7fMcKA8mwYXcw5OB0zU1FAHKf8zn/wBwn/24oo/5nP8A7hP/ALcUUAdXRRRQAUUUUAFFFFABRRRQ
+AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB
+RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
+FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
+UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcV8V/Ef9i6SbaM/vbzdEPaID96eVI6EL2PzZHSuf8A
+gz4m/wBbpEz+ssGT/wB/Ixlv+BBVH98mu18aaTZXemX1xNbQvKlpNskaNWkTajsu1iMjB5FZXwu0
+my/sSyvPs0Pn/vv33lr5v+skX7+N33eOvSgDtaKKKACiiigAooooAKKKKACiiigAooooAKKKKAOU
+/wCZz/7hP/txRR/zOf8A3Cf/AG4ooA6uiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
+KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
+oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
+AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
+iiigAooooAyvFn/IF1L/AK9J/wD0W1ZPwu/5Fuy/7bf+jpK1vFn/ACBdS/69J/8A0W1ZPwu/5Fuy
+/wC23/o6SgDq6KKKACiiigAooooAKKKKACiiigAooooAKKKKAOU/5nP/ALhP/txRR/zOf/cJ/wDb
+iigDq6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
+iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
+KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDK8Wf8gXUv+vSf/0W
+1ZPwu/5Fuy/7bf8Ao6StbxZ/yBdS/wCvSf8A9FtWT8Lv+Rbsv+23/o6SgDq6KKKACiiigAooooAK
+KKKACiiigAooooAKKKKAOU/5nP8A7hP/ALcUUf8AM5/9wn/24ooA6uiiigAooooAKKKKACiiigAo
+oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
+igAooooAKKz9fuL20sLiawRJJ403ojhmD7eWXanzFiudoHfFVPBviH/hKNLhvWCK7blkRG3BJEOD
+7jIwwB7EdetAG3RXM+O/FM3hi0hNpGktxPMsUUbZJOeSQi4Zuy8d2H0NhbnXl1Gzhe3ga2aAG5mQ
+8pcbXysYaQNt3BcfIeD+QBvUUVy+oeKLq18T2WjqkZhngaRmIbzAwEx+U7sY/dj+GgDqKKKKACii
+igAoorzceNfFOp6hqFrpllazLaTvGS2VYLvdUzunTJOw9KAPSKK83ufH/iLwy8Umu6ZGsEh2hoW+
+ZW4J58yRc7c4U7c+vBr0WGZLhFkjYMrAMrKdysrcggjqDQA+iiigAooooAKKKKACiiigAooooAKK
+x/C9zq91au2sW8cEwkIVYyCpj2rhuJJOc7u9bFABRRRQAUUV55rnj7VtPN1eW1vBJZW159kcMJBc
+bkC+YxZWKKpb5VY+oytAHodFMhmS4RZI2DKwDKyncrK3III6g1y+qeKb0eIbXRrCOFwUEty7bnMU
+eckfJ9xto43ZyXXp3AOrorH0S51ee6vl1C3jihSTFqyEFpY9z/M/7xucBey9a2KACiiigAooooAK
+K5f4h+KLrwlp8V1apGzNOsZEgZl2sjt/Cy8/LWhrdzq8F1Yrp9vHLC8mLpnIDRR7k+ZP3i84Ldm6
+UAbFFFFABRRRQAUVg+D/ABUni+1muo4TEqTtEoZtzMqqrBjgcE7unP1NTeF7nV7q1dtYt44JhIQq
+xkFTHtXDcSSc53d6ANiiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDK8Wf
+8gXUv+vSf/0W1ZPwu/5Fuy/7bf8Ao6StbxZ/yBdS/wCvSf8A9FtWT8Lv+Rbsv+23/o6SgDq6KKKA
+CiiigAooooAKKKKACiiigAooooAKKKKAOU/5nP8A7hP/ALcUUf8AM5/9wn/24ooA6uiiigAooooA
+KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
+oooAKKKKACiiigAooooAK8/8Af8AEg1rV9C/gV/tMKr8yJG23gs3zFtrxjv0PPr6BXnXxJ36Bq2k
+6+m/bG/kTY2n93kttVW/idGkGfp0NAEupf8AFSeNba0PMWmw+eyt8v71trBkK8nlouGIHyn8bGra
+jdR+NtNtVnkEL2rM0QdhGzYuOWTOCflH5VF8IrKZrO71W4JMt9OWJ+Xa6xlvnCr0Jdnz9BgerNZ/
+5H7Sv+vR/wD0G5oAEub/AMc61f2kd7NaWVi4RlgPlXEkvzpnzBu+Xcrd8YC/LnkZ62d3p/jfTILq
+fzwlu4ikb/WtDsuNvnHoXByCw+8ACeSasWd6Ph7r2pvqEcgtb+QSpdBCY1c+ZJ5bBN3PzMPX5c7d
+pyKkWtjXvHOnzpDJHEIHWJpFKGePy52EyqwHytuO32H4AAmtPEMXje4mubnVzpltETHBBHcLb3Eh
++VjLKW6g9ABkdh0Ja14X8RTadr39jNqI1G2mjZ7eUMs0kbDe+yWRTycK2fvfwY2gkDF8PQ6Z4JuL
+vT/EVpGU8wtbXMtr5omUYDAMBJxjawUfdJYMc8V0XhS5h1nVmn07Sre3sYkbZdG2Ecs8mTH+6YbN
+qnns3Aw2C2AAVfD5v/iNLdX0moXFraRzPFbxWzeRL0RsyMN2flx3b5icbRwbuialeeHNe/sG9uZL
+uOePzbWRyGkjUeazLKxALE7Tzk9BgAHC5XhLV4fhubvStXWSFDO8kFyY2Mc64RflCBucBW4JxnBw
+Rza0hn8Y+KY9Zgikjs7SBo45XXC3LZkT5M44+dvXG35sFsAA9Drx/Q/Gtl4P1rXvtccz+ddtt8pV
+bHlyTZzudf7wr2CvP/hx/wAhrxL/ANfY/wDRlxQBj+KPHh8d2v8AZGjWU8jTFTIXUZREdCpGx2AG
+7G5mIAH1yLvjkajof/CO6dp148b/AOoDAmOOR08iNGkQbgVz2Ibv1r0uvP8A4j/8hrw1/wBfZ/8A
+RlvQBL4lml+HWk3FxBeXdzNcPHFEbqQXAhfDsWUELj5c+vIXIxmpv+EI1b7N539t3f27/Wf6w/Y/
+Nzu2+Vt+5/D6d9uPlqx8T9BuNf0ZktlLyQyLMEUZaQKGRlHI5wxPcnGAMmq//C1dN+zf6ub7b9z7
+FsfzfPzs8vds2/e/HH8O75aAMRviRfappOnRWR8q9urgWrSuqtHvjEe9xxgbzIn8Bx8w7AnV1Dwl
+rWiww3Wl6ld3dzE6F4rmfMEyYIfEbcdT3fgZwd2K5eDwZqejaRpeoLbySzW94bl7UL+8CSGLA4LH
+P7lcjbkb+QNpro9Y+I/9s2yW3hxZprybaeI/+PZcruMnmKU77c/dHJ3dMgEvi/xZcpLZ6Qrpp813
+Csk88jjZaxsG3IjggF8qyhuO2Dk5XH129HheEX+keIjdNGQJLe4uUuvNRmX7ijoR3xztzhhjmx47
+0e50+/0zV54ft8UEIhux5IcbU3M8pj3YG4OzD+FSoyeabqevaDehLfw7pNrfXLkcfY9scSZUFpNy
+JxzjOQB1YjoQB3jLxbNLd6ZH9qmsNPu7dJ3mRD5x3fPsDpuIYAIPk6bvm3DitbStJv4LuG40fWvt
+toXC3KXM32k/L18t0U4ba2cfLyBncDgHjDVbvwzFaiext7rTNkcdyqxYMbqcArGzFFT7uwHPI2lh
+lTXH60NIu7u1l8HpMb4TF28lJFiRG4JdZQFVdzAcYTaWDcYoA0pdbfWNevrPV9Wn06OCRkt44W+y
+h1/vvKQRjYoYb+pb5MDg9b4W07VtOmkEt+l7YOm62d2L3PzHcNzgYZSGPO49FxtHFYWv+IIbbU5L
+HxRYwG1cSfZLlY2fCHqCfmYNjaGKYKtg42kMM/wfDCviXzPDqz/2a0ZW4Zg3kGRUJAUy/NkMydfm
+5bHyUAWPBGrXt34S1a4muZpJY/tOyR5GaRNsCMu1icjB5FP8I6LqvivRYbi51a6i4kWDyZGDE73B
+e4ZvmkO7gKCAFXg5Jql4A/5EzWf+3r/0nSuq+Fv/ACLdj/22/wDR0lAHK6f8Qr+18IyXcj77hbj7
+JDIV3H7iyb5Mnlgu7BwcnbuB5NbGo+HdZ0bSrm+GrzyXQglaZXcm22srM/kKADGydY2GORjAU4HH
+6JoNxr/gy5S2UvJDfmYIoy0gWJEZRyOcMT3JxgDJrrdX+INtrOj3ltb28xu2t5lmtypU2oVWWV5J
+GULtTt3J2rgE8AF3wlr72fhGPUruQytHHO5MsnzSMskgRC7Z5bhR17U/S/CbTeEU0mUfPJblgJA0
+XlzSEzoHAyR5bkZ+nTtXNaZ/xMfC2i6MvJv7h1cDhxbQTPLM6MflDLheuc9ga9VoA5L4W6wdW0GA
+OSWtybdiQAMR4KbdvYIyj1yPxrM+G3/E+v8AVtffnzpvIhz8siRJhtrKvy/d8sZ5Pyn8eU8X3U/g
+7U9btY2dU1KEOnCPuMrguT3VcGZB36ezV6n4Q0c6DpFnZsCGSMFwSGKySEySLleMBmIHt60AcJae
+I9VtF8VzQyySvbTqIVctKsKGWVWZEJIAVOfT5eeBT9Ci/wCEitEmtfElx/aLfP5Ty7IfPH71o/sx
+GSgHykrleCcYG2n+Envo73xU2nJG9wLoGNZc7GIlnypwV5IzjkDOM8VRn13wlrto76zafZb5PNEq
+RRvHK038TAqNpYt0Ev3WyDxyQDqPF1xqumeE5nuZwt4gjDS27MgJ85F3KflIJX72ABnOOKu/a5v+
+ES+0eY/m/wBmeZ5m4+Z5nkbt+7ruzzmuVstK1q88EXVpcwzNMHHkROMS/Z4nibbtPzcbX2g84wF4
+20+LxxZ3vhc2Fmkk1ytg0UkYUqIUjiKSTO5GzaAMjBySVXAJ4ALWg33iDUPD2liwYvJPJIJ7uRll
+eCNZmG7ZK3znH14GOpBEXjDTpvBln9utdcvPPUjZFczrMsykhHCxsBkrv3Zw2PTuOcvPtP8AwiWi
+5877D5032zycbtvnnZ1/4FjPy7tuedtWPEEXhyfSrtPDtiZ3AR5pgsp+yxowO7dPzluRhP4dzNwt
+AGt8T719T8K6bdSABppLeRgv3Q0kEjHGc8c1q+PtRurPVvD8cE8kay3RWRUdlWRfMgGHAPzDk9fW
+uf8AHUyTeCtHZGDAG2XIORuSCRWHHcEEH3rY+I//ACGvDX/X2f8A0Zb0Aaet+GLe1Fxf3OtalBFl
+pG23O2OMMc7UXYeOcKo56AVmfDy01YWlzq1xLdzGRH+yWs85YPHw6MXfjcxG0NtXjLYwwxiSeM9I
+8UatJJq9xssrV82tuI5HjuXyw86Xameg+6wHXH97d2sXjOx8RQ3dvotx5t0tvI8Y8tk+cDahzMir
+95l6/wAqAKFt4c1LVLY32t6nd2kvzs0VtMlvBBEpYgErvDYHO4tnGAemao+Cb+88Tw6rpVzfySLb
+SRpFdwMI52QMwyJF3ZDeUOeSdxyxrmvCreGEhLaxFPNqYncvFIsskksu75UVF+Vix4Ik5LZz8uK6
+D4Wg2uq65BNCLWVpI3FvkZjTdKcLjGVXeuGAxgj1FADPgpp/+hT3nnTf654vJ3/uPuxP5mzH3+27
+PSs3RPGt9pPhO5vHmkmuHvDBE8pM2wtGj5O9ugAYjqN2MjGa1fg1fw29rdaZIStys8krRMrKyoqx
+RknIwCG4xnPtXNaJoNxr/gy5S2UvJDfmYIoy0gWJEZRyOcMT3JxgDJoA7j/hCNW+zed/bd39u/1n
++sP2Pzc7tvlbfufw+nfbj5azLrxjca34LuL6N5IbiExQySK2xjIrw7nQptwGDdOMZI6cnT/4Wrpv
+2b/VzfbfufYtj+b5+dnl7tm37344/h3fLXONoNxoHgK8S5UpJNJHMUYYaMNLCiqeTzhQexGcEZFA
+GhLouq3vh4arPq11HOlmssaQSMkPlxxhx5g+88jjJZ933j3CjPVeBtYuNe0W0vLkgyuHDEDaGMbt
+Hux6nbk44z0xVL/mTP8AuE/+29Hwt/5Fux/7bf8Ao6SgDq6KKKACiiigAooooAKKKKACiiigAooo
+oAKKKKACiiigDK8Wf8gXUv8Ar0n/APRbVk/C7/kW7L/tt/6OkrW8Wf8AIF1L/r0n/wDRbVk/C7/k
+W7L/ALbf+jpKAOrooooAKKKKACiiigAooooAKKKKACiiigAooooA5T/mc/8AuE/+3FFH/M5/9wn/
+ANuKKAOrooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA
+ooooAKKKKACiiigAooooAKKKKACiiigDE8X6Re61YNDYXL284dXR1kaIHHDK7IC23aTwO+K5/U5/
+FviCyOn/ANmw2hmQpNcPcJJHsKneFjTcy7+g+9jP/Ah3dFAGfoGjReH7C3sYjkRJgnkbnPzO2CWx
+uYk4zx0rQoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
+AKKKKACiiigAooooAKKKKACiiigAooooAyvFn/IF1L/r0n/9FtWT8Lv+Rbsv+23/AKOkrW8Wf8gX
+Uv8Ar0n/APRbVk/C7/kW7L/tt/6OkoA6uiiigAooooAKKKKACiiigAooooAKKKKACiiigDlP+Zz/
+AO4T/wC3FFH/ADOf/cJ/9uKKAOrooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
+oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii
+igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
+ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA
+KKKKAMrxZ/yBdS/69J//AEW1ZPwu/wCRbsv+23/o6StbxZ/yBdS/69J//RbVk/C7/kW7L/tt/wCj
+pKAOrooooAKKKKACiiigAooooAKKKKACiiigAooooA5T/mc/+4T/AO3FFH/M5/8AcJ/9uKKAMuON
+7t7h3uLrP2q5X5bmdFCpPIigKkgAAAA4FSfYv+ni7/8AAu4/+O0WX/Lx/wBfd3/6US1Zr1KVKDhF
+uMfhXQ6IxVlotit9i/6eLv8A8C7j/wCO0fYv+ni7/wDAu4/+O1Zoq/ZU/wCSP3IfLHsit9i/6eLv
+/wAC7j/47R9i/wCni7/8C7j/AOO1Zoo9lT/kj9yDlj2RW+xf9PF3/wCBdx/8do+xf9PF3/4F3H/x
+2rNFHsqf8kfuQcseyK32L/p4u/8AwLuP/jtH2L/p4u//AALuP/jtWaKPZU/5I/cg5Y9kVvsX/Txd
+/wDgXcf/AB2j7F/08Xf/AIF3H/x2rNFHsqf8kfuQcseyK32L/p4u/wDwLuP/AI7R9i/6eLv/AMC7
+j/47Vmij2VP+SP3IOWPZFnwmXjvb2IyzOohtmAllkm2szXAYjzGbGdo/Kuprl/C//ISvv+ve1/8A
+Q7muorzK6SqSSVtTCekmFFFFZkhRRRQAUUUUAY3i53TTm2O6FprZSyM0b7XniRgGQgjIJHBrF/s1
+f+e93/4GXH/x2tnxh/yDv+3i0/8ASmGqNfPZ/iK1GpSVOpOCcXflk49fI7cHCMoy5op69UVP7NX/
+AJ73f/gZcf8Ax2j+zV/573f/AIGXH/x2rdFeL9exX/P+t/4Ml/mdXsqf8kfuRU/s1f8Anvd/+Blx
+/wDHaP7NX/nvd/8AgZcf/Hat0UfXsV/z/rf+DJf5h7Kn/JH7kVP7NX/nvd/+Blx/8do/s1f+e93/
+AOBlx/8AHat0UfXsV/z/AK3/AIMl/mHsqf8AJH7kVP7NX/nvd/8AgZcf/HaP7NX/AJ73f/gZcf8A
+x2rdFH17Ff8AP+t/4Ml/mHsqf8kfuRU/s1f+e93/AOBlx/8AHaP7NX/nvd/+Blx/8dq3RR9exX/P
++t/4Ml/mHsqf8kfuRU/s1f8Anvd/+Blx/wDHaP7NX/nvd/8AgZcf/Hat0UfXsV/z/rf+DJf5h7Kn
+/JH7kVP7NX/nvd/+Blx/8do/s1f+e93/AOBlx/8AHat0UfXsV/z/AK3/AIMl/mHsqf8AJH7kVP7N
+X/nvd/8AgZcf/HaP7NX/AJ73f/gZcf8Ax2rdFH17Ff8AP+t/4Ml/mHsqf8kfuRU/s1f+e93/AOBl
+x/8AHaP7NX/nvd/+Blx/8dq3RR9exX/P+t/4Ml/mHsqf8kfuRU/s1f8Anvd/+Blx/wDHaP7NX/nv
+d/8AgZcf/Hat0UfXsV/z/rf+DJf5h7Kn/JH7kX/CLu+nLvd3KzXKhnZpH2pPKigs5JOAAOTWzWL4
+P/5B3/bxd/8ApTNW1X29Ft04N6txj+R5MvifqFFFFaCCiiigArjLqFrzUdQ3z3ACTIqqlxNEir5E
+D4CxyKOrE9K7OuR/5iOp/wDXwn/pNb15mdVJ0sI5U5ShLmjrF2f4G+FipVLNJ6Pci/s1f+e93/4G
+XH/x2j+zV/573f8A4GXH/wAdq3RXy/17Ff8AP+t/4Ml/meh7Kn/JH7kVP7NX/nvd/wDgZcf/AB2j
++zV/573f/gZcf/Hat0UfXsV/z/rf+DJf5h7Kn/JH7kVP7NX/AJ73f/gZcf8Ax2j+zV/573f/AIGX
+H/x2rdFH17Ff8/63/gyX+Yeyp/yR+5FT+zV/573f/gZcf/HaP7NX/nvd/wDgZcf/AB2rdFH17Ff8
+/wCt/wCDJf5h7Kn/ACR+5FT+zV/573f/AIGXH/x2j+zV/wCe93/4GXH/AMdq3RR9exX/AD/rf+DJ
+f5h7Kn/JH7kVP7NX/nvd/wDgZcf/AB2j+zV/573f/gZcf/Hat0UfXsV/z/rf+DJf5h7Kn/JH7kVP
+7NX/AJ73f/gZcf8Ax2j+zV/573f/AIGXH/x2rdFH17Ff8/63/gyX+Yeyp/yR+5FT+zV/573f/gZc
+f/HaP7NX/nvd/wDgZcf/AB2rdFH17Ff8/wCt/wCDJf5h7Kn/ACR+5FT+zV/573f/AIGXH/x2j+zV
+/wCe93/4GXH/AMdq3RR9exX/AD/rf+DJf5h7Kn/JH7kVP7NX/nvd/wDgZcf/AB2j+zV/573f/gZc
+f/Hat0UfXsV/z/rf+DJf5h7Kn/JH7kVLWFrPUdP2T3BDzOrK9xNKjL5E74KySMOqg9K7OuR/5iOm
+f9fD/wDpNcV11fUZLUnVwilUlKcuaWsnd/iefioqNSySWi2CiiivTMAooooAKKKKAMzxPM9vpN/J
+GxVltZmVlO1lZY2III6EVz/9mr/z3u//AAMuP/jtb3iz/kC6l/16T/8AotqzK8HiCvVo+w9nUnC/
+tL8snG9uXsdeDhGXPzJPbdepU/s1f+e93/4GXH/x2j+zV/573f8A4GXH/wAdq3RXhfXsV/z/AK3/
+AIMl/mdnsqf8kfuRU/s1f+e93/4GXH/x2j+zV/573f8A4GXH/wAdq3RR9exX/P8Arf8AgyX+Yeyp
+/wAkfuRU/s1f+e93/wCBlx/8do/s1f8Anvd/+Blx/wDHat0UfXsV/wA/63/gyX+Yeyp/yR+5FT+z
+V/573f8A4GXH/wAdo/s1f+e93/4GXH/x2rdFH17Ff8/63/gyX+Yeyp/yR+5FT+zV/wCe93/4GXH/
+AMdo/s1f+e93/wCBlx/8dq3RR9exX/P+t/4Ml/mHsqf8kfuRU/s1f+e93/4GXH/x2j+zV/573f8A
+4GXH/wAdq3RR9exX/P8Arf8AgyX+Yeyp/wAkfuRU/s1f+e93/wCBlx/8do/s1f8Anvd/+Blx/wDH
+at0UfXsV/wA/63/gyX+Yeyp/yR+5FT+zV/573f8A4GXH/wAdo/s1f+e93/4GXH/x2rdFH17Ff8/6
+3/gyX+Yeyp/yR+5FT+zV/wCe93/4GXH/AMdo/s1f+e93/wCBlx/8dq3RR9exX/P+t/4Ml/mHsqf8
+kfuRU/s1f+e93/4GXH/x2j+zV/573f8A4GXH/wAdq3RR9exX/P8Arf8AgyX+Yeyp/wAkfuRY8Il1
+W+jaSRxHdBV8yR5WVTBA+N0jMcZYnrXQVgeE/val/wBfY/8ASe3rfr7TBycsNRlJtt0oNt7t8qPL
+qq05JfzMKKKK3IMrxZ/yBdS/69J//RbVk/C7/kW7L/tt/wCjpK1vFn/IF1L/AK9J/wD0W1ZPwu/5
+Fuy/7bf+jpKAOrooooAKKKKACiiigAooooAKKKKACiiigAooooA5T/mc/wDuE/8AtxRR/wAzn/3C
+f/biigDPsv8Al4/6+7v/ANKJas1Wsv8Al4/6+7v/ANKJas169L+HD/CvyOmPwr0CiiirGFFFFABR
+RRQAUUUUAFFFFABRRRQBa8L/APISvv8Ar3tf/Q7muorl/C//ACEr7/r3tf8A0O5rqK8rEfxZepzz
++JhRRRWRIUUUUAFFFFAGL4w/5B3/AG8Wn/pTDVGr3jD/AJB3/bxaf+lMNUa+Z4j/AItL/A/zO/Bf
+DL1Cuf1jU7yXUotKtJY7cvCZTM48x+GI2xocKT8pzntk9uegrn9RFhrl+2majbruRVltyXIaVWBD
+7dmCu0jlc84zjivKwnLzylKPMowk9lLl/vcr0lbsdFS9kk7Xfpfyv0CA6xo9xGLmX7bDMyx5SIRy
+wu275yqDb5f94k//AF2+FvFUWuzXcRkDMsrtEoUr/oy7FVskdycnJzz0xVS4in8O3lnHbX81w08y
+JLBO4nfyW3ZkXgMoXByRx69KNI837Brvk7vM+13mzZnfv2jbtxznPTFdk6VOdKUmoNzUFCcF7P7V
+ruNvyMlJqSSvpe6evTuav/CYaP5/2f7ZHu9cny+m7/WY2f8Aj3t1q1qeuWWjlBdzCPeHK5B58sZb
+oD68Dv0HNcZYWEl5oQZtXjS0EeJI/ssZEbcFkPIbfuPB+8ThhyRWtewD+0fD8cpMu1JstIpDMyRI
+Q7K/IbIzzyD71M8Fh41OVSm1H2vOtb3pwct5Qilttr6jVWbV7LXlt/287dGzXfxRpkVql41yoikz
+sJBDPtbY21Mbjg9eKsaZrFnrKGS0mWQDrjhl5I+ZThhnBxkVzXiFZ38QWqpd/Zd1sRDI0YlQzFyG
+RN/yq7Ljnr0XuKF0+4tJ9Sb+0GuLo2TBkig8ohsfumZojt8z+6D82OnFS8HQdOMlNxnOPPFPmlZO
+VrO0Lf8Ab3Nv0D2k+Zq10nZ/d6/obNx4w0m1uDayXSrIrBCMNtVvQuF2jHfnjvWxXL6F/Y//AAjq
+7/L+z+WPtGc/67A37v4t+7G3v93b/DVzwP5v9i2nm7t21sbs52b22de23GPas8Rh6dOEpQVSLp1P
+ZS57e87N3W1ttVrutSoTbaTt70ebToSaXqE9xqup27vmOH7P5a4A2+YhZuQMnJ9ajXxxorGNRdr+
+86ZVwBklfmJX5en8WOOelR6L/wAhzWf+3T/0WaytDt4m8Hy5RTuhuXPA5dS+1j7jaMH2FauhRbvN
+S2wsEoNR1qUrtvR9ieeS0Vv+Xj11+GR0P/CUaZ9s+w/aV87ds24ON/8Ad34257Yz14607VfEmn6I
+yJdzhGcZC4ZzjpnCA4/Guc1y3iXwfFhFG2G2ccDh2KbmHudxyfc1dka7n1a+i0wQxMFgFzLKHaTc
+ytsaJQxQ7U7EDnrQsJQfvXnyxdSMryS1g4Lm5uV2T59rMPaT20u7Nad7/wCR0FvqFvdW4uo5VMRU
+vvzhQo6k56Y756d6y28caKpkU3a/u+uFcg4IX5SF+br/AA5456VzERmPh7WTHKZW+2SZkjGPMXMW
+98JxtZck9se1a3jP7H/wjf7rb5e2D7Pu64yu3bv+bOzPvjPvVRwNGNWMJ+0kp1/ZJxaXKvdd3eP9
+7y2B1ZOLasrQ5tfn/kdDqesWejIJLuZYwemeWbkD5VGWOMjOBRpmsWesoZLSZZAOuOGXkj5lOGGc
+HGRXNeIVnfxBaql39l3WxEMjRiVDMXIZE3/KrsuOevRe4q7omnvaatcNNqH2iYwqJUWARKOR5bSM
+h278Z2g/Nt9qylhaUcOpub9o4e0S95q17W+C3z5vkNVJOdre7e3T/P8AQ6SiiiuA2L3g/wD5B3/b
+xd/+lM1bVYvg/wD5B3/bxd/+lM1bVfoFD+FT/wAEfyPHn8T9WFFFFaEhRRRQAVyP/MR1P/r4T/0m
+t666uR/5iOp/9fCf+k1vXlZ9/ub/AMcTown8X5Mmooor5A9IKKKKACiiigAooooAKKKKACiiigAo
+oooAKKKKACiiigAooooAh/5iOmf9fD/+k1xXXVyP/MR0z/r4f/0muK66vr8h/wBzX+OR5uL/AIvy
+QUUUV6pzhRRRQAUUUUAZXiz/AJAupf8AXpP/AOi2rMrT8Wf8gXUv+vSf/wBFtWZXzvEn/MP/ANxP
+/bTtwP2/+3f1CiiivnTtObudQv8AVdTudOtLmO1FusbFygmmkLjPCthdg3DPfOPWoLvVtT8Lxzfb
+nF0jI7QzrEV8uRVG1JlQYCuxwp3Z9f8AZnkgsPE15PBdReVdWjERskhEwiOGjmVlx65AO7aevWsr
+VzPpDzWMN7JdRyWl0ZkmYTSwFYtyuXGGUNlQAePxPHr0YQnKFJwirQjKcJQV3ZXco1Vd6766dDmk
+2k5Xe7s7/g4nR+Htch1TTo7kzBiiKJ3I2BZVRWkzkKOM9RxRa+LNKvZzbRXSF84AOVDHO3CswCtk
+9ME57Vkat5v/AAiK+Vu3fZLfO3OdmI9/Tttzn2qnd6bNdWEEj60pty0fkeXaKGEgOIxEIzvDjphe
+RyPWs44ShUc5yk4J1pU4JXdrWf2YSvvtoU6k42SV/dUn/TZ0d/4r0vTJZIbi4CPGVDLtYn5xuHRT
+njuOnfrTtT8UaZo7iO5uVV/7oBdl4B+YIG29eM9ao6NGp17WHKjcBbANjkBo8kZ98D8qyNJt7671
+HU0h1H7NL9pctG0CyyNCOI33SYOzBwAOB/wKlHCYdt8zklClTqTblu6kYvTlhKyV+zB1J9Layklp
+/LfzR2cd7BLD9oSVGiwT5gYFML947unGOaz9N8V6Xq8wgtrgM5BIUqyZx1xvUZ+lcpeWsNpo8Sm5
+a4tTqKmZ0jaKIQ5/eKqpx5e/oU+Xd05rU8c/Y/7Mg8nb526P7F5X385X/VeX22+nH3e+2iOBpc8Y
+XqS9rUlCEkuVR5esk1d+e1kDqys37q5Um139Dra5LTxrGtS3rR6l5KQ3csKp9njk+VCMfMcetdbX
+FaHp+o3cupNaah9nQX84KeQkuWyPm3MfpxWWDSUKsm6cWlG0qkOdK77csvyKq7xXvPfSLt+qNWx1
+a40y6nstSmWXyrb7Ssyx7CYgzB/MVSeR/DtHT3q9p3iTT9WmMFrOJHCCQgBvuHb3Ix/EMjqKzbzR
+GsLDUbm4uGubiS0kRpGVUCoquQsaqPlBz8wzyeaqalG0XhBRbqVP2WEkIMcNsaUnb6gsW/HNaujQ
+ruLT96dSFLmh7kOZrWXLy7eWnyJ5pwv2ScrPV27XNe38YaTdXAtY7pWkZigGG2s3oHK7Tntzz2qx
+qviCw0XH2udYycYXlnwc87VBbHB5xisfXf7H/wCEdbZ5f2fyz9nxn/XYOzb/ABb92d3f727+KovC
+Xm/2hc/a93nfZLPZ5ufM2eX+927uceZ97/a680vqtF051kqsY0+ZOEmlKTTitHy6fFqrOw/aSuo3
+jeXVbL+rHT2d5DqEKTwOHRxlWHf/AD3FTVl+Hv7M8qb+zNvl+c+/ZnZ5uF3bc8YxjG35fStSuKrF
+QnKKUkk9FNWl8zWLuk9PlsFFFFZjLPhP72pf9fY/9J7et+sDwn97Uv8Ar7H/AKT29b9feYH/AHWh
+/wBeaf8A6SjyKv8AEn/if5hRRRXQQZXiz/kC6l/16T/+i2rJ+F3/ACLdl/22/wDR0la3iz/kC6l/
+16T/APotqyfhd/yLdl/22/8AR0lAHV0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcp/zOf/cJ
+/wDbiij/AJnP/uE/+3FFAGfZf8vH/X3d/wDpRLT7y5WyglncErGjOQOuEG44pll/y8f9fd3/AOlE
+tPvLZb2CWByQsiMhI64cbTivWp39lG38q/I6Y/CvQ5+w8PRa/bx3mqFpnmUSKm9lihV+QI1Xbj5d
+u7OeR1q7YWUnh83BaYtZqm9A7Mz2+wfMi8ElNo454xjB61Q0/wASwaDElhqZMMsCKoIRmjlQZVGQ
+ruJ+UDOQOfyF201e81MXU1tBiJI/9HMilWuJMFg3LLhOmOOc5yORUR5NLfH1/m+Ylb5kA8U3EaLd
+T2LR2jbT53mozCOTARjEvPORkDOPep9T8QTWd8LG3tGndoRKMOEH3ipDFhhRgdfXAxzXF3z2F/pm
+Vnury7EaMQ5kdbboZm5AAXsT83b6118ciy+IldGDK2nAgg5BBl4INTGpKWnN/Lro9736CUm+vYbD
+4ourndDDp8jXMbESxF1RI1/hbzWGDu/hGOeT0wTPD4qt5LH7W0cgYSCFoQP3vn5AMag7dx5z9Pfi
+maP/AMhrV/8At1/9FmsGbTZdRs77y4vO8rVpZXiBKtJGowyqR3Of8OeKbnNK97/Etv5XuF2vx/A6
+G21+4SaKG/smtvObbG/mJLGXwTtZhjaT/CO9MuPEd0L24srWxadodhLeYsabXXdyWHB54HOeT2rG
+0qDQby5tjptm8jh1d2LSqtttG8FydylsjCjoT3rZ0f8A5DWr/wDbr/6LNEZSlZc28rXWv2W+yQJt
+216jpvEF3NLKlhYm5SJzG7mVYf3q/eUK/Jxkc1LJ4ktzYw3kKs/nsI4U+6zysSoQk8LyDk9OOM8Z
+528ubSe9u4tVnuCwmKx2cbOYpY9q+T8qZ+Zuv3h83XFWNIS0Ph6KO+gaVIpHEyqPngIkYlmAIddo
+PzY5wemM0KpJuS5ltLfo0/wDmd3r3NzTtVvJ5RFd2L2+4EowcTodvUMyD5PbPWtWuK8O3H/Exih0
+y7uLi1WP995oykeAwjVWcKRzjhQOncZ29rWlKXNHvrvp+hUXdFKx8W6X4d1O7F9cCMvBbgAK8nKN
+OxB8tWxw6nn1rU/4Wj4b/wCf3/yDN/8AG6r6LpNlqmpXn2u2hm2W9tt82NZNu57nONwOM4Fb3/CJ
+6L/0DbT/AL8R/wDxNedX/iy9TCfxMyf+Fo+G/wDn9/8AIM3/AMbo/wCFo+G/+f3/AMgzf/G61v8A
+hE9F/wCgbaf9+I//AImj/hE9F/6Btp/34j/+JrIkyf8AhaPhv/n9/wDIM3/xuj/haPhv/n9/8gzf
+/G61v+ET0X/oG2n/AH4j/wDiaP8AhE9F/wCgbaf9+I//AImgDJ/4Wj4b/wCf3/yDN/8AG653xZ8W
+47V7ZtFmjnBEgmWSKQKD+78tufLOfvdDj17V3H/CJ6L/ANA20/78R/8AxNcz4v8AhlDr8toLFbez
+RPN85kiAdtwXZhUChsEHqwxnigCg/wATLDxRZpalHguGuLXEZ+dHxcIx2yKOyrk7gvoM10VZt74F
+0nwxpwe2h3Si4tP30uHl/wCPmPocALw2PlAyOua0q+Z4j/i0v8D/ADO/BfDL1Cqep6PZ6ygju4Vk
+A6Z4ZeQflYYYZwM4NXKK8OM5QkpRbjJbNOzR1NJqzVzL0zwvpmjuZLa2VX/vEl2Xgj5S5bb15x1q
+a30OytLuS9ihCzSgh2BPzZIJ+XO3kjJOKvUVcq9WbblUm3Jcsm5N3XZiUIq1ktPIyZPCelTXLXb2
+qNIxJYnJQkjBJQnZ+nXnrV6fT4LieG4dMyQ7/LbJG3zBtbgHByPWppJFhVndgqqCWYnAAHJJJrB/
+4Ta1b547e7kh6/aFgYwBR95snDYXnPy9q0gsTiNYupPkXJe70TVuVeq6Cfs4b2V9f+Ca2paXbavC
+YLqMSJkHByMEdwRgj8Kbpmj2ejIY7SFYweuOWbkn5mOWOMnGTU1neQ6hCk8Dh0cZVh3/AM9xU1ZO
+dWMXScpKN9YXdr+ncdot81lfuY9x4P0m6uDdSWqtIzBycttZvUoG2nPfjnvWxRVXVNSh0i2kupyd
+kYycDJOTgAfUnFNzq13CDlOo/hhFty36ILRhd2S6sdBp8FvPNcImJJtnmNknd5Y2rwTgYHpUcGj2
+ttZmxjjxCVdNm5j8smdw3E7ucnvVyip9pP8Aml9nr/KrR+5bD5V2XX8dynPo9rc2YsZI8whUTZuY
+fLHjaNwO7jA71X1Xwxp2tSia7h8xwoQHe6/KCTj5WHqa1KKqNerB3jUnF3bupNay3++wnCL3SfyM
+ubR1s7e4TToYVebGY5N32Y9FbMa8DK9do54zXLHwm+puyf2RHZCRlMkpuBKRHvVmWFFBVHPY4xjI
+713tFbUcdVoXtrJu/M5Svp6SSfzTJlSjPfbtoVdS0u21eEwXUYkTIODkYI7gjBH4U3TNHs9GQx2k
+Kxg9ccs3JPzMcscZOMmrlFc/tanJ7PmlyXvy3fLfvYvlV72V+4UUUVAzJ8N/EXQLCz8qa72t51w2
+PKlPyyTySKeEPVWBrT/4Wj4b/wCf3/yDN/8AG6Twr4a0m4sd8lhbO3n3Qy0KMcLcSqoyV7AACtf/
+AIRPRf8AoG2n/fiP/wCJr9Bo29nC23LG1/Q8aXxP1Mn/AIWj4b/5/f8AyDN/8bo/4Wj4b/5/f/IM
+3/xutb/hE9F/6Btp/wB+I/8A4mj/AIRPRf8AoG2n/fiP/wCJqxGT/wALR8N/8/v/AJBm/wDjdH/C
+0fDf/P7/AOQZv/jda3/CJ6L/ANA20/78R/8AxNH/AAiei/8AQNtP+/Ef/wATQB554f8AjSY08vVr
+cuQOJYANzEbR80bFRk8kkMB2C1v6VqltrU+oXdo++J7hdrYK52wQKeGAPUHtWd4c+DNtbYk1WXz2
+/wCeURKRfxDl+HbseNuD6itmGFLe91GONQqrPGqqo2qqrbW4AAHQCvKz7/c3/jidGE/i/Jlmiiiv
+kD0jmfHscMsFilxjymvoRJk7RsIfdluMcd6yNY0vwxZ2c01pNGkyLuiaK4Z5BKvKbRvb+LHbjrx1
+rb8aRrMunI6hlbUIAykZBB3ggg1U8SaNFopi1axtYf8AR/8AWxCMYePIO5cA7XTrux06nAwfYwdX
+lp4eHtKkHKU7RjLljJ30jL12OapG7m7RdktWrtehpvrcun2NkZonlup0RREAEdpdm5iwONqg/eOP
+l9Kdp2vTTXC2l7aNayurPGC6yRyKmMhXXHz85K44HNZHjG2i1KOw1Ewm5tIg7yopKOYplXEgHB+X
+GSMj34yQ3w9a6LLfxyaTaMyorlrgtMsaNjb5aiTIZyG5Bxgc81l7Ci8O6jpy5mqjk4rSnJN2i3zp
+Lppy+hXPJT5bq2m/Vd9v1NO+8S3Cyzx2Fi90LclZXDqiBsBtqfeLsOjKBkHjvWRqfiCe/vtIuLCB
+po3Wd0QyCLzJArI6sG4BjGeec5IFTWus2/hGXUIr/ehkupZ4iEYpMsgVtqNjG5ejZwAT1puq6sYb
+nRdSv4WtkH2nzAcyeWZExGG2r1brjGevoa1pUYwmuWgpJwmoT5pfvb0pO3LfXX+XbbexMpNrWdtV
+dae77y/rU0Y73yr7Vfsdl5lxH9m3fvdvn7l4+/8AKmxc/WuU8Ow26QWV9dWBeWW8jRLg3DZkd3kJ
+kKAn7hUcH73Wur0X/kOaz/26f+izXPWH/ID0H/sIx/8AoyarotQjKCTXP9WTlzzUrSoOVrqW2m3/
+AALKWrT7e00sraTOp1HXpobhrSytGupUVXkAdY441fOAztn5+MhccjmoY/F0MtityIn81pRbiA/K
+/wBqP/LIswAH+8e3v8tVZL+Hw1q19cXpZIrpYDHKEZ4w0ashjYqp+fjIHpUWq67cX+krd+XJaQvc
+xhpA+JltCw/fLt5UscDGG49Qc1zxw0ZeyXsrwl7L97zNc0pRvKNuuunu6lubXN72q5vdttbZmnYa
+/cPcx2t/Zm1eYMYf3izCTyxlx8n3cDnnr/PC0TUbmW21o3loWi33TyEzA/OqKpt+OeFGA449Kq6e
+2nf2xp1xZyTTLulSW6m34kleMiKPfIFG8DgAAcEdatWt3FFbeILJyVm33s2wqR+6ZAFfOMc54596
+6HQhTuo07c8aUpK04uFqji7LmbXTd/dsRzuVry2cuzv7vobMniC20fSrSVYzmWKMW9upLu5KrtQH
+qcZALY/UgEs/E8ou0tNRtDZvKMwkyCVJDnBXeoADdMD/ABGcq4E1lZ6JqiRGWO0gHmqp+cJLEi7w
+O+3qf8MkSXmrxeLbuyt9OBkS3njuZpiCiIIycJ8y5LNzj/8AXtx+rU5Jv2fNF+1dStzP93KMnZdu
+2+99CudrrZ+7aNviuOt/G91cWovl0uQ2658xxIuVCthii7QXAHfgZyO2a6m3uEu4kmjOUkUOpwRl
+WGQea5LQv+RPf/r2uv5y10Ph3/kF2P8A17Q/+gLWONpUo+09nBQ9nXnS0bd0u/M3qVSlJ2u73gpG
+hRRRXAbGVq2uWeh3mmy3kvlqJpGJ2s3yiCWPPyg/xSKPxrS/4Wj4b/5/f/IM3/xuqt3YW1/faalx
+DHKpnkGJEDjH2edsYYHuoP4D0roP+ET0X/oG2n/fiP8A+Jr7DIrfUo2/mlf7zzcX/FfojJ/4Wj4b
+/wCf3/yDN/8AG6P+Fo+G/wDn9/8AIM3/AMbrW/4RPRf+gbaf9+I//iaP+ET0X/oG2n/fiP8A+Jr1
+DnMn/haPhv8A5/f/ACDN/wDG6P8AhaPhv/n9/wDIM3/xutb/AIRPRf8AoG2n/fiP/wCJo/4RPRf+
+gbaf9+I//iaAMn/haPhv/n9/8gzf/G6zfEfxU0yOwlbS7sPcgxlFaKTawDrvU7kUYKZ7g+nNdR/w
+iei/9A20/wC/Ef8A8TWZ4j8BafqthLbWlra28rmPEqworIodWcjaoOdoPGRnpkUAcqfizZ63pN7a
+3kZgne1lRSoLxSO0e0AY+ZSzE8HgDq1dVWPN8N9J8OaLfyeX9onW0mPmygHawjzmNPurhlyp5Yf3
+q2K+d4k/5h/+4n/tp24H7f8A27+oUUUV86dpn6r4fsNax9rgWQjGG5V8DPG5SGxyeM4pun+G9N0t
+XS3tkUOCrZG8srYypZ9x2nH3elaVFa+3qqHs/aT5P5eZ8v3E8kb3sr97FPStHtdFiMNpH5aFi5G5
+m+YgDPzE+gqra+E9KspzcxWqB85BOWCnO7KqxKrg9MAY7U3U/FFvp1wLVYpriXbvZLdPNaNeMF+R
+jOf85GbGja5b64jtDuVo2KSRyDbLGwPRl59P8kGtWsXGEqrdRRqW5pcz95Pbm/4JP7ttR928dl2L
+EGnwW881wiYkm2eY2Sd3ljavBOBgelVdV8N6frbI93AHZBgNlkOOuMoRn8azbfxzFdoJIdPv5EOc
+MkAZTg44IetbStattZVzAx3RnbJGwKSRP/ddT+XpkHniiVLF4d+0fPBx93mUtY/ZtdbdgUqc/d0d
+9bFiOygih+zpEixYI8sKAmG+8NvTnPNZ+m+FNL0iYT21uFcAgMWZ8Z643scfWrmoalDpoiMpP72V
+IUAGcvIcD/E/41arJVK0Iu0pxjVvfVpT737lcsW9leP4BVez0+Cw83yU2+bI0r8k7pH+83JPp2qx
+VPVtWt9Et2ubltqrwAPvO3ZVHcn/AOueKmCnN8kLtzaXKuvYbstX06li4t0u4nhkGUkUowyRlWGC
+OKLe3S0iSGMYSNQijJOFUYA5rL0zxRb6jcG1aKa3l271S4TymkXnJTk5xj/ODg1XxPFpd0LT7Ncz
+SGMS4gjEmELFefmB6j0rX6vX5vZcsr25+Xp69ieeFua67XC38H6Ta3Auo7VVkVi4OW2q3qELbRjt
+xx2qxqvh+w1rH2uBZCMYblXwM8blIbHJ4ziqtn4striZIJop7V5DiMXEZi809wp5HHHXHUYrap1Z
+4qlOMqk6iml7snJ3t5MIqnJNJRt1VijJodlJZfYDCPIwBsBK/dO7qCD1GSc896vUUVhKcpfFJvVy
+1fV7v5lJJbIKKKKkZl6V430bQrjUIbu6CObkMAEeTgQwoeY1YcMpBHtWj/wtHw3/AM/v/kGb/wCN
+03QND0/UpdRkurSCZhdKoaSJJGC/Z7c4ywPHNbH/AAiei/8AQNtP+/Ef/wATX3mC/wB1of8AXqn/
+AOko8ir/ABJ/4n+Zk/8AC0fDf/P7/wCQZv8A43R/wtHw3/z+/wDkGb/43Wt/wiei/wDQNtP+/Ef/
+AMTR/wAInov/AEDbT/vxH/8AE10EHM+IfiP4fvtMvbeG83PLbzIg8qUZd0ZVGTHjrWh8Lv8AkW7L
+/tt/6OkrW/4RPRf+gbaf9+I//ia0oYUt0WONQqqAqqo2qqrwAAOgFAD6KKKACiiigAooooAKKKKA
+CiiigAooooAKKKKAOU/5nP8A7hP/ALcUUf8AM5/9wn/24ooAz7L/AJeP+vu7/wDSiWrNVrL/AJeP
++vu7/wDSiWrNevS/hw/wr8jpj8K9AoooqxhRRRQAUUUUAFFFFABRRRQAUUUUAWvC/wDyEr7/AK97
+X/0O5rqK5fwv/wAhK+/697X/ANDua6ivKxH8WXqc8/iYUUUVkSFFFFABRRRQBi+MP+Qd/wBvFp/6
+Uw1Rq94w/wCQd/28Wn/pTDVGvmeI/wCLS/wP8zvwXwy9QooorwTrCiiigDn/ABp+9gs7duY7i9gi
+lX+9GSWK56jlR0roKq6ppsOr20lrODskGDg4Iwcgj6EZrHjtvEyDyTcWbLkjzij+dtJ+9sGE3AdB
+09SetdUVGtRhDnjB05Sup6X5rar7rP5fLN3jJuzd0tvIk1q3TRNPYWsgtYTKDMwLkxxSNh/IAD7W
+JPygDAyTx1rG0TVhDqltBaXF5cQXAlDSXWWRvKXcDAzBT8pyr8f0Natx4VaLT4YLaQNPDOlyJJeB
+NOGyzS7QWOQT79Oaamj6vc31pfXktsTbs6iKIOqeXKpVn3sCxfp8uMcdRXXTqUfZVFKopuXtVeWj
+k+X3Haze/Vy0M5KXNGyt8O3rqVhZXGtaxqUDX1zDFD9nISF9h3PH2Y5wOuQByTk9Ky/EUk7adqlj
+NPJL9iktmSQkBpI5toWOTA+bb13Hq2D2rQjTUjrmqtp7wgj7MHScNsYGPhgyfMCuOnQ59hV278KS
+3thepJKpurzY0jgERBoiCkar2Rcbd33u5z0rWNWFCpSdSUOVRwzjFL3ou0HKT0/l5vv+6XFzjKyd
+7zv2e9kE8cul6jo1otxNIh+1bzI5ZpMJuXf03bc8ccVY+0S/8JF5O9vL+wb9mTs3+bjdt6Zxxmo9
+Q0fUr5LO682FL22ZyAAxtnWQ7WU7gX+4Bz9fYg0rR9STVDqF9LC262MO2IMAh3hgF3DkcZyTnJx0
+FczdNw5pTg5KlUhJdXNzlK607Pcu0k7JO3Mn8rFLwRZXF7a22oXF9cyN+8AjL/utu50+cHJc5yck
++g7VjwaxdaupvGOqhyzmIW0ataooY7FI483b/ETjPTtXY+GNKl0XTobSYqXj35KElfmdm4yB6+lZ
+sGgaro7SW+mXES2rnKiYM8ltuzu8rs3qAx69e5O0cTSlWxDbp35/3TkrR9mpSutE+66akuElGG+3
+vd76Gt4furi9sIJbqNo5SuHVxtbcpK7iuFxuxuxjvWhVfT7U2NvFC0jSMigM7kszt/Ex3Fjye2eO
+lWK8uq4yqTcUlFydktrXOiN0lfewUUUVAwooooAveD/+Qd/28Xf/AKUzVtVi+D/+Qd/28Xf/AKUz
+VtV+gUP4VP8AwR/I8efxP1YUUUVoSFFFFABXI/8AMR1P/r4T/wBJreuurkf+Yjqf/Xwn/pNb15Wf
+f7m/8cTown8X5Mmooor5A9IKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAh/wCY
+jpn/AF8P/wCk1xXXVyP/ADEdM/6+H/8ASa4rrq+vyH/c1/jkebi/4vyQUUUV6pzhRRRQAUUUUAZX
+iz/kC6l/16T/APotqzK0/Fn/ACBdS/69J/8A0W1ZlfO8Sf8AMP8A9xP/AG07cD9v/t39Qooor507
+QooooAq3MlppazXkuyIYBlkwAW28LuI5b0A/AVn6BZzG4vNRmQxfazGVib76JEu1S/ozdSv8PTOa
+q6zpWs3l+k8JtGhhwYY5jJgSY5kZUHLjkLzwOgzzWppP9qfvP7R+zfw7PI3++7d5n4YxXY4qnQbj
+UhKVSMVP3tVG6ail8lf+r5J809U0ovT17mf4A/5Adr/20/8ARj02GMQeJ5QmQJbFZJBk4Z1kEatj
+pwox/wDrNVNH0rxFotrHaQmwKR7sFzKW+Zi3OAPX0rX0DRptN86a7mE1xOUMrhdg+RQqqAOPl55w
+M9xW1eUIVMTVVSElWc1GMXdvnlfX03Jgm4048rXLa7fkjN8dWf2r+zf3siZvYo/kbbjzM/P/AL67
+flPbJp2p/a7q8t9Ft7h4kWBZpp9xNw6I3l7VbHDEjJb/APU2h4k0qfVYYPszossE8c6eZnYxjzw2
+3kdf89ar6nol5ctb39tKkV7Eio/LfZ5U6vGw5O3JJB6/jgqUa0PZ0YynFOHtFHmV+Wb1jJ+QSi+a
+TSevLt1XUr2f2vw9qkFi9w9zBdhyhmYtNE8K7m+bHKn0/wADu6Ka3iuNvmIr7GDruAba69GGehHr
+WLpuiXkt6NQ1SVHljBWCOEsIYgwwzfNyWb3/AMNt7XLC41C322tw0EqMHRgflLL/AAyDuh7j9D0r
+Gu4VKtNc8VLlSqVIq0ea7108rJ6FQuovR2v7setjJuTPa6vb3OpBDEXeG0aIn93JL081SMlnUYyC
+VGOnOam/5mf/ALh3/taiPSdU1OeB9TkthHbyCVY4Ff55ACFZmcgjYeRjr3o1XStU/tQX9gbb/j2E
+BE5f++XJAQfTvW3NBtQc4KXsJQun7i10X+f+dybPeztzp+Y3x/GP7IlmGQ8LxSRsCVKPvVdwx7Ma
+6Kudi0bVdSuYZdUmg8qB1kSGBWw0qhtrl3ww2kjjkH0roq5q7jClTpKSm4ucm47Ln5fd/wDJb/Mu
+F3KUrWvZa+XUKKKK5jQKKKKALPhP72pf9fY/9J7et+sDwn97Uv8Ar7H/AKT29b9feYH/AHWh/wBe
+af8A6SjyKv8AEn/if5hRRRXQQFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQByn/M5/8A
+cJ/9uKKP+Zz/AO4T/wC3FFAGfZf8vH/X3d/+lEtWahSw1K1edf7PmcG4uHVleDaySzPIpG6ZT0Yd
+RT/J1L/oGXH/AH3bf/JFelTr01CKclpFG8ZxSWvQfRTPJ1L/AKBlx/33bf8AyRR5Opf9Ay4/77tv
+/kir+sUv5kVzx7j6KZ5Opf8AQMuP++7b/wCSKPJ1L/oGXH/fdt/8kUfWKX8yDnj3H0UzydS/6Blx
+/wB923/yRR5Opf8AQMuP++7b/wCSKPrFL+ZBzx7j6KZ5Opf9Ay4/77tv/kijydS/6Blx/wB923/y
+RR9YpfzIOePcfRTPJ1L/AKBlx/33bf8AyRR5Opf9Ay4/77tv/kij6xS/mQc8e4+imeTqX/QMuP8A
+vu2/+SKPJ1L/AKBlx/33bf8AyRR9YpfzIOePcu+F/wDkJX3/AF72v/odzXUVzfhiyu4bu7nuLZ4F
+eKBFDtGxYxtOzf6p3/vjrXSV51ZqVSTW1zCbvJhRRRWZIUUUUAFFFFAGL4w/5B3/AG8Wn/pTDVGt
+LxRaz3lgyW8ZkcS27hAVUsIpo5GwXZV+6p6msf8A4mP/AEDLj/vu2/8AkivAzzCV8TUpulTlNKLT
+t6nZhKkIRlzO2pNRUP8AxMf+gZcf9923/wAkUf8AEx/6Blx/33bf/JFeP/ZeM/58zOn6xS/mRNRU
+P/Ex/wCgZcf9923/AMkUf8TH/oGXH/fdt/8AJFH9l4z/AJ8zD6xS/mRNRUP/ABMf+gZcf9923/yR
+R/xMf+gZcf8Afdt/8kUf2XjP+fMw+sUv5kTUVD/xMf8AoGXH/fdt/wDJFH/Ex/6Blx/33bf/ACRR
+/ZeM/wCfMw+sUv5kOS3iid5FRQ8mN7AAM+0YXce+O1SVD/xMf+gZcf8Afdt/8kUf8TH/AKBlx/33
+bf8AyRTeWY170Zh7el/Miaiof+Jj/wBAy4/77tv/AJIo/wCJj/0DLj/vu2/+SKX9l4z/AJ8zD6xS
+/mRNRUP/ABMf+gZcf9923/yRR/xMf+gZcf8Afdt/8kUf2XjP+fMw+sUv5kTUVD/xMf8AoGXH/fdt
+/wDJFH/Ex/6Blx/33bf/ACRR/ZeM/wCfMw+sUv5kTUVD/wATH/oGXH/fdt/8kUf8TH/oGXH/AH3b
+f/JFH9l4z/nzMPrFL+ZE1FQ/8TH/AKBlx/33bf8AyRR/xMf+gZcf9923/wAkUf2XjP8AnzMPrFL+
+ZGp4P/5B3/bxd/8ApTNW1WT4XtZ7OwVLiMxuZbhyhKsVEs0ki5KMy/dYdDWtX2lFONOCe6jFfgeX
+LWT9QoooqxBRRRQAVyP/ADEdT/6+E/8ASa3rrq5K6tb+3v750sZZUllR0dHhAIEMMZ4kmRvvIe1e
+dnFGpXwrhTi5S5ouyN8NJQqXk7KzJaKh/wCJj/0DLj/vu2/+SKP+Jj/0DLj/AL7tv/kivmf7Lxn/
+AD5md31il/Miaiof+Jj/ANAy4/77tv8A5Io/4mP/AEDLj/vu2/8Akij+y8Z/z5mH1il/Miaiof8A
+iY/9Ay4/77tv/kij/iY/9Ay4/wC+7b/5Io/svGf8+Zh9YpfzImoqH/iY/wDQMuP++7b/AOSKP+Jj
+/wBAy4/77tv/AJIo/svGf8+Zh9YpfzImoqH/AImP/QMuP++7b/5Io/4mP/QMuP8Avu2/+SKP7Lxn
+/PmYfWKX8yJqKh/4mP8A0DLj/vu2/wDkij/iY/8AQMuP++7b/wCSKP7Lxn/PmYfWKX8yJqKh/wCJ
+j/0DLj/vu2/+SKP+Jj/0DLj/AL7tv/kij+y8Z/z5mH1il/Miaiof+Jj/ANAy4/77tv8A5Io/4mP/
+AEDLj/vu2/8Akij+y8Z/z5mH1il/Miaiof8AiY/9Ay4/77tv/kij/iY/9Ay4/wC+7b/5Io/svGf8
++Zh9YpfzImoqH/iY/wDQMuP++7b/AOSKP+Jj/wBAy4/77tv/AJIo/svGf8+Zh9YpfzIP+Yjpn/Xw
+/wD6TXFddXJWtrf3F/Yu9jLEkUru7u8JABhmjHEczt95x2rra+myejUoYVQqRcZc0nZnDiZKdS8X
+dWQUUUV6JgFFFFABRRRQBleLP+QLqX/XpP8A+i2rMrY8Q2st9pl7bwrueW3mRBkDLujKoyeOtYP/
+ABMf+gZcf9923/yRXh57ha2J9j7KDny897dL8p14SpGHNzO17fqTUVD/AMTH/oGXH/fdt/8AJFH/
+ABMf+gZcf9923/yRXif2XjP+fMzq+sUv5kTUVD/xMf8AoGXH/fdt/wDJFH/Ex/6Blx/33bf/ACRR
+/ZeM/wCfMw+sUv5kTUVD/wATH/oGXH/fdt/8kUf8TH/oGXH/AH3bf/JFH9l4z/nzMPrFL+ZE1FQ/
+8TH/AKBlx/33bf8AyRR/xMf+gZcf9923/wAkUf2XjP8AnzMPrFL+ZE1FQ/8AEx/6Blx/33bf/JFU
+rvVbq0urW0fTpxJcmTYpeD5hEu98ETEccfeI/pR/ZeN/58zD6xS/mRp0VD/xMf8AoGXH/fdt/wDJ
+FH/Ex/6Blx/33bf/ACRR/ZeM/wCfMw+sUv5kTUVD/wATH/oGXH/fdt/8kUf8TH/oGXH/AH3bf/JF
+H9l4z/nzMPrFL+ZE1FQ/8TH/AKBlx/33bf8AyRR/xMf+gZcf9923/wAkUf2XjP8AnzMPrFL+ZE1F
+Q/8AEx/6Blx/33bf/JFH/Ex/6Blx/wB923/yRR/ZeM/58zD6xS/mRNRUP/Ex/wCgZcf9923/AMkU
+f8TH/oGXH/fdt/8AJFH9l4z/AJ8zD6xS/mRf8J/e1L/r7H/pPb1v1h+FrW5t1vHuIWhMtxvVWZGb
+YIYY8ny3cdUPetyvsMJGUMPRjJWlGnBNdmoo82o05ya6yYUUUVuQFFFFABRRRQAUUUUAFFFFABRR
+RQAUUUUAFFFFABRRRQByn/M5/wDcJ/8Abiij/mc/+4T/AO3FFAHV0UUUAFFFFABRRRQAUUUUAFFF
+FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
+AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
+UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVyniL/kZPD//
+AG/f+iVrq65TxF/yMnh//t+/9ErQB1dFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
+UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcp/wAzn/3Cf/biij/mc/8AuE/+3FFAHV0UUUAFFFFA
+BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRWT4oup7OwZ7eQxuZbdA4CsVEs0
+cbYDqy/dY9RWP/xMf+gncf8AfFt/8j1x4vMaGClGNVyvJXVlc1p0Z1U3HoddRXI/8TH/AKCdx/3x
+bf8AyPR/xMf+gncf98W3/wAj1zf29g+8/wDwEv6pV8vvOuorkf8AiY/9BO4/74tv/kej/iY/9BO4
+/wC+Lb/5Ho/t7B95/wDgIfVKvl9511Fcj/xMf+gncf8AfFt/8j0f8TH/AKCdx/3xbf8AyPR/b2D7
+z/8AAQ+qVfL7zrqK5H/iY/8AQTuP++Lb/wCR6P8AiY/9BO4/74tv/kej+3sH3n/4CH1Sr5feddRX
+I/8AEx/6Cdx/3xbf/I9H/Ex/6Cdx/wB8W3/yPR/b2D7z/wDAQ+qVfL7zrqK5H/iY/wDQTuP++Lb/
+AOR6P+Jj/wBBO4/74tv/AJHo/t7B95/+Ah9Uq+X3nXUVyP8AxMf+gncf98W3/wAj0f8AEx/6Cdx/
+3xbf/I9H9vYPvP8A8BD6pV8vvOuorkf+Jj/0E7j/AL4tv/kej/iY/wDQTuP++Lb/AOR6P7ewfef/
+AICH1Sr5feddRXI/8TH/AKCdx/3xbf8AyPR/xMf+gncf98W3/wAj0f29g+8//AQ+qVfL7zrqK5H/
+AImP/QTuP++Lb/5Ho/4mP/QTuP8Avi2/+R6P7ewfef8A4CH1Sr5feddRWT4Xup7ywV7iQyOJbhC5
+CqWEU0ka5CKq/dUdBWtXqRkpxUls1f7zBqzsFFFFMQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
+UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
+QAVyniL/AJGTw/8A9v3/AKJWurrwXxR4k8QaVrGy5u981i8ghk8qJfkmUDdtVSPnTBwc4+tAHvVF
+Z+gR30VhbjUZPMuNmZTtVcO3zbcR/L8uduR1xmtCgAooooAKKKKACiiigAooooAKKKKACiiigAoo
+ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOU/5nP8A7hP/ALcUUf8AM5/9wn/24ooAiHiD
+Vrh5jHJaqqzzxqGgkdtsMrxjLC4XJO30FO/tnWv+e1p/4DSf/JNUrL/l4/6+7v8A9KJas16NPDUp
+Qi3HVxXVm8YRaWnQk/tnWv8Antaf+A0n/wAk0f2zrX/Pa0/8BpP/AJJqOiq+q0f5fxY/Zx7En9s6
+1/z2tP8AwGk/+SaP7Z1r/ntaf+A0n/yTUdFH1Wj/AC/iw9nHsSf2zrX/AD2tP/AaT/5Jo/tnWv8A
+ntaf+A0n/wAk1HRR9Vo/y/iw9nHsSf2zrX/Pa0/8BpP/AJJo/tnWv+e1p/4DSf8AyTUdFH1Wj/L+
+LD2cexJ/bOtf89rT/wABpP8A5Jo/tnWv+e1p/wCA0n/yTUdFH1Wj/L+LD2cexJ/bOtf89rT/AMBp
+P/kmj+2da/57Wn/gNJ/8k1HRR9Vo/wAv4sPZx7Gn4d1e9vrm5t7swt5UcLqYo2j/ANaZVIIaST/n
+mK365fwv/wAhK+/697X/ANDua6iuCtFRqSS2TMZKzaQUUUVmSFFFFABRRRQBi+MP+Qd/28Wn/pTD
+VGr3jD/kHf8Abxaf+lMNUa+Z4j/i0v8AA/zO/BfDL1CiiivBOsKKKy9Q1WW01HT7RQpS48/eSDuH
+lIGXbz+fFXTpyqNqO6jKXyinJ/ghNqKu+6X36GpRWX4n1WXRdOmu4QpePZgOCV+Z1XnBHr603XNZ
+msJba1tYRJPclxHubbGnljLM/c4znA6jPOcZuGHnUUXG3vOaWtvgSlK/omJzUb36W/HRGtRXNyax
+q+ilZtUitmtujyW5fdCWKqrMshywyeijPf2PSUqtGVKzbjKMr2lF3Wm69QjJSvurdGFFZOi6y18t
+89xsRbe6miDD5R5cWDuYsT68npVyPVbOaVYUuImdgCqCRS5BG8EKDn7vP05onRnCTi4t8u9tfMFJ
+NJ33LVFV4dRtbiVoY543kTO5FdWddpwcqDkYPFNutVs7FglxcRRMRkK8iocdM4Yj0qfZzb5eWV97
+W1Hdb3LVFFU4tZsJ8eXdQtllT5ZFPzvnavB6nBwKShKV2k3beyBtLdlyiobq9gsVD3EqRKTgM7BB
+nrjLY9KkjkWZVdGDKwBVgcgg8ggilyu17O3cL9B1FFFIYUUUUAXvB/8AyDv+3i7/APSmatqsXwf/
+AMg7/t4u/wD0pmrar9Aofwqf+CP5Hjz+J+rCiiitCQooooAKKKKACiiigAooooAKKKKACiiigAoo
+ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAo65evpun3d1GAWhglkUN90tGh
+YZxjjisT+0ta/wCe9p/4DSf/ACVWp4s/5Aupf9ek/wD6LasyvGzvG18H7H2M+Tn5+bRPbltun3Or
+C0oVObmV7WE/tLWv+e9p/wCA0n/yVR/aWtf897T/AMBpP/kqlorxf7ax/wDz+/8AJIf/ACJ0/VaP
+8v4sT+0ta/572n/gNJ/8lUf2lrX/AD3tP/AaT/5KpaKP7ax//P7/AMkh/wDIh9Vo/wAv4sT+0ta/
+572n/gNJ/wDJVH9pa1/z3tP/AAGk/wDkqloo/trH/wDP7/ySH/yIfVaP8v4sT+0ta/572n/gNJ/8
+lUf2lrX/AD3tP/AaT/5KpaKP7ax//P7/AMkh/wDIh9Vo/wAv4sT+0ta/572n/gNJ/wDJVc/r3hm4
+8R3tte3U1vvg2jAt3McqK28JIr3DArnPTGcnPbHQ0Uf21j/+f3/kkP8A5EPqtH+X8WJ/aWtf897T
+/wABpP8A5Ko/tLWv+e9p/wCA0n/yVS0Uf21j/wDn9/5JD/5EPqtH+X8WJ/aWtf8APe0/8BpP/kqj
++0ta/wCe9p/4DSf/ACVS0Uf21j/+f3/kkP8A5EPqtH+X8WJ/aWtf897T/wABpP8A5Ko/tLWv+e9p
+/wCA0n/yVS0Uf21j/wDn9/5JD/5EPqtH+X8WJ/aWtf8APe0/8BpP/kqj+0ta/wCe9p/4DSf/ACVS
+0Uf21j/+f3/kkP8A5EPqtH+X8WJ/aWtf897T/wABpP8A5Ko/tLWv+e9p/wCA0n/yVS0Uf21j/wDn
+9/5JD/5EPqtH+X8WaHhzUrrUFulujGWhn8sGNGjVlMUUv3Wd+fnx1rYrA8J/e1L/AK+x/wCk9vW/
+X1uFnKph6U5O8pU4Sb82jzqiUZyS2UmFFFFbEhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
+UUUAcp/zOf8A3Cf/AG4oo/5nP/uE/wDtxRQBn2X/AC8f9fd3/wClEtWarWX/AC8f9fd3/wClEtWa
+9el/Dh/hX5HTH4V6BRRWJ9ol/wCEg8ne2z7Du2ZOzf5uN23pnHenKXLbzdht2Nuiobu7isInnncI
+iDLMe3+ewrMtPE8VxKkUtvc2+87UaePy0Z+yBsn5j2ocop2bC6Rs0Vkan4lt9LuRatHNJK0YkVYk
+3lxkjAGeowT6YHWrGl6zDq29UWSN48eZHKhSRN2duQeOQM8GhTi3y31C62L9FYng24lutJt5JXZ2
+PmZZiWY4kcck0aVcSyatqkbOxVPs+xSSVXdGSdo7Z70lO6g7fH/lcV9vM26K47RkfxMrPc6jcRXC
+s4a3hfyPJVW6FMEnGfvH/dPIre0WO+tRJbXZ80RbRHOcBplI53LuYgqeMnr+pUKnPZ2dns/8wUr9
+DTooorQZa8L/APISvv8Ar3tf/Q7muorjNF1ay0vUrz7Xcww77e22+bIse7a9znG4jOMit7/hLNF/
+6CVp/wB/4/8A4qvKxH8WXqc8/iZq0Vlf8JZov/QStP8Av/H/APFUf8JZov8A0ErT/v8Ax/8AxVZE
+mrRWV/wlmi/9BK0/7/x//FUf8JZov/QStP8Av/H/APFUAatFZX/CWaL/ANBK0/7/AMf/AMVXM+L/
+AImw6BLaGxa3vEfzfOVJQXXaF2YZCwXJJ6qc44oA6Hxh/wAg7/t4tP8A0phqjWbe+OtJ8T6cEtpt
+spuLT9zLhJf+PmPoMkNwuflJwOuK0q+Z4j/i0v8AA/zO/BfDL1CiiivBOsK53XpFi1vRi7BRm5GS
+ccsiqo/EnAroqp6tpNvrdu1tcruVuQR95G7Mp7Ef/WPFbYapGlUvO/K4zg7bpTi43+VyZxco6b3T
++53Mn4gyKmiXAZgCxjCgnG471bA9eATU2uW9lq91Dp9wJI5dpmgmQhCrIw3LG5/j7kY6c9hRaeEb
+e3uI7mae5uWiyYxcSeasbHHzKNo54/r1Aq9qui22sqgnU7ozujkUlJIn/vIw/P0yBxxXRGtSpezh
+Gc/cdSftIqzUppJWXVLl1IcZS5m0tbK3kv8AhzC1NtV8K27Xn2wXUMRVTFLGFfy2YKD5qcs/QZYY
+6nHaurrBt/BttHPFcT3F1ctEd0YnlLhHyG3DAX+79Pat6s8VUpzUFFqU1zc01BU072srLtrr5jpq
+SvfRdFe5x1j/AMgvxD/1833/AKAKp6po9nZ+GIbuGFUmSO3lWVfllEjsmW3j5v4j347dBXVxaBBD
+BeW4Z9t28ryEkZBnG1tvy/lnNF3oEF5po012cRBI03AjfiLaV524/h54rpjjoRqRalJR9vCcrdYJ
+JMh0m4tWV+Rpepia/o9npD6VJaQrC4vYYtyfKzRuCGViPvZxzuz39TVf7M1/dXq2dhDc/wCksGur
+tldUkVV3R7Ngk2L91cE+ucV1OpaVFqnkeYWHkzJOu0gZePOAcg8c1n3XhG3up5ZfPuY0mbdJDHJ5
+cEhICtuVV/jx83OTSo4yHIlUnJzUZLmlzS+1fo0399u4SpO75UrX8uxzBmM/hjTIZpSsc10kMrEj
+iESSfxNnG3YMemPStbxPo1lZS6XNBbxxP9vgTMahMqxJIO3GfujrV2/0eLTNMNnHayXduZMtEHCv
+HFkynZjaz7WHC53HPWsKz0d9UvLRkj1HEEyyvLfMP3apltkaZGfMYDcf4cCumFWNRyqxm6dONSvO
+2lpKe11ffp+VyHFq0WuZtRXpYkvre61XX71IkspWhjhVVuwzbY2UOdip1+ZuSemQO9a/hLT59Mlv
+YpntRudJPJtySIXcfNlWG5dwCkDOPTAq9rHh231h4pmeSGWPIWWFvLl2kEFd2Dxz/nJzY0rSYNHi
+McO47mLuzsXeSQgBnYnucc4rkrYyE8OqadvchDk5dnC2vNfrbt1NI0mp3fdu9+5cooorzzYKKKKA
+L3g//kHf9vF3/wClM1bVcn4V8S6Tb2OyS/tkbz7o4aZFOGuJWU4LdwQRWv8A8JZov/QStP8Av/H/
+APFV+gUdKUP8EfyPHl8T9WatFZX/AAlmi/8AQStP+/8AH/8AFUf8JZov/QStP+/8f/xVaEmrRWV/
+wlmi/wDQStP+/wDH/wDFUf8ACWaL/wBBK0/7/wAf/wAVQBq0Vlf8JZov/QStP+/8f/xVH/CWaL/0
+ErT/AL/x/wDxVAGrRWV/wlmi/wDQStP+/wDH/wDFUf8ACWaL/wBBK0/7/wAf/wAVQBq0Vlf8JZov
+/QStP+/8f/xVH/CWaL/0ErT/AL/x/wDxVAGrRWV/wlmi/wDQStP+/wDH/wDFUf8ACWaL/wBBK0/7
+/wAf/wAVQBq0Vlf8JZov/QStP+/8f/xVH/CWaL/0ErT/AL/x/wDxVAGrRWV/wlmi/wDQStP+/wDH
+/wDFUf8ACWaL/wBBK0/7/wAf/wAVQBq0Vlf8JZov/QStP+/8f/xVH/CWaL/0ErT/AL/x/wDxVAGr
+RWV/wlmi/wDQStP+/wDH/wDFUf8ACWaL/wBBK0/7/wAf/wAVQBq0Vlf8JZov/QStP+/8f/xVH/CW
+aL/0ErT/AL/x/wDxVAGrRWV/wlmi/wDQStP+/wDH/wDFUf8ACWaL/wBBK0/7/wAf/wAVQBq0Vlf8
+JZov/QStP+/8f/xVH/CWaL/0ErT/AL/x/wDxVAGrRWV/wlmi/wDQStP+/wDH/wDFUf8ACWaL/wBB
+K0/7/wAf/wAVQBq0Vlf8JZov/QStP+/8f/xVH/CWaL/0ErT/AL/x/wDxVAGrRWV/wlmi/wDQStP+
+/wDH/wDFUf8ACWaL/wBBK0/7/wAf/wAVQBq0Vlf8JZov/QStP+/8f/xVZniPx7p+lWEtzaXVrcSo
+Y8RLMjM6l1VwNrE52k84OOuDQBp+LP8AkC6l/wBek/8A6Lasyseb4kaT4j0W/j8z7PO1pMPKlIG5
+jHjEb/dbLNhRwx/u1sV87xJ/zD/9xP8A207cD9v/ALd/UKKKw9XuJYtY0mNXYJJ9p3qCQr7YwV3D
+vjtXg0qbqycU7WjOX/gEXL9DrlLlV/NL73Y3KK52fxzaRNOi291Ibd3SXy4wwj8v+Nm3YCnBx9Dn
+FOn8cWEOHRZpYfk3zxxloIy+OHbjkbhkYzzjrxWv1HE6fupai9rD+ZHQUVn6jrlvp0UcnzTGX/VJ
+CPMklGNxKAdQF5J6fpTdK16HVWeLy5YJVG7yp08uQoeN4GTlc8Z9fwrP2FXkdTlfKuv4D543tfU0
+qKw7jxhawSuiw3MiRMUlljhZoYWQ4cO3H3epwDxUieKrN7CK/wASBJmKRps3SvICwCBU3cttOOap
+4Sukn7OXvNJadXr+gvaQ7rQ2KKy9K8RQapKYPKmhlCl/LnjMbmMELvHUYycda1KzqU50pcs04spS
+UldMKK4rwxocutadDdzalfh5N+Qk5C/K7LxkH09a6GG4i0V7PTmeaZ5vN2SSEO37seY29uPXA4re
+thlTnKnCftJwclKKi18F+Z38rERqOSTasna2vc1KKp/2rF9v+wYbzPJ8/OBs2btmM5znPtVG88VQ
+20zwxW11c7DtdreLzER+6Fsj5h3Hb61lHD1Zu0Yt+7zfJ9SnOK3fkbVFYsmq2l3d6Y8U0rCcTGLy
+2Ahk2p83nKefl/hHY9adqfii3064FqsU1xLt3slunmtGvGC/IxnP+cjNLDVW4xjGTk4uVrWtaTi/
+yF7SKu29L2NiisOTxnp0dlDf7mMUsgiOBlonILHzFzxtxzjPtnNSaZ4ot9RuDatFNby7d6pcJ5TS
+Lzkpyc4x/nBwPCV1GUnTklG99NuXf7g9pBtK61NiiiisCyz4T+9qX/X2P/Se3rfrA8J/e1L/AK+x
+/wCk9vW/X3mB/wB1of8AXmn/AOko8ir/ABJ/4n+YUUUV0EBRRRQAUUUUAFFFFABRRRQAUUUUAFFF
+FABRRRQAUUUUAcp/zOf/AHCf/biij/mc/wDuE/8AtxRQBn2X/Lx/193f/pRLVmq1l/y8f9fd3/6U
+S1Zr16X8OH+FfkdMfhXoFc3c3kFl4iDzypGpsMAuwQZ83plq6SqtzpdpesHnt4pGAwC6K5x6ZYUT
+i5JW6O42rmbr2q28+l3b2xiuiiDKqVlC5PDsuGHy/e5Hauf1F0a504vqn2yU3kOFTasSxg/eKR5G
+7J6k8g+1dlDpdpbK6RW8SLIMOFRVDjnhgBz1NNTSLGNHjW2hCvjeojUK23kbhjnHaonTlPVtbefQ
+lxbMW8v7fT/EatcSLGGsdoZjtXd5pbBPQcKetTWci6jrkl1bsJIUtBC0inKeaX8zaG/i+Xk46d6s
+z6J9q1M3UqxvCbUQlGG4lxJ5mSpGMf1rTgt4rVBHEioozhVAVRnngCnGEm3fbmv5gk/xOZ8Jarba
+ZZCwvJFt5rdmV1lYJnezOCpJwwwe38iCZNBml1C41S/tVwk3lrA0gKo7woyZwPm27v8AOcity50u
+0vWDz28UjAYBdFc49MsKsRxrEqoihVUAAAYAA6ACiNOS5U3pDbvtYai9PI5aO40LxBAsmoLBHOCB
+MrnyJRKg2sM7gxX05PvyOJ/CEwle8FvK8lmrxrblyTt+TLou/wCYKuVAz/jW1c6XaXrB57eKRgMA
+uiucemWFWI41iVURQqqAAAMAAdABRGm1JN206pav1BR1uOooorUZSsfCWl+ItTuzfW4kKQW5BDPH
+y7TqSfLZc8Io59K1P+FXeG/+fL/yNN/8cp/hf/kJX3/Xva/+h3NdRXlV/wCLL1OefxM5T/hV3hv/
+AJ8v/I03/wAco/4Vd4b/AOfL/wAjTf8AxyurorIk5T/hV3hv/ny/8jTf/HKP+FXeG/8Any/8jTf/
+AByurooA5T/hV3hv/ny/8jTf/HK5rxf8J0uJbRNEt0iB83z3eVii4CmPO9nbn5h8q/WvUKKAPPZf
+h5pnhWwWZAZrgT2g85+o3XEAbYo4UdfVsEjcRW1V7xh/yDv+3i0/9KYao18zxH/Fpf4H+Z34L4Ze
+oUUUV4J1hRRRQAViyeNNGjm8k3ibsgZAZk+b/poAU78nPHeo/GUjG2t7UMVW6uoreRlOHEchJbaf
+fGOcjGeK2I7KCKH7OkSLFgjywoCYb7w29Oc810xp0oU4zqqcudtRUGo2UerbT+4huTbUbK3fUkjk
+WZVdGDKwBVgcgg8gginVg3Vq/hrTxDYuEQy48yZk2WkUrfMw3bd+0n5QxJyep6VnaR4hlj1SKwbU
+EvxKHyyxiLySi71wyZV9wyD6Y/Cqjg3UjOdKSlGPM1o+bljq27Jpad36CdVRaUlZu33s6+oby8h0
++F553CIgyzHt/nsK515tW1PVb+0trxYIoPJIJiWRwZEztGccHkkk54GO9ZXiW+vLnS9Rs7iVTJZy
+Qb3RMLPDLt2Zyflfd8zY44wOKujgHOpTjKpD3vZuSjzc0Y1OWz+G32kKVaybSenNbs3H/hjvaK5+
+S5vtOvtKs5bnzfN+0+c3lqnmbF3pwM7duex5qx/aE/8Ab32Pf+6+xebtwP8AWebs3Zxnp71i8NJa
+qUWnCVRNX1jGTj1XkV7Rdnuo/Nq5sUVy/hCbVtXgt765vFMZ3gxLEuZACyhmfjaQ3ZRjAHcmsY+N
+3vS041OO2wzeXbm2eQOik7POkAbBbo2w8DpzWyy2rKpOnGUZuk7TcVOSUrtW0jfp2sS68Uk2muba
+9l+p6DRWf4f1X+2rCC7xgyL8wxgb1JVscnjcDjnpWhXHOEqc5QlpKLcX6o0TUkmuoUUUVIwooooA
+yfDfw60C/s/NmtNzedcLnzZR8sc8kajhx0VQK0/+FXeG/wDny/8AI03/AMcrR8H/APIO/wC3i7/9
+KZq2q/QKLbpwb1bjH8jxpfE/U5T/AIVd4b/58v8AyNN/8co/4Vd4b/58v/I03/xyurorQRyn/Crv
+Df8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/
+AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+
+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDj
+ldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R
+/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn
+/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/
+8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8A
+z5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm
+/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/
+AI5R/wAKu8N/8+X/AJGm/wDjldXRQByn/CrvDf8Az5f+Rpv/AI5Wb4j+FemSWEq6XaBLkmMIzSyb
+VBdd7Hc7DATPYn05rvaKAPLT8JrPRNJvbq8kM86WsrqFJSKN1j3AjHzMVYHk8EdVrqq0/Fn/ACBd
+S/69J/8A0W1ZlfO8Sf8AMP8A9xP/AG07cD9v/t39Qrn9a/5Dmjf9vf8A6LFdBUb28UrpIyKXjzsY
+gFk3DDbT2z3rwqFRUpOTV7wqR/8AA4OP6nXOPMreaf3O5h+D/wDmJ/8AYRuP/ZaztC/5E9/+va6/
+nLXWw28Vvu8tFTexdtoC7nbqxx1J9abHZQRQ/Z0iRYsEeWFATDfeG3pznmt5YuLcnyv3qtKp/wCC
+1JfqQqbVtdoyX3nJXVw8NloapIlsWiH+luiOIMQg7P3gwPM/3h0703w8Yj4hk8u9a8P2I75CwZfM
+MisVj2/KE5yFGcZxXWzada3ESwyQRvGmNqMisi7RgYUjAwOKItOtYfL2QRr5W7y8Io8vf97ZgfLu
+7461p9dh7OceVpzjOP2ftSck27X8rXt1F7J8yd9rfgct4O1ew0bTGt7qSOCW3klWZWZQ7OpzkBSS
+/GF/DArDhh26Vot1I00cETXKyzQHEkXmuVU9zjI549upFdLNomsyyrvewmK4C3UkB+1IM7tyqPky
+hPyjOPXvW1pekQ6ZYx2IAdFTa2RkPu++SpJ+8SePwroni6VFyqxfPOrV55KMrqzjOMrXSt8el/uI
+VOUkovRRjZX9U/0Oe0y0046rb+Tf3V7LGkkgLTJNFEjDyzuPHXPReemeK6+obWygsVKW8SRKTkqi
+hBnpnC49KmrzsTX9vJP3rRjyrmtfdvp6m0I8i6au+hw3hDwhpWqaVb3Fxb75H37m3uudrso4VgOg
+rR1zyNG1DRXb93bw+dFuOSibo1SNWY59O/oT2NdJb28VogjhRY0GcKgCqMnPAFFxbxXaGOZFkQ4y
+rgMpwc8g1vPHzqV5VJucqcnUtBy+GNROOl9NEyVRUYJJJSXLrbdx1ObstQt9R8TO1vKsipYbCyHc
+u7zQ2Aw4PDDpVLUY7fT57uew1f7HJukaWCUbkaUhW3LHIN3zf3lVs5+Xjiutt9OtbQhoYI4yFKAo
+iqQhO7aMDpu5x60260qzvmD3FvFKwGAzxq5x1xlgfWnHF041E0p8ipxhb3ZX5e6kmhOm2ul736o5
+a11CfVbvw/dXKBHkF4SoBUY2YUgMSeVwam0G/tdEvdSt70rbyyXLzq8m1Flgc/JtcnnHPHuf9rHU
+vbxSukjIpePOxiAWTcMNtPbPeo7vTrW/2/aII5dudvmIr7c9cbgfSlLGU5rkcHGm4ONovWP7yU1b
+y96w1Tktb3d76/4UjgHZby9+3wRlbefVLIRMV2eYYxIJGA68sc5/rmun1r/kOaN/29/+ixW01lAy
+xoYkKxFTGpUYjKcKVHbHbFOe3ildJGRS8edjEAsm4Ybae2e9Opjo1JRfK0o06lNa30lDkj/wRRpN
+Jq+8lL7ndklFFFcBsWfCf3tS/wCvsf8ApPb1v1geE/val/19j/0nt636+8wP+60P+vNP/wBJR5FX
++JP/ABP8woooroICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5T/mc/+4T/AO3FFH/M
+5/8AcJ/9uKKAM+y/5eP+vu7/APSiWrNQpYalavOv9nzODcXDqyvBtZJZnkUjdMp6MOop/k6l/wBA
+y4/77tv/AJIr0qdemoRTktIo3jOKS16D6KZ5Opf9Ay4/77tv/kijydS/6Blx/wB923/yRV/WKX8y
+K549x9FM8nUv+gZcf9923/yRR5Opf9Ay4/77tv8A5Io+sUv5kHPHuPopnk6l/wBAy4/77tv/AJIo
+8nUv+gZcf9923/yRR9YpfzIOePcfRTPJ1L/oGXH/AH3bf/JFHk6l/wBAy4/77tv/AJIo+sUv5kHP
+HuPopnk6l/0DLj/vu2/+SKPJ1L/oGXH/AH3bf/JFH1il/Mg549x9FM8nUv8AoGXH/fdt/wDJFHk6
+l/0DLj/vu2/+SKPrFL+ZBzx7l3wv/wAhK+/697X/ANDua6iub8MWV3Dd3c9xbPArxQIodo2LGNp2
+b/VO/wDfHWukrzqzUqkmtrmE3eTCiiisyQooooAKKKKAMXxh/wAg7/t4tP8A0phqjV7xh/yDv+3i
+0/8ASmGqNfM8R/xaX+B/md+C+GXqFFFFeCdYUUUUAUda0pdZtmgLmNsho5F+/FIhyrr/APWwcZ5F
+Zcep+IQPKfTYi+SvnCcCHrhX8vl9o6kZyfauiorenX5I8koQqRTvHnv7re9uVohwu7puPoczqGhX
+zaXFG7m6nWdJ5kLYS4+bLRfOdqoB0GMfL93JqC3sdRmvtPuWsI7aG2aVPJjkRnHnqQ0ny7U2ZxwP
+m6nBrraK0WOmouLjB359dVb2is7JNLbyE6Sund9PwOOjur+01zVWs7ZbgH7MHQyCJwfL+VgzfLjr
+kdenvUmoeG7zULDUZGCi6vfKYxBvkjWAjZHu7vtHLcLn0HNdLBp8FvPNcImJJtnmNknd5Y2rwTgY
+HpVirljnGUJUoRi4xopyd7y9ko6PW1uaIlSumpNu7lp25r/5nN6nbanefYNSjtlW4tmk3WzSA7kl
++Q4lGFztGfx9sE0q21O41k395bLChtDEqrIJCpEgbaxHUnk8DGMDrmukorP65LkcFTh8MoJ+9eMJ
+Pm5Vr3fXUfs1e93un6tdTH8IafPpelW9vcJskTfuXIbG52YcqSOhrMsLPWfDYawtIEuYM5gld1j8
+neSSJVHL7Sc/L/8AWXq6KX1uTnVlKEJqtLnlGSfLzXbTVnfS76j9mrRSbXKrJ+RX0+KeG3iS5k8y
+UKN74ABfvjaq8enHTrViiiueT5m3pq76aIpKwUUUUhhRRRQBe8H/APIO/wC3i7/9KZq2qxfB/wDy
+Dv8At4u//Smatqv0Ch/Cp/4I/kePP4n6sKKKK0JCiiigAooooAKKKKACiiigAooooAKKKKACiiig
+AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDK8Wf8gXUv8Ar0n/APRbVmVseIbW
+W+0y9t4V3PLbzIgyBl3RlUZPHWsH/iY/9Ay4/wC+7b/5Irw89wtbE+x9lBz5ee9ul+U68JUjDm5n
+a9v1JqKh/wCJj/0DLj/vu2/+SKP+Jj/0DLj/AL7tv/kivE/svGf8+ZnV9YpfzImoqH/iY/8AQMuP
+++7b/wCSKP8AiY/9Ay4/77tv/kij+y8Z/wA+Zh9YpfzImoqH/iY/9Ay4/wC+7b/5Io/4mP8A0DLj
+/vu2/wDkij+y8Z/z5mH1il/Miaiof+Jj/wBAy4/77tv/AJIo/wCJj/0DLj/vu2/+SKP7Lxn/AD5m
+H1il/Miaiof+Jj/0DLj/AL7tv/kiqF5q15Z3lpZtps26583aDJBuPkruO3ErL9dzL7ZprK8a/wDl
+zL8A+sUv5katFQ/8TH/oGXH/AH3bf/JFH/Ex/wCgZcf9923/AMkUv7Lxn/PmYfWKX8yJqKh/4mP/
+AEDLj/vu2/8Akij/AImP/QMuP++7b/5Io/svGf8APmYfWKX8yJqKh/4mP/QMuP8Avu2/+SKP+Jj/
+ANAy4/77tv8A5Io/svGf8+Zh9YpfzImoqH/iY/8AQMuP++7b/wCSKP8AiY/9Ay4/77tv/kij+y8Z
+/wA+Zh9YpfzImoqH/iY/9Ay4/wC+7b/5Io/4mP8A0DLj/vu2/wDkij+y8Z/z5mH1il/Mi/4T+9qX
+/X2P/Se3rfrD8LWtzbrePcQtCZbjeqsyM2wQwx5Plu46oe9blfYYSMoYejGStKNOCa7NRR5tRpzk
+11kwooorcgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlP+Zz/7hP8A7cUUf8zn/wBw
+n/24ooA6uiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAxvFyO+nNs
+R3KzWzFUVpH2pPE7EKgJOACeBWL/AGkv/PC7/wDAO4/+NV2dFcONyyjj5RlUlNOKsuVpfmma0q8q
+Kailr3OM/tJf+eF3/wCAdx/8ao/tJf8Anhd/+Adx/wDGq7OiuT/V7C/z1v8AwKP/AMia/XanaP4/
+5nGf2kv/ADwu/wDwDuP/AI1R/aS/88Lv/wAA7j/41XZ0Uf6vYX+et/4FH/5EPrtTtH8f8zjP7SX/
+AJ4Xf/gHcf8Axqj+0l/54Xf/AIB3H/xquzoo/wBXsL/PW/8AAo//ACIfXanaP4/5nGf2kv8Azwu/
+/AO4/wDjVH9pL/zwu/8AwDuP/jVdnRR/q9hf563/AIFH/wCRD67U7R/H/M4z+0l/54Xf/gHcf/Gq
+P7SX/nhd/wDgHcf/ABquzoo/1ewv89b/AMCj/wDIh9dqdo/j/mcZ/aS/88Lv/wAA7j/41R/aS/8A
+PC7/APAO4/8AjVdnRR/q9hf563/gUf8A5EPrtTtH8f8AM4z+0l/54Xf/AIB3H/xqj+0l/wCeF3/4
+B3H/AMars6KP9XsL/PW/8Cj/APIh9dqdo/j/AJnGf2kv/PC7/wDAO4/+NUf2kv8Azwu//AO4/wDj
+VdnRR/q9hf563/gUf/kQ+u1O0fx/zOM/tJf+eF3/AOAdx/8AGqP7SX/nhd/+Adx/8ars6KP9XsL/
+AD1v/Ao//Ih9dqdo/j/mcZ/aS/8APC7/APAO4/8AjVH9pL/zwu//AADuP/jVdnRR/q9hf563/gUf
+/kQ+u1O0fx/zMbwijppy70dC01ywV1aN9rzyupKuARkEHkVs0UV68IqEVFbRSX3HM3dthRRRVCCi
+iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
+KACiiigAooooAKKKKACiiigAooooAKKKKACuU8Rf8jJ4f/7fv/RK11dcp4i/5GTw/wD9v3/olaAO
+rooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
+iiigDlP+Zz/7hP8A7cUUf8zn/wBwn/24ooA6uiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
+ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
+gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
+CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuU8Rf8AIyeH/wDt+/8ARK11dcp4
+i/5GTw//ANv3/olaAOrooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
+ACiiigAooooAKKKKACiiigDlP+Zz/wC4T/7cUUf8zn/3Cf8A24ooAiHiDVrh5jHJaqqzzxqGgkdt
+sMrxjLC4XJO30FO/tnWv+e1p/wCA0n/yTVKy/wCXj/r7u/8A0olqzXo08NSlCLcdXFdWbxhFpadC
+T+2da/57Wn/gNJ/8k0f2zrX/AD2tP/AaT/5JqOiq+q0f5fxY/Zx7En9s61/z2tP/AAGk/wDkmj+2
+da/57Wn/AIDSf/JNR0UfVaP8v4sPZx7En9s61/z2tP8AwGk/+SaP7Z1r/ntaf+A0n/yTUdFH1Wj/
+AC/iw9nHsSf2zrX/AD2tP/AaT/5Jo/tnWv8Antaf+A0n/wAk1HRR9Vo/y/iw9nHsSf2zrX/Pa0/8
+BpP/AJJo/tnWv+e1p/4DSf8AyTUdFH1Wj/L+LD2cexJ/bOtf89rT/wABpP8A5Jo/tnWv+e1p/wCA
+0n/yTUdFH1Wj/L+LD2cexp+HdXvb65ube7MLeVHC6mKNo/8AWmVSCGkk/wCeYrfrl/C//ISvv+ve
+1/8AQ7muorgrRUakktkzGSs2kFFFFZkhRRRQAUUUUAFFUNc1NtItGuEjEjb4kCltgJmkSIZYK2Mb
+s9DWV/wkOqf8+Vv/AOBT/wDyLWFfF0MM0qtSMG9VcuNOc/hVzpKK5v8A4SHVP+fK3/8AAp//AJFo
+/wCEh1T/AJ8rf/wKf/5FrH+1MH/z+gV9Xq/ys6Siub/4SHVP+fK3/wDAp/8A5Fo/4SHVP+fK3/8A
+Ap//AJFo/tTB/wDP6AfV6v8AKzpKK5v/AISHVP8Anyt//Ap//kWj/hIdU/58rf8A8Cn/APkWj+1M
+H/z+gH1er/KzpKK5v/hIdU/58rf/AMCn/wDkWj/hIdU/58rf/wACn/8AkWj+1MH/AM/oB9Xq/wAr
+Okorm/8AhIdU/wCfK3/8Cn/+RaP+Eh1T/nyt/wDwKf8A+RaP7Uwf/P6AfV6v8rOkorm/+Eh1T/ny
+t/8AwKf/AORaP+Eh1T/nyt//AAKf/wCRaP7Uwf8Az+gH1er/ACs6Siub/wCEh1T/AJ8rf/wKf/5F
+o/4SHVP+fK3/APAp/wD5Fo/tTB/8/oB9Xq/ys6Siub/4SHVP+fK3/wDAp/8A5Fo/4SHVP+fK3/8A
+Ap//AJFo/tTB/wDP6AfV6v8AKzpKK5v/AISHVP8Anyt//Ap//kWj/hIdU/58rf8A8Cn/APkWj+1M
+H/z+gH1er/KzpKK5v/hIdU/58rf/AMCn/wDkWj/hIdU/58rf/wACn/8AkWj+1MH/AM/oB9Xq/wAr
+Okoqhoeptq9otw8YjbfKhUNvAMMjxHDFVznbnoKv12JqSTWz1MnoFFFFMAooooAKKKKACisLVNfu
+rS9a0t7aOTbDHKzSTNF/rWkUABYZP+efrUH/AAkOqf8APlb/APgU/wD8i1y1cfhqM3CpVjGS3T89
+TSNGpJXUW0dJRXN/8JDqn/Plb/8AgU//AMi0f8JDqn/Plb/+BT//ACLUf2pg/wDn9Af1er/KzpKK
+5v8A4SHVP+fK3/8AAp//AJFo/wCEh1T/AJ8rf/wKf/5Fo/tTB/8AP6AfV6v8rOkorm/+Eh1T/nyt
+/wDwKf8A+RaP+Eh1T/nyt/8AwKf/AORaP7Uwf/P6AfV6v8rOkorm/wDhIdU/58rf/wACn/8AkWj/
+AISHVP8Anyt//Ap//kWj+1MH/wA/oB9Xq/ys6Siub/4SHVP+fK3/APAp/wD5Fo/4SHVP+fK3/wDA
+p/8A5Fo/tTB/8/oB9Xq/ys6Siub/AOEh1T/nyt//AAKf/wCRaP8AhIdU/wCfK3/8Cn/+RaP7Uwf/
+AD+gH1er/KzpKK5v/hIdU/58rf8A8Cn/APkWj/hIdU/58rf/AMCn/wDkWj+1MH/z+gH1er/KzpKK
+5v8A4SHVP+fK3/8AAp//AJFo/wCEh1T/AJ8rf/wKf/5Fo/tTB/8AP6AfV6v8rOkorm/+Eh1T/nyt
+/wDwKf8A+RaP+Eh1T/nyt/8AwKf/AORaP7Uwf/P6AfV6v8rOkorm/wDhIdU/58rf/wACn/8AkWmn
+xPfwtF51nCEeaKIlblnZfOkWLIU265xu9RVQzHCTkoxrRcpNJLu2J0KiTbi9DpqKKK6zMKKKKACi
+iigAooooAKKKKACiiigAooooAKKKKACuU8Rf8jJ4f/7fv/RK11dcp4i/5GTw/wD9v3/olaAOrooo
+oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
+DlP+Zz/7hP8A7cUUf8zn/wBwn/24ooAz7L/l4/6+7v8A9KJas1Wsv+Xj/r7u/wD0olqzXr0v4cP8
+K/I6Y/CvQKKK47w3o0usafDdS6hfBn35CzkL8rsvGQfSiUmmkle6b+7/AIcG7Ox2NFcvFfT6dJf6
+feSyukdsZoZl2ibyANrfMD99T90kZJyT2rR/tq3sLG1k/fSmWNPKQDzLmUbQxJA6kDlj0/ShVE99
+Lb3DmNeisi38S280U7vHNE0MbStFKnlytGo++qk8jjHXr1qtH41s3VZTDcrCQCZzEfJX2LLn+L5e
+B19uaPawX2kHMu50FFYmq3EseraXGrsFf7RvUEhW2xgjcO+O1Ou/E8VvK8UVvc3Gw7XaCPzEV+6F
+sj5h3o9ole+lnb8LhdGzRWd/b1qTaFSWS6JEcgx5YYDIViSMM3QDrnipb7U4rB4I2DM08gjRUALe
+pcjI+Vf4j2p80d7/ANMd0XKKKKoC14X/AOQlff8AXva/+h3NdRXL+F/+Qlff9e9r/wCh3NdRXlYj
++LL1OefxMKKKKyJCiiigAooooAxfGH/IO/7eLT/0phqjV7xh/wAg7/t4tP8A0phqjXzPEf8AFpf4
+H+Z34L4ZeoUUUV4J1hRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAF7wf/yDv+3i
+7/8ASmatqsXwf/yDv+3i7/8ASmatqv0Ch/Cp/wCCP5Hjz+J+rCiiitCQooooAKKKKAOW1L/kNT/9
+elt/6MuqWk1L/kNT/wDXpbf+jLqlr4zOv9/rf9uf+kRPTwv8GPz/ADCiiivONwooooAKKKKACiii
+gAooooAKKKKACiiigAooooAKKKKACqmpfdg/6+7P/wBKIqt1U1L7sH/X3Z/+lEVdOB/3qh/1+p/+
+lIir/Dn/AIX+R2dFFFfdnkBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVyniL/kZPD//AG/f
++iVrq65TxF/yMnh//t+/9ErQB1dFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
+FFABRRRQAUUUUAFFFFABRRRQAUUUUAcp/wAzn/3Cf/biij/mc/8AuE/+3FFAGfZf8vH/AF93f/pR
+LVmq1l/y8f8AX3d/+lEtWa9el/Dh/hX5HTH4V6BXK+DdXsbXSbeOW5hRh5mVaRVYZkc8gmuqqh/Y
+Gm/8+dv/AN+k/wDiaJRlzKUbaJrXzt/kDTvdHOzTprbanqMBzDHYvbI2P9YxUyucHBXbkDpz61Nc
+WtncabpZuLl7WQQKIZlJQKzRDIZvujOOhIJxgHrXT/Z4vK8nYuzbt2YGzZjG3b0xjtTXs4JYvIaJ
+DHgDYVBTC9Bt6cY4qPZPW9nda+t7i5TkF1a7nTU7N7mO7iSzlfz0Tbh2XAQlPk/vHjP14IFqPWrK
+XQFgSdGla0EIjBzKZSnlhRH9773t79K3LrSovsNxa2sccXmxyKAqhE3uu3J2im6Xo0FlFbl4YjPH
+EiGQKN2UQIcPjd04+lJU5p2vumrvULMxvIe1vPD8UgwyQzKwznDLCoI4qs9ysk98J78WESzvugjC
+RzybVU+ar4D/ADnn7pyOMmuve3ikdJGRSyZ2MQCy7uDtPbPeoX0u0ll89reIyZB3lFL5Xod2M8Y4
+puk+j63/AAt0DlOc0HTP7W8NQwqdrje0T5wUlSRyjBsEjnqRzjNGgahL4l1P7RNHs+xQhNhyrLcy
+8SMF9PlZcMT2PXpvXtvc28R/s1LdXaTc/mAqjbh8zfu+SxOOTUfh7SDo1oInffKzNJK+Sd8j9T83
+4D360lTacF0ilzdny7By6pdjTooorcoteF/+Qlff9e9r/wCh3NdRXl+q+Mn8HXF1JHbGVpYbdVY8
+RRsDdEbyOpPZeMgNyMVgeH/iFq19rsFxdPcTp+8/0a2UkEFHKhYgQG2k5y2TgdTivKxH8WXqc8/i
+Z7fRXKf8J9/1BtW/8Bf/ALOj/hPv+oNq3/gL/wDZ1kSdXRXKf8J9/wBQbVv/AAF/+zo/4T7/AKg2
+rf8AgL/9nQB1dFcp/wAJ9/1BtW/8Bf8A7Oj/AIT7/qDat/4C/wD2dAGj4w/5B3/bxaf+lMNUazdb
+8X/2pAlv/Zmow77i1/eT2/lxLtnib5m3HGcYHvWlXzPEf8Wl/gf5nfgvhl6hRRRXgnWFFFFABWHc
+eN9HtJXhkucPGxRh5chwynBHCVuVxGkeIl0VtTD2t1Kovrh2kij3xqOM7mLDGMZPtXXhMPGuqjcZ
+zceW0YSUN33aZnUm421SvfVq51Ola5Za2rvaTCQIcNwVIz0+VgDz61erl9BL6xq0urJbNBC1ssSm
+QBZJmJV/M2jtt4zk9sdwMY+N3vS041OO2wzeXbm2eQOik7POkAbBbo2w8DpzWry6VSpKNK9oxi5J
+3m4yl9l8kX+RPtlGKcut7dL266noNFcleeJLy70vTbuzKxy3FzHEwdf3ZY71ZT94hCy9juxVm2ud
+T0jU7azvLlbqO6WTa3liF4nhG88JwQRjv+WOcngaii25QUl7T3Lvmfsvi6W09Svaq60dtNenvbHS
+VXs9Qgv/ADfJfd5UjRPwRtkT7y8gevasNbjU/EE919ku1tYreZoB+5EskjoF3lt7YAB+7jr3rGsd
+cm0DTr+aTy/OfU5IycM0CyNtLscfPsADYxk9OKuGAc4tKSdW8EoK948/82n5MTrJPb3ddfQ72iuG
+03xeYby3hOpLfJPII2H2YwSRluEZfuqRuI3Z59BWjo82ravdXTfbFjht72SMIIlZ5ERhlC3G0Beh
+HPJz0FKpl9SldzlGMVHm5pKcb3dtnHm38gjWjK1k279Lf5nUUUUVxGoUUUUAFFFFAF7wf/yDv+3i
+7/8ASmatqvINS+JN34dgfT7O32v510fPkGRh55+Yk6HBx8xJGQRtNX/AXjy7FlO15bajfO9w7eZD
+F50ahlT5AdwC4OTtAwM1+gUP4VP/AAR/I8efxP1Z6hRXKf8ACff9QbVv/AX/AOzo/wCE+/6g2rf+
+Av8A9nWhJ1dFcp/wn3/UG1b/AMBf/s6P+E+/6g2rf+Av/wBnQB1dFcp/wn3/AFBtW/8AAX/7Oj/h
+Pv8AqDat/wCAv/2dADtS/wCQ1P8A9elt/wCjLqlrKg13+2NYnP2O6t/9FhGLiLyj8kk3ufvb/l9d
+relatfG50rY6r58n/pCPTwv8KPz/ADCiiivNNwooooAbJIsKs7sFVQSzE4AA5JJNY8fjTRpJvJF4
+m7JGSGVPl/6aEBO3Bzz2qv4ojGo3enabLnybh5XlCkqX8hN6oSP4STz+GMVtXGn291bm1kiUxFQm
+zGFCjoBjpjtjp2rqVOjThCVXnk6iclyNLlim431Tvqnpp6mbcm2o293v33LFFcRp+qXOj2wbzC1r
+Y30trKGwXNuSFjkZuT+7LfdQcjA7Vv6nqE76jaWFq+1jmedsA4t0+Xbhh/G3GVOV606mCnCdlKLj
+775uiUNXfztZ/NAqqavbXTT1NiivPj43e9LTjU47bDN5dubZ5A6KTs86QBsFujbDwOnNaD+Ib/Vh
+pH2KRYWu1nEm5AyhogAzKOT8p3FBnnjdWksrrwtzWiveu5KSS5YuXWOukXtclYiD219LdXY6mfUI
+LeeG3d8STb/LXBO7yxubkDAwPWrFcvdQT2+q6GlxN50g+2bpNgj3ZTI+VeBgcVBq2rXUc1w02qRW
+CxPsWEJHcyunG2UjcX+bd93bwPzqVguf2ahNe9Byb953ftJQXKoxcunYftbXutnbp2T11sdfRXKD
+xLcyafYau2Eh3lbqMAEbGYxeYCQW+VhnauSc4zxmtPVtQnF/Y2Ns+0yM0sxADlYIh91lI4EjfKG4
+wemazeDqRlyvl/5ec2ukXS+JP+uqKVSLV/8AD8+bY2KKKK5iwooooAKqal92D/r7s/8A0oiq3Wfr
+tx9ktkm2O+y4tW2RjdI+2eI7UXux7CunA/71Q/6/U/8A0pEVf4c/8L/I7iivCvEfxX1bWsx2x+xx
+ekTEyn7p5l4PUfwheDg5rvdD8eOmn2iyaXqszCCINKtv5iytsGXDl/mDdc96+7PIO4orlP8AhPv+
+oNq3/gL/APZ0f8J9/wBQbVv/AAF/+zoA6uiuU/4T7/qDat/4C/8A2dH/AAn3/UG1b/wF/wDs6AOr
+orlP+E+/6g2rf+Av/wBnR/wn3/UG1b/wF/8As6AOrorlP+E+/wCoNq3/AIC//Z0f8J9/1BtW/wDA
+X/7OgDq6K5T/AIT7/qDat/4C/wD2dH/Cff8AUG1b/wABf/s6AOrorlP+E+/6g2rf+Av/ANnR/wAJ
+9/1BtW/8Bf8A7OgDq6K5T/hPv+oNq3/gL/8AZ0f8J9/1BtW/8Bf/ALOgDq65TxF/yMnh/wD7fv8A
+0StH/Cff9QbVv/AX/wCzrPOqTeIvEGjzJp19Alv9q8x7iAxp+9iwvzAsOq9/agDu6KKKACiiigAo
+oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5T/mc/8A
+uE/+3FFH/M5/9wn/ANuKKAM+y/5eP+vu7/8ASiWodW1T+y/s3yb/ADriODrt2+Zn5uhzjHSprL/l
+4/6+7v8A9KJaxvGnm+VY+Tt3/bodm7Ozfh9u7HOM9a9RNxoxa/lidCdor0RtahdfYbaa427vKjd8
+ZxnYC2M80afdfbraG427fNjR8ZzjeA2M8Vzur/8ACQfYbnzvsOzyZN+3zd+zad23PGcdKivTE2m6
+Sk/myRvEga2hXdJPiIEHh1bamMnGe2aHVab0e2z06hzHX0VyHhktZ6pJax2z2sD23nLE7+YWO8Ks
+hBJKMV4K57c1X8M6bBZ6OurBS9xFFO0ZdmKpt8wbQoIG3qfqTQqrdtO99f5beXmHN5HX6hdfYbaa
+427vKjd8ZxnYC2M80afdfbraG427fNjR8ZzjeA2M8Vyknhu0l0Zr9zK1y1oZTMZWLkmPcVPONuPl
+xj7v50abcDw/5dwcMt1pySBTncZrOJTtBAwqlD3zz+RPayUlzK0Wu/cOZ312OzorgbDUJE065sA5
+aSc2yo0rM+X1GNWccDjHztn+Z66OuWtpby2tpOlxdRR2+EtoV3OpjKqJnKOh5HyjjHWhVrq6X49b
+2Dm0Otorl/Bzywz31o0RgSExFIDJ53leYrFsP33Y3Y96oeGdNgs9HXVgpe4iinaMuzFU2+YNoUED
+b1P1Jpqq3bTfmv5crs+gc22nf8Dt6K87t9Kvrq2S4j0+Y3Dxhlu/toEpLDhtpPTHGOu3jOea76za
+V4ImnULIUUuo6K+PmA5Pf3p06jnvFr7/ANUhxlfoXfDkKXF/qEcihla2tlZWG5WVmugQQeoNTWfw
+90nTtUj1S1R4XTf+7Rh5JMgZWO0gkcNwFIAwOKZ4X/5CV9/172v/AKHc11FediP4svUwn8TCiiis
+iQooooAKKKKAMXxh/wAg7/t4tP8A0phqjV7xh/yDv+3i0/8ASmGqNfM8R/xaX+B/md+C+GXqFFFF
+eCdYUUUUAFY/hvT57D7d5ybfNvZpU5B3Rvt2twT6d62KKuNRxhKCtadr/ITjdp9jB0DSrnQru4tU
+BNkwEkBLhvJcn548H5uScjtx/eJqlYWes+Gw1haQJcwZzBK7rH5O8kkSqOX2k5+X/wCsvV0Vv9ck
+3JzhCfOo8yknrKG0tGnzEeyStZtWvb0fQ5/VNKvrm30xGPnSw3cEsz5VRhN29hwnAzxxnFWNU0+e
+41XTLhEzHD9o8xsgbfMQKvBOTk+lbFFSsVNW0joqkdrfxU0/z0H7Nef2f/JTmYbfVfD0119mtUu4
+rid5xiUQvGXxuDb8g+2PQ564qpa+GL+5srhZ2WG5F+13Ey4aIyADacHcdhOevI7jsexorRY+otVG
+Cm+XmnZ3ly7XTfL+AvYrq3bXT1MGxn1y/lgFxAloiEGYiRZHm4PyoMMFXd97Jzjo1TeG9PnsPt3n
+Jt829mlTkHdG+3a3BPp3rYorKeIcoyjGEIRlbSKfR36tsahZptttdwooorAsKKKKACiiigA0fRbP
+XtHNtewiWM3V02DkEMtzNgqykEH6Hpx0NaHhfwva+ErV7W1eRlaQyEyFWbcyqv8ACq8fLTfB/wDy
+Dv8At4u//Smatqv0Ch/Cp/4I/kePP4n6sKKKK0JCiiigAooooA5bUv8AkNT/APXpbf8Aoy6paTUv
++Q1P/wBelt/6MuqWvjM6/wB/rf8Abn/pET08L/Bj8/zCiiivONwooooAy/EGjvqsSNby+TcQtvhk
+wOGxgq3B+Rv4h+YPSqMl94hnVrdLGKJyCv2gzBogR/GI9pfn+EHpxnvXRUVvDEuEVGUIVFHWPOn7
+t/Rq/o7ohwu7ptX3sZNr4bgh019PlYyCQMZZGA3ySPyZDkH5gfuk5IwOuKr+GNHu7My3OoMHuGCx
+Ahi+IYRtGC3I8w5dueeDgHIreooeKquNSLd/avmk+vnb10D2cbp/y7HKWFnrPhsNYWkCXMGcwSu6
+x+TvJJEqjl9pOfl/+stt9KvmvNImlPmmBZ/PkyoAeSMAYACcbuBhenWugoq5YyUpOXJTU5KSlJLW
+XPFxbevn0tqJUkla7srWXazuY+qafPcarplwiZjh+0eY2QNvmIFXgnJyfSspbHUdOvrp4bCO5eWZ
+niu5ZEUxLIqqFx80myPkYBGR0FdbRShi5Qio8sZRUPZ2fNtzOfRrq/QHTTd7ta3/AAsYfhrR3tNJ
+GnXkf3fNjbDDbIjsx3KVOcEN3wfasj4f2MkjXF9JIZVUC2tpCGTMEPdUPAU4X3yGzznPT6ro9rrU
+Qhu4/MQMHA3MvzAEZ+Uj1NTWdnDp8KQQIERBhVHb/Pc1o8ZelW39piJ80tLRir3dndvUSpe9HtBa
+dyaiiiuI1CiiigAqpqX3YP8Ar7s//SiKrdVNS+7B/wBfdn/6URV04H/eqH/X6n/6UiKv8Of+F/ka
+fiPwLpPifL3MO2U/8tosJL/D1OCG4XHzA4HTFbGnWSabawWsZJWGNI1LfeKxqFGcY54qxRX3Z5AU
+UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
+RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHKf8zn/ANwn/wBuKKP+Zz/7hP8A7cUU
+AZ9l/wAvH/X3d/8ApRLUOraX/an2b59nk3Ec/Tdu8vPy9RjOetTWX/Lx/wBfd3/6US1Zr1qaUqUU
+/wCWJ0x1ivQr6ha/braa33bfNjdM4zjeCuccVmXPh15ILJYLjyprRQqTbN/y7PLcbC2Pm49cVt0V
+UoKW42kzE0/w/NaXi3st200pjaOTcgVSmQV8tVI2Yxz97PPTNWNK0NNP05dPkbzV2urHGzcshYkc
+E4+9jrWnRSVOK2Xfz3CyRzcnhS7MDWaalKLbYUEZRWcDHAMvBK57cfL8tWdR8N/b9NgsROyGFUAk
+UddqGNsrnoyk8Zrboo9lDXTdW3ewuVGZNovnanHfmZgI49oiH3WcbwHY57CRgOPx7VHqmizXdyl3
+aXP2eURmJm8sS74yQwGGOBg57Vr0U3CLTVt3f5jsjI0jQn0q4mna4aYzqnml1+YyJn5lIOFXBxtw
+ccc1No2jrpVgli7CVVDgkrgMHZmIK5PritGihQjHZd/x3BJI5tfCEkayWsd9Klm5Y+Qqjcobqqyt
+khc9sdOD1Jroo41iVURQqqAAAMAAdABTqKIwjDZAklsWvC//ACEr7/r3tf8A0O5rqK5fwv8A8hK+
+/wCve1/9Dua6ivMxH8WXqc8/iYUUUVkSFFFFABRRRQBi+MP+Qd/28Wn/AKUw1Rq540kWHTGd2Cqs
+9oSScAAXEJJJNYf/AAkWl/8AP7b/APf5P/iq+b4hpznVpcsZS9x7K/U7sG0oyu+poUVn/wDCRaX/
+AM/tv/3+T/4qj/hItL/5/bf/AL/J/wDFV4nsKv8Az7n/AOAs6uePdfeaFFZ//CRaX/z+2/8A3+T/
+AOKo/wCEi0v/AJ/bf/v8n/xVHsKv/Puf/gLDnj3X3mhRWf8A8JFpf/P7b/8Af5P/AIqj/hItL/5/
+bf8A7/J/8VR7Cr/z7n/4Cw549195oUVn/wDCRaX/AM/tv/3+T/4qj/hItL/5/bf/AL/J/wDFUewq
+/wDPuf8A4Cw549195oUVn/8ACRaX/wA/tv8A9/k/+Ko/4SLS/wDn9t/+/wAn/wAVR7Cr/wA+5/8A
+gLDnj3X3mhRWf/wkWl/8/tv/AN/k/wDiqP8AhItL/wCf23/7/J/8VR7Cr/z7n/4Cw549195oUVn/
+APCRaX/z+2//AH+T/wCKo/4SLS/+f23/AO/yf/FUewq/8+5/+AsOePdfeaFFZ/8AwkWl/wDP7b/9
+/k/+Ko/4SLS/+f23/wC/yf8AxVHsKv8Az7n/AOAsOePdfeaFFZ//AAkWl/8AP7b/APf5P/iqP+Ei
+0v8A5/bf/v8AJ/8AFUewq/8APuf/AICw549195oUVn/8JFpf/P7b/wDf5P8A4qj/AISLS/8An9t/
++/yf/FUewq/8+5/+AsOePdfeb3g//kHf9vF3/wClM1bVYfguRZtMV0YMrT3ZBByCDcTEEEVuV93R
+0pQ/wR/I8mXxP1YUUUVoSFFFFABRRRQBy2pf8hqf/r0tv/Rl1S1W13UbWw1qX7RPHFutLfb5jqm7
+ElznG4j1qD/hItL/AOf23/7/ACf/ABVfH5xSqSx1VxhJr3NUn/Ij0sNJKlG7XX8zQorP/wCEi0v/
+AJ/bf/v8n/xVH/CRaX/z+2//AH+T/wCKrg9hV/59z/8AAWbc8e6+80KKz/8AhItL/wCf23/7/J/8
+VR/wkWl/8/tv/wB/k/8AiqPYVf8An3P/AMBYc8e6+80KKz/+Ei0v/n9t/wDv8n/xVH/CRaX/AM/t
+v/3+T/4qj2FX/n3P/wABYc8e6+80KKz/APhItL/5/bf/AL/J/wDFUf8ACRaX/wA/tv8A9/k/+Ko9
+hV/59z/8BYc8e6+80KKz/wDhItL/AOf23/7/ACf/ABVH/CRaX/z+2/8A3+T/AOKo9hV/59z/APAW
+HPHuvvNCis//AISLS/8An9t/+/yf/FUf8JFpf/P7b/8Af5P/AIqj2FX/AJ9z/wDAWHPHuvvNCis/
+/hItL/5/bf8A7/J/8VR/wkWl/wDP7b/9/k/+Ko9hV/59z/8AAWHPHuvvNCis/wD4SLS/+f23/wC/
+yf8AxVH/AAkWl/8AP7b/APf5P/iqPYVf+fc//AWHPHuvvNCis/8A4SLS/wDn9t/+/wAn/wAVR/wk
+Wl/8/tv/AN/k/wDiqPYVf+fc/wDwFhzx7r7zQqpqX3YP+vuz/wDSiKov+Ei0v/n9t/8Av8n/AMVU
+F3rNhdm2jhuoXc3dphVkVmOLiI8AGt8FRqLFUG4SSVWn9l/zIirKPs56r4X+R39FFFfcHlBRRRQA
+UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
+RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcp/zOf/AHCf/biij/mc/wDuE/8AtxRQBn2X
+/Lx/193f/pRLVmtiTwfpsju+2YF3Z223M6LvkYuxCrKAMkk8Cm/8Ibpvpcf+Bdz/APHq7YYyMYxj
+yvRJGqqpJKxk0Vrf8Ibpvpcf+Bdz/wDHqP8AhDdN9Lj/AMC7n/49VfXY/wArH7VdjJorW/4Q3TfS
+4/8AAu5/+PUf8Ibpvpcf+Bdz/wDHqPrsf5WHtV2Mmitb/hDdN9Lj/wAC7n/49R/whum+lx/4F3P/
+AMeo+ux/lYe1XYyaK1v+EN030uP/AALuf/j1H/CG6b6XH/gXc/8Ax6j67H+Vh7VdjJorW/4Q3TfS
+4/8AAu5/+PUf8Ibpvpcf+Bdz/wDHqPrsf5WHtV2Mmitb/hDdN9Lj/wAC7n/49R/whum+lx/4F3P/
+AMeo+ux/lYe1XYp+F/8AkJX3/Xva/wDodzXUVn6ZoVpo7SPbq4aQKGLyyTEhN20ZldsY3Hp61oVx
+1Jc83LuZSd22FFFFQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
+AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOU+JHib/hHNJk8t9s
+9xmKLBwy5HzyDDKw2r0YdGK1yvwZ8Tf63SJn9ZYMn/v5GMt/wIKo/vk16BrvhbTfEvlfb4PN8rds
++d0278bvuMv90Vynwu8Lab/Ztlqvkf6V++/eb3/vyRfd3bfu8dKAPQKKKKACiiigAooooAKKKKAC
+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
+KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlP+Zz/7hP8A7cUUf8zn
+/wBwn/24ooA6uiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
+CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
+KKKACiiigAooooAKKKKACiiigArlPhd/yLdl/wBtv/R0ldXXnXgyHxJb6RbppsumS248zy3cXIds
+yOWzlU6NkfdoA9ForlP+Kz/6hP8A5MUf8Vn/ANQn/wAmKAOrorlP+Kz/AOoT/wCTFH/FZ/8AUJ/8
+mKAOrorlP+Kz/wCoT/5MUf8AFZ/9Qn/yYoA6uiuU/wCKz/6hP/kxR/xWf/UJ/wDJigDq6K5T/is/
++oT/AOTFH/FZ/wDUJ/8AJigDq6K5T/is/wDqE/8AkxR/xWf/AFCf/JigDq6K5T/is/8AqE/+TFH/
+ABWf/UJ/8mKAOrorlP8Ais/+oT/5MUf8Vn/1Cf8AyYoA6uiuU/4rP/qE/wDkxR/xWf8A1Cf/ACYo
+A6uiuU/4rP8A6hP/AJMUf8Vn/wBQn/yYoA6uiuU/4rP/AKhP/kxR/wAVn/1Cf/JigDq6K5T/AIrP
+/qE/+TFH/FZ/9Qn/AMmKAOrorlP+Kz/6hP8A5MUf8Vn/ANQn/wAmKAOrorlP+Kz/AOoT/wCTFH/F
+Z/8AUJ/8mKAOrorlP+Kz/wCoT/5MUf8AFZ/9Qn/yYoA6uiuU/wCKz/6hP/kxR/xWf/UJ/wDJigDq
+6K5T/is/+oT/AOTFH/FZ/wDUJ/8AJigDq6K5T/is/wDqE/8AkxR/xWf/AFCf/JigDq6K5T/is/8A
+qE/+TFH/ABWf/UJ/8mKAOrorlP8Ais/+oT/5MUf8Vn/1Cf8AyYoA6uiuU/4rP/qE/wDkxR/xWf8A
+1Cf/ACYoA6uiuU/4rP8A6hP/AJMUf8Vn/wBQn/yYoA6uiuU/4rP/AKhP/kxR/wAVn/1Cf/JigDq6
+K5T/AIrP/qE/+TFH/FZ/9Qn/AMmKAOrorlP+Kz/6hP8A5MUf8Vn/ANQn/wAmKAOrorlP+Kz/AOoT
+/wCTFH/FZ/8AUJ/8mKAOrorlP+Kz/wCoT/5MUf8AFZ/9Qn/yYoA6uiuU/wCKz/6hP/kxR/xWf/UJ
+/wDJigDq6K5T/is/+oT/AOTFH/FZ/wDUJ/8AJigA/wCZz/7hP/txRWL5PiT/AISDzfN0z7Z9h2+V
+i58v7N5ud+dv3t/H3vw70UAf/9k=
+</w:binData><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:353.25pt;height:264pt"><v:imagedata src="wordml://02000002.jpg" o:title=""/></v:shape></w:pict></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="000F30F7"><w:pPr><w:pStyle w:val="CM2"/><w:jc w:val="center"/><w:outlineLvl w:val="0"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>Figure 2: Illustrative data flow </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00AE56EF" wsp:rsidRPr="00AE56EF" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EB2959"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="3.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00AE56EF"><w:t>Volume Viewer</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00AE56EF" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t> This </w:t></w:r><w:r wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047"><w:t>is an application-level “widget†that allows the user to view and manipulate medical images, using the daVinci master</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t> manipulators as input devices.</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>Figure 2 shows an illustrative data flow diagram, focusing on the robot API and the pipeline for the video processing and visualization. This figure also shows the tool tracking and volume viewer subsystems. Although not specifically shown, calibration and registration functions are required. Note that other data flow configurations are possible, depending on the application requirements. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="4. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Performance Requirements </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:r><w:t>T</w:t></w:r><w:r wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047"><w:t>he system shall have at least one periodic loop (“heartbeatâ€) that interacts with the hardware devices and/or proprietary device interface software. Many of the following performance requirements depend on the frequency of this periodic loop. </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Robot API </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>Note: </w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:tab wx:wTab="150" wx:tlc="none" wx:cTlc="2"/><w:t>The following performance parameters are highly dependent on the particular robot that is used. The numbers cited below apply to the daVinci robot systems, but it is expected that other robot systems will meet or exceed these minimum requirements. </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Read-only Minimum Rate</w:t></w:r></w:p><w:p wsp:rsidR="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The minimum update rate for receiving state information (e.g., robot positions) from a read-only robot shall be 50 Hz (20 msec)</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.1.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Read-Write Minimum Rate</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The minimum update rate for receiving state information (e.g., robot positions) from a read-write robot shall be 30 Hz. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00F61047" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.1.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Commanding Minimum Rate</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The minimum update rate for commanding state changes (e.g., providing position goals) shall be 30 Hz, subject to physical constraints (e.g., robot must be able to reach target </w:t></w:r><w:r wsp:rsidR="00F61047"><w:t>positions within update cycle).</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.1.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Detection</w:t></w:r><w:r><w:t> Latency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The maximum</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> </w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>latency between detection of a physical state change and availability of this information from the robot API shall be 100 msec. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00F61047" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.1.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>C</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ommanded </w:t></w:r><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>tate</w:t></w:r><w:r><w:t> Latency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The</w:t></w:r><w:r wsp:rsidR="00F61047"><w:t> </w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>maximum latency between a commanded state change and the corresponding hardware output shall be 100 msec. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Video processing</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00F61047" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Video Capture Frame Rate</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The video capture frame rate shall be 30 frames per second. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00F61047" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00F61047" wsp:rsidP="00F61047"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Video Capture </w:t></w:r><w:r><w:t>Latency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The latency due to video capture shall not exceed 2 time frames (depends on video capture hardware). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRPr="00F61047" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Overlayed Video Frame Rate</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The processed and overlayed video frame rate shall be at least 10 frames per second. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Video Processing</w:t></w:r><w:r wsp:rsidRPr="001C74F6"><w:t> </w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>Latency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The latency due to video processing shall not exceed 1 time frame (e.g., 100 msec at 10 frames per second). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRPr="00F61047" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>tereo </w:t></w:r><w:r><w:t>R</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>econstruction </w:t></w:r><w:r><w:t>R</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>esolution</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The stereo reconstruction resolution is a function of the baseline width (distance between cameras), depth (distance from the cameras), camera resolution, and focal length. For a baseline of 5 mm (worst case for daVinci endoscope) and camera resolution of 640 x 480, the following resolutions are obtained (results in mm): </w:t></w:r></w:p><w:tbl><w:tblPr><w:tblW w:w="4403" w:type="dxa"/><w:tblBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tblBorders></w:tblPr><w:tblGrid><w:gridCol w:w="1372"/><w:gridCol w:w="756"/><w:gridCol w:w="756"/><w:gridCol w:w="756"/><w:gridCol w:w="763"/></w:tblGrid><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="418"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:rPr><w:rFonts w:cs="Times New Roman"/><w:color w:val="auto"/></w:rPr></w:pPr></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3028" w:type="dxa"/><w:gridSpan w:val="4"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>Focal length, pixels </w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="405"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>Depth, mm </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>700 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>800 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>900 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="758" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>1000 </w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="405"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>50 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>0.70 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>0.62 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>0.55 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="758" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>0.50 </w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="405"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>100 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>2.78 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>2.44 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>2.17 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="758" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>1.96 </w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="408"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>150 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>6.16 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>5.42 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>4.84 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="758" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>4.37 </w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="405"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>200 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>10.81 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>9.52 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>8.51 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="758" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>7.69 </w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="009F2FE2"><w:trPr><w:trHeight w:val="408"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1375" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/></w:pPr><w:r><w:rPr><w:b/><w:b-cs/></w:rPr><w:t>250 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>16.67 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>14.71 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="755" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>13.16 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="758" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="5" wx:bdrwidth="12" w:space="0" w:color="000000"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="DFDFDF"/><w:vAlign w:val="center"/></w:tcPr><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2"><w:pPr><w:pStyle w:val="Default"/><w:jc w:val="right"/><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>11.90 </w:t></w:r></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"/></wx:sub-section><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>R</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>egistration </w:t></w:r><w:r><w:t>E</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>rror</w:t></w:r><w:r><w:t> Limit</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The registration error between 3D anatomic models and the live (video) image shall not exceed 1.5 times (150% of) the stereo reconstruction resolution, at a specified depth and focal length (see 5.2.5), not including errors due to organ deformation. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>I</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>nitial </w:t></w:r><w:r><w:t>R</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>egistration</w:t></w:r><w:r><w:t> Limit</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The initial registration shall require no more than 1 second of computation time. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.2.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Visualization</w:t></w:r><w:r><w:t> Latency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The latency due to the visualization shall not exceed 10 msec (depends on video output hardware). </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Other device interfaces </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="001C74F6" wsp:rsidRDefault="001C74F6" wsp:rsidP="001C74F6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Minimum Update Rate</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The minimum update rate for receiving information from other devices (e.g., force sensor, tracker, etc.) shall be 50 Hz (20 msec). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.3.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>F</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>orce </w:t></w:r><w:r><w:t>D</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ata</w:t></w:r><w:r><w:t> L</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>atency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The latency of the force data (e.g., time between physical application of force and software reception of force measurement) shall be no more than 40 msec. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.3.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tracker</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t> </w:t></w:r><w:r><w:t>D</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ata</w:t></w:r><w:r><w:t> L</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>atency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The latency of the tracker data (e.g., time between physical motion and software reception of new position) shall be no more than 100 msec. </w:t></w:r></w:p><w:p wsp:rsidR="00472BD6" wsp:rsidRDefault="00472BD6" wsp:rsidP="00F61047"/></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Calibration and registration </w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>Note: Calibration and registration performance requirements shall be specified in the application requirements document, rather than in this system (workstation) requirements document. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tool Tracking</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>Note: The following specifications are for the daVinci stereoscopic endoscopes and the Intuitive tool tracking software implementation. </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.5.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tool Tracking U</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>pdate </w:t></w:r><w:r><w:t>R</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ate</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The update rate of Tool Tracking shall be no more than 200 ms. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.5.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tool Tracking L</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>atency</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The latency of Tool Tracking shall be no more than the update rate (the time to process 1 frame). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.5.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Position Accuracy</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The position of an instrument shall be determined with an average accuracy of at least 4 mm, at a distance of 75-80 mm. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>User Interface (Visualization)</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00472BD6"><w:t>Telesurgery application framework</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRPr="00472BD6" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.7.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>T</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ime </w:t></w:r><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ynchronization</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The time synchronization between different components shall be defined by the minimum (slowest) update rate of the components (e.g., if the slowest component updates every 100 msec, the time synchronization shall be within 100 msec). </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00472BD6" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="4.7.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>ystem </w:t></w:r><w:r><w:t>H</w:t></w:r><w:r wsp:rsidRPr="00F61047"><w:t>eartbeat</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00F61047"><w:r wsp:rsidRPr="00F61047"><w:t>The system heartbeat shall be 20 msec or less. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="4.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00F61047"><w:t>Volume viewer </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00472BD6" wsp:rsidP="00472BD6"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="5. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>S</w:t></w:r><w:r wsp:rsidR="00FD64F9" wsp:rsidRPr="00F61047"><w:t>afety Requirements</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00F61047" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Robot API</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00EC0396" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="5.1.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>P</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>ower</w:t></w:r><w:r><w:t> Disable</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The read-write Robot API shall include a software command to</w:t></w:r><w:r wsp:rsidR="00FD64F9" wsp:rsidRPr="00FD64F9"><w:t> </w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>allow application programs to disable power to the robot motors. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00EC0396" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="5.1.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>E</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>mergency </w:t></w:r><w:r><w:t>Disengagement</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The system shall provide a method for disengaging the research interface from any clinical robot capable of operating in a stand-alone manner (e.g., the daVinci) for emergency responses. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Video processing</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Other device interfaces</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00EC0396" wsp:rsidRPr="00EC0396" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="5.3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>E</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>mergency </w:t></w:r><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>top</w:t></w:r><w:r><w:t> Switch</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The system shall include an “emergency stop†switch that disables power to the robot motors and any other potentially hazardous device. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Calibration and registration </w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00EC0396" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="5.4.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>C</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>omputation </w:t></w:r><w:r><w:t>M</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>ethods</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The computation methods shall indicate the residual error, so that users can determine how much confidence to place in the result. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.5 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Tool tracking</w:t></w:r><w:r wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9"><w:t> </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.6 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>User Interface (Visualization)</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00EC0396" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="5.6.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Unmodified</w:t></w:r><w:r><w:t> Visualization</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The system shall provide a method for disengaging the research visualization output, so that a clinician can revert to the visualization provided by an unmodified clinical robot (e.g., a clinical daVinci). </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.7 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Telesurgery application framew</w:t></w:r><w:r wsp:rsidR="00EC0396"><w:t>ork</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00EC0396" wsp:rsidRPr="00EC0396" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="5.7.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Periodic</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t> </w:t></w:r><w:r><w:t>S</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>afety</w:t></w:r><w:r><w:t> Check</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00EC0396" wsp:rsidP="00FD64F9"><w:r><w:t>The </w:t></w:r><w:r wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9"><w:t>application framework shall periodically check all safety-critical subsystems (e.g., by verifying communication integrity) and initiate a safety response (e.g., using function 6.1.1) if a failure is detected. </w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="5.8 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Volume viewer</w:t></w:r></w:p></wx:sub-section></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00EC0396" wsp:rsidP="00EC0396"><w:pPr><w:pStyle w:val="Heading1"/><w:listPr><wx:t wx:val="6. "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Design Constraints</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="6.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Operating System</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The system shall be designed to operate on Red Hat Enterprise Linux WS 4. It is desirable for it to work with any type of Linux, with future extension to a real-time Linux such as RTAI. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="6.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Programming Language</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The software shall be written in C/C++. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading2"/><w:listPr><wx:t wx:val="6.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r><w:t>Software Libraries</w:t></w:r></w:p><wx:sub-section><w:p wsp:rsidR="00DD3A6B" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="6.3.1 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>CISST </w:t></w:r><w:r><w:t>L</w:t></w:r><w:r wsp:rsidRPr="00FD64F9"><w:t>ibraries</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The software shall use the CISST libraries. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00DD3A6B" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="6.3.2 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>VTK</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The software shall use the Visualization Toolkit (VTK) for visualization of images. The software may optionally use other toolkits that build on, or extend, VTK. </w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00DD3A6B" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="6.3.3 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>Intuitive Surgical</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The tool tracking module shall be based on existin</w:t></w:r><w:r wsp:rsidR="00DD3A6B"><w:t>g code from Intuitive Surgical.</w:t></w:r></w:p></wx:sub-section><wx:sub-section><w:p wsp:rsidR="00DD3A6B" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="00DD3A6B" wsp:rsidP="00DD3A6B"><w:pPr><w:pStyle w:val="Heading3"/><w:listPr><wx:t wx:val="6.3.4 "/><wx:font wx:val="Times New Roman"/></w:listPr></w:pPr><w:r wsp:rsidRPr="00FD64F9"><w:t>daVinci research API</w:t></w:r></w:p><w:p wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidRDefault="009F2FE2" wsp:rsidP="00FD64F9"><w:r wsp:rsidRPr="00FD64F9"><w:t>The daVinci research API shall be jointly evaluated by ISI and JHU to determine whether to add a requirement to port it to use the CISST operating system abstraction and real-time support libraries (for the thread that manages the data stream).</w:t></w:r></w:p><w:sectPr wsp:rsidR="009F2FE2" wsp:rsidRPr="00FD64F9" wsp:rsidSect="00F61047"><w:type w:val="continuous"/><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1080" w:right="1080" w:bottom="1080" w:left="1080" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:noEndnote/></w:sectPr></wx:sub-section></wx:sub-section></wx:sub-section></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.ats.feature/.project b/org.eclipse.osee.ats.feature/.project
new file mode 100644
index 00000000000..a6bed8a2ffc
--- /dev/null
+++ b/org.eclipse.osee.ats.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ats.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.ats.feature/build.properties b/org.eclipse.osee.ats.feature/build.properties
new file mode 100644
index 00000000000..aea85dbd452
--- /dev/null
+++ b/org.eclipse.osee.ats.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+ license.html,\
+ osee_32.png,\
+ feature.properties,\
+ epl-v10.html
diff --git a/org.eclipse.osee.ats.feature/epl-v10.html b/org.eclipse.osee.ats.feature/epl-v10.html
new file mode 100644
index 00000000000..ed4b196655e
--- /dev/null
+++ b/org.eclipse.osee.ats.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.ats.feature/feature.properties b/org.eclipse.osee.ats.feature/feature.properties
new file mode 100644
index 00000000000..74f43c8fb2b
--- /dev/null
+++ b/org.eclipse.osee.ats.feature/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 ATS Feature (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.ats.feature/feature.xml b/org.eclipse.osee.ats.feature/feature.xml
new file mode 100644
index 00000000000..c411613cb80
--- /dev/null
+++ b/org.eclipse.osee.ats.feature/feature.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.ats.feature"
+ label="%featureName"
+ version="1.0.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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="%licenseURL">
+ %license
+ </license>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="org.eclipse.osee.ats"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.ats.feature/license.html b/org.eclipse.osee.ats.feature/license.html
new file mode 100644
index 00000000000..c6af966b61e
--- /dev/null
+++ b/org.eclipse.osee.ats.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.ats.feature/osee_32.png b/org.eclipse.osee.ats.feature/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.ats.feature/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.ats.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.ats.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 00000000000..b9e91de52c5
--- /dev/null
+++ b/org.eclipse.osee.ats.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 ATS 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.ats.help.ui/.classpath b/org.eclipse.osee.ats.help.ui/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.ats.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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.ats.help.ui/.project b/org.eclipse.osee.ats.help.ui/.project
new file mode 100644
index 00000000000..756894e2f72
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ats.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.ats.help.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ats.help.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..1043fe0645c
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Apr 20 17:56:16 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.ats.help.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.ats.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..ff274663e8a
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.osee.ats.help.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.ats.help.ui/about.html b/org.eclipse.osee.ats.help.ui/about.html
new file mode 100644
index 00000000000..a96ffa40a2e
--- /dev/null
+++ b/org.eclipse.osee.ats.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.ats.help.ui/build-helper.xml b/org.eclipse.osee.ats.help.ui/build-helper.xml
new file mode 100644
index 00000000000..ab063100dfe
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/build-helper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.osee.ats.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 ATS user guide
+ </description>
+
+ <property name="osee.help.doc.url.base" value="http://wiki.eclipse.org" />
+ <property name="osee.help.image.folder" value="images" />
+
+ <property name="osee.help.doc" value="OSEE/ATS/Users_Guide" />
+ <property name="osee.help.doc.intro" value="${osee.help.doc}/Intro" />
+ <property name="osee.help.doc.views" value="${osee.help.doc}/Views" />
+ <property name="osee.help.doc.usage" value="${osee.help.doc}/Usage" />
+ <property name="osee.help.doc.tips" value="${osee.help.doc}/Tips" />
+ <property name="osee.help.doc.new" value="${osee.help.doc}/New" />
+ <property name="osee.help.doc.update" value="OSEE/Users_Guide/Update" />
+
+ <property name="osee.help.intro.file.name" value="OSEE ATS Intro" />
+ <property name="osee.help.views.file.name" value="OSEE ATS Views" />
+ <property name="osee.help.usage.file.name" value="OSEE ATS Usage" />
+ <property name="osee.help.tips.file.name" value="OSEE ATS Tips" />
+ <property name="osee.help.new.file.name" value="OSEE ATS New" />
+ <property name="osee.help.update.file.name" value="OSEE Update" />
+
+ <target name="all"
+ description="Generate Eclipse help content for the OSEE ATS user guide">
+ <sequential>
+ <delete>
+ <fileset dir="userguide" />
+ </delete>
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE"
+ help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.intro}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.intro}"
+ help.doc.filenameNoExtension="${osee.help.intro.file.name}" help.imagefolder="${osee.help.image.folder}"
+ targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE"
+ help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.views}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.views}"
+ help.doc.filenameNoExtension="${osee.help.views.file.name}" help.imagefolder="${osee.help.image.folder}"
+ targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE"
+ help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.usage}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.usage}"
+ help.doc.filenameNoExtension="${osee.help.usage.file.name}" help.imagefolder="${osee.help.image.folder}"
+ targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE"
+ help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.tips}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.tips}"
+ help.doc.filenameNoExtension="${osee.help.tips.file.name}" help.imagefolder="${osee.help.image.folder}"
+ targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE"
+ help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.new}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.new}"
+ help.doc.filenameNoExtension="${osee.help.new.file.name}" help.imagefolder="${osee.help.image.folder}"
+ targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.update}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.update}"
+ help.doc.filenameNoExtension="${osee.help.update.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+ </sequential>
+ </target>
+</project>
diff --git a/org.eclipse.osee.ats.help.ui/build.properties b/org.eclipse.osee.ats.help.ui/build.properties
new file mode 100644
index 00000000000..3d42260ef3b
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ userguide/,\
+ toc.xml,\
+ images/
diff --git a/org.eclipse.osee.ats.help.ui/customBuildCallbacks.xml b/org.eclipse.osee.ats.help.ui/customBuildCallbacks.xml
new file mode 100644
index 00000000000..26354d81057
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/customBuildCallbacks.xml
@@ -0,0 +1,161 @@
+<!-- ===================================================================== -->
+<!-- Custom targets called from a project's generated build.xml -->
+<!-- Set customBuildCallbacks=<path/to/this/file> in your build.properties.-->
+<!-- ===================================================================== -->
+<project name="Build specific targets and properties" default="noDefault">
+
+ <!-- ===================================================================== -->
+ <!-- Default target -->
+ <!-- ===================================================================== -->
+ <target name="noDefault">
+ <echo message="This file must be called with explicit targets" />
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.jars">
+ <!-- automatic generation of the user guide is disabled, see bug 242979
+ <ant antfile="build-helper.xml" target="all"/>
+ -->
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.jars">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="pre.name">
+ </target>
+
+ <target name="pre.@dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do during the compilation target <name>, after the compile -->
+ <!-- but before jaring. Substitute "name" with the name of the compilation-->
+ <!-- target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.compile.name">
+ </target>
+
+ <target name="post.compile.@dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- jar.location - the location of the compilation results -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.name">
+ </target>
+
+ <target name="post.@dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target clean -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.clean">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target clean -->
+ <!-- Available parameters : -->
+ <!-- plugin.destination - final destination of the build -->
+ <!-- build.result.folder - results of the compilation -->
+ <!-- temp.folder - temporary folder -->
+ <!-- ===================================================================== -->
+ <target name="post.clean">
+ </target>
+</project>
diff --git a/org.eclipse.osee.ats.help.ui/intro/overviewExtensionContent.xml b/org.eclipse.osee.ats.help.ui/intro/overviewExtensionContent.xml
new file mode 100644
index 00000000000..53f0ee35659
--- /dev/null
+++ b/org.eclipse.osee.ats.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="ATS"
+ url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.osee.ats.help.ui&amp;class=org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction&amp;id=org.eclipse.mylyn.doc.legend.show.action"
+ id="ats-overview" style-id="content-link">
+ <text>See the OSEE Define Perspective</text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
diff --git a/org.eclipse.osee.ats.help.ui/intro/tutorialsExtensionContent.xml b/org.eclipse.osee.ats.help.ui/intro/tutorialsExtensionContent.xml
new file mode 100644
index 00000000000..ab75088b2d6
--- /dev/null
+++ b/org.eclipse.osee.ats.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.ats.help.ui/plugin.xml b/org.eclipse.osee.ats.help.ui/plugin.xml
new file mode 100644
index 00000000000..5600ef3efc3
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="org.eclipse.osee.ats.help.ui.docs"
+ name="OSEE ATS"
+ point="org.eclipse.help.toc">
+ <toc
+ file="toc.xml"
+ primary="true">
+ </toc>
+ <toc
+ file="userguide/OSEE ATS Intro-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE ATS Views-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE ATS Usage-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE ATS Tips-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE ATS New-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Update-toc.xml"
+ primary="false">
+ </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>
+</plugin>
diff --git a/org.eclipse.osee.ats.help.ui/toc.xml b/org.eclipse.osee.ats.help.ui/toc.xml
new file mode 100644
index 00000000000..7fd0abceb06
--- /dev/null
+++ b/org.eclipse.osee.ats.help.ui/toc.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="OSEE ATS User Guide">
+ <anchor id="before-reference" />
+ <topic label="Getting Started">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE ATS Intro-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference" />
+ </topic>
+ <topic label="Views and Editors">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE ATS Views-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic label="Using ATS">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE ATS Usage-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE ATS Tips.html" label="Tips and Tricks">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE ATS Tips-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE ATS New.html" label="What&apos;s New">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE ATS New-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE Update.html" label="Updating this Document">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE ATS New-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <anchor id="after-reference" />
+ <anchor id="additions" />
+</toc>
+
+
diff --git a/org.eclipse.osee.ats.test/.classpath b/org.eclipse.osee.ats.test/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ats.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.ats.test/.project b/org.eclipse.osee.ats.test/.project
new file mode 100644
index 00000000000..20bc0834aae
--- /dev/null
+++ b/org.eclipse.osee.ats.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ats.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.ats.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ats.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..1882ec7fd2b
--- /dev/null
+++ b/org.eclipse.osee.ats.test/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Text Fragment
+Bundle-SymbolicName: org.eclipse.osee.ats.test;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Vendor: Eclipse.org
+Fragment-Host: org.eclipse.osee.ats
+Require-Bundle: org.junit4,
+ org.eclipse.osee.support.test.util;bundle-version="1.0.0"
+Import-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.ui.skynet.test.cases
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.osee.ats.test,
+ org.eclipse.osee.ats.test.cases,
+ org.eclipse.osee.ats.test.util
diff --git a/org.eclipse.osee.ats.test/build.properties b/org.eclipse.osee.ats.test/build.properties
new file mode 100644
index 00000000000..3f78ea4cf8d
--- /dev/null
+++ b/org.eclipse.osee.ats.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ fragment.xml
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsDbInitTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsDbInitTest.java
new file mode 100644
index 00000000000..24d47e387f7
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsDbInitTest.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.ats.test;
+
+import static org.junit.Assert.assertFalse;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.database.initialize.DatabaseInitializationOperation;
+import org.junit.Before;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDbInitTest {
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ protected void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(AtsPlugin.isProductionDb());
+ }
+
+ @org.junit.Test
+ public void testDemoDbInit() throws Exception {
+ System.out.println("Begin Database Initialization...");
+ DatabaseInitializationOperation.executeWithoutPrompting("ATS - Developer");
+ System.out.println("Database Initialization Complete.");
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Config_Suite.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Config_Suite.java
new file mode 100644
index 00000000000..b6d773d29e7
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Config_Suite.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.ats.test;
+
+import org.eclipse.osee.ats.test.cases.AtsActionableItemToTeamDefinitionTest;
+import org.eclipse.osee.ats.test.cases.AtsTeamDefintionToWorkflowTest;
+import org.eclipse.osee.ats.test.cases.AtsWorkItemDefinitionTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsWorkItemDefinitionTest.class, AtsActionableItemToTeamDefinitionTest.class,
+ AtsTeamDefintionToWorkflowTest.class})
+/**
+ * This test suite contains test that can be run against any production db
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsTest_Config_Suite {
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Demo_Suite.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Demo_Suite.java
new file mode 100644
index 00000000000..12d6e74dc92
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Demo_Suite.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.ats.test;
+
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.ats.test.cases.AtsBranchConfigurationTest;
+import org.eclipse.osee.ats.test.cases.AtsDeleteManagerTest;
+import org.eclipse.osee.ats.test.cases.AtsImageTest;
+import org.eclipse.osee.ats.test.cases.AtsPurgeTest;
+import org.eclipse.osee.ats.test.cases.AtsValidateAtsDatabaseTest;
+import org.eclipse.osee.ats.test.cases.SMAPromptChangeStatusTest;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsImageTest.class, AtsTest_TestDb_Suite.class, SMAPromptChangeStatusTest.class,
+ AtsDeleteManagerTest.class, AtsPurgeTest.class, AtsBranchConfigurationTest.class,
+ AtsValidateAtsDatabaseTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsTest_Demo_Suite {
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertTrue("Demo Application Server must be running.",
+ ClientSessionManager.getAuthenticationProtocols().contains("demo"));
+ assertTrue("Client must authenticate using demo protocol",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Production_Suite.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Production_Suite.java
new file mode 100644
index 00000000000..786c66647b9
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_Production_Suite.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.ats.test;
+
+import org.eclipse.osee.ats.test.cases.AtsImageTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsImageTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsTest_Production_Suite {
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_TestDb_Suite.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_TestDb_Suite.java
new file mode 100644
index 00000000000..a3d9bbed51c
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/AtsTest_TestDb_Suite.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.ats.test;
+
+import org.eclipse.osee.ats.test.cases.AtsBranchConfigurationTest;
+import org.eclipse.osee.ats.test.cases.AtsImageTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsImageTest.class, AtsBranchConfigurationTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsTest_TestDb_Suite {
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/MasterTestSuite_DemoDbInit.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/MasterTestSuite_DemoDbInit.java
new file mode 100644
index 00000000000..49dd04a26c9
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/MasterTestSuite_DemoDbInit.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.ats.test;
+
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.database.initialize.DatabaseInitializationOperation;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MasterTestSuite_DemoDbInit {
+
+ @org.junit.Test
+ public void testDemoDbInit() throws Exception {
+ assertTrue("Demo Application Server must be running", ClientSessionManager.getAuthenticationProtocols().contains(
+ "demo"));
+ System.out.println("Begin Database Initialization...");
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+
+ DatabaseInitializationOperation.executeWithoutPrompting("OSEE Demo Database");
+
+ TestUtil.severeLoggingEnd(monitorLog);
+ System.out.println("Database Initialization Complete.");
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsActionableItemToTeamDefinitionTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsActionableItemToTeamDefinitionTest.java
new file mode 100644
index 00000000000..3dacf54c6a2
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsActionableItemToTeamDefinitionTest.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.ats.test.cases;
+import static org.junit.Assert.*;
+
+import static org.junit.Assert.assertFalse;
+import java.util.Arrays;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsActionableItemToTeamDefinitionTest {
+
+ @org.junit.Test
+ public void testAtsActionableItemToTeamDefinition() throws Exception {
+ boolean error = false;
+ for (Artifact artifact : ArtifactQuery.getArtifactsFromType(ActionableItemArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch())) {
+ ActionableItemArtifact aia = (ActionableItemArtifact) artifact;
+ if (aia.isActionable()) {
+ if (TeamDefinitionArtifact.getImpactedTeamDefs(Arrays.asList(aia)).size() == 0) {
+ System.err.println("Actionable Item \"" + aia + "\" has no Team Def associated and is Actionable.");
+ error = true;
+ }
+ }
+ }
+ assertFalse(error);
+ }
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsBranchConfigurationTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsBranchConfigurationTest.java
new file mode 100644
index 00000000000..08fc7105663
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsBranchConfigurationTest.java
@@ -0,0 +1,443 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.test.cases;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowManager;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.config.AtsConfig;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.ats.util.widgets.XWorkingBranch;
+import org.eclipse.osee.ats.util.widgets.commit.XCommitManager;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchArchivedState;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchControlled;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeData.KindType;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.Before;
+
+/**
+ * Run from the ATS Navigator after the DB is configured for either ATS - Dev or Demo
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsBranchConfigurationTest {
+
+ public enum TestType {
+ BranchViaTeamDef, BranchViaVersions, BranchViaParallelVersions
+ }
+
+ @Before
+ public void testSetup() throws Exception {
+ if (AtsPlugin.isProductionDb()) throw new IllegalStateException(
+ "BranchConfigThroughTeamDefTest should not be run on production DB");
+ AtsBulkLoadCache.run(true);
+ }
+
+ @org.junit.Test
+ public void testBranchViaVersions() throws Exception {
+
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Running testBranchViaVersions...");
+
+ String namespace = "org.branchTest." + TestType.BranchViaVersions.name().toLowerCase();
+ // Cleanup from previous run
+ cleanupBranchTest(TestType.BranchViaVersions);
+
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Configuring ATS for team org.branchTest.viaTeamDefs");
+ // create team definition and actionable item
+ AtsConfig.configureAtsForDefaultTeam(namespace, TestType.BranchViaVersions.name(), Arrays.asList(
+ TestType.BranchViaVersions.name() + "- Ver1", TestType.BranchViaVersions.name() + "- Ver2"), Arrays.asList(
+ TestType.BranchViaVersions.name() + "- A1", TestType.BranchViaVersions.name() + "- A2"), namespace);
+
+ TestUtil.sleep(2000);
+
+ // create main branch
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Creating root branch");
+ // Create SAW_Bld_2 branch off SAW_Bld_1
+ Branch viaTeamDefBranch = createRootBranch(TestType.BranchViaVersions.name());
+
+ TestUtil.sleep(2000);
+
+ // configure version to use branch and allow create/commit
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Configuring version to use branch and allow create/commit");
+ TeamDefinitionArtifact teamDef =
+ (TeamDefinitionArtifact) ArtifactQuery.getArtifactFromTypeAndName(TeamDefinitionArtifact.ARTIFACT_NAME,
+ TestType.BranchViaVersions.name(), AtsPlugin.getAtsBranch());
+ VersionArtifact verArtToTarget = null;
+ for (VersionArtifact vArt : teamDef.getVersionsArtifacts()) {
+ if (vArt.getDescriptiveName().contains("Ver1")) {
+ verArtToTarget = vArt;
+ }
+ }
+ verArtToTarget.setSoleAttributeFromString(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(),
+ viaTeamDefBranch.getBranchId() + "");
+ // setup team def to allow create/commit of branch
+ verArtToTarget.setSoleAttributeValue(ATSAttributes.ALLOW_COMMIT_BRANCH.getStoreName(), true);
+ verArtToTarget.setSoleAttributeValue(ATSAttributes.ALLOW_CREATE_BRANCH.getStoreName(), true);
+ verArtToTarget.persistAttributes();
+
+ TestUtil.sleep(2000);
+
+ // setup workflow page to have create/commit branch widgets
+ setupWorkflowPageToHaveCreateCommitBranchWidgets(namespace);
+
+ // create action and target for version
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Create new Action and target for version " + verArtToTarget);
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, TestType.BranchViaVersions.name() + " Req Changes", "description",
+ ChangeType.Problem, PriorityType.Priority_1, Arrays.asList("Other"), false, null,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(TestType.BranchViaVersions.name() + "- A1")),
+ transaction);
+ actionArt.getTeamWorkFlowArtifacts().iterator().next().addRelation(
+ AtsRelation.TeamWorkflowTargetedForVersion_Version, verArtToTarget);
+ actionArt.getTeamWorkFlowArtifacts().iterator().next().persistAttributesAndRelations(transaction);
+ transaction.execute();
+
+ final TeamWorkFlowArtifact teamWf = actionArt.getTeamWorkFlowArtifacts().iterator().next();
+ TeamWorkflowManager dtwm = new TeamWorkflowManager(teamWf);
+
+ // Transition to desired state
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Transitioning to Implement state");
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ dtwm.transitionTo(DefaultTeamState.Implement, null, false, transaction);
+ teamWf.persistAttributesAndRelations(transaction);
+ transaction.execute();
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ SMAEditor.editArtifact(teamWf, true);
+
+ // Verify XWorkingBranch and XCommitManger widgets exist in editor
+ try {
+ verifyXWidgetsExistInEditor(teamWf);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ fail(ex.getLocalizedMessage());
+ }
+ }
+ }, true);
+
+ // create branch
+ createBranch(namespace, teamWf);
+
+ // make changes
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Make new requirement artifact");
+ Artifact rootArtifact =
+ ArtifactQuery.getDefaultHierarchyRootArtifact(teamWf.getSmaMgr().getBranchMgr().getWorkingBranch(), true);
+ Artifact blk3MainArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT,
+ teamWf.getSmaMgr().getBranchMgr().getWorkingBranch(),
+ TestType.BranchViaVersions.name() + " Requirement");
+ rootArtifact.addChild(blk3MainArt);
+ blk3MainArt.persistAttributesAndRelations();
+
+ // commit branch
+ commitBranch(teamWf);
+
+ // test change report
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Test change report results");
+ Collection<Artifact> newArts =
+ teamWf.getSmaMgr().getBranchMgr().getChangeDataFromEarliestTransactionId().getArtifacts(KindType.Artifact,
+ ModificationType.NEW);
+ assertTrue("Should be 1 new artifact in change report, found " + newArts.size(), newArts.size() == 1);
+
+ }
+
+ @org.junit.Test
+ public void testBranchViaTeamDefinition() throws Exception {
+
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Running testBranchViaTeamDefinition...");
+
+ String namespace = "org.branchTest." + TestType.BranchViaTeamDef.name().toLowerCase();
+ // Cleanup from previous run
+ cleanupBranchTest(TestType.BranchViaTeamDef);
+
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Configuring ATS for team org.branchTest.viaTeamDefs");
+ // create team definition and actionable item
+ AtsConfig.configureAtsForDefaultTeam(namespace, TestType.BranchViaTeamDef.name(), null, Arrays.asList(
+ TestType.BranchViaTeamDef.name() + "- A1", TestType.BranchViaTeamDef.name() + "- A2"), namespace);
+
+ TestUtil.sleep(2000);
+
+ // create main branch
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Creating root branch");
+ // Create SAW_Bld_2 branch off SAW_Bld_1
+ Branch viaTeamDefBranch = createRootBranch(TestType.BranchViaTeamDef.name());
+
+ TestUtil.sleep(2000);
+
+ // configure team def to use branch
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Configuring team def to use branch and allow create/commit");
+ TeamDefinitionArtifact teamDef =
+ (TeamDefinitionArtifact) ArtifactQuery.getArtifactFromTypeAndName(TeamDefinitionArtifact.ARTIFACT_NAME,
+ TestType.BranchViaTeamDef.name(), AtsPlugin.getAtsBranch());
+ teamDef.setSoleAttributeFromString(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(),
+ viaTeamDefBranch.getBranchId() + "");
+ // setup team def to allow create/commit of branch
+ teamDef.setSoleAttributeValue(ATSAttributes.ALLOW_COMMIT_BRANCH.getStoreName(), true);
+ teamDef.setSoleAttributeValue(ATSAttributes.ALLOW_CREATE_BRANCH.getStoreName(), true);
+ teamDef.setSoleAttributeValue(ATSAttributes.TEAM_USES_VERSIONS_ATTRIBUTE.getStoreName(), false);
+ teamDef.persistAttributes();
+
+ TestUtil.sleep(2000);
+
+ // setup workflow page to have create/commit branch widgets
+ setupWorkflowPageToHaveCreateCommitBranchWidgets(namespace);
+
+ // create action,
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Create new Action");
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, TestType.BranchViaTeamDef.name() + " Req Changes", "description",
+ ChangeType.Problem, PriorityType.Priority_1, Arrays.asList("Other"), false, null,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(TestType.BranchViaTeamDef.name() + "- A1")),
+ transaction);
+ transaction.execute();
+
+ final TeamWorkFlowArtifact teamWf = actionArt.getTeamWorkFlowArtifacts().iterator().next();
+ TeamWorkflowManager dtwm = new TeamWorkflowManager(teamWf);
+
+ // Transition to desired state
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Transitioning to Implement state");
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ dtwm.transitionTo(DefaultTeamState.Implement, null, false, transaction);
+ teamWf.persistAttributesAndRelations(transaction);
+ transaction.execute();
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ SMAEditor.editArtifact(teamWf, true);
+
+ // Verify XWorkingBranch and XCommitManger widgets exist in editor
+ try {
+ verifyXWidgetsExistInEditor(teamWf);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ fail(ex.getLocalizedMessage());
+ }
+ }
+ }, true);
+
+ // create branch
+ createBranch(namespace, teamWf);
+
+ // make changes
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Make new requirement artifact");
+ Artifact rootArtifact =
+ ArtifactQuery.getDefaultHierarchyRootArtifact(teamWf.getSmaMgr().getBranchMgr().getWorkingBranch(), true);
+ Artifact blk3MainArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT,
+ teamWf.getSmaMgr().getBranchMgr().getWorkingBranch(),
+ TestType.BranchViaTeamDef.name() + " Requirement");
+ rootArtifact.addChild(blk3MainArt);
+ blk3MainArt.persistAttributesAndRelations();
+
+ // commit branch
+ commitBranch(teamWf);
+
+ // test change report
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Test change report results");
+ Collection<Artifact> newArts =
+ teamWf.getSmaMgr().getBranchMgr().getChangeDataFromEarliestTransactionId().getArtifacts(KindType.Artifact,
+ ModificationType.NEW);
+ assertTrue("Should be 1 new artifact in change report, found " + newArts.size(), newArts.size() == 1);
+ }
+
+ private Branch createRootBranch(String branchName) throws Exception {
+ List<String> skynetTypeImport = new ArrayList<String>();
+ skynetTypeImport.add("org.eclipse.osee.framework.skynet.core.OseeTypes_ProgramAndCommon");
+ skynetTypeImport.add("org.eclipse.osee.framework.skynet.core.OseeTypes_ProgramBranch");
+ skynetTypeImport.add("org.eclipse.osee.ats.config.demo.OseeTypes_DemoProgram");
+
+ return BranchManager.createTopLevelBranch(branchName, branchName, skynetTypeImport, true);
+ }
+
+ private void cleanupBranchTest(TestType testType) throws Exception {
+ String namespace = "org.branchTest." + testType.name().toLowerCase();
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Cleanup from previous run of ATS for team " + namespace);
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ try {
+ ActionArtifact aArt =
+ (ActionArtifact) ArtifactQuery.getArtifactFromTypeAndName(ActionArtifact.ARTIFACT_NAME,
+ testType.name() + " Req Changes", AtsPlugin.getAtsBranch());
+ for (TeamWorkFlowArtifact teamArt : aArt.getTeamWorkFlowArtifacts()) {
+ SMAEditor.close(teamArt, false);
+ teamArt.deleteAndPersist(transaction);
+ }
+ aArt.deleteAndPersist(transaction);
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing
+ }
+ transaction.execute();
+
+ // Delete VersionArtifacts
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (Artifact verArt : ArtifactQuery.getArtifactsFromType(VersionArtifact.ARTIFACT_NAME, AtsPlugin.getAtsBranch())) {
+ if (verArt.getDescriptiveName().contains(testType.name())) {
+ verArt.deleteAndPersist(transaction);
+ }
+ }
+ transaction.execute();
+
+ // Delete Team Definitions
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ try {
+ Artifact art =
+ ArtifactQuery.getArtifactFromTypeAndName(TeamDefinitionArtifact.ARTIFACT_NAME, testType.name(),
+ AtsPlugin.getAtsBranch());
+ art.deleteAndPersist(transaction);
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing
+ }
+ transaction.execute();
+
+ // Delete AIs
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ try {
+ Artifact art =
+ ArtifactQuery.getArtifactFromTypeAndName(ActionableItemArtifact.ARTIFACT_NAME, testType.name(),
+ AtsPlugin.getAtsBranch());
+ for (Artifact childArt : art.getChildren()) {
+ childArt.deleteAndPersist(transaction);
+ }
+ art.deleteAndPersist(transaction);
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing
+ }
+ transaction.execute();
+
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (Artifact workArt : ArtifactQuery.getArtifactsFromType(WorkPageDefinition.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch())) {
+ if (workArt.getDescriptiveName().startsWith(namespace)) {
+ workArt.deleteAndPersist(transaction);
+ }
+ }
+ for (Artifact workArt : ArtifactQuery.getArtifactsFromType(WorkFlowDefinition.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch())) {
+ if (workArt.getDescriptiveName().startsWith(namespace)) {
+ workArt.deleteAndPersist(transaction);
+ }
+ }
+ transaction.execute();
+
+ try {
+ // delete working branches
+ for (Branch workingBranch : BranchManager.getBranches(BranchArchivedState.ALL, BranchControlled.ALL,
+ BranchType.WORKING)) {
+ if (workingBranch.getBranchName().contains(testType.name())) {
+ BranchManager.purgeBranchInJob(workingBranch);
+ TestUtil.sleep(2000);
+ }
+ }
+ // delete baseline branch
+ Branch branch = BranchManager.getKeyedBranch(testType.name());
+ if (branch != null) {
+ BranchManager.purgeBranchInJob(branch);
+ TestUtil.sleep(2000);
+ }
+
+ } catch (BranchDoesNotExist ex) {
+ // do nothing
+ }
+ }
+
+ private void commitBranch(TeamWorkFlowArtifact teamWf) throws Exception {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Commit Branch");
+ teamWf.getSmaMgr().getBranchMgr().commitWorkingBranch(false, true,
+ teamWf.getSmaMgr().getBranchMgr().getWorkingBranch().getParentBranch(), true);
+ TestUtil.sleep(2000);
+ }
+
+ private void createBranch(String namespace, TeamWorkFlowArtifact teamWf) throws Exception {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Creating working branch");
+ String implementPageId = namespace + ".Implement";
+ Result result = teamWf.getSmaMgr().getBranchMgr().createWorkingBranch(implementPageId, false);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ TestUtil.sleep(2000);
+ }
+
+ private void verifyXWidgetsExistInEditor(TeamWorkFlowArtifact teamWf) throws OseeCoreException {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Verify XWorkingBranch and XCommitManger widgets exist in editor");
+ SMAEditor smaEditor = SMAEditor.getSmaEditor(teamWf);
+ assertNotNull("Can't retrieve SMAEditor for workflow " + teamWf, smaEditor);
+
+ Collection<XWidget> xWidgets =
+ smaEditor.getXWidgetsFromState(smaEditor.getSmaMgr().getStateMgr().getCurrentStateName(),
+ XWorkingBranch.class);
+ assertTrue("Should be 1 XWorkingBranch widget in current state, found " + xWidgets.size(), xWidgets.size() == 1);
+ xWidgets =
+ smaEditor.getXWidgetsFromState(smaEditor.getSmaMgr().getStateMgr().getCurrentStateName(),
+ XCommitManager.class);
+ assertTrue("Should be 1 XCommitManager widget in current state, found " + xWidgets.size(), xWidgets.size() == 1);
+ }
+
+ private void setupWorkflowPageToHaveCreateCommitBranchWidgets(String namespace) throws Exception {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Setup new workflow page to have create/commit branch widgets");
+ String implementPageId = namespace + ".Implement";
+ Artifact implementPageDef = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(implementPageId);
+ implementPageDef.addRelation(AtsRelation.WorkItem__Child,
+ WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(ATSAttributes.WORKING_BRANCH_WIDGET.getStoreName()));
+ implementPageDef.addRelation(AtsRelation.WorkItem__Child,
+ WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(ATSAttributes.COMMIT_MANAGER_WIDGET.getStoreName()));
+ implementPageDef.persistAttributesAndRelations();
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsDeleteManagerTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsDeleteManagerTest.java
new file mode 100644
index 00000000000..2885e31b37c
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsDeleteManagerTest.java
@@ -0,0 +1,249 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.test.cases;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.test.util.DemoTestUtil;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsDeleteManager;
+import org.eclipse.osee.ats.util.AtsDeleteManager.DeleteOption;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.ats.util.widgets.ReviewManager;
+import org.eclipse.osee.ats.util.widgets.TaskManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.CountingMap;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.support.test.util.AtsUserCommunity;
+import org.eclipse.osee.support.test.util.DemoActionableItems;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * This test must be run against a demo database. It tests the case where a team workflow or action is deleted or purged
+ * and makes sure that all expected related ats objects are deleted also.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsDeleteManagerTest {
+
+ private enum TestNames {
+ TeamArtDeleteOneWorkflow, TeamArtDeleteWithTwoWorkflows, TeamArtPurge, ActionDelete, ActionPurge
+ };
+
+ @BeforeClass
+ public static void testCleanupPre() throws Exception {
+ cleanup();
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.ats.util.AtsDeleteManager#handleDeletePurgeAtsObject(java.util.Collection, org.eclipse.osee.ats.util.AtsDeleteManager.DeleteOption[])}
+ * .
+ */
+ @org.junit.Test
+ public void testTeamArtDeleteOneWorkflow() throws Exception {
+ if (AtsPlugin.isProductionDb()) fail("Test not intended for production Db");
+ if (DemoTestUtil.isDbPopulatedWithDemoData().isFalse()) fail("Test should be run on Demo Db");
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Create Action
+ TeamWorkFlowArtifact teamArt =
+ createAction(TestNames.TeamArtDeleteOneWorkflow,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(DemoActionableItems.SAW_Code.getName())),
+ transaction);
+ transaction.execute();
+
+ // Verify exists
+ verifyExists(TestNames.TeamArtDeleteOneWorkflow, 1, 1, 0, 2, 1);
+
+ // Delete
+ AtsDeleteManager.handleDeletePurgeAtsObject(Arrays.asList(teamArt), DeleteOption.Delete);
+
+ // Verify doesn't exist
+ verifyExists(TestNames.TeamArtDeleteOneWorkflow, 0, 0, 0, 0, 0);
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.ats.util.AtsDeleteManager#handleDeletePurgeAtsObject(java.util.Collection, org.eclipse.osee.ats.util.AtsDeleteManager.DeleteOption[])}
+ * .
+ */
+ @org.junit.Test
+ public void testTeamArtDeleteWithTwoWorkflows() throws Exception {
+ if (AtsPlugin.isProductionDb()) fail("Test not intended for production Db");
+ if (DemoTestUtil.isDbPopulatedWithDemoData().isFalse()) fail("Test should be run on Demo Db");
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Create Action
+ TeamWorkFlowArtifact teamArt =
+ createAction(TestNames.TeamArtDeleteWithTwoWorkflows,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(DemoActionableItems.SAW_Code.getName(),
+ DemoActionableItems.SAW_Requirements.getName())), transaction);
+ transaction.execute();
+
+ // Verify exists
+ verifyExists(TestNames.TeamArtDeleteWithTwoWorkflows, 1, 1, 1, 2, 1);
+
+ // Delete
+ AtsDeleteManager.handleDeletePurgeAtsObject(Arrays.asList(teamArt), DeleteOption.Delete);
+
+ // Verify Action and Req Workflow still exist
+ verifyExists(TestNames.TeamArtDeleteWithTwoWorkflows, 1, 0, 1, 0, 0);
+ }
+
+ @org.junit.Test
+ public void testTeamArtPurge() throws Exception {
+ if (AtsPlugin.isProductionDb()) fail("Test not intended for production Db");
+ if (DemoTestUtil.isDbPopulatedWithDemoData().isFalse()) fail("Test should be run on Demo Db");
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Create Action
+ TeamWorkFlowArtifact teamArt =
+ createAction(TestNames.TeamArtPurge,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(DemoActionableItems.SAW_Code.getName())),
+ transaction);
+ transaction.execute();
+
+ // Verify exists
+ verifyExists(TestNames.TeamArtPurge, 1, 1, 0, 2, 1);
+
+ // Delete
+ AtsDeleteManager.handleDeletePurgeAtsObject(Arrays.asList(teamArt), DeleteOption.Purge);
+
+ // Verify doesn't exist
+ verifyExists(TestNames.TeamArtPurge, 0, 0, 0, 0, 0);
+ }
+
+ @org.junit.Test
+ public void testActionDelete() throws Exception {
+ if (AtsPlugin.isProductionDb()) fail("Test not intended for production Db");
+ if (DemoTestUtil.isDbPopulatedWithDemoData().isFalse()) fail("Test should be run on Demo Db");
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Create Action
+ TeamWorkFlowArtifact teamArt =
+ createAction(TestNames.ActionDelete,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(DemoActionableItems.SAW_Code.getName())),
+ transaction);
+ transaction.execute();
+
+ // Verify exists
+ verifyExists(TestNames.ActionDelete, 1, 1, 0, 2, 1);
+
+ // Delete
+ AtsDeleteManager.handleDeletePurgeAtsObject(Arrays.asList(teamArt), DeleteOption.Delete);
+
+ // Verify doesn't exist
+ verifyExists(TestNames.ActionDelete, 0, 0, 0, 0, 0);
+ }
+
+ @org.junit.Test
+ public void testActionPurge() throws Exception {
+ if (AtsPlugin.isProductionDb()) fail("Test not intended for production Db");
+ if (DemoTestUtil.isDbPopulatedWithDemoData().isFalse()) fail("Test should be run on Demo Db");
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Create Action
+ TeamWorkFlowArtifact teamArt =
+ createAction(TestNames.ActionPurge,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(DemoActionableItems.SAW_Code.getName())),
+ transaction);
+ transaction.execute();
+
+ // Verify exists
+ verifyExists(TestNames.ActionPurge, 1, 1, 0, 2, 1);
+
+ // Delete
+ AtsDeleteManager.handleDeletePurgeAtsObject(Arrays.asList(teamArt), DeleteOption.Purge);
+
+ // Verify doesn't exist
+ verifyExists(TestNames.ActionPurge, 0, 0, 0, 0, 0);
+ }
+
+ private void verifyExists(TestNames testName, int numActions, int numCodeWorkflows, int numReqWorkflows, int numTasks, int numReviews) throws OseeCoreException {
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromName(testName + "%", AtsPlugin.getAtsBranch(), false);
+
+ CountingMap<String> numArts = new CountingMap<String>();
+ for (Artifact artifact : artifacts) {
+ numArts.put(artifact.getArtifactTypeName());
+ }
+ assertTrue("Should be " + numActions + " ActionArtifact, found " + numArts.get(ActionArtifact.ARTIFACT_NAME),
+ numArts.get(ActionArtifact.ARTIFACT_NAME) == numActions);
+ assertTrue(
+ "Should be " + numCodeWorkflows + " Demo Code Workflow, found " + numArts.get(TestUtil.DEMO_CODE_TEAM_WORKFLOW_ARTIFACT),
+ numArts.get(TestUtil.DEMO_CODE_TEAM_WORKFLOW_ARTIFACT) == numCodeWorkflows);
+ assertTrue(
+ "Should be " + numReqWorkflows + " Demo Req Workflow, found " + numArts.get(TestUtil.DEMO_REQ_TEAM_WORKFLOW_ARTIFACT),
+ numArts.get(TestUtil.DEMO_REQ_TEAM_WORKFLOW_ARTIFACT) == numReqWorkflows);
+ assertTrue("Should be " + numTasks + " TaskArtifacts, found " + numArts.get(TaskArtifact.ARTIFACT_NAME),
+ numArts.get(TaskArtifact.ARTIFACT_NAME) == numTasks);
+ assertTrue(
+ "Should be " + numReviews + " DecisionReviewArtifact, found " + numArts.get(DecisionReviewArtifact.ARTIFACT_NAME),
+ numArts.get(DecisionReviewArtifact.ARTIFACT_NAME) == numReviews);
+ }
+
+ private TeamWorkFlowArtifact createAction(TestNames testName, Collection<ActionableItemArtifact> actionableItems, SkynetTransaction transaction) throws OseeCoreException {
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, testName.name(), "Description", ChangeType.Improvement,
+ PriorityType.Priority_2, Arrays.asList(AtsUserCommunity.Other.name()), false, null, actionableItems,
+ transaction);
+
+ TeamWorkFlowArtifact teamArt = null;
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ if (team.getTeamDefinition().getDescriptiveName().contains("Code")) {
+ teamArt = team;
+ }
+ }
+
+ TaskManager.createTasks(teamArt, Arrays.asList(testName.name() + "Task 1", testName.name() + "Task 2"), null,
+ transaction);
+
+ DecisionReviewArtifact decRev =
+ ReviewManager.createNewDecisionReview(teamArt, ReviewBlockType.None, testName.name(),
+ DefaultTeamState.Endorse.name(), "Description", ReviewManager.getDefaultDecisionReviewOptions(),
+ Arrays.asList(UserManager.getUser()));
+ decRev.persistAttributesAndRelations(transaction);
+
+ return teamArt;
+
+ }
+
+ @AfterClass
+ public static void testCleanupPost() throws Exception {
+ cleanup();
+ }
+
+ public static void cleanup() throws Exception {
+ List<String> names = new ArrayList<String>();
+ for (TestNames testName : TestNames.values()) {
+ names.add(testName.name());
+ }
+ DemoTestUtil.cleanupSimpleTest(names);
+ }
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsImageTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsImageTest.java
new file mode 100644
index 00000000000..29f4677c138
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsImageTest.java
@@ -0,0 +1,24 @@
+/*
+ * Created on Jun 15, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ats.test.cases;
+
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.ui.skynet.test.cases.ImageManagerTest;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsImageTest extends ImageManagerTest {
+
+ /**
+ * @param imageClassName
+ * @param oseeImages
+ */
+ public AtsImageTest() {
+ super("AtsImage", AtsImage.values());
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToMassEditorTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToMassEditorTest.java
new file mode 100644
index 00000000000..e74febeee41
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToMassEditorTest.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.ats.test.cases;
+
+import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.navigate.MassEditTeamVersionItem;
+import org.eclipse.osee.ats.navigate.NavigateView;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.test.util.DemoTestUtil;
+import org.eclipse.osee.ats.test.util.NavigateTestUtil;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNavigateItemsToMassEditorTest {
+
+ public AtsNavigateItemsToMassEditorTest() {
+ }
+
+ @org.junit.Test
+ public void testDemoDatabase() throws Exception {
+ DemoTestUtil.setUpTest();
+ }
+
+ @org.junit.Test
+ public void testTeamVersions() throws Exception {
+ closeTaskEditors();
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Team Versions");
+ ((MassEditTeamVersionItem) item).setSelectedTeamDef(TeamDefinitionArtifact.getTeamDefinitions(
+ Arrays.asList("SAW SW")).iterator().next());
+ handleGeneralDoubleClickAndTestResults(item, VersionArtifact.class, 3);
+ }
+
+ public void handleGeneralDoubleClickAndTestResults(XNavigateItem item, Class<?> clazz, int numOfType) throws OseeCoreException {
+ NavigateView.getNavigateView().handleDoubleClick(item, TableLoadOption.ForcePend, TableLoadOption.NoUI);
+ MassArtifactEditor massEditor = getMassArtifactEditor();
+ assertTrue(massEditor != null);
+ Collection<Artifact> arts = massEditor.getLoadedArtifacts();
+ NavigateTestUtil.testExpectedVersusActual(item.getName(), arts, clazz, numOfType);
+ }
+
+ private MassArtifactEditor getMassArtifactEditor() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IEditorReference editors[] = page.getEditorReferences();
+ for (int j = 0; j < editors.length; j++) {
+ IEditorReference editor = editors[j];
+ if (editor.getPart(false) instanceof MassArtifactEditor) {
+ return (MassArtifactEditor) editor.getPart(false);
+ }
+ }
+ return null;
+ }
+
+ private void closeTaskEditors() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IEditorReference editors[] = page.getEditorReferences();
+ for (int j = 0; j < editors.length; j++) {
+ IEditorReference editor = editors[j];
+ if (editor.getPart(false) instanceof TaskEditor) {
+ page.closeEditor((TaskEditor) editor.getPart(false), false);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToTaskEditorTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToTaskEditorTest.java
new file mode 100644
index 00000000000..a41ad02707a
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToTaskEditorTest.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.test.cases;
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.navigate.NavigateView;
+import org.eclipse.osee.ats.navigate.SearchNavigateItem;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.task.TaskXViewer;
+import org.eclipse.osee.ats.test.util.CustomizeDemoTableTestUtil;
+import org.eclipse.osee.ats.test.util.DemoTestUtil;
+import org.eclipse.osee.ats.test.util.NavigateTestUtil;
+import org.eclipse.osee.ats.world.search.TaskSearchWorldSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNavigateItemsToTaskEditorTest {
+
+ @org.junit.Test
+public void testDemoDatabase() throws Exception {
+ DemoTestUtil.setUpTest();
+ }
+
+ @org.junit.Test
+public void testMyTasksEditor() throws Exception {
+ TaskEditor.closeAll();
+ // Place holder for future navigate items opening TaskEditor
+ // XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("My Tasks (Editor)");
+ // handleGeneralDoubleClickAndTestResults(item, TaskArtifact.class, DemoDbTasks.getNumTasks());
+ }
+
+ @org.junit.Test
+public void testTaskSearch() throws Exception {
+ Set<TeamDefinitionArtifact> selectedUsers = TeamDefinitionArtifact.getTeamTopLevelDefinitions(Active.Active);
+ TaskEditor.closeAll();
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Task Search");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof TaskSearchWorldSearchItem);
+ handleGeneralDoubleClickAndTestResults(item, TaskSearchWorldSearchItem.class, 0,
+ TableLoadOption.DontCopySearchItem);
+ runGeneralTaskSearchOnCompletedCancelledTest(item, true, 14);
+ runGeneralTaskSearchOnCompletedCancelledTest(item, false, 0);
+ runGeneralTaskSearchOnTeamTest(item, selectedUsers, 0);
+ selectedUsers.clear();
+ List<String> teamDefs = new ArrayList<String>();
+ teamDefs.add("SAW Code");
+ Set<TeamDefinitionArtifact> tda = TeamDefinitionArtifact.getTeamDefinitions(teamDefs);
+ runGeneralTaskSearchOnTeamTest(item, tda, 14);
+ runGeneralTaskSearchOnAssigneeTest(item, "Joe Smith", 14);
+ runGeneralTaskSearchOnVersionTest(item, "SAW_Bld_1", 0);
+ runGeneralTaskSearchOnVersionTest(item, "SAW_Bld_2", 14);
+ selectedUsers.clear();
+ runGeneralTaskSearchOnTeamTest(item, selectedUsers, 14);
+ runGeneralTaskSearchOnAssigneeTest(item, "Kay Jones", 8);
+
+ }
+
+ public void runGeneralTaskSearchTest(XNavigateItem item, int expectedNum) throws Exception {
+ TaskEditor editor = getSingleEditorOrFail();
+ editor.getTaskActionPage().reSearch();
+ Collection<Artifact> arts = editor.getLoadedArtifacts();
+ NavigateTestUtil.testExpectedVersusActual(item.getName(), expectedNum, arts.size());
+ }
+
+ public void runGeneralTaskSearchOnAssigneeTest(XNavigateItem item, String assignee, int expectedNum) throws Exception {
+ TaskEditor editor = getSingleEditorOrFail();
+ ((TaskSearchWorldSearchItem) editor.getTaskActionPage().getDynamicWidgetLayoutListener()).setSelectedUser(UserManager.getUserByName(assignee));
+ runGeneralTaskSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTaskSearchOnTeamTest(XNavigateItem item, Set<TeamDefinitionArtifact> selectedUsers, int expectedNum) throws Exception {
+ // need to set team selected users
+ TaskEditor editor = getSingleEditorOrFail();
+ IDynamicWidgetLayoutListener dwl = editor.getTaskActionPage().getDynamicWidgetLayoutListener();
+ ((TaskSearchWorldSearchItem) dwl).setSelectedTeamDefinitions(selectedUsers);
+ runGeneralTaskSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTaskSearchOnVersionTest(XNavigateItem item, String versionString, int expectedNum) throws Exception {
+ TaskEditor editor = getSingleEditorOrFail();
+ ((TaskSearchWorldSearchItem) editor.getTaskActionPage().getDynamicWidgetLayoutListener()).setVersion(versionString);
+ runGeneralTaskSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTaskSearchOnCompletedCancelledTest(XNavigateItem item, boolean selected, int expectedNum) throws Exception {
+ Artifact groupArt =
+ ArtifactQuery.getArtifactFromTypeAndName(UniversalGroup.ARTIFACT_TYPE_NAME, "Test Group",
+ AtsPlugin.getAtsBranch());
+ Set<Artifact> selectedUsers = new HashSet<Artifact>();
+ TaskEditor editor = getSingleEditorOrFail();
+ ((TaskSearchWorldSearchItem) editor.getTaskActionPage().getDynamicWidgetLayoutListener()).setIncludeCompletedCancelledCheckbox(selected);
+ if (selected) {
+ // select the group
+ selectedUsers.add(groupArt);
+ ((TaskSearchWorldSearchItem) editor.getTaskActionPage().getDynamicWidgetLayoutListener()).setSelectedGroups(selectedUsers);
+ } else {
+ // clear the group selected
+ ((TaskSearchWorldSearchItem) editor.getTaskActionPage().getDynamicWidgetLayoutListener()).handleSelectedGroupsClear();
+ }
+ runGeneralTaskSearchTest(item, expectedNum);
+ }
+
+ public void handleGeneralDoubleClickAndTestResults(XNavigateItem item, Class<?> clazz, int numOfType, TableLoadOption tableLoadOption) throws OseeCoreException {
+ NavigateView.getNavigateView().handleDoubleClick(item, TableLoadOption.ForcePend, TableLoadOption.NoUI,
+ tableLoadOption);
+ TaskEditor taskEditor = getSingleEditorOrFail();
+ assertTrue(taskEditor != null);
+ Collection<Artifact> arts = taskEditor.getLoadedArtifacts();
+ NavigateTestUtil.testExpectedVersusActual(item.getName(), arts, clazz, numOfType);
+ }
+
+ public TaskEditor getSingleEditorOrFail() throws OseeCoreException {
+ // Retrieve results from opened editor and test
+ Collection<TaskEditor> editors = TaskEditor.getEditors();
+ assertTrue("Expecting 1 editor open, currently " + editors.size(), editors.size() == 1);
+
+ return editors.iterator().next();
+ }
+
+ public TaskXViewer getXViewer() throws OseeCoreException {
+ return getSingleEditorOrFail().getTaskActionPage().getTaskComposite().getTaskXViewer();
+ }
+
+ public void handleTableCustomization() throws OseeCoreException {
+ // add all columns
+ CustomizeDemoTableTestUtil cdialog = new CustomizeDemoTableTestUtil(getXViewer());
+ cdialog.createDialogArea(getSingleEditorOrFail().getTaskActionPage().getTaskComposite());
+ cdialog.handleAddAllItemButtonClick();
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToWorldViewTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToWorldViewTest.java
new file mode 100644
index 00000000000..0e58c2cf85f
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsNavigateItemsToWorldViewTest.java
@@ -0,0 +1,551 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.test.cases;
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.navigate.NavigateView;
+import org.eclipse.osee.ats.navigate.SearchNavigateItem;
+import org.eclipse.osee.ats.navigate.TeamWorkflowSearchWorkflowSearchItem;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.task.TaskEditorSimpleProvider;
+import org.eclipse.osee.ats.test.util.CustomizeDemoTableTestUtil;
+import org.eclipse.osee.ats.test.util.DemoTestUtil;
+import org.eclipse.osee.ats.test.util.NavigateTestUtil;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldXViewer;
+import org.eclipse.osee.ats.world.search.ActionableItemWorldSearchItem;
+import org.eclipse.osee.ats.world.search.GroupWorldSearchItem;
+import org.eclipse.osee.ats.world.search.NextVersionSearchItem;
+import org.eclipse.osee.ats.world.search.ShowOpenWorkflowsByArtifactType;
+import org.eclipse.osee.ats.world.search.StateWorldSearchItem;
+import org.eclipse.osee.ats.world.search.UserCommunitySearchItem;
+import org.eclipse.osee.ats.world.search.UserSearchItem;
+import org.eclipse.osee.ats.world.search.VersionTargetedForTeamSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem.ReleasedOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.support.test.util.DemoUsers;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNavigateItemsToWorldViewTest {
+
+ @org.junit.Test
+public void testDemoDatabase() throws Exception {
+ DemoTestUtil.setUpTest();
+ assertTrue(DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones) != null);
+ }
+
+ @org.junit.Test
+public void testAttributeDeletion() throws Exception {
+ Collection<Artifact> arts = runGeneralLoadingTest("My Favorites", TeamWorkFlowArtifact.class, 3, null);
+ arts.clear();
+ NavigateTestUtil.getAllArtifactChildren(getXViewer().getTree().getItems(), arts);
+ // delete an artifact, look for expected !Errors in the XCol
+ deleteAttributesForXColErrorTest(arts, "ats.Team Definition");
+ deleteAttributesForXColErrorTest(arts, "ats.User Community");
+ deleteAttributesForXColErrorTest(arts, "ats.Actionable Item");
+ deleteAttributesForXColErrorTest(arts, "ats.Change Type");
+ }
+
+ @org.junit.Test
+public void testMyWorld() throws Exception {
+ runGeneralLoadingTest("My World", StateMachineArtifact.class, 11, null);
+ runGeneralXColTest(28, false);
+ }
+
+ @org.junit.Test
+public void testMyFavoritesAndMyRecentlyVisited() throws Exception {
+ // Load My Favorites (test My Favorites and use results to test My Recently Visited
+ Collection<Artifact> arts = runGeneralLoadingTest("My Favorites", TeamWorkFlowArtifact.class, 3, null);
+ assertTrue(arts.size() == 3);
+ runGeneralXColTest(20, false);
+ // test the task tab - this is being done via open ats task editor
+ runGeneralXColTest(20, true);
+ // Open all three favorites
+ for (Artifact artifact : arts)
+ SMAEditor.editArtifact(artifact);
+ // Test that recently visited returns all three
+ runGeneralLoadingTest("My Recently Visited", TeamWorkFlowArtifact.class, 3, null);
+ runGeneralXColTest(20, false);
+ }
+
+ @org.junit.Test
+public void testMyReviews() throws Exception {
+ runGeneralLoadingTest("My Reviews", PeerToPeerReviewArtifact.class, 2, null);
+ runGeneralLoadingTest("My Reviews", DecisionReviewArtifact.class, 2, null);
+ runGeneralXColTest(4, false);
+ runGeneralLoadingTest("My Reviews - All", PeerToPeerReviewArtifact.class, 2, null);
+ runGeneralLoadingTest("My Reviews - All", DecisionReviewArtifact.class, 3, null);
+ runGeneralXColTest(5, false);
+ }
+
+ @org.junit.Test
+public void testMySubscribed() throws Exception {
+ runGeneralLoadingTest("My Subscribed", TeamWorkFlowArtifact.class, 1, null);
+ runGeneralXColTest(1, false);
+ }
+
+ @org.junit.Test
+public void testMyOriginator() throws Exception {
+ runGeneralLoadingTest("My Originator - InWork", TaskArtifact.class, DemoTestUtil.getNumTasks(), null);
+ runGeneralXColTest(68, false);
+ runGeneralLoadingTest("My Originator - InWork", TeamWorkFlowArtifact.class, 18, null);
+ runGeneralLoadingTest("My Originator - InWork", PeerToPeerReviewArtifact.class, 7, null);
+ runGeneralLoadingTest("My Originator - InWork", DecisionReviewArtifact.class, 7, null);
+ runGeneralLoadingTest("My Originator - All", TaskArtifact.class, DemoTestUtil.getNumTasks(), null);
+ runGeneralLoadingTest("My Originator - All", TeamWorkFlowArtifact.class, 25, null);
+ runGeneralLoadingTest("My Originator - All", PeerToPeerReviewArtifact.class, 7, null);
+ runGeneralLoadingTest("My Originator - All", DecisionReviewArtifact.class, 8, null);
+ runGeneralXColTest(84, false);
+ }
+
+ @org.junit.Test
+public void testMyCompleted() throws Exception {
+ runGeneralLoadingTest("My Completed", TeamWorkFlowArtifact.class, 7, null);
+ runGeneralXColTest(17, false);
+ runGeneralLoadingTest("My Completed", PeerToPeerReviewArtifact.class, 1, null);
+ runGeneralLoadingTest("My Completed", DecisionReviewArtifact.class, 1, null);
+
+ }
+
+ @org.junit.Test
+public void testMyRecentlyVisited() throws Exception {
+ // Load Recently Visited
+ runGeneralLoadingTest("My Recently Visited", TeamWorkFlowArtifact.class, 3, null);
+ }
+
+ @org.junit.Test
+public void testOtherUsersWorld() throws Exception {
+ OseeLog.log(AtsPlugin.class, Level.INFO,
+ "Testing User's items relating to " + DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItems("User's World").iterator().next();
+ runGeneralLoadingTest(item, StateMachineArtifact.class, 8, DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ }
+
+ @org.junit.Test
+public void testOtherUsersReviews() throws Exception {
+ runGeneralLoadingTest("User's Reviews - InWork", PeerToPeerReviewArtifact.class, 1,
+ DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ runGeneralLoadingTest("User's Reviews - All", PeerToPeerReviewArtifact.class, 2,
+ DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ }
+
+ @org.junit.Test
+public void testOtherUsersSubscribed() throws Exception {
+ runGeneralLoadingTest("User's Subscribed", TeamWorkFlowArtifact.class, 0,
+ DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ }
+
+ @org.junit.Test
+public void testOtherUsersFavorites() throws Exception {
+ runGeneralLoadingTest("User's Favorites", TeamWorkFlowArtifact.class, 0,
+ DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ }
+
+ @org.junit.Test
+public void testOtherUsersOriginator() throws Exception {
+ runGeneralLoadingTest("User's Originator - InWork", PeerToPeerReviewArtifact.class, 0,
+ DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ runGeneralLoadingTest("User's Originator - All", PeerToPeerReviewArtifact.class, 1,
+ DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ }
+
+ @org.junit.Test
+public void testOtherUsersCompleted() throws Exception {
+ runGeneralLoadingTest("User's Completed", ActionArtifact.class, 0, DemoTestUtil.getDemoUser(DemoUsers.Kay_Jones));
+ }
+
+ @org.junit.Test
+public void testGroupsSearch() throws Exception {
+ WorldEditor.closeAll();
+ Artifact groupArt =
+ ArtifactQuery.getArtifactFromTypeAndName(UniversalGroup.ARTIFACT_TYPE_NAME, "Test Group",
+ AtsPlugin.getAtsBranch());
+ assertTrue(groupArt != null);
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Group Search");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof GroupWorldSearchItem);
+ ((GroupWorldSearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedGroup(groupArt);
+ NavigateView.getNavigateView().handleDoubleClick(item, TableLoadOption.ForcePend, TableLoadOption.NoUI);
+ WorldEditor worldEditor = getSingleEditorOrFail();
+ Collection<Artifact> arts = worldEditor.getLoadedArtifacts();
+
+ NavigateTestUtil.testExpectedVersusActual(item.getName() + " Actions", arts, ActionArtifact.class, 2);
+ NavigateTestUtil.testExpectedVersusActual(item.getName() + " Teams", arts, TeamWorkFlowArtifact.class, 7);
+ NavigateTestUtil.testExpectedVersusActual(item.getName() + " Tasks", arts, TaskArtifact.class,
+ DemoTestUtil.getNumTasks());
+ }
+
+ @org.junit.Test
+public void testTeamWorkflowSearch() throws Exception {
+ Set<TeamDefinitionArtifact> selectedUsers = TeamDefinitionArtifact.getTeamTopLevelDefinitions(Active.Active);
+ WorldEditor.closeAll();
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Team Workflow Search");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof TeamWorkflowSearchWorkflowSearchItem);
+ NavigateView.getNavigateView().handleDoubleClick(item, TableLoadOption.ForcePend, TableLoadOption.NoUI);
+ runGeneralTeamWorkflowSearchOnTeamTest(item, selectedUsers, 1);
+ runGeneralTeamWorkflowSearchOnCompletedCancelledTest(item, true, 2);
+ runGeneralTeamWorkflowSearchOnCompletedCancelledTest(item, false, 1);
+ runGeneralTeamWorkflowSearchOnAssigneeTest(item, "Joe Smith", 0);
+ selectedUsers.clear();
+ runGeneralTeamWorkflowSearchOnTeamTest(item, selectedUsers, 7);
+ runGeneralTeamWorkflowSearchOnReleasedTest(item, ReleasedOption.UnReleased, 7);
+ runGeneralTeamWorkflowSearchOnAssigneeTest(item, "Kay Jones", 6);
+ runGeneralTeamWorkflowSearchOnReleasedTest(item, ReleasedOption.Released, 0);
+ runGeneralTeamWorkflowSearchOnReleasedTest(item, ReleasedOption.Both, 6);
+ List<String> teamDefs = new ArrayList<String>();
+ teamDefs.add("SAW Test");
+ teamDefs.add("SAW Design");
+ Set<TeamDefinitionArtifact> tda = TeamDefinitionArtifact.getTeamDefinitions(teamDefs);
+ runGeneralTeamWorkflowSearchOnTeamTest(item, tda, 3);
+ runGeneralTeamWorkflowSearchOnVersionTest(item, "SAW_Bld_1", 0);
+ runGeneralTeamWorkflowSearchOnVersionTest(item, "SAW_Bld_2", 3);
+ selectedUsers.clear();
+ runGeneralTeamWorkflowSearchOnTeamTest(item, selectedUsers, 6);
+ }
+
+ public void runGeneralTeamWorkflowSearchTest(XNavigateItem item, int expectedNum) throws Exception {
+ WorldEditor editor = getSingleEditorOrFail();
+ editor.getActionPage().reSearch(true);
+ Collection<Artifact> arts = editor.getLoadedArtifacts();
+ // validate
+ NavigateTestUtil.testExpectedVersusActual(item.getName(), expectedNum, arts.size());
+ }
+
+ public void runGeneralTeamWorkflowSearchOnAssigneeTest(XNavigateItem item, String assignee, int expectedNum) throws Exception {
+ WorldEditor editor = getSingleEditorOrFail();
+ ((TeamWorkflowSearchWorkflowSearchItem) editor.getActionPage().getDynamicWidgetLayoutListener()).setSelectedUser(UserManager.getUserByName(assignee));
+ runGeneralTeamWorkflowSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTeamWorkflowSearchOnTeamTest(XNavigateItem item, Set<TeamDefinitionArtifact> selectedUsers, int expectedNum) throws Exception {
+ // need to set team selected users
+ WorldEditor editor = getSingleEditorOrFail();
+ IDynamicWidgetLayoutListener dwl = editor.getActionPage().getDynamicWidgetLayoutListener();
+ ((TeamWorkflowSearchWorkflowSearchItem) dwl).setSelectedTeamDefinitions(selectedUsers);
+ runGeneralTeamWorkflowSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTeamWorkflowSearchOnReleasedTest(XNavigateItem item, ReleasedOption released, int expectedNum) throws Exception {
+ WorldEditor editor = getSingleEditorOrFail();
+ ((TeamWorkflowSearchWorkflowSearchItem) editor.getActionPage().getDynamicWidgetLayoutListener()).setSelectedReleased(released);
+ runGeneralTeamWorkflowSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTeamWorkflowSearchOnVersionTest(XNavigateItem item, String versionString, int expectedNum) throws Exception {
+ WorldEditor editor = getSingleEditorOrFail();
+ ((TeamWorkflowSearchWorkflowSearchItem) editor.getActionPage().getDynamicWidgetLayoutListener()).setVersion(versionString);
+ runGeneralTeamWorkflowSearchTest(item, expectedNum);
+ }
+
+ public void runGeneralTeamWorkflowSearchOnCompletedCancelledTest(XNavigateItem item, boolean selected, int expectedNum) throws Exception {
+ WorldEditor editor = getSingleEditorOrFail();
+ ((TeamWorkflowSearchWorkflowSearchItem) editor.getActionPage().getDynamicWidgetLayoutListener()).includeCompletedCancelledCheckbox(selected);
+ runGeneralTeamWorkflowSearchTest(item, expectedNum);
+ }
+
+ @org.junit.Test
+public void testUserCommunitySearch() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("User Community Search");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof UserCommunitySearchItem);
+ ((UserCommunitySearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedUserComm("Program 2");
+ // normal searches copy search item which would clear out the set value above; for this test, don't copy item
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 4, null, TableLoadOption.DontCopySearchItem);
+ }
+
+ @org.junit.Test
+public void testActionableItemSearch() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Actionable Item Search");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof ActionableItemWorldSearchItem);
+ ((ActionableItemWorldSearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedActionItems(ActionableItemArtifact.getActionableItems(Arrays.asList("SAW Code")));
+ // normal searches copy search item which would clear out the set value above; for this test, don't copy item
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 3, null, TableLoadOption.DontCopySearchItem);
+ }
+
+ @org.junit.Test
+public void testTargetedForVersionTeamSearch() throws Exception {
+ List<XNavigateItem> items = NavigateTestUtil.getAtsNavigateItems("Workflows Targeted-For Version");
+ // First one is the global one
+ XNavigateItem item = items.iterator().next();
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof VersionTargetedForTeamSearchItem);
+ ((VersionTargetedForTeamSearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedVersionArt(VersionArtifact.getVersions(
+ Arrays.asList("SAW_Bld_2")).iterator().next());
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 14, null, TableLoadOption.DontCopySearchItem);
+ }
+
+ @org.junit.Test
+public void testTargetedForTeamSearch() throws Exception {
+ List<XNavigateItem> items = NavigateTestUtil.getAtsNavigateItems("Workflows Targeted-For Next Version");
+ // First one is the global one
+ XNavigateItem item = items.iterator().next();
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof NextVersionSearchItem);
+ ((NextVersionSearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedTeamDef(TeamDefinitionArtifact.getTeamDefinitions(
+ Arrays.asList("SAW SW")).iterator().next());
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 14, null, TableLoadOption.DontCopySearchItem);
+ }
+
+ @org.junit.Test
+public void testShowOpenDecisionReviewsSearch() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Show Open Decision Reviews");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof ShowOpenWorkflowsByArtifactType);
+ runGeneralLoadingTest(item, DecisionReviewArtifact.class, 7);
+ }
+
+ @org.junit.Test
+public void testShowWorkflowsWaitingForDecisionReviewsSearch() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Show Workflows Waiting Decision Reviews");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof ShowOpenWorkflowsByArtifactType);
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 7);
+ }
+
+ @org.junit.Test
+public void testShowOpenPeerToPeerReviewsSearch() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Show Open PeerToPeer Reviews");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof ShowOpenWorkflowsByArtifactType);
+ runGeneralLoadingTest(item, PeerToPeerReviewArtifact.class, 7);
+ }
+
+ @org.junit.Test
+public void testShowWorkflowsWaitingForPeerToPeerReviewsSearch() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Show Workflows Waiting PeerToPeer Reviews");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof ShowOpenWorkflowsByArtifactType);
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 6);
+ }
+
+ @org.junit.Test
+public void testSearchByCurrentState() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Search by Current State");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof StateWorldSearchItem);
+ ((StateWorldSearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedStateClass("Implement");
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 17, null, TableLoadOption.DontCopySearchItem);
+ }
+
+ @org.junit.Test
+public void testSearchForAuthorizeActions() throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem("Search for Authorize Actions");
+ assertTrue(((SearchNavigateItem) item).getWorldSearchItem() instanceof StateWorldSearchItem);
+ runGeneralLoadingTest(item, TeamWorkFlowArtifact.class, 0);
+ }
+
+ public Collection<Artifact> runGeneralLoadingTest(String xNavigateItemName, Class<?> clazz, int numOfType, User user) throws Exception {
+ XNavigateItem item = NavigateTestUtil.getAtsNavigateItem(xNavigateItemName);
+ return runGeneralLoadingTest(item, clazz, numOfType, user);
+ }
+
+ public Collection<Artifact> runGeneralLoadingTest(XNavigateItem item, Class<?> clazz, int numOfType) throws Exception {
+ return runGeneralLoadingTest(item, clazz, numOfType, null);
+ }
+
+ public Collection<Artifact> runGeneralLoadingTest(XNavigateItem item, Class<?> clazz, int numOfType, User user) throws Exception {
+ return runGeneralLoadingTest(item, clazz, numOfType, user, TableLoadOption.None);
+ }
+
+ public Collection<Artifact> runGeneralLoadingTest(XNavigateItem item, Class<?> clazz, int numOfType, User user, TableLoadOption tableLoadOption) throws Exception {
+ // Close all open world editors
+ WorldEditor.closeAll();
+ // Find the correct navigate item
+ if (user != null && (item instanceof SearchNavigateItem)) {
+ if (((SearchNavigateItem) item).getWorldSearchItem() instanceof UserSearchItem) {
+ ((UserSearchItem) (((SearchNavigateItem) item).getWorldSearchItem())).setSelectedUser(user);
+ }
+ }
+ // Simulate double-click of navigate item
+ NavigateView.getNavigateView().handleDoubleClick(item, TableLoadOption.ForcePend, TableLoadOption.NoUI,
+ tableLoadOption);
+ WorldEditor worldEditor = getSingleEditorOrFail();
+ Collection<Artifact> arts = worldEditor.getLoadedArtifacts();
+ NavigateTestUtil.testExpectedVersusActual(item.getName(), arts, clazz, numOfType);
+ return arts;
+ }
+
+ public void runGeneralXColTest(int itemCount, boolean testTaskTab) throws Exception {
+ int itemCnt, beforeSize, afterSize = 0;
+ XViewer xv = getXViewer();
+ xv.expandAll();
+ itemCnt = xv.getVisibleItemCount(xv.getTree().getItems());
+ NavigateTestUtil.testExpectedVersusActual("Item Count - ", itemCount, itemCnt);
+ beforeSize = getXViewer().getCustomizeMgr().getCurrentVisibleTableColumns().size();
+ // show all columns
+ handleTableCustomization();
+ afterSize = getXViewer().getCustomizeMgr().getCurrentVisibleTableColumns().size();
+ NavigateTestUtil.testExpectedVersusActual("Column Count - ", true, (afterSize >= beforeSize));
+ runGeneralXColTest(itemCount, false, "", testTaskTab);
+ }
+
+ public void runGeneralXColTest(int expected, boolean isErrorCheck, String attributeToDelete, boolean testTaskTab) throws OseeCoreException {
+ List<Artifact> arts = new ArrayList<Artifact>();
+ List<Artifact> taskArts = new ArrayList<Artifact>();
+ List<XViewerColumn> columns = getXViewer().getCustomizeMgr().getCurrentTableColumns();
+ ITableLabelProvider labelProv = (ITableLabelProvider) getXViewer().getLabelProvider();
+ // want to check all valid children
+ TreeItem[] treeItem = getXViewer().getTree().getItems();
+ NavigateTestUtil.getAllArtifactChildren(treeItem, arts);
+ NavigateTestUtil.testExpectedVersusActual("Number of Artifacts - ", expected, arts.size());
+ // are we running the fault case?
+ if (testTaskTab) {
+ getXViewer().expandAll();
+ arts.clear();
+ // grab the Task Artifacts and set them as selected
+ this.getAllTreeItems(getXViewer().getTree().getItems(), taskArts);
+ // open the task in the Task Editor
+ TaskEditor.open(new TaskEditorSimpleProvider("ATS Tasks", getXViewer().getSelectedTaskArtifacts()));
+ handleTableCustomization();
+ columns = getXViewer().getCustomizeMgr().getCurrentTableColumns();
+ verifyXColumns(labelProv, arts, columns);
+ } else if (isErrorCheck)
+ verifyXColumnsHasErrors(labelProv, arts, columns, attributeToDelete);
+ else
+ verifyXColumns(labelProv, arts, columns);
+ }
+
+ public void getAllTreeItems(TreeItem[] treeItem, List<Artifact> taskArts) throws OseeCoreException {
+ for (TreeItem item : treeItem) {
+ if (item.getData() instanceof Artifact) {
+ if (((Artifact) item.getData()).getArtifactTypeName().equals("Task")) {
+ getXViewer().getTree().setSelection(item);
+ taskArts.add((Artifact) item.getData());
+ }
+ }
+ if (item.getExpanded()) getAllTreeItems(item.getItems(), taskArts);
+ }
+ }
+
+ public WorldEditor getSingleEditorOrFail() throws OseeCoreException {
+ // Retrieve results from opened editor and test
+ Collection<WorldEditor> editors = WorldEditor.getEditors();
+ assertTrue("Expecting 1 editor open, currently " + editors.size(), editors.size() == 1);
+
+ return editors.iterator().next();
+ }
+
+ public WorldXViewer getXViewer() throws OseeCoreException {
+ return getSingleEditorOrFail().getWorldComposite().getXViewer();
+ }
+
+ public void handleTableCustomization() throws OseeCoreException {
+ // add all columns
+ CustomizeDemoTableTestUtil cdialog = new CustomizeDemoTableTestUtil(getXViewer());
+ cdialog.createDialogArea(getSingleEditorOrFail().getWorldComposite());
+ cdialog.handleAddAllItemButtonClick();
+ }
+
+ public void deleteAttributesForXColErrorTest(Collection<Artifact> arts, String attributeToDelete) throws Exception {
+ Map<Artifact, Object> attributeValues = new HashMap<Artifact, Object>();
+ getXViewer().expandAll();
+ handleTableCustomization();
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // select a workflow artifact; get its attributes; delete an attribute
+ for (Artifact art : arts) {
+ attributeValues.put(art, art.getSoleAttributeValue(attributeToDelete));
+ art.deleteAttribute(attributeToDelete, art.getSoleAttributeValue(attributeToDelete));
+ art.persistAttributes(transaction);
+ }
+ transaction.execute();
+ try {
+ runGeneralXColTest(20, true, attributeToDelete, false);
+ } finally {
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // restore the attribute to leave the demo db back in its original state
+ for (Artifact art : arts) {
+ art.setSoleAttributeValue(attributeToDelete, attributeValues.get(art));
+ art.persistAttributes(transaction);
+ }
+ transaction.execute();
+ }
+ }
+
+ public void verifyXColumnsHasErrors(ITableLabelProvider labelProv, List<Artifact> arts, List<XViewerColumn> columns, String attributeToDelete) throws OseeCoreException {
+ List<String> actualErrorCols = new ArrayList<String>();
+ for (XViewerColumn xCol : columns) {
+ verifyArtifactsHasErrors(labelProv, arts, xCol, getXViewer().getCustomizeMgr().getColumnNumFromXViewerColumn(
+ xCol), attributeToDelete, actualErrorCols);
+ }
+ if (!attributeToDelete.equals("ats.Current State") && !attributeToDelete.equals("ats.Priority"))
+ verifyXCol1HasErrors(actualErrorCols);
+ else
+ verifyXCol2HasErrors(actualErrorCols);
+ }
+
+ public void verifyXCol1HasErrors(List<String> actualErrorCols) {
+ int index = 0;
+ for (String col : actualErrorCols) {
+ NavigateTestUtil.testExpectedVersusActual("Expected xCol errors", true,
+ NavigateTestUtil.expectedErrorCols1[index++].contains(col));
+ }
+ }
+
+ public void verifyXCol2HasErrors(List<String> actualErrorCols) {
+ int index = 0;
+ NavigateTestUtil.testExpectedVersusActual("Expected number of xCol errors",
+ NavigateTestUtil.expectedErrorCols2.length, actualErrorCols.size());
+ for (String col : actualErrorCols) {
+ NavigateTestUtil.testExpectedVersusActual("Expected xCol errors", true,
+ NavigateTestUtil.expectedErrorCols2[index++].equals(col));
+ }
+ }
+
+ public void verifyXColumns(ITableLabelProvider labelProv, Collection<Artifact> arts, List<XViewerColumn> columns) throws OseeCoreException {
+ for (XViewerColumn xCol : columns) {
+ verifyArtifact(labelProv, arts, getXViewer().getCustomizeMgr().getColumnNumFromXViewerColumn(xCol));
+ }
+ }
+
+ public void verifyArtifact(ITableLabelProvider labelProv, Collection<Artifact> arts, int colIndex) {
+ for (Artifact art : arts) {
+ String colText = labelProv.getColumnText(art, colIndex);
+ NavigateTestUtil.testExpectedVersusActual("No Error in XCol expected", true, !colText.contains("!Error"));
+ }
+ }
+
+ public void verifyArtifactsHasErrors(ITableLabelProvider labelProv, Collection<Artifact> arts, XViewerColumn xCol, int colIndex, String attributeToDelete, List<String> actualErrorCols) {
+ for (Artifact art : arts) {
+ String colText = labelProv.getColumnText(art, colIndex);
+ if (art.getArtifactTypeName().equals("Demo Code Team Workflow")) {
+ if (colText.contains("!Error")) if (!actualErrorCols.contains(xCol.getId())) actualErrorCols.add(xCol.getId());
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsPurgeTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsPurgeTest.java
new file mode 100644
index 00000000000..48a1c2626f3
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsPurgeTest.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.ats.test.cases;
+
+import static org.junit.Assert.assertFalse;
+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 org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.DbUtil;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.Before;
+
+/**
+ * This test is intended to be run against a demo database. It tests the purge logic by counting the rows of the version
+ * and txs tables, then adds an Action, Workflow and 30 Tasks, deletes these objects and compares the row count. If
+ * purge works properly, all rows should be equal.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsPurgeTest {
+
+ private final Map<String, Integer> preCreateActionCount = new HashMap<String, Integer>();
+ private final Map<String, Integer> postCreateActionCount = new HashMap<String, Integer>();
+ private final Map<String, Integer> postPurgeCount = new HashMap<String, Integer>();
+ List<String> tables =
+ Arrays.asList("osee_attribute", "osee_artifact", "osee_relation_link", "osee_tx_details", "osee_txs",
+ "osee_artifact_version");
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(AtsPlugin.isProductionDb());
+ }
+
+ @org.junit.Test
+ public void testPurgeArtifacts() throws Exception {
+ // Count rows in tables prior to purge
+ DbUtil.getTableRowCounts(preCreateActionCount, tables);
+
+ Set<Artifact> artsToPurge = new HashSet<Artifact>();
+
+ // Create Action, Workflow and Tasks
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, getClass().getSimpleName(), "description", ChangeType.Improvement,
+ PriorityType.Priority_2, Arrays.asList("Other"), false, null,
+ org.eclipse.osee.framework.jdk.core.util.Collections.castAll(ActionableItemArtifact.class,
+ ArtifactQuery.getArtifactsFromTypeAndName(ActionableItemArtifact.ARTIFACT_NAME, "SAW Test",
+ AtsPlugin.getAtsBranch())), transaction);
+ actionArt.persistAttributesAndRelations(transaction);
+ transaction.execute();
+
+ artsToPurge.add(actionArt);
+ artsToPurge.addAll(actionArt.getTeamWorkFlowArtifacts());
+
+ for (int x = 0; x < 30; x++) {
+ TaskArtifact taskArt =
+ actionArt.getTeamWorkFlowArtifacts().iterator().next().getSmaMgr().getTaskMgr().createNewTask(
+ getClass().getSimpleName() + x);
+ taskArt.persistAttributesAndRelations();
+ artsToPurge.add(taskArt);
+ }
+
+ // Count rows and check that increased
+ DbUtil.getTableRowCounts(postCreateActionCount, tables);
+ TestUtil.checkThatIncreased(preCreateActionCount, postCreateActionCount);
+
+ // Purge Action, Workflow and Tasks
+ ArtifactPersistenceManager.purgeArtifacts(artsToPurge);
+
+ // Count rows and check that same as when began
+ DbUtil.getTableRowCounts(postPurgeCount, tables);
+ TestUtil.checkThatEqual(preCreateActionCount, postPurgeCount);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsQueryPerformanceTests.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsQueryPerformanceTests.java
new file mode 100644
index 00000000000..58cb93a3faa
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsQueryPerformanceTests.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.ats.test.cases;
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.world.search.MyWorldSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class AtsQueryPerformanceTests {
+
+ public AtsQueryPerformanceTests() {
+ AtsBulkLoadCache.run(true);
+ }
+
+ @org.junit.Test
+public void testUserWorldSearch() throws Exception {
+ User usr = getAUser();
+ assertNotNull("User does not exist", usr);
+ MyWorldSearchItem search = new MyWorldSearchItem();
+ long startTime = System.currentTimeMillis();
+ Collection<Artifact> artifacts = search.searchIt(usr);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("testUserWorldSearch took %dms for %d artifacts", elapsedTime, artifacts.size()));
+ assertTrue("No artifacts found", artifacts.size() > 0);
+ assertTrue("testUserWorldSearch should take less than 2500ms", elapsedTime < 2500);
+ }
+
+ @org.junit.Test
+public void testTeamWorldSearchItem() throws Exception {
+ TeamWorldSearchItem searchItem =
+ new TeamWorldSearchItem("Show Open OSEE Actions", new String[] {"ATS", "Define", "OTE"}, false, true,
+ false, null, null, null, null);
+ long startTime = System.currentTimeMillis();
+ Collection<Artifact> artifacts = searchItem.performSearch(SearchType.Search);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("testTeamWorldSearchItem took %dms for %d artifacts", elapsedTime,
+ artifacts.size()));
+ assertTrue("No artifacts found", artifacts.size() > 0);
+ assertTrue("testTeamWorldSearchItem should take less than 9000ms", elapsedTime < 9000);
+ }
+
+ private User getAUser() throws OseeCoreException {
+ ArrayList<User> users = UserManager.getUsers();
+ User andy = null;
+ for (User usr : users) {
+ if (usr.getSoleAttributeValueAsString("Name", "unknown").contains("Finkbeiner")) {
+ andy = usr;
+ break;
+ }
+ }
+ return andy;
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsTeamDefintionToWorkflowTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsTeamDefintionToWorkflowTest.java
new file mode 100644
index 00000000000..e2213ca7b3f
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsTeamDefintionToWorkflowTest.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.ats.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.junit.Before;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsTeamDefintionToWorkflowTest {
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @org.junit.Test
+ public void testTeamDefinitionToWorkflow() throws Exception {
+ boolean error = false;
+ for (Artifact artifact : ArtifactQuery.getArtifactsFromType(TeamDefinitionArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch())) {
+ TeamDefinitionArtifact teamDef = (TeamDefinitionArtifact) artifact;
+ if (teamDef.isActionable() && teamDef.getWorkFlowDefinition() == null) {
+ System.err.println("Team Definition \"" + teamDef + "\" has no Work Flow associated and is Actionable.");
+ error = true;
+ }
+ }
+ assertFalse("See syserr message(s)", error);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsValidateAtsDatabaseTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsValidateAtsDatabaseTest.java
new file mode 100644
index 00000000000..a3681c3f6b7
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsValidateAtsDatabaseTest.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.ats.test.cases;
+import static org.junit.Assert.*;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.health.ValidateAtsDatabase;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * This test runs the validate ats database check against whatever database is run against.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsValidateAtsDatabaseTest {
+
+ public AtsValidateAtsDatabaseTest() {
+ AtsBulkLoadCache.run(true);
+ }
+
+ @org.junit.Test
+public void testValidateAtsDatabase() throws Exception {
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+
+ ValidateAtsDatabase validateAtsDatabase = new ValidateAtsDatabase(null);
+ XResultData rd = new XResultData();
+ validateAtsDatabase.setFixAssignees(false);
+ validateAtsDatabase.setFixAttributeValues(false);
+ validateAtsDatabase.runIt(null, rd);
+ Matcher m = Pattern.compile("Error:.*$").matcher(rd.getReport("").getManipulatedHtml());
+ while (m.find()) {
+ fail(m.group());
+ }
+
+ TestUtil.severeLoggingEnd(monitorLog);
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsWorkItemDefinitionTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsWorkItemDefinitionTest.java
new file mode 100644
index 00000000000..3131301a638
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/AtsWorkItemDefinitionTest.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.ats.test.cases;
+
+import static org.junit.Assert.fail;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+import org.junit.Before;
+
+/**
+ * This test can be run on a test or production Db
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsWorkItemDefinitionTest {
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @org.junit.Test
+ public void testWorkItemDefinitions() throws Exception {
+ for (WorkItemDefinition workItemDefinition : WorkItemDefinitionFactory.getWorkItemDefinitions()) {
+ System.out.println("Testing " + workItemDefinition);
+ // set up dynamic layout for work widget definition
+ if (workItemDefinition instanceof WorkWidgetDefinition) {
+ WorkWidgetDefinition workWidgetDefinition = (WorkWidgetDefinition) workItemDefinition;
+ DynamicXWidgetLayoutData dynamicXWidgetLayoutData = workWidgetDefinition.get();
+ if (dynamicXWidgetLayoutData.getDynamicXWidgetLayout() == null) {
+ dynamicXWidgetLayoutData.setDynamicXWidgetLayout(new DynamicXWidgetLayout());
+ workWidgetDefinition.set(dynamicXWidgetLayoutData);
+ }
+ }
+ Result result = AtsWorkDefinitions.validateWorkItemDefinition(workItemDefinition);
+ if (result.isFalse()) {
+ fail(result.getText());
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/SMAPromptChangeStatusTest.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/SMAPromptChangeStatusTest.java
new file mode 100644
index 00000000000..b05b7f21b74
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/cases/SMAPromptChangeStatusTest.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact.TaskStates;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAPromptChangeStatus;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.test.util.DemoTestUtil;
+import org.eclipse.osee.ats.test.util.SMATestUtil;
+import org.eclipse.osee.ats.util.widgets.dialog.SimpleTaskResolutionOptionsRule;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAPromptChangeStatusTest {
+
+ public static TeamWorkFlowArtifact teamArt;
+
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse("Test should not be run in production db", AtsPlugin.isProductionDb());
+ }
+
+ @BeforeClass
+ public static void testCleanupPre() throws Exception {
+ DemoTestUtil.cleanupSimpleTest(SMAPromptChangeStatusTest.class.getSimpleName());
+ }
+
+ @org.junit.Test
+ public void testInitialize() throws Exception {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ teamArt = DemoTestUtil.createSimpleAction(getClass().getSimpleName(), transaction);
+ transaction.execute();
+ assertNotNull(teamArt);
+ }
+
+ @org.junit.Test
+ public void testChangeTaskStatusNoResolution() throws Exception {
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Collection<TaskArtifact> tasks =
+ DemoTestUtil.createSimpleTasks(teamArt, getClass().getSimpleName() + "_NoRes", 4, transaction);
+ transaction.execute();
+
+ assertTrue(tasks.size() == 4);
+
+ SMAPromptChangeStatus promptChangeStatus = new SMAPromptChangeStatus(tasks);
+ assertTrue(promptChangeStatus.isValidToChangeStatus().isTrue());
+
+ // Change two to 100, 1 hr split
+ promptChangeStatus.performChangeStatus(null, null, 1, 100, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.Completed.name(), 100, 0.25);
+
+ // Change two to 100, 1 hr split
+ // hours should be added to inwork state; make sure completed state isn't statused
+ promptChangeStatus.performChangeStatus(null, null, 1, 100, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.Completed.name(), 100, 0.50);
+
+ // Change two to 99, 1 hr split
+ // transitions to InWork and adds hours
+ // make sure hours not added to completed state
+ promptChangeStatus.performChangeStatus(null, null, 1, 99, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.InWork.name(), 99, 0.75);
+
+ // Change two to 55, 0
+ // no transition, no hours spent
+ promptChangeStatus.performChangeStatus(null, null, 0, 55, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.InWork.name(), 55, 0.75);
+
+ }
+
+ @org.junit.Test
+ public void testChangeTaskStatusWithResolutionOptions() throws Exception {
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Collection<TaskArtifact> tasks =
+ DemoTestUtil.createSimpleTasks(teamArt, getClass().getSimpleName() + "_Res", 4, transaction);
+ transaction.execute();
+
+ assertTrue(tasks.size() == 4);
+
+ SMAPromptChangeStatus promptChangeStatus = new SMAPromptChangeStatus(tasks);
+ assertTrue(promptChangeStatus.isValidToChangeStatus().isTrue());
+ SimpleTaskResolutionOptionsRule optionsRule = new SimpleTaskResolutionOptionsRule();
+
+ // Change two to 100, 1 hr split
+ promptChangeStatus.performChangeStatus(optionsRule.getOptions(),
+ SimpleTaskResolutionOptionsRule.States.Complete.name(), 1, 100, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.Completed.name(), 100, 0.25);
+
+ // Change two to 100, 1 hr split
+ // hours should be added to inwork state; make sure completed state isn't statused
+ promptChangeStatus.performChangeStatus(optionsRule.getOptions(),
+ SimpleTaskResolutionOptionsRule.States.Complete.name(), 1, 100, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.Completed.name(), 100, 0.50);
+
+ // Change two to 99, 1 hr split
+ // transitions to InWork and adds hours
+ // make sure hours not added to completed state
+ promptChangeStatus.performChangeStatus(optionsRule.getOptions(),
+ SimpleTaskResolutionOptionsRule.States.In_Work.name(), 1, 99, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.InWork.name(), 99, 0.75);
+
+ // Change two to 55, 0
+ // no transition, no hours spent
+ promptChangeStatus.performChangeStatus(optionsRule.getOptions(),
+ SimpleTaskResolutionOptionsRule.States.In_Work.name(), 0, 55, true, true);
+ SMATestUtil.validateSMAs(tasks, TaskStates.InWork.name(), 55, 0.75);
+ }
+
+ @org.junit.Test
+ public void testChangeStatusFailsIfTaskCancelled() throws Exception {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Collection<TaskArtifact> tasks =
+ DemoTestUtil.createSimpleTasks(teamArt, getClass().getSimpleName() + "_Cancel", 2, transaction);
+ transaction.execute();
+
+ assertTrue(tasks.size() == 2);
+ TaskArtifact cancelTask = tasks.iterator().next();
+
+ // test that if one task is cancelled, can't change status
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ cancelTask.getSmaMgr().transition(TaskStates.Cancelled.name(), (User) null, transaction, TransitionOption.Persist);
+ transaction.execute();
+ SMAPromptChangeStatus promptChangeStatus = new SMAPromptChangeStatus(tasks);
+ Result result = promptChangeStatus.isValidToChangeStatus();
+ assertTrue(result.isFalse());
+ assertTrue(result.getText().contains("Can not status a cancelled"));
+
+ }
+
+ @org.junit.Test
+ public void testChangeStatusFailsIfTaskWrongRelatedToState() throws Exception {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Collection<TaskArtifact> tasks =
+ DemoTestUtil.createSimpleTasks(teamArt, getClass().getSimpleName() + "_RelState", 2, transaction);
+ transaction.execute();
+
+ assertTrue(tasks.size() == 2);
+ TaskArtifact taskArt = tasks.iterator().next();
+
+ // test that if task not in related-to state of workflows's current status, can't change status
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ taskArt.setSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(),
+ DefaultTeamState.Analyze.name());
+ transaction.execute();
+ SMAPromptChangeStatus promptChangeStatus = new SMAPromptChangeStatus(tasks);
+ Result result = promptChangeStatus.isValidToChangeStatus();
+ assertTrue(result.isFalse());
+ assertTrue(result.getText().contains("Task work must be done in"));
+ }
+
+ @AfterClass
+ public static void testCleanupPost() throws Exception {
+ DemoTestUtil.cleanupSimpleTest(SMAPromptChangeStatusTest.class.getSimpleName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/CustomizeDemoTableTestUtil.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/CustomizeDemoTableTestUtil.java
new file mode 100644
index 00000000000..0649f86ac0e
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/CustomizeDemoTableTestUtil.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.ats.test.util;
+
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.customize.dialog.XViewerCustomizeDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Megumi Telles
+ */
+public class CustomizeDemoTableTestUtil extends XViewerCustomizeDialog {
+
+ /**
+ * @param viewer
+ */
+ public CustomizeDemoTableTestUtil(XViewer viewer) {
+ super(viewer);
+ }
+
+ /**
+ * for testing purposes - simulate customization view
+ */
+ public Control createDialogArea(Composite parent) {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "===> Simulating CustomizationView " + "\"...");
+ return super.createDialogArea(parent);
+ }
+
+ /**
+ * for testing purposes - simulate the add all button click
+ */
+ public void handleAddAllItemButtonClick() {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "===> Simulating CustomizationView Add All Columns" + "\"...");
+ super.handleAddAllItem();
+ super.handleLoadConfigCust();
+ }
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/DemoTestUtil.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/DemoTestUtil.java
new file mode 100644
index 00000000000..d2beed8a0d6
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/DemoTestUtil.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.test.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import junit.framework.TestCase;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.ats.util.widgets.TaskManager;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.support.test.util.AtsUserCommunity;
+import org.eclipse.osee.support.test.util.DemoActionableItems;
+import org.eclipse.osee.support.test.util.DemoUsers;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DemoTestUtil {
+
+ public static Result isDbPopulatedWithDemoData() throws Exception {
+ Branch branch = BranchManager.getKeyedBranch("SAW_Bld_1");
+
+ if (ArtifactQuery.getArtifactsFromTypeAndName(Requirements.SOFTWARE_REQUIREMENT, "%Robot%", branch).size() != 6) return new Result(
+ "Expected at least 6 Software Requirements with word \"Robot\". Database is not be populated with demo data.");
+ return Result.TrueResult;
+ }
+
+ public static Collection<String> getTaskTitles(boolean firstTaskWorkflow) {
+ if (firstTaskWorkflow) {
+ firstTaskWorkflow = false;
+ return Arrays.asList("Look into Graph View.", "Redesign how view shows values.",
+ "Discuss new design with Senior Engineer", "Develop prototype", "Show prototype to management",
+ "Create development plan", "Create test plan", "Make changes");
+ } else
+ return Arrays.asList("Document how Graph View works", "Update help contents", "Review new documentation",
+ "Publish documentation to website", "Remove old viewer", "Deploy release");
+ }
+
+ public static int getNumTasks() {
+ return getTaskTitles(false).size() + getTaskTitles(true).size();
+ }
+
+ public static User getDemoUser(DemoUsers demoUser) throws OseeCoreException {
+ return UserManager.getUserByName(demoUser.getName());
+ }
+
+ /**
+ * Creates an action with the name title and demo code workflow
+ *
+ * @param title
+ * @param transaction
+ * @return
+ * @throws OseeCoreException
+ */
+ public static TeamWorkFlowArtifact createSimpleAction(String title, SkynetTransaction transaction) throws OseeCoreException {
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, title, "Description", ChangeType.Improvement, PriorityType.Priority_2,
+ Arrays.asList(AtsUserCommunity.Other.name()), false, null,
+ ActionableItemArtifact.getActionableItems(Arrays.asList(DemoActionableItems.SAW_Code.getName())),
+ transaction);
+
+ TeamWorkFlowArtifact teamArt = null;
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ if (team.getTeamDefinition().getDescriptiveName().contains("Code")) {
+ teamArt = team;
+ }
+ }
+ return teamArt;
+ }
+
+ /**
+ * Create tasks named title + <num>
+ *
+ * @param teamArt
+ * @param title
+ * @param numTasks number to create
+ * @param transaction
+ * @throws Exception
+ */
+ public static Collection<TaskArtifact> createSimpleTasks(TeamWorkFlowArtifact teamArt, String title, int numTasks, SkynetTransaction transaction) throws Exception {
+ List<String> names = new ArrayList<String>();
+ for (int x = 1; x < numTasks + 1; x++) {
+ names.add(title + " " + x);
+ }
+ return TaskManager.createTasks(teamArt, names, Arrays.asList(UserManager.getUser()), transaction);
+ }
+
+ /**
+ * Deletes all artifacts with names that start with any title given
+ *
+ * @param titles
+ * @throws Exception
+ */
+ public static void cleanupSimpleTest(Collection<String> titles) throws Exception {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ for (String title : titles) {
+ artifacts.addAll(ArtifactQuery.getArtifactsFromName(title + "%", AtsPlugin.getAtsBranch(), false));
+ }
+ ArtifactPersistenceManager.purgeArtifacts(artifacts);
+ TestUtil.sleep(4000);
+ }
+
+ /**
+ * Deletes any artifact with name that starts with title
+ *
+ * @param title
+ * @throws Exception
+ */
+ public static void cleanupSimpleTest(String title) throws Exception {
+ cleanupSimpleTest(Arrays.asList(title));
+ }
+
+ public static void setUpTest() throws Exception {
+ try {
+ // This test should only be run on test db
+ TestCase.assertFalse(AtsPlugin.isProductionDb());
+ // Confirm test setup with demo data
+ TestCase.assertTrue(isDbPopulatedWithDemoData().isTrue());
+ // Confirm user is Joe Smith
+ TestCase.assertTrue("User \"Joe Smith\" does not exist in DB. Run Demo DBInit prior to this test.",
+ UserManager.getUserByUserId("Joe Smith") != null);
+ // Confirm user is Joe Smith
+ TestCase.assertTrue(
+ "Authenticated user should be \"Joe Smith\" and is not. Check that Demo Application Server is being run.",
+ UserManager.getUser().getUserId().equals("Joe Smith"));
+ } catch (OseeAuthenticationException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ TestCase.fail("Can't authenticate, either Demo Application Server is not running or Demo DbInit has not been performed");
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/NavigateTestUtil.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/NavigateTestUtil.java
new file mode 100644
index 00000000000..43512f58843
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/NavigateTestUtil.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.ats.test.util;
+
+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 junit.framework.TestCase;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.navigate.AtsNavigateViewItems;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NavigateTestUtil {
+ private static Map<String, List<XNavigateItem>> nameToNavItem;
+ public static String[] expectedErrorCols1 = {"ats.column.type", "ats.column.team", "ats.column.initWf"};
+ public static String[] expectedErrorCols2 =
+ {"ats.column.state", "ats.column.assignees", "ats.column.versionTarget", "ats.column.annualCostAvoidance",
+ "ats.column.remainingHours", "ats.column.statePercentComplete", "ats.column.stateTaskPercentComplete",
+ "ats.column.stateReviewPercentComplete", "ats.column.totalPercentComplete",
+ "ats.column.stateHoursSpent", "ats.column.stateTaskHoursSpent", "ats.column.stateReviewHoursSpent",
+ "ats.column.stateTotalHoursSpent", "ats.column.totalHoursSpent", "ats.column.implementer",
+ "ats.column.completedDate", "ats.column.cancelledDate", "ats.column.manDaysNeeded"};
+
+ public static XNavigateItem getAtsNavigateItem(String itemName) {
+ if (nameToNavItem == null) {
+ nameToNavItem = new HashMap<String, List<XNavigateItem>>(100);
+ // Setup hash if navigate items to names
+ for (XNavigateItem item : AtsNavigateViewItems.getInstance().getSearchNavigateItems())
+ NavigateTestUtil.createNameToNavItemMap(item, nameToNavItem);
+ }
+ if (nameToNavItem.get(itemName) == null) throw new IllegalStateException(
+ "No items of name \"" + itemName + "\" found");
+ if (nameToNavItem.get(itemName).size() > 1) throw new IllegalStateException(
+ "Multiple items of name \"" + itemName + "\" found; use getAtsNavigateItems");
+ return nameToNavItem.get(itemName).iterator().next();
+ }
+
+ public static List<XNavigateItem> getAtsNavigateItems(String itemName) {
+ if (nameToNavItem == null) {
+ nameToNavItem = new HashMap<String, List<XNavigateItem>>(100);
+ // Setup hash if navigate items to names
+ for (XNavigateItem item : AtsNavigateViewItems.getInstance().getSearchNavigateItems())
+ NavigateTestUtil.createNameToNavItemMap(item, nameToNavItem);
+ }
+ return nameToNavItem.get(itemName);
+ }
+
+ public static void testExpectedVersusActual(String name, Collection<? extends Artifact> arts, Class<?> clazz, int expectedNumOfType) {
+ int actualNumOfType = numOfType(arts, clazz);
+ String expectedStr =
+ "\"" + name + "\" Expected: " + expectedNumOfType + " Found: " + actualNumOfType + " Of Type: " + clazz;
+ compare(expectedNumOfType, actualNumOfType, expectedStr);
+ }
+
+ public static void testExpectedVersusActual(String testStr, int expected, int actual) {
+ String expectedStr = testStr + "Expected: " + expected + " Found: " + actual;
+ compare(expected, actual, expectedStr);
+ }
+
+ public static void testExpectedVersusActual(String testStr, boolean expectedCond, boolean actualCond) {
+ String expectedStr = testStr + "Expected: " + expectedCond + " Found: " + actualCond;
+ compare(expectedCond, actualCond, expectedStr);
+ }
+
+ public static void compare(int expectedNumOfType, int actualNumOfType, String expectedStr) {
+ if (expectedNumOfType != actualNumOfType)
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, expectedStr, null);
+ else
+ OseeLog.log(AtsPlugin.class, Level.INFO, expectedStr);
+ TestCase.assertTrue(expectedStr, actualNumOfType == expectedNumOfType);
+ }
+
+ public static void compare(boolean expectedCond, boolean actualCond, String expectedStr) {
+ if (expectedCond != actualCond)
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, expectedStr, null);
+ else
+ OseeLog.log(AtsPlugin.class, Level.INFO, expectedStr);
+ TestCase.assertTrue(expectedStr, expectedCond == actualCond);
+ }
+
+ public static int numOfType(Collection<? extends Artifact> arts, Class<?> clazz) {
+ int num = 0;
+ for (Artifact art : arts)
+ if (clazz.isAssignableFrom(art.getClass())) num++;
+ return num;
+ }
+
+ public static void createNameToNavItemMap(XNavigateItem item, Map<String, List<XNavigateItem>> nameToItemMap) {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+ if (nameToItemMap.containsKey(item.getName())) {
+ items.addAll(nameToItemMap.get(item.getName()));
+ }
+ items.add(item);
+ nameToItemMap.put(item.getName(), items);
+ for (XNavigateItem child : item.getChildren()) {
+ createNameToNavItemMap(child, nameToItemMap);
+ }
+ }
+
+ public static void getAllArtifactChildren(TreeItem items[], Collection<Artifact> children) {
+ for (TreeItem item : items) {
+ if (item.getData() instanceof Artifact) {
+ //if (!children.contains(item.getData())) children.add((Artifact) item.getData());
+ children.add((Artifact) item.getData());
+ if (item.getExpanded()) getAllArtifactChildren(item.getItems(), children);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/SMATestUtil.java b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/SMATestUtil.java
new file mode 100644
index 00000000000..cfbfc6b4276
--- /dev/null
+++ b/org.eclipse.osee.ats.test/src/org/eclipse/osee/ats/test/util/SMATestUtil.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.ats.test.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import junit.framework.TestCase;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMATestUtil {
+
+ public static void validateSMA(StateMachineArtifact sma, String stateName, int totalPercent, double hoursSpent) throws Exception {
+ validateSMAs(Arrays.asList(sma), stateName, totalPercent, hoursSpent);
+
+ }
+
+ public static void validateSMAs(Collection<? extends StateMachineArtifact> smas, String stateName, int totalPercent, double hoursSpent) throws Exception {
+ for (StateMachineArtifact sma : smas) {
+ TestCase.assertEquals("Current State wronf for " + sma.getHumanReadableId(),
+ sma.getSmaMgr().getStateMgr().getCurrentStateName(), stateName);
+ if (sma.getSmaMgr().isCancelledOrCompleted()) {
+ TestCase.assertEquals("ats.CurrentState wrong " + sma.getHumanReadableId(),
+ sma.getSmaMgr().getStateMgr().getCurrentStateName() + ";;;",
+ sma.getSoleAttributeValue(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName()));
+ }
+ TestCase.assertEquals("Percent wrong for " + sma.getHumanReadableId(), sma.getWorldViewPercentCompleteTotal(),
+ totalPercent);
+ TestCase.assertEquals("Hours Spent wrong for " + sma.getHumanReadableId(), sma.getWorldViewHoursSpentTotal(),
+ hoursSpent);
+ for (String stateValue : sma.getAttributesToStringList(ATSAttributes.STATE_ATTRIBUTE.getStoreName())) {
+ if (stateValue.startsWith(DefaultTeamState.Completed.name())) {
+ TestCase.assertEquals("ats.State wrong " + sma.getHumanReadableId(), stateValue, "Completed;;;");
+ } else if (stateValue.startsWith(DefaultTeamState.Cancelled.name())) {
+ TestCase.assertEquals("ats.State wrong " + sma.getHumanReadableId(), stateValue, "Cancelled;;;");
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/.classpath b/org.eclipse.osee.ats/.classpath
new file mode 100644
index 00000000000..64ed6b3795d
--- /dev/null
+++ b/org.eclipse.osee.ats/.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.ats/.project b/org.eclipse.osee.ats/.project
new file mode 100644
index 00000000000..abda3a60482
--- /dev/null
+++ b/org.eclipse.osee.ats/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ats</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.ats/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ats/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.ats/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.ats/META-INF/MANIFEST.MF b/org.eclipse.osee.ats/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c4b9db8924d
--- /dev/null
+++ b/org.eclipse.osee.ats/META-INF/MANIFEST.MF
@@ -0,0 +1,83 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Ats Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ats;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Eclipse-ExtensibleAPI: true
+Bundle-Activator: org.eclipse.osee.ats.AtsPlugin
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.gef,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.ui.forms,
+ org.eclipse.osee.framework.database,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.core.resources,
+ org.eclipse.ui.ide,
+ org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.help,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.ui.editors,
+ org.eclipse.zest.layouts,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.ui.views,
+ org.eclipse.nebula.widgets.xviewer,
+ org.eclipse.birt.chart.engine,
+ org.eclipse.search
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ats,
+ org.eclipse.osee.ats.actions,
+ org.eclipse.osee.ats.actions.wizard,
+ org.eclipse.osee.ats.artifact,
+ org.eclipse.osee.ats.config,
+ org.eclipse.osee.ats.config.wizard,
+ org.eclipse.osee.ats.editor,
+ org.eclipse.osee.ats.editor.help,
+ org.eclipse.osee.ats.editor.service,
+ org.eclipse.osee.ats.editor.service.branch,
+ org.eclipse.osee.ats.editor.stateItem,
+ org.eclipse.osee.ats.export,
+ org.eclipse.osee.ats.handlers,
+ org.eclipse.osee.ats.health,
+ org.eclipse.osee.ats.hyper,
+ org.eclipse.osee.ats.navigate,
+ org.eclipse.osee.ats.notify,
+ org.eclipse.osee.ats.operation,
+ org.eclipse.osee.ats.report,
+ org.eclipse.osee.ats.task,
+ org.eclipse.osee.ats.util,
+ org.eclipse.osee.ats.util.Import,
+ org.eclipse.osee.ats.util.widgets,
+ org.eclipse.osee.ats.util.widgets.commit,
+ org.eclipse.osee.ats.util.widgets.defect,
+ org.eclipse.osee.ats.util.widgets.dialog,
+ org.eclipse.osee.ats.util.widgets.role,
+ org.eclipse.osee.ats.util.xviewer.column,
+ org.eclipse.osee.ats.workflow,
+ org.eclipse.osee.ats.workflow.editor,
+ org.eclipse.osee.ats.workflow.editor.actions,
+ org.eclipse.osee.ats.workflow.editor.model,
+ org.eclipse.osee.ats.workflow.editor.model.commands,
+ org.eclipse.osee.ats.workflow.editor.parts,
+ org.eclipse.osee.ats.workflow.editor.wizard,
+ org.eclipse.osee.ats.workflow.flow,
+ org.eclipse.osee.ats.workflow.item,
+ org.eclipse.osee.ats.workflow.page,
+ org.eclipse.osee.ats.workflow.vue,
+ org.eclipse.osee.ats.world,
+ org.eclipse.osee.ats.world.search
+Import-Package: javax.mail,
+ javax.mail.internet,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.client.server,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.enums,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.ats/build.properties b/org.eclipse.osee.ats/build.properties
new file mode 100644
index 00000000000..c121788a44c
--- /dev/null
+++ b/org.eclipse.osee.ats/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/,\
+ support/,\
+ reference/
diff --git a/org.eclipse.osee.ats/images/AI.gif b/org.eclipse.osee.ats/images/AI.gif
new file mode 100644
index 00000000000..5ef59b47402
--- /dev/null
+++ b/org.eclipse.osee.ats/images/AI.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/D.gif b/org.eclipse.osee.ats/images/D.gif
new file mode 100644
index 00000000000..dbc0f800a1d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/D.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/MyWorld.gif b/org.eclipse.osee.ats/images/MyWorld.gif
new file mode 100644
index 00000000000..96fea67137f
--- /dev/null
+++ b/org.eclipse.osee.ats/images/MyWorld.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/P.gif b/org.eclipse.osee.ats/images/P.gif
new file mode 100644
index 00000000000..b99507ab205
--- /dev/null
+++ b/org.eclipse.osee.ats/images/P.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/R.gif b/org.eclipse.osee.ats/images/R.gif
new file mode 100644
index 00000000000..0780916eae2
--- /dev/null
+++ b/org.eclipse.osee.ats/images/R.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/T.gif b/org.eclipse.osee.ats/images/T.gif
new file mode 100644
index 00000000000..2693eb5baff
--- /dev/null
+++ b/org.eclipse.osee.ats/images/T.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/X.gif b/org.eclipse.osee.ats/images/X.gif
new file mode 100644
index 00000000000..2b93b3cdc92
--- /dev/null
+++ b/org.eclipse.osee.ats/images/X.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/action.gif b/org.eclipse.osee.ats/images/action.gif
new file mode 100644
index 00000000000..6a18beda16c
--- /dev/null
+++ b/org.eclipse.osee.ats/images/action.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/artView.gif b/org.eclipse.osee.ats/images/artView.gif
new file mode 100644
index 00000000000..9b42afcac6d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/artView.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/atsNavigate.gif b/org.eclipse.osee.ats/images/atsNavigate.gif
new file mode 100644
index 00000000000..8f529d2e366
--- /dev/null
+++ b/org.eclipse.osee.ats/images/atsNavigate.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/atsPerspective.gif b/org.eclipse.osee.ats/images/atsPerspective.gif
new file mode 100644
index 00000000000..37e66066aad
--- /dev/null
+++ b/org.eclipse.osee.ats/images/atsPerspective.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/center.gif b/org.eclipse.osee.ats/images/center.gif
new file mode 100644
index 00000000000..6daf9d594b2
--- /dev/null
+++ b/org.eclipse.osee.ats/images/center.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/check.gif b/org.eclipse.osee.ats/images/check.gif
new file mode 100644
index 00000000000..6b3078b35cf
--- /dev/null
+++ b/org.eclipse.osee.ats/images/check.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/community.gif b/org.eclipse.osee.ats/images/community.gif
new file mode 100644
index 00000000000..d75b50967f0
--- /dev/null
+++ b/org.eclipse.osee.ats/images/community.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/configDef.gif b/org.eclipse.osee.ats/images/configDef.gif
new file mode 100644
index 00000000000..d5bde8dca99
--- /dev/null
+++ b/org.eclipse.osee.ats/images/configDef.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/connection_d16.gif b/org.eclipse.osee.ats/images/connection_d16.gif
new file mode 100644
index 00000000000..44a7e413a2e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/connection_d16.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/connection_d24.gif b/org.eclipse.osee.ats/images/connection_d24.gif
new file mode 100644
index 00000000000..628db5ce805
--- /dev/null
+++ b/org.eclipse.osee.ats/images/connection_d24.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/connection_s16.gif b/org.eclipse.osee.ats/images/connection_s16.gif
new file mode 100644
index 00000000000..de4a2d0f101
--- /dev/null
+++ b/org.eclipse.osee.ats/images/connection_s16.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/connection_s24.gif b/org.eclipse.osee.ats/images/connection_s24.gif
new file mode 100644
index 00000000000..66a5fe72bef
--- /dev/null
+++ b/org.eclipse.osee.ats/images/connection_s24.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/copyToClipboard.gif b/org.eclipse.osee.ats/images/copyToClipboard.gif
new file mode 100644
index 00000000000..540860fb103
--- /dev/null
+++ b/org.eclipse.osee.ats/images/copyToClipboard.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/cots.gif b/org.eclipse.osee.ats/images/cots.gif
new file mode 100644
index 00000000000..01bbf4c913b
--- /dev/null
+++ b/org.eclipse.osee.ats/images/cots.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/currentState.gif b/org.eclipse.osee.ats/images/currentState.gif
new file mode 100644
index 00000000000..eb91ded1880
--- /dev/null
+++ b/org.eclipse.osee.ats/images/currentState.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/customize.gif b/org.eclipse.osee.ats/images/customize.gif
new file mode 100644
index 00000000000..e9540ff77dd
--- /dev/null
+++ b/org.eclipse.osee.ats/images/customize.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/down.gif b/org.eclipse.osee.ats/images/down.gif
new file mode 100644
index 00000000000..072b1844572
--- /dev/null
+++ b/org.eclipse.osee.ats/images/down.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/downTriangle.gif b/org.eclipse.osee.ats/images/downTriangle.gif
new file mode 100644
index 00000000000..7ff756c38f4
--- /dev/null
+++ b/org.eclipse.osee.ats/images/downTriangle.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/editAction.gif b/org.eclipse.osee.ats/images/editAction.gif
new file mode 100644
index 00000000000..a5ac28d4c56
--- /dev/null
+++ b/org.eclipse.osee.ats/images/editAction.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/editPencil.gif b/org.eclipse.osee.ats/images/editPencil.gif
new file mode 100644
index 00000000000..feb8e94a74f
--- /dev/null
+++ b/org.eclipse.osee.ats/images/editPencil.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/ellipse16.gif b/org.eclipse.osee.ats/images/ellipse16.gif
new file mode 100644
index 00000000000..03f9cdc690a
--- /dev/null
+++ b/org.eclipse.osee.ats/images/ellipse16.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/ellipse24.gif b/org.eclipse.osee.ats/images/ellipse24.gif
new file mode 100644
index 00000000000..2d60c0ca876
--- /dev/null
+++ b/org.eclipse.osee.ats/images/ellipse24.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/email.gif b/org.eclipse.osee.ats/images/email.gif
new file mode 100644
index 00000000000..2cb69621de8
--- /dev/null
+++ b/org.eclipse.osee.ats/images/email.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/error.gif b/org.eclipse.osee.ats/images/error.gif
new file mode 100644
index 00000000000..c112416d5ac
--- /dev/null
+++ b/org.eclipse.osee.ats/images/error.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/favorite.gif b/org.eclipse.osee.ats/images/favorite.gif
new file mode 100644
index 00000000000..e96e43ea722
--- /dev/null
+++ b/org.eclipse.osee.ats/images/favorite.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/filter.gif b/org.eclipse.osee.ats/images/filter.gif
new file mode 100644
index 00000000000..3d061d77cbe
--- /dev/null
+++ b/org.eclipse.osee.ats/images/filter.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/flashlight.gif b/org.eclipse.osee.ats/images/flashlight.gif
new file mode 100644
index 00000000000..d540a01f4d9
--- /dev/null
+++ b/org.eclipse.osee.ats/images/flashlight.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/folder.gif b/org.eclipse.osee.ats/images/folder.gif
new file mode 100644
index 00000000000..b6858690c89
--- /dev/null
+++ b/org.eclipse.osee.ats/images/folder.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/globe.gif b/org.eclipse.osee.ats/images/globe.gif
new file mode 100644
index 00000000000..212a2e8ac37
--- /dev/null
+++ b/org.eclipse.osee.ats/images/globe.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/globe.jpg b/org.eclipse.osee.ats/images/globe.jpg
new file mode 100644
index 00000000000..8c094ef5f7d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/globe.jpg
Binary files differ
diff --git a/org.eclipse.osee.ats/images/globePlus.gif b/org.eclipse.osee.ats/images/globePlus.gif
new file mode 100644
index 00000000000..88b8d1c7411
--- /dev/null
+++ b/org.eclipse.osee.ats/images/globePlus.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/globePlusSelect.gif b/org.eclipse.osee.ats/images/globePlusSelect.gif
new file mode 100644
index 00000000000..e2aba082d16
--- /dev/null
+++ b/org.eclipse.osee.ats/images/globePlusSelect.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/globeSelect.gif b/org.eclipse.osee.ats/images/globeSelect.gif
new file mode 100644
index 00000000000..04c16b7ee6d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/globeSelect.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/greenBall.gif b/org.eclipse.osee.ats/images/greenBall.gif
new file mode 100644
index 00000000000..805446ee46e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/greenBall.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/greenBug.gif b/org.eclipse.osee.ats/images/greenBug.gif
new file mode 100644
index 00000000000..b0dfd3ba982
--- /dev/null
+++ b/org.eclipse.osee.ats/images/greenBug.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/greenPlus.gif b/org.eclipse.osee.ats/images/greenPlus.gif
new file mode 100644
index 00000000000..252d7ebcb8c
--- /dev/null
+++ b/org.eclipse.osee.ats/images/greenPlus.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/group.gif b/org.eclipse.osee.ats/images/group.gif
new file mode 100644
index 00000000000..5ba5b91c5bb
--- /dev/null
+++ b/org.eclipse.osee.ats/images/group.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/home.gif b/org.eclipse.osee.ats/images/home.gif
new file mode 100644
index 00000000000..b288f5e78e5
--- /dev/null
+++ b/org.eclipse.osee.ats/images/home.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/hyper.gif b/org.eclipse.osee.ats/images/hyper.gif
new file mode 100644
index 00000000000..04d053e5248
--- /dev/null
+++ b/org.eclipse.osee.ats/images/hyper.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/inHouse.gif b/org.eclipse.osee.ats/images/inHouse.gif
new file mode 100644
index 00000000000..f4eed5b5f2c
--- /dev/null
+++ b/org.eclipse.osee.ats/images/inHouse.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/info.gif b/org.eclipse.osee.ats/images/info.gif
new file mode 100644
index 00000000000..33cc76e9dc5
--- /dev/null
+++ b/org.eclipse.osee.ats/images/info.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/info2.gif b/org.eclipse.osee.ats/images/info2.gif
new file mode 100644
index 00000000000..2da001e3e98
--- /dev/null
+++ b/org.eclipse.osee.ats/images/info2.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/metric.gif b/org.eclipse.osee.ats/images/metric.gif
new file mode 100644
index 00000000000..3601dd80841
--- /dev/null
+++ b/org.eclipse.osee.ats/images/metric.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/myTasks.gif b/org.eclipse.osee.ats/images/myTasks.gif
new file mode 100644
index 00000000000..6d74e802b54
--- /dev/null
+++ b/org.eclipse.osee.ats/images/myTasks.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/newAction.gif b/org.eclipse.osee.ats/images/newAction.gif
new file mode 100644
index 00000000000..9fdd250e994
--- /dev/null
+++ b/org.eclipse.osee.ats/images/newAction.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/newCategory.gif b/org.eclipse.osee.ats/images/newCategory.gif
new file mode 100644
index 00000000000..2c59ccbad2b
--- /dev/null
+++ b/org.eclipse.osee.ats/images/newCategory.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/newNote.gif b/org.eclipse.osee.ats/images/newNote.gif
new file mode 100644
index 00000000000..2e1a393b5c1
--- /dev/null
+++ b/org.eclipse.osee.ats/images/newNote.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/newTask.gif b/org.eclipse.osee.ats/images/newTask.gif
new file mode 100644
index 00000000000..9d8a4ffb997
--- /dev/null
+++ b/org.eclipse.osee.ats/images/newTask.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/newWorld.gif b/org.eclipse.osee.ats/images/newWorld.gif
new file mode 100644
index 00000000000..349018a4c2a
--- /dev/null
+++ b/org.eclipse.osee.ats/images/newWorld.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/newWorldSelected.gif b/org.eclipse.osee.ats/images/newWorldSelected.gif
new file mode 100644
index 00000000000..f1f92c0728d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/newWorldSelected.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/note.gif b/org.eclipse.osee.ats/images/note.gif
new file mode 100644
index 00000000000..2d8ab53eefd
--- /dev/null
+++ b/org.eclipse.osee.ats/images/note.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/openId.gif b/org.eclipse.osee.ats/images/openId.gif
new file mode 100644
index 00000000000..f5091346025
--- /dev/null
+++ b/org.eclipse.osee.ats/images/openId.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/openParent.gif b/org.eclipse.osee.ats/images/openParent.gif
new file mode 100644
index 00000000000..3c51e519f55
--- /dev/null
+++ b/org.eclipse.osee.ats/images/openParent.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/orangeR_8_8.gif b/org.eclipse.osee.ats/images/orangeR_8_8.gif
new file mode 100644
index 00000000000..d3893141160
--- /dev/null
+++ b/org.eclipse.osee.ats/images/orangeR_8_8.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/order.gif b/org.eclipse.osee.ats/images/order.gif
new file mode 100644
index 00000000000..42fca3fcc9a
--- /dev/null
+++ b/org.eclipse.osee.ats/images/order.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/personal.gif b/org.eclipse.osee.ats/images/personal.gif
new file mode 100644
index 00000000000..bce90f6ee96
--- /dev/null
+++ b/org.eclipse.osee.ats/images/personal.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/pinEditor.gif b/org.eclipse.osee.ats/images/pinEditor.gif
new file mode 100644
index 00000000000..dfc1dabbb3e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/pinEditor.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/plan.gif b/org.eclipse.osee.ats/images/plan.gif
new file mode 100644
index 00000000000..94eedf6f929
--- /dev/null
+++ b/org.eclipse.osee.ats/images/plan.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/play.gif b/org.eclipse.osee.ats/images/play.gif
new file mode 100644
index 00000000000..57f410224cf
--- /dev/null
+++ b/org.eclipse.osee.ats/images/play.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/print.gif b/org.eclipse.osee.ats/images/print.gif
new file mode 100644
index 00000000000..045de755326
--- /dev/null
+++ b/org.eclipse.osee.ats/images/print.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/privEdit.gif b/org.eclipse.osee.ats/images/privEdit.gif
new file mode 100644
index 00000000000..9312d7e0fe0
--- /dev/null
+++ b/org.eclipse.osee.ats/images/privEdit.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/product.gif b/org.eclipse.osee.ats/images/product.gif
new file mode 100644
index 00000000000..346a94d0201
--- /dev/null
+++ b/org.eclipse.osee.ats/images/product.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/productDef.gif b/org.eclipse.osee.ats/images/productDef.gif
new file mode 100644
index 00000000000..3c8f545dc61
--- /dev/null
+++ b/org.eclipse.osee.ats/images/productDef.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/publish.gif b/org.eclipse.osee.ats/images/publish.gif
new file mode 100644
index 00000000000..a031b62c2d3
--- /dev/null
+++ b/org.eclipse.osee.ats/images/publish.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/rank.gif b/org.eclipse.osee.ats/images/rank.gif
new file mode 100644
index 00000000000..a013d4ed09e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/rank.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/rectangle16.gif b/org.eclipse.osee.ats/images/rectangle16.gif
new file mode 100644
index 00000000000..d441c8d0e36
--- /dev/null
+++ b/org.eclipse.osee.ats/images/rectangle16.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/rectangle24.gif b/org.eclipse.osee.ats/images/rectangle24.gif
new file mode 100644
index 00000000000..a87c8819f71
--- /dev/null
+++ b/org.eclipse.osee.ats/images/rectangle24.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/redCheck.gif b/org.eclipse.osee.ats/images/redCheck.gif
new file mode 100644
index 00000000000..8da601e66d0
--- /dev/null
+++ b/org.eclipse.osee.ats/images/redCheck.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/redDot.gif b/org.eclipse.osee.ats/images/redDot.gif
new file mode 100644
index 00000000000..532db639899
--- /dev/null
+++ b/org.eclipse.osee.ats/images/redDot.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/redRemove.gif b/org.eclipse.osee.ats/images/redRemove.gif
new file mode 100644
index 00000000000..6f647666d32
--- /dev/null
+++ b/org.eclipse.osee.ats/images/redRemove.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/red_user.gif b/org.eclipse.osee.ats/images/red_user.gif
new file mode 100644
index 00000000000..f674064cdd4
--- /dev/null
+++ b/org.eclipse.osee.ats/images/red_user.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/red_user_sm.gif b/org.eclipse.osee.ats/images/red_user_sm.gif
new file mode 100644
index 00000000000..f91ca279748
--- /dev/null
+++ b/org.eclipse.osee.ats/images/red_user_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/refresh.gif b/org.eclipse.osee.ats/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.ats/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/relate.gif b/org.eclipse.osee.ats/images/relate.gif
new file mode 100644
index 00000000000..870934b6934
--- /dev/null
+++ b/org.eclipse.osee.ats/images/relate.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/release.gif b/org.eclipse.osee.ats/images/release.gif
new file mode 100644
index 00000000000..7e31d4303e2
--- /dev/null
+++ b/org.eclipse.osee.ats/images/release.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/remove.gif b/org.eclipse.osee.ats/images/remove.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.ats/images/remove.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/removeAll.gif b/org.eclipse.osee.ats/images/removeAll.gif
new file mode 100644
index 00000000000..28a3785aaca
--- /dev/null
+++ b/org.eclipse.osee.ats/images/removeAll.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/report.gif b/org.eclipse.osee.ats/images/report.gif
new file mode 100644
index 00000000000..e6bf9cf178e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/report.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/repository.gif b/org.eclipse.osee.ats/images/repository.gif
new file mode 100644
index 00000000000..44d16935949
--- /dev/null
+++ b/org.eclipse.osee.ats/images/repository.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/reviewer.gif b/org.eclipse.osee.ats/images/reviewer.gif
new file mode 100644
index 00000000000..f3b67a87f7e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/reviewer.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/role.gif b/org.eclipse.osee.ats/images/role.gif
new file mode 100644
index 00000000000..f1e585bdf72
--- /dev/null
+++ b/org.eclipse.osee.ats/images/role.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/route.gif b/org.eclipse.osee.ats/images/route.gif
new file mode 100644
index 00000000000..8a945332071
--- /dev/null
+++ b/org.eclipse.osee.ats/images/route.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/sample.gif b/org.eclipse.osee.ats/images/sample.gif
new file mode 100644
index 00000000000..34fb3c9d8cb
--- /dev/null
+++ b/org.eclipse.osee.ats/images/sample.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/search.gif b/org.eclipse.osee.ats/images/search.gif
new file mode 100644
index 00000000000..2e772da925f
--- /dev/null
+++ b/org.eclipse.osee.ats/images/search.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/simpleTask.gif b/org.eclipse.osee.ats/images/simpleTask.gif
new file mode 100644
index 00000000000..faad0cbbc08
--- /dev/null
+++ b/org.eclipse.osee.ats/images/simpleTask.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/star.gif b/org.eclipse.osee.ats/images/star.gif
new file mode 100644
index 00000000000..a6294d53b2d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/star.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/state.gif b/org.eclipse.osee.ats/images/state.gif
new file mode 100644
index 00000000000..e45bada95db
--- /dev/null
+++ b/org.eclipse.osee.ats/images/state.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/subscribed.gif b/org.eclipse.osee.ats/images/subscribed.gif
new file mode 100644
index 00000000000..9e1b70f295f
--- /dev/null
+++ b/org.eclipse.osee.ats/images/subscribed.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/subscribedEmail.gif b/org.eclipse.osee.ats/images/subscribedEmail.gif
new file mode 100644
index 00000000000..206b7296128
--- /dev/null
+++ b/org.eclipse.osee.ats/images/subscribedEmail.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/tanBall.gif b/org.eclipse.osee.ats/images/tanBall.gif
new file mode 100644
index 00000000000..e1dde912dcb
--- /dev/null
+++ b/org.eclipse.osee.ats/images/tanBall.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/task.gif b/org.eclipse.osee.ats/images/task.gif
new file mode 100644
index 00000000000..9f987b6ca2e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/task.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/taskSelected.gif b/org.eclipse.osee.ats/images/taskSelected.gif
new file mode 100644
index 00000000000..e747b65cb24
--- /dev/null
+++ b/org.eclipse.osee.ats/images/taskSelected.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/team.gif b/org.eclipse.osee.ats/images/team.gif
new file mode 100644
index 00000000000..68a0f1e738a
--- /dev/null
+++ b/org.eclipse.osee.ats/images/team.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/tool.gif b/org.eclipse.osee.ats/images/tool.gif
new file mode 100644
index 00000000000..c4d1c761a14
--- /dev/null
+++ b/org.eclipse.osee.ats/images/tool.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/trash.gif b/org.eclipse.osee.ats/images/trash.gif
new file mode 100644
index 00000000000..e00f14e0a84
--- /dev/null
+++ b/org.eclipse.osee.ats/images/trash.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/up.gif b/org.eclipse.osee.ats/images/up.gif
new file mode 100644
index 00000000000..07164754e5c
--- /dev/null
+++ b/org.eclipse.osee.ats/images/up.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/user.gif b/org.eclipse.osee.ats/images/user.gif
new file mode 100644
index 00000000000..79723a4bf1d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/user.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/userAdd.gif b/org.eclipse.osee.ats/images/userAdd.gif
new file mode 100644
index 00000000000..3fdf0738e4c
--- /dev/null
+++ b/org.eclipse.osee.ats/images/userAdd.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/user_sm.gif b/org.eclipse.osee.ats/images/user_sm.gif
new file mode 100644
index 00000000000..d2780011574
--- /dev/null
+++ b/org.eclipse.osee.ats/images/user_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/users.gif b/org.eclipse.osee.ats/images/users.gif
new file mode 100644
index 00000000000..bb86ad37cc2
--- /dev/null
+++ b/org.eclipse.osee.ats/images/users.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/users2.gif b/org.eclipse.osee.ats/images/users2.gif
new file mode 100644
index 00000000000..d28c326dea2
--- /dev/null
+++ b/org.eclipse.osee.ats/images/users2.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/version.gif b/org.eclipse.osee.ats/images/version.gif
new file mode 100644
index 00000000000..91868db39c4
--- /dev/null
+++ b/org.eclipse.osee.ats/images/version.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/warn.gif b/org.eclipse.osee.ats/images/warn.gif
new file mode 100644
index 00000000000..14009e9974d
--- /dev/null
+++ b/org.eclipse.osee.ats/images/warn.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/whiteGear.gif b/org.eclipse.osee.ats/images/whiteGear.gif
new file mode 100644
index 00000000000..837074b1536
--- /dev/null
+++ b/org.eclipse.osee.ats/images/whiteGear.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/whiteT_8_8.gif b/org.eclipse.osee.ats/images/whiteT_8_8.gif
new file mode 100644
index 00000000000..cede7c6806b
--- /dev/null
+++ b/org.eclipse.osee.ats/images/whiteT_8_8.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/workflow.gif b/org.eclipse.osee.ats/images/workflow.gif
new file mode 100644
index 00000000000..d4f14922643
--- /dev/null
+++ b/org.eclipse.osee.ats/images/workflow.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/workflowConfig.gif b/org.eclipse.osee.ats/images/workflowConfig.gif
new file mode 100644
index 00000000000..8a945332071
--- /dev/null
+++ b/org.eclipse.osee.ats/images/workflowConfig.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/world.gif b/org.eclipse.osee.ats/images/world.gif
new file mode 100644
index 00000000000..b88343e5ebf
--- /dev/null
+++ b/org.eclipse.osee.ats/images/world.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/yellowBall.gif b/org.eclipse.osee.ats/images/yellowBall.gif
new file mode 100644
index 00000000000..07c5346e0c4
--- /dev/null
+++ b/org.eclipse.osee.ats/images/yellowBall.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/yellowN_8_8.gif b/org.eclipse.osee.ats/images/yellowN_8_8.gif
new file mode 100644
index 00000000000..ec06366b2e9
--- /dev/null
+++ b/org.eclipse.osee.ats/images/yellowN_8_8.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/yellowT_8_8.gif b/org.eclipse.osee.ats/images/yellowT_8_8.gif
new file mode 100644
index 00000000000..df68897ca1e
--- /dev/null
+++ b/org.eclipse.osee.ats/images/yellowT_8_8.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/zoom.gif b/org.eclipse.osee.ats/images/zoom.gif
new file mode 100644
index 00000000000..4b0a1212823
--- /dev/null
+++ b/org.eclipse.osee.ats/images/zoom.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/zoom_in.gif b/org.eclipse.osee.ats/images/zoom_in.gif
new file mode 100644
index 00000000000..2ab25e5cb78
--- /dev/null
+++ b/org.eclipse.osee.ats/images/zoom_in.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/images/zoom_out.gif b/org.eclipse.osee.ats/images/zoom_out.gif
new file mode 100644
index 00000000000..11ac62bfe85
--- /dev/null
+++ b/org.eclipse.osee.ats/images/zoom_out.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/plugin.xml b/org.eclipse.osee.ats/plugin.xml
new file mode 100644
index 00000000000..535368245a7
--- /dev/null
+++ b/org.eclipse.osee.ats/plugin.xml
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="AtsNavigateItem" name="AtsNavigateItem" schema="schema/AtsNavigateItem.exsd"/>
+ <extension-point id="AtsStateItem" name="AtsStateItem" schema="schema/AtsStateItem.exsd"/>
+ <extension-point id="AtsAIandTeamConfig" name="AtsAIandTeamConfig" schema="schema/AtsAIandTeamConfig.exsd"/>
+ <extension-point id="AtsWizardItem" name="AtsWizardItem" schema="schema/AtsWizardItem.exsd"/>
+ <extension-point id="AtsTeamWorkflow" name="AtsTeamWorkflow" schema="schema/AtsTeamWorkflow.exsd"/>
+ <extension-point id="AtsNotification" name="AtsNotification" schema="schema/AtsNotification.exsd"/>
+ <extension-point id="AtsWorldEditorItem" name="AtsWorldEditorItem" schema="schema/AtsWorldEditorItem.exsd"/>
+ <extension
+ point="org.eclipse.ui.editors">
+ <editor
+ class="org.eclipse.osee.ats.editor.SMAEditor"
+ icon="images/plan.gif"
+ default="false"
+ id="org.eclipse.osee.ats.editor.SMAEditor"
+ name="ATS Workflow Editor"/>
+ <editor
+ class="org.eclipse.osee.ats.task.TaskEditor"
+ default="false"
+ icon="images/task.gif"
+ id="org.eclipse.osee.ats.editor.TaskEditor"
+ name="ATS Task Editor"/>
+ <editor
+ class="org.eclipse.osee.ats.world.WorldEditor"
+ default="false"
+ icon="images/globe.gif"
+ id="org.eclipse.osee.ats.world.WorldEditor"
+ name="ATS World Editor">
+ </editor>
+ <editor name="ATS Workflow Config Editor"
+ icon="images/workflowConfig.gif"
+ default="true"
+ class="org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigEditor"
+ contributorClass="org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigEditorActionBarContributor"
+ id="org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigEditor">
+ </editor>
+ </extension>
+ <extension point="org.eclipse.osee.framework.skynet.core.ArtifactFactory">
+ <ArtifactFactory classname="org.eclipse.osee.ats.artifact.AtsArtifactFactory"/>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="reference/toc.xml"
+ primary="true"/>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts file="reference/configure/contexts.xml"/>
+ <contexts file="reference/newActionWizard/contexts.xml"/>
+ <contexts file="reference/decision_review_workflow/contexts.xml"/>
+ <contexts
+ file="reference/peer_to_peer_review_workflow/contexts.xml">
+ </contexts>
+ <contexts
+ file="reference/contexts.xml">
+ </contexts>
+ </extension>
+ <extension
+ point="org.eclipse.ui.newWizards">
+ <category
+ id="org.eclipse.osee.ats.category"
+ name="OSEE ATS">
+ </category>
+ <wizard
+ canFinishEarly="false"
+ category="org.eclipse.osee.ats.category"
+ class="org.eclipse.osee.ats.actions.wizard.NewActionWizard"
+ hasPages="true"
+ icon="images/action.gif"
+ id="org.eclipse.osee.ats.NewAction.wizard"
+ name="Action">
+ </wizard>
+ <wizard
+ canFinishEarly="false"
+ category="org.eclipse.osee.ats.category"
+ class="org.eclipse.osee.ats.config.wizard.AtsConfigWizard"
+ hasPages="true"
+ icon="images/workflowConfig.gif"
+ id="org.eclipse.osee.ats.config.wizard.AtsConfigWizard"
+ name="ATS Configuration">
+ </wizard>
+ <wizard
+ canFinishEarly="false"
+ category="org.eclipse.osee.ats.category"
+ class="org.eclipse.osee.ats.workflow.editor.wizard.AtsWorkflowConfigCreationWizard"
+ hasPages="true"
+ icon="images/workflowConfig.gif"
+ id="org.eclipse.osee.ats.workflow.editor.wizard.AtsWorkflowConfigCreationWizard"
+ name="Workflow Configuration">
+ </wizard>
+ </extension>
+<extension point="org.eclipse.ui.perspectives">
+ <perspective
+ name="ATS"
+ class="org.eclipse.osee.ats.ATSPerspective"
+ fixed="false"
+ id="org.eclipse.osee.ats.ATSPerspective"
+ icon="images/atsPerspective.gif">
+ </perspective>
+</extension>
+ <extension
+ point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension targetID="org.eclipse.ui.resourcePerspective">
+ <perspectiveShortcut id="org.eclipse.osee.ats.ATSPerspective"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="osee.define.PerspectiveFactory">
+ <perspectiveShortcut id="org.eclipse.osee.ats.ATSPerspective"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
+ <perspectiveShortcut id="org.eclipse.osee.ats.ATSPerspective"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="org.eclipse.osee.ats.ATSPerspective">
+ <perspectiveShortcut id="org.eclipse.jdt.ui.JavaPerspective"/>
+ <perspectiveShortcut id="org.eclipse.ui.resourcePerspective"/>
+ <perspectiveShortcut id="osee.define.PerspectiveFactory"/>
+ </perspectiveExtension>
+ </extension>
+
+ <extension
+ id="org.eclipse.osee.ats"
+ name="ATS"
+ point="org.eclipse.ui.views">
+ <category
+ name="OSEE ATS"
+ id="org.eclipse.osee.ats.category"/>
+ <view
+ class="org.eclipse.osee.ats.navigate.NavigateView"
+ icon="images/atsNavigate.gif"
+ category="org.eclipse.osee.ats.category"
+ name="ATS Navigator"
+ id="org.eclipse.osee.ats.navigate.NavigateView">
+ </view>
+ <view
+ class="org.eclipse.osee.ats.hyper.ActionHyperView"
+ icon="images/hyper.gif"
+ category="org.eclipse.osee.ats.category"
+ name="Action View"
+ id="org.eclipse.osee.ats.hyper.ActionHyperView">
+ </view>
+<!-- Don't allow access to this yet
+ <view
+ class="org.eclipse.osee.ats.hyper.ActionSkyWalker"
+ icon="images/hyper.gif"
+ category="org.eclipse.osee.ats.category"
+ name="Action View"
+ id="org.eclipse.osee.ats.hyper.ActionSkyWalker">
+ </view>
+-->
+ <view
+ class="org.eclipse.osee.ats.hyper.ArtifactHyperView"
+ icon="images/artView.gif"
+ category="org.eclipse.osee.ats.category"
+ name="Artifact View"
+ id="org.eclipse.osee.ats.hyper.ArtifactHyperView">
+ </view>
+ </extension>
+ <extension
+ id="AtsDatabaseConfig"
+ name="AtsDatabaseConfig"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.ats.config.AtsDatabaseConfig">
+ </DatabaseTask>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ats.AtsStateItem">
+ <AtsStateItem classname="org.eclipse.osee.ats.editor.stateItem.AtsDecisionReviewPrepareStateItem"/>
+ <AtsStateItem classname="org.eclipse.osee.ats.editor.stateItem.AtsDecisionReviewDecisionStateItem"/>
+ <AtsStateItem
+ classname="org.eclipse.osee.ats.editor.stateItem.AtsPeerToPeerReviewPrepareStateItem">
+ </AtsStateItem>
+ <AtsStateItem
+ classname="org.eclipse.osee.ats.editor.stateItem.AtsPeerToPeerReviewReviewStateItem">
+ </AtsStateItem>
+ <AtsStateItem
+ classname="org.eclipse.osee.ats.editor.stateItem.AtsForceAssigneesToTeamLeadsStateItem">
+ </AtsStateItem>
+ <AtsStateItem
+ classname="org.eclipse.osee.ats.editor.stateItem.AtsHandleAddReviewRuleStateItem">
+ </AtsStateItem>
+ </extension>
+ <extension
+ id="OseeTypes_ATS"
+ name="OseeTypes_ATS"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_ATS.xml"/>
+ </extension>
+ <extension
+ id="TaskMetrics"
+ name="TaskMetrics"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.operation.TaskMetrics">
+ </Operation>
+ </extension>
+ <extension
+ id="ConnectWorkflowToTransaction"
+ name="Connect Workflow To Transaction"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.ats.operation.ConnectWorkflowToTransaction"/>
+ </extension>
+ <extension
+ id="ats"
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.ats.editor.AtsWorkflowRenderer"/>
+ <Renderer
+ classname="org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigRenderer">
+ </Renderer>
+ <Renderer
+ classname="org.eclipse.osee.ats.editor.AtsTaskEditorRenderer">
+ </Renderer>
+ <Renderer
+ classname="org.eclipse.osee.ats.editor.AtsWorldEditorRenderer">
+ </Renderer>
+ <Renderer
+ classname="org.eclipse.osee.ats.export.AtsExportRenderer">
+ </Renderer>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.DefaultInitialBranchProvider">
+ <Provider class="org.eclipse.osee.ats.util.TeamBasedDefaultBranchProvider"/>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ArtifactAnnotation">
+ <ArtifactAnnotation
+ classname="org.eclipse.osee.ats.util.AtsArtifactAnnotations">
+ </ArtifactAnnotation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.AtsLib">
+ <AtsLib
+ classname="org.eclipse.osee.ats.util.AtsLib">
+ </AtsLib>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.XWidgetProvider">
+ <XWidgetProvider
+ classname="org.eclipse.osee.ats.util.widgets.XWidgetProvider">
+ </XWidgetProvider>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ArtifactCheck">
+ <ArtifactCheck
+ classname="org.eclipse.osee.ats.util.AtsArtifactChecks">
+ </ArtifactCheck>
+ </extension>
+ <extension
+ id="ImportTasksFromSpreadsheet"
+ name="ImportTasksFromSpreadsheet"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.operation.ImportTasksFromSpreadsheet">
+ </Operation>
+ </extension>
+ <extension
+ id="ImportTasksFromSimpleList"
+ name="ImportTasksFromSimpleList"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.operation.ImportTasksFromSimpleList">
+ </Operation>
+ </extension>
+ <extension
+ id="AtsWorkDefinitions"
+ name="AtsWorkDefinitions"
+ point="org.eclipse.osee.framework.ui.skynet.WorkDefinitionProvider">
+ <WorkDefinitionProvider
+ classname="org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions">
+ </WorkDefinitionProvider>
+ </extension>
+ <extension
+ id="ReAssignATSObjectsToUser"
+ name="ReAssignATSObjectsToUser"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.operation.ReAssignATSObjectsToUser">
+ </Operation>
+ </extension>
+ <extension
+ id="AtsWidgetProvider"
+ name="AtsWidgetProvider"
+ point="org.eclipse.osee.framework.ui.skynet.XWidgetProvider">
+ <XWidgetProvider
+ classname="org.eclipse.osee.ats.util.widgets.AtsWidgetProvider">
+ </XWidgetProvider>
+ </extension>
+ <extension
+ id="TranslateImportedValidateChangeReports"
+ name="TranslateImportedValidateChangeReports"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.health.TxImportedValidateChangeReports">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.atseditor.command"
+ name="ATS Workflow Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.atstaskeditor.command"
+ name="ATS Task Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.atsworldeditor.command"
+ name="ATS World Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.atsexport.command"
+ name="ATS Artifact Export">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.osee.ats.handlers.AtsEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.atseditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.ats.handlers.AtsTaskEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.atstaskeditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.ats.handlers.AtsWorldEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.atsworldeditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.ats.handlers.AtsExportHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.atsexport.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commandImages">
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.atseditor.command"
+ icon="images/action.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.atstaskeditor.command"
+ icon="images/task.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.atsworldeditor.command"
+ icon="images/globe.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.atsexport.command"
+ icon="images/export2.gif">
+ </image>
+ </extension>
+ <extension
+ point="org.eclipse.ui.exportWizards">
+ <wizard
+ category="org.eclipse.osee.framework.ui.skynet.export"
+ class="org.eclipse.osee.ats.export.AtsExportWizard"
+ icon="images/export2.gif"
+ id="org.eclipse.osee.ats.exportWwizard"
+ name="OSEE ATS Export">
+ </wizard>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ClientLoopbackCmd">
+ <ClientLoopbackCmd
+ className="org.eclipse.osee.ats.util.OpenInAtsLoopbackCmd">
+ </ClientLoopbackCmd>
+ </extension>
+ <extension
+ id="DuplicateWorkflowBlam"
+ name="DuplicateWorkflowBlam"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.ats.operation.DuplicateWorkflowBlam">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ats.AtsWorldEditorItem">
+ <AtsWorldEditorItem
+ classname="org.eclipse.osee.ats.world.AtsWorldEditorItem">
+ </AtsWorldEditorItem>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider">
+ <ArtifactImageProvider
+ class="org.eclipse.osee.ats.AtsArtifactImageProvider">
+ </ArtifactImageProvider>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ats/reference/DO_NOT_EDIT_HERE.txt b/org.eclipse.osee.ats/reference/DO_NOT_EDIT_HERE.txt
new file mode 100644
index 00000000000..067a523c3be
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/DO_NOT_EDIT_HERE.txt
@@ -0,0 +1,3 @@
+All documentation in this folder has been retired and should only be for reference.
+
+Everything has been moved to http://wiki.eclipse.org/OSEE \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/Priority.html b/org.eclipse.osee.ats/reference/Priority.html
new file mode 100644
index 00000000000..0fa30d8aeab
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/Priority.html
@@ -0,0 +1,52 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Priorities for classifying problems</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Priorities for classifying problems</h1>
+
+<Table border><TR><Th>Priority</Th><Th>Description</Th><Th>MIL-STD-498 Description</Th></TR>
+<TR>
+ <TD align=center>1</TD>
+ <TD>Prevents end users from performing an essential task that results in work stoppages. The impact to project cost/schedule requires an immediate resolution and a special release may be necessary.</TD>
+ <TD>a. Prevent the accomplishment of an operational or mission essential capability<br>b. Jeopardize safety, security, or other requirement designated "critical"</TD>
+</TR>
+
+<TR>
+ <TD align=center>2</TD>
+ <TD>Adversely affects end users from performing an essential task. Significant impact to project cost/schedule with resolution needed within 3 weeks.</TD>
+ <TD>a. Adversely affect the accomplishment of an operational or mission essential capability and no work-around solution is known.<br>b. Adversely affect technical, cost, or schedule risks to the project or to life cycle support of the system, and no work-around solution is known</TD>
+</TR>
+
+<TR>
+ <TD align=center>3</TD>
+ <TD>Hinders end users from performing an essential task or a capability is behind schedule. Impact to project cost/schedule with resolution needed within 6 weeks.</TD>
+ <TD>a. Adversely affect the accomplishment of an operational or mission essential capability but a work-around solution is known.<br>b. Adversely affect technical, cost, or schedule risks to the project or to life cycle support of the system, but a work-around solution is known</TD>
+</TR>
+
+<TR>
+ <TD align=center>4</TD>
+ <TD>Minor impact to end users or is a capability being developed per schedule. Can be resolved per normal release schedule.</TD>
+ <TD>a. Result in user/operator inconvenience or annoyance but does not affect a required operational or mission essential capability.<br>b. Result in inconvenience or annoyance for development or support personnel, but does not prevent the accomplishment of those responsibilities.</TD></TR>
+
+<TR>
+ <TD align=center>5</TD>
+ <TD>An inconvenience or annoyance. Can be resolved as schedule and budget permits.</TD>
+ <TD>Any other effect</TD>
+</TR>
+</Table>
+
+</body>
+</html>
+
diff --git a/org.eclipse.osee.ats/reference/ats_action_view.html b/org.eclipse.osee.ats/reference/ats_action_view.html
new file mode 100644
index 00000000000..81dbb7dee3c
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_action_view.html
@@ -0,0 +1,32 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Action View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Action View</h1>
+ <br/>
+ <img src="ats_action_view.jpg"/>
+ <h2>Purpose</h2>
+ Shows a graphical representation of the currently open Action or Team Workflow.
+ <h2>How to do it</h2>
+ Double-click open any Action or Team Workflow. Action View will show parent child
+ relationship between Action and it's children Team Workflows. Cyan outline show currently
+ open editor.
+ <h2>ToolTip</h2>
+ Hover over any object to determine information about current state, assignees and work to be done.
+ <h2>Double-Click / Right-Click</h2>
+ Double-Click to open any object in the ATS Editor or right click for more options.
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/ats_action_view.jpg b/org.eclipse.osee.ats/reference/ats_action_view.jpg
new file mode 100644
index 00000000000..9d42cd75ae9
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_action_view.jpg
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/ats_icons.html b/org.eclipse.osee.ats/reference/ats_icons.html
new file mode 100644
index 00000000000..fc95fd6ae71
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_icons.html
@@ -0,0 +1,49 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Icons</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Icons</h1>
+ <br/>
+ <h2>ATS Objects</h2>
+ <br/>
+ <img src="../images/action.gif"/> denotes an Action, the top level object in ATS<br/>
+ <img src="../images/workflow.gif"/> denotes a Team Workflow; moves team through completion of change<br/>
+ <img src="../images/task.gif"/> denotes a Task; lightweight workflow that is performed during Team Workflow states<br/>
+ <img src="../images/version.gif"/> denotes the ATS targeted for release version<br/>
+ <img src="../images/R.gif"/> denotes the ATS review<br/>
+ <br/>
+ <h2>ATS Overlays</h2>
+ <img src="../images/warn.gif"/> warning that something needs to be addressed; open object for more information<br/>
+ <img src="../images/orangeR_8_8.gif"/> released version<br/>
+ <img src="../images/yellowN_8_8.gif"/> next release version<br/>
+ <img src="../images/favorite.gif"/> ATS object marked as user's favorite; select "My Favorites" to load all marked<br/>
+ <img src="../images/subscribed.gif"/> ATS object user desires to receive email upon every state transition<br/>
+ <img src="../images/whiteT_8_8.gif"/> ATS object is obtaining estimated hours, percent complete, hours spent and remaining hours from tasks<br/>
+ <br/>
+ <h2>ATS Operations</h2>
+ <br/>
+ Select <img src="../images/newAction.gif"/> to create a new action<br/>
+ Select <img src="../images/newTask.gif"/> to create a new task<br/>
+ Select <img src="../images/refresh.gif"/> to refresh current view<br/>
+ Select <img src="../images/print.gif"/> to print the ATS Results<br/>
+ Select <img src="../images/email.gif"/> to email the ATS Results to an OSEE user<br/>
+ Select <img src="../images/export.gif"/> to export the ATS Results to CSV file<br/>
+ Select <img src="../images/bug.gif"/> to <A href="report_a_bug.html"/>Report a Bug</A>.<br/>
+ <br/>
+ <h2>ATS Configuration</h2>
+ <img src="../images/team.gif"/> denotes a team configured to do work in ATS<br/>
+ <img src="../images/AI.gif"/> denotes an Actionable Item that a user can create an Action against<br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/ats_navigator.gif b/org.eclipse.osee.ats/reference/ats_navigator.gif
new file mode 100644
index 00000000000..d5225ac9f7a
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_navigator.gif
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/ats_navigator.jpg b/org.eclipse.osee.ats/reference/ats_navigator.jpg
new file mode 100644
index 00000000000..1f1b55f52bc
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_navigator.jpg
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/ats_navigator_view.html b/org.eclipse.osee.ats/reference/ats_navigator_view.html
new file mode 100644
index 00000000000..f94beee9514
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_navigator_view.html
@@ -0,0 +1,29 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Navigator</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Navigator</h1>
+ <br/>
+ <img src="ats_navigator.jpg"/>
+ <h2>Purpose</h2>
+ Central location to launch ATS searches, perform quick navigation and kickoff metrics.
+ <h2>How to do it</h2>
+ Double-click any navigation item to kickoff the corresponding search, action, report.
+ <h2>Filter</h2>
+ Filter out all navigation items that conains the entered text.
+ Select the clear action (<img src="../images/clear.gif"/>) to clear out the text
+ and restore all navigation items.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/ats_world_view.html b/org.eclipse.osee.ats/reference/ats_world_view.html
new file mode 100644
index 00000000000..212e0c7d2ad
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_world_view.html
@@ -0,0 +1,54 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS World View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS World View</h1>
+ <br/>
+ <img src="ats_world_view.jpg"/>
+ <h2>Purpose</h2>
+ Shows ATS workflow objects including Actions, Team Workflows, Tasks and Reviews that were
+ returned from a search normally performed by the ATS Navigator.
+ <h2>How to do it</h2>
+ Double-click search item from ATS Navigator. ATS World will show that it is loading. Upon
+ return, ATS World will contain all ATS objects from the search. In addition, a plus is shown
+ next to any object. Upon selection, viewer will expand to show all children of the selected
+ object.
+ <h2>Open ATS Action, Team Workflow, Task or Review</h2>
+ Double-click to open any item open in ATS Workflow Editor.
+ <h2>Sorting</h2>
+ Selecting column headers will sort that column. Holding down Ctrl and selecting successive
+ columns will enable multi sort. Re-selecting a column will reverse sort that column.
+ The status label at the bottom will show the columns being sorted and which direction the
+ sort is being performed. To remove all sorting, right-click and select "Remove All Sorting".
+ <h2>Bottom Status Line</h2>
+ The bottom status line will show the total number of objects loaded into the table, the total
+ shown and the total selected. It will also show all the sorts and filters that are enabled.
+ <h2>Top Status Line</h2>
+ The top status line will show the name of the search that populated the ATS World View. A
+ warning icon (<img src="../images/warn.gif"/>) will show if the search returned no objects to show.
+ <h2>Filtering</h2>
+ Bottom right of the ATS World shows a filter box that is a quick way to filter by one or two words.
+ Simply type in a string, press enter and ATS World will only show those loaded objects that where one of the
+ visible cells contains the typed text. This is a case in-sensitive search. Select the clear
+ action (<img src="../images/clear.gif"/>) to clear out the text and restore all loaded actions.
+ <h2>Actions</h2>
+ Select <img src="../images/A.gif"/> to load ATS World with all the actions that you have work to do on.<br/>
+ Select <img src="../images/action.gif"/> to create a new Action.<br/>
+ Select <img src="../images/rank.gif"/> to rank actions by deadline date then by priority and annual cost avoidence.<br/>
+ Select <img src="../images/refresh.gif"/> to refresh the current search.<br/>
+ Select <img src="../..//osee.skynet.gui/images/customize.gif"/> to <A href="../../osee.skynet.gui/reference/table_customization.html"/>Customize Table</A>.<br/>
+ Select <img src="../images/bug.gif"/> to <A href="report_a_bug.html"/>Report a Bug</A>.<br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/ats_world_view.jpg b/org.eclipse.osee.ats/reference/ats_world_view.jpg
new file mode 100644
index 00000000000..75176a1d039
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/ats_world_view.jpg
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/configure/ActionableItems.html b/org.eclipse.osee.ats/reference/configure/ActionableItems.html
new file mode 100644
index 00000000000..8494e47d3fc
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/ActionableItems.html
@@ -0,0 +1,41 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Configure Actionable Items</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Configure Actionable Items (AI)</h1>
+ <h2>Purpose</h2>
+ Actionable Items provide the end user with a selection of things impacted by the Action. They
+ are related to the <a href="TeamDefinition.html">Team</a> that is responsible for performing the
+ work.
+ <h2>How to do it</h2>
+ <ul>
+ <li>AIs should not be deleted. Instead, use the ats.Active attribute to deactivate the AI.
+ If an AI must be deleted, search for all "ats.Actionable Item" attributes that have the value of the AI's guid.
+ These must be changed to another AI before deletion.</li>
+ <li>Actionable Item tree can be created to the level at which actions are to be written. Usually a component decomposition. In the case of UIs, create one for each view or window.</li>
+ <li>Attributes</li>
+ <ul>
+ <li>Name:[uniquely recognizable team name]</li>
+ <li>ats.Active:[yes]</li>
+ </ul>
+ <li>Relations</li>
+ <ul>
+ <li>DefaultHeirarchy: Relate to parent team or top level "Actionable Items" artifact"</li>
+ <li>TeamActionableItem: Relate to team responsible for performing tasks. Team can be related to parent and all children will have team by default.
+ </ul>
+ </ul>
+</body>
+</html>
+
diff --git a/org.eclipse.osee.ats/reference/configure/TeamDefinition.html b/org.eclipse.osee.ats/reference/configure/TeamDefinition.html
new file mode 100644
index 00000000000..80c8e28f78b
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/TeamDefinition.html
@@ -0,0 +1,43 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Configure Team Definition</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Configure Team Definition</h1>
+ <h2>Purpose</h2>
+ The Team Definition artifact specifies leads and members that are assigned to work on related Actionable Items.
+ <h2>How to do it</h2>
+ <ul>
+ <li>Team Definitions should match company organizational structure.</li>
+ <li>Attributes</li>
+ <ul>
+ <li>Name:[uniquely recognizable team name]</li>
+ <li>ats.Full Name:[optional full name]</li>
+ <li>ats.Description:[desc]</li>
+ <li>ats.Active:[yes]</li>
+ <li>ats.Team Uses Version:[yes if want to use release/build planning]</li>
+ </ul>
+ <li>Relations</li>
+ <ul>
+ <li>DefaultHeirarchy: Relate to parent team or top level "Teams"</li>
+ <li>TeamDefinitionToVersion: Relate to current and future VersionArtifacts</li>
+ <li>TeamLead: Relate to one or more team leads. These individuals will have priviledged edit and perform the Endorse state by default.</li>
+ <li>TeamMember: Relate to one or more team members. These individuals will have ability to priviledged edit Workflows created by themselves against the team they belong to.</li>
+ <li>Work Item.Child: Relate to a single "Work Flow Definition" artifact that defines the workflow
+ that will be used for this team.</li>
+ </ul>
+ </ul>
+</body>
+</html>
+
diff --git a/org.eclipse.osee.ats/reference/configure/WorkFlowDefinition.html b/org.eclipse.osee.ats/reference/configure/WorkFlowDefinition.html
new file mode 100644
index 00000000000..71029188c8c
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/WorkFlowDefinition.html
@@ -0,0 +1,60 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Work Flow Definition Artifact</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Work Flow Definition Artifact</h1>
+ <h2>Purpose</h2>
+ The Work Flow Definition artifact specifies the workflow that a team moves through to complete
+ an Action. This artifact specifies the states, their transitions and the start state of the
+ workflow. Creation/Editing of this artifact can either be done through the Artifact Editor
+ or using the Workflow Configuration Editor (OSEE 0.6.0 Release and beyond).
+
+ <h2>How to do it - <a href="WorkflowConfigurationEditor.html">Configuration Editor</a></h2>
+
+ <h2>How to do it - Artifact Editor</h2>
+ On the Common branch in the Artifact Editor, Expand "Action Tracking System" and right-click
+ on "Work Flows", select New Child -> Work Flow Definition. Enter a unique namespace name
+ for this workflow (eg: org.<company>.code). In the Artifact Editor, add and set the attributes
+ and relations as below.
+ <br><br>
+ <li>Attributes</li>
+ <ul>
+ <li>Name:[unique namespace, usually the same as the Work Id specified below]</li>
+ <li>osee.wi.Work Id:[unique workflow namespace] - this will preceed each state name
+ specified in the workflow.</li>
+ <li>osee.wi.Parent Work Id:[Work Id of Parent Work Flow Definition] - this will allow
+ this workflow to inherit it's transitions and start state from another workflow. This
+ can not be used with other attributes below</li>
+ <li>osee.wi.Start Page:[namespace.state name] - this specifies the name of the
+ initial state in the workflow</li>
+ <li>osee.wi.Transition:[[from state name];[transition type];[to state name]] - specifies
+ the transition from state to state where</li>
+ <ul>
+ <li>[from state name]/[to state name]- unique Work Page Definition Work Id comprised of [namespace].[State Name]</li>
+ <li>[transition type] - one of the following:</li>
+ <ul>
+ <li>ToPageAsDefault - Transition is "Default Transition" state</li>
+ <li>ToPage - Transition is optional transition to state</li>
+ <li>ToPageAsReturn - Optional transition to a previously visited state</li>
+ </ul>
+ </ul>
+ <li>osee.wi.Description:Optional attribute to add description of workflow</li>
+ </ul>
+ <li>Relations</li>
+ <ul>
+ <li>Work Item.Parent: Relate to any Team Definition configured to use this workflow.</li>
+ </ul>
+</body>
+</html>
diff --git a/org.eclipse.osee.ats/reference/configure/WorkPageDefinition.html b/org.eclipse.osee.ats/reference/configure/WorkPageDefinition.html
new file mode 100644
index 00000000000..07f804fe21f
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/WorkPageDefinition.html
@@ -0,0 +1,51 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Work Page Definition Artifact</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Work Page Definition Artifact</h1>
+ <h2>Purpose</h2>
+ The Work Page Definition artifact configures a single state of the <a href="WorkFlowDefinition.html>
+ Workflow Definition</a> for a <a href="WorkflowConfiguration.html">Workflow Configuration</a>.
+
+ <h2>How to do it - <a href="WorkflowConfigurationEditor.html">ATS Workflow Configuration Editor</a></h2>
+ The ATS Workflow Configuration Editor will allow the editing of the three main fields of a
+ Work Page Definition Artifact. The remaining fields, and the relations to <a href="WorkRuleDefinition.html">
+ Work Rules</a> and <a href="WorkWidgetDefinition.html">Work Widgets</a> must be done through the
+ Artifact Editor.
+
+ <h2>How to do it - Artifact Editor</h2>
+ Work Page Definitions are either stored as children of their Work Flow Definition artifact or
+ under the "Work Pages" folder.
+ <br>
+ On the Common branch in the Artifact Editor, Expand "Action Tracking System" and right-click
+ on "Work Page", select New Child -> Work Page Definition, or double-click an existing Work Page
+ Definition artifact. Edit the following attributes and relations accordingly.
+ <br><br>
+ <li>Attributes</li>
+ <ul>
+ <li>Name:[unique name matching Work Id below]</li>
+ <li>osee.wi.Work Id:[unique workflow namespace].[Work Page Name] as below.</li>
+ <li>osee.wi.Parent Work Id:[Work Id of Parent Work Page Definition] - this will allow
+ this workflow to inherit it's widgets and rules from another workflow. This
+ can not be used with other attributes below</li>
+ <li>osee.wi.Work Page Name:State Name that the user will see. This can not have any
+ special characters including . in the name.</li>
+ </ul>
+ <li>Relations</li>
+ <ul>
+ <li>Work Item.Child: Relate to any Rules or Widgets that this state is made of.</li>
+ </ul>
+</body>
+</html>
diff --git a/org.eclipse.osee.ats/reference/configure/WorkRuleDefinition.html b/org.eclipse.osee.ats/reference/configure/WorkRuleDefinition.html
new file mode 100644
index 00000000000..f076cd81ba6
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/WorkRuleDefinition.html
@@ -0,0 +1,41 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Work Rule Definition Artifact</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Work Rule Definition Artifact</h1>
+ <h2>Purpose</h2>
+ The Work Rule Definition artifact specifies a single rule that can be applied to workflow configurations
+ or to <a href="TeamDefinition.html">Team Definition</a> artifacts. These rules are normally backed by
+ java code that performs certain tasks like automatically creating new reviews, assigning
+ workflows to specific users or specifying states as allowing create/commit of branches.
+
+ <h2>How to do it - Artifact Editor</h2>
+ On the Common branch in the Artifact Editor, Expand "Action Tracking System" expand
+ "Work Rule" and double-click any existing Work Rule. Edit the following attributes and relations
+ accordingly.
+ <br><br>
+ <li>Attributes</li>
+ <ul>
+ <li>Name:[unique name matching Work Id below]</li>
+ <li>osee.wi.Work Id:[unique workflow namespace].[Work Page Name] as below.</li>
+ <li>osee.wi.Work Description:Simple description explaining what rule does.</li>
+ <li>osee.wi.Work Data:Key/Value pares of information used by rule.</li>
+ </ul>
+ <li>Relations</li>
+ <ul>
+ <li>Work Item.Parent: Relate to any Team Definition or Work Page Definition artifacts as appropriate.</li>
+ </ul>
+</body>
+</html>
diff --git a/org.eclipse.osee.ats/reference/configure/WorkWidgetDefinition.html b/org.eclipse.osee.ats/reference/configure/WorkWidgetDefinition.html
new file mode 100644
index 00000000000..b899ac40013
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/WorkWidgetDefinition.html
@@ -0,0 +1,39 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Work Widget Definition Artifact</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Work Rule Widget Artifact</h1>
+ <h2>Purpose</h2>
+ The Work Widget Definition artifact specifies a single widget, via xml, that will be
+ displayed on the state page in the ATS Workflow Editor.
+
+ <h2>How to do it - Artifact Editor</h2>
+ On the Common branch in the Artifact Editor, Expand "Action Tracking System" expand
+ "Work Widget" and double-click any existing Work Widget. Edit the following attributes and relations
+ accordingly.<br><br>
+
+ <li>Attributes</li>
+ <ul>
+ <li>Name:[unique name matching Work Id below]</li>
+ <li>osee.wi.Work Id:[unique id]</li>
+ <li>osee.wi.Work Description:Simple description explaining what widget is.</li>
+ <li>osee.wi.Work Data: XWidget=[XWidget xml specifying widget]</li>
+ </ul>
+ <li>Relations</li>
+ <ul>
+ <li>Work Item.Parent: Relate to any Team Definition or Work Page Definition artifacts as appropriate.</li>
+ </ul>
+</body>
+</html>
diff --git a/org.eclipse.osee.ats/reference/configure/WorkflowConfiguration.html b/org.eclipse.osee.ats/reference/configure/WorkflowConfiguration.html
new file mode 100644
index 00000000000..6d575bf98e8
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/WorkflowConfiguration.html
@@ -0,0 +1,51 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Workflow Configuration</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Workflow Configuration</h1>
+ <h2>Purpose</h2>
+ To create a new workflow configuration that ATS uses to move an Action through it's specific workflow.
+ <h2>Ats Workflow Configuration artifacts.</h2>
+ ATS uses four main artifacts to configure a workflow for use by a Team.
+ <ul>
+ <li><a href="WorkFlowDefinition.html">Work Flow Definition<a> specifies
+ the states, their transitions and the state that represents the beginning of the
+ workflow.</li>
+ <li><a href="WorkPageDefinition.html">Work Page Definition<a> defines
+ the a single state of the Work Flow Definition.</li>
+ <li><a href="WorkWidgetDefinition.html">Work Widget Definition<a> defines
+ a single widget and its corresponding attribute that the value will be stored in. It
+ also provides some layout capabilities for that widget.</li>
+ <li><a href="WorkRuleDefinition.html">Work Rule Definition<a> defines
+ certain rules that can be applied to Work Pages and Team Definitions.</li>
+ </ul>
+ <h2>How to do it</h2>
+ <ul>
+ <li>Workflows can be created using the <a href="WorkflowConfigurationEditor.html">
+ ATS Workflow Configuration Editor<a> (0.6.0 release). States and their transitions can
+ be edited through this interface. Other modifications will need to be edited through
+ <a href="create_workflowdefinition_artifact.html">Work Flow Definition<a> attributes
+ and relations.</li>
+ <li>Work Pages, Widgets and Rules are currently edited through the
+ attributes and relations using the default Artifact Editor. See links above to
+ set the proper values.</li>
+ <li>Configurations can also be created through the java. An example of this can
+ be seen by looking at the org.eclipse.osee.ats.config.demo plugin. This plugin, and the
+ DemoDatabaseConfig.java class, shows how to programatically generate work flows, pages,
+ rules and widgets to configure ATS. This configuration will be generated during a database
+ initialization.</li>
+ </ul>
+</body>
+</html>
diff --git a/org.eclipse.osee.ats/reference/configure/WorkflowConfigurationEditor.html b/org.eclipse.osee.ats/reference/configure/WorkflowConfigurationEditor.html
new file mode 100644
index 00000000000..07040cdeca8
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/WorkflowConfigurationEditor.html
@@ -0,0 +1,74 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Workflow Configuration Editor</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Workflow Configuration Editor</h1>
+ <br/>
+ <img border="1" src="configEditor.jpg"/>
+ <h2>Purpose</h2>
+ Give a graphical method to creating / updating ATS Workflow Configurations. This editor
+ also gives easy access, through double-click" to edit the "Work Page Definition" artifact
+ that represent the selected state.
+ <h2>How to do it</h2>
+ <ul>
+ <li>Open editor for a specific workflow:</li>
+ <ul>
+ <li>Existing Work Flow Definition Artifact: From Common branch in Artifact Explorer, expand Action Tracking System -> Work Flows
+ and double-click the workflow you wish to edit.</li>
+ <li>From ATS Workflow Editor: Select workflow icon at top right and associated workflow
+ will be opened.</li>
+ <li>New Workflow Configuration: File -> New -> Other -> OSEE ATS -> Workflow Configuration;
+ Enter unique namespace for this workflow configuration. (eg: org.<company>.code). This
+ creates a simple workflow to use as a starting place.</li>
+ </ul>
+
+ <li>Create states:</li>
+ <ul>
+ <li>Add necessary states to diagram to represent workflow. Note: Only one state
+ is the entry point and the workflow must end at the "Completed" state. The "Cancelled"
+ state is optional, but should be used in most cases.</li>
+ </ul>
+
+ <li>Editing Rules, Widgets and other State attributes: Double-click on any state to open
+ the Artifact in the Artifact Editor.</li>
+
+ <li>Create transitions:</li>
+ <ul>
+ <li>For each state, a single "Default Transition" must be specified. This will
+ be the default state specified as the "next" state in the workflow. Optional transitions
+ to other states can be specified by the "Transition" arrow. The user will have the
+ option of selecting one of these states instead.</li>
+ <li>The "Return Transition" can be specified for valid jumps "back" to previous states.
+ (eg: The user may need to transition back to the "Analyze" state from the "Authorize"
+ state if authorization failed and more analysis is needed.</li>
+ </ul>
+ <li>Select a single state and set it's "Start Page" property to "Yes" for the state
+ specified to start the workflow. Only one state can be the start state.</li>
+ <li>Save and test the new workflow configuration:</li>
+ <ul>
+ <li>Select Save to persist the changes. Validation will be automatically run (see below)</li>
+ <li><a href="TeamDefinition.html">Configure the Team Definition</a> to use the new workflow</li>
+ <li>Create a new Action and test the created workflow</li>
+ </ul>
+ <li>
+ </ul>
+ <h2>Workflow Configuration - Validation</h2>
+ Validation of a workflow is provided by selecting the check icon and selecting a state,
+ transition or the entire workflow (selecting the white background). This will popup
+ whatever error occurs or a "Validation Success" if all is ok.<br><br>
+ Note: This same validation will occur during save and will fail if all problems are not resolved.
+ <br>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/configure/configEditor.JPG b/org.eclipse.osee.ats/reference/configure/configEditor.JPG
new file mode 100644
index 00000000000..1e9b2b2335c
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/configEditor.JPG
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/configure/configure_ats_for_help.html b/org.eclipse.osee.ats/reference/configure/configure_ats_for_help.html
new file mode 100644
index 00000000000..9354ec9930c
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/configure_ats_for_help.html
@@ -0,0 +1,39 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Configure ATS for Help</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+<body>
+ <h1>Configure ATS for Help</h1>
+ <h2>Purpose</h2>
+ To configure ATS workflows to use the integrated help system. ATS help useds a combination of widget
+ tooltip, static help pages and dynamic help content configured through extended plugins.
+ <h2>How to do it</h2>
+ <ul>
+ <li>Workflow Page Help</li>
+ <li>Workflow Widget Help</li>
+ <ul>
+ <li>Declared tooltip is shown as tooltip when hover over label</li>
+ <li>Double-Click label pops open html dialog if help contextId and pluginId are set</li>
+ <li>Double-Click label pops open tooltip</li>
+ <li>Top down order of obtaining help content</li>
+ <ul>
+ <li>Setting tooltip in IStateItem interface</li>
+ <li>Work Widget Definitions in Work Data attribute value of XWidget=...tooltip="put help here"</li>
+ <li>ATSAttributes.java declarations</li>
+ </ul>
+ </ul>
+ </ul>
+</body>
+</html>
+
diff --git a/org.eclipse.osee.ats/reference/configure/configure_ats_for_tracking.html b/org.eclipse.osee.ats/reference/configure/configure_ats_for_tracking.html
new file mode 100644
index 00000000000..a457d34c449
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/configure_ats_for_tracking.html
@@ -0,0 +1,136 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+<head>
+<title>Configure ATS for Change Tracking</title>
+<LINK rel="stylesheet" type="text/css"
+ href="../../osee.help/html/style.css">
+</head>
+
+<body>
+<h1>Configure ATS for Change Tracking</h1>
+<h2>Purpose</h2>
+ATS is used to track any type of change throughout the lifecycle of a
+project. Below are the steps to configure ATS for tracking something
+new.
+<h2>How to do it</h2>
+<ul>
+ <li>Review <a href="../overview/ats_overview.html">ATS
+ Overview</a> to understand ATS Concepts, Terms and Architecture. Pay
+ special attention to ATS Terms</li>
+ <li>Determine what Actionable Items (AIs) need to be available to
+ the user to select from. This can be anything from a single AI for
+ tracking something like a tool or even an activity that needs to be
+ done to a hierarchical decomposition of an entire software product or
+ engineering program.</li>
+ <ul>
+ <li>Considerations:</li>
+ <ul>
+ <li>Item should be in the context of what the user would
+ recognize. eg: OSEE ATS World View versus something unknown to the
+ user such as AtsWorldView.java.</li>
+ <li>Decompose AI into children AI when it is desired to
+ sort/filter/report by that decomposition.</li>
+ </ul>
+ <li>Actionable Item attributes to be configured:</li>
+ <ul>
+ <li>Name: Unique name that the user would identify with.</li>
+ <li>Active: yes (converted to "no" when AI is no longer
+ actionable)</li>
+ </ul>
+ <li>Actionable Item relations to be configured:</li>
+ <ul>
+ <li>TeamActionableItem: relate to Team Definition that is
+ responsible for performing the tasks associated with this AI. NOTE:
+ If this relation is not set, ATS will walk up the Default Hierarchy
+ to find the first AI with this relation.</li>
+ </ul>
+ </ul>
+ <li>Determine the teams that are going to perform the tasks that
+ are associated with the AIs selected by the user.</li>
+ <ul>
+ <li>Considerations:</li>
+ <ul>
+ <li>Use separate teams if certain changes are to be managed by
+ different leads.</li>
+ <li>Use separate teams if one team's completion and releasing is
+ independent of another's.</li>
+ <li>Use separate teams if team members are separate.</li>
+ <li>Use separate teams if different workflows are required for
+ one set of AIs than another.</li>
+ </ul>
+ <li>Team attributes to be configured:</li>
+ <ul>
+ <li>Name: Unique team name that is distinguishable from other
+ teams in a list.</li>
+ <li>Description: Full description of the team and it's scope.</li>
+ <li>Active: yes (converted to "no" when AI is no longer
+ actionable)</li>
+ <li>Team Uses Versions: yes if team workflows are going to use
+ the build management and release capabilities of ATS.</li>
+ <li>Full Nam: Extended name for the team. Expansion of acronym
+ if applicable</li>
+ </ul>
+ <li>Team relations to be configured:</li>
+ <ul>
+ <li>TeamActionableItem: relation to all AIs that this team is
+ responsible for.</li>
+ <li>Work Item.Child: WorkFlowDefinition artifact
+ configures the state machine that
+ this team works under. NOTE: If this relation is not set, ATS will
+ walk up the Default Hierarchy to find the first AI with this
+ relation.</li>
+ <li>TeamLead: User(s) that are leading this team. These users
+ will be assigned to the Endorse state of the Team Workflow upon
+ creation of an Action by a user. Providing multiple leads reduces
+ bottlenecks. First lead to handle the Team Workflow wins.</li>
+ <li>TeamMember: User(s) that are members of the team. These
+ users will be shown first as preferred assignees and have the ability
+ to privileged edit a Team Workflow for the team they belong to.</li>
+ </ul>
+ </ul>
+ <li>Choose existing WorkFlowDefinition or create new WorkFlowDefinition
+ to be used by the team and relate it to Team Definition (as
+ above). This can be done through File->New->Workflow Configuration. Enter a namespace
+ and a default workflow will be created and can be edited.</li>
+ <li>Create version artifacts necessary (if using versions) and
+ relate them to Team Definition (as above)</li>
+ <ul>
+ <li>If branching of artifacts is going to be used (see below), configure versions
+ with their appropriate parent branch id.</li>
+ </ul>
+ <li>Determine if Branching within one of the states in the workflow is desired/required
+ and configure as appropriate.</li>
+ <ul>
+ <li>Considerations:</li>
+ <ul>
+ <li>Branching is necessary if objects to change are stored in OSEE as artifacts.
+ If so, OSEE ATS can create a working branch off the parent branch, allow user
+ to modify artifacts and then commit these changes when complete, reviewed and
+ authorized (as necessary). If objects are stored outside OSEE (eg. code files
+ checked into SVN), this option is not necessary.</li>
+ </ul>
+ <li>Configure ATS workflow for branching:</li>
+ <ul>
+ <li>Create AtsStateItem extension specifying which state the branching will occur.
+ This is normally in the Implement state of a workflow.</li>
+ <li>Create root branch and import documents that will be managed through define
+ and tracked through ATS.</li>
+ <li>Set all Version artifacts "Parent Branch Id" attribute to the branch id
+ of the root branch (or child branches, if using multi-branching)</li>
+ <li>If only a single branch is to be used OR versioning is NOT configured to be
+ used, the "Parent Branch Id" should be s</li>
+ </ul>
+ </ul>
+
+</ul>
+</body>
+</html>
+
diff --git a/org.eclipse.osee.ats/reference/configure/contexts.xml b/org.eclipse.osee.ats/reference/configure/contexts.xml
new file mode 100644
index 00000000000..4c1ece5f452
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/configure/contexts.xml
@@ -0,0 +1,11 @@
+<contexts>
+ <context id="atsConfigureWorkflow">
+ <description>Configure Workflow for use by Team Definition.</description>
+ <topic href="reference/configure/WorkflowConfigurationEditor.html" label="Workflow Configuration Editor"/>
+ <topic href="reference/configure/WorkflowConfiguration.html" label="Workflow Configuration"/>
+ <topic href="reference/configure/WorkFlowDefinition.html" label="Work Flow Definition"/>
+ <topic href="reference/configure/WorkPageDefinition.html" label="Work Page Definition"/>
+ <topic href="reference/configure/WorkWidgetDefinition.html" label="Work Widget Definition"/>
+ <topic href="reference/configure/WorkRuleDefinition.html" label="Work Rule Definition"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.ats/reference/contexts.xml b/org.eclipse.osee.ats/reference/contexts.xml
new file mode 100644
index 00000000000..180d3da83b6
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/contexts.xml
@@ -0,0 +1,45 @@
+<contexts>
+ <context id="atsPriority" title="ATS Priorities">
+ <description>Priorities for classifying Actions in ATS.</description>
+ <topic href="reference/Priority.html" label="ATS Priorities"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+ <context id="atsReportABug" title="Report a Bug">
+ <description>Instructions on using the Bug icons for reporting OSEE bugs.</description>
+ <topic href="reference/report_a_bug.html" label="Reporting a bug in OSEE"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+ <context id="atsNavigator" title="Ats Navigator View">
+ <description>Perform ATS navigation capabilities.</description>
+ <topic href="reference/ats_navigator_view.html" label="Ats Navigator View"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+ <context id="atsActionView" title="Ats Action View">
+ <description>Show graphical representation of Action and it's children Team Workflows.</description>
+ <topic href="reference/ats_action_view.html" label="Ats Action View"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+ <context id="atsWorldView" title="Ats World View">
+ <description>Show loaded Action, Team Workflows, Tasks and Reviews.</description>
+ <topic href="reference/ats_world_view.html" label="Ats World View"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ <topic href="../osee.skynet.gui/reference/table_customization.html" label="Table Customization"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+ <context id="atsWorkflowEditorWorkflowTab" title="Ats Wovrkflow Editor - Workflow Tab">
+ <description>Shows states of workflow, alows entry in current state and provides services to perform actions, see metrics and research information about workflow.</description>
+ <topic href="reference/workflow_editor/ats_workflow_editor_workflow_tab.html" label="Ats Workflow Editor - Workflow Tab"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ <topic href="../osee.skynet.gui/reference/spell_check.html" label="Spell Checking"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+ <context id="atsWorkflowEditorTaskTab" title="Ats Wovrkflow Editor - Task Tab">
+ <description>Shows tasks associated with states of workflow. Allows quick editing of task information and allows a quick jump (double-click) to open task in ATS Workflow Editor.</description>
+ <topic href="reference/workflow_editor/ats_workflow_editor_task_tab.html" label="Ats Workflow Editor - Task Tab"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ <topic href="../osee.skynet.gui/reference/table_customization.html" label="Table Customization"/>
+ <topic href="reference/overview/ats_overview.html" label="ATS Overview"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.ats/reference/decision_review_workflow/contexts.xml b/org.eclipse.osee.ats/reference/decision_review_workflow/contexts.xml
new file mode 100644
index 00000000000..db3afa4453d
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/decision_review_workflow/contexts.xml
@@ -0,0 +1,8 @@
+<contexts>
+ <context id="decisionReview" title="Decision Review Workflow">
+ <description>Provides description of the Decision review.</description>
+ <topic href="reference/decision_review_workflow/decisionReview.html" label="Decision Review Workflow"/>
+ <topic href="reference/workflow_editor/ats_workflow_editor_workflow_tab.html" label="Ats Workflow Editor - Workflow Tab"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.JPG b/org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.JPG
new file mode 100644
index 00000000000..986d9d4633e
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.JPG
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.html b/org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.html
new file mode 100644
index 00000000000..c095dfa2887
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/decision_review_workflow/decisionReview.html
@@ -0,0 +1,66 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Decision Review Workflow</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Decision Review Workflow</h1>
+ <h2>Purpose</h2>
+ The Decision Review is a simple review that allows one or multiple users to review something
+ and answer a question. This review can be created, and thus attached, to any reviewable
+ state in ATS. In addition, it can be created automatically to perform simple "validation"
+ type reviews during a workflow.
+ <h2>State Machine</h2>
+ <img src="decisionReview.JPG"/>
+ <h2>How to do it</h2>
+ From any active state, select "Create a Decision Review" in the left column of the workflow editor.
+ This will create the review and attach it to the current state. Then, proceed to "Prepare State"
+ to entering the necessary information required for this review.
+
+
+ <h2>Prepare State</h2>
+ This state allows the user to create the decision review. Enter the required information and transition to
+ Decision to start the review. All transitioned to assignees will be required to perform the review.<br><br>
+ <table border="1">
+ <tr><th>Field</th><th>Description</th></tr>
+ <tr><td>Title</td><td>Enter the question that is to be answered by the reviewers. Example: Do you think we should buy this software?</td></tr>
+ <tr><td>Decision Review Options</td><td>Enter in all the options that are available for selection.<br>
+ Each line is a single decision option in the format: answer;state;&lt;userId&gt;<br><br>
+ Where<br>&nbsp;&nbsp;&nbsp;answer = Yes, No, Mabye, etc...<br>
+ &nbsp;&nbsp;&nbsp;state = Followup or Completed - this will be the state to transition to if the answer is choosen<br>
+ &nbsp;&nbsp;&nbsp;&lt;userId&gt; = userId of the user to assign to the state to transition to.
+ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note: Multiple users can be specified by &lt;userId1&gt;&lt;userId2&gt;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note:UserIds are only valid for Followup state. Completed state has no assignees.</td></tr>
+ <tr><td>Description</td><td>Information necessary to make an informed decision.</td></tr>
+ <tr><td>Blocking Review</td><td>yes if this review must be completed before the parent workflow can transition</td></tr>
+ <tr><td>Need By</td><td>Date the decision must be made.</td></tr>
+ </table>
+
+
+ <h2>Decision State</h2>
+ This state allows the user to review the description or materials and choose their decision.<br><br>
+ <table border="1">
+ <tr><th>Field</th><th>Description</th></tr>
+ <tr><td>Question</td><td>The question to be answered as part of this review.</td></tr>
+ <tr><td>Decision</td><td>The decision made by the user.</td></tr>
+ <tr><td>Resolution</td><td>Any notes or information as to why the decision was made.</td></tr>
+ </table>
+
+ <h2>Followup State</h2>
+ This state allows for followup action to be taken based on the decision.<br><br>
+ <table border="1">
+ <tr><td>Resolution</td><td>Any notes or information as to why the decision was made.</td></tr>
+ </table>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/newActionWizard/contexts.xml b/org.eclipse.osee.ats/reference/newActionWizard/contexts.xml
new file mode 100644
index 00000000000..72f37de7fcd
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/newActionWizard/contexts.xml
@@ -0,0 +1,17 @@
+<contexts>
+ <context id="new_action_wizard_page_1" title="New Action Wizard">
+ <description>Initiates a new Action. Specify the Title and Impacted Items.</description>
+ <topic label="Title" href="reference/newActionWizard/new_action_wizard_page_1.html#title"/>
+ <topic label="Select Impacted Items" href="reference/newActionWizard/new_action_wizard_page_1.html#impacted"/>
+ <topic label="Filter" href="reference/newActionWizard/new_action_wizard_page_1.html#filter"/>
+ </context>
+ <context id="new_action_wizard_page_2" title="New Action Wizard">
+ <description>Provides details for the new action.</description>
+ <topic label="Description" href="reference/newActionWizard/new_action_wizard_page_2.html#description"/>
+ <topic label="Change Type" href="reference/newActionWizard/new_action_wizard_page_2.html#type"/>
+ <topic label="Priority" href="reference/newActionWizard/new_action_wizard_page_2.html#priority"/>
+ <topic label="Deadline" href="reference/newActionWizard/new_action_wizard_page_2.html#deadline"/>
+ <topic label="Validation Required" href="reference/newActionWizard/new_action_wizard_page_2.html#validation"/>
+ <topic label="User Community" href="reference/newActionWizard/new_action_wizard_page_2.html#comunity"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_1.html b/org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_1.html
new file mode 100644
index 00000000000..453064fea71
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_1.html
@@ -0,0 +1,29 @@
+<html>
+
+ <head>
+ <title>ATS New Action Wizard</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS New Action Wizard</h1>
+ <br />
+
+ <A name="title">
+ <h2>Title</h2>
+ This text will be the title for the action being created. This is a required field.
+ <br /><br />
+
+ <A name="impacted">
+ <h2>Select Impacted Items</h2>
+ Expand the tree and pick the appropriate item or items associated with this action.
+ <br /><br />
+
+ <A name="filter">
+ <h2>Filter</h2>
+ Removes items from the Impacted Items tree which do not match the specified filter.
+ Clearing the filter will restore the complete list of items in the tree.
+ <br /><br />
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_2.html b/org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_2.html
new file mode 100644
index 00000000000..7f593952241
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/newActionWizard/new_action_wizard_page_2.html
@@ -0,0 +1,50 @@
+<html>
+
+ <head>
+ <title>ATS New Action Wizard</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS New Action Wizard</h1>
+ <br />
+
+ <A name="description">
+ <h2>Description</h2>
+ Enter the detailed description for the action.
+ <br /><br />
+
+ <A name="type">
+ <h2>Change Type</h2>
+ Choose the type of change for the action:
+ <ul>
+ <li>Improvement: This action is an improvement to an existing component or functionality, or new functionality for an existing system.
+ <li>Problem: This action describes a problem with existing functionality.
+ <li>Support: This action required user support, no product changes required.
+ </ul>
+ <br /><br />
+
+ <A name="priority">
+ <h2>Priority</h2>
+ Choose the significance of the action. See this <A Href="../Priority.html">table</a>
+ for a description of various priority levels.
+ <br /><br />
+
+ <A name="deadline">
+ <h2>Deadline</h2>
+ Pick a date when this action should be resolved.
+ <br /><br />
+
+ <A name="validation">
+ <h2>Validation Required</h2>
+ Select this checkbox if the action requires validation once it is resolved.
+ <br /><br />
+
+ <A name="community">
+ <h2>User Community</h2>
+ Choose the group or groups affected by this action. Use the ctrl or shift keys
+ to select multiple items.
+ <br /><br />
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/overview/OSEE ATS Overview.pdf b/org.eclipse.osee.ats/reference/overview/OSEE ATS Overview.pdf
new file mode 100644
index 00000000000..b30a1c679c3
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/overview/OSEE ATS Overview.pdf
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/overview/README.txt b/org.eclipse.osee.ats/reference/overview/README.txt
new file mode 100644
index 00000000000..4d08ca8ed3c
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/overview/README.txt
@@ -0,0 +1,3 @@
+OSEE ATS Overview.pdf
+Generated using PDF Machine from
+osee.doc/admin/approach/demos/OSEE ATS Overview.ppt \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/overview/ats_overview.html b/org.eclipse.osee.ats/reference/overview/ats_overview.html
new file mode 100644
index 00000000000..3785f02d99f
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/overview/ats_overview.html
@@ -0,0 +1,27 @@
+<html>
+
+<head>
+<title>ATS Overview</title>
+<LINK rel="stylesheet" type="text/css"
+ href="../../osee.help/html/style.css">
+</head>
+
+<body>
+<h1>ATS Overview</h1>
+<h2>Purpose</h2>
+To give a brief overview of the Action Tracking System (ATS) including
+terms and architecture.
+<h2>Powerpoint Overview</h2>
+<a href="OSEE ATS Overview.pdf">Select to View Overview</a>
+<br><br>
+<h2>Terms</h2>
+<b><a href="../configure/ActionableItems.html">Actionable Item (AI)</a></b> - Item that can be impacted by an Action. AIs are what the user has to select from when creating an Action. Examples: Flight Box, Lab Computer, Code Subsystem.<br><br>
+<b><a href="../configure/TeamDefinition.html">Team Workflow Definition</a></b> - Teams are created to perform that work associated with the Action. They are related to the AIs that they are responsible for and are configured with Leads and Members to route the Actions and perform the work. A workflow is configured that the team will follow to perform the work.<br><br>
+<b><a href="../configure/WorkflowConfiguration.html">Workflow Configuration</a></b> - State machine that shows the path the Team will follow to perform the work associated with the Action.<br><br>
+<b>Action</b> - Top level grouping object. An Action is written against any number of AIs. The Team Workflows are then created for each team configured to perform work for an AI.<br><br>
+<b>Team Workflow</b> - Instantiation of a Workflow Diagram needed to perform the work. Each team independently moves through their workflow state machine however ATS can be configured such that certain gates must be met from other Teams or outside events before a workflow can continue.<br><br>
+<b>Task</b> - Within states of a Team Workflow, smaller-light-weight Tasks can be created to further separate the work that needs to be completed for that state. Normally, the state can not continue until the Task is completed.<br><br>
+<b>Versions</b> - ATS has built in project/release planning. Versions are created to group Team Workflows (Actions) into Builds and Releases.<br><br>
+</body>
+</html>
+
diff --git a/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/contexts.xml b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/contexts.xml
new file mode 100644
index 00000000000..1164a0c4f18
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/contexts.xml
@@ -0,0 +1,8 @@
+<contexts>
+ <context id="peerToPeerReview" title="Peer To Peer Review Workflow">
+ <description>Provides description of the Peer to Peer review.</description>
+ <topic href="reference/peer_to_peer_review_workflow/peerToPeerReview.html" label="Peer To Peer Review Workflow"/>
+ <topic href="reference/workflow_editor/ats_workflow_editor_workflow_tab.html" label="Ats Workflow Editor - Workflow Tab"/>
+ <topic href="reference/ats_icons.html" label="Ats Icons"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReview.html b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReview.html
new file mode 100644
index 00000000000..93a9e780185
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReview.html
@@ -0,0 +1,66 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Peer To Peer Review Workflow</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Peer To Peer Review Workflow</h1>
+ <h2>Purpose</h2>
+ The Peer To Peer Review is a lightweight review type that enables interactive one-on-one reviews where two people sit
+ at a single computer and review, disposition and resolve the issues as they are found. This review type does not
+ require (but does allow) defects to be logged. This review type can be created as a stand-alone review or attached to
+ any workflow. When attached to a workflow, it is related to a state and can be set as a "blocking" review that will
+ keep the workflow from continuing until the review is completed.
+ <img src="peerToPeerReviewEditor.JPG"/>
+ <h2>State Machine</h2>
+ <img src="peerToPeerReviewStateMachine.JPG"/>
+ <h2>How to do it</h2>
+ <b>Stand-Alone Peer To Peer Review</b> - From ATS Navigator, filter on "peer" and select "New Peer To Peer Review". Enter
+ required fields and select transition to start the review.
+ <br><br>
+ <b>Workflow Related Peer To Peer Review</b> - From any ATS workflow editor, select
+ "Create a Peer To Peer Review" in the left column of the workflow editor.
+ This will create the review and attach it to the current state. Enter
+ required fields and select transition to start the review.
+
+
+ <h2>Prepare State</h2>
+ This state allows the user to create the peer to peer review. Enter the required information and transition to
+ Review to start the review. All review participants will be automatically assigned to the review state upon
+ transition.<br><br>
+ <table border="1">
+ <tr><th>Field</th><th>Description</th></tr>
+ <tr><td>Title</td><td>Enter a descriptive title for this review.</td></tr>
+ <tr><td>Review Roles</td><td>Add roles and select the appropriate user. This review type requires at least one Author and one Reviewer.<br>
+ <tr><td>Location of review materials</td><td>Either enter in a description of review materials or simply drag in files from workspace to
+ be reviewed. If files are dropped in this box, the java package name (if appropriate), filename and a space to enter in the
+ repository version will be provided.</td></tr>
+ <tr><td>Description</td><td>Information necessary to make an informed decision.</td></tr>
+ <tr><td>Blocking Review</td><td>if NOT a stand-alone review, this field will be enabled for entry.
+ select yes if this review must be completed before the parent workflow can transition</td></tr>
+ <tr><td>Need By</td><td>Date the review should be completed.</td></tr>
+ </table>
+
+
+ <h2>Review State</h2>
+ This state allows the users to review the materials, log any defects and allows for the author to resolve and close any defects.<br><br>
+ <table border="1">
+ <tr><th>Field</th><th>Description</th></tr>
+ <tr><td>Review Roles</td><td>Add or remove participants as needed. See Prepare State description for more information.</td></tr>
+ <tr><td>Review Defect</td><td>Defects are not REQUIRED, but can be entered. Defects must be dispositioned and closed before
+ review can be completed</td></tr>
+ <tr><td>Resolution</td><td>Any notes or further information can be entered here.</td></tr>
+ </table>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewEditor.JPG b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewEditor.JPG
new file mode 100644
index 00000000000..2839752c0ff
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewEditor.JPG
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewStateMachine.JPG b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewStateMachine.JPG
new file mode 100644
index 00000000000..414c3f56b3e
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/peer_to_peer_review_workflow/peerToPeerReviewStateMachine.JPG
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/report_a_bug.html b/org.eclipse.osee.ats/reference/report_a_bug.html
new file mode 100644
index 00000000000..b6dc6f1abf9
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/report_a_bug.html
@@ -0,0 +1,25 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Report a Bug</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Report a Bug</h1>
+ <h2>Purpose</h2>
+ A quick way to report a bug against a view or editor.
+ <h2>How to do it</h2>
+ Select the bug button (<img src="../images/bug.gif"/>) from the toolbar at the top
+ of the view or editor that has the problem. A wizard will come up to provide guidance
+ through the rest of the steps.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/toc.xml b/org.eclipse.osee.ats/reference/toc.xml
new file mode 100644
index 00000000000..dc48f159435
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/toc.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+<toc label="OSEE Action Tracking System (ATS)">
+ <topic label="ATS Overview" href="reference/overview/ats_overview.html" />
+ <topic label="ATS Icons" href="reference/ats_icons.html" />
+ <topic label="ATS Priorities" href="reference/Priority.html" />
+ <topic label="Reporting a Bug" href="reference/report_a_bug.html" />
+ <topic label="ATS Workflow Editor">
+ <topic label="Workflow Editor"
+ href="reference/workflow_editor/ats_workflow_editor.html" />
+ <topic label="Workflow Editor - Workflow Tab"
+ href="reference/workflow_editor/ats_workflow_editor_workflow_tab.html" />
+ <topic label="Workflow Editor - Task Tab"
+ href="reference/workflow_editor/ats_workflow_editor_task_tab.html" />
+ <topic label="Spell Checking"
+ href="PLUGINS_ROOT/org.eclipse.osee.framework.ui.skynet/reference/spell_check.html" />
+ </topic>
+ <topic label="ATS Views">
+ <topic label="Navigator View"
+ href="reference/ats_navigator_view.html" />
+ <topic label="Action View"
+ href="reference/ats_action_view.html" />
+ <topic label="World View" href="reference/ats_world_view.html" />
+ <topic label="Result View"
+ href="PLUGINS_ROOT/org.eclipse.osee.framework.ui.skynet/reference/result_view.html" />
+ </topic>
+ <topic label="ATS Reviews">
+ <topic label="Peer To Peer Review"
+ href="reference/peer_to_peer_review_workflow/peerToPeerReview.html" />
+ <topic label="Decision Review"
+ href="reference/decision_review_workflow/decisionReview.html" />
+ </topic>
+ <topic label="ATS Configuration">
+ <topic href="reference/configure/configure_ats_for_tracking.html" label="Configure ATS for Change Tracking">
+ </topic>
+ <topic href="reference/configure/TeamDefinition.html" label="Create New Team Definition">
+ </topic>
+ <topic href="reference/configure/ActionableItems.html" label="Create New Actionable Item(s)">
+ </topic>
+ <topic href="reference/configure/WorkflowConfiguration.html" label="Create Workflow Configuration">
+ <topic href="reference/configure/WorkflowConfigurationEditor.html" label="Workflow Configuration Editor">
+ </topic>
+ <topic href="reference/configure/WorkFlowDefinition.html" label="Work Flow Definition">
+ </topic>
+ <topic href="reference/configure/WorkPageDefinition.html" label="Work Page Definition">
+ </topic>
+ <topic href="reference/configure/WorkWidgetDefinition.html" label="Work Widget Definition">
+ </topic>
+ <topic href="reference/configure/WorkRuleDefinition.html" label="Work Rule Definition">
+ </topic>
+ </topic>
+ <topic href="reference/configure/configure_ats_for_help.html" label="Configure ATS for Help">
+ </topic>
+ </topic>
+ <link toc="PLUGINS_ROOT/org.eclipse.osee.framework.ui.skynet/reference/skynet_toc.xml"/>
+</toc>
diff --git a/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor.html b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor.html
new file mode 100644
index 00000000000..389d15fd181
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor.html
@@ -0,0 +1,32 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Workflow Editor</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Workflow Editor</h1>
+ <br/>
+ <img src="ats_workflow_editor_workflow_tab.jpg"/>
+ <h2>Purpose</h2>
+ Show and edit the workflows configured for use in ATS including Team Workflows, Tasks and Reviews.
+ <h2>How to do it</h2>
+ Double-click open any Action or Team Workflow from ATS World, Search results or ATS Results.
+ The editor will be opened allowing view and edit of workflow.
+ <h2><A href="ats_workflow_editor_workflow_tab.html">Workflow Tab</A></h2>
+ Shows states of workflow, alows entry in current state and provides services to perform actions,
+ see metrics and research information about workflow.
+ <h2><A href="ats_workflow_editor_task_tab.html">Task Tab</A></h2>
+ Shows tasks associated with states of workflow. Allows quick editing of task information and
+ allows a quick jump (double-click) to open task in ATS Workflow Editor.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.html b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.html
new file mode 100644
index 00000000000..87153c1c5c9
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.html
@@ -0,0 +1,41 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Workflow Editor - Task Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Workflow Editor - Task Tab</h1>
+ <br/>
+ <img src="ats_workflow_editor_task_tab.jpg"/>
+ <h2>Purpose</h2>
+ Shows tasks associated with states of workflow. Allows quick editing of task information and
+ allows a quick jump (double-click) to open task in ATS Workflow Editor.
+ <h2>How to do it</h2>
+ Select task tab after ATS object is opened in the ATS Editor.
+ <h2>Open Task</h2>
+ Double-click on any task to open in ATS Editor.
+ <h2>Right-click edit</h2>
+ Selecting one or more tasks and right-click produces a menu with selections for editing
+ multiple tasks at a single time.
+ <h2>Alt-Left-Click edit</h2>
+ A quick way to edit a single field in a task is by holding the Alt key down and selecting
+ the cell to edit. This pops up an editor associated with the type of cell selected.
+ <br>
+ <h2>Actions</h2>
+ Select <img src="../../images/currentState.gif"/> to only show tasks related to the current state of the workflow.<br/>
+ Select <img src="../../images/newTask.gif"/> to create a new task.<br/>
+ Select <img src="../../images/redRemove.gif"/> to delete selected task.<br/>
+ Select <img src="../../images/refresh.gif"/> to refresh the current task list.<br/>
+ Select <img src="../../../osee.skynet.gui/images/customize.gif"/> to <A href="../../../osee.skynet.gui/reference/table_customization.html"/>Customize Table</A>.<br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.jpg b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.jpg
new file mode 100644
index 00000000000..42937dcf17d
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_task_tab.jpg
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.html b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.html
new file mode 100644
index 00000000000..558e1d56843
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.html
@@ -0,0 +1,37 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Workflow Editor - Workflow Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Workflow Editor - Workflow Tab</h1>
+ <br/>
+ <img src="ats_workflow_editor_workflow_tab.jpg"/>
+ <h2>Purpose</h2>
+ Shows states of workflow, alows entry in current state and provides services to perform actions,
+ see metrics and research information about workflow.
+ <h2>How to do it</h2>
+ Default tab shown when any ATS object is opened in the ATS Editor.
+ <h2>Current State</h2>
+ Shown in the top status bar and in the main window, the current state is the state of the workflow
+ state machine that is running for this ATS object. These workflows can be configured with 3 or 30
+ state depending on the needs of the program/team that is using it.
+ <A href="current_state.html">More</A>
+ <h2>Other States</h2>
+ Shows states of workflow, alows entry in current state and provides services to perform actions,
+ see metrics and research information about workflow.
+ <h2>Services</h2>
+ Shows tasks associated with states of workflow. Allows quick editing of task information and
+ allows a quick jump (double-click) to open task in ATS Workflow Editor.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.jpg b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.jpg
new file mode 100644
index 00000000000..05ea2c1b27c
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/workflow_editor/ats_workflow_editor_workflow_tab.jpg
Binary files differ
diff --git a/org.eclipse.osee.ats/reference/workflow_editor/current_state.html b/org.eclipse.osee.ats/reference/workflow_editor/current_state.html
new file mode 100644
index 00000000000..1bae0ebd5d1
--- /dev/null
+++ b/org.eclipse.osee.ats/reference/workflow_editor/current_state.html
@@ -0,0 +1,44 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Workflow Editor - Current State</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>ATS Workflow Editor - Current State</h1>
+ <br/>
+ <img src="ats_workflow_editor_workflow_tab.jpg"/>
+ <h2>Purpose</h2>
+ Shows current state information and allows edit to those users that are authorized for edit.
+ <h2>Assignees</h2>
+ Selecting Assignees at the top of the current state allows the current assignee to add/remove
+ the assignees that are allowed to make changes to the current state. Any number of users can
+ be selected.
+ <h2>Data Entry</h2>
+ The state has certain fields that are requested/need to be entered. Red labels denotes a field
+ that is requried for transition for to the next state. A black label denotes a field that is
+ optional for transition to the next state.
+ <h2>Services</h2>
+ On the left resides a list of services that either provide information and/or allow for the entry
+ of information for the givent ATS objects. If the service is black text, there is no ability
+ to edit the information. If the service is blue with underlined (hyperlinked), then the data
+ can be edited through seleciton of the service.
+ <h2>Transition</h2>
+ Select the state to transition to (default is already selected), and choose the assingees
+ that should perform the next state (default is already selected). No data is lost when
+ transitioning to a previous state.
+ <h2>Assignees</h2>
+ If assigned to a state, the Assignees label is hyperlinked in the current state and allows
+ for adding/removing assignees. Any number of users can be assigned to any in-work state.
+ Removing the current user and adding a different user re-assigns the object to that user.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ats/schema/AtsAIandTeamConfig.exsd b/org.eclipse.osee.ats/schema/AtsAIandTeamConfig.exsd
new file mode 100644
index 00000000000..66aa5e1e408
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsAIandTeamConfig.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsAIandTeamConfig" name="AtsAIandTeamConfig"/>
+ </appInfo>
+ <documentation>
+ Allows graphical configuration of teams and actionable items that will be imported into the DB upon database initialization. This is a one-time shot import and does NOT provide for the capability to update and re-import. All configuration after the first database wipe should be done through OSEE&apos;s artifact editors and explorers.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AtsAIandTeamConfig"/>
+ </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="AtsAIandTeamConfig">
+ <complexType>
+ <attribute name="vueFilename" 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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ats/schema/AtsNavigateItem.exsd b/org.eclipse.osee.ats/schema/AtsNavigateItem.exsd
new file mode 100644
index 00000000000..77330b762b4
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsNavigateItem.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsNavigateItem" name="AtsNavigateItem"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AtsNavigateItem"/>
+ </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="AtsNavigateItem">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ats.navigate.IAtsNavigateItem"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ats/schema/AtsNotification.exsd b/org.eclipse.osee.ats/schema/AtsNotification.exsd
new file mode 100644
index 00000000000..6529e8f8ae9
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsNotification.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsNotifications" name="AtsNotifications"/>
+ </appinfo>
+ <documentation>
+ This extension point should be used when a plugin wants to notify users of certain events on a periodic basis.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AtsNotification"/>
+ </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="AtsNotification">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ats.util.IAtsNotifications"/>
+ </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.ats/schema/AtsStateItem.exsd b/org.eclipse.osee.ats/schema/AtsStateItem.exsd
new file mode 100644
index 00000000000..5a1f3d90806
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsStateItem.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsStateItem" name="AtsStateItem"/>
+ </appInfo>
+ <documentation>
+ Allows plugins to manipulate and get events from the different states and widgets that are created as part of any ATS workflow. It also provides for confirmation that transition is valid and certain fuctions regarding branchs.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AtsStateItem"/>
+ </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="AtsStateItem">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ats.editor.IAtsStateItem"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ats/schema/AtsTeamWorkflow.exsd b/org.eclipse.osee.ats/schema/AtsTeamWorkflow.exsd
new file mode 100644
index 00000000000..71df02d300d
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsTeamWorkflow.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsTeamWorflow" name="AtsTeamWorflow"/>
+ </appInfo>
+ <documentation>
+ This extension point should be used when a plugin wants to configure ATS to use a class that is an extension off TeamWorkflowArtifact class. These methods will provide the capability necessary for ATS to manage the new extensions.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AtsTeamWorkflow"/>
+ </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="AtsTeamWorkflow">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":osee.ats.actions.wizard.IAtsTeamWorkflowCreation"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ats/schema/AtsWizardItem.exsd b/org.eclipse.osee.ats/schema/AtsWizardItem.exsd
new file mode 100644
index 00000000000..9951168790f
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsWizardItem.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsWizardItem" name="AtsWizardItem"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AtsWizardItem"/>
+ </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="AtsWizardItem">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+ Provides the capability for the extension of the ATS New Action wizard. This allows for non-generic fields to be displayed and required. It also provides for the callbacks necessary to ensure that the data is entered properly AND the data gets stored upon wizard completion.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ats.actions.wizard.IAtsWizardItem"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ats/schema/AtsWorldEditorItem.exsd b/org.eclipse.osee.ats/schema/AtsWorldEditorItem.exsd
new file mode 100644
index 00000000000..5592f8c70d9
--- /dev/null
+++ b/org.eclipse.osee.ats/schema/AtsWorldEditorItem.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ats" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.ats" id="AtsWorldEditorItem" name="AtsWorldEditorItem"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="AtsWorldEditorItem"/>
+ </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="AtsWorldEditorItem">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ats.world.IAtsWorldEditorItem"/>
+ </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.ats/src/org/eclipse/osee/ats/ATSPerspective.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/ATSPerspective.java
new file mode 100644
index 00000000000..5f15981d671
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/ATSPerspective.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.ats;
+
+import org.eclipse.osee.ats.hyper.ActionHyperView;
+import org.eclipse.osee.ats.hyper.ArtifactHyperView;
+import org.eclipse.osee.ats.navigate.NavigateView;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.group.GroupExplorer;
+import org.eclipse.osee.framework.ui.skynet.search.QuickSearchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+public class ATSPerspective implements IPerspectiveFactory {
+
+ public ATSPerspective() {
+ super();
+ }
+
+ public void createInitialLayout(IPageLayout layout) {
+ defineActions(layout);
+ defineLayout(layout);
+ }
+
+ public void defineActions(IPageLayout layout) {
+
+ // Add "show views".
+ layout.addShowViewShortcut(NavigateView.VIEW_ID);
+ layout.addShowViewShortcut(ActionHyperView.VIEW_ID);
+ // layout.addShowViewShortcut(ActionSkyWalker.VIEW_ID);
+
+ layout.addShowViewShortcut(ArtifactHyperView.VIEW_ID);
+ layout.addShowViewShortcut(ArtifactExplorer.VIEW_ID);
+ layout.addShowViewShortcut(BranchView.VIEW_ID);
+ layout.addShowViewShortcut(GroupExplorer.VIEW_ID);
+ layout.addShowViewShortcut(QuickSearchView.VIEW_ID);
+ layout.addShowViewShortcut("osee.admin.AdminView");
+ layout.addShowViewShortcut("org.eclipse.pde.runtime.LogView");
+ layout.addShowViewShortcut("org.eclipse.ui.views.PropertySheet");
+
+ }
+
+ 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(NavigateView.VIEW_ID);
+ left.addView(GroupExplorer.VIEW_ID);
+ left.addView(ArtifactExplorer.VIEW_ID);
+ left.addView(BranchView.VIEW_ID);
+
+ if (AtsPlugin.isAtsAdmin()) {
+ IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT, (float) 0.80, editorArea);
+ right.addView("org.eclipse.pde.runtime.LogView");
+ }
+
+ IFolderLayout botLeft = layout.createFolder("bottomLeft", IPageLayout.BOTTOM, (float) 0.60, NavigateView.VIEW_ID);
+ // botLeft.addView(ActionSkyWalker.VIEW_ID);
+ botLeft.addView(ActionHyperView.VIEW_ID);
+ botLeft.addView(QuickSearchView.VIEW_ID);
+
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/ActionDebug.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/ActionDebug.java
new file mode 100644
index 00000000000..2fe46ca05a5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/ActionDebug.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.ats;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionDebug extends org.eclipse.osee.framework.ui.plugin.util.Debug {
+
+ @Override
+ protected String getPluginName() {
+ return "AtsPlugin";
+ }
+
+ /**
+ * @param debugOn
+ * @param nameSpace
+ */
+ public ActionDebug(boolean debugOn, String nameSpace) {
+ super(debugOn, nameSpace);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsArtifactImageProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsArtifactImageProvider.java
new file mode 100644
index 00000000000..e20fc8cbf47
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsArtifactImageProvider.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * 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.ats;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage.Location;
+import org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AtsArtifactImageProvider extends ArtifactImageProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider#init()
+ */
+ @Override
+ public void init() throws OseeCoreException {
+ ImageManager.registerBaseImage(DecisionReviewArtifact.ARTIFACT_NAME, AtsImage.REVIEW);
+ ImageManager.registerBaseImage("Action", AtsImage.ACTION);
+ ImageManager.registerBaseImage("Version", FrameworkImage.VERSION);
+ ImageManager.registerBaseImage("Task", AtsImage.TASK);
+ ImageManager.registerBaseImage("Actionable Item", AtsImage.ACTIONABLE_ITEM);
+ ImageManager.registerBaseImage("Team Workflow", AtsImage.TEAM_WORKFLOW);
+ ImageManager.registerBaseImage("Team Definition", AtsImage.TEAM_DEFINITION);
+ ImageManager.registerBaseImage("PeerToPeer Review", AtsImage.REVIEW);
+
+ ImageManager.registerOverrideImageProvider(this, ArtifactTypeManager.getType(VersionArtifact.ARTIFACT_NAME));
+ ImageManager.registerOverrideImageProvider(this, ArtifactTypeManager.getType(TaskArtifact.ARTIFACT_NAME));
+ ImageManager.registerOverrideImageProvider(this,
+ ArtifactTypeManager.getType(PeerToPeerReviewArtifact.ARTIFACT_NAME));
+ ImageManager.registerOverrideImageProvider(this,
+ ArtifactTypeManager.getType(DecisionReviewArtifact.ARTIFACT_NAME));
+ for (String artName : TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames()) {
+ try {
+ ImageManager.registerOverrideImageProvider(this, ArtifactTypeManager.getType(artName));
+ } catch (OseeTypeDoesNotExist ex) {
+ OseeLog.log(AtsPlugin.class, Level.INFO, ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider#getImage(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public String setupImage(Artifact artifact) throws OseeCoreException {
+ if (artifact.isOfType(VersionArtifact.ARTIFACT_NAME)) {
+ if (artifact.getSoleAttributeValue("ats.Next Version", false)) {
+ return ImageManager.setupImage(artifact, AtsImage.NEXT, Location.BOT_RIGHT);
+ }
+ if (artifact.getSoleAttributeValue("ats.Released", false)) {
+ return ImageManager.setupImage(artifact, AtsImage.RELEASED, Location.TOP_RIGHT);
+ }
+ }
+
+ if (artifact instanceof StateMachineArtifact) {
+ StateMachineArtifact stateMachine = (StateMachineArtifact) artifact;
+ if (stateMachine.isSubscribed(UserManager.getUser())) {
+ // was 8,6
+ return ImageManager.setupImage(artifact, AtsImage.SUBSCRIBED_OVERLAY, Location.BOT_RIGHT);
+ }
+ if (stateMachine.isFavorite(UserManager.getUser())) {
+ // was 7,0
+ return ImageManager.setupImage(artifact, AtsImage.FAVORITE_OVERLAY, Location.TOP_RIGHT);
+ }
+ }
+
+ return super.setupImage(artifact);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsImage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsImage.java
new file mode 100644
index 00000000000..b673fd5b2f0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsImage.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * 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.ats;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum AtsImage implements OseeImage {
+ ACTION("action.gif"),
+ ACTIONABLE_ITEM("AI.gif"),
+ ART_VIEW("artView.gif"),
+ CENTER("center.gif"),
+ CHECK_BLUE("check.gif"),
+ CONECTION_16("connection_s16.gif"),
+ CONECTION_24("connection_s24.gif"),
+ COPY_TO_CLIPBOARD("copyToClipboard.gif"),
+ CUSTOMIZE("customize.gif"),
+ DOWN_TRIANGLE("downTriangle.gif"),
+ ELLIPSE_ICON("ellipse16.gif"),
+ FAVORITE("star.gif"),
+ FAVORITE_OVERLAY("favorite.gif"),
+ GLOBE("globe.gif"),
+ GLOBE_SELECT("globeSelect.gif"),
+ HOME("home.gif"),
+ MY_WORLD("MyWorld.gif"),
+ NEW_ACTION("newAction.gif"),
+ NEW_NOTE("newNote.gif"),
+ NEW_TASK("newTask.gif"),
+ NEXT("yellowN_8_8.gif"),
+ OPEN_BY_ID("openId.gif"),
+ OPEN_PARENT("openParent.gif"),
+ PIN_EDITOR("pinEditor.gif"),
+ PLAY_GREEN("play.gif"),
+ PRIVILEDGED_EDIT("privEdit.gif"),
+ PUBLISH("publish.gif"),
+ RELEASED("orangeR_8_8.gif"),
+ REPORT("report.gif"),
+ REVIEW("R.gif"),
+ ROLE("role.gif"),
+ SUBSCRIBED("subscribedEmail.gif"),
+ SUBSCRIBED_OVERLAY("subscribed.gif"),
+ TASK("task.gif"),
+ TASK_SELECTED("taskSelected.gif"),
+ TEAM_DEFINITION("team.gif"),
+ TEAM_WORKFLOW("workflow.gif"),
+ WORKFLOW_CONFIG("workflowConfig.gif"),
+ TOOL("tool.gif"),
+ T("T.gif"),
+ ZOOM("zoom_in.gif"),
+ ZOOM_IN("zoom_in.gif"),
+ ZOOM_OUT("zoom_in.gif");
+
+ private final String fileName;
+
+ private AtsImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#createImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(AtsPlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageKey()
+ */
+ @Override
+ public String getImageKey() {
+ return AtsPlugin.PLUGIN_ID + "." + fileName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsPlugin.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsPlugin.java
new file mode 100644
index 00000000000..be615ee896b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/AtsPlugin.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.ats;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.util.AtsBranchAccessHandler;
+import org.eclipse.osee.ats.util.AtsPreSaveCacheRemoteEventHandler;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.OseeGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsPlugin extends OseeUiActivator {
+ private static AtsPlugin pluginInstance;
+ public static ActionDebug debug = new ActionDebug(false, "AtsPlugin");
+ public static final String PLUGIN_ID = "org.eclipse.osee.ats";
+ private static boolean emailEnabled = true;
+ public static Color ACTIVE_COLOR = new Color(null, 206, 212, 241);
+ private static OseeGroup atsAdminGroup = null;
+
+ /**
+ * The constructor.
+ */
+ public AtsPlugin() {
+ super();
+ pluginInstance = this;
+ AtsBranchAccessHandler.getInstance();
+ AtsPreSaveCacheRemoteEventHandler.getInstance();
+ }
+
+ public static boolean isEmailEnabled() {
+ return emailEnabled;
+ }
+
+ public static void setEmailEnabled(boolean enabled) {
+ if (!SkynetDbInit.isDbInit()) System.out.println("Email " + (enabled ? "Enabled" : "Disabled"));
+ emailEnabled = enabled;
+ }
+
+ public static boolean isProductionDb() throws OseeCoreException {
+ return ClientSessionManager.isProductionDataStore();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.util.plugin.OseePlugin#getPluginName()
+ */
+ @Override
+ protected String getPluginName() {
+ return PLUGIN_ID;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static AtsPlugin getInstance() {
+ return pluginInstance;
+ }
+
+ public static boolean isAtsAdmin() {
+ try {
+ return getAtsAdminGroup().isCurrentUserMember();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return false;
+ }
+ }
+
+ public static OseeGroup getAtsAdminGroup() {
+ if (atsAdminGroup == null) {
+ atsAdminGroup = new OseeGroup("AtsAdmin");
+ }
+ return atsAdminGroup;
+ }
+
+ public static Branch getAtsBranch() throws OseeCoreException {
+ return BranchManager.getCommonBranch();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewAction.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewAction.java
new file mode 100644
index 00000000000..6ebb9a5cc5a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewAction.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.ats.actions;
+
+import java.util.Arrays;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.wizard.NewActionWizard;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewAction extends Action {
+
+ private final String actionableItem;
+ private String initialDescription;
+
+ public NewAction() {
+ this(null);
+ }
+
+ public NewAction(String actionableItem) {
+ super("Create New Action");
+ this.actionableItem = actionableItem;
+ setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.NEW_ACTION));
+ setToolTipText("Create New Action");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ super.run();
+ AtsBulkLoadCache.run(true);
+ NewActionWizard wizard = new NewActionWizard();
+ try {
+ if (actionableItem != null) {
+ wizard.setInitialAias(ActionableItemArtifact.getActionableItems(Arrays.asList(actionableItem)));
+ }
+ if (initialDescription != null) {
+ wizard.setInitialDescription(initialDescription);
+ }
+ WizardDialog dialog =
+ new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard);
+ dialog.create();
+ dialog.open();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * @return the initialDescription
+ */
+ public String getInitialDescription() {
+ return initialDescription;
+ }
+
+ /**
+ * @param initialDescription the initialDescription to set
+ */
+ public void setInitialDescription(String initialDescription) {
+ this.initialDescription = initialDescription;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewDecisionReviewJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewDecisionReviewJob.java
new file mode 100644
index 00000000000..b7b5a56e1a5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewDecisionReviewJob.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.ats.actions;
+
+import java.util.Collection;
+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.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.widgets.ReviewManager;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewDecisionReviewJob extends Job {
+ private final TeamWorkFlowArtifact teamParent;
+ private DecisionReviewArtifact decisionReviewArtifact;
+ private final ReviewBlockType reviewBlockType;
+ private final String reviewTitle;
+ private final String againstState;
+ private final String options;
+ private final Collection<User> assignees;
+ private final String description;
+
+ public NewDecisionReviewJob(TeamWorkFlowArtifact teamParent, ReviewBlockType reviewBlockType, String reviewTitle, String againstState, String description, String options, Collection<User> assignees) {
+ super("Creating New Decision Review");
+ this.teamParent = teamParent;
+ this.reviewTitle = reviewTitle;
+ this.againstState = againstState;
+ this.reviewBlockType = reviewBlockType;
+ this.description = description;
+ this.options = options;
+ this.assignees = assignees;
+ }
+
+ @Override
+ public IStatus run(final IProgressMonitor monitor) {
+ try {
+ decisionReviewArtifact =
+ ReviewManager.createNewDecisionReview(teamParent, reviewBlockType, reviewTitle, againstState,
+ description, options, assignees);
+ decisionReviewArtifact.persistAttributesAndRelations();
+ AtsLib.openAtsAction(decisionReviewArtifact, AtsOpenOption.OpenOneOrPopupSelect);
+ } catch (Exception ex) {
+ monitor.done();
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, "Error creating Decision Review", ex);
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewPeerToPeerReviewJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewPeerToPeerReviewJob.java
new file mode 100644
index 00000000000..05c9504b5b5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/NewPeerToPeerReviewJob.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.ats.actions;
+
+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.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewPeerToPeerReviewJob extends Job {
+
+ private final TeamWorkFlowArtifact teamParent;
+ private final String againstState;
+ private PeerToPeerReviewArtifact peerToPeerReviewArtifact;
+ private final String reviewTitle;
+
+ public NewPeerToPeerReviewJob(TeamWorkFlowArtifact teamParent, String reviewTitle, String againstState) {
+ super("Creating New PeerToPeer Review");
+ this.teamParent = teamParent;
+ this.againstState = againstState;
+ this.reviewTitle = reviewTitle;
+ }
+
+ @Override
+ public IStatus run(final IProgressMonitor monitor) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ peerToPeerReviewArtifact =
+ teamParent.getSmaMgr().getReviewManager().createNewPeerToPeerReview(reviewTitle, againstState,
+ transaction);
+ peerToPeerReviewArtifact.persistAttributesAndRelations(transaction);
+ transaction.execute();
+
+ AtsLib.openAtsAction(peerToPeerReviewArtifact, AtsOpenOption.OpenOneOrPopupSelect);
+ } catch (Exception ex) {
+ monitor.done();
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, "Error creating PeerToPeer Review", ex);
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ActionableItemFilter.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ActionableItemFilter.java
new file mode 100644
index 00000000000..9b0ff3e92ea
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ActionableItemFilter.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.ats.actions.wizard;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEEFilteredTree;
+
+public class ActionableItemFilter extends ViewerFilter {
+ private String contains = null;
+ private final OSEEFilteredTree treeViewer;
+
+ public ActionableItemFilter(OSEEFilteredTree treeViewer) {
+ this.treeViewer = treeViewer;
+ }
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (!isFiltering()) return true;
+ return checkItemAndChildren((ActionableItemArtifact) element);
+ }
+
+ private boolean checkItemAndChildren(ActionableItemArtifact item) {
+ try {
+ boolean show = item.getDescriptiveName().toLowerCase().contains(contains.toLowerCase());
+ if (show) return true;
+ for (Artifact child : item.getChildren()) {
+ show = checkItemAndChildren((ActionableItemArtifact) child);
+ if (show) return true;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ /**
+ * @param contains The contains to set.
+ */
+ public void setContains(String contains) {
+ this.contains = contains;
+ if (contains.equals(""))
+ treeViewer.getViewer().collapseAll();
+ else
+ treeViewer.getViewer().expandAll();
+ }
+
+ /**
+ * @return Returns the contains.
+ */
+ public String getContains() {
+ return contains;
+ }
+
+ public boolean isFiltering() {
+ return contains != null && contains.length() > 0;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizard.java
new file mode 100644
index 00000000000..2fca59f90e7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizard.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.ats.actions.wizard;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactSelectWizard extends Wizard {
+
+ private ArtifactSelectWizardPage wizardPage;
+
+ public ArtifactSelectWizard() {
+ }
+
+ public void addPages() {
+ wizardPage = new ArtifactSelectWizardPage();
+ addPage(wizardPage);
+ }
+
+ public boolean performFinish() {
+ return true;
+ }
+
+ @Override
+ public boolean canFinish() {
+ return wizardPage.isPageComplete();
+ }
+
+ public Artifact getSelectedArtifact() {
+ return wizardPage.getSelectedArtifact();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizardPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizardPage.java
new file mode 100644
index 00000000000..96c5ea5a62c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/ArtifactSelectWizardPage.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.actions.wizard;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+public class ArtifactSelectWizardPage extends WizardPage {
+
+ private ListViewer artTypeList;
+ private ListViewer artList;
+ private Artifact selectedArtifact;
+ private boolean showArtData = false;
+
+ public ArtifactSelectWizardPage() {
+ super("Select an Artifact");
+ }
+
+ public void createControl(Composite parent) {
+ setTitle("Select an Artifact");
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gl = new GridLayout();
+ gl.numColumns = 2;
+ composite.setLayout(gl);
+ GridData gd = new GridData(GridData.FILL, GridData.FILL, true, true);
+ composite.setLayoutData(gd);
+
+ Composite leftComp = new Composite(composite, SWT.NONE);
+
+ leftComp.setLayout(new GridLayout());
+ gd = new GridData(GridData.FILL, GridData.FILL, true, true);
+ leftComp.setLayoutData(gd);
+
+ (new Label(leftComp, SWT.NONE)).setText("Artifact Type");
+
+ try {
+ artTypeList = new ListViewer(leftComp, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
+ artTypeList.setContentProvider(new ArrayContentProvider());
+ artTypeList.setLabelProvider(new ArtTypeLabelProvider());
+
+ gd = new GridData(GridData.FILL, GridData.FILL, true, true);
+ gd.heightHint = 300;
+ gd.widthHint = 200;
+ artTypeList.getControl().setLayoutData(gd);
+ artTypeList.setInput(TypeValidityManager.getValidArtifactTypes(AtsPlugin.getAtsBranch()));
+ artTypeList.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ ArtifactType desc = (ArtifactType) selection.getFirstElement();
+ try {
+ artList.setInput(ArtifactQuery.getArtifactsFromType(desc, AtsPlugin.getAtsBranch()));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ artTypeList.setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((ArtifactType) e1).getName(), ((ArtifactType) e2).getName());
+ }
+ });
+
+ Composite rightComp = new Composite(composite, SWT.NONE);
+
+ rightComp.setLayout(new GridLayout());
+ gd = new GridData(GridData.FILL, GridData.FILL, true, true);
+ rightComp.setLayoutData(gd);
+
+ Label lab = new Label(rightComp, SWT.NONE);
+ lab.setText("Artifact (click here for artifact data)");
+ lab.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ lab.addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event event) {
+ showArtData = !showArtData;
+ artList.refresh();
+ }
+ });
+
+ artList = new ListViewer(rightComp, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
+ artList.setContentProvider(new ArrayContentProvider());
+ artList.setLabelProvider(new ArtifactDescriptiveLabelProvider());
+
+ artList.setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((Artifact) e1).getDescriptiveName(),
+ ((Artifact) e2).getDescriptiveName());
+ }
+ });
+ gd = new GridData(GridData.FILL, GridData.FILL, true, true);
+ gd.heightHint = 300;
+ gd.widthHint = 200;
+ artList.getControl().setLayoutData(gd);
+ artList.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ selectedArtifact = (Artifact) selection.getFirstElement();
+ }
+ });
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ setControl(composite);
+ }
+
+ public Artifact getSelectedArtifact() {
+ return selectedArtifact;
+ }
+
+ public class ArtifactDescriptiveLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ Artifact art = (Artifact) arg0;
+ if (showArtData)
+ return String.format("%s - (%s %s %s)", art.getDescriptiveName(), art.getArtId(),
+ art.getHumanReadableId(), art.getGuid());
+ else
+ return art.getDescriptiveName();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+ }
+
+ public class ArtTypeLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ return ((ArtifactType) arg0).getName();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsTeamWorkflow.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsTeamWorkflow.java
new file mode 100644
index 00000000000..eca1299ef7c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsTeamWorkflow.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.ats.actions.wizard;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsTeamWorkflow {
+
+ /**
+ * Return true if this class/plugin is responsible for the creation of the Team Workflow that will be created for the
+ * given Team Definition. This should be a light-weight check.
+ *
+ * @param teamDef related to the workflow to be created
+ * @param actionableItems that were selected for the creation
+ * @return true if responsible, false if not
+ * @throws Exception TODO
+ */
+ public boolean isResponsibleForTeamWorkflowCreation(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems) throws OseeCoreException;
+
+ /**
+ * Return the artifact type name for the given parameters. This method will only be called if
+ * isResponsibleForTeamWorkflowCreation returns true.
+ *
+ * @param teamDef related to the workflow to be created
+ * @param actionableItems that were selected for the creation
+ * @return string artifact type name
+ * @throws Exception TODO
+ */
+ public String getTeamWorkflowArtifactName(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems) throws OseeCoreException;
+
+ /**
+ * Notification that a teamWorkflow is being duplicated. This allows the extension to do necessary changes to
+ * duplicated workflow.
+ *
+ * @param teamArt
+ */
+ public void teamWorkflowDuplicating(TeamWorkFlowArtifact teamArt, TeamWorkFlowArtifact dupTeamArt) throws OseeCoreException;
+
+ /**
+ * Notification that a teamWorkflow was created. This allows the extension to do necessary initial tasks after the
+ * team workflow artifact is created. All changes made to dupTeamArt will be persisted after this call.
+ *
+ * @param teamArt
+ */
+ public void teamWorkflowCreated(TeamWorkFlowArtifact teamArt);
+
+ /**
+ * Return a collection of all team workflow artifact type names. These are used by ATS when searching is performed
+ * since there is no "inheritance" in the DB model.
+ *
+ * @return collection of all team workflow artifact type names
+ */
+ public Collection<String> getTeamWorkflowArtifactNames() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsWizardItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsWizardItem.java
new file mode 100644
index 00000000000..8a9d2395201
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/IAtsWizardItem.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.ats.actions.wizard;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * Allows the New Action wizard to be extended with custom widgets when the appropriate Actionable Items are selected
+ *
+ * @author Donald G. Dunne
+ */
+public interface IAtsWizardItem {
+
+ /**
+ * Add the desired XWidget declarations to the stringbuffer. Selected AIAs are provided so validation can be done to
+ * determine what (if any) widgets should be added. eg. <XWidget displayName=\"Description\" height=\"80\"
+ * required=\"true\" xwidgetType=\"XText\" fill=\"Vertically\" \"/>");
+ *
+ * @param aias
+ * @param sb
+ * @throws Exception TODO
+ */
+ public void getWizardXWidgetExtensions(Collection<ActionableItemArtifact> aias, StringBuffer sb) throws Exception;
+
+ /**
+ * @param aias
+ * @return true if widgets will be added based on selected aias
+ * @throws Exception TODO
+ */
+ public boolean hasWizardXWidgetExtensions(Collection<ActionableItemArtifact> aias) throws Exception;
+
+ /**
+ * Determine if Action is valid to create based on wizard data entered. hasWizardXWidgetExtenstions will be called to
+ * determine if this method should be called.
+ *
+ * @param wizard
+ * @return result of validation. if true, action will be created; if not, error will popup and action will not be
+ * created
+ */
+ public Result isActionValidToCreate(Collection<ActionableItemArtifact> aias, NewActionWizard wizard);
+
+ /**
+ * Callback with created action upon completion and creation of the action and it's workflows.
+ * hasWizardXWidgetExtenstions will be called to determine if this method should be called.
+ *
+ * @param actionArt
+ * @param wizard
+ * @param transaction TODO
+ * @throws Exception TODO
+ */
+ public void wizardCompleted(ActionArtifact actionArt, NewActionWizard wizard, SkynetTransaction transaction) throws Exception;
+
+ /**
+ * Validation that the data entered is valid and the wizard can be finished. This will be called after every
+ * character is entered, so extensive processing should not be performed during this check. Extensive processing can
+ * be performed during isActionValidToCreate(). hasWizardXWidgetExtenstions will be called to determine if this
+ * method should be called.
+ *
+ * @param wizard
+ * @return true if widget data entered is valid
+ */
+ public Result isWizardXWidgetsComplete(NewActionWizard wizard);
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java
new file mode 100644
index 00000000000..e673ac96660
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.actions.wizard;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.Set;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewActionJob extends Job {
+ private boolean saveIt = false;
+ private String identifyStateDescription = null;
+ private String title;
+ private final String desc;
+ private final ChangeType changeType;
+ private final PriorityType priority;
+ private final Date needByDate;
+ private final boolean validationRequired;
+ private ActionArtifact actionArt;
+ private final Set<ActionableItemArtifact> actionableItems;
+ private final Collection<String> userComms;
+ private final NewActionWizard wizard;
+
+ public NewActionJob(String title, String desc, ChangeType changeType, PriorityType priority, Date needByDate, boolean validationRequired, Collection<String> userComms, Set<ActionableItemArtifact> actionableItems, NewActionWizard wizard) {
+ super("Creating New Action");
+ this.title = title;
+ this.desc = desc;
+ this.changeType = changeType;
+ this.priority = priority;
+ this.needByDate = needByDate;
+ this.validationRequired = validationRequired;
+ this.userComms = userComms;
+ this.actionableItems = actionableItems;
+ this.wizard = wizard;
+ }
+
+ @Override
+ public IStatus run(final IProgressMonitor monitor) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ if (title.equals("tt")) title += " " + AtsLib.getAtsDeveloperIncrementingNum();
+ actionArt =
+ ActionManager.createAction(monitor, title, desc, changeType, priority, userComms, validationRequired,
+ needByDate, actionableItems, transaction);
+
+ if (wizard != null) wizard.notifyAtsWizardItemExtensions(actionArt, transaction);
+
+ monitor.subTask("Persisting");
+ transaction.execute();
+
+ // Because this is a job, it will automatically kill any popups that are created during.
+ // Thus, if multiple teams were selected to create, don't popup on openAction or dialog
+ // will exception out when it is killed at the end of this job.
+ AtsLib.openAtsAction(actionArt, AtsOpenOption.OpenAll);
+ OseeNotificationManager.sendNotifications();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * @return Returns the identifyStateDescription.
+ */
+ public String getIdentifyStateDescription() {
+ return identifyStateDescription;
+ }
+
+ /**
+ * @param identifyStateDescription The identifyStateDescription to set.
+ */
+ public void setIdentifyStateDescription(String identifyStateDescription) {
+ this.identifyStateDescription = identifyStateDescription;
+ }
+
+ /**
+ * @return Returns the saveIt.
+ */
+ public boolean isSaveIt() {
+ return saveIt;
+ }
+
+ /**
+ * @param saveIt The saveIt to set.
+ */
+ public void setSaveIt(boolean saveIt) {
+ this.saveIt = saveIt;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java
new file mode 100644
index 00000000000..39d316f4301
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage1.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.actions.wizard;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.widgets.dialog.AITreeContentProvider;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameSorter;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEECheckedFilteredTree;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewActionPage1 extends WizardPage {
+ private final NewActionWizard wizard;
+ private WorkPage page;
+ private OSEECheckedFilteredTree treeViewer;
+ private static PatternFilter patternFilter = new PatternFilter();
+ private static Text descriptionLabel;
+
+ /**
+ * @param actionWizard
+ */
+ protected NewActionPage1(NewActionWizard actionWizard) {
+ super("Create new ATS Action", "Create ATS Action", null);
+ setMessage("Enter title and select impacted items.");
+ this.wizard = actionWizard;
+ }
+
+ private final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ getContainer().updateButtons();
+ }
+ };
+
+ public void createControl(Composite parent) {
+
+ try {
+ String xWidgetXml =
+ "<WorkPage><XWidget displayName=\"Title\" required=\"true\" xwidgetType=\"XText\" toolTip=\"" + ATSAttributes.TITLE_ATTRIBUTE.getDescription() + "\"/></WorkPage>";
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(1, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ page = new WorkPage(xWidgetXml, ATSXWidgetOptionResolver.getInstance());
+ page.createBody(null, comp, null, xModListener, true);
+
+ Composite aiComp = new Composite(comp, SWT.NONE);
+ aiComp.setLayout(new GridLayout(1, false));
+ aiComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ (new Label(aiComp, SWT.NONE)).setText("Select Actionable Items:");
+ treeViewer =
+ new OSEECheckedFilteredTree(aiComp,
+ SWT.CHECK | SWT.MULTI | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter);
+ treeViewer.getViewer().getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.getViewer().setContentProvider(new AITreeContentProvider(Active.Active));
+ treeViewer.getViewer().setLabelProvider(new ArtifactLabelProvider());
+ try {
+ treeViewer.getViewer().setInput(ActionableItemArtifact.getTopLevelActionableItems(Active.Active));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ treeViewer.getViewer().setSorter(new ArtifactNameSorter());
+ treeViewer.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ getContainer().updateButtons();
+ }
+ });
+
+ (new Label(aiComp, SWT.NONE)).setText("Description of highlighted Actionable Item (if any):");
+ descriptionLabel = new Text(aiComp, SWT.BORDER | SWT.WRAP);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 30;
+ descriptionLabel.setLayoutData(gd);
+ descriptionLabel.setEnabled(false);
+
+ treeViewer.getViewer().addSelectionChangedListener(new SelectionChangedListener());
+
+ Button deselectAll = new Button(aiComp, SWT.PUSH);
+ deselectAll.setText("De-Select All");
+ deselectAll.addSelectionListener(new SelectionListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.clearChecked();
+ };
+ });
+
+ setControl(comp);
+ setHelpContexts();
+ if (wizard.getInitialAias() != null) treeViewer.setInitalChecked(wizard.getInitialAias());
+ ((XText) getXWidget("Title")).setFocus();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private class SelectionChangedListener implements ISelectionChangedListener {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection sel = (IStructuredSelection) treeViewer.getViewer().getSelection();
+ if (sel.isEmpty()) return;
+ ActionableItemArtifact aia = (ActionableItemArtifact) sel.getFirstElement();
+ try {
+ descriptionLabel.setText(aia.getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), ""));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ }
+ }
+
+ private void setHelpContexts() {
+ AtsPlugin.getInstance().setHelp(this.getControl(), "new_action_wizard_page_1");
+ }
+
+ public Set<ActionableItemArtifact> getSelectedActionableItemArtifacts() {
+ Set<ActionableItemArtifact> selected = new HashSet<ActionableItemArtifact>();
+ for (Object obj : treeViewer.getChecked()) {
+ selected.add((ActionableItemArtifact) obj);
+ }
+ return selected;
+ }
+
+ public XWidget getXWidget(String attrName) {
+ if (page == null) throw new IllegalArgumentException("WorkPage == null");
+ return page.getLayoutData(attrName).getXWidget();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (treeViewer.getChecked().size() == 0) return false;
+ try {
+ for (ActionableItemArtifact aia : getSelectedActionableItemArtifacts()) {
+ if (!aia.isActionable()) {
+ AWorkbench.popup("ERROR", ActionableItemArtifact.getNotActionableItemError(aia));
+ return false;
+ }
+ }
+ Collection<TeamDefinitionArtifact> teamDefs =
+ TeamDefinitionArtifact.getImpactedTeamDefs(getSelectedActionableItemArtifacts());
+ if (teamDefs.size() == 0) {
+ AWorkbench.popup("ERROR", "No Teams Associated with selected Actionable Items");
+ return false;
+ }
+ } catch (Exception ex) {
+ AWorkbench.popup("ERROR", ex.getLocalizedMessage());
+ return false;
+ }
+ if (!page.isPageComplete().isTrue()) return false;
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage2.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage2.java
new file mode 100644
index 00000000000..a6df47a453e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage2.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.ats.actions.wizard;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XList;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+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.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewActionPage2 extends WizardPage {
+ private WorkPage page;
+ private final NewActionWizard wizard;
+ private boolean debugPopulated = false;
+
+ /**
+ * @param wizard -
+ */
+ protected NewActionPage2(NewActionWizard wizard) {
+ super("Create new ATS Action", "Create ATS Action", null);
+ this.wizard = wizard;
+ setMessage("Enter description, priority, change type and select Finish.");
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (wizard.getInitialDescription() != null && ((XText) getXWidget("Description")).get().equals("")) ((XText) getXWidget("Description")).set(wizard.getInitialDescription());
+ if (wizard.isTTAction()) {
+ handlePopulateWithDebugInfo();
+ }
+ wizard.createPage3IfNecessary();
+ ((XText) getXWidget("Description")).getStyledText().setFocus();
+ }
+
+ private final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ getContainer().updateButtons();
+ }
+ };
+
+ public void createControl(Composite parent) {
+
+ try {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<WorkPage><XWidget displayName=\"Description\" height=\"80\" required=\"true\" xwidgetType=\"XText\" fill=\"Vertically\" toolTip=\"" + ATSAttributes.DESCRIPTION_ATTRIBUTE.getDescription() + "\"/>");
+ sb.append("<XWidget displayName=\"Change Type\" storageName=\"ats.Change Type\" xwidgetType=\"XCombo(" + ATSXWidgetOptionResolver.OPTIONS_FROM_ATTRIBUTE_VALIDITY + ")\" required=\"true\" horizontalLabel=\"true\" toolTip=\"" + ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getDescription() + "\"/>");
+ sb.append("<XWidget displayName=\"Priority\" storageName=\"ats.Priority\" xwidgetType=\"XCombo(" + ATSXWidgetOptionResolver.OPTIONS_FROM_ATTRIBUTE_VALIDITY + ")\" required=\"true\" horizontalLabel=\"true\"/>");
+ sb.append("<XWidget displayName=\"Deadline\" xwidgetType=\"XDate\" horizontalLabel=\"true\" toolTip=\"" + ATSAttributes.DEADLINE_ATTRIBUTE.getDescription() + "\"/>");
+ sb.append("<XWidget displayName=\"Validation Required\" xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" toolTip=\"" + ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getDescription() + "\"/>");
+ sb.append("<XWidget displayName=\"User Community\" storageName=\"ats.User Community\" xwidgetType=\"XList(" + ATSXWidgetOptionResolver.OPTIONS_FROM_ATTRIBUTE_VALIDITY + ")\" required=\"true\" toolTip=\"" + ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getDescription() + "\"/></WorkPage>");
+
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ page = new WorkPage(sb.toString(), ATSXWidgetOptionResolver.getInstance());
+ page.createBody(null, comp, null, xModListener, true);
+
+ ((XText) getXWidget("Description")).getLabelWidget().addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ handlePopulateWithDebugInfo();
+ }
+ }
+ });
+
+ setControl(comp);
+ setHelpContexts();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private void setHelpContexts() {
+ AtsPlugin.getInstance().setHelp(this.getControl(), "new_action_wizard_page_2");
+ }
+
+ private void handlePopulateWithDebugInfo() {
+ if (debugPopulated) return;
+ ((XText) getXWidget("Description")).set("See title");
+ // Must use skynet attribute name cause these widget uses the OPTIONS_FROM_ATTRIBUTE_VALIDITY
+ ((XList) getXWidget("ats.User Community")).setSelected("Other");
+ ((XCombo) getXWidget("ats.Priority")).set("4");
+ ((XCombo) getXWidget("ats.Change Type")).set("Improvement");
+ debugPopulated = true;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (page == null || !page.isPageComplete().isTrue()) return false;
+ return true;
+ }
+
+ protected XWidget getXWidget(String attrName) {
+ if (page == null) throw new IllegalArgumentException("WorkPage == null");
+ return page.getLayoutData(attrName).getXWidget();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java
new file mode 100644
index 00000000000..507b60736f4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionPage3.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.actions.wizard;
+
+import java.util.Collection;
+import java.util.HashSet;
+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.Platform;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+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.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewActionPage3 extends WizardPage {
+ private WorkPage page;
+ private Composite comp;
+ private final NewActionWizard wizard;
+ private static Set<IAtsWizardItem> wizardExtensionItems = new HashSet<IAtsWizardItem>();
+
+ /**
+ * @param wizard -
+ */
+ public NewActionPage3(NewActionWizard wizard) {
+ super("Create new ATS Action", "Create ATS Action", null);
+ this.wizard = wizard;
+ setMessage("Enter requested information and select Finish.");
+ getWizardXWidgetExtensions();
+ }
+
+ public void notifyAtsWizardItemExtensions(ActionArtifact action, SkynetTransaction transaction) {
+ for (IAtsWizardItem item : wizardExtensionItems) {
+ try {
+ if (item.hasWizardXWidgetExtensions(wizard.getSelectedActionableItemArtifacts())) item.wizardCompleted(
+ action, wizard, transaction);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ getContainer().updateButtons();
+ }
+ };
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ createPage(comp);
+ getShell().layout();
+ }
+
+ public void createPage(Composite comp) {
+ try {
+ if (page == null) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<WorkPage>");
+ // sb.append("<XWidget displayName=\"Description\" height=\"80\" required=\"true\"
+ // xwidgetType=\"XText\" fill=\"Vertically\" toolTip=\""
+ // + ATSAttributes.DESCRIPTION_ATTRIBUTE.getDescription() + "\"/>");
+ for (IAtsWizardItem item : wizardExtensionItems) {
+ try {
+ if (item.hasWizardXWidgetExtensions(wizard.getSelectedActionableItemArtifacts())) item.getWizardXWidgetExtensions(
+ wizard.getSelectedActionableItemArtifacts(), sb);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ sb.append("</WorkPage>");
+
+ page = new WorkPage(sb.toString(), ATSXWidgetOptionResolver.getInstance());
+ page.createBody(null, comp, null, xModListener, true);
+
+ comp.layout();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * createControl is called when wizard is initially created. Create a composite to use when this page is displayed.
+ */
+ public void createControl(Composite parent) {
+
+ comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ setControl(comp);
+ }
+
+ public void update() {
+ getContainer().updateButtons();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (page == null || !page.isPageComplete().isTrue()) return false;
+ // Check wizard extension item validation
+ for (IAtsWizardItem item : wizardExtensionItems) {
+ try {
+ if (item.hasWizardXWidgetExtensions(wizard.getSelectedActionableItemArtifacts())) {
+ Result result = item.isWizardXWidgetsComplete(wizard);
+ if (result.isFalse()) {
+ setErrorMessage(result.getText());
+ return false;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ setErrorMessage(null);
+ return true;
+ }
+
+ public XWidget getXWidget(String attrName) {
+ if (page == null) throw new IllegalArgumentException("WorkPage == null");
+ return page.getLayoutData(attrName).getXWidget();
+ }
+
+ private static void getWizardXWidgetExtensions() {
+ if (wizardExtensionItems.size() > 0) return;
+
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsWizardItem");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsWizardItem extension point");
+ return;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsWizardItem")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ wizardExtensionItems.add((IAtsWizardItem) obj);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error loading AtsWizardItem extension", ex);
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+ public static boolean isPage3Necesary(Collection<ActionableItemArtifact> aias) {
+ getWizardXWidgetExtensions();
+ for (IAtsWizardItem item : wizardExtensionItems) {
+ try {
+ if (item.hasWizardXWidgetExtensions(aias)) return true;
+ } catch (Exception ex) {
+ // DO NOTHING
+ }
+ }
+ return false;
+ }
+
+ public Result isActionValid() {
+ getWizardXWidgetExtensions();
+ for (IAtsWizardItem item : wizardExtensionItems) {
+ try {
+ if (item.hasWizardXWidgetExtensions(wizard.getSelectedActionableItemArtifacts())) {
+ Result result = item.isActionValidToCreate(wizard.getSelectedActionableItemArtifacts(), wizard);
+ if (result.isFalse()) return result;
+ }
+ } catch (Exception ex) {
+ // DO NOTHING
+ }
+ }
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java
new file mode 100644
index 00000000000..5904bc2da80
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.actions.wizard;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XList;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XList.XListItem;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewActionWizard extends Wizard implements INewWizard {
+ private NewActionPage1 page1;
+ private NewActionPage2 page2;
+ private NewActionPage3 page3;
+ private Collection<ActionableItemArtifact> initialAias;
+ private String initialDescription;
+
+ /**
+ * Wizard to create a new action artifact with ONE product
+ */
+ public NewActionWizard() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ Result result = isActionValid();
+ if (result.isFalse()) {
+ result.popup();
+ return false;
+ }
+ NewActionJob job = null;
+ job =
+ new NewActionJob(getTitle(), getDescription(), getChangeType(), getPriority(), getNeedBy(),
+ getValidation(), getUserCommunities(), getSelectedActionableItemArtifacts(), this);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ @Override
+ public void addPages() {
+ page1 = new NewActionPage1(this);
+ addPage(page1);
+ page2 = new NewActionPage2(this);
+ addPage(page2);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return (page3 == null) ? page2.isPageComplete() : page3.isPageComplete();
+ }
+
+ public void createPage3IfNecessary() {
+ if (page3 == null && NewActionPage3.isPage3Necesary(getSelectedActionableItemArtifacts())) {
+ page3 = new NewActionPage3(this);
+ addPage(page3);
+ }
+ }
+
+ public boolean isTTAction() {
+ return getTitle().equals("tt");
+ }
+
+ public String getTitle() {
+ return ((XText) page1.getXWidget("Title")).get();
+ }
+
+ public Set<ActionableItemArtifact> getSelectedActionableItemArtifacts() {
+ return page1.getSelectedActionableItemArtifacts();
+ }
+
+ public String getDescription() {
+ return ((XText) page2.getXWidget("Description")).get();
+ }
+
+ public Set<String> getUserCommunities() {
+ Set<String> items = new HashSet<String>();
+ // Must use skynet attribute name cause this widget uses the OPTIONS_FROM_ATTRIBUTE_VALIDITY
+ for (XListItem item : ((XList) page2.getXWidget("ats.User Community")).getSelected())
+ items.add(item.getName());
+ return items;
+ }
+
+ public PriorityType getPriority() throws OseeCoreException {
+ // Must use skynet attribute name cause this widget uses the OPTIONS_FROM_ATTRIBUTE_VALIDITY
+ return PriorityType.getPriority(((XCombo) page2.getXWidget("ats.Priority")).get());
+ }
+
+ public ChangeType getChangeType() {
+ // Must use skynet attribute name cause this widget uses the OPTIONS_FROM_ATTRIBUTE_VALIDITY
+ return ChangeType.getChangeType(((XCombo) page2.getXWidget("ats.Change Type")).get());
+ }
+
+ public boolean getValidation() {
+ return ((XCheckBox) page2.getXWidget("Validation Required")).get();
+ }
+
+ public Date getNeedBy() {
+ return ((XDate) page2.getXWidget("Deadline")).getDate();
+ }
+
+ public void notifyAtsWizardItemExtensions(ActionArtifact action, SkynetTransaction transaction) {
+ if (page3 != null) {
+ page3.notifyAtsWizardItemExtensions(action, transaction);
+ }
+ }
+
+ public XWidget getExtendedXWidget(String attrName) {
+ if (page3 == null) return null;
+ return page3.getXWidget(attrName);
+ }
+
+ public Result isActionValid() {
+ if (page3 == null) return Result.TrueResult;
+ return page3.isActionValid();
+ }
+
+ /**
+ * @return the initialDescription
+ */
+ public String getInitialDescription() {
+ return initialDescription;
+ }
+
+ /**
+ * @param initialDescription the initialDescription to set
+ */
+ public void setInitialDescription(String initialDescription) {
+ this.initialDescription = initialDescription;
+ }
+
+ /**
+ * @return the initialAias
+ */
+ public Collection<ActionableItemArtifact> getInitialAias() {
+ return initialAias;
+ }
+
+ /**
+ * @param initialAias the initialAias to set
+ */
+ public void setInitialAias(Collection<ActionableItemArtifact> initialAias) {
+ this.initialAias = initialAias;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNotePage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNotePage.java
new file mode 100644
index 00000000000..241f4a54bf2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNotePage.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.actions.wizard;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.ui.skynet.ats.NoteType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XList;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewNotePage extends WizardPage {
+ public XList typeList;
+ public XText noteText;
+ public XList artifactList;
+ private final NewNoteWizard wizard;
+
+ /**
+ * @param wizard -
+ */
+ public NewNotePage(NewNoteWizard wizard) {
+ super("Create new Note", "Create new Note", null);
+ this.wizard = wizard;
+ }
+
+ public void createControl(Composite parent) {
+ typeList = new XList("Type");
+ typeList.setRequiredEntry(true);
+ typeList.setGrabHorizontal(true);
+ typeList.setRequiredSelected(1, 1);
+ typeList.add(NoteType.getNames());
+ typeList.setVerticalLabel(true);
+ artifactList = new XList("Against Artifact");
+ artifactList.setVerticalLabel(true);
+ artifactList.setRequiredEntry(true);
+ artifactList.setGrabHorizontal(true);
+ artifactList.setRequiredSelected(1, 1);
+ artifactList.add(wizard.getArtifactNames());
+ noteText = new XText("Note");
+ noteText.setRequiredEntry(true);
+ noteText.setVerticalLabel(true);
+ noteText.setFillHorizontally(true);
+ noteText.setFillVertically(true);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(ALayout.getZeroMarginLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Composite topC = new Composite(composite, SWT.NONE);
+ topC.setLayout(ALayout.getZeroMarginLayout(2, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ topC.setLayoutData(gd);
+
+ Composite topCLeft = new Composite(topC, SWT.NONE);
+ topCLeft.setLayout(new GridLayout());
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ topCLeft.setLayoutData(gd);
+
+ typeList.createWidgets(topCLeft, 2);
+ typeList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ update();
+ };
+ });
+
+ Composite topCRight = new Composite(topC, SWT.NONE);
+ topCRight.setLayout(new GridLayout());
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ topCRight.setLayoutData(gd);
+
+ artifactList.createWidgets(topCRight, 2);
+ artifactList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ update();
+ };
+ });
+
+ Composite bottomC = new Composite(composite, SWT.NONE);
+ bottomC.setLayout(new GridLayout());
+ gd = new GridData(GridData.FILL_BOTH);
+ bottomC.setLayoutData(gd);
+
+ noteText.createWidgets(bottomC, 2);
+ noteText.addModifyListener(new ModifyListener() {
+ public void modifyText(org.eclipse.swt.events.ModifyEvent e) {
+ update();
+ };
+ });
+
+ setControl(composite);
+ }
+
+ public void update() {
+ getContainer().updateButtons();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (noteText.get().equals("")) {
+ return false;
+ }
+ if (typeList.getSelected().size() == 0) {
+ return false;
+ }
+ if (artifactList.getSelected().size() == 0) {
+ return false;
+ }
+ return true;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNoteWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNoteWizard.java
new file mode 100644
index 00000000000..6669878019f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewNoteWizard.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.ats.actions.wizard;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewNoteWizard extends Wizard {
+ public NewNotePage mainPage;
+ private final Collection<String> artifactNames;
+
+ /**
+ *
+ */
+ public NewNoteWizard(Collection<String> artifactNames) {
+ super();
+ this.artifactNames = artifactNames;
+ setWindowTitle("New Note Wizard");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ public void addPages() {
+ mainPage = new NewNotePage(this);
+ addPage(mainPage);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return mainPage.isPageComplete();
+ }
+
+ public Collection<String> getArtifactNames() {
+ return artifactNames;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSArtifact.java
new file mode 100644
index 00000000000..ccd19a67319
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSArtifact.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.ats.artifact;
+
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.ats.hyper.IHyperArtifact;
+import org.eclipse.osee.ats.util.Overview;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+
+public abstract class ATSArtifact extends Artifact implements IHyperArtifact, IATSArtifact {
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public ATSArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public String toString() {
+ return getInternalDescriptiveName();
+ }
+
+ public String getHyperlinkHtml() {
+ return Overview.getOpenHyperlinkHtml(this);
+ }
+
+ /**
+ * Recursively retrieve artifacts and all it's ATS related artifacts such as tasks, notes, subscriptions, etc... for
+ * deletion
+ *
+ * @param deleteArts
+ * @param allRelated
+ * @throws OseeCoreException
+ */
+ public void atsDelete(Set<Artifact> deleteArts, Map<Artifact, Object> allRelated) throws OseeCoreException {
+ deleteArts.add(this);
+ for (Artifact artifact : getRelatedArtifactsAll()) {
+ allRelated.put(artifact, this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSAttributes.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSAttributes.java
new file mode 100644
index 00000000000..5d16ade687a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSAttributes.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ATSAttributes {
+
+ private final String displayName;
+ private final String storeName;
+ private final String description;
+ private static Map<String, ATSAttributes> attrNameToAttr = new HashMap<String, ATSAttributes>();
+
+ public static final ATSAttributes ALLOW_CREATE_BRANCH = new ATSAttributes("Allow Create Branch");
+ public static final ATSAttributes ALLOW_COMMIT_BRANCH = new ATSAttributes("Allow Commit Branch");
+ public static final ATSAttributes WORKING_BRANCH_WIDGET = new ATSAttributes("Working Branch");
+ public static final ATSAttributes VALIDATE_REQ_CHANGES_WIDGET = new ATSAttributes("Validate Requirement Changes");
+ public static final ATSAttributes CREATE_CODE_TEST_TASKS_OFF_REQUIREMENTS =
+ new ATSAttributes("Create Code/Test Tasks");
+ public static final ATSAttributes CHECK_SIGNALS_VIA_CDB_WIDGET = new ATSAttributes("Check Signals Via CDB");
+ public static final ATSAttributes ROLE_ATTRIBUTE = new ATSAttributes("Role");
+ public static final ATSAttributes ACTIONABLE_ITEM_GUID_ATTRIBUTE =
+ new ATSAttributes("Actionable Item", "Actionable Items that are impacted by this change.");
+ public static final ATSAttributes TEAM_DEFINITION_GUID_ATTRIBUTE = new ATSAttributes("Team Definition");
+ public static final ATSAttributes TITLE_ATTRIBUTE =
+ new ATSAttributes("Title", "Name", "Enter clear and consise title that can be generally understood.");
+ public static final ATSAttributes STATE_ATTRIBUTE = new ATSAttributes("State", "States of workflow state machine.");
+ public static final ATSAttributes CURRENT_STATE_ATTRIBUTE =
+ new ATSAttributes("Current State", "Current state of workflow state machine.");
+ public static final ATSAttributes FULL_NAME_ATTRIBUTE =
+ new ATSAttributes("Full Name", "Expanded and descriptive name.");
+ public static final ATSAttributes DESCRIPTION_ATTRIBUTE = new ATSAttributes("Description", "Detailed explanation.");
+ public static final ATSAttributes CHANGE_TYPE_ATTRIBUTE = new ATSAttributes("Change Type", "Type of change.");
+ public static final ATSAttributes ASSIGNEE_ATTRIBUTE =
+ new ATSAttributes("Assignees", "Users currently assigned to do work.");
+ public static final ATSAttributes PRIORITY_TYPE_ATTRIBUTE = new ATSAttributes("Priority", "1 = High; 5 = Low");
+ public static final ATSAttributes USER_COMMUNITY_ATTRIBUTE =
+ new ATSAttributes(
+ "User Community",
+ "If working in one of these communities resulted in the creation of this Action, please select. Otherwise, select Other.");
+ public static final ATSAttributes DEADLINE_ATTRIBUTE =
+ new ATSAttributes("Deadline", "ats.Need By", "Hard schedule date that workflow must be completed.");
+ public static final ATSAttributes VALIDATION_REQUIRED_ATTRIBUTE =
+ new ATSAttributes("Validation Required",
+ "If selected, originator will be asked to validate the implementation.");
+ public static final ATSAttributes ACTIVE_ATTRIBUTE = new ATSAttributes("Active", "Active ATS configuration object.");
+ public static final ATSAttributes LOG_ATTRIBUTE = new ATSAttributes("Log");
+ public static final ATSAttributes LOCATION_ATTRIBUTE =
+ new ATSAttributes("Location", "Enter location of materials to review.");
+ public static final ATSAttributes REVIEW_DEFECT_ATTRIBUTE = new ATSAttributes("Review Defect");
+ public static final ATSAttributes STATE_NOTES_ATTRIBUTE = new ATSAttributes("State Notes");
+ public static final ATSAttributes ESTIMATED_HOURS_ATTRIBUTE =
+ new ATSAttributes(
+ "Estimated Hours",
+ "Hours estimated to implement the changes associated with this Action.\nIncludes estimated hours for workflows, tasks and reviews.");
+ public static final ATSAttributes WEEKLY_BENEFIT_ATTRIBUTE =
+ new ATSAttributes("Weekly Benefit",
+ "Estimated number of hours that will be saved over a single year if this change is completed.");
+ public static final ATSAttributes PERCENT_REWORK_ATTRIBUTE = new ATSAttributes("Percent Rework");
+ public static final ATSAttributes TASK_USES_RESOLUTION_OPTIONS_ATTRIBUTE =
+ new ATSAttributes("Task Uses Resolution Options",
+ "True if resolution field is driven by option selections versus simple text.");
+ public static final ATSAttributes RESOLUTION_ATTRIBUTE = new ATSAttributes("Resolution", "Implementation details.");
+ public static final ATSAttributes RELATED_TO_STATE_ATTRIBUTE =
+ new ATSAttributes("Related To State", "State of parent workflow this object is related to.");
+ public static final ATSAttributes CANCEL_REASON_ATTRIBUTE =
+ new ATSAttributes("Cancel Reason", "Reason for cancellation of this ATS object.");
+ public static final ATSAttributes SMA_NOTE_ATTRIBUTE =
+ new ATSAttributes("Notes", "ats.SMA Note", "Notes applicable to ATS object");
+ public static final ATSAttributes WORK_PACKAGE_ATTRIBUTE =
+ new ATSAttributes("Work Package", "Designated accounting work package for completing workflow.");
+ public static final ATSAttributes COMMIT_MANAGER_WIDGET =
+ new ATSAttributes("Commit Manager", "Commit branches to parent and parallel branches.");
+ public static final ATSAttributes CATEGORY_ATTRIBUTE =
+ new ATSAttributes("Category", "Open field for user to be able to enter text to use for categorizing/sorting.");
+ public static final ATSAttributes CATEGORY2_ATTRIBUTE =
+ new ATSAttributes("Category2", "Open field for user to be able to enter text to use for categorizing/sorting.");
+ public static final ATSAttributes CATEGORY3_ATTRIBUTE =
+ new ATSAttributes("Category3", "Open field for user to be able to enter text to use for categorizing/sorting.");
+ public static final ATSAttributes CANCELLED_FROM_STATE_ATTRIBUTE =
+ new ATSAttributes("Cancelled From State", "State prior to cancellation of workflow.");
+ public static final ATSAttributes RELEASED_ATTRIBUTE =
+ new ATSAttributes("Released", "True if object is in a released state.");
+ public static final ATSAttributes NEXT_VERSION_ATTRIBUTE =
+ new ATSAttributes("Next Version", "True if version artifact is \"Next\" version to be released.");
+ public static final ATSAttributes ACTIONABLE_ATTRIBUTE =
+ new ATSAttributes("Actionable", "True if item can have Action written against or assigned to.");
+ public static final ATSAttributes TEAM_USES_VERSIONS_ATTRIBUTE =
+ new ATSAttributes("Team Uses Versions", "True if Team Workflow uses versioning/releasing option.");
+ public static final ATSAttributes LEGACY_PCR_ID_ATTRIBUTE =
+ new ATSAttributes("Legacy PCR Id",
+ "Field to register problem change report id from legacy items imported into ATS.");
+ public static final ATSAttributes PARENT_BRANCH_ID_ATTRIBUTE =
+ new ATSAttributes("Parent Branch Id", "Parent branch associated with ATS object.");
+ public static final ATSAttributes DECISION_REVIEW_OPTIONS_ATTRIBUTE =
+ new ATSAttributes(
+ "Decision Review Options",
+ "Options available for selection in review. " + "Each line is a separate option. Format: <option name>;<state to transition to>;<assignee>");
+ public static final ATSAttributes DECISION_ATTRIBUTE =
+ new ATSAttributes("Decision", "Option selected during decision review.");
+ public static final ATSAttributes PROBLEM_ATTRIBUTE = new ATSAttributes("Problem", "Problem found during analysis.");
+ public static final ATSAttributes REQUIRES_FOLLOWUP_ATTRIBUTE =
+ new ATSAttributes("Requires Followup", "True if review requires someone to folloup after decision.");
+ public static final ATSAttributes PROPOSED_RESOLUTION_ATTRIBUTE =
+ new ATSAttributes("Proposed Resolution", "Recommended resolution.");
+ // TODO Remove this after 0.5.0 release
+ public static final ATSAttributes BLOCKING_REVIEW_ATTRIBUTE =
+ new ATSAttributes("Blocking Review",
+ "True if workflow should be blocked from contining until review is completed.");
+ public static final ATSAttributes REVIEW_BLOCKS_ATTRIBUTE =
+ new ATSAttributes("Review Blocks", "Review Completion will block it's parent workflow in this manner.");
+ public static final ATSAttributes ESTIMATED_RELEASE_DATE_ATTRIBUTE =
+ new ATSAttributes("Estimated Release Date", "Date the changes will be made available to the users.");
+ public static final ATSAttributes ESTIMATED_COMPLETION_DATE_ATTRIBUTE =
+ new ATSAttributes("Estimated Completion Date", "Date the changes will be completed.");
+ public static final ATSAttributes RELEASE_DATE_ATTRIBUTE =
+ new ATSAttributes("Release Date", "Date the changes were made available to the users.");
+ public static final ATSAttributes MAN_DAYS_NEEDED_ATTRIBUTE = new ATSAttributes("Man Days Needed");
+ public static final ATSAttributes BRANCH_ID_ATTRIBUTE = new ATSAttributes("Working Branch");
+
+ protected ATSAttributes(String displayName, String storeName, String description) {
+ this.displayName = displayName;
+ this.storeName = storeName;
+ this.description = description;
+ attrNameToAttr.put(getStoreName(), this);
+ }
+
+ /**
+ * Creates attribute with displayName = "<name>" and storeName = "ats.<name>"
+ *
+ * @param name
+ */
+ private ATSAttributes(String name) {
+ this(name, "ats." + name, null);
+ }
+
+ /**
+ * Creates attribute with displayName = "<displayName>" and storeName = "ats.<displayName>"
+ *
+ * @param name
+ */
+ private ATSAttributes(String displayName, String description) {
+ this(displayName, "ats." + displayName, description);
+ }
+
+ public static ATSAttributes getAtsAttributeByStoreName(String storeName) {
+ return attrNameToAttr.get(storeName);
+ }
+
+ @Override
+ public final boolean equals(Object obj) {
+ return super.equals(obj);
+ }
+
+ /**
+ * @return Returns the displayName.
+ */
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ /**
+ * @return Returns the storeName.
+ */
+ public String getStoreName() {
+ return storeName;
+ }
+
+ /**
+ * @return the description
+ */
+ public String getDescription() {
+ return description;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSLog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSLog.java
new file mode 100644
index 00000000000..35aeef82d81
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSLog.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.ats.artifact;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ATSLog {
+
+ private final Artifact artifact;
+ private boolean enabled = true;
+ private static String ATS_LOG_TAG = "AtsLog";
+ private static String LOG_ITEM_TAG = "Item";
+ private LogItem cancelledLogItem;
+ private LogItem completedLogItem;
+ public static enum LogType {
+ None, Originated, StateComplete, StateCancelled, StateEntered, Released, Error, Assign, Note, Metrics;
+
+ public static LogType getType(String type) throws OseeArgumentException {
+ for (Enum<LogType> e : LogType.values()) {
+ if (e.name().equals(type)) return (LogType) e;
+ }
+ throw new OseeArgumentException("Unhandled LogType: \"" + type + "\"");
+ }
+
+ };
+
+ public ATSLog(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return getLogItems().toString();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ public String getHtml() throws OseeCoreException {
+ return getHtml(true);
+ }
+
+ public String getHtml(boolean showLog) throws OseeCoreException {
+ if (getLogItems().size() == 0) return "";
+ StringBuffer sb = new StringBuffer();
+ if (showLog) sb.append(AHTML.addSpace(1) + AHTML.getLabelStr(
+ AHTML.LABEL_FONT,
+ "History for \"" + artifact.getArtifactTypeName() + "\" - " + artifact.getHumanReadableId() + " - titled \"" + artifact.getDescriptiveName() + "\""));
+ sb.append(getTable());
+ return sb.toString();
+ }
+
+ private static Pattern LOG_ITEM_PATTERN =
+ Pattern.compile("<Item date=\"(.*?)\" msg=\"(.*?)\" state=\"(.*?)\" type=\"(.*?)\" userId=\"(.*?)\"/>");
+
+ private static Pattern LOG_ITEM_TAG_PATTERN = Pattern.compile("<Item ");
+
+ public List<LogItem> getLogItems() throws OseeCoreException {
+ // System.out.println("getLogItems " + artifact.getHumanReadableId());
+ List<LogItem> logItems = new ArrayList<LogItem>();
+ String xml = artifact.getSoleAttributeValue(ATSAttributes.LOG_ATTRIBUTE.getStoreName(), "");
+ if (!xml.equals("")) {
+ Matcher m = LOG_ITEM_PATTERN.matcher(xml);
+ while (m.find()) {
+ LogItem item = new LogItem(m.group(4), m.group(1), m.group(5), m.group(3), AXml.xmlToText(m.group(2)));
+ logItems.add(item);
+ }
+
+ Matcher m2 = LOG_ITEM_TAG_PATTERN.matcher(xml);
+ int openTagsFound = 0;
+ while (m2.find())
+ openTagsFound++;
+ if (logItems.size() != openTagsFound) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, String.format(
+ "ATS Log: open tags found %d doesn't match log items parsed %d for %s", openTagsFound,
+ logItems.size(), artifact.getHumanReadableId()));
+ }
+ }
+ return logItems;
+ }
+
+ public Date getLastStatusedDate() throws OseeCoreException {
+ LogItem logItem = getLastEvent(LogType.Metrics);
+ if (logItem == null) return null;
+ return logItem.getDate();
+ }
+
+ public void putLogItems(List<LogItem> items) {
+ try {
+ Document doc = Jaxp.newDocument();
+ Element rootElement = doc.createElement(ATS_LOG_TAG);
+ doc.appendChild(rootElement);
+ for (LogItem item : items) {
+ Element element = doc.createElement(LOG_ITEM_TAG);
+ element.setAttribute("type", item.getType().name());
+ element.setAttribute("date", item.getDate().getTime() + "");
+ element.setAttribute("userId", item.getUser().getUserId());
+ element.setAttribute("state", item.getState());
+ element.setAttribute("msg", item.getMsg());
+ rootElement.appendChild(element);
+ }
+ artifact.setSoleAttributeValue(ATSAttributes.LOG_ATTRIBUTE.getStoreName(), Jaxp.getDocumentXml(doc));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't create ats log document", ex);
+ }
+ }
+
+ public List<LogItem> getLogItemsReversed() throws OseeCoreException {
+ List<LogItem> logItems = getLogItems();
+ Collections.reverse(logItems);
+ return logItems;
+ }
+
+ public void setOriginator(User user) throws OseeCoreException {
+ List<LogItem> logItems = getLogItems();
+ for (LogItem item : logItems) {
+ if (item.getType() == LogType.Originated) {
+ item.setUser(user);
+ putLogItems(logItems);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Since originator can be changed, return the date of the first originated log item
+ *
+ * @return Date
+ */
+ public Date getCreationDate() throws OseeCoreException {
+ LogItem logItem = getEvent(LogType.Originated);
+ if (logItem == null) return null;
+ return logItem.getDate();
+ }
+
+ /**
+ * Since originator change be changed, return the last originated event's user
+ *
+ * @return User
+ */
+ public User getOriginator() throws OseeCoreException {
+ LogItem logItem = getLastEvent(LogType.Originated);
+ if (logItem == null) return null;
+ return logItem.getUser();
+ }
+
+ /**
+ * Overwrite the first logItem to match type and state with newItem data
+ *
+ * @param matchType
+ * @param matchState
+ * @param newItem
+ */
+ public void overrideStateItemData(LogType matchType, String matchState, LogItem newItem) throws OseeCoreException {
+ List<LogItem> logItems = getLogItems();
+ for (LogItem item : logItems) {
+ if (item.getType() == matchType && item.getState().equals(matchState)) {
+ item.setUser(newItem.getUser());
+ item.setDate(newItem.getDate());
+ item.setMsg(newItem.getMsg());
+ putLogItems(logItems);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Overwrite the first logItem to match matchType with newItem data
+ *
+ * @param matchType
+ * @param newItem
+ */
+ public void overrideItemData(LogType matchType, LogItem newItem) throws OseeCoreException {
+ List<LogItem> logItems = getLogItems();
+ for (LogItem item : logItems) {
+ if (item.getType() == matchType) {
+ item.setState(newItem.getState());
+ item.setUser(newItem.getUser());
+ item.setDate(newItem.getDate());
+ item.setMsg(newItem.getMsg());
+ putLogItems(logItems);
+ return;
+ }
+ }
+ }
+
+ /**
+ * @param type
+ * @param state name of state or null
+ * @param msg
+ * @throws OseeArgumentException
+ * @throws MultipleAttributesExist
+ */
+ public void addLog(LogType type, String state, String msg) throws OseeCoreException {
+ addLog(type, state, msg, new Date(), UserManager.getUser());
+ }
+
+ /**
+ * @param type
+ * @param state name of state or null
+ * @param msg
+ * @param user
+ * @throws MultipleAttributesExist
+ */
+ public void addLog(LogType type, String state, String msg, User user) throws OseeCoreException {
+ addLog(type, state, msg, new Date(), user);
+ }
+
+ public void addLogItem(LogItem item) throws OseeCoreException {
+ addLog(item.getType(), item.getState(), item.getMsg(), item.getDate(), item.getUser());
+ }
+
+ /**
+ * @param type
+ * @param state name of state or null
+ * @param msg
+ * @param date
+ * @param user
+ * @throws MultipleAttributesExist
+ */
+ public void addLog(LogType type, String state, String msg, Date date, User user) throws OseeCoreException {
+ if (!enabled) return;
+ LogItem logItem = new LogItem(type, date, user, state, msg);
+ List<LogItem> logItems = getLogItems();
+ logItems.add(logItem);
+ putLogItems(logItems);
+ }
+
+ public void clearLog() {
+ putLogItems(new ArrayList<LogItem>());
+ }
+
+ public String getTable() throws OseeCoreException {
+ StringBuilder builder = new StringBuilder();
+ List<LogItem> logItems = getLogItems();
+ builder.append("<TABLE BORDER=\"1\" cellspacing=\"1\" cellpadding=\"3%\" width=\"100%\"><THEAD><TR><TH>Event</TH>" + "<TH>State</TH><TH>Message</TH><TH>User</TH><TH>Date</TH></THEAD></TR>");
+ for (LogItem item : logItems) {
+ User user = item.getUser();
+ String name = "";
+ if (user != null) {
+ name = user.getName();
+ if (name == null || name.equals("")) {
+ name = user.getName();
+ }
+ }
+ builder.append("<TR>");
+ builder.append("<TD>" + item.getType() + "</TD>");
+ builder.append("<TD>" + (item.getState().equals("") ? "." : item.getState()) + "</TD>");
+ builder.append("<TD>" + (item.getMsg().equals("") ? "." : item.getMsg()) + "</TD>");
+ if (user.equals(UserManager.getUser()))
+ builder.append("<TD bgcolor=\"#CCCCCC\">" + name + "</TD>");
+ else
+ builder.append("<TD>" + name + "</TD>");
+ builder.append("<TD>" + item.getDate(XDate.MMDDYYHHMM) + "</TD>");
+ builder.append("</TR>");
+ }
+ builder.append("</TABLE>");
+ return builder.toString();
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public LogItem getEvent(LogType type) throws OseeCoreException {
+ for (LogItem item : getLogItems())
+ if (item.getType() == type) return item;
+ return null;
+ }
+
+ public LogItem getLastEvent(LogType type) throws OseeCoreException {
+ for (LogItem item : getLogItemsReversed())
+ if (item.getType() == type) return item;
+ return null;
+ }
+
+ public LogItem getStateEvent(LogType type, String stateName) throws OseeCoreException {
+ for (LogItem item : getLogItemsReversed())
+ if (item.getType() == type && item.getState().equals(stateName)) return item;
+ return null;
+ }
+
+ public LogItem getStateEvent(LogType type) throws OseeCoreException {
+ for (LogItem item : getLogItemsReversed())
+ if (item.getType() == type) return item;
+ return null;
+ }
+
+ public LogItem getCancelledLogItem() throws OseeCoreException {
+ if (cancelledLogItem == null) {
+ cancelledLogItem = getStateEvent(LogType.StateEntered, DefaultTeamState.Cancelled.name());
+ }
+ return cancelledLogItem;
+ }
+
+ public LogItem getCompletedLogItem() throws OseeCoreException {
+ if (completedLogItem == null) {
+ completedLogItem = getStateEvent(LogType.StateEntered, DefaultTeamState.Completed.name());
+ }
+ return completedLogItem;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSNote.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSNote.java
new file mode 100644
index 00000000000..5fae8a6b171
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ATSNote.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.ats.artifact;
+
+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.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ats.NoteType;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ATSNote {
+ private final Artifact artifact;
+ private boolean enabled = true;
+ private static String ATS_NOTE_TAG = "AtsNote";
+ private static String LOG_ITEM_TAG = "Item";
+
+ public ATSNote(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ public void addNote(NoteType type, String state, String msg, User user) {
+ addNote(type, state, msg, new Date(), user);
+ }
+
+ public void addNoteItem(NoteItem noteItem) {
+ addNote(noteItem.getType(), noteItem.getState(), noteItem.getMsg(), noteItem.getDate(), noteItem.getUser());
+ }
+
+ public void addNote(NoteType type, String state, String msg, Date date, User user) {
+ if (!enabled) return;
+ NoteItem logItem = new NoteItem(type, state, date.getTime() + "", user, msg);
+ List<NoteItem> logItems = getNoteItems();
+ logItems.add(logItem);
+ saveNoteItems(logItems);
+ }
+
+ public List<NoteItem> getNoteItems() {
+ List<NoteItem> logItems = new ArrayList<NoteItem>();
+ try {
+ String xml = artifact.getSoleAttributeValue(ATSAttributes.STATE_NOTES_ATTRIBUTE.getStoreName(), "");
+ if (!xml.equals("")) {
+ NodeList nodes = Jaxp.readXmlDocument(xml).getElementsByTagName(LOG_ITEM_TAG);
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Element element = (Element) nodes.item(i);
+ User user = UserManager.getUserByUserId(element.getAttribute("userId"));
+ NoteItem item =
+ new NoteItem(element.getAttribute("type"), element.getAttribute("state"),
+ element.getAttribute("date"), user, element.getAttribute("msg"));
+ logItems.add(item);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return logItems;
+ }
+
+ public void saveNoteItems(List<NoteItem> items) {
+ try {
+ Document doc = Jaxp.newDocument();
+ Element rootElement = doc.createElement(ATS_NOTE_TAG);
+ doc.appendChild(rootElement);
+ for (NoteItem item : items) {
+ Element element = doc.createElement(LOG_ITEM_TAG);
+ element.setAttribute("type", item.getType().name());
+ element.setAttribute("state", item.getState());
+ element.setAttribute("date", item.getDate().getTime() + "");
+ element.setAttribute("userId", item.getUser().getUserId());
+ element.setAttribute("msg", item.getMsg());
+ rootElement.appendChild(element);
+ }
+ artifact.setSoleAttributeValue(ATSAttributes.STATE_NOTES_ATTRIBUTE.getStoreName(), Jaxp.getDocumentXml(doc));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't create ats note document", ex);
+ }
+ }
+
+ /**
+ * Display Note Table; If state == null, only display non-state notes Otherwise, show only notes associated with
+ * state
+ *
+ * @param state
+ */
+ public String getTable(String state) {
+ ArrayList<NoteItem> showNotes = new ArrayList<NoteItem>();
+ List<NoteItem> noteItems = getNoteItems();
+ try {
+ if (!artifact.isAttributeTypeValid(ATSAttributes.STATE_NOTES_ATTRIBUTE.getStoreName())) {
+ return "";
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "";
+ }
+
+ for (NoteItem li : noteItems) {
+ if ((state.equals("ALL")) || (state == null && li.getState().equals("")) || (state != null && li.getState().equals(
+ state))) showNotes.add(li);
+ }
+ if (showNotes.size() == 0) return "";
+ StringBuilder builder = new StringBuilder();
+ builder.append("<TABLE BORDER=\"1\" cellspacing=\"1\" cellpadding=\"3%\" width=\"100%\"><THEAD><TR><TH>Type</TH><TH>State</TH>" + "<TH>Message</TH><TH>User</TH><TH>Date</TH></THEAD></TR>");
+ for (NoteItem note : showNotes) {
+ User user = note.getUser();
+ String name = "";
+ if (user != null) {
+ name = user.getName();
+ if (name == null || name.equals("")) {
+ name = user.getName();
+ }
+ }
+ builder.append("<TR>");
+ builder.append("<TD>" + note.getType() + "</TD>");
+ builder.append("<TD>" + (note.getState().equals("") ? "," : note.getState()) + "</TD>");
+ builder.append("<TD>" + (note.getMsg().equals("") ? "," : note.getMsg()) + "</TD>");
+ if (user.isMe())
+ builder.append("<TD bgcolor=\"#CCCCCC\">" + name + "</TD>");
+ else
+ builder.append("<TD>" + name + "</TD>");
+ builder.append("<TD>" + (new SimpleDateFormat("MM/dd/yyyy h:mm a")).format(note.getDate()) + "</TD>");
+ builder.append("</TR>");
+ }
+ builder.append("</TABLE>");
+ return builder.toString();
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionArtifact.java
new file mode 100644
index 00000000000..df01b1e87e1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionArtifact.java
@@ -0,0 +1,1336 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.artifact;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.wizard.IAtsTeamWorkflow;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.ats.util.widgets.dialog.AICheckTreeDialog;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.ArtifactAnnotation;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionArtifact extends ATSArtifact implements IWorldViewArtifact {
+
+ public static String ARTIFACT_NAME = "Action";
+ public static enum CreateTeamOption {
+ Duplicate_If_Exists; // If option exists, then duplication of workflow of same team definition is allowed
+ };
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public ActionArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public void resetAttributesOffChildren(SkynetTransaction transaction) throws OseeCoreException {
+ resetChangeTypeOffChildren();
+ resetPriorityOffChildren();
+ resetUserCommunityOffChildren();
+ resetTitleOffChildren();
+ resetValidationOffChildren();
+ resetDescriptionOffChildren();
+ persistAttributes(transaction);
+ }
+
+ public boolean hasAtsWorldChildren() throws OseeCoreException {
+ return true;
+ }
+
+ public Set<ActionableItemArtifact> getActionableItems() throws OseeCoreException {
+ Set<ActionableItemArtifact> aias = new HashSet<ActionableItemArtifact>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ aias.addAll(team.getActionableItemsDam().getActionableItems());
+ }
+ return aias;
+ }
+
+ /**
+ * Reset Action title only if all children are titled the same
+ */
+ private void resetTitleOffChildren() throws OseeCoreException {
+ String title = "";
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (title.equals(""))
+ title = team.getDescriptiveName();
+ else if (!title.equals(team.getDescriptiveName())) return;
+ }
+ if (!title.equals(getDescriptiveName())) {
+ setDescriptiveName(title);
+ }
+ }
+
+ // Set validation to true if any require validation
+ private void resetValidationOffChildren() throws OseeCoreException {
+ boolean validationRequired = false;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (team.getSoleAttributeValue(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), false)) validationRequired =
+ true;
+ }
+ if (validationRequired != getSoleAttributeValue(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), false)) setSoleAttributeValue(
+ ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), validationRequired);
+ }
+
+ /**
+ * Reset Action title only if all children are titled the same
+ */
+ private void resetDescriptionOffChildren() throws OseeCoreException {
+ String desc = "";
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (desc.equals(""))
+ desc = team.getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ else if (!desc.equals(team.getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), ""))) return;
+ }
+ if (!desc.equals(getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), ""))) {
+ setSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), desc);
+ }
+ if (desc.equals("")) {
+ deleteSoleAttribute(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName());
+ }
+ }
+
+ private void resetChangeTypeOffChildren() throws OseeCoreException {
+ ChangeType changeType = null;
+ Collection<TeamWorkFlowArtifact> teamArts = getTeamWorkFlowArtifacts();
+ if (teamArts.size() == 1)
+ changeType = teamArts.iterator().next().getChangeType();
+ else
+ for (TeamWorkFlowArtifact team : teamArts)
+ if (!(new SMAManager(team)).isCancelled()) {
+ if (changeType == null)
+ changeType = team.getChangeType();
+ // if change type of this team is different than others, can't
+ // change to common type so just return
+ else if (changeType != team.getChangeType()) return;
+ }
+ if (changeType != null && getChangeType() != changeType) setChangeType(changeType);
+ return;
+ }
+
+ private void resetPriorityOffChildren() throws OseeCoreException {
+ PriorityType priorityType = null;
+ Collection<TeamWorkFlowArtifact> teamArts = getTeamWorkFlowArtifacts();
+ if (teamArts.size() == 1)
+ priorityType = teamArts.iterator().next().getPriority();
+ else
+ for (TeamWorkFlowArtifact team : teamArts)
+ if (!(new SMAManager(team)).isCancelled()) {
+ if (priorityType == null)
+ priorityType = team.getPriority();
+ // if change type of this team is different than others, can't
+ // change to common type so just return
+ else if (priorityType != team.getPriority()) return;
+ }
+ if (priorityType != null && getPriority() != priorityType) setPriority(priorityType);
+ return;
+ }
+
+ private void resetUserCommunityOffChildren() throws OseeCoreException {
+ Set<String> userComs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!(new SMAManager(team)).isCancelled()) {
+ userComs.addAll(team.getAttributesToStringList(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName()));
+ }
+ }
+ setAttributeValues(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName(), userComs);
+ }
+
+ public void setChangeType(ChangeType type) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), type.name());
+ }
+
+ public ChangeType getChangeType() throws OseeCoreException {
+ return ChangeType.getChangeType(getSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ public PriorityType getPriority() throws OseeCoreException {
+ return PriorityType.getPriority(getSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ public void setPriority(PriorityType type) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), type.getShortName());
+ }
+
+ public Collection<TeamWorkFlowArtifact> getTeamWorkFlowArtifacts() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.ActionToWorkflow_WorkFlow, TeamWorkFlowArtifact.class);
+ }
+
+ public String getWorldViewType() throws OseeCoreException {
+ return ARTIFACT_NAME;
+ }
+
+ public String getWorldViewTitle() throws OseeCoreException {
+ return getDescriptiveName();
+ }
+
+ public ChangeType getWorldViewChangeType() throws OseeCoreException {
+ return ChangeType.getChangeType(getSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewBranchStatus()
+ */
+ public String getWorldViewBranchStatus() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getWorldViewBranchStatus().equals("")) sb.append(team.getWorldViewBranchStatus() + ", ");
+ }
+ return sb.toString().replaceFirst(", $", "");
+ }
+
+ public String getWorldViewNumberOfTasks() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getWorldViewNumberOfTasks().equals("")) {
+ sb.append(team.getWorldViewNumberOfTasks() + ", ");
+ }
+ }
+ return sb.toString().replaceFirst(", $", "");
+ }
+
+ public String getWorldViewState() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewState());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public String getWorldViewDaysInCurrentState() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewDaysInCurrentState());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ @Override
+ public String getWorldViewActivePoc() throws OseeCoreException {
+ Set<User> pocs = new HashSet<User>();
+ Set<User> implementers = new HashSet<User>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (team.getSmaMgr().isCancelledOrCompleted()) {
+ implementers.addAll(team.getImplementers());
+ } else {
+ pocs.addAll(team.getSmaMgr().getStateMgr().getAssignees());
+ }
+ }
+ return Artifacts.toString("; ", pocs) + (implementers.size() > 0 ? "(" + Artifacts.toString("; ", implementers) + ")" : "");
+ }
+
+ public String getWorldViewCreatedDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ Date date = team.getWorldViewCreatedDate();
+ if (date == null) {
+ strs.add("");
+ } else {
+ strs.add(XDate.getDateStr(team.getWorldViewCreatedDate(), XDate.MMDDYYHHMM));
+ }
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public Date getWorldViewCreatedDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewCreatedDate();
+ }
+
+ public String getWorldViewID() throws OseeCoreException {
+ return getHumanReadableId();
+ }
+
+ public String getWorldViewPriority() throws OseeCoreException {
+ return PriorityType.getPriority(getSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), "")).getShortName();
+ }
+
+ public Image getAssigneeImage() throws OseeCoreException {
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ Image image = team.getAssigneeImage();
+ if (image != null) return image;
+ }
+ return null;
+ }
+
+ public String getWorldViewUserCommunity() throws OseeCoreException {
+ return getAttributesToString(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName());
+ }
+
+ public String getWorldViewActionableItems() throws OseeCoreException {
+ Set<ActionableItemArtifact> aias = new HashSet<ActionableItemArtifact>();
+ // Roll up if same for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ aias.addAll(team.getActionableItemsDam().getActionableItems());
+ }
+ return Artifacts.commaArts(aias);
+ }
+
+ @Override
+ public void atsDelete(Set<Artifact> deleteArts, Map<Artifact, Object> allRelated) throws OseeCoreException {
+ super.atsDelete(deleteArts, allRelated);
+ // Delete all products
+ for (TeamWorkFlowArtifact art : getRelatedArtifacts(AtsRelation.ActionToWorkflow_WorkFlow,
+ TeamWorkFlowArtifact.class))
+ art.atsDelete(deleteArts, allRelated);
+ }
+
+ public String getWorldViewTeam() throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teams = new HashSet<TeamDefinitionArtifact>();
+ // Roll up if same for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ teams.add(team.getTeamDefinition());
+ }
+ return Artifacts.commaArts(teams);
+ }
+
+ public String getWorldViewOriginator() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewOriginator());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ @Override
+ public String getWorldViewCompletedDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewCompletedDateStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ @Override
+ public Date getWorldViewCompletedDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewCompletedDate();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewCancelledDateStr()
+ */
+ public String getWorldViewCancelledDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewCancelledDateStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public Date getWorldViewCancelledDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewCancelledDate();
+ }
+
+ public String getWorldViewResolution() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewResolution());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewRemainHours()
+ */
+ public double getWorldViewRemainHours() throws OseeCoreException {
+ double hours = 0;
+ // Add up hours for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ hours += team.getWorldViewRemainHours();
+ }
+ return hours;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewManDaysNeeded()
+ */
+ public double getWorldViewManDaysNeeded() throws OseeCoreException {
+ double hours = 0;
+ // Add up hours for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ hours += team.getWorldViewManDaysNeeded();
+ }
+ return hours;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewEstimatedHours()
+ */
+ public double getWorldViewEstimatedHours() throws OseeCoreException {
+ double hours = 0;
+ // Add up hours for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ hours += team.getWorldViewEstimatedHours();
+ }
+ return hours;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewStatePercentComplete()
+ */
+ public int getWorldViewStatePercentComplete() throws OseeCoreException {
+ if (getTeamWorkFlowArtifacts().size() == 1)
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewStatePercentComplete();
+ else {
+ double percent = 0;
+ int items = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ SMAManager smaMgr = new SMAManager(team);
+ if (!smaMgr.isCancelled()) {
+ percent += team.getWorldViewStatePercentComplete();
+ items++;
+ }
+ }
+ if (items > 0) {
+ Double rollPercent = percent / items;
+ return rollPercent.intValue();
+ }
+ }
+ return 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewRelatedToState()
+ */
+ public String getWorldViewRelatedToState() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewNotes()
+ */
+ @Override
+ public String getWorldViewNotes() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewNotes());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewGroups()
+ */
+ @Override
+ public String getWorldViewGroups() throws OseeCoreException {
+ Set<Artifact> groups = new HashSet<Artifact>();
+ groups.addAll(getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__GROUP));
+ // Roll up if same for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ groups.addAll(team.getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__GROUP));
+ }
+ return Artifacts.toString("; ", groups);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewCategory()
+ */
+ public String getWorldViewCategory() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewCategory());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public String getWorldViewWorkPackage() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewWorkPackage());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public String getWorldViewCategory2() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewCategory2());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public String getWorldViewCategory3() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewCategory3());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewVersion()
+ */
+ public String getWorldViewTargetedVersionStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewTargetedVersionStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperName()
+ */
+ public String getHyperName() {
+ return getDescriptiveName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperType()
+ */
+ public String getHyperType() {
+ try {
+ return getArtifactTypeName();
+ } catch (Exception ex) {
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperState()
+ */
+ public String getHyperState() {
+ try {
+ if (getTeamWorkFlowArtifacts().size() == 1) {
+ return getTeamWorkFlowArtifacts().iterator().next().getHyperState();
+ }
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperTargetVersion()
+ */
+ @Override
+ public String getHyperTargetVersion() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperAssignee()
+ */
+ public String getHyperAssignee() {
+ try {
+ if (getTeamWorkFlowArtifacts().size() == 1) {
+ return getTeamWorkFlowArtifacts().iterator().next().getHyperAssignee();
+ }
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperAssigneeImage()
+ */
+ public Image getHyperAssigneeImage() throws OseeCoreException {
+ if (getTeamWorkFlowArtifacts().size() == 1) {
+ return getTeamWorkFlowArtifacts().iterator().next().getHyperAssigneeImage();
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperArtifact()
+ */
+ public Artifact getHyperArtifact() {
+ return this;
+ }
+
+ public Result editActionableItems() throws OseeCoreException {
+ final AICheckTreeDialog diag =
+ new AICheckTreeDialog(
+ "Add Impacted Actionable Items",
+ "Select New Impacted Actionable Items\n\n" + "Note: Un-selecting existing items will NOT remove the impact.\n" + "Team Workflow with no impact should be transitioned to Cancelled.",
+ Active.Active);
+
+ diag.setInitialAias(getActionableItems());
+ if (diag.open() != 0) return Result.FalseResult;
+
+ // ensure that at least one actionable item exists for each team after aias added/removed
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ Set<ActionableItemArtifact> currentAias = team.getActionableItemsDam().getActionableItems();
+ Collection<ActionableItemArtifact> checkedAias = diag.getChecked();
+ for (ActionableItemArtifact aia : new CopyOnWriteArrayList<ActionableItemArtifact>(currentAias)) {
+ if (!checkedAias.contains(aia)) {
+ currentAias.remove(aia);
+ }
+ }
+ if (currentAias.size() == 0) {
+ return new Result("Can not remove all actionable items for a team.\n\nActionable Items will go to 0 for [" +
+ //
+ team.getTeamName() + "][" + team.getHumanReadableId() + "]\n\nCancel team workflow instead.");
+ }
+ }
+
+ final StringBuffer sb = new StringBuffer();
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+
+ // Add new aias
+ for (ActionableItemArtifact aia : diag.getChecked()) {
+ Result result = addActionableItemToTeamsOrAddTeams(aia, transaction);
+ sb.append(result.getText());
+ }
+ // Remove unchecked aias
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ for (ActionableItemArtifact aia : team.getActionableItemsDam().getActionableItems()) {
+ if (!diag.getChecked().contains(aia)) {
+ team.getActionableItemsDam().removeActionableItem(aia);
+ }
+ }
+ team.persistAttributes(transaction);
+ }
+
+ transaction.execute();
+ return new Result(true, sb.toString());
+ }
+
+ public Result addActionableItemToTeamsOrAddTeams(ActionableItemArtifact aia, SkynetTransaction transaction) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (TeamDefinitionArtifact tda : TeamDefinitionArtifact.getImpactedTeamDefs(Arrays.asList(aia))) {
+ boolean teamExists = false;
+ // Look for team workflow that is associated with this tda
+ for (TeamWorkFlowArtifact teamArt : getTeamWorkFlowArtifacts()) {
+ // If found
+ if (teamArt.getTeamDefinition().equals(tda)) {
+ // And workflow doesn't already have this actionable item,
+ // ADD it
+ if (!teamArt.getActionableItemsDam().getActionableItems().contains(aia)) {
+ teamArt.getActionableItemsDam().addActionableItem(aia);
+ teamArt.saveSMA(transaction);
+ sb.append(aia.getDescriptiveName() + " => added to existing team workflow \"" + tda.getDescriptiveName() + "\"\n");
+ teamExists = true;
+ } else {
+ sb.append(aia.getDescriptiveName() + " => already exists in team workflow \"" + tda.getDescriptiveName() + "\"\n");
+ teamExists = true;
+ }
+ }
+ }
+ if (!teamExists) {
+ createTeamWorkflow(tda, Arrays.asList(aia), tda.getLeads(), transaction);
+ sb.append(aia.getDescriptiveName() + " => added team workflow \"" + tda.getDescriptiveName() + "\"\n");
+ }
+ }
+ return new Result(true, sb.toString());
+ }
+
+ public TeamWorkFlowArtifact createTeamWorkflow(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems, Collection<User> assignees, SkynetTransaction transaction, CreateTeamOption... createTeamOption) throws OseeCoreException {
+ String teamWorkflowArtifactName = TeamWorkFlowArtifact.ARTIFACT_NAME;
+ IAtsTeamWorkflow teamExt = null;
+
+ // Check if any plugins want to create the team workflow themselves
+ for (IAtsTeamWorkflow teamExtension : TeamWorkflowExtensions.getInstance().getAtsTeamWorkflowExtensions()) {
+ boolean isResponsible = false;
+ try {
+ isResponsible = teamExtension.isResponsibleForTeamWorkflowCreation(teamDef, actionableItems);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.WARNING, ex);
+ }
+ if (isResponsible) {
+ teamWorkflowArtifactName = teamExtension.getTeamWorkflowArtifactName(teamDef, actionableItems);
+ teamExt = teamExtension;
+ }
+ }
+
+ // NOTE: The persist of the workflow will auto-email the assignees
+ TeamWorkFlowArtifact teamArt =
+ createTeamWorkflow(teamDef, actionableItems, assignees, teamWorkflowArtifactName, transaction,
+ createTeamOption);
+ // Notify extension that workflow was created
+ if (teamExt != null) teamExt.teamWorkflowCreated(teamArt);
+ return teamArt;
+ }
+
+ public TeamWorkFlowArtifact createTeamWorkflow(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems, Collection<User> assignees, String artifactName, SkynetTransaction transaction, CreateTeamOption... createTeamOption) throws OseeCoreException {
+ return createTeamWorkflow(teamDef, actionableItems, assignees, null, null, artifactName, transaction,
+ createTeamOption);
+ }
+
+ public TeamWorkFlowArtifact createTeamWorkflow(TeamDefinitionArtifact teamDef, Collection<ActionableItemArtifact> actionableItems, Collection<User> assignees, String guid, String hrid, String artifactName, SkynetTransaction transaction, CreateTeamOption... createTeamOption) throws OseeCoreException {
+
+ if (!Collections.getAggregate(createTeamOption).contains(CreateTeamOption.Duplicate_If_Exists)) {
+ // Make sure team doesn't already exist
+ for (TeamWorkFlowArtifact teamArt : getTeamWorkFlowArtifacts()) {
+ if (teamArt.getTeamDefinition().equals(teamDef)) {
+ AWorkbench.popup("ERROR", "Team already exist");
+ throw new IllegalArgumentException(
+ "Team \"" + teamDef + "\" already exists for Action " + getHumanReadableId());
+ }
+ }
+ }
+
+ TeamWorkFlowArtifact teamArt = null;
+ if (guid == null)
+ teamArt = (TeamWorkFlowArtifact) ArtifactTypeManager.addArtifact(artifactName, AtsPlugin.getAtsBranch());
+ else
+ teamArt =
+ (TeamWorkFlowArtifact) ArtifactTypeManager.addArtifact(artifactName, AtsPlugin.getAtsBranch(), guid,
+ hrid);
+ setArtifactIdentifyData(this, teamArt);
+
+ teamArt.getSmaMgr().getLog().addLog(LogType.Originated, "", "");
+
+ // Relate Workflow to ActionableItems (by guid) if team is responsible
+ // for that AI
+ for (ActionableItemArtifact aia : actionableItems)
+ if (aia.getImpactedTeamDefs().contains(teamDef)) teamArt.getActionableItemsDam().addActionableItem(aia);
+
+ // Initialize state machine
+ teamArt.getSmaMgr().getStateMgr().initializeStateMachine(DefaultTeamState.Endorse.name(), assignees);
+ teamArt.getSmaMgr().getLog().addLog(LogType.StateEntered, DefaultTeamState.Endorse.name(), "");
+
+ // Relate WorkFlow to Team Definition (by guid due to relation loading
+ // issues)
+ teamArt.setTeamDefinition(teamDef);
+
+ // Relate Action to WorkFlow
+ addRelation(AtsRelation.ActionToWorkflow_WorkFlow, teamArt);
+
+ teamArt.persistAttributesAndRelations(transaction);
+
+ return teamArt;
+ }
+
+ /**
+ * Set Team Workflow attributes off given action artifact
+ *
+ * @param fromAction
+ * @param toTeam
+ * @throws OseeArgumentException
+ */
+ public static void setArtifactIdentifyData(ActionArtifact fromAction, TeamWorkFlowArtifact toTeam) throws OseeCoreException {
+ String priorityStr = fromAction.getSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), "");
+ PriorityType priType = null;
+ if (priorityStr.equals(""))
+ priType = null;
+ else if (!priorityStr.equals(""))
+ priType = PriorityType.getPriority(priorityStr);
+ else
+ throw new OseeArgumentException("Invalid priority => " + priorityStr);
+ setArtifactIdentifyData(toTeam, fromAction.getDescriptiveName(), fromAction.getSoleAttributeValue(
+ ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), ""),
+ ChangeType.getChangeType(fromAction.getSoleAttributeValue(
+ ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), "")), priType,
+ fromAction.getAttributesToStringList(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName()),
+ fromAction.getSoleAttributeValue(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), false),
+ fromAction.getSoleAttributeValue(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName(), null, Date.class));
+ }
+
+ /**
+ * Since there is no shared attribute yet, action and workflow arts are all populate with identify data
+ *
+ * @param art
+ */
+ public static void setArtifactIdentifyData(Artifact art, String title, String desc, ChangeType changeType, PriorityType priority, Collection<String> userComms, Boolean validationRequired, Date needByDate) throws OseeCoreException {
+ art.setDescriptiveName(title);
+ if (!desc.equals("")) art.setSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), desc);
+ art.setSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), changeType.name());
+ art.setAttributeValues(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName(), userComms);
+ if (priority != null) art.setSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(),
+ priority.getShortName());
+ if (needByDate != null) art.setSoleAttributeValue(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName(), needByDate);
+ if (validationRequired) art.setSoleAttributeValue(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(),
+ true);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDecision()
+ */
+ public String getWorldViewDecision() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact#getParentSMArt()
+ */
+ public Artifact getParentAtsArtifact() throws OseeCoreException {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDescription()
+ */
+ public String getWorldViewDescription() throws OseeCoreException {
+ try {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewValidationRequired()
+ */
+ public String getWorldViewValidationRequiredStr() throws OseeCoreException {
+ try {
+ return String.valueOf(getSoleAttributeValue(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), false));
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ }
+
+ @Override
+ public Date getWorldViewEstimatedReleaseDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewEstimatedReleaseDate();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewEstimatedCompletionDateStr()
+ */
+ public String getWorldViewEstimatedCompletionDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewEstimatedCompletionDateStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ @Override
+ public Date getWorldViewEstimatedCompletionDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewEstimatedCompletionDate();
+ }
+
+ @Override
+ public String getWorldViewReleaseDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewReleaseDateStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ public Date getWorldViewReleaseDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewReleaseDate();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewEstimatedReleaseDateStr()
+ */
+ public String getWorldViewEstimatedReleaseDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewEstimatedReleaseDateStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#isWorldViewRemainHoursValid()
+ */
+ public Result isWorldViewRemainHoursValid() throws OseeCoreException {
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (team.isWorldViewRemainHoursValid().isFalse()) {
+ return team.isWorldViewRemainHoursValid();
+ }
+ }
+ return Result.TrueResult;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#isWorldViewManDaysNeededValid()
+ */
+ public Result isWorldViewManDaysNeededValid() {
+ try {
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts())
+ if (team.isWorldViewManDaysNeededValid().isFalse()) return team.isWorldViewManDaysNeededValid();
+ } catch (OseeCoreException ex) {
+ // Do nothing
+ }
+ return Result.TrueResult;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewChangeTypeStr()
+ */
+ public String getWorldViewChangeTypeStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewChangeTypeStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewImplementer()
+ */
+ public String getWorldViewImplementer() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewImplementer());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDate()
+ */
+ public Date getWorldViewDeadlineDate() throws OseeCoreException {
+ return getTeamWorkFlowArtifacts().iterator().next().getWorldViewDeadlineDate();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDateStr()
+ */
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewDeadlineDateStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewWeeklyBenefit()
+ */
+ public double getWorldViewWeeklyBenefit() throws OseeCoreException {
+ double hours = 0;
+ // Add up hours for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ SMAManager smaMgr = new SMAManager(team);
+ if (!smaMgr.isCompleted() && !smaMgr.isCancelled()) {
+ hours += team.getWorldViewWeeklyBenefit();
+ }
+ }
+ return hours;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewAnnualCostAvoidance()
+ */
+ public double getWorldViewAnnualCostAvoidance() throws OseeCoreException {
+ double hours = 0;
+ // Add up hours for all children
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ SMAManager smaMgr = new SMAManager(team);
+ if (!smaMgr.isCompleted() && !smaMgr.isCancelled()) {
+ hours += team.getWorldViewAnnualCostAvoidance();
+ }
+ }
+ return hours;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#isWorldViewAnnualCostAvoidanceValid()
+ */
+ public Result isWorldViewAnnualCostAvoidanceValid() throws OseeCoreException {
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ Result result = team.isWorldViewAnnualCostAvoidanceValid();
+ if (result.isFalse()) return result;
+ }
+ return Result.TrueResult;
+ }
+
+ @Override
+ public Set<ArtifactAnnotation> getAnnotations() throws OseeCoreException {
+ Set<ArtifactAnnotation> notifications = super.getAnnotations();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ notifications.addAll(team.getAnnotations());
+ }
+ return notifications;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#isWorldViewDeadlineAlerting()
+ */
+ public Result isWorldViewDeadlineAlerting() throws OseeCoreException {
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ Result result = team.isWorldViewDeadlineAlerting();
+ if (result.isTrue()) return result;
+ }
+ return Result.FalseResult;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewLegacyPCR()
+ */
+ public String getWorldViewLegacyPCR() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewLegacyPCR());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentReworkStr()
+ */
+ public String getWorldViewPercentReworkStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ strs.add(team.getWorldViewPercentReworkStr());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentRework()
+ */
+ public int getWorldViewPercentRework() throws OseeCoreException {
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewAuthor()
+ */
+ public String getWorldViewReviewAuthor() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewDecider()
+ */
+ public String getWorldViewReviewDecider() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewModerator()
+ */
+ public String getWorldViewReviewModerator() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewReviewer()
+ */
+ public String getWorldViewReviewReviewer() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentState()
+ */
+ @Override
+ public double getWorldViewHoursSpentState() throws OseeCoreException {
+ double hours = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ hours += team.getWorldViewHoursSpentState();
+ }
+ }
+ return hours;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentStateReview()
+ */
+ @Override
+ public double getWorldViewHoursSpentStateReview() throws OseeCoreException {
+ double hours = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ hours += team.getWorldViewHoursSpentStateReview();
+ }
+ }
+ return hours;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentStateTask()
+ */
+ @Override
+ public double getWorldViewHoursSpentStateTask() throws OseeCoreException {
+ double hours = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ hours += team.getWorldViewHoursSpentStateTask();
+ }
+ }
+ return hours;
+ }
+
+ @Override
+ public double getWorldViewHoursSpentStateTotal() throws OseeCoreException {
+ double hours = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ hours += team.getWorldViewHoursSpentStateTotal();
+ }
+ }
+ return hours;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentTotal()
+ */
+ @Override
+ public double getWorldViewHoursSpentTotal() throws OseeCoreException {
+ double hours = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ hours += team.getWorldViewHoursSpentTotal();
+ }
+ }
+ return hours;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteState()
+ */
+ @Override
+ public int getWorldViewPercentCompleteState() throws OseeCoreException {
+ double percent = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ percent += team.getWorldViewPercentCompleteState();
+ }
+ }
+ if (percent == 0) return 0;
+ Double rollPercent = percent / getTeamWorkFlowArtifacts().size();
+ return rollPercent.intValue();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteStateReview()
+ */
+ @Override
+ public int getWorldViewPercentCompleteStateReview() throws OseeCoreException {
+ double percent = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ percent += team.getWorldViewPercentCompleteStateReview();
+ }
+ }
+ if (percent == 0) return 0;
+ Double rollPercent = percent / getTeamWorkFlowArtifacts().size();
+ return rollPercent.intValue();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteStateTask()
+ */
+ @Override
+ public int getWorldViewPercentCompleteStateTask() throws OseeCoreException {
+ double percent = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ percent += team.getWorldViewPercentCompleteStateTask();
+ }
+ }
+ if (percent == 0) return 0;
+ Double rollPercent = percent / getTeamWorkFlowArtifacts().size();
+ return rollPercent.intValue();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteTotal()
+ */
+ @Override
+ public int getWorldViewPercentCompleteTotal() throws OseeCoreException {
+ double percent = 0;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (!team.getSmaMgr().isCancelled()) {
+ percent += team.getWorldViewPercentCompleteTotal();
+ }
+ }
+ if (percent == 0) return 0;
+ Double rollPercent = percent / getTeamWorkFlowArtifacts().size();
+ return rollPercent.intValue();
+ }
+
+ public String getWorldViewLastUpdated() throws OseeCoreException {
+ return XDate.getDateStr(getLastModified(), XDate.MMDDYYHHMM);
+ }
+
+ public String getWorldViewLastStatused() throws OseeCoreException {
+ return "(see children)";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewTargetedVersion()
+ */
+ @Override
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException {
+ return null;
+ }
+
+ public String getWorldViewNumberOfReviewIssueDefects() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewNumberOfReviewMajorDefects() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewNumberOfReviewMinorDefects() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public String getWorldViewActionsIntiatingWorkflow() throws OseeCoreException {
+ Date earliestDate = null;
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (earliestDate == null || team.getSmaMgr().getLog().getCreationDate().before(earliestDate)) {
+ earliestDate = team.getSmaMgr().getLog().getCreationDate();
+ }
+ }
+ List<String> teamNames = new ArrayList<String>();
+ for (TeamWorkFlowArtifact team : getTeamWorkFlowArtifacts()) {
+ if (team.getSmaMgr().getLog().getCreationDate().equals(earliestDate)) {
+ teamNames.add(team.getTeamName());
+ }
+ }
+ return Collections.toString("; ", teamNames);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewParentID()
+ */
+ @Override
+ public String getWorldViewParentID() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewParentState()
+ */
+ @Override
+ public String getWorldViewParentState() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public String getWorldViewOriginatingWorkflowStr() throws OseeCoreException {
+ Set<String> strs = new HashSet<String>();
+ for (TeamWorkFlowArtifact team : getWorldViewOriginatingWorkflows()) {
+ strs.add(team.getWorldViewTeam());
+ }
+ return Collections.toString(";", strs);
+ }
+
+ @Override
+ public Collection<TeamWorkFlowArtifact> getWorldViewOriginatingWorkflows() throws OseeCoreException {
+ if (getTeamWorkFlowArtifacts().size() == 1) return getTeamWorkFlowArtifacts();
+ Collection<TeamWorkFlowArtifact> results = new ArrayList<TeamWorkFlowArtifact>();
+ Date origDate = null;
+ for (TeamWorkFlowArtifact teamArt : getTeamWorkFlowArtifacts()) {
+ if (teamArt.getSmaMgr().isCancelled()) continue;
+ if (origDate == null || teamArt.getWorldViewCreatedDate().before(origDate)) {
+ results.clear();
+ origDate = teamArt.getWorldViewCreatedDate();
+ results.add(teamArt);
+ } else if (origDate.equals(teamArt.getWorldViewCreatedDate())) {
+ results.add(teamArt);
+ }
+ }
+ return results;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionableItemArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionableItemArtifact.java
new file mode 100644
index 00000000000..304c0b39d4c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ActionableItemArtifact.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.ats.artifact;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionableItemArtifact extends Artifact {
+
+ public static String ARTIFACT_NAME = "Actionable Item";
+ public static String TOP_AI_STATIC_ID = "osee.ats.TopActionableItem";
+ public static Set<ActionableItemArtifact> EMPTY_SET = new HashSet<ActionableItemArtifact>();
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public ActionableItemArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public static List<ActionableItemArtifact> getActionableItems(Active active) throws OseeCoreException {
+ return AtsCache.getArtifactsByActive(active, ActionableItemArtifact.class);
+ }
+
+ public static String getNotActionableItemError(Artifact aia) {
+ return "Action can not be written against " + aia.getArtifactTypeName() + " \"" + aia + "\" (" + aia.getHumanReadableId() + ").\n\nChoose another item.";
+ }
+
+ public static Set<ActionableItemArtifact> getTopLevelActionableItems(Active active) throws OseeCoreException {
+ ActionableItemArtifact topAi = getTopActionableItem();
+ if (topAi == null) return EMPTY_SET;
+ return AtsLib.getActiveSet(Artifacts.getChildrenOfTypeSet(topAi, ActionableItemArtifact.class, false), active,
+ ActionableItemArtifact.class);
+ }
+
+ public Collection<User> getLeads() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.TeamLead_Lead, User.class);
+ }
+
+ public static ActionableItemArtifact getTopActionableItem() throws OseeCoreException {
+ return (ActionableItemArtifact) StaticIdManager.getSingletonArtifactOrException(
+ ActionableItemArtifact.ARTIFACT_NAME, TOP_AI_STATIC_ID, AtsPlugin.getAtsBranch());
+ }
+
+ public static List<ActionableItemArtifact> getActionableItems() throws OseeCoreException {
+ return AtsCache.getArtifactsByActive(Active.Both, ActionableItemArtifact.class);
+ }
+
+ public boolean isActionable() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.ACTIONABLE_ATTRIBUTE.getStoreName(), false);
+ }
+
+ public static Set<ActionableItemArtifact> getActionableItems(Collection<String> actionableItemNames) throws OseeCoreException {
+ Set<ActionableItemArtifact> aias = new HashSet<ActionableItemArtifact>();
+ for (String actionableItemName : actionableItemNames) {
+ aias.addAll(AtsCache.getArtifactsByName(actionableItemName, ActionableItemArtifact.class));
+ }
+ return aias;
+ }
+
+ public static Collection<TeamDefinitionArtifact> getImpactedTeamDefs(Collection<ActionableItemArtifact> aias) throws OseeCoreException {
+ return TeamDefinitionArtifact.getImpactedTeamDefs(aias);
+ }
+
+ public Collection<TeamDefinitionArtifact> getImpactedTeamDefs() throws OseeCoreException {
+ return TeamDefinitionArtifact.getImpactedTeamDefs(Arrays.asList(this));
+ }
+
+ public static Set<TeamDefinitionArtifact> getTeamsFromItemAndChildren(ActionableItemArtifact aia) throws OseeCoreException {
+ return TeamDefinitionArtifact.getTeamsFromItemAndChildren(aia);
+ }
+
+ public static Set<ActionableItemArtifact> getActionableItemsFromItemAndChildren(ActionableItemArtifact aia) throws OseeCoreException {
+ Set<ActionableItemArtifact> aias = new HashSet<ActionableItemArtifact>();
+ getActionableItemsFromItemAndChildren(aia, aias);
+ return aias;
+ }
+
+ public static void getActionableItemsFromItemAndChildren(ActionableItemArtifact aia, Set<ActionableItemArtifact> aiaTeams) throws OseeCoreException {
+ for (Artifact art : aia.getChildren()) {
+ if (art instanceof ActionableItemArtifact) {
+ aiaTeams.add((ActionableItemArtifact) art);
+ for (Artifact childArt : aia.getChildren()) {
+ if (childArt instanceof ActionableItemArtifact) getActionableItemsFromItemAndChildren(
+ (ActionableItemArtifact) childArt, aiaTeams);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/AtsArtifactFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/AtsArtifactFactory.java
new file mode 100644
index 00000000000..cfc8f0b2f5a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/AtsArtifactFactory.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.ats.artifact;
+
+import java.util.Arrays;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AtsArtifactFactory extends ArtifactFactory {
+
+ public AtsArtifactFactory() {
+ super(Arrays.asList(ActionArtifact.ARTIFACT_NAME, PeerToPeerReviewArtifact.ARTIFACT_NAME,
+ DecisionReviewArtifact.ARTIFACT_NAME, ActionableItemArtifact.ARTIFACT_NAME, TaskArtifact.ARTIFACT_NAME,
+ TeamWorkFlowArtifact.ARTIFACT_NAME, TeamDefinitionArtifact.ARTIFACT_NAME, VersionArtifact.ARTIFACT_NAME,
+ ActionableItemArtifact.ARTIFACT_NAME));
+ }
+
+ @Override
+ public Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException {
+ if (artifactType.getName().equals(ActionArtifact.ARTIFACT_NAME)) return new ActionArtifact(this, guid,
+ humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(TaskArtifact.ARTIFACT_NAME)) return new TaskArtifact(this, guid,
+ humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(TeamWorkFlowArtifact.ARTIFACT_NAME)) return new TeamWorkFlowArtifact(this,
+ guid, humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(TeamDefinitionArtifact.ARTIFACT_NAME)) return new TeamDefinitionArtifact(this,
+ guid, humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(VersionArtifact.ARTIFACT_NAME)) return new VersionArtifact(this, guid,
+ humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(ActionableItemArtifact.ARTIFACT_NAME)) return new ActionableItemArtifact(this,
+ guid, humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(DecisionReviewArtifact.ARTIFACT_NAME)) return new DecisionReviewArtifact(this,
+ guid, humandReadableId, branch, artifactType);
+ if (artifactType.getName().equals(PeerToPeerReviewArtifact.ARTIFACT_NAME)) return new PeerToPeerReviewArtifact(
+ this, guid, humandReadableId, branch, artifactType);
+ throw new OseeArgumentException("did not recognize the artifact type: " + artifactType.getName());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java
new file mode 100644
index 00000000000..14281f6f081
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewArtifact.java
@@ -0,0 +1,249 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.XDecisionOptions;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSStateMachineArtifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DecisionReviewArtifact extends ReviewSMArtifact implements IReviewArtifact, IWorldViewArtifact, IATSStateMachineArtifact {
+
+ public static String ARTIFACT_NAME = "Decision Review";
+ public XDecisionOptions decisionOptions;
+ public static enum DecisionReviewState {
+ Prepare, Decision, Followup, Completed
+ };
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public DecisionReviewArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ decisionOptions = new XDecisionOptions(this);
+ }
+
+ @Override
+ public TeamWorkFlowArtifact getParentTeamWorkflow() throws OseeCoreException {
+ Collection<TeamWorkFlowArtifact> teamArts =
+ getRelatedArtifacts(AtsRelation.TeamWorkflowToReview_Team, TeamWorkFlowArtifact.class);
+ if (teamArts.size() == 0) throw new OseeStateException(
+ "Decision Review " + getHumanReadableId() + " has no parent workflow");
+ if (teamArts.size() > 1) throw new OseeStateException(
+ "Decision Review " + getHumanReadableId() + " has multiple parent workflows");
+ return teamArts.iterator().next();
+ }
+
+ @Override
+ public String getHelpContext() {
+ return "decisionReview";
+ }
+
+ @Override
+ public Set<User> getPrivilegedUsers() throws OseeCoreException {
+ Set<User> users = new HashSet<User>();
+ if (getParentTeamWorkflow() != null)
+ users.addAll(getParentTeamWorkflow().getPrivilegedUsers());
+ else {
+ if (AtsPlugin.isAtsAdmin()) {
+ users.add(UserManager.getUser());
+ }
+ }
+ return users;
+ }
+
+ @Override
+ public String getHyperName() {
+ return getDescriptiveName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewTeam()
+ */
+ @Override
+ public String getWorldViewTeam() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.artifact.StateMachineArtifact#getParentSMA()
+ */
+ @Override
+ public StateMachineArtifact getParentSMA() throws OseeCoreException {
+ return getParentTeamWorkflow();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDecision()
+ */
+ @Override
+ public String getWorldViewDecision() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DECISION_ATTRIBUTE.getStoreName(), "");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDescription()
+ */
+ @Override
+ public String getWorldViewDescription() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ }
+
+ @Override
+ public String getWorldViewCategory() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public String getWorldViewCategory2() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public String getWorldViewCategory3() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public Date getWorldViewReleaseDate() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException {
+ if (getParentSMA() == null) return null;
+ return getParentSMA().getWorldViewTargetedVersion();
+ }
+
+ @Override
+ public ActionArtifact getParentActionArtifact() throws OseeCoreException {
+ StateMachineArtifact sma = getParentSMA();
+ if (sma instanceof TeamWorkFlowArtifact)
+ return ((TeamWorkFlowArtifact) sma).getParentActionArtifact();
+ else
+ return null;
+ }
+
+ @Override
+ public Collection<User> getImplementers() throws OseeCoreException {
+ return getImplementersByState(DecisionReviewState.Decision.name());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDate()
+ */
+ @Override
+ public Date getWorldViewDeadlineDate() throws OseeCoreException {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDateStr()
+ */
+ @Override
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewWeeklyBenefit()
+ */
+ @Override
+ public double getWorldViewWeeklyBenefit() {
+ return 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewWorkPackage()
+ */
+ @Override
+ public String getWorldViewWorkPackage() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.ats.IReviewArtifact#getArtifact()
+ */
+ public Artifact getArtifact() {
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewAuthor()
+ */
+ @Override
+ public String getWorldViewReviewAuthor() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewDecider()
+ */
+ @Override
+ public String getWorldViewReviewDecider() throws OseeCoreException {
+ return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees(DecisionReviewState.Decision.name()));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewModerator()
+ */
+ @Override
+ public String getWorldViewReviewModerator() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewReviewer()
+ */
+ @Override
+ public String getWorldViewReviewReviewer() throws OseeCoreException {
+ return "";
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewWorkflowManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewWorkflowManager.java
new file mode 100644
index 00000000000..893b434ac59
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/DecisionReviewWorkflowManager.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.ats.artifact;
+
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * Methods in support of programatically transitioning the Decision Review Workflow through it's states. Only to be used
+ * for the DefaultReviewWorkflow of Prepare->Decision->ReWork->Complete
+ *
+ * @author Donald G. Dunne
+ */
+public class DecisionReviewWorkflowManager {
+
+ /**
+ * Quickly transition to a state with minimal metrics and data entered. Should only be used for automated
+ * transitioning for things such as developmental testing and demos.
+ *
+ * @param toState
+ * @param user User to transition to OR null if should use user of current state
+ * @param popup
+ * @return Result
+ * @throws Exception
+ */
+ public static Result transitionTo(DecisionReviewArtifact reviewArt, DecisionReviewArtifact.DecisionReviewState toState, User user, boolean popup, SkynetTransaction transaction) throws OseeCoreException {
+ Result result = Result.TrueResult;
+ // If in Prepare state, set data and transition to Decision
+ if (reviewArt.getSmaMgr().getStateMgr().getCurrentStateName().equals(
+ DecisionReviewArtifact.DecisionReviewState.Prepare.name())) {
+ result = setPrepareStateData(reviewArt, 100, 3, .2);
+
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ result =
+ reviewArt.getSmaMgr().transition(DecisionReviewArtifact.DecisionReviewState.Decision.name(),
+ (user != null ? user : reviewArt.getSmaMgr().getStateMgr().getAssignees().iterator().next()),
+ transaction, TransitionOption.None);
+ }
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ if (toState == DecisionReviewArtifact.DecisionReviewState.Decision) return Result.TrueResult;
+
+ // If desired to transition to follow-up, then decision is false
+ boolean decision = (toState != DecisionReviewArtifact.DecisionReviewState.Followup);
+
+ result = setDecisionStateData(reviewArt, decision, 100, .2);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+
+ result =
+ reviewArt.getSmaMgr().transition(toState.name(),
+ (user != null ? user : reviewArt.getSmaMgr().getStateMgr().getAssignees().iterator().next()),
+ transaction, TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ return Result.TrueResult;
+ }
+
+ public static Result setPrepareStateData(DecisionReviewArtifact reviewArt, int statePercentComplete, double estimateHours, double stateHoursSpent) throws OseeCoreException {
+ if (!reviewArt.getSmaMgr().getStateMgr().getCurrentStateName().equals(
+ DecisionReviewArtifact.DecisionReviewState.Prepare.name())) return new Result("Action not in Prepare state");
+ reviewArt.setSoleAttributeValue(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(), estimateHours);
+ reviewArt.getSmaMgr().getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+ public static Result setDecisionStateData(DecisionReviewArtifact reviewArt, boolean decision, int statePercentComplete, double stateHoursSpent) throws OseeCoreException {
+ if (!reviewArt.getSmaMgr().getStateMgr().getCurrentStateName().equals(
+ DecisionReviewArtifact.DecisionReviewState.Decision.name())) return new Result(
+ "Action not in Decision state");
+ reviewArt.setSoleAttributeValue(ATSAttributes.DECISION_ATTRIBUTE.getStoreName(), decision ? "Yes" : "No");
+ reviewArt.getSmaMgr().getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IFavoriteableArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IFavoriteableArtifact.java
new file mode 100644
index 00000000000..cd2cbfe146e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IFavoriteableArtifact.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.ats.artifact;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IFavoriteableArtifact {
+
+ public void addFavorite(User u, SkynetTransaction transaction) throws OseeCoreException;
+
+ public void removeFavorite(User u, SkynetTransaction transaction) throws OseeCoreException;
+
+ public boolean isFavorite(User u) throws OseeCoreException;
+
+ public ArrayList<User> getFavorites() throws OseeCoreException;
+
+ public boolean amIFavorite();
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IReviewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IReviewArtifact.java
new file mode 100644
index 00000000000..1aed6c9af5b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/IReviewArtifact.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.ats.artifact;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.ats.util.widgets.defect.DefectManager;
+import org.eclipse.osee.ats.util.widgets.role.UserRoleManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IReviewArtifact {
+
+ public boolean isBlocking() throws OseeCoreException;
+
+ public DefectManager getDefectManager();
+
+ public UserRoleManager getUserRoleManager();
+
+ public Artifact getArtifact();
+
+ public IStatus isUserRoleValid(String namespace) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ISubscribableArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ISubscribableArtifact.java
new file mode 100644
index 00000000000..e95e1b5392a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ISubscribableArtifact.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.ats.artifact;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface ISubscribableArtifact {
+
+ public void addSubscribed(User u, SkynetTransaction transaction) throws OseeCoreException;
+
+ public void removeSubscribed(User u, SkynetTransaction transaction) throws OseeCoreException;
+
+ public boolean isSubscribed(User u) throws OseeCoreException;
+
+ public ArrayList<User> getSubscribed() throws OseeCoreException;
+
+ public boolean amISubscribed();
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/LogItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/LogItem.java
new file mode 100644
index 00000000000..37a26393e50
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/LogItem.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.ats.artifact;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class LogItem {
+
+ private Date date;
+ private String msg;
+ private String state;
+ private User user;
+ private LogType type = LogType.None;
+ private String userId;
+
+ /**
+ * @return the userId
+ */
+ public String getUserId() {
+ return userId;
+ }
+
+ public LogItem() {
+ }
+
+ public LogItem(LogType type, Date date, User user, String state, String msg) throws OseeCoreException {
+ this(type.name(), date.getTime() + "", user.getUserId(), state, msg);
+ }
+
+ public LogItem(LogType type, String date, String userId, String state, String msg) throws OseeCoreException {
+ Long l = new Long(date);
+ this.date = new Date(l.longValue());
+ this.msg = msg;
+ this.state = state;
+ this.userId = userId;
+ this.user = UserManager.getUserByUserId(userId);
+ this.type = type;
+ }
+
+ public LogItem(String type, String date, String userId, String state, String msg) throws OseeCoreException {
+ this(LogType.getType(type), date, userId, state, msg);
+ }
+
+ public String toXml() throws OseeCoreException {
+ return "<type>" + type.name() + "</type><date>" + date.getTime() + "</date><user>" + user.getUserId() + "</user><state>" + (state != null ? state : "") + "</state><msg>" + (msg != null ? msg : "") + "</msg>";
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public String getDate(String pattern) {
+ if (pattern != null) return (new SimpleDateFormat(pattern)).format(date);
+ return date.toString();
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return (msg.equals("") ? "" : msg) + " (" + type + ") " + (state.equals("") ? "" : "from " + state + " ") + "by " + user.getUserId() + " on " + getDate(XDate.MMDDYYHHMM) + "\n";
+ } catch (Exception ex) {
+ return (msg.equals("") ? "" : msg) + " (" + type + ") " + (state.equals("") ? "" : "from " + state + " ");
+ }
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public LogType getType() {
+ return type;
+ }
+
+ public void setType(LogType type) {
+ this.type = type;
+ }
+
+ public String toHTML(String labelFont) {
+ return "NOTE (" + type + "): " + msg + " (" + user.getName() + ")";
+ }
+
+ /**
+ * @param user The user to set.
+ */
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ /**
+ * @return Returns the state.
+ */
+ public String getState() {
+ return state;
+ }
+
+ /**
+ * @param state The state to set.
+ */
+ public void setState(String state) {
+ this.state = state;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/NoteItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/NoteItem.java
new file mode 100644
index 00000000000..6bf542a43a5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/NoteItem.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.ats.artifact;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.ui.skynet.ats.NoteType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+public class NoteItem {
+
+ private Date date;
+ private String state;
+ private String msg;
+ private User user;
+ private NoteType type = NoteType.Other;
+
+ public NoteItem() {
+ }
+
+ public NoteItem(NoteType type, String state, String date, User user, String msg) {
+ Long l = new Long(date);
+ this.date = new Date(l.longValue());
+ this.state = state;
+ this.msg = msg;
+ this.user = user;
+ this.type = type;
+ }
+
+ public NoteItem(String type, String state, String date, User user, String msg) {
+ this(NoteType.getType(type), state, date, user, msg);
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public String getDate(String pattern) {
+ if (pattern != null) return (new SimpleDateFormat(pattern)).format(date);
+ return date.toString();
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ @Override
+ public String toString() {
+ return "Note: \"" + type + "\" from \"" + user.getName() + "\"" + (state.equals("") ? "" : " for \"" + state + "\" state") + " on " + getDate(XDate.MMDDYYHHMM) + " - " + msg;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public NoteType getType() {
+ return type;
+ }
+
+ public void setType(NoteType type) {
+ this.type = type;
+ }
+
+ public String toHTML() {
+ return "<b>Note:</b> \"" + type + "\" from \"" + user.getName() + "\"" + (state.equals("") ? "" : " for \"" + state + "\" state") + " on " + getDate(XDate.MMDDYYHHMM) + " - " + msg;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ /**
+ * @param user the user to set
+ */
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java
new file mode 100644
index 00000000000..509936d45d3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewArtifact.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.defect.DefectManager;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.ats.util.widgets.role.UserRole.Role;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSStateMachineArtifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class PeerToPeerReviewArtifact extends ReviewSMArtifact implements IReviewArtifact, IWorldViewArtifact, IATSStateMachineArtifact {
+
+ public static String ARTIFACT_NAME = "PeerToPeer Review";
+ public static enum PeerToPeerReviewState {
+ Prepare, Review, Completed
+ };
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public PeerToPeerReviewArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ defectManager = new DefectManager(this);
+ }
+
+ public static String getDefaultReviewTitle(SMAManager smaMgr) {
+ return "Review \"" + smaMgr.getSma().getArtifactTypeName() + "\" titled \"" + smaMgr.getSma().getDescriptiveName() + "\"";
+ }
+
+ @Override
+ public TeamWorkFlowArtifact getParentTeamWorkflow() throws OseeCoreException {
+ List<TeamWorkFlowArtifact> teams =
+ getRelatedArtifacts(AtsRelation.TeamWorkflowToReview_Team, TeamWorkFlowArtifact.class);
+ if (teams.size() > 0) {
+ return teams.iterator().next();
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.ReviewSMArtifact#isUserRoleValid()
+ */
+ @Override
+ public IStatus isUserRoleValid(String namespace) throws OseeCoreException {
+ if (getUserRoleManager().getUserRoles(Role.Author).size() <= 0) return new Status(IStatus.ERROR, namespace,
+ "Must have at least one Author");
+ if (getUserRoleManager().getUserRoles(Role.Reviewer).size() <= 0) return new Status(IStatus.ERROR, namespace,
+ "Must have at least one Reviewer");
+ // If in review state, all roles must have hours spent entered
+ if (smaMgr.getStateMgr().getCurrentStateName().equals(
+ PeerToPeerReviewArtifact.PeerToPeerReviewState.Review.name())) {
+ for (UserRole uRole : userRoleManager.getUserRoles()) {
+ if (uRole.getHoursSpent() == null) new Status(IStatus.ERROR, AtsPlugin.PLUGIN_ID,
+ "Hours spent must be entered for each role.");
+ }
+ }
+ return super.isUserRoleValid(namespace);
+ }
+
+ @Override
+ public String getHelpContext() {
+ return "peerToPeerReview";
+ }
+
+ @Override
+ public Set<User> getPrivilegedUsers() throws OseeCoreException {
+ Set<User> users = new HashSet<User>();
+ if (getParentTeamWorkflow() != null)
+ users.addAll(getParentTeamWorkflow().getPrivilegedUsers());
+ else {
+ if (AtsPlugin.isAtsAdmin()) {
+ users.add(UserManager.getUser());
+ }
+ }
+ return users;
+ }
+
+ @Override
+ public String getHyperName() {
+ return getDescriptiveName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewTeam()
+ */
+ @Override
+ public String getWorldViewTeam() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.artifact.StateMachineArtifact#getParentSMA()
+ */
+ @Override
+ public StateMachineArtifact getParentSMA() throws OseeCoreException {
+ return getParentTeamWorkflow();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDescription()
+ */
+ @Override
+ public String getWorldViewDescription() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ }
+
+ @Override
+ public String getWorldViewCategory() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public String getWorldViewCategory2() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public String getWorldViewCategory3() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public Date getWorldViewReleaseDate() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException {
+ if (getParentSMA() == null) return null;
+ return getParentSMA().getWorldViewTargetedVersion();
+ }
+
+ @Override
+ public ActionArtifact getParentActionArtifact() throws OseeCoreException {
+ StateMachineArtifact sma = getParentSMA();
+ if (sma instanceof TeamWorkFlowArtifact)
+ return ((TeamWorkFlowArtifact) sma).getParentActionArtifact();
+ else
+ return null;
+ }
+
+ @Override
+ public Collection<User> getImplementers() throws OseeCoreException {
+ Collection<User> users = getImplementersByState(PeerToPeerReviewState.Review.name());
+ for (UserRole role : userRoleManager.getUserRoles()) {
+ users.add(role.getUser());
+ }
+ return users;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDate()
+ */
+ @Override
+ public Date getWorldViewDeadlineDate() throws OseeCoreException {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDateStr()
+ */
+ @Override
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewWeeklyBenefit()
+ */
+ @Override
+ public double getWorldViewWeeklyBenefit() {
+ return 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.world.IWorldViewArtifact#getWorldViewWorkPackage()
+ */
+ @Override
+ public String getWorldViewWorkPackage() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.ats.IReviewArtifact#getArtifact()
+ */
+ public Artifact getArtifact() {
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewAuthor()
+ */
+ @Override
+ public String getWorldViewReviewAuthor() throws OseeCoreException {
+ return Artifacts.toString("; ", getUserRoleManager().getRoleUsers(Role.Author));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewDecider()
+ */
+ @Override
+ public String getWorldViewReviewDecider() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewModerator()
+ */
+ @Override
+ public String getWorldViewReviewModerator() throws OseeCoreException {
+ return Artifacts.toString("; ", getUserRoleManager().getRoleUsers(Role.Moderator));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewReviewer()
+ */
+ @Override
+ public String getWorldViewReviewReviewer() throws OseeCoreException {
+ return Artifacts.toString("; ", getUserRoleManager().getRoleUsers(Role.Reviewer));
+ }
+
+ @Override
+ public String getWorldViewNumberOfReviewIssueDefects() throws OseeCoreException {
+ return String.valueOf(getDefectManager().getNumIssues());
+ }
+
+ @Override
+ public String getWorldViewNumberOfReviewMajorDefects() throws OseeCoreException {
+ return String.valueOf(getDefectManager().getNumMajor());
+ }
+
+ @Override
+ public String getWorldViewNumberOfReviewMinorDefects() throws OseeCoreException {
+ return String.valueOf(getDefectManager().getNumMinor());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewWorkflowManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewWorkflowManager.java
new file mode 100644
index 00000000000..f654d1121dd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/PeerToPeerReviewWorkflowManager.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.ats.artifact;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * Methods in support of programatically transitioning the Peer Review Workflow through it's states. Only to be used for
+ * the DefaultReviewWorkflow of Prepare->Review->Complete
+ *
+ * @author Donald G. Dunne
+ */
+public class PeerToPeerReviewWorkflowManager {
+
+ /**
+ * Quickly transition to a state with minimal metrics and data entered. Should only be used for automated transition
+ * for things such as developmental testing and demos.
+ *
+ * @param toState
+ * @param user User to transition to OR null if should use user of current state
+ * @param popup
+ * @param transaction
+ * @return Result
+ * @throws Exception
+ */
+ public static Result transitionTo(PeerToPeerReviewArtifact reviewArt, PeerToPeerReviewArtifact.PeerToPeerReviewState toState, Collection<UserRole> roles, Collection<DefectItem> defects, User user, boolean popup, SkynetTransaction transaction) throws OseeCoreException {
+ Result result = setPrepareStateData(reviewArt, roles, "DoThis.java", 100, .2, transaction);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ result =
+ reviewArt.getSmaMgr().transition(PeerToPeerReviewArtifact.PeerToPeerReviewState.Review.name(),
+ (user != null ? user : reviewArt.getSmaMgr().getStateMgr().getAssignees().iterator().next()),
+ transaction, TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ if (toState == PeerToPeerReviewArtifact.PeerToPeerReviewState.Review) return Result.TrueResult;
+
+ result = setReviewStateData(reviewArt, roles, defects, 100, .2, transaction);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+
+ result =
+ reviewArt.getSmaMgr().transition(DefaultTeamState.Completed.name(),
+ (user != null ? user : reviewArt.getSmaMgr().getStateMgr().getAssignees().iterator().next()),
+ transaction, TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ return Result.TrueResult;
+ }
+
+ public static Result setPrepareStateData(PeerToPeerReviewArtifact reviewArt, Collection<UserRole> roles, String reviewMaterials, int statePercentComplete, double stateHoursSpent, SkynetTransaction transaction) throws OseeCoreException {
+ if (!reviewArt.getSmaMgr().getStateMgr().getCurrentStateName().equals("Prepare")) return new Result(
+ "Action not in Prepare state");
+ if (roles != null) for (UserRole role : roles)
+ reviewArt.getUserRoleManager().addOrUpdateUserRole(role, false, transaction);
+ reviewArt.setSoleAttributeValue(ATSAttributes.LOCATION_ATTRIBUTE.getStoreName(), reviewMaterials);
+ reviewArt.getSmaMgr().getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+ public static Result setReviewStateData(PeerToPeerReviewArtifact reviewArt, Collection<UserRole> roles, Collection<DefectItem> defects, int statePercentComplete, double stateHoursSpent, SkynetTransaction transaction) throws OseeCoreException {
+ if (roles != null) for (UserRole role : roles)
+ reviewArt.getUserRoleManager().addOrUpdateUserRole(role, false, transaction);
+ if (defects != null) for (DefectItem defect : defects)
+ reviewArt.getDefectManager().addOrUpdateDefectItem(defect, false, transaction);
+ reviewArt.getSmaMgr().getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ReviewSMArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ReviewSMArtifact.java
new file mode 100644
index 00000000000..6e223e6d5fd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/ReviewSMArtifact.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsNotifyUsers;
+import org.eclipse.osee.ats.util.widgets.XActionableItemsDam;
+import org.eclipse.osee.ats.util.widgets.defect.DefectManager;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.ats.util.widgets.role.UserRoleManager;
+import org.eclipse.osee.ats.util.widgets.role.UserRole.Role;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class ReviewSMArtifact extends TaskableStateMachineArtifact {
+
+ protected DefectManager defectManager;
+ protected UserRoleManager userRoleManager;
+ private XActionableItemsDam actionableItemsDam;
+ private Collection<UserRole> preSaveReviewRoleComplete;
+ public static enum ReviewBlockType {
+ None, Transition, Commit
+ };
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public ReviewSMArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ @Override
+ public void onInitializationComplete() {
+ super.onInitializationComplete();
+ initializeSMA();
+ };
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.Artifact#persistAttributes()
+ */
+ @Override
+ public void onAttributePersist() throws OseeCoreException {
+ super.onAttributePersist();
+ // Since multiple ways exist to change the assignees, notification is performed on the persist
+ if (isDeleted()) {
+ return;
+ }
+ try {
+ notifyReviewersComplete();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void initalizePreSaveCache() {
+ super.initalizePreSaveCache();
+ try {
+ preSaveReviewRoleComplete = getRoleUsersReviewComplete();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private Collection<UserRole> getRoleUsersReviewComplete() throws OseeCoreException {
+ if (!(this instanceof ReviewSMArtifact)) return Collections.emptyList();
+ return (this).getUserRoleManager().getRoleUsersReviewComplete();
+ }
+
+ public void notifyReviewersComplete() throws OseeCoreException {
+ if (!(this instanceof ReviewSMArtifact)) return;
+ UserRoleManager userRoleManager = (this).getUserRoleManager();
+ if (!preSaveReviewRoleComplete.equals(userRoleManager.getRoleUsersReviewComplete())) {
+ //all reviewers are complete; send notification to author/moderator
+ if (userRoleManager.getUserRoles(Role.Reviewer).equals(userRoleManager.getRoleUsersReviewComplete())) {
+ AtsNotifyUsers.notify(this, AtsNotifyUsers.NotifyType.Reviewed);
+ }
+ }
+ preSaveReviewRoleComplete = userRoleManager.getRoleUsersReviewComplete();
+ }
+
+ /**
+ * Reset managers for case where artifact is re-loaded/initialized (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#initialize()
+ */
+ @Override
+ protected void initializeSMA() {
+ super.initializeSMA();
+ defectManager = new DefectManager(this);
+ userRoleManager = new UserRoleManager(this);
+ actionableItemsDam = new XActionableItemsDam(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getArtifactSuperTypeName()
+ */
+ @Override
+ public String getArtifactSuperTypeName() {
+ return "Review";
+ }
+
+ public boolean isBlocking() throws OseeCoreException {
+ return getReviewBlockType() != ReviewBlockType.None;
+ }
+
+ public ReviewBlockType getReviewBlockType() throws OseeCoreException {
+ String typeStr = getSoleAttributeValue(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getStoreName(), null);
+ if (typeStr == null) {
+ // Check old attribute value
+ if (getSoleAttributeValue(ATSAttributes.BLOCKING_REVIEW_ATTRIBUTE.getStoreName(), false) == true) {
+ return ReviewBlockType.Transition;
+ }
+ return ReviewBlockType.None;
+ }
+ return ReviewBlockType.valueOf(typeStr);
+ }
+
+ public DefectManager getDefectManager() {
+ if (defectManager == null) {
+ defectManager = new DefectManager(this);
+ }
+ return defectManager;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperTargetVersion()
+ */
+ @Override
+ public String getHyperTargetVersion() {
+ return null;
+ }
+
+ public UserRoleManager getUserRoleManager() {
+ if (userRoleManager == null) {
+ return userRoleManager = new UserRoleManager(this);
+ }
+ return userRoleManager;
+ }
+
+ public IStatus isUserRoleValid(String namespace) throws OseeCoreException {
+ // Need this cause it removes all error items of this namespace
+ return new Status(IStatus.OK, namespace, "");
+ }
+
+ public Set<TeamDefinitionArtifact> getCorrespondingTeamDefinitionArtifact() throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ if (getParentTeamWorkflow() != null) teamDefs.add(getParentTeamWorkflow().getTeamDefinition());
+ if (getActionableItemsDam().getActionableItems().size() > 0) {
+ teamDefs.addAll(ActionableItemArtifact.getImpactedTeamDefs(getActionableItemsDam().getActionableItems()));
+ }
+ return teamDefs;
+ }
+
+ /**
+ * @return the actionableItemsDam
+ */
+ public XActionableItemsDam getActionableItemsDam() {
+ if (actionableItemsDam == null) {
+ actionableItemsDam = new XActionableItemsDam(this);
+ }
+ return actionableItemsDam;
+ }
+
+ @Override
+ public ActionArtifact getParentActionArtifact() throws OseeCoreException {
+ if (getParentSMA() != null) {
+ return ((TeamWorkFlowArtifact) getParentSMA()).getParentActionArtifact();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewParentID()
+ */
+ @Override
+ public String getWorldViewParentID() throws OseeCoreException {
+ return getParentTeamWorkflow().getHumanReadableId();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java
new file mode 100644
index 00000000000..bebacefc04f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/StateMachineArtifact.java
@@ -0,0 +1,1384 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+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.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsNotifyUsers;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.Overview;
+import org.eclipse.osee.ats.util.Overview.PreviewStyle;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightRule;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.group.IGroupExplorerProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.util.email.EmailGroup;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class StateMachineArtifact extends ATSArtifact implements IGroupExplorerProvider, IWorldViewArtifact, ISubscribableArtifact, IFavoriteableArtifact {
+
+ protected SMAManager smaMgr;
+ private final Set<IRelationEnumeration> smaEditorRelations = new HashSet<IRelationEnumeration>();
+ private final Set<IRelationEnumeration> atsWorldRelations = new HashSet<IRelationEnumeration>();
+ private Collection<User> preSaveStateAssignees;
+ private User preSaveOriginator;
+ public static double DEFAULT_MAN_HOURS_PER_DAY = 8;
+ protected WorkFlowDefinition workFlowDefinition;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public StateMachineArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ @Override
+ public void onBirth() throws OseeCoreException {
+ super.onBirth();
+ setSoleAttributeValue(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(), "");
+ }
+
+ @Override
+ public void onInitializationComplete() {
+ super.onInitializationComplete();
+ initializeSMA();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.Artifact#reloadAttributesAndRelations()
+ */
+ @Override
+ public void reloadAttributesAndRelations() throws OseeCoreException {
+ super.reloadAttributesAndRelations();
+ initializeSMA();
+ }
+
+ protected void initializeSMA() {
+ smaMgr = new SMAManager(this);
+ initalizePreSaveCache();
+ }
+
+ public void initalizePreSaveCache() {
+ smaMgr = new SMAManager(this);
+ try {
+ preSaveStateAssignees = smaMgr.getStateMgr().getAssignees();
+ if (smaMgr.getOriginator() == null)
+ preSaveOriginator = UserManager.getUser();
+ else
+ preSaveOriginator = smaMgr.getOriginator();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * This method will create an assignee relation for each current assignee. Assignees are related to user artifacts to
+ * speed up ATS searching. This does not persist the artifact.<br>
+ * <br>
+ * The "UnAssigned" user is no longer related due to the performance and event service issues with having a single
+ * user related to > 5000 items. Since these relations are only used for searching, no need to have them for
+ * "UnAssigned".
+ *
+ * @throws OseeCoreException
+ */
+ public void updateAssigneeRelations() throws OseeCoreException {
+ Collection<User> assignees = getSmaMgr().getStateMgr().getAssignees();
+ assignees.remove(UserManager.getUser(SystemUser.UnAssigned));
+ setRelations(CoreRelationEnumeration.Users_User, assignees);
+ }
+
+ public boolean hasAtsWorldChildren() throws OseeCoreException {
+ for (IRelationEnumeration iRelationEnumeration : atsWorldRelations) {
+ if (getRelatedArtifactsCount(iRelationEnumeration) > 0) return true;
+ }
+ return false;
+ }
+
+ public String getHelpContext() {
+ return "atsWorkflowEditorWorkflowTab";
+ }
+
+ public String getArtifactSuperTypeName() {
+ return getArtifactTypeName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDate()
+ */
+ @Override
+ public Date getWorldViewDeadlineDate() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDateStr()
+ */
+ @Override
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDescription()
+ */
+ @Override
+ public String getWorldViewDescription() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewImplementer()
+ */
+ @Override
+ public String getWorldViewImplementer() throws OseeCoreException {
+ return Artifacts.toString("; ", getImplementers());
+ }
+
+ public Collection<User> getImplementersByState(String stateName) throws OseeCoreException {
+ if (smaMgr.isCancelled()) {
+ return Arrays.asList(smaMgr.getLog().getCancelledLogItem().getUser());
+ }
+ Collection<User> users = new HashSet<User>(smaMgr.getStateMgr().getAssignees(stateName));
+ LogItem item = smaMgr.getLog().getCompletedLogItem();
+ if (item != null) {
+ users.add(item.getUser());
+ }
+ return users;
+ }
+
+ public Collection<User> getImplementers() throws OseeCoreException {
+ return Collections.emptyList();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewTeam()
+ */
+ @Override
+ public String getWorldViewTeam() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewGroups()
+ */
+ @Override
+ public String getWorldViewGroups() throws OseeCoreException {
+ return Artifacts.toString("; ", getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__GROUP));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewWeeklyBenefit()
+ */
+ @Override
+ public double getWorldViewWeeklyBenefit() throws OseeCoreException {
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.Artifact#persistAttributes()
+ */
+ @Override
+ public void onAttributePersist() throws OseeCoreException {
+ // Since multiple ways exist to change the assignees, notification is performed on the persist
+ if (isDeleted()) {
+ return;
+ }
+ try {
+ notifyNewAssigneesAndReset();
+ notifyOriginatorAndReset();
+ updateAssigneeRelations();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * Override to apply different algorithm to current section expansion.
+ *
+ * @param page
+ * @return true if section should be expanded
+ * @throws OseeCoreException
+ */
+ public boolean isCurrentSectionExpanded(String stateName) throws OseeCoreException {
+ return smaMgr.getStateMgr().getCurrentStateName().equals(stateName);
+ }
+
+ public void notifyNewAssigneesAndReset() throws OseeCoreException {
+ if (preSaveStateAssignees == null) {
+ preSaveStateAssignees = smaMgr.getStateMgr().getAssignees();
+ return;
+ }
+ Set<User> newAssignees = new HashSet<User>();
+ for (User user : smaMgr.getStateMgr().getAssignees()) {
+ if (!preSaveStateAssignees.contains(user)) {
+ newAssignees.add(user);
+ }
+ }
+ preSaveStateAssignees = smaMgr.getStateMgr().getAssignees();
+ if (newAssignees.size() == 0) return;
+ try {
+ // These will be processed upon save
+ AtsNotifyUsers.notify(this, newAssignees, AtsNotifyUsers.NotifyType.Assigned);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void notifyOriginatorAndReset() throws OseeCoreException {
+ if (preSaveOriginator != null && smaMgr.getOriginator() != null && !smaMgr.getOriginator().equals(
+ preSaveOriginator)) {
+ AtsNotifyUsers.notify(this, AtsNotifyUsers.NotifyType.Originator);
+ }
+ preSaveOriginator = smaMgr.getOriginator();
+ }
+
+ public boolean isValidationRequired() throws OseeCoreException {
+ return false;
+ }
+
+ public abstract Set<User> getPrivilegedUsers() throws OseeCoreException;
+
+ public String getDescription() {
+ return "";
+ }
+
+ public ArrayList<EmailGroup> getEmailableGroups() throws OseeCoreException {
+ ArrayList<EmailGroup> groupNames = new ArrayList<EmailGroup>();
+ ArrayList<String> emails = new ArrayList<String>();
+ emails.add(smaMgr.getOriginator().getEmail());
+ groupNames.add(new EmailGroup("Originator", emails));
+ if (smaMgr.getStateMgr().getAssignees().size() > 0) {
+ emails = new ArrayList<String>();
+ for (User u : smaMgr.getStateMgr().getAssignees())
+ emails.add(u.getEmail());
+ groupNames.add(new EmailGroup("Assignees", emails));
+ }
+ return groupNames;
+ }
+
+ public abstract StateMachineArtifact getParentSMA() throws OseeCoreException;
+
+ public abstract ActionArtifact getParentActionArtifact() throws OseeCoreException;
+
+ public abstract TeamWorkFlowArtifact getParentTeamWorkflow() throws OseeCoreException;
+
+ public String getPreviewHtml() throws OseeCoreException {
+ return getPreviewHtml(PreviewStyle.NONE);
+ }
+
+ public String getPreviewHtml(PreviewStyle... styles) throws OseeCoreException {
+ Overview o = new Overview();
+ o.addHeader(this, styles);
+ o.addFooter(this, styles);
+ return o.getPage();
+ }
+
+ public boolean isUnCancellable() {
+ try {
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ if (item == null) throw new IllegalArgumentException("No Cancelled Event");
+ for (WorkPageDefinition toWorkPageDefinition : smaMgr.getWorkFlowDefinition().getToPages(
+ smaMgr.getWorkPageDefinition()))
+ if (toWorkPageDefinition.getPageName().equals(item.getState())) return true;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ public boolean isTaskable() throws OseeCoreException {
+ if (smaMgr.isCompleted() || smaMgr.isCancelled()) return false;
+ return true;
+ }
+
+ public boolean showTaskTab() throws OseeCoreException {
+ return isTaskable();
+ }
+
+ public String getEditorTitle() throws OseeCoreException {
+ return getDescriptiveName();
+ }
+
+ public String getWorldViewActionableItems() throws OseeCoreException {
+ return "";
+ }
+
+ /**
+ * Registers relation as part of the SMAEditor isDirty/save tree
+ *
+ * @param side
+ */
+ public void registerSMAEditorRelation(AtsRelation side) {
+ smaEditorRelations.add(side);
+ }
+
+ /**
+ * Registers relation as part of the parent/child hierarchy in ATS World
+ *
+ * @param side
+ */
+ public void registerAtsWorldRelation(AtsRelation side) {
+ atsWorldRelations.add(side);
+ }
+
+ public Image getAssigneeImage() throws OseeCoreException {
+ if (isDeleted()) return null;
+ if (smaMgr.getStateMgr().getAssignees().size() > 0) {
+ if (smaMgr.isUserSystem()) {
+ return ImageManager.getImage(FrameworkImage.USER_GREY);
+ } else if (smaMgr.isUserInactive()) {
+ return ImageManager.getImage(FrameworkImage.USER_YELLOW);
+ } else if (smaMgr.isAssigneeMe()) {
+ return ImageManager.getImage(FrameworkImage.USER_RED);
+ } else
+ return ImageManager.getImage(ArtifactTypeManager.getType("User"));
+ }
+ return null;
+ }
+
+ /**
+ * @return WorkFlowDefinition
+ */
+ public WorkFlowDefinition getWorkFlowDefinition() throws OseeCoreException {
+ if (workFlowDefinition == null) {
+ try {
+ workFlowDefinition = WorkFlowDefinitionFactory.getWorkFlowDefinition(this);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return workFlowDefinition;
+ }
+
+ public void addSubscribed(User user, SkynetTransaction transaction) throws OseeCoreException {
+ if (!getRelatedArtifacts(AtsRelation.SubscribedUser_User).contains(user)) {
+ addRelation(AtsRelation.SubscribedUser_User, user);
+ persistRelations(transaction);
+ }
+
+ }
+
+ public void removeSubscribed(User user, SkynetTransaction transaction) throws OseeCoreException {
+ deleteRelation(AtsRelation.SubscribedUser_User, user);
+ persistRelations(transaction);
+ }
+
+ public boolean isSubscribed(User user) throws OseeCoreException {
+ return (getRelatedArtifacts(AtsRelation.SubscribedUser_User).contains(user));
+ }
+
+ public ArrayList<User> getSubscribed() throws OseeCoreException {
+ ArrayList<User> arts = new ArrayList<User>();
+ for (Artifact art : getRelatedArtifacts(AtsRelation.SubscribedUser_User))
+ arts.add((User) art);
+ return arts;
+ }
+
+ public void addFavorite(User user, SkynetTransaction transaction) throws OseeCoreException {
+ if (!getRelatedArtifacts(AtsRelation.FavoriteUser_User).contains(user)) {
+ addRelation(AtsRelation.FavoriteUser_User, user);
+ persistRelations(transaction);
+ }
+ }
+
+ public void removeFavorite(User user, SkynetTransaction transaction) throws OseeCoreException {
+ deleteRelation(AtsRelation.FavoriteUser_User, user);
+ persistRelations(transaction);
+ }
+
+ public boolean isFavorite(User user) throws OseeCoreException {
+ return (getRelatedArtifacts(AtsRelation.FavoriteUser_User).contains(user));
+ }
+
+ public ArrayList<User> getFavorites() throws OseeCoreException {
+ ArrayList<User> arts = new ArrayList<User>();
+ for (Artifact art : getRelatedArtifacts(AtsRelation.FavoriteUser_User))
+ arts.add((User) art);
+ return arts;
+ }
+
+ public boolean amISubscribed() {
+ try {
+ return isSubscribed(UserManager.getUser());
+ } catch (OseeCoreException ex) {
+ return false;
+ }
+ }
+
+ public boolean amIFavorite() {
+ try {
+ return isFavorite(UserManager.getUser());
+ } catch (OseeCoreException ex) {
+ return false;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.ATSArtifact#atsDelete(java.util.Set, java.util.Map)
+ */
+ @Override
+ public void atsDelete(Set<Artifact> deleteArts, Map<Artifact, Object> allRelated) throws OseeCoreException {
+ SMAEditor.close(this, true);
+ super.atsDelete(deleteArts, allRelated);
+ }
+
+ public String getWorldViewType() throws OseeCoreException {
+ return getArtifactTypeName();
+ }
+
+ public String getWorldViewTitle() throws OseeCoreException {
+ return getDescriptiveName();
+ }
+
+ public String getWorldViewState() throws OseeCoreException {
+ return smaMgr.getStateMgr().getCurrentStateName();
+ }
+
+ public String getWorldViewActivePoc() throws OseeCoreException {
+ if (smaMgr.isCancelledOrCompleted()) {
+ if (smaMgr.getSma().getImplementers().size() > 0) {
+ return "(" + Artifacts.toString("; ", smaMgr.getSma().getImplementers()) + ")";
+ }
+ return "";
+ }
+ return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees());
+ }
+
+ public String getWorldViewCreatedDateStr() throws OseeCoreException {
+ if (getWorldViewCreatedDate() == null) return XViewerCells.getCellExceptionString("No creation date");
+ return new XDate(getWorldViewCreatedDate()).getMMDDYYHHMM();
+ }
+
+ public String getWorldViewCompletedDateStr() throws OseeCoreException {
+ if (smaMgr.isCompleted()) {
+ if (getWorldViewCompletedDate() == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Completed with no date => " + smaMgr.getSma().getHumanReadableId());
+ return XViewerCells.getCellExceptionString("Completed with no date.");
+ }
+ return new XDate(getWorldViewCompletedDate()).getMMDDYYHHMM();
+ }
+ return "";
+ }
+
+ public String getWorldViewCancelledDateStr() throws OseeCoreException {
+ if (smaMgr.isCancelled()) {
+ if (getWorldViewCancelledDate() == null) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE,
+ "Cancelled with no date => " + smaMgr.getSma().getHumanReadableId());
+ return XViewerCells.getCellExceptionString("Cancelled with no date.");
+ }
+ return new XDate(getWorldViewCancelledDate()).getMMDDYYHHMM();
+ }
+ return "";
+ }
+
+ public Date getWorldViewCreatedDate() throws OseeCoreException {
+ return smaMgr.getLog().getCreationDate();
+ }
+
+ public String getWorldViewOriginator() throws OseeCoreException {
+ return smaMgr.getOriginator().getName();
+ }
+
+ public String getWorldViewID() throws OseeCoreException {
+ return getHumanReadableId();
+ }
+
+ public String getWorldViewLegacyPCR() throws OseeCoreException {
+ if (isAttributeTypeValid(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName())) {
+ return getSoleAttributeValue(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName(), "");
+ }
+ return "";
+ }
+
+ public Date getWorldViewCompletedDate() throws OseeCoreException {
+ LogItem item = smaMgr.getLog().getCompletedLogItem();
+ if (item != null) return item.getDate();
+ return null;
+ }
+
+ public Date getWorldViewCancelledDate() throws OseeCoreException {
+ LogItem item = smaMgr.getLog().getCancelledLogItem();
+ if (item != null) return item.getDate();
+ return null;
+ }
+
+ public abstract VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException;
+
+ public ChangeType getWorldViewChangeType() throws OseeCoreException {
+ return ChangeType.None;
+ }
+
+ public String getWorldViewChangeTypeStr() throws OseeCoreException {
+ if (getWorldViewChangeType() == null || getWorldViewChangeType() == ChangeType.None)
+ return "";
+ else
+ return getWorldViewChangeType().name();
+ }
+
+ public double getEstimatedHoursFromArtifact() throws OseeCoreException {
+ if (isAttributeTypeValid(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName())) return getSoleAttributeValue(
+ ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(), 0.0);
+ return 0;
+ }
+
+ public double getEstimatedHoursFromTasks(String relatedToState) throws OseeCoreException {
+ return smaMgr.getTaskMgr().getEstimatedHours(relatedToState);
+ }
+
+ public double getEstimatedHoursFromTasks() throws OseeCoreException {
+ return smaMgr.getTaskMgr().getEstimatedHours();
+ }
+
+ public double getEstimatedHoursFromReviews() throws OseeCoreException {
+ return smaMgr.getReviewManager().getEstimatedHours();
+ }
+
+ public double getEstimatedHoursFromReviews(String relatedToState) throws OseeCoreException {
+ return smaMgr.getReviewManager().getEstimatedHours(relatedToState);
+ }
+
+ public double getEstimatedHoursTotal(String relatedToState) throws OseeCoreException {
+ return getEstimatedHoursFromArtifact() + getEstimatedHoursFromTasks(relatedToState) + getEstimatedHoursFromReviews(relatedToState);
+ }
+
+ public double getEstimatedHoursTotal() throws OseeCoreException {
+ return getEstimatedHoursFromArtifact() + getEstimatedHoursFromTasks() + getEstimatedHoursFromReviews();
+ }
+
+ public double getWorldViewEstimatedHours() throws OseeCoreException {
+ return getEstimatedHoursTotal();
+ }
+
+ public String getWorldViewUserCommunity() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewPriority() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewResolution() throws OseeCoreException {
+ return getAttributesToString(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ }
+
+ public double getRemainHoursFromArtifact() throws OseeCoreException {
+ if (smaMgr.isCompleted() || smaMgr.isCancelled()) return 0;
+ double est = getSoleAttributeValue(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(), 0.0);
+ if (est == 0) return getWorldViewEstimatedHours();
+ double remain = est - (est * (getPercentCompleteSMATotal() / 100.0));
+ return remain;
+ }
+
+ public double getRemainHoursTotal() throws OseeCoreException {
+ return getRemainHoursFromArtifact() + getRemainFromTasks() + getRemainFromReviews();
+ }
+
+ public double getRemainFromTasks() throws OseeCoreException {
+ return smaMgr.getTaskMgr().getRemainHours();
+ }
+
+ public double getRemainFromReviews() throws OseeCoreException {
+ return smaMgr.getReviewManager().getRemainHours();
+ }
+
+ @Override
+ public double getWorldViewRemainHours() throws OseeCoreException {
+ return getRemainHoursTotal();
+ }
+
+ public Result isWorldViewRemainHoursValid() throws OseeCoreException {
+ if (!isAttributeTypeValid(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName())) return Result.TrueResult;
+ try {
+ Double value = getSoleAttributeValue(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(), null);
+ if (getSmaMgr().isCancelled()) return Result.TrueResult;
+ if (value == null) return new Result("Estimated Hours not set.");
+ return Result.TrueResult;
+ } catch (Exception ex) {
+ return new Result(
+ ex.getClass().getName() + ": " + ex.getLocalizedMessage() + "\n\n" + Lib.exceptionToString(ex));
+ }
+ }
+
+ public Result isWorldViewManDaysNeededValid() throws OseeCoreException {
+ Result result = isWorldViewRemainHoursValid();
+ if (result.isFalse()) return result;
+ if (getManHrsPerDayPreference() == 0) return new Result("Man Day Hours Preference is not set.");
+
+ return Result.TrueResult;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewManDaysNeeded()
+ */
+ public double getWorldViewManDaysNeeded() throws OseeCoreException {
+ double hrsRemain = getWorldViewRemainHours();
+ double manDaysNeeded = 0;
+ if (hrsRemain != 0) manDaysNeeded = hrsRemain / getManHrsPerDayPreference();
+ return manDaysNeeded;
+ }
+
+ public double getManHrsPerDayPreference() throws OseeCoreException {
+ return DEFAULT_MAN_HOURS_PER_DAY;
+ }
+
+ public double getWorldViewAnnualCostAvoidance() throws OseeCoreException {
+ return 0;
+ }
+
+ public Result isWorldViewAnnualCostAvoidanceValid() throws OseeCoreException {
+ if (isAttributeTypeValid(ATSAttributes.WEEKLY_BENEFIT_ATTRIBUTE.getStoreName())) return Result.TrueResult;
+ Result result = isWorldViewRemainHoursValid();
+ if (result.isFalse()) return result;
+ String value = null;
+ try {
+ value = getSoleAttributeValue(ATSAttributes.WEEKLY_BENEFIT_ATTRIBUTE.getStoreName(), "");
+ if (value == null || value.equals("")) return new Result("Weekly Benefit Hours not set.");
+ double val = new Float(value).doubleValue();
+ if (val == 0) return new Result("Weekly Benefit Hours not set.");
+ } catch (NumberFormatException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "HRID " + getHumanReadableId(), ex);
+ return new Result("Weekly Benefit value is invalid double \"" + value + "\"");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "HRID " + getHumanReadableId(), ex);
+ return new Result("Exception calculating cost avoidance. See log for details.");
+ }
+ return Result.TrueResult;
+ }
+
+ public String getWorldViewNotes() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.SMA_NOTE_ATTRIBUTE.getStoreName(), "");
+ }
+
+ @Override
+ public String getWorldViewWorkPackage() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.WORK_PACKAGE_ATTRIBUTE.getStoreName(), "");
+ }
+
+ public String getWorldViewCategory() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.CATEGORY_ATTRIBUTE.getStoreName(), "");
+ }
+
+ public String getWorldViewCategory2() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.CATEGORY2_ATTRIBUTE.getStoreName(), "");
+ }
+
+ public String getWorldViewCategory3() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.CATEGORY3_ATTRIBUTE.getStoreName(), "");
+ }
+
+ public int getWorldViewStatePercentComplete() throws OseeCoreException {
+ return getPercentCompleteSMAStateTotal(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ public String getWorldViewNumberOfTasks() throws OseeCoreException {
+ int num = getSmaMgr().getTaskMgr().getTaskArtifacts().size();
+ if (num == 0) return "";
+ return String.valueOf(num);
+ }
+
+ public String getWorldViewRelatedToState() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public String getWorldViewTargetedVersionStr() throws OseeCoreException {
+ if (getWorldViewTargetedVersion() == null) {
+ return "";
+ }
+ return getWorldViewTargetedVersion().toString();
+ }
+
+ /**
+ * Return true if this artifact, it's ATS relations and any of the other side artifacts are dirty
+ *
+ * @return true if any object in SMA tree is dirty
+ */
+ public Result isSMAEditorDirty() {
+ String resultText = isRelationsAndArtifactsDirty(smaEditorRelations);
+ if (resultText == null) {
+ return Result.FalseResult;
+ }
+ return new Result(true, resultText);
+ }
+
+ public void saveSMA(SkynetTransaction transaction) {
+ try {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ getSmaArtifactsOneLevel(this, artifacts);
+ for (Artifact artifact : artifacts)
+ artifact.persistAttributesAndRelations(transaction);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't save artifact " + getHumanReadableId(), ex);
+ }
+ }
+
+ public void revertSMA() {
+ try {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ getSmaArtifactsOneLevel(this, artifacts);
+ for (Artifact artifact : artifacts)
+ artifact.reloadAttributesAndRelations();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't revert artifact " + getHumanReadableId(), ex);
+ }
+ }
+
+ public static void getSmaArtifactsOneLevel(StateMachineArtifact smaArtifact, Set<Artifact> artifacts) throws OseeCoreException {
+ artifacts.add(smaArtifact);
+ for (IRelationEnumeration side : smaArtifact.getSmaEditorRelations()) {
+ for (Artifact artifact : smaArtifact.getRelatedArtifacts(side)) {
+ artifacts.add(artifact);
+ }
+ }
+ }
+
+ @Override
+ public Date getWorldViewEstimatedReleaseDate() throws OseeCoreException {
+ Date date = getSoleAttributeValue(ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ Date parentDate = null;
+ if (getParentSMA() != null) {
+ parentDate = getParentSMA().getWorldViewEstimatedReleaseDate();
+ }
+ if (date == null && parentDate != null) {
+ return parentDate;
+ }
+ return date;
+ }
+
+ @Override
+ public Date getWorldViewEstimatedCompletionDate() throws OseeCoreException {
+ Date date = getSoleAttributeValue(ATSAttributes.ESTIMATED_COMPLETION_DATE_ATTRIBUTE.getStoreName(), null);
+ Date parentDate = null;
+ if (getParentSMA() != null) {
+ parentDate = getParentSMA().getWorldViewEstimatedReleaseDate();
+ }
+ if (date == null && parentDate != null) {
+ return parentDate;
+ }
+ return date;
+ }
+
+ public String getWorldViewEstimatedReleaseDateStr() throws OseeCoreException {
+ if (getWorldViewEstimatedReleaseDate() == null) return "";
+ return new XDate(getWorldViewEstimatedReleaseDate()).getMMDDYYHHMM();
+ }
+
+ public String getWorldViewEstimatedCompletionDateStr() throws OseeCoreException {
+ if (getWorldViewEstimatedCompletionDate() == null) return "";
+ return new XDate(getWorldViewEstimatedCompletionDate()).getMMDDYYHHMM();
+ }
+
+ public abstract Date getWorldViewReleaseDate() throws OseeCoreException;
+
+ public String getWorldViewReleaseDateStr() throws OseeCoreException {
+ if (getWorldViewReleaseDate() == null) return "";
+ return new XDate(getWorldViewReleaseDate()).getMMDDYYHHMM();
+ }
+
+ public boolean isReleased() {
+ try {
+ return getWorldViewReleaseDate() != null;
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ /**
+ * Called at the end of a transition just before transaction manager persist. SMAs can override to perform tasks due
+ * to transition.
+ *
+ * @throws Exception
+ */
+ public void transitioned(WorkPageDefinition fromPage, WorkPageDefinition toPage, Collection<User> toAssignees, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperName()
+ */
+ public String getHyperName() {
+ return getDescriptiveName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperType()
+ */
+ public String getHyperType() {
+ try {
+ return getArtifactTypeName();
+ } catch (Exception ex) {
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperState()
+ */
+ public String getHyperState() {
+ try {
+ return smaMgr.getStateMgr().getCurrentStateName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperAssignee()
+ */
+ public String getHyperAssignee() {
+ try {
+ return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperAssigneeImage()
+ */
+ public Image getHyperAssigneeImage() throws OseeCoreException {
+ return smaMgr.getAssigneeImage();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperArtifact()
+ */
+ public Artifact getHyperArtifact() {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDecision()
+ */
+ public String getWorldViewDecision() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact#getParentSMArt()
+ */
+ public Artifact getParentAtsArtifact() throws OseeCoreException {
+ return getParentSMA();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewValidationRequiredStr()
+ */
+ public String getWorldViewValidationRequiredStr() throws OseeCoreException {
+ if (isAttributeTypeValid(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName())) return String.valueOf(getSoleAttributeValue(
+ ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), false));
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#isWorldViewDeadlineAlerting()
+ */
+ public Result isWorldViewDeadlineAlerting() throws OseeCoreException {
+ return Result.FalseResult;
+ }
+
+ public int getWorldViewPercentRework() throws OseeCoreException {
+ return 0;
+ }
+
+ public String getWorldViewPercentReworkStr() throws OseeCoreException {
+ int reWork = getWorldViewPercentRework();
+ if (reWork == 0) return "";
+ return String.valueOf(reWork);
+ }
+
+ public static Set<String> getAllSMATypeNames() throws OseeCoreException {
+ Set<String> artTypeNames = TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames();
+ artTypeNames.add(TaskArtifact.ARTIFACT_NAME);
+ artTypeNames.add(DecisionReviewArtifact.ARTIFACT_NAME);
+ artTypeNames.add(PeerToPeerReviewArtifact.ARTIFACT_NAME);
+ return artTypeNames;
+ }
+
+ public static List<Artifact> getAllSMATypeArtifacts() throws OseeCoreException {
+ List<Artifact> result = new ArrayList<Artifact>();
+ for (String artType : getAllSMATypeNames()) {
+ result.addAll(ArtifactQuery.getArtifactsFromType(artType, AtsPlugin.getAtsBranch()));
+ }
+ return result;
+ }
+
+ public static List<Artifact> getAllTeamWorkflowArtifacts() throws OseeCoreException {
+ List<Artifact> result = new ArrayList<Artifact>();
+ for (String artType : TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames()) {
+ result.addAll(ArtifactQuery.getArtifactsFromType(artType, AtsPlugin.getAtsBranch()));
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewBranchStatus()
+ */
+ public String getWorldViewBranchStatus() throws OseeCoreException {
+ return "";
+ }
+
+ /**
+ * @return the smaMgr
+ */
+ public SMAManager getSmaMgr() {
+ return smaMgr;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewAuthor()
+ */
+ public String getWorldViewReviewAuthor() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewDecider()
+ */
+ public String getWorldViewReviewDecider() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewModerator()
+ */
+ public String getWorldViewReviewModerator() throws OseeCoreException {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewReviewReviewer()
+ */
+ public String getWorldViewReviewReviewer() throws OseeCoreException {
+ return "";
+ }
+
+ /**
+ * Return hours spent working ONLY the SMA stateName (not children SMAs)
+ *
+ * @param stateName
+ * @return hours
+ */
+ public double getHoursSpentSMAState(String stateName) throws OseeCoreException {
+ return smaMgr.getStateMgr().getHoursSpent(stateName);
+ }
+
+ /**
+ * Return hours spent working ONLY on tasks related to stateName
+ *
+ * @param stateName
+ * @return hours
+ * @throws Exception
+ */
+ public double getHoursSpentSMAStateTasks(String stateName) throws OseeCoreException {
+ return smaMgr.getTaskMgr().getHoursSpent(stateName);
+ }
+
+ /**
+ * Return hours spent working ONLY on reviews related to stateName
+ *
+ * @param stateName
+ * @return hours
+ * @throws Exception
+ */
+ public double getHoursSpentSMAStateReviews(String stateName) throws OseeCoreException {
+ return smaMgr.getReviewManager().getHoursSpent(stateName);
+ }
+
+ /**
+ * Return hours spent working on all things (including children SMAs) related to stateName
+ *
+ * @param stateName
+ * @return hours
+ * @throws Exception
+ */
+ public double getHoursSpentSMAStateTotal(String stateName) throws OseeCoreException {
+ return getHoursSpentSMAState(stateName) + getHoursSpentSMAStateTasks(stateName) + getHoursSpentSMAStateReviews(stateName);
+ }
+
+ @Override
+ public double getWorldViewHoursSpentStateTotal() throws OseeCoreException {
+ return getHoursSpentSMAStateTotal(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /**
+ * Return hours spent working on all things (including children SMAs) for this SMA
+ *
+ * @return hours
+ * @throws Exception
+ */
+ public double getHoursSpentSMATotal() throws OseeCoreException {
+ double hours = 0.0;
+ for (String stateName : smaMgr.getStateMgr().getVisitedStateNames()) {
+ hours += getHoursSpentSMAStateTotal(stateName);
+ }
+ return hours;
+ }
+
+ /**
+ * Return Percent Complete working ONLY the SMA stateName (not children SMAs)
+ *
+ * @param stateName
+ * @return percent
+ */
+ public int getPercentCompleteSMAState(String stateName) throws OseeCoreException {
+ return smaMgr.getStateMgr().getPercentComplete(stateName);
+ }
+
+ /**
+ * Return Percent Complete ONLY on tasks related to stateName. Total Percent / # Tasks
+ *
+ * @param stateName
+ * @return percent
+ * @throws Exception
+ */
+ public int getPercentCompleteSMAStateTasks(String stateName) throws OseeCoreException {
+ return smaMgr.getTaskMgr().getPercentComplete(stateName);
+ }
+
+ /**
+ * Return Percent Complete ONLY on reviews related to stateName. Total Percent / # Reviews
+ *
+ * @param stateName
+ * @return percent
+ * @throws Exception
+ */
+ public int getPercentCompleteSMAStateReviews(String stateName) throws OseeCoreException {
+ return smaMgr.getReviewManager().getPercentComplete(stateName);
+ }
+
+ /**
+ * Return Percent Complete on all things (including children SMAs) related to stateName. Total Percent for state,
+ * tasks and reviews / 1 + # Tasks + # Reviews
+ *
+ * @param stateName
+ * @return percent
+ * @throws Exception
+ */
+ public int getPercentCompleteSMAStateTotal(String stateName) throws OseeCoreException {
+ return getStateMetricsData(stateName).getResultingPercent();
+ }
+
+ /**
+ * Return Percent Complete on all things (including children SMAs) for this SMA<br>
+ * <br>
+ * percent = all state's percents / number of states (minus completed/cancelled)
+ *
+ * @return percent
+ * @throws Exception
+ */
+ public int getPercentCompleteSMATotal() throws OseeCoreException {
+ if (smaMgr.isCancelledOrCompleted()) return 100;
+ Map<String, Double> stateToWeightMap = getStatePercentCompleteWeight();
+ if (stateToWeightMap.size() > 0) {
+ // Calculate total percent using configured weighting
+ int percent = 0;
+ for (String stateName : smaMgr.getWorkFlowDefinition().getPageNames()) {
+ if (!stateName.equals(DefaultTeamState.Completed.name()) && !stateName.equals(DefaultTeamState.Cancelled.name())) {
+ Double weight = stateToWeightMap.get(stateName);
+ if (weight == null) {
+ weight = 0.0;
+ }
+ percent += weight * getPercentCompleteSMAStateTotal(stateName);
+ }
+ }
+ return percent;
+ } else {
+ int percent = 0;
+ int numStates = 0;
+ for (String stateName : smaMgr.getWorkFlowDefinition().getPageNames()) {
+ if (!stateName.equals(DefaultTeamState.Completed.name()) && !stateName.equals(DefaultTeamState.Cancelled.name())) {
+ percent += getPercentCompleteSMAStateTotal(stateName);
+ numStates++;
+ }
+ }
+ if (numStates == 0) return 0;
+ return percent / numStates;
+ }
+ }
+
+ // Cache stateToWeight mapping
+ private Map<String, Double> stateToWeight = null;
+
+ public Map<String, Double> getStatePercentCompleteWeight() throws OseeCoreException {
+ if (stateToWeight == null) {
+ stateToWeight = new HashMap<String, Double>();
+ Collection<WorkRuleDefinition> workRuleDefs =
+ smaMgr.getWorkRulesStartsWith(AtsStatePercentCompleteWeightRule.ID);
+ // Log error if multiple of same rule found, but keep going
+ if (workRuleDefs.size() > 1) {
+ OseeLog.log(
+ AtsPlugin.class,
+ Level.SEVERE,
+ "Team Definition has multiple rules of type " + AtsStatePercentCompleteWeightRule.ID + ". Only 1 allowed. Defaulting to first found.");
+ }
+ if (workRuleDefs.size() == 1) {
+ stateToWeight = AtsStatePercentCompleteWeightRule.getStateWeightMap(workRuleDefs.iterator().next());
+ }
+ }
+ return stateToWeight;
+ }
+
+ private StateMetricsData getStateMetricsData(String stateName) throws OseeCoreException {
+ // Add percent and bump objects 1 for state percent
+ int percent = getPercentCompleteSMAState(stateName);
+ int numObjects = 1; // the state itself is one object
+
+ // Add percent for each task and bump objects for each task
+ Collection<TaskArtifact> tasks = smaMgr.getTaskMgr().getTaskArtifacts(stateName);
+ for (TaskArtifact taskArt : tasks)
+ percent += taskArt.getPercentCompleteSMATotal();
+ numObjects += tasks.size();
+
+ // Add percent for each review and bump objects for each review
+ Collection<ReviewSMArtifact> reviews = smaMgr.getReviewManager().getReviews(stateName);
+ for (ReviewSMArtifact reviewArt : reviews)
+ percent += reviewArt.getPercentCompleteSMATotal();
+ numObjects += reviews.size();
+
+ return new StateMetricsData(percent, numObjects);
+ }
+
+ private class StateMetricsData {
+ public int numObjects = 0;
+ public int percent = 0;
+
+ public StateMetricsData(int percent, int numObjects) {
+ this.numObjects = numObjects;
+ this.percent = percent;
+ }
+
+ public int getResultingPercent() {
+ return percent / numObjects;
+ }
+
+ @Override
+ public String toString() {
+ return "Percent: " + getResultingPercent() + " NumObjs: " + numObjects + " Total Percent: " + percent;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentState()
+ */
+ @Override
+ public double getWorldViewHoursSpentState() throws OseeCoreException {
+ return getHoursSpentSMAState(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentStateReview()
+ */
+ @Override
+ public double getWorldViewHoursSpentStateReview() throws OseeCoreException {
+ return getHoursSpentSMAStateReviews(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentStateTask()
+ */
+ @Override
+ public double getWorldViewHoursSpentStateTask() throws OseeCoreException {
+ return getHoursSpentSMAStateTasks(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewHoursSpentTotal()
+ */
+ @Override
+ public double getWorldViewHoursSpentTotal() throws OseeCoreException {
+ return getHoursSpentSMATotal();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteState()
+ */
+ @Override
+ public int getWorldViewPercentCompleteState() throws OseeCoreException {
+ return getPercentCompleteSMAState(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteStateReview()
+ */
+ @Override
+ public int getWorldViewPercentCompleteStateReview() throws OseeCoreException {
+ return getPercentCompleteSMAStateReviews(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteStateTask()
+ */
+ @Override
+ public int getWorldViewPercentCompleteStateTask() throws OseeCoreException {
+ return getPercentCompleteSMAStateTasks(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewPercentCompleteTotal()
+ */
+ @Override
+ public int getWorldViewPercentCompleteTotal() throws OseeCoreException {
+ return getPercentCompleteSMATotal();
+ }
+
+ /**
+ * @return the smaRelations
+ */
+ public Set<IRelationEnumeration> getSmaEditorRelations() {
+ return smaEditorRelations;
+ }
+
+ public Set<IRelationEnumeration> getAtsWorldRelations() {
+ return atsWorldRelations;
+ }
+
+ public String getWorldViewLastUpdated() throws OseeCoreException {
+ return XDate.getDateStr(getLastModified(), XDate.MMDDYYHHMM);
+ }
+
+ public String getWorldViewLastStatused() throws OseeCoreException {
+ return XDate.getDateStr(smaMgr.getLog().getLastStatusedDate(), XDate.MMDDYYHHMM);
+ }
+
+ public String getWorldViewSWEnhancement() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewNumberOfReviewIssueDefects() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewNumberOfReviewMajorDefects() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewNumberOfReviewMinorDefects() throws OseeCoreException {
+ return "";
+ }
+
+ public String getWorldViewActionsIntiatingWorkflow() throws OseeCoreException {
+ return getParentActionArtifact().getWorldViewActionsIntiatingWorkflow();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDaysInCurrentState()
+ */
+ @Override
+ public String getWorldViewDaysInCurrentState() throws OseeCoreException {
+ long timeInCurrState = smaMgr.getStateMgr().getTimeInState();
+ if (timeInCurrState == 0) return "0.0";
+ return AtsLib.doubleToStrString(timeInCurrState / XDate.MILLISECONDS_IN_A_DAY);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewParentState()
+ */
+ @Override
+ public String getWorldViewParentState() throws OseeCoreException {
+ if (getParentSMA() != null) {
+ return getParentSMA().getSmaMgr().getStateMgr().getCurrentStateName();
+ }
+ return "";
+ }
+
+ public String getGroupExplorerName() throws OseeCoreException {
+ if (getSmaMgr().isCancelledOrCompleted()) {
+ return String.format("[%s] %s", getSmaMgr().getStateMgr().getCurrentStateName(), getDescriptiveName());
+ }
+ return getDescriptiveName();
+ }
+
+ @Override
+ public String getWorldViewOriginatingWorkflowStr() throws OseeCoreException {
+ return getParentActionArtifact().getWorldViewOriginatingWorkflowStr();
+ }
+
+ @Override
+ public Collection<TeamWorkFlowArtifact> getWorldViewOriginatingWorkflows() throws OseeCoreException {
+ return getParentActionArtifact().getWorldViewOriginatingWorkflows();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java
new file mode 100644
index 00000000000..63626c7dc63
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskArtifact.java
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.dialog.TaskResOptionDefinition;
+import org.eclipse.osee.ats.util.widgets.dialog.TaskResolutionOptionRule;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSStateMachineArtifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskArtifact extends StateMachineArtifact implements IWorldViewArtifact, IATSStateMachineArtifact {
+
+ public static String ARTIFACT_NAME = "Task";
+
+ public static enum TaskStates {
+ InWork, Completed, Cancelled
+ };
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ * @throws
+ */
+ public TaskArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public boolean isRelatedToParentWorkflowCurrentState() throws OseeCoreException {
+ return getWorldViewRelatedToState().equals(getParentSMA().getSmaMgr().getStateMgr().getCurrentStateName());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#onInitializationComplete()
+ */
+ @Override
+ public void onInitializationComplete() {
+ super.onInitializationComplete();
+ }
+
+ /**
+ * Allow parent SMA's assignees and all privileged users up Team tree
+ *
+ * @throws OseeCoreException
+ */
+ @Override
+ public Set<User> getPrivilegedUsers() throws OseeCoreException {
+ Set<User> users = new HashSet<User>();
+ StateMachineArtifact parentSma = getParentSMA();
+ if (parentSma instanceof TeamWorkFlowArtifact) users.addAll(((TeamWorkFlowArtifact) parentSma).getPrivilegedUsers());
+ users.addAll(parentSma.getSmaMgr().getStateMgr().getAssignees());
+ return users;
+ }
+
+ /**
+ * Can only un-cancel task when it's related to an active state
+ */
+ @Override
+ public boolean isUnCancellable() {
+ try {
+ StateMachineArtifact parentSMA = getParentSMA();
+ boolean unCancellable =
+ (parentSMA.getSmaMgr().getStateMgr().getCurrentStateName().equals(getSoleAttributeValue(
+ ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), "")));
+ if (!unCancellable) return false;
+ return super.isUnCancellable();
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#isTaskable()
+ */
+ @Override
+ public boolean isTaskable() {
+ return false;
+ }
+
+ public boolean isUsingTaskResolutionOptions() throws OseeCoreException {
+ return (getTaskResolutionOptionDefintions().size() > 0);
+ }
+
+ public List<TaskResOptionDefinition> getTaskResolutionOptionDefintions() throws OseeCoreException {
+ TeamWorkFlowArtifact team = getParentTeamWorkflow();
+ if (team == null) return TaskResolutionOptionRule.EMPTY_TASK_RESOLUTION_OPTIONS;
+ return TaskResolutionOptionRule.getTaskResolutionOptions(team.getSmaMgr().getWorkPageDefinition());
+ }
+
+ public TaskResOptionDefinition getTaskResolutionOptionDefinition(String optionName) throws OseeCoreException {
+ for (TaskResOptionDefinition def : getTaskResolutionOptionDefintions()) {
+ if (def.getName().equals(optionName)) return def;
+ }
+ return null;
+ }
+
+ public List<TaskResOptionDefinition> getTaskResolutionOptionDefintions(String stateName) throws OseeCoreException {
+ TeamWorkFlowArtifact team = getParentTeamWorkflow();
+ if (team == null) return TaskResolutionOptionRule.EMPTY_TASK_RESOLUTION_OPTIONS;
+ return TaskResolutionOptionRule.getTaskResolutionOptions(team.getSmaMgr().getWorkPageDefinitionByName(stateName));
+ }
+
+ public TaskResOptionDefinition getTaskResolutionOptionDefinition(String stateName, String optionName) throws OseeCoreException {
+ for (TaskResOptionDefinition def : getTaskResolutionOptionDefintions(stateName)) {
+ if (def.getName().equals(optionName)) return def;
+ }
+ return null;
+ }
+
+ @Override
+ public String getDescription() {
+ try {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ } catch (Exception ex) {
+ return "Error: " + ex.getLocalizedMessage();
+ }
+ }
+
+ @Override
+ public String getWorldViewRelatedToState() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), "");
+ }
+
+ @Override
+ public void atsDelete(Set<Artifact> deleteArts, Map<Artifact, Object> allRelated) throws OseeCoreException {
+ super.atsDelete(deleteArts, allRelated);
+ }
+
+ @Override
+ public String getWorldViewTeam() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public StateMachineArtifact getParentSMA() throws OseeCoreException {
+ Collection<StateMachineArtifact> smas =
+ getRelatedArtifacts(AtsRelation.SmaToTask_Sma, StateMachineArtifact.class);
+ if (smas.size() > 0) return smas.iterator().next();
+ return null;
+ }
+
+ public Boolean isCancelled() throws OseeCoreException {
+ return smaMgr.isCancelled();
+ }
+
+ @Override
+ public String getWorldViewWorkPackage() throws OseeCoreException {
+ String value = super.getWorldViewWorkPackage();
+ if (value != null && !value.equals("")) return value;
+ return getParentSMA().getWorldViewWorkPackage();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getWorldViewEstimatedCompletionDate()
+ */
+ @Override
+ public Date getWorldViewEstimatedCompletionDate() throws OseeCoreException {
+ Date value = super.getWorldViewEstimatedCompletionDate();
+ if (value != null) return value;
+ return getParentSMA().getWorldViewEstimatedCompletionDate();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getWorldViewEstimatedReleaseDate()
+ */
+ @Override
+ public Date getWorldViewEstimatedReleaseDate() throws OseeCoreException {
+ Date value = super.getWorldViewEstimatedReleaseDate();
+ if (value != null) return value;
+ return getParentSMA().getWorldViewEstimatedReleaseDate();
+ }
+
+ public Boolean isInWork() throws OseeCoreException {
+ return (smaMgr.getStateMgr().getCurrentStateName().equals(TaskStates.InWork.name()));
+ }
+
+ public Boolean isCompleted() throws OseeCoreException {
+ return smaMgr.isCompleted();
+ }
+
+ public void transitionToCancelled(String reason, SkynetTransaction transaction, TransitionOption... transitionOption) throws OseeCoreException {
+ if (smaMgr.getStateMgr().getCurrentStateName().equals(DefaultTeamState.Cancelled.name())) return;
+ setSoleAttributeValue(ATSAttributes.CANCEL_REASON_ATTRIBUTE.getStoreName(), reason);
+ Result result = smaMgr.transition(DefaultTeamState.Cancelled.name(), (User) null, transaction, transitionOption);
+ if (result.isFalse()) result.popup();
+ }
+
+ public void transitionToCompleted(double additionalHours, SkynetTransaction transaction, TransitionOption... transitionOption) throws OseeCoreException {
+ if (smaMgr.getStateMgr().getCurrentStateName().equals(DefaultTeamState.Completed.name())) return;
+ // Assign current user if unassigned
+ try {
+ if (smaMgr.getStateMgr().isUnAssigned()) {
+ smaMgr.getStateMgr().setAssignee(UserManager.getUser());
+ }
+ smaMgr.getStateMgr().updateMetrics(additionalHours, 100, true);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ Result result = smaMgr.transition(DefaultTeamState.Completed.name(), (User) null, transaction, transitionOption);
+ if (result.isFalse()) result.popup();
+ }
+
+ public void transitionToInWork(User toUser, int percentComplete, double additionalHours, SkynetTransaction transaction, TransitionOption... transitionOption) throws OseeCoreException {
+ if (smaMgr.getStateMgr().getCurrentStateName().equals(TaskStates.InWork.name())) return;
+ Result result = smaMgr.transition(TaskStates.InWork.name(), toUser, transaction, transitionOption);
+ if (smaMgr.getStateMgr().getPercentComplete() != percentComplete || additionalHours > 0) {
+ smaMgr.getStateMgr().updateMetrics(additionalHours, percentComplete, true);
+ }
+ if (Collections.getAggregate(transitionOption).contains(TransitionOption.Persist)) {
+ smaMgr.getSma().saveSMA(transaction);
+ }
+ if (result.isFalse()) result.popup();
+ }
+
+ /**
+ * Tasks must transition in/out of completed when percent changes between 100 and <100. This method will handle these
+ * cases.
+ *
+ * @param percentComplete
+ * @param transaction
+ * @throws OseeCoreException
+ */
+ public void statusPercentChanged(double additionalHours, int percentComplete, SkynetTransaction transaction) throws OseeCoreException {
+ if (percentComplete == 100 && !isCompleted()) {
+ transitionToCompleted(additionalHours, transaction, TransitionOption.None);
+ } else if (percentComplete != 100 && isCompleted()) {
+ transitionToInWork(UserManager.getUser(), percentComplete, additionalHours, transaction,
+ TransitionOption.Persist);
+ }
+ // Case where already completed and statusing, just add additional hours to InWork state
+ else if (percentComplete == 100 && isCompleted()) {
+ if (additionalHours > 0) {
+ smaMgr.getStateMgr().updateMetrics(TaskStates.InWork.name(), additionalHours, percentComplete, true);
+ }
+ } else {
+ smaMgr.getStateMgr().updateMetrics(additionalHours, percentComplete, true);
+ }
+ }
+
+ public void parentWorkFlowTransitioned(WorkPageDefinition fromWorkPageDefinition, WorkPageDefinition toWorkPageDefinition, Collection<User> toAssignees, boolean persist, SkynetTransaction transaction, TransitionOption... transitionOption) throws OseeCoreException {
+ if (toWorkPageDefinition.getPageName().equals(DefaultTeamState.Cancelled.name()) && isInWork())
+ transitionToCancelled("Parent Cancelled", transaction, transitionOption);
+ else if (fromWorkPageDefinition.getPageName().equals(DefaultTeamState.Cancelled.name()) && isCancelled()) {
+ transitionToInWork(UserManager.getUser(), 99, 0, transaction, transitionOption);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDescription()
+ */
+ @Override
+ public String getWorldViewDescription() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ }
+
+ @Override
+ public String getWorldViewNumberOfTasks() throws OseeCoreException {
+ return "";
+ }
+
+ @Override
+ public Date getWorldViewReleaseDate() throws OseeCoreException {
+ if (getParentSMA() instanceof TeamWorkFlowArtifact) return ((TeamWorkFlowArtifact) getParentSMA()).getWorldViewReleaseDate();
+ return getSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName());
+ }
+
+ @Override
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException {
+ return getParentSMA().getWorldViewTargetedVersion();
+ }
+
+ @Override
+ public double getManHrsPerDayPreference() throws OseeCoreException {
+ return getParentSMA().getManHrsPerDayPreference();
+ }
+
+ @Override
+ public double getWorldViewRemainHours() throws OseeCoreException {
+ if (smaMgr.isCompleted() || smaMgr.isCancelled()) return 0;
+ double est = getWorldViewEstimatedHours();
+ if (getWorldViewStatePercentComplete() == 0) return getWorldViewEstimatedHours();
+ double percent = smaMgr.getStateMgr().getPercentComplete(TaskStates.InWork.name());
+ if (percent == 0) return getWorldViewEstimatedHours();
+ double remain = getWorldViewEstimatedHours() - (est * (percent / 100.0));
+ return remain;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getParentActionArtifact()
+ */
+ @Override
+ public ActionArtifact getParentActionArtifact() throws OseeCoreException {
+ StateMachineArtifact sma = getParentSMA();
+ if (sma instanceof TeamWorkFlowArtifact)
+ return ((TeamWorkFlowArtifact) sma).getParentActionArtifact();
+ else
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getParentTeamWorkflow()
+ */
+ @Override
+ public TeamWorkFlowArtifact getParentTeamWorkflow() throws OseeCoreException {
+ StateMachineArtifact sma = getParentSMA();
+ if (sma instanceof TeamWorkFlowArtifact)
+ return ((TeamWorkFlowArtifact) sma);
+ else
+ return null;
+ }
+
+ @Override
+ public Collection<User> getImplementers() throws OseeCoreException {
+ return getImplementersByState(TaskStates.InWork.name());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDate()
+ */
+ @Override
+ public Date getWorldViewDeadlineDate() throws OseeCoreException {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDateStr()
+ */
+ @Override
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewWeeklyBenefit()
+ */
+ @Override
+ public double getWorldViewWeeklyBenefit() {
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#isWorldViewAnnualCostAvoidanceValid()
+ */
+ @Override
+ public Result isWorldViewAnnualCostAvoidanceValid() throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewLegacyPCR()
+ */
+ @Override
+ public String getWorldViewLegacyPCR() throws OseeCoreException {
+ StateMachineArtifact sma = getParentSMA();
+ if (sma != null) return sma.getWorldViewLegacyPCR();
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperTargetVersion()
+ */
+ @Override
+ public String getHyperTargetVersion() {
+ return null;
+ }
+
+ @Override
+ public String getWorldViewSWEnhancement() throws OseeCoreException {
+ StateMachineArtifact sma = getParentSMA();
+ if (sma != null) return sma.getWorldViewSWEnhancement();
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewParentID()
+ */
+ @Override
+ public String getWorldViewParentID() throws OseeCoreException {
+ return getParentTeamWorkflow().getHumanReadableId();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskableStateMachineArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskableStateMachineArtifact.java
new file mode 100644
index 00000000000..5fe0bbe6da7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TaskableStateMachineArtifact.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.ats.artifact;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class TaskableStateMachineArtifact extends StateMachineArtifact {
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ * @param artifactType
+ */
+ public TaskableStateMachineArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ registerSMAEditorRelation(AtsRelation.SmaToTask_Task);
+ registerAtsWorldRelation(AtsRelation.SmaToTask_Task);
+ }
+
+ @Override
+ public ActionArtifact getParentActionArtifact() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public StateMachineArtifact getParentSMA() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public TeamWorkFlowArtifact getParentTeamWorkflow() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public Set<User> getPrivilegedUsers() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public Date getWorldViewReleaseDate() throws OseeCoreException {
+ return null;
+ }
+
+ @Override
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException {
+ TeamWorkFlowArtifact teamArt = getParentTeamWorkflow();
+ if (teamArt == null) return null;
+ return teamArt.getWorldViewTargetedVersion();
+ }
+
+ @Override
+ public boolean showTaskTab() throws OseeCoreException {
+ return (isTaskable() || smaMgr.isCompleted() || smaMgr.isCancelled());
+ }
+
+ @Override
+ public void atsDelete(Set<Artifact> deleteArts, Map<Artifact, Object> allRelated) throws OseeCoreException {
+ super.atsDelete(deleteArts, allRelated);
+ for (TaskArtifact taskArt : smaMgr.getTaskMgr().getTaskArtifacts())
+ taskArt.atsDelete(deleteArts, allRelated);
+ }
+
+ @Override
+ public void transitioned(WorkPageDefinition fromPage, WorkPageDefinition toPage, Collection<User> toAssignees, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ super.transitioned(fromPage, toPage, toAssignees, persist, transaction);
+ for (TaskArtifact taskArt : smaMgr.getTaskMgr().getTaskArtifacts())
+ taskArt.parentWorkFlowTransitioned(fromPage, toPage, toAssignees, persist, transaction);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamDefinitionArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamDefinitionArtifact.java
new file mode 100644
index 00000000000..13655918f66
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamDefinitionArtifact.java
@@ -0,0 +1,488 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.artifact;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.commit.ICommitConfigArtifact;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamDefinitionArtifact extends Artifact implements ICommitConfigArtifact {
+
+ public static String ARTIFACT_NAME = "Team Definition";
+ public static String TOP_TEAM_STATIC_ID = "osee.ats.TopTeamDefinition";
+ public static Set<TeamDefinitionArtifact> EMPTY_SET = new HashSet<TeamDefinitionArtifact>();
+ public static enum TeamDefinitionOptions {
+ TeamUsesVersions, RequireTargetedVersion
+ };
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public TeamDefinitionArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public Result isCreateBranchAllowed() throws OseeCoreException {
+ if (getSoleAttributeValue(ATSAttributes.ALLOW_CREATE_BRANCH.getStoreName(), false) == false) {
+ return new Result(false, "Branch creation disabled for Team Definition [" + this + "]");
+ }
+ if (getParentBranch() == null) {
+ return new Result(false, "Parent Branch not configured for Team Definition [" + this + "]");
+ }
+ return Result.TrueResult;
+ }
+
+ public Result isCommitBranchAllowed() throws OseeCoreException {
+ if (getSoleAttributeValue(ATSAttributes.ALLOW_COMMIT_BRANCH.getStoreName(), false) == false) {
+ return new Result(false, "Team Definition [" + this + "] not configured to allow branch commit.");
+ }
+ if (getParentBranch() == null) {
+ return new Result(false, "Parent Branch not configured for Team Definition [" + this + "]");
+ }
+ return Result.TrueResult;
+ }
+
+ public void initialize(String fullname, String description, Collection<User> leads, Collection<User> members, Collection<ActionableItemArtifact> actionableItems, TeamDefinitionOptions... teamDefinitionOptions) throws OseeCoreException {
+ List<Object> teamDefOptions = Collections.getAggregate((Object[]) teamDefinitionOptions);
+
+ setSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), description);
+ setSoleAttributeValue(ATSAttributes.FULL_NAME_ATTRIBUTE.getStoreName(), fullname);
+ for (User user : leads) {
+ addRelation(AtsRelation.TeamLead_Lead, user);
+ // All leads are members
+ addRelation(AtsRelation.TeamMember_Member, user);
+ }
+ for (User user : members) {
+ addRelation(AtsRelation.TeamMember_Member, user);
+ }
+
+ if (teamDefOptions.contains(TeamDefinitionOptions.TeamUsesVersions)) {
+ setSoleAttributeValue(ATSAttributes.TEAM_USES_VERSIONS_ATTRIBUTE.getStoreName(), true);
+ }
+ if (teamDefOptions.contains(TeamDefinitionOptions.RequireTargetedVersion)) {
+ addWorkRule(RuleWorkItemId.atsRequireTargetedVersion.name());
+ }
+
+ // Relate to actionable items
+ for (ActionableItemArtifact aia : actionableItems) {
+ addRelation(AtsRelation.TeamActionableItem_ActionableItem, aia);
+ }
+ AtsCache.cache(this);
+ }
+
+ public static Set<TeamDefinitionArtifact> getTopLevelTeamDefinitions(Active active) throws OseeCoreException {
+ TeamDefinitionArtifact topTeamDef = getTopTeamDefinition();
+ if (topTeamDef == null) return EMPTY_SET;
+ return AtsLib.getActiveSet(Artifacts.getChildrenOfTypeSet(topTeamDef, TeamDefinitionArtifact.class, false),
+ active, TeamDefinitionArtifact.class);
+ }
+
+ public Branch getParentBranch() throws OseeCoreException {
+ try {
+ Integer branchId = getSoleAttributeValue(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(), 0);
+ if (branchId != null && branchId > 0) {
+ return BranchManager.getBranch(branchId);
+ }
+ } catch (BranchDoesNotExist ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /**
+ * This method will walk up the TeamDefinition tree until a def is found that configured with versions. This allows
+ * multiple TeamDefinitions to be versioned/released together by having the parent hold the versions. It is not
+ * required that a product configured in ATS uses the versions option. If no parent with versions is found, null is
+ * returned. If boolean "Team Uses Versions" is false, just return cause this team doesn't use versions
+ *
+ * @return parent TeamDefinition that holds the version definitions
+ */
+ public TeamDefinitionArtifact getTeamDefinitionHoldingVersions() throws OseeCoreException {
+ if (!isTeamUsesVersions()) return null;
+ if (getVersionsArtifacts().size() > 0) return this;
+ if (getParent() instanceof TeamDefinitionArtifact) {
+ TeamDefinitionArtifact parentTda = (TeamDefinitionArtifact) getParent();
+ if (parentTda != null) return parentTda.getTeamDefinitionHoldingVersions();
+ }
+ return null;
+ }
+
+ /**
+ * This method will walk up the TeamDefinition tree until a def is found that configured with work flow.
+ *
+ * @return parent TeamDefinition that holds the work flow id attribute
+ */
+ public TeamDefinitionArtifact getTeamDefinitionHoldingWorkFlow() throws OseeCoreException {
+ for (Artifact artifact : getRelatedArtifacts(AtsRelation.WorkItem__Child, Artifact.class)) {
+ if (artifact.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ return this;
+ }
+ }
+ if (getParent() instanceof TeamDefinitionArtifact) {
+ TeamDefinitionArtifact parentTda = (TeamDefinitionArtifact) getParent();
+ if (parentTda != null) return parentTda.getTeamDefinitionHoldingWorkFlow();
+ }
+ return null;
+ }
+
+ public VersionArtifact getNextReleaseVersion() throws OseeCoreException {
+ for (VersionArtifact verArt : getRelatedArtifacts(AtsRelation.TeamDefinitionToVersion_Version,
+ VersionArtifact.class)) {
+ if (verArt.getSoleAttributeValue(ATSAttributes.NEXT_VERSION_ATTRIBUTE.getStoreName(), false)) {
+ return verArt;
+ }
+ }
+ return null;
+ }
+
+ public Collection<VersionArtifact> getVersionsFromTeamDefHoldingVersions(VersionReleaseType releaseType) throws OseeCoreException {
+ TeamDefinitionArtifact teamDef = getTeamDefinitionHoldingVersions();
+ if (teamDef == null) return new ArrayList<VersionArtifact>();
+ return teamDef.getVersionsArtifacts(releaseType);
+ }
+
+ public static List<TeamDefinitionArtifact> getTeamDefinitions(Active active) throws OseeCoreException {
+ return AtsCache.getArtifactsByActive(active, TeamDefinitionArtifact.class);
+ }
+
+ public static Set<TeamDefinitionArtifact> getTeamTopLevelDefinitions(Active active) throws OseeCoreException {
+ TeamDefinitionArtifact topTeamDef = getTopTeamDefinition();
+ if (topTeamDef == null) return EMPTY_SET;
+ return AtsLib.getActiveSet(Artifacts.getChildrenOfTypeSet(topTeamDef, TeamDefinitionArtifact.class, false),
+ active, TeamDefinitionArtifact.class);
+ }
+
+ public static TeamDefinitionArtifact getTopTeamDefinition() throws OseeCoreException {
+ return (TeamDefinitionArtifact) StaticIdManager.getSingletonArtifactOrException(
+ TeamDefinitionArtifact.ARTIFACT_NAME, TOP_TEAM_STATIC_ID, AtsPlugin.getAtsBranch());
+ }
+
+ public static Set<TeamDefinitionArtifact> getTeamReleaseableDefinitions(Active active) throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ for (TeamDefinitionArtifact teamDef : getTeamDefinitions(active)) {
+ if (teamDef.getVersionsArtifacts().size() > 0) {
+ teamDefs.add(teamDef);
+ }
+ }
+ return teamDefs;
+ }
+
+ public static Collection<TeamDefinitionArtifact> getImpactedTeamDefs(Collection<ActionableItemArtifact> aias) throws OseeCoreException {
+ Set<TeamDefinitionArtifact> resultTeams = new HashSet<TeamDefinitionArtifact>();
+ for (ActionableItemArtifact aia : aias) {
+ resultTeams.addAll(getImpactedTeamDefInherited(aia));
+ }
+ return resultTeams;
+ }
+
+ private static List<TeamDefinitionArtifact> getImpactedTeamDefInherited(ActionableItemArtifact aia) throws OseeCoreException {
+ if (aia.getRelatedArtifacts(AtsRelation.TeamActionableItem_Team).size() > 0) {
+ return aia.getRelatedArtifacts(AtsRelation.TeamActionableItem_Team, TeamDefinitionArtifact.class);
+ }
+ Artifact parentArt = aia.getParent();
+ if (parentArt instanceof ActionableItemArtifact) return getImpactedTeamDefInherited((ActionableItemArtifact) parentArt);
+ return java.util.Collections.emptyList();
+ }
+
+ public static Set<TeamDefinitionArtifact> getTeamsFromItemAndChildren(ActionableItemArtifact aia) throws OseeCoreException {
+ Set<TeamDefinitionArtifact> aiaTeams = new HashSet<TeamDefinitionArtifact>();
+ getTeamFromItemAndChildren(aia, aiaTeams);
+ return aiaTeams;
+ }
+
+ public static Set<TeamDefinitionArtifact> getTeamsFromItemAndChildren(TeamDefinitionArtifact teamDef) throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ teamDefs.add(teamDef);
+ for (Artifact art : teamDef.getChildren()) {
+ if (art instanceof TeamDefinitionArtifact) {
+ teamDefs.addAll(getTeamsFromItemAndChildren((TeamDefinitionArtifact) art));
+ }
+ }
+ return teamDefs;
+ }
+
+ private static void getTeamFromItemAndChildren(ActionableItemArtifact aia, Set<TeamDefinitionArtifact> aiaTeams) throws OseeCoreException {
+ if (aia.getRelatedArtifacts(AtsRelation.TeamActionableItem_Team).size() > 0) {
+ aiaTeams.addAll(aia.getRelatedArtifacts(AtsRelation.TeamActionableItem_Team, TeamDefinitionArtifact.class));
+ }
+ for (Artifact childArt : aia.getChildren()) {
+ if (childArt instanceof ActionableItemArtifact) {
+ getTeamFromItemAndChildren((ActionableItemArtifact) childArt, aiaTeams);
+ }
+ }
+ }
+
+ public double getManDayHrsFromItemAndChildren() {
+ return getManDayHrsFromItemAndChildren(this);
+ }
+
+ public WorkFlowDefinition getWorkFlowDefinition() throws OseeCoreException {
+ Artifact teamDef = getTeamDefinitionHoldingWorkFlow();
+ if (teamDef == null) return null;
+ Artifact workFlowArt = null;
+ for (Artifact artifact : teamDef.getRelatedArtifacts(AtsRelation.WorkItem__Child, Artifact.class)) {
+ if (artifact.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ if (workFlowArt != null) {
+ OseeLog.log(
+ AtsPlugin.class,
+ Level.SEVERE,
+ "Multiple workflows found where only one expected for Team Definition " + getHumanReadableId() + " - " + getDescriptiveName());
+ }
+ workFlowArt = artifact;
+ }
+ }
+ if (workFlowArt == null) {
+ return null;
+ }
+ return (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(workFlowArt.getDescriptiveName());
+ }
+
+ /**
+ * Return rules associated with team definition . Use SMAManager.getWorkRulesStartsWith to acquire these and work
+ * page rules and workflow rules.
+ *
+ * @param ruleId
+ * @return rule definitions
+ * @throws OseeCoreException
+ */
+ public Collection<WorkRuleDefinition> getWorkRulesStartsWith(String ruleId) throws OseeCoreException {
+ Set<WorkRuleDefinition> workRules = new HashSet<WorkRuleDefinition>();
+ if (ruleId == null || ruleId.equals("")) return workRules;
+ // Get work rules from team definition
+ for (WorkRuleDefinition workRuleDefinition : getWorkRules()) {
+ if (!workRuleDefinition.getId().equals("") && workRuleDefinition.getId().startsWith(ruleId)) {
+ workRules.add(workRuleDefinition);
+ }
+ }
+
+ return workRules;
+ }
+
+ public Collection<WorkRuleDefinition> getWorkRules() throws OseeCoreException {
+ Set<WorkRuleDefinition> workRules = new HashSet<WorkRuleDefinition>();
+ // Get work rules from team definition
+ for (Artifact art : getRelatedArtifacts(CoreRelationEnumeration.WorkItem__Child)) {
+ if (art.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ String id = art.getSoleAttributeValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), "");
+ if (id != null && !id.equals("")) {
+ workRules.add((WorkRuleDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(id));
+ }
+ }
+ }
+
+ return workRules;
+ }
+
+ /**
+ * If man days hours attribute is set, use it, otherwise, walk up the Team Definition tree. Value used in
+ * calculations.
+ *
+ * @param teamDef
+ * @return number of hours per single person per single day
+ */
+ public double getManDayHrsFromItemAndChildren(TeamDefinitionArtifact teamDef) {
+ try {
+ Double manDaysHrs = teamDef.getSoleAttributeValue(ATSAttributes.MAN_DAYS_NEEDED_ATTRIBUTE.getStoreName(), 0.0);
+ if (manDaysHrs != null && manDaysHrs != 0) return manDaysHrs;
+ if (teamDef.getParent() != null && (teamDef.getParent() instanceof TeamDefinitionArtifact)) return teamDef.getManDayHrsFromItemAndChildren((TeamDefinitionArtifact) teamDef.getParent());
+ return StateMachineArtifact.DEFAULT_MAN_HOURS_PER_DAY;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return 0.0;
+ }
+
+ /**
+ * Return ONLY leads configured for this TeamDefinitionArtifact. Depending on the use, like creating new actions, the
+ * assignees (or Leads) are determined first from users configured as leads of individual actionable items and only
+ * if that returns no leads, THEN default to using the leads configured for the TeamDefinition. In these cases, use
+ * getLeads(Collection<ActionableItemArtifact>) instead.
+ *
+ * @return users configured as leads for this TeamDefinitionArtifact
+ * @throws OseeCoreException
+ */
+ public Collection<User> getLeads() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.TeamLead_Lead, User.class);
+ }
+
+ public Collection<User> getPrivilegedMembers() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.PrivilegedMember_Member, User.class);
+ }
+
+ /**
+ * Returns leads configured first by ActionableItems and only if this is an empty set, THEN defaults to those
+ * configured by TeamDefinitions. Use getLeads() to only get the leads configured for this TeamDefinitionArtifact.
+ *
+ * @param actionableItems
+ * @return users configured as leads by ActionableItems, then by TeamDefinition
+ */
+ public Collection<User> getLeads(Collection<ActionableItemArtifact> actionableItems) throws OseeCoreException {
+ Set<User> leads = new HashSet<User>();
+ for (ActionableItemArtifact aia : actionableItems) {
+ if (aia.getImpactedTeamDefs().contains(this)) {
+ // If leads are specified for this aia, add them
+ if (aia.getLeads().size() > 0)
+ leads.addAll(aia.getLeads());
+ // Otherwise, add team definition's leads
+ else {
+ for (TeamDefinitionArtifact teamDef : aia.getImpactedTeamDefs()) {
+ leads.addAll(teamDef.getLeads());
+ }
+ }
+ }
+ }
+ if (leads.size() == 0) leads.addAll(getLeads());
+ return leads;
+ }
+
+ public Collection<User> getMembers() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.TeamMember_Member, User.class);
+ }
+
+ public VersionArtifact getVersionArtifact(String name, boolean create) throws OseeCoreException {
+ for (VersionArtifact verArt : getVersionsArtifacts()) {
+ if (verArt.getDescriptiveName().equals(name)) return verArt;
+ }
+ if (create) {
+ return createVersion(name);
+ }
+ return null;
+ }
+
+ public VersionArtifact createVersion(String name) throws OseeCoreException {
+ VersionArtifact versionArt =
+ (VersionArtifact) ArtifactTypeManager.addArtifact(VersionArtifact.ARTIFACT_NAME, AtsPlugin.getAtsBranch(),
+ name);
+ addRelation(AtsRelation.TeamDefinitionToVersion_Version, versionArt);
+ AtsCache.cache(versionArt);
+ return versionArt;
+ }
+
+ public Collection<VersionArtifact> getVersionsArtifacts() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.TeamDefinitionToVersion_Version, VersionArtifact.class);
+ }
+
+ public Collection<VersionArtifact> getVersionsArtifacts(VersionReleaseType releaseType) throws OseeCoreException {
+ ArrayList<VersionArtifact> versions = new ArrayList<VersionArtifact>();
+ for (VersionArtifact version : getVersionsArtifacts()) {
+ if (version.isReleased()) {
+ if (releaseType == VersionReleaseType.Released || releaseType == VersionReleaseType.Both) versions.add(version);
+ } else {
+ if (releaseType == VersionReleaseType.UnReleased || releaseType == VersionReleaseType.Both) versions.add(version);
+ }
+ }
+ return versions;
+ }
+
+ public boolean isTeamUsesVersions() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.TEAM_USES_VERSIONS_ATTRIBUTE.getStoreName(), false);
+ }
+
+ public boolean isActionable() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.ACTIONABLE_ATTRIBUTE.getStoreName(), false);
+ }
+
+ public void addWorkRule(String ruleId) throws OseeCoreException {
+ if (!hasWorkRule(ruleId)) {
+ Artifact artifact = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(ruleId);
+ if (artifact == null)
+ throw new IllegalArgumentException("Rule \"" + ruleId + "\" does not exist.");
+ else {
+ addRelation(CoreRelationEnumeration.WorkItem__Child, artifact);
+ }
+ }
+ }
+
+ public boolean hasWorkRule(String ruleId) throws OseeCoreException {
+ for (Artifact art : getRelatedArtifacts(CoreRelationEnumeration.WorkItem__Child)) {
+ if (art.getDescriptiveName().equals(ruleId)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the branch associated with this team. If this team does not have a branch associated then the parent team
+ * will be asked, this results in a recursive look at parent teams until a parent artifact has a related branch or
+ * the parent of a team is not a team. <br/>
+ * <br/>
+ * If no branch is associated then null will be returned.
+ *
+ * @throws BranchDoesNotExist
+ */
+ public Branch getTeamBranch() throws OseeCoreException {
+ Integer branchId = getSoleAttributeValue(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(), null);
+ if (branchId != null && branchId > 0) {
+ return BranchManager.getBranch(branchId);
+ } else {
+ Artifact parent = getParent();
+ if (parent instanceof TeamDefinitionArtifact) {
+ return ((TeamDefinitionArtifact) parent).getTeamBranch();
+ }
+ }
+ return null;
+ }
+
+ public static Set<TeamDefinitionArtifact> getTeamDefinitions(Collection<String> teamDefNames) throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ for (String teamDefName : teamDefNames) {
+ teamDefs.addAll(AtsCache.getArtifactsByName(teamDefName, TeamDefinitionArtifact.class));
+ }
+ return teamDefs;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.util.widgets.commit.ICommitConfigArtifact#getFullDisplayName()
+ */
+ @Override
+ public String getFullDisplayName() throws OseeCoreException {
+ return getDescriptiveName();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java
new file mode 100644
index 00000000000..a0a455bcf5e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkFlowArtifact.java
@@ -0,0 +1,604 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.artifact;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.ats.util.widgets.XActionableItemsDam;
+import org.eclipse.osee.ats.util.widgets.dialog.AICheckTreeDialog;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSStateMachineArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.IBranchArtifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamWorkFlowArtifact extends TaskableStateMachineArtifact implements IWorldViewArtifact, IBranchArtifact, IATSStateMachineArtifact {
+
+ public static String ARTIFACT_NAME = "Team Workflow";
+ private XActionableItemsDam actionableItemsDam;
+ public static enum DefaultTeamState {
+ Endorse, Analyze, Authorize, Implement, Completed, Cancelled
+ }
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public TeamWorkFlowArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ registerSMAEditorRelation(AtsRelation.TeamWorkflowTargetedForVersion_Version);
+ registerAtsWorldRelation(AtsRelation.TeamWorkflowToReview_Review);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getArtifactSuperTypeName()
+ */
+ @Override
+ public String getArtifactSuperTypeName() {
+ return "Team Workflow";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#saveSMA()
+ */
+ @Override
+ public void saveSMA(SkynetTransaction transaction) {
+ super.saveSMA(transaction);
+ try {
+ getParentActionArtifact().resetAttributesOffChildren(transaction);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't reset Action parent of children", ex);
+ }
+ }
+
+ @Override
+ public String getDescription() {
+ try {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ } catch (Exception ex) {
+ return "Error: " + ex.getLocalizedMessage();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#isValidationRequired()
+ */
+ @Override
+ public boolean isValidationRequired() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName(), false);
+ }
+
+ @Override
+ public int getWorldViewPercentRework() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.PERCENT_REWORK_ATTRIBUTE.getStoreName(), 0);
+ }
+
+ @Override
+ public Set<User> getPrivilegedUsers() {
+ Set<User> users = new HashSet<User>();
+ try {
+ addPriviledgedUsersUpTeamDefinitionTree(getTeamDefinition(), users);
+
+ WorkPageDefinition workPageDefinition = smaMgr.getWorkPageDefinition();
+
+ // Add user if allowing privileged edit to all users
+ if (!users.contains(UserManager.getUser()) && (workPageDefinition.hasWorkRule(RuleWorkItemId.atsAllowPriviledgedEditToAll.name()) || getTeamDefinition().hasWorkRule(
+ RuleWorkItemId.atsAllowPriviledgedEditToAll.name()))) {
+ users.add(UserManager.getUser());
+ }
+
+ // Add user if user is team member and rule exists
+ if (!users.contains(UserManager.getUser()) && (workPageDefinition.hasWorkRule(RuleWorkItemId.atsAllowPriviledgedEditToTeamMember.name()) || getTeamDefinition().hasWorkRule(
+ RuleWorkItemId.atsAllowPriviledgedEditToTeamMember.name()))) {
+ if (getTeamDefinition().getMembers().contains(UserManager.getUser())) {
+ users.add(UserManager.getUser());
+ }
+ }
+
+ // Add user if team member is originator and rule exists
+ if (!users.contains(UserManager.getUser()) && (workPageDefinition.hasWorkRule(RuleWorkItemId.atsAllowPriviledgedEditToTeamMemberAndOriginator.name()) || getTeamDefinition().hasWorkRule(
+ RuleWorkItemId.atsAllowPriviledgedEditToTeamMemberAndOriginator.name()))) {
+ if (smaMgr.getOriginator().equals(UserManager.getUser()) && getTeamDefinition().getMembers().contains(
+ UserManager.getUser())) {
+ users.add(UserManager.getUser());
+ }
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return users;
+ }
+
+ private void addPriviledgedUsersUpTeamDefinitionTree(TeamDefinitionArtifact tda, Set<User> users) throws OseeCoreException {
+ users.addAll(tda.getLeads());
+ users.addAll(tda.getPrivilegedMembers());
+
+ // Walk up tree to get other editors
+ if (tda.getParent() != null && (tda.getParent() instanceof TeamDefinitionArtifact)) {
+ addPriviledgedUsersUpTeamDefinitionTree((TeamDefinitionArtifact) tda.getParent(), users);
+ }
+ }
+
+ @Override
+ public String getEditorTitle() throws OseeCoreException {
+ return getTeamTitle();
+ }
+
+ @Override
+ public void onInitializationComplete() {
+ super.onInitializationComplete();
+ initializeSMA();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#initializeSMA()
+ */
+ @Override
+ protected void initializeSMA() {
+ super.initializeSMA();
+ actionableItemsDam = new XActionableItemsDam(this);
+ }
+
+ public ChangeType getChangeType() throws OseeCoreException {
+ return ChangeType.getChangeType(getSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ public void setChangeType(ChangeType type) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), type.name());
+ }
+
+ public PriorityType getPriority() throws OseeCoreException {
+ return PriorityType.getPriority(getSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ public void setPriority(PriorityType type) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), type.getShortName());
+ }
+
+ /**
+ * @return Returns the actionableItemsDam.
+ */
+ public XActionableItemsDam getActionableItemsDam() {
+ return actionableItemsDam;
+ }
+
+ public void setTeamDefinition(TeamDefinitionArtifact tda) throws OseeCoreException {
+ this.setSoleAttributeValue(ATSAttributes.TEAM_DEFINITION_GUID_ATTRIBUTE.getStoreName(), tda.getGuid());
+ }
+
+ public TeamDefinitionArtifact getTeamDefinition() throws OseeCoreException, OseeCoreException {
+ String guid = this.getSoleAttributeValue(ATSAttributes.TEAM_DEFINITION_GUID_ATTRIBUTE.getStoreName(), "");
+ if (guid == null || guid.equals("")) throw new IllegalArgumentException(
+ "TeamWorkflow [" + getHumanReadableId() + "] has no TeamDefinition associated.");
+ return AtsCache.getTeamDefinitionArtifact(guid);
+ }
+
+ public String getTeamTitle() throws OseeCoreException {
+ if (getWorldViewTargetedVersion() != null) {
+ return "[" + getTeamName() + "][" + getWorldViewTargetedVersionStr() + "] - " + getDescriptiveName();
+ } else {
+ return "[" + getTeamName() + "] - " + getDescriptiveName();
+ }
+ }
+
+ public String getTeamName() {
+ try {
+ return getTeamDefinition().getDescriptiveName();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ }
+
+ @Override
+ public String getWorldViewType() throws OseeCoreException {
+ return getTeamName() + " Workflow";
+ }
+
+ @Override
+ public ChangeType getWorldViewChangeType() throws OseeCoreException {
+ return ChangeType.getChangeType(getSoleAttributeValue(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ @Override
+ public String getWorldViewPriority() throws OseeCoreException {
+ return PriorityType.getPriority(getSoleAttributeValue(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName(), "")).getShortName();
+ }
+
+ @Override
+ public String getWorldViewUserCommunity() throws OseeCoreException {
+ return getAttributesToString(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName());
+ }
+
+ @Override
+ public String getWorldViewActionableItems() throws OseeCoreException {
+ return getActionableItemsDam().getActionableItemsStr();
+ }
+
+ @Override
+ public void atsDelete(Set<Artifact> deleteArts, Map<Artifact, Object> allRelated) throws OseeCoreException {
+ super.atsDelete(deleteArts, allRelated);
+ for (ReviewSMArtifact reviewArt : smaMgr.getReviewManager().getReviews())
+ reviewArt.atsDelete(deleteArts, allRelated);
+ }
+
+ @Override
+ public String getWorldViewTeam() throws OseeCoreException {
+ return getTeamName();
+ }
+
+ @Override
+ public ActionArtifact getParentActionArtifact() throws OseeCoreException {
+ Collection<ActionArtifact> arts = getRelatedArtifacts(AtsRelation.ActionToWorkflow_Action, ActionArtifact.class);
+ if (arts.size() == 0) {
+ throw new OseeStateException("Team " + getHumanReadableId() + " has no parent Action");
+ } else if (arts.size() > 1) {
+ throw new OseeStateException("Team " + getHumanReadableId() + " has multiple parent Actions");
+ } else
+ return arts.iterator().next();
+ }
+
+ @Override
+ public String getWorldViewTargetedVersionStr() throws OseeCoreException {
+ Collection<VersionArtifact> verArts =
+ getRelatedArtifacts(AtsRelation.TeamWorkflowTargetedForVersion_Version, VersionArtifact.class);
+ if (verArts.size() == 0) return "";
+ if (verArts.size() > 1) {
+ String errStr =
+ "Workflow " + smaMgr.getSma().getHumanReadableId() + " targeted for multiple versions: " + Artifacts.commaArts(verArts);
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr, null);
+ return XViewerCells.getCellExceptionString(errStr);
+ }
+ VersionArtifact verArt = verArts.iterator().next();
+ if (!smaMgr.isCompleted() && !smaMgr.isCancelled() && verArt.getSoleAttributeValue(
+ ATSAttributes.RELEASED_ATTRIBUTE.getStoreName(), false)) {
+ String errStr =
+ "Workflow " + smaMgr.getSma().getHumanReadableId() + " targeted for released version, but not completed: " + verArt;
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr, null);
+ return XViewerCells.getCellExceptionString(errStr);
+ }
+ return verArt.getDescriptiveName();
+ }
+
+ @Override
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException {
+ if (getRelatedArtifactsCount(AtsRelation.TeamWorkflowTargetedForVersion_Version) > 0) {
+ return (VersionArtifact) getRelatedArtifact(AtsRelation.TeamWorkflowTargetedForVersion_Version);
+ }
+ return null;
+ }
+
+ @Override
+ public String getHyperName() {
+ try {
+ return getEditorTitle();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return getTeamName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperTargetVersion()
+ */
+ @Override
+ public String getHyperTargetVersion() {
+ try {
+ return getWorldViewTargetedVersionStr().equals("") ? null : getWorldViewTargetedVersionStr();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public double getManHrsPerDayPreference() throws OseeCoreException {
+ try {
+ return getTeamDefinition().getManDayHrsFromItemAndChildren();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return super.getManHrsPerDayPreference();
+ }
+
+ public Result editActionableItems() throws OseeCoreException {
+ return getParentActionArtifact().editActionableItems();
+ }
+
+ public Result convertActionableItems() throws OseeCoreException {
+ Result toReturn = Result.FalseResult;
+ AICheckTreeDialog diag =
+ new AICheckTreeDialog("Convert Impacted Actionable Items",
+ "NOTE: This should NOT be the normal path to changing actionable items.\n\nIf a team has " +
+ //
+ "determined " + "that there is NO impact and that another actionable items IS impacted:\n" +
+ //
+ " 1) Cancel this operation\n" + " 2) Select \"Edit Actionable Items\" to add/remove " +
+ //
+ "impacted items \n" + " which will create new teams as needed.\n" +
+ //
+ " 3) Then cancel the team that has no impacts.\n Doing this will show that the original " +
+ //
+ "team analyzed the impact\n" + " and determined that there was no change.\n\n" + "However, " +
+ //
+ "there are some cases where an impacted item was incorrectly chosen\n" + "and the original team " +
+ //
+ "does not need to do anything, this dialog will purge the\n" + "team from the DB as if it was " +
+ //
+ "never chosen.\n\n" + "Current Actionable Item(s): " + getWorldViewActionableItems() + "\n" +
+ //
+ "Current Team: " + getTeamDefinition().getDescriptiveName() + "\n" +
+ //
+ "Select SINGLE Actionable Item below to convert this workflow to.\n\n" +
+ //
+ "You will be prompted to confirm this conversion.", Active.Both);
+
+ diag.setInput(ActionableItemArtifact.getTopLevelActionableItems(Active.Both));
+ if (diag.open() != 0) return Result.FalseResult;
+ if (diag.getChecked().size() == 0) return new Result("At least one actionable item must must be selected.");
+ if (diag.getChecked().size() > 1) return new Result("Only ONE actionable item can be selected for converts");
+ ActionableItemArtifact selectedAia = diag.getChecked().iterator().next();
+ Collection<TeamDefinitionArtifact> teamDefs =
+ ActionableItemArtifact.getImpactedTeamDefs(Arrays.asList(selectedAia));
+ if (teamDefs.size() != 1) {
+ toReturn = new Result("Single team can not retrieved for " + selectedAia.getDescriptiveName());
+ } else {
+ TeamDefinitionArtifact newTeamDef = teamDefs.iterator().next();
+ if (newTeamDef.equals(getTeamDefinition())) {
+ toReturn =
+ new Result(
+ "Actionable Item selected belongs to same team as currently selected team.\n" + "Use \"Edit Actionable Items\" instaed.");
+ } else {
+ StringBuffer sb = new StringBuffer();
+ sb.append("Converting...");
+ sb.append("\nActionable Item(s): " + getWorldViewActionableItems());
+ sb.append("\nTeam: " + getTeamDefinition().getDescriptiveName());
+ sb.append("\nto\nActionable Item(s): " + selectedAia);
+ sb.append("\nTeam: " + newTeamDef.getDescriptiveName());
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Confirm Convert", sb.toString())) {
+ Set<ActionableItemArtifact> toProcess = new HashSet<ActionableItemArtifact>();
+ toProcess.add(selectedAia);
+ toReturn = actionableItemsTx(AtsPlugin.getAtsBranch(), toProcess, newTeamDef);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getParentSMA()
+ */
+ @Override
+ public StateMachineArtifact getParentSMA() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getParentAtsArtifact()
+ */
+ @Override
+ public Artifact getParentAtsArtifact() throws OseeCoreException {
+ return getParentActionArtifact();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDescription()
+ */
+ @Override
+ public String getWorldViewDescription() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ }
+
+ /**
+ * If targeted for version exists, return that estimated date. Else, if attribute is set, return that date. Else
+ * null.
+ */
+ @Override
+ public Date getWorldViewEstimatedReleaseDate() throws OseeCoreException {
+ Collection<VersionArtifact> vers =
+ getRelatedArtifacts(AtsRelation.TeamWorkflowTargetedForVersion_Version, VersionArtifact.class);
+ Date date = null;
+ if (vers.size() > 0) {
+ date = vers.iterator().next().getEstimatedReleaseDate();
+ if (date == null) {
+ date = getSoleAttributeValue(ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ }
+ } else
+ date = getSoleAttributeValue(ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ return date;
+ }
+
+ /**
+ * If targeted for version exists, return that estimated date. Else, if attribute is set, return that date. Else
+ * null.
+ */
+ @Override
+ public Date getWorldViewReleaseDate() throws OseeCoreException {
+ Collection<VersionArtifact> vers =
+ getRelatedArtifacts(AtsRelation.TeamWorkflowTargetedForVersion_Version, VersionArtifact.class);
+ Date date = null;
+ if (vers.size() > 0) {
+ date = vers.iterator().next().getReleaseDate();
+ if (date == null) {
+ date = getSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ }
+ } else
+ date = getSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ return date;
+ }
+
+ @Override
+ public Collection<User> getImplementers() throws OseeCoreException {
+ return getImplementersByState(DefaultTeamState.Implement.name());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDateStr()
+ */
+ @Override
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException {
+ Date date = getWorldViewDeadlineDate();
+ if (date != null) {
+ return XDate.getDateStr(date, XDate.MMDDYY);
+ }
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewDeadlineDate()
+ */
+ @Override
+ public Date getWorldViewDeadlineDate() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName(), null);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewWeeklyBenefit()
+ */
+ @Override
+ public double getWorldViewWeeklyBenefit() throws OseeCoreException {
+ if (isAttributeTypeValid(ATSAttributes.WEEKLY_BENEFIT_ATTRIBUTE.getStoreName())) return 0;
+ String value = getSoleAttributeValue(ATSAttributes.WEEKLY_BENEFIT_ATTRIBUTE.getStoreName(), "");
+ if (value == null || value.equals("")) return 0;
+ return new Float(value).doubleValue();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewAnnualCostAvoidance()
+ */
+ @Override
+ public double getWorldViewAnnualCostAvoidance() throws OseeCoreException {
+ double benefit = getWorldViewWeeklyBenefit();
+ double remainHrs = getRemainHoursTotal();
+ return (benefit * 52) - remainHrs;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.artifact.StateMachineArtifact#getParentTeamWorkflow()
+ */
+ @Override
+ public TeamWorkFlowArtifact getParentTeamWorkflow() throws OseeCoreException {
+ return this;
+ }
+
+ private Result actionableItemsTx(Branch branch, Set<ActionableItemArtifact> selectedAlias, TeamDefinitionArtifact teamDefinition) throws OseeCoreException {
+ Result workResult = actionableItemsDam.setActionableItems(selectedAlias);
+ if (workResult.isTrue()) {
+ if (teamDefinition != null) setTeamDefinition(teamDefinition);
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ getParentActionArtifact().resetAttributesOffChildren(transaction);
+ persistAttributes(transaction);
+ transaction.execute();
+ }
+ return workResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewBranchStatus()
+ */
+ @Override
+ public String getWorldViewBranchStatus() throws OseeCoreException {
+ try {
+ if (getSmaMgr().getBranchMgr().isWorkingBranchInWork())
+ return "Working";
+ else if (getSmaMgr().getBranchMgr().isCommittedBranchExists()) {
+ if (!getSmaMgr().getBranchMgr().isAllObjectsToCommitToConfigured() || !getSmaMgr().getBranchMgr().isBranchesAllCommitted()) {
+ return "Needs Commit";
+ }
+ return "Committed";
+ }
+ return "";
+ } catch (Exception ex) {
+ return "Exception: " + ex.getLocalizedMessage();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IBranchArtifact#getArtifact()
+ */
+ public Artifact getArtifact() {
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IBranchArtifact#getCommitManagerBranch()
+ */
+ public Branch getWorkingBranch() throws OseeCoreException {
+ if (getSmaMgr().getBranchMgr().getWorkingBranch() != null) {
+ return getSmaMgr().getBranchMgr().getWorkingBranch();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldViewArtifact#getWorldViewParentID()
+ */
+ @Override
+ public String getWorldViewParentID() throws OseeCoreException {
+ return getParentActionArtifact().getHumanReadableId();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowExtensions.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowExtensions.java
new file mode 100644
index 00000000000..e8e4b6c7893
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowExtensions.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.ats.artifact;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.wizard.IAtsTeamWorkflow;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamWorkflowExtensions {
+
+ private static TeamWorkflowExtensions instance = new TeamWorkflowExtensions();
+ private static Set<IAtsTeamWorkflow> teamWorkflowExtensionItems;
+
+ private TeamWorkflowExtensions() {
+ instance = this;
+ }
+
+ public static TeamWorkflowExtensions getInstance() {
+ return instance;
+ }
+
+ public Set<String> getAllTeamWorkflowArtifactNames() throws OseeCoreException {
+ Set<String> artifactNames = new HashSet<String>();
+ artifactNames.add(TeamWorkFlowArtifact.ARTIFACT_NAME);
+ for (IAtsTeamWorkflow ext : getAtsTeamWorkflowExtensions()) {
+ artifactNames.addAll(ext.getTeamWorkflowArtifactNames());
+ }
+ return artifactNames;
+ }
+
+ @SuppressWarnings( {"unchecked"})
+ public Set<IAtsTeamWorkflow> getAtsTeamWorkflowExtensions() {
+ if (teamWorkflowExtensionItems != null) return teamWorkflowExtensionItems;
+ teamWorkflowExtensionItems = new HashSet<IAtsTeamWorkflow>();
+
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsTeamWorkflow");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsTeamWorkflow extension point");
+ return teamWorkflowExtensionItems;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsTeamWorkflow")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ teamWorkflowExtensionItems.add((IAtsTeamWorkflow) obj);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error loading AtsTeamWorkflow extension", ex);
+ }
+ }
+ }
+ }
+ }
+ return teamWorkflowExtensionItems;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowLabelProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowLabelProvider.java
new file mode 100644
index 00000000000..d4dda9ee7f2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowLabelProvider.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.ats.artifact;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamWorkflowLabelProvider extends ArtifactLabelProvider {
+
+ /**
+ *
+ */
+ public TeamWorkflowLabelProvider() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ TeamWorkFlowArtifact wf = (TeamWorkFlowArtifact) element;
+ try {
+ return wf.getTeamTitle();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return "Exception: " + ex.getLocalizedMessage();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowManager.java
new file mode 100644
index 00000000000..cdd7a24101e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/TeamWorkflowManager.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.ats.artifact;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * Methods in support of programatically transitioning the DefaultWorkFlow through it's states. Only to be used for the
+ * DefaultTeamWorkflow of Endorse->Analyze->Auth->Implement->Complete
+ *
+ * @author Donald G. Dunne
+ */
+public class TeamWorkflowManager {
+
+ private final SMAManager smaMgr;
+ private final TeamWorkFlowArtifact teamArt;
+
+ public TeamWorkflowManager(TeamWorkFlowArtifact teamArt) {
+ this.teamArt = teamArt;
+ smaMgr = new SMAManager(teamArt);
+ }
+
+ /**
+ * Quickly transition to a state with minimal metrics and data entered. Should only be used for automated transition
+ * for things such as developmental testing and demos.
+ *
+ * @param toState
+ * @param user User to transition to OR null if should use user of current state
+ * @param popup
+ * @param transaction
+ * @return Result
+ * @throws Exception
+ */
+ public Result transitionTo(DefaultTeamState toState, User user, boolean popup, SkynetTransaction transaction) throws OseeCoreException {
+ Result result = setEndorseData(null, 100, .2);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ result =
+ smaMgr.transition(DefaultTeamState.Analyze.name(),
+ (user != null ? user : smaMgr.getStateMgr().getAssignees().iterator().next()), transaction,
+ TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ if (toState == DefaultTeamState.Analyze) return Result.TrueResult;
+
+ result = setAnalyzeData(null, null, 1, 100, .2);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ result =
+ smaMgr.transition(DefaultTeamState.Authorize.name(),
+ (user != null ? user : smaMgr.getStateMgr().getAssignees().iterator().next()), transaction,
+ TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ if (toState == DefaultTeamState.Authorize) return Result.TrueResult;
+
+ result = setAuthorizeData(100, .2);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+
+ result =
+ smaMgr.transition(DefaultTeamState.Implement.name(),
+ (user != null ? user : smaMgr.getStateMgr().getAssignees().iterator().next()), transaction,
+ TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ if (toState == DefaultTeamState.Implement) return Result.TrueResult;
+
+ result =
+ smaMgr.transition(DefaultTeamState.Completed.name(),
+ (user != null ? user : smaMgr.getStateMgr().getAssignees().iterator().next()), transaction,
+ TransitionOption.None);
+ if (result.isFalse()) {
+ if (popup) result.popup();
+ return result;
+ }
+ return Result.TrueResult;
+
+ }
+
+ public Result setEndorseData(String propRes, int statePercentComplete, double stateHoursSpent) throws OseeCoreException {
+ if (!smaMgr.getStateMgr().getCurrentStateName().equals("Endorse")) return new Result(
+ "Action not in Endorse state");
+ smaMgr.getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+ public Result setAnalyzeData(String problem, String propRes, double hourEstimate, int statePercentComplete, double stateHoursSpent) throws OseeCoreException {
+ if (!smaMgr.getStateMgr().getCurrentStateName().equals("Analyze")) return new Result(
+ "Action not in Analyze state");
+ teamArt.setSoleAttributeValue(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(), hourEstimate);
+ smaMgr.getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+ public Result setAuthorizeData(int statePercentComplete, double stateHoursSpent) throws OseeCoreException {
+ if (!smaMgr.getStateMgr().getCurrentStateName().equals("Authorize")) return new Result(
+ "Action not in Authorize state");
+ smaMgr.getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+ public Result setImplementData(String resolution, int statePercentComplete, double stateHoursSpent) throws OseeCoreException {
+ if (!smaMgr.getStateMgr().getCurrentStateName().equals("Implement")) return new Result(
+ "Action not in Implement state");
+ smaMgr.getStateMgr().updateMetrics(stateHoursSpent, statePercentComplete, true);
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/VersionArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/VersionArtifact.java
new file mode 100644
index 00000000000..b4f53816f5e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/artifact/VersionArtifact.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.artifact;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.commit.ICommitConfigArtifact;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+public class VersionArtifact extends Artifact implements ICommitConfigArtifact {
+
+ public static String ARTIFACT_NAME = "Version";
+
+ public static enum VersionReleaseType {
+ Released, UnReleased, Both
+ };
+
+ public VersionArtifact(ArtifactFactory parentFactory, String guid, String humandReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humandReadableId, branch, artifactType);
+ }
+
+ public Result isCreateBranchAllowed() throws OseeCoreException {
+ if (getSoleAttributeValue(ATSAttributes.ALLOW_CREATE_BRANCH.getStoreName(), false) == false) {
+ return new Result(false, "Branch creation disabled for Version [" + this + "]");
+ }
+ if (getParentBranch() == null) {
+ return new Result(false, "Parent Branch not configured for Version [" + this + "]");
+ }
+ return Result.TrueResult;
+ }
+
+ public Result isCommitBranchAllowed() throws OseeCoreException {
+ if (getSoleAttributeValue(ATSAttributes.ALLOW_COMMIT_BRANCH.getStoreName(), false) == false) {
+ return new Result(false, "Version [" + this + "] not configured to allow branch commit.");
+ }
+ if (getParentBranch() == null) {
+ return new Result(false, "Parent Branch not configured for Version [" + this + "]");
+ }
+ return Result.TrueResult;
+ }
+
+ public Branch getParentBranch() throws OseeCoreException {
+ try {
+ Integer branchId = getSoleAttributeValue(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(), 0);
+ if (branchId != null && branchId > 0) {
+ return BranchManager.getBranch(branchId);
+ }
+ } catch (BranchDoesNotExist ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ public TeamDefinitionArtifact getParentTeamDefinition() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.TeamDefinitionToVersion_TeamDefinition, TeamDefinitionArtifact.class).iterator().next();
+ }
+
+ public Boolean isReleased() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.RELEASED_ATTRIBUTE.getStoreName(), false);
+ }
+
+ public Boolean isNextVersion() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.NEXT_VERSION_ATTRIBUTE.getStoreName(), false);
+ }
+
+ public void getParallelVersions(Set<ICommitConfigArtifact> configArts) throws OseeCoreException {
+ configArts.add(this);
+ for (VersionArtifact verArt : getRelatedArtifacts(AtsRelation.ParallelVersion_Child, VersionArtifact.class)) {
+ verArt.getParallelVersions(configArts);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getDescriptiveName();
+ }
+
+ public void setReleased(boolean released) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.RELEASED_ATTRIBUTE.getStoreName(), released);
+ }
+
+ public void setNextVersion(boolean nextVersion) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.NEXT_VERSION_ATTRIBUTE.getStoreName(), nextVersion);
+ }
+
+ public String getFullName() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.FULL_NAME_ATTRIBUTE.getStoreName(), "");
+ }
+
+ public void setFullName(String name) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.FULL_NAME_ATTRIBUTE.getStoreName(), name);
+ }
+
+ public String getDescription() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "");
+ }
+
+ public void setDescription(String desc) throws OseeCoreException {
+ setSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), desc);
+ }
+
+ public Collection<TeamWorkFlowArtifact> getTargetedForTeamArtifacts() throws OseeCoreException {
+ return getRelatedArtifacts(AtsRelation.TeamWorkflowTargetedForVersion_Workflow, TeamWorkFlowArtifact.class);
+ }
+
+ public String getFullDisplayName() throws OseeCoreException {
+ String str = "";
+ if (!getDescriptiveName().equals(Artifact.UNNAMED)) str += getDescriptiveName();
+ if (!getFullName().equals("")) {
+ if (str.equals(""))
+ str = getFullName();
+ else
+ str += " - " + getFullName();
+ }
+ if (!getDescription().equals("")) {
+ if (str.equals(""))
+ str = getDescription();
+ else
+ str += " - " + getDescription();
+ }
+ return str;
+ }
+
+ public TeamDefinitionArtifact getTeamDefinitionArtifact() throws OseeCoreException {
+ try {
+ return (TeamDefinitionArtifact) getRelatedArtifact(AtsRelation.TeamDefinitionToVersion_TeamDefinition);
+ } catch (ArtifactDoesNotExist ex) {
+ return null;
+ }
+ }
+
+ public Date getEstimatedReleaseDate() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ }
+
+ public Date getReleaseDate() throws OseeCoreException {
+ return getSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), null);
+ }
+
+ public static Set<VersionArtifact> getVersions(Collection<String> teamDefNames) throws OseeCoreException {
+ Set<VersionArtifact> teamDefs = new HashSet<VersionArtifact>();
+ for (String teamDefName : teamDefNames) {
+ teamDefs.add(getSoleVersion(teamDefName));
+ }
+ return teamDefs;
+ }
+
+ /**
+ * Refrain from using this method as Version Artifact names can be changed by the user.
+ *
+ * @param name
+ * @return Version
+ */
+ public static VersionArtifact getSoleVersion(String name) throws OseeCoreException {
+ return AtsCache.getArtifactsByName(name, VersionArtifact.class).iterator().next();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsBulkLoadCache.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsBulkLoadCache.java
new file mode 100644
index 00000000000..1cbd9e3dfe5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsBulkLoadCache.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.ats.config;
+
+import java.util.Arrays;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsBulkLoadCache extends org.eclipse.core.runtime.jobs.Job {
+
+ private AtsBulkLoadCache() {
+ super("Bulk Loading ATS Config Artifacts");
+ }
+
+ private static AtsBulkLoadCache bulkLoadAtsCacheJob;
+ private static boolean atsTypeDataLoadedStarted = false;
+
+ private synchronized static void ensureBulkLoading() {
+ if (atsTypeDataLoadedStarted) return;
+ atsTypeDataLoadedStarted = true;
+ bulkLoadAtsCacheJob = new AtsBulkLoadCache();
+ bulkLoadAtsCacheJob.setPriority(Job.SHORT);
+ bulkLoadAtsCacheJob.setSystem(true);
+ bulkLoadAtsCacheJob.schedule();
+ }
+
+ public static void run(boolean forcePend) {
+ ensureBulkLoading();
+ try {
+ if (forcePend) {
+ bulkLoadAtsCacheJob.join();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ OseeLog.log(AtsPlugin.class, Level.INFO, getName());
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (Artifact artifact : RelationManager.getRelatedArtifacts(
+ Arrays.asList(AtsConfig.getInstance().getOrCreateAtsHeadingArtifact(transaction)), 8,
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, AtsRelation.TeamDefinitionToVersion_Version)) {
+ AtsCache.cache(artifact);
+ }
+ transaction.execute();
+ WorkItemDefinitionFactory.loadDefinitions();
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsCache.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsCache.java
new file mode 100644
index 00000000000..bc78a2a480a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsCache.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.ats.config;
+
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData.ChangeType;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+
+/**
+ * Common cache storage for ATS configuration artifacts:<br>
+ * TeamDefinitionArtifact<br>
+ * VersionArtifact<br>
+ * ActionableItemArtifact<br>
+ * All other artifact types will silently not cached
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsCache implements IArtifactsPurgedEventListener, IFrameworkTransactionEventListener {
+
+ private final Set<Artifact> cache = new HashSet<Artifact>();
+ private final Map<String, ActionableItemArtifact> guidToActionableItem =
+ new HashMap<String, ActionableItemArtifact>();
+ private final Map<String, TeamDefinitionArtifact> guidToTeamDefinition =
+ new HashMap<String, TeamDefinitionArtifact>();
+ private static final AtsCache instance = new AtsCache();
+ private static List<String> cacheTypes =
+ Arrays.asList(ActionableItemArtifact.ARTIFACT_NAME, TeamDefinitionArtifact.ARTIFACT_NAME,
+ VersionArtifact.ARTIFACT_NAME);
+
+ public AtsCache() {
+ OseeEventManager.addListener(this);
+ }
+
+ public static void cache(Artifact artifact) throws OseeCoreException {
+ if (cacheTypes.contains(artifact.getArtifactTypeName())) {
+ instance.cache.add(artifact);
+ if (artifact instanceof TeamDefinitionArtifact) {
+ instance.guidToTeamDefinition.put(artifact.getGuid(), (TeamDefinitionArtifact) artifact);
+ }
+ if (artifact instanceof ActionableItemArtifact) {
+ instance.guidToActionableItem.put(artifact.getGuid(), (ActionableItemArtifact) artifact);
+ }
+ }
+ }
+
+ public static void deCache(Artifact artifact) {
+ instance.cache.remove(artifact);
+ }
+
+ public static ActionableItemArtifact getActionableItemByGuid(String guid) throws OseeCoreException {
+ AtsBulkLoadCache.run(true);
+ ActionableItemArtifact aia = instance.guidToActionableItem.get(guid);
+ if (aia != null) return aia;
+ Artifact art = ArtifactQuery.getArtifactFromId(guid, AtsPlugin.getAtsBranch(), false);
+ if (art != null) {
+ cache(art);
+ return (ActionableItemArtifact) art;
+ }
+ return null;
+ }
+
+ public static TeamDefinitionArtifact getTeamDefinitionArtifact(String guid) throws OseeCoreException {
+ AtsBulkLoadCache.run(true);
+ TeamDefinitionArtifact teamDef = instance.guidToTeamDefinition.get(guid);
+ if (teamDef != null) return teamDef;
+ Artifact art = ArtifactQuery.getArtifactFromId(guid, AtsPlugin.getAtsBranch(), false);
+ if (art != null) {
+ cache(art);
+ return (TeamDefinitionArtifact) art;
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <A> List<A> getArtifactsByActive(Active active, Class<A> clazz) {
+ AtsBulkLoadCache.run(true);
+ List<A> arts = new ArrayList<A>();
+ for (Artifact art : instance.cache) {
+ try {
+ if (!art.isDeleted() && art.getClass().isAssignableFrom(clazz) && art.isAttributeTypeValid(ATSAttributes.ACTIVE_ATTRIBUTE.getStoreName()) && art.getSoleAttributeValue(
+ ATSAttributes.ACTIVE_ATTRIBUTE.getStoreName(), false)) {
+ arts.add((A) art);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return arts;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <A> List<A> getArtifactsByName(String name, Class<A> clazz) {
+ AtsBulkLoadCache.run(true);
+ List<A> arts = new ArrayList<A>();
+ for (Artifact art : instance.cache) {
+ if (!art.isDeleted() && art.getClass().isAssignableFrom(clazz) && art.getDescriptiveName().equals(name)) {
+ arts.add((A) art);
+ }
+ }
+ return arts;
+ }
+
+ public static <A> A getSoleArtifactByName(String name, Class<A> clazz) throws MultipleArtifactsExist, ArtifactDoesNotExist {
+ AtsBulkLoadCache.run(true);
+ List<A> arts = getArtifactsByName(name, clazz);
+ if (arts.size() == 1) {
+ return arts.iterator().next();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ try {
+ for (Artifact artifact : loadedArtifacts.getLoadedArtifacts()) {
+ deCache(artifact);
+ if (artifact.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME) || artifact.getArtifactTypeName().equals(
+ WorkPageDefinition.ARTIFACT_NAME) || artifact.getArtifactTypeName().equals(
+ WorkFlowDefinition.ARTIFACT_NAME) || artifact.getArtifactTypeName().equals(
+ WorkWidgetDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.deCache(artifact);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ for (Artifact artifact : transData.cacheDeletedArtifacts) {
+ deCache(artifact);
+ if (artifact.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME) || artifact.getArtifactTypeName().equals(
+ WorkPageDefinition.ARTIFACT_NAME) || artifact.getArtifactTypeName().equals(
+ WorkFlowDefinition.ARTIFACT_NAME) || artifact.getArtifactTypeName().equals(
+ WorkWidgetDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.deCache(artifact);
+ }
+ }
+ for (Artifact artifact : transData.cacheAddedArtifacts) {
+ cache(artifact);
+ if (artifact.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update,
+ new WorkRuleDefinition(artifact), artifact);
+ } else if (artifact.getArtifactTypeName().equals(WorkPageDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update,
+ new WorkPageDefinition(artifact), artifact);
+ } else if (artifact.getArtifactTypeName().equals(WorkWidgetDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update, new WorkWidgetDefinition(
+ artifact), artifact);
+ } else if (artifact.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update,
+ new WorkFlowDefinition(artifact), artifact);
+ }
+ }
+ for (Artifact artifact : transData.getArtifactsInRelations(ChangeType.All,
+ AtsRelation.WorkItem__Child.getRelationType())) {
+ if (artifact.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update,
+ new WorkRuleDefinition(artifact), artifact);
+ } else if (artifact.getArtifactTypeName().equals(WorkPageDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update,
+ new WorkPageDefinition(artifact), artifact);
+ } else if (artifact.getArtifactTypeName().equals(WorkWidgetDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update, new WorkWidgetDefinition(
+ artifact), artifact);
+ } else if (artifact.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(WriteType.Update,
+ new WorkFlowDefinition(artifact), artifact);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsConfig.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsConfig.java
new file mode 100644
index 00000000000..b0bfda65804
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsConfig.java
@@ -0,0 +1,258 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.config;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigEditor;
+import org.eclipse.osee.ats.workflow.editor.wizard.AtsWorkflowConfigCreationWizard;
+import org.eclipse.osee.ats.workflow.editor.wizard.AtsWorkflowConfigCreationWizard.WorkflowData;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsConfig {
+
+ private static AtsConfig instance = new AtsConfig();
+ public static String FOLDER_ARTIFACT = "Folder";
+ public static String ATS_HEADING = "Action Tracking System";
+ public static String WORK_FLOWS_FOLDER = "Work Flows";
+ public static String WORK_RULES_FOLDER = "Work Rules";
+ public static String WORK_WIDGETS_FOLDER = "Work Widgets";
+ public static String WORK_PAGES_FOLDER = "Work Pages";
+ public static String TEAMS_HEADING = "Teams";
+ public static String ACTIONABLE_ITEMS_HEADING = "Actionable Items";
+
+ private AtsConfig() {
+ super();
+ }
+
+ public static AtsConfig getInstance() {
+ return instance;
+ }
+
+ public Artifact getOrCreateWorkRulesFolderArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art = Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), FOLDER_ARTIFACT, WORK_RULES_FOLDER);
+ if (!art.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).contains(WORK_RULES_FOLDER)) {
+ StaticIdManager.setSingletonAttributeValue(art, WORK_RULES_FOLDER);
+ }
+ validateATSHeadingParent(art, transaction);
+ return art;
+ }
+
+ public Artifact getOrCreateWorkPagesFolderArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art = Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), FOLDER_ARTIFACT, WORK_PAGES_FOLDER);
+ if (!art.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).contains(WORK_PAGES_FOLDER)) {
+ StaticIdManager.setSingletonAttributeValue(art, WORK_PAGES_FOLDER);
+ }
+ validateATSHeadingParent(art, transaction);
+ return art;
+ }
+
+ public Artifact getOrCreateWorkWidgetsFolderArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art = Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), FOLDER_ARTIFACT, WORK_WIDGETS_FOLDER);
+ if (!art.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).contains(WORK_WIDGETS_FOLDER)) {
+ StaticIdManager.setSingletonAttributeValue(art, WORK_WIDGETS_FOLDER);
+ }
+ validateATSHeadingParent(art, transaction);
+ return art;
+ }
+
+ public Artifact getOrCreateWorkFlowsFolderArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art = Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), FOLDER_ARTIFACT, WORK_FLOWS_FOLDER);
+ if (!art.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).contains(WORK_FLOWS_FOLDER)) {
+ StaticIdManager.setSingletonAttributeValue(art, WORK_FLOWS_FOLDER);
+ }
+ validateATSHeadingParent(art, transaction);
+ return art;
+ }
+
+ public ActionableItemArtifact getOrCreateActionableItemsHeadingArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art =
+ Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), ActionableItemArtifact.ARTIFACT_NAME,
+ ACTIONABLE_ITEMS_HEADING);
+ if (!art.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).contains(
+ ActionableItemArtifact.TOP_AI_STATIC_ID)) {
+ StaticIdManager.setSingletonAttributeValue(art, ActionableItemArtifact.TOP_AI_STATIC_ID);
+ }
+ validateATSHeadingParent(art, transaction);
+ return (ActionableItemArtifact) art;
+ }
+
+ public TeamDefinitionArtifact getOrCreateTeamsDefinitionArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art =
+ Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), TeamDefinitionArtifact.ARTIFACT_NAME, TEAMS_HEADING);
+ if (!art.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).contains(
+ TeamDefinitionArtifact.TOP_TEAM_STATIC_ID)) {
+ StaticIdManager.setSingletonAttributeValue(art, TeamDefinitionArtifact.TOP_TEAM_STATIC_ID);
+ }
+ validateATSHeadingParent(art, transaction);
+ return (TeamDefinitionArtifact) art;
+ }
+
+ private void validateATSHeadingParent(Artifact art, SkynetTransaction transaction) {
+ try {
+ if (!art.hasParent()) {
+ Artifact atsHeadingArtifact = getOrCreateAtsHeadingArtifact(transaction);
+ atsHeadingArtifact.addChild(art);
+ art.persistAttributesAndRelations(transaction);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Artifact getOrCreateAtsHeadingArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art = Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(), FOLDER_ARTIFACT, ATS_HEADING);
+ if (!art.hasParent()) {
+ Artifact rootArt = ArtifactQuery.getDefaultHierarchyRootArtifact(AtsPlugin.getAtsBranch());
+ rootArt.addChild(art);
+ art.persistAttributesAndRelations(transaction);
+ }
+ return art;
+ }
+
+ /**
+ * This method creates a simple configuration of ATS given teamdef name, version names (if desired), actionable items
+ * and workflow id.
+ *
+ * @param namespace
+ * @param teamDefName - name of team definition to use
+ * @param versionNames - list of version names (if team is using versions)
+ * @param actionableItems - list of actionable items
+ * @param workflowId - workflowId to use (if null, workflow will be created)
+ * @return Result of creation
+ * @throws OseeCoreException
+ */
+ public static Result configureAtsForDefaultTeam(String namespace, String teamDefName, Collection<String> versionNames, Collection<String> actionableItems, String workflowId) throws OseeCoreException {
+ try {
+ if (WorkItemDefinitionFactory.getWorkItemDefinition(namespace) != null) {
+ return new Result("Configuration Namespace already used, choose a unique namespace.");
+ }
+ } catch (OseeCoreException ex) {
+ // do nothing
+ }
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+
+ // Create team def
+ TeamDefinitionArtifact teamDef =
+ (TeamDefinitionArtifact) ArtifactTypeManager.addArtifact(TeamDefinitionArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), teamDefName);
+ if (versionNames == null || versionNames.size() > 0) {
+ teamDef.setSoleAttributeValue(ATSAttributes.TEAM_USES_VERSIONS_ATTRIBUTE.getStoreName(), true);
+ }
+ teamDef.addRelation(AtsRelation.TeamLead_Lead, UserManager.getUser());
+ teamDef.addRelation(AtsRelation.TeamMember_Member, UserManager.getUser());
+ AtsConfig.getInstance().getOrCreateTeamsDefinitionArtifact(transaction).addChild(teamDef);
+ teamDef.persistAttributesAndRelations(transaction);
+
+ // Create actionable items
+ List<ActionableItemArtifact> aias = new ArrayList<ActionableItemArtifact>();
+ // Create top actionable item
+ ActionableItemArtifact topAia =
+ (ActionableItemArtifact) ArtifactTypeManager.addArtifact(ActionableItemArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), teamDefName);
+ topAia.setSoleAttributeValue(ATSAttributes.ACTIONABLE_ATTRIBUTE.getStoreName(), false);
+ topAia.persistAttributesAndRelations(transaction);
+
+ AtsConfig.getInstance().getOrCreateActionableItemsHeadingArtifact(transaction).addChild(topAia);
+ teamDef.addRelation(AtsRelation.TeamActionableItem_ActionableItem, topAia);
+ teamDef.persistAttributesAndRelations(transaction);
+
+ aias.add(topAia);
+ // Create childrent actionable item
+ for (String name : actionableItems) {
+ ActionableItemArtifact aia =
+ (ActionableItemArtifact) ArtifactTypeManager.addArtifact(ActionableItemArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), name);
+ aia.setSoleAttributeValue(ATSAttributes.ACTIONABLE_ATTRIBUTE.getStoreName(), true);
+ topAia.addChild(aia);
+ aia.persistAttributesAndRelations(transaction);
+ aias.add(aia);
+ }
+
+ // Create versions
+ List<VersionArtifact> versions = new ArrayList<VersionArtifact>();
+ if (versionNames != null) {
+ for (String name : versionNames) {
+ VersionArtifact version =
+ (VersionArtifact) ArtifactTypeManager.addArtifact(VersionArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), name);
+ teamDef.addRelation(AtsRelation.TeamDefinitionToVersion_Version, version);
+ versions.add(version);
+ version.persistAttributesAndRelations(transaction);
+ }
+ }
+
+ // create workflow
+ Artifact workflowArt = null;
+ try {
+ workflowArt =
+ ArtifactQuery.getArtifactFromTypeAndName(WorkFlowDefinition.ARTIFACT_NAME, workflowId,
+ AtsPlugin.getAtsBranch());
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing
+ }
+ WorkFlowDefinition workFlowDefinition;
+ // If can't be found, create a new one
+ if (workflowArt == null) {
+ WorkflowData workflowData =
+ AtsWorkflowConfigCreationWizard.generateDefaultWorkflow(namespace, transaction, teamDef);
+ workFlowDefinition = workflowData.getWorkDefinition();
+ workflowArt = workflowData.getWorkFlowArtifact();
+ workflowArt.persistAttributesAndRelations(transaction);
+ }
+ // Else, use existing one
+ else {
+ workFlowDefinition = (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(workflowId);
+ }
+ // Relate new team def to workflow artifact
+ teamDef.addRelation(AtsRelation.WorkItem__Child, workflowArt);
+ teamDef.persistAttributesAndRelations(transaction);
+
+ transaction.execute();
+
+ // open everything in editors
+ AtsLib.openAtsAction(teamDef, AtsOpenOption.OpenAll);
+ for (ActionableItemArtifact aia : aias) {
+ AtsLib.openAtsAction(aia, AtsOpenOption.OpenAll);
+ }
+ AtsWorkflowConfigEditor.editWorkflow(workFlowDefinition);
+
+ return Result.TrueResult;
+
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsDatabaseConfig.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsDatabaseConfig.java
new file mode 100644
index 00000000000..f3c1f57cb02
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/AtsDatabaseConfig.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.ats.config;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.flow.DecisionWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.PeerToPeerWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.SimpleWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.TaskWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+
+public class AtsDatabaseConfig implements IDbInitializationTask {
+
+ public void run() throws OseeCoreException {
+ createAtsTopLevelConfigObjects();
+
+ // Configure WorkItemDefinitions
+ configWorkItemDefinitions(WriteType.New, null);
+
+ }
+
+ public static void configWorkItemDefinitions(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+
+ // Import Work Item Definitions
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData,
+ AtsWorkDefinitions.getAtsWorkDefinitions());
+
+ new TeamWorkflowDefinition().config(writeType, xResultData);
+ new TaskWorkflowDefinition().config(writeType, xResultData);
+ new SimpleWorkflowDefinition().config(writeType, xResultData);
+ new DecisionWorkflowDefinition().config(writeType, xResultData);
+ new PeerToPeerWorkflowDefinition().config(writeType, xResultData);
+
+ }
+
+ private void createAtsTopLevelConfigObjects() throws OseeCoreException {
+ SkynetTransaction transaction1 = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ AtsConfig.getInstance().getOrCreateAtsHeadingArtifact(transaction1);
+ transaction1.execute();
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ AtsConfig.getInstance().getOrCreateAtsHeadingArtifact(transaction);
+ AtsConfig.getInstance().getOrCreateTeamsDefinitionArtifact(transaction);
+ AtsConfig.getInstance().getOrCreateActionableItemsHeadingArtifact(transaction);
+ AtsConfig.getInstance().getOrCreateWorkFlowsFolderArtifact(transaction);
+ AtsConfig.getInstance().getOrCreateWorkRulesFolderArtifact(transaction);
+ AtsConfig.getInstance().getOrCreateWorkWidgetsFolderArtifact(transaction);
+ AtsConfig.getInstance().getOrCreateWorkPagesFolderArtifact(transaction);
+ transaction.execute();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizard.java
new file mode 100644
index 00000000000..6f66cb2ccdf
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizard.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.config.wizard;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.config.AtsConfig;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Create new new .shape-file. Those files can be used with the ShapesEditor (see plugin.xml).
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsConfigWizard extends Wizard implements INewWizard {
+
+ private AtsConfigWizardPage1 page1;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizard#addPages()
+ */
+ @Override
+ public void addPages() {
+ // add pages to this wizard
+ addPage(page1);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // create pages for this wizard
+ page1 = new AtsConfigWizardPage1(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ String namespace = page1.getNamespace();
+ String teamDefName = page1.getTeamDefName();
+ Collection<String> aias = page1.getActionableItems();
+ Collection<String> versionNames = page1.getVersions();
+ String workflowId = page1.getWorkflowId();
+ AtsConfig.configureAtsForDefaultTeam(namespace, teamDefName, versionNames, aias, workflowId);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizardPage1.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizardPage1.java
new file mode 100644
index 00000000000..472d1e459a5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/config/wizard/AtsConfigWizardPage1.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.ats.config.wizard;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+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 Donald G. Dunne
+ */
+public class AtsConfigWizardPage1 extends WizardPage {
+ private final AtsConfigWizard wizard;
+ private WorkPage page;
+
+ /**
+ * @param actionWizard
+ */
+ public AtsConfigWizardPage1(AtsConfigWizard actionWizard) {
+ super("Create New ATS Configuration", "Create ATS Configuration", null);
+ setMessage("Enter configuration information.");
+ this.wizard = actionWizard;
+ }
+
+ private final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ getContainer().updateButtons();
+ }
+ };
+
+ public String getNamespace() {
+ return (String) getXWidget(CONFIG_NAMESPACE).getData();
+ }
+
+ public String getTeamDefName() {
+ return (String) getXWidget(TEAMDEF_NAME).getData();
+ }
+
+ public List<String> getActionableItems() {
+ List<String> aias = new ArrayList<String>();
+ for (String aia : ((String) getXWidget(ACTIONABLE_ITEMS).getData()).split(",")) {
+ aia = aia.replaceAll("^ *", "");
+ aia = aia.replaceAll(" *$", "");
+ if (!aia.equals("")) {
+ aias.add(aia);
+ }
+ }
+ return aias;
+ }
+
+ public List<String> getVersions() {
+ List<String> versions = new ArrayList<String>();
+ for (String version : ((String) getXWidget(VERSIONS).getData()).split(",")) {
+ version = version.replaceAll("^ *", "");
+ version = version.replaceAll(" *$", "");
+ if (!version.equals("")) {
+ versions.add(version);
+ }
+ }
+ return versions;
+ }
+
+ public String getWorkflowId() {
+ return (String) getXWidget(WORKFLOW_ID).getData();
+ }
+
+ private static String CONFIG_NAMESPACE = "Configuration Namespace";
+ private static String TEAMDEF_NAME = "Team Definition Name";
+ private static String ACTIONABLE_ITEMS = "Actionable Item(s) (comma delim)";
+ private static String VERSIONS = "Versions (comma delim)";
+ private static String WORKFLOW_ID = "Workflow Id (blank to create default)";
+
+ public void createControl(Composite parent) {
+
+ try {
+ String xWidgetXml = "<WorkPage>" +
+ //
+ "<XWidget displayName=\"" + CONFIG_NAMESPACE + "\" required=\"true\" xwidgetType=\"XText\"/>" +
+ //
+ "<XWidget displayName=\"" + TEAMDEF_NAME + "\" required=\"true\" xwidgetType=\"XText\"/>" +
+ //
+ "<XWidget displayName=\"" + ACTIONABLE_ITEMS + "\" required=\"true\" xwidgetType=\"XText\"/>" +
+ //
+ "<XWidget displayName=\"" + VERSIONS + "\" required=\"false\" xwidgetType=\"XText\"/>" +
+ //
+ "<XWidget displayName=\"" + WORKFLOW_ID + "\" required=\"false\" xwidgetType=\"XText\"/>" +
+ //
+ "</WorkPage>";
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(1, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ page = new WorkPage(xWidgetXml, ATSXWidgetOptionResolver.getInstance());
+ page.createBody(null, comp, null, xModListener, true);
+
+ Button populateExampleButton = new Button(comp, SWT.PUSH);
+ populateExampleButton.setText("Populate with example entries");
+ populateExampleButton.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ String namespace = "org.trex.saw.labs" + AtsLib.getAtsDeveloperIncrementingNum();
+ ((XText) getXWidget(CONFIG_NAMESPACE)).set(namespace);
+ ((XText) getXWidget(TEAMDEF_NAME)).set("SAW Labs");
+ ((XText) getXWidget(ACTIONABLE_ITEMS)).set("Lab Station, Lab Computer, Lab Fire System");
+ ((XText) getXWidget(VERSIONS)).set("SAW 1.0, SAW 2.0, SAW 3.0");
+ ((XText) getXWidget(WORKFLOW_ID)).setText("osee.ats.teamWorkflow");
+ }
+ });
+ setControl(comp);
+ ((XText) getXWidget(CONFIG_NAMESPACE)).setFocus();
+ ((XText) getXWidget(WORKFLOW_ID)).setText("osee.ats.teamWorkflow");
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public XWidget getXWidget(String attrName) {
+ if (page == null) throw new IllegalArgumentException("WorkPage == null");
+ return page.getLayoutData(attrName).getXWidget();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (!page.isPageComplete().isTrue()) return false;
+
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItem.java
new file mode 100644
index 00000000000..e153577b720
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItem.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.ats.editor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.editor.service.WorkPageService;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class AtsStateItem implements IAtsStateItem {
+
+ public static String ALL_STATE_IDS = "ALL";
+ private static final ArrayList<WorkPageService> EMPTY_SERVICES = new ArrayList<WorkPageService>();
+ private static final Collection<String> EMPTY_STRING = new ArrayList<String>();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#committing(org.eclipse.osee.ats.editor.SMAManager)
+ */
+ public Result committing(SMAManager smaMgr) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getBranchShortName(org.eclipse.osee.ats.editor.SMAManager)
+ */
+ public String getBranchShortName(SMAManager smaMgr) throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ protected String getId() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getIds()
+ */
+ public Collection<String> getIds() throws OseeCoreException {
+ if (getId() == null) return EMPTY_STRING;
+ return Arrays.asList(getId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getOverrideTransitionToAssignees(org.eclipse.osee.ats.editor.SMAWorkFlowSection)
+ */
+ public Collection<User> getOverrideTransitionToAssignees(SMAWorkFlowSection section) throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getOverrideTransitionToStateName(org.eclipse.osee.ats.editor.SMAWorkFlowSection)
+ */
+ public String getOverrideTransitionToStateName(SMAWorkFlowSection section) throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getSidebarServices(org.eclipse.osee.ats.editor.SMAManager, org.eclipse.osee.ats.workflow.AtsWorkPage, org.eclipse.osee.framework.ui.skynet.XFormToolkit, org.eclipse.osee.ats.editor.SMAWorkFlowSection)
+ */
+ public List<WorkPageService> getSidebarServices(SMAManager smaMgr) throws OseeCoreException {
+ return EMPTY_SERVICES;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getToolbarServices(org.eclipse.osee.ats.editor.SMAManager, org.eclipse.osee.ats.workflow.AtsWorkPage, org.eclipse.osee.framework.ui.skynet.XFormToolkit, org.eclipse.osee.ats.editor.SMAWorkFlowSection)
+ */
+ public List<WorkPageService> getToolbarServices(SMAManager smaMgr) throws OseeCoreException {
+ return EMPTY_SERVICES;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#pageCreated(org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.ats.workflow.AtsWorkPage, org.eclipse.osee.ats.editor.SMAManager, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ public Result pageCreated(FormToolkit toolkit, AtsWorkPage page, SMAManager smaMgr, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#transitioned(org.eclipse.osee.ats.editor.SMAManager, java.lang.String, java.lang.String, java.util.Collection)
+ */
+ public void transitioned(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees, SkynetTransaction transaction) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#transitioning(org.eclipse.osee.ats.editor.SMAManager, java.lang.String, java.lang.String, java.util.Collection)
+ */
+ public Result transitioning(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#widgetModified(org.eclipse.osee.ats.editor.SMAWorkFlowSection, org.eclipse.osee.framework.ui.skynet.widgets.XWidget)
+ */
+ public void widgetModified(SMAWorkFlowSection section, XWidget xWidget) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#xWidgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.ats.workflow.AtsWorkPage, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ public void xWidgetCreated(XWidget xWidget, FormToolkit toolkit, AtsWorkPage page, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#xWidgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.ats.workflow.AtsWorkPage, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ public Result xWidgetCreating(XWidget xWidget, FormToolkit toolkit, AtsWorkPage page, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#isAccessControlViaAssigneesEnabledForBranching()
+ */
+ public boolean isAccessControlViaAssigneesEnabledForBranching() throws OseeCoreException {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItems.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItems.java
new file mode 100644
index 00000000000..61e1b86db5f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsStateItems.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.ats.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+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.Platform;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsStateItems {
+
+ private static List<IAtsStateItem> stateItems = new ArrayList<IAtsStateItem>();
+
+ public List<IAtsStateItem> getStateItems(String stateId) throws OseeCoreException {
+ loadAllStateItems();
+ List<IAtsStateItem> items = new ArrayList<IAtsStateItem>();
+ for (IAtsStateItem item : stateItems)
+ if (item.getIds().contains(AtsStateItem.ALL_STATE_IDS) || item.getIds().contains(stateId)) items.add(item);
+ return items;
+ }
+
+ public List<IAtsStateItem> getCurrentPageStateItems(SMAManager smaMgr) throws OseeCoreException {
+ return getStateItems(smaMgr.getWorkPageDefinition().getId());
+ }
+
+ @SuppressWarnings( {"unchecked"})
+ private void loadAllStateItems() {
+ if (stateItems.size() > 0) return;
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsStateItem");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsStateItem extension point");
+ return;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsStateItem")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ if (obj == null) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE,
+ "Error Instantiating AtsStateItem extension \"" + classname + "\"", null);
+ } else {
+ stateItems.add((IAtsStateItem) obj);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error loading AtsStateItem extension", ex);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return the stateItems
+ */
+ public static List<IAtsStateItem> getAllStateItems() {
+ return stateItems;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsTaskEditorRenderer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsTaskEditorRenderer.java
new file mode 100644
index 00000000000..00188074efb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsTaskEditorRenderer.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.ats.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AtsTaskEditorRenderer extends DefaultArtifactRenderer {
+ private static final String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.atstaskeditor.command";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#open(java.util.List)
+ */
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ if (OseeAts.getAtsLib() != null) {
+ OseeAts.getAtsLib().openInAtsTaskEditor("Tasks", artifacts);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#preview(java.util.List)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ open(artifacts);
+ }
+
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getImage(AtsImage.TASK);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "ATS Task Editor";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getApplicabilityRating(org.eclipse.osee.framework.ui.skynet.render.PresentationType, org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) throws OseeCoreException {
+ if (artifact instanceof TaskArtifact && (!artifact.isHistorical())) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add(COMMAND_ID);
+ }
+
+ return commandIds;
+ }
+
+ @Override
+ public AtsTaskEditorRenderer newInstance() throws OseeCoreException {
+ return new AtsTaskEditorRenderer();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorkflowRenderer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorkflowRenderer.java
new file mode 100644
index 00000000000..dc226586c75
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorkflowRenderer.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.ats.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AtsWorkflowRenderer extends DefaultArtifactRenderer {
+ private static final String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.atseditor.command";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getCommandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add(COMMAND_ID);
+ }
+
+ return commandIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getImage()
+ */
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getImage(AtsImage.ACTION);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "ATS Workflow Editor";
+ }
+
+ /**
+ * @param rendererId
+ */
+ public AtsWorkflowRenderer() {
+ super();
+ }
+
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ for (Artifact artifact : artifacts) {
+ OseeAts.getAtsLib().openATSAction(artifact, AtsOpenOption.OpenOneOrPopupSelect);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public AtsWorkflowRenderer newInstance() throws OseeCoreException {
+ return new AtsWorkflowRenderer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#isValidFor(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if (artifact instanceof IATSArtifact && (!artifact.isHistorical())) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#preview(java.util.List)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ open(artifacts);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ if (AccessControlManager.isOseeAdmin()) {
+ return NO_MATCH;
+ } else {
+ return PRESENTATION_TYPE;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorldEditorRenderer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorldEditorRenderer.java
new file mode 100644
index 00000000000..cf5c5c6f7ff
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/AtsWorldEditorRenderer.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.ats.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AtsWorldEditorRenderer extends DefaultArtifactRenderer {
+ private static final String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.atsworldeditor.command";
+
+ /**
+ * @param rendererId
+ */
+ public AtsWorldEditorRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getApplicabilityRating(org.eclipse.osee.framework.ui.skynet.render.PresentationType, org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) throws OseeCoreException {
+ if ((artifact instanceof IATSArtifact || artifact.getArtifactTypeName().equals("Universal Group")) && (!artifact.isHistorical())) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getCommandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add(COMMAND_ID);
+ }
+
+ return commandIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "ATS World Editor";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#newInstance()
+ */
+ @Override
+ public AtsWorldEditorRenderer newInstance() throws OseeCoreException {
+ return new AtsWorldEditorRenderer();
+ }
+
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getImage(AtsImage.GLOBE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#open(java.util.List)
+ */
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ if (OseeAts.getAtsLib() != null) {
+ OseeAts.getAtsLib().openInAtsWorldEditor("ATS", artifacts);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#preview(java.util.List)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ open(artifacts);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IAtsStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IAtsStateItem.java
new file mode 100644
index 00000000000..5ac05731430
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IAtsStateItem.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.ats.editor;
+
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.editor.service.WorkPageService;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsStateItem {
+
+ public Result pageCreated(FormToolkit toolkit, AtsWorkPage page, SMAManager smaMgr, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException;
+
+ public Result xWidgetCreating(XWidget xWidget, FormToolkit toolkit, AtsWorkPage page, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException;
+
+ public void xWidgetCreated(XWidget xWidget, FormToolkit toolkit, AtsWorkPage page, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException;
+
+ public void widgetModified(SMAWorkFlowSection section, XWidget xWidget) throws OseeCoreException;
+
+ public String getOverrideTransitionToStateName(SMAWorkFlowSection section) throws OseeCoreException;
+
+ public Collection<User> getOverrideTransitionToAssignees(SMAWorkFlowSection section) throws OseeCoreException;
+
+ public String getDescription() throws OseeCoreException;
+
+ public String getBranchShortName(SMAManager smaMgr) throws OseeCoreException;
+
+ public boolean isAccessControlViaAssigneesEnabledForBranching() throws OseeCoreException;
+
+ public Collection<String> getIds() throws OseeCoreException;
+
+ public List<WorkPageService> getSidebarServices(SMAManager smaMgr) throws OseeCoreException;
+
+ public List<WorkPageService> getToolbarServices(SMAManager smaMgr) throws OseeCoreException;
+
+ /**
+ * @param smaMgr
+ * @param fromState
+ * @param toState
+ * @param toAssignees
+ * @return Result of operation. If Result.isFalse(), transition will not continue and Result.popup will occur.
+ * @throws Exception TODO
+ */
+ public Result transitioning(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees) throws OseeCoreException;
+
+ public void transitioned(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees, SkynetTransaction transaction) throws OseeCoreException;
+
+ /**
+ * @param smaMgr TODO
+ * @return Result of operation. If Result.isFalse(), commit will not continue and Result.popup will occur.
+ * @throws Exception TODO
+ */
+ public Result committing(SMAManager smaMgr) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAActionableItemHeader.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAActionableItemHeader.java
new file mode 100644
index 00000000000..3804efbaa56
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAActionableItemHeader.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.editor;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAActionableItemHeader extends Composite implements IFrameworkTransactionEventListener {
+
+ private static String ACTION_ACTIONABLE_ITEMS = "Actionable Items: ";
+ private Hyperlink link;
+ private Label label;
+ private final SMAManager smaMgr;
+
+ public SMAActionableItemHeader(Composite parent, XFormToolkit toolkit, SMAManager smaMgr) throws OseeCoreException {
+ super(parent, SWT.NONE);
+ this.smaMgr = smaMgr;
+ try {
+ final TeamWorkFlowArtifact teamWf = (TeamWorkFlowArtifact) smaMgr.getSma();
+
+ toolkit.adapt(this);
+ setLayout(ALayout.getZeroMarginLayout(2, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 4;
+ setLayoutData(gd);
+
+ link = toolkit.createHyperlink(this, ACTION_ACTIONABLE_ITEMS, SWT.NONE);
+ link.setToolTipText("Edit Actionable Items for the parent Action (this may add Team Workflows)");
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ AtsLib.editActionableItems(teamWf.getParentActionArtifact());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ label = toolkit.createLabel(this, " ");
+ refresh();
+
+ OseeEventManager.addListener(this);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void refresh() throws OseeCoreException {
+ if (label.isDisposed()) {
+ OseeEventManager.removeListener(this);
+ return;
+ }
+ final TeamWorkFlowArtifact teamWf = (TeamWorkFlowArtifact) smaMgr.getSma();
+ if (!smaMgr.isCancelled() && !smaMgr.isCompleted()) {
+ if (teamWf.getParentActionArtifact().getActionableItems().size() == 0) {
+ label.setText(" " + ACTION_ACTIONABLE_ITEMS + "Error: No Actionable Items identified.");
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ StringBuffer sb = new StringBuffer(teamWf.getActionableItemsDam().getActionableItemsStr());
+ if (teamWf.getParentActionArtifact().getTeamWorkFlowArtifacts().size() > 1) {
+ sb.append(" Other: ");
+ for (TeamWorkFlowArtifact workflow : teamWf.getParentActionArtifact().getTeamWorkFlowArtifacts()) {
+ if (!workflow.equals(teamWf)) {
+ sb.append(workflow.getActionableItemsDam().getActionableItemsStr() + ", ");
+ }
+ }
+ }
+ label.setText(sb.toString().replaceFirst(", $", ""));
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ }
+ label.update();
+ layout();
+ } else {
+ if (teamWf.getParentActionArtifact().getActionableItems().size() == 0) {
+ label.setText(" " + ACTION_ACTIONABLE_ITEMS + "Error: No Actionable Items identified.");
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ label.setText(" " + ACTION_ACTIONABLE_ITEMS + teamWf.getParentActionArtifact().getWorldViewActionableItems());
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ }
+ label.update();
+ layout();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (smaMgr.isInTransition()) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ // Since SMAEditor is refreshed when a sibling workflow is changed, need to refresh this
+ // list of actionable items when a sibling changes
+ for (TeamWorkFlowArtifact teamWf : smaMgr.getSma().getParentActionArtifact().getTeamWorkFlowArtifacts()) {
+ if (!smaMgr.getSma().equals(teamWf) && (transData.isChanged(teamWf) || transData.isRelAdded(teamWf.getParentActionArtifact()) || transData.isRelDeleted(teamWf.getParentActionArtifact()))) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ refresh();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ // Only need to refresh once
+ return;
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Widget#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ OseeEventManager.removeListener(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java
new file mode 100644
index 00000000000..6ba7865fb5f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java
@@ -0,0 +1,918 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.editor;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.navigate.VisitedItems;
+import org.eclipse.osee.ats.task.IXTaskViewer;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.world.AtsMetricsComposite;
+import org.eclipse.osee.ats.world.IAtsMetricsProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.AttributesComposite;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.RelationsComposite;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.access.PolicyDialog;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.panels.DetailsBrowserComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAEditor extends AbstractArtifactEditor implements IDirtiableEditor, IActionable, IAtsMetricsProvider, IArtifactsPurgedEventListener, IRelationModifiedEventListener, IFrameworkTransactionEventListener, IBranchEventListener, IXTaskViewer {
+ public static final String EDITOR_ID = "org.eclipse.osee.ats.editor.SMAEditor";
+ private SMAManager smaMgr;
+ private int workFlowPageIndex, taskPageIndex, metricsPageIndex, historyPageIndex, relationPageIndex,
+ attributesPageIndex, detailsPageIndex;
+ private SMAWorkFlowTab workFlowTab;
+ private SMATaskComposite taskComposite;
+ private SMAHistoryComposite historyComposite;
+ private RelationsComposite relationsComposite;
+ private AttributesComposite attributesComposite;
+ private AtsMetricsComposite metricsComposite;
+ private static Font defaultLabelFont;
+ private boolean priviledgedEditModeEnabled = false;
+ private Action printAction;
+
+ public SMAEditor() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+
+ IEditorInput editorInput = getEditorInput();
+ StateMachineArtifact sma = null;
+ if (editorInput instanceof SMAEditorInput) {
+ SMAEditorInput aei = (SMAEditorInput) editorInput;
+ if (aei.getArtifact() != null) {
+ if (aei.getArtifact() instanceof StateMachineArtifact)
+ sma = (StateMachineArtifact) aei.getArtifact();
+ else
+ throw new IllegalArgumentException("SMAEditorInput artifact must be StateMachineArtifact");
+ }
+ } else
+ throw new IllegalArgumentException("Editor Input not SMAEditorInput");
+
+ if (sma == null) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Open Error",
+ "Can't Find Action in DB");
+ return;
+ }
+ try {
+ smaMgr = new SMAManager(sma, this);
+ smaMgr.setEditor(this);
+
+ OseeEventManager.addListener(this);
+
+ setPartName(smaMgr.getSma().getEditorTitle());
+ setContentDescription(priviledgedEditModeEnabled ? " PRIVILEGED EDIT MODE ENABLED" : "");
+ setTitleImage(ImageManager.getImage(smaMgr.getSma()));
+
+ // Create WorkFlow tab
+ try {
+ workFlowTab = new SMAWorkFlowTab(smaMgr);
+ workFlowPageIndex = addPage(workFlowTab);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ // Create Tasks tab
+ if (smaMgr.showTaskTab()) {
+ createTaskTab();
+ }
+
+ createHistoryTab();
+ createRelationsTab();
+ createAttributesTab();
+ createDetailsTab();
+ createMetricsTab();
+
+ setActivePage(workFlowPageIndex);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ enableGlobalPrint();
+ }
+
+ public static void createLabelValue(XFormToolkit toolkit, Composite comp, String labelStr, String valueStr) throws OseeCoreException {
+ createLabelValue(toolkit, comp, labelStr, valueStr, null);
+ }
+
+ public static void createLabelValue(XFormToolkit toolkit, Composite comp, String labelStr, String valueStr, String tooltip) throws OseeCoreException {
+ Label label = toolkit.createLabel(comp, labelStr + ": ");
+ if (tooltip != null && !tooltip.equals("")) label.setToolTipText(tooltip);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ Text text = new Text(comp, SWT.WRAP | SWT.NO_TRIM);
+ toolkit.adapt(text, true, true);
+ text.setText(valueStr);
+ if (tooltip != null && !tooltip.equals("")) text.setToolTipText(tooltip);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ try {
+ if (smaMgr.isHistoricalVersion()) {
+ AWorkbench.popup(
+ "Historical Error",
+ "You can not change a historical version of " + smaMgr.getSma().getArtifactTypeName() + ":\n\n" + smaMgr.getSma());
+ } else if (!smaMgr.isAccessControlWrite()) {
+ AWorkbench.popup(
+ "Authentication Error",
+ "You do not have permissions to save " + smaMgr.getSma().getArtifactTypeName() + ":" + smaMgr.getSma());
+ } else {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ if (getActivePage() == attributesPageIndex) {
+ smaMgr.getSma().persistAttributes(transaction);
+ }
+ // Save widget data to artifact
+ workFlowTab.saveXWidgetToArtifact();
+ smaMgr.getSma().saveSMA(transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ onDirtied();
+ }
+
+ OseeNotificationManager.sendNotifications();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static void setLabelFonts(Control parent, Font font) {
+ if (parent instanceof Label) {
+ Label label = ((Label) parent);
+ label.setFont(font);
+ }
+ if (parent instanceof Composite) {
+ Composite container = (Composite) parent;
+ for (Control child : container.getChildren()) {
+ setLabelFonts(child, font);
+ }
+ container.layout();
+ }
+ }
+
+ public static Font getBoldLabelFont() {
+ if (defaultLabelFont == null) {
+ Font baseFont = JFaceResources.getDefaultFont();
+ FontData[] fontDatas = baseFont.getFontData();
+ FontData fontData = fontDatas.length > 0 ? fontDatas[0] : new FontData("arial", 12, SWT.BOLD);
+ defaultLabelFont = new Font(baseFont.getDevice(), fontData.getName(), fontData.getHeight(), SWT.BOLD);
+ }
+ return defaultLabelFont;
+ }
+
+ void enableGlobalPrint() {
+ printAction = new SMAPrint(smaMgr, workFlowTab, taskComposite);
+ getEditorSite().getActionBars().setGlobalActionHandler(ActionFactory.PRINT.getId(), printAction);
+ }
+
+ @Override
+ public boolean isSaveOnCloseNeeded() {
+ return isDirty();
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ if (smaMgr != null && !smaMgr.getSma().isDeleted() && smaMgr.getSma().isSMAEditorDirty().isTrue()) {
+ smaMgr.getSma().revertSMA();
+ }
+ workFlowTab.dispose();
+ if (taskComposite != null) {
+ taskComposite.disposeTaskComposite();
+ }
+ if (relationsComposite != null) {
+ relationsComposite.dispose();
+ }
+ if (metricsComposite != null) metricsComposite.disposeComposite();
+
+ super.dispose();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ return isDirtyResult().isTrue();
+ }
+
+ public Result isDirtyResult() {
+ if (smaMgr.getSma().isDeleted()) return Result.FalseResult;
+ try {
+ Result result = workFlowTab.isXWidgetDirty();
+ if (result.isTrue()) return result;
+ result = ((StateMachineArtifact) ((SMAEditorInput) getEditorInput()).getArtifact()).isSMAEditorDirty();
+ if (result.isTrue()) return result;
+ String rString = smaMgr.getSma().reportIsDirty(true);
+ return new Result((rString != null), rString);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return new Result(true, ex.getLocalizedMessage());
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "SMAEditor - " + smaMgr.getSma().getHumanReadableId() + " - " + smaMgr.getSma().getArtifactTypeName() + " named \"" + smaMgr.getSma().getDescriptiveName() + "\"";
+ }
+
+ @Override
+ protected void createPages() {
+ super.createPages();
+ OseeContributionItem.addTo(this, true);
+ }
+
+ private void createHistoryTab() {
+ try {
+ Composite composite = AtsLib.createCommonPageComposite(getContainer());
+ createToolBar(composite);
+ historyComposite = new SMAHistoryComposite(smaMgr, composite, SWT.NONE);
+ historyPageIndex = addPage(composite);
+ setPageText(historyPageIndex, "History");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void createTaskTab() {
+ try {
+ Composite composite = AtsLib.createCommonPageComposite(getContainer());
+ ToolBar toolBar = createToolBar(composite);
+ taskComposite = new SMATaskComposite(this, composite, SWT.NONE, toolBar);
+ taskPageIndex = addPage(composite);
+ setPageText(taskPageIndex, "Tasks");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void createDetailsTab() {
+ try {
+ Composite composite = AtsLib.createCommonPageComposite(getContainer());
+ createToolBar(composite);
+ new DetailsBrowserComposite(smaMgr.getSma(), composite, SWT.NONE, null);
+ detailsPageIndex = addPage(composite);
+ setPageText(detailsPageIndex, "Details");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void createMetricsTab() {
+ try {
+ Composite composite = AtsLib.createCommonPageComposite(getContainer());
+ createToolBar(composite);
+ metricsComposite = new AtsMetricsComposite(this, composite, SWT.NONE);
+ metricsPageIndex = addPage(composite);
+ setPageText(metricsPageIndex, "Metrics");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ }
+
+ private void createAttributesTab() {
+ try {
+ if (!AtsPlugin.isAtsAdmin()) return;
+
+ // Create Attributes tab
+ Composite composite = AtsLib.createCommonPageComposite(getContainer());
+ ToolBar toolBar = createToolBar(composite);
+
+ ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.SAVED));
+ item.setToolTipText("Save attributes changes only");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ smaMgr.getSma().persistAttributes();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setText(" NOTE: Changes made on this page MUST be saved through save icon on this page");
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+ attributesComposite = new AttributesComposite(this, composite, SWT.NONE, smaMgr.getSma());
+ attributesPageIndex = addPage(composite);
+ setPageText(attributesPageIndex, "Attributes");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void createRelationsTab() {
+ try {
+ // Create Relations tab
+ Composite composite = AtsLib.createCommonPageComposite(getContainer());
+ ToolBar toolBar = createToolBar(composite);
+
+ if (AtsPlugin.isAtsAdmin()) {
+ final ToolItem showAllRelationsItem = new ToolItem(toolBar, SWT.CHECK);
+
+ showAllRelationsItem.setImage(ImageManager.getImage(FrameworkImage.RELATION));
+ showAllRelationsItem.setToolTipText("Shows all relations - AtsAdmin only");
+ showAllRelationsItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (showAllRelationsItem.getSelection()) {
+ relationsComposite.getTreeViewer().removeFilter(userRelationsFilter);
+ relationsComposite.refreshArtifact(smaMgr.getSma());
+ } else {
+ relationsComposite.getTreeViewer().addFilter(userRelationsFilter);
+ }
+ relationsComposite.refresh();
+ }
+ });
+ }
+
+ ToolItem item = new ToolItem(toolBar, SWT.CHECK);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ relationsComposite.refreshArtifact(smaMgr.getSma());
+ }
+ });
+
+ relationsComposite = new RelationsComposite(this, composite, SWT.NONE, smaMgr.getSma());
+ relationPageIndex = addPage(composite);
+ setPageText(relationPageIndex, "Relations");
+ // Don't allow users to see all relations
+ relationsComposite.getTreeViewer().addFilter(userRelationsFilter);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ }
+
+ private static List<String> filteredRelationTypeNames =
+ Arrays.asList(AtsRelation.ActionToWorkflow_Action.getTypeName(), AtsRelation.SmaToTask_Sma.getTypeName(),
+ AtsRelation.TeamActionableItem_ActionableItem.getTypeName(),
+ AtsRelation.TeamWorkflowTargetedForVersion_Version.getTypeName(),
+ AtsRelation.TeamLead_Lead.getTypeName(), AtsRelation.TeamMember_Member.getTypeName(),
+ AtsRelation.TeamWorkflowToReview_Review.getTypeName(), AtsRelation.WorkItem__Child.getTypeName(),
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD.getTypeName(),
+ CoreRelationEnumeration.Users_Artifact.getTypeName());
+
+ private static ViewerFilter userRelationsFilter = new ViewerFilter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (element instanceof RelationType) {
+ return !filteredRelationTypeNames.contains(((RelationType) element).getTypeName());
+ }
+ return true;
+ }
+ };
+
+ private ToolBar createToolBar(Composite parent) {
+ ToolBar toolBar = AtsLib.createCommonToolBar(parent);
+ ToolItem item;
+
+ OseeAts.addButtonToEditorToolBar(this, SkynetGuiPlugin.getInstance(), toolBar, EDITOR_ID, "ATS Editor");
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.EDIT_BLUE));
+ item.setToolTipText("Show this artifact in the Resource History");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ HistoryView.open(smaMgr.getSma());
+ } catch (OseeArgumentException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.AUTHENTICATED));
+ item.setToolTipText("Access Control");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PolicyDialog pd = new PolicyDialog(Display.getCurrent().getActiveShell(), smaMgr.getSma());
+ pd.open();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.DIRTY));
+ item.setToolTipText("Show what attribute or relation making editor dirty.");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ Result result = smaMgr.getEditor().isDirtyResult();
+ AWorkbench.popup("Dirty Report", result.isFalse() ? "Not Dirty" : "Dirty -> " + result.getText());
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+
+ Text artifactInfoLabel = new Text(toolBar.getParent(), SWT.END);
+ artifactInfoLabel.setEditable(false);
+ artifactInfoLabel.setText("Type: \"" + smaMgr.getSma().getArtifactTypeName() + "\" HRID: " + smaMgr.getSma().getHumanReadableId());
+ artifactInfoLabel.setToolTipText("The human readable id and database id for this artifact");
+
+ return toolBar;
+ }
+
+ public void refreshPages() throws OseeCoreException {
+ if (getContainer() == null || getContainer().isDisposed()) return;
+ if (workFlowTab != null) workFlowTab.refresh();
+ if (historyComposite != null) historyComposite.refresh();
+ if (relationsComposite != null) relationsComposite.refreshArtifact(smaMgr.getSma());
+ if (attributesComposite != null) attributesComposite.refreshArtifact(smaMgr.getSma());
+ smaMgr.getEditor().onDirtied();
+ setPartName(smaMgr.getSma().getEditorTitle());
+ setTitleImage(ImageManager.getImage(smaMgr.getSma()));
+ }
+
+ public static void editArtifact(Artifact artifact) {
+ if (artifact.isDeleted()) {
+ AWorkbench.popup("ERROR", "Artifact has been deleted");
+ return;
+ }
+ if (artifact instanceof StateMachineArtifact)
+ editArtifact((StateMachineArtifact) artifact);
+ else
+ ArtifactEditor.editArtifact(artifact);
+ }
+
+ public static void editArtifact(final StateMachineArtifact sma) {
+ editArtifact(sma, false);
+ }
+
+ public static void editArtifact(final StateMachineArtifact sma, boolean pend) {
+ if (sma.isDeleted()) {
+ AWorkbench.popup("ERROR", "Artifact has been deleted");
+ return;
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ page.openEditor(new SMAEditorInput(sma), EDITOR_ID);
+ VisitedItems.addVisited(sma);
+ } catch (PartInitException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }, pend);
+
+ }
+
+ @Override
+ public void onDirtied() {
+ Displays.ensureInDisplayThread(new Runnable() {
+
+ public void run() {
+ firePropertyChange(PROP_DIRTY);
+ }
+ });
+ }
+
+ public static void close(StateMachineArtifact artifact, boolean save) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IEditorReference editors[] = page.getEditorReferences();
+ for (int j = 0; j < editors.length; j++) {
+ IEditorReference editor = editors[j];
+ if (editor.getPart(false) instanceof SMAEditor) {
+ if (((SMAEditor) editor.getPart(false)).getSmaMgr().getSma().equals(artifact)) {
+ ((SMAEditor) editor.getPart(false)).closeEditor();
+ }
+ }
+ }
+ }
+
+ public static SMAEditor getSmaEditor(StateMachineArtifact artifact) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IEditorReference editors[] = page.getEditorReferences();
+ for (int j = 0; j < editors.length; j++) {
+ IEditorReference editor = editors[j];
+ if (editor.getPart(false) instanceof SMAEditor) {
+ if (((SMAEditor) editor.getPart(false)).getSmaMgr().getSma().equals(artifact)) {
+ return ((SMAEditor) editor.getPart(false));
+ }
+ }
+ }
+ return null;
+ }
+
+ public void closeEditor() {
+ final MultiPageEditorPart editor = this;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ AWorkbench.getActivePage().closeEditor(editor, false);
+ }
+ });
+ }
+
+ /**
+ * @return Returns the smaMgr.
+ */
+ public SMAManager getSmaMgr() {
+ return smaMgr;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getCurrentStateName()
+ */
+ public String getCurrentStateName() throws OseeCoreException {
+ return smaMgr.getStateMgr().getCurrentStateName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getEditor()
+ */
+ public IDirtiableEditor getEditor() throws OseeCoreException {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getParentSmaMgr()
+ */
+ public SMAManager getParentSmaMgr() throws OseeCoreException {
+ return smaMgr;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getTabName()
+ */
+ public String getTabName() throws OseeCoreException {
+ return "Tasks";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getTaskArtifacts(java.lang.String)
+ */
+ public Collection<TaskArtifact> getTaskArtifacts(String stateName) throws OseeCoreException {
+ if (stateName == null || stateName.equals(""))
+ return smaMgr.getTaskMgr().getTaskArtifacts();
+ else
+ return smaMgr.getTaskMgr().getTaskArtifacts(stateName);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#isTaskable()
+ */
+ public boolean isTaskable() throws OseeCoreException {
+ return smaMgr.isTaskable();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#isEditable()
+ */
+ public boolean isTasksEditable() throws OseeCoreException {
+ return smaMgr.getSma().isTaskable();
+ }
+
+ /**
+ * @return the priviledgedEditMode
+ */
+ public boolean isPriviledgedEditModeEnabled() {
+ return priviledgedEditModeEnabled;
+ }
+
+ /**
+ * @param priviledgedEditMode the priviledgedEditMode to set s * @throws OseeCoreException
+ */
+ public void setPriviledgedEditMode(boolean enabled) throws OseeCoreException {
+ this.priviledgedEditModeEnabled = enabled;
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ smaMgr.getSma().saveSMA(transaction);
+ transaction.execute();
+ workFlowTab.refresh();
+ }
+
+ /**
+ * @return the isAccessControlWrite
+ * @throws OseeCoreException
+ */
+ public boolean isAccessControlWrite() throws OseeCoreException {
+ return AccessControlManager.getInstance().checkCurrentUserObjectPermission(smaMgr.getSma(), PermissionEnum.WRITE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, org.eclipse.osee.framework.skynet.core.artifact.Branch, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ try {
+ if (smaMgr.isInTransition()) return;
+ if (branchModType == BranchEventType.Added || branchModType == BranchEventType.Deleted || branchModType == BranchEventType.Committed) {
+ if (smaMgr.getBranchMgr().getBranchId() == null || smaMgr.getBranchMgr().getBranchId() != branchId) {
+ return;
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ if (getContainer() == null || getContainer().isDisposed()) return;
+ try {
+ refreshPages();
+ onDirtied();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.TransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (smaMgr.isInTransition()) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ if (transData.isDeleted(smaMgr.getSma())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ closeEditor();
+ }
+ });
+ } else if (transData.isHasEvent(smaMgr.getSma())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ refreshPages();
+ onDirtied();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ });
+ } else if (smaMgr.getReviewManager().hasReviews()) {
+ try {
+ // If related review has made a change, redraw
+ for (ReviewSMArtifact reviewArt : smaMgr.getReviewManager().getReviews()) {
+ if (transData.isHasEvent(reviewArt)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ refreshPages();
+ onDirtied();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ });
+ // Only refresh editor for first review that has event
+ break;
+ }
+ }
+ } catch (Exception ex) {
+ // do nothings
+ }
+ }
+ onDirtied();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, java.util.Collection, java.util.Collection)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.getLoadedArtifacts().contains(smaMgr.getSma())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ closeEditor();
+ }
+ });
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener#handleRelationModifiedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.relation.RelationModType, org.eclipse.osee.framework.skynet.core.relation.RelationLink, org.eclipse.osee.framework.skynet.core.artifact.Branch, java.lang.String)
+ */
+ @Override
+ public void handleRelationModifiedEvent(Sender sender, RelationModType relationModType, RelationLink link, Branch branch, String relationType) {
+ try {
+ if (branch.getBranchId() != AtsPlugin.getAtsBranch().getBranchId()) return;
+ if (link.getArtifactA().equals(smaMgr.getSma()) || link.getArtifactB().equals(smaMgr.getSma())) {
+ onDirtied();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getMetricsArtifacts()
+ */
+ @Override
+ public Collection<? extends Artifact> getMetricsArtifacts() throws OseeCoreException {
+ return Arrays.asList(smaMgr.getSma());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getMetricsVersionArtifact()
+ */
+ @Override
+ public VersionArtifact getMetricsVersionArtifact() throws OseeCoreException {
+ return smaMgr.getSma().getWorldViewTargetedVersion();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#handleRefreshAction()
+ */
+ @Override
+ public void handleRefreshAction() throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#isRefreshActionHandled()
+ */
+ @Override
+ public boolean isRefreshActionHandled() throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getManDaysPerHour()
+ */
+ @Override
+ public double getManHoursPerDayPreference() throws OseeCoreException {
+ return smaMgr.getSma().getManHrsPerDayPreference();
+ }
+
+ /**
+ * @return the workFlowTab
+ */
+ public SMAWorkFlowTab getWorkFlowTab() {
+ return workFlowTab;
+ }
+
+ /**
+ * @return the taskComposite
+ */
+ public SMATaskComposite getTaskComposite() {
+ return taskComposite;
+ }
+
+ /**
+ * @param taskComposite the taskComposite to set
+ */
+ public void setTaskComposite(SMATaskComposite taskComposite) {
+ this.taskComposite = taskComposite;
+ }
+
+ public List<XWidget> getXWidgetsFromState(String stateName, Class<?> clazz) {
+ return workFlowTab.getXWidgetsFromState(stateName, clazz);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditorInput.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditorInput.java
new file mode 100644
index 00000000000..fab81278702
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditorInput.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.ats.editor;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAEditorInput extends BaseArtifactEditorInput {
+
+ public SMAEditorInput(Artifact artifact) {
+ super(artifact);
+ }
+
+ public boolean equals(Object obj) {
+ boolean equals = false;
+ if (obj instanceof SMAEditorInput) {
+ return (getArtifact() == ((SMAEditorInput) obj).getArtifact());
+ }
+ return equals;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAHistoryComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAHistoryComposite.java
new file mode 100644
index 00000000000..64ae3ddb0b2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAHistoryComposite.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.ats.editor;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultsComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAHistoryComposite extends Composite {
+
+ private final XResultsComposite xResultsComp;
+ private final SMAManager smaMgr;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public SMAHistoryComposite(SMAManager smaMgr, Composite parent, int style) throws OseeCoreException {
+ super(parent, style);
+ this.smaMgr = smaMgr;
+
+ xResultsComp = new XResultsComposite(this, SWT.BORDER);
+ xResultsComp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 500;
+ xResultsComp.setLayoutData(gd);
+ xResultsComp.setHtmlText(smaMgr.getLog().getHtml(true), smaMgr.getSma().getArtifactTypeName() + " History");
+
+ Label button = new Label(this, SWT.NONE);
+ button.setText(" ");
+ final SMAManager fSmaMgr = smaMgr;
+ button.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ ArtifactEditor.editArtifact(fSmaMgr.getSma());
+ }
+ });
+ }
+
+ public void refresh() throws OseeCoreException {
+ if (xResultsComp != null && !xResultsComp.isDisposed()) {
+ // System.out.println("SMAHistoryComposite refresh...");
+ xResultsComp.setHtmlText(smaMgr.getLog().getHtml(true), smaMgr.getSma().getArtifactTypeName() + " History");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAManager.java
new file mode 100644
index 00000000000..c11048a1119
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAManager.java
@@ -0,0 +1,897 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.editor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ATSLog;
+import org.eclipse.osee.ats.artifact.ATSNote;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.util.AtsBranchManager;
+import org.eclipse.osee.ats.util.AtsNotifyUsers;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.DeadlineManager;
+import org.eclipse.osee.ats.util.StateManager;
+import org.eclipse.osee.ats.util.widgets.ReviewManager;
+import org.eclipse.osee.ats.util.widgets.TaskManager;
+import org.eclipse.osee.ats.util.widgets.dialog.AtsPriorityDialog;
+import org.eclipse.osee.ats.util.widgets.dialog.VersionListDialog;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ChangeTypeDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.DateSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserCheckTreeDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserListDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAManager {
+
+ private final StateMachineArtifact sma;
+ private Collection<User> transitionAssignees;
+ private static String SEPERATOR = "; ";
+ private final TaskManager taskMgr;
+ private final ReviewManager reviewMgr;
+ private final AtsBranchManager branchMgr;
+ private final StateManager stateMgr;
+ private final DeadlineManager deadlineMgr;
+ private SMAEditor editor;
+ private final ATSLog atsLog;
+ private final ATSNote atsNote;
+ private static final AtsStateItems stateItems = new AtsStateItems();
+ private boolean inTransition = false;
+ public static enum TransitionOption {
+ None, Persist,
+ // Override check whether workflow allows transition to state
+ OverrideTransitionValidityCheck,
+ // Allows transition to occur with UnAssigned, OseeSystem or Guest
+ OverrideAssigneeCheck
+ };
+
+ public SMAManager(StateMachineArtifact sma, SMAEditor editor) {
+ super();
+ this.sma = sma;
+ this.editor = editor;
+ stateMgr = new StateManager(this);
+ reviewMgr = new ReviewManager(this);
+ taskMgr = new TaskManager(this);
+ branchMgr = new AtsBranchManager(this);
+ deadlineMgr = new DeadlineManager(this);
+ atsLog = new ATSLog(sma);
+ atsNote = new ATSNote(sma);
+ }
+
+ public SMAManager(StateMachineArtifact sma) {
+ this(sma, null);
+ }
+
+ public void closeEditors(boolean save) {
+ SMAEditor.close(sma, save);
+ }
+
+ public boolean isUserInactive() throws OseeCoreException {
+ for (User user : stateMgr.getAssignees()) {
+ if (!user.isActive()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isUserSystem() throws OseeCoreException {
+ for (User user : stateMgr.getAssignees()) {
+ if (user.isSystemUser()) return true;
+ }
+ return false;
+ }
+
+ public Set<User> getPrivilegedUsers() throws OseeCoreException {
+ return sma.getPrivilegedUsers();
+ }
+
+ public ATSLog getLog() {
+ return atsLog;
+ }
+
+ public ATSNote getNotes() {
+ return atsNote;
+ }
+
+ public Result getUserInputNeeded() {
+ return Result.FalseResult;
+ }
+
+ public WorkPageDefinition getWorkPageDefinition() throws OseeCoreException {
+ if (getStateMgr().getCurrentStateName() == null) return null;
+ return sma.getWorkFlowDefinition().getWorkPageDefinitionByName(getStateMgr().getCurrentStateName());
+ }
+
+ public WorkPageDefinition getWorkPageDefinitionByName(String name) throws OseeCoreException {
+ return sma.getWorkFlowDefinition().getWorkPageDefinitionByName(name);
+ }
+
+ public WorkPageDefinition getWorkPageDefinitionById(String id) throws OseeCoreException {
+ return sma.getWorkFlowDefinition().getWorkPageDefinitionById(id);
+ }
+
+ public boolean isHistoricalVersion() {
+ return sma.isHistorical();
+ }
+
+ public List<WorkPageDefinition> getToWorkPages() throws OseeCoreException {
+ return getWorkFlowDefinition().getToPages(getWorkPageDefinition());
+ }
+
+ public List<WorkPageDefinition> getReturnPages() throws OseeCoreException {
+ return getWorkFlowDefinition().getReturnPages(getWorkPageDefinition());
+ }
+
+ public boolean isReturnPage(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return getWorkFlowDefinition().isReturnPage(getWorkPageDefinition(), workPageDefinition);
+ }
+
+ public boolean isAccessControlWrite() throws OseeCoreException {
+ return AccessControlManager.getInstance().checkCurrentUserObjectPermission(sma, PermissionEnum.WRITE);
+ }
+
+ public User getOriginator() throws OseeCoreException {
+ return atsLog.getOriginator();
+ }
+
+ public void setOriginator(User user) throws OseeCoreException {
+ atsLog.addLog(LogType.Originated, "", "Changed by " + UserManager.getUser().getName(), user);
+ }
+
+ /**
+ * @return true if this is a TeamWorkflow and it uses versions
+ */
+ public boolean isTeamUsesVersions() {
+ if (!(getSma() instanceof TeamWorkFlowArtifact)) return false;
+ try {
+ return ((TeamWorkFlowArtifact) getSma()).getTeamDefinition().isTeamUsesVersions();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ }
+
+ /**
+ * Return true if sma is TeamWorkflowArtifact and it's TeamDefinitionArtifact has rule set
+ *
+ * @param ruleId
+ * @return if has rule
+ * @throws OseeCoreException
+ * @throws
+ */
+ public boolean teamDefHasWorkRule(String ruleId) throws OseeCoreException {
+ if (!(getSma() instanceof TeamWorkFlowArtifact)) return false;
+ try {
+ return ((TeamWorkFlowArtifact) getSma()).getTeamDefinition().hasWorkRule(ruleId);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ }
+
+ public boolean workPageHasWorkRule(String ruleId) throws OseeCoreException {
+ return getWorkPageDefinition().hasWorkRule(AtsWorkDefinitions.RuleWorkItemId.atsRequireTargetedVersion.name());
+ }
+
+ public Collection<WorkRuleDefinition> getWorkRulesStartsWith(String ruleId) throws OseeCoreException {
+ Set<WorkRuleDefinition> workRules = new HashSet<WorkRuleDefinition>();
+ if (ruleId == null || ruleId.equals("")) return workRules;
+ if (getSma() instanceof TeamWorkFlowArtifact) {
+ // Get rules from team definition
+ workRules.addAll(((TeamWorkFlowArtifact) getSma()).getTeamDefinition().getWorkRulesStartsWith(ruleId));
+ }
+ // Get work rules from workflow
+ WorkFlowDefinition workFlowDefinition = getWorkFlowDefinition();
+ if (workFlowDefinition != null) {
+ // Get rules from workflow definitions
+ workRules.addAll(getWorkFlowDefinition().getWorkRulesStartsWith(ruleId));
+ }
+ // Add work rules from page
+ for (WorkItemDefinition wid : getWorkPageDefinition().getWorkItems(false)) {
+ if (!wid.getId().equals("") && wid.getId().startsWith(ruleId)) {
+ workRules.add((WorkRuleDefinition) wid);
+ }
+ }
+ return workRules;
+ }
+
+ /**
+ * @return true if this is a TeamWorkflow and the version it's been targeted for has been released
+ */
+ public boolean isReleased() {
+ try {
+ VersionArtifact verArt = getTargetedForVersion();
+ if (verArt != null) return verArt.isReleased();
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+ return false;
+ }
+
+ public VersionArtifact getTargetedForVersion() throws OseeCoreException {
+ return sma.getWorldViewTargetedVersion();
+ }
+
+ public boolean promptChangeAssignees(boolean persist) throws OseeCoreException {
+ return promptChangeAssignees(Arrays.asList(sma), persist);
+ }
+
+ public static boolean promptChangeAssignees(final Collection<? extends StateMachineArtifact> smas, boolean persist) throws OseeCoreException {
+ for (StateMachineArtifact sma : smas) {
+ SMAManager smaMgr = new SMAManager(sma);
+ if (smaMgr.isCompleted()) {
+ AWorkbench.popup("ERROR",
+ "Can't assign completed " + sma.getArtifactTypeName() + " (" + sma.getHumanReadableId() + ")");
+ return false;
+ } else if (smaMgr.isCancelled()) {
+ AWorkbench.popup("ERROR",
+ "Can't assign cancelled " + sma.getArtifactTypeName() + " (" + sma.getHumanReadableId() + ")");
+ return false;
+ }
+ }
+ UserCheckTreeDialog uld = new UserCheckTreeDialog(Display.getCurrent().getActiveShell());
+ uld.setMessage("Select to assign.\nDeSelect to un-assign.");
+ if (smas.size() == 1) {
+ SMAManager smaMgr = new SMAManager(smas.iterator().next());
+ uld.setInitialSelections(smaMgr.getStateMgr().getAssignees());
+ }
+ if (uld.open() != 0) return false;
+ Collection<User> users = uld.getUsersSelected();
+ if (users.size() == 0) {
+ AWorkbench.popup("ERROR", "Must have at least one assignee");
+ return false;
+ }
+ // As a convenience, remove the UnAssigned user if another user is selected
+ if (users.size() > 1) {
+ users.remove(UserManager.getUser(SystemUser.UnAssigned));
+ }
+ for (StateMachineArtifact sma : smas) {
+ sma.getSmaMgr().getStateMgr().setAssignees(users);
+ }
+ if (persist) {
+ Artifacts.persistInTransaction(smas);
+ }
+ return true;
+ }
+
+ public boolean promptChangeOriginator() throws OseeCoreException {
+ return promptChangeOriginator(Arrays.asList(sma));
+ }
+
+ public static boolean promptChangeOriginator(final Collection<? extends StateMachineArtifact> smas) throws OseeCoreException {
+ UserListDialog ld = new UserListDialog(Display.getCurrent().getActiveShell(), "Select New Originator");
+ int result = ld.open();
+ if (result == 0) {
+ User selectedUser = ld.getSelection();
+ for (StateMachineArtifact sma : smas) {
+ SMAManager smaMgr = new SMAManager(sma);
+ smaMgr.setOriginator(selectedUser);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public boolean promptChangeVersion(VersionReleaseType versionReleaseType, boolean persist) throws OseeCoreException {
+ return promptChangeVersion(Arrays.asList((TeamWorkFlowArtifact) sma), versionReleaseType, persist);
+ }
+
+ public static boolean promptChangeVersion(final Collection<? extends TeamWorkFlowArtifact> smas, VersionReleaseType versionReleaseType, final boolean persist) throws OseeCoreException {
+ TeamDefinitionArtifact teamDefHoldingVersions = null;
+ for (TeamWorkFlowArtifact teamArt : smas) {
+ SMAManager smaMgr = new SMAManager(teamArt);
+ if (!teamArt.getTeamDefinition().isTeamUsesVersions()) {
+ AWorkbench.popup("ERROR",
+ "Team \"" + teamArt.getTeamDefinition().getDescriptiveName() + "\" doesn't use versions.");
+ return false;
+ }
+ if (smaMgr.isReleased()) {
+ String error = "Team Workflow\n \"" + teamArt.getDescriptiveName() + "\"\n is already released.";
+ if (AtsPlugin.isAtsAdmin() && !MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
+ "Change Version", error + "\n\nOverride?")) {
+ return false;
+ } else if (!AtsPlugin.isAtsAdmin()) AWorkbench.popup("ERROR", error);
+ }
+ if (teamDefHoldingVersions != null) {
+ if (teamDefHoldingVersions != teamArt.getTeamDefinition().getTeamDefinitionHoldingVersions()) {
+ AWorkbench.popup("ERROR", "Can't change version on Workflows that have different release version sets.");
+ return false;
+ }
+ }
+ if (teamDefHoldingVersions == null) teamDefHoldingVersions =
+ teamArt.getTeamDefinition().getTeamDefinitionHoldingVersions();
+ }
+ if (teamDefHoldingVersions == null) {
+ AWorkbench.popup("ERROR", "No versions configured for impacted team(s).");
+ return false;
+ }
+ final VersionListDialog vld =
+ new VersionListDialog("Select Version", "Select Version",
+ teamDefHoldingVersions.getVersionsArtifacts(versionReleaseType));
+ if (smas.size() == 1 && smas.iterator().next().getWorldViewTargetedVersion() != null) {
+ Object[] objs = new Object[1];
+ objs[0] = smas.iterator().next().getWorldViewTargetedVersion();
+ vld.setInitialSelections(objs);
+ }
+ int result = vld.open();
+ if (result != 0) {
+ return false;
+ }
+ Object obj = vld.getResult()[0];
+ VersionArtifact newVersion = (VersionArtifact) obj;
+ for (TeamWorkFlowArtifact teamArt : smas) {
+ teamArt.setSoleRelation(AtsRelation.TeamWorkflowTargetedForVersion_Version, newVersion);
+ }
+ if (persist) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (TeamWorkFlowArtifact teamArt : smas) {
+ teamArt.persistRelations(transaction);
+ }
+ transaction.execute();
+ }
+ return true;
+ }
+
+ public boolean promptChangeType(boolean persist) {
+ if (sma instanceof TeamWorkFlowArtifact) return promptChangeType(Arrays.asList((TeamWorkFlowArtifact) sma),
+ persist);
+ return false;
+ }
+
+ public static boolean promptChangeType(final Collection<? extends TeamWorkFlowArtifact> teams, boolean persist) {
+
+ for (TeamWorkFlowArtifact team : teams) {
+ SMAManager smaMgr = new SMAManager(team);
+ if (smaMgr.isReleased()) {
+ AWorkbench.popup("ERROR", "Team Workflow\n \"" + team.getDescriptiveName() + "\"\n is already released.");
+ return false;
+ }
+ }
+ final ChangeTypeDialog dialog = new ChangeTypeDialog(Display.getCurrent().getActiveShell());
+ try {
+ if (teams.size() == 1) {
+ dialog.setSelected(teams.iterator().next().getChangeType());
+ }
+ if (dialog.open() == 0) {
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+
+ for (TeamWorkFlowArtifact team : teams) {
+ if (team.getChangeType() != dialog.getSelection()) {
+ team.setChangeType(dialog.getSelection());
+ team.saveSMA(transaction);
+ }
+ }
+ transaction.execute();
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't change priority", ex);
+ return false;
+ }
+ }
+
+ public boolean promptChangePriority(boolean persist) {
+ if (sma instanceof TeamWorkFlowArtifact) return promptChangePriority(Arrays.asList((TeamWorkFlowArtifact) sma),
+ persist);
+ return false;
+ }
+
+ public static boolean promptChangePriority(final Collection<? extends TeamWorkFlowArtifact> teams, boolean persist) {
+
+ for (TeamWorkFlowArtifact team : teams) {
+ SMAManager smaMgr = new SMAManager(team);
+ if (smaMgr.isReleased()) {
+ AWorkbench.popup("ERROR", "Team Workflow\n \"" + team.getDescriptiveName() + "\"\n is already released.");
+ return false;
+ }
+ }
+ final AtsPriorityDialog ald = new AtsPriorityDialog(Display.getCurrent().getActiveShell());
+ try {
+ if (teams.size() == 1) {
+ ald.setSelected(teams.iterator().next().getPriority());
+ }
+ if (ald.open() == 0) {
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (TeamWorkFlowArtifact team : teams) {
+ if (team.getPriority() != ald.getSelection()) {
+ team.setPriority(ald.getSelection());
+ team.saveSMA(transaction);
+ }
+ }
+ transaction.execute();
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't change priority", ex);
+ return false;
+ }
+ }
+
+ public boolean promptChangeFloatAttribute(ATSAttributes atsAttr, boolean persist) {
+ try {
+ return ArtifactPromptChange.promptChangeFloatAttribute(atsAttr.getStoreName(), atsAttr.getDisplayName(),
+ Arrays.asList(sma), persist);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangeIntegerAttribute(ATSAttributes atsAttr, boolean persist) {
+ try {
+ return ArtifactPromptChange.promptChangeIntegerAttribute(atsAttr.getStoreName(), atsAttr.getDisplayName(),
+ Arrays.asList(sma), persist);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangePercentAttribute(ATSAttributes atsAttr, boolean persist) {
+ try {
+ return ArtifactPromptChange.promptChangePercentAttribute(atsAttr.getStoreName(), atsAttr.getDisplayName(),
+ Arrays.asList(new Artifact[] {sma}), persist);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangeBoolean(ATSAttributes atsAttr, String toggleMessage, boolean persist) {
+ try {
+ return ArtifactPromptChange.promptChangeBoolean(atsAttr.getStoreName(), atsAttr.getDisplayName(),
+ Arrays.asList(sma), toggleMessage, persist);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public static boolean promptChangeAttribute(ATSAttributes atsAttr, final Collection<? extends StateMachineArtifact> smas, boolean persist, boolean multiLine) throws OseeCoreException {
+ return ArtifactPromptChange.promptChangeStringAttribute(atsAttr.getStoreName(), atsAttr.getDisplayName(), null,
+ smas, persist, multiLine);
+ }
+
+ public static boolean promptChangeAttribute(ATSAttributes atsAttr, final Artifact sma, boolean persist, boolean multiLine) {
+ try {
+ return ArtifactPromptChange.promptChangeStringAttribute(atsAttr.getStoreName(), atsAttr.getDisplayName(),
+ Arrays.asList(new Artifact[] {sma}), persist, multiLine);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangeAttribute(ATSAttributes atsAttr, final boolean persist, boolean multiLine) {
+ try {
+ return ArtifactPromptChange.promptChangeStringAttribute(atsAttr.getStoreName(), atsAttr.getDisplayName(),
+ Arrays.asList(sma), persist, multiLine);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangeDate(ATSAttributes atsAttr, boolean persist) {
+ try {
+ return ArtifactPromptChange.promptChangeDate(atsAttr.getStoreName(), atsAttr.getDisplayName(), sma, persist);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Can't save " + atsAttr.getDisplayName() + " date to artifact " + sma.getHumanReadableId(), ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangeReleaseDate() {
+ if (isReleased()) {
+ AWorkbench.popup("ERROR", "Team Workflow\n \"" + sma.getDescriptiveName() + "\"\n is already released.");
+ return false;
+ }
+ try {
+ VersionArtifact verArt = getTargetedForVersion();
+ if (verArt != null) {
+ // prompt that this object is assigned to a version that is targeted
+ // for release xxx - want to change?
+ DateSelectionDialog diag =
+ new DateSelectionDialog(
+ "Select Release Date Date",
+ "Warning: " + sma.getArtifactTypeName() + "'s release date is handled\n" + "by targeted for version \"" + verArt.getDescriptiveName() + "\"\n" + "changing the date here will change the\n" + "date for this entire release.\n\nSelect date to change.\n",
+ verArt.getReleaseDate());
+ if (verArt.getReleaseDate() != null) diag.setSelectedDate(verArt.getReleaseDate());
+ if (diag.open() == 0) {
+ verArt.setSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), diag.getSelectedDate());
+ verArt.persistAttributes();
+ return true;
+ }
+ } else {
+ // prompt that current release is (get from attribute) - want to change?
+ DateSelectionDialog diag =
+ new DateSelectionDialog("Select Release Date", "Select Release Date", sma.getWorldViewReleaseDate());
+ if (getSma().getWorldViewReleaseDate() != null) diag.setSelectedDate(sma.getWorldViewReleaseDate());
+ if (diag.open() == 0) {
+ sma.setSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), diag.getSelectedDate());
+ sma.persistAttributes();
+ return true;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't save release date " + sma.getHumanReadableId(), ex);
+ }
+ return false;
+ }
+
+ public boolean promptChangeEstimatedReleaseDate() {
+ try {
+ VersionArtifact verArt = getTargetedForVersion();
+ if (verArt != null) {
+ // prompt that this object is assigned to a version that is targeted for release xxx -
+ // want to change?
+ DateSelectionDialog diag =
+ new DateSelectionDialog(
+ "Select Estimated Release Date Date",
+ "Warning: " + sma.getArtifactTypeName() + "'s estimated release date is handled\n" + "by targeted for version \"" + verArt.getDescriptiveName() + "\"\n" + "changing the date here will change the\n" + "date for this entire release.\n\nSelect date to change.\n",
+ verArt.getEstimatedReleaseDate());
+ if (verArt.getEstimatedReleaseDate() != null) diag.setSelectedDate(verArt.getEstimatedReleaseDate());
+ if (diag.open() == 0) {
+ verArt.setSoleAttributeValue(ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(),
+ diag.getSelectedDate());
+ verArt.persistAttributes();
+ return true;
+ }
+ } else {
+ // prompt that current est release is (get from attribute); want to
+ // change
+ DateSelectionDialog diag =
+ new DateSelectionDialog("Select Estimate Release Date", "Select Estimated Release Date",
+ sma.getWorldViewEstimatedReleaseDate());
+ if (getSma().getWorldViewEstimatedReleaseDate() != null) diag.setSelectedDate(sma.getWorldViewEstimatedReleaseDate());
+ if (diag.open() == 0) {
+ sma.setSoleAttributeValue(ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(),
+ diag.getSelectedDate());
+ sma.persistAttributes();
+ return true;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Can't save est release date " + sma.getHumanReadableId(), ex);
+ }
+ return false;
+ }
+
+ public WorkFlowDefinition getWorkFlowDefinition() throws OseeCoreException {
+ return sma.getWorkFlowDefinition();
+ }
+
+ public boolean isCompleted() throws OseeCoreException {
+ return (stateMgr.getCurrentStateName().equals(DefaultTeamState.Completed.name()));
+ }
+
+ public boolean isCancelled() throws OseeCoreException {
+ return (stateMgr.getCurrentStateName().equals(DefaultTeamState.Cancelled.name()));
+ }
+
+ public boolean isCancelledOrCompleted() throws OseeCoreException {
+ return isCompleted() || isCancelled();
+ }
+
+ public boolean isCurrentSectionExpanded(String stateName) throws OseeCoreException {
+ return sma.isCurrentSectionExpanded(stateName);
+ }
+
+ public boolean isCurrentState(String stateName) throws OseeCoreException {
+ return stateName.equals(stateMgr.getCurrentStateName());
+ }
+
+ public void setTransitionAssignees(Collection<User> assignees) throws OseeCoreException {
+ if (assignees.contains(UserManager.getUser(SystemUser.OseeSystem)) || assignees.contains(UserManager.getUser(SystemUser.Guest))) {
+ throw new OseeArgumentException("Can not assign workflow to OseeSystem or Guest");
+ }
+ if (assignees.size() > 1 && assignees.contains(UserManager.getUser(SystemUser.UnAssigned))) {
+ throw new OseeArgumentException("Can not assign to user and UnAssigned");
+ }
+ transitionAssignees = assignees;
+ }
+
+ public boolean isAssigneeMe() throws OseeCoreException {
+ return stateMgr.getAssignees().contains(UserManager.getUser());
+ }
+
+ public Collection<User> getTransitionAssignees() throws OseeCoreException {
+ if (transitionAssignees != null) {
+ if (transitionAssignees.size() > 0 && transitionAssignees.contains(UserManager.getUser(SystemUser.UnAssigned))) {
+ transitionAssignees.remove(transitionAssignees.contains(UserManager.getUser(SystemUser.UnAssigned)));
+ }
+ if (transitionAssignees.size() > 0) {
+ return transitionAssignees;
+ }
+ }
+ return stateMgr.getAssignees();
+ }
+
+ public String getTransitionAssigneesStr() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (User u : getTransitionAssignees()) {
+ sb.append(u.getName() + SEPERATOR);
+ }
+ return sb.toString().replaceFirst(SEPERATOR + "$", "");
+ }
+
+ public Image getAssigneeImage() throws OseeCoreException {
+ return getSma().getAssigneeImage();
+ }
+
+ /**
+ * @return Returns the sma.
+ */
+ public StateMachineArtifact getSma() {
+ return sma;
+ }
+
+ /**
+ * @return true if SMA is allowed to have tasks
+ * @throws OseeCoreException
+ */
+ public boolean isTaskable() throws OseeCoreException {
+ return sma.isTaskable();
+ }
+
+ public boolean showTaskTab() throws OseeCoreException {
+ return sma.showTaskTab();
+ }
+
+ /**
+ * @return Returns the taskMgr.
+ */
+ public TaskManager getTaskMgr() {
+ return taskMgr;
+ }
+
+ public Result transitionToCancelled(String reason, SkynetTransaction transaction, TransitionOption... transitionOption) {
+ Result result =
+ transition(DefaultTeamState.Cancelled.name(), Arrays.asList(new User[] {}), reason, transaction,
+ transitionOption);
+ return result;
+ }
+
+ public Result transitionToCompleted(String reason, SkynetTransaction transaction, TransitionOption... transitionOption) {
+ Result result =
+ transition(DefaultTeamState.Completed.name(), Arrays.asList(new User[] {}), reason, transaction,
+ transitionOption);
+ return result;
+ }
+
+ public Result isTransitionValid(final String toStateName, final Collection<User> toAssignees, TransitionOption... transitionOption) throws OseeCoreException {
+ boolean overrideTransitionCheck =
+ Collections.getAggregate(transitionOption).contains(TransitionOption.OverrideTransitionValidityCheck);
+ boolean overrideAssigneeCheck =
+ Collections.getAggregate(transitionOption).contains(TransitionOption.OverrideAssigneeCheck);
+ // Validate assignees
+ if (!overrideAssigneeCheck && (getStateMgr().getAssignees().contains(UserManager.getUser(SystemUser.OseeSystem)) || getStateMgr().getAssignees().contains(
+ UserManager.getUser(SystemUser.Guest)) || getStateMgr().getAssignees().contains(
+ UserManager.getUser(SystemUser.UnAssigned)))) {
+ return new Result("Can not transition with \"Guest\", \"UnAssigned\" or \"OseeSystem\" user as assignee.");
+ }
+
+ // Validate toState name
+ final WorkPageDefinition fromWorkPageDefinition = getWorkPageDefinition();
+ final WorkPageDefinition toWorkPageDefinition = getWorkPageDefinitionByName(toStateName);
+ if (toWorkPageDefinition == null) return new Result("Invalid toState \"" + toStateName + "\"");
+
+ // Validate transition from fromPage to toPage
+ if (!overrideTransitionCheck && !getWorkFlowDefinition().getToPages(fromWorkPageDefinition).contains(
+ toWorkPageDefinition)) {
+ String errStr =
+ "Not configured to transition to \"" + toStateName + "\" from \"" + fromWorkPageDefinition.getPageName() + "\"";
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, errStr);
+ return new Result(errStr);
+ }
+ // Don't transition with existing working branch
+ if (toStateName.equals(DefaultTeamState.Cancelled) && getBranchMgr().isWorkingBranchInWork()) return new Result(
+ "Working Branch exists. Please delete working branch before cancelling.");
+
+ // Don't transition with uncommitted branch if this is a commit state
+ if (AtsWorkDefinitions.isAllowCommitBranch(getWorkPageDefinition()) && getBranchMgr().isWorkingBranchInWork()) return new Result(
+ "Working Branch exists. Please commit or delete working branch before transition.");
+
+ // Check extension points for valid transition
+ List<IAtsStateItem> atsStateItems = stateItems.getStateItems(fromWorkPageDefinition.getId());
+ for (IAtsStateItem item : atsStateItems) {
+ Result result = item.transitioning(this, fromWorkPageDefinition.getPageName(), toStateName, toAssignees);
+ if (result.isFalse()) return result;
+ }
+ for (IAtsStateItem item : atsStateItems) {
+ Result result = item.transitioning(this, fromWorkPageDefinition.getPageName(), toStateName, toAssignees);
+ if (result.isFalse()) return result;
+ }
+ return Result.TrueResult;
+ }
+
+ public Result transition(String toStateName, User toAssignee, SkynetTransaction transaction, TransitionOption... transitionOption) {
+ List<User> users = new ArrayList<User>();
+ if (toAssignee != null && !toStateName.equals(DefaultTeamState.Completed.name()) && !toStateName.equals(DefaultTeamState.Cancelled.name())) users.add(toAssignee);
+ return transition(toStateName, users, transaction, transitionOption);
+ }
+
+ public boolean isTargetedVersionable() throws OseeCoreException {
+ if (!(getSma() instanceof TeamWorkFlowArtifact)) return false;
+ return (((TeamWorkFlowArtifact) getSma()).getTeamDefinition().getTeamDefinitionHoldingVersions() != null && ((TeamWorkFlowArtifact) getSma()).getTeamDefinition().getTeamDefinitionHoldingVersions().isTeamUsesVersions());
+ }
+
+ public Result transition(String toStateName, Collection<User> toAssignees, SkynetTransaction transaction, TransitionOption... transitionOption) {
+ return transition(toStateName, toAssignees, null, transaction, transitionOption);
+ }
+
+ private Result transition(final String toStateName, final Collection<User> toAssignees, final String completeOrCancelReason, SkynetTransaction transaction, TransitionOption... transitionOption) {
+ try {
+ final boolean persist = Collections.getAggregate(transitionOption).contains(TransitionOption.Persist);
+
+ Result result = isTransitionValid(toStateName, toAssignees, transitionOption);
+ if (result.isFalse()) return result;
+
+ final WorkPageDefinition fromWorkPageDefinition = getWorkPageDefinition();
+ final WorkPageDefinition toWorkPageDefinition = getWorkPageDefinitionByName(toStateName);
+
+ transitionHelper(toAssignees, persist, fromWorkPageDefinition, toWorkPageDefinition, toStateName,
+ completeOrCancelReason, transaction);
+ if (persist) {
+ OseeNotificationManager.sendNotifications();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return new Result("Transaction failed " + ex.getLocalizedMessage());
+ }
+ return Result.TrueResult;
+ }
+
+ private void transitionHelper(Collection<User> toAssignees, boolean persist, WorkPageDefinition fromPage, WorkPageDefinition toPage, String toStateName, String completeOrCancelReason, SkynetTransaction transaction) throws OseeCoreException {
+ // Log transition
+ if (toPage.isCancelledPage()) {
+ atsLog.addLog(LogType.StateCancelled, stateMgr.getCurrentStateName(), completeOrCancelReason);
+ } else {
+ atsLog.addLog(LogType.StateComplete, stateMgr.getCurrentStateName(),
+ (completeOrCancelReason != null ? completeOrCancelReason : ""));
+ }
+ atsLog.addLog(LogType.StateEntered, toStateName, "");
+
+ stateMgr.transitionHelper(toAssignees, persist, fromPage, toPage, toStateName, completeOrCancelReason);
+
+ if (getSma().isValidationRequired()) {
+ getReviewManager().createValidateReview(false, transaction);
+ }
+
+ AtsNotifyUsers.notify(sma, AtsNotifyUsers.NotifyType.Subscribed, AtsNotifyUsers.NotifyType.Completed,
+ AtsNotifyUsers.NotifyType.Completed);
+
+ // Persist
+ if (persist) {
+ getSma().persistAttributesAndRelations(transaction);
+ }
+
+ getSma().transitioned(fromPage, toPage, toAssignees, true, transaction);
+
+ // Notify extension points of transition
+ for (IAtsStateItem item : stateItems.getStateItems(fromPage.getId())) {
+ item.transitioned(this, fromPage.getPageName(), toStateName, toAssignees, transaction);
+ }
+ for (IAtsStateItem item : stateItems.getStateItems(toPage.getId())) {
+ item.transitioned(this, fromPage.getPageName(), toStateName, toAssignees, transaction);
+ }
+ }
+
+ /**
+ * @return Returns the editor.
+ */
+ public SMAEditor getEditor() {
+ return editor;
+ }
+
+ /**
+ * @param editor The editor to set.
+ */
+ public void setEditor(SMAEditor editor) {
+ this.editor = editor;
+ }
+
+ /**
+ * @return Returns the branchMgr.
+ */
+ public AtsBranchManager getBranchMgr() {
+ return branchMgr;
+ }
+
+ /**
+ * @return the reviewManager
+ */
+ public ReviewManager getReviewManager() {
+ return reviewMgr;
+ }
+
+ /**
+ * @return the stateItems
+ */
+ public AtsStateItems getStateItems() {
+ return stateItems;
+ }
+
+ /**
+ * @return the inTransition
+ */
+ public boolean isInTransition() {
+ return inTransition;
+ }
+
+ /**
+ * @param inTransition the inTransition to set
+ */
+ public void setInTransition(boolean inTransition) {
+ this.inTransition = inTransition;
+ }
+
+ /**
+ * @return the deadlineMgr
+ */
+ public DeadlineManager getDeadlineMgr() {
+ return deadlineMgr;
+ }
+
+ /**
+ * @return the stateMgr
+ */
+ public StateManager getStateMgr() {
+ return stateMgr;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPrint.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPrint.java
new file mode 100644
index 00000000000..b545843fda0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPrint.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.ats.editor;
+
+import java.util.Arrays;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.NoteItem;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAPrint extends Action {
+
+ private final SMAManager smaMgr;
+ private final SMATaskComposite taskComposite;
+ private final SMAWorkFlowTab workFlowTab;
+
+ public SMAPrint(SMAManager smaMgr, SMAWorkFlowTab workFlowTab, SMATaskComposite taskComposite) {
+ super();
+ this.smaMgr = smaMgr;
+ this.workFlowTab = workFlowTab;
+ this.taskComposite = taskComposite;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ try {
+ XResultData xResultData = getResultData();
+ xResultData.report(smaMgr.getSma().getDescriptiveName(), Manipulations.RAW_HTML);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+
+ public XResultData getResultData() throws OseeCoreException {
+ XResultData resultData = new XResultData();
+ resultData.addRaw(AHTML.beginMultiColumnTable(100));
+ resultData.addRaw(AHTML.addRowMultiColumnTable(new String[] {AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Title: ",
+ smaMgr.getSma().getDescriptiveName())}));
+ resultData.addRaw(AHTML.endMultiColumnTable());
+ resultData.addRaw(AHTML.beginMultiColumnTable(100));
+ resultData.addRaw(AHTML.addRowMultiColumnTable(new String[] {
+ //
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Current State: ",
+ ((IWorldViewArtifact) smaMgr.getSma()).getWorldViewState()),
+ //
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Team: ",
+ ((IWorldViewArtifact) smaMgr.getSma()).getWorldViewTeam()),
+ //
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Assignees: ",
+ ((IWorldViewArtifact) smaMgr.getSma()).getWorldViewActivePoc()),
+ //
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Originator: ",
+ ((IWorldViewArtifact) smaMgr.getSma()).getWorldViewOriginator()),
+ //
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Created: ", XDate.getDateStr(smaMgr.getLog().getCreationDate(),
+ XDate.MMDDYYHHMM))
+
+ }));
+ resultData.addRaw(AHTML.endMultiColumnTable());
+ resultData.addRaw(AHTML.beginMultiColumnTable(100));
+ resultData.addRaw(AHTML.addRowMultiColumnTable(new String[] {
+ //
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "Workflow: ", smaMgr.getSma().getArtifactTypeName()),
+ AHTML.getLabelValueStr(AHTML.LABEL_FONT, "HRID: ", smaMgr.getSma().getHumanReadableId()),
+ (smaMgr.getSma().getParentActionArtifact() == null ? "" : AHTML.getLabelValueStr(AHTML.LABEL_FONT,
+ "Action HRID: ", smaMgr.getSma().getParentActionArtifact().getHumanReadableId()))}));
+ resultData.addRaw(AHTML.endMultiColumnTable());
+ for (NoteItem note : smaMgr.getNotes().getNoteItems()) {
+ if (note.getState().equals("")) {
+ resultData.addRaw(note.toHTML() + AHTML.newline());
+ }
+ }
+ if (workFlowTab != null) resultData.addRaw(workFlowTab.getHtml());
+ if (taskComposite != null) resultData.addRaw(taskComposite.getHtml());
+ resultData.addRaw(AHTML.newline());
+ resultData.addRaw(smaMgr.getLog().getHtml());
+
+ XResultData rd = new XResultData();
+ rd.addRaw(AHTML.beginMultiColumnTable(100, 1));
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {resultData.getReport("").getManipulatedHtml(
+ Arrays.asList(Manipulations.NONE))}));
+ rd.addRaw(AHTML.endMultiColumnTable());
+
+ return rd;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPromptChangeStatus.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPromptChangeStatus.java
new file mode 100644
index 00000000000..f977fee3a96
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAPromptChangeStatus.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.ats.editor;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.util.widgets.dialog.TaskOptionStatusDialog;
+import org.eclipse.osee.ats.util.widgets.dialog.TaskResOptionDefinition;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAPromptChangeStatus {
+
+ private final Collection<? extends StateMachineArtifact> smas;
+
+ public SMAPromptChangeStatus(StateMachineArtifact sma) throws OseeCoreException {
+ this(Arrays.asList(sma));
+ }
+
+ public SMAPromptChangeStatus(final Collection<? extends StateMachineArtifact> smas) throws OseeCoreException {
+ this.smas = smas;
+ }
+
+ public static boolean promptChangeStatus(Collection<? extends StateMachineArtifact> smas, boolean persist) throws OseeCoreException {
+ SMAPromptChangeStatus promptChangeStatus = new SMAPromptChangeStatus(smas);
+ return promptChangeStatus.promptChangeStatus(persist).isTrue();
+ }
+
+ public Result isValidToChangeStatus() throws OseeCoreException {
+ // Don't allow statusing for any cancelled tasks
+ for (StateMachineArtifact sma : smas) {
+ if (sma.getSmaMgr().isCancelled()) {
+ String error =
+ "Can not status a cancelled " + sma.getArtifactTypeName() + ".\n\nTransition out of cancelled first.";
+ return new Result(error);
+ }
+ }
+ // If task status is being changed, make sure tasks belong to current state
+ for (StateMachineArtifact sma : smas) {
+ if (sma instanceof TaskArtifact) {
+ TaskArtifact taskArt = (TaskArtifact) sma;
+ if (!(taskArt.isRelatedToParentWorkflowCurrentState())) {
+ return new Result(
+ String.format(
+ "Task work must be done in \"Related to State\" of parent workflow for Task titled: \"%s\".\n\n" +
+ //
+ "Task work configured to be done in parent's \"%s\" state.\nParent workflow is currently in \"%s\" state.\n\n" +
+ //
+ "Either transition parent workflow or change Task's \"Related to State\" to perform task work.",
+ taskArt.getDescriptiveName(), taskArt.getWorldViewRelatedToState(),
+ taskArt.getParentSMA().getSmaMgr().getStateMgr().getCurrentStateName()));
+ }
+ }
+ }
+ return Result.TrueResult;
+ }
+
+ public Result promptChangeStatus(boolean persist) throws OseeCoreException {
+ Result result = isValidToChangeStatus();
+ if (result.isFalse()) {
+ result.popup();
+ return result;
+ }
+
+ // Access resolution options if object is task
+ List<TaskResOptionDefinition> options = null;
+ if (smas.iterator().next() instanceof TaskArtifact) {
+ if (((TaskArtifact) smas.iterator().next()).isUsingTaskResolutionOptions()) {
+ options = ((TaskArtifact) smas.iterator().next()).getTaskResolutionOptionDefintions();
+ }
+ }
+ TaskOptionStatusDialog tsd =
+ new TaskOptionStatusDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Enter State Status",
+ "Select resolution, enter percent complete and number of hours you spent since last status.", true,
+ options, smas);
+ if (tsd.open() == 0) {
+ performChangeStatus(options, tsd.getSelectedOptionDef() != null ? tsd.getSelectedOptionDef().getName() : null,
+ tsd.getHours().getFloat(), tsd.getPercent().getInt(), tsd.isSplitHours(), persist);
+ return Result.TrueResult;
+ }
+ return Result.FalseResult;
+ }
+
+ public void performChangeStatus(List<TaskResOptionDefinition> options, String selectedOption, double hours, int percent, boolean splitHours, boolean persist) throws OseeCoreException {
+ if (splitHours) {
+ hours = hours / smas.size();
+ }
+ SkynetTransaction transaction = null;
+ if (persist) {
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ }
+ for (StateMachineArtifact sma : smas) {
+ if (sma.getSmaMgr().getStateMgr().isUnAssigned()) {
+ sma.getSmaMgr().getStateMgr().removeAssignee(UserManager.getUser(SystemUser.UnAssigned));
+ sma.getSmaMgr().getStateMgr().addAssignee(UserManager.getUser());
+ }
+ if (options != null) {
+ sma.setSoleAttributeValue(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), selectedOption);
+ }
+ if (sma instanceof TaskArtifact) {
+ ((TaskArtifact) sma).statusPercentChanged(hours, percent, transaction);
+ } else {
+ sma.getSmaMgr().getStateMgr().updateMetrics(hours, percent, true);
+ }
+ if (persist) {
+ sma.persistAttributesAndRelations(transaction);
+ }
+ }
+ if (persist) {
+ transaction.execute();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMARelationsHyperlinkComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMARelationsHyperlinkComposite.java
new file mode 100644
index 00000000000..b7c698ad256
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMARelationsHyperlinkComposite.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.editor;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.dialog.AICheckTreeDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMARelationsHyperlinkComposite extends Composite {
+
+ private final XFormToolkit toolkit;
+ private static AtsRelation sides[] =
+ new AtsRelation[] {AtsRelation.TeamWorkflowToReview_Review, AtsRelation.TeamWorkflowToReview_Team,
+ AtsRelation.Supercedes_Superceded, AtsRelation.Supercedes_Supercedes,
+ AtsRelation.SupportingInfo_SupportedBy, AtsRelation.SupportingInfo_SupportingInfo,
+ AtsRelation.Dependency__Artifact, AtsRelation.Dependency__Dependency};
+ private SMAManager smaMgr;
+ private Label actionableItemsLabel;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public SMARelationsHyperlinkComposite(Composite parent, XFormToolkit toolkit, int style) {
+ super(parent, style);
+ this.toolkit = toolkit;
+ }
+
+ public void create(SMAManager smaMgr) throws OseeCoreException {
+ this.smaMgr = smaMgr;
+ setLayout(ALayout.getZeroMarginLayout(2, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = 500;
+ setLayoutData(gd);
+ toolkit.adapt(this);
+
+ processArtifact("This", smaMgr.getSma());
+ if (smaMgr.getSma() instanceof ReviewSMArtifact) processReviewArtifact((ReviewSMArtifact) smaMgr.getSma());
+
+ if ((smaMgr.getSma() instanceof TeamWorkFlowArtifact) && ((TeamWorkFlowArtifact) smaMgr.getSma()).getParentActionArtifact() != null) {
+ processArtifact("Parent ", ((TeamWorkFlowArtifact) smaMgr.getSma()).getParentActionArtifact());
+ }
+ }
+
+ public static boolean relationExists(StateMachineArtifact smaArt) throws OseeCoreException {
+ for (AtsRelation side : sides) {
+ if (smaArt.getRelatedArtifacts(side).size() > 0) return true;
+ if (smaArt.getParentActionArtifact() != null && smaArt.getParentActionArtifact().getRelatedArtifacts(side).size() > 0) return true;
+ }
+ if ((smaArt instanceof ReviewSMArtifact) && ((ReviewSMArtifact) smaArt).getActionableItemsDam().getActionableItemGuids().size() > 0) return true;
+ return false;
+ }
+
+ private String getCompletedCancelledString(Artifact art) throws OseeCoreException {
+ if (art instanceof StateMachineArtifact) {
+ if (((StateMachineArtifact) art).getSmaMgr().isCancelledOrCompleted()) {
+ return " " + ((StateMachineArtifact) art).getSmaMgr().getStateMgr().getCurrentStateName() + " ";
+ }
+ }
+ return "";
+ }
+
+ private void processArtifact(String name, Artifact thisArt) throws OseeCoreException {
+ for (AtsRelation side : sides) {
+ for (final Artifact art : thisArt.getRelatedArtifacts(side)) {
+ RelationLink rel = thisArt.getRelations(side, art).iterator().next();
+ toolkit.createLabel(
+ this,
+ name + " \"" + thisArt.getArtifactTypeName() + "\" " + rel.getSidePhrasingFor(thisArt) + getCompletedCancelledString(art) + " \"" + art.getArtifactTypeName() + "\" ");
+ Hyperlink link =
+ toolkit.createHyperlink(
+ this,
+ String.format(
+ "\"%s\" - %s",
+ art.getDescriptiveName().length() < 60 ? art.getDescriptiveName() : art.getDescriptiveName().substring(
+ 0, 60), art.getHumanReadableId()), SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ AtsLib.openAtsAction(art, AtsOpenOption.OpenOneOrPopupSelect);
+ }
+ });
+ }
+ }
+ }
+
+ private void processReviewArtifact(final ReviewSMArtifact reviewArt) throws OseeCoreException {
+ if (reviewArt.getActionableItemsDam().getActionableItemGuids().size() == 0) return;
+ actionableItemsLabel = toolkit.createLabel(this, "");
+ Hyperlink link = toolkit.createHyperlink(this, "(Edit)", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ editRelatedActionableItems(reviewArt);
+ }
+ });
+ refreshActionableItemsLabel();
+ }
+
+ private void refreshActionableItemsLabel() throws OseeCoreException {
+ if ((actionableItemsLabel != null) && smaMgr.getSma() instanceof ReviewSMArtifact) {
+ actionableItemsLabel.setText("This \"" + ((ReviewSMArtifact) smaMgr.getSma()).getArtifactTypeName() +
+ //
+ "\" is review of Actionable Items \"" +
+ //
+ ((ReviewSMArtifact) smaMgr.getSma()).getActionableItemsDam().getActionableItemsStr() + "\" ");
+ }
+ }
+
+ public void refresh() throws OseeCoreException {
+ refreshActionableItemsLabel();
+ }
+
+ private void editRelatedActionableItems(final ReviewSMArtifact reviewArt) {
+ final AICheckTreeDialog diag =
+ new AICheckTreeDialog("Edit Actionable Items", "Select Actionable Items for this review", Active.Active);
+ try {
+ diag.setInitialSelections(reviewArt.getActionableItemsDam().getActionableItems());
+ if (diag.open() != 0) return;
+ reviewArt.getActionableItemsDam().setActionableItems(diag.getChecked());
+ smaMgr.getEditor().onDirtied();
+ refreshActionableItemsLabel();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAReviewInfoComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAReviewInfoComposite.java
new file mode 100644
index 00000000000..a04d4e9b7d1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAReviewInfoComposite.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.editor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.NewDecisionReviewJob;
+import org.eclipse.osee.ats.actions.NewPeerToPeerReviewJob;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.util.Overview;
+import org.eclipse.osee.ats.util.widgets.ReviewManager;
+import org.eclipse.osee.ats.util.widgets.dialog.StateListAndTitleDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessageManager;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAReviewInfoComposite extends Composite {
+
+ private final SMAManager smaMgr;
+ private final String forStateName;
+ private final ArrayList<Label> labelWidgets = new ArrayList<Label>();
+ private final IManagedForm managedForm;
+
+ public SMAReviewInfoComposite(final SMAManager smaMgr, Composite parent, IManagedForm managedForm, XFormToolkit toolkit, String forStateName) throws OseeCoreException {
+ super(parent, SWT.NONE);
+ this.smaMgr = smaMgr;
+ this.managedForm = managedForm;
+ this.forStateName = forStateName;
+ setLayout(new GridLayout(4, false));
+ setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label label = new Label(this, SWT.NONE);
+ label.setText("\"" + forStateName + "\" State Reviews: ");
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ label.setToolTipText("Blocking Reviews must be completed before transtion. Select Review hyperlink to view.");
+ // If ATS Admin, allow right-click to auto-complete reviews
+ if (AtsPlugin.isAtsAdmin() && !AtsPlugin.isProductionDb()) {
+ label.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Auto Complete Reviews",
+ "ATS Admin\n\nAuto Complete Reviews?")) {
+ return;
+ }
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (ReviewSMArtifact revArt : smaMgr.getReviewManager().getReviewsFromCurrentState()) {
+ if (!revArt.getSmaMgr().isCancelledOrCompleted()) {
+ if (revArt.getSmaMgr().getStateMgr().isUnAssigned()) {
+ revArt.getSmaMgr().getStateMgr().setAssignee(UserManager.getUser());
+ }
+ Result result =
+ revArt.getSmaMgr().transitionToCompleted("", transaction,
+ TransitionOption.OverrideTransitionValidityCheck, TransitionOption.Persist);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ }
+ transaction.execute();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ }
+
+ Collection<ReviewSMArtifact> revArts = smaMgr.getReviewManager().getReviews(forStateName);
+ if (revArts.size() == 0) {
+ (new Label(this, SWT.NONE)).setText("No Reviews Created");
+ }
+
+ Hyperlink link = toolkit.createHyperlink(this, "[Add Decision Review]", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ StateListAndTitleDialog dialog =
+ new StateListAndTitleDialog("Create Decision Review",
+ "Select state to that review will be associated with.",
+ smaMgr.getWorkFlowDefinition().getPageNames());
+ dialog.setInitialSelections(new Object[] {smaMgr.getStateMgr().getCurrentStateName()});
+ if (dialog.open() == 0) {
+ if (dialog.getReviewTitle() == null || dialog.getReviewTitle().equals("")) {
+ AWorkbench.popup("ERROR", "Must enter review title");
+ return;
+ }
+ NewDecisionReviewJob job =
+ new NewDecisionReviewJob((TeamWorkFlowArtifact) smaMgr.getSma(), null, dialog.getReviewTitle(),
+ dialog.getSelectedState(), null, ReviewManager.getDefaultDecisionReviewOptions(), null);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ link = toolkit.createHyperlink(this, "[Add Peer to Peer Review]", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ StateListAndTitleDialog dialog =
+ new StateListAndTitleDialog("Add Peer to Peer Review",
+ "Select state to that review will be associated with.",
+ smaMgr.getWorkFlowDefinition().getPageNames());
+ dialog.setInitialSelections(new Object[] {smaMgr.getStateMgr().getCurrentStateName()});
+ dialog.setReviewTitle(PeerToPeerReviewArtifact.getDefaultReviewTitle(smaMgr));
+ if (dialog.open() == 0) {
+ if (dialog.getReviewTitle() == null || dialog.getReviewTitle().equals("")) {
+ AWorkbench.popup("ERROR", "Must enter review title");
+ return;
+ }
+ NewPeerToPeerReviewJob job =
+ new NewPeerToPeerReviewJob((TeamWorkFlowArtifact) smaMgr.getSma(), dialog.getReviewTitle(),
+ dialog.getSelectedState());
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ if (revArts.size() > 0) {
+ Composite workComp = toolkit.createContainer(this, 1);
+ workComp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));
+ GridData gd = new GridData();
+ gd.horizontalIndent = 20;
+ gd.horizontalSpan = 4;
+ workComp.setLayoutData(gd);
+
+ for (ReviewSMArtifact revArt : revArts) {
+ createReviewHyperlink(workComp, managedForm, toolkit, 2, revArt, forStateName);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return "SMAReviewComposite for SMA \"" + smaMgr.getSma() + "\"";
+ } catch (Exception ex) {
+ return "SMAReviewComposite " + ex.getLocalizedMessage();
+ }
+ }
+
+ public void clearFormMessages() {
+ for (Label label : labelWidgets) {
+ if (Widgets.isAccessible(managedForm.getForm())) {
+ managedForm.getMessageManager().removeMessage("validation.error", label);
+ }
+ }
+ }
+
+ public static String toHTML(final SMAManager smaMgr, String forStateName) throws OseeCoreException {
+ if (smaMgr.getReviewManager().getReviews(forStateName).size() == 0) return "";
+ StringBuffer html = new StringBuffer();
+ try {
+ html.append(AHTML.addSpace(1) + AHTML.getLabelStr(AHTML.LABEL_FONT, "\"" + forStateName + "\" State Reviews"));
+ html.append(AHTML.startBorderTable(100, Overview.normalColor, ""));
+ html.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Review Type", "Title", "ID"}));
+ for (ReviewSMArtifact art : smaMgr.getReviewManager().getReviews(forStateName)) {
+ html.append(AHTML.addRowMultiColumnTable(new String[] {art.getArtifactTypeName(), art.getDescriptiveName(),
+ art.getHumanReadableId()}));
+ }
+ html.append(AHTML.endBorderTable());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Review Exception - " + ex.getLocalizedMessage();
+ }
+ return html.toString();
+ }
+
+ public String toHTML() throws OseeCoreException {
+ return SMAReviewInfoComposite.toHTML(smaMgr, forStateName);
+ }
+
+ private void createReviewHyperlink(Composite comp, IManagedForm managedForm, XFormToolkit toolkit, final int horizontalSpan, final ReviewSMArtifact revArt, String forStateName) throws OseeCoreException {
+
+ Composite workComp = toolkit.createContainer(comp, 1);
+ workComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
+ workComp.setLayout(ALayout.getZeroMarginLayout(3, false));
+
+ Label strLabel = new Label(workComp, SWT.NONE);
+ labelWidgets.add(strLabel);
+ if (revArt.isBlocking() && !revArt.getSmaMgr().isCancelledOrCompleted()) {
+ strLabel.setText("State Blocking [" + revArt.getArtifactTypeName() + "] must be completed: ");
+ IMessageManager messageManager = managedForm.getMessageManager();
+ if (messageManager != null) {
+ messageManager.addMessage(
+ "validation.error",
+ "\"" + forStateName + "\" State has a blocking [" + revArt.getArtifactTypeName() + "] that must be completed.",
+ null, IMessageProvider.ERROR, strLabel);
+ }
+ } else if (!revArt.getSmaMgr().isCancelledOrCompleted()) {
+ strLabel.setText("Open [" + revArt.getArtifactTypeName() + "] exists: ");
+ IMessageManager messageManager = managedForm.getMessageManager();
+ if (messageManager != null) {
+ messageManager.addMessage("validation.error",
+ "\"" + forStateName + "\" State has an open [" + revArt.getArtifactTypeName() + "].", null,
+ IMessageProvider.WARNING, strLabel);
+ }
+ } else {
+ strLabel.setText(revArt.getSmaMgr().getStateMgr().getCurrentStateName() + " [" + revArt.getArtifactTypeName() + "] exists: ");
+ }
+
+ String str = "[" + revArt.getDescriptiveName() + "]";
+ Hyperlink hyperLabel =
+ toolkit.createHyperlink(workComp, ((str.length() > 300) ? Strings.truncate(str, 300) + "..." : str),
+ SWT.NONE);
+ hyperLabel.setToolTipText("Select to open review");
+ hyperLabel.addListener(SWT.MouseUp, new Listener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ SMAEditor.editArtifact(revArt);
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAStateMetricsHeader.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAStateMetricsHeader.java
new file mode 100644
index 00000000000..0efc313d189
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAStateMetricsHeader.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.ats.editor;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.service.StateEstimatedHoursStat;
+import org.eclipse.osee.ats.editor.service.StateHoursSpentStat;
+import org.eclipse.osee.ats.editor.service.StatePercentCompleteStat;
+import org.eclipse.osee.ats.editor.stateItem.AtsDebugWorkPage;
+import org.eclipse.osee.ats.editor.stateItem.AtsLogWorkPage;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAStateMetricsHeader extends Composite implements IFrameworkTransactionEventListener {
+
+ private final SMAManager smaMgr;
+ private StateEstimatedHoursStat estHoursStat;
+ private StatePercentCompleteStat percentComp;
+ private StateHoursSpentStat hoursSpent;
+
+ public SMAStateMetricsHeader(Composite parent, XFormToolkit toolkit, final SMAManager smaMgr, final AtsWorkPage page) throws OseeCoreException {
+ super(parent, SWT.NONE);
+ this.smaMgr = smaMgr;
+ setLayout(ALayout.getZeroMarginLayout(3, false));
+ setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ try {
+
+ if (page.isCurrentNonCompleteCancelledState(smaMgr)) {
+ percentComp = new StatePercentCompleteStat(smaMgr);
+ percentComp.createSidebarService(this, page, toolkit, this);
+ }
+ if (!page.getId().equals(AtsLogWorkPage.PAGE_ID) && !page.getId().equals(AtsDebugWorkPage.PAGE_ID) && !page.isCompleteCancelledState()) {
+ estHoursStat = new StateEstimatedHoursStat(smaMgr);
+ estHoursStat.createSidebarService(this, page, toolkit, this);
+ }
+ if (!page.getId().equals(AtsLogWorkPage.PAGE_ID) && !page.getId().equals(AtsDebugWorkPage.PAGE_ID) && !page.isCompleteCancelledState()) {
+ hoursSpent = new StateHoursSpentStat(smaMgr);
+ hoursSpent.createSidebarService(this, page, toolkit, this);
+ }
+
+ SMAEditor.setLabelFonts(this, SMAEditor.getBoldLabelFont());
+ refresh();
+
+ OseeEventManager.addListener(this);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void refresh() throws OseeCoreException {
+ if (isDisposed()) return;
+ if (percentComp != null) percentComp.refresh();
+ if (estHoursStat != null) estHoursStat.refresh();
+ if (hoursSpent != null) hoursSpent.refresh();
+ smaMgr.getEditor().onDirtied();
+ layout();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (smaMgr.isInTransition()) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ refresh();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Widget#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATargetVersionInfoComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATargetVersionInfoComposite.java
new file mode 100644
index 00000000000..b8a9f0fbea8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATargetVersionInfoComposite.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.editor;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.editor.service.ReadOnlyHyperlinkListener;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessageManager;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMATargetVersionInfoComposite extends Composite {
+
+ private final SMAManager smaMgr;
+ private Hyperlink link;
+ private Label label;
+ private final IManagedForm managedForm;
+
+ public SMATargetVersionInfoComposite(final SMAManager smaMgr, Composite parent, IManagedForm managedForm, XFormToolkit toolkit) throws OseeCoreException {
+ super(parent, SWT.NONE);
+ this.smaMgr = smaMgr;
+ this.managedForm = managedForm;
+ setLayout(ALayout.getZeroMarginLayout(2, false));
+ setLayoutData(new GridData());
+
+ label = toolkit.createLabel(this, "Target Version: ", SWT.NONE);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+
+ if (!smaMgr.isReleased()) {
+ link = toolkit.createHyperlink(this, "", SWT.NONE);
+ if (smaMgr.getSma().isReadOnly())
+ link.addHyperlinkListener(new ReadOnlyHyperlinkListener(smaMgr));
+ else
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ if (smaMgr.promptChangeVersion(
+ AtsPlugin.isAtsAdmin() ? VersionReleaseType.Both : VersionReleaseType.UnReleased, false)) {
+ refresh();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ } else {
+ label = toolkit.createLabel(this, "", SWT.NONE);
+ }
+ refresh();
+ }
+
+ public void clearFormMessages() {
+ if (Widgets.isAccessible(managedForm.getForm())) {
+ managedForm.getMessageManager().removeMessage("validation.error", label);
+ }
+ }
+
+ public void refresh() throws OseeCoreException {
+ String str = "";
+ // Don't transition without targeted version if so configured
+ boolean required =
+ smaMgr.teamDefHasWorkRule(AtsWorkDefinitions.RuleWorkItemId.atsRequireTargetedVersion.name()) || smaMgr.getWorkPageDefinition().hasWorkRule(
+ AtsWorkDefinitions.RuleWorkItemId.atsRequireTargetedVersion.name());
+
+ if (smaMgr.getTargetedForVersion() != null) {
+ str = smaMgr.getTargetedForVersion() + "";
+ } else {
+ str = "<edit>";
+ if (required) {
+ IMessageManager messageManager = managedForm.getMessageManager();
+ if (messageManager != null) {
+ messageManager.addMessage("validation.error", "Workflow must be targeted for a version.", null,
+ IMessageProvider.ERROR, label != null ? label : link);
+ }
+ }
+ }
+ if (link != null && !link.isDisposed()) {
+ link.setText(str);
+ } else if (label != null && !label.isDisposed()) {
+ label.setText(str);
+ }
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return "SMATargetVersionInfoComposite for SMA \"" + smaMgr.getSma() + "\"";
+ } catch (Exception ex) {
+ return "SMATargetVersionInfoComposite " + ex.getLocalizedMessage();
+ }
+ }
+
+ public String toHTML() throws OseeCoreException {
+ return "";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskComposite.java
new file mode 100644
index 00000000000..bc5226b0efe
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskComposite.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.ats.editor;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.task.IXTaskViewer;
+import org.eclipse.osee.ats.task.TaskComposite;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMATaskComposite extends Composite {
+
+ private static String HELP_CONTEXT_ID = "atsWorkflowEditorTaskTab";
+ private final TaskComposite taskComposite;
+
+ public SMATaskComposite(IXTaskViewer iXTaskViewer, Composite parent, int style, ToolBar toolBar) throws OseeCoreException {
+ super(parent, style);
+
+ setLayout(new GridLayout(1, true));
+ setLayoutData(new GridData(GridData.FILL_BOTH));
+ taskComposite = new TaskComposite(iXTaskViewer, this, style, toolBar);
+ AtsPlugin.getInstance().setHelp(this, HELP_CONTEXT_ID);
+ taskComposite.loadTable();
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return "SMATaskComposite for SMA \"" + taskComposite.getIXTaskViewer().getParentSmaMgr().getSma() + "\"";
+ } catch (Exception ex) {
+ return "SMATaskComposite " + ex.getLocalizedMessage();
+ }
+ }
+
+ public void disposeTaskComposite() {
+ taskComposite.dispose();
+ }
+
+ public String getHtml() {
+ return taskComposite.toHTML(AHTML.LABEL_FONT);
+ }
+
+ /**
+ * @return the xTask
+ */
+ public TaskComposite getTaskComposite() {
+ return taskComposite;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskInfoComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskInfoComposite.java
new file mode 100644
index 00000000000..2d6c5e3ba81
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMATaskInfoComposite.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.ats.editor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMATaskInfoComposite extends Composite {
+
+ private final SMAManager smaMgr;
+ private final Label valueLabel;
+ private final Label label;
+ private final ArrayList<Label> labelWidgets = new ArrayList<Label>();
+ private final IManagedForm managedForm;
+
+ public SMATaskInfoComposite(final SMAManager smaMgr, Composite parent, IManagedForm managedForm, final String forStateName) throws OseeCoreException {
+ super(parent, SWT.NONE);
+ this.smaMgr = smaMgr;
+ this.managedForm = managedForm;
+ setLayout(new GridLayout(2, false));
+ setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Collection<TaskArtifact> taskArts = smaMgr.getTaskMgr().getTaskArtifacts(forStateName);
+
+ label = new Label(this, SWT.NONE);
+ labelWidgets.add(label);
+ label.setText("\"" + forStateName + "\" State Tasks: ");
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ label.setToolTipText("Tasks must be completed before transtion. Select \"Task\" tab to view tasks");
+ // If ATS Admin, allow right-click to auto-complete tasks
+ if (AtsPlugin.isAtsAdmin() && !AtsPlugin.isProductionDb()) {
+ label.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Auto Complete Tasks",
+ "ATS Admin\n\nAuto Complete Tasks?")) {
+ return;
+ }
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (TaskArtifact taskArt : smaMgr.getTaskMgr().getTaskArtifacts(forStateName)) {
+ if (!taskArt.getSmaMgr().isCancelledOrCompleted()) {
+ if (taskArt.getSmaMgr().getStateMgr().isUnAssigned()) {
+ taskArt.getSmaMgr().getStateMgr().setAssignee(UserManager.getUser());
+ }
+ Result result =
+ taskArt.getSmaMgr().transitionToCompleted("", transaction,
+ TransitionOption.OverrideTransitionValidityCheck, TransitionOption.Persist);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ }
+ transaction.execute();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ }
+ valueLabel = new Label(this, SWT.NONE);
+ if (taskArts.size() > 0) {
+ valueLabel.setText(smaMgr.getTaskMgr().getStatus(forStateName));
+ } else {
+ valueLabel.setText("No Tasks Created");
+ }
+ if (smaMgr.getTaskMgr().areTasksComplete(forStateName).isFalse()) {
+ IMessageManager messageManager = managedForm.getMessageManager();
+ if (messageManager != null) {
+ messageManager.addMessage("validation.error", "State \"" + forStateName + "\" has uncompleted Tasks", null,
+ IMessageProvider.ERROR, label);
+ }
+ }
+ }
+
+ public void clearFormMessages() {
+ for (Label label : labelWidgets) {
+ if (Widgets.isAccessible(managedForm.getForm())) {
+ managedForm.getMessageManager().removeMessage("validation.error", label);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return "SMATaskInfoComposite for SMA \"" + smaMgr.getSma() + "\"";
+ } catch (Exception ex) {
+ return "SMATaskInfoComposite " + ex.getLocalizedMessage();
+ }
+ }
+
+ public void disposeTaskInfoComposite() {
+ }
+
+ public String toHTML() throws OseeCoreException {
+ return "";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowDebugSection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowDebugSection.java
new file mode 100644
index 00000000000..cfceb091646
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowDebugSection.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.ats.editor;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.stateItem.AtsDebugWorkPage;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts.OpenView;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAWorkFlowDebugSection extends SMAWorkFlowSection {
+
+ private Composite workComp;
+ private XFormToolkit toolkit;
+
+ /**
+ * @param parent
+ * @param toolkit
+ * @param style
+ * @param page
+ * @param smaMgr
+ * @throws Exception
+ */
+ public SMAWorkFlowDebugSection(Composite parent, XFormToolkit toolkit, int style, SMAManager smaMgr) throws OseeCoreException {
+ super(parent, toolkit, style, new AtsDebugWorkPage(), smaMgr);
+ }
+
+ @Override
+ protected Composite createWorkArea(Composite comp, AtsWorkPage page, XFormToolkit toolkit) throws OseeCoreException {
+ this.toolkit = toolkit;
+ workComp = super.createWorkArea(comp, page, toolkit);
+ toolkit.createLabel(workComp, "ATS Debug Section");
+
+ Hyperlink link = toolkit.createHyperlink(workComp, "Dirty Report", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ Result result = smaMgr.getEditor().isDirtyResult();
+ AWorkbench.popup("Success", Strings.isValid(result.getText()) ? result.getText() : "Success");
+ }
+
+ });
+ link = toolkit.createHyperlink(workComp, "Refresh Dirty", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ smaMgr.getEditor().onDirtied();
+ }
+
+ });
+ link = toolkit.createHyperlink(workComp, "Open VUE Workflow", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ String hrid = smaMgr.getWorkFlowDefinition().getId().replaceFirst("^.* - ", "");
+ if (hrid.length() != 5)
+ AWorkbench.popup("Open Workflow",
+ "Workflow is NOT an artifact\n\n" + smaMgr.getWorkFlowDefinition().getId());
+ else
+ AtsLib.open(hrid, OpenView.ArtifactEditor);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ link = toolkit.createHyperlink(workComp, "Open Team Definition", SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ if (!(smaMgr.getSma() instanceof TeamWorkFlowArtifact)) {
+ AWorkbench.popup("Open Workflow", "Workflow is NOT TeamWorkflowArtifact");
+ } else {
+ try {
+ AtsLib.open(((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition().getGuid(),
+ OpenView.ArtifactEditor);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+
+ // Display team definition
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact) {
+ TeamDefinitionArtifact teamDef = ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition();
+ addDebug("Team Definition: " + teamDef);
+ for (WorkRuleDefinition workItemDefinition : teamDef.getWorkRules()) {
+ addDebug(" " + workItemDefinition.toString());
+ }
+ }
+
+ // Display workflows
+ addDebug("WorkflowId: " + smaMgr.getWorkFlowDefinition().getId());
+ if (smaMgr.getWorkFlowDefinition().getParentId() != null && !smaMgr.getWorkFlowDefinition().getParentId().equals(
+ "")) addDebug("Inherit Workflow from Parent Id: " + smaMgr.getWorkFlowDefinition().getParentId());
+ for (WorkRuleDefinition workItemDefinition : smaMgr.getWorkFlowDefinition().getWorkRules()) {
+ addDebug(" " + workItemDefinition.toString());
+ }
+
+ // Display pages
+ for (WorkPageDefinition atsPage : smaMgr.getWorkFlowDefinition().getPagesOrdered()) {
+ addDebug(atsPage.toString());
+ for (WorkItemDefinition wid : atsPage.getWorkItems(true)) {
+ addDebug(" " + wid.toString());
+ }
+ }
+
+ return workComp;
+ }
+
+ public void addDebug(String str) {
+ toolkit.createText(workComp, str, SWT.MULTI | SWT.WRAP);
+ workComp.layout();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.SMAWorkFlowSection#isShowReviewInfo()
+ */
+ @Override
+ protected boolean isShowReviewInfo() throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.SMAWorkFlowSection#isShowTaskInfo()
+ */
+ @Override
+ protected boolean isShowTaskInfo() throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.SMAWorkFlowSection#isShowTargetedVersion()
+ */
+ @Override
+ protected boolean isShowTargetedVersion() throws OseeCoreException {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowSection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowSection.java
new file mode 100644
index 00000000000..dbf16305836
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowSection.java
@@ -0,0 +1,878 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.editor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.editor.service.ServicesArea;
+import org.eclipse.osee.ats.task.TaskComposite;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.widgets.dialog.SMAStatusDialog;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserCheckTreeDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinitionLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinitionViewSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+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.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAWorkFlowSection extends SectionPart {
+
+ private XComboViewer transitionToStateCombo;
+ private Button transitionButton;
+ private static String ASSIGNEES = "Assignee(s):";
+ private Label currentAssigneesLabel;
+ private Label transitionAssigneesLabel;
+ protected final SMAManager smaMgr;
+ private final AtsWorkPage atsWorkPage;
+ private final boolean isEditable, isCurrentState, isGlobalEditable;
+ private ServicesArea servicesArea;
+ private final XFormToolkit toolkit;
+ private TaskComposite xTask;
+ public static String TRANSITION_TO_STATE_COMBO = "Transition To State Combo";
+ private Composite mainComp;
+ private DynamicXWidgetLayout dynamicXWidgetLayout;
+ private SMAReviewInfoComposite reviewInfoComposite;
+ private SMATaskInfoComposite taskInfoComposite;
+ private SMATargetVersionInfoComposite targetVersionInfoComposite;
+
+ public SMAWorkFlowSection(Composite parent, XFormToolkit toolkit, int style, AtsWorkPage page, SMAManager smaMgr) throws OseeCoreException {
+ super(parent, toolkit, style | Section.TWISTIE | Section.TITLE_BAR);
+ this.toolkit = toolkit;
+ this.atsWorkPage = page;
+ this.smaMgr = smaMgr;
+ isEditable = isEditable(page);
+ isGlobalEditable =
+ !smaMgr.getSma().isReadOnly() && smaMgr.isAccessControlWrite() && smaMgr.getEditor().isPriviledgedEditModeEnabled();
+ isCurrentState = smaMgr.isCurrentState(page.getName());
+ // parent.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_CYAN));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(final IManagedForm form) {
+ super.initialize(form);
+
+ Section section = getSection();
+ try {
+ section.setText(getCurrentStateTitle());
+ if (smaMgr.isCurrentState(atsWorkPage.getName())) {
+ section.setTitleBarForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN));
+ }
+ section.setBackground(AtsPlugin.ACTIVE_COLOR);
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ // section.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_MAGENTA));
+
+ mainComp = toolkit.createClientContainer(section, 2);
+ mainComp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));
+ // mainComp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
+ mainComp.layout();
+
+ SMAWorkFlowTab.createStateNotesHeader(mainComp, toolkit, smaMgr, 2, atsWorkPage.getName());
+
+ Composite rightComp = toolkit.createContainer(mainComp, 1);
+ rightComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ // rightComp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
+
+ Composite workComp = createWorkArea(mainComp, atsWorkPage, toolkit);
+
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING);
+ gridData.widthHint = 400;
+ workComp.setLayoutData(gridData);
+
+ servicesArea = new ServicesArea(smaMgr);
+ servicesArea.createSidebarServices(rightComp, atsWorkPage, toolkit, this);
+
+ section.layout();
+ section.setExpanded(smaMgr.isCurrentSectionExpanded(atsWorkPage.getName()));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ protected Composite createWorkArea(Composite comp, AtsWorkPage atsWorkPage, XFormToolkit toolkit) throws OseeCoreException {
+
+ Composite workComp = toolkit.createContainer(comp, 1);
+ workComp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));
+ // workComp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));
+
+ createCurrentPageHeader(workComp, atsWorkPage, toolkit);
+
+ if (!atsWorkPage.isCompleteCancelledState()) {
+ new SMAStateMetricsHeader(workComp, toolkit, smaMgr, atsWorkPage);
+ }
+
+ // Add static layoutDatas to atsWorkPage
+ List<DynamicXWidgetLayoutData> staticDatas = new ArrayList<DynamicXWidgetLayoutData>();
+ for (WorkItemDefinition workItemDefinition : atsWorkPage.getWorkPageDefinition().getWorkItems(true)) {
+ if (workItemDefinition instanceof WorkWidgetDefinition) {
+ DynamicXWidgetLayoutData data = ((WorkWidgetDefinition) workItemDefinition).get();
+ data.setDynamicXWidgetLayout(atsWorkPage.getDynamicXWidgetLayout());
+ staticDatas.add(data);
+ }
+ }
+ atsWorkPage.addLayoutDatas(staticDatas);
+
+ // Add dynamic WorkItemDefinitions to atsWorkPage
+ List<DynamicXWidgetLayoutData> dynamicDatas = new ArrayList<DynamicXWidgetLayoutData>();
+ for (WorkItemDefinition workItemDefinition : WorkItemDefinitionFactory.getDynamicWorkItemDefintions(
+ smaMgr.getWorkFlowDefinition(), atsWorkPage.getWorkPageDefinition(), smaMgr)) {
+ if (workItemDefinition instanceof WorkWidgetDefinition) {
+ DynamicXWidgetLayoutData data = ((WorkWidgetDefinition) workItemDefinition).get();
+ data.setDynamicXWidgetLayout(atsWorkPage.getDynamicXWidgetLayout());
+ dynamicDatas.add(data);
+ }
+ }
+ atsWorkPage.addLayoutDatas(dynamicDatas);
+
+ atsWorkPage.setSmaMgr(smaMgr);
+
+ dynamicXWidgetLayout =
+ atsWorkPage.createBody(getManagedForm(), workComp, smaMgr.getSma(), xModListener,
+ isEditable || isGlobalEditable);
+
+ for (XWidget xWidget : dynamicXWidgetLayout.getXWidgets()) {
+ if (xWidget.getLabelWidget() != null) {
+ SMAEditor.setLabelFonts(xWidget.getLabelWidget(), SMAEditor.getBoldLabelFont());
+ }
+ }
+
+ if (isShowTaskInfo()) {
+ new SMATaskInfoComposite(smaMgr, workComp, getManagedForm(), atsWorkPage.getName());
+ }
+ if (isShowReviewInfo()) {
+ reviewInfoComposite =
+ new SMAReviewInfoComposite(smaMgr, workComp, getManagedForm(), toolkit, atsWorkPage.getName());
+ }
+
+ // Check extension points for page creation
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(atsWorkPage.getId())) {
+ Result result = item.pageCreated(toolkit, atsWorkPage, smaMgr, xModListener, isEditable || isGlobalEditable);
+ if (result.isFalse()) {
+ result.popup();
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error in page creation => " + result.getText());
+ }
+ }
+
+ createCurrentPageTransitionLine(workComp, atsWorkPage, toolkit);
+
+ return workComp;
+ }
+
+ protected boolean isShowTaskInfo() throws OseeCoreException {
+ return smaMgr.isTaskable();
+ }
+
+ protected boolean isShowTargetedVersion() throws OseeCoreException {
+ return smaMgr.isTargetedVersionable();
+ }
+
+ protected boolean isShowReviewInfo() throws OseeCoreException {
+ return smaMgr.getSma() instanceof TeamWorkFlowArtifact;
+ }
+
+ public Result isXWidgetSavable() throws OseeCoreException {
+ if (dynamicXWidgetLayout == null) return Result.TrueResult;
+ for (XWidget widget : dynamicXWidgetLayout.getXWidgets()) {
+ if (widget instanceof IArtifactWidget) {
+ IStatus status = widget.isValid();
+ if (!status.isOK()) {
+ return new Result(false, status.getMessage());
+ }
+ }
+ }
+ return Result.TrueResult;
+ }
+
+ @Override
+ public String toString() {
+ return atsWorkPage + " for " + getSmaMgr().getSma();
+ }
+
+ public Result isXWidgetDirty() throws OseeCoreException {
+ if (dynamicXWidgetLayout == null) return Result.FalseResult;
+ for (XWidget widget : dynamicXWidgetLayout.getXWidgets()) {
+ if (widget instanceof IArtifactWidget) {
+ Result result = ((IArtifactWidget) widget).isDirty();
+ if (result.isTrue()) return result;
+ }
+ }
+ return Result.FalseResult;
+ }
+
+ public void saveXWidgetToArtifact() throws OseeCoreException {
+ for (XWidget widget : dynamicXWidgetLayout.getXWidgets()) {
+ if (widget instanceof IArtifactWidget) ((IArtifactWidget) widget).saveToArtifact();
+ }
+ }
+
+ private String getCurrentStateTitle() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer(atsWorkPage.getName());
+ if (isEditable && (!smaMgr.isCompleted() && !smaMgr.isCancelled())) {
+ sb.append(" - Current State");
+ }
+ if (smaMgr.isCancelled()) {
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ if (item == null) {
+ throw new OseeStateException(
+ "ats.Log: Cancelled state has no logItem for " + smaMgr.getSma().getHumanReadableId());
+ }
+ if (item.getState().equals(atsWorkPage.getName())) {
+ sb.append(" - Cancelled");
+ if (!item.getMsg().equals("")) sb.append(" - Reason: " + item.getMsg());
+ }
+ }
+ if (isCurrentState) {
+ if (smaMgr.isCompleted()) {
+ sb.append(" - ");
+ sb.append(smaMgr.getSma().getWorldViewCompletedDateStr());
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateEntered, atsWorkPage.getName());
+ sb.append(" by " + item.getUser().getName());
+ } else if (smaMgr.isCancelled()) {
+ sb.append(" - ");
+ sb.append(smaMgr.getSma().getWorldViewCancelledDateStr());
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateEntered, atsWorkPage.getName());
+ sb.append(" by " + item.getUser().getName());
+ }
+ if (smaMgr.getStateMgr().getAssignees().size() > 0) {
+ sb.append(" assigned to ");
+ sb.append(smaMgr.getStateMgr().getAssigneesStr(80));
+ }
+ } else {
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateComplete, atsWorkPage.getName());
+ if (item != null) {
+ sb.append(" - State Completed " + item.getDate(XDate.MMDDYYHHMM));
+ sb.append(" by " + item.getUser().getName());
+ }
+ }
+ return sb.toString();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ atsWorkPage.dispose();
+ if (reviewInfoComposite != null) reviewInfoComposite.clearFormMessages();
+ if (taskInfoComposite != null) taskInfoComposite.clearFormMessages();
+ if (targetVersionInfoComposite != null) targetVersionInfoComposite.clearFormMessages();
+ servicesArea.dispose();
+ }
+
+ final SMAWorkFlowSection fSection = this;
+ final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget xWidget) {
+ if (smaMgr.getSma().isDeleted()) return;
+ // Notify extensions of widget modified
+ try {
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(atsWorkPage.getId())) {
+ try {
+ item.widgetModified(fSection, xWidget);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ updateTransitionToState();
+ updateTransitionToAssignees();
+ smaMgr.getEditor().onDirtied();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ };
+
+ @Override
+ public void refresh() {
+ super.refresh();
+ try {
+ if (currentAssigneesLabel != null && !currentAssigneesLabel.isDisposed()) {
+ currentAssigneesLabel.setText(Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees()));
+ currentAssigneesLabel.getParent().layout();
+ }
+ if (transitionAssigneesLabel != null && !transitionAssigneesLabel.isDisposed()) {
+ WorkPageDefinition toWorkPage = (WorkPageDefinition) transitionToStateCombo.getSelected();
+ if (toWorkPage == null)
+ transitionAssigneesLabel.setText("");
+ else
+ transitionAssigneesLabel.setText(smaMgr.getTransitionAssigneesStr());
+ transitionAssigneesLabel.getParent().layout();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex.toString(), ex);
+ }
+ refreshStateServices();
+ }
+
+ private void createCurrentPageHeader(Composite parent, AtsWorkPage page, XFormToolkit toolkit) throws OseeCoreException {
+ Composite comp = toolkit.createContainer(parent, 6);
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // Create Privileged Edit label
+ if (smaMgr.getEditor().isPriviledgedEditModeEnabled()) {
+ Label label = toolkit.createLabel(comp, "Priviledged Edit");
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ label.setToolTipText("Priviledged Edit Mode is Enabled. Editing any field in any state is authorized. Select icon to disable");
+ }
+
+ // Targeted Version composite
+ if (isShowTargetedVersion()) {
+ targetVersionInfoComposite = new SMATargetVersionInfoComposite(smaMgr, comp, getManagedForm(), toolkit);
+ }
+
+ if (!smaMgr.isCancelled() && !smaMgr.isCompleted()) {
+ // Assignee(s) label
+ Label label = toolkit.createLabel(comp, ASSIGNEES);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+
+ // Assignees "edit" hyperlink
+ Hyperlink setAssigneesHyperlinkLabel = toolkit.createHyperlink(comp, "<edit>", SWT.NONE);
+ setAssigneesHyperlinkLabel.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ handleChangeCurrentAssignees();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ });
+
+ currentAssigneesLabel = toolkit.createLabel(comp, smaMgr.getStateMgr().getAssigneesStr(80));
+ currentAssigneesLabel.setToolTipText(smaMgr.getStateMgr().getAssigneesStr());
+ currentAssigneesLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ if (smaMgr.getStateMgr().getAssignees().size() == 0) {
+ Label errorLabel = toolkit.createLabel(comp, "Error: State has no assignees");
+ errorLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ }
+ } else if (smaMgr.getStateMgr().getAssignees().size() > 0) {
+ Label errorLabel =
+ toolkit.createLabel(comp,
+ "Error: Non-current/Cancelled/Completed state still assigned to " + Artifacts.toString("; ",
+ smaMgr.getStateMgr().getAssignees()));
+ errorLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ }
+
+ }
+
+ private void handleChangeCurrentAssignees() throws OseeCoreException {
+ if (!isEditable && !smaMgr.getStateMgr().getAssignees().contains(UserManager.getUser(SystemUser.UnAssigned))
+ && !smaMgr.getStateMgr().getAssignees().contains(UserManager.getUser())) {
+ AWorkbench.popup(
+ "ERROR",
+ "You must be assigned to modify assignees.\nContact current Assignee or Select Priviledged Edit for Authorized Overriders.");
+ return;
+ }
+ if (smaMgr.promptChangeAssignees(false)) {
+ refresh();
+ smaMgr.getEditor().onDirtied();
+ }
+ }
+
+ private void handleChangeTransitionAssignees() throws OseeCoreException {
+ WorkPageDefinition toWorkPage = (WorkPageDefinition) transitionToStateCombo.getSelected();
+ if (toWorkPage == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "No Transition State Selected");
+ return;
+ }
+ if (toWorkPage.isCancelledPage() || toWorkPage.isCompletePage()) {
+ AWorkbench.popup("ERROR", "No Assignees in Completed and Cancelled states");
+ return;
+ }
+ UserCheckTreeDialog uld = new UserCheckTreeDialog(Display.getCurrent().getActiveShell());
+ uld.setMessage("Select users to transition to.");
+ uld.setInitialSelections(smaMgr.getTransitionAssignees());
+ if (uld.open() != 0) return;
+ Collection<User> users = uld.getUsersSelected();
+ if (users.size() == 0) {
+ AWorkbench.popup("ERROR", "Must have at least one assignee");
+ return;
+ }
+ smaMgr.setTransitionAssignees(users);
+ refresh();
+ smaMgr.getEditor().onDirtied();
+ }
+
+ private void createCurrentPageTransitionLine(Composite parent, AtsWorkPage atsWorkPage, XFormToolkit toolkit) throws OseeCoreException {
+ Composite comp = toolkit.createContainer(parent, 5);
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ transitionButton = toolkit.createButton(comp, "Transition", SWT.PUSH);
+ transitionButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleTransition();
+ }
+ });
+
+ toolkit.createLabel(comp, "to");
+
+ transitionToStateCombo = new XComboViewer(TRANSITION_TO_STATE_COMBO);
+ transitionToStateCombo.setDisplayLabel(false);
+ ArrayList<Object> allPages = new ArrayList<Object>();
+ for (WorkPageDefinition nextPage : smaMgr.getToWorkPages()) {
+ allPages.add(nextPage);
+ }
+ transitionToStateCombo.setInput(allPages);
+ transitionToStateCombo.setLabelProvider(new WorkPageDefinitionLabelProvider());
+ transitionToStateCombo.setContentProvider(new ArrayContentProvider());
+ transitionToStateCombo.setSorter(new WorkPageDefinitionViewSorter());
+
+ transitionToStateCombo.createWidgets(comp, 1);
+
+ // Set default page from workflow default
+ ArrayList<Object> defaultPage = new ArrayList<Object>();
+ if (atsWorkPage.getDefaultToPage() != null) {
+ defaultPage.add(atsWorkPage.getDefaultToPage());
+ transitionToStateCombo.setSelected(defaultPage);
+ }
+ if (atsWorkPage.isCancelledPage()) {
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ if (item != null) {
+ defaultPage.add(smaMgr.getWorkPageDefinitionByName(item.getState()));
+ transitionToStateCombo.setSelected(defaultPage);
+ }
+ }
+ // Update transition based on state items
+ updateTransitionToState();
+
+ transitionToStateCombo.getCombo().setVisibleItemCount(20);
+ transitionToStateCombo.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ updateTransitionToAssignees();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ Hyperlink assigneesLabelLink = toolkit.createHyperlink(comp, ASSIGNEES, SWT.NONE);
+ assigneesLabelLink.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ handleChangeTransitionAssignees();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ });
+ transitionAssigneesLabel = toolkit.createLabel(comp, smaMgr.getTransitionAssigneesStr());
+ transitionAssigneesLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ }
+
+ public void updateTransitionToAssignees() throws OseeCoreException {
+ Collection<User> assignees = null;
+ // Determine if the is an override set of assigness
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(atsWorkPage.getId())) {
+ assignees = item.getOverrideTransitionToAssignees(this);
+ if (assignees != null) break;
+ }
+ // If override set and isn't the same as already selected, update
+ if (assignees != null && !smaMgr.getTransitionAssignees().equals(assignees)) {
+ smaMgr.setTransitionAssignees(assignees);
+ smaMgr.getEditor().onDirtied();
+ }
+ refresh();
+ }
+
+ public void updateTransitionToState() throws OseeCoreException {
+ // Determine if there is a transitionToStateOverride for this page
+ String transitionStateOverride = null;
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(atsWorkPage.getId())) {
+ transitionStateOverride = item.getOverrideTransitionToStateName(this);
+ if (transitionStateOverride != null) break;
+ }
+ if (transitionStateOverride != null) {
+ // Return if override state is same as selected
+ if (((WorkPageDefinition) transitionToStateCombo.getSelected()).getName().equals(transitionStateOverride)) return;
+ // Find page corresponding to override state name
+ for (WorkPageDefinition toWorkPageDefinition : smaMgr.getToWorkPages()) {
+ if (toWorkPageDefinition.getPageName().equals(transitionStateOverride)) {
+ // Reset selection
+ ArrayList<Object> defaultPage = new ArrayList<Object>();
+ defaultPage.add(toWorkPageDefinition);
+ transitionToStateCombo.setSelected(defaultPage);
+ return;
+ }
+ }
+ }
+ }
+
+ public void setTransitionToStateSelection(String stateName) throws OseeCoreException {
+ ArrayList<Object> allPages = new ArrayList<Object>();
+ for (WorkPageDefinition nextPage : smaMgr.getToWorkPages()) {
+ if (nextPage.getPageName().equals(stateName)) allPages.add(nextPage);
+ }
+ transitionToStateCombo.setSelected(allPages);
+ }
+
+ private void handleTransition() {
+
+ try {
+
+ if (!isEditable && !smaMgr.getStateMgr().getAssignees().contains(UserManager.getUser(SystemUser.UnAssigned))) {
+ AWorkbench.popup(
+ "ERROR",
+ "You must be assigned to transition this workflow.\nContact Assignee or Select Priviledged Edit for Authorized Overriders.");
+ return;
+ }
+ // As a convenience, if assignee is UnAssigned and user selects to transition, make user current assignee
+ if (smaMgr.getStateMgr().getAssignees().contains(UserManager.getUser(SystemUser.UnAssigned))) {
+ smaMgr.getStateMgr().removeAssignee(UserManager.getUser(SystemUser.UnAssigned));
+ smaMgr.getStateMgr().addAssignee(UserManager.getUser());
+ }
+ if (smaMgr.getBranchMgr().isWorkingBranchInWork()) {
+
+ if (((WorkPageDefinition) transitionToStateCombo.getSelected()).getPageName().equals(
+ DefaultTeamState.Cancelled.name())) {
+ AWorkbench.popup("Transition Blocked",
+ "Working Branch exists.\n\nPlease delete working branch before transition to cancel.");
+ return;
+ }
+ if (smaMgr.getBranchMgr().isBranchInCommit()) {
+ AWorkbench.popup("Transition Blocked",
+ "Working Branch is being Committed.\n\nPlease wait till commit completes to transition.");
+ return;
+ }
+ if (!atsWorkPage.isAllowTransitionWithWorkingBranch()) {
+ AWorkbench.popup("Transition Blocked",
+ "Working Branch exists.\n\nPlease commit or delete working branch before transition.");
+ return;
+ }
+
+ }
+
+ smaMgr.setInTransition(true);
+ smaMgr.getEditor().doSave(null);
+
+ // Get transition to state
+ WorkPageDefinition toWorkPageDefinition = (WorkPageDefinition) transitionToStateCombo.getSelected();
+
+ if (toWorkPageDefinition == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "No Transition State Selected");
+ return;
+ }
+ if (toWorkPageDefinition.getPageName().equals(DefaultTeamState.Cancelled.name())) {
+ EntryDialog cancelDialog = new EntryDialog("Cancellation Reason", "Enter cancellation reason.");
+ if (cancelDialog.open() != 0) return;
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Result result =
+ smaMgr.transitionToCancelled(cancelDialog.getEntry(), transaction, TransitionOption.Persist);
+ transaction.execute();
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ smaMgr.setInTransition(false);
+ smaMgr.getEditor().refreshPages();
+ return;
+ }
+
+ // Validate assignees
+ if (smaMgr.getStateMgr().getAssignees().contains(UserManager.getUser(SystemUser.OseeSystem)) || smaMgr.getStateMgr().getAssignees().contains(
+ UserManager.getUser(SystemUser.Guest)) || smaMgr.getStateMgr().getAssignees().contains(
+ UserManager.getUser(SystemUser.UnAssigned))) {
+ AWorkbench.popup("Transition Blocked",
+ "Can not transition with \"Guest\", \"UnAssigned\" or \"OseeSystem\" user as assignee.");
+ return;
+ }
+
+ // Get transition to assignees
+ Collection<User> toAssignees;
+ if (toWorkPageDefinition.isCancelledPage() || toWorkPageDefinition.isCompletePage())
+ toAssignees = new HashSet<User>();
+ else
+ toAssignees = smaMgr.getTransitionAssignees();
+
+ // If this is a return transition, don't require page/tasks to be complete
+ if (!smaMgr.isReturnPage(toWorkPageDefinition)) {
+
+ // Validate XWidgets for transition
+ Result result = atsWorkPage.isPageComplete();
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+
+ // Loop through this state's tasks to confirm complete
+ if (smaMgr.isTaskable()) {
+ for (TaskArtifact taskArt : smaMgr.getTaskMgr().getTaskArtifactsFromCurrentState()) {
+ if (taskArt.isInWork()) {
+ AWorkbench.popup(
+ "Transition Blocked",
+ "Task Not Complete\n\nTitle: " + taskArt.getDescriptiveName() + "\n\nHRID: " + taskArt.getHumanReadableId());
+ return;
+ }
+ }
+ }
+
+ // Don't transition without targeted version if so configured
+ if (smaMgr.teamDefHasWorkRule(AtsWorkDefinitions.RuleWorkItemId.atsRequireTargetedVersion.name()) || smaMgr.getWorkPageDefinition().hasWorkRule(
+ AtsWorkDefinitions.RuleWorkItemId.atsRequireTargetedVersion.name())) {
+ if (smaMgr.getSma().getWorldViewTargetedVersion() == null && !toWorkPageDefinition.isCancelledPage()) {
+ AWorkbench.popup("Transition Blocked",
+ "Actions must be targeted for a Version.\nPlease set \"Target Version\" before transition.");
+ return;
+ }
+ }
+
+ // Loop through this state's blocking reviews to confirm complete
+ for (ReviewSMArtifact reviewArt : smaMgr.getReviewManager().getReviewsFromCurrentState()) {
+ if (reviewArt.getReviewBlockType() == ReviewBlockType.Transition && !reviewArt.getSmaMgr().isCancelledOrCompleted()) {
+ AWorkbench.popup("Transition Blocked", "All Blocking Reviews must be completed before transition.");
+ return;
+ }
+ }
+
+ // Check extension points for valid transition
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(atsWorkPage.getId())) {
+ try {
+ result =
+ item.transitioning(smaMgr, smaMgr.getStateMgr().getCurrentStateName(),
+ toWorkPageDefinition.getPageName(), toAssignees);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ // Ask for metrics for this page (store in state versus task?)
+ if (!handlePopulateStateMetrics()) return;
+ }
+
+ // Persist must be done prior and separate from transition
+ smaMgr.getSma().persistAttributesAndRelations();
+
+ // Perform transition separate from persist of previous changes to state machine artifact
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Result result =
+ smaMgr.transition(toWorkPageDefinition.getPageName(), toAssignees, transaction, TransitionOption.Persist);
+ transaction.execute();
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ smaMgr.setInTransition(false);
+ smaMgr.getEditor().refreshPages();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ } finally {
+ smaMgr.setInTransition(false);
+ }
+ }
+
+ public void refreshStateServices() {
+ if (servicesArea != null) servicesArea.refresh();
+ smaMgr.getEditor().onDirtied();
+ }
+
+ /**
+ * @return Returns the isCurrentState.
+ */
+ public boolean isCurrentState() {
+ return isCurrentState;
+ }
+
+ public boolean handlePopulateStateMetrics() throws OseeCoreException {
+
+ // Page has the ability to override the autofill of the metrics
+ if (!atsWorkPage.isRequireStateHoursSpentPrompt() && smaMgr.getStateMgr().getHoursSpent() == 0) {
+ // First, try to autofill if it's only been < 5 min since creation
+ int minSinceCreation = getCreationToNowDateDeltaMinutes();
+ // System.out.println("minSinceCreation *" + minSinceCreation + "*");
+ float hoursSinceCreation = minSinceCreation / 60;
+ if (hoursSinceCreation < 0.02) hoursSinceCreation = (new Float(0.02)).floatValue();
+ // System.out.println("hoursSinceCreation *" + hoursSinceCreation + "*");
+ if (minSinceCreation < 5) {
+ smaMgr.getStateMgr().updateMetrics(hoursSinceCreation, 100, true);
+ return true;
+ }
+ }
+
+ // Otherwise, open dialog to ask for hours complete
+ String msg =
+ smaMgr.getStateMgr().getCurrentStateName() + " State\n\n" + AtsLib.doubleToStrString(smaMgr.getStateMgr().getHoursSpent()) + " hours already spent on this state.\n" + "Enter the additional number of hours you spent on this state.";
+ SMAStatusDialog tsd =
+ new SMAStatusDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Enter Hours Spent",
+ msg, false, Arrays.asList(smaMgr.getSma()));
+ int result = tsd.open();
+ if (result == 0) {
+ smaMgr.getStateMgr().updateMetrics(tsd.getHours().getFloat(), 100, true);
+ return true;
+ }
+ return false;
+ }
+
+ public int getCreationToNowDateDeltaMinutes() throws OseeCoreException {
+ Date createDate = smaMgr.getLog().getStateEvent(LogType.StateEntered, atsWorkPage.getName()).getDate();
+ long createDateLong = createDate.getTime();
+ Date date = new Date();
+ float diff = (date.getTime() - createDateLong);
+ // System.out.println("diff *" + diff + "*");
+ Float min = diff / 60000;
+ // System.out.println("min *" + min + "*");
+ return min.intValue();
+ }
+
+ /**
+ * @return Returns the xTask.
+ */
+ public TaskComposite getXTask() {
+ return xTask;
+ }
+
+ /**
+ * @return the transitionToStateCombo
+ */
+ public XComboViewer getTransitionToStateCombo() {
+ return transitionToStateCombo;
+ }
+
+ /**
+ * @return the smaMgr
+ */
+ public SMAManager getSmaMgr() {
+ return smaMgr;
+ }
+
+ /**
+ * @return the page
+ */
+ public AtsWorkPage getPage() {
+ return atsWorkPage;
+ }
+
+ /**
+ * @return the mainComp
+ */
+ public Composite getMainComp() {
+ return mainComp;
+ }
+
+ public List<XWidget> getXWidgets(Class<?> clazz) {
+ List<XWidget> widgets = new ArrayList<XWidget>();
+ for (XWidget widget : dynamicXWidgetLayout.getXWidgets()) {
+ if (clazz.isInstance(widget)) {
+ widgets.add(widget);
+ }
+ }
+ return widgets;
+ }
+
+ private boolean isEditable(AtsWorkPage page) throws OseeCoreException {
+ // must be writeable
+ return !smaMgr.getSma().isReadOnly() &&
+ // and access control writeable
+ smaMgr.isAccessControlWrite() &&
+ // and current state
+ smaMgr.isCurrentState(page.getName()) &&
+ // and one of these
+ //
+ // page is define to allow anyone to edit
+ (smaMgr.getWorkPageDefinition().hasWorkRule(AtsWorkDefinitions.RuleWorkItemId.atsAllowEditToAll.name()) ||
+ // team definition has allowed anyone to edit
+ smaMgr.teamDefHasWorkRule(AtsWorkDefinitions.RuleWorkItemId.atsAllowEditToAll.name()) ||
+ // priviledged edit mode is on
+ smaMgr.getEditor().isPriviledgedEditModeEnabled() ||
+ // current user is assigned
+ smaMgr.isAssigneeMe() ||
+ // current user is ats admin
+ AtsPlugin.isAtsAdmin());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java
new file mode 100644
index 00000000000..f91ac9632f0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java
@@ -0,0 +1,547 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.editor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.NoteItem;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.service.ServicesArea;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.artifact.annotation.AnnotationComposite;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.parts.MessageSummaryNote;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.HtmlDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessage;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAWorkFlowTab extends FormPage implements IActionable {
+ private final SMAManager smaMgr;
+ private final ArrayList<SMAWorkFlowSection> sections = new ArrayList<SMAWorkFlowSection>();
+ private final XFormToolkit toolkit;
+ private static String ORIGINATOR = "Originator:";
+ private Label origLabel;
+ private final List<AtsWorkPage> pages = new ArrayList<AtsWorkPage>();
+ private AtsWorkPage currentAtsWorkPage;
+ private ScrolledForm scrolledForm;
+ private final Integer HEADER_COMP_COLUMNS = 4;
+ private static Map<String, Integer> guidToScrollLocation = new HashMap<String, Integer>();
+ private SMARelationsHyperlinkComposite smaRelationsComposite;
+ private IManagedForm managedForm;
+ private Composite body;
+ private Composite atsBody;
+ private SMAActionableItemHeader actionableItemHeader;
+ private SMAWorkflowMetricsHeader workflowMetricsHeader;
+
+ public SMAWorkFlowTab(SMAManager smaMgr) {
+ super(smaMgr.getEditor(), "overview", "Workflow");
+ this.smaMgr = smaMgr;
+ toolkit = smaMgr.getEditor().getToolkit();
+ }
+
+ private void createBody(Composite body) throws OseeCoreException {
+ atsBody = toolkit.createComposite(body);
+ atsBody.setLayoutData(new GridData(GridData.FILL_BOTH));
+ atsBody.setLayout(new GridLayout(1, false));
+
+ Composite headerComp = toolkit.createComposite(atsBody);
+ headerComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ headerComp.setLayout(ALayout.getZeroMarginLayout(1, false));
+ // mainComp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+ // Display relations
+ try {
+ createTopLineHeader(headerComp, toolkit);
+ createAssigneesLineHeader(headerComp, toolkit);
+ createLatestHeader(headerComp, toolkit);
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact) {
+ actionableItemHeader = new SMAActionableItemHeader(headerComp, toolkit, smaMgr);
+ }
+ workflowMetricsHeader = new SMAWorkflowMetricsHeader(headerComp, toolkit, smaMgr);
+ createSMANotesHeader(headerComp, toolkit, smaMgr, HEADER_COMP_COLUMNS);
+ createStateNotesHeader(headerComp, toolkit, smaMgr, HEADER_COMP_COLUMNS, null);
+ createAnnotationsHeader(headerComp, toolkit);
+
+ sections.clear();
+ pages.clear();
+
+ if (SMARelationsHyperlinkComposite.relationExists(smaMgr.getSma())) {
+ smaRelationsComposite = new SMARelationsHyperlinkComposite(atsBody, toolkit, SWT.NONE);
+ smaRelationsComposite.create(smaMgr);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ // Only display current or past states
+ for (WorkPageDefinition workPageDefinition : smaMgr.getSma().getWorkFlowDefinition().getPagesOrdered()) {
+ AtsWorkPage atsWorkPage =
+ new AtsWorkPage(smaMgr.getWorkFlowDefinition(), workPageDefinition, null,
+ ATSXWidgetOptionResolver.getInstance());
+ if (smaMgr.isCurrentState(atsWorkPage.getName())) currentAtsWorkPage = atsWorkPage;
+ if (smaMgr.isCurrentState(atsWorkPage.getName()) || smaMgr.getStateMgr().isStateVisited(atsWorkPage.getName())) {
+ // Don't show completed or cancelled state if not currently those state
+ if (atsWorkPage.isCompletePage() && !smaMgr.isCompleted()) continue;
+ if (atsWorkPage.isCancelledPage() && !smaMgr.isCancelled()) continue;
+ SMAWorkFlowSection section = new SMAWorkFlowSection(atsBody, toolkit, SWT.NONE, atsWorkPage, smaMgr);
+ managedForm.addPart(section);
+ control = section.getMainComp();
+ sections.add(section);
+ pages.add(atsWorkPage);
+ }
+ }
+
+ if (AtsPlugin.isAtsAdmin()) {
+ SMAWorkFlowDebugSection section = new SMAWorkFlowDebugSection(atsBody, toolkit, SWT.NONE, smaMgr);
+ managedForm.addPart(section);
+ control = section.getMainComp();
+ sections.add(section);
+ }
+
+ atsBody.setFocus();
+ // Jump to scroll location if set
+ Integer selection = guidToScrollLocation.get(smaMgr.getSma().getGuid());
+ if (selection != null) {
+ JumpScrollbarJob job = new JumpScrollbarJob("");
+ job.schedule(500);
+ }
+
+ managedForm.refresh();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+
+ this.managedForm = managedForm;
+ try {
+ scrolledForm = managedForm.getForm();
+ scrolledForm.addDisposeListener(new DisposeListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+ */
+ public void widgetDisposed(DisposeEvent e) {
+ storeScrollLocation();
+ }
+ });
+
+ scrolledForm.setText(getEditorInput().getName());
+ fillBody(managedForm);
+ addMessageDecoration(scrolledForm);
+
+ refreshToolbar();
+
+ if (smaMgr.getSma().getHelpContext() != null) AtsPlugin.getInstance().setHelp(scrolledForm,
+ smaMgr.getSma().getHelpContext());
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private void addMessageDecoration(ScrolledForm form) {
+ form.getForm().addMessageHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ String title = e.getLabel();
+ Object href = e.getHref();
+ if (href instanceof IMessage[]) {
+ Point noteLocation = ((Control) e.widget).toDisplay(0, 0);
+ noteLocation.x += 10;
+ noteLocation.y += 10;
+
+ MessageSummaryNote note = new MessageSummaryNote(getManagedForm(), title, (IMessage[]) href);
+ note.setLocation(noteLocation);
+ note.open();
+ }
+ }
+
+ });
+ }
+
+ private void refreshToolbar() throws OseeCoreException {
+ if (toolbarArea != null) {
+ toolbarArea.dispose();
+ scrolledForm.getToolBarManager().removeAll();
+ }
+ toolbarArea = new ServicesArea(smaMgr);
+ toolbarArea.createToolbarServices(currentAtsWorkPage, scrolledForm.getToolBarManager());
+
+ OseeAts.addButtonToEditorToolBar(smaMgr.getEditor(), this, AtsPlugin.getInstance(),
+ scrolledForm.getToolBarManager(), SMAEditor.EDITOR_ID, "ATS Editor");
+
+ scrolledForm.updateToolBar();
+ }
+
+ public Result isXWidgetDirty() throws OseeCoreException {
+ for (SMAWorkFlowSection section : sections) {
+ Result result = section.isXWidgetDirty();
+ if (result.isTrue()) return result;
+ }
+ return Result.FalseResult;
+ }
+
+ public Result isXWidgetSavable() throws OseeCoreException {
+ for (SMAWorkFlowSection section : sections) {
+ Result result = section.isXWidgetSavable();
+ if (result.isFalse()) return result;
+ }
+ return Result.TrueResult;
+ }
+
+ public void saveXWidgetToArtifact() throws OseeCoreException {
+ for (SMAWorkFlowSection section : sections) {
+ section.saveXWidgetToArtifact();
+ }
+ }
+
+ @Override
+ public void dispose() {
+ if (actionableItemHeader != null) {
+ actionableItemHeader.dispose();
+ }
+ if (workflowMetricsHeader != null) {
+ workflowMetricsHeader.dispose();
+ }
+ for (SMAWorkFlowSection section : sections)
+ section.dispose();
+ if (toolbarArea != null) {
+ toolbarArea.dispose();
+ }
+ if (toolkit != null) {
+ toolkit.dispose();
+ }
+ }
+
+ public String getActionDescription() {
+ return "Workflow Tab";
+ }
+
+ public final static String normalColor = "#FFFFFF";
+ private final static String activeColor = "#EEEEEE";
+
+ public String getHtml() throws OseeCoreException {
+ StringBuffer htmlSb = new StringBuffer();
+ for (WorkPage wPage : pages) {
+ AtsWorkPage page = (AtsWorkPage) wPage;
+ StringBuffer notesSb = new StringBuffer();
+ for (NoteItem note : smaMgr.getNotes().getNoteItems()) {
+ if (note.getState().equals(page.getName())) {
+ notesSb.append(note.toHTML() + AHTML.newline());
+ }
+ }
+ if (smaMgr.isCurrentState(page.getName()) || smaMgr.getStateMgr().isStateVisited(page.getName())) {
+ htmlSb.append(page.getHtml(smaMgr.isCurrentState(page.getName()) ? activeColor : normalColor,
+ notesSb.toString(), SMAReviewInfoComposite.toHTML(smaMgr, page.getName())));
+ htmlSb.append(AHTML.newline());
+ }
+ }
+ return htmlSb.toString();
+ }
+
+ private void fillBody(IManagedForm managedForm) throws OseeCoreException {
+ body = managedForm.getForm().getBody();
+ GridLayout gridLayout = new GridLayout(1, false);
+ body.setLayout(gridLayout);
+ body.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, true, false));
+
+ createBody(body);
+ }
+
+ private ServicesArea toolbarArea;
+
+ private Control control = null;
+
+ private void storeScrollLocation() {
+ if (scrolledForm != null) {
+ Integer selection = scrolledForm.getVerticalBar().getSelection();
+ // System.out.println("Storing selection => " + selection);
+ guidToScrollLocation.put(smaMgr.getSma().getGuid(), selection);
+ }
+ }
+
+ private class JumpScrollbarJob extends Job {
+ public JumpScrollbarJob(String name) {
+ super(name);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ Integer selection = guidToScrollLocation.get(smaMgr.getSma().getGuid());
+ // System.out.println("Restoring selection => " + selection);
+
+ // Find the ScrolledComposite operating on the control.
+ ScrolledComposite sComp = null;
+ if (control == null || control.isDisposed()) return;
+ Composite parent = control.getParent();
+ while (parent != null) {
+ if (parent instanceof ScrolledComposite) {
+ sComp = (ScrolledComposite) parent;
+ break;
+ }
+ parent = parent.getParent();
+ }
+
+ if (sComp != null) {
+ sComp.setOrigin(0, selection);
+ }
+ }
+ });
+ return Status.OK_STATUS;
+
+ }
+ }
+
+ private void createAssigneesLineHeader(Composite comp, XFormToolkit toolkit) throws OseeCoreException {
+ Composite topLineComp = new Composite(comp, SWT.NONE);
+ topLineComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ topLineComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ toolkit.adapt(topLineComp);
+ SMAEditor.createLabelValue(toolkit, topLineComp, "Assignee(s)", smaMgr.getStateMgr().getAssigneesStr(150));
+ }
+
+ private void createTopLineHeader(Composite comp, XFormToolkit toolkit) {
+ Composite topLineComp = new Composite(comp, SWT.NONE);
+ topLineComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ topLineComp.setLayout(ALayout.getZeroMarginLayout(13, false));
+ toolkit.adapt(topLineComp);
+ // mainComp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+ try {
+ SMAEditor.createLabelValue(toolkit, topLineComp, "Current State", smaMgr.getStateMgr().getCurrentStateName());
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact) {
+ SMAEditor.createLabelValue(toolkit, topLineComp, "Team",
+ ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamName());
+ }
+ SMAEditor.createLabelValue(toolkit, topLineComp, "Created", XDate.getDateStr(
+ smaMgr.getLog().getCreationDate(), XDate.MMDDYYHHMM));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ }
+
+ try {
+ createOriginatorHeader(topLineComp, toolkit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ }
+
+ try {
+ SMAEditor.createLabelValue(
+ toolkit,
+ topLineComp,
+ "Action Id",
+ smaMgr.getSma().getParentActionArtifact() == null ? "??" : smaMgr.getSma().getParentActionArtifact().getHumanReadableId());
+ SMAEditor.createLabelValue(toolkit, topLineComp, smaMgr.getSma().getArtifactSuperTypeName() + " Id",
+ smaMgr.getSma().getHumanReadableId());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ }
+
+ private void createLatestHeader(Composite comp, XFormToolkit toolkit) {
+ if (smaMgr.isHistoricalVersion()) {
+ Label label =
+ toolkit.createLabel(
+ comp,
+ "This is a historical version of this " + smaMgr.getSma().getArtifactTypeName() + " and can not be edited; Select \"Open Latest\" to view/edit latest version.");
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ }
+ }
+
+ private void createAnnotationsHeader(Composite comp, XFormToolkit toolkit) throws OseeCoreException {
+ if (smaMgr.getSma().getAnnotations().size() > 0) {
+ new AnnotationComposite(toolkit, comp, SWT.None, smaMgr.getSma());
+ }
+ }
+
+ public static void createSMANotesHeader(Composite comp, XFormToolkit toolkit, SMAManager smaMgr, int horizontalSpan) throws OseeCoreException {
+ // Display SMA Note
+ String note = smaMgr.getSma().getSoleAttributeValue(ATSAttributes.SMA_NOTE_ATTRIBUTE.getStoreName(), "");
+ if (!note.equals("")) {
+ createLabelOrHyperlink(comp, toolkit, horizontalSpan, "Note: " + note, false);
+ }
+ }
+
+ public static void createStateNotesHeader(Composite comp, XFormToolkit toolkit, SMAManager smaMgr, int horizontalSpan, String forStateName) throws MultipleAttributesExist {
+ // Display global Notes
+ for (NoteItem noteItem : smaMgr.getNotes().getNoteItems()) {
+ if (forStateName == null || noteItem.getState().equals(forStateName)) {
+ createLabelOrHyperlink(comp, toolkit, horizontalSpan, noteItem.toString(), false);
+ }
+ }
+ }
+
+ private static void createLabelOrHyperlink(Composite comp, XFormToolkit toolkit, final int horizontalSpan, final String str, boolean onlyState) {
+ if (str.length() > 150) {
+ Hyperlink label = toolkit.createHyperlink(comp, Strings.truncate(str, 150) + "...", SWT.NONE);
+ label.setToolTipText("click to view all");
+ label.addListener(SWT.MouseUp, new Listener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ new HtmlDialog("Note", null, str).open();
+ }
+ });
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = horizontalSpan;
+ label.setLayoutData(gd);
+ } else {
+ Label label = toolkit.createLabel(comp, str);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = horizontalSpan;
+ label.setLayoutData(gd);
+ }
+ }
+
+ private void createOriginatorHeader(Composite comp, XFormToolkit toolkit) throws OseeCoreException {
+ if (!smaMgr.isCancelled() && !smaMgr.isCompleted()) {
+ toolkit.createLabel(comp, " ");
+ Hyperlink link = toolkit.createHyperlink(comp, ORIGINATOR, SWT.NONE);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ if (smaMgr.promptChangeOriginator()) {
+ updateOrigLabel();
+ smaMgr.getEditor().onDirtied();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ if (smaMgr.getOriginator() == null) {
+ Label errorLabel = toolkit.createLabel(comp, "Error: No originator identified.");
+ errorLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ origLabel = toolkit.createLabel(comp, smaMgr.getOriginator().getName());
+ origLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+ } else {
+ if (smaMgr.getOriginator() == null) {
+ Label errorLabel = toolkit.createLabel(comp, "Error: No originator identified.");
+ errorLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ Label origLabel = toolkit.createLabel(comp, " " + ORIGINATOR + smaMgr.getOriginator().getName());
+ origLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+ }
+ }
+
+ public void updateOrigLabel() throws OseeCoreException {
+ origLabel.setText(smaMgr.getOriginator().getName());
+ origLabel.getParent().layout();
+ }
+
+ public void refresh() throws OseeCoreException {
+ if (smaMgr.getEditor() != null && !smaMgr.isInTransition()) {
+ // System.out.println("SMAWorkFlowTab refresh...");
+ for (SMAWorkFlowSection section : sections) {
+ section.dispose();
+ }
+ atsBody.dispose();
+ createBody(body);
+ scrolledForm.setText(getEditorInput().getName());
+ refreshToolbar();
+ }
+ }
+
+ public List<AtsWorkPage> getPages() {
+ return pages;
+ }
+
+ public List<SMAWorkFlowSection> getSections() {
+ return sections;
+ }
+
+ public SMAWorkFlowSection getSectionForCurrentState() {
+
+ return null;
+ }
+
+ public List<XWidget> getXWidgetsFromState(String stateName, Class<?> clazz) {
+ for (SMAWorkFlowSection section : sections) {
+ if (section.getPage().getName().equals(stateName)) {
+ return section.getXWidgets(clazz);
+ }
+ }
+ return Collections.emptyList();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkflowMetricsHeader.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkflowMetricsHeader.java
new file mode 100644
index 00000000000..c78489f3787
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkflowMetricsHeader.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.ats.editor;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAWorkflowMetricsHeader extends Composite implements IFrameworkTransactionEventListener {
+
+ private static final String NAME = "Workflow Metrics: ";
+ private final SMAManager smaMgr;
+ private Label percentLabel, estHoursLabel, hoursSpentLabel, remainHoursLabel;
+
+ public SMAWorkflowMetricsHeader(Composite parent, XFormToolkit toolkit, SMAManager smaMgr) throws OseeCoreException {
+ super(parent, SWT.NONE);
+ this.smaMgr = smaMgr;
+ try {
+
+ toolkit.adapt(this);
+ setLayout(ALayout.getZeroMarginLayout(8, false));
+ setLayoutData(new GridData());
+
+ Label label = toolkit.createLabel(this, "Total Percent: ", SWT.NONE);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ percentLabel = toolkit.createLabel(this, "", SWT.NONE);
+ label.setToolTipText("Calculation: sum of percent for all states (including all tasks and reviews) / # statusable states");
+ percentLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ label = toolkit.createLabel(this, "Total Estimated Hours: ", SWT.NONE);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ estHoursLabel = toolkit.createLabel(this, "", SWT.NONE);
+ label.setToolTipText("Calculation: sum estimated hours for workflow and all tasks and reviews");
+ estHoursLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ label = toolkit.createLabel(this, "Total Hours Spent: ", SWT.NONE);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ hoursSpentLabel = toolkit.createLabel(this, "", SWT.NONE);
+ hoursSpentLabel.setToolTipText("Calculation: sum of all hours spent for all tasks, reviews and in each state");
+ label.setToolTipText("Calculation: sum of all hours spent for all tasks, reviews and in each state");
+
+ label = toolkit.createLabel(this, "Remaining Hours: ", SWT.NONE);
+ SMAEditor.setLabelFonts(label, SMAEditor.getBoldLabelFont());
+ label.setToolTipText(WorldXViewerFactory.Remaining_Hours_Col.getDescription());
+ remainHoursLabel = toolkit.createLabel(this, "", SWT.NONE);
+
+ refresh();
+
+ OseeEventManager.addListener(this);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void refresh() throws OseeCoreException {
+ if (percentLabel.isDisposed()) {
+ OseeEventManager.removeListener(this);
+ return;
+ }
+ try {
+ if (percentLabel != null && !percentLabel.isDisposed()) percentLabel.setText(String.valueOf(smaMgr.getSma().getPercentCompleteSMATotal()));
+ if (estHoursLabel != null && !estHoursLabel.isDisposed()) estHoursLabel.setText(String.valueOf(AtsLib.doubleToStrString(smaMgr.getSma().getEstimatedHoursTotal())));
+ if (hoursSpentLabel != null && !hoursSpentLabel.isDisposed()) hoursSpentLabel.setText(String.valueOf(AtsLib.doubleToStrString(smaMgr.getSma().getHoursSpentSMATotal())));
+ if (hoursSpentLabel != null && !hoursSpentLabel.isDisposed()) {
+ Result result = smaMgr.getSma().isWorldViewRemainHoursValid();
+ if (result.isFalse())
+ remainHoursLabel.setText("Error" + result.getText());
+ else
+ remainHoursLabel.setText(String.valueOf(AtsLib.doubleToStrString(smaMgr.getSma().getWorldViewRemainHours())));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ percentLabel.update();
+ layout();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (smaMgr.isInTransition()) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ refresh();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Widget#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ OseeEventManager.removeListener(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/help/WorkAttrHelpResource.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/help/WorkAttrHelpResource.java
new file mode 100644
index 00000000000..51c1f76e450
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/help/WorkAttrHelpResource.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.ats.editor.help;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.help.IHelpResource;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkAttrHelpResource implements IHelpResource {
+
+ private final DynamicXWidgetLayoutData layoutData;
+
+ public WorkAttrHelpResource(DynamicXWidgetLayoutData layoutData) {
+ this.layoutData = layoutData;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.help.IHelpResource#getHref()
+ */
+ public String getHref() {
+ if (layoutData != null) {
+ File file = AtsPlugin.getInstance().getPluginStoreFile(layoutData.getStorageName() + ".html");
+ String absFile = "file:\\/\\/" + file.getAbsolutePath();
+ StringBuffer sb = new StringBuffer();
+ sb.append(AHTML.heading(1, layoutData.getName()));
+ if (layoutData.getToolTip() != null)
+ sb.append(AHTML.para(layoutData.getToolTip()));
+ else
+ sb.append(AHTML.para("Enter the " + layoutData.getName()));
+ String html = AHTML.simplePage(sb.toString());
+
+ try {
+ Lib.writeStringToFile(html, file);
+ } catch (IOException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return absFile;
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.help.IHelpResource#getLabel()
+ */
+ public String getLabel() {
+ if (layoutData != null) return layoutData.getName();
+ return "";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/AddNoteOperation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/AddNoteOperation.java
new file mode 100644
index 00000000000..72aa1f48a07
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/AddNoteOperation.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.ats.editor.service;
+
+import java.util.ArrayList;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.wizard.NewNoteWizard;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.NoteType;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AddNoteOperation extends WorkPageService {
+
+ Action action;
+
+ public AddNoteOperation(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ performAddNote();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.NEW_NOTE));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Add Note";
+ }
+
+ private void performAddNote() {
+ try {
+ ArrayList<String> artifactNames = new ArrayList<String>();
+ artifactNames.add(smaMgr.getSma().getDescriptiveName() + " - " + smaMgr.getSma().getDescriptiveName());
+ for (WorkPageDefinition workPageDefinition : smaMgr.getWorkFlowDefinition().getPagesOrdered())
+ if (!workPageDefinition.getPageName().equals(DefaultTeamState.Cancelled.name()) && !workPageDefinition.getPageName().equals(
+ DefaultTeamState.Completed.name())) artifactNames.add(workPageDefinition.getPageName());
+ NewNoteWizard noteWizard = new NewNoteWizard(artifactNames);
+ WizardDialog dialog =
+ new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), noteWizard);
+ dialog.create();
+ if (dialog.open() == 0) {
+ String selected = noteWizard.mainPage.artifactList.getSelected().iterator().next().getName();
+ String state = "";
+ if (!selected.startsWith(smaMgr.getSma().getDescriptiveName() + " - ")) state = selected;
+ smaMgr.getNotes().addNote(
+ NoteType.getType(noteWizard.mainPage.typeList.getSelected().iterator().next().getName()), state,
+ noteWizard.mainPage.noteText.get(), UserManager.getUser());
+ smaMgr.getEditor().onDirtied();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (action != null) action.setEnabled(smaMgr.getSma().isReadOnly());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/CopyActionDetailsService.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/CopyActionDetailsService.java
new file mode 100644
index 00000000000..6233c833193
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/CopyActionDetailsService.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CopyActionDetailsService extends WorkPageService {
+
+ private Clipboard clipboard;
+
+ public CopyActionDetailsService(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ private void performCopy() {
+ if (clipboard == null) this.clipboard = new Clipboard(null);
+ clipboard.setContents(
+ new Object[] {"\"" + smaMgr.getSma().getArtifactTypeName() + "\" - " + smaMgr.getSma().getHumanReadableId() + " - \"" + smaMgr.getSma().getDescriptiveName() + "\""},
+ new Transfer[] {TextTransfer.getInstance()});
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ performCopy();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.COPY_TO_CLIPBOARD));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Copy " + smaMgr.getSma().getArtifactTypeName() + " details to clipboard";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/EmailActionService.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/EmailActionService.java
new file mode 100644
index 00000000000..e0e5502c2cd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/EmailActionService.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.ArtifactEmailWizard;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailActionService extends WorkPageService {
+
+ public EmailActionService(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ private void performEmail() throws OseeCoreException {
+ ArtifactEmailWizard ew = new ArtifactEmailWizard(smaMgr.getSma());
+ WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), ew);
+ dialog.create();
+ dialog.open();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ public void run() {
+ try {
+ performEmail();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.EMAIL));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Email " + smaMgr.getSma().getArtifactSuperTypeName();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/FavoriteOperation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/FavoriteOperation.java
new file mode 100644
index 00000000000..7affab50aa0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/FavoriteOperation.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.IFavoriteableArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.Favorites;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class FavoriteOperation extends WorkPageService {
+
+ private final SMAManager smaMgr;
+ private Action action;
+
+ public FavoriteOperation(SMAManager smaMgr) {
+ super(smaMgr);
+ this.smaMgr = smaMgr;
+ }
+
+ @Override
+ public Action createToolbarService() {
+ action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ (new Favorites(smaMgr.getSma())).toggleFavorite();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.FAVORITE));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#isShowSidebarService(org.eclipse.osee.ats.workflow.AtsWorkPage)
+ */
+ @Override
+ public boolean isShowSidebarService(AtsWorkPage page) throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Add as Favorite";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.operation.WorkPageService#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (action != null) action.setToolTipText(((IFavoriteableArtifact) smaMgr.getSma()).amIFavorite() ? "Remove Favorite" : "Add Favorite");
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInArtifactEditorOperation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInArtifactEditorOperation.java
new file mode 100644
index 00000000000..5798a92511b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInArtifactEditorOperation.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenInArtifactEditorOperation extends WorkPageService {
+
+ public OpenInArtifactEditorOperation(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ private void performOpen() {
+ ArtifactEditor.editArtifact(smaMgr.getSma());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ if (!AtsPlugin.isAtsAdmin()) return null;
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ performOpen();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.ARTIFACT_EDITOR));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Open Artifact Editor";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInAtsWorldOperation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInAtsWorldOperation.java
new file mode 100644
index 00000000000..8b42bcbce62
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInAtsWorldOperation.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.ats.editor.service;
+
+import java.util.Arrays;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorSimpleProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenInAtsWorldOperation extends WorkPageService {
+
+ public OpenInAtsWorldOperation(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.IAtsEditorToolBarService#run()
+ */
+ public void performOpen() {
+ try {
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact) {
+ ActionArtifact actionArt = ((TeamWorkFlowArtifact) smaMgr.getSma()).getParentActionArtifact();
+ WorldEditor.open(new WorldEditorSimpleProvider("Action " + actionArt.getHumanReadableId(),
+ Arrays.asList(actionArt)));
+ return;
+ } else if (smaMgr.getSma() instanceof StateMachineArtifact) {
+ WorldEditor.open(new WorldEditorSimpleProvider(
+ smaMgr.getSma().getArtifactTypeName() + ": " + smaMgr.getSma().getHumanReadableId(),
+ Arrays.asList(smaMgr.getSma())));
+ return;
+ }
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Unhandled artifact type " + smaMgr.getSma().getArtifactTypeName());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.toolbar.IAtsEditorToolBarService#createToolbarService(org.eclipse.osee.ats.editor.SMAManager)
+ */
+ @Override
+ public Action createToolbarService() {
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ performOpen();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.GLOBE));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Open in ATS World Editor";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInSkyWalkerOperation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInSkyWalkerOperation.java
new file mode 100644
index 00000000000..2c3cd03027a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenInSkyWalkerOperation.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenInSkyWalkerOperation extends WorkPageService {
+
+ public OpenInSkyWalkerOperation(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ private void performOpen() {
+ SkyWalkerView.exploreArtifact(smaMgr.getSma());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ performOpen();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.SKYWALKER));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Open Sky Walker";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenParent.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenParent.java
new file mode 100644
index 00000000000..53568a759b4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenParent.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.ats.editor.service;
+
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenParent extends WorkPageService {
+
+ public OpenParent(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ @Override
+ public Action createToolbarService() {
+ if (!isParent()) return null;
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ AtsLib.openAtsAction(smaMgr.getSma().getParentSMA(), AtsOpenOption.OpenOneOrPopupSelect);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.OPEN_PARENT));
+ return action;
+ }
+
+ private boolean isParent() {
+ try {
+ return smaMgr.getSma().getParentSMA() != null;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Open Parent";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenTeamDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenTeamDefinition.java
new file mode 100644
index 00000000000..7bb7cdb8c30
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenTeamDefinition.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenTeamDefinition extends WorkPageService {
+
+ public OpenTeamDefinition(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ private void performOpen() {
+ try {
+ AtsLib.openAtsAction(((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition(),
+ AtsOpenOption.OpenOneOrPopupSelect);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ Action action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ performOpen();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.TEAM_DEFINITION));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Open Team Definition";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenVersionArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenVersionArtifact.java
new file mode 100644
index 00000000000..74b4816e699
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/OpenVersionArtifact.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.ats.editor.service;
+
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenVersionArtifact extends WorkPageService {
+
+ Action action;
+
+ public OpenVersionArtifact(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Open Targeted for Version";
+ }
+
+ private void performOpen() {
+ try {
+ if (((TeamWorkFlowArtifact) smaMgr.getSma()).getWorldViewTargetedVersion() != null) ArtifactEditor.editArtifact(((TeamWorkFlowArtifact) smaMgr.getSma()).getWorldViewTargetedVersion());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ if (!(smaMgr.getSma() instanceof TeamWorkFlowArtifact)) return null;
+ action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ public void run() {
+ performOpen();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.VERSION));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (action == null) return;
+ boolean enabled = false;
+ try {
+ enabled = ((TeamWorkFlowArtifact) smaMgr.getSma()).getWorldViewTargetedVersion() != null;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ action.setEnabled(enabled);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/PrivilegedEditService.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/PrivilegedEditService.java
new file mode 100644
index 00000000000..16bc3c62bad
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/PrivilegedEditService.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.ats.editor.service;
+
+import java.util.Set;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class PrivilegedEditService extends WorkPageService {
+
+ private Action action;
+
+ public PrivilegedEditService(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ @Override
+ public Action createToolbarService() {
+ action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ togglePriviledgedEdit();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.PRIVILEDGED_EDIT));
+ return action;
+ }
+
+ private void togglePriviledgedEdit() {
+ try {
+ if (smaMgr.getSma().isReadOnly()) {
+ (new ReadOnlyHyperlinkListener(smaMgr)).linkActivated(null);
+ }
+ if (smaMgr.getEditor().isPriviledgedEditModeEnabled()) {
+ if (MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Diable Privileged Edit",
+ "Privileged Edit Mode Enabled.\n\nDisable?\n\nNote: (changes will be saved)")) {
+ smaMgr.getEditor().setPriviledgedEditMode(false);
+ }
+ } else {
+ Set<User> users = smaMgr.getPrivilegedUsers();
+ if (AtsPlugin.isAtsAdmin()) users.add(UserManager.getUser());
+ StringBuffer sb = new StringBuffer();
+ for (User user : users)
+ sb.append(user.getName() + "\n");
+ String buttons[];
+ boolean iAmPrivileged = users.contains(UserManager.getUser());
+ if (iAmPrivileged)
+ buttons = new String[] {"Override and Edit", "Cancel"};
+ else
+ buttons = new String[] {"Cancel"};
+ MessageDialog ed =
+ new MessageDialog(
+ Display.getCurrent().getActiveShell(),
+ "Privileged Edit",
+ null,
+ "The following users have the ability to edit this " + smaMgr.getSma().getArtifactTypeName() + " in case of emergency.\n\n" + sb.toString(),
+ MessageDialog.QUESTION, buttons, 0);
+ int result = ed.open();
+ if (iAmPrivileged && result == 0) smaMgr.getEditor().setPriviledgedEditMode(true);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#isShowSidebarService(org.eclipse.osee.ats.workflow.AtsWorkPage)
+ */
+ @Override
+ public boolean isShowSidebarService(AtsWorkPage page) throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Privileged Edit";
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ReadOnlyHyperlinkListener.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ReadOnlyHyperlinkListener.java
new file mode 100644
index 00000000000..37e3baa0b58
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ReadOnlyHyperlinkListener.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.ats.editor.service;
+
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ReadOnlyHyperlinkListener implements IHyperlinkListener {
+
+ private final SMAManager smaMgr;
+
+ public ReadOnlyHyperlinkListener(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.events.IHyperlinkListener#linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent)
+ */
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (smaMgr.isHistoricalVersion())
+ AWorkbench.popup(
+ "Historical Error",
+ "You can not change a historical version of " + smaMgr.getSma().getArtifactTypeName() + ":\n\n" + smaMgr.getSma());
+
+ else
+ AWorkbench.popup("Authentication Error",
+ "You do not have permissions to edit " + smaMgr.getSma().getArtifactTypeName() + ":" + smaMgr.getSma());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.events.IHyperlinkListener#linkEntered(org.eclipse.ui.forms.events.HyperlinkEvent)
+ */
+ @Override
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.events.IHyperlinkListener#linkExited(org.eclipse.ui.forms.events.HyperlinkEvent)
+ */
+ @Override
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ServicesArea.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ServicesArea.java
new file mode 100644
index 00000000000..e61e9ae1715
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/ServicesArea.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.editor.service;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItems;
+import org.eclipse.osee.ats.editor.IAtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAWorkFlowSection;
+import org.eclipse.osee.ats.editor.service.branch.ShowChangeReportService;
+import org.eclipse.osee.ats.editor.service.branch.ShowMergeManagerService;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+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;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ServicesArea {
+
+ private final SMAManager smaMgr;
+ private final List<WorkPageService> sideBarServices = new ArrayList<WorkPageService>();
+ private final List<WorkPageService> toolBarServices = new ArrayList<WorkPageService>();
+ private final ArrayList<Group> groups = new ArrayList<Group>();
+ public static String STATISTIC_CATEGORY = "Statistics";
+ public static String OPERATION_CATEGORY = "Operation";
+
+ public ServicesArea(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ public void dispose() {
+ for (WorkPageService service : sideBarServices)
+ service.dispose();
+ for (WorkPageService service : toolBarServices)
+ service.dispose();
+ }
+
+ public void loadSidebarServices(AtsWorkPage page) throws OseeCoreException {
+ if (sideBarServices.size() == 0) {
+ // Add state specific items (these can also contain branch items through extending BranchableStateItem class
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(page.getId())) {
+ sideBarServices.addAll(item.getSidebarServices(smaMgr));
+ }
+ }
+ }
+
+ public void loadToolbarServices(AtsWorkPage atsWorkPage) throws OseeCoreException {
+ if (toolBarServices.size() == 0) {
+ // Toolbar Services
+ if (atsWorkPage != null && (smaMgr.getSma() instanceof TeamWorkFlowArtifact) && (smaMgr.getBranchMgr().isCommittedBranchExists() || smaMgr.getBranchMgr().isWorkingBranchInWork())) {
+ toolBarServices.add(new ShowMergeManagerService(smaMgr));
+ toolBarServices.add(new ShowChangeReportService(smaMgr));
+ }
+ toolBarServices.add(new FavoriteOperation(smaMgr));
+ toolBarServices.add(new OpenParent(smaMgr));
+ toolBarServices.add(new EmailActionService(smaMgr));
+ toolBarServices.add(new AddNoteOperation(smaMgr));
+ toolBarServices.add(new OpenInAtsWorldOperation(smaMgr));
+ toolBarServices.add(new OpenInArtifactEditorOperation(smaMgr));
+ toolBarServices.add(new OpenInSkyWalkerOperation(smaMgr));
+ toolBarServices.add(new OpenVersionArtifact(smaMgr));
+ toolBarServices.add(new OpenTeamDefinition(smaMgr));
+ toolBarServices.add(new SubscribedOperation(smaMgr));
+ toolBarServices.add(new CopyActionDetailsService(smaMgr));
+ toolBarServices.add(new PrivilegedEditService(smaMgr));
+ for (IAtsStateItem item : AtsStateItems.getAllStateItems()) {
+ toolBarServices.addAll(item.getToolbarServices(smaMgr));
+ }
+ }
+ }
+
+ public void createSidebarServices(Composite comp, AtsWorkPage page, XFormToolkit toolkit, SMAWorkFlowSection section) throws OseeCoreException {
+ loadSidebarServices(page);
+ Set<String> categories = new HashSet<String>();
+ for (WorkPageService service : sideBarServices) {
+ if (service.getSidebarCategory() != null) categories.add(service.getSidebarCategory());
+ }
+ createSidebarServicesArea(comp, STATISTIC_CATEGORY, page, toolkit, section);
+ categories.remove(STATISTIC_CATEGORY);
+ createSidebarServicesArea(comp, OPERATION_CATEGORY, page, toolkit, section);
+ categories.remove(OPERATION_CATEGORY);
+ for (String category : categories) {
+ createSidebarServicesArea(comp, category, page, toolkit, section);
+ }
+ }
+
+ public void createToolbarServices(AtsWorkPage page, IToolBarManager toolbarManager) throws OseeCoreException {
+ try {
+ loadToolbarServices(page);
+ for (final WorkPageService service : toolBarServices) {
+ try {
+ Action action = service.createToolbarService();
+ if (action != null) toolbarManager.add(action);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private void createSidebarServicesArea(Composite comp, String category, AtsWorkPage page, XFormToolkit toolkit, SMAWorkFlowSection section) throws OseeCoreException {
+
+ // Determine services that are in this category and confirm that they should be displayed
+ List<WorkPageService> displayServices = new ArrayList<WorkPageService>();
+ for (WorkPageService service : sideBarServices)
+ if (service.getSidebarCategory() != null && service.getSidebarCategory().equals(category) && service.isShowSidebarService(page)) displayServices.add(service);
+ if (displayServices.size() == 0) return;
+
+ Group workComp = new Group(comp, SWT.NONE);
+ groups.add(workComp);
+ workComp.setText(category);
+ toolkit.adapt(workComp);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginWidth = layout.marginHeight = 7;
+
+ workComp.setLayout(layout);
+ workComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL));
+ toolkit.paintBordersFor(workComp);
+
+ for (WorkPageService service : displayServices)
+ service.createSidebarService(workComp, page, toolkit, section);
+
+ }
+
+ public void refresh() {
+ for (WorkPageService stat : sideBarServices)
+ stat.refresh();
+ for (WorkPageService stat : toolBarServices)
+ stat.refresh();
+ for (Group group : groups)
+ if (group != null && !group.isDisposed()) group.layout();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateEstimatedHoursStat.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateEstimatedHoursStat.java
new file mode 100644
index 00000000000..4973ca6dd01
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateEstimatedHoursStat.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.ats.editor.service;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAStateMetricsHeader;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StateEstimatedHoursStat {
+
+ private Hyperlink link;
+ private Label label;
+ private AtsWorkPage page;
+ private final SMAManager smaMgr;
+
+ public StateEstimatedHoursStat(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ public void createSidebarService(Composite workGroup, AtsWorkPage page, XFormToolkit toolkit, final SMAStateMetricsHeader header) throws OseeCoreException {
+ this.page = page;
+ if (!page.isCompleteCancelledState() && smaMgr.isCurrentState(page.getName())) {
+ link = toolkit.createHyperlink(workGroup, "", SWT.NONE);
+ if (smaMgr.getSma().isReadOnly())
+ link.addHyperlinkListener(new ReadOnlyHyperlinkListener(smaMgr));
+ else
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ smaMgr.promptChangeFloatAttribute(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE, false);
+ header.refresh();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ link.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ } else {
+ label = toolkit.createLabel(workGroup, "", SWT.NONE);
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+ refresh();
+ }
+
+ public String getName() {
+ return "Estimated Hours";
+ }
+
+ public void refresh() {
+ if (page == null && link != null && !link.isDisposed()) {
+ link.setText("Estimated Hours Error: page == null");
+ link.update();
+ return;
+ } else if (page == null && label != null && !label.isDisposed()) {
+ label.setText("Estimated Hours Error: page == null");
+ label.update();
+ return;
+ } else if (page == null) return;
+ try {
+ StringBuffer sb =
+ new StringBuffer(String.format(" State Est Hours: %5.2f",
+ smaMgr.getSma().getEstimatedHoursFromArtifact()));
+ boolean breakoutNeeded = false;
+ if (smaMgr.getTaskMgr().hasTaskArtifacts()) {
+ sb.append(String.format("\n Task Est Hours: %5.2f", smaMgr.getSma().getEstimatedHoursFromTasks(
+ page.getName())));
+ breakoutNeeded = true;
+ }
+ if (smaMgr.getReviewManager().hasReviews()) {
+ sb.append(String.format("\n Review Est Hours: %5.2f", smaMgr.getSma().getEstimatedHoursFromReviews(
+ page.getName())));
+ breakoutNeeded = true;
+ }
+ if (breakoutNeeded) {
+ setString(String.format("Total State Est Hours: %5.2f", smaMgr.getSma().getEstimatedHoursTotal(
+ page.getName())));
+ if (link != null && !link.isDisposed()) {
+ link.setToolTipText(sb.toString());
+ }
+ if (label != null && !label.isDisposed()) {
+ label.setToolTipText(sb.toString());
+ }
+ } else {
+ setString(String.format("State Estimated Hours: %5.2f", smaMgr.getSma().getEstimatedHoursTotal()));
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void setString(String str) {
+ if (page != null && link != null && !link.isDisposed()) {
+ link.setText(str);
+ link.update();
+ } else if (page != null && label != null && !label.isDisposed()) {
+ label.setText(str);
+ label.update();
+ } else if (label != null && !label.isDisposed()) {
+ label.setText("State Hours Spent Error: page == null");
+ label.update();
+ } else if (link != null && !link.isDisposed()) {
+ link.setText("Estimated Hours Spent Error: page == null");
+ link.update();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateHoursSpentStat.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateHoursSpentStat.java
new file mode 100644
index 00000000000..f759898098a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StateHoursSpentStat.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.ats.editor.service;
+
+import java.util.Arrays;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAPromptChangeStatus;
+import org.eclipse.osee.ats.editor.SMAStateMetricsHeader;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StateHoursSpentStat {
+
+ private Hyperlink link;
+ private Label label;
+ private AtsWorkPage page;
+ private final SMAManager smaMgr;
+
+ public StateHoursSpentStat(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ public void createSidebarService(Composite workGroup, AtsWorkPage page, XFormToolkit toolkit, final SMAStateMetricsHeader header) throws OseeCoreException {
+ this.page = page;
+ if (!page.isCompleteCancelledState() && smaMgr.isCurrentState(page.getName())) {
+ link = toolkit.createHyperlink(workGroup, "", SWT.NONE);
+ if (smaMgr.getSma().isReadOnly())
+ link.addHyperlinkListener(new ReadOnlyHyperlinkListener(smaMgr));
+ else
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ SMAPromptChangeStatus.promptChangeStatus(Arrays.asList(smaMgr.getSma()), false);
+ header.refresh();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ link.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ } else {
+ label = toolkit.createLabel(workGroup, "", SWT.NONE);
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+ refresh();
+ }
+
+ public String getName() {
+ return "Hours Spent";
+ }
+
+ public void refresh() {
+ if (page == null && link != null && !link.isDisposed()) {
+ link.setText("State Hours Error: page == null");
+ return;
+ } else if (page == null && label != null && !label.isDisposed()) {
+ label.setText("State Hours Error: page == null");
+ return;
+ } else if (page == null) return;
+ try {
+ StringBuffer sb =
+ new StringBuffer(String.format(" State Hours: %5.2f", smaMgr.getStateMgr().getHoursSpent(
+ page.getName())));
+ boolean breakoutNeeded = false;
+ if (smaMgr.getTaskMgr().hasTaskArtifacts()) {
+ sb.append(String.format("\n Task Hours: %5.2f", smaMgr.getTaskMgr().getHoursSpent(page.getName())));
+ breakoutNeeded = true;
+ }
+ if (smaMgr.getReviewManager().hasReviews()) {
+ sb.append(String.format("\n Review Hours: %5.2f", smaMgr.getReviewManager().getHoursSpent(
+ page.getName())));
+ breakoutNeeded = true;
+ }
+ if (breakoutNeeded) {
+ setString(String.format("Total State Hours: %5.2f", smaMgr.getSma().getHoursSpentSMAStateTotal(
+ page.getName())));
+ if (link != null && !link.isDisposed()) {
+ link.setToolTipText(sb.toString());
+ }
+ if (label != null && !label.isDisposed()) {
+ label.setToolTipText(sb.toString());
+ }
+ } else {
+ setString(String.format("State Hours Spent: %5.2f", smaMgr.getStateMgr().getHoursSpent(page.getName())));
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void setString(String str) {
+ if (page != null && link != null && !link.isDisposed()) {
+ link.setText(str);
+ link.update();
+ } else if (page != null && label != null && !label.isDisposed()) {
+ label.setText(str);
+ label.update();
+ } else if (label != null && !label.isDisposed()) {
+ label.setText("State Hours Spent Error: page == null");
+ label.update();
+ } else if (link != null && !link.isDisposed()) link.setText("State Hours Spent Error: page == null");
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StatePercentCompleteStat.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StatePercentCompleteStat.java
new file mode 100644
index 00000000000..500ebcb3be7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/StatePercentCompleteStat.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.ats.editor.service;
+
+import java.util.Arrays;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAPromptChangeStatus;
+import org.eclipse.osee.ats.editor.SMAStateMetricsHeader;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StatePercentCompleteStat {
+
+ private Hyperlink link;
+ private AtsWorkPage page;
+ private final SMAManager smaMgr;
+
+ public StatePercentCompleteStat(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ public void createSidebarService(Composite composite, AtsWorkPage page, XFormToolkit toolkit, final SMAStateMetricsHeader header) throws OseeCoreException {
+ this.page = page;
+ link = toolkit.createHyperlink(composite, "", SWT.NONE);
+ if (smaMgr.getSma().isReadOnly())
+ link.addHyperlinkListener(new ReadOnlyHyperlinkListener(smaMgr));
+ else
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkEntered(HyperlinkEvent e) {
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ }
+
+ public void linkActivated(HyperlinkEvent e) {
+ try {
+ SMAPromptChangeStatus.promptChangeStatus(Arrays.asList(smaMgr.getSma()), false);
+ header.refresh();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ link.setToolTipText(TOOLTIP);
+ link.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ refresh();
+ }
+ public static String TOOLTIP = "Calculation: \n State Percent: amount entered by user\n" +
+ //
+ " Task Percent: total percent of all tasks related to state / number of tasks related to state\n" +
+ //
+ " Review Percent: total percent of all reviews related to state / number of reviews related to state\n" +
+ //
+ "Total State Percent: state percent + all task percents + all review percents / 1 + num tasks + num reviews";
+
+ public void refresh() {
+ if (page == null && link != null && !link.isDisposed()) {
+ link.setText("State Percent Error: page == null");
+ return;
+ } else if (page == null) return;
+
+ try {
+ StringBuffer sb =
+ new StringBuffer(String.format(" State Percent: %d", smaMgr.getStateMgr().getPercentComplete(
+ page.getName())));
+ boolean breakoutNeeded = false;
+ if (smaMgr.getTaskMgr().hasTaskArtifacts()) {
+ sb.append(String.format("\n Task Percent: %d", smaMgr.getTaskMgr().getPercentComplete(
+ page.getName())));
+ breakoutNeeded = true;
+ }
+ if (smaMgr.getReviewManager().hasReviews()) {
+ sb.append(String.format("\n Review Percent: %d", smaMgr.getReviewManager().getPercentComplete(
+ page.getName())));
+ breakoutNeeded = true;
+ }
+ if (breakoutNeeded) {
+ setString(String.format("Total State Percent: %d", smaMgr.getSma().getPercentCompleteSMAStateTotal(
+ page.getName())));
+ if (link != null && !link.isDisposed()) {
+ link.setToolTipText(sb.toString() + "\n" + TOOLTIP);
+ }
+ } else {
+ setString(String.format("State Percent Complete: %d", smaMgr.getStateMgr().getPercentComplete(
+ page.getName())));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void setString(String str) {
+ if (page != null && link != null && !link.isDisposed()) {
+ link.setText(str);
+ link.update();
+ } else if (link != null && !link.isDisposed()) link.setText("State Hours Spent Error: page == null");
+ }
+
+ public String getName() {
+ return "Percent Complete";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/SubscribedOperation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/SubscribedOperation.java
new file mode 100644
index 00000000000..91b693b8828
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/SubscribedOperation.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.ISubscribableArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.Subscribe;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SubscribedOperation extends WorkPageService {
+
+ private Action action;
+
+ public SubscribedOperation(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ @Override
+ public Action createToolbarService() {
+ action = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ (new Subscribe(smaMgr.getSma())).toggleSubscribe();
+ }
+ };
+ action.setToolTipText(getName());
+ action.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.SUBSCRIBED));
+ return action;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#isShowSidebarService(org.eclipse.osee.ats.workflow.AtsWorkPage)
+ */
+ @Override
+ public boolean isShowSidebarService(AtsWorkPage page) throws OseeCoreException {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.operation.WorkPageService#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (action != null) action.setToolTipText(((ISubscribableArtifact) smaMgr.getSma()).amISubscribed() ? "Remove Subscribed" : "Add Subscribed");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Subscribe to Email Notifications";
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/WorkPageService.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/WorkPageService.java
new file mode 100644
index 00000000000..d8c84cdc0c7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/WorkPageService.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.ats.editor.service;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAWorkFlowSection;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class WorkPageService {
+
+ protected final SMAManager smaMgr;
+ protected final boolean showSidebarService = true;
+
+ public WorkPageService(SMAManager smaMgr) {
+ super();
+ this.smaMgr = smaMgr;
+ readOnlyHyperlinkListener = new ReadOnlyHyperlinkListener(smaMgr);
+ }
+
+ public boolean isCurrentState(AtsWorkPage page) throws OseeCoreException {
+ return smaMgr.isCurrentState(page.getName());
+ }
+
+ public boolean isCurrentNonCompleteCancelledState(AtsWorkPage page) throws OseeCoreException {
+ return smaMgr.isCurrentState(page.getName()) && !isCompleteCancelledState(page);
+ }
+
+ public boolean isCompleteCancelledState(AtsWorkPage page) {
+ return page.isCancelledPage() || page.isCompletePage();
+ }
+
+ public void createSidebarService(Group workGroup, AtsWorkPage page, XFormToolkit toolkit, SMAWorkFlowSection section) throws OseeCoreException {
+ }
+
+ public Action createToolbarService() {
+ return null;
+ }
+
+ public void dispose() {
+ }
+
+ public void refresh() {
+ }
+
+ public String getSidebarCategory() {
+ return null;
+ }
+
+ protected IHyperlinkListener readOnlyHyperlinkListener;
+
+ public abstract String getName();
+
+ /**
+ * By default, all sidebar services will be have their createSidebarService method called. This method can be
+ * overridden to determine if it should be called.
+ *
+ * @return the showSidebarService
+ * @throws OseeCoreException TODO
+ */
+ public boolean isShowSidebarService(AtsWorkPage page) throws OseeCoreException {
+ return showSidebarService;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowChangeReportService.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowChangeReportService.java
new file mode 100644
index 00000000000..9720d21e027
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowChangeReportService.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.ats.editor.service.branch;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.service.WorkPageService;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ShowChangeReportService extends WorkPageService implements IBranchEventListener {
+
+ // Since this service is only going to be added for the Implement state, Location.AllState will
+ // work
+ public ShowChangeReportService(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#isShowSidebarService(org.eclipse.osee.ats.workflow.AtsWorkPage)
+ */
+ @Override
+ public boolean isShowSidebarService(AtsWorkPage page) throws OseeCoreException {
+ return false;
+ }
+
+ private Action toolBarAction;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#createToolbarService()
+ */
+ @Override
+ public Action createToolbarService() {
+ toolBarAction = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ smaMgr.getBranchMgr().showChangeReport();
+ }
+ };
+ toolBarAction.setToolTipText(getName());
+ toolBarAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BRANCH_CHANGE));
+ OseeEventManager.addListener(this);
+ refresh();
+ return toolBarAction;
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Show Change Report";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.statistic.WorkPageStatistic#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (toolBarAction != null) {
+ toolBarAction.setEnabled(isEnabled());
+ }
+ }
+
+ private boolean isEnabled() {
+ boolean enabled = false;
+ try {
+ if (smaMgr.getBranchMgr().isWorkingBranchInWork()) {
+ enabled = true;
+ } else {
+ enabled = smaMgr.getBranchMgr().isCommittedBranchExists();
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return enabled;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowMergeManagerService.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowMergeManagerService.java
new file mode 100644
index 00000000000..972d7c1ac3c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/service/branch/ShowMergeManagerService.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.ats.editor.service.branch;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.service.WorkPageService;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ShowMergeManagerService extends WorkPageService implements IBranchEventListener {
+
+ private Hyperlink link;
+
+ // Since this service is only going to be added for the Implement state, Location.AllState will
+ // work
+ public ShowMergeManagerService(SMAManager smaMgr) {
+ super(smaMgr);
+ }
+
+ private Action toolBarAction;
+
+ @Override
+ public Action createToolbarService() {
+ toolBarAction = new Action(getName(), Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ smaMgr.getBranchMgr().showMergeManager();
+ }
+ };
+ toolBarAction.setToolTipText(getName());
+ toolBarAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.OUTGOING_MERGED));
+
+ OseeEventManager.addListener(this);
+ refresh();
+ return toolBarAction;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#getName()
+ */
+ @Override
+ public String getName() {
+ return "Show Merge Manager";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.statistic.WorkPageStatistic#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (link != null && !link.isDisposed()) {
+ boolean enabled = isEnabled();
+ link.setEnabled(enabled);
+ link.setUnderlined(enabled);
+ }
+ if (toolBarAction != null) {
+ toolBarAction.setEnabled(isEnabled());
+ }
+ }
+
+ private boolean isEnabled() {
+ boolean enabled = false;
+ try {
+ enabled = smaMgr.getBranchMgr().isWorkingBranchInWork() || smaMgr.getBranchMgr().isCommittedBranchExists();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return enabled;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.service.WorkPageService#isShowSidebarService(org.eclipse.osee.ats.workflow.AtsWorkPage)
+ */
+ @Override
+ public boolean isShowSidebarService(AtsWorkPage page) throws OseeCoreException {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDebugWorkPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDebugWorkPage.java
new file mode 100644
index 00000000000..cc57cb35ff3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDebugWorkPage.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.ats.editor.stateItem;
+
+import org.eclipse.osee.ats.editor.stateItem.AtsLogWorkPage.EmptyWorkFlowDefinition;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDebugWorkPage extends AtsWorkPage {
+
+ public static String PAGE_ID = "ats.Debug";
+
+ /**
+ * @param name
+ * @param id
+ * @param widgetsXml
+ * @param optionResolver
+ */
+ public AtsDebugWorkPage() {
+ super(new EmptyWorkFlowDefinition("ATS Admin Debug", PAGE_ID), new WorkPageDefinition("ATS Admin Debug", PAGE_ID,
+ null), null, null);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewDecisionStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewDecisionStateItem.java
new file mode 100644
index 00000000000..268c29b06b6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewDecisionStateItem.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.ats.editor.stateItem;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItem;
+import org.eclipse.osee.ats.editor.SMAWorkFlowSection;
+import org.eclipse.osee.ats.util.widgets.DecisionOption;
+import org.eclipse.osee.ats.util.widgets.XDecisionOptions;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDecisionReviewDecisionStateItem extends AtsStateItem {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ @Override
+ public String getId() {
+ return "osee.ats.decisionReview.Decision";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#xWidgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.ats.workflow.AtsWorkPage,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public Result xWidgetCreating(XWidget xWidget, FormToolkit toolkit, AtsWorkPage page, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ if (xWidget.getLabel().equals(ATSAttributes.DECISION_ATTRIBUTE.getDisplayName())) {
+ if (xWidget == null) throw new OseeStateException("Can't retrieve decision review combo widget to set.");
+ XComboDam decisionComboDam = (XComboDam) xWidget;
+ List<String> options = new ArrayList<String>();
+ XDecisionOptions xDecOptions = new XDecisionOptions((StateMachineArtifact) art);
+ for (DecisionOption opt : xDecOptions.getDecisionOptions())
+ options.add(opt.getName());
+ decisionComboDam.setDataStrings(options.toArray(new String[options.size()]));
+ }
+ return Result.TrueResult;
+ }
+
+ @Override
+ public String getOverrideTransitionToStateName(SMAWorkFlowSection section) throws OseeCoreException {
+ DecisionOption decisionOption = getDecisionOption(section);
+ if (decisionOption == null) return null;
+ boolean followUpRequired = decisionOption.isFollowupRequired();
+ if (section.getTransitionToStateCombo() == null || section.getTransitionToStateCombo().getSelected() == null) return null;
+ if (followUpRequired)
+ return DecisionReviewArtifact.DecisionReviewState.Followup.name();
+ else
+ return DecisionReviewArtifact.DecisionReviewState.Completed.name();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getOverrideTransitionToAssignees(org.eclipse.osee.ats.editor.SMAWorkFlowSection)
+ */
+ @Override
+ public Collection<User> getOverrideTransitionToAssignees(SMAWorkFlowSection section) throws OseeCoreException {
+ DecisionOption decisionOption = getDecisionOption(section);
+ if (decisionOption == null) return null;
+ return decisionOption.getAssignees();
+ }
+
+ private DecisionOption getDecisionOption(SMAWorkFlowSection section) throws OseeCoreException {
+ XWidget xWidget = section.getPage().getLayoutData(ATSAttributes.DECISION_ATTRIBUTE.getStoreName()).getXWidget();
+ XComboDam decisionComboDam = (XComboDam) xWidget;
+ String decision = decisionComboDam.get();
+ if (decision.equals("")) return null;
+ DecisionReviewArtifact decArt = (DecisionReviewArtifact) section.getSmaMgr().getSma();
+ DecisionOption decisionOption = decArt.decisionOptions.getDecisionOption(decision);
+ return decisionOption;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getDescription()
+ */
+ public String getDescription() throws OseeCoreException {
+ return "AtsDecisionReviewDecisionStateItem - Add decision options to review state based on prepare state's entries.";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewPrepareStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewPrepareStateItem.java
new file mode 100644
index 00000000000..386e1aeb4d4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsDecisionReviewPrepareStateItem.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.ats.editor.stateItem;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.XDecisionOptions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDecisionReviewPrepareStateItem extends AtsStateItem {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ public String getId() {
+ return "osee.ats.decisionReview.Prepare";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#transitioning(java.lang.String, java.lang.String,
+ * java.util.Collection)
+ */
+ public Result transitioning(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees) throws OseeCoreException {
+ if (fromState.equals(DecisionReviewArtifact.DecisionReviewState.Prepare) && toState.equals(DecisionReviewArtifact.DecisionReviewState.Decision)) {
+ XDecisionOptions decOptions = new XDecisionOptions(smaMgr.getSma());
+ return decOptions.validateDecisionOptions();
+ }
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getDescription()
+ */
+ public String getDescription() throws OseeCoreException {
+ return "AtsDecisionReviewPrepareStateItem - Add validation of decision options prior to transitioning.";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsForceAssigneesToTeamLeadsStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsForceAssigneesToTeamLeadsStateItem.java
new file mode 100644
index 00000000000..df67ffaeba2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsForceAssigneesToTeamLeadsStateItem.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.ats.editor.stateItem;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsForceAssigneesToTeamLeadsStateItem extends AtsStateItem {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ public String getId() {
+ return AtsStateItem.ALL_STATE_IDS;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.AtsStateItem#transitioned(org.eclipse.osee.ats.editor.SMAManager,
+ * java.lang.String, java.lang.String, java.util.Collection)
+ */
+ @Override
+ public void transitioned(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees, SkynetTransaction transaction) throws OseeCoreException {
+ super.transitioned(smaMgr, fromState, toState, toAssignees, transaction);
+ if ((smaMgr.getSma() instanceof TeamWorkFlowArtifact) && (AtsWorkDefinitions.isForceAssigneesToTeamLeads(smaMgr.getWorkPageDefinitionByName(toState)))) {
+ // Set Assignees to all user roles users
+ try {
+ Collection<User> teamLeads = ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition().getLeads();
+ smaMgr.getStateMgr().setAssignees(teamLeads);
+ smaMgr.getSma().persistAttributes(transaction);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getDescription()
+ */
+ public String getDescription() throws OseeCoreException {
+ return "AtsForceAssigneesToTeamLeadsStateItem";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsHandleAddReviewRuleStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsHandleAddReviewRuleStateItem.java
new file mode 100644
index 00000000000..d635a1d4468
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsHandleAddReviewRuleStateItem.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.ats.editor.stateItem;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule;
+import org.eclipse.osee.ats.workflow.item.AtsAddPeerToPeerReviewRule;
+import org.eclipse.osee.ats.workflow.item.StateEventType;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule.DecisionParameter;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule.DecisionRuleOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsHandleAddReviewRuleStateItem extends AtsStateItem {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ @Override
+ public String getId() {
+ return AtsStateItem.ALL_STATE_IDS;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.AtsStateItem#transitioned(org.eclipse.osee.ats.editor.SMAManager,
+ * java.lang.String, java.lang.String, java.util.Collection)
+ */
+ @Override
+ public void transitioned(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees, SkynetTransaction transaction) throws OseeCoreException {
+ super.transitioned(smaMgr, fromState, toState, toAssignees, transaction);
+
+ // Create any decision or peerToPeer reviews for transitionTo and transitionFrom
+ for (String ruleId : Arrays.asList(AtsAddDecisionReviewRule.ID, AtsAddPeerToPeerReviewRule.ID)) {
+ for (WorkRuleDefinition workRuleDef : smaMgr.getWorkRulesStartsWith(ruleId)) {
+ StateEventType eventType = AtsAddDecisionReviewRule.getStateEventType(smaMgr, workRuleDef);
+ String forState = workRuleDef.getWorkDataValue(DecisionParameter.forState.name());
+ if (forState == null || forState.equals("")) {
+ continue;
+ }
+ if (eventType != null && toState.equals(forState) && eventType == StateEventType.TransitionTo) {
+ if (ruleId.startsWith(AtsAddDecisionReviewRule.ID)) {
+ DecisionReviewArtifact decArt =
+ AtsAddDecisionReviewRule.createNewDecisionReview(workRuleDef, transaction, smaMgr,
+ DecisionRuleOption.TransitionToDecision);
+ if (decArt != null) decArt.persistAttributesAndRelations(transaction);
+ } else if (ruleId.startsWith(AtsAddPeerToPeerReviewRule.ID)) {
+ PeerToPeerReviewArtifact peerArt =
+ AtsAddPeerToPeerReviewRule.createNewPeerToPeerReview(workRuleDef, smaMgr, transaction);
+ if (peerArt != null) peerArt.persistAttributesAndRelations(transaction);
+ }
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getDescription()
+ */
+ public String getDescription() throws OseeCoreException {
+ return "AtsHandleAddReviewRuleStateItem - If AddDecisionReviewRule or AddPeerToPeerReviewRule exists for this state, create review.";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsLogWorkPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsLogWorkPage.java
new file mode 100644
index 00000000000..ed19df60a9a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsLogWorkPage.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.ats.editor.stateItem;
+
+import org.eclipse.osee.ats.editor.service.WorkPageService;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsLogWorkPage extends AtsWorkPage {
+
+ public static String PAGE_ID = "ats.Log";
+
+ public static class EmptyWorkFlowDefinition extends WorkFlowDefinition {
+
+ /**
+ * @param name
+ * @param id
+ * @param parentId
+ */
+ public EmptyWorkFlowDefinition(String name, String id) {
+ super(name, id, null);
+ }
+
+ }
+
+ /**
+ * @param title
+ */
+ public AtsLogWorkPage(String title) {
+ super(new EmptyWorkFlowDefinition(title, PAGE_ID), new WorkPageDefinition(title, PAGE_ID, null), null, null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.AtsWorkPage#isDisplayService(org.eclipse.osee.ats.editor.service.WorkPageService)
+ */
+ @Override
+ public boolean isDisplayService(WorkPageService service) {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewPrepareStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewPrepareStateItem.java
new file mode 100644
index 00000000000..7f8563296e7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewPrepareStateItem.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.ats.editor.stateItem;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItem;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboBooleanDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsPeerToPeerReviewPrepareStateItem extends AtsStateItem {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ @Override
+ public String getId() {
+ return "osee.ats.peerToPeerReview.Prepare";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.AtsStateItem#xWidgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.ats.workflow.AtsWorkPage,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void xWidgetCreated(XWidget widget, FormToolkit toolkit, AtsWorkPage page, Artifact art, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.xWidgetCreated(widget, toolkit, page, art, modListener, isEditable);
+ try {
+ if ((art instanceof ReviewSMArtifact) && ((ReviewSMArtifact) art).getParentSMA() == null) {
+ if (widget.getLabel().equals(ATSAttributes.BLOCKING_REVIEW_ATTRIBUTE.getDisplayName())) {
+ XComboBooleanDam decisionComboDam = (XComboBooleanDam) widget;
+ decisionComboDam.setEnabled(false);
+ decisionComboDam.setRequiredEntry(false);
+ } else if (widget.getLabel().equals(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getDisplayName())) {
+ XComboDam decisionComboDam = (XComboDam) widget;
+ decisionComboDam.setEnabled(false);
+ decisionComboDam.setRequiredEntry(false);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getDescription()
+ */
+ public String getDescription() throws OseeCoreException {
+ return "AtsPeerToPeerReviewPrepareStateItem - If stand-alone review, remove blocking review enablement and required entry.";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewReviewStateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewReviewStateItem.java
new file mode 100644
index 00000000000..1ef91c904c3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/stateItem/AtsPeerToPeerReviewReviewStateItem.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.ats.editor.stateItem;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.editor.AtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsPeerToPeerReviewReviewStateItem extends AtsStateItem {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getId()
+ */
+ public String getId() {
+ return "osee.ats.peerToPeerReview.Review";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.editor.AtsStateItem#transitioned(org.eclipse.osee.ats.editor.SMAManager,
+ * java.lang.String, java.lang.String, java.util.Collection)
+ */
+ @Override
+ public void transitioned(SMAManager smaMgr, String fromState, String toState, Collection<User> toAssignees, SkynetTransaction transaction) throws OseeCoreException {
+ super.transitioned(smaMgr, fromState, toState, toAssignees, transaction);
+ if (!toState.equals(PeerToPeerReviewArtifact.PeerToPeerReviewState.Review.name())) return;
+ // Set Assignees to all user roles users
+ Set<User> assignees = new HashSet<User>();
+ PeerToPeerReviewArtifact peerArt = (PeerToPeerReviewArtifact) smaMgr.getSma();
+ for (UserRole uRole : peerArt.getUserRoleManager().getUserRoles())
+ assignees.add(uRole.getUser());
+ assignees.addAll(smaMgr.getStateMgr().getAssignees());
+
+ smaMgr.getStateMgr().setAssignees(assignees);
+ smaMgr.getSma().persistAttributes(transaction);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.IAtsStateItem#getDescription()
+ */
+ public String getDescription() throws OseeCoreException {
+ return "AtsPeerToPeerReviewReviewStateItem - assign review state to all members of review as per role in prepare state.";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportManager.java
new file mode 100644
index 00000000000..bbd1d6c01d3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportManager.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.export;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.editor.SMAPrint;
+import org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsExportManager implements IAtsWorldEditorMenuItem {
+
+ public enum ExportOption {
+ NONE,
+ POPUP_DIALOG,
+ AS_HTML_TO_RESULT_EDITOR,
+ AS_HTML_TO_FILE,
+ AS_PDF,
+ MERGE_INTO_SINGLE_FILE,
+ SAVE_INTO_SEPARATE_FILES,
+ INCLUDE_TASKLIST;
+
+ };
+
+ public static Collection<StateMachineArtifact> getSmaArts(Collection<? extends Artifact> artifacts) throws OseeCoreException {
+ Set<StateMachineArtifact> smaArts = new HashSet<StateMachineArtifact>();
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof StateMachineArtifact) {
+ smaArts.add((StateMachineArtifact) artifact);
+ } else if (artifact instanceof ActionArtifact) {
+ smaArts.addAll(((ActionArtifact) artifact).getTeamWorkFlowArtifacts());
+ }
+ }
+ return smaArts;
+ }
+
+ public static Collection<StateMachineArtifact> getSmaArts(ISelection selection) throws OseeCoreException {
+ Set<StateMachineArtifact> smaArts = new HashSet<StateMachineArtifact>();
+ if (selection != null) {
+ Iterator<?> selectionIterator = ((IStructuredSelection) selection).iterator();
+ while (selectionIterator.hasNext()) {
+ Object selectedObject = selectionIterator.next();
+
+ if (selectedObject instanceof Match) {
+ selectedObject = ((Match) selectedObject).getElement();
+ } else if (selectedObject instanceof IAdaptable) {
+ selectedObject = ((IAdaptable) selectedObject).getAdapter(Artifact.class);
+ }
+
+ if (selectedObject instanceof StateMachineArtifact) {
+ smaArts.add((StateMachineArtifact) selectedObject);
+ } else if (selectedObject instanceof ActionArtifact) {
+ smaArts.addAll(((ActionArtifact) selectedObject).getTeamWorkFlowArtifacts());
+ } else {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Expected selection to be of type Artifact");
+ }
+ }
+ }
+ return smaArts;
+ }
+
+ public static Result export(ISelection selection, ExportOption... exportOption) throws OseeCoreException {
+ return export(getSmaArts(selection), exportOption);
+ }
+
+ public static Result export(Collection<? extends Artifact> artifacts, ExportOption... exportOption) throws OseeCoreException {
+ Collection<ExportOption> exportOptions = Collections.getAggregate(exportOption);
+ if (exportOptions.contains(ExportOption.POPUP_DIALOG)) {
+ AtsExportWizard exportWizard = new AtsExportWizard(getSmaArts(artifacts));
+ WizardDialog dialog =
+ new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), exportWizard);
+ if (dialog.open() == WizardDialog.OK) {
+ Collection<ExportOption> selectedExportOptions = exportWizard.getSelectedExportOptions();
+ boolean singleFile = selectedExportOptions.contains(ExportOption.MERGE_INTO_SINGLE_FILE);
+ boolean asHtmlToFile = selectedExportOptions.contains(ExportOption.AS_HTML_TO_FILE);
+ boolean asHtmlToResultEditor = selectedExportOptions.contains(ExportOption.AS_HTML_TO_RESULT_EDITOR);
+ boolean multipleFile = selectedExportOptions.contains(ExportOption.SAVE_INTO_SEPARATE_FILES);
+ boolean includeTaskList = selectedExportOptions.contains(ExportOption.INCLUDE_TASKLIST);
+ if (asHtmlToFile || asHtmlToResultEditor) {
+ StringBuffer singleSb = new StringBuffer();
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof StateMachineArtifact) {
+ SMAEditor.editArtifact((StateMachineArtifact) artifact, true);
+ SMAEditor editor = SMAEditor.getSmaEditor((StateMachineArtifact) artifact);
+ SMAPrint smaPrint =
+ new SMAPrint(((StateMachineArtifact) artifact).getSmaMgr(), editor.getWorkFlowTab(),
+ (includeTaskList ? editor.getTaskComposite() : null));
+ String html = smaPrint.getResultData().getReport("").getManipulatedHtml();
+ editor.closeEditor();
+ if (multipleFile) {
+ try {
+ if (asHtmlToFile) {
+ File file =
+ new File(
+ exportWizard.getFileLocation() + "\\" + artifact.getHumanReadableId() + ".html");
+ Lib.writeStringToFile(html, file);
+ }
+ if (asHtmlToResultEditor) {
+ ResultsEditor.open("Output", "Export " + artifact.getHumanReadableId(), html);
+ }
+ } catch (IOException ex) {
+ throw new OseeCoreException("Error writing to html file", ex);
+ }
+ }
+ if (singleFile) {
+ singleSb.append(html + AHTML.newline(3));
+ }
+ }
+ }
+ if (singleFile) {
+ try {
+ if (asHtmlToFile) {
+ File file = new File(exportWizard.getFileLocation() + "\\ATS_Export.html");
+ Lib.writeStringToFile(singleSb.toString(), file);
+ }
+ if (asHtmlToResultEditor) {
+ ResultsEditor.open("Output", "Export ATS Artifacts", singleSb.toString());
+ }
+ } catch (IOException ex) {
+ throw new OseeCoreException("Error writing to html file", ex);
+ }
+ }
+ AWorkbench.popup("Export Completed", "Export Completed");
+ }
+ if (selectedExportOptions.contains(ExportOption.AS_PDF)) {
+ AWorkbench.popup("ERROR", "AS_PDF Not Implemented Yet");
+ }
+ }
+ }
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#getMenuItemName()
+ */
+ @Override
+ public String getMenuItemName() throws OseeCoreException {
+ return "Export Selected ATS Artifacts";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#runMenuItem(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public void runMenuItem(WorldEditor worldEditor) throws OseeCoreException {
+ try {
+ AtsExportManager.export(worldEditor.getWorldComposite().getXViewer().getSelection(), ExportOption.POPUP_DIALOG);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportPage.java
new file mode 100644
index 00000000000..718385977fe
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportPage.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.ats.export;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.ats.export.AtsExportManager.ExportOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFileTextWithSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFileTextWithSelectionDialog.Type;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsExportPage extends WizardDataTransferPage {
+ MouseMoveListener listener;
+ Label errorLabel;
+ List<XCheckBox> checkBoxes = new ArrayList<XCheckBox>();
+ XFileTextWithSelectionDialog xFileSel;
+ String fileLocation;
+ Collection<ExportOption> selectedExportOptions = new ArrayList<ExportOption>();
+ private final Collection<? extends Artifact> artifacts;
+
+ public AtsExportPage(IStructuredSelection selection) throws OseeCoreException {
+ super("Main");
+ this.artifacts = AtsExportManager.getSmaArts(selection);
+ }
+
+ public AtsExportPage(Collection<? extends Artifact> artifacts) {
+ super("Main");
+ this.artifacts = artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.WizardDataTransferPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+ setTitle("Export ATS Artifacts");
+ setMessage("Select export options and export location.");
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ Label label = new Label(composite, SWT.NONE);
+ if (artifacts.size() == 0) {
+ label.setText("Error: No ATS Artifacts input. Close wizard and re-perform selection.");
+ label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ label.setText("Selected " + artifacts.size() + " ATS Artifact to export.");
+ }
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ gridData.horizontalSpan = 2;
+ label.setLayoutData(gridData);
+
+ XModifiedListener modifyListener = new XModifiedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener#widgetModified(org.eclipse.osee.framework.ui.skynet.widgets.XWidget)
+ */
+ @Override
+ public void widgetModified(XWidget widget) {
+ handleModified();
+ }
+ };
+
+ List<ExportOption> validExportOptions = new ArrayList<ExportOption>();
+ validExportOptions.addAll(Arrays.asList(ExportOption.values()));
+ validExportOptions.remove(ExportOption.POPUP_DIALOG);
+ validExportOptions.remove(ExportOption.NONE);
+
+ for (ExportOption exportOption : validExportOptions) {
+ XCheckBox checkBox = new XCheckBox(exportOption.name());
+ checkBox.setLabelAfter(true);
+ checkBox.createWidgets(composite, 2);
+ if (selectedExportOptions.contains(exportOption)) {
+ checkBox.set(true);
+ }
+ checkBox.addXModifiedListener(modifyListener);
+ checkBoxes.add(checkBox);
+ }
+
+ xFileSel = new XFileTextWithSelectionDialog("Export Location", Type.Directory);
+ xFileSel.createWidgets(composite, 2);
+ xFileSel.addXModifiedListener(modifyListener);
+
+ setPageComplete(determinePageCompletion());
+ setControl(composite);
+ }
+
+ public Result isEntryValid() {
+ if (artifacts.size() == 0) {
+ return new Result("No Artifacts selected. Cancel wizard and try again.");
+ }
+ if (!selectedExportOptions.contains(ExportOption.AS_HTML_TO_FILE) && !selectedExportOptions.contains(ExportOption.AS_HTML_TO_RESULT_EDITOR) && !selectedExportOptions.contains(ExportOption.AS_PDF)) {
+ return new Result("Must select at least one export AS_ option.");
+ }
+ if (!selectedExportOptions.contains(ExportOption.MERGE_INTO_SINGLE_FILE) && !selectedExportOptions.contains(ExportOption.SAVE_INTO_SEPARATE_FILES)) {
+ return new Result("Must select \"MERGE_INTO_SINGLE_FILE\" or \"SAVE_INTO_SEPARATE_FILES\"");
+ }
+ if (selectedExportOptions.contains(ExportOption.AS_HTML_TO_FILE) || selectedExportOptions.contains(ExportOption.AS_PDF)) {
+ if (xFileSel.get().equals("")) {
+ return new Result(
+ "Must select \"Export Location\" for \"" + ExportOption.AS_HTML_TO_FILE + "\" or \"" + ExportOption.AS_PDF + "\" options.");
+ }
+ if (!(new File(xFileSel.get())).isDirectory()) {
+ return new Result("Invalid Directory");
+ }
+ }
+ return Result.TrueResult;
+ }
+
+ public void handleModified() {
+ for (XCheckBox checkBox : checkBoxes) {
+ ExportOption exportOption = ExportOption.valueOf(checkBox.getLabel());
+ if (checkBox.isSelected()) {
+ selectedExportOptions.add(exportOption);
+ } else {
+ selectedExportOptions.remove(exportOption);
+ }
+ }
+ fileLocation = xFileSel.get();
+ }
+
+ /**
+ * @return the selectedExportOptions
+ */
+ public Collection<ExportOption> getSelectedExportOptions() {
+ return selectedExportOptions;
+ }
+
+ /**
+ * @return the fileLocation
+ */
+ public String getFileLocation() {
+ return fileLocation;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportRenderer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportRenderer.java
new file mode 100644
index 00000000000..b6e6b9b3330
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportRenderer.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.ats.export;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.export.AtsExportManager.ExportOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AtsExportRenderer extends DefaultArtifactRenderer {
+ private static final String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.atsexport.command";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getCommandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add(COMMAND_ID);
+ }
+
+ return commandIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getImage()
+ */
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getImage(FrameworkImage.EXPORT_DATA);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "ATS Artifact Export";
+ }
+
+ /**
+ * @param rendererId
+ */
+ public AtsExportRenderer() {
+ super();
+ }
+
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ AtsExportManager.export(artifacts, ExportOption.POPUP_DIALOG);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public AtsExportRenderer newInstance() throws OseeCoreException {
+ return new AtsExportRenderer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#isValidFor(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if (artifact instanceof IATSArtifact && (!artifact.isHistorical())) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#preview(java.util.List)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ open(artifacts);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ return NO_MATCH;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportWizard.java
new file mode 100644
index 00000000000..2c23ee3ac86
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/export/AtsExportWizard.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.ats.export;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.export.AtsExportManager.ExportOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsExportWizard extends Wizard implements IExportWizard {
+ private AtsExportPage mainPage;
+ private final Collection<? extends Artifact> artifacts;
+
+ public AtsExportWizard() {
+ this.artifacts = null;
+ }
+
+ public AtsExportWizard(Collection<? extends Artifact> artifacts) {
+ this.artifacts = artifacts;
+ }
+
+ /**
+ * @return the fileLocation
+ */
+ public String getFileLocation() {
+ return mainPage.getFileLocation();
+ }
+
+ /**
+ * @return the selectedExportOptions
+ */
+ public Collection<ExportOption> getSelectedExportOptions() {
+ return mainPage.getSelectedExportOptions();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+
+ Result result = mainPage.isEntryValid();
+ if (result.isFalse()) {
+ result.popup();
+ return false;
+ }
+ try {
+ AtsExportManager.export(artifacts, mainPage.getSelectedExportOptions().toArray(
+ new ExportOption[mainPage.getSelectedExportOptions().size()]));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ try {
+ mainPage = new AtsExportPage(selection);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#addPages()
+ */
+ @Override
+ public void addPages() {
+ if (mainPage == null) {
+ mainPage = new AtsExportPage(artifacts);
+ }
+ addPage(mainPage);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsEditorHandler.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsEditorHandler.java
new file mode 100644
index 00000000000..3a234824e85
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsEditorHandler.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.ats.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ats.editor.AtsWorkflowRenderer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AtsEditorHandler extends AbstractEditorHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ AtsWorkflowRenderer renderer = new AtsWorkflowRenderer();
+ try {
+ renderer.open(artifacts);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsEditorHandler.class, Level.SEVERE, ex);
+ }
+ dispose();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsExportHandler.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsExportHandler.java
new file mode 100644
index 00000000000..e737602cdc7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsExportHandler.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.ats.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ats.export.AtsExportRenderer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AtsExportHandler extends AbstractEditorHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ AtsExportRenderer renderer = new AtsExportRenderer();
+ try {
+ renderer.open(artifacts);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsEditorHandler.class, Level.SEVERE, ex);
+ }
+ dispose();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsTaskEditorHandler.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsTaskEditorHandler.java
new file mode 100644
index 00000000000..ec629bc54ea
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsTaskEditorHandler.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.ats.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ats.editor.AtsTaskEditorRenderer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AtsTaskEditorHandler extends AbstractEditorHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ AtsTaskEditorRenderer renderer = new AtsTaskEditorRenderer();
+ try {
+ renderer.open(artifacts);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsEditorHandler.class, Level.SEVERE, ex);
+ }
+ dispose();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsWorldEditorHandler.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsWorldEditorHandler.java
new file mode 100644
index 00000000000..18a40decd71
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/handlers/AtsWorldEditorHandler.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.ats.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ats.editor.AtsWorldEditorRenderer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AtsWorldEditorHandler extends AbstractEditorHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ AtsWorldEditorRenderer renderer = new AtsWorldEditorRenderer();
+ try {
+ renderer.open(artifacts);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsEditorHandler.class, Level.SEVERE, ex);
+ }
+ dispose();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ChangeReportComparer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ChangeReportComparer.java
new file mode 100644
index 00000000000..c03528a8d7b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ChangeReportComparer.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.ats.health;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * Compares two change reports to see if the match.
+ *
+ * @author Jeff C. Phillips
+ *
+ */
+public class ChangeReportComparer {
+ private static final String ART = "(<ArtChg>.*?</ArtChg>)";
+ private static final String ATTR = "(<AttrChg>.*?</AttrChg>)";
+ private static final String REL = "(<RelChg>.*?</RelChg>)";
+
+ /**
+ * Compares two change report strings by parsing them and comparing each artifact change, attribute change and relation change.
+ * @param changeReport1
+ * @param changeReport2
+ * @return Returns true if the change reports matches else false.
+ */
+ public boolean compare(String changeReport1, String changeReport2){
+ boolean success = true;
+ ArrayList<ArrayList<String>> data1List = parse(changeReport1);
+ ArrayList<ArrayList<String>> data2List = parse(changeReport2);
+
+ if(data1List.size() != data2List.size() || data1List.get(0).size() != data2List.get(0).size() || data1List.get(1).size() != data2List.get(1).size()
+ || data1List.get(2).size() != data2List.get(2).size()){
+ throw new IllegalArgumentException("The change reports must have the same number of items");
+ }
+ try{
+ for(int i = 0; i < data1List.size() ; i++){
+ for(int j = 0; j < data1List.get(i).size() ; j++){
+ if(! data1List.get(i).get(j).equals(data2List.get(i).get(j))){
+ success = false;
+ System.err.println(data1List.get(i).get(j));
+ System.err.println(data2List.get(i).get(j));
+ System.err.println("---------------------------------------------------");
+ }
+ }
+ }}
+ catch(Exception ex){
+ ex.getLocalizedMessage();
+ }
+ return success;
+ }
+
+ /**
+ *
+ * @param changeReportString
+ * @return Returns Three ArrayLists. 0 index for artifact changes, 1 index for attribute changes and 2 index for relation changes.
+ */
+ public ArrayList<ArrayList<String>> parse(String changeReportString) {
+ ArrayList<ArrayList<String>> changeLists = new ArrayList<ArrayList<String>>(3);
+ ArrayList<String> artifactChanges = new ArrayList<String>();
+ ArrayList<String> attrChanges = new ArrayList<String>();
+ ArrayList<String> relChanges = new ArrayList<String>();
+
+ Matcher artChangeMatch = Pattern.compile(ART).matcher(changeReportString);
+
+ while (artChangeMatch.find()) {
+ artifactChanges.add(artChangeMatch.group(0));
+ }
+
+ Matcher attrChangeMatch = Pattern.compile(ATTR).matcher(changeReportString);
+
+ while (attrChangeMatch.find()) {
+ attrChanges.add(attrChangeMatch.group(0));
+ }
+
+ Matcher relChangeMatch = Pattern.compile(REL).matcher(changeReportString);
+
+ while (relChangeMatch.find()) {
+ relChanges.add(relChangeMatch.group(0));
+ }
+
+ Collections.sort(artifactChanges);
+ Collections.sort(attrChanges);
+ Collections.sort(relChanges);
+
+ changeLists.add(artifactChanges);
+ changeLists.add(attrChanges);
+ changeLists.add(relChanges);
+
+ return changeLists;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/TxImportedValidateChangeReports.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/TxImportedValidateChangeReports.java
new file mode 100644
index 00000000000..b274b5ca6d8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/TxImportedValidateChangeReports.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.health;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.GeneralData;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TxImportedValidateChangeReports extends AbstractBlam {
+
+ private static final String[] ARTIFACT_ID_ALIASES = new String[] {"artId", "bArtId", "aOrdr", "bOrdr"};
+ private static final String BRANCH_ID_ALIASES = "brId";
+ private static final String GAMMA_ID_ALIASES = "gamma";
+ private static final String[] TRANSACTION_ID_ALIASES = new String[] {"tTranId", "fTranId"};
+ private static final String ARTIFACT_TYPE_ID = "artTId";
+ private static final String ATTRIBUTE_TYPE_ID = "attrTId";
+ private static final String RELATION_TYPE_ID = "relTId";
+ private static final String ATTRIBUTE_ID = "attrId";
+ private static final String RELATION_ID = "relId";
+ private static final String EMPTY_STRING = "";
+
+ private static final String VCR_ROOT_ELEMENT_TAG = ValidateChangeReports.VCR_ROOT_ELEMENT_TAG;
+ private static final String VCR_DB_GUID = ValidateChangeReports.VCR_DB_GUID;
+
+ private static final Matcher NUMERICAL_MATCH = Pattern.compile("\\d+").matcher(EMPTY_STRING);
+ private static final Matcher SOURCE_DB_GUID_MATCHER =
+ Pattern.compile("\\s*<" + VCR_ROOT_ELEMENT_TAG + "\\s*" + VCR_DB_GUID + "=\"(.*?)\"\\s*>").matcher(
+ EMPTY_STRING);
+ private static final Matcher XML_TAGGED_IDS_MATCHER = Pattern.compile("<(.*?)>(\\d+)</(.*?)>").matcher(EMPTY_STRING);
+
+ private Map<String, ImportedId> translatorMap;
+ private String currentDbGuid;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Tx Imported Validate Change Reports";
+ }
+
+ private void setup(String databaseTargetId) throws OseeDataStoreException {
+ List<ImportedId> importtedIds = getImportedIds();
+ for (ImportedId importedId : importtedIds) {
+ print(importedId.getSequence() + "\n");
+ importedId.load(databaseTargetId);
+ }
+
+ this.translatorMap = new HashMap<String, ImportedId>();
+ for (ImportedId translator : importtedIds) {
+ for (String alias : translator.getAliases()) {
+ translatorMap.put(alias, translator);
+ }
+ }
+
+ this.currentDbGuid = OseeInfo.getValue("osee.db.guid");
+ }
+
+ private void cleanUp() {
+ if (translatorMap != null && !translatorMap.isEmpty()) {
+ for (String key : translatorMap.keySet()) {
+ translatorMap.get(key).clear();
+ }
+ translatorMap.clear();
+ }
+ this.currentDbGuid = null;
+ }
+
+ private List<ImportedId> getImportedIds() {
+ List<ImportedId> translators = new ArrayList<ImportedId>();
+ translators.add(new ImportedId(SequenceManager.GAMMA_ID_SEQ, GAMMA_ID_ALIASES));
+ translators.add(new ImportedId(SequenceManager.TRANSACTION_ID_SEQ, TRANSACTION_ID_ALIASES));
+ translators.add(new ImportedId(SequenceManager.BRANCH_ID_SEQ, BRANCH_ID_ALIASES));
+ translators.add(new ImportedId(SequenceManager.ART_TYPE_ID_SEQ, ARTIFACT_TYPE_ID));
+ translators.add(new ImportedId(SequenceManager.ATTR_TYPE_ID_SEQ, ATTRIBUTE_TYPE_ID));
+ translators.add(new ImportedId(SequenceManager.REL_LINK_TYPE_ID_SEQ, RELATION_TYPE_ID));
+ translators.add(new ImportedId(SequenceManager.ART_ID_SEQ, ARTIFACT_ID_ALIASES));
+ translators.add(new ImportedId(SequenceManager.ATTR_ID_SEQ, ATTRIBUTE_ID));
+ translators.add(new ImportedId(SequenceManager.REL_LINK_ID_SEQ, RELATION_ID));
+ return translators;
+ }
+
+ private long translate(String tag, long original) {
+ long toReturn = original;
+ if (Strings.isValid(tag)) {
+ ImportedId importedId = translatorMap.get(tag);
+ if (importedId != null) {
+ toReturn = importedId.getFromCache(original);
+ }
+ }
+ return toReturn;
+ }
+
+ private String getDataDbGuid(String data) {
+ String toReturn = null;
+ SOURCE_DB_GUID_MATCHER.reset(data);
+ if (SOURCE_DB_GUID_MATCHER.find()) {
+ toReturn = SOURCE_DB_GUID_MATCHER.group(1);
+ }
+ return toReturn != null ? toReturn : EMPTY_STRING;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ try {
+ Branch branch = AtsPlugin.getAtsBranch();
+ String databaseTargetId = variableMap.getString("Import Db Id");
+ boolean shouldIncludeItemsWithoutDbId = variableMap.getBoolean("Include items without database id");
+ if (!Strings.isValid(databaseTargetId)) {
+ throw new OseeArgumentException("Invalid database target id");
+ }
+
+ databaseTargetId = databaseTargetId.trim();
+ setup(databaseTargetId);
+
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ List<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromTypeAndName(GeneralData.ARTIFACT_TYPE, "VCR_%", branch);
+ for (Artifact artifact : artifacts) {
+ String data = artifact.getSoleAttributeValue(GeneralData.GENERAL_STRING_ATTRIBUTE_TYPE_NAME);
+ String name = artifact.getDescriptiveName();
+ try {
+ String dataDbGuid = getDataDbGuid(data);
+ if (Strings.isValid(dataDbGuid) || shouldIncludeItemsWithoutDbId) {
+ if (databaseTargetId.equals(dataDbGuid) || shouldIncludeItemsWithoutDbId) {
+ if (!currentDbGuid.equals(dataDbGuid)) {
+ String modified = translateImportedData(data);
+ modified = updateSourceGuid(currentDbGuid, modified);
+ artifact.setSoleAttributeValue(GeneralData.GENERAL_STRING_ATTRIBUTE_TYPE_NAME, modified);
+ artifact.persistAttributes(transaction);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeCoreException(String.format("Error processing [%s]", name), ex);
+ }
+ }
+ transaction.execute();
+ } finally {
+ cleanUp();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XText\" displayName=\"Import Db Id\" defaultValue=\"AAABHL_5XvkAFHT8QsrrPQ\"/>");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Include items without database id\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private static boolean isNumerical(String value) {
+ boolean result = false;
+ if (Strings.isValid(value)) {
+ NUMERICAL_MATCH.reset(value);
+ result = NUMERICAL_MATCH.matches();
+ }
+ return result;
+ }
+
+ private String translateImportedData(String data) {
+ ChangeSet changeSet = new ChangeSet(data);
+ XML_TAGGED_IDS_MATCHER.reset(data);
+ while (XML_TAGGED_IDS_MATCHER.find()) {
+ String tag = XML_TAGGED_IDS_MATCHER.group(3);
+ tag = tag.toLowerCase().trim();
+ String value = XML_TAGGED_IDS_MATCHER.group(2);
+ if (isNumerical(value)) {
+ long original = Long.parseLong(value);
+ long newValue = translate(tag, original);
+ if (original != newValue) {
+ changeSet.replace(XML_TAGGED_IDS_MATCHER.start(2), XML_TAGGED_IDS_MATCHER.end(2),
+ Long.toString(newValue));
+ }
+ }
+ }
+ return changeSet.applyChangesToSelf().toString();
+ }
+
+ private String updateSourceGuid(String currentDbGuid, String data) throws OseeStateException {
+ String toReturn = null;
+ ChangeSet changeSet = new ChangeSet(data);
+ SOURCE_DB_GUID_MATCHER.reset(data);
+ if (SOURCE_DB_GUID_MATCHER.find()) {
+ String id = SOURCE_DB_GUID_MATCHER.group(1);
+ if (!currentDbGuid.equals(id)) {
+ changeSet.replace(SOURCE_DB_GUID_MATCHER.start(1), SOURCE_DB_GUID_MATCHER.end(1), currentDbGuid);
+ toReturn = changeSet.applyChangesToSelf().toString();
+ } else {
+ toReturn = data;
+ }
+ } else {
+ if (!data.contains(VCR_ROOT_ELEMENT_TAG)) {
+ toReturn =
+ String.format("<%s dbGuid=\"%s\">%s</%s>", VCR_ROOT_ELEMENT_TAG, currentDbGuid, data,
+ VCR_ROOT_ELEMENT_TAG);
+ } else {
+ throw new OseeStateException("Error updating dbId");
+ }
+ }
+ return toReturn;
+ }
+ private final class ImportedId {
+ private static final String SELECT_IDS_BY_DB_SOURCE_AND_SEQ_NAME =
+ "SELECT original_id, mapped_id FROM osee_import_source ois, osee_import_map oim, osee_import_index_map oiim WHERE ois.import_id = oim.import_id AND oim.sequence_id = oiim.sequence_id AND oiim.sequence_id = oiim.sequence_id AND ois.db_source_guid = ? AND oim.sequence_name = ?";
+
+ private final String sequenceName;
+ private final Map<Long, Long> originalToMapped;
+ private final Set<String> aliases;
+
+ ImportedId(String sequenceName, String... aliases) {
+ this.sequenceName = sequenceName;
+ this.originalToMapped = new HashMap<Long, Long>();
+ this.aliases = new HashSet<String>();
+ if (aliases != null && aliases.length > 0) {
+ for (String alias : aliases) {
+ this.aliases.add(alias.toLowerCase());
+ }
+ }
+ }
+
+ public void clear() {
+ this.originalToMapped.clear();
+ this.aliases.clear();
+ }
+
+ public boolean hasAliases() {
+ return this.aliases.size() > 0;
+ }
+
+ public Set<String> getAliases() {
+ return this.aliases;
+ }
+
+ public String getSequence() {
+ return this.sequenceName;
+ }
+
+ public Long getFromCache(Long original) {
+ Long newVersion = null;
+ if (original <= 0L) {
+ newVersion = original;
+ } else {
+ newVersion = this.originalToMapped.get(original);
+ }
+ return newVersion;
+ }
+
+ public void load(String sourceDatabaseId) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ originalToMapped.clear();
+ chStmt.runPreparedQuery(10000, SELECT_IDS_BY_DB_SOURCE_AND_SEQ_NAME, sourceDatabaseId, getSequence());
+ while (chStmt.next()) {
+ originalToMapped.put(chStmt.getLong("original_id"), chStmt.getLong("mapped_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS.Admin");
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateAtsDatabase.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateAtsDatabase.java
new file mode 100644
index 00000000000..cd41811afe6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateAtsDatabase.java
@@ -0,0 +1,558 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.health;
+
+import java.util.Arrays;
+import java.util.Collection;
+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.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.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ATSLog;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.task.TaskEditorSimpleProvider;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.SMAState;
+import org.eclipse.osee.ats.util.widgets.XCurrentStateDam;
+import org.eclipse.osee.ats.util.widgets.XStateDam;
+import org.eclipse.osee.ats.world.WorldXNavigateItemAction;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ValidateAtsDatabase extends WorldXNavigateItemAction {
+
+ private boolean fixAssignees = true;
+ private boolean fixAttributeValues = true;
+ private final Set<String> hrids = new HashSet<String>();
+ private final Map<String, String> legacyPcrIdToParentHrid = new HashMap<String, String>();
+
+ /**
+ * @param parent
+ * @throws OseeArgumentException
+ */
+ public ValidateAtsDatabase(XNavigateItem parent) throws OseeArgumentException {
+ this("Validate ATS Database", parent);
+ }
+
+ public ValidateAtsDatabase(String name, XNavigateItem parent) throws OseeArgumentException {
+ super(parent, name, FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+ Jobs.startJob(new Report(getName()), true);
+ }
+
+ public class Report extends Job {
+
+ public Report(String name) {
+ super(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final XResultData rd = new XResultData();
+ runIt(monitor, rd);
+ rd.report(getName());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+ private Collection<Artifact> artifacts;
+ private XResultData xResultData;
+ private IProgressMonitor monitor;
+
+ public void runIt(IProgressMonitor monitor, XResultData xResultData) throws OseeCoreException {
+ this.monitor = monitor;
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ this.xResultData = xResultData;
+ if (monitor != null) monitor.beginTask(getName(), 20);
+ loadAtsBranchArtifacts();
+ // testArtifactIds();
+ testAtsAttributeValues();
+ // testAtsActionsHaveTeamWorkflow();
+ // testAtsWorkflowsHaveAction();
+ // testAtsWorkflowsHaveZeroOrOneVersion();
+ // testTasksHaveParentWorkflow();
+ // testReviewsHaveParentWorkflowOrActionableItems();
+ // testReviewsHaveValidDefectAndRoleXml();
+ // testTeamWorkflows();
+ // testTeamDefinitions();
+ // testVersionArtifacts();
+ // testStateMachineAssignees();
+ // testAtsLogs();
+ this.xResultData.reportSevereLoggingMonitor(monitorLog);
+ if (monitor != null) xResultData.log(monitor, "Completed processing " + artifacts.size() + " artifacts.");
+ }
+
+ private void testArtifactIds() throws OseeCoreException {
+ xResultData.log(monitor, "testArtifactIds");
+ this.hrids.clear();
+ this.legacyPcrIdToParentHrid.clear();
+ for (Artifact artifact : artifacts) {
+ // Check that HRIDs not duplicated on Common branch
+ if (hrids.contains(artifact.getHumanReadableId())) {
+ xResultData.logError("Duplicate HRIDs: " + XResultData.getHyperlink(artifact));
+ }
+ // Check that duplicate Legacy PCR IDs team arts do not exist with different parent actions
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) artifact;
+ String legacyPcrId =
+ artifact.getSoleAttributeValueAsString(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName(), null);
+ if (legacyPcrId != null) {
+ if (legacyPcrIdToParentHrid.containsKey(legacyPcrId)) {
+ if (!legacyPcrIdToParentHrid.get(legacyPcrId).equals(
+ teamArt.getParentActionArtifact().getHumanReadableId())) {
+ xResultData.logError("Duplicate Legacy PCR Ids in Different Actions: " + legacyPcrId);
+ }
+ } else {
+ legacyPcrIdToParentHrid.put(legacyPcrId, teamArt.getParentActionArtifact().getHumanReadableId());
+ }
+ }
+ }
+ }
+ }
+
+ private void testVersionArtifacts() throws OseeCoreException {
+ xResultData.log(monitor, "testVersionArtifacts");
+ for (Artifact art : artifacts) {
+ if (art instanceof VersionArtifact) {
+ VersionArtifact verArt = (VersionArtifact) art;
+ try {
+ String parentBranchId =
+ verArt.getSoleAttributeValueAsString(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(), null);
+ if (parentBranchId != null) {
+ validateBranchId(verArt, parentBranchId);
+ }
+ } catch (Exception ex) {
+ xResultData.logError(verArt.getArtifactTypeName() + " " + XResultData.getHyperlink(verArt) + " exception testing testVersionArtifacts: " + ex.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ private void testTeamDefinitions() throws OseeCoreException {
+ xResultData.log(monitor, "testTeamDefinitions");
+ for (Artifact art : artifacts) {
+ if (art instanceof TeamDefinitionArtifact) {
+ TeamDefinitionArtifact teamDef = (TeamDefinitionArtifact) art;
+ try {
+ String parentBranchId =
+ teamDef.getSoleAttributeValueAsString(ATSAttributes.PARENT_BRANCH_ID_ATTRIBUTE.getStoreName(),
+ null);
+ if (parentBranchId != null) {
+ validateBranchId(teamDef, parentBranchId);
+ }
+ } catch (Exception ex) {
+ xResultData.logError(teamDef.getArtifactTypeName() + " " + XResultData.getHyperlink(teamDef) + " exception testing testTeamDefinitions: " + ex.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ private void testTeamWorkflows() throws OseeCoreException {
+ xResultData.log(monitor, "testTeamWorkflows");
+ for (Artifact art : artifacts) {
+ if (art instanceof TeamWorkFlowArtifact) {
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) art;
+ try {
+ if (teamArt.getActionableItemsDam().getActionableItems().size() == 0) {
+ xResultData.logError("TeamWorkflow " + XResultData.getHyperlink(teamArt) + " has 0 ActionableItems");
+ }
+ if (teamArt.getTeamDefinition() == null) {
+ xResultData.logError("TeamWorkflow " + XResultData.getHyperlink(teamArt) + " has no TeamDefinition");
+ }
+ } catch (Exception ex) {
+ xResultData.logError(teamArt.getArtifactTypeName() + " " + XResultData.getHyperlink(teamArt) + " exception testing testTeamWorkflows: " + ex.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ private void validateBranchId(Artifact art, String parentBranchId) throws OseeCoreException {
+ try {
+ Branch branch = BranchManager.getBranch(new Integer(parentBranchId));
+ if (branch.isArchived()) {
+ xResultData.logError(String.format("Parent Branch Id [%s][%s] can't be Archived branch for [%s][%s]",
+ parentBranchId, branch, art.getHumanReadableId(), art));
+ } else if (branch.isWorkingBranch()) {
+ xResultData.logError(String.format("Parent Branch Id [%s][%s] can't be Working branch for [%s][%s]",
+ parentBranchId, branch, art.getHumanReadableId(), art));
+ } else if (!branch.isBaselineBranch()) {
+ xResultData.logError(String.format("Parent Branch Id [%s][%s] must be Baseline branch for [%s][%s]",
+ parentBranchId, branch, art.getHumanReadableId(), art));
+ }
+ } catch (BranchDoesNotExist ex) {
+ xResultData.logError(String.format("Parent Branch Id [%s] references non-existant branch for [%s][%s]",
+ parentBranchId, art.getHumanReadableId(), art));
+ }
+ }
+
+ private void loadAtsBranchArtifacts() throws OseeCoreException {
+ xResultData.log(monitor, "testLoadAllCommonArtifacts - Started " + XDate.getDateNow(XDate.MMDDYYHHMM));
+ artifacts = ArtifactQuery.getArtifactsFromBranch(AtsPlugin.getAtsBranch(), false);
+ if (xResultData == null) {
+ xResultData = new XResultData();
+ }
+ if (artifacts.size() == 0) {
+ xResultData.logError("Artifact load returned 0 artifacts to check");
+ }
+ xResultData.log(monitor, "testLoadAllCommonArtifacts - Completed " + XDate.getDateNow(XDate.MMDDYYHHMM));
+ }
+
+ private void testAtsAttributeValues() throws OseeCoreException {
+ xResultData.log(monitor, "testAtsAttributeValues");
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (Artifact artifact : artifacts) {
+
+ // Test for null attribute values
+ for (Attribute<?> attr : artifact.getAttributes(false)) {
+ if (attr.getValue() == null) {
+ xResultData.logError("Artifact: " + XResultData.getHyperlink(artifact) + " Types: " + artifact.getArtifactTypeName() + " - Null Attribute");
+ if (fixAttributeValues) {
+ attr.delete();
+ }
+ }
+ }
+
+ if (artifact instanceof StateMachineArtifact) {
+ try {
+ artifact.getSoleAttributeValue(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ } catch (AttributeDoesNotExist ex) {
+ // do nothing
+ } catch (MultipleAttributesExist ex) {
+ xResultData.logError("Artifact: " + XResultData.getHyperlink(artifact) + " Multiple resolution attributes exist");
+ }
+ }
+
+ // Test for ats.State Completed;;;<num> or Cancelled;;;<num> and cleanup
+ if (artifact instanceof StateMachineArtifact) {
+ XStateDam stateDam = new XStateDam((StateMachineArtifact) artifact);
+ for (SMAState state : stateDam.getStates()) {
+ if (state.getName().equals(DefaultTeamState.Completed.name()) || state.getName().equals(
+ state.getName().equals(DefaultTeamState.Cancelled.name()))) {
+ if (state.getHoursSpent() != 0.0 || state.getPercentComplete() != 0) {
+ xResultData.logError("ats.State error for SMA: " + XResultData.getHyperlink(artifact) + " State: " + state.getName() + " Hours Spent: " + state.getHoursSpentStr() + " Percent: " + state.getPercentComplete());
+ if (fixAttributeValues) {
+ state.setHoursSpent(0);
+ state.setPercentComplete(0);
+ stateDam.setState(state);
+ xResultData.log(monitor, "Fixed");
+ }
+ }
+ }
+ }
+ }
+
+ // Test for ats.CurrentState Completed;;;<num> or Cancelled;;;<num> and cleanup
+ if (artifact instanceof StateMachineArtifact) {
+ XCurrentStateDam currentStateDam = new XCurrentStateDam((StateMachineArtifact) artifact);
+ SMAState state = currentStateDam.getState();
+ if (state.getName().equals(DefaultTeamState.Completed.name()) || state.getName().equals(
+ state.getName().equals(DefaultTeamState.Cancelled.name()))) {
+ if (state.getHoursSpent() != 0.0 || state.getPercentComplete() != 0) {
+ xResultData.logError("ats.CurrentState error for SMA: " + XResultData.getHyperlink(artifact) + " State: " + state.getName() + " Hours Spent: " + state.getHoursSpentStr() + " Percent: " + state.getPercentComplete());
+ if (fixAttributeValues) {
+ state.setHoursSpent(0);
+ state.setPercentComplete(0);
+ currentStateDam.setState(state);
+ xResultData.log(monitor, "Fixed");
+ }
+ }
+ }
+ }
+ if (artifact.isDirty()) {
+ artifact.persistAttributes(transaction);
+ }
+ }
+ transaction.execute();
+ }
+
+ private void testAtsActionsHaveTeamWorkflow() throws OseeCoreException {
+ xResultData.log(monitor, "testAtsActionsHaveTeamWorkflow");
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof ActionArtifact) {
+ if (((ActionArtifact) artifact).getTeamWorkFlowArtifacts().size() == 0) {
+ xResultData.logError("Action " + XResultData.getHyperlink(artifact) + " has no Team Workflows\n");
+ }
+ }
+ }
+ }
+
+ private void testAtsWorkflowsHaveAction() throws OseeCoreException {
+ xResultData.log(monitor, "testAtsActionsHaveTeamWorkflow");
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ if (((TeamWorkFlowArtifact) artifact).getParentActionArtifact() == null) {
+ xResultData.logError("Team " + XResultData.getHyperlink(artifact) + " has no parent Action\n");
+ }
+ }
+ }
+ }
+
+ private void testAtsWorkflowsHaveZeroOrOneVersion() throws OseeCoreException {
+ xResultData.log(monitor, "testAtsWorkflowsHaveZeroOrOneVersion");
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) artifact;
+ if (teamArt.getRelatedArtifacts(AtsRelation.TeamWorkflowTargetedForVersion_Version).size() > 1) {
+ xResultData.logError("Team workflow " + XResultData.getHyperlink(teamArt) + " has " + teamArt.getRelatedArtifacts(
+ AtsRelation.TeamWorkflowTargetedForVersion_Version).size() + " versions");
+ }
+ }
+ }
+
+ }
+
+ private void testTasksHaveParentWorkflow() throws OseeCoreException {
+ xResultData.log(monitor, "testTasksHaveParentWorkflow");
+ Set<Artifact> badTasks = new HashSet<Artifact>(30);
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof TaskArtifact) {
+ TaskArtifact taskArtifact = (TaskArtifact) artifact;
+ if (taskArtifact.getRelatedArtifacts(AtsRelation.SmaToTask_Sma).size() != 1) {
+ xResultData.logError("Task " + XResultData.getHyperlink(taskArtifact) + " has " + taskArtifact.getRelatedArtifacts(
+ AtsRelation.SmaToTask_Sma).size() + " parents.");
+ badTasks.add(taskArtifact);
+ }
+ }
+ }
+ if (badTasks.size() > 0) {
+ TaskEditor.open(new TaskEditorSimpleProvider("ValidateATSDatabase: Tasks have !=1 parent workflows.", badTasks));
+ }
+ }
+
+ private void testReviewsHaveValidDefectAndRoleXml() throws OseeCoreException {
+ xResultData.log(monitor, "testReviewsHaveValidDefectAndRoleXml");
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof ReviewSMArtifact) {
+ ReviewSMArtifact reviewArtifact = (ReviewSMArtifact) artifact;
+ if (reviewArtifact.getAttributes(ATSAttributes.REVIEW_DEFECT_ATTRIBUTE.getStoreName()).size() > 0 && reviewArtifact.getDefectManager().getDefectItems().size() == 0) {
+ xResultData.logError("Review " + XResultData.getHyperlink(reviewArtifact) + " has defect attribute, but no defects (xml parsing error).");
+ }
+ if (reviewArtifact.getAttributes(ATSAttributes.ROLE_ATTRIBUTE.getStoreName()).size() > 0 && reviewArtifact.getUserRoleManager().getUserRoles().size() == 0) {
+ xResultData.logError("Review " + XResultData.getHyperlink(reviewArtifact) + " has role attribute, but no roles (xml parsing error).");
+ }
+ }
+ }
+ }
+
+ private void testReviewsHaveParentWorkflowOrActionableItems() throws OseeCoreException {
+ xResultData.log(monitor, "testReviewsHaveParentWorkflowOrActionableItems");
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof ReviewSMArtifact) {
+ ReviewSMArtifact reviewArtifact = (ReviewSMArtifact) artifact;
+ if (reviewArtifact.getRelatedArtifacts(AtsRelation.TeamWorkflowToReview_Team).size() == 0 && reviewArtifact.getActionableItemsDam().getActionableItemGuids().size() == 0) {
+ xResultData.logError("Review " + XResultData.getHyperlink(reviewArtifact) + " has 0 related parents and 0 actionable items.");
+ }
+ }
+ }
+ }
+
+ private void testAtsLogs() throws OseeCoreException {
+ xResultData.log(monitor, "testAtsLogs");
+ for (Artifact art : artifacts) {
+ if (art instanceof StateMachineArtifact) {
+ StateMachineArtifact sma = (StateMachineArtifact) art;
+ try {
+ ATSLog log = sma.getSmaMgr().getLog();
+ if (log.getOriginator() == null) {
+ try {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " originator == null");
+ } catch (Exception ex) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " exception accessing originator: " + ex.getLocalizedMessage());
+ }
+ }
+ for (String stateName : Arrays.asList("Completed", "Cancelled")) {
+ if (sma.getSmaMgr().getStateMgr().getCurrentStateName().equals(stateName)) {
+ LogItem logItem = log.getStateEvent(LogType.StateEntered, stateName);
+ if (logItem == null) {
+ try {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " state \"" + stateName + "\" logItem == null");
+ } catch (Exception ex) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " exception accessing logItem: " + ex.getLocalizedMessage());
+
+ }
+ }
+ if (logItem.getDate() == null) {
+ try {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " state \"" + stateName + "\" logItem.date == null");
+ } catch (Exception ex) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " exception accessing logItem.date: " + ex.getLocalizedMessage());
+
+ }
+ }
+ }
+ }
+ // Generate html log which will exercise all the conversions
+ log.getHtml();
+ // Verify that all users are resolved
+ for (LogItem logItem : sma.getSmaMgr().getLog().getLogItems()) {
+ if (logItem.getUser() == null) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " user == null for userId \"" + logItem.getUserId() + "\"");
+ }
+ }
+ } catch (Exception ex) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " exception accessing AtsLog: " + ex.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ private void testStateMachineAssignees() throws OseeCoreException {
+ xResultData.log(monitor, "testStateMachineAssignees");
+ User unAssignedUser = UserManager.getUser(SystemUser.UnAssigned);
+ User oseeSystemUser = UserManager.getUser(SystemUser.OseeSystem);
+ for (Artifact art : artifacts) {
+ if (art instanceof StateMachineArtifact) {
+ try {
+ StateMachineArtifact sma = (StateMachineArtifact) art;
+ SMAManager smaMgr = new SMAManager(sma);
+ if ((smaMgr.isCompleted() || smaMgr.isCancelled()) && smaMgr.getStateMgr().getAssignees().size() > 0) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " cancel/complete with attribute assignees");
+ if (fixAssignees) {
+ smaMgr.getStateMgr().clearAssignees();
+ smaMgr.getSma().persistAttributesAndRelations();
+ xResultData.log(monitor, "Fixed");
+ }
+ }
+ if (smaMgr.getStateMgr().getAssignees().size() > 1 && smaMgr.getStateMgr().getAssignees().contains(
+ unAssignedUser)) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " is unassigned and assigned => " + Artifacts.toString(
+ "; ", smaMgr.getStateMgr().getAssignees()));
+ if (fixAssignees) {
+ smaMgr.getStateMgr().removeAssignee(unAssignedUser);
+ xResultData.log(monitor, "Fixed");
+ }
+ }
+ if (smaMgr.getStateMgr().getAssignees().contains(oseeSystemUser)) {
+ xResultData.logError(art.getHumanReadableId() + " is assigned to OseeSystem; invalid assignment - MANUAL FIX REQUIRED");
+ }
+ if ((!smaMgr.isCompleted() && !smaMgr.isCancelled()) && smaMgr.getStateMgr().getAssignees().size() == 0) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " In Work without assignees");
+ }
+ if (art instanceof StateMachineArtifact) {
+ List<Artifact> relationAssigned =
+ art.getRelatedArtifacts(CoreRelationEnumeration.Users_User, Artifact.class);
+ if ((smaMgr.isCompleted() || smaMgr.isCancelled()) && relationAssigned.size() > 0) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " cancel/complete with related assignees");
+ if (fixAssignees) {
+ try {
+ ((StateMachineArtifact) art).updateAssigneeRelations();
+ art.persistAttributesAndRelations();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ xResultData.log(monitor, "Fixed");
+ }
+ } else if (smaMgr.getStateMgr().getAssignees().size() != relationAssigned.size()) {
+ // Make sure this isn't just an UnAssigned user issue (don't relate to unassigned user anymore)
+ if (!(smaMgr.getStateMgr().getAssignees().contains(UserManager.getUser(SystemUser.UnAssigned)) && relationAssigned.size() == 0)) {
+ xResultData.logError(sma.getArtifactTypeName() + " " + XResultData.getHyperlink(sma) + " attribute assignees doesn't match related assignees");
+ if (fixAssignees) {
+ try {
+ ((StateMachineArtifact) art).updateAssigneeRelations();
+ art.persistAttributesAndRelations();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ xResultData.log(monitor, "Fixed");
+ }
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ xResultData.logError("Exception testing assignees: " + ex.getLocalizedMessage());
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param fixAssignees the fixAssignees to set
+ */
+ public void setFixAssignees(boolean fixAssignees) {
+ this.fixAssignees = fixAssignees;
+ }
+
+ /**
+ * @param fixAttributeValues the fixAttributeValues to set
+ */
+ public void setFixAttributeValues(boolean fixAttributeValues) {
+ this.fixAttributeValues = fixAttributeValues;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReportByHrid.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReportByHrid.java
new file mode 100644
index 00000000000..507ebe1450e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReportByHrid.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.ats.health;
+
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryCheckDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ValidateChangeReportByHrid extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ * @throws OseeArgumentException
+ */
+ public ValidateChangeReportByHrid(XNavigateItem parent) throws OseeArgumentException {
+ super(parent, "Validate Change Reports by HRID", FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ EntryCheckDialog ed = new EntryCheckDialog(getName(), "Enter HRID", "Display Was/Is data in Results View.");
+ if (ed.open() == 0) {
+ String hrid = ed.getEntry();
+ if (hrid != null && !hrid.equals("")) {
+ Jobs.startJob(new Report(getName(), hrid, ed.isChecked()), true);
+ }
+ }
+ }
+
+ public class Report extends Job {
+
+ private final String hrid;
+ private final boolean exportWasIs;
+
+ public Report(String name, String hrid, boolean exportWasIs) {
+ super(name);
+ this.hrid = hrid;
+ this.exportWasIs = exportWasIs;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final XResultData rd = new XResultData();
+ try {
+ TeamWorkFlowArtifact teamArt =
+ (TeamWorkFlowArtifact) ArtifactQuery.getArtifactFromId(hrid, AtsPlugin.getAtsBranch());
+ String currentDbGuid = OseeInfo.getValue("osee.db.guid");
+ ValidateChangeReports.changeReportValidated(currentDbGuid, teamArt, rd, exportWasIs);
+ } catch (Exception ex) {
+ rd.logError(ex.getLocalizedMessage());
+ }
+ rd.report(getName());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReports.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReports.java
new file mode 100644
index 00000000000..692302ef9af
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/health/ValidateChangeReports.java
@@ -0,0 +1,356 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.health;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+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.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.GeneralData;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.change.ArtifactChanged;
+import org.eclipse.osee.framework.skynet.core.change.AttributeChanged;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.change.RelationChanged;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeData;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeData.KindType;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * This test will validate the change report data that is returned for the ATS configured actions with committed
+ * branches. Upon first time run against a newly committed branch, it will generate a "General Data" artifact with the
+ * change report data stored to xml in a "General String Data" attribute. <br>
+ * <br>
+ * Every additional time this validation is run against an already stored change report, the current xml and stored xml
+ * change report will be compared. <br>
+ * <br>
+ * If errors are found, the developer will need to put a breakpoint below to see the was-is values of the change report
+ * data.<br>
+ * <br>
+ * This test also ensures that all change reports can return their historical artifacts by loading and accessing the
+ * descriptive name for each artifact.
+ *
+ * @author Donald G. Dunne
+ */
+public class ValidateChangeReports extends XNavigateItemAction {
+
+ static final String VCR_ROOT_ELEMENT_TAG = "ValidateChangeReport";
+ static final String VCR_DB_GUID = "dbGuid";
+
+ /**
+ * @param parent
+ */
+ public ValidateChangeReports(XNavigateItem parent) {
+ super(parent, "Validate Change Reports", FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+ Jobs.startJob(new Report(getName()), true);
+ }
+
+ public class Report extends Job {
+
+ public Report(String name) {
+ super(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final XResultData rd = new XResultData();
+ runIt(monitor, rd);
+ rd.report(getName());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+ private void runIt(IProgressMonitor monitor, XResultData xResultData) throws OseeCoreException {
+ String currentDbGuid = OseeInfo.getValue("osee.db.guid");
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ String[] columnHeaders = new String[] {"HRID", "PCR", "Results"};
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ for (String artifactTypeName : TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames()) {
+ sbFull.append(AHTML.addRowSpanMultiColumnTable(artifactTypeName, columnHeaders.length));
+ try {
+ int x = 1;
+ Collection<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromType(artifactTypeName, AtsPlugin.getAtsBranch());
+ for (Artifact artifact : artifacts) {
+ String resultStr = "PASS";
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) artifact;
+ try {
+ String str = String.format("Processing %s/%s - %s", x++, artifacts.size(), artifact);
+ OseeLog.log(AtsPlugin.class, Level.INFO, str);
+ if (monitor != null) {
+ monitor.subTask(str);
+ }
+
+ // Only validate committed branches cause working branches change too much
+ if (!teamArt.getSmaMgr().getBranchMgr().isCommittedBranchExists()) continue;
+ Result valid = changeReportValidated(currentDbGuid, teamArt, xResultData, false);
+ if (valid.isFalse()) {
+ resultStr = "Error: Not Valid: " + valid.getText();
+ }
+ } catch (Exception ex) {
+ resultStr = "Error: Exception Validating: " + ex.getLocalizedMessage();
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ sbFull.append(AHTML.addRowMultiColumnTable(teamArt.getHumanReadableId(), teamArt.getSoleAttributeValue(
+ ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName(), ""), resultStr));
+ }
+ } catch (Exception ex) {
+ sbFull.append(AHTML.addRowSpanMultiColumnTable("Exception: " + ex.getLocalizedMessage(),
+ columnHeaders.length));
+ }
+ }
+ sbFull.append(AHTML.endMultiColumnTable());
+ xResultData.addRaw(sbFull.toString().replaceAll("\n", ""));
+ List<IHealthStatus> stats = new ArrayList<IHealthStatus>(monitorLog.getAllLogs());
+ for (IHealthStatus stat : stats) {
+ Throwable tr = stat.getException();
+ if (tr != null) {
+ xResultData.logError("Exception: " + Lib.exceptionToString(stat.getException()));
+ }
+ }
+ }
+
+ /**
+ * Return true if current change report is same as stored change report data
+ *
+ * @param teamArt
+ * @return Result.TrueResult if same, else Result.FalseResult with comparison in resultData
+ * @throws ParserConfigurationException
+ */
+ static Result changeReportValidated(final String currentDbGuid, final TeamWorkFlowArtifact teamArt, XResultData resultData, boolean displayWasIs) throws OseeCoreException, ParserConfigurationException {
+ String name = "VCR_" + teamArt.getHumanReadableId();
+ List<Artifact> arts =
+ ArtifactQuery.getArtifactsFromTypeAndName(GeneralData.ARTIFACT_TYPE, name, AtsPlugin.getAtsBranch());
+ String storedChangeReport = null;
+ Artifact artifactForStore = null;
+ if (arts.size() > 1) {
+ throw new OseeStateException("Multiple artifacts found of name \"" + name + "\"");
+ } else if (arts.size() == 1) {
+ artifactForStore = arts.iterator().next();
+ storedChangeReport =
+ artifactForStore.getSoleAttributeValue(GeneralData.GENERAL_STRING_ATTRIBUTE_TYPE_NAME, null);
+ }
+ // Retrieve current
+ ChangeData currentChangeData = teamArt.getSmaMgr().getBranchMgr().getChangeDataFromEarliestTransactionId();
+ // Store
+ if (storedChangeReport == null) {
+ // Reuse same artifact if already exists
+ if (artifactForStore == null) {
+ artifactForStore =
+ ArtifactTypeManager.addArtifact(GeneralData.ARTIFACT_TYPE, AtsPlugin.getAtsBranch(), name);
+ }
+ artifactForStore.setSoleAttributeValue(GeneralData.GENERAL_STRING_ATTRIBUTE_TYPE_NAME, getReport(
+ currentDbGuid, currentChangeData));
+ artifactForStore.persistAttributes();
+ resultData.log("Stored Change Report for " + teamArt.getHumanReadableId());
+ return new Result(true, "Stored Change Report for " + teamArt.getHumanReadableId());
+ }
+ // Else, compare the two and report
+ else {
+ final String currentChangeReport = getReport(currentDbGuid, currentChangeData);
+ final String fStoredChangeReport = storedChangeReport.replaceAll("\n", "");
+ if (isXmlChangeDataEqual(currentChangeReport, fStoredChangeReport)) {
+ resultData.log("Change Report Valid for " + teamArt.getHumanReadableId());
+ } else {
+ resultData.logError("Was/Is Change Report different for " + teamArt.getHumanReadableId());
+ if (displayWasIs) {
+ resultData.log("Was / Is reports displayed in Results View");
+ }
+ if (displayWasIs) {
+ try {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ String prePage = AHTML.simplePageNoPageEncoding(AHTML.textToHtml(fStoredChangeReport));
+ ResultsEditor.open(new XResultPage("Was Change Report for " + teamArt.getHumanReadableId(),
+ prePage));
+
+ String postPage = AHTML.simplePageNoPageEncoding(AHTML.textToHtml(currentChangeReport));
+ ResultsEditor.open(new XResultPage("Is Change Report for " + teamArt.getHumanReadableId(),
+ postPage));
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ } catch (Exception ex) {
+ System.err.println(ex.getLocalizedMessage());
+ }
+ }
+ return new Result("FAIL");
+ }
+ }
+ // As another test, ensure that all artifacts can be retrieved and display their name
+ try {
+ for (Artifact art : currentChangeData.getArtifacts(KindType.ArtifactOrRelation, ModificationType.NEW,
+ ModificationType.DELETED, ModificationType.MERGED)) {
+ art.getDescriptiveName();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Result("Exception accessing name of change report artifacts: " + ex.getLocalizedMessage());
+ }
+ return new Result(true, "PASS");
+ }
+
+ private static String getReport(String dbGuid, ChangeData changeData) throws OseeCoreException, ParserConfigurationException {
+ StringBuffer sb = new StringBuffer();
+ sb.append(String.format("<%s %s=\"%s\">", VCR_ROOT_ELEMENT_TAG, VCR_DB_GUID, dbGuid));
+ for (Change change : changeData.getChanges()) {
+ if (change instanceof RelationChanged) {
+ sb.append(toXml((RelationChanged) change));
+ } else if (change instanceof ArtifactChanged) {
+ sb.append(toXml((ArtifactChanged) change));
+ } else if (change instanceof AttributeChanged) {
+ sb.append(toXml((AttributeChanged) change));
+ }
+ }
+ sb.append(String.format("</%s>", VCR_ROOT_ELEMENT_TAG));
+ String toReturn = sb.toString().replaceAll(">[\\s\\n\\r]+$", ">");
+ return toReturn.replaceAll("\n", "");
+ }
+
+ private static String toXml(RelationChanged change) throws OseeCoreException, ParserConfigurationException {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AXml.addTagData("brId", String.valueOf(change.getBranch().getBranchId())));
+ sb.append(AXml.addTagData("artTId", String.valueOf(change.getItemTypeId())));
+ sb.append(AXml.addTagData("gamma", String.valueOf(change.getGamma())));
+ sb.append(AXml.addTagData("artId", String.valueOf(change.getArtId())));
+ sb.append(AXml.addTagData("tTranId", String.valueOf(change.getToTransactionId().getTransactionNumber())));
+ sb.append(AXml.addTagData("fTranId", String.valueOf(change.getFromTransactionId().getTransactionNumber())));
+ sb.append(AXml.addTagData("mType", String.valueOf(change.getModificationType().name())));
+ sb.append(AXml.addTagData("cType", String.valueOf(change.getChangeType().name())));
+ sb.append(AXml.addTagData("bArtId", String.valueOf(change.getBArtId())));
+ sb.append(AXml.addTagData("relId", String.valueOf(change.getRelLinkId())));
+ sb.append(AXml.addTagData("rat", change.getRationale()));
+ sb.append(AXml.addTagData("aOrdr", String.valueOf(change.getLinkOrder())));
+ sb.append(AXml.addTagData("bOrdr", String.valueOf(change.getBLinkOrder())));
+ sb.append(AXml.addTagData("relTId", String.valueOf(change.getRelationType().getRelationTypeId())));
+ sb.append(AXml.addTagData("hist", String.valueOf(change.isHistorical())));
+ return AXml.addTagData("RelChg", sb.toString());
+ }
+
+ private static String toXml(ArtifactChanged change) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AXml.addTagData("brId", String.valueOf(change.getBranch().getBranchId())));
+ sb.append(AXml.addTagData("artTId", String.valueOf(change.getItemTypeId())));
+ sb.append(AXml.addTagData("gamma", String.valueOf(change.getGamma())));
+ sb.append(AXml.addTagData("artId", String.valueOf(change.getArtId())));
+ sb.append(AXml.addTagData("tTranId", String.valueOf(change.getToTransactionId().getTransactionNumber())));
+ sb.append(AXml.addTagData("fTranId", String.valueOf(change.getFromTransactionId().getTransactionNumber())));
+ sb.append(AXml.addTagData("mType", String.valueOf(change.getModificationType().name())));
+ sb.append(AXml.addTagData("cType", String.valueOf(change.getChangeType().name())));
+ sb.append(AXml.addTagData("hist", String.valueOf(change.isHistorical())));
+ return AXml.addTagData("ArtChg", sb.toString());
+ }
+
+ private static String toXml(AttributeChanged change) throws OseeCoreException, ParserConfigurationException {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AXml.addTagData("brId", String.valueOf(change.getBranch().getBranchId())));
+ sb.append(AXml.addTagData("artTId", String.valueOf(change.getItemTypeId())));
+ sb.append(AXml.addTagData("gamma", String.valueOf(change.getGamma())));
+ sb.append(AXml.addTagData("artId", String.valueOf(change.getArtId())));
+ sb.append(AXml.addTagData("tTranId", String.valueOf(change.getToTransactionId().getTransactionNumber())));
+ sb.append(AXml.addTagData("fTranId", String.valueOf(change.getFromTransactionId().getTransactionNumber())));
+ sb.append(AXml.addTagData("mType", String.valueOf(change.getModificationType().name())));
+ sb.append(AXml.addTagData("cType", String.valueOf(change.getChangeType().name())));
+ sb.append(AXml.addTagData("aModType", String.valueOf(change.getArtModType().name())));
+ sb.append(AXml.addTagData("attrId", String.valueOf(change.getAttrId())));
+ sb.append(AXml.addTagData("attrTId", String.valueOf(change.getAttrTypeId())));
+ sb.append(AXml.addTagData("hist", String.valueOf(change.isHistorical())));
+ return AXml.addTagData("AttrChg", sb.toString());
+ }
+
+ private static boolean isXmlChangeDataEqual(String data1, String data2) {
+ int checkSum1 = getCheckSum(data1);
+ int checkSum2 = getCheckSum(data2);
+
+ boolean result = checkSum1 == checkSum2;
+ if (!result) {
+ ChangeReportComparer comparer = new ChangeReportComparer();
+ comparer.compare(data1, data2);
+
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, String.format("Checksums not equal - stored:[%s] current:[%s]",
+ checkSum1, checkSum2));
+ }
+ return result;
+ }
+
+ private static int getCheckSum(String data) {
+ int checksum = -1;
+ for (int index = 0; index < data.length(); index++) {
+ char character = data.charAt(index);
+ if (character != '\n' && character != '\t' && character != '\r' && character != ' ') {
+ checksum += character;
+ }
+ }
+ return checksum;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperItem.java
new file mode 100644
index 00000000000..0066ac1f9cc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperItem.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.ats.hyper;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+public class ActionHyperItem extends HyperViewItem {
+
+ private final IHyperArtifact iHyperartifact;
+
+ public ActionHyperItem(IHyperArtifact iHyperartifact) {
+ super(iHyperartifact.getHyperName());
+ this.iHyperartifact = iHyperartifact;
+ setGuid(iHyperartifact.getGuid());
+ }
+
+ @Override
+ public String toString() {
+ return iHyperartifact.getHyperType() + " - " + iHyperartifact.getHyperName();
+ }
+
+ public void handleDoubleClick(HyperViewItem hyperViewItem) throws OseeCoreException {
+ }
+
+ public void calculateCurrent(Artifact currentArtifact) {
+ setCurrent(currentArtifact.equals(getArtifact()));
+ for (ActionHyperItem childHyperItem : getChildren()) {
+ childHyperItem.calculateCurrent(currentArtifact);
+ }
+ }
+
+ @Override
+ public Image getImage() throws OseeCoreException {
+ if (iHyperartifact.getHyperArtifact() == null) return null;
+ if (iHyperartifact.isDeleted()) return null;
+ return ImageManager.getImage(iHyperartifact.getHyperArtifact());
+ }
+
+ @Override
+ public String getTitle() {
+ if (iHyperartifact.isDeleted()) return "Deleted";
+ return iHyperartifact.getHyperName();
+ }
+
+ @Override
+ public String getToolTip() {
+ if (iHyperartifact.isDeleted()) return "";
+ StringBuilder builder = new StringBuilder();
+ builder.append("Name: " + (iHyperartifact).getHyperName());
+ builder.append("\nType: " + (iHyperartifact).getHyperType());
+ if (iHyperartifact instanceof IHyperArtifact) {
+ if ((iHyperartifact).getHyperState() != null) builder.append("\nState: " + (iHyperartifact).getHyperState());
+ if ((iHyperartifact).getHyperAssignee() != null) builder.append("\nAssignee: " + (iHyperartifact).getHyperAssignee());
+ if ((iHyperartifact).getHyperTargetVersion() != null) builder.append("\nVersion: " + (iHyperartifact).getHyperTargetVersion());
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public Image getMarkImage() {
+ if (iHyperartifact.isDeleted()) return null;
+ try {
+ if (iHyperartifact instanceof IHyperArtifact) return (iHyperartifact).getHyperAssigneeImage();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return super.getMarkImage();
+ }
+
+ public ArrayList<ActionHyperItem> getChildren() {
+ ArrayList<ActionHyperItem> children = new ArrayList<ActionHyperItem>();
+ for (HyperViewItem item : getBottom()) {
+ children.add((ActionHyperItem) item);
+ }
+ for (HyperViewItem item : getTop()) {
+ children.add((ActionHyperItem) item);
+ }
+ for (HyperViewItem item : getRight()) {
+ children.add((ActionHyperItem) item);
+ }
+ for (HyperViewItem item : getLeft()) {
+ children.add((ActionHyperItem) item);
+ }
+ return children;
+ }
+
+ public IHyperArtifact getHyperArtifact() {
+ return iHyperartifact;
+ }
+
+ public Artifact getArtifact() {
+ return iHyperartifact.getHyperArtifact();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperView.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperView.java
new file mode 100644
index 00000000000..a9c744090c3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionHyperView.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.ats.hyper;
+
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSArtifact;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveListener2;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+public class ActionHyperView extends HyperView implements IPartListener, IActionable, IFrameworkTransactionEventListener, IPerspectiveListener2 {
+
+ public static String VIEW_ID = "org.eclipse.osee.ats.hyper.ActionHyperView";
+ private static String HELP_CONTEXT_ID = "atsActionView";
+ private static ActionHyperItem topAHI;
+ private static ATSArtifact currentArtifact;
+
+ public ActionHyperView() {
+ super();
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().addPartListener(this);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(this);
+ setNodeColor(whiteColor);
+ setCenterColor(whiteColor);
+ setVerticalSelection(45);
+ }
+
+ @Override
+ public void createPartControl(Composite top) {
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(top)) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().removePartListener(this);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().removePerspectiveListener(this);
+ return;
+ }
+ AtsBulkLoadCache.run(false);
+ super.createPartControl(top);
+ OseeAts.addBugToViewToolbar(this, this, AtsPlugin.getInstance(), VIEW_ID, "SkyWalker");
+ AtsPlugin.getInstance().setHelp(top, HELP_CONTEXT_ID);
+ AtsPlugin.getInstance().setHelp(composite, HELP_CONTEXT_ID);
+ OseeEventManager.addListener(this);
+ }
+
+ public static ActionHyperView getArtifactHyperView() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ IViewReference ivr = page.findViewReference(ActionHyperView.VIEW_ID);
+ if (ivr != null && page.isPartVisible(ivr.getPart(false))) return (ActionHyperView) page.showView(ActionHyperView.VIEW_ID);
+ } catch (PartInitException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Launch Error",
+ "Couldn't Get OSEE Hyper View " + e1.getMessage());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean provideBackForwardActions() {
+ return false;
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ @Override
+ public void handleItemDoubleClick(HyperViewItem hvi) throws OseeCoreException {
+ Artifact art = ((ActionHyperItem) hvi).getArtifact();
+ if (art == null) {
+ ((ActionHyperItem) hvi).handleDoubleClick(hvi);
+
+ } else if (art.isDeleted()) {
+ AWorkbench.popup("ERROR", "Artifact has been deleted");
+ return;
+ } else {
+ AtsLib.openAtsAction(art, AtsOpenOption.OpenOneOrPopupSelect);
+ }
+ }
+
+ private boolean reviewsCreated = false;
+ private boolean tasksReviewsCreated = false;
+
+ @Override
+ public void display() {
+ try {
+ getContainer().setCursor(new Cursor(null, SWT.NONE));
+ if (currentArtifact == null || currentArtifact.isDeleted()) {
+ return;
+ }
+ reviewsCreated = false;
+ tasksReviewsCreated = false;
+ ATSArtifact topArt = getTopArtifact(currentArtifact);
+ if (topArt == null || topArt.isDeleted()) return;
+ topAHI = new ActionHyperItem(topArt);
+ if (topArt instanceof ActionArtifact) {
+ for (TeamWorkFlowArtifact team : ((ActionArtifact) topArt).getTeamWorkFlowArtifacts()) {
+ ActionHyperItem teamAHI = new ActionHyperItem(team);
+ teamAHI.setRelationToolTip("Team");
+ topAHI.addBottom(teamAHI);
+ for (ReviewSMArtifact rev : team.getSmaMgr().getReviewManager().getReviews()) {
+ reviewsCreated = true;
+ ActionHyperItem reviewAHI = new ActionHyperItem(rev);
+ reviewAHI.setRelationToolTip("Review");
+ teamAHI.addBottom(reviewAHI);
+ addTasksAHIs(reviewAHI, rev);
+ }
+ addTasksAHIs(teamAHI, team);
+ }
+ }
+ if (topArt instanceof ReviewSMArtifact) {
+ addTasksAHIs(topAHI, topArt);
+ }
+
+ if (activeEditorIsActionEditor()) {
+ topAHI.calculateCurrent(currentArtifact);
+ }
+ if (tasksReviewsCreated)
+ setVerticalSelection(50);
+ else if (reviewsCreated)
+ setVerticalSelection(47);
+ else
+ setVerticalSelection(45);
+ create(topAHI);
+ } catch (Exception ex) {
+ clear();
+ }
+ }
+
+ private void addTasksAHIs(ActionHyperItem parentAHI, ATSArtifact artifact) throws OseeCoreException {
+ if (!(artifact instanceof StateMachineArtifact)) return;
+ if (((StateMachineArtifact) artifact).getSmaMgr().getTaskMgr().getTaskArtifacts().size() > 0) {
+ if (artifact instanceof ReviewSMArtifact) tasksReviewsCreated = true;
+ parentAHI.addBottom(new TasksActionHyperItem(
+ ((StateMachineArtifact) artifact).getSmaMgr().getTaskMgr().getTaskArtifacts()));
+ }
+ }
+
+ public ATSArtifact getTopArtifact(ATSArtifact art) throws OseeCoreException {
+ ATSArtifact artifact = art;
+ if (artifact instanceof TaskArtifact) {
+ artifact = ((TaskArtifact) artifact).getParentSMA();
+ }
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ artifact = ((TeamWorkFlowArtifact) artifact).getParentActionArtifact();
+ }
+ if (artifact instanceof ReviewSMArtifact) {
+ if (((ReviewSMArtifact) artifact).getParentActionArtifact() != null) {
+ artifact = ((ReviewSMArtifact) artifact).getParentActionArtifact();
+ }
+ }
+ if (artifact == null) OseeLog.log(AtsPlugin.class, Level.SEVERE, "Unknown parent " + art.getHumanReadableId());
+ return artifact;
+ }
+
+ public boolean activeEditorIsActionEditor() {
+ IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
+ if (page == null) return false;
+ IEditorPart editorPart = page.getActiveEditor();
+ boolean result = (editorPart != null && (editorPart instanceof SMAEditor));
+ return result;
+ }
+
+ public void processWindowActivated() {
+ if (!this.getSite().getPage().isPartVisible(this)) return;
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ IEditorPart editor = page.getActiveEditor();
+ if (editor != null && (editor instanceof SMAEditor)) {
+ currentArtifact = ((SMAEditor) editor).getSmaMgr().getSma();
+ display();
+ } else
+ super.clear();
+ }
+ }
+
+ public void processWindowDeActivated(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ @Override
+ public void partActivated(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ @Override
+ public void partClosed(IWorkbenchPart part) {
+ if (part.equals(this))
+ dispose();
+ else
+ processWindowActivated();
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ public String getActionDescription() {
+ if (currentArtifact != null && currentArtifact.isDeleted()) return String.format("Current Artifact - %s - %s",
+ currentArtifact.getGuid(), currentArtifact.getDescriptiveName());
+ return "";
+ }
+
+ @Override
+ protected void clear() {
+ super.clear();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor)
+ */
+ public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ processWindowActivated();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
+ */
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
+ processWindowActivated();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference,
+ * java.lang.String)
+ */
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {
+ processWindowActivated();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (currentArtifact == null) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ if (transData.isDeleted(currentArtifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ clear();
+ }
+ });
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ display();
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionSkyWalker.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionSkyWalker.java
new file mode 100644
index 00000000000..5829a4a4450
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ActionSkyWalker.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.hyper;
+
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSArtifact;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptions;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveListener2;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionSkyWalker extends SkyWalkerView implements IPartListener, IActionable, IFrameworkTransactionEventListener, IPerspectiveListener2 {
+
+ public static final String VIEW_ID = "org.eclipse.osee.ats.hyper.ActionSkyWalker";
+
+ public ActionSkyWalker() {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().addPartListener(this);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ sashForm.setWeights(new int[] {99, 1});
+ OseeEventManager.addListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView#createActions()
+ */
+ @Override
+ protected void createActions() {
+ IActionBars bars = getViewSite().getActionBars();
+ // IMenuManager mm = bars.getMenuManager();
+ IToolBarManager tbm = bars.getToolBarManager();
+
+ Action action = new Action() {
+ @Override
+ public void run() {
+ redraw();
+ }
+ };
+ action.setText("Refresh");
+ action.setToolTipText("Refresh");
+ action.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ tbm.add(action);
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView#explore(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public void explore(Artifact artifact) {
+ if (artifact == null || artifact.isDeleted() || (!(artifact instanceof ATSArtifact))) clear();
+ try {
+ getOptions().setArtifact(artifact);
+ getOptions().setLayout(getOptions().getLayout(SkyWalkerOptions.SPRING_LAYOUT));
+ if (artifact instanceof User)
+ super.explore(artifact);
+ else
+ super.explore(getTopArtifact((ATSArtifact) artifact));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ clear();
+ }
+ }
+
+ public ATSArtifact getTopArtifact(ATSArtifact art) throws OseeCoreException {
+ ATSArtifact artifact = null;
+ if (art instanceof ActionArtifact)
+ artifact = art;
+ else if (art instanceof TeamWorkFlowArtifact) {
+ artifact = ((TeamWorkFlowArtifact) art).getParentActionArtifact();
+ } else if (art instanceof TaskArtifact) {
+ Artifact parentArtifact = ((TaskArtifact) art).getParentSMA();
+ if (parentArtifact instanceof StateMachineArtifact) {
+ if (parentArtifact instanceof TeamWorkFlowArtifact)
+ artifact = ((TeamWorkFlowArtifact) parentArtifact).getParentActionArtifact();
+ else {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Unknown parent " + art.getHumanReadableId());
+ }
+ }
+ }
+ return artifact;
+ }
+
+ public boolean activeEditorIsActionEditor() {
+ IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
+ if (page == null) return false;
+ IEditorPart editorPart = page.getActiveEditor();
+ boolean result = (editorPart != null && (editorPart instanceof SMAEditor));
+ return result;
+ }
+
+ public void processWindowActivated() {
+ if (!this.getSite().getPage().isPartVisible(this)) return;
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ IEditorPart editor = page.getActiveEditor();
+ if (editor != null && (editor instanceof SMAEditor)) {
+ explore(((SMAEditor) editor).getSmaMgr().getSma());
+ }
+ clear();
+ }
+ }
+
+ public void processWindowDeActivated(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ public void partActivated(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ public void partClosed(IWorkbenchPart part) {
+ if (part.equals(this))
+ dispose();
+ else
+ processWindowActivated();
+ }
+
+ public void partDeactivated(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ public void partOpened(IWorkbenchPart part) {
+ processWindowActivated();
+ }
+
+ @Override
+ public String getActionDescription() {
+ if (getOptions() != null && getOptions().getArtifact() != null && getOptions().getArtifact().isDeleted()) return String.format(
+ "Current Artifact - %s - %s", getOptions().getArtifact().getGuid(),
+ getOptions().getArtifact().getDescriptiveName());
+ return "";
+ }
+
+ public void clear() {
+ System.out.println("clear viewer here");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (sender.isRemote()) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ if (getOptions().getArtifact() == null) return;
+ if (transData.isDeleted(getOptions().getArtifact())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ clear();
+ }
+ });
+ }
+ if (transData.isChanged(getOptions().getArtifact()) || transData.isRelAddedChangedDeleted(getOptions().getArtifact())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ explore(getOptions().getArtifact());
+ }
+ });
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor)
+ */
+ public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ processWindowActivated();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
+ */
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
+ processWindowActivated();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference,
+ * java.lang.String)
+ */
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {
+ processWindowActivated();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperItem.java
new file mode 100644
index 00000000000..2eff3105a76
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperItem.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.ats.hyper;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+public class ArtifactHyperItem extends HyperViewItem {
+
+ private final Artifact artifact;
+
+ public ArtifactHyperItem(Artifact artifact) {
+ super(artifact.getDescriptiveName(), ImageManager.getImage(artifact));
+ this.artifact = artifact;
+ setGuid(artifact.getGuid());
+ }
+
+ @Override
+ public String getToolTip() {
+ String tt = "Type: " + artifact.getArtifactTypeName() + "\n\n" + "Title: " + artifact.getDescriptiveName();
+ return tt;
+ }
+
+ @Override
+ public String getTitle() {
+ return artifact.getArtifactTypeName() + "\n" + artifact.getDescriptiveName();
+ }
+
+ @Override
+ public Image getMarkImage() {
+ return null;
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ @Override
+ public String getShortTitle() {
+ String title = getTitle().replaceFirst("State", "");
+ return title;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperView.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperView.java
new file mode 100644
index 00000000000..f3c70125650
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/ArtifactHyperView.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.hyper;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ats.ActionDebug;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.wizard.ArtifactSelectWizard;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.world.search.MultipleHridSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveListener2;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+public class ArtifactHyperView extends HyperView implements IFrameworkTransactionEventListener, IPartListener, IActionable, IPerspectiveListener2 {
+
+ public static String VIEW_ID = "org.eclipse.osee.ats.hyper.ArtifactHyperView";
+ public static ArtifactHyperItem topAHI;
+ public static Artifact currentArtifact;
+ public ActionDebug debug = new ActionDebug(false, "ArtifactHyperView");
+ private Action pinAction;
+
+ public ArtifactHyperView() {
+ super();
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().addPartListener(this);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(this);
+ setNodeColor(whiteColor);
+ setCenterColor(whiteColor);
+ defaultZoom.pcRadius += defaultZoom.pcRadiusFactor * 2;
+ defaultZoom.uuRadius += defaultZoom.uuRadiusFactor * 2;
+ defaultZoom.xSeparation += defaultZoom.xSeparationFactor;
+ }
+
+ public static ArtifactHyperView getArtifactHyperView() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ return (ArtifactHyperView) page.showView(ArtifactHyperView.VIEW_ID);
+ } catch (PartInitException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Launch Error",
+ "Couldn't Get OSEE Artifact Hyper View " + e1.getMessage());
+ }
+ return null;
+ }
+
+ public static void openArtifact(Artifact artifact) throws PartInitException {
+ getArtifactHyperView().load(artifact);
+ }
+
+ @Override
+ public void createPartControl(Composite top) {
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(top)) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService().removePartListener(this);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().removePerspectiveListener(this);
+ return;
+ }
+ super.createPartControl(top);
+ OseeAts.addBugToViewToolbar(this, this, AtsPlugin.getInstance(), VIEW_ID, "ATS Action View");
+ OseeEventManager.addListener(this);
+ }
+
+ @Override
+ public void handleItemDoubleClick(HyperViewItem hvi) {
+ currentArtifact = ((ArtifactHyperItem) hvi).getArtifact();
+ display();
+ }
+
+ public void load(Artifact artifact) {
+ currentArtifact = artifact;
+ display();
+ }
+
+ @Override
+ public void display() {
+ try {
+ if (currentArtifact == null) return;
+ topAHI = new ArtifactHyperItem(currentArtifact);
+ // System.out.println("Artifact "+currentArtifact.getArtifactTypeNameShort());
+ int x = 0;
+ for (RelationLink link : currentArtifact.getRelationsAll(false)) {
+ debug.report("relation " + link.getRelationType().getTypeName());
+
+ // Don't process link if onlyShowRel is populated and doesn't contain link name
+ if (onlyShowRelations.size() > 0) {
+ if (!onlyShowRelations.contains(link.getRelationType().getTypeName())) continue;
+ x++;
+ if (x == 4) x = 0;
+ }
+
+ Artifact otherArt = link.getArtifactB();
+ int otherOrder = link.getBOrder();
+ int thisOrder = link.getAOrder();
+ if (otherArt.equals(currentArtifact)) {
+ otherArt = link.getArtifactA();
+ otherOrder = link.getAOrder();
+ thisOrder = link.getBOrder();
+ }
+ if (!otherArt.isDeleted()) {
+ ArtifactHyperItem ahi = new ArtifactHyperItem(otherArt);
+ String tip = link.getRelationType().getTypeName();
+ if (!link.getRationale().equals("")) tip += "(" + link.getRationale() + ")";
+ ahi.setRelationToolTip(tip);
+ String label =
+ (isShowOrder() ? "(" + thisOrder + ") " : "") + link.getRelationType().getShortName() + (isShowOrder() ? "(" + otherOrder + ") " : "");
+ if (!link.getRationale().equals("")) label += "(" + link.getRationale() + ")";
+ ahi.setRelationLabel(label);
+ ahi.setLink(link);
+ ahi.setRelationDirty(link.isDirty());
+ switch (x) {
+ case 0:
+ topAHI.addBottom(ahi);
+ break;
+ case 1:
+ topAHI.addLeft(ahi);
+ break;
+ case 2:
+ topAHI.addTop(ahi);
+ break;
+ case 3:
+ topAHI.addRight(ahi);
+ break;
+ default:
+ break;
+ }
+ }
+ x++;
+ if (x == 4) x = 0;
+ }
+ create(topAHI);
+ center();
+ } catch (OseeCoreException ex) {
+ clear();
+ }
+ }
+
+ @Override
+ protected void handleRefreshButton() {
+ display();
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ public void handleWindowChange() {
+ if (pinAction.isChecked()) return;
+ if (!this.getSite().getPage().isPartVisible(this)) return;
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ IEditorPart editor = page.getActiveEditor();
+ if (editor != null && (editor instanceof SMAEditor)) {
+ currentArtifact = ((SMAEditor) editor).getSmaMgr().getSma();
+ load(currentArtifact);
+ }
+ }
+ }
+
+ @Override
+ public void partActivated(IWorkbenchPart part) {
+ handleWindowChange();
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPart part) {
+ handleWindowChange();
+ }
+
+ @Override
+ public void partClosed(IWorkbenchPart part) {
+ if (part.equals(this))
+ dispose();
+ else
+ handleWindowChange();
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPart part) {
+ handleWindowChange();
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPart part) {
+ handleWindowChange();
+ }
+
+ @Override
+ protected void createActions() {
+ super.createActions();
+
+ pinAction = new Action("Pin Viewer", Action.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ }
+ };
+ pinAction.setToolTipText("Keep viewer from updating based on open Actions.");
+ pinAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.PIN_EDITOR));
+
+ Action openArtAction = new Action("Open Artifact") {
+
+ @Override
+ public void run() {
+ handleOpenArtifact();
+ }
+ };
+ openArtAction.setToolTipText("Open Artifact");
+ openArtAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.ART_VIEW));
+
+ Action openByIdAction = new Action("Open by Id", IAction.AS_PUSH_BUTTON) {
+
+ @Override
+ public void run() {
+ MultipleHridSearchItem gsi = new MultipleHridSearchItem();
+ try {
+ Collection<Artifact> arts = gsi.performSearchGetResults(true);
+ if (arts.size() == 0) {
+ AWorkbench.popup("ERROR", "No Artifacts Found");
+ return;
+ }
+ load(arts.iterator().next());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ openByIdAction.setToolTipText("Open by Id");
+
+ IMenuManager mm = getViewSite().getActionBars().getMenuManager();
+ mm.add(new Separator());
+ mm.add(openByIdAction);
+
+ IActionBars bars = getViewSite().getActionBars();
+ IToolBarManager tbm = bars.getToolBarManager();
+ tbm.add(new Separator());
+ // tbm.add(homeAction);
+ tbm.add(openArtAction);
+ tbm.add(pinAction);
+ }
+
+ public void handleOpenArtifact() {
+
+ ArtifactSelectWizard selWizard = new ArtifactSelectWizard();
+ WizardDialog dialog =
+ new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), selWizard);
+ dialog.create();
+ if (dialog.open() == 0) {
+ load(selWizard.getSelectedArtifact());
+ }
+ }
+
+ public String getActionDescription() {
+ if (currentArtifact != null && currentArtifact.isDeleted()) return String.format("Current Artifact - %s - %s",
+ currentArtifact.getGuid(), currentArtifact.getDescriptiveName());
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor)
+ */
+ public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ handleWindowChange();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
+ */
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
+ handleWindowChange();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IPerspectiveListener2#perspectiveChanged(org.eclipse.ui.IWorkbenchPage,
+ * org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference,
+ * java.lang.String)
+ */
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {
+ handleWindowChange();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (sender.isRemote()) return;
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ if (currentArtifact == null) return;
+ if (transData.isDeleted(currentArtifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ clear();
+ }
+ });
+ }
+ if (transData.isRelAddedChangedDeleted(currentArtifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ display();
+ }
+ });
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperView.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperView.java
new file mode 100644
index 00000000000..dfe4bd69d51
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperView.java
@@ -0,0 +1,1069 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.hyper;
+
+import java.util.ArrayList;
+import java.util.Vector;
+import java.util.logging.Level;
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.ConnectionEndpointLocator;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.XYLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.ActionDebug;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+public class HyperView extends ViewPart implements IPartListener {
+
+ private boolean showOrder = false;
+ public static String VIEW_ID = "org.eclipse.osee.ats.hyper.HyperView";
+ private LightweightSystem lws;
+ private HyperViewItem centerSearchItem;
+ private NodeFigure centerFigure;
+ protected Composite composite;
+ private Figure container; // main container Figure to hold others
+ private XYLayout contentsLayout;
+ private final Vector<PolylineConnection> connectors = new Vector<PolylineConnection>(); // PolylineConnection
+ private final Vector<HyperViewItem> backList = new Vector<HyperViewItem>();
+ // List of SearchItems visited
+ private int backListIndex = 0; // Index we are on in backList
+ private HyperViewItem homeSearchItem = null;
+ // private static Canvas canvas;
+ private FigureCanvas canvas;
+ private final Cursor hCursor = null;
+ private Menu popupMenu;
+ private Menu connectPopupMenu;
+ /* Full circle is (2*Math.PI) */
+ private final double quadrant = ((2 * Math.PI) / 4);
+ /* Each quadrant is 90 degrees */
+ private final double oneEighthCircle = quadrant / 2; /* Start 45 degrees off 0 */
+ private final double bottomQuadrantStart = oneEighthCircle;
+ private final double topQuadrantStart = oneEighthCircle + (2 * quadrant);
+ private final double leftQuadrantStart = oneEighthCircle + quadrant;
+ private final double rightQuadrantStart = oneEighthCircle + (3 * quadrant);
+ // private ChopboxAnchor sourceAnchor = null;
+ private boolean dragCenter = false;
+ protected static Color nodeColor = new Color(null, 255, 255, 206);
+ protected static Color centerColor = new Color(null, 106, 219, 255);
+ protected static Color cyanColor = ColorConstants.cyan;
+ protected static Color blackColor = ColorConstants.black;
+ protected static Color whiteColor = ColorConstants.white;
+ private ScrollBar vsb;
+ private ScrollBar hsb;
+ private Action titleAction, backAction, forwardAction, showOrderAction;
+ private Zoom zoom;
+ protected Zoom defaultZoom = new Zoom();
+ private int verticalSelection = 40;
+ private final ActionDebug debug = new ActionDebug(false, "HV");
+ protected ArrayList<String> onlyShowRelations = new ArrayList<String>();
+
+ public class Zoom {
+
+ int pcRadius = 50;
+ int pcRadiusFactor = 5;
+ int uuRadius = 60;
+ int uuRadiusFactor = 20;
+ int uuRadiusSeparation = 13; // left/right
+ int pcRadiusSeparation = 13; // top/bottom
+ int xSeparation = 27;
+ int xSeparationFactor = 20;
+ int ySeparation = 5;
+ int ySeparationFactor = 5;
+ Point dragCenter = null;
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("xR:" + pcRadius);
+ builder.append("yR:" + uuRadius);
+ builder.append(" xRF:" + pcRadiusFactor);
+ builder.append(" yRF:" + uuRadiusFactor);
+ builder.append(" pcRS: " + pcRadiusSeparation);
+ builder.append(" uuRS: " + uuRadiusSeparation);
+ builder.append(" xS: " + xSeparation);
+ builder.append(" yS: " + ySeparation);
+ return builder.toString();
+ }
+ }
+
+ enum RelationEnum {
+ TOP, BOTTOM, BOTTOM2, LEFT, RIGHT
+ };
+
+ public boolean provideBackForwardActions() {
+ return true;
+ }
+
+ public class NodeFigure extends Figure {
+
+ HyperViewItem hvi = null;
+
+ public HyperViewItem getSearchItem() {
+ return hvi;
+ }
+
+ public NodeFigure(Label name, Label infoLabel, HyperViewItem hvi, boolean center) {
+ ToolbarLayout layout = new ToolbarLayout();
+ layout.setVertical(false);
+ setLayoutManager(layout);
+ if (hvi.isCurrent())
+ setBorder(new LineBorder(cyanColor, 3));
+ else
+ setBorder(new LineBorder(blackColor, 1));
+ if (center)
+ setBackgroundColor(centerColor);
+ else
+ setBackgroundColor(nodeColor);
+ setOpaque(true);
+ this.hvi = hvi;
+ if (name != null) {
+ add(name);
+ }
+ if (infoLabel != null) {
+ add(infoLabel);
+ }
+ }
+
+ public HyperViewItem getHvi() {
+ return hvi;
+ }
+
+ }
+
+ // private void moveCenter(int y) {
+ // zoom.centerYOffset+=y;
+ // System.out.println("zoom.centerYOffset *" + zoom.centerYOffset + "*");
+ // }
+ //
+
+ /**
+ * Create HyperView object
+ */
+ public HyperView() {
+ zoom = defaultZoom;
+ }
+
+ public void create(HyperViewItem hvi) {
+ clear();
+ gridLoad(hvi);
+ }
+
+ private void gridLoad(HyperViewItem hvi) {
+ debug.report("gridLoad");
+ /*
+ * If grid already loaded and it was a collection, remove old home and all links associated
+ * with it.
+ */
+ if (homeSearchItem != null) {
+ for (HyperViewItem hyperItem : homeSearchItem.getBottom()) {
+ hyperItem.removeTop(homeSearchItem);
+ }
+ }
+ homeSearchItem = hvi;
+ centerSearchItem = hvi;
+ backListAddSearchItem(homeSearchItem);
+ jumpTo(homeSearchItem);
+ }
+
+ /**
+ * This is a callback that will allow us to create the viewer and initialize it.
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ debug.report("createPartControl");
+
+ try {
+ if (OseeDbConnection.hasOpenConnection()) {
+ OseeContributionItem.addTo(this, true);
+ }
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ canvas = new FigureCanvas(parent);
+ canvas.setScrollBarVisibility(FigureCanvas.ALWAYS);
+ vsb = canvas.getVerticalBar();
+ vsb.setIncrement(1);
+ vsb.setSelection(verticalSelection);
+ vsb.addListener(SWT.Selection, new Listener() {
+
+ public void handleEvent(Event event) {
+ refresh();
+ // System.out.println("vScroll " + event);
+ // int v = canvas.getVerticalBar().getSelection();
+ // System.out.println("v *" + v + "*");
+ }
+ });
+ hsb = canvas.getHorizontalBar();
+ hsb.setIncrement(1);
+ hsb.setSelection(40);
+ hsb.addListener(SWT.Selection, new Listener() {
+
+ public void handleEvent(Event event) {
+ refresh();
+ // System.out.println("hScroll " + event);
+ // int h = canvas.getVerticalBar().getSelection();
+ // System.out.println("h *" + h + "*");
+ }
+ });
+ // canvas = new Canvas(top, SWT.NONE);
+ composite = parent;
+ canvas.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE));
+ lws = new LightweightSystem(canvas);
+ container = new Figure();
+ setContainerMouseListener(container);
+ setMouseListener(container);
+ contentsLayout = new XYLayout();
+ container.setLayoutManager(contentsLayout);
+ lws.setContents(container);
+ // canvas.addPaintListener(new PaintListener() {
+ //
+ // public void paintControl(PaintEvent e) {
+ // if (centerSearchItem == null || centerSearchItem.getArtifact() == null
+ // || centerSearchItem.getArtifact().isDeleted())
+ // return;
+ // // refresh();
+ // }
+ // });
+ canvas.layout();
+ composite.layout();
+ createActions();
+
+ }
+
+ private void printBackList(String inStr) {
+ final boolean debug = false;
+ if (!debug) return;
+ StringBuilder builder = new StringBuilder();
+ builder.append(inStr + "backList : [");
+ for (int i = 0; i < backList.size(); i++) {
+ builder.append(i + " ");
+ }
+ builder.append("] index: " + backListIndex);
+ System.err.println(builder.toString());
+ }
+
+ private void backListClearToIndex() {
+ printBackList("pre backListClearToIndex");
+ // Remove any extra items after where we are in backList
+ for (int i = backListIndex + 1; i < backList.size(); i++) {
+ backList.remove(i);
+ }
+ printBackList("post backListClearToIndex");
+ }
+
+ private void backListAddSearchItem(HyperViewItem hvi) {
+ // If we are adding, then any items past backListIndex are
+ // invalid and should be removed
+ printBackList("pre backListAddSearchItem");
+ backListClearToIndex();
+ if (backList.size() > 0) {
+ if ((backList.get(backList.size() - 1)).equals(hvi)) {
+ // System.out.println("same as last; skip");
+ return;
+ }
+ }
+ backList.add(hvi);
+ backListIndex = backList.size() - 1;
+ printBackList("post backListAddSearchItem");
+ }
+
+ // private void backListClear() {
+ // backList.clear();
+ // backListIndex = 0;
+ // }
+
+ public void refresh() {
+ gridDrawCenterItem();
+ }
+
+ protected void clear() {
+ debug.report("gridClear");
+ if (connectors != null) {
+ for (int i = 0; i < connectors.size(); i++) {
+ (connectors.get(i)).erase();
+ }
+ connectors.clear();
+ }
+ if (container != null) container.removeAll();
+ }
+
+ private void gridDrawCenterItem() {
+ clear();
+ Rectangle grid = container.getClientArea();
+ // System.out.println("grid w: " + grid.width + " h:" + grid.height);
+ gridDraw(centerSearchItem, new Point(grid.width / 2, grid.height / 2));
+ }
+
+ private void gridDraw(HyperViewItem hvi, Point center) {
+ debug.report("zoom *" + zoom + "*");
+ // Draw center node
+ if (hvi != null) {
+ debug.report("center x: " + center.x + " y:" + center.y);
+ debug.report("centerFigure *" + hvi.getTitle() + "*");
+ Point useCenter = new Point();
+ if (zoom.dragCenter != null) {
+ useCenter = zoom.dragCenter.getCopy();
+ } else {
+ useCenter = center.getCopy();
+ }
+ // Offset by scroll
+ if (vsb != null) useCenter.y -= (vsb.getSelection() - 40) * 10;
+ if (hsb != null) useCenter.x -= (hsb.getSelection() - 40) * 10;
+ // System.out.println("zoom.dragCenter *" + zoom.dragCenter + "*");
+ // System.out.println("center *" + center + "*");
+ // System.out.println("vsb.getSelection() *" + vsb.getSelection() +
+ // "*");
+ // System.out.println("hsb.getSelection() *" + hsb.getSelection() +
+ // "*");
+ Point nwPoint;
+ Point cPoint;
+ centerFigure = createFigure(centerSearchItem, true);
+ Dimension dim = centerFigure.getPreferredSize();
+ debug.report("dim center w: " + dim.width + " h:" + dim.height);
+ nwPoint = new Point((useCenter.x - dim.width / 2), (useCenter.y - dim.height / 2));
+ cPoint = new Point((nwPoint.x + dim.width / 2), (nwPoint.y + dim.height / 2));
+ debug.report("nwPoint *" + nwPoint + "*");
+ debug.report("cPoint *" + cPoint + "*");
+ contentsLayout.setConstraint(centerFigure, new Rectangle(nwPoint.x, nwPoint.y, -1, -1));
+ // centerFigure.repaint();
+ ChopboxAnchor sourceAnchor = new ChopboxAnchor(centerFigure);
+ setMouseListener(centerFigure);
+ // debug only
+ // drawQuadrant(topQuadrantStart, quadrant);
+ // drawQuadrant(bottomQuadrantStart, quadrant);
+ // drawQuadrant(leftQuadrantStart, quadrant);
+ // drawQuadrant(rightQuadrantStart, quadrant);
+ /*
+ * Bottomren draw from right to left Tops draw from left to right Left draws from low to
+ * high Usedby draws from high to low
+ */
+ // Draw other nodes
+ drawNodes(RelationEnum.TOP, hvi.getTop(), cPoint, sourceAnchor);
+ drawNodes(RelationEnum.BOTTOM, hvi.getBottom(), cPoint, sourceAnchor);
+ drawNodes(RelationEnum.LEFT, hvi.getLeft(), cPoint, sourceAnchor);
+ drawNodes(RelationEnum.RIGHT, hvi.getRight(), cPoint, sourceAnchor);
+ }
+ container.repaint();
+ canvas.layout();
+ composite.layout();
+ }
+
+ /**
+ * Draw figures around center offsetPoint #param relType - relation
+ *
+ * @param hvis - HyperViewItems to show.
+ * @param offsetPoint - x,y to offset figures
+ */
+ private void drawNodes(RelationEnum relType, ArrayList<HyperViewItem> hvis, Point offsetPoint, ChopboxAnchor sourceAnchor) {
+ debug.report("drawNodes");
+ if (hvis.size() == 0) return;
+ final boolean isRight = relType == RelationEnum.RIGHT;
+ final boolean isLeft = relType == RelationEnum.LEFT;
+ final boolean isBottom = relType == RelationEnum.BOTTOM;
+ final boolean isTop = relType == RelationEnum.TOP;
+ debug.report("offsetPoint *" + offsetPoint + "*");
+ double startDegree = 0;
+ if (isRight)
+ startDegree = rightQuadrantStart;
+ else if (isLeft)
+ startDegree = leftQuadrantStart;
+ else if (isTop)
+ startDegree = topQuadrantStart;
+ else if (isBottom) startDegree = bottomQuadrantStart;
+ double degree = 0;
+ Point cPoint = new Point(); // center of figure
+ Point nwPoint = new Point();
+ ArrayList<HyperViewItem> orderedHvis = new ArrayList<HyperViewItem>();
+
+ // if bottomren, reverse order of figures
+ if (isBottom)
+ for (int i = hvis.size() - 1; i >= 0; i--) {
+ HyperViewItem hvi = hvis.get(i);
+ if (hvi.isShow()) orderedHvis.add(hvis.get(i));
+ }
+ else
+ for (HyperViewItem hvi : hvis)
+ if (hvi.isShow()) orderedHvis.add(hvi);
+ final double degreeDiff = quadrant / (orderedHvis.size() + 1);
+ debug.report("quadrant *" + quadrant + "*");
+ debug.report("orderedHvis size *" + orderedHvis.size() + "*");
+ debug.report("degreeDiff *" + degreeDiff + "*");
+
+ // what is sent into constraint as the nw corner
+ int myRadius;
+ if (isBottom || isTop) {
+ myRadius = zoom.pcRadius;
+ } else {
+ myRadius = zoom.uuRadius;
+ }
+ for (int i = 0; i < orderedHvis.size(); i++) {
+ HyperViewItem hvi = orderedHvis.get(i);
+ debug.report("\n");
+ debug.report("HIV " + hvi.getShortTitle());
+ degree = startDegree + degreeDiff + (degreeDiff * i);
+ debug.report("startDegree *" + startDegree + "*");
+ debug.report("degree *" + degree + "*");
+ NodeFigure figure = createFigure(hvi, false);
+ cPoint.x = offsetPoint.x + (int) Math.round((myRadius * Math.cos(degree)));
+ cPoint.y = offsetPoint.y + (int) Math.round((myRadius * Math.sin(degree)));
+ if (debug.isDebug()) drawX(offsetPoint.x, offsetPoint.y - 5, "o");
+ if (debug.isDebug()) drawX(cPoint.x, cPoint.y - 5, "c");
+ Dimension dim = figure.getPreferredSize();
+ debug.report("dim " + relType + " w: " + dim.width + " h:" + dim.height);
+ if (isLeft) {
+ nwPoint.x = cPoint.x - dim.width;
+ nwPoint.y = cPoint.y - (dim.height / 2);
+ } else if (isRight) {
+ nwPoint.x = cPoint.x;
+ nwPoint.y = cPoint.y - (dim.height / 2);
+ } else if (isBottom) {
+ nwPoint.x = cPoint.x - (dim.width / 2);
+ nwPoint.y = cPoint.y;
+ } else if (isTop) {
+ nwPoint.x = cPoint.x - (dim.width / 2);
+ nwPoint.y = cPoint.y - dim.height;
+ }
+ if ((orderedHvis.size() > 1) && (isTop || isBottom)) {
+ if (i < orderedHvis.size() / 2) {
+ myRadius += zoom.pcRadiusSeparation;
+ if (isBottom) {
+ nwPoint.x += zoom.xSeparation;
+ }
+ if (isTop) {
+ nwPoint.x -= zoom.xSeparation;
+ }
+ } else if (i > orderedHvis.size() / 2) {
+ myRadius -= zoom.pcRadiusSeparation;
+ if (isBottom) {
+ nwPoint.x -= zoom.xSeparation;
+ }
+ if (isTop) {
+ nwPoint.x += zoom.xSeparation;
+ }
+ }
+ }
+ if ((orderedHvis.size() > 1) && (isLeft || isRight)) {
+ // int half = orderedFigures.size() / 2;
+ if (i < orderedHvis.size() / 2) {
+ myRadius += zoom.uuRadiusSeparation;
+ } else {
+ myRadius -= zoom.uuRadiusSeparation;
+ }
+ }
+ contentsLayout.setConstraint(figure, new Rectangle(nwPoint.x, nwPoint.y, -1, -1));
+ setMouseListener(figure);
+ /* Draw line to left */
+ ChopboxAnchor targetAnchor = new ChopboxAnchor(figure);
+ drawLine(sourceAnchor, targetAnchor, (figure).getHvi());
+ // .getRelationToolTip(),
+ // ((NodeFigure) figure).getHvi().getRelationLabel(), ((NodeFigure)
+ // figure).getHvi().getRelationDirty());
+
+ debug.report("cPoint *" + cPoint + "*");
+ debug.report("nwPoint *" + nwPoint + "*");
+ debug.report("offsetPoint *" + offsetPoint + "*");
+ ChopboxAnchor thisAnchor = new ChopboxAnchor(figure);
+ if (hvi.getTop().size() > 0) drawNodes(RelationEnum.TOP, hvi.getTop(), cPoint, thisAnchor);
+ if (hvi.getBottom().size() > 0) drawNodes(RelationEnum.BOTTOM, hvi.getBottom(), new Point(
+ (nwPoint.x + dim.width / 2), (nwPoint.y + dim.height / 2)), thisAnchor);
+ if (hvi.getLeft().size() > 0) drawNodes(RelationEnum.LEFT, hvi.getLeft(), cPoint, thisAnchor);
+ if (hvi.getRight().size() > 0) drawNodes(RelationEnum.RIGHT, hvi.getRight(), cPoint, thisAnchor);
+ }
+ }
+
+ /*
+ * Used for debug only drawQuadrant(leftQuadrantStart,quadrant);
+ */
+ // @SuppressWarnings("unused")
+ // private void drawQuadrant(double start, double degrees) {
+ // int cx = 100, cy = 100, r = 100;
+ // int x, y;
+ // double a;
+ // for (a = start; a < start + degrees; a += 0.01) {
+ // x = (int) Math.round(r * Math.cos(a)) + cx;
+ // y = (int) Math.round(r * Math.sin(a)) + cy;
+ // drawX(x, y, "x");
+ // }
+ // double degreeDiff = degrees / 4;
+ // for (int t = 0; t < 3; t += 1) {
+ // x = (int) Math.round(r * Math.cos(start + degreeDiff + (t * degreeDiff))) + cx;
+ // y = (int) Math.round(r * Math.sin(start + degreeDiff + (t * degreeDiff))) + cy;
+ // drawX(x, y + 20, "x");
+ // }
+ // }
+ private void drawX(int x, int y, String str) {
+ Label label = new Label(str, null);
+ Figure figure = new NodeFigure(label, null, new HyperViewItem(""), false);
+ container.add(figure);
+ contentsLayout.setConstraint(figure, new Rectangle(x, y, -1, -1));
+ }
+
+ private void drawLine(ChopboxAnchor source, ChopboxAnchor target, HyperViewItem hvi) {
+ PolylineConnection c = new PolylineConnection();
+ c.setLineWidth(2);
+ if (hvi.isRelationDirty()) c.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ c.setSourceAnchor(source);
+ c.setTargetAnchor(target);
+ setConnectionMouseListener(c, hvi);
+ // Add tooltip
+ if (hvi.getRelationToolTip() != null && !hvi.getRelationToolTip().equals("")) c.setToolTip(new Label(
+ hvi.getRelationToolTip()));
+ // Add label
+
+ ConnectionEndpointLocator targetEndpointLocator = new ConnectionEndpointLocator(c, true);
+ targetEndpointLocator.setVDistance(1);
+ Label targetMultiplicityLabel = new Label(hvi.getRelationLabel());
+ c.add(targetMultiplicityLabel, targetEndpointLocator);
+
+ connectors.add(c);
+ container.add(c);
+ }
+
+ protected void display() {
+ }
+
+ private void createConnectionMenuBar(final HyperViewItem hvi) {
+ if (AtsPlugin.isAtsAdmin()) {
+ if (connectPopupMenu == null || !connectPopupMenu.isVisible()) {
+ // final PolylineConnection c = connection;
+ connectPopupMenu = new Menu(canvas.getShell(), SWT.POP_UP);
+ MenuItem editItem = new MenuItem(connectPopupMenu, SWT.CASCADE);
+ editItem.setText("Delete Link");
+ editItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ if (MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Delete Link",
+ "Delete Link\n\n" + hvi.getLink().toString() + "\n\nAre you sure?")) {
+ Artifact artA = hvi.getLink().getArtifactA();
+ hvi.getLink().delete(true);
+ artA.persistRelations();
+ connectPopupMenu.dispose();
+ connectPopupMenu = null;
+ display();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ connectPopupMenu.setVisible(true);
+ }
+ }
+ }
+
+ private void setConnectionMouseListener(PolylineConnection c, final HyperViewItem hvi) {
+ MouseListener mouseListener = new MouseListener() {
+
+ public void mouseDoubleClicked(MouseEvent e) {
+ debug.report("DoubleClick");
+ }
+
+ public void mousePressed(MouseEvent e) {
+ debug.report("mousePressed");
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ debug.report("mouseReleased");
+ if (e.button == 3) {
+ if (e.getSource() instanceof PolylineConnection) {
+ // PolylineConnection c = (PolylineConnection) e.getSource();
+ createConnectionMenuBar(hvi);
+ }
+ return;
+ }
+ }
+ };
+ c.addMouseListener(mouseListener);
+ }
+
+ private NodeFigure createFigure(HyperViewItem hvi, boolean center) {
+ Label infoLabel = null;
+ String title = hvi.getShortTitle();
+ if (!titleAction.isChecked()) {
+ if (title.length() > 30) {
+ title = title.substring(0, 30);
+ }
+ }
+ Label nameLabel = null;
+ try {
+ nameLabel = new Label(title, hvi.getImage());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ nameLabel = new Label(title, null);
+ }
+ Image markImage = hvi.getMarkImage();
+ if (markImage != null) infoLabel = new Label(null, markImage);
+
+ NodeFigure figure = new NodeFigure(nameLabel, infoLabel, hvi, center);
+ // System.out.println(title + " " + figure.hashCode());
+ container.add(figure);
+ figure.setToolTip(new Label(hvi.getToolTip()));
+ return figure;
+ }
+
+ private void setContainerMouseListener(Figure figure) {
+ MouseListener mouseListener = new MouseListener() {
+
+ public void mouseDoubleClicked(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ if (e.button == 1) {
+ if (dragCenter) {
+ if (zoom.dragCenter == null) {
+ zoom.dragCenter = new Point();
+ }
+ zoom.dragCenter.x = e.x;
+ zoom.dragCenter.y = e.y;
+ refresh();
+ dragCenter = false;
+ if (hCursor != null) {
+ container.setCursor(null);
+ centerFigure.setCursor(null);
+ hCursor.dispose();
+ }
+ }
+ }
+ }
+ };
+ figure.addMouseListener(mouseListener);
+ }
+
+ private void setMouseListener(Figure figure) {
+ MouseListener mouseListener = new MouseListener() {
+
+ public void mouseDoubleClicked(MouseEvent e) {
+ if ((e.button == 1) && e.getSource() instanceof NodeFigure) {
+ NodeFigure nf = (NodeFigure) e.getSource();
+ HyperViewItem si = nf.getSearchItem();
+ try {
+ handleItemDoubleClick(si);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public void mousePressed(MouseEvent e) {
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ // System.out.println("mouseReleased");
+ if (hCursor != null) {
+ container.setCursor(null);
+ centerFigure.setCursor(null);
+ hCursor.dispose();
+ }
+ if (e.getSource() instanceof NodeFigure) {
+ NodeFigure nf = (NodeFigure) e.getSource();
+ HyperViewItem si = nf.getSearchItem();
+ debug.report("Click: " + si.getTitle());
+ if (e.button == 3) {
+ createMenuBar(si);
+ }
+ }
+ }
+ };
+ figure.addMouseListener(mouseListener);
+ }
+
+ public void handleItemDoubleClick(HyperViewItem hvi) throws OseeCoreException {
+ backListAddSearchItem(hvi);
+ jumpTo(hvi);
+ }
+
+ public static void openActionEditor(Artifact artifact) {
+ if (artifact instanceof StateMachineArtifact) {
+ AtsLib.openAtsAction(artifact, AtsOpenOption.OpenOneOrPopupSelect);
+ }
+ }
+
+ private void createMenuBar(HyperViewItem hvi) {
+ if (popupMenu == null || !popupMenu.isVisible()) {
+ final HyperViewItem fHvi = hvi;
+ popupMenu = new Menu(canvas.getShell(), SWT.POP_UP);
+
+ if (AtsPlugin.isAtsAdmin()) {
+ MenuItem editItem = new MenuItem(popupMenu, SWT.CASCADE);
+ editItem.setText("Open in Artifact Editor");
+ editItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Artifact a = null;
+ if (fHvi instanceof ArtifactHyperItem)
+ a = ((ArtifactHyperItem) fHvi).getArtifact();
+ else if (fHvi instanceof ActionHyperItem) a = ((ActionHyperItem) fHvi).getArtifact();
+ if (a != null) ArtifactEditor.editArtifact(a);
+ popupMenu.dispose();
+ popupMenu = null;
+ }
+ });
+ MenuItem deleteItem = new MenuItem(popupMenu, SWT.CASCADE);
+ deleteItem.setText("Delete Artifact");
+ deleteItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Artifact art = null;
+ if (fHvi instanceof ArtifactHyperItem)
+ art = ((ArtifactHyperItem) fHvi).getArtifact();
+ else if (fHvi instanceof ActionHyperItem) art = ((ActionHyperItem) fHvi).getArtifact();
+ if (MessageDialog.openQuestion(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Confirm Artifact Deletion?",
+ "\"" + art.getDescriptiveName() + "\"\nguid: " + art.getGuid() + "\n\n Are you sure you want to delete this artifact and it's default-hierarchy children?")) {
+ if (art != null) {
+ if (art instanceof StateMachineArtifact) SMAEditor.close((StateMachineArtifact) art, false);
+ try {
+ art.deleteAndPersist();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ popupMenu.dispose();
+ popupMenu = null;
+ }
+ });
+ }
+
+ MenuItem previewItem = new MenuItem(popupMenu, SWT.CASCADE);
+ previewItem.setText("Open in ATS");
+ previewItem.setEnabled(((fHvi instanceof ArtifactHyperItem) && (((ArtifactHyperItem) fHvi).getArtifact() instanceof StateMachineArtifact)) || ((fHvi instanceof ActionHyperItem) && (((ActionHyperItem) fHvi).getArtifact() instanceof StateMachineArtifact)));
+ previewItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Artifact a = null;
+ if (fHvi instanceof ArtifactHyperItem)
+ a = ((ArtifactHyperItem) fHvi).getArtifact();
+ else if (fHvi instanceof ActionHyperItem) a = ((ActionHyperItem) fHvi).getArtifact();
+ if (a != null) openActionEditor(a);
+ }
+ });
+ popupMenu.setVisible(true);
+ }
+ }
+
+ public void jumpTo(HyperViewItem si) {
+ if (homeSearchItem == null) {
+ return;
+ }
+ centerSearchItem = si;
+ refresh();
+ }
+
+ protected void center() {
+ zoom = defaultZoom;
+ vsb.setSelection(verticalSelection);
+ hsb.setSelection(40);
+ refresh();
+ }
+
+ protected void createActions() {
+
+ // Reset Action
+ Action centerAction = new Action() {
+
+ @Override
+ public void run() {
+ center();
+ }
+ };
+ centerAction.setText("Center");
+ centerAction.setToolTipText("Center");
+ centerAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.CENTER));
+
+ if (provideBackForwardActions()) {
+ // Back Action
+ backAction = new Action() {
+
+ @Override
+ public void run() {
+ printBackList("pre backSelected");
+ if (backList.size() == 0) {
+ return;
+ }
+ if (backListIndex > 0) {
+ backListIndex--;
+ }
+ jumpTo(backList.get(backListIndex));
+ printBackList("post backSelected");
+ }
+ };
+
+ backAction.setText("Back");
+ backAction.setToolTipText("Back");
+ backAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+ ISharedImages.IMG_TOOL_BACK));
+ // Forward Action
+ forwardAction = new Action() {
+
+ @Override
+ public void run() {
+ printBackList("pre forwardSelected");
+ if (backList.size() - 1 > backListIndex) {
+ backListIndex++;
+ jumpTo(backList.get(backListIndex));
+ }
+ printBackList("post forwardSelected");
+ }
+ };
+ forwardAction.setText("Forward");
+ forwardAction.setToolTipText("Forward");
+ forwardAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+ ISharedImages.IMG_TOOL_FORWARD));
+ }
+ // // Home
+ // Action homeAction = new Action() {
+ //
+ // public void run() {
+ // if (homeSearchItem == null) {
+ // return;
+ // }
+ // vsb.setSelection(verticalSelection);
+ // hsb.setSelection(40);
+ // backListAddSearchItem(homeSearchItem);
+ // jumpTo(homeSearchItem);
+ // }
+ // };
+ // homeAction.setText("Home");
+ // homeAction.setToolTipText("Home");
+ // homeAction.setImageDescriptor(AtsPlugin.getImageDescriptor("home.gif"));
+ // Zoom in
+ Action zoomInAction = new Action() {
+
+ @Override
+ public void run() {
+ if (homeSearchItem == null) {
+ return;
+ }
+ debug.report("zoomInAction");
+ zoom.pcRadius += zoom.pcRadiusFactor;
+ zoom.uuRadius += zoom.uuRadiusFactor;
+ zoom.xSeparation += zoom.xSeparationFactor;
+ refresh();
+
+ }
+ };
+ zoomInAction.setText("Zoom In");
+ zoomInAction.setToolTipText("Zoom In");
+ zoomInAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.ZOOM_IN));
+ // Zoom Out
+ Action zoomOutAction = new Action() {
+
+ @Override
+ public void run() {
+ if (homeSearchItem == null) {
+ return;
+ }
+ debug.report("zoomOutAction");
+ if (zoom.pcRadius >= zoom.pcRadiusFactor) {
+ zoom.pcRadius -= zoom.pcRadiusFactor;
+ }
+ if (zoom.uuRadius >= zoom.uuRadiusFactor) {
+ zoom.uuRadius -= zoom.uuRadiusFactor;
+ }
+ if (zoom.xSeparation >= zoom.xSeparationFactor) {
+ zoom.xSeparation -= zoom.xSeparationFactor;
+ }
+ refresh();
+ }
+ };
+ zoomOutAction.setText("Zoom Out");
+ zoomOutAction.setToolTipText("Zoom Out");
+ zoomOutAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.ZOOM_OUT));
+
+ titleAction = new Action("Expand Titles", IAction.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ debug.report("expandTitles");
+ refresh();
+ }
+ };
+ titleAction.setToolTipText("Expand Titles");
+
+ Action refreshAction = new Action("Refresh") {
+
+ @Override
+ public void run() {
+ if (homeSearchItem == null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Refresh Error", "Viewer not loaded, nothing to refresh.");
+ return;
+ }
+ handleRefreshButton();
+ }
+ };
+ refreshAction.setToolTipText("Refresh");
+ ImageManager.getImageDescriptor(FrameworkImage.REFRESH);
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+
+ showOrderAction = new Action("Show Order Value", IAction.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ setShowOrder(showOrderAction.isChecked());
+ handleRefreshButton();
+ }
+ };
+ showOrderAction.setToolTipText("Show Order Value");
+
+ IActionBars bars = getViewSite().getActionBars();
+ IMenuManager mm = bars.getMenuManager();
+ mm.add(new Separator());
+ mm.add(titleAction);
+ mm.add(showOrderAction);
+
+ IToolBarManager tbm = bars.getToolBarManager();
+ tbm.add(new Separator());
+ // tbm.add(homeAction);
+ tbm.add(centerAction);
+ tbm.add(zoomInAction);
+ tbm.add(zoomOutAction);
+ if (provideBackForwardActions()) {
+ tbm.add(backAction);
+ tbm.add(forwardAction);
+ }
+ tbm.add(refreshAction);
+
+ }
+
+ protected void handleRefreshButton() {
+ refresh();
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ @Override
+ public void setFocus() {
+ // viewer.getControl().setFocus();
+ }
+
+ public Color getCenterColor() {
+ return centerColor;
+ }
+
+ public void setCenterColor(Color color) {
+ centerColor = color;
+ }
+
+ public Color getNodeColor() {
+ return nodeColor;
+ }
+
+ public void setNodeColor(Color color) {
+ nodeColor = color;
+ }
+
+ public int getVerticalSelection() {
+ return verticalSelection;
+ }
+
+ public void setVerticalSelection(int verticalSelection) {
+ this.verticalSelection = verticalSelection;
+ if (vsb != null) vsb.setSelection(verticalSelection);
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ public void partActivated(IWorkbenchPart part) {
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part) {
+ }
+
+ public void partClosed(IWorkbenchPart part) {
+ if (part.equals(this)) {
+ dispose();
+ }
+ }
+
+ public void partDeactivated(IWorkbenchPart part) {
+ }
+
+ public void partOpened(IWorkbenchPart part) {
+ }
+
+ public Figure getContainer() {
+ return container;
+ }
+
+ public boolean isShowOrder() {
+ return showOrder;
+ }
+
+ public void setShowOrder(boolean showOrder) {
+ this.showOrder = showOrder;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperViewItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperViewItem.java
new file mode 100644
index 00000000000..ebcb3cff08e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/HyperViewItem.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.hyper;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.swt.graphics.Image;
+
+public class HyperViewItem {
+
+ private final ArrayList<HyperViewItem> bottoms = new ArrayList<HyperViewItem>(); // bottom
+ private final ArrayList<HyperViewItem> tops = new ArrayList<HyperViewItem>(); // top
+ private final ArrayList<HyperViewItem> lefts = new ArrayList<HyperViewItem>(); // left
+ private final ArrayList<HyperViewItem> rights = new ArrayList<HyperViewItem>(); // right
+ private String guid;
+ private final String title;
+ private Image image;
+ private Object data;
+ private String toolTip;
+ private String relationToolTip;
+ private String relationLabel;
+ private boolean relationDirty = false;
+ private boolean highlight = false;
+ private boolean current = false;
+ private boolean show = true;
+ private RelationLink link;
+
+ public HyperViewItem(String title) {
+ this(title, null);
+ }
+
+ public HyperViewItem(String title, Image image) {
+ this.title = title;
+ this.image = image;
+ this.toolTip = title;
+ }
+
+ // lastModified
+ public void clearAllSearchItemLinks() {
+ bottoms.clear();
+ tops.clear();
+ lefts.clear();
+ rights.clear();
+ }
+
+ public Image getMarkImage() {
+ return null;
+ }
+
+ public void addBottom(HyperViewItem si) {
+ bottoms.add(si);
+ }
+
+ public void addTop(HyperViewItem si) {
+ tops.add(si);
+ }
+
+ public void removeTop(HyperViewItem si) {
+ if (tops.contains(si)) {
+ tops.remove(si);
+ }
+ }
+
+ public String getShortTitle() {
+ return title;
+ }
+
+ public void addLeft(HyperViewItem si) {
+ lefts.add(si);
+ }
+
+ public void addRight(HyperViewItem si) {
+ rights.add(si);
+ }
+
+ /**
+ * @return ArrayList of HyperViewItems
+ */
+ public ArrayList<HyperViewItem> getBottom() {
+ return bottoms;
+ }
+
+ /**
+ * @return ArrayList of HyperViewItems
+ */
+ public ArrayList<HyperViewItem> getTop() {
+ return tops;
+ }
+
+ /**
+ * @return ArrayList of HyperViewItems
+ */
+ public ArrayList<HyperViewItem> getLeft() {
+ return lefts;
+ }
+
+ /**
+ * @return ArrayList of HyperViewItems
+ */
+ public ArrayList<HyperViewItem> getRight() {
+ return rights;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public Image getImage() throws OseeCoreException {
+ return image;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ public void setToolTip(String toolTip) {
+ this.toolTip = toolTip;
+ }
+
+ public boolean isShow() {
+ return show;
+ }
+
+ public void setShow(boolean show) {
+ this.show = show;
+ }
+
+ public void setImage(Image image) {
+ this.image = image;
+ }
+
+ public boolean isHighlight() {
+ return highlight;
+ }
+
+ public void setHighlight(boolean highlight) {
+ this.highlight = highlight;
+ }
+
+ public boolean isCurrent() {
+ return current;
+ }
+
+ public void setCurrent(boolean current) {
+ this.current = current;
+ }
+
+ public void setGuid(String guid) {
+ this.guid = guid;
+ }
+
+ public String getGuid() {
+ return guid;
+ }
+
+ public String getRelationToolTip() {
+ return relationToolTip;
+ }
+
+ public void setRelationToolTip(String relationToolTip) {
+ this.relationToolTip = relationToolTip;
+ }
+
+ public String getRelationLabel() {
+ return relationLabel;
+ }
+
+ public boolean isRelationDirty() {
+ return relationDirty;
+ }
+
+ public void setRelationLabel(String relationLabel) {
+ this.relationLabel = relationLabel;
+ }
+
+ public void setRelationDirty(boolean relationDirty) {
+ this.relationDirty = relationDirty;
+ }
+
+ public RelationLink getLink() {
+ return link;
+ }
+
+ public void setLink(RelationLink link) {
+ this.link = link;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/IHyperArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/IHyperArtifact.java
new file mode 100644
index 00000000000..592b1994887
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/IHyperArtifact.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.ats.hyper;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IHyperArtifact {
+
+ public boolean isDeleted();
+
+ public String getHyperName();
+
+ public String getHyperType();
+
+ public String getHyperState();
+
+ public String getGuid();
+
+ public String getHyperAssignee();
+
+ public String getHyperTargetVersion();
+
+ public Image getHyperAssigneeImage() throws Exception;
+
+ public Artifact getHyperArtifact();
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksActionHyperItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksActionHyperItem.java
new file mode 100644
index 00000000000..bc47b71043b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksActionHyperItem.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.ats.hyper;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorSimpleProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TasksActionHyperItem extends ActionHyperItem {
+
+ private final Collection<TaskArtifact> taskArtifacts;
+
+ /**
+ * @param hyperartifact
+ */
+ public TasksActionHyperItem(Collection<TaskArtifact> taskArtifacts) {
+ super(new TasksHyperViewArtifact(taskArtifacts));
+ this.taskArtifacts = taskArtifacts;
+ setRelationToolTip("Task");
+ }
+
+ @Override
+ public void handleDoubleClick(HyperViewItem hyperViewItem) throws OseeCoreException {
+ super.handleDoubleClick(hyperViewItem);
+ WorldEditor.open(new WorldEditorSimpleProvider("Tasks", taskArtifacts));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.ActionHyperItem#calculateCurrent(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public void calculateCurrent(Artifact currentArtifact) {
+ setCurrent(taskArtifacts.contains(currentArtifact));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.ActionHyperItem#getImage()
+ */
+ @Override
+ public Image getImage() throws OseeCoreException {
+ return ImageManager.getImage(ArtifactTypeManager.getType(TaskArtifact.ARTIFACT_NAME));
+
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksHyperViewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksHyperViewArtifact.java
new file mode 100644
index 00000000000..2c301b88d11
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/hyper/TasksHyperViewArtifact.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.ats.hyper;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TasksHyperViewArtifact implements IHyperArtifact {
+
+ private final Collection<? extends TaskArtifact> taskArts;
+
+ public TasksHyperViewArtifact(Collection<? extends TaskArtifact> taskArts) {
+ this.taskArts = taskArts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getGuid()
+ */
+ @Override
+ public String getGuid() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperArtifact()
+ */
+ @Override
+ public Artifact getHyperArtifact() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperAssignee()
+ */
+ @Override
+ public String getHyperAssignee() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperAssigneeImage()
+ */
+ @Override
+ public Image getHyperAssigneeImage() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperName()
+ */
+ @Override
+ public String getHyperName() {
+ return taskArts.size() + " Tasks";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperState()
+ */
+ @Override
+ public String getHyperState() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperType()
+ */
+ @Override
+ public String getHyperType() {
+ return TaskArtifact.ARTIFACT_NAME;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#getHyperTargetVersion()
+ */
+ @Override
+ public String getHyperTargetVersion() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.hyper.IHyperArtifact#isDeleted()
+ */
+ @Override
+ public boolean isDeleted() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ArtifactImpactToActionSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ArtifactImpactToActionSearchItem.java
new file mode 100644
index 00000000000..d9976105c46
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ArtifactImpactToActionSearchItem.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.navigate;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ArtifactCheckTreeDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialogWithBranchSelect;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactImpactToActionSearchItem extends XNavigateItemAction {
+
+ private static String TITLE = "Search Artifact Impact to Action";
+
+ /**
+ * @param parent
+ */
+ public ArtifactImpactToActionSearchItem(XNavigateItem parent) {
+ super(parent, TITLE, FrameworkImage.FLASHLIGHT);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ EntryDialogWithBranchSelect ed =
+ new EntryDialogWithBranchSelect(getName(), "Enter Artifact Name (or string) to search (no wildcards)");
+ if (ed.open() == 0) {
+ ActionToArtifactImpactJob job = new ActionToArtifactImpactJob(ed.getEntry(), ed.getBranch());
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ }
+
+ public class ActionToArtifactImpactJob extends Job {
+ private IProgressMonitor monitor;
+ private final String artifactName;
+ private final XResultData rd = new XResultData();
+ private final Branch branch;
+
+ public ActionToArtifactImpactJob(String artifactName, Branch branch) {
+ super("Searching \"" + artifactName + "\"...");
+ this.artifactName = artifactName;
+ this.branch = branch;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ try {
+ getMatrixItems();
+ rd.report(TITLE + " - \"" + artifactName + "\"");
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ }
+
+ private void getMatrixItems() throws OseeCoreException {
+ final Collection<Artifact> srchArts =
+ ArtifactQuery.getArtifactsFromName("%" + artifactName + "%", branch, true);
+ final Set<Artifact> processArts = new HashSet<Artifact>();
+ if (srchArts.size() == 0) return;
+ if (srchArts.size() > 1) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ ArtifactCheckTreeDialog dialog = new ArtifactCheckTreeDialog(srchArts);
+ dialog.setTitle(TITLE);
+ dialog.setMessage("Select Artifacts to Search");
+ if (dialog.open() == 0) {
+ processArts.addAll(dialog.getSelection());
+ }
+ }
+ }, true);
+
+ } else {
+ processArts.addAll(srchArts);
+ }
+ int x = 1;
+ rd.log("Artifact Impact to Action for artifact(s) on branch \"" + branch.getBranchShortName() + "\"");
+
+ HashCollection<Artifact, TransactionId> transactionMap = ChangeManager.getModifingTransactions(processArts);
+ HashCollection<Artifact, Branch> branchMap = ChangeManager.getModifingBranches(processArts);
+ for (Artifact srchArt : processArts) {
+ String str = String.format("Processing %d/%d - %s ", x++, processArts.size(), srchArt.getDescriptiveName());
+ System.out.println(str);
+ rd.log("\n" + AHTML.bold(srchArt.getDescriptiveName()));
+ monitor.subTask(str);
+ int y = 1;
+ rd.addRaw(AHTML.beginMultiColumnTable(95, 1));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "Status", "HRID", "Title"}));
+
+ // Check for changes on working branches
+ boolean workingBranchesFound = false;
+
+ Collection<Branch> branches = branchMap.getValues(srchArt);
+ if (branches != null) {
+ for (Branch branch : branches) {
+ Artifact assocArt = branch.getAssociatedArtifact();
+ if (assocArt != null && !assocArt.equals(UserManager.getUser(SystemUser.OseeSystem))) {
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {assocArt.getArtifactTypeName(), "Working",
+ XResultData.getHyperlink(assocArt), assocArt.getDescriptiveName()}));
+ } else {
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {"Branch", "", branch.getBranchName()}));
+ }
+ workingBranchesFound = true;
+ }
+ }
+ if (!workingBranchesFound) {
+ rd.addRaw(AHTML.addRowSpanMultiColumnTable("No Impacting Working Branches Found", 3));
+ }
+ // Add committed changes
+ boolean committedChanges = false;
+ Collection<TransactionId> transactions = transactionMap.getValues(srchArt);
+ if (transactions != null) {
+ for (TransactionId transactionId : transactions) {
+ String transStr = String.format("Tranaction %d/%d", y++, transactions.size());
+ System.out.println(transStr);
+ monitor.subTask(transStr);
+ if (transactionId.getCommitArtId() > 0) {
+ Artifact assocArt =
+ ArtifactQuery.getArtifactFromId(transactionId.getCommitArtId(),
+ BranchManager.getCommonBranch());
+ if (assocArt instanceof TeamWorkFlowArtifact) {
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {assocArt.getArtifactTypeName(),
+ "Committed", assocArt.getHumanReadableId(), assocArt.getDescriptiveName()}));
+ committedChanges = true;
+ }
+ }
+ }
+ }
+ if (!committedChanges) {
+ rd.addRaw(AHTML.addRowSpanMultiColumnTable("No Impacting Actions Found", 3));
+ }
+ rd.addRaw(AHTML.endMultiColumnTable());
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateComposite.java
new file mode 100644
index 00000000000..e3ea5962004
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateComposite.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.ats.navigate;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.task.TaskEditorParameterSearchItem;
+import org.eclipse.osee.ats.task.TaskEditorParameterSearchItemProvider;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorParameterSearchItem;
+import org.eclipse.osee.ats.world.WorldEditorParameterSearchItemProvider;
+import org.eclipse.osee.ats.world.WorldEditorUISearchItemProvider;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.ats.world.search.WorldUISearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.LoadView;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateViewItems;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNavigateComposite extends XNavigateComposite {
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public AtsNavigateComposite(XNavigateViewItems navigateViewItems, Composite parent, int style) {
+ super(navigateViewItems, parent, style);
+ Result result = AtsPlugin.areOSEEServicesAvailable();
+ if (result.isFalse()) {
+ (new Label(parent, SWT.NONE)).setText(result.getText());
+ return;
+ }
+ }
+
+ @Override
+ protected void handleDoubleClick() throws OseeCoreException {
+ IStructuredSelection sel = (IStructuredSelection) filteredTree.getViewer().getSelection();
+ if (!sel.iterator().hasNext()) return;
+ XNavigateItem item = (XNavigateItem) sel.iterator().next();
+ handleDoubleClick(item);
+ }
+
+ @Override
+ protected void handleDoubleClick(XNavigateItem item, TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ Collection<TableLoadOption> tableLoadOpts = Collections.getAggregate(tableLoadOptions);
+ boolean dontCopyWsi = tableLoadOpts.contains(TableLoadOption.DontCopySearchItem);
+ if (item instanceof SearchNavigateItem) {
+ WorldSearchItem worldSearchItem = ((SearchNavigateItem) item).getWorldSearchItem();
+ if (worldSearchItem.getLoadView() == LoadView.WorldEditor) {
+ if (worldSearchItem instanceof WorldUISearchItem) {
+ WorldEditor.open(new WorldEditorUISearchItemProvider(
+ (WorldUISearchItem) (dontCopyWsi ? worldSearchItem : worldSearchItem.copy()), null,
+ tableLoadOptions));
+ } else if (worldSearchItem instanceof WorldEditorParameterSearchItem) {
+ WorldEditor.open(new WorldEditorParameterSearchItemProvider(
+ (WorldEditorParameterSearchItem) (dontCopyWsi ? worldSearchItem : worldSearchItem.copy()), null,
+ tableLoadOptions));
+ } else {
+ AWorkbench.popup("ERROR", "Unhandled WorldEditor navigate item");
+ }
+ } else if (worldSearchItem.getLoadView() == LoadView.TaskEditor) {
+ if (worldSearchItem instanceof TaskEditorParameterSearchItem) {
+ TaskEditor.open(new TaskEditorParameterSearchItemProvider(
+ (TaskEditorParameterSearchItem) (dontCopyWsi ? worldSearchItem : worldSearchItem.copy()),null,tableLoadOptions));
+ } else {
+ AWorkbench.popup("ERROR", "Unhandled TaskEditor navigate item");
+ }
+ } else {
+ AWorkbench.popup("ERROR", "Unhandled navigate item");
+ }
+ } else
+ super.handleDoubleClick(item, tableLoadOptions);
+ }
+
+ @Override
+ public void refresh() {
+ super.refresh();
+ if (AtsPlugin.isAtsAdmin()) {
+ for (XNavigateItem item : getItems()) {
+ if (item.getName().equals("Admin")) {
+ filteredTree.getViewer().expandToLevel(item, 1);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateQuickSearch.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateQuickSearch.java
new file mode 100644
index 00000000000..ccadffac78e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateQuickSearch.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.ats.navigate;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.ats.world.search.WorldUISearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Megumi Telles
+ */
+public class AtsNavigateQuickSearch extends WorldUISearchItem {
+ private String searchStr;
+ private boolean includeCompleteCancelled = false;
+
+ /**
+ * @param name
+ */
+ public AtsNavigateQuickSearch(String name) {
+ super(name);
+ }
+
+ public AtsNavigateQuickSearch(String name, String searchStr) {
+ super(name);
+ this.searchStr = searchStr;
+ }
+
+ public AtsNavigateQuickSearch(String name, String searchStr, boolean includeCompleteCancelled) {
+ super(name);
+ this.searchStr = searchStr;
+ this.includeCompleteCancelled = includeCompleteCancelled;
+ }
+
+ /**
+ * @param atsNavigateQuickSearch
+ */
+ public AtsNavigateQuickSearch(AtsNavigateQuickSearch atsNavigateQuickSearch) {
+ super(atsNavigateQuickSearch);
+ this.searchStr = atsNavigateQuickSearch.getSearchStr();
+ this.includeCompleteCancelled = atsNavigateQuickSearch.includeCompleteCancelled;
+ }
+
+ /**
+ * @return
+ */
+ private String getSearchStr() {
+ return this.searchStr;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#performSearch(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ try {
+ return getExpectedArtifacts(ArtifactQuery.getArtifactsFromAttributeWithKeywords(AtsPlugin.getAtsBranch(),
+ searchStr, false, false, false));
+ } catch (Exception ex) {
+ OseeLog.log("AtsNavigateQuickSearch.performSearch", Level.SEVERE, ex.getMessage(), ex);
+ }
+ return null;
+ }
+
+ private Collection<Artifact> getExpectedArtifacts(List<Artifact> arts) throws OseeCoreException {
+ List<Artifact> allArtifacts = new ArrayList<Artifact>();
+ for (Artifact art : arts) {
+ // only ATS Artifacts
+ if (art instanceof StateMachineArtifact) {
+ StateMachineArtifact sma = (StateMachineArtifact) art;
+ // default excludes canceled/completed
+ if (this.includeCompleteCancelled == false) {
+ if (!sma.getSmaMgr().isCancelledOrCompleted()) {
+ allArtifacts.add(art);
+ }
+ } else
+ allArtifacts.add(art);
+ }
+ }
+ return allArtifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#copy()
+ */
+ @Override
+ public WorldSearchItem copy() {
+ return new AtsNavigateQuickSearch(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java
new file mode 100644
index 00000000000..4888d8bbe22
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/AtsNavigateViewItems.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.navigate;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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.Platform;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.NewAction;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.ats.health.ValidateAtsDatabase;
+import org.eclipse.osee.ats.health.ValidateChangeReportByHrid;
+import org.eclipse.osee.ats.health.ValidateChangeReports;
+import org.eclipse.osee.ats.navigate.EmailTeamsItem.MemberType;
+import org.eclipse.osee.ats.notify.AtsNotificationNavigateItem;
+import org.eclipse.osee.ats.util.DoesNotWorkItem;
+import org.eclipse.osee.ats.world.search.ActionableItemWorldSearchItem;
+import org.eclipse.osee.ats.world.search.ArtifactTypeSearchItem;
+import org.eclipse.osee.ats.world.search.ArtifactTypesSearchItem;
+import org.eclipse.osee.ats.world.search.AtsAttributeSearchItem;
+import org.eclipse.osee.ats.world.search.GroupWorldSearchItem;
+import org.eclipse.osee.ats.world.search.MultipleHridSearchItem;
+import org.eclipse.osee.ats.world.search.MyCompletedSearchItem;
+import org.eclipse.osee.ats.world.search.MyFavoritesSearchItem;
+import org.eclipse.osee.ats.world.search.MyOrigSearchItem;
+import org.eclipse.osee.ats.world.search.MyReviewWorkflowItem;
+import org.eclipse.osee.ats.world.search.MySubscribedSearchItem;
+import org.eclipse.osee.ats.world.search.MyWorldSearchItem;
+import org.eclipse.osee.ats.world.search.NextVersionSearchItem;
+import org.eclipse.osee.ats.world.search.ShowOpenWorkflowsByArtifactType;
+import org.eclipse.osee.ats.world.search.StateWorldSearchItem;
+import org.eclipse.osee.ats.world.search.TaskSearchWorldSearchItem;
+import org.eclipse.osee.ats.world.search.UserCommunitySearchItem;
+import org.eclipse.osee.ats.world.search.UserRelatedToAtsObjectSearch;
+import org.eclipse.osee.ats.world.search.VersionTargetedForTeamSearchItem;
+import org.eclipse.osee.ats.world.search.MyReviewWorkflowItem.ReviewState;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.LoadView;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamContributionManager;
+import org.eclipse.osee.framework.ui.skynet.results.example.ResultsEditorExample;
+import org.eclipse.osee.framework.ui.skynet.results.example.XResultDataExample;
+import org.eclipse.osee.framework.ui.skynet.util.EmailGroupsAndUserGroups;
+import org.eclipse.osee.framework.ui.skynet.util.EmailGroupsAndUserGroups.GroupType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemFolder;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateViewItems;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNavigateViewItems extends XNavigateViewItems {
+ private static AtsNavigateViewItems navigateItems = new AtsNavigateViewItems();
+
+ public AtsNavigateViewItems() {
+ super();
+ }
+
+ public static AtsNavigateViewItems getInstance() {
+ return navigateItems;
+ }
+
+ @Override
+ public List<XNavigateItem> getSearchNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+
+ if (AtsPlugin.areOSEEServicesAvailable().isFalse()) {
+ return items;
+ }
+
+ try {
+ User user = UserManager.getUser();
+
+ items.add(new SearchNavigateItem(null, new MyWorldSearchItem("My World", user)));
+ items.add(new SearchNavigateItem(null, new MyFavoritesSearchItem("My Favorites", user)));
+ items.add(new SearchNavigateItem(null, new MyReviewWorkflowItem("My Reviews", user, ReviewState.InWork)));
+ items.add(new VisitedItems(null));
+ items.add(new XNavigateItemAction(null, new NewAction(), AtsImage.NEW_ACTION));
+ items.add(new SearchNavigateItem(null, new MyWorldSearchItem("User's World")));
+
+ XNavigateItem otherItems = new XNavigateItemFolder(null, "Other My Searches");
+ new SearchNavigateItem(otherItems, new MySubscribedSearchItem("My Subscribed", user));
+ new SearchNavigateItem(otherItems, new MyOrigSearchItem("My Originator - InWork", user,
+ MyOrigSearchItem.OriginatedState.InWork));
+ new SearchNavigateItem(otherItems, new MyOrigSearchItem("My Originator - All", user,
+ MyOrigSearchItem.OriginatedState.All));
+ new SearchNavigateItem(otherItems, new MyCompletedSearchItem("My Completed", user));
+ new SearchNavigateItem(otherItems, new MyReviewWorkflowItem("My Reviews - All", user, ReviewState.All));
+ items.add(otherItems);
+
+ otherItems = new XNavigateItemFolder(null, "Other User Searches");
+ new SearchNavigateItem(otherItems, new MyWorldSearchItem("User's World"));
+ new SearchNavigateItem(otherItems, new MyOrigSearchItem("User's Originator - InWork", null,
+ MyOrigSearchItem.OriginatedState.InWork));
+ new SearchNavigateItem(otherItems, new MyOrigSearchItem("User's Originator - All", null,
+ MyOrigSearchItem.OriginatedState.All));
+ new SearchNavigateItem(otherItems, new MyCompletedSearchItem("User's Completed"));
+ new SearchNavigateItem(otherItems, new MyFavoritesSearchItem("User's Favorites"));
+ new SearchNavigateItem(otherItems, new MySubscribedSearchItem("User's Subscribed"));
+ new SearchNavigateItem(otherItems, new MyReviewWorkflowItem("User's Reviews - InWork", null,
+ ReviewState.InWork));
+ new SearchNavigateItem(otherItems, new MyReviewWorkflowItem("User's Reviews - All", null, ReviewState.All));
+ if (AtsPlugin.isAtsAdmin()) {
+ new SearchNavigateItem(otherItems, new UserRelatedToAtsObjectSearch(
+ "User's All Related Objects - Admin Only", null, false, LoadView.WorldEditor));
+ new SearchNavigateItem(otherItems, new UserRelatedToAtsObjectSearch(
+ "User's All Active Related Objects - Admin Only", null, true, LoadView.WorldEditor));
+ }
+ items.add(otherItems);
+
+ items.add(new SearchNavigateItem(null, new TaskSearchWorldSearchItem()));
+ items.add(new SearchNavigateItem(null, new GroupWorldSearchItem((Branch) null)));
+ items.add(new SearchNavigateItem(null, new TeamWorkflowSearchWorkflowSearchItem()));
+ items.add(new SearchNavigateItem(null, new UserCommunitySearchItem()));
+ items.add(new SearchNavigateItem(null, new ActionableItemWorldSearchItem(null, "Actionable Item Search",
+ false, false)));
+
+ XNavigateItem releaseItems = new XNavigateItem(null, "Versions", FrameworkImage.VERSION);
+ new MassEditTeamVersionItem("Team Versions", releaseItems, (TeamDefinitionArtifact) null,
+ FrameworkImage.VERSION);
+ new SearchNavigateItem(releaseItems, new VersionTargetedForTeamSearchItem(null, null, false,
+ LoadView.WorldEditor));
+ new SearchNavigateItem(releaseItems, new NextVersionSearchItem(null, LoadView.WorldEditor));
+ new ReleaseVersionItem(releaseItems, null);
+ new CreateNewVersionItem(releaseItems, null);
+ new GenerateVersionReportItem(releaseItems);
+ new GenerateFullVersionReportItem(releaseItems);
+ items.add(releaseItems);
+
+ addExtensionPointItems(items);
+
+ XNavigateItem reviewItem = new XNavigateItem(null, "Reviews", AtsImage.REVIEW);
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Open " + DecisionReviewArtifact.ARTIFACT_NAME + "s", DecisionReviewArtifact.ARTIFACT_NAME, false,
+ false));
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Workflows Waiting " + DecisionReviewArtifact.ARTIFACT_NAME + "s",
+ DecisionReviewArtifact.ARTIFACT_NAME, false, true));
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Open " + PeerToPeerReviewArtifact.ARTIFACT_NAME + "s", PeerToPeerReviewArtifact.ARTIFACT_NAME,
+ false, false));
+ new SearchNavigateItem(reviewItem, new ShowOpenWorkflowsByArtifactType(
+ "Show Workflows Waiting " + PeerToPeerReviewArtifact.ARTIFACT_NAME + "s",
+ PeerToPeerReviewArtifact.ARTIFACT_NAME, false, true));
+ new NewPeerToPeerReviewItem(reviewItem);
+ new GenerateReviewParticipationReport(reviewItem);
+ items.add(reviewItem);
+
+ XNavigateItem stateItems = new XNavigateItem(null, "States", AtsImage.GLOBE);
+ new SearchNavigateItem(stateItems, new StateWorldSearchItem());
+ new SearchNavigateItem(stateItems, new StateWorldSearchItem("Search for Authorize Actions", "Authorize"));
+ items.add(stateItems);
+
+ // Search Items
+ items.add(new OpenChangeReportByIdItem(null));
+ items.add(new SearchNavigateItem(null, new MultipleHridSearchItem()));
+ items.add(new SearchNavigateItem(null, new AtsAttributeSearchItem()));
+ items.add(new SearchNavigateItem(null, new AtsAttributeSearchItem("Search ATS Titles", "Name", null)));
+ items.add(new ArtifactImpactToActionSearchItem(null));
+
+ XNavigateItem reportItems = new XNavigateItem(null, "Reports", AtsImage.REPORT);
+ new FirstTimeQualityMetricReportItem(reportItems);
+ new XNavigateItem(reportItems, "ATS World Reports - Input from Actions in ATS World", AtsImage.REPORT);
+ new BarChartExample(reportItems);
+ new ResultsEditorExample(reportItems);
+ new XResultDataExample(reportItems);
+ // new ExtendedStatusReportItem(atsReportItems, "ATS World Extended Status Report");
+
+ XNavigateItem emailItems = new XNavigateItem(null, "Email & Notifications", FrameworkImage.EMAIL);
+ new EmailTeamsItem(emailItems, null, MemberType.Both);
+ new EmailTeamsItem(emailItems, null, MemberType.Leads);
+ new EmailTeamsItem(emailItems, null, MemberType.Members);
+ new EmailGroupsAndUserGroups(emailItems, GroupType.Both);
+ new SubscribeByActionableItem(emailItems);
+ new SubscribeByTeamDefinition(emailItems);
+ items.add(emailItems);
+
+ items.add(reportItems);
+
+ XNavigateItem importItems = new XNavigateItem(null, "Import", FrameworkImage.IMPORT);
+ new ImportActionsViaSpreadsheet(importItems);
+ items.add(importItems);
+
+ BlamContributionManager.addBlamOperationsToNavigator(items);
+
+ if (AtsPlugin.isAtsAdmin()) {
+ XNavigateItem adminItems = new XNavigateItem(null, "Admin", FrameworkImage.ADMIN);
+
+ new AtsNotificationNavigateItem(adminItems);
+ new AtsNotificationNavigateItem(adminItems, true);
+ new UpdateAtsWorkItemDefinitions(adminItems);
+ new UpdateAssigneesRelations(adminItems);
+ new DisplayCurrentOseeEventListeners(adminItems);
+
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all Actions", "Action"));
+ new SearchNavigateItem(adminItems,
+ new ArtifactTypeSearchItem("Show all Decision Review", "Decision Review"));
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all PeerToPeer Review",
+ "PeerToPeer Review"));
+ new SearchNavigateItem(adminItems, new ArtifactTypesSearchItem("Show all Team Workflows",
+ TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames()));
+ new SearchNavigateItem(adminItems, new ArtifactTypeSearchItem("Show all Tasks", "Task"));
+
+ new DoesNotWorkItem(adminItems);
+
+ XNavigateItem healthItems = new XNavigateItemFolder(adminItems, "Health");
+ new ValidateAtsDatabase(healthItems);
+ new ValidateChangeReports(healthItems);
+ new ValidateChangeReportByHrid(healthItems);
+
+ // new ActionNavigateItem(adminItems, new XViewerViewAction());
+ // new ActionNavigateItem(adminItems, new OpenEditorAction());
+ // new CreateBugFixesItem(adminItems);
+
+ items.add(adminItems);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return items;
+ }
+
+ return items;
+ }
+
+ public void addExtensionPointItems(List<XNavigateItem> items) {
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsNavigateItem");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsNavigateItem extension point");
+ }
+ IExtension[] extensions = point.getExtensions();
+ Map<String, XNavigateItem> nameToNavItem = new HashMap<String, XNavigateItem>();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsNavigateItem")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ }
+ }
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Object obj = bundle.loadClass(classname).newInstance();
+ IAtsNavigateItem task = (IAtsNavigateItem) obj;
+ for (XNavigateItem navItem : task.getNavigateItems()) {
+ nameToNavItem.put(navItem.getName(), navItem);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Error loading AtsNavigateItem extension", ex);
+ }
+ }
+ }
+ // Put in alpha order
+ String[] names = nameToNavItem.keySet().toArray(new String[nameToNavItem.size()]);
+ Arrays.sort(names);
+ for (String name : names) {
+ items.add(nameToNavItem.get(name));
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/BarChartExample.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/BarChartExample.java
new file mode 100644
index 00000000000..14aefc28422
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/BarChartExample.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.ats.navigate;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.birt.chart.model.Chart;
+import org.eclipse.birt.chart.model.ChartWithAxes;
+import org.eclipse.birt.chart.model.attribute.Anchor;
+import org.eclipse.birt.chart.model.attribute.AxisType;
+import org.eclipse.birt.chart.model.attribute.ChartDimension;
+import org.eclipse.birt.chart.model.attribute.IntersectionType;
+import org.eclipse.birt.chart.model.attribute.Position;
+import org.eclipse.birt.chart.model.attribute.TickStyle;
+import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl;
+import org.eclipse.birt.chart.model.component.Axis;
+import org.eclipse.birt.chart.model.component.Series;
+import org.eclipse.birt.chart.model.component.impl.SeriesImpl;
+import org.eclipse.birt.chart.model.data.NumberDataSet;
+import org.eclipse.birt.chart.model.data.SeriesDefinition;
+import org.eclipse.birt.chart.model.data.TextDataSet;
+import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl;
+import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;
+import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl;
+import org.eclipse.birt.chart.model.impl.ChartWithAxesImpl;
+import org.eclipse.birt.chart.model.layout.Legend;
+import org.eclipse.birt.chart.model.layout.Plot;
+import org.eclipse.birt.chart.model.type.BarSeries;
+import org.eclipse.birt.chart.model.type.impl.BarSeriesImpl;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorProvider;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.chart.ResultsEditorChartTab;
+import org.eclipse.osee.framework.ui.skynet.results.html.ResultsEditorHtmlTab;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+public class BarChartExample extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ * @param action
+ */
+ public BarChartExample(XNavigateItem parent) {
+ super(parent, "Bar Chart Example", AtsImage.REPORT);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction#run(org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption[])
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ ResultsEditor.open(new IResultsEditorProvider() {
+
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return "Example Bar Chart";
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ List<IResultsEditorTab> tabs = new ArrayList<IResultsEditorTab>();
+ tabs.add(new ResultsEditorChartTab("Chart", createMyChart()));
+ tabs.add(getReportHtmlTab());
+ return tabs;
+ }
+
+ });
+ }
+
+ private IResultsEditorTab getReportHtmlTab() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("Example Bar Chart Data");
+ sb.append(AHTML.beginMultiColumnTable(95, 1));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "Title", "Status"}));
+ for (int x = 0; x < 3; x++)
+ sb.append(AHTML.addRowMultiColumnTable(new String[] {"Type " + x, "Title " + x, x + ""}));
+ sb.append(AHTML.endMultiColumnTable());
+ return new ResultsEditorHtmlTab("Example Bar Chart Data", "Report", AHTML.simplePage(sb.toString()));
+ }
+
+ public static Chart createMyChart() {
+ // bart charts are based on charts that contain axes
+ ChartWithAxes cwaBar = ChartWithAxesImpl.create();
+ cwaBar.getBlock().setBackground(ColorDefinitionImpl.WHITE());
+ cwaBar.getBlock().getOutline().setVisible(true);
+ cwaBar.setDimension(ChartDimension.TWO_DIMENSIONAL_WITH_DEPTH_LITERAL);
+
+ // customize the plot
+ Plot p = cwaBar.getPlot();
+ p.getClientArea().setBackground(ColorDefinitionImpl.create(255, 255, 225));
+ p.getOutline().setVisible(false);
+
+ cwaBar.getTitle().getLabel().getCaption().setValue("Example Bar Chart");
+
+ // customize the legend
+ Legend lg = cwaBar.getLegend();
+ lg.getText().getFont().setSize(16);
+ lg.getInsets().set(10, 5, 0, 0);
+ lg.setAnchor(Anchor.NORTH_LITERAL);
+
+ // customize the X-axis
+ Axis xAxisPrimary = cwaBar.getPrimaryBaseAxes()[0];
+ xAxisPrimary.setType(AxisType.TEXT_LITERAL);
+ xAxisPrimary.getMajorGrid().setTickStyle(TickStyle.BELOW_LITERAL);
+ xAxisPrimary.getOrigin().setType(IntersectionType.VALUE_LITERAL);
+ xAxisPrimary.getTitle().setVisible(false);
+
+ // customize the Y-axis
+ Axis yAxisPrimary = cwaBar.getPrimaryOrthogonalAxis(xAxisPrimary);
+ yAxisPrimary.getMajorGrid().setTickStyle(TickStyle.LEFT_LITERAL);
+ yAxisPrimary.setType(AxisType.LINEAR_LITERAL);
+ yAxisPrimary.getLabel().getCaption().getFont().setRotation(90);
+
+ // initialize a collection with the X-series data
+ java.util.Vector vs = new java.util.Vector();
+ vs.add("zero");
+ vs.add("one");
+ vs.add("two");
+
+ TextDataSet categoryValues = TextDataSetImpl.create(vs);
+
+ // initialize a collection with the Y-series data
+ ArrayList vn1 = new ArrayList();
+ vn1.add(new Double(25));
+ vn1.add(new Double(35));
+ vn1.add(new Double(-45));
+
+ NumberDataSet orthoValues1 = NumberDataSetImpl.create(vn1);
+
+ // create the category base series
+ Series seCategory = SeriesImpl.create();
+ seCategory.setDataSet(categoryValues);
+
+ // create the value orthogonal series
+ BarSeries bs1 = (BarSeries) BarSeriesImpl.create();
+ bs1.setSeriesIdentifier("My Bar Series");
+ bs1.setDataSet(orthoValues1);
+ bs1.setRiserOutline(null);
+ bs1.getLabel().setVisible(true);
+ bs1.setLabelPosition(Position.INSIDE_LITERAL);
+
+ // wrap the base series in the X-axis series definition
+ SeriesDefinition sdX = SeriesDefinitionImpl.create();
+ sdX.getSeriesPalette().update(0); // set the colors in the palette
+ xAxisPrimary.getSeriesDefinitions().add(sdX);
+ sdX.getSeries().add(seCategory);
+
+ // wrap the orthogonal series in the X-axis series definition
+ SeriesDefinition sdY = SeriesDefinitionImpl.create();
+ sdY.getSeriesPalette().update(1); // set the color in the palette
+ yAxisPrimary.getSeriesDefinitions().add(sdY);
+ sdY.getSeries().add(bs1);
+
+ return cwaBar;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ConfigureDBForAts.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ConfigureDBForAts.java
new file mode 100644
index 00000000000..208f25d2ec9
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ConfigureDBForAts.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.navigate;
+
+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.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.vue.LoadAIsAndTeamsAction;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ConfigureDBForAts extends XNavigateItemAction {
+
+ private final String pluginId;
+
+ public ConfigureDBForAts(XNavigateItem parent, String pluginId) {
+ super(parent, "Admin - Configure DB For ATS");
+ this.pluginId = pluginId;
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Configure DB for ATS",
+ "Configure DB for ATS " + pluginId)) return;
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Configure DB for ATS",
+ "This will break things really bad if ATS is alread configured for this item. Are you sure?")) return;
+
+ Jobs.startJob(new Report(getName()), true);
+ }
+
+ public class Report extends Job {
+
+ public Report(String name) {
+ super(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ monitor.subTask("Loading Work Item Definitions for " + pluginId);
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(WriteType.New, null,
+ AtsWorkDefinitions.getAtsWorkDefinitions());
+ monitor.subTask("Loading Actionable Items and Teams for " + pluginId);
+ LoadAIsAndTeamsAction.executeForAtsRuntimeConfig(false, pluginId);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CreateNewVersionItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CreateNewVersionItem.java
new file mode 100644
index 00000000000..51093212bc0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/CreateNewVersionItem.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.navigate;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CreateNewVersionItem extends XNavigateItemAction {
+
+ private final TeamDefinitionArtifact teamDefHoldingVersions;
+
+ /**
+ * @param parent
+ * @param teamDefHoldingVersions Team Definition Artifact that is related to versions or null for popup selection
+ */
+ public CreateNewVersionItem(XNavigateItem parent, TeamDefinitionArtifact teamDefHoldingVersions) {
+ super(parent, "Create New " + (teamDefHoldingVersions != null ? teamDefHoldingVersions + " " : "") + " Version",
+ FrameworkImage.VERSION);
+ this.teamDefHoldingVersions = teamDefHoldingVersions;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ TeamDefinitionArtifact teamDefHoldingVersions = null;
+ try {
+ teamDefHoldingVersions = getReleaseableTeamDefinitionArtifact();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ if (teamDefHoldingVersions == null) return;
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Create New Version", null, "Enter Version Name",
+ MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ if (ed.open() == 0) {
+ String newVer = ed.getEntry();
+ if (newVer.equals("")) {
+ AWorkbench.popup("ERROR", "Version name can't be blank");
+ return;
+ }
+ for (VersionArtifact verArt : teamDefHoldingVersions.getVersionsArtifacts()) {
+ if (verArt.getDescriptiveName().equals(newVer)) {
+ AWorkbench.popup("ERROR", "Version already exists");
+ return;
+ }
+ }
+
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ createNewVersionItemTx(transaction, teamDefHoldingVersions, newVer);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public TeamDefinitionArtifact getReleaseableTeamDefinitionArtifact() throws OseeCoreException {
+ if (teamDefHoldingVersions != null) return teamDefHoldingVersions;
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Active));
+ int result = ld.open();
+ if (result == 0) {
+ return (TeamDefinitionArtifact) ld.getResult()[0];
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.transaction.AbstractSkynetTxTemplate#handleTxWork()
+ */
+ private void createNewVersionItemTx(SkynetTransaction transaction, TeamDefinitionArtifact teamDefHoldingVersions, String newVer) throws OseeCoreException {
+ VersionArtifact ver =
+ (VersionArtifact) ArtifactTypeManager.addArtifact(VersionArtifact.ARTIFACT_NAME, AtsPlugin.getAtsBranch(),
+ newVer);
+ teamDefHoldingVersions.addRelation(AtsRelation.TeamDefinitionToVersion_Version, ver);
+ ver.persistAttributesAndRelations(transaction);
+ ArtifactEditor.editArtifact(ver);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/DisplayCurrentOseeEventListeners.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/DisplayCurrentOseeEventListeners.java
new file mode 100644
index 00000000000..c5ef77ee4ea
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/DisplayCurrentOseeEventListeners.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.ats.navigate;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DisplayCurrentOseeEventListeners extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ */
+ public DisplayCurrentOseeEventListeners(XNavigateItem parent) {
+ super(parent, "Display Current OSEE Event Listeners", FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ String str = OseeEventManager.getListenerReport();
+ try {
+ ResultsEditor.open(new XResultPage(getName(), str));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/EmailTeamsItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/EmailTeamsItem.java
new file mode 100644
index 00000000000..9c11a1b3393
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/EmailTeamsItem.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.ats.navigate;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionTreeWithChildrenDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailTeamsItem extends XNavigateItemAction {
+
+ private final TeamDefinitionArtifact teamDef;
+ private final Collection<MemberType> memberTypes;
+ public static enum MemberType {
+ Leads, Members, Both
+ };
+
+ /**
+ * @param parent
+ * @param teamDefHoldingVersions Team Definition Artifact that is related to versions or null for popup selection
+ */
+ public EmailTeamsItem(XNavigateItem parent, TeamDefinitionArtifact teamDef, MemberType... memberType) {
+ super(
+ parent,
+ "Email " + (teamDef == null ? "Team " : "\"" + teamDef + "\" Team ") + (Arrays.asList(memberType).contains(
+ MemberType.Both) ? "Leads / Members" : (Arrays.asList(memberType).contains(MemberType.Leads) ? "Leads" : "Members")),
+ FrameworkImage.EMAIL);
+ memberTypes = Arrays.asList(memberType);
+ this.teamDef = teamDef;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ Collection<TeamDefinitionArtifact> teamDefs = getTeamDefinitions();
+ if (teamDefs.size() == 0) return;
+ Set<String> emails = new HashSet<String>();
+ for (TeamDefinitionArtifact teamDef : teamDefs) {
+ if (memberTypes.contains(MemberType.Members) || memberTypes.contains(MemberType.Both)) {
+ for (User user : teamDef.getRelatedArtifacts(AtsRelation.TeamMember_Member, User.class))
+ if (!user.getEmail().equals("")) emails.add(user.getEmail());
+ }
+ if (memberTypes.contains(MemberType.Leads) || memberTypes.contains(MemberType.Both)) {
+ for (User user : teamDef.getRelatedArtifacts(AtsRelation.TeamLead_Lead, User.class))
+ if (!user.getEmail().equals("")) emails.add(user.getEmail());
+ }
+ }
+ if (emails.size() == 0) {
+ AWorkbench.popup("Error", "No emails configured.");
+ return;
+ }
+ Program.launch("mailto:" + org.eclipse.osee.framework.jdk.core.util.Collections.toString(";", emails));
+ AWorkbench.popup("Complete", "Configured emails openened in local email client.");
+ }
+
+ public Collection<TeamDefinitionArtifact> getTeamDefinitions() throws OseeCoreException {
+ if (teamDef != null) {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ teamDefs.add(teamDef);
+ teamDefs.addAll(Artifacts.getChildrenOfTypeSet(teamDef, TeamDefinitionArtifact.class, true));
+ return teamDefs;
+ }
+ TeamDefinitionTreeWithChildrenDialog ld = new TeamDefinitionTreeWithChildrenDialog(Active.Active);
+ int result = ld.open();
+ if (result == 0) {
+ return ld.getResultAndRecursedTeamDefs();
+ }
+ return java.util.Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/FirstTimeQualityMetricReportItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/FirstTimeQualityMetricReportItem.java
new file mode 100644
index 00000000000..f31a8527230
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/FirstTimeQualityMetricReportItem.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.navigate;
+
+import java.util.Collection;
+import java.util.Date;
+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.MessageDialog;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.VersionMetrics;
+import org.eclipse.osee.ats.util.VersionTeamMetrics;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class FirstTimeQualityMetricReportItem extends XNavigateItemAction {
+
+ private final TeamDefinitionArtifact teamDef;
+ private final String teamDefName;
+
+ public FirstTimeQualityMetricReportItem(XNavigateItem parent, String name, String teamDefName) {
+ super(parent, name, AtsImage.REPORT);
+ this.teamDefName = teamDefName;
+ this.teamDef = null;
+ }
+
+ public FirstTimeQualityMetricReportItem(XNavigateItem parent) {
+ this(parent, "First Time Quality Metric Report", null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem#getDescription()
+ */
+ @Override
+ public String getDescription() {
+ return "This report will genereate a metric comprised of:\n\n# of priority 1 and 2 OSEE problem actions orginated between release\n__________________________________\n# of non-support actions in that released";
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ TeamDefinitionArtifact useTeamDef = teamDef;
+ if (useTeamDef == null && teamDefName != null) {
+ useTeamDef = AtsCache.getSoleArtifactByName(teamDefName, TeamDefinitionArtifact.class);
+ }
+ if (useTeamDef == null) {
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ ld.setTitle(getName());
+ try {
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Both));
+ } catch (MultipleAttributesExist ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ int result = ld.open();
+ if (result == 0) {
+ if (ld.getResult().length == 0) {
+ AWorkbench.popup("ERROR", "You must select a team to operate against.");
+ return;
+ }
+ useTeamDef = (TeamDefinitionArtifact) ld.getResult()[0];
+ } else
+ return;
+ } else if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+
+ ReportJob job = new ReportJob(getName(), useTeamDef);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+
+ private class ReportJob extends Job {
+
+ private final TeamDefinitionArtifact teamDef;
+
+ public ReportJob(String title, TeamDefinitionArtifact teamDef) {
+ super(title);
+ this.teamDef = teamDef;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.ReleaseReportJob#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ XResultData resultData = new XResultData();
+ String html = getTeamWorkflowReport(getName(), teamDef, monitor);
+ resultData.addRaw(html);
+ resultData.report(getName(), Manipulations.RAW_HTML);
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.toString(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+ private static String[] HEADER_STRINGS =
+ new String[] {"Version", "StartDate", "RelDate", "Num 1 + 2 Orig During Next Release Cycle",
+ "Num Non-Support Released", "Ratio Orig 1 and 2 Bugs/Number Released"};
+
+ /**
+ * Ratio of # of priority 1 and 2 OSEE problem actions (non-cancelled) that were orginated between a release and the
+ * next release / # of non-support actions released in that release
+ *
+ * @param teamDef
+ * @param monitor
+ * @return report
+ */
+ public static String getTeamWorkflowReport(String title, TeamDefinitionArtifact teamDef, IProgressMonitor monitor) throws OseeCoreException {
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.heading(3, title));
+ sb.append(AHTML.beginMultiColumnTable(100, 1));
+ sb.append(AHTML.addRowSpanMultiColumnTable(
+ "This report shows the ratio of 1+2 problem workflows created during next release cycle due to current release over the total non-support workflows during this release.",
+ HEADER_STRINGS.length));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(HEADER_STRINGS));
+ VersionTeamMetrics teamMet = new VersionTeamMetrics(teamDef);
+ Collection<VersionMetrics> verMets = teamMet.getReleasedOrderedVersions();
+ monitor.beginTask("Processing Versions", verMets.size());
+ for (VersionMetrics verMet : verMets) {
+ Date thisReleaseStartDate = verMet.getReleaseStartDate();
+ Date thisReleaseEndDate = verMet.getVerArt().getReleaseDate();
+ Date nextReleaseStartDate = null;
+ Date nextReleaseEndDate = null;
+ VersionMetrics nextVerMet = verMet.getNextVerMetViaReleaseDate();
+ if (nextVerMet != null) {
+ nextReleaseStartDate = nextVerMet.getReleaseStartDate();
+ nextReleaseEndDate = nextVerMet.getVerArt().getReleaseDate();
+ }
+ Integer numOrigDurningNextReleaseCycle = null;
+ if (nextReleaseStartDate != null && nextReleaseEndDate != null) {
+ if (numOrigDurningNextReleaseCycle == null) {
+ numOrigDurningNextReleaseCycle = 0;
+ }
+ Collection<TeamWorkFlowArtifact> arts =
+ teamMet.getWorkflowsOriginatedBetween(nextReleaseStartDate, nextReleaseEndDate);
+ for (TeamWorkFlowArtifact team : arts) {
+ if (!team.getSmaMgr().isCancelled() && team.getChangeType() == ChangeType.Problem && (team.getPriority() == PriorityType.Priority_1 || team.getPriority() == PriorityType.Priority_2)) {
+ numOrigDurningNextReleaseCycle++;
+ }
+ }
+ }
+ Integer numNonSupportReleased = null;
+ if (thisReleaseEndDate != null) {
+ numNonSupportReleased = 0;
+ for (TeamWorkFlowArtifact team : verMet.getTeamWorkFlows(ChangeType.Problem, ChangeType.Improvement)) {
+ if (!team.getSmaMgr().isCancelled()) {
+ numNonSupportReleased++;
+ }
+ }
+ }
+ sb.append(AHTML.addRowMultiColumnTable(new String[] {
+ verMet.getVerArt().getDescriptiveName(),
+ XDate.getDateStr(thisReleaseStartDate, XDate.MMDDYY),
+ XDate.getDateStr(thisReleaseEndDate, XDate.MMDDYY),
+ numOrigDurningNextReleaseCycle == null ? "N/A" : String.valueOf(numOrigDurningNextReleaseCycle),
+ numNonSupportReleased == null ? "N/A" : String.valueOf(numNonSupportReleased),
+ numOrigDurningNextReleaseCycle == null || numNonSupportReleased == 0 || numNonSupportReleased == null ? "N/A" : AtsLib.doubleToStrString(new Double(
+ numOrigDurningNextReleaseCycle) / numNonSupportReleased)}));
+ monitor.worked(1);
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateFullVersionReportItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateFullVersionReportItem.java
new file mode 100644
index 00000000000..1341f534db5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateFullVersionReportItem.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.ats.navigate;
+
+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.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.VersionReportJob;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GenerateFullVersionReportItem extends XNavigateItemAction {
+
+ private final TeamDefinitionArtifact teamDef;
+ private final String teamDefName;
+
+ public GenerateFullVersionReportItem(XNavigateItem parent) {
+ super(parent, "Generate Full Version Report", FrameworkImage.VERSION);
+ this.teamDefName = null;
+ this.teamDef = null;
+ }
+
+ public GenerateFullVersionReportItem(XNavigateItem parent, TeamDefinitionArtifact teamDef) {
+ super(parent, "Generate Full Version Report", FrameworkImage.VERSION);
+ this.teamDefName = null;
+ this.teamDef = teamDef;
+ }
+
+ public GenerateFullVersionReportItem(XNavigateItem parent, String teamDefName) {
+ super(parent, "Generate Full Version Report", FrameworkImage.VERSION);
+ this.teamDefName = teamDefName;
+ this.teamDef = null;
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ TeamDefinitionArtifact teamDef = getTeamDefinition();
+ if (teamDef == null) return;
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+ PublishReportJob job = new PublishReportJob(teamDef);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+
+ public TeamDefinitionArtifact getTeamDefinition() throws OseeCoreException {
+ if (teamDef != null) return teamDef;
+ if (teamDefName != null && !teamDefName.equals("")) {
+ try {
+ TeamDefinitionArtifact teamDef = AtsCache.getSoleArtifactByName(teamDefName, TeamDefinitionArtifact.class);
+ if (teamDef != null) return teamDef;
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing, going to get team below
+ }
+ }
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ try {
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Active));
+ } catch (MultipleAttributesExist ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ int result = ld.open();
+ if (result == 0) {
+ return (TeamDefinitionArtifact) ld.getResult()[0];
+ }
+ return null;
+ }
+
+ private class PublishReportJob extends Job {
+
+ private final TeamDefinitionArtifact teamDef;
+
+ public PublishReportJob(TeamDefinitionArtifact teamDef) {
+ super(teamDef.getDescriptiveName() + " as of " + XDate.getDateNow());
+ this.teamDef = teamDef;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ String html = VersionReportJob.getFullReleaseReport(teamDef, monitor);
+ XResultData rd = new XResultData();
+ rd.addRaw(html);
+ rd.report(getName(), Manipulations.RAW_HTML);
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.toString(), ex);
+ }
+
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateReviewParticipationReport.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateReviewParticipationReport.java
new file mode 100644
index 00000000000..6d8c461c10b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateReviewParticipationReport.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.navigate;
+
+import java.util.Collection;
+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.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.xviewer.column.XViewerReviewRoleColumn;
+import org.eclipse.osee.ats.util.xviewer.column.XViewerSmaCompletedDateColumn;
+import org.eclipse.osee.ats.util.xviewer.column.XViewerSmaStateColumn;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.ats.world.search.MyReviewWorkflowItem;
+import org.eclipse.osee.ats.world.search.MyReviewWorkflowItem.ReviewState;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditorInput;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserListDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactNameColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactTypeColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerGuidColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerHridColumn;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Donald G. Dunne
+ */
+public class GenerateReviewParticipationReport extends XNavigateItemAction {
+
+ private final String MASS_XVIEWER_CUSTOMIZE_NAMESPACE = "org.eclipse.osee.ats.ReviewParticipationReport";
+
+ public GenerateReviewParticipationReport(XNavigateItem parent) {
+ super(parent, "Generate Review Participation Report", AtsImage.REPORT);
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ UserListDialog ld = new UserListDialog(Display.getCurrent().getActiveShell());
+ int result = ld.open();
+ if (result == 0) {
+ if (ld.getResult().length == 0) {
+ AWorkbench.popup("ERROR", "Must select user");
+ return;
+ }
+ User selectedUser = ld.getSelection();
+ ParticipationReportJob job =
+ new ParticipationReportJob("Review Participation Report - " + selectedUser, selectedUser);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ }
+
+ private class ParticipationReportJob extends Job {
+
+ private final User user;
+
+ public ParticipationReportJob(String title, User user) {
+ super(title);
+ this.user = user;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ MyReviewWorkflowItem srch = new MyReviewWorkflowItem("", user, ReviewState.All);
+ Collection<Artifact> reviewArts = srch.performSearchGetResults();
+ MassArtifactEditorInput input =
+ new MassArtifactEditorInput(getName() + " as of " + XDate.getDateNow(), reviewArts,
+ new ReviewParticipationXViewerFactory(user));
+ MassArtifactEditor.editArtifacts(input);
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.toString(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+ public class ReviewParticipationXViewerFactory extends SkynetXViewerFactory {
+
+ public ReviewParticipationXViewerFactory(User user) {
+ super(MASS_XVIEWER_CUSTOMIZE_NAMESPACE);
+ registerColumn(new XViewerArtifactTypeColumn("Type"));
+ registerColumn(new XViewerHridColumn("ID"));
+ registerColumn(WorldXViewerFactory.Legacy_PCR_Col);
+ registerColumn(new XViewerSmaStateColumn());
+ registerColumn(new XViewerSmaCompletedDateColumn("Completed"));
+ registerColumn(new XViewerReviewRoleColumn(user));
+ registerColumn(WorldXViewerFactory.Related_To_State_Col);
+ registerColumn(new XViewerArtifactNameColumn("Name"));
+ registerColumn(new XViewerGuidColumn("Guid"));
+ registerAllAttributeColumns();
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateVersionReportItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateVersionReportItem.java
new file mode 100644
index 00000000000..5b278deb470
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/GenerateVersionReportItem.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.ats.navigate;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.VersionReportJob;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamVersionListDialog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GenerateVersionReportItem extends XNavigateItemAction {
+
+ public GenerateVersionReportItem(XNavigateItem parent) {
+ super(parent, "Generate Version Report", FrameworkImage.VERSION);
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ TeamVersionListDialog ld = new TeamVersionListDialog(Active.Both);
+ int result = ld.open();
+ if (result == 0) {
+ VersionArtifact verArt = ld.getSelectedVersion();
+ String title =
+ ld.getSelectedTeamDef().getDescriptiveName() + " Version \"" + verArt.getDescriptiveName() + "\" Report";
+ VersionReportJob job = new VersionReportJob(title, verArt);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/IAtsNavigateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/IAtsNavigateItem.java
new file mode 100644
index 00000000000..67d6d70bf8b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/IAtsNavigateItem.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.ats.navigate;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsNavigateItem {
+
+ public List<XNavigateItem> getNavigateItems() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ImportActionsViaSpreadsheet.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ImportActionsViaSpreadsheet.java
new file mode 100644
index 00000000000..71fa3927211
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ImportActionsViaSpreadsheet.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.ats.navigate;
+
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ats.util.Import.ActionImportWizard;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ImportActionsViaSpreadsheet extends XNavigateItemAction {
+
+ public static String strs[] = new String[] {};
+
+ /**
+ * @param parent
+ */
+ public ImportActionsViaSpreadsheet(XNavigateItem parent) {
+ super(parent, "Import Actions Via Spreadsheet", FrameworkImage.IMPORT);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ ActionImportWizard actionWizard = new ActionImportWizard();
+ WizardDialog dialog =
+ new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), actionWizard);
+ dialog.create();
+ dialog.open();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/MassEditTeamVersionItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/MassEditTeamVersionItem.java
new file mode 100644
index 00000000000..9873a071246
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/MassEditTeamVersionItem.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.ats.navigate;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MassEditTeamVersionItem extends XNavigateItemAction {
+
+ private final String teamDefName;
+ private final TeamDefinitionArtifact teamDef;
+ private TeamDefinitionArtifact selectedTeamDef;
+
+ public MassEditTeamVersionItem(XNavigateItem parent, String teamDefName, OseeImage oseeImage) {
+ this("Show Team Versions", parent, teamDefName, oseeImage);
+ }
+
+ public MassEditTeamVersionItem(String name, XNavigateItem parent, String teamDefName, OseeImage oseeImage) {
+ super(parent, name, oseeImage);
+ this.teamDefName = teamDefName;
+ this.teamDef = null;
+ }
+
+ public MassEditTeamVersionItem(XNavigateItem parent, TeamDefinitionArtifact teamDef, OseeImage oseeImage) {
+ this("Show Team Versions", parent, teamDef, oseeImage);
+ }
+
+ public MassEditTeamVersionItem(String name, XNavigateItem parent, TeamDefinitionArtifact teamDef, OseeImage oseeImage) {
+ super(parent, name, oseeImage);
+ this.teamDef = teamDef;
+ this.teamDefName = null;
+ }
+
+ private TeamDefinitionArtifact getTeamDefinition() throws OseeCoreException {
+ if (selectedTeamDef != null) return selectedTeamDef;
+ if (teamDef != null) return teamDef;
+ if (teamDefName != null && !teamDefName.equals("")) {
+ try {
+ TeamDefinitionArtifact teamDef = AtsCache.getSoleArtifactByName(teamDefName, TeamDefinitionArtifact.class);
+ if (teamDef != null) return teamDef;
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing, going to get team below
+ }
+ }
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ try {
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Active));
+ } catch (MultipleAttributesExist ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ int result = ld.open();
+ if (result == 0) {
+ return (TeamDefinitionArtifact) ld.getResult()[0];
+ }
+ return null;
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ try {
+ TeamDefinitionArtifact teamDef = getTeamDefinition();
+ if (teamDef == null) return;
+ if (teamDef.getTeamDefinitionHoldingVersions() == null) {
+ AWorkbench.popup("ERROR", "Team is not configured to use versions.");
+ return;
+ }
+ MassArtifactEditor.editArtifacts(getName(), teamDef.getTeamDefinitionHoldingVersions().getVersionsArtifacts());
+ selectedTeamDef = null;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * @param selectedTeamDef the selectedTeamDef to set
+ */
+ public void setSelectedTeamDef(TeamDefinitionArtifact selectedTeamDef) {
+ this.selectedTeamDef = selectedTeamDef;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NavigateView.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NavigateView.java
new file mode 100644
index 00000000000..b3b5e976300
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NavigateView.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.ats.navigate;
+
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.NewAction;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.world.search.MultipleHridSearchItem;
+import org.eclipse.osee.ats.world.search.MyFavoritesSearchItem;
+import org.eclipse.osee.ats.world.search.MyWorldSearchItem;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.plugin.util.AudioFile;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+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.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Insert the type's description here.
+ *
+ * @see ViewPart
+ * @author Donald G. Dunne
+ */
+public class NavigateView extends ViewPart implements IActionable {
+
+ public static final String VIEW_ID = "org.eclipse.osee.ats.navigate.NavigateView";
+ public static final String HELP_CONTEXT_ID = "atsNavigator";
+ private AtsNavigateComposite xNavComp;
+ public Text searchArea;
+ public XCheckBox completeCancelledCheck;
+ private boolean includeCompleteCancelled = false;
+
+ /**
+ * The constructor.
+ */
+ public NavigateView() {
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ try {
+ OseeNotificationManager.sendNotifications();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ super.dispose();
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(parent)) return;
+
+ OseeContributionItem.addTo(this, false);
+
+ xNavComp = new AtsNavigateComposite(new AtsNavigateViewItems(), parent, SWT.NONE);
+
+ AtsPlugin.getInstance().setHelp(xNavComp, HELP_CONTEXT_ID);
+ createActions();
+
+ // add search text box
+ createSearchInputPart(xNavComp);
+
+ if (savedFilterStr != null) {
+ xNavComp.getFilteredTree().getFilterControl().setText(savedFilterStr);
+ }
+ xNavComp.refresh();
+ xNavComp.getFilteredTree().getFilterControl().setFocus();
+
+ Label label = new Label(xNavComp, SWT.None);
+ String str = getWhoAmI();
+ if (AtsPlugin.isAtsAdmin()) str += " - Admin";
+ if (!str.equals("")) {
+ if (AtsPlugin.isAtsAdmin()) {
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ } else {
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ }
+ }
+ label.setText(str);
+ label.setToolTipText(str);
+ GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_CENTER);
+ gridData.heightHint = 15;
+ label.setLayoutData(gridData);
+
+ AtsBulkLoadCache.run(false);
+ }
+
+ public void createSearchInputPart(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(ALayout.getZeroMarginLayout(4, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Label searchLabel = new Label(comp, SWT.NONE);
+ searchLabel.setText("Search:");
+ searchLabel.addMouseListener(new MouseListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+ */
+ @Override
+ public void mouseUp(MouseEvent mouseEvent) {
+ }
+
+ @Override
+ public void mouseDoubleClick(MouseEvent mouseEvent) {
+ if (mouseEvent.button == 3) {
+ AudioFile.processAudioFile(AtsPlugin.getInstance(), "support/OSEEDay.wav");
+ }
+ }
+
+ @Override
+ public void mouseDown(MouseEvent arg0) {
+ }
+ });
+ GridData gridData = new GridData(SWT.RIGHT, SWT.NONE, false, false);
+ gridData.heightHint = 15;
+ this.searchArea = new Text(comp, SWT.SINGLE | SWT.BORDER);
+ GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false);
+ this.searchArea.setFont(parent.getFont());
+ this.searchArea.setLayoutData(gd);
+ this.searchArea.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent event) {
+ if (event.character == '\r') {
+ try {
+ xNavComp.handleDoubleClick(new SearchNavigateItem(null, new AtsNavigateQuickSearch(
+ "ATS Quick Search", searchArea.getText(), isIncludeCompleteCancelled())));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ this.searchArea.setToolTipText("ATS Quick Search - Type in a search string.");
+ this.completeCancelledCheck = new XCheckBox("IC");
+ this.completeCancelledCheck.createWidgets(comp, 2);
+ this.completeCancelledCheck.setToolTip("Include completed/cancelled ATS Artifacts");
+ completeCancelledCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ includeCompleteCancelled = completeCancelledCheck.isSelected();
+ };
+ });
+ }
+
+ public boolean isIncludeCompleteCancelled() {
+ return includeCompleteCancelled;
+ }
+
+ private String getWhoAmI() {
+ try {
+ String userName = UserManager.getUser().getName();
+ return String.format("%s - %s:%s", userName, ClientSessionManager.getDataStoreName(),
+ ClientSessionManager.getDataStoreLoginName());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Exception: " + ex.getLocalizedMessage();
+ }
+ }
+
+ protected void createActions() {
+ Action myWorldAction = new Action("My World") {
+
+ @Override
+ public void run() {
+ try {
+ xNavComp.handleDoubleClick(new SearchNavigateItem(null, new MyWorldSearchItem("My World",
+ UserManager.getUser())), TableLoadOption.None);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ myWorldAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.MY_WORLD));
+ myWorldAction.setToolTipText("My World");
+
+ Action myFavoritesAction = new Action("My Favorites") {
+
+ @Override
+ public void run() {
+ try {
+ xNavComp.handleDoubleClick(new SearchNavigateItem(null, new MyFavoritesSearchItem("My Favorites",
+ UserManager.getUser())), TableLoadOption.None);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ myFavoritesAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.FAVORITE));
+ myFavoritesAction.setToolTipText("My Favorites");
+
+ Action collapseAction = new Action("Collapse All") {
+
+ @Override
+ public void run() {
+ xNavComp.refresh();
+ }
+ };
+ collapseAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.COLLAPSE_ALL));
+ collapseAction.setToolTipText("Collapse All");
+
+ Action expandAction = new Action("Expand All") {
+
+ @Override
+ public void run() {
+ xNavComp.getFilteredTree().getViewer().expandAll();
+ }
+ };
+ expandAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.EXPAND_ALL));
+ expandAction.setToolTipText("Expand All");
+
+ Action openByIdAction = new Action("Open by Id") {
+
+ @Override
+ public void run() {
+ try {
+ xNavComp.handleDoubleClick(new SearchNavigateItem(null, new MultipleHridSearchItem()),
+ TableLoadOption.None);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ openByIdAction.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.OPEN_BY_ID));
+ openByIdAction.setToolTipText("Open by Id");
+
+ Action openChangeReportById = new Action("Open Change Report by Id") {
+
+ @Override
+ public void run() {
+ try {
+ xNavComp.handleDoubleClick(new OpenChangeReportByIdItem(null), TableLoadOption.None);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ openChangeReportById.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BRANCH_CHANGE));
+ openChangeReportById.setToolTipText("Open Change Report by Id");
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(myWorldAction);
+ toolbarManager.add(myFavoritesAction);
+ toolbarManager.add(collapseAction);
+ toolbarManager.add(expandAction);
+ toolbarManager.add(openChangeReportById);
+ toolbarManager.add(openByIdAction);
+ toolbarManager.add(new NewAction());
+
+ OseeAts.addBugToViewToolbar(this, this, AtsPlugin.getInstance(), VIEW_ID, "ATS Navigator");
+
+ }
+
+ /**
+ * Provided for tests to be able to simulate a double-click
+ *
+ * @param item
+ */
+ public void handleDoubleClick(XNavigateItem item, TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ OseeLog.log(AtsPlugin.class, Level.INFO,
+ "===> Simulating NavigateView Double-Click for \"" + item.getName() + "\"...");
+ xNavComp.handleDoubleClick(item, tableLoadOptions);
+ }
+
+ public static NavigateView getNavigateView() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ return (NavigateView) page.showView(NavigateView.VIEW_ID);
+ } catch (PartInitException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Launch Error",
+ "Couldn't Launch OSEE ATS NavigateView " + e1.getMessage());
+ }
+ return null;
+ }
+
+ public String getActionDescription() {
+ IStructuredSelection sel = (IStructuredSelection) xNavComp.getFilteredTree().getViewer().getSelection();
+ if (sel.iterator().hasNext()) return String.format("Currently Selected - %s",
+ ((XNavigateItem) sel.iterator().next()).getName());
+ return "";
+ }
+
+ private static final String INPUT = "filter";
+ private static final String FILTER_STR = "filterStr";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
+ */
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ memento = memento.createChild(INPUT);
+
+ if (xNavComp != null && xNavComp.getFilteredTree().getFilterControl() != null && !xNavComp.getFilteredTree().isDisposed()) {
+ String filterStr = xNavComp.getFilteredTree().getFilterControl().getText();
+ memento.putString(FILTER_STR, filterStr);
+ }
+ }
+ private String savedFilterStr = null;
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ try {
+ if (memento != null) {
+ memento = memento.getChild(INPUT);
+ if (memento != null) {
+ savedFilterStr = memento.getString(FILTER_STR);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "NavigateView error on init", ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NewPeerToPeerReviewItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NewPeerToPeerReviewItem.java
new file mode 100644
index 00000000000..a873aad96ad
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/NewPeerToPeerReviewItem.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.ats.navigate;
+
+import java.util.Date;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.widgets.ReviewManager;
+import org.eclipse.osee.ats.util.widgets.dialog.ActionableItemListDialog;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewPeerToPeerReviewItem extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ */
+ public NewPeerToPeerReviewItem(XNavigateItem parent) {
+ super(parent, "New Stand-alone Peer To Peer Review", AtsImage.REVIEW);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ final ActionableItemListDialog ld = new ActionableItemListDialog(Active.Both);
+ ld.setMessage("Select Actionable Items to Review\n\nNOTE: To create a review against " + "an Action and Team Workflow\nopen the object in ATS and select the " + "review to create from the editor.");
+ int result = ld.open();
+ if (result == 0) {
+ final EntryDialog ed = new EntryDialog("Peer Review Title", "Enter Peer Review Title");
+ if (ed.open() == 0) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ PeerToPeerReviewArtifact peerArt =
+ ReviewManager.createNewPeerToPeerReview(null, ed.getEntry(), null, UserManager.getUser(),
+ new Date(), transaction);
+ peerArt.getActionableItemsDam().setActionableItems(ld.getSelected());
+ peerArt.persistAttributesAndRelations(transaction);
+ AtsLib.openAtsAction(peerArt, AtsOpenOption.OpenAll);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/OpenChangeReportByIdItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/OpenChangeReportByIdItem.java
new file mode 100644
index 00000000000..d17e0d93d4b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/OpenChangeReportByIdItem.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.ats.navigate;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+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.MessageDialog;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.world.search.MultipleHridSearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OpenChangeReportByIdItem extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ * @param teamDefHoldingVersions Team Definition Artifact that is related to versions or null for popup selection
+ */
+ public OpenChangeReportByIdItem(XNavigateItem parent) {
+ super(parent, "Open Change Report by ID", AtsImage.OPEN_BY_ID);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ try {
+ final MultipleHridSearchItem srch = new MultipleHridSearchItem(getName());
+ srch.performUI(SearchType.Search);
+ if (srch.isCancelled()) return;
+ String name = "Open Change Report by ID: \"" + srch.getEnteredIds() + "\"";
+ Job openJob = new Job(name) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ Collection<Artifact> artifacts = srch.performSearchGetResults(false);
+ final Set<Artifact> addedArts = new HashSet<Artifact>();
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof ActionArtifact) {
+ for (TeamWorkFlowArtifact team : ((ActionArtifact) artifact).getTeamWorkFlowArtifacts()) {
+ if (team.getSmaMgr().getBranchMgr().isCommittedBranchExists() || team.getSmaMgr().getBranchMgr().isWorkingBranchInWork()) {
+ addedArts.add(team);
+ }
+ }
+ }
+ }
+ if (addedArts.size() > 0) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (addedArts.size() < 3 || MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
+ "Open Change Reports",
+ "Opening " + addedArts.size() + " Change Reports?\n\n(may want to run this off-hours)")) {
+ for (Artifact art : addedArts) {
+ ((StateMachineArtifact) art).getSmaMgr().getBranchMgr().showChangeReport();
+ }
+ }
+ }
+ });
+ } else {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Open Change Reports",
+ "No change report exists for " + srch.getEnteredIds());
+ }
+ });
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(openJob);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/PublishFullVersionReportItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/PublishFullVersionReportItem.java
new file mode 100644
index 00000000000..5ff0d9b1e7a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/PublishFullVersionReportItem.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.navigate;
+
+import java.io.File;
+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.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.VersionReportJob;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class PublishFullVersionReportItem extends XNavigateItemAction {
+
+ private final TeamDefinitionArtifact teamDef;
+ private String publishToFilename;
+ private final String teamDefName;
+
+ public PublishFullVersionReportItem(XNavigateItem parent, String name, TeamDefinitionArtifact teamDef, String publishToFilename) {
+ super(parent, name);
+ this.teamDef = teamDef;
+ this.teamDefName = null;
+ this.publishToFilename = publishToFilename;
+ }
+
+ public PublishFullVersionReportItem(XNavigateItem parent, String name, String teamDefName, String publishToFilename) {
+ super(parent, name);
+ this.teamDefName = teamDefName;
+ this.teamDef = null;
+ this.publishToFilename = publishToFilename;
+ }
+
+ public PublishFullVersionReportItem(XNavigateItem parent) {
+ this(parent, "Publish Full Version Report", (String) null, null);
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ String usePublishToFilename = publishToFilename;
+ if (usePublishToFilename == null) {
+ final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.SAVE);
+ dialog.setFilterExtensions(new String[] {"*.html"});
+ usePublishToFilename = dialog.open();
+ if (usePublishToFilename == null) return;
+ }
+ TeamDefinitionArtifact useTeamDef = teamDef;
+ if (useTeamDef == null && teamDefName != null) {
+ try {
+ useTeamDef = AtsCache.getSoleArtifactByName(teamDefName, TeamDefinitionArtifact.class);
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing, going to get team below
+ }
+ }
+ if (useTeamDef == null) {
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ ld.setInput(TeamDefinitionArtifact.getTeamDefinitions(Active.Both));
+ int result = ld.open();
+ if (result == 0) {
+ useTeamDef = (TeamDefinitionArtifact) ld.getResult()[0];
+ } else
+ return;
+ } else if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+
+ String title = useTeamDef.getDescriptiveName() + " Version Report";
+ PublishReportJob job = new PublishReportJob(title, teamDef, usePublishToFilename);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+
+ private class PublishReportJob extends Job {
+
+ private final TeamDefinitionArtifact teamDef;
+ private final String filename;
+
+ public PublishReportJob(String title, TeamDefinitionArtifact teamDef, String filename) {
+ super(title);
+ this.teamDef = teamDef;
+ this.filename = filename;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.ReleaseReportJob#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ String html = VersionReportJob.getFullReleaseReport(teamDef, monitor);
+ Lib.writeStringToFile(html, new File(filename));
+ Program.launch(filename);
+ AWorkbench.popup("Publish Complete", "Data Published To \"" + filename + "\"");
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.toString(), ex);
+ }
+
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ReleaseVersionItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ReleaseVersionItem.java
new file mode 100644
index 00000000000..e7c72d0fd93
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/ReleaseVersionItem.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.ats.navigate;
+
+import java.util.Date;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.ats.util.widgets.dialog.VersionListDialog;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ReleaseVersionItem extends XNavigateItemAction {
+
+ public static String strs[] = new String[] {};
+ private final TeamDefinitionArtifact teamDefHoldingVersions;
+
+ /**
+ * @param parent
+ * @param teamDefHoldingVersions Team Definition Artifact that is related to versions or null for popup selection
+ */
+ public ReleaseVersionItem(XNavigateItem parent, TeamDefinitionArtifact teamDefHoldingVersions) {
+ super(parent, "Release " + (teamDefHoldingVersions != null ? teamDefHoldingVersions + " " : "") + "Version",
+ FrameworkImage.VERSION);
+ this.teamDefHoldingVersions = teamDefHoldingVersions;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ TeamDefinitionArtifact teamDefHoldingVersions = getReleaseableTeamDefinitionArtifact();
+ if (teamDefHoldingVersions == null) return;
+ try {
+ VersionListDialog ld =
+ new VersionListDialog("Select Version", "Select Version to Release",
+ teamDefHoldingVersions.getVersionsArtifacts());
+ int result = ld.open();
+ if (result == 0) {
+ VersionArtifact verArt = (VersionArtifact) ld.getResult()[0];
+
+ // Validate team lead status
+ if (!AtsPlugin.isAtsAdmin() && !verArt.getParentTeamDefinition().getLeads().contains(UserManager.getUser())) {
+ AWorkbench.popup("ERROR", "Only lead can release version.");
+ return;
+ }
+ // Validate that all Team Workflows are Completed or Cancelled
+ String errorStr = null;
+ for (TeamWorkFlowArtifact team : verArt.getTargetedForTeamArtifacts()) {
+ SMAManager smaMgr = new SMAManager(team);
+ if (!smaMgr.isCancelled() && !smaMgr.isCompleted()) {
+ errorStr =
+ "All Team Workflows must be either Completed or " + "Cancelled before releasing a version.\n\n" + team.getHumanReadableId() + " - is in the\"" + team.getSmaMgr().getStateMgr().getCurrentStateName() + "\" state.";
+ }
+ }
+ if (errorStr != null) AWorkbench.popup("ERROR", errorStr);
+ if (errorStr != null && !AtsPlugin.isAtsAdmin())
+ return;
+ else if (errorStr != null && !MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Override",
+ "ATS Admin Enabled - Override completed condition and release anyway?")) {
+ return;
+ }
+
+ verArt.setSoleAttributeValue(ATSAttributes.RELEASED_ATTRIBUTE.getStoreName(), true);
+ verArt.setSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), new Date());
+ verArt.setNextVersion(false);
+ verArt.persistAttributes();
+
+ if (MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Select NEW Next Release Version",
+ "Release Complete.\n\nSelect NEW Next Release Version?")) {
+ ld =
+ new VersionListDialog("Select Next Release Version", "Select New Next Release Version",
+ teamDefHoldingVersions.getVersionsArtifacts());
+ result = ld.open();
+ if (result == 0) {
+ verArt = (VersionArtifact) ld.getResult()[0];
+ verArt.setNextVersion(true);
+ verArt.persistAttributes();
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error releasing version");
+ }
+ }
+
+ public TeamDefinitionArtifact getReleaseableTeamDefinitionArtifact() throws OseeCoreException {
+ if (teamDefHoldingVersions != null) return teamDefHoldingVersions;
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ try {
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Active));
+ } catch (MultipleAttributesExist ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ int result = ld.open();
+ if (result == 0) {
+ return (TeamDefinitionArtifact) ld.getResult()[0];
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.java
new file mode 100644
index 00000000000..ab513c0ef7d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SearchNavigateItem.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.ats.navigate;
+
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SearchNavigateItem extends XNavigateItem {
+
+ private final WorldSearchItem wsi;
+
+ /**
+ * @param parent
+ * @param wsi
+ * @throws OseeCoreException
+ */
+ public SearchNavigateItem(XNavigateItem parent, WorldSearchItem wsi) throws OseeCoreException {
+ super(parent, wsi.getName(), AtsImage.GLOBE);
+ this.wsi = wsi;
+ }
+
+ public WorldSearchItem getWorldSearchItem() {
+ return wsi;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem#getImage()
+ */
+ @Override
+ public Image getImage() {
+ Image image = wsi.getImage();
+ if (image != null) return image;
+ return ImageManager.getImage(AtsImage.GLOBE);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByActionableItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByActionableItem.java
new file mode 100644
index 00000000000..ea70f0fd9ac
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByActionableItem.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.ats.navigate;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SubscribeByActionableItem extends XNavigateItemAction {
+
+ public SubscribeByActionableItem(XNavigateItem parent) {
+ super(parent, "Subscribe by Actionable Item", FrameworkImage.EMAIL);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ AWorkbench.popup("Not implemented yet");
+ // final AICheckTreeDialog diag =
+ // new AICheckTreeDialog(getName(),
+ // "Select Actionable Items\n\nEmail will be sent for every action written against these AIs.",
+ // Active.Active);
+ // try {
+ // List<Object> objs =
+ // Collections.castAll(UserManager.getUser().getRelatedArtifactsOfType(AtsRelation.SubscribedUser_Artifact,
+ // ActionableItemArtifact.class));
+ // diag.setInitialSelections(objs);
+ // if (diag.open() != 0) return;
+ // UserManager.getUser().setRelationsOfType(AtsRelation.SubscribedUser_Artifact, diag.getChecked(),
+ // ActionableItemArtifact.class);
+ // UserManager.getUser().persistAttributesAndRelations();
+ // AWorkbench.popup(getName(), "Subscriptions updated.");
+ // } catch (Exception ex) {
+ // OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ // }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByTeamDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByTeamDefinition.java
new file mode 100644
index 00000000000..55b6a38c2df
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/SubscribeByTeamDefinition.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.ats.navigate;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SubscribeByTeamDefinition extends XNavigateItemAction {
+
+ public SubscribeByTeamDefinition(XNavigateItem parent) {
+ super(parent, "Subscribe by Team Definition", FrameworkImage.EMAIL);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ AWorkbench.popup("Not implemented yet");
+ // final TeamDefinitionCheckTreeDialog diag =
+ // new TeamDefinitionCheckTreeDialog(getName(),
+ // "Select Team Definition\n\nEmail will be sent for every action written against these Teams.",
+ // Active.Active);
+ // try {
+ // List<Object> objs =
+ // Collections.castAll(UserManager.getUser().getRelatedArtifactsOfType(AtsRelation.SubscribedUser_Artifact,
+ // TeamDefinitionArtifact.class));
+ // diag.setInitialSelections(objs);
+ // if (diag.open() != 0) return;
+ // UserManager.getUser().setRelationsOfType(AtsRelation.SubscribedUser_Artifact, diag.getChecked(),
+ // TeamDefinitionArtifact.class);
+ // UserManager.getUser().persistAttributesAndRelations();
+ // AWorkbench.popup(getName(), "Subscriptions updated.");
+ // } catch (Exception ex) {
+ // OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ // }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/TeamWorkflowSearchWorkflowSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/TeamWorkflowSearchWorkflowSearchItem.java
new file mode 100644
index 00000000000..c10d1b0d3a7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/TeamWorkflowSearchWorkflowSearchItem.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.ats.navigate;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.util.widgets.XHyperlabelTeamDefinitionSelection;
+import org.eclipse.osee.ats.world.WorldEditorParameterSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem.ReleasedOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XMembersCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamWorkflowSearchWorkflowSearchItem extends WorldEditorParameterSearchItem {
+
+ private XHyperlabelTeamDefinitionSelection teamCombo = null;
+ private XCombo releasedCombo = null;
+ private XCombo versionCombo = null;
+ private XMembersCombo assigneeCombo;
+ private XCheckBox includeCompletedCancelledCheckbox;
+
+ public TeamWorkflowSearchWorkflowSearchItem() throws OseeArgumentException {
+ super("Team Workflow Search", AtsImage.TEAM_WORKFLOW);
+ }
+
+ public TeamWorkflowSearchWorkflowSearchItem(TeamWorkflowSearchWorkflowSearchItem editTeamWorkflowSearchItem) throws OseeArgumentException {
+ super(editTeamWorkflowSearchItem, AtsImage.TEAM_WORKFLOW);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#copy()
+ */
+ @Override
+ public TeamWorkflowSearchWorkflowSearchItem copy() throws OseeArgumentException {
+ return new TeamWorkflowSearchWorkflowSearchItem(this);
+ }
+
+ public TeamWorkflowSearchWorkflowSearchItem copyProvider() throws OseeArgumentException {
+ return new TeamWorkflowSearchWorkflowSearchItem(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#getParameterXWidgetXml()
+ */
+ @Override
+ public String getParameterXWidgetXml() throws OseeCoreException {
+ return "<xWidgets>" +
+ //
+ "<XWidget xwidgetType=\"XHyperlabelTeamDefinitionSelection\" displayName=\"Team Definitions(s)\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCombo()\" beginComposite=\"8\" displayName=\"Version\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCombo(Both,Released,UnReleased)\" displayName=\"Released\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XMembersCombo\" displayName=\"Assignee\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCheckBox\" displayName=\"Include Completed/Cancelled\" defaultValue=\"false\" labelAfter=\"true\" horizontalLabel=\"true\"/>" +
+ //
+ "</xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#performSearchGetResults(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public Collection<? extends Artifact> performSearchGetResults(SearchType searchType) throws OseeCoreException {
+ return new TeamWorldSearchItem("", getSelectedTeamDefinitions(), isIncludeCompletedCancelledCheckbox(), false,
+ false, getSelectedVersionArtifact(), getSelectedUser(), getSelectedReleased()).performSearchGetResults(false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getWorldEditorLabel(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ if (teamDefs.size() > 0) {
+ sb.append(" - Teams: " + org.eclipse.osee.framework.jdk.core.util.Collections.toString(",", teamDefs));
+ }
+ if (getSelectedVersionArtifact() != null) {
+ sb.append(" - Version: " + getSelectedVersionArtifact());
+ }
+ ReleasedOption releaseOption = getSelectedReleased();
+ if (releaseOption != null && releaseOption != ReleasedOption.Both) {
+ sb.append(" - ReleasedOption: " + releaseOption);
+ }
+ if (getSelectedUser() != null) {
+ sb.append(" - Assignee: " + getSelectedUser());
+ }
+ if (isIncludeCompletedCancelledCheckbox()) {
+ sb.append(" - Include Completed/Cancelled");
+ }
+ return "Team Workflows" + sb.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ if (widget.getLabel().equals("Assignee")) {
+ assigneeCombo = (XMembersCombo) widget;
+ }
+ if (widget.getLabel().equals("Include Completed/Cancelled")) {
+ includeCompletedCancelledCheckbox = (XCheckBox) widget;
+ }
+ if (widget.getLabel().equals("Version")) {
+ versionCombo = (XCombo) widget;
+ versionCombo.getComboBox().setVisibleItemCount(25);
+ widget.setToolTip("Select Team to populate Version list");
+ }
+ if (widget.getLabel().equals("Released")) {
+ releasedCombo = (XCombo) widget;
+ }
+ if (widget.getLabel().equals("Team Definitions(s)")) {
+ teamCombo = (XHyperlabelTeamDefinitionSelection) widget;
+ teamCombo.addXModifiedListener(new XModifiedListener() {
+ @Override
+ public void widgetModified(XWidget widget) {
+ if (versionCombo != null) {
+ try {
+ Collection<TeamDefinitionArtifact> teamDefArts = getSelectedTeamDefinitions();
+ if (teamDefArts.size() == 0) {
+ versionCombo.setDataStrings(new String[] {});
+ return;
+ }
+ TeamDefinitionArtifact teamDefHoldingVersions =
+ teamDefArts.iterator().next().getTeamDefinitionHoldingVersions();
+ if (teamDefHoldingVersions == null) {
+ versionCombo.setDataStrings(new String[] {});
+ return;
+ }
+ Collection<String> names =
+ Artifacts.artNames(teamDefHoldingVersions.getVersionsArtifacts(VersionReleaseType.Both));
+ if (names.size() == 0) {
+ versionCombo.setDataStrings(new String[] {});
+ return;
+ }
+ versionCombo.setDataStrings(names.toArray(new String[names.size()]));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ private User getSelectedUser() {
+ if (assigneeCombo == null) return null;
+ return assigneeCombo.getUser();
+ }
+
+ public void setSelectedUser(User user) {
+ if (assigneeCombo != null) assigneeCombo.set(user);
+ }
+
+ private boolean isIncludeCompletedCancelledCheckbox() {
+ if (includeCompletedCancelledCheckbox == null) return false;
+ return includeCompletedCancelledCheckbox.isSelected();
+ }
+
+ public void includeCompletedCancelledCheckbox(boolean selected) {
+ if (includeCompletedCancelledCheckbox != null) includeCompletedCancelledCheckbox.set(selected);
+ }
+
+ private VersionArtifact getSelectedVersionArtifact() throws OseeCoreException {
+ if (versionCombo == null) return null;
+ String versionStr = versionCombo.get();
+ if (versionStr == null || versionStr.equals("")) return null;
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ if (teamDefs.size() > 0) {
+ TeamDefinitionArtifact teamDefHoldingVersions = teamDefs.iterator().next().getTeamDefinitionHoldingVersions();
+ if (teamDefHoldingVersions == null) return null;
+ for (VersionArtifact versionArtifact : teamDefHoldingVersions.getVersionsArtifacts(VersionReleaseType.Both)) {
+ if (versionArtifact.getDescriptiveName().equals(versionStr)) {
+ return versionArtifact;
+ }
+ }
+ }
+ return null;
+ }
+
+ public void setVersion(String versionStr) {
+ if (versionCombo != null && versionCombo.getInDataStrings() != null) {
+ // should check if the version combo was populated
+ if (versionCombo.getInDataStrings().length > 0) {
+ versionCombo.set(versionStr);
+ }
+ }
+ }
+
+ public Collection<TeamDefinitionArtifact> getSelectedTeamDefinitions() throws OseeCoreException {
+ if (teamCombo == null) return java.util.Collections.emptyList();
+ return teamCombo.getSelectedTeamDefintions();
+ }
+
+ public void setSelectedTeamDefinitions(Set<TeamDefinitionArtifact> selectedUsers) {
+ if (teamCombo != null) {
+ teamCombo.setSelectedTeamDefs(selectedUsers);
+ teamCombo.notifyXModifiedListeners();
+ }
+ }
+
+ private ReleasedOption getSelectedReleased() throws OseeCoreException {
+ if (releasedCombo == null || releasedCombo.get() == null || releasedCombo.get().equals("")) {
+ return ReleasedOption.Both;
+ }
+ return ReleasedOption.valueOf(releasedCombo.get());
+ }
+
+ public void setSelectedReleased(ReleasedOption option) {
+ if (releasedCombo != null) releasedCombo.set(option.toString());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#createXWidgetLayoutData(org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData, org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData layoutData, XWidget widget, FormToolkit toolkit, Artifact art, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#widgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreating(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.WorldParameterSearchItem#isParameterSelectionValid()
+ */
+ @Override
+ public Result isParameterSelectionValid() throws OseeCoreException {
+ try {
+ boolean selected = false;
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ if (teamDefs.size() > 0) {
+ selected = true;
+ }
+ VersionArtifact verArt = getSelectedVersionArtifact();
+ if (verArt != null) {
+ selected = true;
+ }
+ User user = getSelectedUser();
+ if (user != null) {
+ selected = true;
+ }
+ boolean includeCompleted = isIncludeCompletedCancelledCheckbox();
+ if (!selected) {
+ return new Result("You must select at least Team, Version or Assignee.");
+ }
+ if (user != null && includeCompleted) {
+ return new Result("Assignee and Include Completed are not compatible selections.");
+ }
+ if (user != null && includeCompleted && verArt == null && teamDefs.size() == 0) {
+ return new Result("You must select at least Team or Version with Include Completed.");
+ }
+ return Result.TrueResult;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Result("Exception: " + ex.getLocalizedMessage());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#getDynamicWidgetLayoutListener()
+ */
+ @Override
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getTargetedVersionArtifact()
+ */
+ @Override
+ public VersionArtifact getTargetedVersionArtifact() throws OseeCoreException {
+ if (versionCombo == null) return null;
+ return getSelectedVersionArtifact();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAssigneesRelations.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAssigneesRelations.java
new file mode 100644
index 00000000000..7240977de4d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAssigneesRelations.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.ats.navigate;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UpdateAssigneesRelations extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ */
+ public UpdateAssigneesRelations(XNavigateItem parent) {
+ super(parent, "Update Assignees Relations", FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+
+ final List<String> teamWorkflowNames =
+ Arrays.asList(TeamWorkFlowArtifact.ARTIFACT_NAME, TaskArtifact.ARTIFACT_NAME,
+ DecisionReviewArtifact.ARTIFACT_NAME, PeerToPeerReviewArtifact.ARTIFACT_NAME);
+ teamWorkflowNames.addAll(TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames());
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+
+ for (String artTypeName : teamWorkflowNames) {
+ System.out.println("Processing artifact type - " + artTypeName);
+ for (Artifact art : ArtifactQuery.getArtifactsFromType(artTypeName, AtsPlugin.getAtsBranch())) {
+ if (art instanceof StateMachineArtifact) {
+ ((StateMachineArtifact) art).updateAssigneeRelations();
+ if (art.isDirty()) {
+ System.out.println("Updated assignee relations for " + art.getHumanReadableId() + " - " + art);
+ }
+ art.persistRelations(transaction);
+ }
+ }
+ }
+ transaction.execute();
+
+ AWorkbench.popup("Completed", "Complete");
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAtsWorkItemDefinitions.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAtsWorkItemDefinitions.java
new file mode 100644
index 00000000000..e3ba42a5c90
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/UpdateAtsWorkItemDefinitions.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.ats.navigate;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.config.AtsDatabaseConfig;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UpdateAtsWorkItemDefinitions extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ */
+ public UpdateAtsWorkItemDefinitions(XNavigateItem parent) {
+ super(parent, "Update Ats WorkItemDefinitions", FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(),
+ "This could break lots of things, are you SURE?")) return;
+
+ XResultData xResultData = new XResultData();
+ AtsDatabaseConfig.configWorkItemDefinitions(WriteType.Update, xResultData);
+ if (xResultData.isEmpty()) {
+ xResultData.log("Nothing updated");
+ }
+ xResultData.report(getName());
+
+ AWorkbench.popup("Completed", getName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/VisitedItems.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/VisitedItems.java
new file mode 100644
index 00000000000..3b4a311d181
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/navigate/VisitedItems.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.ats.navigate;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorSimpleProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VisitedItems extends XNavigateItemAction {
+
+ public static List<Artifact> visited = new ArrayList<Artifact>();
+
+ public static List<Artifact> getReverseVisited() {
+ List<Artifact> revArts = new ArrayList<Artifact>();
+ for (int x = visited.size(); x <= 0; x--) {
+ revArts.add(visited.get(x));
+ }
+ return revArts;
+ }
+
+ public static void addVisited(Artifact art) {
+ if (!visited.contains(art)) visited.add(art);
+ }
+
+ /**
+ * @param parent
+ */
+ public VisitedItems(XNavigateItem parent) {
+ super(parent, "My Recently Visited", AtsImage.GLOBE);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ WorldEditor.open(new WorldEditorSimpleProvider(getName(), visited, null, tableLoadOptions));
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotification.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotification.java
new file mode 100644
index 00000000000..4faa842c87e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotification.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.ats.notify;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNotification {
+
+ private static AtsNotification instance = new AtsNotification();
+ private static Set<IAtsNotification> atsNotificationItems;
+
+ private AtsNotification() {
+ instance = this;
+ }
+
+ public static AtsNotification getInstance() {
+ return instance;
+ }
+
+ @SuppressWarnings( {"unchecked"})
+ public Set<IAtsNotification> getAtsNotifications() {
+ if (atsNotificationItems != null) return atsNotificationItems;
+ atsNotificationItems = new HashSet<IAtsNotification>();
+
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsNotification");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsNotification extension point");
+ return atsNotificationItems;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsNotification")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ atsNotificationItems.add((IAtsNotification) obj);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error loading AtsNotification extension", ex);
+ }
+ }
+ }
+ }
+ }
+ return atsNotificationItems;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationCheckTreeDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationCheckTreeDialog.java
new file mode 100644
index 00000000000..d44abdf8043
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationCheckTreeDialog.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.ats.notify;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNotificationCheckTreeDialog extends CheckedTreeSelectionDialog {
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ private Button sendNotificationsButton;
+ private boolean sendNotifications;
+
+ public AtsNotificationCheckTreeDialog() {
+ super(Display.getCurrent().getActiveShell(), labelProvider, treeContentProvider);
+ setTitle("Select ATS Notifications");
+ setMessage("Select Desired ATS Notifications");
+ try {
+ setInput(AtsNotification.getInstance().getAtsNotifications());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Collection<IAtsNotification> getSelectedAtsNotifications() {
+ ArrayList<IAtsNotification> notifications = new ArrayList<IAtsNotification>();
+ for (Object obj : getResult())
+ notifications.add((IAtsNotification) obj);
+ return notifications;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTreeViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((IAtsNotification) e1).getNotificationName(),
+ ((IAtsNotification) e2).getNotificationName());
+ }
+ });
+
+ sendNotificationsButton = new Button(container, SWT.CHECK);
+ sendNotificationsButton.setText("Send Notifications (Otherwise, only report will display)");
+ sendNotificationsButton.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sendNotifications = sendNotificationsButton.getSelection();
+ }
+ });
+ return c;
+ }
+
+ public void setArtifacts(Collection<? extends Artifact> artifacts) {
+ setInput(artifacts);
+ }
+
+ static ILabelProvider labelProvider = new ILabelProvider() {
+
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ if (element instanceof IAtsNotification) return ((IAtsNotification) element).getNotificationName();
+ return "Unknown";
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ };
+ static ITreeContentProvider treeContentProvider = new ITreeContentProvider() {
+ @SuppressWarnings("unchecked")
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection) {
+ return ((Collection) inputElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ };
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ };
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ };
+ };
+
+ /**
+ * @return the sendNotifications
+ */
+ public boolean isSendNotifications() {
+ return sendNotifications;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationNavigateItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationNavigateItem.java
new file mode 100644
index 00000000000..fb01d0ac65a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/AtsNotificationNavigateItem.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.ats.notify;
+
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationEvent;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNotificationNavigateItem extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ * @param name
+ */
+ public AtsNotificationNavigateItem(XNavigateItem parent) {
+ this(parent, false);
+ }
+
+ public AtsNotificationNavigateItem(XNavigateItem parent, boolean sync) {
+ super(parent, (sync ? "Sync - " : "") + "Process ATS Notifications", FrameworkImage.ADMIN);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction#run(org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption[])
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+
+ AtsNotificationCheckTreeDialog diag = new AtsNotificationCheckTreeDialog();
+ if (diag.open() == 0) {
+ if (diag.getSelectedAtsNotifications().size() == 0) {
+ AWorkbench.popup("Error", "No Notifications Selected");
+ return;
+ }
+ XResultData rd = new XResultData();
+ if (diag.isSendNotifications()) {
+ rd.addRaw(AHTML.bold("Notifications were sent"));
+ } else {
+ rd.addRaw("Report Only - Notifications were NOT sent");
+ }
+ rd.addRaw(AHTML.beginMultiColumnTable(100, 1));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"Reason", "Description", "Id", "User(s)"}));
+ for (IAtsNotification notify : diag.getSelectedAtsNotifications()) {
+ for (OseeNotificationEvent event : notify.getNotificationEvents()) {
+ rd.addRaw(AHTML.addRowMultiColumnTable(event.getType(), event.getDescription(), event.getId(),
+ Artifacts.semmicolonArts(event.getUsers())));
+ if (diag.isSendNotifications()) {
+ OseeNotificationManager.addNotificationEvent(event);
+ }
+ }
+ }
+ rd.addRaw(AHTML.endMultiColumnTable());
+ rd.report(getName());
+ if (diag.isSendNotifications()) {
+ OseeNotificationManager.sendNotifications();
+ AWorkbench.popup("Complete", "Notifications Sent");
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/IAtsNotification.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/IAtsNotification.java
new file mode 100644
index 00000000000..5dc27d11dae
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/notify/IAtsNotification.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.ats.notify;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationEvent;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsNotification {
+
+ /**
+ * Descriptive name that admin can identify the group/notification that will get sent
+ *
+ * @return name
+ */
+ public String getNotificationName();
+
+ public Collection<OseeNotificationEvent> getNotificationEvents() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CancelMultipleWorkflows.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CancelMultipleWorkflows.java
new file mode 100644
index 00000000000..82a6bc353d8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CancelMultipleWorkflows.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.ats.operation;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CancelMultipleWorkflows implements IAtsWorldEditorMenuItem {
+
+ public CancelMultipleWorkflows() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#getMenuItemName()
+ */
+ @Override
+ public String getMenuItemName() throws OseeCoreException {
+ return "Cancel Selected Workflows";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#runMenuItem(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public void runMenuItem(WorldEditor worldEditor) throws OseeCoreException {
+ Collection<StateMachineArtifact> smas = worldEditor.getWorldComposite().getXViewer().getSelectedSMAArtifacts();
+ if (smas.size() == 0) {
+ AWorkbench.popup("ERROR", "Must select one or more workflows");
+ return;
+ }
+ for (StateMachineArtifact sma : smas) {
+ Result result =
+ sma.getSmaMgr().isTransitionValid(DefaultTeamState.Cancelled.name(), null, TransitionOption.None);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ EntryDialog ed = new EntryDialog("Cancel Workflows", "Enter Cancellation Reason");
+ if (ed.open() == 0) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (StateMachineArtifact sma : smas) {
+ Result result = sma.getSmaMgr().transitionToCancelled(ed.getEntry(), transaction, TransitionOption.Persist);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ transaction.execute();
+ AWorkbench.popup("Complete", "Workflows Cancelled");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CompleteMultipleWorkflows.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CompleteMultipleWorkflows.java
new file mode 100644
index 00000000000..9e01c572dab
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/CompleteMultipleWorkflows.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.ats.operation;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CompleteMultipleWorkflows implements IAtsWorldEditorMenuItem {
+
+ private final boolean enableEmail = false;
+
+ public CompleteMultipleWorkflows() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#getMenuItemName()
+ */
+ @Override
+ public String getMenuItemName() throws OseeCoreException {
+ return "Complete Selected Workflows";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#runMenuItem(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public void runMenuItem(WorldEditor worldEditor) throws OseeCoreException {
+ Collection<StateMachineArtifact> smas = worldEditor.getWorldComposite().getXViewer().getSelectedSMAArtifacts();
+ if (smas.size() == 0) {
+ AWorkbench.popup("ERROR", "Must select one or more workflows");
+ return;
+ }
+ for (StateMachineArtifact sma : smas) {
+ Result result =
+ sma.getSmaMgr().isTransitionValid(DefaultTeamState.Completed.name(), null, TransitionOption.None);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ EntryDialog ed = new EntryDialog("Complete Workflows", "Enter Completion Reson");
+ if (ed.open() == 0) {
+ try {
+ AtsPlugin.setEmailEnabled(enableEmail);
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (StateMachineArtifact sma : smas) {
+ Result result =
+ sma.getSmaMgr().transitionToCompleted(ed.getEntry(), transaction, TransitionOption.Persist);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ transaction.execute();
+ AWorkbench.popup("Complete", "Workflows Completed");
+ } finally {
+ AtsPlugin.setEmailEnabled(true);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ConnectWorkflowToTransaction.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ConnectWorkflowToTransaction.java
new file mode 100644
index 00000000000..4726b6f2d5a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ConnectWorkflowToTransaction.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.ats.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ConnectWorkflowToTransaction extends AbstractBlam {
+ private static final String SELECT_COMMIT_TRANSACTIONS =
+ "SELECT * FROM osee_tx_details where osee_comment like ? and commit_art_id is null";
+ private static final Pattern hridPattern = Pattern.compile("Commit Branch ([A-Z0-9]{5})[ _]");
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Connect Workflow To Transaction";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws OseeCoreException {
+ monitor.subTask("Aquiring Team Workflows");
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(200, SELECT_COMMIT_TRANSACTIONS, "Commit Branch%");
+ while (chStmt.next()) {
+ if (monitor.isCanceled()) return;
+ updateWorkflow(chStmt.getString("osee_comment"), chStmt.getInt("transaction_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void updateWorkflow(String commitComment, int transactionId) throws OseeCoreException {
+ Branch atsBranch = BranchManager.getCommonBranch();
+ Matcher hridMatcher = hridPattern.matcher(commitComment);
+
+ if (hridMatcher.find()) {
+ String hrid = hridMatcher.group(1);
+
+ int artId = ArtifactQuery.getArtifactFromId(hrid, atsBranch).getArtId();
+ ConnectionHandler.runPreparedUpdate("UPDATE osee_tx_details SET commit_art_id = ? where transaction_id = ?",
+ artId, transactionId);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS.Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/DuplicateWorkflowBlam.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/DuplicateWorkflowBlam.java
new file mode 100644
index 00000000000..f2b003381b7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/DuplicateWorkflowBlam.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.ats.operation;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.wizard.IAtsTeamWorkflow;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TaskableStateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.ActionArtifact.CreateTeamOption;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DuplicateWorkflowBlam extends AbstractBlam implements IAtsWorldEditorMenuItem {
+
+ private static String TEAM_WORKFLOW = "Team Workflow (drop here)";
+ private static String CREATE_NEW_ACTION =
+ "Create New Action - Creates new action in start state with current assignees.";
+ private Collection<? extends TaskableStateMachineArtifact> defaultTeamWorkflows;
+
+ public DuplicateWorkflowBlam() throws IOException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ List<Artifact> artifacts = variableMap.getArtifacts(TEAM_WORKFLOW);
+ boolean duplicateTasks = variableMap.getBoolean("Duplicate Tasks");
+ boolean createNewWorkflow = variableMap.getBoolean(CREATE_NEW_ACTION);
+
+ if (artifacts.size() == 0) {
+ AWorkbench.popup("ERROR", "Must drag in Team Workflow to duplicate.");
+ return;
+ }
+ if (duplicateTasks && createNewWorkflow) {
+ AWorkbench.popup("ERROR", "Can not create workflow as new and duplicate tasks.");
+ return;
+ }
+ Artifact artifact = artifacts.iterator().next();
+ if (!(artifact instanceof TeamWorkFlowArtifact)) {
+ AWorkbench.popup("ERROR", "Artifact MUST be Team Workflow");
+ return;
+ }
+ try {
+ AtsPlugin.setEmailEnabled(false);
+ Collection<TeamWorkFlowArtifact> teamArts = Collections.castAll(artifacts);
+ if (createNewWorkflow) {
+ handleCreateNewWorkflow(teamArts);
+ } else {
+ handleCreateDuplicate(teamArts, duplicateTasks);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return;
+ } finally {
+ AtsPlugin.setEmailEnabled(true);
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ };
+ });
+ }
+
+ private void handleCreateNewWorkflow(Collection<TeamWorkFlowArtifact> teamArts) throws OseeCoreException {
+ Set<TeamWorkFlowArtifact> newTeamArts = new HashSet<TeamWorkFlowArtifact>();
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (TeamWorkFlowArtifact teamArt : teamArts) {
+ Collection<User> assignees = teamArt.getSmaMgr().getStateMgr().getAssignees();
+ if (!assignees.contains(UserManager.getUser())) {
+ assignees.add(UserManager.getUser());
+ }
+ TeamWorkFlowArtifact newTeamArt =
+ teamArt.getParentActionArtifact().createTeamWorkflow(teamArt.getTeamDefinition(),
+ teamArt.getActionableItemsDam().getActionableItems(), assignees, transaction,
+ CreateTeamOption.Duplicate_If_Exists);
+ newTeamArt.persistAttributesAndRelations(transaction);
+ newTeamArts.add(newTeamArt);
+ }
+ transaction.execute();
+ for (TeamWorkFlowArtifact newTeamArt : newTeamArts) {
+ SMAEditor.editArtifact(newTeamArt);
+ }
+ }
+
+ private void handleCreateDuplicate(Collection<TeamWorkFlowArtifact> teamArts, boolean duplicateTasks) throws OseeCoreException {
+ Set<TeamWorkFlowArtifact> newTeamArts = new HashSet<TeamWorkFlowArtifact>();
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (TeamWorkFlowArtifact teamArt : teamArts) {
+ TeamWorkFlowArtifact dupArt = (TeamWorkFlowArtifact) teamArt.duplicate(AtsPlugin.getAtsBranch());
+ dupArt.addRelation(AtsRelation.ActionToWorkflow_Action, teamArt.getParentActionArtifact());
+ dupArt.getSmaMgr().getLog().addLog(LogType.Note, null,
+ "Workflow duplicated from " + teamArt.getHumanReadableId());
+ if (duplicateTasks) {
+ for (TaskArtifact taskArt : teamArt.getSmaMgr().getTaskMgr().getTaskArtifacts()) {
+ TaskArtifact dupTaskArt = (TaskArtifact) taskArt.duplicate(AtsPlugin.getAtsBranch());
+ dupTaskArt.getSmaMgr().getLog().addLog(LogType.Note, null,
+ "Task duplicated from " + taskArt.getHumanReadableId());
+ dupArt.addRelation(AtsRelation.SmaToTask_Task, dupTaskArt);
+ dupArt.persistAttributes(transaction);
+ }
+ dupArt.persistAttributesAndRelations(transaction);
+ newTeamArts.add(dupArt);
+ }
+ // Notify all extension points that workflow is being duplicated in case they need to add, remove
+ // attributes or relations
+ for (IAtsTeamWorkflow teamExtension : TeamWorkflowExtensions.getInstance().getAtsTeamWorkflowExtensions()) {
+ teamExtension.teamWorkflowDuplicating(teamArt, dupArt);
+ }
+ }
+ transaction.execute();
+ for (TeamWorkFlowArtifact newTeamArt : newTeamArts) {
+ SMAEditor.editArtifact(newTeamArt);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreated(xWidget, toolkit, art, dynamicXWidgetLayout, modListener, isEditable);
+ if (xWidget.getLabel().equals(TEAM_WORKFLOW) && defaultTeamWorkflows != null) {
+ XListDropViewer viewer = (XListDropViewer) xWidget;
+ viewer.setInput(defaultTeamWorkflows);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XListDropViewer\" displayName=\"" + TEAM_WORKFLOW + "\" />" +
+ //
+ "<XWidget xwidgetType=\"XCheckBox\" displayName=\"Duplicate Tasks\" defaultValue=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCheckBox\" displayName=\"" + CREATE_NEW_ACTION + "\" defaultValue=\"false\"/>" +
+ //
+ "</xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Duplicates a team workflow in the exact state as it currently is with tasks in their exact state. " +
+ //
+ "All history will be duplicated. \"Create New Workflow\" option will create the workflow as an initial workflow as if a new action were created except" +
+ //
+ " the new workflow will be under the same Action. " +
+ //
+ "\"Create New Workflow\" is not compatible with \"Duplicate Tasks\".";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorMenuItem#run(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public void runMenuItem(WorldEditor worldEditor) throws OseeCoreException {
+ if (worldEditor.getWorldComposite().getXViewer().getSelectedTeamWorkflowArtifacts().size() == 0) {
+ AWorkbench.popup("ERROR", "Must select one or more team workflows to duplicate");
+ return;
+ }
+ try {
+ BlamOperation blamOperation = new DuplicateWorkflowBlam();
+ ((DuplicateWorkflowBlam) blamOperation).setDefaultTeamWorkflows(worldEditor.getWorldComposite().getXViewer().getSelectedTeamWorkflowArtifacts());
+ BlamEditor.edit(blamOperation);
+ } catch (IOException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * @return the defaultTeamWorkflows
+ */
+ public Collection<? extends TaskableStateMachineArtifact> getDefaultTeamWorkflows() {
+ return defaultTeamWorkflows;
+ }
+
+ /**
+ * @param defaultTeamWorkflows the defaultTeamWorkflows to set
+ */
+ public void setDefaultTeamWorkflows(Collection<? extends TaskableStateMachineArtifact> defaultTeamWorkflows) {
+ this.defaultTeamWorkflows = defaultTeamWorkflows;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getMenuItemName() {
+ return "Duplicate Team Workflow";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Duplicate Workflow";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSimpleList.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSimpleList.java
new file mode 100644
index 00000000000..f6971abfe5b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSimpleList.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.ats.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TaskableStateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.util.widgets.TaskManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ImportTasksFromSimpleList extends AbstractBlam {
+
+ public static String ASSIGNEES = "Assignees";
+ public static String TASK_IMPORT_TITLES = "Task Import Titles";
+ public static String TEAM_WORKFLOW = "Team Workflow (drop here)";
+ private TaskableStateMachineArtifact taskableStateMachineArtifact;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Import Tasks From Simple List";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ List<Artifact> artifacts = variableMap.getArtifacts(TEAM_WORKFLOW);
+ final List<User> assignees = Collections.castAll(variableMap.getArtifacts(ASSIGNEES));
+ final List<String> titles = new ArrayList<String>();
+ for (String title : variableMap.getString(TASK_IMPORT_TITLES).split("\n")) {
+ title = title.replaceAll("\r", "");
+ if (!title.equals("")) titles.add(title);
+ }
+
+ if (artifacts.size() == 0) {
+ AWorkbench.popup("ERROR", "Must drag in Team Workflow to add tasks.");
+ return;
+ }
+ if (artifacts.size() > 1) {
+ AWorkbench.popup("ERROR", "Only drag ONE Team Workflow.");
+ return;
+ }
+ Artifact artifact = artifacts.iterator().next();
+ if (!(artifact instanceof TeamWorkFlowArtifact)) {
+ AWorkbench.popup("ERROR", "Artifact MUST be Team Workflow");
+ return;
+ }
+ if (titles == null || titles.size() == 0) {
+ AWorkbench.popup("ERROR", "Must enter title(s).");
+ return;
+ }
+ try {
+ final TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) artifact;
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ TaskManager.createTasks(teamArt, titles, assignees, transaction);
+ teamArt.persistAttributesAndRelations(transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return;
+ }
+
+ SMAEditor.editArtifact(artifact);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ };
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreated(xWidget, toolkit, art, dynamicXWidgetLayout, modListener, isEditable);
+ if (xWidget.getLabel().equals(TEAM_WORKFLOW) && taskableStateMachineArtifact != null) {
+ XListDropViewer viewer = (XListDropViewer) xWidget;
+ viewer.setInput(Arrays.asList(taskableStateMachineArtifact));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuffer buffer = new StringBuffer("<xWidgets>");
+ buffer.append("<XWidget xwidgetType=\"XListDropViewer\" displayName=\"" + TEAM_WORKFLOW + "\" />");
+ buffer.append("<XWidget xwidgetType=\"XText\" fill=\"Vertically\" displayName=\"" + TASK_IMPORT_TITLES + "\" />");
+ buffer.append("<XWidget xwidgetType=\"XMembersList\" displayName=\"" + ASSIGNEES + "\" />");
+ buffer.append("</xWidgets>");
+ return buffer.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Import tasks from spreadsheet into given Team Workflow";
+ }
+
+ /**
+ * @return the TaskableStateMachineArtifact
+ */
+ public TaskableStateMachineArtifact getTaskableStateMachineArtifact() {
+ return taskableStateMachineArtifact;
+ }
+
+ /**
+ * @param defaultTeamWorkflowArtifact the defaultTeamWorkflowArtifact to set
+ */
+ public void setTaskableStateMachineArtifact(TaskableStateMachineArtifact taskableStateMachineArtifact) {
+ this.taskableStateMachineArtifact = taskableStateMachineArtifact;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSpreadsheet.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSpreadsheet.java
new file mode 100644
index 00000000000..ad7e723cb28
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ImportTasksFromSpreadsheet.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.ats.operation;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TaskableStateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.util.Import.ExcelAtsTaskArtifactExtractor;
+import org.eclipse.osee.ats.util.Import.TaskImportJob;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ImportTasksFromSpreadsheet extends AbstractBlam {
+
+ public static String TASK_IMPORT_SPREADSHEET = "Task Import Spreadsheet";
+ public static String TEAM_WORKFLOW = "Taskable Workflow (drop here)";
+ public static String EMAIL_POCS = "Email POCs";
+ private TaskableStateMachineArtifact taskableStateMachineArtifact;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Import Tasks From Spreadsheet";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreated(xWidget, toolkit, art, dynamicXWidgetLayout, modListener, isEditable);
+ if (xWidget.getLabel().equals(TEAM_WORKFLOW) && taskableStateMachineArtifact != null) {
+ XListDropViewer viewer = (XListDropViewer) xWidget;
+ viewer.setInput(Arrays.asList(taskableStateMachineArtifact));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuffer buffer = new StringBuffer("<xWidgets>");
+ buffer.append("<XWidget xwidgetType=\"XListDropViewer\" displayName=\"" + TEAM_WORKFLOW + "\" />");
+ buffer.append("<XWidget xwidgetType=\"XFileSelectionDialog\" displayName=\"" + TASK_IMPORT_SPREADSHEET + "\" />");
+ buffer.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"" + EMAIL_POCS + "\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ buffer.append("</xWidgets>");
+ return buffer.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Import tasks from spreadsheet into given Team Workflow";
+ }
+
+ /**
+ * @return the TaskableStateMachineArtifact
+ */
+ public TaskableStateMachineArtifact getTaskableStateMachineArtifact() {
+ return taskableStateMachineArtifact;
+ }
+
+ /**
+ * @param taskableStateMachineArtifact the TaskableStateMachineArtifact to set
+ */
+ public void setTaskableStateMachineArtifact(TaskableStateMachineArtifact taskableStateMachineArtifact) {
+ this.taskableStateMachineArtifact = taskableStateMachineArtifact;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ List<Artifact> artifacts = variableMap.getArtifacts(TEAM_WORKFLOW);
+ String filename = variableMap.getString(TASK_IMPORT_SPREADSHEET);
+ boolean emailPocs = variableMap.getBoolean(EMAIL_POCS);
+
+ if (artifacts.size() == 0) {
+ AWorkbench.popup("ERROR", "Must drag in Team Workflow to add tasks.");
+ return;
+ }
+ if (artifacts.size() > 1) {
+ AWorkbench.popup("ERROR", "Only drag ONE Team Workflow.");
+ return;
+ }
+ Artifact artifact = artifacts.iterator().next();
+ if (!(artifact instanceof TeamWorkFlowArtifact)) {
+ AWorkbench.popup("ERROR", "Artifact MUST be Team Workflow");
+ return;
+ }
+ if (filename == null || filename.equals("")) {
+ AWorkbench.popup("ERROR", "Must enter valid filename.");
+ return;
+ }
+ File file = new File(filename);
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Job job =
+ Jobs.startJob(new TaskImportJob(file, new ExcelAtsTaskArtifactExtractor(
+ (TeamWorkFlowArtifact) artifact, emailPocs, transaction)));
+ job.join();
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return;
+ }
+
+ SMAEditor.editArtifact(artifact);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ };
+ });
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ReAssignATSObjectsToUser.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ReAssignATSObjectsToUser.java
new file mode 100644
index 00000000000..77de81dda1f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/ReAssignATSObjectsToUser.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.ats.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactTypeAndDescriptiveLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ArtifactCheckTreeDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ReAssignATSObjectsToUser extends AbstractBlam {
+
+ public static String FROM_ASSIGNEE = "From Assignee";
+ public static String TO_ASSIGNEE = "To Assignee";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Re-Assign ATS Objects To User";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ final User fromUser = variableMap.getUser(FROM_ASSIGNEE);
+ if (fromUser == null) {
+ AWorkbench.popup("ERROR", "Please select From Assignee");
+ return;
+ }
+
+ final User toUser = variableMap.getUser(TO_ASSIGNEE);
+ if (toUser == null) {
+ AWorkbench.popup("ERROR", "Please select To Assignee");
+ return;
+ }
+
+ // Get all things user is directly assigned to
+ Collection<Artifact> assignedToArts =
+ fromUser.getRelatedArtifacts(CoreRelationEnumeration.Users_Artifact, Artifact.class);
+ Set<Artifact> atsArts = new HashSet<Artifact>();
+ for (Artifact assignedArt : assignedToArts) {
+ if (assignedArt instanceof StateMachineArtifact) {
+ atsArts.add(assignedArt);
+ }
+ }
+ if (atsArts.size() == 0) {
+ AWorkbench.popup("ERROR", "Not workflows, tasks or reviews assigned to " + fromUser);
+ return;
+ }
+
+ // Show in list dialog and allow select for ones to change
+ ArtifactCheckTreeDialog dialog =
+ new ArtifactCheckTreeDialog(atsArts, new ArtifactTypeAndDescriptiveLabelProvider());
+ dialog.setTitle("ReAssign ATS Object to User");
+ dialog.setMessage("Select to re-assign to user \"" + toUser);
+ if (dialog.open() != 0) return;
+ final Collection<Artifact> artsToReAssign = dialog.getSelection();
+
+ // Make the changes and persist
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (Artifact artifact : artsToReAssign) {
+ if (artifact instanceof StateMachineArtifact) {
+ ((StateMachineArtifact) artifact).getSmaMgr().getStateMgr().removeAssignee(fromUser);
+ ((StateMachineArtifact) artifact).getSmaMgr().getStateMgr().addAssignee(toUser);
+ }
+ artifact.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+ OseeNotificationManager.sendNotifications();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ };
+ });
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuffer buffer = new StringBuffer("<xWidgets>");
+ buffer.append("<XWidget xwidgetType=\"XMembersCombo\" displayName=\"" + FROM_ASSIGNEE + "\" />");
+ buffer.append("<XWidget xwidgetType=\"XMembersCombo\" displayName=\"" + TO_ASSIGNEE + "\" />");
+ buffer.append("</xWidgets>");
+ return buffer.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Re-Assign ATS Workflows, Tasks and Reviews to another user. Enter to and from User and select play. You will be promted to select the ATS Objects to reassign.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS.Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/TaskMetrics.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/TaskMetrics.java
new file mode 100644
index 00000000000..49597cbdc1f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/operation/TaskMetrics.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.ats.operation;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.Map.Entry;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact.TaskStates;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.SMAState;
+import org.eclipse.osee.ats.util.widgets.XCurrentStateDam;
+import org.eclipse.osee.ats.util.widgets.XStateDam;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.CountingMap;
+import org.eclipse.osee.framework.jdk.core.type.MutableInteger;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class TaskMetrics extends AbstractBlam {
+ private final CountingMap<User> metrics;
+ private final CharBackedInputStream charBak;
+ private final ISheetWriter excelWriter;
+
+ public TaskMetrics() throws IOException {
+ metrics = new CountingMap<User>();
+ charBak = new CharBackedInputStream();
+ excelWriter = new ExcelXmlWriter(charBak.getWriter());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Task Metrics";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws OseeCoreException {
+ try {
+ monitor.beginTask("TaskMetrics", 5);
+ metrics.clear();
+
+ ArtifactType descriptor = variableMap.getArtifactType("Artifact Type");
+
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromType(descriptor.getName(), AtsPlugin.getAtsBranch());
+ Set<Artifact> tasks = RelationManager.getRelatedArtifacts(artifacts, 1, AtsRelation.SmaToTask_Task);
+ for (Artifact artifact : tasks) {
+ if (artifact instanceof TaskArtifact) {
+ tallyState((TaskArtifact) artifact);
+ }
+ }
+
+ writeSummary();
+
+ excelWriter.endWorkbook();
+ IFile iFile = OseeData.getIFile("Task_Metrics.xml");
+ AIFile.writeToFile(iFile, charBak);
+ Program.launch(iFile.getLocation().toOSString());
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ private void tallyState(TaskArtifact task) throws OseeCoreException {
+ XStateDam stateDam = new XStateDam(task);
+
+ SMAState state = stateDam.getState(TaskStates.InWork.name(), false);
+ if (state == null) {
+ XCurrentStateDam currentStateDam = new XCurrentStateDam(task);
+ state = currentStateDam.getState(TaskStates.InWork.name(), false);
+ }
+
+ for (User user : state.getAssignees()) {
+ int percentComplete = state.getPercentComplete();
+
+ if (percentComplete == 100) {
+ String resolution = task.getSoleAttributeValue(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), "");
+
+ if (resolution.equals("Complete")) {
+ metrics.put(user, 100);
+ } else {
+ metrics.put(user, 5);
+ }
+ } else {
+ metrics.put(user, percentComplete);
+ }
+ }
+ }
+
+ private void writeSummary() throws IOException {
+ excelWriter.startSheet("task metrics", 6);
+ excelWriter.writeRow("Engineer", "TaskMetric");
+
+ for (Entry<User, MutableInteger> entry : metrics.getCounts()) {
+ User user = entry.getKey();
+ MutableInteger metric = entry.getValue();
+ excelWriter.writeRow(user.getName(), metric.toString());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"Artifact Type\" keyedBranch=\"common\" defaultValue=\"Lba Test Team Workflow\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("ATS.Report");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ActionTeamDateListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ActionTeamDateListDialog.java
new file mode 100644
index 00000000000..7d17225c88c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ActionTeamDateListDialog.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.ats.report;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.ArtifactViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionTeamDateListDialog extends SelectionDialog {
+
+ XListViewer teamDefList = new XListViewer("Team(s)");
+ XDate dateCombo = new XDate("Date");
+ XListViewer changeTypeList = new XListViewer("Include Change Types");
+ private static ArrayList<Object> selectedTeamDefs;
+ private static Date selectedDate;
+ private static ArrayList<Object> selectedChangeTypes;
+
+ public ActionTeamDateListDialog(Shell parent) {
+ super(parent);
+ setTitle("Select Teams and Date");
+ setMessage("Select Teams and Date");
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ teamDefList.setLabelProvider(new ArtifactDescriptiveLabelProvider());
+ teamDefList.setContentProvider(new ArrayContentProvider());
+ teamDefList.setSorter(new ArtifactViewerSorter());
+ teamDefList.setGrabHorizontal(true);
+ teamDefList.setMultiSelect(true);
+ teamDefList.createWidgets(comp, 2);
+ if (selectedTeamDefs != null) {
+ ArrayList<Object> sel = new ArrayList<Object>();
+ for (Object obj : selectedTeamDefs)
+ sel.add(obj);
+ teamDefList.setSelected(sel);
+ }
+ Set<Object> objs = new HashSet<Object>();
+ try {
+ for (TeamDefinitionArtifact teamDef : TeamDefinitionArtifact.getTeamDefinitions(Active.Both))
+ objs.add(teamDef);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ teamDefList.setInput(objs);
+ teamDefList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selectedTeamDefs = teamDefList.getSelected();
+ };
+ });
+ GridData gd = new GridData();
+ gd.heightHint = 300;
+ teamDefList.getTable().setLayoutData(gd);
+
+ comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ changeTypeList.setLabelProvider(new ChangeType.ChangeTypeLabelProvider());
+ changeTypeList.setContentProvider(new ArrayContentProvider());
+ Collection<Object> types = new ArrayList<Object>();
+ for (ChangeType type : ChangeType.values())
+ types.add(type);
+ changeTypeList.setInput(types);
+ changeTypeList.setGrabHorizontal(true);
+ changeTypeList.setMultiSelect(true);
+ changeTypeList.createWidgets(comp, 2);
+ if (selectedChangeTypes != null) {
+ ArrayList<Object> sel = new ArrayList<Object>();
+ for (Object obj : selectedChangeTypes)
+ sel.add(obj);
+ changeTypeList.setSelected(sel);
+ }
+
+ changeTypeList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selectedChangeTypes = changeTypeList.getSelected();
+ };
+ });
+
+ comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ dateCombo.setFormat(XDate.MMDDYY);
+ dateCombo.setRequiredEntry(true);
+ dateCombo.createWidgets(comp, 2);
+ if (selectedDate != null) dateCombo.setDate(selectedDate);
+ dateCombo.addXModifiedListener(new XModifiedListener() {
+ @Override
+ public void widgetModified(XWidget widget) {
+ selectedDate = dateCombo.getDate();
+ };
+ });
+
+ return container;
+ }
+
+ public ArrayList<TeamDefinitionArtifact> getSelectedTeamDefs() {
+ ArrayList<TeamDefinitionArtifact> adas = new ArrayList<TeamDefinitionArtifact>();
+ for (Object obj : selectedTeamDefs)
+ adas.add((TeamDefinitionArtifact) obj);
+ return adas;
+ }
+
+ public Date getSelectedDate() {
+ return selectedDate;
+ }
+
+ public ArrayList<Object> getSelectedChangeTypes() {
+ return selectedChangeTypes;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/CreateActionArtifactChangeReportJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/CreateActionArtifactChangeReportJob.java
new file mode 100644
index 00000000000..f555c8c3907
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/CreateActionArtifactChangeReportJob.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.ats.report;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.widgets.commit.ICommitConfigArtifact;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeData;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeData.KindType;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.util.HtmlExportTable;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CreateActionArtifactChangeReportJob extends Job {
+ IProgressMonitor monitor;
+ private final Set<TeamWorkFlowArtifact> teamArts;
+ private final String byAttribute;
+
+ public CreateActionArtifactChangeReportJob(String jobName, Set<TeamWorkFlowArtifact> teamArts, String byAttribute) {
+ super(jobName);
+ this.teamArts = teamArts;
+ this.byAttribute = byAttribute;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ return runIt(monitor, getName(), teamArts, byAttribute);
+ }
+
+ public static IStatus runIt(IProgressMonitor monitor, String jobName, Collection<TeamWorkFlowArtifact> teamArts, String byAttribute) {
+ XResultData rd = new XResultData();
+ try {
+ if (teamArts.size() == 0) throw new OseeStateException("No Actions/Workflows Specified");
+ retrieveData(monitor, teamArts, byAttribute, rd);
+ if (rd.toString().equals("")) rd.log("No Problems Found");
+ final String html = rd.getReport(jobName).getManipulatedHtml(Arrays.asList(Manipulations.NONE));
+ final String title = jobName;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ Result result = (new HtmlExportTable(title, html, true, false)).export();
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ AWorkbench.popup(
+ title,
+ "Completed " + title + "\n\nFile saved to " + System.getProperty("user.home") + File.separator + "table.csv");
+ }
+ }, true);
+ monitor.done();
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, "Failed", ex);
+ }
+ }
+
+ /**
+ * used recursively when originally passed a directory, thus an array of files is accepted
+ *
+ * @throws Exception
+ */
+ private static void retrieveData(IProgressMonitor monitor, Collection<TeamWorkFlowArtifact> teamArts, String byAttribute, XResultData rd) throws OseeCoreException {
+ monitor.subTask("Retrieving Actions");
+
+ int x = 1;
+ rd.addRaw(AHTML.beginMultiColumnTable(95));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"HRID", "Bulld", "UI", byAttribute, "RPCR", "Change"}));
+ for (TeamWorkFlowArtifact teamArt : teamArts) {
+ String rcprId = teamArt.getSoleAttributeValue(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName(), "");
+ String result =
+ (String.format("Processing %s/%s RPCR %s for \"%s\"", x, teamArts.size(), rcprId,
+ teamArt.getTeamDefinition().getDescriptiveName()));
+ monitor.subTask(result);
+ rd.log("\nRPCR " + rcprId);
+ for (ICommitConfigArtifact commitConfigArt : teamArt.getSmaMgr().getBranchMgr().getConfigArtifactsConfiguredToCommitTo()) {
+ processTeam(teamArt, commitConfigArt.getParentBranch().getBranchShortName(), byAttribute, commitConfigArt,
+ rd);
+ }
+ x++;
+
+ // System.err.println("Developmental purposes only, don't release with this");
+ // if (x >= 5)
+ // break;
+ }
+ rd.addRaw(AHTML.endMultiColumnTable());
+ }
+
+ private static void processTeam(TeamWorkFlowArtifact teamArt, String buildId, String byAttribute, ICommitConfigArtifact commitConfigArt, XResultData rd) throws OseeCoreException {
+ String rpcrNum = teamArt.getSoleAttributeValue(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName(), "");
+ ChangeData changeData = teamArt.getSmaMgr().getBranchMgr().getChangeData(commitConfigArt);
+ for (Artifact modArt : changeData.getArtifacts(KindType.Artifact, ModificationType.NEW, ModificationType.MODIFIED)) {
+ List<String> attrStrs = modArt.getAttributesToStringList(byAttribute);
+ if (attrStrs.size() == 0) attrStrs.add(EnumeratedAttribute.UNSPECIFIED_VALUE);
+ for (String attrStr : attrStrs)
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {teamArt.getHumanReadableId(), buildId,
+ modArt.getDescriptiveName(), attrStr, rpcrNum, "Content"}));
+ }
+ for (Artifact artChg : changeData.getArtifacts(KindType.Artifact, ModificationType.DELETED)) {
+ List<String> attrStrs = artChg.getAttributesToStringList(byAttribute);
+ if (attrStrs.size() == 0) attrStrs.add(EnumeratedAttribute.UNSPECIFIED_VALUE);
+ for (String attrStr : attrStrs)
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {teamArt.getHumanReadableId(), buildId,
+ artChg.getDescriptiveName(), attrStr, rpcrNum, "Deleted"}));
+ }
+ for (Artifact artChg : changeData.getArtifacts(KindType.RelationOnly, ModificationType.NEW,
+ ModificationType.MODIFIED)) {
+ List<String> attrStrs = artChg.getAttributesToStringList(byAttribute);
+ if (attrStrs.size() == 0) attrStrs.add(EnumeratedAttribute.UNSPECIFIED_VALUE);
+ for (String attrStr : attrStrs)
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {teamArt.getHumanReadableId(), buildId,
+ artChg.getDescriptiveName(), attrStr, rpcrNum, "Relation"}));
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ExtendedStatusReportJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ExtendedStatusReportJob.java
new file mode 100644
index 00000000000..2d5909d49df
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/report/ExtendedStatusReportJob.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.report;
+
+import java.util.ArrayList;
+import java.util.Collection;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ExtendedStatusReportJob extends Job {
+ private final ArrayList<Artifact> arts;
+
+ public ExtendedStatusReportJob(String title, ArrayList<Artifact> arts) {
+ super("Creating " + title);
+ this.arts = arts;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ return runIt(monitor, getName(), arts);
+ }
+
+ public static IStatus runIt(IProgressMonitor monitor, final String jobName, Collection<? extends Artifact> teamArts) {
+ if (teamArts.size() == 0) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "No Artifacts Returned");
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, "No Artifacts Returned", null);
+ }
+ try {
+
+ final String html = AHTML.simplePage(getStatusReport(monitor, jobName, teamArts));
+ ResultsEditor.open(new XResultPage(jobName + " - " + XDate.getDateNow(XDate.MMDDYYHHMM), html,
+ Manipulations.HTML_MANIPULATIONS));
+ AWorkbench.popup("Complete", jobName + " Complete...Results in ATS Results");
+ monitor.done();
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ }
+
+ private static String getStatusReport(IProgressMonitor monitor, String title, Collection<? extends Artifact> teamArts) throws OseeCoreException {
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.heading(3, title));
+ sb.append(getStatusReportBody(monitor, title, teamArts));
+ return sb.toString();
+ }
+
+ private static enum Columns {
+ Priority,
+ Change_Type,
+ Team,
+ Type,
+ ActionId,
+ TeamId,
+ TaskId,
+ Title,
+ Analysis,
+ Originator,
+ Assignees,
+ Status_State,
+ Date_Created,
+ Version;
+
+ @Override
+ public String toString() {
+ return name().replaceAll("_", " ");
+ }
+
+ public static String[] getColumnNames() {
+ ArrayList<String> names = new ArrayList<String>();
+ for (Columns col : values()) {
+ names.add(col.toString());
+ }
+ return names.toArray(new String[names.size()]);
+ }
+ };
+
+ private static String getStatusReportBody(IProgressMonitor monitor, String title, Collection<? extends Artifact> arts) throws OseeCoreException {
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.beginMultiColumnTable(100, 1));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(Columns.getColumnNames()));
+ int x = 1;
+ for (Artifact art : arts) {
+ if (art instanceof ActionArtifact) {
+ ActionArtifact actionArt = (ActionArtifact) art;
+ String str =
+ String.format("Processing %s/%s \"%s\"", x++ + "", arts.size(), actionArt.getDescriptiveName());
+ System.out.println(str);
+ monitor.subTask(str);
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ addTableRow(sb, team);
+ SMAManager teamSmaMgr = new SMAManager(team);
+ for (TaskArtifact taskArt : teamSmaMgr.getTaskMgr().getTaskArtifacts("Implement")) {
+ addTableRow(sb, taskArt);
+ }
+ }
+ }
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ return sb.toString();
+ }
+
+ private static void addTableRow(StringBuilder sb, StateMachineArtifact sma) throws OseeCoreException {
+ List<String> values = new ArrayList<String>();
+ SMAManager smaMgr = new SMAManager(sma);
+ for (Columns col : Columns.values()) {
+ // System.out.println("col *" + col + "*");
+ if (col == Columns.ActionId)
+ values.add(sma.getParentActionArtifact().getHumanReadableId());
+ else if (col == Columns.TeamId) {
+ if (sma instanceof TeamWorkFlowArtifact)
+ values.add(sma.getHumanReadableId());
+ else
+ values.add(".");
+ } else if (col == Columns.TaskId) {
+ if (sma instanceof TaskArtifact)
+ values.add(((TaskArtifact) sma).getHumanReadableId());
+ else
+ values.add(".");
+ } else if (col == Columns.Team) {
+ if (sma instanceof TeamWorkFlowArtifact)
+ values.add(((TeamWorkFlowArtifact) sma).getTeamName());
+ else
+ values.add(".");
+ } else if (col == Columns.Type)
+ values.add(sma.getArtifactTypeName());
+ else if (col == Columns.Priority) {
+ values.add((sma.getWorldViewPriority().equals("") ? "." : sma.getWorldViewPriority()));
+ } else if (col == Columns.Change_Type) {
+ values.add((sma.getWorldViewChangeType().name().equals("") ? "." : sma.getWorldViewChangeType().name()));
+ } else if (col == Columns.Title)
+ values.add(sma.getDescriptiveName());
+ else if (col == Columns.Analysis) {
+ String desc = sma.getDescription();
+ if (sma instanceof TaskArtifact) {
+ TaskArtifact taskArt = (TaskArtifact) sma;
+ desc =
+ taskArt.getDescription() + " " + taskArt.getSoleAttributeValue(
+ ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), "");
+ }
+ if (desc.matches("^ *$"))
+ values.add(".");
+ else
+ values.add(desc);
+ } else if (col == Columns.Originator) {
+ if (smaMgr.getOriginator() == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Can't retrieve orig for " + sma.getHumanReadableId());
+ values.add(".");
+ } else
+ values.add(smaMgr.getOriginator().getName());
+ } else if (col == Columns.Assignees)
+ values.add(Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees()));
+ else if (col == Columns.Status_State)
+ values.add(smaMgr.getStateMgr().getCurrentStateName());
+ else if (col == Columns.Date_Created)
+ values.add(sma.getWorldViewCreatedDateStr());
+ else if (col == Columns.Version) {
+ values.add((sma.getWorldViewTargetedVersionStr() == null || sma.getWorldViewTargetedVersionStr().equals("") ? "." : sma.getWorldViewTargetedVersionStr()));
+ }
+ }
+ sb.append(AHTML.addRowMultiColumnTable(values.toArray(new String[values.size()])));
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/ITaskEditorProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/ITaskEditorProvider.java
new file mode 100644
index 00000000000..9eb11e75e08
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/ITaskEditorProvider.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.ats.task;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface ITaskEditorProvider {
+
+ public Collection<? extends Artifact> getTaskEditorTaskArtifacts() throws OseeCoreException;
+
+ public String getTaskEditorLabel(SearchType searchType) throws OseeCoreException;
+
+ public String getName() throws OseeCoreException;
+
+ public Collection<TableLoadOption> getTableLoadOptions() throws OseeCoreException;
+
+ public void setCustomizeData(CustomizeData customizeData);
+
+ public void setTableLoadOptions(TableLoadOption... tableLoadOptions);
+
+ public ITaskEditorProvider copyProvider();
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/IXTaskViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/IXTaskViewer.java
new file mode 100644
index 00000000000..6016e2d06ef
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/IXTaskViewer.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.ats.task;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IXTaskViewer {
+
+ public String getTabName() throws OseeCoreException;
+
+ public Collection<TaskArtifact> getTaskArtifacts(String stateName) throws OseeCoreException;
+
+ public IDirtiableEditor getEditor() throws OseeCoreException;
+
+ public boolean isTaskable() throws OseeCoreException;
+
+ public String getCurrentStateName() throws OseeCoreException;
+
+ public SMAManager getParentSmaMgr() throws OseeCoreException;
+
+ /**
+ * Overriding flag to denote if tasks are allowed to be edited. If false, task viewer will disable all right-click
+ * and alt-left-click editing functionality.
+ *
+ * @return false if tasks are readonly from the TaskViewer
+ * @throws
+ */
+ public boolean isTasksEditable() throws OseeCoreException;
+
+ public String toString();
+
+ /**
+ * Returning true will allow implementer class to handle the refresh button press which whill result in
+ * handlRefreshAction() being called
+ *
+ * @return if implementer will handle refresh calls
+ */
+ public boolean isRefreshActionHandled() throws OseeCoreException;
+
+ /**
+ * Called if isRefreshActionHandled() returns true
+ */
+ public void handleRefreshAction() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskComposite.java
new file mode 100644
index 00000000000..8a58979ef5d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskComposite.java
@@ -0,0 +1,655 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.task;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.NewAction;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TaskableStateMachineArtifact;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.export.AtsExportManager;
+import org.eclipse.osee.ats.export.AtsExportManager.ExportOption;
+import org.eclipse.osee.ats.operation.ImportTasksFromSimpleList;
+import org.eclipse.osee.ats.operation.ImportTasksFromSpreadsheet;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.Overview;
+import org.eclipse.osee.ats.util.SMAMetrics;
+import org.eclipse.osee.ats.world.WorldAssigneeFilter;
+import org.eclipse.osee.ats.world.WorldCompletedFilter;
+import org.eclipse.osee.ats.world.WorldComposite;
+import org.eclipse.osee.ats.world.WorldContentProvider;
+import org.eclipse.osee.ats.world.WorldLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+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.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskComposite extends Composite implements IActionable {
+
+ private TaskXViewer taskXViewer;
+ private MenuItem filterCompletedMenuItem, filterMyAssigneeMenuItem, selectionMetricsMenuItem;
+ private final IXTaskViewer iXTaskViewer;
+ private Label extraInfoLabel;
+ private final WorldCompletedFilter worldCompletedFilter = new WorldCompletedFilter();
+ private WorldAssigneeFilter worldAssigneeFilter = null;
+
+ /**
+ * @param label
+ * @throws Exception
+ */
+ public TaskComposite(IXTaskViewer iXTaskViewer, Composite parent, int style) throws OseeCoreException {
+ this(iXTaskViewer, parent, style, null);
+ }
+
+ public TaskComposite(IXTaskViewer iXTaskViewer, Composite parent, int style, ToolBar toolBar) throws OseeCoreException {
+ super(parent, style);
+ this.iXTaskViewer = iXTaskViewer;
+ AtsBulkLoadCache.run(false);
+
+ setLayout(ALayout.getZeroMarginLayout(1, true));
+ setLayoutData(new GridData(GridData.FILL_BOTH));
+ try {
+ worldAssigneeFilter = new WorldAssigneeFilter();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(this)) {
+ return;
+ }
+
+ populateToolBar(toolBar);
+
+ try {
+
+ extraInfoLabel = new Label(this, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ taskXViewer =
+ new TaskXViewer(this, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, iXTaskViewer.getEditor(), this);
+ taskXViewer.setTasksEditable(iXTaskViewer.isTasksEditable());
+ taskXViewer.setAddDeleteTaskEnabled(iXTaskViewer.isTaskable());
+ taskXViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ taskXViewer.setContentProvider(new WorldContentProvider(taskXViewer));
+ taskXViewer.setLabelProvider(new WorldLabelProvider(taskXViewer));
+ taskXViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ taskXViewer.getTree().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent event) {
+ }
+
+ public void keyReleased(KeyEvent event) {
+ try {
+ if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) {
+ if (event.keyCode == 'a') {
+ taskXViewer.getTree().setSelection(taskXViewer.getTree().getItems());
+ updateExtraInfoLine();
+ } else if (event.keyCode == 'x') {
+ if (selectionMetricsMenuItem != null) {
+ selectionMetricsMenuItem.setSelection(!selectionMetricsMenuItem.getSelection());
+ updateExtraInfoLine();
+ }
+ } else if (event.keyCode == 'f') {
+ if (filterCompletedMenuItem != null) {
+ filterCompletedMenuItem.setSelection(!filterCompletedMenuItem.getSelection());
+ handleCompletedFilterAction();
+ }
+ } else if (event.keyCode == 'g') {
+ filterMyAssigneeMenuItem.setSelection(!filterMyAssigneeMenuItem.getSelection());
+ handleMyAssigneeFilterAction();
+ } else if (event.keyCode == 'd') {
+ filterMyAssigneeMenuItem.setSelection(!filterMyAssigneeMenuItem.getSelection());
+ filterCompletedMenuItem.setSelection(!filterCompletedMenuItem.getSelection());
+ handleCompletedFilterAction();
+ handleMyAssigneeFilterAction();
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ Tree tree = taskXViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL | GridData.GRAB_HORIZONTAL);
+ gridData.heightHint = 100;
+ gridData.widthHint = 100;
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ setupDragAndDropSupport();
+ parent.layout();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * @return the iXTaskViewer
+ */
+ public IXTaskViewer getIXTaskViewer() {
+ return iXTaskViewer;
+ }
+
+ public void handleMyAssigneeFilterAction() {
+ if (filterMyAssigneeMenuItem.getSelection()) {
+ taskXViewer.addFilter(worldAssigneeFilter);
+ } else {
+ taskXViewer.removeFilter(worldAssigneeFilter);
+ }
+ updateExtendedStatusString();
+ taskXViewer.refresh();
+ }
+
+ public void handleCompletedFilterAction() {
+ if (filterCompletedMenuItem.getSelection()) {
+ taskXViewer.addFilter(worldCompletedFilter);
+ } else {
+ taskXViewer.removeFilter(worldCompletedFilter);
+ }
+ updateExtendedStatusString();
+ }
+
+ public void updateExtendedStatusString() {
+ String str = "";
+ if (filterCompletedMenuItem != null && filterCompletedMenuItem.getSelection()) {
+ str += "[Complete/Cancel Filter]";
+ }
+ taskXViewer.setExtendedStatusString(str);
+ taskXViewer.refresh();
+ }
+
+ private void populateToolBar(ToolBar toolBar) throws OseeCoreException {
+ ToolItem item = null;
+
+ if (iXTaskViewer.isTaskable()) {
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(AtsImage.NEW_TASK));
+ item.setToolTipText("New Task");
+ item.setEnabled(iXTaskViewer.isTasksEditable() && iXTaskViewer.isTaskable());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleNewTask();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.X_RED));
+ item.setToolTipText("Delete Task");
+ item.setEnabled(iXTaskViewer.isTasksEditable() && iXTaskViewer.isTaskable());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleDeleteTask();
+ }
+ });
+
+ }
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh Tasks");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ if (iXTaskViewer.isRefreshActionHandled()) {
+ iXTaskViewer.handleRefreshAction();
+ } else {
+ loadTable();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(AtsImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ taskXViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+
+ if (iXTaskViewer.getEditor() != null && (iXTaskViewer.getEditor() instanceof TaskEditor)) {
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(AtsImage.TASK));
+ item.setToolTipText("Open New ATS Task Editor");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ ITaskEditorProvider provider =
+ ((TaskEditorInput) ((TaskEditor) iXTaskViewer.getEditor()).getEditorInput()).getItaskEditorProvider().copyProvider();
+ provider.setCustomizeData(taskXViewer.getCustomizeMgr().generateCustDataFromTable());
+ provider.setTableLoadOptions(TableLoadOption.NoUI);
+ TaskEditor.open(provider);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(AtsImage.TASK_SELECTED));
+ item.setToolTipText("Open Selected in ATS Task Editor");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (taskXViewer.getSelectedArtifacts().size() == 0) {
+ AWorkbench.popup("ERROR", "Select items to open");
+ return;
+ }
+ try {
+ TaskEditor.open(new TaskEditorSimpleProvider("Tasks", taskXViewer.getSelectedArtifacts(),
+ taskXViewer.getCustomizeMgr().generateCustDataFromTable()));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+
+ WorldComposite.actionToToolItem(toolBar, new NewAction(), AtsImage.NEW_ACTION);
+ OseeAts.addButtonToEditorToolBar(this, AtsPlugin.getInstance(), toolBar, SMAEditor.EDITOR_ID, "ATS Task Tab");
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+
+ createTaskActionBarPulldown(toolBar, toolBar.getParent());
+
+ }
+
+ public void updateExtraInfoLine() throws OseeCoreException {
+ if (selectionMetricsMenuItem != null && selectionMetricsMenuItem.getSelection()) if (getTaskXViewer() != null && getTaskXViewer().getSelectedSMAArtifacts() != null && !getTaskXViewer().getSelectedSMAArtifacts().isEmpty()) {
+ extraInfoLabel.setText(SMAMetrics.getEstRemainMetrics(getTaskXViewer().getSelectedSMAArtifacts(), null,
+ getTaskXViewer().getSelectedSMAArtifacts().iterator().next().getManHrsPerDayPreference(), null));
+ } else
+ extraInfoLabel.setText("");
+ extraInfoLabel.getParent().layout();
+ }
+
+ public void createTaskActionBarPulldown(final ToolBar toolBar, Composite composite) {
+ final ToolItem dropDown = new ToolItem(toolBar, SWT.PUSH);
+ dropDown.setImage(ImageManager.getImage(AtsImage.DOWN_TRIANGLE));
+ final Menu menu = new Menu(composite);
+
+ dropDown.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ Rectangle rect = dropDown.getBounds();
+ Point pt = new Point(rect.x, rect.y + rect.height);
+ pt = toolBar.toDisplay(pt);
+ menu.setLocation(pt.x, pt.y);
+ menu.setVisible(true);
+ }
+ });
+
+ selectionMetricsMenuItem = new MenuItem(menu, SWT.CHECK);
+ selectionMetricsMenuItem.setText("Show Release Metrics by Selection - Ctrl-X");
+ selectionMetricsMenuItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ updateExtraInfoLine();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ filterCompletedMenuItem = new MenuItem(menu, SWT.CHECK);
+ filterCompletedMenuItem.setText("Filter Out Completed/Cancelled - Ctrl-F");
+ filterCompletedMenuItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleCompletedFilterAction();
+ }
+ });
+
+ filterMyAssigneeMenuItem = new MenuItem(menu, SWT.CHECK);
+ filterMyAssigneeMenuItem.setText("Filter My Assignee - Ctrl-G");
+ filterMyAssigneeMenuItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleMyAssigneeFilterAction();
+ }
+ });
+
+ new MenuItem(menu, SWT.SEPARATOR);
+
+ MenuItem exportAtsArtifactsItem = new MenuItem(menu, SWT.PUSH);
+ exportAtsArtifactsItem.setText("Export Selected ATS Artifacts");
+ exportAtsArtifactsItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ AtsExportManager.export(taskXViewer.getSelection(), ExportOption.POPUP_DIALOG);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ try {
+ if (iXTaskViewer.isTaskable()) {
+ new MenuItem(menu, SWT.SEPARATOR);
+
+ MenuItem item = new MenuItem(menu, SWT.PUSH);
+ item.setText("Import Tasks via spreadsheet");
+ item.setEnabled(iXTaskViewer.isTasksEditable() && iXTaskViewer.isTaskable());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ handleImportTasksViaSpreadsheet();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ item = new MenuItem(menu, SWT.PUSH);
+ item.setText("Import Tasks via simple list");
+ item.setEnabled(iXTaskViewer.isTasksEditable() && iXTaskViewer.isTaskable());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ handleImportTasksViaList();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+
+ public void loadTable() throws OseeCoreException {
+ getTaskXViewer().set(iXTaskViewer.getTaskArtifacts(""));
+ taskXViewer.refresh();
+ }
+
+ public void handleImportTasksViaList() throws OseeCoreException {
+ BlamOperation blamOperation = new ImportTasksFromSimpleList();
+ ((ImportTasksFromSimpleList) blamOperation).setTaskableStateMachineArtifact((TaskableStateMachineArtifact) iXTaskViewer.getParentSmaMgr().getSma());
+ BlamEditor.edit(blamOperation);
+ loadTable();
+ }
+
+ public void handleImportTasksViaSpreadsheet() throws OseeCoreException {
+ BlamOperation blamOperation = new ImportTasksFromSpreadsheet();
+ ((ImportTasksFromSpreadsheet) blamOperation).setTaskableStateMachineArtifact((TaskableStateMachineArtifact) iXTaskViewer.getParentSmaMgr().getSma());
+ BlamEditor.edit(blamOperation);
+ loadTable();
+ }
+
+ public void handleDeleteTask() {
+ final ArrayList<TaskArtifact> items = getSelectedTaskArtifactItems();
+ if (items.size() == 0) {
+ AWorkbench.popup("ERROR", "No Tasks Selected");
+ return;
+ }
+ StringBuilder builder = new StringBuilder();
+ if (items.size() > 15) {
+ builder.append("Are You Sure You Wish to Delete " + items.size() + " Tasks (NOTE: workflow will be saved)");
+ } else {
+ builder.append("Are You Sure You Wish to Delete the Task(s) (NOTE: workflow will be saved):\n\n");
+ for (TaskArtifact taskItem : items) {
+ builder.append("\"" + taskItem.getDescriptiveName() + "\"\n");
+ }
+ }
+ boolean delete =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Delete Task",
+ builder.toString());
+ if (delete) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Done for concurrent modification purposes
+ ArrayList<TaskArtifact> delItems = new ArrayList<TaskArtifact>();
+ delItems.addAll(items);
+ for (TaskArtifact taskArt : delItems) {
+ SMAEditor.close(taskArt, false);
+ taskArt.deleteAndPersist(transaction);
+ }
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public TaskArtifact handleNewTask() {
+ TaskArtifact taskArt = null;
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Create New Task", null,
+ "Enter Task Title/Description", MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ if (ed.open() == 0) {
+ try {
+ taskArt = iXTaskViewer.getParentSmaMgr().getTaskMgr().createNewTask(ed.getEntry());
+ iXTaskViewer.getEditor().onDirtied();
+ taskXViewer.add(taskArt);
+ taskXViewer.getTree().setFocus();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return taskArt;
+ }
+
+ public ArrayList<TaskArtifact> getSelectedTaskArtifactItems() {
+ Iterator<?> i = ((IStructuredSelection) taskXViewer.getSelection()).iterator();
+ ArrayList<TaskArtifact> items = new ArrayList<TaskArtifact>();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof TaskArtifact) items.add((TaskArtifact) obj);
+ }
+ return items;
+ }
+
+ public String toHTML(String labelFont) {
+ if (getTaskXViewer().getTree().getItemCount() == 0) return "";
+ StringBuffer html = new StringBuffer();
+ try {
+ html.append(AHTML.addSpace(1) + AHTML.getLabelStr(AHTML.LABEL_FONT, "Tasks"));
+ html.append(AHTML.startBorderTable(100, Overview.normalColor, ""));
+ html.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Title", "State", "POC", "%", "Hrs",
+ "Resolution", "ID"}));
+ for (TaskArtifact art : iXTaskViewer.getTaskArtifacts("")) {
+ SMAManager smaMgr = new SMAManager(art);
+ html.append(AHTML.addRowMultiColumnTable(new String[] {art.getDescriptiveName(),
+ art.getSmaMgr().getStateMgr().getCurrentStateName().replaceAll("(Task|State)", ""),
+ smaMgr.getSma().getWorldViewActivePoc(), smaMgr.getSma().getPercentCompleteSMATotal() + "",
+ smaMgr.getSma().getHoursSpentSMATotal() + "",
+ art.getSoleAttributeValue(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), ""),
+ art.getHumanReadableId()}));
+ }
+ html.append(AHTML.endBorderTable());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Task Exception - " + ex.getLocalizedMessage();
+ }
+ return html.toString();
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public TaskXViewer getTaskXViewer() {
+ return taskXViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return taskXViewer.getInput();
+ }
+
+ private void setupDragAndDropSupport() {
+ DragSource source = new DragSource(taskXViewer.getTree(), DND.DROP_COPY);
+ source.setTransfer(new Transfer[] {ArtifactTransfer.getInstance()});
+ source.addDragListener(new DragSourceListener() {
+
+ public void dragFinished(DragSourceEvent event) {
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ Collection<TaskArtifact> arts = taskXViewer.getSelectedTaskArtifacts();
+ if (arts.size() > 0) {
+ event.data = new ArtifactData(arts.toArray(new Artifact[arts.size()]), "", SMAEditor.EDITOR_ID);
+ }
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ }
+ });
+
+ DropTarget target = new DropTarget(taskXViewer.getTree(), DND.DROP_COPY);
+ target.setTransfer(new Transfer[] {FileTransfer.getInstance(), TextTransfer.getInstance(),
+ ArtifactTransfer.getInstance()});
+ target.addDropListener(new DropTargetAdapter() {
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ performDrop(event);
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ event.detail = DND.DROP_COPY;
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ }
+ });
+ }
+
+ private void performDrop(DropTargetEvent e) {
+ if (e.data instanceof ArtifactData) {
+ try {
+ if (iXTaskViewer.getParentSmaMgr() == null) return;
+ if (iXTaskViewer.getParentSmaMgr().getSma() == null) return;
+ final Artifact[] artsToRelate = ((ArtifactData) e.data).getArtifacts();
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (Artifact art : artsToRelate) {
+ if (art instanceof TaskArtifact) {
+ TaskArtifact taskArt = (TaskArtifact) art;
+ // task dropped on same sma as current parent; do nothing
+ if (taskArt.getParentSMA().equals(iXTaskViewer.getParentSmaMgr().getSma())) {
+ return;
+ }
+ if (taskArt.getParentSMA() != null) {
+ taskArt.deleteRelation(AtsRelation.SmaToTask_Sma, taskArt.getParentSMA());
+ }
+ taskArt.addRelation(AtsRelation.SmaToTask_Sma, iXTaskViewer.getParentSmaMgr().getSma());
+ taskArt.persistRelations(transaction);
+ }
+ }
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ public String getActionDescription() {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditor.java
new file mode 100644
index 00000000000..6bb097b672c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditor.java
@@ -0,0 +1,427 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.task;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.world.AtsMetricsComposite;
+import org.eclipse.osee.ats.world.IAtsMetricsProvider;
+import org.eclipse.osee.ats.world.WorldEditorParameterSearchItemProvider;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskEditor extends AbstractArtifactEditor implements IDirtiableEditor, IAtsMetricsProvider, IXTaskViewer {
+ public static final String EDITOR_ID = "org.eclipse.osee.ats.editor.TaskEditor";
+ private int mainPageIndex, metricsPageIndex;
+ private TaskXWidgetActionPage taskActionPage;
+ private final Collection<TaskArtifact> tasks = new HashSet<TaskArtifact>();
+ private AtsMetricsComposite metricsComposite;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (TaskArtifact taskArt : tasks) {
+ taskArt.saveSMA(transaction);
+ }
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ onDirtied();
+ }
+
+ public ArrayList<Artifact> getLoadedArtifacts() {
+ return taskActionPage.getTaskComposite().getTaskXViewer().getLoadedArtifacts();
+ }
+
+ @Override
+ public boolean isSaveOnCloseNeeded() {
+ return isDirty();
+ }
+
+ public static Collection<TaskEditor> getEditors() {
+ final List<TaskEditor> editors = new ArrayList<TaskEditor>();
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (IEditorReference editor : AWorkbench.getEditors(EDITOR_ID)) {
+ editors.add((TaskEditor) editor.getEditor(false));
+ }
+ }
+ }, true);
+ return editors;
+ }
+
+ public static void closeAll() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (IEditorReference editor : AWorkbench.getEditors(EDITOR_ID)) {
+ AWorkbench.getActivePage().closeEditor((editor.getEditor(false)), false);
+ }
+ }
+ });
+ }
+
+ public void setTableTitle(final String title, final boolean warning) {
+ taskActionPage.setTableTitle(title, warning);
+ }
+
+ @Override
+ public void dispose() {
+ for (TaskArtifact taskArt : tasks)
+ if (taskArt != null && !taskArt.isDeleted() && taskArt.isSMAEditorDirty().isTrue()) taskArt.revertSMA();
+ if (taskActionPage.getTaskComposite() != null) taskActionPage.getTaskComposite().dispose();
+ if (metricsComposite != null) metricsComposite.disposeComposite();
+
+ super.dispose();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ for (TaskArtifact taskArt : tasks) {
+ if (taskArt.isDeleted())
+ continue;
+ else if (taskArt.isSMAEditorDirty().isTrue()) return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "TaskEditor";
+ }
+
+ /**
+ * @return the taskActionPage
+ */
+ public TaskXWidgetActionPage getTaskActionPage() {
+ return taskActionPage;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+
+ try {
+ OseeContributionItem.addTo(this, true);
+
+ IEditorInput editorInput = getEditorInput();
+ if (!(editorInput instanceof TaskEditorInput)) {
+ throw new IllegalArgumentException("Editor Input not TaskEditorInput");
+ }
+
+ createMainTab();
+ createMetricsTab();
+
+ setActivePage(mainPageIndex);
+ loadTable();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ } catch (PartInitException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void createMainTab() throws OseeCoreException, PartInitException {
+ taskActionPage = new TaskXWidgetActionPage(this);
+ mainPageIndex = addPage(taskActionPage);
+ }
+
+ private void createMetricsTab() throws OseeCoreException {
+ Composite comp = AtsLib.createCommonPageComposite(getContainer());
+ AtsLib.createCommonToolBar(comp);
+ metricsComposite = new AtsMetricsComposite(this, comp, SWT.NONE);
+ metricsPageIndex = addPage(comp);
+ setPageText(metricsPageIndex, "Metrics");
+ }
+
+ public ITaskEditorProvider getTaskEditorProvider() {
+ TaskEditorInput aei = (TaskEditorInput) getEditorInput();
+ return aei.getItaskEditorProvider();
+ }
+
+ private void loadTable() throws OseeCoreException {
+ ITaskEditorProvider provider = getTaskEditorProvider();
+ setPartName(provider.getTaskEditorLabel(SearchType.Search));
+
+ if (provider instanceof TaskEditorParameterSearchItemProvider && ((TaskEditorParameterSearchItemProvider) provider).isFirstTime()) {
+ setPartName(provider.getName());
+ setTableTitle(WorldEditorParameterSearchItemProvider.ENTER_OPTIONS_AND_SELECT_SEARCH, false);
+ return;
+ }
+ if (provider instanceof TaskEditorParameterSearchItemProvider) {
+ Result result =
+ ((TaskEditorParameterSearchItemProvider) provider).getWorldSearchItem().isParameterSelectionValid();
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ LoadTableJob job = null;
+ job = new LoadTableJob(provider, SearchType.ReSearch, this);
+ job.setUser(false);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ if (provider.getTableLoadOptions() != null && provider.getTableLoadOptions().contains(TableLoadOption.ForcePend)) {
+ try {
+ job.join();
+ } catch (InterruptedException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ @Override
+ public void onDirtied() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ firePropertyChange(PROP_DIRTY);
+ }
+ });
+ }
+
+ public static void open(final ITaskEditorProvider provider) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ page.openEditor(new TaskEditorInput(provider), EDITOR_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }, (provider.getTableLoadOptions() != null && provider.getTableLoadOptions().contains(TableLoadOption.ForcePend)));
+ }
+
+ private static class LoadTableJob extends Job {
+
+ private final ITaskEditorProvider itaskEditorProvider;
+ private final TaskEditor taskEditor;
+ private final SearchType searchType;
+
+ public LoadTableJob(ITaskEditorProvider itaskEditorProvider, SearchType searchType, TaskEditor taskEditor) throws OseeCoreException {
+ super("Loading \"" + itaskEditorProvider.getTaskEditorLabel(searchType) + "\"...");
+ this.searchType = searchType;
+ this.taskEditor = taskEditor;
+ taskEditor.setPartName(itaskEditorProvider.getTaskEditorLabel(searchType));
+ taskEditor.setTableTitle("Loading \"" + itaskEditorProvider.getTaskEditorLabel(searchType) + "\"...", false);
+ this.itaskEditorProvider = itaskEditorProvider;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final List<TaskArtifact> taskArts = new ArrayList<TaskArtifact>();
+ for (Artifact artifact : itaskEditorProvider.getTaskEditorTaskArtifacts()) {
+ if (artifact instanceof TaskArtifact) {
+ taskArts.add((TaskArtifact) artifact);
+ }
+ }
+ taskEditor.tasks.clear();
+ taskEditor.tasks.addAll(taskArts);
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ taskEditor.setPartName(itaskEditorProvider.getTaskEditorLabel(searchType));
+ if (taskArts.size() == 0) {
+ taskEditor.setTableTitle(
+ "No Results Found - " + itaskEditorProvider.getTaskEditorLabel(searchType), true);
+ } else {
+ taskEditor.setTableTitle(itaskEditorProvider.getTaskEditorLabel(searchType), false);
+ }
+ taskEditor.getTaskActionPage().getTaskComposite().loadTable();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }, true);
+ } catch (final Exception ex) {
+ monitor.done();
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, "Can't load tasks", ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getMetricsArtifacts()
+ */
+ @Override
+ public Collection<? extends Artifact> getMetricsArtifacts() throws OseeCoreException {
+ return tasks;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getMetricsVersionArtifact()
+ */
+ @Override
+ public VersionArtifact getMetricsVersionArtifact() throws OseeCoreException {
+ if (tasks.size() > 0) {
+ return tasks.iterator().next().getWorldViewTargetedVersion();
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getCurrentStateName()
+ */
+ public String getCurrentStateName() throws OseeCoreException {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getEditor()
+ */
+ public IDirtiableEditor getEditor() throws OseeCoreException {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getParentSmaMgr()
+ */
+ public SMAManager getParentSmaMgr() throws OseeCoreException {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getTabName()
+ */
+ public String getTabName() throws OseeCoreException {
+ return "Tasks";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#getTaskArtifacts(java.lang.String)
+ */
+ public Collection<TaskArtifact> getTaskArtifacts(String stateName) throws OseeCoreException {
+ return tasks;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#isTaskable()
+ */
+ public boolean isTaskable() throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#isTasksEditable()
+ */
+ public boolean isTasksEditable() throws OseeCoreException {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#isRefreshHandled()
+ */
+ @Override
+ public boolean isRefreshActionHandled() throws OseeCoreException {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.util.widgets.task.IXTaskViewer#refresh()
+ */
+ @Override
+ public void handleRefreshAction() throws OseeCoreException {
+ loadTable();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getManDaysPerHour()
+ */
+ @Override
+ public double getManHoursPerDayPreference() throws OseeCoreException {
+ if (tasks.size() == 0) return StateMachineArtifact.DEFAULT_MAN_HOURS_PER_DAY;
+ return tasks.iterator().next().getManHrsPerDayPreference();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorInput.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorInput.java
new file mode 100644
index 00000000000..0706c51b8e3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorInput.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.ats.task;
+
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskEditorInput implements IEditorInput {
+
+ ITaskEditorProvider itaskEditorProvider;
+
+ /**
+ * @return the itaskEditorProvider
+ */
+ public ITaskEditorProvider getItaskEditorProvider() {
+ return itaskEditorProvider;
+ }
+
+ public TaskEditorInput(ITaskEditorProvider itaskEditorProvider) {
+ this.itaskEditorProvider = itaskEditorProvider;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ try {
+ return itaskEditorProvider.getName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Exception getting name: " + ex.getLocalizedMessage();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ @Override
+ public String getName() {
+ try {
+ return itaskEditorProvider.getName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Exception getting name: " + ex.getLocalizedMessage();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItem.java
new file mode 100644
index 00000000000..52a8772eeac
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItem.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.task;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetOptionResolver;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class TaskEditorParameterSearchItem extends WorldSearchItem implements ITaskEditorProvider, IDynamicWidgetLayoutListener, IXWidgetOptionResolver {
+
+ boolean firstTime = true;
+
+ /**
+ * @param name
+ * @throws OseeArgumentException
+ */
+ public TaskEditorParameterSearchItem(String name) {
+ super(name, LoadView.TaskEditor, AtsImage.TASK);
+ }
+
+ /**
+ * @param worldSearchItem
+ * @throws OseeArgumentException
+ */
+ public TaskEditorParameterSearchItem(WorldSearchItem worldSearchItem) {
+ super(worldSearchItem, AtsImage.TASK);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#copy()
+ */
+ @Override
+ public WorldSearchItem copy() {
+ return null;
+ }
+
+ public abstract String getParameterXWidgetXml() throws OseeCoreException;
+
+ public abstract Result isParameterSelectionValid() throws OseeCoreException;
+
+ public abstract Collection<? extends Artifact> getTaskEditorTaskArtifacts() throws OseeCoreException;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.ITaskEditorParameterProvider#getWidgetOptions(org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData)
+ */
+ @Override
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData widgetData) {
+ return null;
+ }
+
+ /**
+ * @return the firstTime
+ */
+ public boolean isFirstTime() {
+ if (firstTime) {
+ firstTime = false;
+ return true;
+ }
+ return firstTime;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItemProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItemProvider.java
new file mode 100644
index 00000000000..fa28bd63f24
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorParameterSearchItemProvider.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.task;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskEditorParameterSearchItemProvider extends TaskEditorProvider {
+
+ private final TaskEditorParameterSearchItem taskParameterSearchItem;
+
+ public TaskEditorParameterSearchItemProvider(TaskEditorParameterSearchItem worldParameterSearchItem) {
+ this(worldParameterSearchItem, null, TableLoadOption.None);
+ }
+
+ public TaskEditorParameterSearchItemProvider(TaskEditorParameterSearchItem taskParameterSearchItem, CustomizeData customizeData, TableLoadOption... tableLoadOptions) {
+ super(customizeData, tableLoadOptions);
+ this.taskParameterSearchItem = taskParameterSearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.ITaskEditorProvider#getTaskEditorLabel()
+ */
+ @Override
+ public String getTaskEditorLabel(SearchType searchType) throws OseeCoreException {
+ return taskParameterSearchItem.getTaskEditorLabel(searchType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.ITaskEditorProvider#getTaskEditorTaskArtifacts()
+ */
+ @Override
+ public Collection<? extends Artifact> getTaskEditorTaskArtifacts() throws OseeCoreException {
+ return taskParameterSearchItem.getTaskEditorTaskArtifacts();
+ }
+
+ public boolean isFirstTime() {
+ return taskParameterSearchItem.isFirstTime();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#getName()
+ */
+ @Override
+ public String getName() throws OseeCoreException {
+ return taskParameterSearchItem.getName();
+ }
+
+ /**
+ * @return the worldSearchItem
+ */
+ public TaskEditorParameterSearchItem getWorldSearchItem() {
+ return taskParameterSearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#copyProvider()
+ */
+ @Override
+ public ITaskEditorProvider copyProvider() {
+ return new TaskEditorParameterSearchItemProvider((TaskEditorParameterSearchItem) taskParameterSearchItem.copy(),
+ customizeData, tableLoadOptions);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorProvider.java
new file mode 100644
index 00000000000..027ff962cf8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorProvider.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.ats.task;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class TaskEditorProvider implements ITaskEditorProvider {
+
+ protected TableLoadOption[] tableLoadOptions;
+ protected CustomizeData customizeData;
+
+ public TaskEditorProvider(CustomizeData customizeData, TableLoadOption... tableLoadOptions) {
+ this.customizeData = customizeData;
+ this.tableLoadOptions = tableLoadOptions;
+ }
+
+ /**
+ * @return the customizeData
+ */
+ public CustomizeData getCustomizeData() {
+ return customizeData;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.ITaskEditorProvider#getTableLoadOptions()
+ */
+ @Override
+ public Collection<TableLoadOption> getTableLoadOptions() throws OseeCoreException {
+ return Collections.getAggregate(tableLoadOptions);
+ }
+
+ /**
+ * @param tableLoadOptions the tableLoadOptions to set
+ */
+ public void setTableLoadOptions(TableLoadOption... tableLoadOptions) {
+ this.tableLoadOptions = tableLoadOptions;
+ }
+
+ /**
+ * @param customizeData the customizeData to set
+ */
+ public void setCustomizeData(CustomizeData customizeData) {
+ this.customizeData = customizeData;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorSimpleProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorSimpleProvider.java
new file mode 100644
index 00000000000..b3f5cdae828
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskEditorSimpleProvider.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.ats.task;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskEditorSimpleProvider extends TaskEditorProvider {
+
+ private final String name;
+ private final Collection<? extends Artifact> artifacts;
+
+ public TaskEditorSimpleProvider(String name, Collection<? extends Artifact> artifacts) {
+ this(name, artifacts, null, TableLoadOption.None);
+ }
+
+ public TaskEditorSimpleProvider(String name, Collection<? extends Artifact> artifacts, CustomizeData customizeData, TableLoadOption... tableLoadOption) {
+ super(customizeData, tableLoadOption);
+ this.name = name;
+ this.artifacts = artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.ITaskEditorProvider#getTaskEditorLabel(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public String getTaskEditorLabel(SearchType searchType) throws OseeCoreException {
+ return name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.editor.ITaskEditorProvider#getTaskEditorTaskArtifacts()
+ */
+ @Override
+ public Collection<? extends Artifact> getTaskEditorTaskArtifacts() throws OseeCoreException {
+ return artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#getName()
+ */
+ @Override
+ public String getName() throws OseeCoreException {
+ return name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#copyProvider()
+ */
+ @Override
+ public ITaskEditorProvider copyProvider() {
+ return new TaskEditorSimpleProvider(name, artifacts, customizeData, tableLoadOptions);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewer.java
new file mode 100644
index 00000000000..15b42dbf467
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewer.java
@@ -0,0 +1,508 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.task;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAPromptChangeStatus;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.world.WorldContentProvider;
+import org.eclipse.osee.ats.world.WorldXViewer;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskXViewer extends WorldXViewer {
+
+ private final TaskComposite xTaskViewer;
+ private final IDirtiableEditor editor;
+ private boolean tasksEditable = true;
+ private boolean addDeleteTaskEnabled = false;
+ private static String viewerId = GUID.generateGuidStr();
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public TaskXViewer(Composite parent, int style, IDirtiableEditor editor, TaskComposite xTaskViewer) {
+ super(parent, style, new TaskXViewerFactory());
+ this.editor = editor;
+ this.xTaskViewer = xTaskViewer;
+ }
+
+ @Override
+ public String toString() {
+ if (xTaskViewer == null) return "TaskXViewer";
+ try {
+ if (xTaskViewer.getIXTaskViewer().getParentSmaMgr() != null) {
+ return "TaskXViewer - id:" + viewerId + " - " + xTaskViewer.getIXTaskViewer().getParentSmaMgr().getSma().toString();
+ }
+ return "TaskXViewer - id:" + viewerId + " - " + xTaskViewer.getIXTaskViewer().toString();
+ } catch (Exception ex) {
+ return "TaskXViewer - id:" + viewerId;
+ }
+ }
+
+ public boolean isUsingTaskResolutionOptions() {
+ try {
+ if (getSelectedTaskArtifact() == null) return false;
+ return getSelectedTaskArtifact().isUsingTaskResolutionOptions();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ @Override
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ handleColumnMultiEdit(treeColumn, treeItems, false);
+ Set<TaskArtifact> items = new HashSet<TaskArtifact>();
+ for (TreeItem item : treeItems)
+ items.add((TaskArtifact) item.getData());
+ refresh();
+ editor.onDirtied();
+ }
+
+ @Override
+ public void set(Collection<? extends Artifact> artifacts) {
+ for (Artifact art : artifacts)
+ if (!(art instanceof TaskArtifact)) throw new IllegalArgumentException("set only allowed for TaskArtifact");
+ ((WorldContentProvider) getContentProvider()).set(artifacts);
+ }
+
+ @Override
+ public void add(final Artifact artifact) {
+ if (!(artifact instanceof TaskArtifact)) throw new IllegalArgumentException("set only allowed for TaskArtifact");
+ add(Arrays.asList(artifact));
+ }
+
+ @Override
+ public void add(Collection<Artifact> artifacts) {
+ for (Artifact art : artifacts)
+ if (!(art instanceof TaskArtifact)) throw new IllegalArgumentException("add only allowed for TaskArtifact");
+ ((WorldContentProvider) getContentProvider()).add(artifacts);
+ }
+
+ public void removeTask(final Collection<TaskArtifact> artifacts) {
+ ((WorldContentProvider) getContentProvider()).removeAll(artifacts);
+ }
+
+ public TaskArtifact getSelectedTaskArtifact() {
+ Collection<TaskArtifact> arts = getSelectedTaskArtifacts();
+ if (arts.size() > 0) {
+ return arts.iterator().next();
+ }
+ return null;
+ }
+
+ public boolean isSelectedTaskArtifactsAreInWork() {
+ try {
+ Iterator<?> i = ((IStructuredSelection) getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof TaskArtifact) if (!((TaskArtifact) obj).isInWork()) return false;
+ }
+ return true;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ Action editTaskTitleAction, editTaskAssigneesAction, editTaskStatusAction, editTaskResolutionAction,
+ editTaskEstimateAction, editTaskRelatedStateAction, editTaskNotesAction;
+ Action addNewTaskAction, deleteTasksAction;
+
+ @Override
+ public void createMenuActions() {
+ super.createMenuActions();
+
+ editTaskTitleAction = new Action("Edit Task Title", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ SMAManager taskSmaMgr = new SMAManager(getSelectedTaskArtifact());
+ boolean success = taskSmaMgr.promptChangeAttribute(ATSAttributes.TITLE_ATTRIBUTE, false, false);
+ if (success) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editTaskAssigneesAction = new Action("Edit Task Assignees", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (SMAManager.promptChangeAssignees(getSelectedTaskArtifacts(), false)) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editTaskStatusAction = new Action("Edit Task Status", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (SMAPromptChangeStatus.promptChangeStatus(getSelectedTaskArtifacts(), false)) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editTaskResolutionAction = new Action("Edit Task Resolution", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ handleChangeResolution();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editTaskEstimateAction = new Action("Edit Task Estimate", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ boolean success =
+ ArtifactPromptChange.promptChangeFloatAttribute(
+ ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(),
+ ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getDisplayName(), getSelectedTaskArtifacts(), false);
+ if (success) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editTaskRelatedStateAction = new Action("Edit Task Related to State", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ boolean success =
+ SMAManager.promptChangeAttribute(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE,
+ getSelectedTaskArtifacts(), false, true);
+ if (success) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editTaskNotesAction = new Action("Edit Task Notes", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ boolean success =
+ SMAManager.promptChangeAttribute(ATSAttributes.SMA_NOTE_ATTRIBUTE, getSelectedTaskArtifacts(),
+ false, true);
+ if (success) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ addNewTaskAction = new Action("New Task", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ xTaskViewer.handleNewTask();
+ }
+ };
+
+ deleteTasksAction = new Action("Delete Task", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ xTaskViewer.handleDeleteTask();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ }
+
+ @Override
+ public void updateEditMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ // EDIT MENU BLOCK
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskTitleAction);
+ editTaskTitleAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() == 1 && isSelectedTaskArtifactsAreInWork());
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskAssigneesAction);
+ editTaskAssigneesAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() > 0 && isSelectedTaskArtifactsAreInWork());
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskStatusAction);
+ editTaskStatusAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() > 0);
+
+ if (!isUsingTaskResolutionOptions()) {
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskResolutionAction);
+ editTaskResolutionAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() > 0 && isSelectedTaskArtifactsAreInWork());
+ }
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskEstimateAction);
+ editTaskEstimateAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() > 0 && isSelectedTaskArtifactsAreInWork());
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskRelatedStateAction);
+ editTaskRelatedStateAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() > 0 && isSelectedTaskArtifactsAreInWork());
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, editTaskNotesAction);
+ editTaskNotesAction.setEnabled(isTasksEditable() && getSelectedArtifacts().size() > 0);
+
+ }
+
+ @Override
+ public void updateMenuActions() {
+ super.updateMenuActions();
+ MenuManager mm = getMenuManager();
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_OPEN, new Separator());
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_OPEN, addNewTaskAction);
+ addNewTaskAction.setEnabled(isTasksEditable() && addDeleteTaskEnabled);
+
+ mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_OPEN, deleteTasksAction);
+ deleteTasksAction.setEnabled(isTasksEditable() && addDeleteTaskEnabled && getSelectedTaskArtifacts().size() > 0);
+
+ }
+
+ public boolean handleChangeResolution() throws OseeCoreException {
+ // Ensure tasks are related to current state of workflow
+ SMAPromptChangeStatus promptChangeStatus = new SMAPromptChangeStatus(getSelectedTaskArtifacts());
+ Result result = promptChangeStatus.isValidToChangeStatus();
+ if (result.isFalse()) return false;
+
+ if (isUsingTaskResolutionOptions()) {
+ if (SMAPromptChangeStatus.promptChangeStatus(getSelectedTaskArtifacts(), false)) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ return true;
+ }
+ } else if (SMAManager.promptChangeAttribute(ATSAttributes.RESOLUTION_ATTRIBUTE, getSelectedTaskArtifacts(),
+ false, false)) {
+ editor.onDirtied();
+ update(getSelectedTaskArtifacts().toArray(), null);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem, boolean persist) {
+ if (!isTasksEditable()) {
+ AWorkbench.popup("ERROR", "Editing disabled for current state.");
+ return false;
+ }
+ XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
+ SMAManager taskSmaMgr = new SMAManager((TaskArtifact) treeItem.getData());
+ boolean modified = false;
+ try {
+ if (isSelectedTaskArtifactsAreInWork() && xCol.equals(WorldXViewerFactory.Estimated_Hours_Col)) {
+ modified = taskSmaMgr.promptChangeFloatAttribute(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE, false);
+ } else if (isSelectedTaskArtifactsAreInWork() && xCol.equals(WorldXViewerFactory.Title_Col)) {
+ modified = taskSmaMgr.promptChangeAttribute(ATSAttributes.TITLE_ATTRIBUTE, false, false);
+ } else if (isSelectedTaskArtifactsAreInWork() && xCol.equals(WorldXViewerFactory.Related_To_State_Col)) {
+ modified = taskSmaMgr.promptChangeAttribute(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE, false, false);
+ } else if (isSelectedTaskArtifactsAreInWork() && xCol.equals(WorldXViewerFactory.Assignees_Col)) {
+ modified = taskSmaMgr.promptChangeAssignees(false);
+ } else if (isUsingTaskResolutionOptions() && (xCol.equals(WorldXViewerFactory.Hours_Spent_State_Col) || xCol.equals(WorldXViewerFactory.Hours_Spent_Total_Col) || xCol.equals(WorldXViewerFactory.Percent_Complete_State_Col) || xCol.equals(WorldXViewerFactory.Percent_Complete_Total_Col))) {
+ modified = handleChangeResolution();
+ } else if (isSelectedTaskArtifactsAreInWork() && xCol.equals(WorldXViewerFactory.Resolution_Col)) {
+ modified = handleChangeResolution();
+ } else if (xCol.equals(WorldXViewerFactory.Hours_Spent_State_Col) || xCol.equals(WorldXViewerFactory.Hours_Spent_Total_Col) || xCol.equals(WorldXViewerFactory.Percent_Complete_State_Col) || xCol.equals(WorldXViewerFactory.Percent_Complete_Total_Col)) {
+ modified = SMAPromptChangeStatus.promptChangeStatus(Arrays.asList(taskSmaMgr.getSma()), false);
+ } else
+ modified = super.handleAltLeftClick(treeColumn, treeItem, false);
+
+ if (modified) {
+ editor.onDirtied();
+ update((treeItem.getData()), null);
+ return true;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ /**
+ * @return the tasksEditable
+ */
+ public boolean isTasksEditable() {
+ return tasksEditable;
+ }
+
+ /**
+ * @param tasksEditable the tasksEditable to set
+ */
+ public void setTasksEditable(boolean tasksEditable) {
+ this.tasksEditable = tasksEditable;
+ }
+
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, final LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.getLoadedArtifacts().size() == 0) return;
+ // ContentProvider ensures in display thread
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ WorldContentProvider contentProvider =
+ (WorldContentProvider) xTaskViewer.getTaskXViewer().getContentProvider();
+ if (contentProvider != null) {
+ contentProvider.removeAll(loadedArtifacts.getLoadedArtifacts());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.getLoadedArtifacts().size() == 0) return;
+ // ContentProvider ensures in display thread
+ ((WorldContentProvider) xTaskViewer.getTaskXViewer().getContentProvider()).removeAll(loadedArtifacts.getLoadedArtifacts());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.WorldXViewer#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (xTaskViewer.getTaskXViewer().getContentProvider() == null) return;
+ ((WorldContentProvider) xTaskViewer.getTaskXViewer().getContentProvider()).removeAll(transData.cacheDeletedArtifacts);
+ ((WorldContentProvider) xTaskViewer.getTaskXViewer().getContentProvider()).updateAll(transData.cacheChangedArtifacts);
+
+ try {
+ if (xTaskViewer.getIXTaskViewer().getParentSmaMgr() == null) {
+ return;
+ }
+ Artifact parentSma = xTaskViewer.getIXTaskViewer().getParentSmaMgr().getSma();
+ if (parentSma != null) {
+ // Add any new tasks related to parent sma
+ Collection<Artifact> artifacts =
+ transData.getRelatedArtifacts(parentSma.getArtId(),
+ AtsRelation.SmaToTask_Task.getRelationType().getRelationTypeId(),
+ AtsPlugin.getAtsBranch().getBranchId(), transData.cacheAddedRelations);
+ if (artifacts.size() > 0) {
+ ((WorldContentProvider) xTaskViewer.getTaskXViewer().getContentProvider()).add(artifacts);
+ }
+
+ // Remove any tasks related to parent sma
+ artifacts =
+ transData.getRelatedArtifacts(parentSma.getArtId(),
+ AtsRelation.SmaToTask_Task.getRelationType().getRelationTypeId(),
+ AtsPlugin.getAtsBranch().getBranchId(), transData.cacheDeletedRelations);
+ if (artifacts.size() > 0) {
+ ((WorldContentProvider) xTaskViewer.getTaskXViewer().getContentProvider()).removeAll(artifacts);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ /**
+ * @return the addDeleteTaskEnabled
+ */
+ public boolean isAddDeleteTaskEnabled() {
+ return addDeleteTaskEnabled;
+ }
+
+ /**
+ * @param addDeleteTaskEnabled the addDeleteTaskEnabled to set
+ */
+ public void setAddDeleteTaskEnabled(boolean addDeleteTaskEnabled) {
+ this.addDeleteTaskEnabled = addDeleteTaskEnabled;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewerFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewerFactory.java
new file mode 100644
index 00000000000..062976d0578
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXViewerFactory.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.ats.task;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.world.AtsWorldEditorItems;
+import org.eclipse.osee.ats.world.IAtsWorldEditorItem;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.ats.world.WorldXViewerSorter;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskXViewerFactory extends SkynetXViewerFactory {
+
+ public static final List<XViewerColumn> TaskViewerVisibleColumns =
+ Arrays.asList(WorldXViewerFactory.Title_Col, WorldXViewerFactory.State_Col, WorldXViewerFactory.Assignees_Col,
+ WorldXViewerFactory.Percent_Complete_Total_Col, WorldXViewerFactory.Total_Hours_Spent_Col,
+ WorldXViewerFactory.Resolution_Col, WorldXViewerFactory.Estimated_Hours_Col,
+ WorldXViewerFactory.Remaining_Hours_Col, WorldXViewerFactory.Related_To_State_Col,
+ WorldXViewerFactory.Notes_Col);
+ public static Integer[] widths = new Integer[] {450, 60, 150, 40, 40, 100, 50, 50, 50, 80, 80};
+
+ public TaskXViewerFactory() {
+ super("org.eclipse.osee.ats.TaskXViewer");
+ int widthIndex = 0;
+ // Create new column from world columns but set show and width for task
+ for (XViewerColumn taskCol : TaskViewerVisibleColumns) {
+ XViewerColumn newCol = taskCol.copy();
+ newCol.setShow(true);
+ newCol.setWidth(widths[widthIndex++]);
+ registerColumn(newCol);
+ }
+ // Add remaining columns from world columns
+ for (XViewerColumn worldCol : WorldXViewerFactory.WorldViewColumns) {
+ if (!TaskViewerVisibleColumns.contains(worldCol)) {
+ XViewerColumn newCol = worldCol.copy();
+ newCol.setShow(false);
+ registerColumn(newCol);
+ }
+ }
+ // Register any columns from other plugins
+ try {
+ for (IAtsWorldEditorItem item : AtsWorldEditorItems.getItems()) {
+ for (XViewerColumn xCol : item.getXViewerColumns()) {
+ registerColumn(xCol);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ registerAllAttributeColumns();
+ }
+
+ @Override
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new WorldXViewerSorter(xViewer);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXWidgetActionPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXWidgetActionPage.java
new file mode 100644
index 00000000000..dde1876ce48
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/task/TaskXWidgetActionPage.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.ats.task;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.world.AtsXWidgetActionFormPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskXWidgetActionPage extends AtsXWidgetActionFormPage {
+
+ private final TaskEditor taskEditor;
+ private TaskComposite taskComposite;
+ private static String HELP_CONTEXT_ID = "atsWorkflowEditorTaskTab";
+
+ /**
+ * @param editor
+ */
+ public TaskXWidgetActionPage(TaskEditor taskEditor) {
+ super(taskEditor, "org.eclipse.osee.ats.actionPage", "Actions");
+ this.taskEditor = taskEditor;
+ }
+
+ @Override
+ public Section createResultsSection(Composite body) throws OseeCoreException {
+ resultsSection = toolkit.createSection(body, Section.NO_TITLE);
+ resultsSection.setText("Results");
+ resultsSection.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ resultsContainer = toolkit.createClientContainer(resultsSection, 1);
+ taskComposite = new TaskComposite(taskEditor, resultsContainer, SWT.BORDER, toolBar);
+ AtsPlugin.getInstance().setHelp(taskComposite, HELP_CONTEXT_ID);
+ return resultsSection;
+ }
+
+ /**
+ * @return the taskComposite
+ */
+ public TaskComposite getTaskComposite() {
+ return taskComposite;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormPage#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ Result result = AtsPlugin.areOSEEServicesAvailable();
+ if (result.isFalse()) {
+ AWorkbench.popup("ERROR", "DB Connection Unavailable");
+ return;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.AtsXWidgetActionFormPage#getDynamicWidgetLayoutListener()
+ */
+ @Override
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener() {
+ if (taskEditor.getTaskEditorProvider() instanceof TaskEditorParameterSearchItemProvider) {
+ if (((TaskEditorParameterSearchItemProvider) taskEditor.getTaskEditorProvider()).getWorldSearchItem() instanceof TaskEditorParameterSearchItem) {
+ return (((TaskEditorParameterSearchItemProvider) taskEditor.getTaskEditorProvider()).getWorldSearchItem());
+ }
+ }
+ return null;
+ }
+
+ public void reSearch() throws OseeCoreException {
+ taskEditor.handleRefreshAction();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.AtsXWidgetActionFormPage#getXWidgetsXml()
+ */
+ @Override
+ public String getXWidgetsXml() throws OseeCoreException {
+ if (taskEditor.getTaskEditorProvider() instanceof TaskEditorParameterSearchItemProvider) {
+ if (((TaskEditorParameterSearchItemProvider) taskEditor.getTaskEditorProvider()).getWorldSearchItem() instanceof TaskEditorParameterSearchItem) {
+ return (((TaskEditorParameterSearchItemProvider) taskEditor.getTaskEditorProvider()).getWorldSearchItem()).getParameterXWidgetXml();
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.AtsXWidgetActionFormPage#handleSearchButtonPressed()
+ */
+ @Override
+ public void handleSearchButtonPressed() {
+ try {
+ reSearch();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ActionManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ActionManager.java
new file mode 100644
index 00000000000..2140035dcd0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ActionManager.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.ats.util;
+
+import java.util.Collection;
+import java.util.Date;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionManager {
+
+ public static ActionArtifact createAction(IProgressMonitor monitor, String title, String desc, ChangeType changeType, PriorityType priority, Collection<String> userComms, boolean validationRequired, Date needByDate, Collection<ActionableItemArtifact> actionableItems, SkynetTransaction transaction) throws OseeCoreException {
+ // if "tt" is title, this is an action created for development. To
+ // make it easier, all fields are automatically filled in for ATS developer
+
+ if (monitor != null) monitor.subTask("Creating Action");
+ ActionArtifact actionArt =
+ (ActionArtifact) ArtifactTypeManager.addArtifact(ActionArtifact.ARTIFACT_NAME, AtsPlugin.getAtsBranch());
+ ActionArtifact.setArtifactIdentifyData(actionArt, title, desc, changeType, priority, userComms,
+ validationRequired, needByDate);
+
+ // Retrieve Team Definitions corresponding to selected Actionable Items
+ if (monitor != null) monitor.subTask("Creating WorkFlows");
+ Collection<TeamDefinitionArtifact> teams = TeamDefinitionArtifact.getImpactedTeamDefs(actionableItems);
+ if (teams == null || teams.size() == 0) {
+ StringBuffer sb = new StringBuffer();
+ for (ActionableItemArtifact aia : actionableItems)
+ sb.append("Selected AI \"" + aia + "\" " + aia.getHumanReadableId() + "\n");
+ throw new IllegalArgumentException(
+ "No teams returned for Action's selected Actionable Items\n" + sb.toString());
+ }
+
+ // Create team workflow artifacts
+ for (TeamDefinitionArtifact teamDef : teams) {
+ actionArt.createTeamWorkflow(teamDef, actionableItems, teamDef.getLeads(actionableItems), transaction);
+ }
+ actionArt.persistAttributesAndRelations(transaction);
+ return actionArt;
+
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ArtifactEmailWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ArtifactEmailWizard.java
new file mode 100644
index 00000000000..c4308f05040
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/ArtifactEmailWizard.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.ats.util;
+
+import java.util.ArrayList;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.util.Overview.PreviewStyle;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.util.email.EmailGroup;
+import org.eclipse.osee.framework.ui.skynet.util.email.EmailWizard;
+
+public class ArtifactEmailWizard extends EmailWizard {
+
+ public ArtifactEmailWizard(StateMachineArtifact sma) throws OseeCoreException {
+ this(sma, null);
+ }
+
+ public ArtifactEmailWizard(StateMachineArtifact sma, ArrayList<Object> toAddress) throws OseeCoreException {
+ super();
+ setInitialAddress(toAddress);
+ setHtmlMessage(sma.getPreviewHtml(PreviewStyle.HYPEROPEN, PreviewStyle.NO_SUBSCRIBE_OR_FAVORITE));
+ setSubject(" Regarding " + sma.getArtifactTypeName() + " - " + sma.getDescriptiveName());
+ setEmailableGroups(getEmailableGroups(sma));
+ }
+
+ private ArrayList<EmailGroup> getEmailableGroups(StateMachineArtifact sma) throws OseeCoreException {
+ return sma.getEmailableGroups();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsActionBrowserListener.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsActionBrowserListener.java
new file mode 100644
index 00000000000..7f5f0ddbdf9
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsActionBrowserListener.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.ats.util;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultBrowserHyperCmd;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultBrowserListener;
+import org.eclipse.swt.browser.LocationEvent;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsActionBrowserListener extends XResultBrowserListener {
+
+ public void changing(LocationEvent event) {
+ String location = event.location;
+ if (location.contains("javascript:print")) return;
+ String cmdStr = location.replaceFirst("about:blank", "");
+ cmdStr = cmdStr.replaceFirst("blank", "");
+ XResultBrowserHyperCmd xResultBrowserHyperCmd = XResultBrowserHyperCmd.getCmdStrHyperCmd(cmdStr);
+ if (xResultBrowserHyperCmd == XResultBrowserHyperCmd.openPriorityHelp) {
+ event.doit = false;
+ AtsPlugin.getInstance().getWorkbench().getHelpSystem().displayHelp(AtsPriority.PRIORITY_HELP_CONTEXT_ID);
+ }
+ super.changing(event);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactAnnotations.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactAnnotations.java
new file mode 100644
index 00000000000..a01cfad5e3d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactAnnotations.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.ats.util;
+
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.ArtifactAnnotation;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.IArtifactAnnotation;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsArtifactAnnotations implements IArtifactAnnotation {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.IArtifactAnnotation#getAnnotations(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ public void getAnnotations(Artifact artifact, Set<ArtifactAnnotation> annotations) {
+ try {
+ if (artifact instanceof StateMachineArtifact) {
+ SMAManager smaMgr = new SMAManager((StateMachineArtifact) artifact);
+ Result result = smaMgr.getDeadlineMgr().isDeadlineDateAlerting();
+ if (result.isTrue()) annotations.add(ArtifactAnnotation.getWarning("org.eclipse.osee.ats.deadline",
+ result.getText()));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactChecks.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactChecks.java
new file mode 100644
index 00000000000..eeb3a909a54
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsArtifactChecks.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.ats.util;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.world.search.ActionableItemWorldSearchItem;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem;
+import org.eclipse.osee.ats.world.search.UserRelatedToAtsObjectSearch;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem.ReleasedOption;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.LoadView;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCheck;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * Check for certain conditions that must be met to delete an ATS object or User artifact.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsArtifactChecks extends ArtifactCheck {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.IArtifactOperation#isDeleteable(java.util.Collection)
+ */
+ @Override
+ public IStatus isDeleteable(Collection<Artifact> artifacts) throws OseeCoreException {
+ String result = checkActionableItems(artifacts);
+ if (result != null) {
+ return createStatus(result);
+ }
+
+ result = checkTeamDefinitions(artifacts);
+ if (result != null) {
+ return createStatus(result);
+ }
+
+ result = checkAtsWorkflows(artifacts);
+ if (result != null) {
+ return createStatus(result);
+ }
+
+ result = checkUsers(artifacts);
+ if (result != null) {
+ return createStatus(result);
+ }
+
+ return OK_STATUS;
+ }
+
+ private IStatus createStatus(String message) {
+ return new Status(IStatus.ERROR, AtsPlugin.PLUGIN_ID, message);
+ }
+
+ private String checkActionableItems(Collection<Artifact> artifacts) throws OseeCoreException {
+ Set<ActionableItemArtifact> aias = new HashSet<ActionableItemArtifact>();
+ for (Artifact art : artifacts) {
+ if (art instanceof ActionableItemArtifact) aias.add((ActionableItemArtifact) art);
+ }
+ if (aias.size() > 0) {
+ ActionableItemWorldSearchItem srch = new ActionableItemWorldSearchItem("AI search", aias, true, true);
+ if (srch.performSearchGetResults(false).size() > 0) {
+ return "Actionable Items (or children AIs) selected to delete have related Team Workflows; Delete or re-assign Team Workflows first.";
+ }
+ }
+ return null;
+ }
+
+ private String checkTeamDefinitions(Collection<Artifact> artifacts) throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ for (Artifact art : artifacts) {
+ if (art instanceof TeamDefinitionArtifact) teamDefs.add((TeamDefinitionArtifact) art);
+ }
+ if (teamDefs.size() > 0) {
+
+ TeamWorldSearchItem srch =
+ new TeamWorldSearchItem("Team Def search", teamDefs, true, false, true, null, null, ReleasedOption.Both);
+ if (srch.performSearchGetResults(false).size() > 0) {
+ return "Team Definition (or children Team Definitions) selected to delete have related Team Workflows; Delete or re-assign Team Workflows first.";
+ }
+ }
+ return null;
+ }
+
+ private String checkAtsWorkflows(Collection<Artifact> artifacts) throws OseeCoreException {
+ for (Artifact art : artifacts) {
+ if (art.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ if (art.getRelatedArtifacts(AtsRelation.WorkItem__Parent).size() > 0) {
+ return "ATS WorkFlowDefinition [" + art + "] selected to delete has related Team Definition(s) via WorkItem__Parent; Re-assign Team Definitions to new WorkFlowDefinition first.";
+ }
+ }
+ if (art.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ if (art.getRelatedArtifacts(AtsRelation.WorkItem__Parent).size() > 0) {
+ return "ATS WorkRuleDefinition [" + art + "] selected to delete has related Work Items via WorkItem__Parent that must be removed first.";
+ }
+ }
+ if (art.getArtifactTypeName().equals(WorkWidgetDefinition.ARTIFACT_NAME)) {
+ if (art.getRelatedArtifacts(AtsRelation.WorkItem__Parent).size() > 0) {
+ return "ATS WorkWidgetDefinition [" + art + "] selected to delete has related Work Items via WorkItem__Parent that must be removed first.";
+ }
+ }
+ }
+ return null;
+ }
+
+ private String checkUsers(Collection<Artifact> artifacts) throws OseeCoreException {
+ Set<User> users = new HashSet<User>();
+ for (Artifact art : artifacts) {
+ if (art instanceof User) users.add((User) art);
+ }
+ for (User user : users) {
+ UserRelatedToAtsObjectSearch srch =
+ new UserRelatedToAtsObjectSearch("User search", user, false, LoadView.None);
+ if (srch.performSearchGetResults().size() > 0) {
+ return "User name: \"" + user.getDescriptiveName() + "\" userId: \"" + user.getUserId() + "\" selected to delete has related ATS Objects; Un-relate to ATS first before deleting.";
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchAccessHandler.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchAccessHandler.java
new file mode 100644
index 00000000000..077fe31d44c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchAccessHandler.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.ats.util;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+
+/**
+ * This class handles new branches and setting access control based on ATS workflows and their assignees
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsBranchAccessHandler implements IBranchEventListener {
+
+ private static AtsBranchAccessHandler atsBranchAccessHandler = new AtsBranchAccessHandler();
+
+ public static AtsBranchAccessHandler getInstance() {
+ return atsBranchAccessHandler;
+ }
+
+ private AtsBranchAccessHandler() {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Starting ATS Branch Access Handler");
+ OseeEventManager.addListener(this);
+ }
+
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, org.eclipse.osee.framework.skynet.core.artifact.Branch, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ try {
+ if (branchModType == BranchEventType.Added) {
+ Branch branch = BranchManager.getBranch(branchId);
+ Artifact artifact = branch.getAssociatedArtifact();
+ if (artifact instanceof StateMachineArtifact) {
+ ((StateMachineArtifact) artifact).getSmaMgr().getBranchMgr().updateBranchAccessControl();
+ }
+ }
+ // TODO Need to remove branch access control if branch deleted, archived, etc
+ } catch (BranchDoesNotExist ex) {
+ OseeLog.log(AtsPlugin.class, Level.INFO, ex);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchManager.java
new file mode 100644
index 00000000000..6ab708ea9ff
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBranchManager.java
@@ -0,0 +1,958 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+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.MessageDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.editor.IAtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.commit.CommitStatus;
+import org.eclipse.osee.ats.util.widgets.commit.ICommitConfigArtifact;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule;
+import org.eclipse.osee.ats.workflow.item.AtsAddPeerToPeerReviewRule;
+import org.eclipse.osee.ats.workflow.item.StateEventType;
+import org.eclipse.osee.ats.workflow.item.AtsAddDecisionReviewRule.DecisionRuleOption;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleBranchesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlData;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeData;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit.CommitHandler;
+import org.eclipse.osee.framework.ui.skynet.dialogs.ListDialogSortable;
+import org.eclipse.osee.framework.ui.skynet.util.TransactionIdLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * BranchManager contains methods necessary for ATS objects to interact with creation, view and commit of branches.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsBranchManager {
+ private final SMAManager smaMgr;
+
+ public AtsBranchManager(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ public void showMergeManager() {
+ try {
+ if (!isWorkingBranchInWork() && !isCommittedBranchExists()) {
+ AWorkbench.popup("ERROR", "No Current Working or Committed Branch");
+ return;
+ }
+ if (isWorkingBranchInWork()) {
+ Branch branch = getConfiguredBranchForWorkflow();
+ if (branch == null) {
+ AWorkbench.popup("ERROR", "Can't access parent branch");
+ return;
+ }
+ MergeView.openView(getWorkingBranch(), branch,
+ TransactionIdManager.getStartEndPoint(getWorkingBranch()).getKey());
+
+ } else if (isCommittedBranchExists()) {
+ TransactionId transactionId = getTransactionIdOrPopupChoose("Show Merge Manager", true);
+ if (transactionId == null) {
+ return;
+ }
+ MergeView.openView(transactionId);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * Return true if merge branch exists in DB (whether archived or not)
+ *
+ * @param destinationBranch
+ * @return true
+ * @throws OseeCoreException
+ */
+ public boolean isMergeBranchExists(Branch destinationBranch) throws OseeCoreException {
+ if (getWorkingBranch(true, false) == null) {
+ return false;
+ }
+ return BranchManager.isMergeBranch(getWorkingBranch(true, false), destinationBranch);
+ }
+
+ public boolean isMergeCompleted(Branch destinationBranch) throws OseeCoreException {
+ ConflictManagerExternal conflictManager =
+ new ConflictManagerExternal(destinationBranch, getWorkingBranch(true, false));
+ return !conflictManager.remainingConflictsExist();
+ }
+
+ public CommitStatus getCommitStatus(ICommitConfigArtifact configArt) throws OseeCoreException {
+ Branch branch = configArt.getParentBranch();
+ if (branch == null) {
+ return CommitStatus.Branch_Not_Configured;
+ }
+
+ Set<Branch> branches = BranchManager.getAssociatedArtifactBranches(smaMgr.getSma(), false, false);
+ if (branches.contains(branch)) {
+ return CommitStatus.Committed;
+ }
+ Collection<TransactionId> transactions = TransactionIdManager.getCommittedArtifactTransactionIds(smaMgr.getSma());
+ for (TransactionId transId : transactions) {
+ if (transId.getBranch().equals(branch)) {
+ if (smaMgr.getBranchMgr().isMergeBranchExists(branch)) {
+ return CommitStatus.Committed_With_Merge;
+ } else {
+ return CommitStatus.Committed;
+ }
+ }
+ }
+
+ Result result = smaMgr.getBranchMgr().isCommitBranchAllowed(configArt);
+ if (result.isFalse()) {
+ return CommitStatus.Branch_Commit_Disabled;
+ }
+ if (smaMgr.getBranchMgr().getWorkingBranch(true, false) == null) {
+ return CommitStatus.Working_Branch_Not_Created;
+ }
+ if (smaMgr.getBranchMgr().isMergeBranchExists(branch)) {
+ return CommitStatus.Merge_In_Progress;
+ }
+ return CommitStatus.Commit_Needed;
+ }
+
+ public void showMergeManager(Branch destinationBranch) throws OseeCoreException {
+ if (isWorkingBranchInWork()) {
+ MergeView.openView(getWorkingBranch(), destinationBranch, TransactionIdManager.getStartEndPoint(
+ getWorkingBranch()).getKey());
+ } else if (isCommittedBranchExists()) {
+ for (TransactionId transactionId : getTransactionIds(true)) {
+ if (transactionId.getBranch() == destinationBranch) {
+ MergeView.openView(transactionId);
+
+ }
+ }
+ }
+ }
+
+ /**
+ * Opens the branch currently associated with this state machine artifact.
+ */
+ public void showWorkingBranch() {
+ try {
+ if (!isWorkingBranchInWork()) {
+ AWorkbench.popup("ERROR", "No Current Working Branch");
+ return;
+ }
+ BranchView.revealBranch(getWorkingBranch());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Integer getBranchId() throws OseeCoreException {
+ if (getWorkingBranch() == null) {
+ return null;
+ }
+ return getWorkingBranch().getBranchId();
+ }
+
+ /**
+ * If working branch has no changes, allow for deletion.
+ */
+ public void deleteWorkingBranch(boolean promptUser) {
+ boolean isExecutionAllowed = !promptUser;
+ try {
+ Branch branch = getWorkingBranch();
+ if (promptUser) {
+ StringBuilder message = new StringBuilder();
+ if (branch.hasChanges()) {
+ message.append("Warning: Changes have been made on this branch.\n\n");
+ }
+ message.append("Are you sure you want to delete the branch: ");
+ message.append(branch);
+
+ isExecutionAllowed =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Delete Working Branch", message.toString());
+ }
+
+ if (isExecutionAllowed) {
+ Job job = BranchManager.deleteBranch(branch);
+ job.join();
+ IStatus status = job.getResult();
+ if (promptUser) {
+ AWorkbench.popup("Delete Complete",
+ status.isOK() ? "Branch delete was successful." : "Branch delete failed.\n" + status.getMessage());
+ } else {
+ if (!status.isOK()) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, status.getMessage(), status.getException());
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Problem deleting branch.", ex);
+ }
+ }
+
+ public Collection<TransactionId> getTransactionIdsForBaslineBranches() throws OseeCoreException {
+ Collection<TransactionId> transactionIds = new ArrayList<TransactionId>();
+ for (TransactionId transactionId : TransactionIdManager.getCommittedArtifactTransactionIds(smaMgr.getSma())) {
+ // exclude working branches including branch states that are re-baselined
+ if (transactionId.getBranch().isBaselineBranch()) {
+ transactionIds.add(transactionId);
+ }
+ }
+ return transactionIds;
+ }
+
+ /**
+ * @return TransactionId associated with this state machine artifact
+ */
+ public Collection<TransactionId> getTransactionIds(boolean showMergeManager) throws OseeCoreException {
+ if (showMergeManager) {
+ // grab only the transaction that had merge conflicts
+ Collection<TransactionId> transactionIds = new ArrayList<TransactionId>();
+ for (TransactionId transactionId : getTransactionIdsForBaslineBranches()) {
+ if (isMergeBranchExists(transactionId.getBranch())) {
+ transactionIds.add(transactionId);
+ }
+ }
+ return transactionIds;
+ } else {
+ return getTransactionIdsForBaslineBranches();
+ }
+ }
+
+ public TransactionId getEarliestTransactionId() throws OseeCoreException {
+ Collection<TransactionId> transactionIds = getTransactionIds(false);
+ if (transactionIds.size() == 1) {
+ return transactionIds.iterator().next();
+ }
+ TransactionId earliestTransactionId = transactionIds.iterator().next();
+ for (TransactionId transactionId : transactionIds) {
+ if (transactionId.getTransactionNumber() < earliestTransactionId.getTransactionNumber()) {
+ earliestTransactionId = transactionId;
+ }
+ }
+ return earliestTransactionId;
+ }
+
+ /**
+ * Either return a single commit transaction or user must choose from a list of valid commit transactions
+ *
+ * @param title
+ * @param showMergeManager
+ * @return
+ * @throws OseeCoreException
+ */
+ private TransactionId getTransactionIdOrPopupChoose(String title, boolean showMergeManager) throws OseeCoreException {
+ Collection<TransactionId> transactionIds = new HashSet<TransactionId>();
+ for (TransactionId id : getTransactionIds(showMergeManager)) {
+ // ignore working branches that have been committed
+ if (id.getBranch().isWorkingBranch() && id.getBranch().isCommitted()) {
+ continue;
+ }
+ // ignore working branches that have been re-baselined (e.g. update form parent branch)
+ else if (id.getBranch().isWorkingBranch() && id.getBranch().isRebaselined()) {
+ continue;
+ } else {
+ transactionIds.add(id);
+ }
+ }
+ if (transactionIds.size() == 1) {
+ return transactionIds.iterator().next();
+ }
+ ListDialogSortable ld = new ListDialogSortable(Display.getCurrent().getActiveShell());
+ ld.setContentProvider(new ArrayContentProvider());
+ ld.setLabelProvider(new TransactionIdLabelProvider());
+ ld.setSorter(new ViewerSorter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 == null || e2 == null) {
+ return 0;
+ }
+ if (((TransactionId) e1).getTransactionNumber() < ((TransactionId) e2).getTransactionNumber()) {
+ return -1;
+ } else if (((TransactionId) e1).getTransactionNumber() > ((TransactionId) e2).getTransactionNumber()) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+ ld.setTitle(title);
+ ld.setMessage("Select Commit Branch");
+ ld.setInput(transactionIds);
+ if (ld.open() == 0) {
+ return (TransactionId) ld.getResult()[0];
+ }
+ return null;
+ }
+
+ public Result isCreateBranchAllowed() throws OseeCoreException {
+ if (!(smaMgr.getSma() instanceof TeamWorkFlowArtifact)) {
+ return Result.FalseResult;
+ }
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) smaMgr.getSma();
+
+ if (teamArt.getTeamDefinition().isTeamUsesVersions()) {
+ if (smaMgr.getTargetedForVersion() == null) {
+ return new Result(false, "Workflow not targeted for Version");
+ }
+ Result result = smaMgr.getTargetedForVersion().isCreateBranchAllowed();
+ if (result.isFalse()) {
+ return result;
+ }
+
+ if (smaMgr.getTargetedForVersion().getParentBranch() == null) {
+ return new Result(false,
+ "Parent Branch not configured for Version [" + smaMgr.getTargetedForVersion() + "]");
+ }
+ if (!smaMgr.getTargetedForVersion().getParentBranch().isBaselineBranch()) {
+ return new Result(false, "Parent Branch must be of Baseline branch type. See Admin for configuration.");
+ }
+ return Result.TrueResult;
+
+ } else {
+ Result result = teamArt.getTeamDefinition().isCreateBranchAllowed();
+ if (result.isFalse()) {
+ return result;
+ }
+
+ if (teamArt.getTeamDefinition().getParentBranch() == null) {
+ return new Result(false,
+ "Parent Branch not configured for Team Definition [" + teamArt.getTeamDefinition() + "]");
+ }
+ if (!teamArt.getTeamDefinition().getParentBranch().isBaselineBranch()) {
+ return new Result(false, "Parent Branch must be of Baseline branch type. See Admin for configuration.");
+ }
+ return Result.TrueResult;
+ }
+ }
+
+ public Result isCommitBranchAllowed(ICommitConfigArtifact configArt) throws OseeCoreException {
+ if (!(smaMgr.getSma() instanceof TeamWorkFlowArtifact)) {
+ return Result.FalseResult;
+ }
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) smaMgr.getSma();
+
+ if (teamArt.getTeamDefinition().isTeamUsesVersions()) {
+ if (smaMgr.getTargetedForVersion() == null) {
+ return new Result(false, "Workflow not targeted for Version");
+ }
+ Result result = smaMgr.getTargetedForVersion().isCommitBranchAllowed();
+ if (result.isFalse()) {
+ return result;
+ }
+
+ if (smaMgr.getTargetedForVersion().getParentBranch() == null) {
+ return new Result(false,
+ "Parent Branch not configured for Version [" + smaMgr.getTargetedForVersion() + "]");
+ }
+ return Result.TrueResult;
+
+ } else {
+ Result result = teamArt.getTeamDefinition().isCommitBranchAllowed();
+ if (result.isFalse()) {
+ return result;
+ }
+
+ if (teamArt.getTeamDefinition().getParentBranch() == null) {
+ return new Result(false,
+ "Parent Branch not configured for Team Definition [" + teamArt.getTeamDefinition() + "]");
+ }
+ return Result.TrueResult;
+ }
+ }
+
+ /**
+ * Display change report associated with the branch, if exists, or transaction, if branch has been committed.
+ */
+ public void showChangeReport() {
+ try {
+ if (isWorkingBranchInWork()) {
+ ChangeView.open(getWorkingBranch());
+ } else if (isCommittedBranchExists()) {
+ TransactionId transactionId = getTransactionIdOrPopupChoose("Show Change Report", false);
+ if (transactionId == null) {
+ return;
+ }
+ ChangeView.open(transactionId);
+ } else {
+ AWorkbench.popup("ERROR", "No Branch or Committed Transaction Found.");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't show change report.", ex);
+ }
+ }
+
+ /**
+ * Grab the change report for the indicated branch
+ */
+ public void showChangeReportForBranch(Branch destinationBranch) {
+ try {
+ for (TransactionId transactionId : getTransactionIds(false)) {
+ if (transactionId.getBranch() == destinationBranch) {
+ ChangeView.open(transactionId);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't show change report.", ex);
+ }
+ }
+
+ /**
+ * Return working branch associated with SMA; This data is cached across all workflows with the cache being updated
+ * by local and remote events.
+ *
+ * @return Branch
+ */
+ public Branch getWorkingBranch() throws OseeCoreException {
+ return getWorkingBranch(false, false);
+ }
+
+ /**
+ * Return working branch associated with SMA, even if it's been archived; This data is cached across all workflows
+ * with the cache being updated by local and remote events. Filters out rebaseline branches (which are working
+ * branches also).
+ *
+ * @param includeDeleted TODO
+ * @return Branch
+ */
+ public Branch getWorkingBranch(boolean includeArchived, boolean includeDeleted) throws OseeCoreException {
+ Set<Branch> branches = new HashSet<Branch>();
+ for (Branch branch : BranchManager.getAssociatedArtifactBranches(smaMgr.getSma(), includeArchived, includeDeleted)) {
+ if (!branch.isRebaselined()) {
+ branches.add(branch);
+ }
+ }
+ if (branches.size() == 0) {
+ return null;
+ } else if (branches.size() > 1) {
+ throw new MultipleBranchesExist(
+ "Unexpected multiple associated un-deleted working branches found for workflow " + smaMgr.getSma().getHumanReadableId());
+ } else {
+ return branches.iterator().next();
+ }
+ }
+
+ /**
+ * Returns true if there were ever a working branch. This could be if there is an inWork branch or an archived
+ * branch. It also handles the case where the archived branch was deleted, in which case it looks at the committedTo
+ * branches and returns true.
+ *
+ * @return result
+ * @throws OseeCoreException
+ */
+ public boolean isWorkingBranchEverCreated() throws OseeCoreException {
+ return isWorkingBranchArchived() || isWorkingBranchEverCommitted();
+ }
+
+ /**
+ * Returns true if there is a working branch that is not archived
+ *
+ * @return result
+ * @throws OseeCoreException
+ */
+ public boolean isWorkingBranchInWork() throws OseeCoreException {
+ return getWorkingBranch(false, false) != null;
+ }
+
+ /**
+ * Returns true if there is an archived working branch. Note, this method does not necessarily mean that there was
+ * ever a working branch cause archived branches can be deleted. Use isWorkingBranchEverCreated or
+ * isWorkingBranchEverCommitted.
+ *
+ * @return result
+ * @throws OseeCoreException
+ */
+ public boolean isWorkingBranchArchived() throws OseeCoreException {
+ return getWorkingBranch(true, false) != null && getWorkingBranch(true, false).isArchived();
+ }
+
+ /**
+ * Returns true if there was ever a commit of a working branch regardless of whether the working branch is archived
+ * or not.
+ *
+ * @return result
+ * @throws OseeCoreException
+ */
+ public boolean isWorkingBranchEverCommitted() throws OseeCoreException {
+ return getBranchesCommittedTo().size() > 0;
+ }
+
+ public Collection<ICommitConfigArtifact> getConfigArtifactsConfiguredToCommitTo() throws OseeCoreException {
+ Set<ICommitConfigArtifact> configObjects = new HashSet<ICommitConfigArtifact>();
+ if (smaMgr.isTeamUsesVersions()) {
+ if (smaMgr.getTargetedForVersion() != null) {
+ smaMgr.getTargetedForVersion().getParallelVersions(configObjects);
+ }
+ } else {
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact && ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition().getParentBranch() != null) {
+ configObjects.add(((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition());
+ }
+ }
+ return configObjects;
+ }
+
+ public ICommitConfigArtifact getParentBranchConfigArtifactConfiguredToCommitTo() throws OseeCoreException {
+ if (smaMgr.isTeamUsesVersions()) {
+ if (smaMgr.getTargetedForVersion() != null) {
+ return smaMgr.getTargetedForVersion();
+ }
+ } else {
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact && ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition().getParentBranch() != null) {
+ return ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition();
+ }
+ }
+ return null;
+ }
+
+ public boolean isAllObjectsToCommitToConfigured() throws OseeCoreException {
+ return getConfigArtifactsConfiguredToCommitTo().size() == getBranchesToCommitTo().size();
+ }
+
+ public Collection<Branch> getBranchesLeftToCommit() throws OseeCoreException {
+ Set<Branch> branchesLeft = new HashSet<Branch>();
+ Collection<Branch> committedTo = getBranchesCommittedTo();
+ for (Branch branchToCommit : getBranchesToCommitTo()) {
+ if (!committedTo.contains(branchToCommit)) {
+ branchesLeft.add(branchToCommit);
+ }
+ }
+ return branchesLeft;
+ }
+
+ public Collection<Branch> getBranchesToCommitTo() throws OseeCoreException {
+ Set<Branch> branches = new HashSet<Branch>();
+ for (Object obj : getConfigArtifactsConfiguredToCommitTo()) {
+ if (obj instanceof VersionArtifact && ((VersionArtifact) obj).getParentBranch() != null) {
+ branches.add(((VersionArtifact) obj).getParentBranch());
+ } else if (obj instanceof TeamDefinitionArtifact && ((TeamDefinitionArtifact) obj).getParentBranch() != null) {
+ branches.add(((TeamDefinitionArtifact) obj).getParentBranch());
+ }
+ }
+ return branches;
+ }
+
+ public Collection<Branch> getBranchesCommittedTo() throws OseeCoreException {
+ Set<Branch> branches = new HashSet<Branch>();
+ for (TransactionId transId : getTransactionIds(false)) {
+ branches.add(transId.getBranch());
+ }
+ return branches;
+ }
+
+ /**
+ * @return true if there is at least one destination branch committed to
+ */
+ public boolean isCommittedBranchExists() throws OseeCoreException {
+ return isAllObjectsToCommitToConfigured() && getBranchesCommittedTo().size() > 0;
+ }
+
+ /**
+ * Return true if all commit destination branches are configured and have been committed to
+ *
+ * @return true
+ * @throws OseeCoreException
+ */
+ public boolean isBranchesAllCommitted() throws OseeCoreException {
+ Collection<Branch> committedTo = getBranchesCommittedTo();
+ for (Branch destBranch : getBranchesToCommitTo()) {
+ if (!committedTo.contains(destBranch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Perform error checks and popup confirmation dialogs associated with creating a working branch.
+ *
+ * @param pageId if specified, WorkPage gets callback to provide confirmation that branch can be created
+ * @param popup if true, errors are popped up to user; otherwise sent silently in Results
+ * @return Result return of status
+ */
+ public Result createWorkingBranch(String pageId, boolean popup) {
+ try {
+ if (isCommittedBranchExists()) {
+ if (popup) {
+ AWorkbench.popup("ERROR", "Can not create another working branch once changes have been committed.");
+ }
+ return new Result("Committed branch already exists.");
+ }
+ Branch parentBranch = getConfiguredBranchForWorkflow();
+ if (parentBranch == null) {
+ String errorStr =
+ "Parent Branch can not be determined.\n\nPlease specify " + "parent branch through Version Artifact or Team Definition Artifact.\n\n" + "Contact your team lead to configure this.";
+ if (popup) {
+ AWorkbench.popup("ERROR", errorStr);
+ }
+ return new Result(errorStr);
+ }
+ Result result = isCreateBranchAllowed();
+ if (result.isFalse()) {
+ if (popup) {
+ result.popup();
+ }
+ return result;
+ }
+ // Retrieve parent branch to create working branch from
+ if (popup && !MessageDialog.openConfirm(
+ Display.getCurrent().getActiveShell(),
+ "Create Working Branch",
+ "Create a working branch from parent branch\n\n\"" + parentBranch.getBranchName() + "\"?\n\n" + "NOTE: Working branches are necessary when OSEE Artifact changes " + "are made during implementation.")) {
+ return Result.FalseResult;
+ }
+ createWorkingBranch(pageId, parentBranch);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Result("Exception occurred: " + ex.getLocalizedMessage());
+ }
+ return Result.TrueResult;
+ }
+
+ private void createNecessaryBranchEventReviews(StateEventType stateEventType, SMAManager smaMgr, SkynetTransaction transaction) throws OseeCoreException {
+ if (stateEventType != StateEventType.CommitBranch && stateEventType != StateEventType.CreateBranch) {
+ throw new OseeStateException("Invalid stateEventType = " + stateEventType);
+ }
+ // Create any decision and peerToPeer reviews for createBranch and commitBranch
+ for (String ruleId : Arrays.asList(AtsAddDecisionReviewRule.ID, AtsAddPeerToPeerReviewRule.ID)) {
+ for (WorkRuleDefinition workRuleDef : smaMgr.getWorkRulesStartsWith(ruleId)) {
+ StateEventType eventType = AtsAddDecisionReviewRule.getStateEventType(smaMgr, workRuleDef);
+ if (eventType != null && eventType == stateEventType) {
+ if (ruleId.equals(AtsAddDecisionReviewRule.ID)) {
+ DecisionReviewArtifact decArt =
+ AtsAddDecisionReviewRule.createNewDecisionReview(workRuleDef, transaction, smaMgr,
+ DecisionRuleOption.TransitionToDecision);
+ if (decArt != null) {
+ decArt.persistAttributesAndRelations(transaction);
+ }
+ } else if (ruleId.equals(AtsAddPeerToPeerReviewRule.ID)) {
+ PeerToPeerReviewArtifact peerArt =
+ AtsAddPeerToPeerReviewRule.createNewPeerToPeerReview(workRuleDef, smaMgr, transaction);
+ if (peerArt != null) {
+ peerArt.persistAttributesAndRelations(transaction);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Branch that is the configured branch to create working branch from.
+ */
+ private Branch getConfiguredBranchForWorkflow() throws OseeCoreException {
+ Branch parentBranch = null;
+
+ // Check for parent branch id in Version artifact
+ if (smaMgr.isTeamUsesVersions()) {
+ VersionArtifact verArt = smaMgr.getTargetedForVersion();
+ if (verArt != null) {
+ parentBranch = verArt.getParentBranch();
+ }
+ }
+
+ // If not defined in version, check for parent branch from team definition
+ if (parentBranch == null && smaMgr.getSma() instanceof TeamWorkFlowArtifact) {
+ parentBranch = ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition().getParentBranch();
+ }
+
+ // If not defined, return null
+ return parentBranch;
+ }
+
+ /**
+ * Create a working branch associated with this state machine artifact. This should NOT be called by applications
+ * except in test cases or automated tools. Use createWorkingBranchWithPopups
+ *
+ * @param pageId
+ * @param parentBranch
+ * @throws Exception
+ */
+ public void createWorkingBranch(String pageId, final Branch parentBranch) throws OseeCoreException {
+ final Artifact stateMachineArtifact = smaMgr.getSma();
+ String title = stateMachineArtifact.getDescriptiveName();
+ if (title.length() > 40) {
+ title = title.substring(0, 39) + "...";
+ }
+ final String branchName =
+ String.format("%s - %s - %s", stateMachineArtifact.getHumanReadableId(),
+ stateMachineArtifact.getDescriptiveName(), title);
+
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+ public IStatus run(IProgressMonitor monitor) throws OseeCoreException {
+ BranchManager.createWorkingBranch(parentBranch, branchName, stateMachineArtifact);
+ // Create reviews as necessary
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ createNecessaryBranchEventReviews(StateEventType.CreateBranch, smaMgr, transaction);
+ transaction.execute();
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.runInJob("Create Branch", runnable, AtsPlugin.class, AtsPlugin.PLUGIN_ID);
+ }
+
+ public void updateBranchAccessControl() throws OseeCoreException {
+ // Only set/update branch access control if state item is configured to accept
+ for (IAtsStateItem stateItem : smaMgr.getStateItems().getCurrentPageStateItems(smaMgr)) {
+ if (stateItem.isAccessControlViaAssigneesEnabledForBranching()) {
+ Branch branch = getWorkingBranch();
+ if (branch != null) {
+ for (AccessControlData acd : AccessControlManager.getInstance().getAccessControlList(branch)) {
+ // If subject is NOT an assignee, remove access control
+ if (!smaMgr.getStateMgr().getAssignees().contains(acd.getSubject())) {
+ AccessControlManager.getInstance().removeAccessControlData(acd, true);
+ }
+ }
+ // If subject doesn't have access, add it
+ for (User user : smaMgr.getStateMgr().getAssignees()) {
+ AccessControlManager.getInstance().setPermission(user, branch, PermissionEnum.FULLACCESS);
+ }
+ }
+ }
+ }
+ }
+
+ private final class AtsCommitJob extends Job {
+ private final boolean commitPopup;
+ private final boolean overrideStateValidation;
+ private final Branch destinationBranch;
+ private final boolean archiveWorkingBranch;
+
+ /**
+ * @param name
+ * @param commitPopup
+ * @param overrideStateValidation
+ */
+ public AtsCommitJob(boolean commitPopup, boolean overrideStateValidation, Branch destinationBranch, boolean archiveWorkingBranch) {
+ super("Commit Branch");
+ this.commitPopup = commitPopup;
+ this.overrideStateValidation = overrideStateValidation;
+ this.destinationBranch = destinationBranch;
+ this.archiveWorkingBranch = archiveWorkingBranch;
+ }
+
+ private boolean adminOverride;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ Branch workflowWorkingBranch = getWorkingBranch(true, false);
+ if (workflowWorkingBranch == null) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID,
+ "Commit Branch Failed: Can not locate branch for workflow " + smaMgr.getSma().getHumanReadableId());
+ }
+
+ // Confirm that all blocking reviews are completed
+ // Loop through this state's blocking reviews to confirm complete
+ for (ReviewSMArtifact reviewArt : smaMgr.getReviewManager().getReviewsFromCurrentState()) {
+ if (reviewArt.getReviewBlockType() == ReviewBlockType.Commit && !reviewArt.getSmaMgr().isCancelledOrCompleted()) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID,
+ "Blocking Review must be completed before commit.");
+ }
+ }
+
+ if (!overrideStateValidation) {
+ adminOverride = false;
+ // Check extension points for valid commit
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(smaMgr.getWorkPageDefinition().getId())) {
+ final Result tempResult = item.committing(smaMgr);
+ if (tempResult.isFalse()) {
+ // Allow Admin to override state validation
+ if (AtsPlugin.isAtsAdmin()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
+ "Override State Validation",
+ tempResult.getText() + "\n\nYou are set as Admin, OVERRIDE this?")) {
+ adminOverride = true;
+ } else {
+ adminOverride = false;
+ }
+ }
+ }, true);
+ }
+ if (!adminOverride) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, tempResult.getText());
+ }
+ }
+ }
+ }
+
+ commit(commitPopup, workflowWorkingBranch, destinationBranch, archiveWorkingBranch);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, ex.getLocalizedMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ private void commit(boolean commitPopup, Branch sourceBranch, Branch destinationBranch, boolean archiveWorkingBranch) throws OseeCoreException {
+ boolean branchCommitted = false;
+ ConflictManagerExternal conflictManager = new ConflictManagerExternal(destinationBranch, sourceBranch);
+
+ if (commitPopup) {
+ branchCommitted = CommitHandler.commitBranch(conflictManager, archiveWorkingBranch);
+ } else {
+ BranchManager.commitBranch(conflictManager, true, archiveWorkingBranch);
+ branchCommitted = true;
+ }
+ if (branchCommitted) {
+ // Create reviews as necessary
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ createNecessaryBranchEventReviews(StateEventType.CommitBranch, smaMgr, transaction);
+ transaction.execute();
+ }
+ }
+
+ public boolean isBranchInCommit() throws OseeCoreException {
+ if (!isWorkingBranchInWork()) {
+ return false;
+ }
+ return BranchManager.isBranchInCommit(getWorkingBranch());
+ }
+
+ /**
+ * @param commitPopup if true, popup errors associated with results
+ * @param overrideStateValidation if true, don't do checks to see if commit can be performed. This should only be
+ * used for developmental testing or automation
+ */
+ public void commitWorkingBranch(final boolean commitPopup, final boolean overrideStateValidation, Branch destinationBranch, boolean archiveWorkingBranch) throws OseeCoreException {
+ if (isBranchInCommit()) {
+ throw new OseeCoreException("Branch is currently being committed.");
+ }
+ Jobs.startJob(new AtsCommitJob(commitPopup, overrideStateValidation, destinationBranch, archiveWorkingBranch));
+ }
+
+ /**
+ * Since change data for a committed branch is not going to change, cache it per run instance of OSEE
+ */
+ private static final Map<TransactionId, ChangeData> changeDataCacheForCommittedBranch =
+ new HashMap<TransactionId, ChangeData>();
+
+ public ChangeData getChangeDataFromEarliestTransactionId() throws OseeCoreException {
+ return getChangeData(null);
+ }
+
+ /**
+ * Return ChangeData represented by commit to commitConfigArt or earliest commit if commitConfigArt == null
+ *
+ * @param commitConfigArt that configures commit or null
+ * @return ChangeData
+ * @throws OseeCoreException
+ */
+ public ChangeData getChangeData(ICommitConfigArtifact commitConfigArt) throws OseeCoreException {
+ if (commitConfigArt != null && commitConfigArt.getParentBranch() == null) {
+ throw new OseeArgumentException("Parent Branch not configured for " + commitConfigArt);
+ }
+ ChangeData changeData = null;
+ if (smaMgr.getBranchMgr().isWorkingBranchInWork()) {
+ changeData = ChangeManager.getChangeDataPerBranch(getWorkingBranch(), null);
+ } else if (smaMgr.getBranchMgr().isCommittedBranchExists()) {
+ TransactionId transactionId = null;
+ if (commitConfigArt == null) {
+ transactionId = getEarliestTransactionId();
+ } else {
+ for (TransactionId transId : getTransactionIds(false)) {
+ if (transId.getBranch() == commitConfigArt.getParentBranch()) {
+ transactionId = transId;
+ }
+ }
+ }
+ if (changeDataCacheForCommittedBranch.get(transactionId) == null) {
+ changeDataCacheForCommittedBranch.put(transactionId, ChangeManager.getChangeDataPerTransaction(
+ transactionId, null));
+ }
+ changeData = changeDataCacheForCommittedBranch.get(transactionId);
+ } else {
+ changeData = new ChangeData(new ArrayList<Change>());
+ }
+ return changeData;
+ }
+
+ /**
+ * @return true if working branch is In Work and changes exist
+ * @throws TransactionDoesNotExist
+ * @throws BranchDoesNotExist
+ */
+ public Boolean isWorkingBranchHaveChanges() throws OseeCoreException {
+ if (isWorkingBranchInWork()) {
+ return ChangeManager.isChangesOnWorkingBranch(getWorkingBranch());
+ }
+ return false;
+ }
+
+ /**
+ * @return the smaMgr
+ */
+ public SMAManager getSmaMgr() {
+ return smaMgr;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBulkLoad.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBulkLoad.java
new file mode 100644
index 00000000000..03d2dad19aa
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsBulkLoad.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.ats.util;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+
+/**
+ * Convenience methods to bulk load ATS objects based on currently held objects
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsBulkLoad {
+
+ public static void loadFromActions(Collection<? extends Artifact> actions) throws OseeCoreException {
+ RelationManager.getRelatedArtifacts(actions, 4, AtsRelation.SmaToTask_Task,
+ AtsRelation.ActionToWorkflow_WorkFlow, AtsRelation.TeamWorkflowToReview_Review);
+ }
+
+ public static void loadFromTeamWorkflows(Collection<? extends Artifact> teams) throws OseeCoreException {
+ RelationManager.getRelatedArtifacts(teams, 3, AtsRelation.SmaToTask_Task, AtsRelation.TeamWorkflowToReview_Team,
+ AtsRelation.ActionToWorkflow_Action);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsDeleteManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsDeleteManager.java
new file mode 100644
index 00000000000..1357712c3fb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsDeleteManager.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.ats.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSArtifact;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.HtmlDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDeleteManager {
+
+ public enum DeleteOption {
+ Prompt, Delete, Purge
+ };
+
+ public static void handleDeletePurgeAtsObject(Collection<? extends Artifact> selectedArts, DeleteOption... deleteOption) throws OseeCoreException {
+ Collection<DeleteOption> deleteOptions = Collections.getAggregate(deleteOption);
+ ArrayList<Artifact> delArts = new ArrayList<Artifact>();
+ StringBuilder artBuilder = new StringBuilder();
+
+ for (Artifact art : selectedArts) {
+ if (art instanceof ATSArtifact) {
+ delArts.add(art);
+ if (selectedArts.size() < 30) artBuilder.append(String.format("Name: %s Type: %s\n",
+ art.getHumanReadableId(), art.getArtifactTypeName()));
+ }
+ }
+ if (selectedArts.size() >= 5) {
+ artBuilder.append(" < " + selectedArts.size() + " artifacts>");
+ }
+ boolean confirmDelete = true;
+ // Prompt for delete if specified in options
+ if (deleteOptions.contains(DeleteOption.Prompt)) {
+ MessageDialogWithToggle md =
+ MessageDialogWithToggle.openOkCancelConfirm(
+ Display.getCurrent().getActiveShell(),
+ "Delete/Purge ATS Object",
+ "Prepare to Delete/Purge ATS Object\n\n" + artBuilder.toString().replaceFirst("\n$", "") + "\n\nAnd ALL it's ATS children.\n(Artifacts will be retrieved for confirmation)\nAre You Sure?",
+ "Purge", false, null, null);
+ confirmDelete = (md.getReturnCode() == 0);
+ if (md.getToggleState()) deleteOptions.add(DeleteOption.Purge);
+ }
+ if (!confirmDelete) return;
+ // Build list of related artifacts that will be deleted
+ StringBuilder delBuilder = new StringBuilder();
+ final Set<Artifact> allDeleteArts = new HashSet<Artifact>(30);
+ Map<Artifact, Object> ignoredArts = new HashMap<Artifact, Object>();
+ for (Artifact deleteArt : delArts) {
+ allDeleteArts.add(deleteArt);
+ final Set<Artifact> relatedArts = new HashSet<Artifact>(30);
+ delBuilder.append(String.format("\n<b>Selected</b>:[%s][%s][%s]", deleteArt.getArtifactTypeName(),
+ deleteArt.getHumanReadableId(), deleteArt.getDescriptiveName()) + "\n");
+ ((ATSArtifact) deleteArt).atsDelete(relatedArts, ignoredArts);
+ for (Artifact loopArt : relatedArts) {
+ if (!loopArt.equals(deleteArt)) {
+ delBuilder.append(String.format(AHTML.addSpace(4) + "<b>Related</b>:[%s][%s][%s]",
+ loopArt.getArtifactTypeName(), loopArt.getHumanReadableId(), loopArt.getDescriptiveName()) + "\n");
+ }
+ }
+ // check that if all team workflows are deleted, delete action
+ for (Artifact art : allDeleteArts) {
+ if (art instanceof StateMachineArtifact) {
+ ActionArtifact actionArt = ((StateMachineArtifact) art).getParentActionArtifact();
+ if (!allDeleteArts.contains(actionArt) && allDeleteArts.containsAll(actionArt.getTeamWorkFlowArtifacts())) {
+ relatedArts.add(actionArt);
+ delBuilder.append(String.format(AHTML.addSpace(4) + "<b>Related</b>:[%s][%s][%s]",
+ actionArt.getArtifactTypeName(), actionArt.getHumanReadableId(), actionArt.getDescriptiveName()) + "\n");
+ }
+ }
+ }
+ allDeleteArts.addAll(relatedArts);
+ }
+ boolean purge = deleteOptions.contains(DeleteOption.Purge);
+ // Get final confirmation of all seleted and related items to delete/purge
+ if (deleteOptions.contains(DeleteOption.Prompt)) {
+ String results =
+ (purge ? "Purge" : "Delete") + " ATS objects and related children, Are You Sure?\n" + delBuilder.toString();
+ results = results.replaceAll("\n", "<br>");
+ HtmlDialog dialog =
+ new HtmlDialog((purge ? "Purge" : "Delete") + " ATS objects and related children", "",
+ AHTML.simplePage(results));
+ dialog.open();
+ if (dialog.getReturnCode() != 0) return;
+ }
+ // perform the delete/purge
+ if (purge) {
+ ArtifactPersistenceManager.purgeArtifacts(allDeleteArts);
+ } else {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ ArtifactPersistenceManager.deleteArtifact(transaction, false,
+ allDeleteArts.toArray(new Artifact[allDeleteArts.size()]));
+ transaction.execute();
+ }
+ if (deleteOptions.contains(DeleteOption.Prompt)) {
+ AWorkbench.popup((purge ? "Purge" : "Delete") + " Completed", (purge ? "Purge" : "Delete") + " Completed");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsLib.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsLib.java
new file mode 100644
index 00000000000..8e4048006aa
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsLib.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.ats.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.NewAction;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowLabelProvider;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.config.AtsBulkLoadCache;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.editor.SMAEditor;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.task.TaskEditorSimpleProvider;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorSimpleProvider;
+import org.eclipse.osee.ats.world.WorldEditorUISearchItemProvider;
+import org.eclipse.osee.ats.world.search.GroupWorldSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.ats.IAtsLib;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsLib implements IAtsLib {
+
+ private static int atsDevNum;
+
+ public AtsLib() {
+ super();
+ }
+
+ public static Composite createCommonPageComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = 0;
+ composite.setLayout(layout);
+
+ return composite;
+ }
+
+ /**
+ * The development of ATS requires quite a few Actions to be created. To facilitate this, getTTNum will retrieve a
+ * persistent number from the filesystem so each action has a different name. By entering "tt" in the title, new
+ * action wizard will be prepopulated with selections and the action name will be created as "tt <number in
+ * atsNumFilename>".
+ *
+ * @return number
+ * @throws IOException
+ */
+ public static int getAtsDeveloperIncrementingNum() {
+ try {
+ File numFile = OseeData.getFile("atsDevNum.txt");
+ if (numFile.exists() && atsDevNum == 0) {
+ try {
+ atsDevNum = new Integer(AFile.readFile(numFile).replaceAll("\\s", ""));
+ } catch (NumberFormatException ex) {
+ } catch (NullPointerException ex) {
+ }
+ }
+ atsDevNum++;
+ Lib.writeStringToFile(String.valueOf(atsDevNum), numFile);
+ return atsDevNum;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return 99;
+ }
+
+ public static ToolBar createCommonToolBar(Composite parent) {
+ return createCommonToolBar(parent, null);
+ }
+
+ public static ToolBar createCommonToolBar(Composite parent, XFormToolkit toolkit) {
+ ToolBar toolBar = ALayout.createCommonToolBar(parent);
+ if (toolkit != null) toolkit.adapt(toolBar.getParent());
+ if (toolkit != null) toolkit.adapt(toolBar);
+ return toolBar;
+ }
+
+ /**
+ * @param <A>
+ * @param artifacts to iterate through
+ * @param active state to validate against; Both will return all artifacts matching type
+ * @param clazz type of artifacts to consider
+ * @return set of Artifacts of type clazz that match the given active state of the "Active" attribute value. If no
+ * attribute exists, Active == true; If does exist then attribute value "yes" == true, "no" == false.
+ */
+ @SuppressWarnings("unchecked")
+ public static <A extends Artifact> Set<A> getActiveSet(Collection<A> artifacts, Active active, Class<? extends Artifact> clazz) throws OseeCoreException {
+ Set<A> results = new HashSet<A>();
+ for (Artifact art : artifacts) {
+ if ((art.getClass().equals(clazz)) && art.isAttributeTypeValid(ATSAttributes.ACTIVE_ATTRIBUTE.getStoreName())) {
+ if (active == Active.Both)
+ results.add((A) art);
+ else {
+ // Ats config Artifact is Active unless otherwise specified
+ boolean attributeActive =
+ ((A) art).getSoleAttributeValue(ATSAttributes.ACTIVE_ATTRIBUTE.getStoreName(), false);
+ if (active == Active.Active && attributeActive) {
+ results.add((A) art);
+ } else if (active == Active.InActive && !attributeActive) {
+ results.add((A) art);
+ }
+ }
+ }
+ }
+ return results;
+ }
+
+ public boolean isAtsAdmin() {
+ return AtsPlugin.isAtsAdmin();
+ }
+
+ public static String doubleToStrString(double d) {
+ return doubleToStrString(d, false);
+ }
+
+ public static String doubleToStrString(double d, boolean blankIfZero) {
+ if (blankIfZero && d == 0)
+ return "";
+ else
+ return String.format("%4.2f", d);
+ }
+
+ public static void editActionableItems(ActionArtifact actionArt) throws OseeCoreException {
+ Result result = actionArt.editActionableItems();
+ if (result.isFalse() && result.getText().equals("")) return;
+ if (result.isFalse()) result.popup();
+ }
+
+ public static void editActionableItems(TeamWorkFlowArtifact teamArt) throws OseeCoreException {
+ Result result = teamArt.editActionableItems();
+ if (result.isFalse() && result.getText().equals("")) return;
+ if (result.isFalse() && !result.getText().equals("")) result.popup();
+ }
+
+ public static void open(String guid, OseeAts.OpenView view) {
+ (new AtsLib()).openArtifact(guid, view);
+ }
+
+ public void openArtifact(String guidOrHrid, Integer branchId, OseeAts.OpenView view) {
+ try {
+ Branch branch = BranchManager.getBranch(branchId);
+ Artifact artifact = ArtifactQuery.getArtifactFromId(guidOrHrid, branch);
+ openAtsAction(artifact, AtsOpenOption.OpenOneOrPopupSelect);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * Only to be used by browser. Use open (artifact) instead.
+ *
+ * @param guid
+ */
+ public void openArtifact(String guid, OseeAts.OpenView view) {
+ AtsBulkLoadCache.run(false);
+ Artifact artifact = null;
+ try {
+ artifact = ArtifactQuery.getArtifactFromId(guid, AtsPlugin.getAtsBranch());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return;
+ }
+
+ if (view == OseeAts.OpenView.ActionEditor) {
+ if ((artifact instanceof StateMachineArtifact) || (artifact instanceof ActionArtifact))
+ openATSAction(artifact, AtsOpenOption.OpenOneOrPopupSelect);
+ else
+ ArtifactEditor.editArtifact(artifact);
+ } else if (view == OseeAts.OpenView.ArtifactEditor) {
+ ArtifactEditor.editArtifact(artifact);
+ } else if (view == OseeAts.OpenView.ArtifactHyperViewer) {
+ AWorkbench.popup("ERROR", "Unimplemented");
+ }
+ }
+
+ public static void createAtsAction(String initialDescription, String actionableItem) {
+ (new AtsLib()).createATSAction(initialDescription, actionableItem);
+ }
+
+ public void createATSAction(String initialDescription, String actionableItemName) {
+ // Ensure actionable item is configured for ATS before continuing
+ try {
+ AtsCache.getSoleArtifactByName(actionableItemName, VersionArtifact.class);
+ } catch (ArtifactDoesNotExist ex) {
+ AWorkbench.popup(
+ "Configuration Error",
+ "Actionable Item \"" + actionableItemName + "\" is not configured for ATS tracking.\n\nAction can not be created.");
+ return;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return;
+ }
+
+ NewAction newAction = new NewAction(actionableItemName);
+ newAction.setInitialDescription(initialDescription);
+ newAction.run();
+ }
+
+ public static void openAtsAction(final Artifact art, final AtsOpenOption option) {
+ (new AtsLib()).openATSAction(art, option);
+ }
+
+ public void openATSAction(final Artifact art, final AtsOpenOption option) {
+ try {
+ if (art instanceof ActionArtifact) {
+ final ActionArtifact actionArt = (ActionArtifact) art;
+ Collection<TeamWorkFlowArtifact> teams = actionArt.getTeamWorkFlowArtifacts();
+ if (option == AtsOpenOption.OpenAll)
+ for (TeamWorkFlowArtifact team : teams)
+ SMAEditor.editArtifact(team);
+ else if (option == AtsOpenOption.AtsWorld)
+ WorldEditor.open(new WorldEditorSimpleProvider("Action " + actionArt.getHumanReadableId(),
+ Arrays.asList(actionArt)));
+ else if (option == AtsOpenOption.OpenOneOrPopupSelect) {
+ if (teams.size() == 1)
+ SMAEditor.editArtifact(teams.iterator().next());
+ else {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ TeamWorkFlowArtifact teamArt = promptSelectTeamWorkflow(actionArt);
+ if (teamArt != null)
+ SMAEditor.editArtifact((Artifact) teamArt);
+ else
+ return;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ }
+ } else
+ SMAEditor.editArtifact(art);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public static TeamWorkFlowArtifact promptSelectTeamWorkflow(ActionArtifact actArt) throws OseeCoreException {
+ ListDialog ld = new ListDialog(Display.getCurrent().getActiveShell());
+ ld.setContentProvider(new ArrayContentProvider());
+ ld.setLabelProvider(new TeamWorkflowLabelProvider());
+ ld.setTitle("Select Team Workflow");
+ ld.setMessage("Select Team Workflow");
+ ld.setInput(actArt.getTeamWorkFlowArtifacts());
+ if (ld.open() == 0) {
+ if (ld.getResult().length == 0)
+ AWorkbench.popup("Error", "No Workflow Selected");
+ else
+ return (TeamWorkFlowArtifact) ld.getResult()[0];
+ }
+ return null;
+ }
+
+ @Override
+ public void openInAtsWorldEditor(String name, Collection<Artifact> artifacts) throws OseeCoreException {
+ Set<Artifact> otherArts = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+ if (art.getArtifactTypeName().equals(UniversalGroup.ARTIFACT_TYPE_NAME)) {
+ WorldEditor.open(new WorldEditorUISearchItemProvider(new GroupWorldSearchItem(art), null,
+ TableLoadOption.None));
+ } else
+ otherArts.add(art);
+ }
+ if (otherArts.size() > 0) WorldEditor.open(new WorldEditorSimpleProvider(name, otherArts));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IAtsLib#openInAtsTaskEditor(java.lang.String, java.util.Collection)
+ */
+ @Override
+ public void openInAtsTaskEditor(String name, Collection<Artifact> artifacts) throws OseeCoreException {
+ TaskEditor.open(new TaskEditorSimpleProvider(name, artifacts));
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsNotifyUsers.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsNotifyUsers.java
new file mode 100644
index 00000000000..82ffe5a2827
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsNotifyUsers.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.ats.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationEvent;
+import org.eclipse.osee.framework.ui.skynet.notify.OseeNotificationManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsNotifyUsers {
+
+ private static boolean testing = false; // Email goes to current user (set OseeNotifyUsersJob.testing also)
+ public static enum NotifyType {
+ Subscribed, Cancelled, Completed, Assigned, Originator, Reviewed
+ };
+
+ public static void notify(StateMachineArtifact sma, NotifyType... notifyTypes) throws OseeCoreException {
+ notify(sma, null, notifyTypes);
+ }
+
+ public static void notify(StateMachineArtifact sma, Collection<User> notifyUsers, NotifyType... notifyTypes) throws OseeCoreException {
+ if (testing) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE,
+ "AtsNotifyUsers: testing is enabled....turn off for production.");
+ }
+ if (!testing && (!AtsPlugin.isEmailEnabled() || !AtsPlugin.isProductionDb() || sma.getDescriptiveName().startsWith(
+ "tt "))) {
+ return;
+ }
+ List<NotifyType> types = Collections.getAggregate(notifyTypes);
+
+ SMAManager smaMgr = sma.getSmaMgr();
+ if (types.contains(NotifyType.Originator)) {
+ User originator = smaMgr.getOriginator();
+ if (testing) {
+ originator = UserManager.getUser();
+ }
+ if (!UserManager.getUser().equals(originator)) OseeNotificationManager.addNotificationEvent(new OseeNotificationEvent(
+ Arrays.asList(originator),
+ getIdString(sma),
+ NotifyType.Originator.name(),
+ "You have been set as the originator of \"" + sma.getArtifactTypeName() + "\" titled \"" + sma.getDescriptiveName() + "\""));
+ }
+ if (types.contains(NotifyType.Assigned)) {
+ Collection<User> assignees = notifyUsers != null ? notifyUsers : smaMgr.getStateMgr().getAssignees();
+ assignees.remove(UserManager.getUser());
+ if (testing) {
+ assignees.clear();
+ assignees.add(UserManager.getUser());
+ }
+ if (testing || assignees.size() > 0) {
+ OseeNotificationManager.addNotificationEvent(new OseeNotificationEvent(
+ assignees,
+ getIdString(sma),
+ NotifyType.Assigned.name(),
+ "You have been set as an assignee for \"" + sma.getArtifactTypeName() + "\" titled \"" + sma.getDescriptiveName() + "\""));
+ }
+ }
+ if (types.contains(NotifyType.Subscribed)) {
+ Collection<User> subscribed = sma.getSubscribed();
+ if (testing) {
+ subscribed.clear();
+ subscribed.add(UserManager.getUser());
+ }
+ if (subscribed.size() > 0) {
+ OseeNotificationManager.addNotificationEvent(new OseeNotificationEvent(
+ subscribed,
+ getIdString(sma),
+ NotifyType.Subscribed.name(),
+ sma.getArtifactTypeName() + " titled \"" + sma.getDescriptiveName() + "\" transitioned to \"" + sma.getSmaMgr().getStateMgr().getCurrentStateName() + "\" and you subscribed for notification."));
+ }
+ }
+ if (types.contains(NotifyType.Cancelled) || types.contains(NotifyType.Completed)) {
+ if (((sma instanceof TeamWorkFlowArtifact) || (sma instanceof ReviewSMArtifact)) && (smaMgr.isCompleted() || smaMgr.isCancelled())) {
+ User originator = smaMgr.getOriginator();
+ if (testing) {
+ originator = UserManager.getUser();
+ }
+ if (!UserManager.getUser().equals(originator)) {
+ if (smaMgr.isCompleted()) {
+ OseeNotificationManager.addNotificationEvent(new OseeNotificationEvent(
+ Arrays.asList(originator),
+ getIdString(sma),
+ NotifyType.Completed.name(),
+ "\"" + sma.getArtifactTypeName() + "\" titled \"" + sma.getDescriptiveName() + "\" is Completed"));
+ }
+ if (smaMgr.isCancelled()) {
+ LogItem cancelledItem = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ OseeNotificationManager.addNotificationEvent(new OseeNotificationEvent(
+ Arrays.asList(originator),
+ getIdString(sma),
+ NotifyType.Cancelled.name(),
+ String.format(
+ sma.getArtifactTypeName() + " titled \"" + sma.getDescriptiveName() + "\" was cancelled from the \"%s\" state on \"%s\".<br>Reason: \"%s\"",
+ cancelledItem.getState(), cancelledItem.getDate(XDate.MMDDYYHHMM), cancelledItem.getMsg())));
+ }
+ }
+ }
+ }
+ if (types.contains(NotifyType.Reviewed)) {
+ if (sma instanceof ReviewSMArtifact) {
+ if (((ReviewSMArtifact) sma).getUserRoleManager() != null) {
+ Collection<User> authorModerator =
+ ((ReviewSMArtifact) sma).getUserRoleManager().getRoleUsersAuthorModerator();
+ if (testing) {
+ authorModerator.clear();
+ authorModerator.add(UserManager.getUser());
+ }
+ for (UserRole role : ((ReviewSMArtifact) sma).getUserRoleManager().getRoleUsersReviewComplete()) {
+ OseeNotificationManager.addNotificationEvent(new OseeNotificationEvent(
+ authorModerator,
+ getIdString(sma),
+ NotifyType.Reviewed.name(),
+ "\"" + sma.getArtifactTypeName() + "\" titled \"" + sma.getDescriptiveName() + "\" has been Reviewed by " + role.getUser().getName()));
+ }
+ }
+ }
+ }
+ }
+
+ private static String getIdString(StateMachineArtifact sma) {
+ try {
+ String legacyPcrId = sma.getWorldViewLegacyPCR();
+ if (!legacyPcrId.equals("")) {
+ return "HRID: " + sma.getHumanReadableId() + " / LegacyId: " + legacyPcrId;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return "HRID: " + sma.getHumanReadableId();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPreSaveCacheRemoteEventHandler.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPreSaveCacheRemoteEventHandler.java
new file mode 100644
index 00000000000..de9e6038802
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPreSaveCacheRemoteEventHandler.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.ats.util;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+
+/**
+ * This class handles updating ATS state machine artifacts based on remote events that change the assignees. Without
+ * this, the client will think it changed the assignees if the artifact is saved after the remote modified event.
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsPreSaveCacheRemoteEventHandler implements IFrameworkTransactionEventListener {
+
+ private static AtsPreSaveCacheRemoteEventHandler instance = new AtsPreSaveCacheRemoteEventHandler();
+
+ public static AtsPreSaveCacheRemoteEventHandler getInstance() {
+ return instance;
+ }
+
+ private AtsPreSaveCacheRemoteEventHandler() {
+ OseeLog.log(AtsPlugin.class, Level.INFO, "Starting ATS Pre-Save Remote Event Handler");
+ OseeEventManager.addListener(this);
+ }
+
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ for (Artifact artifact : transData.cacheChangedArtifacts) {
+ if (artifact instanceof StateMachineArtifact) {
+ ((StateMachineArtifact) artifact).initalizePreSaveCache();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPriority.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPriority.java
new file mode 100644
index 00000000000..2365a068202
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsPriority.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.ats.util;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsPriority {
+
+ public static String PRIORITY_HELP_CONTEXT_ID = "atsPriority";
+
+ public static enum PriorityType {
+ None(""), Priority_1("1"), Priority_2("2"), Priority_3("3"), Priority_4("4"), Priority_5("5");
+
+ private final String shortName;
+
+ private PriorityType(String shortName) {
+ this.shortName = shortName;
+ }
+
+ public String getShortName() {
+ return shortName;
+ }
+
+ public static String[] getPriorities() {
+ String priorities[] = new String[PriorityType.values().length];
+ int x = 0;
+ for (PriorityType pri : PriorityType.values())
+ priorities[x++] = pri.toString();
+ return priorities;
+ }
+
+ public static String[] getPrioritiesWithoutNone() {
+ String priorities[] = new String[PriorityType.values().length - 1];
+ int x = 0;
+ for (PriorityType pri : PriorityType.values())
+ if (pri != PriorityType.None) priorities[x++] = pri.toString();
+ return priorities;
+ }
+
+ @Override
+ public String toString() {
+ return shortName;
+ }
+
+ public static PriorityType getPriority(String type) throws OseeCoreException {
+ if (type == null || type.equals("")) return PriorityType.None;
+ for (PriorityType pri : PriorityType.values()) {
+ if (type.equals(pri.getShortName())) return pri;
+ }
+ throw new OseeStateException("Invalid priority => " + type);
+ }
+
+ };
+
+ public static void openHelp() {
+ AtsPlugin.getInstance().displayHelp(PRIORITY_HELP_CONTEXT_ID);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsRelation.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsRelation.java
new file mode 100644
index 00000000000..5c3a52fafcf
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/AtsRelation.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.ats.util;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum AtsRelation implements IRelationEnumeration {
+
+ // ATS Relations
+ ActionToWorkflow_Action(true, "ActionToWorkflow"),
+ ActionToWorkflow_WorkFlow(false, "ActionToWorkflow"),
+ //
+ TeamActionableItem_Team(true, "TeamActionableItem"),
+ TeamActionableItem_ActionableItem(false, "TeamActionableItem"),
+ //
+ TeamLead_Team(true, "TeamLead"),
+ TeamLead_Lead(false, "TeamLead"),
+ //
+ TeamMember_Team(true, "TeamMember"),
+ TeamMember_Member(false, "TeamMember"),
+ //
+ ParallelVersion_Parent(true, "ParallelVersion"),
+ ParallelVersion_Child(false, "ParallelVersion"),
+ //
+ PrivilegedMember_Team(true, "PrivilegedMember"),
+ PrivilegedMember_Member(false, "PrivilegedMember"),
+ //
+ SmaToTask_Sma(true, "SmaToTask"),
+ SmaToTask_Task(false, "SmaToTask"),
+ //
+ TeamWorkflowTargetedForVersion_Workflow(true, "TeamWorkflowTargetedForVersion"),
+ TeamWorkflowTargetedForVersion_Version(false, "TeamWorkflowTargetedForVersion"),
+ //
+ TeamDefinitionToVersion_TeamDefinition(true, "TeamDefinitionToVersion"),
+ TeamDefinitionToVersion_Version(false, "TeamDefinitionToVersion"),
+ //
+ TeamDefinitionToWorkflowDiagram_TeamDefinition(true, "TeamDefinitionToWorkflowDiagram"),
+ TeamDefinitionToWorkflowDiagram_WorkflowDiagram(false, "TeamDefinitionToWorkflowDiagram"),
+ //
+ TeamDefinitionToTaskWorkflowDiagram_TeamDefinition(true, "TeamDefinitionToTaskWorkflowDiagram"),
+ TeamDefinitionToTaskWorkflowDiagram_WorkflowDiagram(false, "TeamDefinitionToTaskWorkflowDiagram"),
+ //
+ TeamDefinitionToDecisionReviewWorkflowDiagram_TeamDefinition(true, "TeamDefinitionToDecisionReviewWorkflowDiagram"),
+ TeamDefinitionToDecisionReviewWorkflowDiagram_WorkflowDiagram(false, "TeamDefinitionToDecisionReviewWorkflowDiagram"),
+ //
+ TeamDefinitionToPeerToPeerReviewWorkflowDiagram_TeamDefinition(true, "TeamDefinitionToPeerToPeerReviewWorkflowDiagram"),
+ TeamDefinitionToPeerToPeerReviewWorkflowDiagram_WorkflowDiagram(false, "TeamDefinitionToPeerToPeerReviewWorkflowDiagram"),
+ //
+ TeamWorkflowToReview_Team(true, "TeamWorkflowToReview"),
+ TeamWorkflowToReview_Review(false, "TeamWorkflowToReview"),
+ //
+ Supercedes_Supercedes(true, "Supercedes"),
+ Supercedes_Superceded(false, "Supercedes"),
+ AddressesIssues_AddressesIssues(true, "Addresses Issues"),
+ AddressesIssues_IssuedArtifact(false, "Addresses Issues"),
+ SupportingInfo_SupportedBy(true, "Supporting Info"),
+ SupportingInfo_SupportingInfo(false, "Supporting Info"),
+ //
+ WorkItem__Parent(true, "Work Item"),
+ WorkItem__Child(false, "Work Item"),
+ //
+ Dependency__Dependency(false, "Dependency"),
+ Dependency__Artifact(true, "Dependency"),
+ SubscribedUser_Artifact(true, "SubscribedUser"),
+ SubscribedUser_User(false, "SubscribedUser"),
+ FavoriteUser_Artifact(true, "FavoriteUser"),
+ FavoriteUser_User(false, "FavoriteUser");
+
+ private final RelationSide relationSide;
+ private String typeName;
+
+ private AtsRelation(boolean sideA, String typeName) {
+ this.relationSide = sideA ? RelationSide.SIDE_A : RelationSide.SIDE_B;
+ this.typeName = typeName;
+ }
+
+ /**
+ * @return Returns the sideName.
+ */
+ @Deprecated
+ public boolean isSideA() {
+ return relationSide.isSideA();
+ }
+
+ public String getSideName() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return getRelationType().getSideName(relationSide);
+ }
+
+ /**
+ * @return Returns the typeName.
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public RelationType getRelationType() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return RelationTypeManager.getType(typeName);
+ }
+
+ public boolean isThisType(RelationLink link) {
+ return link.getRelationType().getTypeName().equals(typeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSide()
+ */
+ @Override
+ public RelationSide getSide() {
+ return relationSide;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DeadlineManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DeadlineManager.java
new file mode 100644
index 00000000000..d3012b968e7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DeadlineManager.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.ats.util;
+
+import java.util.Date;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DeadlineManager {
+
+ private final SMAManager smaMgr;
+
+ public DeadlineManager(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ public Date getDeadlineDate() {
+ try {
+ return ((IWorldViewArtifact) smaMgr.getSma()).getWorldViewDeadlineDate();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ public boolean isDeadlineDateSet() {
+ return getDeadlineDate() != null;
+ }
+
+ public Result isDeadlineDateOverdue() throws OseeCoreException {
+ if (smaMgr.isCompleted() || smaMgr.isCancelled()) return Result.FalseResult;
+ if ((new Date()).after(getDeadlineDate())) return new Result(true, "Deadline Date has past.");
+ return Result.FalseResult;
+ }
+
+ public Result isDeadlinePastRelease() {
+ try {
+ if (smaMgr.isCompleted() || smaMgr.isCancelled()) return Result.FalseResult;
+ Date deadDate = getDeadlineDate();
+ if (deadDate == null) return Result.FalseResult;
+ Date releaseDate = smaMgr.getSma().getWorldViewEstimatedReleaseDate();
+ if (releaseDate == null) return Result.FalseResult;
+ if (releaseDate.after(deadDate)) return new Result(true, "Deadline Date is past current Release Date.");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return Result.FalseResult;
+ }
+
+ public Result isDeadlineDateAlerting() throws OseeCoreException {
+ if (!isDeadlineDateSet()) return Result.FalseResult;
+ Result r = isDeadlineDateOverdue();
+ if (r.isTrue()) return r;
+ r = isDeadlinePastRelease();
+ if (r.isTrue()) return r;
+ return Result.FalseResult;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DoesNotWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DoesNotWorkItem.java
new file mode 100644
index 00000000000..d51dce90cae
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/DoesNotWorkItem.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DoesNotWorkItem extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ */
+ public DoesNotWorkItem(XNavigateItem parent) {
+ super(parent, "Does Not Work - ??", FrameworkImage.ADMIN);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) return;
+
+ // for (Artifact art : ArtifactQuery.getArtifactsFromAttributeType("ats.Branch Id", AtsPlugin.getAtsBranch())) {
+ // int branchId = art.getSoleAttributeValue("ats.Branch Id");
+ // Branch branch = null;
+ // try {
+ // branch = BranchManager.getBranch(branchId);
+ // } catch (BranchDoesNotExist ex) {
+ // System.out.println("Branch does not exist for art " + art.getHumanReadableId() + " - " + art);
+ // } catch (Exception ex) {
+ // System.err.println("Exception getting branch for art " + art.getHumanReadableId() + " - " + art);
+ // }
+ // if (branch != null) {
+ // System.err.println("Branch DOES exist for art " + art.getHumanReadableId() + " - " + art);
+ // }
+ // }
+
+ // SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // transaction.execute();
+
+ // convertAtsLogUserIds(transaction);
+ // deleteUnAssignedUserRelations();
+ // relateDonDunne();
+
+ // testDeleteAttribute();
+ // deleteNullUserAttributes();
+ // XNavigateItem item = AtsNavigateViewItems.getInstance().getSearchNavigateItems().get(1);
+ // System.out.println("Item " + item.getName());
+ // NavigateView.getNavigateView().handleDoubleClick(item);
+
+ // XResultData.runExample();
+
+ // fixOseePeerReviews();
+
+ AWorkbench.popup("Completed", "Complete");
+ }
+
+ private void purgeHrids() throws OseeCoreException {
+ String[] hrids = AFile.readFile("O:\\hrids_to_delete.txt").split("\r\n");
+ int x = 0;
+ for (String hrid : hrids) {
+ hrid = hrid.replaceAll(" ", "");
+ System.out.println("Processing " + x++ + " of " + hrids.length);
+ try {
+ Artifact art = null;
+ // Handle case where duplicate hrids
+ try {
+ art = ArtifactQuery.getArtifactFromId(hrid, AtsPlugin.getAtsBranch());
+ } catch (MultipleArtifactsExist ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ continue;
+ }
+ Set<Artifact> artsToDelete = new HashSet<Artifact>();
+ if (art instanceof TeamWorkFlowArtifact) {
+ art = ((TeamWorkFlowArtifact) art).getParentActionArtifact();
+ }
+ if (art instanceof ActionArtifact) {
+ artsToDelete.add(art);
+ artsToDelete.addAll(((ActionArtifact) art).getTeamWorkFlowArtifacts());
+ }
+ if (artsToDelete.size() > 0) {
+ System.out.println("Sleeping 5 sec...");
+ Thread.sleep(5000);
+ System.out.println("Purging " + artsToDelete.size() + " artifacts...");
+ ArtifactPersistenceManager.purgeArtifacts(artsToDelete);
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ System.out.println("Artifact with hrid does not exist: " + hrid);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+
+ }
+
+ private void convertAtsLogUserIds(SkynetTransaction transaction) throws OseeCoreException {
+ List<String> hrids =
+ Arrays.asList("NKYBF", "J1Z48", "ZY4W5", "U9H58", "9713S", "83XVW", "59B9X", "TQD1J", "UVM7U", "HZT73",
+ "C49Q5", "RHCPY", "MBCXV", "YJFKC", "2F461", "AGW15", "K6ZGD", "9W45V", "GG43L", "G2VTQ", "CVWFC",
+ "EXMT0", "W1TS8", "JM3RD", "7Q0W3", "P9DKR", "BR2RN", "Z6B0Z", "6KT6U", "HPQJX", "QN2K3", "W0VTD",
+ "LDJMH", "6PWYH", "T8B4K", "YTNLC", "9557A", "SQQ6T", "D82X9", "2P5GC", "YK58N", "LWVT1", "KCGSQ",
+ "5X2WL", "C8HWW");
+ for (Artifact art : ArtifactQuery.getArtifactsFromIds(hrids, AtsPlugin.getAtsBranch())) {
+ String str = art.getSoleAttributeValue(ATSAttributes.LOG_ATTRIBUTE.getStoreName(), null);
+ str = str.replaceAll("rj236c", "1779483");
+ art.setSoleAttributeFromString(ATSAttributes.LOG_ATTRIBUTE.getStoreName(), str);
+ art.persistAttributes(transaction);
+ }
+ }
+
+ private void fixTestTaskResolutions() throws OseeCoreException {
+ System.out.println("Started fixTestTaskResolutions...");
+ for (Artifact artifact : ArtifactQuery.getArtifactsFromAttributeType(
+ ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), AtsPlugin.getAtsBranch())) {
+ if (artifact instanceof TaskArtifact) {
+ TaskArtifact taskArt = (TaskArtifact) artifact;
+ String resolution =
+ ((TaskArtifact) artifact).getSoleAttributeValue(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(),
+ null);
+ if (resolution == null) {
+ System.err.println("Unexpected null resolution." + taskArt.getHumanReadableId());
+ // taskArt.deleteSoleAttribute(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ // taskArt.persistAttributes();
+ } else {
+ String newResolution = null;
+ if (resolution.equals("Need_DTE_Test")) {
+ System.out.println("Rename Need_DTE_Test to In_DTE_Test " + taskArt.getHumanReadableId());
+ newResolution = "In_DTE_Test";
+ } else if (resolution.equals("Awaiting_Code_Fix")) {
+ System.out.println("Rename Awaiting_Code_Fix to Awaiting_Code " + taskArt.getHumanReadableId());
+ newResolution = "Awaiting_Code";
+ } else if (resolution.equals("Awaiting_Review")) {
+ System.out.println("Rename Awaiting_Review to In_DTE_Test " + taskArt.getHumanReadableId());
+ newResolution = "In_DTE_Test";
+ } else if (resolution.equals("Unit_Tested")) {
+ System.out.println("Rename Unit_Tested to In_DTE_Test " + taskArt.getHumanReadableId());
+ newResolution = "In_DTE_Test";
+ }
+ if (newResolution != null) {
+ taskArt.setSoleAttributeFromString(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), newResolution);
+ taskArt.persistAttributes();
+ }
+ }
+ }
+ }
+ System.out.println("Completed fixTestTaskResolutions...");
+ }
+
+ // private void deleteUnAssignedUserRelations() throws OseeCoreException {
+ // AbstractSkynetTxTemplate newActionTx = new AbstractSkynetTxTemplate(AtsPlugin.getAtsBranch()) {
+ //
+ // @Override
+ // protected void handleTxWork() throws OseeCoreException {
+ // User unassignedUser = SkynetAuthentication.getUser(UserEnum.UnAssigned);
+ // for (Artifact art : unassignedUser.getRelatedArtifacts(CoreRelationEnumeration.Users_Artifact)) {
+ // if (art instanceof StateMachineArtifact) {
+ // unassignedUser.deleteRelation(CoreRelationEnumeration.Users_Artifact, art);
+ // }
+ // }
+ // unassignedUser.persistRelations();
+ // }
+ // };
+ // newActionTx.execute();
+ // }
+
+ private final boolean fixIt = false;
+
+ // public void cleanXViewerCustomizations() throws OseeCoreException {
+ // for (User user : SkynetAuthentication.getUsers()) {
+ // System.out.println("User: " + user);
+ //
+ // SkynetUserArtifactCustomizeDefaults custDefaults = new SkynetUserArtifactCustomizeDefaults(user);
+ //
+ // // Get all customizations
+ // List<String> customizations = user.getAttributesToStringList("XViewer Customization");
+ // if (customizations.size() == 0 && custDefaults.size() == 0) continue;
+ // Set<String> validGuids = new HashSet<String>();
+ // int currNumDefaults = custDefaults.getGuids().size();
+ // for (String custStr : new CopyOnWriteArrayList<String>(customizations)) {
+ // CustomizeData custData = new CustomizeData(custStr);
+ // validGuids.add(custData.getGuid());
+ //
+ // // check for old customizations to remove
+ // boolean orderFound = custStr.contains("<order>");
+ // boolean namespaceNullFound = custStr.contains("namespace=\"null\"");
+ // if (orderFound || namespaceNullFound) {
+ // System.err.println("Removing " + (orderFound ? "<order>" : "namespace==null") + " customizations " + custData.getGuid());
+ // validGuids.remove(custData.getGuid());
+ // custDefaults.removeDefaultCustomization(custData);
+ // customizations.remove(custStr);
+ // } else {
+ // // Check for sort columns that are hidden
+ // for (String columnName : custData.getSortingData().getSortingNames()) {
+ // XViewerColumn xCol = custData.getColumnData().getXColumn(columnName);
+ // if (xCol == null) {
+ // System.err.println("sort column not found \"" + columnName + "\" - " + custData.getGuid());
+ // } else if (xCol.isShow() == false) {
+ // System.err.println("sort col is hidden \"" + columnName + "\" - " + custData.getGuid());
+ // }
+ // }
+ // }
+ // }
+ // if (validGuids.size() != custDefaults.getGuids().size()) {
+ // System.err.println("Update default customizations : " + user + " - " + currNumDefaults + " valid: " + validGuids.size());
+ // custDefaults.setGuids(validGuids);
+ // }
+ // if (fixIt) {
+ // custDefaults.save();
+ // user.setAttributeValues("XViewer Customization", customizations);
+ // user.persistAttributes();
+ // }
+ // }
+ // }
+
+ public Result isCustomizationSortErrored(String custDataStr, CustomizeData custData) {
+
+ return Result.TrueResult;
+ }
+
+ // String xViewerDefaults = user.getSoleAttributeValueAsString("XViewer Defaults", null);
+ // // Get all current default guids
+ // Set<String> currentDefaultGuids = new HashSet<String>();
+ // if (xViewerDefaults != null) {
+ // for (String guid : AXml.getTagDataArray(xViewerDefaults, XVIEWER_DEFAULTS_TAG)) {
+ // if (guid != null && !guid.equals("")) {
+ // currentDefaultGuids.add(guid);
+ // }
+ // }
+ // }
+ // private void relateDonDunne()throws OseeCoreException{
+ // AbstractSkynetTxTemplate newActionTx = new AbstractSkynetTxTemplate(AtsPlugin.getAtsBranch()) {
+ //
+ // @Override
+ // protected void handleTxWork()throws OseeCoreException{
+ // for (Artifact art : ArtifactQuery.getArtifactsFromAttribute(
+ // ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(),
+ // "%<" + SkynetAuthentication.getUser().getUserId() + ">%", AtsPlugin.getAtsBranch())) {
+ // if ((art instanceof StateMachineArtifact) && ((StateMachineArtifact) art).getSmaMgr().getStateMgr().getAssignees().contains(
+ // SkynetAuthentication.getUser())) {
+ // art.addRelation(CoreRelationEnumeration.Users_User, SkynetAuthentication.getUser());
+ // }
+ // }
+ // SkynetAuthentication.getUser().persistRelations();
+ // }
+ // };
+ // newActionTx.execute();
+ //
+ // }
+
+ // private void testDeleteAttribute() throws OseeCoreException {
+ // Artifact art =
+ // ArtifactQuery.getArtifactsFromIds(Arrays.asList("76589"), AtsPlugin.getAtsBranch()).iterator().next();
+ // for (Attribute<?> attr : art.getAttributes()) {
+ // if (attr.getValue() == null) {
+ // System.out.println(art.getHumanReadableId() + " - " + attr.getNameValueDescription());
+ // attr.delete();
+ // }
+ // }
+ // art.persistAttributes();
+ // }
+
+ // private void deleteNullAttributes() throws OseeCoreException {
+ //
+ // AbstractSkynetTxTemplate newActionTx = new AbstractSkynetTxTemplate(AtsPlugin.getAtsBranch()) {
+ //
+ // @Override
+ // protected void handleTxWork() throws OseeCoreException {
+ // int x = 0;
+ // for (String artTypeName : Arrays.asList(TeamWorkFlowArtifact.ARTIFACT_NAME, TaskArtifact.ARTIFACT_NAME,
+ // DecisionReviewArtifact.ARTIFACT_NAME, PeerToPeerReviewArtifact.ARTIFACT_NAME,
+ // "Lba V13 Code Team Workflow", "Lba V13 Test Team Workflow", "Lba V13 Req Team Workflow",
+ // "Lba V13 SW Design Team Workflow", "Lba V13 Tech Approach Team Workflow",
+ // "Lba V11 REU Code Team Workflow", "Lba V11 REU Test Team Workflow", "Lba V11 REU Req Team Workflow",
+ // "Lba B3 Code Team Workflow", "Lba B3 Test Team Workflow", "Lba B3 Req Team Workflow",
+ // "Lba B3 SW Design Team Workflow", "Lba B3 Tech Approach Team Workflow")) {
+ // for (Artifact team : ArtifactQuery.getArtifactsFromType(artTypeName, AtsPlugin.getAtsBranch())) {
+ // for (Attribute<?> attr : team.getAttributes(false)) {
+ // if (attr.getValue() == null) {
+ // System.out.println(team.getHumanReadableId() + " - " + attr.getNameValueDescription());
+ // attr.delete();
+ // x++;
+ // }
+ // }
+ // if (team.isDirty()) team.persistAttributes();
+ // }
+ // }
+ // System.out.println("Deleted " + x);
+ // }
+ // };
+ // newActionTx.execute();
+ //
+ // }
+ //
+ // private void deleteNullUserAttributes() throws OseeCoreException {
+ //
+ // AbstractSkynetTxTemplate newActionTx = new AbstractSkynetTxTemplate(AtsPlugin.getAtsBranch()) {
+ //
+ // @Override
+ // protected void handleTxWork() throws OseeCoreException {
+ // int x = 0;
+ // for (String artTypeName : Arrays.asList(User.ARTIFACT_NAME)) {
+ // for (Artifact team : ArtifactQuery.getArtifactsFromType(artTypeName, AtsPlugin.getAtsBranch())) {
+ // for (Attribute<?> attr : team.getAttributes(false)) {
+ // if (attr.getValue() == null) {
+ // System.out.println(team.getHumanReadableId() + " - " + attr.getNameValueDescription());
+ // attr.delete();
+ // x++;
+ // }
+ // }
+ // if (team.isDirty()) team.persistAttributes();
+ // }
+ // }
+ // System.out.println("Deleted " + x);
+ // }
+ // };
+ // newActionTx.execute();
+ //
+ // }
+
+ // for (String artTypeName : Arrays.asList(TeamWorkFlowArtifact.ARTIFACT_NAME, TaskArtifact.ARTIFACT_NAME,
+ // DecisionReviewArtifact.ARTIFACT_NAME, PeerToPeerReviewArtifact.ARTIFACT_NAME,
+ // "Lba V13 Code Team Workflow", "Lba V13 Test Team Workflow", "Lba V13 Req Team Workflow",
+ // "Lba V13 SW Design Team Workflow", "Lba V13 Tech Approach Team Workflow",
+ // "Lba V11 REU Code Team Workflow", "Lba V11 REU Test Team Workflow", "Lba V11 REU Req Team Workflow",
+ // "Lba B3 Code Team Workflow", "Lba B3 Test Team Workflow", "Lba B3 Req Team Workflow",
+ // "Lba B3 SW Design Team Workflow", "Lba B3 Tech Approach Team Workflow")) {
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Favorites.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Favorites.java
new file mode 100644
index 00000000000..6cba530a8ad
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Favorites.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.ats.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.IFavoriteableArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Favorites {
+
+ private final Collection<StateMachineArtifact> smas;
+
+ public Favorites(StateMachineArtifact sma) {
+ this(Arrays.asList(sma));
+ }
+
+ public Favorites(Collection<StateMachineArtifact> smas) {
+ super();
+ this.smas = smas;
+ }
+
+ public void toggleFavorite() {
+ toggleFavorite(true);
+ }
+
+ public void toggleFavorite(boolean prompt) {
+ try {
+ if (((IFavoriteableArtifact) smas.iterator().next()).amIFavorite()) {
+ boolean result = true;
+ if (prompt) result =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Remove Favorite", "Are You sure you wish to remove this as Favorite?");
+ if (result) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (StateMachineArtifact sma : smas) {
+ ((IFavoriteableArtifact) sma).removeFavorite(UserManager.getUser(), transaction);
+ }
+ transaction.execute();
+ }
+ } else {
+ boolean result = true;
+ if (prompt) result =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Favorite", "Are you sure you wish add this as a Favorite?");
+ if (result) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (StateMachineArtifact sma : smas) {
+ ((IFavoriteableArtifact) sma).addFavorite(UserManager.getUser(), transaction);
+ }
+ transaction.execute();
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportPage.java
new file mode 100644
index 00000000000..59ed1b1cc0c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportPage.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util.Import;
+
+import java.io.File;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.world.WorldEditor;
+import org.eclipse.osee.ats.world.WorldEditorSimpleProvider;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.FileSelector;
+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;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionImportPage extends WizardDataTransferPage {
+
+ private IResource currentResourceSelection;
+ private FileSelector fileSelector;
+ private Label actionLabel;
+ private Button emailPocs;
+
+ /**
+ * @param pageName
+ * @param selection
+ */
+ public ActionImportPage(String pageName, IStructuredSelection selection) {
+ super(pageName);
+ setTitle("Import Actions into ATS");
+ setDescription("Import Actions into ATS");
+
+ if (selection != null && selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ currentResourceSelection = (IResource) ((IAdaptable) firstElement).getAdapter(IResource.class);
+ }
+ }
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ createSourceGroup(composite);
+
+ createOptionsGroup(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ @Override
+ protected void createOptionsGroup(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Options");
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+ composite.setLayout(new GridLayout(2, false));
+
+ emailPocs = new Button(composite, SWT.CHECK);
+ emailPocs.setText("Email POCs?");
+ emailPocs.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ emailPocs.addListener(SWT.Modify, this);
+
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ comp.setLayout(new GridLayout());
+ actionLabel = new Label(comp, SWT.NONE);
+ actionLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+ updateWidgetEnablements();
+ }
+
+ private void createSourceGroup(Composite parent) {
+ fileSelector = new FileSelector(parent, SWT.NONE, "Import Source (Excel saved as .xml", this);
+
+ if (currentResourceSelection != null) fileSelector.setText(currentResourceSelection.getLocation().toString());
+ setPageComplete(determinePageCompletion());
+ } /*
+ * @see WizardPage#becomesVisible
+ */
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ return fileSelector.validate(this);
+ }
+
+ public boolean finish() {
+ final File file = fileSelector.getFile();
+ try {
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ ExcelAtsActionArtifactExtractor extractor = new ExcelAtsActionArtifactExtractor(emailPocs.getSelection());
+ extractor.discoverArtifactAndRelationData(file, AtsPlugin.getAtsBranch());
+ if (extractor.dataIsValid()) extractor.createArtifactsAndNotify(transaction);
+ WorldEditor.open(new WorldEditorSimpleProvider("Imported Action Artifacts", extractor.getActionArts()));
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportWizard.java
new file mode 100644
index 00000000000..c43ad37a13c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ActionImportWizard.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.ats.util.Import;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionImportWizard extends Wizard implements IImportWizard {
+ private ActionImportPage mainPage;
+ private IStructuredSelection selection;
+
+ public ActionImportWizard() {
+ super();
+ setDialogSettings(AtsPlugin.getInstance().getDialogSettings());
+ setWindowTitle("Action Import Wizard");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ return mainPage.finish();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ public void addPages() {
+ mainPage = new ActionImportPage("Import Actions into OSEE ATS", selection);
+ addPage(mainPage);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsActionArtifactExtractor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsActionArtifactExtractor.java
new file mode 100644
index 00000000000..dd7e8b3fe19
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsActionArtifactExtractor.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.ActionManager;
+import org.eclipse.osee.ats.util.AtsNotifyUsers;
+import org.eclipse.osee.ats.util.AtsPriority;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.Import.AbstractArtifactExtractor;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ExcelAtsActionArtifactExtractor extends AbstractArtifactExtractor implements RowProcessor {
+ private ExcelSaxHandler excelHandler;
+ private String[] headerRow;
+ private int rowNum = 0;
+ private final boolean emailPOCs;
+ private enum Columns {
+ Title, Description, ActionableItems, Assignees, Priority, ChangeType, UserCommunity, Version
+ };
+
+ public String getDescription() {
+ return "Extract each row as an Action";
+ }
+ private final Set<ActionData> actionDatas = new HashSet<ActionData>();
+ private final Set<ActionArtifact> actionArts = new HashSet<ActionArtifact>();
+
+ public ExcelAtsActionArtifactExtractor(boolean emailPOCs) {
+ this.emailPOCs = emailPOCs;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] headerRow) {
+ this.headerRow = headerRow.clone();
+ }
+
+ private class ActionData {
+ public String title = "";
+ public String desc = "";
+ public String priorityStr = "";
+ public Set<String> userComms = new HashSet<String>();
+ public String changeType = "";
+ public Set<String> assigneeStrs = new HashSet<String>();
+ public Set<User> assignees = new HashSet<User>();
+ public Set<String> actionableItems = new HashSet<String>();
+ public String version = "";
+ }
+
+ /**
+ * import Artifacts
+ *
+ * @param cols
+ */
+ public void processRow(String[] cols) {
+
+ rowNum++;
+ System.out.println("Processing Row " + rowNum);
+
+ boolean fullRow = false;
+ for (int i = 0; i < cols.length; i++)
+ if (cols[i] != null && !cols[i].equals("")) {
+ fullRow = true;
+ break;
+ }
+ if (!fullRow) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Empty Row Found => " + rowNum + " skipping...");
+ return;
+ }
+
+ System.out.println("Reading rows...");
+ ActionData aData = new ActionData();
+ for (int i = 0; i < cols.length; i++) {
+ if (headerRow[i] == null) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Null header column => " + i);
+ } else if (headerRow[i].equalsIgnoreCase(Columns.Title.name())) {
+ if (cols[i].equals("")) return;
+ aData.title = cols[i];
+ } else if (headerRow[i].equalsIgnoreCase(Columns.Priority.name())) {
+ aData.priorityStr = cols[i];
+ } else if (headerRow[i].equalsIgnoreCase(Columns.Version.name())) {
+ aData.version = (cols[i] == null ? "" : cols[i]);
+ } else if (headerRow[i].equalsIgnoreCase(Columns.ChangeType.name())) {
+ aData.changeType = cols[i];
+ } else if (headerRow[i].equalsIgnoreCase(Columns.Description.name())) {
+ aData.desc = (cols[i] == null ? "" : cols[i]);
+ } else if (headerRow[i].equalsIgnoreCase(Columns.UserCommunity.name())) {
+ for (String str : cols[i].split(";")) {
+ if (!str.equals("")) aData.userComms.add(str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase(Columns.ActionableItems.name())) {
+ for (String str : cols[i].split(";")) {
+ if (!str.equals("")) aData.actionableItems.add(str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase(Columns.Assignees.name())) {
+ if (cols[i] != null) for (String str : cols[i].split(";")) {
+ if (!str.equals("")) aData.assigneeStrs.add(str);
+ }
+ } else {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Unhandled column => " + headerRow[i]);
+ }
+ }
+ actionDatas.add(aData);
+ }
+
+ public boolean dataIsValid() throws OseeCoreException {
+ System.out.println("Validating...");
+ XResultData rd = new XResultData();
+ int rowNum = 1; // Header is row 1
+ for (ActionData aData : actionDatas) {
+ rowNum++;
+ if (aData.title.equals("")) rd.logError("Row " + rowNum + "; Invalid Title");
+ if (aData.actionableItems.size() == 0)
+ rd.logError("Row " + rowNum + ": Must have at least one ActionableItem defined");
+ else {
+ for (String actionableItemName : aData.actionableItems) {
+ try {
+ if (AtsCache.getArtifactsByName(actionableItemName, ActionableItemArtifact.class).size() > 0) {
+ rd.logError("Row " + rowNum + ": Couldn't find actionable item for \"" + actionableItemName + "\"");
+ }
+ } catch (Exception ex) {
+ rd.logError("Row " + rowNum + " - " + ex.getLocalizedMessage());
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ if (!aData.version.equals("")) {
+ try {
+ if (AtsCache.getSoleArtifactByName(aData.version, VersionArtifact.class) == null) {
+ rd.logError("Row " + rowNum + ": Can't find single version \"" + aData.version + "\"");
+ }
+ } catch (Exception ex) {
+ rd.logError("Row " + rowNum + " - " + ex.getLocalizedMessage());
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ // If no assignees, ATS will auto-assign to correct person
+ // Else if assignees, confirm that they are valid
+ if (aData.assigneeStrs.size() > 0) {
+ for (String assignee : aData.assigneeStrs) {
+ User user = UserManager.getUserByName(assignee);
+ if (user == null)
+ rd.logError("Row " + rowNum + ": Couldn't retrieve user \"" + assignee + "\"");
+ else
+ aData.assignees.add(user);
+ }
+ }
+ }
+ if (!rd.toString().equals("")) {
+ rd.report("Ats Action Import Errors");
+ return false;
+ }
+ return true;
+ }
+
+ public void createArtifactsAndNotify(SkynetTransaction transaction) {
+ AtsPlugin.setEmailEnabled(false);
+ System.out.println("Creating...");
+ Set<TeamWorkFlowArtifact> teamWfs = new HashSet<TeamWorkFlowArtifact>();
+ try {
+ for (ActionData aData : actionDatas) {
+ ActionArtifact actionArt =
+ ActionManager.createAction(null, aData.title, aData.desc, ChangeType.getChangeType(aData.changeType),
+ AtsPriority.PriorityType.getPriority(aData.priorityStr), aData.userComms, false, null,
+ ActionableItemArtifact.getActionableItems(aData.actionableItems), transaction);
+ actionArts.add(actionArt);
+ if (!aData.version.equals("")) {
+ VersionArtifact verArt = AtsCache.getSoleArtifactByName(aData.version, VersionArtifact.class);
+
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts())
+ verArt.addRelation(AtsRelation.TeamWorkflowTargetedForVersion_Workflow, team);
+ }
+ if (aData.assigneeStrs.size() > 0) {
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ team.getSmaMgr().getStateMgr().setAssignees(aData.assignees);
+ }
+ }
+ for (TeamWorkFlowArtifact team : actionArt.getTeamWorkFlowArtifacts()) {
+ team.persistAttributesAndRelations(transaction);
+ }
+ teamWfs.addAll(actionArt.getTeamWorkFlowArtifacts());
+ }
+ AtsPlugin.setEmailEnabled(true);
+ if (emailPOCs) {
+ for (TeamWorkFlowArtifact team : teamWfs) {
+ AtsNotifyUsers.notify(team, AtsNotifyUsers.NotifyType.Assigned);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ } finally {
+ AtsPlugin.setEmailEnabled(true);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.ArtifactExtractor#discoverArtifactAndRelationData(java.io.File)
+ */
+ public void discoverArtifactAndRelationData(File artifactsFile, Branch branch) throws OseeCoreException {
+ try {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ excelHandler = new ExcelSaxHandler(this, true);
+ xmlReader.setContentHandler(excelHandler);
+ xmlReader.parse(new InputSource(new InputStreamReader(new FileInputStream(artifactsFile), "UTF-8")));
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processEmptyRow()
+ */
+ public void processEmptyRow() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#detectedTotalRowCount(int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ }
+
+ /**
+ * @return the actionArts
+ */
+ public Set<ActionArtifact> getActionArts() {
+ return actionArts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ public FileFilter getFileFilter() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "Excel Ats Actions";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsTaskArtifactExtractor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsTaskArtifactExtractor.java
new file mode 100644
index 00000000000..1ed54ad813b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/ExcelAtsTaskArtifactExtractor.java
@@ -0,0 +1,311 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.util.AtsNotifyUsers;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.Import.AbstractArtifactExtractor;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ExcelAtsTaskArtifactExtractor extends AbstractArtifactExtractor implements RowProcessor {
+ private ExcelSaxHandler excelHandler;
+ private String[] headerRow;
+ private final StateMachineArtifact sma;
+ private IProgressMonitor monitor;
+ private int rowNum;
+ private final boolean emailPOCs;
+ private final SMAManager smaMgr;
+ private final SkynetTransaction transaction;
+
+ public String getDescription() {
+ return "Extract each row as a task";
+ }
+
+ public ExcelAtsTaskArtifactExtractor(TeamWorkFlowArtifact artifact, boolean emailPOCs, SkynetTransaction transaction) {
+ this.emailPOCs = emailPOCs;
+ this.transaction = transaction;
+ if (!(artifact instanceof StateMachineArtifact)) {
+ throw new IllegalArgumentException("Artifact must be StateMachineArtifact");
+ }
+
+ sma = artifact;
+ smaMgr = new SMAManager(sma);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] headerRow) {
+ this.headerRow = headerRow.clone();
+ }
+
+ /**
+ * import Artifacts
+ *
+ * @param row
+ */
+ public void processRow(String[] row) {
+ try {
+ rowNum++;
+ monitor.setTaskName("Processing Row " + rowNum);
+ TaskArtifact taskArt = smaMgr.getTaskMgr().createNewTask("");
+
+ monitor.subTask("Validating...");
+ boolean fullRow = false;
+ for (int i = 0; i < row.length; i++)
+ if (row[i] != null && !row[i].equals("")) {
+ fullRow = true;
+ break;
+ }
+ if (!fullRow) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Empty Row Found => " + rowNum + " skipping...");
+ return;
+ }
+ AtsPlugin.setEmailEnabled(false);
+ for (int i = 0; i < row.length; i++) {
+ if (headerRow[i] == null) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Null header column => " + i);
+ } else if (headerRow[i].equalsIgnoreCase("Originator")) {
+ String userName = row[i];
+ User u = null;
+ if (userName == null || userName.equals(""))
+ u = UserManager.getUser();
+ else
+ u = UserManager.getUserByName(userName);
+ if (u == null) OseeLog.log(AtsPlugin.class, Level.SEVERE, String.format(
+ "Invalid Originator \"%s\" for row %d\nSetting to current user.", userName, rowNum));
+ taskArt.getSmaMgr().getLog().setOriginator(u);
+ } else if (headerRow[i].equalsIgnoreCase("Assignees")) {
+ Set<User> assignees = new HashSet<User>();
+ for (String userName : row[i].split(";")) {
+ userName = userName.replaceAll("^\\s+", "");
+ userName = userName.replaceAll("\\+$", "");
+ User user = null;
+ if (userName == null || userName.equals(""))
+ user = UserManager.getUser();
+ else {
+ try {
+ user = UserManager.getUserByName(userName);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ if (user == null) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, String.format(
+ "Invalid Assignee \"%s\" for row %d. Using current user.", userName, rowNum));
+ user = UserManager.getUser();
+ }
+ assignees.add(user);
+ }
+ taskArt.getSmaMgr().getStateMgr().setAssignees(assignees);
+ } else if (headerRow[i].equalsIgnoreCase("Resolution")) {
+ String str = row[i];
+ if (str != null && !str.equals("")) {
+ taskArt.setSoleAttributeValue(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName(), str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Description")) {
+ String str = row[i];
+ if (str != null && !str.equals("")) {
+ taskArt.setSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Related to State")) {
+ String str = row[i];
+ if (str != null && !str.equals("")) {
+ taskArt.setSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Notes")) {
+ String str = row[i];
+ if (str != null && !str.equals("")) {
+ taskArt.setSoleAttributeValue(ATSAttributes.SMA_NOTE_ATTRIBUTE.getStoreName(), str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Title")) {
+ String str = row[i];
+ if (str != null && !str.equals("")) {
+ if (monitor != null) {
+ monitor.subTask(String.format("Title \"%s\"", str));
+ }
+ taskArt.setDescriptiveName(str);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Percent Complete")) {
+ String str = row[i];
+ Double percent;
+ if (str != null && !str.equals("")) {
+ try {
+ percent = new Double(str);
+ if (percent < 1) percent = percent * 100;
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(String.format("Invalid Percent Complete \"%s\" for row %d",
+ str, rowNum));
+ }
+ int percentInt = percent.intValue();
+ smaMgr.getStateMgr().updateMetrics(0, percentInt, true);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Hours Spent")) {
+ String str = row[i];
+ double hours = 0;
+ if (str != null && !str.equals("")) {
+ try {
+ hours = new Double(str);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(String.format("Invalid Hours Spent \"%s\" for row %d", str,
+ rowNum));
+ }
+ smaMgr.getStateMgr().updateMetrics(hours, smaMgr.getStateMgr().getPercentComplete(), true);
+ }
+ } else if (headerRow[i].equalsIgnoreCase("Estimated Hours")) {
+ String str = row[i];
+ double hours = 0;
+ if (str != null && !str.equals("")) {
+ try {
+ hours = new Double(str);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(String.format("Invalid Estimated Hours \"%s\" for row %d", str,
+ rowNum));
+ }
+ taskArt.setSoleAttributeValue(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(), hours);
+ }
+ } else {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Unhandled column => " + headerRow[i]);
+ }
+ }
+ AtsPlugin.setEmailEnabled(true);
+ if (taskArt.isCompleted()) {
+ taskArt.transitionToCompleted(0, transaction, TransitionOption.None);
+ }
+ // always persist
+ taskArt.persistAttributesAndRelations(transaction);
+ if (emailPOCs && !taskArt.isCompleted() && !taskArt.isCancelled()) {
+ AtsNotifyUsers.notify(sma, AtsNotifyUsers.NotifyType.Assigned);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.ArtifactExtractor#discoverArtifactAndRelationData(java.io.File)
+ */
+ public void discoverArtifactAndRelationData(File artifactsFile, Branch branch) throws OseeCoreException {
+ try {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ excelHandler = new ExcelSaxHandler(this, true);
+ xmlReader.setContentHandler(excelHandler);
+ xmlReader.parse(new InputSource(new InputStreamReader(new FileInputStream(artifactsFile), "UTF-8")));
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processEmptyRow()
+ */
+ public void processEmptyRow() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#detectedTotalRowCount(int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ }
+
+ public IProgressMonitor getMonitor() {
+ return monitor;
+ }
+
+ public void setMonitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ public FileFilter getFileFilter() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "Excel Ats Tasks";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/TaskImportJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/TaskImportJob.java
new file mode 100644
index 00000000000..f3108c906af
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Import/TaskImportJob.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.ats.util.Import;
+
+import java.io.File;
+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.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskImportJob extends Job {
+ private final File file;
+ private ExcelAtsTaskArtifactExtractor atsTaskExtractor;
+
+ public TaskImportJob(File file, ExcelAtsTaskArtifactExtractor atsTaskExtractor) {
+ super("Importing Tasks");
+ this.file = file;
+ this.atsTaskExtractor = atsTaskExtractor;
+ }
+
+ public IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ try {
+ atsTaskExtractor.setMonitor(monitor);
+ monitor.beginTask("Importing Tasks", 0);
+ if (file != null && file.isFile()) {
+ atsTaskExtractor.discoverArtifactAndRelationData(file, AtsPlugin.getAtsBranch());
+ } else {
+ throw new OseeArgumentException("All files passed must be a file");
+ }
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ toReturn = new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/LegacyPCRActions.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/LegacyPCRActions.java
new file mode 100644
index 00000000000..ed0b6926c87
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/LegacyPCRActions.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.ats.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.world.search.LegacyPCRActionsWorldSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class LegacyPCRActions {
+
+ public static Collection<TeamWorkFlowArtifact> getTeamsTeamWorkflowArtifacts(TeamDefinitionArtifact teamDef) throws OseeCoreException {
+ return getTeamsTeamWorkflowArtifacts(Arrays.asList(teamDef));
+ }
+
+ public static Collection<TeamWorkFlowArtifact> getTeamsTeamWorkflowArtifacts(Collection<TeamDefinitionArtifact> teamDefs) throws OseeCoreException {
+ LegacyPCRActionsWorldSearchItem search = new LegacyPCRActionsWorldSearchItem(teamDefs, false);
+ Set<TeamWorkFlowArtifact> teamArts = new HashSet<TeamWorkFlowArtifact>();
+ for (Artifact art : search.performSearchGetResults()) {
+ if (art instanceof TeamWorkFlowArtifact) {
+ teamArts.add((TeamWorkFlowArtifact) art);
+ }
+ }
+ return teamArts;
+ }
+
+ public static Collection<TeamWorkFlowArtifact> getTeamsTeamWorkflowArtifacts(String pcrId, Collection<TeamDefinitionArtifact> teamDefs) throws OseeCoreException {
+ return getTeamsTeamWorkflowArtifacts(Arrays.asList(pcrId), teamDefs);
+ }
+
+ public static Collection<TeamWorkFlowArtifact> getTeamsTeamWorkflowArtifacts(String pcrId) throws OseeCoreException {
+ return getTeamsTeamWorkflowArtifacts(Arrays.asList(pcrId), (Collection<TeamDefinitionArtifact>) null);
+ }
+
+ public static Collection<TeamWorkFlowArtifact> getTeamsTeamWorkflowArtifacts(Collection<String> pcrIds, TeamDefinitionArtifact teamDef) throws OseeCoreException {
+ return getTeamsTeamWorkflowArtifacts(pcrIds, teamDef != null ? Arrays.asList(teamDef) : null);
+ }
+
+ public static Collection<TeamWorkFlowArtifact> getTeamsTeamWorkflowArtifacts(Collection<String> pcrIds, Collection<TeamDefinitionArtifact> teamDefs) throws OseeCoreException {
+ LegacyPCRActionsWorldSearchItem search = new LegacyPCRActionsWorldSearchItem(pcrIds, teamDefs, false);
+ Set<TeamWorkFlowArtifact> teamArts = new HashSet<TeamWorkFlowArtifact>();
+ for (Artifact art : search.performSearchGetResults()) {
+ if (art instanceof TeamWorkFlowArtifact) {
+ teamArts.add((TeamWorkFlowArtifact) art);
+ }
+ }
+ return teamArts;
+ }
+
+ public static Collection<ActionArtifact> getTeamsActionArtifacts(TeamDefinitionArtifact teamDef) throws OseeCoreException {
+ return getTeamsActionArtifacts(Arrays.asList(teamDef));
+ }
+
+ public static Collection<ActionArtifact> getTeamsActionArtifacts(Collection<TeamDefinitionArtifact> teamDefs) throws OseeCoreException {
+ LegacyPCRActionsWorldSearchItem search = new LegacyPCRActionsWorldSearchItem(teamDefs, true);
+ Set<ActionArtifact> actArts = new HashSet<ActionArtifact>();
+ for (Artifact art : search.performSearchGetResults()) {
+ if (art instanceof ActionArtifact) {
+ actArts.add((ActionArtifact) art);
+ }
+ }
+ return actArts;
+ }
+
+ public static Collection<ActionArtifact> getTeamsActionArtifacts(String pcrId, Collection<TeamDefinitionArtifact> teamDefs) throws OseeCoreException {
+ return getTeamsActionArtifacts(Arrays.asList(pcrId), teamDefs);
+ }
+
+ public static Collection<ActionArtifact> getTeamsActionArtifacts(Collection<String> pcrIds, Collection<TeamDefinitionArtifact> teamDefs) throws OseeCoreException {
+ LegacyPCRActionsWorldSearchItem search = new LegacyPCRActionsWorldSearchItem(pcrIds, teamDefs, true);
+ Set<ActionArtifact> actArts = new HashSet<ActionArtifact>();
+ for (Artifact art : search.performSearchGetResults()) {
+ actArts.add((ActionArtifact) art);
+ }
+ return actArts;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/OpenInAtsLoopbackCmd.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/OpenInAtsLoopbackCmd.java
new file mode 100644
index 00000000000..caae3c3ca72
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/OpenInAtsLoopbackCmd.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.ats.util;
+
+import java.net.HttpURLConnection;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.httpRequests.BaseArtifactLoopbackCmd;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenInAtsLoopbackCmd extends BaseArtifactLoopbackCmd {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.httpRequests.BaseArtifactLoopbackCmd#isApplicable(java.lang.String)
+ */
+ @Override
+ public boolean isApplicable(String cmd) {
+ return cmd != null && cmd.equalsIgnoreCase("open.ats");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.httpRequests.BaseArtifactLoopbackCmd#process(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.util.Map, org.eclipse.osee.framework.core.client.server.HttpResponse)
+ */
+ @Override
+ public void process(final Artifact artifact, final Map<String, String> parameters, final HttpResponse httpResponse) {
+ if (artifact != null) {
+ try {
+ boolean hasPermissionToRead = false;
+ try {
+ hasPermissionToRead = AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ if (!hasPermissionToRead) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_UNAUTHORIZED, String.format(
+ "Access denied - User does not have read access to [%s]", artifact));
+ } else {
+ final MutableBoolean isDone = new MutableBoolean(false);
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ AtsLib.openAtsAction(artifact, AtsOpenOption.OpenOneOrPopupSelect);
+ String html =
+ AHTML.simplePage("Action [" + artifact.getDescriptiveName() + "]has been opened in OSEE ATS<br><br>" + "<form><input type=button onClick='window.opener=self;window.close()' value='Close'></form>");
+ httpResponse.getPrintStream().println(html);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_INTERNAL_ERROR, String.format(
+ "Unable to open: [%s]", artifact.getDescriptiveName()), ex);
+ } finally {
+ isDone.setValue(true);
+ }
+ }
+ });
+ int count = 1;
+ while (!isDone.getValue() && count < 30) {
+ try {
+ Thread.sleep(350);
+ } catch (InterruptedException ex) {
+ }
+ count++;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_INTERNAL_ERROR, String.format(
+ "Unable to open: [%s]", artifact.getDescriptiveName()), ex);
+ }
+ } else {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_BAD_REQUEST, "Unable to open null artifact");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Overview.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Overview.java
new file mode 100644
index 00000000000..283c98ed45a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Overview.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.ats.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.SMAState;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AHTML.CellItem;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultBrowserHyperCmd;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+public class Overview {
+
+ public final static String normalColor = "#EEEEEE";
+ private final static String activeColor = "#9CCCFF";
+ public final static String errorColor = "#FFD6AC";
+ public final static String subscribedColor = "#FFCCAA";
+ public final static String labelColor = "darkcyan";
+ public static enum PreviewStyle {
+ NONE, MAP, TASKS, NOTES, LOG, HYPEROPEN, NO_SUBSCRIBE_OR_FAVORITE;
+
+ public static boolean contains(PreviewStyle[] styles, PreviewStyle style) {
+ for (PreviewStyle st : styles)
+ if (st.equals(style)) return true;
+ return false;
+ }
+ };
+ private StringBuilder html;
+ public final static String labelFont = "<font color=\"darkcyan\" face=\"Arial\" size=\"-1\">";
+ public final static int TABLE_WIDTH = 95;
+ public boolean showTasks = false;
+
+ public Overview() {
+ clearHtml();
+ }
+
+ public void clearHtml() {
+ html = new StringBuilder(1000);
+ }
+
+ /**
+ * @return HTML page for browser display
+ */
+ public String getPage() {
+ return "<html><body>\n" + html + "\n</body></html>";
+ }
+
+ /**
+ * Return label with value converted to show html reserved characters
+ *
+ * @param label
+ * @param value
+ * @return string to embed into html
+ */
+ public String getLabelValue(String label, String value) {
+ String valueStr = AHTML.textToHtml(value);
+ return getLabel(label) + valueStr;
+ }
+
+ /**
+ * Return label and value WITHOUT conversion to handle html reserved characters. Value will be as-is
+ *
+ * @param label
+ * @param value
+ * @return string to embed into html
+ */
+ public String getLabelValueNoConvert(String label, String value) {
+ return getLabel(label) + value;
+ }
+
+ public static String getLabel(String label) {
+ return AHTML.getLabelStr(labelFont, label + ": ");
+ }
+
+ public void addTable(String str) {
+ addTable(new String[] {str});
+ }
+
+ public void addTable(String str, String str2) {
+ addTable(new String[] {str, str2});
+ }
+
+ public void addTable(String str, String str2, String str3) {
+ addTable(new String[] {str, str2, str3});
+ }
+
+ public void addTable(String[] strs) {
+ addTable(strs, 100);
+ }
+
+ public void addHtml(String html) {
+ this.html.append(html);
+ }
+
+ public void addTable(String[] strs, int width) {
+ if (strs.length == 1) {
+ this.html.append(AHTML.simpleTable(strs[0]));
+ } else {
+ this.html.append(AHTML.multiColumnTable(strs, width));
+ }
+ }
+
+ public void addHeader(StateMachineArtifact sma, PreviewStyle... styles) throws OseeCoreException {
+ SMAManager smaMgr = new SMAManager(sma);
+ startBorderTable(100, false, "");
+ addTable(getLabelValue("Title", sma.getDescriptiveName()));
+ this.html.append(AHTML.multiColumnTable(new String[] {
+ AHTML.getLabelStr(labelFont, "State: ") + smaMgr.getStateMgr().getCurrentStateName(),
+ AHTML.getLabelStr(labelFont, "Type: ") + sma.getArtifactTypeName(),
+ AHTML.getLabelStr(labelFont, "Id: ") + sma.getHumanReadableId()}));
+ addTable(getLabelValue("Originator", smaMgr.getOriginator().getDescriptiveName()), getLabelValue("Creation Date",
+ XDate.getDateStr(smaMgr.getLog().getCreationDate(), XDate.MMDDYYHHMM)));
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact)
+ addTable(getLabelValue("Team", ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamName()), getLabelValue(
+ "Assignees", Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees())));
+ else
+ addTable(getLabelValue("Assignees", Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees())));
+ addTable(getLabelValue("Description", smaMgr.getSma().getDescription()));
+ if (smaMgr.isCancelled()) {
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ addTable(getLabelValue("Cancelled From", item.getState()));
+ addTable(getLabelValue("Cancellation Reason", item.getMsg()));
+ }
+ if (sma instanceof TaskArtifact) {
+ StateMachineArtifact parentArt = ((TaskArtifact) sma).getParentSMA();
+ if (parentArt != null) {
+ this.html.append(AHTML.multiColumnTable(new String[] {AHTML.getLabelStr(labelFont, "Parent Workflow: ") + parentArt.getDescriptiveName()}));
+ this.html.append(AHTML.multiColumnTable(new String[] {AHTML.getLabelStr(labelFont, "Parent State: ") + ((TaskArtifact) sma).getSmaMgr().getStateMgr().getCurrentStateName()}));
+ }
+ SMAManager taskSmaMgr = new SMAManager(sma);
+ this.html.append(AHTML.multiColumnTable(new String[] {AHTML.getLabelStr(labelFont, "Task Owner: ") + Artifacts.toString(
+ "; ", taskSmaMgr.getStateMgr().getAssignees())}));
+ }
+ endBorderTable();
+ }
+
+ public void addFooter(StateMachineArtifact sma, PreviewStyle... styles) {
+ this.html.append(AHTML.newline());
+
+ if (PreviewStyle.contains(styles, PreviewStyle.HYPEROPEN)) {
+ this.html.append("Start OSEE, select the ATS perspective and search by the Id shown.");
+ }
+ }
+
+ public void addRelationsBlock(ATSArtifact artifact) {
+ addRelationTable("Is Superceded By", AtsRelation.Supercedes_Supercedes, artifact);
+ addRelationTable("Supercedes", AtsRelation.Supercedes_Superceded, artifact);
+ addRelationTable("Issues Addressed By", AtsRelation.AddressesIssues_AddressesIssues, artifact);
+ addRelationTable("Addresses Issues In", AtsRelation.AddressesIssues_IssuedArtifact, artifact);
+ addRelationTable("Supports", AtsRelation.SupportingInfo_SupportedBy, artifact);
+ addRelationTable("Is Supported By", AtsRelation.SupportingInfo_SupportingInfo, artifact);
+ }
+
+ public void addNotes(StateMachineArtifact artifact, String state) {
+ if (artifact instanceof StateMachineArtifact) {
+ String notesHtml = (artifact).getSmaMgr().getNotes().getTable(state);
+ if (notesHtml.equals("")) return;
+ this.html.append(notesHtml);
+ }
+ }
+
+ public void addNotes(Artifact artifact) {
+ if (artifact instanceof StateMachineArtifact) {
+ String notesHtml = ((StateMachineArtifact) artifact).getSmaMgr().getNotes().getTable(null);
+ if (notesHtml.equals("")) return;
+ this.html.append(notesHtml);
+ }
+ }
+
+ public static String getGenericArtifactTable(String name, Collection<Artifact> arts) {
+ return getGenericArtifactTable(name, arts, 100);
+ }
+
+ public static String getGenericArtifactTable(String name, Collection<Artifact> arts, int width) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(AHTML.addSpace(1) + Overview.getLabel(name));
+ if (arts.size() > 0) {
+ builder.append("<TABLE BORDER=\"1\" align=\"center\" cellspacing=\"1\" cellpadding=\"3%\" width=\"" + width + "%\"><THEAD><TR><TH>Type</TH>" + "<TH>Name</TH></THEAD></TR>");
+ for (Artifact art : arts) {
+ builder.append("<TR>");
+ builder.append("<TD>" + art.getArtifactTypeName() + "</TD>");
+ builder.append("<TD>" + Overview.getOpenHyperlinkHtml(art) + "</TD>");
+ builder.append("</TR>");
+ }
+ builder.append("</TABLE>");
+ }
+ return builder.toString();
+ }
+
+ public void addRelationTable(String name, AtsRelation side, Artifact parent) {
+ try {
+ List<Artifact> arts = parent.getRelatedArtifacts(side);
+ if (arts.size() == 0) return;
+ startBorderTable(false, name);
+ html.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "Name", "Rationale"}));
+ for (Artifact art : arts) {
+ String rationale = "";
+ RelationLink link = parent.getRelations(side, art).iterator().next();
+ if (!link.getRationale().equals("")) rationale = link.getRationale();
+ String hyperStr = Overview.getOpenHyperlinkHtml(art);
+ html.append(AHTML.addRowMultiColumnTable(new String[] {art.getArtifactTypeName(), hyperStr, rationale}));
+ }
+ endBorderTable();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void addTeams(Collection<TeamWorkFlowArtifact> teams) throws OseeCoreException {
+ startBorderTable(TABLE_WIDTH, false, "Team Workflows");
+ String s = AHTML.beginMultiColumnTable(100, 1);
+ s += AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "State"}, new Integer[] {70, 150});
+ ArrayList<CellItem> cells = new ArrayList<CellItem>();
+ for (TeamWorkFlowArtifact team : teams) {
+ cells.add(new AHTML.CellItem(team.getHyperlinkHtml()));
+ cells.add(new AHTML.CellItem(team.getSmaMgr().getStateMgr().getCurrentStateName()));
+ s += AHTML.addRowMultiColumnTable(cells);
+ cells.clear();
+ }
+ s += AHTML.endMultiColumnTable();
+ html.append(s);
+
+ endBorderTable();
+ }
+
+ public static String getOpenHyperlinkHtml(Artifact art) {
+ return getOpenHyperlinkHtml(art.getDescriptiveName(), art);
+ }
+
+ public static String getOpenHyperlinkHtml(String name, String hrid) {
+ return AHTML.getHyperlink(XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openAction, hrid), name);
+ }
+
+ public static String getOpenArtEditHyperlinkHtml(String name, String hrid) {
+ return AHTML.getHyperlink(XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openArtifactEditor, hrid),
+ name);
+ }
+
+ public static String getOpenHyperlinkHtml(String name, String guidOrHrid, int branchId) {
+ return XResultData.getHyperlink(name, guidOrHrid, branchId);
+ }
+
+ public static String getOpenHyperlinkHtml(String name, Artifact art) {
+ return AHTML.getHyperlink(
+ XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openAction, art.getGuid()), name);
+ }
+
+ public void addLog(StateMachineArtifact artifact) throws OseeCoreException {
+ ATSLog artifactLog = artifact.getSmaMgr().getLog();
+ if (artifactLog != null && artifactLog.getLogItems().size() > 0) addTable(artifact.getSmaMgr().getLog().getTable());
+ }
+
+ public void startStateBorderTable(SMAManager smaMgr, SMAState state) throws OseeCoreException {
+ String caption = state.getName();
+ String assgn = Artifacts.toString("; ", state.getAssignees());
+ startStateBorderTable(smaMgr.getStateMgr().getCurrentStateName().equals(state.getName()), caption, assgn);
+ }
+
+ public void startStateBorderTable(boolean active, String name, String assignee) {
+ if (assignee != null && !assignee.equals(""))
+ startBorderTable(active, String.format("%s (%s)", name, assignee));
+ else
+ startBorderTable(active, String.format("%s", name));
+ }
+
+ public void startBorderTable(boolean active, String caption) {
+ this.html.append(AHTML.startBorderTable(TABLE_WIDTH, (active) ? activeColor : normalColor, caption));
+ }
+
+ public void startBorderTable(int width, boolean active, String caption) {
+ this.html.append(AHTML.startBorderTable(width, (active) ? activeColor : normalColor, caption));
+ }
+
+ public void startBorderTable(int width, String caption, String backgroundColor) {
+ this.html.append(AHTML.startBorderTable(width, backgroundColor, caption));
+ }
+
+ public void endBorderTable() {
+ this.html.append(AHTML.endBorderTable());
+ }
+
+ public boolean isShowTasks() {
+ return showTasks;
+ }
+
+ public void setShowTasks(boolean showTasks) {
+ this.showTasks = showTasks;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java
new file mode 100644
index 00000000000..30b8227dc36
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/SMAMetrics.java
@@ -0,0 +1,573 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util;
+
+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 org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SMAMetrics {
+
+ private static int MILLISECS_PER_DAY = (1000 * 60 * 60 * 24);
+
+ double estHours = 0;
+ double hrsRemainFromEstimates = 0;
+ double hrsSpent = 0;
+ double manDaysNeeded = 0;
+ double cummulativeWorkflowPercentComplete = 0;
+ double percentCompleteByWorkflowPercents = 0;
+ double percentCompleteByNumWorkflow = 0;
+
+ Date estimatedReleaseDate;
+ long daysTillRel = 0;
+ VersionArtifact versionArtifact = null;
+ String str = "";
+ Set<TeamWorkFlowArtifact> teamArts = new HashSet<TeamWorkFlowArtifact>();
+ Set<ActionArtifact> actionArts = new HashSet<ActionArtifact>();
+ Set<TaskArtifact> taskArts = new HashSet<TaskArtifact>();
+ Set<ReviewSMArtifact> reviewArts = new HashSet<ReviewSMArtifact>();
+ Set<StateMachineArtifact> smas = new HashSet<StateMachineArtifact>();
+ Set<User> assignees = new HashSet<User>();
+ Set<User> assigneesAssignedOrCompleted = new HashSet<User>();
+ Set<StateMachineArtifact> smasInherited = new HashSet<StateMachineArtifact>();
+
+ private final HashCollection<User, Artifact> userToAssignedSmas =
+ new HashCollection<User, Artifact>(true, HashSet.class, 100);
+ private final HashCollection<User, Artifact> userToCompletedSmas =
+ new HashCollection<User, Artifact>(true, HashSet.class, 100);
+ private final double manHoursPerDay;
+
+ public SMAMetrics(Collection<? extends Artifact> artifacts, VersionArtifact versionArtifact, double manHoursPerDay, Date estimatedReleaseDate) throws OseeCoreException {
+ this.manHoursPerDay = manHoursPerDay;
+ this.versionArtifact = versionArtifact;
+ this.estimatedReleaseDate = estimatedReleaseDate;
+ if (artifacts.size() == 0) return;
+ for (Artifact art : artifacts) {
+ if (art instanceof ActionArtifact) {
+ actionArts.add((ActionArtifact) art);
+ }
+ }
+ for (Artifact art : artifacts) {
+ if (art instanceof TeamWorkFlowArtifact) {
+ teamArts.add((TeamWorkFlowArtifact) art);
+ } else if (art instanceof TaskArtifact) {
+ taskArts.add((TaskArtifact) art);
+ } else if (art instanceof ReviewSMArtifact) {
+ reviewArts.add((ReviewSMArtifact) art);
+ }
+ if (art instanceof StateMachineArtifact) {
+ smas.add((StateMachineArtifact) art);
+ Collection<User> users = ((StateMachineArtifact) art).getSmaMgr().getStateMgr().getAssignees();
+ assignees.addAll(users);
+ assigneesAssignedOrCompleted.addAll(users);
+ for (User user : users) {
+ userToAssignedSmas.put(user, art);
+ }
+ if (((StateMachineArtifact) art).getSmaMgr().isCompleted()) {
+ Collection<User> implementers = ((StateMachineArtifact) art).getImplementers();
+ assigneesAssignedOrCompleted.addAll(implementers);
+ for (User user : implementers) {
+ userToCompletedSmas.put(user, art);
+ }
+ }
+ }
+ }
+ estHours = 0;
+ hrsRemainFromEstimates = 0;
+ hrsSpent = 0;
+ manDaysNeeded = 0;
+ cummulativeWorkflowPercentComplete = 0;
+ manDaysNeeded = 0;
+ for (StateMachineArtifact team : smas) {
+ hrsRemainFromEstimates += team.getWorldViewRemainHours();
+ estHours += team.getWorldViewEstimatedHours();
+ hrsSpent += team.getWorldViewHoursSpentTotal();
+ manDaysNeeded += team.getWorldViewManDaysNeeded();
+ cummulativeWorkflowPercentComplete += team.getWorldViewPercentCompleteTotal();
+ }
+ if (hrsRemainFromEstimates != 0) manDaysNeeded = hrsRemainFromEstimates / manHoursPerDay;
+ percentCompleteByWorkflowPercents = 0;
+ if (getNumSMAs() > 0 && cummulativeWorkflowPercentComplete > 0) {
+ percentCompleteByWorkflowPercents = cummulativeWorkflowPercentComplete / getNumSMAs();
+ }
+
+ Date today = new Date();
+ daysTillRel = 0;
+ if (versionArtifact != null && estimatedReleaseDate == null) {
+ estimatedReleaseDate = versionArtifact.getEstimatedReleaseDate();
+ }
+ if (estimatedReleaseDate != null && estimatedReleaseDate.after(today)) {
+ daysTillRel = (estimatedReleaseDate.getTime() - today.getTime()) / MILLISECS_PER_DAY;
+ }
+ str =
+ String.format(
+ "TeamWFs: %s Tasks: %s EstHrs: %5.2f %sCmp: %5.2f RmnHrs: %5.2f HrsSpnt: %5.2f %s %s",
+ getNumTeamWfs(),
+ getNumTasks(),
+ estHours,
+ "%",
+ percentCompleteByWorkflowPercents,
+ hrsRemainFromEstimates,
+ hrsSpent,
+ (manDaysNeeded > 0 ? String.format("ManDaysNeeded: %5.2f ", manDaysNeeded) : ""),
+ (versionArtifact != null ? String.format(
+ "Version: %s EstRelDate: %s DaysLeft: %d ",
+ versionArtifact.getDescriptiveName(),
+ (estimatedReleaseDate == null ? "Not Set" : XDate.getDateStr(estimatedReleaseDate, XDate.MMDDYY)),
+ daysTillRel) : ""));
+ }
+
+ /**
+ * @return the userToCompletedSmas
+ */
+ public HashCollection<User, Artifact> getUserToCompletedSmas() {
+ return userToCompletedSmas;
+ }
+
+ public <A extends StateMachineArtifact> Collection<A> getUserToCompletedSmas(User user) {
+ return getUserToCompletedSmas(user, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <A extends StateMachineArtifact> Collection<A> getUserToCompletedSmas(User user, Class<A> clazz) {
+ if (!userToCompletedSmas.containsKey(user)) return Collections.emptyList();
+ List<A> smas = new ArrayList<A>();
+ for (Artifact art : userToCompletedSmas.getValues(user)) {
+ if (clazz == null || art.getClass().isInstance(clazz)) {
+ smas.add((A) art);
+ }
+ }
+ return smas;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <A extends StateMachineArtifact> Collection<A> getUserToAssignedSmas(User user, Class<A> clazz) {
+ if (!userToAssignedSmas.containsKey(user)) return Collections.emptyList();
+ List<A> smas = new ArrayList<A>();
+ for (Artifact art : userToAssignedSmas.getValues(user)) {
+ if (clazz == null || art.getClass().equals(clazz)) {
+ smas.add((A) art);
+ }
+ }
+ return smas;
+ }
+
+ public Collection<TeamWorkFlowArtifact> getCompletedTeamWorkflows() throws OseeCoreException {
+ Set<TeamWorkFlowArtifact> teams = new HashSet<TeamWorkFlowArtifact>();
+ for (TeamWorkFlowArtifact team : getTeamArts()) {
+ if (team.getSmaMgr().isCancelledOrCompleted()) {
+ teams.add(team);
+ }
+ }
+ return teams;
+ }
+
+ public Collection<StateMachineArtifact> getCompletedWorkflows() throws OseeCoreException {
+ Set<StateMachineArtifact> completed = new HashSet<StateMachineArtifact>();
+ for (StateMachineArtifact sma : smas) {
+ if (sma.getSmaMgr().isCancelledOrCompleted()) {
+ completed.add(sma);
+ }
+ }
+ return completed;
+ }
+
+ public double getPercentCompleteByTeamWorkflow() throws OseeCoreException {
+ if (getTeamArts().size() == 0) return 0;
+ double completed = getCompletedTeamWorkflows().size();
+ if (completed == 0) return 0;
+ return completed / getTeamArts().size() * 100;
+ }
+
+ public double getPercentCompleteByWorkflow() throws OseeCoreException {
+ if (smas.size() == 0) return 0;
+ double completed = getCompletedWorkflows().size();
+ if (completed == 0) return 0;
+ return completed / smas.size() * 100;
+ }
+
+ public Collection<TaskArtifact> getCompletedTaskWorkflows() throws OseeCoreException {
+ Set<TaskArtifact> tasks = new HashSet<TaskArtifact>();
+ for (TaskArtifact team : getTaskArts()) {
+ if (team.getSmaMgr().isCancelledOrCompleted()) {
+ tasks.add(team);
+ }
+ }
+ return tasks;
+ }
+
+ public double getPercentCompleteByTaskWorkflow() throws OseeCoreException {
+ if (getTaskArts().size() == 0) return 0;
+ double completed = getCompletedTaskWorkflows().size();
+ if (completed == 0) return 0;
+ return completed / getTaskArts().size() * 100;
+ }
+
+ /**
+ * @return the str
+ */
+ @Override
+ public String toString() {
+ return str;
+ }
+
+ public static String getEstRemainMetrics(Collection<? extends Artifact> smas, VersionArtifact versionArtifact, double manHoursPerDay, Date estimatedrelDate) throws OseeCoreException {
+ return new SMAMetrics(smas, versionArtifact, manHoursPerDay, estimatedrelDate).str;
+ }
+
+ /**
+ * @return the assigneesAssignedOrCompleted
+ */
+ public Set<User> getAssigneesAssignedOrCompleted() {
+ return assigneesAssignedOrCompleted;
+ }
+
+ public String toStringObjectBreakout() {
+ return String.format("Actions: %s - Team Workflows: %s - Task Workflows: %s - Review Workflows: %s ",
+ getNumActions(), getNumTeamWfs(), getNumTasks(), getNumReviews());
+ }
+
+ public String toStringLong() {
+ return String.format(
+ "%s\nEstimated Hours: %5.2f Percent Complete: %5.2f Remaining Hours: %5.2f ManDaysNeeded: %5.2f \nHours Spent: %5.2f %s",
+ toStringObjectBreakout(), estHours, percentCompleteByWorkflowPercents, hrsRemainFromEstimates,
+ manDaysNeeded, hrsSpent, (versionArtifact != null ? String.format(
+ "\nVersion: %s Estimated Release Date: %s Days Left: %d ", versionArtifact.getDescriptiveName(),
+ (estimatedReleaseDate == null ? "Not Set" : XDate.getDateStr(estimatedReleaseDate, XDate.MMDDYY)),
+ daysTillRel) : ""));
+ }
+
+ /**
+ * @return the estRelDate
+ */
+ public Date getEstRelDate() {
+ return estimatedReleaseDate;
+ }
+
+ /**
+ * @param estRelDate the estRelDate to set
+ */
+ public void setEstRelDate(Date estRelDate) {
+ this.estimatedReleaseDate = estRelDate;
+ }
+
+ /**
+ * @return the daysTillRel
+ */
+ public long getDaysTillRel() {
+ return daysTillRel;
+ }
+
+ /**
+ * @return the hours till release
+ */
+ public double getHoursTillRel() {
+ return daysTillRel * manHoursPerDay;
+ }
+
+ public String getHoursTillRelStr() {
+ return String.format("%5.2f hours = %d days till release * %5.2f Man Hours Per Day", getHoursTillRel(),
+ daysTillRel, manHoursPerDay);
+ }
+
+ /**
+ * @param daysTillRel the daysTillRel to set
+ */
+ public void setDaysTillRel(int daysTillRel) {
+ this.daysTillRel = daysTillRel;
+ }
+
+ /**
+ * @return the versionArtifact
+ */
+ public VersionArtifact getVersionArtifact() {
+ return versionArtifact;
+ }
+
+ /**
+ * @param versionArtifact the versionArtifact to set
+ */
+ public void setVersionArtifact(VersionArtifact versionArtifact) {
+ this.versionArtifact = versionArtifact;
+ }
+
+ /**
+ * @return the numTeamWfs
+ */
+ public int getNumTeamWfs() {
+ return teamArts.size();
+ }
+
+ /**
+ * @return the numTasks
+ */
+ public int getNumTasks() {
+ return taskArts.size();
+ }
+
+ public int getNumSMAs() {
+ return smas.size();
+ }
+
+ public int getNumNotEstimated() throws OseeCoreException {
+ int count = 0;
+ for (StateMachineArtifact sma : smas) {
+ if (sma.getWorldViewEstimatedHours() == 0) count++;
+ }
+ return count;
+ }
+
+ /**
+ * @return the numTasks
+ */
+ public int getNumActions() {
+ return actionArts.size();
+ }
+
+ /**
+ * @return the numTasks
+ */
+ public int getNumReviews() {
+ return reviewArts.size();
+ }
+
+ /**
+ * @return the estHours
+ */
+ public double getEstHours() {
+ return estHours;
+ }
+
+ /**
+ * @param estHours the estHours to set
+ */
+ public void setEstHours(double estHours) {
+ this.estHours = estHours;
+ }
+
+ /**
+ * @return the hrsRemain
+ */
+ public double getHrsRemainFromEstimates() {
+ return hrsRemainFromEstimates;
+ }
+
+ /**
+ * @return the hrsSpent
+ */
+ public double getHrsSpent() {
+ return hrsSpent;
+ }
+
+ /**
+ * @return the manDaysNeeded
+ */
+ public double getManDaysNeeded() {
+ return manDaysNeeded;
+ }
+
+ /**
+ * @return the cummulativePercentComplete
+ */
+ public double getCummulativeWorkflowPercentComplete() {
+ return cummulativeWorkflowPercentComplete;
+ }
+
+ /**
+ * @return the percentComplete
+ */
+ public double getPercentCompleteByWorkflowPercents() {
+ return percentCompleteByWorkflowPercents;
+ }
+
+ /**
+ * @return the manDayHrs
+ */
+ public double getHoursPerManDay() {
+ return manHoursPerDay;
+ }
+
+ /**
+ * @return the teamArts
+ */
+ public Set<TeamWorkFlowArtifact> getTeamArts() {
+ return teamArts;
+ }
+
+ /**
+ * @return the actionArts
+ */
+ public Set<ActionArtifact> getActionArts() {
+ return actionArts;
+ }
+
+ /**
+ * @return the taskArts
+ */
+ public Set<TaskArtifact> getTaskArts() {
+ return taskArts;
+ }
+
+ /**
+ * @return the reviewArts
+ */
+ public Set<ReviewSMArtifact> getReviewArts() {
+ return reviewArts;
+ }
+
+ /**
+ * Return all SMAs including Review and Tasks
+ *
+ * @return the userToSmas
+ */
+ public HashCollection<User, Artifact> getUserToAssignedSmas() {
+ return userToAssignedSmas;
+ }
+
+ public <A extends StateMachineArtifact> Collection<A> getUserToAssignedSmas(User user) {
+ return getUserToAssignedSmas(user, null);
+ }
+
+ public static Collection<StateMachineArtifact> getOpenAtDate(Date date, Collection<StateMachineArtifact> artifacts) throws OseeCoreException {
+ List<StateMachineArtifact> smas = new ArrayList<StateMachineArtifact>();
+ for (StateMachineArtifact sma : artifacts) {
+ Date createDate = sma.getWorldViewCreatedDate();
+ Date completedCancelDate = null;
+ if (sma.getSmaMgr().isCancelledOrCompleted()) {
+ if (sma.getSmaMgr().isCancelled()) {
+ completedCancelDate = sma.getWorldViewCancelledDate();
+ } else {
+ completedCancelDate = sma.getWorldViewCompletedDate();
+ }
+ }
+ if (createDate.before(date) && (completedCancelDate == null || completedCancelDate.after(date))) {
+ smas.add(sma);
+ }
+ }
+ return smas;
+ }
+
+ public static Collection<StateMachineArtifact> getCompletedCancelledBetweenDate(Date startDate, Date endDate, Collection<StateMachineArtifact> artifacts) throws OseeCoreException {
+ List<StateMachineArtifact> smas = new ArrayList<StateMachineArtifact>();
+ for (StateMachineArtifact sma : artifacts) {
+ Date completedCancelDate = null;
+ if (sma.getSmaMgr().isCancelledOrCompleted()) {
+ if (sma.getSmaMgr().isCancelled()) {
+ completedCancelDate = sma.getWorldViewCancelledDate();
+ } else {
+ completedCancelDate = sma.getWorldViewCompletedDate();
+ }
+ }
+ if (completedCancelDate == null) continue;
+ if (completedCancelDate.after(startDate) && completedCancelDate.before(endDate)) {
+ smas.add(sma);
+ }
+ }
+ return smas;
+ }
+
+ public static Double getHoursSpent(Collection<StateMachineArtifact> artifacts) throws OseeCoreException {
+ Double hoursSpent = 0.0;
+ for (StateMachineArtifact sma : artifacts) {
+ hoursSpent += sma.getWorldViewHoursSpentTotal();
+ }
+ return hoursSpent;
+ }
+
+ public static Collection<StateMachineArtifact> getStateAtDate(Date date, Collection<String> states, Collection<StateMachineArtifact> artifacts) throws OseeCoreException {
+ List<StateMachineArtifact> smas = new ArrayList<StateMachineArtifact>();
+ for (StateMachineArtifact sma : artifacts) {
+ Date createDate = sma.getWorldViewCreatedDate();
+ if (createDate.after(date)) continue;
+ // Find state at date
+ String currentState = sma.getSmaMgr().getStateMgr().getCurrentStateName();
+ for (LogItem item : sma.getSmaMgr().getLog().getLogItems()) {
+ if (item.getDate().before(date)) {
+ currentState = item.getState();
+ }
+ }
+ if (states.contains(currentState)) {
+ smas.add(sma);
+ }
+ }
+ return smas;
+ }
+
+ /**
+ * Returns sma if change type, or parent team workflow's change type is in specified set
+ *
+ * @param changeTypes
+ * @param artifacts
+ * @throws OseeCoreException
+ */
+ public static Collection<StateMachineArtifact> getChangeType(Collection<ChangeType> changeTypes, Collection<StateMachineArtifact> artifacts) throws OseeCoreException {
+ List<StateMachineArtifact> smas = new ArrayList<StateMachineArtifact>();
+ for (StateMachineArtifact sma : artifacts) {
+ TeamWorkFlowArtifact teamArt = sma.getParentTeamWorkflow();
+ if (changeTypes.contains(teamArt.getChangeType())) {
+ smas.add(sma);
+ }
+ }
+ return smas;
+
+ }
+
+ /**
+ * Returns sma if priority type, or parent team workflow's priority type is in specified set
+ *
+ * @param priorityTypes
+ * @param artifacts
+ * @throws OseeCoreException
+ */
+ public static Collection<StateMachineArtifact> getPriorityType(Collection<PriorityType> priorityTypes, Collection<StateMachineArtifact> artifacts) throws OseeCoreException {
+ List<StateMachineArtifact> smas = new ArrayList<StateMachineArtifact>();
+ for (StateMachineArtifact sma : artifacts) {
+ TeamWorkFlowArtifact teamArt = sma.getParentTeamWorkflow();
+ if (priorityTypes.contains(teamArt.getPriority())) {
+ smas.add(sma);
+ }
+ }
+ return smas;
+
+ }
+
+ public static Collection<StateMachineArtifact> getSMAs(Collection<Artifact> artifacts) throws OseeCoreException {
+ List<StateMachineArtifact> smas = new ArrayList<StateMachineArtifact>();
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof StateMachineArtifact) {
+ smas.add((StateMachineArtifact) artifact);
+ }
+ }
+ return smas;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/StateManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/StateManager.java
new file mode 100644
index 00000000000..0a86b542597
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/StateManager.java
@@ -0,0 +1,330 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.SMAState;
+import org.eclipse.osee.ats.util.widgets.XCurrentStateDam;
+import org.eclipse.osee.ats.util.widgets.XStateDam;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StateManager {
+
+ private final XCurrentStateDam currentStateDam;
+ private final XStateDam stateDam;
+ private final SMAManager smaMgr;
+
+ public StateManager(SMAManager smaMgr) {
+ super();
+ this.smaMgr = smaMgr;
+ currentStateDam = new XCurrentStateDam(smaMgr.getSma());
+ stateDam = new XStateDam(smaMgr.getSma());
+ }
+
+ /**
+ * Get state and create if not there.
+ *
+ * @param name
+ * @param create
+ * @return state matching name
+ */
+ private SMAState getSMAState(String name, boolean create) throws OseeCoreException {
+ if (currentStateDam.getState().getName().equals(name))
+ return currentStateDam.getState();
+ else
+ return (stateDam.getState(name, create));
+ }
+
+ /**
+ * Discouraged Access. This method should not normally be called except in cases were state data is being manually
+ * created.
+ *
+ * @param name
+ * @throws OseeCoreException
+ */
+ public void internalCreateIfNotExists(String name) throws OseeCoreException {
+ if (isStateVisited(name)) {
+ return;
+ }
+ SMAState smaState = getSMAState(name, true);
+ putState(smaState);
+ }
+
+ /**
+ * @return true if UnAssigned user is currently an assignee
+ * @throws OseeCoreException
+ */
+ public boolean isUnAssigned() throws OseeCoreException {
+ return getAssignees().contains(UserManager.getUser(SystemUser.UnAssigned));
+ }
+
+ public boolean isUnAssignedSolely() throws OseeCoreException {
+ return getAssignees().size() == 1 && isUnAssigned();
+ }
+
+ /**
+ * Return Hours Spent for State
+ *
+ * @param stateName
+ * @return hours spent or 0 if none
+ */
+ public double getHoursSpent(String stateName) throws OseeCoreException {
+ SMAState state = getSMAState(stateName, false);
+ if (state == null) return 0.0;
+ return state.getHoursSpent();
+ }
+
+ public double getHoursSpent() throws OseeCoreException {
+ return getHoursSpent(getCurrentStateName());
+ }
+
+ /**
+ * Return Percent Complete for State
+ *
+ * @param stateName
+ * @return percent complete or 0 if none
+ */
+ public int getPercentComplete(String stateName) throws OseeCoreException {
+ if (stateName.equals(DefaultTeamState.Completed) || stateName.equals(DefaultTeamState.Cancelled)) return 100;
+ SMAState state = getSMAState(stateName, false);
+ if (state == null) return 0;
+ return state.getPercentComplete();
+
+ }
+
+ public int getPercentComplete() throws OseeCoreException {
+ return getPercentComplete(getCurrentStateName());
+ }
+
+ public String getCurrentStateName() throws OseeCoreException {
+ return currentStateDam.getState().getName();
+ }
+
+ public String getAssigneesStr() throws OseeCoreException {
+ return Artifacts.toString("; ", smaMgr.getStateMgr().getAssignees());
+ }
+
+ public String getAssigneesStr(int length) throws OseeCoreException {
+ String str = getAssigneesStr();
+ if (str.length() > length) {
+ return str.substring(0, length - 1) + "...";
+ }
+ return str;
+ }
+
+ public Collection<User> getAssignees() throws OseeCoreException {
+ return getAssignees(getCurrentStateName());
+ }
+
+ public Collection<User> getAssignees(String stateName) throws OseeCoreException {
+ SMAState state = getSMAState(stateName, false);
+ if (state != null)
+ return state.getAssignees();
+ else
+ return Collections.emptyList();
+ }
+
+ public void updateMetrics(double additionalHours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ updateMetrics(getCurrentStateName(), additionalHours, percentComplete, logMetrics);
+ }
+
+ public void updateMetrics(String stateName, double additionalHours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ if (stateName.equals(getCurrentStateName()))
+ currentStateDam.updateMetrics(additionalHours, percentComplete, logMetrics);
+ else
+ stateDam.updateMetrics(stateName, additionalHours, percentComplete, logMetrics);
+ }
+
+ public void setMetrics(double hours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ currentStateDam.setMetrics(hours, percentComplete, logMetrics);
+ }
+
+ /**
+ * Sets the assignees AND writes to SMA. Does not persist.
+ *
+ * @param assignees
+ * @throws Exception
+ */
+ public void setAssignees(Collection<User> assignees) throws OseeCoreException {
+ SMAState state = getSMAState(getCurrentStateName(), false);
+ state.setAssignees(assignees);
+ putState(state);
+ }
+
+ /**
+ * Sets the assignee AND writes to SMA. Does not persist.
+ *
+ * @param assignee
+ * @throws Exception
+ */
+ public void setAssignee(String stateName, User assignee) throws OseeCoreException {
+ if (!isStateVisited(stateName)) throw new IllegalArgumentException("State " + stateName + " does not exist.");
+ SMAState state = getSMAState(stateName, false);
+ state.setAssignee(assignee);
+ putState(state);
+ }
+
+ /**
+ * Sets the assignee AND writes to SMA. Does not persist.
+ *
+ * @param assignee
+ * @throws Exception
+ */
+ public void setAssignee(User assignee) throws OseeCoreException {
+ SMAState state = getSMAState(getCurrentStateName(), false);
+ state.setAssignee(assignee);
+ putState(state);
+ }
+
+ /**
+ * Removes the assignee from stateName state AND writes to SMA. Does not persist.
+ *
+ * @param stateName
+ * @param assignee
+ * @throws Exception
+ */
+ public void removeAssignee(String stateName, User assignee) throws OseeCoreException {
+ if (!isStateVisited(stateName)) return;
+ SMAState state = getSMAState(stateName, false);
+ state.removeAssignee(assignee);
+ putState(state);
+ }
+
+ /**
+ * Removes the assignee AND writes to SMA. Does not persist.
+ *
+ * @param assignee
+ * @throws Exception
+ */
+ public void removeAssignee(User assignee) throws OseeCoreException {
+ SMAState state = getSMAState(getCurrentStateName(), false);
+ state.removeAssignee(assignee);
+ putState(state);
+ }
+
+ /**
+ * Adds the assignee AND writes to SMA. Does not persist.
+ *
+ * @param assignee
+ * @throws Exception
+ */
+ public void addAssignee(User assignee) throws OseeCoreException {
+ SMAState state = getSMAState(getCurrentStateName(), false);
+ state.addAssignee(assignee);
+ putState(state);
+ }
+
+ /**
+ * Removes ALL assignees AND writes to SMA. Does not persist.
+ *
+ * @param assignee
+ * @throws Exception
+ */
+ public void clearAssignees() throws OseeCoreException {
+ SMAState state = getSMAState(getCurrentStateName(), false);
+ state.clearAssignees();
+ putState(state);
+ }
+
+ public boolean isStateVisited(String name) throws OseeCoreException {
+ return getVisitedStateNames().contains(name);
+ }
+
+ public void transitionHelper(Collection<User> toAssignees, boolean persist, WorkPageDefinition fromPage, WorkPageDefinition toPage, String toStateName, String cancelReason) throws OseeCoreException {
+ // Set XCurrentState info to XState
+ stateDam.setState(currentStateDam.getState());
+
+ // Set XCurrentState; If been to this state, copy state info from prev state; else create new
+ SMAState previousState = stateDam.getState(toStateName, false);
+ if (previousState != null) {
+ if (toAssignees.size() > 0) previousState.setAssignees(toAssignees);
+ currentStateDam.setState(previousState);
+ } else {
+ currentStateDam.setState(new SMAState(toStateName, toAssignees));
+ }
+ }
+
+ /**
+ * Initializes state machine and sets the current state to stateName
+ *
+ * @param stateName
+ * @throws Exception
+ */
+ public void initializeStateMachine(String stateName) throws OseeCoreException {
+ initializeStateMachine(stateName, null);
+ }
+
+ /**
+ * Initializes state machine and sets the current state to stateName
+ *
+ * @param stateName
+ * @param assignees
+ * @throws Exception
+ */
+ public void initializeStateMachine(String stateName, Collection<User> assignees) throws OseeCoreException {
+ SMAState smaState = null;
+ if (getVisitedStateNames().contains(stateName)) {
+ smaState = getSMAState(stateName, false);
+ } else {
+ if (assignees == null) {
+ smaState = new SMAState(stateName, UserManager.getUser());
+ } else {
+ smaState = new SMAState(stateName, assignees);
+ }
+ }
+ currentStateDam.setState(smaState);
+ }
+
+ private void putState(SMAState state) throws OseeCoreException {
+ if (getCurrentStateName().equals(state.getName()))
+ currentStateDam.setState(state);
+ else
+ stateDam.setState(state);
+ }
+
+ public Collection<String> getVisitedStateNames() throws OseeCoreException {
+ Set<String> names = new HashSet<String>();
+ for (SMAState state : stateDam.getStates()) {
+ names.add(state.getName());
+ }
+ names.add(getCurrentStateName());
+ return names;
+ }
+
+ public long getTimeInState() throws OseeCoreException {
+ return getTimeInState(getCurrentStateName());
+ }
+
+ public long getTimeInState(String stateName) throws OseeCoreException {
+ SMAState state = getSMAState(stateName, false);
+ if (state == null) return 0;
+ LogItem logItem = smaMgr.getLog().getLastEvent(LogType.StateEntered);
+ if (logItem == null) return 0;
+ return (new Date()).getTime() - logItem.getDate().getTime();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Subscribe.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Subscribe.java
new file mode 100644
index 00000000000..4f775bcddae
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/Subscribe.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.ats.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ISubscribableArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Subscribe {
+
+ private final Collection<StateMachineArtifact> smas;
+
+ public Subscribe(StateMachineArtifact sma) {
+ this(Arrays.asList(sma));
+ }
+
+ public Subscribe(Collection<StateMachineArtifact> smas) {
+ super();
+ this.smas = smas;
+ }
+
+ public void toggleSubscribe() {
+ toggleSubscribe(true);
+ }
+
+ public void toggleSubscribe(boolean prompt) {
+ try {
+ if (((ISubscribableArtifact) smas.iterator().next()).amISubscribed()) {
+ boolean result = true;
+ if (prompt) result =
+ MessageDialog.openQuestion(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Un-Subscribe",
+ "You are currently subscribed to receive emails when this artifact transitions." + "\n\nAre You sure you wish to Un-Subscribe?");
+ if (result) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (StateMachineArtifact sma : smas) {
+ ((ISubscribableArtifact) sma).removeSubscribed(UserManager.getUser(), transaction);
+ }
+ transaction.execute();
+ }
+ } else {
+ boolean result = true;
+ if (prompt) result =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Subscribe",
+ "Are you sure you wish to subscribe to receive emails when this artifact transitions?");
+ if (result) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (StateMachineArtifact sma : smas) {
+ ((ISubscribableArtifact) sma).addSubscribed(UserManager.getUser(), transaction);
+ }
+ transaction.execute();
+ }
+
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/TeamBasedDefaultBranchProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/TeamBasedDefaultBranchProvider.java
new file mode 100644
index 00000000000..aa48528b483
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/TeamBasedDefaultBranchProvider.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.ats.util;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IDefaultInitialBranchesProvider;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class TeamBasedDefaultBranchProvider implements IDefaultInitialBranchesProvider {
+
+ public Collection<Branch> getDefaultInitialBranches() throws OseeCoreException {
+ User user = UserManager.getUser();
+ try {
+ Collection<TeamDefinitionArtifact> teams =
+ user.getRelatedArtifacts(AtsRelation.TeamMember_Team, TeamDefinitionArtifact.class);
+ Collection<Branch> branches = new LinkedList<Branch>();
+
+ Branch branch;
+ for (TeamDefinitionArtifact team : teams) {
+ branch = team.getTeamBranch();
+ if (branch != null) {
+ branches.add(branch);
+ }
+ }
+
+ return branches;
+ } catch (Exception ex) {
+ OseeLog.log(TeamBasedDefaultBranchProvider.class, Level.WARNING, ex);
+ }
+
+ return Collections.emptyList();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/UsersByIds.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/UsersByIds.java
new file mode 100644
index 00000000000..974e8ba6186
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/UsersByIds.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.ats.util;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UsersByIds {
+
+ public static Pattern userPattern = Pattern.compile("<(.*?)>");
+
+ public static String getStorageString(Collection<User> users) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (User u : users)
+ sb.append("<" + u.getUserId() + ">");
+ return sb.toString();
+ }
+
+ public static Collection<User> getUsers(String sorageString) throws OseeCoreException {
+ Set<User> users = new HashSet<User>();
+ Matcher m = userPattern.matcher(sorageString);
+ while (m.find()) {
+ String userId = m.group(1);
+ if (userId == null || userId.equals("")) throw new IllegalArgumentException("Blank userId specified.");
+ try {
+ User u = UserManager.getUserByUserId(m.group(1));
+ users.add(u);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return users;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionMetrics.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionMetrics.java
new file mode 100644
index 00000000000..29289757fa5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionMetrics.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VersionMetrics {
+
+ private final VersionArtifact verArt;
+ private final VersionTeamMetrics verTeamMet;
+
+ public VersionMetrics(VersionArtifact verArt, VersionTeamMetrics verTeamMet) {
+ this.verArt = verArt;
+ this.verTeamMet = verTeamMet;
+ }
+
+ public String toString() {
+ StringBuffer sb = new StringBuffer(verArt.getDescriptiveName() + "\n");
+ try {
+ sb.append("Workflows: " + verArt.getTargetedForTeamArtifacts().size());
+ sb.append(" Problem: " + getTeamWorkFlows(ChangeType.Problem).size() + " Improve: " + getTeamWorkFlows(
+ ChangeType.Improvement).size() + " Support: " + getTeamWorkFlows(ChangeType.Support).size());
+ sb.append(" Release Date: " + verArt.getReleaseDate());
+ VersionMetrics prevVerMet = getPreviousVerMetViaReleaseDate();
+ if (prevVerMet == null) {
+ sb.append(" Prev Release Version: <not found>");
+ } else {
+ sb.append(" Prev Release Version \"" + prevVerMet + "\" Release Date: " + verArt.getReleaseDate());
+ }
+ sb.append(" Start Date: " + getReleaseStartDate());
+ sb.append(" Num Days: " + getNumberDaysInRelease());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return sb.toString();
+ }
+
+ public Integer getNumberDaysInRelease() throws OseeCoreException {
+ Date startDate = getReleaseStartDate();
+ if (startDate == null) return null;
+ if (verArt.getReleaseDate() == null) return null;
+ return XDate.calculateDifference(startDate, verArt.getReleaseDate());
+ }
+
+ public Date getReleaseStartDate() throws OseeCoreException {
+ VersionMetrics prevVerMet = getPreviousVerMetViaReleaseDate();
+ if (prevVerMet == null) return null;
+ return prevVerMet.getVerArt().getReleaseDate();
+ }
+
+ public Collection<TeamWorkFlowArtifact> getTeamWorkFlows(ChangeType... changeType) throws OseeCoreException {
+ List<ChangeType> changeTypes = Arrays.asList(changeType);
+ Set<TeamWorkFlowArtifact> teams = new HashSet<TeamWorkFlowArtifact>();
+ for (TeamWorkFlowArtifact team : verArt.getTargetedForTeamArtifacts()) {
+ if (changeTypes.contains(team.getChangeType())) teams.add(team);
+ }
+ return teams;
+ }
+
+ public VersionMetrics getPreviousVerMetViaReleaseDate() throws OseeCoreException {
+ if (verArt.getReleaseDate() == null) return null;
+ int index = verTeamMet.getReleasedOrderedVersions().indexOf(this);
+ if (index > 0) return verTeamMet.getReleasedOrderedVersions().get(index - 1);
+ return null;
+ }
+
+ public VersionMetrics getNextVerMetViaReleaseDate() throws OseeCoreException {
+ if (verArt.getReleaseDate() == null) return null;
+ int index = verTeamMet.getReleasedOrderedVersions().indexOf(this);
+ if (index < verTeamMet.getReleasedOrderedVersions().size() - 1) {
+ return verTeamMet.getReleasedOrderedVersions().get(index + 1);
+ }
+ return null;
+ }
+
+ /**
+ * @return the verArt
+ */
+ public VersionArtifact getVerArt() {
+ return verArt;
+ }
+
+ /**
+ * @return the verTeamMet
+ */
+ public VersionTeamMetrics getVerTeamMet() {
+ return verTeamMet;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionReportJob.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionReportJob.java
new file mode 100644
index 00000000000..266d3b0aebb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionReportJob.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.ats.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+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.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VersionReportJob extends Job {
+
+ protected final String title;
+ protected final VersionArtifact verArt;
+
+ public VersionReportJob(String title, VersionArtifact verArt) {
+ super("Creating Release Report");
+ this.title = title;
+ this.verArt = verArt;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ final String html = getReleaseReportHtml(title + " - " + XDate.getDateNow(XDate.MMDDYYHHMM), verArt, monitor);
+ ResultsEditor.open(new XResultPage(title, html, Manipulations.HTML_MANIPULATIONS));
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.toString(), ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+
+ public static String getReleaseReportHtml(String title, VersionArtifact verArt, IProgressMonitor monitor) throws OseeCoreException {
+ if (verArt == null) {
+ AWorkbench.popup("ERROR", "Must select product, config and version.");
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.heading(3, title + getReleasedString(verArt), verArt.getDescriptiveName()));
+ sb.append(getTeamWorkflowReport(verArt.getTargetedForTeamArtifacts(), null, monitor));
+ return sb.toString();
+ }
+
+ public static String getFullReleaseReport(TeamDefinitionArtifact teamDef, IProgressMonitor monitor) throws OseeCoreException {
+ // Sort by release date and estimated release date
+ Map<String, VersionArtifact> dateToVerArt = new HashMap<String, VersionArtifact>();
+ for (VersionArtifact verArt : teamDef.getVersionsArtifacts()) {
+ if (verArt.getReleaseDate() != null)
+ dateToVerArt.put(verArt.getReleaseDate().getTime() + verArt.getDescriptiveName(), verArt);
+ else if (verArt.getEstimatedReleaseDate() != null)
+ dateToVerArt.put(verArt.getEstimatedReleaseDate().getTime() + verArt.getDescriptiveName(), verArt);
+ else
+ dateToVerArt.put("Un-Released - No Estimated Release " + verArt.getDescriptiveName(), verArt);
+ }
+ String[] dateSort = dateToVerArt.keySet().toArray(new String[dateToVerArt.size()]);
+ Arrays.sort(dateSort);
+ // Create hyperlinks reverse sorted
+ StringBuffer sb = new StringBuffer();
+ sb.append(AHTML.heading(2, teamDef + " Releases"));
+ sb.append(AHTML.bold("Report generated by OSEE ATS on " + XDate.getDateNow()) + AHTML.newline(2));
+ for (int x = dateSort.length - 1; x >= 0; x--) {
+ VersionArtifact verArt = dateToVerArt.get(dateSort[x]);
+ if (verArt.isNextVersion() || verArt.isReleased())
+ sb.append(AHTML.getHyperlink("#" + verArt.getDescriptiveName(),
+ verArt.getDescriptiveName() + VersionReportJob.getReleasedString(verArt)) + AHTML.newline());
+ else if (verArt.getEstimatedReleaseDate() != null)
+ sb.append(verArt.getDescriptiveName() + " - Un-Released - Estimated Release Date: " + getDateString(verArt.getEstimatedReleaseDate()) + AHTML.newline());
+ else
+ sb.append(verArt.getDescriptiveName() + " - Un-Released - No Estimated Release Date" + AHTML.newline());
+ }
+ sb.append(AHTML.addSpace(5));
+ int x = 1;
+ for (VersionArtifact verArt : teamDef.getVersionsArtifacts()) {
+ if (monitor != null) {
+ String str = "Processing version " + x++ + "/" + teamDef.getVersionsArtifacts().size();
+ monitor.subTask(str);
+ }
+ if (verArt.isReleased() || verArt.isNextVersion()) {
+ String html = VersionReportJob.getReleaseReportHtml(verArt.getDescriptiveName(), verArt, null);
+ sb.append(html);
+ }
+ }
+ return sb.toString();
+ }
+
+ private static String getDateString(Date date) {
+ if (date != null) return XDate.getDateStr(date, XDate.MMDDYY);
+ return null;
+ }
+
+ public static String getReleasedString(VersionArtifact verArt) throws OseeCoreException {
+ String released = "";
+ if (verArt.isReleased() && verArt.getSoleAttributeValue(ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), null) != null) {
+ released =
+ " - " + "Released: " + getDateString(verArt.getSoleAttributeValue(
+ ATSAttributes.RELEASE_DATE_ATTRIBUTE.getStoreName(), null, Date.class));
+ }
+ if (verArt.isNextVersion() && verArt.getSoleAttributeValue(
+ ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), null) != null) {
+ released =
+ " - " + "Next Release - Estimated Release Date: " + getDateString(verArt.getSoleAttributeValue(
+ ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), null, Date.class));
+ }
+ return released;
+ }
+
+ public static String getTeamWorkflowReport(Collection<TeamWorkFlowArtifact> teamArts, Integer backgroundColor, IProgressMonitor monitor) throws OseeCoreException {
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.beginMultiColumnTable(100, 1, backgroundColor));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "Team", "Priority", "Change", "Title", "HRID"}));
+ int x = 1;
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>();
+ for (TeamWorkFlowArtifact team : teamArts)
+ teamDefs.add(team.getTeamDefinition());
+ for (TeamDefinitionArtifact teamDef : teamDefs) {
+ for (TeamWorkFlowArtifact team : teamArts) {
+ if (team.getTeamDefinition().equals(teamDef)) {
+ String str = "Processing team " + x++ + "/" + teamArts.size();
+ if (monitor != null) monitor.subTask(str);
+ System.out.println(str);
+ sb.append(AHTML.addRowMultiColumnTable(new String[] {"Action", team.getTeamName(),
+ team.getWorldViewPriority(), team.getWorldViewChangeTypeStr(), team.getDescriptiveName(),
+ team.getHumanReadableId()}, null, (x % 2 == 0 ? null : "#cccccc")));
+
+ SMAManager smaMgr = new SMAManager(team);
+ for (TaskArtifact taskArt : smaMgr.getTaskMgr().getTaskArtifacts()) {
+ sb.append(AHTML.addRowMultiColumnTable(new String[] {"Task", "", "", "",
+ taskArt.getDescriptiveName(), taskArt.getHumanReadableId()}, null,
+ (x % 2 == 0 ? null : "#cccccc")));
+ }
+ }
+ }
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionTeamMetrics.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionTeamMetrics.java
new file mode 100644
index 00000000000..3f4e517e7cb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/VersionTeamMetrics.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VersionTeamMetrics {
+
+ private final TeamDefinitionArtifact verTeamDef;
+ private List<VersionMetrics> releasedOrderedVersions = new ArrayList<VersionMetrics>();
+ private Set<VersionMetrics> verMets = new HashSet<VersionMetrics>();
+ Map<Date, VersionMetrics> relDateToVerMet = new HashMap<Date, VersionMetrics>();
+
+ public VersionTeamMetrics(TeamDefinitionArtifact verTeamDef) throws OseeCoreException {
+ this.verTeamDef = verTeamDef;
+ loadMetrics();
+ }
+
+ private void loadMetrics() throws OseeCoreException {
+ bulkLoadArtifacts();
+ orderReleasedVersions();
+ }
+
+ private void bulkLoadArtifacts() throws OseeCoreException {
+ RelationManager.getRelatedArtifacts(Arrays.asList(this.verTeamDef), 6,
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, AtsRelation.TeamDefinitionToVersion_Version,
+ AtsRelation.TeamWorkflowTargetedForVersion_Workflow, AtsRelation.SmaToTask_Task,
+ AtsRelation.ActionToWorkflow_Action);
+ }
+
+ private Map<TeamWorkFlowArtifact, Date> teamWorkflowToOrigDate = null;
+
+ public Collection<TeamWorkFlowArtifact> getWorkflowsOriginatedBetween(Date startDate, Date endDate) throws OseeCoreException {
+ if (teamWorkflowToOrigDate == null) {
+ teamWorkflowToOrigDate = new HashMap<TeamWorkFlowArtifact, Date>();
+ for (VersionArtifact verArt : verTeamDef.getVersionsArtifacts()) {
+ for (TeamWorkFlowArtifact team : verArt.getTargetedForTeamArtifacts()) {
+ Date origDate = team.getSmaMgr().getLog().getCreationDate();
+ teamWorkflowToOrigDate.put(team, origDate);
+ }
+ }
+ }
+ Set<TeamWorkFlowArtifact> teams = new HashSet<TeamWorkFlowArtifact>();
+ for (Entry<TeamWorkFlowArtifact, Date> entry : teamWorkflowToOrigDate.entrySet()) {
+ if (entry.getValue() != null && entry.getValue().after(startDate) && entry.getValue().before(endDate)) {
+ teams.add(entry.getKey());
+ }
+ }
+ return teams;
+ }
+
+ private void orderReleasedVersions() throws OseeCoreException {
+ for (VersionArtifact ver : verTeamDef.getVersionsArtifacts()) {
+ VersionMetrics verMet = new VersionMetrics(ver, this);
+ if (ver.getReleaseDate() != null) {
+ relDateToVerMet.put(ver.getReleaseDate(), verMet);
+ }
+ verMets.add(verMet);
+ }
+ Date[] releases = relDateToVerMet.keySet().toArray(new Date[relDateToVerMet.keySet().size()]);
+ Arrays.sort(releases);
+ for (Date date : releases) {
+ releasedOrderedVersions.add(relDateToVerMet.get(date));
+ }
+ }
+
+ /**
+ * @return the verTeamDef
+ */
+ public TeamDefinitionArtifact getVerTeamDef() {
+ return verTeamDef;
+ }
+
+ /**
+ * @return the releasedOrderedVersions
+ */
+ public List<VersionMetrics> getReleasedOrderedVersions() {
+ return releasedOrderedVersions;
+ }
+
+ /**
+ * @return the verMets
+ */
+ public Set<VersionMetrics> getVerMets() {
+ return verMets;
+ }
+
+ /**
+ * @return the relDateToVerMet
+ */
+ public Map<Date, VersionMetrics> getRelDateToVerMet() {
+ return relDateToVerMet;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.java
new file mode 100644
index 00000000000..03876b9ff6e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/AtsWidgetProvider.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.ats.util.widgets;
+
+import org.eclipse.osee.ats.util.widgets.commit.XCommitManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlabelGroupSelection;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsWidgetProvider implements IXWidgetProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider#createXWidget(java.lang.String, java.lang.String, boolean, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData)
+ */
+ @Override
+ public XWidget createXWidget(String widgetName, String name, DynamicXWidgetLayoutData widgetLayoutData) {
+ XWidget toReturn = null;
+ if (widgetName.equals(XHyperlabelTeamDefinitionSelection.WIDGET_ID)) {
+ XHyperlabelTeamDefinitionSelection widget = new XHyperlabelTeamDefinitionSelection(name);
+ widget.setToolTip(widgetLayoutData.getToolTip());
+ toReturn = widget;
+ }
+ if (widgetName.equals(XHyperlabelGroupSelection.WIDGET_ID)) {
+ XHyperlabelGroupSelection widget = new XHyperlabelGroupSelection(name);
+ widget.setToolTip(widgetLayoutData.getToolTip());
+ toReturn = widget;
+ }
+ if (name.equals("Commit Manager") || widgetName.equals("XCommitManager")) {
+ return new XCommitManager();
+ }
+ if (name.equals("Working Branch") || widgetName.equals("XWorkingBranch")) {
+ return new XWorkingBranch();
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/DecisionOption.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/DecisionOption.java
new file mode 100644
index 00000000000..544bc8ef1ad
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/DecisionOption.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.ats.util.widgets;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+public class DecisionOption {
+ private String name;
+ private Collection<User> assignees = new HashSet<User>();
+ private boolean followupRequired;
+
+ public DecisionOption(String name, Collection<User> assignees, boolean followup) {
+ this.name = name;
+ this.followupRequired = followup;
+ if (assignees != null) this.assignees = assignees;
+ }
+
+ public DecisionOption(String name, User assignee, boolean followup) {
+ this.name = name;
+ this.followupRequired = followup;
+ if (assignee != null) this.assignees.add(assignee);
+ }
+
+ public DecisionOption(String name) {
+ this(name, (User) null, false);
+ }
+
+ public DecisionOption() {
+ this("", (User) null, false);
+ }
+
+ public String toString() {
+ return name;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof DecisionOption) {
+ DecisionOption state = (DecisionOption) obj;
+ if (!state.name.equals(name)) return false;
+ return true;
+ }
+ return super.equals(obj);
+ }
+
+ public Collection<User> getAssignees() {
+ return assignees;
+ }
+
+ /**
+ * Sets the assigness but DOES NOT write to SMA. This method should NOT be called outside the SMAManager.
+ *
+ * @param assignees
+ */
+ public void setAssignees(Collection<User> assignees) {
+ this.assignees.clear();
+ if (assignees != null) this.assignees.addAll(assignees);
+ }
+
+ /**
+ * Sets the assignes but DOES NOT write to SMA. This method should NOT be called outside the SMAManager.
+ *
+ * @param assignee
+ */
+ public void setAssignee(User assignee) {
+ this.assignees.clear();
+ if (assignee != null) this.assignees.add(assignee);
+ }
+
+ /**
+ * @param assignee
+ */
+ public void addAssignee(User assignee) {
+ if (assignee != null) this.assignees.add(assignee);
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String toXml() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer(name);
+ sb.append(";");
+ for (User u : assignees)
+ sb.append("<" + u.getUserId() + ">");
+ sb.append(";");
+ sb.append(followupRequired);
+ return sb.toString();
+ }
+
+ public Result setFromXml(String xml) {
+ Matcher m = Pattern.compile("^(.*?);(.*?);(.*?)$").matcher(xml);
+ if (m.find()) {
+ name = m.group(1);
+ if (name.equals("")) return new Result("Invalid name");
+ if (m.group(2).toLowerCase().equals("followup"))
+ followupRequired = true;
+ else if (m.group(2).toLowerCase().equals("completed"))
+ followupRequired = false;
+ else
+ return new Result("Invalid followup string \"" + m.group(2) + "\"\nShould be followup or completed");
+ m = Pattern.compile("<(.*?)>").matcher(m.group(2));
+ while (m.find()) {
+ try {
+ assignees.add(UserManager.getUserByUserId(m.group(3)));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ if (followupRequired && assignees.size() == 0)
+ return new Result("If followup is specified, must set assignees.\nShould be: <userid><userid>");
+ else if (!followupRequired && assignees.size() > 0) return new Result(
+ "If completed is specified, don't specify assigness. Leave blank.\n");
+ } else
+ new Result(
+ "Can't unpack decision option data => " + xml + "\n\n" + "must be in format: \"Name;(followup|completed);<userid1><userid2>\"" + "where true if followup is required; false if not. If followup required, assignees will be userid1, userid2.");
+ return Result.TrueResult;
+ }
+
+ /**
+ * @return the followupRequired
+ */
+ public boolean isFollowupRequired() {
+ return followupRequired;
+ }
+
+ /**
+ * @param followupRequired the followupRequired to set
+ */
+ public void setFollowupRequired(boolean followupRequired) {
+ this.followupRequired = followupRequired;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/ReviewManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/ReviewManager.java
new file mode 100644
index 00000000000..1c66ff0a94b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/ReviewManager.java
@@ -0,0 +1,332 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAManager.TransitionOption;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.UsersByIds;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ReviewManager {
+
+ private final SMAManager smaMgr;
+ private static String VALIDATE_REVIEW_TITLE = "Is the resolution of this Action valid?";
+
+ public ReviewManager(SMAManager smaMgr) {
+ super();
+ this.smaMgr = smaMgr;
+ }
+
+ /**
+ * Create a new decision review configured and transitioned to handle action validation
+ *
+ * @param force will force the creation of the review without checking that a review should be created
+ * @param transaction
+ * @return new review
+ * @throws
+ */
+ public DecisionReviewArtifact createValidateReview(boolean force, SkynetTransaction transaction) throws OseeCoreException {
+ // If not validate page, don't do anything
+ if (!force && !AtsWorkDefinitions.isValidatePage(smaMgr.getWorkPageDefinition())) {
+ return null;
+ }
+ // If validate review already created for this state, return
+ if (!force && getReviewsFromCurrentState().size() > 0) {
+ for (ReviewSMArtifact rev : getReviewsFromCurrentState()) {
+ if (rev.getDescriptiveName().equals(VALIDATE_REVIEW_TITLE)) return null;
+ }
+ }
+ // Create validate review
+ try {
+
+ DecisionReviewArtifact decRev =
+ ReviewManager.createNewDecisionReview(
+ smaMgr.getSma(),
+ AtsWorkDefinitions.isValidateReviewBlocking(smaMgr.getWorkPageDefinition()) ? ReviewBlockType.Transition : ReviewBlockType.None,
+ true);
+ decRev.setDescriptiveName(VALIDATE_REVIEW_TITLE);
+ decRev.setSoleAttributeValue(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName(),
+ "No;Followup;" + getValidateReviewFollowupUsersStr() + "\n" + "Yes;Completed;");
+
+ SMAManager revSmaMgr = new SMAManager(decRev);
+ revSmaMgr.transition(DecisionReviewArtifact.DecisionReviewState.Decision.name(), smaMgr.getOriginator(),
+ transaction, TransitionOption.Persist);
+
+ return decRev;
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ public DecisionReviewArtifact createNewDecisionReview(String reviewTitle, String description, String againstState, ReviewBlockType reviewBlockType, String options, Collection<User> assignees, SkynetTransaction transaction) throws OseeCoreException {
+ DecisionReviewArtifact decRev =
+ ReviewManager.createNewDecisionReview(smaMgr.getSma(), reviewBlockType, reviewTitle, againstState,
+ description, options, assignees);
+ return decRev;
+ }
+
+ public static DecisionReviewArtifact createNewDecisionReviewAndTransitionToDecision(TeamWorkFlowArtifact teamArt, String reviewTitle, String description, String againstState, ReviewBlockType reviewBlockType, String options, Collection<User> assignees, SkynetTransaction transaction) throws OseeCoreException {
+ DecisionReviewArtifact decRev =
+ ReviewManager.createNewDecisionReview(teamArt, reviewBlockType, reviewTitle, againstState, description,
+ options, assignees);
+ decRev.persistAttributesAndRelations(transaction);
+
+ SMAManager revSmaMgr = new SMAManager(decRev);
+ revSmaMgr.transition(DecisionReviewArtifact.DecisionReviewState.Decision.name(), assignees, transaction,
+ TransitionOption.Persist, TransitionOption.OverrideAssigneeCheck);
+ return decRev;
+ }
+
+ public DecisionReviewArtifact createNewDecisionReviewAndTransitionToDecision(String reviewTitle, String description, String againstState, ReviewBlockType reviewBlockType, String options, Collection<User> assignees, SkynetTransaction transaction) throws OseeCoreException {
+ return createNewDecisionReviewAndTransitionToDecision((TeamWorkFlowArtifact) smaMgr.getSma(), reviewTitle,
+ description, againstState, reviewBlockType, options, assignees, transaction);
+ }
+
+ public PeerToPeerReviewArtifact createNewPeerToPeerReview(String reviewTitle, String againstState, SkynetTransaction transaction) throws OseeCoreException {
+ return createNewPeerToPeerReview(reviewTitle, againstState, UserManager.getUser(), new Date(), transaction);
+ }
+
+ public PeerToPeerReviewArtifact createNewPeerToPeerReview(String reviewTitle, String againstState, User origUser, Date origDate, SkynetTransaction transaction) throws OseeCoreException {
+ return createNewPeerToPeerReview(smaMgr.getSma(), reviewTitle, againstState, origUser, origDate, transaction);
+ }
+
+ public static PeerToPeerReviewArtifact createNewPeerToPeerReview(StateMachineArtifact teamParent, String reviewTitle, String againstState, User origUser, Date origDate, SkynetTransaction transaction) throws OseeCoreException {
+ PeerToPeerReviewArtifact peerToPeerRev =
+ (PeerToPeerReviewArtifact) ArtifactTypeManager.addArtifact(PeerToPeerReviewArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), reviewTitle == null ? "Peer to Peer Review" : reviewTitle);
+
+ if (teamParent != null) {
+ teamParent.addRelation(AtsRelation.TeamWorkflowToReview_Review, peerToPeerRev);
+ if (againstState != null) peerToPeerRev.setSoleAttributeValue(
+ ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), againstState);
+ }
+
+ peerToPeerRev.getSmaMgr().getLog().addLog(LogType.Originated, "", "", origDate, origUser);
+ peerToPeerRev.setSoleAttributeValue(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getStoreName(),
+ ReviewBlockType.None.name());
+
+ // Initialize state machine
+ peerToPeerRev.getSmaMgr().getStateMgr().initializeStateMachine(
+ DecisionReviewArtifact.DecisionReviewState.Prepare.name());
+ peerToPeerRev.getSmaMgr().getLog().addLog(LogType.StateEntered,
+ DecisionReviewArtifact.DecisionReviewState.Prepare.name(), "", origDate, origUser);
+ peerToPeerRev.persistAttributesAndRelations(transaction);
+ return peerToPeerRev;
+ }
+
+ /**
+ * Return Remain Hours for all reviews
+ *
+ * @return remain hours
+ * @throws Exception
+ */
+ public double getRemainHours() throws OseeCoreException {
+ double hours = 0;
+ for (ReviewSMArtifact reviewArt : getReviews())
+ hours += reviewArt.getRemainHoursFromArtifact();
+ return hours;
+
+ }
+
+ /**
+ * Return Estimated Review Hours of "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Estimated Hours
+ */
+ public double getEstimatedHours(String relatedToStateName) throws OseeCoreException {
+ double hours = 0;
+ for (ReviewSMArtifact revArt : getReviews(relatedToStateName))
+ hours += revArt.getEstimatedHoursTotal();
+ return hours;
+ }
+
+ /**
+ * Return Estimated Hours for all reviews
+ *
+ * @return estimated hours
+ * @throws Exception
+ */
+ public double getEstimatedHours() throws OseeCoreException {
+ double hours = 0;
+ for (ReviewSMArtifact revArt : getReviews())
+ hours += revArt.getEstimatedHoursTotal();
+ return hours;
+
+ }
+
+ public String getValidateReviewFollowupUsersStr() {
+ try {
+ return UsersByIds.getStorageString(getValidateReviewFollowupUsers());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ public Collection<User> getValidateReviewFollowupUsers() throws OseeCoreException {
+ Collection<User> users = smaMgr.getStateMgr().getAssignees("Implement");
+ if (users.size() > 0) return users;
+
+ // Else if Team Workflow , return it to the leads of this team
+ if (smaMgr.getSma() instanceof TeamWorkFlowArtifact) return ((TeamWorkFlowArtifact) smaMgr.getSma()).getTeamDefinition().getLeads();
+
+ // Else, return current user; should never hit this
+ return Arrays.asList(UserManager.getUser());
+ }
+
+ public Collection<ReviewSMArtifact> getReviews() throws OseeCoreException {
+ return smaMgr.getSma().getRelatedArtifacts(AtsRelation.TeamWorkflowToReview_Review, ReviewSMArtifact.class);
+ }
+
+ public Collection<ReviewSMArtifact> getReviewsFromCurrentState() throws OseeCoreException {
+ return getReviews(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ public Collection<ReviewSMArtifact> getReviews(String stateName) throws OseeCoreException {
+ Set<ReviewSMArtifact> arts = new HashSet<ReviewSMArtifact>();
+ for (ReviewSMArtifact revArt : getReviews()) {
+ if (revArt.getSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), "").equals(stateName)) arts.add(revArt);
+ }
+ return arts;
+ }
+
+ public boolean hasReviews() {
+ try {
+ return smaMgr.getSma().getRelatedArtifactsCount(AtsRelation.TeamWorkflowToReview_Review) > 0;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ }
+
+ public Result areReviewsComplete() {
+ return areReviewsComplete(true);
+ }
+
+ public Result areReviewsComplete(boolean popup) {
+ try {
+ for (ReviewSMArtifact reviewArt : getReviews()) {
+ SMAManager smaMgr = new SMAManager(reviewArt);
+ if (!smaMgr.isCompleted() && smaMgr.isCancelled()) return new Result("Not Complete");
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return Result.TrueResult;
+ }
+
+ public static Collection<String> getAllReviewArtifactTypeNames() {
+ return Arrays.asList(DecisionReviewArtifact.ARTIFACT_NAME, PeerToPeerReviewArtifact.ARTIFACT_NAME);
+ }
+
+ /**
+ * Return Hours Spent for Reviews of "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Hours Spent
+ */
+ public double getHoursSpent(String relatedToStateName) throws OseeCoreException {
+ double spent = 0;
+ for (ReviewSMArtifact reviewArt : getReviews(relatedToStateName))
+ spent += reviewArt.getHoursSpentSMATotal();
+ return spent;
+ }
+
+ /**
+ * Return Total Percent Complete / # Reviews for "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Percent Complete.
+ */
+ public int getPercentComplete(String relatedToStateName) throws OseeCoreException {
+ int spent = 0;
+ Collection<ReviewSMArtifact> reviewArts = getReviews(relatedToStateName);
+ for (ReviewSMArtifact reviewArt : reviewArts)
+ spent += reviewArt.getPercentCompleteSMATotal();
+ if (spent == 0) return 0;
+ return spent / reviewArts.size();
+ }
+
+ public static DecisionReviewArtifact createNewDecisionReview(StateMachineArtifact teamParent, ReviewBlockType reviewBlockType, boolean againstCurrentState) throws OseeCoreException {
+ return createNewDecisionReview(teamParent, reviewBlockType,
+ "Should we do this? Yes will require followup, No will not",
+ againstCurrentState ? teamParent.getSmaMgr().getStateMgr().getCurrentStateName() : null,
+ "Enter description of the decision, if any", getDefaultDecisionReviewOptions(), null);
+ }
+
+ public static String getDefaultDecisionReviewOptions() throws OseeCoreException {
+ return "Yes;Followup;<" + UserManager.getUser().getUserId() + ">\n" + "No;Completed;";
+ }
+
+ public static DecisionReviewArtifact createNewDecisionReview(StateMachineArtifact teamParent, ReviewBlockType reviewBlockType, String title, String relatedToState, String description, String options, Collection<User> assignees) throws OseeCoreException {
+ DecisionReviewArtifact decRev =
+ (DecisionReviewArtifact) ArtifactTypeManager.addArtifact(DecisionReviewArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), title);
+
+ if (teamParent != null) {
+ teamParent.addRelation(AtsRelation.TeamWorkflowToReview_Review, decRev);
+ }
+ if (relatedToState != null && !relatedToState.equals("")) {
+ decRev.setSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), relatedToState);
+ }
+ decRev.getSmaMgr().getLog().addLog(LogType.Originated, "", "");
+ if (description != null && !description.equals("")) {
+ decRev.setSoleAttributeValue(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), description);
+ }
+ if (options != null && !options.equals("")) {
+ decRev.setSoleAttributeValue(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName(), options);
+ }
+ if (reviewBlockType != null) {
+ decRev.setSoleAttributeFromString(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getStoreName(), reviewBlockType.name());
+ }
+
+ // Initialize state machine
+ decRev.getSmaMgr().getStateMgr().initializeStateMachine(DecisionReviewArtifact.DecisionReviewState.Prepare.name());
+ decRev.getSmaMgr().getLog().addLog(LogType.StateEntered,
+ DecisionReviewArtifact.DecisionReviewState.Prepare.name(), "");
+ if (assignees != null && assignees.size() > 0) {
+ decRev.getSmaMgr().getStateMgr().setAssignees(assignees);
+ }
+
+ return decRev;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/SMAState.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/SMAState.java
new file mode 100644
index 00000000000..090c75df893
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/SMAState.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.ats.util.widgets;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.UsersByIds;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+
+public class SMAState {
+ private String name;
+ private Collection<User> assignees = new HashSet<User>();
+ private int percentComplete = 0;
+ private double hoursSpent = 0;
+
+ public SMAState(String name, Collection<User> assignees) {
+ this.name = name;
+ if (assignees != null) this.assignees = assignees;
+ }
+
+ public SMAState(String name, User assignee) {
+ this.name = name;
+ if (assignee != null) this.assignees.add(assignee);
+ }
+
+ public SMAState(String name) {
+ this(name, (User) null);
+ }
+
+ public SMAState() {
+ this("", (User) null);
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof SMAState) {
+ SMAState state = (SMAState) obj;
+ if (!state.name.equals(name)) return false;
+ if (!state.assignees.equals(this.assignees)) return false;
+ return true;
+ }
+ return super.equals(obj);
+ }
+
+ public Collection<User> getAssignees() {
+ return assignees;
+ }
+
+ /**
+ * Sets the assigness but DOES NOT write to SMA. This method should NOT be called outside the SMAManager.
+ *
+ * @param assignees
+ * @throws OseeCoreException
+ */
+ public void setAssignees(Collection<User> assignees) throws OseeCoreException {
+ if (assignees.contains(UserManager.getUser(SystemUser.OseeSystem)) || assignees.contains(UserManager.getUser(SystemUser.Guest))) {
+ throw new OseeArgumentException("Can not assign workflow to OseeSystem or Guest");
+ }
+ if (assignees.size() > 1 && assignees.contains(UserManager.getUser(SystemUser.UnAssigned))) {
+ throw new OseeArgumentException("Can not assign to user and UnAssigned");
+ }
+ if (assignees.size() > 0 && (name.equals(DefaultTeamState.Completed.name()) || name.equals(DefaultTeamState.Cancelled.name()))) throw new OseeStateException(
+ "Can't assign completed/cancelled states.");
+ this.assignees.clear();
+ if (assignees != null) this.assignees.addAll(assignees);
+ }
+
+ public void clearAssignees() {
+ this.assignees.clear();
+ }
+
+ /**
+ * Sets the assignees but DOES NOT write to SMA. This method should NOT be called outside the SMAManager.
+ *
+ * @param assignee
+ * @throws OseeCoreException
+ * @throws IllegalOseeArgumentException
+ */
+ public void setAssignee(User assignee) throws OseeCoreException {
+ if (assignee != null && (name.equals(DefaultTeamState.Completed.name()) || name.equals(DefaultTeamState.Cancelled.name()))) {
+ throw new OseeStateException("Can't assign completed/cancelled states.");
+ }
+ if (assignee == UserManager.getUser(SystemUser.OseeSystem) || assignee == UserManager.getUser(SystemUser.Guest)) {
+ throw new OseeArgumentException("Can not assign workflow to OseeSystem or Guest");
+ }
+ this.assignees.clear();
+ if (assignee != null) this.assignees.add(assignee);
+ }
+
+ /**
+ * @param assignee
+ */
+ public void addAssignee(User assignee) throws OseeCoreException {
+ if (assignee == UserManager.getUser(SystemUser.OseeSystem) || assignee == UserManager.getUser(SystemUser.Guest)) {
+ throw new OseeArgumentException("Can not assign workflow to OseeSystem or Guest");
+ }
+ if (assignee != null) this.assignees.add(assignee);
+ }
+
+ public void removeAssignee(User assignee) {
+ if (assignee != null) this.assignees.remove(assignee);
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String toXml() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer(name);
+ sb.append(";");
+ sb.append(UsersByIds.getStorageString(assignees));
+ sb.append(";");
+ if (hoursSpent > 0) sb.append(getHoursSpentStr());
+ sb.append(";");
+ if (percentComplete > 0) sb.append(percentComplete);
+ return sb.toString();
+ }
+
+ public static Pattern storagePattern = Pattern.compile("^(.*?);(.*?);(.*?);(.*?)$");
+
+ public void setFromXml(String xml) throws OseeCoreException {
+ if (xml == null || xml.equals("")) {
+ name = "Unknown";
+ return;
+ }
+ Matcher m = storagePattern.matcher(xml);
+ if (m.find()) {
+ name = m.group(1);
+ if (!m.group(3).equals("")) hoursSpent = new Float(m.group(3)).doubleValue();
+ if (!m.group(4).equals("")) percentComplete = new Integer(m.group(4)).intValue();
+ assignees = UsersByIds.getUsers(m.group(2));
+ } else
+ throw new OseeArgumentException("Can't unpack state data => " + xml);
+ }
+
+ /**
+ * @return Returns the hoursSpent.
+ */
+ public double getHoursSpent() {
+ return hoursSpent;
+ }
+
+ public String getHoursSpentStr() {
+ return AtsLib.doubleToStrString(hoursSpent);
+ }
+
+ /**
+ * @param hoursSpent The hoursSpent to set.
+ */
+ public void setHoursSpent(double hoursSpent) {
+ this.hoursSpent = hoursSpent;
+ }
+
+ /**
+ * @return Returns the percentComplete.
+ */
+ public int getPercentComplete() {
+ return percentComplete;
+ }
+
+ /**
+ * @param percentComplete The percentComplete to set.
+ */
+ public void setPercentComplete(int percentComplete) {
+ this.percentComplete = percentComplete;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/TaskManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/TaskManager.java
new file mode 100644
index 00000000000..c749d3a2484
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/TaskManager.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.TaskArtifact.TaskStates;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskManager {
+ private final SMAManager smaMgr;
+
+ public TaskManager(SMAManager smaMgr) {
+ super();
+ this.smaMgr = smaMgr;
+ }
+
+ public String getStatus(String stateName) throws OseeCoreException {
+ int completed = 0, cancelled = 0, inWork = 0;
+ for (TaskArtifact taskArt : getTaskArtifacts(stateName)) {
+ if (taskArt.isCompleted())
+ completed++;
+ else if (taskArt.isCancelled())
+ cancelled++;
+ else
+ inWork++;
+ }
+ return String.format("Total: %d - InWork: %d - Completed: %d - Cancelled: %d",
+ getTaskArtifacts(stateName).size(), inWork, completed, cancelled);
+ }
+
+ public Collection<TaskArtifact> getTaskArtifacts() throws OseeCoreException {
+ return smaMgr.getSma().getRelatedArtifacts(AtsRelation.SmaToTask_Task, TaskArtifact.class);
+ }
+
+ public Collection<TaskArtifact> getTaskArtifactsFromCurrentState() throws OseeCoreException {
+ return getTaskArtifacts(smaMgr.getStateMgr().getCurrentStateName());
+ }
+
+ public Collection<TaskArtifact> getTaskArtifacts(String stateName) throws OseeCoreException {
+ List<TaskArtifact> arts = new ArrayList<TaskArtifact>();
+ for (TaskArtifact taskArt : smaMgr.getSma().getRelatedArtifacts(AtsRelation.SmaToTask_Task, TaskArtifact.class)) {
+ if (taskArt.getSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(), "").equals(
+ stateName)) arts.add(taskArt);
+ }
+ return arts;
+ }
+
+ public boolean hasTaskArtifacts() {
+ try {
+ return smaMgr.getSma().getRelatedArtifactsCount(AtsRelation.SmaToTask_Task) > 0;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ }
+
+ public TaskArtifact createNewTask(String title) throws OseeCoreException {
+ return createNewTask(Arrays.asList(UserManager.getUser()), title);
+ }
+
+ public TaskArtifact createNewTask(User assignee, String title) throws OseeCoreException {
+ return createNewTask(Arrays.asList(assignee), title);
+ }
+
+ public TaskArtifact createNewTask(Collection<User> assignees, String title) throws OseeCoreException {
+ TaskArtifact taskArt = null;
+ taskArt =
+ (TaskArtifact) ArtifactTypeManager.addArtifact(TaskArtifact.ARTIFACT_NAME, AtsPlugin.getAtsBranch(), title);
+ taskArt.getSmaMgr().getLog().addLog(LogType.Originated, "", "");
+
+ // Initialize state machine
+ taskArt.getSmaMgr().getStateMgr().initializeStateMachine(TaskStates.InWork.name(), assignees);
+ taskArt.getSmaMgr().getLog().addLog(LogType.StateEntered, "InWork", "");
+
+ // Set parent state task is related to
+ taskArt.setSoleAttributeValue(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName(),
+ smaMgr.getStateMgr().getCurrentStateName());
+
+ smaMgr.getSma().addRelation(AtsRelation.SmaToTask_Task, taskArt);
+
+ return taskArt;
+ }
+
+ public Result areTasksComplete() {
+ try {
+ for (TaskArtifact taskArt : getTaskArtifacts()) {
+ if (taskArt.isInWork()) {
+ return new Result(false, "Task " + taskArt.getHumanReadableId() + " Not Complete");
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Result(false, "Exception " + ex.getLocalizedMessage());
+ }
+ return Result.TrueResult;
+ }
+
+ public Result areTasksComplete(String stateName) {
+ try {
+ for (TaskArtifact taskArt : getTaskArtifacts(stateName)) {
+ if (taskArt.isInWork()) {
+ return new Result(false, "Task " + taskArt.getHumanReadableId() + " Not Complete");
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Result(false, "Exception " + ex.getLocalizedMessage());
+ }
+ return Result.TrueResult;
+ }
+
+ /**
+ * Return Estimated Task Hours of "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Estimated Hours
+ */
+ public double getEstimatedHours(String relatedToStateName) throws OseeCoreException {
+ double hours = 0;
+ for (TaskArtifact taskArt : getTaskArtifacts(relatedToStateName))
+ hours += taskArt.getEstimatedHoursTotal();
+ return hours;
+ }
+
+ /**
+ * Return Estimated Hours for all tasks
+ *
+ * @return hours
+ * @throws Exception
+ */
+ public double getEstimatedHours() throws OseeCoreException {
+ double hours = 0;
+ for (TaskArtifact taskArt : getTaskArtifacts())
+ hours += taskArt.getEstimatedHoursFromArtifact();
+ return hours;
+
+ }
+
+ /**
+ * Return Remain Task Hours of "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Remain Hours
+ */
+ public double getRemainHours(String relatedToStateName) throws OseeCoreException {
+ double hours = 0;
+ for (TaskArtifact taskArt : getTaskArtifacts(relatedToStateName))
+ hours += taskArt.getRemainHoursFromArtifact();
+ return hours;
+ }
+
+ /**
+ * Return Remain Hours for all tasks
+ *
+ * @return hours
+ * @throws Exception
+ */
+ public double getRemainHours() throws OseeCoreException {
+ double hours = 0;
+ for (TaskArtifact taskArt : getTaskArtifacts())
+ hours += taskArt.getRemainHoursFromArtifact();
+ return hours;
+
+ }
+
+ /**
+ * Return Hours Spent for Tasks of "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Hours Spent
+ */
+ public double getHoursSpent(String relatedToStateName) throws OseeCoreException {
+ double spent = 0;
+ for (TaskArtifact taskArt : getTaskArtifacts(relatedToStateName))
+ spent += taskArt.getHoursSpentSMATotal();
+ return spent;
+ }
+
+ /**
+ * Return Total Percent Complete / # Tasks for "Related to State" stateName
+ *
+ * @param relatedToStateName state name of parent workflow's state
+ * @return Returns the Percent Complete.
+ */
+ public int getPercentComplete(String relatedToStateName) throws OseeCoreException {
+ int spent = 0;
+ Collection<TaskArtifact> taskArts = getTaskArtifacts(relatedToStateName);
+ for (TaskArtifact taskArt : taskArts)
+ spent += taskArt.getPercentCompleteSMATotal();
+ if (spent == 0) return 0;
+ return spent / taskArts.size();
+ }
+
+ public static Collection<TaskArtifact> createTasks(TeamWorkFlowArtifact teamArt, List<String> titles, List<User> assignees, SkynetTransaction transaction) throws OseeCoreException {
+ List<TaskArtifact> tasks = new ArrayList<TaskArtifact>();
+ for (String title : titles) {
+ TaskArtifact taskArt = teamArt.getSmaMgr().getTaskMgr().createNewTask(title);
+ if (assignees != null && assignees.size() > 0) {
+ Set<User> users = new HashSet<User>();
+ for (User art : assignees) {
+ users.add(art);
+ }
+ taskArt.getSmaMgr().getStateMgr().setAssignees(users);
+ }
+ tasks.add(taskArt);
+ taskArt.persistAttributesAndRelations(transaction);
+ }
+ return tasks;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XActionableItemsDam.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XActionableItemsDam.java
new file mode 100644
index 00000000000..6da93821f13
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XActionableItemsDam.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.ats.util.widgets;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XTextDam;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XActionableItemsDam extends XTextDam {
+
+ protected final Artifact sma;
+
+ public XActionableItemsDam(Artifact sma) {
+ super(ATSAttributes.ACTIONABLE_ITEM_GUID_ATTRIBUTE.getStoreName());
+ this.sma = sma;
+ }
+
+ public Set<ActionableItemArtifact> getActionableItems() throws OseeCoreException {
+ Set<ActionableItemArtifact> ais = new HashSet<ActionableItemArtifact>();
+ for (String guid : getActionableItemGuids()) {
+ try {
+ ActionableItemArtifact aia = AtsCache.getActionableItemByGuid(guid);
+ if (aia == null)
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Can't find Actionable Item for guid " + guid);
+ else
+ ais.add(aia);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Error getting actionable item for guid " + guid, ex);
+ }
+ }
+ return ais;
+ }
+
+ public String getActionableItemsStr() throws OseeCoreException {
+ return Artifacts.toString("; ", getActionableItems());
+ }
+
+ public List<String> getActionableItemGuids() throws OseeCoreException {
+ return sma.getAttributesToStringList(ATSAttributes.ACTIONABLE_ITEM_GUID_ATTRIBUTE.getStoreName());
+ }
+
+ public void addActionableItem(ActionableItemArtifact aia) throws OseeCoreException {
+ if (!getActionableItemGuids().contains(aia.getGuid())) sma.addAttribute(
+ ATSAttributes.ACTIONABLE_ITEM_GUID_ATTRIBUTE.getStoreName(), aia.getGuid());
+ }
+
+ public void removeActionableItem(ActionableItemArtifact aia) throws OseeCoreException {
+ sma.deleteAttribute(ATSAttributes.ACTIONABLE_ITEM_GUID_ATTRIBUTE.getStoreName(), aia.getGuid());
+ }
+
+ public Result setActionableItems(Collection<ActionableItemArtifact> newItems) throws OseeCoreException {
+ Set<ActionableItemArtifact> existingAias = getActionableItems();
+
+ // Remove non-selected items
+ for (ActionableItemArtifact existingAia : existingAias)
+ if (!newItems.contains(existingAia)) removeActionableItem(existingAia);
+
+ // Add newly-selected items
+ for (ActionableItemArtifact newItem : newItems)
+ if (!existingAias.contains(newItem)) addActionableItem(newItem);
+
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XCurrentStateDam.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XCurrentStateDam.java
new file mode 100644
index 00000000000..2477feff5ef
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XCurrentStateDam.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.ats.util.widgets;
+
+import java.util.Date;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XCurrentStateDam extends XStateAssigneesDam {
+
+ public XCurrentStateDam(StateMachineArtifact sma) {
+ super(sma, ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName());
+ }
+
+ public SMAState getState() throws OseeCoreException {
+ Set<SMAState> states = getStates();
+ if (states.size() != 1) throw new OseeArgumentException(
+ "Must be one current state. Found " + states.size() + " for " + sma.getHumanReadableId());
+ return states.iterator().next();
+ }
+
+ @Override
+ public void setState(SMAState state) throws OseeCoreException {
+ sma.setSoleAttributeValue(attributeTypeName, state.toXml());
+ }
+
+ public void updateMetrics(double additionalHours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ SMAState currState = getState();
+ currState.setHoursSpent(currState.getHoursSpent() + additionalHours);
+ currState.setPercentComplete(percentComplete);
+ setState(currState);
+ if (logMetrics) logMetrics();
+ }
+
+ public void setMetrics(double hours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ SMAState currState = getState();
+ currState.setHoursSpent(hours);
+ currState.setPercentComplete(percentComplete);
+ setState(currState);
+ if (logMetrics) logMetrics();
+ }
+
+ public void logMetrics() throws OseeCoreException {
+ logMetrics(sma, sma.getPercentCompleteSMATotal() + "", AtsLib.doubleToStrString(sma.getHoursSpentSMATotal()), "",
+ UserManager.getUser(), new Date());
+ }
+
+ public static void logMetrics(StateMachineArtifact sma, String percent, String hours, String stateName, User user, Date date) throws OseeCoreException {
+ LogItem logItem =
+ new LogItem(LogType.Metrics, date, user, stateName, String.format("Percent %s Hours %s", percent, hours));
+ sma.getSmaMgr().getLog().addLogItem(logItem);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XDecisionOptions.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XDecisionOptions.java
new file mode 100644
index 00000000000..18e4d52db9b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XDecisionOptions.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.ats.util.widgets;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XDecisionOptions {
+
+ protected final StateMachineArtifact sma;
+
+ public XDecisionOptions(StateMachineArtifact sma) {
+ this.sma = sma;
+ }
+
+ public DecisionOption getDecisionOption(String stateName, boolean create) throws OseeCoreException {
+ String decisionOptions =
+ sma.getSoleAttributeValue(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName(), "");
+ for (String decsionOpt : decisionOptions.split("\n")) {
+ DecisionOption state = new DecisionOption();
+ state.setFromXml(decsionOpt);
+ return state;
+ }
+ if (create) return new DecisionOption(stateName);
+ return null;
+ }
+
+ public Set<DecisionOption> getDecisionOptions() throws OseeCoreException {
+ String decString = sma.getSoleAttributeValue(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName(), "");
+ return getDecisionOptions(decString);
+ }
+
+ public Set<DecisionOption> getDecisionOptions(String decisionOptions) {
+ Set<DecisionOption> decOptions = new HashSet<DecisionOption>();
+ for (String decsionOpt : decisionOptions.split("\n")) {
+ DecisionOption state = new DecisionOption();
+ state.setFromXml(decsionOpt);
+ decOptions.add(state);
+ }
+ return decOptions;
+ }
+
+ public DecisionOption getDecisionOption(String name) throws OseeCoreException {
+ for (DecisionOption opt : getDecisionOptions()) {
+ if (opt.getName().equals(name)) return opt;
+ }
+ return null;
+ }
+
+ public Result validateDecisionOptions() throws OseeCoreException {
+ return validateDecisionOptions(sma.getSoleAttributeValue(
+ ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName(), ""));
+ }
+
+ public static Result validateDecisionOptions(String decisionOptions) {
+ for (String decsionOpt : decisionOptions.split("\n")) {
+ DecisionOption state = new DecisionOption();
+ Result result = state.setFromXml(decsionOpt);
+ if (result.isFalse()) return new Result("Invalid Decision Option \"" + decsionOpt + "\" " + result.getText());
+ }
+ return Result.TrueResult;
+ }
+
+ public String toXml(Set<DecisionOption> opts) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (DecisionOption opt : opts)
+ sb.append(opt.toXml() + "\n");
+ return sb.toString().replaceFirst("\n$", "");
+ }
+
+ public void setDecisionOptions(String decisionOptions) throws OseeCoreException {
+ sma.setSoleAttributeValue(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName(),
+ toXml(getDecisionOptions(decisionOptions)));
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XHyperlabelTeamDefinitionSelection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XHyperlabelTeamDefinitionSelection.java
new file mode 100644
index 00000000000..6192abc287d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XHyperlabelTeamDefinitionSelection.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.ats.util.widgets;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionTreeWithChildrenDialog;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelSelection;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XHyperlabelTeamDefinitionSelection extends XHyperlinkLabelSelection {
+
+ public static final String WIDGET_ID = XHyperlabelTeamDefinitionSelection.class.getSimpleName();
+ Set<TeamDefinitionArtifact> selectedTeamDefs = new HashSet<TeamDefinitionArtifact>();
+ Collection<TeamDefinitionArtifact> teamDefs;
+ TeamDefinitionTreeWithChildrenDialog dialog = null;
+
+ /**
+ * @param label
+ */
+ public XHyperlabelTeamDefinitionSelection(String label) {
+ super(label, true);
+ }
+
+ public Set<TeamDefinitionArtifact> getSelectedTeamDefintions() {
+ return selectedTeamDefs;
+ }
+
+ @Override
+ public String getCurrentValue() {
+ return Artifacts.commaArts(selectedTeamDefs);
+ }
+
+ public void setSelectedTeamDefs(Set<TeamDefinitionArtifact> selectedTeamDefs) {
+ this.selectedTeamDefs = selectedTeamDefs;
+ notifyXModifiedListeners();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelSelection#handleClear()
+ */
+ @Override
+ public boolean handleClear() {
+ selectedTeamDefs.clear();
+ notifyXModifiedListeners();
+ return true;
+ }
+
+ @Override
+ public boolean handleSelection() {
+ try {
+ if (teamDefs == null) {
+ dialog = new TeamDefinitionTreeWithChildrenDialog(Active.Active);
+ } else {
+ dialog = new TeamDefinitionTreeWithChildrenDialog(Active.Active, teamDefs);
+ }
+ int result = dialog.open();
+ if (result == 0) {
+ selectedTeamDefs.clear();
+ for (Object obj : dialog.getResultAndRecursedTeamDefs()) {
+ selectedTeamDefs.add((TeamDefinitionArtifact) obj);
+ }
+ notifyXModifiedListeners();
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ /**
+ * @param teamDefs the teamDefs to set
+ */
+ public void setTeamDefs(Collection<TeamDefinitionArtifact> teamDefs) {
+ this.teamDefs = teamDefs;
+ if (dialog != null) {
+ dialog.setInput(teamDefs);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateAssigneesDam.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateAssigneesDam.java
new file mode 100644
index 00000000000..c172d358c16
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateAssigneesDam.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.ats.util.widgets;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.ui.skynet.widgets.XTextDam;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XStateAssigneesDam extends XTextDam {
+
+ protected final String attributeTypeName;
+ protected final StateMachineArtifact sma;
+
+ public XStateAssigneesDam(StateMachineArtifact sma, String attributeName) {
+ super(attributeName);
+ this.sma = sma;
+ this.attributeTypeName = attributeName;
+ }
+
+ public SMAState getState(String stateName, boolean create) {
+ try {
+ for (String stateXml : sma.getAttributesToStringList(attributeTypeName)) {
+ if (stateXml.startsWith(stateName + ";")) {
+ SMAState state = new SMAState();
+ state.setFromXml(stateXml);
+ return state;
+ }
+ }
+ if (create) return new SMAState(stateName);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Error parsing state data for " + sma.getHumanReadableId(), ex);
+ }
+ return null;
+ }
+
+ public void updateMetrics(String stateName, double additionalHours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ SMAState currState = getState(stateName, false);
+ currState.setHoursSpent(currState.getHoursSpent() + additionalHours);
+ currState.setPercentComplete(percentComplete);
+ setState(currState);
+ if (logMetrics) {
+ XCurrentStateDam.logMetrics(sma, sma.getPercentCompleteSMATotal() + "",
+ AtsLib.doubleToStrString(sma.getHoursSpentSMATotal()), stateName, UserManager.getUser(),
+ new Date());
+ }
+ }
+
+ public void setMetrics(String stateName, double hours, int percentComplete, boolean logMetrics) throws OseeCoreException {
+ SMAState currState = getState(stateName, false);
+ currState.setHoursSpent(hours);
+ currState.setPercentComplete(percentComplete);
+ setState(currState);
+ if (logMetrics) {
+ XCurrentStateDam.logMetrics(sma, sma.getPercentCompleteSMATotal() + "",
+ AtsLib.doubleToStrString(sma.getHoursSpentSMATotal()), stateName, UserManager.getUser(),
+ new Date());
+ }
+ }
+
+ public Set<SMAState> getStates() {
+ Set<SMAState> states = new HashSet<SMAState>();
+ try {
+ for (String stateXml : sma.getAttributesToStringList(attributeTypeName)) {
+ SMAState state = new SMAState();
+ state.setFromXml(stateXml);
+ states.add(state);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Error parsing state data for " + sma.getHumanReadableId(), ex);
+ }
+ return states;
+ }
+
+ public void setState(SMAState state) throws OseeCoreException {
+ // Update attribute if it already exists
+ try {
+ Collection<Attribute<String>> attrs = sma.getAttributes(attributeTypeName);
+ for (Attribute<String> attr : attrs) {
+ SMAState storedState = new SMAState();
+ storedState.setFromXml(attr.getValue());
+ if (state.getName().equals(storedState.getName())) {
+ attr.setValue(state.toXml());
+ return;
+ }
+ }
+ // Else, doesn't exist yet, create
+ sma.addAttribute(attributeTypeName, state.toXml());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, "Error setting state data for " + sma.getHumanReadableId(), ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateDam.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateDam.java
new file mode 100644
index 00000000000..48a199651e5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XStateDam.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.ats.util.widgets;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XStateDam extends XStateAssigneesDam {
+
+ public XStateDam(StateMachineArtifact sma) {
+ super(sma, ATSAttributes.STATE_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWidgetProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWidgetProvider.java
new file mode 100644
index 00000000000..bad217a0e99
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWidgetProvider.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.ats.util.widgets;
+
+import org.eclipse.osee.ats.util.widgets.defect.XDefectViewer;
+import org.eclipse.osee.ats.util.widgets.role.XUserRoleViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XWidgetProvider implements IXWidgetProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider#createXWidget(java.lang.String, java.lang.String, boolean, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData)
+ */
+ public XWidget createXWidget(String widgetName, String name, DynamicXWidgetLayoutData widgetLayoutData) {
+
+ if (widgetName.equals("XDefectViewer")) {
+ return new XDefectViewer();
+ } else if (widgetName.equals("XUserRoleViewer")) {
+ return new XUserRoleViewer();
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWorkingBranch.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWorkingBranch.java
new file mode 100644
index 00000000000..6d1bff6618e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/XWorkingBranch.java
@@ -0,0 +1,372 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.IBranchArtifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Megumi Telles
+ */
+public class XWorkingBranch extends XWidget implements IArtifactWidget, IFrameworkTransactionEventListener, IBranchEventListener {
+
+ private Artifact artifact;
+ private SMAManager smaMgr;
+ private Button createBranchButton;
+ private Button showArtifactExplorer;
+ private Button showChangeReport;
+ private Button purgeBranchButton;
+ public static enum BranchStatus {
+ Not_Started, Changes_InProgress, Changes_NotPermitted
+ }
+ public final static String WIDGET_ID = ATSAttributes.WORKING_BRANCH_WIDGET.getStoreName();
+
+ public XWorkingBranch() {
+ super("Working Branch", "");
+ OseeEventManager.addListener(this);
+ }
+
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ setSMAMgr();
+ if (horizontalSpan < 2) horizontalSpan = 2;
+ if (!getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ": " + getWorkingBranchShortName() + " " + getStatus());
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite bComp = new Composite(parent, SWT.NONE);
+ bComp.setLayout(new GridLayout(4, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ if (toolkit != null) toolkit.adapt(bComp);
+
+ if (toolkit != null)
+ createBranchButton = toolkit.createButton(bComp, null, SWT.PUSH);
+ else
+ createBranchButton = new Button(bComp, SWT.PUSH);
+ if (getWorkingBranch() != null) createBranchButton.setEnabled(false);
+ createBranchButton.setToolTipText("Create Working Branch");
+ createBranchButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ smaMgr.getBranchMgr().createWorkingBranch(null, true);
+ }
+ });
+
+ if (toolkit != null)
+ showArtifactExplorer = toolkit.createButton(bComp, null, SWT.PUSH);
+ else
+ showArtifactExplorer = new Button(bComp, SWT.PUSH);
+ if (getWorkingBranch() == null) showArtifactExplorer.setEnabled(false);
+ showArtifactExplorer.setToolTipText("Show Artifact Explorer");
+ showArtifactExplorer.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ ArtifactExplorer.exploreBranch(getWorkingBranch());
+ }
+ });
+
+ if (toolkit != null)
+ showChangeReport = toolkit.createButton(bComp, null, SWT.PUSH);
+ else
+ showChangeReport = new Button(bComp, SWT.PUSH);
+ if (getWorkingBranch() == null) showChangeReport.setEnabled(false);
+ showChangeReport.setToolTipText("Show Change Report");
+ showChangeReport.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ smaMgr.getBranchMgr().showChangeReport();
+ }
+ });
+
+ if (toolkit != null)
+ purgeBranchButton = toolkit.createButton(bComp, null, SWT.PUSH);
+ else
+ purgeBranchButton = new Button(bComp, SWT.PUSH);
+ if (getWorkingBranch() == null) purgeBranchButton.setEnabled(false);
+ purgeBranchButton.setToolTipText("Delete Working Branch");
+ purgeBranchButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ smaMgr.getBranchMgr().deleteWorkingBranch(true);
+ refresh();
+ }
+ });
+
+ if (AtsPlugin.getInstance() != null) {
+ createBranchButton.setImage(ImageManager.getImage(FrameworkImage.BRANCH));
+ purgeBranchButton.setImage(ImageManager.getImage(FrameworkImage.TRASH));
+ }
+ if (SkynetGuiPlugin.getInstance() != null) {
+ showArtifactExplorer.setImage(ImageManager.getImage(FrameworkImage.ARTIFACT_EXPLORER));
+ showChangeReport.setImage(ImageManager.getImage(FrameworkImage.BRANCH_CHANGE));
+ }
+ refresh();
+ }
+
+ private void setSMAMgr() {
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ smaMgr = ((TeamWorkFlowArtifact) artifact).getSmaMgr();
+ }
+ }
+
+ private Branch getWorkingBranch() {
+ try {
+ return ((IBranchArtifact) artifact).getWorkingBranch();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ return null;
+ }
+ }
+
+ private String getWorkingBranchShortName() {
+ if (getWorkingBranch() != null) {
+ return getWorkingBranch().getBranchShortName();
+ }
+ return "";
+ }
+
+ public String getStatus() {
+ try {
+ if (smaMgr != null && smaMgr.getBranchMgr().isWorkingBranchArchived()) {
+ return BranchStatus.Changes_NotPermitted.name();
+ } else if (smaMgr != null && smaMgr.getBranchMgr().isWorkingBranchEverCommitted()) {
+ return BranchStatus.Changes_NotPermitted.name();
+ } else if (smaMgr != null && smaMgr.getBranchMgr().isWorkingBranchInWork()) {
+ return BranchStatus.Changes_InProgress.name();
+ } else {
+ return BranchStatus.Not_Started.name();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ return "";
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return labelWidget;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ // Need this cause it removes all error items of this namespace
+ return new Status(IStatus.OK, getClass().getSimpleName(), "");
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ if (labelWidget == null || labelWidget.isDisposed()) {
+ return;
+ }
+ labelWidget.setText(getLabel() + ": " + getWorkingBranchShortName() + " " + getStatus());
+ try {
+ if (smaMgr != null && smaMgr.getBranchMgr() != null) {
+ if (createBranchButton != null) {
+ createBranchButton.setEnabled(!smaMgr.getBranchMgr().isWorkingBranchInWork() && !smaMgr.getBranchMgr().isCommittedBranchExists());
+ }
+ if (showArtifactExplorer != null) {
+ if (getWorkingBranch() == null)
+ showArtifactExplorer.setEnabled(false);
+ else {
+ if (getStatus().equals(BranchStatus.Changes_NotPermitted.name())) {
+ showArtifactExplorer.setEnabled(false);
+ } else
+ showArtifactExplorer.setEnabled(true);
+ }
+ }
+ if (showChangeReport != null) {
+ if (smaMgr.getBranchMgr().isWorkingBranchInWork() || smaMgr.getBranchMgr().isCommittedBranchExists())
+ showChangeReport.setEnabled(true);
+ else
+ showChangeReport.setEnabled(false);
+ }
+ if (purgeBranchButton != null) {
+ purgeBranchButton.setEnabled(smaMgr.getBranchMgr().isWorkingBranchInWork() && !smaMgr.getBranchMgr().isCommittedBranchExists());
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#setArtifact(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String)
+ */
+ @Override
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.BranchEventType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.skynet.core.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+ }
+
+ public Button getCreateBranchButton() {
+ return createBranchButton;
+ }
+
+ public Button getShowArtifactExplorerButton() {
+ return showArtifactExplorer;
+ }
+
+ public Button getShowChangeReportButton() {
+ return showChangeReport;
+ }
+
+ public Button getDeleteBranchButton() {
+ return purgeBranchButton;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitStatus.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitStatus.java
new file mode 100644
index 00000000000..2b1a53f9fac
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitStatus.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.ats.util.widgets.commit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum CommitStatus {
+ Working_Branch_Not_Created("Working Branch Not Created"),
+ Branch_Not_Configured("Branch Not Configured"),
+ Branch_Commit_Disabled("Branch Commit Disabled"),
+ Commit_Needed("Start Commit"),
+ Merge_In_Progress("Merge in Progress"),
+ Committed("Committed"),
+ Committed_With_Merge("Committed With Merge");
+
+ private final String displayName;
+
+ private CommitStatus(String displayName) {
+ this.displayName = displayName;
+ }
+
+ /**
+ * @return the displayName
+ */
+ public String getDisplayName() {
+ return displayName;
+ }
+};
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManager.java
new file mode 100644
index 00000000000..a441afcafdb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManager.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.ats.util.widgets.commit;
+
+import java.util.ArrayList;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CommitXManager extends XViewer {
+
+ private final XCommitManager xCommitManager;
+
+ public CommitXManager(Composite parent, int style, XCommitManager xRoleViewer) {
+ super(parent, style, new CommitXManagerFactory());
+ this.xCommitManager = xRoleViewer;
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ getLabelProvider().dispose();
+ }
+
+ public ArrayList<ICommitConfigArtifact> getSelectedConfigArtifacts() {
+ ArrayList<ICommitConfigArtifact> arts = new ArrayList<ICommitConfigArtifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((ICommitConfigArtifact) item.getData());
+ return arts;
+ }
+
+ /**
+ * @return the xUserRoleViewer
+ */
+ public XCommitManager getXCommitViewer() {
+ return xCommitManager;
+ }
+
+ /**
+ * @return the workingBranch
+ */
+ public Branch getWorkingBranch() throws OseeCoreException {
+ return xCommitManager.getWorkingBranch();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewer#handleDoubleClick()
+ */
+ @Override
+ public void handleDoubleClick() {
+ try {
+ ICommitConfigArtifact configArt = getSelectedConfigArtifacts().iterator().next();
+ Branch destBranch = configArt.getParentBranch();
+ CommitStatus commitStatus = xCommitManager.getTeamArt().getSmaMgr().getBranchMgr().getCommitStatus(configArt);
+ if (commitStatus == CommitStatus.Working_Branch_Not_Created) {
+ AWorkbench.popup(commitStatus.getDisplayName(), "Need to create a working branch");
+ } else if (commitStatus == CommitStatus.Branch_Not_Configured) {
+ AWorkbench.popup(commitStatus.getDisplayName(),
+ "Talk to project lead to configure branch for version [" + configArt + "]");
+ } else if (commitStatus == CommitStatus.Branch_Commit_Disabled) {
+ AWorkbench.popup(commitStatus.getDisplayName(),
+ "Talk to project lead as to why commit disabled for version [" + configArt + "]");
+ } else if (commitStatus == CommitStatus.Commit_Needed) {
+ destBranch = configArt.getParentBranch();
+ xCommitManager.getTeamArt().getSmaMgr().getBranchMgr().commitWorkingBranch(true, false, destBranch, true);
+ } else if (commitStatus == CommitStatus.Merge_In_Progress) {
+ destBranch = configArt.getParentBranch();
+ xCommitManager.getTeamArt().getSmaMgr().getBranchMgr().commitWorkingBranch(true, false, destBranch, true);
+ } else if (commitStatus == CommitStatus.Committed) {
+ xCommitManager.getTeamArt().getSmaMgr().getBranchMgr().showChangeReportForBranch(destBranch);
+ } else if (commitStatus == CommitStatus.Committed_With_Merge) {
+ destBranch = configArt.getParentBranch();
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Select Report", null,
+ "Both Change Report and Merge Manager exist.\n\nSelect to open.", MessageDialog.QUESTION,
+ new String[] {"Show Change Report", "Show Merge Manager", "Cancel"}, 0);
+ int result = dialog.open();
+ if (result == 2) return;
+ // change report
+ if (result == 0) {
+ xCommitManager.getTeamArt().getSmaMgr().getBranchMgr().showChangeReportForBranch(destBranch);
+ }
+ // merge manager
+ else {
+ xCommitManager.getTeamArt().getSmaMgr().getBranchMgr().showMergeManager(destBranch);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManagerFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManagerFactory.java
new file mode 100644
index 00000000000..362bf07c019
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/CommitXManagerFactory.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.commit;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CommitXManagerFactory extends SkynetXViewerFactory {
+
+ public static XViewerColumn Empty_Col =
+ new XViewerColumn("osee.commit.empty", "Empty", 0, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Action_Col =
+ new XViewerColumn("osee.commit.action", "Action", 180, SWT.LEFT, true, SortDataType.String, false,
+ "Provides the action(s) available. Double click row to perform action.");
+ public static XViewerColumn Status_Col =
+ new XViewerColumn("osee.commit.status", "Status", 180, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Merge_Col =
+ new XViewerColumn("osee.commit.merge", "Merge Branch Exists", 30, SWT.LEFT, true, SortDataType.String, false,
+ "Will show merge icon if merge branch exists");
+ public static XViewerColumn Dest_Branch_Col =
+ new XViewerColumn("osee.commit.name", "Destination Branch", 450, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn Version_Col =
+ new XViewerColumn("osee.commit.shortName", "Destination Version", 200, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Configuring_Object_Col =
+ new XViewerColumn("osee.commit.configObj", "Configuring Object", 200, SWT.LEFT, true, SortDataType.String,
+ false, null);
+
+ public CommitXManagerFactory() {
+ super("osee.skynet.gui.CommitXViewer");
+ registerColumn(Empty_Col, Action_Col, Status_Col, Merge_Col, Dest_Branch_Col, Version_Col, Configuring_Object_Col);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isFilterUiAvailable()
+ */
+ @Override
+ public boolean isFilterUiAvailable() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isHeaderBarAvailable()
+ */
+ @Override
+ public boolean isHeaderBarAvailable() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isLoadedStatusLabelAvailable()
+ */
+ @Override
+ public boolean isLoadedStatusLabelAvailable() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.customize.IXViewerFactory#isSearchUiAvailable()
+ */
+ @Override
+ public boolean isSearchUiAvailable() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/ICommitConfigArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/ICommitConfigArtifact.java
new file mode 100644
index 00000000000..67ab21e52a1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/ICommitConfigArtifact.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.ats.util.widgets.commit;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface ICommitConfigArtifact {
+
+ public Branch getParentBranch() throws OseeCoreException;
+
+ public Result isCommitBranchAllowed() throws OseeCoreException;
+
+ public Result isCreateBranchAllowed() throws OseeCoreException;
+
+ public String getFullDisplayName() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitContentProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitContentProvider.java
new file mode 100644
index 00000000000..bb8e63d98a9
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitContentProvider.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.ats.util.widgets.commit;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public class XCommitContentProvider implements ITreeContentProvider {
+
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public XCommitContentProvider(CommitXManager commitXManager) {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) {
+ return (Object[]) parentElement;
+ }
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitLabelProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitLabelProvider.java
new file mode 100644
index 00000000000..c604f2e7a33
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitLabelProvider.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.ats.util.widgets.commit;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+public class XCommitLabelProvider extends XViewerLabelProvider {
+ Font font = null;
+
+ private final CommitXManager commitXManager;
+
+ public XCommitLabelProvider(CommitXManager commitXManager) {
+ super(commitXManager);
+ this.commitXManager = commitXManager;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException {
+ ICommitConfigArtifact configArt = (ICommitConfigArtifact) element;
+ Branch branch = configArt.getParentBranch();
+ if (xCol.equals(CommitXManagerFactory.Action_Col)) {
+ return ImageManager.getImage(FrameworkImage.ARROW_RIGHT_YELLOW);
+ }
+ if (branch == null) return null;
+ if (xCol.equals(CommitXManagerFactory.Status_Col)) {
+ try {
+ CommitStatus commitStatus =
+ commitXManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr().getCommitStatus(configArt);
+ if (commitStatus == CommitStatus.Branch_Not_Configured ||
+ //
+ commitStatus == CommitStatus.Branch_Commit_Disabled ||
+ //
+ commitStatus == CommitStatus.Commit_Needed ||
+ //
+ commitStatus == CommitStatus.Working_Branch_Not_Created) {
+ return ImageManager.getImage(FrameworkImage.DOT_RED);
+ }
+
+ if (commitStatus == CommitStatus.Merge_In_Progress) {
+ return ImageManager.getImage(FrameworkImage.DOT_YELLOW);
+ }
+
+ if (commitStatus == CommitStatus.Committed ||
+ //
+ commitStatus == CommitStatus.Committed_With_Merge) {
+ return ImageManager.getImage(FrameworkImage.DOT_GREEN);
+ }
+ return null;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (xCol.equals(CommitXManagerFactory.Merge_Col)) {
+ try {
+ CommitStatus commitStatus =
+ commitXManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr().getCommitStatus(configArt);
+ if (commitStatus == CommitStatus.Merge_In_Progress || commitStatus == CommitStatus.Committed_With_Merge) {
+ return ImageManager.getImage(FrameworkImage.OUTGOING_MERGED);
+ }
+ return null;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException {
+ ICommitConfigArtifact configArt = (ICommitConfigArtifact) element;
+ Branch branch = configArt.getParentBranch();
+
+ if (xCol.equals(CommitXManagerFactory.Status_Col)) {
+ return commitXManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr().getCommitStatus(configArt).getDisplayName();
+ } else if (xCol.equals(CommitXManagerFactory.Merge_Col)) {
+ return "";
+ } else if (xCol.equals(CommitXManagerFactory.Version_Col)) {
+ return ((Artifact) element).getDescriptiveName();
+ } else if (xCol.equals(CommitXManagerFactory.Configuring_Object_Col)) {
+ return ((Artifact) element).getArtifactTypeName();
+ } else if (xCol.equals(CommitXManagerFactory.Dest_Branch_Col)) {
+ if (element instanceof VersionArtifact) {
+ return (branch == null ? "Parent Branch Not Configured for Version [" + (element) + "]" : branch.getBranchShortName());
+ } else if (element instanceof TeamDefinitionArtifact) {
+ return (branch == null ? "Parent Branch Not Configured for Team Definition [" + (element) + "]" : branch.getBranchShortName());
+ }
+ } else if (xCol.equals(CommitXManagerFactory.Action_Col)) {
+ CommitStatus commitStatus =
+ commitXManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr().getCommitStatus(configArt);
+ if (commitStatus == CommitStatus.Branch_Not_Configured)
+ return "Configure Branch";
+ else if (commitStatus == CommitStatus.Branch_Commit_Disabled)
+ return "Enable Branch Commit";
+ else if (commitStatus == CommitStatus.Commit_Needed)
+ return "Start Commit";
+ else if (commitStatus == CommitStatus.Merge_In_Progress)
+ return "Merge Conflicts and Commit";
+ else if (commitStatus == CommitStatus.Committed)
+ return "Show Change Report";
+ else if (commitStatus == CommitStatus.Committed_With_Merge)
+ return "Show Change/Merge Report";
+ else if (commitStatus == CommitStatus.Working_Branch_Not_Created) return "Working Branch Not Created";
+ return "Error: Need to handle this";
+ }
+ return "unhandled column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public CommitXManager getTreeViewer() {
+ return commitXManager;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitManager.java
new file mode 100644
index 00000000000..c44330e20f8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/commit/XCommitManager.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.ats.util.widgets.commit;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IMergeBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.MergeBranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.IBranchArtifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+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;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XCommitManager extends XWidget implements IArtifactWidget, IMergeBranchEventListener, IBranchEventListener {
+
+ private CommitXManager xCommitManager;
+ private IDirtiableEditor editor;
+ public final static String normalColor = "#EEEEEE";
+ private TeamWorkFlowArtifact teamArt;
+ private final int paddedTableHeightHint = 2;
+ private Label extraInfoLabel;
+ public final static String WIDGET_ID = ATSAttributes.COMMIT_MANAGER_WIDGET.getStoreName();
+
+ /**
+ * @param label
+ */
+ public XCommitManager() {
+ super("Commit Manager");
+ OseeEventManager.addListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createWidgets(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ try {
+ if (!teamArt.getSmaMgr().getBranchMgr().isWorkingBranchInWork() && !teamArt.getSmaMgr().getBranchMgr().isCommittedBranchExists()) {
+ labelWidget.setText(getLabel() + ": No working or committed branches available.");
+ } else {
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ if (toolkit != null) toolkit.paintBordersFor(mainComp);
+
+ createTaskActionBar(mainComp);
+
+ labelWidget.setText(getLabel() + ": ");// If ATS Admin, allow right-click to auto-complete reviews
+ if (AtsPlugin.isAtsAdmin() && !AtsPlugin.isProductionDb()) {
+ labelWidget.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Auto Commit Branches",
+ "ATS Admin\n\nAuto Commit Branches?")) {
+ return;
+ }
+ try {
+ for (Branch destinationBranch : teamArt.getSmaMgr().getBranchMgr().getBranchesLeftToCommit()) {
+ teamArt.getSmaMgr().getBranchMgr().commitWorkingBranch(false, true, destinationBranch,
+ true);
+ Thread.sleep(1000);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ }
+
+ xCommitManager = new CommitXManager(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ xCommitManager.getTree().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ xCommitManager.setContentProvider(new XCommitContentProvider(xCommitManager));
+ xCommitManager.setLabelProvider(new XCommitLabelProvider(xCommitManager));
+ xCommitManager.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ refreshActionEnablement();
+ }
+ });
+
+ if (toolkit != null && xCommitManager.getStatusLabel() != null) toolkit.adapt(
+ xCommitManager.getStatusLabel(), false, false);
+
+ setXviewerTree();
+
+ loadTable();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void refreshActionEnablement() {
+ }
+
+ public void setXviewerTree() {
+ Tree tree = xCommitManager.getTree();
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ int defectListSize = xCommitManager.getTree().getItemCount();
+ int treeItemHeight = xCommitManager.getTree().getItemHeight();
+ gridData.heightHint = treeItemHeight * (paddedTableHeightHint + defectListSize);
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ }
+
+ public void createTaskActionBar(Composite parent) {
+
+ // Button composite for state transitions, etc
+ Composite bComp = new Composite(parent, SWT.NONE);
+ // bComp.setBackground(mainSComp.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ bComp.setLayout(new GridLayout(2, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite leftComp = new Composite(bComp, SWT.NONE);
+ leftComp.setLayout(new GridLayout());
+ leftComp.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(leftComp, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+ Composite rightComp = new Composite(bComp, SWT.NONE);
+ rightComp.setLayout(new GridLayout());
+ rightComp.setLayoutData(new GridData(GridData.END));
+
+ ToolBar toolBar = new ToolBar(rightComp, SWT.FLAT | SWT.RIGHT);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ toolBar.setLayoutData(gd);
+ ToolItem item = null;
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ loadTable();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(AtsImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xCommitManager.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ refreshActionEnablement();
+ }
+
+ public void loadTable() {
+ try {
+ if (xCommitManager != null && teamArt != null && (teamArt instanceof TeamWorkFlowArtifact) && xCommitManager.getContentProvider() != null) {
+ Collection<ICommitConfigArtifact> configArtSet =
+ teamArt.getSmaMgr().getBranchMgr().getConfigArtifactsConfiguredToCommitTo();
+ xCommitManager.setInput(configArtSet);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ refresh();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<Branch> getSelectedBranches() {
+ ArrayList<Branch> items = new ArrayList<Branch>();
+ if (xCommitManager == null) return items;
+ if (xCommitManager.getSelection().isEmpty()) return items;
+ Iterator i = ((IStructuredSelection) xCommitManager.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ items.add((Branch) obj);
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ if (xCommitManager == null) return null;
+ return xCommitManager.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ if (xCommitManager != null) xCommitManager.dispose();
+ OseeEventManager.removeListener(this);
+ }
+
+ @Override
+ public void setFocus() {
+ if (xCommitManager != null) xCommitManager.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ if (xCommitManager == null || xCommitManager.getTree() == null || xCommitManager.getTree().isDisposed()) return;
+ xCommitManager.refresh();
+ validate();
+ refreshActionEnablement();
+ setXviewerTree();
+ }
+
+ @Override
+ public IStatus isValid() {
+ try {
+ if (xCommitManager != null && xCommitManager.getXCommitViewer() != null && xCommitManager.getXCommitViewer().getTeamArt() != null && xCommitManager.getXCommitViewer().getTeamArt().getSmaMgr() != null && xCommitManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr() != null) {
+ if (!xCommitManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr().isAllObjectsToCommitToConfigured()) {
+ extraInfoLabel.setText("All branches must be configured and committed - Double-click item to perform Action");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ return new Status(IStatus.ERROR, getClass().getSimpleName(),
+ "All branches must be configured and committed.");
+ }
+ if (!xCommitManager.getXCommitViewer().getTeamArt().getSmaMgr().getBranchMgr().isBranchesAllCommitted()) {
+ extraInfoLabel.setText("All branches must be committed - Double-click item to perform Action");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ return new Status(IStatus.ERROR, getClass().getSimpleName(), "All branches must be committed.");
+ }
+ extraInfoLabel.setText("Double-click item to perform Action");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return new Status(IStatus.OK, getClass().getSimpleName(), "");
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.simplePage("Unhandled");
+ }
+
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public CommitXManager getXViewer() {
+ return xCommitManager;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return xCommitManager.getInput();
+ }
+
+ public IDirtiableEditor getEditor() {
+ return editor;
+ }
+
+ public void setEditor(IDirtiableEditor editor) {
+ this.editor = editor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IDamWidget#setArtifact(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String)
+ */
+ public void setArtifact(Artifact artifact, String attrName) throws IllegalStateException {
+ if (!(artifact instanceof TeamWorkFlowArtifact)) {
+ throw new IllegalStateException("Must be TeamWorkflowArtifact, set was a " + artifact.getArtifactTypeName());
+ }
+ this.teamArt = (TeamWorkFlowArtifact) artifact;
+ loadTable();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ return Result.FalseResult;
+ }
+
+ public Branch getWorkingBranch() throws OseeCoreException {
+ return ((IBranchArtifact) teamArt).getWorkingBranch();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ }
+
+ /**
+ * @return the artifact
+ */
+ public TeamWorkFlowArtifact getTeamArt() {
+ return teamArt;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.BranchEventType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ loadTable();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.skynet.core.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IMergeBranchEventListener#handleMergeBranchEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.MergeBranchEventType, int)
+ */
+ @Override
+ public void handleMergeBranchEvent(Sender sender, MergeBranchEventType branchModType, int branchId) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getErrorMessageControl()
+ */
+ @Override
+ public Control getErrorMessageControl() {
+ return labelWidget;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectContentProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectContentProvider.java
new file mode 100644
index 00000000000..489b7e113ea
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectContentProvider.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.ats.util.widgets.defect;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetGuiDebug;
+
+public class DefectContentProvider implements ITreeContentProvider {
+
+ protected Collection<DefectItem> rootSet = new HashSet<DefectItem>();
+ private final DefectXViewer xViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ private SkynetGuiDebug debug = new SkynetGuiDebug(false, "DefectContentProvider");
+
+ public DefectContentProvider(DefectXViewer WorldXViewer) {
+ super();
+ this.xViewer = WorldXViewer;
+ }
+
+ public void add(final DefectItem item) {
+ add(Arrays.asList(item));
+ }
+
+ public void add(final Collection<? extends DefectItem> items) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.addAll(items);
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void set(final Collection<? extends DefectItem> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ clear();
+ add(arts);
+ };
+ });
+ }
+
+ public void remove(final Artifact art) {
+ remove(Arrays.asList(art));
+ }
+
+ public void remove(final Collection<? extends Artifact> arts) {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ ArrayList<DefectItem> delItems = new ArrayList<DefectItem>();
+ delItems.addAll(rootSet);
+ for (Artifact art : arts) {
+ for (DefectItem wai : rootSet)
+ if (wai.equals(art)) delItems.add(wai);
+ }
+ removeItems(delItems);
+ }
+
+ public void removeItems(final Collection<? extends DefectItem> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.remove(arts);
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void clear() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.clear();
+ xViewer.refresh();
+ };
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) {
+ return (Object[]) parentElement;
+ }
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ debug.report("getParent");
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ debug.report("hasChildren");
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ debug.report("getElements");
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the rootSet
+ */
+ public Collection<DefectItem> getRootSet() {
+ return rootSet;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectItem.java
new file mode 100644
index 00000000000..d01215145cc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectItem.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.ats.util.widgets.defect;
+
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefectItem {
+
+ private Date date = new Date();
+ private String description = "";
+ private String location = "";
+ private String resolution = "";
+ private User user;
+ private String guid = GUID.generateGuidStr();
+ private Severity severity = Severity.None;
+ private Disposition disposition = Disposition.None;
+ private InjectionActivity injectionActivity = InjectionActivity.None;
+ private boolean closed = false;
+ public static enum Severity {
+ None, Major, Minor, Issue;
+ public static Collection<String> strValues() {
+ Set<String> values = new HashSet<String>();
+ for (Enum<Severity> e : values()) {
+ values.add(e.name());
+ }
+ return values;
+ }
+
+ public static Image getImage(Severity sev) {
+ if (sev == Major)
+ return ImageManager.getImage(FrameworkImage.SEVERITY_MAJOR);
+ else if (sev == Minor)
+ return ImageManager.getImage(FrameworkImage.SEVERITY_MINOR);
+ else if (sev == Issue) return ImageManager.getImage(FrameworkImage.SEVERITY_ISSUE);
+ return null;
+ }
+ };
+
+ public DefectItem() throws OseeCoreException {
+ user = UserManager.getUser();
+ }
+
+ public DefectItem(User user, Severity severity, Disposition disposition, InjectionActivity injectionActivity, String description, String resolution, String location, Date date) {
+ this.user = user;
+ if (severity != null) this.severity = severity;
+ if (disposition != null) this.disposition = disposition;
+ if (injectionActivity != null) this.injectionActivity = injectionActivity;
+ if (description != null) this.description = description;
+ if (resolution != null) this.resolution = resolution;
+ if (location != null) this.location = location;
+ if (date != null) this.date = date;
+ }
+
+ public DefectItem(String xml) throws OseeCoreException {
+ fromXml(xml);
+ }
+
+ public void update(DefectItem dItem) throws OseeCoreException {
+ fromXml(dItem.toXml());
+ }
+
+ public static enum Disposition {
+ None, Accept, Reject, Duplicate;
+ public static Collection<String> strValues() {
+ Set<String> values = new HashSet<String>();
+ for (Enum<Disposition> e : values()) {
+ values.add(e.name());
+ }
+ return values;
+ }
+
+ public static Image getImage(Disposition sev) {
+ if (sev == Accept)
+ return ImageManager.getImage(FrameworkImage.ACCEPT);
+ else if (sev == Reject)
+ return ImageManager.getImage(FrameworkImage.REJECT);
+ else if (sev == Duplicate) return ImageManager.getImage(FrameworkImage.DUPLICATE);
+ return null;
+ }
+ };
+ public static enum InjectionActivity {
+ None,
+ Planning,
+ System_Level_Requirements,
+ System_Design,
+ Software_Requirements,
+ Software_Design,
+ Code,
+ Test,
+ Other;
+ public static Collection<String> strValues() {
+ Set<String> values = new HashSet<String>();
+ for (Enum<InjectionActivity> e : values()) {
+ values.add(e.name());
+ }
+ return values;
+ }
+ };
+
+ public String getDate(String pattern) {
+ if (pattern != null) return (new SimpleDateFormat(pattern)).format(date);
+ return date.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof DefectItem) {
+ DefectItem di = (DefectItem) obj;
+ return di.guid.equals(getGuid());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return guid.hashCode();
+ }
+
+ public String toXml() throws OseeCoreException {
+ return "<severity>" + severity.name() + "</severity><disposition>" + disposition.name() +
+ //
+ "</disposition><injectionActivity>" + injectionActivity.name() + "</injectionActivity><date>" + date.getTime() +
+ //
+ "</date><user>" + user.getUserId() + "</user><description>" + description + "</description><location>" + location +
+ //
+ "</location><resolution>" + resolution + "</resolution><closed>" + closed + "</closed><guid>" + guid + "</guid>";
+ }
+
+ private void fromXml(String xml) throws OseeCoreException {
+ this.severity = Severity.valueOf(AXml.getTagData(xml, "severity"));
+ this.disposition = Disposition.valueOf(AXml.getTagData(xml, "disposition"));
+ this.injectionActivity = InjectionActivity.valueOf(AXml.getTagData(xml, "injectionActivity"));
+ Date date = new Date();
+ date.setTime(new Long(AXml.getTagData(xml, "date")));
+ this.date = date;
+ this.user = UserManager.getUserByUserId(AXml.getTagData(xml, "user"));
+ this.description = AXml.getTagData(xml, "description");
+ this.location = AXml.getTagData(xml, "location");
+ this.resolution = AXml.getTagData(xml, "resolution");
+ this.closed = AXml.getTagBooleanData(xml, "closed");
+ this.guid = AXml.getTagData(xml, "guid");
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public String getCreatedDate(String pattern) {
+ if (pattern != null) return (new SimpleDateFormat(pattern)).format(date);
+ return date.toString();
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ @Override
+ public String toString() {
+ return severity + " - " + disposition + " - " + injectionActivity + " - " + user + " on " + getCreatedDate(XDate.MMDDYYHHMM) + "\n";
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public String toHTML(String labelFont) {
+ return "DEFECT (" + severity + "): " + description + " (" + user.getName() + ")";
+ }
+
+ /**
+ * @param user The user to set.
+ */
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public String getResolution() {
+ return resolution;
+ }
+
+ public void setResolution(String resolution) {
+ this.resolution = resolution;
+ }
+
+ public Severity getSeverity() {
+ return severity;
+ }
+
+ public void setSeverity(Severity severity) {
+ this.severity = severity;
+ }
+
+ public Disposition getDisposition() {
+ return disposition;
+ }
+
+ public void setDisposition(Disposition disposition) {
+ this.disposition = disposition;
+ }
+
+ public InjectionActivity getInjectionActivity() {
+ return injectionActivity;
+ }
+
+ public void setInjectionActivity(InjectionActivity injectionActivity) {
+ this.injectionActivity = injectionActivity;
+ }
+
+ public boolean isClosed() {
+ return closed;
+ }
+
+ public void setClosed(boolean closed) {
+ this.closed = closed;
+ }
+
+ /**
+ * @return the guid
+ */
+ public String getGuid() {
+ return guid;
+ }
+
+ /**
+ * @param guid the guid to set
+ */
+ public void setGuid(String guid) {
+ this.guid = guid;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectLabelProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectLabelProvider.java
new file mode 100644
index 00000000000..f985ca98c2f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectLabelProvider.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.ats.util.widgets.defect;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Disposition;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.InjectionActivity;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+public class DefectLabelProvider extends XViewerLabelProvider {
+ Font font = null;
+
+ private final DefectXViewer xViewer;
+
+ public DefectLabelProvider(DefectXViewer xViewer) {
+ super(xViewer);
+ this.xViewer = xViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn dCol, int columnIndex) throws OseeCoreException {
+ DefectItem defectItem = (DefectItem) element;
+ if (dCol.equals(DefectXViewerFactory.Severity_Col))
+ return Severity.getImage(defectItem.getSeverity());
+ else if (dCol.equals(DefectXViewerFactory.Injection_Activity_Col))
+ return ImageManager.getImage(FrameworkImage.INFO_SM);
+ else if (dCol.equals(DefectXViewerFactory.Disposition_Col))
+ return Disposition.getImage(defectItem.getDisposition());
+ else if (dCol.equals(DefectXViewerFactory.Closed_Col)) {
+ return defectItem.isClosed() ? ImageManager.getImage(FrameworkImage.CHECKBOX_ENABLED) : ImageManager.getImage(FrameworkImage.CHECKBOX_DISABLED);
+ } else if (dCol.equals(DefectXViewerFactory.User_Col)) {
+ return ImageManager.getImage(defectItem.getUser());
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn aCol, int columnIndex) throws OseeCoreException {
+ DefectItem defectItem = (DefectItem) element;
+ if (aCol.equals(DefectXViewerFactory.User_Col))
+ return defectItem.getUser().getName();
+ else if (aCol.equals(DefectXViewerFactory.Closed_Col))
+ return String.valueOf(defectItem.isClosed());
+ else if (aCol.equals(DefectXViewerFactory.Created_Date_Col))
+ return defectItem.getCreatedDate(XDate.MMDDYYHHMM);
+ else if (aCol.equals(DefectXViewerFactory.Description_Col))
+ return defectItem.getDescription();
+ else if (aCol.equals(DefectXViewerFactory.Resolution_Col))
+ return defectItem.getResolution();
+ else if (aCol.equals(DefectXViewerFactory.Location_Col))
+ return defectItem.getLocation();
+ else if (aCol.equals(DefectXViewerFactory.Severity_Col))
+ return defectItem.getSeverity().equals(Severity.None) ? "" : defectItem.getSeverity().name();
+ else if (aCol.equals(DefectXViewerFactory.Disposition_Col))
+ return defectItem.getDisposition().equals(Disposition.None) ? "" : defectItem.getDisposition().name();
+ else if (aCol.equals(DefectXViewerFactory.Injection_Activity_Col)) return defectItem.getInjectionActivity() == InjectionActivity.None ? "" : defectItem.getInjectionActivity().name();
+
+ return "Unhandled Column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public DefectXViewer getTreeViewer() {
+ return xViewer;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectManager.java
new file mode 100644
index 00000000000..ae680ee2b6e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectManager.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.defect;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefectManager {
+
+ private final Artifact artifact;
+ private boolean enabled = true;
+ private static String DEFECT_ITEM_TAG = "Item";
+ private static String REVIEW_DEFECT_ATTRIBUTE_NAME = "ats.Review Defect";
+ private final Matcher defectMatcher =
+ java.util.regex.Pattern.compile("<" + DEFECT_ITEM_TAG + ">(.*?)</" + DEFECT_ITEM_TAG + ">",
+ Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+
+ public DefectManager(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ public String getHtml() throws OseeCoreException {
+ if (getDefectItems().size() == 0) return "";
+ StringBuffer sb = new StringBuffer();
+ sb.append(AHTML.addSpace(1) + AHTML.getLabelStr(AHTML.LABEL_FONT, "Defects"));
+ sb.append(getTable());
+ return sb.toString();
+ }
+
+ public Set<DefectItem> getDefectItems() throws OseeCoreException {
+ Set<DefectItem> defectItems = new HashSet<DefectItem>();
+ for (String xml : artifact.getAttributesToStringList(REVIEW_DEFECT_ATTRIBUTE_NAME)) {
+ defectMatcher.reset(xml);
+ while (defectMatcher.find()) {
+ DefectItem item = new DefectItem(defectMatcher.group());
+ defectItems.add(item);
+ }
+ }
+ return defectItems;
+ }
+
+ public int getNumMajor() throws OseeCoreException {
+ int x = 0;
+ for (DefectItem dItem : getDefectItems())
+ if (dItem.getSeverity() == Severity.Major) x++;
+ return x;
+ }
+
+ public int getNumMinor() throws OseeCoreException {
+ int x = 0;
+ for (DefectItem dItem : getDefectItems())
+ if (dItem.getSeverity() == Severity.Minor) x++;
+ return x;
+ }
+
+ public int getNumIssues() throws OseeCoreException {
+ int x = 0;
+ for (DefectItem dItem : getDefectItems())
+ if (dItem.getSeverity() == Severity.Issue) x++;
+ return x;
+ }
+
+ private void saveDefectItems(Set<DefectItem> defectItems, boolean persist, SkynetTransaction transaction) {
+ try {
+ // Change existing ones
+ for (Attribute<?> attr : artifact.getAttributes(REVIEW_DEFECT_ATTRIBUTE_NAME)) {
+ DefectItem dbPromoteItem = new DefectItem((String) attr.getValue());
+ for (DefectItem pItem : defectItems) {
+ if (pItem.equals(dbPromoteItem)) {
+ attr.setFromString(AXml.addTagData(DEFECT_ITEM_TAG, pItem.toXml()));
+ }
+ }
+ }
+ Set<DefectItem> dbPromoteItems = getDefectItems();
+ // Remove deleted ones; items in dbPromoteItems that are not in promoteItems
+ for (DefectItem delPromoteItem : org.eclipse.osee.framework.jdk.core.util.Collections.setComplement(
+ dbPromoteItems, defectItems)) {
+ for (Attribute<?> attr : artifact.getAttributes(REVIEW_DEFECT_ATTRIBUTE_NAME)) {
+ DefectItem dbPromoteItem = new DefectItem((String) attr.getValue());
+ if (dbPromoteItem.equals(delPromoteItem)) {
+ attr.delete();
+ }
+ }
+ }
+ // Add new ones: items in promoteItems that are not in dbPromoteItems
+ for (DefectItem newPromoteItem : org.eclipse.osee.framework.jdk.core.util.Collections.setComplement(
+ defectItems, dbPromoteItems)) {
+ artifact.addAttributeFromString(REVIEW_DEFECT_ATTRIBUTE_NAME, AXml.addTagData(DEFECT_ITEM_TAG,
+ newPromoteItem.toXml()));
+ }
+ if (persist) artifact.persistAttributes(transaction);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't create ats review defect document", ex);
+ }
+ }
+
+ public void addOrUpdateDefectItem(DefectItem defectItem, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ Set<DefectItem> defectItems = getDefectItems();
+ boolean found = false;
+ for (DefectItem dItem : defectItems) {
+ if (defectItem.equals(dItem)) {
+ dItem.update(defectItem);
+ found = true;
+ }
+ }
+ if (!found) defectItems.add(defectItem);
+ saveDefectItems(defectItems, persist, transaction);
+ }
+
+ public void removeDefectItem(DefectItem defectItem, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ Set<DefectItem> defectItems = getDefectItems();
+ defectItems.remove(defectItem);
+ saveDefectItems(defectItems, persist, transaction);
+ }
+
+ public void addDefectItem(String description, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ DefectItem item = new DefectItem();
+ item.setDescription(description);
+ addOrUpdateDefectItem(item, persist, transaction);
+ }
+
+ public String getTable() throws OseeCoreException {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<TABLE BORDER=\"1\" cellspacing=\"1\" cellpadding=\"3%\" width=\"100%\"><THEAD><TR><TH>Severity</TH>" + "<TH>Disposition</TH><TH>Injection</TH><TH>User</TH><TH>Date</TH><TH>Description</TH><TH>Location</TH>" + "<TH>Resolution</TH><TH>Guid</TH><TH>Completed</TH></THEAD></TR>");
+ for (DefectItem item : getDefectItems()) {
+ User user = item.getUser();
+ String name = "";
+ if (user != null) {
+ name = user.getName();
+ if (name == null || name.equals("")) {
+ name = user.getName();
+ }
+ }
+ builder.append("<TR>");
+ builder.append("<TD>" + item.getSeverity() + "</TD>");
+ builder.append("<TD>" + item.getDisposition() + "</TD>");
+ builder.append("<TD>" + item.getInjectionActivity() + "</TD>");
+ if (user.equals(UserManager.getUser()))
+ builder.append("<TD bgcolor=\"#CCCCCC\">" + name + "</TD>");
+ else
+ builder.append("<TD>" + name + "</TD>");
+ builder.append("<TD>" + item.getCreatedDate(XDate.MMDDYYHHMM) + "</TD>");
+ builder.append("<TD>" + item.getDescription() + "</TD>");
+ builder.append("<TD>" + item.getLocation() + "</TD>");
+ builder.append("<TD>" + item.getResolution() + "</TD>");
+ builder.append("<TD>" + item.getGuid() + "</TD>");
+ builder.append("<TD>" + item.isClosed() + "</TD>");
+ builder.append("</TR>");
+ }
+ builder.append("</TABLE>");
+ return builder.toString();
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewer.java
new file mode 100644
index 00000000000..5920fb6672a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewer.java
@@ -0,0 +1,532 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.defect;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+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.nebula.widgets.xviewer.IXViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.XPromptChange;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XPromptChange.Option;
+import org.eclipse.nebula.widgets.xviewer.util.EnumStringSingleSelectionDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Disposition;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.InjectionActivity;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetGuiDebug;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserListDialog;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefectXViewer extends XViewer {
+
+ private final XDefectViewer xDefectViewer;
+ private Action editSeverityAction;
+ private Action editDispositionAction;
+ private Action editClosedAction;
+ private Action editUserAction;
+ private Action editCreatedDateAction;
+ private Action editInjectionAction;
+ private Action editDescriptionAction;
+ private Action editLocationAction;
+ private Action editResolutionAction;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ DefectXViewer(Composite parent, int style, XDefectViewer xDefectViewer) {
+ this(parent, style, new DefectXViewerFactory(), xDefectViewer);
+ }
+
+ public DefectXViewer(Composite parent, int style, IXViewerFactory xViewerFactory, XDefectViewer xDefectViewer) {
+ super(parent, style, xViewerFactory);
+ this.xDefectViewer = xDefectViewer;
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ parent.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ ((DefectContentProvider) getContentProvider()).clear();
+ }
+ });
+ createMenuActions();
+ }
+
+ public void createMenuActions() {
+ setColumnMultiEditEnabled(true);
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+
+ editSeverityAction = new Action("Edit Severity", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Severity_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editClosedAction = new Action("Edit Closed ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Closed_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editCreatedDateAction = new Action("Edit Created Date ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Created_Date_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editDescriptionAction = new Action("Edit Description ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Description_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editDispositionAction = new Action("Edit Disposition ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Disposition_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editInjectionAction = new Action("Edit Injection ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Injection_Activity_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editLocationAction = new Action("Edit Location ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Location_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editResolutionAction = new Action("Edit Resolution ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.Resolution_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+
+ editUserAction = new Action("Edit User ", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ boolean columnMultiEdit = false;
+ // grab the data, prompt change
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems = getSelectedDefectItems();
+ try {
+ promptChangeData(DefectXViewerFactory.User_Col, defectItems, columnMultiEdit);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectXViewer.class, OseeLevel.SEVERE_POPUP, ex.toString());
+ }
+ }
+ };
+ }
+
+ public void updateEditMenuActions() {
+ MenuManager mm = getMenuManager();
+ // EDIT MENU BLOCK
+ mm.insertBefore(MENU_GROUP_PRE, editSeverityAction);
+ editSeverityAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editClosedAction);
+ editClosedAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editCreatedDateAction);
+ editCreatedDateAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editDescriptionAction);
+ editDescriptionAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editDispositionAction);
+ editDispositionAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editInjectionAction);
+ editInjectionAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editLocationAction);
+ editLocationAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editResolutionAction);
+ editResolutionAction.setEnabled(true);
+ mm.insertBefore(MENU_GROUP_PRE, editUserAction);
+ editUserAction.setEnabled(true);
+
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+ updateEditMenuActions();
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ public Collection<DefectItem> getLoadedDefectItems() {
+ return ((DefectContentProvider) getContentProvider()).getRootSet();
+ }
+
+ public void add(Collection<DefectItem> defectItems) {
+ if (((DefectContentProvider) getContentProvider()) != null) ((DefectContentProvider) getContentProvider()).add(defectItems);
+ }
+
+ public void set(Collection<? extends DefectItem> defectItems) {
+ if (((DefectContentProvider) getContentProvider()) != null) ((DefectContentProvider) getContentProvider()).set(defectItems);
+ }
+
+ public void clear() {
+ if (((DefectContentProvider) getContentProvider()) != null) ((DefectContentProvider) getContentProvider()).clear();
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ // Dispose of the table objects is done through separate dispose listener off tree
+ // Tell the label provider to release its resources
+ getLabelProvider().dispose();
+ }
+
+ public ArrayList<DefectItem> getSelectedDefectItems() {
+ ArrayList<DefectItem> arts = new ArrayList<DefectItem>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((DefectItem) item.getData());
+ return arts;
+ }
+
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ if (!xDefectViewer.isEditable()) {
+ return;
+ }
+ ArrayList<DefectItem> defectItems = new ArrayList<DefectItem>();
+ for (TreeItem item : treeItems) {
+ defectItems.add((DefectItem) item.getData());
+ }
+ try {
+ promptChangeData((XViewerColumn) treeColumn.getData(), defectItems, isColumnMultiEditEnabled());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#handleLeftClickInIconArea(org.eclipse.swt.widgets.TreeColumn, org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+ XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
+ if (xCol.equals(DefectXViewerFactory.User_Col) || xCol.equals(DefectXViewerFactory.Injection_Activity_Col) || xCol.equals(DefectXViewerFactory.Closed_Col) || xCol.equals(DefectXViewerFactory.Severity_Col)) {
+ return handleAltLeftClick(treeColumn, treeItem);
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.viewer.XViewer#handleAltLeftClick(org.eclipse.swt.widgets.TreeColumn,
+ * org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ if (!xDefectViewer.isEditable()) {
+ return false;
+ }
+ try {
+ XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
+ DefectItem defectItem = (DefectItem) treeItem.getData();
+ List<DefectItem> defectItems = new ArrayList<DefectItem>();
+ defectItems.add(defectItem);
+ if (xCol.equals(DefectXViewerFactory.Severity_Col) || xCol.equals(DefectXViewerFactory.Disposition_Col) || xCol.equals(DefectXViewerFactory.Created_Date_Col) || xCol.equals(DefectXViewerFactory.Closed_Col) || xCol.equals(DefectXViewerFactory.Description_Col) || xCol.equals(DefectXViewerFactory.Resolution_Col) || xCol.equals(DefectXViewerFactory.Location_Col) || xCol.equals(DefectXViewerFactory.User_Col) || xCol.equals(DefectXViewerFactory.Injection_Activity_Col)) {
+ return promptChangeData(xCol, defectItems, false);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiDebug.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ private boolean setInjectionActivity(Collection<DefectItem> defectItems, InjectionActivity newInjectionActivity) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.getInjectionActivity().equals(newInjectionActivity)) {
+ defectItem.setInjectionActivity(newInjectionActivity);
+ // at least one in the list has been changed.
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setUser(Collection<DefectItem> defectItems, User user) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.getUser().equals(user)) {
+ defectItem.setUser(user);
+ // at least one in the list has been changed.
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setLocation(Collection<DefectItem> defectItems, String loc) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.getLocation().equals(loc)) {
+ defectItem.setLocation(loc);
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setDescription(Collection<DefectItem> defectItems, String desc) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.equals(desc)) {
+ defectItem.setDescription(desc);
+ if (!modified) modified = true;
+ }
+
+ }
+ return modified;
+ }
+
+ private boolean setClosed(Collection<DefectItem> defectItems, boolean closed) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (defectItem.isClosed() != closed) {
+ defectItem.setClosed(closed);
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setSeverity(Collection<DefectItem> defectItems, Severity severity) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.getSeverity().equals(severity)) {
+ defectItem.setSeverity(severity);
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setDisposition(Collection<DefectItem> defectItems, Disposition disposition) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.getDisposition().equals(disposition)) {
+ defectItem.setDisposition(disposition);
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setDate(Collection<DefectItem> defectItems, Date date) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ if (!defectItem.getDate().equals(date)) {
+ defectItem.setDate(date);
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setResolution(Collection<DefectItem> defectItems, String resolution) {
+ boolean modified = false;
+ for (DefectItem defectItem : defectItems) {
+ defectItem.setResolution(resolution);
+ if (!modified) modified = true;
+ }
+ return modified;
+ }
+
+ public boolean promptChangeData(XViewerColumn xCol, Collection<DefectItem> defectItems, boolean columnMultiEdit) throws OseeCoreException {
+ boolean modified = false;
+ if (defectItems != null && !defectItems.isEmpty()) {
+ DefectItem defectItem = (DefectItem) defectItems.toArray()[0];
+ if (xCol.equals(DefectXViewerFactory.Severity_Col)) {
+ EnumStringSingleSelectionDialog enumDialog =
+ XPromptChange.promptChangeSingleSelectEnumeration(xCol.getName(), Severity.strValues(),
+ ((columnMultiEdit) ? null : defectItem.getSeverity().name()));
+ if (enumDialog != null && enumDialog.getResult() != null) {
+ modified = setSeverity(defectItems, Severity.valueOf((String) enumDialog.getResult()[0]));
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Disposition_Col)) {
+ EnumStringSingleSelectionDialog enumDialog =
+ XPromptChange.promptChangeSingleSelectEnumeration(xCol.getName(), Disposition.strValues(),
+ ((columnMultiEdit) ? null : defectItem.getDisposition().name()));
+ if (enumDialog != null && enumDialog.getResult() != null) {
+ modified = setDisposition(defectItems, Disposition.valueOf((String) enumDialog.getResult()[0]));
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Created_Date_Col)) {
+ Date selDate =
+ XPromptChange.promptChangeDate(xCol.getName(), ((columnMultiEdit) ? defectItem.getDate() : null));
+ if (selDate != null) {
+ modified = setDate(defectItems, selDate);
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Closed_Col)) {
+ Boolean closed =
+ XPromptChange.promptChangeBoolean(xCol.getName(), xCol.getName(),
+ ((columnMultiEdit) ? false : defectItem.isClosed()));
+ if (closed != null) {
+ modified = setClosed(defectItems, closed);
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Description_Col)) {
+ String desc =
+ XPromptChange.promptChangeString(xCol.getName(),
+ ((columnMultiEdit) ? null : defectItem.getDescription()), null, Option.MULTI_LINE);
+ if (desc != null) {
+ modified = setDescription(defectItems, desc);
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Resolution_Col)) {
+ String resolution =
+ XPromptChange.promptChangeString(xCol.getName(),
+ (columnMultiEdit ? null : defectItem.getResolution()), null, Option.MULTI_LINE);
+ if (resolution != null) {
+ modified = setResolution(defectItems, resolution);
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Location_Col)) {
+ String loc =
+ XPromptChange.promptChangeString(xCol.getName(),
+ ((columnMultiEdit) ? null : defectItem.getLocation()), null, Option.MULTI_LINE);
+ if (loc != null) {
+ modified = setLocation(defectItems, loc);
+ }
+ } else if (xCol.equals(DefectXViewerFactory.User_Col)) {
+ UserListDialog ld = new UserListDialog(Display.getCurrent().getActiveShell(), "Select New User");
+ int result = ld.open();
+ if (result == 0) {
+ modified = setUser(defectItems, ld.getSelection());
+ }
+ } else if (xCol.equals(DefectXViewerFactory.Injection_Activity_Col)) {
+ EnumStringSingleSelectionDialog enumDialog =
+ XPromptChange.promptChangeSingleSelectEnumeration(xCol.getName(), InjectionActivity.strValues(),
+ ((columnMultiEdit) ? null : defectItem.getInjectionActivity().name()));
+ if (enumDialog != null && enumDialog.getResult() != null) {
+ modified =
+ setInjectionActivity(defectItems, InjectionActivity.valueOf((String) enumDialog.getResult()[0]));
+ }
+ }
+ if (modified) {
+ return executeTransaction(defectItems);
+ }
+ }
+ return false;
+ }
+
+ public boolean executeTransaction(Collection<DefectItem> defectItems) throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(xDefectViewer.getReviewArt().getArtifact().getBranch());
+ for (DefectItem defectItem : defectItems) {
+ xDefectViewer.getReviewArt().getDefectManager().addOrUpdateDefectItem(defectItem, false, transaction);
+ update(defectItem, null);
+ }
+ transaction.execute();
+ xDefectViewer.notifyXModifiedListeners();
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewerFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewerFactory.java
new file mode 100644
index 00000000000..6bce5941468
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/DefectXViewerFactory.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.ats.util.widgets.defect;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefectXViewerFactory extends SkynetXViewerFactory {
+
+ public static XViewerColumn Severity_Col =
+ new XViewerColumn("osee.defect.severity", "Severity", 70, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Disposition_Col =
+ new XViewerColumn("osee.defect.disposition", "Disposition", 70, SWT.CENTER, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn Closed_Col =
+ new XViewerColumn("osee.defect.closed", "Closed", 70, SWT.LEFT, true, SortDataType.Boolean, false, null);
+ public static XViewerColumn User_Col =
+ new XViewerColumn("osee.defect.user", "User", 100, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Created_Date_Col =
+ new XViewerColumn("osee.defect.createdDate", "Created Date", 80, SWT.LEFT, true, SortDataType.Date, false,
+ null);
+ public static XViewerColumn Injection_Activity_Col =
+ new XViewerColumn("osee.defect.injectionActivity", "Injection Activity", 35, SWT.LEFT, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn Description_Col =
+ new XViewerColumn("osee.defect.description", "Description", 200, SWT.LEFT, true,
+ SortDataType.String_MultiLine, false, null);
+ public static XViewerColumn Location_Col =
+ new XViewerColumn("osee.defect.location", "Location", 200, SWT.LEFT, true, SortDataType.String_MultiLine,
+ false, null);
+ public static XViewerColumn Resolution_Col =
+ new XViewerColumn("osee.defect.resolution", "Resolution", 200, SWT.LEFT, true, SortDataType.String_MultiLine,
+ false, null);
+
+ private static String NAMESPACE = "osee.ats.DefectXViewer";
+
+ public DefectXViewerFactory() {
+ super(NAMESPACE);
+ registerColumn(Severity_Col, Disposition_Col, Closed_Col, User_Col, Created_Date_Col, Injection_Activity_Col,
+ Description_Col, Location_Col, Resolution_Col);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/XDefectViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/XDefectViewer.java
new file mode 100644
index 00000000000..d1abbf8559f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/defect/XDefectViewer.java
@@ -0,0 +1,606 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util.widgets.defect;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.IReviewArtifact;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Disposition;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+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.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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XDefectViewer extends XWidget implements IArtifactWidget, IFrameworkTransactionEventListener {
+
+ private DefectXViewer xViewer;
+ private final int defaultTableHeightHint = 100;
+ private final int paddedTableHeightHint = 2;
+ private IDirtiableEditor editor;
+ private IReviewArtifact reviewArt;
+ public final static String normalColor = "#EEEEEE";
+ private static ToolItem newDefectItem, deleteDefectItem;
+ private Label extraInfoLabel;
+ private Tree tree;
+ private Composite parentComposite;
+ private static ToolItem expandDefectItem, collapseDefectItem;
+ private static Map<IReviewArtifact, Boolean> mapOfReviewArtifacts = new LinkedHashMap<IReviewArtifact, Boolean>();
+
+ /**
+ * @param label
+ */
+ public XDefectViewer() {
+ super("Defects");
+ OseeEventManager.addListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createWidgets(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ parentComposite = parent;
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ if (toolkit != null) toolkit.paintBordersFor(mainComp);
+
+ createTaskActionBar(mainComp);
+
+ xViewer = new DefectXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ xViewer.setContentProvider(new DefectContentProvider(xViewer));
+ xViewer.setLabelProvider(new DefectLabelProvider(xViewer));
+ xViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ refreshActionEnablement();
+ }
+ });
+
+ if (toolkit != null) toolkit.adapt(xViewer.getStatusLabel(), false, false);
+
+ handleExpandCollapseDefectTableList();
+
+ // NOTE: Don't adapt the tree using xToolkit cause will loose xViewer's context menu
+ loadTable();
+ }
+
+ public void setXviewerTree(boolean expand) {
+ tree = xViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = getTableHeightHint(expand);
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ }
+
+ private int getTableHeightHint(boolean expand) {
+ try {
+ int defectListSize = reviewArt.getDefectManager().getDefectItems().size();
+ int treeItemHeight = tree.getItemHeight();
+ int calculatedTableHeightHint = treeItemHeight * (defectListSize + 1);
+ if (expand && calculatedTableHeightHint > defaultTableHeightHint) {
+ // allow expansion to approximately 50 items
+ if (defectListSize > (defaultTableHeightHint / 2)) {
+ return treeItemHeight * (paddedTableHeightHint + defaultTableHeightHint);
+ } else
+ return treeItemHeight * (paddedTableHeightHint + defectListSize);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefectManager.class, Level.SEVERE, ex.toString());
+ }
+ return defaultTableHeightHint;
+ }
+
+ public void createTaskActionBar(Composite parent) {
+
+ // Button composite for state transitions, etc
+ Composite bComp = new Composite(parent, SWT.NONE);
+ // bComp.setBackground(mainSComp.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ bComp.setLayout(new GridLayout(2, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite leftComp = new Composite(bComp, SWT.NONE);
+ leftComp.setLayout(new GridLayout());
+ leftComp.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(leftComp, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+ Composite rightComp = new Composite(bComp, SWT.NONE);
+ rightComp.setLayout(new GridLayout());
+ rightComp.setLayoutData(new GridData(GridData.END));
+
+ ToolBar toolBar = new ToolBar(rightComp, SWT.FLAT | SWT.RIGHT);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ toolBar.setLayoutData(gd);
+ ToolItem item = null;
+
+ expandDefectItem = new ToolItem(toolBar, SWT.PUSH);
+ expandDefectItem.setImage(ImageManager.getImage(FrameworkImage.EXPAND_ALL));
+ expandDefectItem.setToolTipText("Expand Defect List");
+ expandDefectItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ mapOfReviewArtifacts.put(reviewArt, true);
+ handleExpandCollapseDefectTableList();
+ }
+ });
+
+ collapseDefectItem = new ToolItem(toolBar, SWT.PUSH);
+ collapseDefectItem.setImage(ImageManager.getImage(FrameworkImage.COLLAPSE_ALL));
+ collapseDefectItem.setToolTipText("Collapse Defect List");
+ collapseDefectItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ mapOfReviewArtifacts.put(reviewArt, false);
+ handleExpandCollapseDefectTableList();
+ }
+ });
+
+ newDefectItem = new ToolItem(toolBar, SWT.PUSH);
+ newDefectItem.setImage(ImageManager.getImage(FrameworkImage.GREEN_PLUS));
+ newDefectItem.setToolTipText("New Defect");
+ newDefectItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleNewDefect();
+ }
+ });
+
+ deleteDefectItem = new ToolItem(toolBar, SWT.PUSH);
+ deleteDefectItem.setImage(ImageManager.getImage(FrameworkImage.X_RED));
+ deleteDefectItem.setToolTipText("Delete Defect");
+ deleteDefectItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleDeleteDefect(false);
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh Defects");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ loadTable();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ createTaskActionBarPulldown(toolBar, rightComp);
+ refreshActionEnablement();
+ }
+
+ public void refreshActionEnablement() {
+ deleteDefectItem.setEnabled(isEditable() && getSelectedDefectItems().size() > 0);
+ newDefectItem.setEnabled(isEditable());
+ }
+
+ public void createTaskActionBarPulldown(final ToolBar toolBar, Composite composite) {
+ final ToolItem dropDown = new ToolItem(toolBar, SWT.DROP_DOWN);
+ final Menu menu = new Menu(composite);
+
+ dropDown.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ if (event.detail == SWT.ARROW) {
+ Rectangle rect = dropDown.getBounds();
+ Point pt = new Point(rect.x, rect.y + rect.height);
+ pt = toolBar.toDisplay(pt);
+ menu.setLocation(pt.x, pt.y);
+ menu.setVisible(true);
+ }
+ }
+ });
+
+ MenuItem item = new MenuItem(menu, SWT.PUSH);
+ item.setText("Create Defects via simple list");
+ item.setEnabled(isEditable());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleImportDefectsViaList();
+ }
+ });
+
+ }
+
+ private void handleExpandCollapseDefectTableList() {
+ if (mapOfReviewArtifacts != null && mapOfReviewArtifacts.containsKey(reviewArt) && mapOfReviewArtifacts.get(reviewArt)) {
+ setXviewerTree(true);
+ } else {
+ setXviewerTree(false);
+ }
+ xViewer.refresh();
+ if (getForm(parentComposite) != null) {
+ (getForm(parentComposite)).reflow(true);
+ }
+ }
+
+ public ScrolledForm getForm(Composite composite) {
+ ScrolledForm form = null;
+ if (composite == null) return null;
+ if (composite instanceof ScrolledForm) return (ScrolledForm) composite;
+ if (!(composite instanceof ScrolledForm)) {
+ form = getForm(composite.getParent());
+ }
+ return form;
+ }
+
+ public void loadTable() {
+ try {
+ if (reviewArt != null && xViewer != null) {
+ xViewer.set(reviewArt.getDefectManager().getDefectItems());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ handleExpandCollapseDefectTableList();
+ refresh();
+ }
+
+ public void handleImportDefectsViaList() {
+ try {
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Create Defects", null,
+ "Enter task titles, one per line.", MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ ed.setFillVertically(true);
+ if (ed.open() == 0) {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (String str : ed.getEntry().split("\n")) {
+ str = str.replaceAll("\r", "");
+ if (!str.equals("")) {
+ reviewArt.getDefectManager().addDefectItem(str, false, transaction);
+ }
+ }
+ transaction.execute();
+ loadTable();
+ notifyXModifiedListeners();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void handleDeleteDefect(boolean persist) {
+ final List<DefectItem> items = getSelectedDefectItems();
+ if (items.size() == 0) {
+ AWorkbench.popup("ERROR", "No Defects Selected");
+ return;
+ }
+ StringBuilder builder = new StringBuilder();
+ for (DefectItem defectItem : items)
+ builder.append("\"" + defectItem.getDescription() + "\"\n");
+
+ boolean delete =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Delete Defects", "Are You Sure You Wish to Delete the Defects(s):\n\n" + builder.toString());
+ if (delete) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ deleteDefectHelper(items, persist, transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private void deleteDefectHelper(List<DefectItem> items, boolean persist, SkynetTransaction transaction) {
+ try {
+ for (DefectItem defectItem : items) {
+ reviewArt.getDefectManager().removeDefectItem(defectItem, persist, transaction);
+ xViewer.remove(defectItem);
+ }
+ loadTable();
+ notifyXModifiedListeners();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void handleNewDefect() {
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Create New Defect", null,
+ "Enter Defect Description", MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ if (ed.open() == 0) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ reviewArt.getDefectManager().addDefectItem(ed.getEntry(), false, transaction);
+ transaction.execute();
+ notifyXModifiedListeners();
+ loadTable();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<DefectItem> getSelectedDefectItems() {
+ ArrayList<DefectItem> items = new ArrayList<DefectItem>();
+ if (xViewer == null) return items;
+ if (xViewer.getSelection().isEmpty()) return items;
+ Iterator i = ((IStructuredSelection) xViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ items.add((DefectItem) obj);
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ return xViewer.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ xViewer.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ xViewer.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ if (xViewer == null || xViewer.getTree() == null || xViewer.getTree().isDisposed()) return;
+ xViewer.refresh();
+ validate();
+ refreshActionEnablement();
+ }
+
+ @Override
+ public IStatus isValid() {
+ try {
+ if (isRequiredEntry() && xViewer.getTree().getItemCount() == 0) {
+ extraInfoLabel.setText("At least one defect entry is required. Select \"New Defect\" to add.");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ return new Status(IStatus.ERROR, getClass().getSimpleName(), "At least one defect entry is required");
+ }
+ if (reviewArt != null) {
+ for (DefectItem item : reviewArt.getDefectManager().getDefectItems()) {
+ if (item.isClosed() == false || item.getDisposition() == Disposition.None || (item.getSeverity() == Severity.None && (item.getDisposition() != Disposition.Duplicate && item.getDisposition() != Disposition.Reject))) {
+ extraInfoLabel.setText("All items must be marked for severity, disposition and closed. Select icon in cell or right-click to update field.");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ return new Status(IStatus.ERROR, getClass().getSimpleName(),
+ "Review not complete until all items are marked for severity, disposition and closed");
+ }
+ }
+ }
+ extraInfoLabel.setText("Select \"New Defect\" to add. Select icon in cell or right-click to update field.");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return new Status(IStatus.ERROR, getClass().getSimpleName(),
+ "Exception validating defects. See log for details. " + ex);
+ }
+ // Need this cause it removes all error items of this namespace
+ return new Status(IStatus.OK, getClass().getSimpleName(), "");
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ if (getXViewer().getTree().getItemCount() == 0) return "";
+ StringBuffer html = new StringBuffer();
+ try {
+ html.append(AHTML.addSpace(1) + AHTML.getLabelStr(AHTML.LABEL_FONT, "Tasks"));
+ html.append(AHTML.startBorderTable(100, normalColor, ""));
+ html.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Date", "User", "Location", "Description",
+ "Severity", "Disposition", "Injection Activity", "Resolution", "Location", "Closted"}));
+ for (DefectItem item : reviewArt.getDefectManager().getDefectItems()) {
+ html.append(AHTML.addRowMultiColumnTable(new String[] {item.getCreatedDate(XDate.MMDDYY),
+ item.getUser().getName(), item.getLocation(), item.getDescription(), item.getSeverity().name(),
+ item.getDisposition().name(), item.getInjectionActivity().name(), item.getResolution(),
+ item.isClosed() + ""}));
+ }
+ html.append(AHTML.endBorderTable());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return "Defect Item Exception - " + ex.getLocalizedMessage();
+ }
+ return html.toString();
+ }
+
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public DefectXViewer getXViewer() {
+ return xViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return xViewer.getInput();
+ }
+
+ public IDirtiableEditor getEditor() {
+ return editor;
+ }
+
+ public void setEditor(IDirtiableEditor editor) {
+ this.editor = editor;
+ }
+
+ public IReviewArtifact getReviewArt() {
+ return reviewArt;
+ }
+
+ public void setReviewArt(IReviewArtifact reviewArt) {
+ this.reviewArt = reviewArt;
+ if (xViewer != null) loadTable();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IDamWidget#setArtifact(org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * java.lang.String)
+ */
+ public void setArtifact(Artifact artifact, String attrName) {
+ setReviewArt((IReviewArtifact) artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ // DefectViewer uses artifact as storage mechanism; nothing to do here
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ // DefectViewer uses artifact as storage mechanism which already determines dirty
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ // Nothing to revert cause artifact will be reverted
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.getBranchId() != AtsPlugin.getAtsBranch().getBranchId()) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ if (xViewer == null || xViewer.getTree() == null || xViewer.getTree().isDisposed()) return;
+ if (transData.isRelAddedChangedDeleted(reviewArt.getArtifact())) {
+ loadTable();
+ } else
+ refresh();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getErrorMessageControl()
+ */
+ @Override
+ public Control getErrorMessageControl() {
+ return labelWidget;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AICheckTreeDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AICheckTreeDialog.java
new file mode 100644
index 00000000000..9d266311a99
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AICheckTreeDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEECheckedFilteredTreeDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AICheckTreeDialog extends OSEECheckedFilteredTreeDialog {
+
+ private static PatternFilter patternFilter = new PatternFilter();
+ private final Active active;
+ private Set<ActionableItemArtifact> initialAias;
+
+ public AICheckTreeDialog(String title, String message, Active active) {
+ super(title, message, patternFilter, new AITreeContentProvider(active), new ArtifactLabelProvider());
+ this.active = active;
+ }
+
+ public Collection<ActionableItemArtifact> getChecked() {
+ if (super.getTreeViewer() == null) return Collections.emptyList();
+ Set<ActionableItemArtifact> checked = new HashSet<ActionableItemArtifact>();
+ for (Object obj : super.getTreeViewer().getChecked()) {
+ checked.add((ActionableItemArtifact) obj);
+ }
+ return checked;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control comp = super.createDialogArea(container);
+ try {
+ getTreeViewer().getViewer().setInput(ActionableItemArtifact.getTopLevelActionableItems(active));
+ getTreeViewer().getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ for (ActionableItemArtifact aia : getChecked()) {
+ if (!aia.isActionable()) {
+ AWorkbench.popup("ERROR", ActionableItemArtifact.getNotActionableItemError(aia));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ if (getInitialAias() != null) getTreeViewer().setInitalChecked(getInitialAias());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return comp;
+ }
+
+ @Override
+ protected Result isComplete() {
+ try {
+ for (ActionableItemArtifact aia : getChecked()) {
+ if (!aia.isActionable()) {
+ return Result.FalseResult;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return super.isComplete();
+ }
+
+ /**
+ * @return the initialAias
+ */
+ public Set<ActionableItemArtifact> getInitialAias() {
+ return initialAias;
+ }
+
+ /**
+ * @param initialAias the initialAias to set
+ */
+ public void setInitialAias(Set<ActionableItemArtifact> initialAias) {
+ this.initialAias = initialAias;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.java
new file mode 100644
index 00000000000..9ed45fcadd0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AITreeContentProvider.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+public class AITreeContentProvider implements ITreeContentProvider {
+
+ private final Active active;
+
+ public AITreeContentProvider(Active active) {
+ super();
+ this.active = active;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection)
+ return ((Collection) parentElement).toArray();
+ else if (parentElement instanceof ActionableItemArtifact) {
+ try {
+ ActionableItemArtifact ai = ((ActionableItemArtifact) parentElement);
+ return AtsLib.getActiveSet(Artifacts.getChildrenOfTypeSet(ai, ActionableItemArtifact.class, false), active,
+ ActionableItemArtifact.class).toArray();
+ } catch (Exception ex) {
+ }
+ }
+ return new Object[] {};
+ }
+
+ public Object getParent(Object element) {
+ try {
+ if (element instanceof ActionableItemArtifact) {
+ return ((ActionableItemArtifact) element).getParent();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionActionableItemListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionActionableItemListDialog.java
new file mode 100644
index 00000000000..92f0e0e9d79
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionActionableItemListDialog.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.ats.util.widgets.dialog;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionActionableItemListDialog extends CheckedTreeSelectionDialog {
+
+ XCheckBox recurseChildrenCheck = new XCheckBox("Include all children Actionable Items' Actions");
+ boolean recurseChildren = false;
+ XCheckBox showFinishedCheck = new XCheckBox("Show Completed and Cancelled Workflows");
+ boolean showFinished = false;
+ XCheckBox showActionCheck = new XCheckBox("Show Action instead of Workflows");
+ boolean showAction = false;
+
+ public ActionActionableItemListDialog(Active active) {
+ super(Display.getCurrent().getActiveShell(), new ArtifactDescriptiveLabelProvider(), new AITreeContentProvider(
+ active));
+ setTitle("Select Actionable Items");
+ setMessage("Select Actionable Items");
+ setComparator(new ArtifactNameSorter());
+ try {
+ setInput(ActionableItemArtifact.getTopLevelActionableItems(active));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Control control = super.createDialogArea(container);
+ Composite comp = new Composite(control.getParent(), SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ recurseChildrenCheck.createWidgets(comp, 2);
+ recurseChildrenCheck.set(recurseChildren);
+ recurseChildrenCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ recurseChildren = recurseChildrenCheck.isSelected();
+ };
+ });
+ showFinishedCheck.createWidgets(comp, 2);
+ showFinishedCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ showFinished = showFinishedCheck.isSelected();
+ };
+ });
+ showActionCheck.createWidgets(comp, 2);
+ showActionCheck.set(showAction);
+ showActionCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ showAction = showActionCheck.isSelected();
+ };
+ });
+
+ return container;
+ }
+
+ public boolean isShowFinished() {
+ return showFinished;
+ }
+
+ public boolean isShowAction() {
+ return showAction;
+ }
+
+ /**
+ * @return the recurseChildren
+ */
+ public boolean isRecurseChildren() {
+ return recurseChildren;
+ }
+
+ /**
+ * @param recurseChildren the recurseChildren to set
+ */
+ public void setRecurseChildren(boolean recurseChildren) {
+ this.recurseChildren = recurseChildren;
+ }
+
+ /**
+ * @param showFinished the showFinished to set
+ */
+ public void setShowFinished(boolean showFinished) {
+ this.showFinished = showFinished;
+ }
+
+ /**
+ * @param showAction the showAction to set
+ */
+ public void setShowAction(boolean showAction) {
+ this.showAction = showAction;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamListDialog.java
new file mode 100644
index 00000000000..db346d20664
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamListDialog.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.ats.util.widgets.dialog;
+
+import java.util.ArrayList;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ArtifactListDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionTeamListDialog extends ArtifactListDialog {
+
+ XCheckBox recurseChildrenCheck = new XCheckBox("Include all children Team's Actions");
+ boolean recurseChildren = false;
+ XCheckBox showFinishedCheck = new XCheckBox("Show Completed and Cancelled Workflows");
+ boolean showFinished = false;
+ XCheckBox showActionCheck = new XCheckBox("Show Action instead of Workflows");
+ boolean showAction = false;
+
+ public ActionTeamListDialog(Active active) {
+ super(Display.getCurrent().getActiveShell(), null);
+ setTitle("Select Team(s)");
+ setMessage("Select Team(s)");
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ try {
+ for (Artifact prod : TeamDefinitionArtifact.getTeamDefinitions(active))
+ arts.add(prod);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't Load product list.");
+ }
+ setArtifacts(arts);
+ }
+
+ /**
+ * Return the style flags for the table viewer.
+ *
+ * @return int
+ */
+ @Override
+ protected int getTableStyle() {
+ return SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Control control = super.createDialogArea(container);
+ Composite comp = new Composite(control.getParent(), SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ recurseChildrenCheck.createWidgets(comp, 2);
+ recurseChildrenCheck.set(recurseChildren);
+ recurseChildrenCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ recurseChildren = recurseChildrenCheck.isSelected();
+ };
+ });
+ showFinishedCheck.createWidgets(comp, 2);
+ showFinishedCheck.set(showFinished);
+ showFinishedCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ showFinished = showFinishedCheck.isSelected();
+ };
+ });
+ showActionCheck.createWidgets(comp, 2);
+ showActionCheck.set(showAction);
+ showActionCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ showAction = showActionCheck.isSelected();
+ };
+ });
+
+ return container;
+ }
+
+ public boolean isShowFinished() {
+ return showFinished;
+ }
+
+ public boolean isShowAction() {
+ return showAction;
+ }
+
+ /**
+ * @param showFinished the showFinished to set
+ */
+ public void setShowFinished(boolean showFinished) {
+ this.showFinished = showFinished;
+ }
+
+ /**
+ * @param showAction the showAction to set
+ */
+ public void setShowAction(boolean showAction) {
+ this.showAction = showAction;
+ }
+
+ /**
+ * @return the recurseChildren
+ */
+ public boolean isRecurseChildren() {
+ return recurseChildren;
+ }
+
+ /**
+ * @param recurseChildren the recurseChildren to set
+ */
+ public void setRecurseChildren(boolean recurseChildren) {
+ this.recurseChildren = recurseChildren;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamVersionListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamVersionListDialog.java
new file mode 100644
index 00000000000..c8eb2cecab8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionTeamVersionListDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.ArtifactViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionTeamVersionListDialog extends ActionTeamListDialog {
+
+ XListViewer versionList = new XListViewer("Version");
+ VersionArtifact selectedVersion = null;
+
+ /**
+ * @param active
+ */
+ public ActionTeamVersionListDialog(Active active) {
+ super(active);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ super.createDialogArea(container);
+ getTableViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ Collection<Object> objs = new HashSet<Object>();
+ if (getTableViewer().getSelection().isEmpty()) return;
+ IStructuredSelection sel = (IStructuredSelection) getTableViewer().getSelection();
+ for (Artifact art : ((TeamDefinitionArtifact) sel.iterator().next()).getVersionsFromTeamDefHoldingVersions(VersionReleaseType.Both))
+ objs.add(art);
+ versionList.setInput(objs);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(1, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ versionList.setLabelProvider(new VersionArtifactLabelProvider());
+ versionList.setContentProvider(new ArrayContentProvider());
+ versionList.setSorter(new ArtifactViewerSorter());
+ versionList.setGrabHorizontal(true);
+ versionList.setMultiSelect(false);
+ versionList.createWidgets(comp, 2);
+ versionList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ if (versionList.getSelected().size() == 0)
+ selectedVersion = null;
+ else
+ selectedVersion = (VersionArtifact) versionList.getSelected().iterator().next();
+ };
+ });
+
+ return container;
+ }
+
+ /**
+ * @return the selectedVersion
+ */
+ public VersionArtifact getSelectedVersion() {
+ return selectedVersion;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionableItemListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionableItemListDialog.java
new file mode 100644
index 00000000000..93925c704f6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/ActionableItemListDialog.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.ats.util.widgets.dialog;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameSorter;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionableItemListDialog extends CheckedTreeSelectionDialog {
+
+ public ActionableItemListDialog(Active active) {
+ super(Display.getCurrent().getActiveShell(), new ArtifactDescriptiveLabelProvider(), new AITreeContentProvider(
+ active));
+ setTitle("Select Actionable Item(s)");
+ setMessage("Select Actionable Item(s)");
+ setComparator(new ArtifactNameSorter());
+ try {
+ setInput(ActionableItemArtifact.getTopLevelActionableItems(active));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Set<ActionableItemArtifact> getSelected() {
+ Set<ActionableItemArtifact> selectedactionItems = new HashSet<ActionableItemArtifact>();
+ for (Object obj : getResult())
+ selectedactionItems.add((ActionableItemArtifact) obj);
+ return selectedactionItems;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AtsPriorityDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AtsPriorityDialog.java
new file mode 100644
index 00000000000..835ec5be611
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/AtsPriorityDialog.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.ats.util.widgets.dialog;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsPriority;
+import org.eclipse.osee.ats.util.AtsPriority.PriorityType;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.widgets.HyperLinkLabel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsPriorityDialog extends ListDialog {
+
+ PriorityType selected = null;
+
+ public AtsPriorityDialog(Shell parent) {
+ super(parent);
+ setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new PriorityLabelProvider());
+ setInput(AtsPriority.PriorityType.values());
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ setTitle("Select Priority");
+ setMessage("Select Priority - Click for Help");
+ }
+
+ public AtsPriority.PriorityType getSelection() {
+ return (AtsPriority.PriorityType) getResult()[0];
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.SelectionDialog#createMessageArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Label createMessageArea(Composite composite) {
+ Label label = super.createMessageArea(composite);
+ label.addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event event) {
+ AtsPriority.openHelp();
+ }
+ });
+ HyperLinkLabel.adapt(label);
+ return label;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Control c = super.createDialogArea(container);
+ if (selected != null) {
+ ArrayList<Object> sel = new ArrayList<Object>();
+ sel.add(selected);
+ getTableViewer().setSelection(new StructuredSelection(sel.toArray(new Object[sel.size()])));
+ getTableViewer().getTable().setFocus();
+ }
+ AtsPlugin.getInstance().setHelp(getTableViewer().getControl(), AtsPriority.PRIORITY_HELP_CONTEXT_ID);
+ return c;
+ }
+
+ @Override
+ protected void okPressed() {
+ if (getTableViewer().getSelection().isEmpty()) {
+ AWorkbench.popup("ERROR", "Must make selection.");
+ return;
+ }
+ super.okPressed();
+ }
+
+ public class PriorityLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ PriorityType type = (PriorityType) arg0;
+ if (type == PriorityType.None) return type.name();
+ return type.getShortName();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+ }
+
+ public void setSelected(PriorityType selected) {
+ this.selected = selected;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SMAStatusDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SMAStatusDialog.java
new file mode 100644
index 00000000000..04a8503b26a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SMAStatusDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFloat;
+import org.eclipse.osee.framework.ui.skynet.widgets.XPercent;
+import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButton;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyListener;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+public class SMAStatusDialog extends MessageDialog {
+
+ protected Label statusLabel;
+ protected XPercent percent = new XPercent("Percent Complete", "");
+ protected XFloat hours = new XFloat("Additional Hours Spent", "");
+ protected XRadioButton splitRadio = new XRadioButton("Split Hours Spent between Tasks");
+ protected XRadioButton eachRadio = new XRadioButton("Apply Hours Spent to each Task");
+ private Button okButton;
+ private final boolean showPercent;
+ protected final Collection<? extends StateMachineArtifact> smas;
+
+ public SMAStatusDialog(Shell parentShell, String dialogTitle, String dialogMessage, Collection<? extends StateMachineArtifact> smas) {
+ this(parentShell, dialogTitle, dialogMessage, true, smas);
+ }
+
+ public SMAStatusDialog(Shell parentShell, String dialogTitle, String dialogMessage, boolean showPercent, Collection<? extends StateMachineArtifact> smas) {
+ super(parentShell, dialogTitle, null, dialogMessage, MessageDialog.NONE, new String[] {"OK", "Cancel"}, 0);
+ this.showPercent = showPercent;
+ this.smas = smas;
+ }
+
+ protected void createPreCustomArea(Composite parent) {
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ boolean hasTask = false;
+ for (StateMachineArtifact sma : smas)
+ if (sma instanceof TaskArtifact) hasTask = true;
+
+ statusLabel = new Label(parent, SWT.NONE);
+ statusLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ updateStatusLabel();
+
+ if (smas.size() > 1) {
+ Label label = new Label(parent, SWT.NONE);
+ label.setText("Mulitple objects being statused. All objects will be " + "set to percent\ncomplete and hours spent will be split or added into each task.");
+ }
+
+ createPreCustomArea(parent);
+
+ if (hasTask) (new Label(parent, SWT.NONE)).setText("Task will auto-transition to complete when statused 100%.\n" + "Make all other changes to Task prior to statusing 100%.");
+
+ if (showPercent) {
+ percent.setRequiredEntry(true);
+ percent.setToolTip("Enter total percent complete.");
+ percent.createWidgets(parent, 2);
+ try {
+ if (smas.size() == 1) percent.set(smas.iterator().next().getSmaMgr().getStateMgr().getPercentComplete());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ percent.addModifyListener(new ModifyListener() {
+ public void modifyText(org.eclipse.swt.events.ModifyEvent e) {
+ updateButtons();
+ updateStatusLabel();
+ };
+ });
+ percent.getLabelWidget().addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ percent.set("100");
+ hours.set("1");
+ updateStatusLabel();
+ }
+ }
+ });
+ }
+
+ hours.setRequiredEntry(true);
+ hours.setToolTip("Enter hours spent since last status entry.");
+ hours.createWidgets(parent, 2);
+ hours.addModifyListener(new ModifyListener() {
+ public void modifyText(org.eclipse.swt.events.ModifyEvent e) {
+ updateButtons();
+ updateStatusLabel();
+ };
+ });
+
+ if (smas.size() > 1) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ eachRadio.createWidgets(comp, 2);
+ eachRadio.setSelected(false);
+ eachRadio.setToolTip("Hours Spent will be added to to time spent for each object.");
+
+ splitRadio.createWidgets(comp, 2);
+ splitRadio.setSelected(true);
+ splitRadio.setToolTip("Hours Spent will be divided equaly by the number of objects " + "and added to the existing hours spent for the object.");
+ }
+
+ return parent;
+ }
+
+ protected void updateStatusLabel() {
+ IStatus result = isComplete();
+ statusLabel.setText(result.isOK() ? "" : result.getMessage());
+ statusLabel.getParent().layout();
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ okButton.setEnabled(false);
+ return c;
+ }
+
+ public boolean isSplitHours() {
+ return (splitRadio.isSelected());
+ }
+
+ protected IStatus isComplete() {
+ IStatus status = percent.isValid();
+ if (!status.isOK()) {
+ return status;
+ }
+ status = hours.isValid();
+ if (!status.isOK()) {
+ return status;
+ }
+ if (smas.size() > 1) {
+ if (!splitRadio.isSelected() && !eachRadio.isSelected()) {
+ return new Status(IStatus.ERROR, AtsPlugin.PLUGIN_ID, "Either split or each must be selected");
+ }
+ if (splitRadio.isSelected() && eachRadio.isSelected()) {
+ return new Status(IStatus.ERROR, AtsPlugin.PLUGIN_ID, "Select only split or each");
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ private void updateButtons() {
+ okButton.setEnabled(isComplete().isOK());
+ }
+
+ public XFloat getHours() {
+ return hours;
+ }
+
+ public XRadioButton getEachRadio() {
+ return eachRadio;
+ }
+
+ public XRadioButton getSplitRadio() {
+ return splitRadio;
+ }
+
+ public XPercent getPercent() {
+ return percent;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SimpleTaskResolutionOptionsRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SimpleTaskResolutionOptionsRule.java
new file mode 100644
index 00000000000..78a2ed9769d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/SimpleTaskResolutionOptionsRule.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.ats.util.widgets.dialog;
+
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SimpleTaskResolutionOptionsRule extends TaskResolutionOptionRule {
+
+ public static String ID = "ats.simpleTaskResolutionOptions";
+ public static enum States {
+ None, In_Work, Waiting, Coded, Awaiting_Review, No_Change, Complete
+ };
+ public static String resolutionOptionsXml =
+ "<AtsTaskOptions> " +
+ //
+ "<AtsTaskOption name=\"" + States.None.name() + "\" desc=\"Nothing has been done.\" complete=\"false\" percent=\"0\"/> " +
+ //
+ "<AtsTaskOption name=\"In_Work\" desc=\"Working on task.\" complete=\"false\" percent=\"15\"/> " +
+ //
+ "<AtsTaskOption name=\"Waiting\" desc=\"Waiting on some other dependency.\" complete=\"false\" percent=\"15\" color=\"DARK_RED\"/> " +
+ //
+ "<AtsTaskOption name=\"Coded\" desc=\"Code is completed but not tested.\" complete=\"false\" percent=\"75\"/> " +
+ //
+ "<AtsTaskOption name=\"Awaiting_Review\" desc=\"Awaiting a review on changes made.\" complete=\"false\" percent=\"95\" color=\"DARK_RED\"/> " +
+ //
+ "<AtsTaskOption name=\"No_Change\" desc=\"No change to code is necessary.\" complete=\"true\" percent=\"100\" color=\"DARK_GREEN\"/> " +
+ //
+ "<AtsTaskOption name=\"Complete\" desc=\"Code finished.\" complete=\"true\" percent=\"100\" color=\"DARK_GREEN\"/> " +
+ //
+ "</AtsTaskOptions>";
+
+ /**
+ * @param name
+ * @param id
+ * @param value
+ */
+ public SimpleTaskResolutionOptionsRule() {
+ super(ID, ID, resolutionOptionsXml);
+ }
+
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, this);
+ }
+
+ public static void relatePageToRules(String pageId) throws OseeCoreException {
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(pageId, ID);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListAndTitleDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListAndTitleDialog.java
new file mode 100644
index 00000000000..94289e2b98e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListAndTitleDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+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;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StateListAndTitleDialog extends StateListDialog {
+
+ String reviewTitle;
+ XText titleText;
+
+ /**
+ * @param title
+ * @param message
+ * @param values
+ */
+ public StateListAndTitleDialog(String title, String message, Collection<String> values) {
+ super(title, message, values);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout());
+ comp.setLayoutData(new GridData(SWT.FILL, SWT.LEFT, true, false));
+ titleText = new XText("Review Title");
+ titleText.createWidgets(comp, 1);
+ if (reviewTitle != null) titleText.set(reviewTitle);
+ titleText.getStyledText().setLayoutData(new GridData(SWT.FILL, SWT.LEFT, true, false));
+ titleText.addXModifiedListener(new XModifiedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener#widgetModified(org.eclipse.osee.framework.ui.skynet.widgets.XWidget)
+ */
+ @Override
+ public void widgetModified(XWidget widget) {
+ reviewTitle = titleText.get();
+ }
+ });
+
+ Control control = super.createDialogArea(container);
+ getTableViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare((String) e1, (String) e2);
+ }
+ });
+
+ return control;
+ }
+
+ /**
+ * @return the reviewTitle
+ */
+ public String getReviewTitle() {
+ return reviewTitle;
+ }
+
+ /**
+ * @param reviewTitle the reviewTitle to set
+ */
+ public void setReviewTitle(String reviewTitle) {
+ this.reviewTitle = reviewTitle;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListDialog.java
new file mode 100644
index 00000000000..f944a20e5d0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/StateListDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.plugin.util.StringLabelProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StateListDialog extends ListDialog {
+
+ public StateListDialog(String title, String message, Collection<String> values) {
+ super(Display.getCurrent().getActiveShell());
+ setInput(values);
+ setTitle(title);
+ setMessage(message);
+ setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new StringLabelProvider());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control control = super.createDialogArea(container);
+ getTableViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare((String) e1, (String) e2);
+ }
+ });
+ return control;
+ }
+
+ public String getSelectedState() {
+ return (String) getResult()[0];
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskOptionStatusDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskOptionStatusDialog.java
new file mode 100644
index 00000000000..2ce882d7fbb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskOptionStatusDialog.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.ats.util.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboViewer;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskOptionStatusDialog extends SMAStatusDialog {
+
+ XComboViewer resolutionCombo = new XComboViewer("Resolution");
+ private final List<TaskResOptionDefinition> options;
+ private final Map<String, TaskResOptionDefinition> nameToResDef = new HashMap<String, TaskResOptionDefinition>();
+ private TaskResOptionDefinition selectedOption;
+ private static String MESSAGE = "Enter percent complete and number of hours you spent since last status.";
+ private static String OPTION_MESSAGE =
+ "Select resolution, enter percent complete and number of hours you spent since last status.";
+
+ /**
+ * @param parentShell
+ * @param dialogTitle
+ * @param dialogMessage
+ * @param showPercent
+ * @param options
+ */
+ public TaskOptionStatusDialog(Shell parentShell, String dialogTitle, String dialogMessage, boolean showPercent, List<TaskResOptionDefinition> options, Collection<? extends StateMachineArtifact> tasks) {
+ super(parentShell, dialogTitle, (options == null ? MESSAGE : OPTION_MESSAGE), showPercent, tasks);
+ this.options = options;
+ if (options != null) {
+ for (TaskResOptionDefinition trd : options)
+ nameToResDef.put(trd.getName(), trd);
+ }
+ }
+
+ @Override
+ protected IStatus isComplete() {
+ TaskResOptionDefinition trd = getSelectedOptionDef();
+ if (trd == null) return Status.OK_STATUS;
+ int percentComp = percent.getInt();
+ if (trd.isCompleteable() && (percentComp != 100)) {
+ return new Status(IStatus.ERROR, AtsPlugin.PLUGIN_ID, "Completed resolution must have %Complete == 100");
+ }
+ if (percentComp == 100 && !trd.isCompleteable()) {
+ return new Status(IStatus.ERROR, AtsPlugin.PLUGIN_ID,
+ "Can't have 100% complete with a non-Completed resolution");
+ }
+ return super.isComplete();
+ }
+
+ public TaskResOptionDefinition getSelectedOptionDef() {
+ return selectedOption;
+ }
+
+ @Override
+ protected void createPreCustomArea(Composite parent) {
+ super.createPreCustomArea(parent);
+ if (options != null) {
+ resolutionCombo.setLabelProvider(new ResolutionLabelProvider());
+ resolutionCombo.setContentProvider(new ArrayContentProvider());
+ resolutionCombo.setRequiredEntry(true);
+ ArrayList<Object> objs = new ArrayList<Object>();
+ for (Object obj : options)
+ objs.add(obj);
+ resolutionCombo.setInput(objs);
+ resolutionCombo.createWidgets(parent, 2);
+ try {
+ if (smas.size() == 1) {
+ String selOption = smas.iterator().next().getWorldViewResolution();
+ if (selOption != null && !selOption.equals("")) {
+ selectedOption = nameToResDef.get(selOption);
+ if (selectedOption != null) {
+ ArrayList<Object> sel = new ArrayList<Object>();
+ sel.add(selectedOption);
+ resolutionCombo.setSelected(sel);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ resolutionCombo.getCombo().setVisibleItemCount(20);
+ resolutionCombo.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selectedOption = (TaskResOptionDefinition) resolutionCombo.getSelected();
+ if (selectedOption != null && !selectedOption.getPercent().equals("")) {
+ int newPercent = (new Integer(selectedOption.getPercent())).intValue();
+ percent.set(newPercent + "");
+ updateStatusLabel();
+ }
+ };
+ });
+ }
+ }
+ public class ResolutionLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ TaskResOptionDefinition trd = ((TaskResOptionDefinition) arg0);
+ return trd.getName() + " - " + trd.getDesc() + (trd.isCompleteable() ? " (Completed)" : "");
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResOptionDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResOptionDefinition.java
new file mode 100644
index 00000000000..620e4686143
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResOptionDefinition.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.ats.util.widgets.dialog;
+
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.swt.SWT;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskResOptionDefinition {
+
+ private String name;
+ private String desc;
+ private boolean completeable;
+ private String color;
+ private String percent;
+ public static String ATS_TASK_OPTION_TAG = "AtsTaskOption";
+
+ public TaskResOptionDefinition() {
+ name = "";
+ desc = "";
+ percent = "";
+ completeable = false;
+ }
+
+ /**
+ * @param name
+ * @param desc
+ * @param completeable true/false of whether option allows task to be transitioned to complete
+ */
+ public TaskResOptionDefinition(String name, String desc, String completeable, String color, String defaultPercent) {
+ this(name, desc, completeable.equals("true"), color, defaultPercent);
+ }
+
+ public TaskResOptionDefinition(String name, String desc, boolean completeable, String defaultPercent) {
+ this(name, desc, completeable, "", defaultPercent);
+ }
+
+ public void setFromElement(Element element) {
+ for (int x = 0; x < element.getAttributes().getLength(); x++) {
+ Node node = element.getAttributes().item(x);
+ String nodeName = node.getNodeName();
+ if (nodeName.equals(Field.name.name()))
+ name = node.getNodeValue();
+ else if (nodeName.equals(Field.desc.name()))
+ desc = node.getNodeValue();
+ else if (nodeName.equals(Field.complete.name()))
+ completeable = Boolean.parseBoolean(node.getNodeValue());
+ else if (nodeName.equals(Field.color.name()))
+ color = node.getNodeValue();
+ else if (nodeName.equals(Field.percent.name()))
+ percent = node.getNodeValue();
+ else
+ throw new IllegalArgumentException("Unknow Task Resolution Option Attribute \"" + nodeName + "\"");
+ }
+ }
+
+ /**
+ * @param name
+ * @param desc
+ * @param completeable true if option allows task to be transitioned to complete
+ * @param color BLUE, RED, etc...; "" for black
+ */
+ public TaskResOptionDefinition(String name, String desc, boolean completeable, String color, String defaultPercent) {
+ this.name = name;
+ this.desc = desc;
+ this.completeable = completeable;
+ this.color = color;
+ this.percent = defaultPercent;
+ }
+
+ public int getColorInt() {
+ if (color == null || color.equals("")) return SWT.COLOR_BLACK;
+ if (color.equals("WHITE")) return SWT.COLOR_WHITE;
+ if (color.equals("BLACK")) return SWT.COLOR_BLACK;
+ if (color.equals("RED")) return SWT.COLOR_RED;
+ if (color.equals("DARK_RED")) return SWT.COLOR_DARK_RED;
+ if (color.equals("GREEN")) return SWT.COLOR_GREEN;
+ if (color.equals("DARK_GREEN")) return SWT.COLOR_DARK_GREEN;
+ if (color.equals("YELLOW")) return SWT.COLOR_YELLOW;
+ if (color.equals("DARK_YELLOW")) return SWT.COLOR_DARK_YELLOW;
+ if (color.equals("BLUE")) return SWT.COLOR_BLUE;
+ if (color.equals("DARK_BLUE")) return SWT.COLOR_DARK_BLUE;
+ if (color.equals("MAGENTA")) return SWT.COLOR_MAGENTA;
+ if (color.equals("DARK_MAGENTA")) return SWT.COLOR_DARK_MAGENTA;
+ if (color.equals("CYAN")) return SWT.COLOR_CYAN;
+ if (color.equals("DARK_CYAN")) return SWT.COLOR_DARK_CYAN;
+ if (color.equals("GRAY")) return SWT.COLOR_GRAY;
+ if (color.equals("DARK_GRAY")) return SWT.COLOR_DARK_GRAY;
+ return SWT.COLOR_BLACK;
+ }
+
+ /**
+ * @return true if resolution option allows task to be transitioned to complete
+ */
+ public boolean isCompleteable() {
+ return completeable;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ private enum Field {
+ name, desc, complete, percent, color
+ };
+
+ public void setFromXml(String xml) {
+ for (Field field : Field.values()) {
+ String data = AXml.getTagData(xml, field.name());
+ if (field == Field.name)
+ setName(data);
+ else if (field == Field.color)
+ setColor(data);
+ else if (field == Field.desc)
+ setDesc(data);
+ else if (field == Field.percent)
+ setPercent(data);
+ else if (field == Field.complete)
+ setComplete(data.equals("true"));
+ else
+ throw new IllegalArgumentException("Unexpected field");
+ }
+ }
+
+ public String toXml() {
+ StringBuffer sb = new StringBuffer("<" + ATS_TASK_OPTION_TAG + ">");
+ for (Field field : Field.values()) {
+ String str = "";
+ if (field == Field.name)
+ str = getName();
+ else if (field == Field.color)
+ str = getColor();
+ else if (field == Field.desc)
+ str = getDesc();
+ else if (field == Field.percent)
+ str = getPercent();
+ else if (field == Field.complete)
+ str = (isCompleteable() ? "true" : "false");
+ else
+ throw new IllegalArgumentException("Unexpected field");
+ sb.append(AXml.addTagData(field.name(), str));
+ }
+ sb.append("</" + ATS_TASK_OPTION_TAG + ">");
+ return sb.toString();
+ }
+
+ public void setComplete(boolean complete) {
+ this.completeable = complete;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String getPercent() {
+ return percent;
+ }
+
+ public void setPercent(String defaultPercent) {
+ this.percent = defaultPercent;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResolutionOptionRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResolutionOptionRule.java
new file mode 100644
index 00000000000..86344be7459
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TaskResolutionOptionRule.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskResolutionOptionRule extends WorkRuleDefinition {
+
+ private final List<TaskResOptionDefinition> options = new ArrayList<TaskResOptionDefinition>();
+ public static String ATS_TASK_OPTIONS_TAG = "AtsTaskOptions";
+ public static String WORK_TYPE = "AtsTaskResolutionOptions";
+ public static List<TaskResOptionDefinition> EMPTY_TASK_RESOLUTION_OPTIONS = new ArrayList<TaskResOptionDefinition>();
+
+ public TaskResolutionOptionRule(String name, String id, String value) {
+ super(name, id, null, WORK_TYPE);
+ addWorkDataKeyValue(ATS_TASK_OPTIONS_TAG, value);
+ }
+
+ /**
+ * @param artifact
+ * @throws Exception
+ */
+ public TaskResolutionOptionRule(Artifact artifact) throws OseeCoreException {
+ super(artifact);
+ fromXml(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), ""));
+ }
+
+ public static List<TaskResOptionDefinition> getTaskResolutionOptions(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ TaskResolutionOptionRule taskResolutionOptionRule = getTaskResolutionOptionRule(workPageDefinition);
+ if (taskResolutionOptionRule != null) return taskResolutionOptionRule.getOptions();
+ return EMPTY_TASK_RESOLUTION_OPTIONS;
+ }
+
+ public static TaskResolutionOptionRule getTaskResolutionOptionRule(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ List<WorkItemDefinition> wids =
+ workPageDefinition.getWorkItemDefinitionsByType(TaskResolutionOptionRule.WORK_TYPE);
+ if (wids.size() == 0) return null;
+ WorkItemDefinition workItemDefinition = wids.iterator().next();
+ if (workItemDefinition != null) {
+ TaskResolutionOptionRule taskResolutionOptionRule =
+ new TaskResolutionOptionRule(null, GUID.generateGuidStr(), null);
+ taskResolutionOptionRule.fromXml(workItemDefinition.getWorkDataValue(ATS_TASK_OPTIONS_TAG));
+ return taskResolutionOptionRule;
+ }
+ return null;
+ }
+
+ public void setFromDoc(Document doc) {
+ NodeList nodes = doc.getElementsByTagName(TaskResOptionDefinition.ATS_TASK_OPTION_TAG);
+ if (nodes.getLength() > 0) {
+ for (int x = 0; x < nodes.getLength(); x++) {
+ Element element = (Element) nodes.item(x);
+ TaskResOptionDefinition trd = new TaskResOptionDefinition();
+ trd.setFromElement(element);
+ options.add(trd);
+ }
+ }
+ }
+
+ public void fromXml(String xmlStr) throws OseeCoreException {
+ try {
+ setFromDoc(Jaxp.readXmlDocument(xmlStr));
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ public String toXml() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<" + TaskResOptionDefinition.ATS_TASK_OPTION_TAG + ">\n");
+ for (TaskResOptionDefinition def : options) {
+ sb.append(def.toXml() + "\n");
+ }
+ sb.append("</" + TaskResOptionDefinition.ATS_TASK_OPTION_TAG + ">\n");
+ return sb.toString();
+ }
+
+ public List<TaskResOptionDefinition> getOptions() {
+ return options;
+ }
+
+ /**
+ * Return the order index number of the given option name. Used for comparisons of resolutions like < and > by
+ * getting both indexes and doing a mathmatical comparison.
+ *
+ * @param name
+ * @return index number (starting at 1) or null if not found
+ */
+ public Integer getResolutionOptionOrderIndex(String name) {
+ int x = 1;
+ for (TaskResOptionDefinition option : options) {
+ if (option.getName().equals(name)) return x;
+ x++;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionCheckTreeDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionCheckTreeDialog.java
new file mode 100644
index 00000000000..225daf84cdf
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionCheckTreeDialog.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEECheckedFilteredTreeDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamDefinitionCheckTreeDialog extends OSEECheckedFilteredTreeDialog {
+
+ private static PatternFilter patternFilter = new PatternFilter();
+ private final Active active;
+ private Set<TeamDefinitionArtifact> initialTeamDefs;
+
+ public TeamDefinitionCheckTreeDialog(String title, String message, Active active) {
+ super(title, message, patternFilter, new TeamDefinitionTreeContentProvider(active), new ArtifactLabelProvider());
+ this.active = active;
+ }
+
+ public Collection<TeamDefinitionArtifact> getChecked() {
+ if (super.getTreeViewer() == null) return Collections.emptyList();
+ Set<TeamDefinitionArtifact> checked = new HashSet<TeamDefinitionArtifact>();
+ for (Object obj : super.getTreeViewer().getChecked()) {
+ checked.add((TeamDefinitionArtifact) obj);
+ }
+ return checked;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control comp = super.createDialogArea(container);
+ try {
+ getTreeViewer().getViewer().setInput(TeamDefinitionArtifact.getTopLevelTeamDefinitions(active));
+ getTreeViewer().getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ for (TeamDefinitionArtifact teamDef : getChecked()) {
+ if (!teamDef.isActionable()) {
+ AWorkbench.popup("ERROR", ActionableItemArtifact.getNotActionableItemError(teamDef));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ if (getInitialTeamDefs() != null) getTreeViewer().setInitalChecked(getInitialTeamDefs());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return comp;
+ }
+
+ @Override
+ protected Result isComplete() {
+ try {
+ for (TeamDefinitionArtifact aia : getChecked()) {
+ if (!aia.isActionable()) {
+ return Result.FalseResult;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return super.isComplete();
+ }
+
+ /**
+ * @return the initialTeamDefs
+ */
+ public Set<TeamDefinitionArtifact> getInitialTeamDefs() {
+ return initialTeamDefs;
+ }
+
+ /**
+ * @param initialTeamDefs the initialTeamDefs to set
+ */
+ public void setInitialTeamDefs(Set<TeamDefinitionArtifact> initialTeamDefs) {
+ this.initialTeamDefs = initialTeamDefs;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionDialog.java
new file mode 100644
index 00000000000..08e1553da8e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameSorter;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamDefinitionDialog extends org.eclipse.ui.dialogs.ListDialog {
+
+ /**
+ *
+ */
+ public TeamDefinitionDialog(String title, String message) {
+ super(Display.getCurrent().getActiveShell());
+ this.setTitle(title);
+ this.setMessage(message);
+ this.setContentProvider(new ArrayContentProvider() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection) {
+ Collection list = (Collection) inputElement;
+ return (list.toArray(new TeamDefinitionArtifact[list.size()]));
+ }
+ return super.getElements(inputElement);
+ }
+ });
+ setLabelProvider(new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof TeamDefinitionArtifact) {
+ return ((TeamDefinitionArtifact) element).getDescriptiveName();
+ }
+ return "Unknown element type";
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof TeamDefinitionArtifact) {
+ return ImageManager.getImage((TeamDefinitionArtifact) element);
+ }
+ return null;
+ }
+
+ });
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTableViewer().setSorter(new ArtifactNameSorter());
+ return c;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeContentProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeContentProvider.java
new file mode 100644
index 00000000000..2c1f0f258b4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeContentProvider.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+public class TeamDefinitionTreeContentProvider implements ITreeContentProvider {
+
+ private final Active active;
+
+ public TeamDefinitionTreeContentProvider() {
+ super();
+ this.active = null;
+ }
+
+ public TeamDefinitionTreeContentProvider(Active active) {
+ super();
+ this.active = active;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection)
+ return ((Collection) parentElement).toArray();
+ else if (parentElement instanceof TeamDefinitionArtifact && active != null) {
+ try {
+ TeamDefinitionArtifact teamDef = ((TeamDefinitionArtifact) parentElement);
+ return AtsLib.getActiveSet(Artifacts.getChildrenOfTypeSet(teamDef, TeamDefinitionArtifact.class, false),
+ active, TeamDefinitionArtifact.class).toArray();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ return new Object[] {};
+ }
+
+ public Object getParent(Object element) {
+ try {
+ if (element instanceof TeamDefinitionArtifact) {
+ return ((TeamDefinitionArtifact) element).getParent();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeDialog.java
new file mode 100644
index 00000000000..6296a98b10b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeDialog.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.ats.util.widgets.dialog;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamDefinitionTreeDialog extends TeamDefinitionTreeWithChildrenDialog {
+
+ XCheckBox showFinishedCheck = new XCheckBox("Show Completed and Cancelled Workflows");
+ Boolean showFinished = false;
+ XCheckBox showActionCheck = new XCheckBox("Show Action instead of Workflows");
+ Boolean showAction = false;
+
+ public TeamDefinitionTreeDialog(Active active) throws OseeCoreException {
+ super(active);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Control control = super.createDialogArea(container);
+
+ if (showFinished != null) {
+ showFinishedCheck.createWidgets(dialogComp, 2);
+ showFinishedCheck.set(showFinished);
+ showFinishedCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ showFinished = showFinishedCheck.isSelected();
+ };
+ });
+ }
+
+ if (showAction != null) {
+ showActionCheck.createWidgets(dialogComp, 2);
+ showActionCheck.set(showAction);
+ showActionCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ showAction = showActionCheck.isSelected();
+ };
+ });
+ }
+
+ return control;
+ }
+
+ public Boolean isShowFinished() {
+ return showFinished;
+ }
+
+ public Boolean isShowAction() {
+ return showAction;
+ }
+
+ /**
+ * @param showFinished true/false default for showAction checkbox; null to not display showAction checkbox
+ */
+ public void setShowFinished(Boolean showFinished) {
+ this.showFinished = showFinished;
+ }
+
+ /**
+ * @param showAction true/false default for showAction checkbox; null to not display showAction checkbox
+ */
+ public void setShowAction(Boolean showAction) {
+ this.showAction = showAction;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeWithChildrenDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeWithChildrenDialog.java
new file mode 100644
index 00000000000..e00adb55b7a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamDefinitionTreeWithChildrenDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamDefinitionTreeWithChildrenDialog extends CheckedTreeSelectionDialog {
+
+ XCheckBox recurseChildrenCheck = new XCheckBox("Include all children Team Definition Actions");
+ boolean recurseChildren = false;
+ protected Composite dialogComp;
+
+ public TeamDefinitionTreeWithChildrenDialog(Active active) throws OseeCoreException {
+ this(active, TeamDefinitionArtifact.getTeamTopLevelDefinitions(active));
+ }
+
+ public TeamDefinitionTreeWithChildrenDialog(Active active, Collection<TeamDefinitionArtifact> teamDefinitionArtifacts) throws OseeCoreException {
+ super(Display.getCurrent().getActiveShell(), new ArtifactDescriptiveLabelProvider(),
+ new TeamDefinitionTreeContentProvider(active));
+ setTitle("Select Team Definition");
+ setMessage("Select Team Definition");
+ setComparator(new ArtifactNameSorter());
+ setInput(teamDefinitionArtifacts);
+ }
+
+ /**
+ * @return selected team defs and children if recurseChildren was checked
+ * @throws OseeCoreException
+ */
+ public Collection<TeamDefinitionArtifact> getResultAndRecursedTeamDefs() throws OseeCoreException {
+ Set<TeamDefinitionArtifact> teamDefs = new HashSet<TeamDefinitionArtifact>(10);
+ for (Object obj : getResult()) {
+ teamDefs.add((TeamDefinitionArtifact) obj);
+ if (recurseChildren) {
+ teamDefs.addAll(Artifacts.getChildrenOfTypeSet((Artifact) obj, TeamDefinitionArtifact.class, true));
+ }
+ }
+ return teamDefs;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Control control = super.createDialogArea(container);
+ dialogComp = new Composite(control.getParent(), SWT.NONE);
+ dialogComp.setLayout(new GridLayout(2, false));
+ dialogComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ recurseChildrenCheck.createWidgets(dialogComp, 2);
+ recurseChildrenCheck.set(recurseChildren);
+ recurseChildrenCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ recurseChildren = recurseChildrenCheck.isSelected();
+ };
+ });
+
+ return container;
+ }
+
+ /**
+ * @return the recurseChildren
+ */
+ public boolean isRecurseChildren() {
+ return recurseChildren;
+ }
+
+ /**
+ * @param recurseChildren the recurseChildren to set
+ */
+ public void setRecurseChildren(boolean recurseChildren) {
+ this.recurseChildren = recurseChildren;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamVersionListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamVersionListDialog.java
new file mode 100644
index 00000000000..c226bdb4995
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/TeamVersionListDialog.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.dialog;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.ArtifactViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Display;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamVersionListDialog extends SelectionDialog {
+
+ XComboViewer teamCombo = new XComboViewer("Team");
+ XComboViewer versionCombo = new XComboViewer("Version");
+ VersionArtifact selectedVersion = null;
+ TeamDefinitionArtifact selectedTeamDef = null;
+ private final Active active;
+ private final TeamDefinitionArtifact teamDef;
+
+ public TeamVersionListDialog(Active active) {
+ super(Display.getCurrent().getActiveShell());
+ this.active = active;
+ this.teamDef = null;
+ setTitle("Select Version");
+ setMessage("Select Version");
+ }
+
+ public TeamVersionListDialog(TeamDefinitionArtifact teamDef, Active active) {
+ super(Display.getCurrent().getActiveShell());
+ this.teamDef = teamDef;
+ this.active = active;
+ setTitle("Select Version");
+ setMessage("Select Version");
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ ArrayList<Object> objs = new ArrayList<Object>();
+ try {
+ for (Artifact art : TeamDefinitionArtifact.getTeamReleaseableDefinitions(active))
+ objs.add((Object) art);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ if (teamDef == null) {
+ teamCombo.setInput(objs);
+ teamCombo.setLabelProvider(new ArtifactDescriptiveLabelProvider());
+ teamCombo.setContentProvider(new ArrayContentProvider());
+ teamCombo.setSorter(new ArtifactViewerSorter());
+ teamCombo.setGrabHorizontal(true);
+ teamCombo.createWidgets(comp, 2);
+ teamCombo.getCombo().setVisibleItemCount(20);
+ teamCombo.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ ArrayList<Object> objs = new ArrayList<Object>();
+ try {
+ selectedTeamDef = (TeamDefinitionArtifact) teamCombo.getSelected();
+ for (Artifact pda : selectedTeamDef.getVersionsArtifacts(VersionReleaseType.Both))
+ objs.add((Object) pda);
+ versionCombo.setInput(objs);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ };
+ });
+ } else
+ selectedTeamDef = teamDef;
+
+ versionCombo.setLabelProvider(new ArtifactDescriptiveLabelProvider());
+ versionCombo.setContentProvider(new ArrayContentProvider());
+ versionCombo.setSorter(new ArtifactViewerSorter());
+ versionCombo.setGrabHorizontal(true);
+ versionCombo.createWidgets(comp, 2);
+ versionCombo.getCombo().setVisibleItemCount(20);
+ versionCombo.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selectedVersion = (VersionArtifact) versionCombo.getSelected();
+ };
+ });
+ if (teamDef != null) {
+ objs = new ArrayList<Object>();
+ try {
+ for (Artifact pda : teamDef.getVersionsArtifacts(VersionReleaseType.Both))
+ objs.add((Object) pda);
+ versionCombo.setInput(objs);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ return container;
+ }
+
+ public VersionArtifact getSelectedVersion() {
+ return selectedVersion;
+ }
+
+ /**
+ * @return the selectedTeamDef
+ */
+ public TeamDefinitionArtifact getSelectedTeamDef() {
+ return selectedTeamDef;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/UserCommunityListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/UserCommunityListDialog.java
new file mode 100644
index 00000000000..03c1ffc62a3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/UserCommunityListDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.UserCommunity;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserCommunityListDialog extends org.eclipse.ui.dialogs.ListDialog {
+
+ public UserCommunityListDialog() {
+ super(Display.getCurrent().getActiveShell());
+ this.setTitle("Select User Community");
+ this.setMessage("Select User Community");
+ this.setContentProvider(new ArrayContentProvider() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection) {
+ Collection list = (Collection) inputElement;
+ return (list.toArray(new String[list.size()]));
+ }
+ return super.getElements(inputElement);
+ }
+ });
+ setLabelProvider(new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof String) {
+ return ((String) element);
+ }
+ return "Unknown element type";
+ }
+
+ });
+ setInput(UserCommunity.getInstance().getUserCommunityNames());
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTableViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ return getComparator().compare((String) o1, (String) o2);
+ }
+ });
+ return c;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionArtifactLabelProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionArtifactLabelProvider.java
new file mode 100644
index 00000000000..26fb6f0cfbe
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionArtifactLabelProvider.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.ats.util.widgets.dialog;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VersionArtifactLabelProvider extends LabelProvider {
+
+ public VersionArtifactLabelProvider() {
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof VersionArtifact) {
+ VersionArtifact verArt = ((VersionArtifact) element);
+ String str = verArt.getDescriptiveName();
+ try {
+ if (verArt.getEstimatedReleaseDate() != null) {
+ str += " - Estimated Release: " + XDate.getDateStr(verArt.getEstimatedReleaseDate(), XDate.MMDDYY);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return str;
+ }
+ return "Unknown element type";
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof VersionArtifact) {
+ return ImageManager.getImage((VersionArtifact) element);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionListDialog.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionListDialog.java
new file mode 100644
index 00000000000..f87f99bb7bd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/dialog/VersionListDialog.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.ats.util.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameReverseSorter;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VersionListDialog extends org.eclipse.ui.dialogs.ListDialog {
+
+ public VersionListDialog(String title, String message, Collection<VersionArtifact> verArts) {
+ super(Display.getCurrent().getActiveShell());
+ this.setTitle(title);
+ this.setMessage(message);
+ this.setContentProvider(new ArrayContentProvider() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection) {
+ Collection list = (Collection) inputElement;
+ return (list.toArray(new VersionArtifact[list.size()]));
+ }
+ return super.getElements(inputElement);
+ }
+ });
+ setLabelProvider(new VersionArtifactLabelProvider());
+ setInput(verArts);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTableViewer().setSorter(new ArtifactNameReverseSorter());
+ return c;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRole.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRole.java
new file mode 100644
index 00000000000..b9ec028cf9c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRole.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.role;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserRole {
+
+ private Role role = Role.Reviewer;
+ private User user;
+ private Double hoursSpent = null;
+ private String guid = GUID.generateGuidStr();
+ private Boolean completed = false;
+
+ public static enum Role {
+ Moderator, Reviewer, Author;
+ public static Collection<String> strValues() {
+ Set<String> values = new HashSet<String>();
+ for (Enum<Role> e : values()) {
+ values.add(e.name());
+ }
+ return values;
+ }
+ };
+
+ public UserRole() throws OseeCoreException {
+ this(Role.Reviewer, UserManager.getUser(), null, false);
+ }
+
+ public UserRole(Role role, User user) {
+ this(role, user, 0.0, false);
+ }
+
+ public UserRole(Role role, User user, Double hoursSpent, Boolean completed) {
+ this.role = role;
+ this.user = user;
+ this.hoursSpent = hoursSpent;
+ this.completed = completed;
+ }
+
+ public UserRole(String xml) {
+ fromXml(xml);
+ }
+
+ public void update(UserRole dItem) throws OseeCoreException {
+ fromXml(dItem.toXml());
+ }
+
+ public String toXml() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AXml.addTagData("role", role.name()));
+ sb.append(AXml.addTagData("userId", user.getUserId()));
+ sb.append(AXml.addTagData("hoursSpent", hoursSpent == null ? "" : String.valueOf(hoursSpent)));
+ sb.append(AXml.addTagData("completed", String.valueOf(completed)));
+ sb.append(AXml.addTagData("guid", guid));
+ return sb.toString();
+ }
+
+ public void fromXml(String xml) {
+ try {
+ this.role = Role.valueOf(AXml.getTagData(xml, "role"));
+ this.user = UserManager.getUserByUserId(AXml.getTagData(xml, "userId"));
+ this.hoursSpent =
+ AXml.getTagData(xml, "hoursSpent").equals("") ? null : Double.valueOf(AXml.getTagData(xml, "hoursSpent")).doubleValue();
+ String completedStr = AXml.getTagData(xml, "completed");
+ if (completedStr != null)
+ this.completed = completedStr.equals("true");
+ else
+ this.completed = false;
+ this.guid = AXml.getTagData(xml, "guid");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof UserRole) {
+ UserRole userRole = (UserRole) obj;
+ return userRole.getGuid().equals(getGuid());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return getGuid().hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return role + " - " + user + " - " + hoursSpent + " - " + (completed ? "Completed" : "InWork");
+ }
+
+ /**
+ * @return the role
+ */
+ public Role getRole() {
+ return role;
+ }
+
+ /**
+ * @param role the role to set
+ */
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ /**
+ * @return the user
+ */
+ public User getUser() {
+ return user;
+ }
+
+ /**
+ * @param user the user to set
+ */
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ /**
+ * @return the hoursSpent
+ */
+ public Double getHoursSpent() {
+ return hoursSpent;
+ }
+
+ public String getHoursSpentStr() {
+ return hoursSpent == null ? "" : AtsLib.doubleToStrString(hoursSpent, true);
+ }
+
+ /**
+ * @param hoursSpent the hoursSpent to set
+ */
+ public void setHoursSpent(Double hoursSpent) {
+ this.hoursSpent = hoursSpent;
+ }
+
+ /**
+ * @return the guid
+ */
+ public String getGuid() {
+ return guid;
+ }
+
+ /**
+ * @param guid the guid to set
+ */
+ public void setGuid(String guid) {
+ this.guid = guid;
+ }
+
+ /**
+ * @return the completed
+ */
+ public boolean isCompleted() {
+ return completed;
+ }
+
+ /**
+ * @param completed the completed to set
+ */
+ public void setCompleted(boolean completed) {
+ this.completed = completed;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleContentProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleContentProvider.java
new file mode 100644
index 00000000000..ba368147abe
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleContentProvider.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.util.widgets.role;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+
+public class UserRoleContentProvider implements ITreeContentProvider {
+
+ protected Collection<UserRole> rootSet = new HashSet<UserRole>();
+ private final UserRoleXViewer xViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public UserRoleContentProvider(UserRoleXViewer WorldXViewer) {
+ super();
+ this.xViewer = WorldXViewer;
+ }
+
+ public void add(final UserRole item) {
+ add(Arrays.asList(item));
+ }
+
+ public void add(final Collection<? extends UserRole> items) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.addAll(items);
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void set(final Collection<? extends UserRole> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ clear();
+ add(arts);
+ };
+ });
+ }
+
+ public void remove(final Artifact art) {
+ remove(Arrays.asList(art));
+ }
+
+ public void remove(final Collection<? extends Artifact> arts) {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ ArrayList<UserRole> delItems = new ArrayList<UserRole>();
+ delItems.addAll(rootSet);
+ for (Artifact art : arts) {
+ for (UserRole wai : rootSet)
+ if (wai.equals(art)) delItems.add(wai);
+ }
+ removeItems(delItems);
+ }
+
+ public void removeItems(final Collection<? extends UserRole> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.remove(arts);
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void clear() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.clear();
+ xViewer.refresh();
+ };
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) {
+ return (Object[]) parentElement;
+ }
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the rootSet
+ */
+ public Collection<UserRole> getRootSet() {
+ return rootSet;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleLabelProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleLabelProvider.java
new file mode 100644
index 00000000000..4cd432a7fbc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleLabelProvider.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.ats.util.widgets.role;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+public class UserRoleLabelProvider extends XViewerLabelProvider {
+ Font font = null;
+
+ private final UserRoleXViewer xViewer;
+
+ public UserRoleLabelProvider(UserRoleXViewer xViewer) {
+ super(xViewer);
+ this.xViewer = xViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn dCol, int columnIndex) throws OseeCoreException {
+ UserRole roleItem = (UserRole) element;
+ if (dCol.equals(UserRoleXViewerFactory.User_Col)) {
+ return ImageManager.getImage(roleItem.getUser());
+ } else if (dCol.equals(UserRoleXViewerFactory.Role_Col)) {
+ return ImageManager.getImage(AtsImage.ROLE);
+ } else if (dCol.equals(UserRoleXViewerFactory.Hours_Spent_Col)) {
+ return ImageManager.getImage(FrameworkImage.CLOCK);
+ } else if (dCol.equals(UserRoleXViewerFactory.Completed_Col)) {
+ return roleItem.isCompleted() ? ImageManager.getImage(FrameworkImage.CHECKBOX_ENABLED) : ImageManager.getImage(FrameworkImage.CHECKBOX_DISABLED);
+ } else if (dCol.equals(UserRoleXViewerFactory.Num_Major_Col)) {
+ return Severity.getImage(Severity.Major);
+ } else if (dCol.equals(UserRoleXViewerFactory.Num_Minor_Col)) {
+ return Severity.getImage(Severity.Minor);
+ } else if (dCol.equals(UserRoleXViewerFactory.Num_Issues_Col)) {
+ return Severity.getImage(Severity.Issue);
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn aCol, int columnIndex) throws OseeCoreException {
+
+ UserRole defectItem = ((UserRole) element);
+ if (aCol.equals(UserRoleXViewerFactory.User_Col))
+ return defectItem.getUser().getName();
+ else if (aCol.equals(UserRoleXViewerFactory.Hours_Spent_Col))
+ return defectItem.getHoursSpent() == null ? "" : AtsLib.doubleToStrString(defectItem.getHoursSpent(), false);
+ else if (aCol.equals(UserRoleXViewerFactory.Role_Col))
+ return defectItem.getRole().name();
+ else if (aCol.equals(UserRoleXViewerFactory.Completed_Col))
+ return String.valueOf(defectItem.isCompleted());
+ else if (aCol.equals(UserRoleXViewerFactory.Num_Major_Col))
+ return xViewer.getXUserRoleViewer().getReviewArt().getUserRoleManager().getNumMajor(defectItem.getUser()) + "";
+ else if (aCol.equals(UserRoleXViewerFactory.Num_Minor_Col))
+ return xViewer.getXUserRoleViewer().getReviewArt().getUserRoleManager().getNumMinor(defectItem.getUser()) + "";
+ else if (aCol.equals(UserRoleXViewerFactory.Num_Issues_Col)) return xViewer.getXUserRoleViewer().getReviewArt().getUserRoleManager().getNumIssues(
+ defectItem.getUser()) + "";
+ return "unhandled column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public UserRoleXViewer getTreeViewer() {
+ return xViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleManager.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleManager.java
new file mode 100644
index 00000000000..52c336fed74
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleManager.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.ats.util.widgets.role;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.IReviewArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem;
+import org.eclipse.osee.ats.util.widgets.defect.DefectItem.Severity;
+import org.eclipse.osee.ats.util.widgets.role.UserRole.Role;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserRoleManager {
+
+ private final ReviewSMArtifact artifact;
+ private boolean enabled = true;
+ private static String ATS_DEFECT_TAG = "AtsRole";
+ private static String DEFECT_ITEM_TAG = "Role";
+ private static String REVIEW_DEFECT_ATTRIBUTE_NAME = "ats.Role";
+
+ public UserRoleManager(ReviewSMArtifact artifact) {
+ this.artifact = artifact;
+ }
+
+ public String getHtml() throws OseeCoreException {
+ if (getUserRoles().size() == 0) return "";
+ StringBuffer sb = new StringBuffer();
+ sb.append(AHTML.addSpace(1) + AHTML.getLabelStr(AHTML.LABEL_FONT, "Defects"));
+ sb.append(getTable());
+ return sb.toString();
+ }
+
+ public Set<UserRole> getUserRoles() throws OseeCoreException {
+ Set<UserRole> uRoles = new HashSet<UserRole>();
+ String xml = artifact.getSoleAttributeValue(REVIEW_DEFECT_ATTRIBUTE_NAME, "");
+ Matcher m =
+ java.util.regex.Pattern.compile("<" + DEFECT_ITEM_TAG + ">(.*?)</" + DEFECT_ITEM_TAG + ">").matcher(xml);
+ while (m.find()) {
+ UserRole item = new UserRole(m.group());
+ uRoles.add(item);
+ }
+ return uRoles;
+ }
+
+ public Set<UserRole> getRoleUsersReviewComplete() throws OseeCoreException {
+ Set<UserRole> cRoles = new HashSet<UserRole>();
+ for (UserRole role : getUserRoles(Role.Reviewer)) {
+ if (role.isCompleted()) {
+ cRoles.add(role);
+ }
+ }
+ return cRoles;
+ }
+
+ public Set<User> getRoleUsersAuthorModerator() throws OseeCoreException {
+ Set<User> roles = new HashSet<User>();
+ roles = getRoleUsers(Role.Author);
+ if (roles.isEmpty()) {
+ roles = getRoleUsers(Role.Moderator);
+ }
+ if (roles.isEmpty()) {
+ roles.add(UserManager.getUser());
+ }
+ return roles;
+ }
+
+ public Set<UserRole> getUserRoles(Role role) throws OseeCoreException {
+ Set<UserRole> roles = new HashSet<UserRole>();
+ for (UserRole uRole : getUserRoles())
+ if (uRole.getRole() == role) roles.add(uRole);
+ return roles;
+ }
+
+ public Set<User> getRoleUsers(Role role) throws OseeCoreException {
+ Set<User> users = new HashSet<User>();
+ for (UserRole uRole : getUserRoles())
+ if (uRole.getRole() == role) users.add(uRole.getUser());
+ return users;
+ }
+
+ private void saveRoleItems(Set<UserRole> defectItems, boolean persist, SkynetTransaction transaction) {
+ try {
+ StringBuffer sb = new StringBuffer("<" + ATS_DEFECT_TAG + ">");
+ for (UserRole item : defectItems)
+ sb.append(AXml.addTagData(DEFECT_ITEM_TAG, item.toXml()));
+ sb.append("</" + ATS_DEFECT_TAG + ">");
+ artifact.setSoleAttributeValue(REVIEW_DEFECT_ATTRIBUTE_NAME, sb.toString());
+ updateAssignees();
+ if (persist) artifact.persistAttributes(transaction);
+ rollupHoursSpentToReviewState(persist, transaction);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't create ats review defect document", ex);
+ }
+ }
+
+ public void addOrUpdateUserRole(UserRole userRole, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ Set<UserRole> roleItems = getUserRoles();
+ boolean found = false;
+ for (UserRole uRole : roleItems) {
+ if (userRole.equals(uRole)) {
+ uRole.update(userRole);
+ found = true;
+ }
+ }
+ if (!found) roleItems.add(userRole);
+ saveRoleItems(roleItems, persist, transaction);
+ }
+
+ private void updateAssignees() throws OseeCoreException {
+ // Set assigness based on roles that are not set as completed
+ Set<User> assignees = new HashSet<User>();
+ for (UserRole uRole : getUserRoles()) {
+ if (!uRole.isCompleted() && uRole.getUser() != null) assignees.add(uRole.getUser());
+ }
+ // If roles are all completed, then still need to select a user to assign to SMA
+ if (assignees.size() == 0) {
+ if (getUserRoles(Role.Author).size() > 0)
+ for (UserRole role : getUserRoles(Role.Author))
+ assignees.add(role.getUser());
+ else if (getUserRoles(Role.Moderator).size() > 0)
+ for (UserRole role : getUserRoles(Role.Moderator))
+ assignees.add(role.getUser());
+ else
+ assignees.add(UserManager.getUser());
+ }
+ // Set assigness based on roles
+ artifact.getSmaMgr().getStateMgr().setAssignees(assignees);
+ }
+
+ public void removeUserRole(UserRole userRole, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ Set<UserRole> roleItems = getUserRoles();
+ roleItems.remove(userRole);
+ saveRoleItems(roleItems, persist, transaction);
+ }
+
+ public String getTable() throws OseeCoreException {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<TABLE BORDER=\"1\" cellspacing=\"1\" cellpadding=\"3%\" width=\"100%\"><THEAD><TR><TH>Role</TH>" + "<TH>User</TH><TH>Hours</TH><TH>Major</TH><TH>Minor</TH><TH>Issues</TH>");
+ for (UserRole item : getUserRoles()) {
+ User user = item.getUser();
+ String name = "";
+ if (user != null) {
+ name = user.getName();
+ if (name == null || name.equals("")) {
+ name = user.getName();
+ }
+ }
+ builder.append("<TR>");
+ builder.append("<TD>" + item.getRole().name() + "</TD>");
+ builder.append("<TD>" + item.getUser().getDescriptiveName() + "</TD>");
+ builder.append("<TD>" + item.getHoursSpentStr() + "</TD>");
+ builder.append("<TD>" + getNumMajor(item.getUser()) + "</TD>");
+ builder.append("<TD>" + getNumMinor(item.getUser()) + "</TD>");
+ builder.append("<TD>" + getNumIssues(item.getUser()) + "</TD>");
+ builder.append("</TR>");
+ }
+ builder.append("</TABLE>");
+ return builder.toString();
+ }
+
+ public int getNumMajor(User user) throws OseeCoreException {
+ int x = 0;
+ for (DefectItem dItem : ((IReviewArtifact) artifact).getDefectManager().getDefectItems())
+ if (dItem.getSeverity() == Severity.Major && dItem.getUser() == user) x++;
+ return x;
+ }
+
+ public int getNumMinor(User user) throws OseeCoreException {
+ int x = 0;
+ for (DefectItem dItem : ((IReviewArtifact) artifact).getDefectManager().getDefectItems())
+ if (dItem.getSeverity() == Severity.Minor && dItem.getUser() == user) x++;
+ return x;
+ }
+
+ public int getNumIssues(User user) throws OseeCoreException {
+ int x = 0;
+ for (DefectItem dItem : ((IReviewArtifact) artifact).getDefectManager().getDefectItems())
+ if (dItem.getSeverity() == Severity.Issue && dItem.getUser() == user) x++;
+ return x;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public void rollupHoursSpentToReviewState(boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ double hoursSpent = 0.0;
+ for (UserRole role : getUserRoles())
+ hoursSpent += role.getHoursSpent() == null ? 0 : role.getHoursSpent();
+ SMAManager smaMgr = new SMAManager(artifact);
+ smaMgr.getStateMgr().setMetrics(hoursSpent, smaMgr.getStateMgr().getPercentComplete(), true);
+ if (persist) artifact.persistAttributes(transaction);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewer.java
new file mode 100644
index 00000000000..bb72d16597a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewer.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.ats.util.widgets.role;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+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.nebula.widgets.xviewer.XPromptChange;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.util.EnumStringSingleSelectionDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.widgets.role.UserRole.Role;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetGuiDebug;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserListDialog;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserRoleXViewer extends XViewer {
+
+ private final XUserRoleViewer xUserRoleViewer;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public UserRoleXViewer(Composite parent, int style, XUserRoleViewer xUserRoleViewer) {
+ super(parent, style, new UserRoleXViewerFactory());
+ this.xUserRoleViewer = xUserRoleViewer;
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ parent.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ ((UserRoleContentProvider) getContentProvider()).clear();
+ }
+ });
+ createMenuActions();
+ }
+
+ public void createMenuActions() {
+ setColumnMultiEditEnabled(true);
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+ }
+
+ public void updateEditMenuActions() {
+ // MenuManager mm = getMenuManager();
+ // EDIT MENU BLOCK
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+ updateEditMenuActions();
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ public Collection<UserRole> getLoadedUserRoleItems() {
+ return ((UserRoleContentProvider) getContentProvider()).getRootSet();
+ }
+
+ public void add(Collection<UserRole> userRoles) {
+ ((UserRoleContentProvider) getContentProvider()).add(userRoles);
+ }
+
+ public void set(Collection<? extends UserRole> userRoles) {
+ if (((UserRoleContentProvider) getContentProvider()) != null) ((UserRoleContentProvider) getContentProvider()).set(userRoles);
+ }
+
+ public void clear() {
+ ((UserRoleContentProvider) getContentProvider()).clear();
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ // Dispose of the table objects is done through separate dispose listener off tree
+ // Tell the label provider to release its resources
+ getLabelProvider().dispose();
+ }
+
+ public ArrayList<UserRole> getSelectedUserRoleItems() {
+ ArrayList<UserRole> arts = new ArrayList<UserRole>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((UserRole) item.getData());
+ return arts;
+ }
+
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ if (!xUserRoleViewer.isEditable()) {
+ return;
+ }
+ ArrayList<UserRole> userRoles = new ArrayList<UserRole>();
+ for (TreeItem item : treeItems) {
+ userRoles.add((UserRole) item.getData());
+ }
+ try {
+ promptChangeDate((XViewerColumn) treeColumn.getData(), userRoles, isColumnMultiEditEnabled());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#handleLeftClickInIconArea(org.eclipse.swt.widgets.TreeColumn, org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+ return handleAltLeftClick(treeColumn, treeItem);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.viewer.XViewer#handleAltLeftClick(org.eclipse.swt.widgets.TreeColumn,
+ * org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ if (!xUserRoleViewer.isEditable()) {
+ return false;
+ }
+ try {
+ // System.out.println("Column " + treeColumn.getText() + " item " +
+ // treeItem);
+ XViewerColumn aCol = (XViewerColumn) treeColumn.getData();
+ UserRole userRole = (UserRole) treeItem.getData();
+ List<UserRole> userRoles = new ArrayList<UserRole>();
+ userRoles.add(userRole);
+
+ if (aCol.equals(UserRoleXViewerFactory.Completed_Col) || aCol.equals(UserRoleXViewerFactory.Hours_Spent_Col) || aCol.equals(UserRoleXViewerFactory.Num_Minor_Col) || aCol.equals(UserRoleXViewerFactory.Num_Major_Col) || aCol.equals(UserRoleXViewerFactory.Num_Issues_Col) || aCol.equals(UserRoleXViewerFactory.User_Col) || aCol.equals(UserRoleXViewerFactory.Role_Col)) {
+ promptChangeDate(aCol, userRoles, false);
+ } else
+ throw new OseeStateException("Unhandled user role column");
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiDebug.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ private boolean setHoursSpent(Collection<UserRole> userRoles, String hours) {
+ boolean modified = false;
+ for (UserRole userRole : userRoles) {
+ userRole.setHoursSpent(hours.equals("") ? 0 : (new Double(hours)).doubleValue());
+ if (!modified) modified = true;
+ }
+ return modified;
+ }
+
+ private boolean setCompleted(Collection<UserRole> userRoles) {
+ boolean modified = false;
+ for (UserRole userRole : userRoles) {
+ if (userRole.getHoursSpent() == null) {
+ AWorkbench.popup("ERROR", "Must enter Hours Spent");
+ return false;
+ }
+ userRole.setCompleted(!userRole.isCompleted());
+ if (!modified) modified = true;
+ }
+ return modified;
+ }
+
+ private boolean setUser(Collection<UserRole> userRoles, User user) {
+ boolean modified = false;
+ for (UserRole userRole : userRoles) {
+ if (user != null && userRole.getUser() != user) {
+ userRole.setUser(user);
+ if (!modified) modified = true;
+ }
+ }
+ return modified;
+ }
+
+ private boolean setRole(Collection<UserRole> userRoles, String role) {
+ boolean modified = false;
+ for (UserRole userRole : userRoles) {
+ userRole.setRole(Role.valueOf((String) role));
+ if (!modified) modified = true;
+ }
+ return modified;
+ }
+
+ public boolean promptChangeDate(XViewerColumn xCol, Collection<UserRole> userRoles, boolean columnMultiEdit) throws OseeCoreException {
+ boolean modified = false;
+ if (userRoles != null && !userRoles.isEmpty()) {
+ UserRole userRole = (UserRole) userRoles.toArray()[0];
+ if (xCol.equals(UserRoleXViewerFactory.Hours_Spent_Col)) {
+ String hours =
+ XPromptChange.promptChangeFloat(xCol.getName(),
+ (columnMultiEdit ? 0 : (userRole.getHoursSpent() == null ? 0 : userRole.getHoursSpent())));
+ if (hours != null) {
+ modified = setHoursSpent(userRoles, hours);
+ }
+ } else if (xCol.equals(UserRoleXViewerFactory.Num_Minor_Col) || xCol.equals(UserRoleXViewerFactory.Num_Major_Col) || xCol.equals(UserRoleXViewerFactory.Num_Issues_Col)) {
+ AWorkbench.popup("ERROR", "Field is calculated");
+ } else if (xCol.equals(UserRoleXViewerFactory.Completed_Col)) {
+ modified = setCompleted(userRoles);
+ } else if (xCol.equals(UserRoleXViewerFactory.User_Col)) {
+ UserListDialog ld = new UserListDialog(Display.getCurrent().getActiveShell(), "Select New User");
+ int result = ld.open();
+ if (result == 0) {
+ modified = setUser(userRoles, ld.getSelection());
+ }
+ } else if (xCol.equals(UserRoleXViewerFactory.Role_Col)) {
+ EnumStringSingleSelectionDialog enumDialog =
+ XPromptChange.promptChangeSingleSelectEnumeration(xCol.getName(), Role.strValues(),
+ (columnMultiEdit ? null : userRole.getRole().name()));
+ if (enumDialog != null) {
+ if (enumDialog.getResult()[0] != null) {
+ modified = setRole(userRoles, (String) enumDialog.getResult()[0]);
+ }
+ }
+ }
+ if (modified) {
+ return executeTransaction(userRoles);
+ }
+ }
+ return false;
+ }
+
+ public boolean executeTransaction(Collection<UserRole> userRoles) throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(xUserRoleViewer.getReviewArt().getArtifact().getBranch());
+ for (UserRole userRole : userRoles) {
+ xUserRoleViewer.getReviewArt().getUserRoleManager().addOrUpdateUserRole(userRole, false, transaction);
+ update(userRole, null);
+ }
+ transaction.execute();
+ xUserRoleViewer.refresh();
+ xUserRoleViewer.notifyXModifiedListeners();
+ return true;
+ }
+
+ /**
+ * @return the xUserRoleViewer
+ */
+ public XUserRoleViewer getXUserRoleViewer() {
+ return xUserRoleViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewerFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewerFactory.java
new file mode 100644
index 00000000000..7591cd628e6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/UserRoleXViewerFactory.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.ats.util.widgets.role;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserRoleXViewerFactory extends SkynetXViewerFactory {
+
+ private static String NAMESPACE = "osee.ats.UserRoleXViewer";
+ public static XViewerColumn Role_Col =
+ new XViewerColumn("osee.userRole.role", "Role", 100, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn User_Col =
+ new XViewerColumn("osee.userRole.user", "User", 150, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Hours_Spent_Col =
+ new XViewerColumn("osee.userRole.hoursSpent", "Hours Spent", 80, SWT.LEFT, true, SortDataType.Float, false,
+ null);
+ public static XViewerColumn Completed_Col =
+ new XViewerColumn("osee.userRole.completed", "Completed", 80, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn Num_Major_Col =
+ new XViewerColumn("osee.userRole.major", "Major", 60, SWT.CENTER, true, SortDataType.Integer, false, null);
+ public static XViewerColumn Num_Minor_Col =
+ new XViewerColumn("osee.userRole.minor", "Minor", 60, SWT.CENTER, true, SortDataType.Integer, false, null);
+ public static XViewerColumn Num_Issues_Col =
+ new XViewerColumn("osee.userRole.issues", "Issues", 60, SWT.CENTER, true, SortDataType.Integer, false, null);
+
+ public UserRoleXViewerFactory() {
+ super(NAMESPACE);
+ registerColumn(Role_Col, User_Col, Hours_Spent_Col, Completed_Col, Num_Major_Col, Num_Minor_Col, Num_Issues_Col);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/XUserRoleViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/XUserRoleViewer.java
new file mode 100644
index 00000000000..36be6af70d8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/widgets/role/XUserRoleViewer.java
@@ -0,0 +1,459 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.util.widgets.role;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.IReviewArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XUserRoleViewer extends XWidget implements IArtifactWidget, IFrameworkTransactionEventListener {
+
+ private UserRoleXViewer xViewer;
+ private IDirtiableEditor editor;
+ private IReviewArtifact reviewArt;
+ public final static String normalColor = "#EEEEEE";
+ private static ToolItem newUserRoleItem, deleteUserRoleItem;
+ private Label extraInfoLabel;
+
+ /**
+ * @param label
+ */
+ public XUserRoleViewer() {
+ super("Roles");
+
+ OseeEventManager.addListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ if (toolkit != null) toolkit.paintBordersFor(mainComp);
+
+ createTaskActionBar(mainComp);
+
+ xViewer = new UserRoleXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ xViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ xViewer.setContentProvider(new UserRoleContentProvider(xViewer));
+ xViewer.setLabelProvider(new UserRoleLabelProvider(xViewer));
+ xViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ refreshActionEnablement();
+ }
+ });
+
+ if (toolkit != null) toolkit.adapt(xViewer.getStatusLabel(), false, false);
+
+ Tree tree = xViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 100;
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ // NOTE: Don't adapt the tree using xToolkit cause will loose xViewer's context menu
+
+ loadTable();
+ }
+
+ public void createTaskActionBar(Composite parent) {
+
+ // Button composite for state transitions, etc
+ Composite bComp = new Composite(parent, SWT.NONE);
+ // bComp.setBackground(mainSComp.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ bComp.setLayout(new GridLayout(2, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite leftComp = new Composite(bComp, SWT.NONE);
+ leftComp.setLayout(new GridLayout());
+ leftComp.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(leftComp, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+
+ Composite rightComp = new Composite(bComp, SWT.NONE);
+ rightComp.setLayout(new GridLayout());
+ rightComp.setLayoutData(new GridData(GridData.END));
+
+ ToolBar toolBar = new ToolBar(rightComp, SWT.FLAT | SWT.RIGHT);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ toolBar.setLayoutData(gd);
+ ToolItem item = null;
+
+ newUserRoleItem = new ToolItem(toolBar, SWT.PUSH);
+ newUserRoleItem.setImage(ImageManager.getImage(FrameworkImage.USER_ADD));
+ newUserRoleItem.setToolTipText("New Role");
+ newUserRoleItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleNewUserRole();
+ }
+ });
+
+ deleteUserRoleItem = new ToolItem(toolBar, SWT.PUSH);
+ deleteUserRoleItem.setImage(ImageManager.getImage(FrameworkImage.X_RED));
+ deleteUserRoleItem.setToolTipText("Delete Role");
+ deleteUserRoleItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleDeleteUserRole(false);
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh Roles");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ loadTable();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(AtsImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ refreshActionEnablement();
+ }
+
+ public void refreshActionEnablement() {
+ deleteUserRoleItem.setEnabled(isEditable() && getSelectedUserRoleItems().size() > 0);
+ newUserRoleItem.setEnabled(isEditable());
+ }
+
+ public void loadTable() {
+ try {
+ if (reviewArt != null && xViewer != null) {
+ xViewer.set(reviewArt.getUserRoleManager().getUserRoles());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ refresh();
+ }
+
+ public void handleDeleteUserRole(boolean persist) {
+ final List<UserRole> items = getSelectedUserRoleItems();
+ if (items.size() == 0) {
+ AWorkbench.popup("ERROR", "No Roles Selected");
+ return;
+ }
+ StringBuilder builder = new StringBuilder();
+ for (UserRole userRole : items)
+ builder.append("\"" + userRole.toString() + "\"\n");
+
+ boolean delete =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Delete Roles",
+ "Are You Sure You Wish to Delete the Roles(s):\n\n" + builder.toString());
+ if (delete) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(reviewArt.getArtifact().getBranch());
+ removeUserRoleHelper(items, persist, transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private void removeUserRoleHelper(List<UserRole> items, boolean persist, SkynetTransaction transaction) throws OseeCoreException {
+ for (UserRole userRole : items) {
+ reviewArt.getUserRoleManager().removeUserRole(userRole, persist, transaction);
+ xViewer.remove(userRole);
+ }
+ loadTable();
+ notifyXModifiedListeners();
+ }
+
+ public void handleNewUserRole() {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(reviewArt.getArtifact().getBranch());
+ reviewArt.getUserRoleManager().addOrUpdateUserRole(new UserRole(), false, transaction);
+ transaction.execute();
+ notifyXModifiedListeners();
+ loadTable();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<UserRole> getSelectedUserRoleItems() {
+ ArrayList<UserRole> items = new ArrayList<UserRole>();
+ if (xViewer == null) return items;
+ if (xViewer.getSelection().isEmpty()) return items;
+ Iterator i = ((IStructuredSelection) xViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ items.add((UserRole) obj);
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ return xViewer.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ xViewer.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ xViewer.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ if (xViewer == null || xViewer.getTree() == null || xViewer.getTree().isDisposed()) return;
+ xViewer.refresh();
+ validate();
+ refreshActionEnablement();
+ }
+
+ @Override
+ public IStatus isValid() {
+ try {
+ if (isRequiredEntry() && xViewer.getTree().getItemCount() == 0) {
+ extraInfoLabel.setText("At least one role entry is required. Select \"New Role\" to add.");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ return new Status(IStatus.ERROR, getClass().getSimpleName(), "At least one role entry is required");
+ }
+ IStatus result = reviewArt.isUserRoleValid(getClass().getSimpleName());
+ if (!result.isOK()) {
+ extraInfoLabel.setText(result.getMessage() + " - Select \"New Role\" to add. Select icon in cell to update value.");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ return result;
+ }
+ extraInfoLabel.setText("Select \"New Role\" to add. Select icon in cell to update value.");
+ extraInfoLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(IStatus.ERROR, getClass().getSimpleName(),
+ "Exception validating roles. See log for details. " + ex.getLocalizedMessage(), ex);
+ }
+ // Need this cause it removes all error items of this namespace
+ return new Status(IStatus.OK, getClass().getSimpleName(), "");
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ if (getXViewer().getTree().getItemCount() == 0) return "";
+ StringBuffer html = new StringBuffer();
+ try {
+ html.append(AHTML.addSpace(1) + AHTML.getLabelStr(AHTML.LABEL_FONT, "Tasks"));
+ html.append(AHTML.startBorderTable(100, normalColor, ""));
+ html.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Role", "User", "Hours", "Major", "Minor",
+ "Issues"}));
+ for (UserRole item : reviewArt.getUserRoleManager().getUserRoles()) {
+ html.append(AHTML.addRowMultiColumnTable(new String[] {item.getRole().name(), item.getUser().getName(),
+ item.getHoursSpentStr(), reviewArt.getUserRoleManager().getNumMajor(item.getUser()) + "",
+ reviewArt.getUserRoleManager().getNumMinor(item.getUser()) + "",
+ reviewArt.getUserRoleManager().getNumIssues(item.getUser()) + ""}));
+ }
+ html.append(AHTML.endBorderTable());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return "User Role Item Exception - " + ex.getLocalizedMessage();
+ }
+ return html.toString();
+ }
+
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public UserRoleXViewer getXViewer() {
+ return xViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return xViewer.getInput();
+ }
+
+ public IDirtiableEditor getEditor() {
+ return editor;
+ }
+
+ public void setEditor(IDirtiableEditor editor) {
+ this.editor = editor;
+ }
+
+ public IReviewArtifact getReviewArt() {
+ return reviewArt;
+ }
+
+ public void setReviewArt(IReviewArtifact reviewArt) {
+ this.reviewArt = reviewArt;
+ if (xViewer != null) loadTable();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IDamWidget#setArtifact(org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * java.lang.String)
+ */
+ public void setArtifact(Artifact artifact, String attrName) {
+ setReviewArt((IReviewArtifact) artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ // RoleViewer uses artifact as storage mechanism, nothing to save
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ // RoleViewer uses artifact as storage mechanism which already determines dirty
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ // Nothing to revert cause artifact will be reverted
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.getBranchId() != AtsPlugin.getAtsBranch().getBranchId()) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ if (xViewer == null || xViewer.getTree() == null || xViewer.getTree().isDisposed()) return;
+ if (transData.isRelAddedChangedDeleted(reviewArt.getArtifact())) {
+ loadTable();
+ } else
+ refresh();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getErrorMessageControl()
+ */
+ @Override
+ public Control getErrorMessageControl() {
+ return labelWidget;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerAtsAttributeColumn.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerAtsAttributeColumn.java
new file mode 100644
index 00000000000..e07e5c8db20
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerAtsAttributeColumn.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.ats.util.xviewer.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerAtsAttributeColumn extends XViewerColumn {
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn need to extend this constructor to copy extra stored fields
+ *
+ * @param col
+ */
+ @Override
+ public XViewerAtsAttributeColumn copy() {
+ return new XViewerAtsAttributeColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ public XViewerAtsAttributeColumn(String id, ATSAttributes atsAttribute, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable) {
+ this(id, atsAttribute, width, align, show, sortDataType, multiColumnEditable, atsAttribute.getDescription());
+ }
+
+ public XViewerAtsAttributeColumn(String id, ATSAttributes atsAttribute, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ this(id, atsAttribute.getDisplayName(), width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ public XViewerAtsAttributeColumn(ATSAttributes atsAttribute, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable) {
+ this(atsAttribute, width, align, show, sortDataType, multiColumnEditable, atsAttribute.getDescription());
+ }
+
+ public XViewerAtsAttributeColumn(ATSAttributes atsAttribute, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ this(
+ WorldXViewerFactory.COLUMN_NAMESPACE + "." + (atsAttribute.getDisplayName().replaceAll(" ", "").toLowerCase()),
+ atsAttribute.getDisplayName(), width, align, show, sortDataType, multiColumnEditable,
+ description == null || description.equals("") ? atsAttribute.getDescription() : description);
+ }
+
+ public XViewerAtsAttributeColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerReviewRoleColumn.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerReviewRoleColumn.java
new file mode 100644
index 00000000000..17503c5aa57
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerReviewRoleColumn.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.ats.util.xviewer.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.util.widgets.role.UserRole;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerReviewRoleColumn extends XViewerValueColumn {
+
+ private final User user;
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn need to extend this constructor to copy extra stored fields
+ *
+ * @param col
+ */
+ @Override
+ public XViewerReviewRoleColumn copy() {
+ return new XViewerReviewRoleColumn(getUser(), getId(), getName(), getWidth(), getAlign(), isShow(),
+ getSortDataType(), isMultiColumnEditable(), getDescription());
+ }
+
+ public XViewerReviewRoleColumn(User user) {
+ super("ats.column.role", "Role", 75, SWT.LEFT, true, SortDataType.String, false, null);
+ this.user = user;
+ }
+
+ public XViewerReviewRoleColumn(User user, String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ this.user = user;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ try {
+ if (element instanceof ReviewSMArtifact) {
+ return getRolesStr((ReviewSMArtifact) element, user);
+ }
+ return "";
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+
+ private static String getRolesStr(ReviewSMArtifact reviewArt, User user) throws OseeCoreException {
+ String str = "";
+ for (UserRole role : reviewArt.getUserRoleManager().getUserRoles()) {
+ if (role.getUser().equals(user)) str += role.getRole().name() + ", ";
+ }
+ return str.replaceFirst(", $", "");
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCompletedDateColumn.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCompletedDateColumn.java
new file mode 100644
index 00000000000..decb730c2b6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCompletedDateColumn.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.ats.util.xviewer.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerSmaCompletedDateColumn extends XViewerValueColumn {
+
+ public XViewerSmaCompletedDateColumn() {
+ this("Completed");
+ }
+
+ public XViewerSmaCompletedDateColumn(String name) {
+ super(WorldXViewerFactory.COLUMN_NAMESPACE + "completeDate", name, 80, SWT.LEFT, true, SortDataType.Date, false,
+ "Date this workflow transitioned to the Completed state.");
+ }
+
+ public XViewerSmaCompletedDateColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn need to extend this constructor to copy extra stored fields
+ *
+ * @param col
+ */
+ @Override
+ public XViewerSmaCompletedDateColumn copy() {
+ return new XViewerSmaCompletedDateColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ try {
+ if (element instanceof StateMachineArtifact) {
+ return ((StateMachineArtifact) element).getWorldViewCompletedDateStr();
+ }
+ return super.getColumnText(element, column, columnIndex);
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCreatedDateColumn.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCreatedDateColumn.java
new file mode 100644
index 00000000000..9712dcef71a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaCreatedDateColumn.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.ats.util.xviewer.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerSmaCreatedDateColumn extends XViewerValueColumn {
+
+ public XViewerSmaCreatedDateColumn() {
+ this("Created Date");
+ }
+
+ public XViewerSmaCreatedDateColumn(String name) {
+ super(WorldXViewerFactory.COLUMN_NAMESPACE + ".createdDate", name, 80, SWT.LEFT, true, SortDataType.Date, false,
+ "Date this workflow was created.");
+ }
+
+ public XViewerSmaCreatedDateColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn need to extend this constructor to copy extra stored fields
+ *
+ * @param col
+ */
+ @Override
+ public XViewerSmaCreatedDateColumn copy() {
+ return new XViewerSmaCreatedDateColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ try {
+ if (element instanceof IWorldViewArtifact) {
+ return ((IWorldViewArtifact) element).getWorldViewCreatedDateStr();
+ }
+ return super.getColumnText(element, column, columnIndex);
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaStateColumn.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaStateColumn.java
new file mode 100644
index 00000000000..244aa771ba2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/util/xviewer/column/XViewerSmaStateColumn.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.ats.util.xviewer.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.ats.world.IWorldViewArtifact;
+import org.eclipse.osee.ats.world.WorldXViewerFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerSmaStateColumn extends XViewerValueColumn {
+
+ public XViewerSmaStateColumn() {
+ super(WorldXViewerFactory.COLUMN_NAMESPACE + "smaState", "State", 75, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ }
+
+ public XViewerSmaStateColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn need to extend this constructor to copy extra stored fields
+ *
+ * @param col
+ */
+ @Override
+ public XViewerSmaStateColumn copy() {
+ return new XViewerSmaStateColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ try {
+ if (element instanceof IWorldViewArtifact) {
+ return ((IWorldViewArtifact) element).getWorldViewState();
+ }
+ return "";
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/ATSXWidgetOptionResolver.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/ATSXWidgetOptionResolver.java
new file mode 100644
index 00000000000..7e97d8535f7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/ATSXWidgetOptionResolver.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.ats.workflow;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DefaultXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ATSXWidgetOptionResolver extends DefaultXWidgetOptionResolver {
+
+ private static ATSXWidgetOptionResolver instance = new ATSXWidgetOptionResolver();
+ public static String OPTIONS_FROM_ATTRIBUTE_VALIDITY = "OPTIONS_FROM_ATTRIBUTE_VALIDITY";
+
+ /**
+ *
+ */
+ private ATSXWidgetOptionResolver() {
+ instance = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.DefaultXWidgetOptionResolver#getWidgetOptions(java.lang.String)
+ */
+ @Override
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData xWidgetData) {
+
+ if (xWidgetData.getXWidgetName().contains(OPTIONS_FROM_ATTRIBUTE_VALIDITY) || xWidgetData.getXWidgetName().contains(
+ "ACTIVE_USER_COMMUNITIES")) {
+ Set<String> options;
+ try {
+ options =
+ AttributeTypeManager.getEnumerationValues(xWidgetData.getStorageName());
+ } catch (OseeCoreException ex) {
+ options = new HashSet<String>();
+ options.add(ex.getLocalizedMessage());
+ }
+ String optStrs[] = options.toArray(new String[options.size()]);
+ Arrays.sort(optStrs);
+ return optStrs;
+ }
+ return super.getWidgetOptions(xWidgetData);
+ }
+
+ /**
+ * @return the instance
+ */
+ public static ATSXWidgetOptionResolver getInstance() {
+ return instance;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/AtsWorkPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/AtsWorkPage.java
new file mode 100644
index 00000000000..95fcb0f0f12
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/AtsWorkPage.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.workflow;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.editor.IAtsStateItem;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.service.WorkPageService;
+import org.eclipse.osee.ats.util.widgets.dialog.TaskResolutionOptionRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsWorkPage extends WorkPage {
+
+ protected TaskResolutionOptionRule taskResolutionOptions;
+ private SMAManager smaMgr;
+
+ public AtsWorkPage(WorkFlowDefinition workFlowDefinition, WorkPageDefinition workPageDefinition, String xWidgetsXml, IXWidgetOptionResolver optionResolver) {
+ super(workFlowDefinition, workPageDefinition, xWidgetsXml, optionResolver);
+ }
+
+ public AtsWorkPage(IXWidgetOptionResolver optionResolver) {
+ this(null, null, null, optionResolver);
+ }
+
+ public boolean isCurrentState(SMAManager smaMgr) throws OseeCoreException {
+ return smaMgr.isCurrentState(getName());
+ }
+
+ public boolean isCurrentNonCompleteCancelledState(SMAManager smaMgr) throws OseeCoreException {
+ return smaMgr.isCurrentState(getName()) && !isCompleteCancelledState();
+ }
+
+ public boolean isCompleteCancelledState() {
+ return isCancelledPage() || isCompletePage();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.workflow.WorkPage#widgetCreated(osee.skynet.gui.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit, osee.skynet.gui.widgets.workflow.WorkPage,
+ * osee.skynet.gui.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, WorkPage page, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreated(xWidget, toolkit, art, page, xModListener, isEditable);
+ // Check extenstion points for page creation
+ if (smaMgr != null) {
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(page.getId())) {
+ item.xWidgetCreated(xWidget, toolkit, (AtsWorkPage) page, art, xModListener, isEditable);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.workflow.WorkPage#workAttrCreated(osee.skynet.gui.widgets.workflow.WorkAttribute,
+ * osee.skynet.gui.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit,
+ * osee.skynet.artifact.Artifact, osee.skynet.gui.widgets.workflow.WorkPage,
+ * osee.skynet.gui.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData layoutData, XWidget xWidget, FormToolkit toolkit, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ super.createXWidgetLayoutData(layoutData, xWidget, toolkit, art, xModListener, isEditable);
+ // If no tooltip, add global tooltip
+ if ((xWidget.getToolTip() == null || xWidget.getToolTip().equals("")) && ATSAttributes.getAtsAttributeByStoreName(layoutData.getStorageName()) != null && ATSAttributes.getAtsAttributeByStoreName(
+ layoutData.getStorageName()).getDescription() != null && !ATSAttributes.getAtsAttributeByStoreName(
+ layoutData.getStorageName()).getDescription().equals("")) {
+ xWidget.setToolTip(ATSAttributes.getAtsAttributeByStoreName(layoutData.getStorageName()).getDescription());
+ layoutData.setToolTip(ATSAttributes.getAtsAttributeByStoreName(layoutData.getStorageName()).getDescription());
+ }
+ // Store workAttr in control for use by help
+ if (xWidget.getControl() != null) xWidget.getControl().setData(layoutData);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.workflow.WorkPage#widgetCreating(osee.skynet.gui.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit, osee.skynet.gui.widgets.workflow.WorkPage,
+ * osee.skynet.gui.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, WorkPage page, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreating(xWidget, toolkit, art, page, xModListener, isEditable);
+ // Check extenstion points for page creation
+ if (smaMgr != null) {
+ for (IAtsStateItem item : smaMgr.getStateItems().getStateItems(page.getId())) {
+ Result result = item.xWidgetCreating(xWidget, toolkit, (AtsWorkPage) page, art, xModListener, isEditable);
+ if (result.isFalse()) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error in page creation => " + result.getText());
+ }
+ }
+ }
+ }
+
+ public boolean isCompletePage() {
+ return getName().equals(DefaultTeamState.Completed.name());
+ }
+
+ public boolean isCancelledPage() {
+ return getName().equals(DefaultTeamState.Cancelled.name());
+ }
+
+ public boolean isDisplayService(WorkPageService service) {
+ return true;
+ }
+
+ public boolean isEndorsePage() {
+ return getName().equals(DefaultTeamState.Endorse.name());
+ }
+
+ /**
+ * @return Returns the taskResolutionOptions.
+ */
+ public TaskResolutionOptionRule getTaskResDef() {
+ return taskResolutionOptions;
+ }
+
+ /**
+ * @param taskResolutionOptions The taskResolutionOptions to set.
+ */
+ public void setTaskResDef(TaskResolutionOptionRule taskResolutionOptions) {
+ this.taskResolutionOptions = taskResolutionOptions;
+ }
+
+ public boolean isUsingTaskResolutionOptions() {
+ return this.taskResolutionOptions != null;
+ }
+
+ /**
+ * @return the startPage
+ */
+ public boolean isStartPage() throws OseeCoreException {
+ return workFlowDefinition.getStartPage().getId().equals(getId());
+ }
+
+ /**
+ * @return the smaMgr
+ */
+ public SMAManager getSmaMgr() {
+ return smaMgr;
+ }
+
+ /**
+ * @param smaMgr the smaMgr to set
+ */
+ public void setSmaMgr(SMAManager smaMgr) {
+ this.smaMgr = smaMgr;
+ }
+
+ /**
+ * @return the validatePage
+ */
+ public boolean isValidatePage() throws OseeCoreException {
+ return AtsWorkDefinitions.isValidatePage(workPageDefinition);
+ }
+
+ /**
+ * @return the validateReviewBlocking
+ */
+ public boolean isValidateReviewBlocking() throws OseeCoreException {
+ return AtsWorkDefinitions.isValidateReviewBlocking(workPageDefinition);
+ }
+
+ /**
+ * @return the forceAssigneesToTeamLeads
+ */
+ public boolean isForceAssigneesToTeamLeads() throws OseeCoreException {
+ return AtsWorkDefinitions.isForceAssigneesToTeamLeads(workPageDefinition);
+ }
+
+ /**
+ * @return the forceAssigneesToTeamLeads
+ */
+ public boolean isRequireStateHoursSpentPrompt() throws OseeCoreException {
+ return AtsWorkDefinitions.isRequireStateHoursSpentPrompt(workPageDefinition);
+ }
+
+ /**
+ * @return the allowCreateBranch
+ */
+ public boolean isAllowTransitionWithWorkingBranch() throws OseeCoreException {
+ return AtsWorkDefinitions.isAllowTransitionWithWorkingBranch(workPageDefinition);
+ }
+
+ /**
+ * @return the allowCreateBranch
+ */
+ public boolean isAllowCreateBranch() throws OseeCoreException {
+ return AtsWorkDefinitions.isAllowCreateBranch(workPageDefinition);
+ }
+
+ /**
+ * @return the allowCommitBranch
+ */
+ public boolean isAllowCommitBranch() throws OseeCoreException {
+ return AtsWorkDefinitions.isAllowCommitBranch(workPageDefinition);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditor.java
new file mode 100644
index 00000000000..d4c75904ea9
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditor.java
@@ -0,0 +1,457 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor;
+
+import java.util.EventObject;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.DefaultEditDomain;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
+import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
+import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.requests.CreationFactory;
+import org.eclipse.gef.requests.SimpleFactory;
+import org.eclipse.gef.ui.actions.ActionRegistry;
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.gef.ui.palette.PaletteViewerProvider;
+import org.eclipse.gef.ui.parts.ContentOutlinePage;
+import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
+import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
+import org.eclipse.gef.ui.parts.TreeViewer;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.ats.workflow.AtsWorkPage;
+import org.eclipse.osee.ats.workflow.editor.actions.EditAction;
+import org.eclipse.osee.ats.workflow.editor.model.CancelledWorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.CompletedWorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.DefaultTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.ReturnTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.TransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.WorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+import org.eclipse.osee.ats.workflow.editor.parts.ShapesEditPartFactory;
+import org.eclipse.osee.ats.workflow.editor.parts.ShapesTreeEditPartFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * A graphical editor for the configuration of ATS workflows
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsWorkflowConfigEditor extends GraphicalEditorWithFlyoutPalette implements IFrameworkTransactionEventListener {
+
+ /** This is the root of the editor's model. */
+ private WorkflowDiagram diagram;
+ /** Palette component, holding the tools and shapes. */
+ private static PaletteRoot PALETTE_MODEL;
+ public static String EDITOR_ID = "org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigEditor";
+
+ /** Create a new ShapesEditor instance. This is called by the Workspace. */
+ public AtsWorkflowConfigEditor() {
+ setEditDomain(new DefaultEditDomain(this));
+ OseeEventManager.addListener(this);
+ }
+
+ public static void editWorkflow(final WorkFlowDefinition workflow) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ AWorkbench.getActivePage().openEditor(new AtsWorkflowConfigEditorInput(workflow),
+ AtsWorkflowConfigEditor.EDITOR_ID);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ /**
+ * Configure the graphical viewer before it receives contents.
+ * <p>
+ * This is the place to choose an appropriate RootEditPart and EditPartFactory for your editor. The RootEditPart
+ * determines the behavior of the editor's "work-area". For example, GEF includes zoomable and scrollable root edit
+ * parts. The EditPartFactory maps model elements to edit parts (controllers).
+ * </p>
+ *
+ * @see org.eclipse.gef.ui.parts.GraphicalEditor#configureGraphicalViewer()
+ */
+ @Override
+ protected void configureGraphicalViewer() {
+ super.configureGraphicalViewer();
+
+ GraphicalViewer viewer = getGraphicalViewer();
+ viewer.setEditPartFactory(new ShapesEditPartFactory());
+ viewer.setRootEditPart(new ScalableFreeformRootEditPart());
+ viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer));
+
+ // configure the context menu provider
+ ContextMenuProvider cmProvider = new AtsWorkflowConfigEditorContextMenuProvider(viewer, getActionRegistry());
+ viewer.setContextMenu(cmProvider);
+ getSite().registerContextMenu(cmProvider, viewer);
+ AtsPlugin.getInstance().setHelp(viewer.getControl(), "atsConfigureWorkflow");
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditor#commandStackChanged(java.util.EventObject)
+ */
+ @Override
+ public void commandStackChanged(EventObject event) {
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+ super.commandStackChanged(event);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
+ */
+ @Override
+ protected PaletteViewerProvider createPaletteViewerProvider() {
+ return new PaletteViewerProvider(getEditDomain()) {
+ @Override
+ protected void configurePaletteViewer(PaletteViewer viewer) {
+ super.configurePaletteViewer(viewer);
+ // create a drag source listener for this palette viewer
+ // together with an appropriate transfer drop target listener, this will enable
+ // model element creation by dragging a CombinatedTemplateCreationEntries
+ // from the palette into the editor
+ // @see ShapesEditor#createTransferDropTargetListener()
+ viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
+ }
+ };
+ }
+
+ /**
+ * Create a transfer drop target listener. When using a CombinedTemplateCreationEntry tool in the palette, this will
+ * enable model element creation by dragging from the palette.
+ *
+ * @see #createPaletteViewerProvider()
+ */
+ private TransferDropTargetListener createTransferDropTargetListener() {
+ return new TemplateTransferDropTargetListener(getGraphicalViewer()) {
+ @Override
+ protected CreationFactory getFactory(Object template) {
+ return new SimpleFactory((Class<?>) template);
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ Result result = diagram.doSave(transaction);
+ if (result.isFalse()) {
+ AWorkbench.popup("Save Error", result.getText());
+ return;
+ }
+ transaction.execute();
+ diagram.getWorkFlowDefinition().loadPageData(true);
+ getCommandStack().markSaveLocation();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablePart#doSaveAs()
+ */
+ @Override
+ public void doSaveAs() {
+ AWorkbench.popup("ERROR", "Not implemented yet");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class type) {
+ if (type == IContentOutlinePage.class) return new ShapesOutlinePage(new TreeViewer());
+ return super.getAdapter(type);
+ }
+
+ WorkflowDiagram getModel() {
+ return diagram;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
+ */
+ @Override
+ protected PaletteRoot getPaletteRoot() {
+ if (PALETTE_MODEL == null) PALETTE_MODEL = AtsWorkflowConfigEditorPaletteFactory.createPalette(this);
+ return PALETTE_MODEL;
+ }
+
+ /**
+ * Set up the editor's inital content (after creation).
+ *
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#initializeGraphicalViewer()
+ */
+ @Override
+ protected void initializeGraphicalViewer() {
+ super.initializeGraphicalViewer();
+ GraphicalViewer viewer = getGraphicalViewer();
+ viewer.setContents(getModel()); // set the contents of this editor
+
+ // listen for dropped parts
+ viewer.addDropTargetListener(createTransferDropTargetListener());
+ createActions();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void createActions() {
+ super.createActions();
+ ActionRegistry registry = getActionRegistry();
+ IAction action;
+
+ action = new EditAction();
+ registry.registerAction(action);
+ getStackActions().add(action.getId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
+ */
+ @Override
+ public boolean isSaveAsAllowed() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
+ */
+ @Override
+ protected void setInput(IEditorInput input) {
+ super.setInput(input);
+ if (input instanceof AtsWorkflowConfigEditorInput) {
+ AtsWorkflowConfigEditorInput editorInput = (AtsWorkflowConfigEditorInput) input;
+ WorkFlowDefinition workflowDef = editorInput.workflow;
+ try {
+ setPartName(workflowDef.getName());
+ diagram = new WorkflowDiagram(workflowDef);
+ int yLoc = 0;
+ WorkPageDefinition startPage = workflowDef.getStartPage();
+ if (startPage == null || startPage.equals("")) {
+ throw new OseeArgumentException("StartPage null for workflow " + workflowDef);
+ }
+ // Create states
+ List<WorkPageDefinition> pages = workflowDef.getPagesOrdered();
+ for (WorkPageDefinition page : workflowDef.getPages()) {
+ if (!pages.contains(page)) {
+ pages.add(page);
+ }
+ }
+ for (WorkPageDefinition pageDef : pages) {
+ WorkPageShape pageShape = null;
+ if (pageDef.isCancelledPage()) {
+ pageShape = new CancelledWorkPageShape(pageDef);
+ pageShape.setLocation(new Point(250, 300));
+ } else if (pageDef.isCompletePage()) {
+ pageShape = new CompletedWorkPageShape(pageDef);
+ pageShape.setLocation(new Point(50, yLoc += 90));
+ } else {
+ pageShape = new WorkPageShape(pageDef);
+ pageShape.setLocation(new Point(50, yLoc += 90));
+ }
+ pageShape.setStartPage(startPage.getId().equals(pageShape.getId()) || pageShape.getId().endsWith(
+ startPage.getId()));
+ diagram.addChild(pageShape);
+ }
+
+ // Create transitions
+ for (WorkPageDefinition workPageDefinition : workflowDef.getPagesOrdered()) {
+ WorkPageShape pageShape = getWorkPageShape(workPageDefinition);
+ AtsWorkPage atsWorkPage =
+ new AtsWorkPage(workflowDef, workPageDefinition, null, ATSXWidgetOptionResolver.getInstance());
+ // Handle to pages
+ Set<WorkPageDefinition> toPages = new HashSet<WorkPageDefinition>();
+ toPages.addAll(atsWorkPage.getToPages());
+ List<WorkPageDefinition> returnPages = atsWorkPage.getReturnPages();
+ for (WorkPageDefinition toPageDef : toPages) {
+ // Don't want to show return pages twice
+ if (returnPages.contains(toPageDef)) {
+ continue;
+ }
+ WorkPageShape toPageShape = getWorkPageShape(toPageDef);
+ if (toPageDef.equals(atsWorkPage.getDefaultToPage())) {
+ new DefaultTransitionConnection(pageShape, toPageShape);
+ // System.out.println("Default: " + atsWorkPage.getName() + " -> " + toPageShape.getName());
+ } else {
+ new TransitionConnection(pageShape, toPageShape);
+ // System.out.println("To: " + atsWorkPage.getName() + " -> " + toPageShape.getName());
+ }
+ }
+ // Handle return pages
+ for (WorkPageDefinition toPageDef : returnPages) {
+ WorkPageShape toPageShape = getWorkPageShape(toPageDef);
+ new ReturnTransitionConnection(pageShape, toPageShape);
+ // System.out.println("Return: " + atsWorkPage.getName() + " -> " + toPageShape.getName());
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ } else {
+ throw new IllegalStateException("Invalid editor input");
+ }
+
+ }
+
+ private WorkPageShape getWorkPageShape(WorkPageDefinition page) {
+ for (Object object : getModel().getChildren()) {
+ if (object instanceof WorkPageShape) {
+ if (((WorkPageShape) object).getId().equals(page.getId()) || (page.getParentId() != null && ((WorkPageShape) object).getId().equals(
+ page.getParentId()))) {
+ return (WorkPageShape) object;
+ }
+ }
+ }
+ return null;
+ }
+ /**
+ * Creates an outline pagebook for this editor.
+ */
+ public class ShapesOutlinePage extends ContentOutlinePage {
+ /**
+ * Create a new outline page for the shapes editor.
+ *
+ * @param viewer a viewer (TreeViewer instance) used for this outline page
+ * @throws IllegalArgumentException if editor is null
+ */
+ public ShapesOutlinePage(EditPartViewer viewer) {
+ super(viewer);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ // create outline viewer page
+ getViewer().createControl(parent);
+ // configure outline viewer
+ getViewer().setEditDomain(getEditDomain());
+ getViewer().setEditPartFactory(new ShapesTreeEditPartFactory());
+ // configure & add context menu to viewer
+ ContextMenuProvider cmProvider =
+ new AtsWorkflowConfigEditorContextMenuProvider(getViewer(), getActionRegistry());
+ getViewer().setContextMenu(cmProvider);
+ getSite().registerContextMenu("org.eclipse.osee.ats.config.editor.contextmenu", cmProvider,
+ getSite().getSelectionProvider());
+ // hook outline viewer
+ getSelectionSynchronizer().addViewer(getViewer());
+ // initialize outline viewer with model
+ getViewer().setContents(getModel());
+ // show outline viewer
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.IPage#dispose()
+ */
+ @Override
+ public void dispose() {
+ // unhook outline viewer
+ getSelectionSynchronizer().removeViewer(getViewer());
+ // dispose
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.IPage#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return getViewer().getControl();
+ }
+
+ /**
+ * @see org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite)
+ */
+ @Override
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ ActionRegistry registry = getActionRegistry();
+ IActionBars bars = pageSite.getActionBars();
+ String id = ActionFactory.UNDO.getId();
+ bars.setGlobalActionHandler(id, registry.getAction(id));
+ id = ActionFactory.REDO.getId();
+ bars.setGlobalActionHandler(id, registry.getAction(id));
+ id = ActionFactory.DELETE.getId();
+ bars.setGlobalActionHandler(id, registry.getAction(id));
+ }
+ }
+
+ public void closeEditor() {
+ final IEditorPart editor = this;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ AWorkbench.getActivePage().closeEditor(editor, false);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ for (Artifact delArt : transData.cacheDeletedArtifacts) {
+ if (delArt.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ if (delArt.getInternalAttributeValue("Name").equals(getPartName())) {
+ closeEditor();
+ }
+ }
+ }
+ System.out.println("Add refresh of editor if workflow mod");
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorActionBarContributor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorActionBarContributor.java
new file mode 100644
index 00000000000..86e7210323e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorActionBarContributor.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor;
+
+import org.eclipse.gef.ui.actions.ActionBarContributor;
+import org.eclipse.gef.ui.actions.DeleteRetargetAction;
+import org.eclipse.gef.ui.actions.RedoRetargetAction;
+import org.eclipse.gef.ui.actions.UndoRetargetAction;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.ui.actions.ActionFactory;
+
+/**
+ * Contributes actions to a toolbar. This class is tied to the editor in the definition of editor-extension (see
+ * plugin.xml).
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsWorkflowConfigEditorActionBarContributor extends ActionBarContributor {
+
+ /**
+ * Create actions managed by this contributor.
+ *
+ * @see org.eclipse.gef.ui.actions.ActionBarContributor#buildActions()
+ */
+ protected void buildActions() {
+ addRetargetAction(new DeleteRetargetAction());
+ addRetargetAction(new UndoRetargetAction());
+ addRetargetAction(new RedoRetargetAction());
+ }
+
+ /**
+ * Add actions to the given toolbar.
+ *
+ * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
+ */
+ public void contributeToToolBar(IToolBarManager toolBarManager) {
+ toolBarManager.add(getAction(ActionFactory.UNDO.getId()));
+ toolBarManager.add(getAction(ActionFactory.REDO.getId()));
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.ui.actions.ActionBarContributor#declareGlobalActionKeys()
+ */
+ protected void declareGlobalActionKeys() {
+ // currently none
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorContextMenuProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorContextMenuProvider.java
new file mode 100644
index 00000000000..76cd76ab452
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorContextMenuProvider.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor;
+
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.ui.actions.ActionRegistry;
+import org.eclipse.gef.ui.actions.GEFActionConstants;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.osee.ats.workflow.editor.actions.EditAction;
+import org.eclipse.ui.actions.ActionFactory;
+
+/**
+ * Provides context menu actions for the ShapesEditor.
+ *
+ * @author Donald G. Dunne
+ */
+class AtsWorkflowConfigEditorContextMenuProvider extends ContextMenuProvider {
+
+ /** The editor's action registry. */
+ private final ActionRegistry actionRegistry;
+
+ /**
+ * Instantiate a new menu context provider for the specified EditPartViewer and ActionRegistry.
+ *
+ * @param viewer the editor's graphical viewer
+ * @param registry the editor's action registry
+ * @throws IllegalArgumentException if registry is <tt>null</tt>.
+ */
+ public AtsWorkflowConfigEditorContextMenuProvider(EditPartViewer viewer, ActionRegistry registry) {
+ super(viewer);
+ if (registry == null) {
+ throw new IllegalArgumentException();
+ }
+ actionRegistry = registry;
+ }
+
+ /**
+ * Called when the context menu is about to show. Actions, whose state is enabled, will appear in the context menu.
+ *
+ * @see org.eclipse.gef.ContextMenuProvider#buildContextMenu(org.eclipse.jface.action.IMenuManager)
+ */
+ @Override
+ public void buildContextMenu(IMenuManager menu) {
+ // Add standard action groups to the menu
+ GEFActionConstants.addStandardActionGroups(menu);
+
+ // Add actions to the menu
+ menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction(EditAction.ID));
+ menu.appendToGroup(GEFActionConstants.GROUP_UNDO, // target group id
+ getAction(ActionFactory.UNDO.getId())); // action to add
+ menu.appendToGroup(GEFActionConstants.GROUP_UNDO, getAction(ActionFactory.REDO.getId()));
+ menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction(ActionFactory.DELETE.getId()));
+ }
+
+ private IAction getAction(String actionId) {
+ return actionRegistry.getAction(actionId);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorInput.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorInput.java
new file mode 100644
index 00000000000..220c9ba3c11
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorInput.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.ats.workflow.editor;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsWorkflowConfigEditorInput implements IEditorInput {
+ protected WorkFlowDefinition workflow;
+
+ public AtsWorkflowConfigEditorInput(WorkFlowDefinition workflow) {
+ this.workflow = workflow;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof AtsWorkflowConfigEditorInput) {
+ AtsWorkflowConfigEditorInput otherEdInput = (AtsWorkflowConfigEditorInput) obj;
+ return workflow.getId().equals(otherEdInput.workflow.getId());
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ public String getName() {
+ if (workflow == null) {
+ return "No Artifact Input Provided";
+ }
+ return workflow.getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorPaletteFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorPaletteFactory.java
new file mode 100644
index 00000000000..9cde0bb25e6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigEditorPaletteFactory.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor;
+
+import org.eclipse.gef.Tool;
+import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
+import org.eclipse.gef.palette.ConnectionCreationToolEntry;
+import org.eclipse.gef.palette.MarqueeToolEntry;
+import org.eclipse.gef.palette.PaletteContainer;
+import org.eclipse.gef.palette.PaletteDrawer;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.palette.PaletteToolbar;
+import org.eclipse.gef.palette.PanningSelectionToolEntry;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.gef.requests.CreationFactory;
+import org.eclipse.gef.requests.SimpleFactory;
+import org.eclipse.gef.tools.AbstractTool;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.editor.actions.ValidateDiagramToolEntry;
+import org.eclipse.osee.ats.workflow.editor.model.CancelledWorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.CompletedWorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.DefaultTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.ReturnTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.TransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.WorkPageShape;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Utility class that can create a GEF Palette.
+ *
+ * @see #createPalette()
+ * @author Donald G. Dunne
+ */
+final class AtsWorkflowConfigEditorPaletteFactory {
+
+ /** Preference ID used to persist the palette location. */
+ private static final String PALETTE_DOCK_LOCATION = "ShapesEditorPaletteFactory.Location";
+ /** Preference ID used to persist the palette size. */
+ private static final String PALETTE_SIZE = "ShapesEditorPaletteFactory.Size";
+ /** Preference ID used to persist the flyout palette's state. */
+ private static final String PALETTE_STATE = "ShapesEditorPaletteFactory.State";
+ private static AtsWorkflowConfigEditor editor;
+
+ /** Create the "States" drawer. */
+ private static PaletteContainer createStatesDrawer() {
+ PaletteDrawer componentsDrawer = new PaletteDrawer("States");
+
+ CombinedTemplateCreationEntry component =
+ new CombinedTemplateCreationEntry("State", "Create a new Workflow State", WorkPageShape.class,
+ new SimpleFactory(WorkPageShape.class), ImageManager.getImageDescriptor(FrameworkImage.RECTANGLE_16),
+ ImageManager.getImageDescriptor(FrameworkImage.RECTANGLE_24));
+ componentsDrawer.add(component);
+
+ component =
+ new CombinedTemplateCreationEntry("Completed State", "Create a Completed State",
+ CompletedWorkPageShape.class, new SimpleFactory(CompletedWorkPageShape.class),
+ ImageManager.getImageDescriptor(FrameworkImage.RECTANGLE_16),
+ ImageManager.getImageDescriptor(FrameworkImage.RECTANGLE_24));
+ componentsDrawer.add(component);
+
+ component =
+ new CombinedTemplateCreationEntry("Cancelled State", "Create a Cancelled State",
+ CancelledWorkPageShape.class, new SimpleFactory(CancelledWorkPageShape.class),
+ ImageManager.getImageDescriptor(FrameworkImage.RECTANGLE_16),
+ ImageManager.getImageDescriptor(FrameworkImage.RECTANGLE_24));
+ componentsDrawer.add(component);
+
+ return componentsDrawer;
+ }
+
+ /** Create the "Transitions" drawer. */
+ private static PaletteContainer createTransitionsDrawer() {
+ PaletteDrawer componentsDrawer = new PaletteDrawer("Transitions");
+
+ ToolEntry tool =
+ new ConnectionCreationToolEntry("Default Transition", "Create a Default Transition", new CreationFactory() {
+ public Object getNewObject() {
+ return null;
+ }
+
+ public Object getObjectType() {
+ return DefaultTransitionConnection.class;
+ }
+ }, ImageManager.getImageDescriptor(AtsImage.CONECTION_16),
+ ImageManager.getImageDescriptor(AtsImage.CONECTION_24));
+ componentsDrawer.add(tool);
+
+ tool =
+ new ConnectionCreationToolEntry("Transition", "Create a Transition", new CreationFactory() {
+ public Object getNewObject() {
+ return null;
+ }
+
+ public Object getObjectType() {
+ return TransitionConnection.class;
+ }
+ }, ImageManager.getImageDescriptor(AtsImage.CONECTION_16),
+ ImageManager.getImageDescriptor(AtsImage.CONECTION_24));
+ componentsDrawer.add(tool);
+
+ tool =
+ new ConnectionCreationToolEntry("Return Transition", "Create a Return Transition", new CreationFactory() {
+ public Object getNewObject() {
+ return null;
+ }
+
+ public Object getObjectType() {
+ return ReturnTransitionConnection.class;
+ }
+ }, ImageManager.getImageDescriptor(AtsImage.CONECTION_16),
+ ImageManager.getImageDescriptor(AtsImage.CONECTION_24));
+ componentsDrawer.add(tool);
+
+ return componentsDrawer;
+ }
+
+ /**
+ * Creates the PaletteRoot and adds all palette elements. Use this factory method to create a new palette for your
+ * graphical editor.
+ *
+ * @return a new PaletteRoot
+ */
+ static PaletteRoot createPalette(AtsWorkflowConfigEditor editor) {
+ PaletteRoot palette = new PaletteRoot();
+ palette.add(createToolsGroup(palette, editor));
+ palette.add(createStatesDrawer());
+ palette.add(createTransitionsDrawer());
+ return palette;
+ }
+
+ /** Create the "Tools" group. */
+ private static PaletteContainer createToolsGroup(PaletteRoot palette, AtsWorkflowConfigEditor editor) {
+ PaletteToolbar toolbar = new PaletteToolbar("Tools");
+
+ // Add a selection tool to the group
+ ToolEntry tool = new PanningSelectionToolEntry();
+ toolbar.add(tool);
+ palette.setDefaultEntry(tool);
+
+ // Add a marquee tool to the group
+ toolbar.add(new MarqueeToolEntry());
+
+ toolbar.add(new ValidateDiagramToolEntry());
+
+ final Action action =
+ OseeAts.createBugAction(AtsPlugin.getInstance(), editor, AtsWorkflowConfigEditor.EDITOR_ID,
+ "ATS Workflow Config Editor");
+ final ImageDescriptor img = action.getImageDescriptor();
+
+ toolbar.add(new ToolEntry("", action.getText(), img, img, null) {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.palette.ToolEntry#createTool()
+ */
+ @Override
+ public Tool createTool() {
+ return new AbstractTool() {
+
+ @Override
+ protected String getCommandName() {
+ return action.getText();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.tools.AbstractTool#activate()
+ */
+ @Override
+ public void activate() {
+ super.activate();
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ deactivate();
+ action.run();
+ }
+ });
+
+ }
+ };
+ }
+
+ });
+
+ return toolbar;
+ }
+
+ /** Utility class. */
+ private AtsWorkflowConfigEditorPaletteFactory() {
+ // Utility class
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigRenderer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigRenderer.java
new file mode 100644
index 00000000000..47e9d7de2a4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/AtsWorkflowConfigRenderer.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.ats.workflow.editor;
+
+import java.util.List;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsWorkflowConfigRenderer extends DefaultArtifactRenderer {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getImage()
+ */
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getImage(AtsImage.WORKFLOW_CONFIG);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "ATS Workflow Config Editor";
+ }
+
+ /**
+ * @param rendererId
+ */
+ public AtsWorkflowConfigRenderer() {
+ super();
+ }
+
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ try {
+ for (Artifact artifact : artifacts) {
+ if (artifact.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ AtsWorkflowConfigEditor.editWorkflow(new WorkFlowDefinition(artifact));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public AtsWorkflowConfigRenderer newInstance() throws OseeCoreException {
+ return new AtsWorkflowConfigRenderer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#isValidFor(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if (artifact.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#preview(java.util.List)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ open(artifacts);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ return NO_MATCH;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/EditAction.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/EditAction.java
new file mode 100644
index 00000000000..e7941ed6725
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/EditAction.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.actions;
+
+import java.util.Iterator;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.editor.model.WorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+import org.eclipse.osee.ats.workflow.editor.parts.DiagramEditPart;
+import org.eclipse.osee.ats.workflow.editor.parts.WorkPageEditPart;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EditAction extends Action {
+
+ public static String ID = "osee.ats.workflowConfigEdit.edit";
+
+ public EditAction() {
+ super("Edit");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.Action#getId()
+ */
+ @Override
+ public String getId() {
+ return ID;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+
+ try {
+ Iterator<?> i = structuredSelection.iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof DiagramEditPart) {
+ if (((DiagramEditPart) obj).getModel() instanceof WorkflowDiagram) {
+ WorkflowDiagram diagram = (WorkflowDiagram) ((DiagramEditPart) obj).getModel();
+ Artifact artifact = null;
+ if (diagram.getWorkFlowDefinition() != null) {
+ WorkFlowDefinition def = diagram.getWorkFlowDefinition();
+ artifact = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(def.getId());
+ }
+ if (artifact != null) {
+ ArtifactEditor.editArtifact(artifact);
+ return;
+ }
+ }
+ }
+ if (obj instanceof WorkPageEditPart) {
+ if (((WorkPageEditPart) obj).getModel() instanceof WorkPageShape) {
+ WorkPageShape shape = (WorkPageShape) ((WorkPageEditPart) obj).getModel();
+ Artifact artifact = null;
+ if (shape.getWorkPageDefinition() != null) {
+ WorkPageDefinition def = shape.getWorkPageDefinition();
+ artifact = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(def.getId());
+ } else {
+ String id = shape.getId();
+ artifact = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(id);
+ ArtifactEditor.editArtifact(artifact);
+ return;
+ }
+ if (artifact != null) {
+ ArtifactEditor.editArtifact(artifact);
+ return;
+ }
+ }
+ }
+ }
+ AWorkbench.popup("ERROR", "Can't locate corresponding artifact");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramTool.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramTool.java
new file mode 100644
index 00000000000..e2dc4f640b2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramTool.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.ats.workflow.editor.actions;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.SharedCursors;
+import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
+import org.eclipse.gef.tools.SelectionTool;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.editor.model.ModelElement;
+import org.eclipse.osee.ats.workflow.editor.parts.DiagramEditPart;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.swt.events.MouseEvent;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ValidateDiagramTool extends SelectionTool {
+
+ public ValidateDiagramTool() {
+ setDefaultCursor(SharedCursors.ARROW);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.tools.SelectionTool#mouseDown(org.eclipse.swt.events.MouseEvent, org.eclipse.gef.EditPartViewer)
+ */
+ @Override
+ public void mouseDown(MouseEvent e, EditPartViewer viewer) {
+ super.mouseDown(e, viewer);
+ try {
+ EditPart editPart = getTargetEditPart();
+ Object model = editPart.getModel();
+ if (editPart instanceof ScalableFreeformRootEditPart) {
+ EditPart ePart = ((ScalableFreeformRootEditPart) editPart).getContents();
+ if (ePart instanceof DiagramEditPart) {
+ model = ((DiagramEditPart) ePart).getModel();
+ }
+ }
+ if (model instanceof ModelElement) {
+ Result result = ((ModelElement) model).validForSave();
+ if (result.isFalse()) {
+ AWorkbench.popup("Validate Error", model + "\n\n" + "Error: " + result.getText());
+ } else {
+ AWorkbench.popup("Validate Success", model + "\n\n" + "Valid");
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramToolEntry.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramToolEntry.java
new file mode 100644
index 00000000000..fe8c062f3d8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/actions/ValidateDiagramToolEntry.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.ats.workflow.editor.actions;
+
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ValidateDiagramToolEntry extends ToolEntry {
+
+ /**
+ * @param label
+ * @param shortDesc
+ * @param iconSmall
+ * @param iconLarge
+ */
+ public ValidateDiagramToolEntry() {
+ super("Validate Diagram", "Validate", ImageManager.getImageDescriptor(AtsImage.CHECK_BLUE),
+ ImageManager.getImageDescriptor(AtsImage.CHECK_BLUE), ValidateDiagramTool.class);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CancelledWorkPageShape.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CancelledWorkPageShape.java
new file mode 100644
index 00000000000..663d8933958
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CancelledWorkPageShape.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.ats.workflow.editor.model;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CancelledWorkPageShape extends WorkPageShape {
+
+ /**
+ * @param workPageDefinition
+ */
+ public CancelledWorkPageShape(WorkPageDefinition workPageDefinition) {
+ super(workPageDefinition);
+ }
+
+ public CancelledWorkPageShape() {
+ super(new WorkPageDefinition("Cancelled", "NEW", AtsCancelledWorkPageDefinition.ID));
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof WorkPageShape) {
+ try {
+ return ((WorkPageShape) obj).isCancelledState();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return super.equals(obj);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CompletedWorkPageShape.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CompletedWorkPageShape.java
new file mode 100644
index 00000000000..20a56275f56
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/CompletedWorkPageShape.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.ats.workflow.editor.model;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CompletedWorkPageShape extends WorkPageShape {
+
+ public CompletedWorkPageShape() {
+ super(new WorkPageDefinition("Completed", "NEW", AtsCompletedWorkPageDefinition.ID));
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof WorkPageShape) {
+ try {
+ return ((WorkPageShape) obj).isCompletedState();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return super.equals(obj);
+ }
+
+ /**
+ * @param workPageDefinition
+ */
+ public CompletedWorkPageShape(WorkPageDefinition workPageDefinition) {
+ super(workPageDefinition);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Connection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Connection.java
new file mode 100644
index 00000000000..f5716b35f47
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Connection.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A connection between two distinct shapes.
+ *
+ * @author Donald G. Dunne
+ */
+public class Connection extends ModelElement {
+
+ /** True, if the connection is attached to its endpoints. */
+ private boolean isConnected;
+ private int lineStyle = Graphics.LINE_SOLID;
+ /** Connection's source endpoint. */
+ private Shape source;
+ /** Connection's target endpoint. */
+ private Shape target;
+
+ /**
+ * Create a (solid) connection between two distinct shapes.
+ *
+ * @param source a source endpoint for this connection (non null)
+ * @param target a target endpoint for this connection (non null)
+ * @throws IllegalArgumentException if any of the parameters are null or source == target
+ * @see #setLineStyle(int)
+ */
+ public Connection(Shape source, Shape target) {
+ reconnect(source, target);
+ }
+
+ public Color getForegroundColor() {
+ return Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
+ }
+
+ @Override
+ public String toString() {
+ return "Connection";
+ }
+
+ /**
+ * Disconnect this connection from the shapes it is attached to.
+ */
+ public void disconnect() {
+ if (isConnected) {
+ source.removeConnection(this);
+ target.removeConnection(this);
+ isConnected = false;
+ }
+ }
+
+ /**
+ * Returns the line drawing style of this connection.
+ *
+ * @return an int value (Graphics.LINE_DASH or Graphics.LINE_SOLID)
+ */
+ public int getLineStyle() {
+ return lineStyle;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#validForSave()
+ */
+ @Override
+ public Result validForSave() throws OseeCoreException {
+ System.err.println("Add Connection validations.");
+ return Result.TrueResult;
+ }
+
+ /**
+ * Returns the source endpoint of this connection.
+ *
+ * @return a non-null Shape instance
+ */
+ public Shape getSource() {
+ return source;
+ }
+
+ /**
+ * Returns the target endpoint of this connection.
+ *
+ * @return a non-null Shape instance
+ */
+ public Shape getTarget() {
+ return target;
+ }
+
+ /**
+ * Reconnect this connection. The connection will reconnect with the shapes it was previously attached to.
+ */
+ public void reconnect() {
+ if (!isConnected) {
+ source.addConnection(this);
+ target.addConnection(this);
+ isConnected = true;
+ }
+ }
+
+ /**
+ * Reconnect to a different source and/or target shape. The connection will disconnect from its current attachments
+ * and reconnect to the new source and target.
+ *
+ * @param newSource a new source endpoint for this connection (non null)
+ * @param newTarget a new target endpoint for this connection (non null)
+ * @throws IllegalArgumentException if any of the paramers are null or newSource == newTarget
+ */
+ public void reconnect(Shape newSource, Shape newTarget) {
+ if (newSource == null || newTarget == null || newSource == newTarget) {
+ throw new IllegalArgumentException();
+ }
+ disconnect();
+ this.source = newSource;
+ this.target = newTarget;
+ reconnect();
+ }
+
+ /**
+ * Set the line drawing style of this connection.
+ *
+ * @param lineStyle one of following values: Graphics.LINE_DASH or Graphics.LINE_SOLID
+ * @see Graphics#LINE_DASH
+ * @see Graphics#LINE_SOLID
+ * @throws IllegalArgumentException if lineStyle does not have one of the above values
+ */
+ public void setLineStyle(int lineStyle) {
+ if (lineStyle != Graphics.LINE_DASH && lineStyle != Graphics.LINE_SOLID) {
+ throw new IllegalArgumentException();
+ }
+ this.lineStyle = lineStyle;
+ }
+
+ /**
+ * @return the label
+ */
+ public String getLabel() {
+ return "Connection";
+ }
+
+ /**
+ * @return the lineWidth
+ */
+ public int getLineWidth() {
+ return 2;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#doSave(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ public Result doSave(SkynetTransaction transaction) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/DefaultTransitionConnection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/DefaultTransitionConnection.java
new file mode 100644
index 00000000000..aee9a21bf97
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/DefaultTransitionConnection.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.ats.workflow.editor.model;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefaultTransitionConnection extends TransitionConnection {
+
+ /**
+ * @param source
+ * @param target
+ */
+ public DefaultTransitionConnection(Shape source, Shape target) {
+ super(source, target);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Connection#getForegroundColor()
+ */
+ @Override
+ public Color getForegroundColor() {
+ return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Connection#getLineWidth()
+ */
+ @Override
+ public int getLineWidth() {
+ return 3;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Connection#getLabel()
+ */
+ @Override
+ public String getLabel() {
+ return "Default Transition";
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/EllipticalShape.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/EllipticalShape.java
new file mode 100644
index 00000000000..fbf860a97f2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/EllipticalShape.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * An elliptical shape.
+ *
+ * @author Donald G. Dunne
+ */
+public class EllipticalShape extends Shape {
+
+ /** A 16x16 pictogram of an elliptical shape. */
+
+ @Override
+ public Image getIcon() {
+ return ImageManager.getImage(AtsImage.ELLIPSE_ICON);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#validForSave()
+ */
+ @Override
+ public Result validForSave() throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ @Override
+ public String toString() {
+ return "Ellipse " + hashCode();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Shape#getName()
+ */
+ @Override
+ protected String getName() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Shape#getToolTip()
+ */
+ @Override
+ protected String getToolTip() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#doSave(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ public Result doSave(SkynetTransaction transaction) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ModelElement.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ModelElement.java
new file mode 100644
index 00000000000..e0e11d4c70c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ModelElement.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+/**
+ * Abstract prototype of a model element.
+ * <p>
+ * This class provides features necessary for all model elements, like:
+ * </p>
+ * <ul>
+ * <li>property-change support (used to notify edit parts of model changes),</li>
+ * <li>property-source support (used to display property values in the Property View) and</li>
+ * <li>serialization support (the model hierarchy must be serializable, so that the editor can save and restore a binary
+ * representation. You might not need this, if you store the model a non-binary form like XML).</li>
+ * </ul>
+ *
+ * @author Donald G. Dunne
+ */
+public abstract class ModelElement implements IPropertySource {
+ /** An empty property descriptor. */
+ private static final IPropertyDescriptor[] EMPTY_ARRAY = new IPropertyDescriptor[0];
+
+ /** Delegate used to implemenent property-change-support. */
+ private transient PropertyChangeSupport pcsDelegate = new PropertyChangeSupport(this);
+ protected Map<Object, Object> propertyValues;
+
+ protected void initializePropertyValues() throws OseeCoreException {
+ if (propertyValues == null) {
+ propertyValues = new HashMap<Object, Object>();
+ }
+ }
+
+ public abstract Result doSave(SkynetTransaction transaction) throws OseeCoreException;
+
+ public abstract Result validForSave() throws OseeCoreException;
+
+ /**
+ * Attach a non-null PropertyChangeListener to this object.
+ *
+ * @param l a non-null PropertyChangeListener instance
+ * @throws IllegalArgumentException if the parameter is null
+ */
+ public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
+ if (l == null) {
+ throw new IllegalArgumentException();
+ }
+ pcsDelegate.addPropertyChangeListener(l);
+ }
+
+ /**
+ * Report a property change to registered listeners (for example edit parts).
+ *
+ * @param property the programmatic name of the property that changed
+ * @param oldValue the old value of this property
+ * @param newValue the new value of this property
+ */
+ protected void firePropertyChange(String property, Object oldValue, Object newValue) {
+ if (pcsDelegate.hasListeners(property)) {
+ pcsDelegate.firePropertyChange(property, oldValue, newValue);
+ }
+ }
+
+ /**
+ * Returns a value for this property source that can be edited in a property sheet.
+ * <p>
+ * My personal rule of thumb:
+ * </p>
+ * <ul>
+ * <li>model elements should return themselves and</li>
+ * <li>custom IPropertySource implementations (like DimensionPropertySource in the GEF-logic example) should return
+ * an editable value.</li>
+ * </ul>
+ * <p>
+ * Override only if necessary.
+ * </p>
+ *
+ * @return this instance
+ */
+ public Object getEditableValue() {
+ return this;
+ }
+
+ /**
+ * Children should override this. The default implementation returns an empty array.
+ */
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return EMPTY_ARRAY;
+ }
+
+ /**
+ * Children should override this. The default implementation returns null.
+ */
+ public Object getPropertyValue(Object id) {
+ return propertyValues.get(id);
+ }
+
+ /**
+ * Children should override this. The default implementation returns false.
+ */
+ public boolean isPropertySet(Object id) {
+ return false;
+ }
+
+ /**
+ * Deserialization constructor. Initializes transient fields.
+ *
+ * @see java.io.Serializable
+ */
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+ pcsDelegate = new PropertyChangeSupport(this);
+ }
+
+ /**
+ * Remove a PropertyChangeListener from this component.
+ *
+ * @param l a PropertyChangeListener instance
+ */
+ public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
+ if (l != null) {
+ pcsDelegate.removePropertyChangeListener(l);
+ }
+ }
+
+ /**
+ * Children should override this. The default implementation does nothing.
+ */
+ public void resetPropertyValue(Object id) {
+ // do nothing
+ }
+
+ /**
+ * Children should override this. The default implementation does nothing.
+ */
+ public void setPropertyValue(Object id, Object value) {
+ propertyValues.put(id, value);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/RectangleShape.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/RectangleShape.java
new file mode 100644
index 00000000000..8c9fe8dc39e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/RectangleShape.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * A rectangular shape.
+ *
+ * @author Donald G. Dunne
+ */
+public class RectangleShape extends Shape {
+ /** A 16x16 pictogram of a rectangular shape. */
+
+ public RectangleShape() {
+ setSize(new Dimension(100, 50));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#validForSave()
+ */
+ @Override
+ public Result validForSave() throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+ @Override
+ public Image getIcon() {
+ return ImageManager.getImage(FrameworkImage.RECTANGLE_16);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Shape#getName()
+ */
+ @Override
+ protected String getName() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Shape#getToolTip()
+ */
+ @Override
+ protected String getToolTip() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#doSave(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ public Result doSave(SkynetTransaction transaction) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ReturnTransitionConnection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ReturnTransitionConnection.java
new file mode 100644
index 00000000000..51b102bd55d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/ReturnTransitionConnection.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.ats.workflow.editor.model;
+
+import org.eclipse.draw2d.Graphics;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ReturnTransitionConnection extends TransitionConnection {
+
+ /**
+ * @param source
+ * @param target
+ */
+ public ReturnTransitionConnection(Shape source, Shape target) {
+ super(source, target);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Connection#getLineStyle()
+ */
+ @Override
+ public int getLineStyle() {
+ return Graphics.LINE_DASH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Connection#getLabel()
+ */
+ @Override
+ public String getLabel() {
+ return "Return Transition";
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Shape.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Shape.java
new file mode 100644
index 00000000000..0931f5ce43f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/Shape.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * Abstract prototype of a shape. Has a size (width and height), a location (x and y position) and a list of incoming
+ * and outgoing connections. Use subclasses to instantiate a specific shape.
+ *
+ * @see org.eclipse.osee.ats.workflow.editor.model.WorkPageShape
+ * @see org.eclipse.osee.ats.workflow.editor.model.EllipticalShape
+ * @author Donald G. Dunne
+ */
+public abstract class Shape extends ModelElement {
+
+ /**
+ * A static array of property descriptors. There is one IPropertyDescriptor entry per editable property.
+ *
+ * @see #getPropertyDescriptors()
+ * @see #getPropertyValue(Object)
+ * @see #setPropertyValue(Object, Object)
+ */
+ private IPropertyDescriptor[] descriptors;
+ private final List<IPropertyDescriptor> descriptorList = new ArrayList<IPropertyDescriptor>();
+ /** ID for the Height property value (used for by the corresponding property descriptor). */
+ private static final String HEIGHT_PROP = "Shape.Height";
+ /** Property ID to use when the location of this shape is modified. */
+ public static final String LOCATION_PROP = "Shape.Location";
+ private static final long serialVersionUID = 1;
+ /** Property ID to use then the size of this shape is modified. */
+ public static final String SIZE_PROP = "Shape.Size";
+ /** Property ID to use when the list of outgoing connections is modified. */
+ public static final String SOURCE_CONNECTIONS_PROP = "Shape.SourceConn";
+ /** Property ID to use when the list of incoming connections is modified. */
+ public static final String TARGET_CONNECTIONS_PROP = "Shape.TargetConn";
+ /** ID for the Width property value (used for by the corresponding property descriptor). */
+ private static final String WIDTH_PROP = "Shape.Width";
+
+ /** ID for the X property value (used for by the corresponding property descriptor). */
+ private static final String XPOS_PROP = "Shape.xPos";
+ /** ID for the Y property value (used for by the corresponding property descriptor). */
+ private static final String YPOS_PROP = "Shape.yPos";
+
+ protected abstract String getName();
+
+ protected abstract String getToolTip();
+
+ /** Location of this shape. */
+ private final Point location = new Point(0, 0);
+ /** Size of this shape. */
+ private final Dimension size = new Dimension(50, 50);
+ /** List of outgoing Connections. */
+ private final List<Connection> sourceConnections = new ArrayList<Connection>();
+ /** List of incoming Connections. */
+ private final List<Connection> targetConnections = new ArrayList<Connection>();
+ private WorkflowDiagram workflowDiagram;
+
+ /**
+ * Add an incoming or outgoing connection to this shape.
+ *
+ * @param conn a non-null connection instance
+ * @throws IllegalArgumentException if the connection is null or has not distinct endpoints
+ */
+ void addConnection(Connection conn) {
+ if (conn == null || conn.getSource() == conn.getTarget()) {
+ throw new IllegalArgumentException();
+ }
+ if (conn.getSource() == this) {
+ sourceConnections.add(conn);
+ firePropertyChange(SOURCE_CONNECTIONS_PROP, null, conn);
+ } else if (conn.getTarget() == this) {
+ targetConnections.add(conn);
+ firePropertyChange(TARGET_CONNECTIONS_PROP, null, conn);
+ }
+ }
+
+ /**
+ * Return a pictogram (small icon) describing this model element. Children should override this method and return an
+ * appropriate Image.
+ *
+ * @return a 16x16 Image or null
+ */
+ public abstract Image getIcon();
+
+ /**
+ * Return the Location of this shape.
+ *
+ * @return a non-null location instance
+ */
+ public Point getLocation() {
+ return location.getCopy();
+ }
+
+ /**
+ * Returns an array of IPropertyDescriptors for this shape.
+ * <p>
+ * The returned array is used to fill the property view, when the edit-part corresponding to this model element is
+ * selected.
+ * </p>
+ *
+ * @see #descriptors
+ * @see #getPropertyValue(Object)
+ * @see #setPropertyValue(Object, Object)
+ */
+ @Override
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ if (descriptors == null) {
+ initializePropertyDescriptors(descriptorList);
+ descriptors = descriptorList.toArray(new IPropertyDescriptor[descriptorList.size()]);
+ }
+ return descriptors;
+ }
+
+ protected void initializePropertyDescriptors(List<IPropertyDescriptor> descriptorList) {
+ descriptorList.add(new TextPropertyDescriptor(XPOS_PROP, "X")); // id and description pair
+ descriptorList.add(new TextPropertyDescriptor(YPOS_PROP, "Y"));
+ descriptorList.add(new TextPropertyDescriptor(WIDTH_PROP, "Width"));
+ descriptorList.add(new TextPropertyDescriptor(HEIGHT_PROP, "Height"));
+ // use a custom cell editor validator for all four array entries
+ for (IPropertyDescriptor descriptor : descriptorList) {
+ ((PropertyDescriptor) descriptor).setValidator(new ICellEditorValidator() {
+ public String isValid(Object value) {
+ int intValue = -1;
+ try {
+ intValue = Integer.parseInt((String) value);
+ } catch (NumberFormatException exc) {
+ return "Not a number";
+ }
+ return (intValue >= 0) ? null : "Value must be >= 0";
+ }
+ });
+ }
+ }
+
+ /**
+ * Return the property value for the given propertyId, or null.
+ * <p>
+ * The property view uses the IDs from the IPropertyDescriptors array to obtain the value of the corresponding
+ * properties.
+ * </p>
+ *
+ * @see #descriptors
+ * @see #getPropertyDescriptors()
+ */
+ @Override
+ public Object getPropertyValue(Object propertyId) {
+ if (XPOS_PROP.equals(propertyId)) {
+ return Integer.toString(location.x);
+ }
+ if (YPOS_PROP.equals(propertyId)) {
+ return Integer.toString(location.y);
+ }
+ if (HEIGHT_PROP.equals(propertyId)) {
+ return Integer.toString(size.height);
+ }
+ if (WIDTH_PROP.equals(propertyId)) {
+ return Integer.toString(size.width);
+ }
+ return super.getPropertyValue(propertyId);
+ }
+
+ /**
+ * Return the Size of this shape.
+ *
+ * @return a non-null Dimension instance
+ */
+ public Dimension getSize() {
+ return size.getCopy();
+ }
+
+ /**
+ * Return a List of outgoing Connections.
+ */
+ public List<Connection> getSourceConnections() {
+ return new ArrayList<Connection>(sourceConnections);
+ }
+
+ /**
+ * Return a List of incoming Connections.
+ */
+ public List<Connection> getTargetConnections() {
+ return new ArrayList<Connection>(targetConnections);
+ }
+
+ /**
+ * Remove an incoming or outgoing connection from this shape.
+ *
+ * @param conn a non-null connection instance
+ * @throws IllegalArgumentException if the parameter is null
+ */
+ void removeConnection(Connection conn) {
+ if (conn == null) {
+ throw new IllegalArgumentException();
+ }
+ if (conn.getSource() == this) {
+ sourceConnections.remove(conn);
+ firePropertyChange(SOURCE_CONNECTIONS_PROP, null, conn);
+ } else if (conn.getTarget() == this) {
+ targetConnections.remove(conn);
+ firePropertyChange(TARGET_CONNECTIONS_PROP, null, conn);
+ }
+ }
+
+ /**
+ * Set the Location of this shape.
+ *
+ * @param newLocation a non-null Point instance
+ * @throws IllegalArgumentException if the parameter is null
+ */
+ public void setLocation(Point newLocation) {
+ if (newLocation == null) {
+ throw new IllegalArgumentException();
+ }
+ location.setLocation(newLocation);
+ firePropertyChange(LOCATION_PROP, null, location);
+ }
+
+ /**
+ * Set the property value for the given property id. If no matching id is found, the call is forwarded to the
+ * superclass.
+ * <p>
+ * The property view uses the IDs from the IPropertyDescriptors array to set the values of the corresponding
+ * properties.
+ * </p>
+ *
+ * @see #descriptors
+ * @see #getPropertyDescriptors()
+ */
+ @Override
+ public void setPropertyValue(Object propertyId, Object value) {
+ if (XPOS_PROP.equals(propertyId)) {
+ int x = Integer.parseInt((String) value);
+ setLocation(new Point(x, location.y));
+ } else if (YPOS_PROP.equals(propertyId)) {
+ int y = Integer.parseInt((String) value);
+ setLocation(new Point(location.x, y));
+ } else if (HEIGHT_PROP.equals(propertyId)) {
+ int height = Integer.parseInt((String) value);
+ setSize(new Dimension(size.width, height));
+ } else if (WIDTH_PROP.equals(propertyId)) {
+ int width = Integer.parseInt((String) value);
+ setSize(new Dimension(width, size.height));
+ } else {
+ super.setPropertyValue(propertyId, value);
+ }
+ }
+
+ /**
+ * Set the Size of this shape. Will not modify the size if newSize is null.
+ *
+ * @param newSize a non-null Dimension instance or null
+ */
+ public void setSize(Dimension newSize) {
+ if (newSize != null) {
+ size.setSize(newSize);
+ firePropertyChange(SIZE_PROP, null, size);
+ }
+ }
+
+ /**
+ * @return the workflowDiagram
+ */
+ public WorkflowDiagram getWorkflowDiagram() {
+ return workflowDiagram;
+ }
+
+ /**
+ * @param workflowDiagram the workflowDiagram to set
+ */
+ public void setWorkflowDiagram(WorkflowDiagram workflowDiagram) {
+ this.workflowDiagram = workflowDiagram;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/TransitionConnection.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/TransitionConnection.java
new file mode 100644
index 00000000000..d32f5d2f675
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/TransitionConnection.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * A connection between two distinct shapes.
+ *
+ * @author Donald G. Dunne
+ */
+public class TransitionConnection extends Connection {
+
+ /** Property ID to use when the line style of this connection is modified. */
+ public static final String TYPE_PROP = "Type";
+ private static final IPropertyDescriptor[] descriptors = new IPropertyDescriptor[1];
+
+ static {
+ descriptors[0] = new TextPropertyDescriptor(TYPE_PROP, TYPE_PROP);
+ }
+
+ public TransitionConnection(Shape source, Shape target) {
+ super(source, target);
+ }
+
+ @Override
+ public Color getForegroundColor() {
+ return Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
+ }
+
+ @Override
+ public String toString() {
+ return "Transition: " + getPropertyValue(TYPE_PROP);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#validForSave()
+ */
+ @Override
+ public Result validForSave() throws OseeCoreException {
+ System.err.println("Add Connection validations.");
+ return Result.TrueResult;
+ }
+
+ /**
+ * Returns the descriptor for the lineStyle property
+ *
+ * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+ */
+ @Override
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ return descriptors;
+ }
+
+ /**
+ * Returns the lineStyle as String for the Property Sheet
+ *
+ * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+ */
+ @Override
+ public Object getPropertyValue(Object id) {
+ if (id.equals(TYPE_PROP)) {
+ return getLabel();
+ }
+ return super.getPropertyValue(id);
+ }
+
+ /**
+ * @return the label
+ */
+ @Override
+ public String getLabel() {
+ return "Transition";
+ }
+
+ /**
+ * @return the lineWidth
+ */
+ @Override
+ public int getLineWidth() {
+ return 2;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#doSave(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ public Result doSave(SkynetTransaction transaction) throws OseeCoreException {
+ return Result.TrueResult;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkPageShape.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkPageShape.java
new file mode 100644
index 00000000000..7d6172761ec
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkPageShape.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+/**
+ * A rectangular shape.
+ *
+ * @author Donald G. Dunne
+ */
+public class WorkPageShape extends RectangleShape {
+
+ private final WorkPageDefinition workPageDefinition;
+ private static String[] attributeProperties =
+ new String[] {WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(),
+ WorkItemAttributes.WORK_ID.getAttributeTypeName(),
+ WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName()};
+ public static String START_PAGE = "Start Page";
+ private Artifact artifact;
+ public static enum StartPageEnum {
+ Yes, No
+ };
+
+ public WorkPageShape() {
+ this(new WorkPageDefinition("New" + AtsLib.getAtsDeveloperIncrementingNum(), "NEW", null));
+ }
+
+ public WorkPageShape(WorkPageDefinition workPageDefinition) {
+ this.workPageDefinition = workPageDefinition;
+ try {
+ artifact = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(workPageDefinition.getId());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.Shape#setWorkflowDiagram(org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram)
+ */
+ @Override
+ public void setWorkflowDiagram(WorkflowDiagram workflowDiagram) {
+ super.setWorkflowDiagram(workflowDiagram);
+ if (getId().equals("NEW")) {
+ setPropertyValue(
+ WorkItemAttributes.WORK_ID.getAttributeTypeName(),
+ workflowDiagram.getWorkFlowDefinition().getId() + "." + getPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName()));
+ }
+ }
+
+ @Override
+ protected void initializePropertyDescriptors(List<IPropertyDescriptor> descriptorList) {
+ super.initializePropertyDescriptors(descriptorList);
+ for (String type : attributeProperties) {
+ descriptorList.add(new TextPropertyDescriptor(type, type)); // id and description pair
+ }
+ descriptorList.add(new ComboBoxPropertyDescriptor(START_PAGE, START_PAGE, new String[] {StartPageEnum.Yes.name(),
+ StartPageEnum.No.name()}));
+ }
+
+ @Override
+ protected void initializePropertyValues() throws OseeCoreException {
+ if (propertyValues == null) {
+ super.initializePropertyValues();
+ super.setPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(),
+ workPageDefinition.getPageName());
+ super.setPropertyValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), workPageDefinition.getId());
+ super.setPropertyValue(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(),
+ workPageDefinition.getParentId() == null ? "" : workPageDefinition.getParentId());
+ }
+ }
+
+ public boolean isStartPage() {
+ if (getPropertyValue(START_PAGE) == null) return false;
+ return ((Integer) getPropertyValue(START_PAGE)) == StartPageEnum.Yes.ordinal();
+ }
+
+ public void setStartPage(boolean set) {
+ setPropertyValue(START_PAGE, set ? StartPageEnum.Yes.ordinal() : StartPageEnum.No.ordinal());
+ }
+
+ @Override
+ public Object getPropertyValue(Object propertyId) {
+ try {
+ initializePropertyValues();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return super.getPropertyValue(propertyId);
+ }
+
+ public Artifact getArtifact() throws OseeCoreException {
+ return artifact;
+ }
+
+ /**
+ * @return the workPageDefinition
+ */
+ public WorkPageDefinition getWorkPageDefinition() {
+ return workPageDefinition;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#validForSave()
+ */
+ @Override
+ public Result validForSave() throws OseeCoreException {
+ try {
+ String pageName = (String) getPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName());
+ if (pageName == null || pageName.equals("")) return new Result(
+ WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName() + " can not be null");
+ String pageId = (String) getPropertyValue(WorkItemAttributes.WORK_ID.getAttributeTypeName());
+ if (pageId == null || pageId.equals("")) return new Result(
+ WorkItemAttributes.WORK_ID.getAttributeTypeName() + " can not be null");
+ String parentPageId = (String) getPropertyValue(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName());
+ if (parentPageId != null && !parentPageId.equals("")) {
+ if (WorkItemDefinitionFactory.getWorkItemDefinition(parentPageId) == null) return new Result(
+ "Parent Id " + parentPageId + " Work Page Definition must exist and does not.");
+ }
+ } catch (OseeCoreException ex) {
+ return new Result("Exception in validation " + ex.getLocalizedMessage());
+ }
+ return Result.TrueResult;
+ }
+
+ public boolean isInstanceof(String workPageDefinitionId) throws OseeCoreException {
+ return isInstanceofRecurse(workPageDefinition, workPageDefinitionId);
+ }
+
+ private boolean isInstanceofRecurse(WorkPageDefinition workPageDefinition, String workPageDefinitionId) throws OseeCoreException {
+ if (workPageDefinition.getId().equals(workPageDefinitionId)) return true;
+ if (workPageDefinition.getParent() != null) {
+ return isInstanceofRecurse((WorkPageDefinition) workPageDefinition.getParent(), workPageDefinitionId);
+ }
+ return false;
+ }
+
+ public boolean isCancelledState() throws OseeCoreException {
+ return isInstanceof(AtsCancelledWorkPageDefinition.ID);
+ }
+
+ public boolean isCompletedState() throws OseeCoreException {
+ return isInstanceof(AtsCompletedWorkPageDefinition.ID);
+ }
+
+ @Override
+ public String getName() {
+ return (String) getPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName());
+ }
+
+ @Override
+ public String getToolTip() {
+ return workPageDefinition.toString();
+ }
+
+ @Override
+ public String toString() {
+ return getId();
+ }
+
+ public String getId() {
+ return (String) getPropertyValue(WorkItemAttributes.WORK_ID.getAttributeTypeName());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof WorkPageShape) {
+ return ((WorkPageShape) obj).getId().equals(getId());
+ }
+ return super.equals(obj);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return getId().hashCode();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.model.Shape#setPropertyValue(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void setPropertyValue(Object propertyId, Object value) {
+ try {
+ initializePropertyValues();
+ if (WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName().equals(propertyId)) {
+ super.setPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(), value);
+ firePropertyChange(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(), null, value);
+ setPropertyValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(),
+ getWorkflowDiagram().getWorkFlowDefinition().getId() + "." + value);
+ } else if (WorkItemAttributes.WORK_ID.getAttributeTypeName().equals(propertyId)) {
+ super.setPropertyValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), value);
+ firePropertyChange(WorkItemAttributes.WORK_ID.getAttributeTypeName(), null, value);
+ } else if (WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName().equals(propertyId)) {
+ super.setPropertyValue(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), value);
+ firePropertyChange(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), null, value);
+ } else if (START_PAGE.equals(propertyId)) {
+ super.setPropertyValue(START_PAGE, value);
+ firePropertyChange(START_PAGE, null, value);
+ } else {
+ super.setPropertyValue(propertyId, value);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.model.ModelElement#doSave(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ public Result doSave(SkynetTransaction transaction) throws OseeCoreException {
+ String name = (String) getPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName());
+ String workId = (String) getPropertyValue(WorkItemAttributes.WORK_ID.getAttributeTypeName());
+ String parentWorkId = (String) getPropertyValue(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName());
+ workPageDefinition.setPageName(name);
+ workPageDefinition.setId(workId);
+ workPageDefinition.setParentId(parentWorkId);
+ Artifact artifact = getArtifact();
+ if (artifact == null) {
+ artifact = workPageDefinition.toArtifact(WriteType.New);
+ } else {
+ artifact.setSoleAttributeValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(), name);
+ artifact.setSoleAttributeValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), workId);
+ if (parentWorkId == null || parentWorkId.equals("")) {
+ artifact.deleteSoleAttribute(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName());
+ } else {
+ artifact.setSoleAttributeValue(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), parentWorkId);
+ }
+ }
+ artifact.setDescriptiveName(workId);
+ AtsWorkDefinitions.addUpdateWorkItemToDefaultHeirarchy(artifact, transaction);
+ WorkItemDefinitionFactory.deCache(workPageDefinition);
+ artifact.persistAttributesAndRelations(transaction);
+ return Result.TrueResult;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkflowDiagram.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkflowDiagram.java
new file mode 100644
index 00000000000..2d183ba6d68
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/WorkflowDiagram.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+�*����Donald G. Dunne - initial API and implementation
+�*******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition.TransitionType;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+
+/**
+ * A container for multiple shapes. This is the "root" of the model data structure.
+ *
+ * @author Donald G Dunne
+ */
+public class WorkflowDiagram extends ModelElement {
+
+ /** Property ID to use when a child is added to this diagram. */
+ public static final String CHILD_ADDED_PROP = "WorkflowDiagram.ChildAdded";
+ /** Property ID to use when a child is removed from this diagram. */
+ public static final String CHILD_REMOVED_PROP = "WorkflowDiagram.ChildRemoved";
+ private final List<Shape> shapes = new ArrayList<Shape>();
+ private final List<Shape> deletedShapes = new ArrayList<Shape>();
+ private final WorkFlowDefinition workFlowDefinition;
+
+ public WorkflowDiagram(WorkFlowDefinition workFlowDefinition) {
+ super();
+ this.workFlowDefinition = workFlowDefinition;
+ }
+
+ @Override
+ public Result doSave(SkynetTransaction transaction) throws OseeCoreException {
+ Result result = validForSave();
+ if (result.isFalse()) return result;
+ try {
+
+ List<WorkPageShape> workPageShapes = new ArrayList<WorkPageShape>();
+ for (Shape shape : getChildren()) {
+ if (shape instanceof WorkPageShape) {
+ workPageShapes.add((WorkPageShape) shape);
+ }
+ }
+
+ // Remove all states that do not exist anymore
+ for (Shape shape : deletedShapes) {
+ if (WorkPageShape.class.isAssignableFrom(shape.getClass())) {
+ WorkPageShape workPageShape = (WorkPageShape) shape;
+ if (workPageShape.getArtifact() != null) {
+ workPageShape.getArtifact().deleteAndPersist(transaction);
+ workFlowDefinition.removeWorkItem(((WorkPageShape) shape).getId());
+ }
+ }
+ }
+
+ // Save new states and modifications to states
+ for (WorkPageShape workPageShape : workPageShapes) {
+ result = workPageShape.doSave(transaction);
+ if (result.isFalse()) return result;
+ }
+
+ // Set start page
+ for (WorkPageShape workPageShape : workPageShapes) {
+ if (workPageShape.isStartPage()) {
+ workFlowDefinition.setStartPageId(workPageShape.getWorkPageDefinition().getPageName());
+ break;
+ }
+ }
+
+ // Validate transitions
+ workFlowDefinition.clearTransitions();
+ for (Connection connection : getConnections()) {
+ if (TransitionConnection.class.isAssignableFrom(connection.getClass())) {
+ TransitionConnection transConn = (TransitionConnection) connection;
+ if (transConn instanceof DefaultTransitionConnection) {
+ workFlowDefinition.addPageTransition(
+ ((WorkPageShape) transConn.getSource()).getWorkPageDefinition().getPageName(),
+ ((WorkPageShape) transConn.getTarget()).getWorkPageDefinition().getPageName(),
+ TransitionType.ToPageAsDefault);
+ } else if (transConn instanceof ReturnTransitionConnection) {
+ workFlowDefinition.addPageTransition(
+ ((WorkPageShape) transConn.getSource()).getWorkPageDefinition().getPageName(),
+ ((WorkPageShape) transConn.getTarget()).getWorkPageDefinition().getPageName(),
+ TransitionType.ToPageAsReturn);
+ } else if (transConn instanceof TransitionConnection) {
+ workFlowDefinition.addPageTransition(
+ ((WorkPageShape) transConn.getSource()).getWorkPageDefinition().getPageName(),
+ ((WorkPageShape) transConn.getTarget()).getWorkPageDefinition().getPageName(),
+ TransitionType.ToPage);
+ }
+ }
+ }
+ workFlowDefinition.loadPageData(true);
+
+ Artifact artifact = workFlowDefinition.toArtifact(WriteType.Update);
+ AtsWorkDefinitions.addUpdateWorkItemToDefaultHeirarchy(artifact, transaction);
+ artifact.persistAttributes(transaction);
+
+ WorkItemDefinitionFactory.deCache(workFlowDefinition);
+
+ // Validate saved workflows and all corresponding workItemDefinitions
+ // prior to completion of save
+ result = AtsWorkDefinitions.validateWorkItemDefinition(workFlowDefinition);
+ if (result.isFalse()) return result;
+ for (Shape shape : getChildren()) {
+ if (WorkPageShape.class.isAssignableFrom(shape.getClass())) {
+ WorkPageDefinition workPageDefinition = ((WorkPageShape) shape).getWorkPageDefinition();
+ result = AtsWorkDefinitions.validateWorkItemDefinition(workPageDefinition);
+ if (result.isFalse()) return result;
+ }
+ }
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Result.TrueResult;
+ }
+
+ @Override
+ public Result validForSave() throws OseeCoreException {
+
+ // Validate # Completed states
+ int num = 0;
+ for (Shape shape : getChildren()) {
+ num += (shape instanceof CompletedWorkPageShape) ? 1 : 0;
+ }
+ if (num > 1 || num == 0) return new Result("Must have only 1 Completed state; Currently " + num);
+
+ // Validate # Cancelled states
+ num = 0;
+ for (Shape shape : getChildren()) {
+ num += (shape instanceof CancelledWorkPageShape) ? 1 : 0;
+ }
+ if (num > 1 || num == 0) return new Result("Must have only 1 Cancelled state; Currently " + num);
+
+ // Validate # other states
+ num = 0;
+ for (Shape shape : getChildren()) {
+ num += (!(shape instanceof CompletedWorkPageShape) && !(shape instanceof CancelledWorkPageShape)) ? 1 : 0;
+ }
+ if (num == 0) return new Result("Must have > 0 states; Currently " + num);
+
+ // Validate # other states
+ num = 0;
+ for (Shape shape : getChildren()) {
+ if (WorkPageShape.class.isAssignableFrom(shape.getClass())) {
+ if (((WorkPageShape) shape).isStartPage()) {
+ if (((WorkPageShape) shape).isCancelledState()) return new Result(
+ "Cancelled state can not be start page");
+ if (((WorkPageShape) shape).isCompletedState()) return new Result(
+ "Completed state can not be start page");
+ num++;
+ }
+ }
+ }
+ if (num > 1 || num == 0) return new Result("Must have 1 start page; Currently " + num);
+
+ // Validate state names
+ List<String> stateNames = new ArrayList<String>();
+ for (Shape shape : getChildren()) {
+ if (WorkPageShape.class.isAssignableFrom(shape.getClass())) {
+ String name =
+ (String) ((WorkPageShape) shape).getPropertyValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName());
+ if (stateNames.contains(name)) {
+ return new Result(
+ "Workflow can not have more than one state of same name. Multiples found of name " + name);
+ }
+ stateNames.add(name);
+ }
+ }
+
+ // Validate transitions (each state must have a transition to or from
+ for (Shape shape : getChildren()) {
+ if (WorkPageShape.class.isAssignableFrom(shape.getClass())) {
+ if (shape.getSourceConnections().size() == 0 && shape.getTargetConnections().size() == 0) {
+ return new Result("States must have at least one transition to or from. None found for " + shape);
+ }
+ }
+ }
+
+ // Validate children shapes
+ for (Shape shape : getChildren()) {
+ Result result = shape.validForSave();
+ if (result.isFalse()) return result;
+ }
+ return Result.TrueResult;
+ }
+
+ @Override
+ public String toString() {
+ return "Work Flow Definition: " + workFlowDefinition.getName();
+ }
+
+ /**
+ * Add a shape to this diagram.
+ *
+ * @param s a non-null shape instance
+ * @return true, if the shape was added, false otherwise
+ */
+ public boolean addChild(Shape s) {
+ if (s != null && shapes.add(s)) {
+ deletedShapes.remove(s);
+ s.setWorkflowDiagram(this);
+ firePropertyChange(CHILD_ADDED_PROP, null, s);
+ return true;
+ }
+ return false;
+ }
+
+ public boolean hasChild(Shape s) {
+ for (Object obj : shapes) {
+ Shape shape = (Shape) obj;
+ if (shape.equals(s)) return true;
+ }
+ return false;
+ }
+
+ /** Return a List of Shapes in this diagram. The returned List should not be modified. */
+ public List<Shape> getChildren() {
+ return shapes;
+ }
+
+ public Set<Connection> getConnections() {
+ Set<Connection> connections = new HashSet<Connection>();
+ for (Shape shape : getChildren()) {
+ connections.addAll(shape.getSourceConnections());
+ connections.addAll(shape.getTargetConnections());
+ }
+ return connections;
+ }
+
+ /**
+ * Remove a shape from this diagram.
+ *
+ * @param s a non-null shape instance;
+ * @return true, if the shape was removed, false otherwise
+ */
+ public boolean removeChild(Shape s) {
+ if (s != null && shapes.remove(s)) {
+ deletedShapes.add(s);
+ firePropertyChange(CHILD_REMOVED_PROP, null, s);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @return the workFlowDefinition
+ */
+ public WorkFlowDefinition getWorkFlowDefinition() {
+ return workFlowDefinition;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionCreateCommand.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionCreateCommand.java
new file mode 100644
index 00000000000..304bb4b8f17
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionCreateCommand.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model.commands;
+
+import java.util.Iterator;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+import org.eclipse.osee.ats.workflow.editor.model.DefaultTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.ReturnTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.TransitionConnection;
+
+/**
+ * A command to create a connection between two shapes. The command can be undone or redone.
+ * <p>
+ * This command is designed to be used together with a GraphicalNodeEditPolicy. To use this command properly, following
+ * steps are necessary:
+ * </p>
+ * <ol>
+ * <li>Create a subclass of GraphicalNodeEditPolicy.</li>
+ * <li>Override the <tt>getConnectionCreateCommand(...)</tt> method, to create a new instance of this class and put it
+ * into the CreateConnectionRequest.</li>
+ * <li>Override the <tt>getConnectionCompleteCommand(...)</tt> method, to obtain the Command from the ConnectionRequest,
+ * call setTarget(...) to set the target endpoint of the connection and return this command instance.</li>
+ * </ol>
+ *
+ * @see org.eclipse.osee.ats.workflow.editor.parts.ShapeEditPart#createEditPolicies() for an example of the above
+ * procedure.
+ * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy
+ * @author Donald G. Dunne
+ */
+public class ConnectionCreateCommand extends Command {
+ /** The connection instance. */
+ private Connection connection;
+
+ /** Start endpoint for the connection. */
+ private final Shape source;
+ /** Target endpoint for the connection. */
+ private Shape target;
+ private final Class clazz;
+
+ /**
+ * Instantiate a command that can create a connection between two shapes.
+ *
+ * @param source the source endpoint (a non-null Shape instance)
+ * @param lineStyle the desired line style. See Connection#setLineStyle(int) for details
+ * @throws IllegalArgumentException if source is null
+ * @see Connection#setLineStyle(int)
+ */
+ @SuppressWarnings("unchecked")
+ public ConnectionCreateCommand(Shape source, Class clazz) {
+ this.clazz = clazz;
+ if (source == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("connection creation");
+ this.source = source;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#canExecute()
+ */
+ @Override
+ public boolean canExecute() {
+ // disallow source -> source connections
+ if (source.equals(target)) {
+ return false;
+ }
+ // return false, if the source -> target connection exists already
+ for (Iterator iter = source.getSourceConnections().iterator(); iter.hasNext();) {
+ Connection conn = (Connection) iter.next();
+ if (conn.getTarget().equals(target)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+ @Override
+ public void execute() {
+ // create a new connection between source and target
+ if (clazz == DefaultTransitionConnection.class) {
+ connection = new DefaultTransitionConnection(source, target);
+ } else if (clazz == ReturnTransitionConnection.class) {
+ connection = new ReturnTransitionConnection(source, target);
+ } else if (clazz == TransitionConnection.class) {
+ connection = new TransitionConnection(source, target);
+ } else {
+ throw new IllegalStateException("Unhandled connection type");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#redo()
+ */
+ @Override
+ public void redo() {
+ connection.reconnect();
+ }
+
+ /**
+ * Set the target endpoint for the connection.
+ *
+ * @param target that target endpoint (a non-null Shape instance)
+ * @throws IllegalArgumentException if target is null
+ */
+ public void setTarget(Shape target) {
+ if (target == null) {
+ throw new IllegalArgumentException();
+ }
+ this.target = target;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#undo()
+ */
+ @Override
+ public void undo() {
+ connection.disconnect();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionDeleteCommand.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionDeleteCommand.java
new file mode 100644
index 00000000000..49a11ba76df
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionDeleteCommand.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model.commands;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+
+/**
+ * A command to disconnect (remove) a connection from its endpoints. The command can be undone or redone.
+ *
+ * @author Donald G. Dunne
+ */
+public class ConnectionDeleteCommand extends Command {
+
+ /** Connection instance to disconnect. */
+ private final Connection connection;
+
+ /**
+ * Create a command that will disconnect a connection from its endpoints.
+ *
+ * @param conn the connection instance to disconnect (non-null)
+ * @throws IllegalArgumentException if conn is null
+ */
+ public ConnectionDeleteCommand(Connection conn) {
+ if (conn == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("connection deletion");
+ this.connection = conn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+ @Override
+ public void execute() {
+ connection.disconnect();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#undo()
+ */
+ @Override
+ public void undo() {
+ connection.reconnect();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionReconnectCommand.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionReconnectCommand.java
new file mode 100644
index 00000000000..61b27ed62af
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ConnectionReconnectCommand.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model.commands;
+
+import java.util.Iterator;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+
+/**
+ * A command to reconnect a connection to a different start point or end point. The command can be undone or redone.
+ * <p>
+ * This command is designed to be used together with a GraphicalNodeEditPolicy. To use this command propertly, following
+ * steps are necessary:
+ * </p>
+ * <ol>
+ * <li>Create a subclass of GraphicalNodeEditPolicy.</li>
+ * <li>Override the <tt>getReconnectSourceCommand(...)</tt> method. Here you need to obtain the Connection model element
+ * from the ReconnectRequest, create a new ConnectionReconnectCommand, set the new connection <i>source</i> by calling
+ * the <tt>setNewSource(Shape)</tt> method and return the command instance.
+ * <li>Override the <tt>getReconnectTargetCommand(...)</tt> method.</li> Here again you need to obtain the Connection
+ * model element from the ReconnectRequest, create a new ConnectionReconnectCommand, set the new connection
+ * <i>target</i> by calling the <tt>setNewTarget(Shape)</tt> method and return the command instance.</li>
+ * </ol>
+ *
+ * @see org.eclipse.osee.ats.workflow.editor.parts.ShapeEditPart#createEditPolicies() for an example of the above
+ * procedure.
+ * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy
+ * @see #setNewSource(Shape)
+ * @see #setNewTarget(Shape)
+ * @author Donald G. Dunne
+ */
+public class ConnectionReconnectCommand extends Command {
+
+ /** The connection instance to reconnect. */
+ private final Connection connection;
+ /** The new source endpoint. */
+ private Shape newSource;
+ /** The new target endpoint. */
+ private Shape newTarget;
+ /** The original source endpoint. */
+ private final Shape oldSource;
+ /** The original target endpoint. */
+ private final Shape oldTarget;
+
+ /**
+ * Instantiate a command that can reconnect a Connection instance to a different source or target endpoint.
+ *
+ * @param conn the connection instance to reconnect (non-null)
+ * @throws IllegalArgumentException if conn is null
+ */
+ public ConnectionReconnectCommand(Connection conn) {
+ if (conn == null) {
+ throw new IllegalArgumentException();
+ }
+ this.connection = conn;
+ this.oldSource = conn.getSource();
+ this.oldTarget = conn.getTarget();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#canExecute()
+ */
+ @Override
+ public boolean canExecute() {
+ if (newSource != null) {
+ return checkSourceReconnection();
+ } else if (newTarget != null) {
+ return checkTargetReconnection();
+ }
+ return false;
+ }
+
+ /**
+ * Return true, if reconnecting the connection-instance to newSource is allowed.
+ */
+ private boolean checkSourceReconnection() {
+ // connection endpoints must be different Shapes
+ if (newSource.equals(oldTarget)) {
+ return false;
+ }
+ // return false, if the connection exists already
+ for (Iterator iter = newSource.getSourceConnections().iterator(); iter.hasNext();) {
+ Connection conn = (Connection) iter.next();
+ // return false if a newSource -> oldTarget connection exists already
+ // and it is a different instance than the connection-field
+ if (conn.getTarget().equals(oldTarget) && !conn.equals(connection)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Return true, if reconnecting the connection-instance to newTarget is allowed.
+ */
+ private boolean checkTargetReconnection() {
+ // connection endpoints must be different Shapes
+ if (newTarget.equals(oldSource)) {
+ return false;
+ }
+ // return false, if the connection exists already
+ for (Iterator iter = newTarget.getTargetConnections().iterator(); iter.hasNext();) {
+ Connection conn = (Connection) iter.next();
+ // return false if a oldSource -> newTarget connection exists already
+ // and it is a differenct instance that the connection-field
+ if (conn.getSource().equals(oldSource) && !conn.equals(connection)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Reconnect the connection to newSource (if setNewSource(...) was invoked before) or newTarget (if setNewTarget(...)
+ * was invoked before).
+ */
+ @Override
+ public void execute() {
+ if (newSource != null) {
+ connection.reconnect(newSource, oldTarget);
+ } else if (newTarget != null) {
+ connection.reconnect(oldSource, newTarget);
+ } else {
+ throw new IllegalStateException("Should not happen");
+ }
+ }
+
+ /**
+ * Set a new source endpoint for this connection. When execute() is invoked, the source endpoint of the connection
+ * will be attached to the supplied Shape instance.
+ * <p>
+ * Note: Calling this method, deactivates reconnection of the <i>target</i> endpoint. A single instance of this
+ * command can only reconnect either the source or the target endpoint.
+ * </p>
+ *
+ * @param connectionSource a non-null Shape instance, to be used as a new source endpoint
+ * @throws IllegalArgumentException if connectionSource is null
+ */
+ public void setNewSource(Shape connectionSource) {
+ if (connectionSource == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("move connection startpoint");
+ newSource = connectionSource;
+ newTarget = null;
+ }
+
+ /**
+ * Set a new target endpoint for this connection When execute() is invoked, the target endpoint of the connection
+ * will be attached to the supplied Shape instance.
+ * <p>
+ * Note: Calling this method, deactivates reconnection of the <i>source</i> endpoint. A single instance of this
+ * command can only reconnect either the source or the target endpoint.
+ * </p>
+ *
+ * @param connectionTarget a non-null Shape instance, to be used as a new target endpoint
+ * @throws IllegalArgumentException if connectionTarget is null
+ */
+ public void setNewTarget(Shape connectionTarget) {
+ if (connectionTarget == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("move connection endpoint");
+ newSource = null;
+ newTarget = connectionTarget;
+ }
+
+ /**
+ * Reconnect the connection to its original source and target endpoints.
+ */
+ @Override
+ public void undo() {
+ connection.reconnect(oldSource, oldTarget);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeCreateCommand.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeCreateCommand.java
new file mode 100644
index 00000000000..ce4d4f6b1a5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeCreateCommand.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model.commands;
+
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+
+/**
+ * A command to add a Shape to a ShapeDiagram. The command can be undone or redone.
+ *
+ * @author Donald G. Dunne
+ */
+public class ShapeCreateCommand extends Command {
+
+ /** The new shape. */
+ private final Shape newShape;
+ /** ShapeDiagram to add to. */
+ private final WorkflowDiagram parent;
+ /** The bounds of the new Shape. */
+ private final Rectangle bounds;
+
+ /**
+ * Create a command that will add a new Shape to a WorkflowDiagram.
+ *
+ * @param newShape the new Shape that is to be added
+ * @param parent the WorkflowDiagram that will hold the new element
+ * @param bounds the bounds of the new shape; the size can be (-1, -1) if not known
+ * @throws IllegalArgumentException if any parameter is null, or the request does not provide a new Shape instance
+ */
+ public ShapeCreateCommand(Shape newShape, WorkflowDiagram parent, Rectangle bounds) {
+ this.newShape = newShape;
+ this.newShape.setWorkflowDiagram(parent);
+ this.parent = parent;
+ this.bounds = bounds;
+ setLabel("shape creation");
+ }
+
+ /**
+ * Can execute if all the necessary information has been provided.
+ *
+ * @see org.eclipse.gef.commands.Command#canExecute()
+ */
+ @Override
+ public boolean canExecute() {
+ boolean create = newShape != null && parent != null && bounds != null;
+ if (!create) return false;
+ if (parent.hasChild(newShape)) {
+ return false;
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+ @Override
+ public void execute() {
+ newShape.setLocation(bounds.getLocation());
+ Dimension size = bounds.getSize();
+ if (size.width > 0 && size.height > 0) newShape.setSize(size);
+ redo();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#redo()
+ */
+ @Override
+ public void redo() {
+ parent.addChild(newShape);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#undo()
+ */
+ @Override
+ public void undo() {
+ parent.removeChild(newShape);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeDeleteCommand.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeDeleteCommand.java
new file mode 100644
index 00000000000..880c956d79f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeDeleteCommand.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model.commands;
+
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+
+/**
+ * A command to remove a shape from its parent. The command can be undone or redone.
+ *
+ * @author Donald G. Dunne
+ */
+public class ShapeDeleteCommand extends Command {
+ /** Shape to remove. */
+ private final Shape child;
+
+ /** ShapeDiagram to remove from. */
+ private final WorkflowDiagram parent;
+ /** Holds a copy of the outgoing connections of child. */
+ private List sourceConnections;
+ /** Holds a copy of the incoming connections of child. */
+ private List targetConnections;
+ /** True, if child was removed from its parent. */
+ private boolean wasRemoved;
+
+ /**
+ * Create a command that will remove the shape from its parent.
+ *
+ * @param parent the WorkflowDiagram containing the child
+ * @param child the Shape to remove
+ * @throws IllegalArgumentException if any parameter is null
+ */
+ public ShapeDeleteCommand(WorkflowDiagram parent, Shape child) {
+ if (parent == null || child == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("shape deletion");
+ this.parent = parent;
+ this.child = child;
+ }
+
+ /**
+ * Reconnects a List of Connections with their previous endpoints.
+ *
+ * @param connections a non-null List of connections
+ */
+ private void addConnections(List connections) {
+ for (Iterator iter = connections.iterator(); iter.hasNext();) {
+ Connection conn = (Connection) iter.next();
+ conn.reconnect();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#canUndo()
+ */
+ @Override
+ public boolean canUndo() {
+ return wasRemoved;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+ @Override
+ public void execute() {
+ // store a copy of incoming & outgoing connections before proceeding
+ sourceConnections = child.getSourceConnections();
+ targetConnections = child.getTargetConnections();
+ redo();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#redo()
+ */
+ @Override
+ public void redo() {
+ // remove the child and disconnect its connections
+ wasRemoved = parent.removeChild(child);
+ if (wasRemoved) {
+ removeConnections(sourceConnections);
+ removeConnections(targetConnections);
+ }
+ }
+
+ /**
+ * Disconnects a List of Connections from their endpoints.
+ *
+ * @param connections a non-null List of connections
+ */
+ private void removeConnections(List connections) {
+ for (Iterator iter = connections.iterator(); iter.hasNext();) {
+ Connection conn = (Connection) iter.next();
+ conn.disconnect();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#undo()
+ */
+ @Override
+ public void undo() {
+ // add the child and reconnect its connections
+ if (parent.addChild(child)) {
+ addConnections(sourceConnections);
+ addConnections(targetConnections);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeSetConstraintCommand.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeSetConstraintCommand.java
new file mode 100644
index 00000000000..4a4500a1858
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/model/commands/ShapeSetConstraintCommand.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.model.commands;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+
+/**
+ * A command to resize and/or move a shape. The command can be undone or redone.
+ *
+ * @author Donald G. Dunne
+ */
+public class ShapeSetConstraintCommand extends Command {
+ /** Stores the new size and location. */
+ private final Rectangle newBounds;
+ /** Stores the old size and location. */
+ private Rectangle oldBounds;
+ /** A request to move/resize an edit part. */
+ private final ChangeBoundsRequest request;
+
+ /** Shape to manipulate. */
+ private final Shape shape;
+
+ /**
+ * Create a command that can resize and/or move a shape.
+ *
+ * @param shape the shape to manipulate
+ * @param req the move and resize request
+ * @param newBounds the new size and location
+ * @throws IllegalArgumentException if any of the parameters is null
+ */
+ public ShapeSetConstraintCommand(Shape shape, ChangeBoundsRequest req, Rectangle newBounds) {
+ if (shape == null || req == null || newBounds == null) {
+ throw new IllegalArgumentException();
+ }
+ this.shape = shape;
+ this.request = req;
+ this.newBounds = newBounds.getCopy();
+ setLabel("move / resize");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#canExecute()
+ */
+ @Override
+ public boolean canExecute() {
+ Object type = request.getType();
+ // make sure the Request is of a type we support:
+ return (RequestConstants.REQ_MOVE.equals(type) || RequestConstants.REQ_MOVE_CHILDREN.equals(type) || RequestConstants.REQ_RESIZE.equals(type) || RequestConstants.REQ_RESIZE_CHILDREN.equals(type));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+ @Override
+ public void execute() {
+ oldBounds = new Rectangle(shape.getLocation(), shape.getSize());
+ redo();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#redo()
+ */
+ @Override
+ public void redo() {
+ shape.setSize(newBounds.getSize());
+ shape.setLocation(newBounds.getLocation());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.commands.Command#undo()
+ */
+ @Override
+ public void undo() {
+ shape.setSize(oldBounds.getSize());
+ shape.setLocation(oldBounds.getLocation());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ConnectionEditPart.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ConnectionEditPart.java
new file mode 100644
index 00000000000..702307d30dc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ConnectionEditPart.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.PolygonDecoration;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editparts.AbstractConnectionEditPart;
+import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
+import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
+import org.eclipse.gef.requests.GroupRequest;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+import org.eclipse.osee.ats.workflow.editor.model.ModelElement;
+import org.eclipse.osee.ats.workflow.editor.model.TransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.commands.ConnectionDeleteCommand;
+
+/**
+ * Edit part for Connection model elements.
+ * <p>
+ * This edit part must implement the PropertyChangeListener interface, so it can be notified of property changes in the
+ * corresponding model element.
+ * </p>
+ *
+ * @author Donald G. Dunne
+ */
+class ConnectionEditPart extends AbstractConnectionEditPart implements PropertyChangeListener {
+
+ /**
+ * Upon activation, attach to the model element as a property change listener.
+ */
+ @Override
+ public void activate() {
+ if (!isActive()) {
+ super.activate();
+ ((ModelElement) getModel()).addPropertyChangeListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ // Selection handle edit policy.
+ // Makes the connection show a feedback, when selected by the user.
+ installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy());
+ // Allows the removal of the connection model element
+ installEditPolicy(EditPolicy.CONNECTION_ROLE, new ConnectionEditPolicy() {
+ @Override
+ protected Command getDeleteCommand(GroupRequest request) {
+ return new ConnectionDeleteCommand(getCastedModel());
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ PolylineConnection connection = (PolylineConnection) super.createFigure();
+ connection.setTargetDecoration(new PolygonDecoration()); // arrow at target endpoint
+ connection.setLineStyle(getCastedModel().getLineStyle()); // line drawing style
+ connection.setForegroundColor(getCastedModel().getForegroundColor());
+ connection.setLineWidth(getCastedModel().getLineWidth());
+ if (getCastedModel().getLabel() != null) {
+ connection.setToolTip(new Label(getCastedModel().getLabel()));
+ }
+ return connection;
+ }
+
+ /**
+ * Upon deactivation, detach from the model element as a property change listener.
+ */
+ @Override
+ public void deactivate() {
+ if (isActive()) {
+ super.deactivate();
+ ((ModelElement) getModel()).removePropertyChangeListener(this);
+ }
+ }
+
+ private Connection getCastedModel() {
+ return (Connection) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getPropertyName();
+ if (TransitionConnection.TYPE_PROP.equals(property)) {
+ ((PolylineConnection) getFigure()).setLineStyle(getCastedModel().getLineStyle());
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramEditPart.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramEditPart.java
new file mode 100644
index 00000000000..bd3b214c614
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramEditPart.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import org.eclipse.draw2d.ConnectionLayer;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FreeformLayer;
+import org.eclipse.draw2d.FreeformLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.ShortestPathConnectionRouter;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
+import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.osee.ats.workflow.editor.model.EllipticalShape;
+import org.eclipse.osee.ats.workflow.editor.model.ModelElement;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+import org.eclipse.osee.ats.workflow.editor.model.commands.ShapeCreateCommand;
+import org.eclipse.osee.ats.workflow.editor.model.commands.ShapeSetConstraintCommand;
+
+/**
+ * EditPart for the a WorkflowDiagram instance.
+ * <p>
+ * This edit part server as the main diagram container, the white area where everything else is in. Also responsible for
+ * the container's layout (the way the container rearanges is contents) and the container's capabilities (edit
+ * policies).
+ * </p>
+ * <p>
+ * This edit part must implement the PropertyChangeListener interface, so it can be notified of property changes in the
+ * corresponding model element.
+ * </p>
+ *
+ * @author Donald G. Dunne
+ */
+public class DiagramEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener {
+
+ /**
+ * Upon activation, attach to the model element as a property change listener.
+ */
+ @Override
+ public void activate() {
+ if (!isActive()) {
+ super.activate();
+ ((ModelElement) getModel()).addPropertyChangeListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ // disallows the removal of this edit part from its parent
+ installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
+ // handles constraint changes (e.g. moving and/or resizing) of model elements
+ // and creation of new model elements
+ installEditPolicy(EditPolicy.LAYOUT_ROLE, new ShapesXYLayoutEditPolicy());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ Figure f = new FreeformLayer();
+ f.setBorder(new MarginBorder(3));
+ f.setLayoutManager(new FreeformLayout());
+
+ // Create the static router for the connection layer
+ ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
+ connLayer.setConnectionRouter(new ShortestPathConnectionRouter(f));
+
+ return f;
+ }
+
+ /**
+ * Upon deactivation, detach from the model element as a property change listener.
+ */
+ @Override
+ public void deactivate() {
+ if (isActive()) {
+ super.deactivate();
+ ((ModelElement) getModel()).removePropertyChangeListener(this);
+ }
+ }
+
+ private WorkflowDiagram getCastedModel() {
+ return (WorkflowDiagram) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
+ */
+ @Override
+ protected List getModelChildren() {
+ return getCastedModel().getChildren(); // return a list of shapes
+ }
+
+ /* (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ String prop = evt.getPropertyName();
+ // these properties are fired when Shapes are added into or removed from
+ // the ShapeDiagram instance and must cause a call of refreshChildren()
+ // to update the diagram's contents.
+ if (WorkflowDiagram.CHILD_ADDED_PROP.equals(prop) || WorkflowDiagram.CHILD_REMOVED_PROP.equals(prop)) {
+ refreshChildren();
+ }
+ }
+
+ /**
+ * EditPolicy for the Figure used by this edit part. Children of XYLayoutEditPolicy can be used in Figures with
+ * XYLayout.
+ *
+ * @author Donald G. Dunne
+ */
+ private static class ShapesXYLayoutEditPolicy extends XYLayoutEditPolicy {
+
+ /* (non-Javadoc)
+ * @see ConstrainedLayoutEditPolicy#createChangeConstraintCommand(ChangeBoundsRequest, EditPart, Object)
+ */
+ @Override
+ protected Command createChangeConstraintCommand(ChangeBoundsRequest request, EditPart child, Object constraint) {
+ if (child instanceof ShapeEditPart && constraint instanceof Rectangle) {
+ // return a command that can move and/or resize a Shape
+ return new ShapeSetConstraintCommand((Shape) child.getModel(), request, (Rectangle) constraint);
+ }
+ return super.createChangeConstraintCommand(request, child, constraint);
+ }
+
+ /* (non-Javadoc)
+ * @see ConstrainedLayoutEditPolicy#createChangeConstraintCommand(EditPart, Object)
+ */
+ @Override
+ protected Command createChangeConstraintCommand(EditPart child, Object constraint) {
+ // not used in this example
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see LayoutEditPolicy#getCreateCommand(CreateRequest)
+ */
+ @Override
+ protected Command getCreateCommand(CreateRequest request) {
+ Object childClass = request.getNewObjectType();
+ if (childClass == EllipticalShape.class || WorkPageShape.class.isAssignableFrom(((Class<?>) childClass))) {
+ // return a command that can add a Shape to a WorkflowDiagram
+ return new ShapeCreateCommand((Shape) request.getNewObject(), (WorkflowDiagram) getHost().getModel(),
+ (Rectangle) getConstraintFor(request));
+ }
+ return null;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramTreeEditPart.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramTreeEditPart.java
new file mode 100644
index 00000000000..2e6e484b943
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/DiagramTreeEditPart.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.RootEditPart;
+import org.eclipse.gef.editparts.AbstractTreeEditPart;
+import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
+import org.eclipse.osee.ats.workflow.editor.model.ModelElement;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+
+/**
+ * TreeEditPart for a WorkflowDiagram instance. This is used in the Outline View of the ShapesEditor.
+ * <p>
+ * This edit part must implement the PropertyChangeListener interface, so it can be notified of property changes in the
+ * corresponding model element.
+ * </p>
+ *
+ * @author Donald G. Dunne
+ */
+class DiagramTreeEditPart extends AbstractTreeEditPart implements PropertyChangeListener {
+
+ /**
+ * Create a new instance of this edit part using the given model element.
+ *
+ * @param model a non-null WorkflowDiagram instance
+ */
+ DiagramTreeEditPart(WorkflowDiagram model) {
+ super(model);
+ }
+
+ /**
+ * Upon activation, attach to the model element as a property change listener.
+ */
+ @Override
+ public void activate() {
+ if (!isActive()) {
+ super.activate();
+ ((ModelElement) getModel()).addPropertyChangeListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.examples.shapes.parts.ShapeTreeEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ // If this editpart is the root content of the viewer, then disallow removal
+ if (getParent() instanceof RootEditPart) {
+ installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
+ }
+ }
+
+ /**
+ * Upon deactivation, detach from the model element as a property change listener.
+ */
+ @Override
+ public void deactivate() {
+ if (isActive()) {
+ super.deactivate();
+ ((ModelElement) getModel()).removePropertyChangeListener(this);
+ }
+ }
+
+ private WorkflowDiagram getCastedModel() {
+ return (WorkflowDiagram) getModel();
+ }
+
+ /**
+ * Convenience method that returns the EditPart corresponding to a given child.
+ *
+ * @param child a model element instance
+ * @return the corresponding EditPart or null
+ */
+ private EditPart getEditPartForChild(Object child) {
+ return (EditPart) getViewer().getEditPartRegistry().get(child);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
+ */
+ @Override
+ protected List getModelChildren() {
+ return getCastedModel().getChildren(); // a list of shapes
+ }
+
+ /* (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ String prop = evt.getPropertyName();
+ if (WorkflowDiagram.CHILD_ADDED_PROP.equals(prop)) {
+ // add a child to this edit part
+ // causes an additional entry to appear in the tree of the outline view
+ addChild(createChild(evt.getNewValue()), -1);
+ } else if (WorkflowDiagram.CHILD_REMOVED_PROP.equals(prop)) {
+ // remove a child from this edit part
+ // causes the corresponding edit part to disappear from the tree in the outline view
+ removeChild(getEditPartForChild(evt.getNewValue()));
+ } else {
+ refreshVisuals();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/LeftAnchor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/LeftAnchor.java
new file mode 100644
index 00000000000..00a6a10c8e5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/LeftAnchor.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.ats.workflow.editor.parts;
+
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * @author Donald G. Dunne
+ */
+class LeftAnchor extends ChopboxAnchor {
+
+ LeftAnchor(IFigure source) {
+ super(source);
+ }
+
+ @Override
+ public Point getLocation(Point reference) {
+ Rectangle r = getOwner().getBounds().getCopy();
+ getOwner().translateToAbsolute(r);
+ return r.getLeft();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/RightAnchor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/RightAnchor.java
new file mode 100644
index 00000000000..27672bcc3cd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/RightAnchor.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.ats.workflow.editor.parts;
+
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * @author Donald G. Dunne
+ */
+class RightAnchor extends ChopboxAnchor {
+
+ RightAnchor(IFigure source) {
+ super(source);
+ }
+
+ @Override
+ public Point getLocation(Point reference) {
+ Rectangle r = getOwner().getBounds().getCopy();
+ getOwner().translateToAbsolute(r);
+ return r.getRight();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeComponentEditPolicy.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeComponentEditPolicy.java
new file mode 100644
index 00000000000..4172b62fe7d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeComponentEditPolicy.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.ComponentEditPolicy;
+import org.eclipse.gef.requests.GroupRequest;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+import org.eclipse.osee.ats.workflow.editor.model.commands.ShapeDeleteCommand;
+
+/**
+ * This edit policy enables the removal of a Shapes instance from its container.
+ *
+ * @see ShapeEditPart#createEditPolicies()
+ * @see ShapeTreeEditPart#createEditPolicies()
+ * @author Donald G. Dunne
+ */
+class ShapeComponentEditPolicy extends ComponentEditPolicy {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.ComponentEditPolicy#createDeleteCommand(org.eclipse.gef.requests.GroupRequest)
+ */
+ @Override
+ protected Command createDeleteCommand(GroupRequest deleteRequest) {
+ Object parent = getHost().getParent().getModel();
+ Object child = getHost().getModel();
+ if (parent instanceof WorkflowDiagram && child instanceof Shape) {
+ return new ShapeDeleteCommand((WorkflowDiagram) parent, (Shape) child);
+ }
+ return super.createDeleteCommand(deleteRequest);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeEditPart.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeEditPart.java
new file mode 100644
index 00000000000..2976a75aeb9
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeEditPart.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.Ellipse;
+import org.eclipse.draw2d.EllipseAnchor;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.NodeEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
+import org.eclipse.gef.requests.CreateConnectionRequest;
+import org.eclipse.gef.requests.ReconnectRequest;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+import org.eclipse.osee.ats.workflow.editor.model.EllipticalShape;
+import org.eclipse.osee.ats.workflow.editor.model.ModelElement;
+import org.eclipse.osee.ats.workflow.editor.model.RectangleShape;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.commands.ConnectionCreateCommand;
+import org.eclipse.osee.ats.workflow.editor.model.commands.ConnectionReconnectCommand;
+
+/**
+ * EditPart used for Shape instances (more specific for EllipticalShape and RectangularShape instances).
+ * <p>
+ * This edit part must implement the PropertyChangeListener interface, so it can be notified of property changes in the
+ * corresponding model element.
+ * </p>
+ *
+ * @author Donald G. Dunne
+ */
+class ShapeEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener, NodeEditPart {
+
+ private ConnectionAnchor anchor;
+
+ /**
+ * Upon activation, attach to the model element as a property change listener.
+ */
+ @Override
+ public void activate() {
+ if (!isActive()) {
+ super.activate();
+ ((ModelElement) getModel()).addPropertyChangeListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ // allow removal of the associated model element
+ installEditPolicy(EditPolicy.COMPONENT_ROLE, new ShapeComponentEditPolicy());
+ // allow the creation of connections and
+ // and the reconnection of connections between Shape instances
+ installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new GraphicalNodeEditPolicy() {
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getConnectionCompleteCommand(org.eclipse.gef.requests.CreateConnectionRequest)
+ */
+ @Override
+ protected Command getConnectionCompleteCommand(CreateConnectionRequest request) {
+ ConnectionCreateCommand cmd = (ConnectionCreateCommand) request.getStartCommand();
+ cmd.setTarget((Shape) getHost().getModel());
+ return cmd;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getConnectionCreateCommand(org.eclipse.gef.requests.CreateConnectionRequest)
+ */
+ @Override
+ protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
+ Shape source = (Shape) getHost().getModel();
+ Class<?> clazz = (Class<?>) request.getNewObjectType();
+ ConnectionCreateCommand cmd = new ConnectionCreateCommand(source, clazz);
+ request.setStartCommand(cmd);
+ return cmd;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getReconnectSourceCommand(org.eclipse.gef.requests.ReconnectRequest)
+ */
+ @Override
+ protected Command getReconnectSourceCommand(ReconnectRequest request) {
+ Connection conn = (Connection) request.getConnectionEditPart().getModel();
+ Shape newSource = (Shape) getHost().getModel();
+ ConnectionReconnectCommand cmd = new ConnectionReconnectCommand(conn);
+ cmd.setNewSource(newSource);
+ return cmd;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy#getReconnectTargetCommand(org.eclipse.gef.requests.ReconnectRequest)
+ */
+ @Override
+ protected Command getReconnectTargetCommand(ReconnectRequest request) {
+ Connection conn = (Connection) request.getConnectionEditPart().getModel();
+ Shape newTarget = (Shape) getHost().getModel();
+ ConnectionReconnectCommand cmd = new ConnectionReconnectCommand(conn);
+ cmd.setNewTarget(newTarget);
+ return cmd;
+ }
+ });
+ }
+
+ /*(non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ IFigure f = createFigureForModel();
+ f.setOpaque(true); // non-transparent figure
+ f.setBackgroundColor(ColorConstants.green);
+ return f;
+ }
+
+ /**
+ * Return a IFigure depending on the instance of the current model element. This allows this EditPart to be used for
+ * both sublasses of Shape.
+ */
+ protected IFigure createFigureForModel() {
+ if (getModel() instanceof EllipticalShape) {
+ return new Ellipse();
+ }
+ if (getModel() instanceof RectangleShape) {
+ return new RoundedRectangle();
+ } else {
+ // if Shapes gets extended the conditions above must be updated
+ throw new IllegalArgumentException();
+ }
+ }
+
+ /**
+ * Upon deactivation, detach from the model element as a property change listener.
+ */
+ @Override
+ public void deactivate() {
+ if (isActive()) {
+ super.deactivate();
+ ((ModelElement) getModel()).removePropertyChangeListener(this);
+ }
+ }
+
+ private Shape getCastedModel() {
+ return (Shape) getModel();
+ }
+
+ protected ConnectionAnchor getConnectionAnchor() {
+ if (anchor == null) {
+ if (getModel() instanceof EllipticalShape)
+ anchor = new EllipseAnchor(getFigure());
+ else if (getModel() instanceof RectangleShape)
+ anchor = new ChopboxAnchor(getFigure());
+ else
+ // if Shapes gets extended the conditions above must be updated
+ throw new IllegalArgumentException("unexpected model");
+ }
+ return anchor;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections()
+ */
+ @Override
+ protected List getModelSourceConnections() {
+ return getCastedModel().getSourceConnections();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections()
+ */
+ @Override
+ protected List getModelTargetConnections() {
+ return getCastedModel().getTargetConnections();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
+ */
+ public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) {
+ return getConnectionAnchor();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
+ */
+ public ConnectionAnchor getSourceConnectionAnchor(Request request) {
+ return getConnectionAnchor();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
+ */
+ public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) {
+ return getConnectionAnchor();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
+ */
+ public ConnectionAnchor getTargetConnectionAnchor(Request request) {
+ return getConnectionAnchor();
+ }
+
+ /* (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ String prop = evt.getPropertyName();
+ if (Shape.SIZE_PROP.equals(prop) || Shape.LOCATION_PROP.equals(prop)) {
+ refreshVisuals();
+ } else if (Shape.SOURCE_CONNECTIONS_PROP.equals(prop)) {
+ refreshSourceConnections();
+ } else if (Shape.TARGET_CONNECTIONS_PROP.equals(prop)) {
+ refreshTargetConnections();
+ }
+ }
+
+ @Override
+ protected void refreshVisuals() {
+ // notify parent container of changed position & location
+ // if this line is removed, the XYLayoutManager used by the parent container
+ // (the Figure of the ShapesDiagramEditPart), will not know the bounds of this figure
+ // and will not draw it correctly.
+ Rectangle bounds = new Rectangle(getCastedModel().getLocation(), getCastedModel().getSize());
+ ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), bounds);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeTreeEditPart.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeTreeEditPart.java
new file mode 100644
index 00000000000..9479b14fa06
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapeTreeEditPart.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editparts.AbstractTreeEditPart;
+import org.eclipse.osee.ats.workflow.editor.model.ModelElement;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * TreeEditPart used for Shape instances (more specific for EllipticalShape and RectangularShape instances). This is
+ * used in the Outline View of the ShapesEditor.
+ * <p>
+ * This edit part must implement the PropertyChangeListener interface, so it can be notified of property changes in the
+ * corresponding model element.
+ * </p>
+ *
+ * @author Donald G. Dunne
+ */
+class ShapeTreeEditPart extends AbstractTreeEditPart implements PropertyChangeListener {
+
+ /**
+ * Create a new instance of this edit part using the given model element.
+ *
+ * @param model a non-null Shapes instance
+ */
+ ShapeTreeEditPart(Shape model) {
+ super(model);
+ }
+
+ /**
+ * Upon activation, attach to the model element as a property change listener.
+ */
+ @Override
+ public void activate() {
+ if (!isActive()) {
+ super.activate();
+ ((ModelElement) getModel()).addPropertyChangeListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractTreeEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ // allow removal of the associated model element
+ installEditPolicy(EditPolicy.COMPONENT_ROLE, new ShapeComponentEditPolicy());
+ }
+
+ /**
+ * Upon deactivation, detach from the model element as a property change listener.
+ */
+ @Override
+ public void deactivate() {
+ if (isActive()) {
+ super.deactivate();
+ ((ModelElement) getModel()).removePropertyChangeListener(this);
+ }
+ }
+
+ private Shape getCastedModel() {
+ return (Shape) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractTreeEditPart#getImage()
+ */
+ @Override
+ protected Image getImage() {
+ return getCastedModel().getIcon();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractTreeEditPart#getText()
+ */
+ @Override
+ protected String getText() {
+ return getCastedModel().toString();
+ }
+
+ /* (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ refreshVisuals(); // this will cause an invocation of getImage() and getText(), see below
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesEditPartFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesEditPartFactory.java
new file mode 100644
index 00000000000..4a21b994afd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesEditPartFactory.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.osee.ats.workflow.editor.model.CancelledWorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.CompletedWorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.Connection;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkPageShape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+
+/**
+ * Factory that maps model elements to edit parts.
+ *
+ * @author Donald G. Dunne
+ */
+public class ShapesEditPartFactory implements EditPartFactory {
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart, java.lang.Object)
+ */
+ public EditPart createEditPart(EditPart context, Object modelElement) {
+ // get EditPart for model element
+ EditPart part = getPartForElement(modelElement);
+ // store model element in EditPart
+ part.setModel(modelElement);
+ return part;
+ }
+
+ /**
+ * Maps an object to an EditPart.
+ *
+ * @throws RuntimeException if no match was found (programming error)
+ */
+ private EditPart getPartForElement(Object modelElement) {
+ if (modelElement instanceof WorkflowDiagram) {
+ return new DiagramEditPart();
+ }
+ if (modelElement instanceof CompletedWorkPageShape) {
+ return new WorkPageEditPart((CompletedWorkPageShape) modelElement);
+ }
+ if (modelElement instanceof CancelledWorkPageShape) {
+ return new WorkPageEditPart((CancelledWorkPageShape) modelElement);
+ }
+ if (modelElement instanceof WorkPageShape) {
+ return new WorkPageEditPart((WorkPageShape) modelElement);
+ }
+ if (modelElement instanceof Shape) {
+ return new ShapeEditPart();
+ }
+ if (modelElement instanceof Connection) {
+ return new ConnectionEditPart();
+ }
+ throw new RuntimeException(
+ "Can't create part for model element: " + ((modelElement != null) ? modelElement.getClass().getName() : "null"));
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesTreeEditPartFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesTreeEditPartFactory.java
new file mode 100644
index 00000000000..1f529302916
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/ShapesTreeEditPartFactory.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.parts;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.osee.ats.workflow.editor.model.Shape;
+import org.eclipse.osee.ats.workflow.editor.model.WorkflowDiagram;
+
+/**
+ * Factory that maps model elements to TreeEditParts. TreeEditParts are used in the outline view of the ShapesEditor.
+ *
+ * @author Donald G. Dunne
+ */
+public class ShapesTreeEditPartFactory implements EditPartFactory {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart, java.lang.Object)
+ */
+ public EditPart createEditPart(EditPart context, Object model) {
+ if (model instanceof Shape) {
+ return new ShapeTreeEditPart((Shape) model);
+ }
+ if (model instanceof WorkflowDiagram) {
+ return new DiagramTreeEditPart((WorkflowDiagram) model);
+ }
+ return null; // will not show an entry for the corresponding model instance
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/WorkPageEditPart.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/WorkPageEditPart.java
new file mode 100644
index 00000000000..2170eae05cc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/parts/WorkPageEditPart.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.ats.workflow.editor.parts;
+
+import java.beans.PropertyChangeEvent;
+import java.util.logging.Level;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.GridLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.SelectionRequest;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.editor.actions.EditAction;
+import org.eclipse.osee.ats.workflow.editor.model.ReturnTransitionConnection;
+import org.eclipse.osee.ats.workflow.editor.model.WorkPageShape;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemAttributes;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkPageEditPart extends ShapeEditPart {
+
+ private final WorkPageShape workPageShape;
+ private RightAnchor returnAnchor;
+ private Label label;
+
+ public WorkPageEditPart(WorkPageShape workPageShape) {
+ this.workPageShape = workPageShape;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.parts.ShapeEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ IFigure f = super.createFigure();
+ f.setLayoutManager(new GridLayout());
+ try {
+ if (workPageShape.isCompletedState()) {
+ f.setBackgroundColor(ColorConstants.darkGreen);
+ } else if (workPageShape.isCancelledState()) {
+ f.setBackgroundColor(ColorConstants.lightGray);
+ } else if (workPageShape.isStartPage()) {
+ f.setBackgroundColor(ColorConstants.yellow);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ label = new Label(workPageShape.getName());
+ f.add(label);
+ f.setToolTip(new Label(workPageShape.getToolTip()));
+ return f;
+ }
+
+ @Override
+ protected void refreshVisuals() {
+ super.refreshVisuals();
+ label.setText(workPageShape.getName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#performRequest(org.eclipse.gef.Request)
+ */
+ @Override
+ public void performRequest(Request req) {
+ super.performRequest(req);
+ System.out.println(req);
+ if (req instanceof SelectionRequest) {
+ (new EditAction()).run();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.workflow.editor.parts.ShapeEditPart#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ super.propertyChange(evt);
+ String prop = evt.getPropertyName();
+ if (WorkPageShape.START_PAGE.equals(prop)) {
+ if (workPageShape.isStartPage()) {
+ getFigure().setBackgroundColor(ColorConstants.yellow);
+ } else {
+ getFigure().setBackgroundColor(ColorConstants.green);
+ }
+ }
+ if (WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName().equals(prop)) {
+ refreshVisuals();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.parts.ShapeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
+ */
+ @Override
+ public ConnectionAnchor getTargetConnectionAnchor(Request request) {
+ // TODO implement sending back returnAnchor if appropriate
+ return super.getTargetConnectionAnchor(request);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.parts.ShapeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
+ */
+ @Override
+ public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) {
+ if (connection.getModel() instanceof ReturnTransitionConnection) {
+ if (returnAnchor == null) {
+ returnAnchor = new RightAnchor(getFigure());
+ }
+ return returnAnchor;
+ }
+ return super.getTargetConnectionAnchor(connection);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.parts.ShapeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
+ */
+ @Override
+ public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) {
+ if (connection.getModel() instanceof ReturnTransitionConnection) {
+ if (returnAnchor == null) {
+ returnAnchor = new RightAnchor(getFigure());
+ }
+ return returnAnchor;
+ }
+ return super.getTargetConnectionAnchor(connection);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.config.editor.parts.ShapeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
+ */
+ @Override
+ public ConnectionAnchor getSourceConnectionAnchor(Request request) {
+ // TODO implement sending back returnAnchor if appropriate
+ return super.getSourceConnectionAnchor(request);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/AtsWorkflowConfigCreationWizard.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/AtsWorkflowConfigCreationWizard.java
new file mode 100644
index 00000000000..5861c1a96af
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/AtsWorkflowConfigCreationWizard.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Donald G. Dunne 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:
+ *    Donald G. Dunne - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.editor.wizard;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.workflow.editor.AtsWorkflowConfigEditor;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsEndorseWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.StringAttribute;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition.TransitionType;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Create new new .shape-file. Those files can be used with the ShapesEditor (see plugin.xml).
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsWorkflowConfigCreationWizard extends Wizard implements INewWizard {
+
+ private NewWorkflowConfigPage1 page1;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizard#addPages()
+ */
+ @Override
+ public void addPages() {
+ // add pages to this wizard
+ addPage(page1);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // create pages for this wizard
+ page1 = new NewWorkflowConfigPage1(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.IWizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ final String namespace = page1.getNamespace();
+ final String startingWorkflow = page1.getStartingWorkflow();
+ try {
+ try {
+ if (WorkItemDefinitionFactory.getWorkItemDefinition(namespace) != null) {
+ AWorkbench.popup("ERROR", "Namespace already used, choose a unique namespace.");
+ return false;
+ }
+ } catch (OseeCoreException ex) {
+ // do nothing
+ }
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ WorkFlowDefinition workflow = null;
+ if (startingWorkflow.contains("Simple")) {
+ workflow = generateSimpleWorkflow(namespace, transaction, null).getWorkDefinition();
+ } else {
+ workflow = generateDefaultWorkflow(namespace, transaction, null).getWorkDefinition();
+ }
+ transaction.execute();
+
+ AtsWorkflowConfigEditor.editWorkflow(workflow);
+
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+
+ }
+ public static class WorkflowData {
+ private final WorkFlowDefinition workDefinition;
+ private final Artifact workFlowArtifact;
+
+ public WorkflowData(WorkFlowDefinition workDefinition, Artifact workFlowArtifact) {
+ this.workDefinition = workDefinition;
+ this.workFlowArtifact = workFlowArtifact;
+ }
+
+ /**
+ * @return the workDefinition
+ */
+ public WorkFlowDefinition getWorkDefinition() {
+ return workDefinition;
+ }
+
+ /**
+ * @return the workFlowArtifact
+ */
+ public Artifact getWorkFlowArtifact() {
+ return workFlowArtifact;
+ }
+ }
+
+ public static WorkflowData generateDefaultWorkflow(String namespace, SkynetTransaction transaction, TeamDefinitionArtifact teamDef) throws OseeCoreException {
+ // Duplicate default workflow artifact w/ namespace changes
+ Artifact defaultWorkflow = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact("osee.ats.teamWorkflow");
+ Artifact newWorkflowArt = defaultWorkflow.duplicate(AtsPlugin.getAtsBranch());
+ for (Attribute<?> attr : newWorkflowArt.getAttributes(false)) {
+ if (attr instanceof StringAttribute) {
+ attr.setFromString(attr.getDisplayableString().replaceAll("osee.ats.teamWorkflow", namespace));
+ }
+ }
+
+ AtsWorkDefinitions.addUpdateWorkItemToDefaultHeirarchy(newWorkflowArt, transaction);
+ newWorkflowArt.persistAttributesAndRelations(transaction);
+
+ // Duplicate work pages w/ namespace changes
+ for (DefaultTeamState state : DefaultTeamState.values()) {
+ Artifact defaultStateArt =
+ WorkItemDefinitionFactory.getWorkItemDefinitionArtifact("osee.ats.teamWorkflow." + state.name());
+ Artifact newStateArt = defaultStateArt.duplicate(AtsPlugin.getAtsBranch());
+ for (Attribute<?> attr : newStateArt.getAttributes(false)) {
+ if (attr instanceof StringAttribute) {
+ attr.setFromString(attr.getDisplayableString().replaceAll("osee.ats.teamWorkflow", namespace));
+ }
+ }
+ if (state == DefaultTeamState.Completed || state == DefaultTeamState.Cancelled) {
+ newStateArt.setSoleAttributeFromString(WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(),
+ "osee.ats.teamWorkflow." + state.name());
+ }
+
+ // Add same relations as default work pages to new work pages (widgets and rules)
+ for (Artifact art : defaultStateArt.getRelatedArtifacts(AtsRelation.WorkItem__Child)) {
+ newStateArt.addRelation(AtsRelation.WorkItem__Child, art);
+ }
+
+ AtsWorkDefinitions.addUpdateWorkItemToDefaultHeirarchy(newStateArt, transaction);
+ newStateArt.persistAttributesAndRelations(transaction);
+ }
+ return new WorkflowData(new WorkFlowDefinition(newWorkflowArt), newWorkflowArt);
+
+ }
+
+ public static WorkflowData generateSimpleWorkflow(String namespace, SkynetTransaction transaction, TeamDefinitionArtifact teamDef) throws OseeCoreException {
+ WorkFlowDefinition workflow = new WorkFlowDefinition(namespace, namespace, null);
+ WorkPageDefinition endorsePage =
+ new WorkPageDefinition("Endorse", namespace + ".Endorse", AtsEndorseWorkPageDefinition.ID);
+
+ workflow.setStartPageId(endorsePage.getPageName());
+
+ WorkPageDefinition implementPage = new WorkPageDefinition("Implement", namespace + ".Implement", null);
+ implementPage.addWorkItem(RuleWorkItemId.atsRequireStateHourSpentPrompt.name());
+ implementPage.addWorkItem(ATSAttributes.WORK_PACKAGE_ATTRIBUTE.getStoreName());
+ implementPage.addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+
+ WorkPageDefinition completedPage =
+ new WorkPageDefinition("Completed", namespace + ".Completed", AtsCompletedWorkPageDefinition.ID);
+
+ WorkPageDefinition cancelledPage =
+ new WorkPageDefinition("Cancelled", namespace + ".Cancelled", AtsCancelledWorkPageDefinition.ID);
+
+ workflow.addPageTransition(endorsePage.getPageName(), implementPage.getPageName(), TransitionType.ToPageAsDefault);
+ workflow.addPageTransition(implementPage.getPageName(), endorsePage.getPageName(), TransitionType.ToPageAsReturn);
+ workflow.addPageTransition(cancelledPage.getPageName(), endorsePage.getPageName(), TransitionType.ToPageAsReturn);
+ workflow.addPageTransition(implementPage.getPageName(), completedPage.getPageName(),
+ TransitionType.ToPageAsDefault);
+ workflow.addPageTransition(endorsePage.getPageName(), cancelledPage.getPageName(), TransitionType.ToPage);
+
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ artifacts.add(endorsePage.toArtifact(WriteType.New));
+ artifacts.add(implementPage.toArtifact(WriteType.New));
+ artifacts.add(completedPage.toArtifact(WriteType.New));
+ artifacts.add(cancelledPage.toArtifact(WriteType.New));
+ Artifact workflowArt = workflow.toArtifact(WriteType.New);
+ if (teamDef != null) {
+ teamDef.addRelation(AtsRelation.WorkItem__Child, workflowArt);
+ artifacts.add(teamDef);
+ }
+ artifacts.add(workflowArt);
+ workflow.loadPageData(true);
+
+ for (Artifact artifact : artifacts) {
+ AtsWorkDefinitions.addUpdateWorkItemToDefaultHeirarchy(artifact, transaction);
+ artifact.persistAttributesAndRelations(transaction);
+ }
+ return new WorkflowData(workflow, workflowArt);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/NewWorkflowConfigPage1.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/NewWorkflowConfigPage1.java
new file mode 100644
index 00000000000..dc71ccae8ca
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/editor/wizard/NewWorkflowConfigPage1.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.ats.workflow.editor.wizard;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NewWorkflowConfigPage1 extends WizardPage {
+ private WorkPage page;
+
+ /**
+ * @param actionWizard
+ */
+ public NewWorkflowConfigPage1(AtsWorkflowConfigCreationWizard actionWizard) {
+ super("Create new ATS Workflow Configuration", "Create ATS Workflow Configuration", null);
+ setMessage("Enter workflow namespace.");
+ }
+
+ private final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ getContainer().updateButtons();
+ }
+ };
+
+ public String getNamespace() {
+ return (String) getXWidget("Namespace").getData();
+ }
+
+ public String getStartingWorkflow() {
+ return (String) getXWidget("Starting Workflow").getData();
+ }
+
+ public void createControl(Composite parent) {
+
+ try {
+ String xWidgetXml =
+ "<WorkPage>" +
+ //
+ "<XWidget displayName=\"Namespace\" required=\"true\" xwidgetType=\"XText\"/>" +
+ //
+ "<XWidget displayName=\"Starting Workflow\" required=\"true\" xwidgetType=\"XCombo(Simple: Implement-Complete,Default: Analyze-Authorize-Implement-Complete)\"/>" +
+ //
+ "</WorkPage>";
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(1, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ page = new WorkPage(xWidgetXml, ATSXWidgetOptionResolver.getInstance());
+ page.createBody(null, comp, null, xModListener, true);
+
+ setControl(comp);
+ ((XText) getXWidget("Namespace")).setFocus();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public XWidget getXWidget(String attrName) {
+ if (page == null) throw new IllegalArgumentException("WorkPage == null");
+ return page.getLayoutData(attrName).getXWidget();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (!page.isPageComplete().isTrue()) return false;
+
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/DecisionWorkflowDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/DecisionWorkflowDefinition.java
new file mode 100644
index 00000000000..209b51e5698
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/DecisionWorkflowDefinition.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.ats.workflow.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightDecisionReviewRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsDecisionCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsDecisionDecisionWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsDecisionFollowupWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsDecisionPrepareWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DecisionWorkflowDefinition extends WorkFlowDefinition {
+
+ public static String ID = "osee.ats.decisionReview";
+ public static String DECISION_CANCELLED_STATE_ID = ID + "." + DefaultTeamState.Cancelled.name();
+
+ public DecisionWorkflowDefinition() {
+ super(ID, ID, null);
+ addTransitions();
+ startPageId = AtsDecisionPrepareWorkPageDefinition.ID;
+ addWorkItem(AtsStatePercentCompleteWeightDecisionReviewRule.ID);
+ }
+
+ public DecisionWorkflowDefinition(Artifact artifact) throws OseeCoreException {
+ super(artifact);
+ throw new OseeStateException("This constructor should never be used.");
+ }
+
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, getAtsWorkDefinitions());
+ }
+
+ public static List<WorkItemDefinition> getAtsWorkDefinitions() {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+
+ // Add Decision Pages and Workflow Definition
+ workItems.add(new AtsDecisionPrepareWorkPageDefinition());
+ workItems.add(new AtsDecisionDecisionWorkPageDefinition());
+ workItems.add(new AtsDecisionFollowupWorkPageDefinition());
+ workItems.add(new AtsDecisionCompletedWorkPageDefinition());
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Cancelled.name(),
+ DecisionWorkflowDefinition.DECISION_CANCELLED_STATE_ID, AtsCancelledWorkPageDefinition.ID));
+ workItems.add(new DecisionWorkflowDefinition());
+
+ return workItems;
+ }
+
+ private void addTransitions() {
+ // Add Prepare Transitions
+ addPageTransition(AtsDecisionPrepareWorkPageDefinition.ID, AtsDecisionDecisionWorkPageDefinition.ID,
+ TransitionType.ToPageAsDefault);
+ addPageTransitionToPageAndReturn(AtsDecisionPrepareWorkPageDefinition.ID, DECISION_CANCELLED_STATE_ID);
+
+ // Add Decision Transitions
+ addPageTransition(AtsDecisionDecisionWorkPageDefinition.ID, AtsDecisionCompletedWorkPageDefinition.ID,
+ TransitionType.ToPageAsDefault);
+ addPageTransition(AtsDecisionDecisionWorkPageDefinition.ID, AtsDecisionFollowupWorkPageDefinition.ID,
+ TransitionType.ToPage);
+ addPageTransition(AtsDecisionDecisionWorkPageDefinition.ID, AtsDecisionPrepareWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransitionToPageAndReturn(AtsDecisionDecisionWorkPageDefinition.ID, DECISION_CANCELLED_STATE_ID);
+
+ // Add Followup Transitions
+ addPageTransition(AtsDecisionFollowupWorkPageDefinition.ID, AtsDecisionDecisionWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(AtsDecisionFollowupWorkPageDefinition.ID, AtsDecisionCompletedWorkPageDefinition.ID,
+ TransitionType.ToPageAsDefault);
+ addPageTransitionToPageAndReturn(AtsDecisionFollowupWorkPageDefinition.ID, DECISION_CANCELLED_STATE_ID);
+
+ // Add Completed Transitions
+ addPageTransition(AtsDecisionCompletedWorkPageDefinition.ID, AtsDecisionDecisionWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(AtsDecisionCompletedWorkPageDefinition.ID, AtsDecisionFollowupWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+
+ // Add Cancelled Transitions
+ addPageTransition(DECISION_CANCELLED_STATE_ID, AtsDecisionPrepareWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(DECISION_CANCELLED_STATE_ID, AtsDecisionDecisionWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(DECISION_CANCELLED_STATE_ID, AtsDecisionFollowupWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/PeerToPeerWorkflowDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/PeerToPeerWorkflowDefinition.java
new file mode 100644
index 00000000000..cb2d6fc57be
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/PeerToPeerWorkflowDefinition.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.ats.workflow.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightPeerToPeerReviewRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsPeerPrepareWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsPeerReviewWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class PeerToPeerWorkflowDefinition extends WorkFlowDefinition {
+
+ public static String ID = "osee.ats.peerToPeerReview";
+ public static String PEER_REVIEW_COMPLETED_STATE_ID = ID + "." + DefaultTeamState.Completed.name();
+ public static String PEER_REVIEW_CANCELLED_STATE_ID = ID + "." + DefaultTeamState.Cancelled.name();
+
+ public PeerToPeerWorkflowDefinition() {
+ super(ID, ID, null);
+ addTransitions();
+ startPageId = AtsPeerPrepareWorkPageDefinition.ID;
+ addWorkItem(AtsStatePercentCompleteWeightPeerToPeerReviewRule.ID);
+ }
+
+ public PeerToPeerWorkflowDefinition(Artifact artifact) throws OseeCoreException {
+ super(artifact);
+ throw new OseeStateException("This constructor should never be used.");
+ }
+
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, getAtsWorkDefinitions());
+ }
+
+ public static List<WorkItemDefinition> getAtsWorkDefinitions() {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+
+ // Add PeerToPeer Pages and Workflow Definition
+ workItems.add(new AtsPeerPrepareWorkPageDefinition());
+ workItems.add(new AtsPeerReviewWorkPageDefinition());
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Completed.name(),
+ PeerToPeerWorkflowDefinition.PEER_REVIEW_COMPLETED_STATE_ID, AtsCompletedWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Cancelled.name(),
+ PeerToPeerWorkflowDefinition.PEER_REVIEW_CANCELLED_STATE_ID, AtsCancelledWorkPageDefinition.ID));
+ workItems.add(new PeerToPeerWorkflowDefinition());
+
+ return workItems;
+ }
+
+ private void addTransitions() {
+ // Add default transitions
+ addPageTransition(AtsPeerPrepareWorkPageDefinition.ID, AtsPeerReviewWorkPageDefinition.ID,
+ TransitionType.ToPageAsDefault);
+ addPageTransition(AtsPeerReviewWorkPageDefinition.ID, PEER_REVIEW_COMPLETED_STATE_ID,
+ TransitionType.ToPageAsDefault);
+
+ // Add return transitions
+ addPageTransition(PEER_REVIEW_COMPLETED_STATE_ID, AtsPeerReviewWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(AtsPeerReviewWorkPageDefinition.ID, AtsPeerPrepareWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(PEER_REVIEW_CANCELLED_STATE_ID, AtsPeerReviewWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+ addPageTransition(PEER_REVIEW_CANCELLED_STATE_ID, AtsPeerPrepareWorkPageDefinition.ID,
+ TransitionType.ToPageAsReturn);
+
+ // Add cancelled transitions
+ addPageTransitionToPageAndReturn(AtsPeerPrepareWorkPageDefinition.ID, PEER_REVIEW_CANCELLED_STATE_ID);
+ addPageTransitionToPageAndReturn(AtsPeerReviewWorkPageDefinition.ID, PEER_REVIEW_CANCELLED_STATE_ID);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/SimpleWorkflowDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/SimpleWorkflowDefinition.java
new file mode 100644
index 00000000000..957a5ac3868
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/SimpleWorkflowDefinition.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.ats.workflow.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightSimpleWorkflowRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsEndorseWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsSimpleInWorkWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SimpleWorkflowDefinition extends WorkFlowDefinition {
+
+ public static String ID = "osee.ats.simpleTeamWorkflow";
+ public static enum SimpleState {
+ Endorse, InWork, Completed, Cancelled
+ };
+ public static String ENDORSE_STATE_ID = ID + "." + SimpleState.Endorse.name();
+ public static String INWORK_STATE_ID = ID + "." + SimpleState.InWork.name();
+ public static String COMPLETED_STATE_ID = ID + "." + SimpleState.Completed.name();
+ public static String CANCELLED_STATE_ID = ID + "." + SimpleState.Cancelled.name();
+
+ public SimpleWorkflowDefinition(Artifact artifact) throws OseeCoreException {
+ super(artifact);
+ throw new OseeStateException("This constructor should never be used.");
+ }
+
+ public SimpleWorkflowDefinition() {
+ this(ID, ID);
+ addWorkItem(AtsStatePercentCompleteWeightSimpleWorkflowRule.ID);
+ }
+
+ /**
+ * @param name
+ * @param id
+ * @param parentId
+ */
+ public SimpleWorkflowDefinition(String name, String workflowId) {
+ super(name, workflowId, null);
+ addDefaultTransitions(this, workflowId);
+ startPageId = SimpleState.Endorse.name();
+ }
+
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, getAtsWorkDefinitions());
+ }
+
+ public static void addDefaultTransitions(WorkFlowDefinition teamWorkflowDefinition, String workflowId) {
+ teamWorkflowDefinition.addPageTransition(SimpleState.Endorse.name(), SimpleState.InWork.name(),
+ TransitionType.ToPageAsDefault);
+ teamWorkflowDefinition.addPageTransition(SimpleState.InWork.name(), SimpleState.Completed.name(),
+ TransitionType.ToPageAsDefault);
+
+ // Add return transitions
+ teamWorkflowDefinition.addPageTransition(SimpleState.InWork.name(), SimpleState.Endorse.name(),
+ TransitionType.ToPageAsReturn);
+ teamWorkflowDefinition.addPageTransition(SimpleState.Completed.name(), SimpleState.InWork.name(),
+ TransitionType.ToPageAsReturn);
+
+ // Add cancelled transitions
+ teamWorkflowDefinition.addPageTransitionToPageAndReturn(SimpleState.Endorse.name(), SimpleState.Cancelled.name());
+ teamWorkflowDefinition.addPageTransitionToPageAndReturn(SimpleState.InWork.name(), SimpleState.Cancelled.name());
+ }
+
+ public static List<WorkItemDefinition> getAtsWorkDefinitions() {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+
+ workItems.add(new WorkPageDefinition(SimpleState.Endorse.name(), SimpleWorkflowDefinition.ENDORSE_STATE_ID,
+ AtsEndorseWorkPageDefinition.ID));
+ workItems.add(new AtsSimpleInWorkWorkPageDefinition());
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Completed.name(),
+ SimpleWorkflowDefinition.COMPLETED_STATE_ID, AtsCompletedWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Cancelled.name(),
+ SimpleWorkflowDefinition.CANCELLED_STATE_ID, AtsCancelledWorkPageDefinition.ID));
+ workItems.add(new SimpleWorkflowDefinition());
+
+ return workItems;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TaskWorkflowDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TaskWorkflowDefinition.java
new file mode 100644
index 00000000000..794da64d56a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TaskWorkflowDefinition.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.artifact.TaskArtifact.TaskStates;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsTaskInWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskWorkflowDefinition extends WorkFlowDefinition {
+
+ public static String ID = "osee.ats.taskWorkflow";
+
+ public TaskWorkflowDefinition() {
+ this(ID, ID);
+ startPageId = TaskStates.InWork.name();
+ }
+
+ public TaskWorkflowDefinition(Artifact artifact) throws OseeCoreException {
+ super(artifact);
+ throw new OseeStateException("This constructor should never be used.");
+ }
+
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, getAtsWorkDefinitions());
+ }
+
+ public static List<WorkItemDefinition> getAtsWorkDefinitions() {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+
+ // Add Task Page and Workflow Definition
+ workItems.add(new AtsTaskInWorkPageDefinition());
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Completed.name(), ID + "." + TaskStates.Completed.name(),
+ AtsCompletedWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Cancelled.name(), ID + "." + TaskStates.Cancelled.name(),
+ AtsCancelledWorkPageDefinition.ID));
+ workItems.add(new TaskWorkflowDefinition());
+
+ return workItems;
+ }
+
+ /**
+ * @param name
+ * @param id
+ * @param parentId
+ */
+ public TaskWorkflowDefinition(String name, String id) {
+ super(name, id, null);
+ addPageTransition(TaskStates.InWork.name(), TaskStates.Completed.name(), TransitionType.ToPageAsDefault);
+
+ // Add return transitions
+ addPageTransition(TaskStates.Completed.name(), TaskStates.InWork.name(), TransitionType.ToPageAsReturn);
+
+ // Add cancelled transitions
+ addPageTransitionToPageAndReturn(TaskStates.InWork.name(), TaskStates.Cancelled.name());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TeamWorkflowDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TeamWorkflowDefinition.java
new file mode 100644
index 00000000000..4c9f799059e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/flow/TeamWorkflowDefinition.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.item.AtsStatePercentCompleteWeightDefaultWorkflowRule;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.page.AtsAnalyzeWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsAuthorizeWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsEndorseWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsImplementWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamWorkflowDefinition extends WorkFlowDefinition {
+
+ public static String ID = "osee.ats.teamWorkflow";
+
+ public TeamWorkflowDefinition() {
+ this(ID, ID);
+ addWorkItem(AtsStatePercentCompleteWeightDefaultWorkflowRule.ID);
+ }
+
+ public TeamWorkflowDefinition(Artifact artifact) throws OseeCoreException {
+ super(artifact);
+ throw new OseeStateException("This constructor should never be used.");
+ }
+
+ /**
+ * Instantiate workflow as inherited from parentWorkflowId. Default transitions and startPageId are not set as they
+ * will most likely come from parent.
+ *
+ * @param name
+ * @param workflowId
+ * @param parentWorkflowId
+ */
+ public TeamWorkflowDefinition(String name, String workflowId, String parentWorkflowId) {
+ super(name, workflowId, parentWorkflowId);
+ }
+
+ public void config(WriteType writeType, XResultData xResultData) throws OseeCoreException {
+ AtsWorkDefinitions.importWorkItemDefinitionsIntoDb(writeType, xResultData, getAtsWorkDefinitions());
+ }
+
+ /**
+ * Instantiate workflow as a TeamWorkflowDefinition with default transitions and startPageId set.
+ *
+ * @param name
+ * @param id
+ * @param parentId
+ */
+ public TeamWorkflowDefinition(String name, String workflowId) {
+ super(name, workflowId, null);
+ addDefaultTransitions(this, workflowId);
+ startPageId = DefaultTeamState.Endorse.name();
+ }
+
+ public static List<WorkItemDefinition> getAtsWorkDefinitions() {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+
+ // Add Team Page and Workflow Definition
+ workItems.add(new AtsEndorseWorkPageDefinition());
+ workItems.add(new AtsAnalyzeWorkPageDefinition());
+ workItems.add(new AtsAuthorizeWorkPageDefinition());
+ workItems.add(new AtsImplementWorkPageDefinition());
+ workItems.add(new AtsCompletedWorkPageDefinition());
+ workItems.add(new AtsCancelledWorkPageDefinition());
+ workItems.add(new TeamWorkflowDefinition());
+
+ return workItems;
+ }
+
+ public static List<WorkItemDefinition> getWorkPageDefinitionsForId(String workflowId) {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+ // Add Team Page and Workflow Definition
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Endorse.name(),
+ workflowId + "." + DefaultTeamState.Endorse.name(), AtsEndorseWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Analyze.name(),
+ workflowId + "." + DefaultTeamState.Analyze.name(), AtsAnalyzeWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Authorize.name(),
+ workflowId + "." + DefaultTeamState.Authorize.name(), AtsAuthorizeWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Implement.name(),
+ workflowId + "." + DefaultTeamState.Implement.name(), AtsImplementWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Completed.name(),
+ workflowId + "." + DefaultTeamState.Completed.name(), AtsCompletedWorkPageDefinition.ID));
+ workItems.add(new WorkPageDefinition(DefaultTeamState.Cancelled.name(),
+ workflowId + "." + DefaultTeamState.Cancelled.name(), AtsCancelledWorkPageDefinition.ID));
+ return workItems;
+ }
+
+ public static void addDefaultTransitions(WorkFlowDefinition teamWorkflowDefinition, String workflowId) {
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Endorse.name(), DefaultTeamState.Analyze.name(),
+ TransitionType.ToPageAsDefault);
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Analyze.name(), DefaultTeamState.Authorize.name(),
+ TransitionType.ToPageAsDefault);
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Authorize.name(), DefaultTeamState.Implement.name(),
+ TransitionType.ToPageAsDefault);
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Implement.name(), DefaultTeamState.Completed.name(),
+ TransitionType.ToPageAsDefault);
+
+ // Add return transitions
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Authorize.name(), DefaultTeamState.Analyze.name(),
+ TransitionType.ToPageAsReturn);
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Implement.name(), DefaultTeamState.Analyze.name(),
+ TransitionType.ToPageAsReturn);
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Implement.name(), DefaultTeamState.Authorize.name(),
+ TransitionType.ToPageAsReturn);
+ teamWorkflowDefinition.addPageTransition(DefaultTeamState.Completed.name(), DefaultTeamState.Implement.name(),
+ TransitionType.ToPageAsReturn);
+
+ // Add cancelled transitions
+ teamWorkflowDefinition.addPageTransitionToPageAndReturn(DefaultTeamState.Endorse.name(),
+ DefaultTeamState.Cancelled.name());
+ teamWorkflowDefinition.addPageTransitionToPageAndReturn(DefaultTeamState.Analyze.name(),
+ DefaultTeamState.Cancelled.name());
+ teamWorkflowDefinition.addPageTransitionToPageAndReturn(DefaultTeamState.Authorize.name(),
+ DefaultTeamState.Cancelled.name());
+ teamWorkflowDefinition.addPageTransitionToPageAndReturn(DefaultTeamState.Implement.name(),
+ DefaultTeamState.Cancelled.name());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddDecisionReviewRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddDecisionReviewRule.java
new file mode 100644
index 00000000000..413e7e5acf6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddDecisionReviewRule.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.ats.workflow.item;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.UsersByIds;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAddDecisionReviewRule extends WorkRuleDefinition {
+
+ public static String ID = "atsAddDecisionReview";
+ public static enum DecisionParameter {
+ title, forState, forEvent, reviewBlockingType, assignees, options, description
+ };
+
+ public static enum DecisionRuleOption {
+ None, TransitionToDecision
+ }
+
+ public AtsAddDecisionReviewRule() {
+ this(ID, ID);
+ }
+
+ public AtsAddDecisionReviewRule(String name, String id) {
+ super(name, id);
+ setDescription("Work Page and Team Definition Option: Decision Review will be auto-created based on WorkData attribute values.");
+ setDecisionParameterValue(this, DecisionParameter.title, "Enter Title Here");
+ setDecisionParameterValue(this, DecisionParameter.reviewBlockingType, "Transition");
+ setDecisionParameterValue(this, DecisionParameter.forState, "Implement");
+ setDecisionParameterValue(this, DecisionParameter.forEvent, StateEventType.TransitionTo.name());
+ try {
+ setDecisionParameterValue(this, DecisionParameter.assignees, "<99999997>");
+ setDecisionParameterValue(this, DecisionParameter.options, "Completed;Completed;");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static void setDecisionParameterValue(WorkRuleDefinition workRuleDefinition, DecisionParameter decisionParameter, String value) {
+ workRuleDefinition.addWorkDataKeyValue(decisionParameter.name(), value);
+ }
+
+ public static String getDecisionParameterValue(WorkRuleDefinition workRuleDefinition, DecisionParameter decisionParameter) {
+ return workRuleDefinition.getWorkDataValue(decisionParameter.name());
+ }
+
+ /**
+ * Creates decision review if one of same name doesn't already exist
+ *
+ * @param atsAddDecisionReviewRule
+ * @param smaMgr
+ * @return DecisionReviewArtifact
+ * @throws OseeCoreException
+ */
+ public static DecisionReviewArtifact createNewDecisionReview(WorkRuleDefinition atsAddDecisionReviewRule, SkynetTransaction transaction, SMAManager smaMgr, DecisionRuleOption... decisionRuleOption) throws OseeCoreException {
+ if (!atsAddDecisionReviewRule.getId().startsWith(AtsAddDecisionReviewRule.ID)) {
+ throw new IllegalArgumentException("WorkRuleDefinition must be AtsAddDecisionReviewRule.ID");
+ }
+ String title = getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.title);
+ if (Artifacts.artNames(smaMgr.getReviewManager().getReviews()).contains(title)) {
+ // Already created this review
+ return null;
+ }
+ DecisionReviewArtifact decArt = null;
+ if (Collections.getAggregate(decisionRuleOption).contains(DecisionRuleOption.TransitionToDecision)) {
+ decArt =
+ smaMgr.getReviewManager().createNewDecisionReviewAndTransitionToDecision(title,
+ getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.description),
+ getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.forState),
+ getReviewBlockTypeOrDefault(smaMgr, atsAddDecisionReviewRule),
+ getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.options),
+ getAssigneesOrDefault(smaMgr, atsAddDecisionReviewRule), transaction);
+ } else {
+ decArt =
+ smaMgr.getReviewManager().createNewDecisionReview(title,
+ getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.description),
+ getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.forState),
+ getReviewBlockTypeOrDefault(smaMgr, atsAddDecisionReviewRule),
+ getValueOrDefault(smaMgr, atsAddDecisionReviewRule, DecisionParameter.options),
+ getAssigneesOrDefault(smaMgr, atsAddDecisionReviewRule), transaction);
+ }
+
+ decArt.getSmaMgr().getLog().addLog(LogType.Note, null,
+ "Review auto-generated off rule " + atsAddDecisionReviewRule.getId());
+ return decArt;
+ }
+
+ public static ReviewBlockType getReviewBlockTypeOrDefault(SMAManager smaMgr, WorkRuleDefinition workRuleDefinition) {
+ String value = getDecisionParameterValue(workRuleDefinition, DecisionParameter.reviewBlockingType);
+ if (value == null || value.equals("")) {
+ return null;
+ }
+ return ReviewBlockType.valueOf(value);
+ }
+
+ public static StateEventType getStateEventType(SMAManager smaMgr, WorkRuleDefinition workRuleDefinition) {
+ String value = getDecisionParameterValue(workRuleDefinition, DecisionParameter.forEvent);
+ if (value == null || value.equals("")) {
+ return null;
+ }
+ return StateEventType.valueOf(value);
+ }
+
+ private static String getValueOrDefault(SMAManager smaMgr, WorkRuleDefinition workRuleDefinition, DecisionParameter decisionParameter) throws OseeCoreException {
+ String value = getDecisionParameterValue(workRuleDefinition, decisionParameter);
+ if (value == null || value.equals("")) {
+ if (decisionParameter == DecisionParameter.title) {
+ return "Decide on \"" + smaMgr.getSma().getDescriptiveName() + "\"";
+ } else if (decisionParameter == DecisionParameter.options) {
+ return "Yes;Followup;<" + UserManager.getUser().getUserId() + ">\n" + "No;Completed;";
+ } else if (decisionParameter == DecisionParameter.description) {
+ return null;
+ } else if (decisionParameter == DecisionParameter.forState) {
+ return smaMgr.getStateMgr().getCurrentStateName();
+ }
+ }
+ return value;
+ }
+
+ public static Collection<User> getAssigneesOrDefault(SMAManager smaMgr, WorkRuleDefinition workRuleDefinition) throws OseeCoreException {
+ String value = getDecisionParameterValue(workRuleDefinition, DecisionParameter.assignees);
+ if (value == null || value.equals("")) {
+ return Arrays.asList(new User[] {UserManager.getUser()});
+ }
+ Collection<User> users = UsersByIds.getUsers(value);
+ if (users.size() == 0) {
+ users.add(UserManager.getUser());
+ }
+ return users;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddPeerToPeerReviewRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddPeerToPeerReviewRule.java
new file mode 100644
index 00000000000..c0b855ba2d2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAddPeerToPeerReviewRule.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.ats.workflow.item;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact.ReviewBlockType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.widgets.ReviewManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAddPeerToPeerReviewRule extends WorkRuleDefinition {
+
+ public static String ID = "atsAddPeerToPeerReview";
+ public static enum PeerToPeerParameter {
+ title, forState, reviewBlockingType, assignees, location, description
+ };
+
+ public AtsAddPeerToPeerReviewRule() {
+ super(ID, ID);
+ setDescription("Work Page and Team Definition Option: PeerToPeer Review will be auto-created based on WorkData attribute values.");
+ setPeerToPeerParameterValue(this, PeerToPeerParameter.reviewBlockingType, "Transition");
+ setPeerToPeerParameterValue(this, PeerToPeerParameter.forState, "Implement");
+ try {
+ setPeerToPeerParameterValue(this, PeerToPeerParameter.assignees, "<99999997>");
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static void setPeerToPeerParameterValue(WorkRuleDefinition workRuleDefinition, PeerToPeerParameter decisionParameter, String value) {
+ workRuleDefinition.addWorkDataKeyValue(decisionParameter.name(), value);
+ }
+
+ public static String getPeerToPeerParameterValue(WorkRuleDefinition workRuleDefinition, PeerToPeerParameter decisionParameter) {
+ return workRuleDefinition.getWorkDataValue(decisionParameter.name());
+ }
+
+ /**
+ * Creates PeerToPeer review if one of same name doesn't already exist
+ *
+ * @param atsAddPeerToPeerReviewRule
+ * @param smaMgr
+ * @param transaction
+ * @return review
+ * @throws OseeCoreException
+ */
+ public static PeerToPeerReviewArtifact createNewPeerToPeerReview(WorkRuleDefinition atsAddPeerToPeerReviewRule, SMAManager smaMgr, SkynetTransaction transaction) throws OseeCoreException {
+ if (!atsAddPeerToPeerReviewRule.getId().startsWith(AtsAddPeerToPeerReviewRule.ID)) {
+ throw new IllegalArgumentException("WorkRuleDefinition must be AtsAddPeerToPeerReviewRule.ID");
+ }
+ String title = getValueOrDefault(smaMgr, atsAddPeerToPeerReviewRule, PeerToPeerParameter.title);
+ if (Artifacts.artNames(smaMgr.getReviewManager().getReviews()).contains(title)) {
+ // Already created this review
+ return null;
+ }
+ PeerToPeerReviewArtifact peerArt =
+ ReviewManager.createNewPeerToPeerReview(smaMgr.getSma(), title, getValueOrDefault(smaMgr,
+ atsAddPeerToPeerReviewRule, PeerToPeerParameter.forState), UserManager.getUser(), new Date(), transaction);
+ String desc = getValueOrDefault(smaMgr, atsAddPeerToPeerReviewRule, PeerToPeerParameter.description);
+ if (desc != null && !desc.equals("")) {
+ peerArt.setSoleAttributeFromString(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), desc);
+ }
+ ReviewBlockType reviewBlockType =
+ AtsAddDecisionReviewRule.getReviewBlockTypeOrDefault(smaMgr, atsAddPeerToPeerReviewRule);
+ if (reviewBlockType != null) {
+ peerArt.setSoleAttributeFromString(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getStoreName(),
+ reviewBlockType.name());
+ }
+ String location = getValueOrDefault(smaMgr, atsAddPeerToPeerReviewRule, PeerToPeerParameter.location);
+ if (location != null && location.equals("")) {
+ peerArt.setSoleAttributeFromString(ATSAttributes.LOCATION_ATTRIBUTE.getStoreName(), location);
+ }
+ Collection<User> assignees = AtsAddDecisionReviewRule.getAssigneesOrDefault(smaMgr, atsAddPeerToPeerReviewRule);
+ if (assignees.size() > 0) {
+ peerArt.getSmaMgr().getStateMgr().setAssignees(assignees);
+ }
+ peerArt.getSmaMgr().getLog().addLog(LogType.Note, null,
+ "Review auto-generated off rule " + atsAddPeerToPeerReviewRule.getId());
+ return peerArt;
+ }
+
+ private static String getValueOrDefault(SMAManager smaMgr, WorkRuleDefinition workRuleDefinition, PeerToPeerParameter peerToPeerParameter) throws OseeCoreException {
+ String value = getPeerToPeerParameterValue(workRuleDefinition, peerToPeerParameter);
+ if (value == null || value.equals("")) {
+ if (peerToPeerParameter == PeerToPeerParameter.title) {
+ return PeerToPeerReviewArtifact.getDefaultReviewTitle(smaMgr);
+ } else if (peerToPeerParameter == PeerToPeerParameter.forState) {
+ return smaMgr.getStateMgr().getCurrentStateName();
+ } else if (peerToPeerParameter == PeerToPeerParameter.location) {
+ return null;
+ }
+ }
+ return value;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewDefectXWidgetWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewDefectXWidgetWorkItem.java
new file mode 100644
index 00000000000..93ef98c999f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewDefectXWidgetWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAttributeReviewDefectXWidgetWorkItem extends WorkWidgetDefinition {
+
+ protected AtsAttributeReviewDefectXWidgetWorkItem(ATSAttributes atsAttribute) {
+ super(atsAttribute.getDisplayName() + " - " + atsAttribute.getStoreName(), atsAttribute.getStoreName());
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(getName());
+ data.setStorageName(getId());
+ data.setXWidgetName("XDefectViewer");
+ set(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewRolesXWidgetWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewRolesXWidgetWorkItem.java
new file mode 100644
index 00000000000..0185c303c98
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeReviewRolesXWidgetWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAttributeReviewRolesXWidgetWorkItem extends WorkWidgetDefinition {
+
+ protected AtsAttributeReviewRolesXWidgetWorkItem(ATSAttributes atsAttribute) {
+ super(atsAttribute.getDisplayName() + " - " + atsAttribute.getStoreName(), atsAttribute.getStoreName());
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(getName());
+ data.setStorageName(getId());
+ data.getXOptionHandler().add(XOption.REQUIRED);
+ data.setXWidgetName("XUserRoleViewer");
+ set(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeSoleComboXWidgetWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeSoleComboXWidgetWorkItem.java
new file mode 100644
index 00000000000..0ba4b2e2a86
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeSoleComboXWidgetWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAttributeSoleComboXWidgetWorkItem extends WorkWidgetDefinition {
+
+ public AtsAttributeSoleComboXWidgetWorkItem(ATSAttributes atsAttribute, String commaOptions, XOption... xOption) {
+ super(atsAttribute.getDisplayName() + " - " + atsAttribute.getStoreName(), atsAttribute.getStoreName());
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(getName());
+ data.setStorageName(getId());
+ data.setXWidgetName("XComboDam(" + commaOptions + ")");
+ data.getXOptionHandler().add(xOption);
+ set(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeXWidgetWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeXWidgetWorkItem.java
new file mode 100644
index 00000000000..e9e0939cabb
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsAttributeXWidgetWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAttributeXWidgetWorkItem extends WorkWidgetDefinition {
+
+ public AtsAttributeXWidgetWorkItem(String name, String id, String attributeTypeName, String xWidgetName, XOption... xOption) {
+ super(name + " - " + id, id);
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(name);
+ data.setId(id);
+ data.setStorageName(attributeTypeName);
+ data.setXWidgetName(xWidgetName);
+ data.getXOptionHandler().add(xOption);
+ set(data);
+ }
+
+ public AtsAttributeXWidgetWorkItem(ATSAttributes atsAttribute, String xWidgetName, XOption... xOption) {
+ this(atsAttribute.getDisplayName(), atsAttribute.getStoreName(), atsAttribute.getStoreName(), xWidgetName,
+ xOption);
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ DynamicXWidgetLayoutData data = get();
+ data.setDefaultValue(defaultValue);
+ set(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancellationReasonStateWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancellationReasonStateWorkItem.java
new file mode 100644
index 00000000000..a7de34ae4cd
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancellationReasonStateWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsCancellationReasonStateWorkItem extends WorkWidgetDefinition {
+
+ protected AtsCancellationReasonStateWorkItem(SMAManager smaMgr) throws OseeCoreException {
+ super("Cancellation Reason", "ats.CancellationReason");
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(getName());
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ data.setDefaultValue(item.getMsg());
+ data.setStorageName(getId());
+ data.setXWidgetName("XText");
+ data.getXOptionHandler().add(XOption.NOT_EDITABLE);
+ data.getXOptionHandler().add(XOption.FILL_HORIZONTALLY);
+ setXWidgetLayoutData(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancelledFromStateWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancelledFromStateWorkItem.java
new file mode 100644
index 00000000000..2f6b1f88c64
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCancelledFromStateWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsCancelledFromStateWorkItem extends WorkWidgetDefinition {
+
+ protected AtsCancelledFromStateWorkItem(SMAManager smaMgr) throws OseeCoreException {
+ super("Cancelled from State", "ats.CancelledFromState");
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(getName());
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateCancelled);
+ data.setDefaultValue(item.getState());
+ data.setStorageName(getId());
+ data.setXWidgetName("XText");
+ data.getXOptionHandler().add(XOption.NOT_EDITABLE);
+ data.getXOptionHandler().add(XOption.FILL_HORIZONTALLY);
+ setXWidgetLayoutData(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCompletedFromStateWorkItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCompletedFromStateWorkItem.java
new file mode 100644
index 00000000000..9c95b3557d6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsCompletedFromStateWorkItem.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.LogItem;
+import org.eclipse.osee.ats.artifact.ATSLog.LogType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsCompletedFromStateWorkItem extends WorkWidgetDefinition {
+
+ protected AtsCompletedFromStateWorkItem(SMAManager smaMgr) throws OseeCoreException {
+ super("Completed from State", "ats.CompletedFromState");
+ DynamicXWidgetLayoutData data = new DynamicXWidgetLayoutData(null);
+ data.setName(getName());
+ LogItem item = smaMgr.getLog().getStateEvent(LogType.StateComplete);
+ data.setDefaultValue(item.getState());
+ data.setStorageName(getId());
+ data.setXWidgetName("XText");
+ data.getXOptionHandler().add(XOption.NOT_EDITABLE);
+ data.getXOptionHandler().add(XOption.FILL_HORIZONTALLY);
+ setXWidgetLayoutData(data);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDecisionReviewRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDecisionReviewRule.java
new file mode 100644
index 00000000000..2261791b314
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDecisionReviewRule.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact.DecisionReviewState;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsStatePercentCompleteWeightDecisionReviewRule extends AtsStatePercentCompleteWeightRule {
+
+ public static String ID = "atsStatePercentCompleteWeight.DecisionReview";
+
+ public AtsStatePercentCompleteWeightDecisionReviewRule() {
+ super(ID, ID);
+ setDescription("State Percent Complete rule for Decision Review.");
+ addWorkDataKeyValue(DecisionReviewState.Prepare.name(), ".20");
+ addWorkDataKeyValue(DecisionReviewState.Decision.name(), ".69");
+ addWorkDataKeyValue(DecisionReviewState.Followup.name(), ".09");
+ addWorkDataKeyValue(DecisionReviewState.Completed.name(), ".01");
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDefaultWorkflowRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDefaultWorkflowRule.java
new file mode 100644
index 00000000000..8d70459524e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightDefaultWorkflowRule.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsStatePercentCompleteWeightDefaultWorkflowRule extends AtsStatePercentCompleteWeightRule {
+
+ public static String ID = "atsStatePercentCompleteWeight.DefaultWorkflow";
+
+ public AtsStatePercentCompleteWeightDefaultWorkflowRule() {
+ super(ID, ID);
+ setDescription("State Percent Complete rule where Analyze and Implement states are where work is performed.");
+ addWorkDataKeyValue(DefaultTeamState.Endorse.name(), ".05");
+ addWorkDataKeyValue(DefaultTeamState.Analyze.name(), ".1");
+ addWorkDataKeyValue(DefaultTeamState.Authorize.name(), ".05");
+ addWorkDataKeyValue(DefaultTeamState.Implement.name(), ".79");
+ addWorkDataKeyValue(DefaultTeamState.Completed.name(), ".01");
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightPeerToPeerReviewRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightPeerToPeerReviewRule.java
new file mode 100644
index 00000000000..23ebb1d4e25
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightPeerToPeerReviewRule.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact.PeerToPeerReviewState;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsStatePercentCompleteWeightPeerToPeerReviewRule extends AtsStatePercentCompleteWeightRule {
+
+ public static String ID = "atsStatePercentCompleteWeight.PeerToPeerReview";
+
+ public AtsStatePercentCompleteWeightPeerToPeerReviewRule() {
+ super(ID, ID);
+ setDescription("State Percent Complete rule for PeerToPeer Review.");
+ addWorkDataKeyValue(PeerToPeerReviewState.Prepare.name(), ".20");
+ addWorkDataKeyValue(PeerToPeerReviewState.Review.name(), ".79");
+ addWorkDataKeyValue(PeerToPeerReviewState.Completed.name(), ".01");
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightRule.java
new file mode 100644
index 00000000000..256df84a0f6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightRule.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.ats.workflow.item;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsStatePercentCompleteWeightRule extends WorkRuleDefinition {
+
+ public static String ID = "atsStatePercentCompleteWeight";
+
+ public AtsStatePercentCompleteWeightRule() {
+ this(ID, ID);
+ }
+
+ public AtsStatePercentCompleteWeightRule(String name, String id) {
+ super(name, id);
+ setDescription("Work Flow Option: <state>=<percent> Work Data attributes specify weighting given to each state in percent complete calculations. <state> is either state name (not id) and <percent> is number from 0..1");
+ }
+
+ public static Map<String, Double> getStateWeightMap(WorkRuleDefinition workRuleDefinition) throws OseeCoreException {
+ Map<String, Double> stateToWeight = new HashMap<String, Double>();
+ for (String stateName : workRuleDefinition.getWorkDataKeyValueMap().keySet()) {
+ String value = workRuleDefinition.getWorkDataValue(stateName);
+ try {
+ double percent = new Double(value).doubleValue();
+ if (percent < 0.0 || percent > 1) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE,
+ "Invalid percent value \"" + value + "\" (must be 0..1) for rule " + workRuleDefinition.getId(),
+ new IllegalArgumentException());
+ } else {
+ stateToWeight.put(stateName, percent);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(
+ AtsPlugin.class,
+ Level.SEVERE,
+ "Invalid percent value \"" + value + "\" (must be float 0..1) for rule " + workRuleDefinition.getId(),
+ new IllegalArgumentException());
+ }
+ }
+ return stateToWeight;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightSimpleWorkflowRule.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightSimpleWorkflowRule.java
new file mode 100644
index 00000000000..55e8fbdc42c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsStatePercentCompleteWeightSimpleWorkflowRule.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.ats.workflow.item;
+
+import org.eclipse.osee.ats.workflow.flow.SimpleWorkflowDefinition.SimpleState;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsStatePercentCompleteWeightSimpleWorkflowRule extends AtsStatePercentCompleteWeightRule {
+
+ public static String ID = "atsStatePercentCompleteWeight.SimpleWorkflow";
+
+ public AtsStatePercentCompleteWeightSimpleWorkflowRule() {
+ super(ID, ID);
+ setDescription("State Percent Complete rule where InWork work is performed.");
+ addWorkDataKeyValue(SimpleState.Endorse.name(), ".10");
+ addWorkDataKeyValue(SimpleState.InWork.name(), ".89");
+ addWorkDataKeyValue(SimpleState.Completed.name(), ".01");
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsWorkDefinitions.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsWorkDefinitions.java
new file mode 100644
index 00000000000..3605ed2a9b3
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/AtsWorkDefinitions.java
@@ -0,0 +1,327 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.workflow.item;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.config.AtsConfig;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.XWorkingBranch;
+import org.eclipse.osee.ats.util.widgets.commit.XCommitManager;
+import org.eclipse.osee.ats.workflow.flow.DecisionWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.PeerToPeerWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.TaskWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCancelledWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsCompletedWorkPageDefinition;
+import org.eclipse.osee.ats.workflow.page.AtsDecisionDecisionWorkPageDefinition;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IWorkDefinitionProvider;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinitionFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.XWidgetFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+
+/**
+ * Create all the default ATS work items. This keeps from having to create a class for each of these. Also implement
+ * WorkDefinitionProvider which registers all definitions with the definitions factory
+ *
+ * @author Donald G. Dunne
+ */
+public class AtsWorkDefinitions implements IWorkDefinitionProvider {
+
+ public static String ATS_TITLE_ID = "ats.Title";
+ public static String ATS_DESCRIPTION_NOT_REQUIRED_ID =
+ ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName() + ".notRequired";
+ public static enum RuleWorkItemId {
+ atsRequireStateHourSpentPrompt("Work Page Option: Will popup a dialog to prompt user for time spent in this state."),
+ atsAddDecisionValidateBlockingReview("Work Page Option: Will auto-create a blocking decision review for this state requesting validation for this workflow."),
+ atsAddDecisionValidateNonBlockingReview("Work Page Option: Will auto-create a non blocking decision review requesting validation of workflow changes."),
+ atsAllowTransitionWithWorkingBranch("Work Page Option: Will allow transition to next state without committing current working branch."),
+ atsForceAssigneesToTeamLeads("Work Page Option: Will force this state to be assigned back to the configured team leads. Useful for authorization state."),
+ atsRequireTargetedVersion("Work Page and Team Definition Option: Requires workflow to be targeted for version before transition is allowed."),
+ atsAllowPriviledgedEditToTeamMember("Work Page and Team Definition Option: Allow team member to priviledged edit workflow assigned to team."),
+ atsAllowPriviledgedEditToTeamMemberAndOriginator("Work Page and Team Definition Option: Allow team member to priviledged edit workflow assigned to team if user is originator."),
+ atsAllowPriviledgedEditToAll("Work Page and Team Definition Option: Allow anyone to priviledged edit workflow assigned to team."),
+ atsAllowEditToAll("Work Page and Team Definition Option: Allow anyone to edit workflow.");
+
+ public final String description;
+
+ public String getDescription() {
+ return description;
+ }
+
+ private RuleWorkItemId(String description) {
+ this.description = description;
+ }
+ }
+
+ public static void relatePageToBranchCommitRules(String pageId) throws OseeCoreException {
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(pageId, XWorkingBranch.WIDGET_ID);
+ WorkItemDefinitionFactory.relateWorkItemDefinitions(pageId, XCommitManager.WIDGET_ID);
+ }
+
+ public static List<WorkItemDefinition> getAtsWorkDefinitions() {
+ List<WorkItemDefinition> workItems = new ArrayList<WorkItemDefinition>();
+
+ // Create rule work items
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsRequireStateHourSpentPrompt.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAddDecisionValidateBlockingReview.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAddDecisionValidateNonBlockingReview.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAllowTransitionWithWorkingBranch.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsForceAssigneesToTeamLeads.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsRequireTargetedVersion.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAllowPriviledgedEditToTeamMember.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAllowPriviledgedEditToTeamMemberAndOriginator.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAllowPriviledgedEditToAll.name()));
+ workItems.add(new WorkRuleDefinition(RuleWorkItemId.atsAllowEditToAll.name()));
+ workItems.add(new AtsAddDecisionReviewRule());
+ workItems.add(new AtsAddPeerToPeerReviewRule());
+ workItems.add(new AtsStatePercentCompleteWeightRule());
+ workItems.add(new AtsStatePercentCompleteWeightDefaultWorkflowRule());
+ workItems.add(new AtsStatePercentCompleteWeightSimpleWorkflowRule());
+ workItems.add(new AtsStatePercentCompleteWeightDecisionReviewRule());
+ workItems.add(new AtsStatePercentCompleteWeightPeerToPeerReviewRule());
+
+ // Create XWidget work items
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.LOCATION_ATTRIBUTE, "XTextDam", XOption.REQUIRED,
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE, "XTextDam"));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.CATEGORY_ATTRIBUTE, "XTextDam"));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE, "XTextDam"));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.SMA_NOTE_ATTRIBUTE, "XTextDam",
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem("Title", "ats.Title", "Name", "XTextDam", XOption.REQUIRED));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE, "XTextDam",
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE, "XTextDam",
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.PROBLEM_ATTRIBUTE, "XTextDam",
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.WORK_PACKAGE_ATTRIBUTE, "XTextDam",
+ XOption.HORIZONTAL_LABEL));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.WORKING_BRANCH_WIDGET, "XWorkingBranch", XOption.NONE));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.VALIDATE_REQ_CHANGES_WIDGET,
+ "XValidateReqChangesButton", XOption.NONE));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.CREATE_CODE_TEST_TASKS_OFF_REQUIREMENTS,
+ "XCreateCodeTestTasksButton", XOption.NONE));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.CHECK_SIGNALS_VIA_CDB_WIDGET,
+ "XCheckSiganlsViaCDBButton", XOption.NONE));
+ workItems.add(new AtsAttributeXWidgetWorkItem("Question",
+ AtsDecisionDecisionWorkPageDefinition.DECISION_QUESTION_LABEL, "Name", "XLabelDam"));
+ workItems.add(new AtsAttributeXWidgetWorkItem("Decision",
+ AtsDecisionDecisionWorkPageDefinition.DECISION_ANSWER_LABEL,
+ ATSAttributes.DECISION_ATTRIBUTE.getStoreName(), "XLabelDam"));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.PROPOSED_RESOLUTION_ATTRIBUTE, "XTextDam",
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.DESCRIPTION_ATTRIBUTE, "XTextDam", XOption.REQUIRED,
+ XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.DESCRIPTION_ATTRIBUTE.getDisplayName(),
+ ATS_DESCRIPTION_NOT_REQUIRED_ID, ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName(), "XTextDam",
+ XOption.NOT_REQUIRED, XOption.FILL_VERTICALLY));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.BLOCKING_REVIEW_ATTRIBUTE, "XComboBooleanDam",
+ XOption.REQUIRED, XOption.HORIZONTAL_LABEL));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE,
+ "XComboDam(OPTIONS_FROM_ATTRIBUTE_VALIDITY)", XOption.REQUIRED, XOption.HORIZONTAL_LABEL));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.DECISION_ATTRIBUTE, "XComboDam(1,2,3)",
+ XOption.REQUIRED, XOption.HORIZONTAL_LABEL));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE, "XFloatDam",
+ XOption.REQUIRED));
+ workItems.add(new AtsAttributeSoleComboXWidgetWorkItem(ATSAttributes.CHANGE_TYPE_ATTRIBUTE,
+ "OPTIONS_FROM_ATTRIBUTE_VALIDITY", XOption.REQUIRED, XOption.BEGIN_COMPOSITE_6));
+ workItems.add(new AtsAttributeSoleComboXWidgetWorkItem(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE,
+ "OPTIONS_FROM_ATTRIBUTE_VALIDITY", XOption.REQUIRED));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.DEADLINE_ATTRIBUTE, "XDateDam",
+ XOption.HORIZONTAL_LABEL, XOption.END_COMPOSITE));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE, "XCheckBoxDam",
+ XOption.HORIZONTAL_LABEL, XOption.LABEL_BEFORE));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.USER_COMMUNITY_ATTRIBUTE,
+ "XListDam(OPTIONS_FROM_ATTRIBUTE_VALIDITY)", XOption.HORIZONTAL_LABEL, XOption.REQUIRED));
+ workItems.add(new AtsAttributeXWidgetWorkItem(ATSAttributes.COMMIT_MANAGER_WIDGET, "XCommitManager"));
+ workItems.add(new AtsAttributeReviewDefectXWidgetWorkItem(ATSAttributes.REVIEW_DEFECT_ATTRIBUTE));
+ workItems.add(new AtsAttributeReviewRolesXWidgetWorkItem(ATSAttributes.ROLE_ATTRIBUTE));
+
+ return workItems;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IWorkDefinitionProvider#getDynamicWorkItemDefinitionsForPage()
+ */
+ @Override
+ public Collection<WorkItemDefinition> getDynamicWorkItemDefinitionsForPage(WorkFlowDefinition workFlowDefinition, WorkPageDefinition workPageDefinition, Object data) throws OseeCoreException {
+ List<WorkItemDefinition> defs = new ArrayList<WorkItemDefinition>();
+ if (data instanceof SMAManager) {
+ SMAManager smaMgr = (SMAManager) data;
+ if (workPageDefinition.isInstanceOfPage(AtsCancelledWorkPageDefinition.ID)) {
+ defs.add(new AtsCancelledFromStateWorkItem(smaMgr));
+ defs.add(new AtsCancellationReasonStateWorkItem(smaMgr));
+ }
+ if (workPageDefinition.isInstanceOfPage(AtsCompletedWorkPageDefinition.ID)) {
+ defs.add(new AtsCompletedFromStateWorkItem(smaMgr));
+ }
+ }
+ return defs;
+ }
+
+ @Override
+ public Collection<WorkItemDefinition> getProgramaticWorkItemDefinitions() throws OseeCoreException {
+ return new ArrayList<WorkItemDefinition>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IWorkDefinitionProvider#getWorkFlowDefinition(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public WorkFlowDefinition getWorkFlowDefinition(Artifact artifact) throws OseeCoreException {
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ // return (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(TeamWorkflowDefinition.ID);
+ return ((TeamWorkFlowArtifact) artifact).getTeamDefinition().getWorkFlowDefinition();
+ }
+ if (artifact instanceof TaskArtifact) return (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(TaskWorkflowDefinition.ID);
+ if (artifact instanceof PeerToPeerReviewArtifact) return (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(PeerToPeerWorkflowDefinition.ID);
+ if (artifact instanceof DecisionReviewArtifact) return (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(DecisionWorkflowDefinition.ID);
+ return null;
+ }
+
+ public static boolean isValidatePage(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ if (workPageDefinition.getWorkItemDefinition(AtsWorkDefinitions.RuleWorkItemId.atsAddDecisionValidateBlockingReview.name()) != null) return true;
+ if (workPageDefinition.getWorkItemDefinition(AtsWorkDefinitions.RuleWorkItemId.atsAddDecisionValidateNonBlockingReview.name()) != null) return true;
+ return false;
+ }
+
+ public static boolean isValidateReviewBlocking(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return (workPageDefinition.getWorkItemDefinition(AtsWorkDefinitions.RuleWorkItemId.atsAddDecisionValidateBlockingReview.name()) != null);
+ }
+
+ public static boolean isForceAssigneesToTeamLeads(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return (workPageDefinition.getWorkItemDefinition(AtsWorkDefinitions.RuleWorkItemId.atsForceAssigneesToTeamLeads.name()) != null);
+ }
+
+ public static boolean isAllowTransitionWithWorkingBranch(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return (workPageDefinition.getWorkItemDefinition(AtsWorkDefinitions.RuleWorkItemId.atsAllowTransitionWithWorkingBranch.name()) != null);
+ }
+
+ public static boolean isRequireStateHoursSpentPrompt(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return (workPageDefinition.getWorkItemDefinition(AtsWorkDefinitions.RuleWorkItemId.atsRequireStateHourSpentPrompt.name()) != null);
+ }
+
+ public static boolean isAllowCreateBranch(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return (workPageDefinition.getWorkItemDefinition(ATSAttributes.WORKING_BRANCH_WIDGET.getStoreName()) != null);
+ }
+
+ public static boolean isAllowCommitBranch(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return (workPageDefinition.getWorkItemDefinition(ATSAttributes.COMMIT_MANAGER_WIDGET.getStoreName()) != null);
+ }
+
+ public static void importWorkItemDefinitionsIntoDb(WriteType writeType, XResultData resultData, WorkItemDefinition workItemDefinition) throws OseeCoreException {
+ importWorkItemDefinitionsIntoDb(writeType, resultData,
+ Arrays.asList(new WorkItemDefinition[] {workItemDefinition}));
+ }
+
+ public static void importWorkItemDefinitionsIntoDb(final WriteType writeType, final XResultData resultData, final Collection<? extends WorkItemDefinition> workItemDefinitions) throws OseeCoreException {
+
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Items must be imported in order due to the relations that are created between items
+ for (Class<?> clazz : new Class[] {WorkRuleDefinition.class, WorkWidgetDefinition.class,
+ WorkPageDefinition.class, WorkFlowDefinition.class}) {
+ for (WorkItemDefinition wid : workItemDefinitions) {
+ if (clazz.isInstance(wid)) {
+ // System.out.println("Adding " + wid.getId() + " as class " + clazz);
+ Artifact art = wid.toArtifact(writeType);
+ addUpdateWorkItemToDefaultHeirarchy(art, transaction);
+ if (art.isDirty(true) && resultData != null) {
+ resultData.log("Updated [" + art.getArtifactTypeName() + "][" + art + "]");
+ }
+ art.persistAttributesAndRelations(transaction);
+ }
+ }
+ }
+ transaction.execute();
+ }
+
+ public static void addUpdateWorkItemToDefaultHeirarchy(Artifact art, SkynetTransaction transaction) throws OseeCoreException {
+ // Relate if not already related
+ if (art.getRelatedArtifacts(AtsRelation.WorkItem__Parent, Artifact.class).size() == 0) {
+ if (art.getArtifactTypeName().equals(WorkPageDefinition.ARTIFACT_NAME)) {
+ relateIfNotRelated(AtsConfig.getInstance().getOrCreateWorkPagesFolderArtifact(transaction), art,
+ transaction);
+ }
+ if (art.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ relateIfNotRelated(AtsConfig.getInstance().getOrCreateWorkRulesFolderArtifact(transaction), art,
+ transaction);
+ }
+ if (art.getArtifactTypeName().equals(WorkWidgetDefinition.ARTIFACT_NAME)) {
+ relateIfNotRelated(AtsConfig.getInstance().getOrCreateWorkWidgetsFolderArtifact(transaction), art,
+ transaction);
+ }
+ if (art.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ relateIfNotRelated(AtsConfig.getInstance().getOrCreateWorkFlowsFolderArtifact(transaction), art,
+ transaction);
+ }
+ }
+ }
+
+ private static void relateIfNotRelated(Artifact parent, Artifact child, SkynetTransaction transaction) throws OseeCoreException {
+ if (!parent.getChildren().contains(child) && !child.hasParent()) {
+ parent.addChild(child);
+ parent.persistRelations(transaction);
+ }
+ }
+
+ public static Result validateWorkItemDefinition(WorkItemDefinition workItemDefinition) {
+ try {
+ if (workItemDefinition instanceof WorkPageDefinition) {
+ WorkPageDefinition workPageDefinition = (WorkPageDefinition) workItemDefinition;
+ workPageDefinition.getWorkItems(true);
+ }
+ if (workItemDefinition instanceof WorkWidgetDefinition) {
+ WorkWidgetDefinition workWidgetDefinition = (WorkWidgetDefinition) workItemDefinition;
+ DynamicXWidgetLayoutData dynamicXWidgetLayoutData = workWidgetDefinition.get();
+ XWidget xWidget = XWidgetFactory.getInstance().createXWidget(dynamicXWidgetLayoutData);
+ if (xWidget == null) {
+ throw new OseeStateException("XWidget.createXWidget came back null");
+ }
+ }
+ if (workItemDefinition instanceof WorkFlowDefinition) {
+ WorkFlowDefinition workFlowDefinition = (WorkFlowDefinition) workItemDefinition;
+ if (workFlowDefinition.getPagesOrdered().size() == 0) {
+ throw new OseeStateException("Work Flow must have at least one state.");
+ }
+ if (workFlowDefinition.getStartPage() == null) {
+ throw new OseeStateException("Work Flow must have a single start page");
+ }
+ }
+ } catch (Exception ex) {
+ return new Result(ex.getLocalizedMessage());
+ }
+ return Result.TrueResult;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/StateEventType.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/StateEventType.java
new file mode 100644
index 00000000000..fde34782aad
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/item/StateEventType.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.ats.workflow.item;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum StateEventType {
+ TransitionTo, CreateBranch, CommitBranch;
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAnalyzeWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAnalyzeWorkPageDefinition.java
new file mode 100644
index 00000000000..1b0a2bec7b0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAnalyzeWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAnalyzeWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TeamWorkflowDefinition.ID + "." + DefaultTeamState.Analyze.name();
+
+ public AtsAnalyzeWorkPageDefinition() {
+ this(DefaultTeamState.Analyze.name(), ID, null);
+ }
+
+ public AtsAnalyzeWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsRequireStateHourSpentPrompt.name());
+ addWorkItem(ATSAttributes.WORK_PACKAGE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.PROBLEM_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.PROPOSED_RESOLUTION_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAuthorizeWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAuthorizeWorkPageDefinition.java
new file mode 100644
index 00000000000..3d4bb9259b7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsAuthorizeWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAuthorizeWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TeamWorkflowDefinition.ID + "." + DefaultTeamState.Authorize.name();
+
+ public AtsAuthorizeWorkPageDefinition() {
+ this(DefaultTeamState.Authorize.name(), ID, null);
+ }
+
+ public AtsAuthorizeWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(ATSAttributes.WORK_PACKAGE_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCancelledWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCancelledWorkPageDefinition.java
new file mode 100644
index 00000000000..79300b2edb1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCancelledWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsCancelledWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TeamWorkflowDefinition.ID + "." + DefaultTeamState.Cancelled.name();
+
+ public AtsCancelledWorkPageDefinition() {
+ this(DefaultTeamState.Cancelled.name(), ID, null);
+ }
+
+ public AtsCancelledWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCompletedWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCompletedWorkPageDefinition.java
new file mode 100644
index 00000000000..3db5268bc8a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsCompletedWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsCompletedWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TeamWorkflowDefinition.ID + "." + DefaultTeamState.Completed.name();
+
+ public AtsCompletedWorkPageDefinition() {
+ this(DefaultTeamState.Completed.name(), ID, null);
+ }
+
+ public AtsCompletedWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsAddDecisionValidateBlockingReview.name());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionCompletedWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionCompletedWorkPageDefinition.java
new file mode 100644
index 00000000000..4d44e530bbc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionCompletedWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.DecisionWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDecisionCompletedWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = DecisionWorkflowDefinition.ID + "." + DefaultTeamState.Completed.name();
+
+ public AtsDecisionCompletedWorkPageDefinition() {
+ this(DefaultTeamState.Completed.name(), ID, null);
+ }
+
+ public AtsDecisionCompletedWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsAddDecisionValidateBlockingReview.name());
+ addWorkItem(AtsDecisionDecisionWorkPageDefinition.DECISION_QUESTION_LABEL);
+ addWorkItem(AtsDecisionDecisionWorkPageDefinition.DECISION_ANSWER_LABEL);
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionDecisionWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionDecisionWorkPageDefinition.java
new file mode 100644
index 00000000000..6652359662e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionDecisionWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.workflow.flow.DecisionWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDecisionDecisionWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID =
+ DecisionWorkflowDefinition.ID + "." + DecisionReviewArtifact.DecisionReviewState.Decision.name();
+ public static String DECISION_QUESTION_LABEL = "ats.Decision Question";
+ public static String DECISION_ANSWER_LABEL = "ats.Decision Answer";
+
+ public AtsDecisionDecisionWorkPageDefinition() {
+ this(DecisionReviewArtifact.DecisionReviewState.Decision.name(), ID, null);
+ }
+
+ public AtsDecisionDecisionWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(AtsDecisionDecisionWorkPageDefinition.DECISION_QUESTION_LABEL);
+ addWorkItem(ATSAttributes.DECISION_ATTRIBUTE.getStoreName());
+ addWorkItem(AtsWorkDefinitions.ATS_DESCRIPTION_NOT_REQUIRED_ID);
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionFollowupWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionFollowupWorkPageDefinition.java
new file mode 100644
index 00000000000..0f0b60169cf
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionFollowupWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.workflow.flow.DecisionWorkflowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDecisionFollowupWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = DecisionWorkflowDefinition.ID + "." + DecisionReviewArtifact.DecisionReviewState.Followup.name();
+
+ public AtsDecisionFollowupWorkPageDefinition() {
+ this(DecisionReviewArtifact.DecisionReviewState.Followup.name(), ID, null);
+ }
+
+ public AtsDecisionFollowupWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionPrepareWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionPrepareWorkPageDefinition.java
new file mode 100644
index 00000000000..dc71832f6f5
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsDecisionPrepareWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.DecisionReviewArtifact;
+import org.eclipse.osee.ats.workflow.flow.DecisionWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsDecisionPrepareWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = DecisionWorkflowDefinition.ID + "." + DecisionReviewArtifact.DecisionReviewState.Prepare.name();
+
+ public AtsDecisionPrepareWorkPageDefinition() {
+ this(DecisionReviewArtifact.DecisionReviewState.Prepare.name(), ID, null);
+ }
+
+ public AtsDecisionPrepareWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem("ats.Title");
+ addWorkItem(ATSAttributes.DECISION_REVIEW_OPTIONS_ATTRIBUTE.getStoreName());
+ addWorkItem(AtsWorkDefinitions.ATS_DESCRIPTION_NOT_REQUIRED_ID);
+ addWorkItem(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsEndorseWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsEndorseWorkPageDefinition.java
new file mode 100644
index 00000000000..3e794786af0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsEndorseWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsEndorseWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TeamWorkflowDefinition.ID + "." + DefaultTeamState.Endorse.name();
+
+ public AtsEndorseWorkPageDefinition() {
+ this(DefaultTeamState.Endorse.name(), ID, null);
+ }
+
+ public AtsEndorseWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsRequireStateHourSpentPrompt.name());
+ addWorkItem("ats.Title");
+ addWorkItem(ATSAttributes.DESCRIPTION_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.PROPOSED_RESOLUTION_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.VALIDATION_REQUIRED_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.WORK_PACKAGE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsImplementWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsImplementWorkPageDefinition.java
new file mode 100644
index 00000000000..0eb90b72c14
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsImplementWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.workflow.flow.TeamWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsImplementWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TeamWorkflowDefinition.ID + "." + DefaultTeamState.Implement.name();
+
+ public AtsImplementWorkPageDefinition() {
+ this(DefaultTeamState.Implement.name(), ID, null);
+ }
+
+ public AtsImplementWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsRequireStateHourSpentPrompt.name());
+ addWorkItem(ATSAttributes.WORK_PACKAGE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerPrepareWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerPrepareWorkPageDefinition.java
new file mode 100644
index 00000000000..755e60f15e8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerPrepareWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.workflow.flow.PeerToPeerWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsPeerPrepareWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = PeerToPeerWorkflowDefinition.ID + "." + PeerToPeerReviewArtifact.PeerToPeerReviewState.Prepare.name();
+
+ public AtsPeerPrepareWorkPageDefinition() {
+ this(PeerToPeerReviewArtifact.PeerToPeerReviewState.Prepare.name(), ID, null);
+ }
+
+ public AtsPeerPrepareWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem("ats.Title");
+ addWorkItem(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.ROLE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.LOCATION_ATTRIBUTE.getStoreName());
+ addWorkItem(AtsWorkDefinitions.ATS_DESCRIPTION_NOT_REQUIRED_ID);
+ addWorkItem(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.REVIEW_BLOCKS_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.DEADLINE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerReviewWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerReviewWorkPageDefinition.java
new file mode 100644
index 00000000000..9611922a4d4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsPeerReviewWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.PeerToPeerReviewArtifact;
+import org.eclipse.osee.ats.workflow.flow.PeerToPeerWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsPeerReviewWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = PeerToPeerWorkflowDefinition.ID + "." + PeerToPeerReviewArtifact.PeerToPeerReviewState.Review.name();
+
+ public AtsPeerReviewWorkPageDefinition() {
+ this(PeerToPeerReviewArtifact.PeerToPeerReviewState.Review.name(), ID, null);
+ }
+
+ public AtsPeerReviewWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(ATSAttributes.ROLE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.REVIEW_DEFECT_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ addWorkItem(AtsWorkDefinitions.ATS_DESCRIPTION_NOT_REQUIRED_ID);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsSimpleInWorkWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsSimpleInWorkWorkPageDefinition.java
new file mode 100644
index 00000000000..480c6708eda
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsSimpleInWorkWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.workflow.flow.SimpleWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.flow.SimpleWorkflowDefinition.SimpleState;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsSimpleInWorkWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = SimpleWorkflowDefinition.ID + "." + SimpleState.InWork.name();
+
+ public AtsSimpleInWorkWorkPageDefinition() {
+ this(SimpleState.InWork.name(), ID, null);
+ }
+
+ public AtsSimpleInWorkWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsRequireStateHourSpentPrompt.name());
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsTaskInWorkPageDefinition.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsTaskInWorkPageDefinition.java
new file mode 100644
index 00000000000..2a5f3fe2b9b
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/page/AtsTaskInWorkPageDefinition.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.ats.workflow.page;
+
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TaskArtifact.TaskStates;
+import org.eclipse.osee.ats.workflow.flow.TaskWorkflowDefinition;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions;
+import org.eclipse.osee.ats.workflow.item.AtsWorkDefinitions.RuleWorkItemId;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsTaskInWorkPageDefinition extends WorkPageDefinition {
+
+ public static String ID = TaskWorkflowDefinition.ID + "." + TaskStates.InWork.name();
+
+ public AtsTaskInWorkPageDefinition() {
+ this(TaskStates.InWork.name(), ID, null);
+ }
+
+ public AtsTaskInWorkPageDefinition(String name, String pageId, String parentId) {
+ super(name, pageId, parentId);
+ addWorkItem(RuleWorkItemId.atsRequireStateHourSpentPrompt.name());
+ addWorkItem("ats.Title");
+ addWorkItem(AtsWorkDefinitions.ATS_DESCRIPTION_NOT_REQUIRED_ID);
+ addWorkItem(ATSAttributes.RESOLUTION_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.RELATED_TO_STATE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.SMA_NOTE_ATTRIBUTE.getStoreName());
+ addWorkItem(ATSAttributes.CATEGORY_ATTRIBUTE.getStoreName());
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/AtsDbConfig.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/AtsDbConfig.java
new file mode 100644
index 00000000000..9d5d94d7ac4
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/AtsDbConfig.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.ats.workflow.vue;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AtsDbConfig {
+
+ protected void executeLoadAIsAndTeamsAction(String bundleId) {
+ LoadAIsAndTeamsAction.executeForDbConfig(bundleId);
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/Diagram.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/Diagram.java
new file mode 100644
index 00000000000..a34606baa11
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/Diagram.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.ats.workflow.vue;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Diagram {
+
+ protected List<DiagramNode> nodes = new ArrayList<DiagramNode>();
+ private Set<String> nodeNames = new HashSet<String>();
+ private String id;
+ private String inheritData;
+
+ public Diagram(String id) {
+ super();
+ this.id = id;
+ }
+
+ public Set<String> getPageNames() {
+ if (nodeNames.size() == 0) {
+ for (DiagramNode page : nodes)
+ nodeNames.add(page.getName());
+ }
+ return nodeNames;
+ }
+
+ public void addPage(DiagramNode page) {
+ nodes.add(page);
+ }
+
+ public DiagramNode getPage(String pageName) {
+ List<DiagramNode> pages = getPages(pageName);
+ if (pages.size() > 1) throw new IllegalArgumentException(
+ "Multiple node of same name found in workflow => " + getId() + " Use getPages.");
+ return pages.iterator().next();
+ }
+
+ public List<DiagramNode> getPages(String pageName) {
+ List<DiagramNode> foundPages = new ArrayList<DiagramNode>();
+ for (DiagramNode page : nodes)
+ if (page.getName().equals(pageName)) foundPages.add(page);
+ if (foundPages.size() == 0) throw new IllegalArgumentException(
+ "Invalid node Name \"" + pageName + "\" from workflow => " + getId());
+ return foundPages;
+ }
+
+ public DiagramNode getPageFromId(String id) {
+ for (DiagramNode page : nodes)
+ if (page.getId().equals(id)) return page;
+ return null;
+ }
+
+ public Collection<DiagramNode> getPages() {
+ return nodes;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the inheritData
+ */
+ public String getInheritData() {
+ return inheritData;
+ }
+
+ /**
+ * @param inheritData the inheritData to set
+ */
+ public void setInheritData(String inheritData) {
+ this.inheritData = inheritData;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramFactory.java
new file mode 100644
index 00000000000..d07f0e6d919
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramFactory.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.ats.workflow.vue;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DiagramFactory {
+
+ private static DiagramFactory instance = new DiagramFactory();
+ public static String GENERAL_DOCUMENT_ARTIFACT_NAME = "General Document";
+ private static Map<Object, String> objToAtsWorkFlowXml = new HashMap<Object, String>();
+
+ private DiagramFactory() {
+ super();
+ }
+
+ public static DiagramFactory getInstance() {
+ return instance;
+ }
+
+ public Diagram getWorkFlowFromFilename(String workFlowFilename) {
+ if (!objToAtsWorkFlowXml.containsKey(workFlowFilename)) {
+ String vueXml = AFile.readFile(new File(workFlowFilename));
+ objToAtsWorkFlowXml.put(workFlowFilename, vueXml);
+ }
+ return (Diagram) (new VueDiagram(workFlowFilename, objToAtsWorkFlowXml.get(workFlowFilename))).getWorkflow();
+ }
+
+ public Diagram getWorkFlowFromFileContents(String name, String vueXml) {
+ if (!objToAtsWorkFlowXml.containsKey(name)) {
+ objToAtsWorkFlowXml.put(name, vueXml);
+ }
+ return (Diagram) (new VueDiagram(name, objToAtsWorkFlowXml.get(name))).getWorkflow();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramNode.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramNode.java
new file mode 100644
index 00000000000..909536f3b72
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/DiagramNode.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.ats.workflow.vue;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetOptionResolver;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DiagramNode {
+
+ private String id = GUID.generateGuidStr();
+ private String name;
+ private ArrayList<DiagramNode> fromPages = new ArrayList<DiagramNode>();
+ private ArrayList<DiagramNode> toPages = new ArrayList<DiagramNode>();
+ private ArrayList<DiagramNode> returnPages = new ArrayList<DiagramNode>();
+ private DiagramNode defaultToPage;
+ private String instructionStr;
+
+ public static enum PageType {
+ Team, ActionableItem
+ };
+ private PageType pageType;
+
+ /**
+ * @param instructionLines input lines of WorkAttribute declarations
+ */
+ public DiagramNode(String name, String id, String xWidgetsXml, IXWidgetOptionResolver optionResolver) {
+ super();
+ this.name = name;
+ if (id != null && !id.equals("")) this.id = id;
+ }
+
+ public DiagramNode(String xWidgetsXml, IXWidgetOptionResolver optionResolver) {
+ this("", "", xWidgetsXml, optionResolver);
+ }
+
+ public DiagramNode(IXWidgetOptionResolver optionResolver) {
+ this("", "", null, optionResolver);
+ }
+
+ /**
+ * @return the instructionStr
+ */
+ public String getInstructionStr() {
+ return instructionStr;
+ }
+
+ /**
+ * @param instructionStr the instructionStr to set
+ */
+ public void setInstructionStr(String instructionStr) {
+ this.instructionStr = instructionStr;
+ }
+
+ /**
+ * @return Returns the pageType.
+ */
+ public PageType getPageType() {
+ return pageType;
+ }
+
+ /**
+ * @param pageType The pageType to set.
+ */
+ public void setPageType(PageType pageType) {
+ this.pageType = pageType;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof DiagramNode) return getId().equals(((DiagramNode) obj).getId());
+ return false;
+ }
+
+ public String toString() {
+ StringBuffer sb = new StringBuffer(name + (id != null ? " (" + id + ") " : "") + "\n");
+ for (DiagramNode page : toPages) {
+ sb.append("-> " + page.name + (returnPages.contains(toPages) ? " (return)" : "") + "\n");
+ }
+ return sb.toString();
+ }
+
+ public void addFromPage(DiagramNode page) {
+ fromPages.add(page);
+ }
+
+ public void addToPage(DiagramNode page, boolean returnPage) {
+ toPages.add(page);
+ if (returnPage) returnPages.add(page);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return Returns the fromPages.
+ */
+ public ArrayList<DiagramNode> getFromPages() {
+ return fromPages;
+ }
+
+ /**
+ * @return Returns the toPages.
+ */
+ public ArrayList<DiagramNode> getToPages() {
+ return toPages;
+ }
+
+ public boolean isReturnPage(DiagramNode page) {
+ return returnPages.contains(page);
+ }
+
+ /**
+ * @return Returns the defaultToPage.
+ */
+ public DiagramNode getDefaultToPage() {
+ return defaultToPage;
+ }
+
+ /**
+ * @param defaultToPage The defaultToPage to set.
+ */
+ public void setDefaultToPage(DiagramNode defaultToPage) {
+ this.defaultToPage = defaultToPage;
+ }
+
+ /**
+ * @param id The id to set.
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * @param name The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the returnPages
+ */
+ public ArrayList<DiagramNode> getReturnPages() {
+ return returnPages;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/LoadAIsAndTeamsAction.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/LoadAIsAndTeamsAction.java
new file mode 100644
index 00000000000..b747cf3ec2a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/LoadAIsAndTeamsAction.java
@@ -0,0 +1,357 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.workflow.vue;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+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.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact.TeamDefinitionOptions;
+import org.eclipse.osee.ats.config.AtsConfig;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.workflow.vue.DiagramNode.PageType;
+import org.eclipse.osee.framework.core.data.OseeUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.framework.Bundle;
+
+/**
+ * Retrieve "AIs and Teams.vue" extension points and configure ATS for Actionable Items and Teams from within.
+ */
+public class LoadAIsAndTeamsAction {
+
+ private static final String FULL_NAME = "Full Name:";
+ private static final String DESCRIPTION = "Description:";
+ private static final String WORKFLOW_ID = "WorkflowId:";
+ private static final String STATIC_ID = "StaticId:";
+ private static final String GET_OR_CREATE = "GetOrCreate";
+ private static final String NOT_ACTIONABLE = "NotActionable";
+ private static final String LEAD = "Lead:";
+ private static final String MEMBER = "Member:";
+
+ private final Map<String, ActionableItemArtifact> idToActionItem;
+ private final String bundleId;
+ private final boolean prompt;
+ private final boolean allowUserCreation;
+
+ private LoadAIsAndTeamsAction(boolean prompt, String bundleId, boolean allowUserCreation) {
+ this.idToActionItem = new HashMap<String, ActionableItemArtifact>();
+ this.prompt = prompt;
+ this.bundleId = bundleId;
+ this.allowUserCreation = allowUserCreation;
+ }
+
+ /**
+ * This method is package private to prevent others from using it - only AtsDbConfig children are allowed access;
+ *
+ * @param bundleId
+ */
+ static void executeForDbConfig(String bundleId) {
+ new LoadAIsAndTeamsAction(false, bundleId, true).run();
+ }
+
+ public static void executeForAtsRuntimeConfig(boolean prompt, String bundleId) throws OseeCoreException {
+ new LoadAIsAndTeamsAction(false, bundleId, !AtsPlugin.isProductionDb()).run();
+ }
+
+ private void run() {
+ if (prompt && !MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), "Import ATS Config?",
+ "Importing ATS Config from ActionableItems.vue.\n\nAre you sure?")) return;
+
+ for (Entry<String, String> entry : loadResources().entrySet()) {
+ Diagram workFlow = DiagramFactory.getInstance().getWorkFlowFromFileContents(entry.getKey(), entry.getValue());
+ processWorkflow(workFlow);
+ }
+ }
+
+ private Map<String, String> loadResources() {
+ Map<String, String> resources = new HashMap<String, String>();
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsAIandTeamConfig");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsAIandTeamConfig extension point");
+ return resources;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String vueFilename = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsAIandTeamConfig")) {
+ vueFilename = el.getAttribute("vueFilename");
+ bundleName = el.getContributor().getName();
+ if (bundleId == null || bundleId.equals(bundleName)) {
+ if (vueFilename != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ URL url = bundle.getEntry(vueFilename);
+ resources.put(bundleName + "/" + vueFilename, Lib.inputStreamToString(url.openStream()));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error loading AtsStateItem extension", ex);
+ }
+ }
+ }
+ }
+ }
+ }
+ return resources;
+ }
+
+ private void processWorkflow(final Diagram workFlow) {
+ if (workFlow == null) throw new IllegalArgumentException("ATS config items can't be loaded.");
+
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ // Get or create ATS root artifact
+ Artifact atsHeading = AtsConfig.getInstance().getOrCreateAtsHeadingArtifact(transaction);
+
+ // Create Actionable Items
+ DiagramNode workPage = workFlow.getPage("Actionable Items");
+ addActionableItem(atsHeading, workPage, transaction);
+
+ // Create Teams
+ workPage = workFlow.getPage("Teams");
+ addTeam(atsHeading, workPage, transaction);
+
+ atsHeading.persistAttributesAndRelations(transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private User getUserByName(String name, boolean create, SkynetTransaction transaction) throws OseeCoreException {
+ if (create && !UserManager.userExistsWithName(name)) {
+ return UserManager.createUser(new OseeUser(name, name, "", true), transaction);
+ }
+ return UserManager.getUserByName(name);
+ }
+
+ private TeamDefinitionArtifact addTeam(Artifact parent, DiagramNode page, SkynetTransaction transaction) throws OseeCoreException {
+ // System.out.println("Adding Team " + page.getName());
+ TeamDefinitionArtifact teamDefArt = null;
+ if (page.getName().equals(AtsConfig.TEAMS_HEADING)) {
+ teamDefArt = AtsConfig.getInstance().getOrCreateTeamsDefinitionArtifact(transaction);
+ } else {
+
+ ArrayList<User> leads = new ArrayList<User>();
+ ArrayList<User> members = new ArrayList<User>();
+ java.util.Set<String> staticIds = new HashSet<String>();
+ String desc = "";
+ boolean getOrCreate = false;
+ boolean actionable = true;
+ String fullName = "";
+ String workflowId = "";
+ List<TeamDefinitionOptions> teamDefinitionOptions = new ArrayList<TeamDefinitionOptions>();
+ for (String line : page.getInstructionStr().replaceAll("\r", "\n").split("\n")) {
+ if (!line.equals("")) {
+ if (line.startsWith(DESCRIPTION))
+ desc = line.replaceFirst(DESCRIPTION, "");
+ else if (line.startsWith(WORKFLOW_ID)) {
+ workflowId = line.replaceFirst(WORKFLOW_ID, "");
+ } else if (line.startsWith(STATIC_ID)) {
+ staticIds.add(line.replaceFirst(STATIC_ID, ""));
+ } else if (line.startsWith(GET_OR_CREATE))
+ getOrCreate = true;
+ else if (line.startsWith(NOT_ACTIONABLE))
+ actionable = false;
+ else if (line.startsWith(FULL_NAME))
+ fullName = line.replaceFirst(FULL_NAME, "");
+ else if (line.contains(TeamDefinitionOptions.TeamUsesVersions.name()))
+ teamDefinitionOptions.add(TeamDefinitionOptions.TeamUsesVersions);
+ else if (line.contains(TeamDefinitionOptions.RequireTargetedVersion.name()))
+ teamDefinitionOptions.add(TeamDefinitionOptions.RequireTargetedVersion);
+ else if (line.startsWith(LEAD)) {
+ String name = line.replaceFirst(LEAD, "");
+ User u = getUserByName(name, allowUserCreation, transaction);
+ leads.add(u);
+ } else if (line.startsWith(MEMBER)) {
+ String name = line.replaceFirst(MEMBER, "");
+ User u = getUserByName(name, allowUserCreation, transaction);
+ members.add(u);
+ } else
+ throw new IllegalArgumentException(
+ "Unhandled AtsConfig Line\"" + line + "\" in diagram page \"" + page.getName() + "\"");
+ }
+ }
+
+ ArrayList<ActionableItemArtifact> actionableItems = new ArrayList<ActionableItemArtifact>();
+ for (DiagramNode childPage : page.getToPages()) {
+ if (childPage.getPageType() == PageType.ActionableItem) {
+ // Relate this Team Definition to the Actionable Item
+ ActionableItemArtifact actItem = idToActionItem.get(childPage.getId());
+ if (actItem != null) {
+ actionableItems.add(actItem);
+ } else
+ throw new IllegalArgumentException(
+ "Can't retrieve Actionable Item \"" + childPage.getName() + "\" with id " + childPage.getId());
+ }
+ }
+
+ if (getOrCreate) {
+ teamDefArt =
+ (TeamDefinitionArtifact) Artifacts.getOrCreateArtifact(AtsPlugin.getAtsBranch(),
+ TeamDefinitionArtifact.ARTIFACT_NAME, page.getName());
+ } else {
+ teamDefArt =
+ (TeamDefinitionArtifact) ArtifactTypeManager.addArtifact(TeamDefinitionArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch(), page.getName());
+ }
+ if (!teamDefArt.isInDb()) {
+ teamDefArt.initialize(fullName, desc, leads, members, actionableItems,
+ teamDefinitionOptions.toArray(new TeamDefinitionOptions[teamDefinitionOptions.size()]));
+ if (parent == null) {
+ // Relate to team heading
+ parent = AtsConfig.getInstance().getOrCreateTeamsDefinitionArtifact(transaction);
+ }
+ parent.addChild(teamDefArt);
+
+ for (Artifact actionableItem : actionableItems) {
+ teamDefArt.addRelation(AtsRelation.TeamActionableItem_ActionableItem, actionableItem);
+ }
+ for (String staticId : staticIds) {
+ StaticIdManager.setSingletonAttributeValue(teamDefArt, staticId);
+ }
+ teamDefArt.setSoleAttributeValue(ATSAttributes.ACTIONABLE_ATTRIBUTE.getStoreName(), actionable);
+ }
+ if (!workflowId.equals("")) {
+ try {
+ Artifact workflowArt =
+ ArtifactQuery.getArtifactFromTypeAndName(WorkFlowDefinition.ARTIFACT_NAME, workflowId,
+ AtsPlugin.getAtsBranch());
+ if (workflowArt != null)
+ teamDefArt.addRelation(AtsRelation.WorkItem__Child, workflowArt);
+ else
+ System.err.println("Can't find workflow with id \"" + workflowId + "\"");
+ } catch (Exception ex) {
+ System.err.println(ex.getLocalizedMessage());
+ }
+ }
+ teamDefArt.persistAttributesAndRelations(transaction);
+ }
+
+ // Handle all team children
+ for (DiagramNode childPage : page.getToPages()) {
+ if (childPage.getPageType() == PageType.Team) {
+ addTeam(teamDefArt, childPage, transaction);
+ }
+ }
+ return teamDefArt;
+ }
+
+ private ActionableItemArtifact addActionableItem(Artifact parent, DiagramNode page, SkynetTransaction transaction) throws OseeCoreException {
+ // System.out.println("Processing page " + page.getName());
+ ActionableItemArtifact aia = null;
+ boolean getOrCreate = false;
+ boolean actionable = true;
+ Set<String> staticIds = new HashSet<String>();
+ Set<User> leads = new HashSet<User>();
+ for (String line : page.getInstructionStr().replaceAll("\r", "\n").split("\n")) {
+ if (!line.equals("")) {
+ if (line.startsWith(GET_OR_CREATE))
+ getOrCreate = true;
+ else if (line.startsWith(NOT_ACTIONABLE))
+ actionable = false;
+ else if (line.startsWith(LEAD)) {
+ String name = line.replaceFirst(LEAD, "");
+ User u = getUserByName(name, allowUserCreation, transaction);
+ leads.add(u);
+ } else if (line.startsWith(STATIC_ID)) staticIds.add(line.replaceFirst(STATIC_ID, ""));
+ }
+ }
+ if (page.getName().equals(AtsConfig.ACTIONABLE_ITEMS_HEADING)) {
+ aia = AtsConfig.getInstance().getOrCreateActionableItemsHeadingArtifact(transaction);
+ } else {
+ if (getOrCreate) {
+
+ aia =
+ (ActionableItemArtifact) ArtifactQuery.checkArtifactFromTypeAndName(
+ ActionableItemArtifact.ARTIFACT_NAME, page.getName(), AtsPlugin.getAtsBranch());
+
+ }
+ if (aia == null) {
+ aia =
+ (ActionableItemArtifact) ArtifactTypeManager.addArtifact(ActionableItemArtifact.ARTIFACT_NAME,
+ AtsPlugin.getAtsBranch());
+ aia.setDescriptiveName(page.getName());
+ for (String staticId : staticIds) {
+ StaticIdManager.setSingletonAttributeValue(aia, staticId);
+ }
+ for (User user : leads) {
+ aia.addRelation(AtsRelation.TeamLead_Lead, user);
+ }
+
+ aia.persistAttributes(transaction);
+ idToActionItem.put(page.getId(), aia);
+ parent.addChild(aia);
+ parent.persistAttributesAndRelations(transaction);
+ }
+ }
+ for (DiagramNode childPage : page.getToPages()) {
+ addActionableItem(aia, childPage, transaction);
+ }
+ aia.setSoleAttributeValue(ATSAttributes.ACTIONABLE_ATTRIBUTE.getStoreName(), actionable);
+
+ aia.persistAttributes(transaction);
+ return aia;
+ }
+
+ // /**
+ // * Selection in the workbench has been changed. We can change the state of the 'real' action here if we want, but
+ // * this can only happen after the delegate has been created.
+ // */
+ // public void selectionChanged(IAction action, ISelection selection) {
+ // }
+ //
+ // /**
+ // * We can use this method to dispose of any system resources we previously allocated.
+ // *
+ // * @see IWorkbenchWindowActionDelegate#dispose
+ // */
+ // public void dispose() {
+ // }
+ //
+ // /**
+ // * We will cache window object in order to be able to provide parent shell for the message dialog.
+ // *
+ // * @see IWorkbenchWindowActionDelegate#init
+ // */
+ // public void init(IWorkbenchWindow window) {
+ // }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueDiagram.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueDiagram.java
new file mode 100644
index 00000000000..99f2a396899
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueDiagram.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.ats.workflow.vue;
+
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VueDiagram {
+
+ private final ArrayList<VueLink> links = new ArrayList<VueLink>();
+ private final ArrayList<VueNode> vuePages = new ArrayList<VueNode>();
+ private final Diagram workflow;
+ private static Pattern childPattern =
+ Pattern.compile("<child(.*?)>(.*?)</child>", Pattern.DOTALL | Pattern.MULTILINE);
+
+ /**
+ * @param vueXml
+ */
+ public VueDiagram(String workflowId, String vueXml) {
+ workflow = new Diagram(workflowId);
+ processXml(vueXml);
+ }
+
+ private void processXml(String xml) {
+ Matcher m = childPattern.matcher(xml);
+ while (m.find()) {
+ String childParms = m.group(1);
+ String matchStr = m.group();
+ // System.out.println("Processing child "+childParms);
+ if (childParms.contains("xsi:type=\"group\"")) {
+ throw new IllegalArgumentException("Can't use grouping in diagram");
+ } else if (childParms.contains("xsi:type=\"link\"")) {
+ VueLink link = new VueLink(matchStr);
+ links.add(link);
+ } else if (childParms.contains("xsi:type=\"node\"")) {
+ VueNode vuePage = new VueNode(matchStr);
+ vuePages.add(vuePage);
+ workflow.addPage(vuePage.getWorkPage());
+ } else {
+ throw new IllegalArgumentException("Unhandled xsi:type");
+ }
+ }
+ for (VueLink link : links) {
+ VueNode fromVuePage = getPageFromVueId(link.getFromVueId());
+ if (fromVuePage == null) {
+ throw new IllegalArgumentException("Can't retrieve fromVuePage with id " + link.getFromVueId());
+ }
+ VueNode toVuePage = getPageFromVueId(link.getToVueId());
+ if (toVuePage == null) {
+ throw new IllegalArgumentException(
+ "Can't retrieve toVuePage " + link.getToVueId() + " fromVuePage " + link.getFromVueId() + " named \"" + fromVuePage.getWorkPage().getName() + "\"");
+ }
+ fromVuePage.getWorkPage().addToPage(toVuePage.getWorkPage(), link.getName().equals("return"));
+ toVuePage.getWorkPage().addFromPage(fromVuePage.getWorkPage());
+ if (link.isMultiDirectional()) {
+ toVuePage.getWorkPage().addToPage(fromVuePage.getWorkPage(), link.getName().equals("return"));
+ fromVuePage.getWorkPage().addFromPage(toVuePage.getWorkPage());
+ }
+ if (link.getName().equals("default")) {
+ if (fromVuePage.getWorkPage().getDefaultToPage() == null)
+ fromVuePage.getWorkPage().setDefaultToPage(toVuePage.getWorkPage());
+ else
+ throw new IllegalArgumentException(
+ "Can't have 2 default transitions. Page " + fromVuePage.getWorkPage().getName());
+ }
+ }
+ }
+
+ public VueNode getPageFromVueId(String vueId) {
+ for (VueNode page : vuePages)
+ if (page.getVueId().equals(vueId)) return page;
+ return null;
+ }
+
+ /**
+ * @return Returns the workflow.
+ */
+ public Diagram getWorkflow() {
+ return workflow;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueLink.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueLink.java
new file mode 100644
index 00000000000..b1d9eff7ee8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueLink.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.ats.workflow.vue;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VueLink {
+
+ private final String xml;
+ private String name;
+ private String vueId;
+ private boolean multiDirectional = false;
+ private String fromVueId;
+ private String toVueId;
+
+ @Override
+ public String toString() {
+ return "[" + vueId + " - " + name + " - " + fromVueId + " --> " + toVueId + " - " + (multiDirectional ? "multiDirectional]" : "singleDirection]");
+ }
+
+ /**
+ *
+ */
+ public VueLink(String xml) {
+ super();
+ this.xml = xml;
+ Matcher m =
+ Pattern.compile("<ID1>(.*?)</ID1>.*?<ID2>(.*?)</ID2>", Pattern.DOTALL | Pattern.MULTILINE).matcher(xml);
+ while (m.find()) {
+ if (xml.contains("arrowState=\"2\"")) {
+ fromVueId = m.group(1);
+ toVueId = m.group(2);
+ } else if (xml.contains("arrowState=\"1\"")) {
+ toVueId = m.group(1);
+ fromVueId = m.group(2);
+ } else if (xml.contains("arrowState=\"3\"")) {
+ fromVueId = m.group(1);
+ toVueId = m.group(2);
+ multiDirectional = true;
+ } else if (xml.contains("arrowState=\"0\"")) throw new IllegalArgumentException(
+ "Non-directional links not supported. id = " + getVueId());
+ }
+ }
+
+ public String getVueId() {
+ if (vueId == null) {
+ Matcher m = Pattern.compile("<child.*? ID=\"(.*?)\" ").matcher(xml);
+ if (m.find())
+ vueId = m.group(1);
+ else {
+ vueId = "Unknown";
+ }
+ }
+ return vueId;
+ }
+
+ public String getName() {
+ if (name == null) {
+ Matcher m = Pattern.compile("<child.*? label=\"(.*?)\" ").matcher(xml);
+ if (m.find())
+ name = m.group(1);
+ else {
+ name = "Unknown";
+ }
+ }
+ return name;
+ }
+
+ /**
+ * @return Returns the fromId.
+ */
+ public String getFromVueId() {
+ return fromVueId;
+ }
+
+ /**
+ * @return Returns the toId.
+ */
+ public String getToVueId() {
+ return toVueId;
+ }
+
+ /**
+ * @return Returns the multiDirectional.
+ */
+ public boolean isMultiDirectional() {
+ return multiDirectional;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueNode.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueNode.java
new file mode 100644
index 00000000000..0017c4aa529
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/workflow/vue/VueNode.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.ats.workflow.vue;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.ats.workflow.ATSXWidgetOptionResolver;
+import org.eclipse.osee.ats.workflow.vue.DiagramNode.PageType;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VueNode {
+
+ private final String vueXml;
+ private String vueId;
+ private final DiagramNode workPage;
+ public static enum Shape {
+ ellipse, rectangle, hexagon;
+ public static Shape getShape(String shape) {
+ for (Shape s : Shape.values()) {
+ if (s.name().equals(shape)) return s;
+ }
+ return null;
+ }
+ };
+ private Shape shape;
+
+ @Override
+ public String toString() {
+ return "[" + workPage.getPageType() + " (" + vueId + ") " + workPage.getName() + "]";
+ }
+
+ /**
+ * @return Returns the workPage.
+ */
+ public DiagramNode getWorkPage() {
+ return workPage;
+ }
+
+ /**
+ *
+ */
+ public VueNode(String vueXml) {
+ super();
+ this.vueXml = vueXml;
+ workPage = new DiagramNode(ATSXWidgetOptionResolver.getInstance());
+ processVueXml(vueXml);
+ }
+
+ public void processVueXml(String xml) {
+ String noteXml = AXml.getTagData(xml, "notes");
+ noteXml = noteXml.replaceAll("%nl;", "\r");
+ noteXml = noteXml.replaceAll("%sp;", " ");
+ workPage.setInstructionStr(noteXml);
+ getDetails();
+ if (getShape() == VueNode.Shape.ellipse)
+ workPage.setPageType(PageType.Team);
+ else if (getShape() == VueNode.Shape.rectangle) workPage.setPageType(PageType.ActionableItem);
+ }
+
+ public void getDetails() {
+ Matcher m = Pattern.compile("<child.*? label=\"(.*?)\" ").matcher(vueXml);
+ if (m.find())
+ workPage.setName(m.group(1));
+ else
+ workPage.setName("Unknown");
+
+ m = Pattern.compile("<shape xsi:type=\"(.*?)\"").matcher(vueXml);
+ if (m.find())
+ shape = Shape.getShape(m.group(1));
+ else
+ throw new IllegalArgumentException("Can't determine shape name");
+ m = Pattern.compile("<child.*? ID=\"(.*?)\" ").matcher(vueXml);
+ if (m.find())
+ vueId = m.group(1);
+ else
+ vueId = "Unknown";
+ }
+
+ /**
+ * @return Returns the shape.
+ */
+ public Shape getShape() {
+ return shape;
+ }
+
+ /**
+ * @return Returns the vueObjId.
+ */
+ public String getVueId() {
+ return vueId;
+ }
+
+ /**
+ * @param vueObjId The vueObjId to set.
+ */
+ public void setVueId(String vueObjId) {
+ this.vueId = vueObjId;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsMetricsComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsMetricsComposite.java
new file mode 100644
index 00000000000..cf1a04c72c8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsMetricsComposite.java
@@ -0,0 +1,400 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.SMAMetrics;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.xbargraph.XBarGraphLine;
+import org.eclipse.osee.framework.ui.skynet.widgets.xbargraph.XBarGraphTable;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsMetricsComposite extends ScrolledComposite {
+
+ private Composite toolBarComposite;
+ private Composite metricsComposite;
+ private final IAtsMetricsProvider iAtsMetricsProvider;
+ private final Color BACKGROUND_COLOR = Display.getCurrent().getSystemColor(SWT.COLOR_WHITE);
+ private final Color FOREGROUND_COLOR = Display.getCurrent().getSystemColor(SWT.COLOR_BLUE);
+ private final Composite mainComp;
+ private boolean refreshedOnce = true;
+ private XDate estimatedReleaseXDate;
+
+ /**
+ * @param iAtsMetricsProvider
+ * @param parent
+ * @param style
+ */
+ public AtsMetricsComposite(IAtsMetricsProvider iAtsMetricsProvider, Composite parent, int style) {
+ super(parent, style | SWT.V_SCROLL | SWT.H_SCROLL);
+ this.iAtsMetricsProvider = iAtsMetricsProvider;
+
+ setLayout(new GridLayout(1, true));
+ setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ mainComp = new Composite(this, SWT.NONE);
+ mainComp.setLayout(new GridLayout());
+ mainComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ adapt(mainComp);
+
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(mainComp)) {
+ return;
+ }
+
+ adapt(this);
+ creatToolBar(mainComp);
+
+ setContent(mainComp);
+ setExpandHorizontal(true);
+ setExpandVertical(true);
+ layout();
+ }
+
+ private void creatToolBar(Composite composite) {
+ toolBarComposite = new Composite(composite, SWT.NONE);
+ toolBarComposite.setLayoutData(new GridData(SWT.NONE, SWT.NONE, true, false, 1, 1));
+ toolBarComposite.setLayout(new GridLayout(4, false));
+ adapt(toolBarComposite);
+
+ Button refresh = new Button(toolBarComposite, SWT.PUSH);
+ refresh.setText("Display/Refresh Metrics");
+ refresh.setToolTipText("Recalculate and Update Metrics");
+ refresh.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ handleUpdateMetrics();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ adapt(refresh);
+
+ estimatedReleaseXDate = new XDate("Estimated Release Date - Override");
+ estimatedReleaseXDate.createWidgets(toolBarComposite, 2);
+ adapt(estimatedReleaseXDate.getLabelWidget());
+
+ if (!refreshedOnce) {
+ Label label = new Label(toolBarComposite, SWT.NONE);
+ label.setText(" Last Updated: " + XDate.getDateNow(XDate.MMDDYYHHMM));
+ adapt(label);
+ }
+
+ }
+
+ public void handleUpdateMetrics() throws OseeCoreException {
+ refreshedOnce = false;
+ if (metricsComposite != null) {
+ metricsComposite.dispose();
+ }
+ metricsComposite = new Composite(mainComp, SWT.NONE);
+ metricsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ metricsComposite.setLayout(ALayout.getZeroMarginLayout(1, true));
+ adapt(metricsComposite);
+
+ addSpace();
+
+ try {
+ if (estimatedReleaseXDate.getDate() == null && iAtsMetricsProvider.getMetricsVersionArtifact() != null && iAtsMetricsProvider.getMetricsVersionArtifact().getEstimatedReleaseDate() != null) {
+ estimatedReleaseXDate.setDate(iAtsMetricsProvider.getMetricsVersionArtifact().getEstimatedReleaseDate());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ SMAMetrics sMet =
+ new SMAMetrics(iAtsMetricsProvider.getMetricsArtifacts(), iAtsMetricsProvider.getMetricsVersionArtifact(),
+ iAtsMetricsProvider.getManHoursPerDayPreference(), getEstimatedReleaseDate());
+ createOverviewChart(sMet, metricsComposite);
+ addSpace();
+ createHoursRemainingByAssigneesChart(sMet, metricsComposite);
+ addSpace();
+ createCompletedByAssigneesChart(sMet, metricsComposite);
+
+ mainComp.layout();
+ computeScrollSize();
+ }
+
+ private Date getEstimatedReleaseDate() throws OseeCoreException {
+ if (estimatedReleaseXDate != null && estimatedReleaseXDate.getDate() != null) {
+ return estimatedReleaseXDate.getDate();
+ }
+ if (iAtsMetricsProvider.getMetricsVersionArtifact() != null) {
+ return iAtsMetricsProvider.getMetricsVersionArtifact().getEstimatedReleaseDate();
+ }
+ // Try to find an estimated release date from one of the workflows
+ for (Artifact art : iAtsMetricsProvider.getMetricsArtifacts()) {
+ if (art instanceof TeamWorkFlowArtifact) {
+ VersionArtifact verArt = ((TeamWorkFlowArtifact) art).getWorldViewTargetedVersion();
+ if (verArt != null) {
+ if (verArt.getEstimatedReleaseDate() != null) {
+ return verArt.getEstimatedReleaseDate();
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private boolean isUsingEstimatedReleaseDateFromOverride() throws OseeCoreException {
+ if (estimatedReleaseXDate != null && estimatedReleaseXDate.getDate() != null) {
+ return true;
+ }
+ return false;
+ }
+
+ public void computeScrollSize() {
+ this.computeScrollSize(mainComp);
+ }
+
+ private void computeScrollSize(Composite viewableArea) {
+ this.setMinSize(viewableArea.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ }
+
+ private void addSpace() {
+ Label label = new Label(metricsComposite, SWT.NONE);
+ label.setText(" ");
+ adapt(label);
+ }
+
+ public void createOverviewChart(SMAMetrics sMet, Composite parent) throws OseeCoreException {
+ List<XBarGraphLine> lines = new ArrayList<XBarGraphLine>();
+
+ lines.add(XBarGraphLine.getTextLine("Loaded", sMet.toStringObjectBreakout()));
+ lines.add(XBarGraphLine.getTextLineRedIfTrue("Workflows", String.format(
+ "Estimates off %d workflows with %d having 0 estimates.", sMet.getNumSMAs(), sMet.getNumNotEstimated()),
+ sMet.getNumNotEstimated() > 0));
+
+ lines.add(XBarGraphLine.getPercentLine(
+ "By Workflow Percents (" + sMet.getCummulativeWorkflowPercentComplete() + "/" + sMet.getNumTeamWfs() + ")",
+ (int) sMet.getPercentCompleteByWorkflowPercents()));
+ lines.add(XBarGraphLine.getPercentLine(
+ "By Number of Workflows (" + sMet.getCompletedWorkflows().size() + "/" + sMet.getNumSMAs() + ")",
+ (int) sMet.getPercentCompleteByWorkflow()));
+
+ lines.add(XBarGraphLine.getTextLine("Estimated Hours: ", String.format("%5.2f Hours", sMet.getEstHours())));
+ lines.add(XBarGraphLine.getTextLine("Remaining Hours: ", String.format(
+ "%5.2f Hours = (Estimated hours %5.2f - (Estimated hours %5.2f x Percent Complete %5.2f))",
+ sMet.getHrsRemainFromEstimates(), sMet.getEstHours(), sMet.getEstHours(),
+ sMet.getPercentCompleteByWorkflowPercents())));
+ lines.add(XBarGraphLine.getTextLine("Hours Spent: ", String.format("%5.2f Hours", sMet.getHrsSpent())));
+ lines.add(XBarGraphLine.getTextLine("Hours Per Man Day Preference: ", String.format("%5.2f Hours per Day",
+ sMet.getHoursPerManDay())));
+ lines.add(XBarGraphLine.getTextLine("Man Days Needed: ", String.format(
+ "%5.2f Days = Remaining Hours %5.2f / Hours Per Day of %5.2f", sMet.getManDaysNeeded(),
+ sMet.getHrsRemainFromEstimates(), sMet.getHoursPerManDay())));
+
+ try {
+ lines.add(new XBarGraphLine(
+ "Targeted Version",
+ 0,
+ iAtsMetricsProvider.getMetricsVersionArtifact() == null ? "Not Set" : iAtsMetricsProvider.getMetricsVersionArtifact().getDescriptiveName()));
+ lines.add(new XBarGraphLine(
+ "Version Estimated Release Date",
+ 0,
+ iAtsMetricsProvider.getMetricsVersionArtifact() == null ? "Not Set" : iAtsMetricsProvider.getMetricsVersionArtifact().getSoleAttributeValueAsString(
+ ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE.getStoreName(), "Not Set")));
+ lines.add(new XBarGraphLine("Metrics Estimated Release Date", 0,
+ getEstimatedReleaseDate() == null ? "Not Set" : getEstimatedReleaseDate().toString()));
+ double hoursTillRelease = sMet.getHoursTillRel();
+ lines.add(new XBarGraphLine("Hours Till Release", 0,
+ getEstimatedReleaseDate() == null ? "Estimated Release Date Not Set" : sMet.getHoursTillRelStr()));
+ double hoursRemainingFromEstimates = sMet.getHrsRemainFromEstimates();
+ int percent = 0;
+ if (hoursTillRelease != 0) {
+ percent = (int) (hoursRemainingFromEstimates / hoursTillRelease);
+ }
+ if (sMet.getEstRelDate() == null) {
+ lines.add(new XBarGraphLine("Release Effort Remaining", 0, "Estimated Release Date Not Set"));
+ } else if (hoursRemainingFromEstimates > hoursTillRelease) {
+ lines.add(new XBarGraphLine("Release Effort Remaining", XBarGraphLine.DEFAULT_RED_FOREGROUND,
+ XBarGraphLine.DEFAULT_RED_BACKGROUND, 100, String.format(
+ "%5.2f hours exceeds remaining release hours %5.2f; Over by %5.2f hours.",
+ hoursRemainingFromEstimates, hoursTillRelease, hoursRemainingFromEstimates - hoursTillRelease)));
+ } else {
+ lines.add(new XBarGraphLine("Release Effort Remaining", XBarGraphLine.DEFAULT_GREEN_FOREGROUND,
+ XBarGraphLine.DEFAULT_GREEN_BACKGROUND, SWT.COLOR_WHITE, SWT.COLOR_WHITE, percent, String.format(
+ "%5.2f remaining work hours", hoursRemainingFromEstimates), String.format(
+ "%5.2f release remaining hours", hoursRemainingFromEstimates)));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ XBarGraphTable table = new XBarGraphTable("Overview", "", "", lines);
+ table.setHeaderVisible(false);
+ table.setFillHorizontally(true);
+ table.createWidgets(parent, 1);
+ adapt(table);
+ }
+
+ public void createCompletedByAssigneesChart(SMAMetrics sMet, Composite parent) {
+ List<XBarGraphLine> lines = new ArrayList<XBarGraphLine>();
+ for (User user : sMet.getAssigneesAssignedOrCompleted()) {
+ try {
+ int numCompleted = sMet.getUserToCompletedSmas(user).size();
+ double cummulativePercentComplete = numCompleted * 100;
+ int numInWork = sMet.getUserToAssignedSmas(user).size();
+ // Since table is loaded with arts and also shows children, don't want to count artifacts twice
+ Set<Artifact> processedArts = new HashSet<Artifact>();
+ if (sMet.getUserToAssignedSmas().getValues(user) != null) {
+ for (Artifact sma : sMet.getUserToAssignedSmas().getValues(user)) {
+ if (!processedArts.contains(sma) && !sMet.getUserToCompletedSmas().containsValue(sma)) {
+ cummulativePercentComplete += ((StateMachineArtifact) sma).getWorldViewPercentCompleteTotal();
+ processedArts.add(sma);
+ }
+ }
+ }
+ int numTotal = numCompleted + numInWork;
+ int percentCompleteByNumber = 0;
+ if (numCompleted == numTotal) {
+ percentCompleteByNumber = 100;
+ } else if (numCompleted != 0 && numTotal != 0) {
+ double percent = new Double(numCompleted) / numTotal * 100.0;
+ percentCompleteByNumber = (int) percent;
+ }
+ int percentCompleteByPercents = 0;
+ if (cummulativePercentComplete == 0) {
+ percentCompleteByPercents = 0;
+
+ } else if (numTotal == 0) {
+ percentCompleteByPercents = 100;
+ } else {
+ double percent = cummulativePercentComplete / numTotal;
+ percentCompleteByPercents = (int) percent;
+ }
+ lines.add(XBarGraphLine.getPercentLineBlueGreen(
+ user.getName() + " by Percents (" + cummulativePercentComplete + "/" + numTotal + ")",
+ percentCompleteByPercents));
+ lines.add(XBarGraphLine.getPercentLineBlueGreen(
+ user.getName() + " by Number of Workflows (" + numCompleted + "/" + numTotal + ")",
+ percentCompleteByNumber));
+ } catch (Exception ex) {
+ lines.add(XBarGraphLine.getTextLine(user.getName(), "Exception: " + ex.getLocalizedMessage()));
+ }
+ }
+ XBarGraphTable table =
+ new XBarGraphTable("Completed by Assignee per Assigned Workflow (Team, Task and Review)", "User",
+ "Percent Complete", lines);
+ table.setFillHorizontally(true);
+ table.createWidgets(parent, 1);
+ adapt(table);
+ }
+
+ public void createHoursRemainingByAssigneesChart(SMAMetrics sMet, Composite parent) throws OseeCoreException {
+ List<XBarGraphLine> lines = new ArrayList<XBarGraphLine>();
+ Double hoursRemain = null;
+ if (sMet.getEstRelDate() != null) {
+ hoursRemain = sMet.getHoursTillRel();
+ }
+ for (User user : sMet.getAssigneesAssignedOrCompleted()) {
+ try {
+ double userHoursRemain = 0;
+ for (TeamWorkFlowArtifact team : sMet.getTeamArts()) {
+ Collection<User> users = team.getSmaMgr().getStateMgr().getAssignees();
+ if (users.contains(user)) {
+ double hours = team.getRemainHoursTotal();
+ if (hours > 0) {
+ userHoursRemain += hours / users.size();
+ }
+ }
+ }
+ if (sMet.getEstRelDate() == null) {
+ lines.add(new XBarGraphLine(user.getName(), (int) userHoursRemain, String.format(
+ "%5.2f - (Estimated release date not set)", userHoursRemain)));
+ } else if (hoursRemain == null) {
+ lines.add(new XBarGraphLine(user.getName(), (int) userHoursRemain, String.format("%5.2f",
+ userHoursRemain)));
+ } else {
+ if (userHoursRemain == 0.0) {
+ lines.add(new XBarGraphLine(user.getName(), XBarGraphLine.DEFAULT_GREEN_FOREGROUND,
+ XBarGraphLine.DEFAULT_GREEN_BACKGROUND, 100, "No Estimated Hours Remain"));
+ } else if (userHoursRemain > hoursRemain) {
+ lines.add(new XBarGraphLine(user.getName(), XBarGraphLine.DEFAULT_RED_FOREGROUND,
+ XBarGraphLine.DEFAULT_RED_BACKGROUND,
+ (((int) userHoursRemain) > 1 ? (int) userHoursRemain : 1), String.format(
+ "%5.2f - Exceeds release remaining hours %5.2f.", userHoursRemain, hoursRemain)));
+ } else {
+ lines.add(new XBarGraphLine(user.getName(), XBarGraphLine.DEFAULT_GREEN_FOREGROUND,
+ XBarGraphLine.DEFAULT_GREEN_BACKGROUND, (int) userHoursRemain, String.format(
+ "%5.2f - Within remaining hours %5.2f.", userHoursRemain, hoursRemain)));
+ }
+ }
+ } catch (OseeCoreException ex) {
+ lines.add(new XBarGraphLine(user.getName(), 0, "Exception: " + ex.getLocalizedMessage()));
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ XBarGraphTable table =
+ new XBarGraphTable(
+ "Hours Remaining by Assignee (green = within remaining hours; red = exceeds remaining hours till release)",
+ "User", "Hours Remaining", lines);
+ table.setFillHorizontally(true);
+ table.createWidgets(parent, 1);
+ adapt(table);
+ }
+
+ public void disposeComposite() {
+ }
+
+ public void adapt(XWidget xWidget) {
+ adapt(xWidget.getControl());
+ adapt(xWidget.getLabelWidget());
+ }
+
+ public void adapt(Control control) {
+ if (control == null) return;
+ control.setBackground(BACKGROUND_COLOR);
+ control.setForeground(FOREGROUND_COLOR);
+ }
+
+ public void adapt(Composite composite) {
+ composite.setBackground(BACKGROUND_COLOR);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItem.java
new file mode 100644
index 00000000000..738d4ea8ea1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItem.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.ats.world;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.ats.export.AtsExportManager;
+import org.eclipse.osee.ats.operation.CancelMultipleWorkflows;
+import org.eclipse.osee.ats.operation.CompleteMultipleWorkflows;
+import org.eclipse.osee.ats.operation.DuplicateWorkflowBlam;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsWorldEditorItem extends AtsWorldEditorItemBase {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#getWorldEditorMenuItems(org.eclipse.osee.ats.world.IWorldEditorProvider, org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public List<? extends IAtsWorldEditorMenuItem> getWorldEditorMenuItems(IWorldEditorProvider worldEditorProvider, WorldEditor worldEditor) throws OseeCoreException {
+ try {
+ return Arrays.asList(new AtsExportManager(), new DuplicateWorkflowBlam(), new CompleteMultipleWorkflows(),
+ new CancelMultipleWorkflows());
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItemBase.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItemBase.java
new file mode 100644
index 00000000000..e16a1701f92
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItemBase.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.ats.world;
+
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class AtsWorldEditorItemBase implements IAtsWorldEditorItem {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#getColumnImage(java.lang.Object, org.eclipse.nebula.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn col, int columnIndex) throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#getColumnText(java.lang.Object, org.eclipse.nebula.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn col, int columnIndex) throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#getForeground(java.lang.Object, org.eclipse.nebula.widgets.xviewer.XViewerColumn, int)
+ */
+ @Override
+ public Color getForeground(Object element, XViewerColumn col, int columnIndex) throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#getXViewerColumns()
+ */
+ @Override
+ public List<XViewerColumn> getXViewerColumns() throws OseeCoreException {
+ return Collections.emptyList();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#isXColumnProvider(org.eclipse.nebula.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public boolean isXColumnProvider(XViewerColumn col) throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsWorldEditorItem#getWorldEditorMenuItems(org.eclipse.osee.ats.world.IWorldEditorProvider, org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public List<? extends IAtsWorldEditorMenuItem> getWorldEditorMenuItems(IWorldEditorProvider worldEditorProvider, WorldEditor worldEditor) throws OseeCoreException {
+ return Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItems.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItems.java
new file mode 100644
index 00000000000..3f3e2174ba6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsWorldEditorItems.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.ats.world;
+
+import java.util.ArrayList;
+import java.util.List;
+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.Platform;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsWorldEditorItems {
+
+ private static List<IAtsWorldEditorItem> items = new ArrayList<IAtsWorldEditorItem>();
+
+ @SuppressWarnings( {"unchecked"})
+ private static void loadAllStateItems() {
+ if (items.size() > 0) return;
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.ats.AtsWorldEditorItem");
+ if (point == null) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access AtsWorldEditorItem extension point");
+ return;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsWorldEditorItem")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ if (obj == null) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE,
+ "Error Instantiating AtsWorldEditorItem extension \"" + classname + "\"", null);
+ } else {
+ items.add((IAtsWorldEditorItem) obj);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, "Error loading AtsWorldEditorItem extension",
+ ex);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return the stateItems
+ */
+ public static List<IAtsWorldEditorItem> getItems() {
+ loadAllStateItems();
+ return items;
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsXWidgetActionFormPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsXWidgetActionFormPage.java
new file mode 100644
index 00000000000..ac5640a6682
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/AtsXWidgetActionFormPage.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.ats.world;
+
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.XWidgetParser;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DefaultXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class AtsXWidgetActionFormPage extends FormPage {
+ protected DynamicXWidgetLayout dynamicXWidgetLayout;
+ protected final XFormToolkit toolkit;
+ private Composite parametersContainer;
+ private Section parameterSection;
+ protected Composite resultsContainer;
+ protected Section resultsSection;
+ protected ToolBar toolBar;
+ private Label warningLabel, searchNameLabel;
+
+ public AtsXWidgetActionFormPage(AbstractArtifactEditor editor, String id, String name) {
+ super(editor, id, name);
+ this.toolkit = editor.getToolkit();
+ }
+
+ public abstract String getXWidgetsXml() throws OseeCoreException;
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ ScrolledForm scrolledForm = managedForm.getForm();
+ Composite body = scrolledForm.getBody();
+ body.setLayout(ALayout.getZeroMarginLayout(1, true));
+ body.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, false, false));
+
+ toolBar = AtsLib.createCommonToolBar(body, toolkit);
+
+ Composite headerComp = new Composite(body, SWT.NONE);
+ headerComp.setLayout(new GridLayout(2, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ headerComp.setLayoutData(gd);
+ toolkit.adapt(headerComp);
+
+ warningLabel = new Label(headerComp, SWT.NONE);
+ toolkit.adapt(warningLabel, true, true);
+ searchNameLabel = new Label(headerComp, SWT.NONE);
+ toolkit.adapt(searchNameLabel, true, true);
+
+ try {
+ if (getXWidgetsXml() != null && !getXWidgetsXml().equals("")) {
+ managedForm.addPart(new SectionPart(createParametersSection(managedForm, body)));
+ }
+ managedForm.addPart(new SectionPart(createResultsSection(body)));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ managedForm.refresh();
+ }
+
+ public void reflow() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ getManagedForm().reflow(true);
+ }
+ });
+ }
+
+ private Section createParametersSection(IManagedForm managedForm, Composite body) {
+ parameterSection = toolkit.createSection(body, Section.NO_TITLE);
+ parameterSection.setText("Parameters");
+ parameterSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ parametersContainer = toolkit.createClientContainer(parameterSection, 1);
+ parameterSection.setExpanded(true);
+
+ Composite mainComp = toolkit.createComposite(parametersContainer, SWT.NONE);
+ mainComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ mainComp.setLayoutData(new GridData(SWT.NONE, SWT.FILL, false, true));
+
+ Button runButton = toolkit.createButton(mainComp, "Search", SWT.PUSH);
+ GridData gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+ runButton.setLayoutData(gridData);
+ runButton.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleSearchButtonPressed();
+ }
+ });
+
+ Composite paramComp = new Composite(mainComp, SWT.NONE);
+ paramComp.setLayout(ALayout.getZeroMarginLayout(1, false));
+ paramComp.setLayoutData(new GridData(SWT.NONE, SWT.FILL, false, true));
+
+ List<DynamicXWidgetLayoutData> layoutDatas = null;
+ dynamicXWidgetLayout = new DynamicXWidgetLayout(getDynamicWidgetLayoutListener(), getXWidgetOptionResolver());
+ try {
+ layoutDatas = XWidgetParser.extractWorkAttributes(dynamicXWidgetLayout, getXWidgetsXml());
+ if (layoutDatas != null && !layoutDatas.isEmpty()) {
+ dynamicXWidgetLayout.addWorkLayoutDatas(layoutDatas);
+ dynamicXWidgetLayout.createBody(managedForm, paramComp, null, null, true);
+ parametersContainer.layout();
+ parametersContainer.getParent().layout();
+ }
+ parameterSection.setExpanded(true);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return parameterSection;
+ }
+
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener() {
+ return null;
+ }
+
+ public IXWidgetOptionResolver getXWidgetOptionResolver() {
+ return new DefaultXWidgetOptionResolver();
+ }
+
+ public abstract void handleSearchButtonPressed();
+
+ public void setTableTitle(final String title, final boolean warning) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (Widgets.isAccessible(warningLabel)) {
+ warningLabel.setImage(warning ? ImageManager.getImage(FrameworkImage.WARNING) : null);
+ }
+ if (Widgets.isAccessible(searchNameLabel)) {
+ searchNameLabel.setText(title);
+ searchNameLabel.getParent().layout();
+ }
+ };
+ });
+ }
+
+ public String getCurrentTitleLabel() {
+ if (searchNameLabel != null) {
+ return searchNameLabel.getText();
+ } else
+ return WorldEditor.EDITOR_ID;
+ }
+
+ public abstract Section createResultsSection(Composite body) throws OseeCoreException;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsMetricsProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsMetricsProvider.java
new file mode 100644
index 00000000000..565765b6ad2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsMetricsProvider.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.ats.world;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsMetricsProvider {
+
+ public Collection<? extends Artifact> getMetricsArtifacts() throws OseeCoreException;
+
+ public VersionArtifact getMetricsVersionArtifact() throws OseeCoreException;
+
+ public double getManHoursPerDayPreference() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorItem.java
new file mode 100644
index 00000000000..8041cce1fb6
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorItem.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.ats.world;
+
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsWorldEditorItem {
+
+ public List<XViewerColumn> getXViewerColumns() throws OseeCoreException;
+
+ public boolean isXColumnProvider(XViewerColumn xCol) throws OseeCoreException;
+
+ public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException;
+
+ public Color getForeground(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException;
+
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException;
+
+ /**
+ * Return menu item objects to add to the World Editor pull-down menu only if applicable for the given
+ * worldSearchItem
+ *
+ * @param worldEditorProvider
+ * @param worldComposite
+ * @return applicable pull-down actions
+ * @throws OseeCoreException
+ */
+ public List<? extends IAtsWorldEditorMenuItem> getWorldEditorMenuItems(IWorldEditorProvider worldEditorProvider, WorldEditor worldEditor) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorMenuItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorMenuItem.java
new file mode 100644
index 00000000000..8e52deb645d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IAtsWorldEditorMenuItem.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.ats.world;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsWorldEditorMenuItem {
+
+ public String getMenuItemName() throws OseeCoreException;
+
+ public void runMenuItem(WorldEditor worldEditor) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorParameterProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorParameterProvider.java
new file mode 100644
index 00000000000..0f156cafc0a
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorParameterProvider.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.ats.world;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IWorldEditorParameterProvider extends IWorldEditorProvider {
+
+ public String getParameterXWidgetXml() throws OseeCoreException;
+
+ public Collection<? extends Artifact> performSearchGetResults(SearchType searchType) throws OseeCoreException;
+
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener();
+
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData xWidgetData);
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorProvider.java
new file mode 100644
index 00000000000..2be9036b617
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldEditorProvider.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.ats.world;
+
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IWorldEditorProvider {
+
+ public void run(WorldEditor worldEditor, SearchType searchType, boolean forcePend) throws OseeCoreException;
+
+ public String getSelectedName(SearchType searchType) throws OseeCoreException;
+
+ public String getName() throws OseeCoreException;
+
+ public VersionArtifact getTargetedVersionArtifact() throws OseeCoreException;
+
+ public IWorldEditorProvider copyProvider() throws OseeArgumentException;
+
+ public void setCustomizeData(CustomizeData customizeData);
+
+ public void setTableLoadOptions(TableLoadOption... tableLoadOptions);
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldViewArtifact.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldViewArtifact.java
new file mode 100644
index 00000000000..920646fc9f7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/IWorldViewArtifact.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.ats.world;
+
+import java.util.Collection;
+import java.util.Date;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.swt.graphics.Image;
+
+public interface IWorldViewArtifact {
+
+ public Image getAssigneeImage() throws OseeCoreException;
+
+ public String getWorldViewActionableItems() throws OseeCoreException;
+
+ public String getWorldViewActivePoc() throws OseeCoreException;
+
+ public double getWorldViewAnnualCostAvoidance() throws OseeCoreException;
+
+ public String getWorldViewBranchStatus() throws OseeCoreException;
+
+ public String getWorldViewOriginatingWorkflowStr() throws OseeCoreException;
+
+ public Collection<TeamWorkFlowArtifact> getWorldViewOriginatingWorkflows() throws OseeCoreException;
+
+ public Date getWorldViewCancelledDate() throws OseeCoreException;
+
+ public String getWorldViewCancelledDateStr() throws OseeCoreException;
+
+ public String getWorldViewCategory() throws OseeCoreException;
+
+ public String getWorldViewCategory2() throws OseeCoreException;
+
+ public String getWorldViewCategory3() throws OseeCoreException;
+
+ public ChangeType getWorldViewChangeType() throws OseeCoreException;
+
+ public String getWorldViewChangeTypeStr() throws OseeCoreException;
+
+ public Date getWorldViewCompletedDate() throws OseeCoreException;
+
+ public String getWorldViewCompletedDateStr() throws OseeCoreException;
+
+ public Date getWorldViewCreatedDate() throws OseeCoreException;
+
+ public String getWorldViewCreatedDateStr() throws OseeCoreException;
+
+ public Date getWorldViewDeadlineDate() throws OseeCoreException;
+
+ public String getWorldViewDeadlineDateStr() throws OseeCoreException;
+
+ public String getWorldViewDecision() throws OseeCoreException;
+
+ public String getWorldViewDescription() throws OseeCoreException;
+
+ /**
+ * @return estimated hours from workflow attribute, tasks and reviews
+ * @throws OseeCoreException
+ */
+ public double getWorldViewEstimatedHours() throws OseeCoreException;
+
+ public Date getWorldViewEstimatedReleaseDate() throws OseeCoreException;
+
+ public String getWorldViewEstimatedReleaseDateStr() throws OseeCoreException;
+
+ public Date getWorldViewEstimatedCompletionDate() throws OseeCoreException;
+
+ public String getWorldViewEstimatedCompletionDateStr() throws OseeCoreException;
+
+ public double getWorldViewHoursSpentState() throws OseeCoreException;
+
+ public double getWorldViewHoursSpentStateReview() throws OseeCoreException;
+
+ public double getWorldViewHoursSpentStateTask() throws OseeCoreException;
+
+ public double getWorldViewHoursSpentStateTotal() throws OseeCoreException;
+
+ public double getWorldViewHoursSpentTotal() throws OseeCoreException;
+
+ public String getWorldViewID() throws OseeCoreException;
+
+ public String getWorldViewParentID() throws OseeCoreException;
+
+ public String getWorldViewParentState() throws OseeCoreException;
+
+ public String getWorldViewDaysInCurrentState() throws OseeCoreException;
+
+ public String getWorldViewImplementer() throws OseeCoreException;
+
+ public String getWorldViewLegacyPCR() throws OseeCoreException;
+
+ public double getWorldViewManDaysNeeded() throws OseeCoreException;
+
+ public String getWorldViewNotes() throws OseeCoreException;
+
+ public String getWorldViewNumberOfTasks() throws OseeCoreException;
+
+ public String getWorldViewLastUpdated() throws OseeCoreException;
+
+ public String getWorldViewLastStatused() throws OseeCoreException;
+
+ public String getWorldViewOriginator() throws OseeCoreException;
+
+ public int getWorldViewPercentCompleteState() throws OseeCoreException;
+
+ public int getWorldViewPercentCompleteStateReview() throws OseeCoreException;
+
+ public int getWorldViewPercentCompleteStateTask() throws OseeCoreException;
+
+ public int getWorldViewPercentCompleteTotal() throws OseeCoreException;
+
+ public int getWorldViewPercentRework() throws OseeCoreException;
+
+ public String getWorldViewPercentReworkStr() throws OseeCoreException;
+
+ public String getWorldViewPriority() throws OseeCoreException;
+
+ public String getWorldViewRelatedToState() throws OseeCoreException;
+
+ public Date getWorldViewReleaseDate() throws OseeCoreException;
+
+ public String getWorldViewReleaseDateStr() throws OseeCoreException;
+
+ public double getWorldViewRemainHours() throws OseeCoreException;
+
+ public String getWorldViewResolution() throws OseeCoreException;
+
+ public String getWorldViewGroups() throws OseeCoreException;
+
+ public String getWorldViewReviewAuthor() throws OseeCoreException;
+
+ public String getWorldViewReviewDecider() throws OseeCoreException;
+
+ public String getWorldViewReviewModerator() throws OseeCoreException;
+
+ public String getWorldViewReviewReviewer() throws OseeCoreException;
+
+ public String getWorldViewState() throws OseeCoreException;
+
+ public String getWorldViewTeam() throws OseeCoreException;
+
+ public String getWorldViewTitle() throws OseeCoreException;
+
+ public String getWorldViewType() throws OseeCoreException;
+
+ public String getWorldViewUserCommunity() throws OseeCoreException;
+
+ public String getWorldViewValidationRequiredStr() throws OseeCoreException;
+
+ public String getWorldViewTargetedVersionStr() throws OseeCoreException;
+
+ public VersionArtifact getWorldViewTargetedVersion() throws OseeCoreException;
+
+ public double getWorldViewWeeklyBenefit() throws OseeCoreException;
+
+ public String getWorldViewWorkPackage() throws OseeCoreException;
+
+ public Result isWorldViewAnnualCostAvoidanceValid() throws OseeCoreException;
+
+ public Result isWorldViewDeadlineAlerting() throws OseeCoreException;
+
+ public Result isWorldViewManDaysNeededValid() throws OseeCoreException;
+
+ public Result isWorldViewRemainHoursValid() throws OseeCoreException;
+
+ public String getWorldViewNumberOfReviewIssueDefects() throws OseeCoreException;
+
+ public String getWorldViewNumberOfReviewMajorDefects() throws OseeCoreException;
+
+ public String getWorldViewNumberOfReviewMinorDefects() throws OseeCoreException;
+
+ public String getWorldViewActionsIntiatingWorkflow() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldAssigneeFilter.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldAssigneeFilter.java
new file mode 100644
index 00000000000..14a33129a6f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldAssigneeFilter.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.ats.world;
+
+import java.util.regex.Pattern;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+public class WorldAssigneeFilter extends ViewerFilter {
+
+ Pattern p;
+
+ public WorldAssigneeFilter() throws OseeCoreException {
+ p = Pattern.compile(UserManager.getUser().getDescriptiveName());
+ }
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ try {
+ Artifact art = (Artifact) element;
+ if (art instanceof IWorldViewArtifact) {
+ return p.matcher(((IWorldViewArtifact) art).getWorldViewActivePoc()).find();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldCompletedFilter.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldCompletedFilter.java
new file mode 100644
index 00000000000..bc506ee3d43
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldCompletedFilter.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.ats.world;
+
+import java.util.regex.Pattern;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+public class WorldCompletedFilter extends ViewerFilter {
+
+ Pattern p = Pattern.compile("(Completed|Cancelled)");
+
+ public WorldCompletedFilter() {
+ }
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ try {
+ Artifact art = (Artifact) element;
+ if (art instanceof IWorldViewArtifact) {
+ return !p.matcher(((IWorldViewArtifact) art).getWorldViewState()).find();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java
new file mode 100644
index 00000000000..2d61783e635
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldComposite.java
@@ -0,0 +1,792 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+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.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.actions.NewAction;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.SMAMetrics;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldComposite extends ScrolledComposite implements IFrameworkTransactionEventListener {
+
+ private Action filterCompletedAction, filterMyAssigneeAction, releaseMetricsAction, selectionMetricsAction,
+ toAction, toReview, toWorkFlow, toTask;
+ private Label extraInfoLabel;
+ private final WorldXViewer worldXViewer;
+ private final WorldCompletedFilter worldCompletedFilter = new WorldCompletedFilter();
+ private WorldAssigneeFilter worldAssigneeFilter = null;
+ private final Set<Artifact> worldArts = new HashSet<Artifact>(200);
+ private final Set<Artifact> otherArts = new HashSet<Artifact>(200);
+ private TableLoadOption[] tableLoadOptions;
+ private final ToolBar toolBar;
+ private final WorldEditor worldEditor;
+ private final Composite mainComp;
+
+ public WorldComposite(WorldEditor worldEditor, Composite parent, int style, ToolBar toolBar) {
+ super(parent, style);
+ this.worldEditor = worldEditor;
+ this.toolBar = toolBar;
+
+ setLayout(new GridLayout(1, true));
+ setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ try {
+ worldAssigneeFilter = new WorldAssigneeFilter();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ mainComp = new Composite(this, SWT.NONE);
+ mainComp.setLayout(new GridLayout());
+ mainComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(this)) {
+ extraInfoLabel = null;
+ worldXViewer = null;
+ return;
+ }
+
+ extraInfoLabel = new Label(mainComp, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ worldXViewer = new WorldXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
+ worldXViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ worldXViewer.setContentProvider(new WorldContentProvider(worldXViewer));
+ worldXViewer.setLabelProvider(new WorldLabelProvider(worldXViewer));
+
+ Tree tree = worldXViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL | GridData.GRAB_HORIZONTAL);
+ gridData.heightHint = 100;
+ gridData.widthHint = 100;
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ worldXViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ worldXViewer.getTree().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent event) {
+ }
+
+ public void keyReleased(KeyEvent event) {
+ // if CTRL key is already pressed
+ if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) {
+ if (event.keyCode == 'a') {
+ worldXViewer.getTree().setSelection(worldXViewer.getTree().getItems());
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (event.keyCode == 'z') {
+ releaseMetricsAction.setChecked(!releaseMetricsAction.isChecked());
+ releaseMetricsAction.run();
+ } else if (event.keyCode == 'x') {
+ selectionMetricsAction.setChecked(!selectionMetricsAction.isChecked());
+ selectionMetricsAction.run();
+ } else if (event.keyCode == 'f') {
+ filterCompletedAction.setChecked(!filterCompletedAction.isChecked());
+ filterCompletedAction.run();
+ } else if (event.keyCode == 'g') {
+ filterMyAssigneeAction.setChecked(!filterMyAssigneeAction.isChecked());
+ filterMyAssigneeAction.run();
+ } else if (event.keyCode == 'd') {
+ filterMyAssigneeAction.setChecked(!filterMyAssigneeAction.isChecked());
+ filterCompletedAction.setChecked(!filterCompletedAction.isChecked());
+ filterCompletedAction.run();
+ filterMyAssigneeAction.run();
+ }
+ }
+ }
+ });
+
+ new WorldViewDragAndDrop(this, WorldEditor.EDITOR_ID);
+
+ createActions();
+
+ setContent(mainComp);
+ setExpandHorizontal(true);
+ setExpandVertical(true);
+ layout();
+
+ OseeEventManager.addListener(this);
+ }
+
+ public double getManHoursPerDayPreference() throws OseeCoreException {
+ if (worldArts.size() > 0) {
+ Artifact artifact = worldArts.iterator().next();
+ if (artifact instanceof ActionArtifact) {
+ artifact = ((ActionArtifact) artifact).getTeamWorkFlowArtifacts().iterator().next();
+ }
+ return ((StateMachineArtifact) artifact).getManHrsPerDayPreference();
+ }
+ return StateMachineArtifact.DEFAULT_MAN_HOURS_PER_DAY;
+ }
+
+ public void setCustomizeData(CustomizeData customizeData) {
+ worldXViewer.getCustomizeMgr().loadCustomization(customizeData);
+ }
+
+ public Control getControl() {
+ return worldXViewer.getControl();
+ }
+
+ public void load(final String name, final Collection<? extends Artifact> arts, TableLoadOption... tableLoadOption) {
+ load(name, arts, null, tableLoadOption);
+ }
+
+ public void load(final String name, final Collection<? extends Artifact> arts, final CustomizeData customizeData, TableLoadOption... tableLoadOption) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ worldArts.clear();
+ otherArts.clear();
+ for (Artifact art : arts) {
+ if (art instanceof IWorldViewArtifact)
+ worldArts.add(art);
+ else
+ otherArts.add(art);
+ }
+ worldXViewer.set(worldArts);
+ if (customizeData != null && !worldXViewer.getCustomizeMgr().generateCustDataFromTable().equals(
+ customizeData)) {
+ setCustomizeData(customizeData);
+ }
+ if (arts.size() == 0)
+ setTableTitle("No Results Found - " + name, true);
+ else
+ setTableTitle(name, false);
+ worldXViewer.refresh();
+ if (otherArts.size() > 0) {
+ if (MessageDialog.openConfirm(
+ Display.getCurrent().getActiveShell(),
+ "Open in Artifact Editor?",
+ otherArts.size() + " Non-WorldView Artifacts were returned from request.\n\nOpen in Artifact Editor?")) {
+ ArtifactEditor.editArtifacts(otherArts);
+ }
+ }
+ }
+ }, true);
+ // Need to reflow the managed page based on the results. Don't put this in the above thread.
+ worldEditor.getActionPage().reflow();
+ }
+
+ public class FilterLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ try {
+ return ((WorldSearchItem) arg0).getSelectedName(SearchType.Search);
+ } catch (OseeCoreException ex) {
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+ }
+
+ public class FilterContentProvider implements IStructuredContentProvider {
+ public Object[] getElements(Object arg0) {
+ return ((ArrayList<?>) arg0).toArray();
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
+ }
+ }
+
+ public void setTableTitle(final String title, final boolean warning) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ worldEditor.setTableTitle(title, warning);
+ worldXViewer.setReportingTitle(title + " - " + XDate.getDateNow());
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+ }
+
+ public void updateExtraInfoLine() throws OseeCoreException {
+ if (extraInfoLabel == null || extraInfoLabel.isDisposed()) return;
+ String str = "";
+ if (releaseMetricsAction.isChecked()) {
+ VersionArtifact verArt = null;
+ Set<StateMachineArtifact> smaArts = getXViewer().getSelectedSMAArtifacts();
+ if (smaArts.size() != 0) {
+ verArt = smaArts.iterator().next().getWorldViewTargetedVersion();
+ SMAMetrics sMet =
+ new SMAMetrics(smaArts, verArt, smaArts.iterator().next().getManHrsPerDayPreference(), null);
+ str = sMet.toString();
+ }
+ } else if (selectionMetricsAction.isChecked() && getXViewer().getSelectedSMAArtifacts().size() > 0) {
+ SMAMetrics sMet =
+ new SMAMetrics(getXViewer().getSelectedSMAArtifacts(), null,
+ getXViewer().getSelectedSMAArtifacts().iterator().next().getManHrsPerDayPreference(), null);
+ str = sMet.toString();
+ }
+
+ extraInfoLabel.setText(str);
+ extraInfoLabel.getParent().layout();
+ }
+
+ protected void createActions() {
+
+ Action newWorldEditor = new Action("Open New ATS World Editor") {
+
+ @Override
+ public void run() {
+ try {
+ IWorldEditorProvider provider =
+ ((WorldEditorInput) worldEditor.getEditorInput()).getIWorldEditorProvider().copyProvider();
+ provider.setCustomizeData(worldXViewer.getCustomizeMgr().generateCustDataFromTable());
+ provider.setTableLoadOptions(TableLoadOption.NoUI);
+ WorldEditor.open(provider);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ newWorldEditor.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.GLOBE));
+ newWorldEditor.setToolTipText("Open in ATS World Editor");
+
+ Action newWorldEditorSelected = new Action("Open Selected in ATS World Editor") {
+
+ @Override
+ public void run() {
+
+ if (worldXViewer.getSelectedArtifacts().size() == 0) {
+ AWorkbench.popup("ERROR", "Select items to open");
+ return;
+ }
+ try {
+ WorldEditor.open(new WorldEditorSimpleProvider("ATS World", worldXViewer.getSelectedArtifacts(),
+ worldXViewer.getCustomizeMgr().generateCustDataFromTable(), tableLoadOptions));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ newWorldEditorSelected.setImageDescriptor(ImageManager.getImageDescriptor(AtsImage.GLOBE_SELECT));
+ newWorldEditorSelected.setToolTipText("Open Selected in ATS World Editor");
+
+ Action expandAllAction = new Action("Expand All") {
+
+ @Override
+ public void run() {
+ worldXViewer.expandAll();
+ }
+ };
+ expandAllAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.EXPAND_ALL));
+ expandAllAction.setToolTipText("Expand All");
+
+ Action collapseAllAction = new Action("Collapse All") {
+
+ @Override
+ public void run() {
+ worldXViewer.collapseAll();
+ }
+ };
+ collapseAllAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.COLLAPSE_ALL));
+ collapseAllAction.setToolTipText("Collapse All");
+
+ filterCompletedAction = new Action("Filter Out Completed/Cancelled - Ctrl-F", Action.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ if (filterCompletedAction.isChecked()) {
+ worldXViewer.addFilter(worldCompletedFilter);
+ } else {
+ worldXViewer.removeFilter(worldCompletedFilter);
+ }
+ updateExtendedStatusString();
+ worldXViewer.refresh();
+ }
+ };
+ filterCompletedAction.setToolTipText("Filter Out Completed/Cancelled - Ctrl-F");
+
+ filterMyAssigneeAction = new Action("Filter My Assignee - Ctrl-G", Action.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ if (filterMyAssigneeAction.isChecked()) {
+ worldXViewer.addFilter(worldAssigneeFilter);
+ } else {
+ worldXViewer.removeFilter(worldAssigneeFilter);
+ }
+ updateExtendedStatusString();
+ worldXViewer.refresh();
+ }
+ };
+ filterMyAssigneeAction.setToolTipText("Filter My Assignee - Ctrl-G");
+
+ Action refreshAction = new Action("Refresh") {
+
+ @Override
+ public void run() {
+ try {
+ worldEditor.reSearch();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ refreshAction.setToolTipText("Refresh");
+
+ releaseMetricsAction = new Action("Show Release Metrics by Release Version - Ctrl-Z", Action.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ if (releaseMetricsAction.isChecked()) selectionMetricsAction.setChecked(false);
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ releaseMetricsAction.setToolTipText("Show Release Metrics by Release Version - Ctrl-Z");
+
+ selectionMetricsAction = new Action("Show Release Metrics by Selection - Ctrl-X", Action.AS_CHECK_BOX) {
+
+ @Override
+ public void run() {
+ if (selectionMetricsAction.isChecked()) releaseMetricsAction.setChecked(false);
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ selectionMetricsAction.setToolTipText("Show Release Metrics by Selection - Ctrl-X");
+
+ toAction = new Action("Re-display as Actions", Action.AS_PUSH_BUTTON) {
+
+ @Override
+ public void run() {
+ redisplayAsAction();
+ }
+ };
+ toAction.setToolTipText("Re-display as Actions");
+
+ toWorkFlow = new Action("Re-display as WorkFlows", Action.AS_PUSH_BUTTON) {
+
+ @Override
+ public void run() {
+ redisplayAsWorkFlow();
+ }
+ };
+ toWorkFlow.setToolTipText("Re-display as WorkFlows");
+
+ toTask = new Action("Re-display as Tasks", Action.AS_PUSH_BUTTON) {
+
+ @Override
+ public void run() {
+ redisplayAsTask();
+ }
+ };
+ toTask.setToolTipText("Re-display as Tasks");
+
+ toReview = new Action("Re-display as Reviews", Action.AS_PUSH_BUTTON) {
+
+ @Override
+ public void run() {
+ redisplayAsReviews();
+ }
+ };
+ toReview.setToolTipText("Re-display as Reviews");
+
+ if (toolBar != null) {
+ actionToToolItem(toolBar, refreshAction, FrameworkImage.REFRESH);
+ new ToolItem(toolBar, SWT.SEPARATOR);
+ actionToToolItem(toolBar, expandAllAction, FrameworkImage.EXPAND_ALL);
+ actionToToolItem(toolBar, collapseAllAction, FrameworkImage.COLLAPSE_ALL);
+ actionToToolItem(toolBar, worldXViewer.getCustomizeAction(), AtsImage.CUSTOMIZE);
+ new ToolItem(toolBar, SWT.SEPARATOR);
+ actionToToolItem(toolBar, newWorldEditor, AtsImage.GLOBE);
+ actionToToolItem(toolBar, newWorldEditorSelected, AtsImage.GLOBE_SELECT);
+ new ToolItem(toolBar, SWT.SEPARATOR);
+ actionToToolItem(toolBar, new NewAction(), AtsImage.NEW_ACTION);
+
+ OseeAts.addButtonToEditorToolBar(worldEditor, AtsPlugin.getInstance(), toolBar, WorldEditor.EDITOR_ID,
+ "ATS World");
+ new ToolItem(toolBar, SWT.SEPARATOR);
+
+ createToolBarPulldown(toolBar, toolBar.getParent());
+ }
+ }
+
+ public void createToolBarPulldown(final ToolBar toolBar, Composite composite) {
+ final ToolItem dropDown = new ToolItem(toolBar, SWT.PUSH);
+ dropDown.setImage(ImageManager.getImage(AtsImage.DOWN_TRIANGLE));
+ final Menu menu = new Menu(composite);
+
+ dropDown.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ Rectangle rect = dropDown.getBounds();
+ Point pt = new Point(rect.x, rect.y + rect.height);
+ pt = toolBar.toDisplay(pt);
+ menu.setLocation(pt.x, pt.y);
+ menu.setVisible(true);
+ }
+ });
+
+ actionToMenuItem(menu, filterCompletedAction, SWT.CHECK);
+ actionToMenuItem(menu, filterMyAssigneeAction, SWT.CHECK);
+ new MenuItem(menu, SWT.SEPARATOR);
+ actionToMenuItem(menu, releaseMetricsAction, SWT.CHECK);
+ actionToMenuItem(menu, selectionMetricsAction, SWT.CHECK);
+ new MenuItem(menu, SWT.SEPARATOR);
+ actionToMenuItem(menu, toAction, SWT.PUSH);
+ actionToMenuItem(menu, toWorkFlow, SWT.PUSH);
+ actionToMenuItem(menu, toTask, SWT.PUSH);
+ actionToMenuItem(menu, toReview, SWT.PUSH);
+ new MenuItem(menu, SWT.SEPARATOR);
+ try {
+ for (IAtsWorldEditorItem item : AtsWorldEditorItems.getItems()) {
+ for (final IAtsWorldEditorMenuItem atsMenuItem : item.getWorldEditorMenuItems(
+ worldEditor.getWorldEditorProvider(), worldEditor)) {
+ MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
+ menuItem.setText(atsMenuItem.getMenuItemName());
+ menuItem.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ atsMenuItem.runMenuItem(worldEditor);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ }
+
+ public static ToolItem actionToToolItem(ToolBar toolBar, Action action, OseeImage imageEnum) {
+ final Action fAction = action;
+ ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(imageEnum));
+ item.setToolTipText(action.getToolTipText());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ fAction.run();
+ }
+ });
+ return item;
+ }
+
+ private MenuItem actionToMenuItem(Menu menu, final Action action, final int buttonType) {
+ final Action fAction = action;
+ MenuItem item = new MenuItem(menu, buttonType);
+ item.setText(action.getText());
+ if (action.getImageDescriptor() != null) {
+ item.setImage(action.getImageDescriptor().createImage());
+ }
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (buttonType == SWT.CHECK) {
+ action.setChecked(!action.isChecked());
+ }
+ fAction.run();
+ }
+ });
+ return item;
+ }
+
+ public ArrayList<Artifact> getLoadedArtifacts() {
+ return getXViewer().getLoadedArtifacts();
+ }
+
+ public void updateExtendedStatusString() {
+ worldXViewer.setExtendedStatusString(
+ //
+ (filterCompletedAction.isChecked() ? "[Complete/Cancel Filter]" : "") +
+ //
+ (filterMyAssigneeAction.isChecked() ? "[My Assignee Filter]" : ""));
+ }
+
+ public void redisplayAsAction() {
+ final ArrayList<Artifact> artifacts = worldXViewer.getLoadedArtifacts();
+ Job job = new Job("Re-display as Actions") {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final Set<Artifact> arts = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+ if (art instanceof ActionArtifact) {
+ arts.add(art);
+ } else if (art instanceof StateMachineArtifact) {
+ Artifact parentArt = ((StateMachineArtifact) art).getParentActionArtifact();
+ if (parentArt != null) {
+ arts.add(parentArt);
+ }
+ }
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ load(worldEditor.getCurrentTitleLabel(), arts);
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job, true);
+ }
+
+ public void redisplayAsWorkFlow() {
+ final ArrayList<Artifact> artifacts = worldXViewer.getLoadedArtifacts();
+ Job job = new Job("Re-display as Workflows") {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final Set<Artifact> arts = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+ if (art instanceof ActionArtifact) {
+ arts.addAll(((ActionArtifact) art).getTeamWorkFlowArtifacts());
+ } else if (art instanceof StateMachineArtifact) {
+ Artifact parentArt = ((StateMachineArtifact) art).getParentTeamWorkflow();
+ if (parentArt != null) {
+ arts.add(parentArt);
+ }
+ }
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ load(worldEditor.getCurrentTitleLabel(), arts);
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job, true);
+ }
+
+ public void redisplayAsTask() {
+ final ArrayList<Artifact> artifacts = worldXViewer.getLoadedArtifacts();
+ Job job = new Job("Re-display as Tasks") {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final Set<Artifact> arts = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+ if (art instanceof ActionArtifact) {
+ for (TeamWorkFlowArtifact team : ((ActionArtifact) art).getTeamWorkFlowArtifacts()) {
+ arts.addAll(team.getSmaMgr().getTaskMgr().getTaskArtifacts());
+ }
+ } else if (art instanceof StateMachineArtifact) {
+ arts.addAll(((StateMachineArtifact) art).getSmaMgr().getTaskMgr().getTaskArtifacts());
+ }
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ load(worldEditor.getCurrentTitleLabel(), arts);
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job, true);
+ }
+
+ public void redisplayAsReviews() {
+ final ArrayList<Artifact> artifacts = worldXViewer.getLoadedArtifacts();
+ Job job = new Job("Re-display as Reviews") {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ final Set<Artifact> arts = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+ if (art instanceof ActionArtifact) {
+ for (TeamWorkFlowArtifact team : ((ActionArtifact) art).getTeamWorkFlowArtifacts()) {
+ arts.addAll(team.getSmaMgr().getReviewManager().getReviews());
+ }
+ } else if (art instanceof StateMachineArtifact) {
+ arts.addAll(((StateMachineArtifact) art).getSmaMgr().getReviewManager().getReviews());
+ }
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ load(worldEditor.getCurrentTitleLabel(), arts);
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job, true);
+ }
+
+ public void disposeComposite() {
+ OseeEventManager.removeListener(this);
+ if (worldXViewer != null && !worldXViewer.getTree().isDisposed()) {
+ worldXViewer.dispose();
+ }
+ }
+
+ /**
+ * @return the xViewer
+ */
+ public WorldXViewer getXViewer() {
+ return worldXViewer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId == AtsPlugin.getAtsBranch().getBranchId()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ updateExtraInfoLine();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java
new file mode 100644
index 00000000000..1794efa5962
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldContentProvider.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ats.ActionDebug;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+
+public class WorldContentProvider implements ITreeContentProvider {
+
+ protected List<Artifact> rootSet = new ArrayList<Artifact>();
+ private final WorldXViewer xViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ private final ActionDebug debug = new ActionDebug(false, "WorldTreeContentProvider");
+
+ public WorldContentProvider(WorldXViewer WorldXViewer) {
+ super();
+ this.xViewer = WorldXViewer;
+ }
+
+ @Override
+ public String toString() {
+ return "WorldContentProvider";
+ }
+
+ public void add(final Artifact item) {
+ add(Arrays.asList(item));
+ }
+
+ public void add(final Collection<? extends Artifact> items) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ for (Artifact item : items) {
+ if (!rootSet.contains(item)) {
+ rootSet.add(item);
+ }
+ }
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void set(final Collection<? extends Artifact> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.clear();
+ add(arts);
+ };
+ });
+ }
+
+ public void remove(final Artifact art) {
+ removeAll(Arrays.asList(art));
+ }
+
+ public void removeAll(final Collection<? extends Object> arts) {
+ if (arts.size() == 0) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ for (Object art : arts) {
+ rootSet.remove(art);
+ }
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void updateAll(final Collection<? extends Object> arts) {
+ if (arts.size() == 0) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ for (Object art : arts) {
+ xViewer.update(art, null);
+ }
+ };
+ });
+ }
+
+ public void clear() {
+ rootSet.clear();
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) {
+ xViewer.setInput(rootSet);
+ }
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ debug.report("getChildren");
+ if (parentElement instanceof Collection) {
+ return ((Collection<?>) parentElement).toArray();
+ }
+ if (parentElement instanceof Artifact) {
+ try {
+ Artifact artifact = (Artifact) parentElement;
+ if (artifact == null) {
+ return new Object[] {};
+ }
+ if (artifact.isDeleted()) return new Object[] {};
+ if (artifact instanceof ActionArtifact) {
+ return ((ActionArtifact) artifact).getTeamWorkFlowArtifacts().toArray();
+ }
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ TeamWorkFlowArtifact teamArt = (TeamWorkFlowArtifact) artifact;
+ List<Artifact> arts = new ArrayList<Artifact>();
+ // Convert artifacts to WorldArtifactItems
+ arts.addAll(teamArt.getSmaMgr().getReviewManager().getReviews());
+ arts.addAll(teamArt.getSmaMgr().getTaskMgr().getTaskArtifacts());
+ return arts.toArray();
+ }
+ if (artifact instanceof ReviewSMArtifact) {
+ ReviewSMArtifact reviewArt = (ReviewSMArtifact) artifact;
+ List<Artifact> arts = new ArrayList<Artifact>();
+ // Convert artifacts to WorldArtifactItems
+ arts.addAll(reviewArt.getSmaMgr().getReviewManager().getReviews());
+ arts.addAll(reviewArt.getSmaMgr().getTaskMgr().getTaskArtifacts());
+ return arts.toArray();
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ debug.report("getParent");
+ if (element instanceof Artifact) {
+ try {
+ Artifact artifact = (Artifact) element;
+ if (artifact == null) {
+ return null;
+ }
+ if (artifact.isDeleted()) return null;
+ if (artifact instanceof TeamWorkFlowArtifact) {
+ ((TeamWorkFlowArtifact) artifact).getParentActionArtifact();
+ }
+ if (artifact instanceof TaskArtifact) {
+ ((TaskArtifact) artifact).getParentSMA();
+ }
+ if (artifact instanceof ReviewSMArtifact) {
+ ((TeamWorkFlowArtifact) artifact).getParentSMA();
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ debug.report("hasChildren");
+ if (element instanceof Collection) return true;
+ if (element instanceof String) return false;
+ if (((Artifact) element).isDeleted()) return false;
+ if (element instanceof ActionArtifact) return true;
+ if (element instanceof StateMachineArtifact) {
+ try {
+ return ((StateMachineArtifact) element).hasAtsWorldChildren();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ return true;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ debug.report("getElements");
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the rootSet
+ */
+ public Collection<Artifact> getRootSet() {
+ return rootSet;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditor.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditor.java
new file mode 100644
index 00000000000..c09b9bbbd7f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditor.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.ats.world;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldEditor extends AbstractArtifactEditor implements IDirtiableEditor, IAtsMetricsProvider, IActionable {
+ public static final String EDITOR_ID = "org.eclipse.osee.ats.world.WorldEditor";
+ private int mainPageIndex, metricsPageIndex;
+ private WorldXWidgetActionPage actionPage;
+ private AtsMetricsComposite metricsComposite;
+ public static final String HELP_CONTEXT_ID = "atsWorldView";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ public static void open(final IWorldEditorProvider provider) throws OseeCoreException {
+ open(provider, false);
+ }
+
+ public static void open(final IWorldEditorProvider provider, boolean forcePend) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ page.openEditor(new WorldEditorInput(provider), EDITOR_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }, forcePend);
+ }
+
+ public void closeEditor() {
+ final MultiPageEditorPart editor = this;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ AWorkbench.getActivePage().closeEditor(editor, false);
+ }
+ });
+ }
+
+ public static Collection<WorldEditor> getEditors() {
+ final List<WorldEditor> editors = new ArrayList<WorldEditor>();
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (IEditorReference editor : AWorkbench.getEditors(EDITOR_ID)) {
+ editors.add((WorldEditor) editor.getEditor(false));
+ }
+ }
+ }, true);
+ return editors;
+ }
+
+ public static void closeAll() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (IEditorReference editor : AWorkbench.getEditors(EDITOR_ID)) {
+ AWorkbench.getActivePage().closeEditor((editor.getEditor(false)), false);
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean isSaveOnCloseNeeded() {
+ return isDirty();
+ }
+
+ public void refreshTitle() {
+ firePropertyChange(IWorkbenchPart.PROP_TITLE);
+ }
+
+ @Override
+ public void dispose() {
+ if (actionPage != null && actionPage.getWorldComposite() != null) {
+ actionPage.getWorldComposite().disposeComposite();
+ }
+ if (metricsComposite != null) metricsComposite.disposeComposite();
+ super.dispose();
+ }
+
+ public String getCurrentTitleLabel() {
+ return actionPage.getCurrentTitleLabel();
+ }
+
+ public void setTableTitle(final String title, final boolean warning) {
+ actionPage.setTableTitle(title, warning);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+
+ try {
+ OseeContributionItem.addTo(this, true);
+
+ IWorldEditorProvider provider = getWorldEditorProvider();
+
+ createMainTab();
+ createMetricsTab();
+
+ setPartName(provider.getSelectedName(SearchType.Search));
+ setActivePage(mainPageIndex);
+
+ // Until WorldEditor has different help, just use WorldView's help
+ AtsPlugin.getInstance().setHelp(actionPage.getWorldComposite().getControl(), HELP_CONTEXT_ID);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * @return the actionPage
+ */
+ public WorldXWidgetActionPage getActionPage() {
+ return actionPage;
+ }
+
+ public void setEditorTitle(final String str) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ setPartName(str);
+ firePropertyChange(IWorkbenchPart.PROP_TITLE);
+ }
+ });
+ }
+
+ public IWorldEditorProvider getWorldEditorProvider() {
+ IEditorInput editorInput = getEditorInput();
+ if (!(editorInput instanceof WorldEditorInput)) {
+ throw new IllegalArgumentException("Editor Input not WorldEditorInput");
+ }
+ WorldEditorInput worldEditorInput = (WorldEditorInput) editorInput;
+ return worldEditorInput.getIWorldEditorProvider();
+ }
+
+ public void reSearch() throws OseeCoreException {
+ actionPage.reSearch();
+ }
+
+ private void createMainTab() throws OseeCoreException, PartInitException {
+ actionPage = new WorldXWidgetActionPage(this);
+ mainPageIndex = addPage(actionPage);
+ }
+
+ private void createMetricsTab() throws OseeCoreException {
+ Composite comp = AtsLib.createCommonPageComposite(getContainer());
+ AtsLib.createCommonToolBar(comp);
+ metricsComposite = new AtsMetricsComposite(this, comp, SWT.NONE);
+ metricsPageIndex = addPage(comp);
+ setPageText(metricsPageIndex, "Metrics");
+ }
+
+ public ArrayList<Artifact> getLoadedArtifacts() {
+ return actionPage.getWorldComposite().getLoadedArtifacts();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getArtifacts()
+ */
+ @Override
+ public Collection<? extends Artifact> getMetricsArtifacts() throws OseeCoreException {
+ return getLoadedArtifacts();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getMetricsVersionArtifact()
+ */
+ @Override
+ public VersionArtifact getMetricsVersionArtifact() throws OseeCoreException {
+ return getWorldEditorProvider().getTargetedVersionArtifact();
+ }
+
+ public WorldComposite getWorldComposite() {
+ return actionPage.getWorldComposite();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IAtsMetricsProvider#getManHoursPerDayPreference()
+ */
+ @Override
+ public double getManHoursPerDayPreference() throws OseeCoreException {
+ return actionPage.getWorldComposite().getManHoursPerDayPreference();
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorInput.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorInput.java
new file mode 100644
index 00000000000..53f7bb1b53e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorInput.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.ats.world;
+
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldEditorInput implements IEditorInput {
+
+ IWorldEditorProvider iWorldEditorProvider;
+
+ /**
+ * @return the iWorldEditorProvider
+ */
+ public IWorldEditorProvider getIWorldEditorProvider() {
+ return iWorldEditorProvider;
+ }
+
+ public WorldEditorInput(IWorldEditorProvider iWorldEditorProvider) {
+ this.iWorldEditorProvider = iWorldEditorProvider;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ try {
+ return iWorldEditorProvider.getName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Exception getting name: " + ex.getLocalizedMessage();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ @Override
+ public String getName() {
+ try {
+ return iWorldEditorProvider.getName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Exception getting name: " + ex.getLocalizedMessage();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItem.java
new file mode 100644
index 00000000000..9dd029590bc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItem.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.ats.world;
+
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class WorldEditorParameterSearchItem extends WorldSearchItem implements IWorldEditorParameterProvider, IDynamicWidgetLayoutListener, IXWidgetOptionResolver {
+
+ private CustomizeData customizeData;
+ private TableLoadOption[] tableLoadOptions;
+
+ /**
+ * @param name
+ * @param loadView
+ * @throws OseeArgumentException
+ */
+ public WorldEditorParameterSearchItem(String name, OseeImage oseeImage) throws OseeArgumentException {
+ super(name, LoadView.WorldEditor, oseeImage);
+ }
+
+ public WorldEditorParameterSearchItem(String name, LoadView loadView) throws OseeArgumentException {
+ this(name, loadView, null);
+ }
+
+ public WorldEditorParameterSearchItem(String name, LoadView loadView, OseeImage oseeImage) throws OseeArgumentException {
+ super(name, loadView, oseeImage);
+ }
+
+ /**
+ * @param worldSearchItem
+ * @throws OseeArgumentException
+ */
+ public WorldEditorParameterSearchItem(WorldSearchItem worldSearchItem) throws OseeArgumentException {
+ this(worldSearchItem, null);
+ }
+
+ public WorldEditorParameterSearchItem(WorldSearchItem worldSearchItem, OseeImage oseeImage) throws OseeArgumentException {
+ super(worldSearchItem, oseeImage);
+ }
+
+ public abstract String getParameterXWidgetXml() throws OseeCoreException;
+
+ public abstract Result isParameterSelectionValid() throws OseeCoreException;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#run(org.eclipse.osee.ats.world.WorldEditor, org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType, boolean)
+ */
+ @Override
+ public void run(WorldEditor worldEditor, SearchType searchType, boolean forcePend) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#getWidgetOptions(org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData)
+ */
+ @Override
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData widgetData) {
+ return null;
+ }
+
+ public void setCustomizeData(CustomizeData customizeData) {
+ this.customizeData = customizeData;
+ }
+
+ public void setTableLoadOptions(TableLoadOption... tableLoadOptions) {
+ this.tableLoadOptions = tableLoadOptions;
+ }
+
+ /**
+ * @return the customizeData
+ */
+ public CustomizeData getCustomizeData() {
+ return customizeData;
+ }
+
+ /**
+ * @return the tableLoadOptions
+ */
+ public TableLoadOption[] getTableLoadOptions() {
+ return tableLoadOptions;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItemProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItemProvider.java
new file mode 100644
index 00000000000..f66a4aece52
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorParameterSearchItemProvider.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.ats.world;
+
+import java.util.Collection;
+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.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldEditorParameterSearchItemProvider extends WorldEditorProvider implements IWorldEditorParameterProvider {
+
+ private final WorldEditorParameterSearchItem worldParameterSearchItem;
+ public static String ENTER_OPTIONS_AND_SELECT_SEARCH = "Enter options and select \"Search\"";
+ private boolean firstTime = true;
+
+ public WorldEditorParameterSearchItemProvider(WorldEditorParameterSearchItem worldParameterSearchItem) {
+ this(worldParameterSearchItem, null, TableLoadOption.None);
+ }
+
+ public WorldEditorParameterSearchItemProvider(WorldEditorParameterSearchItem worldParameterSearchItem, CustomizeData customizeData, TableLoadOption... tableLoadOptions) {
+ super(customizeData, tableLoadOptions);
+ this.worldParameterSearchItem = worldParameterSearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#copy(org.eclipse.osee.ats.world.IWorldEditorProvider)
+ */
+ @Override
+ public IWorldEditorProvider copyProvider() throws OseeArgumentException {
+ return new WorldEditorParameterSearchItemProvider(
+ (WorldEditorParameterSearchItem) worldParameterSearchItem.copy(), customizeData, tableLoadOptions);
+ }
+
+ /**
+ * @return the worldSearchItem
+ */
+ public WorldSearchItem getWorldSearchItem() {
+ return worldParameterSearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getName()
+ */
+ @Override
+ public String getName() throws OseeCoreException {
+ return worldParameterSearchItem.getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#run(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ public void run(WorldEditor worldEditor, SearchType searchType, boolean forcePend) throws OseeCoreException {
+ if (firstTime) {
+ firstTime = false;
+ worldEditor.setTableTitle(ENTER_OPTIONS_AND_SELECT_SEARCH, false);
+ return;
+ }
+ if (worldParameterSearchItem.isCancelled()) return;
+
+ Result result = worldParameterSearchItem.isParameterSelectionValid();
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+
+ LoadTableJob job = null;
+ job = new LoadTableJob(worldEditor, worldParameterSearchItem, searchType, tableLoadOptions);
+ job.setUser(false);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ if (forcePend) {
+ try {
+ job.join();
+ } catch (InterruptedException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ private class LoadTableJob extends Job {
+
+ private final WorldEditorParameterSearchItem worldParameterSearchItem;
+ private boolean cancel = false;
+ private final SearchType searchType;
+ private final WorldEditor worldEditor;
+ private final TableLoadOption[] tableLoadOptions;
+
+ public LoadTableJob(WorldEditor worldEditor, WorldEditorParameterSearchItem worldParameterSearchItem, SearchType searchType, TableLoadOption[] tableLoadOptions) throws OseeCoreException {
+ super("Loading \"" + worldParameterSearchItem.getSelectedName(searchType) + "\"...");
+ this.worldEditor = worldEditor;
+ this.worldParameterSearchItem = worldParameterSearchItem;
+ this.searchType = searchType;
+ this.tableLoadOptions = tableLoadOptions;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+
+ String selectedName = "";
+ try {
+ selectedName = worldParameterSearchItem.getSelectedName(searchType);
+ worldEditor.setEditorTitle(selectedName != null ? selectedName : worldParameterSearchItem.getName());
+ worldEditor.setTableTitle("Loading \"" + (selectedName != null ? selectedName : "") + "\"...", false);
+ cancel = false;
+ worldParameterSearchItem.setCancelled(cancel);
+ final Collection<? extends Artifact> artifacts;
+ worldEditor.getWorldComposite().getXViewer().clear();
+ artifacts = worldParameterSearchItem.performSearchGetResults(searchType);
+ if (artifacts.size() == 0) {
+ if (worldParameterSearchItem.isCancelled()) {
+ monitor.done();
+ worldEditor.setTableTitle("CANCELLED - " + selectedName, false);
+ return Status.CANCEL_STATUS;
+ } else {
+ monitor.done();
+ worldEditor.setTableTitle("No Results Found - " + selectedName, true);
+ return Status.OK_STATUS;
+ }
+ }
+ worldEditor.getWorldComposite().load(selectedName, artifacts, customizeData, tableLoadOptions);
+ } catch (final Exception ex) {
+ String str = "Exception occurred. Network may be down.";
+ if (ex.getLocalizedMessage() != null && !ex.getLocalizedMessage().equals("")) str +=
+ " => " + ex.getLocalizedMessage();
+ worldEditor.getWorldComposite().setTableTitle("Searching Error - " + selectedName, false);
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ monitor.done();
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, str, null);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getSelectedName(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return worldParameterSearchItem.getSelectedName(searchType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#getParameterXWidgetXml()
+ */
+ @Override
+ public String getParameterXWidgetXml() throws OseeCoreException {
+ return worldParameterSearchItem.getParameterXWidgetXml();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#performSearchGetResults(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public Collection<? extends Artifact> performSearchGetResults(SearchType searchType) throws OseeCoreException {
+ return worldParameterSearchItem.performSearchGetResults(searchType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#getDynamicWidgetLayoutListener()
+ */
+ @Override
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener() {
+ return worldParameterSearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorParameterProvider#getWidgetOptions(org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData)
+ */
+ @Override
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData widgetData) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorProvider.java
new file mode 100644
index 00000000000..71de08f1052
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorProvider.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.ats.world;
+
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class WorldEditorProvider implements IWorldEditorProvider {
+
+ protected TableLoadOption[] tableLoadOptions;
+ protected CustomizeData customizeData;
+
+ public WorldEditorProvider(CustomizeData customizeData, TableLoadOption[] tableLoadOptions) {
+ this.customizeData = customizeData;
+ this.tableLoadOptions = tableLoadOptions;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getSelectedName(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getTargetedVersionArtifact()
+ */
+ @Override
+ public VersionArtifact getTargetedVersionArtifact() throws OseeCoreException {
+ return null;
+ }
+
+ /**
+ * @return the tableLoadOptions
+ */
+ public TableLoadOption[] getTableLoadOptions() {
+ return tableLoadOptions;
+ }
+
+ /**
+ * @return the customizeData
+ */
+ public CustomizeData getCustomizeData() {
+ return customizeData;
+ }
+
+ /**
+ * @param tableLoadOptions the tableLoadOptions to set
+ */
+ public void setTableLoadOptions(TableLoadOption... tableLoadOptions) {
+ this.tableLoadOptions = tableLoadOptions;
+ }
+
+ /**
+ * @param customizeData the customizeData to set
+ */
+ public void setCustomizeData(CustomizeData customizeData) {
+ this.customizeData = customizeData;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorSimpleProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorSimpleProvider.java
new file mode 100644
index 00000000000..87305cacb6e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorSimpleProvider.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.ats.world;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldEditorSimpleProvider extends WorldEditorProvider {
+
+ private final String name;
+ private final Collection<? extends Artifact> artifacts;
+
+ public WorldEditorSimpleProvider(String name, Collection<? extends Artifact> artifacts) {
+ this(name, artifacts, null, TableLoadOption.None);
+ }
+
+ public WorldEditorSimpleProvider(String name, Collection<? extends Artifact> artifacts, CustomizeData customizeData, TableLoadOption... tableLoadOption) {
+ super(customizeData, tableLoadOption);
+ this.name = name;
+ this.artifacts = artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#copy(org.eclipse.osee.ats.world.IWorldEditorProvider)
+ */
+ @Override
+ public IWorldEditorProvider copyProvider() {
+ return new WorldEditorSimpleProvider(name, artifacts, customizeData, tableLoadOptions);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#run(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public void run(WorldEditor worldEditor, SearchType searchtype, boolean forcePend) throws OseeCoreException {
+ worldEditor.getWorldComposite().load(name, artifacts, customizeData, getTableLoadOptions());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getName()
+ */
+ @Override
+ public String getName() throws OseeCoreException {
+ return name;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorUISearchItemProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorUISearchItemProvider.java
new file mode 100644
index 00000000000..c681a54b1b1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldEditorUISearchItemProvider.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world;
+
+import java.util.Collection;
+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.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.world.search.NextVersionSearchItem;
+import org.eclipse.osee.ats.world.search.VersionTargetedForTeamSearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem;
+import org.eclipse.osee.ats.world.search.WorldUISearchItem;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldEditorUISearchItemProvider extends WorldEditorProvider {
+
+ private final WorldUISearchItem worldUISearchItem;
+
+ public WorldEditorUISearchItemProvider(WorldUISearchItem worldUISearchItem) {
+ this(worldUISearchItem, null, TableLoadOption.None);
+ }
+
+ public WorldEditorUISearchItemProvider(WorldUISearchItem worldUISearchItem, CustomizeData customizeData, TableLoadOption... tableLoadOptions) {
+ super(customizeData, tableLoadOptions);
+ this.worldUISearchItem = worldUISearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#copy(org.eclipse.osee.ats.world.IWorldEditorProvider)
+ */
+ @Override
+ public IWorldEditorProvider copyProvider() throws OseeArgumentException {
+ return new WorldEditorUISearchItemProvider((WorldUISearchItem) worldUISearchItem.copy(), customizeData,
+ tableLoadOptions);
+ }
+
+ /**
+ * @return the worldSearchItem
+ */
+ public WorldSearchItem getWorldSearchItem() {
+ return worldUISearchItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getName()
+ */
+ @Override
+ public String getName() throws OseeCoreException {
+ return worldUISearchItem.getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getSelectedName(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return worldUISearchItem.getSelectedName(searchType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#run(org.eclipse.osee.ats.world.WorldEditor)
+ */
+ @Override
+ public void run(WorldEditor worldEditor, SearchType searchType, boolean forcePend) throws OseeCoreException {
+
+ Collection<TableLoadOption> options = Collections.getAggregate(tableLoadOptions);
+ if (!options.contains(TableLoadOption.NoUI) && searchType == SearchType.Search) {
+ worldUISearchItem.performUI(searchType);
+ }
+ if (worldUISearchItem.isCancelled()) {
+ worldEditor.close(false);
+ return;
+ }
+
+ LoadTableJob job = null;
+ job = new LoadTableJob(worldEditor, worldUISearchItem, searchType);
+ job.setUser(false);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ if (options.contains(TableLoadOption.ForcePend)) {
+ try {
+ job.join();
+ } catch (InterruptedException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private class LoadTableJob extends Job {
+
+ private final WorldUISearchItem worldUISearchItem;
+ private boolean cancel = false;
+ private final SearchType searchType;
+ private final WorldEditor worldEditor;
+
+ public LoadTableJob(WorldEditor worldEditor, WorldUISearchItem worldUISearchItem, SearchType searchType) throws OseeCoreException {
+ super("Loading \"" + worldUISearchItem.getSelectedName(searchType) + "\"...");
+ this.worldEditor = worldEditor;
+ this.worldUISearchItem = worldUISearchItem;
+ this.searchType = searchType;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ String selectedName = "";
+ try {
+ selectedName = worldUISearchItem.getSelectedName(searchType);
+ worldEditor.setEditorTitle(selectedName != null ? selectedName : worldUISearchItem.getName());
+ worldEditor.setTableTitle("Loading \"" + (selectedName != null ? selectedName : "") + "\"...", false);
+ cancel = false;
+ worldUISearchItem.setCancelled(cancel);
+ final Collection<Artifact> artifacts;
+ worldEditor.getWorldComposite().getXViewer().clear();
+ artifacts = worldUISearchItem.performSearchGetResults(false, searchType);
+ if (artifacts.size() == 0) {
+ if (worldUISearchItem.isCancelled()) {
+ worldEditor.setTableTitle("CANCELLED - " + selectedName, false);
+ return Status.CANCEL_STATUS;
+ } else {
+ worldEditor.setTableTitle("No Results Found - " + selectedName, true);
+ return Status.OK_STATUS;
+ }
+ }
+ worldEditor.getWorldComposite().load((selectedName != null ? selectedName : ""), artifacts, customizeData);
+ } catch (final Exception ex) {
+ worldEditor.getWorldComposite().setTableTitle("Searching Error - " + selectedName, false);
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+
+ return Status.OK_STATUS;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.IWorldEditorProvider#getTargetedVersionArtifact()
+ */
+ @Override
+ public VersionArtifact getTargetedVersionArtifact() throws OseeCoreException {
+ if (worldUISearchItem instanceof VersionTargetedForTeamSearchItem) {
+ return ((VersionTargetedForTeamSearchItem) worldUISearchItem).getSearchVersionArtifact();
+ } else if (worldUISearchItem instanceof NextVersionSearchItem) {
+ return ((NextVersionSearchItem) worldUISearchItem).getSelectedVersionArt();
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java
new file mode 100644
index 00000000000..63488ce5b07
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldLabelProvider.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.widgets.dialog.TaskResOptionDefinition;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+public class WorldLabelProvider extends XViewerLabelProvider {
+
+ private final WorldXViewer treeViewer;
+ protected Font font;
+
+ public WorldLabelProvider(WorldXViewer treeViewer) {
+ super(treeViewer);
+ this.treeViewer = treeViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) {
+ try {
+ if (!(element instanceof IWorldViewArtifact)) return null;
+ IWorldViewArtifact wva = (IWorldViewArtifact) element;
+ if (xCol.equals(WorldXViewerFactory.Change_Type_Col))
+ return wva.getWorldViewChangeType().getImage();
+ else if (xCol.equals(WorldXViewerFactory.Type_Col))
+ return ImageManager.getImage((Artifact) element);
+ else if (xCol.equals(WorldXViewerFactory.Assignees_Col))
+ return wva.getAssigneeImage();
+ else if (xCol.equals(WorldXViewerFactory.Deadline_Col)) {
+ if (wva.isWorldViewDeadlineAlerting().isTrue()) return ImageManager.getImage(FrameworkImage.WARNING);
+ } else if (xCol.equals(WorldXViewerFactory.Artifact_Type_Col)) {
+ return ImageManager.getImage((Artifact) wva);
+ }
+ for (IAtsWorldEditorItem item : AtsWorldEditorItems.getItems()) {
+ if (item.isXColumnProvider(xCol)) {
+ Image image = item.getColumnImage(element, xCol, columnIndex);
+ if (image != null) return image;
+ }
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+
+ @Override
+ public Color getForeground(Object element, XViewerColumn xCol, int columnIndex) {
+ try {
+ if ((element instanceof TaskArtifact) && xCol.equals(WorldXViewerFactory.Resolution_Col)) {
+ TaskArtifact taskArt = (TaskArtifact) element;
+ TaskResOptionDefinition def = taskArt.getTaskResolutionOptionDefinition(taskArt.getWorldViewResolution());
+ if (def != null) {
+ return Display.getCurrent().getSystemColor(def.getColorInt());
+ }
+ }
+ for (IAtsWorldEditorItem item : AtsWorldEditorItems.getItems()) {
+ if (item.isXColumnProvider(xCol)) {
+ Color color = item.getForeground(element, xCol, columnIndex);
+ if (color != null) return color;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) {
+ try {
+ // NOTE: HRID, Type, Title are handled by XViewerValueColumn values
+ if (!(element instanceof IWorldViewArtifact)) return "";
+ IWorldViewArtifact wva = (IWorldViewArtifact) element;
+ Artifact art = (Artifact) element;
+ if (art.isDeleted()) {
+ if (xCol.equals(WorldXViewerFactory.ID_Col))
+ return art.getHumanReadableId();
+ else if (xCol.equals(WorldXViewerFactory.Title_Col))
+ return art.getInternalDescriptiveName();
+ else
+ return "<deleted>";
+ }
+ if (xCol.equals(WorldXViewerFactory.Type_Col)) return wva.getWorldViewType();
+ if (xCol.equals(WorldXViewerFactory.State_Col)) return wva.getWorldViewState();
+ if (xCol.equals(WorldXViewerFactory.Assignees_Col)) return wva.getWorldViewActivePoc();
+ if (xCol.equals(WorldXViewerFactory.Change_Type_Col)) return wva.getWorldViewChangeTypeStr();
+ if (xCol.equals(WorldXViewerFactory.Priority_Col)) return wva.getWorldViewPriority();
+ if (xCol.equals(WorldXViewerFactory.Actionable_Items_Col)) return wva.getWorldViewActionableItems();
+ if (xCol.equals(WorldXViewerFactory.User_Community_Col)) return wva.getWorldViewUserCommunity();
+ if (xCol.equals(WorldXViewerFactory.Version_Target_Col)) return wva.getWorldViewTargetedVersionStr();
+ if (xCol.equals(WorldXViewerFactory.Notes_Col)) return wva.getWorldViewNotes();
+
+ if (xCol.equals(WorldXViewerFactory.Resolution_Col)) return wva.getWorldViewResolution();
+ if (xCol.equals(WorldXViewerFactory.Groups_Col)) return wva.getWorldViewGroups();
+ if (xCol.equals(WorldXViewerFactory.Legacy_PCR_Col)) return wva.getWorldViewLegacyPCR();
+ if (xCol.equals(WorldXViewerFactory.Created_Date_Col)) return wva.getWorldViewCreatedDateStr();
+ if (xCol.equals(WorldXViewerFactory.Completed_Date_Col)) return wva.getWorldViewCompletedDateStr();
+ if (xCol.equals(WorldXViewerFactory.Cancelled_Date_Col)) return wva.getWorldViewCancelledDateStr();
+ if (xCol.equals(WorldXViewerFactory.Team_Col)) return wva.getWorldViewTeam();
+ if (xCol.equals(WorldXViewerFactory.Related_To_State_Col)) return wva.getWorldViewRelatedToState();
+ if (xCol.equals(WorldXViewerFactory.Originator_Col)) return wva.getWorldViewOriginator();
+ if (xCol.equals(WorldXViewerFactory.Branch_Status_Col)) return wva.getWorldViewBranchStatus();
+ if (xCol.equals(WorldXViewerFactory.Decision_Col)) return wva.getWorldViewDecision();
+ if (xCol.equals(WorldXViewerFactory.Estimated_Hours_Col)) return AtsLib.doubleToStrString(wva.getWorldViewEstimatedHours());
+ if (xCol.equals(WorldXViewerFactory.Remaining_Hours_Col)) {
+ Result result = wva.isWorldViewRemainHoursValid();
+ if (result.isFalse()) return result.getText();
+ return AtsLib.doubleToStrString(wva.getWorldViewRemainHours());
+ }
+ if (xCol.equals(WorldXViewerFactory.Percent_Complete_State_Col)) return String.valueOf(wva.getWorldViewPercentCompleteState());
+ if (xCol.equals(WorldXViewerFactory.Percent_Complete_State_Task_Col)) return String.valueOf(wva.getWorldViewPercentCompleteStateTask());
+ if (xCol.equals(WorldXViewerFactory.Percent_Complete_State_Review_Col)) return String.valueOf(wva.getWorldViewPercentCompleteStateReview());
+ if (xCol.equals(WorldXViewerFactory.Percent_Complete_Total_Col)) return String.valueOf(wva.getWorldViewPercentCompleteTotal());
+ if (xCol.equals(WorldXViewerFactory.Hours_Spent_State_Col)) return AtsLib.doubleToStrString(wva.getWorldViewHoursSpentState());
+ if (xCol.equals(WorldXViewerFactory.Hours_Spent_State_Task_Col)) return AtsLib.doubleToStrString(wva.getWorldViewHoursSpentStateTask());
+ if (xCol.equals(WorldXViewerFactory.Hours_Spent_State_Review_Col)) return AtsLib.doubleToStrString(wva.getWorldViewHoursSpentStateReview());
+ if (xCol.equals(WorldXViewerFactory.Hours_Spent_Total_Col)) return AtsLib.doubleToStrString(wva.getWorldViewHoursSpentStateTotal());
+
+ if (xCol.equals(WorldXViewerFactory.Total_Hours_Spent_Col)) return AtsLib.doubleToStrString(wva.getWorldViewHoursSpentTotal());
+
+ if (xCol.equals(WorldXViewerFactory.Percent_Rework_Col)) return wva.getWorldViewPercentReworkStr();
+ if (xCol.equals(WorldXViewerFactory.Estimated_Release_Date_Col)) return wva.getWorldViewEstimatedReleaseDateStr();
+ if (xCol.equals(WorldXViewerFactory.Estimated_Completion_Date_Col)) return wva.getWorldViewEstimatedCompletionDateStr();
+ if (xCol.equals(WorldXViewerFactory.Release_Date_Col)) return wva.getWorldViewReleaseDateStr();
+ if (xCol.equals(WorldXViewerFactory.Deadline_Col)) return wva.getWorldViewDeadlineDateStr();
+ if (xCol.equals(WorldXViewerFactory.Work_Package_Col)) return wva.getWorldViewWorkPackage();
+ if (xCol.equals(WorldXViewerFactory.Category_Col)) return wva.getWorldViewCategory();
+ if (xCol.equals(WorldXViewerFactory.Category2_Col)) return wva.getWorldViewCategory2();
+ if (xCol.equals(WorldXViewerFactory.Category3_Col)) return wva.getWorldViewCategory3();
+ if (xCol.equals(WorldXViewerFactory.Number_of_Tasks_Col)) return wva.getWorldViewNumberOfTasks();
+ if (xCol.equals(WorldXViewerFactory.Review_Issues)) return wva.getWorldViewNumberOfReviewIssueDefects();
+ if (xCol.equals(WorldXViewerFactory.Review_Major_Defects)) return wva.getWorldViewNumberOfReviewMajorDefects();
+ if (xCol.equals(WorldXViewerFactory.Review_Minor_Defects)) return wva.getWorldViewNumberOfReviewMinorDefects();
+ if (xCol.equals(WorldXViewerFactory.Last_Modified_Col)) return wva.getWorldViewLastUpdated();
+ if (xCol.equals(WorldXViewerFactory.Last_Statused_Col)) return wva.getWorldViewLastStatused();
+ if (xCol.equals(WorldXViewerFactory.Description_Col)) return wva.getWorldViewDescription();
+ if (xCol.equals(WorldXViewerFactory.Validation_Required_Col)) return wva.getWorldViewValidationRequiredStr();
+ if (xCol.equals(WorldXViewerFactory.Implementor_Col)) return wva.getWorldViewImplementer();
+ if (xCol.equals(WorldXViewerFactory.Review_Author_Col)) return wva.getWorldViewReviewAuthor();
+ if (xCol.equals(WorldXViewerFactory.Review_Moderator_Col)) return wva.getWorldViewReviewModerator();
+ if (xCol.equals(WorldXViewerFactory.Review_Reviewer_Col)) return wva.getWorldViewReviewReviewer();
+ if (xCol.equals(WorldXViewerFactory.Review_Decider_Col)) return wva.getWorldViewReviewDecider();
+ if (xCol.equals(WorldXViewerFactory.Actions_Initiating_Workflow_Col)) return wva.getWorldViewActionsIntiatingWorkflow();
+ if (xCol.equals(WorldXViewerFactory.Parent_ID_Col)) return wva.getWorldViewParentID();
+ if (xCol.equals(WorldXViewerFactory.Parent_State_Col)) return wva.getWorldViewParentState();
+ if (xCol.equals(WorldXViewerFactory.Days_In_Current_State)) return wva.getWorldViewDaysInCurrentState();
+ if (xCol.equals(WorldXViewerFactory.Weekly_Benefit_Hrs_Col)) return AtsLib.doubleToStrString(
+ wva.getWorldViewWeeklyBenefit(), true);
+ if (xCol.equals(WorldXViewerFactory.Annual_Cost_Avoidance_Col)) {
+ Result result = wva.isWorldViewAnnualCostAvoidanceValid();
+ if (result.isFalse()) return result.getText();
+ return AtsLib.doubleToStrString(wva.getWorldViewAnnualCostAvoidance(), true);
+ }
+ if (xCol.equals(WorldXViewerFactory.Man_Days_Needed_Col)) {
+ Result result = wva.isWorldViewManDaysNeededValid();
+ if (result.isFalse()) return result.getText();
+ return AtsLib.doubleToStrString(wva.getWorldViewManDaysNeeded());
+ }
+ if (xCol.equals(WorldXViewerFactory.Artifact_Type_Col)) return ((Artifact) wva).getArtifactTypeName();
+ if (xCol.equals(WorldXViewerFactory.Originating_Workflow)) {
+ return wva.getWorldViewOriginatingWorkflowStr();
+ }
+ for (IAtsWorldEditorItem item : AtsWorldEditorItems.getItems()) {
+ if (item.isXColumnProvider(xCol)) {
+ String text = item.getColumnText(element, xCol, columnIndex);
+ if (text != null) return text;
+ }
+ }
+
+ return "Unhandled Column";
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public WorldXViewer getTreeViewer() {
+ return treeViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldViewDragAndDrop.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldViewDragAndDrop.java
new file mode 100644
index 00000000000..6d43c9ee656
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldViewDragAndDrop.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.ats.world;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+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.viewers.IStructuredSelection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.world.search.GroupWorldSearchItem;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldViewDragAndDrop extends SkynetDragAndDrop {
+
+ private final WorldComposite worldComposite;
+
+ public WorldViewDragAndDrop(WorldComposite worldComposite, String viewId) {
+ super(worldComposite.getXViewer().getTree(), viewId);
+ this.worldComposite = worldComposite;
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) worldComposite.getXViewer().getSelection();
+ Iterator<?> i = selection.iterator();
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ while (i.hasNext()) {
+ Object object = i.next();
+ if (object instanceof Artifact) artifacts.add((Artifact) object);
+ }
+ return artifacts.toArray(new Artifact[artifacts.size()]);
+ }
+
+ private boolean isValidForArtifactDrop(DropTargetEvent event) {
+ if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType);
+
+ if (artData != null) {
+ Artifact[] artifacts = artData.getArtifacts();
+ for (Artifact art : artifacts) {
+ if ((art instanceof IWorldViewArtifact) || art.getArtifactTypeName().equals(
+ UniversalGroup.ARTIFACT_TYPE_NAME)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ if (isValidForArtifactDrop(event)) {
+ event.detail = DND.DROP_COPY;
+ }
+ }
+
+ @Override
+ public void performDrop(final DropTargetEvent event) {
+ if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ final ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType);
+ Job job = new Job("Loading WorldView...") {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ String name = "Dropped Artifacts";
+ Set<Artifact> arts = new HashSet<Artifact>();
+ if (artData != null) {
+ Artifact[] artifacts = artData.getArtifacts();
+ if (artifacts.length == 1) {
+ Artifact art = artifacts[0];
+ if (art instanceof IWorldViewArtifact) {
+ name = art.getDescriptiveName();
+ } else if (art.getArtifactTypeName().equals(UniversalGroup.ARTIFACT_TYPE_NAME)) {
+ GroupWorldSearchItem groupWorldSearchItem = new GroupWorldSearchItem(art.getBranch());
+ groupWorldSearchItem.setSelectedGroup(art);
+ WorldEditor.open(new WorldEditorUISearchItemProvider(groupWorldSearchItem, null,
+ TableLoadOption.NoUI));
+ return Status.OK_STATUS;
+ }
+ }
+ for (Artifact art : artifacts) {
+ if (art instanceof IWorldViewArtifact) {
+ arts.add(art);
+ } else if (art.getArtifactTypeName().equals(UniversalGroup.ARTIFACT_TYPE_NAME)) {
+ for (Artifact relArt : art.getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS)) {
+ if (relArt instanceof IWorldViewArtifact) {
+ arts.add(relArt);
+ }
+ }
+ }
+ }
+ }
+ if (arts.size() > 0) {
+ WorldEditor.open(new WorldEditorSimpleProvider(name, arts));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return new Status(Status.ERROR, AtsPlugin.PLUGIN_ID, ex.getLocalizedMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXNavigateItemAction.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXNavigateItemAction.java
new file mode 100644
index 00000000000..62d1867f0f0
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXNavigateItemAction.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.ats.world;
+
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldXNavigateItemAction extends XNavigateItemAction {
+
+ /**
+ * @param parent
+ * @param name
+ * @param oseeImage
+ * @throws OseeArgumentException
+ */
+ public WorldXNavigateItemAction(XNavigateItem parent, String name, OseeImage oseeImage) throws OseeArgumentException {
+ super(parent, name, oseeImage);
+ }
+
+ /**
+ * @param parent
+ * @param name
+ * @throws OseeArgumentException
+ */
+ public WorldXNavigateItemAction(XNavigateItem parent, String name) throws OseeArgumentException {
+ super(parent, name, determineImage(name));
+ }
+
+ private static OseeImage determineImage(String name) {
+ if (name.contains("Report")) {
+ return AtsImage.REPORT;
+ } else if (name.contains("Search")) {
+ return FrameworkImage.FLASHLIGHT;
+ } else if (name.contains("Task")) {
+ return AtsImage.TASK;
+ }
+ return AtsImage.GLOBE;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java
new file mode 100644
index 00000000000..e07bd90a4e7
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewer.java
@@ -0,0 +1,991 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
+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.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.nebula.widgets.xviewer.IXViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.IFavoriteableArtifact;
+import org.eclipse.osee.ats.artifact.ISubscribableArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.editor.SMAManager;
+import org.eclipse.osee.ats.editor.SMAPromptChangeStatus;
+import org.eclipse.osee.ats.task.TaskEditor;
+import org.eclipse.osee.ats.task.TaskEditorSimpleProvider;
+import org.eclipse.osee.ats.task.TaskXViewer;
+import org.eclipse.osee.ats.util.ArtifactEmailWizard;
+import org.eclipse.osee.ats.util.AtsDeleteManager;
+import org.eclipse.osee.ats.util.AtsLib;
+import org.eclipse.osee.ats.util.Favorites;
+import org.eclipse.osee.ats.util.Subscribe;
+import org.eclipse.osee.ats.util.AtsDeleteManager.DeleteOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.AtsOpenOption;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerAttributeColumn;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldXViewer extends XViewer implements IArtifactsPurgedEventListener, IArtifactsChangeTypeEventListener, IFrameworkTransactionEventListener {
+ private String title;
+ private String extendedStatusString = "";
+ public static final String MENU_GROUP_ATS_WORLD_EDIT = "ATS WORLD EDIT";
+ public static final String MENU_GROUP_ATS_WORLD_OPEN = "ATS WORLD OPEN";
+ public static final String MENU_GROUP_ATS_WORLD_OTHER = "ATS WORLD OTHER";
+ public static final String ADD_AS_FAVORITE = "Add as Favorite";
+ public static final String REMOVE_FAVORITE = "Remove Favorite";
+ public static final String SUBSCRIBE = "Subscribe for Notifications";
+ public static final String UN_SUBSCRIBE = "Un-Subscribe for Notifications";
+ public final WorldXViewer thisXViewer = this;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public WorldXViewer(Composite parent, int style) {
+ this(parent, style, new WorldXViewerFactory());
+ }
+
+ public WorldXViewer(Composite parent, int style, IXViewerFactory xViewerFactory) {
+ super(parent, style, xViewerFactory);
+ }
+
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.getLoadedArtifacts().size() == 0) return;
+ // ContentProvider ensures in display thread
+ ((WorldContentProvider) getContentProvider()).removeAll(loadedArtifacts.getLoadedArtifacts());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, final LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.getLoadedArtifacts().size() == 0) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ ((WorldContentProvider) getContentProvider()).removeAll(loadedArtifacts.getLoadedArtifacts());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId != AtsPlugin.getAtsBranch().getBranchId()) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (getContentProvider() == null) return;
+ if (transData.cacheDeletedArtifacts.size() > 0) {
+ ((WorldContentProvider) getContentProvider()).removeAll(transData.cacheDeletedArtifacts);
+ }
+ if (transData.cacheChangedArtifacts.size() > 0) {
+ ((WorldContentProvider) getContentProvider()).updateAll(transData.cacheChangedArtifacts);
+ for (Artifact art : transData.cacheChangedArtifacts) {
+ if (art instanceof IWorldViewArtifact) {
+ // If parent is loaded and child changed, refresh parent
+ try {
+ if ((art instanceof StateMachineArtifact) && (((StateMachineArtifact) art).getParentAtsArtifact() instanceof IWorldViewArtifact)) {
+ update(((StateMachineArtifact) art).getParentAtsArtifact(), null);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ Set<Artifact> arts = new HashSet<Artifact>();
+ arts.addAll(transData.cacheRelationAddedArtifacts);
+ arts.addAll(transData.cacheRelationChangedArtifacts);
+ arts.addAll(transData.cacheRelationDeletedArtifacts);
+ for (Artifact art : arts) {
+ if (art instanceof IWorldViewArtifact) {
+ refresh(art);
+ // If parent is loaded and child changed, refresh parent
+ try {
+ if ((art instanceof StateMachineArtifact) && (((StateMachineArtifact) art).getParentAtsArtifact() instanceof IWorldViewArtifact)) {
+ refresh(((StateMachineArtifact) art).getParentAtsArtifact());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ parent.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ ((WorldContentProvider) getContentProvider()).clear();
+ }
+ });
+ createMenuActions();
+ OseeEventManager.addListener(this);
+ }
+
+ Action editStatusAction, editNotesAction, editEstimateAction, editChangeTypeAction, editPriorityAction,
+ editTargetVersionAction, editAssigneeAction, editActionableItemsAction;
+ Action convertActionableItemsAction;
+ Action openInArtifactEditorAction, openInAtsWorkflowEditorAction, openInMassEditorAction,
+ openInAtsWorldEditorAction, openInAtsTaskEditorAction;
+ Action favoritesAction;
+ Action subscribedAction;
+ Action deletePurgeAtsObjectAction;
+ Action emailAction;
+ Action resetActionArtifactAction;
+
+ public void createMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+
+ editNotesAction = new Action("Edit Notes", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (SMAManager.promptChangeAttribute(ATSAttributes.SMA_NOTE_ATTRIBUTE, getSelectedSMAArtifacts(), true,
+ true)) {
+ update(getSelectedSMAArtifacts().toArray(), null);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editStatusAction = new Action("Edit Status", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (SMAPromptChangeStatus.promptChangeStatus(getSelectedSMAArtifacts(), true)) {
+ update(getSelectedSMAArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editEstimateAction = new Action("Edit Estimated Hours", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (ArtifactPromptChange.promptChangeFloatAttribute(
+ ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getStoreName(),
+ ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE.getDisplayName(), getSelectedSMAArtifacts(), true)) {
+ update(getSelectedSMAArtifacts().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editChangeTypeAction = new Action("Edit Change Type", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (SMAManager.promptChangeType(getSelectedTeamWorkflowArtifacts(), true)) {
+ update(getSelectedArtifactItems().toArray(), null);
+ }
+ }
+ };
+
+ editPriorityAction = new Action("Edit Priority", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (SMAManager.promptChangePriority(getSelectedTeamWorkflowArtifacts(), true)) {
+ update(getSelectedArtifactItems().toArray(), null);
+ }
+ }
+ };
+
+ editTargetVersionAction = new Action("Edit Targeted Version", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (SMAManager.promptChangeVersion(getSelectedTeamWorkflowArtifacts(),
+ (AtsPlugin.isAtsAdmin() ? VersionReleaseType.Both : VersionReleaseType.UnReleased), true)) {
+ update(getSelectedArtifactItems().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editAssigneeAction = new Action("Edit Assignee", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ Set<StateMachineArtifact> artifacts = getSelectedSMAArtifacts();
+ if (SMAManager.promptChangeAssignees(artifacts, false)) {
+ Artifacts.persistInTransaction(artifacts);
+ update(getSelectedArtifactItems().toArray(), null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ editActionableItemsAction = new Action("Edit Actionable Item(s)", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ if (getSelectedActionArtifacts().size() == 1) {
+ ActionArtifact actionArt = getSelectedActionArtifacts().iterator().next();
+ AtsLib.editActionableItems(actionArt);
+ refresh(getSelectedArtifactItems().iterator().next());
+ } else {
+ TeamWorkFlowArtifact teamArt = getSelectedTeamWorkflowArtifacts().iterator().next();
+ AtsLib.editActionableItems(teamArt);
+ refresh(getSelectedArtifactItems().toArray()[0]);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ convertActionableItemsAction = new Action("Convert to Actionable Item/Team", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ TeamWorkFlowArtifact teamArt = getSelectedTeamWorkflowArtifacts().iterator().next();
+ Result result = teamArt.convertActionableItems();
+ if (result.isFalse() && !result.getText().equals("")) result.popup();
+ refresh(getSelectedArtifactItems().iterator().next());
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ openInMassEditorAction = new Action("Open in Mass Editor", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (getSelectedArtifacts().size() == 0) {
+ AWorkbench.popup("Error", "No items selected");
+ return;
+ }
+ MassArtifactEditor.editArtifacts("", getSelectedArtifacts());
+ }
+ };
+
+ openInAtsWorkflowEditorAction = new Action("Open in ATS Workflow Editor", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ AtsLib.openAtsAction(getSelectedArtifactItems().iterator().next(), AtsOpenOption.OpenOneOrPopupSelect);
+ }
+ };
+
+ openInAtsWorldEditorAction = new Action("Open in ATS World Editor", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (getSelectedArtifacts().size() == 0) {
+ AWorkbench.popup("Error", "No items selected");
+ return;
+ }
+ WorldEditorInput worldEditorInput = null;
+ if (thisXViewer instanceof TaskXViewer) {
+ worldEditorInput =
+ new WorldEditorInput(new WorldEditorSimpleProvider("ATS World", getSelectedArtifacts(), null,
+ TableLoadOption.None));
+ } else {
+ worldEditorInput =
+ new WorldEditorInput(new WorldEditorSimpleProvider("ATS World", getSelectedArtifacts(),
+ getCustomizeMgr().generateCustDataFromTable(), TableLoadOption.None));
+ }
+ if (worldEditorInput != null) {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ page.openEditor(worldEditorInput, WorldEditor.EDITOR_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ };
+
+ openInAtsTaskEditorAction = new Action("Open in ATS Task Editor", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (getSelectedTaskArtifacts().size() == 0) {
+ AWorkbench.popup("Error", "No Tasks selected");
+ return;
+ }
+ try {
+ TaskEditor.open(new TaskEditorSimpleProvider("ATS Tasks", getSelectedTaskArtifacts()));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ favoritesAction = new Action("Add as Favorite", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (getSelectedSMA() != null) (new Favorites(getSelectedSMAArtifacts())).toggleFavorite();
+ }
+ };
+
+ subscribedAction = new Action("Subscribe for Notifications", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (getSelectedSMA() != null) (new Subscribe(getSelectedSMAArtifacts())).toggleSubscribe();
+ }
+ };
+
+ openInArtifactEditorAction = new Action("Open in Artifact Editor", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ if (getSelectedArtifacts().size() > 0)
+ ArtifactEditor.editArtifact(getSelectedArtifactItems().iterator().next());
+ else {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, new Exception("Can't retrieve SMA"));
+ }
+ }
+ };
+
+ deletePurgeAtsObjectAction = new Action("Delete/Purge ATS Object", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ AtsDeleteManager.handleDeletePurgeAtsObject(getSelectedArtifacts(), DeleteOption.Prompt);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ emailAction = new Action("Email ATS Object", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ handleEmailSelectedAtsObject();
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ resetActionArtifactAction = new Action("Reset Action off Children", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ SkynetTransaction transaction;
+ try {
+ transaction = new SkynetTransaction(AtsPlugin.getAtsBranch());
+ for (ActionArtifact actionArt : getSelectedActionArtifacts()) {
+ actionArt.resetAttributesOffChildren(transaction);
+ }
+ transaction.execute();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ }
+ };
+ }
+
+ @Override
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ handleColumnMultiEdit(treeColumn, treeItems, true);
+ }
+
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems, final boolean persist) {
+ if (!(treeColumn.getData() instanceof XViewerAttributeColumn)) {
+ AWorkbench.popup("ERROR", "Column is not attribute and thus not multi-editable " + treeColumn.getText());
+ return;
+ }
+ final XViewerAttributeColumn xCol = (XViewerAttributeColumn) treeColumn.getData();
+ XResultData rData = new XResultData();
+ final String attrName = xCol.getAttributeTypeName();
+ if (attrName == null) {
+ AWorkbench.popup("ERROR", "Can't retrieve attribute name from attribute column " + treeColumn.getText());
+ return;
+ }
+ final Set<Artifact> useArts = new HashSet<Artifact>();
+ for (TreeItem item : treeItems) {
+ Artifact art = (Artifact) item.getData();
+ try {
+ if (art.isAttributeTypeValid(attrName)) {
+ useArts.add(art);
+ } else {
+ rData.logError(attrName + " not valid for artifact " + art.getHumanReadableId() + " - " + art.getDescriptiveName());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ rData.logError(ex.getLocalizedMessage());
+ }
+ }
+
+ try {
+ if (!rData.isEmpty()) {
+ rData.report("Column Multi Edit Errors");
+ return;
+ }
+ if (useArts.size() > 0) {
+ ArtifactPromptChange.promptChangeAttribute(attrName, xCol.getName(), useArts, persist);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ @Override
+ public boolean isColumnMultiEditable(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ if (!(treeColumn.getData() instanceof XViewerColumn)) return false;
+ if (!((XViewerColumn) treeColumn.getData()).isMultiColumnEditable()) {
+ return false;
+ }
+ // Currently don't know how to multi-edit anything but attribute
+ if (!(treeColumn.getData() instanceof XViewerAttributeColumn)) return false;
+ XViewerAttributeColumn xCol = (XViewerAttributeColumn) treeColumn.getData();
+ final String attrName = xCol.getAttributeTypeName();
+ if (attrName == null) {
+ AWorkbench.popup("ERROR", "Can't retrieve attribute name from attribute column " + treeColumn.getText());
+ return false;
+ }
+ if (attrName == null) return false;
+ for (TreeItem item : treeItems) {
+ if (item.getData() instanceof ActionArtifact) return false;
+ try {
+ if (!((Artifact) item.getData()).isAttributeTypeValid(attrName)) {
+ return false;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isColumnMultiEditEnabled() {
+ return true;
+ }
+
+ public void handleEmailSelectedAtsObject() throws OseeCoreException {
+ Artifact art = getSelectedArtifacts().iterator().next();
+ if (art instanceof ActionArtifact) {
+ if (((ActionArtifact) art).getTeamWorkFlowArtifacts().size() > 1) {
+ art = AtsLib.promptSelectTeamWorkflow((ActionArtifact) art);
+ if (art == null) return;
+ } else
+ art = ((ActionArtifact) art).getTeamWorkFlowArtifacts().iterator().next();
+ }
+ if (art != null) {
+ ArtifactEmailWizard ew = new ArtifactEmailWizard((StateMachineArtifact) art);
+ WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), ew);
+ dialog.create();
+ dialog.open();
+ }
+ }
+
+ public StateMachineArtifact getSelectedSMA() {
+ Object obj = null;
+ if (getSelectedArtifactItems().size() == 0) return null;
+ obj = (getTree().getSelection()[0]).getData();
+ return (obj != null && (obj instanceof StateMachineArtifact)) ? (StateMachineArtifact) obj : null;
+ }
+
+ public void updateEditMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ // EDIT MENU BLOCK
+ mm.insertBefore(MENU_GROUP_PRE, editChangeTypeAction);
+ editChangeTypeAction.setEnabled(getSelectedTeamWorkflowArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editPriorityAction);
+ editPriorityAction.setEnabled(getSelectedTeamWorkflowArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editTargetVersionAction);
+ editTargetVersionAction.setEnabled(getSelectedTeamWorkflowArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editAssigneeAction);
+ editAssigneeAction.setEnabled(getSelectedSMAArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editStatusAction);
+ editStatusAction.setEnabled(getSelectedSMAArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editEstimateAction);
+ editEstimateAction.setEnabled(getSelectedSMAArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editNotesAction);
+ editNotesAction.setEnabled(getSelectedSMAArtifacts().size() > 0);
+
+ mm.insertBefore(MENU_GROUP_PRE, editActionableItemsAction);
+ editActionableItemsAction.setEnabled(getSelectedActionArtifacts().size() == 1 || getSelectedTeamWorkflowArtifacts().size() == 1);
+
+ mm.insertBefore(MENU_GROUP_PRE, convertActionableItemsAction);
+ convertActionableItemsAction.setEnabled(getSelectedTeamWorkflowArtifacts().size() == 1);
+
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ mm.insertBefore(XViewer.MENU_GROUP_PRE, new GroupMarker(MENU_GROUP_ATS_WORLD_EDIT));
+ updateEditMenuActions();
+
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+
+ // OPEN MENU BLOCK
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ mm.insertBefore(MENU_GROUP_PRE, openInAtsWorkflowEditorAction);
+ openInAtsWorkflowEditorAction.setEnabled(getSelectedArtifacts() != null);
+ mm.insertBefore(MENU_GROUP_PRE, openInMassEditorAction);
+ openInMassEditorAction.setEnabled(getSelectedArtifacts() != null);
+ mm.insertBefore(MENU_GROUP_PRE, openInAtsWorldEditorAction);
+ openInAtsWorldEditorAction.setEnabled(getSelectedArtifacts() != null);
+ mm.insertBefore(MENU_GROUP_PRE, openInAtsTaskEditorAction);
+ openInAtsTaskEditorAction.setEnabled(getSelectedTaskArtifacts() != null);
+ if (AtsPlugin.isAtsAdmin()) {
+ mm.insertBefore(MENU_GROUP_PRE, openInArtifactEditorAction);
+ openInArtifactEditorAction.setEnabled(getSelectedArtifacts() != null);
+ mm.insertBefore(MENU_GROUP_PRE, deletePurgeAtsObjectAction);
+ deletePurgeAtsObjectAction.setEnabled(getSelectedArtifactItems().size() > 0);
+ }
+ mm.insertBefore(XViewer.MENU_GROUP_PRE, new GroupMarker(MENU_GROUP_ATS_WORLD_OPEN));
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+
+ // OTHER MENU BLOCK
+ mm.insertBefore(MENU_GROUP_PRE, favoritesAction);
+ favoritesAction.setEnabled(enableFavoritesAction());
+ if (getSelectedSMA() == null)
+ favoritesAction.setText(ADD_AS_FAVORITE);
+ else
+ favoritesAction.setText(((IFavoriteableArtifact) getSelectedSMA()).amIFavorite() ? REMOVE_FAVORITE : ADD_AS_FAVORITE);
+
+ mm.insertBefore(MENU_GROUP_PRE, subscribedAction);
+ subscribedAction.setEnabled(enableSubscribedAction());
+ if (getSelectedSMA() == null)
+ subscribedAction.setText(SUBSCRIBE);
+ else
+ subscribedAction.setText(((ISubscribableArtifact) getSelectedSMA()).amISubscribed() ? UN_SUBSCRIBE : SUBSCRIBE);
+
+ mm.insertBefore(MENU_GROUP_PRE, emailAction);
+ emailAction.setEnabled(getSelectedArtifacts().size() == 1);
+ emailAction.setText("Email " + ((getSelectedArtifacts().size() == 1) ? getSelectedArtifacts().iterator().next().getArtifactTypeName() : ""));
+
+ mm.insertBefore(MENU_GROUP_PRE, resetActionArtifactAction);
+ resetActionArtifactAction.setEnabled(getSelectedActionArtifacts().size() > 0);
+
+ mm.insertAfter(XViewer.MENU_GROUP_PRE, new GroupMarker(MENU_GROUP_ATS_WORLD_OTHER));
+ mm.insertAfter(MENU_GROUP_PRE, new Separator());
+
+ }
+
+ private boolean enableFavoritesAction() {
+ if (getSelectedSMAArtifacts().size() == 0) return false;
+ for (StateMachineArtifact sma : getSelectedSMAArtifacts()) {
+ if (!(sma instanceof IFavoriteableArtifact)) return false;
+ }
+ return true;
+ }
+
+ private boolean enableSubscribedAction() {
+ if (getSelectedSMAArtifacts().size() == 0) return false;
+ for (StateMachineArtifact sma : getSelectedSMAArtifacts()) {
+ if (!(sma instanceof ISubscribableArtifact)) return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void handleDoubleClick() {
+ if (getSelectedArtifactItems().size() == 0) return;
+ Artifact art = getSelectedArtifactItems().iterator().next();
+ AtsLib.openAtsAction(art, AtsOpenOption.OpenOneOrPopupSelect);
+ }
+
+ public ArrayList<Artifact> getLoadedArtifacts() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ if (getRoot() != null) {
+ for (Object artifact : (Collection<?>) getRoot()) {
+ if (artifact instanceof Artifact) {
+ arts.add((Artifact) artifact);
+ }
+ }
+ }
+ return arts;
+ }
+
+ public void clear() {
+ ((WorldContentProvider) getContentProvider()).clear();
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ // Dispose of the table objects is done through separate dispose listener off tree
+ // Tell the label provider to release its resources
+ getLabelProvider().dispose();
+ super.dispose();
+ }
+
+ public ArrayList<Artifact> getSelectedArtifacts() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((Artifact) item.getData());
+ return arts;
+ }
+
+ public ArrayList<TaskArtifact> getSelectedTaskArtifacts() {
+ ArrayList<TaskArtifact> arts = new ArrayList<TaskArtifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) {
+ for (TreeItem item : items) {
+ if (item.getData() instanceof TaskArtifact) {
+ arts.add((TaskArtifact) item.getData());
+ }
+ }
+ }
+ return arts;
+ }
+
+ /**
+ * @return true if all selected are Workflow OR are Actions with single workflow
+ */
+ public boolean isSelectedTeamWorkflowArtifacts() {
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items) {
+ if (item.getData() instanceof ActionArtifact) {
+ try {
+ if (((ActionArtifact) item.getData()).getTeamWorkFlowArtifacts().size() != 1) return false;
+ } catch (OseeCoreException ex) {
+ // Do Nothing
+ }
+ } else if (!(item.getData() instanceof TeamWorkFlowArtifact)) return false;
+ }
+ return true;
+ }
+
+ /**
+ * @return all selected Workflow and any workflow that have Actions with single workflow
+ */
+ public Set<TeamWorkFlowArtifact> getSelectedTeamWorkflowArtifacts() {
+ Set<TeamWorkFlowArtifact> teamArts = new HashSet<TeamWorkFlowArtifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items) {
+ if (item.getData() instanceof TeamWorkFlowArtifact) teamArts.add((TeamWorkFlowArtifact) item.getData());
+ if (item.getData() instanceof ActionArtifact) {
+ try {
+ if (((ActionArtifact) item.getData()).getTeamWorkFlowArtifacts().size() == 1) teamArts.addAll(((ActionArtifact) item.getData()).getTeamWorkFlowArtifacts());
+ } catch (OseeCoreException ex) {
+ // Do Nothing
+ }
+ }
+ }
+ return teamArts;
+ }
+
+ /**
+ * @return all selected Workflow and any workflow that have Actions with single workflow
+ */
+ public Set<StateMachineArtifact> getSelectedSMAArtifacts() {
+ Set<StateMachineArtifact> smaArts = new HashSet<StateMachineArtifact>();
+ try {
+ Iterator<?> i = ((IStructuredSelection) getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof StateMachineArtifact) {
+ smaArts.add((StateMachineArtifact) obj);
+ } else if (obj instanceof ActionArtifact) {
+ smaArts.addAll(((ActionArtifact) obj).getTeamWorkFlowArtifacts());
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ return smaArts;
+ }
+
+ public Set<ActionArtifact> getSelectedActionArtifacts() {
+ Set<ActionArtifact> actionArts = new HashSet<ActionArtifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items) {
+ if (item.getData() instanceof ActionArtifact) actionArts.add((ActionArtifact) item.getData());
+ }
+ return actionArts;
+ }
+
+ public void setCancelledNotification() {
+ TreeItem item = getTree().getItem(0);
+ if (item.getData() instanceof String) item.setData(DefaultTeamState.Cancelled.name());
+ refresh(item.getData());
+ }
+
+ /**
+ * @param title string to be used in reporting
+ */
+ public void setReportingTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * @return Returns the title.
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ public void set(Collection<? extends Artifact> artifacts) {
+ ((WorldContentProvider) getContentProvider()).set(artifacts);
+ }
+
+ public void add(Collection<Artifact> artifacts) {
+ ((WorldContentProvider) getContentProvider()).add(artifacts);
+ }
+
+ public void add(final Artifact artifact) {
+ add(Arrays.asList(artifact));
+ }
+
+ public void remove(final Artifact artifact) {
+ ((WorldContentProvider) getContentProvider()).remove(artifact);
+ }
+
+ @Override
+ public void remove(final Collection<Object> artifacts) {
+ ((WorldContentProvider) getContentProvider()).removeAll(artifacts);
+ }
+
+ @Override
+ public void load(Collection<Object> objects) {
+ Set<Artifact> arts = new HashSet<Artifact>();
+ for (Object obj : objects) {
+ if (obj instanceof IWorldViewArtifact) {
+ arts.add((Artifact) obj);
+ }
+ }
+ set(arts);
+ }
+
+ public ArrayList<Artifact> getSelectedArtifactItems() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((Artifact) item.getData());
+ return arts;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#getStatusString()
+ */
+ @Override
+ public String getStatusString() {
+ return extendedStatusString;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.viewer.XViewer#handleAltLeftClick(org.eclipse.swt.widgets.TreeColumn,
+ * org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ return handleAltLeftClick(treeColumn, treeItem, true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#handleLeftClickInIconArea(org.eclipse.swt.widgets.TreeColumn, org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+ try {
+ Artifact useArt = (Artifact) treeItem.getData();
+ if (useArt instanceof StateMachineArtifact) {
+ boolean modified = false;
+ if (useArt instanceof ActionArtifact) {
+ if (((ActionArtifact) useArt).getTeamWorkFlowArtifacts().size() == 1)
+ useArt = (((ActionArtifact) useArt).getTeamWorkFlowArtifacts().iterator().next());
+ else
+ return false;
+ }
+ if (modified) {
+ update(useArt, null);
+ return true;
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem, boolean persist) {
+ try {
+ super.handleAltLeftClick(treeColumn, treeItem);
+ if (!(treeColumn.getData() instanceof XViewerColumn)) return false;
+ Artifact useArt = (Artifact) treeItem.getData();
+ if (useArt instanceof ActionArtifact) {
+ if (((ActionArtifact) useArt).getTeamWorkFlowArtifacts().size() == 1)
+ useArt = (((ActionArtifact) useArt).getTeamWorkFlowArtifacts().iterator().next());
+ else
+ return false;
+ }
+ SMAManager smaMgr = new SMAManager((StateMachineArtifact) useArt);
+ XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
+ boolean modified = false;
+ if (xCol.equals(WorldXViewerFactory.Version_Target_Col))
+ modified =
+ smaMgr.promptChangeVersion(
+ AtsPlugin.isAtsAdmin() ? VersionReleaseType.Both : VersionReleaseType.UnReleased, true);
+ else if (xCol.equals(WorldXViewerFactory.Notes_Col))
+ modified = smaMgr.promptChangeAttribute(ATSAttributes.SMA_NOTE_ATTRIBUTE, persist, true);
+ else if (xCol.equals(WorldXViewerFactory.Percent_Rework_Col))
+ modified = smaMgr.promptChangePercentAttribute(ATSAttributes.PERCENT_REWORK_ATTRIBUTE, persist);
+ else if (xCol.equals(WorldXViewerFactory.Estimated_Hours_Col))
+ modified = smaMgr.promptChangeFloatAttribute(ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE, persist);
+ else if (xCol.equals(WorldXViewerFactory.Weekly_Benefit_Hrs_Col))
+ modified = smaMgr.promptChangeFloatAttribute(ATSAttributes.WEEKLY_BENEFIT_ATTRIBUTE, persist);
+ else if (xCol.equals(WorldXViewerFactory.Estimated_Release_Date_Col))
+ modified = smaMgr.promptChangeEstimatedReleaseDate();
+ else if (xCol.equals(WorldXViewerFactory.Estimated_Completion_Date_Col))
+ modified = smaMgr.promptChangeDate(ATSAttributes.ESTIMATED_COMPLETION_DATE_ATTRIBUTE, persist);
+ else if (xCol.equals(WorldXViewerFactory.Deadline_Col))
+ modified = smaMgr.promptChangeDate(ATSAttributes.DEADLINE_ATTRIBUTE, persist);
+ else if (xCol.equals(WorldXViewerFactory.Assignees_Col))
+ modified = smaMgr.promptChangeAssignees(persist);
+ else if (xCol.equals(WorldXViewerFactory.Remaining_Hours_Col)) {
+ AWorkbench.popup("Calculated Field",
+ "Hours Remaining field is calculated.\nHour Estimate - (Hour Estimate * Percent Complete)");
+ return false;
+ } else if (xCol.equals(WorldXViewerFactory.Man_Days_Needed_Col)) {
+ AWorkbench.popup(
+ "Calculated Field",
+ "Man Days Needed field is calculated.\nRemaining Hours / Hours per Week (" + smaMgr.getSma().getManHrsPerDayPreference() + ")");
+ return false;
+ } else if (xCol.equals(WorldXViewerFactory.Release_Date_Col))
+ modified = smaMgr.promptChangeReleaseDate();
+ else if (xCol.equals(WorldXViewerFactory.Work_Package_Col))
+ modified = smaMgr.promptChangeAttribute(ATSAttributes.WORK_PACKAGE_ATTRIBUTE, persist, false);
+ else if (xCol.equals(WorldXViewerFactory.Category_Col))
+ modified = smaMgr.promptChangeAttribute(ATSAttributes.CATEGORY_ATTRIBUTE, persist, true);
+ else if (xCol.equals(WorldXViewerFactory.Category2_Col))
+ modified = smaMgr.promptChangeAttribute(ATSAttributes.CATEGORY2_ATTRIBUTE, persist, true);
+ else if (xCol.equals(WorldXViewerFactory.Category3_Col))
+ modified = smaMgr.promptChangeAttribute(ATSAttributes.CATEGORY3_ATTRIBUTE, persist, true);
+ else if (xCol.equals(WorldXViewerFactory.Change_Type_Col))
+ modified = smaMgr.promptChangeType(persist);
+ else if (xCol.equals(WorldXViewerFactory.Priority_Col)) modified = smaMgr.promptChangePriority(persist);
+ if (modified) {
+ update(useArt, null);
+ return true;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ /**
+ * @return the extendedStatusString
+ */
+ public String getExtendedStatusString() {
+ return extendedStatusString;
+ }
+
+ /**
+ * @param extendedStatusString the extendedStatusString to set
+ */
+ public void setExtendedStatusString(String extendedStatusString) {
+ this.extendedStatusString = extendedStatusString;
+ updateStatusLabel();
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerFactory.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerFactory.java
new file mode 100644
index 00000000000..287c6398dd8
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerFactory.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world;
+
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.util.xviewer.column.XViewerAtsAttributeColumn;
+import org.eclipse.osee.ats.util.xviewer.column.XViewerSmaCreatedDateColumn;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactNameColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerHridColumn;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldXViewerFactory extends SkynetXViewerFactory {
+
+ public static String COLUMN_NAMESPACE = "ats.column";
+ public static final XViewerColumn Type_Col =
+ new XViewerColumn("ats.column.type", "Type", 150, SWT.LEFT, true, SortDataType.String, false, null);
+ public static final XViewerColumn State_Col =
+ new XViewerColumn("ats.column.state", "State", 75, SWT.LEFT, true, SortDataType.String, false, null);
+ public static final XViewerColumn Priority_Col =
+ new XViewerAtsAttributeColumn(ATSAttributes.PRIORITY_TYPE_ATTRIBUTE, 20, SWT.CENTER, true,
+ SortDataType.String, false);
+ public static final XViewerColumn Change_Type_Col =
+ new XViewerAtsAttributeColumn(ATSAttributes.CHANGE_TYPE_ATTRIBUTE, 22, SWT.CENTER, true, SortDataType.String,
+ false);
+ public static final XViewerColumn Assignees_Col =
+ new XViewerAtsAttributeColumn(WorldXViewerFactory.COLUMN_NAMESPACE + ".assignees",
+ ATSAttributes.ASSIGNEE_ATTRIBUTE, 100, SWT.LEFT, true, SortDataType.String, false);
+ public static final XViewerColumn Title_Col = new XViewerArtifactNameColumn("Title");
+ public static final XViewerColumn Actionable_Items_Col =
+ new XViewerAtsAttributeColumn(WorldXViewerFactory.COLUMN_NAMESPACE + ".actionableItems",
+ ATSAttributes.ACTIONABLE_ATTRIBUTE, 80, SWT.LEFT, true, SortDataType.String, false);
+ public static final XViewerColumn User_Community_Col =
+ new XViewerAtsAttributeColumn(ATSAttributes.USER_COMMUNITY_ATTRIBUTE, 60, SWT.LEFT, true, SortDataType.String,
+ false);
+ public static final XViewerColumn ID_Col = new XViewerHridColumn("HRID");
+ public static final XViewerColumn Parent_ID_Col =
+ new XViewerColumn(WorldXViewerFactory.COLUMN_NAMESPACE + ".parenthrid", "Parent HRID", 75, SWT.LEFT, false,
+ SortDataType.String, false, "Human Readable ID of Parent Action or Team Workflow");
+ public static final XViewerColumn Parent_State_Col =
+ new XViewerColumn(WorldXViewerFactory.COLUMN_NAMESPACE + ".parentstate", "Parent State", 75, SWT.LEFT, false,
+ SortDataType.String, false, "State of the Parent Team Workflow or Action");
+ public static final XViewerColumn Created_Date_Col = new XViewerSmaCreatedDateColumn();
+ public static final XViewerColumn Version_Target_Col =
+ new XViewerColumn(WorldXViewerFactory.COLUMN_NAMESPACE + ".versionTarget", "Version Target", 40, SWT.LEFT,
+ true, SortDataType.String, false, "Date this workflow transitioned to the Completed state.");
+ public static final XViewerColumn Team_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".team", "Team", 50, SWT.LEFT, true, SortDataType.String, false,
+ "Team that has been assigned to work this Action.");
+ public static final XViewerColumn Notes_Col =
+ new XViewerAtsAttributeColumn(ATSAttributes.SMA_NOTE_ATTRIBUTE, 80, SWT.LEFT, true, SortDataType.String, true);
+ public static final XViewerColumn Deadline_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".deadline", ATSAttributes.DEADLINE_ATTRIBUTE, 75, SWT.LEFT,
+ true, SortDataType.String, true, null);
+
+ // Aren't shown by default
+ public static final XViewerColumn Annual_Cost_Avoidance_Col =
+ new XViewerColumn(
+ COLUMN_NAMESPACE + ".annualCostAvoidance",
+ "Annual Cost Avoidance",
+ 50,
+ SWT.LEFT,
+ false,
+ SortDataType.Float,
+ false,
+ "Hours that would be saved for the first year if this change were completed.\n\n" + "(Weekly Benefit Hours * 52 weeks) - Remaining Hours\n\n" + "If number is high, benefit is great given hours remaining.");
+ public static final XViewerColumn Description_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".description", ATSAttributes.DESCRIPTION_ATTRIBUTE, 150,
+ SWT.LEFT, false, SortDataType.String, true);
+ public static XViewerColumn Legacy_PCR_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".legacyPcr", ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE, 40,
+ SWT.LEFT, false, SortDataType.String, false);
+ public static final XViewerColumn Decision_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".decision", ATSAttributes.DECISION_ATTRIBUTE, 150, SWT.LEFT,
+ false, SortDataType.String, false);
+ public static final XViewerColumn Resolution_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".resolution", ATSAttributes.RESOLUTION_ATTRIBUTE, 150,
+ SWT.LEFT, false, SortDataType.String, true);
+ public static XViewerColumn Estimated_Hours_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".estimatedHours", ATSAttributes.ESTIMATED_HOURS_ATTRIBUTE,
+ 40, SWT.CENTER, false, SortDataType.Float, true);
+ public static XViewerColumn Estimated_Release_Date_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".estimatedReleaseDate",
+ ATSAttributes.ESTIMATED_RELEASE_DATE_ATTRIBUTE, 80, SWT.LEFT, false, SortDataType.Date, true);
+ public static XViewerColumn Estimated_Completion_Date_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".estimatedCompletionDate",
+ ATSAttributes.ESTIMATED_COMPLETION_DATE_ATTRIBUTE, 80, SWT.LEFT, false, SortDataType.Date, true);
+ public static final XViewerColumn Release_Date_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".releaseDate", ATSAttributes.RELEASE_DATE_ATTRIBUTE, 80,
+ SWT.LEFT, false, SortDataType.Date, false);
+ public static final XViewerColumn Work_Package_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".workPackage", ATSAttributes.WORK_PACKAGE_ATTRIBUTE, 80,
+ SWT.LEFT, false, SortDataType.String, true);
+ public static final XViewerColumn Category_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".category", ATSAttributes.CATEGORY_ATTRIBUTE, 80, SWT.LEFT,
+ false, SortDataType.String, true);
+ public static final XViewerColumn Category2_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".category2", ATSAttributes.CATEGORY2_ATTRIBUTE, 80,
+ SWT.LEFT, false, SortDataType.String, true);
+ public static final XViewerColumn Category3_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".category3", ATSAttributes.CATEGORY3_ATTRIBUTE, 80,
+ SWT.LEFT, false, SortDataType.String, true);
+
+ public static XViewerAtsAttributeColumn Related_To_State_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".relatedToState", ATSAttributes.RELATED_TO_STATE_ATTRIBUTE,
+ 80, SWT.LEFT, false, SortDataType.String, true);
+ public static final XViewerColumn Weekly_Benefit_Hrs_Col =
+ new XViewerAtsAttributeColumn(COLUMN_NAMESPACE + ".weeklyBenefitHrs", ATSAttributes.WEEKLY_BENEFIT_ATTRIBUTE,
+ 40, SWT.CENTER, false, SortDataType.Float, true);
+ public static final XViewerColumn Remaining_Hours_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".remainingHours", "Remaining Hours", 40, SWT.CENTER, false,
+ SortDataType.Float, false,
+ "Hours that remain to complete the changes.\n\nEstimated Hours - (Estimated Hours * Percent Complete).");
+
+ public static final XViewerColumn Percent_Complete_State_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".statePercentComplete", "State Percent Complete", 40, SWT.CENTER, false,
+ SortDataType.Percent, false,
+ "Percent Complete for the changes to the current state.\n\nAmount entered from user.");
+ public static final XViewerColumn Percent_Complete_State_Task_Col =
+ new XViewerColumn(
+ COLUMN_NAMESPACE + ".stateTaskPercentComplete",
+ "State Task Percent Complete",
+ 40,
+ SWT.CENTER,
+ false,
+ SortDataType.Percent,
+ false,
+ "Percent Complete for the tasks related to the current state.\n\nCalculation: total percent of all tasks related to state / number of tasks related to state");
+ public static final XViewerColumn Percent_Complete_State_Review_Col =
+ new XViewerColumn(
+ COLUMN_NAMESPACE + ".stateReviewPercentComplete",
+ "State Review Percent Complete",
+ 40,
+ SWT.CENTER,
+ false,
+ SortDataType.Percent,
+ false,
+ "Percent Complete for the reviews related to the current state.\n\nCalculation: total percent of all reviews related to state / number of reviews related to state");
+ public static final XViewerColumn Percent_Complete_Total_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".totalPercentComplete", "Total Percent Complete", 40, SWT.CENTER, false,
+ SortDataType.Percent, false, "Percent Complete for the reviews related to the current state.");
+
+ public static final XViewerColumn Hours_Spent_State_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".stateHoursSpent", "State Hours Spent", 40, SWT.CENTER, false,
+ SortDataType.Float, false, "Hours spent in performing the changes to the current state.");
+ public static final XViewerColumn Hours_Spent_State_Task_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".stateTaskHoursSpent", "State Task Hours Spent", 40, SWT.CENTER, false,
+ SortDataType.Float, false,
+ "Hours spent in performing the changes for the tasks related to the current state.");
+ public static final XViewerColumn Hours_Spent_State_Review_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".stateReviewHoursSpent", "State Review Hours Spent", 40, SWT.CENTER,
+ false, SortDataType.Float, false,
+ "Hours spent in performing the changes for the reveiws related to the current state.");
+ public static final XViewerColumn Hours_Spent_Total_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".stateTotalHoursSpent", "State Total Hours Spent", 40, SWT.CENTER,
+ false, SortDataType.Float, false, "Hours spent for all work related to the current state.");
+
+ public static final XViewerColumn Total_Hours_Spent_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".totalHoursSpent", "Total Hours Spent", 40, SWT.CENTER, false,
+ SortDataType.Float, false, "Hours spent for all work related to all states.");
+
+ public static final XViewerColumn Originator_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".originator", "Originator", 80, SWT.LEFT, false, SortDataType.String,
+ false, null);
+ public static final XViewerColumn Implementor_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".implementer", "Implementer", 80, SWT.LEFT, false, SortDataType.String,
+ false, "User assigned to the Implementation of the changes.");
+ public static final XViewerColumn Review_Author_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewAuthor", "Review Author", 100, SWT.LEFT, false,
+ SortDataType.String, false, "Review Author(s)");
+ public static final XViewerColumn Review_Moderator_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewModerator", "Review Moderator", 100, SWT.LEFT, false,
+ SortDataType.String, false, "Review Moderator(s)");
+ public static final XViewerColumn Groups_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".groups", "Groups", 100, SWT.LEFT, false, SortDataType.String, false,
+ "Groups");
+ public static final XViewerColumn Review_Reviewer_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewReviewer", "Review Reviewer", 100, SWT.LEFT, false,
+ SortDataType.String, false, "Review Reviewer(s)");
+ public static final XViewerColumn Review_Decider_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewDecider", "Review Decider", 100, SWT.LEFT, false,
+ SortDataType.String, false, "Review Decider");
+ public static final XViewerColumn Completed_Date_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".completedDate", "Completed Date", 80, SWT.CENTER, false,
+ SortDataType.Date, false, null);
+ public static final XViewerColumn Cancelled_Date_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".cancelledDate", "Cancelled Date", 80, SWT.CENTER, false,
+ SortDataType.Date, false, null);
+ public static final XViewerColumn Man_Days_Needed_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".manDaysNeeded", "Man Days Needed", 40, SWT.CENTER, false,
+ SortDataType.Float, false, null);
+ public static final XViewerColumn Days_In_Current_State =
+ new XViewerColumn(COLUMN_NAMESPACE + ".daysInCurrState", "Days in Current State", 40, SWT.CENTER, false,
+ SortDataType.Float, false, null);
+ public static final XViewerColumn Percent_Rework_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".percentRework", "Percent Rework", 40, SWT.CENTER, false,
+ SortDataType.Percent, false, null);
+ public static final XViewerColumn Branch_Status_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".branchStatus", "Branch Status", 40, SWT.CENTER, false,
+ SortDataType.String, false, null);
+ public static final XViewerColumn Number_of_Tasks_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".numberOfTasks", "Number of Tasks", 40, SWT.CENTER, false,
+ SortDataType.Integer, false, null);
+ public static final XViewerColumn Last_Modified_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".lastModified", "Last Modified", 40, SWT.CENTER, false,
+ SortDataType.Date, false, "Retrieves timestamp of last database update of this artifact.");
+ public static final XViewerColumn Last_Statused_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".lastStatused", "Last Statused", 40, SWT.CENTER, false,
+ SortDataType.Date, false, "Retrieves timestamp of status (percent completed or hours spent).");
+ public static final XViewerColumn Validation_Required_Col =
+ new XViewerColumn(COLUMN_NAMESPACE + ".validationRequired", "Validation Required", 80, SWT.LEFT, false,
+ SortDataType.String, false,
+ "If set, Originator will be asked to perform a review to\nensure changes are as expected.");
+ public static final XViewerColumn Review_Minor_Defects =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewMinorDefects", "Review Minor Defects", 40, SWT.CENTER, false,
+ SortDataType.Integer, false, "Number of Minor Defects found in Review");
+ public static final XViewerColumn Review_Major_Defects =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewMajorDefects", "Review Major Defects", 40, SWT.CENTER, false,
+ SortDataType.Integer, false, "Number of Major Defects found in Review");
+ public static final XViewerColumn Review_Issues =
+ new XViewerColumn(COLUMN_NAMESPACE + ".reviewIssues", "Review Issues", 40, SWT.CENTER, false,
+ SortDataType.Integer, false, "Number of Issues found in Review");
+ public static final XViewerColumn Artifact_Type_Col =
+ new XViewerColumn("ats.column.artType", "Artifact Type", 150, SWT.LEFT, false, SortDataType.String, false,
+ null);
+ public static final XViewerColumn Originating_Workflow =
+ new XViewerColumn("ats.column.origWf", "Originating Workflow", 150, SWT.LEFT, false, SortDataType.String,
+ false,
+ "Team Workflow(s) that were created upon origination of this Action. Cancelled workflows not included.");
+ public static final XViewerColumn Actions_Initiating_Workflow_Col =
+ new XViewerColumn("ats.column.initWf", "Action's Initiating Workflow", 150, SWT.LEFT, false,
+ SortDataType.String, false, "This is the first workflow(s) that created the initiation of the Action");
+ public static final XViewerColumn[] WorldViewColumns =
+ new XViewerColumn[] {Type_Col, State_Col, Priority_Col, Change_Type_Col, Assignees_Col, Title_Col,
+ Actionable_Items_Col, User_Community_Col, ID_Col, Created_Date_Col, Version_Target_Col, Team_Col,
+ Notes_Col, Deadline_Col, Annual_Cost_Avoidance_Col, Description_Col, Legacy_PCR_Col, Decision_Col,
+ Resolution_Col, Groups_Col, Estimated_Release_Date_Col, Estimated_Completion_Date_Col, Release_Date_Col,
+ Work_Package_Col, Category_Col, Category2_Col, Category3_Col, Related_To_State_Col, Estimated_Hours_Col,
+ Weekly_Benefit_Hrs_Col, Remaining_Hours_Col, Percent_Complete_State_Col,
+ Percent_Complete_State_Task_Col, Percent_Complete_State_Review_Col, Percent_Complete_Total_Col,
+ Hours_Spent_State_Col, Hours_Spent_State_Task_Col, Hours_Spent_State_Review_Col, Hours_Spent_Total_Col,
+ Total_Hours_Spent_Col, Originator_Col, Implementor_Col, Review_Author_Col, Review_Moderator_Col,
+ Review_Reviewer_Col, Review_Decider_Col, Completed_Date_Col, Cancelled_Date_Col, Man_Days_Needed_Col,
+ Percent_Rework_Col, Branch_Status_Col, Number_of_Tasks_Col, Last_Modified_Col, Last_Statused_Col,
+ Validation_Required_Col, Review_Major_Defects, Review_Minor_Defects, Review_Issues,
+ Actions_Initiating_Workflow_Col, Artifact_Type_Col, Originating_Workflow, Parent_ID_Col,
+ Days_In_Current_State, Parent_State_Col};
+ private static String NAMESPACE = "org.eclipse.osee.ats.WorldXViewer";
+
+ public WorldXViewerFactory() {
+ super(NAMESPACE);
+ registerColumn(WorldViewColumns);
+ // Register all ats.* attribute columns
+ try {
+ for (AttributeType attributeType : AttributeTypeManager.getAllTypes()) {
+ if (attributeType.getName().startsWith("ats.")) {
+ registerColumn(getAttributeColumn(attributeType));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+
+ // Register any columns from other plugins
+ try {
+ for (IAtsWorldEditorItem item : AtsWorldEditorItems.getItems()) {
+ for (XViewerColumn xCol : item.getXViewerColumns()) {
+ registerColumn(xCol);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new WorldXViewerSorter(xViewer);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerSorter.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerSorter.java
new file mode 100644
index 00000000000..e51122a6f2e
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXViewerSorter.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.ats.world;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.osee.ats.ActionDebug;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldXViewerSorter extends XViewerSorter {
+
+ ActionDebug debug = new ActionDebug(true, "WorldXViewerSorter");
+ protected final XViewer xViewer;
+
+ /**
+ * @param xViewer
+ */
+ public WorldXViewerSorter(XViewer xViewer) {
+ super(xViewer);
+ this.xViewer = xViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerSorter#compare(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object, int)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2, int sortXColIndex) {
+ try {
+ if (xViewer == null || !xViewer.getCustomizeMgr().isSorting()) return 0;
+ XViewerColumn sortXCol = xViewer.getCustomizeMgr().getSortXCols().get(sortXColIndex);
+ IWorldViewArtifact m1 = (IWorldViewArtifact) ((Artifact) o1);
+ IWorldViewArtifact m2 = (IWorldViewArtifact) ((Artifact) o2);
+
+ if (sortXCol.equals(WorldXViewerFactory.Assignees_Col)) {
+ int compareInt =
+ getComparator().compare(m1.getWorldViewActivePoc().replaceFirst("\\(", ""),
+ m2.getWorldViewActivePoc().replaceFirst("\\(", ""));
+ return getCompareBasedOnDirection(sortXCol, compareInt, viewer, o1, o2, sortXColIndex);
+ } else if (sortXCol.equals(WorldXViewerFactory.Change_Type_Col)) {
+ int compareInt =
+ getComparator().compare(m1.getWorldViewChangeType().ordinal() + "",
+ m2.getWorldViewChangeType().ordinal() + "");
+ return getCompareBasedOnDirection(sortXCol, compareInt, viewer, o1, o2, sortXColIndex);
+ }
+
+ return super.compare(viewer, o1, o2, sortXColIndex);
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXWidgetActionPage.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXWidgetActionPage.java
new file mode 100644
index 00000000000..c693aa1dd1f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/WorldXWidgetActionPage.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.ats.world;
+
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorldXWidgetActionPage extends AtsXWidgetActionFormPage {
+
+ private final WorldEditor worldEditor;
+ private WorldComposite worldComposite;
+
+ /**
+ * @return the worldComposite
+ */
+ public WorldComposite getWorldComposite() {
+ return worldComposite;
+ }
+
+ /**
+ * @param editor
+ */
+ public WorldXWidgetActionPage(WorldEditor worldEditor) {
+ super(worldEditor, "org.eclipse.osee.ats.actionPage", "Actions");
+ this.worldEditor = worldEditor;
+ }
+
+ @Override
+ public Section createResultsSection(Composite body) {
+ resultsSection = toolkit.createSection(body, Section.NO_TITLE);
+ resultsSection.setText("Results");
+ resultsSection.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ resultsContainer = toolkit.createClientContainer(resultsSection, 1);
+ worldComposite = new WorldComposite(worldEditor, resultsContainer, SWT.BORDER, toolBar);
+ toolkit.adapt(worldComposite);
+ return resultsSection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormPage#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ Result result = AtsPlugin.areOSEEServicesAvailable();
+ if (result.isFalse()) {
+ AWorkbench.popup("ERROR", "DB Connection Unavailable");
+ return;
+ }
+
+ try {
+ worldEditor.getWorldEditorProvider().run(worldEditor, SearchType.Search, false);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.AtsXWidgetActionFormPage#getDynamicWidgetLayoutListener()
+ */
+ @Override
+ public IDynamicWidgetLayoutListener getDynamicWidgetLayoutListener() {
+ if (worldEditor.getWorldEditorProvider() instanceof IWorldEditorParameterProvider) {
+ return ((IWorldEditorParameterProvider) worldEditor.getWorldEditorProvider()).getDynamicWidgetLayoutListener();
+ }
+ return null;
+ }
+
+ public void reSearch() throws OseeCoreException {
+ reSearch(false);
+ }
+
+ /*
+ * Mainly for testing purposes
+ */
+ public void reSearch(boolean forcePend) throws OseeCoreException {
+ worldEditor.getWorldEditorProvider().run(worldEditor, SearchType.ReSearch, forcePend);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.AtsXWidgetActionFormPage#getXWidgetsXml()
+ */
+ @Override
+ public String getXWidgetsXml() throws OseeCoreException {
+ if (worldEditor.getWorldEditorProvider() instanceof IWorldEditorParameterProvider) {
+ return ((IWorldEditorParameterProvider) worldEditor.getWorldEditorProvider()).getParameterXWidgetXml();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.AtsXWidgetActionFormPage#handleSearchButtonPressed()
+ */
+ @Override
+ public void handleSearchButtonPressed() {
+ try {
+ reSearch();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ActionableItemWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ActionableItemWorldSearchItem.java
new file mode 100644
index 00000000000..fcc6c9b4081
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ActionableItemWorldSearchItem.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ActionableItemArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.widgets.dialog.ActionActionableItemListDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Operator;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActionableItemWorldSearchItem extends WorldUISearchItem {
+
+ private Collection<ActionableItemArtifact> actionItems;
+ private Set<ActionableItemArtifact> selectedActionItems;
+ private boolean recurseChildren;
+ private boolean selectedRecurseChildren; // Used to not corrupt original values
+ private boolean showFinished;
+ private boolean selectedShowFinished; // Used to not corrupt original values
+ private final Collection<String> actionItemNames;
+
+ public ActionableItemWorldSearchItem(Collection<String> actionItemNames, String displayName, boolean showFinished, boolean recurseChildren) {
+ super(displayName, AtsImage.ACTIONABLE_ITEM);
+ this.actionItemNames = actionItemNames;
+ this.showFinished = showFinished;
+ this.selectedShowFinished = showFinished; // Set as default in case UI is not used
+ this.recurseChildren = recurseChildren;
+ this.selectedRecurseChildren = recurseChildren; // Set as default in case UI is not used
+ }
+
+ public ActionableItemWorldSearchItem(String displayName, Collection<ActionableItemArtifact> actionItems, boolean showFinished, boolean recurseChildren) {
+ super(displayName, AtsImage.ACTIONABLE_ITEM);
+ this.actionItemNames = null;
+ this.actionItems = actionItems;
+ this.showFinished = showFinished;
+ this.recurseChildren = recurseChildren;
+ }
+
+ public ActionableItemWorldSearchItem(ActionableItemWorldSearchItem item) {
+ super(item, AtsImage.ACTIONABLE_ITEM);
+ this.actionItemNames = item.actionItemNames;
+ this.actionItems = item.actionItems;
+ this.showFinished = item.showFinished;
+ this.recurseChildren = item.recurseChildren;
+ }
+
+ public Collection<String> getProductSearchName() {
+ if (actionItemNames != null)
+ return actionItemNames;
+ else if (actionItems != null)
+ return Artifacts.artNames(actionItems);
+ else if (selectedActionItems != null) return Artifacts.artNames(selectedActionItems);
+ return new ArrayList<String>();
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("%s - %s", super.getSelectedName(searchType), getProductSearchName());
+ }
+
+ public void getActionableItems() throws OseeCoreException {
+ if (actionItemNames != null && actionItems == null) {
+ for (String actionItemName : actionItemNames) {
+ ActionableItemArtifact aia = AtsCache.getSoleArtifactByName(actionItemName, ActionableItemArtifact.class);
+ if (aia != null) {
+ actionItems.add(aia);
+ }
+ }
+ }
+ }
+
+ /**
+ * @return All directly specified teamDefs plus if recurse, will get all children
+ */
+ private Set<ActionableItemArtifact> getSearchActionableItems() throws OseeCoreException {
+ getActionableItems();
+ Set<ActionableItemArtifact> srchTeamDefs = new HashSet<ActionableItemArtifact>();
+ for (ActionableItemArtifact actionableItem : (actionItems != null ? actionItems : selectedActionItems))
+ srchTeamDefs.add(actionableItem);
+ if (selectedRecurseChildren) {
+ for (ActionableItemArtifact actionableItem : (actionItems != null ? actionItems : selectedActionItems)) {
+ Artifacts.getChildrenOfType(actionableItem, srchTeamDefs, ActionableItemArtifact.class, true);
+ }
+ }
+ return srchTeamDefs;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ Set<ActionableItemArtifact> items = getSearchActionableItems();
+ List<String> actionItemGuids = new ArrayList<String>(items.size());
+ for (ActionableItemArtifact ai : items) {
+ actionItemGuids.add(ai.getGuid());
+ }
+ List<AbstractArtifactSearchCriteria> criteria = new ArrayList<AbstractArtifactSearchCriteria>();
+
+ criteria.add(new AttributeCriteria(ATSAttributes.ACTIONABLE_ITEM_GUID_ATTRIBUTE.getStoreName(), actionItemGuids));
+
+ if (!selectedShowFinished) {
+ List<String> cancelOrComplete = new ArrayList<String>(2);
+ cancelOrComplete.add(DefaultTeamState.Cancelled.name() + ";;;");
+ cancelOrComplete.add(DefaultTeamState.Completed.name() + ";;;");
+ criteria.add(new AttributeCriteria(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(), cancelOrComplete,
+ Operator.NOT_EQUAL));
+ }
+
+ return ArtifactQuery.getArtifactsFromCriteria(AtsPlugin.getAtsBranch(), 1000, criteria);
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ if (actionItemNames != null) return;
+ if (actionItems != null) return;
+ if (searchType == SearchType.ReSearch && selectedActionItems != null) return;
+ ActionActionableItemListDialog diag = new ActionActionableItemListDialog(Active.Both);
+ diag.setShowFinished(showFinished);
+ diag.setRecurseChildren(recurseChildren);
+ int result = diag.open();
+ if (result == 0) {
+ selectedShowFinished = diag.isShowFinished();
+ selectedRecurseChildren = diag.isRecurseChildren();
+ if (selectedActionItems == null)
+ selectedActionItems = new HashSet<ActionableItemArtifact>();
+ else
+ selectedActionItems.clear();
+ for (Object obj : diag.getResult())
+ selectedActionItems.add((ActionableItemArtifact) obj);
+ return;
+ }
+ cancelled = true;
+ }
+
+ /**
+ * @param showFinished The showFinished to set.
+ */
+ public void setShowFinished(boolean showFinished) {
+ this.showFinished = showFinished;
+ }
+
+ /**
+ * @return the recurseChildren
+ */
+ public boolean isRecurseChildren() {
+ return recurseChildren;
+ }
+
+ /**
+ * @param recurseChildren the recurseChildren to set
+ */
+ public void setRecurseChildren(boolean recurseChildren) {
+ this.recurseChildren = recurseChildren;
+ }
+
+ /**
+ * @param selectedActionItems the selectedActionItems to set
+ */
+ public void setSelectedActionItems(Set<ActionableItemArtifact> selectedActionItems) {
+ this.selectedActionItems = selectedActionItems;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new ActionableItemWorldSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypeSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypeSearchItem.java
new file mode 100644
index 00000000000..3960f60ee34
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypeSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactTypeSearchItem extends WorldUISearchItem {
+
+ private final String artifactTypeName;
+
+ public ArtifactTypeSearchItem(String name, String artifactTypeName) {
+ super(name, FrameworkImage.FLASHLIGHT);
+ this.artifactTypeName = artifactTypeName;
+ }
+
+ public ArtifactTypeSearchItem(ArtifactTypeSearchItem artifactTypeSearchItem) {
+ super(artifactTypeSearchItem, FrameworkImage.FLASHLIGHT);
+ this.artifactTypeName = artifactTypeSearchItem.artifactTypeName;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ if (artifactTypeName == null) throw new IllegalArgumentException("Inavlid search \"" + getName() + "\"");
+ return ArtifactQuery.getArtifactsFromType(artifactTypeName, AtsPlugin.getAtsBranch());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new ArtifactTypeSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypesSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypesSearchItem.java
new file mode 100644
index 00000000000..e69bae78b72
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ArtifactTypesSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactTypesSearchItem extends WorldUISearchItem {
+
+ private final Collection<String> artifactTypeNames;
+
+ public ArtifactTypesSearchItem(String name, Collection<String> artifactTypeNames) {
+ super(name, FrameworkImage.FLASHLIGHT);
+ this.artifactTypeNames = artifactTypeNames;
+ }
+
+ public ArtifactTypesSearchItem(ArtifactTypesSearchItem artifactTypesSearchItem) {
+ super(artifactTypesSearchItem, FrameworkImage.FLASHLIGHT);
+ this.artifactTypeNames = artifactTypesSearchItem.artifactTypeNames;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ if (artifactTypeNames == null || artifactTypeNames.size() == 0) throw new OseeArgumentException(
+ "Inavlid search \"" + getName() + "\"");
+ return ArtifactQuery.getArtifactsFromTypes(artifactTypeNames, AtsPlugin.getAtsBranch(), false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new ArtifactTypesSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/AtsAttributeSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/AtsAttributeSearchItem.java
new file mode 100644
index 00000000000..e0f90d1b039
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/AtsAttributeSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkflowExtensions;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactTypeSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeValueSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator;
+import org.eclipse.osee.framework.skynet.core.artifact.search.FromArtifactsSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsAttributeSearchItem extends WorldUISearchItem {
+
+ private String searchStr;
+ private final String attributeName;
+
+ public AtsAttributeSearchItem(String searchName, String attributeName, String searchStr) throws OseeArgumentException {
+ super(searchName, FrameworkImage.FLASHLIGHT);
+ this.attributeName = attributeName;
+ this.searchStr = searchStr;
+ }
+
+ public AtsAttributeSearchItem(String searchName, String searchStr) throws OseeArgumentException {
+ this("%", searchName, searchStr);
+ }
+
+ public AtsAttributeSearchItem() throws OseeArgumentException {
+ this("Search ATS Attributes", "%", "");
+ }
+
+ public AtsAttributeSearchItem(AtsAttributeSearchItem atsAttributeSearchItem) {
+ super(atsAttributeSearchItem, FrameworkImage.FLASHLIGHT);
+ this.searchStr = atsAttributeSearchItem.searchStr;
+ this.attributeName = atsAttributeSearchItem.attributeName;
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("%s - %s", super.getSelectedName(searchType), searchStr);
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ if (searchStr == null) return EMPTY_SET;
+ LinkedList<ISearchPrimitive> criteria = new LinkedList<ISearchPrimitive>();
+ criteria.add(new AttributeValueSearch(attributeName, searchStr, DepricatedOperator.CONTAINS));
+ FromArtifactsSearch stringCriteria = new FromArtifactsSearch(criteria, true);
+
+ LinkedList<ISearchPrimitive> atsObjectCriteria = new LinkedList<ISearchPrimitive>();
+ atsObjectCriteria.add(new ArtifactTypeSearch(ActionArtifact.ARTIFACT_NAME, DepricatedOperator.EQUAL));
+ for (String teamArtifactName : TeamWorkflowExtensions.getInstance().getAllTeamWorkflowArtifactNames())
+ atsObjectCriteria.add(new ArtifactTypeSearch(teamArtifactName, DepricatedOperator.EQUAL));
+ atsObjectCriteria.add(new ArtifactTypeSearch(TaskArtifact.ARTIFACT_NAME, DepricatedOperator.EQUAL));
+ FromArtifactsSearch atsObjectSearch = new FromArtifactsSearch(atsObjectCriteria, false);
+
+ LinkedList<ISearchPrimitive> bothCriteria = new LinkedList<ISearchPrimitive>();
+ bothCriteria.add(stringCriteria);
+ bothCriteria.add(atsObjectSearch);
+
+ if (cancelled) return EMPTY_SET;
+ Collection<Artifact> artifacts =
+ ArtifactPersistenceManager.getArtifacts(bothCriteria, true, AtsPlugin.getAtsBranch());
+ if (cancelled) return EMPTY_SET;
+ return artifacts;
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Search by Ats Attribute", null,
+ "Enter string to search for.", MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ if (ed.open() == 0) {
+ searchStr = ed.getEntry();
+ return;
+ } else
+ cancelled = true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new AtsAttributeSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GroupWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GroupWorldSearchItem.java
new file mode 100644
index 00000000000..0a5541e103d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/GroupWorldSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.GroupListDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GroupWorldSearchItem extends WorldUISearchItem {
+
+ private Artifact group;
+ private Artifact selectedGroup;
+ private String groupName;
+ private final Branch branch;
+
+ public GroupWorldSearchItem(String displayName, String groupName, Branch branch) {
+ super(displayName, FrameworkImage.GROUP);
+ this.groupName = groupName;
+ this.branch = branch;
+ }
+
+ public GroupWorldSearchItem(Artifact group) {
+ super("Group Search", FrameworkImage.GROUP);
+ this.group = group;
+ this.branch = group.getBranch();
+ }
+
+ public GroupWorldSearchItem(Branch branch) {
+ this("Group Search", null, branch);
+ }
+
+ public GroupWorldSearchItem(GroupWorldSearchItem groupWorldSearchItem, int toDifferentiateFromBranch) {
+ super(groupWorldSearchItem, FrameworkImage.GROUP);
+ this.group = groupWorldSearchItem.group;
+ this.groupName = groupWorldSearchItem.groupName;
+ this.selectedGroup = groupWorldSearchItem.selectedGroup;
+ this.branch = groupWorldSearchItem.branch;
+ }
+
+ public String getGroupSearchName() {
+ if (group != null)
+ return group.getDescriptiveName();
+ else if (selectedGroup != null)
+ return selectedGroup.getDescriptiveName();
+ else if (groupName != null) return groupName;
+ return "";
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("Group Search - %s", getGroupSearchName());
+ }
+
+ public void getProduct() throws OseeCoreException {
+ if (groupName == null) return;
+ if (group == null && branch != null) group = UniversalGroup.getGroups(groupName, branch).iterator().next();
+ if (group == null) throw new IllegalArgumentException("Can't Find Universal Group for " + getName());
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ getProduct();
+ if (getSearchGroup() == null) return EMPTY_SET;
+ Collection<Artifact> arts =
+ getSearchGroup().getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS);
+ if (cancelled) return EMPTY_SET;
+ return arts;
+ }
+
+ private Artifact getSearchGroup() {
+ if (group != null) return group;
+ if (selectedGroup != null) return selectedGroup;
+ return null;
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ if (groupName != null) return;
+ if (group != null) return;
+ if (searchType == SearchType.ReSearch && selectedGroup != null) return;
+ GroupListDialog gld = new GroupListDialog(Display.getCurrent().getActiveShell());
+ int result = gld.open();
+ if (result == 0) {
+ selectedGroup = gld.getSelection();
+ return;
+ } else {
+ selectedGroup = null;
+ cancelled = true;
+ }
+ }
+
+ /**
+ * @param selectedGroup the selectedGroup to set
+ */
+ public void setSelectedGroup(Artifact selectedGroup) {
+ this.selectedGroup = selectedGroup;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new GroupWorldSearchItem(this, 0);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/LegacyPCRActionsWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/LegacyPCRActionsWorldSearchItem.java
new file mode 100644
index 00000000000..92a4d7ed8b2
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/LegacyPCRActionsWorldSearchItem.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.RelationCriteria;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class LegacyPCRActionsWorldSearchItem extends WorldUISearchItem {
+ private final boolean returnActions;
+ private final Collection<String> pcrIds;
+ private final Collection<TeamDefinitionArtifact> teamDefs;
+
+ public LegacyPCRActionsWorldSearchItem(Collection<String> pcrIds, Collection<TeamDefinitionArtifact> teamDefs, boolean returnActions) {
+ super("");
+ this.pcrIds = pcrIds;
+ this.teamDefs = teamDefs;
+ this.returnActions = returnActions;
+ }
+
+ public LegacyPCRActionsWorldSearchItem(Collection<TeamDefinitionArtifact> teamDefs, boolean returnActions) {
+ this(null, teamDefs, returnActions);
+ }
+
+ public LegacyPCRActionsWorldSearchItem(LegacyPCRActionsWorldSearchItem legacyPCRActionsWorldSearchItem) {
+ super(legacyPCRActionsWorldSearchItem);
+ this.returnActions = legacyPCRActionsWorldSearchItem.returnActions;
+ this.pcrIds = legacyPCRActionsWorldSearchItem.pcrIds;
+ this.teamDefs = legacyPCRActionsWorldSearchItem.teamDefs;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ List<AbstractArtifactSearchCriteria> criteria = new ArrayList<AbstractArtifactSearchCriteria>(4);
+
+ if (pcrIds != null && pcrIds.size() > 0) {
+ criteria.add(new AttributeCriteria(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName(), pcrIds));
+ } else {
+ criteria.add(new AttributeCriteria(ATSAttributes.LEGACY_PCR_ID_ATTRIBUTE.getStoreName()));
+ }
+
+ if (teamDefs != null && teamDefs.size() > 0) {
+ List<String> teamDefGuids = new ArrayList<String>(teamDefs.size());
+ for (TeamDefinitionArtifact teamDef : teamDefs) {
+ teamDefGuids.add(teamDef.getGuid());
+ }
+ criteria.add(new AttributeCriteria(ATSAttributes.TEAM_DEFINITION_GUID_ATTRIBUTE.getStoreName(), teamDefGuids));
+ }
+
+ if (returnActions) {
+ criteria.add(new RelationCriteria(AtsRelation.ActionToWorkflow_Action));
+ }
+
+ return ArtifactQuery.getArtifactsFromCriteria(AtsPlugin.getAtsBranch(), 200, criteria);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new LegacyPCRActionsWorldSearchItem(this);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MultipleHridSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MultipleHridSearchItem.java
new file mode 100644
index 00000000000..762d240fc6f
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MultipleHridSearchItem.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ActionArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.util.LegacyPCRActions;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryCheckDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MultipleHridSearchItem extends WorldUISearchItem {
+ private String enteredIds = "";
+ Pattern numberPattern = Pattern.compile("^[0-9]+$");
+ private boolean includeArtIds = false;
+ private Branch branch;
+
+ public MultipleHridSearchItem(String name) {
+ super(name, AtsImage.OPEN_BY_ID);
+ }
+
+ public MultipleHridSearchItem() {
+ this("Search by ID(s)");
+ }
+
+ public MultipleHridSearchItem(MultipleHridSearchItem multipleHridSearchItem) {
+ super(multipleHridSearchItem, AtsImage.OPEN_BY_ID);
+ this.enteredIds = multipleHridSearchItem.enteredIds;
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format(getName() + " - %s", enteredIds);
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ List<String> ids = new ArrayList<String>();
+ for (String str : enteredIds.split(",")) {
+ str = str.replaceAll("^\\s+", "");
+ str = str.replaceAll("\\s+$", "");
+ if (!str.equals("")) {
+ ids.add(str);
+ }
+ }
+
+ if (isCancelled()) return EMPTY_SET;
+
+ Set<Artifact> resultAtsArts = new HashSet<Artifact>();
+ Set<Artifact> resultNonAtsArts = new HashSet<Artifact>();
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+
+ Collection<ActionArtifact> actionArts =
+ LegacyPCRActions.getTeamsActionArtifacts(ids, (Collection<TeamDefinitionArtifact>) null);
+ if (actionArts.size() != 0) {
+ for (ActionArtifact teamWf : actionArts) {
+ resultAtsArts.add(teamWf);
+ }
+ }
+
+ // This does artId search
+ if (includeArtIds && branch != null) {
+ for (Artifact art : ArtifactQuery.getArtifactsFromIds(Lib.stringToIntegerList(enteredIds), branch, false)) {
+ artifacts.add(art);
+ }
+ }
+ // This does hrid/guid search
+ for (Artifact art : ArtifactQuery.getArtifactsFromIds(ids, AtsPlugin.getAtsBranch())) {
+ artifacts.add(art);
+ }
+
+ for (Artifact art : artifacts) {
+ if (art instanceof IATSArtifact) {
+ resultAtsArts.add(art);
+ } else {
+ resultNonAtsArts.add(art);
+ }
+ }
+
+ if (isCancelled()) return EMPTY_SET;
+
+ if (resultAtsArts.size() == 0 && resultNonAtsArts.size() == 0) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Invalid HRID/Guid/Legacy PCR Id(s): " + Lib.getCommaString(ids));
+ }
+ if (resultNonAtsArts.size() > 0) {
+ ArtifactEditor.editArtifacts(resultNonAtsArts);
+ }
+ return resultAtsArts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#getName()
+ */
+ @Override
+ public String getName() throws OseeCoreException {
+ return super.getName() + (includeArtIds ? " (include ArtIds)" : "");
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ EntryDialog ed = null;
+ if (AtsPlugin.isAtsAdmin()) {
+ ed = new EntryCheckDialog(getName(), "Enter Legacy ID, Guid or HRID (comma separated)", "Include ArtIds");
+ } else {
+ ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), getName(), null,
+ "Enter Legacy ID, Guid or HRID (comma separated)", MessageDialog.QUESTION, new String[] {"OK",
+ "Cancel"}, 0);
+ }
+ int response = ed.open();
+ if (response == 0) {
+ enteredIds = ed.getEntry();
+ if (ed instanceof EntryCheckDialog) {
+ includeArtIds = ((EntryCheckDialog) ed).isChecked();
+ if (includeArtIds) {
+ branch = BranchSelectionDialog.getBranchFromUser();
+ }
+ }
+ if (enteredIds.equals("oseerocks") || enteredIds.equals("osee rocks")) {
+ AWorkbench.popup("Confirmation", "Confirmed! Osee Rocks!");
+ cancelled = true;
+ return;
+ }
+ if (enteredIds.equals("purple icons")) {
+ AWorkbench.popup("Confirmation", "Yeehaw, Purple Icons Rule!!");
+ ImageManager.setOverrideImageEnum(FrameworkImage.PURPLE);
+ cancelled = true;
+ return;
+ }
+ return;
+ } else
+ enteredIds = null;
+ cancelled = true;
+ }
+
+ /**
+ * @return the enteredIds
+ */
+ public String getEnteredIds() {
+ return enteredIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MultipleHridSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyCompletedSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyCompletedSearchItem.java
new file mode 100644
index 00000000000..58ca779eb84
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyCompletedSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MyCompletedSearchItem extends UserSearchItem {
+
+ public MyCompletedSearchItem() {
+ this("My Completed", null);
+ }
+
+ public MyCompletedSearchItem(String name) {
+ super(name, null);
+ }
+
+ public MyCompletedSearchItem(String name, User user) {
+ super(name, user);
+ }
+
+ public MyCompletedSearchItem(MyCompletedSearchItem myCompletedSearchItem) {
+ super(myCompletedSearchItem);
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ if (isCancelled()) return EMPTY_SET;
+ // SMA having user as portion of current state attribute (Team WorkFlow and Task)
+ String valueToMatch =
+ "%state=\"Completed\" type=\"StateEntered\" userId=\"" + getSearchUser().getUserId() + "\"%";
+ return ArtifactQuery.getArtifactsFromAttribute(ATSAttributes.LOG_ATTRIBUTE.getStoreName(), valueToMatch,
+ AtsPlugin.getAtsBranch());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MyCompletedSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesSearchItem.java
new file mode 100644
index 00000000000..5c646db7745
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyFavoritesSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MyFavoritesSearchItem extends UserSearchItem {
+
+ public MyFavoritesSearchItem(String name) {
+ this(name, null);
+ }
+
+ public MyFavoritesSearchItem() {
+ this("My Favorites", null);
+ }
+
+ public MyFavoritesSearchItem(String name, User user) {
+ super(name, user, AtsImage.FAVORITE);
+ }
+
+ public MyFavoritesSearchItem(MyFavoritesSearchItem myFavoritesSearchItem) {
+ super(myFavoritesSearchItem, AtsImage.FAVORITE);
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ return user.getRelatedArtifacts(AtsRelation.FavoriteUser_Artifact);
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ if (user != null) return;
+ super.performUI(searchType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MyFavoritesSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyOrigSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyOrigSearchItem.java
new file mode 100644
index 00000000000..ba17ab8c511
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyOrigSearchItem.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MyOrigSearchItem extends UserSearchItem {
+
+ private final OriginatedState originatedState;
+
+ public enum OriginatedState {
+ InWork, All
+ };
+
+ public MyOrigSearchItem(String name, User user, OriginatedState originatedState) {
+ super(name, user, FrameworkImage.USER);
+ this.originatedState = originatedState;
+ }
+
+ public MyOrigSearchItem(MyOrigSearchItem myOrigSearchItem) {
+ super(myOrigSearchItem, null);
+ this.originatedState = myOrigSearchItem.originatedState;
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+
+ Collection<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromAttribute(ATSAttributes.LOG_ATTRIBUTE.getStoreName(),
+ "%type=\"Originated\" userId=\"" + user.getUserId() + "\"%", AtsPlugin.getAtsBranch());
+
+ List<Artifact> artifactsToReturn = new ArrayList<Artifact>(artifacts.size());
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof StateMachineArtifact) {
+ if (originatedState == OriginatedState.All || (originatedState == OriginatedState.InWork && !((StateMachineArtifact) artifact).getSmaMgr().isCancelledOrCompleted())) {
+ artifactsToReturn.add(artifact);
+ }
+ }
+ }
+ return artifactsToReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MyOrigSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyReviewWorkflowItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyReviewWorkflowItem.java
new file mode 100644
index 00000000000..155be32244c
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyReviewWorkflowItem.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MyReviewWorkflowItem extends UserSearchItem {
+
+ private final ReviewState reviewState;
+
+ public enum ReviewState {
+ InWork, All
+ };
+
+ public MyReviewWorkflowItem(String name, User user, ReviewState reviewState) {
+ super(name, user, AtsImage.REVIEW);
+ this.reviewState = reviewState;
+ }
+
+ public MyReviewWorkflowItem(MyReviewWorkflowItem myReviewWorkflowItem) {
+ super(myReviewWorkflowItem, AtsImage.REVIEW);
+ this.reviewState = myReviewWorkflowItem.reviewState;
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+
+ Set<Artifact> assigned =
+ RelationManager.getRelatedArtifacts(Arrays.asList(user), 1, CoreRelationEnumeration.Users_Artifact);
+ Set<Artifact> artifacts = new HashSet<Artifact>(50);
+ // Because user can be assigned directly to review or through being assigned to task, add in
+ // all the original artifacts.
+ artifacts.addAll(assigned);
+
+ if (reviewState == ReviewState.InWork) {
+ artifacts.addAll(RelationManager.getRelatedArtifacts(assigned, 1, AtsRelation.SmaToTask_Sma));
+ } else {
+ artifacts.addAll(ArtifactQuery.getArtifactsFromAttribute(ATSAttributes.STATE_ATTRIBUTE.getStoreName(),
+ "%<" + user.getUserId() + ">%", AtsPlugin.getAtsBranch()));
+ }
+
+ List<Artifact> artifactsToReturn = new ArrayList<Artifact>(artifacts.size());
+ for (Artifact artifact : artifacts) {
+ if (artifact instanceof ReviewSMArtifact) {
+ if (reviewState == ReviewState.All || (reviewState == ReviewState.InWork && !((StateMachineArtifact) artifact).getSmaMgr().isCancelledOrCompleted())) {
+ artifactsToReturn.add(artifact);
+ }
+ }
+ }
+ return artifactsToReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MyReviewWorkflowItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MySubscribedSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MySubscribedSearchItem.java
new file mode 100644
index 00000000000..b0b969764de
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MySubscribedSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MySubscribedSearchItem extends UserSearchItem {
+
+ public MySubscribedSearchItem(String name) {
+ this(name, null);
+ }
+
+ public MySubscribedSearchItem() {
+ this("My Subscribed", null);
+ }
+
+ public MySubscribedSearchItem(String name, User user) {
+ super(name, user, AtsImage.SUBSCRIBED);
+ }
+
+ public MySubscribedSearchItem(MySubscribedSearchItem mySubscribedSearchItem) {
+ super(mySubscribedSearchItem, AtsImage.SUBSCRIBED);
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ return user.getRelatedArtifacts(AtsRelation.SubscribedUser_Artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MySubscribedSearchItem(this);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyWorldSearchItem.java
new file mode 100644
index 00000000000..c9f3ac199a1
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/MyWorldSearchItem.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.artifact.ReviewSMArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MyWorldSearchItem extends UserSearchItem {
+
+ public MyWorldSearchItem(String name) {
+ this(name, null);
+ }
+
+ public MyWorldSearchItem() {
+ this("My World", null);
+ }
+
+ public MyWorldSearchItem(String name, User user) {
+ super(name, user, AtsImage.GLOBE);
+ }
+
+ public MyWorldSearchItem(MyWorldSearchItem myWorldSearchItem) {
+ super(myWorldSearchItem);
+ }
+
+ @Override
+ public Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ Set<Artifact> assigned =
+ RelationManager.getRelatedArtifacts(Arrays.asList(user), 1, CoreRelationEnumeration.Users_Artifact);
+
+ List<Artifact> artifactsToReturn = new ArrayList<Artifact>(assigned.size());
+ for (Artifact artifact : assigned) {
+ if ((artifact instanceof TeamWorkFlowArtifact) || (artifact instanceof ReviewSMArtifact)) {
+ artifactsToReturn.add(artifact);
+ }
+ if (artifact instanceof TaskArtifact) {
+ artifactsToReturn.add(((TaskArtifact) artifact).getParentTeamWorkflow());
+ }
+ }
+ return artifactsToReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new MyWorldSearchItem(this);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/NextVersionSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/NextVersionSearchItem.java
new file mode 100644
index 00000000000..f398f8f4a53
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/NextVersionSearchItem.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world.search;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NextVersionSearchItem extends WorldUISearchItem {
+
+ private final TeamDefinitionArtifact teamDefHoldingVersions;
+ private TeamDefinitionArtifact selectedTeamDef;
+ private VersionArtifact selectedVersionArt;
+
+ /**
+ * @param name
+ * @throws OseeArgumentException
+ */
+ public NextVersionSearchItem(TeamDefinitionArtifact teamDefHoldingVersions, LoadView loadView) {
+ this(null, teamDefHoldingVersions, loadView);
+ }
+
+ public NextVersionSearchItem(String name, TeamDefinitionArtifact teamDefHoldingVersions, LoadView loadView) {
+ super(name != null ? name : "Workflows Targeted-For Next Version", loadView, FrameworkImage.VERSION);
+ this.teamDefHoldingVersions = teamDefHoldingVersions;
+ }
+
+ public NextVersionSearchItem(NextVersionSearchItem nextVersionSearchItem) {
+ super(nextVersionSearchItem, FrameworkImage.VERSION);
+ this.teamDefHoldingVersions = nextVersionSearchItem.teamDefHoldingVersions;
+ this.selectedTeamDef = nextVersionSearchItem.selectedTeamDef;
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ String name = super.getName();
+ TeamDefinitionArtifact teamDef = getTeamDefinition(searchType);
+ try {
+ if (teamDef != null) {
+ name += (teamDef != null ? " - " + teamDef.getDescriptiveName() : "");
+ selectedVersionArt = teamDef.getNextReleaseVersion();
+ name += (selectedVersionArt != null ? " - " + selectedVersionArt.getDescriptiveName() : "");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return "Exception Occurred - See Log - " + ex.getLocalizedMessage();
+ }
+ return name;
+ }
+
+ private TeamDefinitionArtifact getTeamDefinition(SearchType searchType) {
+ if (teamDefHoldingVersions != null) return teamDefHoldingVersions;
+ return selectedTeamDef;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#performSearch()
+ */
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ if (isCancelled()) return EMPTY_SET;
+ if (getTeamDefinition(searchType).getNextReleaseVersion() == null) {
+ AWorkbench.popup("ERROR", "No version marked as Next Release for \"" + getTeamDefinition(searchType) + "\"");
+ return EMPTY_SET;
+ }
+ List<Artifact> arts =
+ getTeamDefinition(searchType).getNextReleaseVersion().getRelatedArtifacts(
+ AtsRelation.TeamWorkflowTargetedForVersion_Workflow);
+ if (isCancelled()) return EMPTY_SET;
+ return arts;
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ if (teamDefHoldingVersions != null) return;
+ if (searchType == SearchType.ReSearch && selectedTeamDef != null) return;
+ try {
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Both));
+ int result = ld.open();
+ if (result == 0) {
+ selectedTeamDef = (TeamDefinitionArtifact) ld.getResult()[0];
+ return;
+ } else
+ cancelled = true;
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ cancelled = true;
+ }
+
+ /**
+ * @param selectedTeamDef the selectedTeamDef to set
+ */
+ public void setSelectedTeamDef(TeamDefinitionArtifact selectedTeamDef) {
+ this.selectedTeamDef = selectedTeamDef;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new NextVersionSearchItem(this);
+ }
+
+ /**
+ * @return the selectedVersionArt
+ */
+ public VersionArtifact getSelectedVersionArt() {
+ return selectedVersionArt;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ShowOpenWorkflowsByArtifactType.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ShowOpenWorkflowsByArtifactType.java
new file mode 100644
index 00000000000..f9100279e47
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/ShowOpenWorkflowsByArtifactType.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Operator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ShowOpenWorkflowsByArtifactType extends WorldUISearchItem {
+
+ private final String artifactTypeName;
+ private final boolean showFinished;
+ private final boolean showWorkflow;
+
+ public ShowOpenWorkflowsByArtifactType(String displayName, String artifactTypeName, boolean showFinished, boolean showWorkflow) {
+ super(displayName);
+ this.artifactTypeName = artifactTypeName;
+ this.showFinished = showFinished;
+ this.showWorkflow = showWorkflow;
+ }
+
+ public ShowOpenWorkflowsByArtifactType(ShowOpenWorkflowsByArtifactType showOpenWorkflowsByArtifactType) {
+ super(showOpenWorkflowsByArtifactType);
+ this.artifactTypeName = showOpenWorkflowsByArtifactType.artifactTypeName;
+ this.showFinished = showOpenWorkflowsByArtifactType.showFinished;
+ this.showWorkflow = showOpenWorkflowsByArtifactType.showWorkflow;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+
+ List<Artifact> artifacts = null;
+ if (!showFinished) {
+ List<AbstractArtifactSearchCriteria> criteria = new ArrayList<AbstractArtifactSearchCriteria>();
+ List<String> cancelOrComplete = new ArrayList<String>(2);
+ cancelOrComplete.add(DefaultTeamState.Cancelled.name() + ";;;");
+ cancelOrComplete.add(DefaultTeamState.Completed.name() + ";;;");
+ criteria.add(new AttributeCriteria(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(), cancelOrComplete,
+ Operator.NOT_EQUAL));
+ artifacts = ArtifactQuery.getArtifactsFromTypeAnd(artifactTypeName, AtsPlugin.getAtsBranch(), 500, criteria);
+ } else {
+ artifacts = ArtifactQuery.getArtifactsFromType(artifactTypeName, AtsPlugin.getAtsBranch());
+ }
+
+ if (showWorkflow) {
+ return RelationManager.getRelatedArtifacts(artifacts, 1, AtsRelation.TeamWorkflowToReview_Team);
+ } else {
+ return artifacts;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new ShowOpenWorkflowsByArtifactType(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/StateWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/StateWorldSearchItem.java
new file mode 100644
index 00000000000..8cb70f74f3d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/StateWorldSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StateWorldSearchItem extends WorldUISearchItem {
+
+ private final String stateClass;
+ private String selectedStateClass;
+
+ public StateWorldSearchItem(String name) {
+ this(name, null);
+ }
+
+ public StateWorldSearchItem() {
+ this("Search by Current State", null);
+
+ }
+
+ public StateWorldSearchItem(StateWorldSearchItem stateWorldSearchItem) {
+ super(stateWorldSearchItem, AtsImage.GLOBE);
+ this.stateClass = stateWorldSearchItem.stateClass;
+ }
+
+ public String getStateSearchName() {
+ if (stateClass != null)
+ return stateClass;
+ else
+ return selectedStateClass;
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("%s - %s", super.getSelectedName(searchType), getStateSearchName());
+ }
+
+ public StateWorldSearchItem(String name, String stateClass) {
+ super(name);
+ this.stateClass = stateClass;
+ }
+
+ private String getSearchStateClass() {
+ if (stateClass != null) return stateClass;
+ return selectedStateClass;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ Collection<Artifact> arts =
+ ArtifactQuery.getArtifactsFromAttribute(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(),
+ getSearchStateClass() + ";%", AtsPlugin.getAtsBranch());
+ if (isCancelled()) return EMPTY_SET;
+ return arts;
+
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ if (stateClass != null) return;
+ if (searchType == SearchType.ReSearch && selectedStateClass != null) return;
+ EntryDialog ed = new EntryDialog("Enter State", "Enter state name.");
+ if (ed.open() == 0) {
+ selectedStateClass = ed.getEntry();
+ return;
+ }
+ cancelled = true;
+ }
+
+ /**
+ * @param selectedStateClass the selectedStateClass to set
+ */
+ public void setSelectedStateClass(String selectedStateClass) {
+ this.selectedStateClass = selectedStateClass;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new StateWorldSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TaskSearchWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TaskSearchWorldSearchItem.java
new file mode 100644
index 00000000000..dd5edd61180
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TaskSearchWorldSearchItem.java
@@ -0,0 +1,408 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TaskArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.task.ITaskEditorProvider;
+import org.eclipse.osee.ats.task.TaskEditorParameterSearchItem;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.ats.util.widgets.XHyperlabelTeamDefinitionSelection;
+import org.eclipse.osee.ats.world.search.TeamWorldSearchItem.ReleasedOption;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlabelGroupSelection;
+import org.eclipse.osee.framework.ui.skynet.widgets.XMembersCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TaskSearchWorldSearchItem extends TaskEditorParameterSearchItem {
+
+ private XMembersCombo assigneeCombo;
+ private XCheckBox includeCompletedCancelledCheckbox;
+ private XHyperlabelTeamDefinitionSelection teamCombo = null;
+ private XHyperlabelGroupSelection groupWidget = null;
+ private XCombo versionCombo = null;
+
+ /**
+ * @param worldSearchItem
+ */
+ public TaskSearchWorldSearchItem(WorldSearchItem worldSearchItem) {
+ super(worldSearchItem);
+ }
+
+ /**
+ * @param name
+ * @param loadView
+ */
+ public TaskSearchWorldSearchItem() {
+ super("Task Search");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.TaskEditorParameterSearchItem#getParameterXWidgetXml()
+ */
+ @Override
+ public String getParameterXWidgetXml() throws OseeCoreException {
+ return "<xWidgets>" +
+ //
+ "<XWidget xwidgetType=\"XHyperlabelTeamDefinitionSelection\" displayName=\"Team Definitions(s)\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCombo()\" beginComposite=\"8\" displayName=\"Version\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCheckBox\" displayName=\"Include Completed/Cancelled\" defaultValue=\"false\" labelAfter=\"true\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XHyperlabelGroupSelection\" displayName=\"Group(s)\" horizontalLabel=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XMembersCombo\" displayName=\"Assignee\" horizontalLabel=\"true\"/>" +
+ //
+ "</xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.TaskEditorParameterSearchItem#getTaskEditorTaskArtifacts()
+ */
+ @Override
+ public Collection<? extends Artifact> getTaskEditorTaskArtifacts() throws OseeCoreException {
+ List<Artifact> workflows = new ArrayList<Artifact>();
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ VersionArtifact verArt = getSelectedVersionArtifact();
+ Collection<Artifact> groups = getSelectedGroups();
+ User user = getSelectedUser();
+
+ // If only user selected, handle that case separately
+ if (verArt == null && teamDefs.size() == 0 && user != null) {
+ return handleOnlyUserSelected();
+ } // If version specified, get workflows from targeted relation
+ if (verArt != null) {
+ for (Artifact art : verArt.getRelatedArtifacts(AtsRelation.TeamWorkflowTargetedForVersion_Workflow)) {
+ if (teamDefs.size() == 0) {
+ workflows.add(art);
+ }
+ // Filter by team def if specified
+ else if (teamDefs.contains((((TeamWorkFlowArtifact) art).getTeamDefinition()))) {
+ workflows.add(art);
+ }
+ }
+ }
+ // Else, get workflows from teamdefs
+ else if (teamDefs.size() > 0) {
+ TeamWorldSearchItem teamWorldSearchItem =
+ new TeamWorldSearchItem("", teamDefs, true, false, false, null, null, ReleasedOption.UnReleased);
+ workflows.addAll(teamWorldSearchItem.performSearchGetResults(false, SearchType.Search));
+ } else if (groups.size() > 0) {
+ Set<TaskArtifact> taskArts = new HashSet<TaskArtifact>();
+ for (Artifact groupArt : groups) {
+ for (Artifact art : groupArt.getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS)) {
+ if (art instanceof TaskArtifact) {
+ taskArts.add((TaskArtifact) art);
+ } else if (art instanceof StateMachineArtifact) {
+ taskArts.addAll(((StateMachineArtifact) art).getSmaMgr().getTaskMgr().getTaskArtifacts());
+ }
+ }
+ }
+ return filterByCompletedAndSelectedUser(taskArts);
+ }
+
+ // Bulk load tasks related to workflows
+ Collection<Artifact> artifacts = RelationManager.getRelatedArtifacts(workflows, 1, AtsRelation.SmaToTask_Task);
+
+ // Apply the remaining criteria
+ return filterByCompletedAndSelectedUser(artifacts);
+ }
+
+ private Collection<TaskArtifact> handleOnlyUserSelected() throws OseeCoreException {
+ return filterByCompletedAndSelectedUser(getUserAssignedTaskArtifacts());
+ }
+
+ private Collection<TaskArtifact> getUserAssignedTaskArtifacts() throws OseeCoreException {
+ Set<TaskArtifact> tasks = new HashSet<TaskArtifact>();
+ for (Artifact art : getSelectedUser().getRelatedArtifacts(CoreRelationEnumeration.Users_Artifact)) {
+ if (art instanceof TaskArtifact) {
+ tasks.add((TaskArtifact) art);
+ }
+ }
+ return tasks;
+ }
+
+ private Collection<TaskArtifact> filterByCompletedAndSelectedUser(Collection<? extends Artifact> artifacts) throws OseeCoreException {
+ Set<TaskArtifact> tasks = new HashSet<TaskArtifact>();
+ for (Artifact art : artifacts) {
+ TaskArtifact taskArt = (TaskArtifact) art;
+ // If not include completed and task is such, skip this task
+ if (!isIncludeCompletedCancelledCheckbox() && taskArt.getSmaMgr().isCancelledOrCompleted()) {
+ continue;
+ }
+ // If include completed and task is such and user not implementer, skip this task
+ if (isIncludeCompletedCancelledCheckbox() && taskArt.getSmaMgr().isCancelledOrCompleted() && getSelectedUser() != null && taskArt.getImplementers().contains(
+ getSelectedUser())) {
+ tasks.add(taskArt);
+ continue;
+ }
+ // If user is selected and not user is assigned, skip this task
+ else if (getSelectedUser() != null && !taskArt.getSmaMgr().getStateMgr().getAssignees().contains(
+ getSelectedUser())) {
+ continue;
+ }
+ tasks.add(taskArt);
+ }
+ return tasks;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.TaskEditorParameterSearchItem#isParameterSelectionValid()
+ */
+ @Override
+ public Result isParameterSelectionValid() throws OseeCoreException {
+ if (getSelectedUser() != null && isIncludeCompletedCancelledCheckbox() && getSelectedVersionArtifact() == null && getSelectedTeamDefinitions().size() == 0) {
+ // This case is unsupported and should be filtered out prior to this point
+ throw new OseeArgumentException("Unsupported User and Include Completed selected.");
+ }
+
+ // If only user selected, handle that case separately
+ if (getSelectedVersionArtifact() == null && getSelectedTeamDefinitions().size() == 0 && getSelectedUser() != null) {
+ return Result.TrueResult;
+ }
+
+ if (getSelectedGroups().size() > 0 && (getSelectedVersionArtifact() != null || getSelectedTeamDefinitions().size() > 0)) {
+ // This case is unsupported and should be filtered out prior to this point
+ throw new OseeArgumentException("Unsupported Groups selection with Version or Team(s).");
+ }
+ return Result.TrueResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#getTableLoadOptions()
+ */
+ @Override
+ public Collection<TableLoadOption> getTableLoadOptions() throws OseeCoreException {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#getTaskEditorLabel(org.eclipse.osee.ats.world.search.WorldSearchItem.SearchType)
+ */
+ @Override
+ public String getTaskEditorLabel(SearchType searchType) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ if (teamDefs.size() > 0) {
+ sb.append(" - Teams: " + org.eclipse.osee.framework.jdk.core.util.Collections.toString(",", teamDefs));
+ }
+ if (getSelectedVersionArtifact() != null) {
+ sb.append(" - Version: " + getSelectedVersionArtifact());
+ }
+ if (getSelectedGroups().size() > 0) {
+ sb.append(" - Groups: " + Collections.toString(",", getSelectedGroups()));
+ }
+ if (getSelectedUser() != null) {
+ sb.append(" - Assignee: " + getSelectedUser());
+ }
+ if (isIncludeCompletedCancelledCheckbox()) {
+ sb.append(" - Include Completed/Cancelled");
+ }
+ return "Tasks" + sb.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#createXWidgetLayoutData(org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData, org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData layoutData, XWidget widget, FormToolkit toolkit, Artifact art, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#widgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreating(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ if (widget.getLabel().equals("Group(s)")) {
+ groupWidget = (XHyperlabelGroupSelection) widget;
+ }
+ if (widget.getLabel().equals("Assignee")) {
+ assigneeCombo = (XMembersCombo) widget;
+ }
+ if (widget.getLabel().equals("Include Completed/Cancelled")) {
+ includeCompletedCancelledCheckbox = (XCheckBox) widget;
+ }
+ if (widget.getLabel().equals("Version")) {
+ versionCombo = (XCombo) widget;
+ versionCombo.getComboBox().setVisibleItemCount(25);
+ widget.setToolTip("Select Team to populate Version list");
+ }
+ if (widget.getLabel().equals("Team Definitions(s)")) {
+ teamCombo = (XHyperlabelTeamDefinitionSelection) widget;
+ teamCombo.addXModifiedListener(new XModifiedListener() {
+ @Override
+ public void widgetModified(XWidget widget) {
+ if (versionCombo != null) {
+ try {
+ Collection<TeamDefinitionArtifact> teamDefArts = getSelectedTeamDefinitions();
+ if (teamDefArts.size() == 0) {
+ versionCombo.setDataStrings(new String[] {});
+ return;
+ }
+ TeamDefinitionArtifact teamDefHoldingVersions =
+ teamDefArts.iterator().next().getTeamDefinitionHoldingVersions();
+ if (teamDefHoldingVersions == null) {
+ versionCombo.setDataStrings(new String[] {});
+ return;
+ }
+ Collection<String> names =
+ Artifacts.artNames(teamDefHoldingVersions.getVersionsArtifacts(VersionReleaseType.Both));
+ if (names.size() == 0) {
+ versionCombo.setDataStrings(new String[] {});
+ return;
+ }
+ versionCombo.setDataStrings(names.toArray(new String[names.size()]));
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ private User getSelectedUser() {
+ if (assigneeCombo == null) return null;
+ return assigneeCombo.getUser();
+ }
+
+ public void setSelectedUser(User user) {
+ if (assigneeCombo != null) assigneeCombo.set(user);
+ }
+
+ private boolean isIncludeCompletedCancelledCheckbox() {
+ if (includeCompletedCancelledCheckbox == null) return false;
+ return includeCompletedCancelledCheckbox.isSelected();
+ }
+
+ public void setIncludeCompletedCancelledCheckbox(boolean selected) {
+ if (includeCompletedCancelledCheckbox != null) includeCompletedCancelledCheckbox.set(selected);
+ }
+
+ private VersionArtifact getSelectedVersionArtifact() throws OseeCoreException {
+ if (versionCombo == null) return null;
+ String versionStr = versionCombo.get();
+ if (versionStr == null || versionStr.equals("")) return null;
+ Collection<TeamDefinitionArtifact> teamDefs = getSelectedTeamDefinitions();
+ if (teamDefs.size() > 0) {
+ TeamDefinitionArtifact teamDefHoldingVersions = teamDefs.iterator().next().getTeamDefinitionHoldingVersions();
+ if (teamDefHoldingVersions == null) return null;
+ for (VersionArtifact versionArtifact : teamDefHoldingVersions.getVersionsArtifacts(VersionReleaseType.Both)) {
+ if (versionArtifact.getDescriptiveName().equals(versionStr)) {
+ return versionArtifact;
+ }
+ }
+ }
+ return null;
+ }
+
+ public void setVersion(String versionStr) {
+ if (versionCombo != null && versionCombo.getInDataStrings() != null) {
+ // should check if the version combo was populated
+ if (versionCombo.getInDataStrings().length > 0) {
+ versionCombo.set(versionStr);
+ }
+ }
+ }
+
+ private Collection<TeamDefinitionArtifact> getSelectedTeamDefinitions() throws OseeCoreException {
+ return teamCombo.getSelectedTeamDefintions();
+ }
+
+ public void setSelectedTeamDefinitions(Set<TeamDefinitionArtifact> selectedUsers) {
+ if (teamCombo != null) {
+ teamCombo.setSelectedTeamDefs(selectedUsers);
+ teamCombo.notifyXModifiedListeners();
+ }
+ }
+
+ private Collection<Artifact> getSelectedGroups() throws OseeCoreException {
+ return groupWidget.getSelectedGroups();
+ }
+
+ public void setSelectedGroups(Set<Artifact> selectedUsers) {
+ if (groupWidget != null) groupWidget.setSelectedGroups(selectedUsers);
+ }
+
+ public void handleSelectedGroupsClear() {
+ if (groupWidget != null) groupWidget.handleClear();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#copy()
+ */
+ @Override
+ public TaskSearchWorldSearchItem copy() {
+ return new TaskSearchWorldSearchItem(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#copyProvider()
+ */
+ @Override
+ public ITaskEditorProvider copyProvider() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#setCustomizeData(org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.CustomizeData)
+ */
+ @Override
+ public void setCustomizeData(CustomizeData customizeData) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.task.ITaskEditorProvider#setTableLoadOptions(org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption[])
+ */
+ @Override
+ public void setTableLoadOptions(TableLoadOption... tableLoadOptions) {
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TeamWorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TeamWorldSearchItem.java
new file mode 100644
index 00000000000..7540561cfdc
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/TeamWorldSearchItem.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.StateMachineArtifact;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact.DefaultTeamState;
+import org.eclipse.osee.ats.config.AtsCache;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeCriteria;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Operator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TeamWorldSearchItem extends WorldUISearchItem {
+
+ public enum ReleasedOption {
+ Released, UnReleased, Both
+ };
+ private Collection<TeamDefinitionArtifact> teamDefs;
+ private final boolean recurseChildren;
+ private boolean showFinished;
+ private boolean showAction;
+ private final Collection<String> teamDefNames;
+ private final ChangeType changeType;
+ private final VersionArtifact versionArt;
+ private final User userArt;
+ private final ReleasedOption releasedOption;
+
+ public TeamWorldSearchItem(String displayName, String[] teamDefNames, boolean showFinished, boolean showAction, boolean recurseChildren, ChangeType changeType, VersionArtifact versionArt, User userArt, ReleasedOption releasedOption) {
+ super(displayName, AtsImage.TEAM_WORKFLOW);
+ this.versionArt = versionArt;
+ this.userArt = userArt;
+ if (teamDefNames != null) {
+ this.teamDefNames = Arrays.asList(teamDefNames);
+ } else {
+ this.teamDefNames = null;
+ }
+ this.showFinished = showFinished;
+ this.releasedOption = releasedOption;
+ this.showAction = showAction;
+ this.recurseChildren = recurseChildren;
+ this.changeType = changeType;
+ }
+
+ public TeamWorldSearchItem(String displayName, Collection<TeamDefinitionArtifact> teamDefs, boolean showFinished, boolean showAction, boolean recurseChildren, VersionArtifact versionArt, User userArt, ReleasedOption releasedOption) {
+ super(displayName, AtsImage.TEAM_WORKFLOW);
+ this.versionArt = versionArt;
+ this.userArt = userArt;
+ this.recurseChildren = recurseChildren;
+ this.releasedOption = releasedOption;
+ this.teamDefNames = null;
+ this.teamDefs = teamDefs;
+ this.showFinished = showFinished;
+ this.showAction = showAction;
+ this.changeType = null;
+ }
+
+ public TeamWorldSearchItem(TeamWorldSearchItem teamWorldUISearchItem) {
+ super(teamWorldUISearchItem, AtsImage.TEAM_WORKFLOW);
+ this.versionArt = null;
+ this.userArt = null;
+ this.releasedOption = null;
+ this.recurseChildren = teamWorldUISearchItem.recurseChildren;
+ this.teamDefNames = teamWorldUISearchItem.teamDefNames;
+ this.teamDefs = teamWorldUISearchItem.teamDefs;
+ this.showFinished = teamWorldUISearchItem.showFinished;
+ this.showAction = teamWorldUISearchItem.showAction;
+ this.changeType = teamWorldUISearchItem.changeType;
+ }
+
+ public Collection<String> getProductSearchName() {
+ if (teamDefNames != null)
+ return teamDefNames;
+ else if (teamDefs != null) return Artifacts.artNames(teamDefs);
+ return new ArrayList<String>();
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("%s - %s", super.getSelectedName(searchType), getProductSearchName());
+ }
+
+ /**
+ * Loads all team definitions if specified by name versus by team definition class
+ *
+ * @throws IllegalArgumentException
+ */
+ public void getTeamDefs() throws OseeCoreException {
+ if (teamDefNames != null && teamDefs == null) {
+ teamDefs = new HashSet<TeamDefinitionArtifact>();
+ for (String teamDefName : teamDefNames) {
+ TeamDefinitionArtifact aia = AtsCache.getSoleArtifactByName(teamDefName, TeamDefinitionArtifact.class);
+ if (aia != null) {
+ teamDefs.add(aia);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ getTeamDefs();
+ Set<String> teamDefinitionGuids = new HashSet<String>(teamDefs.size());
+ for (TeamDefinitionArtifact teamDef : teamDefs) {
+ if (recurseChildren) {
+ for (TeamDefinitionArtifact childTeamDef : TeamDefinitionArtifact.getTeamsFromItemAndChildren(teamDef)) {
+ teamDefinitionGuids.add(childTeamDef.getGuid());
+ }
+ } else {
+ teamDefinitionGuids.add(teamDef.getGuid());
+ }
+ }
+ List<AbstractArtifactSearchCriteria> criteria = new ArrayList<AbstractArtifactSearchCriteria>();
+ criteria.add(new AttributeCriteria(ATSAttributes.TEAM_DEFINITION_GUID_ATTRIBUTE.getStoreName(),
+ teamDefinitionGuids));
+
+ if (!showFinished) {
+ List<String> cancelOrComplete = new ArrayList<String>(2);
+ cancelOrComplete.add(DefaultTeamState.Cancelled.name() + ";;;");
+ cancelOrComplete.add(DefaultTeamState.Completed.name() + ";;;");
+ criteria.add(new AttributeCriteria(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(), cancelOrComplete,
+ Operator.NOT_EQUAL));
+ }
+ if (changeType != null) {
+ criteria.add(new AttributeCriteria(ATSAttributes.CHANGE_TYPE_ATTRIBUTE.getStoreName(), changeType.name()));
+ }
+
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromCriteria(AtsPlugin.getAtsBranch(), 1000, criteria);
+
+ Set<Artifact> resultSet = new HashSet<Artifact>();
+ for (Artifact art : artifacts) {
+ StateMachineArtifact sma = (StateMachineArtifact) art;
+ // don't include if userArt specified and userArt not assignee
+ if (userArt != null && !sma.getSmaMgr().getStateMgr().getAssignees().contains(userArt)) {
+ continue;
+ }
+ // don't include if version specified and workflow's not targeted for version
+ if (versionArt != null) {
+ TeamWorkFlowArtifact team = sma.getParentTeamWorkflow();
+ if (team != null && (team.getWorldViewTargetedVersion() == null || !team.getWorldViewTargetedVersion().equals(
+ versionArt))) {
+ continue;
+ }
+ }
+ // don't include if release option doesn't match relese state of targeted version
+ if (releasedOption != ReleasedOption.Both) {
+ TeamWorkFlowArtifact team = sma.getParentTeamWorkflow();
+ if (team != null) {
+ // skip if released is desired and version artifact is not set
+ VersionArtifact setVerArt = team.getWorldViewTargetedVersion();
+ if (setVerArt == null && releasedOption == ReleasedOption.Released) {
+ continue;
+ }
+ // skip of version release is opposite of desired
+ if (setVerArt != null) {
+ if (releasedOption == ReleasedOption.Released && !setVerArt.isReleased()) {
+ continue;
+ } else if (releasedOption == ReleasedOption.UnReleased && setVerArt.isReleased()) {
+ continue;
+ }
+ }
+ }
+ }
+ resultSet.add(art);
+ }
+ if (showAction) {
+ return RelationManager.getRelatedArtifacts(resultSet, 1, AtsRelation.ActionToWorkflow_Action);
+ } else {
+ return resultSet;
+ }
+
+ }
+
+ /**
+ * @param showAction The showAction to set.
+ */
+ public void setShowAction(boolean showAction) {
+ this.showAction = showAction;
+ }
+
+ /**
+ * @param showFinished The showFinished to set.
+ */
+ public void setShowFinished(boolean showFinished) {
+ this.showFinished = showFinished;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new TeamWorldSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserCommunitySearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserCommunitySearchItem.java
new file mode 100644
index 00000000000..205a67023bf
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserCommunitySearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsImage;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.util.widgets.dialog.UserCommunityListDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserCommunitySearchItem extends WorldUISearchItem {
+
+ private String userComm;
+ private String selectedUserComm;
+ private final String userCommName;
+
+ public UserCommunitySearchItem(String displayName, String userCommName) throws OseeArgumentException {
+ super(displayName, AtsImage.GLOBE);
+ this.userCommName = userCommName;
+ }
+
+ public UserCommunitySearchItem() throws OseeArgumentException {
+ this("User Community Search", null);
+ }
+
+ public UserCommunitySearchItem(UserCommunitySearchItem userCommunitySearchItem) {
+ super(userCommunitySearchItem, AtsImage.GLOBE);
+ this.userComm = userCommunitySearchItem.userComm;
+ this.userCommName = userCommunitySearchItem.userCommName;
+ }
+
+ public String getGroupSearchName() {
+ if (userComm != null)
+ return userComm;
+ else if (selectedUserComm != null) return selectedUserComm;
+ return "";
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("%s - %s", super.getSelectedName(searchType), getGroupSearchName());
+ }
+
+ private String getSearchUserComm() {
+ if (userComm != null) return userComm;
+ return selectedUserComm;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ if (isCancelled()) return EMPTY_SET;
+
+ return ArtifactQuery.getArtifactsFromTypeAndAttribute(TeamWorkFlowArtifact.ARTIFACT_NAME,
+ ATSAttributes.USER_COMMUNITY_ATTRIBUTE.getStoreName(), getSearchUserComm(), AtsPlugin.getAtsBranch());
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ if (userCommName != null) return;
+ if (userComm != null) return;
+ if (searchType == SearchType.ReSearch && selectedUserComm != null) return;
+ UserCommunityListDialog gld = new UserCommunityListDialog();
+ int result = gld.open();
+ if (result == 0) {
+ if (gld.getResult().length == 0) {
+ AWorkbench.popup("ERROR", "No Group Selected");
+ cancelled = true;
+ return;
+ }
+ selectedUserComm = (String) gld.getResult()[0];
+ return;
+ } else {
+ selectedUserComm = null;
+ cancelled = true;
+ }
+ }
+
+ /**
+ * @param selectedUserComm the selectedUserComm to set
+ */
+ public void setSelectedUserComm(String selectedUserComm) {
+ this.selectedUserComm = selectedUserComm;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new UserCommunitySearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserRelatedToAtsObjectSearch.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserRelatedToAtsObjectSearch.java
new file mode 100644
index 00000000000..0539b9f6f96
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserRelatedToAtsObjectSearch.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.ATSAttributes;
+import org.eclipse.osee.ats.util.AtsRelation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeValueSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator;
+import org.eclipse.osee.framework.skynet.core.artifact.search.FromArtifactsSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+
+/**
+ * Return all ATS Objects that a user is related to through logs, review roles, defects and etc.
+ *
+ * @author Donald G. Dunne
+ */
+public class UserRelatedToAtsObjectSearch extends UserSearchItem {
+
+ private final boolean activeObjectsOnly;
+
+ public UserRelatedToAtsObjectSearch(String name, User user, boolean activeObjectsOnly, LoadView loadView) {
+ super(name, user);
+ this.activeObjectsOnly = activeObjectsOnly;
+ setLoadView(loadView);
+ }
+
+ public UserRelatedToAtsObjectSearch(UserRelatedToAtsObjectSearch userRelatedToAtsObjectSearch) {
+ super(userRelatedToAtsObjectSearch);
+ this.activeObjectsOnly = userRelatedToAtsObjectSearch.activeObjectsOnly;
+ }
+
+ @Override
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ // SMA having user as portion of current state attribute (Team WorkFlow and Task)
+ List<ISearchPrimitive> currentStateCriteria = new LinkedList<ISearchPrimitive>();
+ currentStateCriteria.add(new AttributeValueSearch(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(),
+ "<" + user.getUserId() + ">", DepricatedOperator.CONTAINS));
+ if (!activeObjectsOnly) {
+ currentStateCriteria.add(new AttributeValueSearch(ATSAttributes.STATE_ATTRIBUTE.getStoreName(),
+ "<" + user.getUserId() + ">", DepricatedOperator.CONTAINS));
+ currentStateCriteria.add(new AttributeValueSearch(ATSAttributes.LOG_ATTRIBUTE.getStoreName(),
+ "userId=\"" + user.getUserId() + "\"", DepricatedOperator.CONTAINS));
+ }
+ currentStateCriteria.add(new AttributeValueSearch(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(),
+ "userId>" + user.getUserId() + "</userId", DepricatedOperator.CONTAINS));
+ currentStateCriteria.add(new AttributeValueSearch(ATSAttributes.CURRENT_STATE_ATTRIBUTE.getStoreName(),
+ "user>" + user.getUserId() + "</user", DepricatedOperator.CONTAINS));
+ FromArtifactsSearch currentStateSearch = new FromArtifactsSearch(currentStateCriteria, false);
+
+ if (isCancelled()) return EMPTY_SET;
+ List<Artifact> arts = new ArrayList<Artifact>();
+ arts.addAll(ArtifactPersistenceManager.getArtifacts(currentStateCriteria, false, AtsPlugin.getAtsBranch()));
+ arts.addAll(user.getRelatedArtifacts(AtsRelation.TeamLead_Team));
+ arts.addAll(user.getRelatedArtifacts(AtsRelation.TeamMember_Team));
+ arts.addAll(user.getRelatedArtifacts(AtsRelation.FavoriteUser_Artifact));
+ arts.addAll(user.getRelatedArtifacts(AtsRelation.SubscribedUser_Artifact));
+ arts.addAll(user.getRelatedArtifacts(AtsRelation.PrivilegedMember_Team));
+
+ if (isCancelled()) return EMPTY_SET;
+ return arts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new UserRelatedToAtsObjectSearch(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserSearchItem.java
new file mode 100644
index 00000000000..97d60b4805d
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/UserSearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserListDialog;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class UserSearchItem extends WorldUISearchItem {
+
+ protected final User user;
+ protected User selectedUser;
+
+ public UserSearchItem(String name, User user) {
+ super(name);
+ this.user = user;
+ }
+
+ public UserSearchItem(String name, User user, OseeImage oseeImage) {
+ super(name, oseeImage);
+ this.user = user;
+ }
+
+ public UserSearchItem(UserSearchItem userSearchItem) {
+ this(userSearchItem, null);
+ }
+
+ public UserSearchItem(UserSearchItem userSearchItem, OseeImage oseeImage) {
+ super(userSearchItem, oseeImage);
+ this.user = userSearchItem.user;
+ this.selectedUser = userSearchItem.selectedUser;
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return String.format("%s - %s", super.getSelectedName(searchType), getUserSearchName());
+ }
+
+ public String getUserSearchName() {
+ if (user != null)
+ return user.getName();
+ else if (selectedUser != null) return selectedUser.getName();
+ return "";
+ }
+
+ public User getSearchUser() {
+ if (user != null) return user;
+ return selectedUser;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+ if (isCancelled()) return EMPTY_SET;
+ if (user != null)
+ return searchIt(user);
+ else
+ return searchIt();
+ }
+
+ protected Collection<Artifact> searchIt(User user) throws OseeCoreException {
+ return EMPTY_SET;
+ }
+
+ private Collection<Artifact> searchIt() throws OseeCoreException {
+ if (isCancelled()) return EMPTY_SET;
+ if (selectedUser != null) return searchIt(selectedUser);
+ return EMPTY_SET;
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ if (user != null) return;
+ if (searchType == SearchType.ReSearch && selectedUser != null) return;
+ UserListDialog ld = new UserListDialog(Display.getCurrent().getActiveShell());
+ int result = ld.open();
+ if (result == 0) {
+ selectedUser = ld.getSelection();
+ return;
+ }
+ cancelled = true;
+ }
+
+ /**
+ * @param selectedUser the selectedUser to set
+ */
+ public void setSelectedUser(User selectedUser) {
+ this.selectedUser = selectedUser;
+ }
+
+ /**
+ * @return the user
+ */
+ public User getDefaultUser() {
+ return user;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof UserSearchItem) {
+ UserSearchItem wsi = (UserSearchItem) obj;
+ try {
+ if (!getClass().equals(obj.getClass()) || !wsi.getName().equals(getName()) || wsi.getLoadView() != getLoadView()) {
+ return false;
+ }
+ } catch (OseeCoreException ex) {
+ return false;
+ }
+ if (getDefaultUser() != null && wsi.getDefaultUser() != null) {
+ if (!wsi.getDefaultUser().equals(getDefaultUser())) return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ try {
+ return getName().hashCode() + (getDefaultUser() != null ? getDefaultUser().hashCode() : 0) * 13;
+ } catch (OseeCoreException ex) {
+ return 0;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#copy()
+ */
+ @Override
+ public WorldSearchItem copy() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldSearchItem#getImage()
+ */
+ @Override
+ public Image getImage() {
+ Image image = super.getImage();
+ if (image != null) return image;
+ return ImageManager.getImage(FrameworkImage.USER);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/VersionTargetedForTeamSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/VersionTargetedForTeamSearchItem.java
new file mode 100644
index 00000000000..fb1a447e6da
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/VersionTargetedForTeamSearchItem.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.ats.world.search;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.ats.artifact.TeamDefinitionArtifact;
+import org.eclipse.osee.ats.artifact.TeamWorkFlowArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact;
+import org.eclipse.osee.ats.artifact.VersionArtifact.VersionReleaseType;
+import org.eclipse.osee.ats.util.widgets.dialog.TeamDefinitionDialog;
+import org.eclipse.osee.ats.util.widgets.dialog.VersionListDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.Active;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class VersionTargetedForTeamSearchItem extends WorldUISearchItem {
+ private final VersionArtifact versionArt;
+ private VersionArtifact selectedVersionArt;
+ private final boolean returnAction;
+ private final TeamDefinitionArtifact teamDef;
+ private TeamDefinitionArtifact selectedTeamDef;
+
+ public VersionTargetedForTeamSearchItem(TeamDefinitionArtifact teamDef, VersionArtifact versionArt, boolean returnAction, LoadView loadView) {
+ this(null, teamDef, versionArt, returnAction, loadView);
+ }
+
+ public VersionTargetedForTeamSearchItem(String name, TeamDefinitionArtifact teamDef, VersionArtifact versionArt, boolean returnAction, LoadView loadView) {
+ super(name != null ? name : (returnAction ? "Actions" : "Workflows") + " Targeted-For Version", loadView,
+ FrameworkImage.VERSION);
+ this.teamDef = teamDef;
+ this.versionArt = versionArt;
+ this.returnAction = returnAction;
+ }
+
+ public VersionTargetedForTeamSearchItem(VersionTargetedForTeamSearchItem versionTargetedForTeamSearchItem) {
+ super(versionTargetedForTeamSearchItem, FrameworkImage.VERSION);
+ this.versionArt = versionTargetedForTeamSearchItem.versionArt;
+ this.returnAction = versionTargetedForTeamSearchItem.returnAction;
+ this.teamDef = versionTargetedForTeamSearchItem.teamDef;
+ }
+
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ if (getSearchVersionArtifact() != null) return super.getName() + " - " + getSearchVersionArtifact();
+ return "";
+ }
+
+ public VersionArtifact getSearchVersionArtifact() {
+ if (versionArt != null) return versionArt;
+ return selectedVersionArt;
+ }
+
+ @Override
+ public Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException {
+
+ if (getSearchVersionArtifact() == null) throw new IllegalArgumentException("Invalid release version");
+
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ for (Artifact art : getSearchVersionArtifact().getTargetedForTeamArtifacts())
+ if (returnAction)
+ arts.add(((TeamWorkFlowArtifact) art).getParentActionArtifact());
+ else
+ arts.add(art);
+ if (isCancelled()) return EMPTY_SET;
+ return arts;
+ }
+
+ @Override
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ super.performUI(searchType);
+ if (searchType == SearchType.ReSearch && selectedVersionArt != null) return;
+ if (versionArt != null) return;
+ try {
+ selectedTeamDef = teamDef;
+ if (versionArt == null && selectedTeamDef == null) {
+ TeamDefinitionDialog ld = new TeamDefinitionDialog("Select Team", "Select Team");
+ ld.setInput(TeamDefinitionArtifact.getTeamReleaseableDefinitions(Active.Both));
+ int result = ld.open();
+ if (result == 0) {
+ selectedTeamDef = (TeamDefinitionArtifact) ld.getResult()[0];
+ } else
+ cancelled = true;
+ }
+ if (versionArt == null && selectedTeamDef != null) {
+ final VersionListDialog vld =
+ new VersionListDialog("Select Version", "Select Version",
+ selectedTeamDef.getVersionsArtifacts(VersionReleaseType.Both));
+ if (vld.open() == 0) {
+ selectedVersionArt = (VersionArtifact) vld.getResult()[0];
+ return;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ cancelled = true;
+ }
+
+ /**
+ * @param selectedVersionArt the selectedVersionArt to set
+ */
+ public void setSelectedVersionArt(VersionArtifact selectedVersionArt) {
+ this.selectedVersionArt = selectedVersionArt;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ats.world.search.WorldUISearchItem#copy()
+ */
+ @Override
+ public WorldUISearchItem copy() {
+ return new VersionTargetedForTeamSearchItem(this);
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldSearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldSearchItem.java
new file mode 100644
index 00000000000..1bff7471a82
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldSearchItem.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.ats.world.search;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class WorldSearchItem {
+
+ private final String name;
+ protected static Set<Artifact> EMPTY_SET = new HashSet<Artifact>();
+ protected boolean cancelled = false;
+ private LoadView loadView;
+ private final Image image;
+ public static enum LoadView {
+ TaskEditor, WorldEditor, None
+ }
+ public static enum SearchType {
+ Search, ReSearch
+ };
+
+ public WorldSearchItem(String name) {
+ this(name, LoadView.WorldEditor);
+ }
+
+ public WorldSearchItem(String name, LoadView loadView) {
+ this(name, loadView, null);
+ }
+
+ public WorldSearchItem(String name, LoadView loadView, boolean cancelled, OseeImage oseeImage) {
+ super();
+ this.name = name;
+ this.loadView = loadView;
+ this.cancelled = cancelled;
+ this.image = oseeImage == null ? null : ImageManager.getImage(oseeImage);
+ }
+
+ public WorldSearchItem(String name, LoadView loadView, OseeImage oseeImage) {
+ this(name, loadView, false, oseeImage);
+ }
+
+ public WorldSearchItem(WorldSearchItem worldSearchItem) {
+ this(worldSearchItem, null);
+ }
+
+ public WorldSearchItem(WorldSearchItem worldSearchItem, OseeImage oseeImage) {
+ this(worldSearchItem.name, worldSearchItem.loadView, worldSearchItem.cancelled, oseeImage);
+ }
+
+ public abstract WorldSearchItem copy() throws OseeArgumentException;
+
+ public String getName() throws OseeCoreException {
+ return name;
+ }
+
+ /**
+ * Method called to display the current search in the view. Override to provide more information about selected
+ * values (eg MyWorld)
+ *
+ * @param searchType TODO
+ * @return selected name
+ * @throws OseeCoreException
+ */
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return getName();
+ }
+
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ public void setCancelled(boolean cancelled) {
+ this.cancelled = cancelled;
+ }
+
+ /**
+ * @return the loadView
+ */
+ public LoadView getLoadView() {
+ return loadView;
+ }
+
+ /**
+ * @param loadView the loadView to set
+ */
+ public void setLoadView(LoadView loadView) {
+ this.loadView = loadView;
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return getName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(AtsPlugin.class, Level.SEVERE, ex);
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ /**
+ * @return the image
+ */
+ public Image getImage() {
+ return image;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldUISearchItem.java b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldUISearchItem.java
new file mode 100644
index 00000000000..80015e2a323
--- /dev/null
+++ b/org.eclipse.osee.ats/src/org/eclipse/osee/ats/world/search/WorldUISearchItem.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.ats.world.search;
+
+import java.util.Collection;
+import org.eclipse.osee.ats.AtsPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class WorldUISearchItem extends WorldSearchItem {
+
+ public WorldUISearchItem(String name) {
+ this(name, LoadView.WorldEditor, null);
+ }
+
+ public WorldUISearchItem(String name, OseeImage oseeImage) {
+ this(name, LoadView.WorldEditor, oseeImage);
+ }
+
+ public WorldUISearchItem(String name, LoadView loadView) {
+ this(name, loadView, null);
+ }
+
+ public WorldUISearchItem(String name, LoadView loadView, OseeImage oseeImage) {
+ super(name, loadView, oseeImage);
+ }
+
+ public WorldUISearchItem(WorldUISearchItem worldUISearchItem) {
+ this(worldUISearchItem, null);
+ }
+
+ public WorldUISearchItem(WorldUISearchItem worldUISearchItem, OseeImage oseeImage) {
+ super(worldUISearchItem, oseeImage);
+ }
+
+ /**
+ * Method called to display the current search in the view. Override to provide more information about selected
+ * values (eg MyWorld)
+ *
+ * @param searchType TODO
+ * @return selected name
+ * @throws OseeCoreException
+ */
+ @Override
+ public String getSelectedName(SearchType searchType) throws OseeCoreException {
+ return getName();
+ }
+
+ public abstract Collection<Artifact> performSearch(SearchType searchType) throws OseeCoreException;
+
+ public Collection<Artifact> performReSearch() {
+ return EMPTY_SET;
+ }
+
+ public Collection<Artifact> performSearchGetResults() throws OseeCoreException {
+ return performSearchGetResults(false, SearchType.Search);
+ }
+
+ public Collection<Artifact> performSearchGetResults(SearchType searchType) throws OseeCoreException {
+ return performSearchGetResults(false, searchType);
+ }
+
+ public Collection<Artifact> performSearchGetResults(boolean performUi) throws OseeCoreException {
+ return performSearchGetResults(performUi, SearchType.Search);
+ }
+
+ public Collection<Artifact> performSearchGetResults(boolean performUi, final SearchType searchType) throws OseeCoreException {
+ cancelled = false;
+ if (performUi) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ try {
+ performUI(searchType);
+ } catch (Exception ex) {
+ OseeLog.log(AtsPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }, true);
+
+ }
+ if (cancelled) return EMPTY_SET;
+ return performSearch(searchType);
+ }
+
+ public void performUI(SearchType searchType) throws OseeCoreException {
+ cancelled = false;
+ }
+
+}
diff --git a/org.eclipse.osee.ats/support/Action Import.xml b/org.eclipse.osee.ats/support/Action Import.xml
new file mode 100644
index 00000000000..3fa79c91868
--- /dev/null
+++ b/org.eclipse.osee.ats/support/Action Import.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <LastAuthor>Donald G. Dunne</LastAuthor>
+ <Created>1996-10-14T23:33:28Z</Created>
+ <LastSaved>2007-03-08T19:22:23Z</LastSaved>
+ <Version>11.8132</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9300</WindowHeight>
+ <WindowWidth>15135</WindowWidth>
+ <WindowTopX>120</WindowTopX>
+ <WindowTopY>120</WindowTopY>
+ <AcceptLabelsInFormulas/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="8" ss:ExpandedRowCount="3" x:FullColumns="1"
+ x:FullRows="1">
+ <Column ss:Width="78"/>
+ <Column ss:Width="102"/>
+ <Column ss:Width="75.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="113.25"/>
+ <Column ss:Width="60"/>
+ <Column ss:Index="7" ss:Width="75.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="78.75"/>
+ <Row>
+ <Cell><Data ss:Type="String">Title</Data></Cell>
+ <Cell><Data ss:Type="String">Description</Data></Cell>
+ <Cell><Data ss:Type="String">ActionableItems</Data></Cell>
+ <Cell><Data ss:Type="String">Assignees</Data></Cell>
+ <Cell><Data ss:Type="String">ChangeType</Data></Cell>
+ <Cell><Data ss:Type="String">Priority</Data></Cell>
+ <Cell><Data ss:Type="String">UserCommunity</Data></Cell>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">This is the name</Data></Cell>
+ <Cell><Data ss:Type="String">This is the description</Data></Cell>
+ <Cell><Data ss:Type="String">ATS Editor</Data></Cell>
+ <Cell><Data ss:Type="String">Dunne, Donald G</Data></Cell>
+ <Cell><Data ss:Type="String">Improvement</Data></Cell>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell><Data ss:Type="String">Eclipse Community</Data></Cell>
+ <Cell><Data ss:Type="String">2.5.7</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">2nd Action</Data></Cell>
+ <Cell><Data ss:Type="String">2nd Description</Data></Cell>
+ <Cell><Data ss:Type="String">Define</Data></Cell>
+ <Cell><Data ss:Type="String">Dunne, Donald G</Data></Cell>
+ <Cell><Data ss:Type="String">Problem</Data></Cell>
+ <Cell><Data ss:Type="Number">4</Data></Cell>
+ <Cell><Data ss:Type="String">Eclipse Community</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>3</ActiveRow>
+ <ActiveCol>6</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.ats/support/OSEEDay.wav b/org.eclipse.osee.ats/support/OSEEDay.wav
new file mode 100644
index 00000000000..79db655e646
--- /dev/null
+++ b/org.eclipse.osee.ats/support/OSEEDay.wav
Binary files differ
diff --git a/org.eclipse.osee.ats/support/OseeTypes_ATS.xml b/org.eclipse.osee.ats/support/OseeTypes_ATS.xml
new file mode 100644
index 00000000000..3c515bc1412
--- /dev/null
+++ b/org.eclipse.osee.ats/support/OseeTypes_ATS.xml
@@ -0,0 +1,1765 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <LastAuthor>Ryan Brooks</LastAuthor>
+ <Created>2006-03-10T14:37:59Z</Created>
+ <LastSaved>2008-11-29T20:19:36Z</LastSaved>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>8445</WindowHeight>
+ <WindowWidth>15165</WindowWidth>
+ <WindowTopX>-15</WindowTopX>
+ <WindowTopY>-15</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s20" ss:Name="Percent">
+ <NumberFormat ss:Format="0%"/>
+ </Style>
+ <Style ss:ID="s21">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s24">
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="SkyNet_ATS">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="=SkyNet_ATS!R214C1:R241C5"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="11" ss:ExpandedRowCount="247" x:FullColumns="1"
+ x:FullRows="1">
+ <Column ss:AutoFitWidth="0" ss:Width="286.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="339.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="186.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="132.75"/>
+ <Column ss:Width="147.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="76.5"/>
+ <Column ss:AutoFitWidth="0" ss:Width="91.5"/>
+ <Column ss:Index="9" ss:Width="63.75"/>
+ <Column ss:AutoFitWidth="0" ss:Width="57"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Factory to Artifact Mapping</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Actionable Item</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.ats.artifact.AtsArtifactFactory</Data></Cell>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Attribute definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Attribute Data Provider</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Tip Text</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">User Visible</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Validation Required</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Active</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Uses Resolution Options</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Released</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Next Version</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Uses Versions</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Require Targeted Version</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Blocking Review</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Metrics from Tasks</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Allow Create Branch</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Allow Commit Branch</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Completion Date</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Review Blocks</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;ReviewBlocks&gt;&lt;Enum&gt;None&lt;/Enum&gt;&lt;Enum&gt;Transition&lt;/Enum&gt;&lt;Enum&gt;Commit&lt;/Enum&gt;&lt;/ReviewBlocks&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Priority</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;Priority&gt;&lt;Enum&gt;1&lt;/Enum&gt;&lt;Enum&gt;2&lt;/Enum&gt;&lt;Enum&gt;3&lt;/Enum&gt;&lt;Enum&gt;4&lt;/Enum&gt;&lt;Enum&gt;5&lt;/Enum&gt;&lt;/Priority&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Change Type</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;ChangeType&gt;&lt;Enum&gt;Improvement&lt;/Enum&gt;&lt;Enum&gt;Problem&lt;/Enum&gt;&lt;Enum&gt;Support&lt;/Enum&gt;&lt;/ChangeType&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.User Community</Data></Cell>
+ <Cell ss:Index="7"><Data ss:Type="String">&lt;UserCommunities&gt;&lt;Enum&gt;Program_1&lt;/Enum&gt;&lt;Enum&gt;Program_2&lt;/Enum&gt;&lt;Enum&gt;Tools&lt;/Enum&gt;&lt;Enum&gt;Processes&lt;/Enum&gt;&lt;Enum&gt;Other&lt;/Enum&gt;&lt;/UserCommunities&gt;</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s24"><Data ss:Type="String">0.0</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Weekly Benefit</Data></Cell>
+ <Cell ss:Index="6"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Man Days Needed</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s24"><Data ss:Type="String">0.0</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Id</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Transaction Id</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Percent Rework</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Metrics</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Problem</Data></Cell>
+ <Cell><Data ss:Type="String">txt</Data></Cell>
+ <Cell><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Proposed Resolution</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ <Cell><Data ss:Type="String">txt</Data></Cell>
+ <Cell><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ <Cell><Data ss:Type="String">txt</Data></Cell>
+ <Cell><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Full Name</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Definition</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ <Cell><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ <Cell><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Related To State</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Work Package</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category2</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category3</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Decision Review Options</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Decision</Data></Cell>
+ <Cell ss:Index="5"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Review Defect</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Location</Data></Cell>
+ <Cell><Data ss:Type="String">txt</Data></Cell>
+ <Cell><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Authors</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Role</Data></Cell>
+ <Cell ss:Index="8"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:Index="11"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Map attribute to artifact type </Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Attribute Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Annotation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Static Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Blocking Review</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Related To State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Review Defect</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Completion Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Location</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Authors</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Role</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Review Blocks</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Review Blocks</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Completion Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Decision Review Options</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Decision</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Blocking Review</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Related To State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Role</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Man Days Needed</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Full Name</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Uses Versions</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Require Targeted Version</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Active</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Allow Create Branch</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Allow Commit Branch</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Actionable Item</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Active</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Actionable Item</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Actionable Item</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Weekly Benefit</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Metrics</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Percent Rework</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Transaction Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Legacy PCR Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Work Package</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category3</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.User Community</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Change Type</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Team Definition</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Priority</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Problem</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Proposed Resolution</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Completion Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Validation Required</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Metrics from Tasks</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Uses Resolution Options</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Log</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State Notes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.SMA Note</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Work Package</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Category3</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Current State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Estimated Hours</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Resolution</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Estimated Completion Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">ats.State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell ss:StyleID="s22"><Data ss:Type="String">ats.Related To State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.User Community</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Actionable Item</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Change Type</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Need By</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Priority</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Validation Required</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Released</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Description</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Full Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Version</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Next Version</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Version</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">ats.Estimated Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell ss:StyleID="Default"><Data ss:Type="String">Version</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ats.Release Date</Data></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ <Cell ss:StyleID="s20"/>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Parent Branch Id</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Allow Create Branch</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">ats.Allow Commit Branch</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Relation Type definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Short Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Ordered</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">TeamLead</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">is lead by </Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">leads</Data></Cell>
+ <Cell><Data ss:Type="String">LEAD</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamMember</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">has member</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">is member of </Data></Cell>
+ <Cell><Data ss:Type="String">MEMB</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PrivilegedMember</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">has member</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">is member of </Data></Cell>
+ <Cell><Data ss:Type="String">PMEMB</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamActionableItem</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">supports</Data></Cell>
+ <Cell><Data ss:Type="String">Actionable Item</Data></Cell>
+ <Cell><Data ss:Type="String">is supported by</Data></Cell>
+ <Cell><Data ss:Type="String">TAI</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">ActionToWorkflow</Data></Cell>
+ <Cell><Data ss:Type="String">Action</Data></Cell>
+ <Cell><Data ss:Type="String">impacts</Data></Cell>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">supports</Data></Cell>
+ <Cell><Data ss:Type="String">AtW</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">SmaToTask</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">has tasks</Data></Cell>
+ <Cell><Data ss:Type="String">Task</Data></Cell>
+ <Cell><Data ss:Type="String">belongs to</Data></Cell>
+ <Cell><Data ss:Type="String">TSKS</Data></Cell>
+ <Cell><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamWorkflowTargetedForVersion</Data></Cell>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">is targeted for</Data></Cell>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">implements</Data></Cell>
+ <Cell><Data ss:Type="String">TSKS</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamDefinitionToVersion</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">has version</Data></Cell>
+ <Cell><Data ss:Type="String">Version</Data></Cell>
+ <Cell><Data ss:Type="String">is version of</Data></Cell>
+ <Cell><Data ss:Type="String">TSKS</Data></Cell>
+ <Cell><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamDefinitionToWorkflowDiagram</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">has diagram</Data></Cell>
+ <Cell><Data ss:Type="String">General Document</Data></Cell>
+ <Cell><Data ss:Type="String">is team workflow of</Data></Cell>
+ <Cell><Data ss:Type="String">TDtWFD</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamDefinitionToTaskWorkflowDiagram</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">has diagram</Data></Cell>
+ <Cell><Data ss:Type="String">General Document</Data></Cell>
+ <Cell><Data ss:Type="String">is task workflow of</Data></Cell>
+ <Cell><Data ss:Type="String">TDtWFD</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamDefinitionToDecisionReviewWorkflowDiagram</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">has diagram</Data></Cell>
+ <Cell><Data ss:Type="String">General Document</Data></Cell>
+ <Cell><Data ss:Type="String">is decision workflow of</Data></Cell>
+ <Cell><Data ss:Type="String">TDtWFD</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamDefinitionToPeerToPeerReviewWorkflowDiagram</Data></Cell>
+ <Cell><Data ss:Type="String">Team Definition</Data></Cell>
+ <Cell><Data ss:Type="String">has diagram</Data></Cell>
+ <Cell><Data ss:Type="String">General Document</Data></Cell>
+ <Cell><Data ss:Type="String">is peerToPeer workflow of</Data></Cell>
+ <Cell><Data ss:Type="String">TDtWFD</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data></Cell>
+ <Cell><Data ss:Type="String">Team Workflow</Data></Cell>
+ <Cell><Data ss:Type="String">is reviewed by </Data></Cell>
+ <Cell><Data ss:Type="String">Decision Review</Data></Cell>
+ <Cell><Data ss:Type="String">is review of</Data></Cell>
+ <Cell><Data ss:Type="String">TWtDR</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">SubscribedUser</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">is subscribed by</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">is subscribed to</Data></Cell>
+ <Cell><Data ss:Type="String">Sub</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">FavoriteUser</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">is a favorite of</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">has favorite</Data></Cell>
+ <Cell><Data ss:Type="String">Fav</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">ParallelVersion</Data></Cell>
+ <Cell><Data ss:Type="String">Parent</Data></Cell>
+ <Cell><Data ss:Type="String">has parallel version</Data></Cell>
+ <Cell><Data ss:Type="String">Child</Data></Cell>
+ <Cell><Data ss:Type="String">is parallel version of</Data></Cell>
+ <Cell><Data ss:Type="String">PV</Data></Cell>
+ <Cell><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22"/>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell><Data ss:Type="String"># NOTE: The way relations are added and because All Artifacts are of SuperType &quot;Artifact&quot;, line Defect,ArtifactToDef will set Defect's max with 0,0 and Artifact,ArtifactToDefect will add n,0 to all other artifact types</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12" ss:StyleID="s22">
+ <Cell><Data ss:Type="String"># Resolution: Always define specific artifact side first, then define the &quot;Artifact&quot; side second; eg: Route State, RouteFromState,1,0 THEN Artifact,RouteFromState,0,1</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Valid artifact types per side of a relation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># Although 1 Action can have N Product Impacts, this table describes it by the number of relation lines. There can only be one Product Impact on Side B, but side A can have UNLIMITED Actions on left</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># In otherwords: How many ActionProductImpact links can be attached to the same Product Impact = 1; How many ActionProductiMpact linkds can be attached to one ActionArtifact = n</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Side (unused)</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Definition</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">General Document</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Definition</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToTaskWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">General Document</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToTaskWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Definition</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToDecisionReviewWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">General Document</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToDecisionReviewWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Definition</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToPeerToPeerReviewWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">General Document</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToPeerToPeerReviewWorkflowDiagram</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Definition</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToVersion</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamDefinitionToVersion</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">ActionToWorkflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Team Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">ActionToWorkflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Decision Review</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">PeerToPeer Review</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowToReview</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowTargetedForVersion</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamWorkflowTargetedForVersion</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Version</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">ParallelVersion</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Action</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Version</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">ParallelVersion</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Workflow</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Task</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">SmaToTask</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Task</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">SmaToTask</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Actionable Item</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamActionableItem</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">User</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Team Definition</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamActionableItem</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">State</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">User</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamLead</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">User</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamLead</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">State</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">User</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamMember</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">User</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">TeamMember</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell><Data ss:Type="String">State</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">PrivilegedMember</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">PrivilegedMember</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">State</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">SubscribedUser</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">SubscribedUser</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ <Cell><Data ss:Type="String">FavoriteUser</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell><Data ss:Type="String">User</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell><Data ss:Type="String">FavoriteUser</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Zoom>90</Zoom>
+ <Selected/>
+ <LeftColumnVisible>3</LeftColumnVisible>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>7</ActiveRow>
+ <ActiveCol>7</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Attribute Base Type</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.ats/support/Task Import.xml b/org.eclipse.osee.ats/support/Task Import.xml
new file mode 100644
index 00000000000..07fdbd72fa8
--- /dev/null
+++ b/org.eclipse.osee.ats/support/Task Import.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <LastAuthor>Donald G. Dunne</LastAuthor>
+ <Created>1996-10-14T23:33:28Z</Created>
+ <LastSaved>2008-05-27T21:06:21Z</LastSaved>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>9300</WindowHeight>
+ <WindowWidth>15135</WindowWidth>
+ <WindowTopX>120</WindowTopX>
+ <WindowTopY>120</WindowTopY>
+ <AcceptLabelsInFormulas/>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="Sheet1">
+ <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="4" x:FullColumns="1"
+ x:FullRows="1">
+ <Column ss:Width="78"/>
+ <Column ss:Width="102"/>
+ <Column ss:AutoFitWidth="0" ss:Width="161.25"/>
+ <Column ss:AutoFitWidth="0" ss:Width="83.25" ss:Span="1"/>
+ <Row>
+ <Cell><Data ss:Type="String">Title</Data></Cell>
+ <Cell><Data ss:Type="String">Originator</Data></Cell>
+ <Cell><Data ss:Type="String">Assignees</Data></Cell>
+ <Cell><Data ss:Type="String">Resolution</Data></Cell>
+ <Cell><Data ss:Type="String">Related to State</Data></Cell>
+ <Cell><Data ss:Type="String">Hours Spent</Data></Cell>
+ <Cell><Data ss:Type="String">Estimated Hours</Data></Cell>
+ <Cell><Data ss:Type="String">Percent Complete</Data></Cell>
+ <Cell><Data ss:Type="String">Notes</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">1st Task</Data></Cell>
+ <Cell><Data ss:Type="String">Brooks, Ryan D</Data></Cell>
+ <Cell><Data ss:Type="String">Dunne, Donald G</Data></Cell>
+ <Cell><Data ss:Type="String">Working</Data></Cell>
+ <Cell><Data ss:Type="String">Implement</Data></Cell>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell><Data ss:Type="Number">34</Data></Cell>
+ <Cell><Data ss:Type="Number">23</Data></Cell>
+ <Cell><Data ss:Type="String">Note 1</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">2nd Task</Data></Cell>
+ <Cell><Data ss:Type="String">Dunne, Donald G</Data></Cell>
+ <Cell><Data ss:Type="String">UnAssigned</Data></Cell>
+ <Cell><Data ss:Type="String">Waiting</Data></Cell>
+ <Cell><Data ss:Type="String">Implement</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="Number">3</Data></Cell>
+ <Cell><Data ss:Type="Number">45</Data></Cell>
+ <Cell><Data ss:Type="String">Note 2</Data></Cell>
+ </Row>
+ <Row>
+ <Cell><Data ss:Type="String">3rd Task</Data></Cell>
+ <Cell><Data ss:Type="String">Dunne, Donald G</Data></Cell>
+ <Cell><Data ss:Type="String">Dunne, Donald G; Brooks, Ryan D</Data></Cell>
+ <Cell><Data ss:Type="String">Waiting</Data></Cell>
+ <Cell><Data ss:Type="String">Implement</Data></Cell>
+ <Cell><Data ss:Type="Number">1</Data></Cell>
+ <Cell><Data ss:Type="Number">0</Data></Cell>
+ <Cell><Data ss:Type="Number">45</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>3</ActiveRow>
+ <ActiveCol>8</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet2">
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+ <Worksheet ss:Name="Sheet3">
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.define.feature/.project b/org.eclipse.osee.define.feature/.project
new file mode 100644
index 00000000000..f405f970612
--- /dev/null
+++ b/org.eclipse.osee.define.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.define.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.define.feature/build.properties b/org.eclipse.osee.define.feature/build.properties
new file mode 100644
index 00000000000..add83c7a24c
--- /dev/null
+++ b/org.eclipse.osee.define.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+ epl-v10.html,\
+ feature.properties,\
+ license.html,\
+ osee_32.png
diff --git a/org.eclipse.osee.define.feature/epl-v10.html b/org.eclipse.osee.define.feature/epl-v10.html
new file mode 100644
index 00000000000..ed4b196655e
--- /dev/null
+++ b/org.eclipse.osee.define.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.define.feature/feature.properties b/org.eclipse.osee.define.feature/feature.properties
new file mode 100644
index 00000000000..ba31eb96e3b
--- /dev/null
+++ b/org.eclipse.osee.define.feature/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 Define (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.define.feature/feature.xml b/org.eclipse.osee.define.feature/feature.xml
new file mode 100644
index 00000000000..10204db42bf
--- /dev/null
+++ b/org.eclipse.osee.define.feature/feature.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.define.feature"
+ label="%featureName"
+ version="1.0.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <description url="%licenseURL">
+ %license
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="org.eclipse.osee.define"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+</feature>
diff --git a/org.eclipse.osee.define.feature/license.html b/org.eclipse.osee.define.feature/license.html
new file mode 100644
index 00000000000..c6af966b61e
--- /dev/null
+++ b/org.eclipse.osee.define.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.define.feature/osee_32.png b/org.eclipse.osee.define.feature/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.define.feature/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.define.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.define.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 00000000000..45dfd91e30c
--- /dev/null
+++ b/org.eclipse.osee.define.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 Define 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.define.help.ui/.classpath b/org.eclipse.osee.define.help.ui/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.define.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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.define.help.ui/.project b/org.eclipse.osee.define.help.ui/.project
new file mode 100644
index 00000000000..0e56fd5635a
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.define.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.define.help.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.define.help.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..aef96a6d0c8
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Apr 20 17:57:08 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.define.help.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.define.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c729a4ff3b5
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.osee.define.help.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.define.help.ui/about.html b/org.eclipse.osee.define.help.ui/about.html
new file mode 100644
index 00000000000..a96ffa40a2e
--- /dev/null
+++ b/org.eclipse.osee.define.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.define.help.ui/build-helper.xml b/org.eclipse.osee.define.help.ui/build-helper.xml
new file mode 100644
index 00000000000..e92a0e4aaea
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/build-helper.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.osee.define.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 Define user
+ guide
+ </description>
+
+ <property name="osee.help.doc.url.base" value="http://wiki.eclipse.org" />
+ <property name="osee.help.image.folder" value="images" />
+
+ <property name="osee.help.define.intro" value="OSEE/Define/Users_Guide/Intro" />
+ <property name="osee.help.define.concepts" value="OSEE/Define/Users_Guide/Concepts" />
+ <property name="osee.help.define.tasks" value="OSEE/Define/Users_Guide/Tasks" />
+ <property name="osee.help.define.reference" value="OSEE/Define/Users_Guide/Reference" />
+ <property name="osee.help.define.tips" value="OSEE/Define/Users_Guide/Tips" />
+ <property name="osee.help.define.new" value="OSEE/Define/Users_Guide/New" />
+
+ <property name="osee.help.define.intro.file.name" value="OSEE Define Intro" />
+ <property name="osee.help.define.concepts.file.name" value="OSEE Define Concepts" />
+ <property name="osee.help.define.tasks.file.name" value="OSEE Define Tasks" />
+ <property name="osee.help.define.reference.file.name" value="OSEE Define Reference" />
+ <property name="osee.help.define.tips.file.name" value="OSEE Define Tips" />
+ <property name="osee.help.define.new.file.name" value="OSEE Define New" />
+
+ <target name="all"
+ description="Generate Eclipse help content for the OSEE Define user guide">
+ <sequential>
+ <delete>
+ <fileset dir="userguide" />
+ </delete>
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.define.intro}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.define.intro}"
+ help.doc.filenameNoExtension="${osee.help.define.intro.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.define.concepts}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.define.concepts}"
+ help.doc.filenameNoExtension="${osee.help.define.concepts.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.define.tasks}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.define.tasks}"
+ help.doc.filenameNoExtension="${osee.help.define.tasks.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.define.reference}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.define.reference}"
+ help.doc.filenameNoExtension="${osee.help.define.reference.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/OSEE/Define/Users_Guide/Tips"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/OSEE/Define/Users_Guide/Tips"
+ help.doc.filenameNoExtension="${osee.help.define.tips.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/OSEE/Define/Users_Guide/New"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/OSEE/Define/Users_Guide/New"
+ help.doc.filenameNoExtension="${osee.help.define.new.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+ </sequential>
+ </target>
+</project>
diff --git a/org.eclipse.osee.define.help.ui/build.properties b/org.eclipse.osee.define.help.ui/build.properties
new file mode 100644
index 00000000000..933d02d4b69
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/,\
+ toc.xml,\
+ userguide/
diff --git a/org.eclipse.osee.define.help.ui/plugin.xml b/org.eclipse.osee.define.help.ui/plugin.xml
new file mode 100644
index 00000000000..0083149d03d
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/plugin.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+<extension
+ id="org.eclipse.osee.define.help.ui.docs"
+ name="OSEE OTE"
+ point="org.eclipse.help.toc">
+ <toc
+ file="toc.xml"
+ primary="true">
+ </toc>
+ <toc
+ file="userguide/OSEE Define Intro-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Define Concepts-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Define Reference-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Define Tasks-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Define Tips-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Define New-toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.define.help.ui/toc.xml b/org.eclipse.osee.define.help.ui/toc.xml
new file mode 100644
index 00000000000..33e171e634c
--- /dev/null
+++ b/org.eclipse.osee.define.help.ui/toc.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="OSEE Define User Guide">
+ <anchor id="before-reference" />
+ <topic label="Getting Started">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Define Intro-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference" />
+ </topic>
+ <topic label="Concepts">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Define Concepts-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic label="Tasks">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Define Tasks-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic label="Feature Reference">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Define Reference-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE Define Tips.html" label="Tips and Tricks">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Define New-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE Define New.html" label="What&apos;s New">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Define New-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="../org.eclipse.osee.framework.help.ui/userguide/OSEE Update.html" label="Updating this Document">
+ <anchor id="before-reference-content"/>
+ <link toc="../org.eclipse.osee.framework.help.ui/userguide/OSEE New-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <anchor id="after-reference"/>
+ <anchor id="additions" />
+</toc>
+
+
diff --git a/org.eclipse.osee.define/.classpath b/org.eclipse.osee.define/.classpath
new file mode 100644
index 00000000000..751c8f2e504
--- /dev/null
+++ b/org.eclipse.osee.define/.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.define/.cvsignore b/org.eclipse.osee.define/.cvsignore
new file mode 100644
index 00000000000..ba077a4031a
--- /dev/null
+++ b/org.eclipse.osee.define/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.osee.define/.project b/org.eclipse.osee.define/.project
new file mode 100644
index 00000000000..1065e3d6fd3
--- /dev/null
+++ b/org.eclipse.osee.define/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.define</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.define/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.define/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.define/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.define/META-INF/MANIFEST.MF b/org.eclipse.osee.define/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..f436517fef9
--- /dev/null
+++ b/org.eclipse.osee.define/META-INF/MANIFEST.MF
@@ -0,0 +1,47 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Define Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.define;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.define.DefinePlugin
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.define,
+ org.eclipse.osee.define.artifact,
+ org.eclipse.osee.define.blam.operation,
+ org.eclipse.osee.define.errorhandler,
+ org.eclipse.osee.define.navigate,
+ org.eclipse.osee.define.relation,
+ org.eclipse.osee.define.relation.Import,
+ org.eclipse.osee.define.traceability,
+ org.eclipse.osee.define.traceability.action,
+ org.eclipse.osee.define.traceability.blam,
+ org.eclipse.osee.define.traceability.data,
+ org.eclipse.osee.define.traceability.importer,
+ org.eclipse.osee.define.traceability.jobs,
+ org.eclipse.osee.define.traceability.operations,
+ org.eclipse.osee.define.traceability.report,
+ org.eclipse.osee.define.utility
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.core.filesystem,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.ui.ide,
+ org.eclipse.search,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.database,
+ org.eclipse.ui.forms,
+ org.eclipse.osee.framework.messaging.event.skynet,
+ org.eclipse.osee.framework.jini,
+ org.eclipse.nebula.widgets.xviewer
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.enums,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.define/build.properties b/org.eclipse.osee.define/build.properties
new file mode 100644
index 00000000000..8753c6dde25
--- /dev/null
+++ b/org.eclipse.osee.define/build.properties
@@ -0,0 +1,12 @@
+output.osee.define.jar = bin/
+bin.includes = plugin.xml,\
+ images/,\
+ META-INF/,\
+ src/,\
+ support/,\
+ .,\
+ reference/
+src.includes = src/
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.define/images/artifact_search.gif b/org.eclipse.osee.define/images/artifact_search.gif
new file mode 100644
index 00000000000..f5bb8518054
--- /dev/null
+++ b/org.eclipse.osee.define/images/artifact_search.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/chkbox_disabled.gif b/org.eclipse.osee.define/images/chkbox_disabled.gif
new file mode 100644
index 00000000000..7aa131aedb6
--- /dev/null
+++ b/org.eclipse.osee.define/images/chkbox_disabled.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/chkbox_enabled.gif b/org.eclipse.osee.define/images/chkbox_enabled.gif
new file mode 100644
index 00000000000..9cacb96dca9
--- /dev/null
+++ b/org.eclipse.osee.define/images/chkbox_enabled.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/compass.xcf b/org.eclipse.osee.define/images/compass.xcf
new file mode 100644
index 00000000000..37c26fdc1ca
--- /dev/null
+++ b/org.eclipse.osee.define/images/compass.xcf
Binary files differ
diff --git a/org.eclipse.osee.define/images/defineNav.gif b/org.eclipse.osee.define/images/defineNav.gif
new file mode 100644
index 00000000000..be4d2823ff6
--- /dev/null
+++ b/org.eclipse.osee.define/images/defineNav.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/delete_button.gif b/org.eclipse.osee.define/images/delete_button.gif
new file mode 100644
index 00000000000..07a4442fe9c
--- /dev/null
+++ b/org.eclipse.osee.define/images/delete_button.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/gears.gif b/org.eclipse.osee.define/images/gears.gif
new file mode 100644
index 00000000000..86683b8bd64
--- /dev/null
+++ b/org.eclipse.osee.define/images/gears.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/importTrace.gif b/org.eclipse.osee.define/images/importTrace.gif
new file mode 100644
index 00000000000..cef8c2f8f78
--- /dev/null
+++ b/org.eclipse.osee.define/images/importTrace.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/laser_16_16.gif b/org.eclipse.osee.define/images/laser_16_16.gif
new file mode 100644
index 00000000000..b29b25ee454
--- /dev/null
+++ b/org.eclipse.osee.define/images/laser_16_16.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/refresh.gif b/org.eclipse.osee.define/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.define/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/relate.gif b/org.eclipse.osee.define/images/relate.gif
new file mode 100644
index 00000000000..870934b6934
--- /dev/null
+++ b/org.eclipse.osee.define/images/relate.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/relateWizard.gif b/org.eclipse.osee.define/images/relateWizard.gif
new file mode 100644
index 00000000000..4d5556ad183
--- /dev/null
+++ b/org.eclipse.osee.define/images/relateWizard.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/remove.gif b/org.eclipse.osee.define/images/remove.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.define/images/remove.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/up.gif b/org.eclipse.osee.define/images/up.gif
new file mode 100644
index 00000000000..07164754e5c
--- /dev/null
+++ b/org.eclipse.osee.define/images/up.gif
Binary files differ
diff --git a/org.eclipse.osee.define/images/wizard.bmp b/org.eclipse.osee.define/images/wizard.bmp
new file mode 100644
index 00000000000..a2ae24883bd
--- /dev/null
+++ b/org.eclipse.osee.define/images/wizard.bmp
Binary files differ
diff --git a/org.eclipse.osee.define/plugin.xml b/org.eclipse.osee.define/plugin.xml
new file mode 100644
index 00000000000..1661f386753
--- /dev/null
+++ b/org.eclipse.osee.define/plugin.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="DefineNavigateItem" name="DefineNavigateItem" schema="schema/DefineNavigateItem.exsd"/>
+ <extension-point id="TraceUnitHandler" name="TraceUnitHandler" schema="schema/TraceUnitHandler.exsd"/>
+ <extension
+ point="org.eclipse.ui.importWizards">
+ <category
+ id="org.eclipse.osee.define.import.category"
+ name="OSEE">
+ </category>
+ <wizard
+ category="org.eclipse.osee.define.import.category"
+ class="org.eclipse.osee.define.traceability.ImportTraceabilityWizard"
+ icon="images/relate.gif"
+ id="osee.define.traceability.ImportTraceabilityWizard"
+ name="Traceability into OSEE">
+ <description>
+ Import Skynet relations.
+ </description>
+ </wizard>
+ </extension>
+ <extension
+ point="org.eclipse.ui.importWizards">
+ <category
+ id="org.eclipse.osee.define.import.category"
+ name="OSEE">
+ </category>
+ <wizard
+ category="org.eclipse.osee.define.import.category"
+ class="org.eclipse.osee.define.traceability.importer.ImportTraceUnitWizard"
+ icon="images/importTrace.gif"
+ id="ImportTraceUnitsWizard"
+ name="Trace Units Into OSEE">
+ <description>
+ Imports trace units into OSEE and updates relations.
+ </description>
+ </wizard>
+ </extension>
+<extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="true"
+ id="osee.define.projectContribution"
+ objectClass="org.eclipse.core.resources.IResource">
+ <menu
+ label="Define"
+ path="additions"
+ id="osee.define.menu.main">
+ </menu>
+ <action
+ class="org.eclipse.osee.framework.ui.skynet.artifact.OpenArtifactAction"
+ id="osee.define.popup.open.artifact"
+ label="Open Artifact"
+ menubarPath="osee.define.menu.main/main"/>
+ </objectContribution>
+
+</extension>
+ <extension
+ point="org.eclipse.ui.perspectives">
+ <perspective
+ class="org.eclipse.osee.define.DefinePerspectiveFactory"
+ fixed="false"
+ icon="images/laser_16_16.gif"
+ id="osee.define.PerspectiveFactory"
+ name="Define"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension targetID="org.eclipse.ui.resourcePerspective">
+ <perspectiveShortcut id="osee.define.PerspectiveFactory"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="osee.ats.ATSPerspective">
+ <perspectiveShortcut id="osee.define.PerspectiveFactory"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
+ <perspectiveShortcut id="osee.define.PerspectiveFactory"/>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="osee.define.PerspectiveFactory">
+ <perspectiveShortcut id="org.eclipse.jdt.ui.JavaPerspective"/>
+ <perspectiveShortcut id="org.eclipse.ui.resourcePerspective"/>
+ <perspectiveShortcut id="org.eclipse.osee.ats.ATSPerspective"/>
+ </perspectiveExtension>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="reference/toc.xml"
+ primary="true"/>
+ </extension>
+ <extension
+ id="AddEveryoneGroupToBranches"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.blam.operation.AddEveryoneGroupToBranches">
+ </Operation>
+ </extension>
+ <extension
+ id="org.eclipse.osee.ats"
+ name="OSEE"
+ point="org.eclipse.ui.views">
+ <view
+ allowMultiple="false"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.define.navigate.DefineNavigateView"
+ icon="images/defineNav.gif"
+ id="org.eclipse.osee.define.DefineNavigateView"
+ name="Define Navigator"/>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts file="reference/contexts.xml"/>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.IgnorePublishAttribute">
+ <attribute
+ name="Word Ole Data">
+ </attribute>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactRendererTemplate">
+ <Template
+ presentationType="ALL"
+ templateFile="support/Work_Instruction_Template.xml"
+ templateName="Work Instruction">
+ </Template>
+ </extension>
+ <extension
+ id="PublishSubsystemToDesignTraceability"
+ name="Publish Subsystem To Design Traceability"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.blam.operation.PublishSubsystemToDesignTraceability">
+ </Operation>
+ </extension>
+ <extension
+ id="ExperimentalBlam"
+ name="ExperimentalBlam"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.blam.operation.ExperimentalBlam">
+ </Operation>
+ </extension>
+ <extension
+ id="ChangeArtifactTypeBlam"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.ChangeArtifactTypeBlam"/>
+ </extension>
+ <extension
+ id="SubsystemToLowLevelReqTraceReport"
+ name="SubsystemToLowLevelReqTraceReport"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.blam.operation.SubsystemToLowLevelReqTraceReport">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ArtifactFactory">
+ <ArtifactFactory
+ classname="org.eclipse.osee.define.DefineArtifactFactory">
+ </ArtifactFactory>
+ </extension>
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ id="traceFind"
+ targetID="#CompilationUnitEditorContext">
+ <action
+ class="org.eclipse.osee.define.traceability.action.FindTraceUnitEditorAction"
+ icon="images/artifact_search.gif"
+ id="org.eclipse.osee.define.action.FindTraceUnitFromResource"
+ label="Find Trace Unit Artifact"
+ menubarPath="org.eclipse.jdt.ui.source.menu"
+ tooltip="Searches for trace units in OSEE">
+ </action>
+ </viewerContribution>
+ <objectContribution
+ adaptable="true"
+ id="osee.database.projectContribution"
+ objectClass="org.eclipse.core.resources.IResource">
+ <action
+ class="org.eclipse.osee.define.traceability.action.FindTraceUnitActionDelegate"
+ icon="images/artifact_search.gif"
+ id="org.eclipse.osee.define.action.FindTraceUnitFromResource2"
+ label="Find Trace Unit Artifact"
+ menubarPath="osee.define.menu.main/main"
+ state="true"
+ style="push"
+ tooltip="Searches for trace units in OSEE">
+ </action>
+ </objectContribution>
+ </extension>
+ <extension
+ id="UiToTestBlam"
+ name="UiToTestBlam"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.traceability.blam.UiToTestBlam">
+ </Operation>
+ </extension>
+ <extension
+ id="TraceReport"
+ name="TraceReport"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.traceability.blam.TraceReportBlam">
+ </Operation>
+ </extension>
+ <extension
+ id="PublishWithSpecifiedTemplate"
+ name="Publish With Specified Template"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.blam.operation.PublishWithSpecifiedTemplate">
+ </Operation>
+ </extension>
+ <extension
+ id="PublishRequirements"
+ name="PublishRequirements"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.blam.operation.PublishRequirements">
+ </Operation>
+ </extension>
+ <extension
+ id="RemoveTraceMarksFromTraceUnits"
+ name="RemoveTraceMarksFromTraceUnits"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.define.traceability.blam.RemoveTraceMarksFromTraceUnits">
+ </Operation>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.define/reference/contexts.xml b/org.eclipse.osee.define/reference/contexts.xml
new file mode 100644
index 00000000000..efbdf874e4d
--- /dev/null
+++ b/org.eclipse.osee.define/reference/contexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="defineNavigator" title="Define Navigator View">
+ <description>Perform Define navigation capabilities.</description>
+ <topic href="reference/define_navigator_view.html" label="Define Navigator View"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.define/reference/define_navigator_view.html b/org.eclipse.osee.define/reference/define_navigator_view.html
new file mode 100644
index 00000000000..58cbb3e2518
--- /dev/null
+++ b/org.eclipse.osee.define/reference/define_navigator_view.html
@@ -0,0 +1,27 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Define Navigator</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Define Navigator</h1>
+ <h2>Purpose</h2>
+ Central location to launch frequently used define operations.
+ <h2>How to do it</h2>
+ Double-click any navigation item to kickoff the corresponding operation.
+ <h2>Filter</h2>
+ Filter out all navigation items that conains the entered text.
+ Select the clear action (<img src="../images/clear.gif"/>) to clear out the text
+ and restore all navigation items.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.define/reference/toc.xml b/org.eclipse.osee.define/reference/toc.xml
new file mode 100644
index 00000000000..7821c280c26
--- /dev/null
+++ b/org.eclipse.osee.define/reference/toc.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+<toc label="OSEE Define Requirements Management">
+ <link toc="PLUGINS_ROOT/org.eclipse.osee.framework.ui.skynet/reference/skynet_toc.xml"/>
+</toc>
diff --git a/org.eclipse.osee.define/schema/DefineNavigateItem.exsd b/org.eclipse.osee.define/schema/DefineNavigateItem.exsd
new file mode 100644
index 00000000000..9338072d6d8
--- /dev/null
+++ b/org.eclipse.osee.define/schema/DefineNavigateItem.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.define">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.define" id="DefineNavigateItem" name="DefineNavigateItem"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="IDefineNavigateItem"/>
+ </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="IDefineNavigateItem">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.define/schema/TraceUnitHandler.exsd b/org.eclipse.osee.define/schema/TraceUnitHandler.exsd
new file mode 100644
index 00000000000..0d96d3452ae
--- /dev/null
+++ b/org.eclipse.osee.define/schema/TraceUnitHandler.exsd
@@ -0,0 +1,112 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.define" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.define" id="TraceUnitHandler" name="TraceUnitHandler"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="TraceUnitHandler"/>
+ </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" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="TraceUnitHandler">
+ <complexType>
+ <attribute name="TraceUnitResourceLocator" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.define.traceability.ITestUnitLocator"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="TraceUnitParser" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.define.traceability.ITraceParser"/>
+ </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.define/src/org/eclipse/osee/define/DefineArtifactFactory.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/DefineArtifactFactory.java
new file mode 100644
index 00000000000..ce66ff9a708
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/DefineArtifactFactory.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.define;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.define.artifact.Spreadsheet;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DefineArtifactFactory extends ArtifactFactory {
+ private static List<String> WORD_ARTIFACTS =
+ Arrays.asList(Requirements.SYSTEM_REQUIREMENT, Requirements.SUBSYSTEM_REQUIREMENT,
+ Requirements.TEST_PROCEDURE, Requirements.TEST_PROCEDURE, "Test Procedure WML",
+ Requirements.HARDWARE_REQUIREMENT, Requirements.SOFTWARE_DESIGN, Requirements.SOFTWARE_REQUIREMENT,
+ Requirements.INDIRECT_SOFTWARE_REQUIREMENT, Requirements.SYSTEM_DESIGN, Requirements.SUBSYSTEM_DESIGN,
+ Requirements.INTERFACE_REQUIREMENT, Requirements.SUBSYSTEM_FUNCTION, Requirements.SYSTEM_FUNCTION,
+ Requirements.TEST_INFORMATION_SHEET);
+
+ public DefineArtifactFactory() {
+ super(Collections.setUnion(WORD_ARTIFACTS, Arrays.asList("Spreadsheet")));
+ }
+
+ @Override
+ public Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException {
+ if (artifactType.getName().equals("Spreadsheet")) {
+ return new Spreadsheet(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (WORD_ARTIFACTS.contains(artifactType.getName())) {
+ return new WordArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ throw new OseeArgumentException("did not recognize the artifact type: " + artifactType.getName());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePerspectiveFactory.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePerspectiveFactory.java
new file mode 100644
index 00000000000..405f2a822c6
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePerspectiveFactory.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.define;
+
+import org.eclipse.osee.define.navigate.DefineNavigateView;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.queryLog.QueryLogView;
+import org.eclipse.osee.framework.ui.skynet.search.QuickSearchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+/**
+ * Perspective factory for the Define perspective. This sets up the initial layout and placeholders for views.
+ *
+ * @author Robert A. Fisher
+ */
+public class DefinePerspectiveFactory implements IPerspectiveFactory {
+
+ public void createInitialLayout(IPageLayout layout) {
+ // Get the editor area.
+ String editorArea = layout.getEditorArea();
+
+ // Add views to Window -> Show View
+ layout.addShowViewShortcut(ArtifactExplorer.VIEW_ID);
+ layout.addShowViewShortcut(BranchView.VIEW_ID);
+ layout.addShowViewShortcut(QueryLogView.VIEW_ID);
+ layout.addShowViewShortcut(QuickSearchView.VIEW_ID);
+ layout.addShowViewShortcut(DefineNavigateView.VIEW_ID);
+ layout.addShowViewShortcut("org.eclipse.pde.runtime.LogView");
+
+ // Top left: Artifact Explorer
+ IFolderLayout topLeft = layout.createFolder("topLeft", IPageLayout.LEFT, 0.25f, editorArea);
+ topLeft.addPlaceholder(ArtifactExplorer.VIEW_ID + ":*");
+ topLeft.addView(ArtifactExplorer.VIEW_ID);
+ topLeft.addView(DefineNavigateView.VIEW_ID);
+
+ IFolderLayout lower = layout.createFolder("bottom", IPageLayout.BOTTOM, 0.65f, editorArea);
+ lower.addView(BranchView.VIEW_ID);
+ lower.addPlaceholder(HistoryView.VIEW_ID);
+ lower.addPlaceholder(NewSearchUI.SEARCH_VIEW_ID);
+ lower.addPlaceholder("org.eclipse.pde.runtime.LogView");
+
+ IFolderLayout underLower = layout.createFolder("underBottom", IPageLayout.BOTTOM, .75f, "bottom");
+ underLower.addView(QuickSearchView.VIEW_ID);
+
+ // The following is some sample code that can be used for future reference for other areas and
+ // placeholders ...
+ // topLeft.addPlaceholder(IPageLayout.ID_BOOKMARKS);
+ //
+ // // Bottom left: Outline view and Property Sheet view
+ // IFolderLayout bottomLeft = layout.createFolder("bottomLeft", IPageLayout.BOTTOM, 0.50f,
+ // "topLeft");
+ // bottomLeft.addView(IPageLayout.ID_OUTLINE);
+ // bottomLeft.addView(IPageLayout.ID_PROP_SHEET);
+ //
+ // // Bottom right: Task List view
+ // layout.addView(IPageLayout.ID_TASK_LIST, IPageLayout.BOTTOM, 0.66f, editorArea);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePlugin.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePlugin.java
new file mode 100644
index 00000000000..7715bea43e7
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/DefinePlugin.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.define;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+
+public class DefinePlugin extends OseeUiActivator {
+ private static DefinePlugin pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "org.eclipse.osee.define";
+
+ public DefinePlugin() {
+ super();
+ pluginInstance = this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.plugin.OseePlugin#getPluginName()
+ */
+ @Override
+ protected String getPluginName() {
+ return PLUGIN_ID;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static DefinePlugin getInstance() {
+ return pluginInstance;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Resolver.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Resolver.java
new file mode 100644
index 00000000000..07f4e13e971
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Resolver.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.define.artifact;
+
+import java.io.CharArrayReader;
+import java.nio.CharBuffer;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.stream.StreamSource;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+
+public class Resolver implements URIResolver {
+ private static final OseeUiActivator plugin = DefinePlugin.getInstance();
+ private static final CharBuffer xslAuxiliary = plugin.getCharBuffer("support/xslt/auxiliary.xsl");
+ private static final CharBuffer xslProperties = plugin.getCharBuffer("support/xslt/elementProperties.xsl");
+ private static final CharBuffer xslStructure = plugin.getCharBuffer("support/xslt/elementStructure.xsl");
+ private static final CharBuffer xslPageLayout = plugin.getCharBuffer("support/xslt/pageLayout.xsl");
+ private static final CharBuffer xslProfile = plugin.getCharBuffer("support/xslt/profile.xsl");
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.xml.transform.URIResolver#resolve(java.lang.String, java.lang.String)
+ */
+ public Source resolve(String href, String base) throws TransformerException {
+ CharBuffer rightOne = null;
+ if (href.equals("auxiliary.xsl")) {
+ rightOne = xslAuxiliary;
+ }
+ if (href.equals("elementProperties.xsl")) {
+ rightOne = xslProperties;
+ }
+ if (href.equals("elementStructure.xsl")) {
+ rightOne = xslStructure;
+ }
+ if (href.equals("pageLayout.xsl")) {
+ rightOne = xslPageLayout;
+ }
+ if (href.equals("profile.xsl")) {
+ rightOne = xslProfile;
+ }
+ return new StreamSource(new CharArrayReader(rightOne.array()));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Spreadsheet.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Spreadsheet.java
new file mode 100644
index 00000000000..301ff971b99
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/artifact/Spreadsheet.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.define.artifact;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Spreadsheet extends Artifact {
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public Spreadsheet(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/AddEveryoneGroupToBranches.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/AddEveryoneGroupToBranches.java
new file mode 100644
index 00000000000..a159a06e6bf
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/AddEveryoneGroupToBranches.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.define.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AddEveryoneGroupToBranches extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ for (Branch brnch : BranchManager.getNormalBranches()) {
+
+ if (!AccessControlManager.getInstance().getAccessControlList(brnch).isEmpty()) {
+ Artifact everyone =
+ ArtifactQuery.getArtifactFromAttribute("Name", "Everyone", BranchManager.getCommonBranch());
+ AccessControlManager.getInstance().setPermission(everyone, brnch, PermissionEnum.READ);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Add Everone Group to Branches";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/ExperimentalBlam.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/ExperimentalBlam.java
new file mode 100644
index 00000000000..26b6995711b
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/ExperimentalBlam.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.define.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExperimentalBlam extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Experimental Blam";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Util");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishRequirements.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishRequirements.java
new file mode 100644
index 00000000000..60e6f6a4b7a
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishRequirements.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.blam.operation;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.linking.LinkType;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.render.ITemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.templates.ITemplateProvider;
+import org.eclipse.osee.framework.ui.skynet.templates.TemplateManager;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class PublishRequirements extends AbstractBlam {
+ private boolean includeAttributes;
+ private boolean publishAsDiff;
+ //private boolean removeTrackedChanges;
+ private Date date;
+ private Branch branch;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Publish Requirements";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Boolean updateParagraphNumber = variableMap.getBoolean("Update Paragraph Numbers");
+ List<Artifact> artifacts = variableMap.getArtifacts("artifacts");
+ includeAttributes = variableMap.getBoolean("Publish With Attributes");
+ publishAsDiff = variableMap.getBoolean("Publish As Diff");
+ // removeTrackedChanges = variableMap.getBoolean("Skip Artifacts with Tracked Changes");
+ if (variableMap.getValue("Diff Starting Point") instanceof Date) {
+ date = (Date) variableMap.getValue("Diff Starting Point");
+ }
+ branch = variableMap.getBranch("Diff Branch");
+
+ RelationManager.getRelatedArtifacts(artifacts, 999, true, CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD);
+
+ SkynetTransaction transaction = new SkynetTransaction(artifacts.get(0).getBranch());
+ String templateOption =
+ publishAsDiff ? (includeAttributes ? ITemplateRenderer.DIFF_VALUE : ITemplateRenderer.DIFF_NO_ATTRIBUTES_VALUE) : (includeAttributes ? ITemplateRenderer.PREVIEW_WITH_RECURSE_VALUE : ITemplateRenderer.PREVIEW_WITH_RECURSE_NO_ATTRIBUTES_VALUE);
+ VariableMap options =
+ new VariableMap(WordTemplateRenderer.UPDATE_PARAGRAPH_NUMBER_OPTION, updateParagraphNumber,
+ ITemplateRenderer.TEMPLATE_OPTION, templateOption, ITemplateRenderer.TRANSACTION_OPTION, transaction,
+ "linkType", LinkType.INTERNAL_DOC_REFERENCE);
+ for (Artifact artifact : artifacts) {
+ try {
+ publish(monitor, artifact, options);
+ } catch (OseeStateException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ transaction.execute();
+ }
+
+ private void publish(IProgressMonitor monitor, Artifact artifact, VariableMap options) throws OseeCoreException {
+ if (monitor.isCanceled()) {
+ return;
+ }
+
+ ArrayList<Artifact> nonFolderChildren = new ArrayList<Artifact>();
+ if (artifact.isOfType("Folder")) {
+ for (Artifact child : artifact.getChildren(publishAsDiff)) {
+ if (child.isOfType("Folder")) {
+ publish(monitor, child, options);
+ } else {
+ nonFolderChildren.add(child);
+ }
+ }
+ } else {
+ nonFolderChildren.add(artifact);
+ }
+
+ if (publishAsDiff) {
+ if (branch == null || date == null) {
+ throw new OseeCoreException(
+ "Must Select a " + branch == null ? "Branch" : "Date" + " to diff against when publishing as Diff");
+ }
+ nonFolderChildren = buildRecursiveList(nonFolderChildren);
+ int transactionId = BranchManager.getBranchTransaction(date, branch.getBranchId());
+ ArrayList<Artifact> olderArtifacts = getOlderArtifacts(nonFolderChildren, transactionId, branch.getBranchId());
+ int index = 0;
+ for (Artifact art : olderArtifacts) {
+ if (art != null && art.isDeleted()) {
+ olderArtifacts.set(index, null);
+ }
+ index++;
+ }
+ index = 0;
+ for (Artifact art : nonFolderChildren) {
+ if (art != null && art.isDeleted()) {
+ nonFolderChildren.set(index, null);
+ }
+ index++;
+ }
+ RendererManager.diffInJob(olderArtifacts, nonFolderChildren, options);
+ } else {
+ RendererManager.preview(nonFolderChildren, monitor, options);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Drag in parent artifacts below and click the play button at the top right.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ List<Artifact> templates = new ArrayList<Artifact>();
+ try {
+ for (ITemplateProvider provider : TemplateManager.getTemplateProviders()) {
+ templates.addAll(provider.getAllTemplates());
+ }
+ Collections.sort(templates);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets><XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Update Paragraph Numbers\" />");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Publish With Attributes\" /><XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Publish As Diff\" /><XWidget xwidgetType=\"XLabel\" displayName=\" \" /><XWidget xwidgetType=\"XLabel\" displayName=\"Diff Options:\" /><XWidget xwidgetType=\"XDate\" displayName=\"Diff Starting Point\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Diff Branch\" defaultValue=\"" + BranchManager.getLastBranch().getBranchName() + "\" /><XWidget xwidgetType=\"XListDropViewer\" displayName=\"artifacts\" />");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private ArrayList<Artifact> getOlderArtifacts(ArrayList<Artifact> artifacts, int transactionId, int branchId) throws OseeCoreException {
+ ArrayList<Artifact> historicArtifacts = new ArrayList<Artifact>(artifacts.size());
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ Set<Artifact> artifactSet = new HashSet<Artifact>(artifacts);
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (Artifact artifact : artifactSet) {
+ insertParameters.add(new Object[] {queryId, insertTime, artifact.getArtId(), branchId, transactionId});
+ }
+ ArtifactLoader.loadArtifacts(queryId, ArtifactLoad.FULL, null, insertParameters, false, true, true);
+ for (Artifact artifact : artifacts) {
+ historicArtifacts.add(ArtifactCache.getHistorical(artifact.getArtId(), transactionId));
+ }
+ return historicArtifacts;
+ }
+
+ private ArrayList<Artifact> buildRecursiveList(ArrayList<Artifact> artifacts) throws OseeCoreException {
+ ArrayList<Artifact> artifactWithChildren = new ArrayList<Artifact>(artifacts.size());
+ for (Artifact artifact : artifacts) {
+ artifactWithChildren.add(artifact);
+ addChildren(artifactWithChildren, artifact);
+ }
+ return artifactWithChildren;
+ }
+
+ private void addChildren(ArrayList<Artifact> artifacts, Artifact artifact) throws OseeCoreException {
+ for (Artifact loopArtifact : artifact.getChildren(true)) {
+ artifacts.add(loopArtifact);
+ addChildren(artifacts, loopArtifact);
+ }
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Publish");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishSubsystemToDesignTraceability.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishSubsystemToDesignTraceability.java
new file mode 100644
index 00000000000..d6c556618c7
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishSubsystemToDesignTraceability.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.blam.operation;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PublishSubsystemToDesignTraceability extends AbstractBlam {
+ private CharBackedInputStream charBak;
+ private ISheetWriter excelWriter;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Publish Subsystem To Design Traceability";
+ }
+
+ private void init() throws IOException {
+ charBak = new CharBackedInputStream();
+ excelWriter = new ExcelXmlWriter(charBak.getWriter());
+ }
+
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ monitor.beginTask(getDescriptionUsage(), 100);
+
+ List<Artifact> subsystems = variableMap.getArtifacts("Subsystem Root Artifacts");
+ Branch branch = subsystems.get(0).getBranch();
+
+ init();
+
+ monitor.subTask("Aquiring Design Artifacts"); // bulk load for performance reasons
+ ArtifactQuery.getArtifactsFromType("Subsystem Design", branch);
+ monitor.worked(10);
+
+ monitor.subTask("Aquiring Subsystem Requirements"); // bulk load for performance reasons
+ ArtifactQuery.getArtifactsFromType("Subsystem Requirement", branch);
+ monitor.worked(60);
+
+ int workIncrement = 30 / subsystems.size();
+ for (Artifact subsystem : subsystems) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ monitor.worked(workIncrement);
+ writeSubsystemDesignTraceability(subsystem);
+ }
+
+ excelWriter.endWorkbook();
+ IFile iFile = OseeData.getIFile("SubsystemToDesignTrace_" + Lib.getDateTimeString() + ".xml");
+ AIFile.writeToFile(iFile, charBak);
+ Program.launch(iFile.getLocation().toOSString());
+ }
+
+ private void writeSubsystemDesignTraceability(Artifact subsystem) throws IOException, OseeCoreException {
+ excelWriter.startSheet(subsystem.getDescriptiveName(), 200);
+ excelWriter.writeRow(subsystem.getDescriptiveName() + " Subsystem To Design Traceability");
+
+ excelWriter.writeRow("Subsystem Requirement", null, "Subsystem Design");
+ excelWriter.writeRow("Paragraph Number", "Paragraph Title", "Paragraph Number", "Paragraph Title");
+
+ for (Artifact subsystemRequirement : subsystem.getDescendants()) {
+ excelWriter.writeCell(subsystemRequirement.getSoleAttributeValue("Imported Paragraph Number", ""));
+ excelWriter.writeCell(subsystemRequirement.getDescriptiveName());
+
+ if (subsystemRequirement.isOfType("Subsystem Requirement")) {
+ boolean loopNeverRan = true;
+ for (Artifact subsystemDesign : subsystemRequirement.getRelatedArtifacts(CoreRelationEnumeration.Design__Design)) {
+ if (subsystemDesign.isOfType("Subsystem Design")) {
+ loopNeverRan = false;
+ excelWriter.writeCell(subsystemDesign.getSoleAttributeValue("Imported Paragraph Number", ""), 2);
+ excelWriter.writeCell(subsystemDesign.getDescriptiveName(), 3);
+ excelWriter.endRow();
+ }
+ }
+ if (loopNeverRan) {
+ excelWriter.endRow();
+ }
+ } else {
+ excelWriter.writeCell("N/A - " + subsystemRequirement.getArtifactTypeName());
+ excelWriter.endRow();
+ }
+ }
+
+ excelWriter.endSheet();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Publish Subsystem To Design Traceability Tables";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XListDropViewer\" displayName=\"Subsystem Root Artifacts\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Publish");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishWithSpecifiedTemplate.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishWithSpecifiedTemplate.java
new file mode 100644
index 00000000000..486de816f70
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/PublishWithSpecifiedTemplate.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.blam.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.render.ITemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.templates.ITemplateProvider;
+import org.eclipse.osee.framework.ui.skynet.templates.TemplateManager;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class PublishWithSpecifiedTemplate extends AbstractBlam {
+ private List<Artifact> templates;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Publish With Specified Template";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ populateTemplateList();
+ Boolean updateParagraphNumber = variableMap.getBoolean("Update Paragraph Numbers");
+ Artifact master = getTemplate(variableMap.getString("Master Template"));
+ Artifact slave = getTemplate(variableMap.getString("Slave Template"));
+ Branch branch = variableMap.getBranch("Branch (If Template specifies Artifacts)");
+ List<Artifact> artifacts = variableMap.getArtifacts("Artifacts (If Not Specified in Template)");
+ if (artifacts != null && !artifacts.isEmpty()) {
+ branch = artifacts.get(0).getBranch();
+ }
+ if (artifacts != null && artifacts.isEmpty()) {
+ artifacts = null;
+ }
+ VariableMap newVariableMap = new VariableMap();
+ newVariableMap.setValue("Branch", branch);
+ newVariableMap.setValue("Update Paragraph Numbers", updateParagraphNumber);
+
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+
+ renderer.setOptions(new VariableMap(WordTemplateRenderer.UPDATE_PARAGRAPH_NUMBER_OPTION, updateParagraphNumber,
+ ITemplateRenderer.TRANSACTION_OPTION, transaction));
+ renderer.publish(newVariableMap, master, slave, artifacts);
+
+ transaction.execute();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Select a Master or Master/Slave template and click the play button at the top right.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ populateTemplateList();
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets><XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Update Paragraph Numbers\" />");
+
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\" \" /><XWidget xwidgetType=\"XCombo(");
+ for (Artifact art : templates) {
+ builder.append(art.getSafeName());
+ builder.append(",");
+ }
+ builder.append(")\" displayName=\"Master Template\" horizontalLabel=\"true\"/>");
+ builder.append("<XWidget xwidgetType=\"XCombo(");
+ for (Artifact art : templates) {
+ builder.append(art.getSafeName());
+ builder.append(",");
+ }
+
+ builder.append(")\" displayName=\"Slave Template\" horizontalLabel=\"true\"/><XWidget xwidgetType=\"XLabel\" displayName=\" \" />");
+ builder.append("<XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch (If Template specifies Artifacts)\" defaultValue=\"" + BranchManager.getLastBranch().getBranchName() + "\" /><XWidget xwidgetType=\"XListDropViewer\" displayName=\"Artifacts (If Not Specified in Template)\" />");
+
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private void populateTemplateList() {
+ if (templates == null) {
+ templates = new ArrayList<Artifact>();
+ try {
+ for (ITemplateProvider provider : TemplateManager.getTemplateProviders()) {
+ templates.addAll(provider.getAllTemplates());
+ }
+ Collections.sort(templates);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private Artifact getTemplate(String templateName) {
+ for (Artifact artifact : templates) {
+ if (artifact.getSafeName().equals(templateName)) {
+ return artifact;
+ }
+ }
+ return null;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Publish");
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/SubsystemToLowLevelReqTraceReport.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/SubsystemToLowLevelReqTraceReport.java
new file mode 100644
index 00000000000..a54d6cae7f7
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/blam/operation/SubsystemToLowLevelReqTraceReport.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.blam.operation;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SubsystemToLowLevelReqTraceReport extends AbstractBlam {
+ private CharBackedInputStream charBak;
+ private ISheetWriter excelWriter;
+ private final HashMap<String, List<Artifact>> subsysToSubsysReqsMap;
+ private final List<Artifact> lowLevelReqs;
+ private final HashSet<Artifact> components;
+ private String reqtypeName;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Subsystem To Low Level Req Trace Report";
+ }
+
+ public SubsystemToLowLevelReqTraceReport() {
+ subsysToSubsysReqsMap = new HashMap<String, List<Artifact>>();
+ components = new HashSet<Artifact>();
+ lowLevelReqs = new ArrayList<Artifact>(1000);
+ }
+
+ private void init() throws IOException {
+ subsysToSubsysReqsMap.clear();
+ charBak = new CharBackedInputStream();
+ excelWriter = new ExcelXmlWriter(charBak.getWriter());
+ components.clear();
+ lowLevelReqs.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ monitor.beginTask("Generate Report", 100);
+
+ init();
+ ArtifactType reqType = variableMap.getArtifactType("Low Level Requirement Type");
+ reqtypeName = reqType.getName();
+ initLowLevelRequirements(variableMap.getArtifacts("Lower Level Requirements"));
+ initAllocationComponents(variableMap.getArtifacts("Allocation Components"));
+
+ Branch branch = variableMap.getBranch("Branch");
+
+ monitor.subTask("Loading Higher Level Requirements"); // bulk load to improve performance
+ monitor.worked(1);
+ ArtifactQuery.getArtifactsFromType(Requirements.SUBSYSTEM_REQUIREMENT, branch);
+ monitor.worked(30);
+
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(branch);
+ orderSubsystemReqs(root.getChild(Requirements.SUBSYSTEM_REQUIREMENTS));
+
+ generateLowLevelToSubsystemTrace();
+ generateSubsystemToLowLevelReqTrace();
+
+ excelWriter.endWorkbook();
+ IFile iFile = OseeData.getIFile("Subsystem_To_" + reqtypeName + "_Trace.xml");
+ AIFile.writeToFile(iFile, charBak);
+ Program.launch(iFile.getLocation().toOSString());
+ }
+
+ private void generateLowLevelToSubsystemTrace() throws IOException, OseeCoreException {
+ excelWriter.startSheet("5.1", 7);
+
+ excelWriter.writeRow("5.1 " + reqtypeName + "s Traceability to Subsystem Requirements");
+ excelWriter.writeRow(reqtypeName, null, null, "Traceable Subsystem Requirement");
+ excelWriter.writeRow("Paragraph #", "Paragraph Title", "Qualification Method", "PIDS", "Paragraph #",
+ "Paragraph Title", Requirements.SUBSYSTEM);
+
+ String[] row = new String[7];
+
+ for (Artifact lowLevelReq : lowLevelReqs) {
+ row[0] = correct(lowLevelReq.getSoleAttributeValue("Imported Paragraph Number", ""));
+ row[1] = lowLevelReq.getDescriptiveName();
+ if (lowLevelReq.isOfType(reqtypeName)) {
+ row[2] = lowLevelReq.getAttributesToString("Qualification Method");
+
+ for (Artifact subSysReq : lowLevelReq.getRelatedArtifacts(CoreRelationEnumeration.REQUIREMENT_TRACE__HIGHER_LEVEL)) {
+ row[3] = getAssociatedSubSystem(subSysReq);
+ row[4] = correct(subSysReq.getSoleAttributeValue("Imported Paragraph Number", ""));
+ row[5] = subSysReq.getDescriptiveName();
+ row[6] = subSysReq.getSoleAttributeValue(Requirements.SUBSYSTEM, "");
+ excelWriter.writeRow(row);
+ row[0] = row[1] = row[2] = null;
+ }
+ } else {
+ row[2] = lowLevelReq.getArtifactTypeName();
+ }
+
+ if (row[0] != null) { // if this requirement is not traced to any lower level req (i.e. the for loop didn't run)
+ row[3] = row[4] = row[5] = row[6] = null;
+ excelWriter.writeRow(row);
+ }
+ }
+
+ excelWriter.endSheet();
+ }
+
+ private void generateSubsystemToLowLevelReqTrace() throws IOException, OseeCoreException {
+ excelWriter.startSheet("5.2", 6);
+
+ excelWriter.writeRow("5.2 Subsystem Requirements Allocation Traceability to " + reqtypeName + "s");
+ excelWriter.writeRow();
+
+ int count = 1;
+ for (Entry<String, List<Artifact>> entry : subsysToSubsysReqsMap.entrySet()) {
+ String subSysName = entry.getKey();
+ List<Artifact> subsysReqs = entry.getValue();
+
+ excelWriter.writeRow();
+ excelWriter.writeRow();
+ excelWriter.writeRow("5.2." + count++ + " " + subSysName + " Requirements Allocation Traceability to " + reqtypeName + "s");
+ excelWriter.writeRow(Requirements.SUBSYSTEM_REQUIREMENT, null, "Traceable " + reqtypeName, null);
+ excelWriter.writeRow("Paragraph #", "Paragraph Title", "Paragraph #", "Paragraph Title");
+
+ String[] row = new String[4];
+
+ for (Artifact higherLevelReq : subsysReqs) {
+ if (isAllocated(higherLevelReq)) {
+ row[0] = correct(higherLevelReq.getSoleAttributeValue("Imported Paragraph Number", ""));
+ row[1] = higherLevelReq.getDescriptiveName();
+
+ for (Artifact lowerLevelReq : higherLevelReq.getRelatedArtifacts(CoreRelationEnumeration.REQUIREMENT_TRACE__LOWER_LEVEL)) {
+ if (lowLevelReqs.contains(lowerLevelReq)) {
+ row[2] = correct(lowerLevelReq.getSoleAttributeValue("Imported Paragraph Number", ""));
+ row[3] = lowerLevelReq.getDescriptiveName();
+ excelWriter.writeRow(row);
+ row[0] = row[1] = null;
+ }
+ }
+ if (row[0] != null) { // if this requirement is not traced to any low level requirement(i.e. the for loop didn't run)
+ row[2] = row[3] = null;
+ excelWriter.writeRow(row);
+ }
+ }
+ }
+ }
+ excelWriter.endSheet();
+ }
+
+ private boolean isAllocated(Artifact higherLevelReq) throws OseeCoreException {
+ for (Artifact component : higherLevelReq.getRelatedArtifacts("Allocation")) {
+ if (components.contains(component)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void initLowLevelRequirements(List<Artifact> artifacts) throws OseeCoreException {
+ RelationManager.getRelatedArtifacts(artifacts, 999, true, CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD);
+ for (Artifact artifact : artifacts) {
+ if (!artifact.isOfType("Folder")) {
+ lowLevelReqs.add(artifact);
+ }
+ lowLevelReqs.addAll(artifact.getDescendants());
+ }
+ }
+
+ private void initAllocationComponents(List<Artifact> artifacts) throws OseeCoreException {
+ RelationManager.getRelatedArtifacts(artifacts, 999, true, CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD);
+ for (Artifact artifact : artifacts) {
+ if (!artifact.isOfType("Folder")) {
+ components.add(artifact);
+ }
+ components.addAll(artifact.getDescendants());
+ }
+ }
+
+ private String correct(String value) {
+ return value.equals("") ? null : value;
+ }
+
+ private String getAssociatedSubSystem(Artifact subSysReq) {
+ for (Entry<String, List<Artifact>> entry : subsysToSubsysReqsMap.entrySet()) {
+ String subSysName = entry.getKey();
+ List<Artifact> subsysReqs = entry.getValue();
+ if (subsysReqs.contains(subSysReq)) {
+ return subSysName;
+ }
+ }
+ return "N/A";
+ }
+
+ private void orderSubsystemReqs(Artifact subsysTopFolder) throws OseeCoreException {
+ for (Artifact subsysFolder : subsysTopFolder.getChildren()) {
+ String subSysName = subsysFolder.getDescriptiveName();
+ List<Artifact> subsysReqs = subsysFolder.getDescendants();
+ subsysToSubsysReqsMap.put(subSysName, subsysReqs);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getXWidgetsXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" toolTip=\"Select a requirements branch.\" /><XWidget xwidgetType=\"XListDropViewer\" displayName=\"Lower Level Requirements\" /><XWidget xwidgetType=\"XListDropViewer\" displayName=\"Allocation Components\" /><XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"Low Level Requirement Type\" defaultValue=\"Software Requirement\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Publish");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/ErrorHandler.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/ErrorHandler.java
new file mode 100644
index 00000000000..e12cb033134
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/ErrorHandler.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.define.errorhandler;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ErrorHandler {
+
+ private Set<Resolver> set;
+ private StateValue value;
+
+ /**
+ * Error handler.
+ */
+ public ErrorHandler() {
+ super();
+ this.set = new HashSet<Resolver>();
+ this.value = new StateValue();
+ }
+
+ public void processException(Exception ex) {
+ boolean resolved = false;
+ for (Resolver r : set) {
+ if (r.resolve(ex, value)) {
+ resolved = true;
+ }
+ }
+ if (!resolved) {
+ throw new RuntimeException("Exception not resolved", ex);
+ }
+ }
+
+ public void addResolver(Resolver resolver) {
+ set.add(resolver);
+ }
+
+ public boolean isSaveValid() {
+ return value.isSaveValid();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/Resolver.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/Resolver.java
new file mode 100644
index 00000000000..aacf4e76012
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/Resolver.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.define.errorhandler;
+
+public interface Resolver {
+
+ public boolean resolve(Exception ex, StateValue value);
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/SqlResolver.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/SqlResolver.java
new file mode 100644
index 00000000000..eae68646af2
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/SqlResolver.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.define.errorhandler;
+
+public class SqlResolver implements Resolver {
+
+ public SqlResolver() {
+ super();
+ }
+
+ public boolean resolve(Exception ex, StateValue value) {
+ if (ex.getMessage().contains("connection")) {
+ value.andSaveValid(false);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return this.getClass().getCanonicalName().equals(obj.getClass().getCanonicalName());
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getClass().getCanonicalName().hashCode();
+ }
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/StateValue.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/StateValue.java
new file mode 100644
index 00000000000..8cb4546cb80
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/errorhandler/StateValue.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.define.errorhandler;
+
+public class StateValue {
+
+ private boolean isSaveValid;
+
+ public StateValue() {
+ super();
+ isSaveValid = true;
+ }
+
+ public boolean isSaveValid() {
+ return isSaveValid;
+ }
+
+ public void andSaveValid(boolean isSaveValid) {
+ this.isSaveValid &= isSaveValid;
+ }
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateView.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateView.java
new file mode 100644
index 00000000000..74881400c7f
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateView.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.define.navigate;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+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 DefineNavigateView extends ViewPart implements IActionable {
+
+ public static final String VIEW_ID = "org.eclipse.osee.define.DefineNavigateView";
+ public static final String HELP_CONTEXT_ID = "defineNavigator";
+ private XNavigateComposite xNavComp;
+
+ /**
+ * The constructor.
+ */
+ public DefineNavigateView() {
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(parent)) return;
+
+ xNavComp = new XNavigateComposite(new DefineNavigateViewItems(), parent, SWT.NONE);
+ xNavComp.getFilteredTree().getViewer().setSorter(new DefineNavigateViewerSorter());
+
+ DefinePlugin.getInstance().setHelp(xNavComp, HELP_CONTEXT_ID);
+ createActions();
+ xNavComp.refresh();
+ }
+
+ protected void createActions() {
+
+ Action refreshAction = new Action("Refresh") {
+
+ @Override
+ public void run() {
+ xNavComp.refresh();
+ }
+ };
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ refreshAction.setToolTipText("Refresh");
+
+ OseeAts.addBugToViewToolbar(this, this, DefinePlugin.getInstance(), VIEW_ID, "Define Navigator");
+
+ }
+
+ public String getActionDescription() {
+ IStructuredSelection sel = (IStructuredSelection) xNavComp.getFilteredTree().getViewer().getSelection();
+ if (sel.iterator().hasNext()) return String.format("Currently Selected - %s",
+ ((XNavigateItem) sel.iterator().next()).getName());
+ return "";
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewItems.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewItems.java
new file mode 100644
index 00000000000..191bb31643e
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewItems.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.define.navigate;
+
+import java.util.ArrayList;
+import java.util.List;
+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.Platform;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamContributionManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemFolder;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateViewItems;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefineNavigateViewItems extends XNavigateViewItems {
+ private static DefineNavigateViewItems navigateItems = new DefineNavigateViewItems();
+
+ public DefineNavigateViewItems() {
+ super();
+ }
+
+ public static DefineNavigateViewItems getInstance() {
+ return navigateItems;
+ }
+
+ @Override
+ public List<XNavigateItem> getSearchNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+
+ try {
+ BlamContributionManager.addBlamOperationsToNavigator(items);
+
+ if (AccessControlManager.isOseeAdmin()) {
+ XNavigateItem adminItems = new XNavigateItemFolder(null, "Admin");
+ items.add(adminItems);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ addExtensionPointItems(items);
+
+ return items;
+ }
+
+ public void addExtensionPointItems(List<XNavigateItem> items) {
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.define.DefineNavigateItem");
+ if (point == null) {
+ OseeLog.log(DefinePlugin.class, OseeLevel.SEVERE_POPUP, "Can't access DefineNavigateItem extension point");
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("IDefineNavigateItem")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ }
+ }
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ IDefineNavigateItem task = (IDefineNavigateItem) obj;
+ items.addAll(task.getNavigateItems());
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, OseeLevel.SEVERE_POPUP, "Error loading DefineNavigateItem extension", ex);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewerSorter.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewerSorter.java
new file mode 100644
index 00000000000..70ad4d49b27
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/DefineNavigateViewerSorter.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.define.navigate;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefineNavigateViewerSorter extends ViewerSorter {
+
+ /**
+ * @param treeViewer
+ */
+ public DefineNavigateViewerSorter() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @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.define/src/org/eclipse/osee/define/navigate/IDefineNavigateItem.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/IDefineNavigateItem.java
new file mode 100644
index 00000000000..17ee37995d7
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/navigate/IDefineNavigateItem.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.define.navigate;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IDefineNavigateItem {
+
+ public List<XNavigateItem> getNavigateItems();
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/ExtractTestRelations.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/ExtractTestRelations.java
new file mode 100644
index 00000000000..417c21e2ef5
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/ExtractTestRelations.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.define.relation.Import;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.CharBuffer;
+import java.util.ArrayList;
+import java.util.List;
+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.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.text.FindResults;
+import org.eclipse.osee.framework.jdk.core.text.tool.Find;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+
+public class ExtractTestRelations {
+ private String scriptsDir;
+ private String fileNamePattern;
+ private Branch branch;
+ private static final Matcher testScriptMatcher = Pattern.compile("doTestCase").matcher("");
+ private static final Matcher traceabilityMatcher = Pattern.compile("RequirementId\\(\\\"([^\\\"]+)\\\"").matcher("");
+
+ public ExtractTestRelations(String scriptsDir, String fileNamePattern, Branch branch) {
+ super();
+ this.scriptsDir = scriptsDir;
+ this.fileNamePattern = fileNamePattern;
+ this.branch = branch;
+ }
+
+ public void run() {
+ ArrayList<String> patterns = new ArrayList<String>();
+ patterns.add(scriptsDir);
+ Find app = new Find("RequirementId\\(\\\"([^\\\"]+)\\\"", new File(scriptsDir), fileNamePattern);
+ app.find(999999, true);
+ FindResults results = app.getResults();
+
+ for (FindResults.FindResultsIterator i = results.iterator(); i.hasNext();) {
+ try {
+ addRelationToDatabaseIfNotAlreadyThere(AWorkspace.fileToIFile(i.currentFile), i.currentRegion);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ }
+
+ public static void traceabilityReport() throws IOException {
+ Pattern javaFilePattern = Pattern.compile(".*\\.java");
+ for (IProject project : AWorkspace.getProjects()) {
+ File projectLocation = project.getLocation().toFile();
+ for (File javaFile : (List<File>) Lib.recursivelyListFiles(projectLocation, javaFilePattern)) {
+ CharBuffer buf = Lib.fileToCharBuffer(javaFile);
+ testScriptMatcher.reset(buf);
+ if (testScriptMatcher.find()) {
+ traceabilityMatcher.reset(buf);
+ while (traceabilityMatcher.find()) {
+ System.out.println(javaFile.getName() + ", " + traceabilityMatcher.group(1));
+ }
+ } else {
+ System.out.println(javaFile + ": no traceability");
+ }
+ }
+ }
+ }
+
+ private void addRelationToDatabaseIfNotAlreadyThere(IFile testArtifactFile, String reqArtifactName) throws OseeCoreException {
+
+ // Make sure that the runtime relation type is available
+ Artifact reqArtifact =
+ ArtifactQuery.getArtifactFromTypeAndName(Requirements.SOFTWARE_REQUIREMENT, reqArtifactName, branch);
+
+ // Make sure we have the reqArtifact
+ if (reqArtifact == null) {
+ System.out.println("Unable to locate the requirement named:\"" + reqArtifactName + "\"");
+ return;
+ }
+
+ // TODO replace the null here with the Test_TestSide relationSide enumeration
+ reqArtifact.addRelation(null, getTestArtifact(testArtifactFile, reqArtifact.getBranch()));
+ // Get a new test relation with the same tag as the requirement artifact
+ // UserRelation testRelation = relationManager.getUserRelationDescriptor("Test").makeNewUserRelation(reqArtifact.getTag());
+ // RelationLink link = relationManager.getRelationLinkDescriptor("Test").makeNewLink();
+
+ // Add the items to the relation
+ // link.setArtifact("Requirement", reqArtifact);
+ // link.setArtifact("Test", getTestArtifact(testArtifactName, reqArtifact.getTag()));
+ // reqArtifact.getLinkManager().addLink(link);
+ //
+ // link.setArtifactA(reqArtifact);
+ // link.setArtifactB(getTestArtifact(testArtifactName, reqArtifact.getTag()));
+ // link.persist();
+
+ // testRelation.addArtifact("test", getTestArtifact(testArtifactName, reqArtifact.getTag()));
+ // testRelation.addArtifact("requirement", reqArtifact);
+
+ // Save the relation
+ // link.persist();
+ }
+
+ private Artifact getTestArtifact(IFile testArtifactFile, Branch branch) throws OseeCoreException {
+ try {
+ return ArtifactQuery.getArtifactFromTypeAndName(Requirements.TEST_CASE, testArtifactFile.getName(), branch);
+ } catch (MultipleArtifactsExist ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ return null;
+ } catch (ArtifactDoesNotExist ex) {
+ Artifact testArtifact =
+ ArtifactTypeManager.addArtifact(Requirements.TEST_CASE, branch, testArtifactFile.getName());
+ testArtifact.setSoleAttributeValue("Content URL", testArtifactFile.getFullPath().toString());
+ testArtifact.persistAttributes();
+ return testArtifact;
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/RelationImporter.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/RelationImporter.java
new file mode 100644
index 00000000000..4b8fbc42a43
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/Import/RelationImporter.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.relation.Import;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RelationImporter implements RowProcessor {
+ private static final ArtifactPersistenceManager artifactManager = ArtifactPersistenceManager.getInstance();
+ private static final int leadingColumnCount = 2;
+ private final ExcelSaxHandler excelHandler;
+ private final XMLReader xmlReader;
+ private Artifact[] columnArtifacts;
+ private IProgressMonitor monitor;
+ private boolean done;
+ private final Branch branch;
+
+ /**
+ * @throws SAXException
+ */
+ public RelationImporter(Branch branch) throws SAXException {
+ this.branch = branch;
+ excelHandler = new ExcelSaxHandler(this, true, true);
+
+ xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(excelHandler);
+ }
+
+ public void extractRelationsFromSheet(InputStream importStream, IProgressMonitor monitor) throws IOException, SAXException {
+ this.monitor = monitor;
+ xmlReader.parse(new InputSource(importStream));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#processRow(java.lang.String[])
+ */
+ public void processRow(String[] row) {
+ if (done) return;
+ try {
+ monitor.worked(1);
+ Collection<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromTypeAndAttribute(Requirements.SUBSYSTEM_REQUIREMENT,
+ "Imported Paragraph Number", row[1], branch);
+
+ Artifact rowArtifact;
+ try {
+ rowArtifact = getSoleArtifact(artifacts);
+ } catch (IllegalArgumentException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ return;
+ }
+
+ if (rowArtifact == null) {
+ System.out.println("Skipping " + row[0] + " becuase no matching artifact was found");
+ } else {
+ if (!row[0].equals(rowArtifact.getDescriptiveName())) {
+ System.out.printf("Warning %s != %s%n", row[0], rowArtifact.getDescriptiveName());
+ }
+ monitor.subTask(rowArtifact.getDescriptiveName());
+ for (int i = 0; i < columnArtifacts.length; i++) {
+ String rationale = row[i + leadingColumnCount];
+ if (rationale != null) {
+ if (rationale.equalsIgnoreCase("x")) {
+ rationale = "";
+ }
+ columnArtifacts[i].addRelation(CoreRelationEnumeration.ALLOCATION__REQUIREMENT, rowArtifact,
+ rationale);
+ columnArtifacts[i].persistRelations();
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private Artifact getSoleArtifact(Collection<Artifact> artifacts) {
+ Artifact artifactResult = null;
+ boolean soleArtifact = true;
+ for (Artifact artifact : artifacts) {
+ if (soleArtifact) {
+ soleArtifact = false;
+ } else {
+ throw new IllegalArgumentException("Found more than one match for: " + artifact);
+ }
+ artifactResult = artifact;
+ }
+ return artifactResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] row) {
+ monitor.setTaskName("Aquire Column Artifacts");
+ columnArtifacts = new Artifact[row.length - leadingColumnCount];
+ for (int i = 0; i < columnArtifacts.length; i++) {
+ monitor.worked(1);
+ try {
+ Collection<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromTypeAndName(Requirements.COMPONENT, row[i + leadingColumnCount], branch);
+
+ columnArtifacts[i] = getSoleArtifact(artifacts);
+ monitor.subTask(columnArtifacts[i].getDescriptiveName());
+ } catch (Exception ex) {
+ System.out.println(ex);
+ }
+ }
+ System.out.println(Arrays.deepToString(columnArtifacts));
+ monitor.setTaskName("Relate Row Artifacts");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#processEmptyRow()
+ */
+ public void processEmptyRow() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ monitor.done();
+ done = true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#detectedTotalRowCount(int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ monitor.beginTask("Importing Relations", rowCount + columnCount - leadingColumnCount);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.artifact.Import.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/TreeViewerTest.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/TreeViewerTest.java
new file mode 100644
index 00000000000..00023bf9d34
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/relation/TreeViewerTest.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.define.relation;
+
+import java.io.File;
+import java.util.Date;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableColorProvider;
+import org.eclipse.jface.viewers.ITableFontProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+
+public class TreeViewerTest {
+
+ class TreeViewerTestLabelProvider implements ITableLabelProvider, ITableColorProvider, ITableFontProvider {
+ Font font = null;
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (!(element instanceof File)) return null;
+ File file = (File) element;
+ switch (columnIndex) {
+ case 0:
+ return file.getName();
+ case 1:
+ return "" + new Date(file.lastModified());
+ case 2:
+ return "" + file.isHidden();
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex != 0) return null;
+ if (!(element instanceof File)) return null;
+ File file = (File) element;
+ Display display = Display.getCurrent();
+ if (file.isDirectory()) return display.getSystemImage(SWT.ICON_WARNING);
+ return display.getSystemImage(SWT.ICON_QUESTION);
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public Color getForeground(Object element, int columnIndex) {
+ if (columnIndex == 1) {
+ Display display = Display.getCurrent();
+ return display.getSystemColor(SWT.COLOR_RED);
+ }
+ return null;
+ }
+
+ public Color getBackground(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ File file = (File) element;
+ Display display = Display.getCurrent();
+ if (file.isDirectory()) return display.getSystemColor(SWT.COLOR_CYAN);
+ return display.getSystemColor(SWT.COLOR_MAGENTA);
+ }
+ return null;
+ }
+
+ public Font getFont(Object element, int columnIndex) {
+ if (columnIndex == 2) {
+ if (font == null) {
+ Display display = Display.getCurrent();
+ font = new Font(display, "Times", 12, SWT.ITALIC);
+ }
+ return font;
+ }
+ return null;
+ }
+ }
+
+ public static void main(String[] args) {
+ final Display display = new Display();
+ final Shell shell = new Shell(display);
+ shell.setLayout(new FormLayout());
+
+ TreeViewerTestLabelProvider labelProvider1 = new TreeViewerTest().new TreeViewerTestLabelProvider();
+ ITreeContentProvider contentProvider = new ITreeContentProvider() {
+ public Object[] getChildren(Object parentElement) {
+ if (!(parentElement instanceof File)) return null;
+ File file = (File) parentElement;
+ if (file.isDirectory()) return file.listFiles();
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ if (!(element instanceof File)) return null;
+ File file = (File) element;
+ return file.getParentFile();
+ }
+
+ public boolean hasChildren(Object element) {
+ if (!(element instanceof File)) return false;
+ File file = (File) element;
+ return file.isDirectory();
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ };
+
+ ILabelProvider labelProvider2 = new ILabelProvider() {
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public Image getImage(Object element) {
+ if (!(element instanceof File)) return null;
+ File file = (File) element;
+ if (file.isDirectory()) return display.getSystemImage(SWT.ICON_WARNING);
+ return display.getSystemImage(SWT.ICON_QUESTION);
+ }
+
+ public String getText(Object element) {
+ if (!(element instanceof File)) return null;
+ File file = (File) element;
+ return file.getName();
+ }
+
+ };
+
+ final TreeViewer treeViewer1 = new TreeViewer(shell, SWT.FULL_SELECTION | SWT.CHECK);
+ Tree tree1 = treeViewer1.getTree();
+ tree1.setHeaderVisible(true);
+ TreeColumn column1 = new TreeColumn(tree1, SWT.LEFT);
+ column1.setText("Name");
+ column1.setImage(display.getSystemImage(SWT.ICON_WORKING));
+ column1.setWidth(200);
+ TreeColumn column2 = new TreeColumn(tree1, SWT.CENTER);
+ column2.setText("Last Modified");
+ column2.setImage(display.getSystemImage(SWT.ICON_INFORMATION));
+ column2.setWidth(200);
+ TreeColumn column3 = new TreeColumn(tree1, SWT.CENTER);
+ column3.setText("Hidden");
+ column3.setImage(display.getSystemImage(SWT.ICON_INFORMATION));
+ column3.setWidth(100);
+ treeViewer1.setLabelProvider(labelProvider1);
+ treeViewer1.setContentProvider(contentProvider);
+
+ final TreeViewer treeViewer2 = new TreeViewer(shell);
+ Tree tree2 = treeViewer2.getTree();
+ treeViewer2.setLabelProvider(labelProvider2);
+ treeViewer2.setContentProvider(contentProvider);
+
+ Button b = new Button(shell, SWT.PUSH);
+ b.setText("choose root folder");
+ b.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ DirectoryDialog f = new DirectoryDialog(shell, SWT.OPEN);
+ String root = f.open();
+ if (root != null) {
+ File file = new File(root);
+ if (file.exists()) {
+ treeViewer1.setInput(file);
+ treeViewer1.refresh();
+ treeViewer2.setInput(file);
+ treeViewer2.refresh();
+ }
+ }
+ }
+ });
+
+ FormData data = new FormData();
+ data.left = new FormAttachment(0, 10);
+ data.top = new FormAttachment(0, 10);
+ data.right = new FormAttachment(50, -5);
+ data.bottom = new FormAttachment(b, -10);
+ tree1.setLayoutData(data);
+
+ data = new FormData();
+ data.left = new FormAttachment(50, 5);
+ data.top = new FormAttachment(0, 10);
+ data.right = new FormAttachment(100, -10);
+ data.bottom = new FormAttachment(b, -10);
+ tree2.setLayoutData(data);
+
+ data = new FormData();
+ data.left = new FormAttachment(0, 10);
+ data.bottom = new FormAttachment(100, -10);
+ b.setLayoutData(data);
+
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+ display.dispose();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceParser.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceParser.java
new file mode 100644
index 00000000000..f2b6161d8ff
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceParser.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.define.traceability;
+
+import java.nio.CharBuffer;
+import java.util.Collection;
+import org.eclipse.osee.define.traceability.data.TraceMark;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITraceParser {
+
+ public Collection<TraceMark> getTraceMarks(CharBuffer fileBuffer);
+
+ public CharBuffer removeTraceMarks(CharBuffer fileBuffer);
+
+ public boolean isTraceRemovalAllowed();
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceUnitResourceLocator.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceUnitResourceLocator.java
new file mode 100644
index 00000000000..c403b8fd37b
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ITraceUnitResourceLocator.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.define.traceability;
+
+import java.nio.CharBuffer;
+import org.eclipse.osee.define.utility.IResourceLocator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITraceUnitResourceLocator extends IResourceLocator {
+
+ public String UNIT_TYPE_UNKNOWN = "Unknown";
+
+ public String getTraceUnitType(String name, CharBuffer fileBuffer);
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java
new file mode 100644
index 00000000000..15d0eb1fc45
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java
@@ -0,0 +1,250 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Pattern;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+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.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.data.RequirementData;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.CountingMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ImportTraceabilityJob extends Job {
+ private static final Pattern filePattern = Pattern.compile(".*\\.(java|ada|ads|adb|c|h)");
+ private static final TraceabilityExtractor traceExtractor = TraceabilityExtractor.getInstance();
+
+ private final File file;
+ private final RequirementData requirementData;
+ private final ArrayList<String> noTraceabilityFiles;
+ private final CountingMap<Artifact> reqsTraceCounts;
+ private final HashCollection<Artifact, String> requirementToCodeUnitsMap;
+ private final HashSet<String> codeUnits;
+ private final CharBackedInputStream charBak;
+ private final ISheetWriter excelWriter;
+ private int pathPrefixLength;
+ private boolean writeOutResults;
+
+ public ImportTraceabilityJob(File file, Branch branch, boolean writeOutResults) throws CoreException, IOException {
+ super("Importing Traceability");
+ this.file = file;
+ this.requirementData = new RequirementData(branch);
+ noTraceabilityFiles = new ArrayList<String>(200);
+ reqsTraceCounts = new CountingMap<Artifact>();
+ codeUnits = new HashSet<String>();
+ requirementToCodeUnitsMap = new HashCollection<Artifact, String>(false, LinkedList.class);
+ charBak = new CharBackedInputStream();
+ excelWriter = new ExcelXmlWriter(charBak.getWriter());
+ this.writeOutResults = writeOutResults;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ try {
+ monitor.beginTask("Importing From " + file.getName(), 100);
+ monitor.worked(1);
+
+ toReturn = requirementData.initialize(monitor);
+ if (toReturn.getSeverity() == IStatus.OK) {
+ if (monitor.isCanceled() != true) {
+ if (writeOutResults) {
+ excelWriter.startSheet("srs <--> code units", 6);
+ excelWriter.writeRow("Req in DB", "Code Unit", "Requirement Name", "Requirement Trace Mark in Code");
+ }
+
+ if (file.isFile()) {
+ for (String path : Lib.readListFromFile(file, true)) {
+ monitor.subTask(path);
+ handleDirectory(new File(path));
+ if (monitor.isCanceled() == true) {
+ break;
+ }
+ }
+ } else if (file.isDirectory()) {
+ handleDirectory(file);
+ } else {
+ throw new IllegalStateException("unexpected file system type");
+ }
+
+ if (writeOutResults && monitor.isCanceled() != true) {
+ excelWriter.endSheet();
+
+ writeNoTraceFilesSheet();
+ writeTraceCountsSheet();
+
+ excelWriter.endWorkbook();
+ IFile iFile = OseeData.getIFile("CodeUnit_To_SRS_Trace.xml");
+ AIFile.writeToFile(iFile, charBak);
+ Program.launch(iFile.getLocation().toOSString());
+ }
+
+ if (monitor.isCanceled() != true) {
+ toReturn = Status.OK_STATUS;
+ } else {
+ toReturn = Status.CANCEL_STATUS;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ toReturn = new Status(Status.ERROR, DefinePlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return toReturn;
+ }
+
+ private void handleDirectory(File directory) throws IOException, OseeCoreException {
+ if (directory == null || directory.getParentFile() == null) {
+ throw new OseeArgumentException("The path " + directory + " is invalid.");
+ }
+
+ pathPrefixLength = directory.getParentFile().getAbsolutePath().length();
+
+ for (File sourceFile : Lib.recursivelyListFiles(directory, filePattern)) {
+ List<String> traceMarks = traceExtractor.getTraceMarksFromFile(sourceFile);
+
+ int matchCount = 0;
+ String relativePath = sourceFile.getPath().substring(pathPrefixLength);
+ codeUnits.add(relativePath);
+ for (String traceMark : traceMarks) {
+ handelReqTrace(relativePath, traceMark);
+ matchCount++;
+ }
+ if (matchCount == 0) {
+ noTraceabilityFiles.add(relativePath);
+ }
+ }
+ }
+
+ private void writeNoTraceFilesSheet() throws IOException {
+ excelWriter.startSheet("no match files", 1);
+ for (String path : noTraceabilityFiles) {
+ excelWriter.writeRow(path);
+ }
+ excelWriter.endSheet();
+ }
+
+ private void writeTraceCountsSheet() throws IOException, OseeCoreException {
+ excelWriter.startSheet("trace counts", 3);
+ excelWriter.writeRow("SRS Requirement from Database", "Trace Count", "Partitions");
+ excelWriter.writeRow("% requirement coverage", null, "=1-COUNTIF(C2,&quot;0&quot;)/COUNTA(C2)");
+
+ for (Artifact artifact : requirementData.getDirectSwRequirements()) {
+ excelWriter.writeRow(artifact.getDescriptiveName(), String.valueOf(reqsTraceCounts.get(artifact)),
+ Collections.toString(",", artifact.getAttributesToStringList(Requirements.PARTITION)));
+ }
+
+ excelWriter.endSheet();
+ }
+
+ private void handelReqTrace(String path, String traceMark) throws OseeCoreException, IOException {
+ String foundStr;
+ Artifact reqArtifact = null;
+
+ if (traceExtractor.isValidTraceMark(traceMark) != true) {
+ foundStr = "invalid trace mark";
+ } else {
+ reqArtifact = requirementData.getRequirementFromTraceMark(traceMark);
+ if (reqArtifact == null) {
+ Pair<String, String> structuredRequirement = traceExtractor.getStructuredRequirement(traceMark);
+ if (structuredRequirement != null) {
+ reqArtifact = requirementData.getRequirementFromTraceMark(structuredRequirement.getKey());
+
+ if (reqArtifact == null) {
+ foundStr = "no match in DB";
+ } else {
+ // for local data and procedures search requirement text for traceMark
+ // example local data [{SUBSCRIBER}.ID] and example procedure {CURSOR_ACKNOWLEDGE}.NORMAL
+ String textContent =
+ WordUtil.textOnly(reqArtifact.getSoleAttributeValue(WordAttribute.WORD_TEMPLATE_CONTENT, "")).toUpperCase();
+ if (textContent.contains(traceExtractor.getCanonicalRequirementName(structuredRequirement.getValue()))) {
+ foundStr = "req body match";
+ } else {
+ foundStr = "paritial match";
+ }
+ }
+ } else {
+ foundStr = "no match in DB";
+ }
+ } else {
+ foundStr = fullMatch(reqArtifact);
+ }
+ }
+
+ String name = null;
+ if (reqArtifact != null) {
+ name = reqArtifact.getDescriptiveName();
+ requirementToCodeUnitsMap.put(reqArtifact, path);
+ }
+
+ if (writeOutResults) {
+ excelWriter.writeRow(foundStr, path, name, traceMark);
+ }
+ }
+
+ private String fullMatch(Artifact reqArtifact) {
+ reqsTraceCounts.put(reqArtifact);
+ return "full match";
+ }
+
+ public HashCollection<Artifact, String> getRequirementToCodeUnitsMap() {
+ return requirementToCodeUnitsMap;
+ }
+
+ /**
+ * @return the codeUnits
+ */
+ public HashSet<String> getCodeUnits() {
+ return codeUnits;
+ }
+
+ /**
+ * Get all direct and indirect software requirements
+ *
+ * @return requirement data
+ */
+ public RequirementData getRequirementData() {
+ return requirementData;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityPage.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityPage.java
new file mode 100644
index 00000000000..f2f8b7f6caf
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityPage.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability;
+
+import java.io.File;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.DirectoryOrFileSelector;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ImportTraceabilityPage extends WizardDataTransferPage {
+ public static final String PAGE_NAME = "org.eclipse.osee.define.wizardPage.importTraceabilityPage";
+
+ private DirectoryOrFileSelector directoryFileSelector;
+ private BranchSelectComposite branchSelectComposite;
+
+ private IResource currentResourceSelection;
+
+ /**
+ * @param name
+ * @param selection
+ */
+ public ImportTraceabilityPage(IStructuredSelection selection) {
+ super(PAGE_NAME);
+
+ setTitle("Import traceability into OSEE Define");
+ setDescription("Import relations between artifacts");
+
+ if (selection != null && selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ currentResourceSelection = (IResource) ((IAdaptable) firstElement).getAdapter(IResource.class);
+ }
+ }
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ composite.setFont(parent.getFont());
+
+ createSourceGroup(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+ }
+
+ protected void createSourceGroup(Composite parent) {
+ directoryFileSelector = new DirectoryOrFileSelector(parent, SWT.NONE, "Import Source", this);
+
+ if (currentResourceSelection == null) {
+ // Select directory as the default
+ directoryFileSelector.setDirectorySelected(true);
+ } else {
+ directoryFileSelector.setDirectorySelected(currentResourceSelection.getType() != IResource.FILE);
+ directoryFileSelector.setText(currentResourceSelection.getLocation().toString());
+ }
+
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Destination Branch");
+ GridLayout gd = new GridLayout();
+ composite.setLayout(gd);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ branchSelectComposite = new BranchSelectComposite(composite, SWT.BORDER, false);
+
+ setPageComplete(determinePageCompletion());
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ return directoryFileSelector.validate(this);
+ }
+
+ public File getImportFile() {
+ return directoryFileSelector.getFile();
+ }
+
+ public Branch getSelectedBranch() {
+ return branchSelectComposite.getSelectedBranch();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityWizard.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityWizard.java
new file mode 100644
index 00000000000..c09544983f8
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityWizard.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.define.traceability;
+
+import java.io.File;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ImportTraceabilityWizard extends Wizard implements IImportWizard {
+ private ImportTraceabilityPage mainPage;
+ private IStructuredSelection selection;
+
+ public ImportTraceabilityWizard() {
+ super();
+ setWindowTitle("Traceability Import Wizard");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ Branch branch = mainPage.getSelectedBranch();
+ File file = mainPage.getImportFile();
+ Jobs.startJob(new ImportTraceabilityJob(file, branch, true));
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, OseeLevel.SEVERE_POPUP, "Traceability Import Error", ex);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ @Override
+ public void addPages() {
+ mainPage = new ImportTraceabilityPage(selection);
+ addPage(mainPage);
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceUnitExtensionManager.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceUnitExtensionManager.java
new file mode 100644
index 00000000000..71d99c0941c
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceUnitExtensionManager.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceUnitExtensionManager {
+
+ private static final String TRACE_UNIT_HANDLER = "TraceUnitHandler";
+ private static final String TRACE_UNIT_RESOURCE_LOCATOR = "TraceUnitResourceLocator";
+ private static final String TRACE_UNIT_PARSER = "TraceUnitParser";
+
+ private final Map<String, TraceHandler> contributions;
+
+ private static TraceUnitExtensionManager instance = null;
+
+ private TraceUnitExtensionManager() {
+ contributions = new HashMap<String, TraceHandler>();
+ }
+
+ public static TraceUnitExtensionManager getInstance() {
+ if (instance == null) {
+ instance = new TraceUnitExtensionManager();
+ }
+ return instance;
+ }
+
+ public Set<String> getTraceUnitHandlerIds() throws OseeCoreException {
+ checkObjectsLoaded();
+ return contributions.keySet();
+ }
+
+ public Collection<TraceHandler> getAllTraceHandlers() throws OseeCoreException {
+ checkObjectsLoaded();
+ return contributions.values();
+ }
+
+ public TraceHandler getTraceUnitHandlerById(String id) throws OseeCoreException {
+ checkObjectsLoaded();
+ return contributions.get(id);
+ }
+
+ public ITraceParser getTraceParserById(String id) throws OseeCoreException {
+ TraceHandler traceUnitHandler = getTraceUnitHandlerById(id);
+ if (traceUnitHandler != null) {
+ return traceUnitHandler.getParser();
+ }
+ return null;
+ }
+
+ public ITraceUnitResourceLocator getTraceUnitLocatorById(String id) throws OseeCoreException {
+ TraceHandler traceUnitHandler = getTraceUnitHandlerById(id);
+ if (traceUnitHandler != null) {
+ return traceUnitHandler.getLocator();
+ }
+ return null;
+ }
+
+ public Collection<ITraceParser> getAllTraceParsers() throws OseeCoreException {
+ checkObjectsLoaded();
+ Set<ITraceParser> parsers = new HashSet<ITraceParser>();
+ for (TraceHandler traceHandler : contributions.values()) {
+ ITraceParser parser = traceHandler.getParser();
+ if (parser != null) {
+ parsers.add(parser);
+ }
+ }
+ return parsers;
+ }
+
+ public Collection<ITraceUnitResourceLocator> getAllTraceUnitLocators() throws OseeCoreException {
+ checkObjectsLoaded();
+ Set<ITraceUnitResourceLocator> locators = new HashSet<ITraceUnitResourceLocator>();
+ for (TraceHandler traceHandler : contributions.values()) {
+ ITraceUnitResourceLocator locator = traceHandler.getLocator();
+ if (locator != null) {
+ locators.add(locator);
+ }
+ }
+ return locators;
+ }
+
+ private void checkObjectsLoaded() throws OseeCoreException {
+ if (contributions.isEmpty()) {
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements(DefinePlugin.PLUGIN_ID + "." + TRACE_UNIT_HANDLER,
+ TRACE_UNIT_HANDLER);
+ for (IConfigurationElement element : elements) {
+ IExtension extension = ((IExtension) element.getParent());
+ String identifier = extension.getUniqueIdentifier();
+ String name = extension.getLabel();
+ String bundleName = element.getContributor().getName();
+ String parserClassName = element.getAttribute(TRACE_UNIT_PARSER);
+ String locatorClassName = element.getAttribute(TRACE_UNIT_RESOURCE_LOCATOR);
+
+ ITraceParser parser = (ITraceParser) loadClass(bundleName, parserClassName);
+ ITraceUnitResourceLocator locator = (ITraceUnitResourceLocator) loadClass(bundleName, locatorClassName);
+ if (parser != null && locator != null) {
+ contributions.put(identifier, new TraceHandler(identifier, name, locator, parser));
+ }
+ }
+ }
+ }
+
+ private Object loadClass(String bundleName, String className) throws OseeCoreException {
+ Object object = null;
+ if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> taskClass = bundle.loadClass(className);
+ try {
+ Method getInstance = taskClass.getMethod("getInstance", new Class[] {});
+ object = getInstance.invoke(null, new Object[] {});
+ } catch (Exception ex) {
+ object = taskClass.newInstance();
+ }
+ } catch (Exception ex) {
+ throw new OseeCoreException(String.format("Unable to Load: [%s - %s]", bundleName, className), ex);
+ }
+ }
+ return object;
+ }
+
+ public final class TraceHandler {
+ private String name;
+ private String id;
+ private ITraceUnitResourceLocator locator;
+ private ITraceParser parser;
+
+ private TraceHandler(String id, String name, ITraceUnitResourceLocator locator, ITraceParser parser) {
+ super();
+ this.name = name;
+ this.id = id;
+ this.locator = locator;
+ this.parser = parser;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return the locator
+ */
+ public ITraceUnitResourceLocator getLocator() {
+ return locator;
+ }
+
+ /**
+ * @return the parser
+ */
+ public ITraceParser getParser() {
+ return parser;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceabilityExtractor.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceabilityExtractor.java
new file mode 100644
index 00000000000..f370271f90e
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/TraceabilityExtractor.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.define.traceability;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.CharBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceabilityExtractor {
+ private static final Pattern ofpTraceabilityPattern = Pattern.compile("\\rs^SRS\\s*([^;\n\r]+);");
+ private static final Pattern scriptTraceabilityPattern =
+ Pattern.compile("addTraceability\\s*\\(\\s*\\\"\\s*(?:SubDD|SRS|CSID)?\\s*([^\\\"]+)\\\"");
+ private static final Pattern invalidTraceabilityPattern = Pattern.compile("(\\[[A-Za-z]|USES_).*");
+
+ private static final Pattern embeddedVolumePattern = Pattern.compile("\\{\\d+ (.*)\\}[ .]*");
+ private static final Pattern nonWordPattern = Pattern.compile("[^A-Z_0-9]");
+ private static final Pattern structuredReqNamePattern = Pattern.compile("\\[?(\\{[^\\}]+\\})(.*)");
+ private static final Pattern stripTrailingReqNamePatern = Pattern.compile("(\\}|\\])(.*)");
+
+ private static TraceabilityExtractor instance = null;
+ private final Matcher scriptReqTraceMatcher;
+ private final Matcher ofpReqTraceMatcher;
+ private final Matcher invalidTraceMatcher;
+ private final Matcher embeddedVolumeMatcher;
+ private final Matcher nonWordMatcher;
+ private final Matcher structuredRequirementMatcher;
+ private final Matcher stripTrailingReqNameMatcher;
+
+ private TraceabilityExtractor() {
+ this.ofpReqTraceMatcher = ofpTraceabilityPattern.matcher("");
+ this.scriptReqTraceMatcher = scriptTraceabilityPattern.matcher("");
+ this.invalidTraceMatcher = invalidTraceabilityPattern.matcher("");
+ this.embeddedVolumeMatcher = embeddedVolumePattern.matcher("");
+ this.nonWordMatcher = nonWordPattern.matcher("");
+ this.structuredRequirementMatcher = structuredReqNamePattern.matcher("");
+ this.stripTrailingReqNameMatcher = stripTrailingReqNamePatern.matcher("");
+ }
+
+ public static TraceabilityExtractor getInstance() {
+ if (instance == null) {
+ instance = new TraceabilityExtractor();
+ }
+ return instance;
+ }
+
+ public List<String> getTraceMarksFromFile(File sourceFile) throws IOException {
+ CharBuffer buffer = Lib.fileToCharBuffer(sourceFile);
+ Matcher matcher = isScriptFile(sourceFile) ? getScriptTraceMarkMatcher() : getCodeTraceMarkMatcher();
+ return getTraceMarks(buffer, matcher);
+ }
+
+ public List<String> getTraceMarks(CharBuffer buffer, Matcher matcher) {
+ List<String> toReturn = new ArrayList<String>();
+ matcher.reset(buffer);
+ while (matcher.find() != false) {
+ String mark = matcher.group(1);
+ if (Strings.isValid(mark) != false) {
+ toReturn.add(mark);
+ }
+ }
+ return toReturn;
+ }
+
+ public boolean isValidTraceMark(String toCheck) {
+ invalidTraceMatcher.reset(toCheck);
+ return invalidTraceMatcher.matches() != true;
+ }
+
+ public Matcher getScriptTraceMarkMatcher() {
+ return scriptReqTraceMatcher;
+ }
+
+ public Matcher getCodeTraceMarkMatcher() {
+ return ofpReqTraceMatcher;
+ }
+
+ public boolean isScriptFile(File sourceFile) {
+ return sourceFile.getName().endsWith("java");
+ }
+
+ public String getCanonicalRequirementName(String requirementMark) {
+ String canonicalReqReference = requirementMark;
+ if (Strings.isValid(requirementMark) != false) {
+ canonicalReqReference = requirementMark.toUpperCase();
+
+ embeddedVolumeMatcher.reset(canonicalReqReference);
+ if (embeddedVolumeMatcher.find()) {
+ canonicalReqReference = embeddedVolumeMatcher.group(1);
+ }
+
+ // Added to strip trailing artifact descriptive names } ... or ] ....
+ stripTrailingReqNameMatcher.reset(canonicalReqReference);
+ if (stripTrailingReqNameMatcher.find()) {
+ String trail = stripTrailingReqNameMatcher.group(2);
+ if (Strings.isValid(trail) && !trail.startsWith(".")) {
+ canonicalReqReference = canonicalReqReference.substring(0, stripTrailingReqNameMatcher.start(1) + 1);
+ }
+ }
+
+ nonWordMatcher.reset(canonicalReqReference);
+ canonicalReqReference = nonWordMatcher.replaceAll("");
+
+ }
+ return canonicalReqReference;
+ }
+
+ // [{SUBSCRIBER}.ID] and example procedure {CURSOR_ACKNOWLEDGE}.NORMAL
+ public Pair<String, String> getStructuredRequirement(String requirementMark) {
+ Pair<String, String> toReturn = null;
+ structuredRequirementMatcher.reset(requirementMark);
+ if (structuredRequirementMatcher.matches() != false) {
+ String primary = structuredRequirementMatcher.group(1);
+ String secondary = structuredRequirementMatcher.group(2);
+ if (Strings.isValid(primary) != false) {
+ toReturn = new Pair<String, String>(primary, secondary);
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitActionDelegate.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitActionDelegate.java
new file mode 100644
index 00000000000..3919cb74f72
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitActionDelegate.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.define.traceability.action;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+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.osee.define.traceability.jobs.FindTraceUnitJob;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FindTraceUnitActionDelegate implements IWorkbenchWindowActionDelegate {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+ */
+ @Override
+ public void init(IWorkbenchWindow window) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+ */
+ @Override
+ public void run(IAction action) {
+ final String jobName = "Resource To Trace Unit Artifact";
+ final List<IResource> resources = getSelectedItems();
+ Jobs.startJob(new FindTraceUnitJob(jobName, resources.toArray(new IResource[resources.size()])), true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+ */
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ private List<IResource> getSelectedItems() {
+ ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+ if (selection instanceof StructuredSelection) {
+ List<IResource> selectedItems =
+ Handlers.processSelectionObjects(IResource.class, (StructuredSelection) selection);
+ List<IResource> toReturn = new ArrayList<IResource>();
+ for (IResource resource : selectedItems) {
+ if (resource instanceof IFile) {
+ toReturn.add(resource);
+ }
+ }
+ return toReturn;
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitEditorAction.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitEditorAction.java
new file mode 100644
index 00000000000..b5da8bbd682
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/action/FindTraceUnitEditorAction.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.define.traceability.action;
+
+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.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.jobs.FindTraceUnitJob;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+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 FindTraceUnitEditorAction implements IEditorActionDelegate {
+
+ public void run(IAction action) {
+ 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(DefinePlugin.class, Level.INFO, "iFile *" + iFile + "*");
+ }
+ }
+ if (iFile == null) {
+ AWorkbench.popup("ERROR", "Can't retrieve IFile");
+ return;
+ }
+ Jobs.startJob(new FindTraceUnitJob("Resource To Trace Unit Artifact", iFile), true);
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/RemoveTraceMarksFromTraceUnits.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/RemoveTraceMarksFromTraceUnits.java
new file mode 100644
index 00000000000..2ac366cd081
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/RemoveTraceMarksFromTraceUnits.java
@@ -0,0 +1,368 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.blam;
+
+import java.io.File;
+import java.net.URI;
+import java.nio.CharBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+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.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.ITraceParser;
+import org.eclipse.osee.define.traceability.ITraceUnitResourceLocator;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager.TraceHandler;
+import org.eclipse.osee.define.utility.IResourceHandler;
+import org.eclipse.osee.define.utility.UriResourceContentFinder;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+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.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorProvider;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.ResultsEditorHtmlTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.IResultsXViewerRow;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsEditorTableTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsXViewerRow;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RemoveTraceMarksFromTraceUnits extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Remove Trace Marks from Resource";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getCategories()
+ */
+ @Override
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Trace");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Removes trace marks from files selected.\n*** WARNING_OVERLAY: When \"Persist Changes\" is selected, files will be modified in place.\n There is no way to undo this operation - make sure you know what you are doing. ***\n ";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getXWidgetsXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select File Or Folder (file can have a list of folders separated by newlines)\"/>");
+ builder.append("<XWidget xwidgetType=\"XFileSelectionDialog\" displayName=\"Select File\" />");
+ builder.append("<XWidget xwidgetType=\"XDirectorySelectionDialog\" displayName=\"Select Folder\" />");
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select Trace Types:\"/>");
+ for (TraceHandler handler : getTraceHandlers()) {
+ builder.append(getOperationsCheckBoxes(handler.getName()));
+ }
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Persist Changes\" labelAfter=\"true\" horizontalLabel=\"true\" />");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Include Sub-Folders\" labelAfter=\"true\" horizontalLabel=\"true\" />");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"File With Embedded Paths\" labelAfter=\"true\" horizontalLabel=\"true\" />");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private TraceHandler getCheckedTraceHandler(VariableMap variableMap) throws OseeArgumentException {
+ List<TraceHandler> toReturn = new ArrayList<TraceHandler>();
+ for (TraceHandler handler : getTraceHandlers()) {
+ if (variableMap.getBoolean(handler.getName())) {
+ toReturn.add(handler);
+ }
+ }
+ if (toReturn.isEmpty()) {
+ throw new OseeArgumentException("Please select a trace type");
+ } else if (toReturn.size() > 1) {
+ throw new OseeArgumentException("Only (1) trace type can be selected per run. Please de-select other types.");
+ }
+ return toReturn.get(0);
+ }
+
+ private void checkPath(String filePath, String type) throws OseeArgumentException {
+ if (!Strings.isValid(filePath)) {
+ throw new OseeArgumentException(String.format("Please enter a valid %s path", type));
+ }
+ File file = new File(filePath);
+ if (file == null || !file.exists()) {
+ throw new OseeArgumentException(String.format("%s path [%s] is not accessible", type, filePath));
+ }
+ }
+
+ private URI getSourceURI(VariableMap variableMap) throws OseeArgumentException {
+ String filePath = variableMap.getString("Select File");
+ String folderPath = variableMap.getString("Select Folder");
+
+ String pathToUse = null;
+ if (Strings.isValid(folderPath) && Strings.isValid(filePath)) {
+ throw new OseeArgumentException("Enter file or folder but not both");
+ } else if (Strings.isValid(folderPath)) {
+ checkPath(folderPath, "folder");
+ pathToUse = folderPath;
+ } else {
+ checkPath(filePath, "file");
+ pathToUse = filePath;
+ }
+ return new File(pathToUse).toURI();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ try {
+ final URI source = getSourceURI(variableMap);
+ final TraceHandler handler = getCheckedTraceHandler(variableMap);
+ final boolean isInPlaceStorageAllowed = variableMap.getBoolean("Persist Changes");
+ final boolean isRecursionAllowed = variableMap.getBoolean("Include Sub-Folders");
+ final boolean isFileWithMultiplePaths = variableMap.getBoolean("File With Embedded Paths");
+
+ final int TOTAL_WORK = Integer.MAX_VALUE;
+ monitor.beginTask(getName(), TOTAL_WORK);
+
+ final MutableBoolean isProcessingAllowed = new MutableBoolean(false);
+ Job job = new UIJob(getName()) {
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ isProcessingAllowed.setValue(isInPlaceStorageAllowed ? MessageDialog.openConfirm(new Shell(), getName(),
+ "Are you sure you want to remove trace marks from files?") : true);
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job, true);
+ job.join();
+
+ if (isProcessingAllowed.getValue()) {
+ ITraceUnitResourceLocator locator = handler.getLocator();
+ ITraceParser parser = handler.getParser();
+
+ ReportCreator reportCreator = new ReportCreator(monitor);
+ UriResourceContentFinder resourceFinder =
+ new UriResourceContentFinder(source, isRecursionAllowed, isFileWithMultiplePaths);
+ resourceFinder.addLocator(locator,
+ new TraceRemover(isInPlaceStorageAllowed, locator, parser, reportCreator));
+
+ SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, TOTAL_WORK);
+ resourceFinder.execute(subMonitor);
+
+ reportCreator.openReport();
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private String getOperationsCheckBoxes(String value) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"");
+ builder.append(value);
+ builder.append("\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ return builder.toString();
+ }
+
+ private List<TraceHandler> getTraceHandlers() {
+ List<TraceHandler> handlers = new ArrayList<TraceHandler>();
+ try {
+ for (TraceHandler handler : TraceUnitExtensionManager.getInstance().getAllTraceHandlers()) {
+ if (handler.getParser().isTraceRemovalAllowed()) {
+ handlers.add(handler);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ return handlers;
+ }
+
+ private final class TraceRemover implements IResourceHandler {
+ private final ITraceParser traceParser;
+ private final ITraceUnitResourceLocator traceUnitLocator;
+ private final boolean isStorageAllowed;
+ private final ReportCreator reportCreator;
+
+ public TraceRemover(boolean isStorageAllowed, ITraceUnitResourceLocator traceUnitLocator, ITraceParser traceParser, ReportCreator reportCreator) {
+ this.isStorageAllowed = isStorageAllowed;
+ this.traceParser = traceParser;
+ this.traceUnitLocator = traceUnitLocator;
+ this.reportCreator = reportCreator;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.utility.IResourceHandler#onResourceFound(java.net.URI, java.lang.String, java.nio.CharBuffer)
+ */
+ @Override
+ public void onResourceFound(URI uriPath, String name, CharBuffer fileBuffer) {
+ String traceUnitType = traceUnitLocator.getTraceUnitType(name, fileBuffer);
+ if (Strings.isValid(traceUnitType) && !traceUnitType.equalsIgnoreCase(ITraceUnitResourceLocator.UNIT_TYPE_UNKNOWN)) {
+ if (traceParser.isTraceRemovalAllowed()) {
+ CharBuffer modifiedBuffer = traceParser.removeTraceMarks(fileBuffer);
+ if (modifiedBuffer != null) {
+ reportCreator.addModifiedItem(name, fileBuffer, modifiedBuffer);
+ if (isStorageAllowed) {
+ try {
+ Lib.writeCharBufferToFile(modifiedBuffer, new File(uriPath));
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } else {
+ reportCreator.addNoChangeItem(name);
+ }
+ }
+ }
+ }
+ }
+
+ private final class ReportCreator {
+ private List<IResultsXViewerRow> modifiedRows;
+ private List<IResultsXViewerRow> noChangeRows;
+ private final IProgressMonitor monitor;
+
+ public ReportCreator(IProgressMonitor monitor) {
+ this.modifiedRows = null;
+ this.noChangeRows = null;
+ this.monitor = monitor;
+ }
+
+ public void addModifiedItem(String name, CharBuffer original, CharBuffer modified) {
+ if (modifiedRows == null) {
+ modifiedRows = new ArrayList<IResultsXViewerRow>();
+ }
+ String delta = getDelta(original, modified);
+ String[] entries = delta.split("(\\n|;)");
+ for (String diff : entries) {
+ diff = diff.trim();
+ if (Strings.isValid(diff)) {
+ modifiedRows.add(new ResultsXViewerRow(new String[] {name, diff}));
+ }
+ }
+ }
+
+ private String getDelta(CharBuffer original, CharBuffer modified) {
+ StringBuilder buffer = new StringBuilder();
+ int originalLength = original.length();
+ int modifiedLength = modified.length();
+
+ int origIndex = 0;
+ int modIndex = 0;
+ while (origIndex < originalLength || modIndex < modifiedLength) {
+ char origChar = original.get(origIndex);
+ char modChar = modified.get(modIndex);
+ if (origChar != modChar) {
+ buffer.append(origChar);
+ if (originalLength > modifiedLength) {
+ origIndex++;
+ } else {
+ modIndex++;
+ }
+ } else {
+ origIndex++;
+ modIndex++;
+ }
+ if (monitor.isCanceled()) {
+ break;
+ }
+ }
+ return buffer.toString();
+ }
+
+ public void addNoChangeItem(String... name) {
+ if (noChangeRows == null) {
+ noChangeRows = new ArrayList<IResultsXViewerRow>();
+ }
+ noChangeRows.add(new ResultsXViewerRow(name));
+ }
+
+ private List<XViewerColumn> getNoChangeHeaders() {
+ return createColumnHelper("Trace Unit Without Change");
+ }
+
+ private List<XViewerColumn> getModifiedHeaders() {
+ return createColumnHelper("Modified Trace Unit", "Removed");
+ }
+
+ private List<XViewerColumn> createColumnHelper(String... headers) {
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>();
+ for (String name : headers) {
+ columns.add(new XViewerColumn(name, name, 80, SWT.LEFT, true, SortDataType.String, false, ""));
+ }
+ return columns;
+ }
+
+ public void openReport() {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ ResultsEditor.open(new IResultsEditorProvider() {
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return getName();
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ List<IResultsEditorTab> resultsTabs = new ArrayList<IResultsEditorTab>();
+ if (modifiedRows != null && !modifiedRows.isEmpty()) {
+ resultsTabs.add(new ResultsEditorTableTab("Modified Trace Units", getModifiedHeaders(),
+ modifiedRows));
+ }
+ if (noChangeRows != null && !noChangeRows.isEmpty()) {
+ resultsTabs.add(new ResultsEditorTableTab("Unmodified Items", getNoChangeHeaders(),
+ noChangeRows));
+ }
+ if (resultsTabs.isEmpty()) {
+ resultsTabs.add(new ResultsEditorHtmlTab(getName(), getName(), "No changes Reported"));
+ }
+ return resultsTabs;
+ }
+ });
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.runInJob(getName(), runnable, DefinePlugin.class, DefinePlugin.PLUGIN_ID);
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/TraceReportBlam.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/TraceReportBlam.java
new file mode 100644
index 00000000000..900790957c5
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/TraceReportBlam.java
@@ -0,0 +1,524 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.blam;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+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.core.runtime.SubProgressMonitor;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.data.BaseTraceDataCache;
+import org.eclipse.osee.define.traceability.data.CodeUnitData;
+import org.eclipse.osee.define.traceability.data.RequirementData;
+import org.eclipse.osee.define.traceability.data.TestUnitData;
+import org.eclipse.osee.define.traceability.report.AbstractArtifactRelationReport;
+import org.eclipse.osee.define.traceability.report.ArtifactToRelatedArtifact;
+import org.eclipse.osee.define.traceability.report.ArtifactTraceCount;
+import org.eclipse.osee.define.traceability.report.ArtifactsWithoutRelations;
+import org.eclipse.osee.define.traceability.report.IReportDataCollector;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorProvider;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.ResultsEditorHtmlTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.IResultsXViewerRow;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsEditorTableTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsXViewerRow;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceReportBlam extends AbstractBlam {
+ private List<IResultsEditorTab> resultsTabs;
+
+ public TraceReportBlam() {
+ this.resultsTabs = new ArrayList<IResultsEditorTab>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Trace Report";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getCategories()
+ */
+ @Override
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Trace");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Generates a trace report by scanning the selected branch for the selected trace unit types.";
+ }
+
+ private String getOperationsCheckBoxes(String value) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"");
+ builder.append(value);
+ builder.append("\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ return builder.toString();
+ }
+
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ // builder.append("<XWidget xwidgetType=\"XFileSelectionDialog\" displayName=\"Select UI List File\" />");
+ builder.append("<XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Requirements Branch\" />");
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select Trace Types:\"/>");
+ for (TraceTypeEnum traceType : TraceTypeEnum.values()) {
+ builder.append(getOperationsCheckBoxes(traceType.asLabel()));
+ }
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select Report Output:\"/>");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Result Editor\" labelAfter=\"true\" horizontalLabel=\"true\" />");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Excel\" labelAfter=\"true\" horizontalLabel=\"true\" />");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ // private String getUIsFilterFromFile(IProgressMonitor monitor, String filePath) throws Exception {
+ // String input;
+ // File file = new File(filePath);
+ // if (file == null || !file.exists()) {
+ // throw new OseeArgumentException("UI list file not accessible");
+ // }
+ // IFileStore fileStore = EFS.getStore(file.toURI());
+ // InputStream inputStream = null;
+ // try {
+ // inputStream = new BufferedInputStream(fileStore.openInputStream(EFS.NONE, monitor));
+ // input = Lib.inputStreamToString(inputStream);
+ // } finally {
+ // if (inputStream != null) {
+ // inputStream.close();
+ // }
+ // }
+ // return input;
+ // }
+
+ private List<TraceTypeEnum> getCheckedTraceItems(VariableMap variableMap) throws OseeArgumentException {
+ List<TraceTypeEnum> toReturn = new ArrayList<TraceTypeEnum>();
+ for (TraceTypeEnum traceType : TraceTypeEnum.values()) {
+ if (variableMap.getBoolean(traceType.asLabel())) {
+ toReturn.add(traceType);
+ }
+ }
+ return toReturn;
+ }
+
+ public boolean isTestSupportNeeded(List<TraceTypeEnum> traceTypes) {
+ return traceTypes.contains(TraceTypeEnum.Used_By_Test_Unit_Trace);
+ }
+
+ public boolean isTestCaseNeeded(List<TraceTypeEnum> traceTypes) {
+ return traceTypes.contains(TraceTypeEnum.Verified_By_Test_Unit_Trace);
+ }
+
+ public boolean isCodeUnitNeeded(List<TraceTypeEnum> traceTypes) {
+ return traceTypes.contains(TraceTypeEnum.Code_Unit_Trace);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+
+ // String fileName = variableMap.getString("Select UI List File");
+ Branch branch = variableMap.getBranch("Requirements Branch");
+ if (branch == null) {
+ throw new OseeArgumentException("Branch cannot be null");
+ }
+ List<TraceTypeEnum> traceTypes = getCheckedTraceItems(variableMap);
+ if (traceTypes.isEmpty()) {
+ throw new OseeArgumentException("Please select a trace type");
+ }
+ boolean isExcelOutput = variableMap.getBoolean("Excel");
+ boolean isResultEditorOutput = variableMap.getBoolean("Result Editor");
+ OutputType output = OutputType.asType(isExcelOutput, isResultEditorOutput);
+ if (output == null) {
+ throw new OseeArgumentException("Please select a report output type");
+ }
+ ISheetWriter writer = null;
+ CharBackedInputStream excelInputStream = null;
+ Map<String, AbstractArtifactRelationReport> reports = new LinkedHashMap<String, AbstractArtifactRelationReport>();
+ List<BaseTraceDataCache> traceCache = new ArrayList<BaseTraceDataCache>();
+ RequirementData reqData = new RequirementData(branch);
+ CodeUnitData codeUnit = null;
+ TestUnitData testUnit = null;
+ try {
+ int TOTAL_WORK = Integer.MAX_VALUE;
+ int TASK_WORK = TOTAL_WORK / 5;
+ monitor.beginTask("Generate Trace Report", TOTAL_WORK);
+
+ SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, TASK_WORK);
+ reqData.initialize(subMonitor);
+ traceCache.add(reqData);
+
+ subMonitor = new SubProgressMonitor(monitor, TASK_WORK);
+ if (isCodeUnitNeeded(traceTypes)) {
+ codeUnit = new CodeUnitData(branch);
+ codeUnit.initialize(subMonitor);
+ traceCache.add(codeUnit);
+ } else {
+ subMonitor.done();
+ }
+
+ subMonitor = new SubProgressMonitor(monitor, TASK_WORK);
+ if (isTestCaseNeeded(traceTypes) || isTestSupportNeeded(traceTypes)) {
+ testUnit = new TestUnitData(branch);
+ testUnit.initialize(subMonitor);
+ traceCache.add(testUnit);
+ } else {
+ subMonitor.done();
+ }
+
+ if (!monitor.isCanceled()) {
+ if (isExcelOutput(output)) {
+ excelInputStream = new CharBackedInputStream();
+ writer = new ExcelXmlWriter(excelInputStream.getWriter());
+ }
+ buildReport(reports, "Trace Unit <-> Requirement", output, writer, getTraceUnitToReqReport(codeUnit,
+ testUnit, traceTypes));
+ buildReport(reports, "Trace Unit with No Valid Traceability", output, writer,
+ getDisconnectedTraceUnitReport(codeUnit, testUnit, traceTypes));
+ buildReport(reports, "Requirement Trace Counts", output, writer, getTraceCountReport(reqData, traceTypes));
+
+ subMonitor = new SubProgressMonitor(monitor, TASK_WORK);
+ executeReports(subMonitor, reports);
+ }
+ subMonitor = new SubProgressMonitor(monitor, TASK_WORK);
+ displayReports(subMonitor, writer, excelInputStream);
+ } finally {
+ try {
+ for (AbstractArtifactRelationReport report : reports.values()) {
+ report.clear();
+ }
+ for (BaseTraceDataCache cache : traceCache) {
+ cache.reset();
+ }
+ reports.clear();
+ traceCache.clear();
+
+ resultsTabs.clear();
+ } finally {
+ monitor.done();
+ }
+ }
+ }
+
+ private void executeReports(IProgressMonitor monitor, Map<String, AbstractArtifactRelationReport> reports) throws OseeCoreException {
+ try {
+ monitor.beginTask("Create Reports", reports.size());
+ for (String key : reports.keySet()) {
+ monitor.subTask(String.format("Creating [%s]", key));
+ if (monitor.isCanceled()) break;
+ AbstractArtifactRelationReport report = reports.get(key);
+ report.process(monitor);
+ report.clear();
+ monitor.worked(1);
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private void displayReports(IProgressMonitor monitor, ISheetWriter writer, InputStream inputStream) throws IOException, OseeCoreException {
+ try {
+ boolean wasEmpty = resultsTabs.isEmpty();
+ monitor.beginTask("Open Reports", !wasEmpty ? (inputStream != null ? 2 : 1) : 1);
+ if (wasEmpty) {
+ resultsTabs.add(new ResultsEditorHtmlTab(getName(), getName(), "Nothing Reported"));
+ }
+ if (inputStream != null && writer != null) {
+ writer.endWorkbook();
+ openExcel(inputStream);
+ monitor.worked(1);
+ }
+ openReport(resultsTabs);
+ monitor.worked(1);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private boolean isExcelOutput(OutputType output) {
+ return output == OutputType.Excel || output == OutputType.Both;
+ }
+
+ private boolean isEditorOutput(OutputType output) {
+ return output == OutputType.ResultsEditor || output == OutputType.Both;
+ }
+
+ private void buildReport(Map<String, AbstractArtifactRelationReport> reports, String title, OutputType output, ISheetWriter writer, AbstractArtifactRelationReport report) {
+ if (isExcelOutput(output)) {
+ report.addReportDataCollector(new ExcelReport(title, writer));
+ }
+ if (isEditorOutput(output)) {
+ report.addReportDataCollector(new ResultEditorReport(title));
+ }
+ reports.put(title, report);
+ }
+
+ private void openExcel(final InputStream inputStream) throws OseeCoreException {
+ IFile iFile = OseeData.getIFile("Trace_Report_" + Lib.getDateTimeString() + ".xml");
+ AIFile.writeToFile(iFile, inputStream);
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ // Do Nothing
+ }
+ }
+ Program.launch(iFile.getLocation().toOSString());
+ }
+
+ private void openReport(final List<IResultsEditorTab> resultsTabs) {
+ final List<IResultsEditorTab> results = new ArrayList<IResultsEditorTab>(resultsTabs);
+ if (!results.isEmpty()) {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ ResultsEditor.open(new IResultsEditorProvider() {
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return getName();
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ return results;
+ }
+ });
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.runInJob(getName(), runnable, DefinePlugin.class, DefinePlugin.PLUGIN_ID);
+ }
+ }
+
+ private void addRelationToCheck(List<TraceTypeEnum> traceTypes, AbstractArtifactRelationReport report, boolean fromTraceUnit) {
+ for (TraceTypeEnum traceTypeEnum : traceTypes) {
+ IRelationEnumeration relation =
+ fromTraceUnit ? traceTypeEnum.getRelatedToRequirement() : traceTypeEnum.getRelatedToTraceUnit();
+ report.addRelationToCheck(relation);
+ }
+ }
+
+ private void addArtifacts(CodeUnitData codeUnit, TestUnitData testUnit, List<TraceTypeEnum> traceTypes, AbstractArtifactRelationReport report) {
+ if (isCodeUnitNeeded(traceTypes)) {
+ report.setArtifacts(codeUnit.getAllCodeUnits());
+ }
+ if (isTestCaseNeeded(traceTypes)) {
+ report.setArtifacts(testUnit.getTestCases());
+ }
+ if (isTestSupportNeeded(traceTypes)) {
+ report.setArtifacts(testUnit.getTestSupportItems());
+ }
+ }
+
+ private AbstractArtifactRelationReport getTraceCountReport(RequirementData reqData, List<TraceTypeEnum> traceTypes) {
+ ArtifactTraceCount report = new ArtifactTraceCount();
+ report.setArtifacts(reqData.getDirectSwRequirements());
+ addRelationToCheck(traceTypes, report, false);
+ return report;
+ }
+
+ private AbstractArtifactRelationReport getDisconnectedTraceUnitReport(CodeUnitData codeUnit, TestUnitData testUnit, List<TraceTypeEnum> traceTypes) {
+ ArtifactsWithoutRelations report = new ArtifactsWithoutRelations();
+ addArtifacts(codeUnit, testUnit, traceTypes, report);
+ addRelationToCheck(traceTypes, report, true);
+ return report;
+ }
+
+ private AbstractArtifactRelationReport getTraceUnitToReqReport(CodeUnitData codeUnit, TestUnitData testUnit, List<TraceTypeEnum> traceTypes) {
+ ArtifactToRelatedArtifact report = new ArtifactToRelatedArtifact();
+ addArtifacts(codeUnit, testUnit, traceTypes, report);
+ addRelationToCheck(traceTypes, report, true);
+ return report;
+ }
+
+ private enum OutputType {
+ ResultsEditor, Excel, Both;
+
+ public static OutputType asType(boolean isExcel, boolean isEditor) {
+ if (isExcel && isEditor) {
+ return OutputType.Both;
+ } else if (isExcel) {
+ return OutputType.Excel;
+ } else if (isEditor) {
+ return OutputType.ResultsEditor;
+ }
+ return null;
+ }
+ }
+
+ private enum TraceTypeEnum {
+ Code_Unit_Trace(CoreRelationEnumeration.CodeRequirement_Requirement, CoreRelationEnumeration.CodeRequirement_CodeUnit),
+ Verified_By_Test_Unit_Trace(CoreRelationEnumeration.Verification__Requirement, CoreRelationEnumeration.Verification__Verifier),
+ Used_By_Test_Unit_Trace(CoreRelationEnumeration.Uses__Requirement, CoreRelationEnumeration.Uses__TestUnit);
+
+ private IRelationEnumeration toReq;
+ private IRelationEnumeration toTraceUnit;
+
+ TraceTypeEnum(IRelationEnumeration toReq, IRelationEnumeration toTraceUnit) {
+ this.toReq = toReq;
+ this.toTraceUnit = toTraceUnit;
+ }
+
+ public IRelationEnumeration getRelatedToRequirement() {
+ return toReq;
+ }
+
+ public IRelationEnumeration getRelatedToTraceUnit() {
+ return toTraceUnit;
+ }
+
+ public String asLabel() {
+ return name().replaceAll("_", " ");
+ }
+
+ public static TraceTypeEnum fromLabel(String label) {
+ label = label.replaceAll(" ", "_");
+ for (TraceTypeEnum traceType : TraceTypeEnum.values()) {
+ if (traceType.name().equalsIgnoreCase(label)) {
+ return traceType;
+ }
+ }
+ return null;
+ }
+ }
+
+ private final class ExcelReport implements IReportDataCollector {
+ private final String title;
+ private final ISheetWriter sheetWriter;
+
+ public ExcelReport(String title, ISheetWriter sheetWriter) {
+ this.sheetWriter = sheetWriter;
+ this.title = title;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.IReportDataCollector#addRow(java.lang.String[])
+ */
+ @Override
+ public void addRow(String... data) {
+ try {
+ sheetWriter.writeRow(data);
+ } catch (IOException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.IReportDataCollector#addTableHeader(java.lang.String[])
+ */
+ @Override
+ public void addTableHeader(String... header) {
+ try {
+ sheetWriter.startSheet(title, header.length);
+ sheetWriter.writeRow(header);
+ } catch (IOException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.IReportDataCollector#endTable()
+ */
+ @Override
+ public void endTable() {
+ try {
+ sheetWriter.endSheet();
+ } catch (IOException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private final class ResultEditorReport implements IReportDataCollector {
+ private final String title;
+ private List<XViewerColumn> columns;
+ private List<IResultsXViewerRow> rows;
+
+ public ResultEditorReport(String title) {
+ this.title = title;
+ this.columns = null;
+ this.rows = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.IReportDataCollector#addRow(java.lang.String[])
+ */
+ @Override
+ public void addRow(String... data) {
+ if (rows == null) {
+ rows = new ArrayList<IResultsXViewerRow>();
+ }
+ rows.add(new ResultsXViewerRow(data));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.IReportDataCollector#addTableHeader(java.lang.String[])
+ */
+ @Override
+ public void addTableHeader(String... header) {
+ this.columns = new ArrayList<XViewerColumn>();
+ for (String name : header) {
+ columns.add(new XViewerColumn(name, name, 80, SWT.LEFT, true, SortDataType.String, false, ""));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.IReportDataCollector#endTable()
+ */
+ @Override
+ public void endTable() {
+ resultsTabs.add(new ResultsEditorTableTab(title, columns, rows));
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/UiToTestBlam.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/UiToTestBlam.java
new file mode 100644
index 00000000000..98c16adda5c
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/blam/UiToTestBlam.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.blam;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.define.traceability.data.RequirementData;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UiToTestBlam extends AbstractBlam {
+ private static final String EMPTY_STRING = "";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "UI To Test Report";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getCategories()
+ */
+ @Override
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define.Trace");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Usage Info here";
+ }
+
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XFileSelectionDialog\" displayName=\"Select UI List File\" />");
+ builder.append("<XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Requirements Branch\" />");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ String fileName = variableMap.getString("Select UI List File");
+ Branch branch = variableMap.getBranch("Requirements Branch");
+
+ if (branch == null) {
+ throw new OseeArgumentException("Branch cannot be null");
+ }
+
+ XResultData resultData = new XResultData();
+ resultData.log("UI To Test Traceability");
+
+ Set<Artifact> toTrace = new HashSet<Artifact>();
+ String input = null;
+
+ monitor.beginTask("UI To Test Trace Report", IProgressMonitor.UNKNOWN);
+ try {
+ monitor.subTask("Gathering Requirements");
+ if (Strings.isValid(fileName)) {
+ input = getUIsFromFile(monitor, fileName);
+ }
+
+ if (Strings.isValid(input)) {
+ for (String ui : input.split("\n")) {
+ String toGet = ui.trim();
+ toTrace.addAll(ArtifactQuery.getArtifactsFromName(toGet, branch, false));
+ }
+ } else {
+ RequirementData requirements = new RequirementData(branch);
+ requirements.initialize(monitor);
+ toTrace.addAll(requirements.getAllSwRequirements());
+ }
+
+ StringWriter appendable = new StringWriter();
+
+ monitor.subTask("Gathering Test Unit Trace");
+
+ if (toTrace.isEmpty()) {
+ addRow(appendable, "No Requirements found");
+ } else {
+ addRow(appendable, String.format("[%s] Requirements Found", toTrace.size()));
+
+ List<String> headers = new ArrayList<String>();
+ for (Column column : Column.values()) {
+ headers.add(column.name());
+ }
+ addRow(appendable, headers.toArray(new String[headers.size()]));
+ for (Artifact requirement : toTrace) {
+ processTrace(appendable, requirement, "Verified By", CoreRelationEnumeration.Verification__Verifier);
+ processTrace(appendable, requirement, "Used By", CoreRelationEnumeration.Uses__TestUnit);
+ }
+ }
+
+ if (appendable.getBuffer().length() > 0) {
+ String outFileName = "UI_To_TestUnit." + Lib.getDateTimeString() + ".csv";
+ IFile iFile = OseeData.getIFile(outFileName);
+ AIFile.writeToFile(iFile, appendable.toString());
+ Program.launch(iFile.getLocation().toOSString());
+ }
+ } finally {
+ monitor.subTask("Done");
+ System.gc();
+ }
+ }
+
+ private void addRow(Appendable appendable, String... data) throws OseeCoreException {
+ if (data != null && data.length > 0) {
+ try {
+ for (int index = 0; index < data.length; index++) {
+ appendable.append("\"");
+ appendable.append(data[index]);
+ appendable.append("\"");
+ if (index + 1 < data.length) {
+ appendable.append(",");
+ }
+ }
+ appendable.append("\n");
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+
+ private String getUIsFromFile(IProgressMonitor monitor, String filePath) throws Exception {
+ String input;
+ File file = new File(filePath);
+ if (file == null || !file.exists()) {
+ throw new OseeArgumentException("UI list file not accessible");
+ }
+ IFileStore fileStore = EFS.getStore(file.toURI());
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(fileStore.openInputStream(EFS.NONE, monitor));
+ input = Lib.inputStreamToString(inputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ return input;
+ }
+
+ private String[] asArray(String... data) {
+ String[] toReturn = new String[Column.values().length];
+ if (data != null && data.length > 0) {
+ for (int index = 0; index < toReturn.length; index++) {
+ if (data.length > index) {
+ toReturn[index] = data[index];
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private void processTrace(Appendable appendable, Artifact requirement, String testType, IRelationEnumeration relationType) throws OseeCoreException {
+ String uiTitle = requirement.getDescriptiveName();
+ String uiType = requirement.getArtifactTypeName();
+
+ List<Artifact> testUnits = requirement.getRelatedArtifacts(relationType);
+ if (testUnits.isEmpty()) {
+ addRow(appendable, asArray(uiTitle, uiType, "NONE", "NONE", EMPTY_STRING, EMPTY_STRING, EMPTY_STRING,
+ EMPTY_STRING));
+ } else {
+ for (Artifact testUnit : testUnits) {
+ String testUnitName = testUnit.getDescriptiveName();
+ String testUnitType = testUnit.getArtifactTypeName();
+ List<String> verified = getTrace(testUnit, CoreRelationEnumeration.Verification__Requirement);
+ List<String> used = getTrace(testUnit, CoreRelationEnumeration.Uses__Requirement);
+ String verifyStr = StringFormat.listToValueSeparatedString(verified, ",\r\n");
+ String usesStr = StringFormat.listToValueSeparatedString(used, ",\r\n");
+
+ addRow(appendable, asArray(uiTitle, uiType, testType, testUnitName, testUnitType, verifyStr, usesStr,
+ EMPTY_STRING));
+ }
+ }
+ }
+
+ private List<String> getTrace(Artifact testUnit, IRelationEnumeration relation) throws OseeCoreException {
+ List<String> toReturn = new ArrayList<String>();
+ for (Artifact item : testUnit.getRelatedArtifacts(relation)) {
+ toReturn.add(item.getDescriptiveName());
+ }
+ if (toReturn.isEmpty()) {
+ toReturn.add("NONE");
+ }
+ return toReturn;
+ }
+
+ private enum Column {
+ UI_Title,
+ Requirement_Type,
+ Relates_To_Test_Unit,
+ Test_Unit_Name,
+ Test_Unit_Type,
+ Relates_To_Requirements,
+ UI_Name,
+ UI_Type;
+
+ public String asLabel() {
+ return this.name().replaceAll("_", " ");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/BaseTraceDataCache.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/BaseTraceDataCache.java
new file mode 100644
index 00000000000..fde52272eb9
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/BaseTraceDataCache.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.define.traceability.data;
+
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseTraceDataCache {
+
+ private boolean isInitialized;
+ private final Branch branch;
+ private final String traceType;
+
+ public BaseTraceDataCache(String traceType, Branch branch) {
+ isInitialized = false;
+ this.traceType = traceType;
+ this.branch = branch;
+ }
+
+ public boolean isInitialized() {
+ return isInitialized;
+ }
+
+ public Branch getBranch() {
+ return branch;
+ }
+
+ public final IStatus initialize(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ try {
+ reset();
+ monitor.subTask(String.format("Loading %s from: [%s]", traceType, getBranch().getBranchShortName()));
+
+ doBulkLoad(monitor);
+
+ if (monitor.isCanceled() != true) {
+ toReturn = Status.OK_STATUS;
+ }
+ isInitialized = true;
+ } catch (Exception ex) {
+ toReturn = new Status(IStatus.ERROR, DefinePlugin.PLUGIN_ID, String.format("Loading %s ", traceType), ex);
+ }
+ return toReturn;
+ }
+
+ protected abstract void doBulkLoad(IProgressMonitor monitor) throws Exception;
+
+ protected void populateTraceMap(IProgressMonitor monitor, List<Artifact> artList, Map<String, Artifact> toPopulate) {
+ for (Artifact artifact : artList) {
+ toPopulate.put(asTraceMapKey(artifact), artifact);
+ }
+ }
+
+ protected String asTraceMapKey(Artifact artifact) {
+ return artifact.getDescriptiveName();
+ }
+
+ public void reset() {
+ isInitialized = false;
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/CodeUnitData.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/CodeUnitData.java
new file mode 100644
index 00000000000..0f6e0efb3b7
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/CodeUnitData.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.define.traceability.data;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CodeUnitData extends BaseTraceDataCache {
+
+ private final Map<String, Artifact> codeUnitMap;
+
+ public CodeUnitData(Branch branch) {
+ super("Code Unit Data", branch);
+ this.codeUnitMap = new HashMap<String, Artifact>();
+ }
+
+ protected void doBulkLoad(IProgressMonitor monitor) throws Exception {
+ List<Artifact> codeUnits = ArtifactQuery.getArtifactsFromType(Requirements.CODE_UNIT, getBranch());
+ populateTraceMap(monitor, codeUnits, codeUnitMap);
+ monitor.worked(30);
+ }
+
+ public void reset() {
+ super.reset();
+ codeUnitMap.clear();
+ }
+
+ public Collection<Artifact> getAllCodeUnits() {
+ return codeUnitMap.values();
+ }
+
+ public Artifact getCodeUnitByName(String codeUnitName) {
+ return codeUnitMap.get(codeUnitName);
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/RequirementData.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/RequirementData.java
new file mode 100644
index 00000000000..6fd4c917dec
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/RequirementData.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.define.traceability.data;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.define.traceability.TraceabilityExtractor;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RequirementData extends BaseTraceDataCache {
+ private static final TraceabilityExtractor traceExtractor = TraceabilityExtractor.getInstance();
+
+ private final List<Artifact> directSwRequirements;
+ private final List<Artifact> inDirectSwRequirements;
+ private final Set<Artifact> allSwRequirements;
+ private final HashMap<String, Artifact> directMap;
+ private final HashMap<String, Artifact> indirectMap;
+
+ public RequirementData(Branch branch) {
+ super("Software Requirements Data", branch);
+ this.directMap = new HashMap<String, Artifact>();
+ this.indirectMap = new HashMap<String, Artifact>();
+ this.directSwRequirements = new ArrayList<Artifact>();
+ this.inDirectSwRequirements = new ArrayList<Artifact>();
+ this.allSwRequirements = new TreeSet<Artifact>();
+ }
+
+ public void reset() {
+ super.reset();
+ this.directMap.clear();
+ this.indirectMap.clear();
+ this.directSwRequirements.clear();
+ this.inDirectSwRequirements.clear();
+ this.allSwRequirements.clear();
+ }
+
+ protected void doBulkLoad(IProgressMonitor monitor) throws Exception {
+ directSwRequirements.addAll(ArtifactQuery.getArtifactsFromTypes(Requirements.DIRECT_SOFTWARE_REQUIREMENT_TYPES,
+ getBranch(), false));
+ populateTraceMap(monitor, directSwRequirements, directMap);
+ monitor.worked(30);
+
+ if (!monitor.isCanceled()) {
+ monitor.subTask(String.format("Load Indirect Software Requirements from: [%s]",
+ getBranch().getBranchShortName()));
+ inDirectSwRequirements.addAll(ArtifactQuery.getArtifactsFromType(Requirements.INDIRECT_SOFTWARE_REQUIREMENT,
+ getBranch()));
+ populateTraceMap(monitor, inDirectSwRequirements, indirectMap);
+ monitor.worked(7);
+
+ if (!monitor.isCanceled()) {
+ allSwRequirements.addAll(directSwRequirements);
+ allSwRequirements.addAll(inDirectSwRequirements);
+ monitor.worked(1);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.data.BaseTraceDataCache#asTraceMapKey(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ protected String asTraceMapKey(Artifact artifact) {
+ return traceExtractor.getCanonicalRequirementName(artifact.getDescriptiveName());
+ }
+
+ /**
+ * @return the directSwRequirements
+ */
+ public Collection<Artifact> getDirectSwRequirements() {
+ return directSwRequirements;
+ }
+
+ /**
+ * @return the inDirectSwRequirements
+ */
+ public Collection<Artifact> getInDirectSwRequirements() {
+ return inDirectSwRequirements;
+ }
+
+ /**
+ * @return the allSwRequirements
+ */
+ public Set<Artifact> getAllSwRequirements() {
+ return allSwRequirements;
+ }
+
+ /**
+ * Get Requirement Artifact based on traceMark mark
+ *
+ * @param traceMark
+ * @return requirement artifact
+ */
+ public Artifact getRequirementFromTraceMark(String traceMark) {
+ String canonicalTraceMark = TraceabilityExtractor.getInstance().getCanonicalRequirementName(traceMark);
+ Artifact reqArtifact = directMap.get(canonicalTraceMark);
+ if (reqArtifact == null) {
+ reqArtifact = indirectMap.get(canonicalTraceMark);
+ }
+ return reqArtifact;
+ }
+
+ /**
+ * Get Requirement Artifact based on traceMark mark if it fails, check if trace mark is a structured requirement and
+ * try again
+ *
+ * @param traceMark
+ * @return requirement artifact
+ */
+ public Artifact getRequirementFromTraceMarkIncludeStructuredRequirements(String traceMark) {
+ Artifact toReturn = getRequirementFromTraceMark(traceMark);
+ if (toReturn == null) {
+ Pair<String, String> structured = TraceabilityExtractor.getInstance().getStructuredRequirement(traceMark);
+ if (structured != null) {
+ toReturn = getRequirementFromTraceMark(structured.getKey());
+ }
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TestUnitData.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TestUnitData.java
new file mode 100644
index 00000000000..69ce8d97d13
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TestUnitData.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.data;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestUnitData extends BaseTraceDataCache {
+
+ private List<Artifact> testCases;
+ private List<Artifact> testSupportItems;
+ private Set<Artifact> allTestUnits;
+
+ private final HashMap<String, Artifact> testCaseMap;
+ private final HashMap<String, Artifact> testSupportMap;
+
+ public TestUnitData(Branch branch) {
+ super("Test Unit Data", branch);
+ this.testCaseMap = new HashMap<String, Artifact>();
+ this.testSupportMap = new HashMap<String, Artifact>();
+ this.testCases = new ArrayList<Artifact>();
+ this.testSupportItems = new ArrayList<Artifact>();
+ this.allTestUnits = new TreeSet<Artifact>();
+ }
+
+ public void reset() {
+ super.reset();
+ this.testCaseMap.clear();
+ this.testSupportMap.clear();
+ this.testCases.clear();
+ this.testSupportItems.clear();
+ this.allTestUnits.clear();
+ }
+
+ protected void doBulkLoad(IProgressMonitor monitor) throws Exception {
+ testCases.addAll(ArtifactQuery.getArtifactsFromType(Requirements.TEST_CASE, getBranch()));
+ populateTraceMap(monitor, testCases, testCaseMap);
+ monitor.worked(30);
+
+ if (monitor.isCanceled() != true) {
+ monitor.subTask(String.format("Load Test Support from: [%s]", getBranch().getBranchShortName()));
+
+ testSupportItems.addAll(ArtifactQuery.getArtifactsFromType(Requirements.TEST_SUPPORT, getBranch()));
+ populateTraceMap(monitor, testSupportItems, testSupportMap);
+ monitor.worked(7);
+
+ if (monitor.isCanceled() != true) {
+ allTestUnits.addAll(testCases);
+ allTestUnits.addAll(testSupportItems);
+ monitor.worked(1);
+ }
+ }
+ }
+
+ /**
+ * @return the test cases
+ */
+ public Collection<Artifact> getTestCases() {
+ return testCases;
+ }
+
+ /**
+ * @return the test support items
+ */
+ public Collection<Artifact> getTestSupportItems() {
+ return testSupportItems;
+ }
+
+ /**
+ * @return the allTestUnits
+ */
+ public Set<Artifact> getAllTestUnits() {
+ return allTestUnits;
+ }
+
+ /**
+ * @return the testUnitArtifact
+ */
+ public Artifact getTestUnitByName(String testUnitName) {
+ Artifact testUnit = testCaseMap.get(testUnitName);
+ if (testUnit == null) {
+ testUnit = testSupportMap.get(testUnitName);
+ }
+ return testUnit;
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceMark.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceMark.java
new file mode 100644
index 00000000000..1ef3e7102b3
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceMark.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.define.traceability.data;
+
+import org.eclipse.osee.framework.jdk.core.type.CompositeKey;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceMark {
+ private final String traceType;
+ private final String rawTraceMark;
+
+ public TraceMark(String traceType, String rawTraceMark) {
+ super();
+ this.traceType = traceType;
+ this.rawTraceMark = rawTraceMark;
+ }
+
+ public String getTraceType() {
+ return traceType;
+ }
+
+ public String getRawTraceMark() {
+ return rawTraceMark;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CompositeKey) {
+ final TraceMark other = (TraceMark) obj;
+ boolean result = true;
+ if (other.getTraceType() != null && getTraceType() != null) {
+ result &= other.getTraceType().equals(getTraceType());
+ } else {
+ result &= other.getTraceType() == null && getTraceType() == null;
+ }
+ if (other.getRawTraceMark() != null && getRawTraceMark() != null) {
+ result &= other.getRawTraceMark().equals(getRawTraceMark());
+ } else {
+ result &= other.getRawTraceMark() == null && getRawTraceMark() == null;
+ }
+ return result;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 37;
+ int result = 17;
+ if (getTraceType() != null) {
+ result = prime * result + getTraceType().hashCode();
+ } else {
+ result = prime * result;
+ }
+ if (getRawTraceMark() != null) {
+ result = prime * result + getRawTraceMark().hashCode();
+ } else {
+ result = prime * result;
+ }
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("<%s:%s>", getTraceType(), getRawTraceMark());
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceUnit.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceUnit.java
new file mode 100644
index 00000000000..906e5d79be8
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/data/TraceUnit.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.define.traceability.data;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceUnit {
+ private final String traceUnitType;
+ private final String name;
+ private final Collection<TraceMark> traceMarks;
+
+ public TraceUnit(String traceUnitType, String name) {
+ this.name = name;
+ this.traceUnitType = traceUnitType;
+ this.traceMarks = new HashSet<TraceMark>();
+ }
+
+ public String getTraceUnitType() {
+ return traceUnitType;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void addAllTraceMarks(Collection<TraceMark> traceItems) {
+ traceMarks.addAll(traceItems);
+ }
+
+ public void addTraceMark(TraceMark traceMark) {
+ traceMarks.add(traceMark);
+ }
+
+ public Collection<TraceMark> getTraceMarks() {
+ return traceMarks;
+ }
+
+ public Set<String> getTraceMarkTypes() {
+ Set<String> toReturn = new HashSet<String>();
+ for (TraceMark traceMark : traceMarks) {
+ toReturn.add(traceMark.getTraceType());
+ }
+ return toReturn;
+ }
+
+ public Collection<TraceMark> getTraceMarksByType(String type) {
+ Set<TraceMark> toReturn = new HashSet<TraceMark>();
+ for (TraceMark traceMark : traceMarks) {
+ if (traceMark.getTraceType().equalsIgnoreCase(type)) {
+ toReturn.add(traceMark);
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitPage.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitPage.java
new file mode 100644
index 00000000000..e2fc183e045
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitPage.java
@@ -0,0 +1,437 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.importer;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+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.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager.TraceHandler;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.DirectoryOrFileSelector;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+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;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImportTraceUnitPage extends WizardDataTransferPage {
+ private static final String PAGE_NAME = "org.eclipse.osee.define.traceability.importer.importTraceUnitPage";
+
+ private static final String PAGE_TITLE = "Import Trace Units into OSEE";
+ private static final String PAGE_DESCRIPTION = "Imports trace units into OSEE and updates relations.";
+
+ private static final String SOURCE_GROUP = "Select trace unit(s) source path";
+ private static final String BRANCH_SELECT_GROUP = "Select branch to import into";
+ private static final String IMPORT_BRANCH_TOOLTIP = "Only working branches are allowed";
+
+ private static final String TRACE_UNIT_HANDLER_GROUP = "Select trace unit parser";
+ private static final String TRACE_UNIT_ERROR = "Please select a trace unit handler";
+
+ private static final String OPTIONS_GROUP = "Processing Options";
+ private static final String PERSIST_CHANGES = "Persist Changes";
+ private static final String PERSIST_TOOLTIP =
+ "When not selected, will report all trace marks found per trace unit file.";
+
+ private static final String RECURSION_BUTTON = "Traverse sub-folders";
+ private static final String RECURSION_TOOLTIP =
+ "When selected, processing will include folders and their sub-folders.";
+
+ private static final String FILE_WITH_PATHS_BUTTON = "Is File With Embedded Paths";
+ private static final String FILE_WITH_PATHS_TOOLTIP =
+ "Select when using a source file with multiple paths separated with newlines.";
+
+ private static final String SELECTED_TRACE_HANDLERS_KEY = "trace.handlers";
+ private static final String BRANCH_KEY = "branch.selected";
+ private static final String SOURCE_URI_KEY = "source.uri";
+ private static final String SOURCE_URI_IS_DIRECTORY_KEY = "source.uri.is.directory";
+ private static final String IS_ART_PERSIST_ALLOWED_KEY = "is.art.persist.allowed";
+ private static final String IS_FOLDER_RECURSION_KEY = "is.folder.recurse.allowed";
+ private static final String IS_FILE_WITH_MULTI_PATHS_KEY = "is.file.with.multi.paths";
+
+ private DirectoryOrFileSelector directoryFileSelector;
+ private BranchSelectComposite branchSelectComposite;
+ private MutableBoolean isFolderRecursionAllowed;
+ private MutableBoolean isArtifactPersistanceAllowed;
+ private IResource currentResourceSelection;
+ private MutableBoolean isFileContainingMultiplePaths;
+ private Map<Button, Boolean> traceUnitHandlers;
+ private Map<String, Button> optionButtons;
+
+ /**
+ * @param name
+ * @param selection
+ */
+ public ImportTraceUnitPage(IStructuredSelection selection) {
+ super(PAGE_NAME);
+ setTitle(PAGE_TITLE);
+ setDescription(PAGE_DESCRIPTION);
+ this.traceUnitHandlers = new HashMap<Button, Boolean>();
+ this.optionButtons = new HashMap<String, Button>();
+
+ this.isFolderRecursionAllowed = new MutableBoolean(false);
+ this.isArtifactPersistanceAllowed = new MutableBoolean(false);
+ this.isFileContainingMultiplePaths = new MutableBoolean(false);
+
+ if (selection != null && selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ currentResourceSelection = (IResource) ((IAdaptable) firstElement).getAdapter(IResource.class);
+ }
+ }
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ composite.setFont(parent.getFont());
+
+ createTestUnitSourceArea(composite);
+ createBranchSelectArea(composite);
+ createParserSelectArea(composite);
+ createOptionsArea(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+
+ setControl(composite);
+
+ setPageComplete(determinePageCompletion());
+
+ directoryFileSelector.addListener(SWT.Selection, new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ Button button = optionButtons.get(IS_FILE_WITH_MULTI_PATHS_KEY);
+ if (isWidgetAccessible(button) && isWidgetAccessible(directoryFileSelector)) {
+ button.setEnabled(!directoryFileSelector.isDirectorySelected());
+ }
+ setPageComplete(determinePageCompletion());
+ }
+ });
+ }
+
+ private boolean isWidgetAccessible(Widget widget) {
+ return widget != null && !widget.isDisposed();
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+ }
+
+ protected void createTestUnitSourceArea(Composite parent) {
+ directoryFileSelector = new DirectoryOrFileSelector(parent, SWT.NONE, SOURCE_GROUP, this);
+
+ if (currentResourceSelection == null) {
+ // Select directory as the default
+ directoryFileSelector.setDirectorySelected(true);
+ } else {
+ directoryFileSelector.setDirectorySelected(currentResourceSelection.getType() != IResource.FILE);
+ directoryFileSelector.setText(currentResourceSelection.getLocation().toString());
+ }
+ }
+
+ protected void createBranchSelectArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText(BRANCH_SELECT_GROUP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ composite.setToolTipText(IMPORT_BRANCH_TOOLTIP);
+
+ branchSelectComposite = new BranchSelectComposite(composite, SWT.BORDER, true);
+ branchSelectComposite.setToolTipText(IMPORT_BRANCH_TOOLTIP);
+ branchSelectComposite.addListener(new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+ }
+ });
+ }
+
+ protected void createParserSelectArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText(TRACE_UNIT_HANDLER_GROUP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ try {
+ for (TraceHandler handler : TraceUnitExtensionManager.getInstance().getAllTraceHandlers()) {
+ createTraceHandler(composite, handler.getName(), handler.getId());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+
+ }
+
+ private void createTraceHandler(Composite parent, String text, String handlerId) {
+ Button handlerButton = new Button(parent, SWT.CHECK);
+ handlerButton.setText(text);
+ handlerButton.setData(handlerId);
+ handlerButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object source = e.getSource();
+ if (source instanceof Button) {
+ Button button = (Button) source;
+ traceUnitHandlers.put(button, button.getSelection());
+ }
+ setPageComplete(determinePageCompletion());
+ }
+ });
+ traceUnitHandlers.put(handlerButton, false);
+ }
+
+ protected void createOptionsArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText(OPTIONS_GROUP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ createOptionButton(composite, IS_ART_PERSIST_ALLOWED_KEY, PERSIST_CHANGES, PERSIST_TOOLTIP,
+ isArtifactPersistanceAllowed);
+ createOptionButton(composite, IS_FOLDER_RECURSION_KEY, RECURSION_BUTTON, RECURSION_TOOLTIP,
+ isFolderRecursionAllowed);
+ createOptionButton(composite, IS_FILE_WITH_MULTI_PATHS_KEY, FILE_WITH_PATHS_BUTTON, FILE_WITH_PATHS_TOOLTIP,
+ isFileContainingMultiplePaths);
+ }
+
+ private void createOptionButton(Composite parent, String buttonId, String buttonText, String buttonToolTip, final MutableBoolean toModify) {
+ Button optionButton = new Button(parent, SWT.CHECK);
+ optionButton.setText(buttonText);
+ optionButton.setToolTipText(buttonToolTip);
+ optionButton.setData(toModify);
+ optionButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object object = e.getSource();
+ if (object instanceof Button) {
+ toModify.setValue(((Button) object).getSelection());
+ }
+ setPageComplete(determinePageCompletion());
+ }
+ });
+ optionButton.setSelection(toModify.getValue());
+ optionButtons.put(buttonId, optionButton);
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ boolean result = directoryFileSelector.validate(this);
+ if (result) {
+ Branch branch = getSelectedBranch();
+ if (branch == null) {
+ result = false;
+ setErrorMessage("Please select a valid working branch");
+ }
+ }
+ if (result) {
+ result &= validateParser(this);
+ }
+ return result;
+ }
+
+ protected boolean validateParser(WizardDataTransferPage wizardPage) {
+ boolean result = false;
+ String[] selectedHandlers = getTraceUnitHandlerIds();
+ if (selectedHandlers.length > 0) {
+ result = true;
+ } else {
+ wizardPage.setErrorMessage(TRACE_UNIT_ERROR);
+ }
+ return result;
+ }
+
+ public URI getSourceURI() {
+ return isWidgetAccessible(directoryFileSelector) ? directoryFileSelector.getFile().toURI() : null;
+ }
+
+ public Branch getSelectedBranch() {
+ return isWidgetAccessible(branchSelectComposite) ? branchSelectComposite.getSelectedBranch() : null;
+ }
+
+ public boolean isFolderRecursionAllowed() {
+ return isFolderRecursionAllowed.getValue();
+ }
+
+ public boolean isArtifactPersistanceAllowed() {
+ return isArtifactPersistanceAllowed.getValue();
+ }
+
+ public boolean isFileContainingMultiplePaths() {
+ return isWidgetAccessible(directoryFileSelector) ? !directoryFileSelector.isDirectorySelected() && isFileContainingMultiplePaths.getValue() : isFileContainingMultiplePaths.getValue();
+ }
+
+ public String[] getTraceUnitHandlerIds() {
+ List<String> selectedIds = new ArrayList<String>();
+ for (Button button : traceUnitHandlers.keySet()) {
+ Boolean value = traceUnitHandlers.get(button);
+ if (value != null && value == true) {
+ selectedIds.add((String) button.getData());
+ }
+ }
+ return selectedIds.toArray(new String[selectedIds.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.WizardDataTransferPage#restoreWidgetValues()
+ */
+ @Override
+ protected void restoreWidgetValues() {
+ super.restoreWidgetValues();
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+
+ String source = settings.get(SOURCE_URI_KEY);
+ if (currentResourceSelection == null || !currentResourceSelection.isAccessible()) {
+ if (Strings.isValid(source)) {
+ directoryFileSelector.setDirectorySelected(settings.getBoolean(SOURCE_URI_IS_DIRECTORY_KEY));
+ try {
+ directoryFileSelector.setText(new File(new URI(source)).getAbsolutePath());
+ } catch (URISyntaxException ex) {
+ // Do Nothing
+ }
+ }
+ }
+
+ for (String id : optionButtons.keySet()) {
+ Boolean value = settings.getBoolean(id);
+ if (id.equals(IS_FILE_WITH_MULTI_PATHS_KEY)) {
+ if (directoryFileSelector.isDirectorySelected()) {
+ value = false;
+ }
+ }
+ Button button = optionButtons.get(id);
+ button.setSelection(value);
+ Object data = button.getData();
+ if (data instanceof MutableBoolean) {
+ ((MutableBoolean) data).setValue(value);
+ }
+ }
+
+ try {
+ Integer branchId = settings.getInt(BRANCH_KEY);
+ if (branchId > 0) {
+ Branch branch = BranchManager.getBranch(branchId);
+ if (branch != null) {
+ branchSelectComposite.setSelected(branch);
+ }
+ }
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+
+ String[] traceHandlers = settings.getArray(SELECTED_TRACE_HANDLERS_KEY);
+ if (traceHandlers != null && traceHandlers.length > 0) {
+ Set<String> traceIds = new HashSet<String>(Arrays.asList(traceHandlers));
+ for (Button button : traceUnitHandlers.keySet()) {
+ Object data = button.getData();
+ if (data instanceof String) {
+ String id = (String) data;
+ if (traceIds.contains(id)) {
+ button.setSelection(true);
+ traceUnitHandlers.put(button, true);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.WizardDataTransferPage#saveWidgetValues()
+ */
+ @Override
+ protected void saveWidgetValues() {
+ super.saveWidgetValues();
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ Branch branch = getSelectedBranch();
+ if (branch != null) {
+ settings.put(BRANCH_KEY, branch.getBranchId());
+ }
+
+ settings.put(SELECTED_TRACE_HANDLERS_KEY, getTraceUnitHandlerIds());
+ settings.put(SOURCE_URI_KEY, getSourceURI().toASCIIString());
+ settings.put(SOURCE_URI_IS_DIRECTORY_KEY, directoryFileSelector.isDirectorySelected());
+ settings.put(IS_ART_PERSIST_ALLOWED_KEY, isArtifactPersistanceAllowed());
+ settings.put(IS_FOLDER_RECURSION_KEY, isFolderRecursionAllowed());
+ settings.put(IS_FILE_WITH_MULTI_PATHS_KEY, isFileContainingMultiplePaths());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitWizard.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitWizard.java
new file mode 100644
index 00000000000..8ac22d9fe0d
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/importer/ImportTraceUnitWizard.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.define.traceability.importer;
+
+import java.net.URI;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.jobs.ImportTraceUnitsJob;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImportTraceUnitWizard extends Wizard implements IImportWizard {
+ private ImportTraceUnitPage page;
+ private IStructuredSelection selection;
+
+ public ImportTraceUnitWizard() {
+ super();
+ setDialogSettings(DefinePlugin.getInstance().getDialogSettings());
+ setWindowTitle("Import Trace Units Wizard");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ Branch importToBranch = page.getSelectedBranch();
+ boolean isRecursive = page.isFolderRecursionAllowed();
+ boolean isPersistChanges = page.isArtifactPersistanceAllowed();
+ URI source = page.getSourceURI();
+ String[] traceUnitHandlerIds = page.getTraceUnitHandlerIds();
+ boolean fileWithMultiPaths = page.isFileContainingMultiplePaths();
+
+ Job job =
+ new ImportTraceUnitsJob("Import Trace Units", importToBranch, source, isRecursive, isPersistChanges,
+ fileWithMultiPaths, traceUnitHandlerIds);
+ Jobs.startJob(job, true);
+ page.saveWidgetValues();
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, OseeLevel.SEVERE_POPUP, "Import Trace Unit Error", ex);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ @Override
+ public void addPages() {
+ page = new ImportTraceUnitPage(selection);
+ addPage(page);
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/FindTraceUnitJob.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/FindTraceUnitJob.java
new file mode 100644
index 00000000000..b6752ac46c0
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/FindTraceUnitJob.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.define.traceability.jobs;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.operations.FindTraceUnitFromResource;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectionDialog;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FindTraceUnitJob extends Job {
+ private final IResource[] resources;
+
+ public FindTraceUnitJob(String name, IResource... resources) {
+ super(name);
+ if (resources != null) {
+ this.resources = resources;
+ } else {
+ this.resources = new IResource[0];
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (resources != null && resources.length > 0) {
+ FetchBranchJob job = new FetchBranchJob(getName());
+ Jobs.startJob(job, true, new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ FetchBranchJob fetcherJob = (FetchBranchJob) event.getJob();
+ final Branch branch = fetcherJob.getSelectedBranch();
+ if (branch != null) {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ if (branch != null) {
+ FindTraceUnitFromResource.search(branch, resources);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.runInJob(getName(), runnable, DefinePlugin.class, DefinePlugin.PLUGIN_ID);
+ }
+ }
+ });
+ }
+ return Status.OK_STATUS;
+ }
+ private final class FetchBranchJob extends UIJob {
+ private Branch branch;
+
+ public FetchBranchJob(String name) {
+ super(name);
+ branch = null;
+ }
+
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ branch = BranchSelectionDialog.getBranchFromUser();
+ return Status.OK_STATUS;
+ }
+
+ public Branch getSelectedBranch() {
+ return branch;
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/ImportTraceUnitsJob.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/ImportTraceUnitsJob.java
new file mode 100644
index 00000000000..da663e0ffd7
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/jobs/ImportTraceUnitsJob.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.define.traceability.jobs;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+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.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.operations.TraceUnitFromResourceOperation;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImportTraceUnitsJob extends Job {
+ private final Branch importToBranch;
+ private final boolean isRecursive;
+ private final boolean isPersistChanges;
+ private final boolean fileWithMultiPaths;
+ private final URI source;
+ private final String[] traceTypeIds;
+
+ public ImportTraceUnitsJob(String jobName, Branch importToBranch, URI source, boolean isRecursive, boolean isPersistChanges, boolean fileWithMultiPaths, String... traceHandlerIds) {
+ super(jobName);
+ this.importToBranch = importToBranch;
+ this.source = source;
+ this.isRecursive = isRecursive;
+ this.isPersistChanges = isPersistChanges;
+ this.fileWithMultiPaths = fileWithMultiPaths;
+ if (traceHandlerIds == null) {
+ traceTypeIds = new String[0];
+ } else {
+ Set<String> traceSet = new HashSet<String>(Arrays.asList(traceHandlerIds));
+ traceTypeIds = traceSet.toArray(new String[traceSet.size()]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus status = Status.CANCEL_STATUS;
+ try {
+ monitor.beginTask(getName(), Integer.MAX_VALUE);
+ if (isPersistChanges) {
+ TraceUnitFromResourceOperation.importTraceFromTestUnits(monitor, source, isRecursive, fileWithMultiPaths,
+ importToBranch, traceTypeIds);
+ } else {
+ TraceUnitFromResourceOperation.printTraceFromTestUnits(monitor, source, isRecursive, fileWithMultiPaths,
+ traceTypeIds);
+ }
+ if (!monitor.isCanceled()) {
+ status = Status.OK_STATUS;
+ }
+ } catch (Exception ex) {
+ status = new Status(Status.ERROR, DefinePlugin.PLUGIN_ID, "", ex);
+ } finally {
+ monitor.done();
+ }
+ return status;
+ }
+
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/FindTraceUnitFromResource.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/FindTraceUnitFromResource.java
new file mode 100644
index 00000000000..377fcd1ef00
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/FindTraceUnitFromResource.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.define.traceability.operations;
+
+import java.io.InputStream;
+import java.nio.CharBuffer;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.ITraceUnitResourceLocator;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditorInput;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FindTraceUnitFromResource {
+
+ private FindTraceUnitFromResource() {
+ }
+
+ private static HashCollection<String, String> toIdentifiers(IResource... resources) {
+ HashCollection<String, String> toReturn = new HashCollection<String, String>(false, HashSet.class);
+ if (resources != null && resources.length > 0) {
+ try {
+ Collection<ITraceUnitResourceLocator> locators =
+ TraceUnitExtensionManager.getInstance().getAllTraceUnitLocators();
+ for (IResource resource : resources) {
+ resourceToId(toReturn, resource, locators);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return toReturn;
+ }
+
+ private static void resourceToId(HashCollection<String, String> idStore, IResource resource, Collection<ITraceUnitResourceLocator> locators) {
+ try {
+ IFileStore fileStore = EFS.getStore(resource.getLocationURI());
+ for (ITraceUnitResourceLocator locator : locators) {
+ if (locator.isValidFile(fileStore)) {
+ InputStream inputStream = null;
+ try {
+ inputStream = fileStore.openInputStream(EFS.NONE, new NullProgressMonitor());
+ CharBuffer buffer = Lib.inputStreamToCharBuffer(inputStream);
+ String identifier = locator.getIdentifier(fileStore, buffer);
+ String traceType = locator.getTraceUnitType(identifier, buffer);
+ idStore.put(traceType, identifier);
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static void search(Branch branch, IResource... resources) {
+ HashCollection<String, String> typeAndIds = toIdentifiers(resources);
+ if (!typeAndIds.isEmpty()) {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ for (String artifactTypeName : typeAndIds.keySet()) {
+ Collection<String> items = typeAndIds.getValues(artifactTypeName);
+ if (items != null) {
+ for (String artifactName : items) {
+ try {
+ artifacts.addAll(ArtifactQuery.getArtifactsFromTypeAndName(artifactTypeName, artifactName, branch));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+
+ if (!artifacts.isEmpty()) {
+ openArtifacts(artifacts);
+ } else {
+ AWorkbench.popup("Find Trace Unit from Resource", String.format("Unable to find trace for: %s",
+ Arrays.deepToString(resources)));
+ }
+ } else {
+ AWorkbench.popup("Find Trace Unit from Resource", String.format("Unable to find trace handler for: %s",
+ Arrays.deepToString(resources)));
+ }
+ }
+
+ private static void openArtifacts(final Collection<Artifact> artifacts) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ for (Artifact artifact : artifacts) {
+ AWorkbench.getActivePage().openEditor(new ArtifactEditorInput(artifact), ArtifactEditor.EDITOR_ID,
+ true);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ITraceUnitProcessor.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ITraceUnitProcessor.java
new file mode 100644
index 00000000000..9e88a30c6f6
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ITraceUnitProcessor.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.define.traceability.operations;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.define.traceability.data.TraceUnit;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITraceUnitProcessor {
+
+ public void initialize(IProgressMonitor monitor);
+
+ public void onComplete(IProgressMonitor monitor) throws OseeCoreException;
+
+ public void clear();
+
+ public void process(IProgressMonitor monitor, TraceUnit testUnit) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ResourceToTraceUnit.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ResourceToTraceUnit.java
new file mode 100644
index 00000000000..efa26756fbe
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/ResourceToTraceUnit.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.define.traceability.operations;
+
+import java.net.URI;
+import java.nio.CharBuffer;
+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;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.define.traceability.ITraceParser;
+import org.eclipse.osee.define.traceability.ITraceUnitResourceLocator;
+import org.eclipse.osee.define.traceability.data.TraceMark;
+import org.eclipse.osee.define.traceability.data.TraceUnit;
+import org.eclipse.osee.define.utility.IResourceHandler;
+import org.eclipse.osee.define.utility.UriResourceContentFinder;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ResourceToTraceUnit {
+
+ private final UriResourceContentFinder resourceFinder;
+ private final Set<ITraceUnitProcessor> traceProcessors;
+ private final HashCollection<ITraceUnitResourceLocator, ITraceParser> traceUnitHandlers;
+
+ public ResourceToTraceUnit(final URI source, final boolean isRecursionAllowed, final boolean isFileWithMultiplePaths) {
+ super();
+ this.traceUnitHandlers = new HashCollection<ITraceUnitResourceLocator, ITraceParser>();
+ this.traceProcessors = Collections.synchronizedSet(new HashSet<ITraceUnitProcessor>());
+ this.resourceFinder = new UriResourceContentFinder(source, isRecursionAllowed, isFileWithMultiplePaths);
+ }
+
+ public void addTraceProcessor(ITraceUnitProcessor traceProcessor) {
+ synchronized (traceProcessors) {
+ traceProcessors.add(traceProcessor);
+ }
+ }
+
+ public void removeTraceProcessor(ITraceUnitProcessor traceProcessor) {
+ synchronized (traceProcessors) {
+ traceProcessors.remove(traceProcessor);
+ }
+ }
+
+ public void addTraceUnitHandler(ITraceUnitResourceLocator locator, ITraceParser parser) {
+ traceUnitHandlers.put(locator, parser);
+ }
+
+ public void removeTestUnitLocator(ITraceUnitResourceLocator locator) {
+ traceUnitHandlers.removeValues(locator);
+ }
+
+ private void clear() {
+ for (ITraceUnitProcessor traceProcessor : traceProcessors) {
+ traceProcessor.clear();
+ }
+ for (ITraceUnitResourceLocator locator : traceUnitHandlers.keySet()) {
+ resourceFinder.removeLocator(locator);
+ }
+ System.gc();
+ }
+
+ public void execute(IProgressMonitor monitor) throws OseeCoreException {
+ List<TraceUnitCollector> collectors = new ArrayList<TraceUnitCollector>();
+ try {
+ for (ITraceUnitResourceLocator locator : traceUnitHandlers.keySet()) {
+ Collection<ITraceParser> parsers = traceUnitHandlers.getValues(locator);
+ for (ITraceParser parser : parsers) {
+ TraceUnitCollector testUnitCollector = new TraceUnitCollector(locator, parser);
+ resourceFinder.addLocator(locator, testUnitCollector);
+ collectors.add(testUnitCollector);
+ }
+ }
+
+ final int TOTAL_WORK = Integer.MAX_VALUE;
+ final int QUARTER_TOTAL = TOTAL_WORK / 4;
+
+ SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, QUARTER_TOTAL);
+ resourceFinder.execute(subMonitor);
+
+ if (!monitor.isCanceled()) {
+ subMonitor = new SubProgressMonitor(monitor, QUARTER_TOTAL);
+ notifyOnInitialize(subMonitor);
+ }
+
+ if (!monitor.isCanceled()) {
+ subMonitor = new SubProgressMonitor(monitor, QUARTER_TOTAL);
+ subMonitor.beginTask("Processing", collectors.size());
+ for (TraceUnitCollector collector : collectors) {
+ if (monitor.isCanceled()) break;
+ if (!collector.isEmpty()) {
+ processCollector(subMonitor, collector);
+ }
+ subMonitor.worked(1);
+ }
+ subMonitor.done();
+ }
+
+ if (!monitor.isCanceled()) {
+ subMonitor = new SubProgressMonitor(monitor, QUARTER_TOTAL);
+ notifyOnComplete(subMonitor);
+ }
+ } finally {
+ collectors.clear();
+ clear();
+ }
+ }
+
+ private void processCollector(IProgressMonitor monitor, TraceUnitCollector testUnitCollector) throws OseeCoreException {
+ for (String testUnitType : testUnitCollector.getTraceUnitTypes()) {
+ if (monitor.isCanceled()) break;
+ Map<String, TraceUnit> unitToTrace = testUnitCollector.getUnitsToTraceMarks(testUnitType);
+ if (unitToTrace != null) {
+ for (String testUnitName : unitToTrace.keySet()) {
+ monitor.subTask(String.format("Processing [%s - %s]", testUnitType, testUnitName));
+ if (monitor.isCanceled()) break;
+ TraceUnit testUnit = unitToTrace.get(testUnitName);
+ if (testUnit != null) {
+ notifyOnProcess(monitor, testUnit);
+ }
+ }
+ }
+ }
+ }
+
+ private void notifyOnProcess(IProgressMonitor monitor, TraceUnit testUnit) throws OseeCoreException {
+ for (ITraceUnitProcessor traceProcessor : traceProcessors) {
+ traceProcessor.process(monitor, testUnit);
+ }
+ }
+
+ private void notifyOnInitialize(IProgressMonitor monitor) {
+ monitor.beginTask("Initialize", traceProcessors.size());
+ for (ITraceUnitProcessor traceProcessor : traceProcessors) {
+ monitor.subTask(String.format("Initializing [%s]", traceProcessor.getClass().getSimpleName()));
+ traceProcessor.initialize(monitor);
+ monitor.worked(1);
+ }
+ }
+
+ private void notifyOnComplete(IProgressMonitor monitor) throws OseeCoreException {
+ monitor.beginTask("On Completion", traceProcessors.size());
+ for (ITraceUnitProcessor traceProcessor : traceProcessors) {
+ monitor.subTask(String.format("Completing [%s]", traceProcessor.getClass().getSimpleName()));
+ traceProcessor.onComplete(monitor);
+ monitor.worked(1);
+ }
+ }
+
+ private final class TraceUnitCollector implements IResourceHandler {
+
+ private final ITraceParser traceParser;
+ private final ITraceUnitResourceLocator traceUnitLocator;
+ private final Map<String, Map<String, TraceUnit>> traceUnitToTraceMarks;
+
+ public TraceUnitCollector(ITraceUnitResourceLocator traceUnitLocator, ITraceParser traceParser) {
+ this.traceParser = traceParser;
+ this.traceUnitLocator = traceUnitLocator;
+ this.traceUnitToTraceMarks = new HashMap<String, Map<String, TraceUnit>>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.IResourceHandler#onResourceFound(java.net.URI, java.lang.String, java.nio.CharBuffer)
+ */
+ @Override
+ public void onResourceFound(URI uriPath, String name, CharBuffer fileBuffer) {
+ String traceUnitType = traceUnitLocator.getTraceUnitType(name, fileBuffer);
+ if (Strings.isValid(traceUnitType) && !traceUnitType.equalsIgnoreCase(ITraceUnitResourceLocator.UNIT_TYPE_UNKNOWN)) {
+ Collection<TraceMark> traceMarks = traceParser.getTraceMarks(fileBuffer);
+ if (traceMarks != null && !traceMarks.isEmpty()) {
+ Map<String, TraceUnit> traceUnits = traceUnitToTraceMarks.get(traceUnitType);
+ if (traceUnits == null) {
+ traceUnits = new HashMap<String, TraceUnit>();
+ traceUnitToTraceMarks.put(traceUnitType, traceUnits);
+ }
+ TraceUnit unit = traceUnits.get(name);
+ if (unit == null) {
+ unit = new TraceUnit(traceUnitType, name);
+ traceUnits.put(name, unit);
+ }
+ unit.addAllTraceMarks(traceMarks);
+ }
+ }
+ }
+
+ public boolean isEmpty() {
+ return traceUnitToTraceMarks.isEmpty();
+ }
+
+ public void reset() {
+ this.traceUnitToTraceMarks.clear();
+ }
+
+ public Set<String> getTraceUnitTypes() {
+ return traceUnitToTraceMarks.keySet();
+ }
+
+ public Map<String, TraceUnit> getUnitsToTraceMarks(String unitType) {
+ return traceUnitToTraceMarks.get(unitType);
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitFromResourceOperation.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitFromResourceOperation.java
new file mode 100644
index 00000000000..33342dad377
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitFromResourceOperation.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.operations;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager;
+import org.eclipse.osee.define.traceability.TraceUnitExtensionManager.TraceHandler;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceUnitFromResourceOperation {
+
+ public static Set<String> getTraceUnitHandlerIds() throws OseeCoreException {
+ return TraceUnitExtensionManager.getInstance().getTraceUnitHandlerIds();
+ }
+
+ private static ResourceToTraceUnit getResourceToTestUnit(URI source, boolean isRecursive, boolean isFileWithMultiplePaths, String... testUnitTraceIds) throws OseeCoreException {
+ checkSourceArgument(source);
+ checkTraceUnitHandlerIdsArgument(testUnitTraceIds);
+
+ ResourceToTraceUnit operation = new ResourceToTraceUnit(source, isRecursive, isFileWithMultiplePaths);
+ TraceUnitExtensionManager traceManager = TraceUnitExtensionManager.getInstance();
+ for (String traceUnitHandlerId : testUnitTraceIds) {
+
+ TraceHandler handler = traceManager.getTraceUnitHandlerById(traceUnitHandlerId);
+ if (handler != null) {
+ operation.addTraceUnitHandler(handler.getLocator(), handler.getParser());
+ }
+ }
+ return operation;
+ }
+
+ public static void printTraceFromTestUnits(IProgressMonitor monitor, URI source, boolean isRecursive, boolean isFileWithMultiplePaths, String... traceUnitHandlerIds) throws OseeCoreException {
+ ResourceToTraceUnit operation =
+ getResourceToTestUnit(source, isRecursive, isFileWithMultiplePaths, traceUnitHandlerIds);
+ if (monitor == null) monitor = new NullProgressMonitor();
+ operation.addTraceProcessor(new TraceUnitReportProcessor());
+ operation.execute(monitor);
+ }
+
+ public static void importTraceFromTestUnits(IProgressMonitor monitor, URI source, boolean isRecursive, boolean isFileWithMultiplePaths, Branch importToBranch, String... traceUnitHandlerIds) throws OseeCoreException {
+ checkBranchArguments(importToBranch);
+
+ ResourceToTraceUnit operation =
+ getResourceToTestUnit(source, isRecursive, isFileWithMultiplePaths, traceUnitHandlerIds);
+ if (monitor == null) monitor = new NullProgressMonitor();
+ operation.addTraceProcessor(new TraceUnitToArtifactProcessor(importToBranch));
+ operation.execute(monitor);
+ }
+
+ private static void checkTraceUnitHandlerIdsArgument(String... traceUnitHandlerIds) throws OseeCoreException {
+ if (traceUnitHandlerIds == null) {
+ throw new OseeArgumentException("Test unit trace ids was null");
+ }
+ if (traceUnitHandlerIds.length == 0) {
+ throw new OseeArgumentException("Test unit trace ids was empty");
+ }
+
+ try {
+ Set<String> ids = getTraceUnitHandlerIds();
+ List<String> notFound = Collections.setComplement(Arrays.asList(traceUnitHandlerIds), ids);
+ if (!notFound.isEmpty()) {
+ throw new OseeArgumentException(String.format("Invalid test unit trace id(s) [%s]", notFound));
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ private static void checkSourceArgument(URI source) throws OseeArgumentException {
+ if (source == null) {
+ throw new OseeArgumentException("Source was null");
+ }
+ try {
+ IFileStore fileStore = EFS.getStore(source);
+ IFileInfo fileInfo = fileStore.fetchInfo();
+ if (!fileInfo.exists()) {
+ throw new OseeArgumentException(String.format("Unable to access source: [%s]", source));
+ }
+ } catch (Exception ex) {
+ throw new OseeArgumentException(String.format("Unable to access source: [%s]", source));
+ }
+ }
+
+ private static void checkBranchArguments(Branch importToBranch) throws OseeArgumentException {
+ if (importToBranch == null) {
+ throw new OseeArgumentException("Branch to import into was null");
+ }
+ if (!importToBranch.isOfType(BranchType.WORKING)) {
+ throw new OseeArgumentException(String.format("Branch to import into was not a working branch: [%s]",
+ importToBranch));
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitReportProcessor.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitReportProcessor.java
new file mode 100644
index 00000000000..e6d16effdbb
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitReportProcessor.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.define.traceability.operations;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.define.traceability.data.TraceMark;
+import org.eclipse.osee.define.traceability.data.TraceUnit;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class TraceUnitReportProcessor implements ITraceUnitProcessor {
+ private long startTime;
+ private long startMemory;
+ private XResultData resultData;
+
+ public TraceUnitReportProcessor() {
+ this.resultData = new XResultData();
+ startTime = System.currentTimeMillis();
+ startMemory = Runtime.getRuntime().totalMemory();
+ }
+
+ @Override
+ public void clear() {
+ startTime = 0;
+ startMemory = 0;
+ }
+
+ @Override
+ public void initialize(IProgressMonitor monitor) {
+ resultData.addRaw(AHTML.beginMultiColumnTable(95, 1));
+ resultData.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"Test Unit Type", "Test Unit Name",
+ "Trace Type", "Trace Mark"}));
+ }
+
+ @Override
+ public void process(IProgressMonitor monitor, TraceUnit testUnit) {
+ if (testUnit != null) {
+ for (String traceTypes : testUnit.getTraceMarkTypes()) {
+ for (TraceMark traceMark : testUnit.getTraceMarksByType(traceTypes)) {
+ if (monitor.isCanceled()) break;
+ resultData.addRaw(AHTML.addRowMultiColumnTable(testUnit.getTraceUnitType(), testUnit.getName(),
+ traceMark.getTraceType(), traceMark.getRawTraceMark()));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onComplete(IProgressMonitor monitor) {
+ resultData.addRaw(AHTML.endMultiColumnTable());
+ System.out.println(String.format("Completed in: %s", Lib.getElapseString(startTime)));
+ System.out.println(String.format("Memory Leaked: %s", Runtime.getRuntime().totalMemory() - startMemory));
+ try {
+ resultData.report("Report");
+ } catch (OseeCoreException ex) {
+ //
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitToArtifactProcessor.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitToArtifactProcessor.java
new file mode 100644
index 00000000000..54f8c0ed12b
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/operations/TraceUnitToArtifactProcessor.java
@@ -0,0 +1,404 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.define.traceability.operations;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+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.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.define.traceability.TraceabilityExtractor;
+import org.eclipse.osee.define.traceability.data.CodeUnitData;
+import org.eclipse.osee.define.traceability.data.RequirementData;
+import org.eclipse.osee.define.traceability.data.TestUnitData;
+import org.eclipse.osee.define.traceability.data.TraceMark;
+import org.eclipse.osee.define.traceability.data.TraceUnit;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorProvider;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.ResultsEditorHtmlTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.IResultsXViewerRow;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsEditorTableTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsXViewerRow;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TraceUnitToArtifactProcessor implements ITraceUnitProcessor {
+ private RequirementData requirementData;
+
+ private CodeUnitData codeUnitData;
+ private TestUnitData testUnitData;
+
+ private final Branch importIntoBranch;
+ private SkynetTransaction transaction;
+
+ private HashCollection<TraceUnit, TraceMark> reportTraceNotFound;
+ private HashCollection<String, String> unknownRelationError;
+ private Set<String> unRelatedUnits;
+
+ public TraceUnitToArtifactProcessor(Branch importIntoBranch) {
+ this.importIntoBranch = importIntoBranch;
+ this.reportTraceNotFound = new HashCollection<TraceUnit, TraceMark>(false, HashSet.class);
+ this.unknownRelationError = new HashCollection<String, String>(false, HashSet.class);
+ this.unRelatedUnits = new HashSet<String>();
+ }
+
+ @Override
+ public void clear() {
+ transaction = null;
+ if (requirementData != null) {
+ requirementData.reset();
+ requirementData = null;
+ }
+ if (testUnitData != null) {
+ testUnitData.reset();
+ testUnitData = null;
+ }
+ if (codeUnitData != null) {
+ codeUnitData.reset();
+ codeUnitData = null;
+ }
+ }
+
+ @Override
+ public void initialize(IProgressMonitor monitor) {
+ transaction = null;
+ requirementData = new RequirementData(importIntoBranch);
+ if (!monitor.isCanceled()) {
+ requirementData.initialize(monitor);
+ }
+ }
+
+ private Artifact getArtifactFromCache(IProgressMonitor monitor, String artifactType, String name) {
+ if (Requirements.ALL_TEST_UNIT_TYPES.contains(artifactType)) {
+ if (testUnitData == null) {
+ testUnitData = new TestUnitData(importIntoBranch);
+ if (!monitor.isCanceled()) {
+ testUnitData.initialize(monitor);
+ }
+ }
+ return testUnitData.getTestUnitByName(name);
+ } else if (Requirements.CODE_UNIT.equals(artifactType)) {
+ if (codeUnitData == null) {
+ codeUnitData = new CodeUnitData(importIntoBranch);
+ if (!monitor.isCanceled()) {
+ codeUnitData.initialize(monitor);
+ }
+ }
+ return codeUnitData.getCodeUnitByName(name);
+ }
+ return null;
+ }
+
+ @Override
+ public void process(IProgressMonitor monitor, TraceUnit traceUnit) throws OseeCoreException {
+ if (transaction == null) {
+ transaction = new SkynetTransaction(importIntoBranch);
+ }
+ boolean hasChange = false;
+ boolean artifactWasCreated = false;
+ boolean wasRelated = false;
+ String traceUnitType = traceUnit.getTraceUnitType();
+
+ Artifact traceUnitArtifact = getArtifactFromCache(monitor, traceUnitType, traceUnit.getName());
+ if (traceUnitArtifact == null) {
+ traceUnitArtifact =
+ ArtifactTypeManager.addArtifact(traceUnit.getTraceUnitType(), transaction.getBranch(),
+ traceUnit.getName());
+ artifactWasCreated = true;
+ }
+
+ for (TraceMark traceMark : traceUnit.getTraceMarks()) {
+ if (monitor.isCanceled()) break;
+
+ Artifact requirementArtifact = getRequirementArtifact(traceMark.getRawTraceMark(), requirementData);
+ if (requirementArtifact != null) {
+ IRelationEnumeration relationType = getRelationFromTraceType(traceUnitArtifact, traceMark.getTraceType());
+ if (relationType == null) {
+ unknownRelationError.put(traceUnitArtifact.getArtifactTypeName(), traceMark.getTraceType());
+ } else if (!requirementArtifact.isRelated(relationType, traceUnitArtifact)) {
+ requirementArtifact.addRelation(relationType, traceUnitArtifact);
+ hasChange = true;
+ wasRelated = true;
+ } else {
+ wasRelated = true;
+ }
+ } else {
+ reportTraceNotFound.put(traceUnit, traceMark);
+ }
+ }
+
+ // TODO Report Items that were not used from the TEST UNIT DATA Structure
+ // Not Part of this class though
+ if (!wasRelated) {
+ unRelatedUnits.add(traceUnitArtifact.getDescriptiveName());
+ }
+
+ if (hasChange || artifactWasCreated) {
+ HierarchyHandler.addArtifact(transaction, traceUnitArtifact);
+ if (traceUnitArtifact.isOfType(Requirements.ABSTRACT_TEST_UNIT)) {
+ TestRunHandler.linkWithTestUnit(transaction, traceUnitArtifact);
+ }
+ traceUnitArtifact.persistAttributesAndRelations(transaction);
+ }
+ }
+
+ private boolean isUsesTraceType(String traceType) {
+ return traceType.equalsIgnoreCase("USES");
+ }
+
+ private IRelationEnumeration getRelationFromTraceType(Artifact traceUnitArtifact, String traceType) {
+ if (traceUnitArtifact.isOfType(Requirements.ABSTRACT_TEST_UNIT)) {
+ if (isUsesTraceType(traceType)) {
+ return CoreRelationEnumeration.Uses__TestUnit;
+ } else {
+ return CoreRelationEnumeration.Verification__Verifier;
+ }
+ } else if (traceUnitArtifact.isOfType(Requirements.CODE_UNIT)) {
+ return CoreRelationEnumeration.CodeRequirement_CodeUnit;
+ }
+ return null;
+ }
+
+ private Artifact getRequirementArtifact(String traceMark, RequirementData requirementData) {
+ Artifact toReturn = requirementData.getRequirementFromTraceMark(traceMark);
+ if (toReturn == null) {
+ Pair<String, String> structuredRequirement =
+ TraceabilityExtractor.getInstance().getStructuredRequirement(traceMark);
+ if (structuredRequirement != null) {
+ toReturn = requirementData.getRequirementFromTraceMark(structuredRequirement.getKey());
+ }
+ }
+ return toReturn;
+ }
+
+ @Override
+ public void onComplete(IProgressMonitor monitor) throws OseeCoreException {
+ try {
+ if (!monitor.isCanceled()) {
+ if (transaction != null) {
+ transaction.execute();
+ }
+ }
+ } finally {
+ openReport();
+ }
+ }
+
+ private void openReport() {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ ResultsEditor.open(new ResultEditorProvider());
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.runInJob("Trace Unit to Artifact Report", runnable, DefinePlugin.class, DefinePlugin.PLUGIN_ID);
+ }
+
+ private static final class TestRunHandler {
+
+ private static void createGuidLink(Artifact testCase, Artifact testRun) throws OseeCoreException {
+ if (testCase != null) {
+ testRun.setSoleAttributeValue("Test Script GUID", testCase.getGuid());
+ }
+ }
+
+ public static void linkWithTestUnit(SkynetTransaction transaction, Artifact testCase) throws OseeCoreException {
+ if (testCase.isOfType(Requirements.TEST_CASE)) {
+ List<Artifact> testRuns =
+ ArtifactQuery.getArtifactsFromTypeAndName(Requirements.TEST_RUN, testCase.getDescriptiveName(),
+ transaction.getBranch());
+
+ for (Artifact testRun : testRuns) {
+ createGuidLink(testCase, testRun);
+ }
+ }
+ }
+ }
+
+ private static final class HierarchyHandler {
+
+ public static void addArtifact(SkynetTransaction transaction, Artifact testUnit) throws OseeCoreException {
+ Artifact folder = null;
+ if (testUnit.isOfType(Requirements.TEST_CASE)) {
+ folder = getOrCreateTestCaseFolder(transaction);
+ } else if (testUnit.isOfType(Requirements.TEST_SUPPORT)) {
+ folder = getOrCreateTestSupportFolder(transaction);
+ } else if (testUnit.isOfType(Requirements.CODE_UNIT)) {
+ folder = getOrCreateCodeUnitFolder(transaction);
+ } else {
+ folder = getOrCreateUnknownTestUnitFolder(transaction);
+ }
+
+ if (folder != null && !folder.isRelated(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, testUnit)) {
+ folder.addChild(testUnit);
+ folder.persistAttributesAndRelations(transaction);
+ }
+ }
+
+ private static Artifact getOrCreateUnknownTestUnitFolder(SkynetTransaction transaction) throws OseeCoreException {
+ return getOrCreateTestUnitSubFolder(transaction, "Unknown Test Unit Type");
+ }
+
+ private static Artifact getOrCreateTestSupportFolder(SkynetTransaction transaction) throws OseeCoreException {
+ return getOrCreateTestUnitSubFolder(transaction, Requirements.TEST_SUPPORT_UNITS);
+ }
+
+ private static Artifact getOrCreateTestCaseFolder(SkynetTransaction transaction) throws OseeCoreException {
+ return getOrCreateTestUnitSubFolder(transaction, Requirements.TEST_CASES);
+ }
+
+ private static Artifact getOrCreateCodeUnitFolder(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact codeUnitFolder = getOrCreateFolder(transaction, "Code Units");
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(transaction.getBranch());
+ if (!root.isRelated(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, codeUnitFolder)) {
+ root.addChild(codeUnitFolder);
+ root.persistAttributesAndRelations(transaction);
+ }
+ return codeUnitFolder;
+ }
+
+ private static Artifact getOrCreateTestUnitSubFolder(SkynetTransaction transaction, String folderName) throws OseeCoreException {
+ Artifact subFolder = getOrCreateFolder(transaction, folderName);
+ Artifact testUnits = getOrCreateTestUnitsFolder(transaction);
+ if (!testUnits.isRelated(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, subFolder)) {
+ testUnits.addChild(subFolder);
+ testUnits.persistAttributesAndRelations(transaction);
+ }
+ return subFolder;
+ }
+
+ private static Artifact getOrCreateTestUnitsFolder(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact testUnitFolder = getOrCreateFolder(transaction, "Test Units");
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(transaction.getBranch());
+ if (!root.isRelated(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, testUnitFolder)) {
+ root.addChild(testUnitFolder);
+ root.persistAttributesAndRelations(transaction);
+ }
+ return testUnitFolder;
+ }
+
+ private static Artifact getOrCreateFolder(SkynetTransaction transaction, String folderName) throws OseeCoreException {
+ Artifact folder = null;
+ String key = "Folder:" + folderName;
+ Branch branch = transaction.getBranch();
+ try {
+ folder = ArtifactCache.getByTextId(key, branch);
+ if (folder == null) {
+ folder = ArtifactQuery.getArtifactFromTypeAndName("Folder", folderName, branch);
+ ArtifactCache.putByTextId(key, folder);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(DefinePlugin.class, Level.INFO, "Created " + folderName + " because was not found.");
+ folder = ArtifactTypeManager.addArtifact("Folder", branch, folderName);
+ folder.persistAttributes(transaction);
+ ArtifactCache.putByTextId(key, folder);
+ }
+ return folder;
+ }
+ }
+
+ private final class ResultEditorProvider implements IResultsEditorProvider {
+
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return "Trace Units To Artifacts Report";
+ }
+
+ private List<XViewerColumn> createColumns(String... columnNames) {
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>();
+ for (String name : columnNames) {
+ columns.add(new XViewerColumn(name, name, 80, SWT.LEFT, true, SortDataType.String, false, ""));
+ }
+ return columns;
+ }
+
+ private void addUnRelatedTraceUnit(List<IResultsEditorTab> toReturn) {
+ if (!unRelatedUnits.isEmpty()) {
+ List<XViewerColumn> columns = createColumns("Trace Unit Name");
+ List<IResultsXViewerRow> rows = new ArrayList<IResultsXViewerRow>();
+ for (String artifactName : unRelatedUnits) {
+ rows.add(new ResultsXViewerRow(new String[] {artifactName}));
+ }
+ toReturn.add(new ResultsEditorTableTab("Trace Units Created But Had No Relations", columns, rows));
+ }
+ }
+
+ private void addTraceNotFoundTab(List<IResultsEditorTab> toReturn) {
+ if (!reportTraceNotFound.isEmpty()) {
+ List<XViewerColumn> columns =
+ createColumns("Trace Unit Name", "Trace Unit Type", "Trace Mark Type", "Trace Mark");
+
+ List<IResultsXViewerRow> rows = new ArrayList<IResultsXViewerRow>();
+ for (TraceUnit unit : reportTraceNotFound.keySet()) {
+ Collection<TraceMark> traceMarks = reportTraceNotFound.getValues(unit);
+ for (TraceMark traceMark : traceMarks) {
+ rows.add(new ResultsXViewerRow(new String[] {unit.getName(), unit.getTraceUnitType(),
+ traceMark.getTraceType(), traceMark.getRawTraceMark()}));
+ }
+ }
+ toReturn.add(new ResultsEditorTableTab("Trace Marks Not Found", columns, rows));
+ }
+ }
+
+ private void addRelationTypeNotFoundTab(List<IResultsEditorTab> toReturn) {
+ if (!unknownRelationError.isEmpty()) {
+ List<XViewerColumn> columns = createColumns("Artifact Type", "Trace Mark Type");
+ List<IResultsXViewerRow> rows = new ArrayList<IResultsXViewerRow>();
+ for (String artifactType : unknownRelationError.keySet()) {
+ Collection<String> traceTypes = unknownRelationError.getValues(artifactType);
+ for (String traceType : traceTypes) {
+ rows.add(new ResultsXViewerRow(new String[] {artifactType, traceType}));
+ }
+ }
+ toReturn.add(new ResultsEditorTableTab("Invalid Artifact Type to Trace Relation", columns, rows));
+ }
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ List<IResultsEditorTab> toReturn = new ArrayList<IResultsEditorTab>();
+ addTraceNotFoundTab(toReturn);
+ addUnRelatedTraceUnit(toReturn);
+ addRelationTypeNotFoundTab(toReturn);
+ if (toReturn.isEmpty()) {
+ toReturn.add(new ResultsEditorHtmlTab("Trace Unit Import Status", "Import Status", "All Items Linked"));
+ }
+ return toReturn;
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractArtifactRelationReport.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractArtifactRelationReport.java
new file mode 100644
index 00000000000..36fc9189373
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractArtifactRelationReport.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.define.traceability.report;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractArtifactRelationReport extends AbstractReport {
+
+ private final Set<Artifact> artifactsToCheck;
+ private final List<IRelationEnumeration> relationsToCheck;
+
+ public AbstractArtifactRelationReport() {
+ super();
+ this.artifactsToCheck = new HashSet<Artifact>();
+ this.relationsToCheck = new ArrayList<IRelationEnumeration>();
+ }
+
+ public void setArtifacts(Collection<Artifact> artifacts) {
+ if (artifacts != null) {
+ this.artifactsToCheck.addAll(artifacts);
+ }
+ }
+
+ public void addRelationToCheck(IRelationEnumeration relation) {
+ if (relation != null) {
+ this.relationsToCheck.add(relation);
+ }
+ }
+
+ public Artifact[] getArtifactsToCheck() {
+ return artifactsToCheck.toArray(new Artifact[artifactsToCheck.size()]);
+ }
+
+ public IRelationEnumeration[] getRelationsToCheck() {
+ return relationsToCheck.toArray(new IRelationEnumeration[relationsToCheck.size()]);
+ }
+
+ public void clear() {
+ artifactsToCheck.clear();
+ relationsToCheck.clear();
+ super.clear();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractReport.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractReport.java
new file mode 100644
index 00000000000..a1f7345da32
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/AbstractReport.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.define.traceability.report;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractReport {
+ protected static final String EMPTY_STRING = "";
+ private final Set<IReportDataCollector> dataCollectors;
+
+ public AbstractReport() {
+ this.dataCollectors = new HashSet<IReportDataCollector>();
+ }
+
+ public void addReportDataCollector(IReportDataCollector collector) {
+ if (collector != null) {
+ dataCollectors.add(collector);
+ }
+ }
+
+ public void removeReportDataCollector(IReportDataCollector collector) {
+ if (collector != null) {
+ dataCollectors.remove(collector);
+ }
+ }
+
+ protected void notifyOnTableHeader(String... header) {
+ if (header != null && header.length > 0) {
+ for (IReportDataCollector collector : dataCollectors) {
+ collector.addTableHeader(header);
+ }
+ }
+ }
+
+ protected void notifyOnRowData(String... rowData) {
+ if (rowData != null && rowData.length > 0) {
+ for (IReportDataCollector collector : dataCollectors) {
+ collector.addRow(rowData);
+ }
+ }
+ }
+
+ protected void notifyOnEndTable() {
+ for (IReportDataCollector collector : dataCollectors) {
+ collector.endTable();
+ }
+ }
+
+ public abstract void process(IProgressMonitor monitor) throws OseeCoreException;
+
+ public void clear() {
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactToRelatedArtifact.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactToRelatedArtifact.java
new file mode 100644
index 00000000000..d2719dd1018
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactToRelatedArtifact.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.define.traceability.report;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactToRelatedArtifact extends AbstractArtifactRelationReport {
+
+ public ArtifactToRelatedArtifact() {
+ super();
+ }
+
+ public String[] getHeader() {
+ List<String> toReturn = new ArrayList<String>();
+ toReturn.add("Name");
+ toReturn.add("Related By");
+ toReturn.add("Requirement");
+ return toReturn.toArray(new String[toReturn.size()]);
+ }
+
+ public List<String[]> getRelatedRows(IRelationEnumeration[] relations, Artifact artifact) throws OseeCoreException {
+ List<String[]> toReturn = new ArrayList<String[]>();
+ int maxSize = 0;
+ List<List<String>> items = new ArrayList<List<String>>();
+ for (IRelationEnumeration relationEnum : relations) {
+ List<String> entries = new ArrayList<String>();
+ for (Artifact relArtifact : artifact.getRelatedArtifacts(relationEnum)) {
+ entries.add(relArtifact.getDescriptiveName());
+ }
+ items.add(entries);
+ maxSize = Math.max(maxSize, entries.size());
+ }
+ String unitName = artifact.getDescriptiveName();
+ int width = relations.length;
+ for (int rowNumber = 0; rowNumber < maxSize; rowNumber++) {
+ String[] row = new String[width + 1];
+ row[0] = unitName;
+ for (int index = 0; index < width; index++) {
+ List<String> entry = items.get(index);
+ row[index + 1] = rowNumber < entry.size() ? entry.get(rowNumber) : EMPTY_STRING;
+ }
+ toReturn.add(row);
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.AbstractReport#process(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void process(IProgressMonitor monitor) throws OseeCoreException {
+ notifyOnTableHeader(getHeader());
+ IRelationEnumeration[] relations = getRelationsToCheck();
+ for (Artifact artifact : getArtifactsToCheck()) {
+ String name = artifact.getDescriptiveName();
+ for (IRelationEnumeration relationEnum : relations) {
+ String typeName = relationEnum.getTypeName();
+ for (Artifact relArtifact : artifact.getRelatedArtifacts(relationEnum)) {
+ notifyOnRowData(name, typeName, relArtifact.getDescriptiveName());
+ }
+ }
+ }
+ notifyOnEndTable();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactTraceCount.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactTraceCount.java
new file mode 100644
index 00000000000..ecb4bdefed0
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactTraceCount.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.define.traceability.report;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactTraceCount extends AbstractArtifactRelationReport {
+
+ public ArtifactTraceCount() {
+ super();
+ }
+
+ public String[] getHeader() {
+ List<String> header = new ArrayList<String>();
+ header.add("Name");
+ header.add("Type");
+ for (IRelationEnumeration relation : getRelationsToCheck()) {
+ header.add(relation.getTypeName() + " Trace Count");
+ }
+ header.add("Subsystem");
+ return header.toArray(new String[header.size()]);
+ }
+
+ private String getSubsystemAttributeType(Artifact artifact) {
+ Collection<String> attributeTypes = new ArrayList<String>();
+ try {
+ for (AttributeType type : artifact.getAttributeTypes()) {
+ attributeTypes.add(type.getName());
+ }
+ } catch (Exception ex) {
+ // Do Nothing;
+ }
+
+ if (attributeTypes.contains(Requirements.PARTITION)) {
+ return Requirements.PARTITION;
+ } else if (attributeTypes.contains(Requirements.CSCI)) {
+ return Requirements.CSCI;
+ }
+ return EMPTY_STRING;
+ }
+
+ public void process(IProgressMonitor monitor) throws OseeCoreException {
+ String[] header = getHeader();
+ notifyOnTableHeader(header);
+ IRelationEnumeration[] relations = getRelationsToCheck();
+ for (Artifact art : getArtifactsToCheck()) {
+ String[] rowData = new String[header.length];
+ int index = 0;
+ rowData[index++] = art.getDescriptiveName();
+ rowData[index++] = art.getArtifactTypeName();
+ for (IRelationEnumeration relationType : relations) {
+ rowData[index++] = String.valueOf(art.getRelatedArtifactsCount(relationType));
+ }
+ String attributeType = getSubsystemAttributeType(art);
+ if (Strings.isValid(attributeType)) {
+ rowData[index++] = Collections.toString(",", art.getAttributesToStringList(attributeType));
+ } else {
+ rowData[index++] = "Unspecified";
+ }
+ notifyOnRowData(rowData);
+ }
+ notifyOnEndTable();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactsWithoutRelations.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactsWithoutRelations.java
new file mode 100644
index 00000000000..45310d1cb77
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/ArtifactsWithoutRelations.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.define.traceability.report;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactsWithoutRelations extends AbstractArtifactRelationReport {
+
+ public ArtifactsWithoutRelations() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.define.traceability.report.AbstractReport#process(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void process(IProgressMonitor monitor) throws OseeCoreException {
+ notifyOnTableHeader("Item Name", "Type");
+ IRelationEnumeration[] relations = getRelationsToCheck();
+ for (Artifact artifact : getArtifactsToCheck()) {
+ int count = 0;
+ for (IRelationEnumeration relation : relations) {
+ count += artifact.getRelatedArtifactsCount(relation);
+ }
+ if (count <= 0) {
+ notifyOnRowData(artifact.getDescriptiveName(), artifact.getArtifactTypeName());
+ }
+ }
+ notifyOnEndTable();
+ }
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/IReportDataCollector.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/IReportDataCollector.java
new file mode 100644
index 00000000000..0fe30c629a3
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/report/IReportDataCollector.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.define.traceability.report;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IReportDataCollector {
+
+ public void addTableHeader(String... header);
+
+ public void addRow(String... data);
+
+ public void endTable();
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceHandler.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceHandler.java
new file mode 100644
index 00000000000..c90bc953144
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceHandler.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.define.utility;
+
+import java.net.URI;
+import java.nio.CharBuffer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceHandler {
+
+ void onResourceFound(URI uriPath, String name, CharBuffer fileBuffer);
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceLocator.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceLocator.java
new file mode 100644
index 00000000000..46cf7226026
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/IResourceLocator.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.define.utility;
+
+import java.nio.CharBuffer;
+import org.eclipse.core.filesystem.IFileStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceLocator {
+
+ public boolean isValidDirectory(IFileStore fileStore);
+
+ public boolean isValidFile(IFileStore fileStore);
+
+ public boolean hasValidContent(CharBuffer fileBuffer);
+
+ public String getIdentifier(IFileStore fileStore, CharBuffer fileBuffer) throws Exception;
+}
diff --git a/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/UriResourceContentFinder.java b/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/UriResourceContentFinder.java
new file mode 100644
index 00000000000..a41c82bfe9b
--- /dev/null
+++ b/org.eclipse.osee.define/src/org/eclipse/osee/define/utility/UriResourceContentFinder.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.define.utility;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.nio.CharBuffer;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.define.DefinePlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+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;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UriResourceContentFinder {
+
+ private final URI source;
+ private final HashCollection<IResourceLocator, IResourceHandler> locatorMap;
+ private final boolean isRecursionAllowed;
+ private final boolean isFileWithMultiplePaths;
+
+ public UriResourceContentFinder(final URI source, final boolean isRecursionAllowed, final boolean isFileWithMultiplePaths) {
+ super();
+ this.source = source;
+ this.isRecursionAllowed = isRecursionAllowed;
+ this.isFileWithMultiplePaths = isFileWithMultiplePaths;
+ this.locatorMap = new HashCollection<IResourceLocator, IResourceHandler>();
+ }
+
+ public void addLocator(IResourceLocator locator, IResourceHandler... handler) {
+ if (locator != null && handler != null && handler.length > 0) {
+ synchronized (locatorMap) {
+ locatorMap.put(locator, Arrays.asList(handler));
+ }
+ }
+ }
+
+ public void removeLocator(IResourceLocator locator) {
+ if (locator != null) {
+ synchronized (locatorMap) {
+ locatorMap.removeValues(locator);
+ }
+ }
+ }
+
+ private int getTotalWork(IFileStore fileStore) throws CoreException {
+ int totalWork = 0;
+ if (fileStore.fetchInfo().isDirectory()) {
+ IFileStore[] stores = fileStore.childStores(EFS.NONE, new NullProgressMonitor());
+ if (isRecursionAllowed) {
+ for (IFileStore store : stores) {
+ totalWork += getTotalWork(store);
+ }
+ } else {
+ totalWork = stores.length;
+ }
+ } else {
+ totalWork = 1;
+ }
+ return totalWork;
+ }
+
+ public void execute(IProgressMonitor monitor) throws OseeCoreException {
+ try {
+ IFileStore fileStore = EFS.getStore(source);
+ if (isFileWithMultiplePaths) {
+ processFileWithPaths(monitor, fileStore);
+ } else {
+ monitor.beginTask("Scanning files", 1);
+ processFileStore(monitor, fileStore);
+ monitor.worked(1);
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private void processFileWithPaths(IProgressMonitor monitor, IFileStore fileStore) throws Exception {
+ IFileInfo info = fileStore.fetchInfo(EFS.NONE, monitor);
+ if (info != null && info.exists()) {
+ List<String> paths = Lib.readListFromFile(new File(fileStore.toURI()), true);
+ monitor.beginTask("Searching for files", paths.size());
+ for (String path : paths) {
+ if (Strings.isValid(path)) {
+ processFileStore(monitor, EFS.getStore(new File(path).toURI()));
+ }
+ if (monitor.isCanceled()) {
+ break;
+ }
+ monitor.worked(1);
+ }
+ } else {
+ monitor.beginTask("Searching for files", 1);
+ }
+ }
+
+ private void processFileStore(IProgressMonitor monitor, IFileStore fileStore) throws Exception {
+ IFileInfo info = fileStore.fetchInfo(EFS.NONE, monitor);
+ if (info != null && info.exists()) {
+ if (info.isDirectory()) {
+ processDirectory(monitor, fileStore);
+ } else {
+ processFile(monitor, fileStore);
+ }
+ }
+ }
+
+ private boolean isValidDirectory(IProgressMonitor monitor, IFileStore fileStore) {
+ boolean result = false;
+ for (IResourceLocator locator : locatorMap.keySet()) {
+ if (monitor.isCanceled()) {
+ break;
+ }
+ if (locator.isValidDirectory(fileStore)) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ private void processDirectory(IProgressMonitor monitor, IFileStore fileStore) throws Exception {
+ if (isValidDirectory(monitor, fileStore)) {
+ boolean isProcessingAllowed = false;
+ for (IFileStore childStore : fileStore.childStores(EFS.NONE, monitor)) {
+ isProcessingAllowed = false;
+ if (monitor.isCanceled()) {
+ break;
+ }
+ if (!isRecursionAllowed) {
+ isProcessingAllowed = !childStore.fetchInfo().isDirectory();
+ } else {
+ isProcessingAllowed = true;
+ }
+
+ if (isProcessingAllowed) {
+ processFileStore(monitor, childStore);
+ }
+ }
+ }
+ monitor.worked(1);
+ }
+
+ private void processFile(IProgressMonitor monitor, IFileStore fileStore) throws Exception {
+ if (!monitor.isCanceled()) {
+ for (IResourceLocator locator : locatorMap.keySet()) {
+ if (locator.isValidFile(fileStore)) {
+ CharBuffer fileBuffer = getContents(monitor, fileStore);
+ if (locator.hasValidContent(fileBuffer)) {
+ String fileName = locator.getIdentifier(fileStore, fileBuffer);
+ if (!monitor.isCanceled()) {
+ monitor.subTask(String.format("processing [%s]", fileStore.getName()));
+ notifyListeners(locator, fileStore.toURI(), fileName, fileBuffer);
+ }
+ }
+ }
+ }
+ }
+ monitor.worked(1);
+ }
+
+ private CharBuffer getContents(IProgressMonitor monitor, IFileStore fileStore) throws Exception {
+ CharBuffer toReturn = null;
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(fileStore.openInputStream(EFS.NONE, monitor));
+ toReturn = Lib.inputStreamToCharBuffer(inputStream);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(DefinePlugin.class, Level.SEVERE, String.format("Error closing stream for resource: [%s]",
+ fileStore.getName()), ex);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private void notifyListeners(final IResourceLocator locator, final URI uriPath, final String fileName, final CharBuffer fileBuffer) {
+ for (IResourceHandler handler : locatorMap.getValues(locator)) {
+ handler.onResourceFound(uriPath, fileName, fileBuffer);
+ }
+ }
+}
diff --git a/org.eclipse.osee.define/support/How_To_Template.xml b/org.eclipse.osee.define/support/How_To_Template.xml
new file mode 100644
index 00000000000..ea499acfd55
--- /dev/null
+++ b/org.eclipse.osee.define/support/How_To_Template.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>PRC-013</o:Title><o:Author>Tim Ruchal</o:Author><o:LastAuthor>Ryan D. Brooks</o:LastAuthor><o:Revision>5</o:Revision><o:TotalTime>6</o:TotalTime><o:Created>2007-10-05T05:07:00Z</o:Created><o:LastSaved>2007-10-05T05:21:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>7</o:Words><o:Characters>42</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>48</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="20007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="FFFFFF7D"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="D2C2EE9C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="ListNumber4"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="FFFFFF7E"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="B080D0D4"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ListNumber3"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="FFFFFF7F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="98D47242"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="ListNumber2"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="FFFFFF81"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="61C67D48"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet4"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="FFFFFF82"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="42B80BB2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet3"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="FFFFFF83"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="62FA69AA"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet2"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="06B75B61"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FFF62DE0"/><w:lvl w:ilvl="0" w:tplc="E070CF86"><w:start w:val="8"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="072717B8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C936A362"/><w:lvl w:ilvl="0" w:tplc="245427B2"><w:start w:val="2"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="0A6329F4"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="F200A1C6"/><w:lvl w:ilvl="0" w:tplc="71A0A7B0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="0EA863D8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="18221CCE"/><w:lvl w:ilvl="0" w:tplc="80469134"><w:start w:val="1"/><w:pStyle w:val="EntryCriteriaList"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="0EF755E3"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="7F76350E"/><w:lvl w:ilvl="0" w:tplc="4022B27A"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="C5BE7E94"><w:start w:val="1"/><w:lvlText w:val="(%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="107D44D7"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="82AC7DE8"/><w:lvl w:ilvl="0" w:tplc="A94E8C0A"><w:start w:val="3"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="13084F98"/><w:plt w:val="Multilevel"/><w:tmpl w:val="1396C2BA"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2232"/></w:tabs><w:ind w:left="2448" w:hanging="288"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="17C64AD8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="ADF6529E"/><w:lvl w:ilvl="0" w:tplc="1498894E"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="61DA6A54"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="1C53503C"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C8FE44C4"/><w:lvl w:ilvl="0" w:tplc="7134413C"><w:start w:val="4"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="203F4D3B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="64520FE2"/><w:lvl w:ilvl="0" w:tplc="BB647B0A"><w:start w:val="4"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="DD70D388"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1620"/></w:tabs><w:ind w:left="1620" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/><w:color w:val="0000FF"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="26E14A05"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="048A7BE8"/><w:lvl w:ilvl="0" w:tplc="13DEACEA"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:b w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2A7F08D7"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9B020B9A"/><w:lvl w:ilvl="0" w:tplc="6002B546"><w:start w:val="1"/><w:lvlText w:val="(%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="2F947FDA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D2940E28"/><w:lvl w:ilvl="0" w:tplc="CD4C8BD8"><w:start w:val="6"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="337306F5"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3A54FA94"/><w:lvl w:ilvl="0" w:tplc="D6F87804"><w:start w:val="5"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="3E033D04"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="7EAE3F68"/><w:lvl w:ilvl="0" w:tplc="88547B1C"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="3FD226DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="48041F90"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="111Heading3Arial"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="424D3EEA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9460B27A"/><w:lvl w:ilvl="0" w:tplc="08027870"><w:start w:val="2"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="4A916088"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="67689220"/><w:lvl w:ilvl="0" w:tplc="A650C57A"><w:start w:val="4"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="E16EF644"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="4F7A415B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="A52E5718"/><w:lvl w:ilvl="0" w:tplc="0F1AD638"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="9AC2A26C"><w:start w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="4F8F5FED"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="904088DA"/><w:lvl w:ilvl="0" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="4FC5049F"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="2E724A8A"/><w:lvl w:ilvl="0" w:tplc="1B249476"><w:start w:val="9"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="535525EE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="529CC2FE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="564D1983"/><w:plt w:val="Multilevel"/><w:tmpl w:val="8C9E3592"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:color w:val="0000FF"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="58405D94"/><w:plt w:val="Multilevel"/><w:tmpl w:val="71EE2BB8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="StyleHeading3sor3Arial10pt"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="592368AC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="BFFCBB4E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2700"/></w:tabs><w:ind w:left="2700" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="5B97790F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="F9EA1966"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ActivityStep"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="5CC70362"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DEDE73B0"/><w:lvl w:ilvl="0" w:tplc="AC4C51BC"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2232"/></w:tabs><w:ind w:left="2448" w:hanging="288"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:color w:val="0000FF"/><w:sz w:val="24"/><w:sz-cs w:val="16"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="5DC63416"/><w:plt w:val="Multilevel"/><w:tmpl w:val="87949AC8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="600A3C5E"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="25DE13EE"/><w:lvl w:ilvl="0" w:tplc="F6E2D446"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="62D56365"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C9348A14"/><w:lvl w:ilvl="0" w:tplc="9896478E"><w:start w:val="1"/><w:nfc w:val="255"/><w:lvlText w:val="a."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="65855DE2"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DE0AA980"/><w:lvl w:ilvl="0" w:tplc="2E38985A"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="67C126D1"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3312930A"/><w:lvl w:ilvl="0" w:tplc="E9423BAC"><w:start w:val="1"/><w:pStyle w:val="InputsTableText"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="38"><w:lsid w:val="6B8B7708"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="801C1E8A"/><w:lvl w:ilvl="0" w:tplc="A3380E3E"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="6D721AB8"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="39"><w:lsid w:val="6B96217A"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="EA66CD60"/><w:lvl w:ilvl="0" w:tplc="A8F07A78"><w:start w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="F6E2D446"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="D6F87804"><w:start w:val="5"/><w:nfc w:val="3"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="40"><w:lsid w:val="6C926103"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="ABA0AFD2"/><w:lvl w:ilvl="0" w:tplc="4A52B692"><w:start w:val="1"/><w:lvlText w:val="(%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="41"><w:lsid w:val="70D55EB0"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D078130C"/><w:lvl w:ilvl="0" w:tplc="27EAA568"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="42"><w:lsid w:val="7147056B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="E5D260F6"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="27"/></w:list><w:list w:ilfo="2"><w:ilst w:val="27"/></w:list><w:list w:ilfo="3"><w:ilst w:val="33"/></w:list><w:list w:ilfo="4"><w:ilst w:val="33"/></w:list><w:list w:ilfo="5"><w:ilst w:val="29"/></w:list><w:list w:ilfo="6"><w:ilst w:val="21"/></w:list><w:list w:ilfo="7"><w:ilst w:val="1"/></w:list><w:list w:ilfo="8"><w:ilst w:val="0"/></w:list><w:list w:ilfo="9"><w:ilst w:val="42"/></w:list><w:list w:ilfo="10"><w:ilst w:val="16"/></w:list><w:list w:ilfo="11"><w:ilst w:val="31"/></w:list><w:list w:ilfo="12"><w:ilst w:val="2"/></w:list><w:list w:ilfo="13"><w:ilst w:val="39"/></w:list><w:list w:ilfo="14"><w:ilst w:val="19"/></w:list><w:list w:ilfo="15"><w:ilst w:val="22"/></w:list><w:list w:ilfo="16"><w:ilst w:val="7"/></w:list><w:list w:ilfo="17"><w:ilst w:val="8"/></w:list><w:list w:ilfo="18"><w:ilst w:val="6"/></w:list><w:list w:ilfo="19"><w:ilst w:val="34"/></w:list><w:list w:ilfo="20"><w:ilst w:val="14"/></w:list><w:list w:ilfo="21"><w:ilst w:val="11"/></w:list><w:list w:ilfo="22"><w:ilst w:val="13"/></w:list><w:list w:ilfo="23"><w:ilst w:val="18"/></w:list><w:list w:ilfo="24"><w:ilst w:val="24"/></w:list><w:list w:ilfo="25"><w:ilst w:val="38"/></w:list><w:list w:ilfo="26"><w:ilst w:val="25"/></w:list><w:list w:ilfo="27"><w:ilst w:val="23"/></w:list><w:list w:ilfo="28"><w:ilst w:val="10"/></w:list><w:list w:ilfo="29"><w:ilst w:val="17"/></w:list><w:list w:ilfo="30"><w:ilst w:val="20"/></w:list><w:list w:ilfo="31"><w:ilst w:val="26"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="33"><w:ilst w:val="5"/></w:list><w:list w:ilfo="34"><w:ilst w:val="4"/></w:list><w:list w:ilfo="35"><w:ilst w:val="3"/></w:list><w:list w:ilfo="36"><w:ilst w:val="37"/></w:list><w:list w:ilfo="37"><w:ilst w:val="9"/></w:list><w:list w:ilfo="38"><w:ilst w:val="36"/></w:list><w:list w:ilfo="39"><w:ilst w:val="28"/></w:list><w:list w:ilfo="40"><w:ilst w:val="30"/></w:list><w:list w:ilfo="41"><w:ilst w:val="41"/></w:list><w:list w:ilfo="42"><w:ilst w:val="35"/></w:list><w:list w:ilfo="43"><w:ilst w:val="15"/></w:list><w:list w:ilfo="44"><w:ilst w:val="12"/></w:list><w:list w:ilfo="45"><w:ilst w:val="32"/></w:list><w:list w:ilfo="46"><w:ilst w:val="40"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00D5512A"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><w:aliases w:val="1.1.1.1.1 Heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00C255B3"/><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="6"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i-cs/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00C255B3"/><w:pPr><w:pStyle w:val="Heading6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="6"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="AppTitle"><w:name w:val="App Title"/><w:autoRedefine/><w:rsid w:val="00726BB4"/><w:pPr><w:pStyle w:val="AppTitle"/><w:keepNext/><w:keepLines/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="232" w:after="360" w:line="288" w:line-rule="at-least"/><w:jc w:val="center"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00726BB4"/><w:pPr><w:pStyle w:val="TOC1"/><w:spacing w:before="360" w:after="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading3sor3Arial10pt"><w:name w:val="Style Heading 3sor3 + Arial 10 pt"/><w:basedOn w:val="Heading3"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="StyleHeading3sor3Arial10pt"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="5"/></w:listPr></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="111Heading3Arial"><w:name w:val="1.1.1 Heading 3 + Arial"/><w:basedOn w:val="Heading2"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="111Heading3Arial"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:jc w:val="right"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:i/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TI"><w:name w:val="TI"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="TI"/><w:spacing w:line="360" w:line-rule="exact"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U1"><w:name w:val="U1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="U1"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockDate"><w:name w:val="LockDate"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockDate"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockInfo"><w:name w:val="LockInfo"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockInfo"/><w:spacing w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D5512A"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockHead"><w:name w:val="LockHead"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockHead"/><w:keepNext/><w:spacing w:before="480" w:line="240" w:line-rule="exact"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="00D5512A"/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue2"><w:name w:val="List Continue 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListContinue2"/><w:spacing w:after="120"/><w:ind w:left="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue3"><w:name w:val="List Continue 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListContinue3"/><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber2"><w:name w:val="List Number 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber2"/><w:listPr><w:ilfo w:val="12"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:listPr><w:ilfo w:val="7"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber4"><w:name w:val="List Number 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber4"/><w:listPr><w:ilfo w:val="8"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ActivityStep"><w:name w:val="ActivityStep"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ActivityStep"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="720"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00F04366"/><w:pPr><w:pStyle w:val="BodyText"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SubHeaderText"><w:name w:val="SubHeader Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="SubHeaderText"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue4"><w:name w:val="List Continue 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListContinue4"/><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DI-XXX"><w:name w:val="DI-XXX"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="DI-XXX"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ProcessTitle"><w:name w:val="ProcessTitle"/><w:basedOn w:val="Normal"/><w:next w:val="SubHeader"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ProcessTitle"/><w:spacing w:before="360" w:after="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DI-XXXDate"><w:name w:val="DI-XXX Date"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="DI-XXXDate"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SubHeader"><w:name w:val="SubHeader"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="SubHeader"/><w:keepNext/><w:spacing w:before="480" w:after="240"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="InputsTableHeaders"><w:name w:val="Inputs Table Headers"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="InputsTableHeaders"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet2"><w:name w:val="List Bullet 2"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet2"/><w:listPr><w:ilfo w:val="33"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet3"><w:name w:val="List Bullet 3"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet3"/><w:listPr><w:ilfo w:val="34"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet4"><w:name w:val="List Bullet 4"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet4"/><w:listPr><w:ilfo w:val="35"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="0000FF"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ActivityText"><w:name w:val="ActivityText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ActivityText"/><w:spacing w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="InputsTableText"><w:name w:val="Inputs Table Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="InputsTableText"/><w:listPr><w:ilfo w:val="36"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="EntryCriteriaList"><w:name w:val="Entry Criteria List"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="EntryCriteriaList"/><w:listPr><w:ilfo w:val="37"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="3075"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="3075"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:separator/></w:r></w:p></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:continuationSeparator/></w:r></w:p></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:separator/></w:r></w:p></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:continuationSeparator/></w:r></w:p></w:endnote></w:endnotePr><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00D5512A"/><wsp:rsid wsp:val="00037F82"/><wsp:rsid wsp:val="0006676C"/><wsp:rsid wsp:val="00085C9A"/><wsp:rsid wsp:val="000C301A"/><wsp:rsid wsp:val="00107625"/><wsp:rsid wsp:val="00124150"/><wsp:rsid wsp:val="00134923"/><wsp:rsid wsp:val="001A3D31"/><wsp:rsid wsp:val="00254BAB"/><wsp:rsid wsp:val="00257C98"/><wsp:rsid wsp:val="002832E6"/><wsp:rsid wsp:val="002F2CE3"/><wsp:rsid wsp:val="003500CD"/><wsp:rsid wsp:val="0039105C"/><wsp:rsid wsp:val="00395B38"/><wsp:rsid wsp:val="003F64F1"/><wsp:rsid wsp:val="0040292B"/><wsp:rsid wsp:val="00477A26"/><wsp:rsid wsp:val="004A0884"/><wsp:rsid wsp:val="004B078D"/><wsp:rsid wsp:val="004B6FB5"/><wsp:rsid wsp:val="004C2D82"/><wsp:rsid wsp:val="00524B7F"/><wsp:rsid wsp:val="00601FE5"/><wsp:rsid wsp:val="00616CBF"/><wsp:rsid wsp:val="00622A53"/><wsp:rsid wsp:val="00656363"/><wsp:rsid wsp:val="0067073F"/><wsp:rsid wsp:val="00695A6B"/><wsp:rsid wsp:val="006C5728"/><wsp:rsid wsp:val="006E487A"/><wsp:rsid wsp:val="006F6EB1"/><wsp:rsid wsp:val="00712A1B"/><wsp:rsid wsp:val="007167C7"/><wsp:rsid wsp:val="00726BB4"/><wsp:rsid wsp:val="00741F62"/><wsp:rsid wsp:val="00751DA7"/><wsp:rsid wsp:val="007648A1"/><wsp:rsid wsp:val="007724E1"/><wsp:rsid wsp:val="00772551"/><wsp:rsid wsp:val="007830FA"/><wsp:rsid wsp:val="007D2BC6"/><wsp:rsid wsp:val="007D396A"/><wsp:rsid wsp:val="008F48E4"/><wsp:rsid wsp:val="009371C9"/><wsp:rsid wsp:val="009535A2"/><wsp:rsid wsp:val="009C1A9A"/><wsp:rsid wsp:val="009E2024"/><wsp:rsid wsp:val="009E474A"/><wsp:rsid wsp:val="00A01B71"/><wsp:rsid wsp:val="00A15EC8"/><wsp:rsid wsp:val="00A86F92"/><wsp:rsid wsp:val="00AB12F4"/><wsp:rsid wsp:val="00AE4453"/><wsp:rsid wsp:val="00B04CC0"/><wsp:rsid wsp:val="00B144F5"/><wsp:rsid wsp:val="00B54F1E"/><wsp:rsid wsp:val="00BE381E"/><wsp:rsid wsp:val="00C0606A"/><wsp:rsid wsp:val="00C255B3"/><wsp:rsid wsp:val="00C361FB"/><wsp:rsid wsp:val="00D01E4D"/><wsp:rsid wsp:val="00D5512A"/><wsp:rsid wsp:val="00DD42DF"/><wsp:rsid wsp:val="00E16630"/><wsp:rsid wsp:val="00E2349C"/><wsp:rsid wsp:val="00E278A0"/><wsp:rsid wsp:val="00E56992"/><wsp:rsid wsp:val="00E77578"/><wsp:rsid wsp:val="00E8356E"/><wsp:rsid wsp:val="00EA0B8B"/><wsp:rsid wsp:val="00EA3126"/><wsp:rsid wsp:val="00EB1DC9"/><wsp:rsid wsp:val="00F04366"/><wsp:rsid wsp:val="00FE0437"/></wsp:rsids></w:docPr><w:body><wx:sect><ns0:Artifact><w:p wsp:rsidR="00254BAB" wsp:rsidRPr="00741F62" wsp:rsidRDefault="00656363" wsp:rsidP="00741F62"><Set_Name><w:proofErr w:type="spellStart"/><w:r><w:t>Default</w:t></w:r></Set_Name><Attribute><Name><w:r wsp:rsidRPr="00A34EA3"><w:t>Name</w:t></w:r></Name><Format><w:r wsp:rsidRPr="00A34EA3"><w:rPr><w:b/></w:rPr><w:t>x</w:t></w:r></Format></Attribute><Attribute><Name><w:r><w:t>Word</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:t> Formatted Content</w:t></w:r></Name></Attribute></w:p></ns0:Artifact><w:sectPr wsp:rsidR="00254BAB" wsp:rsidRPr="00741F62" wsp:rsidSect="00B144F5"><w:hdr w:type="odd"><w:tbl><w:tblPr><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="0" w:color="auto"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:left w:w="72" w:type="dxa"/><w:right w:w="72" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="2160"/><w:gridCol w:w="7344"/></w:tblGrid><w:tr wsp:rsidR="0006676C"><w:trPr><w:trHeight w:h-rule="exact" w:val="560"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2160" w:type="dxa"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0067073F"><w:pPr><w:pStyle w:val="Header"/><w:jc w:val="left"/></w:pPr><w:r wsp:rsidRPr="0067073F"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><w:binData w:name="wordml://08000001.wmz">H4sIAAAAAAACC42ZeXhNV/fH995rD2efe26kuTf3uhkkpqC0uCS53HtOS9GqKq3W1BpLibEoDYoQ
+Q1BDo6UqVI2pKjW9ZokhpkRfFDGrREIQ42tMI78dHX7P8/7x+/Xm+Tx7WOvstc/6ruxn3yT3yP5v
+EWoislmaUcavAVKf4A8xkgjBewZCFF2g5XNMYSPZrIko7xmkIf6AlRsAa3/a/vIyCEYY/V+2P3ok
+KMn6X2u5P8cYCdX+/nzmr9mXMCrfDXpK2PO5srIyVOVPC/77ufJd+higfrg/mouCZBMtXFbTakqu
+NZDXhCUPiZZylXhXThedZX/RU7YSCbK2GCx18am8zkfKg/xzuZKPlZN4kvxI0UThUeN7bLTMYSPk
+cjZEjmP9ZCfWUzZknWQF1kbeoM3kAeqTy2htOZ5Gyq7ULgO0VAunN7WncEY7C/u17bBeS4OF2liY
+onWHIdpr0EmrAU00A2pqd0mQlkvui10kV6wg28VMskgkkvGiJ+kpWpPVgpBHYjNupg3AqVoVfFk7
+g7xyNpoo30CnVUJWyEg0QvpRc9kJhcpEVKh9g/6lbUZTtNOok/YY1dY8uFT48VHRBS8T4/BnYglu
+JbJwtCjCD7hBTvLf8UZejOfwS3goP4bb8iz8Mt+KbXwtvsaW431sIV7M5uLRbBbuwKbh+mwyNlgy
+LqTjcaZiAp2Am9EpWNBZOBu+xbNhJW4Pm3ElyMZXyW94HXmCPydO0pLUJxXJO+QaHkq24XlkJt5J
+euECEsAVwIX9cBclwFE0H35Gh2EOKoVE5KXdUV/6JvqOxqNcGoNeYB70FgtCKYyjLEYQ4apiFV04
+RiM5oK85Q+u4ho5wGyriwYgKJ4oSYaixiELviRg0WLyEpopYtFSYaKdogU6JNui26IQ07SNUWRuE
+Gmkj0bvaJJSgpaLx2iL0jbYardW2of3aQXRey0X3tEIk5EMUKTmuL924hayJO8sQPFU+Q5vlDVQg
+z6AQ/RCy9K2on/4j+lpfhDL0VHRNn4KCbWOQzzYcdbUNQhNtfVG6rRfKsfVAt2zdULDRFdUzuqE2
+Rg800OiFphl90QpjEMo0RqAzxlh010hBwv4VirB/j+rZ16Km9gzUzn4U9bTnocH2x+hzexCebI/B
+M+2v4q/snfE8+wj8jX2Oatep8b/xLPstnGIPIuPsdcmn9rakj30I6WifQ163byKx9tOksv0psdkj
+4T/GK3DO6AG7jYmw3FgOKcYBSDCuQUtDozWNmpQbr9M8W2+605ZM59m+o5/YttM3bCtpJ9tQOsn2
+Fl1iq0z32O5Bvm0XMGMZhBopUN0YAA2NtvCa0QDeMdzQ1XhKEoyLZJixm4w2lpMJxjQyxRhMphrv
+k2lGgKQYVUmyYZDPjWd4hHEXf2IU4r7GOdzNOIrfNw7gVkYGfsXYjL3GOlzd+BG7jRVYGEvwI9si
+XGhLwyds3+I9tvl4jeJbxSTbAjzYthB3si3GTW3L8Iu2dPyCbQ1+rG/EF/XteK++B6/UD+Pp+gX8
+rn4fh+oeUk9/lbypJ5CeeipJ1HeQGfpV8r3ugPX6q7BH7wCH9UFwTJ8EuXoaXNA3QL6eDdf0fCjW
+S+Cu7qAP9Nr0sd6Mlugf0lJ9OC3TZ1Kk8oRtmYpLimdqLpKV6n5Wondmj/REdl+fy27pG1iRfpTl
+6bfYOV3nv+o1eLb+Gt+jd+Nb9NF8jT6XL9XX8Xl6Np+uF/Cxehn/RPeInrpXtNNbiWb6R6KhPlpU
+0+cIh75KYD1T3Ja54oK8KQ5Jov1LurUlsql2X67TbshYmS8Py3NygH5CHrDtl7XsW+XQoDUyucIK
+aQUvlsnBi2RS8Dfys+BU2Tf4C/lecIr0ByfLiOBx8kmFz+WxColSVkiQtqB2cp/9LTna3lzWswfk
+FcMrvzZqyBZGmHxgs8ultlKtre2mVqqf1Vbp+7UO+lqN6vO0dXKM1k1218rP6Ha4TIvH57QIvEmr
+gJdogGdqj9Ao7Qb6WDuJTG03cmhr0DWxCO0Qc9FyMRPNEikoUYxHPcRo9KYYgRqIIShcDFS/8wno
+Ju+NTvCeaAfvjpbxrmg674KG8g9RZ0UT1RfK9gtLQHPZMNSVjUM12Ux0ny5Gu+hGNJ1mo040H9Wi
+z9BTiMA54MeL4UM8ApJwa1iOYyAHY3iAL5AosoO0IgvJSDKOpJNe5Iwa6RBLLKhMhkIFshIQuQCq
+ouh13Jrm4cn0ojovL+DLCswu4SrsMm7KruAe7Boez4rVGXsfZ7Cn+AIjpITpxMOdJI5XIu14TfIJ
+b0i+4K+SdN6aDOZJan4DKWVXyX4WAbNZW+jMJkEM2w736F3IpDXoTNqFdqVf0ZfpYVoGmB0DH1sO
+g9lIWMHawAVWHZz8d9KKnyQT+FqylU8lt3lvEiOakg9FNEkVZfiA+A3/Lnbj+toy3FtLwfO1gfjI
+c52+4Dt5kXhLnhLd5R4xTP4kJsv54huZLFbJQWK77ChyZBNxXr4obkiHeCpLuNTzuVs/zKvp63l9
+/Rtu6uP4G3pvrmqWd9Hr8z66S9VxCUvUL7EkfR+boqezGfoXbI4+mM3T27E0PY59p3vYEr2ELtMv
+0uV6piJdMVuNE+lSvQf9XvfSNJ3Sr/Vi+FI/BTP0DJii/wAT9DEwQn8H+ug1oKNeSlroJ0gDfTWp
+pE8imt6N3JGNSK4MJTvli2SmfIV0le3JS3IQKdFSyCFtKflayyTdtYuktlZKHohKsEu8CpPFR/C2
+mAKh4ic4x0/A97wUPuYxtDZ/h95mY+gGtop+xs7QxkxjpbQRy6D92QS6iDWjxxmngh8Ei0+D4bwV
+/MTtcJX/m1QWXxJLLCOdxRYyQhwhs0U+WSWekH0iGM6LmvAf0QQM7QOoog0HnzYb3tJ+hO7aARim
+XYHJGqbztCi6UrPoZq0LzdLG0F+1hfQ3bRe9oV2iD9Xlq0yrwjTZnFWQfZlLTmfhci2Lkr+yKvIR
+qyYjeDV1z6kme/CqMolHy8U8UmZwj7zInbKUV5DhQpONBJYdxBPtU3FH+1Jc1daI81q2OKZdFfs1
+om3VKmlzNLs2UCsRr2tFoop2SpSKPeKMWCM2ifkiVSSLwWKgaC3ai9riFaGLGFHE7eIQv89X8TO8
+vKb+uNuhvz9/3e3I33fB8hvfX3dB+PtO+N83wEqqrQZ2lFD9OKsXk03HVM2mNaoVwdmYIlhcI49Y
+VfLItEo54mbVHLG+WhZHVbL45irHWbn/XxH/vxhBz2MwVKNWHhlaPUdUqZkjcmvnkfLxP10j7Pka
+NhTmzSON63VnK+rmkRkv5ZHTtXLE4to54vOX3mNBL+eIl+rliLwGeaTc75+u3RiXr70AXWmcR1Lj
+8kiSYnBcPukSd4W8FVdIXoy7QWTcPXIttoQcjOXwQ6wDpsdWhkGx9eHd2KYQH/s+RMb2AxabBMUN
+50Fuw7Wwt+EhSPHu4kneQ3yU9yT/1HuZD/YW8/7ep7yvVxN9vC7xsbeaamNFgreFGORtL4Z5e4tR
+3k9FsneCmOGdJeZ5F4il3hXiZ+9ascu7RRzxZojz3ixx03tIlHqzRYUGOaJ7fI4YqkiOzxZfxx8W
+K+IPis3x+8XB+L3iTHymKIrfIXTfBvGiL1209KWJPr4ZYqJvrFjsGyC2+zqJk77mothXV7BGFUV4
+ozJet1EB39qoLu/YuC6P9sewY/ExbH/cVL49bi5fE7eEL45bzVPjNvFpcVv4hLgdfFTcLj4kbjfv
+G7eXd4/bxzvEZfG3FdNjs/iE2H18VOxuPjR2Jx8Qu4V/HLue94xdxbvHLuHdYucr5qp+qmIm7xE7
+nX8Um8J7xU5SfhN439hx/KX46tQXX5E2jzfou/GE9oh/CkPi78OE+GKYFn8T5sRfh7T4Iliu6Osr
+giG+6zDSVwzjfXdhiu8hfOErhdk+Suf4DPqVL1ThUf0IRTRN9VWls30xdJavFp3hq0On++rSJr4v
+6d3GX9J+/jsw1F8Aif6zMNb/CyT7d8MU/0aY5l8B0/3z4Qv/NNWOhBR/Akz0d4Rx/pbwmb8xDPbX
+gd7+KPjA74A2fglN/WWkof8hqe6/TVz+64T5C8iDxvmkvM7+aW16cfk3NII+QH6kR08DGT0SeHQC
+kOiOUBrVEh5ENYbiqDqQHxUFp6MckBMlITOqjKyPekiWRt0mc6Kuk+SoAjIsKp/0iMojweF55FlY
+HikOyyfnwq6Qw2GFJD3sBpkSdo98HFZCWoRxqBHmABlWGW566sNRT1PY5HkfFnj6QbInCfp75sH7
+nrXQxHMIuHsXf+Y6xB+7TvJ7rsu82FXMi1wlvNCliQKXS1xxVVNtrLjmaiFuutqLu67e4rHrU4Hd
+E4TNPUu43AtEZfcK8bL7ZxFwbxGt3BmisztL9HcfEqPd2WKGO0dcDM8RdxQ4IluERBwW1SIOitiI
+/aJFxF7RISJT9InYIVIiNoj0iHRxICJNFETMECRyrKgUOUA0iuwk2kU2F/0j64rkyIpifmQZ/ymy
+gF+LugN3ogrgYdRZ+D3qF8DRu4FFbwQteqXK73x4nufIurRZ+FTeKHwurxO+hFcKX82DwzdxLXwL
+R+E7+OOwXfx22G5eGLaXXwzbx0+GZfEchVQgNX7s2c3veHby654t/IpnPf/Ns4pf9CzhFzzzFXNV
+P1Uxi1/yTOeXPSk8zzNJ+U3ghZ5x/Mfw6vRf4RXp3nCDHg0n9FL4U7gdfh9QxC3QIm7CCxHXIUxR
+NaIIChW3Vf9RRDGURdwFFvkQ9MhSCIqk9IVIg4ZEhio8qh9BgyOjFVVpUGQMtUfWorbIOrT8Pf9p
+LTbAf/y14D1UWf3Ucy+kG9x3YLu7AHa7z8IB9y+Q494NR90b4bh7JZxwz4eT7mmqHQnH3AlwxN1R
++bSETHdj2OKuA2vcUbDU7YB5bgnT3GVkjPshGeS+Tbq6r5O33QXEcueTOu480s+ZR7a9kEd4UI74
+KjhH/ODIEdsUOY5sccFxWNx2HBTIuV+84Nwrqjgzhde5Q7RzbhDDnOki1ZkmfnbOEEecY0WRc4Cg
+oZ1EpdDmIi60rng7tKLoFVrGE0ML+LPQhpy6anPpqsKDXBV5iCuIh7ood7uesIquW8zjylftcRbq
+2sOCXRuY7lrOiGseexI6nd0KTWJ5oSNYSegnzOnqy+q4urNmrvbsA9dbbKjrVZbiasgWumLYeldF
+tt8l2VnXE1rsukbLXLk02L2PVnavo+W57OWoyCs4pnJwzOWPQpbwopDV/FzIJv5ryFaeHbKD7wnJ
+4NtCdvN1IXt5esg+/l1IFp+r+PyFLN4g5Dhr4jjOWjp+Ze86TrFOjrOsu+MS6+0oZAmOYtbf8YAN
+cDxTED7AwXh/h+T9HAZPcFTgfRwh/GNHKC+Pf8JZl37hnEXHO9Pop8502se5nnZ0bqdtnRn0Dece
++qozi8Y7D9C6zkM0xnmYRjqzqVPxJCSbLnUUwTpnEWxzXoc9zmI45LwLR50P4aSzFM44KT3vNOgF
+Z6jCo/oR9Jwzmp51VqVnnDH0tLMWPeWsQ8vj/9NqvPXnyTgeDUOzzX+TieZR8pl5jPQ3j5Pu5gny
+nplLWppniWleJA3MPFLTvEoqmTeJw7xHdPMxQWYZeRTgcDsQBIUBF1wMVILcQA04GqgHhwKNYG/g
+NdgZaA1bAh1gQ6AnrA0MhB8DiZAeSIblgVmwNLAAvg+sVGyAxYEM1eYoTqv5K8p+R/mVKH9B1wZC
+6IZAJN0SqEF3Brx0byBADwVa0KOBNjQ30JFeDPSghYEEejswhD4KJFJkJlHdnEwd5gxayUylNc1v
+aAMzjZrm97SluYy+Z6bT7uYq2t9cTT8z19CJ5lo6W5Gm+EGNN6n5TGXPUX65yj9fPXdLPf9YrUOs
+VGpYM6jLmkyjrSRay0qk9a0htLGVQJtaPWhLqyNta7WhHawWtIsVoB9ZXtrXqkEHWpF0iBVCh1uC
+JlolMNq6A2OsKzDOOg1JVo4iQ7FBjVeq+QXKPgsSrWQYbiXCEGsgDLR6Ql+rA3xktYYu1mvQwWoE
+ba160NKqAU2tStDYckF9KwhqWRyirTLish4Tw7pHiHWTPFa63VL65Ssdc5WeOUrXTKXvJqXzD0rv
+NKV7uf5fmt/SSYpR5nw62JxHe5lf087mHNrGnE2bq1z6zanUa05U+UyiUeYo6jKH0yBzMOVmX/pM
+afAo0JneCbSjRYFWND/QlF4INFb61KfHAzXpkUAlpVkozQrY6J4AohmBh6o2bsD2wGXYFjgFWwPZ
+igzFRjVOV/MLlT0VMgIpsCcwBrICw1RNqTMw0A2OB9qrOmsN5wPNIC/gh2uBBqoGa8PDQFV4FogA
+ZrrAblYAlykhyqRQ03xG6ptPid98QJqr2m1j3iKdzBukl1lEBqvcjDILySSzQL1/gcpFAVmpxuvV
+/E5lP6j8jiv/8+q5QvX8E1XzNktCuMr3i1Y18FkNoJnVDNpY7ZUmCdDVGqM0SoXe1kLoY6UrNijd
+MlR7WHFSzf+m7Degh/VQ+SL6gaWrWnHSt1WNNLMaUctqSn3Wm6qm3qUvWp1puNWX2qzhqu5G0Scq
+77dV/guVDueVHseVLgeVPjuVTuuVXiuVbmlKv3Id/+kZMBv9cQbUKP8eYyVBmfkZPDMHQan5MTw1
+u8IjswPcN9vCbbMVXDebwxWzCVwwTThpNoIjZjzsMxvCNrMBrDW9sFTR6Dmt6TvPOQwLFHdU32a1
+ppvNbMgyD8Kv5l44Y2bCJXMHFJhb1bob1fprVZxVKt4yFXcR/G7OU/uYrfaTAuX7mmlugnee8zos
+VqxWbDVbqvVaw1GzndpPe7VmZ7W3bnDZ7KX22Q8KzU/gqnqfq+Y4RYqKNRvyzbkqbhqcM5fAKXMF
+HFMxs82f1HushZ3mOthkroc1aj+LVKzymP+dx+f/qED/A5umANO+GAAA
+</w:binData><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:99pt;height:22.5pt" fillcolor="window"><v:imagedata src="wordml://08000001.wmz" o:title=""/></v:shape></w:pict></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="7344" w:type="dxa"/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRPr="00B336CA" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Header"/><w:rPr><w:sz w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:ftr w:type="odd"><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/><w:rPr><w:sz w:val="16"/></w:rPr></w:pPr><w:r><w:t>Page </w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00656363"><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:t> of </w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> NUMPAGES </w:instrText></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00E56992"><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:rPr><w:sz w:val="16"/></w:rPr><w:t>.</w:t></w:r></w:p></w:ftr><w:hdr w:type="first"><w:tbl><w:tblPr><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="0" w:color="auto"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:left w:w="72" w:type="dxa"/><w:right w:w="72" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="2160"/><w:gridCol w:w="7344"/></w:tblGrid><w:tr wsp:rsidR="0006676C"><w:trPr><w:trHeight w:h-rule="exact" w:val="560"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2160" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0067073F"><w:r><w:rPr><w:noProof/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:99pt;height:22.5pt" fillcolor="window"><v:imagedata src="wordml://08000001.wmz" o:title=""/></v:shape></w:pict></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="7344" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRPr="004E0CD9" wsp:rsidRDefault="0006676C"><w:pPr><w:jc w:val="right"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="0006676C" wsp:rsidRPr="004E0CD9" wsp:rsidRDefault="0006676C"><w:pPr><w:jc w:val="center"/></w:pPr></w:p></w:hdr><w:ftr w:type="first"><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r><w:t>Page </w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:t> of </w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> NUMPAGES </w:instrText></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/></w:rPr><w:t>7</w:t></w:r><w:r wsp:rsidR="0067073F"><w:fldChar w:fldCharType="end"/></w:r></w:p><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r wsp:rsidRPr="004E0CD9"><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr><w:t>Uncontrolled when printed. Verify with current online version before use.</w:t></w:r></w:p></w:ftr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="900" w:right="1440" w:bottom="1440" w:left="1440" w:header="360" w:footer="360" w:gutter="0"/><w:cols w:space="720"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.define/support/Monster_Process_Template.xml b/org.eclipse.osee.define/support/Monster_Process_Template.xml
new file mode 100644
index 00000000000..ee449130e22
--- /dev/null
+++ b/org.eclipse.osee.define/support/Monster_Process_Template.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>PRC-013</o:Title><o:Author>Tim Ruchal</o:Author><o:LastAuthor>Ryan D. Brooks</o:LastAuthor><o:Revision>7</o:Revision><o:TotalTime>15</o:TotalTime><o:Created>2007-10-05T05:07:00Z</o:Created><o:LastSaved>2007-10-05T05:27:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>7</o:Words><o:Characters>42</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>48</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font><w:font w:name="Times"><w:panose-1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:pitch w:val="variable"/><w:sig w:usb-0="20007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="Arial Narrow"><w:panose-1 w:val="020B0506020202030204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font><w:font w:name="Arial Black"><w:panose-1 w:val="020B0A04020102020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="FFFFFF7D"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="D2C2EE9C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="ListNumber4"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="FFFFFF7E"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="B080D0D4"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ListNumber3"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="FFFFFF7F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="98D47242"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="ListNumber2"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="FFFFFF81"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="61C67D48"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet4"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="FFFFFF82"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="42B80BB2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet3"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="FFFFFF83"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="62FA69AA"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet2"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="FFFFFF88"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="2166BC06"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ListNumber"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="03725C9F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="99A84B58"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="BulletFormat"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="144" w:hanging="144"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="06B75B61"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FFF62DE0"/><w:lvl w:ilvl="0" w:tplc="E070CF86"><w:start w:val="8"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="072717B8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C936A362"/><w:lvl w:ilvl="0" w:tplc="245427B2"><w:start w:val="2"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="0A6329F4"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="F200A1C6"/><w:lvl w:ilvl="0" w:tplc="71A0A7B0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="0EA863D8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="18221CCE"/><w:lvl w:ilvl="0" w:tplc="80469134"><w:start w:val="1"/><w:pStyle w:val="EntryCriteriaList"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="0EF755E3"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="7F76350E"/><w:lvl w:ilvl="0" w:tplc="4022B27A"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="C5BE7E94"><w:start w:val="1"/><w:lvlText w:val="(%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="107D44D7"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="82AC7DE8"/><w:lvl w:ilvl="0" w:tplc="A94E8C0A"><w:start w:val="3"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="13084F98"/><w:plt w:val="Multilevel"/><w:tmpl w:val="1396C2BA"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2232"/></w:tabs><w:ind w:left="2448" w:hanging="288"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="17C64AD8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="ADF6529E"/><w:lvl w:ilvl="0" w:tplc="1498894E"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="61DA6A54"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="1C53503C"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C8FE44C4"/><w:lvl w:ilvl="0" w:tplc="7134413C"><w:start w:val="4"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="203F4D3B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="64520FE2"/><w:lvl w:ilvl="0" w:tplc="BB647B0A"><w:start w:val="4"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="DD70D388"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1620"/></w:tabs><w:ind w:left="1620" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/><w:color w:val="0000FF"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="26E14A05"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="048A7BE8"/><w:lvl w:ilvl="0" w:tplc="13DEACEA"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:b w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="2A7F08D7"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9B020B9A"/><w:lvl w:ilvl="0" w:tplc="6002B546"><w:start w:val="1"/><w:lvlText w:val="(%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="2F947FDA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D2940E28"/><w:lvl w:ilvl="0" w:tplc="CD4C8BD8"><w:start w:val="6"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="337306F5"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3A54FA94"/><w:lvl w:ilvl="0" w:tplc="D6F87804"><w:start w:val="5"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3E033D04"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="7EAE3F68"/><w:lvl w:ilvl="0" w:tplc="88547B1C"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="3FD226DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="48041F90"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="111Heading3Arial"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="424D3EEA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9460B27A"/><w:lvl w:ilvl="0" w:tplc="08027870"><w:start w:val="2"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="4A916088"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="67689220"/><w:lvl w:ilvl="0" w:tplc="A650C57A"><w:start w:val="4"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="E16EF644"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="4F7A415B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="A52E5718"/><w:lvl w:ilvl="0" w:tplc="0F1AD638"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="9AC2A26C"><w:start w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="4F8F5FED"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="904088DA"/><w:lvl w:ilvl="0" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="4FC5049F"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="2E724A8A"/><w:lvl w:ilvl="0" w:tplc="1B249476"><w:start w:val="9"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="5250189A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="C26C3964"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:b w:val="off"/><w:b-cs w:val="off"/><w:i-cs w:val="off"/><w:caps w:val="off"/><w:smallCaps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:noProof w:val="off"/><w:vanish w:val="off"/><w:spacing w:val="0"/><w:kern w:val="0"/><w:position w:val="0"/><w:u w:val="none"/><w:vertAlign w:val="baseline"/><w:em w:val="none"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="792" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1224" w:hanging="504"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1728" w:hanging="648"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2232" w:hanging="792"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="2736" w:hanging="936"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3240" w:hanging="1080"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="3744" w:hanging="1224"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="4320" w:hanging="1440"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="535525EE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="529CC2FE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="564D1983"/><w:plt w:val="Multilevel"/><w:tmpl w:val="8C9E3592"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:color w:val="0000FF"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="58405D94"/><w:plt w:val="Multilevel"/><w:tmpl w:val="71EE2BB8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="StyleHeading3sor3Arial10pt"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="592368AC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="BFFCBB4E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2700"/></w:tabs><w:ind w:left="2700" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="5B97790F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="F9EA1966"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ActivityStep"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="5CC70362"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DEDE73B0"/><w:lvl w:ilvl="0" w:tplc="AC4C51BC"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2232"/></w:tabs><w:ind w:left="2448" w:hanging="288"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:color w:val="0000FF"/><w:sz w:val="24"/><w:sz-cs w:val="16"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="5DC63416"/><w:plt w:val="Multilevel"/><w:tmpl w:val="87949AC8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="600A3C5E"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="25DE13EE"/><w:lvl w:ilvl="0" w:tplc="F6E2D446"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="38"><w:lsid w:val="62D56365"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C9348A14"/><w:lvl w:ilvl="0" w:tplc="9896478E"><w:start w:val="1"/><w:nfc w:val="255"/><w:lvlText w:val="a."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="39"><w:lsid w:val="65855DE2"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DE0AA980"/><w:lvl w:ilvl="0" w:tplc="2E38985A"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="40"><w:lsid w:val="67C126D1"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3312930A"/><w:lvl w:ilvl="0" w:tplc="E9423BAC"><w:start w:val="1"/><w:pStyle w:val="InputsTableText"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="41"><w:lsid w:val="6B8B7708"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="801C1E8A"/><w:lvl w:ilvl="0" w:tplc="A3380E3E"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="6D721AB8"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="42"><w:lsid w:val="6B96217A"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="EA66CD60"/><w:lvl w:ilvl="0" w:tplc="A8F07A78"><w:start w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="F6E2D446"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="D6F87804"><w:start w:val="5"/><w:nfc w:val="3"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="43"><w:lsid w:val="6C926103"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="ABA0AFD2"/><w:lvl w:ilvl="0" w:tplc="4A52B692"><w:start w:val="1"/><w:lvlText w:val="(%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="44"><w:lsid w:val="70D55EB0"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D078130C"/><w:lvl w:ilvl="0" w:tplc="27EAA568"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="45"><w:lsid w:val="7147056B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="E5D260F6"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="30"/></w:list><w:list w:ilfo="2"><w:ilst w:val="30"/></w:list><w:list w:ilfo="3"><w:ilst w:val="36"/></w:list><w:list w:ilfo="4"><w:ilst w:val="36"/></w:list><w:list w:ilfo="5"><w:ilst w:val="32"/></w:list><w:list w:ilfo="6"><w:ilst w:val="23"/></w:list><w:list w:ilfo="7"><w:ilst w:val="1"/></w:list><w:list w:ilfo="8"><w:ilst w:val="0"/></w:list><w:list w:ilfo="9"><w:ilst w:val="45"/></w:list><w:list w:ilfo="10"><w:ilst w:val="18"/></w:list><w:list w:ilfo="11"><w:ilst w:val="34"/></w:list><w:list w:ilfo="12"><w:ilst w:val="2"/></w:list><w:list w:ilfo="13"><w:ilst w:val="42"/></w:list><w:list w:ilfo="14"><w:ilst w:val="21"/></w:list><w:list w:ilfo="15"><w:ilst w:val="24"/></w:list><w:list w:ilfo="16"><w:ilst w:val="9"/></w:list><w:list w:ilfo="17"><w:ilst w:val="10"/></w:list><w:list w:ilfo="18"><w:ilst w:val="8"/></w:list><w:list w:ilfo="19"><w:ilst w:val="37"/></w:list><w:list w:ilfo="20"><w:ilst w:val="16"/></w:list><w:list w:ilfo="21"><w:ilst w:val="13"/></w:list><w:list w:ilfo="22"><w:ilst w:val="15"/></w:list><w:list w:ilfo="23"><w:ilst w:val="20"/></w:list><w:list w:ilfo="24"><w:ilst w:val="26"/></w:list><w:list w:ilfo="25"><w:ilst w:val="41"/></w:list><w:list w:ilfo="26"><w:ilst w:val="27"/></w:list><w:list w:ilfo="27"><w:ilst w:val="25"/></w:list><w:list w:ilfo="28"><w:ilst w:val="12"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="22"/></w:list><w:list w:ilfo="31"><w:ilst w:val="28"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="33"><w:ilst w:val="5"/></w:list><w:list w:ilfo="34"><w:ilst w:val="4"/></w:list><w:list w:ilfo="35"><w:ilst w:val="3"/></w:list><w:list w:ilfo="36"><w:ilst w:val="40"/></w:list><w:list w:ilfo="37"><w:ilst w:val="11"/></w:list><w:list w:ilfo="38"><w:ilst w:val="39"/></w:list><w:list w:ilfo="39"><w:ilst w:val="31"/></w:list><w:list w:ilfo="40"><w:ilst w:val="33"/></w:list><w:list w:ilfo="41"><w:ilst w:val="44"/></w:list><w:list w:ilfo="42"><w:ilst w:val="38"/></w:list><w:list w:ilfo="43"><w:ilst w:val="17"/></w:list><w:list w:ilfo="44"><w:ilst w:val="14"/></w:list><w:list w:ilfo="45"><w:ilst w:val="35"/></w:list><w:list w:ilfo="46"><w:ilst w:val="43"/></w:list><w:list w:ilfo="47"><w:ilst w:val="7"/></w:list><w:list w:ilfo="48"><w:ilst w:val="29"/></w:list><w:list w:ilfo="49"><w:ilst w:val="6"/></w:list><w:list w:ilfo="50"><w:ilst w:val="6"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00D5512A"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1CharCharChar"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:listPr><w:ilfo w:val="48"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="CharChar2"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading4"/><w:spacing w:before="60"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><w:aliases w:val="1.1.1.1.1 Heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00C255B3"/><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="6"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i-cs/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00C255B3"/><w:pPr><w:pStyle w:val="Heading6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="6"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:spacing w:before="60"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:spacing w:before="40" w:after="40"/><w:jc w:val="center"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i/><w:color w:val="FF0000"/><w:sz w:val="20"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading9"/><w:widowControl w:val="off"/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="AppTitle"><w:name w:val="App Title"/><w:autoRedefine/><w:rsid w:val="00726BB4"/><w:pPr><w:pStyle w:val="AppTitle"/><w:keepNext/><w:keepLines/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="232" w:after="360" w:line="288" w:line-rule="at-least"/><w:jc w:val="center"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00726BB4"/><w:pPr><w:pStyle w:val="TOC1"/><w:spacing w:before="360" w:after="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading3sor3Arial10pt"><w:name w:val="Style Heading 3sor3 + Arial 10 pt"/><w:basedOn w:val="Heading3"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="StyleHeading3sor3Arial10pt"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="5"/></w:listPr></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="111Heading3Arial"><w:name w:val="1.1.1 Heading 3 + Arial"/><w:basedOn w:val="Heading2"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="111Heading3Arial"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:jc w:val="right"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:i/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TI"><w:name w:val="TI"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="TI"/><w:spacing w:line="360" w:line-rule="exact"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U1"><w:name w:val="U1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="U1"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockDate"><w:name w:val="LockDate"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockDate"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockInfo"><w:name w:val="LockInfo"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockInfo"/><w:spacing w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D5512A"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockHead"><w:name w:val="LockHead"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockHead"/><w:keepNext/><w:spacing w:before="480" w:line="240" w:line-rule="exact"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="00D5512A"/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue2"><w:name w:val="List Continue 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListContinue2"/><w:spacing w:after="120"/><w:ind w:left="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue3"><w:name w:val="List Continue 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListContinue3"/><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber2"><w:name w:val="List Number 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber2"/><w:listPr><w:ilfo w:val="12"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:listPr><w:ilfo w:val="7"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber4"><w:name w:val="List Number 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber4"/><w:listPr><w:ilfo w:val="8"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ActivityStep"><w:name w:val="ActivityStep"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ActivityStep"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="720"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:link w:val="CharChar"/><w:autoRedefine/><w:rsid w:val="00F04366"/><w:pPr><w:pStyle w:val="BodyText"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SubHeaderText"><w:name w:val="SubHeader Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="SubHeaderText"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue4"><w:name w:val="List Continue 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListContinue4"/><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DI-XXX"><w:name w:val="DI-XXX"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="DI-XXX"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ProcessTitle"><w:name w:val="ProcessTitle"/><w:basedOn w:val="Normal"/><w:next w:val="SubHeader"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ProcessTitle"/><w:spacing w:before="360" w:after="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DI-XXXDate"><w:name w:val="DI-XXX Date"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="DI-XXXDate"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SubHeader"><w:name w:val="SubHeader"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="SubHeader"/><w:keepNext/><w:spacing w:before="480" w:after="240"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="InputsTableHeaders"><w:name w:val="Inputs Table Headers"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="InputsTableHeaders"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet2"><w:name w:val="List Bullet 2"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet2"/><w:listPr><w:ilfo w:val="33"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet3"><w:name w:val="List Bullet 3"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet3"/><w:listPr><w:ilfo w:val="34"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet4"><w:name w:val="List Bullet 4"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet4"/><w:listPr><w:ilfo w:val="35"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="0000FF"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ActivityText"><w:name w:val="ActivityText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ActivityText"/><w:spacing w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="InputsTableText"><w:name w:val="Inputs Table Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="InputsTableText"/><w:listPr><w:ilfo w:val="36"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="EntryCriteriaList"><w:name w:val="Entry Criteria List"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="EntryCriteriaList"/><w:listPr><w:ilfo w:val="37"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Achievement"><w:name w:val="Achievement"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Achievement"/><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="245" w:hanging="245"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BlockQuotation"><w:name w:val="Block Quotation"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BlockQuotation"/><w:pBdr><w:top w:val="single" w:sz="12" wx:bdrwidth="30" w:space="12" w:color="FFFFFF"/><w:left w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/><w:right w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/></w:pBdr><w:shd w:val="pct-5" w:color="auto" w:fill="auto" wx:bgcolor="F2F2F2"/><w:spacing w:after="240" w:line="220" w:line-rule="at-least"/><w:ind w:left="1368" w:right="240"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial Narrow" w:h-ansi="Arial Narrow"/><wx:font wx:val="Arial Narrow"/><w:spacing w:val="-5"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText3"><w:name w:val="Body Text 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyText3"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent"><w:name w:val="Body Text Indent"/><w:basedOn w:val="Normal"/><w:link w:val="BodyTextIndentChar"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyTextIndent"/><w:spacing w:before="60"/><w:ind w:left="43"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent2"><w:name w:val="Body Text Indent 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyTextIndent2"/><w:spacing w:before="60" w:after="120" w:line="480" w:line-rule="auto"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent3"><w:name w:val="Body Text Indent 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyTextIndent3"/><w:ind w:left="900" w:hanging="540"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="BodyTextIndentChar"><w:name w:val="Body Text Indent Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyTextIndent"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BulletFormat"><w:name w:val="Bullet Format"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BulletFormat"/><w:listPr><w:ilfo w:val="47"/></w:listPr><w:spacing w:line="240" w:line-rule="at-least"/><w:ind w:right="392"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:snapToGrid w:val="off"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar"><w:name w:val="Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyText"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar2"><w:name w:val="Char Char2"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading2"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CMMIREF"><w:name w:val="CMMI REF"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="CMMIREF"/><w:framePr w:hspace="187" w:vspace="187" w:wrap="around" w:vanchor="text" w:hanchor="text" w:y="1"/><w:spacing w:line="233" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Emphasis"><w:name w:val="Emphasis"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial Black" w:h-ansi="Arial Black"/><w:spacing w:val="-4"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00477B73"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeaderOdd"><w:name w:val="HeaderOdd"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="HeaderOdd"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1CharCharChar"><w:name w:val="Heading 1 Char Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading1"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1CharChar"><w:name w:val="Heading 1 Char Char"/><w:aliases w:val="Heading 1 Char1 Char1 Char,Heading 1 Char Char Char Char,Heading 1 Char1 Char1 Char Char Char,Heading 1 Char Char Char1 Char Char Char,Heading 1 Char1 Char Char Char Char Char,Heading 1 Char Char Char Char Char Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="list-bullet"><w:name w:val="list-bullet"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="list-bullet"/><w:keepLines/><w:tabs><w:tab w:val="list" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4680"/></w:tabs><w:spacing w:line="255" w:line-rule="at-least"/><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ManualHeading"><w:name w:val="Manual Heading"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="ManualHeading"/><w:tabs><w:tab w:val="right" w:pos="9270"/></w:tabs><w:ind w:left="86"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i/><w:noProof/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="MetricName"><w:name w:val="MetricName"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="MetricName"/><w:spacing w:before="0" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:sz w:val="28"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microcaption"><w:name w:val="micro:caption"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="microcaption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/></w:tabs><w:spacing w:before="41" w:after="43" w:line="222" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times" w:h-ansi="Times"/><wx:font wx:val="Times"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="NormalWeb"><w:name w:val="Normal (Web)"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="NormalWeb"/><w:spacing w:before="100" w:before-autospacing="on" w:after="100" w:after-autospacing="on"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="000000"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00477B73"/><w:rPr><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Paragraph"><w:name w:val="Paragraph"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Paragraph"/><w:widowControl w:val="off"/><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SECTIONS"><w:name w:val="SECTIONS"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="SECTIONS"/><w:tabs><w:tab w:val="list" w:pos="720"/><w:tab w:val="left" w:pos="7200"/></w:tabs><w:spacing w:before="115" w:line="287" w:line-rule="auto"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:i-cs/><w:sz w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleArial10ptNotItalicBoxSinglesolidlineAuto05"><w:name w:val="Style Arial 10 pt Not Italic Box: (Single solid line Auto 0.5..."/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="StyleArial10ptNotItalicBoxSinglesolidlineAuto05"/><w:pBdr><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/></w:pBdr><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading1Left0Firstline0"><w:name w:val="Style Heading 1 + Left: 0&quot; First line: 0&quot;"/><w:basedOn w:val="Heading1"/><w:next w:val="Heading1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="StyleHeading1Left0Firstline0"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style1"><w:name w:val="Style1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Style1Char"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style1"/><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:i/><w:color w:val="008000"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style1Char"><w:name w:val="Style1 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Style1"/><w:rsid w:val="00477B73"/><w:rPr><w:i/><w:color w:val="008000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style2"><w:name w:val="Style2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style2"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style3"><w:name w:val="Style3"/><w:basedOn w:val="Style1"/><w:next w:val="Style1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style3"/><w:tabs><w:tab w:val="clear" w:pos="0"/><w:tab w:val="left" w:pos="360"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style4"><w:name w:val="Style4"/><w:basedOn w:val="Heading1"/><w:link w:val="Style4Char"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style4"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="360"/></w:tabs><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style4Char"><w:name w:val="Style4 Char"/><w:basedOn w:val="Heading1CharCharChar"/><w:link w:val="Style4"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style5"><w:name w:val="Style5"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style5"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:i/><w:color w:val="008000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style6"><w:name w:val="Style6"/><w:basedOn w:val="Heading2"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style6"/><w:spacing w:after="40"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style7"><w:name w:val="Style7"/><w:basedOn w:val="Heading2"/><w:link w:val="Style7Char"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style7"/><w:spacing w:after="40"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style7Char"><w:name w:val="Style7 Char"/><w:basedOn w:val="CharChar2"/><w:link w:val="Style7"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:snapToGrid w:val="off"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableContents"><w:name w:val="Table Contents"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TableContents"/><w:spacing w:before="40" w:after="40"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableHeaders"><w:name w:val="Table Headers"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TableHeaders"/><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:b/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableHeaders1"><w:name w:val="Table Headers1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TableHeaders1"/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:b/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitleCenteredNoTOC"><w:name w:val="Title Centered No TOC"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TitleCenteredNoTOC"/><w:spacing w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TOC2"/><w:tabs><w:tab w:val="right" w:pos="7920"/></w:tabs><w:spacing w:before="60"/><w:ind w:left="240"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BL"><w:name w:val="BL"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="BL"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ET"><w:name w:val="ET"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="ET"/><w:spacing w:after="240" w:line="240" w:line-rule="exact"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Exhibit"><w:name w:val="Exhibit"/><w:basedOn w:val="ET"/><w:next w:val="ET"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="Exhibit"/><w:spacing w:before="360" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockAuth"><w:name w:val="LockAuth"/><w:basedOn w:val="LockInfo"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="LockAuth"/><w:keepNext/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockIndent"><w:name w:val="LockIndent"/><w:basedOn w:val="U1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="LockIndent"/><w:tabs><w:tab w:val="left" w:pos="2448"/><w:tab w:val="left" w:pos="2736"/><w:tab w:val="left" w:pos="3024"/><w:tab w:val="left" w:pos="3312"/></w:tabs><w:ind w:left="2448" w:hanging="1728"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N1"><w:name w:val="N1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N1"/><w:keepNext/><w:spacing w:before="480" w:line="240" w:line-rule="exact"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N2"><w:name w:val="N2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N2"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="1440" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N3"><w:name w:val="N3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N3"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2160" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N4"><w:name w:val="N4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N4"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2880" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N5"><w:name w:val="N5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N5"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="3600" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N6"><w:name w:val="N6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N6"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="4320" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U6"><w:name w:val="U6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U6"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="4320"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N7"><w:name w:val="N7"/><w:basedOn w:val="U6"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N7"/><w:ind w:left="5040" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="R2"><w:name w:val="R2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="R2"/><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:line="240" w:line-rule="exact"/><w:ind w:left="1440" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StepBody"><w:name w:val="Step Body"/><w:basedOn w:val="U1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StepBody"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StepTitle"><w:name w:val="Step Title"/><w:basedOn w:val="N1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StepTitle"/><w:spacing w:before="240"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StepTitleBookmark"><w:name w:val="Step Title Bookmark"/><w:basedOn w:val="N1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StepTitleBookmark"/><w:spacing w:before="240"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText"><w:name w:val="Table Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="TableText"/><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U0"><w:name w:val="U0"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U0"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U2"><w:name w:val="U2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U2"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U3"><w:name w:val="U3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U3"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U4"><w:name w:val="U4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U4"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U5"><w:name w:val="U5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U5"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="3600"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U7"><w:name w:val="U7"/><w:basedOn w:val="N7"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U7"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="ListNumber"/><w:listPr><w:ilfo w:val="50"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading3CustomColorRGB01530"><w:name w:val="Style Heading 3 + Custom Color(RGB(01530))"/><w:basedOn w:val="Heading3"/><w:link w:val="StyleHeading3CustomColorRGB01530Char"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StyleHeading3CustomColorRGB01530"/><w:keepNext w:val="off"/><w:spacing w:before="360" w:after="240"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="009900"/><w:sz w:val="27"/><w:sz-cs w:val="27"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="StyleHeading3CustomColorRGB01530Char"><w:name w:val="Style Heading 3 + Custom Color(RGB(01530)) Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="StyleHeading3CustomColorRGB01530"/><w:rsid w:val="00AD42A7"/><w:rPr><w:b/><w:b-cs/><w:color w:val="009900"/><w:sz w:val="27"/><w:sz-cs w:val="27"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="UncontrolledLegend"><w:name w:val="UncontrolledLegend"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="UncontrolledLegend"/><w:shd w:val="clear" w:color="auto" w:fill="000000"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="FFFFFF"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="6147"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="6147"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:separator/></w:r></w:p></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:continuationSeparator/></w:r></w:p></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:separator/></w:r></w:p></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:continuationSeparator/></w:r></w:p></w:endnote></w:endnotePr><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00D5512A"/><wsp:rsid wsp:val="00037F82"/><wsp:rsid wsp:val="00063F94"/><wsp:rsid wsp:val="0006676C"/><wsp:rsid wsp:val="00085C9A"/><wsp:rsid wsp:val="000C301A"/><wsp:rsid wsp:val="00107625"/><wsp:rsid wsp:val="00124150"/><wsp:rsid wsp:val="00134923"/><wsp:rsid wsp:val="001A3D31"/><wsp:rsid wsp:val="00254BAB"/><wsp:rsid wsp:val="00257C98"/><wsp:rsid wsp:val="002832E6"/><wsp:rsid wsp:val="002F2CE3"/><wsp:rsid wsp:val="003500CD"/><wsp:rsid wsp:val="0039105C"/><wsp:rsid wsp:val="00395B38"/><wsp:rsid wsp:val="003F64F1"/><wsp:rsid wsp:val="0040292B"/><wsp:rsid wsp:val="00431BFE"/><wsp:rsid wsp:val="00477A26"/><wsp:rsid wsp:val="00477B73"/><wsp:rsid wsp:val="004A0884"/><wsp:rsid wsp:val="004B078D"/><wsp:rsid wsp:val="004B6FB5"/><wsp:rsid wsp:val="004C2D82"/><wsp:rsid wsp:val="005101A6"/><wsp:rsid wsp:val="00524B7F"/><wsp:rsid wsp:val="00601FE5"/><wsp:rsid wsp:val="00616CBF"/><wsp:rsid wsp:val="00622A53"/><wsp:rsid wsp:val="0067073F"/><wsp:rsid wsp:val="00695A6B"/><wsp:rsid wsp:val="006C5728"/><wsp:rsid wsp:val="006E487A"/><wsp:rsid wsp:val="006F6EB1"/><wsp:rsid wsp:val="00712A1B"/><wsp:rsid wsp:val="007167C7"/><wsp:rsid wsp:val="00726BB4"/><wsp:rsid wsp:val="00741F62"/><wsp:rsid wsp:val="00751DA7"/><wsp:rsid wsp:val="007648A1"/><wsp:rsid wsp:val="007724E1"/><wsp:rsid wsp:val="00772551"/><wsp:rsid wsp:val="007830FA"/><wsp:rsid wsp:val="007D2BC6"/><wsp:rsid wsp:val="007D396A"/><wsp:rsid wsp:val="008F48E4"/><wsp:rsid wsp:val="009371C9"/><wsp:rsid wsp:val="009535A2"/><wsp:rsid wsp:val="009C1A9A"/><wsp:rsid wsp:val="009E2024"/><wsp:rsid wsp:val="009E474A"/><wsp:rsid wsp:val="00A01B71"/><wsp:rsid wsp:val="00A15EC8"/><wsp:rsid wsp:val="00A86F92"/><wsp:rsid wsp:val="00AB12F4"/><wsp:rsid wsp:val="00AD42A7"/><wsp:rsid wsp:val="00AE4453"/><wsp:rsid wsp:val="00B04CC0"/><wsp:rsid wsp:val="00B144F5"/><wsp:rsid wsp:val="00B54F1E"/><wsp:rsid wsp:val="00BE381E"/><wsp:rsid wsp:val="00C0606A"/><wsp:rsid wsp:val="00C255B3"/><wsp:rsid wsp:val="00C361FB"/><wsp:rsid wsp:val="00D01E4D"/><wsp:rsid wsp:val="00D5512A"/><wsp:rsid wsp:val="00DD42DF"/><wsp:rsid wsp:val="00E16630"/><wsp:rsid wsp:val="00E2349C"/><wsp:rsid wsp:val="00E278A0"/><wsp:rsid wsp:val="00E77578"/><wsp:rsid wsp:val="00E8356E"/><wsp:rsid wsp:val="00EA0B8B"/><wsp:rsid wsp:val="00EA3126"/><wsp:rsid wsp:val="00EB1DC9"/><wsp:rsid wsp:val="00F04366"/><wsp:rsid wsp:val="00F66698"/><wsp:rsid wsp:val="00F67DCA"/><wsp:rsid wsp:val="00FE0437"/></wsp:rsids></w:docPr><w:body><wx:sect><ns0:Artifact><w:p wsp:rsidR="00254BAB" wsp:rsidRPr="00741F62" wsp:rsidRDefault="005101A6" wsp:rsidP="00741F62"><Set_Name><w:proofErr w:type="spellStart"/><w:r wsp:rsidR="00431BFE"><w:t>Default</w:t></w:r></Set_Name><Attribute><Name><w:r wsp:rsidR="00431BFE" wsp:rsidRPr="00A34EA3"><w:t>Name</w:t></w:r></Name><Format><w:r wsp:rsidR="00431BFE" wsp:rsidRPr="00A34EA3"><w:rPr><w:b/></w:rPr><w:t>x</w:t></w:r></Format></Attribute><Attribute><Name><w:r wsp:rsidR="00431BFE"><w:t>Word</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidR="00431BFE"><w:t> Formatted Content</w:t></w:r></Name></Attribute></w:p></ns0:Artifact><w:sectPr wsp:rsidR="00254BAB" wsp:rsidRPr="00741F62" wsp:rsidSect="00B144F5"><w:hdr w:type="odd"><w:tbl><w:tblPr><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="0" w:color="auto"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:left w:w="72" w:type="dxa"/><w:right w:w="72" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="2160"/><w:gridCol w:w="7344"/></w:tblGrid><w:tr wsp:rsidR="0006676C"><w:trPr><w:trHeight w:h-rule="exact" w:val="560"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2160" w:type="dxa"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="005101A6"><w:pPr><w:pStyle w:val="Header"/><w:jc w:val="left"/></w:pPr><w:r wsp:rsidRPr="005101A6"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><w:binData w:name="wordml://08000001.wmz">H4sIAAAAAAACC42ZeXhNV/fH995rD2efe26kuTf3uhkkpqC0uCS53HtOS9GqKq3W1BpLibEoDYoQ
+Q1BDo6UqVI2pKjW9ZokhpkRfFDGrREIQ42tMI78dHX7P8/7x+/Xm+Tx7WOvstc/6ruxn3yT3yP5v
+EWoislmaUcavAVKf4A8xkgjBewZCFF2g5XNMYSPZrIko7xmkIf6AlRsAa3/a/vIyCEYY/V+2P3ok
+KMn6X2u5P8cYCdX+/nzmr9mXMCrfDXpK2PO5srIyVOVPC/77ufJd+higfrg/mouCZBMtXFbTakqu
+NZDXhCUPiZZylXhXThedZX/RU7YSCbK2GCx18am8zkfKg/xzuZKPlZN4kvxI0UThUeN7bLTMYSPk
+cjZEjmP9ZCfWUzZknWQF1kbeoM3kAeqTy2htOZ5Gyq7ULgO0VAunN7WncEY7C/u17bBeS4OF2liY
+onWHIdpr0EmrAU00A2pqd0mQlkvui10kV6wg28VMskgkkvGiJ+kpWpPVgpBHYjNupg3AqVoVfFk7
+g7xyNpoo30CnVUJWyEg0QvpRc9kJhcpEVKh9g/6lbUZTtNOok/YY1dY8uFT48VHRBS8T4/BnYglu
+JbJwtCjCD7hBTvLf8UZejOfwS3goP4bb8iz8Mt+KbXwtvsaW431sIV7M5uLRbBbuwKbh+mwyNlgy
+LqTjcaZiAp2Am9EpWNBZOBu+xbNhJW4Pm3ElyMZXyW94HXmCPydO0pLUJxXJO+QaHkq24XlkJt5J
+euECEsAVwIX9cBclwFE0H35Gh2EOKoVE5KXdUV/6JvqOxqNcGoNeYB70FgtCKYyjLEYQ4apiFV04
+RiM5oK85Q+u4ho5wGyriwYgKJ4oSYaixiELviRg0WLyEpopYtFSYaKdogU6JNui26IQ07SNUWRuE
+Gmkj0bvaJJSgpaLx2iL0jbYardW2of3aQXRey0X3tEIk5EMUKTmuL924hayJO8sQPFU+Q5vlDVQg
+z6AQ/RCy9K2on/4j+lpfhDL0VHRNn4KCbWOQzzYcdbUNQhNtfVG6rRfKsfVAt2zdULDRFdUzuqE2
+Rg800OiFphl90QpjEMo0RqAzxlh010hBwv4VirB/j+rZ16Km9gzUzn4U9bTnocH2x+hzexCebI/B
+M+2v4q/snfE8+wj8jX2Oatep8b/xLPstnGIPIuPsdcmn9rakj30I6WifQ163byKx9tOksv0psdkj
+4T/GK3DO6AG7jYmw3FgOKcYBSDCuQUtDozWNmpQbr9M8W2+605ZM59m+o5/YttM3bCtpJ9tQOsn2
+Fl1iq0z32O5Bvm0XMGMZhBopUN0YAA2NtvCa0QDeMdzQ1XhKEoyLZJixm4w2lpMJxjQyxRhMphrv
+k2lGgKQYVUmyYZDPjWd4hHEXf2IU4r7GOdzNOIrfNw7gVkYGfsXYjL3GOlzd+BG7jRVYGEvwI9si
+XGhLwyds3+I9tvl4jeJbxSTbAjzYthB3si3GTW3L8Iu2dPyCbQ1+rG/EF/XteK++B6/UD+Pp+gX8
+rn4fh+oeUk9/lbypJ5CeeipJ1HeQGfpV8r3ugPX6q7BH7wCH9UFwTJ8EuXoaXNA3QL6eDdf0fCjW
+S+Cu7qAP9Nr0sd6Mlugf0lJ9OC3TZ1Kk8oRtmYpLimdqLpKV6n5Wondmj/REdl+fy27pG1iRfpTl
+6bfYOV3nv+o1eLb+Gt+jd+Nb9NF8jT6XL9XX8Xl6Np+uF/Cxehn/RPeInrpXtNNbiWb6R6KhPlpU
+0+cIh75KYD1T3Ja54oK8KQ5Jov1LurUlsql2X67TbshYmS8Py3NygH5CHrDtl7XsW+XQoDUyucIK
+aQUvlsnBi2RS8Dfys+BU2Tf4C/lecIr0ByfLiOBx8kmFz+WxColSVkiQtqB2cp/9LTna3lzWswfk
+FcMrvzZqyBZGmHxgs8ultlKtre2mVqqf1Vbp+7UO+lqN6vO0dXKM1k1218rP6Ha4TIvH57QIvEmr
+gJdogGdqj9Ao7Qb6WDuJTG03cmhr0DWxCO0Qc9FyMRPNEikoUYxHPcRo9KYYgRqIIShcDFS/8wno
+Ju+NTvCeaAfvjpbxrmg674KG8g9RZ0UT1RfK9gtLQHPZMNSVjUM12Ux0ny5Gu+hGNJ1mo040H9Wi
+z9BTiMA54MeL4UM8ApJwa1iOYyAHY3iAL5AosoO0IgvJSDKOpJNe5Iwa6RBLLKhMhkIFshIQuQCq
+ouh13Jrm4cn0ojovL+DLCswu4SrsMm7KruAe7Boez4rVGXsfZ7Cn+AIjpITpxMOdJI5XIu14TfIJ
+b0i+4K+SdN6aDOZJan4DKWVXyX4WAbNZW+jMJkEM2w736F3IpDXoTNqFdqVf0ZfpYVoGmB0DH1sO
+g9lIWMHawAVWHZz8d9KKnyQT+FqylU8lt3lvEiOakg9FNEkVZfiA+A3/Lnbj+toy3FtLwfO1gfjI
+c52+4Dt5kXhLnhLd5R4xTP4kJsv54huZLFbJQWK77ChyZBNxXr4obkiHeCpLuNTzuVs/zKvp63l9
+/Rtu6uP4G3pvrmqWd9Hr8z66S9VxCUvUL7EkfR+boqezGfoXbI4+mM3T27E0PY59p3vYEr2ELtMv
+0uV6piJdMVuNE+lSvQf9XvfSNJ3Sr/Vi+FI/BTP0DJii/wAT9DEwQn8H+ug1oKNeSlroJ0gDfTWp
+pE8imt6N3JGNSK4MJTvli2SmfIV0le3JS3IQKdFSyCFtKflayyTdtYuktlZKHohKsEu8CpPFR/C2
+mAKh4ic4x0/A97wUPuYxtDZ/h95mY+gGtop+xs7QxkxjpbQRy6D92QS6iDWjxxmngh8Ei0+D4bwV
+/MTtcJX/m1QWXxJLLCOdxRYyQhwhs0U+WSWekH0iGM6LmvAf0QQM7QOoog0HnzYb3tJ+hO7aARim
+XYHJGqbztCi6UrPoZq0LzdLG0F+1hfQ3bRe9oV2iD9Xlq0yrwjTZnFWQfZlLTmfhci2Lkr+yKvIR
+qyYjeDV1z6kme/CqMolHy8U8UmZwj7zInbKUV5DhQpONBJYdxBPtU3FH+1Jc1daI81q2OKZdFfs1
+om3VKmlzNLs2UCsRr2tFoop2SpSKPeKMWCM2ifkiVSSLwWKgaC3ai9riFaGLGFHE7eIQv89X8TO8
+vKb+uNuhvz9/3e3I33fB8hvfX3dB+PtO+N83wEqqrQZ2lFD9OKsXk03HVM2mNaoVwdmYIlhcI49Y
+VfLItEo54mbVHLG+WhZHVbL45irHWbn/XxH/vxhBz2MwVKNWHhlaPUdUqZkjcmvnkfLxP10j7Pka
+NhTmzSON63VnK+rmkRkv5ZHTtXLE4to54vOX3mNBL+eIl+rliLwGeaTc75+u3RiXr70AXWmcR1Lj
+8kiSYnBcPukSd4W8FVdIXoy7QWTcPXIttoQcjOXwQ6wDpsdWhkGx9eHd2KYQH/s+RMb2AxabBMUN
+50Fuw7Wwt+EhSPHu4kneQ3yU9yT/1HuZD/YW8/7ep7yvVxN9vC7xsbeaamNFgreFGORtL4Z5e4tR
+3k9FsneCmOGdJeZ5F4il3hXiZ+9ascu7RRzxZojz3ixx03tIlHqzRYUGOaJ7fI4YqkiOzxZfxx8W
+K+IPis3x+8XB+L3iTHymKIrfIXTfBvGiL1209KWJPr4ZYqJvrFjsGyC2+zqJk77mothXV7BGFUV4
+ozJet1EB39qoLu/YuC6P9sewY/ExbH/cVL49bi5fE7eEL45bzVPjNvFpcVv4hLgdfFTcLj4kbjfv
+G7eXd4/bxzvEZfG3FdNjs/iE2H18VOxuPjR2Jx8Qu4V/HLue94xdxbvHLuHdYucr5qp+qmIm7xE7
+nX8Um8J7xU5SfhN439hx/KX46tQXX5E2jzfou/GE9oh/CkPi78OE+GKYFn8T5sRfh7T4Iliu6Osr
+giG+6zDSVwzjfXdhiu8hfOErhdk+Suf4DPqVL1ThUf0IRTRN9VWls30xdJavFp3hq0On++rSJr4v
+6d3GX9J+/jsw1F8Aif6zMNb/CyT7d8MU/0aY5l8B0/3z4Qv/NNWOhBR/Akz0d4Rx/pbwmb8xDPbX
+gd7+KPjA74A2fglN/WWkof8hqe6/TVz+64T5C8iDxvmkvM7+aW16cfk3NII+QH6kR08DGT0SeHQC
+kOiOUBrVEh5ENYbiqDqQHxUFp6MckBMlITOqjKyPekiWRt0mc6Kuk+SoAjIsKp/0iMojweF55FlY
+HikOyyfnwq6Qw2GFJD3sBpkSdo98HFZCWoRxqBHmABlWGW566sNRT1PY5HkfFnj6QbInCfp75sH7
+nrXQxHMIuHsXf+Y6xB+7TvJ7rsu82FXMi1wlvNCliQKXS1xxVVNtrLjmaiFuutqLu67e4rHrU4Hd
+E4TNPUu43AtEZfcK8bL7ZxFwbxGt3BmisztL9HcfEqPd2WKGO0dcDM8RdxQ4IluERBwW1SIOitiI
+/aJFxF7RISJT9InYIVIiNoj0iHRxICJNFETMECRyrKgUOUA0iuwk2kU2F/0j64rkyIpifmQZ/ymy
+gF+LugN3ogrgYdRZ+D3qF8DRu4FFbwQteqXK73x4nufIurRZ+FTeKHwurxO+hFcKX82DwzdxLXwL
+R+E7+OOwXfx22G5eGLaXXwzbx0+GZfEchVQgNX7s2c3veHby654t/IpnPf/Ns4pf9CzhFzzzFXNV
+P1Uxi1/yTOeXPSk8zzNJ+U3ghZ5x/Mfw6vRf4RXp3nCDHg0n9FL4U7gdfh9QxC3QIm7CCxHXIUxR
+NaIIChW3Vf9RRDGURdwFFvkQ9MhSCIqk9IVIg4ZEhio8qh9BgyOjFVVpUGQMtUfWorbIOrT8Pf9p
+LTbAf/y14D1UWf3Ucy+kG9x3YLu7AHa7z8IB9y+Q494NR90b4bh7JZxwz4eT7mmqHQnH3AlwxN1R
++bSETHdj2OKuA2vcUbDU7YB5bgnT3GVkjPshGeS+Tbq6r5O33QXEcueTOu480s+ZR7a9kEd4UI74
+KjhH/ODIEdsUOY5sccFxWNx2HBTIuV+84Nwrqjgzhde5Q7RzbhDDnOki1ZkmfnbOEEecY0WRc4Cg
+oZ1EpdDmIi60rng7tKLoFVrGE0ML+LPQhpy6anPpqsKDXBV5iCuIh7ood7uesIquW8zjylftcRbq
+2sOCXRuY7lrOiGseexI6nd0KTWJ5oSNYSegnzOnqy+q4urNmrvbsA9dbbKjrVZbiasgWumLYeldF
+tt8l2VnXE1rsukbLXLk02L2PVnavo+W57OWoyCs4pnJwzOWPQpbwopDV/FzIJv5ryFaeHbKD7wnJ
+4NtCdvN1IXt5esg+/l1IFp+r+PyFLN4g5Dhr4jjOWjp+Ze86TrFOjrOsu+MS6+0oZAmOYtbf8YAN
+cDxTED7AwXh/h+T9HAZPcFTgfRwh/GNHKC+Pf8JZl37hnEXHO9Pop8502se5nnZ0bqdtnRn0Dece
++qozi8Y7D9C6zkM0xnmYRjqzqVPxJCSbLnUUwTpnEWxzXoc9zmI45LwLR50P4aSzFM44KT3vNOgF
+Z6jCo/oR9Jwzmp51VqVnnDH0tLMWPeWsQ8vj/9NqvPXnyTgeDUOzzX+TieZR8pl5jPQ3j5Pu5gny
+nplLWppniWleJA3MPFLTvEoqmTeJw7xHdPMxQWYZeRTgcDsQBIUBF1wMVILcQA04GqgHhwKNYG/g
+NdgZaA1bAh1gQ6AnrA0MhB8DiZAeSIblgVmwNLAAvg+sVGyAxYEM1eYoTqv5K8p+R/mVKH9B1wZC
+6IZAJN0SqEF3Brx0byBADwVa0KOBNjQ30JFeDPSghYEEejswhD4KJFJkJlHdnEwd5gxayUylNc1v
+aAMzjZrm97SluYy+Z6bT7uYq2t9cTT8z19CJ5lo6W5Gm+EGNN6n5TGXPUX65yj9fPXdLPf9YrUOs
+VGpYM6jLmkyjrSRay0qk9a0htLGVQJtaPWhLqyNta7WhHawWtIsVoB9ZXtrXqkEHWpF0iBVCh1uC
+JlolMNq6A2OsKzDOOg1JVo4iQ7FBjVeq+QXKPgsSrWQYbiXCEGsgDLR6Ql+rA3xktYYu1mvQwWoE
+ba160NKqAU2tStDYckF9KwhqWRyirTLish4Tw7pHiHWTPFa63VL65Ssdc5WeOUrXTKXvJqXzD0rv
+NKV7uf5fmt/SSYpR5nw62JxHe5lf087mHNrGnE2bq1z6zanUa05U+UyiUeYo6jKH0yBzMOVmX/pM
+afAo0JneCbSjRYFWND/QlF4INFb61KfHAzXpkUAlpVkozQrY6J4AohmBh6o2bsD2wGXYFjgFWwPZ
+igzFRjVOV/MLlT0VMgIpsCcwBrICw1RNqTMw0A2OB9qrOmsN5wPNIC/gh2uBBqoGa8PDQFV4FogA
+ZrrAblYAlykhyqRQ03xG6ptPid98QJqr2m1j3iKdzBukl1lEBqvcjDILySSzQL1/gcpFAVmpxuvV
+/E5lP6j8jiv/8+q5QvX8E1XzNktCuMr3i1Y18FkNoJnVDNpY7ZUmCdDVGqM0SoXe1kLoY6UrNijd
+MlR7WHFSzf+m7Degh/VQ+SL6gaWrWnHSt1WNNLMaUctqSn3Wm6qm3qUvWp1puNWX2qzhqu5G0Scq
+77dV/guVDueVHseVLgeVPjuVTuuVXiuVbmlKv3Id/+kZMBv9cQbUKP8eYyVBmfkZPDMHQan5MTw1
+u8IjswPcN9vCbbMVXDebwxWzCVwwTThpNoIjZjzsMxvCNrMBrDW9sFTR6Dmt6TvPOQwLFHdU32a1
+ppvNbMgyD8Kv5l44Y2bCJXMHFJhb1bob1fprVZxVKt4yFXcR/G7OU/uYrfaTAuX7mmlugnee8zos
+VqxWbDVbqvVaw1GzndpPe7VmZ7W3bnDZ7KX22Q8KzU/gqnqfq+Y4RYqKNRvyzbkqbhqcM5fAKXMF
+HFMxs82f1HushZ3mOthkroc1aj+LVKzymP+dx+f/qED/A5umANO+GAAA
+</w:binData><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:99pt;height:22.5pt" fillcolor="window"><v:imagedata src="wordml://08000001.wmz" o:title=""/></v:shape></w:pict></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="7344" w:type="dxa"/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRPr="00B336CA" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Header"/><w:rPr><w:sz w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:ftr w:type="odd"><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/><w:rPr><w:sz w:val="16"/></w:rPr></w:pPr><w:r><w:t>Page </w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00AD42A7"><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:t> of </w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> NUMPAGES </w:instrText></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00741F62"><w:rPr><w:noProof/></w:rPr><w:t>4</w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:rPr><w:sz w:val="16"/></w:rPr><w:t>.</w:t></w:r></w:p></w:ftr><w:hdr w:type="first"><w:tbl><w:tblPr><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="0" w:color="auto"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:left w:w="72" w:type="dxa"/><w:right w:w="72" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="2160"/><w:gridCol w:w="7344"/></w:tblGrid><w:tr wsp:rsidR="0006676C"><w:trPr><w:trHeight w:h-rule="exact" w:val="560"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2160" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="005101A6"><w:r><w:rPr><w:noProof/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:99pt;height:22.5pt" fillcolor="window"><v:imagedata src="wordml://08000001.wmz" o:title=""/></v:shape></w:pict></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="7344" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRPr="004E0CD9" wsp:rsidRDefault="0006676C"><w:pPr><w:jc w:val="right"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="0006676C" wsp:rsidRPr="004E0CD9" wsp:rsidRDefault="0006676C"><w:pPr><w:jc w:val="center"/></w:pPr></w:p></w:hdr><w:ftr w:type="first"><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r><w:t>Page </w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:t> of </w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> NUMPAGES </w:instrText></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/></w:rPr><w:t>7</w:t></w:r><w:r wsp:rsidR="005101A6"><w:fldChar w:fldCharType="end"/></w:r></w:p><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r wsp:rsidRPr="004E0CD9"><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr><w:t>Uncontrolled when printed. Verify with current online version before use.</w:t></w:r></w:p></w:ftr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="900" w:right="1440" w:bottom="1440" w:left="1440" w:header="360" w:footer="360" w:gutter="0"/><w:cols w:space="720"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.define/support/Monster_Process_Template_Diff.xml b/org.eclipse.osee.define/support/Monster_Process_Template_Diff.xml
new file mode 100644
index 00000000000..353f6143908
--- /dev/null
+++ b/org.eclipse.osee.define/support/Monster_Process_Template_Diff.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>PRC-013</o:Title><o:Author>Tim Ruchal</o:Author><o:LastAuthor>Ryan D. Brooks</o:LastAuthor><o:Revision>8</o:Revision><o:TotalTime>16</o:TotalTime><o:Created>2007-10-05T05:07:00Z</o:Created><o:LastSaved>2007-10-05T06:07:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>5</o:Words><o:Characters>33</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>37</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font><w:font w:name="Times"><w:panose-1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:pitch w:val="variable"/><w:sig w:usb-0="20007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="Arial Narrow"><w:panose-1 w:val="020B0506020202030204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font><w:font w:name="Arial Black"><w:panose-1 w:val="020B0A04020102020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="FFFFFF7D"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="D2C2EE9C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="ListNumber4"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="FFFFFF7E"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="B080D0D4"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ListNumber3"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="FFFFFF7F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="98D47242"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="ListNumber2"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="FFFFFF81"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="61C67D48"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet4"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="FFFFFF82"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="42B80BB2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet3"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="FFFFFF83"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="62FA69AA"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="ListBullet2"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="FFFFFF88"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="2166BC06"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ListNumber"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="03725C9F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="99A84B58"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="BulletFormat"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="144" w:hanging="144"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="06B75B61"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FFF62DE0"/><w:lvl w:ilvl="0" w:tplc="E070CF86"><w:start w:val="8"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="072717B8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C936A362"/><w:lvl w:ilvl="0" w:tplc="245427B2"><w:start w:val="2"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="0A6329F4"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="F200A1C6"/><w:lvl w:ilvl="0" w:tplc="71A0A7B0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="0EA863D8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="18221CCE"/><w:lvl w:ilvl="0" w:tplc="80469134"><w:start w:val="1"/><w:pStyle w:val="EntryCriteriaList"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="0EF755E3"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="7F76350E"/><w:lvl w:ilvl="0" w:tplc="4022B27A"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="C5BE7E94"><w:start w:val="1"/><w:lvlText w:val="(%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="107D44D7"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="82AC7DE8"/><w:lvl w:ilvl="0" w:tplc="A94E8C0A"><w:start w:val="3"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="13084F98"/><w:plt w:val="Multilevel"/><w:tmpl w:val="1396C2BA"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2232"/></w:tabs><w:ind w:left="2448" w:hanging="288"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="17C64AD8"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="ADF6529E"/><w:lvl w:ilvl="0" w:tplc="1498894E"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="61DA6A54"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="1C53503C"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C8FE44C4"/><w:lvl w:ilvl="0" w:tplc="7134413C"><w:start w:val="4"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="203F4D3B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="64520FE2"/><w:lvl w:ilvl="0" w:tplc="BB647B0A"><w:start w:val="4"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="DD70D388"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1620"/></w:tabs><w:ind w:left="1620" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/><w:color w:val="0000FF"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="26E14A05"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="048A7BE8"/><w:lvl w:ilvl="0" w:tplc="13DEACEA"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:b w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="2A7F08D7"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9B020B9A"/><w:lvl w:ilvl="0" w:tplc="6002B546"><w:start w:val="1"/><w:lvlText w:val="(%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="2F947FDA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D2940E28"/><w:lvl w:ilvl="0" w:tplc="CD4C8BD8"><w:start w:val="6"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="337306F5"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3A54FA94"/><w:lvl w:ilvl="0" w:tplc="D6F87804"><w:start w:val="5"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3E033D04"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="7EAE3F68"/><w:lvl w:ilvl="0" w:tplc="88547B1C"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="3FD226DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="48041F90"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="111Heading3Arial"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="424D3EEA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9460B27A"/><w:lvl w:ilvl="0" w:tplc="08027870"><w:start w:val="2"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="4A916088"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="67689220"/><w:lvl w:ilvl="0" w:tplc="A650C57A"><w:start w:val="4"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="E16EF644"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="4F7A415B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="A52E5718"/><w:lvl w:ilvl="0" w:tplc="0F1AD638"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="9AC2A26C"><w:start w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="4F8F5FED"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="904088DA"/><w:lvl w:ilvl="0" w:tplc="3CB0AFC2"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="4FC5049F"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="2E724A8A"/><w:lvl w:ilvl="0" w:tplc="1B249476"><w:start w:val="9"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="5250189A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="C26C3964"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:b w:val="off"/><w:b-cs w:val="off"/><w:i-cs w:val="off"/><w:caps w:val="off"/><w:smallCaps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:noProof w:val="off"/><w:vanish w:val="off"/><w:spacing w:val="0"/><w:kern w:val="0"/><w:position w:val="0"/><w:u w:val="none"/><w:vertAlign w:val="baseline"/><w:em w:val="none"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="792" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1224" w:hanging="504"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1728" w:hanging="648"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2232" w:hanging="792"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="2736" w:hanging="936"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3240" w:hanging="1080"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="3744" w:hanging="1224"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="4320" w:hanging="1440"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="535525EE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="529CC2FE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="564D1983"/><w:plt w:val="Multilevel"/><w:tmpl w:val="8C9E3592"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:color w:val="0000FF"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="58405D94"/><w:plt w:val="Multilevel"/><w:tmpl w:val="71EE2BB8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="StyleHeading3sor3Arial10pt"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="592368AC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="BFFCBB4E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2700"/></w:tabs><w:ind w:left="2700" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="5B97790F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="F9EA1966"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="ActivityStep"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="5CC70362"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DEDE73B0"/><w:lvl w:ilvl="0" w:tplc="AC4C51BC"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2232"/></w:tabs><w:ind w:left="2448" w:hanging="288"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:color w:val="0000FF"/><w:sz w:val="24"/><w:sz-cs w:val="16"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="5DC63416"/><w:plt w:val="Multilevel"/><w:tmpl w:val="87949AC8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="432"/></w:tabs><w:ind w:left="432" w:hanging="432"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="576"/></w:tabs><w:ind w:left="576" w:hanging="576"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="864"/></w:tabs><w:ind w:left="864" w:hanging="864"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1008"/></w:tabs><w:ind w:left="1008" w:hanging="1008"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1152"/></w:tabs><w:ind w:left="1152" w:hanging="1152"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="1296"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1584"/></w:tabs><w:ind w:left="1584" w:hanging="1584"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="600A3C5E"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="25DE13EE"/><w:lvl w:ilvl="0" w:tplc="F6E2D446"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="38"><w:lsid w:val="62D56365"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C9348A14"/><w:lvl w:ilvl="0" w:tplc="9896478E"><w:start w:val="1"/><w:nfc w:val="255"/><w:lvlText w:val="a."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="39"><w:lsid w:val="65855DE2"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DE0AA980"/><w:lvl w:ilvl="0" w:tplc="2E38985A"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="40"><w:lsid w:val="67C126D1"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3312930A"/><w:lvl w:ilvl="0" w:tplc="E9423BAC"><w:start w:val="1"/><w:pStyle w:val="InputsTableText"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="41"><w:lsid w:val="6B8B7708"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="801C1E8A"/><w:lvl w:ilvl="0" w:tplc="A3380E3E"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="6D721AB8"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="24"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="42"><w:lsid w:val="6B96217A"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="EA66CD60"/><w:lvl w:ilvl="0" w:tplc="A8F07A78"><w:start w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="F6E2D446"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="D6F87804"><w:start w:val="5"/><w:nfc w:val="3"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="43"><w:lsid w:val="6C926103"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="ABA0AFD2"/><w:lvl w:ilvl="0" w:tplc="4A52B692"><w:start w:val="1"/><w:lvlText w:val="(%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="8280"/></w:tabs><w:ind w:left="8280" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="44"><w:lsid w:val="70D55EB0"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D078130C"/><w:lvl w:ilvl="0" w:tplc="27EAA568"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/><w:b-cs w:val="off"/><w:i w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="45"><w:lsid w:val="7147056B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="E5D260F6"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="30"/></w:list><w:list w:ilfo="2"><w:ilst w:val="30"/></w:list><w:list w:ilfo="3"><w:ilst w:val="36"/></w:list><w:list w:ilfo="4"><w:ilst w:val="36"/></w:list><w:list w:ilfo="5"><w:ilst w:val="32"/></w:list><w:list w:ilfo="6"><w:ilst w:val="23"/></w:list><w:list w:ilfo="7"><w:ilst w:val="1"/></w:list><w:list w:ilfo="8"><w:ilst w:val="0"/></w:list><w:list w:ilfo="9"><w:ilst w:val="45"/></w:list><w:list w:ilfo="10"><w:ilst w:val="18"/></w:list><w:list w:ilfo="11"><w:ilst w:val="34"/></w:list><w:list w:ilfo="12"><w:ilst w:val="2"/></w:list><w:list w:ilfo="13"><w:ilst w:val="42"/></w:list><w:list w:ilfo="14"><w:ilst w:val="21"/></w:list><w:list w:ilfo="15"><w:ilst w:val="24"/></w:list><w:list w:ilfo="16"><w:ilst w:val="9"/></w:list><w:list w:ilfo="17"><w:ilst w:val="10"/></w:list><w:list w:ilfo="18"><w:ilst w:val="8"/></w:list><w:list w:ilfo="19"><w:ilst w:val="37"/></w:list><w:list w:ilfo="20"><w:ilst w:val="16"/></w:list><w:list w:ilfo="21"><w:ilst w:val="13"/></w:list><w:list w:ilfo="22"><w:ilst w:val="15"/></w:list><w:list w:ilfo="23"><w:ilst w:val="20"/></w:list><w:list w:ilfo="24"><w:ilst w:val="26"/></w:list><w:list w:ilfo="25"><w:ilst w:val="41"/></w:list><w:list w:ilfo="26"><w:ilst w:val="27"/></w:list><w:list w:ilfo="27"><w:ilst w:val="25"/></w:list><w:list w:ilfo="28"><w:ilst w:val="12"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="22"/></w:list><w:list w:ilfo="31"><w:ilst w:val="28"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="33"><w:ilst w:val="5"/></w:list><w:list w:ilfo="34"><w:ilst w:val="4"/></w:list><w:list w:ilfo="35"><w:ilst w:val="3"/></w:list><w:list w:ilfo="36"><w:ilst w:val="40"/></w:list><w:list w:ilfo="37"><w:ilst w:val="11"/></w:list><w:list w:ilfo="38"><w:ilst w:val="39"/></w:list><w:list w:ilfo="39"><w:ilst w:val="31"/></w:list><w:list w:ilfo="40"><w:ilst w:val="33"/></w:list><w:list w:ilfo="41"><w:ilst w:val="44"/></w:list><w:list w:ilfo="42"><w:ilst w:val="38"/></w:list><w:list w:ilfo="43"><w:ilst w:val="17"/></w:list><w:list w:ilfo="44"><w:ilst w:val="14"/></w:list><w:list w:ilfo="45"><w:ilst w:val="35"/></w:list><w:list w:ilfo="46"><w:ilst w:val="43"/></w:list><w:list w:ilfo="47"><w:ilst w:val="7"/></w:list><w:list w:ilfo="48"><w:ilst w:val="29"/></w:list><w:list w:ilfo="49"><w:ilst w:val="6"/></w:list><w:list w:ilfo="50"><w:ilst w:val="6"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00D5512A"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1CharCharChar"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:listPr><w:ilfo w:val="48"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="CharChar2"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="26"/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading4"/><w:spacing w:before="60"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><w:aliases w:val="1.1.1.1.1 Heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00C255B3"/><w:pPr><w:pStyle w:val="Heading5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="6"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i-cs/><w:sz-cs w:val="26"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00C255B3"/><w:pPr><w:pStyle w:val="Heading6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="6"/></w:listPr><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:spacing w:before="60"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:spacing w:before="40" w:after="40"/><w:jc w:val="center"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i/><w:color w:val="FF0000"/><w:sz w:val="20"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Heading9"/><w:widowControl w:val="off"/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="28"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="AppTitle"><w:name w:val="App Title"/><w:autoRedefine/><w:rsid w:val="00726BB4"/><w:pPr><w:pStyle w:val="AppTitle"/><w:keepNext/><w:keepLines/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="232" w:after="360" w:line="288" w:line-rule="at-least"/><w:jc w:val="center"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00726BB4"/><w:pPr><w:pStyle w:val="TOC1"/><w:spacing w:before="360" w:after="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading3sor3Arial10pt"><w:name w:val="Style Heading 3sor3 + Arial 10 pt"/><w:basedOn w:val="Heading3"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="StyleHeading3sor3Arial10pt"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="5"/></w:listPr></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="111Heading3Arial"><w:name w:val="1.1.1 Heading 3 + Arial"/><w:basedOn w:val="Heading2"/><w:next w:val="Normal"/><w:rsid w:val="00DD42DF"/><w:pPr><w:pStyle w:val="111Heading3Arial"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:jc w:val="right"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:i/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TI"><w:name w:val="TI"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="TI"/><w:spacing w:line="360" w:line-rule="exact"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U1"><w:name w:val="U1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="U1"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockDate"><w:name w:val="LockDate"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockDate"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockInfo"><w:name w:val="LockInfo"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockInfo"/><w:spacing w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D5512A"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockHead"><w:name w:val="LockHead"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="LockHead"/><w:keepNext/><w:spacing w:before="480" w:line="240" w:line-rule="exact"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="00D5512A"/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue2"><w:name w:val="List Continue 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListContinue2"/><w:spacing w:after="120"/><w:ind w:left="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue3"><w:name w:val="List Continue 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListContinue3"/><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber2"><w:name w:val="List Number 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber2"/><w:listPr><w:ilfo w:val="12"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:listPr><w:ilfo w:val="7"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber4"><w:name w:val="List Number 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ListNumber4"/><w:listPr><w:ilfo w:val="8"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ActivityStep"><w:name w:val="ActivityStep"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="ActivityStep"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="720"/><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:after="120"/><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:link w:val="CharChar"/><w:autoRedefine/><w:rsid w:val="00F04366"/><w:pPr><w:pStyle w:val="BodyText"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SubHeaderText"><w:name w:val="SubHeader Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D5512A"/><w:pPr><w:pStyle w:val="SubHeaderText"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListContinue4"><w:name w:val="List Continue 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListContinue4"/><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DI-XXX"><w:name w:val="DI-XXX"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="DI-XXX"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ProcessTitle"><w:name w:val="ProcessTitle"/><w:basedOn w:val="Normal"/><w:next w:val="SubHeader"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ProcessTitle"/><w:spacing w:before="360" w:after="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DI-XXXDate"><w:name w:val="DI-XXX Date"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="DI-XXXDate"/><w:ind w:left="6840"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SubHeader"><w:name w:val="SubHeader"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="SubHeader"/><w:keepNext/><w:spacing w:before="480" w:after="240"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="InputsTableHeaders"><w:name w:val="Inputs Table Headers"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="InputsTableHeaders"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet2"><w:name w:val="List Bullet 2"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet2"/><w:listPr><w:ilfo w:val="33"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet3"><w:name w:val="List Bullet 3"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet3"/><w:listPr><w:ilfo w:val="34"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListBullet4"><w:name w:val="List Bullet 4"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ListBullet4"/><w:listPr><w:ilfo w:val="35"/></w:listPr><w:spacing w:after="120"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="0000FF"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ActivityText"><w:name w:val="ActivityText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="ActivityText"/><w:spacing w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="InputsTableText"><w:name w:val="Inputs Table Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="InputsTableText"/><w:listPr><w:ilfo w:val="36"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="EntryCriteriaList"><w:name w:val="Entry Criteria List"/><w:basedOn w:val="Normal"/><w:rsid w:val="00254BAB"/><w:pPr><w:pStyle w:val="EntryCriteriaList"/><w:listPr><w:ilfo w:val="37"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00EA0B8B"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Achievement"><w:name w:val="Achievement"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Achievement"/><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="245" w:hanging="245"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BlockQuotation"><w:name w:val="Block Quotation"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BlockQuotation"/><w:pBdr><w:top w:val="single" w:sz="12" wx:bdrwidth="30" w:space="12" w:color="FFFFFF"/><w:left w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/><w:right w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/></w:pBdr><w:shd w:val="pct-5" w:color="auto" w:fill="auto" wx:bgcolor="F2F2F2"/><w:spacing w:after="240" w:line="220" w:line-rule="at-least"/><w:ind w:left="1368" w:right="240"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial Narrow" w:h-ansi="Arial Narrow"/><wx:font wx:val="Arial Narrow"/><w:spacing w:val="-5"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText3"><w:name w:val="Body Text 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyText3"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent"><w:name w:val="Body Text Indent"/><w:basedOn w:val="Normal"/><w:link w:val="BodyTextIndentChar"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyTextIndent"/><w:spacing w:before="60"/><w:ind w:left="43"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent2"><w:name w:val="Body Text Indent 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyTextIndent2"/><w:spacing w:before="60" w:after="120" w:line="480" w:line-rule="auto"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent3"><w:name w:val="Body Text Indent 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BodyTextIndent3"/><w:ind w:left="900" w:hanging="540"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="BodyTextIndentChar"><w:name w:val="Body Text Indent Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyTextIndent"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BulletFormat"><w:name w:val="Bullet Format"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="BulletFormat"/><w:listPr><w:ilfo w:val="47"/></w:listPr><w:spacing w:line="240" w:line-rule="at-least"/><w:ind w:right="392"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:snapToGrid w:val="off"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar"><w:name w:val="Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyText"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:sz w:val="32"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar2"><w:name w:val="Char Char2"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading2"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CMMIREF"><w:name w:val="CMMI REF"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="CMMIREF"/><w:framePr w:hspace="187" w:vspace="187" w:wrap="around" w:vanchor="text" w:hanchor="text" w:y="1"/><w:spacing w:line="233" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Emphasis"><w:name w:val="Emphasis"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial Black" w:h-ansi="Arial Black"/><w:spacing w:val="-4"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00477B73"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeaderOdd"><w:name w:val="HeaderOdd"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="HeaderOdd"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1CharCharChar"><w:name w:val="Heading 1 Char Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading1"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1CharChar"><w:name w:val="Heading 1 Char Char"/><w:aliases w:val="Heading 1 Char1 Char1 Char,Heading 1 Char Char Char Char,Heading 1 Char1 Char1 Char Char Char,Heading 1 Char Char Char1 Char Char Char,Heading 1 Char1 Char Char Char Char Char,Heading 1 Char Char Char Char Char Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="list-bullet"><w:name w:val="list-bullet"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="list-bullet"/><w:keepLines/><w:tabs><w:tab w:val="list" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4680"/></w:tabs><w:spacing w:line="255" w:line-rule="at-least"/><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ManualHeading"><w:name w:val="Manual Heading"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="ManualHeading"/><w:tabs><w:tab w:val="right" w:pos="9270"/></w:tabs><w:ind w:left="86"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i/><w:noProof/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="MetricName"><w:name w:val="MetricName"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="MetricName"/><w:spacing w:before="0" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:sz w:val="28"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microcaption"><w:name w:val="micro:caption"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="microcaption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/></w:tabs><w:spacing w:before="41" w:after="43" w:line="222" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times" w:h-ansi="Times"/><wx:font wx:val="Times"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="NormalWeb"><w:name w:val="Normal (Web)"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="NormalWeb"/><w:spacing w:before="100" w:before-autospacing="on" w:after="100" w:after-autospacing="on"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="000000"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00477B73"/><w:rPr><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Paragraph"><w:name w:val="Paragraph"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Paragraph"/><w:widowControl w:val="off"/><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SECTIONS"><w:name w:val="SECTIONS"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="SECTIONS"/><w:tabs><w:tab w:val="list" w:pos="720"/><w:tab w:val="left" w:pos="7200"/></w:tabs><w:spacing w:before="115" w:line="287" w:line-rule="auto"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:i-cs/><w:sz w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleArial10ptNotItalicBoxSinglesolidlineAuto05"><w:name w:val="Style Arial 10 pt Not Italic Box: (Single solid line Auto 0.5..."/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="StyleArial10ptNotItalicBoxSinglesolidlineAuto05"/><w:pBdr><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/></w:pBdr><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading1Left0Firstline0"><w:name w:val="Style Heading 1 + Left: 0&quot; First line: 0&quot;"/><w:basedOn w:val="Heading1"/><w:next w:val="Heading1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="StyleHeading1Left0Firstline0"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style1"><w:name w:val="Style1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Style1Char"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style1"/><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:i/><w:color w:val="008000"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style1Char"><w:name w:val="Style1 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Style1"/><w:rsid w:val="00477B73"/><w:rPr><w:i/><w:color w:val="008000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style2"><w:name w:val="Style2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style2"/><w:spacing w:before="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:i/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style3"><w:name w:val="Style3"/><w:basedOn w:val="Style1"/><w:next w:val="Style1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style3"/><w:tabs><w:tab w:val="clear" w:pos="0"/><w:tab w:val="left" w:pos="360"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style4"><w:name w:val="Style4"/><w:basedOn w:val="Heading1"/><w:link w:val="Style4Char"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style4"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="360"/></w:tabs><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style4Char"><w:name w:val="Style4 Char"/><w:basedOn w:val="Heading1CharCharChar"/><w:link w:val="Style4"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style5"><w:name w:val="Style5"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style5"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:i/><w:color w:val="008000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style6"><w:name w:val="Style6"/><w:basedOn w:val="Heading2"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style6"/><w:spacing w:after="40"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style7"><w:name w:val="Style7"/><w:basedOn w:val="Heading2"/><w:link w:val="Style7Char"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="Style7"/><w:spacing w:after="40"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/><w:b-cs w:val="off"/><w:i w:val="off"/><w:i-cs w:val="off"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style7Char"><w:name w:val="Style7 Char"/><w:basedOn w:val="CharChar2"/><w:link w:val="Style7"/><w:rsid w:val="00477B73"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:i-cs/><w:snapToGrid w:val="off"/><w:sz w:val="28"/><w:sz-cs w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableContents"><w:name w:val="Table Contents"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TableContents"/><w:spacing w:before="40" w:after="40"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:snapToGrid w:val="off"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableHeaders"><w:name w:val="Table Headers"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TableHeaders"/><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:b/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableHeaders1"><w:name w:val="Table Headers1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TableHeaders1"/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:b/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitleCenteredNoTOC"><w:name w:val="Title Centered No TOC"/><w:basedOn w:val="Normal"/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TitleCenteredNoTOC"/><w:spacing w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00477B73"/><w:pPr><w:pStyle w:val="TOC2"/><w:tabs><w:tab w:val="right" w:pos="7920"/></w:tabs><w:spacing w:before="60"/><w:ind w:left="240"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BL"><w:name w:val="BL"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="BL"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ET"><w:name w:val="ET"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="ET"/><w:spacing w:after="240" w:line="240" w:line-rule="exact"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Exhibit"><w:name w:val="Exhibit"/><w:basedOn w:val="ET"/><w:next w:val="ET"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="Exhibit"/><w:spacing w:before="360" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockAuth"><w:name w:val="LockAuth"/><w:basedOn w:val="LockInfo"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="LockAuth"/><w:keepNext/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockIndent"><w:name w:val="LockIndent"/><w:basedOn w:val="U1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="LockIndent"/><w:tabs><w:tab w:val="left" w:pos="2448"/><w:tab w:val="left" w:pos="2736"/><w:tab w:val="left" w:pos="3024"/><w:tab w:val="left" w:pos="3312"/></w:tabs><w:ind w:left="2448" w:hanging="1728"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N1"><w:name w:val="N1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N1"/><w:keepNext/><w:spacing w:before="480" w:line="240" w:line-rule="exact"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N2"><w:name w:val="N2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N2"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="1440" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N3"><w:name w:val="N3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N3"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2160" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N4"><w:name w:val="N4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N4"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2880" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N5"><w:name w:val="N5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N5"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="3600" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N6"><w:name w:val="N6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N6"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="4320" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U6"><w:name w:val="U6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U6"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="4320"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="N7"><w:name w:val="N7"/><w:basedOn w:val="U6"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="N7"/><w:ind w:left="5040" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:after="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="R2"><w:name w:val="R2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="R2"/><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:line="240" w:line-rule="exact"/><w:ind w:left="1440" w:hanging="720"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StepBody"><w:name w:val="Step Body"/><w:basedOn w:val="U1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StepBody"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StepTitle"><w:name w:val="Step Title"/><w:basedOn w:val="N1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StepTitle"/><w:spacing w:before="240"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StepTitleBookmark"><w:name w:val="Step Title Bookmark"/><w:basedOn w:val="N1"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StepTitleBookmark"/><w:spacing w:before="240"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText"><w:name w:val="Table Text"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="TableText"/><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U0"><w:name w:val="U0"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U0"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U2"><w:name w:val="U2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U2"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U3"><w:name w:val="U3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U3"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U4"><w:name w:val="U4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U4"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U5"><w:name w:val="U5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U5"/><w:spacing w:before="240" w:line="240" w:line-rule="exact"/><w:ind w:left="3600"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="U7"><w:name w:val="U7"/><w:basedOn w:val="N7"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="U7"/><w:ind w:first-line="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="ListNumber"/><w:listPr><w:ilfo w:val="50"/></w:listPr><w:spacing w:after="120"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading3CustomColorRGB01530"><w:name w:val="Style Heading 3 + Custom Color(RGB(01530))"/><w:basedOn w:val="Heading3"/><w:link w:val="StyleHeading3CustomColorRGB01530Char"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="StyleHeading3CustomColorRGB01530"/><w:keepNext w:val="off"/><w:spacing w:before="360" w:after="240"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="009900"/><w:sz w:val="27"/><w:sz-cs w:val="27"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="StyleHeading3CustomColorRGB01530Char"><w:name w:val="Style Heading 3 + Custom Color(RGB(01530)) Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="StyleHeading3CustomColorRGB01530"/><w:rsid w:val="00AD42A7"/><w:rPr><w:b/><w:b-cs/><w:color w:val="009900"/><w:sz w:val="27"/><w:sz-cs w:val="27"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="UncontrolledLegend"><w:name w:val="UncontrolledLegend"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AD42A7"/><w:pPr><w:pStyle w:val="UncontrolledLegend"/><w:shd w:val="clear" w:color="auto" w:fill="000000"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="FFFFFF"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="7171"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="7171"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:separator/></w:r></w:p></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:continuationSeparator/></w:r></w:p></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:separator/></w:r></w:p></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="00E77578" wsp:rsidRDefault="00E77578"><w:r><w:continuationSeparator/></w:r></w:p></w:endnote></w:endnotePr><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00D5512A"/><wsp:rsid wsp:val="00037F82"/><wsp:rsid wsp:val="00063F94"/><wsp:rsid wsp:val="0006676C"/><wsp:rsid wsp:val="00085C9A"/><wsp:rsid wsp:val="000C301A"/><wsp:rsid wsp:val="00107625"/><wsp:rsid wsp:val="00124150"/><wsp:rsid wsp:val="00134923"/><wsp:rsid wsp:val="001A3D31"/><wsp:rsid wsp:val="00254BAB"/><wsp:rsid wsp:val="00257C98"/><wsp:rsid wsp:val="002832E6"/><wsp:rsid wsp:val="002F2CE3"/><wsp:rsid wsp:val="003500CD"/><wsp:rsid wsp:val="0039105C"/><wsp:rsid wsp:val="00395B38"/><wsp:rsid wsp:val="003F64F1"/><wsp:rsid wsp:val="0040292B"/><wsp:rsid wsp:val="00431BFE"/><wsp:rsid wsp:val="00477A26"/><wsp:rsid wsp:val="00477B73"/><wsp:rsid wsp:val="004A0884"/><wsp:rsid wsp:val="004B078D"/><wsp:rsid wsp:val="004B6FB5"/><wsp:rsid wsp:val="004C2D82"/><wsp:rsid wsp:val="005101A6"/><wsp:rsid wsp:val="00524B7F"/><wsp:rsid wsp:val="00601FE5"/><wsp:rsid wsp:val="00616CBF"/><wsp:rsid wsp:val="00622A53"/><wsp:rsid wsp:val="0067073F"/><wsp:rsid wsp:val="00695A6B"/><wsp:rsid wsp:val="006C5728"/><wsp:rsid wsp:val="006E487A"/><wsp:rsid wsp:val="006F6EB1"/><wsp:rsid wsp:val="00712A1B"/><wsp:rsid wsp:val="007167C7"/><wsp:rsid wsp:val="00726BB4"/><wsp:rsid wsp:val="00741F62"/><wsp:rsid wsp:val="00751DA7"/><wsp:rsid wsp:val="007648A1"/><wsp:rsid wsp:val="007724E1"/><wsp:rsid wsp:val="00772551"/><wsp:rsid wsp:val="007830FA"/><wsp:rsid wsp:val="007D2BC6"/><wsp:rsid wsp:val="007D396A"/><wsp:rsid wsp:val="008F48E4"/><wsp:rsid wsp:val="00913D8B"/><wsp:rsid wsp:val="009371C9"/><wsp:rsid wsp:val="009535A2"/><wsp:rsid wsp:val="009C1A9A"/><wsp:rsid wsp:val="009E2024"/><wsp:rsid wsp:val="009E474A"/><wsp:rsid wsp:val="00A01B71"/><wsp:rsid wsp:val="00A15EC8"/><wsp:rsid wsp:val="00A86F92"/><wsp:rsid wsp:val="00AB12F4"/><wsp:rsid wsp:val="00AD42A7"/><wsp:rsid wsp:val="00AE4453"/><wsp:rsid wsp:val="00B04CC0"/><wsp:rsid wsp:val="00B144F5"/><wsp:rsid wsp:val="00B54F1E"/><wsp:rsid wsp:val="00BE381E"/><wsp:rsid wsp:val="00C0606A"/><wsp:rsid wsp:val="00C255B3"/><wsp:rsid wsp:val="00C361FB"/><wsp:rsid wsp:val="00D01E4D"/><wsp:rsid wsp:val="00D5512A"/><wsp:rsid wsp:val="00D959B9"/><wsp:rsid wsp:val="00DD42DF"/><wsp:rsid wsp:val="00E16630"/><wsp:rsid wsp:val="00E2349C"/><wsp:rsid wsp:val="00E278A0"/><wsp:rsid wsp:val="00E77578"/><wsp:rsid wsp:val="00E8356E"/><wsp:rsid wsp:val="00EA0B8B"/><wsp:rsid wsp:val="00EA3126"/><wsp:rsid wsp:val="00EB1DC9"/><wsp:rsid wsp:val="00F04366"/><wsp:rsid wsp:val="00F66698"/><wsp:rsid wsp:val="00F67DCA"/><wsp:rsid wsp:val="00FE0437"/></wsp:rsids></w:docPr><w:body><wx:sect><ns0:Artifact><w:p wsp:rsidR="00254BAB" wsp:rsidRPr="00741F62" wsp:rsidRDefault="00913D8B" wsp:rsidP="00741F62"><Set_Name><w:proofErr w:type="spellStart"/><w:r wsp:rsidR="00431BFE"><w:t>Default</w:t></w:r></Set_Name><Attribute><Name><w:r wsp:rsidR="00431BFE"><w:t>Word</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidR="00431BFE"><w:t> Formatted Content</w:t></w:r></Name></Attribute></w:p></ns0:Artifact><w:sectPr wsp:rsidR="00254BAB" wsp:rsidRPr="00741F62" wsp:rsidSect="00B144F5"><w:hdr w:type="even"><w:p wsp:rsidR="00D959B9" wsp:rsidRDefault="00D959B9"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:hdr w:type="odd"><w:tbl><w:tblPr><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="0" w:color="auto"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:left w:w="72" w:type="dxa"/><w:right w:w="72" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="2160"/><w:gridCol w:w="7344"/></w:tblGrid><w:tr wsp:rsidR="0006676C"><w:trPr><w:trHeight w:h-rule="exact" w:val="560"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2160" w:type="dxa"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="00913D8B"><w:pPr><w:pStyle w:val="Header"/><w:jc w:val="left"/></w:pPr><w:r wsp:rsidRPr="00913D8B"><w:rPr><w:noProof/><w:sz w:val="20"/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><w:binData w:name="wordml://08000001.wmz">H4sIAAAAAAACC42ZeXhNV/fH995rD2efe26kuTf3uhkkpqC0uCS53HtOS9GqKq3W1BpLibEoDYoQ
+Q1BDo6UqVI2pKjW9ZokhpkRfFDGrREIQ42tMI78dHX7P8/7x+/Xm+Tx7WOvstc/6ruxn3yT3yP5v
+EWoislmaUcavAVKf4A8xkgjBewZCFF2g5XNMYSPZrIko7xmkIf6AlRsAa3/a/vIyCEYY/V+2P3ok
+KMn6X2u5P8cYCdX+/nzmr9mXMCrfDXpK2PO5srIyVOVPC/77ufJd+higfrg/mouCZBMtXFbTakqu
+NZDXhCUPiZZylXhXThedZX/RU7YSCbK2GCx18am8zkfKg/xzuZKPlZN4kvxI0UThUeN7bLTMYSPk
+cjZEjmP9ZCfWUzZknWQF1kbeoM3kAeqTy2htOZ5Gyq7ULgO0VAunN7WncEY7C/u17bBeS4OF2liY
+onWHIdpr0EmrAU00A2pqd0mQlkvui10kV6wg28VMskgkkvGiJ+kpWpPVgpBHYjNupg3AqVoVfFk7
+g7xyNpoo30CnVUJWyEg0QvpRc9kJhcpEVKh9g/6lbUZTtNOok/YY1dY8uFT48VHRBS8T4/BnYglu
+JbJwtCjCD7hBTvLf8UZejOfwS3goP4bb8iz8Mt+KbXwtvsaW431sIV7M5uLRbBbuwKbh+mwyNlgy
+LqTjcaZiAp2Am9EpWNBZOBu+xbNhJW4Pm3ElyMZXyW94HXmCPydO0pLUJxXJO+QaHkq24XlkJt5J
+euECEsAVwIX9cBclwFE0H35Gh2EOKoVE5KXdUV/6JvqOxqNcGoNeYB70FgtCKYyjLEYQ4apiFV04
+RiM5oK85Q+u4ho5wGyriwYgKJ4oSYaixiELviRg0WLyEpopYtFSYaKdogU6JNui26IQ07SNUWRuE
+Gmkj0bvaJJSgpaLx2iL0jbYardW2of3aQXRey0X3tEIk5EMUKTmuL924hayJO8sQPFU+Q5vlDVQg
+z6AQ/RCy9K2on/4j+lpfhDL0VHRNn4KCbWOQzzYcdbUNQhNtfVG6rRfKsfVAt2zdULDRFdUzuqE2
+Rg800OiFphl90QpjEMo0RqAzxlh010hBwv4VirB/j+rZ16Km9gzUzn4U9bTnocH2x+hzexCebI/B
+M+2v4q/snfE8+wj8jX2Oatep8b/xLPstnGIPIuPsdcmn9rakj30I6WifQ163byKx9tOksv0psdkj
+4T/GK3DO6AG7jYmw3FgOKcYBSDCuQUtDozWNmpQbr9M8W2+605ZM59m+o5/YttM3bCtpJ9tQOsn2
+Fl1iq0z32O5Bvm0XMGMZhBopUN0YAA2NtvCa0QDeMdzQ1XhKEoyLZJixm4w2lpMJxjQyxRhMphrv
+k2lGgKQYVUmyYZDPjWd4hHEXf2IU4r7GOdzNOIrfNw7gVkYGfsXYjL3GOlzd+BG7jRVYGEvwI9si
+XGhLwyds3+I9tvl4jeJbxSTbAjzYthB3si3GTW3L8Iu2dPyCbQ1+rG/EF/XteK++B6/UD+Pp+gX8
+rn4fh+oeUk9/lbypJ5CeeipJ1HeQGfpV8r3ugPX6q7BH7wCH9UFwTJ8EuXoaXNA3QL6eDdf0fCjW
+S+Cu7qAP9Nr0sd6Mlugf0lJ9OC3TZ1Kk8oRtmYpLimdqLpKV6n5Wondmj/REdl+fy27pG1iRfpTl
+6bfYOV3nv+o1eLb+Gt+jd+Nb9NF8jT6XL9XX8Xl6Np+uF/Cxehn/RPeInrpXtNNbiWb6R6KhPlpU
+0+cIh75KYD1T3Ja54oK8KQ5Jov1LurUlsql2X67TbshYmS8Py3NygH5CHrDtl7XsW+XQoDUyucIK
+aQUvlsnBi2RS8Dfys+BU2Tf4C/lecIr0ByfLiOBx8kmFz+WxColSVkiQtqB2cp/9LTna3lzWswfk
+FcMrvzZqyBZGmHxgs8ultlKtre2mVqqf1Vbp+7UO+lqN6vO0dXKM1k1218rP6Ha4TIvH57QIvEmr
+gJdogGdqj9Ao7Qb6WDuJTG03cmhr0DWxCO0Qc9FyMRPNEikoUYxHPcRo9KYYgRqIIShcDFS/8wno
+Ju+NTvCeaAfvjpbxrmg674KG8g9RZ0UT1RfK9gtLQHPZMNSVjUM12Ux0ny5Gu+hGNJ1mo040H9Wi
+z9BTiMA54MeL4UM8ApJwa1iOYyAHY3iAL5AosoO0IgvJSDKOpJNe5Iwa6RBLLKhMhkIFshIQuQCq
+ouh13Jrm4cn0ojovL+DLCswu4SrsMm7KruAe7Boez4rVGXsfZ7Cn+AIjpITpxMOdJI5XIu14TfIJ
+b0i+4K+SdN6aDOZJan4DKWVXyX4WAbNZW+jMJkEM2w736F3IpDXoTNqFdqVf0ZfpYVoGmB0DH1sO
+g9lIWMHawAVWHZz8d9KKnyQT+FqylU8lt3lvEiOakg9FNEkVZfiA+A3/Lnbj+toy3FtLwfO1gfjI
+c52+4Dt5kXhLnhLd5R4xTP4kJsv54huZLFbJQWK77ChyZBNxXr4obkiHeCpLuNTzuVs/zKvp63l9
+/Rtu6uP4G3pvrmqWd9Hr8z66S9VxCUvUL7EkfR+boqezGfoXbI4+mM3T27E0PY59p3vYEr2ELtMv
+0uV6piJdMVuNE+lSvQf9XvfSNJ3Sr/Vi+FI/BTP0DJii/wAT9DEwQn8H+ug1oKNeSlroJ0gDfTWp
+pE8imt6N3JGNSK4MJTvli2SmfIV0le3JS3IQKdFSyCFtKflayyTdtYuktlZKHohKsEu8CpPFR/C2
+mAKh4ic4x0/A97wUPuYxtDZ/h95mY+gGtop+xs7QxkxjpbQRy6D92QS6iDWjxxmngh8Ei0+D4bwV
+/MTtcJX/m1QWXxJLLCOdxRYyQhwhs0U+WSWekH0iGM6LmvAf0QQM7QOoog0HnzYb3tJ+hO7aARim
+XYHJGqbztCi6UrPoZq0LzdLG0F+1hfQ3bRe9oV2iD9Xlq0yrwjTZnFWQfZlLTmfhci2Lkr+yKvIR
+qyYjeDV1z6kme/CqMolHy8U8UmZwj7zInbKUV5DhQpONBJYdxBPtU3FH+1Jc1daI81q2OKZdFfs1
+om3VKmlzNLs2UCsRr2tFoop2SpSKPeKMWCM2ifkiVSSLwWKgaC3ai9riFaGLGFHE7eIQv89X8TO8
+vKb+uNuhvz9/3e3I33fB8hvfX3dB+PtO+N83wEqqrQZ2lFD9OKsXk03HVM2mNaoVwdmYIlhcI49Y
+VfLItEo54mbVHLG+WhZHVbL45irHWbn/XxH/vxhBz2MwVKNWHhlaPUdUqZkjcmvnkfLxP10j7Pka
+NhTmzSON63VnK+rmkRkv5ZHTtXLE4to54vOX3mNBL+eIl+rliLwGeaTc75+u3RiXr70AXWmcR1Lj
+8kiSYnBcPukSd4W8FVdIXoy7QWTcPXIttoQcjOXwQ6wDpsdWhkGx9eHd2KYQH/s+RMb2AxabBMUN
+50Fuw7Wwt+EhSPHu4kneQ3yU9yT/1HuZD/YW8/7ep7yvVxN9vC7xsbeaamNFgreFGORtL4Z5e4tR
+3k9FsneCmOGdJeZ5F4il3hXiZ+9ascu7RRzxZojz3ixx03tIlHqzRYUGOaJ7fI4YqkiOzxZfxx8W
+K+IPis3x+8XB+L3iTHymKIrfIXTfBvGiL1209KWJPr4ZYqJvrFjsGyC2+zqJk77mothXV7BGFUV4
+ozJet1EB39qoLu/YuC6P9sewY/ExbH/cVL49bi5fE7eEL45bzVPjNvFpcVv4hLgdfFTcLj4kbjfv
+G7eXd4/bxzvEZfG3FdNjs/iE2H18VOxuPjR2Jx8Qu4V/HLue94xdxbvHLuHdYucr5qp+qmIm7xE7
+nX8Um8J7xU5SfhN439hx/KX46tQXX5E2jzfou/GE9oh/CkPi78OE+GKYFn8T5sRfh7T4Iliu6Osr
+giG+6zDSVwzjfXdhiu8hfOErhdk+Suf4DPqVL1ThUf0IRTRN9VWls30xdJavFp3hq0On++rSJr4v
+6d3GX9J+/jsw1F8Aif6zMNb/CyT7d8MU/0aY5l8B0/3z4Qv/NNWOhBR/Akz0d4Rx/pbwmb8xDPbX
+gd7+KPjA74A2fglN/WWkof8hqe6/TVz+64T5C8iDxvmkvM7+aW16cfk3NII+QH6kR08DGT0SeHQC
+kOiOUBrVEh5ENYbiqDqQHxUFp6MckBMlITOqjKyPekiWRt0mc6Kuk+SoAjIsKp/0iMojweF55FlY
+HikOyyfnwq6Qw2GFJD3sBpkSdo98HFZCWoRxqBHmABlWGW566sNRT1PY5HkfFnj6QbInCfp75sH7
+nrXQxHMIuHsXf+Y6xB+7TvJ7rsu82FXMi1wlvNCliQKXS1xxVVNtrLjmaiFuutqLu67e4rHrU4Hd
+E4TNPUu43AtEZfcK8bL7ZxFwbxGt3BmisztL9HcfEqPd2WKGO0dcDM8RdxQ4IluERBwW1SIOitiI
+/aJFxF7RISJT9InYIVIiNoj0iHRxICJNFETMECRyrKgUOUA0iuwk2kU2F/0j64rkyIpifmQZ/ymy
+gF+LugN3ogrgYdRZ+D3qF8DRu4FFbwQteqXK73x4nufIurRZ+FTeKHwurxO+hFcKX82DwzdxLXwL
+R+E7+OOwXfx22G5eGLaXXwzbx0+GZfEchVQgNX7s2c3veHby654t/IpnPf/Ns4pf9CzhFzzzFXNV
+P1Uxi1/yTOeXPSk8zzNJ+U3ghZ5x/Mfw6vRf4RXp3nCDHg0n9FL4U7gdfh9QxC3QIm7CCxHXIUxR
+NaIIChW3Vf9RRDGURdwFFvkQ9MhSCIqk9IVIg4ZEhio8qh9BgyOjFVVpUGQMtUfWorbIOrT8Pf9p
+LTbAf/y14D1UWf3Ucy+kG9x3YLu7AHa7z8IB9y+Q494NR90b4bh7JZxwz4eT7mmqHQnH3AlwxN1R
++bSETHdj2OKuA2vcUbDU7YB5bgnT3GVkjPshGeS+Tbq6r5O33QXEcueTOu480s+ZR7a9kEd4UI74
+KjhH/ODIEdsUOY5sccFxWNx2HBTIuV+84Nwrqjgzhde5Q7RzbhDDnOki1ZkmfnbOEEecY0WRc4Cg
+oZ1EpdDmIi60rng7tKLoFVrGE0ML+LPQhpy6anPpqsKDXBV5iCuIh7ood7uesIquW8zjylftcRbq
+2sOCXRuY7lrOiGseexI6nd0KTWJ5oSNYSegnzOnqy+q4urNmrvbsA9dbbKjrVZbiasgWumLYeldF
+tt8l2VnXE1rsukbLXLk02L2PVnavo+W57OWoyCs4pnJwzOWPQpbwopDV/FzIJv5ryFaeHbKD7wnJ
+4NtCdvN1IXt5esg+/l1IFp+r+PyFLN4g5Dhr4jjOWjp+Ze86TrFOjrOsu+MS6+0oZAmOYtbf8YAN
+cDxTED7AwXh/h+T9HAZPcFTgfRwh/GNHKC+Pf8JZl37hnEXHO9Pop8502se5nnZ0bqdtnRn0Dece
++qozi8Y7D9C6zkM0xnmYRjqzqVPxJCSbLnUUwTpnEWxzXoc9zmI45LwLR50P4aSzFM44KT3vNOgF
+Z6jCo/oR9Jwzmp51VqVnnDH0tLMWPeWsQ8vj/9NqvPXnyTgeDUOzzX+TieZR8pl5jPQ3j5Pu5gny
+nplLWppniWleJA3MPFLTvEoqmTeJw7xHdPMxQWYZeRTgcDsQBIUBF1wMVILcQA04GqgHhwKNYG/g
+NdgZaA1bAh1gQ6AnrA0MhB8DiZAeSIblgVmwNLAAvg+sVGyAxYEM1eYoTqv5K8p+R/mVKH9B1wZC
+6IZAJN0SqEF3Brx0byBADwVa0KOBNjQ30JFeDPSghYEEejswhD4KJFJkJlHdnEwd5gxayUylNc1v
+aAMzjZrm97SluYy+Z6bT7uYq2t9cTT8z19CJ5lo6W5Gm+EGNN6n5TGXPUX65yj9fPXdLPf9YrUOs
+VGpYM6jLmkyjrSRay0qk9a0htLGVQJtaPWhLqyNta7WhHawWtIsVoB9ZXtrXqkEHWpF0iBVCh1uC
+JlolMNq6A2OsKzDOOg1JVo4iQ7FBjVeq+QXKPgsSrWQYbiXCEGsgDLR6Ql+rA3xktYYu1mvQwWoE
+ba160NKqAU2tStDYckF9KwhqWRyirTLish4Tw7pHiHWTPFa63VL65Ssdc5WeOUrXTKXvJqXzD0rv
+NKV7uf5fmt/SSYpR5nw62JxHe5lf087mHNrGnE2bq1z6zanUa05U+UyiUeYo6jKH0yBzMOVmX/pM
+afAo0JneCbSjRYFWND/QlF4INFb61KfHAzXpkUAlpVkozQrY6J4AohmBh6o2bsD2wGXYFjgFWwPZ
+igzFRjVOV/MLlT0VMgIpsCcwBrICw1RNqTMw0A2OB9qrOmsN5wPNIC/gh2uBBqoGa8PDQFV4FogA
+ZrrAblYAlykhyqRQ03xG6ptPid98QJqr2m1j3iKdzBukl1lEBqvcjDILySSzQL1/gcpFAVmpxuvV
+/E5lP6j8jiv/8+q5QvX8E1XzNktCuMr3i1Y18FkNoJnVDNpY7ZUmCdDVGqM0SoXe1kLoY6UrNijd
+MlR7WHFSzf+m7Degh/VQ+SL6gaWrWnHSt1WNNLMaUctqSn3Wm6qm3qUvWp1puNWX2qzhqu5G0Scq
+77dV/guVDueVHseVLgeVPjuVTuuVXiuVbmlKv3Id/+kZMBv9cQbUKP8eYyVBmfkZPDMHQan5MTw1
+u8IjswPcN9vCbbMVXDebwxWzCVwwTThpNoIjZjzsMxvCNrMBrDW9sFTR6Dmt6TvPOQwLFHdU32a1
+ppvNbMgyD8Kv5l44Y2bCJXMHFJhb1bob1fprVZxVKt4yFXcR/G7OU/uYrfaTAuX7mmlugnee8zos
+VqxWbDVbqvVaw1GzndpPe7VmZ7W3bnDZ7KX22Q8KzU/gqnqfq+Y4RYqKNRvyzbkqbhqcM5fAKXMF
+HFMxs82f1HushZ3mOthkroc1aj+LVKzymP+dx+f/qED/A5umANO+GAAA
+</w:binData><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:99pt;height:22.5pt" fillcolor="window"><v:imagedata src="wordml://08000001.wmz" o:title=""/></v:shape></w:pict></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="7344" w:type="dxa"/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRPr="00B336CA" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Header"/><w:rPr><w:sz w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:ftr w:type="even"><w:p wsp:rsidR="00D959B9" wsp:rsidRDefault="00D959B9"><w:pPr><w:pStyle w:val="Footer"/></w:pPr></w:p></w:ftr><w:ftr w:type="odd"><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/><w:rPr><w:sz w:val="16"/></w:rPr></w:pPr><w:r><w:t>Page </w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00D959B9"><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:t> of </w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> NUMPAGES </w:instrText></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00D959B9"><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:rPr><w:sz w:val="16"/></w:rPr><w:t>.</w:t></w:r></w:p></w:ftr><w:hdr w:type="first"><w:tbl><w:tblPr><w:tblW w:w="0" w:type="auto"/><w:tblBorders><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="0" w:color="auto"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:left w:w="72" w:type="dxa"/><w:right w:w="72" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="2160"/><w:gridCol w:w="7344"/></w:tblGrid><w:tr wsp:rsidR="0006676C"><w:trPr><w:trHeight w:h-rule="exact" w:val="560"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2160" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="00913D8B"><w:r><w:rPr><w:noProof/></w:rPr><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:99pt;height:22.5pt" fillcolor="window"><v:imagedata src="wordml://08000001.wmz" o:title=""/></v:shape></w:pict></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="7344" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="0006676C" wsp:rsidRPr="004E0CD9" wsp:rsidRDefault="0006676C"><w:pPr><w:jc w:val="right"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="0006676C" wsp:rsidRPr="004E0CD9" wsp:rsidRDefault="0006676C"><w:pPr><w:jc w:val="center"/></w:pPr></w:p></w:hdr><w:ftr w:type="first"><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r><w:t>Page </w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="end"/></w:r><w:r><w:t> of </w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText> NUMPAGES </w:instrText></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/></w:rPr><w:t>7</w:t></w:r><w:r wsp:rsidR="00913D8B"><w:fldChar w:fldCharType="end"/></w:r></w:p><w:p wsp:rsidR="0006676C" wsp:rsidRDefault="0006676C"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r wsp:rsidRPr="004E0CD9"><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr><w:t>Uncontrolled when printed. Verify with current online version before use.</w:t></w:r></w:p></w:ftr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="900" w:right="1440" w:bottom="1440" w:left="1440" w:header="360" w:footer="360" w:gutter="0"/><w:cols w:space="720"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.define/support/Work_Instruction_Template.xml b/org.eclipse.osee.define/support/Work_Instruction_Template.xml
new file mode 100644
index 00000000000..fb17beaa38b
--- /dev/null
+++ b/org.eclipse.osee.define/support/Work_Instruction_Template.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>1</o:Title><o:Author>Juliet Davis</o:Author><o:LastAuthor>Ryan D. Brooks</o:LastAuthor><o:Revision>4</o:Revision><o:TotalTime>14</o:TotalTime><o:LastPrinted>2007-07-10T23:01:00Z</o:LastPrinted><o:Created>2007-10-04T17:12:00Z</o:Created><o:LastSaved>2007-10-05T03:36:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>7</o:Words><o:Characters>42</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>48</o:CharactersWithSpaces><o:Version>11.8134</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font><w:font w:name="Times"><w:panose-1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Arial Narrow"><w:panose-1 w:val="020B0506020202030204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font><w:font w:name="Arial Black"><w:panose-1 w:val="020B0A04020102020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font><w:font w:name="Monotype Sorts"><w:altName w:val="ZapfDingbats"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="FFFFFF80"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="0B4E0926"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="023D1309"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="F3B02E52"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="03725C9F"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="99A84B58"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="BulletFormat"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="144" w:hanging="144"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="04421590"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="6C0A2456"/><w:lvl w:ilvl="0" w:tplc="48FE9860"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="37841DE8"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="9DDEED02" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="F1D038FA" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="229C1944" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="AF2EFA66" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="B0A438DA" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="7D62A182" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="80DC1BDE" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="0DAD5D4D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="24C63B58"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:b w:val="off"/><w:b-cs w:val="off"/><w:i-cs w:val="off"/><w:caps w:val="off"/><w:smallCaps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:noProof w:val="off"/><w:vanish w:val="off"/><w:spacing w:val="0"/><w:kern w:val="0"/><w:position w:val="0"/><w:u w:val="none"/><w:vertAlign w:val="baseline"/><w:em w:val="none"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="792" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1224" w:hanging="504"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1728" w:hanging="648"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2232" w:hanging="792"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="2736" w:hanging="936"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3240" w:hanging="1080"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="3744" w:hanging="1224"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="4320" w:hanging="1440"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="0F39319D"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="504857C0"/><w:lvl w:ilvl="0" w:tplc="01149BAA"><w:start w:val="7"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="3E5E0BC4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="D742A4A0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="3CF29394"><w:start w:val="1"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="075A4CD0" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="19FEA722" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="424CE9D2" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="D9484C96" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="8B94239A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="10F64FBF"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="4776C91E"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="15395D53"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="1D524E88"/><w:lvl w:ilvl="0" w:tplc="B3BA7254"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="360" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="156909F8"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001F"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="792" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1224" w:hanging="504"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1728" w:hanging="648"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2232" w:hanging="792"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="2736" w:hanging="936"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3240" w:hanging="1080"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="3744" w:hanging="1224"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="4320" w:hanging="1440"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="15C279AA"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="A52402DC"/><w:lvl w:ilvl="0"><w:start w:val="2"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="0" w:first-line="0"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="1C675EEE"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9CF4DAFE"/><w:lvl w:ilvl="0" w:tplc="CE8EB784"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="B2120A7A"><w:start w:val="1"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="31EEF4A8" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="75106FF4" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="8466A1E6" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="6F907826" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="B3264ED6" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="D96A3C56" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="3240463C" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="244369AC"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="75560128"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="900"/></w:tabs><w:ind w:left="900" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="C3C26314"><w:start w:val="8"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1620"/></w:tabs><w:ind w:left="1620" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2340"/></w:tabs><w:ind w:left="2340" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3060"/></w:tabs><w:ind w:left="3060" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3780"/></w:tabs><w:ind w:left="3780" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4500"/></w:tabs><w:ind w:left="4500" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5220"/></w:tabs><w:ind w:left="5220" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5940"/></w:tabs><w:ind w:left="5940" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6660"/></w:tabs><w:ind w:left="6660" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="25CA68C1"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="018EE928"/><w:lvl w:ilvl="0" w:tplc="29DC60DE"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="AA367038" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="A7EED97A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="B1685DB8" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="C8D8937E" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="DBF4BCEC" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="5F12945C" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="F4645CC0" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="A0A8DD14" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="2AC57627"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="76CCE002"/><w:lvl w:ilvl="0" w:tplc="B3BA7254"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="900"/></w:tabs><w:ind w:left="540" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="C3C26314"><w:start w:val="8"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="2B406307"/><w:plt w:val="Multilevel"/><w:tmpl w:val="24C63B58"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:b w:val="off"/><w:b-cs w:val="off"/><w:i-cs w:val="off"/><w:caps w:val="off"/><w:smallCaps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:noProof w:val="off"/><w:vanish w:val="off"/><w:spacing w:val="0"/><w:kern w:val="0"/><w:position w:val="0"/><w:u w:val="none"/><w:vertAlign w:val="baseline"/><w:em w:val="none"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="792" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1224" w:hanging="504"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1728" w:hanging="648"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2232" w:hanging="792"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="2736" w:hanging="936"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3240" w:hanging="1080"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="3744" w:hanging="1224"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="4320" w:hanging="1440"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="2C156FF4"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="793C8BA4"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="2E06468A"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="FBB05C60"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2F1F6CBC"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="65A03D44"/><w:lvl w:ilvl="0" w:tplc="E4182A4A"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="AFBC37F4" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0DF03484" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="F2FC541A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="CDACC046" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="CC3CAE0A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="28AA7AE0" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="6B644F5C" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="F83CBB7E" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="30946455"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="4C525520"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="31D57344"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="52947FC2"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="353609AF"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="2A7ADD68"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="366D388E"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="0409000B"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3D855D68"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="61E05A2E"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="3EDD711F"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E86E8452"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/><w:sz w:val="20"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="467E0A6D"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="9CBEA430"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="245" w:hanging="245"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="51E92105"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="0B341164"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="5250189A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="C26C3964"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:b w:val="off"/><w:b-cs w:val="off"/><w:i-cs w:val="off"/><w:caps w:val="off"/><w:smallCaps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:noProof w:val="off"/><w:vanish w:val="off"/><w:spacing w:val="0"/><w:kern w:val="0"/><w:position w:val="0"/><w:u w:val="none"/><w:vertAlign w:val="baseline"/><w:em w:val="none"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%1.%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="792" w:hanging="432"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1224" w:hanging="504"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1728" w:hanging="648"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2232" w:hanging="792"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="2736" w:hanging="936"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3240" w:hanging="1080"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="3744" w:hanging="1224"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="4320" w:hanging="1440"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="546C7F64"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="F64C4B12"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="54755213"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D8642CB6"/><w:lvl w:ilvl="0" w:tplc="CC90513E"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="2FECF282" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="03FE6852" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="A4887144" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="DFA8E4AA" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="EF566720" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="ACAA99BE" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="9826576A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="DC9CEBC6" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="58916C1B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="56103D2A"/><w:lvl w:ilvl="0" w:tplc="9F4CD368"><w:start w:val="2"/><w:nfc w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="B8DA13C6"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="D77C48CC" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="242C1F90" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="3E22EA4A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="C706BE02" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="E8440A3E" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="430206BE" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0B4CCE90" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="5A1B197D"/><w:plt w:val="SingleLevel"/><w:tmpl w:val="171022E0"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï¯"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Monotype Sorts" w:h-ansi="Monotype Sorts" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="5A1D58FA"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="9222AAF0"/><w:lvl w:ilvl="0" w:tplc="274CEE76"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="EBD03E22" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="F7F2C164" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="AFF4C3DA" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="0922B60C" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="7D5EEA38" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="2D0C93FA" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="455C559C" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="B7DAB7F2" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="5BD3795D"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D4FAFAC8"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="60520395"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="76A292E4"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="667C7622"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="71647E1E"/><w:lvl w:ilvl="0" w:tplc="C144020E"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="463E340E" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="6E74D39A" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="44A2637C" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="1C741824" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="922290AE" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="DE8EAF10" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="96F0F946" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="86F4D2FC" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="6A033132"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3B824E04"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="6CC468BB"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="475E538C"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="705E07B3"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="002E422C"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="38"><w:lsid w:val="72C41239"/><w:plt w:val="Multilevel"/><w:tmpl w:val="A314A280"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="39"><w:lsid w:val="780D603D"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="B88C44E0"/><w:lvl w:ilvl="0" w:tplc="AF6E9E28"><w:start w:val="14"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="825"/></w:tabs><w:ind w:left="825" w:hanging="465"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="B3BA7254"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1080" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="40"><w:lsid w:val="7D7557A1"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="3B06DF50"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090001"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="540"/></w:tabs><w:ind w:left="540" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="B3BA7254"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1800" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="B3BA7254"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2520" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="A0905AA6"><w:start w:val="2"/><w:nfc w:val="3"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="3"/></w:list><w:list w:ilfo="2"><w:ilst w:val="2"/></w:list><w:list w:ilfo="3"><w:ilst w:val="24"/></w:list><w:list w:ilfo="4"><w:ilst w:val="30"/></w:list><w:list w:ilfo="5"><w:ilst w:val="10"/></w:list><w:list w:ilfo="6"><w:ilst w:val="5"/></w:list><w:list w:ilfo="7"><w:ilst w:val="29"/></w:list><w:list w:ilfo="8"><w:ilst w:val="38"/></w:list><w:list w:ilfo="9"><w:ilst w:val="21"/></w:list><w:list w:ilfo="10"><w:ilst w:val="23"/></w:list><w:list w:ilfo="11"><w:ilst w:val="13"/></w:list><w:list w:ilfo="12"><w:ilst w:val="39"/></w:list><w:list w:ilfo="13"><w:ilst w:val="7"/></w:list><w:list w:ilfo="14"><w:ilst w:val="11"/></w:list><w:list w:ilfo="15"><w:ilst w:val="40"/></w:list><w:list w:ilfo="16"><w:ilst w:val="1"/></w:list><w:list w:ilfo="17"><w:ilst w:val="15"/></w:list><w:list w:ilfo="18"><w:ilst w:val="25"/></w:list><w:list w:ilfo="19"><w:ilst w:val="20"/></w:list><w:list w:ilfo="20"><w:ilst w:val="22"/></w:list><w:list w:ilfo="21"><w:ilst w:val="8"/></w:list><w:list w:ilfo="22"><w:ilst w:val="26"/></w:list><w:list w:ilfo="23"><w:ilst w:val="6"/></w:list><w:list w:ilfo="24"><w:ilst w:val="35"/></w:list><w:list w:ilfo="25"><w:ilst w:val="27"/></w:list><w:list w:ilfo="26"><w:ilst w:val="16"/></w:list><w:list w:ilfo="27"><w:ilst w:val="28"/></w:list><w:list w:ilfo="28"><w:ilst w:val="31"/></w:list><w:list w:ilfo="29"><w:ilst w:val="12"/></w:list><w:list w:ilfo="30"><w:ilst w:val="34"/></w:list><w:list w:ilfo="31"><w:ilst w:val="17"/></w:list><w:list w:ilfo="32"><w:ilst w:val="9"/></w:list><w:list w:ilfo="33"><w:ilst w:val="4"/></w:list><w:list w:ilfo="34"><w:ilst w:val="14"/></w:list><w:list w:ilfo="35"><w:ilst w:val="0"/></w:list><w:list w:ilfo="36"><w:ilst w:val="36"/></w:list><w:list w:ilfo="37"><w:ilst w:val="33"/></w:list><w:list w:ilfo="38"><w:ilst w:val="19"/></w:list><w:list w:ilfo="39"><w:ilst w:val="32"/></w:list><w:list w:ilfo="40"><w:ilst w:val="18"/></w:list><w:list w:ilfo="41"><w:ilst w:val="37"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00122588"/><w:pPr><w:spacing w:before="60"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><w:aliases w:val="Heading 1 Char,Heading 1 Char1 Char1,Heading 1 Char1 Char1 Char Char,Heading 1 Char Char Char1 Char Char,Heading 1 Char1 Char Char Char Char,Heading 1 Char Char Char Char Char Char,Heading 1 Char Char1 Char Char Char"/><wx:uiName wx:val="Heading 1"/><w:next w:val="Normal"/><w:link w:val="Heading1CharCharChar"/><w:rsid w:val="00D569EB"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:listPr><w:ilfo w:val="22"/></w:listPr><w:spacing w:before="60" w:after="60"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:next w:val="BodyText"/><w:link w:val="CharChar2"/><w:autoRedefine/><w:rsid w:val="001302CF"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:spacing w:before="240" w:after="40"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:snapToGrid w:val="off"/><w:sz w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:next w:val="Normal"/><w:link w:val="CharChar1"/><w:rsid w:val="00634D04"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:framePr w:hspace="187" w:vspace="187" w:wrap="around" w:hanchor="text" w:y="1"/><w:spacing w:before="80"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="28"/><w:sz-cs w:val="26"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Heading4"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Heading5"/><w:keepNext/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i w:val="off"/><w:i-cs/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Heading6"/><w:keepNext/><w:jc w:val="center"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:i w:val="off"/><w:i-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:spacing w:before="40" w:after="40"/><w:jc w:val="center"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="FF0000"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Heading9"/><w:widowControl w:val="off"/><w:spacing w:before="240" w:after="60"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i w:val="off"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00AB62A8"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:link w:val="CharChar"/><w:autoRedefine/><w:rsid w:val="00E24A8E"/><w:pPr><w:pStyle w:val="BodyText"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="right" w:pos="10260"/></w:tabs></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:i w:val="off"/><w:color w:val="000000"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00AB62A8"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent"><w:name w:val="Body Text Indent"/><w:basedOn w:val="Normal"/><w:link w:val="BodyTextIndentChar"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="BodyTextIndent"/><w:ind w:left="43"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><w:aliases w:val="RH"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ManualHeading"><w:name w:val="Manual Heading"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="ManualHeading"/><w:tabs><w:tab w:val="right" w:pos="9270"/></w:tabs><w:ind w:left="86"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i/><w:noProof/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00AB62A8"/><w:rPr><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableContents"><w:name w:val="Table Contents"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="TableContents"/><w:spacing w:before="40" w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i w:val="off"/><w:snapToGrid w:val="off"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableHeaders"><w:name w:val="Table Headers"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="TableHeaders"/><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:i w:val="off"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CMMIREF"><w:name w:val="CMMI REF"/><w:next w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="CMMIREF"/><w:framePr w:hspace="187" w:vspace="187" w:wrap="around" w:vanchor="text" w:hanchor="text" w:y="1"/><w:spacing w:line="233" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BulletFormat"><w:name w:val="Bullet Format"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="BulletFormat"/><w:listPr><w:ilfo w:val="2"/></w:listPr><w:spacing w:before="0" w:line="240" w:line-rule="at-least"/><w:ind w:left="360" w:right="392" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:i w:val="off"/><w:snapToGrid w:val="off"/><w:color w:val="000000"/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeaderOdd"><w:name w:val="HeaderOdd"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="HeaderOdd"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="SECTIONS"><w:name w:val="SECTIONS"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="SECTIONS"/><w:tabs><w:tab w:val="list" w:pos="720"/><w:tab w:val="left" w:pos="7200"/></w:tabs><w:spacing w:before="115" w:line="287" w:line-rule="auto"/><w:ind w:left="720" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:i-cs/><w:sz w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Achievement"><w:name w:val="Achievement"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="Achievement"/><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:spacing w:before="0"/><w:ind w:left="245" w:hanging="245"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i w:val="off"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="list-bullet"><w:name w:val="list-bullet"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="list-bullet"/><w:keepLines/><w:tabs><w:tab w:val="list" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4680"/></w:tabs><w:spacing w:line="255" w:line-rule="at-least"/><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText3"><w:name w:val="Body Text 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="BodyText3"/><w:spacing w:before="0"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableHeaders1"><w:name w:val="Table Headers1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="TableHeaders1"/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:i w:val="off"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microcaption"><w:name w:val="micro:caption"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="microcaption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/></w:tabs><w:spacing w:before="41" w:after="43" w:line="222" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times" w:h-ansi="Times"/><wx:font wx:val="Times"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent3"><w:name w:val="Body Text Indent 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00AB62A8"/><w:pPr><w:pStyle w:val="BodyTextIndent3"/><w:spacing w:before="0"/><w:ind w:left="900" w:hanging="540"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i w:val="off"/><w:snapToGrid w:val="off"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyTextIndent2"><w:name w:val="Body Text Indent 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="003E7101"/><w:pPr><w:pStyle w:val="BodyTextIndent2"/><w:spacing w:after="120" w:line="480" w:line-rule="auto"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="003E7101"/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="paragraph" w:styleId="NormalWeb"><w:name w:val="Normal (Web)"/><w:basedOn w:val="Normal"/><w:rsid w:val="00CA555E"/><w:pPr><w:pStyle w:val="NormalWeb"/><w:spacing w:before="100" w:before-autospacing="on" w:after="100" w:after-autospacing="on"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i w:val="off"/><w:color w:val="000000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="007C018F"/><w:pPr><w:pStyle w:val="TOC1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="right" w:pos="8630"/></w:tabs><w:spacing w:before="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i w:val="off"/><w:sz w:val="28"/><w:sz-cs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00012438"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar"><w:name w:val="Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyText"/><w:rsid w:val="00E24A8E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:color w:val="000000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style1"><w:name w:val="Style1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Style1Char"/><w:rsid w:val="004B5FCB"/><w:pPr><w:pStyle w:val="Style1"/><w:tabs><w:tab w:val="list" w:pos="0"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="008000"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style1Char"><w:name w:val="Style1 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Style1"/><w:rsid w:val="004B5FCB"/><w:rPr><w:i/><w:color w:val="008000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style2"><w:name w:val="Style2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="004B5FCB"/><w:pPr><w:pStyle w:val="Style2"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1CharCharChar"><w:name w:val="Heading 1 Char Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading1"/><w:rsid w:val="00BD27F9"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style3"><w:name w:val="Style3"/><w:basedOn w:val="Style1"/><w:next w:val="Style1"/><w:rsid w:val="00BD27F9"/><w:pPr><w:pStyle w:val="Style3"/><w:tabs><w:tab w:val="clear" w:pos="0"/><w:tab w:val="left" w:pos="360"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style4"><w:name w:val="Style4"/><w:basedOn w:val="Heading1"/><w:link w:val="Style4Char"/><w:rsid w:val="00B45B3F"/><w:pPr><w:pStyle w:val="Style4"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="360"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleHeading1Left0Firstline0"><w:name w:val="Style Heading 1 + Left: 0&quot; First line: 0&quot;"/><w:basedOn w:val="Heading1"/><w:next w:val="Heading1"/><w:rsid w:val="00B45B3F"/><w:pPr><w:pStyle w:val="StyleHeading1Left0Firstline0"/><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar1"><w:name w:val="Char Char1"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading3"/><w:rsid w:val="00870157"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="28"/><w:sz-cs w:val="26"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="CharChar2"><w:name w:val="Char Char2"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading2"/><w:rsid w:val="00F04452"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b/><w:snapToGrid w:val="off"/><w:sz w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style5"><w:name w:val="Style5"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00975708"/><w:pPr><w:pStyle w:val="Style5"/><w:listPr><w:ilfo w:val="0"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:i/><w:color w:val="008000"/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style6"><w:name w:val="Style6"/><w:basedOn w:val="Heading2"/><w:rsid w:val="00975708"/><w:pPr><w:pStyle w:val="Style6"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style4Char"><w:name w:val="Style4 Char"/><w:basedOn w:val="Heading1CharCharChar"/><w:link w:val="Style4"/><w:rsid w:val="00975708"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Style7"><w:name w:val="Style7"/><w:basedOn w:val="Heading2"/><w:link w:val="Style7Char"/><w:rsid w:val="00975708"/><w:pPr><w:pStyle w:val="Style7"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="Style7Char"><w:name w:val="Style7 Char"/><w:basedOn w:val="CharChar2"/><w:link w:val="Style7"/><w:rsid w:val="00975708"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b/><w:snapToGrid w:val="off"/><w:sz w:val="28"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BlockQuotation"><w:name w:val="Block Quotation"/><w:basedOn w:val="Normal"/><w:rsid w:val="006C5843"/><w:pPr><w:pStyle w:val="BlockQuotation"/><w:pBdr><w:top w:val="single" w:sz="12" wx:bdrwidth="30" w:space="12" w:color="FFFFFF"/><w:left w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/><w:bottom w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/><w:right w:val="single" w:sz="6" wx:bdrwidth="15" w:space="12" w:color="FFFFFF"/></w:pBdr><w:shd w:val="pct-5" w:color="auto" w:fill="auto" wx:bgcolor="F2F2F2"/><w:spacing w:before="0" w:after="240" w:line="220" w:line-rule="at-least"/><w:ind w:left="1368" w:right="240"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial Narrow" w:h-ansi="Arial Narrow"/><wx:font wx:val="Arial Narrow"/><w:i w:val="off"/><w:spacing w:val="-5"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="Emphasis"><w:name w:val="Emphasis"/><w:rsid w:val="006C5843"/><w:rPr><w:rFonts w:ascii="Arial Black" w:h-ansi="Arial Black"/><w:spacing w:val="-4"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Paragraph"><w:name w:val="Paragraph"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F55FE3"/><w:pPr><w:pStyle w:val="Paragraph"/><w:widowControl w:val="off"/><w:spacing w:before="0" w:after="120"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i w:val="off"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="MetricName"><w:name w:val="MetricName"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00F55FE3"/><w:pPr><w:pStyle w:val="MetricName"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="0" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:sz w:val="28"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitleCenteredNoTOC"><w:name w:val="Title Centered No TOC"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F55FE3"/><w:pPr><w:pStyle w:val="TitleCenteredNoTOC"/><w:spacing w:before="0" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:i w:val="off"/><w:sz w:val="32"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="007D3C0D"/><w:pPr><w:pStyle w:val="TOC2"/><w:tabs><w:tab w:val="right" w:pos="7920"/></w:tabs><w:ind w:left="240"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:i w:val="off"/><w:noProof/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="LockInfo"><w:name w:val="LockInfo"/><w:basedOn w:val="Normal"/><w:rsid w:val="008F1DF6"/><w:pPr><w:pStyle w:val="LockInfo"/><w:spacing w:before="0" w:line="240" w:line-rule="exact"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:i w:val="off"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1CharChar"><w:name w:val="Heading 1 Char Char"/><w:aliases w:val="Heading 1 Char1 Char1 Char,Heading 1 Char Char Char Char,Heading 1 Char1 Char1 Char Char Char,Heading 1 Char Char Char1 Char Char Char,Heading 1 Char1 Char Char Char Char Char,Heading 1 Char Char Char Char Char Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="007F4558"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:sz w:val="32"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00601AA7"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00601AA7"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00601AA7"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="character" w:styleId="BodyTextIndentChar"><w:name w:val="Body Text Indent Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyTextIndent"/><w:rsid w:val="00370221"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><w:b/><w:b-cs/><w:i/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="StyleArial10ptNotItalicBoxSinglesolidlineAuto05"><w:name w:val="Style Arial 10 pt Not Italic Box: (Single solid line Auto 0.5..."/><w:basedOn w:val="Normal"/><w:rsid w:val="007D3C0D"/><w:pPr><w:pStyle w:val="StyleArial10ptNotItalicBoxSinglesolidlineAuto05"/><w:pBdr><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/></w:pBdr></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:i w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style></w:styles><w:divs><w:div w:id="1305426348"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr><w:divsChild><w:div w:id="105387402"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr><w:divsChild><w:div w:id="936331961"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1052730622"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1123303473"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div></w:divsChild></w:div></w:divsChild></w:div><w:div w:id="1345791826"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1681007958"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr><w:divsChild><w:div w:id="1382709956"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr><w:divsChild><w:div w:id="629433569"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="913395468"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1335374280"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1624729226"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1709183193"><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div></w:divsChild></w:div></w:divsChild></w:div></w:divs><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="2059"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="2059"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="2"/></o:shapelayout></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="009F530D" wsp:rsidRDefault="009F530D"><w:r><w:separator/></w:r></w:p></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="009F530D" wsp:rsidRDefault="009F530D"><w:r><w:continuationSeparator/></w:r></w:p></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="009F530D" wsp:rsidRDefault="009F530D"><w:r><w:separator/></w:r></w:p></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="009F530D" wsp:rsidRDefault="009F530D"><w:r><w:continuationSeparator/></w:r></w:p></w:endnote></w:endnotePr><w:compat><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00246C37"/><wsp:rsid wsp:val="00002E31"/><wsp:rsid wsp:val="00012438"/><wsp:rsid wsp:val="000365D9"/><wsp:rsid wsp:val="0004431D"/><wsp:rsid wsp:val="00045B91"/><wsp:rsid wsp:val="00046C33"/><wsp:rsid wsp:val="0008201C"/><wsp:rsid wsp:val="00084D7B"/><wsp:rsid wsp:val="00094907"/><wsp:rsid wsp:val="000A517E"/><wsp:rsid wsp:val="000F0257"/><wsp:rsid wsp:val="00106C1B"/><wsp:rsid wsp:val="00122588"/><wsp:rsid wsp:val="00125D1F"/><wsp:rsid wsp:val="001302CF"/><wsp:rsid wsp:val="00162D98"/><wsp:rsid wsp:val="001819FC"/><wsp:rsid wsp:val="001919EE"/><wsp:rsid wsp:val="001A26D6"/><wsp:rsid wsp:val="001A55B0"/><wsp:rsid wsp:val="001B5AC1"/><wsp:rsid wsp:val="001B73B3"/><wsp:rsid wsp:val="001D1E6D"/><wsp:rsid wsp:val="001E1921"/><wsp:rsid wsp:val="001E5217"/><wsp:rsid wsp:val="001E53A6"/><wsp:rsid wsp:val="002049C8"/><wsp:rsid wsp:val="00232374"/><wsp:rsid wsp:val="00235583"/><wsp:rsid wsp:val="00246C37"/><wsp:rsid wsp:val="0025064D"/><wsp:rsid wsp:val="0025126A"/><wsp:rsid wsp:val="0026511D"/><wsp:rsid wsp:val="002724E3"/><wsp:rsid wsp:val="002809CD"/><wsp:rsid wsp:val="00285813"/><wsp:rsid wsp:val="002A409F"/><wsp:rsid wsp:val="002B2CE0"/><wsp:rsid wsp:val="002F2506"/><wsp:rsid wsp:val="002F295B"/><wsp:rsid wsp:val="00325F65"/><wsp:rsid wsp:val="00326C6B"/><wsp:rsid wsp:val="00335B36"/><wsp:rsid wsp:val="0036170F"/><wsp:rsid wsp:val="00370221"/><wsp:rsid wsp:val="003855FB"/><wsp:rsid wsp:val="00386AE9"/><wsp:rsid wsp:val="003978CB"/><wsp:rsid wsp:val="003B46E4"/><wsp:rsid wsp:val="003B496E"/><wsp:rsid wsp:val="003B596D"/><wsp:rsid wsp:val="003C13CA"/><wsp:rsid wsp:val="003D73BD"/><wsp:rsid wsp:val="003E7101"/><wsp:rsid wsp:val="003F1855"/><wsp:rsid wsp:val="00400C93"/><wsp:rsid wsp:val="00404DED"/><wsp:rsid wsp:val="00407E12"/><wsp:rsid wsp:val="004253DB"/><wsp:rsid wsp:val="00444144"/><wsp:rsid wsp:val="00445CA9"/><wsp:rsid wsp:val="0047796D"/><wsp:rsid wsp:val="00485161"/><wsp:rsid wsp:val="00487FF1"/><wsp:rsid wsp:val="004A0776"/><wsp:rsid wsp:val="004B3454"/><wsp:rsid wsp:val="004B5FCB"/><wsp:rsid wsp:val="004E76B3"/><wsp:rsid wsp:val="0053063A"/><wsp:rsid wsp:val="00547CA3"/><wsp:rsid wsp:val="0055716E"/><wsp:rsid wsp:val="0057492C"/><wsp:rsid wsp:val="00574E55"/><wsp:rsid wsp:val="005820D0"/><wsp:rsid wsp:val="00595B8C"/><wsp:rsid wsp:val="00597FA7"/><wsp:rsid wsp:val="005A1BFC"/><wsp:rsid wsp:val="005A464B"/><wsp:rsid wsp:val="005A6271"/><wsp:rsid wsp:val="005C1377"/><wsp:rsid wsp:val="005C6AAF"/><wsp:rsid wsp:val="005D0F30"/><wsp:rsid wsp:val="005D1D49"/><wsp:rsid wsp:val="005D762E"/><wsp:rsid wsp:val="00601AA7"/><wsp:rsid wsp:val="00612982"/><wsp:rsid wsp:val="00626EE4"/><wsp:rsid wsp:val="00630529"/><wsp:rsid wsp:val="00634D04"/><wsp:rsid wsp:val="00635F90"/><wsp:rsid wsp:val="006360FB"/><wsp:rsid wsp:val="006661C9"/><wsp:rsid wsp:val="006675A3"/><wsp:rsid wsp:val="00684FFE"/><wsp:rsid wsp:val="006C50FD"/><wsp:rsid wsp:val="006C5843"/><wsp:rsid wsp:val="006D0EB6"/><wsp:rsid wsp:val="006F6037"/><wsp:rsid wsp:val="00714C64"/><wsp:rsid wsp:val="007237FE"/><wsp:rsid wsp:val="00726556"/><wsp:rsid wsp:val="00733B2A"/><wsp:rsid wsp:val="00757471"/><wsp:rsid wsp:val="0078179F"/><wsp:rsid wsp:val="007A6EDC"/><wsp:rsid wsp:val="007B6939"/><wsp:rsid wsp:val="007C018F"/><wsp:rsid wsp:val="007D3C0D"/><wsp:rsid wsp:val="007D3FD6"/><wsp:rsid wsp:val="007E4520"/><wsp:rsid wsp:val="007F4558"/><wsp:rsid wsp:val="00827BF5"/><wsp:rsid wsp:val="00832E56"/><wsp:rsid wsp:val="00836706"/><wsp:rsid wsp:val="008629D1"/><wsp:rsid wsp:val="00870157"/><wsp:rsid wsp:val="00882550"/><wsp:rsid wsp:val="008A45C2"/><wsp:rsid wsp:val="008B73EF"/><wsp:rsid wsp:val="008D02ED"/><wsp:rsid wsp:val="008D0B05"/><wsp:rsid wsp:val="008F0D61"/><wsp:rsid wsp:val="008F1DF6"/><wsp:rsid wsp:val="009149AC"/><wsp:rsid wsp:val="00921C3F"/><wsp:rsid wsp:val="00922A27"/><wsp:rsid wsp:val="00923201"/><wsp:rsid wsp:val="00942496"/><wsp:rsid wsp:val="009451F6"/><wsp:rsid wsp:val="00964BBC"/><wsp:rsid wsp:val="00967C62"/><wsp:rsid wsp:val="00975708"/><wsp:rsid wsp:val="0098427C"/><wsp:rsid wsp:val="009A7657"/><wsp:rsid wsp:val="009C0805"/><wsp:rsid wsp:val="009D5443"/><wsp:rsid wsp:val="009F530D"/><wsp:rsid wsp:val="00A038D3"/><wsp:rsid wsp:val="00A43D78"/><wsp:rsid wsp:val="00A47798"/><wsp:rsid wsp:val="00A619E4"/><wsp:rsid wsp:val="00A72A7C"/><wsp:rsid wsp:val="00A8263D"/><wsp:rsid wsp:val="00AA70FA"/><wsp:rsid wsp:val="00AB0E1C"/><wsp:rsid wsp:val="00AB62A8"/><wsp:rsid wsp:val="00AC239E"/><wsp:rsid wsp:val="00AE5BA2"/><wsp:rsid wsp:val="00B034D5"/><wsp:rsid wsp:val="00B041A7"/><wsp:rsid wsp:val="00B1264E"/><wsp:rsid wsp:val="00B45B3F"/><wsp:rsid wsp:val="00B8251A"/><wsp:rsid wsp:val="00B82B03"/><wsp:rsid wsp:val="00BA1BDD"/><wsp:rsid wsp:val="00BB7A01"/><wsp:rsid wsp:val="00BD27F9"/><wsp:rsid wsp:val="00BE00AE"/><wsp:rsid wsp:val="00BE5DC2"/><wsp:rsid wsp:val="00C24740"/><wsp:rsid wsp:val="00C37586"/><wsp:rsid wsp:val="00C41D55"/><wsp:rsid wsp:val="00C450E4"/><wsp:rsid wsp:val="00C57F28"/><wsp:rsid wsp:val="00C62075"/><wsp:rsid wsp:val="00CA4B86"/><wsp:rsid wsp:val="00CA555E"/><wsp:rsid wsp:val="00CA6088"/><wsp:rsid wsp:val="00CB790D"/><wsp:rsid wsp:val="00CC2228"/><wsp:rsid wsp:val="00CC7E74"/><wsp:rsid wsp:val="00CD4187"/><wsp:rsid wsp:val="00D0617E"/><wsp:rsid wsp:val="00D569EB"/><wsp:rsid wsp:val="00D6185E"/><wsp:rsid wsp:val="00DA27A5"/><wsp:rsid wsp:val="00DA65AA"/><wsp:rsid wsp:val="00E24A8E"/><wsp:rsid wsp:val="00E317C5"/><wsp:rsid wsp:val="00E54913"/><wsp:rsid wsp:val="00E55D17"/><wsp:rsid wsp:val="00E630C5"/><wsp:rsid wsp:val="00E75F8A"/><wsp:rsid wsp:val="00E76834"/><wsp:rsid wsp:val="00E93726"/><wsp:rsid wsp:val="00E962E0"/><wsp:rsid wsp:val="00EB2BB5"/><wsp:rsid wsp:val="00EC7CB7"/><wsp:rsid wsp:val="00ED3602"/><wsp:rsid wsp:val="00EE7043"/><wsp:rsid wsp:val="00F04452"/><wsp:rsid wsp:val="00F12AC9"/><wsp:rsid wsp:val="00F2109B"/><wsp:rsid wsp:val="00F53407"/><wsp:rsid wsp:val="00F55FE3"/><wsp:rsid wsp:val="00F675EB"/><wsp:rsid wsp:val="00F77F10"/><wsp:rsid wsp:val="00FB0D02"/><wsp:rsid wsp:val="00FB5E89"/><wsp:rsid wsp:val="00FC1BD1"/><wsp:rsid wsp:val="00FC1E3F"/></wsp:rsids></w:docPr><w:body><wx:sect><ns0:Artifact><w:p wsp:rsidR="0008201C" wsp:rsidRPr="00326C6B" wsp:rsidRDefault="00326C6B" wsp:rsidP="005D0F30"><Set_Name><w:proofErr w:type="spellStart"/><w:r><w:t>Default</w:t></w:r></Set_Name><Attribute><Name><w:r wsp:rsidRPr="00A34EA3"><w:t>Name</w:t></w:r></Name><Format><w:r wsp:rsidRPr="00A34EA3"><w:rPr><w:b/></w:rPr><w:t>x</w:t></w:r></Format></Attribute><Attribute><Name><w:r><w:t>Word</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r><w:t> Formatted Content</w:t></w:r></Name></Attribute></w:p></ns0:Artifact><w:sectPr wsp:rsidR="0008201C" wsp:rsidRPr="00326C6B" wsp:rsidSect="00626EE4"><w:hdr w:type="odd"><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00876C20" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00084D7B"><w:pPr><w:pStyle w:val="ManualHeading"/><w:ind w:left="0"/><w:jc w:val="center"/></w:pPr><w:r wsp:rsidRPr="00876C20"><w:t>Boeing Proprietary</w:t></w:r></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00046C33" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00E24A8E"><w:pPr><w:pStyle w:val="BodyText"/></w:pPr><w:r wsp:rsidRPr="00046C33"><w:t>AH-64_MSA_</w:t></w:r><w:r><w:t>Improve_Processes</w:t></w:r><w:r wsp:rsidRPr="00046C33"><w:t>_WI</w:t></w:r><w:r wsp:rsidRPr="00046C33"><w:tab wx:wTab="2775" wx:tlc="none" wx:cTlc="45"/><w:t>Revision &amp; Date: ORIG 20070901</w:t></w:r></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00A47798" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00A47798"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:ftr w:type="odd"><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00FF3B01" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00A47798"><w:pPr><w:pStyle w:val="Footer"/><w:spacing w:before="40" w:after="40"/><w:jc w:val="center"/><w:rPr><w:sz w:val="20"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00FF3B01"><w:rPr><w:sz w:val="20"/></w:rPr><w:t>Printed Copies UNCONTROLLED. CONTROLLED copy in electronic form on </w:t></w:r><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:t>PHL-File-03</w:t></w:r><w:r wsp:rsidRPr="00FF3B01"><w:rPr><w:sz w:val="20"/></w:rPr><w:t> server.</w:t></w:r></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00FF3B01" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00A47798"><w:pPr><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="40"/><w:jc w:val="center"/><w:rPr><w:sz w:val="20"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00FF3B01"><w:rPr><w:sz w:val="20"/></w:rPr><w:t>Use or disclosure of data contained herein is subject to any restriction shown on this sheet or on the title page. </w:t></w:r></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00A47798"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00A47798" wsp:rsidRDefault="003D73BD" wsp:rsidP="00A47798"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/></w:pPr><w:r><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r wsp:rsidR="002B2CE0"><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:instrText> PAGE </w:instrText></w:r><w:r><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="005D0F30"><w:rPr><w:rStyle w:val="PageNumber"/><w:noProof/></w:rPr><w:t>2</w:t></w:r><w:r><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:p></w:ftr><w:hdr w:type="first"><w:p wsp:rsidR="002B2CE0" wsp:rsidRPr="00876C20" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00BB7A01"><w:pPr><w:pStyle w:val="ManualHeading"/><w:ind w:left="0"/><w:jc w:val="center"/></w:pPr><w:r wsp:rsidRPr="00876C20"><w:t>Boeing Proprietary</w:t></w:r></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRDefault="002B2CE0"><w:pPr><w:pStyle w:val="ManualHeading"/><w:ind w:left="0"/></w:pPr><w:r><w:t> </w:t></w:r></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRDefault="003D73BD"><w:pPr><w:pStyle w:val="Header"/><w:rPr><w:sz w:val="22"/></w:rPr></w:pPr><w:r wsp:rsidRPr="003D73BD"><w:rPr><w:noProof/></w:rPr><w:pict><v:group id="_x0000_s2049" style="position:absolute;margin-left:189.05pt;margin-top:-7.95pt;width:92.9pt;height:19.75pt;z-index:1" coordorigin="1599,969" coordsize="1858,395"><v:shape id="_x0000_s2050" style="position:absolute;left:1599;top:969;width:491;height:395" coordsize="4417,3555" path="m2422,2158r14,-29l2450,2098r11,-31l2472,2036r12,-32l2493,1972r9,-32l2510,1907r7,-33l2524,1841r5,-33l2534,1773r3,-34l2539,1705r2,-35l2541,1635r,-41l2539,1555r-3,-39l2531,1476r-5,-39l2518,1398r-8,-38l2501,1323r-11,-37l2479,1249r-13,-36l2453,1178r-15,-36l2421,1107r-16,-34l2387,1040r-20,-33l2347,975r-21,-31l2304,913r-23,-31l2258,853r-25,-29l2208,797r-26,-28l2155,742r-28,-25l2097,692r-29,-24l2038,645r-31,-22l1975,602r77,-77l2131,448r80,-76l2293,296r82,-74l2460,147r86,-74l2633,r-52,29l2531,60r-51,31l2430,122r-49,33l2330,187r-49,34l2233,253r-48,34l2137,322r-47,34l2044,391r-47,36l1951,463r-45,36l1861,535r-33,-16l1793,503r-34,-14l1724,475r-35,-12l1653,450r-36,-10l1580,430r-38,-8l1505,415r-39,-8l1428,402r-39,-4l1350,395r-40,-2l1271,393r-65,1l1141,399r-64,8l1015,419r-62,13l892,448r-58,21l776,490r-56,26l664,543r-53,30l560,606r-50,33l462,677r-46,39l372,757r-42,43l290,845r-38,47l217,941r-33,50l153,1043r-28,54l100,1152r-23,56l57,1265r-18,60l26,1385r-12,61l6,1509r-4,62l,1635r,29l1,1692r2,29l5,1750r3,28l11,1807r5,27l21,1862r6,28l32,1916r7,28l47,1970r8,27l63,2023r10,26l82,2074r11,26l103,2126r12,24l126,2176r13,23l152,2224r13,23l179,2271r15,23l209,2317r15,22l240,2360r17,23l274,2403r17,22l309,2445r-23,48l265,2540r-20,47l227,2633r-17,45l193,2723r-15,44l165,2810r-13,42l141,2893r-11,41l122,2972r-7,39l108,3048r-4,37l101,3119r-2,35l98,3187r1,32l101,3249r3,30l108,3307r7,27l123,3359r8,25l142,3406r12,22l168,3448r15,19l199,3484r18,15l236,3513r23,13l282,3536r25,8l334,3551r27,3l391,3555r30,-1l452,3551r32,-6l516,3538r33,-9l584,3518r34,-13l653,3489r35,-17l724,3453r37,-20l796,3411r37,-24l868,3362r36,-27l940,3306r35,-29l1010,3245r35,-33l1078,3179r34,-35l1144,3107r31,-38l1207,3031r29,-40l1265,2950r-21,17l1189,3012r-40,30l1104,3074r-49,34l1001,3143r-27,16l945,3176r-30,15l886,3206r-30,15l826,3234r-30,11l767,3255r-30,8l707,3271r-28,5l651,3278r-27,1l598,3277r-27,-5l547,3264r-14,-6l519,3252r-11,-8l496,3235r-11,-10l475,3214r-8,-12l459,3189r-7,-13l446,3161r-5,-16l437,3129r-5,-18l430,3093r-2,-19l427,3054r,-20l427,3012r2,-22l431,2967r4,-23l439,2919r4,-25l449,2868r6,-26l463,2814r7,-29l478,2757r20,-58l521,2636r40,28l602,2690r43,25l687,2737r44,22l776,2779r46,18l869,2813r24,8l917,2828r24,6l965,2841r24,6l1015,2852r25,5l1065,2861r25,4l1115,2868r26,3l1166,2873r26,2l1218,2876r26,1l1271,2877r32,l1335,2875r33,-2l1399,2871r33,-4l1463,2863r31,-5l1525,2853r30,-7l1586,2839r29,-9l1646,2822r29,-9l1704,2803r30,-10l1762,2781r28,-12l1817,2757r27,-13l1872,2729r27,-14l1925,2700r26,-16l1976,2668r25,-16l2026,2634r24,-18l2073,2597r24,-18l2119,2559r23,-20l2164,2519r45,83l2325,2593r138,-8l2619,2577r169,-7l3151,2556r370,-14l3865,2531r285,-8l4345,2517r72,-2l4414,2509r-9,-7l4389,2496r-21,-4l4342,2487r-32,-4l4273,2480r-42,-4l4022,2461r-265,-23l3683,2431r-77,-7l3528,2415r-79,-11l3366,2393r-82,-13l3199,2367r-86,-17l3026,2333r-86,-18l2853,2294r-87,-23l2679,2246r-86,-26l2507,2190r-85,-32xm354,2352r-29,-36l297,2277r-14,-20l270,2237r-12,-21l245,2196r-23,-42l201,2111r-19,-44l165,2022r-9,-23l148,1976r-6,-23l135,1929r-7,-23l123,1882r-5,-24l114,1834r-5,-24l105,1785r-3,-24l100,1736r-2,-25l97,1685r-1,-24l96,1635r1,-59l102,1518r7,-57l120,1403r12,-55l148,1294r19,-54l188,1188r24,-51l237,1088r28,-48l297,993r32,-45l363,905r38,-42l440,823r40,-38l523,749r44,-34l613,683r48,-30l710,625r52,-26l813,577r54,-20l922,538r55,-15l1033,510r59,-10l1150,492r60,-4l1271,487r34,l1339,489r34,2l1406,494r33,4l1472,503r33,7l1537,517r31,8l1600,533r31,10l1661,554r31,10l1722,576r29,12l1781,602r-60,52l1661,706r-59,53l1544,813r-56,53l1432,920r-55,55l1323,1031r-52,55l1218,1141r-50,56l1118,1252r-49,56l1021,1365r-46,56l929,1477r-44,56l841,1589r-43,56l757,1702r-39,56l678,1813r-38,56l604,1924r-36,55l534,2034r-33,54l469,2142r-30,53l409,2248r-28,53l354,2352xm1751,1762r365,669l2096,2451r-21,20l2053,2490r-21,19l2010,2527r-22,17l1965,2562r-24,16l1916,2593r-24,16l1867,2624r-25,14l1816,2652r-25,13l1764,2677r-26,11l1711,2700r-28,10l1656,2720r-28,9l1600,2737r-29,9l1542,2753r-29,6l1484,2765r-31,4l1424,2774r-30,3l1364,2780r-32,2l1302,2783r-31,l1246,2783r-26,-1l1195,2781r-24,-2l1122,2774r-48,-7l1050,2763r-24,-4l1002,2753r-23,-5l933,2735r-46,-15l843,2705r-44,-19l756,2667r-41,-22l674,2623r-40,-25l594,2573r-37,-27l579,2498r22,-49l625,2399r25,-51l677,2297r28,-53l735,2190r32,-54l799,2081r35,-57l869,1967r37,-57l943,1852r40,-59l1024,1733r43,-60l1110,1613r45,-62l1201,1490r47,-61l1297,1367r49,-63l1397,1241r52,-62l1503,1115r54,-63l1612,989r58,-64l1727,861r59,-63l1846,734r61,-63l1937,690r30,21l1996,732r27,23l2050,777r27,24l2103,825r25,26l2153,877r23,27l2199,931r21,28l2240,988r20,29l2280,1047r18,31l2315,1109r16,32l2346,1174r15,32l2374,1240r12,34l2397,1307r10,35l2416,1378r7,36l2431,1449r5,37l2440,1523r3,37l2445,1597r,38l2445,1668r-1,32l2441,1732r-3,32l2434,1796r-5,31l2423,1858r-7,31l2409,1919r-9,30l2391,1978r-9,30l2370,2038r-11,28l2347,2094r-14,28l2294,2105r-40,-18l2214,2068r-38,-19l2137,2029r-38,-21l2062,1987r-37,-23l1989,1942r-36,-24l1918,1895r-35,-26l1849,1844r-34,-27l1783,1791r-32,-29xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/><o:lock v:ext="edit" verticies="t"/></v:shape><v:shape id="_x0000_s2051" style="position:absolute;left:2507;top:1053;width:270;height:143" coordsize="2430,1285" path="m1838,768l2046,499r-722,l1501,268r723,l2430,,990,,,1285r1440,l1647,1016r-722,l1117,768r721,xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/></v:shape><v:shape id="_x0000_s2052" style="position:absolute;left:2712;top:1053;width:190;height:143" coordsize="1711,1285" path="m992,l,1285r719,l1711,,992,xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/></v:shape><v:shape id="_x0000_s2053" style="position:absolute;left:2843;top:1053;width:298;height:143" coordsize="2686,1285" path="m2210,l1708,651,1553,,992,,,1285r477,l974,639r153,646l1694,1285,2686,,2210,xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/></v:shape><v:shape id="_x0000_s2054" style="position:absolute;left:3097;top:1053;width:272;height:143" coordsize="2448,1285" path="m2272,l1116,r-19,l1080,1r-19,1l1043,4r-36,5l973,16r-35,9l905,36,873,50,841,64,811,80,782,98r-29,19l726,139r-25,22l676,185r-23,24l632,236,35,1009r-8,11l21,1032r-6,13l9,1057r-4,13l2,1085r-1,14l,1113r1,17l3,1148r5,16l14,1180r7,15l30,1209r11,13l51,1235r13,11l77,1255r15,9l108,1271r15,7l140,1282r18,2l177,1285r1154,l1350,1285r18,-1l1387,1283r18,-2l1422,1279r18,-3l1458,1272r17,-4l1509,1259r34,-11l1575,1236r31,-16l1637,1205r29,-18l1694,1167r27,-20l1746,1124r25,-23l1794,1075r21,-26l1960,863r166,l2335,592r-885,l1170,955r-11,13l1145,980r-14,11l1116,1000r-8,3l1099,1007r-8,2l1082,1012r-10,2l1064,1015r-10,1l1045,1016r-204,l832,1015r-9,-3l815,1008r-6,-5l803,997r-5,-9l796,980r-1,-9l795,968r1,-4l796,960r1,-3l799,954r1,-3l803,948r2,-3l1278,330r12,-14l1303,304r14,-10l1332,286r17,-7l1367,272r8,-1l1385,269r9,-1l1404,268r203,l1617,269r8,3l1633,277r7,5l1645,289r4,7l1652,304r1,9l1653,317r-1,3l1652,325r-1,3l1649,331r-1,3l1646,337r-2,3l1567,440r719,l2412,276r8,-12l2427,253r6,-12l2438,227r4,-13l2446,200r1,-13l2448,171r-1,-17l2443,138r-4,-18l2434,105r-8,-15l2417,75,2407,62,2396,50,2384,40,2370,29r-14,-9l2340,13,2324,8,2307,3,2290,1,2272,xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/></v:shape><v:shape id="_x0000_s2055" style="position:absolute;left:2279;top:1053;width:272;height:143" coordsize="2448,1285" path="m2448,171r-1,-17l2444,138r-5,-18l2434,105r-8,-15l2418,75,2407,62,2396,50,2383,40,2371,29r-15,-9l2340,13,2323,8,2307,3,2290,1,2271,,1116,r-18,l1080,1r-19,1l1043,4r-35,5l973,16r-34,9l905,36,873,50,841,64,811,80,782,98r-28,19l727,139r-26,22l676,185r-23,24l632,236,36,1009r-9,11l21,1032r-6,13l10,1057r-5,14l2,1085r-1,14l,1113r1,17l4,1148r5,16l14,1180r7,15l30,1209r11,13l52,1235r12,11l78,1256r14,8l108,1271r15,7l141,1282r17,2l177,1285r1155,l1350,1285r18,-1l1386,1283r19,-2l1423,1279r17,-3l1458,1272r17,-4l1509,1259r34,-11l1575,1236r32,-16l1637,1205r29,-18l1694,1167r27,-20l1747,1124r25,-23l1795,1075r21,-26l2412,276r9,-12l2427,253r6,-12l2438,227r5,-13l2446,201r1,-14l2448,171xm1644,340l1171,955r-12,13l1146,980r-15,11l1116,1000r-8,3l1100,1007r-9,2l1082,1012r-10,2l1064,1015r-9,1l1045,1016r-204,l832,1015r-8,-3l815,1008r-6,-5l803,997r-4,-9l797,980r-1,-9l796,968r1,-4l797,961r1,-4l800,954r1,-3l803,948r2,-3l1278,330r12,-14l1303,304r14,-10l1333,286r16,-7l1367,273r9,-2l1385,269r9,l1404,268r204,l1617,269r8,3l1634,277r6,5l1645,289r4,7l1653,304r1,9l1654,317r-1,3l1651,325r,3l1649,331r-1,3l1646,337r-2,3xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/><o:lock v:ext="edit" verticies="t"/></v:shape><v:shape id="_x0000_s2056" style="position:absolute;left:2016;top:1053;width:291;height:143" coordsize="2624,1285" path="m2452,452l2589,276r8,-12l2603,253r6,-12l2615,227r4,-13l2621,201r2,-14l2624,171r-1,-17l2620,138r-4,-18l2609,105r-7,-15l2594,75,2583,62,2572,50,2559,40,2546,29r-14,-9l2516,13,2500,8,2483,3,2466,1,2447,,1710,,991,,,1285r683,l1508,1285r18,l1544,1284r18,-1l1581,1281r18,-2l1617,1276r17,-4l1651,1268r35,-9l1719,1248r32,-12l1783,1220r30,-15l1842,1187r29,-20l1898,1147r25,-23l1948,1101r23,-26l1992,1049,2132,868r6,-9l2143,850r6,-11l2153,829r3,-10l2158,808r1,-12l2160,785r-1,-17l2156,752r-5,-16l2144,722r-8,-14l2127,695r-12,-11l2103,674r26,-6l2155,660r25,-9l2205,641r24,-10l2253,619r23,-13l2298,592r22,-14l2341,563r21,-17l2382,529r18,-18l2418,492r18,-19l2452,452xm1436,839r-89,116l1334,968r-12,12l1307,991r-14,9l1284,1004r-8,3l1266,1010r-8,2l1249,1014r-10,1l1230,1016r-10,l926,1016,1117,768r282,l1408,769r9,3l1424,776r8,5l1437,788r4,7l1443,804r1,9l1444,817r,3l1443,824r-1,3l1441,830r-2,3l1438,836r-2,3xm1820,340r-75,98l1734,451r-14,12l1706,474r-15,9l1682,487r-8,3l1666,493r-10,2l1648,497r-10,1l1629,499r-9,l1324,499,1502,268r282,l1793,269r9,3l1809,277r7,5l1821,289r5,7l1829,304r1,9l1830,317r-1,3l1828,325r-1,3l1826,331r-1,3l1822,337r-2,3xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/><o:lock v:ext="edit" verticies="t"/></v:shape><v:shape id="_x0000_s2057" style="position:absolute;left:3401;top:1051;width:56;height:54" coordsize="502,491" path="m251,l238,1,225,2,212,3,201,5,188,8r-11,4l164,16r-10,4l142,25r-10,5l120,36r-9,6l100,49r-9,7l83,65,73,73r-8,8l58,90r-8,9l43,109r-6,10l30,129r-5,10l20,150r-4,12l12,173,8,184,5,196,3,209,1,221r,12l,245r1,14l1,271r2,12l5,296r3,11l12,319r4,11l20,341r5,11l30,363r7,10l43,383r7,10l58,402r7,9l73,419r10,8l91,434r9,9l111,449r9,7l132,461r10,6l154,471r10,5l177,479r11,4l201,486r11,2l225,490r13,1l251,491r12,l277,490r13,-2l301,486r13,-3l325,479r13,-3l349,471r11,-4l370,461r10,-5l391,449r10,-6l411,434r8,-7l429,419r8,-8l444,402r8,-9l459,383r6,-10l471,363r6,-11l482,341r4,-11l490,319r3,-12l497,296r2,-13l501,271r1,-12l502,245r,-12l501,221r-2,-12l497,196r-4,-12l490,173r-4,-11l482,150r-5,-11l471,129r-6,-10l459,109,452,99r-8,-9l437,81r-8,-8l419,65r-8,-9l401,49,391,42,380,36,370,30,360,25,349,20,338,16,325,12,314,8,301,5,290,3,277,2,263,1,251,xm252,469r-13,l228,468r-12,-2l205,464r-11,-2l183,459r-10,-3l162,452r-9,-5l142,443r-9,-7l123,431r-8,-6l107,418r-9,-7l91,404r-7,-7l76,388r-6,-9l64,371r-6,-9l52,353,47,342r-4,-9l39,323,36,312,32,302,30,290,28,280,27,269,26,258r,-13l26,234r1,-12l28,211r2,-12l32,189r4,-11l39,168r4,-10l47,147r5,-9l58,129r5,-9l69,111r6,-9l83,94r7,-8l98,79r8,-6l114,66r9,-6l133,54r9,-6l152,44r10,-5l173,36r10,-4l193,29r12,-2l216,25r12,-1l239,23r13,l263,23r12,1l286,25r12,2l309,29r11,3l330,36r11,3l361,49r18,11l396,73r16,14l426,102r13,18l451,138r8,20l466,178r5,21l474,211r2,11l476,233r1,12l476,257r,11l474,279r-3,11l469,302r-3,10l463,322r-4,10l449,352r-10,18l433,379r-7,8l419,396r-7,8l396,418r-17,13l370,436r-9,7l350,447r-9,5l330,456r-10,3l309,462r-11,2l286,466r-11,2l263,469r-11,xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/><o:lock v:ext="edit" verticies="t"/></v:shape><v:shape id="_x0000_s2058" style="position:absolute;left:3419;top:1062;width:24;height:32" coordsize="219,290" path="m208,80r-1,-9l206,62r-1,-8l202,45r-3,-7l194,31r-4,-5l185,20r-6,-4l171,12,163,8,155,6,145,2,135,1,123,,111,,,,,290r25,l25,156r77,l191,290r28,l132,157r14,-3l161,149r6,-4l173,141r7,-3l185,133r5,-5l194,123r5,-6l202,111r2,-7l206,96r1,-8l208,80xm89,134r-64,l25,22r83,l120,22r14,2l146,28r12,6l163,37r4,4l171,46r5,6l179,58r2,6l182,71r,8l182,88r-2,8l178,103r-5,6l169,115r-5,4l159,123r-6,3l145,128r-7,2l130,131r-8,2l106,134r-17,xe" fillcolor="blue" stroked="f"><v:path arrowok="t"/><o:lock v:ext="edit" verticies="t"/></v:shape></v:group></w:pict></w:r></w:p></w:hdr><w:ftr w:type="first"><w:p wsp:rsidR="002B2CE0" wsp:rsidRDefault="002B2CE0"><w:pPr><w:pStyle w:val="Footer"/></w:pPr><w:r><w:t>Printout of this document is for information only and is consid</w:t></w:r><w:r wsp:rsidR="005D0F30"><w:t>ered an uncontrolled document.</w:t></w:r></w:p><w:p wsp:rsidR="005D0F30" wsp:rsidRDefault="005D0F30"><w:pPr><w:pStyle w:val="Footer"/></w:pPr></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRDefault="002B2CE0"><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="clear" w:pos="4320"/><w:tab w:val="clear" w:pos="8640"/></w:tabs><w:rPr><w:sz w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:i w:val="off"/><w:sz w:val="18"/></w:rPr><w:t>THE INFORMATION CONTAINED HEREIN IS </w:t></w:r><w:r><w:rPr><w:b/><w:i w:val="off"/><w:sz w:val="18"/></w:rPr><w:t>PROPRIETARY</w:t></w:r><w:r><w:rPr><w:i w:val="off"/><w:sz w:val="18"/></w:rPr><w:t> TO THE BOEING COMPANY AND SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED FOR ANY DESIGN OR MANUFACTURE EXCEPT WHEN SUCH USER POSSESSES DIRECT, WRITTEN AUTHORIZATION FROM THE BOEING COMPANY</w:t></w:r><w:r><w:rPr><w:sz w:val="18"/></w:rPr><w:t>.</w:t></w:r></w:p><w:p wsp:rsidR="005D0F30" wsp:rsidRDefault="005D0F30" wsp:rsidP="00A47798"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="002B2CE0" wsp:rsidRDefault="002B2CE0" wsp:rsidP="00A47798"><w:pPr><w:pStyle w:val="Footer"/><w:jc w:val="center"/><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr></w:pPr><w:r><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:t>Page </w:t></w:r><w:r wsp:rsidR="003D73BD"><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:instrText> PAGE </w:instrText></w:r><w:r wsp:rsidR="003D73BD"><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r wsp:rsidR="00326C6B"><w:rPr><w:rStyle w:val="PageNumber"/><w:noProof/></w:rPr><w:t>1</w:t></w:r><w:r wsp:rsidR="003D73BD"><w:rPr><w:rStyle w:val="PageNumber"/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:p></w:ftr><w:type w:val="continuous"/><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="1440" w:right="1008" w:bottom="720" w:left="1008" w:header="720" w:footer="432" w:gutter="0"/><w:cols w:space="720"/><w:titlePg/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.demo.db.connection/.classpath b/org.eclipse.osee.demo.db.connection/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.demo.db.connection/.project b/org.eclipse.osee.demo.db.connection/.project
new file mode 100644
index 00000000000..4b75fbfa5d0
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.demo.db.connection</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.demo.db.connection/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.demo.db.connection/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..28cf5ed1e4e
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu May 29 18:00:59 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.demo.db.connection/META-INF/MANIFEST.MF b/org.eclipse.osee.demo.db.connection/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..bb103e78a67
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Connection Plug-in
+Bundle-SymbolicName: org.eclipse.osee.demo.db.connection;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.demo.db.connection.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework
+Service-Component: OSGI-INF/demo.connection.contributor.xml,
+ OSGI-INF/demo.authentication.provider.xml
+OseeEarlyStart: true
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds
diff --git a/org.eclipse.osee.demo.db.connection/OSGI-INF/demo.authentication.provider.xml b/org.eclipse.osee.demo.db.connection/OSGI-INF/demo.authentication.provider.xml
new file mode 100644
index 00000000000..d26d0029cf1
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/OSGI-INF/demo.authentication.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="lba.authentication.provider">
+ <implementation class="org.eclipse.osee.demo.db.connection.DemoAuthenticationProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.IAuthenticationProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.demo.db.connection/OSGI-INF/demo.connection.contributor.xml b/org.eclipse.osee.demo.db.connection/OSGI-INF/demo.connection.contributor.xml
new file mode 100644
index 00000000000..512b0576d3a
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/OSGI-INF/demo.connection.contributor.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="demo.connection.contributor">
+ <implementation class="org.eclipse.osee.demo.db.connection.DemoDbConnectionInfo"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.demo.db.connection/build.properties b/org.eclipse.osee.demo.db.connection/build.properties
new file mode 100644
index 00000000000..4a07e3b5975
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ support/,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/Activator.java b/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/Activator.java
new file mode 100644
index 00000000000..800bf1a4f31
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/Activator.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 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.demo.db.connection;
+
+import java.net.URL;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Activator implements BundleActivator {
+
+ private static Activator instance;
+ private BundleContext context;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ this.context = context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+ public static URL getEntry(String path) {
+ return instance.context.getBundle().getEntry(path);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoAuthenticationProvider.java b/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoAuthenticationProvider.java
new file mode 100644
index 00000000000..c332a37b476
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoAuthenticationProvider.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.demo.db.connection;
+
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.core.server.IAuthenticationProvider;
+import org.eclipse.osee.framework.core.server.UserDataStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DemoAuthenticationProvider implements IAuthenticationProvider {
+
+ private final boolean autoAuthenticate = true;
+ private final String DEMO_USER = "Joe Smith";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationProvider#asOseeUserId(org.eclipse.osee.framework.core.server.OseeCredential)
+ */
+ @Override
+ public IOseeUserInfo asOseeUserId(OseeCredential credential) throws OseeAuthenticationException {
+ IOseeUserInfo oseeUserInfo = UserDataStore.getOseeUserFromOseeDb(DEMO_USER);
+ return oseeUserInfo != null ? oseeUserInfo : UserDataStore.createUser(true, DEMO_USER, DEMO_USER, "", true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationProvider#authenticate(org.eclipse.osee.framework.core.server.OseeCredential)
+ */
+ @Override
+ public boolean authenticate(OseeCredential credential) throws OseeAuthenticationException {
+ return autoAuthenticate;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationProvider#getProtocol()
+ */
+ @Override
+ public String getProtocol() {
+ return "demo";
+ }
+
+}
diff --git a/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoDbConnectionInfo.java b/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoDbConnectionInfo.java
new file mode 100644
index 00000000000..45f553fcc98
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/src/org/eclipse/osee/demo/db/connection/DemoDbConnectionInfo.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.demo.db.connection;
+
+import java.net.URL;
+import org.eclipse.osee.framework.db.connection.DatabaseInfoManager;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+public class DemoDbConnectionInfo implements IDbConnectionInformationContributor {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributer#getDbInformation()
+ */
+ @Override
+ public IDatabaseInfo[] getDbInformation() throws Exception {
+ URL url = Activator.getEntry("/support/osee.demo.db.connection.xml");
+ return DatabaseInfoManager.readFromXml(url.openStream());
+ }
+}
diff --git a/org.eclipse.osee.demo.db.connection/support/osee.demo.db.connection.xml b/org.eclipse.osee.demo.db.connection/support/osee.demo.db.connection.xml
new file mode 100644
index 00000000000..3d678398ff4
--- /dev/null
+++ b/org.eclipse.osee.demo.db.connection/support/osee.demo.db.connection.xml
@@ -0,0 +1,50 @@
+<DbConnection>
+
+ <DatabaseInfo id="DerbyServer">
+ <DatabaseHome key="#DBHOME#" />
+ <DatabaseName key="#DBNAME#" value="DerbyDatabase" />
+ <DatabaseType key="#TYPE#" value="derby" />
+ <Prefix key="#PREFIX#" value="jdbc:derby" />
+ <UserName key="#USERNAME#" value="osee" />
+ <Password key="#PASSWORD#" value="oseeadmin" />
+ <Host key="#HOST#" value="@AvailableDbServices.hostAddress" />
+ <Port key="#PORT#" value="@AvailableDbServices.port" />
+ </DatabaseInfo>
+
+ <DatabaseInfo id="postgresqlInfo">
+ <DatabaseHome key="#DBHOME#" />
+ <DatabaseName key="#DBNAME#" value="OSEE" />
+ <DatabaseType key="#TYPE#" value="postgresql" />
+ <Prefix key="#PREFIX#" value="jdbc:postgresql" />
+ <UserName key="#USERNAME#" value="osee" />
+ <Password key="#PASSWORD#" value="osee" />
+ <Host key="#HOST#" value="@AvailableDbServices.hostAddress" />
+ <Port key="#PORT#" value="@AvailableDbServices.port" />
+ </DatabaseInfo>
+
+ <ConnectionDescription id="postgresql">
+ <Driver>org.postgresql.Driver</Driver>
+ <Url>#PREFIX#://#HOST#:#PORT#/#DBHOME##DBNAME#</Url>
+ </ConnectionDescription>
+
+ <ConnectionDescription id="NetDerbyClient">
+ <Driver>org.apache.derby.jdbc.ClientDriver</Driver>
+ <Url>#PREFIX#://#HOST#:#PORT#/#DBHOME##DBNAME#;</Url>
+ <UrlAttributes>
+ <Entry>create=true</Entry>
+ </UrlAttributes>
+ </ConnectionDescription>
+
+ <AvailableDbServices>
+
+ <Server id="derby" dbInfo="DerbyServer" hostAddress="127.0.0.1" port="1621" connectsWith="NetDerbyClient" />
+
+ <Server id="osee.microdoc" dbInfo="postgresqlInfo" hostAddress="78.46.71.230"
+ port="5432" connectsWith="postgresql" applicationServer="http://osee.microdoc.com:8089/" />
+
+ <Server id="postgresqlLocalhost" dbInfo="postgresqlInfo"
+ hostAddress="localhost" port="5432" connectsWith="postgresql"
+ applicationServer="http://localhost:8089/" />
+
+ </AvailableDbServices>
+</DbConnection> \ No newline at end of file
diff --git a/org.eclipse.osee.demo.feature/.project b/org.eclipse.osee.demo.feature/.project
new file mode 100644
index 00000000000..6244a4984f3
--- /dev/null
+++ b/org.eclipse.osee.demo.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.demo.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.demo.feature/build.properties b/org.eclipse.osee.demo.feature/build.properties
new file mode 100644
index 00000000000..64f93a9f0b7
--- /dev/null
+++ b/org.eclipse.osee.demo.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.osee.demo.feature/feature.xml b/org.eclipse.osee.demo.feature/feature.xml
new file mode 100644
index 00000000000..75f7a671f21
--- /dev/null
+++ b/org.eclipse.osee.demo.feature/feature.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.demo.feature"
+ label="Eclipse OSEE Demo Feature (Incubation)"
+ version="1.0.0.qualifier"
+ provider-name="Eclipse.org"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="org.eclipse.osee.demo.db.connection"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ats.config.demo"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.support.test.util"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.dependancies.updatesite/.project b/org.eclipse.osee.dependancies.updatesite/.project
new file mode 100644
index 00000000000..120a4b96d2f
--- /dev/null
+++ b/org.eclipse.osee.dependancies.updatesite/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.dependancies.updatesite</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.dependancies.updatesite/site.xml b/org.eclipse.osee.dependancies.updatesite/site.xml
new file mode 100644
index 00000000000..8c1749ce9a2
--- /dev/null
+++ b/org.eclipse.osee.dependancies.updatesite/site.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+ <feature url="features/org.eclipse.osee.external.feature_1.0.0.qualifier.jar" id="org.eclipse.osee.external.feature" version="1.0.0.qualifier"/>
+</site>
diff --git a/org.eclipse.osee.external.feature/.project b/org.eclipse.osee.external.feature/.project
new file mode 100644
index 00000000000..646fdcb336f
--- /dev/null
+++ b/org.eclipse.osee.external.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.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.external.feature/build.properties b/org.eclipse.osee.external.feature/build.properties
new file mode 100644
index 00000000000..3caf8bba258
--- /dev/null
+++ b/org.eclipse.osee.external.feature/build.properties
@@ -0,0 +1,2 @@
+bin.includes = feature.xml
+runPackager = true
diff --git a/org.eclipse.osee.external.feature/feature.xml b/org.eclipse.osee.external.feature/feature.xml
new file mode 100644
index 00000000000..ba5795907cb
--- /dev/null
+++ b/org.eclipse.osee.external.feature/feature.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.external.feature"
+ label="Eclipse OSEE Dependancies Feature (Incubation)"
+ version="1.0.0.qualifier"
+ provider-name="Eclipse.org">
+
+ <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>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="javax.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.el"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.logging"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.mortbay.jetty"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.lang"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.app"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.ds"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.http.jetty"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.http.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.util"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="javax.mail.glassfish"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="javax.activation"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="derby.driver"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.net"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.oro"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.httpclient"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.codec"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="com.lowagie.itext"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.team.svn"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.team.svn.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.team.svn.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.framework.antsupport/.classpath b/org.eclipse.osee.framework.antsupport/.classpath
new file mode 100644
index 00000000000..751c8f2e504
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/.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.framework.antsupport/.project b/org.eclipse.osee.framework.antsupport/.project
new file mode 100644
index 00000000000..2b2e4e162e4
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.antsupport</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.antsupport/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.antsupport/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.antsupport/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.antsupport/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..d348b257b89
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Antsupport Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.antsupport;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.osee.framework.antsupport.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ant.core,
+ org.apache.ant
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.antsupport/build.properties b/org.eclipse.osee.framework.antsupport/build.properties
new file mode 100644
index 00000000000..bdb761ec720
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ lib/,\
+ plugin.xml
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/build.properties b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/build.properties
new file mode 100644
index 00000000000..0a3f4f57e4a
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/build.properties
@@ -0,0 +1,20 @@
+# -----------------------------------------------------------------------------
+# build.properties
+# This file is referenced by the sample build.xml file.
+# -----------------------------------------------------------------------------
+
+svnant.version=1.0.0
+
+# -----------------------------------------------------------------------------
+# all jar needed
+# -----------------------------------------------------------------------------
+lib.dir=lib
+svnant.jar=${lib.dir}/svnant.jar
+svnClientAdapter.jar=${lib.dir}/svnClientAdapter.jar
+svnjavahl.jar=${lib.dir}/svnjavahl.jar
+
+svnant.latest.url=http://subclipse.tigris.org/svn/subclipse/trunk/svnant/
+svnant.this.url=http://subclipse.tigris.org/svn/subclipse/tags/svnant/${svnant.version}/
+
+svnant.repository.user=guest
+svnant.repository.passwd="" \ No newline at end of file
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/changelog.txt b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/changelog.txt
new file mode 100644
index 00000000000..bfc72bd1849
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/changelog.txt
@@ -0,0 +1,50 @@
+* 1.0.0
+- Built against svnClientAdapter r2401 and Subversion 1.3.1,
+ incorporating numerous bug fixes and improvements from both.
+ Removed dependency on commons-lang-2.0.jar.
+ Removed dependency on jakarta-regexp-1.4.jar.
+- Fixed revision parameter in Switch task (#305)
+- Added url property to Status task (#327)
+- Still lacks support for Subversion locking (introduced in SVN 1.2.0).
+
+* 1.0.0-rc1
+- Built against svnClientAdapter r1384 and Subversion 1.2.0,
+ incorporating numerous bug fixes and improvements from both.
+- Lacks support for Subversion locking (introduced in SVN 1.2.0).
+- Improved documentation.
+- New 'switch' and 'propget' commands for <svn> task.
+- Repository creation handles SVN file system type.
+- New JAR dependencies added (regexp, lang).
+- Add new/improved tests (e.g. of 'status', 'info', 'annotate',
+ 'switch', svnserve, etc.).
+- Adjustments to distribution packaging, including the removal of the
+ bundled JavaHL win32 DLLs.
+
+* 0.9.13
+- createRepository command added
+- status command added
+- linked with subversion 1.0.5
+
+* 0.9.1
+- ignore and diff commands added
+- more improvements to command line interface to subversion
+
+* 0.8.6
+- improvements to command line interface to subversion
+ (should work better on Linux)
+
+* 0.8.5
+- linked with subversion 0.35.1 and Berkeley DB 4.2.52
+- improvements to command line interface to subversion
+- cat, revert, propdel commands added
+
+* 0.8.2
+- linked with subversion 0.31.2
+- command line interface to subversion (experimental)
+- keywordadd, keywordsremove, keywordsset and diff commands added
+
+* 0.6.0
+- linked with Subversion 0.24.2
+- propset added
+
+* 0.1.0 - Initial Release
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/doc/svn.html b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/doc/svn.html
new file mode 100644
index 00000000000..051c4e25e85
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/doc/svn.html
@@ -0,0 +1,1132 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+
+<head>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+ <TITLE>Svn Task</TITLE>
+ <META HTTP-EQUIV="Content-Language" CONTENT="en-us">
+ <link rel="stylesheet" type="text/css" href="http://tortoisesvn.tigris.org/branding/css/print.css" media="print" />
+<style type="text/css">
+body {
+ font: 80% Verdana, Arial, Helvetica, sans-serif;
+ margin: 12px; padding: 12px;
+/* background: rgb(95%,95%,80%); */
+ color: black;
+}
+h1 {
+ font-size: 200%; text-transform: lowercase; letter-spacing: 3px;
+ margin-bottom: 1em;
+ padding: 0.66em 0 0.33em 1em;
+ background: rgb(85%,85%,70%);
+}
+h2 {
+ background: rgb(85%,85%,70%);
+}
+h3 {
+ border:1px solid rgb(85%,85%,70%);
+ color: rgb(55%,55%,40%);
+ padding: 0.66em 0 0.33em 1em;
+ background-color: #f3f1f4;
+}
+.sample {
+ font-family: Courier, "Courier New", monospace;
+ background-color: #f3f1f4;
+ margin-left: 10px;
+ margin-right: 10px;
+ padding-top: 3px;
+ padding-bottom: 3px;
+ padding-left: 3px;
+ padding-right: 3px;
+ border:1px dashed black;
+ width: 50%;
+ }
+ table {
+ width: 80%;
+ border: 1px solid gray;
+ margin-bottom:1em;
+ }
+ th, td {
+ padding: 0 0.5em;
+ border-left: 1px solid #DDD;
+ border-bottom: 1px solid #DDD;
+ font: 70%
+}
+th {
+
+}
+</style>
+</head>
+
+<body lang="en-US" dir="LTR">
+
+<H1>&lt;Svn&gt;</H1>
+By <A HREF="mailto:users@subclipse.tigris.org">C&eacute;dric Chabanois et al.</A>
+
+
+<H2>Description</H2>
+<p>This task provides an interface to <A HREF="http://subversion.tigris.org/">Subversion</A>
+revision control system that is a compelling replacement for CVS in the open source community.
+<br>
+With the help of the underlying svnClientAdapter, &lt;svn&gt; task uses JavaHL (a
+native JNI interface to the subversion api) if it
+can find the corresponding library (e.g. svnjavahl.dll on windows).
+Otherwise it uses svn command line interface.</p>
+<H2>Parameters</H2>
+
+<table>
+ <tr>
+ <th>Attribute</th>
+ <th>Description</th>
+ <th>Required</th>
+ </tr>
+ <tr>
+ <td>username</td>
+ <td>username that will be used for all nested svn commands.</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>password that will be used for all nested svn commands.</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>javahl</td>
+ <td>Set to &ldquo;false&rdquo; to use command line client interface instead of JNI JavaHL binding.</td>
+ <td>No (Defaults to true)</td>
+ </tr>
+</table>
+
+<H2>Svn commands specified as nested elements</H2>
+<table>
+ <tr>
+ <td><a href="#add">add </a></td>
+ <td><a href="#createRepository">createRepository</a></td>
+ <td><a href="#import">import</a></td>
+ <td><a href="#move">move</a></td>
+ <td><a href="#status">status</a></td>
+ </tr>
+ <tr>
+ <td><a href="#cat">cat</a></td>
+ <td><a href="#delete">delete</a></td>
+ <td><a href="#keywordsset">keywordsset</a></td>
+ <td><a href="#propdel">propdel</a></td>
+ <td><a href="#switch">switch</a></td>
+ </tr>
+ <tr>
+ <td><a href="#checkout">checkout</a></td>
+ <td><a href="#diff">diff</a></td>
+ <td><a href="#keywordsadd">keywordsadd</a></td>
+ <td><a href="#propget">propget</a></td>
+ <td><a href="#update">update</a></td>
+ </tr>
+ <tr>
+ <td><a href="#commit">commit</a></td>
+ <td><a href="#export">export</a></td>
+ <td><a href="#keywordsremove">keywordsremove</a></td>
+ <td><a href="#propset">propset</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><a href="#copy">copy</a></td>
+ <td><a href="#ignore">ignore</a></td>
+ <td><a href="#mkdir">mkdir</a></td>
+ <td><a href="#revert">revert</a></td>
+ <td></td>
+ </tr>
+ </table>
+<p> </p>
+
+<H3><a name="add">add</a></H3>
+<p>You can add files and directories to svn repository with nested
+<CODE>&lt;add&gt;</CODE> elements.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file to add to the repository</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>directory to add to the repository</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on a single directory only
+ (applies only when <CODE>dir</CODE> attribute is set). Default is
+ &quot;true&quot;
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+<li>fileset <br>
+ Filesets are used to select sets of files to add to the repository. <br>
+ <B>Note that directories needed to add selected files will be added to the
+ repository even if they are not selected by the fileset.</B>
+</li>
+</ul>
+</p>
+
+<H3><a name="cat">cat</a></H3>
+<p>Get the content of a file on repository.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>destFile</td>
+ <td>Name of the destination file</td>
+ <td>No <BR>(default is the name of the file on the url)</td>
+ </tr>
+ <tr>
+ <td>url</td>
+ <td>Url of the file in repository</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision to get.<BR>Possible values are :<BR>- a date with the
+ following format : MM/DD/YYYY HH:MM AM_PM<BR>- a revision number<BR>-
+ HEAD, BASE, COMMITED or PREV<BR>Default is &quot;HEAD&quot;
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+
+<H3><a name="checkout">checkout</a></H3>
+<p>Check out a working copy from a repository.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>url</td>
+ <td>url to checkout from</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on single directory only.
+ Default is &quot;true&quot;
+ </td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>destPath</td>
+ <td>destination directory</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision to checkout.<BR>Possible values are :<BR>- a date with
+ the following format : MM/DD/YYYY HH:MM AM_PM<BR>- a revision
+ number<BR>- HEAD, BASE, COMMITED or PREV<BR>Default is &quot;HEAD&quot;
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+ <li>fileset<br>
+ Filesets are used to select sets of files to add to the repository. <br>
+ <B>Note that directories needed to add selected files will be added to the
+ repository even if they are not selected by the fileset.</B>
+ </li>
+</ul>
+</p>
+
+<p>
+<div class="sample">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;${javahl}&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;checkout</FONT>
+<FONT COLOR="#000080">url=</FONT><FONT COLOR="#008000">&quot;${urlRepos}&quot;</FONT>
+<FONT COLOR="#000080">destPath=</FONT><FONT COLOR="#008000">&quot;workingcopy&quot;</FONT>
+<FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+</p>
+
+<H3><a name="commit">commit</a></H3>
+<p>Send changes from your working copy to the repository.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file to commit</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on single directory only.
+ Default is &quot;true&quot;<BR>Apply only when dir attribute is
+ set.
+ </td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>directory to commit</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>message</td>
+ <td>commit message</td>
+ <td>Yes</td>
+ </tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+ <li>fileset<BR>
+ Filesets are used to select sets of files to commit.
+ </li>
+</ul>
+</p>
+
+<H3><a name="copy">copy</a></H3>
+<p>Duplicate something in working copy or repository, remembering
+history.<BR>
+source and destination can each be either a working copy (WC) path or URL:
+<ul>
+ <li>WC-&gt;WC: copy and schedule for addition (with history)</li>
+ <li>WC-&gt;URL: immediately commit a copy of WC to URL</li>
+ <li>URL-&gt;WC: check out URL into WC, schedule for addition</li>
+ <li>URL-&gt;URL: complete server-side copy;&nbsp; used to branch &amp; tag</li>
+</ul>
+</p>
+<br/>
+
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>srcPath</td>
+ <td>source path</td>
+ <TD ROWSPAN=2>One of the two</td>
+ </tr>
+ <tr>
+ <td>srcUrl</td>
+ <td>source url</td>
+ </tr>
+ <tr>
+ <td>testPath</td>
+ <td>destination path</td>
+ <TD ROWSPAN=2>One of the two</td>
+ </tr>
+ <tr>
+ <td>destUrl</td>
+ <td>destination url</td>
+ </tr>
+ <tr>
+ <td>message</td>
+ <td>commit message</td>
+ <td>when destUrl is set</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision to copy from (when srcUrl is set)<BR>Possible values
+ are :<BR>- a date with the following format : MM/DD/YYYY HH:MM
+ AM_PM<BR>- a revision number<BR>- HEAD, BASE, COMMITED or
+ PREV<BR>Default is &quot;HEAD&quot;
+ </td>
+ <td>no</td>
+ </tr>
+</table>
+
+<H3><a name="createRepository">createRepository</a></H3>
+<p>Create a new, empty repository at path.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>Path where to create the new repository</td>
+ <td>Yes</td>
+ </tr>
+</table>
+<div class="sample" style="width: 597px; height: 77px">
+<p>Example: <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;false&quot;</FONT><FONT COLOR="#000080">&gt;<BR>&lt;createRepository</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;repository&quot;</FONT><FONT COLOR="#000080">/&gt;<BR>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="delete">delete</a></H3>
+<p>If run on a working copy target, the item is scheduled for
+deletion upon the next commit.&nbsp; Files, and directories that have
+not been committed, are immediately removed from the working copy.&nbsp;
+<BR>The command will not remove targets that are, or contain,
+unversioned or modified items; use the force attribute to override
+this behaviour.
+<BR>If run on an url, the item is deleted from the repository via an immediate commit.
+</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file to delete</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>url</td>
+ <td>url to delete</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>directory to delete</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>message</td>
+ <td>commit message</td>
+ <td>when url attribute is set</td>
+ </tr>
+ <tr>
+ <td>force</td>
+ <td>default is &quot;false&quot;</td>
+ <td>No</td>
+ </tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+ <li>fileset<BR>
+ Filesets are used to select sets of files to delete..
+ </li>
+</ul>
+</p>
+
+<H3><a name="diff">diff</a></H3>
+<p>Display the differences between two paths (oldPath and newPath) or
+two urls (oldUrl and newUrl).
+</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>oldPath</td>
+ <td>If oldUrl is not set, defaults to the path '.'</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>oldUrl</td>
+ <td>&nbsp;</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>oldTargetRevision</td>
+ <td>defaults to BASE or, if oldUrl is set, to HEAD</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>newPath</td>
+ <td>defaults to oldPath if oldUrl is not set</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>newUrl</td>
+ <td>&nbsp;</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>newTargetRevision</td>
+ <td>defaults to the current working version or, if newUrl is set, to HEAD</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>outFile</td>
+ <td>Default is 'patch'</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on single directory only.
+ Default is &quot;true&quot;
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+<div class="sample" style="width: 749px; height: 80px">
+<p>Example : diff between BASE and current working version <br>
+<FONT SIZE=2 FACE="Courier New"><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;${javahl}&quot;</FONT><FONT COLOR="#000080">&gt;<BR>&lt;diff</FONT>
+<FONT COLOR="#000080">oldPath=</FONT><FONT COLOR="#008000">&quot;workingcopy/diffTest/file.txt&quot;</FONT>
+<FONT COLOR="#000080">outFile=</FONT><FONT COLOR="#008000">&quot;workingcopy/diffTest/patch.txt&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2><BR>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="export">export</a></H3>
+<p>
+<ol>
+ <li>
+ Exports a clean directory tree from the repository specified by <CODE>srcurl</CODE>,
+ at revision <CODE>revision</CODE> if it is given, otherwise at HEAD, into <CODE>destPath</CODE>.
+ </li>
+ <li>Exports a clean directory tree from the working copy specified by
+ <CODE>srcPath</CODE> into <CODE>destPath</CODE>.&nbsp; all local changes will be preserved,
+ but files not under revision control will not be copied.</li>
+</ol>
+</p>
+<br/>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>srcUrl</td>
+ <td>source url to export from</td>
+ <td>One of the two</td>
+ </tr>
+ <tr>
+ <td>srcPath</td>
+ <td>source path to export from</td>
+ </tr>
+ <tr>
+ <td>destPath</td>
+ <td>destination path</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision of the source url to export from. Defaults is
+ &quot;HEAD&quot;<BR>Possible values are :<BR>- a date with the
+ following format : MM/DD/YYYY HH:MM AM_PM<BR>- a revision number<BR>-
+ HEAD, BASE, COMMITED or PREV
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+
+<H3><a name="ignore">ignore</a></H3>
+<p>Add a given file or a pattern to the ignored files list (modifies
+svn:ignore property)</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file to ignore</td>
+ <td>One of the two</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>directory on which we will update svn:ignore property</td>
+ </tr>
+ <tr>
+ <td>pattern</td>
+ <td>pattern to add to svn:ignore on the directory<BR>Only when dir
+ is set
+ </td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;true&quot; to add the pattern recursively to
+ directories. Default is &quot;false&quot;<BR>Only when dir is set
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+<div class="sample" style="width: 663px; height: 42px">
+<p>Example :<BR>
+<FONT SIZE=2><FONT FACE="Courier New"><FONT COLOR="#000080">&lt;ignore</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/ignoreTest/dir1&quot;</FONT>
+<FONT COLOR="#000080">pattern=</FONT><FONT COLOR="#008000">&quot;*.ignore&quot;</FONT>
+<FONT COLOR="#000080">recurse=</FONT><FONT COLOR="#008000">&quot;true&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="import">import</a></H3>
+<p>Commit an unversioned file or tree into the repository.<BR>
+Recursively commit a copy of <CODE>path</CODE> to <CODE>url</CODE>.<BR>
+If <CODE>newEntry </CODE>is not set, copy top-level contents of <CODE>path</CODE>into<CODE>url</CODE>directly.&nbsp;
+Otherwise, create <CODE>newEntry </CODE>underneath <CODE>url </CODE>and begin copy there.
+</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>source path to export from</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>url</td>
+ <td>source url to import to</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>newEntry</td>
+ <td>&nbsp;</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>message</td>
+ <td>commit message</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on single directory only.
+ Default is &quot;true&quot;
+ </td>
+ <td>False</td>
+ </tr>
+</table>
+
+<H3><a name="keywordsset">keywordsset</a></H3>
+<p>Keywordsset controls which keywords will be substituted on the
+given files. Valid keywords are:
+<ul>
+ <li>URL, HeadURL : The URL for the head version of the object.</li>
+ <li>Author, LastChangedBy : The last person to modify the file.</li>
+ <li>Date, LastChangedDate : The date/time the object was last modified.</li>
+ <li>Rev, LastChangedRevision : The last revision the object changed.</li>
+ <li>Id : A compressed summary of the previous</li>
+</ul>
+</p>
+<br/>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>File for which keywords will be substituted</td>
+ <td>Either file, dir or filesets</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>All files in this directory will have their keywords substituted (recursively)</td>
+ <td>Either file, dir or filesets</td>
+ </tr>
+ <tr>
+ <td>keywords</td>
+ <td>The keywords to substitute on the given files</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>HeadURL/URL<BR>Author, LastChangedBy<BR>Date,
+ LastChangedDate<BR>Rev, LastChangedRevision<BR>Id
+ </td>
+ <td>Set to &ldquo;true&ldquo; the keyword to substitute it on the
+ given file.
+ </td>
+ <td>No</td>
+ </tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+ <li>fileset<BR>
+ Filesets are used to select sets of files on which to apply keywords substitution.
+ </li>
+</ul>
+</p>
+
+<H3><a name="keywordsadd">keywordsadd</a></H3>
+<p>Keywordsadd add some keywords to be substituted on the given
+files. Present keywords are not modified.<BR>
+The attributes are the same than for keywordsset command.</p>
+
+<H3><a name="keywordsremove">keywordsremove</a></H3>
+<p>Keywordsadd remove some keywords to be substituted on the given
+files. Other present keywords are not modified.<BR>
+The attributes are the same than for keywordsset command.</p>
+
+<H3><a name="mkdir">mkdir</a></H3>
+<p>Create a new directory under revision control.<BR>
+If target is a working copy path the directory is scheduled for addition in the
+working copy.&nbsp; If target is an url the directory is created in
+the repository via an immediate commit.&nbsp; <BR>
+In both cases all the intermediate directories must already exist.
+</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>path to create</td>
+ <td>One of the two</td>
+ </tr>
+ <tr>
+ <td>url</td>
+ <td>url to create</td>
+ </tr>
+ <tr>
+ <td>message</td>
+ <td>commit message</td>
+ <td>Yes</td>
+ </tr>
+</table>
+
+<H3><a name="move">move</a></H3>
+<p>Move/rename something in working copy or repository.<BR><BR>&nbsp;
+cource and destination can both be working copy (WC) paths or
+URLs:<BR>&nbsp;&nbsp;&nbsp; WC&nbsp; -&gt; WC:&nbsp;&nbsp; move and
+schedule for addition (with history)<BR>&nbsp;&nbsp;&nbsp; URL -&gt;
+URL:&nbsp; complete server-side rename.
+</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>srcPath</td>
+ <td>source path</td>
+ <td ROWSPAN=2>One of the two</td>
+ </tr>
+ <tr>
+ <td>srcUrl</td>
+ <td>source url</td>
+ </tr>
+ <tr>
+ <td>destPath</td>
+ <td>destination path</td>
+ <td ROWSPAN=2>One of the two</td>
+ </tr>
+ <tr>
+ <td>destUrl</td>
+ <td>destination url</td>
+ </tr>
+ <tr>
+ <td>message</td>
+ <td>commit message</td>
+ <td>Yes</td>
+ </tr>
+</table>
+
+<H3><a name="propdel">propdel</a></H3>
+<p>Remove a property from files or dirs.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>path of the file or directory on which to delete the property</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>name</td>
+ <td>name of the property to delete</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>if set, property will be removed recursively</td>
+ <td>No</td>
+ </tr>
+</table>
+
+<H3><a name="propget">propget</a></H3>
+<p>Get a property from a file or a directory.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>path of the file or directory on which to get the property</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>name</td>
+ <td>name of the property to get</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>property</td>
+ <td>the name of the property to set with the value of the svn property</td>
+ <td ROWSPAN=2>One of the two</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file that will contain the value of the property</td>
+ </tr>
+</table>
+<div class="sample" style="width: 800px; height: 48px">
+<p>
+Example :<br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propget</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;svn:mime-type&quot;</FONT>
+<FONT COLOR="#000080">property=</FONT><FONT COLOR="#008000">&quot;propTest.mimeType&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="propset">propset</a></H3>
+<p>Set a property on files or dirs.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>path of the file or directory on which to set the property</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>name</td>
+ <td>name of the property to set</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>value</td>
+ <td>the value of the property</td>
+ <td ROWSPAN=2>One of the two</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>the file that will be used as a value</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>if set, property will be set recursively</td>
+ <td>No</td>
+ </tr>
+</table>
+<p>
+<I>Note:</I>svn recognizes the following special versioned properties but
+will store any arbitrary properties set:
+<ul>
+ <li>svn:ignore : A newline separated list of file patterns to ignore. </li>
+ <li>svn:keywords : Keywords to be expanded.&nbsp; Valid keywords are:
+ <ul>
+ <li>URL, HeadURL : The URL for the head version of the object.</li>
+ <li>Author, LastChangedBy : The last person to modify the file.</li>
+ <li>Date, LastChangedDate : The date/time the object was last modified.</li>
+ <li>Rev, LastChangedRevision : The last revision the object changed.</li>
+ <li>Id : A compressed summary of the previous 4 keywords. </li>
+ </ul>
+ </li>
+ <li>svn:executable : If present, make the file executable. This property cannot be set on a directory.&nbsp;
+ A non-recursive attempt will fail, and a recursive attempt will set
+ the property only on the file children of the directory
+ </li>
+ <li>svn:eol-style : One of 'native', 'LF', 'CR', 'CRLF'. </li>
+ <li>svn:mime-type : The mimetype of the file.&nbsp; Used to determine whether to merge the file, and
+ how to serve it from Apache. <BR>
+ A mimetype beginning with 'text/' (or an absent mimetype) is treated as text.&nbsp; Anything else is
+ treated as binary.
+ </li>
+ <li>svn:externals : A newline separated list of module
+ specifiers, each of which consists of a relative directory path,
+ optional revision flags, and an URL.&nbsp; For example<BR>
+ foo http://example.com/repos/zig <br>
+ foo/bar -r 1234 http://example.com/repos/zag
+ </li>
+</ul>
+</p>
+
+<H3><a name="revert">revert</a></H3>
+<p>Restore pristine working copy file (undo most local edits).</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file to revert</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>directory to revert</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on a single directory only
+ (applies only when <CODE>dir</CODE> attribute is set). Default is
+ &quot;false&quot;</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+ :<BR>- a date with the following format : MM/DD/YYYY HH:MM AM_PM<BR>-
+ a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+ <td>No</td>
+ </tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+ <li>fileset<BR>
+ Filesets are used to select sets of files to revert.
+ </li>
+</ul>
+</p>
+
+<H3><a name="status">status</a></H3>
+<p>Get the status of working copy files and directories.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>path of the file or directory</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>textStatusProperty</td>
+ <td>Name of the property to set to the status of the item</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>propStatusProperty</td>
+ <td>Name of the property to set to the status of the item
+ properties</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>revisionProperty</td>
+ <td>Name of the property to set to the revision of the item (or &ldquo;&rdquo;
+ if unversioned)</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>lastChangedRevisionProperty</td>
+ <td>Name of the property to set to the last changed revision of the
+ item (or &ldquo;&rdquo; if unversioned)</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>lastCommitAuthorProperty</td>
+ <td>Name of the property to set to the last commit author (or &ldquo;&rdquo;
+ if unversioned)</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>urlProperty</td>
+ <td>Name of the property to set to the url of the item</td>
+ <td>No</td>
+ </tr>
+</table>
+<p>
+The value of TextStatusProperty can be :
+<ul>
+ <li>non-svn</li>
+ <li>normal : no modifications</li>
+ <li>added</li>
+ <li>missing : item is missing (removed by non-svn command)</li>
+ <li>incomplete</li>
+ <li>deleted</li>
+ <li>replaced</li>
+ <li>modified</li>
+ <li>merged</li>
+ <li>conflicted</li>
+ <li>obstructed</li>
+ <li>ignored</li>
+ <li>external</li>
+ <li>unversioned</li>
+</ul>
+The value of propStatusProperty can be :
+<ul>
+ <li>normal : no modifications</li>
+ <li>conflicted</li>
+ <li>modified</li>
+</ul>
+</p>
+<p></p>
+<div class="sample">
+<p>
+Example : <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;status</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/statusTest/added.txt&quot;</FONT>
+</FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>textStatusProperty=<FONT COLOR="#008000">&quot;testStatus.textStatus&quot;</FONT></FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">propStatusProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.propStatus&quot;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">lastChangedRevisionProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.lastCommitRevision&quot;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>revisionProperty=<FONT COLOR="#008000">&quot;testStatus.revision&quot;</FONT></FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">lastCommitAuthorProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.lastCommitAuthor&quot;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="switch">switch</a></H3>
+<p>Update the working copy to mirror a new URL within the repository.
+This behaviour is similar to 'svn update', and is the way to move a
+working copy to a branch or tag within the same repository.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>path</td>
+ <td>The working copy to switch to the given url</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>url</td>
+ <td>The url to switch to</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on a single directory only.
+ Default is &quot;true&quot;</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+ :<BR>- a date with the following format : MM/DD/YYYY HH:MM AM_PM<BR>-
+ a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+ <td>No</td>
+ </tr>
+</table>
+<div class="sample" style="width: 674px; height: 85px">
+<p>
+Example :
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080"><br>&lt;svn&gt;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080"><br>&lt;switch</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/switchTest&quot;</FONT>
+<FONT COLOR="#000080">url=</FONT><FONT COLOR="#008000">&quot;${urlRepos}/switchTestBranch&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2><br>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="update">update</a></H3>
+<p>Bring changes from the repository into the working copy.<BR>If no
+revision given, bring working copy up-to-date with HEAD rev.&nbsp;
+Else synchronize working copy to revision.</p>
+<table>
+ <tr>
+ <td>Attribute</td>
+ <td>Description</td>
+ <td>Required</td>
+ </tr>
+ <tr>
+ <td>file</td>
+ <td>file to update</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>dir</td>
+ <td>directory to update</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>recurse</td>
+ <td>Set to &quot;false&quot; to operate on a single directory only
+ (applies only when <CODE>dir</CODE> attribute is set). Default is
+ &quot;true&quot;</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>revision</td>
+ <td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+ :<BR>- a date with the following format : MM/DD/YYYY HH:MM AM_PM<BR>-
+ a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+ <td>No</td>
+ </tr>
+</table>
+Parameters specified as nested elements :
+<ul>
+<li>fileset<BR>
+Filesets are used to select sets of files to update.
+</li>
+</ul>
+
+<H2>Examples</H2>
+
+<p>
+<div class="sample" style="width: 843px; height: 128px">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;delete&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;fileset</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/deleteTest&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;include</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;**/*.del&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;/fileset&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;/delete&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;commit</FONT>
+<FONT COLOR="#000080">message=</FONT><FONT COLOR="#008000">&quot;commit
+deleted files&quot;</FONT> <FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/deleteTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+deletes some files from repository (and commit changes)
+</p>
+
+<p>
+<div class="sample" style="width: 842px; height: 117px">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn javahl=&quot;false&quot;&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;add</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080"> <FONT FACE="Courier New"><FONT SIZE=2>&lt;commit</FONT>
+<FONT COLOR="#000080">message=</FONT><FONT COLOR="#008000">&quot;propTest
+added&quot;</FONT> <FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+ <FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propset</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;svn:mime-type&quot;</FONT>
+<FONT COLOR="#000080">value=</FONT><FONT COLOR="#008000">&quot;image/png&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+ <FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propset</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;myPicture&quot;</FONT>
+<FONT COLOR="#000080">file=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/icon.gif&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>add my_repos/propTest to repository and set two properties on file.png <br>
+subversion command line interface is used (javahl=&quot;false&quot;).
+</p>
+
+<HR>
+
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/JAVAHL-LICENSE b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/JAVAHL-LICENSE
new file mode 100644
index 00000000000..9c3e114d766
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/JAVAHL-LICENSE
@@ -0,0 +1,55 @@
+This license applies to all portions of Subversion which are not
+externally-maintained libraries (e.g. apr/, apr-util/, and neon/).
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+This is version 1 of this license. It is also available online at
+http://subversion.tigris.org/license-1.html. If newer versions of
+this license are posted there (the same URL, but with the version
+number incremented: .../license-2.html, .../license-3.html, and so
+on), you may use a newer version instead, at your option.
+
+====================================================================
+Copyright (c) 2000-2005 CollabNet. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if
+any, must include the following acknowledgment: "This product includes
+software developed by CollabNet (http://www.Collab.Net/)."
+Alternately, this acknowledgment may appear in the software itself, if
+and wherever such third-party acknowledgments normally appear.
+
+4. The hosted project names must not be used to endorse or promote
+products derived from this software without prior written
+permission. For written permission, please contact info@collab.net.
+
+5. Products derived from this software may not use the "Tigris" name
+nor may "Tigris" appear in their names without prior written
+permission of CollabNet.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL COLLABNET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+====================================================================
+
+This software consists of voluntary contributions made by many
+individuals on behalf of CollabNet.
+
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/SVNCLIENTADAPTER-LICENSE b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/SVNCLIENTADAPTER-LICENSE
new file mode 100644
index 00000000000..831ab6eb2cf
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/SVNCLIENTADAPTER-LICENSE
@@ -0,0 +1,185 @@
+SVNClientAdapter Library License
+
+This license applies to all portions of SVNClientAdapter library, which
+are not externally-maintained libraries (e.g. JavaHL or JavaSVN).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+=============================================================================
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" 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. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS \ No newline at end of file
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnClientAdapter.jar b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnClientAdapter.jar
new file mode 100644
index 00000000000..a6ce6dff1c6
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnClientAdapter.jar
Binary files differ
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnant.jar b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnant.jar
new file mode 100644
index 00000000000..ef9563a7507
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnant.jar
Binary files differ
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnjavahl.jar b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnjavahl.jar
new file mode 100644
index 00000000000..dd23d43d743
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/lib/svnjavahl.jar
Binary files differ
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/license.txt b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/license.txt
new file mode 100644
index 00000000000..998ca05635d
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/license.txt
@@ -0,0 +1,64 @@
+SvnAnt license
+
+This license applies to all portions of svnant library, which
+are not externally-maintained libraries (e.g. JavaHL).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/readme.txt b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/readme.txt
new file mode 100644
index 00000000000..b2ff93256fb
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/readme.txt
@@ -0,0 +1,38 @@
+SvnAnt
+======
+You can find latest version of svnant on http://subclipse.tigris.org
+
+Installation
+============
+Put the svnant.jar and svnClientAdapter.jar files to classpath of your ant build file.
+(Or directly to your ANT_HOME/lib directory.)
+If you plan to use JavaHL instead of commandline, put the svnjavahl.jar to the classpath too.
+(An of course put the appropriate native OS library on your PATH/LD_PATH too)
+
+In the build file, load the <svn> task.
+E.g. like this:
+ <taskdef resource="svntask.properties" classpathref="project.classpath"/>
+(where svnant.jar lies in the "project.classpath")
+
+To provide access to the Subversion API, svnant uses svnClientAdapter on top of
+either the JavaHL native Subversion Java (JNI) bindings or Subverion's
+command line programs (which must be installed and in your PATH).
+See the subclipse's FAQ <http://subclipse.tigris.org/faq.html#get-javahl">
+for info how to get JavaHL for your operating system.
+
+Documentation
+=============
+Documentation of the <svn> task is in the /doc directory.
+
+Play around
+===========
+To access the sources, just type "ant" in the directory containing the
+build.xml bundled with the distribution. The default target will
+retrieve the sources corresponding to the version you have. If you
+want to get the latest sources, type "ant checkoutLatest".
+
+Once you have the sources, svnant unit tests can be invoked using the
+top level build.xml by typing "ant runTests". These tests provide a
+great set of examples of how to use svnant's Ant tasks and data types.
+
+Please send any usage questions to <mailto:users@subclipse.tigris.org>.
diff --git a/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/svn_build.xml b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/svn_build.xml
new file mode 100644
index 00000000000..f20e2823a4c
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/lib/svnant-1.0.0/svn_build.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!-- Sample build file used to retrieve svnant's sources -->
+<project name="svn-test" basedir="." default="checkoutThis">
+
+ <!-- all properties are in build.properties -->
+ <property file="build.properties" />
+
+ <!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->
+ <path id="project.classpath">
+ <pathelement location="${svnjavahl.jar}" />
+ <pathelement location="${svnant.jar}" />
+ <pathelement location="${svnClientAdapter.jar}" />
+ </path>
+
+ <!-- load the svn task -->
+ <taskdef resource="svntask.properties" classpathref="project.classpath"/>
+
+ <target name="clean">
+ <delete dir="src_latest"/>
+ <delete dir="src_${svnant.version}"/>
+ </target>
+
+ <target name="checkoutLatest">
+ <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
+ <checkout url="${svnant.latest.url}" revision="HEAD" destPath="src_latest" />
+ </svn>
+ </target>
+
+ <target name="checkoutThis">
+ <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
+ <checkout url="${svnant.this.url}" revision="HEAD" destPath="src_${svnant.version}" />
+ </svn>
+ </target>
+
+</project>
diff --git a/org.eclipse.osee.framework.antsupport/plugin.xml b/org.eclipse.osee.framework.antsupport/plugin.xml
new file mode 100644
index 00000000000..4c12b032ecf
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/plugin.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.ant.core.antTasks">
+ <antTask
+ class="org.tigris.subversion.svnant.SvnTask"
+ eclipseRuntime="false"
+ headless="true"
+ library="lib/svnant-1.0.0/lib/svnant.jar"
+ name="svn">
+ </antTask>
+ </extension>
+ <extension
+ point="org.eclipse.ant.core.extraClasspathEntries">
+ <extraClasspathEntry
+ eclipseRuntime="true"
+ headless="true"
+ library="lib/svnant-1.0.0/lib/svnClientAdapter.jar">
+ </extraClasspathEntry>
+ <extraClasspathEntry
+ eclipseRuntime="true"
+ headless="true"
+ library="lib/svnant-1.0.0/lib/svnjavahl.jar">
+ </extraClasspathEntry>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.antsupport/src/org/eclipse/osee/framework/antsupport/Activator.java b/org.eclipse.osee.framework.antsupport/src/org/eclipse/osee/framework/antsupport/Activator.java
new file mode 100644
index 00000000000..99b24ddaaa5
--- /dev/null
+++ b/org.eclipse.osee.framework.antsupport/src/org/eclipse/osee/framework/antsupport/Activator.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.framework.antsupport;
+
+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.osee.framework.antsupport";
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#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.framework.artifact.servlet/.classpath b/org.eclipse.osee.framework.artifact.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.artifact.servlet/.project b/org.eclipse.osee.framework.artifact.servlet/.project
new file mode 100644
index 00000000000..30506228435
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.artifact.servlet</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.artifact.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.artifact.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..a3a92c1e104
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue May 20 10:41:08 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.artifact.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.artifact.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..79b849c3013
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Artifact Servlet Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.artifact.servlet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.artifact.servlet.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.resource.management,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.artifact.servlet/build.properties b/org.eclipse.osee.framework.artifact.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/Activator.java b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/Activator.java
new file mode 100644
index 00000000000..680dc045824
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/Activator.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.framework.artifact.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Activator implements BundleActivator {
+
+ private static Activator instance;
+
+ private OseeHttpServiceTracker httpTracker;
+ private OseeHttpServiceTracker httpTracker1;
+ private OseeHttpServiceTracker httpTracker2;
+ private OseeHttpServiceTracker httpTracker3;
+ private ServiceTracker resourceManagementTracker;
+ private ServiceTracker resourceLocatorManagerTracker;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+
+ httpTracker = new OseeHttpServiceTracker(context, OseeServerContext.PROCESS_CONTEXT, ArtifactFileServlet.class);
+ httpTracker.open();
+
+ httpTracker1 = new OseeHttpServiceTracker(context, OseeServerContext.ARTIFACT_CONTEXT, ArtifactFileServlet.class);
+ httpTracker1.open();
+
+// httpTracker2 = new OseeHttpServiceTracker(context, "/", ArtifactFileServlet.class);
+// httpTracker2.open();
+
+ httpTracker3 = new OseeHttpServiceTracker(context, "index", ArtifactFileServlet.class);
+ httpTracker3.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ if (httpTracker != null) {
+ httpTracker.close();
+ httpTracker = null;
+ }
+
+ if (httpTracker1 != null) {
+ httpTracker1.close();
+ httpTracker1 = null;
+ }
+
+ if (httpTracker2 != null) {
+ httpTracker2.close();
+ httpTracker2 = null;
+ }
+
+ if (httpTracker3 != null) {
+ httpTracker3.close();
+ httpTracker3 = null;
+ }
+
+ if (resourceManagementTracker != null) {
+ resourceManagementTracker.close();
+ resourceManagementTracker = null;
+ }
+
+ if (resourceLocatorManagerTracker != null) {
+ resourceLocatorManagerTracker.close();
+ resourceLocatorManagerTracker = null;
+ }
+ instance = null;
+ }
+
+ public static IResourceManager getResourceManager() {
+ return (IResourceManager) instance.resourceManagementTracker.getService();
+ }
+
+ public static IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) instance.resourceLocatorManagerTracker.getService();
+ }
+}
diff --git a/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactFileServlet.java b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactFileServlet.java
new file mode 100644
index 00000000000..099219848bb
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactFileServlet.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.framework.artifact.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+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.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.StandardOptions;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactFileServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = -6334080268467740905L;
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ InputStream inputStream = null;
+ boolean wasProcessed = false;
+ try {
+ HttpArtifactFileInfo artifactFileInfo = null;
+
+ String servletPath = request.getServletPath();
+ // System.out.println("servletPath: " + servletPath);
+ if (!Strings.isValid(servletPath) || "/".equals(servletPath) || "/index".equals(servletPath)) {
+ // Enumeration<?> enumeration = request.getHeaderNames();
+ // while (enumeration.hasMoreElements()) {
+ // String headerField = (String) enumeration.nextElement();
+ // String value = request.getHeader(headerField);
+ // System.out.println(String.format("%s: %s", headerField, value));
+ // }
+
+ ObjectPair<String, String> defaultArtifact = DefaultOseeArtifact.get();
+ if (defaultArtifact != null) {
+ artifactFileInfo = new HttpArtifactFileInfo(defaultArtifact.object1, null, defaultArtifact.object2);
+ }
+ } else {
+ artifactFileInfo = new HttpArtifactFileInfo(request);
+ }
+
+ String uri = null;
+ if (artifactFileInfo != null) {
+ if (artifactFileInfo.isBranchNameValid()) {
+ uri = ArtifactUtil.getUri(artifactFileInfo.getGuid(), artifactFileInfo.getBranchName());
+ } else {
+ uri = ArtifactUtil.getUri(artifactFileInfo.getGuid(), artifactFileInfo.getBranchId());
+ }
+ }
+ if (Strings.isValid(uri)) {
+ IResourceLocator locator = Activator.getResourceLocatorManager().getResourceLocator(uri);
+ Options options = new Options();
+ options.put(StandardOptions.DecompressOnAquire.name(), true);
+ IResource resource = Activator.getResourceManager().acquire(locator, options);
+
+ if (resource != null) {
+ wasProcessed = true;
+ inputStream = resource.getContent();
+
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentLength(inputStream.available());
+ response.setCharacterEncoding("ISO-8859-1");
+ String mimeType = HttpURLConnection.guessContentTypeFromStream(inputStream);
+ if (mimeType == null) {
+ mimeType = HttpURLConnection.guessContentTypeFromName(resource.getLocation().toString());
+ if (mimeType == null) {
+ mimeType = "application/*";
+ }
+ }
+ response.setContentType(mimeType);
+ if (!mimeType.equals("text/html")) {
+ response.setHeader("Content-Disposition", "attachment; filename=" + resource.getName());
+ }
+ Lib.inputStreamToOutputStream(inputStream, response.getOutputStream());
+ }
+ }
+
+ if (!wasProcessed) {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ response.setContentType("text/plain");
+ response.getWriter().write(String.format("Unable to find resource: [%s]", request.getQueryString()));
+ }
+ } catch (NumberFormatException ex) {
+ handleError(response, HttpServletResponse.SC_BAD_REQUEST, String.format("Invalid Branch Id: [%s]",
+ request.getQueryString()), ex);
+ } catch (Exception ex) {
+ handleError(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, String.format(
+ "Unable to acquire resource: [%s]", request.getQueryString()), ex);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ response.flushBuffer();
+ }
+ }
+
+ private void handleError(HttpServletResponse response, int status, String message, Throwable ex) throws IOException {
+ response.setStatus(status);
+ response.setContentType("text/plain");
+ OseeLog.log(Activator.class, Level.SEVERE, message, ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.internal.InternalOseeHttpServlet#checkAccessControl()
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ // Open to all
+ }
+
+}
diff --git a/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactUtil.java b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactUtil.java
new file mode 100644
index 00000000000..e362e9abd8a
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/ArtifactUtil.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.artifact.servlet;
+
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactUtil {
+
+ private static final String DEFAULT_ATTRIBUTE_DATA_PROVIDER = "%DefaultAttributeDataProvider";
+
+ private static String URI_BY_GUID_PREFIX =
+ "SELECT attr1.uri FROM osee_artifact art1, osee_attribute attr1, osee_attribute_type attyp1, osee_attribute_provider_type oapt1, osee_txs txs1, osee_tx_details txd1";
+
+ private static String URI_BY_GUID_JOINS =
+ " WHERE art1.art_id = attr1.art_id AND attr1.attr_type_id = attyp1.attr_type_id AND oapt1.attr_provider_type_id = attyp1.attr_provider_type_id AND attr1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id";
+
+ private static String URI_BY_GUID_AND_BRANCH_ID =
+ URI_BY_GUID_PREFIX + URI_BY_GUID_JOINS + " AND txs1.tx_current = 1 AND art1.guid = ? AND NOT oapt1.attribute_provider_class LIKE ? AND txd1.branch_id = ?";
+
+ private static String URI_BY_GUID_AND_BRANCH_NAME =
+ URI_BY_GUID_PREFIX + ", osee_branch ob1" + URI_BY_GUID_JOINS + " AND txd1.branch_id = ob1.branch_id AND txs1.tx_current = 1 AND art1.guid = ? AND NOT oapt1.attribute_provider_class LIKE ? AND ob1.branch_name = ?";
+
+ public static String getUri(String guid, int branchId) throws OseeDataStoreException {
+ return getUri(URI_BY_GUID_AND_BRANCH_ID, guid, DEFAULT_ATTRIBUTE_DATA_PROVIDER, branchId);
+ }
+
+ public static String getUri(String guid, String branchName) throws OseeDataStoreException {
+ return getUri(URI_BY_GUID_AND_BRANCH_NAME, guid, DEFAULT_ATTRIBUTE_DATA_PROVIDER, branchName);
+ }
+
+ private static String getUri(String query, Object... dataBindings) throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchString((String) null, query, dataBindings);
+ }
+}
diff --git a/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/DefaultOseeArtifact.java b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/DefaultOseeArtifact.java
new file mode 100644
index 00000000000..323e5767602
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/DefaultOseeArtifact.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.framework.artifact.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * Retrieves the default OSEE server page
+ *
+ * @author Roberto E. Escobar
+ */
+public class DefaultOseeArtifact {
+
+ private static String OSEE_DEFAULT_SERVER_PAGE_GUID_KEY = "osee.default.server.page.guid";
+ private static String OSEE_DEFAULT_SERVER_PAGE_BRANCH_ID = "osee.default.server.page.branch.id";
+
+ public static ObjectPair<String, String> get() throws Exception {
+
+ final String artifactGuid = OseeInfo.getValue(OSEE_DEFAULT_SERVER_PAGE_GUID_KEY);
+ String defaultBranchId = OseeInfo.getValue(OSEE_DEFAULT_SERVER_PAGE_BRANCH_ID);
+ int artifactBranchId = -1;
+ try {
+ artifactBranchId = Integer.parseInt(defaultBranchId);
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+
+ if (!Strings.isValid(artifactGuid) || artifactBranchId < 1) {
+ throw new OseeStateException(
+ String.format(
+ "OSEE default server page not found. Ensure values exist in OseeInfo table for [%s] and [%s] keys.",
+ OSEE_DEFAULT_SERVER_PAGE_GUID_KEY, OSEE_DEFAULT_SERVER_PAGE_BRANCH_ID));
+ }
+ return new ObjectPair<String, String>(artifactGuid, String.valueOf(artifactBranchId));
+ }
+}
diff --git a/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/HttpArtifactFileInfo.java b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/HttpArtifactFileInfo.java
new file mode 100644
index 00000000000..aa77475719b
--- /dev/null
+++ b/org.eclipse.osee.framework.artifact.servlet/src/org/eclipse/osee/framework/artifact/servlet/HttpArtifactFileInfo.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.framework.artifact.servlet;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpArtifactFileInfo {
+ private static final int INVALID_BRANCH_ID = -1;
+ private static final String GUID_KEY = "guid";
+ private static final String BRANCH_NAME_KEY = "branch";
+ private static final String BRANCH_ID_KEY = "branchId";
+
+ private String guid;
+ private String branchName;
+ private String branchId;
+
+ public HttpArtifactFileInfo(String guid, String branchName, String branchId) {
+ this.guid = guid;
+ this.branchName = branchName;
+ this.branchId = branchId;
+ }
+
+ public HttpArtifactFileInfo(HttpServletRequest request) {
+ this(request.getParameter(GUID_KEY), request.getParameter(BRANCH_NAME_KEY), request.getParameter(BRANCH_ID_KEY));
+ }
+
+ public String getGuid() {
+ return guid;
+ }
+
+ public boolean isBranchNameValid() {
+ return branchName != null && branchName.length() > 0;
+ }
+
+ public String getBranchName() {
+ return branchName;
+ }
+
+ public int getBranchId() throws NumberFormatException {
+ int toReturn = INVALID_BRANCH_ID;
+ if (branchId != null && branchId.length() > 0) {
+ toReturn = Integer.parseInt(branchId);
+ }
+ return toReturn;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.branch.management.servlet/.classpath b/org.eclipse.osee.framework.branch.management.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.branch.management.servlet/.project b/org.eclipse.osee.framework.branch.management.servlet/.project
new file mode 100644
index 00000000000..6245017568c
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.branch.management.servlet</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.branch.management.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.branch.management.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..54e7f34adec
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu May 08 12:25:01 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.branch.management.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.branch.management.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..7e4df9604f3
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Servlet Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.branch.management.servlet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.branch.management.servlet.InternalBranchServletActivator
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.branch.management,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.resource.management,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.service.log,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.branch.management.servlet/build.properties b/org.eclipse.osee.framework.branch.management.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchExchangeServlet.java b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchExchangeServlet.java
new file mode 100644
index 00000000000..a2bc6fc20fe
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchExchangeServlet.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchExchangeServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = -1642995618810911260L;
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ HttpBranchExchangeInfo exchangeInfo = new HttpBranchExchangeInfo(req);
+ switch (exchangeInfo.getFunction()) {
+ case exportBranch:
+ executeExport(exchangeInfo, response);
+ break;
+ case importBranch:
+ executeImport(exchangeInfo, response);
+ break;
+ case checkExchange:
+ executeCheckExchange(exchangeInfo, response);
+ default:
+ break;
+ }
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ response.setContentType("text/plain");
+ OseeLog.log(InternalBranchServletActivator.class, Level.SEVERE, String.format("Error processing [%s]", req.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+ private void executeCheckExchange(HttpBranchExchangeInfo exchangeInfo, HttpServletResponse response) throws Exception {
+ int status = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ StringBuffer message = new StringBuffer();
+
+ String path = exchangeInfo.getPath();
+ IResourceLocator exchangeLocator = InternalBranchServletActivator.getInstance().getResourceLocatorManager().getResourceLocator(path);
+ IResourceLocator verifyLocator = InternalBranchServletActivator.getInstance().getBranchExchange().checkIntegrity(exchangeLocator);
+ status = HttpServletResponse.SC_ACCEPTED;
+ message.append(String.format("Verification at: [%s]", verifyLocator.getLocation().toASCIIString()));
+
+ response.setStatus(status);
+ response.setContentType("text/plain");
+ response.getWriter().write(message.toString());
+ }
+
+ private void executeExport(HttpBranchExchangeInfo exchangeInfo, HttpServletResponse response) throws Exception {
+ int status = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ StringBuffer message = new StringBuffer();
+ IResourceLocator exchangeLocator =
+ InternalBranchServletActivator.getInstance().getBranchExchange().exportBranch(exchangeInfo.getExchangeFileName(),
+ exchangeInfo.getOptions(), exchangeInfo.getSelectedBranchIds());
+ status = HttpServletResponse.SC_ACCEPTED;
+ message.append(String.format("Exported: [%s]", exchangeLocator.getLocation().toASCIIString()));
+
+ if (exchangeInfo.isSendExportFile()) {
+ InputStream exportFileStream = null;
+ try {
+ IResource resource = InternalBranchServletActivator.getInstance().getResourceManager().acquire(exchangeLocator, new Options());
+ exportFileStream = resource.getContent();
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentLength(exportFileStream.available());
+ response.setCharacterEncoding("ISO-8859-1");
+ response.setContentType("application/zip");
+ response.setHeader("Content-Disposition", "attachment; filename=" + resource.getName());
+ Lib.inputStreamToOutputStream(exportFileStream, response.getOutputStream());
+ } finally {
+ if (exportFileStream != null) {
+ exportFileStream.close();
+ }
+ }
+ }
+
+ if (exchangeInfo.isDeleteExportFile()) {
+ int deleteResult = InternalBranchServletActivator.getInstance().getResourceManager().delete(exchangeLocator);
+ if (deleteResult == IResourceManager.OK) {
+ status = HttpServletResponse.SC_ACCEPTED;
+ } else {
+ status = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ message.append(String.format("Error during deletion of: [%s]",
+ exchangeLocator.getLocation().toASCIIString()));
+ }
+ }
+ response.setStatus(status);
+ response.setContentType("text/plain");
+ response.getWriter().write(message.toString());
+ }
+
+ private void executeImport(HttpBranchExchangeInfo exchangeInfo, HttpServletResponse response) throws Exception {
+ IResourceLocator locator =
+ InternalBranchServletActivator.getInstance().getResourceLocatorManager().getResourceLocator(exchangeInfo.getPath());
+
+ InternalBranchServletActivator.getInstance().getBranchExchange().importBranch(locator, exchangeInfo.getOptions(),
+ exchangeInfo.getSelectedBranchIds());
+
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ response.setContentType("text/plain");
+ response.getWriter().write(String.format("Successfully imported: [%s]", exchangeInfo.getPath()));
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doGet(req, resp);
+ // Get available export files.
+ // Get export file metadata for options.
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchManagerServlet.java b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchManagerServlet.java
new file mode 100644
index 00000000000..8a14a6a020d
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/BranchManagerServlet.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.framework.branch.management.servlet;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+public class BranchManagerServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = 226986283540461526L;
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ try {
+ resp.setStatus(HttpServletResponse.SC_ACCEPTED);
+ resp.setContentType("text/plain");
+ HttpBranchCreationInfo info = new HttpBranchCreationInfo(req);
+ int branchId = -1;
+ switch (info.getFunction()) {
+ case createChildBranch:
+ branchId =
+ InternalBranchServletActivator.getInstance().getBranchCreation().createChildBranch(
+ info.getParentTransactionId(), info.getParentBranchId(), info.getBranchName(),
+ info.getCreationComment(), info.getAssociatedArtifactId(), info.getAuthorId(),
+ info.branchWithFiltering(), info.getCompressArtTypeIds(), info.getPreserveArtTypeIds());
+ break;
+ case createRootBranch:
+ branchId =
+ InternalBranchServletActivator.getInstance().getBranchCreation().createTopLevelBranch(
+ info.getParentTransactionId(), info.getParentBranchId(), info.getBranchName(),
+ info.getCreationComment(), info.getAssociatedArtifactId(), info.getAuthorId(),
+ info.getStaticBranchName(), info.isSystemRootBranch());
+ break;
+ }
+ if (branchId != -1) {
+ resp.getWriter().write(Integer.toString(branchId));
+ } else {
+ resp.getWriter().write("Unknown Error during branch creation.");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(InternalBranchServletActivator.class, Level.SEVERE, String.format(
+ "Failed to respond to a branch servlet request [%s]", req.toString()), ex);
+ resp.setContentType("text/plain");
+ resp.getWriter().write(Lib.exceptionToString(ex));
+ }
+ resp.getWriter().flush();
+ resp.getWriter().close();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchCreationInfo.java b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchCreationInfo.java
new file mode 100644
index 00000000000..e666754ec42
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchCreationInfo.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.framework.branch.management.servlet;
+
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+class HttpBranchCreationInfo {
+
+ enum BranchCreationFunction {
+ createRootBranch, createChildBranch
+ };
+
+ private BranchCreationFunction function;
+ private int parentBranchId;
+ private int parentTransactionId;
+ private String branchName;
+ private String creationComment;
+ private int associatedArtifactId;
+ private int authorId;
+ private String staticBranchName;
+ private String[] compressArtTypeIds;
+ private String[] preserveArtTypeIds;
+ private boolean systemRootBranch;
+
+ public HttpBranchCreationInfo(HttpServletRequest req) throws OseeArgumentException {
+ ensureFunctionValid(req.getParameter("function"));
+
+ String parentBranchIdStr = req.getParameter("parentBranchId");
+ if (parentBranchIdStr == null) {
+ throw new OseeArgumentException("A 'parentBranchId' parameter must be specified");
+ } else {
+ parentBranchId = Integer.parseInt(parentBranchIdStr);
+ }
+
+ if (function == BranchCreationFunction.createChildBranch) {
+ String parentTransactionIdStr = req.getParameter("parentTransactionId");
+ if (parentTransactionIdStr == null) {
+ throw new OseeArgumentException("A 'parentTransactionId' parameter must be specified");
+ } else {
+ parentTransactionId = Integer.parseInt(parentTransactionIdStr);
+ }
+ }
+
+ branchName = req.getParameter("branchName");//required
+ if (branchName == null || branchName.length() == 0) {
+ throw new OseeArgumentException("A 'branchName' parameter must be specified");
+ }
+ creationComment = req.getParameter("creationComment");//required
+ if (creationComment == null || creationComment.length() == 0) {
+ throw new OseeArgumentException("A 'creationComment' parameter must be specified");
+ }
+ String associatedArtifactIdStr = req.getParameter("associatedArtifactId");
+ if (associatedArtifactIdStr == null) {
+ throw new OseeArgumentException("A 'associatedArtifactId' parameter must be specified");
+ }
+ associatedArtifactId = Integer.parseInt(associatedArtifactIdStr);
+ String authorIdStr = req.getParameter("authorId");
+ if (authorIdStr == null) {
+ throw new OseeArgumentException("A 'authorIdStr' parameter must be specified");
+ }
+ authorId = Integer.parseInt(authorIdStr);
+ staticBranchName = req.getParameter("staticBranchName");
+
+ String compressArtTypeIdsString = req.getParameter("compressArtTypes");
+ if (compressArtTypeIdsString != null) {
+ compressArtTypeIds = compressArtTypeIdsString.split(",");
+ }
+ String preserveArtTypeIdsString = req.getParameter("preserveArtTypes");
+ if (preserveArtTypeIdsString != null) {
+ preserveArtTypeIds = preserveArtTypeIdsString.split(",");
+ }
+
+ systemRootBranch = Boolean.parseBoolean(req.getParameter("systemRootBranch"));
+ }
+
+ private void ensureFunctionValid(String function) throws OseeArgumentException {
+ if (function == null) {
+ throw new OseeArgumentException("A 'function' parameter must be defined.");
+ }
+ try {
+ this.function = BranchCreationFunction.valueOf(function);
+ } catch (IllegalArgumentException ex) {
+ throw new OseeArgumentException(String.format("[%s] is not a valid function.", function));
+ }
+ }
+
+ /**
+ * @return the parentBranchId
+ */
+ public int getParentBranchId() {
+ return parentBranchId;
+ }
+
+ /**
+ * @return the branchName
+ */
+ public String getBranchName() {
+ return branchName;
+ }
+
+ /**
+ * @return the creationComment
+ */
+ public String getCreationComment() {
+ return creationComment;
+ }
+
+ /**
+ * @return the associatedArtifactId
+ */
+ public int getAssociatedArtifactId() {
+ return associatedArtifactId;
+ }
+
+ /**
+ * @return the authorId
+ */
+ public int getAuthorId() {
+ return authorId;
+ }
+
+ /**
+ * @return the staticBranchName
+ */
+ public String getStaticBranchName() {
+ return staticBranchName;
+ }
+
+ /**
+ * @return the function
+ */
+ public BranchCreationFunction getFunction() {
+ return function;
+ }
+
+ /**
+ * @return the preserveArtTypes
+ */
+ public String[] getPreserveArtTypeIds() {
+ return preserveArtTypeIds;
+ }
+
+ /**
+ * @return the compressArtTypes
+ */
+ public String[] getCompressArtTypeIds() {
+ return compressArtTypeIds;
+ }
+
+ public boolean branchWithFiltering() {
+ return (getCompressArtTypeIds() != null && getCompressArtTypeIds().length > 0) || (getPreserveArtTypeIds() != null && getPreserveArtTypeIds().length > 0);
+ }
+
+ /**
+ * @return the systemRootBranch
+ */
+ public boolean isSystemRootBranch() {
+ return systemRootBranch;
+ }
+
+ /**
+ * @return the parentTransactionId
+ */
+ public int getParentTransactionId() {
+ return parentTransactionId;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchExchangeInfo.java b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchExchangeInfo.java
new file mode 100644
index 00000000000..1faaaa90f4d
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/HttpBranchExchangeInfo.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.framework.branch.management.servlet;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpBranchExchangeInfo {
+
+ enum BranchExchangeFunctions {
+ exportBranch, importBranch, checkExchange;
+ };
+
+ private BranchExchangeFunctions function;
+ private String exchangeFileName;
+ private String path;
+ private List<Integer> selectedBranchIds;
+ private boolean sendExportFile;
+ private boolean deleteExportFile;
+ private Options options;
+
+ @SuppressWarnings("unchecked")
+ public HttpBranchExchangeInfo(HttpServletRequest request) throws Exception {
+ this.options = new Options();
+ this.function = null;
+ this.selectedBranchIds = new ArrayList<Integer>();
+ this.sendExportFile = false;
+ this.deleteExportFile = false;
+ this.exchangeFileName = null;
+ this.path = null;
+
+ Enumeration<String> enumeration = request.getParameterNames();
+ while (enumeration.hasMoreElements()) {
+ String name = enumeration.nextElement();
+ String value = request.getParameter(name);
+ if (name.equalsIgnoreCase("filename")) {
+ this.exchangeFileName = value;
+ } else if (name.equalsIgnoreCase("uri")) {
+ this.path = value;
+ } else if (name.equalsIgnoreCase("send.export.file")) {
+ this.sendExportFile = Boolean.valueOf(value);
+ } else if (name.equalsIgnoreCase("delete.export.file")) {
+ this.deleteExportFile = Boolean.valueOf(value);
+ } else if (name.equalsIgnoreCase("function")) {
+ isFunctionValid(value);
+ } else if (name.equalsIgnoreCase("branchIds")) {
+ for (String entry : value.split(",")) {
+ selectedBranchIds.add(new Integer(entry));
+ }
+ } else {
+ options.put(name.toUpperCase(), value);
+ }
+ }
+ }
+
+ public BranchExchangeFunctions getFunction() {
+ return this.function;
+ }
+
+ public boolean isSendExportFile() {
+ return this.sendExportFile;
+ }
+
+ public boolean isDeleteExportFile() {
+ return this.deleteExportFile;
+ }
+
+ public String getExchangeFileName() {
+ return this.exchangeFileName;
+ }
+
+ public String getPath() {
+ return this.path;
+ }
+
+ public List<Integer> getSelectedBranchIds() {
+ return this.selectedBranchIds;
+ }
+
+ public Options getOptions() {
+ return this.options;
+ }
+
+ private void isFunctionValid(String function) throws Exception {
+ if (function == null) {
+ throw new Exception("A 'function' parameter must be defined.");
+ }
+ try {
+ this.function = BranchExchangeFunctions.valueOf(function);
+ } catch (IllegalArgumentException ex) {
+ throw new Exception(String.format("[%s] is not a valid function.", function), ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/InternalBranchServletActivator.java b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/InternalBranchServletActivator.java
new file mode 100644
index 00000000000..3b57986a6c9
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management.servlet/src/org/eclipse/osee/framework/branch/management/servlet/InternalBranchServletActivator.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.framework.branch.management.servlet;
+
+import org.eclipse.osee.framework.branch.management.IBranchCreation;
+import org.eclipse.osee.framework.branch.management.IBranchExchange;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+public class InternalBranchServletActivator implements BundleActivator {
+ private ServiceTracker resourceManagementTracker;
+ private ServiceTracker resourceLocatorManagerTracker;
+ private OseeHttpServiceTracker httpBranchManagementTracker;
+ private OseeHttpServiceTracker httpBranchExportTracker;
+ private ServiceTracker branchCreationTracker;
+ private ServiceTracker branchExchangeTracker;
+ private static InternalBranchServletActivator instance;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+
+ branchCreationTracker = new ServiceTracker(context, IBranchCreation.class.getName(), null);
+ branchCreationTracker.open();
+
+ branchExchangeTracker = new ServiceTracker(context, IBranchExchange.class.getName(), null);
+ branchExchangeTracker.open();
+
+ httpBranchManagementTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.BRANCH_CREATION_CONTEXT, BranchManagerServlet.class);
+ httpBranchManagementTracker.open();
+
+ httpBranchExportTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.BRANCH_EXCHANGE_CONTEXT, BranchExchangeServlet.class);
+ httpBranchExportTracker.open();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ httpBranchManagementTracker.close();
+ httpBranchManagementTracker = null;
+
+ httpBranchExportTracker.close();
+ httpBranchExportTracker = null;
+
+ branchCreationTracker.close();
+ branchCreationTracker = null;
+
+ branchExchangeTracker.close();
+ branchExchangeTracker = null;
+
+ resourceManagementTracker.close();
+ resourceManagementTracker = null;
+
+ resourceLocatorManagerTracker.close();
+ resourceLocatorManagerTracker = null;
+ instance = null;
+ }
+
+ public static InternalBranchServletActivator getInstance() {
+ return instance;
+ }
+
+ public IBranchCreation getBranchCreation() {
+ return (IBranchCreation) branchCreationTracker.getService();
+ }
+
+ public IBranchExchange getBranchExchange() {
+ return (IBranchExchange) branchExchangeTracker.getService();
+ }
+
+ public IResourceManager getResourceManager() {
+ return (IResourceManager) resourceManagementTracker.getService();
+ }
+
+ public IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) resourceLocatorManagerTracker.getService();
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/.classpath b/org.eclipse.osee.framework.branch.management/.classpath
new file mode 100644
index 00000000000..1fa3e6803d3
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/.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.branch.management/.project b/org.eclipse.osee.framework.branch.management/.project
new file mode 100644
index 00000000000..d550bbfa99c
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.branch.management</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.branch.management/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.branch.management/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..5eadaab90a6
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu May 08 12:23:53 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.branch.management/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.branch.management/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..9439c5527c6
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Branch Management Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.branch.management;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.branch.management.internal.InternalBranchActivator
+Import-Package: org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.enums,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.query,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.jdk.core.util.time,
+ org.eclipse.osee.framework.jdk.core.util.xml,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.eclipse.osee.framework.resource.provider.common,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.branch.management
+Service-Component: OSGI-INF/exchange.provider.xml,
+ OSGI-INF/locator.provider.exchange.xml
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.branch.management/OSGI-INF/exchange.provider.xml b/org.eclipse.osee.framework.branch.management/OSGI-INF/exchange.provider.xml
new file mode 100644
index 00000000000..a292177bdce
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/OSGI-INF/exchange.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="exchange.resource.provider">
+ <implementation class="org.eclipse.osee.framework.branch.management.exchange.resource.ExchangeProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.resource.management.IResourceProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.branch.management/OSGI-INF/locator.provider.exchange.xml b/org.eclipse.osee.framework.branch.management/OSGI-INF/locator.provider.exchange.xml
new file mode 100644
index 00000000000..a9e7fb33d8b
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/OSGI-INF/locator.provider.exchange.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="resource.locator.exchange">
+ <implementation class="org.eclipse.osee.framework.branch.management.exchange.resource.ExchangeLocatorProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.resource.management.IResourceLocatorProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.branch.management/build.properties b/org.eclipse.osee.framework.branch.management/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ExportOptions.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ExportOptions.java
new file mode 100644
index 00000000000..49ffef7558a
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ExportOptions.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.framework.branch.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum ExportOptions {
+ EXCLUDE_BASELINE_TXS, MIN_TXS, MAX_TXS, COMPRESS;
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchCreation.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchCreation.java
new file mode 100644
index 00000000000..5700aed07ef
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchCreation.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.framework.branch.management;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+public interface IBranchCreation {
+ public int createTopLevelBranch(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, String staticBranchName, boolean systemRootBranch) throws Exception;
+
+ public int createChildBranch(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, boolean branchWithFiltering, String[] compressArtTypeIds, String[] preserveArtTypeIds) throws Exception;
+
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchExchange.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchExchange.java
new file mode 100644
index 00000000000..7b1fd36c911
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IBranchExchange.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.branch.management;
+
+import java.util.List;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IBranchExchange {
+
+ public IResourceLocator exportBranch(String exportName, Options options, int... branchIds) throws Exception;
+
+ public IResourceLocator exportBranch(String exportName, Options options, List<Integer> branchIds) throws Exception;
+
+ public void importBranch(IResourceLocator fileToImport, Options options, int... branchIds) throws Exception;
+
+ public void importBranch(IResourceLocator fileToImport, Options options, List<Integer> branchIds) throws Exception;
+
+ public IResourceLocator checkIntegrity(IResourceLocator fileToCheck) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IExchangeTaskListener.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IExchangeTaskListener.java
new file mode 100644
index 00000000000..f54892fd2ca
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/IExchangeTaskListener.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.framework.branch.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IExchangeTaskListener {
+
+ public void onExportItemStarted(String name);
+
+ public void onExportItemCompleted(String name, long timeToProcess);
+
+ public void onException(String name, Throwable ex);
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ImportOptions.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ImportOptions.java
new file mode 100644
index 00000000000..2f58513a515
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/ImportOptions.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.framework.branch.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum ImportOptions {
+ USE_IDS_FROM_IMPORT_FILE, EXCLUDE_BASELINE_TXS, ALL_AS_ROOT_BRANCHES, CLEAN_BEFORE_IMPORT, MIN_TXS, MAX_TXS;
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/BranchExchange.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/BranchExchange.java
new file mode 100644
index 00000000000..74f0bf5724f
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/BranchExchange.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.framework.branch.management.exchange;
+
+import java.util.List;
+import org.eclipse.osee.framework.branch.management.IBranchExchange;
+import org.eclipse.osee.framework.branch.management.exchange.resource.ExchangeLocatorProvider;
+import org.eclipse.osee.framework.branch.management.internal.InternalBranchActivator;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchExchange implements IBranchExchange {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.IBranchExchange#exportBranch(java.lang.String, org.eclipse.osee.framework.resource.management.Options, int[])
+ */
+ @Override
+ public IResourceLocator exportBranch(String exportName, Options options, int... branchIds) throws Exception {
+ ExportController controller = new ExportController(exportName, options, branchIds);
+ controller.execute();
+ return InternalBranchActivator.getResourceLocatorManager().generateResourceLocator(
+ ExchangeLocatorProvider.PROTOCOL, "", controller.getExchangeFileName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.IBranchExchange#exportBranch(java.lang.String, org.eclipse.osee.framework.resource.management.Options, java.util.List)
+ */
+ @Override
+ public IResourceLocator exportBranch(String exportName, Options options, List<Integer> branchIds) throws Exception {
+ int[] branchIdsArray = new int[branchIds.size()];
+ for (int index = 0; index < branchIds.size(); index++) {
+ branchIdsArray[index] = branchIds.get(index);
+ }
+ return exportBranch(exportName, options, branchIdsArray);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.IBranchExchange#importBranch(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.Options, int[])
+ */
+ @Override
+ public void importBranch(IResourceLocator fileToImport, Options options, int... branchIds) throws Exception {
+ ImportController importController = new ImportController(fileToImport, options, branchIds);
+ importController.execute();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.IBranchExchange#importBranch(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.Options, java.util.List)
+ */
+ @Override
+ public void importBranch(IResourceLocator fileToImport, Options options, List<Integer> branchIds) throws Exception {
+ int[] branchIdsArray = new int[branchIds.size()];
+ for (int index = 0; index < branchIds.size(); index++) {
+ branchIdsArray[index] = branchIds.get(index);
+ }
+ importBranch(fileToImport, options, branchIdsArray);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.IBranchExchange#checkIntegrity(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public IResourceLocator checkIntegrity(IResourceLocator fileToCheck) throws Exception {
+ ExchangeIntegrity exchangeIntegrityCheck = new ExchangeIntegrity(fileToCheck);
+ exchangeIntegrityCheck.execute();
+ return InternalBranchActivator.getResourceLocatorManager().generateResourceLocator(
+ ExchangeLocatorProvider.PROTOCOL, "", exchangeIntegrityCheck.getExchangeCheckFileName());
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeDb.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeDb.java
new file mode 100644
index 00000000000..7bfc1b24435
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeDb.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.branch.management.ExportOptions;
+import org.eclipse.osee.framework.branch.management.exchange.export.AbstractExportItem;
+import org.eclipse.osee.framework.branch.management.exchange.export.ManifestExportItem;
+import org.eclipse.osee.framework.branch.management.exchange.export.MetadataExportItem;
+import org.eclipse.osee.framework.branch.management.exchange.export.RelationalExportItem;
+import org.eclipse.osee.framework.branch.management.exchange.export.RelationalExportItemWithType;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExchangeDb {
+
+ private static final String ARTIFACT_TYPE_ID = "art_type_id";
+ private static final String ATTRIBUTE_TYPE_ID = "attr_type_id";
+ private static final String RELATION_TYPE_ID = "rel_link_type_id";
+ public static final String GAMMA_ID = "gamma_id";
+ public static final String TRANSACTION_ID = "transaction_id";
+ public static final String ATTRIBUTE_ID = "attr_id";
+ public static final String ARTIFACT_ID = "art_id";
+ public static final String RELATION_ID = "rel_link_id";
+ private static final String BRANCH_ID = "branch_id";
+ public static final String CONFLICT_ID = "conflict_id";
+ public static final String CONFLICT_TYPE = "conflict_type";
+
+ private static final String[] BRANCH_ID_NEG_ONE_ALIASES = new String[] {"parent_branch_id"};
+
+ private static final String[] BRANCH_ID_REG_ALIASES =
+ new String[] {"mapped_branch_id", "source_branch_id", "merge_branch_id", "dest_branch_id"};
+
+ private static final String[] ARTIFACT_ID_NEG_ONE_ALIASES =
+ new String[] {"commit_art_id", "associated_art_id", "a_order", "b_order", "author"};
+
+ private static final String[] ARTIFACT_ID_REG_ALIASES = new String[] {"a_art_id", "b_art_id", "privilege_entity_id"};
+
+ private static final String[] GAMMA_ID_REG_ALIASES = new String[] {"source_gamma_id", "dest_gamma_id"};
+
+ private static final String[] TRANSACTION_ID_REG_ALIASES = new String[0];
+ private static final String[] TRANSACTION_ID_NEG_ONE_ALIASES = new String[] {"commit_transaction_id"};
+
+ private static final String[] ARTIFACT_ID_ALIASES;
+ private static final String[] BRANCH_ID_ALIASES;
+ private static final String[] GAMMA_ID_ALIASES;
+ private static final String[] TRANSACTION_ID_ALIASES;
+ static {
+ Set<String> artIdAliases = new HashSet<String>();
+ artIdAliases.add(ARTIFACT_ID);
+ artIdAliases.addAll(Arrays.asList(ARTIFACT_ID_REG_ALIASES));
+ artIdAliases.addAll(Arrays.asList(ARTIFACT_ID_NEG_ONE_ALIASES));
+ ARTIFACT_ID_ALIASES = artIdAliases.toArray(new String[artIdAliases.size()]);
+
+ Set<String> branchIdAliases = new HashSet<String>();
+ branchIdAliases.add(BRANCH_ID);
+ branchIdAliases.addAll(Arrays.asList(BRANCH_ID_REG_ALIASES));
+ branchIdAliases.addAll(Arrays.asList(BRANCH_ID_NEG_ONE_ALIASES));
+ BRANCH_ID_ALIASES = branchIdAliases.toArray(new String[branchIdAliases.size()]);
+
+ Set<String> gammaIdAliases = new HashSet<String>();
+ gammaIdAliases.add(GAMMA_ID);
+ gammaIdAliases.addAll(Arrays.asList(GAMMA_ID_REG_ALIASES));
+ GAMMA_ID_ALIASES = gammaIdAliases.toArray(new String[gammaIdAliases.size()]);
+
+ Set<String> txIdAliases = new HashSet<String>();
+ txIdAliases.add(TRANSACTION_ID);
+ txIdAliases.addAll(Arrays.asList(TRANSACTION_ID_REG_ALIASES));
+ txIdAliases.addAll(Arrays.asList(TRANSACTION_ID_NEG_ONE_ALIASES));
+ TRANSACTION_ID_ALIASES = txIdAliases.toArray(new String[txIdAliases.size()]);
+ }
+
+ public static final String GET_MAX_TX =
+ "SELECT last_sequence FROM osee_sequence WHERE sequence_name = '" + SequenceManager.TRANSACTION_ID_SEQ + "'";
+
+ private static final String BRANCH_TABLE_QUERY =
+ "SELECT br1.* FROM osee_branch br1, osee_join_export_import jex1 WHERE br1.branch_id = jex1.id1 AND jex1.query_id=? ORDER BY br1.branch_id";
+
+ private static final String BRANCH_DEFINITION_QUERY =
+ "SELECT br1.* FROM osee_branch_definitions br1, osee_join_export_import jex1 WHERE br1.mapped_branch_id = jex1.id1 AND jex1.query_id=? ORDER BY br1.mapped_branch_id";
+
+ private static final String TX_DETAILS_TABLE_QUERY =
+ "SELECT txd1.TRANSACTION_ID, txd1.TIME, txd1.AUTHOR, txd1.OSEE_COMMENT, txd1.BRANCH_ID, txd1.COMMIT_ART_ID, txd1.TX_TYPE FROM osee_tx_details txd1, osee_join_export_import jex1 WHERE txd1.branch_id = jex1.id1 AND jex1.query_id=? %s ORDER BY txd1.transaction_id";
+
+ private static final String TXS_TABLE_QUERY =
+ "SELECT txs1.GAMMA_ID, txs1.TRANSACTION_ID, txs1.TX_CURRENT, txs1.MOD_TYPE FROM osee_txs txs1, osee_tx_details txd1, osee_join_export_import jex1 WHERE txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String ARTIFACT_TABLE_QUERY =
+ "SELECT DISTINCT (art1.art_id), art1.GUID, art1.HUMAN_READABLE_ID, art1.ART_TYPE_ID FROM osee_artifact art1, osee_artifact_version artv1, osee_txs txs1, osee_tx_details txd1, osee_join_export_import jex1 WHERE art1.art_id = artv1.art_id AND artv1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String ARTIFACT_VERSION_QUERY =
+ "SELECT DISTINCT (artv1.GAMMA_ID), artv1.ART_ID, artv1.MODIFICATION_ID FROM osee_artifact_version artv1, osee_txs txs1, osee_tx_details txd1, osee_join_export_import jex1 WHERE artv1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String ATTRIBUTE_TABLE_QUERY =
+ "SELECT DISTINCT (attr1.GAMMA_ID), attr1.ATTR_ID, attr1.ART_ID, attr1.MODIFICATION_ID, attr1.VALUE, attr1.ATTR_TYPE_ID, attr1.URI FROM osee_attribute attr1, osee_txs txs1, osee_tx_details txd1, osee_join_export_import jex1 WHERE attr1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String RELATION_LINK_TABLE_QUERY =
+ "SELECT DISTINCT (rel1.GAMMA_ID), rel1.REL_LINK_ID, rel1.B_ART_ID, rel1.A_ART_ID, rel1.MODIFICATION_ID, rel1.RATIONALE, rel1.REL_LINK_TYPE_ID, rel1.A_ORDER, rel1.B_ORDER FROM osee_relation_link rel1, osee_txs txs1, osee_tx_details txd1, osee_join_export_import jex1 WHERE rel1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String ARTIFACT_TYPE_QUERY =
+ "SELECT type1.name, type1.art_type_id FROM osee_artifact_type type1, osee_join_export_import jex1 WHERE type1.art_type_id = jex1.id1 AND jex1.query_id = ?";
+
+ private static final String ATTRIBUTE_TYPE_QUERY =
+ "SELECT type1.name, type1.attr_type_id FROM osee_attribute_type type1, osee_join_export_import jex1 WHERE type1.attr_type_id = jex1.id1 AND jex1.query_id = ?";
+
+ private static final String RELATION_TYPE_QUERY =
+ "SELECT type1.type_name, type1.rel_link_type_id FROM osee_relation_link_type type1, osee_join_export_import jex1 WHERE type1.rel_link_type_id = jex1.id1 AND jex1.query_id = ?";
+
+ private static final String MERGE_TABLE_QUERY =
+ "SELECT om1.* FROM osee_merge om1, osee_join_export_import jex1 WHERE om1.merge_branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String CONFLICT_TABLE_QUERY =
+ "SELECT oc1.* FROM osee_conflict oc1, osee_merge om1, osee_join_export_import jex1 WHERE oc1.merge_branch_id = om1.merge_branch_id AND om1.merge_branch_id = jex1.id1 AND jex1.query_id=? %s";
+
+ private static final String ARTIFACT_ACL_QUERY =
+ "SELECT oaa1.* FROM osee_artifact_acl oaa1, osee_join_export_import jex1 WHERE oaa1.branch_id = jex1.id1 AND jex1.query_id=? ORDER BY oaa1.branch_id";
+
+ private static final String BRANCH_ACL_QUERY =
+ "SELECT oba1.* FROM osee_branch_acl oba1, osee_join_export_import jex1 WHERE oba1.branch_id = jex1.id1 AND jex1.query_id=? ORDER BY oba1.branch_id";
+
+ static List<AbstractExportItem> createTaskList() {
+ List<AbstractExportItem> items = new ArrayList<AbstractExportItem>();
+ items.add(new ManifestExportItem(0, "export.manifest", items));
+ items.add(new MetadataExportItem(0, "export.db.schema", items));
+ items.add(new RelationalExportItem(1, "osee.branch.data", SkynetDatabase.BRANCH_TABLE.toString(),
+ BRANCH_TABLE_QUERY));
+ items.add(new RelationalExportItem(2, "osee.branch.definitions", SkynetDatabase.BRANCH_DEFINITIONS.toString(),
+ BRANCH_DEFINITION_QUERY));
+ items.add(new RelationalExportItem(3, "osee.tx.details.data", SkynetDatabase.TRANSACTION_DETAIL_TABLE.toString(),
+ TX_DETAILS_TABLE_QUERY));
+ items.add(new RelationalExportItem(4, "osee.txs.data", SkynetDatabase.TRANSACTIONS_TABLE.toString(),
+ TXS_TABLE_QUERY));
+ items.add(new RelationalExportItemWithType(5, "osee.artifact.data", SkynetDatabase.ARTIFACT_TABLE.toString(),
+ ARTIFACT_TYPE_ID, ARTIFACT_TABLE_QUERY, ARTIFACT_TYPE_QUERY));
+ items.add(new RelationalExportItem(6, "osee.artifact.version.data",
+ SkynetDatabase.ARTIFACT_VERSION_TABLE.toString(), ARTIFACT_VERSION_QUERY));
+ items.add(new RelationalExportItemWithType(7, "osee.attribute.data",
+ SkynetDatabase.ATTRIBUTE_VERSION_TABLE.toString(), ATTRIBUTE_TYPE_ID, ATTRIBUTE_TABLE_QUERY,
+ ATTRIBUTE_TYPE_QUERY));
+ items.add(new RelationalExportItemWithType(8, "osee.relation.link.data",
+ SkynetDatabase.RELATION_LINK_VERSION_TABLE.toString(), RELATION_TYPE_ID, RELATION_LINK_TABLE_QUERY,
+ RELATION_TYPE_QUERY));
+
+ items.add(new RelationalExportItem(9, "osee.merge.data", SkynetDatabase.OSEE_MERGE_TABLE.toString(),
+ MERGE_TABLE_QUERY));
+ items.add(new RelationalExportItem(10, "osee.conflict.data", SkynetDatabase.OSEE_CONFLICT_TABLE.toString(),
+ CONFLICT_TABLE_QUERY));
+
+ items.add(new RelationalExportItem(11, "osee.branch.acl.data", SkynetDatabase.BRANCH_TABLE_ACL.toString(),
+ BRANCH_ACL_QUERY));
+ items.add(new RelationalExportItem(12, "osee.artifact.acl.data", SkynetDatabase.ARTIFACT_TABLE_ACL.toString(),
+ ARTIFACT_ACL_QUERY));
+
+ return items;
+ }
+
+ static List<IndexCollector> createCheckList() {
+ List<IndexCollector> items = new ArrayList<IndexCollector>();
+ items.add(new IndexCollector("osee.txs.data", GAMMA_ID, GAMMA_ID_REG_ALIASES));
+ items.add(new IndexCollector("osee.tx.details.data", TRANSACTION_ID, TRANSACTION_ID_REG_ALIASES,
+ TRANSACTION_ID_NEG_ONE_ALIASES));
+ items.add(new IndexCollector("osee.artifact.data", ARTIFACT_ID, ARTIFACT_ID_REG_ALIASES,
+ ARTIFACT_ID_NEG_ONE_ALIASES));
+ items.add(new IndexCollector("osee.attribute.data", ATTRIBUTE_ID));
+ items.add(new IndexCollector("osee.relation.link.data", RELATION_ID));
+ items.add(new IndexCollector("osee.branch.data", BRANCH_ID, BRANCH_ID_REG_ALIASES, BRANCH_ID_NEG_ONE_ALIASES));
+ return items;
+ }
+
+ static List<IdTranslator> createTranslators() {
+ List<IdTranslator> translators = new ArrayList<IdTranslator>();
+ translators.add(new IdTranslator(SequenceManager.GAMMA_ID_SEQ, GAMMA_ID_ALIASES));
+ translators.add(new IdTranslator(SequenceManager.TRANSACTION_ID_SEQ, TRANSACTION_ID_ALIASES));
+ translators.add(new IdTranslator(SequenceManager.BRANCH_ID_SEQ, BRANCH_ID_ALIASES));
+ translators.add(new IdTranslator(SequenceManager.ART_TYPE_ID_SEQ, ARTIFACT_TYPE_ID));
+ translators.add(new IdTranslator(SequenceManager.ATTR_TYPE_ID_SEQ, ATTRIBUTE_TYPE_ID));
+ translators.add(new IdTranslator(SequenceManager.REL_LINK_TYPE_ID_SEQ, RELATION_TYPE_ID));
+ translators.add(new IdTranslator(SequenceManager.ART_ID_SEQ, ARTIFACT_ID_ALIASES));
+ translators.add(new IdTranslator(SequenceManager.ATTR_ID_SEQ, ATTRIBUTE_ID));
+ translators.add(new IdTranslator(SequenceManager.REL_LINK_ID_SEQ, RELATION_ID));
+ return translators;
+ }
+
+ public static ObjectPair<String, Object[]> getQueryWithOptions(String originalQuery, int queryId, Options options) throws Exception {
+ if (originalQuery.contains("%s")) {
+ if (originalQuery.contains("osee_tx_details") || originalQuery.contains("osee_merge")) {
+ List<Object> dataArray = new ArrayList<Object>();
+ dataArray.add(queryId);
+ StringBuilder optionString = new StringBuilder();
+ if (options.getBoolean(ExportOptions.EXCLUDE_BASELINE_TXS.name()) && originalQuery.contains("txd1")) {
+ optionString.append(" AND txd1.TX_TYPE = 0");
+ }
+
+ long minTxs = getMinTransaction(options);
+ long maxTxs = getMaxTransaction(options);
+
+ if (minTxs != Long.MIN_VALUE) {
+ if (originalQuery.contains("om1")) {
+ optionString.append(" AND om1.commit_transaction_id >= ?");
+ dataArray.add(minTxs);
+ } else if (originalQuery.contains("txd1")) {
+ optionString.append(" AND txd1.transaction_id >= ?");
+ dataArray.add(minTxs);
+ }
+ }
+
+ if (maxTxs != Long.MIN_VALUE) {
+ if (originalQuery.contains("om1")) {
+ optionString.append(" AND om1.commit_transaction_id <= ?");
+ dataArray.add(maxTxs);
+ } else if (originalQuery.contains("txd1")) {
+ optionString.append(" AND txd1.transaction_id <= ?");
+ dataArray.add(maxTxs);
+ }
+ }
+ if (minTxs > maxTxs) {
+ throw new Exception(String.format("Invalid transaction range: min - %d > max - %d", minTxs, maxTxs));
+ }
+
+ return new ObjectPair<String, Object[]>(String.format(originalQuery, optionString),
+ dataArray.toArray(new Object[dataArray.size()]));
+ }
+ }
+ return new ObjectPair<String, Object[]>(originalQuery, new Object[] {queryId});
+ }
+
+ static Long getMaxTransaction(Options options) {
+ return getTransactionNumber(options, ExportOptions.MAX_TXS.name());
+ }
+
+ static Long getMinTransaction(Options options) {
+ return getTransactionNumber(options, ExportOptions.MIN_TXS.name());
+ }
+
+ private static Long getTransactionNumber(Options options, String exportOption) {
+ String transactionNumber = options.getString(exportOption);
+ long toReturn = Long.MIN_VALUE;
+ if (Strings.isValid(transactionNumber)) {
+ toReturn = Long.valueOf(transactionNumber);
+ }
+ return toReturn;
+ }
+
+ private ExchangeDb() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeIntegrity.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeIntegrity.java
new file mode 100644
index 00000000000..ebd768e5b74
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeIntegrity.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.framework.branch.management.exchange;
+
+import java.io.File;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.branch.management.exchange.handler.ManifestSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.RelationalSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.ManifestSaxHandler.ImportFile;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExchangeIntegrity {
+ private final IResourceLocator locator;
+ private String checkExchange;
+
+ public ExchangeIntegrity(IResourceLocator locator) {
+ this.locator = locator;
+ }
+
+ public String getExchangeCheckFileName() {
+ return checkExchange;
+ }
+
+ public void execute() throws Exception {
+ long startTime = System.currentTimeMillis();
+ ObjectPair<Boolean, File> tempExchange = ExchangeUtil.getTempExchangeFile(locator);
+ final File exchange = tempExchange.object2;
+ try {
+ ManifestSaxHandler manifestSaxHandler = new ManifestSaxHandler();
+ ExchangeUtil.readExchange(exchange, "export.manifest.xml", manifestSaxHandler);
+ List<ImportFile> filesToCheck = new ArrayList<ImportFile>();
+ filesToCheck.addAll(manifestSaxHandler.getImportFiles());
+ filesToCheck.add(manifestSaxHandler.getBranchFile());
+ filesToCheck.add(manifestSaxHandler.getBranchDefinitionsFile());
+
+ final List<IndexCollector> checkList = ExchangeDb.createCheckList();
+ for (final ImportFile importFile : filesToCheck) {
+ ExchangeUtil.readExchange(exchange, importFile.getFileName(), new CheckSaxHandler(checkList,
+ importFile.getFileName()));
+ }
+ checkExchange = exchange.getName() + ".verify.xml";
+ writeResults(exchange.getParentFile(), checkExchange, checkList);
+ } finally {
+ ExchangeUtil.cleanUpTempExchangeFile(exchange, tempExchange.object1);
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Verified [%s] in [%s]", locator.getLocation(),
+ Lib.getElapseString(startTime)));
+ }
+ }
+
+ private void writeResults(File writeLocation, String fileName, List<IndexCollector> checkList) throws Exception {
+ Writer writer = null;
+ try {
+ writer = ExchangeUtil.createXmlWriter(writeLocation, fileName, (int) Math.pow(2, 20));
+ ExportImportXml.openXmlNode(writer, ExportImportXml.DATA);
+
+ for (IndexCollector integrityCheck : checkList) {
+ boolean passedCheck = !integrityCheck.hasErrors();
+ writer.append("\t");
+ ExportImportXml.openPartialXmlNode(writer, ExportImportXml.ENTRY);
+ ExportImportXml.addXmlAttribute(writer, ExportImportXml.ID, integrityCheck.getSource());
+ ExportImportXml.addXmlAttribute(writer, "status", passedCheck ? "OK" : "FAILED");
+
+ if (passedCheck) {
+ ExportImportXml.closePartialXmlNode(writer);
+ } else {
+ ExportImportXml.endOpenedPartialXmlNode(writer);
+ Map<String, Set<Long>> results = integrityCheck.getItemsNotFound();
+ for (String key : results.keySet()) {
+ Set<Long> values = results.get(key);
+ writer.append("\t\t");
+ ExportImportXml.openPartialXmlNode(writer, "error");
+ ExportImportXml.addXmlAttribute(writer, ExportImportXml.ID, key);
+ ExportImportXml.endOpenedPartialXmlNode(writer);
+ Xml.writeAsCdata(writer, "\t\t\t" + values.toString());
+ writer.append("\n\t\t");
+ ExportImportXml.closeXmlNode(writer, "error");
+ }
+ writer.append("\t");
+ ExportImportXml.closeXmlNode(writer, ExportImportXml.ENTRY);
+ }
+ }
+ ExportImportXml.closeXmlNode(writer, ExportImportXml.DATA);
+ } finally {
+ if (writer != null) {
+ writer.close();
+ }
+ }
+ }
+
+ private final class CheckSaxHandler extends RelationalSaxHandler {
+ private final List<IndexCollector> checkList;
+ private final String fileBeingProcessed;
+
+ protected CheckSaxHandler(List<IndexCollector> checkList, String fileBeingProcessed) {
+ super(true, 0);
+ this.checkList = checkList;
+ this.fileBeingProcessed = Lib.removeExtension(fileBeingProcessed);
+ System.out.println(String.format("Verifying: [%s]", fileBeingProcessed));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.RelationalSaxHandler#processData(java.util.Map)
+ */
+ @Override
+ protected void processData(Map<String, String> fieldMap) throws Exception {
+ String conflictId = fieldMap.get(ExchangeDb.CONFLICT_ID);
+ String conflictType = fieldMap.get(ExchangeDb.CONFLICT_TYPE);
+ if (Strings.isValid(conflictId) && Strings.isValid(conflictType)) {
+ int conflictOrdinal = Integer.valueOf(conflictType);
+ for (ConflictType type : ConflictType.values()) {
+ if (type.getValue() == conflictOrdinal) {
+ String keyName = ExchangeDb.CONFLICT_ID;
+ switch (type) {
+ case ARTIFACT:
+ keyName = ExchangeDb.ARTIFACT_ID;
+ break;
+ case ATTRIBUTE:
+ keyName = ExchangeDb.ATTRIBUTE_ID;
+ break;
+ case RELATION:
+ keyName = ExchangeDb.RELATION_ID;
+ break;
+ default:
+ break;
+ }
+ fieldMap.put(keyName, conflictId);
+ break;
+ }
+ }
+ }
+ for (IndexCollector integrityCheck : checkList) {
+ integrityCheck.processData(fileBeingProcessed, fieldMap);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseExportImportSaxHandler#finishData()
+ */
+ @Override
+ protected void finishData() {
+ for (IndexCollector integrityCheck : checkList) {
+ integrityCheck.removeFalsePositives();
+ }
+ super.finishData();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeUtil.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeUtil.java
new file mode 100644
index 00000000000..2dce9df899c
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExchangeUtil.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.framework.branch.management.exchange;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.branch.management.exchange.resource.ExchangeProvider;
+import org.eclipse.osee.framework.branch.management.internal.InternalBranchActivator;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExchangeUtil {
+ private static final String TEMP_NAME_PREFIX = "branch.xchng.";
+
+ private ExchangeUtil() {
+ }
+
+ public static Writer createXmlWriter(File tempFolder, String name, int bufferSize) throws Exception {
+ File indexFile = new File(tempFolder, name);
+ Writer writer =
+ new BufferedWriter(new OutputStreamWriter(new FileOutputStream(indexFile), ExportImportXml.XML_ENCODING),
+ bufferSize);
+ writer.write(ExportImportXml.XML_HEADER);
+ return writer;
+ }
+
+ public static ObjectPair<Boolean, File> getTempExchangeFile(IResourceLocator locator) throws Exception {
+ File importSource = null;
+ boolean wasZipExtractionRequired = false;
+ IResource resource = InternalBranchActivator.getResourceManager().acquire(locator, new Options());
+ File source = new File(resource.getLocation());
+ if (source.isFile()) {
+ wasZipExtractionRequired = true;
+ importSource = ExchangeUtil.createTempFolder();
+ OseeLog.log(ExchangeUtil.class, Level.INFO, String.format("Extracting Exchange File: [%s] to [%s]",
+ source.getName(), importSource));
+ Lib.decompressStream(new FileInputStream(source), importSource);
+ wasZipExtractionRequired = true;
+ } else {
+ wasZipExtractionRequired = false;
+ importSource = source;
+ }
+ return new ObjectPair<Boolean, File>(wasZipExtractionRequired, importSource);
+ }
+
+ public static void cleanUpTempExchangeFile(File exchangeSource, boolean wasZipExtractionRequired) {
+ if (wasZipExtractionRequired && exchangeSource != null && exchangeSource.exists() && exchangeSource.getAbsolutePath() != ExchangeProvider.getExchangeFilePath()) {
+ OseeLog.log(ExchangeUtil.class, Level.INFO, String.format("Deleting Branch Import Temp Folder - [%s]",
+ exchangeSource));
+ Lib.deleteDir(exchangeSource);
+ }
+ }
+
+ public static File createTempFolder() {
+ String basePath = ExchangeProvider.getExchangeFilePath();
+ String fileName = TEMP_NAME_PREFIX + Lib.getDateTimeString();
+ File rootDirectory = new File(basePath, fileName + File.separator);
+ rootDirectory.mkdirs();
+ return rootDirectory;
+ }
+
+ public static void readExchange(File zipFile, String fileToProcess, ContentHandler handler) throws OseeCoreException {
+ InputStream inputStream = null;
+ try {
+ File entry = new File(zipFile, fileToProcess);
+ inputStream = new BufferedInputStream(new FileInputStream(entry));
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setContentHandler(handler);
+ reader.parse(new InputSource(inputStream));
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportController.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportController.java
new file mode 100644
index 00000000000..9aa168710a5
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportController.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.framework.branch.management.exchange;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.branch.management.ExportOptions;
+import org.eclipse.osee.framework.branch.management.IExchangeTaskListener;
+import org.eclipse.osee.framework.branch.management.exchange.export.AbstractDbExportItem;
+import org.eclipse.osee.framework.branch.management.exchange.export.AbstractExportItem;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.ExportImportJoinQuery;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+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.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class ExportController extends DbTransaction implements IExchangeTaskListener {
+ private static final String ZIP_EXTENSION = ".zip";
+
+ private String exportName;
+ private final Options options;
+ private final int[] branchIds;
+ private ExportImportJoinQuery joinQuery;
+ private ExecutorService executorService;
+ private List<String> errorList;
+
+ ExportController(String exportName, Options options, int... branchIds) throws Exception {
+ if (branchIds == null || branchIds.length <= 0) {
+ throw new Exception("No branch selected for export.");
+ }
+ this.exportName = exportName;
+ this.options = options;
+ this.branchIds = branchIds;
+ this.joinQuery = JoinUtility.createExportImportJoinQuery();
+ this.errorList = Collections.synchronizedList(new ArrayList<String>());
+ }
+
+ public String getExchangeFileName() throws MalformedLocatorException {
+ return this.exportName;
+ }
+
+ public int getExportQueryId() {
+ return joinQuery != null ? joinQuery.getQueryId() : -1;
+ }
+
+ private void cleanUp(OseeConnection connection, List<AbstractExportItem> taskList) {
+ for (AbstractExportItem exportItem : taskList) {
+ exportItem.cleanUp();
+ }
+ try {
+ if (joinQuery != null) {
+ joinQuery.delete(connection);
+ joinQuery = null;
+ }
+ } catch (OseeDataStoreException ex) {
+ onException("Export Clean-Up", ex);
+ }
+ this.executorService.shutdown();
+ this.executorService = null;
+ }
+
+ private File createTempFolder() {
+ File rootDirectory = ExchangeUtil.createTempFolder();
+ if (!Strings.isValid(exportName)) {
+ this.exportName = rootDirectory.getName();
+ }
+ return rootDirectory;
+ }
+
+ private void setUp(OseeConnection connection, List<AbstractExportItem> taskList, File tempFolder) throws OseeDataStoreException {
+ joinQuery = JoinUtility.createExportImportJoinQuery();
+ for (int branchId : branchIds) {
+ joinQuery.add(branchId, -1);
+ }
+ joinQuery.store(connection);
+
+ long maxTx = ConnectionHandler.runPreparedQueryFetchLong(connection, -1, ExchangeDb.GET_MAX_TX);
+ long userMaxTx = ExchangeDb.getMaxTransaction(options);
+ if (userMaxTx == Long.MIN_VALUE || userMaxTx > maxTx) {
+ options.put(ExportOptions.MAX_TXS.name(), Long.toString(maxTx));
+ }
+
+ for (AbstractExportItem exportItem : taskList) {
+ exportItem.setOptions(options);
+ exportItem.setWriteLocation(tempFolder);
+ if (exportItem instanceof AbstractDbExportItem) {
+ AbstractDbExportItem exportItem2 = ((AbstractDbExportItem) exportItem);
+ exportItem2.setJoinQueryId(joinQuery.getQueryId());
+ exportItem2.setConnection(connection);
+ }
+ exportItem.addExportListener(this);
+ }
+ executorService =
+ Executors.newFixedThreadPool(2, CoreServerActivator.createNewThreadFactory("branch.export.worker"));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxWork(java.sql.Connection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ long startTime = System.currentTimeMillis();
+ List<AbstractExportItem> taskList = ExchangeDb.createTaskList();
+ try {
+ File tempFolder = createTempFolder();
+ setUp(connection, taskList, tempFolder);
+
+ List<Future<?>> futures = new ArrayList<Future<?>>();
+ for (AbstractExportItem exportItem : taskList) {
+ futures.add(this.executorService.submit(exportItem));
+ }
+
+ for (Future<?> future : futures) {
+ future.get();
+ if (this.errorList.size() > 0) {
+ throw new OseeCoreException(errorList.toString());
+ }
+ }
+
+ String zipTargetName = exportName + ZIP_EXTENSION;
+ if (this.options.getBoolean(ExportOptions.COMPRESS.name())) {
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Compressing Branch Export Data - [%s]",
+ zipTargetName));
+ File zipTarget = new File(tempFolder.getParent(), zipTargetName);
+ Lib.compressDirectory(tempFolder, zipTarget.getAbsolutePath(), true);
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Deleting Branch Export Temp Folder - [%s]",
+ tempFolder));
+ Lib.deleteDir(tempFolder);
+ } else {
+ File target = new File(tempFolder.getParent(), exportName);
+ if (!target.equals(tempFolder)) {
+ tempFolder.renameTo(target);
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ cleanUp(connection, taskList);
+ }
+ int branchTotal = branchIds != null ? branchIds.length : 0;
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Exported [%s] branch%s in [%s]", branchTotal,
+ branchTotal != 1 ? "es" : "", Lib.getElapseString(startTime)));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.IExportListener#onException(java.lang.String, java.lang.Throwable)
+ */
+ @Override
+ synchronized public void onException(String name, Throwable ex) {
+ errorList.add(Lib.exceptionToString(ex));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.IExportListener#onExportItemCompleted(java.lang.String, long)
+ */
+ @Override
+ synchronized public void onExportItemCompleted(String name, long timeToProcess) {
+ System.out.println(String.format("Exported: [%s] in [%s] ms", name, timeToProcess));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.IExportListener#onExportItemStarted(java.lang.String)
+ */
+ @Override
+ public void onExportItemStarted(String name) {
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportImportXml.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportImportXml.java
new file mode 100644
index 00000000000..201c8051db8
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ExportImportXml.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.framework.branch.management.exchange;
+
+import java.io.IOException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExportImportXml {
+ public static final String XML_ENCODING = "UTF-8";
+ public static final String XML_EXTENSION = ".xml";
+ public static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"" + XML_ENCODING + "\" ?>\n";
+
+ public static final String RESOURCE_FOLDER_NAME = "resources";
+ public static final String METADATA = "metadata";
+ public static final String DATA = "data";
+ public static final String ENTRY = "entry";
+ public static final String BINARY_CONTENT = "binaryContent";
+ public static final String STRING_CONTENT = "stringContent";
+ public static final String OSEE_COMMENT = "osee_comment";
+ public static final String BRANCH_NAME = "branch_name";
+ public static final String TABLE = "table";
+ public static final String TABLE_NAME = "name";
+ public static final String COLUMN = "column";
+ public static final String ID = "id";
+ public static final String TYPE = "type";
+ public static final String PRIORITY = "priority";
+ public static final String OPTIONS = "options";
+ public static final String SOURCE = "source";
+ public static final String DB_SCHEMA = "db.metadata";
+ public static final String PART_OF_BRANCH = "part_of_branch_id";
+ public static final String RATIONALE = "rationale";
+ public static final String EXPORT_ENTRY = "export";
+ public static final String DATABASE_ID = "databaseId";
+ public static final String EXPORT_DATE = "exportDate";
+
+ private ExportImportXml() {
+ }
+
+ public static void closeXmlNode(Appendable appendable, String nodeName) throws IOException {
+ appendable.append(String.format("</%s>\n", nodeName));
+ }
+
+ public static void openXmlNode(Appendable appendable, String nodeName) throws IOException {
+ appendable.append(String.format("<%s>\n", nodeName));
+ }
+
+ public static void openXmlNodeNoNewline(Appendable appendable, String nodeName) throws IOException {
+ appendable.append(String.format("<%s>", nodeName));
+ }
+
+ public static void openPartialXmlNode(Appendable appendable, String nodeName) throws IOException {
+ appendable.append(String.format("<%s ", nodeName));
+ }
+
+ public static void addXmlAttribute(Appendable appendable, String name, Object value) throws IOException {
+ appendable.append(String.format("%s=\"%s\" ", name, value));
+ }
+
+ public static void closePartialXmlNode(Appendable appendable) throws IOException {
+ appendable.append(" />\n");
+ }
+
+ public static void endOpenedPartialXmlNode(Appendable appendable) throws IOException {
+ appendable.append(">\n");
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IdTranslator.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IdTranslator.java
new file mode 100644
index 00000000000..efcbb36d242
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IdTranslator.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.framework.branch.management.exchange;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class IdTranslator {
+ private static final String INSERT_INTO_IMPORT_INDEX_MAP =
+ "INSERT INTO osee_import_index_map (sequence_id, original_id, mapped_id) VALUES (?, ?, ?)";
+
+ private static final String SELECT_IDS_BY_DB_SOURCE_AND_SEQ_NAME =
+ "SELECT original_id, mapped_id FROM osee_import_source ois, osee_import_map oim, osee_import_index_map oiim WHERE ois.import_id = oim.import_id AND oim.sequence_id = oiim.sequence_id AND oiim.sequence_id = oiim.sequence_id AND ois.db_source_guid = ? AND oim.sequence_name = ?";
+
+ private final String sequenceName;
+ private final Map<Long, Long> originalToMapped;
+ private final List<Long> newIds;
+ private final Set<String> aliases;
+
+ IdTranslator(String sequenceName, String... aliases) {
+ this.sequenceName = sequenceName;
+ this.originalToMapped = new HashMap<Long, Long>();
+ this.newIds = new ArrayList<Long>();
+ this.aliases = new HashSet<String>();
+ if (aliases != null && aliases.length > 0) {
+ for (String alias : aliases) {
+ this.aliases.add(alias.toLowerCase());
+ }
+ }
+ }
+
+ public boolean hasAliases() {
+ return this.aliases.size() > 0;
+ }
+
+ public Set<String> getAliases() {
+ return this.aliases;
+ }
+
+ public Object getId(Object original) throws OseeDataStoreException {
+ Long originalLong = null;
+ if (original instanceof Double) {
+ originalLong = ((Double) original).longValue();
+ } else if (original instanceof Integer) {
+ originalLong = ((Integer) original).longValue();
+ } else if (original instanceof Long) {
+ originalLong = ((Long) original).longValue();
+ } else {
+ System.out.println("Error here: " + original.getClass().getName());
+ }
+ Long newVersion = transalateId(originalLong);
+ Object toReturn = newVersion;
+ if (original instanceof Double) {
+ toReturn = Double.valueOf((double) newVersion);
+ } else if (original instanceof Integer) {
+ toReturn = newVersion.intValue();
+ } else if (original instanceof Long) {
+ toReturn = newVersion;
+ } else {
+ System.out.println("Error here: " + original.getClass().getName());
+ }
+ return toReturn;
+ }
+
+ private Long transalateId(Long original) throws OseeDataStoreException {
+ Long newVersion = null;
+ if (original <= 0L) {
+ newVersion = original;
+ } else {
+ newVersion = this.originalToMapped.get(original);
+ if (newVersion == null) {
+ newVersion = SequenceManager.getNextSequence(getSequence());
+ addToCache(original, newVersion);
+ }
+ }
+ return newVersion;
+ }
+
+ public String getSequence() {
+ return this.sequenceName;
+ }
+
+ public void addToCache(Long original, Long newValue) {
+ originalToMapped.put(original, newValue);
+ newIds.add(original);
+ }
+
+ public Long getFromCache(Long original) {
+ Long newVersion = null;
+ if (original <= 0L) {
+ newVersion = original;
+ } else {
+ newVersion = this.originalToMapped.get(original);
+ }
+ return newVersion;
+ }
+
+ public void load(String sourceDatabaseId) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ originalToMapped.clear();
+ chStmt.runPreparedQuery(SELECT_IDS_BY_DB_SOURCE_AND_SEQ_NAME, sourceDatabaseId, getSequence());
+ while (chStmt.next()) {
+ originalToMapped.put(chStmt.getLong("original_id"), chStmt.getLong("mapped_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public boolean hasItemsToStore() {
+ return !newIds.isEmpty();
+ }
+
+ public void store(OseeConnection connection, int sequenceId) throws OseeDataStoreException {
+ if (hasItemsToStore()) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (Long original : newIds) {
+ Long mapped = originalToMapped.get(original);
+ data.add(new Object[] {sequenceId, original, mapped});
+ }
+ ConnectionHandler.runBatchUpdate(connection, INSERT_INTO_IMPORT_INDEX_MAP, data);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ImportController.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ImportController.java
new file mode 100644
index 00000000000..7ae4f7d0ce5
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/ImportController.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange;
+
+import java.io.File;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.branch.management.ImportOptions;
+import org.eclipse.osee.framework.branch.management.exchange.handler.BaseDbSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.BranchDataSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.BranchDefinitionsSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.ManifestSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.MetaData;
+import org.eclipse.osee.framework.branch.management.exchange.handler.MetaDataSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.RelationalSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.RelationalTypeCheckSaxHandler;
+import org.eclipse.osee.framework.branch.management.exchange.handler.ManifestSaxHandler.ImportFile;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class ImportController {
+ private static final String SAVE_POINT_PREFIX = "save.point.";
+ private static final String EMPTY_STRING = "";
+
+ private static final String INSERT_INTO_IMPORT_SOURCES =
+ "INSERT INTO osee_import_source (import_id, db_source_guid, source_export_date, date_imported) VALUES (?, ?, ?, ?)";
+
+ private static final String INSERT_INTO_IMPORT_SAVE_POINT =
+ "INSERT INTO osee_import_save_point (import_id, save_point_name, status, state_error) VALUES (?, ?, ?, ?)";
+
+ private static final String QUERY_SAVE_POINTS_FROM_IMPORT_MAP =
+ "SELECT save_point_name from osee_import_save_point oisp, osee_import_source ois WHERE ois.import_id = oisp.import_id AND oisp.status = 1 AND ois.db_source_guid = ? AND ois.source_export_date = ?";
+
+ private final IResourceLocator locator;
+ private final Options options;
+ private final int[] branchesToImport;
+ private final Map<String, SavePoint> savePoints;
+
+ private File importSource;
+ private TranslationManager translator;
+ private ManifestSaxHandler manifestHandler;
+ private MetaDataSaxHandler metadataHandler;
+ private boolean wasZipExtractionRequired;
+ private String currentSavePoint;
+
+ ImportController(IResourceLocator locator, Options options, int... branchesToImport) {
+ this.locator = locator;
+ this.options = options;
+ this.branchesToImport = branchesToImport;
+ if (branchesToImport != null && branchesToImport.length > 0) {
+ throw new UnsupportedOperationException("selective branch import is not supported.");
+ }
+ this.wasZipExtractionRequired = false;
+ this.savePoints = new LinkedHashMap<String, SavePoint>();
+ }
+
+ private void checkPreconditions() throws OseeCoreException {
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.oracle)) {
+ throw new OseeStateException("DO NOT IMPORT ON PRODUCTION");
+ }
+ }
+
+ private void setup() throws Exception {
+ currentSavePoint = "sourceSetup";
+ ObjectPair<Boolean, File> result = ExchangeUtil.getTempExchangeFile(locator);
+ wasZipExtractionRequired = result.object1;
+ importSource = result.object2;
+
+ currentSavePoint = "setup";
+ translator = new TranslationManager();
+ translator.configure(options);
+
+ // Process manifest
+ currentSavePoint = "manifest";
+ manifestHandler = new ManifestSaxHandler();
+ ExchangeUtil.readExchange(importSource, "export.manifest.xml", manifestHandler);
+
+ // Process database meta data
+ currentSavePoint = manifestHandler.getMetadataFile();
+ metadataHandler = new MetaDataSaxHandler();
+ ExchangeUtil.readExchange(importSource, manifestHandler.getMetadataFile(), metadataHandler);
+ metadataHandler.checkAndLoadTargetDbMetadata();
+
+ // Load Import Indexes
+ currentSavePoint = "load.translator";
+ translator.loadTranslators(manifestHandler.getSourceDatabaseId());
+
+ loadImportTrace(manifestHandler.getSourceDatabaseId(), manifestHandler.getSourceExportDate());
+ }
+
+ private void cleanup() throws Exception {
+ try {
+ CommitImportSavePointsTx saveImportState = new CommitImportSavePointsTx();
+ saveImportState.execute();
+ } catch (Exception ex) {
+ OseeLog.log(this.getClass(), Level.WARNING,
+ "Error during save point save - you will not be able to reimport from last source again.");
+ throw ex;
+ } finally {
+ ExchangeUtil.cleanUpTempExchangeFile(importSource, wasZipExtractionRequired);
+ translator = null;
+ manifestHandler = null;
+ metadataHandler = null;
+ wasZipExtractionRequired = false;
+ importSource = null;
+ savePoints.clear();
+ }
+ }
+
+ public void execute() throws Exception {
+ checkPreconditions();
+ savePoints.clear();
+ try {
+ currentSavePoint = "start";
+ addSavePoint(currentSavePoint);
+ setup();
+
+ ImportBranchesTx importBranchesTx = new ImportBranchesTx();
+ importBranchesTx.execute();
+
+ currentSavePoint = "init.relational.objects";
+ RelationalTypeCheckSaxHandler typeCheckHandler = RelationalTypeCheckSaxHandler.createWithLimitedCache(50000);
+ RelationalSaxHandler relationalSaxHandler = RelationalSaxHandler.createWithLimitedCache(50000);
+ relationalSaxHandler.setSelectedBranchIds(branchesToImport);
+
+ processImportFiles(manifestHandler.getTypeFiles(), typeCheckHandler);
+ processImportFiles(manifestHandler.getImportFiles(), relationalSaxHandler);
+
+ importBranchesTx.updateBranchParentTransactionId();
+
+ currentSavePoint = "stop";
+ addSavePoint(currentSavePoint);
+ } catch (Throwable ex) {
+ reportError(currentSavePoint, ex);
+ OseeLog.log(this.getClass(), Level.SEVERE, ex);
+ } finally {
+ cleanup();
+ }
+ }
+
+ private void initializeHandler(OseeConnection connection, BaseDbSaxHandler handler, MetaData metadata) {
+ handler.setConnection(connection);
+ handler.setMetaData(metadata);
+ handler.setOptions(options);
+ handler.setTranslator(translator);
+ }
+
+ private void process(BaseDbSaxHandler handler, OseeConnection connection, ImportFile importSourceFile) throws OseeCoreException {
+ MetaData metadata = checkMetadata(importSourceFile);
+ initializeHandler(connection, handler, metadata);
+ if (importSourceFile.getPriority() > 0) {
+ boolean cleanDataTable = options.getBoolean(ImportOptions.CLEAN_BEFORE_IMPORT.name());
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Importing: [%s] %s Meta: %s",
+ importSourceFile.getSource(), cleanDataTable ? "clean before import" : "", metadata.getColumnNames()));
+ if (cleanDataTable) {
+ handler.clearDataTable();
+ }
+ }
+ ExchangeUtil.readExchange(importSource, importSourceFile.getFileName(), handler);
+ }
+
+ private MetaData checkMetadata(ImportFile importFile) {
+ MetaData metadata = metadataHandler.getMetadata(importFile.getSource());
+ if (metadata == null) {
+ throw new IllegalStateException(String.format("Invalid metadata for [%s]", importFile.getSource()));
+ }
+ return metadata;
+ }
+
+ private void processImportFiles(Collection<ImportFile> importFiles, final RelationalSaxHandler handler) throws Exception {
+ handler.setDecompressedFolder(importSource);
+ for (final ImportFile item : importFiles) {
+ currentSavePoint = item.getSource();
+ if (!doesSavePointExist(currentSavePoint)) {
+ DbTransaction importTx = new DbTransaction() {
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ process(handler, connection, item);
+ handler.store();
+ handler.reset();
+ addSavePoint(currentSavePoint);
+ }
+ };
+ importTx.execute();
+ } else {
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Save point found for: [%s] - skipping",
+ item.getSource()));
+ }
+ }
+ }
+
+ private void loadImportTrace(String sourceDatabaseId, Date sourceExportDate) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ currentSavePoint = "load.save.points";
+ chStmt.runPreparedQuery(QUERY_SAVE_POINTS_FROM_IMPORT_MAP, sourceDatabaseId, new Timestamp(
+ sourceExportDate.getTime()));
+ while (chStmt.next()) {
+ String key = chStmt.getString("save_point_name");
+ savePoints.put(key, new SavePoint(key));
+ }
+ addSavePoint(currentSavePoint);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private String asSavePointName(String sourceName) {
+ return SAVE_POINT_PREFIX + sourceName;
+ }
+
+ private boolean doesSavePointExist(String sourceName) {
+ return savePoints.containsKey(asSavePointName(sourceName));
+ }
+
+ private void addSavePoint(String sourceName) {
+ String key = asSavePointName(sourceName);
+ SavePoint point = savePoints.get(key);
+ if (point == null) {
+ point = new SavePoint(key);
+ savePoints.put(key, point);
+ }
+ }
+
+ private void reportError(String sourceName, Throwable ex) {
+ String key = asSavePointName(sourceName);
+ SavePoint point = savePoints.get(key);
+ if (point == null) {
+ point = new SavePoint(key);
+ savePoints.put(key, point);
+ }
+ point.addError(ex);
+ }
+
+ private final class ImportBranchesTx extends DbTransaction {
+
+ private final BranchDataSaxHandler branchHandler;
+ private int[] branchesStored;
+
+ /**
+ * @throws OseeStateException
+ */
+ public ImportBranchesTx() throws OseeCoreException {
+ super();
+ branchHandler = BranchDataSaxHandler.createWithCacheAll();
+ branchesStored = new int[0];
+ }
+
+ public void updateBranchParentTransactionId() throws OseeDataStoreException {
+ currentSavePoint = "update branch parent transaction id";
+ if (!doesSavePointExist(currentSavePoint)) {
+ if (branchesStored.length > 0) {
+ branchHandler.updateParentTransactionId(branchesStored);
+ }
+ } else {
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Save point found for: [%s] - skipping",
+ currentSavePoint));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxWork(java.sql.OseeConnection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ // Import Branches
+ currentSavePoint = manifestHandler.getBranchFile().getSource();
+ process(branchHandler, connection, manifestHandler.getBranchFile());
+
+ if (!doesSavePointExist(currentSavePoint)) {
+ branchesStored = branchHandler.store(true, branchesToImport);
+ addSavePoint(currentSavePoint);
+ } else {
+ // This step has already been performed - only get branches needed for remaining operations
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Save point found for: [%s] - skipping",
+ currentSavePoint));
+ branchesStored = branchHandler.store(false, branchesToImport);
+ }
+
+ // Import Branch Definitions
+ currentSavePoint = manifestHandler.getBranchDefinitionsFile().getSource();
+ if (!doesSavePointExist(currentSavePoint)) {
+ BranchDefinitionsSaxHandler definitionsHandler = BranchDefinitionsSaxHandler.createWithCacheAll();
+ definitionsHandler.setStoredBranches(branchesStored);
+ process(definitionsHandler, connection, manifestHandler.getBranchDefinitionsFile());
+ definitionsHandler.store();
+ addSavePoint(currentSavePoint);
+ } else {
+ OseeLog.log(this.getClass(), Level.INFO, String.format("Save point found for: [%s] - skipping",
+ currentSavePoint));
+ }
+ }
+
+ }
+
+ private final class CommitImportSavePointsTx extends DbTransaction {
+
+ /**
+ * @throws OseeStateException
+ */
+ public CommitImportSavePointsTx() throws OseeCoreException {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxWork(java.sql.OseeConnection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ if (manifestHandler != null && translator != null) {
+ int importIdIndex = SequenceManager.getNextImportId();
+ String sourceDatabaseId = manifestHandler.getSourceDatabaseId();
+ Timestamp importDate = new Timestamp(new Date().getTime());
+ Timestamp exportDate = new Timestamp(manifestHandler.getSourceExportDate().getTime());
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_INTO_IMPORT_SOURCES, importIdIndex,
+ sourceDatabaseId, exportDate, importDate);
+
+ ConnectionHandler.deferConstraintChecking(connection);
+ translator.store(connection, importIdIndex);
+
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (SavePoint savePoint : savePoints.values()) {
+ int status = 1;
+ String comment = EMPTY_STRING;
+ if (savePoint.hasErrors()) {
+ status = -1;
+ StringBuilder builder = new StringBuilder();
+ for (Throwable ex : savePoint.getErrors()) {
+ builder.append(Lib.exceptionToString(ex).replaceAll("\n", " "));
+ }
+ if (builder.length() < 4000) {
+ comment = builder.toString();
+ } else {
+ comment = builder.substring(0, 3999);
+ }
+ }
+ data.add(new Object[] {importIdIndex, savePoint.getName(), status, comment});
+ }
+ ConnectionHandler.runBatchUpdate(connection, INSERT_INTO_IMPORT_SAVE_POINT, data);
+ } else {
+ throw new OseeStateException("Import didn't make it past initialization");
+ }
+ }
+ }
+
+ private final class SavePoint {
+ private String savePointName;
+ private List<Throwable> errors;
+
+ public SavePoint(String name) {
+ this.savePointName = name;
+ this.errors = null;
+ }
+
+ public String getName() {
+ return savePointName;
+ }
+
+ public void addError(Throwable ex) {
+ if (errors == null) {
+ errors = new ArrayList<Throwable>();
+ }
+ if (!errors.contains(ex)) {
+ errors.add(ex);
+ }
+ }
+
+ public List<Throwable> getErrors() {
+ if (errors == null) {
+ return Collections.emptyList();
+ } else {
+ return this.errors;
+ }
+ }
+
+ public boolean hasErrors() {
+ return errors != null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IndexCollector.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IndexCollector.java
new file mode 100644
index 00000000000..ac172ce6b16
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/IndexCollector.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.framework.branch.management.exchange;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class IndexCollector {
+ private final String source;
+ private final String primaryKey;
+ private final Set<String> aliases;
+ private final Set<String> negativeOneAliases;
+ private final Set<Long> ids;
+ private final Map<String, Set<Long>> notFound;
+
+ IndexCollector(String source, String primaryKey, String[] aliases, String[] negativeOneAliases) {
+ this.source = source;
+ this.primaryKey = primaryKey.toLowerCase();
+ this.ids = java.util.Collections.synchronizedSet(new HashSet<Long>());
+ this.aliases = new HashSet<String>();
+ if (aliases != null && aliases.length > 0) {
+ for (String alias : aliases) {
+ this.aliases.add(alias.toLowerCase());
+ }
+ }
+ this.aliases.add(this.primaryKey);
+
+ this.negativeOneAliases = new HashSet<String>();
+ if (negativeOneAliases != null && negativeOneAliases.length > 0) {
+ for (String alias : negativeOneAliases) {
+ this.negativeOneAliases.add(alias.toLowerCase());
+ }
+ }
+ this.aliases.addAll(this.negativeOneAliases);
+ this.notFound = java.util.Collections.synchronizedMap(new HashMap<String, Set<Long>>());
+ }
+
+ IndexCollector(String source, String primaryKey, String[] aliases) {
+ this(source, primaryKey, aliases, null);
+ }
+
+ IndexCollector(String source, String primaryKey) {
+ this(source, primaryKey, new String[] {primaryKey}, null);
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ protected void processData(String source, Map<String, String> fieldMap) throws Exception {
+ if (this.source.equals(source)) {
+ if (fieldMap.containsKey(primaryKey)) {
+ String value = fieldMap.get(primaryKey);
+ if (Strings.isValid(value)) {
+ ids.add(Long.valueOf(value));
+ }
+ }
+ }
+ List<String> intersect = Collections.setIntersection(aliases, fieldMap.keySet());
+ for (String key : intersect) {
+ String value = fieldMap.get(key);
+ if (Strings.isValid(value)) {
+ long toCheck = Long.valueOf(value);
+ if (!ids.contains(toCheck)) {
+ if (!negativeOneAliases.contains(key) && !(toCheck == -1L)) {
+ addValue(key, toCheck);
+ }
+ }
+ }
+ }
+ }
+
+ private void addValue(String key, Long value) {
+ Set<Long> values = notFound.get(key);
+ if (values == null) {
+ values = java.util.Collections.synchronizedSet(new HashSet<Long>());
+ notFound.put(key, values);
+ }
+ values.add(value);
+ }
+
+ protected void removeFalsePositives() {
+ if (!notFound.isEmpty()) {
+ List<String> keysToRemove = new ArrayList<String>();
+ for (String key : notFound.keySet()) {
+ Collection<Long> values = notFound.get(key);
+ if (values != null && !values.isEmpty()) {
+ values.removeAll(ids);
+ if (negativeOneAliases.contains(key)) {
+ values.remove(-1L);
+ }
+ }
+ if (values.isEmpty()) {
+ keysToRemove.add(key);
+ }
+ }
+ for (String key : keysToRemove) {
+ notFound.remove(key);
+ }
+ }
+ }
+
+ public boolean hasErrors() {
+ return !notFound.isEmpty();
+ }
+
+ public Map<String, Set<Long>> getItemsNotFound() {
+ return notFound;
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/TranslationManager.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/TranslationManager.java
new file mode 100644
index 00000000000..3d1fbc49f83
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/TranslationManager.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.framework.branch.management.exchange;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.branch.management.ImportOptions;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.resource.management.Options;
+
+public class TranslationManager {
+ private static final String INSERT_INTO_IMPORT_MAP =
+ "INSERT INTO osee_import_map (import_id, sequence_id, sequence_name) VALUES (?, ?, ?)";
+
+ private final List<IdTranslator> translators;
+ private final Map<String, IdTranslator> translatorMap;
+
+ private boolean useOriginalIds;
+
+ public TranslationManager() {
+ this.useOriginalIds = true;
+ this.translators = ExchangeDb.createTranslators();
+ this.translatorMap = new HashMap<String, IdTranslator>();
+ for (IdTranslator translator : translators) {
+ for (String alias : translator.getAliases()) {
+ translatorMap.put(alias, translator);
+ }
+ }
+ }
+
+ public void configure(Options options) {
+ if (options != null) {
+ useOriginalIds = options.getBoolean(ImportOptions.USE_IDS_FROM_IMPORT_FILE.name());
+ }
+ }
+
+ public void loadTranslators(String sourceDatabaseId) throws OseeDataStoreException {
+ for (IdTranslator translator : translators) {
+ translator.load(sourceDatabaseId);
+ }
+ }
+
+ public List<String> getSequenceNames() {
+ List<String> toReturn = new ArrayList<String>();
+ for (IdTranslator translatedIdMap : translators) {
+ toReturn.add(translatedIdMap.getSequence());
+ }
+ return toReturn;
+ }
+
+ public void store(OseeConnection connection, int importIdIndex) throws OseeDataStoreException {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (IdTranslator translatedIdMap : translators) {
+ if (translatedIdMap.hasItemsToStore()) {
+ int importSeqId = SequenceManager.getNextImportMappedIndexId();
+ data.add(new Object[] {importIdIndex, importSeqId, translatedIdMap.getSequence()});
+ translatedIdMap.store(connection, importSeqId);
+ }
+ }
+ ConnectionHandler.runBatchUpdate(connection, INSERT_INTO_IMPORT_MAP, data);
+ }
+
+ public boolean isTranslatable(String name) {
+ return translatorMap.containsKey(name.toLowerCase());
+ }
+
+ public Object translate(String name, Object original) throws OseeDataStoreException {
+ Object toReturn = original;
+ if (original != null && !useOriginalIds) {
+ IdTranslator translator = translatorMap.get(name.toLowerCase());
+ if (translator != null) {
+ toReturn = translator.getId(original);
+ }
+ }
+ return toReturn;
+ }
+
+ public void checkIdMapping(String name, Long original, Long newValue) {
+ IdTranslator translator = translatorMap.get(name.toLowerCase());
+ if (translator != null) {
+ Long data = translator.getFromCache(original);
+ if (data == null || data != newValue) {
+ translator.addToCache(original, newValue);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractDbExportItem.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractDbExportItem.java
new file mode 100644
index 00000000000..928b3e5d03e
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractDbExportItem.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.framework.branch.management.exchange.export;
+
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractDbExportItem extends AbstractExportItem {
+
+ private OseeConnection connection;
+ private int joinQueryId;
+
+ public AbstractDbExportItem(int priority, String name, String source) {
+ super(priority, name, source);
+ this.joinQueryId = -1;
+ this.connection = null;
+ }
+
+ public void setJoinQueryId(int joinQueryId) {
+ this.joinQueryId = joinQueryId;
+ }
+
+ public void setConnection(OseeConnection connection) {
+ this.connection = connection;
+ }
+
+ protected OseeConnection getConnection() {
+ return this.connection;
+ }
+
+ protected int getJoinQueryId() {
+ return this.joinQueryId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.AbstractExportItem#cleanUp()
+ */
+ @Override
+ public void cleanUp() {
+ this.joinQueryId = -1;
+ this.connection = null;
+ super.cleanUp();
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractExportItem.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractExportItem.java
new file mode 100644
index 00000000000..56c3c248c7f
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/AbstractExportItem.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.framework.branch.management.exchange.export;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.branch.management.IExchangeTaskListener;
+import org.eclipse.osee.framework.branch.management.exchange.ExchangeUtil;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractExportItem implements Runnable {
+ private final String name;
+ private final String fileName;
+ private final int priority;
+ private final Set<IExchangeTaskListener> exportListeners;
+ private final String source;
+
+ private File writeLocation;
+ private Options options;
+ private boolean cancel;
+
+ public AbstractExportItem(int priority, String name, String source) {
+ this.name = name;
+ this.fileName = name + ExportImportXml.XML_EXTENSION;
+ this.priority = priority;
+ this.options = null;
+ this.cancel = false;
+ this.source = source;
+ this.exportListeners = Collections.synchronizedSet(new HashSet<IExchangeTaskListener>());
+ }
+
+ public String getSource() {
+ return this.source;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+
+ public int getBufferSize() {
+ return (int) Math.pow(2, 20);
+ }
+
+ public void setWriteLocation(File writeLocation) {
+ this.writeLocation = writeLocation;
+ }
+
+ public File getWriteLocation() {
+ return writeLocation;
+ }
+
+ public void setOptions(Options options) {
+ this.options = options;
+ }
+
+ public Options getOptions() {
+ return this.options;
+ }
+
+ public void addExportListener(IExchangeTaskListener exportListener) {
+ if (exportListener != null) {
+ this.exportListeners.add(exportListener);
+ }
+ }
+
+ public void removeExportListener(IExchangeTaskListener exportListener) {
+ if (exportListener != null) {
+ this.exportListeners.remove(exportListener);
+ }
+ }
+
+ public void cleanUp() {
+ this.setWriteLocation(null);
+ if (this.options != null) {
+ this.options.clear();
+ }
+ this.exportListeners.clear();
+ }
+
+ public final void run() {
+ notifyOnExportItemStarted();
+ long startTime = System.currentTimeMillis();
+ Writer writer = null;
+ try {
+ writer = ExchangeUtil.createXmlWriter(getWriteLocation(), getFileName(), getBufferSize());
+ ExportImportXml.openXmlNode(writer, ExportImportXml.DATA);
+ if (isCancel() != true) {
+ try {
+ doWork(writer);
+ } catch (Exception ex) {
+ notifyOnExportException(ex);
+ }
+ }
+ ExportImportXml.closeXmlNode(writer, ExportImportXml.DATA);
+ } catch (Exception ex) {
+ notifyOnExportException(ex);
+ } finally {
+ if (writer != null) {
+ try {
+ writer.close();
+ } catch (IOException ex) {
+ notifyOnExportException(ex);
+ }
+ }
+ notifyOnExportItemCompleted(System.currentTimeMillis() - startTime);
+ }
+ }
+
+ protected void notifyOnExportException(Throwable ex) {
+ for (IExchangeTaskListener listener : this.exportListeners) {
+ listener.onException(getName(), ex);
+ }
+ }
+
+ protected void notifyOnExportItemStarted() {
+ for (IExchangeTaskListener listener : this.exportListeners) {
+ listener.onExportItemStarted(getName());
+ }
+ }
+
+ protected void notifyOnExportItemCompleted(long timeToProcess) {
+ for (IExchangeTaskListener listener : this.exportListeners) {
+ listener.onExportItemCompleted(getName(), timeToProcess);
+ }
+ }
+
+ protected abstract void doWork(Appendable appendable) throws Exception;
+
+ public void setCancel(boolean cancel) {
+ this.cancel = cancel;
+ }
+
+ public boolean isCancel() {
+ return this.cancel;
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ColumnIdCollector.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ColumnIdCollector.java
new file mode 100644
index 00000000000..0459bb3e680
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ColumnIdCollector.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.framework.branch.management.exchange.export;
+
+import org.eclipse.osee.framework.branch.management.exchange.export.RelationalExportItem.IExportColumnListener;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.ExportImportJoinQuery;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class ColumnIdCollector implements IExportColumnListener {
+ private String columnToListenFor;
+ private ExportImportJoinQuery joinQuery;
+ private OseeConnection connection;
+
+ public ColumnIdCollector(String columnToListenFor) {
+ this.columnToListenFor = columnToListenFor;
+ this.connection = null;
+ this.joinQuery = null;
+ }
+
+ public void initialize() {
+ this.joinQuery = JoinUtility.createExportImportJoinQuery();
+ }
+
+ public void setConnection(OseeConnection connection) {
+ this.connection = connection;
+ }
+
+ public void cleanUp() throws OseeDataStoreException {
+ try {
+ this.joinQuery.delete(connection);
+ } finally {
+ this.joinQuery = null;
+ }
+ }
+
+ public String getColumnToListenFor() {
+ return columnToListenFor;
+ }
+
+ public void store() throws OseeDataStoreException {
+ if (this.joinQuery != null) {
+ this.joinQuery.store(connection);
+ }
+ }
+
+ public int getQueryId() {
+ return this.joinQuery != null ? this.joinQuery.getQueryId() : -1;
+ }
+
+ @Override
+ public void onColumnExport(String columnName, ConnectionHandlerStatement chStmt) throws Exception {
+ if (columnName.equals(getColumnToListenFor())) {
+ this.joinQuery.add(chStmt.getInt(columnName), -1);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ManifestExportItem.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ManifestExportItem.java
new file mode 100644
index 00000000000..89bc084769a
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/ManifestExportItem.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.framework.branch.management.exchange.export;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import org.eclipse.osee.framework.branch.management.ExportOptions;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.core.data.OseeDatabaseId;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ManifestExportItem extends AbstractExportItem {
+ private final List<AbstractExportItem> exportItems;
+
+ public ManifestExportItem(int priority, String name, List<AbstractExportItem> exportItems) {
+ super(priority, name, "");
+ this.exportItems = exportItems;
+ }
+
+ private void addEntry(Appendable appendable, String fileName, int priority, String source) throws IOException {
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.ENTRY);
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.ID, fileName);
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.PRIORITY, priority);
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.SOURCE, source);
+ ExportImportXml.closePartialXmlNode(appendable);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.export.AbstractExportItem#doWork(java.io.File, java.io.Writer, int)
+ */
+ @Override
+ protected void doWork(Appendable appendable) throws Exception {
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.EXPORT_ENTRY);
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.DATABASE_ID, OseeDatabaseId.getGuid());
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.EXPORT_DATE,
+ new Long(new Date().getTime()).toString());
+ ExportImportXml.closePartialXmlNode(appendable);
+
+ for (AbstractExportItem relationalItem : exportItems) {
+ if (!relationalItem.equals(this)) {
+ addEntry(appendable, relationalItem.getFileName(), relationalItem.getPriority(), relationalItem.getSource());
+ if (relationalItem instanceof RelationalExportItemWithType) {
+ AbstractExportItem typeItem = ((RelationalExportItemWithType) relationalItem).getTypeItem();
+ addEntry(appendable, typeItem.getFileName(), typeItem.getPriority(), typeItem.getSource());
+ }
+ }
+ }
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.OPTIONS);
+ for (ExportOptions exportOptions : ExportOptions.values()) {
+ String value = getOptions().getString(exportOptions.name());
+ if (exportOptions.equals(ExportOptions.EXCLUDE_BASELINE_TXS)) {
+ value = Boolean.valueOf(value).toString();
+ }
+ ExportImportXml.addXmlAttribute(appendable, exportOptions.name(), value);
+ }
+ ExportImportXml.closePartialXmlNode(appendable);
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/MetadataExportItem.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/MetadataExportItem.java
new file mode 100644
index 00000000000..9a97cb08568
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/MetadataExportItem.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.branch.management.exchange.export;
+
+import java.io.IOException;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MetadataExportItem extends AbstractDbExportItem {
+ private final List<AbstractExportItem> exportItems;
+
+ public MetadataExportItem(int priority, String name, List<AbstractExportItem> exportItems) {
+ super(priority, name, ExportImportXml.DB_SCHEMA);
+ this.exportItems = exportItems;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.AbstractExportItem#doWork(java.lang.Appendable)
+ */
+ @Override
+ protected void doWork(Appendable appendable) throws Exception {
+ ExportImportXml.openXmlNode(appendable, ExportImportXml.METADATA);
+ try {
+ DatabaseMetaData metaData = getConnection().getMetaData();
+ String[] tableTypes = getTypes(metaData);
+ String schema = getSchema(metaData);
+ for (AbstractExportItem item : exportItems) {
+ if (!item.equals(this) && Strings.isValid(item.getSource())) {
+ processMetaData(appendable, metaData, schema, tableTypes, item.getSource());
+ if (item instanceof RelationalExportItemWithType) {
+ AbstractExportItem typeItem = ((RelationalExportItemWithType) item).getTypeItem();
+ processMetaData(appendable, metaData, schema, tableTypes, typeItem.getSource());
+ }
+ }
+ }
+ } finally {
+ ExportImportXml.closeXmlNode(appendable, ExportImportXml.METADATA);
+ }
+ }
+
+ private boolean isTypeAllowed(String type) {
+ boolean toReturn = false;
+ if (!type.contains("system")) {
+ if (type.contains("table") || type.contains("synonym") || type.contains("view")) {
+ toReturn = true;
+ }
+ }
+ return toReturn;
+ }
+
+ private String[] getTypes(DatabaseMetaData metaData) throws SQLException {
+ List<String> toReturn = new ArrayList<String>();
+ ResultSet resultSet = null;
+ try {
+ resultSet = metaData.getTableTypes();
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ String type = resultSet.getString("TABLE_TYPE");
+ if (isTypeAllowed(type.toLowerCase())) {
+ toReturn.add(type);
+ }
+ }
+ }
+ } finally {
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ }
+ return toReturn.toArray(new String[toReturn.size()]);
+ }
+
+ private String getSchema(DatabaseMetaData metaData) throws SQLException {
+ String toReturn = "%";
+ ResultSet resultSet = null;
+ try {
+ resultSet = metaData.getSchemas();
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ String rawSchema = resultSet.getString("TABLE_SCHEM");
+ if (rawSchema.equalsIgnoreCase("osee")) {
+ toReturn = rawSchema + toReturn;
+ break;
+ }
+ }
+ }
+ } finally {
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ }
+ return toReturn;
+ }
+
+ private void processMetaData(Appendable appendable, DatabaseMetaData metaData, String schema, String[] tableTypes, String targetTable) throws Exception {
+ ResultSet resultSet = null;
+ try {
+
+ resultSet = metaData.getTables(null, null, schema, tableTypes);
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ String tableName = resultSet.getString("TABLE_NAME");
+ String schemaName = resultSet.getString("TABLE_SCHEM");
+ if (targetTable.equalsIgnoreCase(tableName)) {
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.TABLE);
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.TABLE_NAME, tableName.toLowerCase());
+ ExportImportXml.endOpenedPartialXmlNode(appendable);
+
+ processColumnMetaData(appendable, metaData, schemaName, tableName);
+
+ ExportImportXml.closeXmlNode(appendable, ExportImportXml.TABLE);
+ break;
+ }
+ }
+ }
+ } finally {
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ }
+ }
+
+ private void processColumnMetaData(Appendable appendable, DatabaseMetaData metaData, String schema, String tableName) throws SQLException, OseeDataStoreException, IOException {
+ ResultSet resultSet = null;
+ try {
+ try {
+ resultSet = metaData.getColumns(null, schema, tableName, null);
+ } catch (SQLException ex) {
+ resultSet = metaData.getColumns(null, null, tableName, null);
+ }
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.COLUMN);
+ try {
+ String columnId = resultSet.getString("COLUMN_NAME").toLowerCase();
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.ID, columnId);
+
+ int dataType = resultSet.getInt("DATA_TYPE");
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.foxpro)) {
+ if (dataType == Types.CHAR) {
+ dataType = Types.VARCHAR;
+ }
+ }
+ String dataTypeName = SQL3DataType.get(dataType).name();
+ ExportImportXml.addXmlAttribute(appendable, ExportImportXml.TYPE, dataTypeName);
+ } finally {
+ ExportImportXml.closePartialXmlNode(appendable);
+ }
+ }
+ }
+ } finally {
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItem.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItem.java
new file mode 100644
index 00000000000..c2a9792f426
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItem.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.export;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.branch.management.exchange.ExchangeDb;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.branch.management.internal.InternalBranchActivator;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationalExportItem extends AbstractDbExportItem {
+ private final String query;
+ private final StringBuffer binaryContentBuffer;
+ private final StringBuffer stringContentBuffer;
+ private final StringBuffer oseeCommentBuffer;
+ private final StringBuffer branchNameBuffer;
+ private final StringBuffer rationaleBuffer;
+ private final Set<IExportColumnListener> exportColumnListeners;
+
+ public RelationalExportItem(int priority, String name, String source, String query) {
+ super(priority, name, source.toLowerCase());
+ this.query = query;
+ this.binaryContentBuffer = new StringBuffer();
+ this.stringContentBuffer = new StringBuffer();
+ this.oseeCommentBuffer = new StringBuffer();
+ this.branchNameBuffer = new StringBuffer();
+ this.rationaleBuffer = new StringBuffer();
+ this.exportColumnListeners = java.util.Collections.synchronizedSet(new HashSet<IExportColumnListener>());
+ }
+
+ protected String exportBinaryDataTo(File tempFolder, String uriTarget) throws Exception {
+ tempFolder = new File(tempFolder + File.separator + ExportImportXml.RESOURCE_FOLDER_NAME);
+ if (tempFolder.exists() != true) {
+ tempFolder.mkdirs();
+ }
+
+ IResourceLocator locator = InternalBranchActivator.getResourceLocatorManager().getResourceLocator(uriTarget);
+ IResource resource = InternalBranchActivator.getResourceManager().acquire(locator, new Options());
+
+ File target = new File(tempFolder, locator.getRawPath());
+ if (target.getParentFile() != null) {
+ target.getParentFile().mkdirs();
+ }
+
+ InputStream sourceStream = null;
+ OutputStream outputStream = null;
+ try {
+ sourceStream = resource.getContent();
+ outputStream = new FileOutputStream(target);
+ Lib.inputStreamToOutputStream(sourceStream, outputStream);
+ } finally {
+ if (sourceStream != null) {
+ try {
+ sourceStream.close();
+ } catch (Exception ex) {
+ }
+ }
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (Exception ex) {
+ }
+ }
+ }
+ return locator.getRawPath().replace('/', '\\');
+ }
+
+ protected void doWork(Appendable appendable) throws Exception {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(getConnection());
+ try {
+ ObjectPair<String, Object[]> sqlData =
+ ExchangeDb.getQueryWithOptions(this.query, getJoinQueryId(), getOptions());
+ chStmt.runPreparedQuery(sqlData.object1, sqlData.object2);
+ while (chStmt.next()) {
+ processData(appendable, chStmt);
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ protected void processData(Appendable appendable, ConnectionHandlerStatement chStmt) throws Exception {
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.ENTRY);
+ try {
+ int numberOfColumns = chStmt.getColumnCount() + 1;
+ for (int columnIndex = 1; columnIndex < numberOfColumns; columnIndex++) {
+ String name = chStmt.getColumnName(columnIndex).toLowerCase();
+ notifyOnColumnExport(name, chStmt);
+ if (name.equals("uri")) {
+ handleBinaryContent(binaryContentBuffer, getWriteLocation(), chStmt.getString(name));
+ } else if (name.equals("value")) {
+ handleStringContent(stringContentBuffer, getWriteLocation(), chStmt.getString(name),
+ ExportImportXml.STRING_CONTENT);
+ } else if (name.equals(ExportImportXml.OSEE_COMMENT)) {
+ handleStringContent(oseeCommentBuffer, getWriteLocation(), chStmt.getString(name),
+ ExportImportXml.OSEE_COMMENT);
+ } else if (name.equals(ExportImportXml.BRANCH_NAME)) {
+ handleStringContent(branchNameBuffer, getWriteLocation(), chStmt.getString(name),
+ ExportImportXml.BRANCH_NAME);
+ } else if (name.equals(ExportImportXml.RATIONALE)) {
+ handleStringContent(rationaleBuffer, getWriteLocation(), chStmt.getString(name),
+ ExportImportXml.RATIONALE);
+ } else {
+ switch (chStmt.getColumnType(columnIndex)) {
+ case Types.TIMESTAMP:
+ Timestamp timestamp = chStmt.getTimestamp(name);
+ ExportImportXml.addXmlAttribute(appendable, name, timestamp);
+ break;
+ default:
+ try {
+ String value = chStmt.getString(name);
+ ExportImportXml.addXmlAttribute(appendable, name, value);
+ } catch (Exception ex) {
+ throw new Exception(String.format("Unable to convert [%s] of raw type [%s] to string.", name,
+ chStmt.getColumnTypeName(columnIndex)), ex);
+ }
+ break;
+ }
+ }
+ }
+ } finally {
+ if (binaryContentBuffer.length() > 0 || stringContentBuffer.length() > 0 || oseeCommentBuffer.length() > 0 || branchNameBuffer.length() > 0 || rationaleBuffer.length() > 0) {
+ ExportImportXml.endOpenedPartialXmlNode(appendable);
+ if (binaryContentBuffer.length() > 0) {
+ appendable.append(binaryContentBuffer.toString());
+ binaryContentBuffer.delete(0, binaryContentBuffer.length());
+ }
+ if (stringContentBuffer.length() > 0) {
+ appendable.append(stringContentBuffer.toString());
+ stringContentBuffer.delete(0, stringContentBuffer.length());
+ }
+ if (oseeCommentBuffer.length() > 0) {
+ appendable.append(oseeCommentBuffer.toString());
+ oseeCommentBuffer.delete(0, oseeCommentBuffer.length());
+ }
+ if (branchNameBuffer.length() > 0) {
+ appendable.append(branchNameBuffer.toString());
+ branchNameBuffer.delete(0, branchNameBuffer.length());
+ }
+ if (rationaleBuffer.length() > 0) {
+ appendable.append(rationaleBuffer.toString());
+ rationaleBuffer.delete(0, rationaleBuffer.length());
+ }
+ ExportImportXml.closeXmlNode(appendable, ExportImportXml.ENTRY);
+ } else {
+ ExportImportXml.closePartialXmlNode(appendable);
+ }
+ }
+ }
+
+ private void handleBinaryContent(Appendable appendable, File tempFolder, String uriData) throws Exception {
+ if (Strings.isValid(uriData)) {
+ uriData = exportBinaryDataTo(tempFolder, uriData);
+ ExportImportXml.openPartialXmlNode(appendable, ExportImportXml.BINARY_CONTENT);
+ ExportImportXml.addXmlAttribute(appendable, "location", uriData);
+ ExportImportXml.closePartialXmlNode(appendable);
+ }
+ }
+
+ private void handleStringContent(Appendable appendable, File tempFolder, String stringValue, String tag) throws Exception {
+ if (Strings.isValid(stringValue)) {
+ ExportImportXml.openXmlNodeNoNewline(appendable, tag);
+ Xml.writeAsCdata(appendable, stringValue);
+ ExportImportXml.closeXmlNode(appendable, tag);
+ }
+ }
+
+ public void addExportColumnListener(IExportColumnListener exportColumnListener) {
+ if (exportColumnListener != null) {
+ this.exportColumnListeners.add(exportColumnListener);
+ }
+ }
+
+ public void removeExportColumnListener(IExportColumnListener exportColumnListener) {
+ if (exportColumnListener != null) {
+ this.exportColumnListeners.remove(exportColumnListener);
+ }
+ }
+
+ public void cleanUp() {
+ this.exportColumnListeners.clear();
+ super.cleanUp();
+ }
+
+ private void notifyOnColumnExport(String columnName, ConnectionHandlerStatement chStmt) throws Exception {
+ for (IExportColumnListener listener : this.exportColumnListeners) {
+ listener.onColumnExport(columnName, chStmt);
+ }
+ }
+
+ public interface IExportColumnListener {
+ public abstract void onColumnExport(String columnName, ConnectionHandlerStatement chStmt) throws Exception;
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItemWithType.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItemWithType.java
new file mode 100644
index 00000000000..57953b5e123
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/export/RelationalExportItemWithType.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.framework.branch.management.exchange.export;
+
+import java.io.File;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationalExportItemWithType extends RelationalExportItem {
+
+ private final RelationalExportItem typeExportItem;
+ private final ColumnIdCollector typeCollector;
+
+ public RelationalExportItemWithType(int priority, String name, String source, String typeColumn, String regularQuery, String typeQuery) {
+ super(priority, name, source, regularQuery);
+ this.typeCollector = new ColumnIdCollector(typeColumn);
+ this.typeExportItem = new RelationalExportItem(priority * -1, name + ".type", getSource() + "_type", typeQuery);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.AbstractExportItem#setOptions(org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public void setOptions(Options options) {
+ super.setOptions(options);
+ this.typeExportItem.setOptions(options);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.AbstractExportItem#setWriteLocation(java.io.File)
+ */
+ @Override
+ public void setWriteLocation(File writeLocation) {
+ super.setWriteLocation(writeLocation);
+ this.typeExportItem.setWriteLocation(writeLocation);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.RelationalExportItem#cleanUp()
+ */
+ @Override
+ public void cleanUp() {
+ this.typeExportItem.cleanUp();
+ try {
+ this.typeCollector.cleanUp();
+ } catch (OseeDataStoreException ex) {
+ notifyOnExportException(ex);
+ }
+ super.cleanUp();
+ }
+
+ public AbstractExportItem getTypeItem() {
+ return typeExportItem;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.AbstractExportItem#run()
+ */
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.export.RelationalExportItem#doWork(java.io.Writer)
+ */
+ @Override
+ protected void doWork(Appendable appendable) throws Exception {
+ this.typeCollector.initialize();
+ this.addExportColumnListener(typeCollector);
+
+ super.doWork(appendable);
+
+ this.removeExportColumnListener(typeCollector);
+ this.typeCollector.store();
+ this.typeExportItem.setConnection(getConnection());
+ this.typeExportItem.setOptions(getOptions());
+ this.typeExportItem.setJoinQueryId(typeCollector.getQueryId());
+ this.typeExportItem.run();
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseDbSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseDbSaxHandler.java
new file mode 100644
index 00000000000..737398bf904
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseDbSaxHandler.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.framework.branch.management.exchange.handler;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.branch.management.exchange.TranslationManager;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseDbSaxHandler extends BaseExportImportSaxHandler {
+
+ private final List<Object[]> data;
+ private final int cacheLimit;
+ private final boolean isCacheAll;
+
+ private OseeConnection connection;
+ private MetaData metadata;
+ private TranslationManager translator;
+ private Options options;
+
+ protected BaseDbSaxHandler(boolean isCacheAll, int cacheLimit) {
+ super();
+ if (cacheLimit < 0) {
+ throw new IllegalArgumentException(String.format("Cache limit cannot be less than zero - cacheLimit=[%d]",
+ cacheLimit));
+ }
+ this.options = new Options();
+ this.translator = null;
+ this.metadata = null;
+ this.connection = null;
+ this.isCacheAll = isCacheAll;
+ this.cacheLimit = cacheLimit;
+ this.data = new ArrayList<Object[]>();
+ }
+
+ public void setOptions(Options options) {
+ if (options != null) {
+ this.options = options;
+ }
+ }
+
+ protected Options getOptions() {
+ return this.options;
+ }
+
+ public void setMetaData(MetaData metadata) {
+ this.metadata = metadata;
+ }
+
+ public void setConnection(OseeConnection connection) {
+ this.connection = connection;
+ }
+
+ public void setTranslator(TranslationManager translator) {
+ this.translator = translator;
+ }
+
+ protected OseeConnection getConnection() {
+ return this.connection;
+ }
+
+ protected MetaData getMetaData() {
+ return this.metadata;
+ }
+
+ protected TranslationManager getTranslator() {
+ return this.translator;
+ }
+
+ public boolean isStorageNeeded() {
+ return this.isCacheAll != true && this.data.size() > this.cacheLimit;
+ }
+
+ protected void addData(Object[] objects) {
+ this.data.add(objects);
+ }
+
+ protected void store(OseeConnection connection) throws OseeDataStoreException {
+ if (this.data.isEmpty() != true) {
+ ConnectionHandler.runBatchUpdate(connection, getMetaData().getQuery(), this.data);
+ this.data.clear();
+ }
+ }
+
+ public void clearDataTable() throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(connection, String.format("DELETE FROM %s", getMetaData().getTableName()));
+ }
+
+ public void reset() {
+ this.connection = null;
+ this.translator = null;
+ this.options = null;
+ this.metadata = null;
+ this.data.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseExportImportSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseExportImportSaxHandler.java
new file mode 100644
index 00000000000..0fd5f305ca7
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BaseExportImportSaxHandler.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.handler;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseExportImportSaxHandler extends AbstractSaxHandler {
+ protected final static String STRING_CONTENT = "stringContent";
+ protected final static String BINARY_CONTENT_LOCATION = "binaryContentLocation";
+
+ private final Map<String, String> dataMap;
+
+ protected BaseExportImportSaxHandler() {
+ super();
+ this.dataMap = new HashMap<String, String>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase(ExportImportXml.DATA)) {
+ handleData(attributes);
+ } else if (localName.equalsIgnoreCase(ExportImportXml.ENTRY)) {
+ handleEntry(attributes);
+ } else if (localName.equalsIgnoreCase(ExportImportXml.BINARY_CONTENT)) {
+ handleBinaryContent(attributes);
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase(ExportImportXml.STRING_CONTENT)) {
+ finishStringContent(ExportImportXml.STRING_CONTENT);
+ } else if (localName.equalsIgnoreCase(ExportImportXml.OSEE_COMMENT)) {
+ finishStringContent(ExportImportXml.OSEE_COMMENT);
+ } else if (localName.equalsIgnoreCase(ExportImportXml.BRANCH_NAME)) {
+ finishStringContent(ExportImportXml.BRANCH_NAME);
+ } else if (localName.equalsIgnoreCase(ExportImportXml.RATIONALE)) {
+ finishStringContent(ExportImportXml.RATIONALE);
+ } else if (localName.equalsIgnoreCase(ExportImportXml.ENTRY)) {
+ finishEntry();
+ } else if (localName.equalsIgnoreCase(ExportImportXml.DATA)) {
+ finishData();
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ private void handleData(Attributes attributes) {
+ // Do Nothing
+ }
+
+ protected void finishData() {
+ }
+
+ private void handleEntry(Attributes attributes) {
+ this.dataMap.clear();
+ int attributeCount = attributes.getLength();
+ for (int index = 0; index < attributeCount; index++) {
+ String columnName = attributes.getLocalName(index);
+ String value = attributes.getValue(index);
+ if (Strings.isValid(value) && !value.equals("null")) {
+ this.dataMap.put(columnName, value);
+ }
+ }
+ }
+
+ private void handleBinaryContent(Attributes attributes) {
+ this.dataMap.put(BINARY_CONTENT_LOCATION, attributes.getValue("location"));
+ }
+
+ private void finishEntry() {
+ if (this.dataMap.isEmpty() != true) {
+ try {
+ processData(this.dataMap);
+ } catch (Exception ex) {
+ throw new IllegalStateException("Processing data - ", ex);
+ }
+ }
+ this.dataMap.clear();
+ }
+
+ private void finishStringContent(String name) {
+ this.dataMap.put(name, getContents());
+ }
+
+ protected abstract void processData(Map<String, String> dataMap) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchData.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchData.java
new file mode 100644
index 00000000000..b405836222a
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchData.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.handler;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class BranchData implements Cloneable {
+ public static final String BRANCH_NAME = "branch_name";
+ public static final String BRANCH_ID = "branch_id";
+ private static final String BRANCH_TYPE = "branch_type";
+ public static final String COMMIT_ART_ID = "associated_art_id";
+ private static final String IS_ARCHIVED_BRANCH = "archived";
+ public static final String PARENT_BRANCH_ID = "parent_branch_id";
+ public static final String PARENT_TRANSACTION_ID = "parent_transaction_id";
+
+ private final Map<String, Object> backingData;
+
+ BranchData() {
+ this.backingData = new HashMap<String, Object>();
+ }
+
+ void setData(String key, Object object) {
+ this.backingData.put(key, object);
+ }
+
+ public String getBranchName() {
+ return (String) backingData.get(BRANCH_NAME);
+ }
+
+ public Integer getBranchType() {
+ return (Integer) backingData.get(BRANCH_TYPE);
+ }
+
+ public int getAssociatedArtId() {
+ return (Integer) backingData.get(COMMIT_ART_ID);
+ }
+
+ public int getIsArchived() {
+ return (Integer) backingData.get(IS_ARCHIVED_BRANCH);
+ }
+
+ public int getBranchId() {
+ return (Integer) backingData.get(BRANCH_ID);
+ }
+
+ public int getParentBranchId() {
+ return (Integer) backingData.get(PARENT_BRANCH_ID);
+ }
+
+ public int getParentTransactionId() {
+ return (Integer) backingData.get(PARENT_TRANSACTION_ID);
+ }
+
+ public Object[] toArray(MetaData metadata) {
+ return DataToSql.toDataArray(metadata, backingData);
+ }
+
+ public BranchData clone() {
+ BranchData clone = new BranchData();
+ for (String key : this.backingData.keySet()) {
+ clone.setData(key, this.backingData.get(key));
+ }
+ return clone;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public String toString() {
+ return String.format("(name[%s] id[%s])", getBranchName(), getBranchId());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof BranchData)) return false;
+ BranchData other = (BranchData) obj;
+ boolean keysMatch = Collections.setComplement(this.backingData.keySet(), other.backingData.keySet()).isEmpty();
+ if (!keysMatch) return false;
+ boolean valuesMatch = true;
+ for (String key : this.backingData.keySet()) {
+ Object obj1 = this.backingData.get(key);
+ Object obj2 = other.backingData.get(key);
+ if (obj1 == null && obj2 != null || obj1 != null && obj2 == null || (obj1 != null && obj2 != null && !obj1.equals(obj2))) {
+ valuesMatch = false;
+ break;
+ }
+ }
+ return valuesMatch;
+ }
+
+ public void setBranchId(int nextSeqVal) {
+ this.backingData.put(BRANCH_ID, nextSeqVal);
+ }
+
+ public void setParentBranchId(int nextSeqVal) {
+ this.backingData.put(PARENT_BRANCH_ID, nextSeqVal);
+ }
+
+ public void setParentTransactionId(int nextSeqVal) {
+ this.backingData.put(PARENT_TRANSACTION_ID, nextSeqVal);
+ }
+
+ public void setAssociatedBranchId(int nextSeqVal) {
+ this.backingData.put(COMMIT_ART_ID, nextSeqVal);
+ }
+
+ public void setBranchType(BranchType branchType) {
+ this.backingData.put(BRANCH_TYPE, branchType.ordinal());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDataSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDataSaxHandler.java
new file mode 100644
index 00000000000..44096d0a0e3
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDataSaxHandler.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.handler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.branch.management.ImportOptions;
+import org.eclipse.osee.framework.branch.management.exchange.ExchangeDb;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchDataSaxHandler extends BaseDbSaxHandler {
+
+ private final Map<Integer, BranchData> idToImportFileBranchData;
+
+ public static BranchDataSaxHandler createWithCacheAll() {
+ return new BranchDataSaxHandler(true, 0);
+ }
+
+ public static BranchDataSaxHandler newLimitedCacheBranchDataSaxHandler(int cacheLimit) {
+ return new BranchDataSaxHandler(false, cacheLimit);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseExportImportSaxHandler#processData(java.util.Map)
+ */
+ private BranchDataSaxHandler(boolean isCacheAll, int cacheLimit) {
+ super(isCacheAll, cacheLimit);
+ this.idToImportFileBranchData = new HashMap<Integer, BranchData>();
+ }
+
+ @Override
+ protected void processData(Map<String, String> dataMap) throws Exception {
+ BranchData branchData = new BranchData();
+ for (String columnName : getMetaData().getColumnNames()) {
+ String value = dataMap.get(columnName);
+ branchData.setData(columnName, toObject(columnName, value));
+ }
+ this.idToImportFileBranchData.put(branchData.getBranchId(), branchData);
+ }
+
+ private Object toObject(String key, String value) {
+ Object toReturn = null;
+ if (Strings.isValid(value)) {
+ Class<?> clazz = getMetaData().toClass(key);
+ toReturn = DataToSql.stringToObject(clazz, key, value);
+ } else {
+ toReturn = getMetaData().toDataType(key);
+ }
+ return toReturn;
+ }
+
+ public boolean areAvailable(int... branchIds) {
+ boolean toReturn = false;
+ if (branchIds != null && branchIds.length > 0) {
+ Set<Integer> toCheck = new HashSet<Integer>();
+ for (int entry : branchIds) {
+ toCheck.add(entry);
+ }
+ toReturn = this.idToImportFileBranchData.keySet().containsAll(toCheck);
+ }
+ return toReturn;
+ }
+
+ public Collection<BranchData> getAllBranchDataFromImportFile() {
+ return this.idToImportFileBranchData.values();
+ }
+
+ private List<BranchData> getSelectedBranchesToImport(int... branchesToImport) {
+ List<BranchData> toReturn = new ArrayList<BranchData>();
+ if (branchesToImport != null && branchesToImport.length > 0) {
+ for (int branchId : branchesToImport) {
+ BranchData data = this.idToImportFileBranchData.get(branchId);
+ if (data != null) {
+ toReturn.add(data);
+ }
+ }
+ } else {
+ toReturn.addAll(this.idToImportFileBranchData.values());
+ }
+ return toReturn;
+ }
+
+ private void checkSelectedBranches(int... branchesToImport) throws OseeDataStoreException {
+ if (branchesToImport != null && branchesToImport.length > 0) {
+ if (!areAvailable(branchesToImport)) {
+ throw new OseeDataStoreException(String.format(
+ "Branches not found in import file:\n\t\t- selected to import: [%s]\n\t\t- in import file: [%s]",
+ branchesToImport, getAllBranchDataFromImportFile()));
+ }
+ }
+ }
+
+ public int[] store(boolean writeToDb, int... branchesToImport) throws OseeDataStoreException {
+ checkSelectedBranches(branchesToImport);
+ Collection<BranchData> branchesToStore = getSelectedBranchesToImport(branchesToImport);
+ branchesToStore = checkTargetDbBranches(branchesToStore);
+ int[] toReturn = new int[branchesToStore.size()];
+ int index = 0;
+ for (BranchData branchData : branchesToStore) {
+ toReturn[index] = branchData.getBranchId();
+ if (getOptions().getBoolean(ImportOptions.ALL_AS_ROOT_BRANCHES.name())) {
+ branchData.setParentBranchId(1);
+ branchData.setBranchType(BranchType.TOP_LEVEL);
+ } else {
+ branchData.setParentBranchId(translateId(BranchData.PARENT_BRANCH_ID, branchData.getParentBranchId()));
+ }
+ branchData.setBranchId(translateId(BranchData.BRANCH_ID, branchData.getBranchId()));
+ branchData.setAssociatedBranchId(translateId(BranchData.COMMIT_ART_ID, branchData.getAssociatedArtId()));
+
+ Object[] data = branchData.toArray(getMetaData());
+ if (data != null) {
+ addData(data);
+ }
+ index++;
+ }
+ if (writeToDb) {
+ super.store(getConnection());
+ }
+ return toReturn;
+ }
+
+ public void updateParentTransactionId(int[] branchesStored) throws OseeDataStoreException {
+ List<BranchData> branches = getSelectedBranchesToImport(branchesStored);
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (BranchData branchData : branches) {
+ int branchId = branchData.getBranchId();
+ int parentTransactionId = translateId(ExchangeDb.TRANSACTION_ID, branchData.getParentTransactionId());
+ if (parentTransactionId == 0) {
+ parentTransactionId = 1;
+ }
+ data.add(new Object[] {parentTransactionId, branchId});
+ }
+ String query = "update osee_branch set parent_transaction_id = ? where branch_id = ?";
+ ConnectionHandler.runBatchUpdate(query, data);
+ }
+
+ private int translateId(String id, int originalValue) throws OseeDataStoreException {
+ Long original = new Long(originalValue);
+ Long newValue = (Long) getTranslator().translate(id, original);
+ return newValue.intValue();
+ }
+
+ private Collection<BranchData> checkTargetDbBranches(Collection<BranchData> selectedBranches) throws OseeDataStoreException {
+ Map<String, BranchData> nameToImportFileBranchData = new HashMap<String, BranchData>();
+ for (BranchData data : selectedBranches) {
+ nameToImportFileBranchData.put(data.getBranchName(), data);
+ }
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(getConnection());
+ try {
+ chStmt.runPreparedQuery("select * from osee_branch");
+ while (chStmt.next()) {
+ String name = chStmt.getString(BranchData.BRANCH_NAME);
+ Long branchId = chStmt.getLong(BranchData.BRANCH_ID);
+ BranchData branchData = nameToImportFileBranchData.get(name);
+ if (branchData != null) {
+ getTranslator().checkIdMapping("branch_id", (long) branchData.getBranchId(), branchId);
+ // Remove from to store list so we don't store duplicate information
+ nameToImportFileBranchData.remove(name);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ return nameToImportFileBranchData.values();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseDbSaxHandler#clearDataTable()
+ */
+ @Override
+ public void clearDataTable() throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(getConnection(),
+ String.format("DELETE FROM %s where NOT branch_type = " + BranchType.SYSTEM_ROOT.getValue(),
+ getMetaData().getTableName()));
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDefinitionsSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDefinitionsSaxHandler.java
new file mode 100644
index 00000000000..22a35fda9bf
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/BranchDefinitionsSaxHandler.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.framework.branch.management.exchange.handler;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchDefinitionsSaxHandler extends BaseDbSaxHandler {
+
+ private final Set<Integer> allowedBranches;
+
+ public static BranchDefinitionsSaxHandler createWithCacheAll() {
+ return new BranchDefinitionsSaxHandler(true, 0);
+ }
+
+ public static BranchDefinitionsSaxHandler newLimitedCacheBranchDataSaxHandler(int cacheLimit) {
+ return new BranchDefinitionsSaxHandler(false, cacheLimit);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseExportImportSaxHandler#processData(java.util.Map)
+ */
+ private BranchDefinitionsSaxHandler(boolean isCacheAll, int cacheLimit) {
+ super(isCacheAll, cacheLimit);
+ this.allowedBranches = new HashSet<Integer>();
+ }
+
+ public void setStoredBranches(int... branchIds) {
+ if (branchIds != null) {
+ for (int entry : branchIds) {
+ this.allowedBranches.add(entry);
+ }
+ }
+ }
+
+ @Override
+ protected void processData(Map<String, String> dataMap) throws OseeDataStoreException {
+ Integer branchId = new Integer(dataMap.get("mapped_branch_id"));
+ if (allowedBranches.contains(branchId)) {
+ Object[] objectData = DataToSql.toDataArray(getConnection(), getMetaData(), getTranslator(), dataMap);
+ if (objectData != null) {
+ addData(objectData);
+ if (isStorageNeeded()) {
+ store(getConnection());
+ }
+ }
+ }
+ }
+
+ public void store() throws OseeDataStoreException {
+ super.store(this.getConnection());
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/DataToSql.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/DataToSql.java
new file mode 100644
index 00000000000..109f1a0ca2a
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/DataToSql.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.framework.branch.management.exchange.handler;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+import org.eclipse.osee.framework.branch.management.exchange.TranslationManager;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataToSql {
+
+ private DataToSql() {
+ }
+
+ public static Object[] toDataArray(MetaData metadata, Map<String, Object> dataMap) {
+ int notNullCount = 0;
+ Object[] data = new Object[metadata.getColumnSize()];
+ int index = 0;
+ for (String columnName : metadata.getColumnNames()) {
+ Object dataValue = dataMap.get(columnName);
+ if (dataValue != null) {
+ data[index] = dataValue;
+ notNullCount++;
+ } else {
+ data[index] = metadata.toDataType(columnName);
+ }
+ index++;
+ }
+ return notNullCount > 0 ? data : null;
+ }
+
+ public static Object[] toDataArray(OseeConnection connection, MetaData metadata, TranslationManager translator, Map<String, String> fieldMap) throws OseeDataStoreException {
+ int notNullCount = 0;
+ Object[] data = new Object[metadata.getColumnSize()];
+ int index = 0;
+ for (String columnName : metadata.getColumnNames()) {
+ String dataValue = fieldMap.get(columnName);
+ if (Strings.isValid(dataValue)) {
+ Class<?> clazz = metadata.toClass(columnName);
+ Object object = stringToObject(clazz, columnName, dataValue);
+ if (object != null && translator.isTranslatable(columnName)) {
+ object = translator.translate(columnName, object);
+ }
+ if (object != null) {
+ data[index] = object;
+ notNullCount++;
+ } else {
+ data[index] = metadata.toDataType(columnName);
+ }
+ } else {
+ data[index] = metadata.toDataType(columnName);
+ }
+ index++;
+ }
+ return notNullCount > 0 ? data : null;
+ }
+
+ public static Object stringToObject(Class<?> clazz, String columnName, String value) {
+ Object convertedObject = null;
+ if (clazz != null) {
+ try {
+ Method mainMethod = clazz.getMethod("valueOf", new Class[] {String.class});
+ convertedObject = mainMethod.invoke(null, value);
+ } catch (Exception ex) {
+ try {
+ Method mainMethod = clazz.getMethod("valueOf", new Class[] {Object.class});
+ convertedObject = mainMethod.invoke(null, value);
+ } catch (Exception ex1) {
+ throw new IllegalStateException(String.format(
+ "Unable to convert from string to object for - attribute [%s] to class [%s]", columnName,
+ clazz.getName()));
+ }
+ }
+ } else {
+ convertedObject = value;
+ }
+ return convertedObject;
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/ManifestSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/ManifestSaxHandler.java
new file mode 100644
index 00000000000..442a11a5620
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/ManifestSaxHandler.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.handler;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ManifestSaxHandler extends BaseExportImportSaxHandler {
+
+ private final List<ImportFile> filesToImport;
+ private final List<ImportFile> typesToCheck;
+ private String metadataFile;
+ private ImportFile branchFile;
+ private ImportFile branchDefinitionsFile;
+ private String sourceDatabaseId;
+ private Date sourceExportDate;
+
+ public ManifestSaxHandler() {
+ super();
+ this.filesToImport = new ArrayList<ImportFile>();
+ this.typesToCheck = new ArrayList<ImportFile>();
+ this.metadataFile = null;
+ this.branchFile = null;
+ this.branchDefinitionsFile = null;
+ this.sourceExportDate = null;
+ this.sourceDatabaseId = "UNKNOWN";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseExportImportSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase(ExportImportXml.EXPORT_ENTRY)) {
+ sourceDatabaseId = attributes.getValue(ExportImportXml.DATABASE_ID);
+ sourceExportDate = new Date(Long.parseLong(attributes.getValue(ExportImportXml.EXPORT_DATE)));
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ super.startElementFound(uri, localName, name, attributes);
+
+ }
+
+ @Override
+ protected void processData(Map<String, String> fieldMap) {
+ String fileName = fieldMap.get(ExportImportXml.ID);
+ Integer priority = new Integer(fieldMap.get(ExportImportXml.PRIORITY));
+ String source = fieldMap.get(ExportImportXml.SOURCE);
+
+ if (Strings.isValid(fileName) && Strings.isValid(source) && priority != null) {
+ if (source.equals(ExportImportXml.DB_SCHEMA)) {
+ this.metadataFile = fileName;
+ } else {
+ if (priority > 0) {
+ ImportFile importFile = new ImportFile(fileName, source, priority);
+ if (source.equals(SkynetDatabase.BRANCH_TABLE.toString().toLowerCase())) {
+ branchFile = importFile;
+ } else if (source.equals(SkynetDatabase.BRANCH_DEFINITIONS.toString().toLowerCase())) {
+ branchDefinitionsFile = importFile;
+ } else {
+ filesToImport.add(importFile);
+ }
+ } else {
+ typesToCheck.add(new ImportFile(fileName, source, priority));
+ }
+
+ }
+ }
+ }
+
+ public ImportFile getBranchFile() {
+ return branchFile;
+ }
+
+ public ImportFile getBranchDefinitionsFile() {
+ return branchDefinitionsFile;
+ }
+
+ public String getMetadataFile() {
+ return Strings.isValid(metadataFile) ? metadataFile : "";
+ }
+
+ public String getSourceDatabaseId() {
+ return sourceDatabaseId;
+ }
+
+ public Date getSourceExportDate() {
+ return sourceExportDate;
+ }
+
+ public List<ImportFile> getImportFiles() {
+ Collections.sort(filesToImport);
+ return filesToImport;
+ }
+
+ public List<ImportFile> getTypeFiles() {
+ Collections.sort(typesToCheck);
+ return typesToCheck;
+ }
+
+ public class ImportFile implements Comparable<ImportFile> {
+ private String fileName;
+ private String source;
+ private Integer priority;
+
+ public ImportFile(String fileName, String source, Integer priority) {
+ this.fileName = fileName;
+ this.source = source;
+ this.priority = priority;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public Integer getPriority() {
+ return priority;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof ImportFile)) return false;
+ ImportFile other = (ImportFile) obj;
+ return this.priority == other.priority && this.fileName.equals(other.fileName);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (int) (37 * priority);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ @Override
+ public int compareTo(ImportFile other) {
+ return this.priority.compareTo(other.priority);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaData.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaData.java
new file mode 100644
index 00000000000..fe27236965d
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaData.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.framework.branch.management.exchange.handler;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MetaData {
+ private final Map<String, SQL3DataType> dataConversionMap;
+ private final String tableTarget;
+ private String query;
+
+ MetaData(String tableName) {
+ this.dataConversionMap = new LinkedHashMap<String, SQL3DataType>();
+ this.tableTarget = tableName;
+ this.query = null;
+ }
+
+ private String buildQuery() {
+ String toReturn = null;
+ Collection<String> columnNames = getColumnNames();
+ if (columnNames.isEmpty() != true) {
+ String columns = columnNames.toString();
+ columns = columns.substring(1, columns.length() - 1);
+ StringBuffer params = new StringBuffer();
+ for (int index = 0; index < columnNames.size(); index++) {
+ params.append("?");
+ if (index + 1 < columnNames.size()) {
+ params.append(", ");
+ }
+ }
+ toReturn = String.format("INSERT INTO %s (%s) VALUES (%s)", tableTarget, columns, params);
+ }
+ return toReturn;
+ }
+
+ void addColumn(String columnName, SQL3DataType sql3DataType) {
+ this.dataConversionMap.put(columnName, sql3DataType);
+ }
+
+ public int getColumnSize() {
+ return dataConversionMap.size();
+ }
+
+ public String getTableName() {
+ return tableTarget;
+ }
+
+ public Collection<String> getColumnNames() {
+ return this.dataConversionMap.keySet();
+ }
+
+ public String getQuery() {
+ if (query == null) {
+ query = buildQuery();
+ }
+ return query;
+ }
+
+ public SQL3DataType toDataType(String fieldName) {
+ return this.dataConversionMap.get(fieldName);
+ }
+
+ public Class<?> toClass(String fieldName) {
+ SQL3DataType dataType = this.dataConversionMap.get(fieldName);
+ return dataType != null ? dataType.getJavaEquivalentClass() : null;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getTableName();
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaDataSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaDataSaxHandler.java
new file mode 100644
index 00000000000..5c17b27eba5
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/MetaDataSaxHandler.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.framework.branch.management.exchange.handler;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MetaDataSaxHandler extends AbstractSaxHandler {
+
+ private final Map<String, MetaData> importMetadataMap;
+ private final Map<String, MetaData> targetMetadataMap;
+ private MetaData currentMetadata;
+
+ public MetaDataSaxHandler() {
+ this.importMetadataMap = new HashMap<String, MetaData>();
+ this.targetMetadataMap = new HashMap<String, MetaData>();
+ }
+
+ public MetaData getMetadata(String source) {
+ return targetMetadataMap.get(source);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase(ExportImportXml.METADATA)) {
+ this.importMetadataMap.clear();
+ } else if (localName.equalsIgnoreCase(ExportImportXml.TABLE)) {
+ String tableName = attributes.getValue(ExportImportXml.TABLE_NAME);
+ if (Strings.isValid(tableName)) {
+ this.currentMetadata = new MetaData(tableName);
+ this.importMetadataMap.put(tableName, currentMetadata);
+ } else {
+ this.currentMetadata = null;
+ }
+ } else if (localName.equalsIgnoreCase(ExportImportXml.COLUMN)) {
+ String columnName = attributes.getValue(ExportImportXml.ID);
+ String typeName = attributes.getValue(ExportImportXml.TYPE);
+ SQL3DataType sql3DataType = SQL3DataType.valueOf(typeName);
+ this.currentMetadata.addColumn(columnName, sql3DataType);
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase(ExportImportXml.TABLE)) {
+ this.currentMetadata = null;
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ public void checkAndLoadTargetDbMetadata() throws OseeCoreException, SQLException {
+ Map<String, MetaData> targetTables = getTargetDbMetadata();
+
+ StringBuffer errorMessage = new StringBuffer();
+ for (String tableName : targetTables.keySet()) {
+ MetaData sourceMeta = this.importMetadataMap.get(tableName);
+ MetaData destinationMeta = targetTables.get(tableName);
+ Collection<String> sourceColumns = sourceMeta.getColumnNames();
+ for (String destinationColumn : destinationMeta.getColumnNames()) {
+ if (!sourceColumns.contains(destinationColumn)) {
+ errorMessage.append(String.format(
+ "Target column not found in source database.\nTable:[%s] - [%s not in (%s)]\n", tableName,
+ destinationColumn, sourceColumns));
+ }
+ }
+ }
+ if (errorMessage.length() > 0) {
+ throw new OseeCoreException(errorMessage.toString());
+ }
+ this.targetMetadataMap.putAll(targetTables);
+ }
+
+ private Map<String, MetaData> getTargetDbMetadata() throws SQLException, OseeDataStoreException {
+ Map<String, MetaData> targetDbMetadata = new HashMap<String, MetaData>();
+ DatabaseMetaData dbMetaData = ConnectionHandler.getMetaData();
+ for (String sourceTables : importMetadataMap.keySet()) {
+ processMetaData(targetDbMetadata, dbMetaData, sourceTables);
+ }
+ return targetDbMetadata;
+ }
+
+ private void processMetaData(Map<String, MetaData> targetDbMetadata, DatabaseMetaData dbMetaData, String targetTable) throws SQLException, OseeDataStoreException {
+ ResultSet resultSet = null;
+ try {
+ resultSet = dbMetaData.getTables(null, null, null, new String[] {"TABLE"});
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ String tableName = resultSet.getString("TABLE_NAME");
+ String schemaName = resultSet.getString("TABLE_SCHEM");
+ if (targetTable.equalsIgnoreCase(tableName)) {
+ String name = tableName.toLowerCase();
+ MetaData currentMetadata = new MetaData(name);
+ targetDbMetadata.put(name, currentMetadata);
+ processColumnMetaData(currentMetadata, dbMetaData, schemaName, tableName);
+ }
+ }
+ }
+ } finally {
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ }
+ }
+
+ private void processColumnMetaData(MetaData currentMetadata, DatabaseMetaData dbMetaData, String schema, String tableName) throws SQLException, OseeDataStoreException {
+ ResultSet resultSet = null;
+ try {
+ try {
+ resultSet = dbMetaData.getColumns(null, schema, tableName, null);
+ } catch (SQLException ex) {
+ resultSet = dbMetaData.getColumns(null, null, tableName, null);
+ }
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ String columnId = resultSet.getString("COLUMN_NAME").toLowerCase();
+ int dataType = resultSet.getInt("DATA_TYPE");
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.foxpro)) {
+ if (dataType == Types.CHAR) {
+ dataType = Types.VARCHAR;
+ }
+ }
+ currentMetadata.addColumn(columnId, SQL3DataType.get(dataType));
+ }
+ }
+ } finally {
+ if (resultSet != null) {
+ resultSet.close();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalSaxHandler.java
new file mode 100644
index 00000000000..d68bca60526
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalSaxHandler.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.handler;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.branch.management.exchange.ExchangeDb;
+import org.eclipse.osee.framework.branch.management.exchange.ExportImportXml;
+import org.eclipse.osee.framework.branch.management.exchange.resource.ZipBinaryResource;
+import org.eclipse.osee.framework.branch.management.internal.InternalBranchActivator;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+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.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.Options;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationalSaxHandler extends BaseDbSaxHandler {
+
+ public static RelationalSaxHandler createWithCacheAll() {
+ return new RelationalSaxHandler(true, 0);
+ }
+
+ public static RelationalSaxHandler createWithLimitedCache(int cacheLimit) {
+ return new RelationalSaxHandler(false, cacheLimit);
+ }
+
+ private final List<IResourceLocator> transferredBinaryContent;
+ private final Set<Integer> branchesToImport;
+ private File decompressedFolder;
+
+ protected RelationalSaxHandler(boolean isCacheAll, int cacheLimit) {
+ super(isCacheAll, cacheLimit);
+ this.branchesToImport = new HashSet<Integer>();
+ this.decompressedFolder = null;
+ this.transferredBinaryContent = new ArrayList<IResourceLocator>();
+ }
+
+ public void setSelectedBranchIds(int... branchIds) {
+ if (branchIds != null && branchIds.length > 0) {
+ this.branchesToImport.clear();
+ for (int branchId : branchIds) {
+ this.branchesToImport.add(branchId);
+ }
+ }
+ }
+
+ public void setDecompressedFolder(File decompressedFolder) {
+ this.decompressedFolder = decompressedFolder;
+ }
+
+ public File getDecompressedFolder() {
+ return decompressedFolder;
+ }
+
+ public void store() throws OseeDataStoreException {
+ super.store(this.getConnection());
+ }
+
+ private String importBinaryContent(String uriValue, String gammaId) throws Exception {
+ String relativePath = Lib.isWindows() ? uriValue : uriValue.replaceAll("\\\\", File.separator);
+ String entrySearch = ExportImportXml.RESOURCE_FOLDER_NAME + File.separator + relativePath;
+ if (this.decompressedFolder != null) {
+ File entry = new File(decompressedFolder, entrySearch);
+ if (entry.exists()) {
+
+ String name = uriValue.substring(uriValue.lastIndexOf('\\') + 1, uriValue.length());
+ IResourceLocator locatorHint =
+ InternalBranchActivator.getResourceLocatorManager().generateResourceLocator("attr", gammaId, name);
+
+ IResourceLocator locator =
+ InternalBranchActivator.getResourceManager().save(locatorHint,
+ new ZipBinaryResource(entry, locatorHint), new Options());
+ transferredBinaryContent.add(locator);
+ return locator.getLocation().toASCIIString();
+ } else {
+ throw new RuntimeException(String.format(
+ "Unable to locate resource in zip file - ZipEntry was null for [%s]", uriValue));
+ }
+ } else {
+ throw new RuntimeException("Uncompressed folder was Null.");
+ }
+ }
+
+ @Override
+ protected void processData(Map<String, String> fieldMap) throws Exception {
+ boolean process = true;
+ try {
+ if (!branchesToImport.isEmpty()) {
+ String branchIdString = fieldMap.get(ExportImportXml.PART_OF_BRANCH);
+ if (Strings.isValid(branchIdString)) {
+ if (!branchesToImport.contains(new Integer(branchIdString))) {
+ process = false;
+ }
+ }
+ }
+
+ if (process) {
+ String uriValue = fieldMap.get(BINARY_CONTENT_LOCATION);
+ if (Strings.isValid(uriValue)) {
+ String gammaId = fieldMap.get(ExchangeDb.GAMMA_ID);
+ Object translated = getTranslator().translate(ExchangeDb.GAMMA_ID, Long.valueOf(gammaId));
+ uriValue = importBinaryContent(uriValue, translated.toString());
+ fieldMap.put("uri", uriValue);
+ }
+ String stringValue = fieldMap.get(STRING_CONTENT);
+ if (Strings.isValid(stringValue)) {
+ fieldMap.put("value", stringValue);
+ }
+
+ String conflictId = fieldMap.get(ExchangeDb.CONFLICT_ID);
+ String conflictType = fieldMap.get(ExchangeDb.CONFLICT_TYPE);
+ if (Strings.isValid(conflictId) && Strings.isValid(conflictType)) {
+ int conflictOrdinal = Integer.valueOf(conflictType);
+ for (ConflictType type : ConflictType.values()) {
+ if (type.getValue() == conflictOrdinal) {
+ Object value = Integer.valueOf(conflictId);
+ switch (type) {
+ case ARTIFACT:
+ value = getTranslator().translate(ExchangeDb.ARTIFACT_ID, value);
+ break;
+ case ATTRIBUTE:
+ value = getTranslator().translate(ExchangeDb.ATTRIBUTE_ID, value);
+ break;
+ case RELATION:
+ value = getTranslator().translate(ExchangeDb.RELATION_ID, value);
+ break;
+ default:
+ break;
+ }
+ fieldMap.put(ExchangeDb.CONFLICT_ID, value.toString());
+ break;
+ }
+ }
+ }
+ Object[] objectData = DataToSql.toDataArray(getConnection(), getMetaData(), getTranslator(), fieldMap);
+ if (objectData != null) {
+ addData(objectData);
+ if (isStorageNeeded()) {
+ store();
+ }
+ }
+ }
+ } catch (Exception ex) {
+ cleanUpBinaryContent();
+ throw new Exception(String.format("Error processing in [%s]", getMetaData().getTableName()), ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseDbSaxHandler#reset()
+ */
+ @Override
+ public void reset() {
+ transferredBinaryContent.clear();
+ super.reset();
+ }
+
+ private void cleanUpBinaryContent() {
+ StringBuilder errorMessage = new StringBuilder();
+ IResourceManager manager = InternalBranchActivator.getResourceManager();
+ for (IResourceLocator locator : transferredBinaryContent) {
+ try {
+ manager.delete(locator);
+ } catch (Exception ex) {
+ errorMessage.append(String.format("Error deleting [%s]\n", locator.getLocation().toASCIIString()));
+
+ }
+ }
+ if (errorMessage.length() > 0) {
+ OseeLog.log(
+ this.getClass(),
+ Level.SEVERE,
+ "Error deleting binary data after transfer error. Please delete all content manually. " + errorMessage.toString());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.branch.management.exchange.handler.BaseDbSaxHandler#clearDataTable()
+ */
+ @Override
+ public void clearDataTable() throws OseeDataStoreException {
+ if (!getMetaData().getTableName().equals(SkynetDatabase.TRANSACTION_DETAIL_TABLE.toString().toLowerCase())) {
+ super.clearDataTable();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalTypeCheckSaxHandler.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalTypeCheckSaxHandler.java
new file mode 100644
index 00000000000..01b5206c46a
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/handler/RelationalTypeCheckSaxHandler.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.framework.branch.management.exchange.handler;
+
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationalTypeCheckSaxHandler extends RelationalSaxHandler {
+
+ public static RelationalTypeCheckSaxHandler createWithCacheAll() {
+ return new RelationalTypeCheckSaxHandler(true, 0);
+ }
+
+ public static RelationalTypeCheckSaxHandler createWithLimitedCache(int cacheLimit) {
+ return new RelationalTypeCheckSaxHandler(false, cacheLimit);
+ }
+
+ private final StringBuffer errorCheck;
+
+ private RelationalTypeCheckSaxHandler(boolean isCacheAll, int cacheLimit) {
+ super(isCacheAll, cacheLimit);
+ this.errorCheck = new StringBuffer();
+ }
+
+ @Override
+ protected void processData(Map<String, String> fieldMap) throws Exception {
+ String typeField = "art_type_id";
+ String nameField = "name";
+ String name = fieldMap.get(nameField);
+ String typeId = fieldMap.get(typeField);
+ if (Strings.isValid(name)) {
+ if (!Strings.isValid(typeId)) {
+ typeField = "attr_type_id";
+ }
+ } else {
+ typeField = "rel_link_type_id";
+ nameField = "type_name";
+ }
+ name = fieldMap.get(nameField);
+ typeId = fieldMap.get(typeField);
+ Long original = Strings.isValid(typeId) ? new Long(typeId) : -1;
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(getConnection());
+ try {
+ chStmt.runPreparedQuery(String.format("select %s from %s where %s = ?", typeField,
+ getMetaData().getTableName(), nameField), name);
+ if (chStmt.next()) {
+ getTranslator().checkIdMapping(typeField, original, chStmt.getLong(chStmt.getColumnName(1)));
+ } else {
+ this.errorCheck.append(String.format("Type not found in target db. type:[%s] - [%s (%s)]\n", name,
+ typeField, typeId));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ protected void finishData() {
+ if (this.errorCheck.length() > 0) {
+ throw new IllegalStateException(this.errorCheck.toString());
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeLocatorProvider.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeLocatorProvider.java
new file mode 100644
index 00000000000..48b400688e4
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeLocatorProvider.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.framework.branch.management.exchange.resource;
+
+import java.net.URI;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorProvider;
+import org.eclipse.osee.framework.resource.management.ResourceLocator;
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExchangeLocatorProvider implements IResourceLocatorProvider {
+ public static final String PROTOCOL = "exchange";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorProvider#generateResourceLocator(java.lang.String, java.lang.String)
+ */
+ @Override
+ public IResourceLocator generateResourceLocator(String seed, String name) throws MalformedLocatorException {
+ URI uri = null;
+ try {
+ uri = new URI(generatePath(name));
+ } catch (Exception ex) {
+ throw new MalformedLocatorException(ex);
+ }
+ return new ResourceLocator(uri);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorProvider#getResourceLocator(java.lang.String)
+ */
+ @Override
+ public IResourceLocator getResourceLocator(String path) throws MalformedLocatorException {
+ URI uri = null;
+ if (isPathValid(path) != false) {
+ try {
+ uri = new URI(path);
+ } catch (Exception ex) {
+ throw new MalformedLocatorException(ex);
+ }
+ } else {
+ throw new MalformedLocatorException(String.format("Invalid path hint: [%s]", path));
+ }
+ return new ResourceLocator(uri);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorProvider#isValid(java.lang.String)
+ */
+ @Override
+ public boolean isValid(String protocol) {
+ return Strings.isValid(protocol) != false && protocol.startsWith(PROTOCOL) != false;
+ }
+
+ private boolean isPathValid(String value) {
+ return Strings.isValid(value) && value.startsWith(PROTOCOL + "://");
+ }
+
+ private String generatePath(String name) throws MalformedLocatorException {
+ StringBuilder builder = new StringBuilder(PROTOCOL + "://");
+ if (Strings.isValid(name)) {
+ builder.append(name);
+ } else {
+ throw new MalformedLocatorException("Invalid arguments during locator generation.");
+ }
+ return builder.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeProvider.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeProvider.java
new file mode 100644
index 00000000000..6ef59d32009
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ExchangeProvider.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.framework.branch.management.exchange.resource;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.IResourceProvider;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.provider.common.OptionsProcessor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExchangeProvider implements IResourceProvider {
+ private static String BASE_PATH = OseeServerProperties.getOseeApplicationServerData();
+ private static String RESOLVED_PATH = BASE_PATH + File.separator + ExchangeLocatorProvider.PROTOCOL + File.separator;
+
+ public ExchangeProvider() {
+ }
+
+ public static String getExchangeFilePath() {
+ return RESOLVED_PATH;
+ }
+
+ private URI resolve(IResourceLocator locator) throws URISyntaxException {
+ URI toReturn = null;
+ StringBuilder builder = new StringBuilder();
+ String rawPath = locator.getRawPath();
+ if (!rawPath.startsWith("file:/")) {
+ builder.append(RESOLVED_PATH);
+ builder.append(rawPath);
+ toReturn = new File(builder.toString()).toURI();
+ } else {
+ rawPath = rawPath.replaceAll(" ", "%20");
+ toReturn = new URI(rawPath);
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#acquire(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public IResource acquire(IResourceLocator locator, Options options) throws Exception {
+ IResource toReturn = null;
+ OptionsProcessor optionsProcessor = new OptionsProcessor(resolve(locator), locator, null, options);
+ toReturn = optionsProcessor.getResourceToServer();
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#delete(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public int delete(IResourceLocator locator) throws Exception {
+ int toReturn = IResourceManager.FAIL;
+ File file = new File(resolve(locator));
+ if (file == null || file.exists() != true) {
+ toReturn = IResourceManager.RESOURCE_NOT_FOUND;
+ } else if (file.exists() == true && file.canWrite() == true) {
+ boolean result = Lib.deleteFileAndEmptyParents(BASE_PATH, file);
+ if (result) {
+ toReturn = IResourceManager.OK;
+ }
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#exists(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public boolean exists(IResourceLocator locator) throws Exception {
+ URI uri = resolve(locator);
+ File testFile = new File(uri);
+ return testFile.exists();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#isValid(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public boolean isValid(IResourceLocator locator) {
+ return locator != null && locator.getProtocol().equals(ExchangeLocatorProvider.PROTOCOL);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#save(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.IResource, org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public IResourceLocator save(IResourceLocator locator, IResource resource, Options options) throws Exception {
+ IResourceLocator toReturn = null;
+ OptionsProcessor optionsProcessor = new OptionsProcessor(resolve(locator), locator, resource, options);
+ OutputStream outputStream = null;
+ InputStream inputStream = null;
+ try {
+ File storageFile = optionsProcessor.getStorageFile();
+ // Remove all other files from this folder
+ File parent = storageFile.getParentFile();
+ if (parent != null) {
+ Lib.emptyDirectory(parent);
+ }
+ IResource resourceToStore = optionsProcessor.getResourceToStore();
+
+ outputStream = new FileOutputStream(storageFile);
+ inputStream = resourceToStore.getContent();
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ toReturn = optionsProcessor.getActualResouceLocator();
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ if (toReturn == null) {
+ throw new IllegalStateException(String.format("We failed to save resource %s.", locator.getLocation()));
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ZipBinaryResource.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ZipBinaryResource.java
new file mode 100644
index 00000000000..26c05377b31
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/exchange/resource/ZipBinaryResource.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.exchange.resource;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class ZipBinaryResource implements IResource {
+
+ private final IResourceLocator locator;
+ private final File entry;
+
+ public ZipBinaryResource(File entry, IResourceLocator locator) {
+ checkNotNull("FileEntry", entry);
+ checkNotNull("IResourceLocator", locator);
+ this.entry = entry;
+ this.locator = locator;
+ }
+
+ private void checkNotNull(String argName, Object object) {
+ if (object == null) {
+ throw new IllegalArgumentException(String.format("Argument was null - [%s]", argName));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getContent()
+ */
+ @Override
+ public InputStream getContent() throws IOException {
+ return new BufferedInputStream(new FileInputStream(entry));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getLocation()
+ */
+ @Override
+ public URI getLocation() {
+ return locator.getLocation();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getName()
+ */
+ @Override
+ public String getName() {
+ String path = locator.getLocation().toASCIIString();
+ int index = path.lastIndexOf("/");
+ if (index != -1 && index + 1 < path.length()) {
+ path = path.substring(index + 1, path.length());
+ }
+ return path;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#isCompressed()
+ */
+ @Override
+ public boolean isCompressed() {
+ return Lib.getExtension(entry.toString()).equals("zip");
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/BranchCreation.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/BranchCreation.java
new file mode 100644
index 00000000000..eac2acd5d22
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/BranchCreation.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.branch.management.internal;
+
+import java.sql.Timestamp;
+import org.eclipse.osee.framework.branch.management.IBranchCreation;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class BranchCreation implements IBranchCreation {
+
+ private static final String COPY_BRANCH_ADDRESSING =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, gamma_id, mod_type, tx_current FROM osee_txs txs1, osee_tx_details txd1 WHERE txs1.tx_current = 1 AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = ?";
+
+ private static final String BRANCH_TABLE_INSERT =
+ "INSERT INTO osee_branch (branch_id, branch_name, parent_branch_id, parent_transaction_id, archived, associated_art_id, branch_type, branch_state) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
+
+ private static final String INSERT_DEFAULT_BRANCH_NAMES =
+ "INSERT INTO OSEE_BRANCH_DEFINITIONS (static_branch_name, mapped_branch_id) VALUES (?, ?)";
+
+ private static final String INSERT_TX_DETAILS =
+ "INSERT INTO osee_TX_DETAILS ( branch_id, transaction_id, OSEE_COMMENT, time, author, tx_type ) VALUES ( ?, ?, ?, ?, ?, ?)";
+
+ public int createTopLevelBranch(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, String staticBranchName, boolean systemRootBranch) throws Exception {
+ CreateTopLevelBranchTx createRootBranchTx =
+ new CreateTopLevelBranchTx(parentTransactionId, parentBranchId, childBranchName, creationComment,
+ associatedArtifactId, authorId, staticBranchName, systemRootBranch);
+ createRootBranchTx.execute();
+ return createRootBranchTx.getNewBranchId();
+ }
+
+ public int createChildBranch(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, boolean branchWithFiltering, String[] compressArtTypeIds, String[] preserveArtTypeIds) throws Exception {
+ int branchId;
+
+ if (branchWithFiltering) {
+ CreateBranchWithFiltering createBranchWithFiltering =
+ new CreateBranchWithFiltering(parentTransactionId, parentBranchId, childBranchName, creationComment,
+ associatedArtifactId, authorId, compressArtTypeIds, preserveArtTypeIds);
+ createBranchWithFiltering.execute();
+ branchId = createBranchWithFiltering.getNewBranchId();
+ } else {
+ CreateChildBranchTx createChildBranchTx =
+ new CreateChildBranchTx(parentTransactionId, parentBranchId, childBranchName, creationComment,
+ associatedArtifactId, authorId);
+ createChildBranchTx.execute();
+ branchId = createChildBranchTx.getNewBranchId();
+ }
+ return branchId;
+ }
+
+ public static abstract class CreateBranchTx extends DbTransaction {
+ protected String childBranchName;
+ protected int parentBranchId;
+ protected int associatedArtifactId;
+ protected boolean success = false;
+ protected int branchId;
+ protected int authorId;
+ protected String creationComment;
+ private final BranchType branchType;
+ private final int parentTransactionId;
+ private final BranchState branchState;
+
+ public CreateBranchTx(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, BranchType branchType, BranchState branchState) throws OseeCoreException {
+ this.parentBranchId = parentBranchId;
+ this.childBranchName = childBranchName;
+ this.associatedArtifactId = associatedArtifactId;
+ this.authorId = authorId;
+ this.creationComment = creationComment;
+ this.branchType = branchType;
+ this.branchState = branchState;
+ this.parentTransactionId = parentTransactionId;
+ }
+
+ public int getNewBranchId() {
+ return branchId;
+ }
+
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ Timestamp timestamp = GlobalTime.GreenwichMeanTimestamp();
+ branchId =
+ initializeBranch(connection, childBranchName, parentBranchId, parentTransactionId, authorId, timestamp,
+ creationComment, associatedArtifactId, branchType, branchState);
+ int newTransactionNumber = SequenceManager.getNextTransactionId();
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_TX_DETAILS, branchId, newTransactionNumber,
+ creationComment, timestamp, authorId, 1);
+
+ specializedBranchOperations(branchId, newTransactionNumber, connection);
+
+ success = true;
+ }
+
+ private int initializeBranch(OseeConnection connection, String branchName, int parentBranchId, int parentTransactionId, int authorId, Timestamp creationDate, String creationComment, int associatedArtifactId, BranchType branchType, BranchState branchState) throws OseeDataStoreException, OseeArgumentException {
+ int branchId = SequenceManager.getNextBranchId();
+
+ ConnectionHandler.runPreparedUpdate(connection, BRANCH_TABLE_INSERT, branchId, branchName, parentBranchId,
+ parentTransactionId, 0, associatedArtifactId, branchType.getValue(), branchState.getValue());
+
+ return branchId;
+ }
+
+ public abstract void specializedBranchOperations(int newBranchId, int newTransactionNumber, OseeConnection connection) throws OseeDataStoreException;
+
+ /**
+ * @return the parentBranchId
+ */
+ public int getParentBranchId() {
+ return parentBranchId;
+ }
+
+ }
+
+ private final class CreateTopLevelBranchTx extends CreateBranchTx {
+
+ private final String staticBranchName;
+
+ public CreateTopLevelBranchTx(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, String staticBranchName, boolean systemRootBranch) throws OseeCoreException {
+ super(parentTransactionId, parentBranchId, childBranchName, creationComment, associatedArtifactId, authorId,
+ systemRootBranch ? BranchType.SYSTEM_ROOT : BranchType.TOP_LEVEL, BranchState.CREATED);
+ this.staticBranchName = staticBranchName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.AbstractDbTxTemplate#handleTxWork()
+ */
+ @Override
+ public void specializedBranchOperations(int newBranchId, int newTransactionNumber, OseeConnection connection) throws OseeDataStoreException {
+ if (staticBranchName != null) {
+ insertKeyedBranchIntoDatabase(connection, staticBranchName, newBranchId);
+ }
+ }
+ }
+
+ public static void insertKeyedBranchIntoDatabase(OseeConnection connection, String staticBranchName, int branchId) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_DEFAULT_BRANCH_NAMES, staticBranchName, branchId);
+ }
+
+ private final class CreateChildBranchTx extends CreateBranchTx {
+
+ public CreateChildBranchTx(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId) throws OseeCoreException {
+ super(parentTransactionId, parentBranchId, childBranchName, creationComment, associatedArtifactId, authorId,
+ BranchType.WORKING, BranchState.CREATED);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.AbstractDbTxTemplate#handleTxWork()
+ */
+ @Override
+ public void specializedBranchOperations(int newBranchId, int newTransactionNumber, OseeConnection connection) throws OseeDataStoreException {
+ int updates =
+ ConnectionHandler.runPreparedUpdate(connection, COPY_BRANCH_ADDRESSING, newTransactionNumber,
+ parentBranchId);
+ System.out.println(String.format("Create child branch - updated [%d] records", updates));
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/CreateBranchWithFiltering.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/CreateBranchWithFiltering.java
new file mode 100644
index 00000000000..eac27896ac7
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/CreateBranchWithFiltering.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.management.internal;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TXD_COMMENT;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.osee.framework.branch.management.internal.BranchCreation.CreateBranchTx;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.core.schema.LocalAliasTable;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class CreateBranchWithFiltering extends CreateBranchTx {
+ private static final LocalAliasTable TRANSACTIONS_ALIAS_1 = new LocalAliasTable(TRANSACTIONS_TABLE, "t5");
+ private static final LocalAliasTable TRANSACTIONS_ALIAS_2 = new LocalAliasTable(TRANSACTIONS_TABLE, "t6");
+ private static final LocalAliasTable ARTIFACT_ALIAS_1 = new LocalAliasTable(ARTIFACT_TABLE, "t11");
+ private static final LocalAliasTable ARTIFACT_ALIAS_2 = new LocalAliasTable(ARTIFACT_TABLE, "t12");
+ private static final LocalAliasTable ARTIFACT_VERSION_ALIAS_13 = new LocalAliasTable(ARTIFACT_VERSION_TABLE, "t13");
+ private static final LocalAliasTable ARTIFACT_VERSION_ALIAS_1 = new LocalAliasTable(ARTIFACT_VERSION_TABLE, "t1");
+ private static final LocalAliasTable ARTIFACT_VERSION_ALIAS_2 = new LocalAliasTable(ARTIFACT_VERSION_TABLE, "t2");
+ private static final LocalAliasTable ATTRIBUTE_ALIAS_1 = new LocalAliasTable(ATTRIBUTE_VERSION_TABLE, "t3");
+ private static final LocalAliasTable ATTRIBUTE_ALIAS_2 = new LocalAliasTable(ATTRIBUTE_VERSION_TABLE, "t4");
+ private static final LocalAliasTable TRANSACTIONS_ALIAS_3 = new LocalAliasTable(TRANSACTIONS_TABLE, "t7");
+ private static final LocalAliasTable TRANSACTIONS_ALIAS_4 = new LocalAliasTable(TRANSACTIONS_TABLE, "t8");
+ private static final LocalAliasTable LINK_ALIAS_1 = new LocalAliasTable(RELATION_LINK_VERSION_TABLE, "t9");
+ private static final LocalAliasTable LINK_ALIAS_2 = new LocalAliasTable(RELATION_LINK_VERSION_TABLE, "t10");
+
+ private static final String SELECT_ARTIFACT_HISTORY =
+ "SELECT " + TRANSACTIONS_ALIAS_1.columns("transaction_id", "gamma_id") + " AS art_gamma_id, " + TRANSACTIONS_ALIAS_1.column("mod_type") + " AS art_mod_type, " + TRANSACTIONS_ALIAS_1.column("tx_current") + " AS art_current, " + TRANSACTIONS_ALIAS_2.column("gamma_id") + " AS attr_gamma_id, " + TRANSACTIONS_ALIAS_2.column("tx_current") + " AS attr_current, " + TRANSACTIONS_ALIAS_2.column("mod_type") + " AS attr_mod_type FROM " + ARTIFACT_TABLE + " , " + ARTIFACT_VERSION_TABLE + "," + TRANSACTIONS_ALIAS_1 + "," + TRANSACTION_DETAIL_TABLE + "," + ATTRIBUTE_VERSION_TABLE + "," + TRANSACTIONS_ALIAS_2 + " WHERE " + ARTIFACT_TABLE.column("art_type_id") + " =?" + " AND " + ARTIFACT_TABLE.column("art_id") + " = " + ARTIFACT_VERSION_TABLE.column("art_id") + " AND " + ARTIFACT_VERSION_TABLE.column("gamma_id") + " = " + TRANSACTIONS_ALIAS_1.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_1.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + " = ?" + " AND " + TRANSACTIONS_ALIAS_1.column("transaction_id") + " = " + TRANSACTIONS_ALIAS_2.column("transaction_id") + " AND " + TRANSACTIONS_ALIAS_2.column("gamma_id") + " = " + ATTRIBUTE_VERSION_TABLE.column("gamma_id") + " AND " + ATTRIBUTE_VERSION_TABLE.column("art_id") + " = " + ARTIFACT_TABLE.column("art_id");
+ private static final String INSERT_TX_DETAILS_FOR_HISTORY =
+ "INSERT INTO " + TRANSACTION_DETAIL_TABLE + " (branch_id, transaction_id, tx_type, " + TXD_COMMENT + ", time, author, commit_art_id)" + " SELECT ?, ?, ?, " + TRANSACTION_DETAIL_TABLE.columns(
+ TXD_COMMENT, "time", "author", "commit_art_id") + " FROM " + TRANSACTION_DETAIL_TABLE + " WHERE " + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " = ?";
+ private static final String INSERT_LINK_GAMMAS =
+ "INSERT INTO " + TRANSACTIONS_TABLE + "(transaction_id, gamma_id, mod_type, tx_current) " + "SELECT ?, " + LINK_ALIAS_1.column("gamma_id") + ", " + TRANSACTIONS_ALIAS_1.column("mod_type") + ", ? FROM " + TRANSACTIONS_ALIAS_1 + "," + ARTIFACT_VERSION_ALIAS_1 + "," + TRANSACTIONS_ALIAS_2 + "," + ARTIFACT_VERSION_ALIAS_2 + "," + LINK_ALIAS_1 + "," + TRANSACTIONS_ALIAS_3 + " WHERE " + TRANSACTIONS_ALIAS_1.column("transaction_id") + " = ?" + " AND " + TRANSACTIONS_ALIAS_1.column("gamma_id") + " = " + ARTIFACT_VERSION_ALIAS_1.column("gamma_id") + " AND " + ARTIFACT_VERSION_ALIAS_1.column("art_id") + " = " + LINK_ALIAS_1.column("a_art_id") + " AND " + TRANSACTIONS_ALIAS_2.column("transaction_id") + " = ?" + " AND " + TRANSACTIONS_ALIAS_2.column("gamma_id") + " = " + ARTIFACT_VERSION_ALIAS_2.column("gamma_id") + " AND " + ARTIFACT_VERSION_ALIAS_2.column("art_id") + " = " + LINK_ALIAS_1.column("b_art_id") + " AND " + LINK_ALIAS_1.column("modification_id") + " <> 3 AND " + LINK_ALIAS_1.column("gamma_id") + "=" + TRANSACTIONS_ALIAS_3.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_3.column("transaction_id") + "=" + "(SELECT max(transaction_id) FROM " + LINK_ALIAS_2 + "," + TRANSACTIONS_ALIAS_4 + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + LINK_ALIAS_2.column("rel_link_id") + "=" + LINK_ALIAS_1.column("rel_link_id") + " AND " + LINK_ALIAS_2.column("gamma_id") + "=" + TRANSACTIONS_ALIAS_4.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_4.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)";
+ private static final String INSERT_ATTRIBUTES_GAMMAS =
+ "INSERT INTO " + TRANSACTIONS_TABLE + "(transaction_id, gamma_id, mod_type, tx_current) " + "SELECT ?, " + ATTRIBUTE_ALIAS_1.columns("gamma_id") + ", " + TRANSACTIONS_ALIAS_1.column("mod_type") + ", ? FROM " + TRANSACTIONS_ALIAS_1 + "," + ARTIFACT_VERSION_TABLE + "," + ATTRIBUTE_ALIAS_1 + "," + TRANSACTIONS_ALIAS_2 + " WHERE " + TRANSACTIONS_ALIAS_1.column("transaction_id") + " =? AND " + TRANSACTIONS_ALIAS_1.column("gamma_id") + " = " + ARTIFACT_VERSION_TABLE.column("gamma_id") + " AND " + ARTIFACT_VERSION_TABLE.column("art_id") + " = " + ATTRIBUTE_ALIAS_1.column("art_id") + " AND " + ATTRIBUTE_ALIAS_1.column("modification_id") + " <> 3 AND " + ATTRIBUTE_ALIAS_1.column("gamma_id") + "=" + TRANSACTIONS_ALIAS_2.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_2.column("transaction_id") + "=" + "(SELECT max(transaction_id) FROM " + ATTRIBUTE_ALIAS_2 + "," + TRANSACTIONS_ALIAS_3 + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + ATTRIBUTE_ALIAS_1.column("attr_id") + "=" + ATTRIBUTE_ALIAS_2.column("attr_id") + " AND " + ATTRIBUTE_ALIAS_2.column("gamma_id") + "=" + TRANSACTIONS_ALIAS_3.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_3.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)";
+ private static final String INSERT_TX_FOR_HISTORY =
+ "INSERT INTO " + TRANSACTIONS_TABLE.columnsForInsert("transaction_id", "gamma_id", "mod_type", "tx_current");
+ private static final String SELECTIVELY_BRANCH_ARTIFACTS_COMPRESSED =
+ "INSERT INTO " + TRANSACTIONS_TABLE + "(transaction_id, gamma_id, mod_type, tx_current) " + "SELECT ?, " + ARTIFACT_VERSION_ALIAS_1.column("gamma_id") + ", " + TRANSACTIONS_TABLE.column("mod_type") + ", ? FROM " + ARTIFACT_TABLE + " , " + ARTIFACT_VERSION_ALIAS_1 + "," + TRANSACTIONS_TABLE + " WHERE " + ARTIFACT_TABLE.column("art_type_id") + " =? AND " + ARTIFACT_TABLE.column("art_id") + " = " + ARTIFACT_VERSION_ALIAS_1.column("art_id") + " AND " + ARTIFACT_VERSION_ALIAS_1.column("modification_id") + " <> 3 AND " + ARTIFACT_VERSION_ALIAS_1.column("gamma_id") + " = " + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + "(SELECT max(transaction_id) FROM " + ARTIFACT_VERSION_ALIAS_2 + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + ARTIFACT_VERSION_ALIAS_1.column("art_id") + " = " + ARTIFACT_VERSION_ALIAS_2.column("art_id") + " AND " + ARTIFACT_VERSION_ALIAS_2.column("gamma_id") + " = " + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)";
+
+ private String[] compressArtTypeIds;
+ private String[] preserveArtTypeIds;
+ private Map<Integer, Integer> gammasToCurrent = new HashMap<Integer, Integer>();
+
+ public CreateBranchWithFiltering(int parentTransactionId, int parentBranchId, String childBranchName, String creationComment, int associatedArtifactId, int authorId, String[] compressArtTypeIds, String[] preserveArtTypeIds) throws OseeCoreException {
+ super(parentTransactionId, parentBranchId, childBranchName, creationComment, associatedArtifactId, authorId,
+ BranchType.WORKING, BranchState.CREATED);
+ this.compressArtTypeIds = compressArtTypeIds;
+ this.preserveArtTypeIds = preserveArtTypeIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.AbstractDbTxTemplate#handleTxWork()
+ */
+ @Override
+ public void specializedBranchOperations(int newBranchId, int newTransactionNumber, OseeConnection connection) throws OseeDataStoreException {
+ gammasToCurrent.clear();
+
+ if (compressArtTypeIds != null && compressArtTypeIds.length > 0) {
+ createBaselineTransaction(newTransactionNumber, compressArtTypeIds, connection);
+ }
+
+ HashCollection<Integer, Pair<Integer, Integer>> historyMap =
+ new HashCollection<Integer, Pair<Integer, Integer>>(false, HashSet.class);
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ for (String preserveArtTypeId : preserveArtTypeIds) {
+
+ chStmt.runPreparedQuery(SELECT_ARTIFACT_HISTORY, preserveArtTypeId, getParentBranchId());
+
+ while (chStmt.next()) {
+ int artGamma = chStmt.getInt("art_gamma_id");
+ int artCurrent = chStmt.getInt("art_current");
+ int attrGamma = chStmt.getInt("attr_gamma_id");
+ int attrCurrent = chStmt.getInt("attr_current");
+
+ historyMap.put(chStmt.getInt("transaction_id"), new Pair<Integer, Integer>(artGamma,
+ chStmt.getInt("art_mod_type")));
+
+ historyMap.put(chStmt.getInt("transaction_id"), new Pair<Integer, Integer>(attrGamma,
+ chStmt.getInt("attr_mod_type")));
+
+ gammasToCurrent.put(artGamma, artCurrent);
+ gammasToCurrent.put(attrGamma, attrCurrent);
+ }
+ }
+ initSelectLinkHistory(compressArtTypeIds, preserveArtTypeIds, historyMap, connection);
+ } finally {
+ chStmt.close();
+ }
+
+ Set<Integer> transactions = new TreeSet<Integer>(historyMap.keySet()); // the tree set is to in ascending order
+ for (Integer parentTransactionNumber : transactions) {
+ int nextTransactionNumber = SequenceManager.getNextTransactionId();
+
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_TX_DETAILS_FOR_HISTORY, getNewBranchId(),
+ nextTransactionNumber, 0, parentTransactionNumber.intValue());
+
+ Set<Integer> gammas = new HashSet<Integer>();
+ for (Pair<Integer, Integer> gammaAndMod : historyMap.getValues(parentTransactionNumber)) {
+ Integer modType = gammaAndMod.getValue();
+
+ if (!gammas.contains(gammaAndMod.getKey())) {
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_TX_FOR_HISTORY, nextTransactionNumber,
+ gammaAndMod.getKey(), modType, gammasToCurrent.get(gammaAndMod.getKey()));
+ gammas.add(gammaAndMod.getKey());
+ }
+ }
+ }
+ }
+
+ private void createBaselineTransaction(int newTransactionNumber, String[] compressArtTypes, OseeConnection connection) throws OseeDataStoreException {
+ for (String artifactTypeId : compressArtTypes) {
+ ConnectionHandler.runPreparedUpdate(connection, SELECTIVELY_BRANCH_ARTIFACTS_COMPRESSED, newTransactionNumber,
+ 1, artifactTypeId, getParentBranchId());
+ }
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_ATTRIBUTES_GAMMAS, newTransactionNumber, 1,
+ newTransactionNumber, getParentBranchId());
+
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_LINK_GAMMAS, newTransactionNumber, 1,
+ newTransactionNumber, newTransactionNumber, getParentBranchId());
+ }
+
+ /**
+ * artifact a | artifact b | select link ===========|============|============ I | I | false I | C | false I | P |
+ * false C | I | false P | I | false C | C | false C | P | true P | C | true P | P | true
+ *
+ * @param compressArtTypes
+ * @param preserveArtTypes
+ */
+ private void initSelectLinkHistory(String[] compressArtTypeIds, String[] preserveArtTypeIds, HashCollection<Integer, Pair<Integer, Integer>> historyMap, OseeConnection connection) throws OseeDataStoreException {
+ String preservedTypeSet = makeArtTypeSet(null, preserveArtTypeIds);
+ String compressTypeSet = makeArtTypeSet(compressArtTypeIds, null);
+
+ if (compressArtTypeIds != null && compressArtTypeIds.length > 0) {
+ // Handles the case C | P | true
+ String cpSql =
+ "SELECT " + TRANSACTIONS_ALIAS_1.columns("mod_type", "transaction_id", "tx_current", "gamma_id") + " AS link_gamma_id FROM " + ARTIFACT_ALIAS_1 + "," + ARTIFACT_ALIAS_2 + "," + RELATION_LINK_VERSION_TABLE + "," + TRANSACTIONS_ALIAS_1 + "," + TRANSACTION_DETAIL_TABLE + "," + ARTIFACT_VERSION_ALIAS_13 + " WHERE " + ARTIFACT_ALIAS_1.column("art_type_id") + " IN " + compressTypeSet + " AND " + ARTIFACT_ALIAS_1.column("art_id") + " = " + RELATION_LINK_VERSION_TABLE.column("a_art_id") + " AND " + ARTIFACT_ALIAS_1.column("art_id") + " = " + ARTIFACT_VERSION_ALIAS_13.column("art_id") + " AND " + ARTIFACT_VERSION_ALIAS_13.column("modification_id") + " <> 3 "
+
+ + " AND " + ARTIFACT_ALIAS_2.column("art_type_id") + " IN " + preservedTypeSet + " AND " + ARTIFACT_ALIAS_2.column("art_id") + " = " + RELATION_LINK_VERSION_TABLE.column("b_art_id")
+
+ + " AND " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + " = " + TRANSACTIONS_ALIAS_1.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_1.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?";
+
+ populateHistoryMapWithRelations(historyMap, cpSql, connection);
+
+ // Handles the case P | C | true
+ String pcSql =
+ "SELECT " + TRANSACTIONS_ALIAS_1.columns("mod_type", "transaction_id", "tx_current", "gamma_id") + " AS link_gamma_id" + " FROM " + ARTIFACT_ALIAS_1 + "," + ARTIFACT_ALIAS_2 + "," + RELATION_LINK_VERSION_TABLE + "," + TRANSACTIONS_ALIAS_1 + "," + TRANSACTION_DETAIL_TABLE + "," + ARTIFACT_VERSION_ALIAS_13 + " WHERE " + ARTIFACT_ALIAS_1.column("art_type_id") + " IN " + compressTypeSet + " AND " + ARTIFACT_ALIAS_1.column("art_id") + " = " + RELATION_LINK_VERSION_TABLE.column("b_art_id") + " AND " + ARTIFACT_ALIAS_1.column("art_id") + " = " + ARTIFACT_VERSION_ALIAS_13.column("art_id") + " AND " + ARTIFACT_VERSION_ALIAS_13.column("modification_id") + " <> 3 "
+
+ + " AND " + ARTIFACT_ALIAS_2.column("art_type_id") + " IN " + preservedTypeSet + " AND " + ARTIFACT_ALIAS_2.column("art_id") + " = " + RELATION_LINK_VERSION_TABLE.column("a_art_id")
+
+ + " AND " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + " = " + TRANSACTIONS_ALIAS_1.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_1.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?";
+
+ populateHistoryMapWithRelations(historyMap, pcSql, connection);
+ }
+
+ // Handles the case P | P | true
+ String ppSql =
+ "SELECT " + TRANSACTIONS_ALIAS_1.columns("mod_type", "transaction_id", "tx_current", "gamma_id") + " AS link_gamma_id" + " FROM " + ARTIFACT_ALIAS_1 + "," + ARTIFACT_ALIAS_2 + "," + RELATION_LINK_VERSION_TABLE + "," + TRANSACTIONS_ALIAS_1 + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + ARTIFACT_ALIAS_1.column("art_type_id") + " IN " + preservedTypeSet + " AND " + ARTIFACT_ALIAS_1.column("art_id") + " = " + RELATION_LINK_VERSION_TABLE.column("b_art_id")
+
+ + " AND " + ARTIFACT_ALIAS_2.column("art_type_id") + " IN " + preservedTypeSet + " AND " + ARTIFACT_ALIAS_2.column("art_id") + " = " + RELATION_LINK_VERSION_TABLE.column("a_art_id")
+
+ + " AND " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + " = " + TRANSACTIONS_ALIAS_1.column("gamma_id") + " AND " + TRANSACTIONS_ALIAS_1.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?";
+
+ populateHistoryMapWithRelations(historyMap, ppSql, connection);
+ }
+
+ private void populateHistoryMapWithRelations(HashCollection<Integer, Pair<Integer, Integer>> historyMap, String sql, OseeConnection connection) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(sql, getParentBranchId());
+ while (chStmt.next()) {
+ int linkGammaId = chStmt.getInt("link_gamma_id");
+ int txCurrent = chStmt.getInt("tx_current");
+
+ historyMap.put(chStmt.getInt("transaction_id"), new Pair<Integer, Integer>(linkGammaId,
+ chStmt.getInt("mod_type")));
+
+ gammasToCurrent.put(linkGammaId, txCurrent);
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private String makeArtTypeSet(String[] compressArtTypes, String[] preserveArtTypes) {
+ StringBuilder typeStrB = new StringBuilder();
+ typeStrB.append("(");
+ boolean firstItem = true;
+ if (compressArtTypes != null) {
+ firstItem = addTypes(typeStrB, compressArtTypes, firstItem);
+ }
+ if (preserveArtTypes != null) {
+ addTypes(typeStrB, preserveArtTypes, firstItem);
+ }
+ typeStrB.append(")");
+ return typeStrB.toString();
+ }
+
+ private boolean addTypes(StringBuilder typeStrB, String[] artifactTypes, boolean firstItem) {
+ for (String artifactTypeId : artifactTypes) {
+ if (firstItem) {
+ firstItem = false;
+ } else {
+ typeStrB.append(",");
+ }
+ typeStrB.append(artifactTypeId);
+ }
+ return firstItem;
+ }
+}
diff --git a/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/InternalBranchActivator.java b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/InternalBranchActivator.java
new file mode 100644
index 00000000000..25ef264dd5f
--- /dev/null
+++ b/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/InternalBranchActivator.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.framework.branch.management.internal;
+
+import org.eclipse.osee.framework.branch.management.IBranchCreation;
+import org.eclipse.osee.framework.branch.management.IBranchExchange;
+import org.eclipse.osee.framework.branch.management.exchange.BranchExchange;
+import org.eclipse.osee.framework.core.server.IApplicationServerManager;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class InternalBranchActivator implements BundleActivator {
+
+ private static InternalBranchActivator instance;
+ private ServiceRegistration serviceRegistration;
+ private ServiceRegistration exchangeServiceRegistration;
+ private ServiceTracker resourceManagementTracker;
+ private ServiceTracker resourceLocatorManagerTracker;
+ private ServiceTracker branchExchangeTracker;
+ private ServiceTracker applicationServerManagerTracker;
+ private BundleContext context;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ InternalBranchActivator.instance = this;
+ this.context = context;
+ serviceRegistration = context.registerService(IBranchCreation.class.getName(), new BranchCreation(), null);
+
+ exchangeServiceRegistration =
+ context.registerService(IBranchExchange.class.getName(), new BranchExchange(), null);
+
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+
+ branchExchangeTracker = new ServiceTracker(context, IBranchExchange.class.getName(), null);
+ branchExchangeTracker.open();
+
+ applicationServerManagerTracker = new ServiceTracker(context, IApplicationServerManager.class.getName(), null);
+ applicationServerManagerTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ exchangeServiceRegistration.unregister();
+ exchangeServiceRegistration = null;
+
+ serviceRegistration.unregister();
+ serviceRegistration = null;
+
+ resourceManagementTracker.close();
+ resourceManagementTracker = null;
+
+ resourceLocatorManagerTracker.close();
+ resourceLocatorManagerTracker = null;
+
+ branchExchangeTracker.close();
+ branchExchangeTracker = null;
+
+ applicationServerManagerTracker.close();
+ applicationServerManagerTracker = null;
+
+ InternalBranchActivator.instance = null;
+ }
+
+ public static IBranchExchange getBranchExchange() {
+ return (IBranchExchange) instance.branchExchangeTracker.getService();
+ }
+
+ public static IResourceManager getResourceManager() {
+ return (IResourceManager) instance.resourceManagementTracker.getService();
+ }
+
+ public static IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) instance.resourceLocatorManagerTracker.getService();
+ }
+
+ public static IApplicationServerManager getApplicationServerManger() {
+ return (IApplicationServerManager) instance.applicationServerManagerTracker.getService();
+ }
+
+ public static BundleContext getBundleContext() {
+ return instance.context;
+ }
+}
diff --git a/org.eclipse.osee.framework.client.info.servlet/.classpath b/org.eclipse.osee.framework.client.info.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.client.info.servlet/.project b/org.eclipse.osee.framework.client.info.servlet/.project
new file mode 100644
index 00000000000..77267dc62a4
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.client.info.servlet</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.client.info.servlet/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..7ac6bb66ec1
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu Oct 09 10:04:50 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..e4085f3bf06
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu Oct 09 10:04:50 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.client.info.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.client.info.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..5f93cc005ef
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Client Info Servlet Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.client.info.servlet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.client.info.servlet.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.core.server,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.client.info.servlet/build.properties b/org.eclipse.osee.framework.client.info.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/Activator.java b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/Activator.java
new file mode 100644
index 00000000000..8e9848f7904
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/Activator.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.framework.client.info.servlet;
+
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ private OseeHttpServiceTracker httpTracker = null;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ httpTracker = new OseeHttpServiceTracker(context, "osee/install/info", ClientInstallInfoServlet.class);
+ httpTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ httpTracker.close();
+ httpTracker = null;
+ }
+}
diff --git a/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfo.java b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfo.java
new file mode 100644
index 00000000000..3dc815691e8
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfo.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.client.info.servlet;
+
+import java.io.StringReader;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+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;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class ClientInstallInfo {
+ private final static String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ private final static String EMPTY_STRING = "";
+
+ private final String name;
+ private String os;
+ private boolean isActive;
+ private String execPath;
+ private String comment;
+
+ private ClientInstallInfo(String name) {
+ this.name = name;
+ this.os = null;
+ this.execPath = EMPTY_STRING;
+ this.isActive = false;
+ this.comment = EMPTY_STRING;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getOs() {
+ return os;
+ }
+
+ public String getExecPath() {
+ return execPath;
+ }
+
+ public boolean isActive() {
+ return this.isActive;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public String toString() {
+ return String.format("name:[%s] os:[%s] isActive:[%s] comment:[%s] location:[%s]", name, os, isActive, comment,
+ execPath);
+ }
+
+ public static ClientInstallInfo createFromXml(String name, String data) throws OseeCoreException {
+ ClientInstallInfo info = new ClientInstallInfo(name);
+ try {
+ if (!data.startsWith(XML_HEADER)) {
+ data = XML_HEADER + data;
+ }
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setContentHandler(new Parser(info));
+ reader.parse(new InputSource(new StringReader(data)));
+ } catch (Exception ex) {
+ throw new OseeCoreException(String.format("Error parsing data for client install: [%s]", name), ex);
+ }
+ return info;
+ }
+
+ private final static class Parser extends AbstractSaxHandler {
+ private ClientInstallInfo info;
+
+ private Parser(ClientInstallInfo info) {
+ this.info = info;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase("install")) {
+ info.os = attributes.getValue("os");
+ if (info.os != null) {
+ info.os = info.os.toLowerCase();
+ } else {
+ info.os = EMPTY_STRING;
+ }
+ info.isActive = Boolean.valueOf(attributes.getValue("isActive"));
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase("location")) {
+ info.execPath = getContents();
+ if (info.execPath == null) {
+ info.execPath = EMPTY_STRING;
+ }
+ } else if (localName.equalsIgnoreCase("comment")) {
+ info.comment = getContents();
+ if (info.comment == null) {
+ info.comment = EMPTY_STRING;
+ }
+ }
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfoServlet.java b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfoServlet.java
new file mode 100644
index 00000000000..55ae541f218
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/ClientInstallInfoServlet.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.framework.client.info.servlet;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+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;
+
+/**
+ * Sends a page with links to OSEE client install locations.
+ * <p>
+ * Client Install information are entries in the OSEE Info Table:
+ * <ul>
+ * <li><b>osee_key:</b> uniquely identifies this install record <br/><b>NOTE:</b> must with prefixed with
+ * "<b><i>osee.install.</i></b>"</li>
+ * <li><b>osee_value:</b> contains client install information
+ *
+ * <pre>
+ * Data for this field is formatted as follows:
+ * &lt;client&gt;
+ * &lt;install os=&quot;Windows&quot; isActive=&quot;true&quot; /&gt;
+ * &lt;comment&gt; This is a shared installation &lt;/comment&gt;
+ * &lt;location&gt;\\server\\OSEE\\Shared\\osee.exe&lt;/location&gt;
+ * &lt;client&gt;
+ * </pre>
+ *
+ * </li>
+ * </ul>
+ * <code>
+ * </p>
+ *
+ * @author Roberto E. Escobar
+ */
+public class ClientInstallInfoServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = -4089363221030046759L;
+
+ private static final String QUERY = "Select OSEE_KEY, OSEE_VALUE FROM osee_info where OSEE_KEY LIKE ?";
+
+ private enum CommandType {
+ exec_path;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.OseeHttpServlet#checkAccessControl(javax.servlet.http.HttpServletRequest)
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ // Allow access to all
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ String cmd = request.getParameter("cmd");
+ String key = request.getParameter("key");
+ boolean isCloseAllowed = Boolean.valueOf(request.getParameter("close"));
+ boolean isPromptAllowed = Boolean.valueOf(request.getParameter("prompt"));
+ if (Strings.isValid(cmd)) {
+ CommandType cmdType = CommandType.valueOf(cmd);
+ switch (cmdType) {
+ case exec_path:
+ if (!Strings.isValid(key)) {
+ key = "osee.install.%";
+ }
+ if (key.startsWith("osee.install.")) {
+ List<ClientInstallInfo> infos = getInfoEntry(key);
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("text/html");
+ if (infos.size() == 0) {
+ response.getWriter().write("<html><body>No installations found</body></html>");
+ } else {
+ String html = InstallLinkPageGenerator.generate(infos, isCloseAllowed, isPromptAllowed);
+ response.getWriter().print(html);
+ }
+ } else {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ response.getWriter().write("key parameter was invalid. must start with: osee.install.");
+ }
+ break;
+ default:
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ break;
+ }
+ } else {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ response.getWriter().write(
+ String.format("cmd parameter was invalid. use any of the following: %s",
+ Arrays.deepToString(CommandType.values())));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Failed to process client install info request [%s]",
+ request.toString()), ex);
+ response.setContentType("text/plain");
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+ private List<ClientInstallInfo> getInfoEntry(String key) throws OseeCoreException {
+ List<ClientInstallInfo> infos = new ArrayList<ClientInstallInfo>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(QUERY, key);
+ while (chStmt.next()) {
+ String name = chStmt.getString("osee_key");
+ String data = chStmt.getString("osee_value");
+ infos.add(ClientInstallInfo.createFromXml(name, data));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return infos;
+ }
+}
diff --git a/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/InstallLinkPageGenerator.java b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/InstallLinkPageGenerator.java
new file mode 100644
index 00000000000..2439048b2ce
--- /dev/null
+++ b/org.eclipse.osee.framework.client.info.servlet/src/org/eclipse/osee/framework/client/info/servlet/InstallLinkPageGenerator.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.framework.client.info.servlet;
+
+import java.util.List;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InstallLinkPageGenerator {
+
+ private static final String HTML_HEADER =
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html14/loose.dtd\">\n";
+
+ private static final String CSS_SHEET =
+ "<style type=\"text/css\"> table.oseeTable { border-width: 1px 1px 1px 1px; border-spacing: 2px; border-style: solid solid solid solid; border-color: blue blue blue blue; border-collapse: separate; background-color: rgb(255, 250, 250); } " + " table.oseeTable th { border-width: 1px 1px 1px 1px; padding: 4px 4px 4px 4px; border-style: solid solid solid solid; border-color: black black black black; background-color: white; -moz-border-radius: 0px 0px 0px 0px; } " + " table.oseeTable td { border-width: 1px 1px 1px 1px; padding: 4px 4px 4px 4px; border-style: solid solid solid solid; border-color: black black black black; background-color: white; -moz-border-radius: 0px 0px 0px 0px; } </style>\n";
+
+ private static final String MULTI_LINK_TEMPLATE =
+ HTML_HEADER + "<html>\n<head>\n" + CSS_SHEET + "%s</head>\n<body onload=\"initialize()\">\n%s</body>\n</html>";
+ private static final String LAUNCH_PAGE_TEMPLATE =
+ HTML_HEADER + "<html>\n<head>\n" + CSS_SHEET + "%s</head>\n<body onload=\"initialize()\">\n<div id='xmsg'/>\n</body>\n</html>";
+
+ private static final String LAUNCH_ERROR_MESSAGE =
+ "Please use Internet Explorer. Your browser does not support this operation.";
+
+ private static final String LINK_ERROR_MESSAGE = "Links below will not work unless you use Internet Explorer.";
+
+ private static final String JS_CHECK =
+ "if (document.implementation && document.implementation.createDocument) {\nalert('%s');\n return;}\n";
+
+ private InstallLinkPageGenerator() {
+ }
+
+ private static String normalizePath(String path) {
+ StringBuilder pathBuilder = new StringBuilder();
+ boolean wasLastPathSeparator = false;
+ for (int charIndex = 0; charIndex < path.length(); charIndex++) {
+ char charVal = path.charAt(charIndex);
+ if (charVal == '\\' && !wasLastPathSeparator) {
+ if (charIndex + 1 < path.length()) {
+ if (path.charAt(charIndex + 1) != '\\') {
+ pathBuilder.append('\\');
+ }
+ } else {
+ pathBuilder.append('\\');
+ }
+ wasLastPathSeparator = true;
+ } else {
+ wasLastPathSeparator = false;
+ }
+ pathBuilder.append(charVal);
+ }
+ return pathBuilder.toString();
+ }
+
+ private static String getOpenScript(ClientInstallInfo info, boolean isCloseAllowed, boolean isPromptAllowed) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<script type=\"text/javascript\">\n");
+ builder.append("function initialize()\n{\n");
+ builder.append(String.format(JS_CHECK, LAUNCH_ERROR_MESSAGE));
+ String path = info.getExecPath();
+ if (info.getOs().contains("win") && info.isActive()) {
+ String execName = null;
+ String execPath = "";
+ int index = path.lastIndexOf("\\");
+ if (index > -1) {
+ execName = path.substring(index + 1, path.length());
+ execPath = normalizePath(path.substring(0, index));
+ } else {
+ execName = path;
+ execPath = "";
+ }
+ builder.append("var v = new ActiveXObject(\"Shell.Application\");\n");
+ builder.append(String.format("v.ShellExecute(\"%s\",\"\",\"%s\", \"open\", 10);\n", execName, execPath));
+ if (!isPromptAllowed) {
+ builder.append("window.opener=\"self\";\n");
+ }
+ if (isCloseAllowed) {
+ builder.append("window.close();\n");
+ }
+ builder.append("}\n");
+ } else {
+ // INVALID LINK PAGE
+ builder.append(String.format(
+ "var ex=\"No valid link found. Contact your OSEE administrator. Key was: [%s]\";", info.getName()));
+ builder.append("document.getElementById('xmsg').innerHTML=ex;");
+ builder.append("}\n");
+ }
+ builder.append("</script>\n");
+ return builder.toString();
+ }
+
+ private static String getCheckScript() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<script type=\"text/javascript\">\n");
+ builder.append("function initialize()\n{\n");
+ builder.append(String.format(JS_CHECK, LINK_ERROR_MESSAGE));
+ builder.append("}\n</script>\n");
+ return builder.toString();
+ }
+
+ private static String getLinkTable(List<ClientInstallInfo> infos) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<h3>OSEE Client Installs</h3>");
+ builder.append("<p>Click on the <i>Active</i> install names to launch OSEE.</p>");
+ builder.append("<table class=\"oseeTable\" width=\"95%\">");
+ builder.append("<tr style=\"background:gray\" ><th>Name</th> <th>Comment</th><th>Status</th>");
+ for (ClientInstallInfo info : infos) {
+ builder.append("<tr>");
+ if (info.isActive()) {
+ String path = info.getExecPath();
+ builder.append("<td>");
+ builder.append(String.format("<a href=\"%s\"> %s</a>",
+ path.startsWith("file://") ? path : "file://" + path,
+ info.getName().replaceAll("osee.install", "").toUpperCase().replaceAll("\\.", " ")));
+ builder.append("</td>");
+ builder.append(String.format("<td>%s</td>", info.getComment()));
+ builder.append("<td>Active</td>");
+ } else {
+ builder.append(String.format("<td>%s</td>",
+ info.getName().replaceAll("osee.install", "").toUpperCase().replaceAll("\\.", " ")));
+ builder.append(String.format("<td>%s</td>", info.getComment()));
+ builder.append("<td>In Active</td>");
+ }
+ builder.append("</tr>");
+ }
+ builder.append("</table>");
+ return builder.toString();
+ }
+
+ public static String generate(List<ClientInstallInfo> infos, boolean isCloseAllowed, boolean isPromptAllowed) {
+ String toReturn = null;
+ if (infos.size() == 1) {
+ toReturn = String.format(LAUNCH_PAGE_TEMPLATE, getOpenScript(infos.get(0), isCloseAllowed, isPromptAllowed));
+ } else {
+ toReturn = String.format(MULTI_LINK_TEMPLATE, getCheckScript(), getLinkTable(infos));
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/.classpath b/org.eclipse.osee.framework.core.client/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.core.client/.project b/org.eclipse.osee.framework.core.client/.project
new file mode 100644
index 00000000000..db571da02b8
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.core.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.framework.core.client/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.core.client/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..96f5720d28b
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Wed Oct 29 10:59:05 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.core.client/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.core.client/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..0b33409980c
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Core Client Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.core.client;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.core.client.CoreClientActivator
+Bundle-Vendor: Boeing
+Require-Bundle: org.eclipse.equinox.ds,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.plugin.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.db,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.network,
+ org.eclipse.osee.framework.logging
+Service-Component: OSGI-INF/application.db.provider.xml
+Export-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.client.server,
+ org.eclipse.osee.framework.core.client.task
diff --git a/org.eclipse.osee.framework.core.client/OSGI-INF/application.db.provider.xml b/org.eclipse.osee.framework.core.client/OSGI-INF/application.db.provider.xml
new file mode 100644
index 00000000000..f77f696f083
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/OSGI-INF/application.db.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="client.application.db.provider">
+ <implementation class="org.eclipse.osee.framework.core.client.internal.ClientDatabaseProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.client/build.properties b/org.eclipse.osee.framework.core.client/build.properties
new file mode 100644
index 00000000000..b26fb3192e7
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.core.client/plugin.xml b/org.eclipse.osee.framework.core.client/plugin.xml
new file mode 100644
index 00000000000..4b49b1b0c8f
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.core.runtime.preferences">
+ <initializer
+ class="org.eclipse.osee.framework.core.client.internal.CorePreferenceInitializer">
+ </initializer>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/BaseCredentialProvider.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/BaseCredentialProvider.java
new file mode 100644
index 00000000000..6818cd25598
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/BaseCredentialProvider.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.framework.core.client;
+
+import java.net.InetAddress;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.server.HttpServer;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseCredentialProvider implements ICredentialProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.ICredentialProvider#getCredential()
+ */
+ @Override
+ public OseeCredential getCredential() throws OseeCoreException {
+ OseeCredential credential = new OseeCredential();
+ credential.setUserName("");
+ credential.setDomain("");
+ credential.setPassword("");
+ credential.setAuthenticationProtocol("");
+ String localAddress = HttpServer.getServerAddressForExternalCommunication();
+
+ credential.setClientAddress(Strings.isValid(localAddress) ? localAddress : "Unknown",
+ HttpServer.getDefaultServicePort());
+ credential.setClientVersion(OseeCodeVersion.getVersion());
+ try {
+ credential.setClientMachineName(InetAddress.getLocalHost().getHostName());
+ } catch (Exception ex) {
+ credential.setClientMachineName("Unknown");
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ return credential;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ClientSessionManager.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ClientSessionManager.java
new file mode 100644
index 00000000000..00dffe0bf6b
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ClientSessionManager.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client;
+
+import java.util.List;
+import org.eclipse.osee.framework.core.client.internal.InternalClientSessionManager;
+import org.eclipse.osee.framework.core.data.IOseeUser;
+import org.eclipse.osee.framework.core.data.OseeSessionGrant;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ClientSessionManager {
+
+ private ClientSessionManager() {
+ }
+
+ public static final String getStatusId() {
+ return InternalClientSessionManager.STATUS_ID;
+ }
+
+ public static boolean isSessionValid() {
+ return InternalClientSessionManager.getInstance().isSessionValid();
+ }
+
+ public static void ensureSessionCreated() {
+ InternalClientSessionManager.getInstance().ensureSessionCreated();
+ }
+
+ private static OseeSessionGrant getSessionGrant() throws OseeAuthenticationRequiredException {
+ return InternalClientSessionManager.getInstance().getOseeSessionGrant();
+ }
+
+ public static OseeClientSession getSession() throws OseeAuthenticationRequiredException {
+ return InternalClientSessionManager.getInstance().getOseeSession();
+ }
+
+ public static boolean isUserCreationRequired() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().isCreationRequired();
+ }
+
+ public static void clearUserCreationRequired() throws OseeAuthenticationRequiredException {
+ getSessionGrant().setCreationRequired(false);
+ }
+
+ public static IOseeUser getCurrentUserInfo() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().getOseeUserInfo();
+ }
+
+ public static String getSessionId() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().getSessionId();
+ }
+
+ public static String getDataStoreLoginName() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().getDatabaseInfo().getDatabaseLoginName();
+ }
+
+ public static String getDataStoreName() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().getDatabaseInfo().getDatabaseName();
+ }
+
+ public static String getDataStorePath() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().getDataStorePath();
+ }
+
+ public static boolean isProductionDataStore() throws OseeAuthenticationRequiredException {
+ return getSessionGrant().getDatabaseInfo().isProduction();
+ }
+
+ public static String getSQL(String key) throws OseeCoreException {
+ String sql = getSessionGrant().getSqlProperties().getProperty(key);
+ if (Strings.isValid(sql)) {
+ return sql;
+ }
+ throw new OseeArgumentException(String.format("Invalid sql key [%s]", key));
+ }
+
+ public static List<String> getAuthenticationProtocols() {
+ return InternalClientSessionManager.getInstance().getAuthenticationProtocols();
+ }
+
+ public static void authenticateAsGuest() throws OseeCoreException {
+ InternalClientSessionManager.getInstance().authenticateAsGuest();
+ }
+
+ public static void authenticate(ICredentialProvider credentialProvider) throws OseeCoreException {
+ InternalClientSessionManager.getInstance().authenticate(credentialProvider);
+ }
+
+ public static void releaseSession() throws OseeCoreException {
+ InternalClientSessionManager.getInstance().releaseSession();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CoreClientActivator.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CoreClientActivator.java
new file mode 100644
index 00000000000..16e754f09cd
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CoreClientActivator.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.framework.core.client;
+
+import org.eclipse.osee.framework.core.client.server.HttpServer;
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class CoreClientActivator extends OseeActivator {
+
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.core.client";
+ private static CoreClientActivator plugin;
+ private BundleContext context;
+
+ public CoreClientActivator() {
+ plugin = this;
+ context = null;
+ }
+
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ this.context = context;
+ HttpServer.startServer(1);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ savePluginPreferences();
+
+ HttpServer.stopServer();
+
+ ClientSessionManager.releaseSession();
+ context = null;
+ }
+
+ public static CoreClientActivator getInstance() {
+ return plugin;
+ }
+
+ public static BundleContext getBundleContext() {
+ return getInstance().context;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CorePreferences.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CorePreferences.java
new file mode 100644
index 00000000000..5cf3335e670
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/CorePreferences.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.framework.core.client;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CorePreferences {
+
+ private CorePreferences() {
+
+ }
+ public static final String INETADDRESS_KEY = "org.eclipse.osee.framework.core.client.preferences.InetAddressDefault";
+
+ public static InetAddress getDefaultInetAddress() throws UnknownHostException {
+ Preferences prefStore = CoreClientActivator.getInstance().getPluginPreferences();
+ String inetaddress = prefStore.getString(CorePreferences.INETADDRESS_KEY);
+ if (Strings.isValid(inetaddress)) {
+ return InetAddress.getByName(inetaddress);
+ }
+ return Network.getValidIP();
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/GuestCredentialProvider.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/GuestCredentialProvider.java
new file mode 100644
index 00000000000..1e2e72bdfcd
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/GuestCredentialProvider.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.core.client;
+
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GuestCredentialProvider extends BaseCredentialProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.BaseCredentialProvider#getCredential()
+ */
+ @Override
+ public OseeCredential getCredential() throws OseeCoreException {
+ OseeCredential credential = super.getCredential();
+ credential.setUserName(SystemUser.Guest.getName());
+ return credential;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ICredentialProvider.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ICredentialProvider.java
new file mode 100644
index 00000000000..e152a991e1c
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/ICredentialProvider.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.framework.core.client;
+
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ICredentialProvider {
+
+ OseeCredential getCredential() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientProperties.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientProperties.java
new file mode 100644
index 00000000000..bbbecb2ddeb
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientProperties.java
@@ -0,0 +1,291 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client;
+
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Properties;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeClientProperties extends OseeProperties {
+
+ private static final OseeClientProperties instance = new OseeClientProperties();
+
+ private static final String HEADER_TAG = "OSEE-Client-Property-Init";
+
+ private static final String OSEE_AUTHENTICATION_PROTOCOL = "osee.authentication.protocol";
+ private static final String OSEE_APPLICATION_SERVER = "osee.application.server";
+ private static final String OSEE_ARBITRATION_SERVER = "osee.arbitration.server";
+
+ private static final String OSEE_LOCAL_APPLICATION_SERVER = "osee.local.application.server";
+ private static final String OSEE_LOCAL_HTTP_WORKER_PORT = "osee.local.http.worker.port";
+
+ // Database Initialization Properties
+ private static final String OSEE_IMPORT_DURING_DB_INIT = "osee.import.on.db.init";
+ private static final String OSEE_IMPORT_FROM_DB_SERVICE = "osee.import.from.connection.id.on.db.init";
+ private static final String OSEE_USE_FILE_SPECIFIED_SCHEMAS = "osee.file.specified.schema.names.on.db.init";
+
+ private static final String OSEE_TABLE_DATA_SPACE_ON_DB_INIT = "osee.table.data.space.on.db.init";
+ private static final String OSEE_INDEX_DATA_SPACE_ON_DB_INIT = "osee.index.data.space.on.db.init";
+
+ private static final String OSEE_PROMPT_ON_DB_INIT = "osee.prompt.on.db.init";
+ private static final String OSEE_CHOICE_ON_DB_INIT = "osee.choice.on.db.init";
+
+ private enum InitializerFlag {
+ overwrite_settings, client_defaults;
+
+ public static InitializerFlag fromString(String value) {
+ InitializerFlag toReturn = client_defaults;
+ if (Strings.isValid(value)) {
+ value = value.toLowerCase();
+ for (InitializerFlag flag : InitializerFlag.values()) {
+ if (flag.name().equals(value)) {
+ toReturn = flag;
+ break;
+ }
+ }
+ }
+ return toReturn;
+ }
+ }
+
+ private final Properties defaultProperties;
+ private final Properties overwriteProperties;
+
+ private OseeClientProperties() {
+ super();
+ this.defaultProperties = new Properties();
+ this.overwriteProperties = new Properties();
+ initialize();
+ }
+
+ /**
+ * Retrieves where table data should be imported from during OSEE database initialization. The default is to use the
+ * database connection id specified in the schema.xml files.
+ *
+ * @return the connection id to use as a source of the data to be imported.
+ */
+ public static String getTableImportSource() {
+ return getProperty(OSEE_IMPORT_FROM_DB_SERVICE);
+ }
+
+ /**
+ * Retrieves whether OSEE database initialization should use the schema names specified in the schema.xml files
+ * instead of using the connection schema. Using the connection specified schema is the default behavior.
+ *
+ * @return <b>true</b> if the file specified schemas should be used.
+ */
+ public static boolean useSchemasSpecifiedInDbConfigFiles() {
+ return Boolean.valueOf(getProperty(OSEE_USE_FILE_SPECIFIED_SCHEMAS));
+ }
+
+ /**
+ * Retrieves the table data space to use during OSEE database initialization
+ *
+ * @return table data space
+ */
+ public static String getOseeTableDataSpaceForDbInit() {
+ return getProperty(OSEE_TABLE_DATA_SPACE_ON_DB_INIT);
+ }
+
+ /**
+ * Retrieves the index data space to use during OSEE database initialization
+ *
+ * @return index data space
+ */
+ public static String getOseeIndexDataSpaceForDbInit() {
+ return getProperty(OSEE_INDEX_DATA_SPACE_ON_DB_INIT);
+ }
+
+ /**
+ * @return whether to interactively prompt the user during database initialization for init choice
+ */
+ public static boolean promptOnDbInit() {
+ return Boolean.valueOf(getProperty(OSEE_PROMPT_ON_DB_INIT, "true"));
+ }
+
+ /**
+ * @return the predefined database initialization choice
+ */
+ public static String getChoiceOnDbInit() {
+ return getProperty(OSEE_CHOICE_ON_DB_INIT);
+ }
+
+ /**
+ * Retrieves whether OSEE database initialization should import database data as part of its tasks.
+ *
+ * @return <b>true</b> if database initialization should import database data as part of its tasks.
+ */
+ public static boolean isOseeImportAllowed() {
+ return Boolean.valueOf(getProperty(OSEE_IMPORT_DURING_DB_INIT));
+ }
+
+ /**
+ * Gets whether local application server launch is required
+ *
+ * @return <b>true</b> if local application server launch is required. <b>false</b> if local application server
+ * launch is not required.
+ */
+ public static boolean isLocalApplicationServerRequired() {
+ return Boolean.valueOf(getProperty(OSEE_LOCAL_APPLICATION_SERVER));
+ }
+
+ /**
+ * Retrieves the specified port to use for the local HTTP server
+ *
+ * @return port to use
+ */
+ public static String getLocalHttpWorkerPort() {
+ return getProperty(OSEE_LOCAL_HTTP_WORKER_PORT);
+ }
+
+ /**
+ * Authentication Protocol to use
+ *
+ * @return client/server authentication protocol.
+ */
+ public static String getAuthenticationProtocol() {
+ return getProperty(OSEE_AUTHENTICATION_PROTOCOL);
+ }
+
+ /**
+ * <pre>
+ * Sets the application server address and port to use. This system property sets the URL used to reference
+ * the application server. Arbitration is bypassed.
+ * </pre>
+ *
+ * <b>Format: </b> <code>http://address:port</code>
+ *
+ * @param application server URL to use instead going through the arbitration server
+ */
+ public static void setOseeApplicationServer(String value) {
+ System.setProperty(OSEE_APPLICATION_SERVER, value);
+ }
+
+ /**
+ * <pre>
+ * Retrieves the application server address and port to use. When specified, this system property sets the URL used to reference
+ * the application server. Arbitration is bypassed.
+ * </pre>
+ *
+ * <b>Format: </b> <code>http://address:port</code>
+ *
+ * @return application server URL to use instead going through the arbitration server
+ */
+ public static String getOseeApplicationServer() {
+ return getProperty(OSEE_APPLICATION_SERVER);
+ }
+
+ /**
+ * <pre>
+ * Retrieves the arbitration server address and port to use. This system property must be specified for the system to
+ * gain access to OSEE data. If the application server property is set then that address takes precedence and
+ * arbitration is bypassed.
+ * </pre>
+ *
+ * <b>Format: </b> <code>http://address:port</code>
+ *
+ * @return default arbitration server URL to set preferences.
+ */
+ public static String getOseeArbitrationServer() {
+ return getProperty(OSEE_ARBITRATION_SERVER);
+ }
+
+ private static String getProperty(String name) {
+ return getProperty(name, "");
+ }
+
+ private static String getProperty(String name, String defaultValue) {
+ String toReturn = null;
+ if (instance.overwriteProperties.containsKey(name)) {
+ toReturn = instance.overwriteProperties.getProperty(name);
+ } else if (instance.defaultProperties.containsKey(name)) {
+ toReturn = System.getProperty(name, instance.defaultProperties.getProperty(name));
+ } else {
+ toReturn = System.getProperty(name, defaultValue);
+ }
+ return toReturn;
+ }
+
+ /**
+ * 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();
+ }
+
+ public void initialize() {
+ BundleContext context = CoreClientActivator.getBundleContext();
+ for (Bundle bundle : context.getBundles()) {
+ Dictionary<?, ?> header = bundle.getHeaders();
+ if (header != null) {
+ String data = (String) header.get(HEADER_TAG);
+ if (Strings.isValid(data)) {
+ String[] entries = data.split(",");
+ for (String entry : entries) {
+ int index = entry.indexOf(';');
+ if (index != -1) {
+ String resourcePath = entry.substring(0, index);
+ String flagString = entry.substring(index + 1, entry.length());
+ processInitializer(bundle, resourcePath, InitializerFlag.fromString(flagString));
+ } else {
+ processInitializer(bundle, entry, InitializerFlag.client_defaults);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void processInitializer(Bundle bundle, String resourcePath, InitializerFlag flag) {
+ URL url = bundle.getResource(resourcePath);
+ if (url != null) {
+ Properties properties = new Properties();
+ try {
+ properties.loadFromXML(url.openStream());
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex.toString(), ex);
+ }
+ if (!properties.isEmpty()) {
+ OseeLog.log(CoreClientActivator.class, Level.INFO, String.format("Initializing properties [%s]", flag));
+
+ Properties itemToSet = null;
+ switch (flag) {
+ case client_defaults:
+ itemToSet = defaultProperties;
+ break;
+ case overwrite_settings:
+ itemToSet = overwriteProperties;
+ // Set System properties. Also cache the values to prevent application overwrites.
+ for (Entry<Object, Object> entry : properties.entrySet()) {
+ System.setProperty((String) entry.getKey(), (String) entry.getValue());
+ }
+ break;
+ }
+
+ if (itemToSet != null) {
+ itemToSet.putAll(properties);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientSession.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientSession.java
new file mode 100644
index 00000000000..feb4d4841ac
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/OseeClientSession.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.framework.core.client;
+
+import java.io.Serializable;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeClientSession implements Serializable {
+
+ private static final long serialVersionUID = 6322394150666846304L;
+
+ private String id;
+ private String machineName;
+ private String userId;
+ private String machineIp;
+ private String clientVersion;
+ private String authenticationProtocol;
+ private int port;
+
+ public OseeClientSession(String id, String machineName, String userId, String machineIp, int port, String clientVersion, String authenticationProtocol) {
+ this.id = id;
+ this.machineName = machineName;
+ this.machineIp = machineIp;
+ this.userId = userId;
+ this.clientVersion = clientVersion;
+ this.port = port;
+ this.authenticationProtocol = authenticationProtocol;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "Session:[%s] User Id:[%s] Version:[%s] Machine Name:[%s] Ip:[%s] Port:[%s] AuthenticationProtocol:[%s]",
+ id, userId, clientVersion, machineName, machineIp, port, authenticationProtocol);
+ }
+
+ public String getAuthenticationProtocol() {
+ return authenticationProtocol;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * @return the client version
+ */
+ public String getVersion() {
+ return clientVersion;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return the machineName
+ */
+ public String getMachineName() {
+ return machineName;
+ }
+
+ /**
+ * @return the userId
+ */
+ public String getUserId() {
+ return userId;
+ }
+
+ /**
+ * @return the machineIp
+ */
+ public String getMachineIp() {
+ return machineIp;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/ClientDatabaseProvider.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/ClientDatabaseProvider.java
new file mode 100644
index 00000000000..9c1732d6ed3
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/ClientDatabaseProvider.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.framework.core.client.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ClientDatabaseProvider implements IApplicationDatabaseInfoProvider {
+
+ private static final String NAME = "Client Data Source";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider#getDatabaseInfo()
+ */
+ @Override
+ public IDatabaseInfo getDatabaseInfo() throws OseeAuthenticationRequiredException {
+ IDatabaseInfo databaseInfo = null;
+ try {
+ databaseInfo = InternalClientSessionManager.getInstance().getDatabaseInfo();
+ OseeLog.reportStatus(new BaseStatus(NAME, Level.INFO, "%s [%s as %s]", databaseInfo.getDriver(),
+ databaseInfo.getDatabaseName(), databaseInfo.getDatabaseLoginName()));
+ } catch (OseeAuthenticationRequiredException ex) {
+ OseeLog.reportStatus(new BaseStatus(NAME, Level.SEVERE, ex, "Error obtaining database connection."));
+ throw ex;
+ }
+ return databaseInfo;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider#getPriority()
+ */
+ @Override
+ public int getPriority() {
+ return -1;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/CorePreferenceInitializer.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/CorePreferenceInitializer.java
new file mode 100644
index 00000000000..225e076a633
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/CorePreferenceInitializer.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.framework.core.client.internal;
+
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.CorePreferences;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CorePreferenceInitializer extends AbstractPreferenceInitializer {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+ */
+ public void initializeDefaultPreferences() {
+ Preferences store = CoreClientActivator.getInstance().getPluginPreferences();
+ try {
+ String defaultNetworkValue = Network.getValidIP().getHostAddress();
+ store.setDefault(CorePreferences.INETADDRESS_KEY, defaultNetworkValue);
+ String value = store.getString(CorePreferences.INETADDRESS_KEY);
+ if (!Strings.isValid(value)) {
+ store.setValue(CorePreferences.INETADDRESS_KEY, store.getDefaultString(CorePreferences.INETADDRESS_KEY));
+ }
+ } catch (UnknownHostException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Error initializing default inet address key", ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/InternalClientSessionManager.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/InternalClientSessionManager.java
new file mode 100644
index 00000000000..66dd79b849d
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/InternalClientSessionManager.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.BaseCredentialProvider;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.GuestCredentialProvider;
+import org.eclipse.osee.framework.core.client.ICredentialProvider;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.core.client.OseeClientSession;
+import org.eclipse.osee.framework.core.client.server.HttpServer;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeClientInfo;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.data.OseeSessionGrant;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InternalClientSessionManager {
+ public static final String STATUS_ID = "Session Manager";
+ private static final InternalClientSessionManager instance = new InternalClientSessionManager();
+
+ private final OseeClientInfo clientInfo;
+ private OseeSessionGrant oseeSessionGrant;
+ private OseeClientSession oseeSession;
+
+ private InternalClientSessionManager() {
+ clearData();
+ this.clientInfo = new OseeClientInfo();
+ clientInfo.setClientAddress(HttpServer.getServerAddressForExternalCommunication(),
+ HttpServer.getDefaultServicePort());
+ clientInfo.setClientVersion(OseeCodeVersion.getVersion());
+ try {
+ clientInfo.setClientMachineName(InetAddress.getLocalHost().getHostName());
+ } catch (Exception ex) {
+ clientInfo.setClientMachineName(clientInfo.getClientAddress());
+ }
+ }
+
+ public static InternalClientSessionManager getInstance() {
+ return instance;
+ }
+
+ public boolean isSessionValid() {
+ return oseeSession != null;
+ }
+
+ public IDatabaseInfo getDatabaseInfo() throws OseeAuthenticationRequiredException {
+ return getOseeSessionGrant().getDatabaseInfo();
+ }
+
+ public OseeSessionGrant getOseeSessionGrant() throws OseeAuthenticationRequiredException {
+ ensureSessionCreated();
+ if (isSessionValid()) {
+ return oseeSessionGrant;
+ }
+ throw new OseeAuthenticationRequiredException("Session is invalid - authentication is required");
+ }
+
+ public OseeClientSession getOseeSession() throws OseeAuthenticationRequiredException {
+ ensureSessionCreated();
+ if (isSessionValid()) {
+ return oseeSession;
+ }
+ throw new OseeAuthenticationRequiredException("Session is invalid - authentication is required");
+ }
+
+ public void authenticateAsGuest() throws OseeCoreException {
+ authenticate(new GuestCredentialProvider());
+ }
+
+ public synchronized OseeClientSession authenticate(ICredentialProvider credentialProvider) throws OseeCoreException {
+ if (!isSessionValid()) {
+ try {
+ OseeCredential credential = credentialProvider.getCredential();
+ clearData();
+ oseeSessionGrant = internalAcquireSession(credential);
+ oseeSession =
+ new OseeClientSession(oseeSessionGrant.getSessionId(), clientInfo.getClientMachineName(),
+ oseeSessionGrant.getOseeUserInfo().getUserID(), clientInfo.getClientAddress(),
+ clientInfo.getPort(), clientInfo.getVersion(), credential.getAuthenticationProtocol());
+ } catch (OseeCoreException ex) {
+ OseeLog.reportStatus(new BaseStatus(STATUS_ID, Level.SEVERE, ex));
+ throw ex;
+ }
+ OseeLog.reportStatus(new BaseStatus(STATUS_ID, Level.INFO, "%s", oseeSession));
+ }
+ return oseeSession;
+ }
+
+ public void ensureSessionCreated() {
+ if (!isSessionValid()) {
+ try {
+ authenticate(new BaseCredentialProvider() {
+ @Override
+ public OseeCredential getCredential() throws OseeCoreException {
+ OseeCredential credential = super.getCredential();
+ credential.setUserName(System.getProperty("user.name"));
+ credential.setDomain("");
+ credential.setPassword("");
+ credential.setAuthenticationProtocol(OseeClientProperties.getAuthenticationProtocol());
+ return credential;
+ }
+ });
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ try {
+ authenticateAsGuest();
+ } catch (Exception ex1) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex1);
+ }
+ }
+ }
+ }
+
+ public void releaseSession() throws OseeCoreException {
+ if (isSessionValid()) {
+ internalReleaseSession(getOseeSessionGrant().getSessionId());
+ }
+ }
+
+ private void internalReleaseSession(String sessionId) throws OseeDataStoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("operation", "release");
+ parameters.put("sessionId", sessionId);
+ try {
+ String url =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.SESSION_CONTEXT, parameters);
+ String reponse = HttpProcessor.post(new URL(url));
+ OseeLog.log(CoreClientActivator.class, Level.INFO, reponse);
+ oseeSession = null;
+ oseeSessionGrant = null;
+ } catch (Exception ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public List<String> getAuthenticationProtocols() {
+ List<String> toReturn = new ArrayList<String>();
+ try {
+ Map<String, String> parameters = new HashMap<String, String>();
+ String url =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.SESSION_CONTEXT, parameters);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ AcquireResult result = HttpProcessor.acquire(new URL(url), outputStream);
+ if (result.getCode() == HttpURLConnection.HTTP_OK) {
+ String protocols = outputStream.toString("UTF-8");
+ if (Strings.isValid(protocols)) {
+ String[] results = protocols.split("[\\[\\]\\s,]+");
+ for (String entry : results) {
+ if (Strings.isValid(entry)) {
+ toReturn.add(entry);
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ return toReturn;
+ }
+
+ private void clearData() {
+ this.oseeSession = null;
+ this.oseeSessionGrant = null;
+ }
+
+ private OseeSessionGrant internalAcquireSession(OseeCredential credential) throws OseeCoreException {
+ OseeSessionGrant session = null;
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("operation", "create");
+ String url = null;
+ try {
+ url = HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.SESSION_CONTEXT, parameters);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ AcquireResult result =
+ HttpProcessor.post(new URL(url), asInputStream(credential), "text/xml", "UTF-8", outputStream);
+ if (result.getCode() == HttpURLConnection.HTTP_ACCEPTED) {
+ session = fromEncryptedBytes(outputStream.toByteArray());
+ }
+ } catch (IOException ex) {
+ throw new OseeAuthenticationException(url, ex);
+ }
+ return session;
+ }
+
+ private static ByteArrayInputStream asInputStream(OseeCredential credential) throws OseeWrappedException {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ credential.write(outputStream);
+
+ //TODO ENCRYPT DATA
+
+ return new ByteArrayInputStream(outputStream.toByteArray());
+ }
+
+ private static OseeSessionGrant fromEncryptedBytes(byte[] rawData) throws OseeWrappedException {
+ OseeSessionGrant session = null;
+ InputStream inputStream = null;
+ try {
+ //TODO DECRYPT DATA
+ inputStream = new ByteArrayInputStream(rawData);
+ session = OseeSessionGrant.fromXml(inputStream);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ return session;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/OseeApplicationServer.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/OseeApplicationServer.java
new file mode 100644
index 00000000000..b2785b58eb9
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/internal/OseeApplicationServer.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client.internal;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.data.OseeServerInfo;
+import org.eclipse.osee.framework.core.exception.OseeArbitrationServerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeApplicationServer {
+
+ private static String oseeServer = null;
+ private static boolean isServerAlive = false;
+ private static OseeServerInfo serverInfo = null;
+ private static final String ArbitrationService = "Arbitration Server";
+ private static final String ApplicationServer = "Application Server";
+
+ private OseeApplicationServer() {
+ }
+
+ public static String getOseeApplicationServer() throws OseeArbitrationServerException {
+ checkAndUpdateStatus();
+ if (Strings.isValid(oseeServer) != true) {
+ throw new OseeArbitrationServerException("Invalid resource server address");
+ }
+ return oseeServer;
+ }
+
+ public static boolean isApplicationServerAlive() {
+ checkAndUpdateStatus();
+ return isServerAlive;
+ }
+
+ private static void checkAndUpdateStatus() {
+ isServerAlive = false;
+ if (serverInfo == null) {
+ String overrideValue = OseeClientProperties.getOseeApplicationServer();
+ if (Strings.isValid(overrideValue)) {
+ serverInfo = fromString(overrideValue);
+ } else {
+ serverInfo = getOseeServerAddress();
+ }
+ if (serverInfo != null) {
+ oseeServer = String.format("http://%s:%s/", serverInfo.getServerAddress(), serverInfo.getPort());
+ }
+ }
+ DateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
+ if (serverInfo == null) {
+ OseeLog.reportStatus(new BaseStatus(ApplicationServer, Level.SEVERE, "Application server address was null"));
+ } else {
+ isServerAlive = HttpProcessor.isAlive(serverInfo.getServerAddress(), serverInfo.getPort());
+ if (isServerAlive) {
+ OseeLog.reportStatus(new BaseStatus(ApplicationServer, Level.INFO, "%s %s Running Since: %s", oseeServer,
+ Arrays.deepToString(serverInfo.getVersion()), format.format(serverInfo.getDateStarted())));
+ } else {
+ OseeLog.reportStatus(new BaseStatus(ApplicationServer, Level.SEVERE, "Unable to Connect to [%s]",
+ oseeServer));
+ }
+ }
+ }
+
+ public static OseeServerInfo fromString(String value) {
+ Pattern pattern = Pattern.compile("http://(.*):(\\d+)");
+ Matcher matcher = pattern.matcher(value);
+ if (matcher.find()) {
+ String address = matcher.group(1);
+ int port = Integer.valueOf(matcher.group(2));
+ return new OseeServerInfo("OVERRIDE", address, port, new String[] {"OVERRIDE"}, new Timestamp(
+ new Date().getTime()), true);
+ }
+ return null;
+ }
+
+ private static OseeServerInfo getOseeServerAddress() {
+ OseeServerInfo oseeServerInfo = null;
+ ByteArrayOutputStream outputStream = null;
+ InputStream inputStream = null;
+ try {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("version", OseeCodeVersion.getVersion());
+ String url =
+ HttpUrlBuilder.getInstance().getOsgiArbitrationServiceUrl(OseeServerContext.LOOKUP_CONTEXT, parameters);
+
+ outputStream = new ByteArrayOutputStream();
+ AcquireResult result = HttpProcessor.acquire(new URL(url), outputStream);
+ try {
+ OseeLog.reportStatus(new BaseStatus(ArbitrationService, Level.INFO, "%s",
+ HttpUrlBuilder.getInstance().getArbitrationServerPrefix()));
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ if (result.getCode() == HttpURLConnection.HTTP_OK) {
+ inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+ oseeServerInfo = OseeServerInfo.fromXml(inputStream);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ OseeLog.reportStatus(new BaseStatus(ArbitrationService, Level.SEVERE, ex,
+ "Error requesting application server for version [%s]", OseeCodeVersion.getVersion()));
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ }
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return oseeServerInfo;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpGetMethod.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpGetMethod.java
new file mode 100644
index 00000000000..260ed1fbc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpGetMethod.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.framework.core.client.server;
+
+import java.util.List;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class HttpGetMethod implements IHttpMethod {
+
+ private static ExtensionDefinedObjects<IHttpServerRequest> extensionObjects = null;
+
+ protected HttpGetMethod() {
+ }
+
+ public void processRequest(HttpRequest httpRequest, HttpResponse httpResponse) {
+ String requestType = httpRequest.getUrlRequest();
+ if (extensionObjects == null) {
+ extensionObjects =
+ new ExtensionDefinedObjects<IHttpServerRequest>(
+ "org.eclipse.osee.framework.skynet.core.HttpServerRequest", "IHttpServerRequest", "classname");
+ }
+ List<IHttpServerRequest> httpServerRequests = extensionObjects.getObjects();
+ for (IHttpServerRequest request : httpServerRequests) {
+ if (request.getRequestType().equals(requestType)) {
+ request.processRequest(httpRequest, httpResponse);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequest.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequest.java
new file mode 100644
index 00000000000..ea669026c84
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequest.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client.server;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.URLDecoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpRequest {
+
+ public enum HttpMethod {
+ GET, POST, PUT, DELETE, RESOURCE_GET, INVALID;
+ }
+ private Map<String, String> parameterMap;
+ private String rawRequest;
+ private String urlRequest;
+ private Map<String, String> httpHeader;
+ private String httpProtocol;
+ private InputStream inputStream;
+ private HttpMethod httpMethod;
+ private InetAddress remoteAddress;
+ private int remotePort;
+ private Socket socket;
+
+ protected HttpRequest(Socket socket) throws Exception {
+ this.socket = socket;
+ this.parameterMap = new HashMap<String, String>();
+ this.rawRequest = "";
+ this.urlRequest = "";
+ this.httpHeader = new HashMap<String, String>();
+ this.httpMethod = HttpMethod.INVALID;
+
+ this.inputStream = new BufferedInputStream(socket.getInputStream());
+ this.remoteAddress = socket.getInetAddress();
+ this.remotePort = socket.getPort();
+ initialize();
+ }
+
+ private void initialize() throws Exception {
+ InputStream inputStream = getInputStream();
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ int value = -1;
+ char lastChar = 0;
+ char currChar = 0;
+ while ((value = inputStream.read()) != -1) {
+ currChar = (char) value;
+ if (currChar != '\n' && currChar != '\r') {
+ buffer.write((byte) value);
+ }
+
+ if (lastChar == '\r' && currChar == '\n') {
+ String toProcess = buffer.toString("ISO-8859-1");
+ buffer.reset();
+ if (Strings.isValid(toProcess)) {
+ if (toProcess.contains("HTTP")) {
+ parseRequest(toProcess);
+ } else {
+ parseHeader(toProcess);
+ }
+
+ } else {
+ break;
+ }
+ }
+ lastChar = currChar;
+ }
+ }
+
+ private void parseHeader(String line) throws Exception {
+ Matcher matcher = Pattern.compile("(.*?):\\s*(.*)").matcher(line);
+ if (matcher.matches()) {
+ httpHeader.put(matcher.group(1), matcher.group(2));
+ }
+ }
+
+ public String getParameter(String key) {
+ String toReturn = parameterMap.get(key);
+ return Strings.isValid(toReturn) ? toReturn : "";
+ }
+
+ public Set<String> getParameterKeys() {
+ return parameterMap.keySet();
+ }
+
+ public String getParametersAsString() {
+ return parameterMap.toString();
+ }
+
+ public Map<String, String> getParameters() {
+ return parameterMap;
+ }
+
+ public InputStream getInputStream() {
+ return inputStream;
+ }
+
+ public HttpMethod getMethod() {
+ return httpMethod;
+ }
+
+ public InetAddress getOriginatingAddress() {
+ return remoteAddress;
+ }
+
+ public int getOriginatingPort() {
+ return remotePort;
+ }
+
+ public String getHttpHeaderEntry(String key) {
+ String toReturn = httpHeader.get(key);
+ return Strings.isValid(toReturn) ? toReturn : "";
+ }
+
+ public Set<String> getHttpHeaderKeys() {
+ return httpHeader.keySet();
+ }
+
+ public String getHttpProtocol() {
+ return httpProtocol;
+ }
+
+ public String getUrlRequest() {
+ return urlRequest;
+ }
+
+ public String getRawRequest() {
+ return rawRequest;
+ }
+
+ public Socket getSocket() {
+ return socket;
+ }
+
+ private void parseRequest(String entry) throws Exception {
+ this.rawRequest = entry;
+ OseeLog.log(CoreClientActivator.class, Level.INFO, "HttpRequest *" + rawRequest + "*");
+ String[] entries = rawRequest.split("\\s");
+ if (entries.length > 0 && entries.length < 4) {
+ httpMethod = HttpMethod.valueOf(entries[0].trim());
+ httpProtocol = entries[2].trim();
+
+ String request = entries[1].trim();
+ boolean wasOldStyle = parseOldSchoolStyleLinks(request);
+ if (wasOldStyle == false) {
+ parseNewStyleRequests(request);
+ }
+ }
+ }
+
+ /**
+ * Process new style requests are of the following format:
+ * http://127.0.0.1:<port>/<ProcessType>?key1=value1&key2=value2...&key3=value3
+ *
+ * @param entry
+ * @throws Exception
+ */
+ private void parseNewStyleRequests(String request) throws Exception {
+ String noHostStr = request.replaceFirst("^http:\\/\\/(.*?)\\/", "/");
+ Matcher matcher = Pattern.compile("/(.*?)\\?(.*)").matcher(noHostStr);
+ if (matcher.matches()) {
+ urlRequest = matcher.group(1);
+
+ if (!Strings.isValid(urlRequest)) {
+ throw new IllegalArgumentException("Unknown requestType \"" + rawRequest + "\"");
+ }
+ String data = matcher.group(2);
+ Matcher dataMatcher = Pattern.compile("([^&]*?)=([^&]*)").matcher(data);
+ while (dataMatcher.find()) {
+ parameterMap.put(dataMatcher.group(1), URLDecoder.decode(dataMatcher.group(2), "UTF-8"));
+ }
+ } else {
+ if (httpMethod.equals(HttpMethod.GET)) {
+ httpMethod = HttpMethod.RESOURCE_GET;
+ }
+ urlRequest = request;
+ }
+ }
+
+ /**
+ * Process old format: http://127.0.0.1:<port>/get/guid/<guid>/<ats,Define> TODO old format should be removed once
+ * all legacy references are change to new format
+ *
+ * @param entry
+ * @return
+ * @throws Exception
+ */
+ private boolean parseOldSchoolStyleLinks(String entry) throws Exception {
+ boolean handled = false;
+ Matcher oldMatcher = Pattern.compile("/(.*?)/guid/(.*?)/(.*)").matcher(entry);
+ if (oldMatcher.find()) {
+ handled = true;
+ String guid = oldMatcher.group(2);
+ if (oldMatcher.groupCount() > 2) {
+ String processType = oldMatcher.group(3);
+ if (processType.equals("ats")) {
+ parameterMap.put("guid", guid);
+ urlRequest = processType.toUpperCase();
+ } else if (processType.equals("Define") || processType.equals("")) {
+ parameterMap.put("guid", guid);
+ urlRequest = "Define";
+ } else {
+ throw new IllegalArgumentException("Unnable to parse old style link: \"" + rawRequest + "\"");
+ }
+ }
+ }
+ return handled;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequestHandler.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequestHandler.java
new file mode 100644
index 00000000000..f0d552fa99c
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpRequestHandler.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.framework.core.client.server;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.server.HttpRequest.HttpMethod;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpRequestHandler implements Runnable {
+
+ private static Map<HttpMethod, IHttpMethod> httpMethodHandlers;
+ static {
+ httpMethodHandlers = new HashMap<HttpMethod, IHttpMethod>();
+ httpMethodHandlers.put(HttpMethod.RESOURCE_GET, HttpResourceRequest.getInstance());
+ httpMethodHandlers.put(HttpMethod.GET, new HttpGetMethod());
+ }
+ private Socket socket;
+
+ public HttpRequestHandler(Socket socket) throws Exception {
+ this.socket = socket;
+ }
+
+ public void run() {
+ try {
+ processRequest();
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Error Processing Request: ", ex);
+ }
+ }
+
+ private void processRequest() throws Exception {
+ HttpRequest httpRequest = null;
+ HttpResponse httpResponse = null;
+ try {
+ httpRequest = new HttpRequest(socket);
+ httpResponse = new HttpResponse(socket);
+
+ try {
+ processRequest(httpRequest, httpResponse);
+ } catch (Exception ex) {
+ httpResponse.outputStandardError(400, "Exception in processing Request ", ex);
+ }
+ } finally {
+ // Close streams and socket.
+ if (httpResponse != null && httpResponse.getOutputStream() != null) {
+ httpResponse.getOutputStream().close();
+ }
+ if (httpRequest != null && httpRequest.getInputStream() != null) {
+ httpRequest.getInputStream().close();
+ }
+
+ if (socket != null && !socket.isClosed()) {
+ socket.close();
+ }
+ }
+ }
+
+ private void processRequest(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
+ IHttpMethod httpMethod = httpMethodHandlers.get(httpRequest.getMethod());
+ if (httpMethod != null) {
+ httpMethod.processRequest(httpRequest, httpResponse);
+ } else {
+ httpResponse.sendResponseHeaders(405, 0);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResourceRequest.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResourceRequest.java
new file mode 100644
index 00000000000..a16779fd1e4
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResourceRequest.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.framework.core.client.server;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.net.URL;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpResourceRequest implements IHttpMethod {
+
+ private static HttpResourceRequest instance = new HttpResourceRequest();
+
+ private HttpResourceRequest() {
+ }
+
+ public static HttpResourceRequest getInstance() {
+ return instance;
+ }
+
+ public void processRequest(HttpRequest httpRequest, HttpResponse httpResponse) {
+ String urlRequest = httpRequest.getUrlRequest();
+ URL url = findResource(urlRequest);
+ if (url != null) {
+ sendResource(url, httpResponse.getOutputStream());
+ } else {
+ httpResponse.outputStandardError(400, "Invalid Request: *" + urlRequest + "*");
+ }
+ }
+
+ private void sendResource(URL url, OutputStream outputStream) {
+ BufferedInputStream bis = null;
+ try {
+ bis = new BufferedInputStream(url.openStream());
+ PrintStream ps = new PrintStream(outputStream, true, "UTF-8");
+ byte[] buffer = new byte[1024];
+ int count;
+ while ((count = bis.read(buffer)) != -1) {
+ ps.write(buffer, 0, count);
+ }
+ } catch (IOException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Error sending requested resource", ex);
+ } finally {
+ try {
+ bis.close();
+ } catch (IOException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Error closing stream", ex);
+ }
+ }
+ }
+
+ private URL findResource(String urlRequested) {
+ URL resource = null;
+ if (Strings.isValid(urlRequested) && urlRequested.endsWith("/") != true) {
+ if (resource == null) {
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements("org.eclipse.osee.framework.skynet.core.WebPage",
+ "WebPageFolder");
+ for (IConfigurationElement element : elements) {
+ String resourceName = element.getAttribute("Path");
+ String bundleName = element.getContributor().getName();
+
+ if (Strings.isValid(bundleName) && Strings.isValid(resourceName)) {
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ URL url = bundle.getEntry(resourceName + urlRequested);
+ if (url != null) {
+ resource = FileLocator.resolve(url);
+ break;
+ }
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(String.format("Unable to Load: [%s.%s]", bundleName,
+ resourceName));
+ }
+ }
+ }
+ }
+ }
+ return resource;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResponse.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResponse.java
new file mode 100644
index 00000000000..b31e18b0e78
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpResponse.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client.server;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.Socket;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpResponse {
+ private static final String ENTRY_SEPARATOR = "\r\n";
+ private static final String FIELD_VALUE_SEPARATOR = ": ";
+ private static final String STATUS_LINE = "HTTP/1.1 ";
+ private static final String SERVER_ENTRY = "Server: SkynetHttpServer";
+ private static final String DATE_ENTRY = "Date";
+ private static final String CONTENT_LENGTH = "Content-Length";
+ private static final String CONTENT_ENCODING = "Content-Encoding";
+ private static final String CONTENT_TYPE = "Content-Type";
+ private static final String CONTENT_DISPOSITION = "Content-Disposition";
+
+ private static Map<Integer, String> codes;
+ static {
+ HttpResponse.codes = new HashMap<Integer, String>();
+ codes.put(100, StatusCodes.STATUS_100);
+ codes.put(101, StatusCodes.STATUS_101);
+ codes.put(200, StatusCodes.STATUS_200);
+ codes.put(201, StatusCodes.STATUS_201);
+ codes.put(202, StatusCodes.STATUS_202);
+ codes.put(203, StatusCodes.STATUS_203);
+ codes.put(204, StatusCodes.STATUS_204);
+ codes.put(205, StatusCodes.STATUS_205);
+ codes.put(206, StatusCodes.STATUS_206);
+ codes.put(300, StatusCodes.STATUS_300);
+ codes.put(301, StatusCodes.STATUS_301);
+ codes.put(302, StatusCodes.STATUS_302);
+ codes.put(303, StatusCodes.STATUS_303);
+ codes.put(304, StatusCodes.STATUS_304);
+ codes.put(305, StatusCodes.STATUS_305);
+ codes.put(307, StatusCodes.STATUS_307);
+ codes.put(401, StatusCodes.STATUS_401);
+ codes.put(402, StatusCodes.STATUS_402);
+ codes.put(403, StatusCodes.STATUS_403);
+ codes.put(404, StatusCodes.STATUS_404);
+ codes.put(405, StatusCodes.STATUS_405);
+ codes.put(406, StatusCodes.STATUS_406);
+ codes.put(407, StatusCodes.STATUS_407);
+ codes.put(408, StatusCodes.STATUS_408);
+ codes.put(409, StatusCodes.STATUS_409);
+ codes.put(410, StatusCodes.STATUS_410);
+ codes.put(411, StatusCodes.STATUS_411);
+ codes.put(412, StatusCodes.STATUS_412);
+ codes.put(413, StatusCodes.STATUS_413);
+ codes.put(414, StatusCodes.STATUS_414);
+ codes.put(415, StatusCodes.STATUS_415);
+ codes.put(416, StatusCodes.STATUS_416);
+ codes.put(417, StatusCodes.STATUS_417);
+ codes.put(500, StatusCodes.STATUS_500);
+ codes.put(501, StatusCodes.STATUS_501);
+ codes.put(502, StatusCodes.STATUS_502);
+ codes.put(503, StatusCodes.STATUS_503);
+ codes.put(504, StatusCodes.STATUS_504);
+ codes.put(505, StatusCodes.STATUS_505);
+ codes.put(400, StatusCodes.STATUS_400);
+ }
+
+ private Map<String, String> responseHeaderMap;
+ private PrintStream printStream;
+ private OutputStream outputStream;
+ private Socket socket;
+
+ protected HttpResponse(Socket socket) throws Exception {
+ this.socket = socket;
+ this.outputStream = socket.getOutputStream();
+ this.responseHeaderMap = new LinkedHashMap<String, String>();
+ this.printStream = new PrintStream(outputStream, true, "UTF-8");
+ }
+
+ public OutputStream getOutputStream() {
+ return outputStream;
+ }
+
+ public PrintStream getPrintStream() {
+ return printStream;
+ }
+
+ public void setContentEncoding(String encoding) {
+ setReponseHeader(CONTENT_ENCODING, encoding);
+ }
+
+ public void setContentType(String contentType) {
+ setReponseHeader(CONTENT_TYPE, contentType);
+ }
+
+ public void setContentDisposition(String disposition) {
+ setReponseHeader(CONTENT_DISPOSITION, disposition);
+ }
+
+ public void setReponseHeader(String field, String value) {
+ responseHeaderMap.put(field, value);
+ }
+
+ public String getResponseHeaderField(String field) {
+ String toReturn = responseHeaderMap.get(field);
+ return Strings.isValid(toReturn) ? toReturn : "";
+ }
+
+ public Set<String> getResponseHeaderFields() {
+ return responseHeaderMap.keySet();
+ }
+
+ public static String getStatus(int value) {
+ return codes.get(value);
+ }
+
+ public String getResponseHeader(int errorCode, long responseLength) {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(STATUS_LINE);
+ buffer.append(getStatus(errorCode));
+ buffer.append(ENTRY_SEPARATOR);
+
+ buffer.append(SERVER_ENTRY);
+ buffer.append(ENTRY_SEPARATOR);
+
+ buffer.append(DATE_ENTRY);
+ buffer.append(FIELD_VALUE_SEPARATOR);
+ buffer.append(new Date().toString());
+ buffer.append(ENTRY_SEPARATOR);
+
+ Set<String> fields = responseHeaderMap.keySet();
+ for (String field : fields) {
+ String values = responseHeaderMap.get(field);
+ buffer.append(field);
+ buffer.append(FIELD_VALUE_SEPARATOR);
+ buffer.append(values);
+ buffer.append(ENTRY_SEPARATOR);
+ }
+ buffer.append(ENTRY_SEPARATOR);
+ return buffer.toString();
+ }
+
+ public void sendResponseHeaders(int errorCode, long responseLength) throws IOException {
+ setReponseHeader(CONTENT_LENGTH, Long.toString(responseLength));
+ byte[] header = getResponseHeader(errorCode, responseLength).getBytes();
+ sendInputStream(new ByteArrayInputStream(header));
+ }
+
+ public void sendBody(InputStream inputStream) throws IOException {
+ sendInputStream(inputStream);
+ }
+
+ private void sendInputStream(InputStream inputStream) throws IOException {
+ byte[] buf = new byte[10000];
+ int count = -1;
+ while ((count = inputStream.read(buf)) != -1) {
+ outputStream.write(buf, 0, count);
+ }
+ inputStream.close();
+ }
+
+ public void outputStandardError(int errorCode, String message, Throwable ex) {
+ StringWriter sw = new StringWriter();
+ if (ex != null) {
+ ex.printStackTrace(new PrintWriter(sw));
+ }
+ outputStandardError(errorCode, message + sw.toString());
+ }
+
+ public void outputStandardError(int errorCode, String reason) {
+ String errorStr = getStatus(errorCode);
+ String reasonStr = (reason != null ? "Reason: " + reason : "");
+ String html =
+ AHTML.simplePage("<h1>Error " + errorStr + "</h1><h2>OSEE was unable to handle the request.</h2>" + reasonStr + "<form><input type=button onClick='window.opener=self;window.close()' value='Close'></form>");
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "HttpServer Request failed. " + reasonStr);
+ try {
+ printStream.println(html);
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Error sending error string", ex);
+ }
+ }
+
+ public Socket getSocket() {
+ return socket;
+ }
+
+ private final class StatusCodes {
+ private static final String STATUS_100 = "100 Continue";
+ private static final String STATUS_101 = "101 Switching Protocols";
+ private static final String STATUS_200 = "200 OK";
+ private static final String STATUS_201 = "201 Created";
+ private static final String STATUS_202 = "202 Accepted";
+ private static final String STATUS_203 = "203 Non-Authoritative Information";
+ private static final String STATUS_204 = "204 No Content";
+ private static final String STATUS_205 = "205 Reset Content";
+ private static final String STATUS_206 = "206 Partial Content";
+ private static final String STATUS_300 = "300 Multiple Choices";
+ private static final String STATUS_301 = "301 Moved Permanently";
+ private static final String STATUS_302 = "302 Found";
+ private static final String STATUS_303 = "303 See Other";
+ private static final String STATUS_304 = "304 Not Modified";
+ private static final String STATUS_305 = "305 Use Proxy";
+ private static final String STATUS_307 = "307 Temporary Redirect";
+ private static final String STATUS_400 = "400 Bad Request";
+ private static final String STATUS_401 = "401 Unauthorized";
+ private static final String STATUS_402 = "402 Payment Required";
+ private static final String STATUS_403 = "403 Forbidden";
+ private static final String STATUS_404 = "404 Not Found";
+ private static final String STATUS_405 = "405 Method Not Allowed";
+ private static final String STATUS_406 = "406 Not Acceptable";
+ private static final String STATUS_407 = "407 Proxy Authentication Required";
+ private static final String STATUS_408 = "408 Request Time-out";
+ private static final String STATUS_409 = "409 Conflict";
+ private static final String STATUS_410 = "410 Gone";
+ private static final String STATUS_411 = "411 Length Required";
+ private static final String STATUS_412 = "412 Precondition Failed";
+ private static final String STATUS_413 = "413 Request Entity Too Large";
+ private static final String STATUS_414 = "414 Request-URI Too Large";
+ private static final String STATUS_415 = "415 Unsupported Media Type";
+ private static final String STATUS_416 = "416 Requested range not satisfiable";
+ private static final String STATUS_417 = "417 Expectation Failed";
+ private static final String STATUS_500 = "500 Internal Server Error";
+ private static final String STATUS_501 = "501 Not Implemented";
+ private static final String STATUS_502 = "502 Bad Gateway";
+ private static final String STATUS_503 = "503 Service Unavailable";
+ private static final String STATUS_504 = "504 Gateway Time-out";
+ private static final String STATUS_505 = "505 HTTP Version not supported";
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpServer.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpServer.java
new file mode 100644
index 00000000000..e9cac3fa067
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpServer.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.client.server;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.CorePreferences;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class HttpServer {
+ protected static final String DEFAULT_SERVICE_NAME = "osee.http.server";
+ private static final String LOCALHOST = "localhost";
+
+ private static InternalHttpServer internalHttpServer = null;
+
+ private HttpServer() {
+ }
+
+ public static String getServerAddressForExternalCommunication() {
+ String serverAddress = "";
+ try {
+ serverAddress = CorePreferences.getDefaultInetAddress().getHostAddress();
+ } catch (UnknownHostException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ return serverAddress;
+ }
+
+ public static String getLocalServerAddress() {
+ return LOCALHOST;
+ }
+
+ public static int getDefaultServicePort() {
+ return internalHttpServer != null ? internalHttpServer.getPort() : -1;
+ }
+
+ public synchronized static void startServer(int maxThreads) {
+ if (internalHttpServer == null) {
+ int portToUse = -1;
+ String value = OseeClientProperties.getLocalHttpWorkerPort();
+ if (Strings.isValid(value)) {
+ try {
+ portToUse = Integer.valueOf(value);
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, String.format(
+ "Unable to parse port property - [%s]", value), ex);
+ }
+ }
+
+ if (portToUse <= 0) {
+ try {
+ portToUse = PortUtil.getInstance().getValidPort();
+ } catch (IOException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Unable to get a valid port.");
+ }
+ }
+
+ if (portToUse > 0) {
+ internalHttpServer = new InternalHttpServer(DEFAULT_SERVICE_NAME, portToUse, maxThreads);
+ Thread thread = new Thread(internalHttpServer);
+ thread.setName(String.format("%s:%s", DEFAULT_SERVICE_NAME, portToUse));
+ thread.start();
+ } else {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE,
+ "Unable to get a valid port for osee http local server.");
+ }
+ }
+ }
+
+ public static void stopServer() {
+ if (internalHttpServer != null) {
+ internalHttpServer.haltServer();
+ if (!internalHttpServer.executorService.isShutdown()) {
+ internalHttpServer.executorService.shutdownNow();
+ }
+ }
+ }
+
+ private static final class InternalHttpServer implements Runnable {
+ private final int port;
+ private boolean listenFlag;
+ private ServerSocket listenSocket;
+ private String serviceName;
+ private ExecutorService executorService;
+
+ private InternalHttpServer(String serviceName, int port, int poolSize) {
+ this.listenFlag = true;
+ this.serviceName = serviceName;
+ this.port = port;
+ this.executorService = Executors.newFixedThreadPool(poolSize);
+ }
+
+ public void haltServer() {
+ listenFlag = false;
+ }
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ private String createNameForConnection(Socket incoming) {
+ return String.format("%s:%s - Worker - %s:%s", getServiceName(), getPort(), incoming.getInetAddress(),
+ incoming.getPort());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ listenSocket = new ServerSocket(getPort());
+ OseeLog.log(CoreClientActivator.class, Level.INFO, String.format("Starting HttpServer on port: [%s]",
+ getPort()));
+
+ // Process HTTP service requests in an infinite loop.
+ while (listenFlag) {
+ // Listen for a TCP connection request.
+ listenSocket.setSoTimeout(10000);
+ try {
+ Socket incoming = listenSocket.accept();
+ try {
+ final HttpRequestHandler handler = new HttpRequestHandler(incoming);
+ final String threadName = createNameForConnection(incoming);
+
+ // Process the request in a new thread
+ executorService.execute(new Runnable() {
+ public void run() {
+ Thread thread = Thread.currentThread();
+ String oldName = thread.getName();
+ thread.setName(threadName);
+ try {
+ handler.run();
+ } finally {
+ thread.setName(oldName);
+ }
+ }
+ });
+ } catch (Exception ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, "Error processing request.", ex);
+ }
+ } catch (SocketTimeoutException ex) {
+ /*
+ * this catch statement is hit every 10 seconds since that is the timeout value that
+ * has been set which allows the loop to check if the server should keep running (so
+ * don't log the exception)
+ */
+ }
+ }
+ } catch (IOException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.WARNING, "Unable to start HttpServer, socket may be busy", ex);
+ } finally {
+ executorService.shutdownNow();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpUrlBuilder.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpUrlBuilder.java
new file mode 100644
index 00000000000..4103c9bd953
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/HttpUrlBuilder.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.framework.core.client.server;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.core.client.internal.OseeApplicationServer;
+import org.eclipse.osee.framework.core.exception.OseeArbitrationServerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpUrlBuilder {
+ private static final String urlPrefixFormat = "http://%s:%s/";
+ private static HttpUrlBuilder instance = null;
+
+ private HttpUrlBuilder() {
+ }
+
+ public static HttpUrlBuilder getInstance() {
+ if (instance == null) {
+ instance = new HttpUrlBuilder();
+ }
+ return instance;
+ }
+
+ private String encode(String value) throws UnsupportedEncodingException {
+ return URLEncoder.encode(value, "UTF-8");
+ }
+
+ public String getParametersAsEncodedUrl(Map<String, String> keyValues) throws UnsupportedEncodingException {
+ StringBuilder sb = new StringBuilder();
+ for (String key : keyValues.keySet()) {
+ sb.append(encode(key));
+ sb.append("=");
+ sb.append(encode(keyValues.get(key)));
+ sb.append("&");
+ }
+ if (sb.length() - 1 >= 0) {
+ // Delete the last unnecessary '&'
+ sb.deleteCharAt(sb.length() - 1);
+ }
+ return sb.toString();
+ }
+
+ private String buildUrl(String prefix, String context, String parameters) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(prefix);
+ sb.append(context);
+ sb.append("?");
+ sb.append(parameters);
+ return sb.toString();
+ }
+
+ public String getUrlForLocalSkynetHttpServer(String context, Map<String, String> parameters) throws OseeStateException {
+ try {
+ return buildUrl(getHttpLocalServerPrefix(), context, getParametersAsEncodedUrl(parameters));
+ } catch (UnsupportedEncodingException ex) {
+ OseeLog.log(CoreClientActivator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ public String getHttpLocalServerPrefix() throws OseeStateException {
+ int port = HttpServer.getDefaultServicePort();
+ if (port == -1) {
+ throw new OseeStateException("Http Server was not launched by this workbench - Ensure port was set correctly");
+ }
+ return String.format(urlPrefixFormat, HttpServer.getLocalServerAddress(), port);
+ }
+
+ public String getApplicationServerPrefix() throws OseeDataStoreException, OseeArbitrationServerException {
+ String address = OseeApplicationServer.getOseeApplicationServer();
+ if (address.endsWith("/") != true) {
+ address += "/";
+ }
+ return address;
+ }
+
+ public String getArbitrationServerPrefix() throws OseeDataStoreException {
+ String address = OseeClientProperties.getOseeArbitrationServer();
+ if (address.endsWith("/") != true) {
+ address += "/";
+ }
+ return address;
+ }
+
+ public String getOsgiServletServiceUrl(String context, Map<String, String> parameters) throws OseeDataStoreException {
+ try {
+ return buildUrl(getApplicationServerPrefix(), context, getParametersAsEncodedUrl(parameters));
+ } catch (UnsupportedEncodingException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public String getOsgiArbitrationServiceUrl(String context, Map<String, String> parameters) throws OseeDataStoreException {
+ try {
+ return buildUrl(getArbitrationServerPrefix(), context, getParametersAsEncodedUrl(parameters));
+ } catch (UnsupportedEncodingException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpMethod.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpMethod.java
new file mode 100644
index 00000000000..e9814b4da3c
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpMethod.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.framework.core.client.server;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IHttpMethod {
+
+ /**
+ * @param httpRequest The HttpRequest object
+ * @param httpResponse The HttpResponse object
+ */
+ public void processRequest(HttpRequest httpRequest, HttpResponse httpResponse);
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpServerRequest.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpServerRequest.java
new file mode 100644
index 00000000000..02ebc62303b
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/server/IHttpServerRequest.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.framework.core.client.server;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IHttpServerRequest extends IHttpMethod {
+
+ /**
+ * @return single word request type for use in URL and in determining requestor
+ */
+ public String getRequestType();
+
+ /**
+ * @param httpRequest The HttpRequest object
+ * @param httpResponse The HttpResponse object
+ */
+ public void processRequest(HttpRequest httpRequest, HttpResponse httpResponse);
+
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ProgressMonitorTask.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ProgressMonitorTask.java
new file mode 100644
index 00000000000..29fa93a34aa
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ProgressMonitorTask.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.framework.core.client.task;
+
+import java.sql.Statement;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ProgressMonitorTask extends ScheduledTask {
+ private final IProgressMonitor monitor;
+ private final Statement statement;
+
+ private ProgressMonitorTask(IProgressMonitor monitor, Statement statement, String name) {
+ super(name);
+ this.monitor = monitor;
+ this.statement = statement;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.task.ScheduledTask#innerRun()
+ */
+ @Override
+ protected void innerRun() throws Exception {
+ if (monitor != null) {
+ if (monitor.isCanceled()) {
+ if (statement != null) {
+ statement.cancel();
+ }
+ unscheduleTask();
+ }
+ } else {
+ unscheduleTask();
+ }
+ }
+
+ private void unscheduleTask() {
+ Thread stopThread = new Thread() {
+ public void run() {
+ Scheduler.cancelTask(ProgressMonitorTask.this);
+ }
+ };
+ stopThread.start();
+ }
+
+ public static ScheduledTask monitor(String name, IProgressMonitor monitor, Statement statement, long millis) {
+ ProgressMonitorTask task = new ProgressMonitorTask(monitor, statement, name);
+ Scheduler.scheduleAtFixedRate(task, 0, millis, TimeUnit.MILLISECONDS);
+ return task;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ScheduledTask.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ScheduledTask.java
new file mode 100644
index 00000000000..c2b461d1ddb
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/ScheduledTask.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.framework.core.client.task;
+
+import java.util.concurrent.ScheduledFuture;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class ScheduledTask implements Runnable {
+ private final String name;
+ private ScheduledFuture<ScheduledTask> futureTask;
+
+ protected ScheduledTask(String name) {
+ this.name = name;
+ this.futureTask = null;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public final void run() {
+ try {
+ innerRun();
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ void setScheduledFuture(ScheduledFuture<?> futureTask) {
+ this.futureTask = (ScheduledFuture<ScheduledTask>) futureTask;
+ }
+
+ protected ScheduledFuture<ScheduledTask> getFutureTask() {
+ return futureTask;
+ }
+
+ protected abstract void innerRun() throws Exception;
+
+}
diff --git a/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/Scheduler.java b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/Scheduler.java
new file mode 100644
index 00000000000..f8201f4e5e1
--- /dev/null
+++ b/org.eclipse.osee.framework.core.client/src/org/eclipse/osee/framework/core/client/task/Scheduler.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.framework.core.client.task;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+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;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Scheduler {
+
+ private static final InternalScheduler scheduler = new InternalScheduler();
+
+ private Scheduler() {
+ }
+
+ public static void scheduleAtFixedRate(ScheduledTask command, long initialDelay, long period, TimeUnit unit) {
+ scheduler.scheduleAtFixedRate(command, initialDelay, period, unit);
+ }
+
+ public static void scheduleWithFixedDelay(ScheduledTask command, long initialDelay, long delay, TimeUnit unit) {
+ scheduler.scheduleWithFixedDelay(command, initialDelay, delay, unit);
+ }
+
+ public static void cancelTask(ScheduledTask command) {
+ scheduler.cancelTask(command);
+ }
+
+ public static void shutdown() {
+ scheduler.shutdown();
+ }
+
+ private static final class InternalScheduler {
+ private final Map<Runnable, ScheduledFuture<?>> futures;
+ private final ScheduledExecutorService executor;
+
+ public InternalScheduler() {
+ futures = Collections.synchronizedMap(new HashMap<Runnable, ScheduledFuture<?>>());
+ executor = Executors.newSingleThreadScheduledExecutor(new SchedulerThreadFactory());
+ }
+
+ public void scheduleAtFixedRate(ScheduledTask command, long initialDelay, long period, TimeUnit unit) {
+ ScheduledFuture<?> futureTask = executor.scheduleAtFixedRate(command, initialDelay, period, unit);
+ futures.put(command, futureTask);
+ command.setScheduledFuture(futureTask);
+ }
+
+ public void scheduleWithFixedDelay(ScheduledTask command, long initialDelay, long delay, TimeUnit unit) {
+ ScheduledFuture<?> futureTask = executor.scheduleWithFixedDelay(command, initialDelay, delay, unit);
+ futures.put(command, futureTask);
+ command.setScheduledFuture(futureTask);
+ }
+
+ public void cancelTask(ScheduledTask command) {
+ ScheduledFuture<?> future = futures.get(command);
+ if (future != null) {
+ if (future.cancel(true)) {
+ futures.remove(command);
+ }
+ }
+ }
+
+ public void shutdown() {
+ executor.shutdownNow();
+ }
+ }
+
+ private static final class SchedulerThreadFactory implements ThreadFactory {
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ */
+ @Override
+ public Thread newThread(Runnable runnable) {
+ return new Thread(((ScheduledTask) runnable).getName());
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/.classpath b/org.eclipse.osee.framework.core.server/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.core.server/.options b/org.eclipse.osee.framework.core.server/.options
new file mode 100644
index 00000000000..94c55a49dc1
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/.options
@@ -0,0 +1,5 @@
+org.eclipse.osee.framework.core.server/debug = false
+
+org.eclipse.osee.framework.core.server/debug/JoinCleanup = false
+
+
diff --git a/org.eclipse.osee.framework.core.server/.project b/org.eclipse.osee.framework.core.server/.project
new file mode 100644
index 00000000000..e88aea9cc4a
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.core.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.core.server/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.core.server/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..0b5601fb184
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Tue Oct 28 17:44:37 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.core.server/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.core.server/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..f6b89c43e19
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Tue Oct 28 17:44:37 MST 2008
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.core.server/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.core.server/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..149211f8f30
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Core Server Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.core.server
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.core.server.CoreServerActivator
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.time,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.framework.core.server
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/server.application.db.provider.xml,
+ OSGI-INF/authentication.manager.xml,
+ OSGI-INF/authentication.provider.xml,
+ OSGI-INF/application.lookup.server.manager.xml,
+ OSGI-INF/session.manager.xml,
+ OSGI-INF/server.task.scheduler.xml,
+ OSGI-INF/join.cleanup.task.provider.xml
+Require-Bundle: org.eclipse.equinox.ds
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/application.lookup.server.manager.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/application.lookup.server.manager.xml
new file mode 100644
index 00000000000..db1b90f0084
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/application.lookup.server.manager.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="application.lookup.server.manager">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.ApplicationServerLookup"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.IApplicationServerLookup"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/authentication.manager.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/authentication.manager.xml
new file mode 100644
index 00000000000..95577a03018
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/authentication.manager.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="authentication.manager">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.AuthenticationManager"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.IAuthenticationManager"/>
+ </service>
+ <reference name="resource.provider"
+ interface="org.eclipse.osee.framework.core.server.IAuthenticationProvider"
+ bind="addAuthenticationProvider"
+ unbind="removeAuthenticationProvider"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/authentication.provider.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/authentication.provider.xml
new file mode 100644
index 00000000000..2726e0207ff
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/authentication.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="authentication.provider">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.TrustAllAuthenticationProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.IAuthenticationProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/join.cleanup.task.provider.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/join.cleanup.task.provider.xml
new file mode 100644
index 00000000000..f079abd423f
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/join.cleanup.task.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="join.cleanup.task.provider">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.task.CleanJoinTablesServerTask"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.IServerTask"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/server.application.db.provider.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/server.application.db.provider.xml
new file mode 100644
index 00000000000..76c82dca502
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/server.application.db.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="server.application.db.provider">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.ServerDatabaseProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/server.task.scheduler.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/server.task.scheduler.xml
new file mode 100644
index 00000000000..f29d7aeebd7
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/server.task.scheduler.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="server.task.scheduler">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.ServerTaskScheduler"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.IServerTaskScheduler"/>
+ </service>
+ <reference name="server.task.provider"
+ interface="org.eclipse.osee.framework.core.server.IServerTask"
+ bind="addServerTask"
+ unbind="removeServerTask"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/OSGI-INF/session.manager.xml b/org.eclipse.osee.framework.core.server/OSGI-INF/session.manager.xml
new file mode 100644
index 00000000000..44987a44edf
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/OSGI-INF/session.manager.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="session.manager">
+ <implementation class="org.eclipse.osee.framework.core.server.internal.SessionManager"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.core.server.ISessionManager"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/build.properties b/org.eclipse.osee.framework.core.server/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/CoreServerActivator.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/CoreServerActivator.java
new file mode 100644
index 00000000000..1b13d74eb21
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/CoreServerActivator.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.framework.core.server;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ThreadFactory;
+import org.eclipse.osee.framework.core.server.internal.ApplicationServerManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class CoreServerActivator implements BundleActivator {
+
+ private ServiceTracker applicationManagerTracker;
+ private ServiceTracker applicationLookupTracker;
+ private ServiceTracker authenticationServiceTracker;
+ private ServiceTracker sessionServiceTracker;
+ private ServiceTracker scheduledServerTracker;
+
+ private static List<ServiceRegistration> services;
+ private static CoreServerActivator instance;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ services = new ArrayList<ServiceRegistration>();
+
+ services.add(context.registerService(IApplicationServerManager.class.getName(), new ApplicationServerManager(),
+ null));
+
+ applicationManagerTracker = new ServiceTracker(context, IApplicationServerManager.class.getName(), null);
+ applicationManagerTracker.open();
+
+ applicationLookupTracker = new ServiceTracker(context, IApplicationServerLookup.class.getName(), null);
+ applicationLookupTracker.open();
+
+ authenticationServiceTracker = new ServiceTracker(context, IAuthenticationManager.class.getName(), null);
+ authenticationServiceTracker.open();
+
+ sessionServiceTracker = new ServiceTracker(context, ISessionManager.class.getName(), null);
+ sessionServiceTracker.open();
+
+ scheduledServerTracker = new ServiceTracker(context, IServerTaskScheduler.class.getName(), null);
+ scheduledServerTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+
+ if (applicationManagerTracker != null) {
+ getApplicationServerManager().shutdown();
+ applicationManagerTracker.close();
+ applicationManagerTracker = null;
+ }
+
+ if (applicationLookupTracker != null) {
+ applicationLookupTracker.close();
+ applicationLookupTracker = null;
+ }
+
+ if (authenticationServiceTracker != null) {
+ authenticationServiceTracker.close();
+ authenticationServiceTracker = null;
+ }
+
+ if (sessionServiceTracker != null) {
+ sessionServiceTracker.close();
+ sessionServiceTracker = null;
+ }
+
+ if (scheduledServerTracker != null) {
+ scheduledServerTracker.close();
+ scheduledServerTracker = null;
+ }
+
+ for (ServiceRegistration service : services) {
+ service.unregister();
+ }
+ services.clear();
+ instance = null;
+ }
+
+ private static CoreServerActivator getInstance() {
+ return instance;
+ }
+
+ public static IAuthenticationManager getAuthenticationManager() {
+ return (IAuthenticationManager) getInstance().authenticationServiceTracker.getService();
+ }
+
+ public static ISessionManager getSessionManager() {
+ return (ISessionManager) getInstance().sessionServiceTracker.getService();
+ }
+
+ public static ThreadFactory createNewThreadFactory(String name) {
+ return getApplicationServerManager().createNewThreadFactory(name, Thread.NORM_PRIORITY);
+ }
+
+ public static ThreadFactory createNewThreadFactory(String name, int priority) {
+ return getApplicationServerManager().createNewThreadFactory(name, priority);
+ }
+
+ public static IApplicationServerManager getApplicationServerManager() {
+ return (IApplicationServerManager) getInstance().applicationManagerTracker.getService();
+ }
+
+ public static IApplicationServerLookup getApplicationServerLookup() {
+ return (IApplicationServerLookup) getInstance().applicationLookupTracker.getService();
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerLookup.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerLookup.java
new file mode 100644
index 00000000000..1c00e252de8
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerLookup.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.framework.core.server;
+
+import org.eclipse.osee.framework.core.data.OseeServerInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IApplicationServerLookup {
+
+ public OseeServerInfo getServerInfoBy(String version) throws OseeDataStoreException;
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerManager.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerManager.java
new file mode 100644
index 00000000000..95f54b80c16
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IApplicationServerManager.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.framework.core.server;
+
+import java.util.List;
+import java.util.concurrent.ThreadFactory;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IApplicationServerManager {
+
+ public void shutdown() throws OseeCoreException;
+
+ public ThreadFactory createNewThreadFactory(String name, int priority);
+
+ public boolean isSystemIdle();
+
+ public int getNumberOfActiveThreads();
+
+ public List<String> getCurrentProcesses();
+
+ public void setServletRequestsAllowed(boolean value) throws OseeCoreException;
+
+ public boolean executeLookupRegistration();
+
+ public String getId();
+
+ public String[] getSupportedVersions();
+
+ public void addSupportedVersion(String version) throws OseeCoreException;
+
+ public void removeSupportedVersion(String version) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationManager.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationManager.java
new file mode 100644
index 00000000000..0a12fe01ecf
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationManager.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.framework.core.server;
+
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAuthenticationManager {
+
+ /**
+ * Add a authentication provider
+ *
+ * @param authenticationProvider to add
+ */
+ public void addAuthenticationProvider(IAuthenticationProvider authenticationProvider);
+
+ /**
+ * Remove a authentication provider
+ *
+ * @param authenticationProvider to remove
+ */
+ public void removeAuthenticationProvider(IAuthenticationProvider authenticationProvider);
+
+ /**
+ * @param credential
+ * @return <b>true</b> if authentication success
+ * @throws OseeAuthenticationException
+ */
+ public boolean authenticate(OseeCredential credential) throws OseeAuthenticationException;
+
+ /**
+ * Resolves user credentials into an OSEE User Info
+ *
+ * @param credential
+ * @return OSEE user info
+ * @throws OseeAuthenticationException
+ */
+ public IOseeUserInfo asOseeUser(OseeCredential credential) throws OseeAuthenticationException;
+
+ /**
+ * Gets an array of available authentication protocols
+ *
+ * @return authentication protocols
+ */
+ public String[] getProtocols();
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationProvider.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationProvider.java
new file mode 100644
index 00000000000..09daac1bce0
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IAuthenticationProvider.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.framework.core.server;
+
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAuthenticationProvider {
+
+ public String getProtocol();
+
+ public boolean authenticate(OseeCredential credential) throws OseeAuthenticationException;
+
+ public IOseeUserInfo asOseeUserId(OseeCredential credential) throws OseeAuthenticationException;
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTask.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTask.java
new file mode 100644
index 00000000000..390de599165
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTask.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.framework.core.server;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServerTask extends Runnable {
+
+ public String getName();
+
+ public SchedulingScheme getSchedulingScheme();
+
+ public long getInitialDelay();
+
+ public long getPeriod();
+
+ public TimeUnit getTimeUnit();
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTaskScheduler.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTaskScheduler.java
new file mode 100644
index 00000000000..2e558d85a82
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/IServerTaskScheduler.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.framework.core.server;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServerTaskScheduler {
+
+ public void addServerTask(IServerTask taskProvider);
+
+ public void removeServerTask(IServerTask taskProvider);
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/ISessionManager.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/ISessionManager.java
new file mode 100644
index 00000000000..4246806354e
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/ISessionManager.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.core.server;
+
+import java.util.List;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.OseeSession;
+import org.eclipse.osee.framework.core.data.OseeSessionGrant;
+import org.eclipse.osee.framework.core.exception.OseeInvalidSessionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ISessionManager {
+
+ public OseeSessionGrant createSession(OseeCredential credential) throws OseeCoreException;
+
+ public void releaseSession(String sessionId);
+
+ public void updateSessionActivity(String sessionId, String interactionName) throws OseeInvalidSessionException;
+
+ public SessionData getSessionById(String sessionId);
+
+ public List<SessionData> getSessionByClientAddress(String clientAddress);
+
+ public List<SessionData> getSessionsByUserId(String userId, boolean includeNonServerManagedSessions) throws OseeCoreException;
+
+ public List<SessionData> getAllSessions(boolean includeNonServerManagedSessions) throws OseeDataStoreException;
+
+ public void releaseSessionImmediate(String... sessionId) throws OseeCoreException;
+
+ public boolean isAlive(OseeSession oseeSession) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServiceTracker.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServiceTracker.java
new file mode 100644
index 00000000000..c54bef2f775
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServiceTracker.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.framework.core.server;
+
+import org.eclipse.osee.framework.core.server.internal.InternalHttpServiceTracker;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeHttpServiceTracker extends InternalHttpServiceTracker {
+
+ /**
+ * @param context
+ * @param contextName
+ * @param servletClass
+ */
+ public OseeHttpServiceTracker(BundleContext context, String contextName, Class<? extends OseeHttpServlet> servletClass) {
+ super(context, contextName, servletClass);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServlet.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServlet.java
new file mode 100644
index 00000000000..cb29ef8a779
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeHttpServlet.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.framework.core.server;
+
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.core.server.internal.InternalOseeHttpServlet;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeHttpServlet extends InternalOseeHttpServlet {
+
+ private static final long serialVersionUID = -4747761442607851113L;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.internal.InternalOseeHttpServlet#checkAccessControl()
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ String sessionId = request.getParameter("sessionId");
+ String interaction =
+ String.format("%s %s %s", request.getMethod(), request.getRequestURI(), request.getQueryString());
+ CoreServerActivator.getSessionManager().updateSessionActivity(sessionId, interaction);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeServerProperties.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeServerProperties.java
new file mode 100644
index 00000000000..04d49516336
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/OseeServerProperties.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.server;
+
+import java.io.File;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeServerProperties {
+ private static final String OSEE_APPLICATION_SERVER_DATA = "osee.application.server.data";
+ private static final String OSGI_PORT_PROPERTY = "org.osgi.service.http.port";
+ private static final String CHECK_TAG_QUEUE_ON_START_UP = "osee.check.tag.queue.on.startup";
+ public static final String OSEE_DERBY_SERVER = "osee.derby.server";
+ private static final String OSEE_VERSION = "osee.version";
+
+ private static boolean wasBinaryDataChecked = false;
+
+ private OseeServerProperties() {
+ super();
+ }
+
+ /**
+ * Get OSEE application server version settings
+ *
+ * @return OSEE application server versions
+ */
+ public static String[] getOseeVersion() {
+ String[] toReturn = new String[0];
+ String versionString = System.getProperty(OSEE_VERSION, "");
+ if (Strings.isValid(versionString)) {
+ toReturn = versionString.split(";");
+ }
+ return toReturn;
+ }
+
+ private static String internalGetOseeApplicationServerData() {
+ String toReturn = System.getProperty(OSEE_APPLICATION_SERVER_DATA);
+ if (toReturn == null) {
+ String userHome = System.getProperty("user.home");
+ if (Strings.isValid(userHome)) {
+ toReturn = userHome;
+ }
+ }
+ return toReturn;
+ }
+
+ /**
+ * Get location for OSEE application server binary data
+ *
+ * @return OSEE application server binary data path
+ */
+ public static String getOseeApplicationServerData() {
+ String toReturn = internalGetOseeApplicationServerData();
+ if (!wasBinaryDataChecked) {
+ File file = new File(toReturn);
+ if (file.exists()) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, String.format("Application Server Data: [%s]", toReturn));
+ } else {
+ OseeLog.log(CoreServerActivator.class, Level.WARNING, String.format(
+ "Application Server Data: [%s] does not exist and will be created", toReturn));
+ }
+ wasBinaryDataChecked = true;
+ }
+ return toReturn;
+ }
+
+ /**
+ * Retrieve the application server port
+ *
+ * @return the application server port
+ */
+ public static int getOseeApplicationServerPort() {
+ return Integer.valueOf(System.getProperty(OSGI_PORT_PROPERTY, "-1"));
+ }
+
+ /**
+ * Check Tag Queue on start up. Entries found in the tag queue are tagged by the server on start up.
+ *
+ * @return whether tag queue should be checked upon server start-up.
+ */
+ public static boolean isCheckTagQueueOnStartupAllowed() {
+ return Boolean.valueOf(System.getProperty(CHECK_TAG_QUEUE_ON_START_UP, "false"));
+ }
+
+ /**
+ * Retrieve the connection info file location
+ *
+ * @return connection info file URI
+ */
+ public static String getOseeConnectionInfoUri() {
+ return OseeProperties.getOseeConnectionInfoUri();
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SchedulingScheme.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SchedulingScheme.java
new file mode 100644
index 00000000000..05dd521d82d
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SchedulingScheme.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.framework.core.server;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum SchedulingScheme {
+
+ ONE_SHOT, FIXED_RATE, FIXED_DELAY_BETWEEN_RUNS;
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SessionData.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SessionData.java
new file mode 100644
index 00000000000..6fbe915af53
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/SessionData.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.framework.core.server;
+
+import org.eclipse.osee.framework.core.data.OseeSession;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SessionData {
+
+ public static enum SessionState {
+ CREATED, UPDATED, DELETED, CURRENT;
+ }
+
+ private SessionState sessionState;
+ private OseeSession session;
+
+ public SessionData(SessionState sessionState, OseeSession session) {
+ super();
+ this.sessionState = sessionState;
+ this.session = session;
+ }
+
+ public SessionState getSessionState() {
+ return sessionState;
+ }
+
+ public String getSessionId() {
+ return this.session.getSessionId();
+ }
+
+ public void setSessionState(SessionState sessionState) {
+ this.sessionState = sessionState;
+ }
+
+ public OseeSession getSession() {
+ return session;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/UserDataStore.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/UserDataStore.java
new file mode 100644
index 00000000000..6e721ff5604
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/UserDataStore.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.framework.core.server;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeUser;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UserDataStore {
+ private static final String LOAD_OSEE_USER =
+ "select oa.value as user_id from osee_attribute_type oat, osee_attribute oa, osee_txs txs where oat.name = 'User Id' and oat.attr_type_id = oa.attr_type_id and oa.gamma_id = txs.gamma_id and txs.tx_current = 1 and oa.value = ?";
+
+ private UserDataStore() {
+ }
+
+ public static IOseeUserInfo getOseeUserFromOseeDb(String userId) {
+ IOseeUserInfo toReturn = null;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(LOAD_OSEE_USER, userId);
+ if (chStmt.next()) {
+ // Only need the userId all other fields will be loaded by the client
+ toReturn = new OseeUserInfo(false, "-", chStmt.getString("user_id"), "-", false);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.SEVERE, String.format(
+ "Unable to find userId [%s] in OSEE database.", userId), ex);
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ public static IOseeUserInfo createUser(boolean isCreationRequired, String userName, String userId, String userEmail, boolean isActive) {
+ return new OseeUserInfo(isCreationRequired, userName, userId, userEmail, isActive);
+ }
+
+ private final static class OseeUserInfo extends OseeUser implements IOseeUserInfo {
+ private final boolean isCreationRequired;
+
+ private OseeUserInfo(boolean isCreationRequired, String userName, String userId, String userEmail, boolean isActive) {
+ super(userName, userId, userEmail, isActive);
+ this.isCreationRequired = isCreationRequired;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUserInfo#isCreationRequired()
+ */
+ @Override
+ public boolean isCreationRequired() {
+ return isCreationRequired;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerDataStore.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerDataStore.java
new file mode 100644
index 00000000000..3272724a4cd
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerDataStore.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.server.internal;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.OseeServerInfo;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ApplicationServerDataStore {
+
+ private static final String INSERT_LOOKUP_TABLE =
+ "INSERT INTO osee_server_lookup (server_id, version_id, server_address, port, start_time, accepts_requests) VALUES (?,?,?,?,?,?)";
+
+ private static final String UPDATE_LOOKUP_TABLE =
+ "UPDATE osee_server_lookup SET accepts_requests = ? WHERE server_address = ? AND port = ?";
+
+ private static final String DELETE_FROM_LOOKUP_TABLE =
+ "DELETE FROM osee_server_lookup WHERE server_address = ? AND port = ? AND version_id=?";
+
+ private static final String DELETE_FROM_LOOKUP_TABLE_BY_ID = "DELETE FROM osee_server_lookup WHERE server_id = ?";
+
+ private static final String GET_NUMBER_OF_SESSIONS =
+ "SELECT count(1) FROM osee_session WHERE managed_by_server_id = ?";
+
+ private static final String SELECT_FROM_LOOKUP_TABLE = "SELECT * FROM osee_server_lookup";
+
+ private static final String SELECT_SUPPORTED_VERSIONS_FROM_LOOKUP_TABLE_BY_SERVER_ID =
+ "SELECT version_id FROM osee_server_lookup where server_id = ?";
+
+ static void removeByServerId(List<OseeServerInfo> infos) throws OseeDataStoreException {
+ if (!infos.isEmpty()) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (OseeServerInfo info : infos) {
+ data.add(new Object[] {info.getServerId()});
+ }
+ ConnectionHandler.runBatchUpdate(DELETE_FROM_LOOKUP_TABLE_BY_ID, data);
+ }
+ }
+
+ static boolean deregisterWithDb(OseeServerInfo applicationServerInfo) {
+ boolean status = false;
+ try {
+ String address = applicationServerInfo.getServerAddress();
+ int port = applicationServerInfo.getPort();
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (String version : applicationServerInfo.getVersion()) {
+ data.add(new Object[] {address, port, version});
+ }
+ ConnectionHandler.runBatchUpdate(DELETE_FROM_LOOKUP_TABLE, data);
+ status = true;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, "Server lookup table not initialized");
+ }
+ return status;
+ }
+
+ static boolean registerWithDb(OseeServerInfo applicationServerInfo) {
+ boolean status = false;
+ try {
+ String serverId = applicationServerInfo.getServerId();
+ String address = applicationServerInfo.getServerAddress();
+ int port = applicationServerInfo.getPort();
+ Timestamp dateStarted = applicationServerInfo.getDateStarted();
+ int acceptingRequests = applicationServerInfo.isAcceptingRequests() ? 1 : 0;
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (String version : applicationServerInfo.getVersion()) {
+ data.add(new Object[] {serverId, version, address, port, dateStarted, acceptingRequests});
+ }
+ ConnectionHandler.runBatchUpdate(INSERT_LOOKUP_TABLE, data);
+ status = true;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, "Server lookup table not initialized");
+ }
+ return status;
+ }
+
+ static boolean updateServerState(OseeServerInfo applicationServerInfo, boolean state) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(UPDATE_LOOKUP_TABLE, state ? 1 : 0, applicationServerInfo.getServerAddress(),
+ applicationServerInfo.getPort());
+ return true;
+ }
+
+ static boolean isCompatibleVersion(String serverVersion, String clientVersion) {
+ boolean result = false;
+ if (serverVersion.equals(clientVersion)) {
+ result = true;
+ } else {
+ result = clientVersion.matches(serverVersion);
+ if (!result) {
+ result = serverVersion.matches(clientVersion);
+ }
+ }
+ return result;
+ }
+
+ static Collection<OseeServerInfo> getApplicationServerInfos(String clientVersion) throws OseeDataStoreException {
+ CompositeKeyHashMap<String, Integer, OseeServerInfo> servers =
+ new CompositeKeyHashMap<String, Integer, OseeServerInfo>();
+ if (Strings.isValid(clientVersion)) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_FROM_LOOKUP_TABLE);
+ while (chStmt.next()) {
+ String serverVersion = chStmt.getString("version_id");
+ if (Strings.isValid(serverVersion)) {
+ if (isCompatibleVersion(serverVersion, clientVersion)) {
+ String serverAddress = chStmt.getString("server_address");
+ int port = chStmt.getInt("port");
+ OseeServerInfo info = servers.get(serverAddress, port);
+ if (info == null) {
+ info =
+ new OseeServerInfo(chStmt.getString("server_id"), serverAddress, port,
+ new String[] {serverVersion}, chStmt.getTimestamp("start_time"),
+ chStmt.getInt("accepts_requests") != 0 ? true : false);
+ servers.put(serverAddress, port, info);
+ } else {
+ Set<String> versions = new HashSet<String>(Arrays.asList(info.getVersion()));
+ if (!versions.contains(serverVersion)) {
+ versions.add(serverVersion);
+ info =
+ new OseeServerInfo(chStmt.getString("server_id"), serverAddress, port,
+ versions.toArray(new String[versions.size()]),
+ chStmt.getTimestamp("start_time"),
+ chStmt.getInt("accepts_requests") != 0 ? true : false);
+ servers.put(serverAddress, port, info);
+ }
+ }
+ }
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ return servers.values();
+ }
+
+ static Set<String> getOseeVersionsByServerId(String serverId) throws OseeDataStoreException {
+ Set<String> supportedVersions = new HashSet<String>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_SUPPORTED_VERSIONS_FROM_LOOKUP_TABLE_BY_SERVER_ID, serverId);
+ while (chStmt.next()) {
+ String version = chStmt.getString("version_id");
+ if (Strings.isValid(version)) {
+ supportedVersions.add(version);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, "Server lookup table is not initialized");
+ } finally {
+ chStmt.close();
+ }
+ return supportedVersions;
+ }
+
+ static int getNumberOfSessions(String serverId) throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchInt(0, GET_NUMBER_OF_SESSIONS, serverId);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerLookup.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerLookup.java
new file mode 100644
index 00000000000..a19bd385810
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerLookup.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.framework.core.server.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.OseeServerInfo;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IApplicationServerLookup;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ApplicationServerLookup implements IApplicationServerLookup {
+
+ private static ThreadFactory threadFactory = null;
+
+ public OseeServerInfo getServerInfoBy(String version) throws OseeDataStoreException {
+ Collection<OseeServerInfo> infos = ApplicationServerDataStore.getApplicationServerInfos(version);
+
+ List<OseeServerInfo> healthyServers = new ArrayList<OseeServerInfo>();
+ List<OseeServerInfo> unHealthyServers = new ArrayList<OseeServerInfo>();
+ for (OseeServerInfo info : infos) {
+ if (isServerAlive(info)) {
+ if (info.isAcceptingRequests()) {
+ healthyServers.add(info);
+ }
+ } else {
+ unHealthyServers.add(info);
+ }
+ }
+ cleanUpServers(unHealthyServers);
+ return getBestAvailable(healthyServers);
+ }
+
+ private static void cleanUpServers(final List<OseeServerInfo> unHealthyServers) {
+ if (!unHealthyServers.isEmpty()) {
+ if (threadFactory == null) {
+ threadFactory = CoreServerActivator.createNewThreadFactory("Server Status Thread Factory");
+ }
+
+ Thread thread = threadFactory.newThread(new Runnable() {
+ public void run() {
+ try {
+ ApplicationServerDataStore.removeByServerId(unHealthyServers);
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.SEVERE, String.format(
+ "Error removing unhealthy server entries: [%s]", unHealthyServers), ex);
+ }
+ }
+ });
+ thread.start();
+ }
+ }
+
+ private OseeServerInfo getBestAvailable(List<OseeServerInfo> infos) {
+ OseeServerInfo result = null;
+ if (infos.size() == 1) {
+ result = infos.get(0);
+ } else {
+ int minSessions = Integer.MAX_VALUE;
+ for (OseeServerInfo info : infos) {
+ try {
+ int numberOfSessions = ApplicationServerDataStore.getNumberOfSessions(info.getServerId());
+ if (minSessions > numberOfSessions) {
+ result = info;
+ minSessions = numberOfSessions;
+ }
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return result;
+ }
+
+ private boolean isServerAlive(OseeServerInfo info) {
+ return HttpProcessor.isAlive(info.getServerAddress(), info.getPort());
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerManager.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerManager.java
new file mode 100644
index 00000000000..c264ced8753
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ApplicationServerManager.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.server.internal;
+
+import java.io.ByteArrayInputStream;
+import java.lang.Thread.State;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IApplicationServerManager;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ApplicationServerManager implements IApplicationServerManager {
+ private final Map<String, OseeServerThreadFactory> threadFactories;
+ private final Map<String, InternalOseeHttpServlet> oseeHttpServlets;
+
+ private final InternalOseeServerInfo applicationServerInfo;
+
+ public ApplicationServerManager() {
+ this.oseeHttpServlets = Collections.synchronizedMap(new HashMap<String, InternalOseeHttpServlet>());
+ this.threadFactories = Collections.synchronizedMap(new HashMap<String, OseeServerThreadFactory>());
+ this.applicationServerInfo = createOseeServerInfo();
+ applicationServerInfo.setAcceptingRequests(true);
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ executeLookupRegistration();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }).start();
+ }
+
+ private InternalOseeServerInfo createOseeServerInfo() {
+ String serverAddress = "127.0.0.1";
+ try {
+ serverAddress = InetAddress.getLocalHost().getCanonicalHostName();
+ } catch (UnknownHostException ex) {
+ }
+ int port = OseeServerProperties.getOseeApplicationServerPort();
+
+ String checkSum = "-1";
+ try {
+ String address = String.format("%s:%s", serverAddress, port);
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(address.getBytes("UTF-8"));
+ checkSum = ChecksumUtil.createChecksumAsString(inputStream, ChecksumUtil.MD5);
+ } catch (Exception ex) {
+ OseeLog.log(CoreServerActivator.class, Level.SEVERE, "Error generating application server id", ex);
+ }
+
+ return new InternalOseeServerInfo(checkSum, serverAddress, port, GlobalTime.GreenwichMeanTimestamp(), false);
+ }
+
+ public boolean executeLookupRegistration() {
+ boolean isRegistered = getApplicationServerInfo().updateRegistration();
+ if (isRegistered) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, String.format("Application Server: [%s] registered.",
+ getApplicationServerInfo().getServerId()));
+ }
+ return isRegistered;
+ }
+
+ void register(String context, InternalOseeHttpServlet servlets) {
+ servlets.setRequestsAllowed(getApplicationServerInfo().isAcceptingRequests());
+ this.oseeHttpServlets.put(context, servlets);
+ }
+
+ void unregister(String key) {
+ this.oseeHttpServlets.remove(key);
+ this.threadFactories.remove(key);
+ }
+
+ private InternalOseeServerInfo getApplicationServerInfo() {
+ return applicationServerInfo;
+ }
+
+ public ThreadFactory createNewThreadFactory(String name, int priority) {
+ OseeServerThreadFactory factory = new OseeServerThreadFactory(name, priority);
+ this.threadFactories.put(name, factory);
+ return factory;
+ }
+
+ private List<OseeServerThread> getThreadsFromFactory(String key) {
+ OseeServerThreadFactory factory = threadFactories.get(key);
+ return factory.getThreads();
+ }
+
+ public boolean isSystemIdle() {
+ boolean result = true;
+ for (String contexts : oseeHttpServlets.keySet()) {
+ InternalOseeHttpServlet servlets = oseeHttpServlets.get(contexts);
+ result &= !servlets.getState().equals(ProcessingStateEnum.BUSY);
+ }
+
+ for (String key : threadFactories.keySet()) {
+ for (OseeServerThread thread : getThreadsFromFactory(key)) {
+ State state = thread.getState();
+ result &= !state.equals(State.TERMINATED);
+ }
+ }
+ return result;
+ }
+
+ private void updateServletRequestsAllowed(final boolean value) {
+ for (String contexts : oseeHttpServlets.keySet()) {
+ InternalOseeHttpServlet servlets = oseeHttpServlets.get(contexts);
+ servlets.setRequestsAllowed(value);
+ }
+ }
+
+ public synchronized void setServletRequestsAllowed(final boolean value) throws OseeDataStoreException {
+ if (getApplicationServerInfo().isAcceptingRequests() != value) {
+ boolean wasSuccessful = ApplicationServerDataStore.updateServerState(getApplicationServerInfo(), value);
+ if (wasSuccessful) {
+ getApplicationServerInfo().setAcceptingRequests(value);
+ updateServletRequestsAllowed(value);
+ }
+ }
+ }
+
+ public void shutdown() throws OseeCoreException {
+ setServletRequestsAllowed(false);
+ ApplicationServerDataStore.deregisterWithDb(getApplicationServerInfo());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.common.IApplicationServerManager#getCurrentProcesses()
+ */
+ @Override
+ public List<String> getCurrentProcesses() {
+ List<String> processList = new ArrayList<String>();
+ for (String key : threadFactories.keySet()) {
+ for (OseeServerThread thread : getThreadsFromFactory(key)) {
+ State state = thread.getState();
+ if (!state.equals(State.TERMINATED)) {
+ processList.add(thread.getName());
+ }
+ }
+ }
+ for (String contexts : oseeHttpServlets.keySet()) {
+ InternalOseeHttpServlet servlets = oseeHttpServlets.get(contexts);
+ if (servlets.getState().equals(ProcessingStateEnum.BUSY)) {
+ processList.add(servlets.getCurrentRequest());
+ }
+ }
+ return processList;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.common.IApplicationServerManager#getNumberOfActiveThreads()
+ */
+ @Override
+ public int getNumberOfActiveThreads() {
+ int totalProcesses = 0;
+ for (String contexts : oseeHttpServlets.keySet()) {
+ InternalOseeHttpServlet servlets = oseeHttpServlets.get(contexts);
+ if (servlets.getState().equals(ProcessingStateEnum.BUSY)) {
+ totalProcesses++;
+ }
+ }
+
+ for (String key : threadFactories.keySet()) {
+ for (OseeServerThread thread : getThreadsFromFactory(key)) {
+ State state = thread.getState();
+ if (!state.equals(State.TERMINATED)) {
+ totalProcesses++;
+ }
+ }
+ }
+ return totalProcesses;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IApplicationServerManager#getId()
+ */
+ @Override
+ public String getId() {
+ return getApplicationServerInfo().getServerId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IApplicationServerManager#getSupportedVersions()
+ */
+ @Override
+ public String[] getSupportedVersions() {
+ return getApplicationServerInfo().getVersion();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IApplicationServerManager#addSupportedVersion(java.lang.String)
+ */
+ @Override
+ public void addSupportedVersion(String version) throws OseeCoreException {
+ getApplicationServerInfo().addVersion(version);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IApplicationServerManager#removeSupportedVersion(java.lang.String)
+ */
+ @Override
+ public void removeSupportedVersion(String version) throws OseeCoreException {
+ getApplicationServerInfo().removeVersion(version);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/AuthenticationManager.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/AuthenticationManager.java
new file mode 100644
index 00000000000..f85957839d1
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/AuthenticationManager.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.server.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.core.exception.OseeInvalidAuthenticationProtocolException;
+import org.eclipse.osee.framework.core.server.IAuthenticationManager;
+import org.eclipse.osee.framework.core.server.IAuthenticationProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AuthenticationManager implements IAuthenticationManager {
+
+ private final Map<String, IAuthenticationProvider> authenticationProviders;
+
+ public AuthenticationManager() {
+ this.authenticationProviders = Collections.synchronizedMap(new HashMap<String, IAuthenticationProvider>());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationManager#addAuthenticationProvider(org.eclipse.osee.framework.core.server.IAuthenticationProvider)
+ */
+ @Override
+ public void addAuthenticationProvider(IAuthenticationProvider authenticationProvider) {
+ synchronized (authenticationProviders) {
+ final String providerId = authenticationProvider.getProtocol();
+ if (!authenticationProviders.containsKey(providerId)) {
+ authenticationProviders.put(providerId, authenticationProvider);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationManager#authenticate(org.eclipse.osee.framework.core.data.OseeCredential)
+ */
+ @Override
+ public boolean authenticate(OseeCredential credential) throws OseeAuthenticationException {
+ if (isSafeUser(credential)) {
+ return true;
+ } else {
+ IAuthenticationProvider provider = authenticationProviders.get(credential.getAuthenticationProtocol());
+ if (provider != null) {
+ return provider.authenticate(credential);
+ }
+ }
+ throw new OseeInvalidAuthenticationProtocolException(String.format("Invalid protocol [%s]",
+ credential.getAuthenticationProtocol()));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationManager#removeAuthenticationProvider(org.eclipse.osee.framework.core.server.IAuthenticationProvider)
+ */
+ @Override
+ public void removeAuthenticationProvider(IAuthenticationProvider authenticationProvider) {
+ synchronized (authenticationProviders) {
+ authenticationProviders.remove(authenticationProvider);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationManager#getProtocols()
+ */
+ @Override
+ public String[] getProtocols() {
+ Set<String> keys = authenticationProviders.keySet();
+ return keys.toArray(new String[keys.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationManager#asOseeUser(org.eclipse.osee.framework.core.data.OseeCredential)
+ */
+ @Override
+ public IOseeUserInfo asOseeUser(OseeCredential credential) throws OseeAuthenticationException {
+ if (isGuestLogin(credential)) {
+ return SystemUser.Guest;
+ } else if (isBootStrap(credential)) {
+ return SystemUser.BootStrap;
+ } else {
+ IAuthenticationProvider provider = authenticationProviders.get(credential.getAuthenticationProtocol());
+ if (provider != null) {
+ return provider.asOseeUserId(credential);
+ }
+ }
+ throw new OseeInvalidAuthenticationProtocolException(String.format("Invalid protocol [%s]",
+ credential.getAuthenticationProtocol()));
+ }
+
+ private boolean isGuestLogin(OseeCredential credential) {
+ return credential.getUserName().equals(SystemUser.Guest.getName());
+ }
+
+ private boolean isBootStrap(OseeCredential credential) {
+ return credential.getUserName().equals(SystemUser.BootStrap.getName());
+ }
+
+ private boolean isSafeUser(OseeCredential credential) {
+ return isGuestLogin(credential) || isBootStrap(credential);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalHttpServiceTracker.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalHttpServiceTracker.java
new file mode 100644
index 00000000000..52707eb6ea9
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalHttpServiceTracker.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.framework.core.server.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.http.HttpService;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InternalHttpServiceTracker extends ServiceTracker {
+
+ private String contextName;
+ private Class<? extends OseeHttpServlet> servletClass;
+
+ public InternalHttpServiceTracker(BundleContext context, String contextName, Class<? extends OseeHttpServlet> servletClass) {
+ super(context, HttpService.class.getName(), null);
+ this.contextName = !contextName.startsWith("/") ? "/" + contextName : contextName;
+ this.servletClass = servletClass;
+ }
+
+ public Object addingService(ServiceReference reference) {
+ HttpService httpService = (HttpService) context.getService(reference);
+ try {
+ OseeHttpServlet servlet =
+ (OseeHttpServlet) this.servletClass.getConstructor(new Class[0]).newInstance(new Object[0]);
+ httpService.registerServlet(contextName, servlet, null, null);
+ ApplicationServerManager serverManager =
+ (ApplicationServerManager) CoreServerActivator.getApplicationServerManager();
+ serverManager.register(contextName, servlet);
+ System.out.println(String.format("Registered servlet '%s'", contextName));
+ } catch (Exception ex) {
+ OseeLog.log(this.getClass(), Level.SEVERE, ex);
+ }
+ return httpService;
+ }
+
+ public void removedService(ServiceReference reference, Object service) {
+ HttpService httpService = (HttpService) service;
+ httpService.unregister(contextName);
+ ApplicationServerManager serverManager =
+ (ApplicationServerManager) CoreServerActivator.getApplicationServerManager();
+ serverManager.unregister(contextName);
+ System.out.println(String.format("De-registering servlet '%s'", contextName));
+ super.removedService(reference, service);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeHttpServlet.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeHttpServlet.java
new file mode 100644
index 00000000000..d4efbbef525
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeHttpServlet.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.framework.core.server.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class InternalOseeHttpServlet extends HttpServlet {
+ private static final long serialVersionUID = -4965613535312739355L;
+ private boolean areRequestsAllowed;
+ private boolean areLogsAllowed;
+ private ProcessingStateEnum processingState;
+ private HttpServletRequest request;
+
+ public InternalOseeHttpServlet() {
+ this.areRequestsAllowed = true;
+ this.areLogsAllowed = false;
+ this.processingState = ProcessingStateEnum.IDLE;
+ this.request = null;
+ }
+
+ protected boolean areRequestsAllowed() {
+ return areRequestsAllowed;
+ }
+
+ protected boolean areLogsAllowed() {
+ return areLogsAllowed;
+ }
+
+ void setRequestsAllowed(boolean value) {
+ areRequestsAllowed = value;
+ }
+
+ void setLogsAllowed(boolean value) {
+ areLogsAllowed = value;
+ }
+
+ ProcessingStateEnum getState() {
+ return processingState;
+ }
+
+ String getCurrentRequest() {
+ return request != null ? String.format("[%s] [%s - %s]", request.getMethod(), request.getContextPath(),
+ request.getQueryString()) : "";
+ }
+
+ protected abstract void checkAccessControl(HttpServletRequest request) throws OseeCoreException;
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ long start = 0L;
+ if (areLogsAllowed()) {
+ start = System.currentTimeMillis();
+ }
+ try {
+ if (areRequestsAllowed()) {
+ this.processingState = ProcessingStateEnum.BUSY;
+ this.request = request;
+ try {
+ checkAccessControl(request);
+ super.service(request, response);
+ } catch (OseeCoreException ex) {
+ response.setStatus(HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ throw new ServletException(ex);
+ }
+ } else {
+ response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ response.getWriter().write("All requests are currently blocked.");
+ }
+ } finally {
+ if (areLogsAllowed()) {
+ long elapsed = System.currentTimeMillis() - start;
+ OseeLog.log(this.getClass(), Level.INFO, String.format("[%s] [%s - %s] serviced in [%s] ms",
+ request.getMethod(), request.getContextPath(), request.getQueryString(), elapsed));
+ }
+ this.processingState = ProcessingStateEnum.IDLE;
+ this.request = null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeServerInfo.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeServerInfo.java
new file mode 100644
index 00000000000..3b80956acd6
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/InternalOseeServerInfo.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.server.internal;
+
+import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.core.data.OseeServerInfo;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class InternalOseeServerInfo extends OseeServerInfo {
+ private static final long serialVersionUID = -8623296027967886344L;
+ private transient final Set<String> defaultVersions;
+ private transient boolean isRegistered;
+ private transient MutableBoolean updateFromStore;
+
+ public InternalOseeServerInfo(String serverId, String serverAddress, int port, Timestamp dateStarted, boolean isAcceptingRequests) {
+ super(serverId, serverAddress, port, new String[0], dateStarted, isAcceptingRequests);
+ this.isRegistered = false;
+ this.defaultVersions = new HashSet<String>();
+ this.updateFromStore = new MutableBoolean(true);
+ initializeDefaultVersions();
+ }
+
+ private void initializeDefaultVersions() {
+ String[] userSpecifiedVersion = OseeServerProperties.getOseeVersion();
+ if (userSpecifiedVersion != null && userSpecifiedVersion.length > 0) {
+ defaultVersions.addAll(Arrays.asList(userSpecifiedVersion));
+ } else {
+ defaultVersions.add(OseeCodeVersion.getVersion());
+ }
+ }
+
+ private void checkVersionArgument(String version) throws OseeCoreException {
+ if (!Strings.isValid(version)) throw new OseeArgumentException(String.format("Osee version argument is invalid"));
+ }
+
+ private void updateVersionsFromDataStore() {
+ Set<String> supportedVersions = new HashSet<String>();
+ try {
+ supportedVersions.addAll(ApplicationServerDataStore.getOseeVersionsByServerId(getServerId()));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.SEVERE, ex);
+ }
+ if (!supportedVersions.containsAll(defaultVersions)) {
+ supportedVersions.addAll(defaultVersions);
+ }
+ backingData.put(VERSION, supportedVersions.toArray(new String[supportedVersions.size()]));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.OseeServerInfo#getVersion()
+ */
+ @Override
+ public String[] getVersion() {
+ if (updateFromStore.getValue()) {
+ updateVersionsFromDataStore();
+ }
+ return super.getVersion();
+ }
+
+ void addVersion(String version) throws OseeCoreException {
+ synchronized (updateFromStore) {
+ checkVersionArgument(version);
+ Set<String> supportedVersions = new HashSet<String>(Arrays.asList(getVersion()));
+ supportedVersions.add(version);
+ backingData.put(VERSION, supportedVersions.toArray(new String[supportedVersions.size()]));
+ updateFromStore.setValue(false);
+ writeToDataStore();
+ updateFromStore.setValue(true);
+ }
+ }
+
+ void removeVersion(String version) throws OseeCoreException {
+ synchronized (updateFromStore) {
+ checkVersionArgument(version);
+ if (defaultVersions.contains(version)) throw new OseeArgumentException(String.format(
+ "Unable to remove default Osee version [%s]", version));
+ Set<String> supportedVersions = new HashSet<String>(Arrays.asList(getVersion()));
+ if (supportedVersions.contains(version)) {
+ isRegistered = false;
+ updateFromStore.setValue(false);
+ ApplicationServerDataStore.deregisterWithDb(this);
+ supportedVersions.remove(version);
+ backingData.put(VERSION, supportedVersions.toArray(new String[supportedVersions.size()]));
+ isRegistered = ApplicationServerDataStore.registerWithDb(this);
+ updateFromStore.setValue(true);
+ } else {
+ throw new OseeStateException(String.format("Not part of the supported version [%s]", version));
+ }
+ }
+ }
+
+ private void writeToDataStore() {
+ isRegistered = false;
+ ApplicationServerDataStore.deregisterWithDb(this);
+ isRegistered = ApplicationServerDataStore.registerWithDb(this);
+ }
+
+ boolean updateRegistration() {
+ synchronized (updateFromStore) {
+ updateVersionsFromDataStore();
+ updateFromStore.setValue(false);
+ writeToDataStore();
+ updateFromStore.setValue(true);
+ }
+ return isRegistered;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThread.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThread.java
new file mode 100644
index 00000000000..c59775b7b1f
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThread.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.framework.core.server.internal;
+
+class OseeServerThread extends Thread {
+
+ protected OseeServerThread(String name) {
+ super(name);
+
+ }
+
+ protected OseeServerThread(Runnable arg0, String name) {
+ super(arg0, name);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThreadFactory.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThreadFactory.java
new file mode 100644
index 00000000000..b17d3a2387a
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/OseeServerThreadFactory.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.framework.core.server.internal;
+
+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
+ */
+class OseeServerThreadFactory implements ThreadFactory {
+
+ private List<WeakReference<OseeServerThread>> threads;
+ private String threadName;
+ private int priority;
+
+ public OseeServerThreadFactory(String threadName, int priority) {
+ this.threadName = threadName;
+ this.threads = new CopyOnWriteArrayList<WeakReference<OseeServerThread>>();
+ this.priority = priority;
+ }
+
+ public OseeServerThreadFactory(String name) {
+ this(name, Thread.NORM_PRIORITY);
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ */
+ public Thread newThread(Runnable runnable) {
+ OseeServerThread thread = new OseeServerThread(runnable, threadName + ":" + threads.size());
+ thread.setPriority(priority);
+ this.threads.add(new WeakReference<OseeServerThread>(thread));
+ return thread;
+ }
+
+ List<OseeServerThread> getThreads() {
+ List<OseeServerThread> toReturn = new ArrayList<OseeServerThread>();
+ for (WeakReference<OseeServerThread> weak : threads) {
+ OseeServerThread thread = weak.get();
+ if (thread != null) {
+ toReturn.add(thread);
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ProcessingStateEnum.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ProcessingStateEnum.java
new file mode 100644
index 00000000000..0a413446339
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ProcessingStateEnum.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.framework.core.server.internal;
+
+/**
+ * @author Roberto E. Escobar
+ */
+enum ProcessingStateEnum {
+ BUSY, IDLE;
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerDatabaseProvider.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerDatabaseProvider.java
new file mode 100644
index 00000000000..078412e12bd
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerDatabaseProvider.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.framework.core.server.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.DatabaseInfoManager;
+import org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServerDatabaseProvider implements IApplicationDatabaseInfoProvider {
+
+ private static final String NAME = "Server Data Source";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider#getDatabaseInfo()
+ */
+ @Override
+ public IDatabaseInfo getDatabaseInfo() throws OseeDataStoreException {
+ IDatabaseInfo databaseInfo = null;
+ databaseInfo = DatabaseInfoManager.getDefault();
+ OseeLog.reportStatus(new BaseStatus(NAME, Level.INFO, "%s [%s as %s]", databaseInfo.getDriver(),
+ databaseInfo.getDatabaseName(), databaseInfo.getDatabaseLoginName()));
+ return databaseInfo;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider#getPriority()
+ */
+ @Override
+ public int getPriority() {
+ return Integer.MAX_VALUE;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerTaskScheduler.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerTaskScheduler.java
new file mode 100644
index 00000000000..5ae5d3b4781
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/ServerTaskScheduler.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.framework.core.server.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IServerTask;
+import org.eclipse.osee.framework.core.server.IServerTaskScheduler;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServerTaskScheduler implements IServerTaskScheduler {
+ private final Map<Runnable, ScheduledFuture<?>> futures;
+ private final ScheduledExecutorService executor;
+
+ public ServerTaskScheduler() {
+ futures = Collections.synchronizedMap(new HashMap<Runnable, ScheduledFuture<?>>());
+ executor =
+ Executors.newSingleThreadScheduledExecutor(CoreServerActivator.createNewThreadFactory("Osee Task Scheduler"));
+ }
+
+ public void addServerTask(IServerTask taskProvider) {
+ if (taskProvider != null) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, "Adding task: " + taskProvider.getName());
+ switch (taskProvider.getSchedulingScheme()) {
+ case ONE_SHOT:
+ scheduleOneShot(taskProvider, taskProvider.getInitialDelay(), taskProvider.getTimeUnit());
+ break;
+ case FIXED_DELAY_BETWEEN_RUNS:
+ scheduleWithFixedDelay(taskProvider, taskProvider.getInitialDelay(), taskProvider.getPeriod(),
+ taskProvider.getTimeUnit());
+ break;
+ case FIXED_RATE:
+ scheduleAtFixedRate(taskProvider, taskProvider.getInitialDelay(), taskProvider.getPeriod(),
+ taskProvider.getTimeUnit());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public void removeServerTask(IServerTask taskProvider) {
+ if (taskProvider != null) {
+ OseeLog.log(CoreServerActivator.class, Level.INFO, "Removing task: " + taskProvider.getName());
+ ScheduledFuture<?> future = futures.get(taskProvider);
+ if (future != null) {
+ future.cancel(true);
+ futures.remove(future);
+ }
+ }
+ }
+
+ private void scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
+ ScheduledFuture<?> futureTask = executor.scheduleAtFixedRate(command, initialDelay, period, unit);
+ futures.put(command, futureTask);
+ }
+
+ private void scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
+ ScheduledFuture<?> futureTask = executor.scheduleWithFixedDelay(command, initialDelay, delay, unit);
+ futures.put(command, futureTask);
+ }
+
+ private void scheduleOneShot(Runnable command, long initialDelay, TimeUnit unit) {
+ ScheduledFuture<?> futureTask = executor.schedule(command, initialDelay, unit);
+ futures.put(command, futureTask);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionDataStore.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionDataStore.java
new file mode 100644
index 00000000000..083ad76e58a
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionDataStore.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.framework.core.server.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.core.data.OseeSession;
+import org.eclipse.osee.framework.core.server.SessionData;
+import org.eclipse.osee.framework.core.server.SessionData.SessionState;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SessionDataStore {
+
+ private static final String INSERT_SESSION =
+ "INSERT INTO osee_session (managed_by_server_id, session_id, user_id, client_machine_name, client_address, client_port, client_version, created_on, last_interaction_date, last_interaction) VALUES (?,?,?,?,?,?,?,?,?,?)";
+
+ private static final String DELETE_SESSION = "DELETE FROM osee_session WHERE session_id = ?";
+
+ private static final String UPDATE_SESSION =
+ "UPDATE osee_session SET managed_by_server_id = ?, last_interaction_date = ?, last_interaction = ? WHERE session_id = ?";
+
+ private static final String LOAD_SESSIONS_BY_SERVER_ID = "select * from osee_session WHERE managed_by_server_id = ?";
+
+ private static final String GET_ALL_SESSIONS = "select * from osee_session";
+
+ private static final String GET_SESSIONS_FOR_USER_ID = "select * from osee_session where user_id = ?";
+
+ private SessionDataStore() {
+ }
+
+ public static boolean isSessionTableAvailable() {
+ return ConnectionHandler.doesTableExist("osee_session");
+ }
+
+ public static void deleteSession(String... sessionIds) throws OseeDataStoreException {
+ if (sessionIds != null) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (String session : sessionIds) {
+ data.add(new Object[] {session});
+ }
+ ConnectionHandler.runBatchUpdate(DELETE_SESSION, data);
+ }
+ }
+
+ public static void createSessions(String serverId, OseeSession... sessions) throws OseeDataStoreException {
+ if (sessions != null && sessions.length > 0) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (OseeSession session : sessions) {
+ data.add(new Object[] {serverId, session.getSessionId(), session.getUserId(),
+ session.getClientMachineName(), session.getClientAddress(), session.getPort(), session.getVersion(),
+ session.getCreation(), session.getLastInteractionDate(), session.getLastInteraction()});
+ }
+ ConnectionHandler.runBatchUpdate(INSERT_SESSION, data);
+ }
+ }
+
+ public static void updateSessions(String serverId, OseeSession... sessions) throws OseeDataStoreException {
+ if (sessions != null && sessions.length > 0) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (OseeSession session : sessions) {
+ data.add(new Object[] {serverId, session.getLastInteractionDate(), session.getLastInteraction(),
+ session.getSessionId()});
+ }
+ ConnectionHandler.runBatchUpdate(UPDATE_SESSION, data);
+ }
+ }
+
+ public static void loadSessions(String serverId, Map<String, SessionData> sessionCache) throws OseeDataStoreException {
+ if (Strings.isValid(serverId)) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(LOAD_SESSIONS_BY_SERVER_ID, serverId);
+ while (chStmt.next()) {
+ String sessionId = chStmt.getString("session_id");
+ if (!sessionCache.containsKey(sessionId)) {
+ sessionCache.put(sessionId, toSessionData(sessionId, chStmt));
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ public static List<SessionData> getSessionsForUserId(String userId) throws OseeDataStoreException {
+ List<SessionData> toReturn = new ArrayList<SessionData>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_SESSIONS_FOR_USER_ID, userId);
+ while (chStmt.next()) {
+ String sessionId = chStmt.getString("session_id");
+ toReturn.add(toSessionData(sessionId, chStmt));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ public static List<SessionData> getAllSessions() throws OseeDataStoreException {
+ List<SessionData> toReturn = new ArrayList<SessionData>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ALL_SESSIONS);
+ while (chStmt.next()) {
+ String sessionId = chStmt.getString("session_id");
+ toReturn.add(toSessionData(sessionId, chStmt));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ private static SessionData toSessionData(String sessionId, ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ OseeSession session =
+ new OseeSession(sessionId, chStmt.getString("user_id"), chStmt.getTimestamp("created_on"),
+ chStmt.getString("client_machine_name"), chStmt.getString("client_address"),
+ chStmt.getInt("client_port"), chStmt.getString("client_version"),
+ chStmt.getTimestamp("last_interaction_date"), chStmt.getString("last_interaction"));
+ return new SessionData(SessionState.CURRENT, session);
+ }
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionManager.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionManager.java
new file mode 100644
index 00000000000..95dc09ef400
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/SessionManager.java
@@ -0,0 +1,311 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.server.internal;
+
+import java.io.ByteArrayOutputStream;
+import java.net.URL;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.OseeSession;
+import org.eclipse.osee.framework.core.data.OseeSessionGrant;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.exception.OseeInvalidSessionException;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IAuthenticationManager;
+import org.eclipse.osee.framework.core.server.ISessionManager;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.core.server.SessionData;
+import org.eclipse.osee.framework.core.server.SessionData.SessionState;
+import org.eclipse.osee.framework.db.connection.DatabaseInfoManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SessionManager implements ISessionManager {
+
+ private static final long DATASTORE_UPDATE = 1000 * 5;
+
+ private final Map<String, SessionData> sessionCache;
+ private final Timer updateTimer;
+
+ public SessionManager() {
+ this.sessionCache = Collections.synchronizedMap(new HashMap<String, SessionData>());
+ this.updateTimer = new Timer("Persist Session Data Timer");
+ updateTimer.scheduleAtFixedRate(new UpdateDataStore(), DATASTORE_UPDATE, DATASTORE_UPDATE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#getSessionByClientAddress(java.lang.String)
+ */
+ @Override
+ public List<SessionData> getSessionByClientAddress(String clientAddress) {
+ List<SessionData> toReturn = new ArrayList<SessionData>();
+ synchronized (sessionCache) {
+ for (SessionData sessionData : sessionCache.values()) {
+ if (sessionData.getSession().getClientAddress().equals(clientAddress)) {
+ toReturn.add(sessionData);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public boolean isAlive(OseeSession oseeSession) throws OseeCoreException {
+ boolean wasAlive = false;
+ try {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ URL url =
+ new URL(String.format("http://%s:%s/osee/request?cmd=pingId", oseeSession.getClientAddress(),
+ oseeSession.getPort()));
+ AcquireResult result = HttpProcessor.acquire(url, outputStream);
+ if (result.wasSuccessful()) {
+ String sessionId = outputStream.toString(result.getEncoding());
+ if (Strings.isValid(sessionId)) {
+ wasAlive = sessionId.contains(oseeSession.getSessionId());
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ return wasAlive;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#getSessions(java.lang.String, boolean includeNonServerManagedSessions)
+ */
+ @Override
+ public List<SessionData> getAllSessions(boolean includeNonServerManagedSessions) throws OseeDataStoreException {
+ List<SessionData> toReturn = null;
+ if (includeNonServerManagedSessions) {
+ toReturn = SessionDataStore.getAllSessions();
+ } else {
+ synchronized (sessionCache) {
+ toReturn = new ArrayList<SessionData>(sessionCache.values());
+ }
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#getSessionsByUserId(java.lang.String, boolean)
+ */
+ @Override
+ public List<SessionData> getSessionsByUserId(String userId, boolean includeNonServerManagedSessions) throws OseeCoreException {
+ List<SessionData> toReturn = null;
+ if (includeNonServerManagedSessions) {
+ toReturn = SessionDataStore.getAllSessions();
+ } else {
+ toReturn = new ArrayList<SessionData>();
+ synchronized (sessionCache) {
+ for (SessionData sessionData : sessionCache.values()) {
+ if (sessionData.getSession().getUserId().equals(userId)) {
+ toReturn.add(sessionData);
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#getSessionById(java.lang.String)
+ */
+ @Override
+ public SessionData getSessionById(String sessionId) {
+ return sessionCache.get(sessionId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#createSession(org.eclipse.osee.framework.core.data.OseeCredential)
+ */
+ @Override
+ public OseeSessionGrant createSession(OseeCredential credential) throws OseeCoreException {
+ OseeSessionGrant sessionGrant = null;
+
+ IAuthenticationManager authenticationManager = CoreServerActivator.getAuthenticationManager();
+ boolean isAuthenticated = authenticationManager.authenticate(credential);
+
+ if (isAuthenticated) {
+ SessionState sessionState = SessionState.CREATED;
+ Timestamp timestamp = GlobalTime.GreenwichMeanTimestamp();
+
+ IOseeUserInfo oseeUserInfo = authenticationManager.asOseeUser(credential);
+
+ OseeSession session =
+ new OseeSession(GUID.generateGuidStr(), oseeUserInfo.getUserID(), timestamp,
+ credential.getClientMachineName(), credential.getClientAddress(), credential.getPort(),
+ credential.getVersion(), timestamp, sessionState.name().toLowerCase());
+
+ SessionData sessionData = new SessionData(sessionState, session);
+ sessionCache.put(sessionData.getSessionId(), sessionData);
+ sessionGrant = new OseeSessionGrant(sessionData.getSessionId());
+ sessionGrant.setCreationRequired(oseeUserInfo.isCreationRequired());
+ sessionGrant.setOseeUserInfo(oseeUserInfo);
+ sessionGrant.setDatabaseInfo(DatabaseInfoManager.getDefault());
+ sessionGrant.setSqlProperties(OseeSql.getSqlProperties());
+ sessionGrant.setDataStorePath(OseeServerProperties.getOseeApplicationServerData());
+ }
+ return sessionGrant;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#releaseSession(java.lang.String)
+ */
+ @Override
+ public void releaseSession(String sessionId) {
+ SessionData sessionData = getSessionById(sessionId);
+ if (sessionData != null) {
+ sessionData.setSessionState(SessionState.DELETED);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.ISessionManager#updateSessionActivity(java.lang.String, java.lang.String)
+ */
+ @Override
+ public void updateSessionActivity(String sessionId, String interactionName) throws OseeInvalidSessionException {
+ SessionData sessionData = getSessionById(sessionId);
+ if (sessionData != null) {
+ if (sessionData.getSessionState() == SessionState.CURRENT) {
+ sessionData.setSessionState(SessionState.UPDATED);
+ }
+ sessionData.getSession().setLastInteraction(Strings.isValid(interactionName) ? interactionName : "");
+ sessionData.getSession().setLastInteractionDate(GlobalTime.GreenwichMeanTimestamp());
+ } else {
+ throw new OseeInvalidSessionException(String.format("Session was invalid: [%s]", sessionId));
+ }
+ }
+
+ public void releaseSessionImmediate(String... sessionIds) throws OseeCoreException {
+ if (sessionIds != null && sessionIds.length > 0) {
+ SessionDataStore.deleteSession(sessionIds);
+ synchronized (sessionCache) {
+ for (String session : sessionIds) {
+ sessionCache.remove(session);
+ }
+ }
+ }
+ }
+
+ private final class UpdateDataStore extends TimerTask {
+
+ private boolean firstTimeThrough = true;
+
+ @Override
+ public void run() {
+ if (firstTimeThrough) {
+ firstTimeThrough = false;
+ if (SessionDataStore.isSessionTableAvailable()) {
+ recoverSessions();
+ }
+ }
+
+ List<String> deleteIds = new ArrayList<String>();
+ List<OseeSession> createData = new ArrayList<OseeSession>();
+ List<OseeSession> updateData = new ArrayList<OseeSession>();
+ synchronized (sessionCache) {
+ for (SessionData sessionData : sessionCache.values()) {
+ if (sessionData != null) {
+ switch (sessionData.getSessionState()) {
+ case CREATED:
+ createData.add(sessionData.getSession());
+ break;
+ case DELETED:
+ deleteIds.add(sessionData.getSessionId());
+ break;
+ case UPDATED:
+ updateData.add(sessionData.getSession());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ createItems(createData);
+ updateItems(updateData);
+ deleteItems(deleteIds);
+ }
+ }
+
+ private void recoverSessions() {
+ try {
+ String serverId = CoreServerActivator.getApplicationServerManager().getId();
+ SessionDataStore.loadSessions(serverId, sessionCache);
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.WARNING, "Error loading sessions.", ex);
+ }
+ }
+
+ private void updateItems(List<OseeSession> sessionsList) {
+ createUpdateHelper(sessionsList, false);
+ }
+
+ private void createItems(List<OseeSession> sessionsList) {
+ createUpdateHelper(sessionsList, true);
+ }
+
+ private void createUpdateHelper(List<OseeSession> sessionsList, boolean isCreate) {
+ try {
+ if (!sessionsList.isEmpty()) {
+ String serverId = CoreServerActivator.getApplicationServerManager().getId();
+ OseeSession[] sessionsArray = sessionsList.toArray(new OseeSession[sessionsList.size()]);
+ SessionState stateToSet = isCreate ? SessionState.CREATED : SessionState.UPDATED;
+ if (isCreate) {
+ SessionDataStore.createSessions(serverId, sessionsArray);
+ } else {
+ SessionDataStore.updateSessions(serverId, sessionsArray);
+ }
+ for (OseeSession session : sessionsArray) {
+ SessionData sessionData = sessionCache.get(session.getSessionId());
+ if (sessionData.getSessionState() == stateToSet) {
+ sessionData.setSessionState(SessionState.CURRENT);
+ }
+ }
+ }
+ } catch (OseeDataStoreException ex) {
+ // Do Nothing
+ }
+ }
+
+ private void deleteItems(List<String> sessionIds) {
+ try {
+ if (!sessionIds.isEmpty()) {
+ SessionDataStore.deleteSession(sessionIds.toArray(new String[sessionIds.size()]));
+ for (String ids : sessionIds) {
+ sessionCache.remove(ids);
+ }
+ }
+ } catch (OseeDataStoreException ex) {
+ // Do Nothing
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/TrustAllAuthenticationProvider.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/TrustAllAuthenticationProvider.java
new file mode 100644
index 00000000000..25ab31b001a
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/TrustAllAuthenticationProvider.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.framework.core.server.internal;
+
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.core.server.IAuthenticationProvider;
+import org.eclipse.osee.framework.core.server.UserDataStore;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TrustAllAuthenticationProvider implements IAuthenticationProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.session.management.IAuthenticationProvider#authenticate(org.eclipse.osee.framework.core.data.OseeCredential)
+ */
+ @Override
+ public boolean authenticate(OseeCredential credential) throws OseeAuthenticationException {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.session.management.IAuthenticationProvider#getId()
+ */
+ @Override
+ public String getProtocol() {
+ return "trustAll";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IAuthenticationProvider#asOseeUserId(org.eclipse.osee.framework.core.data.OseeCredential)
+ */
+ @Override
+ public IOseeUserInfo asOseeUserId(OseeCredential credential) throws OseeAuthenticationException {
+ IOseeUserInfo oseeUserId = SystemUser.Guest;
+ String userName = credential.getUserName();
+ if (Strings.isValid(userName)) {
+ oseeUserId = UserDataStore.getOseeUserFromOseeDb(userName);
+ if (oseeUserId == null) {
+ oseeUserId = UserDataStore.createUser(true, userName, userName, "", true);
+ }
+ }
+ return oseeUserId;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/task/CleanJoinTablesServerTask.java b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/task/CleanJoinTablesServerTask.java
new file mode 100644
index 00000000000..744a86ddd96
--- /dev/null
+++ b/org.eclipse.osee.framework.core.server/src/org/eclipse/osee/framework/core/server/internal/task/CleanJoinTablesServerTask.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.framework.core.server.internal.task;
+
+import java.sql.Timestamp;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IServerTask;
+import org.eclipse.osee.framework.core.server.SchedulingScheme;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CleanJoinTablesServerTask implements IServerTask {
+
+ private final static String DELETE_JOIN_TIME = "DELETE FROM %s WHERE insert_time < ?";
+ private final static long TEN_MINUTES = 10;
+ private final static long TWENTY_MINUTES = 1000 * 60 * 20;
+
+ private static final String NAME = "Clean up join tables";
+
+ private static final String[] TABLES =
+ new String[] {"osee_join_artifact", "osee_join_attribute", "osee_join_transaction", "osee_join_export_import",
+ "osee_join_search_tags"};
+
+ public String getName() {
+ return NAME;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ // if (DEBUG) {
+ // Calendar cal = Calendar.getInstance();
+ // SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy 'at' hh:mm:ss");
+ // OseeLog.log(CoreServerActivator.class, Level.INFO, String.format("Join Table cleanup ran on %s",
+ // sdf.format(cal.getTime())));
+ // }
+ Timestamp time = new Timestamp(System.currentTimeMillis() - TWENTY_MINUTES);
+ for (String table : TABLES) {
+ ConnectionHandler.runPreparedUpdate(String.format(DELETE_JOIN_TIME, table), time);
+ }
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(CoreServerActivator.class, Level.WARNING, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IServerTask#getInitialDelay()
+ */
+ @Override
+ public long getInitialDelay() {
+ return getPeriod();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IServerTask#getPeriod()
+ */
+ @Override
+ public long getPeriod() {
+ return TEN_MINUTES;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IServerTask#getSchedulingScheme()
+ */
+ @Override
+ public SchedulingScheme getSchedulingScheme() {
+ return SchedulingScheme.FIXED_RATE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.IServerTask#getTimeUnit()
+ */
+ @Override
+ public TimeUnit getTimeUnit() {
+ return TimeUnit.MINUTES;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/.classpath b/org.eclipse.osee.framework.core/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.core/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.core/.project b/org.eclipse.osee.framework.core/.project
new file mode 100644
index 00000000000..db1263eca91
--- /dev/null
+++ b/org.eclipse.osee.framework.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..f66e589f1ab
--- /dev/null
+++ b/org.eclipse.osee.framework.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Tue Oct 28 17:43:50 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.core/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.core/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..d6121b4c666
--- /dev/null
+++ b/org.eclipse.osee.framework.core/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Tue Oct 28 17:43:50 MST 2008
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.core/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c49814b9325
--- /dev/null
+++ b/org.eclipse.osee.framework.core/META-INF/MANIFEST.MF
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Core Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.core
+Bundle-Version: 0.8.1.qualifier
+Bundle-Activator: org.eclipse.osee.framework.core.CoreActivator
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: com.lowagie.text,
+ com.lowagie.text.html,
+ com.lowagie.text.markup,
+ com.lowagie.text.pdf,
+ com.lowagie.text.rtf,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.time,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.framework.core,
+ 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
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.core/build.properties b/org.eclipse.osee.framework.core/build.properties
new file mode 100644
index 00000000000..7777f3daf36
--- /dev/null
+++ b/org.eclipse.osee.framework.core/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ support/
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/CoreActivator.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/CoreActivator.java
new file mode 100644
index 00000000000..8dfd071aa95
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/CoreActivator.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.framework.core;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class CoreActivator implements BundleActivator {
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.core";
+ private static CoreActivator instance = null;
+ private BundleContext bundleContext;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ instance.bundleContext = context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ instance.bundleContext = null;
+ instance = null;
+ }
+
+ public static BundleContext getBundleContext() {
+ return instance.bundleContext;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/BaseExchangeData.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/BaseExchangeData.java
new file mode 100644
index 00000000000..337044916cc
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/BaseExchangeData.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.framework.core.data;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.util.Properties;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStoreWriter;
+
+public class BaseExchangeData implements Serializable {
+ private static final long serialVersionUID = -3844333805269321833L;
+ protected final PropertyStore backingData;
+
+ public BaseExchangeData() {
+ super();
+ this.backingData = new PropertyStore(Integer.toString(this.hashCode()));
+ }
+
+ protected String getString(String key) {
+ return backingData.get(key);
+ }
+
+ /**
+ * Set data from XML input stream
+ *
+ * @param xml inputStream
+ * @throws OseeWrappedException
+ */
+ protected void loadfromXml(InputStream inputStream) throws OseeWrappedException {
+ try {
+ PropertyStoreWriter writer = new PropertyStoreWriter();
+ writer.load(backingData, inputStream);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ /**
+ * Write to output stream
+ *
+ * @param outputStream
+ * @throws OseeWrappedException
+ */
+ public void write(OutputStream outputStream) throws OseeWrappedException {
+ try {
+ PropertyStoreWriter writer = new PropertyStoreWriter();
+ writer.save(backingData, outputStream);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return this.backingData.toString();
+ }
+
+ protected void putProperties(String fieldName, Properties properties) {
+ for (Object theKey : properties.keySet()) {
+ String keyStr = String.format("%s.%s", fieldName, theKey);
+ backingData.put(keyStr, properties.getProperty((String) theKey));
+ }
+ }
+
+ protected Properties getPropertyString(String fieldName) {
+ String prefix = fieldName + ".";
+ Properties toReturn = new Properties();
+ for (String key : backingData.keySet()) {
+ if (key.startsWith(prefix)) {
+ String normalizedKey = key.substring(prefix.length(), key.length());
+ toReturn.put(normalizedKey, backingData.get(key));
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUser.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUser.java
new file mode 100644
index 00000000000..5618ae9d6d9
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUser.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.framework.core.data;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOseeUser {
+ String getEmail();
+
+ String getName();
+
+ String getUserID();
+
+ boolean isActive();
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUserInfo.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUserInfo.java
new file mode 100644
index 00000000000..817077b0d07
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/IOseeUserInfo.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.framework.core.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOseeUserInfo extends IOseeUser {
+
+ public boolean isCreationRequired();
+
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/JoinUtility.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/JoinUtility.java
new file mode 100644
index 00000000000..05fc88102ec
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/JoinUtility.java
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.data;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class JoinUtility {
+
+ private static final String INSERT_INTO_JOIN_ARTIFACT =
+ "INSERT INTO osee_join_artifact (query_id, insert_time, art_id, branch_id) VALUES (?, ?, ?, ?)";
+
+ private static final String INSERT_INTO_JOIN_ATTRIBUTE =
+ "INSERT INTO osee_join_attribute (attr_query_id, insert_time, value) VALUES (?, ?, ?)";
+
+ private static final String INSERT_INTO_JOIN_TRANSACTION =
+ "INSERT INTO osee_join_transaction (query_id, insert_time, gamma_id, transaction_id) VALUES (?, ?, ?, ?)";
+
+ private static final String INSERT_INTO_JOIN_SEARCH_TAGS =
+ "INSERT INTO osee_join_search_tags (query_id, insert_time, coded_tag_id) VALUES (?, ?, ?)";
+
+ private static final String INSERT_INTO_TAG_GAMMA_QUEUE =
+ "INSERT INTO osee_tag_gamma_queue (query_id, insert_time, gamma_id) VALUES (?, ?, ?)";
+
+ private static final String INSERT_INTO_JOIN_EXPORT_IMPORT =
+ "INSERT INTO osee_join_export_import (query_id, insert_time, id1, id2) VALUES (?, ?, ?, ?)";
+
+ private static final String DELETE_FROM_JOIN_TRANSACTION = "DELETE FROM osee_join_transaction WHERE query_id = ?";
+ private static final String DELETE_FROM_JOIN_ARTIFACT = "DELETE FROM osee_join_artifact WHERE query_id = ?";
+ private static final String DELETE_FROM_JOIN_ATTRIBUTE = "DELETE FROM osee_join_attribute WHERE attr_query_id = ?";
+ private static final String DELETE_FROM_JOIN_SEARCH_TAGS = "DELETE FROM osee_join_search_tags WHERE query_id = ?";
+ private static final String DELETE_FROM_TAG_GAMMA_QUEUE = "DELETE FROM osee_tag_gamma_queue WHERE query_id = ?";
+ private static final String DELETE_FROM_JOIN_EXPORT_IMPORT = "DELETE FROM osee_join_export_import WHERE query_id =?";
+
+ private static final String SELECT_TAG_GAMMA_QUEUE_QUERIES = "select DISTINCT query_id from osee_tag_gamma_queue";
+
+ public enum JoinItem {
+ TRANSACTION(INSERT_INTO_JOIN_TRANSACTION, DELETE_FROM_JOIN_TRANSACTION),
+ ARTIFACT(INSERT_INTO_JOIN_ARTIFACT, DELETE_FROM_JOIN_ARTIFACT),
+ ATTRIBUTE(INSERT_INTO_JOIN_ATTRIBUTE, DELETE_FROM_JOIN_ATTRIBUTE),
+ SEARCH_TAGS(INSERT_INTO_JOIN_SEARCH_TAGS, DELETE_FROM_JOIN_SEARCH_TAGS),
+ TAG_GAMMA_QUEUE(INSERT_INTO_TAG_GAMMA_QUEUE, DELETE_FROM_TAG_GAMMA_QUEUE),
+ EXPORT_IMPORT(INSERT_INTO_JOIN_EXPORT_IMPORT, DELETE_FROM_JOIN_EXPORT_IMPORT);
+
+ private final String deleteSql;
+ private final String insertSql;
+
+ JoinItem(String insertSql, String deleteSql) {
+ this.deleteSql = deleteSql;
+ this.insertSql = insertSql;
+ }
+
+ String getDeleteSql() {
+ return deleteSql;
+ }
+
+ String getInsertSql() {
+ return insertSql;
+ }
+ }
+
+ private JoinUtility() {
+ }
+
+ public static int getNewQueryId() {
+ return (int) (Math.random() * Integer.MAX_VALUE);
+ }
+
+ public static TransactionJoinQuery createTransactionJoinQuery() {
+ return new TransactionJoinQuery();
+ }
+
+ public static ArtifactJoinQuery createArtifactJoinQuery() {
+ return new ArtifactJoinQuery();
+ }
+
+ public static AttributeJoinQuery createAttributeJoinQuery() {
+ return new AttributeJoinQuery();
+ }
+
+ public static SearchTagJoinQuery createSearchTagJoinQuery() {
+ return new SearchTagJoinQuery();
+ }
+
+ public static TagQueueJoinQuery createTagQueueJoinQuery() {
+ return new TagQueueJoinQuery();
+ }
+
+ public static ExportImportJoinQuery createExportImportJoinQuery() {
+ return new ExportImportJoinQuery();
+ }
+
+ public static List<Integer> getAllTagQueueQueryIds() throws OseeDataStoreException {
+ List<Integer> queryIds = new ArrayList<Integer>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_TAG_GAMMA_QUEUE_QUERIES);
+ while (chStmt.next()) {
+ queryIds.add(chStmt.getInt("query_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return queryIds;
+ }
+
+ private static abstract class JoinQueryEntry {
+ public final JoinItem joinItem;
+ private final int queryId;
+ private final Timestamp insertTime;
+ protected Set<IJoinRow> entries;
+ private boolean wasStored;
+ private int storedSize;
+
+ public JoinQueryEntry(JoinItem joinItem) {
+ this.wasStored = false;
+ this.joinItem = joinItem;
+ this.queryId = getNewQueryId();
+ this.insertTime = GlobalTime.GreenwichMeanTimestamp();
+ this.entries = new HashSet<IJoinRow>();
+ this.storedSize = -1;
+ }
+
+ public boolean isEmpty() {
+ return this.wasStored != true ? entries.isEmpty() : this.storedSize > 0;
+ }
+
+ public int size() {
+ return this.wasStored != true ? entries.size() : this.storedSize;
+ }
+
+ public int getQueryId() {
+ return queryId;
+ }
+
+ public Timestamp getInsertTime() {
+ return insertTime;
+ }
+
+ public void store(OseeConnection connection) throws OseeDataStoreException {
+ if (this.wasStored != true) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (IJoinRow joinArray : entries) {
+ data.add(joinArray.toArray());
+ }
+ ConnectionHandler.runBatchUpdate(connection, joinItem.getInsertSql(), data);
+ this.storedSize = this.entries.size();
+ this.wasStored = true;
+ this.entries.clear();
+ } else {
+ throw new OseeDataStoreException("Cannot store query id twice");
+ }
+ }
+
+ public int delete(OseeConnection connection) throws OseeDataStoreException {
+ int updated = 0;
+ if (queryId != -1) {
+ updated = ConnectionHandler.runPreparedUpdate(connection, joinItem.getDeleteSql(), queryId);
+ }
+ return updated;
+ }
+
+ public void store() throws OseeDataStoreException {
+ store(null);
+ }
+
+ public int delete() throws OseeDataStoreException {
+ return delete(null);
+ }
+
+ public String toString() {
+ return String.format("id: [%s] entrySize: [%d]", getQueryId(), size());
+ }
+ }
+
+ public static void deleteQuery(OseeConnection connection, JoinItem item, int queryId) throws Exception {
+ if (item != null) {
+ ConnectionHandler.runPreparedUpdate(connection, item.getDeleteSql(), queryId);
+ }
+ }
+
+ public static void deleteQuery(JoinItem item, int queryId) throws Exception {
+ if (item != null) {
+ ConnectionHandler.runPreparedUpdate(item.getDeleteSql(), queryId);
+ }
+ }
+
+ private interface IJoinRow {
+ public Object[] toArray();
+
+ public String toString();
+ }
+
+ public static final class TransactionJoinQuery extends JoinQueryEntry {
+
+ private final class TempTransactionEntry implements IJoinRow {
+ private int gammaId;
+ private int transactionId;
+
+ private TempTransactionEntry(int gammaId, int transactionId) {
+ this.gammaId = gammaId;
+ this.transactionId = transactionId;
+ }
+
+ public Object[] toArray() {
+ return new Object[] {getQueryId(), getInsertTime(), gammaId, transactionId};
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof TempTransactionEntry)) return false;
+ TempTransactionEntry other = (TempTransactionEntry) obj;
+ return other.gammaId == this.gammaId && other.transactionId == this.transactionId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return 37 * gammaId * transactionId;
+ }
+
+ public String toString() {
+ return String.format("gamma_id=%d, tx_id=%d", gammaId, transactionId);
+ }
+ }
+
+ private TransactionJoinQuery() {
+ super(JoinItem.TRANSACTION);
+ }
+
+ public void add(int gammaId, int transactionId) {
+ entries.add(new TempTransactionEntry(gammaId, transactionId));
+ }
+ }
+
+ public static final class ArtifactJoinQuery extends JoinQueryEntry {
+
+ private final class Entry implements IJoinRow {
+ private int artId;
+ private int branchId;
+
+ private Entry(int artId, int branchId) {
+ this.artId = artId;
+ this.branchId = branchId;
+ }
+
+ public Object[] toArray() {
+ return new Object[] {getQueryId(), getInsertTime(), artId, branchId};
+ }
+
+ public String toString() {
+ return String.format("art_id=%d, branch_id=%d", artId, branchId);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof Entry)) return false;
+ Entry other = (Entry) obj;
+ return other.artId == this.artId && other.branchId == this.branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return 37 * artId * branchId;
+ }
+ }
+
+ private ArtifactJoinQuery() {
+ super(JoinItem.ARTIFACT);
+ }
+
+ public void add(int art_id, int branch_id) {
+ entries.add(new Entry(art_id, branch_id));
+ }
+ }
+
+ public static final class AttributeJoinQuery extends JoinQueryEntry {
+
+ private final class Entry implements IJoinRow {
+ private String value;
+
+ private Entry(String value) {
+ this.value = value;
+ }
+
+ public Object[] toArray() {
+ return new Object[] {getQueryId(), getInsertTime(), value != null ? value : SQL3DataType.VARCHAR};
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof Entry)) return false;
+ Entry other = (Entry) obj;
+ return other.value == null && this.value == null || (other.value != null && this.value != null && this.value.equals(other.value));
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return 37 * (value != null ? value.hashCode() : -1);
+ }
+
+ public String toString() {
+ return String.format("attr_value=%s", value);
+ }
+ }
+
+ private AttributeJoinQuery() {
+ super(JoinItem.ATTRIBUTE);
+ }
+
+ public void add(String value) {
+ entries.add(new Entry(value));
+ }
+ }
+
+ public static final class SearchTagJoinQuery extends JoinQueryEntry {
+
+ private final class TagEntry implements IJoinRow {
+ private long value;
+
+ private TagEntry(long value) {
+ this.value = value;
+ }
+
+ public Object[] toArray() {
+ return new Object[] {getQueryId(), getInsertTime(), value};
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof TagEntry)) return false;
+ TagEntry other = (TagEntry) obj;
+ return this.value == other.value;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (int) (37 * value);
+ }
+
+ public String toString() {
+ return String.format("tag=%d", value);
+ }
+ }
+
+ private SearchTagJoinQuery() {
+ super(JoinItem.SEARCH_TAGS);
+ }
+
+ public void add(long tag) {
+ entries.add(new TagEntry(tag));
+ }
+ }
+
+ public static final class TagQueueJoinQuery extends JoinQueryEntry {
+
+ private final class GammaEntry implements IJoinRow {
+ private long gammaId;
+
+ private GammaEntry(long gammaId) {
+ this.gammaId = gammaId;
+ }
+
+ public Object[] toArray() {
+ return new Object[] {getQueryId(), getInsertTime(), gammaId};
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof GammaEntry)) return false;
+ GammaEntry other = (GammaEntry) obj;
+ return this.gammaId == other.gammaId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (int) (37 * gammaId);
+ }
+
+ public String toString() {
+ return String.format("gammaId=%d", gammaId);
+ }
+ }
+
+ private TagQueueJoinQuery() {
+ super(JoinItem.TAG_GAMMA_QUEUE);
+ }
+
+ public void add(long gammaId) {
+ entries.add(new GammaEntry(gammaId));
+ }
+ }
+
+ public static final class ExportImportJoinQuery extends JoinQueryEntry {
+
+ private final class ExportImportEntry implements IJoinRow {
+ private long id1;
+ private long id2;
+
+ private ExportImportEntry(long id1, long id2) {
+ this.id1 = id1;
+ this.id2 = id2;
+ }
+
+ public Object[] toArray() {
+ return new Object[] {getQueryId(), getInsertTime(), id1, id2};
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (!(obj instanceof ExportImportEntry)) return false;
+ ExportImportEntry other = (ExportImportEntry) obj;
+ return this.id1 == other.id1 && this.id2 == other.id2;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (int) (37 * id1 * id2);
+ }
+
+ public String toString() {
+ return String.format("id1=%d id2=%d", id1, id2);
+ }
+ }
+
+ private ExportImportJoinQuery() {
+ super(JoinItem.EXPORT_IMPORT);
+ }
+
+ public void add(long id1, long id2) {
+ entries.add(new ExportImportEntry(id1, id2));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeClientInfo.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeClientInfo.java
new file mode 100644
index 00000000000..f583c045497
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeClientInfo.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.framework.core.data;
+
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeClientInfo extends BaseExchangeData {
+ private static final long serialVersionUID = -4467800965183123628L;
+ private static final String CLIENT_VERSION = "clientVersion";
+ private static final String CLIENT_IP_ADDRESS = "clientIpAddress";
+ private static final String CLIENT_PORT = "clientPort";
+ private static final String CLIENT_MACHINE_NAME = "clientMachineName";
+
+ public OseeClientInfo() {
+ super();
+ }
+
+ public OseeClientInfo(String clientVersion, String machineName, String address, int port) {
+ super();
+ this.backingData.put(CLIENT_VERSION, clientVersion);
+ this.backingData.put(CLIENT_MACHINE_NAME, machineName);
+ setClientAddress(address, port);
+ }
+
+ public void setClientAddress(String address, int port) {
+ this.backingData.put(CLIENT_IP_ADDRESS, address);
+ this.backingData.put(CLIENT_PORT, port);
+ }
+
+ public void setClientVersion(String version) {
+ this.backingData.put(CLIENT_VERSION, version);
+ }
+
+ public void setClientMachineName(String name) {
+ this.backingData.put(CLIENT_MACHINE_NAME, name);
+ }
+
+ public String getClientAddress() {
+ return getString(CLIENT_IP_ADDRESS);
+ }
+
+ public String getVersion() {
+ return getString(CLIENT_VERSION);
+ }
+
+ public String getClientMachineName() {
+ return getString(CLIENT_MACHINE_NAME);
+ }
+
+ public int getPort() {
+ int toReturn = -1;
+ String port = this.getString(CLIENT_PORT);
+ if (Strings.isValid(port)) {
+ toReturn = Integer.valueOf(port);
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCodeVersion.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCodeVersion.java
new file mode 100644
index 00000000000..66ba0f53ae8
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCodeVersion.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.framework.core.data;
+
+import org.eclipse.osee.framework.core.CoreActivator;
+
+/**
+ * @author Donald G. Dunne
+ * @author Ryan D. Brooks
+ */
+public final class OseeCodeVersion {
+
+ private OseeCodeVersion() {
+ }
+
+ /**
+ * Gets version
+ *
+ * @return the version
+ */
+ public static String getVersion() {
+ String bundleVersion = getBundleVersion();
+ if (isDevelopment(bundleVersion)) {
+ return "Development";
+ }
+ return bundleVersion;
+ }
+
+ private static String getBundleVersion() {
+ return (String) CoreActivator.getBundleContext().getBundle().getHeaders().get(
+ org.osgi.framework.Constants.BUNDLE_VERSION);
+ }
+
+ public static boolean isDevelopment() {
+ return isDevelopment(getBundleVersion());
+ }
+
+ private static boolean isDevelopment(String version) {
+ // The version of this bundle ends with .qualifier until it is replaced by PDE build with a time stamp
+ return version.endsWith("qualifier");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCredential.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCredential.java
new file mode 100644
index 00000000000..c3bdae6c137
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeCredential.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.framework.core.data;
+
+import java.io.InputStream;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeCredential extends OseeClientInfo {
+ private static final long serialVersionUID = 4583587251351958961L;
+ private static final String USERNAME = "userName";
+ private static final String PASSWORD = "password";
+ private static final String DOMAIN = "domain";
+ private static final String AUTHENTICATION_PROTOCOL = "authenticationProtocol";
+
+ public OseeCredential() {
+ super();
+ }
+
+ public void setUserName(String userName) {
+ this.backingData.put(USERNAME, userName);
+ }
+
+ public void setPassword(String password) {
+ this.backingData.put(PASSWORD, password);
+ }
+
+ public void setDomain(String domain) {
+ this.backingData.put(DOMAIN, domain);
+ }
+
+ public String getUserName() {
+ return getString(USERNAME);
+ }
+
+ public String getPassword() {
+ return getString(PASSWORD);
+ }
+
+ public String getDomain() {
+ return getString(DOMAIN);
+ }
+
+ public String getAuthenticationProtocol() {
+ return getString(AUTHENTICATION_PROTOCOL);
+ }
+
+ public void setAuthenticationProtocol(String protocol) {
+ this.backingData.put(AUTHENTICATION_PROTOCOL, protocol);
+ }
+
+ /**
+ * Create new instance from XML input
+ *
+ * @param OseeCredential the new instance
+ * @throws OseeWrappedException
+ */
+ public static OseeCredential fromXml(InputStream inputStream) throws OseeWrappedException {
+ OseeCredential session = new OseeCredential();
+ session.loadfromXml(inputStream);
+ return session;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeDatabaseId.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeDatabaseId.java
new file mode 100644
index 00000000000..d9e963f440a
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeDatabaseId.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.framework.core.data;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * This is a unique identifier generated upon database initialization. The field should never be changed in the database
+ * once it has been created.
+ *
+ * @author Roberto E. Escobar
+ */
+public class OseeDatabaseId {
+
+ private static final String DB_ID_KEY = "osee.db.guid";
+ private static String databaseId = null;
+
+ private OseeDatabaseId() {
+ }
+
+ public static String getKey() {
+ return DB_ID_KEY;
+ }
+
+ public synchronized static String getGuid() throws OseeDataStoreException {
+ if (databaseId == null) {
+ databaseId = OseeInfo.getValue(DB_ID_KEY);
+ }
+ return databaseId;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeInfo.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeInfo.java
new file mode 100644
index 00000000000..0d39ccc4ea9
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeInfo.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.framework.core.data;
+
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeInfo {
+ private static final String GET_VALUE_SQL = "Select OSEE_VALUE FROM osee_info where OSEE_KEY = ?";
+ private static final String INSERT_KEY_VALUE_SQL = "INSERT INTO osee_info (OSEE_KEY, OSEE_VALUE) VALUES (?, ?)";
+ private static final String DELETE_KEY_SQL = "DELETE FROM osee_info WHERE OSEE_KEY = ?";
+ public static final String SAVE_OUTFILE_IN_DB = "SAVE_OUTFILE_IN_DB";
+
+ public static String getValue(String key) throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchString("", GET_VALUE_SQL, key);
+ }
+
+ public static void putValue(String key, String value) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(DELETE_KEY_SQL, key);
+ ConnectionHandler.runPreparedUpdate(INSERT_KEY_VALUE_SQL, key, value);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerContext.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerContext.java
new file mode 100644
index 00000000000..a36719b6512
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerContext.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.framework.core.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeServerContext {
+
+ private static final String BASE_CONTEXT = "osee";
+
+ public static final String PROCESS_CONTEXT = "GET.ARTIFACT"; // For backwards compatibility must remain without base context.
+ public static final String SEARCH_CONTEXT = asAbsoluteContext("search");
+ public static final String MANAGER_CONTEXT = asAbsoluteContext("manager");
+ public static final String BRANCH_CREATION_CONTEXT = asAbsoluteContext("branch");
+ public static final String BRANCH_EXCHANGE_CONTEXT = asAbsoluteContext("branch/exchange");
+ public static final String SEARCH_TAGGING_CONTEXT = asAbsoluteContext("search/tagger");
+ public static final String RESOURCE_CONTEXT = asAbsoluteContext("resource");
+ public static final String SESSION_CONTEXT = asAbsoluteContext("session");
+ public static final String LOOKUP_CONTEXT = asAbsoluteContext("server/lookup");
+ public static final String CLIENT_LOOPBACK_CONTEXT = asAbsoluteContext("client/loopback");
+ public static final String ARTIFACT_CONTEXT = asAbsoluteContext("artifact");
+
+ private static final String asAbsoluteContext(String value) {
+ return BASE_CONTEXT + "/" + value;
+ }
+
+ private OseeServerContext() {
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerInfo.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerInfo.java
new file mode 100644
index 00000000000..ee30307b137
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeServerInfo.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.framework.core.data;
+
+import java.io.InputStream;
+import java.sql.Timestamp;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeServerInfo extends BaseExchangeData {
+ private static final long serialVersionUID = 2696663265012016128L;
+ private static final String[] EMPTY_ARRAY = new String[0];
+ private static final String SERVER_ADDRESS = "serverAddress";
+ private static final String PORT = "port";
+ protected static final String VERSION = "version";
+ private static final String DATE_CREATED = "creationDate";
+ private static final String SERVER_ID = "serverId";
+ private static final String IS_ACCEPTING_REQUESTS = "isAcceptingRequests";
+
+ private OseeServerInfo() {
+ super();
+ }
+
+ public OseeServerInfo(String serverId, String serverAddress, int port, String[] version, Timestamp dateStarted, boolean isAcceptingRequests) {
+ this();
+ this.backingData.put(SERVER_ID, serverId);
+ this.backingData.put(SERVER_ADDRESS, serverAddress);
+ this.backingData.put(PORT, port);
+ this.backingData.put(VERSION, version);
+ this.backingData.put(DATE_CREATED, dateStarted.getTime());
+ this.backingData.put(IS_ACCEPTING_REQUESTS, isAcceptingRequests);
+ }
+
+ /**
+ * @return the serverId
+ */
+ public String getServerId() {
+ return getString(SERVER_ID);
+ }
+
+ /**
+ * @return the serverAddress
+ */
+ public String getServerAddress() {
+ return getString(SERVER_ADDRESS);
+ }
+
+ /**
+ * @return the port
+ */
+ public int getPort() {
+ return backingData.getInt(PORT);
+ }
+
+ /**
+ * @return the version
+ */
+ public String[] getVersion() {
+ String[] toReturn = backingData.getArray(VERSION);
+ return toReturn != null ? toReturn : EMPTY_ARRAY;
+ }
+
+ /**
+ * @return whether requests are accepted
+ */
+ public boolean isAcceptingRequests() {
+ return backingData.getBoolean(IS_ACCEPTING_REQUESTS);
+ }
+
+ /**
+ * @return when server was launched
+ */
+ public Timestamp getDateStarted() {
+ return new Timestamp(backingData.getLong(DATE_CREATED));
+ }
+
+ /**
+ * @param whether server is accepting requests
+ */
+ public void setAcceptingRequests(boolean value) {
+ backingData.put(IS_ACCEPTING_REQUESTS, value);
+ }
+
+ /**
+ * Create new instance from XML input
+ *
+ * @param OseeServerInfo the new instance
+ * @throws OseeWrappedException
+ */
+ public static OseeServerInfo fromXml(InputStream inputStream) throws OseeWrappedException {
+ OseeServerInfo serverInfo = new OseeServerInfo();
+ serverInfo.loadfromXml(inputStream);
+ return serverInfo;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSession.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSession.java
new file mode 100644
index 00000000000..29ad361aa9c
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSession.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.data;
+
+import java.io.InputStream;
+import java.sql.Timestamp;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeSession extends OseeClientInfo {
+
+ private static final long serialVersionUID = 8144856081780854567L;
+ private static final String SESSION_ID = "sessionId";
+ private static final String USER_ID = "userId";
+ private static final String CREATED_ON = "createdOn";
+ private static final String LAST_INTERACTION_DATE = "lastInteractionDate";
+ private static final String LAST_INTERACTION = "lastInteraction";
+
+ private OseeSession() {
+ super();
+ }
+
+ public OseeSession(String sessionId, String userId, Timestamp createdOn, String machineName, String machineIp, int port, String clientVersion, Timestamp lastInteractionDate, String lastInteractionName) {
+ super(clientVersion, machineName, machineIp, port);
+ this.backingData.put(SESSION_ID, sessionId);
+ this.backingData.put(USER_ID, userId);
+ this.backingData.put(CREATED_ON, createdOn.getTime());
+ this.backingData.put(LAST_INTERACTION_DATE, lastInteractionDate.getTime());
+ this.backingData.put(LAST_INTERACTION, lastInteractionName);
+ }
+
+ /**
+ * @return the userId
+ */
+ public String getUserId() {
+ return getString(USER_ID);
+ }
+
+ /**
+ * @return the session id
+ */
+ public String getSessionId() {
+ return getString(SESSION_ID);
+ }
+
+ /**
+ * @return the session creation date
+ */
+ public Timestamp getCreation() {
+ return new Timestamp(backingData.getLong(CREATED_ON));
+ }
+
+ /**
+ * @return the last task performed/requested
+ */
+ public String getLastInteraction() {
+ return getString(LAST_INTERACTION);
+ }
+
+ /**
+ * @return the last communication timestamp
+ */
+ public Timestamp getLastInteractionDate() {
+ return new Timestamp(backingData.getLong(LAST_INTERACTION_DATE));
+ }
+
+ /**
+ * Set the last interaction name
+ *
+ * @param lastInteractionName
+ */
+ public void setLastInteraction(String lastInteractionName) {
+ this.backingData.put(LAST_INTERACTION, lastInteractionName);
+ }
+
+ /**
+ * Set the last interaction date
+ *
+ * @param timestamp
+ */
+ public void setLastInteractionDate(Timestamp timestamp) {
+ this.backingData.put(LAST_INTERACTION_DATE, timestamp.getTime());
+ }
+
+ /**
+ * Get a the session id and version in a single string
+ *
+ * @param the session id and version
+ */
+ public String getSessionIdAndVersion() {
+ return String.format("%s - %s", getSessionId(), getVersion());
+ }
+
+ /**
+ * Create new instance from XML input
+ *
+ * @param OseeSession the new instance
+ * @throws OseeWrappedException
+ */
+ public static OseeSession fromXml(InputStream inputStream) throws OseeWrappedException {
+ OseeSession session = new OseeSession();
+ session.loadfromXml(inputStream);
+ return session;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSessionGrant.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSessionGrant.java
new file mode 100644
index 00000000000..21374fb5d9b
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSessionGrant.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.framework.core.data;
+
+import java.io.InputStream;
+import java.util.Properties;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeSessionGrant extends BaseExchangeData {
+
+ private static final long serialVersionUID = -7236201704435470272L;
+ private static final String SESSION_ID = "sessionId";
+ private static final String SQL_PROPERTIES = "slqProperty";
+
+ private static final String DB_DRIVER = "dbDriver";
+ private static final String DB_CONNECTION_URL = "dbUrl";
+ private static final String DB_CONNECT_PROPERTIES = "dbConnectionProperties";
+ private static final String DB_LOGIN_NAME = "dbLogin";
+ private static final String DB_DATABASE_NAME = "dbDatabaseName";
+ private static final String DB_IS_PRODUCTION = "dbIsProduction";
+ private static final String DB_ID = "dbId";
+
+ private static final String OSEE_USER_IS_CREATION_REQUIRED = "oseeUserNeedsCreation";
+ private static final String OSEE_USER_EMAIL = "oseeUserEmail";
+ private static final String OSEE_USER_NAME = "oseeUserName";
+ private static final String OSEE_USER_ID = "oseeUserId";
+ private static final String OSEE_IS_USER_ACTIVE = "isOseeUserActive";
+ private static final String OSEE_APPLICATION_SERVER_DATA_PATH = "oseeApplicationServerDataPath";
+
+ private IDatabaseInfo grantedDatabaseInfo;
+ private IOseeUser grantedOseeUserInfo;
+
+ protected OseeSessionGrant() {
+ super();
+ this.grantedDatabaseInfo = new GrantedDatabaseInfo();
+ this.grantedOseeUserInfo = new GrantedOseeUserInfo();
+ }
+
+ public OseeSessionGrant(String sessionId) {
+ super();
+ this.backingData.put(SESSION_ID, sessionId);
+ }
+
+ public String getSessionId() {
+ return getString(SESSION_ID);
+ }
+
+ public IDatabaseInfo getDatabaseInfo() {
+ return grantedDatabaseInfo;
+ }
+
+ public void setDatabaseInfo(IDatabaseInfo dbInfo) {
+ this.backingData.put(DB_DRIVER, dbInfo.getDriver());
+ this.backingData.put(DB_CONNECTION_URL, dbInfo.getConnectionUrl());
+ this.backingData.put(DB_LOGIN_NAME, dbInfo.getDatabaseLoginName());
+ this.backingData.put(DB_DATABASE_NAME, dbInfo.getDatabaseName());
+ this.backingData.put(DB_IS_PRODUCTION, dbInfo.isProduction());
+ this.backingData.put(DB_ID, dbInfo.getId());
+ putProperties(DB_CONNECT_PROPERTIES, dbInfo.getConnectionProperties());
+ }
+
+ public void setSqlProperties(Properties sqlProperties) {
+ putProperties(SQL_PROPERTIES, sqlProperties);
+ }
+
+ public Properties getSqlProperties() {
+ return getPropertyString(SQL_PROPERTIES);
+ }
+
+ public void setOseeUserInfo(IOseeUser userInfo) {
+ this.backingData.put(OSEE_USER_EMAIL, userInfo.getEmail());
+ this.backingData.put(OSEE_USER_NAME, userInfo.getName());
+ this.backingData.put(OSEE_USER_ID, userInfo.getUserID());
+ this.backingData.put(OSEE_IS_USER_ACTIVE, userInfo.isActive());
+ }
+
+ public boolean isCreationRequired() {
+ return backingData.getBoolean(OSEE_USER_IS_CREATION_REQUIRED);
+ }
+
+ public void setCreationRequired(boolean value) {
+ this.backingData.put(OSEE_USER_IS_CREATION_REQUIRED, value);
+ }
+
+ public void setDataStorePath(String oseeApplicationServerData) {
+ this.backingData.put(OSEE_APPLICATION_SERVER_DATA_PATH, oseeApplicationServerData);
+ }
+
+ public String getDataStorePath() {
+ return getString(OSEE_APPLICATION_SERVER_DATA_PATH);
+ }
+
+ public IOseeUser getOseeUserInfo() {
+ return grantedOseeUserInfo;
+ }
+
+ public static OseeSessionGrant fromXml(InputStream inputStream) throws OseeWrappedException {
+ OseeSessionGrant session = new OseeSessionGrant();
+ session.loadfromXml(inputStream);
+ return session;
+ }
+
+ private final class GrantedOseeUserInfo implements IOseeUser {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#getEmail()
+ */
+ @Override
+ public String getEmail() {
+ return getString(OSEE_USER_EMAIL);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#getName()
+ */
+ @Override
+ public String getName() {
+ return getString(OSEE_USER_NAME);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#getUserID()
+ */
+ @Override
+ public String getUserID() {
+ return getString(OSEE_USER_ID);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#isActive()
+ */
+ @Override
+ public boolean isActive() {
+ return backingData.getBoolean(OSEE_IS_USER_ACTIVE);
+ }
+ }
+
+ private final class GrantedDatabaseInfo implements IDatabaseInfo {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getConnectionProperties()
+ */
+ @Override
+ public Properties getConnectionProperties() {
+ return getPropertyString(DB_CONNECT_PROPERTIES);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getConnectionUrl()
+ */
+ @Override
+ public String getConnectionUrl() {
+ return getString(DB_CONNECTION_URL);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDatabaseLoginName()
+ */
+ @Override
+ public String getDatabaseLoginName() {
+ return getString(DB_LOGIN_NAME);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDatabaseName()
+ */
+ @Override
+ public String getDatabaseName() {
+ return getString(DB_DATABASE_NAME);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDriver()
+ */
+ @Override
+ public String getDriver() {
+ return getString(DB_DRIVER);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getId()
+ */
+ @Override
+ public String getId() {
+ return getString(DB_ID);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#isProduction()
+ */
+ @Override
+ public boolean isProduction() {
+ return Boolean.valueOf(getString(DB_IS_PRODUCTION));
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSql.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSql.java
new file mode 100644
index 00000000000..9fd3c4410a2
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeSql.java
@@ -0,0 +1,332 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.data;
+
+import java.util.Properties;
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeSql {
+
+ public static final String QUERY_BUILDER_HINT = "QUERY_BUILDER_HINT";
+
+ private static final String HINTS__ORDERED__FIRST_ROWS = " /*+ ordered FIRST_ROWS */";
+ private static final String HINTS__ORDERED__INDEX__ARTIFACT_CONFLICT =
+ " /*+ ordered index(atr1) index(atr2) index(txs2) */";
+ private static final String HINTS__ORDERED__INDEX__ATTRIBUTE_CONFLICT =
+ " /*+ ordered index(atr1) index(atr2) index(txs2) */";
+
+ private static Boolean areHintsAllowed = null;
+
+ private OseeSql() {
+ }
+
+ public static Properties getSqlProperties() throws OseeDataStoreException {
+ Properties sqlProperties = new Properties();
+
+ sqlProperties.put(OseeSql.QUERY_BUILDER_HINT, HINTS__ORDERED__FIRST_ROWS);
+
+ Load.addSql(sqlProperties);
+ Changes.addSql(sqlProperties);
+ Conflicts.addSql(sqlProperties);
+ Merge.addSql(sqlProperties);
+ Transaction.addSql(sqlProperties);
+ return sqlProperties;
+ }
+
+ public static boolean isHintsAllowed() throws OseeDataStoreException {
+ if (areHintsAllowed == null) {
+ areHintsAllowed = SupportedDatabase.areHintsSupported();
+ }
+ return areHintsAllowed;
+ }
+
+ private static String getFormattedSql(String sql, String sqlHints) throws OseeDataStoreException {
+ return String.format(sql, isHintsAllowed() ? sqlHints : "");
+ }
+
+ public static final class Changes {
+
+ public static final String SELECT_BRANCH_ATTRIBUTE_WAS_CHANGE = "BRANCH_ATTRIBUTE_WAS_CHANGE";
+ public static final String SELECT_TRANSACTION_ATTRIBUTE_WAS_CHANGE = "TRANSACTION_ATTRIBUTE_WAS_CHANGE";
+ public static final String SELECT_BRANCH_ATTRIBUTE_IS_CHANGES = "BRANCH_ATTRIBUTE_IS_CHANGES";
+ public static final String SELECT_TRANSACTION_ATTRIBUTE_CHANGES = "TRANSACTION_ATTRIBUTE_CHANGES";
+ public static final String SELECT_BRANCH_REL_CHANGES = "BRANCH_REL_CHANGES";
+ public static final String SELECT_TRANSACTION_REL_CHANGES = "TRANSACTION_REL_CHANGES";
+ public static final String SELECT_BRANCH_ARTIFACT_CHANGES = "BRANCH_ARTIFACT_CHANGES";
+ public static final String SELECT_TRANSACTION_ARTIFACT_CHANGES = "TRANSACTION_ARTIFACT_CHANGES";
+ public static final String SELECT_MODIFYING_TRANSACTION = "SELECT_MODIFYING_TRANSACTION";
+ public static final String SELECT_MODIFYING_BRANCHES = "SELECT_MODIFYING_BRANCHES";
+
+ private Changes() {
+ }
+
+ private static final String BRANCH_ATTRIBUTE_WAS_CHANGE =
+ "SELECT%s attxs1.attr_id, attxs1.value as was_value, txs1.mod_type FROM osee_join_artifact ja1, osee_attribute attxs1, osee_txs txs1, osee_tx_details txd1 WHERE txd1.branch_id = ? AND txd1.transaction_id = txs1.transaction_id AND txd1.tx_type = 1 AND attxs1.gamma_id = txs1.gamma_id AND attxs1.art_id = ja1.art_id AND txd1.branch_id = ja1.branch_id AND ja1.query_id = ?";
+
+ private static final String TRANSACTION_ATTRIBUTE_WAS_CHANGE =
+ "SELECT%s att1.attr_id, att1.value as was_value, txs1.mod_type FROM osee_join_artifact al1, osee_attribute att1, osee_txs txs1, osee_tx_details txd1 WHERE al1.art_id = att1.art_id AND att1.gamma_id = txs1.gamma_id AND txs1.transaction_id < ? AND al1.query_id = ? AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id order by txd1.branch_id, att1.art_id, att1.attr_id, txd1.transaction_id desc";
+
+ private static final String BRANCH_ATTRIBUTE_IS_CHANGES =
+ "SELECT%s artxs1.art_type_id, attr1.art_id, attr1.attr_id, attr1.gamma_id, attr1.attr_type_id, attr1.value as is_value, txs1.mod_type FROM osee_tx_details txd1, osee_txs txs1, osee_attribute attr1, osee_artifact artxs1 WHERE txd1.branch_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.tx_current in (" + TxChange.DELETED.getValue() + ", " + TxChange.CURRENT.getValue() + ", " + TxChange.ARTIFACT_DELETED.getValue() + ") AND txd1.tx_type = 0 AND artxs1.art_id = attr1.art_id AND attr1.gamma_id = txs1.gamma_id";
+
+ private static final String TRANSACTION_ATTRIBUTE_CHANGES =
+ "SELECT%s artxs1.art_type_id, attr1.art_id, attr1.attr_id, attr1.gamma_id, attr1.attr_type_id, attr1.value as is_value, txs1.mod_type FROM osee_tx_details txd2, osee_txs txs1, osee_attribute attr1, osee_artifact artxs1 WHERE txd2.transaction_id = ? AND txd2.transaction_id = txs1.transaction_id AND txd2.tx_type = 0 AND artxs1.art_id = attr1.art_id AND attr1.gamma_id = txs1.gamma_id";
+
+ private static final String BRANCH_REL_CHANGES =
+ "SELECT%s txs1.mod_type, rel1.gamma_id, rel1.b_art_id, rel1.a_art_id, rel1.a_order, rel1.b_order, rel1.rationale, rel1.rel_link_id, rel1.rel_link_type_id, art.art_type_id from osee_tx_details txd1, osee_txs txs1, osee_relation_link rel1, osee_artifact art where txs1.tx_current in (" + TxChange.DELETED.getValue() + ", " + TxChange.CURRENT.getValue() + ", " + TxChange.ARTIFACT_DELETED.getValue() + ") AND txd1.tx_type = 0 AND txd1.branch_id = ? AND txs1.transaction_id = txd1.transaction_id AND txs1.gamma_id = rel1.gamma_id AND rel1.a_art_id = art.art_id";
+
+ private static final String TRANSACTION_REL_CHANGES =
+ "SELECT%s txs1.mod_type, rel1.gamma_id, rel1.b_art_id, rel1.a_art_id, rel1.a_order, rel1.b_order, rel1.rationale, rel1.rel_link_id, rel1.rel_link_type_id, art.art_type_id from osee_tx_details txd1, osee_txs txs1, osee_relation_link rel1, osee_artifact art where txd1.tx_type = 0 AND txd1.transaction_id = ? AND txs1.transaction_id = txd1.transaction_id AND txs1.gamma_id = rel1.gamma_id AND rel1.a_art_id = art.art_id";
+
+ private static final String BRANCH_ARTIFACT_CHANGES =
+ "select%s art1.art_id, art1.art_type_id, atv1.gamma_id, txs1.mod_type FROM osee_tx_details txd1, osee_txs txs1, osee_artifact_version atv1, osee_artifact art1 WHERE txd1.branch_id = ? AND txd1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = atv1.gamma_id AND txs1.mod_type in (" + ModificationType.DELETED.getValue() + ", " + ModificationType.NEW.getValue() + ", " + ModificationType.INTRODUCED.getValue() + ") AND atv1.art_id = art1.art_id";
+
+ private static final String TRANSACTION_ARTIFACT_CHANGES =
+ "select%s art1.art_id, art1.art_type_id, atv1.gamma_id, txs1.mod_type FROM osee_tx_details txd1, osee_txs txs1, osee_artifact_version atv1, osee_artifact art1 WHERE txd1.transaction_id = ? AND txd1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = atv1.gamma_id AND txs1.mod_type in (" + ModificationType.DELETED.getValue() + ", " + ModificationType.NEW.getValue() + ", " + ModificationType.INTRODUCED.getValue() + ") AND atv1.art_id = art1.art_id";
+
+ private static final String MODIFYING_TRANSACTION =
+ "SELECT arj.art_id, arj.branch_id, txd.transaction_id from osee_join_artifact arj, osee_artifact_version arv, osee_txs txs, osee_tx_details txd where arj.query_id = ? AND arj.art_id = arv.art_id AND arv.gamma_id = txs.gamma_id AND txs.transaction_id = txd.transaction_id AND txd.branch_id = arj.branch_id AND txd.transaction_id <= arj.transaction_id AND txd.tx_type = " + TransactionDetailsType.NonBaselined.getId();
+
+ private static final String MODIFYING_BRANCHES =
+ "SELECT count(txd.transaction_id) as tx_count, arj.branch_id, arj.art_id FROM osee_join_artifact arj, osee_artifact_version arv, osee_txs txs, osee_tx_details txd where arj.query_id = ? AND arj.art_id = arv.art_id AND arv.gamma_id = txs.gamma_id AND txs.transaction_id = txd.transaction_id AND txd.branch_id = arj.branch_id and tx_type = 0 group by arj.art_id, arj.branch_id";
+
+ private static void addSql(Properties sqlProperties) throws OseeDataStoreException {
+ sqlProperties.put(SELECT_BRANCH_ATTRIBUTE_WAS_CHANGE, getFormattedSql(BRANCH_ATTRIBUTE_WAS_CHANGE,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_TRANSACTION_ATTRIBUTE_WAS_CHANGE, getFormattedSql(TRANSACTION_ATTRIBUTE_WAS_CHANGE,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_BRANCH_ATTRIBUTE_IS_CHANGES, getFormattedSql(BRANCH_ATTRIBUTE_IS_CHANGES,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_TRANSACTION_ATTRIBUTE_CHANGES, getFormattedSql(TRANSACTION_ATTRIBUTE_CHANGES,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_BRANCH_REL_CHANGES, getFormattedSql(BRANCH_REL_CHANGES, HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_TRANSACTION_REL_CHANGES, getFormattedSql(TRANSACTION_REL_CHANGES,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_BRANCH_ARTIFACT_CHANGES, getFormattedSql(BRANCH_ARTIFACT_CHANGES,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_TRANSACTION_ARTIFACT_CHANGES, getFormattedSql(TRANSACTION_ARTIFACT_CHANGES,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_MODIFYING_TRANSACTION, getFormattedSql(MODIFYING_TRANSACTION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_MODIFYING_BRANCHES, getFormattedSql(MODIFYING_BRANCHES, HINTS__ORDERED__FIRST_ROWS));
+ }
+ }
+
+ public static final class Load {
+
+ private Load() {
+ }
+
+ public static final String SELECT_HISTORICAL_ARTIFACTS = "SELECT_HISTORICAL_ARTIFACTS";
+ public static final String SELECT_HISTORICAL_ATTRIBUTES = "SELECT_HISTORICAL_ATTRIBUTES";
+ public static final String SELECT_CURRENT_ATTRIBUTES = "SELECT_CURRENT_ATTRIBUTES";
+ public static final String SELECT_CURRENT_ATTRIBUTES_WITH_DELETED = "SELECT_CURRENT_ATTRIBUTES_WITH_DELETED";
+ public static final String SELECT_ALL_CURRENT_ATTRIBUTES = "SELECT_ALL_CURRENT_ATTRIBUTES";
+ public static final String SELECT_RELATIONS = "SELECT_RELATIONS";
+ public static final String SELECT_CURRENT_ARTIFACTS = "SELECT_CURRENT_ARTIFACTS";
+ public static final String SELECT_CURRENT_ARTIFACTS_WITH_DELETED = "SELECT_CURRENT_ARTIFACTS_WITH_DELETED";
+
+ private static final String SELECT_HISTORICAL_ARTIFACTS_DEFINITION =
+ "SELECT%s al1.art_id, txs1.gamma_id, mod_type, txd1.*, art_type_id, guid, human_readable_id, al1.transaction_id as stripe_transaction_id FROM osee_join_artifact al1, osee_artifact art1, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = art1.art_id AND art1.art_id = arv1.art_id AND arv1.gamma_id = txs1.gamma_id AND txs1.transaction_id <= al1.transaction_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id order by al1.branch_id, art1.art_id, txs1.transaction_id desc";
+
+ private static final String SELECT_HISTORICAL_ATTRIBUTES_DEFINITION =
+ "SELECT%s att1.art_id, att1.attr_id, att1.value, att1.gamma_id, att1.attr_type_id, att1.uri, al1.branch_id, txs1.mod_type, txd1.transaction_id, al1.transaction_id as stripe_transaction_id FROM osee_join_artifact al1, osee_attribute att1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = att1.art_id AND att1.gamma_id = txs1.gamma_id AND txs1.transaction_id <= al1.transaction_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id order by txd1.branch_id, att1.art_id, att1.attr_id, txd1.transaction_id desc";
+
+ private static final String SELECT_CURRENT_ATTRIBUTES_PREFIX =
+ "SELECT%s att1.art_id, att1.attr_id, att1.value, att1.gamma_id, att1.attr_type_id, att1.uri, al1.branch_id, txs1.mod_type FROM osee_join_artifact al1, osee_attribute att1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = att1.art_id AND att1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id AND txs1.tx_current ";
+
+ private static final String SELECT_CURRENT_ATTRIBUTES_DEFINITION =
+ SELECT_CURRENT_ATTRIBUTES_PREFIX + "= 1 order by al1.branch_id, al1.art_id, txd1.transaction_id desc";
+
+ private static final String SELECT_CURRENT_ATTRIBUTES_WITH_DELETED_DEFINITION =
+ SELECT_CURRENT_ATTRIBUTES_PREFIX + "IN (1, 3) order by al1.branch_id, al1.art_id";
+
+ private static final String SELECT_ALL_CURRENT_ATTRIBUTES_DEFINITION =
+ SELECT_CURRENT_ATTRIBUTES_PREFIX + "IN (1, 2, 3) order by al1.branch_id, al1.art_id";
+
+ private static final String SELECT_RELATIONS_DEFINITION =
+ "SELECT%s rel_link_id, a_art_id, b_art_id, rel_link_type_id, a_order, b_order, rel1.gamma_id, rationale, al1.branch_id FROM osee_join_artifact al1, osee_relation_link rel1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND (al1.art_id = rel1.a_art_id OR al1.art_id = rel1.b_art_id) AND rel1.gamma_id = txs1.gamma_id AND txs1.tx_current=1 AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id";
+
+ private static final String SELECT_CURRENT_ARTIFACTS_PREFIX =
+ "SELECT%s al1.art_id, txs1.gamma_id, mod_type, txd1.*, art_type_id, guid, human_readable_id FROM osee_join_artifact al1, osee_artifact art1, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = art1.art_id AND art1.art_id = arv1.art_id AND arv1.gamma_id = txs1.gamma_id AND txd1.branch_id = al1.branch_id AND txd1.transaction_id = txs1.transaction_id AND txs1.tx_current ";
+
+ private static final String SELECT_CURRENT_ARTIFACTS_DEFINITION = SELECT_CURRENT_ARTIFACTS_PREFIX + "= 1";
+
+ private static final String SELECT_CURRENT_ARTIFACTS_WITH_DELETED_DEFINITION =
+ SELECT_CURRENT_ARTIFACTS_PREFIX + "in (1, 2)";
+
+ private static void addSql(Properties sqlProperties) throws OseeDataStoreException {
+ sqlProperties.put(SELECT_HISTORICAL_ARTIFACTS, getFormattedSql(SELECT_HISTORICAL_ARTIFACTS_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_HISTORICAL_ATTRIBUTES, getFormattedSql(SELECT_HISTORICAL_ATTRIBUTES_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_CURRENT_ATTRIBUTES, getFormattedSql(SELECT_CURRENT_ATTRIBUTES_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_ALL_CURRENT_ATTRIBUTES, getFormattedSql(SELECT_ALL_CURRENT_ATTRIBUTES_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_CURRENT_ATTRIBUTES_WITH_DELETED, getFormattedSql(
+ SELECT_CURRENT_ATTRIBUTES_WITH_DELETED_DEFINITION, HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_RELATIONS, getFormattedSql(SELECT_RELATIONS_DEFINITION, HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_CURRENT_ARTIFACTS, getFormattedSql(SELECT_CURRENT_ARTIFACTS_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_CURRENT_ARTIFACTS_WITH_DELETED, getFormattedSql(
+ SELECT_CURRENT_ARTIFACTS_WITH_DELETED_DEFINITION, HINTS__ORDERED__FIRST_ROWS));
+ }
+ }
+
+ public static final class Conflicts {
+
+ public static final String SELECT_ARTIFACT_CONFLICTS = "SELECT_ARTIFACT_CONFLICTS";
+ public static final String SELECT_ATTRIBUTE_CONFLICTS = "SELECT_ATTRIBUTE_CONFLICTS";
+ public static final String SELECT_HISTORIC_ATTRIBUTE_CONFLICTS = "SELECT_HISTORIC_ATTRIBUTE_CONFLICTS";
+
+ private Conflicts() {
+ }
+
+ private static final String ARTIFACT_CONFLICT_DEFINITION =
+ "SELECT%s art1.art_type_id, arv1.art_id, txs1.mod_type AS source_mod_type, txs1.gamma_id AS source_gamma, txs2.mod_type AS dest_mod_type, txs2.gamma_id AS dest_gamma FROM osee_tx_details txd1, osee_txs txs1, osee_artifact_version arv1, osee_artifact_version arv2, osee_txs txs2, osee_tx_details txd2, osee_artifact art1 WHERE txd1.tx_type = 0 AND txd1.branch_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.tx_current in (1,2) AND txs1.gamma_id = arv1.gamma_id and arv1.art_id = art1.art_id AND arv1.art_id = arv2.art_id AND arv2.gamma_id = txs2.gamma_id AND txs2.transaction_id = txd2.transaction_id AND txd2.branch_id = ? AND ((txs2.tx_current = 1 AND txs2.gamma_id not in (SELECT txs.gamma_id FROM osee_txs txs WHERE txs.transaction_id = ?)) OR txs2.tx_current = 2)";
+
+ private static final String ATTRIBUTE_CONFLICT_DEFINITION =
+ "SELECT%s atr1.art_id, txs1.mod_type, atr1.attr_type_id, atr1.attr_id, atr1.gamma_id AS source_gamma, atr1.value AS source_value, atr2.gamma_id AS dest_gamma, atr2.value as dest_value, txs2.mod_type AS dest_mod_type FROM osee_tx_details txd1, osee_txs txs1, osee_attribute atr1, osee_attribute atr2, osee_txs txs2, osee_tx_details txd2 WHERE txd1.tx_type = 0 AND txd1.branch_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.tx_current in (1,2) AND txs1.gamma_id = atr1.gamma_id AND atr1.attr_id = atr2.attr_id AND atr2.gamma_id = txs2.gamma_id AND txs2.transaction_id = txd2.transaction_id AND txd2.branch_id = ? AND ((txs2.tx_current = 1 AND txs2.gamma_id not in (SELECT txs.gamma_id FROM osee_txs txs WHERE txs.transaction_id = ? )) OR txs2.tx_current = 2) ORDER BY attr_id";
+
+ private static final String HISTORICAL_ATTRIBUTE_CONFLICTS_DEFINITION =
+ "SELECT%s atr.attr_id, atr.art_id, source_gamma_id, dest_gamma_id, attr_type_id, mer.merge_branch_id, mer.dest_branch_id, value as source_value, status FROM osee_merge mer, osee_conflict con, osee_attribute atr Where mer.commit_transaction_id = ? AND mer.merge_branch_id = con.merge_branch_id And con.source_gamma_id = atr.gamma_id AND con.status in (" + ConflictStatus.COMMITTED.getValue() + ", " + ConflictStatus.INFORMATIONAL.getValue() + " ) order by attr_id";
+
+ private static void addSql(Properties sqlProperties) throws OseeDataStoreException {
+ sqlProperties.put(SELECT_ARTIFACT_CONFLICTS, getFormattedSql(ARTIFACT_CONFLICT_DEFINITION,
+ HINTS__ORDERED__INDEX__ARTIFACT_CONFLICT));
+
+ sqlProperties.put(SELECT_ATTRIBUTE_CONFLICTS, getFormattedSql(ATTRIBUTE_CONFLICT_DEFINITION,
+ HINTS__ORDERED__INDEX__ATTRIBUTE_CONFLICT));
+
+ sqlProperties.put(SELECT_HISTORIC_ATTRIBUTE_CONFLICTS, getFormattedSql(
+ HISTORICAL_ATTRIBUTE_CONFLICTS_DEFINITION, HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_ARTIFACT_CONFLICTS, getFormattedSql(ARTIFACT_CONFLICT_DEFINITION,
+ HINTS__ORDERED__INDEX__ARTIFACT_CONFLICT));
+ }
+ }
+
+ public static final class Merge {
+
+ public static final String SELECT_ARTIFACTS_ON_A_BRANCH = "SELECT_ARTIFACT_BRANCH";
+ public static final String SELECT_ATTRIBUTES_ON_A_BRANCH = "SELECT_ATTRIBUTE_BRANCH";
+ public static final String SELECT_REL_LINKS_ON_A_BRANCH = "SELECT_RELATIONS_BRANCH";
+ public static final String UPDATE_ARTIFACT_MERGE_BRANCH = "UPDATE_MERGE_BRANCH_ARTIFACT";
+
+ private Merge() {
+ }
+ public static final String UPDATE_MERGE_BRANCH_ARTIFACT_DEFINITION =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT %s ?, txs.gamma_id, txs.mod_type, CASE WHEN txs.mod_type = 3 THEN " + TxChange.DELETED.getValue() + " WHEN txs.mod_type = 5 THEN " + TxChange.ARTIFACT_DELETED.getValue() + " ELSE " + TxChange.CURRENT.getValue() + " END FROM osee_attribute attr, osee_txs txs, osee_tx_details det WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.tx_current != 0 AND txs.gamma_id = attr.gamma_id AND attr.art_id = ? AND not exists (SELECT 'x' FROM osee_txs txs1, osee_attribute attr1 WHERE txs1.transaction_id = ? AND txs1.gamma_id = attr1.gamma_id AND attr1.attr_id = attr.attr_id)";
+
+ private static final String GET_ART_IDS_FOR_BRANCH_DEFINITION =
+ "SELECT%s arv.art_id FROM osee_tx_details det, osee_txs txs, osee_artifact_version arv WHERE det.transaction_id = txs.transaction_id and txs.gamma_id = arv.gamma_id and det.branch_id = ?";
+
+ private static final String GET_ATTRIBUTES_FOR_BRANCH_DEFINITION =
+ "SELECT%s atr.art_id, atr.attr_id FROM osee_tx_details det, osee_txs txs, osee_attribute atr WHERE det.transaction_id = txs.transaction_id and txs.gamma_id = atr.gamma_id and det.branch_id = ?";
+
+ private static final String GET_RELATIONS_FOR_BRANCH_DEFINITION =
+ "SELECT%s rel.a_art_id, rel.b_art_id FROM osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE det.transaction_id = txs.transaction_id and txs.gamma_id = rel.gamma_id and det.branch_id = ?";
+
+ private static void addSql(Properties sqlProperties) throws OseeDataStoreException {
+ sqlProperties.put(SELECT_ARTIFACTS_ON_A_BRANCH, getFormattedSql(GET_ART_IDS_FOR_BRANCH_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_ATTRIBUTES_ON_A_BRANCH, getFormattedSql(GET_ATTRIBUTES_FOR_BRANCH_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(SELECT_REL_LINKS_ON_A_BRANCH, getFormattedSql(GET_RELATIONS_FOR_BRANCH_DEFINITION,
+ HINTS__ORDERED__FIRST_ROWS));
+
+ sqlProperties.put(UPDATE_MERGE_BRANCH_ARTIFACT_DEFINITION, getFormattedSql(UPDATE_ARTIFACT_MERGE_BRANCH,
+ HINTS__ORDERED__FIRST_ROWS));
+ }
+ }
+
+ public static class Transaction {
+
+ public static final String SELECT_ALL_TRANSACTIONS = "SELECT_ALL_TRANSACTIONS";
+ public static final String SELECT_MAX_AS_LARGEST_TX = "SELECT_MAX_AS_LARGEST_TX";
+ public static final String SELECT_MAX_AND_MIN_TX = "SELECT_MAX_AND_MIN_TX";
+ public static final String SELECT_TX_GAMMAS = "SELECT_TX_GAMMAS";
+ public static final String SELECT_TX_GAMMAS_RANGE = "SELECT_TX_GAMMAS_RANGE";
+
+ public static final String SELECT_PREVIOUS_TX_NOT_CURRENT_ARTIFACTS = "SELECT_PREVIOUS_TX_NOT_CURRENT_ARTIFACTS";
+ public static final String SELECT_PREVIOUS_TX_NOT_CURRENT_ATTRIBUTES =
+ "SELECT_PREVIOUS_TX_NOT_CURRENT_ATTRIBUTES";
+ public static final String SELECT_PREVIOUS_TX_NOT_CURRENT_RELATIONS = "SELECT_PREVIOUS_TX_NOT_CURRENT_RELATIONS";
+
+ private Transaction() {
+ }
+
+ private static final String GET_ALL_TRANSACTIONS = "SELECT * FROM osee_tx_details WHERE transaction_id = ?";
+
+ private static final String GET_MAX_AS_LARGEST_TX =
+ "SELECT max(transaction_id) as largest_transaction_id FROM osee_tx_details WHERE branch_id = ?";
+
+ private static final String GET_MAX_AND_MIN_TX =
+ "SELECT max(transaction_id) AS max_id, min(transaction_id) AS min_id FROM osee_tx_details WHERE branch_id = ?";
+
+ private static final String GET_TX_GAMMAS =
+ "SELECT txs.transaction_id, txs.gamma_id FROM osee_tx_details txd, osee_txs txs WHERE txd.transaction_id = txs.transaction_id AND txd.branch_id = ? AND txd.transaction_id = ? ORDER BY txs.transaction_id, txs.gamma_id";
+
+ private static final String GET_TX_GAMMAS_RANGE =
+ "SELECT txs.transaction_id, txs.gamma_id FROM osee_tx_details txd, osee_txs txs WHERE txd.transaction_id = txs.transaction_id AND txd.branch_id = ? AND txd.transaction_id > ? AND txd.transaction_id <= ? ORDER BY txs.transaction_id, txs.gamma_id";
+
+ private static final String GET_PREVIOUS_TX_NOT_CURRENT_ARTIFACTS =
+ "SELECT txs1.transaction_id, txs1.gamma_id FROM osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE arv1.art_id = ? AND arv1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = ? AND txs1.tx_current = " + TxChange.CURRENT.getValue();
+
+ private static final String GET_PREVIOUS_TX_NOT_CURRENT_ATTRIBUTES =
+ "SELECT txs1.transaction_id, txs1.gamma_id FROM osee_attribute atr1, osee_txs txs1, osee_tx_details txd1 WHERE atr1.attr_id = ? AND atr1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = ? AND txs1.tx_current = " + TxChange.CURRENT.getValue();
+
+ private static final String GET_PREVIOUS_TX_NOT_CURRENT_RELATIONS =
+ "SELECT txs1.transaction_id, txs1.gamma_id FROM osee_relation_link rel1, osee_txs txs1, osee_tx_details txd1 WHERE rel1.rel_link_id = ? AND rel1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = ? AND txs1.tx_current = " + TxChange.CURRENT.getValue();
+
+ private static void addSql(Properties sqlProperties) throws OseeDataStoreException {
+ sqlProperties.put(SELECT_ALL_TRANSACTIONS, GET_ALL_TRANSACTIONS);
+
+ sqlProperties.put(SELECT_PREVIOUS_TX_NOT_CURRENT_ARTIFACTS, GET_PREVIOUS_TX_NOT_CURRENT_ARTIFACTS);
+
+ sqlProperties.put(SELECT_PREVIOUS_TX_NOT_CURRENT_ATTRIBUTES, GET_PREVIOUS_TX_NOT_CURRENT_ATTRIBUTES);
+
+ sqlProperties.put(SELECT_PREVIOUS_TX_NOT_CURRENT_RELATIONS, GET_PREVIOUS_TX_NOT_CURRENT_RELATIONS);
+
+ sqlProperties.put(SELECT_MAX_AS_LARGEST_TX, GET_MAX_AS_LARGEST_TX);
+ sqlProperties.put(SELECT_MAX_AND_MIN_TX, GET_MAX_AND_MIN_TX);
+ sqlProperties.put(SELECT_TX_GAMMAS, GET_TX_GAMMAS);
+ sqlProperties.put(SELECT_TX_GAMMAS_RANGE, GET_TX_GAMMAS_RANGE);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeUser.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeUser.java
new file mode 100644
index 00000000000..5453e942e60
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/OseeUser.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.framework.core.data;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OseeUser implements IOseeUser {
+ private final String userName;
+ private final String userId;
+ private final String userEmail;
+ private final boolean isActive;
+
+ public OseeUser(String userName, String userId, String userEmail, boolean isActive) {
+ this.userName = userName;
+ this.userId = userId;
+ this.userEmail = userEmail;
+ this.isActive = isActive;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#getEmail()
+ */
+ @Override
+ public String getEmail() {
+ return userEmail;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#getName()
+ */
+ @Override
+ public String getName() {
+ return userName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#getUserID()
+ */
+ @Override
+ public String getUserID() {
+ return userId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUser#isActive()
+ */
+ @Override
+ public boolean isActive() {
+ return isActive;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/SystemUser.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/SystemUser.java
new file mode 100644
index 00000000000..32f76499985
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/SystemUser.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.framework.core.data;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum SystemUser implements IOseeUserInfo {
+ OseeSystem("OSEE System", "", "99999999", false),
+ Guest("Guest", "", "99999998", false),
+ BootStrap("Boot Strap", "bootstrap@osee.org", "bootstrap", true),
+ UnAssigned("UnAssigned", "", "99999997", true);
+ private final String name;
+ private final String email;
+ private final String userID;
+ private final boolean active;
+
+ SystemUser(String name, String email, String userId, boolean active) {
+ this.name = name;
+ this.email = email;
+ this.userID = userId;
+ this.active = active;
+ }
+
+ /**
+ * @return Returns the email.
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the userID.
+ */
+ public String getUserID() {
+ return userID;
+ }
+
+ /**
+ * @return Returns the active.
+ */
+ public boolean isActive() {
+ return active;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUserInfo#isCreationRequired()
+ */
+ @Override
+ public boolean isCreationRequired() {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchState.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchState.java
new file mode 100644
index 00000000000..531b55af45f
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchState.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.core.enums;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum BranchState {
+ UNKNOWN(-1),
+ CREATED(0),
+ MODIFIED(1),
+ COMMITTED(2),
+ REBASELINED(3),
+ DELETED(4),
+ REBASELINE_IN_PROGRESS(5),
+ COMMIT_IN_PROGRESS(6);
+
+ private final int value;
+
+ BranchState(int value) {
+ this.value = value;
+ }
+
+ public final int getValue() {
+ return value;
+ }
+
+ public static BranchState getBranchState(int value) {
+ for (BranchState type : values()) {
+ if (type.getValue() == value) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchStorageState.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchStorageState.java
new file mode 100644
index 00000000000..04883ec99ad
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchStorageState.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.framework.core.enums;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public enum BranchStorageState {
+
+ UN_ARCHIVED(0), ARCHIVED(1);
+ private final int value;
+
+ BranchStorageState(int value) {
+ this.value = value;
+ }
+
+ public final int getValue() {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchType.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchType.java
new file mode 100644
index 00000000000..da5ef0c1e01
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/BranchType.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.framework.core.enums;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum BranchType {
+ WORKING(0), TOP_LEVEL(1), BASELINE(2), MERGE(3), SYSTEM_ROOT(4);
+ private final int value;
+
+ BranchType(int value) {
+ this.value = value;
+ }
+
+ public final int getValue() {
+ return value;
+ }
+
+ public static BranchType getBranchType(int value) {
+ for (BranchType type : values())
+ if (type.getValue() == value) return type;
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictStatus.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictStatus.java
new file mode 100644
index 00000000000..f744650ed20
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictStatus.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.core.enums;
+
+/**
+ * @author Theron Virgin
+ */
+public enum ConflictStatus {
+
+ UNTOUCHED(1),
+ EDITED(2),
+ RESOLVED(3),
+ OUT_OF_DATE_RESOLVED(4),
+ NOT_RESOLVABLE(5),
+ COMMITTED(6),
+ INFORMATIONAL(7),
+ OUT_OF_DATE(8),
+ PREVIOUS_MERGE_APPLIED_SUCCESS(9),
+ PREVIOUS_MERGE_APPLIED_CAUTION(10);
+ private final int value;
+
+ ConflictStatus(int value) {
+ this.value = value;
+ }
+
+ public final int getValue() {
+ return value;
+ }
+
+ public static ConflictStatus getStatus(int value) {
+ for (ConflictStatus status : values()) {
+ if (status.value == value) return status;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictType.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictType.java
new file mode 100644
index 00000000000..c79e95cdbab
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ConflictType.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.framework.core.enums;
+
+/**
+ * @author Theron Virgin
+ */
+public enum ConflictType {
+
+ ATTRIBUTE(1), RELATION(2), ARTIFACT(3);
+ private final int value;
+
+ ConflictType(int value) {
+ this.value = value;
+ }
+
+ public final int getValue() {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ModificationType.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ModificationType.java
new file mode 100644
index 00000000000..e09e3d8cb8b
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/ModificationType.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.framework.core.enums;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum ModificationType implements Serializable {
+ // Artifact, Attribute or Relation that was newly created
+ NEW("New", 1),
+
+ // Artifact if any Attribute was changed (not Relation)
+ // Attribute if it's value was modified
+ // Relation if rationale or ordering change
+ MODIFIED("Modified", 2),
+
+ // Artifact, Attribute or Relation was deleted
+ DELETED("Deleted", 3),
+
+ // Artifact: Not Valid
+ // Attribute: if value was merged from merge manager
+ // TODO Relation: Not Currently Valid, but needs to be handled
+ MERGED("Merged", 4),
+
+ // Artifact: Not Valid
+ // Attribute or Relation: was deleted as a direct result of Artifact delete, will be marked as ARTIFACT_DELETED
+ ARTIFACT_DELETED("Artifact Deleted", 5),
+
+ // Artifact, Attribute or Relation has been reflected from another branch
+ INTRODUCED("Introduced", 6);
+
+ private int value;
+ private String displayName;
+
+ ModificationType(String displayName, int value) {
+ this.displayName = displayName;
+ this.value = value;
+ }
+
+ /**
+ * @return Returns the value.
+ */
+ public int getValue() {
+ return value;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ /**
+ * @param value The value of the ModificationType to get.
+ * @return The ModificationType that has the value passed.
+ * @throws OseeArgumentException
+ */
+ public static ModificationType getMod(int value) throws OseeArgumentException {
+ for (ModificationType modtype : values())
+ if (modtype.value == value) return modtype;
+ throw new OseeArgumentException(value + " does not correspond to any defined ModificationType enumerations");
+ }
+
+ public boolean isDeleted() {
+ return this == DELETED || this == ARTIFACT_DELETED;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TransactionDetailsType.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TransactionDetailsType.java
new file mode 100644
index 00000000000..95687a569ee
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TransactionDetailsType.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.framework.core.enums;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public enum TransactionDetailsType {
+ NonBaselined(0), Baselined(1);
+
+ private int id;
+
+ private TransactionDetailsType(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public static TransactionDetailsType toEnum(int value) {
+ for (TransactionDetailsType txType : values()) {
+ if (txType.getId() == value) {
+ return txType;
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TxChange.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TxChange.java
new file mode 100644
index 00000000000..462d8b28e7c
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/enums/TxChange.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.framework.core.enums;
+
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum TxChange {
+ NOT_CURRENT(0), CURRENT(1), DELETED(2), ARTIFACT_DELETED(3);
+
+ private int value;
+
+ private TxChange(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public static TxChange getChangeType(int value) {
+ for (TxChange change : values())
+ if (change.getValue() == value) return change;
+ return null;
+ }
+
+ public static TxChange getCurrent(ModificationType type){
+ TxChange txChange = null;
+
+ if(type == ModificationType.DELETED){
+ txChange = TxChange.DELETED;
+ }else if (type == ModificationType.ARTIFACT_DELETED){
+ txChange = TxChange.ARTIFACT_DELETED;
+ }else{
+ txChange = TxChange.CURRENT;
+ }
+ return txChange;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeArbitrationServerException.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeArbitrationServerException.java
new file mode 100644
index 00000000000..6f61390736b
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeArbitrationServerException.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.framework.core.exception;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeArbitrationServerException extends OseeDataStoreException {
+
+ private static final long serialVersionUID = -1622659773564525533L;
+
+ /**
+ * @param message
+ */
+ public OseeArbitrationServerException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeArbitrationServerException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeArbitrationServerException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationException.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationException.java
new file mode 100644
index 00000000000..035ce5b2924
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationException.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.framework.core.exception;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeAuthenticationException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1890728724625261131L;
+
+ public static enum AuthenticationErrorCode {
+ Success, UserNotFound, InvalidPassword, NoResponse, Unknown;
+ }
+
+ private final AuthenticationErrorCode errorCode;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeAuthenticationException(String message, Throwable cause) {
+ super(message, cause);
+ this.errorCode = null;
+ }
+
+ /**
+ * @param message
+ */
+ public OseeAuthenticationException(String message) {
+ super(message);
+ this.errorCode = null;
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeAuthenticationException(Throwable cause) {
+ super(cause);
+ this.errorCode = null;
+ }
+
+ public AuthenticationErrorCode getCode() {
+ return errorCode;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationRequiredException.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationRequiredException.java
new file mode 100644
index 00000000000..7aca4c69df5
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeAuthenticationRequiredException.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.core.exception;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeAuthenticationRequiredException extends OseeDataStoreException {
+
+ private static final long serialVersionUID = 1890728724625261131L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeAuthenticationRequiredException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public OseeAuthenticationRequiredException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeAuthenticationRequiredException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidAuthenticationProtocolException.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidAuthenticationProtocolException.java
new file mode 100644
index 00000000000..bf2826a24bb
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidAuthenticationProtocolException.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.framework.core.exception;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeInvalidAuthenticationProtocolException extends OseeAuthenticationException {
+
+ private static final long serialVersionUID = 1890728724625261131L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeInvalidAuthenticationProtocolException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public OseeInvalidAuthenticationProtocolException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeInvalidAuthenticationProtocolException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidSessionException.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidSessionException.java
new file mode 100644
index 00000000000..ea3b9e04d58
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/exception/OseeInvalidSessionException.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.framework.core.exception;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeInvalidSessionException extends OseeCoreException {
+
+ private static final long serialVersionUID = 5540912279421352009L;
+
+ /**
+ * @param message
+ */
+ public OseeInvalidSessionException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeInvalidSessionException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeInvalidSessionException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractDbTxOperation.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractDbTxOperation.java
new file mode 100644
index 00000000000..6e933ceed6f
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractDbTxOperation.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.framework.core.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractDbTxOperation extends AbstractOperation {
+
+ /**
+ * @param operationName
+ * @param pluginId
+ */
+ public AbstractDbTxOperation(String operationName, String pluginId) {
+ super(operationName, pluginId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected final void doWork(IProgressMonitor monitor) throws Exception {
+ Transaction transaction = new Transaction(monitor);
+ transaction.execute();
+ }
+
+ protected abstract void doTxWork(IProgressMonitor monitor, OseeConnection connection) throws OseeCoreException;
+
+ private final class Transaction extends DbTransaction {
+ private final IProgressMonitor monitor;
+
+ private Transaction(IProgressMonitor monitor) throws OseeCoreException {
+ super();
+ this.monitor = monitor;
+ }
+
+ @Override
+ protected String getTxName() {
+ return AbstractDbTxOperation.this.getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.DbTransaction#handleTxWork(org.eclipse.osee.framework.db.connection.OseeConnection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ AbstractDbTxOperation.this.doTxWork(monitor, connection);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractOperation.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractOperation.java
new file mode 100644
index 00000000000..7373ca6eda8
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/AbstractOperation.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.core.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractOperation implements IOperation {
+
+ private final InternalMultiStatus status;
+ private boolean wasExecuted;
+ private String name;
+
+ /**
+ * @param operationName
+ * @param pluginId
+ */
+ public AbstractOperation(String operationName, String pluginId) {
+ this.status = new InternalMultiStatus(pluginId, IStatus.OK, operationName);
+ this.wasExecuted = false;
+ setName(operationName);
+ }
+
+ /**
+ * Sets the operation's name
+ *
+ * @param name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.IOperation#getName()
+ */
+ public String getName() {
+ return name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.IOperation#getStatus()
+ */
+ public IStatus getStatus() {
+ return status;
+ }
+
+ /**
+ * Updates the operation's status
+ *
+ * @param status
+ */
+ protected void setStatus(IStatus status) {
+ if (status.getSeverity() != IStatus.OK) {
+ this.status.merge(status);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.IOperation#wasExecuted()
+ */
+ public boolean wasExecuted() {
+ return wasExecuted;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.IOperation#getSchedulingRule()
+ */
+ public ISchedulingRule getSchedulingRule() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.IOperation#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public final IOperation run(IProgressMonitor monitor) {
+ wasExecuted = true;
+ try {
+ doWork(monitor);
+ checkForCancelledStatus(monitor);
+ } catch (Throwable error) {
+ setStatus(createErrorStatus(error));
+ } finally {
+ doFinally(monitor);
+ }
+ return this;
+ }
+
+ /**
+ * Convenience method to allow clients to hook into the operation's finally block
+ *
+ * @param monitor
+ */
+ protected void doFinally(IProgressMonitor monitor) {
+
+ }
+
+ /**
+ * All work should be performed here
+ *
+ * @param monitor
+ * @throws Exception
+ */
+ protected abstract void doWork(IProgressMonitor monitor) throws Exception;
+
+ /**
+ * Updates the operation's status message
+ *
+ * @param message
+ */
+ protected void setStatusMessage(String message) {
+ status.setMessage(message);
+ }
+
+ /**
+ * Creates a new error status object
+ *
+ * @param error
+ * @return
+ */
+ protected IStatus createErrorStatus(Throwable error) {
+ if (error instanceof OperationCanceledException) {
+ return Status.CANCEL_STATUS;
+ } else {
+ return new Status(IStatus.ERROR, status.getPlugin(), String.format("%s: %s", status.getMessage(),
+ error.getLocalizedMessage()), error);
+ }
+ }
+
+ /**
+ * @param workPercentage
+ * @return
+ */
+ protected int calculateWork(double workPercentage) {
+ return Operations.calculateWork(getTotalWorkUnits(), workPercentage);
+ }
+
+ /**
+ * Executes a nested operation setting monitor begin and done. If workPercentage is set greater than 0, monitor will
+ * be wrapped into a SubProgressMonitor set to the appropriate number of ticks to consume from the main monitor.
+ * Checks for status after work is complete to detect for execution errors or canceled.
+ *
+ * @param operation
+ * @param monitor
+ * @param workPercentage
+ * @throws Exception
+ */
+ public void doSubWork(IOperation operation, IProgressMonitor monitor, double workPercentage) throws Exception {
+ doSubWorkNoChecks(operation, monitor, workPercentage);
+ checkForErrorsOrCanceled(monitor);
+ }
+
+ /**
+ * Executes a nested operation setting monitor begin and done. If workPercentage is set greater than 0, monitor will
+ * be wrapped into a SubProgressMonitor set to the appropriate number of ticks to consume from the main monitor.
+ * Clients should use {@link #doSubWork(IOperation, IProgressMonitor, double)} when required to throw exceptions for
+ * status errors or canceled. Alternatively, clients can perform the appropriate checks after calling this method.
+ * The operation's status contains the result of having executed the sub-operation.
+ *
+ * @param operation
+ * @param monitor
+ * @param workPercentage
+ */
+ public void doSubWorkNoChecks(IOperation operation, IProgressMonitor monitor, double workPercentage) {
+ Operations.executeWork(operation, monitor, workPercentage);
+ setStatus(operation.getStatus());
+ }
+
+ /**
+ * Throws an exception if the severity mask is detected.
+ *
+ * @param monitor
+ * @throws Exception
+ */
+ protected void checkForStatusSeverityMask(int severityMask) throws Exception {
+ Operations.checkForStatusSeverityMask(getStatus(), severityMask);
+ }
+
+ /**
+ * Checks that the user has not canceled the operation and that the operation's status is still OK. If the status has
+ * changed to ERROR, WARNING or CANCEL - an Exception will be thrown.
+ *
+ * @param monitor
+ * @throws Exception
+ */
+ protected void checkForErrorsOrCanceled(IProgressMonitor monitor) throws Exception {
+ checkForCancelledStatus(monitor);
+ Operations.checkForErrorStatus(getStatus());
+ }
+
+ /**
+ * Checks to see if the user cancelled the operation. If the operation was cancelled, the method will throw an
+ * OperationCanceledException
+ *
+ * @param monitor
+ * @throws OperationCanceledException
+ */
+ protected void checkForCancelledStatus(IProgressMonitor monitor) throws OperationCanceledException {
+ if (monitor.isCanceled()) {
+ boolean wasCancelled = false;
+ IStatus[] children = this.status.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ Throwable exception = children[i].getException();
+ if (exception instanceof OperationCanceledException) {
+ wasCancelled = true;
+ break;
+ }
+ }
+ if (!wasCancelled) {
+ throw new OperationCanceledException();
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.IOperation#getTotalWorkUnits()
+ */
+ @Override
+ public int getTotalWorkUnits() {
+ return IOperation.TOTAL_WORK;
+ }
+
+ private final static class InternalMultiStatus extends org.eclipse.core.runtime.MultiStatus {
+
+ public InternalMultiStatus(String pluginId, int code, String message) {
+ super(pluginId, code, message, null);
+ }
+
+ @Override
+ public void setMessage(String message) {
+ super.setMessage(message);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/IOperation.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/IOperation.java
new file mode 100644
index 00000000000..e11d78e4ea1
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/IOperation.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.framework.core.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOperation {
+
+ public final static int TOTAL_WORK = Integer.MAX_VALUE;
+
+ public String getName();
+
+ public IStatus getStatus();
+
+ public boolean wasExecuted();
+
+ public ISchedulingRule getSchedulingRule();
+
+ public IOperation run(IProgressMonitor monitor);
+
+ /**
+ * @return the total work units as used by a progress monitor
+ */
+ public int getTotalWorkUnits();
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/OperationJob.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/OperationJob.java
new file mode 100644
index 00000000000..22781ca25ea
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/OperationJob.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.framework.core.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Ryan D. Brooks
+ */
+class OperationJob extends Job {
+ private final IOperation operation;
+
+ /**
+ * @param operation the operation that will be executed in this Job
+ */
+ public OperationJob(IOperation operation) {
+ super(operation.getName());
+ this.operation = operation;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ return operation.run(monitor).getStatus();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/Operations.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/Operations.java
new file mode 100644
index 00000000000..41e98edb693
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/operation/Operations.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.framework.core.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Operations {
+
+ private Operations() {
+ }
+
+ /**
+ * @param workPercentage
+ * @return amount from total work
+ */
+ public static int calculateWork(int totalWork, double workPercentage) {
+ return (int) (totalWork * workPercentage);
+ }
+
+ /**
+ * Checks to see if the user canceled the operation. If the operation was canceled, the method will throw an
+ * OperationCanceledException
+ *
+ * @param monitor
+ * @throws OperationCanceledException
+ */
+ protected void checkForCancelledStatus(IProgressMonitor monitor, IStatus status) throws OperationCanceledException {
+ if (monitor.isCanceled()) {
+ boolean wasCancelled = false;
+ IStatus[] children = status.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ Throwable exception = children[i].getException();
+ if (exception instanceof OperationCanceledException) {
+ wasCancelled = true;
+ break;
+ }
+ }
+ if (!wasCancelled) {
+ throw new OperationCanceledException();
+ }
+ }
+ }
+
+ /**
+ * Checks to see if the status has errors. If the status contains errors, an exception will be thrown.
+ *
+ * @param monitor
+ * @throws Exception
+ * @see {@link IStatus#matches(int)}
+ */
+ public static void checkForStatusSeverityMask(IStatus status, int severityMask) throws Exception {
+ if ((severityMask & IStatus.CANCEL) != 0 && status.getSeverity() == IStatus.CANCEL) {
+ throw new OperationCanceledException();
+ } else if (status.matches(severityMask)) {
+ List<StackTraceElement> traceElements = new ArrayList<StackTraceElement>();
+ String message = status.getMessage();
+ for (IStatus childStatus : status.getChildren()) {
+ Throwable exception = childStatus.getException();
+ String childMessage = childStatus.getMessage();
+ if (Strings.isValid(childMessage)) {
+ message = childMessage;
+ }
+ if (exception != null) {
+ traceElements.addAll(Arrays.asList(exception.getStackTrace()));
+ }
+ }
+
+ Exception ex = new Exception(message);
+ if (!traceElements.isEmpty()) {
+ ex.setStackTrace(traceElements.toArray(new StackTraceElement[traceElements.size()]));
+ }
+ throw ex;
+ }
+ }
+
+ /**
+ * Checks to see if the status has errors. If the status contains errors, an exception will be thrown.
+ *
+ * @param monitor
+ * @throws Exception
+ * @see {@link IStatus#matches(int)}
+ */
+ public static void checkForErrorStatus(IStatus status) throws Exception {
+ checkForStatusSeverityMask(status, IStatus.CANCEL | IStatus.ERROR | IStatus.WARNING);
+ }
+
+ /**
+ * Executes an operation calling the monitor begin and done methods. If workPercentage is set greater than 0, monitor
+ * will be wrapped into a SubProgressMonitor set to the appropriate number of ticks to consume from the main monitor.
+ *
+ * @param operation
+ * @param monitor
+ * @param workPercentage
+ */
+ public static void executeWork(IOperation operation, IProgressMonitor monitor, double workPercentage) {
+ if (workPercentage > 0) {
+ monitor = new SubProgressMonitor(monitor, calculateWork(operation.getTotalWorkUnits(), workPercentage));
+ }
+ monitor.beginTask(operation.getName(), operation.getTotalWorkUnits());
+ try {
+ operation.run(monitor);
+ } finally {
+ monitor.subTask("");
+ monitor.setTaskName("");
+ monitor.done();
+ }
+ }
+
+ public static Job executeAsJob(IOperation operation, boolean user) {
+ return scheduleJob(new OperationJob(operation), user, Job.LONG, null);
+ }
+
+ public static Job executeAsJob(IOperation operation, boolean user, int priority, IJobChangeListener jobChangeListener) {
+ return scheduleJob(new OperationJob(operation), user, priority, jobChangeListener);
+ }
+
+ public static Job scheduleJob(Job job, boolean user, int priority, IJobChangeListener jobChangeListener) {
+ job.setUser(user);
+ job.setPriority(priority);
+ if (jobChangeListener != null) {
+ job.addJobChangeListener(jobChangeListener);
+ }
+ job.schedule();
+ return job;
+ }
+}
diff --git a/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/util/TableWriterAdaptor.java b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/util/TableWriterAdaptor.java
new file mode 100644
index 00000000000..a5be2a91126
--- /dev/null
+++ b/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/util/TableWriterAdaptor.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.framework.core.util;
+
+import java.awt.Color;
+import java.io.OutputStream;
+import com.lowagie.text.Cell;
+import com.lowagie.text.DocWriter;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ElementTags;
+import com.lowagie.text.Font;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Table;
+import com.lowagie.text.html.HtmlWriter;
+import com.lowagie.text.markup.WebColors;
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.text.rtf.RtfWriter2;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TableWriterAdaptor {
+ public static final String ENCODING = "ISO-8859-1";
+ public static final String PDF = "pdf";
+ public static final String HTML = "html";
+ public static final String RTF = "rtf";
+
+ private final Document document;
+ private Table table;
+ private final OutputStream outputStream;
+ private boolean complete;
+ private String title;
+ private DocWriter writer;
+
+ public TableWriterAdaptor(String writerId, OutputStream outputStream) throws Exception {
+ this(writerId, PageSize.LETTER.rotate(), outputStream);
+ }
+
+ public TableWriterAdaptor(String writerId, Rectangle rectangle, OutputStream outputStream) throws Exception {
+ this.complete = false;
+ this.document = new Document(rectangle);
+ this.outputStream = outputStream;
+ this.setDocWriter(writerId);
+ }
+
+ private void setDocWriter(String value) throws Exception {
+ if (value.equalsIgnoreCase(PDF)) {
+ this.writer = PdfWriter.getInstance(document, outputStream);
+ // ((PdfWriter) writer).setPDFXConformance(PdfWriter.PDFX32002);
+ ((PdfWriter) writer).setPdfVersion(PdfWriter.VERSION_1_6);
+ } else if (value.equalsIgnoreCase(HTML)) {
+ this.writer = HtmlWriter.getInstance(document, outputStream);
+ } else if (value.equalsIgnoreCase(RTF)) {
+ this.writer = RtfWriter2.getInstance(document, outputStream);
+ }
+ }
+
+ public void writeHeader(String[] headers) throws Exception {
+ table = new Table(headers.length);
+ table.setBorder(1);
+ table.setSpacing(1);
+ table.setPadding(1);
+ // this.table.setCellsFitPage(true);
+ // this.table.setTableFitsPage(true);
+ table.setBorderColor(new Color(0, 0, 0));
+ writeHeader(table, headers);
+ }
+
+ public void writeHeader(Table table, String[] headers) throws Exception {
+ for (String header : headers) {
+ Cell cell = new Cell();
+ cell.setHeader(true);
+ cell.setColspan(1);
+ cell.setBackgroundColor(WebColors.getRGBColor("#d9d9d9"));
+ cell.setHorizontalAlignment(ElementTags.ALIGN_CENTER);
+
+ Font font =
+ FontFactory.getFont("Times New Roman", BaseFont.CP1252, BaseFont.EMBEDDED, 9, Font.BOLD,
+ WebColors.getRGBColor("#000000"));
+ Paragraph paragraph = new Paragraph(header, font);
+ paragraph.setAlignment(ElementTags.ALIGN_CENTER);
+ cell.add(paragraph);
+ table.addCell(cell);
+ }
+ }
+
+ public void writeRow(String... cellData) {
+ writeRow(this.table, cellData);
+ }
+
+ public void writeRow(Table table, String... cellData) {
+ for (String cellText : cellData) {
+ Cell cell = new Cell();
+ cell.setHeader(false);
+ cell.setColspan(1);
+ Font font =
+ FontFactory.getFont("Times New Roman", BaseFont.CP1252, BaseFont.EMBEDDED, 9, Font.NORMAL,
+ WebColors.getRGBColor("#000000"));
+ Paragraph paragraph = new Paragraph(cellText, font);
+ cell.add(paragraph);
+ table.addCell(cell);
+ }
+ }
+
+ public void writeTitle(String title) {
+ this.title = title;
+ }
+
+ public Document getDocument() {
+ return document;
+ }
+
+ public Document openDocument() {
+ document.addTitle(title);
+ document.addSubject("This report is automatically generated.");
+ document.addKeywords("Metadata, iText");
+ document.addCreationDate();
+ if (writer instanceof PdfWriter) {
+ PdfWriter pdfWriter = (PdfWriter) writer;
+ pdfWriter.createXmpMetadata();
+ }
+ document.open();
+ return document;
+ }
+
+ public void writeDocument() throws DocumentException {
+ Font font =
+ FontFactory.getFont("Times New Roman", BaseFont.CP1252, BaseFont.EMBEDDED, 9, Font.BOLD,
+ WebColors.getRGBColor("#000000"));
+ Paragraph paragraph = new Paragraph(title, font);
+ paragraph.setAlignment(ElementTags.ALIGN_CENTER);
+ document.add(paragraph);
+ document.add(table);
+ }
+
+ public void close() {
+ if (complete != true) {
+ document.close();
+ complete = true;
+ }
+ }
+
+ public boolean isCompleted() {
+ return complete;
+ }
+
+ // public String toString() {
+ // try {
+ // return outputStream.toString("ISO-8859-1");
+ // } catch (Exception ex) {
+ // ex.printStackTrace();
+ // }
+ // return "";
+ // }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/.classpath b/org.eclipse.osee.framework.database/.classpath
new file mode 100644
index 00000000000..64ed6b3795d
--- /dev/null
+++ b/org.eclipse.osee.framework.database/.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.database/.project b/org.eclipse.osee.framework.database/.project
new file mode 100644
index 00000000000..c6fe077dcdf
--- /dev/null
+++ b/org.eclipse.osee.framework.database/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.database</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>
+ <nature>org.apache.derby.ui.derbyEngine</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.database/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.database/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..2a407a59321
--- /dev/null
+++ b/org.eclipse.osee.framework.database/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Database Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.database;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.database.DatabaseActivator
+Export-Package: org.eclipse.osee.framework.database,
+ org.eclipse.osee.framework.database.config,
+ org.eclipse.osee.framework.database.core,
+ org.eclipse.osee.framework.database.data,
+ org.eclipse.osee.framework.database.initialize,
+ org.eclipse.osee.framework.database.initialize.tasks,
+ org.eclipse.osee.framework.database.initialize.tasks.relational,
+ org.eclipse.osee.framework.database.sql,
+ org.eclipse.osee.framework.database.sql.datatype,
+ org.eclipse.osee.framework.database.utility
+Require-Bundle:
+ org.eclipse.core.runtime,
+ org.apache.commons.lang,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.core,
+ org.eclipse.osee.framework.core.client
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Import-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.database/build.properties b/org.eclipse.osee.framework.database/build.properties
new file mode 100644
index 00000000000..b44f0f8392a
--- /dev/null
+++ b/org.eclipse.osee.framework.database/build.properties
@@ -0,0 +1,9 @@
+bin.includes = plugin.xml,\
+ META-INF/,\
+ support/,\
+ src/,\
+ .
+jars.compile.order = .
+source.. = src/
+output.. = bin/
+
diff --git a/org.eclipse.osee.framework.database/plugin.xml b/org.eclipse.osee.framework.database/plugin.xml
new file mode 100644
index 00000000000..87b288c5af4
--- /dev/null
+++ b/org.eclipse.osee.framework.database/plugin.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="IDbInitializationTask" name="DbInitializationTask" schema="schema/IDbInitializationTask.exsd"/>
+ <extension-point id="AddDbInitChoice" name="Add Database Initialization Choice" schema="schema/AddDbInitChoice.exsd"/>
+ <extension
+ id="configClient"
+ point="org.eclipse.core.runtime.applications">
+ <application>
+ <run class="org.eclipse.osee.framework.database.ConfigDatabase"/>
+ </application>
+ </extension>
+
+<extension
+ id="BackupTableData"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.database.initialize.tasks.relational.BackupTableData"/>
+</extension>
+<extension
+ id="RestoreTableData"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.database.initialize.tasks.relational.RestoreTableData"/>
+</extension>
+<extension
+ id="ImportDataFromDbService"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.database.initialize.tasks.ImportDataFromDbService"/>
+</extension>
+<extension
+ id="availableDbTasks"
+ name="availableDbTasks"
+ point="org.eclipse.core.runtime.applications">
+ <application>
+ <run class="org.eclipse.osee.framework.database.PlatformRunnableAvailableInitTasks"/>
+ </application>
+</extension>
+<extension
+ id="PostDbInitializationProcess"
+ name="PostDbInitializationProcess"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.database.initialize.tasks.PostDatabaseInitialization">
+ </DatabaseTask>
+</extension>
+
+
+</plugin>
diff --git a/org.eclipse.osee.framework.database/schema/AddDbInitChoice.exsd b/org.eclipse.osee.framework.database/schema/AddDbInitChoice.exsd
new file mode 100644
index 00000000000..17670ac4781
--- /dev/null
+++ b/org.eclipse.osee.framework.database/schema/AddDbInitChoice.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.database">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.database" id="AddDbInitChoice" name="Add Database Initialization Choice"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="dbInitChoice"/>
+ </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="dbInitChoice">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.database.utility.IAddDbInitChoice"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.database/schema/IDbInitializationTask.exsd b/org.eclipse.osee.framework.database/schema/IDbInitializationTask.exsd
new file mode 100644
index 00000000000..14b791e28c4
--- /dev/null
+++ b/org.eclipse.osee.framework.database/schema/IDbInitializationTask.exsd
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.database" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.database" id="IDbInitializationTask" name="DbInitializationTask"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="DatabaseTask"/>
+ </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="DatabaseTask">
+ <complexType>
+ <sequence>
+ </sequence>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.database.IDbInitializationTask"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="DbInitRule" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.database.IDbInitRule"/>
+ </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.framework.database/src/org/eclipse/osee/framework/database/ConfigDatabase.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/ConfigDatabase.java
new file mode 100644
index 00000000000..d209e113db4
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/ConfigDatabase.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.database;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.osee.framework.database.initialize.DatabaseInitializationOperation;
+
+public class ConfigDatabase implements IApplication {
+
+ private static String[] bundlesToStart =
+ new String[] {"org.eclipse.osee.framework.db.connection", "org.eclipse.equinox.ds"};
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+ */
+ public Object start(IApplicationContext context) throws Exception {
+ for (String symbolicName : bundlesToStart) {
+ Platform.getBundle(symbolicName).start();
+ }
+ DatabaseInitializationOperation.executeConfigureFromJvmProperties();
+ return EXIT_OK;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#stop()
+ */
+ public void stop() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/DatabaseActivator.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/DatabaseActivator.java
new file mode 100644
index 00000000000..6e31241fe7c
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/DatabaseActivator.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.framework.database;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plug-in class to be used in the desktop.
+ *
+ * @author Ryan D. Brooks
+ */
+public class DatabaseActivator implements BundleActivator {
+
+ // The shared instance.
+ private static DatabaseActivator plugin;
+
+ /**
+ * Returns the shared instance.
+ */
+ public static DatabaseActivator getInstance() {
+ return plugin;
+ }
+
+ public Bundle getBundle() {
+ return bundle;
+ }
+
+ private Bundle bundle;
+
+ /* (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ bundle = context.getBundle();
+ plugin = this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationRule.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationRule.java
new file mode 100644
index 00000000000..f409d573d97
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationRule.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.framework.database;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IDbInitializationRule {
+
+ public boolean isAllowed() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationTask.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationTask.java
new file mode 100644
index 00000000000..625e077ace0
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/IDbInitializationTask.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.framework.database;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+public interface IDbInitializationTask {
+ public abstract void run() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/MySqlLaunch.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/MySqlLaunch.java
new file mode 100644
index 00000000000..afcdbd7b2c5
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/MySqlLaunch.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.framework.database;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MySqlLaunch {
+ private static final int NUMBER_OF_TRIES = 10;
+ private static final long SLEEP_TIME = 2000;
+ private String installLocation;
+ private IDatabaseInfo dbInfo;
+
+ public MySqlLaunch(IDatabaseInfo dbInfo, String installLocation) {
+ this.installLocation = installLocation;
+ this.dbInfo = dbInfo;
+ }
+
+ private void startMySql() throws IOException {
+ if (installLocation == null) {
+ System.out.println("install location null");
+ throw new IllegalArgumentException(
+ "A `MySqlInfo` element in the oseeSiteConfig.xml file does not exist or has not specified a `InstallLocation` attribute.");
+ }
+ File exe = new File(installLocation, "bin/mysqld.exe");
+ Runtime.getRuntime().exec(exe.getAbsolutePath());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/NotOnProductionDbInitializationRule.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/NotOnProductionDbInitializationRule.java
new file mode 100644
index 00000000000..ce7fdd57c9b
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/NotOnProductionDbInitializationRule.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.framework.database;
+
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class NotOnProductionDbInitializationRule implements IDbInitializationRule {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.IDbInitializationRule#isAllowed()
+ */
+ @Override
+ public boolean isAllowed() throws OseeCoreException {
+ return !ClientSessionManager.isProductionDataStore();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/PlatformRunnableAvailableInitTasks.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/PlatformRunnableAvailableInitTasks.java
new file mode 100644
index 00000000000..7ef6208013a
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/PlatformRunnableAvailableInitTasks.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.framework.database;
+
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+public class PlatformRunnableAvailableInitTasks implements IApplication {
+
+ private void printExtensionPoints(String pointId) {
+ System.out.println("Point [" + pointId + "] search results:");
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(pointId);
+ if (point != null) {
+ for (IExtension ex : point.getExtensions()) {
+ System.out.println(" " + ex.getNamespaceIdentifier() + "/" + ex.getUniqueIdentifier());
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+ */
+ public Object start(IApplicationContext context) throws Exception {
+ printExtensionPoints("org.eclipse.osee.framework.database.IDbInitializationTask");
+ printExtensionPoints("org.eclipse.osee.framework.database.SkynetDbTypes");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#stop()
+ */
+ public void stop() {
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/SkynetTypesEnumGenerator.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/SkynetTypesEnumGenerator.java
new file mode 100644
index 00000000000..16e598845a4
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/SkynetTypesEnumGenerator.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class SkynetTypesEnumGenerator implements RowProcessor {
+ private static final Pattern nonJavaCharP = Pattern.compile("[^a-zA-Z_0-9]");
+
+ private static final String relationImports =
+ "import java.sql.SQLException;\n" + "import org.eclipse.osee.framework.skynet.core.artifact.Branch;\n" + "import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;\n" + "import org.eclipse.osee.framework.skynet.core.relation.RelationLink;\n" + "import org.eclipse.osee.framework.skynet.core.relation.RelationPersistenceManager;\n" + "import org.eclipse.osee.framework.skynet.core.relation.RelationSide;\n" + "import org.eclipse.osee.framework.skynet.core.relation.RelationType;\n" + "import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;\n\n";
+
+ private static final String relationEnumCode =
+ " private boolean sideA;\n" + "\n" + " private String typeName;\n" + "\n" + " private CLASSNAME_PLACEHOLDER(boolean sideA, String typeName) {\n" + " this.sideA = sideA;\n" + " this.typeName = typeName;\n" + " RelationPersistenceManager.sideHash.put(typeName, sideA, this);\n" + " }\n" + " \n" + " public static IRelationEnumeration getRelationSide(String relationType, String relationSide, Branch branch) throws SQLException {\n" + " RelationType desc = RelationTypeManager.getType(relationType);\n" + " boolean isSideA = (desc.getSideAName().equals(relationSide));\n" + " return RelationPersistenceManager.sideHash.get(relationType, isSideA);\n" + " }\n" + "\n" + " /**\n" + " * @return Returns the sideName.\n" + " */\n" + " public boolean isSideA() {\n" + " return sideA;\n" + " }\n" + "\n" + " public String getSideName(Branch branch) throws SQLException {\n" + " if (isSideA())\n" + " return getRelationType().getSideAName();\n" + " else\n" + " return getRelationType().getSideBName();\n" + " }\n" + "\n" + " /**\n" + " * @return Returns the typeName.\n" + " */\n" + " public String getTypeName() {\n" + " return typeName;\n" + " }\n" + "\n" + " public RelationType getRelationType() throws SQLException {\n" + " return RelationTypeManager.getType(typeName);\n" + " }\n" + " \n" + " public boolean isThisType(RelationLink link) {\n" + " return link.getRelationType().getTypeName().equals(typeName);\n}\n\n" + " public RelationSide getSide() { \n" + " return sideA ? RelationSide.SIDE_A : RelationSide.SIDE_B;\n" + "}\n\n" + " public String getSideName() throws SQLException {\n" + " if (isSideA()) {\n" + " return getRelationType().getSideAName();\n" + " } else {\n" + " return getRelationType().getSideBName();\n}\n}\n";
+
+ private enum Table {
+ ARTIFACT_TYPE_TABLE, ATTRIBUTE_TYPE_TABLE, ATTRIBUTE_MAP_TABLE, RELATION_TYPE_TABLE, RELATION_SIDE_TABLE
+ }
+
+ private static final String description = "Setup artifact, attribute, and relation type data";
+
+ private final ExcelSaxHandler excelHandler;
+
+ private Table currentTable;
+
+ private Iterator<Table> tableIterator;
+
+ private boolean done;
+
+ private final XMLReader xmlReader;
+
+ private TreeSet<String> artifacts;
+
+ private TreeSet<String> attributes;
+
+ private TreeSet<String> relations;
+
+ private String sheetName;
+
+ private File destinationDir;
+
+ private static final String skynetTypeCode =
+ " private String name;\n private CLASSNAME_PLACEHOLDER(String name){ this.name = name; }\n public String getName(){ return this.name;}\n";
+
+ /**
+ * @throws SAXException
+ */
+ public SkynetTypesEnumGenerator() throws SAXException {
+
+ excelHandler = new ExcelSaxHandler(this, true, true);
+
+ xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(excelHandler);
+
+ artifacts = new TreeSet<String>();
+ attributes = new TreeSet<String>();
+ relations = new TreeSet<String>();
+ }
+
+ public void extractTypesFromSheet(File importFile, File destinationDir) throws IOException, SAXException {
+ done = false;
+ tableIterator = Arrays.asList(Table.values()).iterator();
+ xmlReader.parse(new InputSource(new FileInputStream(importFile)));
+
+ this.destinationDir =
+ (destinationDir != null && destinationDir.isDirectory()) ? destinationDir : importFile.getParentFile();
+ }
+
+ public void finish() throws IOException {
+ BufferedWriter out;
+ //relation enum gen
+ String relClassName = this.sheetName + "_RELATIONS";
+ out = new BufferedWriter(new FileWriter(new File(destinationDir, relClassName + ".java")));
+ out.append("\n\n");
+ out.append(relationImports);
+ out.append("public enum ");
+ out.append(relClassName);
+ out.append(" implements IRelationEnumeration {\n");
+ Iterator<String> it = relations.iterator();
+ while (it.hasNext()) {
+ out.append(" ");
+ out.append(it.next());
+ if (it.hasNext()) out.append(",\n");
+ }
+ out.append(";\n");
+ out.append(relationEnumCode.replace("CLASSNAME_PLACEHOLDER", relClassName));
+ out.append("}");
+ out.close();
+ //attribute enum gen
+ String attrClassName = this.sheetName + "_ATTRIBUTES";
+ out = new BufferedWriter(new FileWriter(new File(destinationDir, attrClassName + ".java")));
+ out.append("\n\nimport org.eclipse.osee.framework.skynet.core.ISkynetType;\n\npublic enum ");
+ out.append(attrClassName);
+ out.append(" implements ISkynetType {\n");
+ it = attributes.iterator();
+ while (it.hasNext()) {
+ out.append(" ");
+ out.append(it.next());
+ if (it.hasNext()) out.append(",\n");
+ }
+ out.append(";\n\n");
+ out.append(skynetTypeCode.replace("CLASSNAME_PLACEHOLDER", attrClassName));
+ out.append("}");
+ out.close();
+ //artifact enum gen
+ String artClassName = this.sheetName + "_ARTIFACTS";
+ out = new BufferedWriter(new FileWriter(new File(destinationDir, artClassName + ".java")));
+ out.append("\n\nimport org.eclipse.osee.framework.skynet.core.ISkynetType;\n\npublic enum ");
+ out.append(artClassName);
+ out.append(" implements ISkynetType {\n");
+ it = artifacts.iterator();
+ while (it.hasNext()) {
+ out.append(" ");
+ out.append(it.next());
+ if (it.hasNext()) out.append(",\n");
+ }
+ out.append(";\n\n");
+ out.append(skynetTypeCode.replace("CLASSNAME_PLACEHOLDER", artClassName));
+ out.append("}");
+ out.close();
+ }
+
+ public static String getDescription() {
+ return description;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] headerRow) {
+ if (done) return;
+ if (tableIterator.hasNext()) {
+ currentTable = tableIterator.next();
+ } else {
+ throw new IllegalArgumentException(
+ "Encountered row past end of last expected table: " + Arrays.deepToString(headerRow));
+ }
+ }
+
+ /**
+ * import Artifacts
+ *
+ * @param row
+ */
+ public void processRow(String[] row) {
+ if (done) return;
+ try {
+ switch (currentTable) {
+ case ARTIFACT_TYPE_TABLE:
+ addArtifactType(row);
+ break;
+ case ATTRIBUTE_TYPE_TABLE:
+ addAttributeType(row);
+ break;
+ case RELATION_TYPE_TABLE:
+ addRelationType(row);
+ break;
+ default:
+ break;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+
+ /**
+ * @param row
+ * @throws ClassNotFoundException
+ */
+ private void addAttributeType(String[] row) throws ClassNotFoundException {
+ // String attrBaseType = row[0];
+ // String attrProviderType = row[1];
+ String attributeName = row[2];
+ int index = attributeName.lastIndexOf(".");
+ if (index != -1 && index + 1 < attributeName.length()) {
+ attributeName = attributeName.substring(index + 1, attributeName.length());
+ }
+ // String fileTypeExtension = row[3];
+ // String defaultValue = row[4];
+ // String validityXml = row[5];
+ // int minOccurrence = getQuantity(row[6]);
+ // int maxOccurrence = getQuantity(row[7]);
+ // String tipText = row[8];
+
+ // if (fileTypeExtension == null) {
+ // fileTypeExtension = "";
+ // }
+
+ attributes.add(nonJavaCharP.matcher(attributeName).replaceAll("_").toUpperCase() + "(\"" + attributeName + "\")");
+ }
+
+ /**
+ * @param row
+ */
+ private void addRelationType(String[] row) {
+
+ String relationTypeName = row[0];
+ String sideAName = row[1];
+ // String A2BPhrase = row[2];
+ String sideBName = row[3];
+ // String B2APhrase = row[4];
+ // String shortName = row[5];
+ generateRelationSideEnum(relationTypeName, sideAName, sideBName);
+ }
+
+ private void generateRelationSideEnum(String relationTypeName, String sideAName, String sideBName) {
+ sideAName = nonJavaCharP.matcher(sideAName).replaceAll("_").toUpperCase();
+ sideBName = nonJavaCharP.matcher(sideBName).replaceAll("_").toUpperCase();
+ String enumPrefix = nonJavaCharP.matcher(relationTypeName).replaceAll("_").toUpperCase();
+ relations.add(String.format("%s__%s(true, \"%s\"),\n %s__%s(false, \"%s\")", enumPrefix, sideAName,
+ relationTypeName, enumPrefix, sideBName, relationTypeName));
+ }
+
+ /**
+ * @param row
+ */
+ private void addArtifactType(String[] row) {
+ // String factoryClassName = row[0];
+ String artifactTypeName = row[1];
+ // String superTypeName = row[2];
+
+ artifacts.add(nonJavaCharP.matcher(artifactTypeName).replaceAll("_").toUpperCase() + "(\"" + artifactTypeName + "\")");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processEmptyRow(java.lang.String[])
+ */
+ public void processEmptyRow() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ done = true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#detectedTotalRowCount(int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ this.sheetName = nonJavaCharP.matcher(sheetName).replaceAll("_").toUpperCase();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/SchemaConfigUtility.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/SchemaConfigUtility.java
new file mode 100644
index 00000000000..96d1e46d5cf
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/SchemaConfigUtility.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.framework.database.config;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SchemaConfigUtility {
+
+ /**
+ * Reads files containing Schema Table information and groups tables by schema.
+ */
+ public static Map<String, SchemaData> getUserDefinedConfig(List<URL> files) {
+ Map<String, SchemaData> userSpecifiedConfig = new HashMap<String, SchemaData>();
+
+ for (URL file : files) {
+ SchemaData schemaData;
+ try {
+ schemaData = TableConfigUtility.getInstance().getTableConfigData(file.openStream());
+ List<TableElement> tables = schemaData.getTablesOrderedByDependency();
+ for (TableElement table : tables) {
+ String schemaAddress = table.getSchema();
+
+ SchemaData schema = null;
+ if (!userSpecifiedConfig.containsKey(schemaAddress)) {
+ schema = new SchemaData();
+ userSpecifiedConfig.put(schemaAddress, schema);
+ } else {
+ schema = userSpecifiedConfig.get(schemaAddress);
+ }
+ schema.addTableDefinition(table);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return userSpecifiedConfig;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/TableConfigUtility.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/TableConfigUtility.java
new file mode 100644
index 00000000000..e2eb8dba2c3
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/config/TableConfigUtility.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.config;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.AppliesToClause;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ConstraintFactory;
+import org.eclipse.osee.framework.database.data.ConstraintTypes;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.AppliesToClause.AppliesToEntries;
+import org.eclipse.osee.framework.database.data.AppliesToClause.OrderType;
+import org.eclipse.osee.framework.database.data.ConstraintElement.ConstraintFields;
+import org.eclipse.osee.framework.database.data.IndexElement.IndexFields;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnDeleteEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnUpdateEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.ReferencesFields;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableDescriptionFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableSections;
+import org.eclipse.osee.framework.database.data.TableElement.TableTags;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TableConfigUtility {
+
+ private static TableConfigUtility instance = null;
+
+ private SchemaData parsedData;
+ private Document document;
+
+ private TableConfigUtility() {
+ }
+
+ public static TableConfigUtility getInstance() {
+ if (instance == null) instance = new TableConfigUtility();
+ return instance;
+ }
+
+ public SchemaData getTableConfigData(InputStream configFile) {
+ this.document = xmlFileToDocument(configFile);
+ this.parsedData = parseTableConfigData();
+ return parsedData;
+ }
+
+ public static Document xmlFileToDocument(InputStream configFile) {
+ Document document = null;
+ try {
+ document = Jaxp.readXmlDocument(configFile);
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex.toString(), ex);
+ } catch (SAXException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex.toString(), ex);
+ } catch (IOException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex.toString(), ex);
+ }
+ return document;
+ }
+
+ private void parseTableDescription(Element element, TableElement tableEntry) {
+ NamedNodeMap attributes = element.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++) {
+ Attr attribute = (Attr) attributes.item(i);
+ TableDescriptionFields tableField = TableDescriptionFields.valueOf(attribute.getName());
+ tableEntry.addTableDescription(tableField, attribute.getValue());
+ }
+ }
+
+ private void parseColumnEntries(Element element, TableElement tableEntry) {
+ List<Element> columns = Jaxp.getChildDirects(element, TableSections.Column.name());
+ for (Element column : columns) {
+ NamedNodeMap attributes = column.getAttributes();
+ ColumnMetadata columnMetadata = new ColumnMetadata("");
+ for (int i = 0; i < attributes.getLength(); i++) {
+ Attr attribute = (Attr) attributes.item(i);
+ ColumnFields columnField = ColumnFields.valueOf(attribute.getName());
+ columnMetadata.addColumnField(columnField, attribute.getValue().toUpperCase());
+ }
+ tableEntry.addColumn(columnMetadata);
+ }
+ }
+
+ private void parseConstraintEntries(Element element, TableElement tableEntry) {
+ List<Element> constraints = Jaxp.getChildDirects(element, TableSections.Constraint.name());
+ for (Element constraint : constraints) {
+ Attr type = constraint.getAttributeNode(ConstraintFields.type.name());
+ Attr id = constraint.getAttributeNode(ConstraintFields.id.name());
+ String schema = constraint.getAttribute(ConstraintFields.schema.name());
+ String deferrable = constraint.getAttribute(ConstraintFields.deferrable.name());
+ if (type != null && id != null) {
+
+ ConstraintElement constraintElement =
+ ConstraintFactory.getConstraint(ConstraintTypes.textToType(type.getValue().toUpperCase()),
+ schema.toUpperCase(), id.getValue().toUpperCase(),
+ deferrable.equalsIgnoreCase(Boolean.toString(true)));
+
+ Attr appliesTo = constraint.getAttributeNode(ConstraintFields.appliesTo.name());
+ if (appliesTo != null) {
+ String[] columns = appliesTo.getValue().split(",");
+ for (String column : columns) {
+ constraintElement.addColumn(column.toUpperCase());
+ }
+ }
+
+ if (constraintElement instanceof ForeignKey) {
+ Element reference = Jaxp.getChildDirect(constraint, ReferenceClause.REFERENCES_TAG);
+ if (reference != null) {
+ Attr table = reference.getAttributeNode(ReferencesFields.table.name());
+ Attr refColumn = reference.getAttributeNode(ReferencesFields.column.name());
+ Attr onUpdate = reference.getAttributeNode(ReferencesFields.onUpdate.name());
+ Attr onDelete = reference.getAttributeNode(ReferencesFields.onDelete.name());
+ String refSchema = reference.getAttribute(ReferencesFields.schema.name());
+
+ if (table != null) {
+
+ ReferenceClause references =
+ new ReferenceClause(refSchema.toUpperCase(), table.getValue().toUpperCase());
+ if (refColumn != null) {
+ String[] columns = refColumn.getValue().split(",");
+ for (String column : columns) {
+ references.addColumn(column.toUpperCase());
+ }
+ }
+ if (onUpdate != null) {
+ OnUpdateEnum[] values = OnUpdateEnum.values();
+ for (OnUpdateEnum value : values) {
+ if (value.toString().equals(onUpdate.getValue().toUpperCase())) {
+ references.setOnUpdateAction(value);
+ }
+ }
+ }
+ if (onDelete != null) {
+ OnDeleteEnum[] values = OnDeleteEnum.values();
+ for (OnDeleteEnum value : values) {
+ if (value.toString().equals(onDelete.getValue().toUpperCase())) {
+ references.setOnDeleteAction(value);
+ }
+ }
+ }
+ ((ForeignKey) constraintElement).addReference(references);
+ }
+ }
+ }
+ tableEntry.addConstraint(constraintElement);
+ }
+ }
+ }
+
+ private void parseIndexDataEntries(Element element, TableElement tableEntry) {
+ List<Element> indexDataList = Jaxp.getChildDirects(element, TableSections.Index.name());
+ for (Element indexDataEntry : indexDataList) {
+ String id = indexDataEntry.getAttribute(IndexFields.id.name());
+ String ignore = indexDataEntry.getAttribute(IndexFields.mySqlIgnore.name());
+ Attr indexType = indexDataEntry.getAttributeNode(IndexFields.type.name());
+ String tablespace = indexDataEntry.getAttribute(IndexFields.tablespace.name());
+ if (id.length() > 0) {
+ IndexElement indexData = new IndexElement(id);
+ if (Boolean.parseBoolean(ignore)) {
+ indexData.setMySqlIgnore(true);
+ }
+ if (indexType != null) {
+ indexData.setIndexType(indexType.getValue());
+ }
+ if (tablespace != null) {
+ indexData.setTablespace(tablespace);
+ }
+ parseAppliesToClause(indexDataEntry, indexData);
+ tableEntry.addIndexData(indexData);
+ }
+ }
+ }
+
+ public void parseAppliesToClause(Element element, IndexElement indexData) {
+ List<Element> appliesToList = Jaxp.getChildDirects(element, AppliesToClause.APPLIES_TO_TAG);
+ for (Element appliesToElement : appliesToList) {
+ String idString = appliesToElement.getAttribute(AppliesToEntries.id.name());
+ String sortString = appliesToElement.getAttribute(AppliesToEntries.sort.name());
+ if (idString.length() > 0) {
+ OrderType orderType = OrderType.Undefined;
+ if (sortString.equalsIgnoreCase("Ascending")) {
+ orderType = OrderType.Ascending;
+ } else if (sortString.equalsIgnoreCase("Descending")) {
+ orderType = OrderType.Descending;
+ }
+ indexData.addAppliesTo(idString, orderType);
+ }
+ }
+ }
+
+ private SchemaData parseTableConfigData() {
+ if (document == null) {
+ return null;
+ }
+ SchemaData tableData = new SchemaData();
+ List<Element> elements = Jaxp.getChildDirects(document.getDocumentElement(), TableTags.Table.name());
+ for (Element element : elements) {
+
+ TableElement tableEntry = new TableElement();
+
+ parseTableDescription(element, tableEntry);
+ parseColumnEntries(element, tableEntry);
+ parseConstraintEntries(element, tableEntry);
+ parseIndexDataEntries(element, tableEntry);
+
+ tableData.addTableDefinition(tableEntry);
+ }
+ return tableData;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/core/IConfigClient.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/core/IConfigClient.java
new file mode 100644
index 00000000000..4824908fe0e
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/core/IConfigClient.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.framework.database.core;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IConfigClient {
+
+ public abstract void startConfigClient();
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/AppliesToClause.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/AppliesToClause.java
new file mode 100644
index 00000000000..a35368b7a64
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/AppliesToClause.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.framework.database.data;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AppliesToClause implements Xmlizable {
+ public static final String APPLIES_TO_TAG = "AppliesTo";
+
+ public enum OrderType {
+ Undefined, Ascending, Descending;
+ }
+
+ public enum AppliesToEntries {
+ id, sort;
+ }
+
+ private String columnName;
+ private OrderType orderType;
+
+ public AppliesToClause(String columnName, OrderType orderType) {
+ this.columnName = columnName;
+ this.orderType = orderType;
+ }
+
+ public String getColumnName() {
+ return columnName;
+ }
+
+ public void setColumnName(String columnName) {
+ this.columnName = columnName;
+ }
+
+ public OrderType getOrderType() {
+ return orderType;
+ }
+
+ public void setOrderType(OrderType orderType) {
+ this.orderType = orderType;
+ }
+
+ public String toString() {
+ return String.format("%s:[%s]\t%s:[%s]", AppliesToEntries.id.name(), columnName, AppliesToEntries.sort.name(),
+ orderType);
+ }
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof AppliesToClause == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ AppliesToClause that = (AppliesToClause) otherObject;
+ return new EqualsBuilder().appendSuper(super.equals(otherObject)).append(this.columnName, that.getColumnName()).append(
+ this.orderType, that.getOrderType()).isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(23, 37).append(columnName).append(orderType).toHashCode();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.persistence.Xmlizable#toXml()
+ */
+ public Element toXml(Document doc) {
+ Element element = doc.createElement(APPLIES_TO_TAG);
+ element.setAttribute(AppliesToEntries.id.name(), columnName);
+ if (!orderType.equals(OrderType.Undefined)) {
+ element.setAttribute(AppliesToEntries.sort.name(), orderType.name());
+ }
+ return element;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnDbData.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnDbData.java
new file mode 100644
index 00000000000..94583df7eef
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnDbData.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.framework.database.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ColumnDbData {
+ private String columnName;
+ private String columnValue;
+
+ public ColumnDbData(String columnName, String columnValue) {
+ this.columnName = columnName;
+ this.columnValue = columnValue;
+ }
+
+ public String getColumnName() {
+ return columnName;
+ }
+
+ public String getColumnValue() {
+ return columnValue;
+ }
+
+ public String toString() {
+ return "[" + columnName + ", " + columnValue + "]";
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnMetadata.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnMetadata.java
new file mode 100644
index 00000000000..efcd24e8dfb
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ColumnMetadata.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.framework.database.data;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableSections;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ColumnMetadata implements Xmlizable {
+ private Map<ColumnFields, String> columnFields;
+
+ public ColumnMetadata(String columnId) {
+ columnFields = new HashMap<ColumnFields, String>();
+ columnFields.put(ColumnFields.id, columnId);
+ }
+
+ public String getId() {
+ return getColumnField(ColumnFields.id);
+ }
+
+ public Map<ColumnFields, String> getColumnFields() {
+ return columnFields;
+ }
+
+ public void addColumnField(ColumnFields field, String value) {
+ columnFields.put(field, value);
+ }
+
+ public String getColumnField(ColumnFields field) {
+ if (columnFields.containsKey(field)) {
+ return columnFields.get(field);
+ }
+ return "";
+ }
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof ColumnMetadata == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ ColumnMetadata that = (ColumnMetadata) otherObject;
+ return new EqualsBuilder().appendSuper(super.equals(otherObject)).append(this.columnFields,
+ that.getColumnFields()).isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(101, 83).append(columnFields).toHashCode();
+ }
+
+ public String toString() {
+ String toReturn = TableSections.Column + ": ";
+ Set<ColumnFields> keys = columnFields.keySet();
+ for (ColumnFields field : keys) {
+ String value = columnFields.get(field);
+ toReturn += "\t" + field + "[" + value + "]";
+ }
+ return toReturn;
+ }
+
+ public Element toXml(Document doc) {
+ Element columnElement = doc.createElement(TableSections.Column.toString());
+ for (ColumnFields key : columnFields.keySet()) {
+ columnElement.setAttribute(key.toString(), columnFields.get(key));
+ }
+ return columnElement;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintElement.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintElement.java
new file mode 100644
index 00000000000..7d5ef6566fa
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintElement.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.database.data.TableElement.TableSections;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConstraintElement implements Xmlizable {
+
+ public enum ConstraintFields {
+ id, schema, type, appliesTo, deferrable
+ };
+
+ private ConstraintTypes constraintType;
+ private boolean deferrable;
+ private String schema;
+ private String id;
+ private List<String> columns;
+
+ public ConstraintElement(ConstraintTypes constraintType, String schema, String id, boolean deferrable) {
+ this.schema = schema.toUpperCase();
+ this.schema = this.schema.trim();
+ this.id = id.toUpperCase();
+ this.id = this.id.trim();
+ this.deferrable = deferrable;
+ this.constraintType = constraintType;
+ this.columns = new ArrayList<String>();
+ }
+
+ public List<String> getColumns() {
+ return columns;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getSchema() {
+ return schema;
+ }
+
+ public void addColumn(String columnName) {
+ columnName = columnName.toUpperCase();
+ columnName = columnName.trim();
+ this.columns.add(columnName);
+ }
+
+ public void setId(String id) {
+ id = id.toUpperCase();
+ id = id.trim();
+ this.id = id;
+ }
+
+ public void setSchema(String schema) {
+ schema = schema.toUpperCase();
+ schema = schema.trim();
+ this.schema = schema;
+ }
+
+ public String getFullyQualifiedId() {
+ if (schema != null && !schema.equals("")) {
+ return schema + "." + id;
+ } else {
+ return id;
+ }
+ }
+
+ /**
+ * @return Returns the deferrable.
+ */
+ public boolean isDeferrable() {
+ return deferrable;
+ }
+
+ public ConstraintTypes getConstraintType() {
+ return constraintType;
+ }
+
+ public String getCommaSeparatedColumnsList() {
+ return StringFormat.listToCommaSeparatedString(columns);
+ }
+
+ public String toString() {
+ String toReturn = TableSections.Constraint + ": ";
+ toReturn += "\t" + ConstraintFields.schema + "[" + schema + "]";
+ toReturn += "\t" + ConstraintFields.id + "[" + id + "]";
+ toReturn += "\t" + ConstraintFields.type + "[" + constraintType.toString() + "]";
+ toReturn += "\t" + ConstraintFields.appliesTo + "[" + getCommaSeparatedColumnsList() + "]";
+ toReturn += "\t" + ConstraintFields.deferrable + "[" + Boolean.toString(deferrable) + "]";
+ return toReturn;
+ }
+
+ public Element toXml(Document doc) {
+ Element constraintElement = doc.createElement(TableSections.Constraint.toString());
+ constraintElement.setAttribute(ConstraintFields.schema.name(), schema);
+ constraintElement.setAttribute(ConstraintFields.id.name(), id);
+ constraintElement.setAttribute(ConstraintFields.type.name(), constraintType.toString());
+ constraintElement.setAttribute(ConstraintFields.appliesTo.name(), getCommaSeparatedColumnsList());
+ constraintElement.setAttribute(ConstraintFields.deferrable.name(), Boolean.toString(deferrable));
+ return constraintElement;
+ }
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof ConstraintElement == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ ConstraintElement that = (ConstraintElement) otherObject;
+ return new EqualsBuilder().appendSuper(super.equals(otherObject)).append(this.constraintType,
+ that.getConstraintType()).append(this.schema, that.getSchema()).append(this.id, that.getId()).append(
+ this.columns, that.getColumns()).append(this.deferrable, that.deferrable).isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(37, 11).append(constraintType).append(schema).append(id).append(columns).append(
+ deferrable).toHashCode();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintFactory.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintFactory.java
new file mode 100644
index 00000000000..652f102be48
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintFactory.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.framework.database.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConstraintFactory {
+
+ public static ConstraintElement getConstraint(ConstraintTypes constraintType, String schema, String id, boolean deferrable) {
+ ConstraintElement element = null;
+ if (constraintType != null) {
+ switch (constraintType) {
+ case FOREIGN_KEY:
+ element = new ForeignKey(constraintType, schema, id, deferrable);
+ break;
+ case PRIMARY_KEY:
+ case UNIQUE:
+ case CHECK:
+ default:
+ element = new ConstraintElement(constraintType, schema, id, deferrable);
+ break;
+ }
+ }
+ return element;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintTypes.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintTypes.java
new file mode 100644
index 00000000000..65193668a94
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ConstraintTypes.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.framework.database.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum ConstraintTypes {
+ PRIMARY_KEY, FOREIGN_KEY, UNIQUE, CHECK;
+
+ public String toString() {
+ String toReturn = super.toString();
+ toReturn = toReturn.replaceAll("_", " ");
+ return toReturn;
+ }
+
+ public static ConstraintTypes textToType(String text) {
+ ConstraintTypes[] typesArray = ConstraintTypes.values();
+ for (ConstraintTypes type : typesArray) {
+ if (type.toString().equals(text.toUpperCase())) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ForeignKey.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ForeignKey.java
new file mode 100644
index 00000000000..c3acad999b5
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ForeignKey.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.framework.database.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ForeignKey extends ConstraintElement implements Xmlizable {
+
+ List<ReferenceClause> references;
+
+ public ForeignKey(ConstraintTypes constraintType, String schema, String id, boolean deferrable) {
+ super(constraintType, schema, id, deferrable);
+ references = new ArrayList<ReferenceClause>();
+ }
+
+ public void addReference(ReferenceClause reference) {
+ references.add(reference);
+ }
+
+ public List<ReferenceClause> getReferences() {
+ return references;
+ }
+
+ public Set<String> getReferencedTables() {
+ Set<String> refTables = new TreeSet<String>();
+ for (ReferenceClause ref : references) {
+ refTables.add(ref.getFullyQualifiedTableName());
+ }
+ return refTables;
+ }
+
+ @Override
+ public String toString() {
+ String toReturn = super.toString();
+ for (ReferenceClause reference : references) {
+ toReturn += "\n\t\t" + reference.toString();
+ }
+ return toReturn;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element parent = super.toXml(doc);
+ for (ReferenceClause reference : references) {
+ parent.appendChild(reference.toXml(doc));
+ }
+ return parent;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/IndexElement.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/IndexElement.java
new file mode 100644
index 00000000000..9195bdf782d
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/IndexElement.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.framework.database.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.database.data.AppliesToClause.OrderType;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class IndexElement implements Xmlizable {
+
+ public enum IndexFields {
+ id, mySqlIgnore, type, tablespace;
+ }
+
+ private String id;
+ private String indexType;
+ private List<AppliesToClause> appliesToList;
+ private boolean ignoreMySql = false;
+ private String tablespace;
+
+ public IndexElement(String id) {
+ this.id = id;
+ this.appliesToList = new ArrayList<AppliesToClause>();
+ this.indexType = "";
+ this.tablespace = "";
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void addAppliesTo(String name, OrderType type) {
+ appliesToList.add(new AppliesToClause(name, type));
+ }
+
+ public List<AppliesToClause> getAppliesToList() {
+ return appliesToList;
+ }
+
+ public String toString() {
+ StringBuilder toReturn = new StringBuilder();
+ toReturn.append(" Index: " + id);
+ toReturn.append(getAppliesToAsString());
+ return toReturn.toString();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.persistence.Xmlizable#toXml()
+ */
+ public Element toXml(Document doc) {
+ Element element = doc.createElement(TableElement.TableSections.Index.name());
+ element.setAttribute(IndexFields.id.name(), id);
+ for (AppliesToClause clause : appliesToList) {
+ element.appendChild(clause.toXml(doc));
+ }
+ return element;
+ }
+
+ public String getAppliesToAsString() {
+ StringBuilder toReturn = new StringBuilder();
+ for (int index = 0; index < appliesToList.size(); index++) {
+ toReturn.append("\n\t\tApplies to " + appliesToList.get(index));
+ }
+ return toReturn.toString();
+ }
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof IndexElement == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ IndexElement that = (IndexElement) otherObject;
+ return new EqualsBuilder().appendSuper(super.equals(otherObject)).append(this.appliesToList,
+ that.getAppliesToList()).append(this.id, that.getId()).isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(113, 67).append(id).append(appliesToList).toHashCode();
+ }
+
+ public void setMySqlIgnore(boolean b) {
+ this.ignoreMySql = b;
+ }
+
+ public void setIndexType(String indexType) {
+ if (indexType != null) {
+ this.indexType = indexType;
+ }
+ }
+
+ public String getIndexType() {
+ return indexType;
+ }
+
+ public boolean ignoreMySql() {
+ return this.ignoreMySql;
+ }
+
+ public String getTablespace() {
+ return Strings.isValid(tablespace) ? tablespace : "";
+ }
+
+ public void setTablespace(String tablespace) {
+ this.tablespace = tablespace;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ReferenceClause.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ReferenceClause.java
new file mode 100644
index 00000000000..4a8521e5d7e
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/ReferenceClause.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.database.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReferenceClause implements Xmlizable {
+ public static final String REFERENCES_TAG = "References";
+
+ public enum ReferencesFields {
+ schema, table, column, onUpdate, onDelete;
+ }
+
+ public enum OnDeleteEnum {
+ NO_ACTION, RESTRICT, CASCADE, SET_NULL, UNSPECIFIED;
+
+ public String toString() {
+ String toReturn = super.toString();
+ toReturn = toReturn.replaceAll("_", " ");
+ return toReturn;
+ }
+ }
+
+ public enum OnUpdateEnum {
+ NO_ACTION, RESTRICT, UNSPECIFIED;
+
+ public String toString() {
+ String toReturn = super.toString();
+ toReturn = toReturn.replaceAll("_", " ");
+ return toReturn;
+ }
+ }
+
+ private String schema;
+ private String table;
+ List<String> columns;
+ OnDeleteEnum onDeleteAction;
+ OnUpdateEnum onUpdateAction;
+
+ public ReferenceClause(String schema, String table) {
+ this.schema = schema.toUpperCase();
+ this.schema = this.schema.trim();
+ this.table = table.toUpperCase();
+ this.table = this.table.trim();
+ this.columns = new ArrayList<String>();
+ this.onDeleteAction = OnDeleteEnum.UNSPECIFIED;
+ this.onUpdateAction = OnUpdateEnum.UNSPECIFIED;
+ }
+
+ public void setSchema(String schema) {
+ this.schema = schema;
+ }
+
+ public OnDeleteEnum getOnDeleteAction() {
+ return onDeleteAction;
+ }
+
+ public OnUpdateEnum getOnUpdateAction() {
+ return onUpdateAction;
+ }
+
+ public void setOnDeleteAction(OnDeleteEnum onDeleteAction) {
+ this.onDeleteAction = onDeleteAction;
+ }
+
+ public void setOnUpdateAction(OnUpdateEnum onUpdateAction) {
+ this.onUpdateAction = onUpdateAction;
+ }
+
+ public void addColumn(String column) {
+ column = column.toUpperCase();
+ column = column.trim();
+ columns.add(column);
+ }
+
+ public String getFullyQualifiedTableName() {
+ return schema + "." + table;
+ }
+
+ public List<String> getColumns() {
+ return columns;
+ }
+
+ public String getCommaSeparatedColumnsList() {
+ return StringFormat.listToCommaSeparatedString(columns);
+ }
+
+ public String toString() {
+ String toReturn = REFERENCES_TAG + ": " + getFullyQualifiedTableName();
+ toReturn += "\t[";
+ for (String column : columns) {
+ toReturn += column + " ";
+ }
+ toReturn += "]";
+ return toReturn;
+ }
+
+ public Element toXml(Document doc) {
+ Element refElement = doc.createElement(REFERENCES_TAG);
+ refElement.setAttribute(ReferencesFields.schema.name(), schema);
+ refElement.setAttribute(ReferencesFields.table.name(), table);
+ refElement.setAttribute(ReferencesFields.column.name(), getCommaSeparatedColumnsList());
+
+ if (!onDeleteAction.equals(OnDeleteEnum.UNSPECIFIED)) {
+ refElement.setAttribute(ReferencesFields.onDelete.name(), onDeleteAction.toString());
+ }
+
+ if (!onUpdateAction.equals(OnUpdateEnum.UNSPECIFIED)) {
+ refElement.setAttribute(ReferencesFields.onUpdate.name(), onUpdateAction.toString());
+ }
+ return refElement;
+ }
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof ReferenceClause == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ ReferenceClause that = (ReferenceClause) otherObject;
+ return new EqualsBuilder().appendSuper(super.equals(otherObject)).append(this.getFullyQualifiedTableName(),
+ that.getFullyQualifiedTableName()).append(this.columns, that.getColumns()).append(this.onDeleteAction,
+ that.getOnDeleteAction()).append(this.onUpdateAction, that.getOnUpdateAction()).isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(113, 67).append(schema).append(table).append(columns).append(onDeleteAction).append(
+ onUpdateAction).toHashCode();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaData.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaData.java
new file mode 100644
index 00000000000..075f1508804
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaData.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import javax.xml.parsers.ParserConfigurationException;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SchemaData implements Xmlizable {
+
+ public static final String ROOT_TAG = "TableConfig";
+ private List<TableElement> tableDefinitions;
+ private SchemaDataLookup schemaLookup;
+
+ private boolean isSorted;
+
+ public SchemaData() {
+ this.tableDefinitions = new ArrayList<TableElement>();
+ this.isSorted = false;
+ this.schemaLookup = new SchemaDataLookup(this);
+ }
+
+ public SchemaDataLookup getLookUpStrategy() {
+ return schemaLookup;
+ }
+
+ public List<TableElement> getTablesOrderedByDependency() {
+ sortTablesForConstraints();
+ markIdentityColumns();
+ return tableDefinitions;
+ }
+
+ public Set<String> getTablesToBackup() {
+ Set<String> backupTables = new TreeSet<String>();
+ for (TableElement table : tableDefinitions) {
+ if (table.isBackupDataSet()) {
+ backupTables.add(table.getFullyQualifiedTableName());
+ }
+ }
+ return backupTables;
+ }
+
+ public Map<String, Set<String>> getTablesToImport() {
+ Map<String, Set<String>> importTables = new HashMap<String, Set<String>>();
+ for (TableElement table : tableDefinitions) {
+ if (table.isImportDataSet()) {
+ String importFrom = table.getImportFrom();
+ Set<String> tableSet;
+ if (importTables.containsKey(importFrom)) {
+ tableSet = importTables.get(importFrom);
+ } else {
+ tableSet = new TreeSet<String>();
+ }
+ tableSet.add(table.getFullyQualifiedTableName());
+ importTables.put(importFrom, tableSet);
+ }
+ }
+ return importTables;
+ }
+
+ public void addTableDefinition(TableElement table) {
+ tableDefinitions.add(table);
+ }
+
+ public String toString() {
+ String toReturn = "";
+ for (TableElement table : tableDefinitions) {
+ toReturn += table.toString();
+ }
+ return toReturn;
+ }
+
+ public Document getXmlDocument() throws ParserConfigurationException {
+ Document doc = Jaxp.newDocument();
+ Element root = doc.createElement(ROOT_TAG);
+ doc.appendChild(root);
+ for (TableElement table : tableDefinitions) {
+ root.appendChild(table.toXml(doc));
+ }
+ return doc;
+ }
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ private void sortTablesForConstraints() {
+ this.tableDefinitions = sortTablesForConstraints(this.tableDefinitions);
+ }
+
+ private boolean canCreate(TableElement table, Set<String> canCreate) {
+ Set<String> dependencies = table.getTableDependency();
+ if (canCreate.containsAll(dependencies)) {
+ return true;
+ }
+ return false;
+ }
+
+ private void markIdentityColumns() {
+ for (TableElement aTable : tableDefinitions) {
+ determineIdentityColumns(aTable);
+ }
+ }
+
+ private void determineIdentityColumns(TableElement tableDef) {
+ List<String> primaryKeys = new ArrayList<String>();
+
+ // first get all of the vars used for the primary key
+ List<ConstraintElement> constraints = tableDef.getConstraints();
+ for (ConstraintElement constraint : constraints) {
+ if (constraint.getConstraintType().equals(ConstraintTypes.PRIMARY_KEY)) {
+ List<String> columns = constraint.getColumns();
+ for (String column : columns) {
+ primaryKeys.add(column);
+ }
+ }
+ }
+
+ // now go through and remove any of the primary key vars that are foreign keys
+ List<ForeignKey> foreignKeys = tableDef.getForeignKeyConstraints();
+ for (ForeignKey fkConstraint : foreignKeys) {
+ List<String> columns = fkConstraint.getColumns();
+ for (String column : columns) {
+ primaryKeys.remove(column);
+ }
+ }
+
+ // now we should only be left with those primary keys that are identities.
+ // we set them by setting their corresponding identity column to true, a little hokey but that
+ // way we don't have to create special data structures for the column
+ Map<String, ColumnMetadata> columns = tableDef.getColumns();
+ Set<String> columnKeys = columns.keySet();
+ for (String key : columnKeys) {
+ ColumnMetadata column = columns.get(key);
+ if (primaryKeys.contains(column.getId())) {
+ column.addColumnField(ColumnFields.identity, Boolean.TRUE.toString());
+ }
+ }
+ }
+
+ private List<TableElement> sortTablesForConstraints(List<TableElement> tables) {
+ List<TableElement> sorted = new ArrayList<TableElement>();
+ Set<String> canCreate = new HashSet<String>();
+
+ Map<TableElement, Boolean> toSort = new HashMap<TableElement, Boolean>();
+
+ for (TableElement aTable : tables) {
+ if (aTable.hasForeignKey()) {
+ toSort.put(aTable, false);
+ } else {
+ sorted.add(aTable);
+ canCreate.add(aTable.getFullyQualifiedTableName());
+ }
+ }
+
+ // Prevent for endless loops caused by
+ // foreign/primary key discrepancies
+ int guard = toSort.size() * 2;
+ int count = 0;
+ while (toSort.containsValue(false) && (count < guard)) {
+ Set<TableElement> elements = toSort.keySet();
+
+ for (TableElement aTable : elements) {
+
+ if (!toSort.get(aTable)) {
+ if (canCreate(aTable, canCreate)) {
+ canCreate.add(aTable.getFullyQualifiedTableName());
+ sorted.add(aTable);
+ toSort.put(aTable, true);
+ }
+ }
+ }
+ count++;
+ }
+
+ // If we were stuck in an endless loop copy all unsortable tables
+ // to the end of the sorted array and return
+ if (toSort.containsValue(false)) {
+ Set<TableElement> elements = toSort.keySet();
+ for (TableElement aTable : elements) {
+ if (!toSort.get(aTable)) {
+ canCreate.add(aTable.getFullyQualifiedTableName());
+ sorted.add(aTable);
+ toSort.put(aTable, true);
+ }
+ }
+ }
+
+ return sorted;
+ }
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof SchemaData == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ SchemaData that = (SchemaData) otherObject;
+ return hasEqualState(that);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(37, 11).append(tableDefinitions).append(isSorted).append(schemaLookup).toHashCode();
+ }
+
+ public Map<String, TableElement> getTableMap() {
+ Map<String, TableElement> tableMap = new HashMap<String, TableElement>();
+ for (TableElement table : tableDefinitions) {
+ tableMap.put(table.getFullyQualifiedTableName(), table);
+ }
+ return tableMap;
+ }
+
+ public boolean hasEqualState(SchemaData that) {
+ EqualsBuilder equalsBuilder = new EqualsBuilder();
+ equalsBuilder.appendSuper(super.equals(that));
+
+ Map<String, TableElement> thisTableMap = this.getTableMap();
+ Map<String, TableElement> thatTableMap = that.getTableMap();
+
+ Set<String> thisKey1 = thisTableMap.keySet();
+ Set<String> thatKey2 = thatTableMap.keySet();
+
+ boolean toReturn = true;
+ if (thisKey1.equals(thatKey2)) {
+ for (String key : thisKey1) {
+ equalsBuilder.append(thisTableMap.get(key), thatTableMap.get(key));
+ }
+ toReturn &= equalsBuilder.isEquals();
+ } else {
+ toReturn = false;
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaDataLookup.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaDataLookup.java
new file mode 100644
index 00000000000..5c2ba88f1f9
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/SchemaDataLookup.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.database.data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SchemaDataLookup {
+
+ private SchemaData schemaData;
+
+ public SchemaDataLookup(SchemaData schemaData) {
+ this.schemaData = schemaData;
+ }
+
+ public ColumnMetadata getColumnDefinition(TableElement table, String columnId) {
+ Map<String, ColumnMetadata> columns = table.getColumns();
+ return getColumnDefinition(columns, columnId);
+ }
+
+ public static ColumnMetadata getColumnDefinition(Map<String, ColumnMetadata> columns, String columnId) {
+ if (columns.containsKey(columnId)) {
+ return columns.get(columnId);
+ }
+ return null;
+ }
+
+ public TableElement getTableDefinition(String tableName) {
+ List<TableElement> list = schemaData.getTablesOrderedByDependency();
+ for (TableElement table : list) {
+ return table;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/TableElement.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/TableElement.java
new file mode 100644
index 00000000000..c185c2870e0
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/data/TableElement.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.data;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TableElement implements Xmlizable {
+
+ public enum TableTags{
+ Table, ColumnInfo, Row;
+ }
+
+ public enum TableSections {
+ Column, Constraint, Index;
+ };
+
+ public enum TableDescriptionFields {
+ name, schema, backupData, importData, importFrom, tablespace;
+ };
+
+ public enum ColumnFields {
+ id, type, limits, identity, defaultValue;;
+ };
+
+ private Map<TableDescriptionFields, String> tableDescription;
+ private Map<String, ColumnMetadata> columns;
+ private List<ConstraintElement> constraints;
+ private List<ForeignKey> foreignKeys;
+ private List<IndexElement> indeces;
+
+ public TableElement() {
+ this.tableDescription = new HashMap<TableDescriptionFields, String>();
+ this.columns = new HashMap<String, ColumnMetadata>();
+ this.constraints = new ArrayList<ConstraintElement>();
+ this.foreignKeys = new ArrayList<ForeignKey>();
+ this.indeces = new ArrayList<IndexElement>();
+ }
+
+ public void addColumn(ColumnMetadata column) {
+ this.columns.put(column.getId(), column);
+ }
+
+ public void addConstraint(ConstraintElement constraint) {
+ if(constraint instanceof ForeignKey){
+ foreignKeys.add((ForeignKey)constraint);
+ } else {
+ constraints.add(constraint);
+ }
+ }
+
+ public void addIndexData(IndexElement indexData){
+ indeces.add(indexData);
+ }
+
+ public String getSchema() {
+ return this.tableDescription.get(TableDescriptionFields.schema);
+ }
+
+ public String getName() {
+ return this.tableDescription.get(TableDescriptionFields.name);
+ }
+
+ public boolean isBackupDataSet(){
+ if(this.tableDescription.containsKey(TableDescriptionFields.backupData)){
+ return Boolean.parseBoolean(this.tableDescription.get(TableDescriptionFields.backupData));
+ }
+ return false;
+ }
+
+ public boolean isImportDataSet(){
+ if(this.tableDescription.containsKey(TableDescriptionFields.importData)){
+ return Boolean.parseBoolean(this.tableDescription.get(TableDescriptionFields.importData));
+ }
+ return false;
+ }
+
+ public String getImportFrom(){
+ if(this.tableDescription.containsKey(TableDescriptionFields.importFrom)){
+ return this.tableDescription.get(TableDescriptionFields.importFrom);
+ }
+ return OseeClientProperties.getTableImportSource();
+ }
+
+ public void addTableDescription(TableDescriptionFields field, String value){
+ if(!field.equals(TableDescriptionFields.importFrom)){
+ value = value.toUpperCase();
+ }
+ value = value.trim();
+ this.tableDescription.put(field, value);
+ }
+
+ public Map<String, ColumnMetadata> getColumns(){
+ return this.columns;
+ }
+
+ public Map<TableDescriptionFields, String> getDescription(){
+ return this.tableDescription;
+ }
+
+ public boolean hasForeignKey(){
+ return foreignKeys.size() > 0;
+ }
+
+ public String getFullyQualifiedTableName(){
+ if(getSchema()==null)
+ return getName();
+ else
+ return getSchema() + "." + getName();
+ }
+
+ public List<ConstraintElement> getConstraints(){
+ return constraints;
+ }
+
+ public List<ForeignKey> getForeignKeyConstraints(){
+ return foreignKeys;
+ }
+
+ public List<IndexElement> getIndexData(){
+ return indeces;
+ }
+
+ public String toString(){
+ StringBuilder toReturn = new StringBuilder();
+ toReturn.append(" Table : \n");
+ Set<TableDescriptionFields> keys = tableDescription.keySet();
+ for(TableDescriptionFields key : keys){
+ toReturn.append(" \t" + key.toString() + ": " + tableDescription.get(key));
+ }
+ toReturn.append("\n");
+ int count = 0;
+ Set<String> columnKeys = columns.keySet();
+ for(String key : columnKeys){
+ toReturn.append("\t[" + ++count + "] " + columns.get(key).toString() + "\n");
+ }
+ count = 0;
+ for(ConstraintElement constraint : constraints){
+ toReturn.append("\t[" + ++count + "] " + constraint.toString() + "\n");
+ }
+ for(ForeignKey fkeys : foreignKeys){
+ toReturn.append("\t[" + ++count + "] " + fkeys.toString() + "\n");
+ }
+ count = 0;
+ for(IndexElement iData : indeces){
+ toReturn.append("\t[" + ++count + "] " + iData.toString() + "\n");
+ }
+ return toReturn.toString();
+ }
+
+ /**
+ * @param doc The XML document we're creating the XML for
+ * @return The XML Element corresponding to this
+ */
+ public Element toXml(Document doc) {
+ Element tableElement = doc.createElement(TableTags.Table.name());
+ for(TableDescriptionFields key : tableDescription.keySet()){
+ tableElement.setAttribute(key.toString(), tableDescription.get(key));
+ }
+ for(String key : columns.keySet()) {
+ tableElement.appendChild(columns.get(key).toXml(doc));
+ }
+ for(ConstraintElement constraint : constraints){
+ tableElement.appendChild(constraint.toXml(doc));
+ }
+ for(ForeignKey constraint : foreignKeys){
+ tableElement.appendChild(constraint.toXml(doc));
+ }
+ for(IndexElement iData : indeces){
+ tableElement.appendChild(iData.toXml(doc));
+ }
+ return tableElement;
+ }
+
+ public Set<String> getTableDependency(){
+ Set<String> dependency = new TreeSet<String>();
+ for(ForeignKey fk : foreignKeys){
+ Set<String> refTables = fk.getReferencedTables();
+ for(String tableName : refTables){
+ dependency.add(tableName);
+ }
+ }
+ return dependency;
+ }
+
+
+ @Override
+ public boolean equals(Object otherObject) {
+ if (otherObject instanceof TableElement == false) {
+ return false;
+ }
+ if (this == otherObject) {
+ return true;
+ }
+ TableElement that = (TableElement) otherObject;
+ return new EqualsBuilder().appendSuper(super.equals(otherObject))
+ .append(this.tableDescription, that.getDescription())
+ .append(this.columns, that.getColumns())
+ .append(this.constraints, that.getConstraints())
+ .append(this.foreignKeys, that.getForeignKeyConstraints())
+ .append(this.indeces, that.getIndexData())
+ .isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(79, 17).append(tableDescription).append(columns)
+ .append(constraints).append(foreignKeys).append(indeces).toHashCode();
+ }
+
+ public String getTablespace() {
+ String toReturn = getDescription().get(TableDescriptionFields.tablespace);
+ return Strings.isValid(toReturn) ? toReturn : "";
+ }
+
+ public void setTablespace(String value){
+ getDescription().put(TableDescriptionFields.tablespace, value);
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DatabaseInitializationOperation.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DatabaseInitializationOperation.java
new file mode 100644
index 00000000000..28274a787ef
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DatabaseInitializationOperation.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.initialize;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.BaseCredentialProvider;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.IDbInitializationRule;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.database.utility.GroupSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+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.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DatabaseInitializationOperation {
+ private static final String dbInitExtensionPointId = "org.eclipse.osee.framework.database.IDbInitializationTask";
+ private static BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
+
+ private final String preSelectedChoice;
+ private final boolean isPromptEnabled;
+
+ private DatabaseInitializationOperation(String preSelectedChoice, boolean isPromptEnabled) {
+ this.preSelectedChoice = preSelectedChoice;
+ this.isPromptEnabled = isPromptEnabled;
+ }
+
+ private boolean isPromptingAllowed() {
+ return isPromptEnabled;
+ }
+
+ private String getPreSelectedChoice() {
+ return preSelectedChoice;
+ }
+
+ private void execute() throws OseeCoreException {
+ boolean isConfigured = false;
+ if (checkPreconditions()) {
+ ClientSessionManager.authenticate(new BaseCredentialProvider() {
+ @Override
+ public OseeCredential getCredential() throws OseeCoreException {
+ OseeCredential credential = new OseeCredential();
+ credential.setUserName(SystemUser.BootStrap.getName());
+ return credential;
+ }
+ });
+ String dbName = ClientSessionManager.getDataStoreName();
+ String userName = ClientSessionManager.getDataStoreLoginName();
+
+ if (ClientSessionManager.isProductionDataStore()) {
+ System.err.println(String.format(
+ "You are not allowed to run config client against production: [%s].\nExiting.", dbName));
+ return;
+ }
+
+ String line = null;
+ if (isPromptEnabled) {
+ System.out.println("\nAre you sure you want to configure: " + dbName + ":" + userName);
+ line = waitForUserResponse();
+ } else {
+ line = "Y";
+ }
+ if (line.equalsIgnoreCase("Y")) {
+ isConfigured = true;
+ OseeLog.log(DatabaseActivator.class, Level.INFO, "Configuring Database...");
+ long startTime = System.currentTimeMillis();
+
+ try {
+ processTask();
+ } catch (Throwable ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex);
+ } finally {
+ System.out.println(String.format("Database Configurationg completed in [%s] ms",
+ Lib.getElapseString(startTime)));
+ }
+ }
+ }
+
+ if (isConfigured != true) {
+ System.out.println("Database will not be configured. ");
+ }
+ }
+
+ private void processTask() throws InvalidRegistryObjectException {
+ OseeLog.log(DatabaseInitializationOperation.class, Level.INFO, "Begin Database Initialization...");
+
+ for (String pointId : getDbInitTasks()) {
+ IExtension extension = Platform.getExtensionRegistry().getExtension(pointId);
+ if (extension == null) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, "Unable to locate extension [" + pointId + "]");
+ } else {
+ String extsionPointId = extension.getExtensionPointUniqueIdentifier();
+ if (dbInitExtensionPointId.equals(extsionPointId)) {
+ try {
+ runDbInitTasks(extension);
+ } catch (Throwable th) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, th);
+ }
+ } else {
+ OseeLog.log(DatabaseInitializationOperation.class, Level.SEVERE,
+ "Unknown extension id [" + extsionPointId + "] from extension [" + pointId + "]");
+ }
+ }
+ }
+ OseeLog.log(DatabaseActivator.class, Level.INFO, "Database Initialization Complete.");
+ }
+
+ /**
+ * Call to get DB initialization Tasks from choice made by User
+ *
+ * @return initialization task list
+ */
+ private List<String> getDbInitTasks() {
+ String selectedChoice = null;
+ GroupSelection selector = GroupSelection.getInstance();
+ List<String> choices = selector.getChoices();
+ if (choices.size() == 1) {
+ selectedChoice = choices.get(0);
+ } else {
+ int selection = -1;
+ if (Strings.isValid(getPreSelectedChoice())) {
+ selection = choices.indexOf(getPreSelectedChoice());
+ }
+ if (selection <= -1) {
+ selectedChoice = getInitChoiceFromUser("Select Init Group To Run.", choices);
+ } else {
+ selectedChoice = choices.get(selection);
+ }
+ }
+ OseeLog.log(DatabaseActivator.class, Level.INFO, String.format("DB Config Choice Selected: [%s]", selectedChoice));
+ return selector.getDbInitTasksByChoiceEntry(selectedChoice);
+ }
+
+ private static String getInitChoiceFromUser(String message, List<String> choices) {
+ int selection = -1;
+ BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
+ while (selection == -1) {
+ try {
+ System.out.println(message);
+ for (int i = 0; i < choices.size(); i++) {
+ System.out.println(" " + i + ") " + choices.get(i));
+ }
+ System.out.println("Enter: 0 - " + (choices.size() - 1));
+ String line = stdin.readLine();
+ selection = Integer.parseInt(line);
+ if (selection < 0 || selection >= choices.size()) {
+ System.out.println("Invalid selection: Index [" + selection + "] is out of range.");
+ selection = -1;
+ }
+ } catch (Exception ex) {
+ System.out.println("Invalid selection: Index [" + selection + "] is out of range.");
+ ex.printStackTrace();
+ }
+ }
+ return choices.get(selection);
+ }
+
+ /**
+ * @param skynetDbTypesExtensions
+ * @param extensionIds
+ * @throws OseeCoreException
+ * @throws ClassNotFoundException
+ * @throws IllegalAccessException
+ * @throws InstantiationException
+ */
+ private static void runDbInitTasks(IExtension extension) throws OseeCoreException, InstantiationException, IllegalAccessException, ClassNotFoundException {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ String initRuleClassName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("DatabaseTask")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ initRuleClassName = el.getAttribute("DbInitRule");
+ }
+ }
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ boolean isExecutionAllowed = true;
+ if (Strings.isValid(initRuleClassName)) {
+ isExecutionAllowed = false;
+ Class<?> taskClass = bundle.loadClass(initRuleClassName);
+ IDbInitializationRule rule = (IDbInitializationRule) taskClass.newInstance();
+ isExecutionAllowed = rule.isAllowed();
+ }
+
+ OseeLog.log(DatabaseActivator.class, isExecutionAllowed ? Level.INFO : Level.WARNING, String.format(
+ "%s [%s] execution rule [%s]", isExecutionAllowed ? "Starting" : "Skipping",
+ extension.getUniqueIdentifier(), Strings.isValid(initRuleClassName) ? initRuleClassName : "Default"));
+ if (isExecutionAllowed) {
+ IDbInitializationTask task = (IDbInitializationTask) bundle.loadClass(classname).newInstance();
+ task.run();
+ }
+ }
+ }
+
+ private String waitForUserResponse() {
+ System.out.println("Enter: [Y|N]\n");
+ String line = "N";
+
+ if (!isPromptingAllowed()) {
+ line = "Y";
+ } else {
+ try {
+ line = stdin.readLine();
+ } catch (IOException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex);
+ }
+ }
+ return line;
+ }
+
+ private boolean isApplicationServerAlive(String applicationServerUrl) {
+ boolean canConnection = false;
+ try {
+ URL url = new URL(applicationServerUrl);
+ URLConnection connection = url.openConnection();
+ connection.connect();
+ canConnection = true;
+ } catch (Exception ex) {
+
+ }
+ return canConnection;
+ }
+
+ private boolean checkPreconditions() throws OseeCoreException {
+ String serverUrl = OseeClientProperties.getOseeApplicationServer();
+ if (Strings.isValid(serverUrl) != true) {
+ throw new OseeDataStoreException(
+ String.format(
+ "Invalid resource server address [%s]. Database initialization requires an application server to be set by default. ",
+ serverUrl));
+ }
+
+ boolean serverOk = isApplicationServerAlive(serverUrl);
+ System.out.println(String.format("OSEE Application Server Validation [%s]", serverOk ? "PASSED" : "FAILED"));
+ if (serverOk != true) {
+ System.err.println(String.format(
+ "Error connecting to application server [%s].\n" + "Please ensure server is running and try again.",
+ serverUrl));
+ return false;
+ }
+
+ return true;
+ }
+
+ public static void executeWithoutPrompting(String choice) throws OseeCoreException {
+ new DatabaseInitializationOperation(choice, false).execute();
+ }
+
+ public static void executeWithPromptsAndChoice(String choice) throws OseeCoreException {
+ new DatabaseInitializationOperation(choice, false).execute();
+ }
+
+ public static void executeWithPrompts() throws OseeCoreException {
+ new DatabaseInitializationOperation(null, true).execute();
+ }
+
+ public static void executeConfigureFromJvmProperties() throws OseeCoreException {
+ boolean arePromptsAllowed = OseeClientProperties.promptOnDbInit();
+ String predefinedChoice = OseeClientProperties.getChoiceOnDbInit();
+ new DatabaseInitializationOperation(predefinedChoice, arePromptsAllowed).execute();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DbFactory.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DbFactory.java
new file mode 100644
index 00000000000..952a36966ac
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/DbFactory.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.framework.database.initialize;
+
+import java.util.List;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.sql.SqlFactory;
+import org.eclipse.osee.framework.database.sql.SqlManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbFactory {
+ private SchemaData schemaData;
+ protected SqlManager sqlManager = SqlFactory.getSqlManager();
+
+ public DbFactory(SchemaData schemaData) throws OseeDataStoreException {
+ this.schemaData = schemaData;
+ }
+
+ public void createTables() throws OseeDataStoreException {
+ List<TableElement> tableDefs = schemaData.getTablesOrderedByDependency();
+ for (TableElement tableDef : tableDefs) {
+ sqlManager.createTable(tableDef);
+ }
+ }
+
+ public void dropTables() throws OseeDataStoreException {
+ List<TableElement> tableDefs = schemaData.getTablesOrderedByDependency();
+ for (int index = (tableDefs.size() - 1); index >= 0; index--) {
+ TableElement tableDef = tableDefs.get(index);
+ sqlManager.dropTable(tableDef);
+ }
+ }
+
+ public void createIndeces() throws OseeDataStoreException {
+ for (TableElement tableDef : schemaData.getTableMap().values()) {
+ sqlManager.createIndex(tableDef);
+ }
+ }
+
+ public void dropIndeces() throws OseeDataStoreException {
+ for (TableElement tableDef : schemaData.getTableMap().values()) {
+ sqlManager.dropIndex(tableDef);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/ImportDataFromDbService.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/ImportDataFromDbService.java
new file mode 100644
index 00000000000..2e22b0fa219
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/ImportDataFromDbService.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.initialize.tasks;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.utility.DatabaseDataExtractor;
+import org.eclipse.osee.framework.database.utility.DatabaseSchemaExtractor;
+import org.eclipse.osee.framework.database.utility.FileUtility;
+import org.eclipse.osee.framework.db.connection.DatabaseInfoManager;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+public class ImportDataFromDbService implements IDbInitializationTask {
+ private final Map<String, SchemaData> userSpecifiedConfig;
+ private static final File backupDirectory = new File("BackupDirectory");
+
+ public ImportDataFromDbService(Map<String, SchemaData> userSpecifiedConfig) {
+ this.userSpecifiedConfig = userSpecifiedConfig;
+ }
+
+ public void run() throws OseeCoreException {
+ Set<String> importConnections = getImportConnections();
+ for (String importFromDbService : importConnections) {
+ System.out.println("Import Table Data from Db: " + importFromDbService);
+
+ IDatabaseInfo dbInfo = DatabaseInfoManager.getDataStoreById(importFromDbService);
+ System.out.println("Gathering information from ..." + importFromDbService);
+
+ String userName = dbInfo.getDatabaseLoginName();
+ if (userName != null && !userName.equals("")) {
+
+ Set<String> schemasToGet = new TreeSet<String>();
+ schemasToGet.add(userName.toUpperCase());
+
+ Map<String, Set<String>> dataToImport = getTablesToImport(userName.toUpperCase(), schemasToGet);
+ if (dataToImport.size() > 0) {
+ System.out.println(dataToImport.toString().replaceAll(", ", "\n"));
+ makeBackupDirectoryIfItDoesntExist();
+
+ System.out.println("Backing up Files to: " + backupDirectory.getAbsolutePath());
+ DatabaseDataExtractor dbDataExtractor = new DatabaseDataExtractor(schemasToGet, backupDirectory);
+
+ Set<String> tablesToImport;
+ if (importFromDbService.equals(determineDefaultConnection())) {
+ tablesToImport = dataToImport.get(OseeClientProperties.getTableImportSource());
+ } else {
+ tablesToImport = dataToImport.get(importFromDbService);
+ }
+
+ for (String importTable : tablesToImport) {
+ dbDataExtractor.addTableNameToExtract(importTable);
+ }
+ dbDataExtractor.extract();
+ dbDataExtractor.waitForWorkerThreads();
+
+ prepareFilesForImport();
+ }
+ }
+ }
+ }
+
+ private void prepareFilesForImport() {
+ Set<String> keys = userSpecifiedConfig.keySet();
+ if (keys.size() == 1) {
+ String userName = "";
+ for (String temp : keys) {
+ userName = temp;
+ }
+ List<File> files = FileUtility.getDBDataFileList(backupDirectory);
+ for (File fileName : files) {
+ String filename = fileName.getAbsolutePath().toString();
+ filename = filename.substring(filename.lastIndexOf(File.separator) + 1, filename.length());
+ filename = filename.substring(filename.indexOf(".") + 1, filename.length());
+ fileName.renameTo(new File(backupDirectory + File.separator + userName + "." + filename));
+ }
+ }
+ }
+
+ private String determineDefaultConnection() {
+ String importFromDbService = System.getProperty(OseeClientProperties.getTableImportSource());
+ if (!Strings.isValid(importFromDbService)) {
+ importFromDbService = "oracle";
+ }
+ return importFromDbService;
+ }
+
+ private Set<String> getImportConnections() {
+ String defaultConnection = determineDefaultConnection();
+ Set<String> userSchemas = userSpecifiedConfig.keySet();
+ Set<String> connectionsNeeded = new TreeSet<String>();
+ for (String key : userSchemas) {
+ SchemaData schemaDataInUserConfig = userSpecifiedConfig.get(key);
+ Map<String, Set<String>> tableNamesToImport = schemaDataInUserConfig.getTablesToImport();
+ Set<String> keys = tableNamesToImport.keySet();
+ for (String connectionString : keys) {
+ if (connectionString.equals(OseeClientProperties.getTableImportSource())) {
+ connectionsNeeded.add(defaultConnection);
+ } else {
+ connectionsNeeded.add(connectionString);
+ }
+ }
+ }
+ return connectionsNeeded;
+ }
+
+ public boolean canRun() {
+ return true;
+ }
+
+ private Map<String, SchemaData> getAvailableSchemasFromImportDb(Set<String> schemas) throws OseeDataStoreException {
+ DatabaseSchemaExtractor schemaExtractor = new DatabaseSchemaExtractor(schemas);
+ schemaExtractor.extractSchemaData();
+ return schemaExtractor.getSchemas();
+ }
+
+ private Map<String, Set<String>> getTablesToImport(String userName, Set<String> schemasToGet) throws OseeDataStoreException {
+ Map<String, SchemaData> currentDbSchemas = getAvailableSchemasFromImportDb(schemasToGet);
+ Set<String> userSchemas = userSpecifiedConfig.keySet();
+
+ SchemaData schemaData = currentDbSchemas.get(userName);
+ Map<String, TableElement> tableMap = schemaData.getTableMap();
+
+ Map<String, Set<String>> importTables = new HashMap<String, Set<String>>();
+ for (String key : userSchemas) {
+ SchemaData schemaDataInUserConfig = userSpecifiedConfig.get(key);
+ Map<String, Set<String>> tableNamesToImport = schemaDataInUserConfig.getTablesToImport();
+
+ Set<String> keys = tableNamesToImport.keySet();
+ for (String importKey : keys) {
+ Set<String> namesToImport = tableNamesToImport.get(importKey);
+
+ for (String tableName : namesToImport) {
+ tableName = tableName.replaceAll(key + "\\.", userName + ".");
+
+ if (tableMap.containsKey(tableName)) {
+ Set<String> tableSet;
+ if (importTables.containsKey(importKey)) {
+ tableSet = importTables.get(importKey);
+ } else {
+ tableSet = new TreeSet<String>();
+ }
+ tableSet.add(tableName);
+ importTables.put(importKey, tableSet);
+ }
+ }
+ }
+ }
+ return importTables;
+ }
+
+ private void makeBackupDirectoryIfItDoesntExist() {
+ if (backupDirectory != null && backupDirectory.exists() && backupDirectory.canWrite()) {
+ return;
+ } else {
+ backupDirectory.mkdirs();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#setDependancies(java.util.List)
+ */
+ public void setDependancies(List<String> bundles) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#getBundle()
+ */
+ public String getBundle() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#getDependancies()
+ */
+ public List<String> getDependancies() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#setBundle(java.lang.String)
+ */
+ public void setBundle(String bundle) {
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(IDbInitializationTask o) {
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Object o) {
+ return 0;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PostDatabaseInitialization.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PostDatabaseInitialization.java
new file mode 100644
index 00000000000..d77d95054df
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PostDatabaseInitialization.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.framework.database.initialize.tasks;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PostDatabaseInitialization implements IDbInitializationTask {
+
+ private static final String POSTGRESQL_VACUUM_AND_STATS = "VACUUM FULL VERBOSE ANALYZE";
+ private static final String ORACLE_GATHER_STATS =
+ "begin DBMS_STATS.GATHER_SCHEMA_STATS (ownname => '', estimate_percent => 99," + " granularity => 'ALL', degree => NULL , cascade => TRUE); end;";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#run(java.sql.Connection)
+ */
+ @Override
+ public void run() throws OseeCoreException {
+ OseeLog.log(PostDatabaseInitialization.class, Level.INFO, "Running Post-Initialization Process...");
+ SupportedDatabase supportedDb = SupportedDatabase.getDatabaseType();
+ switch (supportedDb) {
+ case postgresql:
+ OseeLog.log(PostDatabaseInitialization.class, Level.INFO, "Vacuuming PostgreSQL");
+ ConnectionHandler.runPreparedUpdate(POSTGRESQL_VACUUM_AND_STATS);
+ break;
+ case oracle:
+ OseeLog.log(PostDatabaseInitialization.class, Level.INFO, "Gathering Oracle Statistics");
+ ConnectionHandler.runPreparedUpdate(ORACLE_GATHER_STATS);
+ break;
+ default:
+ OseeLog.log(PostDatabaseInitialization.class, Level.INFO, "No - postdbinit process to run");
+ break;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PrintTables.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PrintTables.java
new file mode 100644
index 00000000000..22e233106e7
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/PrintTables.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.framework.database.initialize.tasks;
+
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+public class PrintTables implements IDbInitializationTask {
+
+ private Map<String, SchemaData> userConfig;
+
+ public PrintTables(Map<String, SchemaData> userConfig) {
+ super();
+ this.userConfig = userConfig;
+ }
+
+ public void run() throws OseeCoreException {
+ Set<String> keys = userConfig.keySet();
+ for (String key : keys) {
+ SchemaData schemaData = userConfig.get(key);
+ Set<String> tables = schemaData.getTableMap().keySet();
+ for (String tableName : tables) {
+ printTable(tableName);
+ }
+ }
+ }
+
+ private void printTable(String tableName) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery("select * from " + tableName);
+ int numberOfColumns = chStmt.getColumnCount();
+ String header = "\nTable:\t" + tableName + "\n";
+ header += "Columns:\t";
+ for (int index = 1; index <= numberOfColumns; index++) {
+ header += chStmt.getColumnName(index);
+ if (index + 1 <= numberOfColumns) {
+ header += ", ";
+ }
+ }
+ header += "\n";
+
+ System.out.print(header);
+
+ String results = "";
+ while (chStmt.next()) {
+ results = "Data:\t";
+ for (int index = 1; index <= numberOfColumns; index++) {
+ results += chStmt.getObject(index).toString();
+ if (index + 1 <= numberOfColumns) {
+ results += ", ";
+ }
+ }
+ results += "\n";
+ System.out.print(results);
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/BackupTableData.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/BackupTableData.java
new file mode 100644
index 00000000000..e3a6abc5c02
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/BackupTableData.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.framework.database.initialize.tasks.relational;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.utility.DatabaseDataExtractor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+public class BackupTableData implements IDbInitializationTask {
+ private Set<String> schemas;
+ private Map<String, SchemaData> userSpecifiedConfig;
+ private Map<String, SchemaData> currentDatabaseConfig;
+ private static final File backupDirectory = new File("BackupDirectory");
+
+ public BackupTableData(Set<String> schemas, Map<String, SchemaData> userSpecifiedConfig, Map<String, SchemaData> currentDatabaseConfig) {
+ this.schemas = schemas;
+ this.userSpecifiedConfig = userSpecifiedConfig;
+ this.currentDatabaseConfig = currentDatabaseConfig;
+ }
+
+ public void run() throws OseeCoreException {
+ System.out.println("BackupTableData: ");
+ Set<String> dataToBackup = getTablesToBackup();
+ if (dataToBackup.size() > 0) {
+ System.out.println(dataToBackup.toString().replaceAll(", ", "\n"));
+ clearBackupDirectory();
+ DatabaseDataExtractor dbDataExtractor = new DatabaseDataExtractor(schemas, backupDirectory);
+ Set<String> backupTables = dataToBackup;
+ for (String backupTable : backupTables) {
+ dbDataExtractor.addTableNameToExtract(backupTable);
+ }
+ dbDataExtractor.extract();
+ dbDataExtractor.waitForWorkerThreads();
+ }
+ }
+
+ public boolean canRun() {
+ return true;
+ }
+
+ private Set<String> getTablesToBackup() {
+ Set<String> backupTables = new TreeSet<String>();
+ Set<String> userSchemas = userSpecifiedConfig.keySet();
+ for (String key : userSchemas) {
+ // Backup data only if data exists in the current database
+ if (currentDatabaseConfig.containsKey(key)) {
+ SchemaData schemaDataInDb = currentDatabaseConfig.get(key);
+ Map<String, TableElement> currentDbTableMap = schemaDataInDb.getTableMap();
+ Set<String> currentDbTableNames = currentDbTableMap.keySet();
+
+ SchemaData schemaData = userSpecifiedConfig.get(key);
+ Set<String> tableNamesToBackup = schemaData.getTablesToBackup();
+ for (String tableName : tableNamesToBackup) {
+ // Check that table we want to backup exists in the database
+ // before we add it to the list
+ if (currentDbTableNames.contains(tableName)) {
+ backupTables.add(tableName);
+ } else {
+ System.out.println("Table doesn't exist in Db. Unable to backup [" + tableName + "]");
+ }
+ }
+ } else {
+ System.out.println("Schema doesn't exist in Db. Unable to backup tables from schema [" + key + "]");
+ }
+ }
+ return backupTables;
+ }
+
+ private void clearBackupDirectory() {
+ if (backupDirectory != null && backupDirectory.exists() && backupDirectory.canWrite()) {
+ File[] fileList = backupDirectory.listFiles();
+ for (File fileToDelete : fileList) {
+ fileToDelete.delete();
+ }
+ backupDirectory.delete();
+ backupDirectory.mkdirs();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#getBundle()
+ */
+ public String getBundle() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#getDependancies()
+ */
+ public List<String> getDependancies() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#setBundle(java.lang.String)
+ */
+ public void setBundle(String bundle) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#setDependancies(java.util.List)
+ */
+ public void setDependancies(List<String> bundles) {
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Object o) {
+ return 0;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/RestoreTableData.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/RestoreTableData.java
new file mode 100644
index 00000000000..858ee2cbf05
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/initialize/tasks/relational/RestoreTableData.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.initialize.tasks.relational;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.sql.SqlFactory;
+import org.eclipse.osee.framework.database.sql.SqlManager;
+import org.eclipse.osee.framework.database.utility.DatabaseDataImporter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+public class RestoreTableData implements IDbInitializationTask {
+ private Set<String> schemas;
+ private Map<String, SchemaData> userSpecifiedConfig;
+ private static final File backupDirectory = new File("backupDirectory");
+
+ public RestoreTableData(Set<String> schemas, Map<String, SchemaData> userSpecifiedConfig) {
+ this.schemas = schemas;
+ this.userSpecifiedConfig = userSpecifiedConfig;
+ }
+
+ public void run() throws OseeCoreException {
+ System.out.println("RestoreTables");
+ System.out.flush();
+ SqlManager sqlManager = SqlFactory.getSqlManager();
+
+ for (String schemaKey : schemas) {
+ if (userSpecifiedConfig.containsKey(schemaKey)) {
+ DatabaseDataImporter importer = new DatabaseDataImporter(backupDirectory, sqlManager);
+ SchemaData schemaData = userSpecifiedConfig.get(schemaKey);
+
+ setImportOrder(importer, schemaData);
+ setTablesToImport(importer, schemaData);
+ importer.setSchemaToImportTo(schemaKey);
+
+ importer.importDataIntoDatabase();
+ }
+ }
+
+ clearBackupDirectory();
+ }
+
+ private void setImportOrder(DatabaseDataImporter importer, SchemaData schemaData) {
+ List<String> importOrder = new ArrayList<String>();
+
+ List<TableElement> tables = schemaData.getTablesOrderedByDependency();
+ for (TableElement table : tables) {
+ importOrder.add(table.getFullyQualifiedTableName());
+ }
+ importer.setImportOrder(importOrder);
+ }
+
+ private void setTablesToImport(DatabaseDataImporter importer, SchemaData schemaData) {
+ importer.clearTableFilter();
+ Set<String> selectedTables = schemaData.getTablesToBackup();
+ for (String tableName : selectedTables) {
+ importer.addToTableFilter(tableName);
+ }
+ Map<String, Set<String>> importedTables = schemaData.getTablesToImport();
+ Set<String> keys = importedTables.keySet();
+ for (String key : keys) {
+ Set<String> tables = importedTables.get(key);
+ for (String tableName : tables) {
+ importer.addToTableFilter(tableName);
+ }
+ }
+ }
+
+ public boolean canRun() {
+ return true;
+ }
+
+ private void clearBackupDirectory() {
+ if (backupDirectory != null && backupDirectory.exists() && backupDirectory.canWrite()) {
+ File[] fileList = backupDirectory.listFiles();
+ for (File fileToDelete : fileList) {
+ fileToDelete.delete();
+ }
+ backupDirectory.delete();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#getBundle()
+ */
+ public String getBundle() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#getDependancies()
+ */
+ public List<String> getDependancies() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#setBundle(java.lang.String)
+ */
+ public void setBundle(String bundle) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#setDependancies(java.util.List)
+ */
+ public void setDependancies(List<String> bundles) {
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Object o) {
+ return 0;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/DerbySqlManager.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/DerbySqlManager.java
new file mode 100644
index 00000000000..2605a96de1b
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/DerbySqlManager.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.framework.database.sql;
+
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnDeleteEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnUpdateEnum;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.sql.datatype.SqlDataType;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DerbySqlManager extends SqlManagerImpl {
+
+ /**
+ * @param logger
+ * @param sqlDataType
+ */
+ public DerbySqlManager(SqlDataType sqlDataType) {
+ super(sqlDataType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.sql.SqlManager#constraintDataToSQL(org.eclipse.osee.framework.database.data.ConstraintElement, java.lang.String)
+ */
+ @Override
+ public String constraintDataToSQL(ConstraintElement constraint, String tableID) {
+ StringBuilder toReturn = new StringBuilder();
+ String id = formatQuotedString(constraint.getId(), "\\.");
+ String type = constraint.getConstraintType().toString();
+ String appliesTo = formatQuotedString(constraint.getCommaSeparatedColumnsList(), ",");
+
+ if (id != null && !id.equals("") && appliesTo != null && !appliesTo.equals("")) {
+ toReturn.append("CONSTRAINT " + id + " " + type + " (" + appliesTo + ")");
+
+ if (constraint instanceof ForeignKey) {
+ ForeignKey fk = (ForeignKey) constraint;
+ List<ReferenceClause> refs = fk.getReferences();
+
+ for (ReferenceClause ref : refs) {
+ String refTable = formatQuotedString(ref.getFullyQualifiedTableName(), "\\.");
+ String refColumns = formatQuotedString(ref.getCommaSeparatedColumnsList(), ",");
+
+ String onUpdate = "";
+ if (!ref.getOnUpdateAction().equals(OnUpdateEnum.UNSPECIFIED)) {
+ onUpdate = "ON UPDATE " + ref.getOnUpdateAction().toString();
+ }
+
+ String onDelete = "";
+ if (!ref.getOnDeleteAction().equals(OnDeleteEnum.UNSPECIFIED)) {
+ onDelete = "ON DELETE " + ref.getOnDeleteAction().toString();
+ }
+
+ if (refTable != null && refColumns != null && !refTable.equals("") && !refColumns.equals("")) {
+ toReturn.append(" REFERENCES " + refTable + " (" + refColumns + ")");
+ if (!onUpdate.equals("")) {
+ toReturn.append(" " + onUpdate);
+ }
+
+ if (!onDelete.equals("")) {
+ toReturn.append(" " + onDelete);
+ }
+
+ // Not Supported in Derby ?
+ // if (constraint.isDeferrable()) {
+ // toReturn.append(" DEFERRABLE");
+ // }
+ }
+
+ else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + fk.toString());
+ }
+
+ }
+ }
+ } else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + constraint.toString());
+ }
+ return toReturn.toString();
+ }
+
+ public String columnDataToSQL(Map<ColumnFields, String> column) {
+ StringBuilder toReturn = new StringBuilder();
+
+ String columnLimits = column.get(ColumnFields.limits);
+ String defaultValue = column.get(ColumnFields.defaultValue);
+
+ SQL3DataType dataType = SQL3DataType.valueOf(column.get(ColumnFields.type));
+ columnLimits = sqlDataType.getLimit(dataType, columnLimits);
+ toReturn.append("\"");
+ toReturn.append(column.get(ColumnFields.id));
+ toReturn.append("\"");
+ toReturn.append(" ");
+ toReturn.append(sqlDataType.getType(dataType));
+
+ if (columnLimits != null && !columnLimits.equals("")) {
+ toReturn.append(" (" + columnLimits + ")");
+ }
+ if (defaultValue != null && !defaultValue.equals("")) {
+ toReturn.append(" " + defaultValue);
+ }
+ return toReturn.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/MysqlSqlManager.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/MysqlSqlManager.java
new file mode 100644
index 00000000000..ceb357fc13f
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/MysqlSqlManager.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.sql;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnDeleteEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnUpdateEnum;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.sql.datatype.SqlDataType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MysqlSqlManager extends SqlManagerImpl {
+
+ /**
+ * @param sqlDataType
+ */
+ public MysqlSqlManager(SqlDataType sqlDataType) {
+ super(sqlDataType);
+ }
+
+ private String handleColumnCreationSection(OseeConnection connection, Map<String, ColumnMetadata> columns) {
+ List<String> lines = new ArrayList<String>();
+ Set<String> keys = columns.keySet();
+ for (String key : keys) {
+ Map<ColumnFields, String> column = columns.get(key).getColumnFields();
+ lines.add(columnDataToSQL(column));
+ }
+ String toExecute = StringFormat.listToValueSeparatedString(lines, ",\n");
+ return toExecute;
+ }
+
+ public void createTable(OseeConnection connection, TableElement tableDef) throws OseeDataStoreException {
+ String toExecute = "CREATE TABLE " + tableDef.getFullyQualifiedTableName() + " ( \n";
+ toExecute += handleColumnCreationSection(connection, tableDef.getColumns());
+ toExecute += handleConstraintCreationSection(tableDef.getConstraints(), tableDef.getFullyQualifiedTableName());
+ toExecute +=
+ handleConstraintCreationSection(tableDef.getForeignKeyConstraints(), tableDef.getFullyQualifiedTableName());
+ toExecute += " \n)\n";
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Creating Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(connection, toExecute);
+ }
+
+ @Override
+ public void dropTable(TableElement tableDef) throws OseeDataStoreException {
+ String toExecute = "DROP TABLE " + formatQuotedString(tableDef.getFullyQualifiedTableName(), "\\.");
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Dropping Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(toExecute);
+ }
+
+ protected String formatQuotedString(String value, String splitAt) {
+ String[] array = value.split(splitAt);
+ for (int index = 0; index < array.length; index++) {
+ array[index] = array[index];
+ }
+ // return value;
+ return StringFormat.separateWith(array, splitAt.replaceAll("\\\\", ""));
+ }
+
+ public void dropIndex(TableElement tableDef) throws OseeDataStoreException {
+ List<IndexElement> tableIndeces = tableDef.getIndexData();
+ String tableName = tableDef.getFullyQualifiedTableName();
+ for (IndexElement iData : tableIndeces) {
+ if (iData.ignoreMySql()) continue;
+ OseeLog.log(DatabaseActivator.class, Level.INFO, String.format("Dropping Index: [%s] FROM [%s]",
+ iData.getId(), tableName));
+ if (iData.getId().equals("PRIMARY")) {
+ ConnectionHandler.runPreparedUpdate("ALTER TABLE " + tableDef.getFullyQualifiedTableName() + " DROP PRIMARY KEY");
+ } else {
+ ConnectionHandler.runPreparedUpdate("ALTER TABLE " + tableDef.getFullyQualifiedTableName() + " DROP INDEX " + iData.getId());
+ }
+ }
+ }
+
+ public String constraintDataToSQL(ConstraintElement constraint, String tableID) {
+ StringBuilder toReturn = new StringBuilder();
+ String id = formatQuotedString(constraint.getId(), "\\.");
+ String type = constraint.getConstraintType().toString();
+ String appliesTo = formatQuotedString(constraint.getCommaSeparatedColumnsList(), ",");
+
+ if (id != null && !id.equals("") && appliesTo != null && !appliesTo.equals("")) {
+ toReturn.append("CONSTRAINT " + id + " " + type + " (" + appliesTo + ")");
+
+ if (constraint instanceof ForeignKey) {
+ ForeignKey fk = (ForeignKey) constraint;
+ List<ReferenceClause> refs = fk.getReferences();
+
+ for (ReferenceClause ref : refs) {
+ String refTable = formatQuotedString(ref.getFullyQualifiedTableName(), "\\.");
+ String refColumns = formatQuotedString(ref.getCommaSeparatedColumnsList(), ",");
+
+ String onUpdate = "";
+ if (!ref.getOnUpdateAction().equals(OnUpdateEnum.UNSPECIFIED)) {
+ onUpdate = "ON UPDATE " + ref.getOnUpdateAction().toString();
+ }
+
+ String onDelete = "";
+ if (!ref.getOnDeleteAction().equals(OnDeleteEnum.UNSPECIFIED)) {
+ onDelete = "ON DELETE " + ref.getOnDeleteAction().toString();
+ }
+
+ if (refTable != null && refColumns != null && !refTable.equals("") && !refColumns.equals("")) {
+ toReturn.append(" REFERENCES " + refTable + " (" + refColumns + ")");
+ if (!onUpdate.equals("")) {
+ toReturn.append(" " + onUpdate);
+ }
+
+ if (!onDelete.equals("")) {
+ toReturn.append(" " + onDelete);
+ }
+
+ // if (constraint.isDeferrable()) {
+ // toReturn.append(" DEFERRABLE");
+ // }
+ }
+
+ else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + fk.toString());
+ }
+
+ }
+ }
+ } else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + constraint.toString());
+ }
+ return toReturn.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/OracleSqlManager.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/OracleSqlManager.java
new file mode 100644
index 00000000000..a853edafaa4
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/OracleSqlManager.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.framework.database.sql;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.sql.datatype.SqlDataType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OracleSqlManager extends SqlManager {
+
+ public OracleSqlManager(SqlDataType sqlDataType) {
+ super(sqlDataType);
+ }
+
+ protected String handleColumnCreationSection(Map<String, ColumnMetadata> columns) {
+ List<String> lines = new ArrayList<String>();
+ Set<String> keys = columns.keySet();
+ for (String key : keys) {
+ Map<ColumnFields, String> column = columns.get(key).getColumnFields();
+ lines.add(columnDataToSQL(column));
+ }
+ String toExecute = StringFormat.listToValueSeparatedString(lines, ",\n");
+ return toExecute;
+ }
+
+ public void createTable(TableElement tableDef) throws OseeDataStoreException {
+ StringBuilder toExecute = new StringBuilder();
+ toExecute.append(SqlManager.CREATE_STRING + " TABLE " + formatQuotedString(tableDef.getFullyQualifiedTableName(),
+ "\\.") + " ( \n");
+ toExecute.append(handleColumnCreationSection(tableDef.getColumns()));
+ toExecute.append(handleConstraintCreationSection(tableDef.getConstraints(), tableDef.getFullyQualifiedTableName()));
+ toExecute.append(handleConstraintCreationSection(tableDef.getForeignKeyConstraints(),
+ tableDef.getFullyQualifiedTableName()));
+ toExecute.append(" \n)");
+ toExecute.append(" tablespace ");
+ toExecute.append(tableDef.getTablespace());
+ toExecute.append("\n");
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Creating Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(toExecute.toString());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.sql.SqlManager#createIndexPostProcess(java.lang.String)
+ */
+ @Override
+ protected String createIndexPostProcess(IndexElement indexElement, String original) {
+ StringBuilder buffer = new StringBuilder(original);
+ buffer.append(" tablespace ");
+ buffer.append(indexElement.getTablespace());
+ return buffer.toString();
+ }
+
+ @Override
+ public void dropTable(TableElement tableDef) throws OseeDataStoreException {
+ StringBuilder toExecute = new StringBuilder();
+ toExecute.append(SqlManager.DROP_STRING + " TABLE " + formatQuotedString(tableDef.getFullyQualifiedTableName(),
+ "\\.") + " cascade constraints purge");
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Dropping Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(toExecute.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/PostgreSqlManager.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/PostgreSqlManager.java
new file mode 100644
index 00000000000..e392f11aa1c
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/PostgreSqlManager.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.sql;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.AppliesToClause;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnDeleteEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnUpdateEnum;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.sql.datatype.SqlDataType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PostgreSqlManager extends SqlManagerImpl {
+ /**
+ * @param sqlDataType
+ */
+ public PostgreSqlManager(SqlDataType sqlDataType) {
+ super(sqlDataType);
+ }
+
+ private String handleColumnCreationSection(OseeConnection connection, Map<String, ColumnMetadata> columns) {
+ List<String> lines = new ArrayList<String>();
+ Set<String> keys = columns.keySet();
+ for (String key : keys) {
+ Map<ColumnFields, String> column = columns.get(key).getColumnFields();
+ lines.add(columnDataToSQL(column));
+ }
+ String toExecute = StringFormat.listToValueSeparatedString(lines, ",\n");
+ return toExecute;
+ }
+
+ public void createTable(OseeConnection connection, TableElement tableDef) throws OseeDataStoreException {
+ String toExecute = "CREATE TABLE " + tableDef.getFullyQualifiedTableName() + " ( \n";
+ toExecute += handleColumnCreationSection(connection, tableDef.getColumns());
+ toExecute += handleConstraintCreationSection(tableDef.getConstraints(), tableDef.getFullyQualifiedTableName());
+ toExecute +=
+ handleConstraintCreationSection(tableDef.getForeignKeyConstraints(), tableDef.getFullyQualifiedTableName());
+ toExecute += " \n)\n";
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Creating Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(connection, toExecute);
+ }
+
+ @Override
+ public void dropTable(TableElement tableDef) throws OseeDataStoreException {
+ String toExecute = "DROP TABLE " + formatQuotedString(tableDef.getFullyQualifiedTableName(), "\\.") + " CASCADE";
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Dropping Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(toExecute);
+ }
+
+ protected String formatQuotedString(String value, String splitAt) {
+ String[] array = value.split(splitAt);
+ for (int index = 0; index < array.length; index++) {
+ array[index] = array[index];
+ }
+ // return value;
+ return StringFormat.separateWith(array, splitAt.replaceAll("\\\\", ""));
+ }
+
+ public void dropIndex(OseeConnection connection, TableElement tableDef) throws OseeDataStoreException {
+ List<IndexElement> tableIndeces = tableDef.getIndexData();
+ String tableName = tableDef.getFullyQualifiedTableName();
+ for (IndexElement iData : tableIndeces) {
+ if (iData.ignoreMySql()) continue;
+ OseeLog.log(DatabaseActivator.class, Level.INFO, String.format("Dropping Index: [%s] FROM [%s]\n",
+ iData.getId(), tableName));
+ if (iData.getId().equals("PRIMARY")) {
+ ConnectionHandler.runPreparedUpdate(connection,
+ "ALTER TABLE " + tableDef.getFullyQualifiedTableName() + " DROP PRIMARY KEY");
+ } else {
+ ConnectionHandler.runPreparedUpdate(connection,
+ "ALTER TABLE " + tableDef.getFullyQualifiedTableName() + " DROP INDEX " + iData.getId());
+ }
+ }
+ }
+
+ public String constraintDataToSQL(ConstraintElement constraint, String tableID) {
+ StringBuilder toReturn = new StringBuilder();
+ String id = formatQuotedString(constraint.getId(), "\\.");
+ String type = constraint.getConstraintType().toString();
+ String appliesTo = formatQuotedString(constraint.getCommaSeparatedColumnsList(), ",");
+
+ if (id != null && !id.equals("") && appliesTo != null && !appliesTo.equals("")) {
+ toReturn.append("CONSTRAINT " + id + " " + type + " (" + appliesTo + ")");
+
+ if (constraint instanceof ForeignKey) {
+ ForeignKey fk = (ForeignKey) constraint;
+ List<ReferenceClause> refs = fk.getReferences();
+
+ for (ReferenceClause ref : refs) {
+ String refTable = formatQuotedString(ref.getFullyQualifiedTableName(), "\\.");
+ String refColumns = formatQuotedString(ref.getCommaSeparatedColumnsList(), ",");
+
+ String onUpdate = "";
+ if (!ref.getOnUpdateAction().equals(OnUpdateEnum.UNSPECIFIED)) {
+ onUpdate = "ON UPDATE " + ref.getOnUpdateAction().toString();
+ }
+
+ String onDelete = "";
+ if (!ref.getOnDeleteAction().equals(OnDeleteEnum.UNSPECIFIED)) {
+ onDelete = "ON DELETE " + ref.getOnDeleteAction().toString();
+ }
+
+ if (refTable != null && refColumns != null && !refTable.equals("") && !refColumns.equals("")) {
+ toReturn.append(" REFERENCES " + refTable + " (" + refColumns + ")");
+ if (!onUpdate.equals("")) {
+ toReturn.append(" " + onUpdate);
+ }
+
+ if (!onDelete.equals("")) {
+ toReturn.append(" " + onDelete);
+ }
+
+ if (constraint.isDeferrable()) {
+ toReturn.append(" DEFERRABLE");
+ }
+ }
+
+ else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + fk.toString());
+ }
+
+ }
+ }
+ } else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + constraint.toString());
+ }
+ return toReturn.toString();
+ }
+
+ public void createIndex(OseeConnection connection, TableElement tableDef) throws OseeDataStoreException {
+ List<IndexElement> tableIndeces = tableDef.getIndexData();
+ String indexId = null;
+ StringBuilder appliesTo = new StringBuilder();
+ String tableName = formatQuotedString(tableDef.getFullyQualifiedTableName(), "\\.");
+ for (IndexElement iData : tableIndeces) {
+ if (iData.ignoreMySql()) continue;
+ indexId = iData.getId();
+ appliesTo.delete(0, appliesTo.length());
+
+ List<AppliesToClause> appliesToList = iData.getAppliesToList();
+ for (int index = 0; index < appliesToList.size(); index++) {
+ AppliesToClause record = appliesToList.get(index);
+ appliesTo.append(record.getColumnName());
+
+ // switch (record.getOrderType()) {
+ // case Ascending:
+ // appliesTo.append(" ASC");
+ // break;
+ // case Descending:
+ // appliesTo.append(" DESC");
+ // break;
+ // default:
+ // break;
+ // }
+ if (index + 1 < appliesToList.size()) {
+ appliesTo.append(", ");
+ }
+ }
+ String toExecute =
+ String.format(CREATE_STRING + " " + iData.getIndexType() + " INDEX %s ON %s (%s)", indexId, tableName,
+ appliesTo);
+ OseeLog.log(DatabaseActivator.class, Level.INFO, toExecute);
+ ConnectionHandler.runPreparedUpdate(connection, toExecute);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlFactory.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlFactory.java
new file mode 100644
index 00000000000..75ae4e6f194
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlFactory.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.framework.database.sql;
+
+import org.eclipse.osee.framework.database.sql.datatype.DerbySqlDataType;
+import org.eclipse.osee.framework.database.sql.datatype.FoxProDataType;
+import org.eclipse.osee.framework.database.sql.datatype.MySqlDataType;
+import org.eclipse.osee.framework.database.sql.datatype.OracleSqlDataType;
+import org.eclipse.osee.framework.database.sql.datatype.PostgresqlDataType;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SqlFactory {
+
+ private SqlFactory() {
+ super();
+ }
+
+ public static SqlManager getSqlManager() throws OseeDataStoreException {
+ return getSqlManager(SupportedDatabase.getDatabaseType());
+ }
+
+ private static SqlManager getSqlManager(SupportedDatabase db) {
+ SqlManager instance = null;
+ switch (db) {
+ case oracle:
+ instance = new OracleSqlManager(new OracleSqlDataType());
+ break;
+ case derby:
+ instance = new DerbySqlManager(new DerbySqlDataType());
+ break;
+ case foxpro:
+ instance = new SqlManagerImpl(new FoxProDataType());
+ break;
+ case mysql:
+ instance = new MysqlSqlManager(new MySqlDataType());
+ break;
+ case postgresql:
+ instance = new PostgreSqlManager(new PostgresqlDataType());
+ break;
+ default:
+ instance = null;
+ break;
+ }
+ return instance;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManager.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManager.java
new file mode 100644
index 00000000000..64a2a0d453c
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManager.java
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.sql;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.AppliesToClause;
+import org.eclipse.osee.framework.database.data.ColumnDbData;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.SchemaDataLookup;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnDeleteEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnUpdateEnum;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.sql.datatype.SqlDataType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class SqlManager {
+ protected SqlDataType sqlDataType;
+ public static final String CREATE_STRING = "CREATE";
+ public static final String DROP_STRING = "DROP";
+
+ public SqlManager(SqlDataType sqlDataType) {
+ this.sqlDataType = sqlDataType;
+ }
+
+ public abstract void createTable(TableElement tableDef) throws OseeDataStoreException;
+
+ public abstract void dropTable(TableElement tableDef) throws OseeDataStoreException;
+
+ public void insertData(List<ColumnDbData> rowData, TableElement tableMetadata) throws OseeDataStoreException {
+ List<String> columnNames = new ArrayList<String>();
+ List<String> placeHolders = new ArrayList<String>();
+ List<String> columnValues = new ArrayList<String>();
+ List<SQL3DataType> columnTypes = new ArrayList<SQL3DataType>();
+
+ for (ColumnDbData dbData : rowData) {
+ String columnId = dbData.getColumnName();
+ String columnValue = dbData.getColumnValue();
+
+ ColumnMetadata columnMetadata = SchemaDataLookup.getColumnDefinition(tableMetadata.getColumns(), columnId);
+ SQL3DataType type = SQL3DataType.valueOf(columnMetadata.getColumnField(ColumnFields.type));
+
+ columnNames.add("\"" + columnId + "\"");
+ placeHolders.add("?");
+ columnValues.add(columnValue);
+ columnTypes.add(type);
+ }
+
+ String toExecute =
+ "INSERT INTO " + formatQuotedString(tableMetadata.getFullyQualifiedTableName(), "\\.") + " (\n";
+ toExecute += StringFormat.listToCommaSeparatedString(columnNames);
+ toExecute += "\n) VALUES (\n";
+ toExecute += StringFormat.listToCommaSeparatedString(placeHolders);
+ toExecute += ")\n";
+
+ Object[] data = new Object[columnNames.size()];
+ for (int index = 0; index < columnNames.size(); index++) {
+ data[index] = preparedStatementHelper(columnTypes.get(index), columnValues.get(index));
+ }
+ ConnectionHandler.runPreparedUpdate(toExecute, data);
+ }
+
+ public Object preparedStatementHelper(SQL3DataType columnType, String value) throws OseeDataStoreException {
+ switch (columnType) {
+ case BINARY:
+ case BIT:
+ return value != null && !value.equals("") ? Byte.parseByte(value) : 0;
+ case TINYINT:
+ case SMALLINT:
+ return value != null && !value.equals("") ? Short.valueOf(value) : 0;
+ case INTEGER:
+ return value != null && !value.equals("") ? Integer.valueOf(value) : 0;
+ case BIGINT:
+ return value != null && !value.equals("") ? BigDecimal.valueOf(Double.valueOf(value)) : new BigDecimal(0);
+ case FLOAT:
+ return value != null && !value.equals("") ? Float.valueOf(value) : 0.0f;
+ case NUMERIC:
+ case DECIMAL:
+ case REAL:
+ case DOUBLE:
+ return value != null && !value.equals("") ? Double.valueOf(value) : 0.0;
+ case CHAR:
+ case VARCHAR:
+ case LONGVARCHAR:
+ return value;
+ case DATE:
+ return value == null || value.equals("") ? SQL3DataType.DATE : Date.valueOf(value);
+ case TIMESTAMP:
+ return value != null && !value.equals("") ? Timestamp.valueOf(value) : GlobalTime.GreenwichMeanTimestamp();
+ case TIME:
+ return value == null || value.equals("") ? SQL3DataType.TIME : Time.valueOf(value);
+ case VARBINARY:
+ case LONGVARBINARY:
+ return value.getBytes();
+ case BLOB:
+ return new BufferedInputStream(new ByteArrayInputStream(value.getBytes()));
+ case CLOB:
+ return new BufferedInputStream(new ByteArrayInputStream(value.getBytes()));
+ case BOOLEAN:
+ return value == null || value.equals("") ? false : Boolean.parseBoolean(value);
+ default:
+ throw new OseeDataStoreException("unexpected column type: " + columnType);
+ }
+ }
+
+ public String getType(SQL3DataType dataType) {
+ return sqlDataType.getType(dataType);
+ }
+
+ public String columnDataToSQL(Map<ColumnFields, String> column) {
+ StringBuilder toReturn = new StringBuilder();
+
+ String columnLimits = column.get(ColumnFields.limits);
+ String defaultValue = column.get(ColumnFields.defaultValue);
+
+ SQL3DataType dataType = SQL3DataType.valueOf(column.get(ColumnFields.type));
+ columnLimits = sqlDataType.getLimit(dataType, columnLimits);
+ toReturn.append(column.get(ColumnFields.id));
+ toReturn.append(" ");
+ toReturn.append(sqlDataType.getType(dataType));
+
+ if (columnLimits != null && !columnLimits.equals("")) {
+ toReturn.append(" (" + columnLimits + ")");
+ }
+ if (defaultValue != null && !defaultValue.equals("")) {
+ toReturn.append(" " + defaultValue);
+ }
+ return toReturn.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected String handleConstraintCreationSection(List constraints, String tableId) {
+ List<String> constraintStatements = new ArrayList<String>();
+ for (Object object : constraints) {
+ ConstraintElement constraint = (ConstraintElement) object;
+ constraintStatements.add(constraintDataToSQL(constraint, tableId));
+ }
+ StringBuilder toExecute = new StringBuilder();
+ toExecute.append((constraintStatements.size() != 0 ? ",\n" : ""));
+ toExecute.append(StringFormat.listToValueSeparatedString(constraintStatements, ",\n"));
+ return toExecute.toString();
+ }
+
+ protected String formatQuotedString(String value, String splitAt) {
+ String[] array = value.split(splitAt);
+ for (int index = 0; index < array.length; index++) {
+ array[index] = "\"" + array[index] + "\"";
+ }
+ // return value;
+ return StringFormat.separateWith(array, splitAt.replaceAll("\\\\", ""));
+ }
+
+ public String constraintDataToSQL(ConstraintElement constraint, String tableID) {
+ StringBuilder toReturn = new StringBuilder();
+ String id = formatQuotedString(constraint.getId(), "\\.");
+ String type = constraint.getConstraintType().toString();
+ String appliesTo = formatQuotedString(constraint.getCommaSeparatedColumnsList(), ",");
+
+ if (id != null && !id.equals("") && appliesTo != null && !appliesTo.equals("")) {
+ toReturn.append("CONSTRAINT " + id + " " + type + " (" + appliesTo + ")");
+
+ if (constraint instanceof ForeignKey) {
+ ForeignKey fk = (ForeignKey) constraint;
+ List<ReferenceClause> refs = fk.getReferences();
+
+ for (ReferenceClause ref : refs) {
+ String refTable = formatQuotedString(ref.getFullyQualifiedTableName(), "\\.");
+ String refColumns = formatQuotedString(ref.getCommaSeparatedColumnsList(), ",");
+
+ String onUpdate = "";
+ if (!ref.getOnUpdateAction().equals(OnUpdateEnum.UNSPECIFIED)) {
+ onUpdate = "ON UPDATE " + ref.getOnUpdateAction().toString();
+ }
+
+ String onDelete = "";
+ if (!ref.getOnDeleteAction().equals(OnDeleteEnum.UNSPECIFIED)) {
+ onDelete = "ON DELETE " + ref.getOnDeleteAction().toString();
+ }
+
+ if (refTable != null && refColumns != null && !refTable.equals("") && !refColumns.equals("")) {
+ toReturn.append(" REFERENCES " + refTable + " (" + refColumns + ")");
+ if (!onUpdate.equals("")) {
+ toReturn.append(" " + onUpdate);
+ }
+
+ if (!onDelete.equals("")) {
+ toReturn.append(" " + onDelete);
+ }
+
+ if (constraint.isDeferrable()) {
+ toReturn.append(" DEFERRABLE");
+ }
+ }
+
+ else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + fk.toString());
+ }
+
+ }
+ }
+ } else {
+ OseeLog.log(DatabaseActivator.class, Level.WARNING,
+ "Skipping CONSTRAINT at Table: " + tableID + "\n\t " + constraint.toString());
+ }
+ return toReturn.toString();
+ }
+
+ public void createSchema(String schema) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(CREATE_STRING + " SCHEMA \"" + schema + "\"");
+ }
+
+ public void dropSchema(String schema) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(DROP_STRING + " SCHEMA \"" + schema + "\" CASCADE");
+ }
+
+ protected String insertDataToSQL(String fullyQualifiedTableName, List<String> columns, List<String> columnData) {
+ StringBuilder toExecute = new StringBuilder();
+ toExecute.append("INSERT INTO " + formatQuotedString(fullyQualifiedTableName, "\\.") + " (\n");
+ toExecute.append(StringFormat.listToCommaSeparatedString(columns));
+ toExecute.append("\n) VALUES (\n");
+ toExecute.append(StringFormat.listToCommaSeparatedString(columnData));
+ toExecute.append(")\n");
+ return toExecute.toString();
+ }
+
+ public void createIndex(TableElement tableDef) throws OseeDataStoreException {
+ List<IndexElement> tableIndeces = tableDef.getIndexData();
+ String indexId = null;
+ StringBuilder appliesTo = new StringBuilder();
+ String tableName = formatQuotedString(tableDef.getFullyQualifiedTableName(), "\\.");
+ for (IndexElement iData : tableIndeces) {
+ if (iData.ignoreMySql()) continue;
+ indexId = iData.getId();
+ appliesTo.delete(0, appliesTo.length());
+
+ List<AppliesToClause> appliesToList = iData.getAppliesToList();
+ for (int index = 0; index < appliesToList.size(); index++) {
+ AppliesToClause record = appliesToList.get(index);
+ appliesTo.append(record.getColumnName());
+
+ switch (record.getOrderType()) {
+ case Ascending:
+ appliesTo.append(" ASC");
+ break;
+ case Descending:
+ appliesTo.append(" DESC");
+ break;
+ default:
+ break;
+ }
+ if (index + 1 < appliesToList.size()) {
+ appliesTo.append(", ");
+ }
+ }
+ String toExecute =
+ String.format("%s %s INDEX %s ON %s (%s)", CREATE_STRING, iData.getIndexType(), indexId, tableName,
+ appliesTo);
+ toExecute = createIndexPostProcess(iData, toExecute);
+ OseeLog.log(DatabaseActivator.class, Level.INFO, toExecute + "\n");
+ ConnectionHandler.runPreparedUpdate(toExecute);
+ }
+ }
+
+ protected String createIndexPostProcess(IndexElement indexElement, String original) {
+ return original;
+ }
+
+ public void dropIndex(TableElement tableDef) throws OseeDataStoreException {
+ List<IndexElement> tableIndeces = tableDef.getIndexData();
+ String tableName = tableDef.getFullyQualifiedTableName();
+ for (IndexElement iData : tableIndeces) {
+ OseeLog.log(DatabaseActivator.class, Level.INFO, String.format("Dropping Index: [%s] FROM [%s]\n",
+ iData.getId(), tableName));
+ ConnectionHandler.runPreparedUpdate(DROP_STRING + " INDEX " + iData.getId());
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManagerImpl.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManagerImpl.java
new file mode 100644
index 00000000000..c25b0a07418
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/SqlManagerImpl.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.framework.database.sql;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.sql.datatype.SqlDataType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SqlManagerImpl extends SqlManager {
+
+ public SqlManagerImpl(SqlDataType sqlDataType) {
+ super(sqlDataType);
+ }
+
+ private String handleColumnCreationSection(Map<String, ColumnMetadata> columns) {
+ List<String> lines = new ArrayList<String>();
+ Set<String> keys = columns.keySet();
+ for (String key : keys) {
+ Map<ColumnFields, String> column = columns.get(key).getColumnFields();
+ lines.add(columnDataToSQL(column));
+ }
+ String toExecute = StringFormat.listToValueSeparatedString(lines, ",\n");
+ return toExecute;
+ }
+
+ public void createTable(TableElement tableDef) throws OseeDataStoreException {
+ StringBuilder toExecute = new StringBuilder();
+ toExecute.append(SqlManager.CREATE_STRING + " TABLE " + formatQuotedString(tableDef.getFullyQualifiedTableName(),
+ "\\.") + " ( \n");
+ toExecute.append(handleColumnCreationSection(tableDef.getColumns()));
+ toExecute.append(handleConstraintCreationSection(tableDef.getConstraints(), tableDef.getFullyQualifiedTableName()));
+ toExecute.append(handleConstraintCreationSection(tableDef.getForeignKeyConstraints(),
+ tableDef.getFullyQualifiedTableName()));
+ toExecute.append(" \n)\n");
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Creating Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(toExecute.toString());
+ }
+
+ @Override
+ public void dropTable(TableElement tableDef) throws OseeDataStoreException {
+ StringBuilder toExecute = new StringBuilder();
+ toExecute.append(SqlManager.DROP_STRING + " TABLE " + formatQuotedString(tableDef.getFullyQualifiedTableName(),
+ "\\."));
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Dropping Table: [ " + tableDef.getFullyQualifiedTableName() + "]");
+ ConnectionHandler.runPreparedUpdate(toExecute.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/DerbySqlDataType.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/DerbySqlDataType.java
new file mode 100644
index 00000000000..a043250da9f
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/DerbySqlDataType.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.framework.database.sql.datatype;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DerbySqlDataType extends SqlDataType {
+
+ public DerbySqlDataType() {
+ super();
+ }
+
+ public String getBooleanType() {
+ return "boolean";
+ }
+
+ public String getBitType() {
+ return "smallint";
+ }
+
+ public String getIntegerType() {
+ return "integer";
+ }
+
+ public String getDecimalType() {
+ return "decimal";
+ }
+
+ public String getFloatType() {
+ return "float";
+ }
+
+ public String getRealType() {
+ return "real";
+ }
+
+ public String getDoubleType() {
+ return getRealType();
+ }
+
+ public String getDateType() {
+ return "date";
+ }
+
+ public String getCharType() {
+ return "char";
+ }
+
+ public String getVarCharType() {
+ return "varchar";
+ }
+
+ @Override
+ public String getSmallIntType() {
+ return "smallint";
+ }
+
+ @Override
+ protected String getClobType() {
+ return "clob";
+ }
+
+ @Override
+ protected String getTimestamp() {
+ return "timestamp";
+ }
+
+ @Override
+ protected String getTime() {
+ return "time";
+ }
+
+ @Override
+ protected String getBlobType() {
+ return "blob";
+ }
+
+ @Override
+ protected String getBigInt() {
+ return "bigint";
+ }
+
+ @Override
+ protected String getLongVarCharType() {
+ return "long varchar";
+ }
+
+ @Override
+ protected String getNumericType() {
+ return "numeric";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/FoxProDataType.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/FoxProDataType.java
new file mode 100644
index 00000000000..06ead6d4156
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/FoxProDataType.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.framework.database.sql.datatype;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FoxProDataType extends SqlDataType {
+
+ public FoxProDataType() {
+ super();
+ }
+
+ public String getBooleanType() {
+ return "number";
+ }
+
+ public String getBitType() {
+ return "number";
+ }
+
+ public String getIntegerType() {
+ return "integer";
+ }
+
+ public String getDecimalType() {
+ return "number";
+ }
+
+ public String getFloatType() {
+ return "float";
+ }
+
+ public String getDoubleType() {
+ return "number";
+ }
+
+ public String getRealType() {
+ return "real";
+ }
+
+ public String getDateType() {
+ return "date";
+ }
+
+ public String getCharType() {
+ return "char";
+ }
+
+ public String getVarCharType() {
+ return "varchar";
+ }
+
+ @Override
+ public String getSmallIntType() {
+ return "smallint";
+ }
+
+ @Override
+ protected String getClobType() {
+ return "clob";
+ }
+
+ @Override
+ protected String getTimestamp() {
+ return "timestamp";
+ }
+
+ @Override
+ protected String getTime() {
+ return "time";
+ }
+
+ @Override
+ protected String getBlobType() {
+ return "blob";
+ }
+
+ @Override
+ protected String getBigInt() {
+ return "number";
+ }
+
+ @Override
+ protected String getLongVarCharType() {
+ return "long varchar";
+ }
+
+ @Override
+ protected String getNumericType() {
+ return "number";
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/MySqlDataType.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/MySqlDataType.java
new file mode 100644
index 00000000000..77327864b27
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/MySqlDataType.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.framework.database.sql.datatype;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MySqlDataType extends SqlDataType {
+
+ public MySqlDataType() {
+ super();
+ }
+
+ public String getBooleanType() {
+ return "boolean";
+ }
+
+ public String getBitType() {
+ return "smallint";
+ }
+
+ public String getIntegerType() {
+ return "integer";
+ }
+
+ public String getDecimalType() {
+ return "decimal";
+ }
+
+ public String getFloatType() {
+ return "float";
+ }
+
+ public String getRealType() {
+ return "real";
+ }
+
+ public String getDoubleType() {
+ return getRealType();
+ }
+
+ public String getDateType() {
+ return "date";
+ }
+
+ public String getCharType() {
+ return "char";
+ }
+
+ public String getVarCharType() {
+ return "varchar";
+ }
+
+ @Override
+ public String getSmallIntType() {
+ return "smallint";
+ }
+
+ @Override
+ protected String getClobType() {
+ return "blob";
+ }
+
+ @Override
+ protected String getTimestamp() {
+ return "timestamp";
+ }
+
+ @Override
+ protected String getTime() {
+ return "time";
+ }
+
+ @Override
+ protected String getBlobType() {
+ return "blob";
+ }
+
+ @Override
+ protected String getBigInt() {
+ return "bigint";
+ }
+
+ @Override
+ protected String getLongVarCharType() {
+ return "long varchar";
+ }
+
+ @Override
+ protected String getNumericType() {
+ return "numeric";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/OracleSqlDataType.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/OracleSqlDataType.java
new file mode 100644
index 00000000000..e403e6e53ad
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/OracleSqlDataType.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.framework.database.sql.datatype;
+
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OracleSqlDataType extends SqlDataType {
+
+ public OracleSqlDataType() {
+ super();
+ }
+
+ @Override
+ public String getLimit(SQL3DataType dataType, String limit) {
+ if (dataType == SQL3DataType.VARCHAR && limit != null && !limit.equals("")) {
+ return limit + " CHAR";
+ } else {
+ return super.getLimit(dataType, limit);
+ }
+ }
+
+ public String getBooleanType() {
+ return "number";
+ }
+
+ public String getBitType() {
+ return "number";
+ }
+
+ public String getIntegerType() {
+ return "integer";
+ }
+
+ public String getDecimalType() {
+ return "number";
+ }
+
+ public String getFloatType() {
+ return "float";
+ }
+
+ public String getRealType() {
+ return "real";
+ }
+
+ public String getDoubleType() {
+ return "number";
+ }
+
+ public String getDateType() {
+ return "date";
+ }
+
+ public String getCharType() {
+ return "char";
+ }
+
+ public String getVarCharType() {
+ return "varchar2";
+ }
+
+ @Override
+ public String getSmallIntType() {
+ return "smallint";
+ }
+
+ @Override
+ protected String getClobType() {
+ return "clob";
+ }
+
+ @Override
+ protected String getTimestamp() {
+ return "timestamp";
+ }
+
+ @Override
+ protected String getTime() {
+ return "time";
+ }
+
+ @Override
+ protected String getBlobType() {
+ return "blob";
+ }
+
+ @Override
+ protected String getBigInt() {
+ return "number";
+ }
+
+ @Override
+ protected String getLongVarCharType() {
+ return "varchar2";
+ }
+
+ @Override
+ protected String getNumericType() {
+ return "number";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/PostgresqlDataType.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/PostgresqlDataType.java
new file mode 100644
index 00000000000..73ce0fd9d1e
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/PostgresqlDataType.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.framework.database.sql.datatype;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PostgresqlDataType extends SqlDataType {
+
+ public PostgresqlDataType() {
+ super();
+ }
+
+ public String getBooleanType() {
+ return "bool";
+ }
+
+ public String getBitType() {
+ return "number";
+ }
+
+ public String getIntegerType() {
+ return "integer";
+ }
+
+ public String getDecimalType() {
+ return "decimal";
+ }
+
+ public String getFloatType() {
+ return "float";
+ }
+
+ public String getRealType() {
+ return "float8";
+ }
+
+ public String getDoubleType() {
+ return "numeric";
+ }
+
+ public String getDateType() {
+ return "date";
+ }
+
+ public String getCharType() {
+ return "char";
+ }
+
+ public String getVarCharType() {
+ return "varchar";
+ }
+
+ @Override
+ public String getSmallIntType() {
+ return "smallint";
+ }
+
+ @Override
+ protected String getClobType() {
+ return "text";
+ }
+
+ @Override
+ protected String getTimestamp() {
+ return "timestamp";
+ }
+
+ @Override
+ protected String getTime() {
+ return "time";
+ }
+
+ @Override
+ protected String getBlobType() {
+ return "bytea";
+ }
+
+ @Override
+ protected String getBigInt() {
+ return "numeric";
+ }
+
+ @Override
+ protected String getLongVarCharType() {
+ return "varchar";
+ }
+
+ @Override
+ protected String getNumericType() {
+ return "numeric";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/SqlDataType.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/SqlDataType.java
new file mode 100644
index 00000000000..35e17ce4a5e
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/sql/datatype/SqlDataType.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.sql.datatype;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class SqlDataType {
+
+ public SqlDataType() {
+ super();
+ }
+
+ protected abstract String getBooleanType();
+
+ protected abstract String getBitType();
+
+ protected abstract String getSmallIntType();
+
+ protected abstract String getIntegerType();
+
+ protected abstract String getDecimalType();
+
+ protected abstract String getFloatType();
+
+ protected abstract String getDoubleType();
+
+ protected abstract String getRealType();
+
+ protected abstract String getDateType();
+
+ protected abstract String getCharType();
+
+ protected abstract String getVarCharType();
+
+ protected abstract String getClobType();
+
+ protected abstract String getBlobType();
+
+ protected abstract String getTimestamp();
+
+ protected abstract String getTime();
+
+ protected abstract String getBigInt();
+
+ protected abstract String getLongVarCharType();
+
+ protected abstract String getNumericType();
+
+ public String getLimit(SQL3DataType dataType, String limit) {
+ return limit;
+ }
+
+ public String getType(SQL3DataType dataType) {
+ String toReturn = "";
+
+ switch (dataType) {
+ case BOOLEAN:
+ toReturn = this.getBooleanType();
+ break;
+ case BIT:
+ toReturn = this.getBitType();
+ break;
+ case SMALLINT:
+ toReturn = this.getSmallIntType();
+ break;
+ case INTEGER:
+ toReturn = this.getIntegerType();
+ break;
+ case REAL:
+ toReturn = this.getRealType();
+ break;
+ case DECIMAL:
+ toReturn = this.getDecimalType();
+ break;
+ case FLOAT:
+ toReturn = this.getFloatType();
+ break;
+ case DOUBLE:
+ toReturn = this.getDoubleType();
+ break;
+ case DATE:
+ toReturn = this.getDateType();
+ break;
+ case CHAR:
+ toReturn = this.getCharType();
+ break;
+ case VARCHAR:
+ toReturn = this.getVarCharType();
+ break;
+ case CLOB:
+ toReturn = this.getClobType();
+ break;
+ case TIMESTAMP:
+ toReturn = this.getTimestamp();
+ break;
+ case TIME:
+ toReturn = this.getTime();
+ break;
+ case BLOB:
+ toReturn = this.getBlobType();
+ break;
+ case BIGINT:
+ toReturn = this.getBigInt();
+ break;
+ case LONGVARCHAR:
+ toReturn = this.getLongVarCharType();
+ break;
+ case NUMERIC:
+ toReturn = this.getNumericType();
+ break;
+ default:
+ toReturn = "ADDTHISTYPE:" + dataType.name();
+ break;
+ }
+ return toReturn;
+ }
+
+ public String formatDataValueforDataType(String columnValue, SQL3DataType columnType) {
+ String toReturn = "";
+ switch (columnType) {
+ case BIGINT:
+ case BIT:
+ case BOOLEAN:
+ case DECIMAL:
+ case DOUBLE:
+ case FLOAT:
+ case INTEGER:
+ case REAL:
+ case NUMERIC:
+ case SMALLINT:
+ case TINYINT:
+ toReturn = ((columnValue != null && !columnValue.equals("")) ? columnValue : "0");
+ break;
+ case DATE:
+ toReturn = "{d '" + formatDate(columnValue) + "'}";
+ break;
+ case TIMESTAMP:
+ toReturn = "{ts '" + formatDate(columnValue) + "'}";
+ break;
+ case TIME:
+ toReturn = "{t '" + columnValue + "'}";
+ break;
+ default:
+ toReturn = "'" + columnValue + "'";
+ break;
+ }
+ return toReturn;
+ }
+
+ private String formatDate(String input) {
+ String[] sets = input.split(" ");
+ String date = sets[0];
+ String time = "";
+ if (sets.length > 1) {
+ time += " ";
+ for (int i = 1; i < sets.length; i++) {
+ time += sets[i];
+ }
+ }
+ if (!date.contains("/") && !date.contains("-") && !date.contains(":")) {
+ Pattern pattern = Pattern.compile("([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])");
+ Matcher matcher = pattern.matcher(date);
+
+ if (matcher.find()) {
+ if (matcher.groupCount() == 3) {
+ String year = matcher.group(1);
+ String month = matcher.group(2);
+ String day = matcher.group(3);
+
+ date = year + "-" + month + "-" + day;
+ }
+ }
+ } else {
+ date = date.replaceAll("/", "-");
+ date = date.replaceAll(":", "-");
+ }
+ return date + time;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseConfigurationData.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseConfigurationData.java
new file mode 100644
index 00000000000..f7e4c192db8
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseConfigurationData.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.framework.database.utility;
+
+import java.net.URL;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.database.config.SchemaConfigUtility;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.TableElement.TableDescriptionFields;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+public class DatabaseConfigurationData {
+
+ private List<URL> filesToProcess;
+
+ public DatabaseConfigurationData(List<URL> filesToProcess) {
+ this.filesToProcess = filesToProcess;
+ }
+
+ public List<URL> getUserSchemaFilesToProcess() {
+ return filesToProcess;
+ }
+
+ public Map<String, SchemaData> getUserSpecifiedSchemas() throws OseeCoreException {
+ Map<String, SchemaData> schemasFromUserFiles =
+ SchemaConfigUtility.getUserDefinedConfig(getUserSchemaFilesToProcess());
+ if (!useFileSpecifiedSchemas()) {
+ try {
+ DatabaseMetaData meta = ConnectionHandler.getMetaData();
+ if (meta != null) {
+ String userName = meta.getUserName();
+ if (userName != null && !userName.equals("")) {
+ int index = userName.indexOf('@');
+ if (index > 1) {
+ userName = userName.substring(0, index);
+ }
+ schemasFromUserFiles = useUserNameAsSchema(userName.toUpperCase(), schemasFromUserFiles);
+ }
+ }
+ } catch (SQLException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ String tableDataSpace = OseeClientProperties.getOseeTableDataSpaceForDbInit();
+ if (Strings.isValid(tableDataSpace)) {
+ updateTableDataSpace(tableDataSpace, schemasFromUserFiles);
+ }
+
+ String indexDataSpace = OseeClientProperties.getOseeIndexDataSpaceForDbInit();
+ if (Strings.isValid(indexDataSpace)) {
+ updateIndexDataSpace(indexDataSpace, schemasFromUserFiles);
+ }
+
+ return schemasFromUserFiles;
+ }
+
+ private boolean useFileSpecifiedSchemas() {
+ return OseeClientProperties.useSchemasSpecifiedInDbConfigFiles();
+ }
+
+ private void updateTableDataSpace(String tableDataSpace, Map<String, SchemaData> userSchemas) {
+ for (String key : userSchemas.keySet()) {
+ SchemaData schemaData = userSchemas.get(key);
+ for (TableElement table : schemaData.getTableMap().values()) {
+ table.setTablespace(tableDataSpace);
+ }
+ }
+ }
+
+ private void updateIndexDataSpace(String indexDataSpace, Map<String, SchemaData> userSchemas) {
+ for (String key : userSchemas.keySet()) {
+ SchemaData schemaData = userSchemas.get(key);
+ for (TableElement table : schemaData.getTableMap().values()) {
+ for (IndexElement indexElement : table.getIndexData()) {
+ indexElement.setTablespace(indexDataSpace);
+ }
+ }
+ }
+ }
+
+ private Map<String, SchemaData> useUserNameAsSchema(String userName, Map<String, SchemaData> userSchemas) {
+ Map<String, SchemaData> newData = new HashMap<String, SchemaData>();
+ SchemaData newSchemaData = new SchemaData();
+ Set<String> keys = userSchemas.keySet();
+ for (String key : keys) {
+ SchemaData schemaData = userSchemas.get(key);
+ List<TableElement> tables = schemaData.getTablesOrderedByDependency();
+ for (TableElement table : tables) {
+ TableElement newTable = useUserNameAsSchemaForTable(userName, table);
+ newSchemaData.addTableDefinition(newTable);
+ }
+ }
+ newData.put(userName, newSchemaData);
+ return newData;
+ }
+
+ private TableElement useUserNameAsSchemaForTable(String userName, TableElement table) {
+ TableElement newTable = new TableElement();
+
+ Map<TableDescriptionFields, String> tableDescription = table.getDescription();
+ Map<String, ColumnMetadata> columns = table.getColumns();
+ List<ConstraintElement> constraints = table.getConstraints();
+ List<ForeignKey> foreignKeys = table.getForeignKeyConstraints();
+ List<IndexElement> indexElements = table.getIndexData();
+
+ TableDescriptionFields[] descriptors = TableDescriptionFields.values();
+ for (TableDescriptionFields field : descriptors) {
+ String value = tableDescription.get(field);
+ if (field.equals(TableDescriptionFields.schema)) {
+ value = userName;
+ }
+ if (value != null && !value.equals("")) {
+ newTable.addTableDescription(field, value);
+ }
+ }
+
+ Set<String> columnKeys = columns.keySet();
+ for (String key : columnKeys) {
+ newTable.addColumn(columns.get(key));
+ }
+ for (ConstraintElement constraint : constraints) {
+ constraint.setSchema(userName);
+ newTable.addConstraint(constraint);
+ }
+ for (ForeignKey constraint : foreignKeys) {
+ constraint.setSchema(userName);
+ List<ReferenceClause> references = constraint.getReferences();
+ for (ReferenceClause clause : references) {
+ clause.setSchema(userName);
+ }
+ newTable.addConstraint(constraint);
+ }
+ for (IndexElement indexElement : indexElements) {
+ newTable.addIndexData(indexElement);
+ }
+ return newTable;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataExtractor.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataExtractor.java
new file mode 100644
index 00000000000..8d0bebcd813
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataExtractor.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.utility;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableDescriptionFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableTags;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.db.DbConfigFileInformation;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DatabaseDataExtractor {
+
+ private static final String SQL_WILD_QUERY = "SELECT * FROM ";
+ private DatabaseSchemaExtractor databaseInfo;
+ private Set<String> schemas;
+ private File directory;
+ private List<Thread> workerThreads;
+ private Set<String> extractTables;
+
+ private class ColumnInfo {
+ String name;
+ SQL3DataType type;
+ }
+
+ public DatabaseDataExtractor(Set<String> schemas, File directory) throws OseeDataStoreException {
+ this.schemas = schemas;
+ this.directory = directory;
+ this.workerThreads = new ArrayList<Thread>();
+ this.extractTables = new TreeSet<String>();
+ }
+
+ public void addTableNameToExtract(String fullyQualifiedTableName) {
+ this.extractTables.add(fullyQualifiedTableName);
+ }
+
+ public void clearFilter() {
+ this.extractTables.clear();
+ }
+
+ public void extract() throws OseeDataStoreException {
+ FileUtility.setupDirectoryForWrite(directory);
+ extractData();
+ }
+
+ private class DataExtractorThread extends Thread {
+ private TableElement table;
+
+ public DataExtractorThread(TableElement table) {
+ this.table = table;
+ setName(table.getName() + " Extractor");
+ }
+
+ public void run() {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ try {
+ chStmt.runPreparedQuery(SQL_WILD_QUERY + table.getFullyQualifiedTableName());
+ } catch (OseeDataStoreException ex) {
+ chStmt.runPreparedQuery(SQL_WILD_QUERY + table.getName());
+ }
+
+ Document document = buildXml(chStmt, table);
+ if (document != null) {
+ writeDocumentToFile(document, table.getFullyQualifiedTableName());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE,
+ "Error Processing Table [ " + table.getSchema() + "." + table.getName() + " ] Data ", ex);
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ public void waitForWorkerThreads() {
+ for (Thread worker : workerThreads) {
+ try {
+ worker.join();
+ } catch (InterruptedException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, "Thread [" + worker.getName() + "] was Interrupted. ",
+ ex);
+ }
+ }
+ }
+
+ private void extractData() throws OseeDataStoreException {
+ databaseInfo = new DatabaseSchemaExtractor(schemas);
+ databaseInfo.extractSchemaData();
+ Map<String, SchemaData> schemaDataMap = databaseInfo.getSchemas();
+ Set<String> schemaKeys = schemaDataMap.keySet();
+ for (String schema : schemaKeys) {
+ SchemaData schemaData = schemaDataMap.get(schema);
+
+ List<TableElement> tables = schemaData.getTablesOrderedByDependency();
+ for (TableElement table : tables) {
+
+ boolean extract = true;
+ // only extract items in filter since filter was set with data
+ if (this.extractTables != null && this.extractTables.size() > 0) {
+ extract = extractTables.contains(table.getFullyQualifiedTableName());
+ }
+
+ if (extract) {
+ DataExtractorThread workerThread = new DataExtractorThread(table);
+ workerThreads.add(workerThread);
+ workerThread.start();
+ }
+ }
+ }
+ }
+
+ private Document buildXml(ConnectionHandlerStatement chStmt, TableElement table) throws OseeDataStoreException {
+ ArrayList<ColumnInfo> columns = new ArrayList<ColumnInfo>();
+ int numberOfColumns = chStmt.getColumnCount();
+ for (int index = 1; index <= numberOfColumns; index++) {
+ ColumnInfo columnInfo = new ColumnInfo();
+ columnInfo.name = chStmt.getColumnName(index);
+ columnInfo.name = columnInfo.name.toUpperCase();
+
+ int dataType = chStmt.getColumnType(index);
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.foxpro)) {
+ if (dataType == Types.CHAR) {
+ dataType = Types.VARCHAR;
+ }
+ }
+ columnInfo.type = SQL3DataType.get(dataType);
+ columns.add(columnInfo);
+ }
+
+ Document xmlDoc = new DocumentImpl();
+ Element rootElement = xmlDoc.createElement(TableTags.Table.name());
+ xmlDoc.appendChild(rootElement);
+ rootElement.setAttribute(TableDescriptionFields.schema.name(), table.getSchema());
+ rootElement.setAttribute(TableDescriptionFields.name.name(), table.getName());
+
+ for (ColumnInfo info : columns) {
+ Element columnInfo = xmlDoc.createElement(TableTags.ColumnInfo.name());
+ rootElement.appendChild(columnInfo);
+ columnInfo.setAttribute(ColumnFields.id.name(), info.name);
+ columnInfo.setAttribute(ColumnFields.type.name(), info.type.name());
+ }
+
+ while (chStmt.next()) {
+ Element columnElement = xmlDoc.createElement(TableTags.Row.name());
+ for (ColumnInfo column : columns) {
+ String columnValue;
+ switch (column.type) {
+ case BIGINT:
+ BigDecimal bigD = chStmt.getBigDecimal(column.name);
+ columnValue = (bigD != null ? bigD.toString() : "");
+ break;
+ case DATE:
+ Date date = chStmt.getDate(column.name);
+ columnValue = (date != null ? date.toString() : "");
+ break;
+ case TIME:
+ Time time = chStmt.getTime(column.name);
+ columnValue = (time != null ? time.toString() : "");
+ break;
+ case TIMESTAMP:
+ Timestamp timestamp = chStmt.getTimestamp(column.name);
+ columnValue = (timestamp != null ? timestamp.toString() : "");
+ break;
+ default:
+ columnValue = chStmt.getString(column.name);
+ columnValue = handleSpecialCharacters(columnValue);
+ break;
+ }
+ columnElement.setAttribute(column.name, (columnValue != null ? columnValue : ""));
+ }
+ rootElement.appendChild(columnElement);
+ }
+ return xmlDoc;
+ }
+
+ private String handleSpecialCharacters(String value) {
+ // \0 An ASCII 0 (NUL) character.
+ // '' A single quote (�'�) character.
+ // \b A backspace character.
+ // \n A newline (linefeed) character.
+ // \r A carriage return character.
+ // \t A tab character.
+ // \Z ASCII 26 (Control-Z). See note following the table.
+
+ if (value != null) {
+
+ value = value.replaceAll("\0", "");
+ value = value.replaceAll("'", "''");
+ // value = value.replaceAll("\"", "\\\\\""); No need to do this.
+ Pattern pattern =
+ Pattern.compile("[^" + "a-zA-Z0-9" + "!@#$%\\^&*\\(\\)" + "+ _.-=" + "\'\"<>{}\\[\\]|:;,\n\r\t\b?/`~\\\\]+");
+ Matcher matcher = pattern.matcher(value);
+
+ while (matcher.find()) {
+ // System.out.println("Matcher: [" + matcher.group() + "]");
+ value = value.replace(matcher.group(), "");
+ }
+ }
+ return value;
+ }
+
+ private void writeDocumentToFile(Document doc, String tableName) throws IOException {
+ String fileString = directory + File.separator + tableName + DbConfigFileInformation.getDbDataFileExtension();
+ OutputFormat outputFormat;
+ OutputStreamWriter out = null;
+ try {
+ OutputStream bout = new BufferedOutputStream(new FileOutputStream(fileString));
+ out = new OutputStreamWriter(bout);
+
+ outputFormat = new OutputFormat("XML", "UTF-8", true);
+ XMLSerializer xmlSerializer = new XMLSerializer(out, outputFormat);
+ xmlSerializer.serialize(doc.getDocumentElement());
+ } catch (FileNotFoundException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, "File error [" + fileString + "] ", ex);
+ } catch (IOException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, "Error writing to File [" + fileString + "] ", ex);
+ } finally {
+ out.flush();
+ out.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataImporter.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataImporter.java
new file mode 100644
index 00000000000..b8e2d2fa952
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseDataImporter.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.utility;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.ColumnDbData;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableDescriptionFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableTags;
+import org.eclipse.osee.framework.database.sql.SqlManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.db.DbConfigFileInformation;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DatabaseDataImporter {
+ private File directory;
+ private SqlManager sqlManager;
+ private List<String> tableOrder;
+ private String schemaToImportTo;
+ private Set<String> tableFilter;
+
+ private class TableData extends TableElement {
+ private List<List<ColumnDbData>> rowData;
+
+ public TableData() {
+ rowData = new ArrayList<List<ColumnDbData>>();
+ }
+
+ public void addRow(List<ColumnDbData> row) {
+ rowData.add(row);
+ }
+
+ public List<List<ColumnDbData>> getRows() {
+ return rowData;
+ }
+ }
+
+ public DatabaseDataImporter(File directory, SqlManager sqlManager) {
+ this.directory = directory;
+ this.sqlManager = sqlManager;
+ this.tableFilter = new TreeSet<String>();
+ }
+
+ public void setImportOrder(List<String> tableOrder) {
+ this.tableOrder = tableOrder;
+ }
+
+ public void setSchemaToImportTo(String schema) {
+ this.schemaToImportTo = schema;
+ }
+
+ public void addToTableFilter(String fullyQualifiedTableName) {
+ this.tableFilter.add(fullyQualifiedTableName);
+ }
+
+ public void clearTableFilter() {
+ this.tableFilter.clear();
+ }
+
+ public List<File> orderFilesByImportOrder(Map<String, File> toOrder) {
+ List<File> orderedSet = new ArrayList<File>();
+ if (tableOrder != null && tableOrder.size() != 0) {
+ for (String tableName : tableOrder) {
+ if (toOrder.containsKey(tableName + DbConfigFileInformation.getDbDataFileExtension())) {
+ orderedSet.add(toOrder.get(tableName + DbConfigFileInformation.getDbDataFileExtension()));
+ }
+ }
+ } else {
+ Set<String> keys = toOrder.keySet();
+ for (String key : keys) {
+ orderedSet.add(toOrder.get(key));
+ }
+ }
+ return orderedSet;
+ }
+
+ public Map<String, File> filterDataToImport(Map<String, File> toProcess) {
+ Map<String, File> filteredList = new HashMap<String, File>();
+ if (tableFilter != null && tableFilter.size() != 0) {
+ for (String tableName : tableFilter) {
+ if (toProcess.containsKey(tableName + DbConfigFileInformation.getDbDataFileExtension())) {
+ filteredList.put(tableName + DbConfigFileInformation.getDbDataFileExtension(),
+ toProcess.get(tableName + DbConfigFileInformation.getDbDataFileExtension()));
+ }
+ }
+ } else {
+ return toProcess;
+ }
+ return filteredList;
+ }
+
+ public void importDataIntoDatabase() {
+ if (FileUtility.isValidDirectory(directory)) {
+ Map<String, File> filesToProcess = getFilesToProcess();
+ Map<String, File> filteredFiles = filterDataToImport(filesToProcess);
+ List<File> files = orderFilesByImportOrder(filteredFiles);
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder;
+ Document document;
+ for (File file : files) {
+ try {
+ builder = factory.newDocumentBuilder();
+ document = builder.parse(file);
+ processData(parseXMLDbDataFile(document));
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, "Unable to Parse File. ", ex);
+ } catch (Exception ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, "Exception: \n", ex);
+ }
+ }
+ }
+ }
+
+ private Map<String, File> getFilesToProcess() {
+ Map<String, File> toReturn = new HashMap<String, File>();
+ List<File> files = FileUtility.getDBDataFileList(directory);
+ for (File fileName : files) {
+ toReturn.put(fileName.getName(), new File(directory + File.separator + fileName.getName()));
+ }
+ return toReturn;
+ }
+
+ private void processData(List<TableData> tables) throws OseeDataStoreException {
+ if (tables.size() != 0) {
+ for (TableData tableData : tables) {
+ OseeLog.log(DatabaseActivator.class, Level.INFO,
+ "Populating: [ " + tableData.getFullyQualifiedTableName() + "]\n");
+ List<List<ColumnDbData>> rows = tableData.getRows();
+ if (!rows.isEmpty()) {
+ for (List<ColumnDbData> rowData : rows) {
+ sqlManager.insertData(rowData, tableData);
+ }
+ }
+ }
+ }
+ }
+
+ private void parseColumnMetadata(Element tableElement, TableData tableData) {
+ NodeList columnElements = tableElement.getElementsByTagName(TableTags.ColumnInfo.name());
+ if (columnElements != null) {
+ for (int index = 0; index < columnElements.getLength(); index++) {
+ Element columnElement = (Element) columnElements.item(index);
+ if (columnElement != null) {
+
+ NamedNodeMap attributeMap = columnElement.getAttributes();
+ if (attributeMap != null && attributeMap.getLength() != 0) {
+ ColumnMetadata columnMetaData = new ColumnMetadata("");
+ for (int attributeIndex = 0; attributeIndex < attributeMap.getLength(); attributeIndex++) {
+ Node node = attributeMap.item(attributeIndex);
+ String nodeName = node.getNodeName();
+ String nodeValue = node.getTextContent();
+ if (nodeName != null && !nodeName.equals("")) {
+ columnMetaData.addColumnField(ColumnFields.valueOf(nodeName),
+ (nodeValue != null ? nodeValue : ""));
+ }
+ }
+ tableData.addColumn(columnMetaData);
+ }
+ }
+ }
+ }
+ }
+
+ private void parseRowInformation(Element tableElement, TableData tableData) {
+ NodeList rowElements = tableElement.getElementsByTagName(TableTags.Row.name());
+ if (rowElements != null) {
+ for (int rowIndex = 0; rowIndex < rowElements.getLength(); rowIndex++) {
+ Element row = (Element) rowElements.item(rowIndex);
+ if (row != null) {
+ NamedNodeMap attributeMap = row.getAttributes();
+ if (attributeMap != null && attributeMap.getLength() != 0) {
+ List<ColumnDbData> rowData = new ArrayList<ColumnDbData>();
+ tableData.addRow(rowData);
+ for (int attributeIndex = 0; attributeIndex < attributeMap.getLength(); attributeIndex++) {
+ Node node = attributeMap.item(attributeIndex);
+ String nodeName = node.getNodeName();
+ String nodeValue = node.getTextContent();
+ if (nodeName != null && !nodeName.equals("")) {
+ rowData.add(new ColumnDbData(nodeName, (nodeValue != null ? nodeValue : "")));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private List<TableData> parseXMLDbDataFile(Document document) {
+ NodeList tableElements = document.getElementsByTagName(TableTags.Table.name());
+ List<TableData> tables = new ArrayList<TableData>();
+ for (int index = 0; index < tableElements.getLength(); index++) {
+ Element tableXmlElement = (Element) tableElements.item(index);
+ if (tableXmlElement != null) {
+ NamedNodeMap map = tableXmlElement.getAttributes();
+ if (map != null && map.getLength() != 0) {
+ Node tableName = map.getNamedItem(TableDescriptionFields.name.name());
+ Node tableAddress = map.getNamedItem(TableDescriptionFields.schema.name());
+ String tableNameString = "";
+ String tableAddressString = "";
+ if (tableName != null) {
+ tableNameString = tableName.getTextContent();
+ }
+ if (tableAddress != null) {
+ tableAddressString = tableAddress.getTextContent();
+ }
+
+ if (tableNameString != null && !tableNameString.equals("") && tableAddressString != null && !tableAddressString.equals("")) {
+ TableData tableData = new TableData();
+ tableData.addTableDescription(TableDescriptionFields.name, tableNameString);
+ if (this.schemaToImportTo != null && !this.schemaToImportTo.equals("")) {
+ tableData.addTableDescription(TableDescriptionFields.schema, schemaToImportTo);
+ } else {
+ tableData.addTableDescription(TableDescriptionFields.schema, tableAddressString);
+ }
+ parseRowInformation(tableXmlElement, tableData);
+ parseColumnMetadata(tableXmlElement, tableData);
+ tables.add(tableData);
+ }
+ }
+ }
+ }
+ return tables;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseSchemaExtractor.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseSchemaExtractor.java
new file mode 100644
index 00000000000..add010b88d4
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DatabaseSchemaExtractor.java
@@ -0,0 +1,500 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.utility;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.database.data.AppliesToClause;
+import org.eclipse.osee.framework.database.data.ColumnMetadata;
+import org.eclipse.osee.framework.database.data.ConstraintElement;
+import org.eclipse.osee.framework.database.data.ConstraintFactory;
+import org.eclipse.osee.framework.database.data.ConstraintTypes;
+import org.eclipse.osee.framework.database.data.ForeignKey;
+import org.eclipse.osee.framework.database.data.IndexElement;
+import org.eclipse.osee.framework.database.data.ReferenceClause;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.data.AppliesToClause.OrderType;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnDeleteEnum;
+import org.eclipse.osee.framework.database.data.ReferenceClause.OnUpdateEnum;
+import org.eclipse.osee.framework.database.data.TableElement.ColumnFields;
+import org.eclipse.osee.framework.database.data.TableElement.TableDescriptionFields;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.db.DbConfigFileInformation;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DatabaseSchemaExtractor {
+
+ private DatabaseMetaData dbData;
+ private String dbName;
+ private String dbVersion;
+ private Map<String, SchemaData> database;
+ private List<String> filter;
+ private Set<String> tablesToExtract;
+ private Set<String> schemas;
+
+ private static final String DEFAULT_FILTER = "BIN.*";
+
+ public DatabaseSchemaExtractor(Set<String> schemas) throws OseeDataStoreException {
+ try {
+ this.dbData = ConnectionHandler.getMetaData();
+ this.dbName = dbData.getDatabaseProductName();
+ this.dbVersion = dbData.getDatabaseProductVersion();
+ this.filter = new ArrayList<String>();
+ filter.add(DEFAULT_FILTER);
+ this.tablesToExtract = new TreeSet<String>();
+ this.schemas = schemas;
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public void addToFilter(String value) {
+ filter.add(value);
+ }
+
+ public String getDBName() {
+ return dbName;
+ }
+
+ public String getDBVersion() {
+ return dbVersion;
+ }
+
+ public Map<String, SchemaData> getSchemas() {
+ return database;
+ }
+
+ public void extractSchemaData() throws OseeDataStoreException {
+ database = new HashMap<String, SchemaData>();
+ for (String schema : schemas) {
+ SchemaData dbTables = getTableInformation(schema);
+ database.put(schema, dbTables);
+ }
+ }
+
+ public Set<String> getAllSchemas() throws SQLException {
+ ResultSet schemaResults = dbData.getSchemas();
+ Set<String> schemaSet = new TreeSet<String>();
+
+ while (schemaResults.next()) {
+ String schema = schemaResults.getString("TABLE_SCHEM");
+ if (schema != null && !schema.equals("")) {
+ schemaSet.add(schema);
+ }
+ }
+ schemaResults.close();
+ return schemaSet;
+ }
+
+ /**
+ * Writes the XML files in the directory specified.
+ *
+ * @param directory The directory tow write the XML files.
+ * @throws IOException
+ */
+ public void writeToFile(File directory) throws IOException {
+ FileUtility.setupDirectoryForWrite(directory);
+ Set<String> keys = database.keySet();
+ for (String schema : keys) {
+ SchemaData tableData = database.get(schema);
+ File xmlFile =
+ new File(
+ directory.getAbsolutePath() + File.separator + schema + DbConfigFileInformation.getSchemaFileExtension());
+ try {
+ Jaxp.writeXmlDocument(tableData.getXmlDocument(), xmlFile);
+ } catch (TransformerException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex.toString(), ex);
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ }
+
+ public String toString() {
+ String toReturn = "Name: " + dbName + "\tVer: " + dbVersion + "\n";
+ Set<String> keys = database.keySet();
+ for (String schema : keys) {
+ SchemaData tableData = database.get(schema);
+ toReturn += " Schema: \n" + schema + "\n" + tableData.toString();
+ }
+ return toReturn;
+ }
+
+ private boolean isFiltered(String value) {
+ for (String filterExpression : filter) {
+ Pattern searchPattern = Pattern.compile(filterExpression, Pattern.DOTALL);
+ Matcher matcher = searchPattern.matcher(value);
+ if (matcher.find()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void addTableToExtract(String fullyqualifiedTableName) {
+ this.tablesToExtract.add(fullyqualifiedTableName);
+ }
+
+ public void clearTableFilter() {
+ tablesToExtract.clear();
+ }
+
+ private SchemaData getTableInformation(String schemaPattern) throws OseeDataStoreException {
+ try {
+ SchemaData dbTables = new SchemaData();
+ ResultSet tables = null;
+ tables = dbData.getTables(null, null, null, new String[] {"TABLE"});
+
+ while (tables.next()) {
+ String tableName = tables.getString("TABLE_NAME").toUpperCase();
+ String schemaName = tables.getString("TABLE_SCHEM");
+ if (tableName != null && !isFiltered(tableName) && schemaName.equalsIgnoreCase(schemaPattern)) {
+ boolean extract = true;
+ if (this.tablesToExtract != null && this.tablesToExtract.size() > 0) {
+ extract = tablesToExtract.contains(schemaPattern + "." + tableName);
+ }
+
+ if (extract) {
+ TableElement tableEntry = new TableElement();
+ tableEntry.addTableDescription(TableDescriptionFields.name, tableName);
+ tableEntry.addTableDescription(TableDescriptionFields.schema, schemaName);
+ getColumnInformation(tableEntry);
+ getColumnPrimaryKey(tableEntry);
+
+ if (!(SupportedDatabase.isDatabaseType(SupportedDatabase.foxpro) || SupportedDatabase.isDatabaseType(SupportedDatabase.postgresql))) {
+ getColumnForeignKey(tableEntry);
+ }
+ getIndexInfo(tableEntry);
+ dbTables.addTableDefinition(tableEntry);
+ }
+ }
+ }
+ tables.close();
+ return dbTables;
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ private void getColumnInformation(TableElement aTable) throws SQLException, OseeDataStoreException {
+ ResultSet columns = null;
+ try {
+ columns = dbData.getColumns(null, aTable.getSchema(), aTable.getName(), null);
+ } catch (SQLException ex) {
+ columns = dbData.getColumns(null, null, aTable.getName(), null);
+ }
+ while (columns.next()) {
+ String id = columns.getString("COLUMN_NAME");
+ id = id.toUpperCase();
+ ColumnMetadata column = new ColumnMetadata(id);
+
+ int dataType = columns.getInt("DATA_TYPE");
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.foxpro)) {
+ if (dataType == Types.CHAR) {
+ dataType = Types.VARCHAR;
+ }
+ }
+ String dataTypeName = SQL3DataType.get(dataType).name();
+ column.addColumnField(ColumnFields.type, dataTypeName);
+
+ String defaultValue = "";
+ int defaultType = columns.getInt("NULLABLE");
+ switch (defaultType) {
+ case java.sql.DatabaseMetaData.columnNoNulls:
+ defaultValue = "not null";
+ break;
+ case java.sql.DatabaseMetaData.columnNullable:
+ // Dont specify if Null - Let DB Decide.
+ defaultValue = "";
+ break;
+ case java.sql.DatabaseMetaData.columnNullableUnknown:
+ default:
+ // Since unknown then don't specify
+ defaultValue = "";
+ break;
+ }
+ if (!defaultValue.equals("")) {
+ column.addColumnField(ColumnFields.defaultValue, defaultValue);
+ }
+
+ if (!SupportedDatabase.isDatabaseType(SupportedDatabase.foxpro)) {
+ // int dataType = columns.getInt("DATA_TYPE");
+ switch (dataType) {
+ case java.sql.Types.CHAR:
+ case java.sql.Types.VARCHAR:
+ String limits = columns.getString("COLUMN_SIZE");
+ if (limits != null && !limits.equals("")) {
+ column.addColumnField(ColumnFields.limits, limits);
+ }
+ break;
+ case java.sql.Types.DECIMAL:
+ case java.sql.Types.NUMERIC:
+ limits = columns.getString("COLUMN_SIZE");
+ String decimal = columns.getString("DECIMAL_DIGITS");
+ if (decimal != null && !decimal.equals("")) {
+ if (limits != null && !limits.equals("")) {
+ limits += "," + decimal;
+ }
+ }
+ if (limits != null && !limits.equals("")) {
+ column.addColumnField(ColumnFields.limits, limits);
+ }
+ default:
+ break;
+ }
+ } else {
+ switch (dataType) {
+ case java.sql.Types.CHAR:
+ case java.sql.Types.VARCHAR:
+ String limits = "255";
+ if (limits != null && !limits.equals("")) {
+ column.addColumnField(ColumnFields.limits, limits);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ aTable.addColumn(column);
+ }
+ columns.close();
+ }
+
+ private void getColumnPrimaryKey(TableElement aTable) throws SQLException {
+ ResultSet primaryKeys = null;
+ try {
+ primaryKeys = dbData.getPrimaryKeys(null, aTable.getSchema(), aTable.getName());
+ } catch (SQLException ex) {
+ primaryKeys = dbData.getPrimaryKeys(null, null, aTable.getName());
+ }
+ Map<String, Set<String>> constraintKeyMap = new HashMap<String, Set<String>>();
+
+ while (primaryKeys.next()) {
+ String column = primaryKeys.getString("COLUMN_NAME");
+ String keyId = primaryKeys.getString("PK_NAME");
+
+ if (keyId == null || keyId.equals("")) {
+ keyId = column + "_PK";
+ }
+
+ if (!constraintKeyMap.containsKey(keyId)) {
+ Set<String> set = new TreeSet<String>();
+ set.add(column);
+ constraintKeyMap.put(keyId, set);
+ } else {
+ Set<String> set = constraintKeyMap.get(keyId);
+ if (!set.contains(column)) {
+ set.add(column);
+ }
+ }
+ }
+
+ Set<String> keys = constraintKeyMap.keySet();
+ for (String pk : keys) {
+ ConstraintElement constraint =
+ ConstraintFactory.getConstraint(ConstraintTypes.PRIMARY_KEY, aTable.getSchema(), pk, false);
+ Set<String> columnSet = constraintKeyMap.get(pk);
+ for (String column : columnSet) {
+ constraint.addColumn(column);
+ }
+ aTable.addConstraint(constraint);
+ }
+ primaryKeys.close();
+ }
+
+ private void getColumnForeignKey(TableElement aTable) throws SQLException {
+ ResultSet importedKeys = dbData.getImportedKeys(null, aTable.getSchema(), aTable.getName());
+
+ while (importedKeys.next()) {
+
+ String appliesToColumnId = importedKeys.getString("FKCOLUMN_NAME");
+ String fkeyId = importedKeys.getString("FK_NAME");
+ String fKeyAddress = importedKeys.getString("FKTABLE_SCHEM");
+
+ String refersToTable = importedKeys.getString("PKTABLE_NAME");
+ String refersToTableAddress = importedKeys.getString("PKTABLE_SCHEM");
+ String referencesColumn = importedKeys.getString("PKCOLUMN_NAME");
+
+ OnDeleteEnum onDeleteAction = OnDeleteEnum.UNSPECIFIED;
+ String onDeleteRule = importedKeys.getString("DELETE_RULE");
+ if (onDeleteRule != null && !onDeleteRule.equals("")) {
+ // System.out.println("onDelete: " + onDeleteRule);
+ int type = Integer.parseInt(onDeleteRule);
+ switch (type) {
+ case java.sql.DatabaseMetaData.importedKeyNoAction:
+ onDeleteAction = OnDeleteEnum.NO_ACTION;
+ break;
+ case java.sql.DatabaseMetaData.importedKeyRestrict:
+ onDeleteAction = OnDeleteEnum.RESTRICT;
+ break;
+ case java.sql.DatabaseMetaData.importedKeyCascade:
+ onDeleteAction = OnDeleteEnum.CASCADE;
+ break;
+ case java.sql.DatabaseMetaData.importedKeySetNull:
+ onDeleteAction = OnDeleteEnum.SET_NULL;
+ break;
+ case java.sql.DatabaseMetaData.importedKeySetDefault:
+ default:
+ onDeleteAction = OnDeleteEnum.UNSPECIFIED;
+ break;
+ }
+ }
+
+ OnUpdateEnum onUpdateAction = OnUpdateEnum.UNSPECIFIED;
+ String onUpdateRule = importedKeys.getString("UPDATE_RULE");
+ if (onUpdateRule != null && !onUpdateRule.equals("")) {
+ // System.out.println("onUpdate: " + onUpdateRule);
+ int type = Integer.parseInt(onUpdateRule);
+ switch (type) {
+ case java.sql.DatabaseMetaData.importedKeyNoAction:
+ onUpdateAction = OnUpdateEnum.NO_ACTION;
+ break;
+ case java.sql.DatabaseMetaData.importedKeyRestrict:
+ onUpdateAction = OnUpdateEnum.RESTRICT;
+ break;
+ case java.sql.DatabaseMetaData.importedKeyCascade:
+ case java.sql.DatabaseMetaData.importedKeySetNull:
+ case java.sql.DatabaseMetaData.importedKeySetDefault:
+ default:
+ onUpdateAction = OnUpdateEnum.UNSPECIFIED;
+ break;
+ }
+ }
+
+ boolean deferrable = false;
+ String deferrabilityId = importedKeys.getString("DEFERRABILITY");
+ if (deferrabilityId != null && !deferrabilityId.equals("")) {
+ int type = Integer.parseInt(deferrabilityId);
+ switch (type) {
+ case java.sql.DatabaseMetaData.importedKeyInitiallyDeferred:
+ case java.sql.DatabaseMetaData.importedKeyInitiallyImmediate:
+ deferrable = true;
+ break;
+ case java.sql.DatabaseMetaData.importedKeyNotDeferrable:
+ deferrable = false;
+ break;
+ default:
+ deferrable = false;
+ break;
+ }
+ }
+
+ if (fKeyAddress == null || fKeyAddress.equals("")) {
+ fKeyAddress = aTable.getSchema();
+ }
+
+ if (fkeyId == null || fkeyId.equals("")) {
+ fkeyId = appliesToColumnId + "_FK";
+ }
+
+ if (refersToTableAddress == null || refersToTableAddress.equals("")) {
+ refersToTableAddress = aTable.getSchema();
+ }
+
+ ConstraintElement constraint =
+ ConstraintFactory.getConstraint(ConstraintTypes.FOREIGN_KEY, fKeyAddress, fkeyId, deferrable);
+ constraint.addColumn(appliesToColumnId);
+
+ ReferenceClause ref = new ReferenceClause(refersToTableAddress, refersToTable);
+ ref.addColumn(referencesColumn);
+
+ ref.setOnDeleteAction(onDeleteAction);
+ ref.setOnUpdateAction(onUpdateAction);
+
+ ((ForeignKey) constraint).addReference(ref);
+
+ aTable.addConstraint(constraint);
+ }
+ importedKeys.close();
+ }
+
+ private void getIndexInfo(TableElement aTable) throws SQLException {
+ ResultSet indexKeys = dbData.getIndexInfo(null, aTable.getSchema(), aTable.getName(), false, false);
+ Pattern pattern = Pattern.compile("SQL\\d+");
+
+ Map<String, Map<Integer, AppliesToClause>> indexMap = new HashMap<String, Map<Integer, AppliesToClause>>();
+
+ while (indexKeys.next()) {
+ String indexName = indexKeys.getString("INDEX_NAME");
+
+ if (indexName != null && indexName.length() > 0) {
+ Matcher matcher = pattern.matcher(indexName);
+ if (!matcher.matches()) {
+ if (indexKeys.getShort("TYPE") == DatabaseMetaData.tableIndexOther) {
+
+ short ordinal = indexKeys.getShort("ORDINAL_POSITION");
+ String columnName = indexKeys.getString("COLUMN_NAME");
+
+ String orderTypeString = indexKeys.getString("ASC_OR_DESC");
+ OrderType orderType = OrderType.Undefined;
+ if (orderTypeString != null) {
+ if (orderTypeString.equalsIgnoreCase("A")) {
+ orderType = OrderType.Ascending;
+ } else if (orderTypeString.equalsIgnoreCase("D")) {
+ orderType = OrderType.Descending;
+ }
+ }
+
+ Map<Integer, AppliesToClause> appliesTo = null;
+ if (indexMap.containsKey(indexName)) {
+ appliesTo = indexMap.get(indexName);
+ } else {
+ appliesTo = new HashMap<Integer, AppliesToClause>();
+ indexMap.put(indexName, appliesTo);
+ }
+ appliesTo.put(new Integer(ordinal), new AppliesToClause(columnName, orderType));
+ }
+ }
+ }
+ }
+ for (String indexName : indexMap.keySet()) {
+ Map<Integer, AppliesToClause> clauseMap = indexMap.get(indexName);
+ IndexElement element = new IndexElement(indexName);
+
+ Set<Integer> index = clauseMap.keySet();
+ Set<Integer> sortedIndex = new TreeSet<Integer>();
+ for (Integer val : index) {
+ sortedIndex.add(val);
+ }
+
+ for (Integer val : sortedIndex) {
+ AppliesToClause clause = clauseMap.get(val);
+ element.addAppliesTo(clause.getColumnName(), clause.getOrderType());
+ }
+ aTable.addIndexData(element);
+ }
+ indexKeys.close();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DbInit.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DbInit.java
new file mode 100644
index 00000000000..da49f160fdc
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/DbInit.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.utility;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.data.TableElement;
+import org.eclipse.osee.framework.database.initialize.DbFactory;
+import org.eclipse.osee.framework.database.sql.SqlFactory;
+import org.eclipse.osee.framework.database.sql.SqlManager;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.db.connection.core.schema.View;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+
+public class DbInit {
+
+ /**
+ * @param connection
+ * @param databaseType
+ * @param databaseType2
+ * @throws OseeDataStoreException
+ */
+ public static void addViews() throws OseeDataStoreException {
+ for (View view : SkynetDatabase.getSkynetViews()) {
+ String viewCreateCmd =
+ SupportedDatabase.isDatabaseType(SupportedDatabase.oracle) ? "CREATE OR REPLACE FORCE VIEW " : "CREATE VIEW ";
+
+ ConnectionHandler.runPreparedUpdate(viewCreateCmd + view.toString() + view.getDefinition());
+ ConnectionHandler.runPreparedUpdate("create OR REPLACE public synonym " + view.toString() + " for " + view.toString());
+ }
+ }
+
+ /**
+ * @param schemas
+ * @param schemas
+ * @param userSpecifiedConfig
+ * @param connection
+ * @param databaseType
+ * @param userSpecifiedConfig2
+ * @param databaseType2
+ * @throws Exception
+ */
+ public static void addIndeces(Set<String> schemas, Map<String, SchemaData> userSpecifiedConfig) throws OseeDataStoreException {
+ for (String schemaId : schemas) {
+ if (userSpecifiedConfig.containsKey(schemaId)) {
+ SchemaData userSpecifiedSchemaData = userSpecifiedConfig.get(schemaId);
+ DbFactory userDbFactory = new DbFactory(userSpecifiedSchemaData);
+ userDbFactory.createIndeces();
+ }
+ }
+ }
+
+ /**
+ * @param schemas
+ * @param userSpecifiedConfig2
+ * @param databaseType2
+ * @throws Exception
+ */
+ public static void addTables(Set<String> schemas, Map<String, SchemaData> userSpecifiedConfig) throws OseeDataStoreException {
+ for (String schemaId : schemas) {
+ if (userSpecifiedConfig.containsKey(schemaId)) {
+ SchemaData userSpecifiedSchemaData = userSpecifiedConfig.get(schemaId);
+ DbFactory userDbFactory = new DbFactory(userSpecifiedSchemaData);
+ userDbFactory.createTables();
+ }
+ }
+ }
+
+ /**
+ * @param schemas
+ * @param currentDatabaseConfig
+ * @param userSpecifiedConfig2
+ * @param currentDatabaseConfig2
+ * @param databaseType2
+ * @throws Exception
+ */
+ public static void dropTables(Set<String> schemas, Map<String, SchemaData> userSpecifiedConfig, Map<String, SchemaData> currentDatabaseConfig) throws OseeDataStoreException {
+ for (String schemaId : schemas) {
+ if (currentDatabaseConfig.containsKey(schemaId)) {
+ SchemaData currentDbSchemaData = currentDatabaseConfig.get(schemaId);
+ SchemaData userSchema = userSpecifiedConfig.get(schemaId);
+ Map<String, TableElement> currentDBmap = currentDbSchemaData.getTableMap();
+ Map<String, TableElement> userDbMap = userSchema.getTableMap();
+ Set<String> currentDbKeys = currentDBmap.keySet();
+ Set<String> userDbKeys = userDbMap.keySet();
+
+ SchemaData toDrop = new SchemaData();
+ for (String userKey : userDbKeys) {
+ if (currentDbKeys.contains(userKey)) {
+ toDrop.addTableDefinition(currentDBmap.get(userKey));
+ }
+ }
+ DbFactory currentDbFactory = new DbFactory(toDrop);
+ currentDbFactory.dropTables();
+ }
+ }
+ }
+
+ /**
+ * @param schemas
+ * @param currentDatabaseConfig
+ * @param userSpecifiedConfig2
+ * @param currentDatabaseConfig2
+ * @param databaseType2
+ * @throws Exception
+ */
+ public static void dropIndeces(Set<String> schemas, Map<String, SchemaData> userSpecifiedConfig, Map<String, SchemaData> currentDatabaseConfig) throws OseeDataStoreException {
+ System.out.println("Drop Indeces");
+ for (String schemaId : schemas) {
+ if (currentDatabaseConfig.containsKey(schemaId)) {
+ SchemaData currentDbSchemaData = currentDatabaseConfig.get(schemaId);
+ SchemaData userSchema = userSpecifiedConfig.get(schemaId);
+ Map<String, TableElement> currentDBmap = currentDbSchemaData.getTableMap();
+ Map<String, TableElement> userDbMap = userSchema.getTableMap();
+ Set<String> currentDbKeys = currentDBmap.keySet();
+ Set<String> userDbKeys = userDbMap.keySet();
+
+ SchemaData toDrop = new SchemaData();
+ for (String userKey : userDbKeys) {
+ if (currentDbKeys.contains(userKey)) {
+ toDrop.addTableDefinition(currentDBmap.get(userKey));
+ }
+ }
+ DbFactory currentDbFactory = new DbFactory(toDrop);
+ currentDbFactory.dropIndeces();
+ }
+ }
+ }
+
+ /**
+ * @param connection
+ */
+ public static void dropViews() throws OseeDataStoreException {
+ try {
+ DatabaseMetaData dbData = ConnectionHandler.getMetaData();
+ ResultSet tables = dbData.getTables(null, null, null, new String[] {"VIEW"});
+ while (tables.next()) {
+ String viewName = tables.getString("TABLE_NAME").toUpperCase();
+ for (View viewToDrop : SkynetDatabase.getSkynetViews()) {
+ if (viewToDrop.toString().equalsIgnoreCase(viewName)) {
+ ConnectionHandler.runPreparedUpdate("DROP VIEW " + viewName);
+ }
+ }
+ }
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public static void createSchema(Set<String> schemas) throws OseeDataStoreException {
+ SqlManager manager = SqlFactory.getSqlManager();
+ for (String schemaId : schemas) {
+ manager.createSchema(schemaId.toLowerCase());
+ }
+ }
+
+ public static void dropSchema(Set<String> schemas) throws OseeDataStoreException {
+ SqlManager manager = SqlFactory.getSqlManager();
+ for (String schemaId : schemas) {
+ manager.dropSchema(schemaId.toLowerCase());
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/FileUtility.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/FileUtility.java
new file mode 100644
index 00000000000..d8a0b6f8e83
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/FileUtility.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.framework.database.utility;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.db.DbConfigFileInformation;
+
+// TODO: this class has some overlap with methods provided in org.eclipse.osee.framework.jdk.core.Lib
+public class FileUtility {
+
+ public static boolean isValidDirectory(File directory) {
+ if (directory != null && directory.exists() && directory.canRead()) {
+ File[] listOfFiles = directory.listFiles();
+ if (listOfFiles.length != 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void setupDirectoryForWrite(File directory) {
+ if (directory.exists() && directory.canWrite()) {
+ if (!directory.isDirectory()) {
+ directory.mkdirs();
+ }
+ } else {
+ directory.mkdirs();
+ }
+ }
+
+ public static List<File> getFileList(File sourceDirectory, final String extension) {
+ File[] listOfFiles = sourceDirectory.listFiles(new FilenameFilter() {
+ public boolean accept(File directoryName, String filename) {
+ return filename.endsWith(extension) && (new File(directoryName + File.separator + filename)).canRead();
+ }
+ });
+ return Arrays.asList(listOfFiles);
+ }
+
+ public static List<URL> getSchemaFileList(File sourceDirectory) {
+ List<File> files = getFileList(sourceDirectory, DbConfigFileInformation.getSchemaFileExtension());
+ List<URL> streams = new ArrayList<URL>();
+ for (File file : files) {
+ try {
+ streams.add(file.toURI().toURL());
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+ return streams;
+ }
+
+ public static List<File> getDBDataFileList(File sourceDirectory) {
+ return getFileList(sourceDirectory, DbConfigFileInformation.getDbDataFileExtension());
+ }
+
+ public static List<URL> getDBDataFileListInputStream(File sourceDirectory) {
+ List<File> files = getFileList(sourceDirectory, DbConfigFileInformation.getDbDataFileExtension());
+ List<URL> streams = new ArrayList<URL>();
+ for (File file : files) {
+ try {
+ streams.add(file.toURI().toURL());
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+ return streams;
+ }
+}
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/GroupSelection.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/GroupSelection.java
new file mode 100644
index 00000000000..212a4432ddb
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/GroupSelection.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.database.utility;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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.Platform;
+import org.eclipse.osee.framework.database.DatabaseActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class GroupSelection {
+ private static final GroupSelection instance = new GroupSelection();
+ private final Map<String, List<String>> initGroups = new HashMap<String, List<String>>();
+
+ /**
+ * @param initGroups
+ */
+ private GroupSelection() {
+ super();
+ populateDbInitChoices();
+ }
+
+ public static GroupSelection getInstance() {
+ return instance;
+ }
+
+ private List<IConfigurationElement> getExtensionElements(Bundle bundle, String extensionPointName, String elementName) {
+ return getExtensionElements(bundle.getSymbolicName() + "." + extensionPointName, elementName);
+ }
+
+ private List<IConfigurationElement> getExtensionElements(String extensionPointId, String elementName) {
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ if (extensionRegistry == null) {
+ throw new IllegalStateException("The extension registry is unavailable");
+ }
+
+ IExtensionPoint point = extensionRegistry.getExtensionPoint(extensionPointId);
+ if (point == null) {
+ throw new IllegalArgumentException("The extension point " + extensionPointId + " does not exist");
+ }
+
+ IExtension[] extensions = point.getExtensions();
+ ArrayList<IConfigurationElement> elementsList = new ArrayList<IConfigurationElement>(extensions.length * 3);
+
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equalsIgnoreCase(elementName)) {
+ elementsList.add(element);
+ }
+ }
+ }
+ return elementsList;
+ }
+
+ private void populateDbInitChoices() {
+ List<IConfigurationElement> elements =
+ getExtensionElements(DatabaseActivator.getInstance().getBundle(), "AddDbInitChoice", "dbInitChoice");
+
+ for (IConfigurationElement element : elements) {
+ String choiceClass = element.getAttribute("classname");
+ try {
+ IAddDbInitChoice choice =
+ (IAddDbInitChoice) Platform.getBundle(element.getContributor().getName()).loadClass(choiceClass).newInstance();
+ choice.addDbInitChoice(this);
+ } catch (InstantiationException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex);
+ } catch (IllegalAccessException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex);
+ } catch (ClassNotFoundException ex) {
+ OseeLog.log(DatabaseActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private void addCommonChoices(List<String> dbInitTasks, boolean bareBones) {
+ List<String> initTasks = new ArrayList<String>();
+ initTasks.add("org.eclipse.osee.framework.skynet.core.SkynetDbInit");
+ dbInitTasks.addAll(0, initTasks);
+ dbInitTasks.add("org.eclipse.osee.framework.skynet.core.PostDbUserCleanUp");
+ dbInitTasks.add("org.eclipse.osee.framework.skynet.core.SkynetDbBranchDataImport");
+ dbInitTasks.add("org.eclipse.osee.framework.database.PostDbInitializationProcess");
+ }
+
+ public void addChoice(String listName, List<String> dbInitTasks, boolean bareBones) {
+ addCommonChoices(dbInitTasks, bareBones);
+ initGroups.put(listName, dbInitTasks);
+ }
+
+ public List<String> getChoices() {
+ List<String> choices = new ArrayList<String>(initGroups.keySet());
+ Collections.sort(choices);
+ return choices;
+ }
+
+ public List<String> getDbInitTasksByChoiceEntry(String choice) {
+ return initGroups.get(choice);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/IAddDbInitChoice.java b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/IAddDbInitChoice.java
new file mode 100644
index 00000000000..1f7a007b32f
--- /dev/null
+++ b/org.eclipse.osee.framework.database/src/org/eclipse/osee/framework/database/utility/IAddDbInitChoice.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.framework.database.utility;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface IAddDbInitChoice {
+ public abstract void addDbInitChoice(GroupSelection groupSelection);
+}
diff --git a/org.eclipse.osee.framework.database/support/dbrelease.xml b/org.eclipse.osee.framework.database/support/dbrelease.xml
new file mode 100644
index 00000000000..84fd5bb354d
--- /dev/null
+++ b/org.eclipse.osee.framework.database/support/dbrelease.xml
@@ -0,0 +1,88 @@
+<project name="DBRelease" default="dbrelease" basedir="..">
+
+ <property name="ECLIPSE_HOME" value="C:\Program Files\OSEE" />
+ <property name="release" value="dbrelease/" />
+ <property name="targetzip" value="${release}../oseeDatabase.zip" />
+ <property name="manifestname" value="RELEASE.MF" />
+ <property name="antdir" value="ant/" />
+ <property name="derby" value="${ECLIPSE_HOME}\plugins\org.apache.derby.core_10.1.2.1" />
+
+ <property name="eclipseruntimejar" value="org.eclipse.core.runtime_3.1.2.jar"/>
+ <property name="eclipseJFacejar" value="org.eclipse.jface_3.1.1.jar" />
+ <property name="eclipseRuntime" value="${ECLIPSE_HOME}\plugins\${eclipseruntimejar}" />
+ <property name="eclipseJFace" value="${ECLIPSE_HOME}\plugins\${eclipseJFacejar}" />
+
+ <property name="oseecore" value="osee.jdk.core/bin/" />
+ <property name="oseedb" value="osee.database/bin/" />
+ <property name="oseejini" value="osee.jini/bin/" />
+ <property name="oseeats2" value="osee.ats2/bin/" />
+ <property name="oseedefine" value="osee.define/bin/" />
+
+ <target name="clean">
+ <delete file="${manifestname}" />
+ <delete dir="${release}" />
+ </target>
+
+ <target name="createrelease">
+ <echo message="createrelease PATH=${PATH}" />
+ <mkdir dir="${PATH}" />
+ <manifest file="RELEASE.MF">
+ <attribute name="Main-Class" value="osee/database/core/OseeDbLauncher" />
+ <attribute name="Class-Path" value="oseecore.jar oseejini.jar oseedefine.jar oseeats2.jar derby.jar derbyclient.jar derbynet.jar derbytools.jar ${eclipseruntimejar} ${eclipseJFacejar}" />
+ <section name="common">
+ <attribute name="Specification-Title" value="Example" />
+ <attribute name="Specification-Version" value="${version}" />
+ <attribute name="Specification-Vendor" value="Example Organization" />
+ <attribute name="Implementation-Title" value="common" />
+ <attribute name="Implementation-Version" value="${version} ${TODAY}" />
+ <attribute name="Implementation-Vendor" value="Example Corp." />
+ </section>
+ </manifest>
+
+ <jar jarfile="${PATH}/oseedb.jar" basedir="../${oseedb}" manifest="RELEASE.MF" />
+ <jar jarfile="${PATH}/oseecore.jar" basedir="../${oseecore}" />
+ <jar jarfile="${PATH}/oseejini.jar" basedir="../${oseejini}" />
+ <jar jarfile="${PATH}/oseeats2.jar" basedir="../${oseeats2}" />
+ <jar jarfile="${PATH}/oseedefine.jar" basedir="../${oseedefine}" />
+
+ <copy toDir="${PATH}/">
+ <fileset file="${eclipseRuntime}"/>
+ <fileset file="${eclipseJFace}" />
+ </copy>
+
+ <copy toDir="${PATH}/">
+ <fileset dir="${derby}" includes="*.jar" />
+ </copy>
+
+ <copy toDir="${PATH}/DatabaseSchemaDump">
+ <fileset dir="DatabaseSchemaDump"/>
+ </copy>
+
+ <copy toDir="${PATH}/excelFiles">
+ <fileset dir="excelFiles"/>
+ </copy>
+
+ <copy toDir="${PATH}/support/">
+ <fileset file="../${oseecore}/../support/oseeSiteConfig.xml" />
+ </copy>
+ <delete file="${manifestname}" />
+ </target>
+
+ <target name="dbrelease">
+ <antcall target="createrelease">
+ <param name="PATH" value="dbrelease/" />
+ </antcall>
+ </target>
+
+ <target name="dbreleasezip">
+ <antcall target="createrelease">
+ <param name="PATH" value="temp/" />
+ </antcall>
+ <zip destfile="${targetzip}">
+ <fileset dir="temp/" />
+ </zip>
+
+ <delete dir="temp/" />
+ </target>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.database/support/sqlAnt.xml b/org.eclipse.osee.framework.database/support/sqlAnt.xml
new file mode 100644
index 00000000000..9363f690fc2
--- /dev/null
+++ b/org.eclipse.osee.framework.database/support/sqlAnt.xml
@@ -0,0 +1,84 @@
+<project name="SQLAnt" default="query" basedir=".">
+
+ <!-- LOCAL DERBY PROPERTIES -->
+ <property name="driver" value="org.apache.derby.jdbc.ClientDriver"/>
+ <property name="url" value="jdbc:derby://localhost:1621/DerbyDatabase;create=true"/>
+ <property name="userid" value="osee"/>
+ <property name="password" value="osee"/>
+ <property name="driverpath" value="C:\Program Files\OSEE\plugins\org.apache.derby.core_10.1.2.1\derbyclient.jar" />
+
+ <target name="query" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ select * from OSEE_DEFINE_ATTRIBUTE_TYPE
+ </sql>
+ </target>
+
+ <target name="getAllOseeInfo" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ select * from OSEE_INFO
+ </sql>
+ </target>
+
+ <target name="insertderbyTestScriptOutputFalse" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ insert into OSEE_INFO (OSEE_VALUE, OSEE_KEY) values ('FALSE', 'SAVE_OUTFILE_IN_DB')
+ </sql>
+ </target>
+
+ <target name="saveTestScriptOutputTrue" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ UPDATE OSEE_INFO SET OSEE_VALUE = 'TRUE'
+ WHERE OSEE_KEY = 'SAVE_OUTFILE_IN_DB'
+ </sql>
+ </target>
+
+ <target name="saveTestScriptOutputFalse" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ UPDATE OSEE_INFO SET OSEE_VALUE = 'FALSE'
+ WHERE OSEE_KEY = 'SAVE_OUTFILE_IN_DB'
+ </sql>
+ </target>
+
+ <target name="testskynet" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ SELECT attr_type_id FROM OSEE_DEFINE_valid_attributes WHERE art_type_id = 20 AND gamma_id &lt;= 100000
+ </sql>
+ </target>
+
+
+ <target name="testskynet2" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ SELECT OSEE_DEFINE_attr_base_type.attribute_class,
+ OSEE_DEFINE_attribute_type.attr_type_id,
+ OSEE_DEFINE_attribute_type.name,
+ OSEE_DEFINE_attribute_type.default_value,
+ OSEE_DEFINE_attribute_type.validity_xml,
+ OSEE_DEFINE_attribute_type.min_occurence,
+ OSEE_DEFINE_attribute_type.max_occurence,
+ OSEE_DEFINE_attribute_type.user_viewable,
+ OSEE_DEFINE_attribute_type.tip_text
+ FROM OSEE_DEFINE_attribute_type, OSEE_DEFINE_attr_base_type,transaction_gamma_view
+ WHERE OSEE_DEFINE_attr_base_type.attr_base_type_id=OSEE_DEFINE_attribute_type.attr_base_type_id
+ AND transaction_gamma_view.transaction_id=179
+ AND OSEE_DEFINE_attribute_type.gamma_id&lt;=transaction_gamma_view.largest_gamma_id
+ </sql>
+ </target>
+
+
+ <target name="getseqtable" >
+ <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" print="true" >
+ <classpath><pathelement location="${driverpath}"/></classpath>
+ SELECT * FROM OSEE_DEFINE_SEQUENCE
+ </sql>
+ </target>
+
+</project>
+
+
diff --git a/org.eclipse.osee.framework.db.connection/.classpath b/org.eclipse.osee.framework.db.connection/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.db.connection/.project b/org.eclipse.osee.framework.db.connection/.project
new file mode 100644
index 00000000000..b1a273d7f57
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.db.connection</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.db.connection/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.db.connection/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..7ee40a24154
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed Apr 23 11:16:58 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.db.connection/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.db.connection/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..d19f53ea889
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Connection Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.db.connection;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.db.connection.internal.InternalActivator
+Bundle-Vendor: Boeing
+Import-Package: org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.xml,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.framework.db.connection;
+ uses:="org.eclipse.osee.framework.db.connection.core.transaction,
+ org.osgi.util.tracker,
+ org.osgi.framework,
+ org.eclipse.osee.framework.db.connection.info",
+ org.eclipse.osee.framework.db.connection.core;uses:="org.eclipse.osee.framework.db.connection",
+ org.eclipse.osee.framework.db.connection.core.query;uses:="org.eclipse.osee.framework.db.connection.core",
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction;uses:="org.eclipse.osee.framework.db.connection.core",
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info;uses:="org.eclipse.osee.framework.jdk.core.type,org.w3c.dom"
+Require-Bundle: org.eclipse.equinox.ds
+OseeEarlyStart: true
+Service-Component: OSGI-INF/uri.connection.contributor.xml,
+ OSGI-INF/db.connection.consumer.xml,
+ OSGI-INF/db.connection.contributor.consumer.xml,
+ OSGI-INF/application.db.provider.consumer.xml
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.db.connection/OSGI-INF/application.db.provider.consumer.xml b/org.eclipse.osee.framework.db.connection/OSGI-INF/application.db.provider.consumer.xml
new file mode 100644
index 00000000000..fc64791867c
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/OSGI-INF/application.db.provider.consumer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="application.database.manager">
+ <implementation class="org.eclipse.osee.framework.db.connection.internal.ApplicationDatabaseManager"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.internal.IApplicationDatabaseManager"/>
+ </service>
+ <reference name="application.database.provider"
+ interface="org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider"
+ bind="addDatabaseProvider"
+ unbind="removeDatabaseProvider"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.consumer.xml b/org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.consumer.xml
new file mode 100644
index 00000000000..de5f39cb107
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.consumer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="db.connection.consumer">
+ <implementation class="org.eclipse.osee.framework.db.connection.internal.DbConnectionFactory"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.internal.IDbConnectionFactory"/>
+ </service>
+ <reference name="db.connection.provider"
+ interface="org.eclipse.osee.framework.db.connection.IConnection"
+ bind="bind"
+ unbind="unbind"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.contributor.consumer.xml b/org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.contributor.consumer.xml
new file mode 100644
index 00000000000..11b85413178
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/OSGI-INF/db.connection.contributor.consumer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="db.connection.contributor.consumer">
+ <implementation class="org.eclipse.osee.framework.db.connection.internal.DbConnectionInformation"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.internal.IDbConnectionInformation"/>
+ </service>
+ <reference name="db.connection.contributor.provider"
+ interface="org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor"
+ bind="bind"
+ unbind="unbind"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/OSGI-INF/uri.connection.contributor.xml b/org.eclipse.osee.framework.db.connection/OSGI-INF/uri.connection.contributor.xml
new file mode 100644
index 00000000000..3326460e85e
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/OSGI-INF/uri.connection.contributor.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="uri.connection.contributor">
+ <implementation class="org.eclipse.osee.framework.db.connection.internal.UriDbConnectionInfo"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/build.properties b/org.eclipse.osee.framework.db.connection/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandler.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandler.java
new file mode 100644
index 00000000000..623a4dd7a63
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandler.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.framework.db.connection;
+
+import java.io.ByteArrayInputStream;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.core.query.QueryRecord;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * Handles connection recovery in the event of database connection being lost
+ *
+ * @author Jeff C. Phillips
+ */
+public final class ConnectionHandler {
+
+ private static void close(PreparedStatement stmt) {
+ if (stmt != null) {
+ try {
+ stmt.close();
+ } catch (SQLException ex) {
+ OseeLog.log(InternalActivator.class, Level.WARNING, "Unable to close database statement: ", ex);
+ }
+ }
+ }
+
+ /**
+ * This method should only be used when not contained in a DB transaction
+ *
+ * @param query
+ * @param data
+ * @return number of records updated
+ * @throws OseeDataStoreException
+ */
+ public static int runPreparedUpdate(String query, Object... data) throws OseeDataStoreException {
+ OseeConnection connection = OseeDbConnection.getConnection();
+ try {
+ return runPreparedUpdate(connection, query, data);
+ } finally {
+ connection.close();
+ }
+ }
+
+ /**
+ * This method should only be used when not contained in a DB transaction
+ *
+ * @param query
+ * @param dataList
+ * @return number of records updated
+ * @throws OseeDataStoreException
+ */
+ public static int runBatchUpdate(String query, List<Object[]> dataList) throws OseeDataStoreException {
+ OseeConnection connection = OseeDbConnection.getConnection();
+ try {
+ return runBatchUpdate(connection, query, dataList);
+ } finally {
+ connection.close();
+ }
+ }
+
+ /**
+ * This method should only be used when contained in a DB transaction
+ *
+ * @param connection
+ * @param query
+ * @param data
+ * @return number of records updated
+ * @throws OseeDataStoreException
+ */
+ public static int runPreparedUpdate(OseeConnection connection, String query, Object... data) throws OseeDataStoreException {
+ if (connection == null) {
+ return runPreparedUpdate(query, data);
+ }
+ PreparedStatement preparedStatement = null;
+ int updateCount = 0;
+ try {
+ preparedStatement = connection.prepareStatement(query);
+ populateValuesForPreparedStatement(preparedStatement, data);
+ updateCount = preparedStatement.executeUpdate();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ } finally {
+ close(preparedStatement);
+ }
+ return updateCount;
+ }
+
+ public static int runBatchUpdate(OseeConnection connection, String query, List<Object[]> dataList) throws OseeDataStoreException {
+ if (connection == null) {
+ return runBatchUpdate(query, dataList);
+ }
+
+ QueryRecord record = new QueryRecord("<batchable: batched> " + query, dataList.size());
+ int returnCount = 0;
+ PreparedStatement preparedStatement = null;
+ try {
+ preparedStatement = connection.prepareStatement(query);
+ record.markStart();
+ boolean needExecute = false;
+ int count = 0;
+ for (Object[] data : dataList) {
+ count++;
+ populateValuesForPreparedStatement(preparedStatement, data);
+ preparedStatement.addBatch();
+ preparedStatement.clearParameters();
+ needExecute = true;
+ if (count > 2000) {
+ int[] updates = preparedStatement.executeBatch();
+ returnCount += processBatchUpdateResults(updates);
+ count = 0;
+ needExecute = false;
+ }
+ }
+ if (needExecute) {
+ int[] updates = preparedStatement.executeBatch();
+ returnCount += processBatchUpdateResults(updates);
+ }
+
+ record.markEnd();
+ } catch (SQLException ex) {
+ record.setSqlException(ex);
+ SQLException exlist;
+ if ((exlist = ex.getNextException()) != null) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, "This is the nested exception", exlist);
+ }
+ StringBuilder details = new StringBuilder(dataList.size() * dataList.get(0).length * 20);
+ details.append("[ DATA OBJECT: \n");
+ for (Object[] data : dataList) {
+ for (int i = 0; i < data.length; i++) {
+ details.append(i);
+ details.append(": ");
+ Object dataValue = data[i];
+ if (dataValue != null) {
+ details.append(dataValue.getClass().getName());
+ details.append(":");
+
+ String value = dataValue.toString();
+ if (value.length() > 35) {
+ details.append(value.substring(0, 35));
+ } else {
+ details.append(value);
+ }
+ details.append("\n");
+ } else {
+ details.append("NULL\n");
+ }
+ }
+ }
+ details.append("]\n");
+ throw new OseeDataStoreException("sql update failed: \n" + query + "\n" + details, ex);
+ } finally {
+ close(preparedStatement);
+ }
+ return returnCount;
+ }
+
+ public static int runPreparedQueryFetchInt(int defaultValue, String query, Object... data) throws OseeDataStoreException {
+ return runPreparedQueryFetchInt(new ConnectionHandlerStatement(), defaultValue, query, data);
+ }
+
+ public static int runPreparedQueryFetchInt(OseeConnection connection, int defaultValue, String query, Object... data) throws OseeDataStoreException {
+ return runPreparedQueryFetchInt(new ConnectionHandlerStatement(connection), defaultValue, query, data);
+ }
+
+ private static int runPreparedQueryFetchInt(ConnectionHandlerStatement chStmt, int defaultValue, String query, Object... data) throws OseeDataStoreException {
+ try {
+ chStmt.runPreparedQuery(1, query, data);
+ if (chStmt.next()) {
+ return chStmt.getInt(1);
+ }
+ return defaultValue;
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static int runCallableStatementFetchInt(String query, Object... data) throws OseeDataStoreException {
+ return runCallableStatementFetchInt(new ConnectionHandlerStatement(), query, data);
+ }
+
+ public static int runCallableStatementFetchInt(OseeConnection connection, String query, Object... data) throws OseeDataStoreException {
+ return runCallableStatementFetchInt(new ConnectionHandlerStatement(connection), query, data);
+ }
+
+ public static int runCallableStatementFetchInt(ConnectionHandlerStatement chStmt, String query, Object... data) throws OseeDataStoreException {
+ try {
+ chStmt.runCallableStatement(query, data);
+ return chStmt.getCallableInt(1);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static double runCallableStatementFetchDouble(String query, Object... data) throws OseeDataStoreException {
+ return runCallableStatementFetchDouble(new ConnectionHandlerStatement(), query, data);
+ }
+
+ public static double runCallableStatementFetchDouble(OseeConnection connection, String query, Object... data) throws OseeDataStoreException {
+ return runCallableStatementFetchDouble(new ConnectionHandlerStatement(connection), query, data);
+ }
+
+ private static double runCallableStatementFetchDouble(ConnectionHandlerStatement chStmt, String query, Object... data) throws OseeDataStoreException {
+ try {
+ chStmt.runCallableStatement(query, data);
+ return chStmt.getCallableDouble(1);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static long runPreparedQueryFetchLong(long defaultValue, String query, Object... data) throws OseeDataStoreException {
+ return runPreparedQueryFetchLong(new ConnectionHandlerStatement(), defaultValue, query, data);
+ }
+
+ public static long runPreparedQueryFetchLong(OseeConnection connection, long defaultValue, String query, Object... data) throws OseeDataStoreException {
+ return runPreparedQueryFetchLong(new ConnectionHandlerStatement(connection), defaultValue, query, data);
+ }
+
+ private static long runPreparedQueryFetchLong(ConnectionHandlerStatement chStmt, long defaultValue, String query, Object... data) throws OseeDataStoreException {
+ try {
+ chStmt.runPreparedQuery(1, query, data);
+ if (chStmt.next()) {
+ return chStmt.getLong(1);
+ }
+ return defaultValue;
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static String runPreparedQueryFetchString(String defaultValue, String query, Object... data) throws OseeDataStoreException {
+ return runPreparedQueryFetchString(new ConnectionHandlerStatement(), defaultValue, query, data);
+ }
+
+ public static String runPreparedQueryFetchString(OseeConnection connection, String defaultValue, String query, Object... data) throws OseeDataStoreException {
+ return runPreparedQueryFetchString(new ConnectionHandlerStatement(connection), defaultValue, query, data);
+ }
+
+ private static String runPreparedQueryFetchString(ConnectionHandlerStatement chStmt, String defaultValue, String query, Object... data) throws OseeDataStoreException {
+ try {
+ chStmt.runPreparedQuery(1, query, data);
+ if (chStmt.next()) {
+ return chStmt.getString(1);
+ }
+ return defaultValue;
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private static int processBatchUpdateResults(int[] updates) {
+ int returnCount = 0;
+ for (int update : updates) {
+ if (update >= 0) {
+ returnCount += update;
+ } else if (Statement.EXECUTE_FAILED == update) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, "sql execute failed.");
+ } else if (Statement.SUCCESS_NO_INFO == update) {
+ returnCount++;
+ }
+ }
+ return returnCount;
+ }
+
+ static void populateValuesForPreparedStatement(PreparedStatement preparedStatement, Object... data) throws OseeDataStoreException {
+ try {
+ int preparedIndex = 0;
+ for (Object dataValue : data) {
+ preparedIndex++;
+ if (dataValue instanceof String) {
+ int length = ((String) dataValue).length();
+ if (length > 4000) {
+ throw new OseeDataStoreException(
+ "SQL data value length must be <= 4000 not " + length + "\nValue: " + dataValue);
+ }
+ }
+
+ if (dataValue == null) {
+ throw new OseeDataStoreException(
+ "instead of passing null for an query parameter, pass the corresponding SQL3DataType");
+ } else if (dataValue instanceof SQL3DataType) {
+ int dataTypeNumber = ((SQL3DataType) dataValue).getSQLTypeNumber();
+ if (dataTypeNumber == java.sql.Types.BLOB) {
+ // TODO Need to check this - for PostgreSql, setNull for BLOB with the new JDBC driver gives the error "column
+ // "content" is of type bytea but expression is of type oid"
+ preparedStatement.setBytes(preparedIndex, null);
+ } else {
+ preparedStatement.setNull(preparedIndex, dataTypeNumber);
+ }
+ } else if (dataValue instanceof ByteArrayInputStream) {
+ preparedStatement.setBinaryStream(preparedIndex, (ByteArrayInputStream) dataValue,
+ ((ByteArrayInputStream) dataValue).available());
+ } else {
+ preparedStatement.setObject(preparedIndex, dataValue);
+ }
+ }
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /**
+ * Cause constraint checking to be deferred until the end of the current transaction.
+ *
+ * @param connection
+ * @throws OseeDataStoreException
+ */
+ public static void deferConstraintChecking(OseeConnection connection) throws OseeDataStoreException {
+ if (SupportedDatabase.getDatabaseType(connection) == SupportedDatabase.derby) {
+ return;
+ }
+ // NOTE: this must be a PreparedStatement to play correctly with DB Transactions.
+ runPreparedUpdate(connection, "SET CONSTRAINTS ALL DEFERRED");
+ }
+
+ public static DatabaseMetaData getMetaData() throws OseeDataStoreException {
+ OseeConnection connection = OseeDbConnection.getConnection();
+ try {
+ return connection.getMetaData();
+ } finally {
+ connection.close();
+ }
+ }
+
+ public static boolean doesTableExist(String targetTable) {
+ return doesTableExist(null, targetTable);
+ }
+
+ public static boolean doesTableExist(String targetSchema, String targetTable) {
+ ResultSet resultSet = null;
+ try {
+ resultSet = getMetaData().getTables(null, null, null, new String[] {"TABLE"});
+ if (resultSet != null) {
+ while (resultSet.next()) {
+ String tableName = resultSet.getString("TABLE_NAME");
+ String schemaName = resultSet.getString("TABLE_SCHEM");
+ if (targetTable.equalsIgnoreCase(tableName)) {
+ if (targetSchema == null || targetSchema.equalsIgnoreCase(schemaName)) {
+ return true;
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ // Do nothing
+ } finally {
+ if (resultSet != null) {
+ try {
+ resultSet.close();
+ } catch (SQLException ex) {
+ // Do nothing
+ }
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandlerStatement.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandlerStatement.java
new file mode 100644
index 00000000000..63ebc2cf583
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/ConnectionHandlerStatement.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.framework.db.connection;
+
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.sql.CallableStatement;
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.core.query.QueryRecord;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ */
+public class ConnectionHandlerStatement {
+ private ResultSet rSet;
+ private PreparedStatement preparedStatement;
+ private CallableStatement callableStatement;
+ private OseeConnection connection;
+ private final boolean autoClose;
+
+ public ConnectionHandlerStatement(OseeConnection connection) {
+ this(connection, connection == null);
+ }
+
+ public ConnectionHandlerStatement(OseeConnection connection, boolean autoClose) {
+ this.autoClose = autoClose;
+ this.connection = connection;
+ }
+
+ public ConnectionHandlerStatement() {
+ this(null);
+ }
+
+ public void runPreparedQuery(String query, Object... data) throws OseeDataStoreException {
+ runPreparedQuery(0, query, data);
+ }
+
+ /**
+ * @param fetchSize hint as to the number of rows that should be fetched from the database at a time. will be limited
+ * to 10,000
+ * @param query
+ * @param data
+ * @throws OseeDataStoreException
+ */
+ public void runPreparedQuery(int fetchSize, String query, Object... data) throws OseeDataStoreException {
+ QueryRecord record = new QueryRecord(query, data);
+
+ try {
+ allowReuse();
+ preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setFetchSize(Math.min(fetchSize, 10000));
+ ConnectionHandler.populateValuesForPreparedStatement(preparedStatement, data);
+
+ record.markStart();
+ rSet = preparedStatement.executeQuery();
+ record.markEnd();
+ } catch (SQLException ex) {
+ record.setSqlException(ex);
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /**
+ * Invokes a stored procedure parameters of type SQL3DataType are registered as Out parameters and all others are set
+ * as in parameters
+ *
+ * @param query
+ * @param data
+ * @throws OseeDataStoreException
+ */
+ public void runCallableStatement(String query, Object... data) throws OseeDataStoreException {
+ QueryRecord record = new QueryRecord(query, data);
+
+ try {
+ allowReuse();
+ callableStatement = connection.prepareCall(query);
+
+ for (int index = 0; index < data.length; index++) {
+ if (data[index] instanceof SQL3DataType) {
+ callableStatement.registerOutParameter(index + 1, ((SQL3DataType) data[index]).getSQLTypeNumber());
+ }
+ }
+ ConnectionHandler.populateValuesForPreparedStatement(callableStatement, data);
+
+ record.markStart();
+ if (callableStatement.execute()) {
+ rSet = callableStatement.getResultSet();
+ }
+ record.markEnd();
+ } catch (SQLException ex) {
+ record.setSqlException(ex);
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public boolean next() throws OseeDataStoreException {
+ if (rSet != null) {
+ try {
+ return rSet.next();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * The application must call close when it is done using this object; however, it is safe to use this same object
+ * multiple times, for example calling runPreparedQuery() repeatedly, without any intermediate calls to close
+ */
+ public void close() {
+ try {
+ closePreviousResources();
+ if (autoClose && connection != null) {
+ connection.close();
+ connection = null;// this allows for multiple calls to runPreparedQuery to have an open connection
+ }
+ } catch (SQLException ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * allows for multiple uses of this object to have an open connection
+ *
+ * @throws SQLException
+ * @throws OseeDataStoreException
+ */
+ private void allowReuse() throws SQLException, OseeDataStoreException {
+ if (connection == null) {
+ connection = OseeDbConnection.getConnection();
+ }
+ closePreviousResources();
+ }
+
+ private void closePreviousResources() throws SQLException {
+ if (rSet != null) {
+ rSet.close();
+ }
+ if (preparedStatement != null) {
+ preparedStatement.close();
+ }
+ if (callableStatement != null) {
+ callableStatement.close();
+ }
+ }
+
+ public InputStream getBinaryStream(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getBinaryStream(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public InputStream getAsciiStream(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getAsciiStream(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public String getString(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getString(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public float getFloat(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getFloat(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public long getLong(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getLong(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public int getInt(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getInt(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /**
+ * should not be used by application code because it is less readable than using the column name
+ *
+ * @param columnIndex
+ * @return
+ * @throws OseeDataStoreException
+ */
+ int getInt(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getInt(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ int getCallableInt(int columnIndex) throws OseeDataStoreException {
+ try {
+ return callableStatement.getInt(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public double getCallableDouble(int columnIndex) throws OseeDataStoreException {
+ try {
+ return callableStatement.getDouble(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /**
+ * should not be used by application code because it is less readable than using the column name
+ *
+ * @param columnIndex
+ * @return
+ * @throws OseeDataStoreException
+ */
+ long getLong(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getLong(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /**
+ * should not be used by application code because it is less readable than using the column name
+ *
+ * @param columnIndex
+ * @return
+ * @throws OseeDataStoreException
+ */
+ String getString(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getString(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public Timestamp getTimestamp(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getTimestamp(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public BigDecimal getBigDecimal(String name) throws OseeDataStoreException {
+ try {
+ return rSet.getBigDecimal(name);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public Time getTime(String name) throws OseeDataStoreException {
+ try {
+ return rSet.getTime(name);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public double getDouble(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getDouble(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public Date getDate(String columnName) throws OseeDataStoreException {
+ try {
+ return rSet.getDate(columnName);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public boolean wasNull() throws OseeDataStoreException {
+ try {
+ return rSet.wasNull();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public int getColumnCount() throws OseeDataStoreException {
+ try {
+ return rSet.getMetaData().getColumnCount();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public String getColumnName(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getMetaData().getColumnName(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public int getColumnType(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getMetaData().getColumnType(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public String getColumnTypeName(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getMetaData().getColumnTypeName(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public Object getObject(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getObject(columnIndex);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /**
+ * Returns the number of rows in the result set. Once this method returns the result set will be pointing to the last
+ * row
+ *
+ * @return the number of rows in the result set
+ * @throws OseeDataStoreException
+ */
+ public int getRowCount() throws OseeDataStoreException {
+ try {
+ rSet.last();
+ return rSet.getRow();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public boolean isNullable(int columnIndex) throws OseeDataStoreException {
+ try {
+ return rSet.getMetaData().isNullable(columnIndex) == ResultSetMetaData.columnNullable;
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseConnectionInfo.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseConnectionInfo.java
new file mode 100644
index 00000000000..5bde41942a2
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseConnectionInfo.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.framework.db.connection;
+
+import java.util.Properties;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DatabaseConnectionInfo implements IDatabaseInfo {
+ private final String databaseLoginName;
+ private final String connectionPrefix;
+ private final String databaseName;
+ private final String driver;
+ private final String id;
+ private final boolean isProduction;
+ private final Properties properties;
+
+ /**
+ * @param databaseLoginName
+ * @param databaseName
+ * @param driver
+ * @param id
+ * @param isProduction
+ */
+ public DatabaseConnectionInfo(String databaseLoginName, String connectionPrefix, String databaseName, String driver, String id, Properties properties, boolean isProduction) {
+ super();
+ this.databaseLoginName = databaseLoginName;
+ this.connectionPrefix = connectionPrefix;
+ this.databaseName = databaseName;
+ this.driver = driver;
+ this.id = id;
+ this.isProduction = isProduction;
+ this.properties = properties;
+ properties.setProperty("user", databaseLoginName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getConnectionProperties()
+ */
+ @Override
+ public Properties getConnectionProperties() {
+ return properties;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getConnectionUrl()
+ */
+ @Override
+ public String getConnectionUrl() {
+ return connectionPrefix + ":" + databaseName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDatabaseLoginName()
+ */
+ @Override
+ public String getDatabaseLoginName() {
+ return databaseLoginName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDatabaseName()
+ */
+ @Override
+ public String getDatabaseName() {
+ return databaseName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDriver()
+ */
+ @Override
+ public String getDriver() {
+ return driver;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getId()
+ */
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#isProduction()
+ */
+ @Override
+ public boolean isProduction() {
+ return isProduction;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseInfoManager.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseInfoManager.java
new file mode 100644
index 00000000000..fe0c983be07
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DatabaseInfoManager.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.framework.db.connection;
+
+import java.io.IOException;
+import java.io.InputStream;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.db.connection.internal.parser.DbConfigParser;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class DatabaseInfoManager {
+
+ private DatabaseInfoManager() {
+ }
+
+ public static IDatabaseInfo getDefault() throws OseeDataStoreException {
+ try {
+ return InternalActivator.getConnectionInfos().getSelectedDatabaseInfo();
+ } catch (InterruptedException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public static IDatabaseInfo getDataStoreById(String id) throws OseeDataStoreException {
+ try {
+ return InternalActivator.getConnectionInfos().getDatabaseInfo(id);
+ } catch (InterruptedException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public static IDatabaseInfo[] readFromXml(InputStream inputStream) throws OseeCoreException {
+ try {
+ Document document = Jaxp.readXmlDocument(inputStream);
+ Element rootElement = document.getDocumentElement();
+ return DbConfigParser.parse(rootElement);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DbTransaction.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DbTransaction.java
new file mode 100644
index 00000000000..19627b3757f
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/DbTransaction.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.framework.db.connection;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * This abstract class provides a uniform way of executing database transactions. It handles exceptions ensuring that
+ * transactions are processed in the correct order and roll-backs are performed whenever errors are detected.
+ *
+ * @author Roberto E. Escobar
+ */
+public abstract class DbTransaction {
+
+ /**
+ * Transaction Constructor
+ *
+ * @throws OseeCoreException TODO
+ */
+ public DbTransaction() throws OseeCoreException {
+ OseeDbConnection.reportTxCreation(this);
+ }
+
+ /**
+ * Gets the name of this transaction. This is provided mainly for logging purposes.
+ *
+ * @return String transaction class Name
+ */
+ protected String getTxName() {
+ return this.getClass().getCanonicalName();
+ }
+
+ /**
+ * This template method calls {@link #handleTxWork} which is provided by child classes. This method handles
+ * roll-backs and exception handling to prevent transactions from being left in an incorrect state.
+ *
+ * @throws Exception
+ */
+ public void execute() throws OseeCoreException {
+ execute(OseeDbConnection.getConnection());
+ }
+
+ private void execute(OseeConnection connection) throws OseeCoreException {
+ boolean initialAutoCommit = true;
+ OseeCoreException saveException = null;
+ try {
+ OseeLog.log(InternalActivator.class, Level.FINEST, String.format("Start Transaction: [%s]", getTxName()));
+ OseeDbConnection.reportTxStart(this);
+
+ initialAutoCommit = connection.getAutoCommit();
+ connection.setAutoCommit(false);
+ ConnectionHandler.deferConstraintChecking(connection);
+ handleTxWork(connection);
+
+ connection.commit();
+ OseeLog.log(InternalActivator.class, Level.FINEST, String.format("End Transaction: [%s]", getTxName()));
+ } catch (Exception ex) {
+ connection.rollback();
+ connection.destroy();
+ handleTxException(ex);
+ if (ex instanceof OseeCoreException) {
+ saveException = (OseeCoreException) ex;
+ } else {
+ saveException = new OseeWrappedException(ex);
+ }
+ } finally {
+ try {
+ if (!connection.isClosed()) {
+ connection.setAutoCommit(initialAutoCommit);
+ connection.close();
+ }
+ OseeDbConnection.reportTxEnd(this);
+ handleTxFinally();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, ex);
+ if (saveException == null) {
+ saveException = ex;
+ }
+ }
+ if (saveException != null) {
+ throw saveException;
+ }
+ }
+ }
+
+ /**
+ * Provides the transaction's work implementation.
+ *
+ * @param connection
+ * @throws OseeCoreException
+ */
+ protected abstract void handleTxWork(OseeConnection connection) throws OseeCoreException;
+
+ /**
+ * When an exception is detected during transaction processing, the exception is caught and passed to this method.
+ * This convenience method is provided so child classes have access to the exception. <br/>
+ * <b>Override to handle transaction exception</b>
+ *
+ * @param ex
+ * @throws Exception
+ */
+ protected void handleTxException(Exception ex) {
+ }
+
+ /**
+ * This convenience method is provided in case child classes have a portion of code that needs to execute always at
+ * the end of the transaction, regardless of exceptions. <br/>
+ * <b>Override to add additional code to finally block</b>
+ *
+ * @throws Exception
+ */
+ protected void handleTxFinally() throws OseeCoreException {
+ // override to add additional code to finally
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IApplicationDatabaseInfoProvider.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IApplicationDatabaseInfoProvider.java
new file mode 100644
index 00000000000..6f044dce653
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IApplicationDatabaseInfoProvider.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.framework.db.connection;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IApplicationDatabaseInfoProvider {
+
+ public IDatabaseInfo getDatabaseInfo() throws OseeDataStoreException;
+
+ public int getPriority();
+
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IConnection.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IConnection.java
new file mode 100644
index 00000000000..5a08c1152a1
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IConnection.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.framework.db.connection;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IConnection {
+ Connection getConnection(Properties properties, String connectionURL) throws ClassNotFoundException, SQLException;
+
+ String getDriver();
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDatabaseInfo.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDatabaseInfo.java
new file mode 100644
index 00000000000..a60e337507d
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDatabaseInfo.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.framework.db.connection;
+
+import java.util.Properties;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IDatabaseInfo {
+
+ String getId();
+
+ String getDatabaseName();
+
+ String getDatabaseLoginName();
+
+ String getDriver();
+
+ String getConnectionUrl();
+
+ Properties getConnectionProperties();
+
+ boolean isProduction();
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDbConnectionInformationContributor.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDbConnectionInformationContributor.java
new file mode 100644
index 00000000000..0be1f5b2719
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/IDbConnectionInformationContributor.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.framework.db.connection;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IDbConnectionInformationContributor {
+ IDatabaseInfo[] getDbInformation() throws Exception;
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnection.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnection.java
new file mode 100644
index 00000000000..ac4ce1b05d2
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnection.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.db.connection;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+public class OseeConnection {
+ final static private long timeout = 60000;
+ private OseeConnectionPool pool;
+ private Connection conn;
+ private volatile boolean inuse;
+ private long lastUsedTime;
+
+ OseeConnection(Connection conn, OseeConnectionPool pool) {
+ this.conn = conn;
+ this.pool = pool;
+ this.inuse = true;
+ this.lastUsedTime = 0;
+ }
+
+ public void close() {
+ pool.returnConnection(this);
+ }
+
+ public boolean isClosed() throws OseeDataStoreException {
+ try {
+ return conn.isClosed();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public boolean isStale() {
+ return !inUse() && getLastUse() + timeout < System.currentTimeMillis();
+ }
+
+ public DatabaseMetaData getMetaData() throws OseeDataStoreException {
+ try {
+ return conn.getMetaData();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ PreparedStatement prepareStatement(String sql) throws SQLException {
+ return conn.prepareStatement(sql);
+ }
+
+ CallableStatement prepareCall(String sql) throws SQLException {
+ return conn.prepareCall(sql);
+ }
+
+ synchronized boolean lease() {
+ if (inuse) {
+ return false;
+ } else {
+ inuse = true;
+ return true;
+ }
+ }
+
+ void destroy() throws OseeDataStoreException {
+ try {
+ conn.close();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ pool.removeConnection(this);
+ }
+
+ boolean inUse() {
+ return inuse;
+ }
+
+ long getLastUse() {
+ return lastUsedTime;
+ }
+
+ void expireLease() {
+ inuse = false;
+ lastUsedTime = System.currentTimeMillis();
+ }
+
+ void setAutoCommit(boolean autoCommit) throws OseeDataStoreException {
+ try {
+ conn.setAutoCommit(autoCommit);
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ boolean getAutoCommit() throws SQLException {
+ return conn.getAutoCommit();
+ }
+
+ void commit() throws SQLException {
+ conn.commit();
+ }
+
+ void rollback() throws OseeDataStoreException {
+ try {
+ conn.rollback();
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnectionPool.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnectionPool.java
new file mode 100644
index 00000000000..cc9d8a89249
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeConnectionPool.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.db.connection;
+
+import java.sql.Connection;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+class OseeConnectionPool {
+ private final List<OseeConnection> connections = new CopyOnWriteArrayList<OseeConnection>();
+ private final String dbDriver;
+ private final String dbUrl;
+ private final Properties properties;
+
+ /**
+ * @param dbInformation
+ */
+ public OseeConnectionPool(IDatabaseInfo databaseInfo) {
+ this(databaseInfo.getDriver(), databaseInfo.getConnectionUrl(), databaseInfo.getConnectionProperties());
+ }
+
+ public OseeConnectionPool(String dbDriver, String dbUrl, Properties properties) {
+ this.dbDriver = dbDriver;
+ this.dbUrl = dbUrl;
+ this.properties = properties;
+ }
+
+ public synchronized boolean hasOpenConnection() {
+ return connections.size() > 0;
+ }
+
+ /**
+ * at a minimum this should be called on jvm shutdown
+ */
+ public synchronized void closeConnections() {
+ for (OseeConnection connection : connections) {
+ connection.close();
+ }
+ connections.clear();
+ }
+
+ synchronized void removeConnection(OseeConnection conn) {
+ connections.remove(conn);
+ OseeLog.log(InternalActivator.class, Level.INFO, String.format(
+ "removeConnection - %s - connection pool size [%s]", dbUrl, connections.size()));
+ }
+
+ public synchronized OseeConnection getConnection() throws OseeDataStoreException {
+ for (OseeConnection connection : connections) {
+ if (connection.lease()) {
+ return connection;
+ }
+ }
+
+ try {
+ OseeConnection connection = getOseeConnection();
+ connections.add(connection);
+ OseeLog.log(InternalActivator.class, Level.INFO, String.format(
+ "getConnection - %s - connection pool size [%s]", dbUrl, connections.size()));
+ return connection;
+ } catch (Throwable th) {
+ throw new OseeDataStoreException("Unable to get a database connection: ", th);
+ }
+ }
+
+ private OseeConnection getOseeConnection() throws Exception {
+ IConnection connectionFactory = InternalActivator.getConnectionFactory().get(dbDriver);
+ Connection connection = connectionFactory.getConnection(properties, dbUrl);
+ connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ return new OseeConnection(connection, this);
+ }
+
+ synchronized void returnConnection(OseeConnection connection) {
+ try {
+ if (connection.isClosed()) {
+ removeConnection(connection);
+ } else {
+ connection.expireLease();
+ }
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, ex);
+ removeConnection(connection);
+ }
+ }
+
+ synchronized void releaseUneededConnections() throws OseeDataStoreException {
+ for (OseeConnection connection : connections) {
+ if (connection.isStale()) {
+ connection.destroy();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeDbConnection.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeDbConnection.java
new file mode 100644
index 00000000000..55350d1fc87
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/OseeDbConnection.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.framework.db.connection;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.db.connection.internal.TransactionMonitor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeDbConnection {
+ private static final Timer timer = new Timer();
+ private static final Map<String, OseeConnectionPool> dbInfoToPools = new HashMap<String, OseeConnectionPool>();
+ private static final TransactionMonitor txMonitor = new TransactionMonitor();
+
+ public static boolean hasOpenConnection() throws OseeDataStoreException {
+ IDatabaseInfo databaseInfo = getDatabaseInfoProvider();
+ if (databaseInfo == null) {
+ throw new OseeDataStoreException("Unable to get connection - database info was null.");
+ }
+ OseeConnectionPool pool = dbInfoToPools.get(databaseInfo.getId());
+ if (pool == null) {
+ return false;
+ }
+ return pool.hasOpenConnection();
+ }
+
+ public static OseeConnection getConnection() throws OseeDataStoreException {
+ return getConnection(getDatabaseInfoProvider());
+ }
+
+ public static OseeConnection getConnection(IDatabaseInfo databaseInfo) throws OseeDataStoreException {
+ if (databaseInfo == null) {
+ throw new OseeDataStoreException("Unable to get connection - database info was null.");
+ }
+ OseeConnectionPool pool = dbInfoToPools.get(databaseInfo.getId());
+ if (pool == null) {
+ pool =
+ new OseeConnectionPool(databaseInfo.getDriver(), databaseInfo.getConnectionUrl(),
+ databaseInfo.getConnectionProperties());
+ dbInfoToPools.put(databaseInfo.getId(), pool);
+ timer.schedule(new StaleConnectionCloser(pool), 900000, 900000);
+ }
+ return pool.getConnection();
+ }
+
+ private static IDatabaseInfo getDatabaseInfoProvider() throws OseeDataStoreException {
+ return InternalActivator.getApplicationDatabaseProvider().getDatabaseInfo();
+ }
+
+ public static void reportTxStart(final DbTransaction transaction) throws OseeWrappedException, OseeStateException {
+ txMonitor.reportTxStart(transaction);
+ }
+
+ public static void reportTxEnd(final DbTransaction transaction) throws OseeWrappedException, OseeStateException {
+ txMonitor.reportTxEnd(transaction);
+ }
+
+ public static void reportTxCreation(final DbTransaction transaction) throws OseeWrappedException {
+ txMonitor.reportTxCreation(transaction);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/StaleConnectionCloser.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/StaleConnectionCloser.java
new file mode 100644
index 00000000000..fd006edbce4
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/StaleConnectionCloser.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.db.connection;
+
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class StaleConnectionCloser extends TimerTask {
+ private final OseeConnectionPool connectionPool;
+
+ /**
+ * @param connectionPool
+ */
+ public StaleConnectionCloser(OseeConnectionPool connectionPool) {
+ super();
+ this.connectionPool = connectionPool;
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.TimerTask#run()
+ */
+ @Override
+ public void run() {
+ try {
+ connectionPool.releaseUneededConnections();
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/KeyedLevelManager.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/KeyedLevelManager.java
new file mode 100644
index 00000000000..776a16fb332
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/KeyedLevelManager.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.framework.db.connection.core;
+
+import java.util.Stack;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * Keeps track of nested calls by tracking start keys and confirming them upon the end of the level.<br>
+ * <br>
+ * Methods that may be extended
+ * <ul>
+ * <li>startTransactionLevel</li>
+ * <li>endTransactionLevel</li>
+ * </ul>
+ * Methods that may be reimplemented
+ * <ul>
+ * <li>onInitialEntry</li>
+ * <li>onExitLevelError</li>
+ * <li>onLastExit</li>
+ * </ul>
+ *
+ * @author Robert A. Fisher
+ */
+public class KeyedLevelManager {
+ private final Stack<KeyLevel> callKeyQueue;
+
+ private final class KeyLevel {
+ private Object key;
+ private boolean isProcessed;
+
+ private KeyLevel(Object key) {
+ this.key = key;
+ this.isProcessed = false;
+ }
+
+ private boolean isProcessed() {
+ return isProcessed;
+ }
+
+ private void setIsProcessed(boolean isProcessed) {
+ this.isProcessed = isProcessed;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return key.equals(obj);
+ }
+ }
+
+ public KeyedLevelManager() {
+ this.callKeyQueue = new Stack<KeyLevel>();
+ }
+
+ /**
+ * Marks the start of an abstract level. If the nesting level for this manager is zero then this will initiate a new
+ * series, otherwise this will be included in the series that this manager is already maintaining.
+ *
+ * @param key An object for the manager to track this level. This will need to be passed to
+ * <code>endTransactionLevel</code> when the calling method is done.
+ * @see KeyedLevelManager#endTransactionLevel(Object)
+ */
+ public boolean startTransactionLevel(Object key) throws OseeDataStoreException {
+ if (key == null) throw new IllegalArgumentException("key must not be null");
+ if (isValid(key)) throw new IllegalArgumentException("The provided key is already in use for this manager");
+
+ boolean initialEntry = !inLevel();
+ callKeyQueue.push(new KeyLevel(key));
+
+ if (initialEntry) {
+ onInitialEntry();
+ }
+
+ return initialEntry;
+ }
+
+ /**
+ * Re-implement this method to provide functionality upon initial entry. The default implementation does nothing.
+ *
+ * @throws OseeDataStoreException TODO
+ */
+ protected void onInitialEntry() throws OseeDataStoreException {
+ }
+
+ /**
+ * Marks the end of an abstract level. If the nesting level for this manager is one then this will finish the series,
+ * otherwise this will be included in the series that this manager is already maintaining.
+ *
+ * @param key An object for the manager to track this level. This must be the same key that was passed to
+ * <code>startTransactionLevel</code>.
+ * @see KeyedLevelManager#startTransactionLevel(Object)
+ */
+ public void endTransactionLevel(Object key) throws OseeDataStoreException {
+ if (key == null) throw new IllegalArgumentException("key must not be null");
+ if (true != isValid(key)) throw new IllegalArgumentException("The provided key is not known by this manager");
+
+ try {
+ // Check for an unclosed transaction level. This marks abnormal execution from a prior
+ // calling method.
+ if (true != callKeyQueue.pop().equals(key)) {
+ onExitLevelError();
+
+ // Clean up until the key so that later methods can register as normal.
+ while (true != callKeyQueue.pop().equals(key))
+ ;
+
+ throw new OseeDataStoreException("A transaction level was not closed");
+ }
+ } finally {
+ // Check for the end of the series
+ if (callKeyQueue.isEmpty()) {
+ onLastExit();
+ }
+ }
+ }
+
+ public void setTransactionLevelSuccess(Object key) {
+ if (key == null) throw new IllegalArgumentException("key must not be null");
+ if (true != isValid(key)) throw new IllegalArgumentException("The provided key is not known by this manager");
+
+ if (false != callKeyQueue.peek().equals(key)) {
+ callKeyQueue.peek().setIsProcessed(true);
+ }
+ }
+
+ public boolean isTransactionLevelSuccess(Object key) {
+ if (key == null) throw new IllegalArgumentException("key must not be null");
+ if (true != isValid(key)) throw new IllegalArgumentException("The provided key is not known by this manager");
+
+ boolean toReturn = false;
+ if (false != callKeyQueue.peek().equals(key)) {
+ toReturn = callKeyQueue.peek().isProcessed();
+ }
+ return toReturn;
+ }
+
+ /**
+ * Reimplement to provide functionality when a level is exited abnormally from the wrong key being provided. The
+ * default implementation does nothing.
+ */
+ protected void onExitLevelError() {
+ }
+
+ /**
+ * Reimplement to provide funtionality when a full series of levels have been exited. The default implementation does
+ * nothing.
+ *
+ * @throws OseeDataStoreException TODO
+ */
+ protected void onLastExit() throws OseeDataStoreException {
+ }
+
+ /**
+ * @return The current nesting level for the transaction.
+ */
+ public final int getNestingLevel() {
+ return callKeyQueue.size();
+ }
+
+ /**
+ * @return Whether this manager is already handling a level.
+ */
+ public final boolean inLevel() {
+ return !callKeyQueue.isEmpty();
+ }
+
+ /**
+ * @return Whether this manager is already handling a series.
+ */
+ public final boolean inTransaction() {
+ return !callKeyQueue.isEmpty();
+ }
+
+ private boolean isValid(Object key) {
+ boolean toReturn = false;
+ for (int index = 0; index < callKeyQueue.size(); index++) {
+ if (callKeyQueue.get(index).equals(key)) {
+ toReturn = true;
+ break;
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/ResultSetProcessor.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/ResultSetProcessor.java
new file mode 100644
index 00000000000..65d696c0300
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/ResultSetProcessor.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.framework.db.connection.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Date;
+import java.sql.Timestamp;
+import java.sql.Types;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.IVariantData;
+import org.eclipse.osee.framework.jdk.core.type.VariantData;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ResultSetProcessor {
+ public static IVariantData parse(ConnectionHandlerStatement chStmt) throws OseeDataStoreException, OseeWrappedException {
+ IVariantData toReturn = new VariantData();
+ int numberOfColumns = chStmt.getColumnCount() + 1;
+ for (int index = 1; index < numberOfColumns; index++) {
+ int columnIndex = index;
+ int type = chStmt.getColumnType(columnIndex);
+ String name = chStmt.getColumnName(columnIndex);
+ // Store name - all upper case
+ String upperCasedName = name.toUpperCase();
+ switch (type) {
+ case Types.CLOB:
+ case Types.BINARY:
+ InputStream inputStream = chStmt.getAsciiStream(name);
+ toReturn.put(upperCasedName, streamToByteArray(inputStream));
+ break;
+ case Types.BLOB:
+ InputStream blobStream = chStmt.getBinaryStream(name);
+ toReturn.put(upperCasedName, streamToByteArray(blobStream));
+ break;
+ case Types.TIMESTAMP:
+ Timestamp timeStamp = chStmt.getTimestamp(name);
+ if (timeStamp != null) {
+ toReturn.put(upperCasedName, timeStamp.getTime());
+ }
+ break;
+ case Types.DATE:
+ Date date = chStmt.getDate(name);
+ if (date != null) {
+ toReturn.put(upperCasedName, date.getTime());
+ }
+ break;
+ default:
+ try {
+ String value = chStmt.getString(name);
+ if (Strings.isValid(value) != false) {
+ value = value.trim();
+ }
+ toReturn.put(upperCasedName, chStmt.getString(name));
+ } catch (OseeDataStoreException ex) {
+ String typeName = chStmt.getColumnTypeName(columnIndex);
+ throw new OseeDataStoreException(getErrorMessage(name, typeName), ex);
+ }
+ break;
+ }
+ }
+ return toReturn;
+ }
+
+ private static String getErrorMessage(String name, String typeName) {
+ return String.format("Unable to convert [%s] of raw type [%s] to string.", name, typeName);
+ }
+
+ private static byte[] streamToByteArray(InputStream inputStream) throws OseeWrappedException {
+ byte[] toReturn = new byte[0];
+ if (inputStream != null) {
+ try {
+ toReturn = Lib.inputStreamToBytes(inputStream);
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/RsetProcessor.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/RsetProcessor.java
new file mode 100644
index 00000000000..5bda428f612
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/RsetProcessor.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.framework.db.connection.core;
+
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface RsetProcessor<T> {
+ public T process(ConnectionHandlerStatement chStmt) throws OseeCoreException;
+
+ public boolean validate(T item);
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/SequenceManager.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/SequenceManager.java
new file mode 100644
index 00000000000..bc2982a2671
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/SequenceManager.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.db.connection.core;
+
+import java.util.HashMap;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SequenceManager {
+ private static final String QUERY_SEQUENCE = "SELECT last_sequence FROM osee_sequence WHERE sequence_name = ?";
+ private static final String INSERT_SEQUENCE =
+ "INSERT INTO osee_sequence (last_sequence, sequence_name) VALUES (?,?)";
+ private static final String UPDATE_SEQUENCE =
+ "UPDATE osee_sequence SET last_sequence = ? WHERE sequence_name = ? AND last_sequence = ?";
+
+ public static final String ART_ID_SEQ = "SKYNET_ART_ID_SEQ";
+ public static final String ENUM_TYPE_ID_SEQ = "SKYNET_ENUM_TYPE_ID_SEQ";
+ public static final String ART_TYPE_ID_SEQ = "SKYNET_ART_TYPE_ID_SEQ";
+ public static final String ATTR_BASE_TYPE_ID_SEQ = "SKYNET_ATTR_BASE_TYPE_ID_SEQ";
+ public static final String ATTR_PROVIDER_TYPE_ID_SEQ = "SKYNET_ATTR_PROVIDER_TYPE_ID_SEQ";
+ public static final String ATTR_ID_SEQ = "SKYNET_ATTR_ID_SEQ";
+ public static final String ATTR_TYPE_ID_SEQ = "SKYNET_ATTR_TYPE_ID_SEQ";
+ public static final String FACTORY_ID_SEQ = "SKYNET_FACTORY_ID_SEQ";
+ public static final String BRANCH_ID_SEQ = "SKYNET_BRANCH_ID_SEQ";
+ public static final String REL_LINK_TYPE_ID_SEQ = "SKYNET_REL_LINK_TYPE_ID_SEQ";
+ public static final String REL_LINK_ID_SEQ = "SKYNET_REL_LINK_ID_SEQ";
+ public static final String GAMMA_ID_SEQ = "SKYNET_GAMMA_ID_SEQ";
+ public static final String TRANSACTION_ID_SEQ = "SKYNET_TRANSACTION_ID_SEQ";
+ public static final String IMPORT_ID_SEQ = "SKYNET_IMPORT_ID_SEQ";
+ public static final String IMPORT_MAPPED_INDEX_SEQ = "SKYNET_IMPORT_MAPPED_INDEX_SEQ";
+ public static final String TTE_SESSION_SEQ = "TTE_SESSION_SEQ";
+
+ public static final String[] sequenceNames =
+ new String[] {ART_ID_SEQ, ENUM_TYPE_ID_SEQ, ART_TYPE_ID_SEQ, ATTR_BASE_TYPE_ID_SEQ, ATTR_PROVIDER_TYPE_ID_SEQ,
+ ATTR_ID_SEQ, ATTR_TYPE_ID_SEQ, FACTORY_ID_SEQ, BRANCH_ID_SEQ, REL_LINK_TYPE_ID_SEQ, REL_LINK_ID_SEQ,
+ GAMMA_ID_SEQ, TRANSACTION_ID_SEQ, IMPORT_ID_SEQ, IMPORT_MAPPED_INDEX_SEQ, TTE_SESSION_SEQ};
+
+ private final static HashMap<String, SequenceRange> sequences = new HashMap<String, SequenceRange>(30);
+
+ private SequenceManager() {
+ }
+
+ private static SequenceRange getRange(String sequenceName) {
+ SequenceRange range = sequences.get(sequenceName);
+ if (range == null) {
+ // do this to keep transaction id's sequential in the face of concurrent transaction by multiple users
+ range = new SequenceRange(!sequenceName.equals(TRANSACTION_ID_SEQ));
+ sequences.put(sequenceName, range);
+ }
+ return range;
+ }
+
+ public static synchronized long getNextSequence(String sequenceName) throws OseeDataStoreException {
+ SequenceRange range = getRange(sequenceName);
+ if (range.lastAvailable == 0) {
+ long lastValue = -1;
+ boolean gotSequence = false;
+ OseeConnection connection = OseeDbConnection.getConnection();
+ try {
+ while (!gotSequence) {
+ lastValue = ConnectionHandler.runPreparedQueryFetchLong(connection, -1, QUERY_SEQUENCE, sequenceName);
+ if (lastValue == -1) {
+ throw new OseeDataStoreException("Sequence name [" + sequenceName + "] was not found");
+ }
+ gotSequence =
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_SEQUENCE, lastValue + range.prefetchSize,
+ sequenceName, lastValue) == 1;
+ }
+ range.updateRange(lastValue);
+ } finally {
+ connection.close();
+ }
+ }
+ range.currentValue++;
+ if (range.currentValue == range.lastAvailable) {
+ range.lastAvailable = 0;
+ }
+ return range.currentValue;
+ }
+
+ public static void internalInitializeSequence(String sequenceName) throws OseeDataStoreException {
+ SequenceRange range = getRange(sequenceName);
+ range.lastAvailable = 0;
+ ConnectionHandler.runPreparedUpdate(INSERT_SEQUENCE, 0, sequenceName);
+ }
+
+ public static int getNextSessionId() throws OseeDataStoreException {
+ return (int) getNextSequence(TTE_SESSION_SEQ);
+ }
+
+ public static int getNextTransactionId() throws OseeDataStoreException {
+ return (int) getNextSequence(TRANSACTION_ID_SEQ);
+ }
+
+ public static int getNextArtifactId() throws OseeDataStoreException {
+ return (int) getNextSequence(ART_ID_SEQ);
+ }
+
+ public static int getNextOseeEnumTypeId() throws OseeDataStoreException {
+ return (int) getNextSequence(ENUM_TYPE_ID_SEQ);
+ }
+
+ public static int getNextGammaId() throws OseeDataStoreException {
+ return (int) getNextSequence(GAMMA_ID_SEQ);
+ }
+
+ public static int getNextArtifactTypeId() throws OseeDataStoreException {
+ return (int) getNextSequence(ART_TYPE_ID_SEQ);
+ }
+
+ public static int getNextAttributeBaseTypeId() throws OseeDataStoreException {
+ return (int) getNextSequence(ATTR_BASE_TYPE_ID_SEQ);
+ }
+
+ public static int getNextAttributeProviderTypeId() throws OseeDataStoreException {
+ return (int) getNextSequence(ATTR_PROVIDER_TYPE_ID_SEQ);
+ }
+
+ public static int getNextAttributeId() throws OseeDataStoreException {
+ return (int) getNextSequence(ATTR_ID_SEQ);
+ }
+
+ public static int getNextAttributeTypeId() throws OseeDataStoreException {
+ return (int) getNextSequence(ATTR_TYPE_ID_SEQ);
+ }
+
+ public static int getNextFactoryId() throws OseeDataStoreException {
+ return (int) getNextSequence(FACTORY_ID_SEQ);
+ }
+
+ public static int getNextBranchId() throws OseeDataStoreException {
+ return (int) getNextSequence(BRANCH_ID_SEQ);
+ }
+
+ public static int getNextRelationTypeId() throws OseeDataStoreException {
+ return (int) getNextSequence(REL_LINK_TYPE_ID_SEQ);
+ }
+
+ public static int getNextRelationId() throws OseeDataStoreException {
+ return (int) getNextSequence(REL_LINK_ID_SEQ);
+ }
+
+ public static int getNextImportId() throws OseeDataStoreException {
+ return (int) getNextSequence(IMPORT_ID_SEQ);
+ }
+
+ public static int getNextImportMappedIndexId() throws OseeDataStoreException {
+ return (int) getNextSequence(IMPORT_MAPPED_INDEX_SEQ);
+ }
+
+ private static final class SequenceRange {
+ private long currentValue;
+ private long lastAvailable;
+ private int prefetchSize;
+ private final boolean aggressiveFetch;
+
+ /**
+ * @param aggressiveFetch
+ */
+ public SequenceRange(boolean aggressiveFetch) {
+ super();
+ this.prefetchSize = 1;
+ this.aggressiveFetch = aggressiveFetch;
+ }
+
+ public void updateRange(long lastValue) {
+ currentValue = lastValue;
+ lastAvailable = lastValue + prefetchSize;
+
+ if (aggressiveFetch) {
+ prefetchSize *= 2; // next time grab twice as many
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/Query.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/Query.java
new file mode 100644
index 00000000000..d27c59e1d79
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/Query.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.framework.db.connection.core.query;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.RsetProcessor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.internal.InternalActivator;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class Query {
+
+ /**
+ * Builds a collection of items from an SQL statement from the basic DBConnection.
+ *
+ * @param collection The collection to add the objects to.
+ * @param sql The SQL statement to use to acquire a ResultSet.
+ * @param processor The RsetProcessor used for providing and validating items.
+ * @param <A> The type of object being placed into the collection.
+ * @throws OseeCoreException
+ */
+ @Deprecated
+ // all code that uses this is also Deprecated
+ public static <A extends Object> void acquireCollection(Collection<A> collection, RsetProcessor<A> processor, String sql, Object... data) throws OseeCoreException {
+ A item;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(sql, data);
+ while (chStmt.next()) {
+ try {
+ item = processor.process(chStmt);
+ if (processor.validate(item)) collection.add(item);
+ } catch (IllegalStateException ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE,
+ "Encountered Exception when trying to acquire a collection.", ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryLog.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryLog.java
new file mode 100644
index 00000000000..b35cee1a0ec
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryLog.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.framework.db.connection.core.query;
+
+import java.util.ArrayList;
+
+/**
+ * Configurable log to track query characteristics.
+ *
+ * @author Robert A. Fisher
+ */
+public class QueryLog {
+ private static QueryLog reference = null;
+ private ArrayList<QueryRecord> records;
+ private int maxRecords;
+
+ public static synchronized QueryLog getInstance() {
+ if (reference == null) {
+ reference = new QueryLog();
+ }
+
+ return reference;
+ }
+
+ private QueryLog() {
+ this.maxRecords = 200;
+ this.records = new ArrayList<QueryRecord>(maxRecords);
+ }
+
+ protected synchronized void add(QueryRecord record) {
+ if (record == null) throw new IllegalArgumentException("record can not be null");
+
+ if (records.size() < maxRecords) {
+ records.add(record);
+ }
+ }
+
+ /**
+ * @return the maxRecords
+ */
+ public int getMaxRecords() {
+ return maxRecords;
+ }
+
+ /**
+ * @param maxRecords the maxRecords to set
+ */
+ public void setMaxRecords(int maxRecords) {
+ if (maxRecords < 0) throw new IllegalArgumentException("maxRecords can not be negative");
+
+ if (maxRecords < this.maxRecords && records.size() > maxRecords) {
+ records.subList(maxRecords, records.size()).clear();
+ records.trimToSize();
+ }
+
+ this.maxRecords = maxRecords;
+ }
+
+ /**
+ * @return the records
+ */
+ public ArrayList<QueryRecord> getRecords() {
+ return records;
+ }
+
+ public boolean isFull() {
+ return records.size() >= maxRecords;
+ }
+
+ public void clear() {
+ records.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryRecord.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryRecord.java
new file mode 100644
index 00000000000..e89cf0cf6cc
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/query/QueryRecord.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.framework.db.connection.core.query;
+
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Interesting information from a query. These are automatically added to the QueryLog if it is not full.
+ *
+ * @author Robert A. Fisher
+ */
+public class QueryRecord {
+ private static final QueryLog log = QueryLog.getInstance();
+ private final Date date;
+ private final String sql;
+ private Object[] bindVariables;
+ private SQLException sqlException;
+ private Long runDurationMs;
+ private long startTime;
+
+ /**
+ * @param sql The sql text
+ */
+ public QueryRecord(String sql) {
+ this(sql, (Object[]) null);
+ }
+
+ /**
+ * Replaces all of the '?' characters with ':#' values, where # is in incrementing integer value starting at 1.
+ *
+ * @param sql The sql string to perform the replacement on.
+ */
+ private String replaceBindValues(String sql) {
+ int count = 1;
+
+ Matcher matcher = Pattern.compile("\\?").matcher(sql);
+ while (matcher.find()) {
+ sql = matcher.replaceFirst(":" + count++);
+ matcher.reset(sql);
+ }
+ return sql;
+ }
+
+ /**
+ * @param sql The sql text
+ * @param bindVariables The bind variables, if any
+ */
+ public QueryRecord(String sql, Object... bindVariablesLocal) {
+ if (sql == null) throw new IllegalArgumentException("sql can not be null");
+ this.date = new Date();
+ this.sql = replaceBindValues(sql);
+ this.bindVariables = new Object[bindVariablesLocal.length];
+ System.arraycopy(bindVariablesLocal, 0, bindVariables, 0, bindVariables.length);
+
+ for (int i = 0; i < bindVariables.length; i++) {
+ Object obj = bindVariables[i];
+ if (obj != null) {
+ if (obj instanceof String) {
+ String str = ((String) obj);
+ if (str.length() > 80) {
+ bindVariables[i] = str.substring(0, 80);
+ }
+ } else if (!(obj instanceof Date || obj instanceof Integer || obj instanceof Long || obj instanceof Double)) {
+ bindVariables[i] = "binary type";
+ } else {
+ bindVariables[i] = obj.toString();
+ }
+ }
+ }
+ log.add(this);
+ }
+
+ /**
+ * @return the runDurationMs
+ */
+ public Long getRunDurationMs() {
+ return runDurationMs;
+ }
+
+ /**
+ * Mark the start of the query being run
+ */
+ public void markStart() {
+ startTime = System.currentTimeMillis();
+ }
+
+ /**
+ * Mark the end of the query being run
+ */
+ public void markEnd() {
+ runDurationMs = System.currentTimeMillis() - startTime;
+ }
+
+ /**
+ * @return the sqlException
+ */
+ public SQLException getSqlException() {
+ return sqlException;
+ }
+
+ /**
+ * @param sqlException the sqlException to set
+ */
+ public void setSqlException(SQLException sqlException) {
+ this.sqlException = sqlException;
+ }
+
+ /**
+ * @return the bindVariables
+ */
+ public Object[] getBindVariables() {
+ return bindVariables;
+ }
+
+ /**
+ * @return the sql
+ */
+ public String getSql() {
+ return sql;
+ }
+
+ /**
+ * @return the date
+ */
+ public Date getDate() {
+ return date;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/LocalAliasTable.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/LocalAliasTable.java
new file mode 100644
index 00000000000..4674c455d50
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/LocalAliasTable.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.framework.db.connection.core.schema;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class LocalAliasTable extends Table {
+ private final String declarationName;
+
+ public LocalAliasTable(Table aliasedTable, String aliasName) {
+ super(aliasName);
+ this.declarationName = String.format("%s %s", aliasedTable.name, aliasName);
+ }
+
+ @Override
+ public String toString() {
+ return declarationName;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/SkynetDatabase.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/SkynetDatabase.java
new file mode 100644
index 00000000000..2541bde3cfb
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/SkynetDatabase.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.framework.db.connection.core.schema;
+
+/**
+ * Provides the ability to build the tables and sequences necessary for the Define tools to be able to work. This class
+ * is only intended for installation purposes, and is not to support general runtime needs.
+ *
+ * @author Robert A. Fisher
+ */
+public class SkynetDatabase {
+ public static final int RELATION_SIDE_NAME_SIZE = 50;
+
+ public static final Table ARTIFACT_TABLE = new Table("OSEE_ARTIFACT");
+ public static final Table ARTIFACT_VERSION_TABLE = new Table("OSEE_ARTIFACT_VERSION");
+ public static final Table ARTIFACT_TABLE_ACL = new Table("OSEE_ARTIFACT_ACL");
+ public static final Table TRANSACTIONS_TABLE = new Table("OSEE_TXS");
+ public static final Table REMOVED_TRANSACTIONS_TABLE = new Table("OSEE_REMOVED_TXS");
+ public static final Table TRANSACTION_DETAIL_TABLE = new Table("OSEE_TX_DETAILS");
+ public static final Table ARTIFACT_TYPE_TABLE = new Table("OSEE_ARTIFACT_TYPE");
+ public static final Table ARTIFACT_TYPE_TABLE_ACL = new Table("OSEE_ARTIFACT_TYPE_ACL");
+ public static final Table ATTRIBUTE_PROVIDER_TYPE_TABLE = new Table("OSEE_ATTRIBUTE_PROVIDER_TYPE");
+ public static final Table ATTRIBUTE_BASE_TYPE_TABLE = new Table("OSEE_ATTRIBUTE_BASE_TYPE");
+ public static final Table ATTRIBUTE_VERSION_TABLE = new Table("OSEE_ATTRIBUTE");
+ public static final Table ATTRIBUTE_TYPE_TABLE = new Table("OSEE_ATTRIBUTE_TYPE");
+ public static final Table ATTRIBUTE_TYPE_TABLE_ACL = new Table("OSEE_ATTRIBUTE_TYPE_ACL");
+ public static final Table RELATION_LINK_VERSION_TABLE = new Table("OSEE_RELATION_LINK");
+ public static final Table RELATION_LINK_TYPE_TABLE = new Table("OSEE_RELATION_LINK_TYPE");
+ public static final Table RELATION_LINK_TYPE_TABLE_ACL = new Table("OSEE_RELATION_LINK_TYPE_ACL");
+ public static final Table BRANCH_TABLE = new Table("OSEE_BRANCH");
+ public static final Table BRANCH_DEFINITIONS = new Table("OSEE_BRANCH_DEFINITIONS");
+ public static final Table BRANCH_TABLE_ACL = new Table("OSEE_BRANCH_ACL");
+
+ public static final Table BRANCH_DELETE_HELPER = new Table("OSEE_BRANCH_DELETE_HELPER");
+ public static final Table VALID_ATTRIBUTES_TABLE = new Table("OSEE_VALID_ATTRIBUTES");
+ public static final Table PERMISSION_TABLE = new Table("OSEE_PERMISSION");
+ public static final Table SEQUENCE_TABLE = new Table("OSEE_SEQUENCE");
+ public static final Table OSEE_INFO_TABLE = new Table("OSEE_INFO");
+
+ public static final Table OSEE_MERGE_TABLE = new Table("OSEE_MERGE");
+ public static final Table OSEE_CONFLICT_TABLE = new Table("OSEE_CONFLICT");
+
+ public static final String TXD_COMMENT = "OSEE_COMMENT";
+
+ private static final View[] skynetViews = new View[] {};
+
+ public static View[] getSkynetViews() {
+ return skynetViews;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/Table.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/Table.java
new file mode 100644
index 00000000000..c26d1d63bf1
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/Table.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.db.connection.core.schema;
+
+public class Table {
+ protected String name;
+
+ //// private static final String aliassyntax;
+ //// private static final Matcher matcher = Pattern.compile(" *PUT_TABLE_ALIAS_HERE *").matcher("");
+ //
+ // static {
+ // aliassyntax = SupportedDatabase.getDatabaseType() == SupportedDatabase.postgresql ? " as " : " ";
+ // }
+
+ // /**
+ // * Remove all PUT_TABLE_ALIAS_HERE tags and replace with table alias specific to this DB
+ // *
+ // * @param sql string with replace tag PUT_TABLE_ALIAS_HERE embedded
+ // * @return sql with corresponding table alias replaced
+ // */
+ // public static String generateTableAliasedSql(String sql) {
+ // matcher.reset(sql);
+ // return matcher.replaceAll(aliassyntax);
+ // }
+
+ /**
+ * @param name
+ */
+ public Table(String name) {
+ this.name = name;
+ }
+
+ public String columnsForInsert(String... cols) {
+ StringBuilder strB = new StringBuilder(200);
+ strB.append(name);
+ strB.append(" (");
+ buildColumnsList(strB, false, cols);
+ strB.append(") ");
+ createValuesList(strB, cols.length);
+ return strB.toString();
+ }
+
+ public String columns(String... columns) {
+ StringBuilder strB = new StringBuilder(200);
+ buildColumnsList(strB, true, columns);
+ return strB.toString();
+ }
+
+ public String column(String columnName) {
+ StringBuilder strB = new StringBuilder(60);
+ qualifyColumnName(strB, columnName);
+ return strB.toString();
+ }
+
+ // public String max(String columnName, String alias) {
+ // return function("max", columnName, alias);
+ // }
+
+ // public String max(String columnName) {
+ // return function("max", columnName, null);
+ // }
+ //
+ // public String min(String columnName, String alias) {
+ // return function("min", columnName, alias);
+ // }
+ //
+ // public String min(String columnName) {
+ // return function("min", columnName, null);
+ // }
+
+ // public static String alias(String sql, String alias) {
+ // StringBuilder strB = new StringBuilder();
+ // strB.append(sql);
+ // alias(strB, alias);
+ // return strB.toString();
+ // }
+ //
+ // private static void alias(StringBuilder strB, String alias) {
+ // strB.append(aliassyntax);
+ // strB.append(alias);
+ // }
+
+ // private String function(String function, String columnName, String alias) {
+ // StringBuilder strB = new StringBuilder(60);
+ // strB.append(function);
+ // strB.append("(");
+ // qualifyColumnName(strB, columnName);
+ // strB.append(")");
+ // if (alias != null && !alias.equals("")) {
+ // alias(strB, alias);
+ // }
+ // return strB.toString();
+ // }
+
+ private void createValuesList(StringBuilder strB, int parameterCount) {
+ strB.append("VALUES (");
+ for (int i = 1; i < parameterCount; i++) {
+ strB.append("?, ");
+ }
+ strB.append("?)");
+ }
+
+ private void buildColumnsList(StringBuilder strB, boolean qualify, String... columns) {
+ for (int i = 0; i < columns.length - 1; i++) {
+ if (qualify)
+ qualifyColumnName(strB, columns[i]);
+ else
+ strB.append(columns[i]);
+ strB.append(", ");
+ }
+ if (qualify)
+ qualifyColumnName(strB, columns[columns.length - 1]);
+ else
+ strB.append(columns[columns.length - 1]);
+ }
+
+ private void qualifyColumnName(StringBuilder strB, String columnName) {
+ strB.append(name);
+ strB.append(".");
+ strB.append(columnName);
+ }
+
+ public String toString() {
+ return name;
+ }
+
+ public String join(Table joinTable, String joinColumn) {
+ return column(joinColumn) + "=" + joinTable.column(joinColumn);
+ }
+
+ // public LocalAliasTable aliasAs(String aliasName) {
+ // return new LocalAliasTable(this, aliasName);
+ // }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/View.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/View.java
new file mode 100644
index 00000000000..2492c7d88d7
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/schema/View.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.db.connection.core.schema;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class View extends Table {
+ private final String definition;
+
+ /**
+ * @param name
+ * @param definition
+ */
+ public View(String name, String definition) {
+ super(name);
+ this.definition = definition;
+ }
+
+ public String getDefinition() {
+ return definition;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/DbTransactionEventCompleted.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/DbTransactionEventCompleted.java
new file mode 100644
index 00000000000..a137b198adb
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/DbTransactionEventCompleted.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.db.connection.core.transaction;
+
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class DbTransactionEventCompleted implements IDbTransactionEvent {
+
+ private boolean committed;
+
+ public DbTransactionEventCompleted(boolean committed) {
+ this.committed = committed;
+ }
+
+ /**
+ * @return the hasCommitted
+ */
+ public boolean isCommitted() {
+ return committed;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionEvent.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionEvent.java
new file mode 100644
index 00000000000..34cb8578d67
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionEvent.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.framework.db.connection.core.transaction;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public interface IDbTransactionEvent {
+
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionListener.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionListener.java
new file mode 100644
index 00000000000..510881833c8
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/core/transaction/IDbTransactionListener.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.framework.db.connection.core.transaction;
+
+
+/**
+ * @author Jeff C. Phillips
+ */
+public interface IDbTransactionListener {
+
+ public void onEvent(IDbTransactionEvent event);
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ArtifactDoesNotExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ArtifactDoesNotExist.java
new file mode 100644
index 00000000000..8a61bd9c674
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ArtifactDoesNotExist.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.framework.db.connection.exception;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactDoesNotExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public ArtifactDoesNotExist(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/AttributeDoesNotExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/AttributeDoesNotExist.java
new file mode 100644
index 00000000000..c4428fa8845
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/AttributeDoesNotExist.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.framework.db.connection.exception;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AttributeDoesNotExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public AttributeDoesNotExist(String message) {
+ super(message);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchDoesNotExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchDoesNotExist.java
new file mode 100644
index 00000000000..42d01435872
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchDoesNotExist.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.framework.db.connection.exception;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BranchDoesNotExist extends OseeCoreException {
+ private static final long serialVersionUID = -6197324585250025613L;
+
+ /**
+ * @param message
+ */
+ public BranchDoesNotExist(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public BranchDoesNotExist(String message, Throwable cause) {
+ super(message, cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchMergeException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchMergeException.java
new file mode 100644
index 00000000000..9f74b0c264e
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/BranchMergeException.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.framework.db.connection.exception;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class BranchMergeException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public BranchMergeException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ConflictDetectionException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ConflictDetectionException.java
new file mode 100644
index 00000000000..9cfc03dc118
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/ConflictDetectionException.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.framework.db.connection.exception;
+
+
+/**
+ * @author Theron Virgin
+ */
+public class ConflictDetectionException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public ConflictDetectionException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/InvalidTaggerException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/InvalidTaggerException.java
new file mode 100644
index 00000000000..7c7cae5f1c1
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/InvalidTaggerException.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.framework.db.connection.exception;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InvalidTaggerException extends OseeCoreException {
+ private static final long serialVersionUID = 1L;
+
+ public InvalidTaggerException() {
+ super("");
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MergeChangesInArtifactException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MergeChangesInArtifactException.java
new file mode 100644
index 00000000000..1b8e36029dd
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MergeChangesInArtifactException.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.framework.db.connection.exception;
+
+
+/**
+ * @author Theron Virgin
+ */
+public class MergeChangesInArtifactException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public MergeChangesInArtifactException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleArtifactsExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleArtifactsExist.java
new file mode 100644
index 00000000000..190feebac71
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleArtifactsExist.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.framework.db.connection.exception;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MultipleArtifactsExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public MultipleArtifactsExist(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleAttributesExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleAttributesExist.java
new file mode 100644
index 00000000000..d1907393e23
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleAttributesExist.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.framework.db.connection.exception;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MultipleAttributesExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public MultipleAttributesExist(String message) {
+ super(message);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleBranchesExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleBranchesExist.java
new file mode 100644
index 00000000000..202b38df5a8
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/MultipleBranchesExist.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.framework.db.connection.exception;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MultipleBranchesExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public MultipleBranchesExist(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeAccessDeniedException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeAccessDeniedException.java
new file mode 100644
index 00000000000..fa2571eba0c
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeAccessDeniedException.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.framework.db.connection.exception;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeAccessDeniedException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public OseeAccessDeniedException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeArgumentException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeArgumentException.java
new file mode 100644
index 00000000000..70706fc7ad4
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeArgumentException.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.framework.db.connection.exception;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeArgumentException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public OseeArgumentException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeCoreException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeCoreException.java
new file mode 100644
index 00000000000..e82609dc707
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeCoreException.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.framework.db.connection.exception;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OseeCoreException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param message
+ */
+ public OseeCoreException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeCoreException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeCoreException(Throwable cause) {
+ super(cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeDataStoreException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeDataStoreException.java
new file mode 100644
index 00000000000..6154226943a
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeDataStoreException.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.framework.db.connection.exception;
+
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OseeDataStoreException extends OseeCoreException {
+ private static final long serialVersionUID = 7339636628746394923L;
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeDataStoreException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public OseeDataStoreException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeDataStoreException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeMultipleEnumTypesExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeMultipleEnumTypesExist.java
new file mode 100644
index 00000000000..706075fd279
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeMultipleEnumTypesExist.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.framework.db.connection.exception;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeMultipleEnumTypesExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public OseeMultipleEnumTypesExist(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeStateException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeStateException.java
new file mode 100644
index 00000000000..cab2880e093
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeStateException.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.framework.db.connection.exception;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeStateException extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public OseeStateException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeTypeDoesNotExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeTypeDoesNotExist.java
new file mode 100644
index 00000000000..d8bb5a58a12
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeTypeDoesNotExist.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.framework.db.connection.exception;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OseeTypeDoesNotExist extends OseeCoreException {
+
+ private static final long serialVersionUID = 1L;
+
+ public OseeTypeDoesNotExist(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeWrappedException.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeWrappedException.java
new file mode 100644
index 00000000000..432485142a4
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/OseeWrappedException.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.framework.db.connection.exception;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OseeWrappedException extends OseeCoreException {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param message
+ */
+ public OseeWrappedException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public OseeWrappedException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public OseeWrappedException(Throwable cause) {
+ super(cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/TransactionDoesNotExist.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/TransactionDoesNotExist.java
new file mode 100644
index 00000000000..a11cbce71ab
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/TransactionDoesNotExist.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.framework.db.connection.exception;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class TransactionDoesNotExist extends OseeCoreException {
+ private static final long serialVersionUID = -6197324585250025613L;
+
+ /**
+ * @param message
+ */
+ public TransactionDoesNotExist(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public TransactionDoesNotExist(String message, Throwable cause) {
+ super(message, cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserInDatabaseMultipleTimes.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserInDatabaseMultipleTimes.java
new file mode 100644
index 00000000000..d79e404c1ea
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserInDatabaseMultipleTimes.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.framework.db.connection.exception;
+
+
+/**
+ * @author Ryan D. Brooks
+ * @author Donald G. Dunne
+ */
+public class UserInDatabaseMultipleTimes extends OseeCoreException {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param message
+ */
+ public UserInDatabaseMultipleTimes(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public UserInDatabaseMultipleTimes(String message, Throwable cause) {
+ super(message, cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserNotInDatabase.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserNotInDatabase.java
new file mode 100644
index 00000000000..5838c4ad7b8
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/exception/UserNotInDatabase.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.framework.db.connection.exception;
+
+
+/**
+ * @author Ryan D. Brooks
+ * @author Donald G. Dunne
+ */
+public class UserNotInDatabase extends OseeCoreException {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param message
+ */
+ public UserNotInDatabase(String message) {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public UserNotInDatabase(String message, Throwable cause) {
+ super(message, cause);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SQL3DataType.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SQL3DataType.java
new file mode 100644
index 00000000000..25fcf484673
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SQL3DataType.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.framework.db.connection.info;
+
+import java.math.BigInteger;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum SQL3DataType {
+
+ BIT(java.sql.Types.BIT, Boolean.class),
+ TINYINT(java.sql.Types.TINYINT, Integer.class),
+ SMALLINT(java.sql.Types.SMALLINT, Integer.class),
+ INTEGER(java.sql.Types.INTEGER, Integer.class),
+ BIGINT(java.sql.Types.BIGINT, BigInteger.class),
+ FLOAT(java.sql.Types.FLOAT, Float.class),
+ REAL(java.sql.Types.REAL, Double.class),
+ DOUBLE(java.sql.Types.DOUBLE, Double.class),
+ NUMERIC(java.sql.Types.NUMERIC, Double.class),
+ DECIMAL(java.sql.Types.DECIMAL, Integer.class),
+ CHAR(java.sql.Types.CHAR, Character.class),
+ VARCHAR(java.sql.Types.VARCHAR, String.class),
+ LONGVARCHAR(java.sql.Types.LONGVARCHAR, String.class),
+ DATE(java.sql.Types.DATE, Date.class),
+ TIME(java.sql.Types.TIME, Time.class),
+ TIMESTAMP(java.sql.Types.TIMESTAMP, Timestamp.class),
+ BINARY(java.sql.Types.BINARY, Object.class),
+ VARBINARY(java.sql.Types.VARBINARY, Object.class),
+ LONGVARBINARY(java.sql.Types.LONGVARBINARY, Object.class),
+ NULL(java.sql.Types.NULL, Object.class),
+ OTHER(java.sql.Types.OTHER, Object.class),
+ JAVA_OBJECT(java.sql.Types.JAVA_OBJECT, Object.class),
+ DISTINCT(java.sql.Types.DISTINCT, Object.class),
+ STRUCT(java.sql.Types.STRUCT, Object.class),
+ ARRAY(java.sql.Types.ARRAY, Object.class),
+ BLOB(java.sql.Types.BLOB, Object.class),
+ CLOB(java.sql.Types.CLOB, Object.class),
+ REF(java.sql.Types.REF, Object.class),
+ DATALINK(java.sql.Types.DATALINK, Object.class),
+ BOOLEAN(java.sql.Types.BOOLEAN, Boolean.class);
+
+ private Class<?> javaClassEquivalent;
+ private int sqlTypeNumber;
+
+ private static HashMap<Integer, SQL3DataType> typeToEnum = new HashMap<Integer, SQL3DataType>();
+
+ private SQL3DataType(int sqlTypeNumber, Class<?> classEquiv) {
+ this.javaClassEquivalent = classEquiv;
+ this.sqlTypeNumber = sqlTypeNumber;
+ }
+
+ public int getSQLTypeNumber() {
+ return sqlTypeNumber;
+ }
+
+ public Class<?> getJavaEquivalentClass() {
+ return javaClassEquivalent;
+ }
+
+ public static SQL3DataType get(int type) {
+ if (typeToEnum.isEmpty()) {
+ for (SQL3DataType enumType : SQL3DataType.values()) {
+ typeToEnum.put(enumType.sqlTypeNumber, enumType);
+ }
+ }
+ return typeToEnum.get(type);
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SupportedDatabase.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SupportedDatabase.java
new file mode 100644
index 00000000000..46bb612e724
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/info/SupportedDatabase.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.framework.db.connection.info;
+
+import java.sql.SQLException;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+public enum SupportedDatabase {
+ oracle, derby, foxpro, mysql, postgresql;
+
+ public static SupportedDatabase getDatabaseType(OseeConnection connection) throws OseeDataStoreException {
+ try {
+ SupportedDatabase toReturn = null;
+ String dbName = connection.getMetaData().getDatabaseProductName();
+ String lowerCaseName = dbName.toLowerCase();
+ if (lowerCaseName.contains(SupportedDatabase.derby.toString())) {
+ toReturn = SupportedDatabase.derby;
+ } else if (lowerCaseName.contains(SupportedDatabase.oracle.toString())) {
+ toReturn = SupportedDatabase.oracle;
+ } else if (lowerCaseName.contains(SupportedDatabase.foxpro.toString())) {
+ toReturn = SupportedDatabase.foxpro;
+ } else if (lowerCaseName.contains(SupportedDatabase.mysql.toString())) {
+ toReturn = SupportedDatabase.mysql;
+ } else if (lowerCaseName.contains(SupportedDatabase.postgresql.toString())) {
+ toReturn = SupportedDatabase.postgresql;
+ } else {
+ throw new OseeDataStoreException("Unsupported database type: " + dbName);
+ }
+ return toReturn;
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public static SupportedDatabase getDatabaseType() throws OseeDataStoreException {
+ OseeConnection connection = OseeDbConnection.getConnection();
+ try {
+ return SupportedDatabase.getDatabaseType(connection);
+ } finally {
+ connection.close();
+ }
+ }
+
+ public static boolean isDatabaseType(SupportedDatabase dbType) throws OseeDataStoreException {
+ return getDatabaseType() == dbType;
+ }
+
+ public static boolean areHintsSupported() throws OseeDataStoreException {
+ try {
+ if (SupportedDatabase.isDatabaseType(oracle)) {
+ return ConnectionHandler.getMetaData().getDatabaseMajorVersion() > 10;
+ }
+ } catch (SQLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ return false;
+ }
+
+ public static String getComplementSql() throws OseeDataStoreException {
+ return isDatabaseType(oracle) ? "MINUS" : "EXCEPT";
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/ApplicationDatabaseManager.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/ApplicationDatabaseManager.java
new file mode 100644
index 00000000000..1968d8592a0
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/ApplicationDatabaseManager.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.framework.db.connection.internal;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ApplicationDatabaseManager implements IApplicationDatabaseManager {
+
+ private List<IApplicationDatabaseInfoProvider> applicationDatabaseInfoProvider;
+ private Object myWait;
+
+ public ApplicationDatabaseManager() {
+ this.applicationDatabaseInfoProvider = new CopyOnWriteArrayList<IApplicationDatabaseInfoProvider>();
+ myWait = new Object();
+ }
+
+ public IApplicationDatabaseInfoProvider getInternal() throws OseeDataStoreException {
+ IApplicationDatabaseInfoProvider toReturn = null;
+ for (IApplicationDatabaseInfoProvider provider : applicationDatabaseInfoProvider) {
+ if (toReturn == null || (toReturn.getPriority() < provider.getPriority())) {
+ toReturn = provider;
+ }
+ }
+ return toReturn;
+ }
+
+ public IApplicationDatabaseInfoProvider getProvider() throws OseeDataStoreException {
+ IApplicationDatabaseInfoProvider provider = getInternal();
+ if (provider == null) {
+ long endTime = System.currentTimeMillis() + (1000 * 20);
+ long timeLeft = 1000 * 20;
+ while (timeLeft > 0 && provider == null) {
+ synchronized (myWait) {
+ try {
+ myWait.wait(timeLeft);
+ } catch (InterruptedException ex) {
+ }
+ provider = getInternal();
+ }
+ timeLeft = endTime - System.currentTimeMillis();
+ }
+ }
+ if (provider == null) {
+ throw new OseeDataStoreException("Unable to find an application database provider");
+ }
+ return provider;
+ }
+
+ public void removeDatabaseProvider(IApplicationDatabaseInfoProvider provider) {
+ System.out.println("Removing: " + provider);
+ applicationDatabaseInfoProvider.remove(provider);
+ }
+
+ public void addDatabaseProvider(IApplicationDatabaseInfoProvider provider) {
+ System.out.println("Adding: " + provider);
+ applicationDatabaseInfoProvider.add(provider);
+ synchronized (myWait) {
+ myWait.notifyAll();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionFactory.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionFactory.java
new file mode 100644
index 00000000000..cd6d42c759c
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionFactory.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.framework.db.connection.internal;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.db.connection.IConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class DbConnectionFactory implements IDbConnectionFactory {
+
+ private List<IConnection> connectionProviders;
+ private Object myWait;
+
+ public DbConnectionFactory() {
+ connectionProviders = new CopyOnWriteArrayList<IConnection>();
+ myWait = new Object();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDbConnectionFactory#get(java.lang.String)
+ */
+ @Override
+ public IConnection get(String driver) throws OseeCoreException {
+ IConnection selectedDriver = getInternal(driver);
+ if (selectedDriver == null) {
+ long endTime = System.currentTimeMillis() + (1000 * 20);
+ long timeLeft = 1000 * 20;
+ while (timeLeft > 0 && selectedDriver == null) {
+ synchronized (myWait) {
+ try {
+ myWait.wait(timeLeft);
+ } catch (InterruptedException ex) {
+ }
+ selectedDriver = getInternal(driver);
+ }
+ timeLeft = endTime - System.currentTimeMillis();
+ }
+ }
+ if (selectedDriver == null) {
+ throw new OseeStateException(
+ String.format("Unable to find matching driver provider for [%s].", driver, driver));
+ }
+ return selectedDriver;
+ }
+
+ private IConnection getInternal(String driver) {
+ for (IConnection connection : connectionProviders) {
+ if (connection.getDriver().equals(driver)) {
+ return connection;
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IBind#bind(java.lang.Object)
+ */
+ @Override
+ public void bind(IConnection obj) {
+ connectionProviders.add((IConnection) obj);
+ synchronized (myWait) {
+ myWait.notifyAll();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IBind#unbind(java.lang.Object)
+ */
+ @Override
+ public void unbind(IConnection obj) {
+ connectionProviders.remove((IConnection) obj);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionInformation.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionInformation.java
new file mode 100644
index 00000000000..d3198c0163b
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/DbConnectionInformation.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.framework.db.connection.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class DbConnectionInformation implements IDbConnectionInformation {
+
+ private Map<String, IDatabaseInfo> dbInfo;
+ private IDatabaseInfo selectedDbInfo;
+ private Object myWait;
+
+ public DbConnectionInformation() {
+ dbInfo = new HashMap<String, IDatabaseInfo>();
+ myWait = new Object();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDbConnectionInformation#getDatabaseInfo(java.lang.String)
+ */
+ @Override
+ public IDatabaseInfo getDatabaseInfo(String servicesId) {
+ return dbInfo.get(servicesId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDbConnectionInformation#getSelectedDatabaseInfo()
+ */
+ @Override
+ public IDatabaseInfo getSelectedDatabaseInfo() {
+ if (selectedDbInfo == null) {
+ String dbConnectionId = OseeProperties.getOseeDbConnectionId();
+ if (dbConnectionId != null && dbConnectionId.length() > 0) {
+ selectedDbInfo = getDatabaseInfo(dbConnectionId);
+ if (selectedDbInfo == null) {
+ long endTime = System.currentTimeMillis() + (1000 * 20);
+ long timeLeft = 1000 * 20;
+ while (timeLeft > 0 && selectedDbInfo == null) {
+ synchronized (myWait) {
+ try {
+ myWait.wait(timeLeft);
+ } catch (InterruptedException ex) {
+ }
+ selectedDbInfo = getDatabaseInfo(dbConnectionId);
+ }
+ timeLeft = endTime - System.currentTimeMillis();
+ }
+ if (selectedDbInfo == null) {
+ throw new IllegalStateException(String.format(
+ "DB connection information was not found for: [%s]\n Available connection ids are: [%s]\n",
+ dbConnectionId, dbInfo.keySet()));
+ }
+ }
+ } else {
+ throw new IllegalStateException("No DB connection information provided");
+ }
+ }
+ return selectedDbInfo;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IBind#bind(java.lang.Object)
+ */
+ @Override
+ public void bind(IDbConnectionInformationContributor obj) {
+ IDbConnectionInformationContributor contributor = (IDbConnectionInformationContributor) obj;
+ try {
+ for (IDatabaseInfo info : contributor.getDbInformation()) {
+ dbInfo.put(info.getId(), info);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, ex);
+ }
+ synchronized (myWait) {
+ myWait.notifyAll();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IBind#unbind(java.lang.Object)
+ */
+ @Override
+ public void unbind(IDbConnectionInformationContributor obj) {
+ IDbConnectionInformationContributor contributor = (IDbConnectionInformationContributor) obj;
+ try {
+ for (IDatabaseInfo info : contributor.getDbInformation()) {
+ dbInfo.remove(info.getDatabaseName());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(InternalActivator.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IApplicationDatabaseManager.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IApplicationDatabaseManager.java
new file mode 100644
index 00000000000..0f9c2fbfb8b
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IApplicationDatabaseManager.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.framework.db.connection.internal;
+
+import org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IApplicationDatabaseManager {
+
+ public IApplicationDatabaseInfoProvider getProvider() throws OseeDataStoreException;
+
+ public void removeDatabaseProvider(IApplicationDatabaseInfoProvider provider);
+
+ public void addDatabaseProvider(IApplicationDatabaseInfoProvider provider);
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionFactory.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionFactory.java
new file mode 100644
index 00000000000..32872ba78f9
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionFactory.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.framework.db.connection.internal;
+
+import org.eclipse.osee.framework.db.connection.IConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IDbConnectionFactory {
+ IConnection get(String driver) throws OseeCoreException;
+
+ void bind(IConnection connection);
+
+ void unbind(IConnection connection);
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionInformation.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionInformation.java
new file mode 100644
index 00000000000..c485a295135
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/IDbConnectionInformation.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.framework.db.connection.internal;
+
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IDbConnectionInformation {
+
+ public IDatabaseInfo getDatabaseInfo(String servicesId);
+
+ public IDatabaseInfo getSelectedDatabaseInfo();
+
+ void bind(IDbConnectionInformationContributor contributor);
+
+ void unbind(IDbConnectionInformationContributor contributor);
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/InternalActivator.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/InternalActivator.java
new file mode 100644
index 00000000000..31786f2c497
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/InternalActivator.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.framework.db.connection.internal;
+
+import org.eclipse.osee.framework.db.connection.IApplicationDatabaseInfoProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InternalActivator implements BundleActivator {
+
+ private static final long TIMEOUT = 20000;
+
+ private static InternalActivator instance = null;
+
+ private ServiceTracker applicationDbManagerTracker;
+ private ServiceTracker dbConnectionProviderTracker;
+ private ServiceTracker dbConnectionInfoTracker;
+
+ public static IDbConnectionFactory getConnectionFactory() throws InterruptedException {
+ return (IDbConnectionFactory) instance.dbConnectionProviderTracker.waitForService(TIMEOUT);
+ }
+
+ public static IDbConnectionInformation getConnectionInfos() throws InterruptedException {
+ return (IDbConnectionInformation) instance.dbConnectionInfoTracker.waitForService(TIMEOUT);
+ }
+
+ private static IApplicationDatabaseManager getApplicationDatabaseManager() throws InterruptedException {
+ return (IApplicationDatabaseManager) instance.applicationDbManagerTracker.waitForService(TIMEOUT);
+ }
+
+ public static IApplicationDatabaseInfoProvider getApplicationDatabaseProvider() throws OseeDataStoreException {
+ try {
+ return getApplicationDatabaseManager().getProvider();
+ } catch (InterruptedException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+
+ dbConnectionProviderTracker = new ServiceTracker(context, IDbConnectionFactory.class.getName(), null);
+ dbConnectionProviderTracker.open();
+
+ dbConnectionInfoTracker = new ServiceTracker(context, IDbConnectionInformation.class.getName(), null);
+ dbConnectionInfoTracker.open();
+
+ applicationDbManagerTracker = new ServiceTracker(context, IApplicationDatabaseManager.class.getName(), null);
+ applicationDbManagerTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ instance = null;
+ dbConnectionProviderTracker.close();
+ dbConnectionInfoTracker.close();
+ applicationDbManagerTracker.close();
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/TransactionMonitor.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/TransactionMonitor.java
new file mode 100644
index 00000000000..3f2958e0e7a
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/TransactionMonitor.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.framework.db.connection.internal;
+
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TransactionMonitor {
+
+ private enum TxState {
+ CREATED, RUNNING, ENDED;
+ }
+
+ private final Map<Thread, TxOperation> txMap;
+
+ public TransactionMonitor() {
+ this.txMap = new WeakHashMap<Thread, TxOperation>();
+ }
+
+ public synchronized void reportTxCreation(final DbTransaction transaction) throws OseeWrappedException {
+ final Thread currentThread = Thread.currentThread();
+ TxOperation currentTx = txMap.get(currentThread);
+ if (currentTx != null) {
+ // This log is to support debugging the case where osee transactions are nested and should
+ // use the same transaction.
+ // This case may happens legitimately if an exception occurs outside this API before transaction.execute() is called,
+ // so it is only notification that this is occurring.
+ OseeLog.log(InternalActivator.class, Level.SEVERE, "New transaction created over Last transaction",
+ currentTx.getError());
+ }
+ txMap.put(currentThread, new TxOperation(transaction));
+ }
+
+ public synchronized void reportTxStart(final DbTransaction transaction) throws OseeWrappedException, OseeStateException {
+ final Thread currentThread = Thread.currentThread();
+ TxOperation currentTx = txMap.get(currentThread);
+ if (currentTx == null) {
+ throw new OseeStateException(
+ "reportTxStart called for thread: " + currentThread + " but reportTxCreation had not been called.");
+ } else if (currentTx.getState() != TxState.CREATED) {
+ throw new OseeWrappedException(currentTx.getError());
+ }
+
+ if (currentTx.getTransaction().equals(transaction)) {
+ currentTx.setState(TxState.RUNNING);
+ } else {
+ throw new OseeStateException(
+ "reportTxStart called for thread: " + currentThread + " but was called for incorrect transaction");
+ }
+ }
+
+ public synchronized void reportTxEnd(final DbTransaction transaction) throws OseeWrappedException, OseeStateException {
+ final Thread currentThread = Thread.currentThread();
+
+ TxOperation currentTx = txMap.get(currentThread);
+ if (currentTx == null) {
+ throw new OseeStateException(
+ "reportTxEnd called for thread: " + currentThread + " but reportTxCreation had not been called.");
+ } else if (currentTx.getState() != TxState.RUNNING) {
+ // This is a valid case -- can add a log to detect when a reportTxEnd is called before a transaction has a chance to run
+ }
+
+ if (currentTx.getTransaction().equals(transaction)) {
+ txMap.put(currentThread, null);
+ } else {
+ throw new OseeWrappedException(currentTx.getError());
+ }
+ }
+
+ private final class TxOperation {
+ private final DbTransaction tx;
+ private Throwable throwable;
+ private TxState txState;
+
+ public TxOperation(DbTransaction tx) {
+ this.tx = tx;
+ this.txState = TxState.CREATED;
+ // Not null for stack trace purposes;
+ this.throwable = new Exception();
+ }
+
+ public DbTransaction getTransaction() {
+ return tx;
+ }
+
+ public TxState getState() {
+ return txState;
+ }
+
+ public void setState(TxState txState) {
+ this.txState = txState;
+ }
+
+ public void setError(Throwable throwable) {
+ this.throwable = throwable;
+ }
+
+ public Throwable getError() {
+ return throwable;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/UriDbConnectionInfo.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/UriDbConnectionInfo.java
new file mode 100644
index 00000000000..a632abe15c3
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/UriDbConnectionInfo.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.db.connection.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.DatabaseInfoManager;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributor;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UriDbConnectionInfo implements IDbConnectionInformationContributor {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDbConnectionInformationContributer#getDbInformation()
+ */
+ @Override
+ public IDatabaseInfo[] getDbInformation() throws Exception {
+ String uri = OseeProperties.getOseeConnectionInfoUri();
+ if (Strings.isValid(uri)) {
+ OseeLog.log(InternalActivator.class, Level.INFO, String.format("Loading connection info from: [%s]", uri));
+ URI connectionFile = null;
+ if (!uri.contains("://")) {
+ connectionFile = new File(uri).toURI();
+ } else {
+ connectionFile = new URI(uri);
+ }
+ return DatabaseInfoManager.readFromXml(connectionFile.toURL().openStream());
+ }
+ return new IDatabaseInfo[0];
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConfigParser.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConfigParser.java
new file mode 100644
index 00000000000..847bc43b28e
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConfigParser.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.db.connection.internal.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.internal.parser.DbInformation.DbObjectType;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbConfigParser {
+
+ private final Map<String, DbDetailData> dbInfoMap;
+ private final Map<String, DbSetupData> servicesMap;
+ private final Map<String, DbConnectionData> connectionMap;
+
+ private DbConfigParser() {
+ dbInfoMap = new HashMap<String, DbDetailData>();
+ servicesMap = new HashMap<String, DbSetupData>();
+ connectionMap = new HashMap<String, DbConnectionData>();
+ }
+
+ public static DbInformation[] parse(Element rootElement) {
+ DbConfigParser worker = new DbConfigParser();
+ worker.parseDbInfo(rootElement);
+ worker.parseDbService(rootElement);
+ worker.parseDbConnection(rootElement);
+ return worker.getAllDbServices();
+ }
+
+ private DbInformation[] getAllDbServices() {
+ DbInformation[] info = new DbInformation[servicesMap.size()];
+ int i = 0;
+ for (String name : servicesMap.keySet()) {
+ info[i] = buildDbInformation(name);
+ i++;
+ }
+ return info;
+ }
+
+ private DbInformation buildDbInformation(String id) {
+ DbSetupData serviceData = servicesMap.get(id);
+ DbDetailData dbInfo = dbInfoMap.get(serviceData.getDbInfo());
+ DbConnectionData connectionData =
+ connectionMap.get(serviceData.getServerInfoValue(DbSetupData.ServerInfoFields.connectsWith));
+ if (dbInfo != null && connectionData != null) {
+ return new DbInformation(dbInfo, serviceData, connectionData);
+ } else {
+ return null;
+ }
+ }
+
+ private void parseDbInfo(Element rootElement) {
+ if (rootElement != null) {
+ NodeList list = rootElement.getElementsByTagName(DbObjectType.DatabaseInfo.name());
+ for (int i = 0; i < list.getLength(); i++) {
+ DbDetailData dbInfo = new DbDetailData();
+ Element element = (Element) list.item(i);
+ NamedNodeMap map = element.getAttributes();
+ if (map != null && map.getLength() != 0) {
+ DbDetailData.DescriptionField[] descriptionFields = DbDetailData.DescriptionField.values();
+ for (DbDetailData.DescriptionField descriptionField : descriptionFields) {
+ Node node = map.getNamedItem(descriptionField.name());
+ String value = node.getTextContent();
+ if (value != null && !value.equals("")) {
+ dbInfo.addDescription(descriptionField, value);
+ }
+ }
+ }
+ DbDetailData.ConfigField[] configfields = DbDetailData.ConfigField.values();
+ for (DbDetailData.ConfigField field : configfields) {
+ Element fieldChild = Jaxp.getChild(element, field.name());
+ if (fieldChild != null) {
+ NamedNodeMap configMap = fieldChild.getAttributes();
+ Node keyNode = configMap.getNamedItem(DbDetailData.ConfigPairField.key.name());
+ Node valueNode = configMap.getNamedItem(DbDetailData.ConfigPairField.value.name());
+ String key = null;
+ if (keyNode != null) {
+ key = keyNode.getTextContent();
+ }
+ String value = null;
+ if (valueNode != null) {
+ value = valueNode.getTextContent();
+ }
+ if (key != null && !key.equals("")) {
+ dbInfo.addConfigField(field, new Pair<String, String>(key, (value != null ? value : "")));
+ }
+
+ }
+ }
+ dbInfoMap.put(dbInfo.getId(), dbInfo);
+ }
+ }
+ }
+
+ private void parseDbService(Element rootElement) {
+ if (rootElement != null) {
+ NodeList list = rootElement.getElementsByTagName(DbObjectType.AvailableDbServices.name());
+ for (int i = 0; i < list.getLength(); i++) {
+
+ Element element = (Element) list.item(i);
+
+ NodeList serverList = element.getElementsByTagName(DbSetupData.ServicesFields.Server.name());
+ for (int index = 0; index < serverList.getLength(); index++) {
+ DbSetupData dbServicesData = new DbSetupData();
+ Element serviceChild = (Element) serverList.item(index);
+ NamedNodeMap map = serviceChild.getAttributes();
+ if (map != null && map.getLength() != 0) {
+ DbSetupData.ServerInfoFields[] infoFields = DbSetupData.ServerInfoFields.values();
+ for (DbSetupData.ServerInfoFields infoField : infoFields) {
+ Node node = map.getNamedItem(infoField.name());
+ String value = null;
+ if (node != null) {
+ value = node.getTextContent();
+ }
+ if (value != null && !value.equals("")) {
+ dbServicesData.addServerInfo(infoField, value);
+ }
+ }
+ }
+ servicesMap.put(dbServicesData.getId(), dbServicesData);
+ }
+ }
+ }
+ }
+
+ private void parseDbConnection(Element rootElement) {
+ if (rootElement != null) {
+ NodeList list = rootElement.getElementsByTagName(DbObjectType.ConnectionDescription.name());
+ for (int i = 0; i < list.getLength(); i++) {
+ DbConnectionData dbConnectionData = new DbConnectionData();
+ Element element = (Element) list.item(i);
+
+ NamedNodeMap map = element.getAttributes();
+ if (map != null && map.getLength() != 0) {
+ Node node = map.getNamedItem(DbConnectionData.DescriptionFields.id.name());
+ if (node != null) {
+ String value = node.getTextContent();
+ if (value != null && !value.equals("")) {
+ dbConnectionData.setId(value);
+ }
+ }
+ }
+
+ DbConnectionData.ConnectionFields[] connectionFields = DbConnectionData.ConnectionFields.values();
+ for (DbConnectionData.ConnectionFields connectionField : connectionFields) {
+ switch (connectionField) {
+ case Driver:
+ String driver = Jaxp.getChildText(element, connectionField.name());
+ if (driver != null && !driver.equals("")) {
+ dbConnectionData.setDBDriver(driver);
+ }
+ break;
+ case Url:
+ String url = Jaxp.getChildText(element, connectionField.name());
+ if (url != null && !url.equals("")) {
+ dbConnectionData.setRawUrl(url);
+ }
+ break;
+ case UrlAttributes:
+ Element urlAttributes =
+ Jaxp.getChild(element, DbConnectionData.ConnectionFields.UrlAttributes.name());
+ if (urlAttributes != null) {
+ NodeList attributes =
+ urlAttributes.getElementsByTagName(DbConnectionData.UrlAttributes.Entry.name());
+ if (attributes != null) {
+ for (int index = 0; index < attributes.getLength(); index++) {
+ Node node = attributes.item(index);
+ String attributeValue = node.getTextContent();
+ if (attributeValue != null && !attributeValue.equals("")) {
+ dbConnectionData.addAttribute(attributeValue);
+ }
+ }
+ }
+ }
+ break;
+ case Property: {
+ NodeList nodes = element.getElementsByTagName(connectionField.name());
+ for (int j = 0; j < nodes.getLength(); j++) {
+ Element el = (Element) nodes.item(j);
+ dbConnectionData.getProperties().setProperty(el.getAttribute("key"), el.getAttribute("value"));
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ connectionMap.put(dbConnectionData.getId(), dbConnectionData);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConnectionData.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConnectionData.java
new file mode 100644
index 00000000000..3e6aa464c0e
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbConnectionData.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.framework.db.connection.internal.parser;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbConnectionData {
+
+ public enum DescriptionFields {
+ id;
+ }
+
+ public enum UrlAttributes {
+ Entry;
+ }
+
+ public enum ConnectionFields {
+ Url, Driver, UrlAttributes, Property;
+ }
+
+ private String id;
+ private String databaseDriver;
+ private String databaseUrl;
+ private ArrayList<String> attributesList;
+ private Properties properties;
+
+ public DbConnectionData() {
+ attributesList = new ArrayList<String>();
+ properties = new Properties();
+ this.databaseDriver = "";
+ this.databaseUrl = "";
+ this.id = "";
+ }
+
+ public String getDBDriver() {
+ return databaseDriver;
+ }
+
+ public String getRawUrl() {
+ return databaseUrl;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void addAttribute(String attribute) {
+ attributesList.add(attribute);
+ }
+
+ public void setDBDriver(String driver) {
+ databaseDriver = driver;
+ }
+
+ public void setRawUrl(String url) {
+ databaseUrl = url;
+ }
+
+ public String getAttributes() {
+ String toReturn = "";
+ for (String temp : attributesList) {
+ toReturn += temp + ";";
+ }
+ return toReturn;
+ }
+
+ public String toString() {
+ return "DbConnection: " + id + "\n" + " Driver: " + databaseDriver + "\n" + " RawUrl: " + databaseUrl + "\n" + "Attributes: " + getAttributes() + "\n";
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbDetailData.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbDetailData.java
new file mode 100644
index 00000000000..ea07da7c205
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbDetailData.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.framework.db.connection.internal.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbDetailData {
+
+ public enum ConfigPairField {
+ key, value;
+ }
+
+ public enum ConfigField {
+ DatabaseType, DatabaseName, DatabaseHome, Prefix, UserName, Password, Host, Port
+ }
+
+ public enum DescriptionField {
+ id;
+ }
+
+ private Map<ConfigField, Pair<String, String>> configFieldMap;
+ private Map<DescriptionField, String> descriptionMap;
+
+ public DbDetailData() {
+ super();
+ configFieldMap = new HashMap<ConfigField, Pair<String, String>>();
+ descriptionMap = new HashMap<DescriptionField, String>();
+ }
+
+ public String getId() {
+ return descriptionMap.get(DescriptionField.id);
+ }
+
+ public void addDescription(DescriptionField field, String value) {
+ descriptionMap.put(field, value);
+ }
+
+ public void addConfigField(ConfigField field, Pair<String, String> pair) {
+ configFieldMap.put(field, pair);
+ }
+
+ public SupportedDatabase getDbType() {
+ return SupportedDatabase.valueOf(getFieldValue(ConfigField.DatabaseType).toLowerCase());
+ }
+
+ public String getFieldValue(ConfigField field) {
+ String toReturn = "";
+ if (configFieldMap.containsKey(field)) {
+ Pair<String, String> pair = configFieldMap.get(field);
+ toReturn = pair.getValue();
+ }
+ return toReturn;
+ }
+
+ public String toString() {
+ String toReturn = "DatabaseInfo: \n";
+ Set<DescriptionField> descriptionMapkeys = descriptionMap.keySet();
+ for (DescriptionField field : descriptionMapkeys) {
+ String value = descriptionMap.get(field);
+ toReturn += field + ": " + "[" + value + "]\n";
+ }
+
+ toReturn += "Fields: \n";
+ Set<ConfigField> keys = configFieldMap.keySet();
+ for (ConfigField field : keys) {
+ Pair<String, String> pair = configFieldMap.get(field);
+ toReturn += field + ": " + "[" + pair.getKey() + "],[" + pair.getValue() + "]\n";
+ }
+ return toReturn + "\n";
+ }
+
+ public Map<ConfigField, Pair<String, String>> getConfigMap() {
+ return configFieldMap;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbInformation.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbInformation.java
new file mode 100644
index 00000000000..0be257e965d
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbInformation.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.framework.db.connection.internal.parser;
+
+import java.util.Properties;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.IDatabaseInfo;
+import org.eclipse.osee.framework.db.connection.internal.parser.DbDetailData.ConfigField;
+import org.eclipse.osee.framework.db.connection.internal.parser.DbSetupData.ServerInfoFields;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbInformation implements IDatabaseInfo {
+
+ private DbDetailData dbDetailData;
+ private DbSetupData dbSetupData;
+ private DbConnectionData dbConnectionData;
+
+ public enum DbObjectType {
+ ConnectionDescription, AvailableDbServices, DatabaseInfo
+ }
+
+ public DbInformation(DbDetailData dbDetailData, DbSetupData dbSetupData, DbConnectionData dbConnectionData) {
+ this.dbDetailData = dbDetailData;
+ this.dbSetupData = dbSetupData;
+ this.dbConnectionData = dbConnectionData;
+ }
+
+ public DbConnectionData getConnectionData() {
+ return dbConnectionData;
+ }
+
+ public DbDetailData getDatabaseDetails() {
+ return dbDetailData;
+ }
+
+ public DbSetupData getDatabaseSetupDetails() {
+ return dbSetupData;
+ }
+
+ public String getFormattedURL() {
+ String toReturn = dbConnectionData.getRawUrl();
+ Set<DbDetailData.ConfigField> keys = dbDetailData.getConfigMap().keySet();
+ for (DbDetailData.ConfigField field : keys) {
+ Pair<String, String> pair = dbDetailData.getConfigMap().get(field);
+ if (pair.getValue().startsWith("@")) {
+ DbObjectType type = DbObjectType.valueOf(pair.getValue().substring(1, pair.getValue().indexOf('.')));
+ String value = pair.getValue().substring(pair.getValue().indexOf('.') + 1);
+ String realValue = getValue(type, value);
+
+ toReturn = toReturn.replace(pair.getKey(), realValue);
+ } else {
+ toReturn = toReturn.replace(pair.getKey(), pair.getValue());
+ }
+ }
+ return toReturn;
+ }
+
+ private String getValue(DbObjectType type, String key) {
+ switch (type) {
+ case AvailableDbServices:
+ return dbSetupData.getServerInfoValue(DbSetupData.ServerInfoFields.valueOf(key));
+ case ConnectionDescription:
+ break;
+ case DatabaseInfo:
+ break;
+ }
+ return "none";
+ }
+
+ public String toString() {
+ return getFormattedURL() + " : user=" + getDatabaseLoginName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getConnectionUrl()
+ */
+ @Override
+ public String getConnectionUrl() {
+ return getFormattedURL() + getConnectionData().getAttributes();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getConnectionProperties()
+ */
+ @Override
+ public Properties getConnectionProperties() {
+ Properties properties = getConnectionData().getProperties();
+ properties.setProperty("user", getDatabaseLoginName());
+ properties.setProperty("password", getDatabaseDetails().getFieldValue(ConfigField.Password));
+ return properties;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDatabaseLoginName()
+ */
+ @Override
+ public String getDatabaseLoginName() {
+ return getDatabaseDetails().getFieldValue(ConfigField.UserName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDatabaseName()
+ */
+ @Override
+ public String getDatabaseName() {
+ return getDatabaseDetails().getFieldValue(ConfigField.DatabaseName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getDriver()
+ */
+ @Override
+ public String getDriver() {
+ return getConnectionData().getDBDriver();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#getId()
+ */
+ @Override
+ public String getId() {
+ return getDatabaseSetupDetails().getId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IDatabaseInfo#isProduction()
+ */
+ @Override
+ public boolean isProduction() {
+ return Boolean.valueOf(getDatabaseSetupDetails().getServerInfoValue(ServerInfoFields.isProduction));
+ }
+}
diff --git a/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbSetupData.java b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbSetupData.java
new file mode 100644
index 00000000000..92dd69baa05
--- /dev/null
+++ b/org.eclipse.osee.framework.db.connection/src/org/eclipse/osee/framework/db/connection/internal/parser/DbSetupData.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.framework.db.connection.internal.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbSetupData {
+
+ public enum ServicesFields {
+ Server;
+ }
+
+ public enum ServerInfoFields {
+ id, dbInfo, hostAddress, port, connectsWith, serverConfig, isProduction;
+ }
+
+ Map<ServerInfoFields, String> serverFieldMap;
+
+ public DbSetupData() {
+ this.serverFieldMap = new HashMap<ServerInfoFields, String>();
+ }
+
+ public void addServerInfo(ServerInfoFields field, String value) {
+ serverFieldMap.put(field, value);
+ }
+
+ public String getServerInfoValue(ServerInfoFields field) {
+ if (serverFieldMap.containsKey(field)) {
+ return serverFieldMap.get(field);
+ }
+ return "";
+ }
+
+ public String getId() {
+ return serverFieldMap.get(ServerInfoFields.id);
+ }
+
+ public String getDbInfo() {
+ return serverFieldMap.get(ServerInfoFields.dbInfo);
+ }
+
+ public String toString() {
+ String toReturn = "Service: \n";
+ Set<ServerInfoFields> keys = serverFieldMap.keySet();
+ for (ServerInfoFields field : keys) {
+ String value = serverFieldMap.get(field);
+ toReturn += field + ": " + value + " ";
+ }
+ return toReturn;
+ }
+
+ public Map<ServerInfoFields, String> getServerFieldMap() {
+ return serverFieldMap;
+ }
+}
diff --git a/org.eclipse.osee.framework.derby/.classpath b/org.eclipse.osee.framework.derby/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/.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.framework.derby/.project b/org.eclipse.osee.framework.derby/.project
new file mode 100644
index 00000000000..72781e7a344
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.derby</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.derby/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.derby/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..23dbf9197d8
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Derby Db Connector Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.derby;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.derby.Activator
+Bundle-ActivationPolicy: lazy
+OseeEarlyStart: true
+Import-Package: org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.framework.derby
+Service-Component: OSGI-INF/derby.client.connection.driver.provider.xml,
+ OSGI-INF/derby.embed.connection.driver.provider.xml
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: derby.driver
diff --git a/org.eclipse.osee.framework.derby/OSGI-INF/derby.client.connection.driver.provider.xml b/org.eclipse.osee.framework.derby/OSGI-INF/derby.client.connection.driver.provider.xml
new file mode 100644
index 00000000000..9803678bfeb
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/OSGI-INF/derby.client.connection.driver.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="derby.client.connection.driver.provider">
+ <implementation class="org.eclipse.osee.framework.derby.DerbyClientConnection"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IConnection"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.derby/OSGI-INF/derby.embed.connection.driver.provider.xml b/org.eclipse.osee.framework.derby/OSGI-INF/derby.embed.connection.driver.provider.xml
new file mode 100644
index 00000000000..20f242a5a45
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/OSGI-INF/derby.embed.connection.driver.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="derby.embed.connection.driver.provider">
+ <implementation class="org.eclipse.osee.framework.derby.EmbeddedDerbyConnection"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IConnection"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.derby/build.properties b/org.eclipse.osee.framework.derby/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/Activator.java b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/Activator.java
new file mode 100644
index 00000000000..384a4ac52e2
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/Activator.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.framework.derby;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyClientConnection.java b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyClientConnection.java
new file mode 100644
index 00000000000..692e970a9ed
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyClientConnection.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.framework.derby;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.db.connection.IConnection;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DerbyClientConnection implements IConnection {
+
+ private static final String driver = "org.apache.derby.jdbc.ClientDriver";
+ private boolean firstTime = true;
+
+ public Connection getConnection(Properties properties, String connectionURL) throws ClassNotFoundException, SQLException {
+ Class.forName(driver);
+
+ if (firstTime) {
+ firstTime = false;
+ try {
+ String derbyAddress = System.getProperty(OseeServerProperties.OSEE_DERBY_SERVER);
+ if (Strings.isValid(derbyAddress)) {
+ String[] hostPort = derbyAddress.split(":");
+ DerbyDbServer.startServer(hostPort[0], Integer.parseInt(hostPort[1]));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+ Connection connection = DriverManager.getConnection(connectionURL, properties);
+ return connection;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyDbServer.java b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyDbServer.java
new file mode 100644
index 00000000000..c24c5db2ef7
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/DerbyDbServer.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.derby;
+
+import java.io.PrintWriter;
+import java.net.InetAddress;
+import java.util.logging.Level;
+import org.apache.derby.drda.NetworkServerControl;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DerbyDbServer {
+ protected static Object keepAlive;
+ private NetworkServerUtil nwServer;
+ private static final DerbyDbServer instance = new DerbyDbServer();
+
+ private DerbyDbServer() {
+ this.nwServer = null;
+ }
+
+ public static void startServer(String host, int port) throws Exception {
+ instance.startServerInternal(host, port);
+ }
+
+ private void startServerInternal(String host, int port) throws Exception {
+ try {
+ OseeLog.log(Activator.class, Level.INFO, "Starting Derby Network Server ....");
+ nwServer = new NetworkServerUtil(InetAddress.getByName(host), port);
+ nwServer.start();
+
+ if (isConnectionAvailable()) {
+ nwServer.printInfo();
+ addShutdownHook();
+ // stayAlive();
+ } else {
+ OseeLog.log(Activator.class, Level.INFO, "Exiting, since unable to connect to Derby Network Server.");
+ OseeLog.log(Activator.class, Level.INFO,
+ "Please try to increase the amount of time to keep trying to connect to the Server.");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex.getMessage(), ex);
+ }
+ }
+
+ private void stayAlive() {
+ keepAlive = new Object();
+ synchronized (keepAlive) {
+ try {
+ keepAlive.wait();
+ } catch (InterruptedException e) {
+ OseeLog.log(Activator.class, Level.SEVERE, e.getMessage(), e);
+ }
+ }
+ }
+
+ private void commitSuicide() {
+ synchronized (keepAlive) {
+ keepAlive.notify();
+ }
+ }
+
+ private void shutdown() {
+ OseeLog.log(Activator.class, Level.INFO, "Shutting down network server...");
+ nwServer.shutdown();
+ OseeLog.log(Activator.class, Level.INFO, "Server down.");
+ commitSuicide();
+ }
+
+ private void addShutdownHook() {
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ OseeLog.log(Activator.class, Level.INFO, "Shutting down");
+ shutdown();
+ }
+ });
+ }
+
+ private boolean isConnectionAvailable() throws InterruptedException {
+ boolean knowIfServerUp = false;
+ int numTimes = 5;
+
+ while (!knowIfServerUp && (numTimes > 0)) {
+ try {
+ numTimes--;
+ nwServer.testForConnection();
+ knowIfServerUp = true;
+ } catch (Exception e) {
+ OseeLog.log(Activator.class, Level.SEVERE,
+ "Unable to obtain a connection to network server, trying again after 3000 ms.", e);
+ Thread.sleep(3000);
+ }
+ }
+ return knowIfServerUp;
+ }
+
+ // public static void main(String[] args) throws Exception {
+ // (new DBServer( new PrintWriter(System.out, true)).startServer(args);
+ // }
+
+ private final class NetworkServerUtil {
+
+ private NetworkServerControl serverControl;
+
+ public NetworkServerUtil(InetAddress host, int port) {
+ try {
+ serverControl = new NetworkServerControl(host, port);
+ OseeLog.log(Activator.class, Level.INFO, "Derby Network Server created");
+ } catch (Exception e) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Error Initializing Server Control.", e);
+ }
+ }
+
+ /**
+ * trace utility of server
+ */
+ public void trace(boolean onoff) {
+ try {
+ serverControl.trace(onoff);
+ } catch (Exception e) {
+ OseeLog.log(Activator.class, Level.SEVERE, e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Try to test for a connection Throws exception if unable to get a connection
+ */
+ public void testForConnection() throws Exception {
+ serverControl.ping();
+ }
+
+ /**
+ * Shutdown the NetworkServer
+ */
+ public void shutdown() {
+ try {
+ serverControl.shutdown();
+ } catch (Exception e) {
+ OseeLog.log(Activator.class, Level.SEVERE, e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Start Derby Network server
+ */
+ public void start() {
+ try {
+ serverControl.start(new PrintWriter(System.out, true));
+ } catch (Exception e) {
+ OseeLog.log(Activator.class, Level.SEVERE, e.getMessage(), e);
+ }
+ }
+
+ public void printInfo() {
+ try {
+ String sysinfo = serverControl.getSysinfo();
+ int start = sysinfo.indexOf("Java classpath:");
+ int stop = sysinfo.indexOf("OS name:");
+ String cpSubString = sysinfo.substring(start, stop);
+ cpSubString = cpSubString.replaceAll(";", ";\n\t");
+ String temp = sysinfo.substring(0, start) + cpSubString + sysinfo.substring(stop, sysinfo.length());
+ OseeLog.log(Activator.class, Level.INFO, temp);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Error getting Server Information", ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/EmbeddedDerbyConnection.java b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/EmbeddedDerbyConnection.java
new file mode 100644
index 00000000000..6763a431d7c
--- /dev/null
+++ b/org.eclipse.osee.framework.derby/src/org/eclipse/osee/framework/derby/EmbeddedDerbyConnection.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.framework.derby;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+import org.eclipse.osee.framework.db.connection.IConnection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EmbeddedDerbyConnection implements IConnection {
+
+ private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver";
+
+ public Connection getConnection(Properties properties, String connectionURL) throws ClassNotFoundException, SQLException {
+ Class.forName(driver);
+ Connection connection = DriverManager.getConnection(connectionURL, properties);
+ return connection;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.feature/.project b/org.eclipse.osee.framework.feature/.project
new file mode 100644
index 00000000000..56e4f78956a
--- /dev/null
+++ b/org.eclipse.osee.framework.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.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.framework.feature/build.properties b/org.eclipse.osee.framework.feature/build.properties
new file mode 100644
index 00000000000..9e37b0f2c16
--- /dev/null
+++ b/org.eclipse.osee.framework.feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.xml,\
+ epl-v10.html,\
+ feature.properties,\
+ license.html,\
+ osee_32.png
+generate.plugin@org.eclipse.osee.framework.skynet.core.source=org.eclipse.osee.framework.skynet.core
diff --git a/org.eclipse.osee.framework.feature/epl-v10.html b/org.eclipse.osee.framework.feature/epl-v10.html
new file mode 100644
index 00000000000..ed4b196655e
--- /dev/null
+++ b/org.eclipse.osee.framework.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.framework.feature/feature.properties b/org.eclipse.osee.framework.feature/feature.properties
new file mode 100644
index 00000000000..b0eb414db10
--- /dev/null
+++ b/org.eclipse.osee.framework.feature/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 Framework Feature (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.framework.feature/feature.xml b/org.eclipse.osee.framework.feature/feature.xml
new file mode 100644
index 00000000000..b5b104f0869
--- /dev/null
+++ b/org.eclipse.osee.framework.feature/feature.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.framework.feature"
+ label="%featureName"
+ version="1.0.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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="%licenseURL">
+ %license
+ </license>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="org.eclipse.osee.framework.database"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.jdk.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.jini"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.messaging.event.skynet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.plugin.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.skynet.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.templates"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.updater"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.db.connection"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.logging"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.oracle"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.postgresql"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.svn"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.derby"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.core.client"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="net.jini"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.core.server"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.jdbcodbc"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.messaging"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.framework.feature/license.html b/org.eclipse.osee.framework.feature/license.html
new file mode 100644
index 00000000000..7037848938d
--- /dev/null
+++ b/org.eclipse.osee.framework.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.framework.feature/osee_32.png b/org.eclipse.osee.framework.feature/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.framework.feature/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.framework.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.framework.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 00000000000..5914b1a5ebf
--- /dev/null
+++ b/org.eclipse.osee.framework.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 Framework 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.framework.help.ui/.classpath b/org.eclipse.osee.framework.help.ui/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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.help.ui/.project b/org.eclipse.osee.framework.help.ui/.project
new file mode 100644
index 00000000000..4eb7e0423ef
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.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.framework.help.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.help.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..34505109b53
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Apr 20 17:59:14 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.help.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..144567ed36c
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osee.framework.help.ui
+Bundle-SymbolicName: org.eclipse.osee.framework.help.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ui;resolution:=optional,
+ org.eclipse.ui.forms;resolution:=optional,
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)";resolution:=optional,
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)";resolution:=optional,
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)";resolution:=optional,
+ org.apache.ant;bundle-version="1.7.0";resolution:=optional,
+ org.eclipse.mylyn.wikitext.core;bundle-version="1.0.1";resolution:=optional,
+ org.eclipse.mylyn.wikitext.mediawiki.core;bundle-version="1.0.1";resolution:=optional
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.help.ui/about.html b/org.eclipse.osee.framework.help.ui/about.html
new file mode 100644
index 00000000000..a96ffa40a2e
--- /dev/null
+++ b/org.eclipse.osee.framework.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.framework.help.ui/build-helper.xml b/org.eclipse.osee.framework.help.ui/build-helper.xml
new file mode 100644
index 00000000000..8b7c5ceaade
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/build-helper.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.osee.framework.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 user guide
+ </description>
+
+ <property name="osee.help.doc.url.base" value="http://wiki.eclipse.org" />
+ <property name="osee.help.image.folder" value="images" />
+
+ <property name="osee.help.doc.intro" value="OSEE/Users_Guide/Getting_Started" />
+ <property name="osee.help.doc.concepts" value="OSEE/Users_Guide/Concepts" />
+ <property name="osee.help.doc.features" value="OSEE/Users_Guide/Features" />
+ <property name="osee.help.doc.tips" value="OSEE/Users_Guide/Tips" />
+ <property name="osee.help.doc.new" value="OSEE/Users_Guide/New" />
+ <property name="osee.help.doc.update" value="OSEE/Users_Guide/Update" />
+
+ <property name="osee.help.intro.file.name" value="OSEE Intro" />
+ <property name="osee.help.concepts.file.name" value="OSEE Concepts" />
+ <property name="osee.help.features.file.name" value="OSEE Features" />
+ <property name="osee.help.tips.file.name" value="OSEE Tips" />
+ <property name="osee.help.new.file.name" value="OSEE New" />
+ <property name="osee.help.update.file.name" value="OSEE Update" />
+
+ <target name="all"
+ description="Generate Eclipse help content for the OSEE user guide">
+ <sequential>
+ <delete>
+ <fileset dir="userguide" />
+ </delete>
+ <!-- Refactor this into some sort of loop if possible -->
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.features}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.features}"
+ help.doc.filenameNoExtension="${osee.help.features.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.intro}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.intro}"
+ help.doc.filenameNoExtension="${osee.help.intro.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.concepts}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.concepts}"
+ help.doc.filenameNoExtension="${osee.help.concepts.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.tips}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.tips}"
+ help.doc.filenameNoExtension="${osee.help.tips.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.new}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.new}"
+ help.doc.filenameNoExtension="${osee.help.new.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+
+ <eclipse-wiki-to-help help.doc.url.base="${osee.help.doc.url.base}"
+ wiki.url.base="${osee.help.doc.url.base}/OSEE" help.doc.url.html="${osee.help.doc.url.base}/${osee.help.doc.update}"
+ help.doc.url.xml="${osee.help.doc.url.base}/Special:Export/${osee.help.doc.update}"
+ help.doc.filenameNoExtension="${osee.help.update.file.name}"
+ help.imagefolder="${osee.help.image.folder}" targetfolder="userguide" />
+ </sequential>
+ </target>
+</project>
diff --git a/org.eclipse.osee.framework.help.ui/build.properties b/org.eclipse.osee.framework.help.ui/build.properties
new file mode 100644
index 00000000000..903d50b5719
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/build.properties
@@ -0,0 +1,12 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ userguide/,\
+ intro/,\
+ images/,\
+ cheatsheets/,\
+ about.html,\
+ toc.xml,\
+ scripts/
diff --git a/org.eclipse.osee.framework.help.ui/customBuildCallbacks.xml b/org.eclipse.osee.framework.help.ui/customBuildCallbacks.xml
new file mode 100644
index 00000000000..26354d81057
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/customBuildCallbacks.xml
@@ -0,0 +1,161 @@
+<!-- ===================================================================== -->
+<!-- Custom targets called from a project's generated build.xml -->
+<!-- Set customBuildCallbacks=<path/to/this/file> in your build.properties.-->
+<!-- ===================================================================== -->
+<project name="Build specific targets and properties" default="noDefault">
+
+ <!-- ===================================================================== -->
+ <!-- Default target -->
+ <!-- ===================================================================== -->
+ <target name="noDefault">
+ <echo message="This file must be called with explicit targets" />
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.jars">
+ <!-- automatic generation of the user guide is disabled, see bug 242979
+ <ant antfile="build-helper.xml" target="all"/>
+ -->
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.jars">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="pre.name">
+ </target>
+
+ <target name="pre.@dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do during the compilation target <name>, after the compile -->
+ <!-- but before jaring. Substitute "name" with the name of the compilation-->
+ <!-- target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.compile.name">
+ </target>
+
+ <target name="post.compile.@dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- jar.location - the location of the compilation results -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.name">
+ </target>
+
+ <target name="post.@dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target clean -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.clean">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target clean -->
+ <!-- Available parameters : -->
+ <!-- plugin.destination - final destination of the build -->
+ <!-- build.result.folder - results of the compilation -->
+ <!-- temp.folder - temporary folder -->
+ <!-- ===================================================================== -->
+ <target name="post.clean">
+ </target>
+</project>
diff --git a/org.eclipse.osee.framework.help.ui/intro/css/overview.css b/org.eclipse.osee.framework.help.ui/intro/css/overview.css
new file mode 100644
index 00000000000..52d9c82061f
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/intro/css/overview.css
@@ -0,0 +1,15 @@
+a#osee-overview img {
+ background-image: url(../../images/topiclabel/ov_mylyn48.gif);
+}
+
+a#osee-overview:hover img {
+ background-image: url(../../images/topiclabel/ov_mylyn48_hov.gif);
+}
+
+a#osee-legend img {
+ background-image: url(../../images/topiclabel/ov_legend48.gif);
+}
+
+a#osee-legend:hover img {
+ background-image: url(../../images/topiclabel/ov_legend48_hov.gif);
+}
diff --git a/org.eclipse.osee.framework.help.ui/intro/css/tutorials.css b/org.eclipse.osee.framework.help.ui/intro/css/tutorials.css
new file mode 100644
index 00000000000..63473ab091a
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/intro/css/tutorials.css
@@ -0,0 +1,15 @@
+a#osee-query img {
+ background-image: url(../../images/topiclabel/tu_query48.gif);
+}
+
+a#osee-query:hover img {
+ background-image: url(../../images/topiclabel/tu_query48_hov.gif);
+}
+
+a#osee-task img {
+ background-image: url(../../images/topiclabel/tu_task48.gif);
+}
+
+a#osee-task:hover img {
+ background-image: url(../../images/topiclabel/tu_task48_hov.gif);
+}
diff --git a/org.eclipse.osee.framework.help.ui/intro/css/whatsnew.css b/org.eclipse.osee.framework.help.ui/intro/css/whatsnew.css
new file mode 100644
index 00000000000..ae896067fa9
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/intro/css/whatsnew.css
@@ -0,0 +1,7 @@
+a#osee-noteworthy img {
+ background-image: url(../../images/topiclabel/wn_mylyn48.gif);
+}
+
+a#osee-noteworthy :hover img {
+ background-image: url(../../images/topiclabel/wn_mylyn48_hov.gif);
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.help.ui/intro/overviewExtensionContent.xml b/org.eclipse.osee.framework.help.ui/intro/overviewExtensionContent.xml
new file mode 100644
index 00000000000..80e0274099c
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/intro/overviewExtensionContent.xml
@@ -0,0 +1,20 @@
+<?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="OSEE"
+ url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.osee.framework.help.ui/doc/overview.html"
+ id="osee-overview" style-id="content-link">
+ <text>Learn more about how OSEE will help you manage your project</text>
+ </link>
+ -->
+ <link label="OSEE"
+ url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.osee.framework.help.ui&amp;class=org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction&amp;id=org.eclipse.mylyn.doc.legend.show.action"
+ id="osee-overview" style-id="content-link">
+ <text>See the OSEE Define Perspective</text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
diff --git a/org.eclipse.osee.framework.help.ui/intro/tutorialsExtensionContent.xml b/org.eclipse.osee.framework.help.ui/intro/tutorialsExtensionContent.xml
new file mode 100644
index 00000000000..048683934a8
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/intro/tutorialsExtensionContent.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.osee" name="OSEE"
+ style="css/tutorials.css" path="tutorials/@">
+ <group label="Task-focused programming" id="OSEE" 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.framework.help.ui/intro/whatsnewExtensionContent.xml b/org.eclipse.osee.framework.help.ui/intro/whatsnewExtensionContent.xml
new file mode 100644
index 00000000000..6bfef0c7ddf
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/intro/whatsnewExtensionContent.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.osee" name="OSEE"
+ style="css/whatsnew.css" path="whatsnew/@">
+ <group id="content-group" style-id="content-group">
+ <link label="OSEE" url="http://www.eclipse.org/osee/new/" id="osee-noteworthy"
+ style-id="content-link">
+ <text>
+ Find out the significant changes made to OSEE
+ </text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
+
+ <!--
+ url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.osee.framework.ui.help/doc/new.html"
+ --> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.help.ui/plugin.xml b/org.eclipse.osee.framework.help.ui/plugin.xml
new file mode 100644
index 00000000000..f4308d78fe7
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/plugin.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="org.eclipse.osee.framework.help.ui.docs"
+ name="OSEE"
+ point="org.eclipse.help.toc">
+ <toc
+ file="toc.xml"
+ primary="true">
+ </toc>
+ <toc
+ file="userguide/OSEE Features-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Intro-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Concepts-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Tips-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE New-toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="userguide/OSEE Update-toc.xml"
+ primary="false">
+ </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/whatsnewExtensionContent.xml">
+ </configExtension>
+ <configExtension
+ configId="org.eclipse.ui.intro.universalConfig"
+ content="$nl$/intro/tutorialsExtensionContent.xml">
+ </configExtension>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.help.ui/scripts/ant.setup.txt b/org.eclipse.osee.framework.help.ui/scripts/ant.setup.txt
new file mode 100644
index 00000000000..fcc3695d553
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/scripts/ant.setup.txt
@@ -0,0 +1,13 @@
+Right-click on build-helper.xml file and select Debug As->Ant Build....
+
+From the dialog set the following:
+ 1. Classpath Tab-> Add External JARs
+ org.eclipse.mylyn
+ org.eclipse.mylyn.wikitext.core
+ org.eclipse.mylyn.wikitext.mediawiki.core
+ org.eclipse.mylyn.wikitext.textile.core
+ org.eclipse.mylyn.wikitext.tracwiki.core
+ org.eclipse.mylyn.wikitext.twiki.core
+ org.eclipse.mylyn.wikitext.confluence.core
+
+ 2. JRE Tab ->Run in the same JRE as the workspace
diff --git a/org.eclipse.osee.framework.help.ui/scripts/commonImages/home.gif b/org.eclipse.osee.framework.help.ui/scripts/commonImages/home.gif
new file mode 100644
index 00000000000..4472e8ce5b3
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/scripts/commonImages/home.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.help.ui/scripts/commonImages/next.gif b/org.eclipse.osee.framework.help.ui/scripts/commonImages/next.gif
new file mode 100644
index 00000000000..e2f8c3e1fee
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/scripts/commonImages/next.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.help.ui/scripts/commonImages/prev.gif b/org.eclipse.osee.framework.help.ui/scripts/commonImages/prev.gif
new file mode 100644
index 00000000000..4fb41501036
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/scripts/commonImages/prev.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.help.ui/scripts/extract-markup.xsl b/org.eclipse.osee.framework.help.ui/scripts/extract-markup.xsl
new file mode 100644
index 00000000000..074b846c834
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/scripts/extract-markup.xsl
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.3/">
+ <xsl:output method="text"/>
+
+ <xsl:template match="/">
+ <xsl:value-of select="//mw:text"/>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/org.eclipse.osee.framework.help.ui/scripts/help-build-common.xml b/org.eclipse.osee.framework.help.ui/scripts/help-build-common.xml
new file mode 100644
index 00000000000..8016edd1de1
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/scripts/help-build-common.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="help.common" basedir=".">
+
+ <property name="extract.style.sheet" value="${ant.file.imported}/extract-markup.xsl" />
+
+ <property name="eclipse.plugin.dir" value="${eclipse.home}/plugins" />
+
+ <property name="wikitext.build" value="1.0.1.v20090411-0400-e3x" />
+
+ <path id="tasks.classpath">
+ <pathelement location="../org.eclipse.osee.framework.help.ui/bin" />
+ </path>
+
+ <path id="wikitext.tasks.classpath">
+ <pathelement location="${eclipse.plugin.dir}/org.eclipse.mylyn.wikitext.core_${wikitext.build}.jar" />
+ <pathelement location="${eclipse.plugin.dir}/org.eclipse.mylyn.wikitext.mediawiki.core_${wikitext.build}.jar" />
+ </path>
+
+ <taskdef classpathref="tasks.classpath" resource="org/eclipse/osee/framework/help/ui/internal/anttask/tasks.properties" />
+ <taskdef classpathref="wikitext.tasks.classpath" resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties" />
+
+ <target name="init">
+ <mkdir dir="tmp" />
+ </target>
+
+ <target name="clean" depends="init">
+ <delete includeemptydirs="true" failonerror="false">
+ <fileset dir="tmp" />
+ </delete>
+ </target>
+
+ <macrodef name="eclipse-wiki-to-help">
+ <attribute name="help.doc.url.base" />
+ <attribute name="wiki.url.base" />
+ <attribute name="help.doc.url.html" />
+ <attribute name="help.doc.url.xml" />
+ <attribute name="help.doc.filenameNoExtension" />
+ <attribute name="help.imageFolder" />
+ <attribute name="targetFolder" />
+
+ <sequential>
+ <antcall target="init" />
+ <get dest="tmp/help.doc.xml" src="@{help.doc.url.xml}" />
+ <get dest="tmp/help.doc.html" src="@{help.doc.url.html}" />
+
+ <copy todir="tmp">
+ <fileset dir="images" />
+ </copy>
+ <osee-mediawiki-fetch-images src="tmp/help.doc.html"
+ dest="tmp/" base="@{help.doc.url.base}" />
+
+ <xslt style="${extract.style.sheet}" in="tmp/help.doc.xml" out="tmp/@{help.doc.filenameNoExtension}.mediawiki" />
+
+ <wikitext-to-eclipse-help markupLanguage="org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage" multipleOutputFiles="true" navigationImages="true" helpPrefix="@{targetFolder}" internallinkpattern="@{wiki.url.base}/{0}" validate="true" failonvalidationerror="true" prependImagePrefix="@{help.imageFolder}" formatoutput="true">
+ <!--defaultAbsoluteLinkTarget="osee_external"-->
+ <fileset dir="tmp" includes="**/*.mediawiki" />
+ <stylesheet url="book.css" />
+ </wikitext-to-eclipse-help>
+
+ <mkdir dir="@{targetFolder}/@{help.imageFolder}" />
+ <copy todir="@{targetFolder}/@{help.imageFolder}" overwrite="true">
+ <fileset dir="tmp">
+ <exclude name="*.html" />
+ <exclude name="*.mediawiki" />
+ <exclude name="*.xml" />
+ <exclude name="*.dtd" />
+ </fileset>
+ </copy>
+ <copy todir="@{targetFolder}" overwrite="true">
+ <fileset dir="tmp">
+ <include name="*.html" />
+ <include name="*toc.xml" />
+ <exclude name="help.doc.html" />
+ </fileset>
+ </copy>
+ <mkdir dir="@{targetFolder}/@{help.imageFolder}/@{help.imageFolder}" />
+ <copy todir="@{targetFolder}/@{help.imageFolder}/@{help.imageFolder}" overwrite="true">
+ <fileset dir="${ant.file.imported}/commonImages" />
+ </copy>
+ <antcall target="test" />
+ <antcall target="clean" />
+ </sequential>
+ </macrodef>
+
+
+ <target name="test" depends="init" description="verify that all of the HTML files are well-formed XML">
+ <echo level="info">
+ Validating help content XML and HTML files: The Eclipse help system expects well-formed XML.
+ If validation fails it is because either:
+ * the userguide source code is poorly formed, or
+ * the WikiText MediaWiki parser has a bug
+
+ Problems with userguide source are usually caused by improper use of HTML markup in the MediaWiki source,
+ or inadvertently starting a line with a space character (in MediaWiki this starts a preformatted block).
+ </echo>
+
+ <!--Don't bother with DTD validation: we only care if the files are well-formed. We therefore provide an empty DTD-->
+
+ <echo file="tmp/__empty.dtd" message="" />
+ <xmlvalidate lenient="true">
+ <fileset dir="userguide">
+ <include name="**/*.xml" />
+ </fileset>
+ <fileset dir="userguide">
+ <include name="**/*.html" />
+ </fileset>
+ <dtd publicid="-//W3C//DTD XHTML 1.0 Transitional//EN" location="${basedir}/tmp/__empty.dtd" />
+ </xmlvalidate>
+ </target>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/OSEEWikiImageFetcher.java b/org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/OSEEWikiImageFetcher.java
new file mode 100644
index 00000000000..6e8bcf3e9f7
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/OSEEWikiImageFetcher.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * 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
+ * adapted from org.eclipse.mylyn.help.ui.internal.anttask.MediaWikiImageFetcher.java by David Green
+ *******************************************************************************/
+
+package org.eclipse.osee.framework.help.ui.internal.anttask;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Get;
+
+/**
+ * Fetch images from a MediaWiki- generated HTML page source
+ *
+ * @author Ryan Schmitt
+ *
+ */
+public class OSEEWikiImageFetcher extends Task {
+
+ private String base;
+
+ private File dest;
+
+ private File src;
+
+ @Override
+ public void execute() throws BuildException {
+ if (dest == null) {
+ throw new BuildException("Must specify @dest"); //$NON-NLS-1$
+ }
+ if (!dest.exists()) {
+ throw new BuildException("@dest does not exist: " + dest); //$NON-NLS-1$
+ }
+ if (!dest.isDirectory()) {
+ throw new BuildException("@dest is not a directory: " + dest); //$NON-NLS-1$
+ }
+ if (src == null) {
+ throw new BuildException("Must specify @src"); //$NON-NLS-1$
+ }
+ if (!src.exists()) {
+ throw new BuildException("@src does not exist: " + src); //$NON-NLS-1$
+ }
+ if (!src.isFile()) {
+ throw new BuildException("@src is not a file: " + src); //$NON-NLS-1$
+ }
+ if (base == null) {
+ throw new BuildException("Must specify @base"); //$NON-NLS-1$
+ }
+ if (base.endsWith("/")) { //$NON-NLS-1$
+ base = base.substring(0, base.length() - 1);
+ }
+ Pattern fragmentUrlPattern = Pattern.compile("src=\"([^\"]+)\""); //$NON-NLS-1$
+// Pattern imagePattern = Pattern.compile("alt=\"Image:([^\"]*)\"([^>]+)", Pattern.MULTILINE); //$NON-NLS-1$
+ Pattern imagePattern = Pattern.compile("alt=\"(?:Image:)?([^\"]*)\"([^>]+)", Pattern.MULTILINE); //$NON-NLS-1$
+
+ String htmlSrc;
+ try {
+ htmlSrc = readSrc();
+ } catch (IOException e) {
+ throw new BuildException("Cannot read src: " + src + ": " + e.getMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ log("Parsing " + src, Project.MSG_INFO); //$NON-NLS-1$
+ int fileCount = 0;
+ Matcher imagePatternMatcher = imagePattern.matcher(htmlSrc);
+ while (imagePatternMatcher.find()) {
+ String alt = imagePatternMatcher.group(1);
+ String imageFragment = imagePatternMatcher.group(2);
+ if (imageFragment != null) {
+ Matcher fragmentUrlMatcher = fragmentUrlPattern.matcher(imageFragment);
+ if (fragmentUrlMatcher.find()) {
+ String url = fragmentUrlMatcher.group(1);
+ String qualifiedUrl = base + url;
+ log("Fetching " + qualifiedUrl, Project.MSG_INFO); //$NON-NLS-1$
+ Get get = new Get();
+ get.setProject(getProject());
+ get.setLocation(getLocation());
+ try {
+ get.setSrc(new URL(qualifiedUrl));
+ } catch (MalformedURLException e) {
+ log("Skipping " + url + ": " + e.getMessage(), Project.MSG_WARN); //$NON-NLS-1$ //$NON-NLS-2$
+ continue;
+ }
+ // note: we use the alt text for the name since for some files there is a case-difference between
+ // the server URL and the text used in the image src of the markup
+ // note that the alt= text of floated images will be empty
+ String name;
+ if ((alt == null) || (alt.isEmpty()))
+ name = url.substring(url.lastIndexOf('/') + 1);
+ else
+ name = alt;
+ get.setDest(new File(dest, name));
+ get.execute();
+ ++fileCount;
+ }
+ }
+ }
+ log("Fetched " + fileCount + " image files for " + src, Project.MSG_INFO); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public String getBase() {
+ return base;
+ }
+
+ public File getDest() {
+ return dest;
+ }
+
+ public File getSrc() {
+ return src;
+ }
+
+ private String readSrc() throws IOException {
+ StringBuilder buf = new StringBuilder((int) src.length());
+ Reader reader = new BufferedReader(new FileReader(src));
+ try {
+ int i;
+ while ((i = reader.read()) != -1) {
+ buf.append((char) i);
+ }
+ } finally {
+ reader.close();
+ }
+ return buf.toString();
+ }
+
+ public void setBase(String base) {
+ this.base = base;
+ }
+
+ public void setDest(File dest) {
+ this.dest = dest;
+ }
+
+ public void setSrc(File src) {
+ this.src = src;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/tasks.properties b/org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/tasks.properties
new file mode 100644
index 00000000000..3454828c5cc
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/src/org/eclipse/osee/framework/help/ui/internal/anttask/tasks.properties
@@ -0,0 +1 @@
+osee-mediawiki-fetch-images=org.eclipse.osee.framework.help.ui.internal.anttask.OSEEWikiImageFetcher \ No newline at end of file
diff --git a/org.eclipse.osee.framework.help.ui/toc.xml b/org.eclipse.osee.framework.help.ui/toc.xml
new file mode 100644
index 00000000000..b45987e93ba
--- /dev/null
+++ b/org.eclipse.osee.framework.help.ui/toc.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="OSEE User Guide">
+ <anchor id="before-reference" />
+ <topic label="Getting Started">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Intro-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic label="Concepts">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Concepts-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic label="Feature Reference">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Features-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference" />
+ </topic>
+ <topic href="userguide/OSEE Tips.html" label="Tips and Tricks">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Tips-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE New.html" label="What&apos;s New">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE New-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <topic href="userguide/OSEE Update.html" label="Updating this Document">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/OSEE Update-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference"/>
+ </topic>
+ <anchor id="after-reference" />
+ <anchor id="additions" />
+</toc>
diff --git a/org.eclipse.osee.framework.jdbcodbc/.classpath b/org.eclipse.osee.framework.jdbcodbc/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/.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.framework.jdbcodbc/.project b/org.eclipse.osee.framework.jdbcodbc/.project
new file mode 100644
index 00000000000..32be52a530f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.jdbcodbc</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.jdbcodbc/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.jdbcodbc/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..56798bb4d03
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu Jun 19 13:55:40 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.jdbcodbc/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.jdbcodbc/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..1b19480d28b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Jdbcodbc Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.jdbcodbc;singleton:=true
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.jdbcodbc.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+OseeEarlyStart: true
+Service-Component: OSGI-INF/jdbcodbc.connection.driver.provider.xml
+Import-Package: org.eclipse.osee.framework.db.connection,
+ org.osgi.framework
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds
diff --git a/org.eclipse.osee.framework.jdbcodbc/OSGI-INF/jdbcodbc.connection.driver.provider.xml b/org.eclipse.osee.framework.jdbcodbc/OSGI-INF/jdbcodbc.connection.driver.provider.xml
new file mode 100644
index 00000000000..bfd7f609034
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/OSGI-INF/jdbcodbc.connection.driver.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="jdbcodbc.connection.driver.provider">
+ <implementation class="org.eclipse.osee.framework.jdbcodbc.JdbcOdbcConnection"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IConnection"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdbcodbc/build.properties b/org.eclipse.osee.framework.jdbcodbc/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/Activator.java b/org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/Activator.java
new file mode 100644
index 00000000000..7a807405187
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/Activator.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.framework.jdbcodbc;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/JdbcOdbcConnection.java b/org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/JdbcOdbcConnection.java
new file mode 100644
index 00000000000..203ea67b4e9
--- /dev/null
+++ b/org.eclipse.osee.framework.jdbcodbc/src/org/eclipse/osee/framework/jdbcodbc/JdbcOdbcConnection.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.framework.jdbcodbc;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+import org.eclipse.osee.framework.db.connection.IConnection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class JdbcOdbcConnection implements IConnection {
+
+ private static final String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
+
+ public Connection getConnection(Properties properties, String connectionURL) throws ClassNotFoundException, SQLException {
+ Class.forName(driver);
+ Connection connection = DriverManager.getConnection(connectionURL, properties);
+ return connection;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/.classpath b/org.eclipse.osee.framework.jdk.core/.classpath
new file mode 100644
index 00000000000..6e16b23d695
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.jdk.core/.project b/org.eclipse.osee.framework.jdk.core/.project
new file mode 100644
index 00000000000..c729976c89e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.jdk.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.jdk.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.jdk.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..0923db0af66
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,57 @@
+#Mon Aug 04 11:04:44 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.osee.framework.jdk.core/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.jdk.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..5f2edb3c85d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE JDK Core Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.jdk.core;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.framework.jdk.core.collection.tree,
+ org.eclipse.osee.framework.jdk.core.db,
+ org.eclipse.osee.framework.jdk.core.directory,
+ org.eclipse.osee.framework.jdk.core.persistence,
+ org.eclipse.osee.framework.jdk.core.reportdata,
+ org.eclipse.osee.framework.jdk.core.stateMachine,
+ org.eclipse.osee.framework.jdk.core.text,
+ org.eclipse.osee.framework.jdk.core.text.change,
+ org.eclipse.osee.framework.jdk.core.text.rules,
+ org.eclipse.osee.framework.jdk.core.text.tool,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.benchmark,
+ org.eclipse.osee.framework.jdk.core.util.images,
+ org.eclipse.osee.framework.jdk.core.util.io,
+ org.eclipse.osee.framework.jdk.core.util.io.streams,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.jdk.core.util.network,
+ org.eclipse.osee.framework.jdk.core.util.requirement,
+ org.eclipse.osee.framework.jdk.core.util.time,
+ org.eclipse.osee.framework.jdk.core.util.windows,
+ org.eclipse.osee.framework.jdk.core.util.xml,
+ org.eclipse.osee.framework.jdk.core.util.xml.excel,
+ org.eclipse.osee.framework.jdk.core.util.xml.parser,
+ org.eclipse.osee.framework.jdk.core.validate
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.apache.commons.httpclient
diff --git a/org.eclipse.osee.framework.jdk.core/build.properties b/org.eclipse.osee.framework.jdk.core/build.properties
new file mode 100644
index 00000000000..1917f359d93
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/build.properties
@@ -0,0 +1,8 @@
+bin.includes = META-INF/,\
+ lib/,\
+ plugin.xml,\
+ .
+jars.compile.order = .
+output.. = bin/
+source.. = src/
+source.. = src/
diff --git a/org.eclipse.osee.framework.jdk.core/plugin.xml b/org.eclipse.osee.framework.jdk.core/plugin.xml
new file mode 100644
index 00000000000..95d86b58f64
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/plugin.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="DefaultMailServer" name="Default Mail Server" schema="schema/DefaultMailServer.exsd"/>
+</plugin> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/schema/DefaultMailServer.exsd b/org.eclipse.osee.framework.jdk.core/schema/DefaultMailServer.exsd
new file mode 100644
index 00000000000..644d1553e72
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/schema/DefaultMailServer.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.jdk.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.jdk.core" id="DefaultMailServer" name="Default Mail Server"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="mailServer"/>
+ </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="mailServer">
+ <complexType>
+ <attribute name="serverAddress" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/Tree.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/Tree.java
new file mode 100644
index 00000000000..ee888853689
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/Tree.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.framework.jdk.core.collection.tree;
+
+public class Tree<treeType> {
+
+ private TreeNode<treeType> root;
+
+ public Tree() {
+ this.root = new TreeNode<treeType>();
+ }
+
+ public Tree(treeType self) {
+ this.root = new TreeNode<treeType>(self);
+ }
+
+ public TreeNode<treeType> getRoot() {
+ return root;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/TreeNode.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/TreeNode.java
new file mode 100644
index 00000000000..087ceead472
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/collection/tree/TreeNode.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.framework.jdk.core.collection.tree;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class TreeNode<treeType> {
+
+ private treeType myself;
+ private TreeNode<treeType> parent;
+ private List<TreeNode<treeType>> children;
+
+ protected TreeNode(TreeNode<treeType> parent, treeType myself) {
+ this.parent = parent;
+ this.myself = myself;
+ this.children = new ArrayList<TreeNode<treeType>>();
+ }
+
+ public TreeNode(treeType myself) {
+ this(null, myself);
+ }
+
+ public TreeNode() {
+ this(null);
+ }
+
+ public TreeNode<treeType> getParent() {
+ return parent;
+ }
+
+ public treeType getSelf() {
+ return myself;
+ }
+
+ public List<TreeNode<treeType>> getChildren() {
+ return children;
+ }
+
+ public TreeNode<treeType> addChild(treeType child) {
+ TreeNode<treeType> newchild = new TreeNode<treeType>(this, child);
+ this.children.add(newchild);
+ return newchild;
+ }
+
+ public void addChildren(Collection<treeType> children) {
+ for (treeType child : children) {
+ this.addChild(child);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/db/DbConfigFileInformation.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/db/DbConfigFileInformation.java
new file mode 100644
index 00000000000..93cfa940eb9
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/db/DbConfigFileInformation.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.framework.jdk.core.db;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbConfigFileInformation {
+
+ public static String getSchemaFileExtension() {
+ return ".SCHEMA.xml";
+ }
+
+ public static String getDbDataFileExtension() {
+ return ".DATA.xml";
+ }
+
+ public static String getSkyNetFileExtension() {
+ return ".xml";
+ }
+
+ public static String getCSVFileExtension() {
+ return ".csv";
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/directory/DirectoryPerson.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/directory/DirectoryPerson.java
new file mode 100644
index 00000000000..9224873eb64
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/directory/DirectoryPerson.java
@@ -0,0 +1,413 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.directory;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class DirectoryPerson implements Comparable<Object>, Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -2333305323300083640L;
+ private ArrayList<Integer> policies = null;
+ private int bemsid;
+ private int bluesId;
+ private String building;
+ private String city;
+ private String country;
+ private String department;
+ private String departmentName;
+ private String email;
+ private String externalCompany;
+ private String fullName;
+ private String hRDeptDesc;
+ private String hRDeptNumber;
+ private String mailCode;
+ private String mailStop;
+ private String manager;
+ private String personType;
+ private String phone;
+ private String searchName;
+ private String sponsor;
+ private String state;
+ private String title;
+ private String uSPersonStatus;
+ private boolean hasPolicy = false;
+
+ public DirectoryPerson() {
+ policies = new ArrayList<Integer>();
+ bemsid = -1;
+ bluesId = -1;
+ building = "";
+ city = "";
+ country = "";
+ department = "";
+ departmentName = "";
+ email = "";
+ externalCompany = "";
+ fullName = "";
+ hRDeptDesc = "";
+ hRDeptNumber = "";
+ mailCode = "";
+ mailStop = "";
+ manager = "";
+ personType = "";
+ phone = "";
+ searchName = "";
+ sponsor = "";
+ state = "";
+ title = "";
+ uSPersonStatus = "";
+ }
+
+ /**
+ * @return Returns the fullName.
+ */
+ public String getFullName() {
+ return fullName;
+ }
+
+ /**
+ * @param fullName The fullName to set.
+ */
+ public void setFullName(String fullName) {
+ this.fullName = fullName;
+ }
+
+ /**
+ * @return Returns the bems.
+ */
+ public int getBemsid() {
+ return bemsid;
+ }
+
+ /**
+ * @param bems The bems to set.
+ */
+ public void setBemsid(int bems) {
+ this.bemsid = bems;
+ }
+
+ /**
+ * @return Returns the bluesId.
+ */
+ public int getBluesId() {
+ return bluesId;
+ }
+
+ /**
+ * @param bluesId The bluesId to set.
+ */
+ public void setBluesId(int bluesId) {
+ this.bluesId = bluesId;
+ }
+
+ /**
+ * @return Returns the building.
+ */
+ public String getBuilding() {
+ return building;
+ }
+
+ /**
+ * @param building The building to set.
+ */
+ public void setBuilding(String building) {
+ this.building = building;
+ }
+
+ /**
+ * @return Returns the city.
+ */
+ public String getCity() {
+ return city;
+ }
+
+ /**
+ * @param city The city to set.
+ */
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ /**
+ * @return Returns the country.
+ */
+ public String getCountry() {
+ return country;
+ }
+
+ /**
+ * @param country The country to set.
+ */
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ /**
+ * @return Returns the department.
+ */
+ public String getDepartment() {
+ return department;
+ }
+
+ /**
+ * @param department The department to set.
+ */
+ public void setDepartment(String department) {
+ this.department = department;
+ }
+
+ /**
+ * @return Returns the departmentName.
+ */
+ public String getDepartmentName() {
+ return departmentName;
+ }
+
+ /**
+ * @param departmentName The departmentName to set.
+ */
+ public void setDepartmentName(String departmentName) {
+ this.departmentName = departmentName;
+ }
+
+ /**
+ * @return Returns the email.
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @param email The email to set.
+ */
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ /**
+ * @return Returns the externalCompany.
+ */
+ public String getExternalCompany() {
+ return externalCompany;
+ }
+
+ /**
+ * @param externalCompany The externalCompany to set.
+ */
+ public void setExternalCompany(String externalCompany) {
+ this.externalCompany = externalCompany;
+ }
+
+ /**
+ * @return Returns the hRDeptDesc.
+ */
+ public String getHRDeptDesc() {
+ return hRDeptDesc;
+ }
+
+ /**
+ * @param deptDesc The hRDeptDesc to set.
+ */
+ public void setHRDeptDesc(String deptDesc) {
+ hRDeptDesc = deptDesc;
+ }
+
+ /**
+ * @return Returns the hRDeptNumber.
+ */
+ public String getHRDeptNumber() {
+ return hRDeptNumber;
+ }
+
+ /**
+ * @param deptNumber The hRDeptNumber to set.
+ */
+ public void setHRDeptNumber(String deptNumber) {
+ hRDeptNumber = deptNumber;
+ }
+
+ /**
+ * @return Returns the mailCode.
+ */
+ public String getMailCode() {
+ return mailCode;
+ }
+
+ /**
+ * @param mailCode The mailCode to set.
+ */
+ public void setMailCode(String mailCode) {
+ this.mailCode = mailCode;
+ }
+
+ /**
+ * @return Returns the mailStop.
+ */
+ public String getMailStop() {
+ return mailStop;
+ }
+
+ /**
+ * @param mailStop The mailStop to set.
+ */
+ public void setMailStop(String mailStop) {
+ this.mailStop = mailStop;
+ }
+
+ /**
+ * @return Returns the manager.
+ */
+ public String getManager() {
+ return manager;
+ }
+
+ /**
+ * @param manager The manager to set.
+ */
+ public void setManager(String manager) {
+ this.manager = manager;
+ }
+
+ /**
+ * @return Returns the personType.
+ */
+ public String getPersonType() {
+ return personType;
+ }
+
+ /**
+ * @param personType The personType to set.
+ */
+ public void setPersonType(String personType) {
+ this.personType = personType;
+ }
+
+ /**
+ * @return Returns the phone.
+ */
+ public String getPhone() {
+ return phone;
+ }
+
+ /**
+ * @param phone The phone to set.
+ */
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ /**
+ * @return Returns the searchName.
+ */
+ public String getSearchName() {
+ return searchName;
+ }
+
+ /**
+ * @param searchName The searchName to set.
+ */
+ public void setSearchName(String searchName) {
+ this.searchName = searchName;
+ }
+
+ /**
+ * @return Returns the sponsor.
+ */
+ public String getSponsor() {
+ return sponsor;
+ }
+
+ /**
+ * @param sponsor The sponsor to set.
+ */
+ public void setSponsor(String sponsor) {
+ this.sponsor = sponsor;
+ }
+
+ /**
+ * @return Returns the state.
+ */
+ public String getState() {
+ return state;
+ }
+
+ /**
+ * @param state The state to set.
+ */
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ /**
+ * @return Returns the title.
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * @param title The title to set.
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * @return Returns the uSPersonStatus.
+ */
+ public String getUSPersonStatus() {
+ return uSPersonStatus;
+ }
+
+ /**
+ * @param personStatus The uSPersonStatus to set.
+ */
+ public void setUSPersonStatus(String personStatus) {
+ uSPersonStatus = personStatus;
+ }
+
+ public int compareTo(Object person) {
+ return fullName.compareTo(((DirectoryPerson) person).fullName);
+ }
+
+ /**
+ * @return Returns the policies.
+ */
+ public ArrayList<Integer> getPolicies() {
+ return policies;
+ }
+
+ /**
+ * @param policies The policies to set.
+ */
+ public void setPolicies(ArrayList<Integer> policies) {
+ this.policies = policies;
+ }
+
+ public boolean isHasPolicy() {
+ return hasPolicy;
+ }
+
+ public void setHasPolicy(boolean hasPolicy) {
+ this.hasPolicy = hasPolicy;
+ }
+
+ public String toString() {
+ return fullName + " : " + this.bemsid + " : " + email;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/TwoWayXmlizable.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/TwoWayXmlizable.java
new file mode 100644
index 00000000000..698c50eb602
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/TwoWayXmlizable.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.framework.jdk.core.persistence;
+
+import org.w3c.dom.Element;
+
+public interface TwoWayXmlizable extends Xmlizable {
+ public abstract void initializeFromXml(Element root);
+
+ public abstract boolean isInitialized();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/Xmlizable.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/Xmlizable.java
new file mode 100644
index 00000000000..83f89ff51d4
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/persistence/Xmlizable.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.framework.jdk.core.persistence;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface Xmlizable {
+ public Element toXml(Document doc);
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportData.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportData.java
new file mode 100644
index 00000000000..d1414f1a522
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportData.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.framework.jdk.core.reportdata;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+
+public class ReportData implements Serializable {
+
+ private static final long serialVersionUID = 6645261625619889708L;
+
+ private List<String> headers;
+ private List<ReportDataItem> items;
+
+ /**
+ * Creates the ReportData class with the given headers. The number of headers should match the values passed into
+ * <code>addItem</code>.
+ *
+ * @param headers The headers for the data to be added.
+ */
+ public ReportData(List<String> headers) {
+ this.headers = headers;
+ items = new ArrayList<ReportDataItem>();
+ }
+
+ /**
+ * Adds an item to the ReportData
+ *
+ * @param guid The GUID corresponding to the item added
+ * @param values The values (such as username, script name) associated with the item. These should match the headers.
+ */
+ public void addItem(GUID guid, ArrayList<String> values) {
+ ReportDataItem item = new ReportDataItem(guid, values);
+ items.add(item);
+ }
+
+ public void clearItems() {
+ items.clear();
+ }
+
+ /**
+ * @param headers The headers to set.
+ */
+ public void setHeaders(List<String> headers) {
+ this.headers = headers;
+ }
+
+ /**
+ * @return Returns the headers.
+ */
+ public List<String> getHeaders() {
+ return headers;
+ }
+
+ /**
+ * @return Returns the items.
+ */
+ public List<ReportDataItem> getItems() {
+ return items;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataItem.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataItem.java
new file mode 100644
index 00000000000..5ac525c7f08
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataItem.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.framework.jdk.core.reportdata;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+
+public class ReportDataItem implements Serializable {
+
+ private static final long serialVersionUID = 7072248922173369711L;
+
+ private GUID guid;
+ private ArrayList<String> cells;
+
+ public ReportDataItem(GUID guid, ArrayList<String> items) {
+ this.guid = guid;
+ this.cells = items;
+ }
+
+ /**
+ * @return Returns the guid.
+ */
+ public GUID getGuid() {
+ return guid;
+ }
+
+ /**
+ * @return Returns the cells.
+ */
+ public ArrayList<String> getCells() {
+ return cells;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataListener.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataListener.java
new file mode 100644
index 00000000000..a998d631fab
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/reportdata/ReportDataListener.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.framework.jdk.core.reportdata;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface ReportDataListener extends Remote {
+ public void updateData(ReportData data) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/IState.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/IState.java
new file mode 100644
index 00000000000..ac8bb165bfa
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/IState.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.framework.jdk.core.stateMachine;
+
+/**
+ * A single state in a contructed state machine. All implementers should calculate and control what the next state in
+ * the machine should be.
+ */
+public interface IState {
+ /**
+ * Called by the state machine controller to start this particular state.
+ *
+ * @return The next state the controller should run or null if the machine should terminate
+ */
+ public IState run();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/StateController.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/StateController.java
new file mode 100644
index 00000000000..f455b0306b7
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/StateController.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.framework.jdk.core.stateMachine;
+
+/**
+ * Runs each state of the stateMachine defined. Each state will calculate and know which state to go to next so this is
+ * really a dumb controller, calling the run method of whatever state the current state returned from being run.
+ */
+public class StateController {
+ private IState nextState;
+ private boolean isRunning;
+
+ public StateController(IState initialState) {
+ isRunning = true;
+ nextState = initialState;
+ }
+
+ /**
+ * Calls the run method of the next state.
+ */
+ public void runNextState() {
+ if (isRunning) nextState = nextState.run();
+ if (nextState == null) isRunning = false;
+ }
+
+ public boolean isRunning() {
+ return isRunning;
+ }
+
+ /**
+ * causes machine to terminate on next ivocation of the controller's run method.
+ */
+ public void turnMachineOff() {
+ isRunning = false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/WaitState.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/WaitState.java
new file mode 100644
index 00000000000..b586792c21b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/stateMachine/WaitState.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.framework.jdk.core.stateMachine;
+
+/**
+ * allows a state machine to wait for a certain number of cycles before continuing. Notice that if a state needs to wait
+ * only one cycle, a wait state should not be used as it would really be two cycles ( one to run the wait state then one
+ * to start the next state). Instead that state could simply return an instance of the next state to run as normal.
+ */
+public class WaitState implements IState {
+
+ int iterationsToWait;
+ IState nextRealStateToRun;
+
+ /**
+ * @param iterationsToWait The number of times this state will be run
+ * @param nextRealStateToRun The next state to run after waiting
+ */
+ public WaitState(int iterationsToWait, IState nextRealStateToRun) {
+ this.iterationsToWait = iterationsToWait;
+ this.nextRealStateToRun = nextRealStateToRun;
+ }
+
+ public IState run() {
+ iterationsToWait--;
+ if (iterationsToWait <= 0)
+ return nextRealStateToRun;
+ else
+ return this;
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractComments.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractComments.java
new file mode 100644
index 00000000000..de9f0a9dbed
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractComments.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.framework.jdk.core.text;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExtractComments {
+ protected BufferedReader in;
+ protected String line;
+ protected ArrayList<String> comments;
+ protected int count;
+
+ public ExtractComments() {
+ in = null;
+ line = null;
+ comments = new ArrayList<String>();
+ }
+
+ public Object[] extract(String sourceFile) {
+ try {
+ in = new BufferedReader(new FileReader(sourceFile));
+ } catch (FileNotFoundException ex) {
+ System.err.println(ex);
+ throw new IllegalArgumentException(ex.toString());
+ }
+
+ try {
+ while ((line = in.readLine()) != null) {
+ handleComments();
+ }
+ } catch (IOException ex) {
+ System.err.println(ex);
+ System.exit(2);
+ }
+ return comments.toArray();
+ }
+
+ protected void handleComments() {
+ try {
+ while (line != null) {
+ String tLine = line.trim();
+ if (tLine.startsWith("/*")) {
+ comments.add(++count + line);
+ while (tLine != null && !tLine.endsWith("*/")) {
+ tLine = in.readLine().trim();
+ comments.add(++count + line);
+ }
+ } else if (!tLine.startsWith("//")) {
+ //a logical LOC might have a comment folloing it on the same line
+ line = stripOffComment(tLine);
+ return;
+ }
+ comments.add(++count + line);
+ line = in.readLine();
+ }
+ } catch (IOException ex) {
+ System.err.println(ex);
+ return;
+ }
+ }
+
+ public String stripOffComment(String line) {
+ int pos = line.lastIndexOf("//");
+ if (pos != -1) { //if a comment is indeed there (maybe)
+ //the single line comment symbol might be part of a string literal
+ //this is hard because the string delimiter might also be part of a string literal
+ if (!insideStringLiteral(line, pos)) {
+ comments.add(++count + this.line);
+ return line.substring(0, pos).trim();
+ }
+ }
+ count++;
+ return line;
+ }
+
+ public boolean insideStringLiteral(String str, int pos) {
+ int index = 0;
+ boolean inside = false;
+
+ char[] chars = new char[str.length()];
+ str.getChars(0, chars.length, chars, 0);
+
+ while (index < pos) {
+ if (chars[index] == '\\' && chars[index + 1] == '\"') {
+ index++; // skip over literal quotation marks
+ } else if (chars[index] == '\"') {
+ inside = !inside;
+ }
+ index++;
+ }
+ return inside;
+ }
+
+ public static void main(String[] args) {
+ if (args.length < 1) {
+ System.out.println("Usage: ExtractComments [source file]");
+ return;
+ }
+ ExtractComments app = new ExtractComments();
+ Object[] text = app.extract(args[0]);
+
+ try {
+ FileWriter out = new FileWriter("comments.txt");
+ for (int i = 0; i < text.length; i++) {
+ String str = (String) text[i];
+ out.write(str, 0, str.length());
+ out.write('\n');
+ }
+ out.close();
+ } catch (IOException ex) {
+ System.err.println(ex);
+ return;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractText.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractText.java
new file mode 100644
index 00000000000..cb789e6b39b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/ExtractText.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.framework.jdk.core.text;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExtractText {
+ protected String line;
+ protected int lineNum;
+ protected BufferedReader in;
+ protected FileWriter out;
+
+ public ExtractText(String sourceFile) {
+ try {
+ in = new BufferedReader(new FileReader(sourceFile));
+ out = new FileWriter("sourceText.txt");
+ line = null;
+ lineNum = 0;
+
+ while ((line = in.readLine()) != null) {
+ int pos = line.indexOf("/*");
+ if (pos != -1) { // beginning of block comment unless in a string literal
+ if (!insideStringLiteral(line, pos)) {
+ //find whole block and write to file
+ pos = line.indexOf("*/");
+ while (line != null && pos == -1) {
+ writeText();
+ line = in.readLine();
+ pos = line.indexOf("*/");
+ }
+ writeText();
+ } else { // line contains a string
+ writeText();
+ }
+ } else if (line.indexOf("//") != -1) { // line contains a single line comment or string literal
+ writeText();
+ } else if ((pos = line.indexOf("\"")) != -1 && line.charAt(pos + 1) != '\'') { // line contains a string literal
+ writeText();
+ }
+ // line does not contain text
+ lineNum++;
+ }
+ in.close();
+ out.close();
+ } catch (IOException ex) {
+ System.err.println(ex);
+ return;
+ }
+ }
+
+ protected void writeText() throws IOException {
+ String str = String.valueOf(++lineNum);
+ out.write(str, 0, str.length());
+ out.write(line, 0, line.length());
+ out.write('\n');
+ }
+
+ public static boolean insideStringLiteral(String str, int pos) {
+ int index = 0;
+ boolean inside = false;
+
+ char[] chars = new char[str.length()];
+ str.getChars(0, chars.length, chars, 0);
+
+ while (index < pos) {
+ if (chars[index] == '\\' && chars[index + 1] == '\"') {
+ index++; // skip over literal quotation marks
+ } else if (chars[index] == '\"') {
+ inside = !inside;
+ }
+ index++;
+ }
+ return inside;
+ }
+
+ public static void main(String[] args) {
+ if (args.length < 1) {
+ System.out.println("Usage: ExtractText [source file]");
+ return;
+ }
+ new ExtractText(args[0]);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FileToBufferConvert.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FileToBufferConvert.java
new file mode 100644
index 00000000000..2d4e94cd6a9
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FileToBufferConvert.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.framework.jdk.core.text;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface FileToBufferConvert {
+ public CharSequence fileToCharSequence(File file) throws IOException, ParseException;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FindResults.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FindResults.java
new file mode 100644
index 00000000000..12a468b175b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/FindResults.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.text;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FindResults {
+ private HashMap<String, HashMap<File, List<String>>> results;
+
+ public FindResults(int initialCapacity) {
+ results = new HashMap<String, HashMap<File, List<String>>>(initialCapacity * 4 / 3);
+ }
+
+ public void addMatch(String pattern, File file, String region) {
+ HashMap<File, List<String>> fileMatches = results.get(pattern);
+
+ if (fileMatches == null) {
+ fileMatches = new HashMap<File, List<String>>();
+ results.put(pattern, fileMatches);
+ }
+
+ List<String> regions = fileMatches.get(file);
+ if (regions == null) {
+ regions = new LinkedList<String>();
+ fileMatches.put(file, regions);
+ }
+ regions.add(region);
+ }
+
+ public void writeFindResutls(Writer out) throws IOException {
+ for (FindResults.FindResultsIterator i = iterator(); i.hasNext();) {
+ // write out the file name, pattern, and region surrounding match
+ out.write(i.currentPattern);
+ out.write('@');
+ out.write(i.currentFile.getName());
+ out.write('@');
+ if (i.currentRegion != null) {
+ out.write(i.currentRegion);
+ }
+ out.write("\n");
+ }
+ }
+
+ public FindResultsIterator iterator() {
+ return new FindResultsIterator();
+ }
+
+ /**
+ * @author Ryan D. Brooks
+ */
+ public class FindResultsIterator {
+ private Iterator<Entry<String, HashMap<File, List<String>>>> patternIterator;
+ private Iterator<Entry<File, List<String>>> fileIterator;
+ private Iterator<String> listIterator;
+ private boolean more;
+ public String currentPattern;
+ public File currentFile;
+ public String currentRegion;
+
+ private FindResultsIterator() {
+ reset();
+ }
+
+ public void reset() {
+ this.more = true;
+ this.patternIterator = results.entrySet().iterator();
+ this.listIterator = null;
+ this.fileIterator = null;
+ }
+
+ // assumption every the list and file itorator's will have at least one item
+ private void primePump() {
+ if (listIterator == null || !listIterator.hasNext()) {
+ if (fileIterator == null || !fileIterator.hasNext()) {
+ if (!patternIterator.hasNext()) {
+ more = false;
+ return;
+ }
+ Map.Entry<String, HashMap<File, List<String>>> entry = patternIterator.next();
+ currentPattern = entry.getKey();
+ HashMap<File, List<String>> fileMatches = entry.getValue();
+ fileIterator = fileMatches.entrySet().iterator();
+ }
+ Map.Entry<File, List<String>> entry = fileIterator.next();
+ currentFile = entry.getKey();
+ List<String> list = entry.getValue();
+ listIterator = list.iterator();
+ }
+ currentRegion = listIterator.next();
+ }
+
+ public boolean hasNext() {
+ primePump();
+ return more;
+ }
+ }
+
+ /**
+ * Returns a simple set of all files that had matches (or anti-matches)
+ */
+ public Set<File> getFileSet() {
+ Set<File> files = new LinkedHashSet<File>(1000);
+ for (Iterator<Entry<String, HashMap<File, List<String>>>> i = results.entrySet().iterator(); i.hasNext();) {
+ Map.Entry<String, HashMap<File, List<String>>> entry = i.next();
+ HashMap<File, List<String>> fileMatches = entry.getValue();
+ files.addAll(fileMatches.keySet());
+ }
+ return files;
+ }
+
+ public HashMap<String, List<File>> getRegionToFileMapping() {
+ HashMap<String, List<File>> mapping = new HashMap<String, List<File>>(1000);
+ for (FindResultsIterator i = iterator(); i.hasNext();) {
+ List<File> files = mapping.get(i.currentRegion);
+ if (files == null) {
+ files = new LinkedList<File>();
+ mapping.put(i.currentRegion, files);
+ }
+ files.add(i.currentFile);
+ }
+ return mapping;
+ }
+
+ public IteratorPerPattern getIteratorForPattern(String pattern) {
+ return new IteratorPerPattern(pattern);
+ }
+
+ /**
+ * @author Ryan D. Brooks
+ */
+ public class IteratorPerPattern {
+ private String pattern;
+ private Iterator<Entry<File, List<String>>> fileIterator;
+ private Iterator<String> listIterator;
+ private boolean more;
+ public File currentFile;
+ public String currentRegion;
+
+ private IteratorPerPattern(String pattern) {
+ this.pattern = pattern;
+ reset();
+ }
+
+ public void reset() {
+ HashMap<File, List<String>> fileMatches = results.get(pattern);
+ this.fileIterator = fileMatches.entrySet().iterator();
+ this.listIterator = null;
+ this.more = true;
+ }
+
+ // assumption every the list and file itorator's will have at least one item
+ private void primePump() {
+ if (listIterator == null || !listIterator.hasNext()) {
+ if (!fileIterator.hasNext()) {
+ more = false;
+ return;
+ }
+ Map.Entry<File, List<String>> entry = fileIterator.next();
+ currentFile = entry.getKey();
+ List<String> list = entry.getValue();
+ listIterator = list.iterator();
+ }
+ currentRegion = listIterator.next();
+ }
+
+ public boolean hasNext() {
+ primePump();
+ return more;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Range.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Range.java
new file mode 100644
index 00000000000..370ebeba21b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Range.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.framework.jdk.core.text;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Range {
+ public int start;
+ public int end;
+ public int length;
+
+ public Range(int start, int end) {
+ this.start = start;
+ this.end = end;
+ this.length = end - start;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Rule.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Rule.java
new file mode 100644
index 00000000000..1b6bcbdf6e5
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/Rule.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.text;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class Rule {
+ private String outExtension;
+ private String currentOutfileName;
+ private File inputFile;
+ private String subdirectoryName;
+ private Pattern fileNamePattern;
+ protected boolean ruleWasApplicable;
+ protected Logger logger;
+
+ public Rule() {
+ this("done");
+ }
+
+ public Rule(String outExtension) {
+ this.outExtension = outExtension;
+ this.ruleWasApplicable = false;
+ logger = Logger.getLogger(this.getClass().getName());
+ logger.setLevel(Level.ALL);
+ this.subdirectoryName = null;
+ }
+
+ public abstract ChangeSet computeChanges(CharSequence seq);
+
+ public void process(Collection<File> list) {
+ for (File file : list) {
+ try {
+ process(file);
+ } catch (Exception ex) {
+ System.out.println(currentOutfileName + ": " + ex.getMessage());
+ }
+ }
+ }
+
+ public void process(File file) throws IOException {
+ if (file.isDirectory()) {
+ List<File> files = Lib.recursivelyListFiles(file, fileNamePattern);
+ for (File aFile : files) {
+ try {
+ process(aFile);
+ } catch (Exception ex) {
+ System.out.println(currentOutfileName + ": " + ex.getMessage());
+ }
+ }
+ } else {
+ inputFile = file;
+ process(file, getResultFile(file));
+ }
+ }
+
+ public void process(File inFile, File outFile) throws IOException {
+ File subdirectory;
+ if (subdirectoryName != null) {
+ File parent = outFile.getParentFile();
+ subdirectory = new File(parent, subdirectoryName);
+ subdirectory.mkdir();
+ outFile = new File(subdirectory, outFile.getName());
+ }
+
+ this.currentOutfileName = outFile.getName();
+ if (inFile.exists()) {
+ RulesLogHandler handler = null;
+ ChangeSet changeSet = null;
+ try {
+ handler = new RulesLogHandler(new File(Lib.changeExtension(outFile.getPath(), "xml")));
+ logger.addHandler(handler);
+ ruleWasApplicable = false;
+ changeSet = computeChanges(Lib.fileToCharBuffer(inFile));
+ } catch (ParserConfigurationException ex) {
+ logger.log(Level.SEVERE, ex.toString(), ex);
+ } finally {
+ if (handler != null) {
+ handler.close();
+ logger.removeHandler(handler);
+ }
+ }
+ if (ruleWasApplicable) {
+ if (subdirectoryName == null) {
+ System.out.println("Rule was applied to " + currentOutfileName);
+ } else
+ System.out.println("Rule was applied to " + subdirectoryName + currentOutfileName);
+
+ if (changeSet != null) changeSet.applyChanges(outFile);
+ }
+ // else {
+ // System.out.println("Not applicable to " + currentFileName);
+ // }
+
+ } else {
+ System.out.println("The file " + inFile + " does not exist!");
+ }
+ }
+
+ protected File getResultFile(File file) {
+
+ if (outExtension == null) {
+ return file;
+ }
+
+ return new File(Lib.removeExtension(file.getPath()) + "." + outExtension);
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 3) {
+ System.out.println("Usage: " + Rule.class.getName() + " <ruleClassPath> <ruleClass> <file list>");
+ return;
+ }
+
+ String ruleName = args[1];
+ String classPath = args[0];
+ try {
+ URLClassLoader classLoader = new URLClassLoader(new URL[] {Lib.getUrlFromString(classPath)});
+ System.out.println("class path: " + classLoader.getURLs()[0]);
+ Object obj = classLoader.loadClass(ruleName).newInstance();
+
+ if (obj instanceof org.eclipse.osee.framework.jdk.core.text.Rule) {
+ Rule rule = (Rule) obj;
+ for (int i = 2; i < args.length; i++) {
+ try {
+ rule.process(new File(args[i]));
+ } catch (Exception ex) {
+ System.out.println("Exception in Rule!!! " + rule.currentOutfileName + ": " + ex.getMessage());
+ ex.printStackTrace();
+ }
+ }
+ } else {
+ throw new IllegalArgumentException(ruleName + " is not of type text.Rule.");
+ }
+ } catch (InstantiationException ex) {
+ System.out.println(ex);
+ } catch (IllegalAccessException ex) {
+ System.out.println(ex);
+ } catch (ClassNotFoundException ex) {
+ System.out.println(ex);
+ }
+ }
+
+ public boolean ruleWasApplicable() {
+ return ruleWasApplicable;
+ }
+
+ /**
+ * @return Returns the currentFileName.
+ */
+ public String getCurrentOutfileName() {
+ return currentOutfileName;
+ }
+
+ /**
+ * @param ruleWasApplicable The ruleWasApplicable to set.
+ */
+ public void setRuleWasApplicable(boolean ruleWasApplicable) {
+ this.ruleWasApplicable = ruleWasApplicable;
+ }
+
+ public File getInputFile() {
+ return inputFile;
+ }
+
+ public void setSubdirectoryNameToPlaceResultFilesIn(String subdirectoryName) {
+ this.subdirectoryName = subdirectoryName;
+ }
+
+ public void setFileNamePattern(Pattern fileNamePattern) {
+ this.fileNamePattern = fileNamePattern;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RuleRecord.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RuleRecord.java
new file mode 100644
index 00000000000..e8b736dcf6f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RuleRecord.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.framework.jdk.core.text;
+
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Michael A. Winston
+ */
+public class RuleRecord extends LogRecord implements Xmlizable {
+
+ private static final long serialVersionUID = 6974861818239720347L;
+
+ /**
+ * RuleRecord 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 level The logging level.
+ * @param msg The log message.
+ */
+ public RuleRecord(Level level, String msg) {
+ super(level, msg);
+ }
+
+ /**
+ * Converts log element to XML format.
+ *
+ * @return xml formated element.
+ */
+ public Element toXml(Document doc) {
+ Element recordElement = Jaxp.createElement(doc, getLevel().getName(), getMessage());
+ return recordElement;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RulesLogHandler.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RulesLogHandler.java
new file mode 100644
index 00000000000..fefecb6e140
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/RulesLogHandler.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.framework.jdk.core.text;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class RulesLogHandler extends Handler {
+
+ private Document document;
+ private File outFile;
+ private Element rootElement;
+
+ /**
+ * RulesLogHandler Constructor. Sets the file 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 file that will be used to output the log.
+ * @throws ParserConfigurationException
+ */
+ public RulesLogHandler(File outFile) throws ParserConfigurationException {
+ super();
+ this.outFile = outFile;
+ document = Jaxp.newDocument();
+ rootElement = document.createElement("Rule");
+ document.appendChild(rootElement);
+ }
+
+ /**
+ * Write out the log records as XML.
+ */
+ public void writeOutFile() {
+ // only write the XML file if there is something to write
+ if (rootElement.hasChildNodes()) {
+ try {
+ // create an XMLOutputter that indents using 3 spaces and uses new lines
+ OutputFormat format = new OutputFormat(document);
+ format.setIndenting(true);
+ format.setIndent(3);
+ Jaxp.writeXmlDocument(document, outFile, format);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } catch (TransformerException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.util.logging.Handler#publish(java.util.logging.LogRecord)
+ */
+ public void publish(LogRecord logRecord) {
+ if (!isLoggable(logRecord)) {
+ return;
+ }
+
+ if (logRecord instanceof RuleRecord) {
+ RuleRecord record = (RuleRecord) logRecord;
+ rootElement.appendChild(record.toXml(document));
+ } else {
+ rootElement.appendChild(Jaxp.createElement(document, logRecord.getLevel().getName(), logRecord.getMessage()));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.util.logging.Handler#close()
+ */
+ public void close() throws SecurityException {
+ writeOutFile();
+ }
+
+ /*
+ * (non-Javadoc) don't call this method
+ *
+ * @see java.util.logging.Handler#flush()
+ */
+ public void flush() {
+ throw new UnsupportedOperationException();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChOps.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChOps.java
new file mode 100644
index 00000000000..3b622798e7f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChOps.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.framework.jdk.core.text.change;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ChOps {
+
+ /**
+ * take a string containing one or more "\n" and replace with a new line char then replace all "\\n" with "\n"
+ *
+ * @param src
+ * @param srcStartIndex
+ * @param srcEndIndex
+ * @return char[]
+ */
+ public static char[] embedNewLines(char[] src, int srcStartIndex, int srcEndIndex) {
+ int stop = srcEndIndex - 1; //don't loop for the last char so we can use src[i+1]
+ int replaceCount = 0;
+ for (int i = srcStartIndex; i < stop; i++) {
+ if (src[i] == '\\') {
+ i++;
+ if (src[i] == '\\' || src[i] == 'n') {
+ replaceCount++;
+ }
+ }
+ }
+
+ char[] result = new char[srcEndIndex - srcStartIndex - replaceCount];
+
+ int srcPos = srcStartIndex;
+ for (int i = 0; i < result.length; i++) {
+ if (src[srcPos] == '\\') {
+ if (src[srcPos + 1] == '\\') {
+ srcPos += 2; // skip over the two escaped chars
+ result[i] = '\\'; // and replace them here
+ } else if (src[srcPos + 1] == 'n') {
+ srcPos += 2; // skip over the two escaped chars
+ result[i] = '\n'; // and replace them here
+ } else {
+ result[i] = src[srcPos++];
+ }
+ } else {
+ result[i] = src[srcPos++];
+ }
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChangeSet.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChangeSet.java
new file mode 100644
index 00000000000..0a9066eb40e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/ChangeSet.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.text.change;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.CharBuffer;
+import java.util.regex.Matcher;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ChangeSet {
+ private CharacterChanger firstChange;
+ private CharacterChanger lastChange;
+ private char[] sourceChars;
+ private CharSequence source;
+
+ public ChangeSet() {
+ this("");
+ }
+
+ public ChangeSet(CharSequence source) {
+ if (source instanceof CharBuffer) {
+ CharBuffer charBuf = (CharBuffer) source;
+ if (charBuf.hasArray()) {
+ sourceChars = charBuf.array();
+ return;
+ }
+ }
+ if (source instanceof String) {
+ sourceChars = ((String) source).toCharArray();
+ }
+ this.source = source;
+ }
+
+ private int copyFromSource(int srcStrartIndex, int srcEndIndex, char[] dest, int destPos) {
+ if (sourceChars != null) {
+ int length = srcEndIndex - srcStrartIndex;
+ System.arraycopy(sourceChars, srcStrartIndex, dest, destPos, length);
+ return destPos + length;
+ } else {
+ for (int i = srcStrartIndex; i < srcEndIndex; i++) {
+ dest[destPos++] = source.charAt(i);
+ }
+ return destPos;
+ }
+ }
+
+ private void writeFromSource(int srcStrartIndex, int srcEndIndex, Writer writer) throws IOException {
+ if (sourceChars != null) {
+ writer.write(sourceChars, srcStrartIndex, srcEndIndex - srcStrartIndex);
+ } else {
+ for (int i = srcStrartIndex; i < srcEndIndex; i++) {
+ writer.write(source.charAt(i));
+ }
+ }
+ }
+
+ public int getSourceLength() {
+ if (sourceChars == null) {
+ return source.length();
+ }
+ return sourceChars.length;
+ }
+
+ public void applyChanges(char[] dest, int destPos) {
+ int lastEndIndex = 0;
+
+ CharacterChanger change = firstChange;
+ while (change != null) {
+ destPos = copyFromSource(lastEndIndex, change.getStartIndex(), dest, destPos);
+ lastEndIndex = change.getEndIndex();
+ destPos = change.applyChange(dest, destPos);
+ change = change.next();
+ }
+ copyFromSource(lastEndIndex, getSourceLength(), dest, destPos);
+ }
+
+ /**
+ * Make sure this writer is buffered if source is only a CharSequence
+ *
+ * @param writer
+ * @throws IOException
+ */
+ public void applyChanges(Writer writer) throws IOException {
+ int lastEndIndex = 0;
+
+ CharacterChanger change = firstChange;
+ while (change != null) {
+ writeFromSource(lastEndIndex, change.getStartIndex(), writer);
+ lastEndIndex = change.getEndIndex();
+ change.applyChange(writer);
+ change = change.next();
+ }
+ writeFromSource(lastEndIndex, getSourceLength(), writer);
+ }
+
+ public void applyChanges(File outFile) throws IOException {
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
+ applyChanges(writer);
+ writer.close();
+ }
+
+ public void insertBefore(int index, char[] newChars, int offset, int length, boolean copy) {
+ addChanger(new CharArrayChange(index, index, newChars, offset, length, copy));
+ }
+
+ public void insertBefore(int index, char[] newChars, int offset, int length) {
+ addChanger(new CharArrayChange(index, index, newChars, offset, length));
+ }
+
+ public void insertBefore(int index, char[] newChars) {
+ addChanger(new CharArrayChange(index, index, newChars));
+ }
+
+ public void insertBefore(int index, char newChar) {
+ addChanger(new CharChange(index, index, newChar));
+ }
+
+ public void insertBefore(int index, String newChar) {
+ insertBefore(index, newChar.toCharArray());
+ }
+
+ public void replace(int srcStartIndex, int srcEndIndex, char[] newChars, int offset, int length) {
+ addChanger(new CharArrayChange(srcStartIndex, srcEndIndex, newChars, offset, length));
+ }
+
+ public void replace(int srcStartIndex, int srcEndIndex, char[] newChars) {
+ addChanger(new CharArrayChange(srcStartIndex, srcEndIndex, newChars));
+ }
+
+ public void replace(int srcStartIndex, int srcEndIndex, char newChar) {
+ addChanger(new CharChange(srcStartIndex, srcEndIndex, newChar));
+ }
+
+ /**
+ *
+ * @param srcStartIndex inclusive start index
+ * @param srcEndIndex inclusive end index
+ * @param newChar
+ */
+ public void replace(int srcStartIndex, int srcEndIndex, String newChar) {
+ replace(srcStartIndex, srcEndIndex, newChar.toCharArray());
+ }
+
+ public void delete(int srcStartIndex, int srcEndIndex) {
+ addChanger(new DeleteChange(srcStartIndex, srcEndIndex));
+ }
+
+ /**
+ * Replaces may not overlap. Deletes may overlap, but they must be combined into a single delete. Optionally you may
+ * combine adjacent deletes. Adjacent inserts may be done at the same index if start is < last end and not a delete
+ * since all changes are placed in order and normalized as they are added to the list of changes is always in order
+ * and normalized
+ */
+ private void addChanger(CharacterChanger changer) {
+ if (firstChange == null) { // if the change set is currently empty
+ firstChange = changer; // no normalization needed since there is only one changer
+ lastChange = firstChange;
+ } else {
+ if (changer.getStartIndex() < lastChange.getStartIndex()) { // if change belongs somewhere before the end
+
+ CharacterChanger current = firstChange;
+ CharacterChanger previous = null;
+ // search for insertion point
+ while (current.getStartIndex() <= changer.getStartIndex()) {
+ previous = current;
+ current = current.next(); // there should always be a next since we already checked that this changer does not belong on the end
+ }
+ addNormalized(previous, changer, current);
+ } else { // changer belongs on the end so skip search for insertion point
+ addNormalized(lastChange, changer, null);
+ }
+ }
+ }
+
+ private void addNormalized(CharacterChanger previous, CharacterChanger changer, CharacterChanger next) {
+ // assumptions: if next is non-null, changer.srcEndIndex < next.srcStartIndex
+ // previous.srcEndIndex <= changer.srcEndIndex
+ // the current set of changes have no overlaps (i.e. is already normalized)
+
+ // if these changes are adjacent deletes, just combine them
+ if (lastChange instanceof DeleteChange && next instanceof DeleteChange) {
+ //lastChange.setDeletionRange
+ }
+
+ if (previous == null) { // if belongs at the head
+ firstChange = changer;
+ } else { // else insert in between
+ overlapping(previous.getEndIndex(), changer.getStartIndex());
+ previous.setNext(changer);
+ }
+ if (next == null) {
+ lastChange = changer;
+ } else {
+ overlapping(changer.getEndIndex(), next.getStartIndex());
+ changer.setNext(next);
+ }
+ }
+
+ private void overlapping(int a, int b) {
+ if (a > b) {
+ throw new IllegalArgumentException(
+ "Overlapping changes are not currently allowed " + a + " > " + b + " " + new String(sourceChars, b - 4,
+ 20));
+ }
+ }
+
+ public int getLengthDelta() {
+ int lengthDelta = 0;
+
+ CharacterChanger change = firstChange;
+ while (change != null) {
+ lengthDelta += change.getLengthDelta();
+ change = change.next();
+ }
+ return lengthDelta;
+ }
+
+ public CharSequence applyChangesToSelf() {
+ this.sourceChars = toCharArray();
+ this.source = CharBuffer.wrap(sourceChars);
+ this.firstChange = null;
+ this.lastChange = null;
+ return source;
+ }
+
+ public char[] toCharArray() {
+ char[] chars = new char[getLengthDelta() + getSourceLength()];
+ applyChanges(chars, 0);
+ return chars;
+ }
+
+ public String toString() {
+ return new String(toCharArray());
+ }
+
+ /**
+ * This function calls reset(source) on your matcher and will replace all matched items in the ChangesSet source.
+ *
+ * @param matcher
+ * @param replacement
+ */
+ public void replaceAll(Matcher matcher, String replacement) {
+ matcher.reset(source);
+ while (matcher.find()) {
+ replace(matcher.start(), matcher.end(), replacement);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharArrayChange.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharArrayChange.java
new file mode 100644
index 00000000000..5dc45cb6aff
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharArrayChange.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.framework.jdk.core.text.change;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CharArrayChange implements CharacterChanger {
+ private int srcStartIndex;
+ private int srcEndIndex;
+ private char[] newChars;
+ private int offset;
+ private int length;
+ private CharacterChanger next;
+
+ public CharArrayChange(int srcStartIndex, int srcEndIndex, char[] newChars, int offset, int length, boolean copy) {
+ super();
+ this.srcStartIndex = srcStartIndex;
+ this.srcEndIndex = srcEndIndex;
+ if (copy) {
+ this.newChars = new char[newChars.length];
+ System.arraycopy(newChars, 0, this.newChars, 0, newChars.length);
+ } else {
+ this.newChars = newChars;
+ }
+ this.offset = offset;
+ this.length = length;
+ }
+
+ /**
+ *
+ */
+ public CharArrayChange(int srcStartIndex, int srcEndIndex, char[] newChars, int offset, int length) {
+ this(srcStartIndex, srcEndIndex, newChars, offset, length, false);
+ }
+
+ public CharArrayChange(int srcStartIndex, int srcEndIndex, char[] newChars) {
+ this(srcStartIndex, srcEndIndex, newChars, 0, newChars.length);
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#getStartIndex()
+ */
+ public int getStartIndex() {
+ return srcStartIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#getEndIndex()
+ */
+ public int getEndIndex() {
+ return srcEndIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#applyChange(char[], int)
+ */
+ public int applyChange(char[] dest, int destPos) {
+ System.arraycopy(newChars, offset, dest, destPos, length);
+ return destPos + length;
+ }
+
+ public void applyChange(Writer writer) throws IOException {
+ writer.write(newChars, offset, length);
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#next()
+ */
+ public CharacterChanger next() {
+ return next;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#setNext(text.change.CharacterChanger)
+ */
+ public void setNext(CharacterChanger next) {
+ this.next = next;
+ }
+
+ public int getLengthDelta() {
+ return length - srcEndIndex + srcStartIndex;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharChange.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharChange.java
new file mode 100644
index 00000000000..691ac97487e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharChange.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.framework.jdk.core.text.change;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CharChange implements CharacterChanger {
+ private int srcStartIndex;
+ private int srcEndIndex;
+ private char newChar;
+ private CharacterChanger next;
+
+ /**
+ *
+ */
+ public CharChange(int srcStartIndex, int srcEndIndex, char newChar) {
+ super();
+ this.srcStartIndex = srcStartIndex;
+ this.srcEndIndex = srcEndIndex;
+ this.newChar = newChar;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#getStartIndex()
+ */
+ public int getStartIndex() {
+ return srcStartIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#getEndIndex()
+ */
+ public int getEndIndex() {
+ return srcEndIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#applyChange(char[], int)
+ */
+ public int applyChange(char[] dest, int destPos) {
+ dest[destPos] = newChar;
+ return destPos + 1;
+ }
+
+ public void applyChange(Writer writer) throws IOException {
+ writer.write(newChar);
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#next()
+ */
+ public CharacterChanger next() {
+ return next;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#setNext(text.change.CharacterChanger)
+ */
+ public void setNext(CharacterChanger next) {
+ this.next = next;
+ }
+
+ public int getLengthDelta() {
+ return 1 - srcEndIndex + srcStartIndex;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharacterChanger.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharacterChanger.java
new file mode 100644
index 00000000000..ad667c15221
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/CharacterChanger.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.framework.jdk.core.text.change;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface CharacterChanger {
+ public int getStartIndex();
+
+ public int getEndIndex();
+
+ public int applyChange(char[] dest, int destPos);
+
+ public void applyChange(Writer writer) throws IOException;
+
+ public CharacterChanger next();
+
+ public void setNext(CharacterChanger next);
+
+ public int getLengthDelta();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/DeleteChange.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/DeleteChange.java
new file mode 100644
index 00000000000..3e25a2b6148
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/change/DeleteChange.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.framework.jdk.core.text.change;
+
+import java.io.Writer;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DeleteChange implements CharacterChanger {
+ private int srcStartIndex;
+ private int srcEndIndex;
+ private CharacterChanger next;
+
+ /**
+ *
+ */
+ public DeleteChange(int srcStartIndex, int srcEndIndex) {
+ super();
+ this.srcStartIndex = srcStartIndex;
+ this.srcEndIndex = srcEndIndex;
+ }
+
+ public void coalesce(DeleteChange overlapping) {
+ DeleteChange changeA = null;
+ DeleteChange changeB = null;
+
+ // make changeA be the one with the smaller srcStartIndex
+ if (overlapping.srcStartIndex < srcStartIndex) {
+ changeA = overlapping;
+ changeB = this;
+ } else {
+ changeA = this;
+ changeB = overlapping;
+ }
+
+ if (changeB.srcStartIndex > changeA.srcEndIndex) { // Note: delete 2,5 is not adjacent to 6,7 (char 5 is not deleted)
+ throw new IllegalArgumentException("Tried to coalesce non-adjacent, non-overlapping DeleteChanges");
+ }
+ this.srcStartIndex = changeA.srcStartIndex;
+ this.srcEndIndex = changeB.srcEndIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#getStartIndex()
+ */
+ public int getStartIndex() {
+ return srcStartIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#getEndIndex()
+ */
+ public int getEndIndex() {
+ return srcEndIndex;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#applyChange(char[], int)
+ */
+ public int applyChange(char[] dest, int destPos) {
+ return destPos;
+ }
+
+ public void applyChange(Writer writer) {
+ return;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#next()
+ */
+ public CharacterChanger next() {
+ return next;
+ }
+
+ /* (non-Javadoc)
+ * @see text.change.CharacterChanger#setNext(text.change.CharacterChanger)
+ */
+ public void setNext(CharacterChanger next) {
+ this.next = next;
+ }
+
+ public int getLengthDelta() {
+ return srcStartIndex - srcEndIndex;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/AdddistributionStatement.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/AdddistributionStatement.java
new file mode 100644
index 00000000000..2f8b5d2592d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/AdddistributionStatement.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.framework.jdk.core.text.rules;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AdddistributionStatement extends Rule {
+ private static final Pattern classDeclarationP =
+ Pattern.compile("^[/\\s\\*]*((?:Created on [^\n]+)?[\\s\\*]*(?:PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE)?[/\\s\\*]*)package");
+ private static final char[] distributionStatement =
+ "/*******************************************************************************\n * Copyright (c) 2004, 2009 Boeing.\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 *******************************************************************************/\n".toCharArray();
+
+ public AdddistributionStatement() {
+ super(null);
+ setFileNamePattern(Pattern.compile(".*\\.java"));
+ }
+
+ public ChangeSet computeChanges(CharSequence seq) {
+ ChangeSet changeSet = new ChangeSet(seq);
+
+ Matcher matcher = classDeclarationP.matcher(seq);
+ if (matcher.find()) {
+ setRuleWasApplicable(true);
+ changeSet.replace(0, matcher.end(1), distributionStatement);
+ }
+
+ return changeSet;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HtmlTableBuilder.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HtmlTableBuilder.java
new file mode 100644
index 00000000000..31a0a1cc544
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HtmlTableBuilder.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.framework.jdk.core.text.rules;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class HtmlTableBuilder extends Rule {
+
+ public HtmlTableBuilder() {
+ super("html");
+ }
+
+ public ChangeSet computeChanges(CharSequence seq) {
+ ChangeSet changeSet = new ChangeSet(seq);
+
+ changeSet.insertBefore(0, "<html>\n<body>\n<table cellpadding=2 cellspacing=0 border=1>\n".toCharArray());
+
+ char[] rowStartChars = {'\t', '<', 't', 'r', '>', '\n'};
+ char[] cellStartChars = "\t\t<td>".toCharArray();
+ char[] cellEndChars = "</td>\n".toCharArray();
+ char[] rowEndChars = {'\t', '<', '/', 't', 'r', '>', '\n'};
+
+ int lineStart = 0;
+ int lineEnd = 0;
+ int length = seq.length();
+ for (int i = 0; i < length; i++) {
+ if (seq.charAt(i) == '\n') { /* find the lineEnd of a line */
+ lineEnd = i + 1;
+ changeSet.insertBefore(lineStart, rowStartChars);
+
+ int tabStart = lineStart;
+ for (int k = lineStart; k < lineEnd; k++) {
+ if (seq.charAt(k) == '\t' || k == i) { // if tab or end of line
+ changeSet.insertBefore(tabStart, cellStartChars);
+ tabStart = k + 1;
+ changeSet.replace(k, tabStart, cellEndChars);
+ }
+ }
+ changeSet.insertBefore(lineEnd, rowEndChars);
+ lineStart = lineEnd;
+ }
+ }
+ changeSet.insertBefore(length, "</table>\n</body>\n</html>".toCharArray());
+
+ return changeSet;
+ }
+
+ public static void main(String[] args) throws IOException {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(System.getProperty("user.home"));
+ buffer.append(File.separator);
+ buffer.append(HtmlTableBuilder.class.getName());
+ buffer.append(".table.txt");
+ new HtmlTableBuilder().process(new File(buffer.toString()));
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HushHtmlScriptErrors.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HushHtmlScriptErrors.java
new file mode 100644
index 00000000000..1e99155e0d1
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/HushHtmlScriptErrors.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.text.rules;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * This rule is to be used on html files. It adds error handling so that unsupported java scripting calls do not result
+ * in pesky windows being shown to the user. For example, when javadoc produced API's are viewed through the eclipse
+ * help system and the javadoc attempts to set the title of the parent.
+ *
+ * @author Robert A. Fisher
+ */
+public class HushHtmlScriptErrors extends Rule {
+
+ // This is the code that must be entered in to the HTML to hush script errors
+ private final static String HUSH =
+ "\nfunction handleError() {\n" + "return true;\n" + "}\n\n" + "window.onerror = handleError;\n";
+
+ public HushHtmlScriptErrors() {
+ super(null);
+ }
+
+ public ChangeSet computeChanges(CharSequence seq) {
+ Pattern detectHusherInPlace = Pattern.compile("function handleError");
+ Pattern findJavaScriptArea = Pattern.compile("<SCRIPT type=\"text/javascript\">");
+ ChangeSet changeSet = new ChangeSet(seq);
+
+ // Only add in hushing if it is not in place
+ Matcher matchHusher = detectHusherInPlace.matcher(seq);
+ if (!matchHusher.find()) {
+
+ Matcher matcher = findJavaScriptArea.matcher(seq);
+ if (matcher.find()) {
+ ruleWasApplicable = true;
+
+ changeSet.insertBefore(matcher.end() + 1, HUSH);
+ }
+ }
+
+ return changeSet;
+ }
+
+ public static void main(String[] args) {
+ HushHtmlScriptErrors hushRule = new HushHtmlScriptErrors();
+ for (int i = 0; i < args.length; i++) {
+ try {
+ System.out.print("File " + (i + 1) + "/" + (args.length) + ":");
+ hushRule.process(new File(args[i]));
+ } catch (Exception ex) {
+ System.out.println("Exception in Rule!!! " + hushRule.getCurrentOutfileName() + ": " + ex.getMessage());
+ ex.printStackTrace();
+ }
+ }
+ System.out.println("Finished");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.text.Rule#process(java.io.File, java.io.File)
+ */
+ public void process(File inFile, File outFile) throws IOException {
+ //Filter files being processed by this to only be of type .html
+ if (inFile.getName().endsWith(".html")) super.process(inFile, outFile);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/MultilineStrLiteral.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/MultilineStrLiteral.java
new file mode 100644
index 00000000000..39a783f5205
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/MultilineStrLiteral.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.framework.jdk.core.text.rules;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class MultilineStrLiteral extends Rule {
+ public static final Pattern wrappedStrLiteralP = Pattern.compile("\n[^\"\n]+(\"[ \t]*\n)[^\"]*?\n(\\s*\")");
+ public static final Pattern signleLineP = Pattern.compile("[^\n]*\n");
+
+ public MultilineStrLiteral() {
+ super(null); // don't change extension on resulting file (i.e. overwrite the original file)
+ }
+
+ public ChangeSet computeChanges(CharSequence seq) {
+ Matcher signleLineM = signleLineP.matcher("");
+ Matcher wrappedStrLiteralM = wrappedStrLiteralP.matcher(seq);
+ ChangeSet changeSet = new ChangeSet(seq);
+ char[] terminateLineChars = new char[] {'\\', 'n', '\"'};
+
+ while (wrappedStrLiteralM.find()) {
+ ruleWasApplicable = true;
+ // delete the first quote and following white-space up to and including the first new line
+ changeSet.delete(wrappedStrLiteralM.start(1), wrappedStrLiteralM.end(1));
+
+ int subIndex = wrappedStrLiteralM.end(1);
+ signleLineM.reset(seq.subSequence(subIndex, wrappedStrLiteralM.start(2)));
+ while (signleLineM.find()) {
+ changeSet.insertBefore(subIndex + signleLineM.start(0), '\"');
+ changeSet.insertBefore(subIndex + signleLineM.end(0) - 1, terminateLineChars);
+ }
+ changeSet.delete(wrappedStrLiteralM.start(2) - 1, wrappedStrLiteralM.end(2));
+ }
+ return changeSet;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/ReplaceAll.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/ReplaceAll.java
new file mode 100644
index 00000000000..24a8df394c8
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/ReplaceAll.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.framework.jdk.core.text.rules;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChOps;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ReplaceAll extends Rule {
+ private Pattern pattern;
+ private char[][] replacements;
+
+ public ReplaceAll(Pattern pattern, String replacement) {
+ this(pattern, new String[] {replacement});
+ }
+
+ public ReplaceAll(Pattern pattern, String[] replacements) {
+ super(null); // don't change extension on resulting file (i.e. overwrite the original file)
+ this.pattern = pattern;
+ this.replacements = new char[replacements.length][];
+ for (int i = 0; i < replacements.length; i++) {
+ char[] chars = replacements[i].toCharArray();
+ this.replacements[i] = ChOps.embedNewLines(chars, 0, chars.length);
+ }
+ }
+
+ public ReplaceAll(String patternStr, String[] replacements) {
+ this(Pattern.compile(patternStr), replacements);
+ }
+
+ public ReplaceAll(String patternStr, String replacement) {
+ this(Pattern.compile(patternStr), replacement);
+ }
+
+ public ChangeSet computeChanges(CharSequence seq) {
+ Matcher matcher = pattern.matcher(seq);
+
+ ChangeSet changeSet = new ChangeSet(seq);
+
+ while (matcher.find()) {
+ ruleWasApplicable = true;
+
+ int numGroups = matcher.groupCount();
+ if (numGroups == 0) {
+ changeSet.replace(matcher.start(), matcher.end(), replacements[0]);
+ } else {
+ for (int i = 0; i < numGroups; i++) {
+ int start = matcher.start(i + 1);
+ if (start > -1) {
+ changeSet.replace(start, matcher.end(i + 1), replacements[i]);
+ }
+ }
+ }
+ }
+ return changeSet;
+ }
+
+ public static void main(String[] args) {
+ if (args.length < 3) {
+ System.out.println("Usage: java text.rules.ReplaceAll <pattern> <replace str or file> <directory> <fileName pattern>");
+ return;
+ }
+
+ try {
+ Rule rule = null;
+ if (new File(args[1]).exists()) {
+ List<String> list = Lib.readListFromFile(args[1]);
+ String[] strs = new String[list.size()];
+ list.toArray(strs);
+ rule = new ReplaceAll(Pattern.compile(args[0]), strs);
+ } else {
+ rule = new ReplaceAll(Pattern.compile(args[0]), args[1]);
+ }
+
+ rule.process(Lib.recursivelyListFiles(new File(args[2]), Pattern.compile(args[3])));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/Unique.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/Unique.java
new file mode 100644
index 00000000000..7d2cc4d26f1
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/rules/Unique.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.framework.jdk.core.text.rules;
+
+import java.util.LinkedHashSet;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Unique extends Rule {
+ public ChangeSet computeChanges(CharSequence seq) {
+ LinkedHashSet<Object> set = new LinkedHashSet<Object>();
+ int start = 0;
+ int end = 0;
+ int length = seq.length();
+ ChangeSet changeSet = new ChangeSet(seq);
+
+ for (int i = 0; i < length; i++) {
+ if (seq.charAt(i) == '\n') {
+ end = i + 1;
+ if (!set.add(seq.subSequence(start, end))) { // if set already contains this line
+ changeSet.delete(start, end); // then skip over it
+ }
+ start = end;
+ }
+ }
+ ruleWasApplicable = true;
+ return changeSet;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CompareLists.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CompareLists.java
new file mode 100644
index 00000000000..aa1e4e358b5
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CompareLists.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.MatchFilter;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CompareLists {
+
+ public static void main(String[] args) throws IOException {
+
+ if (args.length != 4 && args.length != 2) {
+ System.out.println("Usage: java text.CompareLists <directory_1> <ext_1> <directory_2> <ext_2>");
+ System.out.println("or : java text.CompareLists <path1> <path2>");
+ return;
+ }
+
+ if (args.length == 4) {
+ writeDiff(Lib.readListFromDir(args[0], new MatchFilter(".*\\." + args[1])), Lib.readListFromDir(args[2],
+ new MatchFilter(".*\\." + args[3])), new File("list_diff.txt"),
+ "Directory \"" + args[0] + "\", files with extension \"" + args[1] + "\"",
+ "Directory \"" + args[2] + "\", files with extension \"" + args[3] + "\"");
+ } else {
+ writeDiff(Lib.readListFromFile(args[0]), Lib.readListFromFile(args[1]), new File("list_diff.txt"), args[0],
+ args[1]);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public static void writeDiff(Collection listA, Collection listB, File file, String listDescription1, String listDescription2) throws IOException {
+ BufferedWriter out = new BufferedWriter(new FileWriter(file));
+ //Enforce uniqueness
+ Set setA = Collections.toSet(listA);
+ Set setB = Collections.toSet(listB);
+
+ out.write("Items only in list A (" + listDescription1 + ")\n\n");
+ List complement = Collections.setComplement(setA, setB);
+ for (int i = 0; i < complement.size(); i++) {
+ out.write(complement.get(i) + "\n");
+ }
+
+ out.write("\nItems only in list B (" + listDescription2 + ")\n\n");
+ complement = Collections.setComplement(setB, setA);
+ for (int i = 0; i < complement.size(); i++) {
+ out.write(complement.get(i) + "\n");
+ }
+
+ //The intersection of two sets A and B is the set of elements common to A and B.
+ out.write("\nItems in both lists\n\n");
+ ArrayList intersection = Collections.setIntersection(setA, setB);
+ for (int i = 0; i < intersection.size(); i++) {
+ out.write(intersection.get(i) + "\n");
+ }
+ out.close();
+ System.out.println("Finished processing. Output is in file \"list_diff.txt\"");
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CountAscii.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CountAscii.java
new file mode 100644
index 00000000000..bc673406169
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/CountAscii.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.util.io.MatchFilter;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CountAscii {
+
+ public static void main(String[] args) throws IOException {
+ if (args.length < 1) {
+ System.out.println("Usage: java text.CountAscii <directory of files>");
+ return;
+ }
+
+ int[] letterCount = new int[128];
+
+ File directory = new File(args[0]);
+ File[] files = directory.listFiles(new MatchFilter(".*\\.c"));
+ System.out.println("Found " + files.length + " files.");
+
+ for (int i = 0; i < files.length; i++) {
+ BufferedReader in = new BufferedReader(new FileReader(files[i]));
+ int c = 0;
+
+ while ((c = in.read()) != -1) {
+ letterCount[c]++;
+ }
+ in.close();
+ }
+
+ for (int i = 0; i < letterCount.length; i++) {
+ System.out.println((char) i + ": " + letterCount[i]);
+ }
+ /*
+ int total = 0;
+ for(int i=0; i<letterCount.length; i++) {
+ total += letterCount[i];
+ }*/
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/Find.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/Find.java
new file mode 100644
index 00000000000..4a8d25ac1c0
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/Find.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.FileToBufferConvert;
+import org.eclipse.osee.framework.jdk.core.text.FindResults;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Find {
+ private Collection<File> files;
+ private FindResults results;
+ private FileToBufferConvert converter;
+ private int precedingCount;
+ private int trailingCount;
+ private Matcher[] matchers;
+ private boolean[] matcherUsed;
+
+ /**
+ * @param patterns a Collection of strings that are regular expressions
+ * @param files
+ * @param converter
+ */
+ public Find(Collection<String> patterns, Collection<File> files, FileToBufferConvert converter) {
+ this.files = files;
+ this.converter = converter;
+ this.precedingCount = 0;
+ this.trailingCount = 0;
+ this.results = new FindResults(patterns.size());
+
+ this.matchers = new Matcher[patterns.size()];
+ int i = 0;
+ for (String pattern : patterns) {
+ // the empty string is never used in the search because a matcher.reset happens first
+ matchers[i++] = Pattern.compile(pattern).matcher("");
+ }
+ this.matcherUsed = new boolean[matchers.length];
+ }
+
+ private static FileToBufferConvert simpleToBuffer = new SimpleFileToBufferConvert();
+
+ private static ArrayList<String> toList(String pattern) {
+ ArrayList<String> patterns = new ArrayList<String>();
+ patterns.add(pattern);
+ return patterns;
+ }
+
+ public Find(String pattern, File topLevelSearchDir, String fileNamePattern) {
+ this(toList(pattern), Lib.recursivelyListFiles(topLevelSearchDir, Pattern.compile(fileNamePattern)),
+ simpleToBuffer);
+ }
+
+ public static void main(String[] args) throws IOException {
+ if (args.length < 7) {
+ System.out.println("Usage: java text.Find <pattern-list file or pattern> <search directory> <fileName pattern> <leading pad> <trailing pad> <negative: true|false> <ignoreComments: true|false>");
+ return;
+ }
+
+ ArrayList<String> patterns = null;
+ if (new File(args[0]).exists()) {
+ patterns = Lib.readListFromFile(args[0]);
+ } else {
+ patterns = new ArrayList<String>();
+ patterns.add(args[0]);
+ }
+ File resultFile = new File("results.txt");
+ BufferedWriter out = new BufferedWriter(new FileWriter(resultFile));
+
+ List<File> files = Lib.recursivelyListFiles(new File(args[1]), Pattern.compile(args[2]));
+ System.out.println("Searching " + files.size() + " files...");
+ if (files.size() == 0) {
+ return;
+ }
+
+ FileToBufferConvert toBuffer = null;
+ if (Boolean.valueOf(args[6]).booleanValue()) {
+ toBuffer = new StripBlockComments();
+ } else {
+ toBuffer = simpleToBuffer;
+ }
+
+ Find app = new Find(patterns, files, toBuffer);
+ app.setRegionPadding(Integer.parseInt(args[3]), Integer.parseInt(args[4]));
+
+ if (Boolean.valueOf(args[5]).booleanValue()) {
+ app.findMeNot();
+ } else {
+ app.find(999999, true);
+ }
+ OutputStreamWriter stdOut = new OutputStreamWriter(System.out);
+ stdOut.write(resultFile.getAbsolutePath());
+
+ app.writeUnusedPatterns(stdOut);
+ app.getResults().writeFindResutls(out);
+ out.close();
+ }
+
+ public void setRegionPadding(int precedingCount, int trailingCount) {
+ this.precedingCount = precedingCount;
+ this.trailingCount = trailingCount;
+ }
+
+ public FindResults getResults() {
+ return results;
+ }
+
+ /**
+ * Search a given file for all patterns: maxIsPerPattern == true up to maxMatches of any single pattern (then search
+ * the same file for the next pattern) otherwise up to a maxMatches for all patterns in a given file(then end search
+ * of that file and start on the next one)
+ *
+ * @param maxMatches
+ * @param maxIsPerPattern
+ */
+ public void find(int maxMatches, boolean maxIsPerPattern) {
+ for (Iterator<File> iter = files.iterator(); iter.hasNext();) { // for each file
+
+ File file = iter.next();
+ CharSequence buf = null;
+ try {
+ buf = converter.fileToCharSequence(file);
+ } catch (Exception ex) {
+ System.out.println("In File " + file + ": " + ex);
+ continue;
+ }
+
+ int numMatches = 0;
+ for (int i = 0; i < matchers.length; i++) {
+ matchers[i].reset(buf);
+ if (maxIsPerPattern) {
+ numMatches = 0; // new pattern matcher so reset the match count
+ }
+
+ if (numMatches == maxMatches) { // can only be true if maxIsPerPattern is false
+ break; // don't look for any more matches in this file
+ }
+
+ // find each pattern at most maxMatches per file
+ while (matchers[i].find() && numMatches++ < maxMatches) {
+ matcherUsed[i] = true;
+ // System.out.println(files[f].getName() + " " + matchers[i].group());
+
+ String region = null;
+ if (matchers[i].groupCount() == 0) {
+ if (precedingCount == 0 && trailingCount == 0) {
+ region = matchers[i].group();
+ } else {
+ int start = matchers[i].start() - precedingCount;
+ if (start < 0) {
+ start = 0;
+ }
+ int end = matchers[i].end() + trailingCount;
+ if (end > buf.length()) {
+ end = buf.length();
+ }
+ region = buf.subSequence(start, end).toString();
+ }
+ } else {
+ region = matchers[i].group(1);
+ }
+ results.addMatch(matchers[i].pattern().pattern(), file, region);
+ }
+ }
+ }
+ }
+
+ /**
+ * Search a given file list for all patterns: maxIsPerPattern == true up to maxMatches of any single pattern (then
+ * search the same file for the next pattern) otherwise up to a maxMatches for all patterns in a given file(then end
+ * search of that file and start on the next one)
+ */
+ public void findMeNot() {
+ for (Iterator<File> iter = files.iterator(); iter.hasNext();) { // for each file
+
+ File file = iter.next();
+ CharSequence buf = null;
+ try {
+ buf = converter.fileToCharSequence(file);
+ } catch (ParseException ex) {
+ System.out.println(ex);
+ continue;
+ } catch (IOException ex) {
+ System.out.println(ex);
+ continue;
+ }
+
+ for (int i = 0; i < matchers.length; i++) {
+ matchers[i].reset(buf);
+ if (!matchers[i].find()) {
+ matcherUsed[i] = true;
+ results.addMatch(matchers[i].pattern().pattern(), file, "findMeNot");
+ }
+ }
+ }
+ }
+
+ public void writeUnusedPatterns(Writer out) throws IOException {
+ boolean titleNotYetPrinted = true;
+ for (int i = 0; i < matcherUsed.length; i++) {
+ if (!matcherUsed[i]) {
+ if (titleNotYetPrinted) {
+ out.write("Patterns that were never used\n");
+ titleNotYetPrinted = false;
+ }
+ out.write(matchers[i].pattern().pattern());
+ out.write('\n');
+ }
+ }
+ out.flush();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FindNonLocalFunctionCalls.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FindNonLocalFunctionCalls.java
new file mode 100644
index 00000000000..bedf4967960
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FindNonLocalFunctionCalls.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.framework.jdk.core.text.tool;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FindNonLocalFunctionCalls {
+ public static final Pattern functionCallPattern = Pattern.compile("\\W(\\w+)\\s*\\([^;{]*?\\)\\s*;");
+ public static final Pattern functionDefPattern = Pattern.compile("\\W(\\w+)\\s*\\([^;{]*?\\)\\s*\\{");
+ private LinkedHashSet<String> set;
+ private File[] files;
+
+ public FindNonLocalFunctionCalls(File[] files) {
+ this.files = files;
+ set = new LinkedHashSet<String>();
+ }
+
+ public static void main(String[] args) {
+ File[] files = new File[args.length];
+ for (int i = 0; i < args.length; i++) {
+ files[i] = new File(args[i]);
+ }
+ FindNonLocalFunctionCalls app = new FindNonLocalFunctionCalls(files);
+ app.searchFiles();
+ app.print();
+ }
+
+ public void searchFiles() {
+ for (int i = 0; i < files.length; i++) {
+ try {
+ look(Lib.stripBlockComments(Lib.fileToCharBuffer(files[i])));
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ private void look(CharSequence seq) {
+ ArrayList<String> localFunctions = new ArrayList<String>();
+ Matcher functionDefM = functionDefPattern.matcher(seq);
+ while (functionDefM.find()) {
+ localFunctions.add(functionDefM.group(1));
+ }
+
+ Matcher functionCallM = functionCallPattern.matcher(seq);
+ while (functionCallM.find()) {
+ if (!localFunctions.contains(functionCallM.group(1))) {
+ set.add(functionCallM.group(1));
+ }
+ }
+ }
+
+ public Set<String> getResultSet() {
+ return set;
+ }
+
+ public void print() {
+ ArrayList<String> list = new ArrayList<String>(set);
+ Collections.sort(list);
+ for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
+ System.out.println(iter.next());
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FunctionCallStats.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FunctionCallStats.java
new file mode 100644
index 00000000000..d2c3e634862
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/FunctionCallStats.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+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.Set;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.FindResults;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FunctionCallStats {
+ @SuppressWarnings("unchecked")
+ public static void main(String[] args) throws IOException {
+ if (args.length < 2) {
+ System.out.println("Usage: FunctionCallStats <search directory> <fileName pattern>");
+ return;
+ }
+
+ ArrayList<String> patterns = new ArrayList<String>();
+ patterns.add("\\W(\\w+)\\s*\\([^;{]*?\\)\\s*;");
+
+ BufferedWriter out = new BufferedWriter(new FileWriter("results.csv"));
+
+ List files = Lib.recursivelyListFiles(new File(args[0]), Pattern.compile(args[1]));
+ System.out.println("Searching " + files.size() + " files...");
+
+ FindNonLocalFunctionCalls nonLocalFindApp =
+ new FindNonLocalFunctionCalls((File[]) files.toArray(new File[files.size()]));
+ nonLocalFindApp.searchFiles();
+ Set nonLocalFunctions = nonLocalFindApp.getResultSet();
+
+ Find app = new Find(patterns, files, new StripBlockComments());
+ app.setRegionPadding(0, 0);
+ app.find(999999, true);
+ FindResults results = app.getResults();
+
+ class Counter {
+ public int count = 0;
+ }
+
+ String lastFileName = null;
+ HashMap functions = new HashMap(1000);
+ for (FindResults.FindResultsIterator i = results.iterator(); i.hasNext();) {
+ String currentFileName = i.currentFile.getName();
+
+ if (i.currentRegion != null) {
+ if (!currentFileName.equals(lastFileName)) {
+ for (Iterator functionsIterator = functions.entrySet().iterator(); functionsIterator.hasNext();) {
+ Map.Entry entry = (Map.Entry) functionsIterator.next();
+ String functionName = (String) entry.getKey();
+ if (nonLocalFunctions.contains(functionName)) {
+ out.write(lastFileName);
+ out.write(',');
+ out.write(functionName);
+ out.write(',');
+ out.write(String.valueOf(((Counter) entry.getValue()).count));
+ out.write('\n');
+ }
+ }
+ lastFileName = currentFileName;
+ functions.clear();
+ }
+
+ Counter counter = (Counter) functions.get(i.currentRegion);
+ if (counter == null) {
+ counter = new Counter();
+ }
+ counter.count++;
+ functions.put(i.currentRegion, counter);
+ }
+ }
+ out.close();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/ReplaceRcsLog.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/ReplaceRcsLog.java
new file mode 100644
index 00000000000..e850b3500f5
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/ReplaceRcsLog.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.framework.jdk.core.text.tool;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.CharBuffer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Range;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.MatchFilter;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ReplaceRcsLog {
+ private static final Pattern logStartP = Pattern.compile("\\$Log.*\\s+");
+ private static final Pattern revP = Pattern.compile("Revision \\d+\\.\\d+.*");
+ private static final Pattern revEndP = Pattern.compile("\n[* \t/\\\\]*\n");
+
+ public static void main(String[] args) {
+ if (args.length < 3) {
+ System.out.println("Usage: java text.ReplaceRcsLog <dir for history> <dir for content> <result dir>");
+ return;
+ }
+
+ ReplaceRcsLog app = new ReplaceRcsLog();
+ app.replaceRcsLogs(new File(args[0]), new File(args[1]), new File(args[2]));
+ }
+
+ /**
+ * @param directoryA directory of test files will have their rcs log extracted
+ * @param directoryB directory of test files that will have their content preserved and log replaced
+ * @param resultDir
+ */
+ public void replaceRcsLogs(File directoryA, File directoryB, File resultDir) {
+ File[] files = directoryA.listFiles(new MatchFilter(".*\\.(c|mac|h)"));
+
+ for (int i = 0; i < files.length; i++) {
+ File fileB = new File(directoryB, files[i].getName());
+ if (fileB.exists()) {
+ replaceRcsLog(files[i], fileB, new File(resultDir, files[i].getName()));
+ }
+ }
+ }
+
+ public void replaceRcsLog(File historyFile, File contentFile, File resultFile) {
+
+ CharBuffer historySeq;
+ CharBuffer contentSeq;
+ try {
+ historySeq = Lib.fileToCharBuffer(historyFile);
+ Range historyRange = findRcsLog(historySeq);
+
+ contentSeq = Lib.fileToCharBuffer(contentFile);
+ Range contentRange = findRcsLog(contentSeq);
+
+ ChangeSet changeSet = new ChangeSet(contentSeq);
+ changeSet.replace(contentRange.start, contentRange.end, historySeq.array(), historyRange.start,
+ historyRange.length);
+ changeSet.applyChanges(resultFile);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return;
+ } catch (IllegalArgumentException ex) {
+ System.out.println(historyFile + ": " + ex.getMessage());
+ return;
+ }
+ }
+
+ public static Range findRcsLog(CharSequence seq) throws IllegalArgumentException {
+ Matcher logStartM = logStartP.matcher(seq);
+ if (!logStartM.find()) {
+ throw new IllegalArgumentException(" is missing $Log");
+ }
+ int firstRevStartIndex = logStartM.end(); // first char of actual revision info
+
+ Matcher revM = revP.matcher(seq);
+ int lastRevStartIndex = 0;
+ while (revM.find()) {
+ lastRevStartIndex = revM.start();
+ } // this loop with cause the last revsion to be found (usually 1.1)
+
+ Matcher revEndM = revEndP.matcher(seq);
+ int lastRevEndIndex = 0;
+ if (!revEndM.find(lastRevStartIndex)) {
+ throw new IllegalArgumentException(" didn't find end of revision info");
+ }
+ lastRevEndIndex = revEndM.start() + 1; // include the last new line
+
+ return new Range(firstRevStartIndex, lastRevEndIndex);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/RpcrSignalChanges.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/RpcrSignalChanges.java
new file mode 100644
index 00000000000..8287766f7f0
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/RpcrSignalChanges.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+import java.util.StringTokenizer;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RpcrSignalChanges {
+ public String rpcrName;
+ public ArrayList<String> signals;
+ public boolean mux;
+
+ public RpcrSignalChanges(File file) throws IOException {
+ rpcrName = file.getName().substring(0, 4);
+ this.signals = new ArrayList<String>(500);
+
+ BufferedReader in = null;
+ try {
+ in = new BufferedReader(new FileReader(file));
+ } catch (FileNotFoundException ex) {
+ System.err.println(ex);
+ throw new IllegalArgumentException(ex.toString());
+ }
+
+ String line = null;
+ // if line 6 starts with " Signal Name", then these are mux changes
+ for (int j = 0; j < 6; j++) {
+ line = in.readLine();
+ }
+
+ mux = line.startsWith(" Signal Name");
+
+ while ((line = in.readLine()) != null) {
+ String result = extractSignal(line);
+ if (result != null) {
+ signals.add(result);
+ }
+ }
+ in.close();
+ }
+
+ protected String extractSignal(String line) {
+ try {
+ StringTokenizer tok = new StringTokenizer(line);
+ if (!tok.hasMoreTokens()) {
+ System.out.println("blank line");
+ return null;
+ }
+ String changeSymbol = tok.nextToken();
+
+ if (changeSymbol.equals("+") || changeSymbol.equals(">")) {
+ if (!tok.nextToken().equals("is:")) {
+ throw new IllegalArgumentException("Ryan --> you didn't think of everyting. Duh!");
+ }
+ if (line.charAt(6) != ' ') { // there is either a mux name or a fiber interface
+ if (mux) {
+ return line.substring(6, 25).trim();
+ } else {
+ tok.nextToken(); // skip interface name
+ String elementName = tok.nextToken();
+ String lmName = tok.nextToken();
+ return "l_" + lmName.toLowerCase() + "__" + elementName.toLowerCase();
+ }
+ }
+ }
+ } catch (NoSuchElementException ex) {
+ System.out.println(ex + line);
+ System.exit(1);
+ }
+ return null;
+ }
+
+ public boolean affectsLine(String line) {
+ for (int i = 0; i < signals.size(); i++) {
+ if (line.indexOf((String) signals.get(i)) != -1) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SignalChanges.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SignalChanges.java
new file mode 100644
index 00000000000..1ad00a7b132
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SignalChanges.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import org.eclipse.osee.framework.jdk.core.util.io.MatchFilter;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SignalChanges {
+
+ public static void main(String[] args) throws IOException {
+ if (args.length < 1) {
+ System.out.println("Usage: java text.SignalChanges <.dat directory> <scirpt source directory>");
+ return;
+ }
+
+ ArrayList<Object> list = loadList(args[0]);
+ writeSignalChanges(list, new File(args[0], "cdb_changes.txt"), new File(args[0], "mux_changes.txt"));
+ writeChangeVerification(args[1], list);
+ }
+
+ // return list of RpcrSignalChanges found in the dat files in the given directory
+ public static ArrayList<Object> loadList(String path) throws IOException {
+ ArrayList<Object> list = new ArrayList<Object>(20);
+
+ File directory = new File(path);
+ File[] files = directory.listFiles(new MatchFilter(".*\\.txt"));
+ Arrays.sort(files);
+ System.out.println("Found " + files.length + " dat files in " + path + ".");
+
+ for (int i = 0; i < files.length; i++) {
+ list.add(new RpcrSignalChanges(files[i]));
+ }
+ return list;
+ }
+
+ public static void writeChangeVerification(String scriptsPath, ArrayList<Object> changesList) throws IOException {
+ BufferedWriter out = new BufferedWriter(new FileWriter("rpcr_list.txt"));
+
+ File directory = new File(scriptsPath);
+ File[] files = directory.listFiles(new MatchFilter(".*\\.c"));
+ Arrays.sort(files);
+ System.out.println("Found " + files.length + " script files in " + scriptsPath + ".");
+
+ for (int i = 0; i < changesList.size(); i++) {
+ RpcrSignalChanges rpCh = (RpcrSignalChanges) changesList.get(i);
+ out.write(rpCh.rpcrName + "\n");
+
+ for (int j = 0; j < files.length; j++) {
+ BufferedReader in = new BufferedReader(new FileReader(files[j]));
+
+ String line = null;
+ while ((line = in.readLine()) != null) {
+ if (rpCh.affectsLine(line)) {
+ out.write("\t" + files[j].getName() + "\n");
+ break;
+ }
+ }
+ in.close();
+ }
+ out.flush();
+ }
+ out.close();
+ }
+
+ public static void writeSignalChanges(ArrayList<Object> changesList, File outputFile, File muxOutputFile) throws IOException {
+ BufferedWriter out = new BufferedWriter(new FileWriter(outputFile));
+ BufferedWriter muxOut = new BufferedWriter(new FileWriter(muxOutputFile));
+
+ for (int i = 0; i < changesList.size(); i++) {
+ RpcrSignalChanges rpcrCng = (RpcrSignalChanges) changesList.get(i);
+ if (rpcrCng.mux) {
+ for (int j = 0; j < rpcrCng.signals.size(); j++) {
+ muxOut.write(rpcrCng.rpcrName + "," + rpcrCng.signals.get(j) + "\n");
+ }
+ } else {
+ for (int j = 0; j < rpcrCng.signals.size(); j++) {
+ out.write(rpcrCng.rpcrName + " " + rpcrCng.signals.get(j) + "\n");
+ }
+ }
+ }
+ out.close();
+ muxOut.close();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SimpleFileToBufferConvert.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SimpleFileToBufferConvert.java
new file mode 100644
index 00000000000..a1b4b14c210
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SimpleFileToBufferConvert.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.framework.jdk.core.text.tool;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.text.FileToBufferConvert;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SimpleFileToBufferConvert implements FileToBufferConvert {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.text.FileToBufferConvert#fileToCharSequence(java.io.File)
+ */
+ public CharSequence fileToCharSequence(File file) throws IOException {
+ return Lib.fileToCharBuffer(file);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SourceCount.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SourceCount.java
new file mode 100644
index 00000000000..94c1ad4c9ea
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/SourceCount.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.framework.jdk.core.text.tool;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SourceCount {
+ protected BufferedReader in;
+ protected String line;
+
+ public SourceCount() {
+ in = null;
+ line = null;
+ }
+
+ public int countLOC(String sourceFile) {
+ try {
+ in = new BufferedReader(new FileReader(sourceFile));
+ } catch (FileNotFoundException ex) {
+ System.err.println(ex);
+ System.exit(1);
+ }
+
+ int count = 0;
+ try {
+ while ((line = in.readLine()) != null) {
+ ignoreComments();
+ if (line != null) { //a comment might be the last line of the file
+ if (line.endsWith("{") || line.endsWith(";")) { // if logical LOC
+ count++;
+ }
+ }
+ }
+ } catch (IOException ex) {
+ System.err.println(ex);
+ System.exit(2);
+ }
+ return count;
+ }
+
+ protected void ignoreComments() {
+ try {
+ while (line != null) {
+ line = line.trim();
+ if (line.startsWith("/*")) {
+ while (line != null && !line.endsWith("*/")) {
+ line = in.readLine().trim();
+ }
+ } else if (!line.startsWith("//")) {
+ //a logical LOC might have a comment folloing it on the same line
+ line = stripOffComment(line);
+ return;
+ }
+ line = in.readLine();
+ }
+ } catch (IOException ex) {
+ System.err.println(ex);
+ System.exit(2);
+ }
+ }
+
+ public static String stripOffComment(String line) {
+ int pos = line.lastIndexOf("//");
+ if (pos != -1) { //if a comment is indeed there (maybe)
+ //the single line comment symbol might be part of a string literal
+ //this is hard because the string delimiter might also be part of a string literal
+ if (!insideStringLiteral(line, pos)) {
+ return line.substring(0, pos).trim();
+ }
+ }
+ return line;
+ }
+
+ public static boolean insideStringLiteral(String str, int pos) {
+ int index = 0;
+ boolean inside = false;
+
+ char[] chars = new char[str.length()];
+ str.getChars(0, chars.length, chars, 0);
+
+ while (index < pos) {
+ if (chars[index] == '\\' && chars[index + 1] == '\"') {
+ index++; // skip over literal quotation marks
+ } else if (chars[index] == '\"') {
+ inside = !inside;
+ }
+ index++;
+ }
+ return inside;
+ }
+
+ public static void main(String[] args) {
+ if (args.length < 1) {
+ System.out.println("Usage: SourceCount [source file]");
+ return;
+ }
+ SourceCount app = new SourceCount();
+ int loc = app.countLOC(args[0]);
+ System.out.println("Logical LOC: " + loc);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/StripBlockComments.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/StripBlockComments.java
new file mode 100644
index 00000000000..56329b1acff
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/text/tool/StripBlockComments.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.framework.jdk.core.text.tool;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.text.FileToBufferConvert;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class StripBlockComments implements FileToBufferConvert {
+ public CharSequence fileToCharSequence(File file) throws IOException {
+ return Lib.stripBlockComments(Lib.fileToCharBuffer(file));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/AddingDoubleMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/AddingDoubleMap.java
new file mode 100644
index 00000000000..8d6022bda3f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/AddingDoubleMap.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.framework.jdk.core.type;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Map.Entry;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AddingDoubleMap<K> {
+ private final HashMap<K, MutableDouble> addingMap;
+
+ public AddingDoubleMap(int initialCapacity) {
+ addingMap = new HashMap<K, MutableDouble>(initialCapacity);
+ }
+
+ public AddingDoubleMap() {
+ addingMap = new HashMap<K, MutableDouble>();
+ }
+
+ public double get(K key) {
+ for (Entry<K, MutableDouble> entry : getCounts()) {
+ if (entry.getKey().equals(key)) return entry.getValue().getValue();
+ }
+ return 0;
+ }
+
+ public boolean contains(K key) {
+ for (Entry<K, MutableDouble> entry : getCounts()) {
+ if (entry.getKey().equals(key)) return true;
+ }
+ return false;
+ }
+
+ public void put(K key, double byAmmount) {
+ MutableDouble count = addingMap.get(key);
+ if (count == null) {
+ addingMap.put(key, new MutableDouble(byAmmount));
+ } else {
+ count.getValueAndInc(byAmmount);
+ }
+ }
+
+ public void put(Collection<K> keys, double byAmmount) {
+ for (K key : keys) {
+ put(key, byAmmount);
+ }
+ }
+
+ public Set<Entry<K, MutableDouble>> getCounts() {
+ return addingMap.entrySet();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKey.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKey.java
new file mode 100644
index 00000000000..31d11229048
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKey.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.framework.jdk.core.type;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public final class CompositeKey<A, B> {
+ private A key1;
+ private B key2;
+
+ public CompositeKey() {
+ this(null, null);
+ }
+
+ public CompositeKey(A key1, B key2) {
+ setKeys(key1, key2);
+ }
+
+ public A getKey1() {
+ return key1;
+ }
+
+ public B getKey2() {
+ return key2;
+ }
+
+ public CompositeKey<A, B> setKeys(A key1, B key2) {
+ this.key1 = key1;
+ this.key2 = key2;
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CompositeKey) {
+ final CompositeKey<A, B> otherKey = (CompositeKey<A, B>) obj;
+ boolean result = true;
+ if (otherKey.key1 != null && key1 != null) {
+ result &= otherKey.key1.equals(key1);
+ } else {
+ result &= otherKey.key1 == null && key1 == null;
+ }
+ if (otherKey.key2 != null && key2 != null) {
+ result &= otherKey.key2.equals(key2);
+ } else {
+ result &= otherKey.key2 == null && key2 == null;
+ }
+ return result;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ final int constant = 31;
+ int hashCode = 11;
+ if (key1 != null) {
+ hashCode = hashCode * constant + key1.hashCode();
+ } else {
+ hashCode = hashCode * constant;
+ }
+ if (key2 != null) {
+ hashCode = hashCode * constant + key2.hashCode();
+ } else {
+ hashCode = hashCode * constant;
+ }
+ return hashCode;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "key1: \"" + key1 + "\" + key2: \"" + key2 + "\"";
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyHashMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyHashMap.java
new file mode 100644
index 00000000000..eb8931cda8b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyHashMap.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.framework.jdk.core.type;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A hash map implementation that uses composite keys. This class is not thread safe.
+ *
+ * @author Ken J. Aguilar
+ * @param <KeyOne>
+ * @param <KeyTwo>
+ * @param <Value>
+ */
+public class CompositeKeyHashMap<KeyOne, KeyTwo, Value> implements Map<CompositeKey<KeyOne, KeyTwo>, Value> {
+ private final HashCollection<KeyOne, KeyTwo> signleKeyMap = new HashCollection<KeyOne, KeyTwo>();
+ private final Map<CompositeKey<KeyOne, KeyTwo>, Value> map;
+
+ private final ThreadLocal<CompositeKey<KeyOne, KeyTwo>> threadLocalKey =
+ new ThreadLocal<CompositeKey<KeyOne, KeyTwo>>() {
+
+ @Override
+ protected CompositeKey<KeyOne, KeyTwo> initialValue() {
+ return new CompositeKey<KeyOne, KeyTwo>();
+ }
+
+ };
+
+ public CompositeKeyHashMap() {
+ this(50);
+ }
+
+ public CompositeKeyHashMap(Map<CompositeKey<KeyOne, KeyTwo>, Value> map) {
+ this.map = map;
+ }
+
+ public CompositeKeyHashMap(int initialCapacity) {
+ map = new HashMap<CompositeKey<KeyOne, KeyTwo>, Value>(initialCapacity);
+ }
+
+ public void clear() {
+ map.clear();
+ signleKeyMap.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.Map#containsKey(java.lang.Object)
+ */
+ /**
+ * Use this method to determine if any puts(keyOne, anything) have occurred
+ *
+ * @param keyOne
+ * @return whether the map contains the key keyOne
+ */
+ public boolean containsKey(Object key1) {
+ return signleKeyMap.containsKey((KeyOne) key1);
+ }
+
+ /**
+ * @param key1
+ * @param key2
+ * @return whether the map contains the compound key <keyOne, keyTwo>
+ */
+ public boolean containsKey(KeyOne key1, KeyTwo key2) {
+ return map.containsKey(threadLocalKey.get().setKeys(key1, key2));
+ }
+
+ /**
+ * determines if at least one of the compound keys are mapped to this value
+ *
+ * @param value
+ * @return whether the map contains this value
+ */
+ public boolean containsValue(Object value) {
+ return signleKeyMap.containsValue(value);
+ }
+
+ public Set<Map.Entry<CompositeKey<KeyOne, KeyTwo>, Value>> entrySet() {
+ return map.entrySet();
+ }
+
+ public Value get(Object key) {
+ throw new UnsupportedOperationException("use getValues() instead");
+ }
+
+ public List<Value> getValues(KeyOne key1) {
+ Collection<KeyTwo> key2s = signleKeyMap.getValues(key1);
+ if (key2s == null) {
+ return Collections.emptyList();
+ }
+ ArrayList<Value> values = new ArrayList<Value>(key2s.size());
+ for (KeyTwo key2 : key2s) {
+ values.add(get(key1, key2));
+ }
+ return values;
+ }
+
+ public Value get(KeyOne key1, KeyTwo key2) {
+ return map.get(threadLocalKey.get().setKeys(key1, key2));
+ }
+
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ public Set<CompositeKey<KeyOne, KeyTwo>> keySet() {
+ return map.keySet();
+ }
+
+ public Value put(CompositeKey<KeyOne, KeyTwo> key, Value value) {
+ signleKeyMap.put(key.getKey1(), key.getKey2());
+ return map.put(key, value);
+ }
+
+ public Value put(KeyOne key1, KeyTwo key2, Value value) {
+ signleKeyMap.put(key1, key2);
+ return map.put(new CompositeKey<KeyOne, KeyTwo>(key1, key2), value);
+ }
+
+ public void putAll(Map<? extends CompositeKey<KeyOne, KeyTwo>, ? extends Value> copyMap) {
+ map.putAll(copyMap);
+
+ for (CompositeKey<KeyOne, KeyTwo> key : copyMap.keySet()) {
+ signleKeyMap.put(key.getKey1(), key.getKey2());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.Map#remove(java.lang.Object)
+ */
+ public Value remove(Object key) {
+ throw new UnsupportedOperationException("use removeValues() instead");
+ }
+
+ /**
+ * @param key1
+ * @return the previous value associated with key, or null if there was no mapping for key.
+ */
+ public Collection<Value> removeValues(KeyOne key1) {
+ Collection<KeyTwo> key2s = signleKeyMap.getValues(key1);
+ if (key2s == null) {
+ return null;
+ }
+ ArrayList<Value> values = new ArrayList<Value>(key2s.size());
+ for (KeyTwo key2 : key2s) {
+ values.add(map.remove(threadLocalKey.get().setKeys(key1, key2)));
+ }
+ signleKeyMap.removeValues(key1);
+ return values;
+ }
+
+ public Value remove(KeyOne key1, KeyTwo key2) {
+ Value value = map.remove(threadLocalKey.get().setKeys(key1, key2));
+ signleKeyMap.removeValue(key1, key2);
+ return value;
+ }
+
+ public int size() {
+ return map.size();
+ }
+
+ public Collection<Value> values() {
+ return map.values();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyQuadHashMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyQuadHashMap.java
new file mode 100644
index 00000000000..4e925755815
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyQuadHashMap.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.framework.jdk.core.type;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A hash map implementation that uses composite keys. This class is not thread safe.
+ *
+ * @author Ken J. Aguilar
+ * @param <KeyOne>
+ * @param <KeyTwo>
+ * @param <Value>
+ */
+public class CompositeKeyQuadHashMap<KeyOne, KeyTwo, KeyThree, KeyFour, Value> implements Map<CompositeKeyQuadHashMap.CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, Value> {
+
+ private final Map<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, Value> map;
+
+ private final ThreadLocal<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>> threadLocalKey =
+ new ThreadLocal<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>>() {
+
+ @Override
+ protected CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour> initialValue() {
+ return new CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>();
+ }
+
+ };
+
+ public static final class CompositeKey<A, B, C, D> {
+ private A key1;
+ private B key2;
+ private C key3;
+ private D key4;
+
+ public CompositeKey() {
+
+ }
+
+ public CompositeKey(A key1, B key2, C key3, D key4) {
+ setKeys(key1, key2, key3, key4);
+ }
+
+ public A getKey1() {
+ return key1;
+ }
+
+ public B getKey2() {
+ return key2;
+ }
+
+ public C getKey3() {
+ return key3;
+ }
+
+ public D getKey4() {
+ return key4;
+ }
+
+ public CompositeKey<A, B, C, D> setKeys(A key1, B key2, C key3, D key4) {
+ this.key1 = key1;
+ this.key2 = key2;
+ this.key3 = key3;
+ this.key4 = key4;
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CompositeKey) {
+ final CompositeKey<A, B, C, D> otherKey = (CompositeKey<A, B, C, D>) obj;
+ return otherKey.key1.equals(key1) && otherKey.key2.equals(key2) && otherKey.key3.equals(key3) && otherKey.key4.equals(key4);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 11;
+ hashCode = hashCode * 31 + key1.hashCode();
+ hashCode = hashCode * 31 + key2.hashCode();
+ hashCode = hashCode * 31 + key3.hashCode();
+ hashCode = hashCode * 31 + key4.hashCode();
+ return hashCode;
+ }
+
+ }
+
+ public CompositeKeyQuadHashMap() {
+ map = new HashMap<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, Value>();
+ }
+
+ public CompositeKeyQuadHashMap(Map<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, Value> map) {
+ this.map = map;
+ }
+
+ public CompositeKeyQuadHashMap(int initialCapacity) {
+ map = new HashMap<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, Value>(initialCapacity);
+ }
+
+ public void clear() {
+ map.clear();
+ }
+
+ public boolean containsKey(Object key) {
+ return map.containsKey(key);
+ }
+
+ public boolean containsKey(KeyOne a, KeyTwo b, KeyThree c, KeyFour d) {
+ return map.containsKey(threadLocalKey.get().setKeys(a, b, c, d));
+ }
+
+ public boolean containsValue(Object value) {
+ return map.containsValue(value);
+ }
+
+ public Set<Map.Entry<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, Value>> entrySet() {
+ return map.entrySet();
+ }
+
+ public Value get(Object key) {
+ if (CompositeKey.class.isInstance(key)) {
+ return map.get(key);
+ } else {
+ throw new IllegalArgumentException(String.format("Expected Type [CompositeKey], got type [%s].",
+ key.getClass().getName()));
+ }
+ }
+
+ public Value get(KeyOne a, KeyTwo b, KeyThree c, KeyFour d) {
+ return map.get(threadLocalKey.get().setKeys(a, b, c, d));
+ }
+
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ public Set<CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>> keySet() {
+ return map.keySet();
+ }
+
+ public Value put(CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour> key, Value value) {
+ return map.put(key, value);
+ }
+
+ public Value put(KeyOne a, KeyTwo b, KeyThree c, KeyFour d, Value value) {
+ return map.put(new CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>(a, b, c, d), value);
+ }
+
+ public void putAll(Map<? extends CompositeKey<KeyOne, KeyTwo, KeyThree, KeyFour>, ? extends Value> m) {
+ map.putAll(m);
+ }
+
+ public Value remove(Object key) {
+ return map.remove(key);
+ }
+
+ public Value remove(KeyOne a, KeyTwo b, KeyThree c, KeyFour d) {
+ return map.remove(threadLocalKey.get().setKeys(a, b, c, d));
+ }
+
+ public int size() {
+ return map.size();
+ }
+
+ public Collection<Value> values() {
+ return map.values();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyTripleHashMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyTripleHashMap.java
new file mode 100644
index 00000000000..803d470081e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CompositeKeyTripleHashMap.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A hash map implementation that uses composite keys. This class is not thread safe.
+ *
+ * @author Ken J. Aguilar
+ * @param <KeyOne>
+ * @param <KeyTwo>
+ * @param <Value>
+ */
+public class CompositeKeyTripleHashMap<KeyOne, KeyTwo, KeyThree, Value> implements Map<CompositeKeyTripleHashMap.CompositeKey<KeyOne, KeyTwo, KeyThree>, Value> {
+
+ private final Map<CompositeKey<KeyOne, KeyTwo, KeyThree>, Value> map;
+
+ private final ThreadLocal<CompositeKey<KeyOne, KeyTwo, KeyThree>> threadLocalKey =
+ new ThreadLocal<CompositeKey<KeyOne, KeyTwo, KeyThree>>() {
+
+ @Override
+ protected CompositeKey<KeyOne, KeyTwo, KeyThree> initialValue() {
+ return new CompositeKey<KeyOne, KeyTwo, KeyThree>();
+ }
+
+ };
+
+ public static final class CompositeKey<A, B, C> {
+ private A key1;
+ private B key2;
+ private C key3;
+
+ public CompositeKey() {
+
+ }
+
+ public CompositeKey(A key1, B key2, C key3) {
+ setKeys(key1, key2, key3);
+ }
+
+ public A getKey1() {
+ return key1;
+ }
+
+ public B getKey2() {
+ return key2;
+ }
+
+ public C getKey3() {
+ return key3;
+ }
+
+ public CompositeKey<A, B, C> setKeys(A key1, B key2, C key3) {
+ this.key1 = key1;
+ this.key2 = key2;
+ this.key3 = key3;
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CompositeKey) {
+ final CompositeKey<A, B, C> otherKey = (CompositeKey<A, B, C>) obj;
+ return otherKey.key1.equals(key1) && otherKey.key2.equals(key2) && otherKey.key3.equals(key3);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 11;
+ hashCode = hashCode * 31 + key1.hashCode();
+ hashCode = hashCode * 31 + key2.hashCode();
+ hashCode = hashCode * 31 + key3.hashCode();
+ return hashCode;
+ }
+
+ }
+
+ public CompositeKeyTripleHashMap() {
+ map = new HashMap<CompositeKey<KeyOne, KeyTwo, KeyThree>, Value>();
+ }
+
+ public CompositeKeyTripleHashMap(Map<CompositeKey<KeyOne, KeyTwo, KeyThree>, Value> map) {
+ this.map = map;
+ }
+
+ public CompositeKeyTripleHashMap(int initialCapacity) {
+ map = new HashMap<CompositeKey<KeyOne, KeyTwo, KeyThree>, Value>(initialCapacity);
+ }
+
+ public void clear() {
+ map.clear();
+ }
+
+ public boolean containsKey(Object key) {
+ return map.containsKey(key);
+ }
+
+ public boolean containsKey(KeyOne a, KeyTwo b, KeyThree c) {
+ return map.containsKey(threadLocalKey.get().setKeys(a, b, c));
+ }
+
+ public boolean containsValue(Object value) {
+ return map.containsValue(value);
+ }
+
+ public Set<Map.Entry<CompositeKey<KeyOne, KeyTwo, KeyThree>, Value>> entrySet() {
+ return map.entrySet();
+ }
+
+ public Value get(Object key) {
+ if (CompositeKey.class.isInstance(key)) {
+ return map.get(key);
+ } else {
+ throw new IllegalArgumentException(String.format("Expected Type [CompositeKey], got type [%s].",
+ key.getClass().getName()));
+ }
+ }
+
+ public Value get(KeyOne a, KeyTwo b, KeyThree c) {
+ return map.get(threadLocalKey.get().setKeys(a, b, c));
+ }
+
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ public Set<CompositeKey<KeyOne, KeyTwo, KeyThree>> keySet() {
+ return map.keySet();
+ }
+
+ public Value put(CompositeKey<KeyOne, KeyTwo, KeyThree> key, Value value) {
+ return map.put(key, value);
+ }
+
+ public Value put(KeyOne a, KeyTwo b, KeyThree c, Value value) {
+ return map.put(new CompositeKey<KeyOne, KeyTwo, KeyThree>(a, b, c), value);
+ }
+
+ public void putAll(Map<? extends CompositeKey<KeyOne, KeyTwo, KeyThree>, ? extends Value> m) {
+ map.putAll(m);
+ }
+
+ public Value remove(Object key) {
+ return map.remove(key);
+ }
+
+ public Value remove(KeyOne a, KeyTwo b, KeyThree c) {
+ return map.remove(threadLocalKey.get().setKeys(a, b, c));
+ }
+
+ public int size() {
+ return map.size();
+ }
+
+ public Collection<Value> values() {
+ return map.values();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CountingMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CountingMap.java
new file mode 100644
index 00000000000..71e2115cb06
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/CountingMap.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.framework.jdk.core.type;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Map.Entry;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CountingMap<K> {
+ private final HashMap<K, MutableInteger> countingMap;
+
+ public CountingMap(int initialCapacity) {
+ countingMap = new HashMap<K, MutableInteger>(initialCapacity);
+ }
+
+ public CountingMap() {
+ countingMap = new HashMap<K, MutableInteger>();
+ }
+
+ public int get(K key) {
+ MutableInteger count = countingMap.get(key);
+ if (count == null) {
+ return 0;
+ }
+ return count.getValue();
+ }
+
+ public boolean contains(K key) {
+ return countingMap.containsKey(key);
+ }
+
+ public void put(K key) {
+ MutableInteger count = countingMap.get(key);
+ if (count == null) {
+ countingMap.put(key, new MutableInteger(1));
+ } else {
+ count.getValueAndInc();
+ }
+ }
+
+ public void put(K key, int byAmt) {
+ MutableInteger count = countingMap.get(key);
+ if (count == null) {
+ countingMap.put(key, new MutableInteger(byAmt));
+ } else {
+ count.getValueAndInc(byAmt);
+ }
+ }
+
+ public void put(Collection<K> keys) {
+ for (K key : keys) {
+ put(key);
+ }
+ }
+
+ public Set<Entry<K, MutableInteger>> getCounts() {
+ return countingMap.entrySet();
+ }
+
+ public void clear() {
+ countingMap.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyCountingMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyCountingMap.java
new file mode 100644
index 00000000000..25041c7a324
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyCountingMap.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DoubleKeyCountingMap<KeyOne, KeyTwo> {
+
+ HashMap<KeyOne, HashMap<KeyTwo, MutableInteger>> k1ToHashMap;
+
+ public DoubleKeyCountingMap() {
+ k1ToHashMap = new HashMap<KeyOne, HashMap<KeyTwo, MutableInteger>>();
+ }
+
+ public DoubleKeyCountingMap(int initialCapacity) {
+ k1ToHashMap = new HashMap<KeyOne, HashMap<KeyTwo, MutableInteger>>(initialCapacity);
+ }
+
+ public Map<KeyOne, KeyTwo> keySet() {
+ Map<KeyOne, KeyTwo> keySet = new HashMap<KeyOne, KeyTwo>();
+ for (KeyOne one : k1ToHashMap.keySet()) {
+ for (KeyTwo two : k1ToHashMap.get(one).keySet()) {
+ keySet.put(one, two);
+ }
+ }
+ return keySet;
+
+ }
+
+ public Collection<MutableInteger> get(KeyOne k1) {
+ HashMap<KeyTwo, MutableInteger> o = k1ToHashMap.get(k1);
+ if (o == null) {
+ return null;
+ }
+ return o.values();
+ }
+
+ public MutableInteger get(KeyOne k1, KeyTwo k2) {
+ HashMap<KeyTwo, MutableInteger> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ return o.get(k2);
+ }
+ return null;
+ }
+
+ public MutableInteger put(KeyOne k1, KeyTwo k2, int v) {
+ MutableInteger returnV = null;
+ HashMap<KeyTwo, MutableInteger> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ returnV = o.put(k2, new MutableInteger(v));
+ } else {
+ o = new HashMap<KeyTwo, MutableInteger>(20);
+ returnV = o.put(k2, new MutableInteger(v));
+ k1ToHashMap.put(k1, o);
+ }
+ return returnV;
+ }
+
+ public MutableInteger add(KeyOne k1, KeyTwo k2, int v) {
+ MutableInteger returnV = null;
+ HashMap<KeyTwo, MutableInteger> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ returnV = o.get(k2);
+ if (returnV != null) {
+ returnV.getValueAndInc(v);
+ o.put(k2, returnV);
+ } else {
+ o.put(k2, new MutableInteger(v));
+ }
+ } else {
+ o = new HashMap<KeyTwo, MutableInteger>(20);
+ returnV = o.put(k2, new MutableInteger(v));
+ k1ToHashMap.put(k1, o);
+ }
+ return returnV;
+ }
+
+ public MutableInteger remove(KeyOne k1, KeyTwo k2) {
+ MutableInteger value = null;
+ HashMap<KeyTwo, MutableInteger> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ value = o.remove(k2);
+ if (o.size() == 0) {
+ k1ToHashMap.remove(k1);
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return k1ToHashMap.toString();
+ }
+
+ /**
+ * The collection provided by this method is not backed by this DoubleKeyHashMap, and thusly any modifications to
+ * Collection will not modify the map, and future modifications to the map will not modify the Collection.
+ *
+ * @return Return value collection
+ */
+ public Collection<MutableInteger> allValues() {
+ Collection<MutableInteger> values = new HashSet<MutableInteger>();
+ for (HashMap<KeyTwo, MutableInteger> map : k1ToHashMap.values()) {
+ values.addAll(map.values());
+ }
+ return values;
+ }
+
+ public Collection<MutableInteger> allValues(KeyOne key) {
+ HashMap<KeyTwo, MutableInteger> map = k1ToHashMap.get(key);
+ if (map != null) {
+ return new HashSet<MutableInteger>(map.values());
+ }
+ return new HashSet<MutableInteger>();
+ }
+
+ public Map<KeyTwo, MutableInteger> getSubHash(KeyOne k1) {
+ return k1ToHashMap.get(k1);
+ }
+
+ public boolean containsKey(KeyOne k1, KeyTwo k2) {
+ return (k1ToHashMap.containsKey(k1) && k1ToHashMap.get(k1).containsKey(k2));
+ }
+
+ public void clear() {
+ k1ToHashMap.clear();
+ }
+
+ public boolean isEmpty() {
+ return k1ToHashMap.size() == 0;
+ }
+
+ public Set<KeyOne> getKeySetOne() {
+ return k1ToHashMap.keySet();
+ }
+
+ public Collection<? extends Map<KeyTwo, MutableInteger>> getInnerMaps() {
+ return k1ToHashMap.values();
+ }
+
+ /**
+ * Test for DoubleKeyCountingMap
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ DoubleKeyCountingMap<String, String> map = new DoubleKeyCountingMap<String, String>(23);
+ map.put("aaa", "now", 4);
+ System.out.println("Value should be 4 and is -> " + map.get("aaa", "now"));
+ for (int x = 1; x < 3; x++) {
+ map.add("aaa", "now", x);
+ }
+ map.add("bbb", "now", 4);
+ map.add("bbb", "now", 1);
+ map.add("aaa", "the", 3);
+ System.out.println("Value aaa,now should be 7 and is -> " + map.get("aaa", "now"));
+ System.out.println("Value bbb,now should be 5 and is -> " + map.get("bbb", "now"));
+ System.out.println("Value aaa,the should be 3 and is -> " + map.get("aaa", "the"));
+
+ for (String key1 : map.getKeySetOne()) {
+ Map<String, MutableInteger> resolutionToCountMap = map.getSubHash(key1);
+ for (String key2 : resolutionToCountMap.keySet()) {
+ System.out.println(key1 + "," + key2 + "," + resolutionToCountMap.get(key2).getValue());
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyHashMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyHashMap.java
new file mode 100644
index 00000000000..f72bfdb53ae
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoubleKeyHashMap.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class DoubleKeyHashMap<KeyOne, KeyTwo, Value> {
+
+ private final HashMap<KeyOne, HashMap<KeyTwo, Value>> k1ToHashMap;
+
+ public DoubleKeyHashMap() {
+ k1ToHashMap = new HashMap<KeyOne, HashMap<KeyTwo, Value>>();
+ }
+
+ public Map<KeyOne, KeyTwo> keySet() {
+ Map<KeyOne, KeyTwo> keySet = new HashMap<KeyOne, KeyTwo>();
+ for (KeyOne one : k1ToHashMap.keySet()) {
+ for (KeyTwo two : k1ToHashMap.get(one).keySet()) {
+ keySet.put(one, two);
+ }
+ }
+ return keySet;
+
+ }
+
+ public Collection<Value> get(KeyOne k1) {
+ HashMap<KeyTwo, Value> o = k1ToHashMap.get(k1);
+ if (o == null) {
+ return null;
+ }
+ return o.values();
+ }
+
+ public Value get(KeyOne k1, KeyTwo k2) {
+ HashMap<KeyTwo, Value> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ return o.get(k2);
+ }
+ return null;
+ }
+
+ public Value put(KeyOne k1, KeyTwo k2, Value v) {
+ Value returnV = null;
+ HashMap<KeyTwo, Value> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ returnV = o.put(k2, v);
+ } else {
+ o = new HashMap<KeyTwo, Value>(20);
+ returnV = o.put(k2, v);
+ k1ToHashMap.put(k1, o);
+ }
+ return returnV;
+ }
+
+ public Value remove(KeyOne k1, KeyTwo k2) {
+ Value value = null;
+ HashMap<KeyTwo, Value> o = k1ToHashMap.get(k1);
+ if (o != null) {
+ value = o.remove(k2);
+ if (o.size() == 0) {
+ k1ToHashMap.remove(k1);
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return k1ToHashMap.toString();
+ }
+
+ public int size() {
+ return k1ToHashMap.size();
+ }
+
+ /**
+ * The collection provided by this method is not backed by this DoubleKeyHashMap, and thusly any modifications to
+ * Collection will not modify the map, and future modifications to the map will not modify the Collection.
+ *
+ * @return Return value collection
+ */
+ public Collection<Value> allValues() {
+ Collection<Value> values = new HashSet<Value>();
+ for (HashMap<KeyTwo, Value> map : k1ToHashMap.values()) {
+ values.addAll(map.values());
+ }
+ return values;
+ }
+
+ public Collection<Value> allValues(KeyOne key) {
+ HashMap<KeyTwo, Value> map = k1ToHashMap.get(key);
+ if (map != null) {
+ return new HashSet<Value>(map.values());
+ }
+ return new HashSet<Value>();
+ }
+
+ public Map<KeyTwo, Value> getSubHash(KeyOne k1) {
+ return k1ToHashMap.get(k1);
+ }
+
+ public boolean containsKey(KeyOne k1, KeyTwo k2) {
+ return k1ToHashMap.containsKey(k1) && k1ToHashMap.get(k1).containsKey(k2);
+ }
+
+ public void clear() {
+ k1ToHashMap.clear();
+ }
+
+ public boolean isEmpty() {
+ return k1ToHashMap.size() == 0;
+ }
+
+ public Set<KeyOne> getKeySetOne() {
+ return k1ToHashMap.keySet();
+ }
+
+ public Collection<? extends Map<KeyTwo, Value>> getInnerMaps() {
+ return k1ToHashMap.values();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoublePoint.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoublePoint.java
new file mode 100644
index 00000000000..88e1d4bd022
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/DoublePoint.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.framework.jdk.core.type;
+
+/**
+ * @author Charles Shaw
+ */
+public class DoublePoint {
+
+ protected double x;
+ protected double y;
+
+ /**
+ * @param x The x coordinate of the point.
+ * @param y The y coordinate of the point.
+ */
+ public DoublePoint(double x, double y) {
+ super();
+ this.x = x;
+ this.y = y;
+ }
+
+ public DoublePoint() {
+ super();
+ this.x = 0.0;
+ this.y = 0.0;
+ }
+
+ public double getX() {
+ return x;
+ }
+
+ public void setX(double x) {
+ this.x = x;
+ }
+
+ public double getY() {
+ return y;
+ }
+
+ public void setY(double y) {
+ this.y = y;
+ }
+
+ public boolean equals(Object object) {
+ boolean matches = false;
+
+ if (object instanceof DoublePoint) {
+ DoublePoint point = (DoublePoint) object;
+ matches = (point.x == this.x) && (point.y == this.y);
+ }
+
+ return matches;
+ }
+
+ public String toString() {
+ return "(" + x + ", " + y + ")";
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/FixedSizePriorityQueue.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/FixedSizePriorityQueue.java
new file mode 100644
index 00000000000..6df849ff64f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/FixedSizePriorityQueue.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.framework.jdk.core.type;
+
+import java.util.Comparator;
+import java.util.PriorityQueue;
+
+/**
+ * Creates a PriorityQueue of fixed size. Once the queue has become full, attempts to add elements will result in the
+ * least (or smallest) element being removed from the queue.
+ *
+ * @author David Diepenbrock
+ */
+public class FixedSizePriorityQueue<E> extends PriorityQueue<E> {
+
+ private static final long serialVersionUID = 6408445028193363641L;
+
+ private final int qSize;
+
+ public FixedSizePriorityQueue(int size, Comparator<E> comparator) {
+ super(size, comparator);
+ this.qSize = size;
+ }
+
+ public FixedSizePriorityQueue(int size) {
+ super(size);
+ this.qSize = size;
+ }
+
+ public FixedSizePriorityQueue(int size, E initialElement) {
+ this(size);
+ this.add(initialElement);
+ }
+
+ @Override
+ public boolean add(E o) {
+ return this.offer(o);
+ }
+
+ @Override
+ public boolean offer(E o) {
+ if (size() >= qSize) this.poll();
+ return super.offer(o);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollection.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollection.java
new file mode 100644
index 00000000000..a4caa19fe70
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollection.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.framework.jdk.core.type;
+
+import java.util.Collection;
+
+/**
+ * A Map of keys to multiple values. Collections of values are stored in the Map. The type of Collection can be
+ * specified at construction, if desired. All Collections returned by methods are backed by the HashCollection, so
+ * changes to the HashCollection are reflected in the Collection, and vice-versa. However, modifications to the
+ * Collection outside of this class are generally discouraged because removal of the last item would then not guarantee
+ * removal of the key.
+ * <p>
+ * The implementation is tied to the HashCollectionPlus class, providing a null Object for the "plus" object.
+ *
+ * @author David Diepenbrock
+ */
+public class HashCollection<K, V> extends HashCollectionPlus<K, V, Object> {
+
+ private static IPlusProvider<Object> provider = new IPlusProvider<Object>() {
+ public Object newObject() {
+ return null;
+ }
+ };
+
+ /********************************************************************************************************************
+ * Constructors
+ *******************************************************************************************************************/
+
+ /**
+ * @see HashCollectionPlus#HashCollectionPlus(boolean, Class, int, float, IPlusProvider)
+ */
+ @SuppressWarnings("unchecked")
+ public HashCollection(boolean isSynchronized, Class<? extends Collection> collectionType, int initialCapacity, float loadFactor) {
+ super(isSynchronized, collectionType, initialCapacity, loadFactor, provider);
+ }
+
+ /**
+ * @see HashCollectionPlus#HashCollectionPlus(boolean, Class, int, IPlusProvider)
+ */
+ @SuppressWarnings("unchecked")
+ public HashCollection(boolean isSynchronized, Class<? extends Collection> collectionType, int initialCapacity) {
+ super(isSynchronized, collectionType, initialCapacity, provider);
+ }
+
+ /**
+ * @see HashCollectionPlus#HashCollectionPlus(boolean, Class, IPlusProvider)
+ */
+ @SuppressWarnings("unchecked")
+ public HashCollection(boolean isSynchronized, Class<? extends Collection> collectionType) {
+ super(isSynchronized, collectionType, provider);
+ }
+
+ /**
+ * Creates an unsynchronized HashCollection using a default Collection type
+ *
+ * @see HashCollection#HashCollection(boolean, Class, int, float)
+ * @see HashCollectionPlus#DEFAULT_COLLECTION_TYPE
+ */
+ public HashCollection(int initialCapacity, float loadFactor) {
+ this(false, DEFAULT_COLLECTION_TYPE, initialCapacity, loadFactor);
+ }
+
+ /**
+ * Creates an unsynchronized HashCollection using a default Collection type
+ *
+ * @see HashCollection#HashCollection(boolean, Class, int)
+ * @see HashCollectionPlus#DEFAULT_COLLECTION_TYPE
+ */
+ public HashCollection(int initialCapacity) {
+ this(false, DEFAULT_COLLECTION_TYPE, initialCapacity);
+ }
+
+ /**
+ * Creates an unsynchronized HashCollection using a default Collection type
+ *
+ * @see HashCollection#HashCollection(boolean, Class)
+ * @see HashCollectionPlus#DEFAULT_COLLECTION_TYPE
+ */
+ public HashCollection() {
+ this(false, DEFAULT_COLLECTION_TYPE);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlus.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlus.java
new file mode 100644
index 00000000000..3c1ff649808
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlus.java
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A Map of keys to multiple values. Collections of values are stored in the Map. The type of Collection can be
+ * specified at construction, if desired. All Collections returned by methods are backed by the HashCollection, so
+ * changes to the HashCollection are reflected in the Collection, and vice-versa. However, modifications to the
+ * Collection outside of this class are generally discouraged because removal of the last item would then not guarantee
+ * removal of the key. The mapping also contains a "plus" object. This object can store additional information about the
+ * key. At construction a class of type IPlusProvider must be provided. This provider will generate instances of this
+ * "plus" object whenever a new key is added to the Map. When all of the items in the Collection are removed, the entire
+ * key is removed from the table - therefore, the "plus" object is only available as long as the Collection for a given
+ * key is not empty.
+ *
+ * @author David Diepenbrock
+ */
+public class HashCollectionPlus<K, V, O> {
+
+ private boolean isSynchronized;
+ @SuppressWarnings("unchecked")
+ private Class<? extends Collection> collectionType;
+ private IPlusProvider<O> plusProvider;
+
+ private Map<K, ObjectPair<Collection<V>, O>> map;
+ @SuppressWarnings("unchecked")
+ public static final Class<? extends Collection> DEFAULT_COLLECTION_TYPE = ArrayList.class;
+
+ /********************************************************************************************************************
+ * Constructors
+ *******************************************************************************************************************/
+
+ /**
+ * @param isSynchronized - If true, the Map & Collection will both be synchronized using the
+ * Collections.synchronizedMap & Collections.synchronizedCollection. otherwise, this class will not be
+ * synchronzied and therefore not threadsafe.
+ * @param collectionType The type of collection to use to as the values within the HashMap.
+ * @param initialCapacity
+ * @param plusProvider
+ * @see HashMap#HashMap(int, float)
+ */
+ @SuppressWarnings("unchecked")
+ public HashCollectionPlus(boolean isSynchronized, Class<? extends Collection> collectionType, int initialCapacity, float loadFactor, IPlusProvider<O> plusProvider) {
+
+ if (isSynchronized)
+ map = Collections.synchronizedMap(new HashMap<K, ObjectPair<Collection<V>, O>>(initialCapacity, loadFactor));
+ else
+ map = new HashMap<K, ObjectPair<Collection<V>, O>>(initialCapacity, loadFactor);
+
+ this.isSynchronized = isSynchronized;
+ this.collectionType = collectionType;
+ this.plusProvider = plusProvider;
+ }
+
+ /**
+ * @param isSynchronized - If true, the Map & Collection will both be synchronized using the
+ * Collections.synchronizedMap & Collections.synchronizedCollection. otherwise, this class will not be
+ * synchronzied and therefore not threadsafe.
+ * @param collectionType - The type of collection to use to as the values within the HashMap.
+ * @param initialCapacity
+ * @param plusProvider
+ * @see HashMap#HashMap(int)
+ */
+ @SuppressWarnings("unchecked")
+ public HashCollectionPlus(boolean isSynchronized, Class<? extends Collection> collectionType, int initialCapacity, IPlusProvider<O> plusProvider) {
+ if (isSynchronized)
+ map = Collections.synchronizedMap(new HashMap<K, ObjectPair<Collection<V>, O>>(initialCapacity));
+ else
+ map = new HashMap<K, ObjectPair<Collection<V>, O>>(initialCapacity);
+
+ this.isSynchronized = isSynchronized;
+ this.collectionType = collectionType;
+ this.plusProvider = plusProvider;
+ }
+
+ /**
+ * @param isSynchronized - If true, the Map & Collection will both be synchronized using the
+ * Collections.synchronizedMap & Collections.synchronizedCollection. otherwise, this class will not be
+ * synchronzied and therefore not threadsafe.
+ * @param collectionType - The type of collection to use to as the values within the HashMap.
+ * @param plusProvider
+ * @see HashMap#HashMap()
+ */
+ @SuppressWarnings("unchecked")
+ public HashCollectionPlus(boolean isSynchronized, Class<? extends Collection> collectionType, IPlusProvider<O> plusProvider) {
+ if (isSynchronized)
+ map = Collections.synchronizedMap(new HashMap<K, ObjectPair<Collection<V>, O>>());
+ else
+ map = new HashMap<K, ObjectPair<Collection<V>, O>>();
+
+ this.isSynchronized = isSynchronized;
+ this.collectionType = collectionType;
+ this.plusProvider = plusProvider;
+ }
+
+ /**
+ * Creates an unsynchronized HashCollectionPlus using a default Collection type (ArrayList)
+ *
+ * @see HashMap#HashMap(int, float)
+ */
+ public HashCollectionPlus(int initialCapacity, float loadFactor, IPlusProvider<O> plusProvider) {
+ this(false, DEFAULT_COLLECTION_TYPE, initialCapacity, loadFactor, plusProvider);
+ }
+
+ /**
+ * Creates an unsynchronized HashCollectionPlus using a default Collection type (ArrayList)
+ *
+ * @see HashMap#HashMap(int)
+ */
+ public HashCollectionPlus(int initialCapacity, IPlusProvider<O> plusProvider) {
+ this(false, DEFAULT_COLLECTION_TYPE, initialCapacity, plusProvider);
+ }
+
+ /**
+ * Creates an unsynchronized HashCollectionPlus using a default Collection type (ArrayList)
+ *
+ * @see HashMap#HashMap()
+ */
+ public HashCollectionPlus(IPlusProvider<O> plusProvider) {
+ this(false, DEFAULT_COLLECTION_TYPE, plusProvider);
+ }
+
+ /********************************************************************************************************************
+ * Methods
+ *******************************************************************************************************************/
+
+ /**
+ * Adds the value to the collection specified by the key. If there is not a collection for the given key, a new
+ * collection is created and added to the hash.
+ *
+ * @param key The key whose collection we will add value to.
+ * @param value The value to be added.
+ * @return the collection containing value and all other items associated with the key.
+ */
+ @SuppressWarnings("unchecked")
+ public Collection<V> put(K key, V value) {
+ ObjectPair<Collection<V>, O> objectPair = map.get(key);
+ if (objectPair == null) {
+ try {
+ Collection<V> items;
+ if (isSynchronized)
+ items = Collections.synchronizedCollection(collectionType.newInstance());
+ else
+ items = collectionType.newInstance();
+
+ objectPair = new ObjectPair(items, plusProvider.newObject());
+ map.put(key, objectPair);
+ } catch (InstantiationException ex) {
+ ex.printStackTrace();
+ return null;
+ } catch (IllegalAccessException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+ objectPair.object1.add(value);
+ return objectPair.object1;
+ }
+
+ /**
+ * Adds all of the items in the Collection values to the collection for the specified key.
+ *
+ * @param key The key to add the values to
+ * @param values The values to be added
+ * @return The collection for the key, containing all values.
+ */
+ public Collection<V> put(K key, Collection<V> values) {
+ Collection<V> items = null;
+
+ for (V value : values) {
+ if (items == null)
+ items = this.put(key, value);
+ else
+ items.add(value);
+ }
+ return items;
+ }
+
+ /**
+ * @param key The key whose collection we will remove value from.
+ * @param value The value to be removed
+ * @return true iff the value was removed from the collection for key.
+ */
+ public boolean removeValue(K key, V value) {
+ ObjectPair<Collection<V>, O> objectPair = map.get(key);
+
+ if (objectPair != null) {
+ Collection<V> items = objectPair.object1;
+ if (items != null) {
+ if (items.remove(value)) {
+ if (items.isEmpty()) map.remove(key);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public Collection<V> removeValues(K key) {
+ return map.remove(key).object1;
+ }
+
+ /**
+ * Returns the Collection of items for this key, or null if the key does not exist.
+ *
+ * @param key
+ * @return Return value collection reference
+ */
+ public Collection<V> getValues(K key) {
+ ObjectPair<Collection<V>, O> objectPair = map.get(key);
+ if (objectPair != null) return map.get(key).object1;
+ return null;
+ }
+
+ /**
+ * Returns the Collection all items
+ *
+ * @param key
+ * @return Return value collection reference
+ */
+ public List<V> getValues() {
+ List<V> values = new ArrayList<V>();
+ for (ObjectPair<Collection<V>, O> objectPair : map.values()) {
+ if (objectPair != null) {
+ values.addAll(objectPair.object1);
+ }
+ }
+ return values;
+ }
+
+ /**
+ * Returns the "plus" object associated with the key, or null if the key does not exist.
+ *
+ * @param key
+ * @return Return object reference
+ */
+ public O getPlusObject(K key) {
+ ObjectPair<Collection<V>, O> objectPair = map.get(key);
+ if (objectPair != null) return map.get(key).object2;
+ return null;
+ }
+
+ public Set<K> keySet() {
+ return map.keySet();
+ }
+
+ public void clear() {
+ map.clear();
+ }
+
+ public boolean containsKey(K key) {
+ return map.containsKey(key);
+ }
+
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+ /**
+ * The total number of key-value combinations
+ */
+ public int size() {
+ int size = 0;
+ Set<K> keySet = keySet();
+
+ synchronized (map) {
+ for (K key : keySet) {
+ size += getValues(key).size();
+ }
+ }
+ return size;
+ }
+
+ /**
+ * @param value
+ * @return whether the map contains this value
+ */
+ public boolean containsValue(Object value) {
+ for (ObjectPair<Collection<V>, O> objectPair : map.values()) {
+ if (objectPair != null) {
+ for (V tempValue : objectPair.object1) {
+ if (value.equals(tempValue)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlusMap.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlusMap.java
new file mode 100644
index 00000000000..71c511d2360
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/HashCollectionPlusMap.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.framework.jdk.core.type;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A HashCollectionPlus which maintains a map as the "plus" object.
+ *
+ * @see HashCollectionPlus
+ * @author David Diepenbrock
+ */
+public class HashCollectionPlusMap<K, V, P, S> extends HashCollectionPlus<K, V, Map<P, S>> {
+
+ /**
+ * Creates using a synchronized map for the "plus" object regardless of the isSynchronized flag, which is passed on
+ * to the HashCollectionPlus super object.
+ *
+ * @see HashCollectionPlus#HashCollectionPlus(boolean, Class, IPlusProvider)
+ */
+ public HashCollectionPlusMap(boolean isSynchronized, Class<? extends Collection<?>> collectionType) {
+ super(isSynchronized, collectionType, new IPlusProvider<Map<P, S>>() {
+ public Map<P, S> newObject() {
+ return Collections.synchronizedMap(new HashMap<P, S>());
+ }
+ });
+ }
+
+ /**
+ * Returns the value from the "plus" map associated with the two keys provided
+ *
+ * @param key The key to the hashCollection
+ * @param mapKey The key to the "plus" map
+ * @return The associated value, or null if either key had no associated entry.
+ */
+ public S getMapValue(K key, P mapKey) {
+ S value = null;
+ Map<P, S> theMap = this.getPlusObject(key);
+ if (theMap != null) {
+ value = theMap.get(mapKey);
+ }
+ return value;
+ }
+
+ /**
+ * Sets the value from the "plus" map associated with the two keys provided
+ *
+ * @param key The key to the hashCollection
+ * @param mapKey The key to the "plus" map
+ * @param value The value to set into the "plus" map for the mapKey
+ * @return true if the value was successfully set
+ */
+ public boolean setMapValue(K key, P mapKey, S value) {
+ Map<P, S> theMap = this.getPlusObject(key);
+ if (theMap != null) {
+ theMap.put(mapKey, value);
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IInputListener.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IInputListener.java
new file mode 100644
index 00000000000..4a742b0ef83
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IInputListener.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.jdk.core.type;
+
+import java.util.Collection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IInputListener<T> {
+
+ void addNode(T node);
+
+ void addNodes(Collection<T> nodes);
+
+ void removeNode(T node);
+
+ void removeAll();
+
+ void nodeChanged(T inNode);
+
+ void inputChanged();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPlusProvider.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPlusProvider.java
new file mode 100644
index 00000000000..c6813ea66f6
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPlusProvider.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.framework.jdk.core.type;
+
+/**
+ * This object is designed for use with the HashCollectionPlus in order to provide new objects of a particular type.
+ *
+ * @author David Diepenbrock
+ */
+public interface IPlusProvider<O> {
+
+ /**
+ * @return a new object of type O.
+ */
+ public O newObject();
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPropertyStore.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPropertyStore.java
new file mode 100644
index 00000000000..337decd6733
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IPropertyStore.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IPropertyStore {
+
+ /**
+ * Returns the value of the given key .
+ *
+ * @param key the key
+ * @return the value, or <code>null</code> if none
+ */
+ public String get(String key);
+
+ /**
+ * Returns the value, an array of strings, of the given key.
+ *
+ * @param key the key
+ * @return the array of string, or <code>null</code> if none
+ */
+ public String[] getArray(String key);
+
+ /**
+ * Convert the value of the given key to a boolean and return it.
+ *
+ * @param key the key
+ * @return the boolean value, or <code>false</code> if none
+ */
+ public boolean getBoolean(String key);
+
+ /**
+ * Convert the value of the given key to a double and return it.
+ *
+ * @param key the key
+ * @return the value converted to double, or throws <code>NumberFormatException</code> if none
+ * @exception NumberFormatException if the string value does not contain a parsable number.
+ * @see java.lang.Double#valueOf(java.lang.String)
+ */
+ public double getDouble(String key) throws NumberFormatException;
+
+ /**
+ * Convert the value of the given key to a float and return it.
+ *
+ * @param key the key
+ * @return the value converted to float, or throws <code>NumberFormatException</code> if none
+ * @exception NumberFormatException if the string value does not contain a parsable number.
+ * @see java.lang.Float#valueOf(java.lang.String)
+ */
+ public float getFloat(String key) throws NumberFormatException;
+
+ /**
+ * Convert the value of the given key to a int and return it.
+ *
+ * @param key the key
+ * @return the value converted to int, or throws <code>NumberFormatException</code> if none
+ * @exception NumberFormatException if the string value does not contain a parsable number.
+ * @see java.lang.Integer#valueOf(java.lang.String)
+ */
+ public int getInt(String key) throws NumberFormatException;
+
+ /**
+ * Convert the value of the given key to a long and return it.
+ *
+ * @param key the key
+ * @return the value converted to long, or throws <code>NumberFormatException</code> if none
+ * @exception NumberFormatException if the string value does not contain a parsable number.
+ * @see java.lang.Long#valueOf(java.lang.String)
+ */
+ public long getLong(String key) throws NumberFormatException;
+
+ /**
+ * Adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, String[] value);
+
+ /**
+ * Converts the double <code>value</code> to a string and adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, double value);
+
+ /**
+ * Converts the float <code>value</code> to a string and adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, float value);
+
+ /**
+ * Converts the integer <code>value</code> to a string and adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, int value);
+
+ /**
+ * Converts the long <code>value</code> to a string and adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, long value);
+
+ /**
+ * Adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, String value);
+
+ /**
+ * Converts the boolean <code>value</code> to a string and adds the pair <code>key/value</code>.
+ *
+ * @param key the key.
+ * @param value the value to be associated with the <code>key</code>
+ */
+ public void put(String key, boolean value);
+
+ /**
+ * Returns the property store's id
+ *
+ * @return The Property Store's id
+ */
+ public String getId();
+
+ /**
+ * Save a property store to a file.
+ *
+ * @param fileName the name of the file the property store values are written to.
+ * @throws IOException
+ */
+ public void save(String fileName) throws Exception;
+
+ /**
+ * Load a property store from a file and fill the receiver with its content.
+ *
+ * @param fileName the name of the file the property store values are read from.
+ * @throws IOException
+ */
+ public void load(String fileName) throws Exception;
+
+ /**
+ * Get keys referencing primitive type items
+ *
+ * @return primitive type item keys
+ */
+ public Set<String> keySet();
+
+ /**
+ * Get keys referencing arrayItems
+ *
+ * @return array item keys
+ */
+ public Set<String> arrayKeySet();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IVariantData.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IVariantData.java
new file mode 100644
index 00000000000..84cda2ca355
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/IVariantData.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.framework.jdk.core.type;
+
+import java.io.InputStream;
+import java.util.Date;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IVariantData {
+
+ public String get(String key);
+
+ public boolean isEmpty(String key);
+
+ public String[] getArray(String key);
+
+ public boolean getBoolean(String key);
+
+ public double getDouble(String key) throws NumberFormatException;
+
+ public float getFloat(String key) throws NumberFormatException;
+
+ public int getInt(String key) throws NumberFormatException;
+
+ public long getLong(String key) throws NumberFormatException;
+
+ public Date getDate(String key) throws IllegalArgumentException;
+
+ public String getStreamAsString(String key) throws Exception;
+
+ public InputStream getStream(String key) throws IllegalArgumentException;
+
+ public void put(String key, String[] value);
+
+ public void put(String key, double value);
+
+ public void put(String key, float value);
+
+ public void put(String key, int value);
+
+ public void put(String key, long value);
+
+ public void put(String key, String value);
+
+ public void put(String key, boolean value);
+
+ public void put(String key, Date date);
+
+ public void put(String key, byte[] bytes);
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/InputManager.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/InputManager.java
new file mode 100644
index 00000000000..cc4b69d27f8
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/InputManager.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.framework.jdk.core.type;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InputManager<T> implements IInputListener<T> {
+
+ private List<T> inputList;
+ private Set<IInputListener<T>> changeListeners;
+
+ public InputManager() {
+ super();
+ inputList = Collections.synchronizedList(new ArrayList<T>());
+ changeListeners = Collections.synchronizedSet(new HashSet<IInputListener<T>>());
+ }
+
+ public List<T> getInputList() {
+ return inputList;
+ }
+
+ public void addNode(T inNode) {
+ synchronized (inputList) {
+ inputList.add(inputList.size(), inNode);
+ }
+ synchronized (changeListeners) {
+ Iterator<IInputListener<T>> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).addNode(inNode);
+ }
+ }
+
+ public void addNodes(Collection<T> inNode) {
+ synchronized (inputList) {
+ this.inputList.addAll(inNode);
+ }
+ synchronized (changeListeners) {
+ Iterator<IInputListener<T>> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).addNodes(inNode);
+ }
+ }
+
+ public void removeNode(T inNode) {
+ synchronized (inputList) {
+ this.inputList.remove(inNode);
+ }
+ synchronized (changeListeners) {
+ Iterator<IInputListener<T>> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).removeNode(inNode);
+ }
+ }
+
+ public void nodeChanged(T inNode) {
+ synchronized (changeListeners) {
+ Iterator<IInputListener<T>> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).nodeChanged(inNode);
+ }
+ }
+
+ public void inputChanged() {
+ synchronized (changeListeners) {
+ Iterator<IInputListener<T>> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).inputChanged();
+ }
+ }
+
+ public void removeAll() {
+ synchronized (inputList) {
+ this.inputList.clear();
+ }
+ synchronized (changeListeners) {
+ Iterator<IInputListener<T>> iterator = changeListeners.iterator();
+ while (iterator.hasNext()) {
+ (iterator.next()).removeAll();
+ }
+ }
+ }
+
+ public void addInputListener(IInputListener<T> listener) {
+ synchronized (changeListeners) {
+ changeListeners.add(listener);
+ }
+
+ for (T node : inputList) {
+ listener.addNode(node);
+ }
+ }
+
+ public void removeInputListener(IInputListener<T> listener) {
+ synchronized (changeListeners) {
+ changeListeners.remove(listener);
+ }
+ }
+
+ public String toString() {
+ synchronized (inputList) {
+ String toReturn = "";
+ for (int i = 0; i < inputList.size(); i++) {
+ T node = (T) inputList.get(i);
+ toReturn += node.toString();
+ }
+ return toReturn + "\n\n";
+ }
+ }
+
+ public void dispose() {
+ synchronized (inputList) {
+ inputList.clear();
+ }
+ synchronized (changeListeners) {
+ changeListeners.clear();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableBoolean.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableBoolean.java
new file mode 100644
index 00000000000..39d6c064b75
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableBoolean.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.framework.jdk.core.type;
+
+/**
+ * This class implements a boolean that can be passed around and modified through a group of methods.
+ *
+ * @author Chris Austin
+ */
+public class MutableBoolean {
+ private boolean value;
+
+ public MutableBoolean(boolean value) {
+ this.value = value;
+ }
+
+ public boolean getValue() {
+ return value;
+ }
+
+ public void setValue(boolean value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return Boolean.toString(value);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableDouble.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableDouble.java
new file mode 100644
index 00000000000..8cce695a5bc
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableDouble.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.framework.jdk.core.type;
+
+/**
+ * This class implements an double that can be passed around and modified through a group of methods. It also allows the
+ * double value to be retrieved then post incremented automatically. This is a nice functionality where a common counter
+ * needs to be used within calling methods, but it is not convenient to return the latest index via the return value.
+ *
+ * @author Donald G. Dunne
+ */
+public class MutableDouble {
+ private double value;
+
+ public MutableDouble(double value) {
+ this.value = value;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public double getValueAndInc(double byAmmount) {
+ return value += byAmmount;
+ }
+
+ public void setValue(double value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return Double.toString(value);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableInteger.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableInteger.java
new file mode 100644
index 00000000000..eb43eafac04
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/MutableInteger.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.framework.jdk.core.type;
+
+/**
+ * This class implements an integer that can be passed around and modified through a group of methods. It also allows
+ * the integer value to be retrieved then post incremented automatically. This is a nice functionality where a common
+ * counter needs to be used within calling methods, but it is not convenient to return the latest index via the return
+ * value.
+ *
+ * @author Robert A. Fisher
+ */
+public class MutableInteger {
+ private int value;
+
+ public MutableInteger(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public int getValueAndInc() {
+ return value++;
+ }
+
+ public int getValueAndInc(int byAmt) {
+ return value += byAmt;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return Integer.toString(value);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectPair.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectPair.java
new file mode 100644
index 00000000000..05baddd93ed
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectPair.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.framework.jdk.core.type;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ObjectPair<O, T> {
+ public O object1;
+ public T object2;
+
+ public ObjectPair(O object1, T object2) {
+ this.object1 = object1;
+ this.object2 = object2;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CompositeKey) {
+ final ObjectPair<O, T> other = (ObjectPair<O, T>) obj;
+ boolean result = true;
+ if (other.object1 != null && object1 != null) {
+ result &= other.object1.equals(object1);
+ } else {
+ result &= other.object1 == null && object1 == null;
+ }
+ if (other.object2 != null && object2 != null) {
+ result &= other.object2.equals(object2);
+ } else {
+ result &= other.object2 == null && object2 == null;
+ }
+ return result;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 37;
+ int result = 17;
+ if (object1 != null) {
+ result = prime * result + object1.hashCode();
+ } else {
+ result = prime * result;
+ }
+ if (object2 != null) {
+ result = prime * result + object2.hashCode();
+ } else {
+ result = prime * result;
+ }
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "<" + object1 + ", " + object2 + ">";
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectTriplet.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectTriplet.java
new file mode 100644
index 00000000000..9857c25d90d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/ObjectTriplet.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.framework.jdk.core.type;
+
+public class ObjectTriplet<T, U, V> {
+ public final T object1;
+ public final U object2;
+ public final V object3;
+
+ public ObjectTriplet(T object1, U object2, V object3) {
+ this.object1 = object1;
+ this.object2 = object2;
+ this.object3 = object3;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/Pair.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/Pair.java
new file mode 100644
index 00000000000..e346ff01c6a
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/Pair.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.framework.jdk.core.type;
+
+import java.io.Serializable;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Pair<T, K> implements Serializable {
+ private static final long serialVersionUID = 1764353834209869140L;
+ private T key;
+ private K value;
+
+ public Pair(T key, K value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public T getKey() {
+ return key;
+ }
+
+ public K getValue() {
+ return value;
+ }
+
+ public void setKey(T key) {
+ this.key = key;
+ }
+
+ public void setValue(K value) {
+ this.value = value;
+ }
+
+ public String toString() {
+ return String.format("[%s, %s]", key.toString(), value.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStore.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStore.java
new file mode 100644
index 00000000000..c0cedd73c0f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStore.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.framework.jdk.core.type;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PropertyStore implements IPropertyStore, Serializable {
+ private static final long serialVersionUID = 9076969425223251739L;
+
+ private final String EXCEPTION_MESSAGE = "No setting found for key: [%s]";
+
+ private String storeId;
+ private Properties storageData;
+ private Properties storageArrays;
+
+ public PropertyStore(String storeId) {
+ this.storeId = storeId;
+ this.storageData = new Properties();
+ this.storageArrays = new Properties();
+ }
+
+ public PropertyStore(Reader properties) throws IOException, SAXException, ParserConfigurationException {
+ this((String) null);
+ PropertyStoreWriter writer = new PropertyStoreWriter();
+ writer.load(this, properties);
+ }
+
+ public PropertyStore(Properties properties) {
+ this.storageData = properties;
+ this.storeId = Integer.toString(properties.hashCode());
+ }
+
+ public String get(String key) {
+ return (String) storageData.get(key);
+ }
+
+ public String[] getArray(String key) {
+ return (String[]) storageArrays.get(key);
+ }
+
+ public boolean getBoolean(String key) {
+ return Boolean.valueOf((String) storageData.get(key)).booleanValue();
+ }
+
+ public double getDouble(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Double(setting).doubleValue();
+ }
+
+ public float getFloat(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Float(setting).floatValue();
+ }
+
+ public int getInt(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Integer(setting).intValue();
+ }
+
+ public long getLong(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Long(setting).longValue();
+ }
+
+ public void put(String key, String[] value) {
+ if (value == null) {
+ value = new String[0];
+ }
+ storageArrays.put(key, value);
+ }
+
+ public void put(String key, double value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, float value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, int value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, long value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, String value) {
+ if (value == null) {
+ value = "";
+ }
+ storageData.put(key, value);
+ }
+
+ public void put(String key, boolean value) {
+ put(key, String.valueOf(value));
+ }
+
+ public String getId() {
+ return storeId;
+ }
+
+ protected void setId(String name) {
+ this.storeId = name;
+ }
+
+ protected Properties getItems() {
+ return storageData;
+ }
+
+ protected Properties getArrays() {
+ return storageArrays;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append(storageData.toString().replaceAll(",", ",\n"));
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.data.IPropertyStore#load(java.lang.String)
+ */
+ public void load(String fileName) throws Exception {
+ InputStream inputStream = new FileInputStream(fileName);
+ PropertyStoreWriter storeWriter = new PropertyStoreWriter();
+ storeWriter.load(this, inputStream);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.data.IPropertyStore#save(java.lang.String)
+ */
+ public void save(String fileName) throws Exception {
+ OutputStream outputStream = new FileOutputStream(fileName);
+ PropertyStoreWriter storeWriter = new PropertyStoreWriter();
+ storeWriter.save(this, outputStream);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.type.IPropertyStore#arrayKeySet()
+ */
+ public Set<String> arrayKeySet() {
+ List<String> items = Collections.castAll(this.storageArrays.keySet());
+ return Collections.toSet(items);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.type.IPropertyStore#keySet()
+ */
+ public Set<String> keySet() {
+ List<String> items = Collections.castAll(this.storageData.keySet());
+ return Collections.toSet(items);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStoreWriter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStoreWriter.java
new file mode 100644
index 00000000000..fa70577b2dd
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/PropertyStoreWriter.java
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public class PropertyStoreWriter {
+ private static final String TAG_SECTION = "store";
+ private static final String TAG_NAME = "id";
+ private static final String TAG_KEY = "key";
+ private static final String TAG_VALUE = "value";
+ private static final String TAG_LIST = "list";
+ private static final String TAG_ITEM = "item";
+
+ public void load(PropertyStore store, Reader reader) throws IOException, SAXException, ParserConfigurationException {
+ Document document = null;
+ try {
+ DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ document = parser.parse(new InputSource(reader));
+
+ //Strip out any comments first
+ Node root = document.getFirstChild();
+ while (root.getNodeType() == Node.COMMENT_NODE) {
+ document.removeChild(root);
+ root = document.getFirstChild();
+ }
+ load(store, document, (Element) root);
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+
+ public void load(PropertyStore store, InputStream inputStream) throws IOException, SAXException, ParserConfigurationException {
+ load(store, new BufferedReader(new InputStreamReader(inputStream, "utf-8")));
+ }
+
+ public void save(PropertyStore store, OutputStream stream) throws IOException {
+ XMLWriter writer = new XMLWriter(stream);
+ internalSave(store, writer);
+ }
+
+ public void save(PropertyStore store, Writer writer) throws IOException {
+ XMLWriter internalWriter = new XMLWriter(writer);
+ internalSave(store, internalWriter);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void load(PropertyStore store, Document document, Element root) {
+ store.setId(root.getAttribute(TAG_NAME));
+ NodeList l = root.getElementsByTagName(TAG_ITEM);
+ for (int i = 0; i < l.getLength(); i++) {
+ Node n = l.item(i);
+ if (root == n.getParentNode()) {
+ String key = ((Element) l.item(i)).getAttribute(TAG_KEY);
+ String value = ((Element) l.item(i)).getAttribute(TAG_VALUE);
+ store.put(key, value);
+ }
+ }
+ l = root.getElementsByTagName(TAG_LIST);
+ for (int i = 0; i < l.getLength(); i++) {
+ Node n = l.item(i);
+ if (root == n.getParentNode()) {
+ Element child = (Element) l.item(i);
+ String key = child.getAttribute(TAG_KEY);
+ NodeList list = child.getElementsByTagName(TAG_ITEM);
+ List valueList = new ArrayList();
+ for (int j = 0; j < list.getLength(); j++) {
+ Element node = (Element) list.item(j);
+ if (child == node.getParentNode()) {
+ valueList.add(node.getAttribute(TAG_VALUE));
+ }
+ }
+ String[] value = new String[valueList.size()];
+ valueList.toArray(value);
+ store.put(key, value);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void internalSave(PropertyStore store, XMLWriter out) {
+ HashMap attributes = new HashMap(2);
+ String name = store.getId();
+ attributes.put(TAG_NAME, name == null ? "" : name); //$NON-NLS-1$
+ out.startTag(TAG_SECTION, attributes);
+ attributes.clear();
+ Properties items = store.getItems();
+ for (Iterator i = items.keySet().iterator(); i.hasNext();) {
+ String key = (String) i.next();
+ attributes.put(TAG_KEY, key == null ? "" : key); //$NON-NLS-1$
+ String string = (String) items.get(key);
+ attributes.put(TAG_VALUE, string == null ? "" : string); //$NON-NLS-1$
+ out.printTag(TAG_ITEM, attributes, true);
+ }
+
+ attributes.clear();
+ Properties arrayItems = store.getArrays();
+ for (Iterator i = arrayItems.keySet().iterator(); i.hasNext();) {
+ String key = (String) i.next();
+ attributes.put(TAG_KEY, key == null ? "" : key); //$NON-NLS-1$
+ out.startTag(TAG_LIST, attributes);
+ String[] value = (String[]) arrayItems.get(key);
+ attributes.clear();
+ if (value != null) {
+ for (int index = 0; index < value.length; index++) {
+ String string = value[index];
+ attributes.put(TAG_VALUE, string == null ? "" : string); //$NON-NLS-1$
+ out.printTag(TAG_ITEM, attributes, true);
+ }
+ }
+ out.endTag(TAG_LIST);
+ attributes.clear();
+ }
+ out.endTag(TAG_SECTION);
+ out.close();
+ }
+
+ private static class XMLWriter extends PrintWriter {
+ /** current number of tabs to use for ident */
+ protected int tab;
+
+ /** the xml header */
+ protected static final String XML_VERSION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$
+
+ public XMLWriter(Writer writer) {
+ super(writer);
+ tab = 0;
+ println(XML_VERSION);
+ }
+
+ public XMLWriter(OutputStream output) throws UnsupportedEncodingException {
+ this(new OutputStreamWriter(output, "UTF8")); //$NON-NLS-1$
+ }
+
+ /**
+ * write the intended end tag
+ *
+ * @param name the name of the tag to end
+ */
+ public void endTag(String name) {
+ tab--;
+ printTag("/" + name, null, false); //$NON-NLS-1$
+ }
+
+ private void printTabulation() {
+ for (int i = 0; i < tab; i++) {
+ super.print('\t');
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void printTag(String name, HashMap parameters, boolean close) {
+ printTag(name, parameters, true, true, close);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void printTag(String name, HashMap parameters, boolean shouldTab, boolean newLine, boolean close) {
+ StringBuffer sb = new StringBuffer();
+ sb.append('<');
+ sb.append(name);
+ if (parameters != null) {
+ for (Enumeration e = Collections.enumeration(parameters.keySet()); e.hasMoreElements();) {
+ sb.append(" "); //$NON-NLS-1$
+ String key = (String) e.nextElement();
+ sb.append(key);
+ sb.append("=\""); //$NON-NLS-1$
+ sb.append(getEscaped(String.valueOf(parameters.get(key))));
+ sb.append("\""); //$NON-NLS-1$
+ }
+ }
+ if (close) {
+ sb.append('/');
+ }
+ sb.append('>');
+ if (shouldTab) {
+ printTabulation();
+ }
+ if (newLine) {
+ println(sb.toString());
+ } else {
+ print(sb.toString());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void startTag(String name, HashMap parameters) {
+ startTag(name, parameters, true);
+ tab++;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void startTag(String name, HashMap parameters, boolean newLine) {
+ printTag(name, parameters, true, newLine, false);
+ }
+
+ private static void appendEscapedChar(StringBuffer buffer, char c) {
+ String replacement = getReplacement(c);
+ if (replacement != null) {
+ buffer.append('&');
+ buffer.append(replacement);
+ buffer.append(';');
+ } else {
+ buffer.append(c);
+ }
+ }
+
+ private static String getEscaped(String s) {
+ StringBuffer result = new StringBuffer(s.length() + 10);
+ for (int i = 0; i < s.length(); ++i) {
+ appendEscapedChar(result, s.charAt(i));
+ }
+ return result.toString();
+ }
+
+ private static String getReplacement(char c) {
+ // Encode special XML characters into the equivalent character references.
+ // The first five are defined by default for all XML documents.
+ // The next three (#xD, #xA, #x9) are encoded to avoid them
+ // being converted to spaces on deserialization
+ switch (c) {
+ case '<':
+ return "lt"; //$NON-NLS-1$
+ case '>':
+ return "gt"; //$NON-NLS-1$
+ case '"':
+ return "quot"; //$NON-NLS-1$
+ case '\'':
+ return "apos"; //$NON-NLS-1$
+ case '&':
+ return "amp"; //$NON-NLS-1$
+ case '\r':
+ return "#x0D"; //$NON-NLS-1$
+ case '\n':
+ return "#x0A"; //$NON-NLS-1$
+ case '\u0009':
+ return "#x09"; //$NON-NLS-1$
+ }
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/SimpleEnum.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/SimpleEnum.java
new file mode 100644
index 00000000000..7d3a4740c70
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/SimpleEnum.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.framework.jdk.core.type;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class SimpleEnum {
+
+ public final transient int value;
+ public final String name;
+
+ protected SimpleEnum(int value, String name) {
+ this.value = value;
+ this.name = name;
+ }
+
+ public final String toString() {
+ return name;
+ }
+
+ public final boolean equals(Object obj) {
+ return super.equals(obj);
+ }
+
+ public final int hashCode() {
+ return value;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeObject.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeObject.java
new file mode 100644
index 00000000000..a489fbaa80c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeObject.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.framework.jdk.core.type;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TreeObject {
+ private String name;
+ private TreeParent parent;
+ private boolean isCurrent;
+ private boolean isChecked;
+
+ public TreeObject(String name) {
+ this.name = name;
+ }
+
+ public TreeObject() {
+ this("");
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setParent(TreeParent parent) {
+ this.parent = parent;
+ }
+
+ public TreeParent getParent() {
+ return parent;
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+ public boolean isCurrent() {
+ return isCurrent;
+ }
+
+ public void setCurrent(boolean isCurrent) {
+ this.isCurrent = isCurrent;
+ }
+
+ public boolean isChecked() {
+ return isChecked;
+ }
+
+ public void setChecked(boolean isChecked) {
+ this.isChecked = isChecked;
+ }
+
+ public Object getAdapter(Class<?> adapter) {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeParent.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeParent.java
new file mode 100644
index 00000000000..e6c82a4446f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/TreeParent.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.framework.jdk.core.type;
+
+import java.util.ArrayList;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TreeParent extends TreeObject {
+ private ArrayList<TreeObject> children;
+
+ public TreeParent(String name) {
+ super(name);
+ children = new ArrayList<TreeObject>();
+ }
+
+ public TreeParent() {
+ this("");
+ }
+
+ public void addChild(TreeObject child) {
+ children.add(child);
+ child.setParent(this);
+ }
+
+ public void removeChild(TreeObject child) {
+ children.remove(child);
+ child.setParent(null);
+ }
+
+ public TreeObject[] getChildren() {
+ return (TreeObject[]) children.toArray(new TreeObject[children.size()]);
+ }
+
+ public boolean hasChildren() {
+ return children.size() > 0;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/VariantData.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/VariantData.java
new file mode 100644
index 00000000000..61eb769cb5d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/type/VariantData.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.type;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class VariantData implements IVariantData {
+ private static final long serialVersionUID = 9076969425223251739L;
+
+ private final String EXCEPTION_MESSAGE = "No setting found for key: [%s]";
+ private final String CONVERSION_EXCEPTION_MESSAGE = "Unable to convert [%s] from [%s] to [%s]";
+
+ private final Properties storageData;
+ private final Properties storageArrays;
+ private final Map<String, byte[]> byteArrayData;
+
+ public VariantData() {
+ this.byteArrayData = new HashMap<String, byte[]>();
+ this.storageData = new Properties();
+ this.storageArrays = new Properties();
+ }
+
+ public String get(String key) {
+ return (String) storageData.get(key);
+ }
+
+ public boolean isEmpty(String key) {
+ if (get(key) == null) return true;
+ return get(key).equals("");
+ }
+
+ public String[] getArray(String key) {
+ return (String[]) storageArrays.get(key);
+ }
+
+ public boolean getBoolean(String key) {
+ return Boolean.valueOf((String) storageData.get(key)).booleanValue();
+ }
+
+ public double getDouble(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Double(setting).doubleValue();
+ }
+
+ public float getFloat(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Float(setting).floatValue();
+ }
+
+ public int getInt(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+
+ return new Integer(setting).intValue();
+ }
+
+ public long getLong(String key) throws NumberFormatException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new NumberFormatException(String.format(EXCEPTION_MESSAGE, key));
+ }
+ return new Long(setting).longValue();
+ }
+
+ public Date getDate(String key) throws IllegalArgumentException {
+ String setting = (String) storageData.get(key);
+ if (setting == null) {
+ throw new IllegalArgumentException(String.format(EXCEPTION_MESSAGE, key));
+ }
+ return new Date(new Long(setting).longValue());
+ }
+
+ public String getStreamAsString(String key) throws Exception {
+ String toReturn;
+ InputStream inputStream = getStream(key);
+ try {
+ toReturn = Lib.inputStreamToString(inputStream);
+ } catch (IOException ex) {
+ throw new IOException(String.format(CONVERSION_EXCEPTION_MESSAGE, key, "byte[]", "String"));
+ }
+ return toReturn;
+ }
+
+ public InputStream getStream(String key) throws IllegalArgumentException {
+ byte[] bytes = byteArrayData.get(key);
+ if (bytes == null) {
+ throw new IllegalArgumentException(String.format(EXCEPTION_MESSAGE, key));
+ }
+ return new ByteArrayInputStream(bytes);
+ }
+
+ public void put(String key, String[] value) {
+ if (value == null) {
+ value = new String[0];
+ }
+ storageArrays.put(key, value);
+ }
+
+ public void put(String key, double value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, float value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, int value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, long value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, boolean value) {
+ put(key, String.valueOf(value));
+ }
+
+ public void put(String key, Date date) {
+ if (date != null) {
+ put(key, date.getTime());
+ }
+ }
+
+ public void put(String key, String value) {
+ if (value == null) {
+ value = "";
+ }
+ storageData.put(key, value);
+ }
+
+ public void put(String key, byte[] bytes) {
+ if (bytes == null) {
+ bytes = new byte[0];
+ }
+ byteArrayData.put(key, bytes);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append(storageData.toString().replaceAll(",", ",\n"));
+ builder.append(storageArrays.toString().replaceAll(",", ",\n"));
+ for (String key : byteArrayData.keySet()) {
+ builder.append(key);
+ builder.append("=");
+ try {
+ builder.append(getStreamAsString(key));
+ } catch (Exception ex) {
+ builder.append("!!Error!!");
+ }
+ builder.append(",\n");
+ }
+ return builder.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AFile.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AFile.java
new file mode 100644
index 00000000000..01a6c3c8bb4
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AFile.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.framework.jdk.core.util;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AFile {
+
+ public static String justFilename(String filename) {
+ File file = new File(filename);
+ return file.getName();
+ }
+
+ public static String justPath(String filename) {
+ File file = new File(filename);
+ filename = filename.replaceAll(file.getName(), "");
+ return filename;
+ }
+
+ /**
+ * Use the Lib method directly - the original implementation of this method was not memory efficient and suppressed
+ * exceptions
+ *
+ * @param stream
+ * @return
+ */
+ public static String readFile(String filename) {
+ return readFile(new File(filename));
+ }
+
+ /**
+ * Use the Lib method directly - the original implementation of this method was not memory efficient and suppressed
+ * exceptions
+ *
+ * @param stream
+ * @return
+ */
+ public static String readFile(File file) {
+ try {
+ return Lib.fileToString(file);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AHTML.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AHTML.java
new file mode 100644
index 00000000000..bf763fa5e87
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AHTML.java
@@ -0,0 +1,469 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Michael A. Winston
+ */
+public class AHTML {
+ private static final String HTTP_CHARSET_ENCODING =
+ "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">";
+ private static final String begin = "<table ";
+ public final static String LABEL_FONT = "<font color=\"black\" face=\"Arial\" size=\"-1\">";
+
+ public static String getHyperlink(String url, String name) {
+ return String.format("<a href=\"%s\">%s</a>", url, name);
+ }
+
+ public static String textToHtml(String text) {
+ if (text == null) {
+ return "";
+ }
+ text = text.replaceAll("&", "&amp;");
+ text = text.replaceAll(">", "&gt;");
+ text = text.replaceAll("<", "&lt;");
+ text = text.replaceAll("\"", "&quot;");
+ text = text.replaceAll("\\n", "<br/>");
+ text = text.replaceAll("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
+ text = text.replaceAll("[\\x0B\\f\\r]+", "");
+ return text;
+ }
+
+ public static String htmlToText(String html) {
+ if (html == null) {
+ return "";
+ }
+ html = html.replaceAll("&amp;", "&");
+ html = html.replaceAll("&gt;", ">");
+ html = html.replaceAll("&lt;", "<");
+ html = html.replaceAll("&quot;", "\"");
+ html = html.replaceAll("&nbsp;", " ");
+ return html;
+ }
+
+ public static String getUrlPageHtml(String urlStr, InetSocketAddress addr) {
+ StringBuffer buffer = new StringBuffer();
+ try {
+ URL url = new URL(urlStr);
+ URLConnection connection = url.openConnection(new Proxy(Proxy.Type.HTTP, addr));
+ BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ String line = null;
+ while ((line = rd.readLine()) != null) {
+ buffer.append(line);
+ }
+ rd.close();
+ return buffer.toString();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return simplePage("Exception opening url " + ex.getLocalizedMessage());
+ }
+ }
+
+ public static String titledPage(String title, String text) {
+ return simplePage("<head><title>" + title + "</title></head>" + text);
+ }
+
+ public static String pageEncoding(String html) {
+ return HTTP_CHARSET_ENCODING + html;
+ }
+
+ public static String simplePage(String text) {
+ return pageEncoding("<html>" + text + "</html>");
+ }
+
+ public static String simplePageNoPageEncoding(String text) {
+ return "<html>" + text + "</html>";
+ }
+
+ public static String getLabelStr(String labelFont, String str) {
+ return labelFont + "<b>" + textToHtml(str) + "</b></font>";
+ }
+
+ public static String getLabelValueStr(String labelFont, String label, String value) {
+ return getLabelStr(labelFont, label) + value;
+ }
+
+ public static String getLabelValueStr(String label, String value) {
+ return getLabelStr(LABEL_FONT, label + ":") + "&nbsp;&nbsp;" + value;
+ }
+
+ public static String color(String color, String str) {
+ return "<font color=\"" + color + "\">" + str + "</font>";
+ }
+
+ public static String boldColor(String color, String str) {
+ return "<font color=\"" + color + "\"><b>" + textToHtml(str) + "</b></font>";
+ }
+
+ public static String bold(String str) {
+ return "<b>" + textToHtml(str) + "</b>";
+ }
+
+ public static String boldColorTags(String color, String str) {
+ return "<font color=\"" + color + "\"><b>" + str + "</b></font>";
+ }
+
+ public static String imageBlock(String description, String filename) {
+ String filenames[] = new String[1];
+ filenames[0] = filename;
+ return imageBlock(description, filenames);
+ }
+
+ public static String imageBlock(String description, String filenames[]) {
+ String str = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td>";
+ if (!description.equals("")) {
+ str += description;
+ str += AHTML.newline();
+ }
+ for (int i = 0; i < filenames.length; i++) {
+ str += "<IMG SRC=\"" + filenames[i] + "\"><br>";
+ }
+ str += "</td></tr></table>";
+ return str;
+ }
+
+ public static String urlBlock(String description, String urls[]) {
+ String str = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
+ if (!description.equals("")) {
+ str += description;
+ str += AHTML.newline();
+ }
+ for (int i = 0; i < urls.length; i++) {
+ str += "<A HREF=\"" + urls[i] + "\">" + urls[i] + "</A><br>";
+ }
+ str += "</td></tr></table>";
+ return str;
+ }
+
+ public static String heading(int heading, String str, String id) {
+ return "<h" + heading + (id != null && !id.equals("") ? " id=\"" + id + "\"" : "") + ">" + textToHtml(str) + "</h" + heading + ">";
+ }
+
+ public static String heading(int heading, String str) {
+ return heading(heading, str, null);
+ }
+
+ public static String padSpace(int num, String str) {
+ String out = "";
+ for (int i = 0; i < num; i++) {
+ out += "&nbsp;";
+ }
+ out += str;
+ return out;
+ }
+
+ public static String addSpace(int num) {
+ String out = "";
+ for (int i = 0; i < num; i++) {
+ out += "&nbsp;";
+ }
+ return out;
+ }
+
+ public static String para(String str) {
+ return "<p>" + textToHtml(str) + "</p>";
+ }
+
+ public static String italics(String str) {
+ return "<i>" + textToHtml(str) + "</i>";
+ }
+
+ public static String pre(String str) {
+ return "<pre>" + str + "</pre>";
+ }
+
+ public static String newline() {
+ return newline(1);
+ }
+
+ public static String newline(int num) {
+ String str = "";
+ for (int i = 0; i < num; i++) {
+ str += "<br>";
+ }
+ return str + "";
+ }
+
+ public static String name(int num) {
+ return nameTarget("" + num);
+ }
+
+ /**
+ * Create target for hyperlink to jump to
+ *
+ * @param str
+ * @return Return name target string
+ */
+ public static String nameTarget(String str) {
+ if (str == null) {
+ return "";
+ }
+ return "<A NAME=\"" + str + "\">";
+ }
+
+ /**
+ * Create &lt;a href> hyperlink to nameTarget
+ *
+ * @param num
+ * @param text
+ * @return Return name link string
+ */
+ public static String nameLink(int num, String text) {
+ return nameLink("" + num, text);
+ }
+
+ /**
+ * Create &lt;a href> hyperlink to nameTarget
+ *
+ * @param name
+ * @param text
+ * @return Return name link string
+ */
+ public static String nameLink(String name, String text) {
+ return "<A HREF=\"#" + name + "\">" + text + "</A>";
+ }
+
+ /**
+ * Create &lt;a href> hyperlink to nameTarget using name as hyperlink tag and display text
+ *
+ * @param name
+ * @return Return name link string
+ */
+ public static String nameLink(String name) {
+ return "<A HREF=\"#" + name + "\">" + name + "</A>";
+ }
+
+ public static String simpleTable(String str) {
+ return simpleTable(str, 100);
+ }
+
+ /**
+ * Create a table with one row/colum containing str
+ *
+ * @param str
+ * @param width
+ * @return return simple table string
+ */
+ public static String simpleTable(String str, int width) {
+ return new String(
+ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\">" + "<tr><td>" + str + "</td></tr>" + "</table>");
+ }
+
+ /**
+ * Create a table with one row/colum containing str
+ *
+ * @param str
+ * @param width
+ * @param bgcolor
+ * @return Return border table string
+ */
+ public static String borderTable(String str, int width, String bgcolor, String caption) {
+ return startBorderTable(width, bgcolor, caption) + str + endBorderTable();
+ }
+
+ public static String startBorderTable(int width, String bgcolor, String caption) {
+ String capStr = "";
+ if (!caption.equals("")) capStr = "<caption ALIGN=top>" + caption + "</caption>";
+ return "<table border=\"1\" align=\"center\" bgcolor=\"" + bgcolor + "\" cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\">" + capStr + "<tr><td>";
+ }
+
+ public static String endBorderTable() {
+ return "</td></tr></table>";
+ }
+
+ /**
+ * Create a table with one row multi column containing str[]
+ *
+ * @param str = array of strings for columns
+ * @return Return multi-column table string
+ */
+ public static String multiColumnTable(String[] str) {
+ return multiColumnTable(str, 85);
+ }
+
+ /**
+ * Create a table with one row multi column containing str[]
+ *
+ * @param str - array of strings for columns
+ * @param width - percent (1..100) of screen for table
+ * @return Return multi-column table string
+ */
+ public static String multiColumnTable(String[] str, int width) {
+ String s = "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\"><tr>";
+ for (int i = 0; i < str.length; i++) {
+ s += "<td>" + str[i] + "</td>";
+ }
+ s += "</tr></table>";
+ return s;
+ }
+
+ public static String beginMultiColumnTable(int width) {
+ return beginMultiColumnTable(width, 0);
+ }
+
+ public static String beginMultiColumnTable(int width, int border) {
+ return beginMultiColumnTable(width, border, null);
+ }
+
+ public static String beginMultiColumnTable(int width, int border, Integer color) {
+ return "<table border=\"" + border + "\" " + (color != null ? "color=\"" + color + "\"" : "") + " cellpadding=\"3\" cellspacing=\"0\" width=\"" + width + "%\">";
+ }
+
+ public static String endMultiColumnTable() {
+ return "</table>";
+ }
+
+ public static String addRowMultiColumnTable(String... str) {
+ return addRowMultiColumnTable(str, null, null);
+ }
+
+ public static String addRowMultiColumnTable(String[] str, String[] colOptions) {
+ return addRowMultiColumnTable(str, colOptions, null);
+ }
+
+ public static String addRowMultiColumnTable(String[] str, String[] colOptions, String backgroundColor) {
+ String s = "<tr>";
+ if (backgroundColor != null) s = "<tr bgcolor=\"" + backgroundColor + "\">";
+ String show = "";
+ for (int i = 0; i < str.length; i++) {
+ show = str[i];
+ if (show == null || show.equals("")) show = AHTML.addSpace(1);
+ String colOptionStr = "";
+ if (colOptions != null) colOptionStr = colOptions[i];
+ s += "<td" + ((colOptionStr != null && !colOptionStr.equals("")) ? colOptionStr : "") + ">" + show + "</td>";
+ }
+ s += "</tr>";
+ return s;
+ }
+
+ public static String addRowSpanMultiColumnTable(String str, int span) {
+ return "<tr><td colspan=" + span + ">" + str + "</td></tr>";
+ }
+
+ public static class CellItem {
+ String text;
+ private final String fgColor;
+ private final String bgColor;
+
+ public CellItem(String text) {
+ this(text, null, null);
+ }
+
+ public CellItem(String text, String fgColor, String bgColor) {
+ this.text = text;
+ this.fgColor = fgColor;
+ this.bgColor = bgColor;
+ }
+ }
+
+ public static String addRowMultiColumnTable(Collection<CellItem> items) {
+ String s = "<tr>";
+ for (CellItem item : items) {
+ if (item.text == null || item.text.equals("")) item.text = ".";
+ if (item.fgColor != null && item.bgColor != null)
+ s += "<td bgcolor=\"" + item.bgColor + "\">" + AHTML.color(item.fgColor, item.text) + "</td>";
+ else if (item.bgColor != null)
+ s += "<td bgcolor=\"" + item.bgColor + "\">" + item.text + "</td>";
+ else if (item.fgColor != null)
+ s += "<td>" + AHTML.color(item.fgColor, item.text) + "</td>";
+ else
+ s += "<td>" + item.text + "</td>";
+ }
+ s += "</tr>";
+ return s;
+ }
+
+ public static String addHeaderRowMultiColumnTable(String[] str) {
+ return addHeaderRowMultiColumnTable(str, null);
+ }
+
+ public static String addHeaderRowMultiColumnTable(String[] str, Integer width[]) {
+ String s = "<tr>";
+ String widthStr = "";
+ for (int i = 0; i < str.length; i++) {
+ if (width != null) widthStr = " width =\"" + width[i] + "\"";
+ s += "<th" + widthStr + ">" + str[i] + "</th>";
+ }
+ s += "</tr>";
+ return s;
+ }
+
+ public static String addSimpleTableRow(String str) {
+ String s = "<tr><td>" + str + "</td></tr>";
+ return s;
+ }
+
+ public static String beginSimpleTable() {
+ return new String("<table border=\"0\" cellpadding=\"10\" cellspacing=\"0\" width=\"100%\">");
+ }
+
+ public static String beginSimpleTable(int border, int width) {
+ return new String("<table border=\"" + border + "\" cellpadding=\"10\" cellspacing=\"0\" width=\"+width+%\">");
+ }
+
+ public static String endSimpleTable() {
+ return new String("</table>");
+ }
+
+ public static String createTable(List<String> datas, String[] headers, int numColumns, int cellPadding, int border) {
+ StringBuilder table = new StringBuilder(begin);
+
+ if (datas == null) {
+ throw new IllegalArgumentException("The data can not be null");
+ }
+ if (datas.size() % numColumns != 0) {
+ throw new IllegalArgumentException(
+ "The table could not be created becuase the data does not match the column size");
+ }
+ if (border > 0) {
+ table.append("border=\"" + border + "\"");
+ }
+ if (cellPadding > 0) {
+ table.append("cellpadding=\"" + cellPadding + "\"");
+ }
+ table.append(">");
+
+ if (headers != null && headers.length == numColumns) {
+ table.append("<tr>");
+ for (String header : headers) {
+ table.append("<th>" + header + "</th>");
+ }
+ table.append("</tr>");
+ }
+
+ int colIndex = 0;
+ for (String data : datas) {
+
+ if (colIndex == 0) {
+ table.append("<tr>");
+ }
+ table.append("<td>" + data + "</td>");
+ colIndex++;
+
+ if (colIndex == numColumns) {
+ table.append("</tr>");
+ colIndex = 0;
+ }
+ }
+ return table.toString();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AXml.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AXml.java
new file mode 100644
index 00000000000..fca42216f93
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/AXml.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AXml {
+
+ public static String getRootTag(String xmlStr) {
+ Matcher m;
+ m = Pattern.compile("^[\r\n \t]*<.*?>[\r\n \t]*<(.*?)>", Pattern.MULTILINE | Pattern.DOTALL).matcher(xmlStr);
+ if (m.find()) {
+ return m.group(1);
+ }
+ return "";
+ }
+
+ /**
+ * Returns <elementName>data</elementName> NOTE: data is not sent through AXml.textToXml
+ *
+ * @param elementName
+ * @param data
+ * @return String <elementName>data</elementName>
+ */
+ public static String addTagData(String elementName, String data) {
+ return addTagData(elementName, data, false);
+ }
+
+ public static String addTagData(String elementName, String data, boolean newLine) {
+ String str = "<" + elementName + ">" + data + "</" + elementName + ">";
+ if (newLine)
+ return str + "\n";
+ else
+ return str;
+ }
+
+ /**
+ * Parse <xmlRoot name="this.is.name" value="this.is.value"> and return name, value
+ *
+ * @param xmlRoot xml tag name
+ * @param xmlStr string containing xml
+ * @return String[]{name, value}
+ */
+ public static String[] getNameValue(String xmlRoot, String xmlStr) {
+ String[] strs = new String[] {"", ""};
+ Matcher m;
+ m =
+ Pattern.compile("<" + xmlRoot + " name=\"(.*?)\" value=\"(.*?)\" />", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xmlStr);
+ if (m.find()) {
+ strs[0] = m.group(1);
+ strs[1] = m.group(2);
+ }
+ return strs;
+ }
+
+ public static String getNameValueXml(String xmlRoot, String name, String value) {
+ return String.format("<%s name=\"%s\" value=\"%s\"/>", xmlRoot, name, value);
+ }
+
+ public static String[] getTagDataArray(String xmlStr, String xmlRoot) {
+ Vector<String> v = new Vector<String>();
+ Matcher m;
+ m =
+ Pattern.compile("<" + xmlRoot + ">(.*?)</" + xmlRoot + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xmlStr);
+ while (m.find()) {
+ v.add(xmlToText(m.group(1)));
+ }
+ return v.toArray(new String[v.size()]);
+ }
+
+ /**
+ * Returns data between <xmlRoot> and </xmlRoot> from xmlStr
+ *
+ * @param xmlStr
+ * @param xmlRoot
+ * @return Return tag string
+ */
+ public static String getTagData(String xmlStr, String xmlRoot) {
+ String tags[] = getTagDataArray(xmlStr, xmlRoot);
+ if (tags.length > 0) {
+ return tags[0];
+ }
+ return "";
+ }
+
+ public static int getTagIntData(String xmlStr, String xmlRoot) {
+ String tags[] = getTagDataArray(xmlStr, xmlRoot);
+ if (tags.length > 0) {
+ String intStr = tags[0];
+ return (new Integer(intStr)).intValue();
+ }
+ return 0;
+ }
+
+ public static Boolean getTagBooleanData(String xmlStr, String xmlRoot) {
+ String tags[] = getTagDataArray(xmlStr, xmlRoot);
+ if (tags.length > 0) {
+ String intStr = tags[0];
+ return (intStr.equals("true") ? true : false);
+ }
+ return false;
+ }
+
+ /**
+ * Given text strings containing xml reserved characters, replace with valid xml representation characters > => & gt;
+ * < => & lt; & => & amp; ' => & apos; " => & quot;
+ *
+ * @param text text to be converted to valid XML representation characters
+ * @return String valid xml string
+ */
+ public static String textToXml(String text) {
+ if (text == null || text.equals("")) return "";
+ String str = new String(text);
+ str = str.replaceAll("&", "&amp;");
+ str = str.replaceAll(">", "&gt;");
+ str = str.replaceAll("<", "&lt;");
+ str = str.replaceAll("'", "&apos;");
+ str = str.replaceAll("\"", "&quot;");
+ return str;
+ }
+
+ /**
+ * Given xml strings containing xml reserved characters, replace with displayable characters > <= & gt; < <= & lt; &
+ * <= & amp; ' <= & apos; " <= & quot;
+ *
+ * @param xml
+ * @return displayable string
+ */
+ public static String xmlToText(String xml) {
+ if (xml == null || xml.equals("")) return "";
+ String str = new String(xml);
+ str = str.replaceAll("&gt;", ">");
+ str = str.replaceAll("&lt;", "<");
+ str = str.replaceAll("&apos;", "'");
+ str = str.replaceAll("&quot;", "\"");
+ str = str.replaceAll("&amp;", "&");
+ return str;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ByteUtil.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ByteUtil.java
new file mode 100644
index 00000000000..60fed31feb1
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ByteUtil.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.io.PrintStream;
+import java.nio.ByteBuffer;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ByteUtil {
+
+ public static void printBinary(byte[] data, int bytesPerGroup, int groupPerLine, PrintStream out) {
+ int groups = 0;
+ for (int i = 0; i < data.length; i++) {
+ out.print(ByteUtil.toBinaryString(data[i]));
+ if ((i + 1) % bytesPerGroup == 0) {
+ out.print(" ");
+ groups++;
+ if ((groups) % groupPerLine == 0) {
+ out.println();
+ }
+ }
+ }
+ }
+
+ public static void printHex(byte[] data, int bytesPerGroup, int groupPerLine, PrintStream out) {
+ int groups = 0;
+ for (int i = 0; i < data.length; i++) {
+ out.print(ByteUtil.toHexString(data[i]));
+ if ((i + 1) % bytesPerGroup == 0) {
+ out.print(" ");
+ groups++;
+ if ((groups) % groupPerLine == 0) {
+ out.println();
+ }
+ }
+ }
+ }
+
+ public static void printHex(byte[] data, int bytesPerGroup, int groupPerLine, StringBuilder strBuilder) {
+ int groups = 0;
+ for (int i = 0; i < data.length; i++) {
+ strBuilder.append(ByteUtil.toHexString(data[i]));
+ if ((i + 1) % bytesPerGroup == 0) {
+ strBuilder.append(" ");
+ groups++;
+ }
+ }
+ }
+
+ public static void printHex(byte[] data, int bytesPerGroup, int groupPerLine, boolean isSpaced, StringBuilder strBuilder) {
+ int groups = 0;
+ for (int i = 0; i < data.length; i++) {
+ strBuilder.append(ByteUtil.toHexString(data[i]));
+ if ((i + 1) % bytesPerGroup == 0 && isSpaced) {
+ strBuilder.append(" ");
+ groups++;
+ }
+ }
+ }
+
+ /**
+ * NOTE the SDK supplies a Integer.toBinaryString but it is not formatted to a standard number of chars so it was not
+ * a good option.
+ *
+ * @param b
+ * @return String
+ */
+ public static String toBinaryString(byte b) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(((b >> 7) & 0x01));
+ sb.append(((b >> 6) & 0x01));
+ sb.append(((b >> 5) & 0x01));
+ sb.append(((b >> 4) & 0x01));
+ sb.append(((b >> 3) & 0x01));
+ sb.append(((b >> 2) & 0x01));
+ sb.append(((b >> 1) & 0x01));
+ sb.append((b & 0x01));
+ return sb.toString();
+ }
+
+ public static byte[] toBytes(long n) {
+ byte[] bytes = new byte[8];
+ toBytes(bytes, 0, n);
+ return bytes;
+ }
+
+ public static void toBytes(byte[] bytes, int startPos, long n) {
+ for (int i = startPos + 7; i >= startPos; i--) {
+ bytes[i] = (byte) (n);
+ n >>>= 8;
+ }
+ }
+
+ public static void toBytes(byte[] bytes, int startPos, int n) {
+ for (int i = startPos + 3; i >= startPos; i--) {
+ bytes[i] = (byte) (n);
+ n >>>= 8;
+ }
+ }
+
+ public static String toHexString(byte b) {
+ String temp = Integer.toHexString(b);
+ if (temp.length() >= 2)
+ return temp.substring(temp.length() - 2).toUpperCase();
+ else
+ return "0" + temp.substring(0).toUpperCase();
+ }
+
+ /**
+ * Build a long from first 8 bytes of the array.
+ *
+ * @param b The byte[] to convert.
+ * @return A long.
+ */
+ public static long toLong(byte[] b) {
+ if (b.length != 8) {
+ throw new IllegalArgumentException();
+ }
+
+ return ((((long) b[7]) & 0xFF) + ((((long) b[6]) & 0xFF) << 8) + ((((long) b[5]) & 0xFF) << 16) + ((((long) b[4]) & 0xFF) << 24) + ((((long) b[3]) & 0xFF) << 32) + ((((long) b[2]) & 0xFF) << 40) + ((((long) b[1]) & 0xFF) << 48) + ((((long) b[0]) & 0xFF) << 56));
+ }
+
+ /**
+ *
+ */
+ public ByteUtil() {
+ super();
+ }
+
+ /**
+ * writes message data to a buffer in hex format
+ *
+ * @param data
+ * @param offset
+ */
+ public static void printByteDump(StringBuilder strBuilder, byte[] data, int offset, int length, int columnNum) {
+ printByteDump(strBuilder, data, offset, length, columnNum, true);
+ }
+
+ /**
+ * writes message data to a buffer in hex format
+ *
+ * @param data
+ * @param offset
+ */
+ public static void printByteDump(StringBuilder strBuilder, byte[] data, int offset, int length, int columnNum, boolean hex) {
+ int columnCount = 0;
+ final int endIndex = offset + length;
+ for (int i = offset; i < endIndex; i++) {
+ if (columnCount == columnNum) {
+ strBuilder.append('\n');
+ columnCount = 0;
+ }
+ if (hex) {
+ strBuilder.append(String.format("%02x ", data[i]));
+ } else {
+
+ strBuilder.append(data[i]).append(' ');
+ }
+ columnCount++;
+ }
+ strBuilder.append('\n');
+ }
+
+ public static void printByteDump(StringBuilder strBuilder, ByteBuffer data, int offset, int length, int columnNum) {
+ int currentPosition = data.position();
+ // data.position(offset);
+ int columnCount = 0;
+ final int endIndex = offset + length;
+ for (int i = offset; i < endIndex; i++) {
+ if (columnCount == columnNum) {
+ strBuilder.append('\n');
+ columnCount = 0;
+ }
+ strBuilder.append(String.format("%02x ", data.get(i)));
+ columnCount++;
+ }
+ strBuilder.append('\n');
+
+ data.position(currentPosition);
+ }
+
+ public static void main(String[] args) {
+ System.out.println(ByteUtil.toHexString((byte) 128));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ChecksumUtil.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ChecksumUtil.java
new file mode 100644
index 00000000000..58da312222e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ChecksumUtil.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.framework.jdk.core.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class ChecksumUtil {
+
+ public static final String MD5 = "MD5";
+ public static final String SHA = "SHA";
+
+ private static final byte[] HEX_CHAR_TABLE =
+ {(byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
+ (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f'};
+
+ private ChecksumUtil() {
+ }
+
+ private static String getHexString(byte[] rawData) throws UnsupportedEncodingException {
+ byte[] hex = new byte[2 * rawData.length];
+ int index = 0;
+
+ for (byte b : rawData) {
+ int v = b & 0xFF;
+ hex[index++] = HEX_CHAR_TABLE[v >>> 4];
+ hex[index++] = HEX_CHAR_TABLE[v & 0xF];
+ }
+ return new String(hex, "ASCII");
+ }
+
+ public static String createChecksumAsString(InputStream inputStream, String algorithm) throws Exception {
+ return getHexString(createChecksum(inputStream, algorithm));
+ }
+
+ public static byte[] createChecksum(InputStream inputStream, String algorithm) throws IOException, NoSuchAlgorithmException {
+ MessageDigest checksum = MessageDigest.getInstance(algorithm);
+ byte[] buffer = new byte[1024];
+ int numRead = -1;
+ while ((numRead = inputStream.read(buffer)) != -1) {
+ checksum.update(buffer, 0, numRead);
+ }
+ return checksum.digest();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/CmdLineArgs.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/CmdLineArgs.java
new file mode 100644
index 00000000000..3b73e2ffaf0
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/CmdLineArgs.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.framework.jdk.core.util;
+
+import java.util.HashMap;
+
+public class CmdLineArgs {
+
+ private HashMap<String, String> cmdArgs;
+
+ public CmdLineArgs(String[] args) {
+ cmdArgs = new HashMap<String, String>();
+
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].matches("-\\w.*")) {
+ if ((i + 1 < args.length) && (!args[i + 1].matches("-\\D.*"))) {
+ cmdArgs.put(args[i], args[i + 1]);
+ i++;
+ } else {
+ cmdArgs.put(args[i], null);
+ }
+ } else {
+ cmdArgs.put(args[i], null);
+ }
+ }
+ }
+
+ public String get(String key) {
+ return cmdArgs.get(key);
+ }
+
+ public HashMap<String, String> getArgs() {
+ return cmdArgs;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Collections.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Collections.java
new file mode 100644
index 00000000000..d6236800106
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Collections.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author David Diepenbrock
+ */
+public class Collections {
+
+ public static Collection<String> fromString(String string, String seperator) {
+ return Arrays.asList(string.split(seperator));
+ }
+
+ /**
+ * An flexible alternative for converting a Collection to a String.
+ *
+ * @param c The Collection to convert to a String
+ * @param start The String to place at the beginning of the returned String
+ * @param separator The String to place in between elements of the Collection c.
+ * @param end The String to place at the end of the returned String
+ * @return A String which starts with 'start', followed by the elements in the Collection c separated by 'separator',
+ * ending with 'end'.
+ */
+ @SuppressWarnings("unchecked")
+ public static String toString(Collection c, String start, String separator, String end) {
+ Iterator i = c.iterator();
+ StringBuilder myString = new StringBuilder();
+
+ if (start != null) myString.append(start);
+
+ boolean first = true;
+ while (i.hasNext()) {
+ if (!first) myString.append(separator);
+ myString.append(i.next().toString());
+ first = false;
+ }
+
+ if (end != null) myString.append(end);
+
+ return myString.toString();
+ }
+
+ public static String toString(String separator, Object... objects) {
+ Collection<Object> objectsCol = new ArrayList<Object>(objects.length);
+ for (Object obj : objects)
+ objectsCol.add(obj);
+ return toString(objectsCol, null, separator, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static String toString(String separator, Collection c) {
+ return toString(c, null, separator, null);
+ }
+
+ /**
+ * The resultant set is those elements in superSet which are not in the subSet
+ *
+ * @param superSet
+ * @param subList
+ * @return Return complement list reference
+ */
+ public static <T> List<T> setComplement(Collection<T> superSet, Collection<T> subList) {
+ ArrayList<T> complement = new ArrayList<T>(superSet.size());
+ for (T obj : superSet) {
+ if (!subList.contains(obj)) {
+ complement.add(obj);
+ }
+ }
+ return complement;
+ }
+
+ /**
+ * @param listA
+ * @param listB
+ * @return The intersection of two sets A and B is the set of elements common to A and B
+ */
+ public static <T> ArrayList<T> setIntersection(Collection<T> listA, Collection<T> listB) {
+ ArrayList<T> intersection = new ArrayList<T>(listA.size());
+
+ for (T obj : listA) {
+ if (listB.contains(obj)) {
+ intersection.add(obj);
+ }
+ }
+ return intersection;
+ }
+
+ /**
+ * Returns the unique union of the given lists
+ *
+ * @param <T>
+ * @param lists
+ * @return Set
+ */
+ public static <T> Set<T> setUnion(Collection<T>... lists) {
+ Set<T> union = new HashSet<T>(lists[0].size() * 2);
+
+ for (int x = 0; x < lists.length; x++) {
+ union.addAll(lists[x]);
+ }
+ return union;
+ }
+
+ /**
+ * Return true if same objects exist in listA and listB
+ *
+ * @param <T>
+ * @param listA
+ * @param listB
+ * @return boolean
+ */
+ public static <T> boolean isEqual(Collection<T> listA, Collection<T> listB) {
+ if (listA.size() != listB.size()) return false;
+ if (listA.size() != setIntersection(listA, listB).size()) return false;
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static Set toSet(Collection collection) {
+ Set set = null;
+ if (collection instanceof Set) {
+ set = (Set) collection;
+ } else {
+ set = new LinkedHashSet();
+ set.addAll(collection);
+ }
+ return set;
+ }
+
+ /**
+ * Convert an aggregate list of objects into a List
+ *
+ * @param <T>
+ * @param objects
+ * @return list
+ */
+ public static <T> List<T> getAggregate(T... objects) {
+ List<T> objs = new ArrayList<T>();
+ if (objects != null) {
+ for (T obj : objects) {
+ objs.add(obj);
+ }
+ }
+ return objs;
+ }
+
+ public static List<Object> getAggregateTree(List<Object> items, int maxPerList) {
+ if (items == null) throw new IllegalArgumentException("items can not be null");
+ if (maxPerList < 2) throw new IllegalArgumentException("maxPerList can not be less than 2");
+
+ if (items.size() > maxPerList) {
+ return (recursiveAggregateTree(items, maxPerList));
+ } else {
+ return new ArrayList<Object>(items);
+ }
+ }
+
+ private static ArrayList<Object> recursiveAggregateTree(List<Object> items, int maxPerList) {
+ if (items.size() > maxPerList) {
+ ArrayList<Object> aggregateList = new ArrayList<Object>(maxPerList);
+ ArrayList<Object> childList = null;
+
+ for (Object item : items) {
+ if (childList == null || childList.size() == maxPerList) {
+ childList = new ArrayList<Object>(maxPerList);
+ aggregateList.add(childList);
+ }
+ childList.add(item);
+ }
+ childList.trimToSize();
+
+ aggregateList = recursiveAggregateTree(aggregateList, maxPerList);
+
+ aggregateList.trimToSize();
+
+ return aggregateList;
+ } else {
+ // This is a safe blind cast since only subsequent calls of this method will end up here
+ // and this method always uses ArrayList<Object>
+ return (ArrayList<Object>) items;
+ }
+ }
+
+ public static enum CastOption {
+ MATCHING, ALL
+ };
+
+ /**
+ * Cast objects to clazz
+ *
+ * @param <A>
+ * @param objects
+ * @param clazz
+ * @param castOption if ALL, cast all and throw exception if cast fails; if MATCHING, only cast those of type clazz
+ * @return
+ */
+ private static <A extends Object> List<A> cast(Class<A> clazz, Collection<? extends Object> objects, CastOption castOption) {
+ List<A> results = new ArrayList<A>(objects.size());
+ for (Object object : objects)
+ if ((castOption == CastOption.ALL) || ((castOption == CastOption.MATCHING) && (object.getClass().isAssignableFrom(clazz)))) {
+ results.add((A) object);
+ }
+ return results;
+ }
+
+ /**
+ * Cast objects to clazz
+ *
+ * @param <A>
+ * @param objects
+ * @return List
+ */
+ public static <A> List<A> castAll(Collection<?> objects) {
+ List<A> results = new ArrayList<A>(objects.size());
+ for (Object object : objects) {
+ results.add((A) object);
+ }
+ return results;
+ }
+
+ /**
+ * Unchecked cast objects to clazz; CastClassException will occur when object sent in does not match clazz<br>
+ * <br>
+ * Use when all objects are expected to be of type class and exception is desired if not
+ *
+ * @param <A>
+ * @param objects
+ * @param clazz
+ * @return List
+ */
+ public static <A extends Object> List<A> castAll(Class<A> clazz, Collection<? extends Object> objects) {
+ return cast(clazz, objects, CastOption.ALL);
+ }
+
+ /**
+ * Cast objects matching class, ignore rest; no ClassCastException will occur<br>
+ * <br>
+ * Use when objects may contain classes that are not desired
+ *
+ * @param <A>
+ * @param objects
+ * @param clazz
+ * @return List
+ */
+ public static <A extends Object> List<A> castMatching(Class<A> clazz, Collection<? extends Object> objects) {
+ return cast(clazz, objects, CastOption.MATCHING);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnhancedProperties.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnhancedProperties.java
new file mode 100644
index 00000000000..be2e1943564
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnhancedProperties.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.framework.jdk.core.util;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class EnhancedProperties implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 4105281128024379352L;
+
+ private final HashMap<String, Serializable> map;
+
+ public EnhancedProperties() {
+ map = new HashMap<String, Serializable>();
+ }
+
+ public EnhancedProperties(int initialCapacity) {
+ map = new HashMap<String, Serializable>(initialCapacity);
+ }
+
+ public EnhancedProperties(EnhancedProperties props) {
+ this();
+ addAll(props);
+ }
+
+ public void setProperty(String key, Serializable value) {
+ map.put(key, value);
+ }
+
+ public Serializable getProperty(String key) {
+ return map.get(key);
+ }
+
+ public Serializable getProperty(String key, Serializable defaultValue) {
+ Serializable value = map.get(key);
+ return value == null ? defaultValue : value;
+ }
+
+ public Set<Map.Entry<String, Serializable>> entrySet() {
+ return map.entrySet();
+ }
+
+ public void addAll(EnhancedProperties otherProps) {
+ this.map.putAll(otherProps.map);
+ }
+
+ public void addAll(Map<String, Serializable> otherMap) {
+ this.map.putAll(otherMap);
+ }
+
+ public void clear() {
+ map.clear();
+ }
+
+ public Collection<String> differences(EnhancedProperties otherProps) {
+ LinkedList<String> differences = new LinkedList<String>();
+ for (Entry<String, Serializable> entry : map.entrySet()) {
+ Serializable value = otherProps.getProperty(entry.getKey());
+ if (value == null) {
+ if (entry.getValue() != null) {
+ differences.add(entry.getKey());
+ }
+ } else {
+ if (!value.equals(entry.getValue())) {
+ differences.add(entry.getKey());
+ }
+ }
+ }
+ map.clear();
+ map.putAll(otherProps.map);
+ return differences;
+ }
+
+ public Map<String, Serializable> asMap() {
+ return map;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnumBase.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnumBase.java
new file mode 100644
index 00000000000..b2efab52a0e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/EnumBase.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.framework.jdk.core.util;
+
+import javax.print.attribute.EnumSyntax;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class EnumBase extends EnumSyntax {
+ //TODO We need to possibly refactor getEnum and rework the structure of the enums???
+
+ protected abstract String[] getStringTable();
+
+ protected abstract EnumSyntax[] getEnumValueTable();
+
+ protected EnumBase(int value) {
+
+ super(value);
+ }
+
+ protected static EnumBase getEnum(String str, String[] stringTable, EnumBase[] enumValueTable) {
+
+ for (int i = 0; i < stringTable.length; i++) {
+ if (stringTable[i].toUpperCase().equals(str.toUpperCase())) return enumValueTable[i];
+ }
+
+ throw new IllegalArgumentException("Not a valid enumeration name: " + str);
+ // TODO - We might want to come back and make this more efficient later!!!
+ // This was a binary search, but was changed because it was forcing the tables to have to be
+ // in the correct binary search order to work.
+
+ }
+
+ protected static EnumBase getEnum(int value, EnumBase[] enumValueTable) {
+
+ return enumValueTable[value - enumValueTable[0].getValue()];
+ }
+
+ protected int getOffset() {
+
+ return getEnumValueTable()[0].getValue();
+ }
+
+ public String getName() {
+
+ return getStringTable()[getValue() - getOffset()];
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Enums.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Enums.java
new file mode 100644
index 00000000000..341aeeeb36e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Enums.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.framework.jdk.core.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Enums {
+
+ public static String getCommaDeliminatedString(Enum<?>[] enums) {
+ StringBuffer sb = new StringBuffer();
+ for (Enum<?> e : enums)
+ sb.append(e.name() + ",");
+ return sb.toString().replaceFirst(",$", "");
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUID.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUID.java
new file mode 100644
index 00000000000..e3ef714b8a1
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUID.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.framework.jdk.core.util;
+
+import java.io.Serializable;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import sun.misc.CharacterEncoder;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public class GUID implements Serializable {
+ private final long time;
+ private final int hash;
+ private final int rand;
+ private final String guidString;
+ private static final long serialVersionUID = -3849714490764637010L;
+
+ private static final ThreadLocal<byte[]> threadLocalBytes = new ThreadLocal<byte[]>() {
+ protected synchronized byte[] initialValue() {
+ return new byte[16];
+ }
+ };
+
+ private static final ThreadLocal<CharacterEncoder> threadLocalEncoder = new ThreadLocal<CharacterEncoder>() {
+ protected synchronized CharacterEncoder initialValue() {
+ return new sun.misc.BASE64Encoder();
+ }
+ };
+
+ public static boolean isValid(String guid) {
+ if (guid.length() != 22) {
+ return false;
+ }
+ Matcher m = Pattern.compile("^[0-9A-Za-z\\+_]+$").matcher(guid);
+ if (!m.find()) {
+ return false;
+ }
+ return true;
+ }
+
+ public GUID() {
+ this(GUIDType.ARTIFACT);
+ }
+
+ public GUID(GUIDType type) {
+ this.time = System.currentTimeMillis();
+ this.hash = Thread.currentThread().hashCode();
+ this.rand = (int) (Math.random() * Integer.MAX_VALUE);
+
+ this.guidString = toGuidString(time, hash, rand, type);
+ }
+
+ public static String generateGuidStr() {
+ return generateGuidStr(GUIDType.ARTIFACT);
+ }
+
+ public static String generateGuidStr(GUIDType type) {
+ long time = System.currentTimeMillis();
+ int hash = Thread.currentThread().hashCode();
+ int rand = (int) (Math.random() * Integer.MAX_VALUE);
+ return toGuidString(time, hash, rand, type);
+ }
+
+ private static String toGuidString(long time, int hash, int rand, GUIDType type) {
+ byte[] rawBytes = (byte[]) threadLocalBytes.get();
+ ByteUtil.toBytes(rawBytes, 0, time);
+ ByteUtil.toBytes(rawBytes, 8, hash);
+ ByteUtil.toBytes(rawBytes, 12, rand);
+
+ CharacterEncoder base64Encoder = (CharacterEncoder) threadLocalEncoder.get();
+ /*
+ * 64 = 2^6 64^22 > 2^128 (2^6)^22 > 2^128 2^132 > 2^128 thus a 22 digit base64 number is
+ * needed to represent a 16 byte number
+ */
+ return type + base64Encoder.encode(rawBytes).replace('/', '_').substring(1, 22);
+ }
+
+ public boolean equals(Object other) {
+
+ if (other instanceof GUID) {
+ return this.time == ((GUID) other).time && this.hash == ((GUID) other).hash && this.rand == ((GUID) other).rand;
+ }
+
+ return false;
+ }
+
+ public int hashCode() {
+ int result = 17;
+ result = result + (int) (time ^ (time >>> 32));
+ result = 37 * result + hash;
+ result = 37 * result + rand;
+ return result;
+ }
+
+ public String toString() {
+ return guidString;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUIDType.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUIDType.java
new file mode 100644
index 00000000000..5951d2ef84e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/GUIDType.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.framework.jdk.core.util;
+
+/**
+ * @author Robert A. Fisher
+ */
+public enum GUIDType {
+ ARTIFACT("A"), ARTIFACT_VERSION("B");
+
+ private final String prefixChar;
+
+ private GUIDType(String prefixChar) {
+ this.prefixChar = prefixChar;
+ }
+
+ public String toString() {
+ return prefixChar;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HtmlReservedCharacters.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HtmlReservedCharacters.java
new file mode 100644
index 00000000000..697df2e7897
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HtmlReservedCharacters.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * <pre>
+ * Character Entity Name Description
+ * &quot; &amp;quot; quotation mark
+ * ' &amp;apos; apostrophe
+ * &amp; &amp;amp; ampersand
+ * &lt; &amp;lt; less-than
+ * &gt; &amp;gt; greater-than
+ *
+ * ISO 8859-1 Symbols
+ * Character Entity Name Description
+ * &amp;nbsp; non-breaking space
+ * ¡ &amp;iexcl inverted exclamation mark
+ * ¢ &amp;cent cent
+ * £ &amp;pound pound
+ * ¤ &amp;curren currency
+ * ¥ &amp;yen yen
+ * ¦ &amp;brvbar broken vertical bar
+ * § &amp;sect section
+ * ¨ &amp;uml spacing diaeresis
+ * © &amp;copy copyright
+ * ª &amp;ordf feminine ordinal indicator
+ * « &amp;laquo angle quotation mark (left)
+ * ¬ &amp;not negation
+ * ­ &amp;shy soft hyphen
+ * ® &amp;reg registered trademark
+ * ¯ &amp;macr spacing macron
+ * ° &amp;deg degree
+ * ± &amp;plusmn plus-or-minus
+ * ² &amp;sup2 superscript 2
+ * ³ &amp;sup3 superscript 3
+ * ´ &amp;acute spacing acute
+ * µ &amp;micro micro
+ * ¶ &amp;para paragraph
+ * · &amp;middot middle dot
+ * ¸ &amp;cedil spacing cedilla
+ * ¹ &amp;sup1 superscript 1
+ * º &amp;ordm masculine ordinal indicator
+ * » &amp;raquo angle quotation mark (right)
+ * ¼ &amp;frac14 fraction 1/4
+ * ½ &amp;frac12 fraction 1/2
+ * ¾ &amp;frac34 fraction 3/4
+ * ¿ &amp;iquest inverted question mark
+ * × &amp;times multiplication
+ * ÷ &amp;divide division
+ * </pre>
+ *
+ * @author Roberto E. Escobar
+ */
+public class HtmlReservedCharacters {
+
+ private static Map<String, Character> reservedCharacters = new HashMap<String, Character>();
+ private static Map<Character, String> charsToEncoding = new HashMap<Character, String>();
+ static {
+ reservedCharacters.put("&quot;", '"');
+ reservedCharacters.put("&apos;", '\'');
+ reservedCharacters.put("&amp;", '&');
+ reservedCharacters.put("&lt;", '<');
+ reservedCharacters.put("&gt;", '>');
+ reservedCharacters.put("&nbsp;", ' ');
+ reservedCharacters.put("&iexcl;", '¡');
+ reservedCharacters.put("&cent;", '¢');
+ reservedCharacters.put("&pound;", '£');
+ reservedCharacters.put("&curren;", '¤');
+ reservedCharacters.put("&yen;", '¥');
+ reservedCharacters.put("&brvbar;", '¦');
+ reservedCharacters.put("&sect;", '§');
+ reservedCharacters.put("&uml;", '¨');
+ reservedCharacters.put("&copy;", '©');
+ reservedCharacters.put("&ordf;", 'ª');
+ reservedCharacters.put("&laquo;", '«');
+ reservedCharacters.put("&not;", '¬');
+ reservedCharacters.put("&shy;", '­');
+ reservedCharacters.put("&reg;", '®');
+ reservedCharacters.put("&macr;", '¯');
+ reservedCharacters.put("&deg;", '°');
+ reservedCharacters.put("&plusmn;", '±');
+ reservedCharacters.put("&sup2;", '²');
+ reservedCharacters.put("&sup3;", '³');
+ reservedCharacters.put("&acute;", '´');
+ reservedCharacters.put("&micro;", 'µ');
+ reservedCharacters.put("&para;", '¶');
+ reservedCharacters.put("&middot;", '·');
+ reservedCharacters.put("&cedil;", '¸');
+ reservedCharacters.put("&sup1;", '¹');
+ reservedCharacters.put("&ordm;", 'º');
+ reservedCharacters.put("&raquo;", '»');
+ reservedCharacters.put("&frac14;", '¼');
+ reservedCharacters.put("&frac12;", '½');
+ reservedCharacters.put("&frac34;", '¾');
+ reservedCharacters.put("&iquest;", '¿');
+ reservedCharacters.put("&times;", '×');
+ reservedCharacters.put("&divide;", '÷');
+
+ for (Entry<String, Character> entry : reservedCharacters.entrySet()) {
+ charsToEncoding.put(entry.getValue(), entry.getKey());
+ }
+ }
+
+ private HtmlReservedCharacters() {
+
+ }
+
+ public static String encode(String original) {
+ StringBuilder encodedItem = new StringBuilder();
+ for (int index = 0; index < original.length(); index++) {
+ char item = original.charAt(index);
+ String encode = charsToEncoding.get(item);
+ if (encode != null) {
+ encodedItem.append(encode);
+ } else {
+ encodedItem.append(item);
+ }
+ }
+ return encodedItem.toString();
+ }
+
+ public static Character toCharacter(String word) {
+ Character toReturn = null;
+ if (Strings.isValid(word)) {
+ word = word.trim();
+ toReturn = reservedCharacters.get(word);
+ }
+ return toReturn;
+ }
+
+ public static Collection<Character> getChars() {
+ return reservedCharacters.values();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpProcessor.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpProcessor.java
new file mode 100644
index 00000000000..5bebbcfaf5e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpProcessor.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URL;
+import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpProcessor {
+ private static final String CONTENT_TYPE = "content-type";
+ private static final String CONTENT_ENCODING = "content-encoding";
+
+ private static final HttpProcessor instance = new HttpProcessor();
+
+ private final MultiThreadedHttpConnectionManager connectionManager;
+ private final HttpClient httpClient;
+
+ private HttpProcessor() {
+ connectionManager = new MultiThreadedHttpConnectionManager();
+ httpClient = new HttpClient(connectionManager);
+ }
+
+ private static HttpClient getHttpClient() {
+ return instance.httpClient;
+ }
+
+ public static String acquireString(URL url) throws Exception {
+ ByteArrayOutputStream sourceOutputStream = new ByteArrayOutputStream();
+ try {
+ AcquireResult result = HttpProcessor.acquire(url, sourceOutputStream);
+ if (result.getCode() == HttpURLConnection.HTTP_OK) {
+ return sourceOutputStream.toString();
+ }
+ } finally {
+ sourceOutputStream.close();
+ }
+ return null;
+ }
+
+ public static boolean isAlive(String serverAddress, int port) {
+ boolean result = false;
+ try {
+ String portString = Strings.emptyString();
+ if (port > -1) {
+ portString = String.format(":%s", String.valueOf(port));
+ }
+ URL url = new URL(String.format("http://%s%s", serverAddress, portString));
+ GetMethod method = new GetMethod(url.toString());
+
+ try {
+ HttpMethodParams params = new HttpMethodParams();
+ params.setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));
+ method.setParams(params);
+ int responseCode = getHttpClient().executeMethod(method);
+ if (responseCode == HttpURLConnection.HTTP_NOT_FOUND) {
+ result = true;
+ }
+ } finally {
+ method.releaseConnection();
+ }
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+ return result;
+ }
+
+ public static URI save(URL url, InputStream inputStream, String contentType, String encoding) throws Exception {
+ String locator = put(url, inputStream, contentType, encoding);
+ return new URI(locator);
+ }
+
+ public static String put(URL url, InputStream inputStream, String contentType, String encoding) throws Exception {
+ int statusCode = -1;
+ String response = null;
+ PutMethod method = new PutMethod(url.toString());
+
+ InputStream responseInputStream = null;
+ try {
+ method.setRequestHeader(CONTENT_ENCODING, encoding);
+ method.setRequestEntity(new InputStreamRequestEntity(inputStream, contentType));
+
+ method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
+
+ statusCode = getHttpClient().executeMethod(method);
+ if (statusCode != HttpURLConnection.HTTP_CREATED) {
+ throw new Exception(method.getStatusLine().toString());
+ } else {
+ responseInputStream = method.getResponseBodyAsStream();
+ response = Lib.inputStreamToString(responseInputStream);
+ }
+
+ } catch (Exception ex) {
+ throw new IOException(String.format("Error during POST [%s] - status code: [%s]", url, statusCode), ex);
+ } finally {
+ try {
+ if (responseInputStream != null) {
+ responseInputStream.close();
+ }
+ } catch (Exception ex) {
+ // Do Nothing;
+ } finally {
+ method.releaseConnection();
+ }
+ }
+ return response;
+ }
+
+ public static AcquireResult post(URL url, InputStream inputStream, String contentType, String encoding, OutputStream outputStream) throws IOException {
+ AcquireResult result = new AcquireResult();
+ int statusCode = -1;
+
+ PostMethod method = new PostMethod(url.toString());
+
+ InputStream httpInputStream = null;
+ try {
+ method.setRequestHeader(CONTENT_ENCODING, encoding);
+ method.setRequestEntity(new InputStreamRequestEntity(inputStream, contentType));
+
+ method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
+
+ statusCode = getHttpClient().executeMethod(method);
+ if (statusCode != HttpStatus.SC_ACCEPTED) {
+ throw new Exception(method.getStatusLine().toString());
+ } else {
+ httpInputStream = method.getResponseBodyAsStream();
+ result.setContentType(getContentType(method));
+ result.setEncoding(method.getResponseCharSet());
+ Lib.inputStreamToOutputStream(httpInputStream, outputStream);
+ }
+ } catch (Exception ex) {
+ throw new IOException(String.format("Error during POST [%s] - status code: [%s]", url, statusCode), ex);
+ } finally {
+ try {
+ result.setCode(statusCode);
+ if (httpInputStream != null) {
+ httpInputStream.close();
+ }
+ } catch (Exception ex) {
+ // Do Nothing;
+ } finally {
+ method.releaseConnection();
+ }
+ }
+ return result;
+ }
+
+ public static String post(URL url) throws Exception {
+ String response = null;
+ int statusCode = -1;
+
+ PostMethod method = new PostMethod(url.toString());
+
+ InputStream responseInputStream = null;
+ try {
+ method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
+
+ statusCode = getHttpClient().executeMethod(method);
+ if (statusCode != HttpStatus.SC_ACCEPTED) {
+ throw new Exception(method.getStatusLine().toString());
+ } else {
+ responseInputStream = method.getResponseBodyAsStream();
+ response = Lib.inputStreamToString(responseInputStream);
+ }
+ } catch (Exception ex) {
+ throw new Exception(String.format("Error during POST [%s] - status code: [%s]", url, statusCode), ex);
+ } finally {
+ try {
+ if (responseInputStream != null) {
+ responseInputStream.close();
+ }
+ } catch (Exception ex) {
+ // Do Nothing;
+ } finally {
+ method.releaseConnection();
+ }
+ }
+ return response;
+ }
+
+ private static String getContentType(HttpMethodBase method) {
+ String contentType = method.getResponseHeader(CONTENT_TYPE).getValue();
+ if (Strings.isValid(contentType)) {
+ int index = contentType.indexOf(';');
+ if (index > 0) {
+ contentType = contentType.substring(0, index);
+ }
+ }
+ return contentType;
+ }
+
+ public static AcquireResult acquire(URL url, OutputStream outputStream) throws Exception {
+ AcquireResult result = new AcquireResult();
+ int statusCode = -1;
+
+ GetMethod method = new GetMethod(url.toString());
+
+ InputStream inputStream = null;
+ try {
+ method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
+
+ statusCode = getHttpClient().executeMethod(method);
+ if (statusCode == HttpStatus.SC_OK) {
+ inputStream = method.getResponseBodyAsStream();
+ result.setEncoding(method.getResponseCharSet());
+ result.setContentType(getContentType(method));
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ }
+ } catch (Exception ex) {
+ throw new Exception(String.format("Error acquiring resource: [%s] - status code: [%s]", url, statusCode), ex);
+ } finally {
+ try {
+ result.setCode(statusCode);
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (Exception ex) {
+ // Do Nothing;
+ } finally {
+ method.releaseConnection();
+ }
+ }
+ return result;
+ }
+
+ public static String delete(URL url) throws Exception {
+ String response = null;
+ int statusCode = -1;
+ DeleteMethod method = new DeleteMethod(url.toString());
+
+ InputStream responseInputStream = null;
+ try {
+ method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
+ statusCode = getHttpClient().executeMethod(method);
+ if (statusCode == HttpStatus.SC_ACCEPTED) {
+ responseInputStream = method.getResponseBodyAsStream();
+ response = Lib.inputStreamToString(responseInputStream);
+ }
+ } catch (Exception ex) {
+ throw new Exception(String.format("Error deleting resource: [%s] - status code: [%s]", url, statusCode), ex);
+ } finally {
+ try {
+ if (responseInputStream != null) {
+ responseInputStream.close();
+ }
+ } catch (Exception ex) {
+ // Do Nothing;
+ } finally {
+ method.releaseConnection();
+ }
+ }
+ return response;
+ }
+
+ public static final class AcquireResult {
+ private int code;
+ private String encoding;
+ private String contentType;
+
+ private AcquireResult() {
+ super();
+ this.code = -1;
+ this.encoding = "";
+ this.contentType = "";
+ }
+
+ public boolean wasSuccessful() {
+ return code == HttpURLConnection.HTTP_OK;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ private void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getEncoding() {
+ return encoding;
+ }
+
+ private void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ private void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IAbbreviated.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IAbbreviated.java
new file mode 100644
index 00000000000..9d4c307746c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IAbbreviated.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.framework.jdk.core.util;
+
+/**
+ * An interface describing items that can provide an abbreviation name.
+ *
+ * @author Robert A. Fisher
+ */
+public interface IAbbreviated {
+ public String getAbbreviation();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IConsoleInputListener.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IConsoleInputListener.java
new file mode 100644
index 00000000000..072171025ed
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/IConsoleInputListener.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.framework.jdk.core.util;
+
+public interface IConsoleInputListener {
+ void lineRead(String line);
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/JarCreator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/JarCreator.java
new file mode 100644
index 00000000000..337813ad4b7
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/JarCreator.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.framework.jdk.core.util;
+
+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.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class JarCreator {
+ private JarOutputStream out;
+ private byte[] buffer;
+
+ /**
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ public JarCreator(File path, String title, String version) throws FileNotFoundException, IOException {
+ super();
+ Manifest manifest = new Manifest();
+ Attributes attributes = manifest.getMainAttributes();
+ attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ attributes.putValue("Implementation-Title", title);
+ attributes.putValue("Implementation-Version", version);
+ out = new JarOutputStream(new FileOutputStream(path), manifest);
+ buffer = new byte[20480];
+ }
+
+ private void addFile(File file, String pathInJar) throws IOException {
+
+ out.putNextEntry(new JarEntry(pathInJar.replace('\\', '/')));
+
+ // Read the file and write it to the jar.
+ FileInputStream in = new FileInputStream(file);
+ int bytesRead;
+ while ((bytesRead = in.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesRead);
+ }
+ in.close();
+ }
+
+ /**
+ * @param path
+ * @param rootPathPos
+ * @throws IOException
+ */
+ private void addRelativeToPosition(File path, int rootPathPos, FileFilter filenameFilter) throws IOException {
+ if (path.isDirectory()) {
+ File[] files = path.listFiles(filenameFilter);
+ for (int i = 0; i < files.length; i++) {
+ addRelativeToPosition(files[i], rootPathPos, filenameFilter);
+ }
+ } else {
+ addFile(path, path.getAbsolutePath().substring(rootPathPos));
+ }
+ }
+
+ /**
+ * just an entry point into the recursive addRelativeTo so the (unchanging) rootPathPos can be computed once
+ */
+ private void addDirectoryContents(File directory, FileFilter filenameFilter) throws IOException {
+ if (directory.isDirectory()) {
+ int rootPathPos = directory.getPath().length() + 1;
+ addRelativeToPosition(directory, rootPathPos, filenameFilter);
+ } else {
+ throw new IllegalArgumentException("Must be a directory: " + directory);
+ }
+ }
+
+ public void addFileRelativeTo(File path, String relativeTo) throws IOException {
+ addRelativeToPosition(path, relativeTo.length() + 1, null);
+ }
+
+ public void addDirectoryContents(File directory) throws IOException {
+ addDirectoryContents(directory, (FilenameAndDirectoryFilter) null);
+ }
+
+ public void addDirectoryContents(File directory, String fileNamePattern) throws IOException {
+ addDirectoryContents(directory, new FilenameAndDirectoryFilter(fileNamePattern));
+ }
+
+ public void close() throws IOException {
+ out.close();
+ }
+
+ private class FilenameAndDirectoryFilter implements FileFilter {
+ private Matcher matcher;
+
+ public FilenameAndDirectoryFilter(String pattern) {
+ this.matcher = Pattern.compile(pattern).matcher("");
+ }
+
+ public boolean accept(File pathname) {
+ if (pathname.isDirectory()) {
+ return true;
+ }
+ matcher.reset(pathname.getName());
+ return matcher.matches();
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java
new file mode 100644
index 00000000000..ea9ee90cb6c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java
@@ -0,0 +1,1664 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.awt.Image;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+import javax.swing.ImageIcon;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.io.IOInputThread;
+import org.eclipse.osee.framework.jdk.core.util.io.IOOutputThread;
+import org.eclipse.osee.framework.jdk.core.util.io.InputBufferThread;
+import org.eclipse.osee.framework.jdk.core.util.io.MatchFilter;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public final class Lib {
+ public final static Runtime runtime = Runtime.getRuntime();
+
+ public final static String jarPath = getJarPath(Lib.class);
+
+ public final static String basePath = getBasePath();
+
+ public final static String lineSeparator = System.getProperty("line.separator");
+
+ public static String toFirstCharUpperCase(String str) {
+ if (str == null) {
+ return null;
+ }
+ char[] chars = str.toCharArray();
+ chars[0] = Character.toUpperCase(str.charAt(0));
+ return new String(chars);
+ }
+
+ public static int numOccurances(String str, String regex) {
+ int x = 0;
+ Matcher m = Pattern.compile(regex).matcher(str);
+ while (m.find()) {
+ x++;
+ }
+ return x;
+ }
+
+ public static String exceptionToString(Throwable ex) {
+ StringBuilder sb = new StringBuilder();
+ exceptionToString(ex, sb);
+ return sb.toString();
+ }
+
+ public static boolean validateEmail(String toValidate) {
+ Pattern pattern =
+ Pattern.compile("^[a-z0-9\\._-]" + "+@([a-z0-9][a-z0-9-]*" + "[a-z0-9]\\.)+" + "([a-z]+\\.)?([a-z]+)$",
+ Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(toValidate);
+ return matcher.find();
+ }
+
+ private static void exceptionToString(Throwable ex, StringBuilder sb) {
+ if (ex == null) {
+ sb.append("Exception == null; can't display stack");
+ return;
+ }
+ sb.append(ex.getMessage() + "\n");
+ StackTraceElement st[] = ex.getStackTrace();
+ for (int i = 0; i < st.length; i++) {
+ StackTraceElement ste = st[i];
+ sb.append(" at " + ste.toString() + "\n");
+ }
+ Throwable cause = ex.getCause();
+ if (cause != null) {
+ sb.append(" caused by ");
+ exceptionToString(cause, sb);
+ }
+ }
+
+ public static String changeExtension(String str, String newExt) {
+ int pos = str.lastIndexOf('.');
+ if (pos == -1) { // was -1 before + 1
+ return str + "." + newExt;
+ }
+ return str.substring(0, pos + 1) + newExt;
+ }
+
+ /**
+ * this version of changeExtension will work even if the extension we want to replace contains a .
+ *
+ * @param str
+ * @param oldExt
+ * @param newExt
+ * @return String
+ */
+ public static String changeExtension(String str, String oldExt, String newExt) {
+ int pos = str.lastIndexOf(oldExt);
+ if (pos == -1) {
+ return str + "." + newExt;
+ }
+ return str.substring(0, pos) + newExt;
+ }
+
+ /**
+ * Move an object one before the previous object
+ *
+ * @param list
+ * @param obj
+ * @return true if successful
+ */
+ public static boolean moveBack(ArrayList<Object> list, Object obj) {
+ if (list.contains(obj)) {
+ int index = list.indexOf(obj);
+ if (index > 0) {
+ list.remove(index);
+ list.add(index - 1, obj);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Move an object one after the next object
+ *
+ * @param obj
+ * @return true if successful
+ */
+ public static boolean moveForward(ArrayList<Object> list, Object obj) {
+ int size = list.size();
+ if (list.contains(obj)) {
+ int index = list.indexOf(obj);
+ if (index < size - 1) {
+ list.remove(index);
+ list.add(index + 1, obj);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void copyDirectory(File source, File destination) throws IOException {
+ File[] files = source.listFiles();
+
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isDirectory()) {
+ File dir = new File(destination, files[i].getName());
+ dir.mkdir();
+ copyDirectory(files[i], dir);
+ } else { // else is a file
+ copyFile(files[i], destination);
+ }
+ }
+ }
+
+ public static String exceptionToString(Exception ex) {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+ ex.printStackTrace(printWriter);
+ return stringWriter.toString();
+ }
+
+ public static void copyFile(File source, File destination) throws IOException {
+ FileInputStream in = new FileInputStream(source);
+ FileOutputStream out = null;
+
+ if (destination.isDirectory()) {
+ out = new FileOutputStream(new File(destination, source.getName()));
+ } else {
+ destination.delete(); // to work around some file permission
+ // problems
+ out = new FileOutputStream(destination);
+ }
+
+ byte[] bytes = new byte[(int) source.length()];
+ in.read(bytes);
+ out.write(bytes);
+
+ in.close();
+ out.close();
+ }
+
+ public static void copyFiles(File source, File destination) throws IOException {
+ copyFiles(source, null, destination);
+ }
+
+ public static void copyFiles(File source, FilenameFilter filter, File destination) throws IOException {
+ File[] files = source.listFiles(filter);
+ if (!source.exists()) {
+ throw new IllegalArgumentException("the directory " + source + " does not exist.");
+ }
+
+ if (files != null) {
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isFile()) {
+ copyFile(files[i], destination);
+ }
+ }
+ }
+ }
+
+ public static Image createImage(String path) {
+ return createImageIcon(path).getImage();
+ }
+
+ public static ImageIcon createImageIcon(Class<?> clasaRef, String path) {
+ URL imgURL = clasaRef.getResource(path);
+ if (imgURL != null) {
+ return new ImageIcon(imgURL);
+ } else {
+ System.err.println("Couldn't find the resource: " + path);
+ return null;
+ }
+ }
+
+ /** Returns an ImageIcon, or null if the path was invalid. */
+ public static ImageIcon createImageIcon(String path) {
+ return createImageIcon(Lib.class, path);
+ }
+
+ public static void deleteDir(File directory) {
+ File[] files = directory.listFiles();
+ if (files == null) {
+ return;
+ }
+
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isDirectory()) {
+ deleteDir(files[i]);
+ } else { // else is a file
+ files[i].delete();
+ }
+ }
+ directory.delete();
+ }
+
+ public static void deleteContents(File directory) {
+ deleteContents(directory, null);
+ }
+
+ public static void deleteContents(File directory, FilenameFilter filter) {
+ File[] files = directory.listFiles(filter);
+
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isDirectory()) {
+ deleteContents(files[i]);
+ }
+ files[i].delete();
+ }
+ }
+
+ /**
+ * Delete the current file and all empty parents. The method will stop deleting empty parents once it reaches the
+ * stopAt parent.
+ *
+ * @param stopAt path of the parent file to stop deleting at
+ * @param file to delete
+ * @return status <b>true</b> if successful
+ */
+ public static boolean deleteFileAndEmptyParents(String stopAt, File file) {
+ boolean result = true;
+ if (file != null) {
+ if (file.isDirectory() != false) {
+ if (file.list().length == 0) {
+ result &= file.delete();
+ }
+ } else {
+ result &= file.delete();
+ }
+ }
+ File parent = file.getParentFile();
+ if (parent != null && parent.getAbsolutePath().equals(stopAt) != true) {
+ result &= deleteFileAndEmptyParents(stopAt, parent);
+ }
+ return result;
+ }
+
+ /**
+ * Deletes all files from directory
+ *
+ * @param directory
+ */
+ public static void emptyDirectory(File directory) {
+ File[] children = directory.listFiles();
+ if (children != null) {
+ for (File child : children) {
+ if (child.isDirectory()) {
+ emptyDirectory(child);
+ } else { // else is a file
+ child.delete();
+ }
+ }
+ }
+ }
+
+ public static void inputStreamToOutputStream(InputStream inputStream, OutputStream outputStream) throws IOException {
+ if (inputStream == null) {
+ throw new IllegalArgumentException("inputStream was null");
+ }
+ if (outputStream == null) {
+ throw new IllegalArgumentException("outputStream was null");
+ }
+
+ byte[] buf = new byte[10000];
+ int count = -1;
+ while ((count = inputStream.read(buf)) != -1) {
+ outputStream.write(buf, 0, count);
+ }
+ }
+
+ public static String inputStreamToString(InputStream in) throws IOException {
+ return inputStreamToChangeSet(in).toString();
+ }
+
+ public static ChangeSet inputStreamToChangeSet(InputStream in) throws IOException {
+ InputStreamReader reader = new InputStreamReader(in, "UTF-8");
+ ChangeSet set = new ChangeSet();
+
+ char[] chars = new char[8000];
+ int readCount = 0;
+ while ((readCount = reader.read(chars)) != -1) {
+ set.insertBefore(0, chars, 0, readCount, true);
+ }
+ return set;
+ }
+
+ public static byte[] inputStreamToBytes(InputStream in) throws IOException {
+ byte[] bytes = new byte[2024];
+ ByteArrayOutputStream out = new ByteArrayOutputStream(2024);
+
+ int numBytesRead;
+ while ((numBytesRead = in.read(bytes)) != -1) {
+ out.write(bytes, 0, numBytesRead);
+ }
+ in.close();
+ return out.toByteArray();
+ }
+
+ public static void inputStreamToFile(InputStream inputStream, File outFile) throws IOException {
+ byte[] bytes = new byte[2024];
+ FileOutputStream out = new FileOutputStream(outFile);
+
+ int numBytesRead;
+ while ((numBytesRead = inputStream.read(bytes)) != -1) {
+ out.write(bytes, 0, numBytesRead);
+ }
+ out.close();
+ }
+
+ public static CharBuffer inputStreamToCharBuffer(InputStream in) throws IOException {
+ return CharBuffer.wrap(inputStreamToChangeSet(in).toCharArray());
+ }
+
+ public static java.io.InputStream stringToInputStream(String value) throws Exception {
+ if (value == null) {
+ return null;
+ }
+ value = value.trim();
+ java.io.InputStream in = null;
+ in = new java.io.ByteArrayInputStream(value.getBytes("UTF-8"));
+ return in;
+ }
+
+ public static InputStream byteBufferToInputStream(final ByteBuffer byteBuffer) {
+ return new InputStream() {
+ @Override
+ public synchronized int read() throws IOException {
+ if (!byteBuffer.hasRemaining()) {
+ return -1;
+ }
+ return byteBuffer.get();
+ }
+
+ @Override
+ public synchronized int read(byte[] bytes, int off, int len) throws IOException {
+ len = Math.min(len, byteBuffer.remaining());
+ if (off != len) {
+ byteBuffer.get(bytes, off, len);
+ } else {
+ len = -1;
+ }
+ return len;
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.InputStream#reset()
+ */
+ @Override
+ public synchronized void reset() throws IOException {
+ byteBuffer.rewind();
+ }
+
+ };
+ }
+
+ public static OutputStream byteBufferToOutputStream(final ByteBuffer byteBuffer) {
+ return new OutputStream() {
+ @Override
+ public synchronized void write(int b) throws IOException {
+ byteBuffer.put((byte) b);
+ }
+
+ @Override
+ public synchronized void write(byte[] bytes, int off, int len) throws IOException {
+ byteBuffer.put(bytes, off, len);
+ }
+ };
+ }
+
+ public static final Pattern numberListPattern = Pattern.compile("\\d+");
+
+ public static List<Integer> stringToIntegerList(String numberList) {
+ ArrayList<Integer> ints = new ArrayList<Integer>();
+ Matcher transactionIdMatcher = numberListPattern.matcher(numberList);
+ while (transactionIdMatcher.find()) {
+ ints.add(Integer.parseInt(transactionIdMatcher.group()));
+ }
+ return ints;
+ }
+
+ public static String fileToString(File file) throws IOException {
+ StringBuffer buffer = new StringBuffer();
+ Reader inStream = new InputStreamReader(new FileInputStream(file), "UTF-8");
+ Reader in = new BufferedReader(inStream);
+ int ch;
+ while ((ch = in.read()) > -1) {
+ buffer.append((char) ch);
+ }
+ in.close();
+ return buffer.toString();
+ }
+
+ public static byte[] fileToBytes(File file) throws IOException {
+ InputStream inputStream = new FileInputStream(file);
+ try {
+ byte[] bytes = new byte[(int) file.length()];
+ inputStream.read(bytes);
+ return bytes;
+ } finally {
+ inputStream.close();
+ }
+ }
+
+ /**
+ * usage: char[] buf = new char[5500000]; for (Iterator iter = files.iterator(); iter.hasNext(); ) { // for each file
+ * File file = (File)iter.next(); buf = Lib.fileToChars(file, buf);
+ *
+ * @param file
+ * @param buf
+ * @return char[]
+ * @throws IOException
+ */
+ public static char[] fileToChars(File file, char[] buf) throws IOException {
+ FileReader in = new FileReader(file);
+ int size = (int) file.length();
+
+ if (buf == null) {
+ buf = new char[size];
+ } else if (size > buf.length) {
+ buf = null;
+ System.gc(); // since the currently allocated buf might already
+ // be quite large
+ buf = new char[size];
+ }
+
+ in.read(buf);
+ in.close();
+ return buf;
+ }
+
+ public static CharBuffer fileToCharBuffer(File file) throws IOException {
+ FileReader in = new FileReader(file);
+ char[] chars = new char[(int) file.length()];
+ in.read(chars);
+ in.close();
+ return CharBuffer.wrap(chars);
+ }
+
+ public static String fillString(char c, int n) {
+ char[] chars = new char[n];
+ for (int i = 0; i < n; chars[i++] = c) {
+ // must leave empty block here so the following line won't become
+ // part of the loop
+ }
+ return new String(chars);
+ }
+
+ /**
+ * Get file extension from the file path
+ *
+ * @param filepath
+ * @return file extension
+ */
+ public static String getExtension(String filepath) {
+ filepath = filepath.trim();
+ String separatorRegEx = File.separator;
+ if (Lib.isWindows()) {
+ separatorRegEx = "\\\\";
+ }
+ String[] pathsArray = filepath.split(separatorRegEx);
+
+ String fileName = pathsArray[0];
+ if (pathsArray.length > 0) {
+ fileName = pathsArray[pathsArray.length - 1];
+ }
+
+ int index = fileName.lastIndexOf('.');
+ if (index >= 0 && index + 1 < fileName.length()) {
+ return fileName.substring(index + 1);
+ } else {
+ return "";
+ }
+ }
+
+ public static int handleProcess(Process proc) {
+ return handleProcess(proc, new PrintWriter(System.out, true));
+ }
+
+ public static int handleProcess(Process proc, Writer output, String errName, String outName) {
+ return handleProcess(proc, output, errName, outName, true);
+ }
+
+ public static int handleProcess(Process proc, Writer output, String errName, String outName, boolean verbose) {
+ try {
+ IOOutputThread errThread =
+ new IOOutputThread(output, new BufferedReader(new InputStreamReader(proc.getErrorStream())), verbose);
+ IOOutputThread outThread =
+ new IOOutputThread(output, new BufferedReader(new InputStreamReader(proc.getInputStream())), verbose);
+
+ errThread.setName(errName);
+ outThread.setName(outName);
+ errThread.start();
+ outThread.start();
+ proc.waitFor();
+ int exitCode = proc.exitValue();
+ if (exitCode != 0) {
+ output.write("Process exit code is: " + exitCode + "\n");
+ }
+ int count = 0;
+ while (errThread.isAlive() || outThread.isAlive()) {
+ if (count > 10) {
+ break;
+ }
+ synchronized (Thread.currentThread()) {
+ Thread.currentThread().wait(500);
+ }
+ count++;
+ }
+ output.flush();
+ return exitCode;
+ } catch (IOException ex) {
+ System.err.println(ex);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return Integer.MIN_VALUE;
+ }
+
+ public static int handleProcess(Process proc, Writer output) {
+ return handleProcess(proc, output, "err", "out");
+ }
+
+ public static int handleProcess(Process proc, Writer output, boolean verbose) {
+ return handleProcess(proc, output, "err", "out", verbose);
+ }
+
+ /**
+ * Sets up an error, input, and output stream for the given process. The error stream gives all information coming
+ * FROM the process through it's err stream. The "outThread" will be what come from the FROM the process through it's
+ * normal output stream. The "inThread" is the stream for issuing commands TO the process.
+ *
+ * @param proc The process whose streams we are setting up
+ * @param output Where all info coming FROM the minicom is sent
+ * @param input Where all data going TO the minicom is sent
+ * @return An array of threads in the following order:<br>
+ * --index 0 = Err Stream<br>
+ * --index 1 = output stream<br>
+ * --index 2 = input stream<br>
+ */
+ public static Thread[] handleMinicomProcess(Process proc, Writer output, Reader input) {
+ IOOutputThread errThread =
+ new IOOutputThread(output, new BufferedReader(new InputStreamReader(proc.getErrorStream())));
+
+ InputBufferThread outThread = new InputBufferThread(proc.getInputStream());
+
+ errThread.setName("err");
+ outThread.setName("out");
+ errThread.start();
+ outThread.start();
+
+ if (input != null) {
+ IOInputThread inThread =
+ new IOInputThread(input, new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())));
+ inThread.setName("in");
+ inThread.start();
+ return new Thread[] {errThread, outThread, inThread};
+ }
+ return new Thread[] {errThread, outThread};
+ }
+
+ public static Thread[] handleProcessNoWait(Process proc, Writer output) {
+ return handleProcessNoWait(proc, output, output, null);
+ }
+
+ public static Thread[] handleProcessNoWait(Process proc, Writer output, boolean verbose) {
+ return handleProcessNoWait(proc, output, output, null, "err", "out", verbose);
+ }
+
+ public static Thread[] handleProcessNoWait(Process proc, Writer output, Writer errorWriter, Reader reader) {
+ return handleProcessNoWait(proc, output, errorWriter, reader, "err", "out", true);
+ }
+
+ public static Thread[] handleProcessNoWait(Process proc, Writer outputWriter, Writer errorWriter, Reader reader, String errName, String outName) {
+ return handleProcessNoWait(proc, outputWriter, errorWriter, reader, errName, outName, true);
+ }
+
+ public static Thread[] handleProcessNoWait(Process proc, Writer outputWriter, Writer errorWriter, Reader reader, String errName, String outName, boolean verbose) {
+ IOOutputThread errThread =
+ new IOOutputThread(errorWriter, new BufferedReader(new InputStreamReader(proc.getErrorStream())), verbose);
+ IOOutputThread outThread =
+ new IOOutputThread(outputWriter, new BufferedReader(new InputStreamReader(proc.getInputStream())), verbose);
+ errThread.setName(errName);
+ outThread.setName(outName);
+ errThread.start();
+ outThread.start();
+ if (reader != null) {
+ IOInputThread inThread =
+ new IOInputThread(reader, new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())));
+ inThread.setName("in");
+ inThread.start();
+ return new Thread[] {errThread, outThread, inThread};
+ }
+ return new Thread[] {errThread, outThread};
+ }
+
+ public static void makeDirClean(File directory) {
+ if (directory.exists()) {
+ Lib.deleteContents(directory);
+ } else {
+ directory.mkdir();
+ }
+ }
+
+ public static void moveFiles(File source, File destination) {
+ moveFiles(source, null, destination);
+ }
+
+ public static void moveFiles(File source, FilenameFilter filter, File destination) {
+ File[] files = source.listFiles(filter);
+
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isFile()) {
+ files[i].renameTo(new File(destination, files[i].getName()));
+ }
+ }
+ }
+
+ public static String padLeading(String str, char c, int n) {
+ char[] chars = new char[n];
+ int pos = Math.min(n, str.length());
+ str.getChars(0, pos, chars, n - pos);
+ for (int i = 0; i < n - pos; chars[i++] = c) {
+ // must leave empty block here so the following line won't become
+ // part of the loop
+ }
+ return new String(chars);
+ }
+
+ public static String padTrailing(String str, char c, int n) {
+ char[] chars = new char[n];
+ int pos = Math.min(n, str.length());
+ str.getChars(0, pos, chars, 0);
+ for (int i = pos; i < n; chars[i++] = c) {
+ // must leave empty block here so the following line won't become
+ // part of the loop
+ }
+ return new String(chars);
+ }
+
+ public static int printAndExec(String[] callAndArgs) {
+ return printAndExec(callAndArgs, null, new BufferedWriter(new PrintWriter(System.out, true)));
+ }
+
+ public static int printAndExec(String[] callAndArgs, File dir) {
+ return printAndExec(callAndArgs, dir, new PrintWriter(System.out, true));
+ }
+
+ public static int printAndExec(String[] callAndArgs, File dir, Writer output) {
+ try {
+ for (int j = 0; j < callAndArgs.length; j++) {
+ output.write(callAndArgs[j] + " ");
+ }
+ output.write("\n");
+ output.flush();
+
+ return Lib.handleProcess(runtime.exec(callAndArgs, null, dir), output);
+ } catch (IOException ex) {
+ System.err.println("error: " + ex);
+ return -1;
+ }
+ }
+
+ public static ArrayList<String> readListFromDir(File directory, FilenameFilter filter, boolean keepExtension) {
+ ArrayList<String> list = new ArrayList<String>(400);
+
+ if (directory == null) {
+ System.out.println("Invalid path: " + directory);
+ return list;
+ }
+
+ File[] files = directory.listFiles(filter);
+ if (files == null) {
+ System.out.println("Invalid path: " + directory);
+ return list;
+ }
+ if (files.length > 0) {
+ Arrays.sort(files);
+ }
+
+ if (keepExtension) {
+ for (int i = 0; i < files.length; i++) {
+ list.add(files[i].getName());
+ }
+ } else {
+ for (int i = 0; i < files.length; i++) {
+ list.add(Lib.removeExtension(files[i].getName()));
+ }
+ }
+
+ return list;
+ }
+
+ public static ArrayList<String> readListFromDir(String directory, FilenameFilter filter) {
+ return readListFromDir(new File(directory), filter, false);
+ }
+
+ public static ArrayList<String> readListFromFile(File file, boolean keepExtension) throws IOException {
+ BufferedReader in = new BufferedReader(new FileReader(file));
+ ArrayList<String> list = new ArrayList<String>(120);
+
+ String line = null;
+
+ if (keepExtension) {
+ while ((line = in.readLine()) != null) {
+ list.add(line);
+ }
+ } else {
+ while ((line = in.readLine()) != null) {
+ list.add(Lib.removeExtension(line));
+ }
+ }
+ in.close();
+ return list;
+ }
+
+ public static ArrayList<String> readListFromFile(String file) throws IOException {
+ return readListFromFile(new File(file), true);
+ }
+
+ public static boolean isLink(File file) {
+ if (!file.exists()) {
+ return true;
+ }
+ try {
+ return !file.getAbsolutePath().equals(file.getCanonicalPath());
+ } catch (IOException ex) {
+ return true;
+ }
+ }
+
+ public static List<File> recursivelyListFilesAndDirectories(ArrayList<File> fileList, File rootPath, Pattern filePathP, boolean includeDirectories) {
+ LinkedList<File> dirList = new LinkedList<File>();
+ dirList.add(rootPath);
+
+ Matcher fileNameM = null;
+ if (filePathP != null) {
+ fileNameM = filePathP.matcher("");
+ }
+
+ while (!dirList.isEmpty()) {
+ File parent = dirList.removeFirst();
+ if (parent == null) {
+ System.out.println("Invalid path.");
+ continue;
+ }
+
+ if (parent.getName().startsWith(".Rational")) {
+ continue;
+ }
+
+ File[] files = parent.listFiles();
+ if (files == null) {
+ System.out.println("Invalid path: " + parent);
+ continue;
+ }
+
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isDirectory()) {
+ dirList.add(files[i]);
+ if (includeDirectories) {
+ fileList.add(files[i]);
+ }
+ } else { // else is a file
+ if (fileNameM == null) {
+ fileList.add(files[i]);
+ } else {
+ fileNameM.reset(files[i].getPath());
+ if (fileNameM.matches()) {
+ fileList.add(files[i]);
+ }
+ }
+ }
+ }
+ }
+ return fileList;
+ }
+
+ /**
+ * Returns an array list of File objects
+ *
+ * @param fileList
+ * @param rootPath
+ * @param fileNameP
+ * @return List
+ */
+ public static List<File> recursivelyListFiles(ArrayList<File> fileList, File rootPath, Pattern filePathP) {
+ return recursivelyListFilesAndDirectories(fileList, rootPath, filePathP, false);
+ }
+
+ public static List<File> recursivelyListFiles(File rootPath, Pattern fileNameP) {
+ return recursivelyListFiles(new ArrayList<File>(400), rootPath, fileNameP);
+ }
+
+ /**
+ * Assumptions: block comments are not nested and comment blocks have an ending Note: may be fooled by string
+ * literals that contains the block comment indicators
+ *
+ * @param charBuf
+ * @return CharBuffer
+ */
+ public static CharBuffer stripBlockComments(CharBuffer charBuf) {
+ char[] chars = charBuf.array();
+ int i = 0;
+ int k = 0;
+
+ try {
+ while (i < chars.length) {
+ if (chars[i] == '/' && chars[i + 1] == '*') {
+ i += 2;
+ while (!(chars[i++] == '*' && chars[i] == '/')) {
+ // must leave empty block here so the following line
+ // won't become part of the loop
+ }
+ i++;
+ } else {
+ chars[k++] = chars[i++];
+ }
+ }
+ charBuf.limit(k);
+ return charBuf;
+ } catch (ArrayIndexOutOfBoundsException ex) {
+ throw new IllegalArgumentException("Incorrectly formatted comments.");
+ }
+ }
+
+ /**
+ * Remove the file extension from the file path
+ *
+ * @param filepath
+ * @return modified file path
+ */
+ public static String removeExtension(String filepath) {
+ String ext = getExtension(filepath);
+ if (ext != null && ext.length() > 0) {
+ filepath = filepath.substring(0, filepath.length() - (ext.length() + 1));
+ }
+ return filepath;
+ }
+
+ public static String removeExtension(File file) {
+ return removeExtension(file.getName());
+ }
+
+ /**
+ * Remove the file extension from the file path
+ *
+ * @param string
+ * @return string with no leading or trailing
+ */
+ public static String removeLeadingAndTrailingSpaces(String str) {
+ String ext = str.replaceFirst("^ *", "");
+ return ext.replaceFirst(" *$", "");
+ }
+
+ /**
+ * Determine if file is a compressed file
+ *
+ * @param file to check
+ * @return <b>true</b> if the files is a compressed file
+ */
+ public static boolean isCompressed(File file) {
+ boolean toReturn = false;
+ String ext = getExtension(file.getAbsolutePath());
+ if (ext.equals("zip")) {
+ toReturn = true;
+ }
+ return toReturn;
+ }
+
+ // replaces the first capturing group of the match in fileToModify with
+ // replaceSeq and write this back to fileToModify
+ public static boolean updateFile(File fileToModify, Pattern pattern, CharSequence replaceSeq) throws IOException {
+ CharBuffer modifyBuf = Lib.fileToCharBuffer(fileToModify);
+
+ Matcher matcher = pattern.matcher(modifyBuf);
+ if (!matcher.find()) {
+ System.out.println(fileToModify.getPath() + " does not contain the pattern: " + pattern.pattern());
+ return false;
+ }
+ CharBuffer topSection = (CharBuffer) modifyBuf.subSequence(0, matcher.start(1)); // everything
+ // before the
+ // pattern
+ CharBuffer bottomSection = null;
+ int bottomLen = 0;
+ if (matcher.end(1) != modifyBuf.length()) {
+ bottomSection = (CharBuffer) modifyBuf.subSequence(matcher.end(1), modifyBuf.length());
+ bottomLen = bottomSection.length();
+ }
+
+ CharBuffer outBuf = CharBuffer.allocate(topSection.length() + replaceSeq.length() + bottomLen);
+ outBuf.put(topSection);
+ if (replaceSeq instanceof String) {
+ outBuf.put((String) replaceSeq);
+ } else if (replaceSeq instanceof CharBuffer) {
+ outBuf.put((CharBuffer) replaceSeq);
+ } else {
+ outBuf.put(replaceSeq.toString());
+ }
+ if (bottomSection != null) {
+ outBuf.put(bottomSection);
+ }
+ Lib.writeCharBufferToFile(outBuf, fileToModify);
+
+ return true;
+ }
+
+ public static boolean updateFile(File fileToModify, Pattern pattern, File original) throws IOException {
+ return updateFile(fileToModify, pattern, fileToCharBuffer(original));
+ }
+
+ public static void writeCharBufferToFile(CharBuffer charBuf, File outFile) throws IOException {
+ writeCharsToFile(charBuf.array(), outFile);
+ }
+
+ public static void writeCharsToFile(char[] chars, File outFile) throws IOException {
+ FileWriter out = new FileWriter(outFile);
+ out.write(chars, 0, chars.length);
+ out.close();
+ }
+
+ public static void writeStringToFile(String str, File outFile) throws IOException {
+ OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8");
+ char[] chars = str.toCharArray();
+ out.write(chars, 0, chars.length);
+ out.close();
+ }
+
+ public static String getBasePath() {
+ return Lib.getBasePath(Lib.class);
+ }
+
+ public static String getDateTimeString() {
+ return new SimpleDateFormat("yyyy-MM-dd_hh-mm").format(new Date());
+ }
+
+ public static String getJarPath(Class<Lib> base) {
+ // the leading '/' tells getResource not to append the package name
+ // (instead the leading / is just stripped off)
+ String className = "/" + base.getName().replace('.', '/') + ".class";
+ String path = base.getResource(className).getPath();
+
+ int pos = path.lastIndexOf("!");
+ if (pos == -1) { // class is not in a jar file
+ return null;
+ } else { // class is in a jar file
+ String jarpath = path.substring("file:".length(), pos);
+ return jarpath.replaceAll("%20", " ");
+ }
+ }
+
+ /**
+ * @param base
+ * @return The path which was used to load the class file. If the file was loaded from a .jar, then the full path to
+ * the jar. If the file was loaded from a .class, then the path up to the root of the package.
+ */
+ public static String getClassLoadPath(Class<?> base) {
+ /*
+ * Using the getProtectionDomain() method seems to be yield more consistent results than
+ * getResource(className).getPath(); particularly when being run with the Eclipse class
+ * loader. It was found that the Eclipse class loader did not always return the full path when
+ * asked for the resource.
+ */
+
+ ProtectionDomain pd = base.getProtectionDomain();
+ CodeSource cs = pd.getCodeSource();
+ URL csLoc = cs.getLocation();
+ String path = csLoc.getPath();
+ path = path.replaceAll("%20", " ");
+ return path;
+ }
+
+ public static String getBasePath(Class<?> base) {
+ String path = getClassLoadPath(base);
+ path = path.replaceAll("%20", " ");
+
+ if (path.endsWith(".jar")) {
+ int end = path.lastIndexOf('/');
+ path = path.substring(0, end);
+ }
+ return path;
+
+ }
+
+ public static URL resolveToUrl(String path) {
+ URL url = null;
+ System.out.println("resolveToUrl: " + path);
+ if (path != null && !path.equals("")) {
+ if (path.indexOf("://") == -1) { // if not a full URL yet
+ if (!path.startsWith("/")) { // if not absolute then prepend
+ // base path
+ try {
+ path = new File(Lib.basePath + "/" + path).getCanonicalPath();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ path = "file://" + path;
+ }
+ try {
+ url = new URL(path);
+ } catch (MalformedURLException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return url;
+ }
+
+ public static String escapeForRegex(String text) {
+ char[] chars = text.toCharArray();
+ StringBuffer strB = new StringBuffer(chars.length + 5);
+
+ for (int i = 0; i < chars.length; i++) {
+ switch (chars[i]) {
+ case '\\':
+ case '[':
+ case ']':
+ case '.':
+ case '{':
+ case '}':
+ case '^':
+ case '$':
+ case '?':
+ case '*':
+ case '+':
+ case '|':
+ strB.append('\\');
+ }
+ strB.append(chars[i]);
+ }
+ return strB.toString();
+ }
+
+ public static String determineGroup() {
+ try {
+ Process proc =
+ Runtime.getRuntime().exec(
+ new String[] {"/usr/bin/bash", "-c", "touch whichGroup; ls -g whichGroup; rm whichGroup"}, null,
+ new File("/tmp"));
+ BufferedReader inOutput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = inOutput.readLine();
+ return line.substring(15, line.indexOf(' ', 16)); // 15 based on
+ // format of
+ // line printed
+ // by ls
+ } catch (IOException ex) {
+ System.out.println(ex);
+ return "no group";
+ }
+ }
+
+ /**
+ * Returns a list of the arguments in the source String passed. It assumes that the first character is a '(' and
+ * matches till it finds the matching ')'.
+ *
+ * @param source
+ * @return String[]
+ */
+ public static String[] getArguments(String source) {
+ ArrayList<String> theResults = new ArrayList<String>();
+ try {
+ if (source.charAt(0) != '(') {
+ System.err.println("In getArguments, first char must be \'(\'.");
+ return null;
+ }
+
+ int currentArg = 1;
+ int startPos = 1;
+ int parens = 0;
+ boolean foundValidChar = false;
+
+ for (int i = 1; i < source.length(); i++) {
+ char theChar = source.charAt(i);
+
+ if (theChar == '(') {
+ parens++;
+ } else if (theChar == ')') {
+ parens--;
+ if (parens < 0) {
+ theResults.add(source.substring(startPos, i));
+ break;
+ }
+ } else if (theChar == ',' && parens == 0) {
+ theResults.add(source.substring(startPos, i));
+ startPos = i + 1;
+ currentArg++;
+ foundValidChar = false;
+ } else if (!foundValidChar) {
+ if (Character.isWhitespace(theChar)) {
+ startPos++;
+ } else {
+ foundValidChar = true;
+ }
+ }
+ }
+
+ String[] theTrueResults = new String[theResults.size()];
+ theResults.toArray(theTrueResults);
+
+ if (theTrueResults.length != currentArg) {
+ System.err.println("In getArguments, number of argument mismatch.");
+ }
+
+ return theTrueResults;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static int getArgsLength(String source) {
+ try {
+ if (source.charAt(0) != '(') {
+ System.err.println("In getArguments, first char must be \'(\'.");
+ return -1;
+ }
+ int parens = 0;
+
+ for (int i = 1; i < source.length(); i++) {
+ char theChar = source.charAt(i);
+
+ if (theChar == '(') {
+ parens++;
+ } else if (theChar == ')') {
+ parens--;
+ if (parens < 0) {
+ return i - 1;
+ }
+ }
+ }
+
+ System.err.println("In getArguments, problem occurred.");
+ return -1;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return -1;
+ }
+ }
+
+ /**
+ * Returns a list of Strings representing each comma separated string in the string passed. It ignores commas inside
+ * () or {}.
+ *
+ * @param source
+ * @return String[]
+ */
+ public static String[] getCommaSeparatedItems(String source) {
+ ArrayList<String> theResults = new ArrayList<String>();
+ int startPos = 0;
+ int parensCount = 0;
+
+ for (int i = 0; i < source.length(); i++) {
+ char theChar = source.charAt(i);
+
+ if (theChar == '(' || theChar == '{') {
+ parensCount++;
+ } else if (theChar == ')' || theChar == '}') {
+ parensCount--;
+ } else if (parensCount == 0 && theChar == ',') {
+ theResults.add(source.substring(startPos, i).trim());
+ startPos = i + 1;
+ }
+ }
+ theResults.add(source.substring(startPos).trim());
+ String[] results = new String[theResults.size()];
+ theResults.toArray(results);
+ return results;
+ }
+
+ public static String getCommaString(Collection<String> strs) {
+ StringBuffer sb = new StringBuffer();
+ for (String str : strs) {
+ sb.append(str + ", ");
+ }
+ return sb.toString().replaceFirst(", ", "");
+ }
+
+ public static String getCommaString(String[] strs) {
+ StringBuffer sb = new StringBuffer();
+ for (String str : strs) {
+ sb.append(str + ", ");
+ }
+ return sb.toString().replaceFirst(", ", "");
+ }
+
+ /**
+ * Finds the index of the closing bracket for a function.
+ *
+ * @param start -the index of the character AFTER the opening bracket for the function
+ * @param seq -sequence containing the local function
+ * @return -the index of the matching bracket to the opening bracket of this function
+ */
+ public static int findTheEnd(int start, CharSequence seq) {
+ int stack = 1;
+ char[] array = seq.subSequence(start, seq.length()).toString().toCharArray();
+ int i;
+ // print( "checking: " + seq.subSequence(start,
+ // seq.length()).toString());
+ for (i = 0; i < array.length; i++) {
+ // System.out.print( array[i]);
+ if (array[i] == '/' && array[i + 1] == '*') {
+
+ while (array[i] != '*' || array[i + 1] != '/') {
+ i++;
+ }
+ }
+ if (array[i] == '"') {
+ i++;
+ while (array[i] != '"' || array[i - 1] == '\\') {
+ i++;
+ }
+ }
+ if (array[i] == '{') {
+ stack++;
+
+ } else if (array[i] == '}') {
+ stack--;
+
+ }
+ if (stack == 0) {
+ return start + i - 1;
+ }
+ }
+ return start + i - 1;
+
+ }
+
+ public static final URL getUrlFromString(String path) throws MalformedURLException {
+ if (!path.matches("(file:/|file://|http://|C:).*")) {
+ return new URL("file://" + path);
+ }
+ return new URL(path);
+ }
+
+ public static final URL[] getUrlFromString(String[] path) throws MalformedURLException {
+ URL[] urls = new URL[path.length];
+ for (int i = 0; i < urls.length; i++) {
+ urls[i] = getUrlFromString(path[i]);
+ }
+ return urls;
+ }
+
+ public static final String convertToJavaClassName(String name) {
+ ChangeSet changeSet = new ChangeSet(name);
+ Matcher matcher = Pattern.compile("_([a-zA-Z])").matcher(changeSet.toString());
+
+ changeSet.replace(0, 1, Character.toUpperCase(name.charAt(0)));
+ while (matcher.find()) {
+ changeSet.replace(matcher.start(), matcher.end(), Character.toUpperCase(matcher.group(1).charAt(0)));
+ }
+
+ return changeSet.applyChangesToSelf().toString();
+ }
+
+ /**
+ * This method takes in any name separated by underscores and converts it into a java standard variable name.
+ *
+ * @param name
+ * @return java variable name
+ */
+ public static final String convertToJavaVariableName(String name) {
+ name = name.toLowerCase();
+ StringBuffer sb = new StringBuffer();
+ char[] chars = name.toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ if (chars[i] == '_') {
+ if (chars.length > i + 1 && chars[i + 1] != '_') {
+ sb.append(Character.toUpperCase(chars[i + 1]));
+ i++;
+ }
+ } else {
+ sb.append(chars[i]);
+ }
+ }
+ return sb.toString();
+ }
+
+ public static URL getJarFileURL(File directory, String title, String version) throws IOException {
+ if (!directory.isDirectory()) {
+ throw new IllegalArgumentException(directory.getPath() + " is not a valid directory.");
+ }
+ File[] jars = directory.listFiles(new MatchFilter(".*\\.jar"));
+ for (int i = 0; i < jars.length; i++) {
+ JarFile jar = new JarFile(jars[i]);
+ Attributes attributes = jar.getManifest().getMainAttributes();
+ String jarTitle = attributes.getValue("Implementation-Title");
+ String jarVersion = attributes.getValue("Implementation-Version");
+ if (jarTitle != null && jarVersion != null && jarTitle.equals(title) && jarVersion.equals(version)) {
+ return jars[i].toURI().toURL();
+ }
+ }
+ throw new IllegalArgumentException("The specified version: " + version + " for " + title + " was not found.");
+ }
+
+ public static URL[] getClasspath() throws MalformedURLException {
+ String[] strPaths = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
+ URL[] urlPaths = new URL[strPaths.length];
+ for (int i = 0; i < strPaths.length; i++) {
+ urlPaths[i] = new File(strPaths[i]).toURI().toURL();
+ }
+ return urlPaths;
+ }
+
+ public static String getJarFileVersion(String jarFilePath) throws IOException {
+ Manifest manifest;
+ File jarFile = new File(jarFilePath);
+ if (!jarFile.isFile()) {// maybe it's an http connection
+ try {
+ URL u = new URL(jarFilePath);
+ URLConnection uc = u.openConnection();
+ JarInputStream jis = new JarInputStream(uc.getInputStream());
+ manifest = jis.getManifest();
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(jarFilePath + " is not a valid file or URL.");
+ }
+ } else {
+ manifest = new JarFile(jarFile).getManifest();
+ }
+ return manifest.getMainAttributes().getValue("Implementation-Version");
+ }
+
+ public static String getElapseString(long startTime) {
+ return String.valueOf((System.currentTimeMillis() - startTime) / 1000.0) + " secs";
+ }
+
+ /**
+ * Determine is OS is windows
+ *
+ * @return <b>true</b> if OS is windows
+ */
+ public static boolean isWindows() {
+ return System.getProperty("os.name").indexOf("indows") != -1;
+ }
+
+ public static void writeBytesToFile(byte[] data, File file) throws IOException {
+ OutputStream os = new FileOutputStream(file);
+ try {
+ os.write(data);
+ } finally {
+ os.close();
+ }
+ }
+
+ public static void extractJarEntry(File jarFile, File destination, String entry) throws IOException {
+ if (!destination.getParentFile().exists()) {
+ destination.getParentFile().mkdirs();
+ }
+ int BUFFER = 2048;
+ try {
+ JarFile jarfile = new JarFile(jarFile.getAbsolutePath());
+ JarEntry jarEntry = jarfile.getJarEntry(entry);
+ BufferedInputStream is = new BufferedInputStream(jarfile.getInputStream(jarEntry));
+ int count;
+ long total = 0;
+ byte data[] = new byte[BUFFER];
+ FileOutputStream fos = new FileOutputStream(destination);
+ BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);
+ while ((count = is.read(data, 0, BUFFER)) != -1) {
+ dest.write(data, 0, count);
+ total += BUFFER;
+ }
+ dest.flush();
+ dest.close();
+ is.close();
+ } catch (Exception ex) {
+ String information =
+ "JarFile: " + (jarFile != null ? jarFile.getAbsolutePath() : "NULL") + "\n" + "Entry: " + (entry != null ? entry.toString() : "NULL") + "\n" + "Destination: " + (destination != null ? destination.getAbsoluteFile().toString() : "NULL") + "\n";
+ throw new IOException(information + ex.getMessage());
+ }
+ }
+
+ public static byte[] compressStream(InputStream in, String name) throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ZipOutputStream out = null;
+ try {
+ out = new ZipOutputStream(bos);
+ // Add ZIP entry to output stream.
+ out.putNextEntry(new ZipEntry(name));
+ inputStreamToOutputStream(in, out);
+ } finally {
+ if (out != null) {
+ out.closeEntry();
+ out.close();
+ }
+ }
+ return bos.toByteArray();
+ }
+
+ public static byte[] compressFile(File file) throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ZipOutputStream outputStream = new ZipOutputStream(bos);
+ compressFile(null, file, outputStream);
+ outputStream.closeEntry();
+ outputStream.close();
+ return bos.toByteArray();
+ }
+
+ private static void compressFile(String basePath, File file, ZipOutputStream outputStream) throws IOException {
+ FileInputStream inputStream = null;
+ try {
+ inputStream = new FileInputStream(file);
+ String entryName = file.getPath();
+ if (Strings.isValid(basePath) && entryName.startsWith(basePath)) {
+ if (basePath.endsWith(File.separator) != true) {
+ basePath = basePath + File.separator;
+ }
+ entryName = entryName.replace(basePath, "");
+ }
+ ZipEntry entry = new ZipEntry(entryName);
+ outputStream.putNextEntry(entry);
+ inputStreamToOutputStream(inputStream, outputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+
+ private static void compressDirectory(String basePath, File source, ZipOutputStream outputStream, boolean includeSubDirectories) throws IOException {
+ File[] children = source.listFiles();
+ for (File file : children) {
+ if (file.isDirectory() != true) {
+ compressFile(basePath, file, outputStream);
+ } else {
+ if (includeSubDirectories) {
+ compressDirectory(basePath, file, outputStream, includeSubDirectories);
+ }
+ }
+ }
+ }
+
+ public static void compressDirectory(File directory, String zipTarget, boolean includeSubDirectories) throws IOException, IllegalArgumentException {
+ if (directory.isDirectory() != true) {
+ throw new IllegalArgumentException(String.format("Error source is not a directory: [%s]", directory));
+ }
+ if (Strings.isValid(zipTarget) != true) {
+ throw new IllegalArgumentException("Error target zip filename is invalid");
+ }
+ ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipTarget));
+ compressDirectory(directory.getPath(), directory, out, includeSubDirectories);
+ out.close();
+ }
+
+ public static String decompressStream(InputStream inputStream, OutputStream outputStream) throws IOException {
+ String zipEntryName = null;
+ ZipInputStream zipInputStream = null;
+ try {
+ zipInputStream = new ZipInputStream(inputStream);
+ ZipEntry entry = zipInputStream.getNextEntry();
+ zipEntryName = entry.getName();
+ // Transfer bytes from the ZIP file to the output file
+ inputStreamToOutputStream(zipInputStream, outputStream);
+ } finally {
+ if (zipInputStream != null) {
+ zipInputStream.close();
+ }
+ }
+ return zipEntryName;
+ }
+
+ public static void decompressStream(InputStream inputStream, File targetDirectory) throws IOException {
+ ZipInputStream zipInputStream = null;
+ try {
+ zipInputStream = new ZipInputStream(inputStream);
+ if (!targetDirectory.exists()) {
+ targetDirectory.mkdirs();
+ }
+ ZipEntry entry = null;
+ while ((entry = zipInputStream.getNextEntry()) != null) {
+ String zipEntryName = entry.getName();
+
+ OutputStream outputStream = null;
+ try {
+ File target = new File(targetDirectory, zipEntryName);
+ if (target != null && !entry.isDirectory()) {
+ File parent = target.getParentFile();
+ if (parent != null && !parent.exists()) {
+ parent.mkdirs();
+ }
+ outputStream = new BufferedOutputStream(new FileOutputStream(target));
+ inputStreamToOutputStream(zipInputStream, outputStream);
+ }
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+ } finally {
+ if (zipInputStream != null) {
+ zipInputStream.close();
+ }
+ }
+ }
+
+ public static byte[] decompressBytes(InputStream inputStream) throws IOException {
+ ByteArrayOutputStream out = null;
+ // Open the ZIP file
+ ZipInputStream in = new ZipInputStream(inputStream);
+
+ // Get the first entry
+ in.getNextEntry();
+
+ // Open the output file
+ out = new ByteArrayOutputStream();
+
+ inputStreamToOutputStream(in, out);
+
+ // Close the streams
+ out.close();
+ in.close();
+ return out.toByteArray();
+ }
+
+ public static void chmod777(File file) {
+ if (file == null || !file.exists()) {
+ return;
+ }
+ try {
+ String command = "chmod 777 " + file.getAbsolutePath();
+ Runtime r = Runtime.getRuntime();
+ Process p = r.exec(command);
+
+ Lib.handleProcess(p);
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+
+ public static String getSortedJavaArrayInitializer(String[] strings) {
+ Arrays.sort(strings);
+ StringBuilder strB = new StringBuilder();
+ strB.append("new String[] {\"");
+ for (String element : strings) {
+ strB.append(element);
+ strB.append("\", \"");
+ }
+ strB.replace(strB.length() - 3, strB.length(), "};");
+ return strB.toString();
+ }
+
+ /**
+ * Determine whether the input stream is word xml content.
+ *
+ * @param inputStream
+ * @return <b>true</b> is the input stream is word xml content.
+ */
+ public static boolean isWordML(InputStream inputStream) {
+ boolean toReturn = false;
+ try {
+ inputStream.mark(250);
+ byte[] buffer = new byte[200];
+ int index = 0;
+ for (; index < buffer.length; index++) {
+ if (inputStream.available() > 0) {
+ buffer[index] = (byte) inputStream.read();
+ } else {
+ break;
+ }
+ }
+ if (index > 0) {
+ String header = new String(buffer).toLowerCase();
+ if (header.contains("word.document") || header.contains("worddocument") || header.contains("<w:")) {
+ toReturn = true;
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ inputStream.reset();
+ } catch (IOException ex) {
+ // Do Nothing
+ }
+ }
+ return toReturn;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Network.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Network.java
new file mode 100644
index 00000000000..9f6485404aa
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Network.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.framework.jdk.core.util;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class Network {
+
+ public static InetAddress getValidIP() throws UnknownHostException {
+ InetAddress[] addrs;
+ // Cannot just grab the localhost address because the user might have more than one NIC.
+ addrs = getLocalNetworkAdapters();
+
+ for (int j = 0; j < addrs.length; j++) {
+ if (!addrs[j].getHostAddress().matches("192.*")) {
+ return addrs[j];
+ }
+ }
+ return addrs[0];
+ }
+
+ public static InetAddress[] getLocalNetworkAdapters() throws UnknownHostException {
+ return InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Objects.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Objects.java
new file mode 100644
index 00000000000..0fc6e834c72
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Objects.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.framework.jdk.core.util;
+
+/**
+ * Utility class for methods useful to all Object's
+ *
+ * @author Robert A. Fisher
+ */
+public final class Objects {
+
+ /**
+ * Produces a hash code that uses all of the supplied values. This method is guaranteed to return the same value
+ * given the same input.
+ *
+ * @param PRIME_1
+ * @param PRIME_2
+ * @param data
+ */
+ public static int hashCode(int PRIME_1, int PRIME_2, Object... data) {
+ int result = PRIME_1;
+
+ for (Object val : data) {
+ result = PRIME_2 * result + val.hashCode();
+ }
+
+ return result;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/OseeProperties.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/OseeProperties.java
new file mode 100644
index 00000000000..46fe21a1a11
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/OseeProperties.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeProperties {
+ private static final String OSEE_LOG_DEFAULT = "osee.log.default";
+ private static final String OSEE_JINI_SERVICE_GROUPS = "osee.jini.lookup.groups";
+ private static final String OSEE_JINI_FORCED_REGGIE_SEARCH = "osee.jini.forced.reggie.search";
+ private static final String OSEE_PORT_SCAN_START_PORT = "osee.port.scanner.start.port";
+
+ public static final String OSEE_DB_CONNECTION_ID = "osee.db.connection.id";
+ private static final String OSEE_CONNECTION_INFO_URI = "osee.connection.info.uri";
+
+ protected OseeProperties() {
+ }
+
+ public static int getOseePortScannerStartPort() {
+ int toReturn = 18000;
+ String startPort = System.getProperty(OSEE_PORT_SCAN_START_PORT, "18000");
+ try {
+ toReturn = Integer.parseInt(startPort);
+ } catch (Exception ex) {
+ toReturn = 18000;
+ }
+ return toReturn;
+ }
+
+ /**
+ * Get the default OSEE logging level. The default level is WARNING.
+ *
+ * @return default logging level
+ */
+ public static Level getOseeLogDefault() {
+ Level toReturn = Level.WARNING;
+ String level = System.getProperty(OSEE_LOG_DEFAULT, "WARNING");
+ try {
+ toReturn = Level.parse(level);
+ } catch (Exception ex) {
+ toReturn = Level.WARNING;
+ }
+ return toReturn;
+ }
+
+ /**
+ * OSEE database information id to use for default database connections.
+ *
+ * @return the default database information id to use for database connections.
+ */
+ public static String getOseeDbConnectionId() {
+ return System.getProperty(OSEE_DB_CONNECTION_ID);
+ }
+
+ /**
+ * Retrieve the connection info file location
+ *
+ * @return connection info file URI
+ */
+ public static String getOseeConnectionInfoUri() {
+ return System.getProperty(OSEE_CONNECTION_INFO_URI, "");
+ }
+
+ /**
+ * Retrieves the JINI Groups this system is a part of.
+ *
+ * @return JINI service groups
+ */
+ public static String getOseeJiniServiceGroups() {
+ return System.getProperty(OSEE_JINI_SERVICE_GROUPS);
+ }
+
+ /**
+ * Sets the JINI Groups this system is a part of.
+ *
+ * @param JINI service groups
+ */
+ public static void setOseeJiniServiceGroups(String toStore) {
+ System.setProperty(OSEE_JINI_SERVICE_GROUPS, toStore);
+ }
+
+ /**
+ * @return whether forced reggie search is enabled
+ */
+ public static boolean isOseeJiniForcedReggieSearchEnabled() {
+ return Boolean.valueOf(System.getProperty(OSEE_JINI_FORCED_REGGIE_SEARCH));
+ }
+
+ private void toStringHelper(List<String> list, Class<?> clazz) {
+ Field[] fields = clazz.getDeclaredFields();
+ for (Field field : fields) {
+ int mod = field.getModifiers();
+ if (Modifier.isStatic(mod) && Modifier.isFinal(mod)) {
+ boolean wasModified = false;
+ try {
+ if (!field.isAccessible()) {
+ field.setAccessible(true);
+ wasModified = true;
+ }
+ Object object = field.get(this);
+ if (object instanceof String) {
+ String value = (String) object;
+ list.add(String.format("%s: %s", value, System.getProperty(value)));
+ }
+ } catch (Exception ex) {
+ // DO NOTHING
+ } finally {
+ if (wasModified) {
+ field.setAccessible(false);
+ }
+ }
+ }
+ }
+ Class<?> superClazz = clazz.getSuperclass();
+ if (superClazz != null) {
+ toStringHelper(list, superClazz);
+ }
+ }
+
+ public String toString() {
+ List<String> list = new ArrayList<String>();
+ toStringHelper(list, getClass());
+ Collections.sort(list);
+ return StringFormat.listToValueSeparatedString(list, "\n");
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Readers.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Readers.java
new file mode 100644
index 00000000000..0a3ebcf8181
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Readers.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Arrays;
+
+/**
+ * @author Robert A. Fisher
+ */
+public final class Readers {
+
+ /**
+ * Forward a reader until just after the balanced close of the given xml element name. It is assumed that the
+ * balanced open end of the element was just read off of the reader.
+ *
+ * @param reader The reader to pull the data from
+ * @param appendable If supplied, all data read from the reader is appended to the appendable
+ * @param elementName The name of the element, including the namespace if applicable
+ * @throws IllegalArgumentException If reader is null
+ * @throws IllegalArgumentException If elementName is null
+ * @throws IllegalStateException If the balanced closing tag is not found before the reader is emptied
+ * @throws IOException
+ */
+ public static final void xmlForward(Reader reader, Appendable appendable, CharSequence elementName) throws IOException {
+ if (reader == null) throw new IllegalArgumentException("reader can not be null");
+ if (elementName == null) throw new IllegalArgumentException("elementName can not be null");
+
+ final String CLOSE_TAG = "</" + elementName + ">";
+ final String EMPTY_TAG = "<" + elementName + "/>";
+ final String OPEN_TAG = "<" + elementName + ">";
+ final String OPEN_TAG_WITH_ATTR = "<" + elementName + " ";
+ final CharSequence[] TAGS = new CharSequence[] {CLOSE_TAG, EMPTY_TAG, OPEN_TAG, OPEN_TAG_WITH_ATTR};
+
+ int elementDepthCount = 1;
+ StringBuilder read = null;
+ if (appendable != null) {
+ read = new StringBuilder();
+ }
+
+ CharSequence stopTag;
+
+ while (elementDepthCount > 0) {
+ if ((stopTag = forward(reader, appendable, TAGS)) == null) {
+ throw new IllegalStateException("end of reader met when expecting an end of a tag");
+ }
+
+ if (stopTag == CLOSE_TAG) {
+ elementDepthCount--;
+ } else if (stopTag == OPEN_TAG) {
+ elementDepthCount++;
+ } else if (stopTag == OPEN_TAG_WITH_ATTR) {
+ if (forward(reader, (Appendable) read, ">") == null) {
+ throw new IllegalStateException("end of reader met when expecting >");
+ }
+
+ if (!read.toString().endsWith("/>")) {
+ elementDepthCount++;
+ }
+
+ if (appendable != null) {
+ appendable.append(read);
+ read.setLength(0);
+ }
+ } else if (stopTag == EMPTY_TAG) {
+ // no effect on the stack count
+ } else {
+ throw new IllegalStateException("unexpected element returned");
+ }
+ }
+ }
+
+ /**
+ * Forward a reader to just after the specified CharSequence.
+ *
+ * @return The sequence that was found which stopped the forwarding. A null is returned if no sequence was found
+ * @throws IOException
+ * @throws IllegalArgumentException if any parameter is null
+ * @throws IllegalArgumentException if any of the sequences elements are length zero
+ */
+ public static final CharSequence forward(Reader reader, CharSequence... sequences) throws IOException {
+ return forward(reader, null, sequences);
+ }
+
+ /**
+ * Forward a reader to just after the specified CharSequence. If an appendable is supplied then all characters
+ * consumed from the reader will be appended to the appendable.
+ *
+ * @return The sequence that was found which stopped the forwarding. A null is returned if no sequence was found
+ * @throws IOException
+ * @throws IllegalArgumentException if reader is null
+ * @throws IllegalArgumentException if sequences is null
+ * @throws IllegalArgumentException if any of the sequences elements are length zero
+ */
+ public static final CharSequence forward(Reader reader, Appendable appendable, CharSequence... sequences) throws IOException {
+ if (reader == null) throw new IllegalArgumentException("reader can not be null");
+ if (sequences == null) throw new IllegalArgumentException("sequences can not be null");
+ if (sequences.length == 0) throw new IllegalArgumentException("must provide at least one sequence");
+
+ // Precalculate all of the lengths and check for unacceptable data
+ int[] lengths = new int[sequences.length];
+ for (int x = 0; x < sequences.length; x++) {
+ if (sequences[x] == null) {
+ throw new IllegalArgumentException("character sequence can not be null");
+ }
+
+ lengths[x] = sequences[x].length();
+
+ if (lengths[x] == 0) {
+ throw new IllegalArgumentException("character sequence can not have length zero");
+ }
+ }
+
+ int[] seqIndex = new int[sequences.length];
+ Arrays.fill(seqIndex, 0);
+
+ char[] buffer = new char[1];
+
+ while (reader.read(buffer) != -1) {
+ if (appendable != null) {
+ appendable.append(buffer[0]);
+ }
+
+ for (int x = 0; x < sequences.length; x++) {
+ // Check if the last value read is inline with the next valid character for the sequence
+ if (sequences[x].charAt(seqIndex[x]) == buffer[0]) {
+ seqIndex[x]++;
+ // Check if the whole sequence has been detected in the stream
+ if (seqIndex[x] == lengths[x]) {
+ return sequences[x];
+ }
+ } else {
+ seqIndex[x] = 0;
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/RegExpressLib.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/RegExpressLib.java
new file mode 100644
index 00000000000..d313e0f8ae6
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/RegExpressLib.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.framework.jdk.core.util;
+
+import java.util.regex.Pattern;
+
+/**
+ * @author Andy Jury
+ */
+
+public class RegExpressLib {
+
+ public static final Pattern findRegExpressNotInComment(String str) {
+
+ String notInComment = "(?:/\\*.*?\\*/)";
+
+ return Pattern.compile(notInComment + "|" + str, Pattern.DOTALL);
+ }
+
+ public static final Pattern findRegExpressNotInQuotes(String str) {
+
+ String notInQuotes = "(?:\".*?[^\\\\]\")";
+
+ return Pattern.compile(notInQuotes + "|" + str);
+ }
+
+ public static final Pattern findCMathFunctionNotInQuotes(String str) {
+
+ return findRegExpressNotInQuotes("[^.\\w](" + str + "\\s*?)\\(.*?");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Sets.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Sets.java
new file mode 100644
index 00000000000..dab3f7048c5
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Sets.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.framework.jdk.core.util;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Utility methods for <code>Set</code>'s.
+ *
+ * @author Robert A. Fisher
+ */
+public class Sets {
+
+ /**
+ * Compute the intersection of two sets, and return the resulting set.
+ *
+ * @throws IllegalArgumentException if either argument is null.
+ */
+ public static <A extends Object> Set<A> intersect(Set<A> set1, Set<A> set2) {
+ if (set1 == null) throw new IllegalArgumentException("set1 can not be null.");
+ if (set2 == null) throw new IllegalArgumentException("set2 can not be null.");
+
+ Set<A> intersection = new HashSet<A>();
+
+ // Pick the smaller of the two sets as this will be the largest
+ // possible intersection.
+ boolean set1Larger = set1.size() > set2.size();
+ Set<A> baseSet = set1Larger ? set2 : set1;
+ Set<A> otherSet = set1Larger ? set1 : set2;
+
+ for (A item : baseSet)
+ if (otherSet.contains(item)) intersection.add(item);
+
+ return intersection;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/SingletonApplicationInstance.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/SingletonApplicationInstance.java
new file mode 100644
index 00000000000..548292b936f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/SingletonApplicationInstance.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.framework.jdk.core.util;
+
+import java.net.BindException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+
+public class SingletonApplicationInstance {
+
+ private static DatagramChannel lockChannel;
+
+ public static void verifySingleton(int port) throws Exception {
+ if (findOther(port)) {
+ System.out.println("found another instance");
+ } else {
+ System.out.println("no other instance found");
+ }
+ }
+
+
+ private static boolean findOther(int port) throws Exception {
+ InetAddress host = InetAddress.getLocalHost();
+ try {
+ DatagramChannel channel = DatagramChannel.open();
+ channel.configureBlocking(true);
+ InetSocketAddress address = new InetSocketAddress(host, port);
+ channel.socket().bind(address);
+ lockChannel = channel;
+ return false;
+ } catch (BindException e) {
+ return true;
+ }
+ }
+
+ public static void main(String[] args) {
+ try {
+ verifySingleton(32900);
+ System.in.read();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringDataSource.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringDataSource.java
new file mode 100644
index 00000000000..4085c0e4c45
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringDataSource.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.framework.jdk.core.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.activation.DataSource;
+
+public class StringDataSource implements DataSource {
+
+ private String data;
+ private String name;
+
+ /**
+ * @param data
+ * @param name
+ */
+ public StringDataSource(String data, String name) {
+ super();
+ this.data = data;
+ this.name = name;
+ }
+
+ public String getContentType() {
+ return "text/plain";
+ }
+
+ public InputStream getInputStream() throws IOException {
+ return new ByteArrayInputStream(data.getBytes());
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public OutputStream getOutputStream() throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringFormat.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringFormat.java
new file mode 100644
index 00000000000..8a2c9c3b78f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/StringFormat.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.framework.jdk.core.util;
+
+import java.util.List;
+
+public class StringFormat {
+
+ public static String separateWith(String[] items, String separateWith) {
+ StringBuilder string = new StringBuilder();
+ boolean first = true;
+ for (String item : items) {
+ if (first)
+ first = false;
+ else
+ string.append(separateWith);
+ string.append(item);
+ }
+
+ return string.toString();
+ }
+
+ public static String commaSeparate(String[] items) {
+ return separateWith(items, ",");
+ }
+
+ public static String listToCommaSeparatedString(List<String> list) {
+ return commaSeparate(list.toArray(new String[list.size()]));
+ }
+
+ public static String listToValueSeparatedString(List<String> list, String value) {
+ return separateWith(list.toArray(new String[list.size()]), value);
+ }
+
+ public static String padWithLeadingZeroes(String toPad, int length) {
+ char[] charArray = new char[20];
+ int charArrayIndex = charArray.length - 1;
+ for (int index = toPad.length() - 1; index >= 0; index--, charArrayIndex--) {
+ charArray[charArrayIndex] = toPad.charAt(index);
+ }
+ for (; charArrayIndex >= 0; charArrayIndex--) {
+ charArray[charArrayIndex] = '0';
+ }
+ return new String(charArray);
+ }
+
+ public static String truncate(String str, int length) {
+ return str.substring(0, Math.min(length, str.length()));
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java
new file mode 100644
index 00000000000..819b88e8c01
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.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.framework.jdk.core.util;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class Strings {
+ private final static String EMPTY_STRING = "";
+
+ /**
+ * Return string truncated if size > length, otherwise return string
+ *
+ * @param string
+ * @param length
+ * @return truncated string
+ */
+ public static String truncate(String string, int length) {
+
+ if (string.length() > length) {
+ return string.substring(0, length);
+ }
+
+ return string;
+ }
+
+ public static boolean isValid(String value) {
+ return value != null && value.length() > 0;
+ }
+
+ public static String emptyString() {
+ return EMPTY_STRING;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ThreadKeyLocal.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ThreadKeyLocal.java
new file mode 100644
index 00000000000..e7ca34dd266
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/ThreadKeyLocal.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.framework.jdk.core.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Robert A. Fisher
+ */
+public class ThreadKeyLocal<K, T> {
+
+ private ThreadLocal<Map<K, T>> keyToValueMaps = new ThreadLocal<Map<K, T>>() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.ThreadLocal#initialValue()
+ */
+ @Override
+ protected Map<K, T> initialValue() {
+ return new HashMap<K, T>();
+ }
+ };
+
+ public T get(K key) {
+ Map<K, T> map = keyToValueMaps.get();
+
+ T value = map.get(key);
+
+ if (value == null) {
+ value = initialValue();
+ map.put(key, value);
+ }
+
+ return value;
+ }
+
+ public void remove(K key) {
+ keyToValueMaps.get().remove(key);
+ }
+
+ public void set(K key, T value) {
+ keyToValueMaps.get().put(key, value);
+ }
+
+ /**
+ * Typically an anonymous inner class will be used and this method will be overridden to provide desired initial
+ * value.
+ *
+ * @return Returns value
+ */
+ protected T initialValue() {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/benchmark/Benchmark.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/benchmark/Benchmark.java
new file mode 100644
index 00000000000..0123b0e7331
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/benchmark/Benchmark.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.benchmark;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * Takes time measurements and provides some simple statistics. Useful for determining elapsed time between two points
+ * in frequently executed code.<BR>
+ * <P>
+ * <B>NOTE: </B>To enable benchmarking the JVM argument -Dosee.benchmark must be specified otherwise this code does
+ * nothing
+ *
+ * @author Ken J. Aguilar
+ */
+public class Benchmark {
+
+ private static boolean IS_BENCHMARKING_ENABLED = false;
+ private final long threshold;
+ private long totalSamples;
+ private long startTime;
+ private long totalTime;
+ private long exceedCount;
+ private long longestSample;
+ private long shortestSample;
+ private long totalExceedAmount;
+ private static final Vector<Benchmark> list = new Vector<Benchmark>(16);
+ private final HashMap<String, Integer> exceeders = new HashMap<String, Integer>(100);
+ private final String name;
+
+ public Benchmark(String name) {
+ this(name, Long.MAX_VALUE);
+ }
+
+ /**
+ * @param threshold if samples exceed this time (in microseconds) then the exceed count will be incremented
+ */
+ public Benchmark(String name, long threshold) {
+ this.name = name;
+ synchronized (list) {
+ list.add(this);
+ }
+ this.threshold = threshold;
+ totalSamples = 0;
+ totalTime = 0;
+ exceedCount = 0;
+ longestSample = 0;
+ shortestSample = Long.MAX_VALUE;
+ startTime = Long.MIN_VALUE;
+ totalExceedAmount = 0;
+ }
+
+ public static void resetAll() {
+ synchronized (list) {
+ for (Benchmark bm : list) {
+ bm.totalSamples = 0;
+ bm.totalTime = 0;
+ bm.exceedCount = 0;
+ bm.longestSample = 0;
+ bm.shortestSample = Long.MAX_VALUE;
+ bm.startTime = Long.MIN_VALUE;
+ bm.totalExceedAmount = 0;
+ bm.exceeders.clear();
+ }
+ }
+
+ }
+
+ /**
+ * Begins the sample
+ */
+ public void startSample() {
+ if (!isBenchmarkingEnabled()) return;
+ startSample(System.nanoTime());
+ }
+
+ public void startSample(long time) {
+ if (!isBenchmarkingEnabled()) return;
+ startTime = time;
+ }
+
+ public void samplePoint() {
+ if (!isBenchmarkingEnabled()) return;
+ samplePoint(System.nanoTime());
+ }
+
+ /**
+ * Measures time between sample points
+ */
+ public void samplePoint(long time) {
+ if (!isBenchmarkingEnabled()) return;
+ if (startTime == Long.MIN_VALUE) {
+ // this is the first time samplePoint was called
+ startTime = time;
+ } else {
+ final long duration = (time - startTime) / 1000;
+ totalTime += duration;
+ if (duration > threshold) {
+ exceedCount++;
+ totalExceedAmount += threshold - duration;
+ }
+ if (duration > longestSample) {
+ longestSample = duration;
+ }
+ if (duration < shortestSample) {
+ shortestSample = duration;
+ }
+
+ totalSamples++;
+ startTime = time;
+ }
+ }
+
+ public boolean endSample() {
+ if (!isBenchmarkingEnabled()) return false;
+ return endSample(System.nanoTime());
+ }
+
+ /**
+ * Ends the sample. Measures the elapsed time between the start of the sample and the time this method is called.
+ */
+ public boolean endSample(long time) {
+ boolean exceeded = false;
+ if (!isBenchmarkingEnabled()) return exceeded;
+ final long duration = (time - startTime) / 1000;
+ totalTime += duration;
+ if (duration > threshold) {
+ exceedCount++;
+ totalExceedAmount += threshold - duration;
+ exceeded = true;
+ }
+ if (duration > longestSample) {
+ longestSample = duration;
+ }
+ if (duration < shortestSample) {
+ shortestSample = duration;
+ }
+
+ totalSamples++;
+ return exceeded;
+ }
+
+ /**
+ * @return the number of samples that exceeded the threshold
+ */
+ public long getExceedCount() {
+ return exceedCount;
+ }
+
+ /**
+ * @return the longest sample in microseconds
+ */
+ public long getLongestSample() {
+ return longestSample;
+ }
+
+ /**
+ * @return the threshold value in microseconds. If no threshold was set this will return <CODE>Long.MAX_VALUE</CODE>
+ */
+ public long getThreshold() {
+ return threshold;
+ }
+
+ /**
+ * @return the total samples taken
+ */
+ public long getTotalSamples() {
+ return totalSamples;
+ }
+
+ /**
+ * @return the average of the samples in microseconds
+ */
+ public long getAverage() {
+ if (totalSamples > 0) {
+ return totalTime / totalSamples;
+ } else {
+ return Long.MAX_VALUE;
+ }
+ }
+
+ /**
+ * @return the shortest sample taken in microseconds
+ */
+ public long getShortestSample() {
+ return shortestSample;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public long getAverageExceedAmount() {
+ if (exceedCount == 0) {
+ return 0;
+ }
+ return Math.abs(totalExceedAmount / exceedCount);
+ }
+
+ public static void main(String[] args) {
+ Benchmark bm = new Benchmark("unit test", 10000);
+
+ if (isBenchmarkingEnabled()) {
+ System.out.println("benchmarking is enabled");
+ } else {
+ System.out.println("benchmarking is disabled");
+ }
+
+ for (int i = 0; i < 1000; i++) {
+ bm.startSample();
+ try {
+ Thread.sleep((i % 2) == 0 ? 5 : 10);
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+ bm.endSample();
+ }
+
+ // Sorry Need to keep this java 1.4 compatible
+ Object[] formatArgs =
+ {new Long(bm.getTotalSamples()), new Float(bm.getLongestSample() / 1000),
+ new Float(bm.getShortestSample() / 1000), new Float(bm.getAverage() / 1000),
+ new Long(bm.getExceedCount())};
+ MessageFormat outmessage =
+ new MessageFormat(
+ "total samples: {0,number,integer}, max time: {1,number,integer}ms, min: {2,number,integer}ms, average: {3,number,integer}ms, exceed count: {4,number,integer}");
+
+ System.out.println(outmessage.format(formatArgs));
+
+ }
+
+ public String toString() {
+ return String.format("%s\t total samples: %d,\t average: %fms,\t max time: %f, min: %fms, exceed count: %d",
+ name, new Long(getTotalSamples()), new Float(getLongestSample() / 1000), new Float(
+ getShortestSample() / 1000), new Float(getAverage() / 1000), new Long(getExceedCount()));
+ }
+
+ public void addExceeder(String exceeder) {
+ Integer c = exceeders.get(exceeder);
+ if (c == null) {
+ exceeders.put(exceeder, 1);
+ } else {
+ exceeders.put(exceeder, c + 1);
+ }
+ }
+
+ public Collection<Map.Entry<String, Integer>> getExceeders() {
+ return exceeders.entrySet();
+ }
+
+ public static List<Benchmark> getAllBenchamrks() {
+ synchronized (list) {
+ return new ArrayList<Benchmark>(list);
+ }
+ }
+
+ public static void setBenchmarkingEnabled(boolean isEnabled) {
+ Benchmark.IS_BENCHMARKING_ENABLED = isEnabled;
+ }
+
+ public static boolean isBenchmarkingEnabled() {
+ return Benchmark.IS_BENCHMARKING_ENABLED;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/Pawprint.jpg b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/Pawprint.jpg
new file mode 100644
index 00000000000..06752a1ec52
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/Pawprint.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/done.gif b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/done.gif
new file mode 100644
index 00000000000..e4247311cd1
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/done.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/go.gif b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/go.gif
new file mode 100644
index 00000000000..7b177f0035a
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/go.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/not_done.gif b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/not_done.gif
new file mode 100644
index 00000000000..68d265f91b6
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/images/not_done.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CharBackedInputStream.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CharBackedInputStream.java
new file mode 100644
index 00000000000..77b9500d5d7
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CharBackedInputStream.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.util.LinkedList;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CharBackedInputStream extends InputStream implements Appendable {
+ private final LinkedList<ByteBuffer> backers;
+ private ByteBuffer currentBacker;
+ private final CharsetEncoder encoder;
+ private Writer writer;
+
+ /**
+ * @author Ryan D. Brooks
+ */
+ public class InputStreamWriter extends Writer {
+
+ public InputStreamWriter() {
+ super();
+ }
+
+ /**
+ * @param lock
+ */
+ public InputStreamWriter(Object lock) {
+ super(lock);
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Writer#write(char[], int, int)
+ */
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ addBackingSource(cbuf, off, len);
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Flushable#flush()
+ */
+ @Override
+ public void flush() throws IOException {
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Closeable#close()
+ */
+ @Override
+ public void close() throws IOException {
+ }
+
+ public void write(CharSequence str) throws CharacterCodingException {
+ addBackingSource(str);
+ }
+
+ @Override
+ public void write(String str, int off, int len) throws CharacterCodingException {
+ addBackingSource(str, off, len);
+ }
+ }
+
+ /**
+ * @throws CharacterCodingException
+ */
+ public CharBackedInputStream(CharBuffer source, String encodingName) throws CharacterCodingException {
+ super();
+ this.encoder = Charset.forName(encodingName).newEncoder();
+ this.backers = new LinkedList<ByteBuffer>();
+ if (source != null) {
+ addBackingSource(source);
+ }
+ }
+
+ public CharBackedInputStream() throws CharacterCodingException {
+ this((CharBuffer) null, "UTF-8");
+ }
+
+ public CharBackedInputStream(CharSequence backingStr) throws CharacterCodingException {
+ this(backingStr, "UTF-8");
+ }
+
+ public CharBackedInputStream(char[] backingChars) throws CharacterCodingException {
+ this(backingChars, "UTF-8");
+ }
+
+ public CharBackedInputStream(char[] backingChars, String encodingName) throws CharacterCodingException {
+ this(CharBuffer.wrap(backingChars), encodingName);
+ }
+
+ public CharBackedInputStream(CharSequence backingStr, String encodingName) throws CharacterCodingException {
+ this(CharBuffer.wrap(backingStr), encodingName);
+ }
+
+ public void addBackingSource(CharSequence backingStr) throws CharacterCodingException {
+ addBackingSource(CharBuffer.wrap(backingStr));
+ }
+
+ public void addBackingSource(CharSequence backingStr, int off, int len) throws CharacterCodingException {
+ addBackingSource(CharBuffer.wrap(backingStr.subSequence(off, len + off)));
+ }
+
+ public void addBackingSource(char[] chars, int off, int len) throws CharacterCodingException {
+ addBackingSource(CharBuffer.wrap(chars, off, len));
+ }
+
+ public void addBackingSource(char[] chars) throws CharacterCodingException {
+ addBackingSource(CharBuffer.wrap(chars));
+ }
+
+ public void addBackingSource(CharBuffer source) throws CharacterCodingException {
+ ByteBuffer buffer = encoder.encode(source);
+ if (currentBacker == null) {
+ currentBacker = buffer;
+ } else {
+ backers.add(buffer);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.io.InputStream#read()
+ */
+ @Override
+ public int read() throws IOException {
+ if (currentBacker == null) {
+ return -1;
+ }
+ try {
+ return currentBacker.get();
+ } catch (BufferUnderflowException ex) {
+ currentBacker = backers.poll();
+ return read();
+ }
+ }
+
+ /**
+ * @return Returns the writer.
+ */
+ public Writer getWriter() {
+ if (writer == null) {
+ writer = new InputStreamWriter();
+ }
+ return writer;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Appendable#append(java.lang.CharSequence)
+ */
+ public Appendable append(CharSequence csq) throws IOException {
+ addBackingSource(csq);
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Appendable#append(java.lang.CharSequence, int, int)
+ */
+ public Appendable append(CharSequence csq, int start, int end) throws IOException {
+ addBackingSource(csq, start, end - start);
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Appendable#append(char)
+ */
+ public Appendable append(char c) throws IOException {
+ throw new UnsupportedOperationException(
+ "doing this one character at a time would be so inefficient it would defeat the whole purpose of this class");
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.InputStream#available()
+ */
+ @Override
+ public int available() throws IOException {
+ int count = 0;
+ for (ByteBuffer backer : backers) {
+ count += backer.array().length;
+ }
+ return count;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CsvReader.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CsvReader.java
new file mode 100644
index 00000000000..0260cf9e3ef
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/CsvReader.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.framework.jdk.core.util.io;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StreamTokenizer;
+import java.util.Arrays;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CsvReader {
+ private Reader reader;
+ private StreamTokenizer streamTokenizer;
+ private boolean[] fieldsUsed;
+ private int fieldCount;
+ private String[] nextRow;
+
+ /**
+ * @param file a comma separate value file
+ * @param totalNumFields the largest number of fields on any row (whether they are used or not)
+ * @param enabled whether to enable or disable all the feilds initially
+ * @throws IOException
+ */
+ public CsvReader(File file, int totalNumFields, boolean enabled) throws IOException {
+ this(new BufferedReader(new FileReader(file)), totalNumFields, enabled);
+ }
+
+ /**
+ * All fields will be enabled initially
+ *
+ * @param file a comma separate value file
+ * @param totalNumFields the largest number of fields on any row (whether they are used or not)
+ * @throws IOException
+ */
+ public CsvReader(File file, int totalNumFields) throws IOException {
+ this(new BufferedReader(new FileReader(file)), totalNumFields);
+ }
+
+ public CsvReader(Reader reader, int totalNumFields) throws IOException {
+ this(reader, totalNumFields, true);
+ }
+
+ public CsvReader(Reader reader, int totalNumFields, boolean enabled) throws IOException {
+ this.reader = reader;
+ this.streamTokenizer = new StreamTokenizer(reader);
+ this.fieldsUsed = new boolean[totalNumFields];
+ Arrays.fill(fieldsUsed, enabled);
+ countFieldsUsed();
+
+ streamTokenizer.resetSyntax();
+ streamTokenizer.eolIsSignificant(true);
+ streamTokenizer.whitespaceChars(0, ' ' - 1);
+ streamTokenizer.wordChars(' ', 255); // make all non-white space characters part of the returned string
+ streamTokenizer.ordinaryChar(','); // except the delimiter ','
+ streamTokenizer.quoteChar('\"'); // and the quote char
+
+ getRow(); //prime so hasNext might return true (and getRow will return the first row the next time it is called)
+ }
+
+ private void countFieldsUsed() {
+ this.fieldCount = 0;
+ for (int i = 0; i < fieldsUsed.length; i++) {
+ if (fieldsUsed[i]) {
+ fieldCount++;
+ }
+ }
+ }
+
+ /**
+ * inclusive range
+ *
+ * @param start
+ * @param end
+ * @param enable
+ */
+ public void setFieldsEnabled(int start, int end, boolean enable) {
+ for (int i = start; i <= end; i++) {
+ setFieldEnabled(i, enable);
+ }
+ }
+
+ public void setFieldEnabled(int index, boolean enable) {
+ fieldsUsed[index] = enable;
+ countFieldsUsed();
+ }
+
+ public String[] getRow() throws IOException {
+ String[] rowToReturn = nextRow;
+ this.nextRow = getRowInternal();
+ return rowToReturn;
+ }
+
+ public boolean hasNext() {
+ return nextRow != null;
+ }
+
+ public void skipHeaderRow() throws IOException {
+ getRow();
+ }
+
+ /**
+ * @return an array
+ * @throws IOException
+ */
+ private String[] getRowInternal() throws IOException {
+ String[] values = new String[fieldCount];
+ int fieldIndex = 0;
+ int valuesIndex = 0;
+ while (streamTokenizer.nextToken() != StreamTokenizer.TT_EOL) {
+ if (streamTokenizer.ttype == ',') {
+ if (fieldsUsed[fieldIndex]) {
+ valuesIndex++; // accounts for fields that are used even if they are empty (i.e. two consecutive commas)
+ }
+ fieldIndex++;
+ } else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD || streamTokenizer.ttype == '\"') {
+ if (fieldsUsed[fieldIndex]) {
+ values[valuesIndex] = streamTokenizer.sval;
+ }
+ } else if (streamTokenizer.ttype == StreamTokenizer.TT_EOF) {
+ return null;
+ } else {
+ throw new IllegalArgumentException("The token type was: " + streamTokenizer.ttype);
+ }
+ }
+ return values;
+ }
+
+ public void close() {
+ try {
+ reader.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/DriveType.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/DriveType.java
new file mode 100644
index 00000000000..e1893f48c60
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/DriveType.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.framework.jdk.core.util.io;
+
+public enum DriveType {
+ Unknown((short) 0), NoRootDirectory((short) 1), Removable((short) 2), // Floppy, Zip, etc
+ Fixed((short) 3), // Hard disk
+ Remote((short) 4), // Network drive
+ CdRom((short) 5),
+ RamDrive((short) 6);
+
+ private final short value;
+
+ DriveType(short value) {
+ this.value = value;
+ }
+
+ /**
+ * @return Returns the value.
+ */
+ public short getValue() {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/EnumBaseBuilder.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/EnumBaseBuilder.java
new file mode 100644
index 00000000000..6c42fb0b2dd
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/EnumBaseBuilder.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.framework.jdk.core.util.io;
+
+import java.util.Comparator;
+import java.util.PriorityQueue;
+
+/**
+ * @author Robert A. Fisher
+ * @deprecated
+ */
+@Deprecated
+public class EnumBaseBuilder extends JavaFileBuilder {
+
+ protected PriorityQueue<EnumRecord> enums;
+
+ private static final String stringTableMethod =
+ "\tprotected String[] getStringTable() {\n" + "\t\treturn stringTable;\n" + "\t}";
+ private static final String enumTableMethod =
+ "\tprotected EnumSyntax[] getEnumValueTable() {\n" + "\t\treturn enumValueTable;\n" + "\t}";
+
+ public EnumBaseBuilder(String packageName, String className, String classJavaDoc) {
+ super(packageName, className, classJavaDoc, "EnumBase");
+
+ // Place the enums in a priority queue based on their number value
+ enums = new PriorityQueue<EnumRecord>(20, new Comparator<EnumRecord>() {
+
+ public int compare(EnumRecord i, EnumRecord j) {
+ return i.number - j.number;
+ }
+
+ });
+
+ addMethod(getGetEnum());
+ addMethod(getToEnum1());
+ addMethod(getToEnum2());
+ addMethod(stringTableMethod);
+ addMethod(enumTableMethod);
+ }
+
+ public void addEnum(String name, int enumNumber) {
+ addEnum(name, enumNumber, null);
+ }
+
+ public void addEnum(String name, int enumNumber, String additionalValues) {
+ addField(new Field(className, name, true, true, true, getInitialValue(enumNumber, additionalValues)));
+ enums.offer(new EnumRecord(enumNumber, name));
+ }
+
+ protected String getBasicConstructor() {
+ return "\tprotected " + className + "(int value) {\n" + "\t\tsuper(value);\n" + "\t}";
+ }
+
+ private String getInitialValue(int enumNumber, String additionalValues) {
+ return "new " + className + "(" + enumNumber + ((additionalValues != null) ? "," + additionalValues : "") + ")";
+ }
+
+ private String getGetEnum() {
+ return "\tpublic static " + className + " getEnum(String str) {\n" + "\t\treturn (" + className + ") getEnum(str, stringTable, enumValueTable);\n" + "\t}";
+ }
+
+ private String getToEnum1() {
+ return "\tpublic static " + className + " toEnum(int value) {\n" + "\t\treturn (" + className + ") getEnum(value, enumValueTable);\n" + "\t}";
+ }
+
+ private String getToEnum2() {
+ return "\tpublic static " + className + " toEnum(EnumBase otherEnum) {\n" + "\t\treturn toEnum(otherEnum.getValue());\n" + "\t}";
+ }
+
+ /*
+ * Add the fields from the parent, along with fields that have to be generated dynamically
+ * based on what enums have been added over the lifetime of this builder.
+ *
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.JavaFileBuilder#getFields(java.lang.StringBuilder)
+ */
+ @Override
+ protected void getFields(StringBuilder string) {
+ super.getFields(string);
+
+ // Get a copy of the priority queue, in case this is called many times
+ PriorityQueue<EnumRecord> records = new PriorityQueue<EnumRecord>(enums);
+
+ StringBuilder stringTable = new StringBuilder();
+ StringBuilder enumValueTable = new StringBuilder();
+
+ // This shoud start at one less than the first value since EnumBase accounts for non-zero based enums
+ int lastEnumVal = records.peek().number - 1;
+
+ // Start the declarations for the two necessary fields
+ stringTable.append("\tprivate static final String[] stringTable = new String[] {");
+ enumValueTable.append("\tprivate static final " + className + "[] enumValueTable = new " + className + "[] {");
+
+ EnumRecord record;
+ // Pop each of the records from the queue
+ while ((record = records.poll()) != null) {
+
+ // Fill skipped values in the enum listing with null references
+ for (int x = lastEnumVal; x < (record.number - 1); x++) {
+ stringTable.append("null, ");
+ enumValueTable.append("null, ");
+ }
+
+ stringTable.append("\"" + record.name + "\"");
+ enumValueTable.append(record.name);
+
+ // If there are more items, then add a comma
+ if (!records.isEmpty()) {
+ stringTable.append(", ");
+ enumValueTable.append(", ");
+ }
+
+ lastEnumVal = record.number;
+ }
+
+ stringTable.append("};\n");
+ enumValueTable.append("};\n");
+
+ string.append(stringTable.toString());
+ string.append(enumValueTable.toString());
+ }
+
+ private class EnumRecord {
+ private int number;
+ private String name;
+
+ /**
+ * @param number The ordinal value of the enumeration
+ * @param name The declarartion name of the enumeration
+ */
+ public EnumRecord(int number, String name) {
+ this.number = number;
+ this.name = name;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the number.
+ */
+ public int getNumber() {
+ return number;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/ExtensionFilter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/ExtensionFilter.java
new file mode 100644
index 00000000000..117ad3c5abf
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/ExtensionFilter.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.framework.jdk.core.util.io;
+
+import java.io.File;
+import java.io.FileFilter;
+
+/**
+ * Filter for filtering files that end with a specific string.
+ *
+ * @author Robert A. Fisher
+ */
+public class ExtensionFilter implements FileFilter {
+ private final String extension;
+
+ /**
+ * @param extension The string to match the end of the filenames against.
+ * @throws IllegalArgumentException if <code>extension</code> is null.
+ */
+ public ExtensionFilter(String extension) {
+ if (extension == null) throw new IllegalArgumentException("extension must not be null");
+ this.extension = extension;
+ }
+
+ public boolean accept(File file) {
+ return file.isFile() && file.getName().endsWith(extension);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IEnumValueBuilder.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IEnumValueBuilder.java
new file mode 100644
index 00000000000..059504beb2e
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IEnumValueBuilder.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.framework.jdk.core.util.io;
+
+import java.util.Comparator;
+import java.util.PriorityQueue;
+
+/**
+ * Started with EnumBaseBuilder and made modifications for IEnumValue
+ *
+ * @author Cindy Maher
+ */
+public class IEnumValueBuilder extends JavaFileBuilder {
+
+ protected PriorityQueue<EnumRecord> enums;
+
+ public IEnumValueBuilder(String packageName, String className, String classJavaDoc) {
+ super(packageName, className, classJavaDoc, null);
+
+ // Place the enums in a priority queue based on their number value
+ enums = new PriorityQueue<EnumRecord>(20, new Comparator<EnumRecord>() {
+
+ public int compare(EnumRecord i, EnumRecord j) {
+ return i.number - j.number;
+ }
+
+ });
+
+ addMethod(getBasicConstructor());
+ addMethod(getGetIntValue());
+ addMethod(getToEnum());
+ addMethod(getGetToEnum());
+ }
+
+ public void addEnum(String name, int enumNumber) {
+ addEnumField(new EnumRecord(enumNumber, name));
+ }
+
+ protected String getBasicConstructor() {
+ return "\tprivate int value;\n\n" + "\tprivate " + className + "(int value) {\n" + "\t\tthis.value = value;\n" + "\t}\n";
+ }
+
+ private String getGetIntValue() {
+ return "\tpublic int getIntValue() {\n" + "\t\treturn value;\n" + "\t}\n";
+ }
+
+ private String getToEnum() {
+ return "\tpublic static " + className + " toEnum(int value) {\n" + "\t\tfor (" + className + " myEnum : " + className + ".values()) {\n" + "\t\t\tif (myEnum.getIntValue() == value) {\n" + "\t\t\t\treturn myEnum;\n" + "\t\t\t}\n" + "\t\t}\n" + "\t\tthrow new IllegalArgumentException(\"Unable to find " + className + " with value \" + value + \".\");\n" + "\t}\n";
+ }
+
+ private String getGetToEnum() {
+ return "\tpublic static " + className + " getEnum(String enumString) {\n" + "\t\tfor (" + className + " myEnum : " + className + ".values()) {\n" + "\t\t\tif (" + className + ".valueOf(enumString) == myEnum) {\n" + "\t\t\t\treturn myEnum;\n" + "\t\t\t}\n" + "\t\t}\n" + "\t\tthrow new IllegalArgumentException(\"Unable to find " + className + " to match \" + enumString + \".\");\n" + "\t}\n";
+ }
+
+ public class EnumRecord {
+ private int number;
+ private String name;
+
+ /**
+ * @param number The ordinal value of the enumeration
+ * @param name The declaration name of the enumeration
+ */
+ public EnumRecord(int number, String name) {
+ this.number = number;
+ this.name = name;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the number.
+ */
+ public int getNumber() {
+ return number;
+ }
+
+ @Override
+ public String toString() {
+ String enumStr = name + "(" + number + ")";
+ return enumStr;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOInputThread.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOInputThread.java
new file mode 100644
index 00000000000..e23eaa6e99c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOInputThread.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.framework.jdk.core.util.io;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class IOInputThread extends Thread {
+
+ private Reader input;
+ private BufferedWriter output;
+
+ /**
+ *
+ */
+ public IOInputThread(Reader input, BufferedWriter output) {
+ super();
+ this.output = output;
+ this.input = input;
+ }
+
+ public void run() {
+ int character;
+ try {
+ //*
+ while ((character = input.read()) != -1) {
+ output.write(character);
+ output.flush();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ input.close();
+ //output.flush();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOOutputThread.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOOutputThread.java
new file mode 100644
index 00000000000..0cc5ba56687
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IOOutputThread.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.framework.jdk.core.util.io;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class IOOutputThread extends Thread {
+
+ private Writer output;
+ private BufferedReader input;
+
+ /**
+ *
+ */
+ public IOOutputThread(Writer output, BufferedReader input, boolean verbose) {
+ super();
+ this.output = output;
+ this.input = input;
+ }
+
+ public IOOutputThread(Writer output, BufferedReader input) {
+ this(output, input, true);
+ }
+
+ public void run() {
+ try {
+ final char[] buffer = new char[4096];
+ int size;
+ while ((size = input.read(buffer)) != -1) {
+ output.write(buffer, 0, size);
+ output.flush();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ input.close();
+ output.flush();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IZipEntryCompleteCallback.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IZipEntryCompleteCallback.java
new file mode 100644
index 00000000000..f5d6a7a247d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/IZipEntryCompleteCallback.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.framework.jdk.core.util.io;
+
+public interface IZipEntryCompleteCallback {
+
+ void setValue(int i);
+
+ void setMinimum(int i);
+
+ void setMaximum(int i);
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/InputBufferThread.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/InputBufferThread.java
new file mode 100644
index 00000000000..072f39afe46
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/InputBufferThread.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.util.regex.MatchResult;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Sole purpose is to read input from a specified stream and save it into a buffer providing some access methods to the
+ * buffer.
+ *
+ * @author Michael P. Masterson
+ */
+public class InputBufferThread extends Thread {
+ private final byte[] charBuffer = new byte[1024];
+ private final InputStream input;
+ private final StringBuilder buffer;
+ private volatile boolean shouldStopRunning;
+ private long lastRead;
+
+ /**
+ * @param input The stream to read from
+ */
+ public InputBufferThread(InputStream input) {
+ super("Stream input buffer thread");
+ shouldStopRunning = false;
+ this.input = input;
+ buffer = new StringBuilder(8196);
+ }
+
+ /**
+ * Overridden Thread.run method. Reads from the input stream on character at a time until the end of available input
+ * or until the bold shouldStopRunning is set by an outside source.
+ */
+ public void run() {
+ System.out.println("thread started");
+ int count = 0;
+ try {
+ int size = input.read(charBuffer);
+ while (size >= 0) {
+ count++;
+ synchronized (this) {
+ lastRead = System.currentTimeMillis();
+ if (shouldStopRunning) {
+ break;
+ }
+ append(charBuffer, size);
+ }
+ size = input.read(charBuffer);
+ }
+ } catch (InterruptedIOException e) {
+ if (shouldStopRunning != true) {
+ // this is an error
+ e.printStackTrace(System.err);
+ }
+ } catch (IOException e) {
+ if (!shouldStopRunning) {
+ System.err.println("error at count " + count);
+ e.printStackTrace(System.err);
+ }
+ } finally {
+ try {
+ input.close();
+ } catch (IOException e) {
+ e.printStackTrace(System.out);
+ System.out.flush();
+ } finally {
+ // wake up anyone waiting for data or else they will be stuck forever
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+ }
+ }
+
+ /**
+ * Appends one character to the buffer.
+ *
+ * @param line The character to append
+ */
+ private void append(byte[] line, int size) {
+ buffer.append(new String(line, 0, size));
+ notify();
+ }
+
+ /**
+ * Checks if the string passed is contained in the buffer so far
+ *
+ * @param matcher The string to look for
+ * @return a positive value representing the index at which it was found or negative 1 if it was not found
+ */
+ public synchronized int contains(String matcher, boolean remove) {
+ int index = buffer.lastIndexOf(matcher);
+ if (remove && index >= 0) {
+ buffer.delete(0, index + matcher.length());
+ }
+ return index;
+ }
+
+ /**
+ * Checks if the string passed is contained in the buffer so far
+ *
+ * @param matcher The string to look for
+ * @return a positive value representing the index at which it was found or negative 1 if it was not found
+ */
+ public synchronized int contains(String matcher) {
+ return contains(matcher, false);
+ }
+
+ public synchronized int waitFor(String matcher, int millis) throws InterruptedException {
+ return waitFor(matcher, false, millis);
+ }
+
+ public synchronized int waitFor(String matcher, boolean remove, int millis) throws InterruptedException {
+ if (shouldStopRunning) {
+ throw new IllegalStateException("stream processing terminated");
+ }
+ long time = System.currentTimeMillis();
+ int result = contains(matcher, false);
+ long timeRemaining = millis;
+ while (result < 0 && timeRemaining > 0) {
+ wait(timeRemaining);
+ if (shouldStopRunning) {
+ // we were told to stop or the stream was closed on the other end
+ throw new InterruptedException("stream processing terminated");
+ }
+ result = contains(matcher, false);
+ timeRemaining = millis - (System.currentTimeMillis() - time);
+ }
+ if (remove && result >= 0) {
+ buffer.delete(0, result + matcher.length());
+ }
+ return result;
+ }
+
+ public synchronized MatchResult waitFor(Pattern pattern, boolean remove, int millis) throws InterruptedException {
+ if (shouldStopRunning) {
+ throw new IllegalStateException("stream processing terminated");
+ }
+ Matcher matcher = pattern.matcher(buffer.toString());
+ long time = System.currentTimeMillis();
+ long timeRemaining = millis;
+ boolean result = matcher.matches();
+ while (!result && timeRemaining > 0) {
+ wait(timeRemaining);
+ if (shouldStopRunning) {
+ // we were told to stop or the stream was closed on the other end
+ throw new InterruptedException("stream processing terminated");
+ }
+ matcher = matcher.reset(buffer.toString());
+ result = matcher.matches();
+ timeRemaining = millis - (System.currentTimeMillis() - time);
+ }
+ if (remove && result) {
+ buffer.delete(0, matcher.end());
+ }
+ return result ? matcher.toMatchResult() : null;
+ }
+
+ /**
+ * @param millis
+ * @return true if a transmission occurred false otherwise
+ * @throws InterruptedException
+ */
+ public synchronized boolean waitFor(int millis) throws InterruptedException {
+ if (shouldStopRunning) {
+ throw new IllegalStateException("stream processing terminated");
+ }
+
+ long currentTime = System.currentTimeMillis();
+ long savedLastRead = lastRead;
+ while (savedLastRead != lastRead) {
+ wait(millis);
+ // make sure we did not reach ourr timeout limit, also we need to handle potential 'spurious' wakeups
+ long next = System.currentTimeMillis();
+ millis -= next - currentTime;
+ currentTime = next;
+ if (savedLastRead == lastRead && millis <= 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @return The entire buffered input.
+ */
+ public synchronized String getBuffer() {
+ return buffer.toString();
+ }
+
+ public synchronized String subString(int beginIndex) {
+ return buffer.substring(beginIndex);
+ }
+
+ public synchronized String subString(int beginIndex, int endIndex) {
+ return buffer.substring(beginIndex, endIndex);
+ }
+
+ /**
+ * @return The entire buffered input.
+ */
+ public synchronized int getLength() {
+ return buffer.length();
+ }
+
+ /**
+ * Tells this thread whether to stop on the next cycle or not
+ *
+ * @param b True if the thread should stop on the next run cycle.
+ */
+ public void stopOnNextRun(boolean b) {
+ this.shouldStopRunning = b;
+ }
+
+ public void stopNow() throws InterruptedException {
+ this.shouldStopRunning = true;
+ interrupt();
+ join(5000);
+ }
+
+ public long getLastRead() {
+ if (lastRead == 0)
+ return System.currentTimeMillis();
+ else
+ return lastRead;
+ }
+
+ public synchronized void clear() {
+ buffer.delete(0, buffer.length());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/JavaFileBuilder.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/JavaFileBuilder.java
new file mode 100644
index 00000000000..e92cb713b32
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/JavaFileBuilder.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.io;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.io.IEnumValueBuilder.EnumRecord;
+
+/**
+ * Allows java files to be built dynamically and written out to disk.
+ *
+ * @author Robert A. Fisher
+ */
+public class JavaFileBuilder {
+ protected String packageName;
+ protected String className;
+ protected String classJavaDoc;
+ protected String extendsClass;
+ private ArrayList<String> interfaces;
+ private List<Field> fields;
+ private List<String> imports;
+ private List<String> methods;
+ private List<EnumRecord> enumFields;
+
+ /**
+ * Create a JavaFileBuilder for a class.
+ *
+ * @param className The class of the file.
+ */
+ public JavaFileBuilder(String className) {
+ this(null, className, null, null);
+ }
+
+ /**
+ * Constructor
+ */
+ public JavaFileBuilder(String packageName, String className, String classJavaDoc, String extendsClass) {
+ this.packageName = packageName;
+ this.className = className;
+ this.classJavaDoc = classJavaDoc;
+ this.extendsClass = extendsClass;
+ interfaces = new ArrayList<String>();
+ fields = new LinkedList<Field>();
+ imports = new LinkedList<String>();
+ methods = new LinkedList<String>();
+ enumFields = new LinkedList<EnumRecord>();
+ }
+
+ public void addInterface(String interfaceName) {
+ interfaces.add(interfaceName);
+ }
+
+ public void addField(Field field) {
+ fields.add(field);
+ }
+
+ public void addEnumField(EnumRecord enumField) {
+ enumFields.add(enumField);
+ }
+
+ public void addImport(String importName) {
+ imports.add(importName);
+ }
+
+ public void addMethod(String method) {
+ methods.add(method);
+ }
+
+ /**
+ * @param classJavaDoc The classJavaDoc to set.
+ */
+ public void setClassJavaDoc(String classJavaDoc) {
+ this.classJavaDoc = classJavaDoc;
+ }
+
+ /**
+ * @param className The className to set.
+ */
+ public void setClassName(String className) {
+ this.className = className;
+ }
+
+ /**
+ * @param extendsClass The extendsClass to set.
+ */
+ public void setExtendsClass(String extendsClass) {
+ this.extendsClass = extendsClass;
+ }
+
+ /**
+ * @param packageName The packageName to set.
+ */
+ public void setPackageName(String packageName) {
+ this.packageName = packageName;
+ }
+
+ /**
+ * Write the file out to disk. The file will be written to the specified directory. By virtue of Java, the filename
+ * will be the name of the class with .java as the extension.
+ *
+ * @throws FileNotFoundException
+ */
+ public void write(File directory) throws FileNotFoundException {
+ if (!directory.isDirectory()) throw new IllegalArgumentException("Supplied file is not a directory");
+
+ PrintWriter out = new PrintWriter(new File(directory, className + ".java"));
+
+ out.write(this.toString());
+
+ out.close();
+ }
+
+ public static class Field {
+ private boolean isPublic;
+ private boolean isFinal;
+ private boolean isStatic;
+ private String type;
+ private String name;
+ private String initialValue;
+
+ public Field(String type, String name, boolean isFinal) {
+ this(type, name, false, false, isFinal);
+ }
+
+ public Field(String type, String name, boolean isPublic, boolean isStatic, boolean isFinal) {
+ this(type, name, isPublic, isStatic, isFinal, null);
+ }
+
+ /**
+ * @param type The type of the field
+ * @param name The name of the field
+ * @param isPublic Whether the field should be declared as public
+ * @param isStatic Whether the field should be declared as static
+ * @param isFinal Whether the field should be declared as final
+ * @param initialValue An initial value to set the field to.
+ */
+ public Field(String type, String name, boolean isPublic, boolean isStatic, boolean isFinal, String initialValue) {
+ this.type = type;
+ this.name = name;
+ this.isPublic = isPublic;
+ this.isStatic = isStatic;
+ this.isFinal = isFinal;
+ this.initialValue = initialValue;
+ }
+
+ @Override
+ public String toString() {
+ String declaration =
+ "\t" + ((isPublic) ? "public " : "private ") + ((isStatic) ? "static " : "") + ((isFinal) ? "final " : "") + type + " " + name;
+
+ if (initialValue != null) declaration += " = " + initialValue;
+ return declaration + ";";
+ }
+
+ /**
+ * @return Returns the isPublic.
+ */
+ public boolean isPublic() {
+ return isPublic;
+ }
+
+ /**
+ * @return Returns the isStatic.
+ */
+ public boolean isStatic() {
+ return isStatic;
+ }
+
+ /**
+ * @return Returns the isFinal.
+ */
+ public boolean isFinal() {
+ return isFinal;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the type.
+ */
+ public String getType() {
+ return type;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ StringBuilder string = new StringBuilder();
+
+ SimpleDateFormat dateFormat = new SimpleDateFormat("MMMM d, yyyy");
+
+ // Add the head comment for the file
+ string.append("/*\n * Created on " + dateFormat.format(new Date()) + "\n *\n * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE\n */\n\n");
+ string.append("package " + packageName + ";");
+ string.append("\n\n");
+
+ // Add all of the imports
+ for (String importName : imports) {
+ string.append("import " + importName + ";\n");
+ }
+
+ string.append("\n");
+
+ // Add the class comment if it is available
+ if (classJavaDoc != null) {
+ string.append(stringToJavadoc(classJavaDoc));
+ }
+
+ // add the start of the class
+ // Check to see if this is an IEnumValue file
+ if (interfaces.size() != 0 && interfaces.get(0).equals("IEnumValue") && extendsClass == null) {
+ string.append("public enum " + className + " implements IEnumValue");
+ string.append(" {\n");
+ getEnumFields(string);
+ } else {
+ string.append("public class " + className + ((extendsClass == null) ? "" : " extends " + extendsClass.trim()));
+ for (int i = 0; i < interfaces.size(); i++) {
+ if (i == 0)
+ string.append(" implements " + interfaces.get(i));
+ else
+ string.append(", " + interfaces.get(i));
+ }
+ string.append(" {\n");
+ getFields(string);
+ }
+
+ getMethods(string);
+
+ // add the end of the file
+ string.append("}");
+
+ return string.toString();
+ }
+
+ protected void getFields(StringBuilder string) {
+ for (Field field : fields)
+ string.append(field.toString() + "\n");
+ }
+
+ protected void getEnumFields(StringBuilder string) {
+ Iterator<EnumRecord> enumFieldsIter = enumFields.iterator();
+ while (enumFieldsIter.hasNext()) {
+ EnumRecord eField = enumFieldsIter.next();
+ string.append("\t" + eField);
+ if (!enumFieldsIter.hasNext())
+ string.append(";\n\n");
+ else
+ string.append(",\n");
+ }
+
+ }
+
+ protected void getMethods(StringBuilder string) {
+ for (String method : methods)
+ string.append(method + "\n");
+ }
+
+ private String stringToJavadoc(String string) {
+ return "/**\n" + string.replaceAll("^", " * ").replaceAll("\n", "\n * ") + "\n */\n";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/LnkWriter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/LnkWriter.java
new file mode 100644
index 00000000000..840c6d535a4
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/LnkWriter.java
@@ -0,0 +1,826 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.io;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Provides a way to produce simple lnk files.
+ *
+ * @author Robert A. Fisher
+ */
+public class LnkWriter {
+
+ private String description;
+ private String longName;
+ private String shortName;
+ private char shareDriveLetter;
+ private String shareName;
+ private String relativePath;
+ private String commandLineArguments;
+ private String iconFilename;
+ private String volumeLabel;
+ private String workingDirectory;
+ private String localPath;
+ private String finalPath;
+ private int iconNumber;
+ private int fileLength;
+ private int volumeSerialNumber;
+ private DriveType driveType;
+
+ private static final int DWORD = 4; // A dword is 4 bytes
+
+ private static byte MAGIC_VAL[] = new byte[] {0x4C, 0x00, 0x00, 0x00};
+ private static byte GUID[] =
+ new byte[] {0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x46};
+
+ public LnkWriter() {
+ this.description = null;
+ this.longName = null;
+ this.shortName = null;
+ this.shareName = null;
+ this.relativePath = null;
+ this.commandLineArguments = null;
+ this.iconFilename = null;
+ this.volumeLabel = null;
+ this.workingDirectory = null;
+ this.localPath = null;
+ this.finalPath = null;
+ this.iconNumber = 0;
+ this.fileLength = 0;
+ this.volumeSerialNumber = 0;
+ this.driveType = DriveType.Unknown;
+ }
+
+ /**
+ * @param commandLineArguments The commandLineArguments to set.
+ */
+ public void setCommandLineArguments(String commandLineArguments) {
+ this.commandLineArguments = commandLineArguments;
+ }
+
+ /**
+ * @param description The description to set.
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * @param driveType The driveType to set.
+ */
+ public void setDriveType(DriveType driveType) {
+ this.driveType = driveType;
+ }
+
+ /**
+ * @param fileLength The fileLength to set.
+ */
+ public void setFileLength(int fileLength) {
+ this.fileLength = fileLength;
+ }
+
+ /**
+ * @param finalPath The finalPath to set.
+ */
+ public void setFinalPath(String finalPath) {
+ this.finalPath = finalPath;
+ }
+
+ /**
+ * @param iconFilename The iconFilename to set.
+ */
+ public void setIconFilename(String iconFilename) {
+ this.iconFilename = iconFilename;
+ }
+
+ /**
+ * @param iconNumber The iconNumber to set.
+ */
+ public void setIconNumber(int iconNumber) {
+ this.iconNumber = iconNumber;
+ }
+
+ /**
+ * @param localPath The localPath to set.
+ */
+ public void setLocalPath(String localPath) {
+ this.localPath = localPath;
+ }
+
+ /**
+ * @param longName The longName to set.
+ */
+ public void setLongName(String longName) {
+ this.longName = longName;
+ }
+
+ /**
+ * @param shareName The networkShare to set.
+ */
+ public void setShareName(String shareName, char driveLetter) {
+ this.shareName = shareName;
+ this.shareDriveLetter = driveLetter;
+ }
+
+ /**
+ * @param relativePath The relativePath to set.
+ */
+ public void setRelativePath(String relativePath) {
+ this.relativePath = relativePath;
+ }
+
+ /**
+ * @param shortName The shortName to set.
+ */
+ public void setShortName(String shortName) {
+ this.shortName = shortName;
+ }
+
+ /**
+ * @param volumeLabel The volumeLabel to set.
+ */
+ public void setVolumeLabel(String volumeLabel) {
+ this.volumeLabel = volumeLabel;
+ }
+
+ /**
+ * @param volumeSerialNumber The volumeSerialNumber to set.
+ */
+ public void setVolumeSerialNumber(int volumeSerialNumber) {
+ this.volumeSerialNumber = volumeSerialNumber;
+ }
+
+ /**
+ * @param workingDirectory The workingDirectory to set.
+ */
+ public void setWorkingDirectory(String workingDirectory) {
+ this.workingDirectory = workingDirectory;
+ }
+
+ public static void writeOsee(String shortcutName) throws IOException {
+ writeFile(shortcutName, OSEE);
+ }
+
+ public static void writeOseeMs(String shortcutName) throws IOException {
+ writeFile(shortcutName, OSEE_MS);
+ }
+
+ private static void writeFile(String name, byte[] data) throws IOException {
+ File outfile = new File(name);
+ FileOutputStream out;
+ out = new FileOutputStream(outfile);
+
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ byteOut.write(data);
+ byteOut.writeTo(out);
+ out.close();
+ }
+
+ public void write(String shortcutName) {
+
+ File outfile = new File(shortcutName);
+ FileOutputStream out;
+ try {
+ out = new FileOutputStream(outfile);
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ return;
+ }
+
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ try {
+ byteOut.write(MAGIC_VAL);
+ byteOut.write(GUID);
+ byteOut.write(getTheFlags());
+ byteOut.write(getFileAttributes());
+ byteOut.write(getTimeFields());
+ byteOut.write(getFileLength());
+ byteOut.write(getIconNumber());
+ byteOut.write(getShowWnd());
+ byteOut.write(getHotKey());
+ byteOut.write(new byte[2 * DWORD]); // There is a 2 DWORD bubble in the format
+ byteOut.write(getShellItemIdList());
+ byteOut.write(getFileLocationInfo());
+ if (description != null) byteOut.write(getStringByteData(description));
+ if (relativePath != null) byteOut.write(getStringByteData(relativePath));
+ if (workingDirectory != null) byteOut.write(getStringByteData(workingDirectory));
+ if (commandLineArguments != null) byteOut.write(getStringByteData(commandLineArguments));
+ if (iconFilename != null) byteOut.write(getStringByteData(iconFilename));
+ byteOut.write(intToByteArray(0)); // End stuff ...
+ byteOut.writeTo(out);
+ out.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return;
+ }
+ }
+
+ private byte[] getTheFlags() {
+ // The flags field is one DWORD
+ byte data[] = new byte[DWORD];
+
+ // This will always be the case
+ data[0] |= 1 << 0; // Points to a file or directory
+
+ if (description != null) data[0] |= 1 << 1; // Has a description string
+ if (relativePath != null) data[0] |= 1 << 2; // Has a relative path string
+ if (workingDirectory != null) data[0] |= 1 << 3; // Has a working directory string
+ if (commandLineArguments != null) data[0] |= 1 << 4; // Has command line arguments
+ if (iconFilename != null) data[0] |= 1 << 5; // Has a custom icon
+ return data;
+ }
+
+ private byte[] getFileAttributes() {
+ // The file attributes field is one DWORD
+ byte data[] = new byte[DWORD];
+
+ // Nothing set here yet
+
+ return data;
+ }
+
+ private byte[] getTimeFields() {
+ // The 3 time fields are 64 bits each
+ byte data[] = new byte[3 * 8];
+
+ // Nothing to set here yet
+
+ return data;
+ }
+
+ private byte[] getFileLength() {
+ return intToByteArray(fileLength);
+ }
+
+ private byte[] getIconNumber() {
+ return intToByteArray(iconNumber);
+ }
+
+ private byte[] getShowWnd() {
+
+ // SW_NORMAL = 1
+ // SW_SHOWMINIMIZED = 2
+ // SW_SHOWMAXIMIXED = 3
+ return intToByteArray(1);
+ }
+
+ private byte[] getHotKey() {
+ // No hot key setting yet
+ return intToByteArray(0);
+ }
+
+ private byte[] getShellItemIdList() {
+
+ // First must acquire all items that go within the table
+ byte shortNameString[] = getNullTerminatedBytes(shortName.getBytes());
+ byte longNameString[] = getNullTerminatedBytes(longName.getBytes());
+
+ // The table has 4.5 dword's in addition to the two strings
+ byte data[] = new byte[(int) (4.5 * DWORD) + shortNameString.length + longNameString.length];
+
+ // Put the length of the list (everything except this 2 bytes
+ System.arraycopy(shortToByteArray((short) (data.length - 2)), 0, data, 0 * DWORD, 2);
+
+ // Length of the first item (which is this whole block, minus one dword
+ System.arraycopy(shortToByteArray((short) (data.length - DWORD)), 0, data, (int) (0.5 * DWORD), 2);
+
+ System.arraycopy(shortToByteArray((short) 0x32), 0, data, 1 * DWORD, 2); // Some mystical
+ // value
+ System.arraycopy(intToByteArray(fileLength), 0, data, (int) (1.5 * DWORD), 4);
+ System.arraycopy(intToByteArray(0x3E712576), 0, data, (int) (2.5 * DWORD), 4);// Some mystical
+ // value
+ System.arraycopy(shortToByteArray((short) (0x20)), 0, data, (int) (3.5 * DWORD), 2);// Some
+ // mystical
+ // value
+
+ // Place the longname string in now
+ System.arraycopy(longNameString, 0, data, 4 * DWORD, longNameString.length);
+
+ // Place the shortname string right after the longname
+ System.arraycopy(shortNameString, 0, data, 4 * DWORD + longNameString.length, shortNameString.length);
+
+ return data;
+ }
+
+ private byte[] getFileLocationInfo() {
+ // First must acquire all tables that follow this structure
+ byte localVolumeTable[] = getLocalVolumeTable();
+ byte localPathString[] = (localPath != null) ? getNullTerminatedBytes(localPath.getBytes()) : new byte[0];
+ byte networkVolumeTable[] = getNetworkVolumeTable();
+ byte finalPathString[] = getNullTerminatedBytes(finalPath.getBytes());
+
+ // The file attributes field is seven DWORD's, plus the structures above
+ byte data[] =
+ new byte[7 * DWORD + localVolumeTable.length + localPathString.length + networkVolumeTable.length + finalPathString.length];
+
+ // This flag specifies whether local volume, and/or network volume data is available
+ int flags = 0;
+ if (localVolumeTable.length > 0) flags |= 0x1;
+ if (networkVolumeTable.length > 0) flags |= 0x2;
+
+ // Calculate the necessary offets
+ int localVolumeOffset = 7 * DWORD;
+ int localPathOffset = localVolumeOffset + localVolumeTable.length;
+ int networkVolumeOffset = localPathOffset + localPathString.length;
+ int finalPathOffset = networkVolumeOffset + networkVolumeTable.length;
+
+ // Put the length value in the first dword
+ System.arraycopy(intToByteArray(data.length), 0, data, 0 * DWORD, 4);
+
+ // Write the following words
+ System.arraycopy(intToByteArray(0x1C), 0, data, 1 * DWORD, 4); // First offset after this
+ // structure
+ System.arraycopy(intToByteArray(flags), 0, data, 2 * DWORD, 4);
+ System.arraycopy(intToByteArray(localVolumeOffset), 0, data, 3 * DWORD, 4);
+ System.arraycopy(intToByteArray(localPathOffset), 0, data, 4 * DWORD, 4);
+ System.arraycopy(intToByteArray(networkVolumeOffset), 0, data, 5 * DWORD, 4);
+ System.arraycopy(intToByteArray(finalPathOffset), 0, data, 6 * DWORD, 4);
+
+ // Write the referenced blocks
+ System.arraycopy(localVolumeTable, 0, data, localVolumeOffset, localVolumeTable.length);
+ System.arraycopy(localPathString, 0, data, localPathOffset, localPathString.length);
+ System.arraycopy(networkVolumeTable, 0, data, networkVolumeOffset, networkVolumeTable.length);
+ System.arraycopy(finalPathString, 0, data, finalPathOffset, finalPathString.length);
+
+ return data;
+ }
+
+ private byte[] getLocalVolumeTable() {
+ // If missing the label then don't put it in
+ if (volumeLabel == null) return new byte[0];
+
+ byte volumeLabelString[] = getNullTerminatedBytes(volumeLabel.getBytes());
+
+ // The first 4 dword's are static, then there is the volume label string
+ byte data[] = new byte[(4 * DWORD) + volumeLabelString.length];
+
+ // Put the length value in the first dword
+ System.arraycopy(intToByteArray((short) data.length), 0, data, 0 * DWORD, 4);
+
+ // Write the following words
+ System.arraycopy(intToByteArray(driveType.getValue()), 0, data, 1 * DWORD, 4);
+ System.arraycopy(intToByteArray(volumeSerialNumber), 0, data, 2 * DWORD, 4);
+ System.arraycopy(intToByteArray(0x10), 0, data, 3 * DWORD, 4);
+
+ // Place the string right after that
+ System.arraycopy(volumeLabelString, 0, data, 4 * DWORD, volumeLabelString.length);
+
+ return data;
+ }
+
+ private byte[] getNetworkVolumeTable() {
+ // If the network share is null, then no table
+ if (shareName == null) return new byte[0];
+
+ byte networkShareString[] = getNullTerminatedBytes(shareName.getBytes());
+
+ // The first 5 dword's are static, then there is the network share name, and drive letter
+ byte data[] = new byte[(5 * DWORD) + networkShareString.length + 3];
+
+ // Put the length value in the first dword
+ System.arraycopy(intToByteArray(data.length), 0, data, 0 * DWORD, 4);
+
+ // Write the following words
+ System.arraycopy(intToByteArray(0x2), 0, data, 1 * DWORD, 4);
+ System.arraycopy(intToByteArray(0x14), 0, data, 2 * DWORD, 4);
+ System.arraycopy(intToByteArray(0x0), 0, data, 3 * DWORD, 4);
+ System.arraycopy(intToByteArray(0x200), 0, data, 4 * DWORD, 4);
+
+ // Place the string right after that, then drive letter
+ System.arraycopy(networkShareString, 0, data, 5 * DWORD, networkShareString.length);
+ System.arraycopy(new byte[] {(byte) shareDriveLetter, ':'}, 0, data, data.length - 3, 2);
+
+ return data;
+ }
+
+ private byte[] getStringByteData(String theString) {
+ byte data[] = null;
+
+ if (theString != null) {
+ byte string[] = getNullTerminatedBytes(theString.getBytes());
+
+ // The first 2 bytes tell the size of the string
+ // The following space is the string itself
+ data = new byte[2 + string.length];
+
+ // Put the length value in the first 2 bytes
+ System.arraycopy(shortToByteArray((short) string.length), 0, data, 0, 2);
+
+ // Place the string right after that
+ System.arraycopy(string, 0, data, 2, string.length);
+ }
+
+ return data;
+ }
+
+ private byte[] getNullTerminatedBytes(byte string[]) {
+ // Need an array one larger for the null terminator
+ byte data[] = new byte[string.length + 1];
+
+ // Place the string into the new array
+ System.arraycopy(string, 0, data, 0, string.length);
+
+ return data;
+ }
+
+ private byte[] shortToByteArray(short val) {
+ byte data[] = new byte[2];
+
+ for (int i = 0; i < 2; i++)
+ data[i] = (byte) (0xFF & (val >> i * 8));
+
+ return data;
+ }
+
+ private byte[] intToByteArray(int val) {
+ byte data[] = new byte[4];
+
+ // 32 bit values seem to be in reverse order
+ for (int i = 0; i < 4; i++)
+ data[i] = (byte) (0xFF & (val >> i * 8));
+
+ return data;
+ }
+
+ // This is the binary for the OSEE lnk ;-)
+ private static final byte OSEE[] =
+ new byte[] {(byte) 0x4C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x14, (byte) 0x02,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xC0, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x46, (byte) 0xFB, (byte) 0x02, (byte) 0x00,
+ (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x54, (byte) 0x20, (byte) 0x6E,
+ (byte) 0x73, (byte) 0x3B, (byte) 0xF8, (byte) 0xC4, (byte) 0x01, (byte) 0xEE, (byte) 0xDF, (byte) 0x76,
+ (byte) 0x9A, (byte) 0xD4, (byte) 0x83, (byte) 0xC5, (byte) 0x01, (byte) 0x7C, (byte) 0xF6, (byte) 0xA1,
+ (byte) 0x69, (byte) 0x3B, (byte) 0xF8, (byte) 0xC4, (byte) 0x01, (byte) 0x5F, (byte) 0xC0, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x75, (byte) 0x00, (byte) 0x14,
+ (byte) 0x00, (byte) 0x1F, (byte) 0x50, (byte) 0xE0, (byte) 0x4F, (byte) 0xD0, (byte) 0x20, (byte) 0xEA,
+ (byte) 0x3A, (byte) 0x69, (byte) 0x10, (byte) 0xA2, (byte) 0xD8, (byte) 0x08, (byte) 0x00, (byte) 0x2B,
+ (byte) 0x30, (byte) 0x30, (byte) 0x9D, (byte) 0x19, (byte) 0x00, (byte) 0x23, (byte) 0x43, (byte) 0x3A,
+ (byte) 0x5C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x91, (byte) 0x65, (byte) 0x15, (byte) 0x00, (byte) 0x31, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xF3, (byte) 0x32, (byte) 0xCA, (byte) 0x7D,
+ (byte) 0x30, (byte) 0x00, (byte) 0x57, (byte) 0x49, (byte) 0x4E, (byte) 0x4E, (byte) 0x54, (byte) 0x00,
+ (byte) 0x00, (byte) 0x18, (byte) 0x00, (byte) 0x31, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0xE8, (byte) 0x32, (byte) 0xE1, (byte) 0x6A, (byte) 0x30, (byte) 0x00, (byte) 0x73,
+ (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6D, (byte) 0x33, (byte) 0x32, (byte) 0x00,
+ (byte) 0x00, (byte) 0x19, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5F, (byte) 0xC0, (byte) 0x00,
+ (byte) 0x00, (byte) 0x2C, (byte) 0x32, (byte) 0x91, (byte) 0x01, (byte) 0x20, (byte) 0x00, (byte) 0x6A,
+ (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x77, (byte) 0x2E, (byte) 0x65, (byte) 0x78, (byte) 0x65,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x34, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x1C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x50, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x18, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xC9, (byte) 0x72, (byte) 0x53, (byte) 0xAC, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x45, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x32, (byte) 0x30, (byte) 0x34, (byte) 0x00,
+ (byte) 0x43, (byte) 0x3A, (byte) 0x5C, (byte) 0x57, (byte) 0x49, (byte) 0x4E, (byte) 0x4E, (byte) 0x54,
+ (byte) 0x5C, (byte) 0x73, (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6D, (byte) 0x33,
+ (byte) 0x32, (byte) 0x5C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x77, (byte) 0x2E,
+ (byte) 0x65, (byte) 0x78, (byte) 0x65, (byte) 0x00, (byte) 0x00, (byte) 0x21, (byte) 0x00, (byte) 0x2E,
+ (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x2E,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x57, (byte) 0x00, (byte) 0x49, (byte) 0x00, (byte) 0x4E, (byte) 0x00, (byte) 0x4E,
+ (byte) 0x00, (byte) 0x54, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x79,
+ (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x74, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x6D,
+ (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x6A,
+ (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x76, (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x77,
+ (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x78, (byte) 0x00, (byte) 0x65,
+ (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x59, (byte) 0x00, (byte) 0x3A, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x69, (byte) 0x00, (byte) 0x6E,
+ (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F,
+ (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x29,
+ (byte) 0x00, (byte) 0x2D, (byte) 0x00, (byte) 0x58, (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x78,
+ (byte) 0x00, (byte) 0x35, (byte) 0x00, (byte) 0x31, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x4D,
+ (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x2D, (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61,
+ (byte) 0x00, (byte) 0x72, (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x59, (byte) 0x00, (byte) 0x3A,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x69,
+ (byte) 0x00, (byte) 0x6E, (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61,
+ (byte) 0x00, (byte) 0x72, (byte) 0x00, (byte) 0x1B, (byte) 0x00, (byte) 0x59, (byte) 0x00, (byte) 0x3A,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x69,
+ (byte) 0x00, (byte) 0x6E, (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x69, (byte) 0x00, (byte) 0x63,
+ (byte) 0x00, (byte) 0x6F, (byte) 0x00, (byte) 0x14, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0xA0, (byte) 0x25, (byte) 0x53, (byte) 0x79, (byte) 0x73, (byte) 0x74,
+ (byte) 0x65, (byte) 0x6D, (byte) 0x52, (byte) 0x6F, (byte) 0x6F, (byte) 0x74, (byte) 0x25, (byte) 0x5C,
+ (byte) 0x73, (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6D, (byte) 0x33, (byte) 0x32,
+ (byte) 0x5C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x77, (byte) 0x2E, (byte) 0x65,
+ (byte) 0x78, (byte) 0x65, (byte) 0x00, (byte) 0x4C, (byte) 0x82, (byte) 0x57, (byte) 0x7C, (byte) 0x7B,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x00, (byte) 0xC0, (byte) 0x78,
+ (byte) 0x74, (byte) 0x58, (byte) 0x7C, (byte) 0x33, (byte) 0x00, (byte) 0x00, (byte) 0xC0, (byte) 0xE8,
+ (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xC3,
+ (byte) 0x52, (byte) 0x58, (byte) 0x7C, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x18,
+ (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0xFC, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x30,
+ (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04,
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x6C, (byte) 0x41, (byte) 0xB9, (byte) 0xB3,
+ (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x18, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xF0,
+ (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x3C, (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0x40,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x92, (byte) 0x00, (byte) 0x92, (byte) 0x00, (byte) 0xB6,
+ (byte) 0xE8, (byte) 0x56, (byte) 0x04, (byte) 0xF0, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x92,
+ (byte) 0x00, (byte) 0x92, (byte) 0x00, (byte) 0xB6, (byte) 0xE8, (byte) 0x56, (byte) 0x04, (byte) 0x64,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x5B, (byte) 0xDA, (byte) 0xA9, (byte) 0x70, (byte) 0xE8,
+ (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xD8, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x7C,
+ (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0x13, (byte) 0x50, (byte) 0xE2, (byte) 0x77, (byte) 0xB3,
+ (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xDC,
+ (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x98,
+ (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0xF0, (byte) 0x21, (byte) 0x75, (byte) 0x71, (byte) 0xB3,
+ (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xDC,
+ (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0xF4, (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0x6F,
+ (byte) 0x27, (byte) 0x75, (byte) 0x71, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xDC,
+ (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x9B, (byte) 0x27, (byte) 0x75, (byte) 0x71, (byte) 0x25,
+ (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x79, (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x74,
+ (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x52, (byte) 0x00, (byte) 0x6F,
+ (byte) 0x00, (byte) 0x6F, (byte) 0x00, (byte) 0x74, (byte) 0x00, (byte) 0x25, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x79, (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x74,
+ (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x32,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x76,
+ (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x65,
+ (byte) 0x00, (byte) 0x78, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x18,
+ (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x74, (byte) 0x25, (byte) 0x75, (byte) 0x71, (byte) 0x20,
+ (byte) 0xFC, (byte) 0x51, (byte) 0x04, (byte) 0x7A, (byte) 0xF2, (byte) 0xE3, (byte) 0x03, (byte) 0x00,
+ (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x54, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0xD0,
+ (byte) 0x57, (byte) 0xF8, (byte) 0x77, (byte) 0xEC, (byte) 0x57, (byte) 0xF8, (byte) 0x77, (byte) 0x08,
+ (byte) 0x06, (byte) 0x07, (byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x05,
+ (byte) 0x96, (byte) 0x57, (byte) 0x7C, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x7A,
+ (byte) 0xF2, (byte) 0xE3, (byte) 0x03, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F, (byte) 0x00, (byte) 0x49,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x30,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x24,
+ (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xE0,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x44, (byte) 0x1F, (byte) 0x5C, (byte) 0x7C, (byte) 0x50,
+ (byte) 0x24, (byte) 0x57, (byte) 0x7C, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x78,
+ (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x30, (byte) 0x77, (byte) 0xE1, (byte) 0x77, (byte) 0x34,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x87, (byte) 0x78, (byte) 0xE1, (byte) 0x77, (byte) 0x34,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x2F, (byte) 0x78, (byte) 0xB2,
+ (byte) 0xFC, (byte) 0x51, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x90, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x0A,
+ (byte) 0x78, (byte) 0xE1, (byte) 0x77, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F, (byte) 0x00, (byte) 0xE8,
+ (byte) 0x3C, (byte) 0x0F, (byte) 0x00, (byte) 0x30, (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x7A,
+ (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0xCC, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x05,
+ (byte) 0x7B, (byte) 0xE1, (byte) 0x77, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F, (byte) 0x00, (byte) 0x04,
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xA8, (byte) 0x19, (byte) 0x2F, (byte) 0x00, (byte) 0x30,
+ (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x20,
+ (byte) 0x34, (byte) 0xE1, (byte) 0x77, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x08,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x76, (byte) 0x26, (byte) 0x75, (byte) 0x71, (byte) 0x7A,
+ (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x49, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xF0,
+ (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0xD7, (byte) 0x79, (byte) 0xE1, (byte) 0x77, (byte) 0x30,
+ (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04,
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xA8,
+ (byte) 0x19, (byte) 0x2F, (byte) 0x00, (byte) 0x30, (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x14, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xFC,
+ (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x30, (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8,
+ (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x34,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xD0, (byte) 0xA3, (byte) 0xE3, (byte) 0x77, (byte) 0x7A,
+ (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04,
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xB3,
+ (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0xCD, (byte) 0xAB, (byte) 0xBA, (byte) 0xDC, (byte) 0x58,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xA6, (byte) 0x52, (byte) 0x58, (byte) 0x7C, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x0C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x50,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xEF, (byte) 0x52, (byte) 0x58, (byte) 0x7C, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x0C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x60,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xA4,
+ (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x75, (byte) 0x4E, (byte) 0xAA, (byte) 0x70, (byte) 0x01,
+ (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xE8,
+ (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xD8, (byte) 0x8F, (byte) 0x52, (byte) 0x04, (byte) 0xF0,
+ (byte) 0x21, (byte) 0x75, (byte) 0x71, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x7A,
+ (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04,
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xF0,
+ (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x6F, (byte) 0x27, (byte) 0x75, (byte) 0x71, (byte) 0x7A,
+ (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04,
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0x9B,
+ (byte) 0x27, (byte) 0x75, (byte) 0x71, (byte) 0xD4, (byte) 0xEE, (byte) 0xE3, (byte) 0x03, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x04, (byte) 0x52, (byte) 0x04, (byte) 0x60,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0xA0, (byte) 0x58,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x65,
+ (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x32, (byte) 0x30, (byte) 0x34, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06,
+ (byte) 0xA0, (byte) 0x78, (byte) 0xF9, (byte) 0x08, (byte) 0x80, (byte) 0xFF, (byte) 0x4E, (byte) 0x9C,
+ (byte) 0x47, (byte) 0xF1, (byte) 0xD0, (byte) 0x77, (byte) 0xFE, (byte) 0x54, (byte) 0xB6, (byte) 0x46,
+ (byte) 0x18, (byte) 0x99, (byte) 0x1F, (byte) 0xA2, (byte) 0xE1, (byte) 0xD9, (byte) 0x11, (byte) 0x86,
+ (byte) 0xC3, (byte) 0x00, (byte) 0x0F, (byte) 0x1F, (byte) 0xD8, (byte) 0x1B, (byte) 0x0F, (byte) 0x06,
+ (byte) 0xA0, (byte) 0x78, (byte) 0xF9, (byte) 0x08, (byte) 0x80, (byte) 0xFF, (byte) 0x4E, (byte) 0x9C,
+ (byte) 0x47, (byte) 0xF1, (byte) 0xD0, (byte) 0x77, (byte) 0xFE, (byte) 0x54, (byte) 0xB6, (byte) 0x46,
+ (byte) 0x18, (byte) 0x99, (byte) 0x1F, (byte) 0xA2, (byte) 0xE1, (byte) 0xD9, (byte) 0x11, (byte) 0x86,
+ (byte) 0xC3, (byte) 0x00, (byte) 0x0F, (byte) 0x1F, (byte) 0xD8, (byte) 0x1B, (byte) 0x0F, (byte) 0x10,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x00, (byte) 0xA0, (byte) 0x24,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x42, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00};
+
+ // This is the binary for the OSEE_MS lnk ;-)
+ private static final byte[] OSEE_MS =
+ new byte[] {(byte) 0x4C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x14, (byte) 0x02,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xC0, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x46, (byte) 0xFB, (byte) 0x02, (byte) 0x00,
+ (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x54, (byte) 0x20, (byte) 0x6E,
+ (byte) 0x73, (byte) 0x3B, (byte) 0xF8, (byte) 0xC4, (byte) 0x01, (byte) 0xAB, (byte) 0x00, (byte) 0xE4,
+ (byte) 0x8F, (byte) 0xA2, (byte) 0x9E, (byte) 0xC5, (byte) 0x01, (byte) 0x7C, (byte) 0xF6, (byte) 0xA1,
+ (byte) 0x69, (byte) 0x3B, (byte) 0xF8, (byte) 0xC4, (byte) 0x01, (byte) 0x5F, (byte) 0xC0, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x9E, (byte) 0x00, (byte) 0x14,
+ (byte) 0x00, (byte) 0x1F, (byte) 0x50, (byte) 0xE0, (byte) 0x4F, (byte) 0xD0, (byte) 0x20, (byte) 0xEA,
+ (byte) 0x3A, (byte) 0x69, (byte) 0x10, (byte) 0xA2, (byte) 0xD8, (byte) 0x08, (byte) 0x00, (byte) 0x2B,
+ (byte) 0x30, (byte) 0x30, (byte) 0x9D, (byte) 0x19, (byte) 0x00, (byte) 0x23, (byte) 0x43, (byte) 0x3A,
+ (byte) 0x5C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x91, (byte) 0x65, (byte) 0x15, (byte) 0x00, (byte) 0x31, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x33, (byte) 0xB5, (byte) 0xBB,
+ (byte) 0x30, (byte) 0x00, (byte) 0x57, (byte) 0x49, (byte) 0x4E, (byte) 0x4E, (byte) 0x54, (byte) 0x00,
+ (byte) 0x00, (byte) 0x18, (byte) 0x00, (byte) 0x31, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x08, (byte) 0x33, (byte) 0x1D, (byte) 0x6E, (byte) 0x30, (byte) 0x00, (byte) 0x73,
+ (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6D, (byte) 0x33, (byte) 0x32, (byte) 0x00,
+ (byte) 0x00, (byte) 0x42, (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5F, (byte) 0xC0, (byte) 0x00,
+ (byte) 0x00, (byte) 0xE5, (byte) 0x32, (byte) 0x10, (byte) 0x89, (byte) 0x20, (byte) 0x00, (byte) 0x6A,
+ (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x77, (byte) 0x2E, (byte) 0x65, (byte) 0x78, (byte) 0x65,
+ (byte) 0x00, (byte) 0x2A, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0xEF,
+ (byte) 0xBE, (byte) 0xE5, (byte) 0x32, (byte) 0x19, (byte) 0x89, (byte) 0x04, (byte) 0x33, (byte) 0x60,
+ (byte) 0x8D, (byte) 0x14, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61,
+ (byte) 0x00, (byte) 0x76, (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x2E,
+ (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x78, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x18, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x4C, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x1C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x1C, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x2D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x4B, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x11, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x34, (byte) 0xCC, (byte) 0xE0, (byte) 0x84, (byte) 0x10, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x43, (byte) 0x3A, (byte) 0x5C, (byte) 0x57, (byte) 0x49, (byte) 0x4E,
+ (byte) 0x44, (byte) 0x4F, (byte) 0x57, (byte) 0x53, (byte) 0x5C, (byte) 0x73, (byte) 0x79, (byte) 0x73,
+ (byte) 0x74, (byte) 0x65, (byte) 0x6D, (byte) 0x33, (byte) 0x32, (byte) 0x5C, (byte) 0x6A, (byte) 0x61,
+ (byte) 0x76, (byte) 0x61, (byte) 0x77, (byte) 0x2E, (byte) 0x65, (byte) 0x78, (byte) 0x65, (byte) 0x00,
+ (byte) 0x00, (byte) 0x1A, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x57,
+ (byte) 0x00, (byte) 0x49, (byte) 0x00, (byte) 0x4E, (byte) 0x00, (byte) 0x4E, (byte) 0x00, (byte) 0x54,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x79, (byte) 0x00, (byte) 0x73,
+ (byte) 0x00, (byte) 0x74, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x33,
+ (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61,
+ (byte) 0x00, (byte) 0x76, (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x2E,
+ (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x78, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x15,
+ (byte) 0x00, (byte) 0x59, (byte) 0x00, (byte) 0x3A, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F,
+ (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x69, (byte) 0x00, (byte) 0x6E, (byte) 0x00, (byte) 0x33,
+ (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5F, (byte) 0x00, (byte) 0x4D,
+ (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x2C, (byte) 0x00, (byte) 0x2D, (byte) 0x00, (byte) 0x58,
+ (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x78, (byte) 0x00, (byte) 0x35, (byte) 0x00, (byte) 0x31,
+ (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x4D, (byte) 0x00, (byte) 0x20, (byte) 0x00, (byte) 0x2D,
+ (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x72, (byte) 0x00, (byte) 0x20,
+ (byte) 0x00, (byte) 0x59, (byte) 0x00, (byte) 0x3A, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F,
+ (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5C,
+ (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x69, (byte) 0x00, (byte) 0x6E, (byte) 0x00, (byte) 0x33,
+ (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5F, (byte) 0x00, (byte) 0x4D,
+ (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x6A,
+ (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x72, (byte) 0x00, (byte) 0x1B, (byte) 0x00, (byte) 0x59,
+ (byte) 0x00, (byte) 0x3A, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x77,
+ (byte) 0x00, (byte) 0x69, (byte) 0x00, (byte) 0x6E, (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x32,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x45,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x4F, (byte) 0x00, (byte) 0x53,
+ (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x45, (byte) 0x00, (byte) 0x2E, (byte) 0x00, (byte) 0x69,
+ (byte) 0x00, (byte) 0x63, (byte) 0x00, (byte) 0x6F, (byte) 0x00, (byte) 0x14, (byte) 0x03, (byte) 0x00,
+ (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xA0, (byte) 0x25, (byte) 0x53, (byte) 0x79,
+ (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6D, (byte) 0x52, (byte) 0x6F, (byte) 0x6F, (byte) 0x74,
+ (byte) 0x25, (byte) 0x5C, (byte) 0x73, (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6D,
+ (byte) 0x33, (byte) 0x32, (byte) 0x5C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x77,
+ (byte) 0x2E, (byte) 0x65, (byte) 0x78, (byte) 0x65, (byte) 0x00, (byte) 0x4C, (byte) 0x82, (byte) 0x57,
+ (byte) 0x7C, (byte) 0x7B, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x33, (byte) 0x00, (byte) 0x00,
+ (byte) 0xC0, (byte) 0x78, (byte) 0x74, (byte) 0x58, (byte) 0x7C, (byte) 0x33, (byte) 0x00, (byte) 0x00,
+ (byte) 0xC0, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0xC3, (byte) 0x52, (byte) 0x58, (byte) 0x7C, (byte) 0x0D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x18, (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0xFC, (byte) 0x5F, (byte) 0xE4,
+ (byte) 0x77, (byte) 0x30, (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x6C, (byte) 0x41,
+ (byte) 0xB9, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x18, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0xF0, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x3C, (byte) 0xEB, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x40, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x92, (byte) 0x00, (byte) 0x92,
+ (byte) 0x00, (byte) 0xB6, (byte) 0xE8, (byte) 0x56, (byte) 0x04, (byte) 0xF0, (byte) 0x08, (byte) 0x00,
+ (byte) 0x00, (byte) 0x92, (byte) 0x00, (byte) 0x92, (byte) 0x00, (byte) 0xB6, (byte) 0xE8, (byte) 0x56,
+ (byte) 0x04, (byte) 0x64, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x5B, (byte) 0xDA, (byte) 0xA9,
+ (byte) 0x70, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xD8, (byte) 0xEC, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x7C, (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0x13, (byte) 0x50, (byte) 0xE2,
+ (byte) 0x77, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x7A, (byte) 0x03, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00,
+ (byte) 0x00, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x98, (byte) 0xEB, (byte) 0xE3, (byte) 0x03, (byte) 0xF0, (byte) 0x21, (byte) 0x75,
+ (byte) 0x71, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x7A, (byte) 0x03, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00,
+ (byte) 0x00, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0xF4, (byte) 0xEB, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x6F, (byte) 0x27, (byte) 0x75, (byte) 0x71, (byte) 0x7A, (byte) 0x03, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00,
+ (byte) 0x00, (byte) 0xDC, (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x9B, (byte) 0x27, (byte) 0x75,
+ (byte) 0x71, (byte) 0x25, (byte) 0x00, (byte) 0x53, (byte) 0x00, (byte) 0x79, (byte) 0x00, (byte) 0x73,
+ (byte) 0x00, (byte) 0x74, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x52,
+ (byte) 0x00, (byte) 0x6F, (byte) 0x00, (byte) 0x6F, (byte) 0x00, (byte) 0x74, (byte) 0x00, (byte) 0x25,
+ (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x79, (byte) 0x00, (byte) 0x73,
+ (byte) 0x00, (byte) 0x74, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x6D, (byte) 0x00, (byte) 0x33,
+ (byte) 0x00, (byte) 0x32, (byte) 0x00, (byte) 0x5C, (byte) 0x00, (byte) 0x6A, (byte) 0x00, (byte) 0x61,
+ (byte) 0x00, (byte) 0x76, (byte) 0x00, (byte) 0x61, (byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0x2E,
+ (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x78, (byte) 0x00, (byte) 0x65, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x18, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x74, (byte) 0x25, (byte) 0x75,
+ (byte) 0x71, (byte) 0x20, (byte) 0xFC, (byte) 0x51, (byte) 0x04, (byte) 0x7A, (byte) 0xF2, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x54, (byte) 0xEC, (byte) 0xE3,
+ (byte) 0x03, (byte) 0xD0, (byte) 0x57, (byte) 0xF8, (byte) 0x77, (byte) 0xEC, (byte) 0x57, (byte) 0xF8,
+ (byte) 0x77, (byte) 0x08, (byte) 0x06, (byte) 0x07, (byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x01, (byte) 0x05, (byte) 0x96, (byte) 0x57, (byte) 0x7C, (byte) 0x00, (byte) 0x00, (byte) 0x07,
+ (byte) 0x00, (byte) 0x7A, (byte) 0xF2, (byte) 0xE3, (byte) 0x03, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F,
+ (byte) 0x00, (byte) 0x49, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x0D,
+ (byte) 0x01, (byte) 0x30, (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x24, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0xE0, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x44, (byte) 0x1F, (byte) 0x5C,
+ (byte) 0x7C, (byte) 0x50, (byte) 0x24, (byte) 0x57, (byte) 0x7C, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0x78, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0x30, (byte) 0x77, (byte) 0xE1,
+ (byte) 0x77, (byte) 0x34, (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x87, (byte) 0x78, (byte) 0xE1,
+ (byte) 0x77, (byte) 0x34, (byte) 0x00, (byte) 0x0D, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x2F,
+ (byte) 0x78, (byte) 0xB2, (byte) 0xFC, (byte) 0x51, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x90, (byte) 0xEC, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x0A, (byte) 0x78, (byte) 0xE1, (byte) 0x77, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F,
+ (byte) 0x00, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F, (byte) 0x00, (byte) 0x30, (byte) 0x75, (byte) 0x48,
+ (byte) 0x00, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0xCC, (byte) 0xEC, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x05, (byte) 0x7B, (byte) 0xE1, (byte) 0x77, (byte) 0xE8, (byte) 0x3C, (byte) 0x0F,
+ (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xA8, (byte) 0x19, (byte) 0x2F,
+ (byte) 0x00, (byte) 0x30, (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x7A, (byte) 0x03, (byte) 0x0D,
+ (byte) 0x00, (byte) 0x20, (byte) 0x34, (byte) 0xE1, (byte) 0x77, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0x08, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x76, (byte) 0x26, (byte) 0x75,
+ (byte) 0x71, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x49, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0xF0, (byte) 0xEC, (byte) 0xE3, (byte) 0x03, (byte) 0xD7, (byte) 0x79, (byte) 0xE1,
+ (byte) 0x77, (byte) 0x30, (byte) 0x75, (byte) 0x48, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3,
+ (byte) 0x03, (byte) 0xA8, (byte) 0x19, (byte) 0x2F, (byte) 0x00, (byte) 0x30, (byte) 0x75, (byte) 0x48,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x14, (byte) 0xED, (byte) 0xE3,
+ (byte) 0x03, (byte) 0xFC, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0x30, (byte) 0x75, (byte) 0x48,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00,
+ (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4,
+ (byte) 0x77, (byte) 0x34, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xD0, (byte) 0xA3, (byte) 0xE3,
+ (byte) 0x77, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3,
+ (byte) 0x03, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4, (byte) 0x77, (byte) 0xCD, (byte) 0xAB, (byte) 0xBA,
+ (byte) 0xDC, (byte) 0x58, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xA6, (byte) 0x52, (byte) 0x58,
+ (byte) 0x7C, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x0C, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x50, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0xEF, (byte) 0x52, (byte) 0x58,
+ (byte) 0x7C, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x0C, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x60, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x04, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x00,
+ (byte) 0x00, (byte) 0xA4, (byte) 0xEF, (byte) 0xE3, (byte) 0x03, (byte) 0x75, (byte) 0x4E, (byte) 0xAA,
+ (byte) 0x70, (byte) 0x01, (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3, (byte) 0x03, (byte) 0xD8, (byte) 0x8F, (byte) 0x52,
+ (byte) 0x04, (byte) 0xF0, (byte) 0x21, (byte) 0x75, (byte) 0x71, (byte) 0xB3, (byte) 0x5F, (byte) 0xE4,
+ (byte) 0x77, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3,
+ (byte) 0x03, (byte) 0xF0, (byte) 0xED, (byte) 0xE3, (byte) 0x03, (byte) 0x6F, (byte) 0x27, (byte) 0x75,
+ (byte) 0x71, (byte) 0x7A, (byte) 0x03, (byte) 0x0D, (byte) 0x00, (byte) 0x0D, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x04, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0xE8, (byte) 0xF1, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x9B, (byte) 0x27, (byte) 0x75, (byte) 0x71, (byte) 0xD4, (byte) 0xEE, (byte) 0xE3,
+ (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x80, (byte) 0x04, (byte) 0x52,
+ (byte) 0x04, (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00,
+ (byte) 0xA0, (byte) 0x58, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x65, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x32, (byte) 0x30, (byte) 0x34,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x06, (byte) 0xA0, (byte) 0x78, (byte) 0xF9, (byte) 0x08, (byte) 0x80, (byte) 0xFF,
+ (byte) 0x4E, (byte) 0x9C, (byte) 0x47, (byte) 0xF1, (byte) 0xD0, (byte) 0x77, (byte) 0xFE, (byte) 0x54,
+ (byte) 0xB6, (byte) 0x46, (byte) 0x18, (byte) 0x99, (byte) 0x1F, (byte) 0xA2, (byte) 0xE1, (byte) 0xD9,
+ (byte) 0x11, (byte) 0x86, (byte) 0xC3, (byte) 0x00, (byte) 0x0F, (byte) 0x1F, (byte) 0xD8, (byte) 0x1B,
+ (byte) 0x0F, (byte) 0x06, (byte) 0xA0, (byte) 0x78, (byte) 0xF9, (byte) 0x08, (byte) 0x80, (byte) 0xFF,
+ (byte) 0x4E, (byte) 0x9C, (byte) 0x47, (byte) 0xF1, (byte) 0xD0, (byte) 0x77, (byte) 0xFE, (byte) 0x54,
+ (byte) 0xB6, (byte) 0x46, (byte) 0x18, (byte) 0x99, (byte) 0x1F, (byte) 0xA2, (byte) 0xE1, (byte) 0xD9,
+ (byte) 0x11, (byte) 0x86, (byte) 0xC3, (byte) 0x00, (byte) 0x0F, (byte) 0x1F, (byte) 0xD8, (byte) 0x1B,
+ (byte) 0x0F, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x00,
+ (byte) 0xA0, (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x42, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MatchFilter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MatchFilter.java
new file mode 100644
index 00000000000..8e73837a59c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MatchFilter.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.framework.jdk.core.util.io;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class MatchFilter implements FilenameFilter {
+ protected Matcher matcher;
+
+ public MatchFilter(String pattern) {
+ this.matcher = Pattern.compile(pattern).matcher("");
+ }
+
+ public boolean accept(File dir, String fileName) {
+ matcher.reset(fileName);
+ return matcher.matches();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomConnection.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomConnection.java
new file mode 100644
index 00000000000..325b8ad86d2
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomConnection.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.framework.jdk.core.util.io;
+
+import java.io.IOException;
+import java.io.PipedReader;
+import java.io.PipedWriter;
+import java.io.PrintWriter;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * Specifically used for connecting to minicom via the serial port and setting up an input and output stream.
+ *
+ * @author Michael P. Masterson
+ */
+public class MinicomConnection {
+ private static final int MAX_RESPONSE_TIME = 100000;
+ private static final int ITERATION_TIME = 2000;
+
+ private InputBufferThread inputBuffer;
+ private PrintWriter commandLine;
+
+ /**
+ * saves input and output streams then waits for minicom to load completely
+ */
+ public MinicomConnection() {
+ super();
+ setupConnection();
+ waitForWelcomeScreen();
+ }
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 20; i++) {
+ System.out.println("i = " + i + ", Making Connection...");
+ MinicomConnection connection = new MinicomConnection();
+ System.out.println("Connection made");
+ System.out.println("Restarting...");
+ connection.resetPizzaBox();
+ }
+ System.out.println("Done with main");
+
+ }
+
+ /**
+ * Uses a process builder to set up the minicom process executable. Using this it will create a thread for inputting
+ * commands to minicom.
+ */
+ private void setupConnection() {
+ try {
+ ProcessBuilder pb = new ProcessBuilder();
+
+ // the path to the minicom program through linux.
+ String[] minicomExe = new String[] {"/usr/bin/minicom"};
+
+ // sets up the operating system command
+ pb.command(minicomExe);
+
+ // starts a new process based on the minicom command
+ Process minicomProc = pb.start();
+
+ // the following three writers and readers will be used to issue minicom commands and read its responses
+ PipedWriter pw = new PipedWriter();
+ commandLine = new PrintWriter(pw);
+ PipedReader pr = new PipedReader(pw);
+
+ // send the textual output of minicom to the trash
+ PrintWriter outputFromTheMinicom = new PrintWriter(System.out);
+
+ // sets up the minicom thread and directs minicom output to the two streams passed
+ inputBuffer = (InputBufferThread) Lib.handleMinicomProcess(minicomProc, outputFromTheMinicom, pr)[1];
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+ /**
+ * @return The printWriter for issuing commands to minicom
+ */
+ public PrintWriter getCommandLine() {
+ return this.commandLine;
+ }
+
+ /**
+ * reads input from the minicom until it sees a common line singifying it has completely loaded
+ */
+ private void waitForWelcomeScreen() {
+ waitFor("Press CTRL-A Z for help on special keys");
+ }
+
+ /**
+ * Waits to either read in the expected reset completion line OR for the run command to see the completion line
+ */
+ public void waitForReset() {
+ waitFor("Decompression complete");
+ }
+
+ /**
+ * Waits for the parameter passed to appear in the minicom output. Uses the InputBufferThread that should have been
+ * started before this.
+ *
+ * @param matcher The string to look for in the minicom's output stream
+ */
+ public synchronized void waitFor(String matcher) {
+ try {
+ int elapsedTime = 0;
+ while (elapsedTime <= MAX_RESPONSE_TIME) {
+ if (inputBuffer.contains(matcher) >= 0) break;
+
+ System.out.println("Input buffer did not contain " + matcher + " after " + elapsedTime + " milisecs");
+ this.wait(ITERATION_TIME);
+ elapsedTime += ITERATION_TIME;
+ }
+ if (elapsedTime > MAX_RESPONSE_TIME) {
+ throw new InterruptedException(
+ "Waiting for '" + matcher + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+ }
+ wait(4000);
+
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+ /**
+ * Stops the buffering thread from running and closes the commandLine
+ */
+ public void disconnect() {
+ System.out.println("Disconnecting...");
+ inputBuffer.stopOnNextRun(true);
+ commandLine.close();
+ System.out.println("Disconnect Finished");
+ }
+
+ /**
+ * Runs through the commands given through minicom that will reset the pizzabox. Once the command/s are given, it
+ * waits for the reset to complete before exitting minicom.
+ */
+ public void resetPizzaBox() {
+ System.out.println("Issuing rset Command");
+ // Issues the reset command to the OFP
+ commandLine.println("rset");
+
+ System.out.println("Waiting for reset");
+ waitForReset();
+ System.out.println("Reset Finished");
+
+ System.out.println("Issuing CTRL-A Q command");
+ // quits minicom
+ commandLine.println((char) 1 + "q");
+
+ System.out.println("hitting enter on 'you sure you want to quit'");
+ // hit enter on the "Are you sure you want to quit?" popup
+ commandLine.println();
+
+ disconnect();
+ System.out.println("Done with resetPizzaBox");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomOutputThread.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomOutputThread.java
new file mode 100644
index 00000000000..487202bb8c8
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MinicomOutputThread.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.framework.jdk.core.util.io;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Thread specifically used for connecting to minicom via the serial port and setting up an input and output stream.
+ *
+ * @author Michael P. Masterson
+ */
+public class MinicomOutputThread extends Thread {
+ private Writer output;
+ private BufferedReader input;
+ private boolean resetFinished;
+
+ /**
+ * saves input and output streams then waits for minicom to load completely
+ */
+ public MinicomOutputThread(Writer output, BufferedReader input) {
+ super();
+ this.output = output;
+ this.input = input;
+ waitForWelcomScreen();
+ resetFinished = false;
+ }
+
+ /**
+ * reads input from the minicom until it sees a common line singifying it has completely loaded
+ */
+ private void waitForWelcomScreen() {
+ try {
+ String welcomeLine = "Press CTRL-A Z for help on special keys";
+ String outLine = null;
+ while ((outLine = input.readLine()) != null) {
+ output.write("\nWELCOME: " + outLine);
+ if (outLine.contains(welcomeLine)) break;
+
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * @return True if the text for the completion of a reset has been seen on the line
+ */
+ public boolean isResetFinished() {
+ return this.resetFinished;
+ }
+
+ /**
+ * Common run command for the thread. Sits on the serial line reading input from the minicom and printing it to the
+ * the output stream. If the expected end of a reset is found, it sets that field to indicate the reset is finished.
+ */
+ public void run() {
+ String outLine = null;
+ try {
+ while ((outLine = input.readLine()) != null) {
+ if (!outLine.contains("[")) output.write(outLine + "\n");
+
+ if (outLine.contains("Start of wp_periodic_task")) {
+ output.write("Found end of reset\n");
+ this.resetFinished = true;
+ }
+
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ input.close();
+ output.flush();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Waits to either read in the expected reset completion line OR for the run command to see the completion line
+ */
+ public void waitForReset() {
+ try {
+ String outLine;
+ while ((outLine = input.readLine()) != null && !isResetFinished()) {
+ if (!outLine.contains("[")) output.write(outLine + "\n");
+
+ if (outLine.contains("Start of wp_periodic_task")) {
+ output.write("Found end of reset\n");
+ break;
+ }
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MultipleLinks.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MultipleLinks.java
new file mode 100644
index 00000000000..b23461f23bf
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/MultipleLinks.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.framework.jdk.core.util.io;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class MultipleLinks {
+
+ public static void main(String[] args) throws IOException {
+ if (args.length < 3) {
+ System.out.println("Usage: java tc.MultipleLinks <file to link> <directory for links> <# of links>");
+ return;
+ }
+ link(new File(args[0]), new File(args[1]), Integer.parseInt(args[2]));
+ }
+
+ public static void link(File fileToLink, File directory, int linkCount) throws IOException {
+ if (!fileToLink.isFile()) {
+ throw new IllegalArgumentException(fileToLink + " is not a file.");
+ }
+
+ fileToLink = fileToLink.getCanonicalFile();
+ directory = directory.getCanonicalFile();
+ if (directory.mkdir()) {
+ System.out.println("Created " + directory);
+ }
+
+ //separate exstension and file name
+ String fileName = fileToLink.getName();
+ String extension = "";
+ int pos = fileName.lastIndexOf('.');
+ if (pos != -1) {
+ extension = fileName.substring(pos);
+ }
+ fileName = Lib.removeExtension(fileToLink.getName());
+
+ String command = "ln -s " + fileToLink.getPath() + " " + directory.getPath() + File.separator + fileName;
+ for (int i = 0; i < linkCount; i++) {
+ Lib.handleProcess(Runtime.getRuntime().exec(command + i + extension));
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/RenameFiles.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/RenameFiles.java
new file mode 100644
index 00000000000..0e67bd2ac28
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/RenameFiles.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.framework.jdk.core.util.io;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.text.rules.ReplaceAll;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RenameFiles {
+
+ public static void main(String[] args) throws IOException {
+ if (args.length < 3) {
+ System.out.println("Usage: java library.RenameFiles <directory> <full path pattern> <replacement>\n");
+ return;
+ }
+
+ Rule rule = new ReplaceAll(Pattern.compile(args[1]), args[2]);
+ List<File> files = Lib.recursivelyListFiles(new File(args[0]).getCanonicalFile(), null);
+ int size = files.size();
+ int renamedFileCount = 0;
+
+ for (int i = 0; i < size; i++) {
+ File file = (File) files.get(i);
+ ChangeSet newName = rule.computeChanges(file.getPath());
+ if (rule.ruleWasApplicable()) {
+ File newFile = new File(newName.toString());
+ if (file.renameTo(newFile)) {
+ System.out.println(file.getPath() + " became " + newFile.getPath());
+ renamedFileCount++;
+ } else {
+ System.out.println(file.getPath() + " failed to become " + newFile.getPath());
+ }
+ }
+ }
+ System.out.println("Changed " + renamedFileCount + " files");
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Streams.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Streams.java
new file mode 100644
index 00000000000..b36d98fce16
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Streams.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.framework.jdk.core.util.io;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.LinkedList;
+
+/**
+ * Utility class for working with Streams.
+ *
+ * @author Jeff C. Phillips
+ */
+public class Streams {
+
+ private final static int ORACLE_BUFF_LENGTH = 4 * 8192;
+
+ /**
+ * Converts a String into a InputStream using specifiec charSet
+ *
+ * @param string
+ * @param charSet
+ * @return Return input stream reference
+ * @throws UnsupportedEncodingException
+ */
+ public static InputStream convertStringToInputStream(String string, String charSet) throws UnsupportedEncodingException {
+ return new ByteArrayInputStream(string.getBytes(charSet));
+ }
+
+ public static byte[] getByteArray(InputStream stream) {
+
+ if (stream == null) throw new IllegalStateException("stream can not be null");
+
+ int length = -1;
+ long read = 0;
+ byte[] data = new byte[ORACLE_BUFF_LENGTH];
+ LinkedList<byte[]> linkedByteArrays = new LinkedList<byte[]>();
+
+ try {
+ while ((length = stream.read(data)) != -1) {
+ linkedByteArrays.add(data);
+ read += length;
+
+ // Get another buffer for the next go around
+ data = new byte[ORACLE_BUFF_LENGTH];
+
+ if (read > Integer.MAX_VALUE) throw new UnsupportedOperationException("The data is too large.");
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ // Get a contiguous buffer for all of the pieces to go into
+ data = new byte[(int) read];
+ int writeSize;
+ int index = 0;
+
+ for (byte[] chunk : linkedByteArrays) {
+ writeSize = Math.min((int) read, ORACLE_BUFF_LENGTH);
+ System.arraycopy(chunk, 0, data, index, writeSize);
+
+ read -= writeSize;
+ index += writeSize;
+ }
+ return data;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Zip.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Zip.java
new file mode 100644
index 00000000000..49d5da31161
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/Zip.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.framework.jdk.core.util.io;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+public class Zip {
+
+ public static void zip(String[] filenames, String outFilename) {
+ // These are the files to include in the ZIP file
+ // String[] filenames = new String[]{"filename1", "filename2"};
+
+ // Create a buffer for reading the files
+ byte[] buf = new byte[1024];
+
+ try {
+ // Create the ZIP file
+ ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));
+
+ // Compress the files
+ for (int i = 0; i < filenames.length; i++) {
+ FileInputStream in = new FileInputStream(filenames[i]);
+
+ // Add ZIP entry to output stream.
+ out.putNextEntry(new ZipEntry(filenames[i]));
+
+ // Transfer bytes from the file to the ZIP file
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+
+ // Complete the entry
+ out.closeEntry();
+ in.close();
+ }
+
+ // Complete the ZIP file
+ out.close();
+ } catch (IOException e) {
+ }
+
+ }
+
+ public static void unzip(File zipFile, File destinationDir, IZipEntryCompleteCallback progressBar) throws IOException {
+ int BUFFER = 2048;
+ BufferedOutputStream dest = null;
+ BufferedInputStream is = null;
+ ZipEntry entry = null;
+
+ try {
+ ZipFile zipfile = new ZipFile(zipFile.getAbsolutePath());
+ progressBar.setValue(0);
+ progressBar.setMinimum(0);
+ progressBar.setMaximum(zipfile.size());
+ System.out.println(zipfile.size());
+ Enumeration<? extends ZipEntry> e = zipfile.entries();
+ int size = 0;
+ while (e.hasMoreElements()) {
+ entry = (ZipEntry) e.nextElement();
+ is = new BufferedInputStream(zipfile.getInputStream(entry));
+ int count;
+ byte data[] = new byte[BUFFER];
+ File fileDir = new File(destinationDir.getAbsolutePath() + File.separator + entry.getName());
+ if (entry.isDirectory()) {
+ fileDir.mkdirs();
+ progressBar.setValue(++size);
+ continue;
+ } else {
+ fileDir.getParentFile().mkdirs();
+ }
+
+ if (!fileDir.exists() || (fileDir.exists() && fileDir.canWrite())) {
+ FileOutputStream fos = new FileOutputStream(fileDir.getAbsolutePath());
+ dest = new BufferedOutputStream(fos, BUFFER);
+ while ((count = is.read(data, 0, BUFFER)) != -1) {
+ dest.write(data, 0, count);
+ }
+ dest.flush();
+ dest.close();
+ }
+
+ is.close();
+
+ if (fileDir.getAbsolutePath().endsWith(".lnk")) {
+ if (fileDir.canWrite()) {
+ fileDir.setReadOnly();
+ }
+ }
+ progressBar.setValue(++size);
+ }
+ } catch (Exception ex) {
+ String information =
+ "ZipFile: " + (zipFile != null ? zipFile.getAbsolutePath() : "NULL") + "\n" + "DestinationDir: " + (destinationDir != null ? destinationDir.getAbsolutePath() : "NULL") + "\n" + "Entry Processed: " + (entry != null ? entry.toString() : "NULL") + "\n";
+ throw new IOException(information + ex.getMessage());
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamCatcher.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamCatcher.java
new file mode 100644
index 00000000000..c2e2b2efed7
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamCatcher.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.framework.jdk.core.util.io.streams;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class StreamCatcher extends Thread {
+ private InputStream is;
+ private String type;
+ private Logger logger;
+
+ public StreamCatcher(InputStream is, String type) {
+ this(is, type, null);
+ }
+
+ public StreamCatcher(InputStream is, String type, Logger logger) {
+ this.is = is;
+ this.type = type;
+ this.logger = logger;
+ }
+
+ public void run() {
+ try {
+ InputStreamReader isr = new InputStreamReader(is);
+ BufferedReader br = new BufferedReader(isr);
+ String line = null;
+ String loggerError = "";
+
+ while ((line = br.readLine()) != null) {
+
+ if (logger == null)
+ System.out.println(type + ">" + line);
+ else
+ loggerError += line + "\n";
+
+ }
+
+ if (logger != null && loggerError.length() > 0) logger.log(Level.SEVERE, loggerError);
+
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamPumper.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamPumper.java
new file mode 100644
index 00000000000..d117aea1010
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/streams/StreamPumper.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.jdk.core.util.io.streams;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Utility class for convenience methods with getting information from
+ * InputStream's to OutputStream's.
+ *
+ * @author Robert A. Fisher
+ *
+ */
+public class StreamPumper {
+
+ /**
+ * Pumps all data from the InputStream to the OutputStream through an
+ * in place 2k buffer.
+ *
+ * @param in
+ * @param out
+ * @throws IOException
+ */
+ public static void pumpData(InputStream in, OutputStream out) throws IOException {
+ if (in == null)
+ throw new IllegalArgumentException("in can not be null");
+ if (out == null)
+ throw new IllegalArgumentException("out can not be null");
+
+ int numBytesRead;
+ byte[] bytes = new byte[2024];
+ while ((numBytesRead = in.read(bytes)) != -1) {
+ out.write(bytes, 0, numBytesRead);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSaxHandler.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSaxHandler.java
new file mode 100644
index 00000000000..b7c51447e66
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSaxHandler.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.framework.jdk.core.util.io.xml;
+
+import java.io.IOException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @author Ryan D. Brooks
+ *
+ * If you want to preserve CDATA sections you need to follow this pattern:
+ *
+ * XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ * xmlReader.setContentHandler(this);
+ * xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", this); //This is the important part
+ *
+ */
+public abstract class AbstractSaxHandler extends DefaultHandler implements LexicalHandler{
+// Buffer for collecting data from the "characters" SAX event.
+ private StringBuilder contents;
+ private final int maxContentLength;
+
+ protected AbstractSaxHandler() {
+ this(0);
+ }
+
+ protected AbstractSaxHandler(int maxContentLength) {
+ this.contents = new StringBuilder(2000);
+ this.maxContentLength = maxContentLength;
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+ */
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ if (maxContentLength > 0 && contents.length() + length > maxContentLength) {
+ return; // don't add more characters if doing so will make the content too long
+ }
+ contents.append(ch, start, length);
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ endElementFound(uri, localName, qName);
+ contents.setLength(0); // efficiently reset the StringBuilder to be empty (but preserve its capacity)
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ startElementFound(uri, localName, qName, attributes);
+ contents.setLength(0); // efficiently reset the StringBuilder to be empty (but preserve its capacity)
+ }
+
+ public abstract void startElementFound(String uri, String localName, String qName, Attributes attributes) throws SAXException;
+
+ public abstract void endElementFound(String uri, String localName, String qName) throws SAXException;
+
+ public String getContents() {
+ return contents.toString();
+ }
+
+ public void addContentsTo(Appendable appendable) throws IOException {
+ appendable.append(contents);
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int)
+ */
+ public void comment(char[] ch, int start, int length) throws SAXException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#endCDATA()
+ */
+ public void endCDATA() throws SAXException {
+ contents.append("]]>");
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#endDTD()
+ */
+ public void endDTD() throws SAXException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#endEntity(java.lang.String)
+ */
+ public void endEntity(String name) throws SAXException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#startCDATA()
+ */
+ public void startCDATA() throws SAXException {
+ contents.append("<![CDATA[");
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#startDTD(java.lang.String, java.lang.String, java.lang.String)
+ */
+ public void startDTD(String name, String publicId, String systemId)
+ throws SAXException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.xml.sax.ext.LexicalHandler#startEntity(java.lang.String)
+ */
+ public void startEntity(String name) throws SAXException {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSheetWriter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSheetWriter.java
new file mode 100644
index 00000000000..36a6a959129
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/AbstractSheetWriter.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.framework.jdk.core.util.io.xml;
+
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class AbstractSheetWriter implements ISheetWriter {
+ private boolean startRow;
+ private int defaultCellIndex;
+
+ public AbstractSheetWriter() {
+ startRow = true;
+ defaultCellIndex = 0;
+ }
+
+ /**
+ * must be called by subclasses in their implementations of writeCell(String data, int cellIndex)
+ *
+ * @throws IOException
+ */
+ protected void startRowIfNecessary() throws IOException {
+ if (startRow) {
+ startRow();
+ startRow = false;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.excel.ISheetWriter#writeRow(java.util.Collection)
+ */
+ public void writeRow(Collection<String> row) throws IOException {
+ writeRow(row.toArray(new String[row.size()]));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.excel.ISheetWriter#writeRow(java.lang.String)
+ */
+ public void writeRow(String... row) throws IOException {
+ for (int i = 0; i < row.length; i++) {
+ writeCell(row[i], i);
+ }
+
+ endRow();
+ }
+
+ public void writeCell(String data, int cellIndex) throws IOException {
+ startRowIfNecessary();
+ defaultCellIndex = cellIndex + 1;
+ writeCellText(data, cellIndex);
+ }
+
+ public void endRow() throws IOException {
+ startRowIfNecessary();
+ startRow = true;
+ defaultCellIndex = 0;
+ writeEndRow();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter#writeCell(java.lang.String)
+ */
+ public void writeCell(String cellData) throws IOException {
+ writeCell(cellData, defaultCellIndex);
+ }
+
+ protected abstract void startRow() throws IOException;
+
+ protected abstract void writeEndRow() throws IOException;
+
+ protected abstract void writeCellText(String data, int cellIndex) throws IOException;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelSaxHandler.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelSaxHandler.java
new file mode 100644
index 00000000000..263b6e9c785
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelSaxHandler.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.io.xml;
+
+import java.util.Arrays;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExcelSaxHandler extends AbstractSaxHandler {
+ private String[] row;
+ private int cellIndex;
+ private int rowIndex;
+ private final RowProcessor rowProcessor;
+ private boolean isRowHeader;
+ private final boolean firstRowIsHeader;
+ private final boolean multiTable;
+ private boolean rowEmpty;
+
+ public ExcelSaxHandler(RowProcessor rowProcessor, boolean firstRowIsHeader, boolean enableMultiTableSupport) {
+ super();
+ this.rowProcessor = rowProcessor;
+ this.firstRowIsHeader = firstRowIsHeader;
+ this.multiTable = enableMultiTableSupport;
+ rowIndex = 0;
+ }
+
+ public ExcelSaxHandler(RowProcessor rowProcessor, boolean hasHeaderRow) {
+ this(rowProcessor, hasHeaderRow, false);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String,
+ * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ if (localName.equalsIgnoreCase("Row")) {
+ cellIndex = -1; // so that upon finding the first cell start element the index becomes 0
+ rowEmpty = true;
+ // null out because any empty cells would otherwise contain data from the previous row
+ Arrays.fill(row, 0, row.length, null);
+
+ String indexStr = attributes.getValue("ss:Index");
+ if (indexStr != null) {
+ int oldRowIndex = rowIndex;
+ rowIndex = Integer.parseInt(indexStr) - 1; // translate from Excel's 1-based index to
+ // our 0-based index
+ for (int i = oldRowIndex; i < rowIndex; i++) {
+ rowProcessor.processEmptyRow();
+ }
+ } else {
+ rowIndex++;
+ }
+ } else if (localName.equalsIgnoreCase("Cell")) {
+ String indexStr = attributes.getValue("ss:Index");
+ if (indexStr != null) {
+ cellIndex = Integer.parseInt(indexStr) - 1; // translate from Excel's 1-based index to
+ // our 0-based index
+ } else {
+ cellIndex++;
+ }
+ } else if (localName.equalsIgnoreCase("Table")) {
+ String columnCountStr = attributes.getValue("ss:ExpandedColumnCount");
+ if (columnCountStr == null) {
+ throw new IllegalArgumentException("missing ss:ExpandedColumnCount attribute of Table element");
+ }
+ row = new String[Integer.parseInt(columnCountStr)];
+
+ String rowCountStr = attributes.getValue("ss:ExpandedRowCount");
+ if (rowCountStr == null) {
+ rowCountStr = "0";
+ }
+ rowProcessor.detectedRowAndColumnCounts(Integer.parseInt(rowCountStr), row.length);
+ } else if (localName.equalsIgnoreCase("Worksheet")) {
+ isRowHeader = firstRowIsHeader; // next non-empty row will be considered a header (if
+ // applicable)
+ rowProcessor.foundStartOfWorksheet(attributes.getValue("ss:Name"));
+ // System.out.println("Worksheet =" +attributes.getValue("ss:Name"));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementWithClearContents(java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String qName) throws SAXException {
+ if (localName.equalsIgnoreCase("Data")) {
+ String contentStr = getContents();
+ if (!contentStr.equals(ExcelXmlWriter.blobMessage)) {
+ if (contentStr.equals(ExcelXmlWriter.defaultEmptyString)) {
+ row[cellIndex] = "";
+ } else {
+ row[cellIndex] = contentStr;
+ }
+ }
+ rowEmpty = false;
+ } else if (localName.equalsIgnoreCase("Row")) {
+ if (rowEmpty) {
+ rowProcessor.processEmptyRow();
+ if (multiTable) {
+ isRowHeader = true; // next non-empty row will be considered a header
+ }
+ } else if (row[0] != null && row[0].startsWith("#")) {
+ rowProcessor.processCommentRow(row);
+ } else if (isRowHeader) {
+ isRowHeader = false;
+ rowProcessor.processHeaderRow(row);
+ } else {
+ rowProcessor.processRow(row);
+ }
+ } else if (localName.equalsIgnoreCase("Worksheet")) {
+ rowProcessor.reachedEndOfWorksheet();
+ } else if (localName.equalsIgnoreCase("EmbeddedClob")) {
+ row[cellIndex] = getContents();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelXmlWriter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelXmlWriter.java
new file mode 100644
index 00000000000..30a6b9f87ba
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ExcelXmlWriter.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.framework.jdk.core.util.io.xml;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExcelXmlWriter extends AbstractSheetWriter {
+ private BufferedWriter out;
+ private boolean inSheet;
+ private boolean startTable;
+ private int columnCount;
+ private String emptyStringRepresentation;
+ private int previuosCellIndex;
+
+ public static final String defaultEmptyStringXmlRep = "&#248;";
+ public static final String defaultEmptyString = "\u00F8";
+ public static final String blobMessage = "data stored in EmbeddedClob since longer than 32767 chars";
+
+ public ExcelXmlWriter(Writer writer) throws IOException {
+ super();
+ out = new BufferedWriter(writer);
+ emptyStringRepresentation = defaultEmptyStringXmlRep;
+
+ out.write("<?xml version=\"1.0\"?>\n");
+ out.write("<?mso-application progid=\"Excel.Sheet\"?>\n");
+ out.write("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\n");
+ out.write(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n");
+ out.write(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n");
+ out.write(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\n");
+ out.write(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">\n");
+ }
+
+ public ExcelXmlWriter(File file) throws IOException {
+ this(new FileWriter(file));
+ }
+
+ public void startSheet(String worksheetName, int columnCount) throws IOException {
+ this.columnCount = columnCount;
+ if (worksheetName.length() > 31) {
+ worksheetName = worksheetName.substring(0, 31);
+ }
+ out.write(String.format(" <Worksheet ss:Name=\"%s\">\n", worksheetName));
+
+ inSheet = true;
+ startTable = true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.excel.ISheetWriter#endSheet()
+ */
+ public void endSheet() throws IOException {
+ startTableIfNecessary();
+
+ out.write(" </Table>\n");
+ out.write(" </Worksheet>\n");
+ inSheet = false;
+ startTable = false;
+ }
+
+ public void endWorkbook() throws IOException {
+ if (inSheet) {
+ endSheet();
+ }
+ out.write("</Workbook>\n");
+ out.close();
+ }
+
+ protected void startRow() throws IOException {
+ startTableIfNecessary();
+
+ out.write(" <Row>\n");
+ previuosCellIndex = -1;
+ }
+
+ @Override
+ public void writeEndRow() throws IOException {
+ out.write(" </Row>\n");
+ }
+
+ private void startTableIfNecessary() throws IOException {
+ if (startTable) {
+ out.write(" <Table x:FullColumns=\"1\" x:FullRows=\"1\" ss:ExpandedColumnCount=\"" + columnCount + "\">\n");
+ startTable = false;
+ }
+ }
+
+ @Override
+ public void writeCellText(String cellData, int cellIndex) throws IOException {
+ if (cellData == null) {
+ previuosCellIndex = -1; // the next cell will need to use an explicit index
+ } else {
+ out.write(" <Cell");
+ if (previuosCellIndex + 1 != cellIndex) { // use explicit index if at least one cell was skipped
+ out.write(" ss:Index=\"" + (cellIndex + 1) + "\"");
+ }
+ previuosCellIndex = cellIndex;
+ if (!cellData.equals("") && cellData.charAt(0) == '=') {
+ out.write(" ss:Formula=\"" + cellData + "\">");
+ } else {
+ out.write("><Data ss:Type=\"String\">");
+ if (cellData.equals("")) {
+ out.write(emptyStringRepresentation);
+ } else {
+ if (cellData.length() > 32767) {
+ out.write(blobMessage);
+ } else {
+ Xml.writeAsCdata(out, cellData);
+ }
+ }
+ out.write("</Data>");
+ if (cellData.length() > 32767) {
+ out.write("<EmbeddedClob>");
+ Xml.writeAsCdata(out, cellData);
+ out.write("</EmbeddedClob>");
+ }
+ }
+ out.write("</Cell>\n");
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ISheetWriter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ISheetWriter.java
new file mode 100644
index 00000000000..a03c75d020d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/ISheetWriter.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.framework.jdk.core.util.io.xml;
+
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public interface ISheetWriter {
+
+ public void startSheet(String worksheetName, int columnCount) throws IOException;
+
+ public void endSheet() throws IOException;
+
+ public void writeRow(String... row) throws IOException;
+
+ public void writeRow(Collection<String> row) throws IOException;
+
+ public void writeCell(String cellData) throws IOException;
+
+ /**
+ * @param cellData text value of cell
+ * @param cellIndex zero-based index
+ * @throws IOException
+ */
+ public void writeCell(String cellData, int cellIndex) throws IOException;
+
+ public void endRow() throws IOException;
+
+ public void endWorkbook() throws IOException;
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/RowProcessor.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/RowProcessor.java
new file mode 100644
index 00000000000..fd8553fc073
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/RowProcessor.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.framework.jdk.core.util.io.xml;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface RowProcessor {
+ public abstract void processRow(String[] row);
+
+ public abstract void processHeaderRow(String[] row);
+
+ public abstract void processEmptyRow();
+
+ public abstract void processCommentRow(String[] row);
+
+ public abstract void reachedEndOfWorksheet();
+
+ public abstract void foundStartOfWorksheet(String sheetName);
+
+ public abstract void detectedRowAndColumnCounts(int rowCount, int columnCount);
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordMlTableWriter.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordMlTableWriter.java
new file mode 100644
index 00000000000..ac182c4ec0a
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordMlTableWriter.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.framework.jdk.core.util.io.xml;
+
+import java.io.IOException;
+import java.nio.charset.CharacterCodingException;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WordMlTableWriter extends AbstractSheetWriter {
+ private static final String TABLE_START =
+ "<w:tbl><w:tblPr><w:tblBorders><w:top w:val=\"single\" w:sz=\"1\" /><w:left w:val=\"single\" w:sz=\"1\" /><w:bottom w:val=\"single\" w:sz=\"1\" /><w:right w:val=\"single\" w:sz=\"1\" /><w:insideH w:val=\"single\" w:sz=\"1\" /><w:insideV w:val=\"single\" w:sz=\"1\" /></w:tblBorders></w:tblPr>";
+ private static final String TABLE_END = "</w:tbl>";
+ private static final String START_TABLE_GRID = "<w:tblGrid>";
+ private static final String END_TABLE_GRID = "</w:tblGrid>";
+ private static final String TABLE_GRID = "<w:gridCol w:w=\"1024\" />";
+ private static final String CELL_STRART = "<w:tc><w:tcPr><w:tcW w:w=\"1024\" /></w:tcPr><w:p><w:r><w:t>";
+ private static final String CELL_END = "</w:t></w:r></w:p></w:tc>";
+ private static final String ROW_START = "<w:tr>";
+ private static final String ROW_END = "</w:tr>";
+ private final Appendable str;
+ private int columnSize;
+ private boolean startTable;
+
+ public WordMlTableWriter(Appendable str) throws CharacterCodingException {
+ this.str = str;
+ }
+
+ public void startSheet(String worksheetName, int columnCount) throws IOException {
+ str.append(TABLE_START);
+ columnSize = columnCount;
+ startTable = true;
+ }
+
+ public void endSheet() throws IOException {
+ str.append(TABLE_END);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSheetWriter#startRow()
+ */
+ @Override
+ protected void startRow() throws IOException {
+ // column size is set when the first row is created.
+ if (startTable) {
+ writeTableGridData();
+ }
+
+ str.append(ROW_START);
+ }
+
+ @Override
+ public void writeEndRow() throws IOException {
+ str.append(ROW_END);
+ }
+
+ private void writeTableGridData() throws IOException {
+ str.append(START_TABLE_GRID);
+
+ for (int i = 0; i < columnSize; i++) {
+ str.append(TABLE_GRID);
+ }
+ str.append(END_TABLE_GRID);
+ }
+
+ @Override
+ public void writeCellText(String cellData, int cellIndex) throws IOException {
+ str.append(CELL_STRART);
+ if (cellData != null) {
+ str.append(cellData);
+ }
+ str.append(CELL_END);
+ }
+
+ public void endWorkbook() throws IOException {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordSaxHandler.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordSaxHandler.java
new file mode 100644
index 00000000000..18a0f116a10
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/WordSaxHandler.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.framework.jdk.core.util.io.xml;
+
+import java.io.IOException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WordSaxHandler extends AbstractSaxHandler {
+ private boolean inHeader;
+ private boolean inFooter;
+ private StringBuilder headerText;
+ private StringBuilder footerText;
+
+ public WordSaxHandler() {
+ super();
+ headerText = new StringBuilder();
+ footerText = new StringBuilder();
+ }
+
+ public void reset() {
+ headerText.delete(0, 99999999);
+ footerText.delete(0, 99999999);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ if (localName.equalsIgnoreCase("hdr")) {
+ inHeader = true;
+ } else if (localName.equalsIgnoreCase("ftr")) {
+ inFooter = true;
+ } else if (localName.equalsIgnoreCase("Table")) {
+
+ } else if (localName.equalsIgnoreCase("Worksheet")) {
+
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementWithClearContents(java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String qName) throws SAXException {
+ try {
+ if (localName.equalsIgnoreCase("t")) {
+ if (inHeader) {
+ addContentsTo(headerText);
+ } else if (inFooter) {
+ addContentsTo(footerText);
+ }
+ } else if (localName.equalsIgnoreCase("hdr")) {
+ inHeader = false;
+ } else if (localName.equalsIgnoreCase("ftr")) {
+ inFooter = false;
+ }
+ } catch (IOException ex) {
+ throw new SAXException(ex);
+ }
+ }
+
+ public String getHeaderText() {
+ return headerText.toString();
+ }
+
+ public String getFooterText() {
+ return footerText.toString();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlStraightener.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlStraightener.java
new file mode 100644
index 00000000000..ae870a16540
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlStraightener.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.framework.jdk.core.util.io.xml;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.text.Rule;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XmlStraightener extends Rule {
+ private static final Pattern tagPattern = Pattern.compile("<[^!][^>]*>");
+
+ /**
+ * @param outExtension
+ */
+ public XmlStraightener(String outExtension) {
+ super(outExtension);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.text.Rule#computeChanges(java.lang.CharSequence)
+ */
+ @Override
+ public ChangeSet computeChanges(CharSequence seq) {
+ ChangeSet changeSet = new ChangeSet(seq);
+
+ Matcher tagMatcher = tagPattern.matcher(seq);
+ while (tagMatcher.find()) {
+ changeSet.insertBefore(tagMatcher.end(), Lib.lineSeparator);
+ ruleWasApplicable = true;
+ }
+
+ return changeSet;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlTextInputStream.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlTextInputStream.java
new file mode 100644
index 00000000000..f8e30805be3
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/io/xml/XmlTextInputStream.java
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.io.xml;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import org.eclipse.osee.framework.jdk.core.util.HtmlReservedCharacters;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlTextInputStream extends BufferedInputStream {
+ private static final String START_PARAGRAPH = "<w:p";
+ private static final String STOP_PARAGRAPH = "</w:p";
+ private static final String START_WORDML_TEXT = "<w:t>";
+ private static final String END_WORDML_TEXT = "</w:t>";
+
+ private IReadHelper readHelper;
+
+ public XmlTextInputStream(InputStream inputStream) {
+ super(inputStream);
+
+ }
+
+ public XmlTextInputStream(String input) throws UnsupportedEncodingException {
+ this(new ByteArrayInputStream(input.getBytes("UTF-8")));
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.BufferedInputStream#read()
+ */
+ @Override
+ public synchronized int read() throws IOException {
+ if (readHelper == null) {
+ readHelper = Lib.isWordML(in) ? new WordMlReadHelper() : new XmlReadHelper();
+ }
+ int value = readHelper.process(super.read());
+ value = checkForSpecialCharacters(value);
+ return value;
+ }
+
+ private int checkForSpecialCharacters(int value) throws IOException {
+ char currChar = (char) value;
+ if (currChar == '&' && available() > 0) {
+
+ final int readLimit = 10;
+ boolean needsReset = true;
+ super.mark(readLimit);
+ readHelper.saveState();
+ try {
+ StringBuilder specialCharBuffer = new StringBuilder();
+ specialCharBuffer.append(currChar);
+ int readCount = 0;
+ while (currChar != ';' && readCount < readLimit && super.available() > 0) {
+ currChar = (char) readHelper.process(super.read());
+ specialCharBuffer.append(currChar);
+ readCount++;
+ }
+
+ Character reserved = HtmlReservedCharacters.toCharacter(specialCharBuffer.toString());
+ if (reserved != null) {
+ needsReset = false;
+ value = reserved;
+ }
+ } finally {
+ if (needsReset) {
+ super.reset();
+ readHelper.restoreState();
+ }
+ }
+ }
+ return value;
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.BufferedInputStream#read(byte[], int, int)
+ */
+ @Override
+ public synchronized int read(byte[] b, int off, int len) throws IOException {
+ if (b == null) {
+ throw new NullPointerException();
+ } else if (off < 0 || len < 0 || len > b.length - off) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return 0;
+ }
+
+ int c = this.read();
+ if (c == -1) {
+ return -1;
+ }
+ b[off] = (byte) c;
+
+ int i = 1;
+ try {
+ for (; i < len; i++) {
+ c = this.read();
+ if (c == -1) {
+ break;
+ }
+ b[off + i] = (byte) c;
+ }
+ } catch (IOException ee) {
+ }
+ return i;
+ }
+
+ private int readFromOriginalBuffer() throws IOException {
+ return super.read();
+ }
+
+ private interface IReadHelper {
+ public int process(int value) throws IOException;
+
+ public void saveState();
+
+ public void restoreState() throws IOException;
+ }
+
+ private final class XmlReadHelper implements IReadHelper {
+ private boolean partOfTag;
+ private boolean isCarriageReturn;
+
+ private boolean wasSaved;
+ private boolean lastPartOfTag;
+ private boolean lastIsCarriageReturn;
+
+ public XmlReadHelper() {
+ partOfTag = false;
+ isCarriageReturn = false;
+
+ wasSaved = false;
+ lastPartOfTag = false;
+ lastIsCarriageReturn = false;
+ }
+
+ public int process(int value) throws IOException {
+ if ((char) value == '<') {
+ this.partOfTag = true;
+ }
+
+ while ((this.partOfTag || this.isCarriageReturn) && available() > 0) {
+ value = readFromOriginalBuffer();
+ if (value == '\r' || value == '\n') {
+ this.isCarriageReturn = true;
+ } else {
+ this.isCarriageReturn = false;
+ }
+ if ((char) value == '>') {
+ this.partOfTag = false;
+ value = available() > 0 ? ' ' : -1;
+ }
+ }
+ return value;
+ }
+
+ public void restoreState() throws IOException {
+ if (wasSaved) {
+ partOfTag = lastPartOfTag;
+ isCarriageReturn = lastIsCarriageReturn;
+ wasSaved = false;
+ } else {
+ throw new IOException("Save state was not called before restore.");
+ }
+ }
+
+ public void saveState() {
+ wasSaved = true;
+ lastPartOfTag = partOfTag;
+ lastIsCarriageReturn = isCarriageReturn;
+ }
+ }
+
+ private final class WordMlReadHelper implements IReadHelper {
+ private boolean partOfTag;
+ private boolean collect;
+ private boolean isCarriageReturn;
+ private boolean isStartOfParagraph;
+ private StringBuilder buffer;
+
+ private boolean wasSaved;
+ private boolean lastPartOfTag;
+ private boolean lastCollect;
+ private boolean lastIsCarriageReturn;
+ private boolean lastIsStartOfParagraph;
+
+ public WordMlReadHelper() {
+ buffer = new StringBuilder();
+ partOfTag = false;
+ collect = false;
+ isStartOfParagraph = false;
+ isCarriageReturn = false;
+
+ wasSaved = false;
+ lastPartOfTag = false;
+ lastCollect = false;
+ lastIsStartOfParagraph = false;
+ lastIsCarriageReturn = false;
+ }
+
+ public int process(int value) throws IOException {
+ isStartOfParagraph = false;
+ if ((char) value == '<') {
+ partOfTag = true;
+ buffer.append((char) value);
+ }
+ while ((partOfTag || isCarriageReturn || (isStartOfParagraph != true && collect != true)) && available() > 0) {
+ value = readFromOriginalBuffer();
+ if ((char) value == '<') {
+ partOfTag = true;
+ }
+ if (partOfTag) {
+ buffer.append((char) value);
+ }
+ if (value == '\r' || value == '\n') {
+ this.isCarriageReturn = true;
+ } else {
+ this.isCarriageReturn = false;
+ }
+ if ((char) value == '>') {
+ partOfTag = false;
+ String tag = buffer.toString();
+ if (tag.equals(START_WORDML_TEXT)) {
+ collect = true;
+ } else if (tag.equals(END_WORDML_TEXT)) {
+ collect = false;
+ } else if (tag.startsWith(START_PARAGRAPH)) {
+ isStartOfParagraph = true;
+ } else if (tag.startsWith(STOP_PARAGRAPH)) {
+ isStartOfParagraph = false;
+ }
+ buffer.delete(0, buffer.length());
+ value = ' ';
+ if (isStartOfParagraph != true && available() > 0) {
+ value = readFromOriginalBuffer();
+ if ((char) value == '<') {
+ partOfTag = true;
+ buffer.append((char) value);
+ }
+ }
+ }
+ }
+ if (available() <= 0) {
+ value = -1;
+ }
+ return value;
+ }
+
+ public void restoreState() throws IOException {
+ if (wasSaved) {
+ partOfTag = lastPartOfTag;
+ collect = lastCollect;
+ isStartOfParagraph = lastIsStartOfParagraph;
+ isCarriageReturn = lastIsCarriageReturn;
+ wasSaved = false;
+ } else {
+ throw new IOException("Save state was not called before restore.");
+ }
+ }
+
+ public void saveState() {
+ wasSaved = true;
+ lastPartOfTag = partOfTag;
+ lastCollect = collect;
+ lastIsStartOfParagraph = isStartOfParagraph;
+ lastIsCarriageReturn = isCarriageReturn;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/network/PortUtil.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/network/PortUtil.java
new file mode 100644
index 00000000000..edbf0ce7ef3
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/network/PortUtil.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.framework.jdk.core.util.network;
+
+import java.io.IOException;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PortUtil {
+
+ private static PortUtil singleton;
+ @SuppressWarnings("unused")
+ private ServerSocket ss;
+
+ public static PortUtil getInstance() {
+ if (singleton == null) {
+ singleton = new PortUtil();
+ }
+ return singleton;
+ }
+
+ int basePort = 18000;
+ int nextPort = 18000;
+
+ private PortUtil() {
+ basePort = nextPort = OseeProperties.getOseePortScannerStartPort();
+ for (int j = nextPort; j < 64000; j += 250) {
+ if (checkIfPortIsTaken(j)) {
+ basePort = nextPort = j;
+ try {
+ ss = new ServerSocket(basePort);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ break;
+ }
+ }
+ }
+
+ public void computeNewBasePort() {
+ basePort = nextPort = basePort + 1000;
+ for (int j = nextPort; j < 64000; j += 250) {
+ if (checkIfPortIsTaken(j)) {
+ basePort = nextPort = j;
+ try {
+ ss = new ServerSocket(basePort);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ break;
+ }
+ }
+ }
+
+ public int getValidPort() throws IOException {
+ int port = getConsecutiveValidPorts(1);
+ return port;
+ }
+
+ public int getConsecutiveValidPorts(int numberOfPorts) throws IOException {
+ try {
+ int returnVal = getConsecutiveLocalPorts(numberOfPorts);
+ nextPort = returnVal + numberOfPorts;
+ return returnVal;
+ } catch (Exception e) {
+ e.printStackTrace();
+ IOException ioE = new IOException("Unable to get a valid port.");
+ ioE.initCause(e);
+ throw ioE;
+ }
+ }
+
+ /**
+ * @param numberOfPorts The number of consecutive available ports to find
+ * @return The port of first number in the sequence of valid ports
+ * @throws Exception
+ */
+ private int getConsecutiveLocalPorts(int numberOfPorts) throws Exception {
+ if (nextPort >= basePort + 250 - numberOfPorts) {
+ nextPort = basePort;
+ }
+ for (int i = nextPort, count = 1; i < basePort + 250; i++, count++) {
+ boolean passed = true;
+ for (int j = i; j < numberOfPorts + i; j++) {
+ if (!checkIfPortIsTaken(j)) {
+ passed = false;
+ break;
+ }
+ }
+ if (passed) {
+ return i;
+ }
+ }
+ throw new Exception("Unable to find valid port.");
+ }
+
+ private boolean checkIfPortIsTaken(int port) {
+ return checkTcpIp(port) && checkUdpPort(port);
+ }
+
+ private boolean checkTcpIp(int port) {
+ try {
+ ServerSocket socket;
+ socket = new ServerSocket(port);
+ socket.close();
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+ private boolean checkUdpPort(int port) {
+ try {
+ DatagramSocket ds = new DatagramSocket(port, InetAddress.getLocalHost());
+ ds.close();
+ ds.disconnect();
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/requirement/RequirementId.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/requirement/RequirementId.java
new file mode 100644
index 00000000000..585c385c79a
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/requirement/RequirementId.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.framework.jdk.core.util.requirement;
+
+import java.util.Vector;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public class RequirementId implements Xmlizable {
+ // TODO add requirement data
+ private String description;
+ private Vector<String> partialDescriptions;
+ private int timesVerified;
+ private boolean isPartial, isWhole, conflictExists;
+
+ /**
+ *
+ */
+ public RequirementId() {
+ this("");
+ this.timesVerified = 0;
+ this.isPartial = false;
+ this.isWhole = false;
+ this.conflictExists = false;
+ }
+
+ public RequirementId(String description) {
+ super();
+ this.description = description;
+ }
+
+ public String toString() {
+ return description;
+ }
+
+ public Element toXml(Document doc) {
+ return Jaxp.createElement(doc, "RequirementId", description);
+ }
+
+ public boolean conflictPresent() {
+ return conflictExists;
+ }
+
+ /**
+ * Increments the count for how many times this requirement has been verified (which should only be once). If this
+ * requirement has already been marked as being previously verified (either partially or wholly) than a conflict flag
+ * will be set since a requirement can only be wholly verified once.
+ */
+ public void verifiedHere() {
+
+ // TODO add ability to store in what script this requirement is verified.
+
+ if (isPartial || isWhole) {
+ conflictExists = true;
+ } else {
+ isWhole = true;
+ timesVerified++;
+ }
+
+ }
+
+ /**
+ * Adds a new description to the partial requirement description vector and increments the count for how many times
+ * this requirement has been verified. If this requirement has already been marked as being wholly verified than a
+ * conflict flag will be set since a partial verify is not needed.
+ *
+ * @param partialDesc - Helpful and concise description of what part of the requirement is being verified.
+ */
+ public void partiallyVerifiedHere(String partialDesc) {
+
+ // TODO add ability to store in what script or function this requirement is partially verified.
+
+ if (isWhole) {
+ conflictExists = true;
+ } else {
+ if (!isPartial) {
+ isPartial = true;
+ }
+
+ partialDescriptions.add(partialDesc);
+ timesVerified++;
+ }
+
+ }
+
+ public void usedHere() {
+
+ // TODO add ability to store in what script or function this requirement is used.
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/time/GlobalTime.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/time/GlobalTime.java
new file mode 100644
index 00000000000..d34556959ad
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/time/GlobalTime.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.framework.jdk.core.util.time;
+
+import java.sql.Timestamp;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class GlobalTime {
+
+ public static Timestamp GreenwichMeanTimestamp() {
+ return new Timestamp(GreenwichMeanTimeMillis());
+ }
+
+ public static long GreenwichMeanTimeMillis() {
+ return Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/OutlookCalendarEvent.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/OutlookCalendarEvent.java
new file mode 100644
index 00000000000..82c229f01f7
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/OutlookCalendarEvent.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.framework.jdk.core.util.windows;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class OutlookCalendarEvent {
+
+ private final String location;
+ private final String event;
+ private final Date date;
+ private final DateFormat myDateFormat;
+ private final String startTime;
+ private final String endTime;
+
+ /**
+ * @param location - String the event location
+ * @param event - String the scheduled event
+ * @param date
+ * @param startTime - 0800 - 8am
+ * @param endTime - 1300 - 1pm
+ */
+ public OutlookCalendarEvent(String location, String event, Date date, String startTime, String endTime) {
+ super();
+ this.location = location;
+ this.event = event;
+ this.date = date;
+ this.startTime = startTime;
+ this.endTime = endTime;
+ myDateFormat = new SimpleDateFormat("yyyyMMdd");
+ }
+
+ public String getEvent() {
+ return "\nBEGIN:VCALENDAR\n" +
+ //
+ "PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN\n" +
+ //
+ "VERSION:1.0\n" +
+ //
+ "BEGIN:VEVENT\n" +
+ //
+ "DTSTART:" + myDateFormat.format(date) + "T" + startTime + "00\n" +
+ //
+ "DTEND:" + myDateFormat.format(date) + "T" + endTime + "00\n" +
+ //
+ "LOCATION;ENCODING=QUOTED-PRINTABLE:" + location + "\n" +
+ //
+ "TRANSP:1\n" +
+ //
+ "DESCRIPTION;ENCODING=QUOTED-PRINTABLE:=0D=0A\n" +
+ //
+ "SUMMARY;ENCODING=QUOTED-PRINTABLE:Event:" + event + "\n" +
+ //
+ "PRIORITY:3\n" +
+ //
+ "END:VEVENT\n" +
+ //
+ "END:VCALENDAR\n";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/Registry.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/Registry.java
new file mode 100644
index 00000000000..9b953d46e81
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/windows/Registry.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.framework.jdk.core.util.windows;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+public class Registry {
+
+ public static final String HKEY_LOCAL_MACHINE = "HKLM";
+ public static final String HKEY_CURRENT_USER = "HKCU";
+ public static final String REG_SZ = "REG_SZ";
+ public static final String REG_HELP_CMD = "reg /?";
+
+ public abstract interface RegVersion {
+ abstract public String getQueryCmd(String root, String path, String key);
+
+ abstract public String getQueryPattern(String key);
+
+ abstract public String getUpdateCommand(String root, String path, String key, String value, String[] regArray);
+
+ abstract public String isVersion();
+ }
+
+ public class RegVersion_1_00 implements RegVersion {
+ public String getQueryCmd(String root, String path, String key) {
+ return "reg query " + root + "\\" + path + "\\" + key;
+ }
+
+ public String getQueryPattern(String key) {
+ return "out:\\s*(\\w*)\\s*" + key + "\\s*(.*)";
+ }
+
+ public String getUpdateCommand(String root, String path, String key, String value, String[] regArray) {
+ String cmd = "";
+ if (regArray != null) {
+ value = value + File.pathSeparator + regArray[1];
+ System.out.println("THE VALUE IS: " + value);
+ cmd = "reg update \"" + root + "\\" + path + "\\" + key + "=" + value + "\"";
+ } else {
+ cmd = "reg add \"" + root + "\\" + path + "\\" + key + "=" + value + "\"";
+ }
+
+ System.out.println("THE CMD IS: " + cmd);
+
+ return cmd;
+ }
+
+ public String isVersion() {
+ return "1.00";
+ }
+ }
+
+ public class RegVersion_3_0 implements RegVersion {
+
+ public String getQueryCmd(String root, String path, String key) {
+ return "reg query " + root + "\\" + path + " /v " + key;
+ }
+
+ public String getQueryPattern(String key) {
+ return ".*?" + key + "\\s*(\\w*)\\s*(\\S*).*";
+ }
+
+ public String getUpdateCommand(String root, String path, String key, String value, String[] regArray) {
+ String type = Registry.REG_SZ;
+ if (regArray != null) {
+ value = value + File.pathSeparator + regArray[1];
+ type = regArray[0];
+ }
+ return "reg add " + root + "\\" + path + " /v " + key + " /t " + type + " /f /d \"" + value + "\"";
+ }
+
+ public String isVersion() {
+ return "3.0";
+ }
+ }
+
+ public static boolean isRegVersion(double lowerBound, double upperBound) throws IOException {
+ boolean matched = false;
+ Process p = Runtime.getRuntime().exec(Registry.REG_HELP_CMD);
+ StringWriter stringWriter = new StringWriter();
+ Lib.handleProcess(p, stringWriter);
+
+ Pattern pattern = Pattern.compile(".*version\\s(\\d*\\.\\d+).*", Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(stringWriter.toString());
+
+ System.out.println(matcher.groupCount());
+ if (matcher.matches()) {
+ String regVersion = matcher.group(1).trim();
+ System.out.println("Found Version: " + regVersion);
+
+ double foundVersion = Double.parseDouble(regVersion);
+ if ((foundVersion >= lowerBound) && (foundVersion <= upperBound)) {
+ matched = true;
+ }
+ }
+ return matched;
+ }
+
+ public static RegVersion getVersion() throws IOException {
+ Registry r = new Registry();
+ RegVersion regVersion = null;
+ if (Registry.isRegVersion(1.00, 1.99)) {
+ regVersion = r.new RegVersion_1_00();
+ } else {
+ regVersion = r.new RegVersion_3_0();
+ }
+ return regVersion;
+ }
+
+ public static String[] getValue(RegVersion version, String root, String path, String key) throws IOException {
+ String toReturn[] = null;
+
+ Process p = Runtime.getRuntime().exec(version.getQueryCmd(root, path, key));
+ StringWriter stringWriter = new StringWriter();
+ Lib.handleProcess(p, stringWriter);
+
+ Pattern pattern = Pattern.compile(version.getQueryPattern(key), Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(stringWriter.toString());
+ if (matcher.matches()) {
+ toReturn = new String[matcher.groupCount()];
+
+ for (int i = 1; i <= matcher.groupCount(); i++) {
+ toReturn[i - 1] = matcher.group(i).trim();
+ }
+ }
+
+ if (toReturn != null) {
+ for (String temp : toReturn) {
+ System.out.println("VAL: " + temp);
+ }
+ }
+ return toReturn;
+ }
+
+ public static boolean prependRegistryValue(File updatedReg, String root, String path, String key, String value) throws IOException {
+
+ RegVersion version = Registry.getVersion();
+
+ String[] regArray = Registry.getValue(version, root, path, key);
+
+ if (regArray != null) {
+ if (regArray[1].contains(value)) {
+ System.out.println("Value is already there.");
+ return true;
+ }
+ }
+
+ String command = version.getUpdateCommand(root, path, key, value, regArray);
+
+ /*
+ * If we are using a 1.0 version then use a provided reg.exe executable to use commands. If
+ * not operation will fail.
+ */
+ if (version.isVersion().equals("1.00")) {
+ if (updatedReg.exists() && updatedReg.isFile()) {
+ command = updatedReg.getAbsolutePath() + command.replaceAll("reg", "");
+ ;
+ }
+ }
+
+ Process p = Runtime.getRuntime().exec(command);
+ StringWriter stringWriter = new StringWriter();
+
+ Lib.handleProcess(p, stringWriter);
+
+ System.out.println("The string: " + stringWriter);
+
+ if (stringWriter.toString().contains("err:")) {
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean prependRegistryValue(String root, String path, String key, String value) throws IOException {
+
+ RegVersion version = Registry.getVersion();
+
+ String[] regArray = Registry.getValue(version, root, path, key);
+
+ Process p = Runtime.getRuntime().exec(version.getUpdateCommand(root, path, key, value, regArray));
+ StringWriter stringWriter = new StringWriter();
+
+ Lib.handleProcess(p, stringWriter);
+
+ System.out.println("The string: " + stringWriter);
+
+ if (stringWriter.toString().contains("err:")) {
+ return false;
+ }
+ return true;
+ }
+
+ public static void main(String[] args) {
+ try {
+ Registry.prependRegistryValue(Registry.HKEY_CURRENT_USER, "environment", "path", "HI THERE");
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Jaxp.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Jaxp.java
new file mode 100644
index 00000000000..84da2b7187d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Jaxp.java
@@ -0,0 +1,610 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.xml;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.Text;
+import org.xml.sax.SAXException;
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
+
+public class Jaxp {
+ private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ /**
+ * Obtains a list of all direct descendants of element
+ *
+ * @param element the element to find the children of
+ * @return A list of elements that are direct children of element. If no children exist, an empty list is returned.
+ */
+ public static List<Element> getChildDirects(Element element) {
+ NodeList nl = element.getChildNodes();
+ List<Element> elementList = new ArrayList<Element>(nl.getLength()); // this may be oversized
+ for (int i = 0; i < nl.getLength(); i++) {
+ Node n = nl.item(i);
+ if (n.getNodeType() == Node.ELEMENT_NODE) elementList.add((Element) n);
+ }
+ return elementList;
+ }
+
+ /**
+ * Obtains a list of all direct descendants of element with the matching tag.
+ *
+ * @param element the element to find the children of
+ * @param childTagName the tag name for the children
+ * @return A list of elements that are direct children of element whose tag names match childTagName. If no such
+ * children exist, an empty list is returned.
+ */
+ public static List<Element> getChildDirects(Element element, String childTagName) {
+ List<Element> elementList = new ArrayList<Element>();
+ NodeList nl = element.getChildNodes();
+ for (int i = 0; i < nl.getLength(); i++) {
+ Node n = nl.item(i);
+ if (n.getNodeType() == Node.ELEMENT_NODE && ((Element) n).getTagName().equals(childTagName)) elementList.add((Element) n);
+ }
+ return elementList;
+ }
+
+ /**
+ * Obtains the first child that is a direct descendant of element with the matching tag
+ *
+ * @param element the element to find the child of
+ * @param childTagName the tag name for the child
+ * @return the first child with the given tag one level deep from element, null if no such child exists.
+ */
+ public static Element getChildDirect(Element element, String childTagName) {
+ NodeList nl = element.getChildNodes();
+ for (int i = 0; i < nl.getLength(); i++) {
+ Node n = nl.item(i);
+ if (n.getNodeType() == Node.ELEMENT_NODE && ((Element) n).getTagName().equals(childTagName)) return ((Element) n);
+ }
+ return null;
+ }
+
+ /**
+ * Obtains the first child that is a descendant of element with the matching tag
+ *
+ * @param element the element to find the child of
+ * @param childTagName the tag name for the child
+ * @return the first child with the given tag, or null if no such children exist
+ */
+ public static Element getChild(Element element, String childTagName) {
+ NodeList elementList = element.getElementsByTagName(childTagName);
+ return (Element) elementList.item(0);
+ }
+
+ public static Element createElement(Document d, String tag, String characterData) {
+ Element e = d.createElement(tag);
+ Text t = d.createTextNode(characterData);
+ e.appendChild(t);
+ // e.setTextContent(characterData);
+ // the above two lines do the same thing as this, but I trust them more so we'll go that
+ // route.
+ return e;
+ }
+
+ /**
+ * Obtains the character data for the Element. Note this differs from the Node.getTextContext(); call, which returns
+ * the concatenation of the character data for all children of this Element.
+ *
+ * @param e The element go get the character data for
+ * @param trimWhitespace iff true, each segment will be trimmed.
+ * @return All of the character data for the Element e. This means if there are elements separating the character
+ * data, it will all be concatenated together. If trimWhitespace, each segment will be trimmed of whitespace,
+ * with a single space between segments; otherwise the segments will be concatenated without any space
+ * separation. If no character data is present, returns an empty string.
+ */
+ public static String getElementCharacterData(Element e, boolean trimWhitespace) {
+ NodeList childNodes = e.getChildNodes();
+ String resultString = "";
+ boolean first = true;
+
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ Node n = childNodes.item(i);
+ if (n.getNodeType() == Node.TEXT_NODE) {
+ if (!first && trimWhitespace) resultString += " ";
+ resultString += trimWhitespace ? n.getNodeValue().trim() : n.getNodeValue();
+ first = false;
+ } else if (n.getNodeType() == Node.CDATA_SECTION_NODE) {
+ if (!first && trimWhitespace) resultString += " ";
+ resultString += trimWhitespace ? n.getNodeValue().trim() : n.getNodeValue();
+ first = false;
+ }
+
+ }
+ return resultString;
+ }
+
+ /**
+ * Obtains the character data for the Element. Note this differs from the Node.getTextContext(); call, which returns
+ * the concatenation of the character data for all children of this Element.
+ *
+ * @param e The element go get the character data for
+ * @return All of the character data for the Element e. This means if there are elements separating the character
+ * data, it will all be concatenated together. Each segment will be trimmed of whitespace, with a single
+ * space between segments. If no character data is present, returns an empty string.
+ */
+ public static String getElementCharacterData(Element e) {
+ return getElementCharacterData(e, true);
+ }
+
+ /**
+ * Obtains the character data for each element in the collection, return as a List. Each entry in the list
+ * corresponding to the character data for one of the elements in the collection.
+ *
+ * @param elements
+ * @return
+ */
+ public static List<String> getElementsCharacterData(Collection<Element> elements) {
+ List<String> result = new ArrayList<String>(elements.size());
+ for (Element e : elements) {
+ result.add(Jaxp.getElementCharacterData(e));
+ }
+ return result;
+ }
+
+ /**
+ * @param nodes The NodeList whose text we will return
+ * @return An ArrayList<String> of the text for all nodes
+ */
+ public static ArrayList<String> getChildrenTexts(NodeList nodes) {
+ ArrayList<String> retVal = new ArrayList<String>(nodes.getLength());
+
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Element element = (Element) nodes.item(i);
+ retVal.add(getElementCharacterData(element));
+ }
+ return retVal;
+ }
+
+ /**
+ * Obtains a list of Strings of the character data for all elements in the document whose tag name matches.
+ *
+ * @param document The document to be searched
+ * @param tagName The tagName for the children whose text we will obtain
+ * @return An ArrayList<String> of the text for all child nodes matching tagName
+ */
+ public static ArrayList<String> getChildrenTexts(Document document, String tagName) {
+ return getChildrenTexts(document.getElementsByTagName(tagName));
+ }
+
+ /**
+ * Obtains a list of Strings of the character data for all descendants of element whose tag name matches.
+ *
+ * @param document The document to be searched
+ * @param tagName The tagName for the children whose text we will obtain
+ * @return An ArrayList<String> of the text for all child nodes matching tagName
+ */
+ public static ArrayList<String> getChildrenTexts(Element element, String tagName) {
+ return getChildrenTexts(element.getElementsByTagName(tagName));
+ }
+
+ public static String getChildText(Element element, String childTagName, boolean trim) {
+ Element child = getChild(element, childTagName);
+ if (child != null) {
+ return getElementCharacterData(child, trim);
+ }
+ return null;
+ }
+
+ public static String getChildText(Element element, String childTagName) {
+ return getChildText(element, childTagName, false);
+ }
+
+ public static String getChildTextTrim(Element element, String childTagName) {
+ return getChildText(element, childTagName, true);
+ }
+
+ private static void findElementsInternal(List<Element> source, LinkedList<String> path, List<Element> list) {
+ String tag = path.poll();
+ LinkedList<String> childPath = new LinkedList<String>(path);
+
+ for (Element e : source) {
+ List<Element> children = getChildDirects(e, tag);
+ if (!children.isEmpty()) {
+ if (path.size() == 0) // we're at the end of the path
+ list.addAll(children);
+ else {
+ findElementsInternal(children, childPath, list);
+ }
+ }
+ }
+ }
+
+ /**
+ * Searches for all sub-elements found at the path provided.
+ *
+ * @param element The element underneath which we will search
+ * @param elementPath The path to follow. For example ["script","configuration","element_i_want"]
+ * @param firstIsRoot If true, the first item in elementPath must match element. That is, in the above example, e's
+ * tag name must be "script". This is useful when calling from the document level, that is where element is
+ * Document.getDocumentElement(), the first item in the path would be the first root element of the xml
+ * tree.
+ * @return All elements that match the specified path.
+ */
+ public static List<Element> findElements(Element element, List<String> elementPath, boolean firstIsRoot) {
+ List<Element> result = new LinkedList<Element>();
+ List<Element> source = new ArrayList<Element>(1);
+ source.add(element);
+
+ LinkedList<String> path;
+ if (elementPath instanceof LinkedList)
+ path = (LinkedList<String>) (elementPath);
+ else
+ path = new LinkedList<String>(elementPath);
+
+ // Strip off the first item of elementPath and make sure it matches 'element'
+ if (firstIsRoot) {
+ String firstTagName = path.poll();
+ if (element.getTagName().equals(firstTagName)) return result;
+ }
+
+ findElementsInternal(source, path, result);
+ return result;
+ }
+
+ private static List<Element> findElementsSinglePath(Element e, String elementPath, boolean firstIsRoot) {
+ return findElements(e, Arrays.asList(elementPath.split("/")), firstIsRoot);
+ }
+
+ private static List<Element> findElements(Element e, String elementPath, boolean firstIsRoot) {
+ List<Element> result = new LinkedList<Element>();
+ String[] paths = elementPath.split("\\|");
+
+ for (String path : paths) {
+ result.addAll(findElementsSinglePath(e, path, firstIsRoot));
+ }
+ return result;
+ }
+
+ public static List<Element> findElements(Element element, String elementPath) {
+ return findElements(element, elementPath, false);
+ }
+
+ public static List<Element> findElements(Document d, String elementPath) {
+ return findElements(d.getDocumentElement(), elementPath, true);
+ }
+
+ /**
+ * Searches for a sub-element found at the path provided. Each list element indicates the tag name for the next
+ * sub-element.
+ *
+ * @param e The element underneath which we will search
+ * @param elementPath The path to follow. For example ["script","configuration","element_i_want"]
+ * @return The first element that matches the provided path, beneath the provided element e, or null if no such
+ * element exists.
+ */
+ public static Element findElement(Element element, List<String> elementPath) {
+
+ Element e = element;
+ for (String tag : elementPath) {
+ NodeList a = e.getChildNodes();
+ Element nextElement = null;
+ for (int i = 0; i < a.getLength() && nextElement == null; i++) {
+ Node n = a.item(i);
+ if (n.getNodeType() == Node.ELEMENT_NODE && ((Element) n).getTagName().equals(tag)) nextElement =
+ (Element) n;
+ }
+ if (nextElement == null)
+ return null;
+ else
+ e = nextElement;
+ }
+ return e;
+ }
+
+ /**
+ * Searches the Document for the Element found at the '/' delimited path provided. The path should begin with the
+ * root node of the document.
+ *
+ * @param d The document to search
+ * @param elementPath The path to follow. For example "script/configuration/element_i_want"
+ * @return The first element that matches the provided path, or null if no such element exists.
+ */
+ public static Element findElement(Document d, String elementPath) {
+ List<String> pathList = Arrays.asList(elementPath.split("/"));
+ String rootTagName = pathList.get(0);
+ // Remove the first item from the list, Arrays.asList List type doesn't support .remove()
+ if (pathList.size() > 1)
+ pathList = pathList.subList(1, pathList.size());
+ else
+ pathList.clear();
+
+ Element root = d.getDocumentElement();
+ if (!root.getTagName().equals(rootTagName)) return null;
+ return findElement(d.getDocumentElement(), pathList);
+ }
+
+ /**
+ * Searches for a sub-element found at the '/' delimited path provided. The path should begin with the first node
+ * underneath the provided element.
+ *
+ * @param e The element underneath which we will search
+ * @param elementPath The path to follow. For example "script/configuration/element_i_want"
+ * @return The first element that matches the provided path, beneath the provided element e, or null if no such
+ * element exists.
+ */
+ public static Element findElement(Element e, String elementPath) {
+ return findElement(e, Arrays.asList(elementPath.split("/")));
+ }
+
+ public static Document readXmlDocument(InputStream is) throws ParserConfigurationException, SAXException, IOException {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ return builder.parse(is);
+ }
+
+ public static Document readXmlDocument(String xmlString) throws ParserConfigurationException, SAXException, IOException {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ CharBackedInputStream charBak = new CharBackedInputStream();
+ charBak.addBackingSource(xmlString);
+ Document document = builder.parse(charBak);
+ return document;
+ }
+
+ public static Document readXmlDocument(File xmlFile) throws ParserConfigurationException, SAXException, IOException {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(xmlFile);
+ return document;
+ }
+
+ public static Document readXmlDocumentFromResource(Class<?> base, String name) throws ParserConfigurationException, SAXException, IOException {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(base.getResourceAsStream(name));
+ return document;
+ }
+
+ public static Document readXmlDocumentNamespaceAware(InputStream is) throws ParserConfigurationException, SAXException, IOException {
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ return builder.parse(is);
+ }
+
+ public static Document readXmlDocumentNamespaceAware(String xmlString) throws ParserConfigurationException, SAXException, IOException {
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ CharBackedInputStream charBak = new CharBackedInputStream();
+ charBak.addBackingSource(xmlString);
+ Document document = builder.parse(charBak);
+ return document;
+ }
+
+ public static Document readXmlDocumentNamespaceAware(File xmlFile) throws ParserConfigurationException, SAXException, IOException {
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+
+ Document document = builder.parse(xmlFile);
+ return document;
+ }
+
+ public static Document readXmlDocumentFromResourceNamespaceAware(Class<?> base, String name) throws ParserConfigurationException, SAXException, IOException {
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(base.getResourceAsStream(name));
+ return document;
+ }
+
+ /**
+ * Adds the XSL style sheet processing instruction to the document.
+ *
+ * @param d
+ * @param xslPath
+ */
+ public static void setXslProperty(Document d, String xslPath) {
+ ProcessingInstruction xsl = d.createProcessingInstruction("xml-stylesheet", //
+ "type=\"text/xsl\" href=\"" + xslPath + "\"");
+ d.appendChild(xsl);
+ }
+
+ /**
+ * Adds an XML comment to a document
+ *
+ * @param d
+ * @param comment
+ */
+ public static void addComment(Document d, String comment) {
+ d.appendChild(d.createComment(comment));
+ d.getChildNodes().item(0);
+ }
+
+ public static void prependComment(Document d, String comment) {
+ Node commentNode = d.createComment(comment);
+
+ Node firstNode = getChild(d.getDocumentElement(), "TestScript");
+ d.insertBefore(commentNode, firstNode);
+ }
+
+ /**
+ * Writes the XML document 'document' to the 'file'.
+ *
+ * @param document The XML document to output
+ * @param file Where to put the output
+ * @throws TransformerException
+ * @throws IOException
+ */
+ public static void writeXmlDocument(Document document, File file) throws TransformerException, IOException {
+ writeXmlDocument(document, file, getCompactFormat(document));
+ }
+
+ /**
+ * Writes the XML document 'document' to the 'file'.
+ *
+ * @param document The XML document to output
+ * @param file Where to put the output
+ * @param prettyOutput If true, turns on indention so the output is more easily readable, if False turns indention
+ * off to save space.
+ * @throws TransformerException
+ * @throws IOException
+ */
+ public static void writeXmlDocument(Document document, File file, OutputFormat format) throws TransformerException, IOException {
+ BufferedWriter out = new BufferedWriter(new FileWriter(file));
+ outputXmlDocument(document, out, format);
+ out.close();
+ }
+
+ /**
+ * Gets the XML document 'document' as a string
+ *
+ * @param document The XML document to output
+ * @param file Where to put the output
+ * @param prettyOutput If true, turns on indention so the output is more easily readable, if False turns indention
+ * off and is assumed to provide the XML as compactly as possible.
+ * @throws TransformerException
+ */
+ public static String xmlToString(Document document, OutputFormat format) throws IOException {
+ StringWriter stringWriter = new StringWriter();
+ outputXmlDocument(document, stringWriter, format);
+ return stringWriter.toString();
+ }
+
+ /**
+ * Sends the XML to the output
+ *
+ * @param document The source XML
+ * @param output Where the XML is 'printed' to
+ * @param format The format style to use
+ * @throws IOException
+ */
+ private static void outputXmlDocument(Document document, Writer output, OutputFormat format) throws IOException {
+ XMLSerializer serializer = new XMLSerializer(output, format);
+ serializer.serialize(document);
+ }
+
+ /**
+ * Generates an OutputFormat that is pleasing to look at (indention, newlines, etc)
+ *
+ * @param document the document to be formatted
+ * @return the OutputFormat object to use for XML Formatting
+ * @see XMLSerializer
+ */
+ public static OutputFormat getPrettyFormat(Document document) {
+ OutputFormat format = new OutputFormat(document);
+ format.setIndenting(true);
+ format.setIndent(2);
+ return format;
+ }
+
+ /**
+ * Generates an OutputFormat that is compact (no extra whitepsace)
+ *
+ * @param document the document to be formatted
+ * @return the OutputFormat object to use for XML Formatting
+ * @see XMLSerializer
+ */
+ public static OutputFormat getCompactFormat(Document document) {
+ OutputFormat format = new OutputFormat(document);
+ format.setIndenting(false);
+ format.setLineSeparator("");
+ return format;
+ }
+
+ public static Document newDocument() throws ParserConfigurationException {
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ return builder.newDocument();
+ }
+
+ public static String getDocumentXml(Document doc) throws TransformerException {
+ Source source = new DOMSource(doc);
+ StringWriter stringWriter = new StringWriter();
+ Result result = new StreamResult(stringWriter);
+ TransformerFactory factory = TransformerFactory.newInstance();
+ Transformer transformer = factory.newTransformer();
+ transformer.transform(source, result);
+ return stringWriter.getBuffer().toString();
+ }
+
+ public static void main(String args[]) {
+ try {
+ Document doc = readXmlDocument("<A name='george' type='level1'>" + " <B type='level2'>I'm at level 2</B>" //
+ + " <B type='level2'>I'm also at level 2</B>" //
+ + " <C type='level2'>" //
+ + " <D>likes to be C's child</D>" //
+ + "C has some more text here" //
+ + " <D>2nd round</D>"//
+ + "END of C" //
+ + " </C>" //
+ + "</A>");
+
+ Element e = (Element) getChild(doc.getDocumentElement(), "C");
+ System.out.println("e.getTagName :" + e.getTagName());
+ System.out.println("e.getLocalName :" + e.getLocalName());
+ System.out.println("e.getNodeName :" + e.getNodeName());
+ System.out.println("e.getNodeType :" + e.getNodeType());
+ System.out.println("e.getNodeValue :" + e.getNodeValue());
+ System.out.println("e.getPrefix :" + e.getPrefix());
+ System.out.println("e.getTextContent :" + e.getTextContent());
+ System.out.println("");
+ System.out.println("e.getFirstChild().getNodeValue :" + e.getFirstChild().getNodeValue());
+ System.out.println("e.getFirstChild().getTextContent :" + e.getFirstChild().getTextContent());
+ System.out.println("");
+ System.out.println(getElementCharacterData(e));
+
+ System.out.println("");
+ System.out.println("Looking for the Top level item:");
+ NodeList nl = doc.getElementsByTagName("A");
+ for (int i = 0; i < nl.getLength(); i++) {
+ System.out.println(" Found: " + nl.item(i).getNodeName());
+ }
+ System.out.println("Looking for the Top level item:");
+ nl = doc.getDocumentElement().getElementsByTagName("A");
+ for (int i = 0; i < nl.getLength(); i++) {
+ System.out.println("Found: " + nl.item(i).getNodeName());
+ }
+
+ System.out.println("");
+ System.out.println("Searching For D:");
+ Element em = findElement(doc, "A/C/D");
+ System.out.println(em.getTagName() + ":" + getElementCharacterData(em));
+
+ List<Element> list = findElements(doc.getDocumentElement(), "C/D");
+ for (Element te : list)
+ System.out.println(te.getTagName() + ":" + getElementCharacterData(te));
+
+ Element joe = Jaxp.createElement(doc, "f", "This is F's Data");
+ em.appendChild(joe);
+
+ System.out.println(Jaxp.getElementCharacterData(joe));
+
+ System.out.println("******");
+ System.out.println(xmlToString(doc, getPrettyFormat(doc)));
+
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/SimpleNamespaceContext.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/SimpleNamespaceContext.java
new file mode 100644
index 00000000000..1e36cba4523
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/SimpleNamespaceContext.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.framework.jdk.core.util.xml;
+
+/**
+ * @author Paul Waldfogel
+ */
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+
+public class SimpleNamespaceContext implements NamespaceContext {
+
+ private Map urisByPrefix = new HashMap();
+
+ private Map prefixesByURI = new HashMap();
+
+ public SimpleNamespaceContext() {
+ // prepopulate with xml and xmlns prefixes
+ // per JavaDoc of NamespaceContext interface
+ addNamespace(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI);
+ addNamespace(XMLConstants.XMLNS_ATTRIBUTE, XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
+ }
+
+ public synchronized void addNamespace(String prefix, String namespaceURI) {
+ urisByPrefix.put(prefix, namespaceURI);
+ if (prefixesByURI.containsKey(namespaceURI)) {
+ ((Set) prefixesByURI.get(namespaceURI)).add(prefix);
+ } else {
+ Set set = new HashSet();
+ set.add(prefix);
+ prefixesByURI.put(namespaceURI, set);
+ }
+ }
+
+ public String getNamespaceURI(String prefix) {
+ if (prefix == null) throw new IllegalArgumentException("prefix cannot be null");
+ if (urisByPrefix.containsKey(prefix))
+ return (String) urisByPrefix.get(prefix);
+ else
+ return XMLConstants.NULL_NS_URI;
+ }
+
+ public String getPrefix(String namespaceURI) {
+ return (String) getPrefixes(namespaceURI).next();
+ }
+
+ public Iterator getPrefixes(String namespaceURI) {
+ if (namespaceURI == null) throw new IllegalArgumentException("namespaceURI cannot be null");
+ if (prefixesByURI.containsKey(namespaceURI)) {
+ return ((Set) prefixesByURI.get(namespaceURI)).iterator();
+ } else {
+ return Collections.EMPTY_SET.iterator();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Xml.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Xml.java
new file mode 100644
index 00000000000..13b4584d57d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/Xml.java
@@ -0,0 +1,460 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.xml;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+import com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList;
+
+/**
+ * @author David Diepenbrock
+ * @author Paul Waldfogel
+ */
+public class Xml {
+ private static final String[] XML_CHARS = new String[] {"[&]", "[<]", "[>]", "[\"]"};
+ private static final String[] XML_ESCAPES = new String[] {"&amp;", "&lt;", "&gt;", "&quot;"};
+ private static final String LINEFEED = "&#10;";
+ private static final String CARRIAGE_RETURN = "&#13;";
+ private static final Pattern squareBracket = Pattern.compile("\\]");
+ public final static XPathFactory myXPathFactory = XPathFactory.newInstance();
+ public final static XPath myXPath = myXPathFactory.newXPath();
+ public final static String wordLeader1 =
+ "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" + "<?mso-application progid='Word.Document'?>";
+ public final static String wordLeader2 =
+ "<w:wordDocument xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:w10='urn:schemas-microsoft-com:office:word' xmlns:sl='http://schemas.microsoft.com/schemaLibrary/2003/core' xmlns:aml='http://schemas.microsoft.com/aml/2001/core' xmlns:wx='http://schemas.microsoft.com/office/word/2003/auxHint' xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:wsp='http://schemas.microsoft.com/office/word/2003/wordml/sp2' xmlns:ns0='http://www.w3.org/2001/XMLSchema' xmlns:ns1='http://eclipse.org/artifact.xsd' xmlns:st1='urn:schemas-microsoft-com:office:smarttags' w:macrosPresent='no' w:embeddedObjPresent='no' w:ocxPresent='no' xml:space='preserve'>";
+ public final static String wordLeader = wordLeader1.concat(wordLeader2);
+ public final static String wordBody = "<w:body></w:body>";
+ public final static String wordTrailer = "</w:wordDocument> ";
+ public final SimpleNamespaceContext mySimpleNamespaceContext = new SimpleNamespaceContext();
+ public final static Matcher theFunnyQuoteMatcher = Pattern.compile("’").matcher("");
+
+ /**
+ * TODO Optimize algorithm
+ *
+ * @param text
+ * @return Returns a string with entity reference characters unescaped.
+ */
+ public static StringBuilder unescape(String text) {
+ StringBuilder strB = new StringBuilder();
+ int startIndex, endIndex;
+ char chr;
+
+ for (int index = 0; index < text.length(); index++) {
+ chr = text.charAt(index);
+ if (chr == '&') {
+ startIndex = index;
+ endIndex = text.indexOf(';', startIndex) + 1;
+ if (endIndex > startIndex && endIndex < (startIndex + 6)) {
+ String entityReference = text.substring(startIndex, endIndex);
+ if (entityReference.equals("&amp;"))
+ strB.append('&');
+ else if (entityReference.equals("&lt;"))
+ strB.append('<');
+ else if (entityReference.equals("&gt;"))
+ strB.append('>');
+ else if (entityReference.equals("&nbsp;"))
+ strB.append(' ');
+ else if (entityReference.equals("&quot;"))
+ strB.append('"');
+ else
+ throw new IllegalArgumentException(
+ "unknown entity reference: " + text.substring(startIndex, endIndex));
+ index = endIndex - 1;
+ } else {
+ strB.append(chr);
+ }
+ } else {
+ strB.append(chr);
+ }
+ }
+ return strB;
+ }
+
+ /**
+ * TODO Optimize algorithm
+ *
+ * @param text
+ * @return Returns a string with entity reference characters escaped.
+ */
+ public static CharSequence escape(CharSequence text) {
+ String textString = text.toString();
+ for (int x = 0; x < XML_CHARS.length; x++) {
+ textString = textString.replaceAll(XML_CHARS[x], XML_ESCAPES[x]);
+ }
+
+ return textString;
+ }
+
+ public static void writeAsCdata(Appendable appendable, String string) throws IOException {
+ if (string.indexOf('<') == -1 && string.indexOf('&') == -1 && string.indexOf("]]>") == -1) {
+ writeData(appendable, string);
+ } else {
+ if (string.indexOf(']') == -1) {
+ writeCdata(appendable, string);
+ } else {
+ // work around bug in excel xml parsing that thinks a single ] closes CDATA
+ String[] tokens = squareBracket.split(string);
+ for (int i = 0; i < tokens.length; i++) {
+ writeCdata(appendable, tokens[i]);
+ if (i != tokens.length - 1) { // the last token would not have been followed by ]
+ appendable.append(']');
+ }
+ }
+ }
+ }
+ }
+
+ private static void writeCdata(Appendable appendable, String content) throws IOException {
+ appendable.append("<![CDATA[");
+ appendable.append(content);
+ appendable.append("]]>");
+ }
+
+ private static void writeData(Appendable appendable, String string) throws IOException {
+ for (int index = 0; index < string.length(); index++) {
+ char value = string.charAt(index);
+ if (value == '\r') {
+ appendable.append(CARRIAGE_RETURN);
+ } else if (value == '\n') {
+ appendable.append(LINEFEED);
+ } else {
+ appendable.append(value);
+ }
+ }
+ }
+
+ public static String treatNonUTF8Characters(String contentString) {
+ String resultString = contentString;
+ String[][] nonUTF8CharactersOfInterest = { {"–", "-"}, {"’", "'"}, {"’", "'"}, {"“", "\""}, {"”", "\""}};//Wider than usual dash , smaller than usual bullet
+ for (int i = 0; i < nonUTF8CharactersOfInterest.length; i++) {
+ String[] splitsOfNonUTF8 = resultString.split(nonUTF8CharactersOfInterest[i][0]);//Wider than usual dash or bullet
+ if (splitsOfNonUTF8.length > 1) {
+ StringBuffer myStringBuffer = new StringBuffer();
+ for (int j = 0; j < splitsOfNonUTF8.length; j++) {
+ myStringBuffer.append(splitsOfNonUTF8[j]);
+ if (splitsOfNonUTF8[j].length() > 0 && j < splitsOfNonUTF8.length - 1) {
+ myStringBuffer.append(nonUTF8CharactersOfInterest[i][1]);
+ }
+ }
+ resultString = myStringBuffer.toString();
+ }
+ }
+ String[] splits = resultString.split("[^\\p{Space}\\p{Graph}]");
+ int stringPosition = 0;
+ if (splits.length > 1) {
+ StringBuffer myStringBuffer = new StringBuffer();
+ for (int i = 0; i < splits.length; i++) {
+ stringPosition = stringPosition + splits[i].length();
+ myStringBuffer.append(splits[i]);
+ stringPosition = stringPosition + 1;
+ if (splits[i].length() > 0 && i < splits.length - 1) {
+ myStringBuffer.append("-");
+ }
+ }
+ resultString = myStringBuffer.toString();
+ }
+
+ return resultString;
+ }
+
+ public static final Element appendNewElementWithText(Node parentNode, String newElementTagName, String newText) {
+ Element newElement = null;
+ try {
+ Document ownerDocument =
+ (parentNode.getNodeType() == Node.DOCUMENT_NODE) ? (Document) parentNode : parentNode.getOwnerDocument();
+ newElement = ownerDocument.createElement(newElementTagName);
+ parentNode.appendChild(newElement);
+ if (newText != null) {
+ Node newTextNode = ownerDocument.createTextNode(newText);
+ newElement.appendChild(newTextNode);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ ;
+ return newElement;
+ }
+
+ public static final Element appendNewElementWithTextCData(Node parentNode, String newElementTagName, String newText) {
+ Element newElement = null;
+ try {
+ Document ownerDocument =
+ (parentNode.getNodeType() == Node.DOCUMENT_NODE) ? (Document) parentNode : parentNode.getOwnerDocument();
+ newElement = ownerDocument.createElement(newElementTagName);
+ parentNode.appendChild(newElement);
+ if (newText != null) {
+ Node newTextNode = ownerDocument.createCDATASection(newText);
+ newElement.appendChild(newTextNode);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ ;
+ return newElement;
+ }
+
+ public static final Element appendNewElementWithTextAndAttributes(Node parentNode, String newElementTagName, String newText, String[][] attributes) {
+ Element newElement = null;
+ try {
+ Document ownerDocument =
+ (parentNode.getNodeType() == Node.DOCUMENT_NODE) ? (Document) parentNode : parentNode.getOwnerDocument();
+ newElement = ownerDocument.createElement(newElementTagName);
+ parentNode.appendChild(newElement);
+ if (newText != null) {
+ Node newTextNode = ownerDocument.createTextNode(newText);
+ newElement.appendChild(newTextNode);
+ }
+ if (attributes != null) {
+ for (String[] attribute : attributes) {
+ newElement.setAttribute(attribute[0], attribute[1]);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return newElement;
+ }
+
+ public static final Element[] appendNewElementsWithText(Node parentNode, String newElementsTagName, String[] textInstances) {
+ Element[] newElements = new Element[textInstances.length];
+ try {
+ if (textInstances != null) {
+ Document ownerDocument =
+ (parentNode.getNodeType() == Node.DOCUMENT_NODE) ? (Document) parentNode : parentNode.getOwnerDocument();
+ for (int i = 0; i < textInstances.length; i++) {
+ newElements[i] = ownerDocument.createElement(newElementsTagName);
+ parentNode.appendChild(newElements[i]);
+ String textInstance = (textInstances[i] == null) ? "null" : textInstances[i];
+ textInstance = (textInstance.length() == 0) ? "null" : textInstance;
+ newElements[i].appendChild(ownerDocument.createTextNode(textInstance));
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return newElements;
+ }
+
+ public static final Element appendNewElementWithTextAndOneAttribute(Node parentNode, String newElementTagName, String newText, String attributeName, String attributeValue) {
+ Element newElement = null;
+ try {
+ newElement = appendNewElementWithText(parentNode, newElementTagName, newText);
+ newElement.setAttribute(attributeName, attributeValue);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ ;
+ return newElement;
+ }
+
+ public final static String restartNumberingWhenPreparingToEditWithWord(InputStream myInputStream) throws XPathExpressionException, ParserConfigurationException, TransformerException, SAXException, IOException {
+ SimpleNamespaceContext mySimpleNamespaceContext = new SimpleNamespaceContext();
+ addNamespacesForWordMarkupLanguage(myXPath, mySimpleNamespaceContext);
+ Document myDocument = Jaxp.readXmlDocumentNamespaceAware(myInputStream);
+ Element myDocumentElement = myDocument.getDocumentElement();
+ Node[] myListss = selectNodeList(myDocumentElement, "descendant::w:lists");
+ Node[] myLists = selectNodeList(myDocumentElement, "descendant::w:lists/w:list");
+ if (myLists.length > 0 && myListss.length > 0) {
+ Node[] mywilfo = selectNodeList(myLists[myLists.length - 1], "@w:ilfo");
+ if (mywilfo.length > 0) {
+ String myLastUsedListInitializeListFormat = mywilfo[0].getNodeValue();//
+ int myNextILFO = Integer.parseInt(myLastUsedListInitializeListFormat);
+ Node[] myListDefinition =
+ selectNodeList(myDocumentElement,
+ "descendant::w:listDef[child::w:lvl[1]/w:pStyle/@w:val = 'listlvl1'][1]");//<w:pStyle w:val="listlvl1"/>
+ if (myListDefinition.length > 0) {
+ String mylistDefaultID = selectNodeList(myListDefinition[0], "@w:listDefId")[0].getNodeValue();
+ Node[] myWord_Formatted_Contents = selectNodeList(myDocument, "descendant::ns1:Word_Formatted_Content");
+ for (int i = 0; i < myWord_Formatted_Contents.length; i++) {
+ Node[] myPStyles =
+ selectNodeList(myWord_Formatted_Contents[i],
+ "descendant::w:pPr[child::w:pStyle[@w:val = 'listlvl1']]");
+ for (int j = 0; j < Math.min(1, myPStyles.length); j++) {
+ Node[] myListProperties = selectNodeList(myPStyles[j], "child::w:listPr");
+ if (myListProperties.length > 0) {
+ myNextILFO++;
+ Element newWList =
+ appendNewElementWithTextAndOneAttribute(myListss[0], "w:list", null, "w:ilfo",
+ "" + myNextILFO);
+ appendNewElementWithTextAndOneAttribute(newWList, "w:ilst", null, "w:val", mylistDefaultID);
+ Element new_lvlOverride =
+ appendNewElementWithTextAndOneAttribute(newWList, "w:lvlOverride", null, "w:ilvl", "0");
+ appendNewElementWithTextAndOneAttribute(new_lvlOverride, "w:startOverride", null, "w:val", "1");
+ appendNewElementWithTextAndOneAttribute(myListProperties[0], "w:ilvl", null, "w:val", "0");
+ appendNewElementWithTextAndOneAttribute(myListProperties[0], "w:ilfo", null, "w:val",
+ "" + myNextILFO);
+ }
+ }
+ }
+ }
+ }
+ }
+ String myString = Jaxp.xmlToString(myDocument, Jaxp.getPrettyFormat(myDocument));
+ return myString;
+ }
+
+ public static Document readWordFormattedContent(String myInputString) throws IOException, ParserConfigurationException, SAXException {
+ Document myDocument = null;
+ myDocument = Jaxp.readXmlDocumentNamespaceAware(wordLeader.concat(myInputString).concat(wordTrailer));
+ return myDocument;
+ }
+
+ public static final Object addNamespacesForWordMarkupLanguage(XPath myXPath, SimpleNamespaceContext mySimpleNamespaceContext) {
+ try {
+ if (myXPath.getNamespaceContext() == null) {
+ mySimpleNamespaceContext.addNamespace("w", "http://schemas.microsoft.com/office/word/2003/wordml");
+ mySimpleNamespaceContext.addNamespace("wx", "http://schemas.microsoft.com/office/word/2003/auxHint");
+ mySimpleNamespaceContext.addNamespace("o", "urn:schemas-microsoft-com:office:office");
+ mySimpleNamespaceContext.addNamespace("v", "urn:schemas-microsoft-com:vml");
+ mySimpleNamespaceContext.addNamespace("aml", "http://schemas.microsoft.com/aml/2001/core");
+ mySimpleNamespaceContext.addNamespace("dt", "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882");
+ mySimpleNamespaceContext.addNamespace("ns0", "http://www.w3.org/2001/XMLSchema");
+ mySimpleNamespaceContext.addNamespace("ns1", "http://eclipse.org/artifact.xsd");
+ mySimpleNamespaceContext.addNamespace("ns2", "urn:schemas-microsoft-com:office:smarttags");
+ mySimpleNamespaceContext.addNamespace("sl", "http://schemas.microsoft.com/schemaLibrary/2003/core");
+ mySimpleNamespaceContext.addNamespace("st0", "urn:schemas-microsoft-com:office:smarttags");
+ mySimpleNamespaceContext.addNamespace("st1", "urn:schemas-microsoft-com:office:smarttags");
+ mySimpleNamespaceContext.addNamespace("st2", "urn:schemas-microsoft-com:office:smarttags");
+ mySimpleNamespaceContext.addNamespace("st3", "urn:schemas-microsoft-com:office:smarttags");
+ mySimpleNamespaceContext.addNamespace("st4", "urn:schemas-microsoft-com:office:smarttags");
+ mySimpleNamespaceContext.addNamespace("w10", "urn:schemas-microsoft-com:office:word");
+ mySimpleNamespaceContext.addNamespace("wsp", "http://schemas.microsoft.com/office/word/2003/wordml/sp2");
+ mySimpleNamespaceContext.addNamespace("foo", "http://apache.org/foo");
+ mySimpleNamespaceContext.addNamespace("bar", "http://apache.org/bar");
+ myXPath.setNamespaceContext(mySimpleNamespaceContext);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static final boolean isSeriousXPath(String xPathExpression) {
+ return (xPathExpression.indexOf("[") > -1 || xPathExpression.indexOf("]") > -1 || xPathExpression.indexOf("(") > -1 || xPathExpression.indexOf(")") > -1 || xPathExpression.indexOf(":") > -1);
+ }
+
+ public static final Node[] selectNodeList(Node startingNode, String xPathExpression) throws XPathExpressionException {
+ Node[] resultNodes = null;
+ if (!isSeriousXPath(xPathExpression) && startingNode.getNodeType() == Node.ELEMENT_NODE) {
+ List<Element> resultElementList = Jaxp.findElements((Element) startingNode, xPathExpression);
+ resultNodes = resultElementList.toArray(new Node[0]);
+ } else {
+ Object publisherNodeSet = null;
+ publisherNodeSet = myXPath.evaluate(xPathExpression, startingNode, XPathConstants.NODESET);
+ DTMNodeList myNodeList = (DTMNodeList) publisherNodeSet;
+ resultNodes = new Node[myNodeList.getLength()];
+ for (int i = 0; i < resultNodes.length; i++) {
+ resultNodes[i] = myNodeList.item(i);
+ }
+ }
+ return resultNodes;
+ }
+
+ public static final String selectNodesText(Node startingNode, String xPathExpression) throws XPathExpressionException {
+ String resultString = null;
+ if (!isSeriousXPath(xPathExpression) && startingNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element foundElement = Jaxp.findElement((Element) startingNode, xPathExpression);
+ if (foundElement != null) {
+ resultString = selectNodesText(foundElement).trim();
+ }
+ } else {
+ Node[] selectedNodes = selectNodeList(startingNode, xPathExpression);
+ if (selectedNodes.length > 0) {
+ resultString = selectNodesText((Element) selectedNodes[0]).trim();
+ }
+ }
+ return resultString;
+ }
+
+ public static final String selectNodesText(Node startingNode) {
+ StringBuffer resultStringBuffer = new StringBuffer();
+ NodeList childNodes = startingNode.getChildNodes();
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ if (childNodes.item(i).getNodeType() == Node.CDATA_SECTION_NODE || childNodes.item(i).getNodeType() == Node.TEXT_NODE) {
+ resultStringBuffer.append(childNodes.item(i).getNodeValue().trim());
+ }
+ }
+ return resultStringBuffer.toString();
+ }
+
+ public static final Element makeTable(Element parentDivElement, String caption, String[][] columnDescriptors) {
+ Element newTableElement =
+ appendNewElementWithTextAndAttributes(parentDivElement, "table", null, new String[][] { {"border", "1"},
+ {"cellpadding", "3"}, {"cellspacing", "0"}, {"width", "100%"}});
+ appendNewElementWithText(newTableElement, "caption", caption);
+ Element columnGroupElement =
+ appendNewElementWithTextAndAttributes(newTableElement, "colgroup", null, new String[][] {{"align", "left"}});
+ String[] columnNames = new String[columnDescriptors.length];
+ for (int i = 0; i < columnDescriptors.length; i++) {
+ columnNames[i] = columnDescriptors[i][0];
+ appendNewElementWithTextAndAttributes(columnGroupElement, "col", null, new String[][] {{"width",
+ columnDescriptors[i][1]}});//width,33
+ }
+ Element headingTableRowElement = appendNewElementWithText(newTableElement, "tr", null);
+ appendNewElementsWithText(headingTableRowElement, "th", columnNames);
+ return newTableElement;
+ }
+
+ public static final Element[] makeDivElementAndTableElement(Element parentDivElement, String caption, String[][] columnDescriptors) {
+ Element[] divAndTableElements =
+ new Element[] {parentDivElement, parentDivElement.getOwnerDocument().createElement("div"), null};
+ divAndTableElements[2] = makeTable(divAndTableElements[1], caption, columnDescriptors);
+ return divAndTableElements;
+ }
+
+ public static final Element[] makeTableRow(Element[] devAndTableElements, String[] cellContents) {
+ Element nextRow = Xml.appendNewElementWithText(devAndTableElements[2], "tr", null);
+ appendNewElementsWithText(nextRow, "td", cellContents);
+ return devAndTableElements;
+ }
+
+ public static final Element makeTableRow(Element[] devAndTableElements, String[][] cellContentsAndStyle) {
+ Element nextRow = Xml.appendNewElementWithText(devAndTableElements[2], "tr", null);
+ for (String[] cellContentsAndStyleArray : cellContentsAndStyle) {
+ if (cellContentsAndStyleArray.length > 1) {
+ appendNewElementWithTextAndOneAttribute(nextRow, "td", cellContentsAndStyleArray[0],
+ cellContentsAndStyleArray[1], cellContentsAndStyleArray[2]);
+ } else {
+ appendNewElementsWithText(nextRow, "td", new String[] {cellContentsAndStyleArray[0]});
+ }
+ }
+ return nextRow;
+ }
+
+ public static final Node writePrettyXML(Node aNode, File resultXmlFile) {
+ try {
+ Node[] notUTF8Nodes = Xml.selectNodeList(aNode, "descendant::text()[contains(.,'’')]");
+ for (int i = 0; i < notUTF8Nodes.length; i++) {
+ notUTF8Nodes[i].setNodeValue(theFunnyQuoteMatcher.reset(notUTF8Nodes[i].getNodeValue()).replaceAll("'"));
+ }
+ Jaxp.writeXmlDocument(aNode.getOwnerDocument(), resultXmlFile, Jaxp.getPrettyFormat(aNode.getOwnerDocument()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return aNode;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlOutputTransform.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlOutputTransform.java
new file mode 100644
index 00000000000..14a3ecd90b2
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlOutputTransform.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.framework.jdk.core.util.xml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+import javax.xml.transform.Result;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class XmlOutputTransform {
+
+ // Prevent Instantiation
+ private XmlOutputTransform() {
+ }
+
+ protected static void xmlToHtml(InputStream inputXML, InputStream inputXslt, Result result) throws Exception {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(inputXslt));
+ xmlToHtml(inputXML, transformer, result);
+ }
+
+ private static void xmlToHtml(InputStream inputXML, Transformer transformer, Result result) throws Exception {
+ try {
+ transformer.transform(new StreamSource(inputXML), result);
+ } catch (Exception ex) {
+ throw new Exception("Error during Transform. ", ex);
+ }
+ }
+
+ private static void xmlToHtml(InputStream inputXML, InputStream inputXslt, Writer result) throws Exception {
+ boolean isNetworked = false;
+
+ if (true != isNetworked) {
+ // Perform Transform Directly
+ xmlToHtml(inputXML, inputXslt, new StreamResult(result));
+ } else {
+ // Perform Transform as a Separate process by launching an XmlTransformServer.
+ XmlTransformAsProcess.getHtmlFromXml(inputXML, inputXslt, result);
+ }
+ }
+
+ public static String xmlToHtmlString(String sourceFile, File transformToApply) {
+ return xmlToHtmlString(new File(sourceFile), transformToApply);
+ }
+
+ public static String xmlToHtmlString(File sourceFile, String transformToApply) {
+ return xmlToHtmlString(sourceFile, new File(transformToApply));
+ }
+
+ public static String xmlToHtmlString(String sourceFile, String transformToApply) {
+ return xmlToHtmlString(new File(sourceFile), new File(transformToApply));
+ }
+
+ public static File xmlToHtmlFile(File sourceFile, File transformToApply) throws Exception {
+ File file = new File(sourceFile.getAbsolutePath().replace(".tmo", ".html"));
+ xmlToHtml(new FileInputStream(sourceFile), new FileInputStream(transformToApply), new FileWriter(file));
+ return file;
+ }
+
+ public static String xmlToHtmlString(File sourceFile, File transformToApply) {
+ StringWriter sWriter = new StringWriter();
+ try {
+ xmlToHtml(new FileInputStream(sourceFile), new FileInputStream(transformToApply), sWriter);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return sWriter.toString();
+ }
+
+ public static String xmlToHtmlString(InputStream sourceXML, Transformer transformer) throws Exception {
+ StringWriter sWriter = new StringWriter();
+ xmlToHtml(sourceXML, transformer, new StreamResult(sWriter));
+ return sWriter.toString();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformAsProcess.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformAsProcess.java
new file mode 100644
index 00000000000..c600b33a86b
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformAsProcess.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.framework.jdk.core.util.xml;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.Socket;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlTransformAsProcess {
+
+ private Socket clientSocket;
+ private InputStream inputFromNetwork;
+ private OutputStream outputFromNetwork;
+ private Process process;
+
+ private XmlTransformAsProcess() {
+ process = null;
+ clientSocket = null;
+ inputFromNetwork = null;
+ outputFromNetwork = null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private URL getClassLocation(final Class classToFind) {
+ URL result = null;
+ if (classToFind == null) {
+ throw new IllegalArgumentException("Class is null");
+ }
+ final String classAsResource = classToFind.getName().replace('.', '/').concat(".class");
+ final ProtectionDomain pd = classToFind.getProtectionDomain();
+ if (pd != null) {
+ final CodeSource cs = pd.getCodeSource();
+ if (cs != null) {
+ result = cs.getLocation();
+ }
+ if (result != null) {
+ // Convert a code source location into a full class file location
+ if (result.getProtocol().equals("file")) {
+ try {
+ if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip"))
+ result = new URL("jar:".concat(result.toExternalForm()).concat("!/").concat(classAsResource));
+ else if (new File(result.getFile()).isDirectory()) result = new URL(result, classAsResource);
+ } catch (MalformedURLException ignore) {
+ }
+ }
+ }
+ }
+ if (result == null) {
+ // Try to find class definition as a resource
+ final ClassLoader classLoader = classToFind.getClassLoader();
+ result =
+ classLoader != null ? classLoader.getResource(classAsResource) : ClassLoader.getSystemResource(classAsResource);
+ }
+ return result;
+ }
+
+ private void connectToServer(InetAddress address, int port) throws Exception {
+ try {
+ for (int i = 0; i < 10; i++) {
+ try {
+ clientSocket = new Socket(address, port);
+ break;
+ } catch (Throwable th) {
+ Thread.sleep(1000);
+ }
+ }
+ System.out.println("Connected");
+ inputFromNetwork = new BufferedInputStream(clientSocket.getInputStream());
+ outputFromNetwork = new BufferedOutputStream(clientSocket.getOutputStream());
+ } catch (Exception ex) {
+ throw new Exception("Unable to Connect to Transform Server. ", ex);
+ }
+ }
+
+ private void launchServer(int port) throws Exception {
+ List<String> commands = new ArrayList<String>();
+ try {
+ URL url = getClassLocation(XmlTransformServer.class);
+ String path = new File(url.toURI()).getAbsolutePath();
+ int indexOf = path.indexOf("bin");
+ path = path.substring(0, indexOf + 4);
+ File classFileLocation = new File(path);
+
+ String className = XmlTransformServer.class.getName();
+
+ commands.add("java");
+ commands.add("-Xmx1024M");
+ commands.add(className);
+ commands.add(Integer.toString(port));
+
+ ProcessBuilder builder = new ProcessBuilder();
+ builder.directory(classFileLocation);
+ builder.command(commands);
+ process = builder.start();
+ Thread.sleep(800);
+ } catch (URISyntaxException ex) {
+ throw new Exception("Unable to find XmlTransformServer class in File System. ", ex);
+ } catch (Exception ex) {
+ throw new Exception("Unable to launch TransformServer. ", ex);
+ }
+ }
+
+ public void processXml(InputStream xmlSource, InputStream xsltSource, Writer result) {
+ try {
+ XmlTransformServer.sendStream(clientSocket, xmlSource, outputFromNetwork);
+ Thread.sleep(2000);
+ System.gc();
+ System.out.println("Sent Xml");
+ XmlTransformServer.sendStream(clientSocket, xsltSource, outputFromNetwork);
+ System.gc();
+ Thread.sleep(2000);
+ System.out.println("Sent Xslt");
+ XmlTransformServer.receiveStream(clientSocket, inputFromNetwork, result);
+ System.gc();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private void clearResources() throws Exception {
+ if (inputFromNetwork != null) {
+ inputFromNetwork.close();
+ }
+ if (outputFromNetwork != null) {
+ outputFromNetwork.close();
+ }
+ if (clientSocket != null) {
+ clientSocket.close();
+ }
+ if (process != null) {
+ process.destroy();
+ }
+ }
+
+ public static void getHtmlFromXml(InputStream xmlSource, InputStream xsltSource, Writer results) throws Exception {
+ XmlTransformAsProcess xmlTransformProcess = new XmlTransformAsProcess();
+ try {
+ InetAddress address = InetAddress.getLocalHost();
+ int port = PortUtil.getInstance().getValidPort();
+ System.out.println("Transform Server at port: " + port);
+ System.gc();
+ xmlTransformProcess.launchServer(port);
+ xmlTransformProcess.connectToServer(address, port);
+ xmlTransformProcess.processXml(xmlSource, xsltSource, results);
+
+ } finally {
+ xmlTransformProcess.clearResources();
+ System.gc();
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ InputStream xmlInput = new FileInputStream(args[0]);
+ InputStream xsltInput = new FileInputStream(args[1]);
+ getHtmlFromXml(xmlInput, xsltInput, new PrintWriter(System.out));
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformServer.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformServer.java
new file mode 100644
index 00000000000..673c78baece
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTransformServer.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.framework.jdk.core.util.xml;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.net.ServerSocket;
+import java.net.Socket;
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlTransformServer {
+
+ private static int MAX_PACKET_SIZE = 65536;
+ private static int FINISH_PROCESSING_FLAG = -1;
+ private static int TIMEOUT = 60000 * 3;
+
+ private InputStream inputFromNetwork;
+ private OutputStream outputToNetwork;
+
+ private Socket clientSocket;
+ private ServerSocket server;
+ private int portNumber;
+ private String userHome;
+
+ public XmlTransformServer() {
+ this.server = null;
+ this.portNumber = 0;
+ this.userHome = System.getProperty("user.home");
+ }
+
+ private void initializeServer(int portNumber) throws Exception {
+ this.portNumber = portNumber;
+ try {
+ server = new ServerSocket(portNumber);
+ clientSocket = server.accept();
+ inputFromNetwork = new BufferedInputStream(clientSocket.getInputStream());
+ outputToNetwork = new BufferedOutputStream(clientSocket.getOutputStream());
+ } catch (Exception ex) {
+ throw new Exception("Unable to launch Server and get Connection. ", ex);
+ }
+ }
+
+ public void process() throws Exception {
+ performRead("xml", ".xml");
+ performRead("xslt", ".xsl");
+ performWrite();
+ }
+
+ private void performRead(String prefix, String extension) throws Exception {
+ File file = new File(userHome + File.separator + prefix + portNumber + extension);
+ file.createNewFile();
+ FileOutputStream fos = new FileOutputStream(file);
+ try {
+ receiveStream(clientSocket, inputFromNetwork, new PrintStream(fos));
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ fos.close();
+ }
+ }
+
+ private void performWrite() throws Exception {
+ File file = new File(userHome + File.separator + "html" + portNumber + ".html");
+ file.createNewFile();
+ FileOutputStream fos = new FileOutputStream(file);
+
+ File fisXml = new File(userHome + File.separator + "xml" + portNumber + ".xml");
+ File fisXslt = new File(userHome + File.separator + "xslt" + portNumber + ".xsl");
+ ErrorListener listener = null;
+ try {
+ System.gc();
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(fisXslt));
+ listener = transformer.getErrorListener();
+ transformer.transform(new StreamSource(fisXml), new StreamResult(fos));
+ } catch (Exception ex) {
+ PrintWriter pw = new PrintWriter(fos);
+ pw.write("Error during Transform. " + listener.toString());
+ ex.printStackTrace(pw);
+ } finally {
+ fos.close();
+ fisXml.delete();
+ fisXslt.delete();
+ }
+ System.gc();
+
+ InputStream fis = new FileInputStream(file);
+ try {
+ sendStream(clientSocket, fis, outputToNetwork);
+ Thread.sleep(1000);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ fis.close();
+ file.delete();
+ }
+ }
+
+ private void clearResources() throws Exception {
+ if (outputToNetwork != null) {
+ outputToNetwork.close();
+ }
+ if (inputFromNetwork != null) {
+ inputFromNetwork.close();
+ }
+ if (clientSocket != null) {
+ clientSocket.close();
+ }
+ if (server != null) {
+ server.close();
+ }
+ }
+
+ static public void sendStream(Socket socket, InputStream in, OutputStream out) throws Exception {
+ socket.setSoTimeout(TIMEOUT);
+ try {
+ int numberOfBytes = 0;
+ byte[] buffer = new byte[MAX_PACKET_SIZE];
+ while ((numberOfBytes = in.read(buffer, 0, buffer.length)) != -1) {
+ out.write(buffer, 0, numberOfBytes);
+ }
+ out.write(FINISH_PROCESSING_FLAG);
+ out.flush();
+ } catch (Exception ex) {
+ throw new Exception("Error during send.", ex);
+ }
+ }
+
+ static public void receiveStream(Socket socket, InputStream in, OutputStream out) throws Exception {
+ socket.setSoTimeout(TIMEOUT);
+ try {
+ int numberOfBytes = 0;
+ byte[] buffer = new byte[MAX_PACKET_SIZE];
+ while ((numberOfBytes = in.read(buffer, 0, buffer.length)) != -1) {
+ if (buffer[numberOfBytes - 1] == -1) {
+ out.write(buffer, 0, numberOfBytes - 1);
+ break;
+ }
+ out.write(buffer, 0, numberOfBytes);
+ }
+ out.flush();
+ } catch (Exception ex) {
+ throw new Exception("Error during receive.", ex);
+ }
+ }
+
+ static public void receiveStream(Socket socket, InputStream in, Writer out) throws Exception {
+ socket.setSoTimeout(TIMEOUT);
+ try {
+ int numberOfBytes = 0;
+ byte[] buffer = new byte[MAX_PACKET_SIZE];
+ while ((numberOfBytes = in.read(buffer, 0, buffer.length)) != -1) {
+ if (buffer[numberOfBytes - 1] == -1) {
+ out.write(new String(buffer, 0, numberOfBytes - 1));
+ break;
+ }
+ out.write(new String(buffer, 0, numberOfBytes));
+ }
+ out.flush();
+ } catch (Exception ex) {
+ throw new Exception("Error during receive.", ex);
+ }
+ }
+
+ public static void main(String args[]) {
+ XmlTransformServer xmlTransformServer = new XmlTransformServer();
+ try {
+ int port = Integer.parseInt(args[0]);
+ xmlTransformServer.initializeServer(port);
+ xmlTransformServer.process();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ xmlTransformServer.clearResources();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTranslation.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTranslation.java
new file mode 100644
index 00000000000..c6bc2b14f3c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlTranslation.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.framework.jdk.core.util.xml;
+
+import java.io.CharArrayReader;
+import java.io.CharArrayWriter;
+import java.nio.CharBuffer;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XmlTranslation {
+ /**
+ * applies the xslFilename to inFilename and writes the output to outFilename.
+ */
+ public static CharBuffer applyXsl(CharBuffer xmlBuffer, CharBuffer xslBuffer, URIResolver uriResolver) {
+ return applyXsl(new StreamSource(new CharArrayReader(xmlBuffer.array())), xslBuffer, uriResolver);
+ }
+
+ /**
+ * applies the xslFilename to inFilename and writes the output to outFilename.
+ */
+ public static CharBuffer applyXsl(Source source, CharBuffer xslBuffer, URIResolver uriResolver) {
+ try {
+ TransformerFactory factory = TransformerFactory.newInstance();
+ factory.setURIResolver(uriResolver);
+
+ Templates template = factory.newTemplates(new StreamSource(new CharArrayReader(xslBuffer.array())));
+ Transformer xformer = template.newTransformer();
+
+ CharArrayWriter resultWriter = new CharArrayWriter(10000);
+ Result result = new StreamResult(resultWriter);
+
+ xformer.transform(source, result);
+ return CharBuffer.wrap(resultWriter.toCharArray());
+ } catch (TransformerConfigurationException ex) {
+ ex.printStackTrace();
+ } catch (TransformerException ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlUtility.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlUtility.java
new file mode 100644
index 00000000000..e999e3f6a4f
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/XmlUtility.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.framework.jdk.core.util.xml;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * @author Paul K. Waldfogel
+ */
+public class XmlUtility {
+ public final static XPathFactory myXPathFactory = XPathFactory.newInstance();
+ public final static XPath myXPath = myXPathFactory.newXPath();
+ public final static String wordLeader1 =
+ "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" + "<?mso-application progid='Word.Document'?>";
+ public final static String wordLeader2 =
+ "<w:wordDocument xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:w10='urn:schemas-microsoft-com:office:word' xmlns:sl='http://schemas.microsoft.com/schemaLibrary/2003/core' xmlns:aml='http://schemas.microsoft.com/aml/2001/core' xmlns:wx='http://schemas.microsoft.com/office/word/2003/auxHint' xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:wsp='http://schemas.microsoft.com/office/word/2003/wordml/sp2' xmlns:ns0='http://www.w3.org/2001/XMLSchema' xmlns:ns1='http://eclipse.org/artifact.xsd' xmlns:st1='urn:schemas-microsoft-com:office:smarttags' w:macrosPresent='no' w:embeddedObjPresent='no' w:ocxPresent='no' xml:space='preserve'>";
+ public final static String wordLeader = wordLeader1.concat(wordLeader2);
+ public final static String wordBody = "<w:body></w:body>";
+ public final static String wordTrailer = "</w:wordDocument> ";
+
+ public static String treatNonUTF8Characters(String contentString) {
+ String resultString = contentString;
+ String[][] nonUTF8CharactersOfInterest = { {"–", "-"}, {"’", "'"}, {"’", "'"}, {"“", "\""}, {"”", "\""}};//Wider than usual dash , smaller than usual bullet
+ for (int i = 0; i < nonUTF8CharactersOfInterest.length; i++) {
+ String[] splitsOfNonUTF8 = resultString.split(nonUTF8CharactersOfInterest[i][0]);//Wider than usual dash or bullet
+ if (splitsOfNonUTF8.length > 1) {
+ StringBuffer myStringBuffer = new StringBuffer();
+ for (int j = 0; j < splitsOfNonUTF8.length; j++) {
+ myStringBuffer.append(splitsOfNonUTF8[j]);
+ if (splitsOfNonUTF8[j].length() > 0 && j < splitsOfNonUTF8.length - 1) {
+ myStringBuffer.append(nonUTF8CharactersOfInterest[i][1]);
+ }
+ }
+ resultString = myStringBuffer.toString();
+ }
+ }
+ String[] splits = resultString.split("[^\\p{Space}\\p{Graph}]");
+ int stringPosition = 0;
+ if (splits.length > 1) {
+ StringBuffer myStringBuffer = new StringBuffer();
+ for (int i = 0; i < splits.length; i++) {
+ stringPosition = stringPosition + splits[i].length();
+ myStringBuffer.append(splits[i]);
+ stringPosition = stringPosition + 1;
+ if (splits[i].length() > 0 && i < splits.length - 1) {
+ myStringBuffer.append("-");
+ }
+ }
+ resultString = myStringBuffer.toString();
+ }
+
+ return resultString;
+ }
+
+ public static final Element appendNewElementWithTextCData(Node parentElementName, String newElementTagName, String newText) {
+ Element newElement = null;
+ try {
+ newElement = parentElementName.getOwnerDocument().createElement(newElementTagName);
+ parentElementName.appendChild(newElement);
+ if (newText != null) {
+ Node newTextNode = parentElementName.getOwnerDocument().createCDATASection(newText);
+ newElement.appendChild(newTextNode);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ ;
+ return newElement;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Cell.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Cell.java
new file mode 100644
index 00000000000..b14f7c953fa
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Cell.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.framework.jdk.core.util.xml.excel;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Cell implements Xmlizable {
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ public void initializeFromXml(Document doc) {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Row.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Row.java
new file mode 100644
index 00000000000..4d7110bb656
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Row.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.framework.jdk.core.util.xml.excel;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Row implements Xmlizable {
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ public void initializeFromXml(Document doc) {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Style.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Style.java
new file mode 100644
index 00000000000..3a305bd5346
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Style.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.framework.jdk.core.util.xml.excel;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Style implements Xmlizable {
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ public void initializeFromXml(Document doc) {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Table.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Table.java
new file mode 100644
index 00000000000..818fa709607
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/Table.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.framework.jdk.core.util.xml.excel;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Table implements Xmlizable {
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ public void initializeFromXml(Document doc) {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkBook.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkBook.java
new file mode 100644
index 00000000000..43b3c650610
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkBook.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.framework.jdk.core.util.xml.excel;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WorkBook implements Xmlizable {
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ public void initializeFromXml(Document doc) {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkSheet.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkSheet.java
new file mode 100644
index 00000000000..dca1df40aed
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/excel/WorkSheet.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.framework.jdk.core.util.xml.excel;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WorkSheet implements Xmlizable {
+
+ public Element toXml(Document doc) {
+ return null;
+ }
+
+ public void initializeFromXml(Document doc) {
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/GenericParser.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/GenericParser.java
new file mode 100644
index 00000000000..b52093dcd18
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/GenericParser.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.framework.jdk.core.util.xml.parser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.collection.tree.Tree;
+import org.eclipse.osee.framework.jdk.core.collection.tree.TreeNode;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GenericParser extends AbstractSaxHandler {
+
+ private String toFind;
+ private boolean startCollecting;
+ private Tree<XmlNode> collectedTree;
+ private TreeNode<XmlNode> currentNode;
+ private Set<IXmlNodeListener> listeners;
+ private Set<IProcessingInstructionsListener> instructionListeners;
+
+ public GenericParser(String startTag) {
+ this.toFind = startTag;
+ this.listeners = new HashSet<IXmlNodeListener>();
+ this.instructionListeners = new HashSet<IProcessingInstructionsListener>();
+ }
+
+ public void reset() {
+ this.startCollecting = false;
+ this.currentNode = null;
+ this.collectedTree = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String,
+ * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ if (localName.equalsIgnoreCase(toFind)) {
+ startCollecting = true;
+ collectedTree = new Tree<XmlNode>(new XmlNode(localName, attributes));
+ currentNode = null;
+ }
+
+ if (startCollecting) {
+ XmlNode node = new XmlNode(localName, attributes);
+ if (currentNode == null) {
+ currentNode = collectedTree.getRoot();
+ } else {
+ currentNode = currentNode.addChild(node);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String qName) throws SAXException {
+ if (localName.equalsIgnoreCase(toFind)) {
+ startCollecting = false;
+ notifyTreeCollected(collectedTree);
+ }
+
+ if (startCollecting) {
+ if (currentNode != null) {
+ currentNode.getSelf().setTextContent(getContents());
+ if (currentNode.getSelf().getName().equalsIgnoreCase(localName)) {
+ // Found End of current Node Stop appending Children
+ TreeNode<XmlNode> parent = currentNode.getParent();
+ currentNode = parent;
+ }
+ }
+ }
+ }
+
+ public void processingInstruction(String target, String data) throws SAXException {
+ super.processingInstruction(target, data);
+ notifyProcessingInstructionChanged(target, data);
+ }
+
+ synchronized public void registerInstructionListener(IProcessingInstructionsListener listener) {
+ if (!instructionListeners.contains(listener)) {
+ instructionListeners.add(listener);
+ }
+ }
+
+ synchronized public void deregisterInstructionListener(IProcessingInstructionsListener listener) {
+ if (instructionListeners.contains(listener)) {
+ instructionListeners.remove(listener);
+ }
+ }
+
+ synchronized public void registerXmlNodeListener(IXmlNodeListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ synchronized public void deregisterXmlNodeListener(IXmlNodeListener listener) {
+ if (listeners.contains(listener)) {
+ listeners.remove(listener);
+ }
+ }
+
+ synchronized public void notifyTreeCollected(final Tree<XmlNode> tree) {
+ TreeNode<XmlNode> root = tree.getRoot();
+ for (IXmlNodeListener listener : listeners) {
+ listener.collectionChanged(root);
+ }
+ }
+
+ synchronized public void notifyProcessingInstructionChanged(String target, String data) {
+ for (IProcessingInstructionsListener listener : instructionListeners) {
+ listener.processingInstructionChanged(target, data);
+ }
+ }
+
+ public void process(File xmlSource) throws SAXException, IOException {
+ this.reset();
+ process(new FileInputStream(xmlSource));
+ }
+
+ public void process(InputStream xmlSource) throws SAXException, IOException {
+ this.reset();
+ XMLReader xmlReader;
+ xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(this);
+ xmlReader.setErrorHandler(new ErrorHandler() {
+
+ public void warning(SAXParseException exception) throws SAXException {
+ exception.printStackTrace();
+ }
+
+ public void fatalError(SAXParseException exception) throws SAXException {
+ exception.printStackTrace();
+ }
+
+ public void error(SAXParseException exception) throws SAXException {
+ exception.printStackTrace();
+ }
+
+ });
+ xmlReader.parse(new InputSource(xmlSource));
+ System.out.println();
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IProcessingInstructionsListener.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IProcessingInstructionsListener.java
new file mode 100644
index 00000000000..5ebb0297c16
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IProcessingInstructionsListener.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.framework.jdk.core.util.xml.parser;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IProcessingInstructionsListener {
+
+ public void processingInstructionChanged(String target, String data);
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IXmlNodeListener.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IXmlNodeListener.java
new file mode 100644
index 00000000000..054c77c9fdf
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/IXmlNodeListener.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.framework.jdk.core.util.xml.parser;
+
+import org.eclipse.osee.framework.jdk.core.collection.tree.TreeNode;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IXmlNodeListener {
+
+ public void collectionChanged(TreeNode<XmlNode> collected);
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlNode.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlNode.java
new file mode 100644
index 00000000000..6a3c79e9f84
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlNode.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.framework.jdk.core.util.xml.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlNode {
+
+ private String name;
+ private String textContent;
+ private Map<String, String> attributes;
+
+ public XmlNode(String name, Attributes attributes) {
+ this.name = name;
+ this.attributes = new HashMap<String, String>(attributes.getLength());
+ for (int i = 0; i < attributes.getLength(); i++)
+ this.attributes.put(attributes.getQName(i), attributes.getValue(i));
+ this.textContent = "";
+ }
+
+ /**
+ * @return Returns the textContent.
+ */
+ public String getTextContent() {
+ return textContent;
+ }
+
+ /**
+ * @param textContent The textContent to set.
+ */
+ public void setTextContent(String textContent) {
+ if (textContent != null && textContent.length() > 0) {
+ this.textContent = textContent;
+ }
+ }
+
+ /**
+ * @param qname
+ * @return Returns the value of the attribute matching the qualified name.
+ */
+ public String getAttributeValue(String qname) {
+ return attributes.get(qname);
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlTreeUtilities.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlTreeUtilities.java
new file mode 100644
index 00000000000..0ef3310a66a
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/xml/parser/XmlTreeUtilities.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.core.util.xml.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import org.eclipse.osee.framework.jdk.core.collection.tree.TreeNode;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlTreeUtilities {
+
+ private static XmlTreeUtilities instance = null;
+
+ private XmlTreeUtilities() {
+ }
+
+ public static XmlTreeUtilities getInstance() {
+ if (instance == null) {
+ instance = new XmlTreeUtilities();
+ }
+ return instance;
+ }
+
+ private Stack<String> processPath(String pattern) {
+ Stack<String> elementPath = new Stack<String>();
+ String[] path = pattern.split("/");
+ for (int index = path.length - 1; index >= 0; index--) {
+ String entry = path[index];
+ entry = entry.trim();
+ if (entry.length() > 0) {
+ elementPath.push(entry);
+ }
+ }
+ return elementPath;
+ }
+
+ public List<TreeNode<XmlNode>> getXmlNodesAt(String path, TreeNode<XmlNode> root) {
+ Stack<String> elementPath = processPath(path);
+ List<TreeNode<XmlNode>> toReturn = new ArrayList<TreeNode<XmlNode>>();
+ List<TreeNode<XmlNode>> nodes = root.getChildren();
+ while (!elementPath.empty()) {
+ String token = elementPath.pop();
+ nodes = collectNodesMatchingToken(token, nodes);
+ }
+ if (nodes != null && nodes.size() > 0) {
+ toReturn.addAll(nodes);
+ }
+
+ return toReturn;
+ }
+
+ private List<TreeNode<XmlNode>> collectNodesMatchingToken(String token, List<TreeNode<XmlNode>> nodes) {
+ List<TreeNode<XmlNode>> toReturn = new ArrayList<TreeNode<XmlNode>>();
+
+ for (TreeNode<XmlNode> node : nodes) {
+ if (token.equalsIgnoreCase("*")) {
+ if (node.getChildren().size() > 0) {
+ toReturn.addAll(node.getChildren());
+ }
+ }
+ if (node.getSelf().getName().equalsIgnoreCase(token)) {
+ toReturn.add(node);
+ if (node.getChildren().size() > 0) {
+ toReturn.addAll(node.getChildren());
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public int countNodesMatchingText(List<TreeNode<XmlNode>> nodes, String toMatch) {
+ int result = 0;
+ for (TreeNode<XmlNode> node : nodes) {
+ if (node != null) {
+ String content = node.getSelf().getTextContent();
+ if (content.equalsIgnoreCase(toMatch)) {
+ result++;
+ }
+ }
+ }
+ return result;
+ }
+
+ public XmlNode getFirstXmlNode(List<TreeNode<XmlNode>> nodes) {
+ XmlNode toReturn = null;
+ if (nodes.size() > 0) {
+ toReturn = nodes.get(0).getSelf();
+ }
+ return toReturn;
+ }
+
+ public String getFirstXmlNodeText(List<TreeNode<XmlNode>> nodes) {
+ XmlNode node = getFirstXmlNode(nodes);
+ return node != null ? node.getTextContent() : "";
+ }
+
+ public boolean containsNode(String path, TreeNode<XmlNode> nodes) {
+ List<TreeNode<XmlNode>> searchResults = getXmlNodesAt("Location", nodes);
+ return searchResults.size() > 0;
+ }
+
+ public String getTextAtPath(String path, TreeNode<XmlNode> nodes) {
+ return getFirstXmlNodeText(getXmlNodesAt(path, nodes));
+ }
+
+ public XmlNode getXmlNodeAtPath(String path, TreeNode<XmlNode> nodes) {
+ return getFirstXmlNode(getXmlNodesAt(path, nodes));
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/ExpressionValidator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/ExpressionValidator.java
new file mode 100644
index 00000000000..e528b18c61d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/ExpressionValidator.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.framework.jdk.core.validate;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ExpressionValidator extends FieldValidator {
+
+ public ExpressionValidator(String fieldName) {
+ super(fieldName);
+ }
+
+ public boolean isValid() {
+ Object object = this.paramMap.get(fieldName);
+ if (object instanceof String) {
+ String toValidate = (String) object;
+
+ Object expression = this.paramMap.get("expression");
+ if (expression instanceof String) {
+ String expressionString = (String) expression;
+ if (expressionString.contains("matches")) {
+ expressionString = expressionString.replaceAll("\\s*matches\\('", "");
+ expressionString = expressionString.replaceAll("\\'\\)\\s*", "");
+ return matcher(toValidate, expressionString);
+ //return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean matcher(String toValidate, String regularExpression) {
+ Pattern pattern = Pattern.compile(regularExpression);
+ Matcher matcher = pattern.matcher(toValidate);
+ return matcher.matches();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/FieldValidator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/FieldValidator.java
new file mode 100644
index 00000000000..70f0a1f988d
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/FieldValidator.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.framework.jdk.core.validate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class FieldValidator implements IValidator {
+
+ protected String fieldName;
+ private String message;
+ protected Map<String, Object> paramMap;
+
+ FieldValidator(String fieldName) {
+ this.fieldName = fieldName;
+ this.message = "";
+ this.paramMap = new HashMap<String, Object>();
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public String getMessage() {
+ for (String key : paramMap.keySet()) {
+ message = message.replaceAll("\\$\\{" + key + "\\}", paramMap.get(key).toString());
+ }
+ return message;
+ }
+
+ void setMessage(String message) {
+ this.message = message;
+ }
+
+ public void setItemToValidate(Object object) {
+ this.paramMap.put(fieldName, object);
+ }
+
+ void addParam(String paramName, Object value) {
+ this.paramMap.put(paramName, value);
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/IValidator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/IValidator.java
new file mode 100644
index 00000000000..840961970eb
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/IValidator.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.framework.jdk.core.validate;
+
+public interface IValidator {
+
+ public String getFieldName();
+
+ public String getMessage();
+
+ public void setItemToValidate(Object object);
+
+ public boolean isValid();
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredStringValidator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredStringValidator.java
new file mode 100644
index 00000000000..4c33a052e41
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredStringValidator.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.framework.jdk.core.validate;
+
+public class RequiredStringValidator extends FieldValidator {
+
+ public RequiredStringValidator(String fieldName) {
+ super(fieldName);
+ }
+
+ public boolean isValid() {
+ Object object = paramMap.get(fieldName);
+ if (object != null && object instanceof String) {
+ String value = (String) object;
+ return (value != null && !value.equals(""));
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredValidator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredValidator.java
new file mode 100644
index 00000000000..7370c844edc
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/RequiredValidator.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.framework.jdk.core.validate;
+
+public class RequiredValidator extends FieldValidator {
+
+ public RequiredValidator(String fieldName) {
+ super(fieldName);
+ }
+
+ public boolean isValid() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/Validator.java b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/Validator.java
new file mode 100644
index 00000000000..492edbdf78c
--- /dev/null
+++ b/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/validate/Validator.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.framework.jdk.core.validate;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class Validator {
+
+ private InputStream fileToRead;
+ private Map<String, List<IValidator>> validatorMap;
+
+ private enum EntryEnum {
+ field;
+ }
+
+ private enum FieldAttributes {
+ name;
+ }
+
+ private enum FieldEntries {
+ validator;
+ }
+
+ private enum FieldValidatorAttributes {
+ type;
+ }
+
+ private enum FieldValidatorEntries {
+ message, param;
+ }
+
+ private enum ParamAttributes {
+ name;
+ }
+
+ private enum ValidationTypes {
+ requiredstring, required, expression;
+ }
+
+ public Validator(InputStream fileToRead) throws Exception {
+ this.fileToRead = fileToRead;
+ this.validatorMap = new HashMap<String, List<IValidator>>();
+ parseFile();
+ }
+
+ private void storeValidator(String fieldName, IValidator validator) {
+ List<IValidator> list = null;
+ if (!validatorMap.containsKey(fieldName)) {
+ list = new ArrayList<IValidator>();
+ validatorMap.put(fieldName, list);
+ } else {
+ list = validatorMap.get(fieldName);
+ }
+ list.add(validator);
+ }
+
+ private void parseMessage(Element element, FieldValidator validator) {
+ NodeList messageList = element.getElementsByTagName(FieldValidatorEntries.message.name());
+ if (messageList.getLength() == 1) {
+ Node node = messageList.item(0);
+ if (node != null) {
+ String message = node.getTextContent();
+ if (message != null && !message.equals("")) {
+ validator.setMessage(message.trim());
+ }
+ }
+ }
+ }
+
+ private void parseParams(Element element, FieldValidator validator) {
+ NodeList paramList = element.getElementsByTagName(FieldValidatorEntries.param.name());
+ for (int i = 0; i < paramList.getLength(); i++) {
+ Element paramElement = (Element) paramList.item(i);
+ String paramName = paramElement.getAttribute(ParamAttributes.name.name());
+ if (paramName != null && !paramName.equals("")) {
+ String content = paramElement.getTextContent();
+ if (content != null && !content.equals("")) {
+ validator.addParam(paramName.trim(), content.trim());
+ }
+ }
+ }
+ }
+
+ private void parseValidator(Element element, String fieldName, String validatorType) {
+ FieldValidator validator = validatorFactory(fieldName, validatorType);
+ if (validator != null) {
+ parseMessage(element, validator);
+ parseParams(element, validator);
+ storeValidator(fieldName, validator);
+ }
+ }
+
+ private void parseFile() throws Exception {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(fileToRead);
+
+ NodeList fields = document.getElementsByTagName(EntryEnum.field.name());
+
+ for (int i = 0; i < fields.getLength(); i++) {
+
+ Element fieldElement = (Element) fields.item(i);
+ String fieldName = fieldElement.getAttribute(FieldAttributes.name.name());
+ if (fieldName != null && !fieldName.equals("")) {
+
+ NodeList validators = fieldElement.getElementsByTagName(FieldEntries.validator.name());
+ for (int j = 0; j < validators.getLength(); j++) {
+ Element validatorElement = (Element) validators.item(j);
+
+ String validatorType = validatorElement.getAttribute(FieldValidatorAttributes.type.name());
+ if (validatorType != null && !validatorType.equals("")) {
+ parseValidator(validatorElement, fieldName.trim(), validatorType.trim());
+ }
+ }
+ }
+ }
+ }
+
+ private FieldValidator validatorFactory(String name, String type) {
+ FieldValidator toReturn = null;
+ ValidationTypes validationType = ValidationTypes.valueOf(type);
+ switch (validationType) {
+ case requiredstring:
+ toReturn = new RequiredStringValidator(name);
+ break;
+ case required:
+ toReturn = new RequiredValidator(name);
+ break;
+ case expression:
+ toReturn = new ExpressionValidator(name);
+ default:
+ break;
+ }
+ return toReturn;
+ }
+
+ public List<IValidator> getValidator(String fieldName) {
+ List<IValidator> list = validatorMap.get(fieldName);
+ return (list != null ? list : new ArrayList<IValidator>());
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/.classpath b/org.eclipse.osee.framework.jini/.classpath
new file mode 100644
index 00000000000..6e16b23d695
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.jini/.cvsignore b/org.eclipse.osee.framework.jini/.cvsignore
new file mode 100644
index 00000000000..092357e47d3
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.osee.framework.jini/.project b/org.eclipse.osee.framework.jini/.project
new file mode 100644
index 00000000000..dccbd534cc5
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.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.framework.jini/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.jini/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..e4cb8d5bffb
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,57 @@
+#Sun Mar 30 13:08:57 BST 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.jini/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.jini/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..33de165e53d
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/META-INF/MANIFEST.MF
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Core Jini Service (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.jini;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.jini.JiniPlugin
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.framework.jini,
+ org.eclipse.osee.framework.jini.discovery,
+ org.eclipse.osee.framework.jini.event,
+ org.eclipse.osee.framework.jini.event.old,
+ org.eclipse.osee.framework.jini.lease,
+ org.eclipse.osee.framework.jini.service.core,
+ org.eclipse.osee.framework.jini.service.directory.service,
+ org.eclipse.osee.framework.jini.service.gssfl,
+ org.eclipse.osee.framework.jini.service.interfaces,
+ org.eclipse.osee.framework.jini.service.report,
+ org.eclipse.osee.framework.jini.service.scheduler,
+ org.eclipse.osee.framework.jini.service.test.interfaces,
+ org.eclipse.osee.framework.jini.util,
+ org.eclipse.osee.framework.jini.utility
+Require-Bundle: org.eclipse.osee.framework.jdk.core,
+ org.eclipse.core.runtime,
+ net.jini,
+ org.eclipse.osee.framework.plugin.core
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.framework.jini/build.properties b/org.eclipse.osee.framework.jini/build.properties
new file mode 100644
index 00000000000..4e75e926181
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/build.properties
@@ -0,0 +1,8 @@
+bin.includes = plugin.xml,\
+ oseejinilookup.zip,\
+ META-INF/,\
+ src/,\
+ .
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.framework.jini/oseejinilookup.zip b/org.eclipse.osee.framework.jini/oseejinilookup.zip
new file mode 100644
index 00000000000..314ef8acde6
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/oseejinilookup.zip
Binary files differ
diff --git a/org.eclipse.osee.framework.jini/plugin.xml b/org.eclipse.osee.framework.jini/plugin.xml
new file mode 100644
index 00000000000..31e40a0545c
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/plugin.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="JiniInterface" name="JiniInterface" schema="schema/JiniInterface.exsd"/>
+
+ <extension
+ point="org.eclipse.osee.framework.jini.JiniInterface">
+ <RegisterBundle/>
+ </extension>
+ <extension
+ id="JiniLookup"
+ name="JiniLookup"
+ point="org.eclipse.core.runtime.applications">
+ <application>
+ <run class="org.eclipse.osee.framework.jini.JiniLookupPlatformRunnable"/>
+ </application>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.jini/release/JINIMANIFEST.MF b/org.eclipse.osee.framework.jini/release/JINIMANIFEST.MF
new file mode 100644
index 00000000000..af6b4e179cb
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/release/JINIMANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: 1.6.0_01-b06 (Sun Microsystems Inc.)
+Main-Class: osee/jini/utility/StartJini
+Class-Path: lib/jini-core.jar lib/jini-ext.jar lib/tools.jar oseecore.
+ jar
+
+Name: common
+Specification-Title: Example
+Specification-Version: ${version}
+Specification-Vendor: Example Organization
+Implementation-Title: common
+Implementation-Version: ${version} ${TODAY}
+Implementation-Vendor: Example Corp.
+
diff --git a/org.eclipse.osee.framework.jini/release/all.policy b/org.eclipse.osee.framework.jini/release/all.policy
new file mode 100644
index 00000000000..d0ac3e9dfb5
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/release/all.policy
@@ -0,0 +1,6 @@
+/* Security policy for non-secure Reggie */
+
+/* Grant all permissions to our classes */
+grant {
+ permission java.security.AllPermission;
+};
diff --git a/org.eclipse.osee.framework.jini/release/release.xml b/org.eclipse.osee.framework.jini/release/release.xml
new file mode 100644
index 00000000000..418bbe6001e
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/release/release.xml
@@ -0,0 +1,62 @@
+<project name="Release" default="createjini" basedir=".">
+
+ <property name="release" value="release/"/>
+ <property name="jiniHome" value="net.jini/jini2_1" />
+ <property name="jini" value="${jiniHome}/lib/" />
+ <property name="jiniscripts" value="${jiniHome}/example/" />
+ <!-- <property name="oracle" value="oracle/lib/"/> -->
+ <property name="oseecore" value="osee.jdk.core/bin/"/>
+ <property name="oseejini" value="osee.jini/bin/"/>
+
+
+ <target name="clean">
+ <delete file="JINIMANIFEST.MF"/>
+ <delete dir="${release}"/>
+ </target>
+
+ <target name="createDir" depends="clean">
+ <mkdir dir="${release}"/>
+ </target>
+
+ <target name="createjini" depends="createDir">
+ <manifest file="JINIMANIFEST.MF">
+ <attribute name="Main-Class" value="osee/jini/utility/StartJini"/>
+ <attribute name="Class-Path" value="lib/jini-core.jar lib/jini-ext.jar lib/tools.jar oseecore.jar"/>
+ <section name="common">
+ <attribute name="Specification-Title" value="Example"/>
+ <attribute name="Specification-Version" value="${version}"/>
+ <attribute name="Specification-Vendor" value="Example Organization"/>
+ <attribute name="Implementation-Title" value="common"/>
+ <attribute name="Implementation-Version" value="${version} ${TODAY}"/>
+ <attribute name="Implementation-Vendor" value="Example Corp."/>
+ </section>
+ </manifest>
+
+ <jar jarfile="${release}/oseecore.jar" basedir="../../${oseecore}" />
+ <jar jarfile="${release}/oseejini.jar" basedir="../../${oseejini}" manifest="JINIMANIFEST.MF"/>
+
+ <copy file="all.policy" toDir="${release}"/>
+
+ <copy toDir="${release}/example">
+ <fileset dir="../../${jiniscripts}"/>
+ </copy>
+
+ <copy toDir="${release}/net.jini/lib/">
+ <fileset dir="../../${jini}" includes="*.jar"/>
+ </copy>
+ <copy toDir="${release}/META-INF">
+ <fileset dir="../META-INF" includes="*.MF" />
+ </copy>
+ <!-- <copy toDir="${release}/${oracle}">
+ <fileset dir="../../${oracle}" includes="*.jar"/>
+ </copy> -->
+
+ <copy toDir="F:\server_launching\jini_release">
+ <fileset dir="${release}"/>
+ </copy>
+
+ <delete dir="${release}" />
+ <delete file="JINIMANIFEST.MF" />
+ </target>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jini/release/servicerelease.xml b/org.eclipse.osee.framework.jini/release/servicerelease.xml
new file mode 100644
index 00000000000..f6b2c3e26ee
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/release/servicerelease.xml
@@ -0,0 +1,75 @@
+<project name="JiniRelease" default="createjini" basedir=".">
+
+ <property name="release" value="releasetemp/" />
+ <property name="jiniinstall" value="net.jini/jini2_1" />
+ <!-- <property name="jini" value="${jiniinstall}/lib/" /> -->
+ <property name="jiniconfig" value="net.jini/jini_config" />
+ <!-- <property name="oracle" value="oracle/lib/"/> -->
+ <property name="oseecore" value="org.eclipse.osee.framework.jdk.core/bin/" />
+ <property name="oseejini" value="org.eclipse.osee.framework.jini/bin/" />
+ <property name="targetzip" value="../oseejinilookup.zip" />
+
+ <target name="clean">
+ <delete file="JINIMANIFEST.MF" />
+ <delete dir="${release}" />
+ </target>
+
+ <target name="createDir" depends="clean">
+ <mkdir dir="${release}" />
+ </target>
+
+ <target name="createjini" depends="createDir">
+ <manifest file="JINIMANIFEST.MF">
+ <attribute name="Main-Class" value="org/eclipse/osee/framework/jini/utility/StartJini" />
+ <attribute name="Class-Path" value="jini2_1/lib/jini-core.jar jini2_1/lib/jini-ext.jar jini2_1/lib/tools.jar oseecore.jar" />
+ <section name="common">
+ <attribute name="Specification-Title" value="Example" />
+ <attribute name="Specification-Version" value="${version}" />
+ <attribute name="Specification-Vendor" value="Example Organization" />
+ <attribute name="Implementation-Title" value="common" />
+ <attribute name="Implementation-Version" value="${version} ${TODAY}" />
+ <attribute name="Implementation-Vendor" value="Example Corp." />
+ </section>
+ </manifest>
+
+ <!-- <jar jarfile="${release}/oseecore.jar" basedir="../../${oseecore}" /> -->
+ <jar destfile="${release}/oseecore.jar">
+ <fileset dir="../../org.eclipse.osee.framework.jdk.core/bin/" />
+ <fileset dir="../../org.eclipse.osee.framework.plugin.core/bin/"/>
+ <fileset dir="../../org.eclipse.osee.framework.ui.plugin/bin/"/>
+ </jar>
+
+
+ <jar jarfile="${release}/oseejini.jar" basedir="../../${oseejini}" manifest="JINIMANIFEST.MF" />
+
+ <copy file="all.policy" toDir="${release}" />
+
+
+ <copy toDir="${release}/jini_config">
+ <fileset dir="../../${jiniconfig}" />
+ </copy>
+
+ <copy toDir="${release}/jini2_1/lib/">
+ <fileset dir="../../${jiniinstall}/lib/" includes="*.jar" />
+ </copy>
+ <copy toDir="${release}/jini2_1/lib-ext/">
+ <fileset dir="../../${jiniinstall}/lib-ext/" includes="*.jar" />
+ </copy>
+ <copy toDir="${release}/jini2_1/lib-dl/">
+ <fileset dir="../../${jiniinstall}/lib-dl/" includes="*.jar" />
+ </copy>
+ <copy toDir="${release}/META-INF">
+ <fileset dir="../META-INF" includes="*.MF" />
+ </copy>
+
+ <zip destfile="${targetzip}">
+ <fileset dir="${release}" />
+ </zip>
+
+ <delete dir="${release}" />
+ <delete file="JINIMANIFEST.MF" />
+
+
+ </target>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jini/schema/JiniInterface.exsd b/org.eclipse.osee.framework.jini/schema/JiniInterface.exsd
new file mode 100644
index 00000000000..560db98fb8e
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/schema/JiniInterface.exsd
@@ -0,0 +1,111 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.jini">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.jini" id="JiniInterface" name="JiniInterface"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <choice>
+ <element ref="Interface" minOccurs="1" maxOccurs="unbounded"/>
+ <element ref="RegisterBundle"/>
+ </choice>
+ <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="Interface">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="java.rmi.Remote"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="RegisterBundle">
+ <complexType>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/ExperimentalLookup.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/ExperimentalLookup.java
new file mode 100644
index 00000000000..a790089ed93
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/ExperimentalLookup.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.framework.jini;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.rmi.RemoteException;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.jini.config.ConfigurationException;
+import net.jini.core.discovery.LookupLocator;
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceTemplate;
+import net.jini.discovery.DiscoveryEvent;
+import net.jini.discovery.DiscoveryListener;
+import net.jini.discovery.LookupDiscoveryManager;
+import net.jini.lookup.LookupCache;
+import net.jini.lookup.ServiceDiscoveryEvent;
+import net.jini.lookup.ServiceDiscoveryListener;
+import net.jini.lookup.ServiceDiscoveryManager;
+import net.jini.lookup.entry.Comment;
+import net.jini.lookup.entry.Name;
+import net.jini.lookup.entry.ServiceInfo;
+import org.eclipse.osee.framework.jini.discovery.OseeJiniConfiguration;
+import org.eclipse.osee.framework.jini.discovery.RelaxedSecurity;
+import org.eclipse.osee.framework.jini.service.core.VersionEntry;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class ExperimentalLookup implements ServiceDiscoveryListener, DiscoveryListener {
+
+ private LookupDiscoveryManager lookupDiscoveryManager;
+ private ServiceDiscoveryManager serviceDiscoveryManager;
+ private LookupCache lookupCache;
+ private static final Logger logger = Logger.getLogger("org.eclipse.osee.framework.jini.discovery.ServiceDataStore");
+
+ // *************************************************************************
+ // Startup
+ // *************************************************************************
+
+ private ExperimentalLookup() {
+ System.setSecurityManager(new RelaxedSecurity());
+ registerWithJINI();
+ }
+
+ private void registerWithJINI() {
+ try {
+ lookupDiscoveryManager = new LookupDiscoveryManager(new String[] {}, null, this, new OseeJiniConfiguration());
+ serviceDiscoveryManager =
+ new ServiceDiscoveryManager(lookupDiscoveryManager, null, new OseeJiniConfiguration());
+
+ lookupCache =
+ serviceDiscoveryManager.createLookupCache(new ServiceTemplate(null, new Class[] {}, null), null, this);
+
+ } catch (RemoteException anRE) {
+ System.err.println("Failed to setup cache - exiting");
+ anRE.printStackTrace(System.err);
+ System.exit(-1);
+ } catch (IOException anIOE) {
+ System.err.println("Failed to setup managers - exiting");
+ anIOE.printStackTrace(System.err);
+ System.exit(-1);
+ } catch (ConfigurationException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex);
+ } catch (Throwable t) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "failed to setup managers", t);
+ }
+ }
+
+ public void addGroup(String... groups) throws IOException {
+ lookupDiscoveryManager.addGroups(groups);
+ }
+
+ public String[] getGroups() {
+ return lookupDiscoveryManager.getGroups();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceAdded(net.jini.lookup.ServiceDiscoveryEvent)
+ */
+ public synchronized void serviceAdded(ServiceDiscoveryEvent event) {
+ try {
+ ServiceItem item = event.getPostEventServiceItem();
+ System.out.println("found service:\n\tid = " + item.serviceID);
+ for (Entry entry : item.attributeSets) {
+ if (entry instanceof ServiceInfo) {
+ ServiceInfo serviceInfo = (ServiceInfo) entry;
+ System.out.println("\tname=" + serviceInfo.name);
+ System.out.println("\tmanufacturer=" + serviceInfo.manufacturer);
+ }
+ if (entry instanceof Name) {
+ Name name = (Name) entry;
+ System.out.println("\tname entry =" + name.name);
+ }
+ if (entry instanceof Comment) {
+ Comment comment = (Comment) entry;
+ System.out.println("\tcomment =" + comment.comment);
+ }
+ if (entry instanceof VersionEntry) {
+ VersionEntry version = (VersionEntry) entry;
+ System.out.println("\tversion entry =" + version.version);
+ }
+ }
+ } catch (RuntimeException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "exception while adding service", ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceRemoved(net.jini.lookup.ServiceDiscoveryEvent)
+ */
+ public void serviceRemoved(ServiceDiscoveryEvent event) {
+ ServiceItem item = event.getPreEventServiceItem();
+ System.out.println("service removed:\n\tid = " + item.serviceID);
+ for (Entry entry : item.attributeSets) {
+ if (entry instanceof ServiceInfo) {
+ ServiceInfo serviceInfo = (ServiceInfo) entry;
+ System.out.println("\tname=" + serviceInfo.name);
+ System.out.println("\tmanufacturer=" + serviceInfo.manufacturer);
+ }
+ if (entry instanceof Name) {
+ Name name = (Name) entry;
+ System.out.println("\tname entry =" + name.name);
+ }
+ if (entry instanceof Comment) {
+ Comment comment = (Comment) entry;
+ System.out.println("\tcomment =" + comment.comment);
+ }
+ if (entry instanceof VersionEntry) {
+ VersionEntry version = (VersionEntry) entry;
+ System.out.println("\tversion entry =" + version.version);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceChanged(net.jini.lookup.ServiceDiscoveryEvent)
+ */
+ public void serviceChanged(ServiceDiscoveryEvent event) {
+
+ }
+
+ public synchronized void discovered(DiscoveryEvent event) {
+ for (ServiceRegistrar registrar : event.getRegistrars()) {
+ System.out.println("Lookup Discovered: Service ID= " + registrar.getServiceID());
+ try {
+ for (String group : registrar.getGroups()) {
+ System.out.println("\tgroup " + group);
+ }
+ } catch (RemoteException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "failed to get registrar groups", ex);
+ }
+ }
+
+ }
+
+ public void discarded(DiscoveryEvent arg0) {
+
+ }
+
+ public void addLookupLocators(Collection<String> lookupList) throws MalformedURLException {
+ LookupLocator[] locators = new LookupLocator[lookupList.size()];
+ int i = 0;
+ for (String lookup : lookupList) {
+ locators[i++] = new LookupLocator(lookup);
+ }
+ lookupDiscoveryManager.addLocators(locators);
+ }
+
+ public void terminate() {
+ lookupDiscoveryManager.terminate();
+ serviceDiscoveryManager.terminate();
+ }
+
+ public static void main(String[] args) {
+
+ ExperimentalLookup ex = new ExperimentalLookup();
+ try {
+ ex.addGroup(new String[] {"LBA_DEVELOPMENT", "net.jini_2.1.0.200803130705"});
+ } catch (IOException ex2) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex2.toString(), ex2);
+ }
+ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+ try {
+ String line = reader.readLine();
+ while (!line.equals("QUIT")) {
+ line = reader.readLine();
+ }
+ } catch (Exception ex1) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex1.toString(), ex1);
+ } finally {
+ ex.terminate();
+
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniClassServer.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniClassServer.java
new file mode 100644
index 00000000000..fb0a3bed36d
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniClassServer.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.framework.jini;
+
+import java.net.InetAddress;
+import org.eclipse.osee.framework.plugin.core.server.ClassServer;
+import org.eclipse.osee.framework.plugin.core.server.ResourceFinder;
+
+/**
+ * @author David Diepenbrock
+ */
+public class JiniClassServer {
+
+ private static JiniClassServer myself;
+ private final ClassServer classServer;
+ private String hostName;
+ private String url;
+
+ private JiniClassServer() throws Exception {
+ hostName = InetAddress.getLocalHost().getHostAddress();
+ classServer = new ClassServer(0, InetAddress.getLocalHost());
+ classServer.start();
+
+ url = "http://" + hostName + ":" + classServer.getPort() + "/";
+
+ System.setProperty("java.rmi.server.hostname", hostName);
+ System.setProperty("java.rmi.server.codebase", url);
+
+ System.out.println("hostname:" + System.getProperty("java.rmi.server.hostname"));
+ System.out.println("url:" + System.getProperty("java.rmi.server.codebase"));
+
+ }
+
+ public void addResourceFinder(ResourceFinder finder) {
+ classServer.addResourceFinder(finder);
+ }
+
+ /**
+ * @return Return singleton JiniClassServer object reference.
+ * @throws Exception If there was an error creating a socket on localhost.
+ */
+ public static JiniClassServer getInstance() throws Exception {
+ if (myself == null || myself.classServer == null) myself = new JiniClassServer();
+ return myself;
+ }
+
+ // public void addPaths(String[] paths) {
+ //
+ // System.out.println("Adding Paths:");
+ // for(int i = 0; i < paths.length; i++){
+ // System.out.println("\t" + paths[i]);
+ // }
+ // classServer.addPaths(paths);
+ // }
+
+ // public void addPath(String path) {
+ // addPaths(new String[]{path});
+ // }
+
+ // public void addClass(Class classObj) {
+ //System.out.println("Adding Class: " + classObj.getCanonicalName());
+ // addPath(Lib.getClassLoadPath(classObj));
+ // }
+
+ /**
+ * Stops the class server, if one was started
+ */
+ public static void stopServer() {
+ if (myself != null && myself.classServer != null) myself.classServer.terminate();
+ }
+
+ /**
+ * @return Returns the url of the class server.
+ */
+ public String getUrl() {
+ return url;
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniLookupPlatformRunnable.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniLookupPlatformRunnable.java
new file mode 100644
index 00000000000..869df1936c8
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniLookupPlatformRunnable.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.framework.jini;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.osee.framework.jdk.core.util.CmdLineArgs;
+import org.eclipse.osee.framework.jini.utility.StartJini;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+public class JiniLookupPlatformRunnable implements IApplication {
+ private StartJini jiniService;
+
+ public JiniLookupPlatformRunnable() {
+ super();
+ this.jiniService = null;
+ }
+
+ private String getJiniHome() throws IOException {
+ Bundle bundle = Platform.getBundle("net.jini");
+ URL url = bundle.getEntry("/");
+ url = FileLocator.resolve(url);
+ return new File(url.getFile()).getAbsolutePath();
+ }
+
+ private InputStream getJiniManifest() throws IOException {
+ Bundle bundle = Platform.getBundle("org.eclipse.osee.framework.jini");
+ URL url = bundle.getEntry("META-INF/MANIFEST.MF");
+ return url.openStream();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+ */
+ public Object start(IApplicationContext context) throws Exception {
+ String[] inputArgs = Platform.getApplicationArgs();
+ CmdLineArgs args = new CmdLineArgs(inputArgs);
+
+ String port = args.get("-port");
+ if (port == null) {
+ port = "8081";
+ }
+ jiniService = null;
+ jiniService = new StartJini(port, true, false, getJiniHome(), getJiniManifest());
+ return IApplication.EXIT_OK;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#stop()
+ */
+ public void stop() {
+ if (jiniService != null) {
+ try {
+ jiniService.kill();
+ } catch (RemoteException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniPlugin.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniPlugin.java
new file mode 100644
index 00000000000..549be1ffd9b
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/JiniPlugin.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.framework.jini;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.framework.jini.discovery.EclipseJiniClassloader;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plug-in class to be used in the desktop.
+ */
+public class JiniPlugin extends Plugin {
+
+ private static JiniPlugin plugin;
+
+ /**
+ * The constructor.
+ */
+ public JiniPlugin() {
+ JiniPlugin.plugin = this;
+ try {
+ JiniClassServer.getInstance();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ JiniClassServer.stopServer();
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static JiniPlugin getInstance() {
+ return plugin;
+ }
+
+ public void earlyStartup() {
+ // so that the jini stuff gets started up
+ ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance());
+ System.out.println("JiniPlugin early startup");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseBundleClassloader.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseBundleClassloader.java
new file mode 100644
index 00000000000..231b292da7f
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseBundleClassloader.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.framework.jini.discovery;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jini.JiniPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class assumes that code is not downloaded from services but already resides in the eclipse install as a plugin.
+ * A result of this is that versions of the service and the plugins being used need to match.
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class EclipseBundleClassloader extends ClassLoader {
+ private Map<String, Class<?>> classesloaded;
+ private Map<String, Bundle> bundleLoaded;
+
+ public EclipseBundleClassloader(List<String> bundleNames) {
+ this(bundleNames, EclipseBundleClassloader.class.getClassLoader());
+ }
+
+ public EclipseBundleClassloader(List<String> bundleNames, ClassLoader parent) {
+ super(parent);
+ classesloaded = new HashMap<String, Class<?>>();
+ bundleLoaded = new HashMap<String, Bundle>();
+ for (int i = 0; i < bundleNames.size(); i++) {
+ String name = bundleNames.get(i);
+ Bundle bundle = Platform.getBundle(name);
+ if (bundle == null) {
+ OseeLog.log(JiniPlugin.class, Level.WARNING, "The bundle " + name + " does not exist");
+ } else {
+ bundleLoaded.put(bundle.getSymbolicName(), bundle);
+ }
+ }
+ }
+
+ public EclipseBundleClassloader(Bundle bundle) {
+ super(EclipseBundleClassloader.class.getClassLoader());
+ classesloaded = new HashMap<String, Class<?>>();
+ bundleLoaded = new HashMap<String, Bundle>();
+ bundleLoaded.put(bundle.getSymbolicName(), bundle);
+ }
+
+ protected synchronized Class<?> findClass(String classname) throws ClassNotFoundException {
+ Class<?> loadedclass = classesloaded.get(classname);
+ if (loadedclass != null) {
+ return loadedclass;
+ }
+ Iterator<String> it = bundleLoaded.keySet().iterator();
+ while (it.hasNext()) {
+ String key = it.next();
+ Bundle bundle = bundleLoaded.get(key);
+ try {
+ Class<?> foundclass = bundle.loadClass(classname);
+ if (!classesloaded.containsKey(classname)) {
+ classesloaded.put(classname, foundclass);
+ }
+ return foundclass;
+ } catch (NoClassDefFoundError err) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "Caught Error: bundle = " + bundle.getSymbolicName(), err);
+ } catch (ClassNotFoundException ex) {
+ // Do nothing
+ }
+ }
+ return this.getParent().loadClass(classname);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class loadClass(String classname) throws ClassNotFoundException {
+ return loadClass(classname, false);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseJiniClassloader.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseJiniClassloader.java
new file mode 100644
index 00000000000..f8025dc88b1
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/EclipseJiniClassloader.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.discovery;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class assumes that code is not downloaded from services but already resides in the eclipse install as a plugin.
+ * A result of this is that versions of the service and the plugins being used need to match.
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class EclipseJiniClassloader extends ClassLoader {
+ private static EclipseJiniClassloader singleton;
+ private Map<String, Class<?>> classesloaded;
+ private Map<String, String> registrationMap;
+ private List<String> bundleList;
+
+ public static EclipseJiniClassloader getInstance() {
+ if (singleton == null) {
+ singleton = new EclipseJiniClassloader();
+ }
+ return singleton;
+ }
+
+ public EclipseJiniClassloader(ClassLoader parent) {
+ super(parent);
+ classesloaded = new HashMap<String, Class<?>>();
+ bundleList = new ArrayList<String>();
+ bundleList.add("net.jini");
+
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.jini.JiniInterface");
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ registrationMap = new HashMap<String, String>();
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("Interface")) {
+ String classname = el.getAttribute("classname");
+ String bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ registrationMap.put(classname, bundleName);
+ }
+ } else if (el.getName().equals("RegisterBundle")) {
+ bundleList.add(el.getContributor().getName());
+ }
+ }
+ }
+ }
+
+ public EclipseJiniClassloader() {
+ classesloaded = new HashMap<String, Class<?>>();
+ bundleList = new ArrayList<String>();
+ bundleList.add("net.jini");
+
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.jini.JiniInterface");
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ registrationMap = new HashMap<String, String>();
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("Interface")) {
+ String classname = el.getAttribute("classname");
+ String bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ registrationMap.put(classname, bundleName);
+ }
+ } else if (el.getName().equals("RegisterBundle")) {
+ bundleList.add(el.getContributor().getName());
+ }
+ }
+ }
+ }
+
+ @Override
+ protected synchronized Class<?> findClass(String classname) throws ClassNotFoundException {
+ Class<?> loadedclass = classesloaded.get(classname);
+ if (loadedclass != null) {
+ return loadedclass;
+ }
+
+ if (registrationMap.containsKey(classname)) {
+ String bundleName = (String) registrationMap.get(classname);
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> foundclass = bundle.loadClass(classname);
+ if (foundclass != null) {
+ System.out.println(foundclass.getName());
+ classesloaded.put(classname, foundclass);
+ return foundclass;
+ }
+ } catch (Exception ex) {
+ }
+ }
+
+ for (int i = 0; i < bundleList.size(); i++) {
+ try {
+ Class<?> foundclass = Platform.getBundle(bundleList.get(i)).loadClass(classname);
+ if (foundclass != null) {
+ String bundle = bundleList.remove(i);
+ bundleList.add(0, bundle);
+ }
+ if (!classesloaded.containsKey(classname)) {
+ classesloaded.put(classname, foundclass);
+ }
+ return foundclass;
+
+ } catch (Exception ex) {
+ // Do nothing
+ }
+ }
+ return super.findClass(classname);
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IRegistrarListener.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IRegistrarListener.java
new file mode 100644
index 00000000000..8e71ca9bda5
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IRegistrarListener.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.framework.jini.discovery;
+
+import java.util.List;
+import net.jini.core.lookup.ServiceRegistrar;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IRegistrarListener {
+ public void reggieAdded(List<ServiceRegistrar> serviceRegistrars);
+
+ public void reggieRemoved(List<ServiceRegistrar> serviceRegistrars);
+
+ public void reggieChanged(List<ServiceRegistrar> serviceRegistrars);
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IServiceLookupListener.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IServiceLookupListener.java
new file mode 100644
index 00000000000..c7c035ccecc
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/IServiceLookupListener.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.framework.jini.discovery;
+
+import net.jini.core.lookup.ServiceItem;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IServiceLookupListener {
+ public void serviceAdded(ServiceItem serviceItem);
+
+ public void serviceChanged(ServiceItem serviceItem);
+
+ public void serviceRemoved(ServiceItem serviceItem);
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/OseeJiniConfiguration.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/OseeJiniConfiguration.java
new file mode 100644
index 00000000000..3b301256b36
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/OseeJiniConfiguration.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.framework.jini.discovery;
+
+import net.jini.config.Configuration;
+import net.jini.config.ConfigurationException;
+import net.jini.config.ConfigurationProvider;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeJiniConfiguration implements Configuration {
+ private Configuration config;
+
+ public OseeJiniConfiguration() throws ConfigurationException {
+ config = ConfigurationProvider.getInstance(null);
+
+ }
+
+ public OseeJiniConfiguration(ClassLoader loader) throws ConfigurationException {
+ config = ConfigurationProvider.getInstance(null, loader);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.config.Configuration#getEntry(java.lang.String, java.lang.String,
+ * java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEntry(String arg0, String arg1, Class arg2) throws ConfigurationException {
+ return config.getEntry(arg0, arg1, arg2);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.config.Configuration#getEntry(java.lang.String, java.lang.String,
+ * java.lang.Class, java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEntry(String arg0, String arg1, Class arg2, Object arg3) throws ConfigurationException {
+ Object o = config.getEntry(arg0, arg1, arg2, arg3);
+ return o;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.config.Configuration#getEntry(java.lang.String, java.lang.String,
+ * java.lang.Class, java.lang.Object, java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getEntry(String arg0, String arg1, Class arg2, Object arg3, Object arg4) throws ConfigurationException {
+ return config.getEntry(arg0, arg1, arg2, arg3, arg4);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/RelaxedSecurity.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/RelaxedSecurity.java
new file mode 100644
index 00000000000..c9cc40dc0e5
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/RelaxedSecurity.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.framework.jini.discovery;
+
+import java.net.InetAddress;
+import java.security.Permission;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RelaxedSecurity extends SecurityManager {
+
+ /**
+ *
+ */
+ public RelaxedSecurity() {
+ super();
+ }
+
+ public void checkPermission(Permission perm) {
+ return;
+ }
+
+ public void checkPermission(Permission perm, Object context) {
+ return;
+ }
+
+ @Override
+ public void checkAccept(String host, int port) {
+ return;
+ }
+
+ @Override
+ public void checkConnect(String host, int port, Object context) {
+ }
+
+ @Override
+ public void checkMulticast(InetAddress maddr, byte ttl) {
+ }
+
+ @Override
+ public void checkMulticast(InetAddress maddr) {
+ }
+
+ @Override
+ public void checkConnect(String host, int port) {
+ }
+
+ @Override
+ public void checkPackageAccess(String pkg) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.SecurityManager#checkAccess(java.lang.Thread)
+ */
+ @Override
+ public void checkAccess(Thread arg0) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.SecurityManager#checkAccess(java.lang.ThreadGroup)
+ */
+ @Override
+ public void checkAccess(ThreadGroup arg0) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.SecurityManager#checkCreateClassLoader()
+ */
+ @Override
+ public void checkCreateClassLoader() {
+
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.SecurityManager#checkExec(java.lang.String)
+ */
+ @Override
+ public void checkExec(String arg0) {
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/ServiceDataStore.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/ServiceDataStore.java
new file mode 100644
index 00000000000..751e4cf2fc6
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/discovery/ServiceDataStore.java
@@ -0,0 +1,733 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.discovery;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import net.jini.config.ConfigurationException;
+import net.jini.core.discovery.LookupLocator;
+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.ServiceTemplate;
+import net.jini.discovery.DiscoveryEvent;
+import net.jini.discovery.DiscoveryListener;
+import net.jini.discovery.LookupDiscoveryManager;
+import net.jini.lookup.LookupCache;
+import net.jini.lookup.ServiceDiscoveryEvent;
+import net.jini.lookup.ServiceDiscoveryListener;
+import net.jini.lookup.ServiceDiscoveryManager;
+
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.jini.JiniPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+
+public class ServiceDataStore implements ServiceDiscoveryListener, DiscoveryListener {
+
+ private static ServiceDataStore theInstance = null;
+
+ private List<ClassListener> classListeners;
+ private Set<IRegistrarListener> registrarListeners;
+ private Set<IServiceLookupListener> noFilterServiceListeners;
+ private Set<String> locators;
+
+ // private Set allowedGroups;
+
+ private List<ServiceItem> serviceItemList;
+ private Map<ServiceID, ServiceRegistrar> serviceRegistrars;
+ private LookupDiscoveryManager lookupDiscoveryManager;
+ private ServiceDiscoveryManager serviceDiscoveryManager;
+
+ // private LookupCache lookupCache;
+ // private LookupCache lookupCache;
+ private Map<Class<?>, LookupCache> lookupCaches;
+ private Logger logger = Logger.getLogger("org.eclipse.osee.framework.jini.discovery.ServiceDataStore");
+ private LookupCache everythingCache;
+
+ // *************************************************************************
+ // Startup
+ // *************************************************************************
+
+ private ServiceDataStore(ClassLoader loader) {
+ lookupCaches = Collections.synchronizedMap(new HashMap<Class<?>, LookupCache>());
+ serviceItemList = Collections.synchronizedList(new ArrayList<ServiceItem>());
+ classListeners = new ArrayList<ClassListener>();
+ registrarListeners = Collections.synchronizedSet(new HashSet<IRegistrarListener>());
+ serviceRegistrars = Collections.synchronizedMap(new HashMap<ServiceID, ServiceRegistrar>());
+ noFilterServiceListeners = Collections.synchronizedSet(new HashSet<IServiceLookupListener>());
+ locators = Collections.synchronizedSet(new HashSet<String>());
+
+ ClassLoader currentContext = Thread.currentThread().getContextClassLoader();
+ try{
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ System.setSecurityManager(new RelaxedSecurity());
+ registerWithJINI();
+ } finally{
+ Thread.currentThread().setContextClassLoader(currentContext);
+ }
+ }
+
+ private void registerWithJINI() {
+ try {
+ String[] filterGroups = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+ if (filterGroups == null) {
+ logger.log(
+ Level.SEVERE,
+ "[-D" + OseeProperties.getOseeJiniServiceGroups() + "] was not set.\n" + "Please enter the Jini Group this service register with.");
+ System.exit(1);
+ }
+
+ LookupLocator[] locator = null;
+ lookupDiscoveryManager = new LookupDiscoveryManager(filterGroups, locator, this, new OseeJiniConfiguration());
+ serviceDiscoveryManager =
+ new ServiceDiscoveryManager(lookupDiscoveryManager, null, new OseeJiniConfiguration());
+
+ // We will maintain our own cache, so this call just registers
+ // ourselves for lookup
+ // lookupCache = myManager.createLookupCache(null, null, this);
+ } catch (RemoteException anRE) {
+ System.err.println("Failed to setup cache - exiting");
+ anRE.printStackTrace(System.err);
+ System.exit(-1);
+ } catch (IOException anIOE) {
+ System.err.println("Failed to setup managers - exiting");
+ anIOE.printStackTrace(System.err);
+ System.exit(-1);
+ } catch (ConfigurationException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex);
+ } catch (Throwable t) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "failed to setup managers", t);
+ }
+ }
+
+ public void addGroup(String... groups) throws IOException {
+ lookupDiscoveryManager.addGroups(groups);
+ }
+
+ public String[] getGroups() {
+ return lookupDiscoveryManager.getGroups();
+ }
+
+ /**
+ * If an existing instance exists, returns the instance. Otherwise, creates a new instance and starts the jini lookup
+ * service. Note that services are not immediatly available after starting the lookup service, it takes some time for
+ * discovery. It is recommended that getInstance() is called at the start of a program's execution in order to start
+ * this lookup.
+ *
+ * @return Return singleton ServiceDataStore object instance reference.
+ */
+ public static ServiceDataStore getEclipseInstance(ClassLoader loader) {
+ if (theInstance == null) {
+ if (loader == null) {
+ loader = ServiceDataStore.class.getClassLoader();
+ }
+ theInstance = new ServiceDataStore(loader);
+ }
+ return theInstance;
+ }
+
+ public static ServiceDataStore getNonEclipseInstance() {
+ if (theInstance == null) {
+ theInstance = new ServiceDataStore(ServiceDataStore.class.getClassLoader());
+ }
+ return theInstance;
+ }
+
+ public ServiceRegistrar findRegistrar(String host) throws MalformedURLException, ClassNotFoundException, IOException {
+ LookupLocator locator = new LookupLocator(host);
+ return locator.getRegistrar(5000);
+ /*
+ if (lookupDiscoveryManager.getFrom(reg) == LookupDiscoveryManager.FROM_GROUP || compareGroups(reg)) {
+ if (reg != null) {
+ return locator;
+ }
+ }
+ return null;
+ */
+ }
+
+ private class LookupList extends Thread {
+
+ private Collection<String> lookupLocations;
+
+ public LookupList(Collection<String> lookupLocations) {
+ this.lookupLocations = lookupLocations;
+ System.setSecurityManager(new RelaxedSecurity());
+ }
+
+ public void run() {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ System.setSecurityManager(new RelaxedSecurity());
+ if (lookupLocations != null) {
+ List<LookupLocator> locatorList = new ArrayList<LookupLocator>();
+ for (String location : lookupLocations) {
+ try {
+ LookupLocator locator = new LookupLocator(location);
+ ServiceRegistrar reg = locator.getRegistrar(5000);
+ if (lookupDiscoveryManager.getFrom(reg) == LookupDiscoveryManager.FROM_GROUP || compareGroups(reg)) if (reg != null) locatorList.add(locator);
+ } catch (MalformedURLException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex.getMessage(), ex);
+ } catch (Exception ex) {
+ System.out.println(); // ?
+ }
+ }
+ lookupDiscoveryManager.addLocators(locatorList.toArray(new LookupLocator[locatorList.size()]));
+ }
+ }
+ }
+
+ private boolean compareGroups(ServiceRegistrar reg) {
+ String[] groups;
+ try {
+ groups = reg.getGroups();
+ String[] groupsToMatch = lookupDiscoveryManager.getGroups();
+ for (int i = 0; i < groups.length; i++) {
+ for (int j = 0; j < groupsToMatch.length; j++) {
+ if (groups[i].equals(groupsToMatch[j])) {
+ return true;
+ }
+ }
+ }
+ } catch (RemoteException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ // *************************************************************************
+ // Immediate Data Access
+ // *************************************************************************
+
+ /**
+ * Returns a list of currently available services that match the class types provided. <br /> Note: If this is called
+ * immediatly after the first call to getInstance(), the Jini lookup will not have had time to complete, and no
+ * services will yet be available.
+ */
+ public List<ServiceItem> getAvailableServices(Class<?>[] classTypes) {
+ List<ServiceItem> serviceList = new ArrayList<ServiceItem>();
+
+ for (int i = 0; i < classTypes.length; i++) {
+ // Notify the listener of all existing services that match
+ synchronized (serviceItemList) {
+ for (int j = 0; j < serviceItemList.size(); j++) {
+ ServiceItem serviceItem = serviceItemList.get(j);
+ if (classTypes[i].isInstance(serviceItem.service)) {
+ serviceList.add(serviceItem);
+ }
+ }
+ }
+ }
+
+ return serviceList;
+ }
+
+ // *************************************************************************
+ // Maintaining Listeners
+ // *************************************************************************
+
+ /**
+ * Adds the listener. When any service events happen, the listener will be notified. Note that upon calling
+ * addListener(), the {@link IServiceLookupListener#serviceAdded(ServiceItem)} method of the listener will be called
+ * supplying it all existing services
+ *
+ * @param listener The listener to be added
+ */
+ public void addListener(IServiceLookupListener listener) {
+ synchronized (noFilterServiceListeners) {
+ noFilterServiceListeners.add(listener);
+ }
+
+ try {
+ addLookupCache(null);
+ } catch (RemoteException e) {
+
+ e.printStackTrace();
+ }
+
+ synchronized (serviceItemList) {
+ for (int i = 0; i < serviceItemList.size(); i++) {
+ ServiceItem serviceItem = serviceItemList.get(i);
+ listener.serviceAdded(serviceItem);
+ }
+ }
+ }
+
+ private void addLookupCache(Class<?> classType) throws RemoteException {
+ if (classType == null && everythingCache == null) {
+ everythingCache = serviceDiscoveryManager.createLookupCache(null, null, this);
+ } else {
+ if (lookupCaches.get(classType) == null) {
+ ClassLoader currentContext = Thread.currentThread().getContextClassLoader();
+ try{
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ lookupCaches.put(classType, serviceDiscoveryManager.createLookupCache(new ServiceTemplate(null,
+ new Class[] {classType}, null), null, this));
+ } finally{
+ Thread.currentThread().setContextClassLoader(currentContext);
+ }
+
+
+ }
+ }
+ }
+
+ private void resetLookupCaches() throws RemoteException {
+ if (everythingCache != null) {
+ everythingCache.removeListener(this);
+ everythingCache = null;
+ addLookupCache(null);
+ }
+ Iterator<Class<?>> it = lookupCaches.keySet().iterator();
+ while (it.hasNext()) {
+ lookupCaches.get(it.next()).removeListener(this);
+ }
+ for (int i = 0; i < classListeners.size(); i++) {
+ addLookupCache(classListeners.get(i).classType);
+ }
+ }
+
+ /**
+ * Adds the listener to the classType specified. When any service events which are instances of the specified
+ * classType happen, the listener will be notified. If the listener is concerned with multiple types, multiple calls
+ * to addListener() can be made. Note that upon calling addListener(), the
+ * {@link IServiceLookupListener#serviceAdded(ServiceItem)} method of the listener will be called supplying it all
+ * existing services which match the specified classType.
+ *
+ * @param listener The listener to be added
+ * @param classType The Class of the service events of interest
+ */
+ public void addListener(IServiceLookupListener listener, Class<?> classType, Entry[] entries) {
+ ClassListener classListener;
+
+ try {
+ addLookupCache(classType);
+ } catch (RemoteException e) {
+
+ e.printStackTrace();
+ }
+
+ synchronized (classListeners) {
+ classListener = new ClassListener(classType, listener, entries);
+ classListeners.add(new ClassListener(classType, listener, entries));
+ }
+
+ // Notify the listener of all existing services that match
+ synchronized (serviceItemList) {
+ for (int i = 0; i < serviceItemList.size(); i++) {
+ ServiceItem serviceItem = serviceItemList.get(i);
+ if (classListener.matches(serviceItem)) {
+ listener.serviceAdded(serviceItem);
+ }
+ }
+ }
+ }
+
+ public void addListener(IServiceLookupListener listener, Class<?> classType) {
+ addListener(listener, classType, null);
+ }
+
+ /**
+ * Adds a registrar listener. This enables an object to be notified whenever a lookupservice is added removed or has
+ * a service added to or removed from it. When a listener is added it immediately gets a callback with all of the
+ * currently discovered lookup services.
+ *
+ * @param listener The listener to be added
+ */
+ public void addListener(IRegistrarListener listener) {
+ synchronized (registrarListeners) {
+ registrarListeners.add(listener);
+ // Notify the listener of all existing services that match
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieAdded(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+
+ /**
+ * Removes the listener, it will no longer be notified of change events.
+ *
+ * @param listener The listener to be removed
+ */
+ public void removeListener(IRegistrarListener listener) {
+ synchronized (registrarListeners) {
+ registrarListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Removes the listener, it will no longer be notified of change events.
+ *
+ * @param listenerToRemove The listener to be removed
+ */
+ public void removeListener(IServiceLookupListener listenerToRemove) {
+ ClassListener classListener;
+ IServiceLookupListener listener;
+
+ synchronized (classListeners) {
+ Iterator<ClassListener> classIter = classListeners.iterator();
+ while (classIter.hasNext()) {
+ classListener = classIter.next();
+ Iterator<IServiceLookupListener> iter = classListener.listeners.iterator();
+ while (iter.hasNext()) {
+ listener = iter.next();
+ if (listener.equals(listenerToRemove)) {
+ iter.remove();
+ }
+ }
+
+ // If this classType has no more listeners, we can remove it
+ if (classListener.listeners.isEmpty()) {
+ classIter.remove();
+ }
+ }
+ }
+
+ synchronized (noFilterServiceListeners) {
+ noFilterServiceListeners.remove(listenerToRemove);
+ }
+ }
+
+ private class ClassListener {
+ public Class<?> classType;
+
+ public ArrayList<IServiceLookupListener> listeners;
+
+ public Entry[] entries;
+
+ // public ClassListener(Class classType, IServiceLookupListener
+ // listener) {
+ // this.classType = classType;
+ // listeners = new ArrayList();
+ // listeners.add(listener);
+ // }
+
+ public ClassListener(Class<?> classType, IServiceLookupListener listener, Entry[] entries) {
+ // this(classType, listener);
+ this.entries = entries;
+ this.classType = classType;
+ listeners = new ArrayList<IServiceLookupListener>();
+ listeners.add(listener);
+ }
+
+ public boolean matches(ServiceItem serviceItem) {
+
+ if (classType.isInstance(serviceItem.service)) {
+ if (entries != null) {
+ for (int i = 0; i < entries.length; i++) {
+ boolean foundEntry = false;
+ for (int j = 0; j < serviceItem.attributeSets.length; j++) {
+ if (entries[i].getClass().isInstance(serviceItem.attributeSets[j])) {
+ if (!entries[i].equals(serviceItem.attributeSets[j])) {
+ return false;
+ } else {
+ foundEntry = true;
+ }
+ }
+ }
+ if (!foundEntry) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+ }
+
+ // *************************************************************************
+ // Notifying Service Changes
+ // *************************************************************************
+
+ private void notifyServiceAdded(ServiceItem serviceItem) {
+ synchronized (noFilterServiceListeners) {
+ Iterator<IServiceLookupListener> iterator = noFilterServiceListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().serviceAdded(serviceItem);
+ }
+ }
+ synchronized (classListeners) {
+ for (int i = 0; i < classListeners.size(); i++) {
+ ClassListener classListener = classListeners.get(i);
+
+ if (classListener.matches(serviceItem)) {
+ for (int j = 0; j < classListener.listeners.size(); j++) {
+ IServiceLookupListener listener = classListener.listeners.get(j);
+
+ listener.serviceAdded(serviceItem);
+ }
+ }
+ }
+ }
+ }
+
+ private void notifyServiceRemoved(ServiceItem serviceItem) {
+ synchronized (noFilterServiceListeners) {
+ Iterator<IServiceLookupListener> iterator = noFilterServiceListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().serviceRemoved(serviceItem);
+ }
+ }
+
+ synchronized (classListeners) {
+ for (int i = 0; i < classListeners.size(); i++) {
+ ClassListener classListener = classListeners.get(i);
+ if (classListener.matches(serviceItem)) {
+ for (int j = 0; j < classListener.listeners.size(); j++) {
+ IServiceLookupListener listener = classListener.listeners.get(j);
+ listener.serviceRemoved(serviceItem);
+ }
+ }
+ }
+ }
+ }
+
+ private void notifyServiceChanged(ServiceItem serviceItem) {
+ synchronized (noFilterServiceListeners) {
+ Iterator<IServiceLookupListener> iterator = noFilterServiceListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().serviceChanged(serviceItem);
+ }
+ }
+
+ synchronized (classListeners) {
+ for (int i = 0; i < classListeners.size(); i++) {
+ ClassListener classListener = classListeners.get(i);
+ if (classListener.matches(serviceItem)) {
+ for (int j = 0; j < classListener.listeners.size(); j++) {
+ IServiceLookupListener listener = classListener.listeners.get(j);
+ listener.serviceChanged(serviceItem);
+ }
+ }
+ }
+ }
+ }
+
+ // *************************************************************************
+ // Handling Service Changes
+ // *************************************************************************
+
+ // private static boolean findServiceId(Collection<ServiceItem> list,
+ // ServiceID sid, boolean
+ // remove) {
+ private static boolean findServiceId(Collection<ServiceItem> list, ServiceID sid, boolean remove) {
+ synchronized (list) {
+ Iterator<ServiceItem> iter = list.iterator();
+ while (iter.hasNext()) {
+ ServiceItem si = iter.next();
+ if (si.serviceID.equals(sid)) {
+ if (remove) iter.remove();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceAdded(net.jini.lookup.ServiceDiscoveryEvent)
+ */
+ public synchronized void serviceAdded(ServiceDiscoveryEvent event) {
+ try {
+ if (!findServiceId(serviceItemList, event.getPostEventServiceItem().serviceID, false)) {
+ synchronized (serviceItemList) {
+ serviceItemList.add(event.getPostEventServiceItem());
+ }
+ notifyServiceAdded(event.getPostEventServiceItem());
+
+ synchronized (registrarListeners) {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieChanged(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex.getMessage(), ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceRemoved(net.jini.lookup.ServiceDiscoveryEvent)
+ */
+ public void serviceRemoved(ServiceDiscoveryEvent event) {
+ if (findServiceId(serviceItemList, event.getPreEventServiceItem().serviceID, true)) {
+ notifyServiceRemoved(event.getPreEventServiceItem());
+
+ synchronized (registrarListeners) {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieChanged(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceChanged(net.jini.lookup.ServiceDiscoveryEvent)
+ */
+ public void serviceChanged(ServiceDiscoveryEvent event) {
+ if (findServiceId(serviceItemList, event.getPostEventServiceItem().serviceID, false)) notifyServiceChanged(event.getPostEventServiceItem());
+ }
+
+ public void discovered(DiscoveryEvent arg0) {
+ synchronized (serviceRegistrars) {
+ ServiceRegistrar[] reggies = arg0.getRegistrars();
+ for (int i = 0; i < reggies.length; i++) {
+
+ if (lookupDiscoveryManager.getFrom(reggies[i]) == LookupDiscoveryManager.FROM_GROUP || compareGroups(reggies[i])) {
+ Object last = serviceRegistrars.put(reggies[i].getServiceID(), reggies[i]);
+
+ synchronized (registrarListeners) {
+ if (last == null) {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieAdded(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ } else {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieChanged(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+ }
+ // else {
+ // try {
+ // System.out.println("Reject: "
+ // + reggies[i].getLocator().getHost());
+ // } catch (RemoteException ex) {
+ // ex.printStackTrace();
+ // }
+ // }
+ }
+ }
+
+ }
+
+ public void discarded(DiscoveryEvent arg0) {
+ synchronized (serviceRegistrars) {
+ ServiceRegistrar[] reggies = arg0.getRegistrars();
+ for (int i = 0; i < reggies.length; i++) {
+ if (lookupDiscoveryManager.getFrom(reggies[i]) == LookupDiscoveryManager.FROM_GROUP || compareGroups(reggies[i])) {
+
+ Object removedObject = serviceRegistrars.remove(reggies[i].getServiceID());
+ if (removedObject == null) {
+ synchronized (registrarListeners) {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieRemoved(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Returns the serviceRegistrars.
+ */
+ public Map<ServiceID, ServiceRegistrar> getServiceRegistrars() {
+ return serviceRegistrars;
+ }
+
+ /**
+ * @param lookupList
+ * @param addToLocators - If true, adds the lookupList to the 'global' lookup list such that a refresh will try to
+ * locate the service again. This is provided primarily as an optimization for when this routine is called
+ * from refresh().
+ */
+ private void addLookupLocators(Collection<String> lookupList, boolean addToLocators) {
+ boolean isEnabled = OseeProperties.isOseeJiniForcedReggieSearchEnabled();
+ if (isEnabled) {
+
+ ClassLoader currentContext = Thread.currentThread().getContextClassLoader();
+ try{
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ if (addToLocators) locators.addAll(lookupList);
+
+ Thread thread = new LookupList(lookupList);
+ thread.setContextClassLoader(ExportClassLoader.getInstance());
+ thread.start();
+ } finally{
+ Thread.currentThread().setContextClassLoader(currentContext);
+ }
+ }
+ }
+
+ public void addLookupLocators(Collection<String> lookupList) {
+ addLookupLocators(lookupList, true);
+ }
+
+ public void addLookupLocators(String[] lookups) {
+ if (lookups == null) {
+ throw new IllegalArgumentException("lookups should not be null");
+ }
+ addLookupLocators(Arrays.asList(lookups), true);
+ }
+
+ public void terminate() {
+ lookupDiscoveryManager.terminate();
+ serviceDiscoveryManager.terminate();
+ }
+
+ public void refresh() {
+ lookupDiscoveryManager.removeDiscoveryListener(this);
+ // lookupCache.removeListener(this);
+ serviceItemList.clear();
+ serviceRegistrars.clear();
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieRemoved(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+
+ registerWithJINI();
+ try {
+ resetLookupCaches();
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+
+ addLookupLocators(locators, false);
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventListener.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventListener.java
new file mode 100644
index 00000000000..6827170b8bc
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventListener.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.framework.jini.event;
+
+import java.util.EventListener;
+
+public interface IRemoteEventListener extends EventListener {
+
+ public void notify(String event);
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventService.java
new file mode 100644
index 00000000000..5be5ce63660
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/IRemoteEventService.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.framework.jini.event;
+
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+
+public interface IRemoteEventService extends IService {
+
+ // public void publish(String event) throws RemoteException;
+ // public void subscribe(EventType eventKey, IOseeRemoteSubscriber subscriber) throws RemoteException;
+ // public void unsubscribe(EventType eventKey, IOseeRemoteSubscriber subscriber) throws RemoteException;
+ // public OseeLease getLease(IOseeRemoteSubscriber remoteInstance, long duration) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventHandler.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventHandler.java
new file mode 100644
index 00000000000..ff365f40990
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventHandler.java
@@ -0,0 +1,496 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.event;
+
+import java.rmi.RemoteException;
+import net.jini.core.lookup.ServiceItem;
+import org.eclipse.osee.framework.jini.discovery.IServiceLookupListener;
+import org.eclipse.osee.framework.jini.event.old.IOseeRemoteSubscriber;
+
+/**
+ * Singleton class which provides an interface for all OSEE Remote Events to the event service.
+ *
+ * @author David Diepenbrock
+ */
+public class RemoteEventHandler implements IServiceLookupListener, IOseeRemoteSubscriber {
+
+ public void serviceAdded(ServiceItem serviceItem) {
+ }
+
+ public void serviceChanged(ServiceItem serviceItem) {
+ }
+
+ public void serviceRemoved(ServiceItem serviceItem) {
+ }
+
+ public boolean receiveEventType(String event) throws RemoteException {
+ return false;
+ }
+
+ public boolean receiveEventGuid(String event) throws RemoteException {
+ return false;
+ }
+
+ // /*
+ // * Reference to the singleton instance
+ // */
+ // private static RemoteEventHandler handler;
+ // /*
+ // * GUID to identify this entity as a publisher
+ // */
+ // private static final String handlerGUID = GUID.generateGuidStr();
+ // /*
+ // * The number of previous sequence numbers to maintain, per publisher, in order to identify
+ // * duplications. If duplicate events are being received, this number may need to be tuned.
+ // */
+ // private static final int SEQ_NUM_COUNT = 25;
+ //
+ // private HashCollectionPlusMap<EventType, IRemoteEventListener, String, FixedSizePriorityQueue<Long>> eventData;
+ // private Map<String, Long> sequenceNumberMap;
+ // private List<IRemoteEventService> eventServices;
+ // private IOseeRemoteSubscriber thisRemoteReference;
+ // private ThreadPoolExecutor notificationThreadPool;
+ // private OseeLeaseRenewer leaseRenewer;
+ // private Map<ServiceID, OseeLease> leaseMap;
+ //
+ // private RemoteEventHandler(boolean inEclipse) {
+ // /*
+ // * Using a HashSet will enforce that there will not be duplicate entries Create it using a
+ // * synchronized map & collection since we'll have multiple threads operating on the data.
+ // */
+ // eventData = new HashCollectionPlusMap<EventType, IRemoteEventListener, String, FixedSizePriorityQueue<Long>>(true,
+ // HashSet.class);
+ //
+ // // Maintain a list of the remote eventServices
+ // eventServices = Collections.synchronizedList(new ArrayList<IRemoteEventService>());
+ //
+ // // A list of sequence numbers used for sending events
+ // sequenceNumberMap = Collections.synchronizedMap(new HashMap<String, Long>());
+ //
+ // // Creates a pool with 1 thread always ready, and will start as many new threads as needed.
+ // // These new threads will live for 5 minutes after they have become idle before dying.
+ // notificationThreadPool = new ThreadPoolExecutor(5, Integer.MAX_VALUE, 5 * 60, TimeUnit.SECONDS,
+ // new SynchronousQueue<Runnable>());
+ // notificationThreadPool.prestartAllCoreThreads();
+ //
+ // leaseRenewer = new OseeLeaseRenewer();
+ // leaseMap = Collections.synchronizedMap(new HashMap<ServiceID, OseeLease>());
+ //
+ // // Startup the class server if it isn't already running - ensures that the codebase is set
+ // try {
+ // JiniClassServer.getInstance();
+ // }
+ // catch (Exception ex) {
+ // ex.printStackTrace();
+ // }
+ //
+ // // This should be the last line in the constructor
+ // if (inEclipse)
+ // ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).addListener(this,
+ // IRemoteEventService.class);
+ // else
+ // ServiceDataStore.getNonEclipseInstance().addListener(this, IRemoteEventService.class);
+ // }
+ //
+ // /**
+ // * Obtain the instance (singleton) of this class.
+ // *
+ // * @param inEclipse Used to indicate if the request is originating from within Eclipse, or an
+ // * outside program. Note that only one instance of this class is stored, subsequent
+ // * calls return the existing instance, thus ignoring this value.
+ // * @return Return remote event handler reference.
+ // */
+ // public static RemoteEventHandler getInstance(boolean inEclipse) {
+ // if (handler == null)
+ // handler = new RemoteEventHandler(inEclipse);
+ // return handler;
+ // }
+ //
+ // /**
+ // * Same as {@link RemoteEventHandler#getInstance(boolean)}, assumes true.
+ // */
+ // public static RemoteEventHandler getInstance() {
+ // return getInstance(true);
+ // }
+ //
+ // private IOseeRemoteSubscriber getThisRemoteReference() throws ExportException {
+ // if (thisRemoteReference == null)
+ // thisRemoteReference = (IOseeRemoteSubscriber) OseeJini.getRemoteReference(this);
+ // return thisRemoteReference;
+ // }
+ //
+ // /**
+ // * Attempts to send the eventInstance to all available event services.
+ // *
+ // * @param eventInstance The event instance to send.
+ // * @return True iff at least one event service received the event
+ // */
+ // public boolean sendEvent(String eventInstance) {
+ //
+ // boolean success = false;
+ // synchronized (eventServices) {
+ // for (IRemoteEventService eventService : eventServices) {
+ // try {
+ // eventService.publish(eventInstance);
+ // success = true;
+ // }
+ // catch (RemoteException ex) {
+ // ex.printStackTrace();
+ // // Most likely an error here is caused by a service which has shut down
+ // // but the ServiceDataStore has not notified us of its removal yet.
+ // // In those cases, there's nothing we can do, the boolean return is indication
+ // // enough of these errors.
+ // }
+ // }
+ // }
+ // return success;
+ // }
+ //
+ // // private long getNextSequenceNumber(String eventType) {
+ // // long seqNum;
+ // // synchronized (sequenceNumberMap) {
+ // // Long previousSequenceNumber = sequenceNumberMap.get(eventType);
+ // //
+ // // if (previousSequenceNumber == null)
+ // // seqNum = 1;
+ // // else
+ // // seqNum = previousSequenceNumber.longValue() + 1;
+ // //
+ // // sequenceNumberMap.put(eventType, new Long(seqNum));
+ // // }
+ // // return seqNum;
+ // // }
+ //
+ // /**
+ // * Receive events because we're subscribed to the eventType
+ // *
+ // * @param event The event that occurred
+ // * @return false iff the eventType should no longer be sent to this
+ // * @throws RemoteException
+ // */
+ // public boolean receiveEventType(String event) throws RemoteException {
+ // // Serializable eventIdentifier = event.eventData.getEventType();
+ // EventType eventType = Event.getEventTypeFromEvent(event);
+ // Collection<IRemoteEventListener> typeListeners = eventData.getValues(eventType);
+ // // If there are no listeners, then the server shouldn't be sending us the events!
+ // // if (typeListeners == null) {
+ // // return false;
+ // // }
+ // // else {
+ // notificationThreadPool.execute(new ListenerNotifier(event, eventType, typeListeners));
+ // System.out.println("Received Event Type " + event);
+ // // }
+ // return true;
+ // }
+ //
+ // /**
+ // * Receive events because we're subscribed to the eventGuid
+ // *
+ // * @param event The event that occurred
+ // * @return false iff the eventGUID should no longer be sent to this
+ // * @throws RemoteException
+ // */
+ // public boolean receiveEventGuid(String event) throws RemoteException {
+ // // Serializable eventIdentifier = event.eventData.getEventGuid();
+ // // Collection<IOseeRemoteEventListener> guidListeners = eventData.getValues(eventIdentifier);
+ // // // If there are no listeners, then the server shouldn't be sending us the events!
+ // // if (guidListeners == null) {
+ // // return false;
+ // // }
+ // // else {
+ // // notificationThreadPool.execute(new ListenerNotifier(event, eventIdentifier,
+ // // guidListeners));
+ // // }
+ // return true;
+ // }
+ //
+ // private class ListenerNotifier implements Runnable {
+ //
+ // private Collection<IRemoteEventListener> listeners;
+ // private String event;
+ // private final EventType eventType;
+ //
+ // public ListenerNotifier(String event, EventType eventType, Collection<IRemoteEventListener> listeners) {
+ // this.event = event;
+ // this.eventType = eventType;
+ // this.listeners = listeners;
+ // }
+ //
+ // public void run() {
+ // /*
+ // * We maintain a collection of the last SEQ_NUM_COUNT sequence numbers for a given
+ // * publisher. If the received event's sequence number is in that collection, then we will
+ // * ignore this event. Otherwise, add this sequence number to the collection. Note that by
+ // * adding this number, the *smallest* (not the oldest) of the currently existing numbers
+ // * will be removed if the list is already full. The use of the FixedSizePriorityQueue
+ // * performs this removal.
+ // */
+ // // boolean isNewSeqNum = false;
+ // // Map<String, FixedSizePriorityQueue<Long>> seqNumMap =
+ // // eventData.getPlusObject(eventIdentifier);
+ // // if (seqNumMap != null) {
+ // // synchronized (seqNumMap) {
+ // // FixedSizePriorityQueue<Long> prevSeqNums = seqNumMap.get(event.publisherGUID);
+ // //
+ // // if (prevSeqNums == null) {
+ // // // If we had no data about the publisher for this event
+ // // seqNumMap.put(event, new FixedSizePriorityQueue<Long>(SEQ_NUM_COUNT, new Long(
+ // // event.sequenceNumber)));
+ // // isNewSeqNum = true;
+ // // }
+ // // else if (!prevSeqNums.contains(new Long(event.sequenceNumber))) {
+ // // prevSeqNums.add(new Long(event.sequenceNumber));
+ // // isNewSeqNum = true;
+ // // }
+ // //
+ // // }
+ // // }
+ // //
+ // // if (isNewSeqNum) {
+ // synchronized (listeners) {
+ // for (IRemoteEventListener listener : listeners) {
+ // listener.notify(event);
+ // }
+ // // }
+ // }
+ //
+ // }
+ // }
+ //
+ // /**
+ // * Subscribes the provided listener to a particular type of event described by the eventType.
+ // *
+ // * @return true iff subscription to at least one currently active event service was successful.
+ // * Note that future event services may come on line, and we will automatically subscribe
+ // * any previous subscriptions to these new services, so a return value of false does not
+ // * necessarily mean that the listener will never be called. Unsubscribe should be called
+ // * to cleanup the listener regardless of this return value.
+ // */
+ // // public boolean subscribe(IOseeRemoteEventListener listener, String eventType) {
+ // //
+ // // return subscribe(listener, eventType.getCanonicalName());
+ // // }
+ // /**
+ // * Subscribes the provided listener to a particular event denoted by the eventGuid.
+ // *
+ // * @return true iff subscription to at least one currently active event service was successful.
+ // * Note that future event services may come on line, and we will automatically subscribe
+ // * any previous subscriptions to these new services, so a return value of false does not
+ // * necessarily mean that the listener will never be called. Unsubscribe should be called
+ // * to cleanup the listener regardless of this return value.
+ // */
+ // // public boolean subscribe(IOseeRemoteEventListener listener, GUID eventGuid) {
+ // // /*
+ // // * Because the server is setup to match the event type and the event GUID of every incoming
+ // // * event to the subscriber's event key, we can use the same manner of notifying the server of
+ // // * our desire to subscribe.
+ // // */
+ // // return subscribe(listener, (Serializable) eventGuid);
+ // // }
+ // /**
+ // * Subscribes the provided listener to a particular event or type
+ // *
+ // * @return true iff subscription to at least one currently active event service was successful.
+ // * Note that future event services may come on line, and we will automatically subscribe
+ // * any previous subscriptions to these new services, so a return value of false does not
+ // * necessarily mean that the listener will never be called. Unsubscribe should be called
+ // * to cleanup the listener regardless of this return value.
+ // */
+ // public boolean subscribe(IRemoteEventListener listener, EventType event) {
+ // // We only need to register the eventType with the eventService(s) if no other listeners for
+ // // that type already exist. Listeners will only be added to the hash if they have successfully
+ // // been registered with at least one eventService.
+ // boolean success = true;
+ //
+ // Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+ //
+ // if (!eventData.containsKey(event)) {
+ // success = false;
+ // synchronized (eventServices) {
+ // for (IRemoteEventService eventService : eventServices) {
+ // try {
+ // eventService.subscribe(event, getThisRemoteReference());
+ // success = true;
+ // // If we get here, then we succeeded in registering with at least one service
+ // }
+ // catch (RemoteException ex) {
+ // // Most likely an error here is caused by a service which has shut down
+ // // but the ServiceDataStore has not notified us of its removal yet.
+ // // In those cases, there's nothing we can do, the boolean return is indication
+ // // enough of these errors.
+ // }
+ // }
+ // }
+ // }
+ // eventData.put(event, listener);
+ //
+ // return success;
+ // }
+ //
+ // /**
+ // * Unsubscribes the provided listener to a particular type of event described by the eventType. // *
+ // *
+ // * @return true iff unsubscription was successful. If the listener was not subscribed, or if for // *
+ // * any reason unsubscription was not successful, false will be returned. //
+ // */
+ // // public boolean unsubscribe(IOseeRemoteEventListener listener, Class eventType) {
+ // // return unsubscribe(listener, (Serializable)eventType);
+ // // }
+ // //
+ // // /**
+ // // * Unsubscribes the provided listener to a particular event denoted by the eventGuid.
+ // // *
+ // // * @return true iff unsubscription was successful. If the listener was not subscribed, or if
+ // // for
+ // // * any reason unsubscription was not successful, false will be returned.
+ // // */
+ // // public boolean unsubscribe(IOseeRemoteEventListener listener, GUID eventGuid) {
+ // // return unsubscribe(listener, (Serializable)eventGuid);
+ // // }
+ // /**
+ // * Unsubscribes the provided listener from the given event
+ // *
+ // * @return true iff unsubscription was successful. If the listener was not subscribed, or if for
+ // * any reason unsubscription was not successful, false will be returned.
+ // */
+ // public boolean unsubscribe(IRemoteEventListener listener, EventType event) {
+ // // We only want to unregister the event with the eventService(s) if no other listeners for
+ // // that type exist. Listeners will be removed from the hash regardless of the successfullness
+ // // of the unregistration attempt.
+ //
+ // boolean success = eventData.removeValue(event, listener);
+ // if (success && !eventData.containsKey(event)) {
+ // success = unsubscribe(event);
+ // }
+ //
+ // return success;
+ // }
+ //
+ // /**
+ // * Attempt to unsubscribe the eventType from all current eventServices.
+ // *
+ // * @return true iff unsubscribe was successfull for at least one eventService.
+ // */
+ // private boolean unsubscribe(EventType eventType) {
+ // boolean success = false;
+ // synchronized (eventServices) {
+ // for (IRemoteEventService eventService : eventServices) {
+ // try {
+ // eventService.unsubscribe(eventType, getThisRemoteReference());
+ // success = true;
+ // }
+ // catch (RemoteException ex) {
+ // // Most likely an error here is caused by a service which has shut down
+ // // but the ServiceDataStore has not notified us of its removal yet.
+ // // In those cases, there's nothing we can do, the boolean return is indication
+ // // enough of these errors.
+ // }
+ // }
+ // }
+ // return success;
+ // }
+ //
+ // /**
+ // * This should be called before the JVM shuts down so that we can inform the event services that
+ // * we are going away.
+ // */
+ // public void onDispose() {
+ // ServiceDataStore.getNonEclipseInstance().removeListener(this);
+ // synchronized (leaseMap) {
+ // Set<Entry<ServiceID, OseeLease>> set = leaseMap.entrySet();
+ // Iterator<Entry<ServiceID, OseeLease>> iter = set.iterator();
+ // while (iter.hasNext()) {
+ // Entry<ServiceID, OseeLease> entry = iter.next();
+ //
+ // leaseRenewer.cancelRenewal(entry.getValue()); // Cancel the renewal attempts
+ // try {
+ // entry.getValue().cancel(); // Cancel the lease
+ // }
+ // catch (UnknownLeaseException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (RemoteException ex) {
+ // ex.printStackTrace();
+ // }
+ //
+ // iter.remove();
+ // }
+ // }
+ // }
+ //
+ // /*
+ // * (non-Javadoc)
+ // *
+ // * @see org.eclipse.osee.framework.jini.discovery.IServiceLookupListener#serviceAdded(net.jini.core.lookup.ServiceItem)
+ // */
+ // public void serviceAdded(ServiceItem serviceItem) {
+ // try {
+ // IRemoteEventService eventService = (IRemoteEventService) serviceItem.service;
+ // eventServices.add(eventService);
+ //
+ // OseeLease lease = eventService.getLease(getThisRemoteReference(), Lease.FOREVER);
+ // leaseMap.put(serviceItem.serviceID, lease);
+ // leaseRenewer.startRenewal(lease);
+ //
+ // synchronized (eventData) {
+ // // Set<Serializable> eventTypes = eventData.keySet();
+ // // for (Serializable eventType : eventTypes) {
+ // // eventService.subscribe(eventType, getThisRemoteReference());
+ // // }
+ // }
+ // }
+ // catch (ClassCastException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (ConnectException ex) {
+ // }
+ // catch (RemoteException ex) {
+ // ex.printStackTrace();
+ // }
+ // }
+ //
+ // /*
+ // * (non-Javadoc)
+ // *
+ // * @see org.eclipse.osee.framework.jini.discovery.IServiceLookupListener#serviceChanged(net.jini.core.lookup.ServiceItem)
+ // */
+ // public void serviceChanged(ServiceItem serviceItem) {
+ // // We don't need to do anything for these events
+ // }
+ //
+ // /*
+ // * (non-Javadoc)
+ // *
+ // * @see org.eclipse.osee.framework.jini.discovery.IServiceLookupListener#serviceRemoved(net.jini.core.lookup.ServiceItem)
+ // */
+ // public void serviceRemoved(ServiceItem serviceItem) {
+ // try {
+ // eventServices.remove((IRemoteEventService) serviceItem.service);
+ // OseeLease lease = leaseMap.remove(serviceItem.serviceID);
+ // if (lease != null)
+ // leaseRenewer.cancelRenewal(lease);
+ // }
+ // catch (ClassCastException ex) {
+ // Class[] is = serviceItem.service.getClass().getInterfaces();
+ // for (Class i : is) {
+ // System.out.println(i);
+ // }
+ // Class[] cs = serviceItem.service.getClass().getClasses();
+ // for (Class c : cs) {
+ // System.out.println(c);
+ // }
+ //
+ // System.out.println(serviceItem.service.getClass());
+ // ex.printStackTrace();
+ // }
+ // }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventListener.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventListener.java
new file mode 100644
index 00000000000..9f463eef0da
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/RemoteEventListener.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.framework.jini.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class RemoteEventListener implements IRemoteEventListener {
+
+ public void notify(String event) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedEventListener.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedEventListener.java
new file mode 100644
index 00000000000..b30c4ac1497
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedEventListener.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.framework.jini.event.old;
+
+public class ArtifactModifiedEventListener implements IOseeRemoteEventListener {
+
+ public void notify(OseeRemoteEvent event) {
+
+ if (event.eventData.getEventType().equals(ArtifactModifiedRemoteType.class.getCanonicalName())) {
+ try {
+ // final long seqNum = event.sequenceNumber;
+ final ArtifactModifiedRemoteType data = (ArtifactModifiedRemoteType) event.eventData;
+
+ System.err.println("Received guid changed event => " + data.getChangedGuid());
+ System.err.println("Received guid changed type => " + data.getType());
+ } catch (ClassCastException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedRemoteType.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedRemoteType.java
new file mode 100644
index 00000000000..0be8a39e18b
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/ArtifactModifiedRemoteType.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.framework.jini.event.old;
+
+/**
+ * This class defines the popup event type. Any listener which desires to receive these events can establish a
+ * subscription for PopupEventType.class.getCanonicalName().
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactModifiedRemoteType extends OseeRemoteEventInstance {
+
+ private static final long serialVersionUID = 1665518299340674326L;
+ private String guid;
+ private String type;
+
+ public ArtifactModifiedRemoteType(String eventGuid, String changedGuid, String type) {
+ super(eventGuid);
+ this.guid = changedGuid;
+ this.type = type;
+ }
+
+ public String getChangedGuid() {
+ return guid;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteEventListener.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteEventListener.java
new file mode 100644
index 00000000000..7cca4585877
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteEventListener.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.framework.jini.event.old;
+
+import java.util.EventListener;
+
+public interface IOseeRemoteEventListener extends EventListener {
+
+ public void notify(OseeRemoteEvent event);
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteSubscriber.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteSubscriber.java
new file mode 100644
index 00000000000..cf64502feba
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/IOseeRemoteSubscriber.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.framework.jini.event.old;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IOseeRemoteSubscriber extends Remote {
+ /**
+ * @return false iff the event should no longer be sent to this subscriber
+ */
+ public boolean receiveEventType(String event) throws RemoteException;
+
+ /**
+ * @return false iff the event should no longer be sent to this subscriber
+ */
+ public boolean receiveEventGuid(String event) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEvent.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEvent.java
new file mode 100644
index 00000000000..6522f15c38a
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEvent.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.framework.jini.event.old;
+
+import java.io.Serializable;
+import java.rmi.MarshalledObject;
+
+public class OseeRemoteEvent implements Serializable {
+
+ public final long sequenceNumber;
+ public final OseeRemoteEventInstance eventData;
+ public final MarshalledObject handback;
+ public final String publisherGUID;
+
+ private static final long serialVersionUID = -8680199233419549125L;
+
+ public OseeRemoteEvent(OseeRemoteEventInstance eventData, long sequenceNumber, MarshalledObject handback, String publisherGUID) {
+ this.eventData = eventData;
+ this.sequenceNumber = sequenceNumber;
+ this.handback = handback;
+ this.publisherGUID = publisherGUID;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEventInstance.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEventInstance.java
new file mode 100644
index 00000000000..627447d606f
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/OseeRemoteEventInstance.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.framework.jini.event.old;
+
+import java.io.Serializable;
+
+/**
+ * This class provides all that is needed for sending RemoteEvents. It should be extended for each specific type of
+ * event.
+ * <p>
+ * Listeners can subscribe using <code>&lt;SubClass&gt;.class.getCanonicalName()</code> as the event type ID (unless
+ * the subclass overrides getEventType()).
+ *
+ * @author David Diepenbrock
+ */
+public abstract class OseeRemoteEventInstance implements Serializable {
+
+ public final String eventGuid;
+ private final Class<? extends OseeRemoteEventInstance> myClass;
+
+ public OseeRemoteEventInstance(String eventGuid) {
+ this.eventGuid = eventGuid;
+ myClass = this.getClass();
+ }
+
+ /**
+ * A serializable object which uniquely identifies this event type. Most commonly this will be the class name of the
+ * specific EventInstance class. Listeners who have registered using an eventID which evaluate true using .equals()
+ * will receive notification of this event. By default the canonical class name is used. It is not recommended for
+ * subclasses to override this method.
+ *
+ * @return a serializable object which uniquely identifies this event type.
+ */
+ public String getEventType() {
+ return myClass.getCanonicalName();
+ }
+
+ public String getEventGuid() {
+ return eventGuid;
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/PopupEventType.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/PopupEventType.java
new file mode 100644
index 00000000000..424f7316d5d
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/event/old/PopupEventType.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.framework.jini.event.old;
+
+/**
+ * This class defines the popup event type. Any listener which desires to receive these events can establish a
+ * subscription for PopupEventType.class.getCanonicalName().
+ *
+ * @author David Diepenbrock
+ */
+public class PopupEventType extends OseeRemoteEventInstance {
+
+ private static final long serialVersionUID = 8818248591835649870L;
+ private String message;
+
+ public PopupEventType(String eventGuid, String message) {
+ super(eventGuid);
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeaseGrantor.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeaseGrantor.java
new file mode 100644
index 00000000000..bc5a46f6689
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeaseGrantor.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.framework.jini.lease;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import net.jini.core.lease.Lease;
+import net.jini.core.lease.LeaseDeniedException;
+import net.jini.core.lease.UnknownLeaseException;
+
+public interface ILeaseGrantor extends Remote {
+
+ /**
+ * @param lease The existing lease
+ * @param consumer The "consumer" of the lease (as opposed to the grantor of the lease)
+ * @param duration The amount of time requested for the renewed lease
+ * @throws LeaseDeniedException If the lease is denied for any reason
+ * @throws UnknownLeaseException If the lease type is unknown
+ * @throws RemoteException
+ */
+ public void renewRequest(Lease lease, Object consumer, long duration) throws LeaseDeniedException, UnknownLeaseException, RemoteException;
+
+ /**
+ * @param lease The existing lease
+ * @param consumer The "consumer" of the lease (as opposed to the grantor of the lease)
+ * @throws UnknownLeaseException If the lease type is unknown
+ * @throws RemoteException
+ */
+ public void cancelRequest(Lease lease, Object consumer) throws UnknownLeaseException, RemoteException;
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeasee.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeasee.java
new file mode 100644
index 00000000000..aec500ed723
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/ILeasee.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.framework.jini.lease;
+
+/**
+ * This interface should be implemented by classes that use the OseeLeaseGrantor class in order to provide information
+ * about lease events.
+ *
+ * @author David Diepenbrock
+ */
+public interface ILeasee {
+
+ /**
+ * Called when a lease expires or is canceled.
+ *
+ * @param consumer The consumer of the lease
+ */
+ void onLeaseCompleted(Object consumer);
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/LeaseData.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/LeaseData.java
new file mode 100644
index 00000000000..4fc81ba93e6
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/LeaseData.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.jini.lease;
+
+public class LeaseData {
+
+ private long duration;
+ private long startTime;
+
+ public LeaseData(long duration) {
+ super();
+ this.duration = duration;
+ setStartTime();
+ }
+
+ /* package */void setDuration(long duration) {
+ this.duration = duration;
+ }
+
+ /* package */void setStartTime() {
+ this.startTime = (System.currentTimeMillis());
+ }
+
+ public long getDuration() {
+ return duration;
+ }
+
+ public long getStartTime() {
+ return startTime;
+ }
+
+ public boolean isExpired() {
+ return System.currentTimeMillis() > startTime + duration;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLease.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLease.java
new file mode 100644
index 00000000000..895683e2a6c
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLease.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.framework.jini.lease;
+
+import java.io.Serializable;
+import java.rmi.RemoteException;
+import java.util.Date;
+import net.jini.core.lease.Lease;
+import net.jini.core.lease.LeaseDeniedException;
+import net.jini.core.lease.LeaseMap;
+import net.jini.core.lease.UnknownLeaseException;
+
+public class OseeLease implements Lease, Serializable {
+
+ private static final long serialVersionUID = -2821773288662499183L;
+
+ private ILeaseGrantor leaseManager;
+ private Object myConsumer;
+
+ private int serialFormat = Lease.DURATION;
+ private long duration;
+ private long startTime;
+
+ public OseeLease(ILeaseGrantor manager, Object consumer, long duration) {
+ super();
+ this.myConsumer = consumer;
+ this.duration = duration;
+ leaseManager = manager;
+ }
+
+ public long getExpiration() {
+ return duration + startTime;
+ }
+
+ public void cancel() throws UnknownLeaseException, RemoteException {
+ leaseManager.cancelRequest(this, myConsumer);
+ }
+
+ /**
+ * Requests that the lease be renewed.
+ */
+ public void renew(long durationFromNow) throws LeaseDeniedException, UnknownLeaseException, RemoteException {
+ System.out.println("Requesting Lease Renewal: @" + new Date());
+ leaseManager.renewRequest(this, myConsumer, duration);
+ resetStartTime();
+ }
+
+ /* package */void setDuration(long duration) {
+ this.duration = duration;
+ }
+
+ /* package */void resetStartTime() {
+ startTime = System.currentTimeMillis();
+ }
+
+ public void setSerialFormat(int leaseFormat) {
+ if (leaseFormat == Lease.DURATION)
+ serialFormat = Lease.DURATION;
+ else if (leaseFormat == Lease.ABSOLUTE)
+ serialFormat = Lease.ABSOLUTE;
+ else
+ assert false : leaseFormat;
+ }
+
+ public int getSerialFormat() {
+ return serialFormat;
+ }
+
+ public LeaseMap createLeaseMap(long duration) {
+ return null;
+ }
+
+ public boolean canBatch(Lease lease) {
+ return false;
+ }
+
+ public long getDuration() {
+ return duration;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseGrantor.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseGrantor.java
new file mode 100644
index 00000000000..f1218f46851
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseGrantor.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.lease;
+
+import java.lang.ref.WeakReference;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.Map.Entry;
+import net.jini.core.lease.Lease;
+import net.jini.core.lease.LeaseDeniedException;
+import net.jini.core.lease.UnknownLeaseException;
+import org.eclipse.osee.framework.jini.util.OseeJini;
+
+/**
+ * This class manages tasks associated with being a lease grantor. It generates leases, handles renewal & cancelation of
+ * the leases, and checks the existing leases to determine if any have expired. Provides a callback by way of the
+ * ILeasee interface to the leasing service to notify it when a lease is canceled or expired.
+ *
+ * @author David Diepenbrock
+ */
+public class OseeLeaseGrantor implements ILeaseGrantor {
+
+ public static final long maxDuration = 10 * 60 * 1000; /* 10 minutes */
+ public static final long minDuration = 2 * 60 * 1000; /* 2 minutes */
+ private ILeaseGrantor thisRemoteReference;
+ private Map<Object, LeaseData> leaseStore;
+ private WeakReference<ILeasee> leasee;
+ private LeaseChecker leaseChecker;
+ private Timer myTimer;
+ private boolean cancelTimer;
+
+ /**
+ * Use of this constructor will generate a new timer thread for lease checks
+ *
+ * @param leasee The "parent" object to be notified when a lease expires or is canceled.
+ */
+ public OseeLeaseGrantor(ILeasee leasee) {
+ this(leasee, new Timer());
+ // debug = new Debug(false, true, this.getClass().getName());
+ cancelTimer = true; // We will need to cancel the timer on shutdown.
+ }
+
+ /**
+ * @param leasee The "parent" object to be notified when a lease expires or is canceled
+ * @param timer An existing Timer thread to schedule lease checks
+ */
+ public OseeLeaseGrantor(ILeasee leasee, Timer timer) {
+ this.leasee = new WeakReference<ILeasee>(leasee);
+ myTimer = timer;
+ cancelTimer = false; // If a timer was provided we don't need to cancel it on shutdown
+ leaseStore = Collections.synchronizedMap(new HashMap<Object, LeaseData>());
+
+ try {
+ thisRemoteReference = (ILeaseGrantor) OseeJini.getRemoteReference(this);
+ } catch (ExportException ex) {
+ ex.printStackTrace();
+ }
+
+ long leaseCheckFrequency = minDuration / 2;
+ leaseChecker = new LeaseChecker();
+ timer.schedule(leaseChecker, leaseCheckFrequency, leaseCheckFrequency);
+ }
+
+ /**
+ * Call this to notify the grantor that we are shutting down. We need to clean up the task for checking the leases.
+ */
+ public void shutdown() {
+ leaseChecker.cancel();
+ if (cancelTimer) myTimer.cancel();
+ }
+
+ /**
+ * Returns a new lease
+ *
+ * @param consumer
+ * @param duration
+ * @return Return lease reference.
+ * @throws LeaseDeniedException
+ * @throws ExportException
+ */
+ public OseeLease newLease(Object consumer, long duration) throws LeaseDeniedException, ExportException {
+ // debug.report("New Lease:" + consumer + " @" + new Date());
+ long actualDuration = checkDuration(duration);
+ OseeLease lease = new OseeLease(thisRemoteReference, consumer, actualDuration);
+ leaseStore.put(consumer, new LeaseData(actualDuration));
+ return lease;
+ }
+
+ /**
+ * Note that the consumer must reset their start timer on the lease. The Grantor cannot set the time since the system
+ * clocks may differ.
+ *
+ * @see org.eclipse.osee.framework.jini.lease.ILeaseGrantor#renewRequest
+ */
+ public void renewRequest(Lease lease, Object consumer, long duration) throws LeaseDeniedException, UnknownLeaseException, RemoteException {
+
+ // debug.report("Lease renewRequest: " + consumer + " @" + new Date());
+
+ synchronized (leaseStore) {
+ LeaseData leaseData = leaseStore.get(consumer);
+ if (leaseData == null) throw new LeaseDeniedException("Consumer does not currently hold a lease");
+
+ if (lease instanceof OseeLease) {
+ long actualDuration = checkDuration(duration);
+ leaseData.setDuration(actualDuration);
+ leaseData.setStartTime();
+ ((OseeLease) lease).setDuration(actualDuration);
+ } else
+ throw new UnknownLeaseException("Unknown Lease Type");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.lease.ILeaseGrantor#cancelRequest(net.jini.core.lease.Lease,
+ * null)
+ */
+ public void cancelRequest(Lease lease, Object consumer) throws UnknownLeaseException, RemoteException {
+ // debug.report("Lease cancelRequest: " + consumer + " @" + new Date());
+ if (leaseStore.remove(consumer) != null) {
+ leasee.get().onLeaseCompleted(consumer);
+ }
+ }
+
+ public boolean isLeaseExpired(Object consumer) {
+ LeaseData leaseData = leaseStore.get(consumer);
+ if (leaseData != null) return leaseData.isExpired();
+
+ return true;
+ }
+
+ private long checkDuration(long duration) throws LeaseDeniedException {
+ long actualDuration;
+ if (duration > maxDuration)
+ actualDuration = maxDuration;
+ else if (duration >= minDuration)
+ actualDuration = duration;
+ else if (duration == Lease.ANY)
+ actualDuration = maxDuration;
+ else
+ throw new LeaseDeniedException("Duration too short - must be at least " + minDuration + " milliseconds.");
+
+ return actualDuration;
+ }
+
+ private class LeaseChecker extends TimerTask {
+
+ public void run() {
+ synchronized (leaseStore) {
+ Set<Entry<Object, LeaseData>> set = leaseStore.entrySet();
+ Iterator<Entry<Object, LeaseData>> iter = set.iterator();
+ while (iter.hasNext()) {
+ Entry<Object, LeaseData> entry = iter.next();
+ if (entry.getValue().isExpired()) {
+ leasee.get().onLeaseCompleted(entry.getKey());
+ iter.remove();
+ }
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseRenewer.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseRenewer.java
new file mode 100644
index 00000000000..6a916f1328b
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/lease/OseeLeaseRenewer.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.lease;
+
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.jini.core.lease.Lease;
+import net.jini.core.lease.LeaseDeniedException;
+import net.jini.core.lease.UnknownLeaseException;
+import org.eclipse.osee.framework.jini.JiniPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * This class handles the renewal of leases. It is designed such that a lease will be renewed a set amount of time prior
+ * to expiration, and handles retrying in cases where the renewal fails. Leases are renewed for the maximum amount of
+ * time the lease will allow. Retries are be scheduled for half of the remaining lease time. For example, if the first
+ * attempt to renew occurs with 2 minutes left, the first retry will occur with 1 minute, then 30 seconds, until
+ * STOP_RETRY_TIME is reached.
+ *
+ * @author David Diepenbrock
+ */
+public class OseeLeaseRenewer {
+
+ private Timer timer;
+ private Map<OseeLease, Renewer> map;
+ private final Logger logger = Logger.getLogger(OseeLeaseRenewer.class.getName());
+
+ /**
+ * 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 = 2 * 60 * 1000; // 2 minutes
+ /**
+ * When less than this amount of time is remaining in a lease, failed renewal attempts will not be retried. This time
+ * is specified in milliseconds.
+ */
+ private static final long STOP_RETRY_TIME = 250; // 250 ms
+
+ public OseeLeaseRenewer() {
+ // debug = new Debug(false, true, this.getClass().getName());
+ map = new HashMap<OseeLease, Renewer>(4);
+ }
+
+ /**
+ * Attempts to maintain a lease until cancelRenewal is called
+ *
+ * @param lease
+ */
+ public synchronized void startRenewal(OseeLease lease) {
+ if (timer == null) timer = new Timer(true);
+
+ lease.resetStartTime();
+ Renewer renewer = new Renewer(lease);
+ map.put(lease, renewer);
+
+ // Pick the larger duration - RENEWAL_TIME before the expiration, or half of the total lease
+ // time.
+ long duration = Math.max(lease.getDuration() / 2, lease.getDuration() - RENEWAL_TIME);
+ timer.schedule(renewer, duration, duration);
+ }
+
+ /**
+ * Prevents the lease from being renewed. This does not cancel the lease, only the renewal attempts.
+ *
+ * @param lease
+ */
+ public synchronized void cancelRenewal(OseeLease lease) {
+ Renewer renewer = map.remove(lease);
+ if (renewer != null)
+ renewer.cancel();
+ else
+ OseeLog.log(JiniPlugin.class, Level.WARNING,
+ this.getClass().getName() + ": Lease Cancel Attempt: Lease Not Found!");
+
+ if (map.isEmpty()) {
+ timer.cancel();
+ timer = null;
+ }
+ }
+
+ private class Renewer extends TimerTask {
+
+ private OseeLease lease;
+
+ public Renewer(OseeLease lease) {
+ super();
+ this.lease = lease;
+ }
+
+ public void run() {
+ try {
+ // Obtain the longest lease allowed
+ lease.renew(Lease.FOREVER);
+ } catch (LeaseDeniedException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex.getMessage(), ex);
+ } catch (UnknownLeaseException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, ex.getMessage(), ex);
+ }
+ /*
+ * If there was a problem with the lease renewal, retry up until there is less than 250 ms
+ * remaining in the lease, at which point we can give up hope. Assuming leases are renewed
+ * with 2 minutes remaining & 250 ms for STOP_RETRY_TIME, this will provide 8 attempts.
+ */
+ catch (RemoteException ex) {
+ long remainingTime = lease.getExpiration() - System.currentTimeMillis();
+ if (remainingTime > STOP_RETRY_TIME)
+ timer.schedule(new Renewer(lease), remainingTime / 2);
+ else {
+ // debug.report("Canceling Renewals Retries");
+ cancelRenewal(lease);
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "Unable to renew lease.", ex);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/FormmatedEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/FormmatedEntry.java
new file mode 100644
index 00000000000..f1e26f497d6
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/FormmatedEntry.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.framework.jini.service.core;
+
+import net.jini.entry.AbstractEntry;
+
+public abstract class FormmatedEntry extends AbstractEntry {
+
+ public abstract String getFormmatedString();
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/GroupEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/GroupEntry.java
new file mode 100644
index 00000000000..3f594eb9e4c
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/GroupEntry.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.framework.jini.service.core;
+
+public class GroupEntry extends FormmatedEntry {
+
+ private static final long serialVersionUID = 132189087526085874L;
+ public String[] group;
+
+ public GroupEntry() {
+ group = new String[] {"Public"};
+ }
+
+ public String getFormmatedString() {
+ String groups = "";
+ if (group != null) {
+ for (int index = 0; index < group.length; index++) {
+ groups += group[index];
+ if (index + 1 < group.length) {
+ groups += ",";
+ }
+ }
+ } else {
+ groups = "NULL";
+ }
+ return "Group(s): {" + groups + "}";
+ }
+
+ public boolean equals(Object other) {
+ if (!(other instanceof GroupEntry)) return false;
+ return group.equals(((GroupEntry) other).group);
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/HostEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/HostEntry.java
new file mode 100644
index 00000000000..60f1bedf009
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/HostEntry.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.framework.jini.service.core;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class HostEntry extends FormmatedEntry {
+
+ private static final long serialVersionUID = -2965321047363718068L;
+
+ public String host;
+
+ public HostEntry() {
+
+ try {
+ host = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException ex) {
+ host = "Error Obtaining Host";
+ ex.printStackTrace();
+ }
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public String getFormmatedString() {
+ return "Host : " + host;
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniJoinManager.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniJoinManager.java
new file mode 100644
index 00000000000..3bbc2b54678
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniJoinManager.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.framework.jini.service.core;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+import net.jini.core.entry.Entry;
+import net.jini.core.lease.Lease;
+import net.jini.core.lease.LeaseDeniedException;
+import net.jini.core.lease.UnknownLeaseException;
+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 org.eclipse.osee.framework.jini.discovery.IRegistrarListener;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+import org.eclipse.osee.framework.jini.util.OseeJini;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class JiniJoinManager implements IRegistrarListener {
+
+ /**
+ * 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 = 2 * 60 * 1000; // 2 minutes
+
+ // private HashMap<ServiceID, ServiceRegistrar> idToReggie;
+ private HashMap<ServiceID, ServiceRegistrar> idToReggie;
+ // private ArrayList<ServiceRegistration> registrations;
+ private ArrayList<ServiceRegistration> registrations;
+ private Timer renewTimer;
+ private final Remote proxy;
+ private Entry[] entry;
+ private ServiceID serviceID;
+ private ServiceDataStore serviceDataStore;
+
+ public JiniJoinManager(ServiceID serviceID, JiniService js, Entry[] entry) throws IOException {
+ proxy = OseeJini.getRemoteReference(js);
+ this.entry = entry;
+ this.serviceID = serviceID;
+ registrations = new ArrayList<ServiceRegistration>();
+ idToReggie = new HashMap<ServiceID, ServiceRegistrar>();
+ renewTimer = new Timer();
+ serviceDataStore = ServiceDataStore.getNonEclipseInstance();
+ serviceDataStore.addListener(this);
+ }
+
+ public JiniJoinManager(ServiceID serviceID, IService service, Entry[] entry) throws IOException {
+ proxy = service;
+ this.entry = entry;
+ this.serviceID = serviceID;
+ registrations = new ArrayList<ServiceRegistration>();
+ idToReggie = new HashMap<ServiceID, ServiceRegistrar>();
+ renewTimer = new Timer();
+ serviceDataStore = ServiceDataStore.getNonEclipseInstance();
+ serviceDataStore.addListener(this);
+ }
+
+ public void terminate() throws UnknownLeaseException, RemoteException {
+ renewTimer.cancel();
+ for (int i = 0; i < registrations.size(); i++) {
+ ServiceRegistration registration = registrations.get(i);
+ try {
+ registration.getLease().cancel();
+ } catch (UnknownLeaseException ex) {
+
+ }
+ }
+ }
+
+ public void setAttributes(Entry[] entry) {
+ for (int i = 0; i < registrations.size(); i++) {
+ ServiceRegistration registration = registrations.get(i);
+ try {
+ registration.setAttributes(entry);
+ } catch (UnknownLeaseException ex) {
+ registrations.remove(i);
+ i--;
+ // ex.printStackTrace();
+ } catch (RemoteException ex) {
+ registrations.remove(i);
+ i--;
+ // ex.printStackTrace();
+ }
+ }
+ }
+
+ private class RenewLease extends TimerTask {
+ ServiceRegistration registration;
+
+ public RenewLease(ServiceRegistration registration) {
+ this.registration = registration;
+ }
+
+ public void run() {
+ try {
+ // Renew for the maximum amount of time allowed
+ registration.getLease().renew(Lease.FOREVER);
+ renewTimer.schedule(new RenewLease(registration),
+ registration.getLease().getExpiration() - System.currentTimeMillis() - RENEWAL_TIME);
+ } catch (LeaseDeniedException ex) {
+ // ex.printStackTrace();
+ } catch (UnknownLeaseException ex) {
+ // ex.printStackTrace();
+ } catch (RemoteException ex) {
+ // ex.printStackTrace();
+ }
+ // finally{
+ // renewTimer.schedule(new RenewLease(registration), registration.getLease().getExpiration() - System.currentTimeMillis() - RENEWAL_TIME);
+ // }
+ }
+
+ }
+
+ public void addGroup(String... groups) throws IOException {
+ serviceDataStore.addGroup(groups);
+ }
+
+ public String[] getGroups() {
+ return serviceDataStore.getGroups();
+ }
+
+ public void reggieAdded(List<ServiceRegistrar> serviceRegistrars) {
+ ServiceRegistrar[] reggies =
+ (ServiceRegistrar[]) serviceRegistrars.toArray(new ServiceRegistrar[serviceRegistrars.size()]);
+ try {
+ for (int i = 0; i < reggies.length; i++) {
+ ServiceRegistration registration;
+ registration = reggies[i].register(new ServiceItem(serviceID, proxy, entry), Long.MAX_VALUE);
+ idToReggie.put(reggies[i].getServiceID(), reggies[i]);
+ registrations.add(registration);
+ renewTimer.schedule(new RenewLease(registration),
+ registration.getLease().getExpiration() - System.currentTimeMillis() - RENEWAL_TIME);
+ }
+ } catch (ExportException ex) {
+ ex.printStackTrace();
+ } catch (RemoteException ex) {
+ ex.printStackTrace();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+
+ public void reggieRemoved(List<ServiceRegistrar> serviceRegistrars) {
+ ServiceRegistrar[] reggies =
+ (ServiceRegistrar[]) serviceRegistrars.toArray(new ServiceRegistrar[serviceRegistrars.size()]);
+ for (int i = 0; i < reggies.length; i++) {
+ idToReggie.remove(reggies[i].getServiceID());
+ }
+ }
+
+ public void reggieChanged(List<ServiceRegistrar> serviceRegistrars) {
+ }
+
+ public Entry[] getEntry() {
+ return entry;
+ }
+
+ public Collection<ServiceRegistrar> getRegistrations() {
+ return Collections.unmodifiableCollection(idToReggie.values());
+ }
+
+ public Remote getProxy() {
+ return proxy;
+ }
+
+ public ServiceRegistrar findRegistrar(String host) throws MalformedURLException, ClassNotFoundException, IOException {
+ return serviceDataStore.findRegistrar(host);
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniService.java
new file mode 100644
index 00000000000..39c884ff9d4
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/JiniService.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.service.core;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+import net.jini.core.entry.Entry;
+import net.jini.core.lease.UnknownLeaseException;
+import net.jini.core.lookup.ServiceID;
+import net.jini.id.Uuid;
+import net.jini.id.UuidFactory;
+import net.jini.lookup.entry.Comment;
+import net.jini.lookup.entry.Name;
+import net.jini.lookup.entry.ServiceInfo;
+import org.eclipse.osee.framework.jini.discovery.RelaxedSecurity;
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+import org.eclipse.osee.framework.plugin.core.server.ClassServer;
+import org.eclipse.osee.framework.plugin.core.server.PathResourceFinder;
+
+public abstract class JiniService implements IService {
+ protected JiniJoinManager joinManager;
+ protected Object keepAlive;
+ protected ClassServer messageClassServer;
+ protected String codeBase;
+ protected String hostName;
+ private final ServiceID serviceID;
+
+ /**
+ * Creates a Service with the serviceID specified. Note, this does not register the service.
+ *
+ * @param serviceID the serviceID to assign to the service.
+ */
+ public JiniService(ServiceID serviceID) {
+ this.serviceID = serviceID;
+ }
+
+ /**
+ * Creates a Service with the serviceID specified. Note, this does not register the service.
+ *
+ * @param uuid The unique identifier used for the serviceID.
+ */
+ public JiniService(Uuid uuid) {
+ Long lsb = new Long(uuid.getLeastSignificantBits());
+ Long msb = new Long(uuid.getMostSignificantBits());
+ serviceID = new ServiceID(msb.longValue(), lsb.longValue());
+ }
+
+ /**
+ * Creates a Service. The serviceID will be generated automatically. Note, this does not register the service.
+ */
+ public JiniService() {
+ this(UuidFactory.generate());
+ }
+
+ public void stayAlive() {
+ keepAlive = new Object();
+ synchronized (keepAlive) {
+ try {
+ keepAlive.wait();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void commitSuicide() {
+ if (keepAlive != null) {
+ synchronized (keepAlive) {
+ keepAlive.notify();
+ }
+ }
+ }
+
+ public Entry[] registerService(Entry[] entry) {
+ return registerService(entry, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Entry[] registerService(Entry[] entry, Dictionary dictionary) {
+ try {
+ System.setSecurityManager(new RelaxedSecurity());
+ // find ServiceInfo
+ List<Entry> entries = new ArrayList<Entry>();
+ entries.add(new OwnerEntry());
+ GroupEntry group = null;
+
+ if (dictionary != null) {
+ ServiceInfo info = null;
+ Name name = null;
+ Comment comment = null;
+ VersionEntry version = null;
+
+ if (entry != null) {
+ for (int i = 0; i < entry.length; i++) {
+ if (entry[i] instanceof ServiceInfo) {
+ info = (ServiceInfo) entry[i];
+ }
+ if (entry[i] instanceof Name) {
+ name = (Name) entry[i];
+ }
+ if (entry[i] instanceof Comment) {
+ comment = (Comment) entry[i];
+ }
+ if (entry[i] instanceof VersionEntry) {
+ version = (VersionEntry) entry[i];
+ }
+ if (entry[i] instanceof GroupEntry) {
+ group = (GroupEntry) entry[i];
+ }
+ entries.add(entry[i]);
+ }
+ }
+ if (info == null) {
+ info = new ServiceInfo();
+ entries.add(info);
+ }
+ if (name == null) {
+ name = new Name();
+ entries.add(name);
+ }
+ if (comment == null) {
+ comment = new Comment();
+ entries.add(comment);
+ }
+ if (version == null) {
+ version = new VersionEntry();
+ entries.add(version);
+ }
+ Object obj = null;
+ obj = dictionary.get("Bundle-Name");
+ if (obj != null) {
+ info.name = obj.toString();
+ }
+ obj = dictionary.get("Bundle-Vendor");
+ if (obj != null) {
+ info.vendor = obj.toString();
+ }
+ obj = dictionary.get("Bundle-Description");
+ if (obj != null) {
+ comment.comment = obj.toString();
+ }
+ info.version = dictionary.get("Bundle-Version").toString();
+ info.serialNumber = info.version;
+ version.version = info.version;
+ name.name = dictionary.get("Bundle-Name").toString();
+ } else {
+ if (entry != null) {
+ for (int i = 0; i < entry.length; i++) {
+ entries.add(entry[i]);
+ }
+ }
+ }
+
+ if (group == null) {
+ group = new GroupEntry();
+ entries.add(group);
+ }
+ group.group = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+
+ entry = new Entry[entries.size()];
+ for (int i = 0; i < entries.size(); i++) {
+ entry[i] = entries.get(i);
+ }
+ joinManager = new JiniJoinManager(serviceID, this, entry);
+ joinManager.addGroup(group.group);
+ Runtime.getRuntime().addShutdownHook(new KillService(joinManager));
+ } catch (UnknownHostException ex) {
+ ex.printStackTrace();
+ System.exit(1);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ System.exit(1);
+ }
+ return entry;
+ }
+
+ protected void startClassServer(String[] jarsToServe) throws Exception {
+ messageClassServer = new ClassServer(0, InetAddress.getLocalHost());
+ PathResourceFinder resource = new PathResourceFinder(jarsToServe, true);
+ messageClassServer.addResourceFinder(resource);
+ messageClassServer.start();
+ codeBase =
+ "http://" + InetAddress.getLocalHost().getCanonicalHostName() + ":" + messageClassServer.getPort() + "/";
+ hostName = InetAddress.getLocalHost().getHostAddress();
+ System.setProperty("java.rmi.server.hostname", hostName);
+ System.setProperty("java.rmi.server.codebase", codeBase);
+ }
+
+ public void deregisterService() {
+ try {
+ if (joinManager != null) {
+ joinManager.terminate();
+ joinManager = null;
+
+ } else {
+ System.out.println("service already removed JiniService.deregister");
+ }
+ } catch (UnknownLeaseException ex) {
+ ex.printStackTrace();
+ } catch (RemoteException ex) {
+ ex.printStackTrace();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public void cleanup() {
+ if (messageClassServer != null) messageClassServer.terminate();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.service.interfaces.IService#getServiceID()
+ */
+ public ServiceID getServiceID() throws RemoteException {
+ return serviceID;
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof JiniService) {
+ return ((JiniService) object).serviceID.equals(this.serviceID);
+ }
+ return false;
+ }
+
+ public int hashCode() {
+ return serviceID.hashCode();
+ }
+
+ public JiniJoinManager getJoinManager() {
+ return joinManager;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/KillService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/KillService.java
new file mode 100644
index 00000000000..3ebfb559fab
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/KillService.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.jini.service.core;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class KillService extends Thread {
+
+ private JiniJoinManager mgr;
+
+ public KillService(JiniJoinManager mgr) {
+ this.mgr = mgr;
+ }
+
+ public void run() {
+ try {
+ mgr.terminate();
+ } catch (Exception ex) {
+ System.out.println("KillService - service already terminated");
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/OwnerEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/OwnerEntry.java
new file mode 100644
index 00000000000..fd47d3c32af
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/OwnerEntry.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.framework.jini.service.core;
+
+public class OwnerEntry extends FormmatedEntry {
+
+ private static final long serialVersionUID = 2648767166516408200L;
+ public String owner;
+
+ public OwnerEntry() {
+ owner = System.getProperty("user.name");
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public String getFormmatedString() {
+ return "Owner : " + owner;
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/PropertyEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/PropertyEntry.java
new file mode 100644
index 00000000000..322afb8ec1f
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/PropertyEntry.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.framework.jini.service.core;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import net.jini.entry.AbstractEntry;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class PropertyEntry extends AbstractEntry {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 8506398896518763116L;
+ public HashMap<String, Serializable> map;
+
+ public PropertyEntry() {
+ map = new HashMap<String, Serializable>(64);
+ }
+
+ public PropertyEntry(Map<String, Serializable> properties) {
+ this();
+ this.map.putAll(properties);
+ }
+
+ public void setProperty(String key, Serializable value) {
+ map.put(key, value);
+ }
+
+ public Serializable getProperty(String key, Serializable defaultValue) {
+ Serializable value = map.get(key);
+ return value == null ? defaultValue : value;
+ }
+
+ /**
+ * fills the supplied {@link EnhancedProperties} object with all the properties contained in this entry
+ *
+ * @param props
+ */
+ public void fillProps(Map<String, Serializable> props) {
+ props.putAll(map);
+ }
+
+ /* (non-Javadoc)
+ * @see net.jini.entry.AbstractEntry#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof PropertyEntry) {
+ return ((PropertyEntry) other).map.equals(map);
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/SimpleFormattedEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/SimpleFormattedEntry.java
new file mode 100644
index 00000000000..be3ff714c07
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/SimpleFormattedEntry.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.framework.jini.service.core;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SimpleFormattedEntry extends FormmatedEntry {
+ private static final long serialVersionUID = -4511921240754213614L;
+ public String name;
+ public String value;
+
+ /**
+ *
+ */
+ public SimpleFormattedEntry() {
+ super();
+ }
+
+ /**
+ * @param name
+ * @param value
+ */
+ public SimpleFormattedEntry(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public final String getFormmatedString() {
+ return name + " : " + value + "\n";
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/VersionEntry.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/VersionEntry.java
new file mode 100644
index 00000000000..68efec54d67
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/core/VersionEntry.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.jini.service.core;
+
+public class VersionEntry extends FormmatedEntry {
+
+ private static final long serialVersionUID = 132189087526085874L;
+ public String version;
+
+ public VersionEntry() {
+ version = "1.0.0";
+ }
+
+ public String getFormmatedString() {
+ return "Version: " + version;
+ }
+
+ public boolean equals(Object other) {
+ if (!(other instanceof VersionEntry)) return false;
+ return version.equals(((VersionEntry) other).version);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/directory/service/IDirectory.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/directory/service/IDirectory.java
new file mode 100644
index 00000000000..32b2806465f
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/directory/service/IDirectory.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.framework.jini.service.directory.service;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import org.eclipse.osee.framework.jdk.core.directory.DirectoryPerson;
+
+public interface IDirectory extends Remote {
+
+ /**
+ * @param bemsid
+ * @return person object
+ * @throws RemoteException
+ */
+ public DirectoryPerson getPerson(int bemsid) throws RemoteException;
+
+ /**
+ * @param dept
+ * @return arraylist of people
+ * @throws RemoteException
+ */
+ public ArrayList<String> getGroup(String[] dept) throws RemoteException;
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/gssfl/IGssflTaskService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/gssfl/IGssflTaskService.java
new file mode 100644
index 00000000000..4c9b7422c50
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/gssfl/IGssflTaskService.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.framework.jini.service.gssfl;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IGssflTaskService extends Remote {
+
+ public String executeCmd(String[] cmd) throws RemoteException;
+
+ public String createAllList(String project) throws RemoteException;
+
+ public String copyAuthorizedRpcrs(String project) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/interfaces/IService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/interfaces/IService.java
new file mode 100644
index 00000000000..eb9406d6369
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/interfaces/IService.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.framework.jini.service.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import net.jini.core.lookup.ServiceID;
+
+public interface IService extends Remote {
+ ServiceID getServiceID() throws RemoteException;
+
+ void kill() throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/report/IReport.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/report/IReport.java
new file mode 100644
index 00000000000..e410cccd9f8
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/report/IReport.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.framework.jini.service.report;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IReport extends Remote {
+
+ public void setReportId(int reportId) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduleService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduleService.java
new file mode 100644
index 00000000000..ce9bd4093da
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduleService.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.framework.jini.service.scheduler;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.Calendar;
+import net.jini.core.lookup.ServiceItem;
+
+public interface IScheduleService extends Remote {
+
+ /**
+ * @param startTime
+ * @param interval
+ * @param calendar
+ * @param type
+ * @param path
+ * @param dateStr
+ * @param bems
+ * @throws RemoteException
+ */
+ public void addTask(int startTime, int interval, Calendar calendar, int type, String path, String dateStr, String bems, ServiceItem serviceItem) throws RemoteException;
+
+ /**
+ * @param taskId
+ * @throws RemoteException
+ */
+ public void removeTask(String taskId) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduler.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduler.java
new file mode 100644
index 00000000000..7ce2ca6bd1d
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/scheduler/IScheduler.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.framework.jini.service.scheduler;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IScheduler extends Remote {
+
+ /**
+ * method is called by the scheduler
+ *
+ * @throws RemoteException
+ */
+ public void run() throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/BuildTargetPair.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/BuildTargetPair.java
new file mode 100644
index 00000000000..616225329cb
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/BuildTargetPair.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.framework.jini.service.test.interfaces;
+
+import java.io.Serializable;
+
+public class BuildTargetPair implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 8194125694292612082L;
+ String buildMachineName;
+ String buildMachineIP;
+ String targetMachineName;
+ String targetMachineIP;
+
+ public BuildTargetPair(String buildMachineName, String buildMachineIP, String targetMachineName, String targetMachineIP) {
+ this.buildMachineName = buildMachineName;
+ this.buildMachineIP = buildMachineIP;
+ this.targetMachineName = targetMachineName;
+ this.targetMachineIP = targetMachineIP;
+ }
+
+ public String getBuildMachineIP() {
+ return buildMachineIP;
+ }
+
+ public String getBuildMachineName() {
+ return buildMachineName;
+ }
+
+ public String getTargetMachineIP() {
+ return targetMachineIP;
+ }
+
+ public String getTargetMachineName() {
+ return targetMachineName;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/INabitService.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/INabitService.java
new file mode 100644
index 00000000000..92b764ec9b5
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/service/test/interfaces/INabitService.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.framework.jini.service.test.interfaces;
+
+import java.rmi.RemoteException;
+import java.util.List;
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+import org.eclipse.osee.framework.jini.util.IRemotePrintTarget;
+
+public interface INabitService extends IService {
+
+ void runBashCommands(String[] cmds) throws RemoteException;
+
+ String getServiceName() throws RemoteException;
+
+ List<BuildTargetPair> getBuildTargetPairInfo() throws RemoteException;
+
+ void connectToMachine(String username, String password, String ip, IRemotePrintTarget callback) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/IRemotePrintTarget.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/IRemotePrintTarget.java
new file mode 100644
index 00000000000..42fb3de934d
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/IRemotePrintTarget.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.framework.jini.util;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IRemotePrintTarget extends Remote {
+ void print(String msg) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/OseeJini.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/OseeJini.java
new file mode 100644
index 00000000000..6fd28208c91
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/OseeJini.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.framework.jini.util;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.logging.Level;
+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.framework.jdk.core.util.Network;
+import org.eclipse.osee.framework.jini.JiniPlugin;
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class OseeJini {
+ public static Remote getRemoteReference(Remote object) throws ExportException {
+ try {
+ return getRemoteReference(object, Network.getValidIP());
+ } catch (UnknownHostException ex) {
+ OseeLog.log(JiniPlugin.class, Level.SEVERE, "OseeJini.getRemoteReference: ", ex);
+ return null;
+ }
+ }
+
+ public static Remote getRemoteReference(Remote object, InetAddress inetAddress) throws ExportException {
+ Exporter export =
+ new BasicJeriExporter(TcpServerEndpoint.getInstance(inetAddress.getHostAddress(), 0), new BasicILFactory(),
+ false, false);
+ return export.export(object);
+ }
+
+ public static void printClassLoaders(Class<?> clazz) {
+ ClassLoader cl = clazz.getClassLoader();
+ do {
+ OseeLog.log(JiniPlugin.class, Level.INFO, cl.toString());
+ cl = cl.getParent();
+ } while (cl != null);
+ }
+
+ public static boolean isServiceAlive(Object obj) {
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e1) {
+
+ e1.printStackTrace();
+ }
+ boolean returnVal = true;
+ if (obj instanceof IService) {
+ try {
+ ((IService) obj).getServiceID();
+ } catch (RemoteException e) {
+ returnVal = false;
+ }
+ }
+ return returnVal;
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/RemotePrintStream.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/RemotePrintStream.java
new file mode 100644
index 00000000000..57ddd5cddc2
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/util/RemotePrintStream.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.framework.jini.util;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
+import java.io.StringWriter;
+import java.rmi.RemoteException;
+
+public class RemotePrintStream extends PrintStream {
+
+ private IRemotePrintTarget target;
+ private PipedInputStream pis;
+ private StringWriter writer;
+ private byte[] buffer;
+
+ public RemotePrintStream(PipedOutputStream os, IRemotePrintTarget target) throws IOException {
+ super(os, true);
+ this.pis = new PipedInputStream(os);
+ this.target = target;
+ writer = new StringWriter();
+ buffer = new byte[2048];
+ }
+
+ @Override
+ public void flush() {
+ super.flush();
+ int read;
+ try {
+ read = pis.available();
+ do {
+ if (read > 2048) read = 2048;
+ int readbytes = pis.read(buffer, 0, read);
+ writer.append(new String(buffer, 0, readbytes));
+ read = pis.available();
+ } while (read > 0);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ try {
+ target.print(writer.toString());
+ writer.flush();
+ writer.getBuffer().delete(0, writer.getBuffer().capacity());
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/utility/StartJini.java b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/utility/StartJini.java
new file mode 100644
index 00000000000..c3c679c481b
--- /dev/null
+++ b/org.eclipse.osee.framework.jini/src/org/eclipse/osee/framework/jini/utility/StartJini.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jini.utility;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import net.jini.core.entry.Entry;
+import net.jini.lookup.entry.Comment;
+import net.jini.lookup.entry.ServiceInfo;
+import org.eclipse.osee.framework.jdk.core.util.CmdLineArgs;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import org.eclipse.osee.framework.jini.service.core.JiniService;
+import org.eclipse.osee.framework.jini.service.core.SimpleFormattedEntry;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+import org.eclipse.osee.framework.plugin.core.config.NonEclipseManifestHeader;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StartJini extends JiniService {
+
+ public static final String SPAWNED_REGGIE_SERVICE_ID = "Spawned Reggie Id";
+ public static final String SPAWNED_REGGIE_ON_HOST = "On Host";
+
+ private List<Process> jiniProcesses;
+
+ public StartJini(String port, boolean nohup, boolean browser, String jiniHome, InputStream manifestFile) {
+ super();
+
+ jiniProcesses = new ArrayList<Process>();
+
+ try {
+ String javaHome = System.getProperty("java.home");
+ String fs = System.getProperty("file.separator");
+
+ if (jiniHome == null) {
+ jiniHome = new File(Lib.getBasePath(StartJini.class).replace("bin", "")).getAbsolutePath();
+ }
+ jiniHome = jiniHome.replace('\\', '/');
+
+ String[] groups = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+ String allowedGroups = "";
+ if (groups != null) {
+ allowedGroups = StringFormat.commaSeparate(groups);
+ } else {
+ OseeLog.log(
+ StartJini.class,
+ Level.SEVERE,
+ "[-D" + OseeProperties.getOseeJiniServiceGroups() + "] was not set.\nPlease enter the Group(s) this Lookup Server will register with.");
+ return;
+ }
+ String quote = null;
+ if (Lib.isWindows()) {
+ quote = "\"";
+ } else {
+ quote = "";
+ }
+
+ String host = InetAddress.getLocalHost().getHostAddress();
+ System.out.println("Host Address: " + host);
+ String javaexeBigMem = quote + javaHome + fs + "bin" + fs + "java" + quote + " -Xmx512M ";
+ String startServices =
+ javaexeBigMem + " -Dlookupcomponent " + " -Dosee.jini.lookup.groups=" + allowedGroups + " " + " -Dosee.jini.install=" + quote + jiniHome + "/jini2_1" + quote + " " + " -Dosee.jini.config=" + quote + jiniHome + "/jini_config" + quote + " " + " -Dosee.classserver.host=" + host + " " + " -Dosee.classserver.port=" + port + " " + " -Djava.security.policy=" + quote + jiniHome + "/jini_config/jsk-all.policy" + quote + " " + " -jar " + quote + jiniHome + "/jini2_1/lib/start.jar" + quote + " " + quote + jiniHome + "/jini_config/start-transient-jeri-services.config" + quote;
+
+ OseeLog.log(StartJini.class, Level.INFO, "RUN REGGIE ***************************************************");
+ OseeLog.log(StartJini.class, Level.INFO, startServices);
+ Process process = Runtime.getRuntime().exec(startServices);
+ jiniProcesses.add(process);
+ String reggieServiceId = catchTheReggieServiceId(process);
+ Lib.handleProcessNoWait(process, new OutputStreamWriter(System.err));
+
+ if (reggieServiceId == null || reggieServiceId.length() == 0) {
+ OseeLog.log(StartJini.class, Level.SEVERE, "\n Jini Initialization Failed. \n");
+ killProcesses();
+ return;
+ }
+
+ // Wait for Reggie to come alive before registering Core Jini Service
+ try {
+ Thread.sleep(7000);
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+
+ String model = "CJS";
+ String description = "Provides means to shutdown spawned Jini Lookup Services";
+
+ this.registerService(new Entry[] {new ServiceInfo("", "", "", "", model, ""), new Comment(description),
+ new SimpleFormattedEntry(SPAWNED_REGGIE_SERVICE_ID, reggieServiceId),
+ new SimpleFormattedEntry(SPAWNED_REGGIE_ON_HOST, getHostName())}, getHeaders(manifestFile));
+
+ OseeLog.log(StartJini.class, Level.INFO, "....................Core Jini Service is Alive....................");
+ this.stayAlive();
+
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+ private String catchTheReggieServiceId(Process process) {
+ Pattern reggieStartPattern = Pattern.compile("INFO: started Reggie: ([a-z|A-Z|0-9|\\-]+).*");
+ String reggieFail = "SEVERE: Reggie initialization failed";
+ StringBuilder wr = new StringBuilder();
+ String toReturn = "";
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+ String line = null;
+ try {
+ while ((line = reader.readLine()) != null) {
+ wr.append(line);
+ OseeLog.log(StartJini.class, Level.SEVERE, "err: " + line + "\n");
+ Matcher reggieStartMatcher = reggieStartPattern.matcher(wr);
+ if (!wr.toString().contains(reggieFail)) {
+ if (reggieStartMatcher.matches()) {
+ toReturn = reggieStartMatcher.group(1);
+ break;
+ }
+ } else {
+ break;
+ }
+ wr.delete(0, wr.length());
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ return toReturn;
+ }
+
+ private String getHostName() {
+ String host = "";
+ try {
+ host = InetAddress.getLocalHost().getCanonicalHostName();
+ } catch (UnknownHostException ex) {
+ host = "Error Obtaining Host";
+ ex.printStackTrace();
+ }
+ return host;
+ }
+
+ private static InputStream getManifestFile(String[] args) {
+ InputStream toReturn = null;
+ CmdLineArgs cmdLineArgs = new CmdLineArgs(args);
+ String manifestFileString = cmdLineArgs.get("-manifest");
+
+ if (manifestFileString == null || manifestFileString.length() == 0) {
+ manifestFileString = "META-INF/MANIFEST.MF";
+ }
+ File file = new File(manifestFileString);
+
+ if (file == null || !file.exists()) {
+ OseeLog.log(StartJini.class, Level.SEVERE, "The Specified Manifest File does not exist!!");
+ System.exit(1);
+ }
+ try {
+ toReturn = new FileInputStream(file);
+ } catch (FileNotFoundException ex) {
+ OseeLog.log(StartJini.class, Level.SEVERE, "The Specified Manifest File can not be opened!!", ex);
+ System.exit(1);
+ }
+ return toReturn;
+ }
+
+ private static Dictionary<Object, Object> getHeaders(InputStream manifestFile) {
+ try {
+ return NonEclipseManifestHeader.parseManifest(manifestFile);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ public static void main(String[] args) {
+ OseeLog.log(StartJini.class, Level.INFO, "num args + " + args.length);
+ InputStream manifestFile = getManifestFile(args);
+ if (args.length == 1) {
+ new StartJini(args[0], false, false, null, manifestFile);
+ } else if (args.length > 1) {
+ boolean browser = false, nohup = false;
+
+ for (int i = 1; i < args.length; i++) {
+ if (args[i].equalsIgnoreCase("-nohup")) {
+ OseeLog.log(StartJini.class, Level.INFO, "nohup!!");
+ nohup = true;
+ } else if (args[i].equalsIgnoreCase("-browser")) {
+ browser = true;
+ }
+ }
+
+ new StartJini(args[0], nohup, browser, null, manifestFile);
+ } else {
+ OseeLog.log(StartJini.class, Level.INFO,
+ "USAGE: -Dosee.jini.lookup.groups=<groups> StartJini <port> ?<-nohup> ?<-browser>");
+ }
+
+ OseeLog.log(StartJini.class, Level.INFO, "Exiting...");
+ Runtime.getRuntime().exit(0);
+ }
+
+ private void killProcesses() {
+ OseeLog.log(StartJini.class, Level.INFO, "Destroying Spawned Processes...");
+ for (Process process : jiniProcesses) {
+ if (process != null) {
+ process.destroy();
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.service.interfaces.IService#kill()
+ */
+ public void kill() throws RemoteException {
+ OseeLog.log(StartJini.class, Level.INFO, "De-registering Core Jini Service...");
+ deregisterService();
+ killProcesses();
+ ServiceDataStore.getNonEclipseInstance().terminate();
+ commitSuicide();
+ }
+}
diff --git a/org.eclipse.osee.framework.logging/.classpath b/org.eclipse.osee.framework.logging/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/.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.framework.logging/.project b/org.eclipse.osee.framework.logging/.project
new file mode 100644
index 00000000000..b9063674524
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.logging</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.logging/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.logging/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..19f89abee09
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu Apr 24 12:08:27 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.logging/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.logging/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..06fa5afa5e9
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Logging Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.logging;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.logging.internal.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.logging/build.properties b/org.eclipse.osee.framework.logging/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/BaseStatus.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/BaseStatus.java
new file mode 100644
index 00000000000..92f5ae646eb
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/BaseStatus.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.framework.logging;
+
+import java.io.Serializable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class BaseStatus implements IHealthStatus, Serializable {
+ private static final long serialVersionUID = -3767182052813764517L;
+ private final Level level;
+ private final Throwable th;
+ private final String message;
+ private final Object[] args;
+ private final String sourceName;
+
+ public BaseStatus(String sourceName, Level level, Throwable th, String message, Object... args) {
+ this.sourceName = sourceName;
+ this.level = level;
+ this.th = th;
+ this.message = message;
+ this.args = args;
+ }
+
+ public BaseStatus(String sourceName, Level level, String message, Object... args) {
+ this(sourceName, level, null, message, args);
+ }
+
+ public BaseStatus(String sourceName, Level level, Throwable th) {
+ this(sourceName, level, th, th.getMessage(), (Object[]) null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IStatus#getException()
+ */
+ @Override
+ public Throwable getException() {
+ return th;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IStatus#getMessage()
+ */
+ @Override
+ public String getMessage() {
+ String toReturn = null;
+ if (message != null && args != null) {
+ toReturn = String.format(message, args);
+ } else if (message != null) {
+ toReturn = message;
+ } else {
+ toReturn = "Unavailable";
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.logging.IOSEEStatus#getLevel()
+ */
+ @Override
+ public Level getLevel() {
+ return this.level;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.logging.IHealthStatus#getSourceName()
+ */
+ @Override
+ public String getSourceName() {
+ return sourceName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.logging.IHealthStatus#isOk()
+ */
+ @Override
+ public boolean isOk() {
+ return Level.INFO.intValue() >= getLevel().intValue();
+ }
+
+ public String toString(){
+ StringBuilder sb = new StringBuilder();
+ if(message != null){
+ sb.append(message);
+ sb.append("\n");
+ }
+ sb.append(Lib.exceptionToString(th));
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ConsoleLogger.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ConsoleLogger.java
new file mode 100644
index 00000000000..cb5d7268e83
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ConsoleLogger.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.framework.logging;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ConsoleLogger implements ILoggerListener {
+
+ public Set<Logger> initializedLoggers;
+
+ public ConsoleLogger() {
+ initializedLoggers = new HashSet<Logger>(64);
+ }
+
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ Logger logger = Logger.getLogger(loggerName);
+ if (initializedLoggers.add(logger)) {
+ logger.setUseParentHandlers(false);
+ SimpleOseeHandler handler = new SimpleOseeHandler();
+ logger.addHandler(handler);
+ logger.setLevel(Level.ALL);
+ }
+ logger.log(level, message, th);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IHealthStatus.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IHealthStatus.java
new file mode 100644
index 00000000000..5418223478e
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IHealthStatus.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.framework.logging;
+
+import java.util.logging.Level;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IHealthStatus {
+
+ public String getSourceName();
+
+ public Throwable getException();
+
+ public String getMessage();
+
+ public Level getLevel();
+
+ public boolean isOk();
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerFilter.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerFilter.java
new file mode 100644
index 00000000000..6b51f305df0
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerFilter.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.framework.logging;
+
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ILoggerFilter {
+
+ Level getLoggerLevel();
+
+ Pattern bundleId();
+
+ Pattern name();
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerListener.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerListener.java
new file mode 100644
index 00000000000..10fe9f86e08
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/ILoggerListener.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.framework.logging;
+
+import java.util.logging.Level;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ILoggerListener {
+
+ void log(String loggerName, Level level, String message, Throwable th);
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListener.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListener.java
new file mode 100644
index 00000000000..a0e02a2fd8d
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListener.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.framework.logging;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IStatusListener {
+ void onStatus(IHealthStatus status);
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListenerFilter.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListenerFilter.java
new file mode 100644
index 00000000000..bdb99c36d98
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/IStatusListenerFilter.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.framework.logging;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IStatusListenerFilter {
+ boolean isInterested(IHealthStatus status);
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLevel.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLevel.java
new file mode 100644
index 00000000000..82952cc6650
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLevel.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.logging;
+
+import java.util.logging.Level;
+
+/**
+ * @author osee
+ */
+public class OseeLevel extends Level {
+ private static final long serialVersionUID = 4699966771242634396L;
+ public static final Level SEVERE_POPUP = new OseeLevel("SEVERE_POPUP", SEVERE.intValue() + 100);
+
+ /**
+ * @param name
+ * @param value
+ */
+ protected OseeLevel(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLog.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLog.java
new file mode 100644
index 00000000000..7a7d29b713e
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLog.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.framework.logging;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeLog {
+
+ private static StatusManager sm;
+ private static OseeLogger log;
+
+ static void makevalid() {
+ sm = new StatusManager();
+ log = new OseeLogger();
+ }
+
+ private static OseeLogger getLog() {
+ if (log == null || sm == null) {
+ makevalid();
+ }
+ return log;
+ }
+
+ private static StatusManager getSM() {
+ if (sm == null || log == null) {
+ makevalid();
+ }
+ return sm;
+ }
+
+ public static void log(Class<?> activatorClass, Level level, String message) {
+ if (level.intValue() == Level.SEVERE.intValue()) {
+ getLog().log(activatorClass.getName(), level, message, new Exception("used to get a stack trace"));
+ } else {
+ getLog().log(activatorClass.getName(), level, message, null);
+ }
+ }
+
+ public static void log(Class<?> activatorClass, Level level, Throwable th) {
+ getLog().log(activatorClass.getName(), level, th.getLocalizedMessage(), th);
+ }
+
+ public static void log(Class<?> activatorClass, Level level, String message, Throwable th) {
+ getLog().log(activatorClass.getName(), level, message, th);
+ }
+
+ public static void log(String loggerName, Level level, String message, Throwable th) {
+ getLog().log(loggerName, level, message, th);
+ }
+
+ public static void log(String loggerName, String name2, Level level, String message, Throwable th) {
+ getLog().log(loggerName, level, message, th);
+ }
+
+ public static void format(String loggerName, Level level, String message, Object... objects) {
+ getLog().format(loggerName, level, message, objects);
+ }
+
+ public static void format(Throwable th, String loggerName, Level level, String message, Object... objects) {
+ getLog().format(th, loggerName, level, message, objects);
+ }
+
+ public static void registerLoggerListener(ILoggerListener listener) {
+ getLog().registerLoggerListener(listener);
+ }
+
+ public static void unregisterLoggerListener(ILoggerListener listener) {
+ getLog().unregisterLoggerListener(listener);
+ }
+
+ public static void setLevel(String loggerName, Level level) {
+ getLog().setLevel(loggerName, level);
+ }
+
+ public static void reportStatus(IHealthStatus status) {
+ getSM().report(status);
+ }
+
+ public static String getStatusReport() {
+ return getSM().getReport();
+ }
+
+ public static boolean isStatusOk() {
+ return getSM().isStatusOk();
+ }
+
+ public static IHealthStatus getStatusByName(String sourceName) {
+ return getSM().getHealthStatusByName(sourceName);
+ }
+
+ public static Collection<IHealthStatus> getStatus() {
+ return getSM().getHealthStatus();
+ }
+
+ public static boolean register(IStatusListener listener, IStatusListenerFilter filter) {
+ return getSM().register(listener, filter);
+ }
+
+ public static boolean register(IStatusListener listener) {
+ return getSM().register(listener);
+ }
+
+ public static void deregister(IStatusListener listener) {
+ getSM().deregister(listener);
+ }
+
+ /**
+ * @param status
+ */
+ public static void reportStatus(List<IHealthStatus> statuses) {
+ for (IHealthStatus status : statuses) {
+ reportStatus(status);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLogger.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLogger.java
new file mode 100644
index 00000000000..3a89c03b4ac
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/OseeLogger.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.framework.logging;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeLogger {
+
+ private List<ILoggerListener> listeners;
+ private Map<String, Level> levelMap;
+ private Level defaultLevel;
+
+ public OseeLogger() {
+ levelMap = new ConcurrentHashMap<String, Level>();
+ listeners = new CopyOnWriteArrayList<ILoggerListener>();
+ listeners.add(new ConsoleLogger());
+
+ defaultLevel = OseeProperties.getOseeLogDefault();
+
+ for (Entry<Object, Object> entry : System.getProperties().entrySet()) {
+ if (entry.getKey().toString().startsWith("osee.log.")) {
+ String name = entry.getKey().toString().substring(9);
+ String level = entry.getValue().toString();
+ try {
+ Level lev = Level.parse(level);
+ levelMap.put(name, lev);
+ } catch (Exception ex) {
+ }
+ }
+ }
+ }
+
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ if (!shouldLog(loggerName, level)) {
+ return;
+ }
+
+ for (ILoggerListener logger : listeners) {
+ logger.log(loggerName, level, message, th);
+ }
+ }
+
+ public void format(String loggerName, Level level, String message, Object... objects) {
+ format(null, loggerName, level, message, objects);
+ }
+
+ public void format(Throwable th, String loggerName, Level level, String message, Object... objects) {
+ if (!shouldLog(loggerName, level)) {
+ return;
+ }
+ for (ILoggerListener logger : listeners) {
+ String msg = String.format(message, objects);
+ logger.log(loggerName, level, msg, th);
+ }
+ }
+
+ public void registerLoggerListener(ILoggerListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ public void unregisterLoggerListener(ILoggerListener listener) {
+ listeners.remove(listener);
+ }
+
+ public void setLevel(String loggerName, Level level) {
+ levelMap.put(loggerName, level);
+ }
+
+ private boolean shouldLog(String loggerName, Level level) {
+ Level filterLevel = levelMap.get(loggerName);
+ if (filterLevel == null) {
+ filterLevel = defaultLevel;
+ levelMap.put(loggerName, filterLevel);
+ }
+ if (level.intValue() >= filterLevel.intValue()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SevereLoggingMonitor.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SevereLoggingMonitor.java
new file mode 100644
index 00000000000..fb01f67c86a
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SevereLoggingMonitor.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.framework.logging;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+public class SevereLoggingMonitor implements ILoggerListener {
+
+ private List<IHealthStatus> status = new ArrayList<IHealthStatus>();
+
+ @Override
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ status.add(new BaseStatus(loggerName, level, message, th));
+ }
+
+ public List<IHealthStatus> getAllLogs() {
+ return status;
+ }
+
+ public List<IHealthStatus> getSevereLogs() {
+ List<IHealthStatus> severeStatus = new ArrayList<IHealthStatus>(status.size());
+
+ //Remove all none severe levels
+ for (IHealthStatus healthStatus : status) {
+ if (healthStatus.getLevel() == Level.SEVERE) {
+ severeStatus.add(healthStatus);
+ }
+ }
+ return severeStatus;
+ }
+
+ public List<IHealthStatus> getLogsAtLevel(Level level) {
+ List<IHealthStatus> warningStatus = new ArrayList<IHealthStatus>(status.size());
+
+ //Remove all none severe levels
+ for (IHealthStatus healthStatus : status) {
+ if (healthStatus.getLevel() == level) {
+ warningStatus.add(healthStatus);
+ }
+ }
+ return warningStatus;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(status.size());
+ sb.append(" Severe logs captured.\n");
+ for (IHealthStatus health : status) {
+ sb.append(health.getException().getMessage());
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeFormatter.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeFormatter.java
new file mode 100644
index 00000000000..b9eb3673403
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeFormatter.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.framework.logging;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.logging.Formatter;
+import java.util.logging.LogRecord;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SimpleOseeFormatter extends Formatter {
+ Date dat = new Date();
+ private StringBuilder sb = new StringBuilder();
+
+ // Line separator string. This is the value of the line.separator
+ // property at the moment that the SimpleFormatter was created.
+ private String lineSeparator =
+ (String) java.security.AccessController.doPrivileged(new sun.security.action.GetPropertyAction(
+ "line.separator"));
+
+ @Override
+ public String format(LogRecord record) {
+ sb.setLength(0);
+ // Minimize memory allocations here.
+ dat.setTime(record.getMillis());
+ sb.append(dat.toString());
+ sb.append(" ");
+ sb.append(record.getLoggerName());
+ sb.append(lineSeparator);
+
+ Throwable th = new Throwable();
+ StackTraceElement[] elements = th.getStackTrace();
+ boolean captureNextItem = false;
+ for (StackTraceElement el : elements) {
+ if (el.getClassName().contains("OseeLog")) {
+ captureNextItem = true;
+ } else if (captureNextItem) {
+ sb.append(String.format("%s %s %s (%d)", record.getLevel().getLocalizedName(), el.getClassName(),
+ el.getMethodName(), el.getLineNumber()));
+ sb.append(lineSeparator);
+ break;
+ }
+ }
+
+ String message = formatMessage(record);
+ if (!captureNextItem) {
+ sb.append(record.getLevel().getLocalizedName());
+ sb.append(" ");
+
+ }
+ sb.append(message);
+ sb.append(lineSeparator);
+ if (record.getThrown() != null) {
+ try {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ record.getThrown().printStackTrace(pw);
+ pw.close();
+ sb.append(sw.toString());
+ } catch (Exception ex) {
+ }
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeHandler.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeHandler.java
new file mode 100644
index 00000000000..46afb488db2
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/SimpleOseeHandler.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.framework.logging;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SimpleOseeHandler extends Handler {
+
+ public SimpleOseeHandler() {
+ setFormatter(new SimpleOseeFormatter());
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void flush() {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ if (isLoggable(record)) {
+ if (record.getLevel().intValue() >= Level.SEVERE.intValue()) {
+ System.err.println(getFormatter().format(record));
+ } else {
+ System.out.println(getFormatter().format(record));
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/StatusManager.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/StatusManager.java
new file mode 100644
index 00000000000..99b744cd686
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/StatusManager.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.framework.logging;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+class StatusManager {
+ private final Map<String, IHealthStatus> services;
+ private List<IStatusListener> listeners;
+ private Map<IStatusListener, IStatusListenerFilter> filters;
+
+ public StatusManager() {
+ this.services = Collections.synchronizedMap(new TreeMap<String, IHealthStatus>());
+ this.listeners = new CopyOnWriteArrayList<IStatusListener>();
+ this.filters = new ConcurrentHashMap<IStatusListener, IStatusListenerFilter>();
+ }
+
+ public void report(IHealthStatus status) {
+ if (status != null) {
+ IHealthStatus storedStatus = services.get(status.getSourceName());
+ if (storedStatus == null) {
+ services.put(status.getSourceName(), status);
+ }
+ // serviceStatus.setHealthStatus(status);
+ for (IStatusListener listener : listeners) {
+ IStatusListenerFilter filter = filters.get(listener);
+ if (filter == null || filter.isInterested(status)) {
+ listener.onStatus(status);
+ }
+ }
+ }
+ }
+
+ public boolean register(IStatusListener listener, IStatusListenerFilter filter) {
+ filters.put(listener, filter);
+ return listeners.add(listener);
+ }
+
+ public boolean register(IStatusListener listener) {
+ return listeners.add(listener);
+ }
+
+ public boolean deregister(IStatusListener listener) {
+ return listeners.remove(listener);
+ }
+
+ public Collection<IHealthStatus> getHealthStatus() {
+
+ return services.values();
+ }
+
+ public boolean isStatusOk() {
+ boolean result = true;
+ for (IHealthStatus status : getHealthStatus()) {
+ result &= status.isOk();
+ }
+ return result;
+ }
+
+ public String getReport() {
+ StringBuilder message = new StringBuilder();
+ Collection<IHealthStatus> serviceInfos = getHealthStatus();
+ for (IHealthStatus status : serviceInfos) {
+ if (!status.isOk()) {
+ message.append(status.getSourceName());
+ message.append(". Error: ");
+ message.append(status.getMessage());
+ message.append("\n");
+ }
+ }
+ return message.toString();
+ }
+
+ /**
+ * @param sourceName
+ * @return health status
+ */
+ public IHealthStatus getHealthStatusByName(String sourceName) {
+ return services.get(sourceName);
+ }
+}
diff --git a/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/internal/Activator.java b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/internal/Activator.java
new file mode 100644
index 00000000000..7368417fd4d
--- /dev/null
+++ b/org.eclipse.osee.framework.logging/src/org/eclipse/osee/framework/logging/internal/Activator.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.framework.logging.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+}
diff --git a/org.eclipse.osee.framework.manager.servlet/.classpath b/org.eclipse.osee.framework.manager.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.manager.servlet/.project b/org.eclipse.osee.framework.manager.servlet/.project
new file mode 100644
index 00000000000..198b4f9538f
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.manager.servlet</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.manager.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.manager.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..54e7f34adec
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Thu May 08 12:25:01 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.manager.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.manager.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..d38354a79b5
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Servlet Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.manager.servlet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.manager.servlet.InternalSystemManagerServletActivator
+Bundle-ActivationPolicy: lazy
+Import-Package: com.lowagie.text,
+ javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.manager.servlet/build.properties b/org.eclipse.osee.framework.manager.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/HttpSystemManagerCreationInfo.java b/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/HttpSystemManagerCreationInfo.java
new file mode 100644
index 00000000000..b399bc45e74
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/HttpSystemManagerCreationInfo.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.framework.manager.servlet;
+
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+
+/**
+ * @author Donald G. Dunne
+ */
+class HttpSystemManagerCreationInfo {
+
+ enum ManagerFunction {
+ userId, sessionId
+ };
+
+ protected final String userId;
+ protected final String sessionId;
+
+ public HttpSystemManagerCreationInfo(HttpServletRequest req) throws OseeArgumentException {
+ userId = req.getParameter("userId");
+ sessionId = req.getParameter("sessionId");
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/InternalSystemManagerServletActivator.java b/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/InternalSystemManagerServletActivator.java
new file mode 100644
index 00000000000..0a7b79d33f6
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/InternalSystemManagerServletActivator.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.framework.manager.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.ISessionManager;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class InternalSystemManagerServletActivator implements BundleActivator {
+ private OseeHttpServiceTracker httpBranchManagementTracker;
+ private ServiceTracker managerTracker;
+ private static InternalSystemManagerServletActivator instance;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+
+ managerTracker = new ServiceTracker(context, ISessionManager.class.getName(), null);
+ managerTracker.open();
+
+ httpBranchManagementTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.MANAGER_CONTEXT, SystemManagerServlet.class);
+ httpBranchManagementTracker.open();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ if (httpBranchManagementTracker != null) {
+ httpBranchManagementTracker.close();
+ httpBranchManagementTracker = null;
+ }
+
+ if (managerTracker != null) {
+ managerTracker.close();
+ managerTracker = null;
+ }
+
+ instance = null;
+ }
+
+ public static InternalSystemManagerServletActivator getInstance() {
+ return instance;
+ }
+
+ public static ISessionManager getSessionManager() {
+ return (ISessionManager) instance.managerTracker.getService();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/SystemManagerServlet.java b/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/SystemManagerServlet.java
new file mode 100644
index 00000000000..f8176ef5481
--- /dev/null
+++ b/org.eclipse.osee.framework.manager.servlet/src/org/eclipse/osee/framework/manager/servlet/SystemManagerServlet.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.manager.servlet;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.data.OseeSession;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.core.server.SessionData;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+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;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SystemManagerServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = 3334123351267606890L;
+
+ private static enum Command {
+ user, delete, alive, invalid, overview;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.OseeHttpServlet#checkAccessControl(javax.servlet.http.HttpServletRequest)
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ // Allow access to all
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ Command command = Command.overview;
+ String cmd = request.getParameter("cmd");
+ if (Strings.isValid(cmd)) {
+ command = Command.valueOf(cmd);
+ }
+ switch (command) {
+ case user:
+ displayUser(request, response);
+ break;
+ case delete:
+ deleteSession(request, response);
+ break;
+ case alive:
+ sessionAlive(request, response);
+ break;
+ default:
+ displayOverview(request, response);
+ break;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(InternalSystemManagerServletActivator.class, Level.SEVERE, String.format(
+ "Error processing request for protocols [%s]", request.toString()), ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ response.getWriter().write(Lib.exceptionToString(ex));
+ } finally {
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+
+ private void displayOverview(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ String requestAddress = request.getLocalAddr();
+ String requestPort = String.valueOf(request.getLocalPort());
+
+ StringBuffer sb = new StringBuffer(1000);
+ try {
+ sb.append(AHTML.heading(2, "OSEE Dashboard"));
+ sb.append(createAnchor(AnchorType.MANAGER_HOME_ANCHOR, null, requestAddress, requestPort));
+ sb.append(AHTML.newline(2));
+ sb.append(getSessionByUserIdEntry(request, response));
+ sb.append(getSessions(requestAddress, requestPort));
+ } catch (Exception ex) {
+ sb.append("Exception: ");
+ sb.append(Lib.exceptionToString(ex));
+ }
+ displayResults(sb.toString(), request, response);
+ }
+
+ private String getSessionByUserIdEntry(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ StringBuffer sb = new StringBuffer(1000);
+ try {
+ sb.append("<form METHOD=GET ACTION=\"http://" + request.getLocalAddr() + ":" + request.getLocalPort() + "/osee/manager\">");
+ sb.append("By UserId: <input TYPE=\"text\" NAME=\"userId\" SIZE=\"10\" MAXLENGTH=\"10\">");
+ sb.append("<input TYPE=\"hidden\" NAME=\"cmd\" VALUE=\"user\">");
+ sb.append("<INPUT TYPE=SUBMIT></form>");
+ } catch (Exception ex) {
+ sb.append("Exception: ");
+ sb.append(Lib.exceptionToString(ex));
+ }
+ return sb.toString();
+ }
+
+ private void displayUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ StringBuffer sb = new StringBuffer(1000);
+ try {
+ HttpSystemManagerCreationInfo info = new HttpSystemManagerCreationInfo(request);
+ String requestAddress = request.getLocalAddr();
+ String requestPort = String.valueOf(request.getLocalPort());
+ String userId = info.userId;
+ if (!Strings.isValid(userId)) {
+ sb.append("Invalid userId [" + userId + "]");
+ } else {
+ sb.append(AHTML.heading(2, "OSEE System Manager"));
+ sb.append(createAnchor(AnchorType.MANAGER_HOME_ANCHOR, null, requestAddress, requestPort));
+ sb.append(AHTML.newline(1));
+ sb.append(getSessionsByUserId(userId, requestAddress, requestPort));
+ }
+ } catch (Exception ex) {
+ sb.append("Exception: ");
+ sb.append(Lib.exceptionToString(ex));
+ }
+ displayResults(sb.toString(), request, response);
+ }
+
+ private void deleteSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ StringBuffer sb = new StringBuffer(1000);
+ try {
+ HttpSystemManagerCreationInfo info = new HttpSystemManagerCreationInfo(request);
+ if (!Strings.isValid(info.sessionId)) {
+ sb.append("Invalid userId [" + info.sessionId + "]");
+ } else {
+ InternalSystemManagerServletActivator.getSessionManager().releaseSessionImmediate(info.sessionId);
+ sb.append("Deleted session [" + info.sessionId + "]");
+ }
+ } catch (OseeCoreException ex) {
+ sb.append("Exception: " + ex.getLocalizedMessage());
+ }
+ displayResults(sb.toString(), request, response);
+ }
+
+ private void sessionAlive(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ StringBuffer sb = new StringBuffer(1000);
+ try {
+ HttpSystemManagerCreationInfo info = new HttpSystemManagerCreationInfo(request);
+ if (!Strings.isValid(info.sessionId)) {
+ sb.append("Invalid userId [" + info.sessionId + "]");
+ } else {
+ try {
+ SessionData sessionData =
+ InternalSystemManagerServletActivator.getSessionManager().getSessionById(info.sessionId);
+ if (sessionData == null) {
+ sb.append("Can't retrieve SessionData for [" + info.sessionId + "]");
+ return;
+ }
+ OseeSession session = sessionData.getSession();
+ if (session == null) {
+ sb.append("Can't retrieve OseeSession for [" + info.sessionId + "]");
+ return;
+ }
+ String clientAddress = session.getClientAddress();
+ String clientPort = String.valueOf(session.getPort());
+ String url = String.format("http://%s:%s/osee/request?cmd=pingId", clientAddress, clientPort);
+ String responseStr = HttpProcessor.acquireString(new URL(url));
+ if (responseStr == null || responseStr.equals("")) {
+ sb.append("[" + info.sessionId + "] not responding to info request");
+ } else if (!responseStr.contains(info.sessionId)) {
+ sb.append("NOT ALIVE - [" + info.sessionId + "] (response, but mismatched sessionId)");
+ } else {
+ sb.append("ALIVE - [" + info.sessionId + "]");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(this.getClass(), Level.SEVERE, ex);
+ sb.append("Exception: " + ex.getLocalizedMessage());
+ }
+ }
+ } catch (OseeCoreException ex) {
+ sb.append("Exception: " + ex.getLocalizedMessage());
+ }
+ displayResults(sb.toString(), request, response);
+ }
+
+ private void displayResults(String results, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+ response.getWriter().write(results + AHTML.newline() + "As of: " + new Date());
+ } catch (Exception ex) {
+ OseeLog.log(InternalSystemManagerServletActivator.class, Level.SEVERE, String.format(
+ "Error processing request for protocols [%s]", request.toString()), ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ response.getWriter().write(Lib.exceptionToString(ex));
+ } finally {
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+
+ private String getSessions(String requestAddress, String requestPort) throws Exception {
+ Collection<SessionData> sessionData =
+ InternalSystemManagerServletActivator.getSessionManager().getAllSessions(true);
+ return createSessionTable(sessionData, "Sessions", requestAddress, requestPort);
+ }
+
+ private String getSessionsByUserId(String userId, String requestAddress, String requestPort) throws Exception {
+ Collection<SessionData> sessionData =
+ InternalSystemManagerServletActivator.getSessionManager().getSessionsByUserId(userId, true);
+ return createSessionTable(sessionData, "Sessions for [" + userId + "]", requestAddress, requestPort);
+ }
+
+ private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm a");
+
+ enum AnchorType {
+ INFO_ANCHOR, ALIVE_ANCHOR, LOG_ANCHOR, DELETE_ANCHOR, MANAGER_HOME_ANCHOR;
+ }
+
+ private String createAnchor(AnchorType anchorType, String sessionId, String address, String port) throws UnsupportedEncodingException {
+ String toReturn = Strings.emptyString();
+ switch (anchorType) {
+ case INFO_ANCHOR:
+ toReturn = String.format("<a href=\"http://%s:%s/osee/request?cmd=info\">info</a>", address, port);
+ break;
+ case LOG_ANCHOR:
+ toReturn = String.format("<a href=\"http://%s:%s/osee/request?cmd=log\">log</a>", address, port);
+ break;
+ case ALIVE_ANCHOR:
+ String eSessionId = URLEncoder.encode(sessionId, "UTF-8");
+ toReturn =
+ String.format("<a href=\"http://%s:%s/%s?cmd=alive&sessionId=%s\">alive</a>", address, port,
+ OseeServerContext.MANAGER_CONTEXT, eSessionId);
+ break;
+ case DELETE_ANCHOR:
+ String encodedSessionId = URLEncoder.encode(sessionId, "UTF-8");
+ toReturn =
+ String.format("<a href=\"http://%s:%s/%s?cmd=delete&sessionId=%s\">delete</a>", address, port,
+ OseeServerContext.MANAGER_CONTEXT, encodedSessionId);
+ break;
+ case MANAGER_HOME_ANCHOR:
+ toReturn =
+ String.format("<a href=\"http://%s:%s/%s\">Home</a>", address, port,
+ OseeServerContext.MANAGER_CONTEXT);
+ break;
+ default:
+ break;
+ }
+ return toReturn;
+ }
+
+ private String createSessionTable(Collection<SessionData> sessionDatas, String title, String requestAddress, String requestPort) throws Exception {
+ StringBuffer sb = new StringBuffer(1000);
+ sb.append(AHTML.heading(3, title));
+ sb.append(AHTML.beginMultiColumnTable(100, 1));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Created", "Cmds", "User", "Version", "Machine",
+ "Last Interaction", "IP", "Port", "Delete"}));
+
+ List<String> items = new ArrayList<String>();
+ for (SessionData sessionData : sessionDatas) {
+ OseeSession session = sessionData.getSession();
+ String sessionId = session.getSessionId();
+ String clientAddress = session.getClientAddress();
+ String clientPort = String.valueOf(session.getPort());
+
+ items.add(AHTML.addRowMultiColumnTable(new String[] {dateFormat.format(session.getCreation()),
+ createCmds(sessionId, clientAddress, clientPort, requestAddress, requestPort), session.getUserId(),
+ session.getVersion(), session.getClientMachineName(),
+ dateFormat.format(session.getLastInteractionDate()), clientAddress, clientPort,
+ createAnchor(AnchorType.DELETE_ANCHOR, sessionId, requestAddress, requestPort)}));
+ }
+ String[] sortedItems = items.toArray(new String[items.size()]);
+ Arrays.sort(sortedItems);
+ for (int x = sortedItems.length - 1; x > 0; x--) {
+ sb.append(sortedItems[x]);
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ return sb.toString();
+ }
+
+ private String createCmds(String sessionId, String clientAddress, String clientPort, String requestAddress, String requestPort) throws Exception {
+ return createAnchor(AnchorType.ALIVE_ANCHOR, sessionId, requestAddress, requestPort) + " - " + createAnchor(
+ AnchorType.INFO_ANCHOR, sessionId, clientAddress, clientPort) + " - " + createAnchor(AnchorType.LOG_ANCHOR,
+ sessionId, clientAddress, clientPort);
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/.classpath b/org.eclipse.osee.framework.messaging.event.skynet/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/.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.framework.messaging.event.skynet/.project b/org.eclipse.osee.framework.messaging.event.skynet/.project
new file mode 100644
index 00000000000..978f420c584
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.messaging.event.skynet</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.messaging.event.skynet/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.messaging.event.skynet/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.messaging.event.skynet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..485b549e114
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Skynet Event Service (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.messaging.event.skynet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.messaging.event.skynet.SkynetEventPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ net.jini,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.jini,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.ui
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.messaging.event.skynet,
+ org.eclipse.osee.framework.messaging.event.skynet.event,
+ org.eclipse.osee.framework.messaging.event.skynet.filter,
+ org.eclipse.osee.framework.messaging.event.skynet.service
+Bundle-Description: Skynet Event Service - Skynet Cache Network Manager
+Bundle-Vendor: Eclipse.org
+Bundle-ClassPath: skynetEvent.jar
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/build.properties b/org.eclipse.osee.framework.messaging.event.skynet/build.properties
new file mode 100644
index 00000000000..afc89d080b3
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/build.properties
@@ -0,0 +1,6 @@
+source.skynetEvent.jar = src/
+output.skynetEvent.jar = bin/
+bin.includes = META-INF/,\
+ skynetEvent.jar,\
+ plugin.xml,\
+ src/
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/plugin.xml b/org.eclipse.osee.framework.messaging.event.skynet/plugin.xml
new file mode 100644
index 00000000000..b37257d9042
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension
+ point="org.eclipse.osee.framework.jini.JiniInterface">
+ <Interface classname="org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventService"/>
+ <Interface classname="org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent"/>
+ <Interface classname="org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventListener"/>
+ <Interface classname="org.eclipse.osee.framework.messaging.event.skynet.event.SkynetAttributeChange"/>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.jini.JiniInterface">
+ <RegisterBundle/>
+ </extension>
+ <extension
+ id="EventService"
+ name="EventService"
+ point="org.eclipse.core.runtime.applications">
+ <application>
+ <run class="org.eclipse.osee.framework.messaging.event.skynet.service.SkynetEventServicePlatformRunnable"/>
+ </application>
+ </extension>
+ <extension
+ id="EventServiceProd"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.osee.framework.messaging.event.skynet.EventService"
+ name="EventServiceProd"/>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ASkynetEventListener.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ASkynetEventListener.java
new file mode 100644
index 00000000000..193ee3ae62d
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ASkynetEventListener.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.framework.messaging.event.skynet;
+
+import java.rmi.RemoteException;
+
+/**
+ * Client callback base class.
+ *
+ * @author Robert A. Fisher
+ */
+public abstract class ASkynetEventListener implements ISkynetEventListener {
+
+ private final Long uid;
+
+ public ASkynetEventListener() {
+ this.uid = (long) (Math.random() * Long.MAX_VALUE);
+ }
+
+ /**
+ * Since the listeners are hashed on the service side, it is necessary to force the equals and hashcode operators to
+ * work in a particular manner.
+ */
+ @Override
+ public final boolean equals(Object obj) {
+ if (obj instanceof ASkynetEventListener) {
+ return ((ASkynetEventListener) obj).uid.equals(this.uid);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return uid.hashCode();
+ }
+
+ /**
+ * Callback for the client to process remote skynet events. The array will contain a list of events to which this
+ * listener is subscribed.
+ *
+ * @throws RemoteException
+ */
+ public abstract void onEvent(ISkynetEvent[] events) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetArtifactEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetArtifactEvent.java
new file mode 100644
index 00000000000..01821d4e967
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetArtifactEvent.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.framework.messaging.event.skynet;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface ISkynetArtifactEvent extends ISkynetEvent {
+
+ public String getFactoryName();
+
+ public int getArtId();
+
+ public int getArtTypeId();
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEvent.java
new file mode 100644
index 00000000000..a1e4ac46800
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEvent.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.framework.messaging.event.skynet;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkSender;
+
+/**
+ * All events implement this interface.
+ *
+ * @author Robert A. Fisher
+ */
+@SuppressWarnings("unchecked")
+public interface ISkynetEvent extends Serializable, Comparable {
+ public static final ISkynetEvent[] EMPTY_ARRAY = new ISkynetEvent[0];
+
+ public NetworkSender getNetworkSender();
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventListener.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventListener.java
new file mode 100644
index 00000000000..7bfa3648914
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventListener.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.framework.messaging.event.skynet;
+
+import java.io.Serializable;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface ISkynetEventListener extends Remote, Serializable {
+
+ public abstract void onEvent(ISkynetEvent[] events) throws RemoteException;
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventService.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventService.java
new file mode 100644
index 00000000000..f19328a13ca
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetEventService.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.framework.messaging.event.skynet;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.framework.messaging.event.skynet.filter.IEventFilter;
+
+public interface ISkynetEventService extends Remote {
+
+ // TODO all calls to the server go here
+ /**
+ * Register to receive events based on filters.
+ *
+ * @param filters TODO
+ */
+ public void register(ISkynetEventListener listener, IEventFilter... filters) throws RemoteException;
+
+ /**
+ * Deregister to receive events based on filters.
+ *
+ * @param filters TODO
+ */
+ public void deregister(ISkynetEventListener listener, IEventFilter... filters) throws RemoteException;
+
+ /**
+ * Pass events to the service to be disemminated.
+ *
+ * @param events
+ */
+ public void kick(ISkynetEvent[] events, ISkynetEventListener... except) throws RemoteException;
+
+ public boolean isAlive() throws RemoteException;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetRelationLinkEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetRelationLinkEvent.java
new file mode 100644
index 00000000000..261e6c9e23f
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/ISkynetRelationLinkEvent.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.framework.messaging.event.skynet;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface ISkynetRelationLinkEvent extends ISkynetEvent {
+
+ public int getArtAId();
+
+ public int getArtATypeId();
+
+ public int getArtBId();
+
+ public int getArtBTypeId();
+
+ public Integer getRelId();
+
+ public Integer getGammaId();
+
+ public int getRelTypeId();
+
+ public int getBranchId();
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/Sample.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/Sample.java
new file mode 100644
index 00000000000..a789cab3771
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/Sample.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.framework.messaging.event.skynet;
+
+import java.io.Serializable;
+import java.rmi.RemoteException;
+import java.util.Date;
+import org.eclipse.osee.framework.jini.discovery.IServiceLookupListener;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import org.eclipse.osee.framework.jini.util.OseeJini;
+import net.jini.core.lookup.ServiceItem;
+
+public class Sample implements IServiceLookupListener, Serializable {
+ private static final long serialVersionUID = 8195127334711471268L;
+
+ private ISkynetEventService ses;
+ private ASkynetEventListener listener;
+
+ public Sample() {
+ super();
+
+ listener = new EventEchoer();
+
+ // TODO this may take a very long time ... like FOREVER ... perform timeout ~5s if it is an absolutely necessary service
+ // ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).addListener(this, ISkynetEventService.class);
+ ServiceDataStore.getNonEclipseInstance().addListener(this, ISkynetEventService.class);
+
+ for (;;) {
+ try {
+ Thread.sleep(5000);
+ System.out.print(new Date() + ":");
+ if (ses == null) {
+ System.out.println("Service not connected");
+ } else {
+ System.out.println("kick");
+ try {
+ // ses.kick(new ISkynetEvent[]{new RemoteArtifactModifiedEvent(1, 2, 3, 4, "bob")}, listener);
+ } catch (Exception e) {
+ e.printStackTrace();
+ ses = null;
+ }
+ }
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ }
+
+ public void serviceAdded(ServiceItem serviceItem) {
+ ses = (ISkynetEventService) serviceItem.service;
+ try {
+ ses.register((ISkynetEventListener) OseeJini.getRemoteReference(listener));
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void serviceChanged(ServiceItem serviceItem) {
+ // like when the Entry[] changes
+ System.out.println("***Service changed");
+ serviceAdded(serviceItem);
+ }
+
+ public void serviceRemoved(ServiceItem serviceItem) {
+ // Ensure the lookup server didn't just lose contact
+ // try {
+ // ses.someStupidCallLikeGetId();
+ // } catch(RemoteException ex) {
+ ses = null;
+ // }
+
+ }
+
+ public static void main(String[] args) {
+ new Sample();
+ }
+
+ private class EventEchoer extends ASkynetEventListener {
+ private static final long serialVersionUID = 2251382843127874925L;
+
+ @Override
+ public void onEvent(ISkynetEvent[] events) throws RemoteException {
+ System.out.println("Events received at " + new Date());
+
+ for (ISkynetEvent event : events)
+ System.out.println("\t" + event);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/SkynetEventPlugin.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/SkynetEventPlugin.java
new file mode 100644
index 00000000000..d0efb50e3c1
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/SkynetEventPlugin.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.framework.messaging.event.skynet;
+
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class SkynetEventPlugin extends OseeActivator {
+
+ private static SkynetEventPlugin pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.messaging.event.skynet";
+
+ public SkynetEventPlugin() {
+ super();
+ pluginInstance = this;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static SkynetEventPlugin getInstance() {
+ return pluginInstance;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/ConfigurationModifiedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/ConfigurationModifiedEvent.java
new file mode 100644
index 00000000000..66ee9ac3489
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/ConfigurationModifiedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ConfigurationModifiedEvent extends SkynetEventBase {
+ private static final long serialVersionUID = 4199206743701390599L;
+
+ /**
+ * @param author
+ */
+ public ConfigurationModifiedEvent(NetworkSender networkSender) {
+ super(networkSender);
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkAccessControlArtifactsEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkAccessControlArtifactsEvent.java
new file mode 100644
index 00000000000..f94caae3ba9
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkAccessControlArtifactsEvent.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.framework.messaging.event.skynet.event;
+
+import java.util.Collection;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NetworkAccessControlArtifactsEvent extends SkynetArtifactsEventBase {
+ private static final long serialVersionUID = -4325821466558180270L;
+ private final String accessControlModType;
+
+ /**
+ * @return the accessControlModType
+ */
+ public String getAccessControlModTypeName() {
+ return accessControlModType;
+ }
+
+ /**
+ * @param branchId
+ * @param artifactIds
+ * @param toArtifactTypeId
+ * @param author
+ */
+ public NetworkAccessControlArtifactsEvent(String accessControlModType, int branchId, Collection<Integer> artifactIds, Collection<Integer> artifactTypeIds, NetworkSender networkSender) {
+ super(branchId, artifactIds, artifactTypeIds, networkSender);
+ this.accessControlModType = accessControlModType;
+ }
+
+ /**
+ * @return Returns the serialVersionUID.
+ */
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactAddedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactAddedEvent.java
new file mode 100644
index 00000000000..0544a91cf5d
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactAddedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class NetworkArtifactAddedEvent extends SkynetArtifactEventBase {
+ private static final long serialVersionUID = -4325821466558180270L;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param artId
+ * @param artTypeId
+ * @param author TODO
+ */
+ public NetworkArtifactAddedEvent(int branchId, int transactionId, int artId, int artTypeId, String factoryName, NetworkSender networkSender) {
+ super(branchId, transactionId, artId, artTypeId, factoryName, networkSender);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof NetworkArtifactAddedEvent) {
+ return (getArtId() == (((NetworkArtifactAddedEvent) obj).getArtId()));
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return getArtId();
+ }
+
+ /**
+ * @return Returns the serialVersionUID.
+ */
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactChangeTypeEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactChangeTypeEvent.java
new file mode 100644
index 00000000000..633b2b900d7
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactChangeTypeEvent.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.framework.messaging.event.skynet.event;
+
+import java.util.Collection;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NetworkArtifactChangeTypeEvent extends SkynetArtifactsEventBase {
+ private static final long serialVersionUID = -4325821466558180270L;
+
+ private final int toArtifactTypeId;
+
+ /**
+ * @return the toArtifactTypeId
+ */
+ public int getToArtifactTypeId() {
+ return toArtifactTypeId;
+ }
+
+ /**
+ * @param branchId
+ * @param artifactIds
+ * @param toArtifactTypeId
+ * @param author
+ */
+ public NetworkArtifactChangeTypeEvent(int branchId, Collection<Integer> artifactIds, Collection<Integer> artifactTypeIds, int toArtifactTypeId, NetworkSender networkSender) {
+ super(branchId, artifactIds, artifactTypeIds, networkSender);
+ this.toArtifactTypeId = toArtifactTypeId;
+ }
+
+ /**
+ * @return Returns the serialVersionUID.
+ */
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactDeletedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactDeletedEvent.java
new file mode 100644
index 00000000000..be2e6e18258
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactDeletedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class NetworkArtifactDeletedEvent extends SkynetArtifactEventBase {
+ private static final long serialVersionUID = 568951803773151575L;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param artId
+ * @param artTypeId
+ * @param author TODO
+ */
+ public NetworkArtifactDeletedEvent(int branchId, int transactionId, int artId, int artTypeId, String factoryName, NetworkSender networkSender) {
+ super(branchId, transactionId, artId, artTypeId, factoryName, networkSender);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactModifiedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactModifiedEvent.java
new file mode 100644
index 00000000000..27bbc3df3c3
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactModifiedEvent.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.framework.messaging.event.skynet.event;
+
+import java.util.Collection;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class NetworkArtifactModifiedEvent extends SkynetArtifactEventBase {
+ private static final long serialVersionUID = -4325821466558180270L;
+ private final Collection<SkynetAttributeChange> attributeValues;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param artId
+ * @param artTypeId
+ * @param author TODO
+ */
+ public NetworkArtifactModifiedEvent(int branchId, int transactionId, int artId, int artTypeId, String factoryName, Collection<SkynetAttributeChange> attributeValues, NetworkSender networkSender) {
+ super(branchId, transactionId, artId, artTypeId, factoryName, networkSender);
+
+ this.attributeValues = attributeValues;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof NetworkArtifactModifiedEvent) {
+ return (getArtId() == (((NetworkArtifactModifiedEvent) obj).getArtId()));
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return getArtId();
+ }
+
+ /**
+ * @return Returns the serialVersionUID.
+ */
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ /**
+ * @return Returns the attributeValues.
+ */
+ public Collection<SkynetAttributeChange> getAttributeChanges() {
+ return attributeValues;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactPurgeEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactPurgeEvent.java
new file mode 100644
index 00000000000..2220d5f4615
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkArtifactPurgeEvent.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.framework.messaging.event.skynet.event;
+
+import java.util.Collection;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NetworkArtifactPurgeEvent extends SkynetArtifactsEventBase {
+ private static final long serialVersionUID = -4325821466558180270L;
+
+ /**
+ * @param branchId
+ * @param artifactIds
+ * @param toArtifactTypeId
+ * @param author
+ */
+ public NetworkArtifactPurgeEvent(int branchId, Collection<Integer> artifactIds, Collection<Integer> artifactTypeIds, NetworkSender networkSender) {
+ super(branchId, artifactIds, artifactTypeIds, networkSender);
+ }
+
+ /**
+ * @return Returns the serialVersionUID.
+ */
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkBroadcastEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkBroadcastEvent.java
new file mode 100644
index 00000000000..a51867eb8aa
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkBroadcastEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class NetworkBroadcastEvent extends SkynetEventBase {
+
+ private static final long serialVersionUID = 4199206432501390599L;
+ private String message;
+ private final String broadcastEventType;
+ private final String[] userIds;
+
+ /**
+ * @return the broadcastEventType
+ */
+ public String getBroadcastEventTypeName() {
+ return broadcastEventType;
+ }
+
+ public NetworkBroadcastEvent(String broadcastEventType, String message, String[] userIds, NetworkSender networkSender) {
+ super(networkSender);
+ this.broadcastEventType = broadcastEventType;
+ this.message = message;
+ this.userIds = userIds;
+ }
+
+ public NetworkBroadcastEvent(String broadcastEventType, String message, NetworkSender networkSender) {
+ this(broadcastEventType, message, new String[] {}, networkSender);
+ }
+
+ /**
+ * @return the userIds
+ */
+ public String[] getUserIds() {
+ return userIds;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkCommitBranchEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkCommitBranchEvent.java
new file mode 100644
index 00000000000..343a40b8473
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkCommitBranchEvent.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.framework.messaging.event.skynet.event;
+
+
+/**
+ * Skynet messaging event; Should not be subscribed to by OSEE applications.
+ *
+ * @author Donald G. Dunne
+ */
+public class NetworkCommitBranchEvent extends SkynetEventBase {
+ private static final long serialVersionUID = 8339596149601667894L;
+ private final int branchId;
+
+ /**
+ * @param branchId
+ * @param author
+ */
+ public NetworkCommitBranchEvent(int branchId, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkDeletedBranchEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkDeletedBranchEvent.java
new file mode 100644
index 00000000000..9b1e23886b1
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkDeletedBranchEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * Skynet messaging event; Should not be subscribed to by OSEE applications.
+ *
+ * @author Jeff C. Phillips
+ */
+public class NetworkDeletedBranchEvent extends SkynetEventBase {
+ private static final long serialVersionUID = 4651718722048388742L;
+ private final int branchId;
+
+ public NetworkDeletedBranchEvent(int branchId, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+ }
+
+ public int getTransactionId() {
+ return 0;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkMergeBranchConflictResolvedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkMergeBranchConflictResolvedEvent.java
new file mode 100644
index 00000000000..cd8fffad971
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkMergeBranchConflictResolvedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * Skynet messaging event; Should not be subscribed to by OSEE applications.
+ *
+ * @author Donald G. Dunne
+ */
+public class NetworkMergeBranchConflictResolvedEvent extends SkynetEventBase {
+ private static final long serialVersionUID = 8339596149601337894L;
+ private final int branchId;
+
+ public NetworkMergeBranchConflictResolvedEvent(int branchId, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewBranchEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewBranchEvent.java
new file mode 100644
index 00000000000..867a20dc96f
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewBranchEvent.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.framework.messaging.event.skynet.event;
+
+
+/**
+ * Skynet messaging event; Should not be subscribed to by OSEE applications.
+ *
+ * @author Jeff C. Phillips
+ */
+public class NetworkNewBranchEvent extends SkynetEventBase {
+ private static final long serialVersionUID = 8339596149601337894L;
+ private final int branchId;
+
+ public NetworkNewBranchEvent(int branchId, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewRelationLinkEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewRelationLinkEvent.java
new file mode 100644
index 00000000000..8832a4b5056
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkNewRelationLinkEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Donald G. Dunne
+ * @author Jeff C. Phillips
+ */
+public class NetworkNewRelationLinkEvent extends SkynetRelationLinkEventBase {
+
+ private static final long serialVersionUID = -519877422249674503L;
+
+ private final String rationale;
+ private String aGuid;
+ private String aHumanId;
+ private String bHumanId;
+ private String bGuid;
+ private final String descriptorName;
+ private final int aOrder;
+ private final int bOrder;
+ private final int relTypeId;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param relId
+ * @param artAId
+ * @param artBId
+ * @param author
+ */
+
+ public NetworkNewRelationLinkEvent(int gammaId, int branchId, Integer relId, int artAId, int artATypeId, int artBId, int artBTypeId, String rationale, int aOrder, int bOrder, int relTypeId, String descriptorName, NetworkSender networkSender) {
+ super(relTypeId, gammaId, branchId, relId, artAId, artATypeId, artBId, artBTypeId, networkSender);
+
+ this.rationale = rationale;
+ this.aOrder = aOrder;
+ this.bOrder = bOrder;
+ this.relTypeId = relTypeId;
+ this.descriptorName = descriptorName;
+ }
+
+ /**
+ * @return Returns the aOrder.
+ */
+ public int getAOrder() {
+ return aOrder;
+ }
+
+ /**
+ * @return Returns the bOrder.
+ */
+ public int getBOrder() {
+ return bOrder;
+ }
+
+ /**
+ * @return Returns the rationale.
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ /**
+ * @return Returns the relTypeId.
+ */
+ @Override
+ public int getRelTypeId() {
+ return relTypeId;
+ }
+
+ /**
+ * @return Returns the aGuid.
+ */
+ public String getAGuid() {
+ return aGuid;
+ }
+
+ /**
+ * @return Returns the bGuid.
+ */
+ public String getBGuid() {
+ return bGuid;
+ }
+
+ /**
+ * @return Returns the aHuamnId.
+ */
+ public String getAHumanId() {
+ return aHumanId;
+ }
+
+ /**
+ * @return Returns the bHumanId.
+ */
+ public String getBHumanId() {
+ return bHumanId;
+ }
+
+ public String getDescriptorName() {
+ return descriptorName;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkDeletedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkDeletedEvent.java
new file mode 100644
index 00000000000..0abaf1dc6dd
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkDeletedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Donald G. Dunne
+ * @author Robert A. Fisher
+ */
+public class NetworkRelationLinkDeletedEvent extends SkynetRelationLinkEventBase {
+ private static final long serialVersionUID = -1451567913757261791L;
+
+ public NetworkRelationLinkDeletedEvent(int relTypeId, int gammaId, int branchId, int relId, int artAId, int artATypeId, int artBId, int artBTypeId, NetworkSender networkSender) {
+ super(relTypeId, gammaId, branchId, relId, artAId, artATypeId, artBId, artBTypeId, networkSender);
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkOrderModifiedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkOrderModifiedEvent.java
new file mode 100644
index 00000000000..ada68614a56
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkOrderModifiedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Donald G. Dunne
+ * @author Robert A. Fisher
+ */
+public class NetworkRelationLinkOrderModifiedEvent extends SkynetRelationLinkEventBase {
+ private static final long serialVersionUID = 548299278567054333L;
+
+ private final String rationale;
+ int aOrder;
+ int bOrder;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param relId
+ * @param artAId
+ * @param artBId
+ * @param author
+ * @param relTypeId
+ */
+ public NetworkRelationLinkOrderModifiedEvent(int gammaId, int branchId, int relId, int artAId, int artATypeId, int artBId, int artBTypeId, String rationale, int aOrder, int bOrder, NetworkSender networkSender, int relTypeId) {
+ super(relTypeId, gammaId, branchId, relId, artAId, artATypeId, artBId, artBTypeId, networkSender);
+
+ this.rationale = rationale;
+ this.aOrder = aOrder;
+ this.bOrder = bOrder;
+ }
+
+ /**
+ * @return Returns the aOrder.
+ */
+ public int getAOrder() {
+ return aOrder;
+ }
+
+ /**
+ * @return Returns the bOrder.
+ */
+ public int getBOrder() {
+ return bOrder;
+ }
+
+ /**
+ * @return Returns the rationale.
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof NetworkRelationLinkOrderModifiedEvent) {
+ return (getRelId() == (((NetworkRelationLinkOrderModifiedEvent) obj).getRelId()));
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return getRelId();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkRationalModifiedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkRationalModifiedEvent.java
new file mode 100644
index 00000000000..02b0739588f
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRelationLinkRationalModifiedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Donald G. Dunne
+ * @author Robert A. Fisher
+ */
+public class NetworkRelationLinkRationalModifiedEvent extends SkynetRelationLinkEventBase {
+ private static final long serialVersionUID = 548299278567054333L;
+
+ private final String rationale;
+ int aOrder;
+ int bOrder;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param relId
+ * @param artAId
+ * @param artBId
+ * @param author
+ * @param relTypeId
+ */
+ public NetworkRelationLinkRationalModifiedEvent(int gammaId, int branchId, int relId, int artAId, int artATypeId, int artBId, int artBTypeId, String rationale, int aOrder, int bOrder, NetworkSender networkSender, int relTypeId) {
+ super(relTypeId, gammaId, branchId, relId, artAId, artATypeId, artBId, artBTypeId, networkSender);
+
+ this.rationale = rationale;
+ this.aOrder = aOrder;
+ this.bOrder = bOrder;
+ }
+
+ /**
+ * @return Returns the aOrder.
+ */
+ public int getAOrder() {
+ return aOrder;
+ }
+
+ /**
+ * @return Returns the bOrder.
+ */
+ public int getBOrder() {
+ return bOrder;
+ }
+
+ /**
+ * @return Returns the rationale.
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof NetworkRelationLinkRationalModifiedEvent) {
+ return (getRelId() == (((NetworkRelationLinkRationalModifiedEvent) obj).getRelId()));
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return getRelId();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRenameBranchEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRenameBranchEvent.java
new file mode 100644
index 00000000000..130334daccb
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkRenameBranchEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * Skynet messaging event; Should not be subscribed to by OSEE applications.
+ *
+ * @author Donald G. Dunne
+ */
+public class NetworkRenameBranchEvent extends SkynetEventBase {
+ private static final long serialVersionUID = 8339596149601997894L;
+ private int branchId;
+ private String branchName;
+ private String shortName;
+
+ public NetworkRenameBranchEvent(int branchId, NetworkSender networkSender, String branchName, String shortName) {
+ super(networkSender);
+ this.branchId = branchId;
+ this.branchName = branchName;
+ this.shortName = shortName;
+ }
+
+ public int getTransactionId() {
+ return 0;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ @Override
+ public int compareTo(Object o) {
+ return 0;
+ }
+
+ /**
+ * @return the branchName
+ */
+ public String getBranchName() {
+ return branchName;
+ }
+
+ /**
+ * @param branchName the branchName to set
+ */
+ public void setBranchName(String branchName) {
+ this.branchName = branchName;
+ }
+
+ /**
+ * @return the shortName
+ */
+ public String getShortName() {
+ return shortName;
+ }
+
+ /**
+ * @param shortName the shortName to set
+ */
+ public void setShortName(String shortName) {
+ this.shortName = shortName;
+ }
+
+ /**
+ * @param branchId the branchId to set
+ */
+ public void setBranchId(int branchId) {
+ this.branchId = branchId;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkSender.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkSender.java
new file mode 100644
index 00000000000..ec793ba193b
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkSender.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.framework.messaging.event.skynet.event;
+
+import java.io.Serializable;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NetworkSender implements Serializable {
+
+ private static final long serialVersionUID = 1908598443523663604L;
+ public Object sourceObject;
+ public String sessionId;
+ public String machineName;
+ public String userId;
+ public String machineIp;
+ public String clientVersion;
+ public int port;
+
+ public NetworkSender(Object sourceObject, String sessionId, String machineName, String userId, String machineIp, int port, String clientVersion) {
+ this.sessionId = sessionId;
+ this.sourceObject = sourceObject;
+ this.machineName = machineName;
+ this.userId = userId;
+ this.machineIp = machineIp;
+ this.port = port;
+ this.clientVersion = clientVersion;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkTransactionDeletedEvent.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkTransactionDeletedEvent.java
new file mode 100644
index 00000000000..beb3546816a
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/NetworkTransactionDeletedEvent.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class NetworkTransactionDeletedEvent extends SkynetEventBase {
+
+ private static final long serialVersionUID = -2467438797592036593L;
+ private final int[] transactionIds;
+
+ /**
+ * @return the transactionIds
+ */
+ public int[] getTransactionIds() {
+ return transactionIds;
+ }
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param author
+ */
+ public NetworkTransactionDeletedEvent(NetworkSender networkSender, int[] transactionIds) {
+ super(networkSender);
+ this.transactionIds = transactionIds;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactEventBase.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactEventBase.java
new file mode 100644
index 00000000000..f7fb6816553
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactEventBase.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.framework.messaging.event.skynet.event;
+
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetArtifactEvent;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SkynetArtifactEventBase extends SkynetEventBase implements ISkynetArtifactEvent {
+ private static final long serialVersionUID = 7923550763258313718L;
+
+ private final int artId;
+ private final int artTypeId;
+ private final String factoryName;
+ private final int transactionId;
+ private final int branchId;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param artId
+ * @param artTypeId
+ * @param author TODO
+ */
+ public SkynetArtifactEventBase(int branchId, int transactionId, int artId, int artTypeId, String factoryName, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+
+ this.artId = artId;
+ this.artTypeId = artTypeId;
+ this.factoryName = factoryName;
+ this.transactionId = transactionId;
+ }
+
+ /**
+ * @return the branchId
+ */
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /**
+ * @return Returns the transactionId.
+ */
+ public int getTransactionId() {
+ return transactionId;
+ }
+
+ /**
+ * @return Returns the artId.
+ */
+ public int getArtId() {
+ return artId;
+ }
+
+ /**
+ * @return Returns the artTypeId.
+ */
+ public int getArtTypeId() {
+ return artTypeId;
+ }
+
+ public String getFactoryName() {
+ return factoryName;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactsEventBase.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactsEventBase.java
new file mode 100644
index 00000000000..fba08b6a395
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetArtifactsEventBase.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.framework.messaging.event.skynet.event;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class SkynetArtifactsEventBase extends SkynetEventBase implements ISkynetEvent {
+ private static final long serialVersionUID = 7923550763258313718L;
+
+ private final Collection<Integer> artifactTypeIds;
+ private final Collection<Integer> artifactIds;
+ private final int branchId;
+
+ /**
+ * @param branchId
+ * @param artifactIds
+ * @param artifactTypeIds
+ * @param author
+ */
+ public SkynetArtifactsEventBase(int branchId, Collection<Integer> artifactIds, Collection<Integer> artifactTypeIds, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+ this.artifactIds = artifactIds;
+ this.artifactTypeIds = artifactTypeIds;
+ }
+
+ /**
+ * @return the branchId
+ */
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /**
+ * @return the artifactTypeIds
+ */
+ public Collection<Integer> getArtifactTypeIds() {
+ return artifactTypeIds;
+ }
+
+ /**
+ * @return the artifactIds
+ */
+ public Collection<Integer> getArtifactIds() {
+ return artifactIds;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof NetworkArtifactPurgeEvent) {
+ return artifactIds.hashCode() == ((NetworkArtifactPurgeEvent) obj).getArtifactIds().hashCode() && artifactTypeIds.hashCode() == ((NetworkArtifactPurgeEvent) obj).getArtifactTypeIds().hashCode();
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return artifactIds.hashCode() + artifactTypeIds.hashCode();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetAttributeChange.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetAttributeChange.java
new file mode 100644
index 00000000000..d2ff37a97dc
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetAttributeChange.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.framework.messaging.event.skynet.event;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class SkynetAttributeChange implements SkynetChange {
+ private static final long serialVersionUID = 7269483275150734396L;
+ private final int typeId;
+ private final boolean deleted;
+ private final int attributeId;
+ private final int gammaId;
+ private final Object[] value;
+
+ /**
+ * @return the deleted
+ */
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ /**
+ * @param typeId
+ * @param value
+ */
+ public SkynetAttributeChange(int typeId, Object[] value, boolean deleted, int attributeId, int gammaId) {
+ super();
+ this.typeId = typeId;
+ this.value = value;
+ this.deleted = deleted;
+ this.attributeId = attributeId;
+ this.gammaId = gammaId;
+ }
+
+ @Override
+ public String toString() {
+ return typeId + "(" + attributeId + ")" + " => " + value;
+ }
+
+ /**
+ * @return Returns the typeId.
+ */
+ public int getTypeId() {
+ return typeId;
+ }
+
+ /**
+ * @return Returns the value.
+ */
+ public Object[] getData() {
+ return value;
+ }
+
+ public int getAttributeId() {
+ return attributeId;
+ }
+
+ /**
+ * @return Returns the gammaId.
+ */
+ public int getGammaId() {
+ return gammaId;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetChange.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetChange.java
new file mode 100644
index 00000000000..9491277abbe
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetChange.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.framework.messaging.event.skynet.event;
+
+import java.io.Serializable;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public interface SkynetChange extends Serializable {
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetEventBase.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetEventBase.java
new file mode 100644
index 00000000000..70c45b54f2d
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetEventBase.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.framework.messaging.event.skynet.event;
+
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SkynetEventBase implements ISkynetEvent {
+ private static final long serialVersionUID = -5381855085551886510L;
+
+ private final NetworkSender networkSender;
+
+ /**
+ * @return the networkSender
+ */
+ public NetworkSender getNetworkSender() {
+ return networkSender;
+ }
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param author
+ */
+ public SkynetEventBase(NetworkSender networkSender) {
+ this.networkSender = networkSender;
+ }
+
+ public int compareTo(Object o) {
+
+ if (o instanceof NetworkArtifactDeletedEvent) {
+ return 1;
+ } else if (o instanceof SkynetArtifactEventBase) {
+ return 1;
+ } else {
+ return -1;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetRelationLinkEventBase.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetRelationLinkEventBase.java
new file mode 100644
index 00000000000..41ca9b3177e
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/event/SkynetRelationLinkEventBase.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.framework.messaging.event.skynet.event;
+
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetRelationLinkEvent;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SkynetRelationLinkEventBase extends SkynetEventBase implements ISkynetRelationLinkEvent {
+ private static final long serialVersionUID = 154870900652138769L;
+
+ private final Integer relId;
+ private final int relTypeId;
+ private final int artAId;
+ private final int artATypeId;
+ private final int artBId;
+ private final int artBTypeId;
+ private final int gammaId;
+ private final int branchId;
+
+ /**
+ * @param branchId
+ * @param transactionId
+ * @param relId
+ * @param artAId
+ * @param artBId
+ * @param networkSender TODO
+ */
+ public SkynetRelationLinkEventBase(int relTypeId, int gammaId, int branchId, Integer relId, int artAId, int artATypeId, int artBId, int artBTypeId, NetworkSender networkSender) {
+ super(networkSender);
+ this.branchId = branchId;
+ this.relId = relId;
+ this.artAId = artAId;
+ this.artATypeId = artATypeId;
+ this.artBId = artBId;
+ this.gammaId = gammaId;
+ this.relTypeId = relTypeId;
+ this.artBTypeId = artBTypeId;
+ }
+
+ /**
+ * @return the branchId
+ */
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /**
+ * @return the artATypeId
+ */
+ public int getArtATypeId() {
+ return artATypeId;
+ }
+
+ /**
+ * @return the artBTypeId
+ */
+ public int getArtBTypeId() {
+ return artBTypeId;
+ }
+
+ /**
+ * @return Returns the artAId.
+ */
+ public int getArtAId() {
+ return artAId;
+ }
+
+ /**
+ * @return Returns the artBId.
+ */
+ public int getArtBId() {
+ return artBId;
+ }
+
+ /**
+ * @return Returns the relId.
+ */
+ public Integer getRelId() {
+ return relId;
+ }
+
+ public Integer getGammaId() {
+ return gammaId;
+ }
+
+ /**
+ * @return the relTypeId
+ */
+ public int getRelTypeId() {
+ return relTypeId;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/filter/IEventFilter.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/filter/IEventFilter.java
new file mode 100644
index 00000000000..015de98fca4
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/filter/IEventFilter.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.framework.messaging.event.skynet.filter;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IEventFilter extends Serializable {
+
+ /**
+ * Determine if the event meets the requirement of this filter.
+ *
+ * @param event The event to inspect.
+ * @return boolean
+ */
+ public boolean accepts(ISkynetEvent event);
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/AcceptAllEventFilter.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/AcceptAllEventFilter.java
new file mode 100644
index 00000000000..8fee16324b9
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/AcceptAllEventFilter.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.messaging.event.skynet.service;
+
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.filter.IEventFilter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AcceptAllEventFilter implements IEventFilter {
+
+ private static final long serialVersionUID = -7624321113355047868L;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.event.skynet.filter.IEventFilter#accepts(org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent)
+ */
+ @Override
+ public boolean accepts(ISkynetEvent event) {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/EventDispatchRunnable.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/EventDispatchRunnable.java
new file mode 100644
index 00000000000..27bab99a29a
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/EventDispatchRunnable.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.framework.messaging.event.skynet.service;
+
+import java.io.IOException;
+import java.rmi.RemoteException;
+import java.text.NumberFormat;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventListener;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventService;
+import org.eclipse.osee.framework.messaging.event.skynet.SkynetEventPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EventDispatchRunnable implements Runnable {
+ private final ISkynetEventService service;
+ private final HashCollection<ISkynetEventListener, ISkynetEvent> toSend;
+
+ public EventDispatchRunnable(final ISkynetEventService service, final HashCollection<ISkynetEventListener, ISkynetEvent> toSend) {
+ this.service = service;
+ this.toSend = toSend;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (ISkynetEventListener listener : toSend.keySet()) {
+ if (listener != null) {
+ try {
+ Collection<ISkynetEvent> values = toSend.getValues(listener);
+ if (values != null && !values.isEmpty()) {
+ listener.onEvent(values.toArray(new ISkynetEvent[values.size()]));
+ }
+ } catch (IOException ex) {
+ try {
+ service.deregister(listener);
+ OseeLog.log(SkynetEventPlugin.class, Level.WARNING,
+ "Listener unavailable - removing it from lookup:\n" + ex.getLocalizedMessage());
+ } catch (RemoteException ex1) {
+ // Do Nothing - this should never happen
+ } finally {
+ NumberFormat numFormat = NumberFormat.getInstance();
+ long totalMem = Runtime.getRuntime().totalMemory();
+ long freeMem = Runtime.getRuntime().freeMemory();
+ String totalMemory = numFormat.format(totalMem);
+ String usedMemory = numFormat.format(totalMem - freeMem);
+ String message =
+ String.format("JVM Heap space allocated: %s\nJVM Heap space used: %s\n", totalMemory,
+ usedMemory);
+ OseeLog.log(SkynetEventPlugin.class, Level.INFO, message);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetEventPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventService.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventService.java
new file mode 100644
index 00000000000..080513c9a0f
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventService.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.framework.messaging.event.skynet.service;
+
+import java.rmi.RemoteException;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+import net.jini.core.entry.Entry;
+import net.jini.lookup.entry.Comment;
+import net.jini.lookup.entry.Name;
+import net.jini.lookup.entry.ServiceInfo;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jini.JiniClassServer;
+import org.eclipse.osee.framework.jini.service.core.JiniService;
+import org.eclipse.osee.framework.jini.service.core.SimpleFormattedEntry;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventListener;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventService;
+import org.eclipse.osee.framework.messaging.event.skynet.SkynetEventPlugin;
+import org.eclipse.osee.framework.messaging.event.skynet.filter.IEventFilter;
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+import org.eclipse.osee.framework.plugin.core.server.BundleResourceFinder;
+
+/**
+ * Skynet Event Service handles event distribution to provide network assisted cache consistency for Skynet.
+ *
+ * @author Robert A. Fisher
+ */
+public class SkynetEventService extends JiniService implements ISkynetEventService {
+ private static JiniClassServer jiniClassServer;
+
+ private final HashCollection<IEventFilter, ISkynetEventListener> listenerMap;
+ private final ExecutorService executorService;
+ private final AcceptAllEventFilter defaultEventFilter;
+
+ protected SkynetEventService(String dbConfig) {
+ this.defaultEventFilter = new AcceptAllEventFilter();
+ this.executorService = Executors.newFixedThreadPool(3, new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ return new Thread(r, "Event Dispatcher");
+ }
+ });
+ this.listenerMap = new HashCollection<IEventFilter, ISkynetEventListener>();
+ try {
+ registerWithJini(dbConfig);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetEventPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private final IEventFilter getDefaultEventFilter() {
+ return defaultEventFilter;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void registerWithJini(String dbConfig) throws Exception {
+ jiniClassServer = JiniClassServer.getInstance();
+ jiniClassServer.addResourceFinder(new BundleResourceFinder(new String[] {
+ "org.eclipse.osee.framework.messaging.event.skynet", "org.eclipse.osee.framework.jdk.core"}));
+
+ Dictionary dictionary = null;
+ String name = "OSEE Event Service";
+ String manufacturer = "Eclipse.org";
+ String vendor = "Eclipse.org";
+ String version = "0.0";
+ String model = "SES";
+ String serialNumber = "0.0";
+ String description = "OSEE Event Service - OSEE Cache Network Manager";
+
+ OseeActivator plugin = SkynetEventPlugin.getInstance();
+ if (plugin != null) {
+ dictionary = plugin.getBundle().getHeaders();
+ }
+
+ this.registerService(new Entry[] {new SimpleFormattedEntry("db", dbConfig),
+ new ServiceInfo(name, manufacturer, vendor, version, model, serialNumber), new Name(name),
+ new Comment(description)}, dictionary);
+
+ System.out.println("....................OSEE Event Service(" + dbConfig + ") is Alive....................");
+ this.stayAlive();
+ }
+
+ public void register(ISkynetEventListener listener, IEventFilter... filters) throws RemoteException {
+ addListeners(listener, filters);
+ }
+
+ public void deregister(ISkynetEventListener listener, IEventFilter... filters) throws RemoteException {
+ removeListeners(listener, filters);
+ }
+
+ private synchronized void removeListeners(ISkynetEventListener listener, IEventFilter... filters) {
+ if (listener != null) {
+ for (IEventFilter filter : listenerMap.keySet()) {
+ listenerMap.removeValue(filter, listener);
+ }
+ }
+ }
+
+ private synchronized void addListeners(ISkynetEventListener listener, IEventFilter... filters) {
+ if (listener != null) {
+ if (filters != null && filters.length > 0) {
+ for (IEventFilter filter : filters) {
+ listenerMap.put(filter, listener);
+ }
+ } else {
+ listenerMap.put(getDefaultEventFilter(), listener);
+ }
+ }
+ }
+
+ private synchronized HashCollection<ISkynetEventListener, ISkynetEvent> getEventAndListenersToSendTo(final ISkynetEvent[] events, Set<ISkynetEventListener> filterOutSet) {
+ HashCollection<ISkynetEventListener, ISkynetEvent> eventSets =
+ new HashCollection<ISkynetEventListener, ISkynetEvent>(false, HashSet.class);
+ // Build sets according to the filters that the event matches
+ for (IEventFilter filter : listenerMap.keySet()) {
+ for (ISkynetEvent event : events) {
+ if (filter.accepts(event)) {
+ // When a filter accepts an event, the event to everyone listening for it
+ for (ISkynetEventListener listener : listenerMap.getValues(filter)) {
+ if (!filterOutSet.contains(listener)) {
+ eventSets.put(listener, event);
+ }
+ }
+ }
+ }
+ }
+ return eventSets;
+ }
+
+ private Set<ISkynetEventListener> toFilteredSet(final ISkynetEventListener... filterOut) {
+ if (filterOut != null && filterOut.length > 0) {
+ Set<ISkynetEventListener> filterOutSet =
+ new HashSet<ISkynetEventListener>((int) (filterOut.length / .75f) + 1);
+ for (ISkynetEventListener listener : filterOut) {
+ if (listener != null) {
+ filterOutSet.add(listener);
+ }
+ }
+ return filterOutSet;
+ }
+ return Collections.emptySet();
+ }
+
+ public void kick(final ISkynetEvent[] events, final ISkynetEventListener... except) throws RemoteException {
+ if (events != null && events.length > 0) {
+ executorService.submit(new EventDispatchRunnable(this, getEventAndListenersToSendTo(events,
+ toFilteredSet(except))));
+ }
+ }
+
+ public static void main(String[] args) {
+ if (args.length != 2) throw new IllegalArgumentException(
+ "Must supply the db name for the service, such as \"dbinstance:schema\"");
+
+ new SkynetEventService(args[1]);
+ }
+
+ public void kill() throws RemoteException {
+ try {
+ this.deregisterService();
+ this.commitSuicide();
+ } finally {
+ this.executorService.shutdown();
+ }
+ }
+
+ public boolean isAlive() throws RemoteException {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventServicePlatformRunnable.java b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventServicePlatformRunnable.java
new file mode 100644
index 00000000000..34de49b8a5d
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging.event.skynet/src/org/eclipse/osee/framework/messaging/event/skynet/service/SkynetEventServicePlatformRunnable.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.framework.messaging.event.skynet.service;
+
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.osee.framework.jdk.core.util.CmdLineArgs;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.SkynetEventPlugin;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SkynetEventServicePlatformRunnable implements IApplication {
+ private SkynetEventService skynetEventService;
+
+ public SkynetEventServicePlatformRunnable() {
+ super();
+ skynetEventService = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+ */
+ public Object start(IApplicationContext context) throws Exception {
+ CmdLineArgs commandArgs = new CmdLineArgs(Platform.getApplicationArgs());
+
+ String database = commandArgs.get("-database");
+ skynetEventService = new SkynetEventService(database);
+ return EXIT_OK;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.equinox.app.IApplication#stop()
+ */
+ public void stop() {
+ try {
+ skynetEventService.kill();
+ } catch (RemoteException ex) {
+ OseeLog.log(SkynetEventPlugin.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/.classpath b/org.eclipse.osee.framework.messaging/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.messaging/.project b/org.eclipse.osee.framework.messaging/.project
new file mode 100644
index 00000000000..d527f69a23c
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.messaging</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.messaging/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.messaging/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..ea022c6665a
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Wed Feb 25 14:28:59 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.messaging/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.messaging/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..04836d5f4f6
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed Feb 25 14:28:59 MST 2009
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.messaging/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.messaging/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..ce516171e15
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Messaging Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.messaging;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.messaging.internal.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.messaging,
+ org.eclipse.osee.framework.messaging.definitions,
+ org.eclipse.osee.framework.messaging.id
diff --git a/org.eclipse.osee.framework.messaging/build.properties b/org.eclipse.osee.framework.messaging/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.messaging/design/OSEE Service and Messaging Architecture.xml b/org.eclipse.osee.framework.messaging/design/OSEE Service and Messaging Architecture.xml
new file mode 100644
index 00000000000..02d5b3c0cda
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/design/OSEE Service and Messaging Architecture.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>Service and Messaging Architecture </o:Title><o:Author>b1122182</o:Author><o:LastAuthor>b1122182</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>46</o:TotalTime><o:Created>2009-02-25T21:50:00Z</o:Created><o:LastSaved>2009-02-25T22:36:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>122</o:Words><o:Characters>698</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>5</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>819</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/></w:fonts><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style></w:styles><w:divs><w:div w:id="281159593"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div></w:divs><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="2050"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="62"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00BB6175"/><wsp:rsid wsp:val="0042418D"/><wsp:rsid wsp:val="0061196F"/><wsp:rsid wsp:val="007E3E05"/><wsp:rsid wsp:val="00821BA3"/><wsp:rsid wsp:val="00850125"/><wsp:rsid wsp:val="00BA3064"/><wsp:rsid wsp:val="00BB6175"/></wsp:rsids></w:docPr><w:body><wx:sect><w:p wsp:rsidR="00850125" wsp:rsidRPr="00BA3064" wsp:rsidRDefault="00BA3064"><w:pPr><w:rPr><w:b/></w:rPr></w:pPr><w:r><w:rPr><w:b/></w:rPr><w:t>Service and Messaging </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:rPr><w:b/></w:rPr><w:t>Architecture ?</w:t></w:r><w:proofErr w:type="gramEnd"/></w:p><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>OSEE Services</w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BA3064"><w:r><w:t>Search Engine Service – performs searches</w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Tagging Service – Tags attributes </w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Artifact Service – Loading Artifacts</w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Branch Service – Making </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>Branches ?</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>should</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t> branch manager be part of this?</w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Branch Exchange Service – Exporting/Importing</w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Client </w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Client Artifact Service – </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>Caches ?</w:t></w:r><w:proofErr w:type="gramEnd"/></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Artifact Explorer </w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Branch Manager</w:t></w:r></w:p><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"/><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"/><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"/><w:tbl><w:tblPr><w:tblW w:w="9980" w:type="dxa"/><w:tblInd w:w="93" w:type="dxa"/></w:tblPr><w:tblGrid><w:gridCol w:w="2788"/><w:gridCol w:w="6172"/><w:gridCol w:w="1020"/></w:tblGrid><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="270"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="9980" w:type="dxa"/><w:gridSpan w:val="3"/><w:tcBorders><w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>OSEE MESSAGE</w:t></w:r><w:r wsp:rsidR="00BA3064"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t> TOPICS</w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="270"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>namespace</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>prefix</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="auto"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>data</w:t></w:r></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>branch</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>create.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>branch</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>export.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>branch</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>import.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>resource</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>get.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>resource</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>put.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>resource</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>delete.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>search</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>search</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>submit.for.tagging.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>arbitration</w:t></w:r></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>application.server.lookup.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:proofErr w:type="spellStart"/><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>util.exchange</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>file.verification.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr><w:proofErr w:type="spellStart"/><w:tr wsp:rsidR="00BB6175" wsp:rsidTr="00BB6175"><w:trPr><w:trHeight w:val="255"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="2788" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>util.install</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:proofErr w:type="spellStart"/><w:tc><w:tcPr><w:tcW w:w="6172" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr><w:t>get.info.cmd</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1020" w:type="dxa"/><w:tcBorders><w:top w:val="nil"/><w:left w:val="nil"/><w:bottom w:val="nil"/><w:right w:val="nil"/></w:tcBorders><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap/><w:vAlign w:val="bottom"/></w:tcPr><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:pPr></w:p></w:tc></w:tr></w:tbl><w:p wsp:rsidR="00BB6175" wsp:rsidRDefault="00BB6175"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Message </w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Topic</w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"><w:r><w:t>Topic contains namespace and id – topic defines destination local or remote </w:t></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="007E3E05"><w:r><w:rPr><w:noProof/></w:rPr></w:r><w:r><w:pict><v:group id="_x0000_s1027" editas="canvas" style="width:6in;height:252pt;mso-position-horizontal-relative:char;mso-position-vertical-relative:line" coordorigin="2532,5772" coordsize="7200,4320"><o:lock v:ext="edit" aspectratio="t"/><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t75" style="position:absolute;left:2532;top:5772;width:7200;height:4320" o:preferrelative="f"><v:fill o:detectmouseclick="t"/><v:path o:extrusionok="t" o:connecttype="none"/><o:lock v:ext="edit" text="t"/></v:shape><v:rect id="_x0000_s1028" style="position:absolute;left:2682;top:6081;width:1050;height:771"><v:textbox style="mso-next-textbox:#_x0000_s1028"><w:txbxContent><w:p wsp:rsidR="007E3E05" wsp:rsidRDefault="007E3E05"><w:r><w:t>Branch Manager</w:t></w:r></w:p></w:txbxContent></v:textbox></v:rect><v:rect id="_x0000_s1029" style="position:absolute;left:5682;top:6389;width:1650;height:464"><v:textbox style="mso-next-textbox:#_x0000_s1029"><w:txbxContent><w:p wsp:rsidR="0061196F" wsp:rsidRDefault="0061196F"><w:r><w:t>Message Broker</w:t></w:r></w:p></w:txbxContent></v:textbox></v:rect><v:oval id="_x0000_s1031" style="position:absolute;left:3132;top:8086;width:1500;height:772"><v:textbox style="mso-next-textbox:#_x0000_s1031"><w:txbxContent><w:p wsp:rsidR="0061196F" wsp:rsidRDefault="0061196F"><w:r><w:t>Messaging System</w:t></w:r></w:p></w:txbxContent></v:textbox></v:oval><v:rect id="_x0000_s1036" style="position:absolute;left:6732;top:8086;width:2400;height:1543"><v:textbox style="mso-next-textbox:#_x0000_s1036"><w:txbxContent><w:p wsp:rsidR="0061196F" wsp:rsidRDefault="0061196F"><w:r><w:t>Web Services</w:t></w:r></w:p></w:txbxContent></v:textbox></v:rect><v:line id="_x0000_s1037" style="position:absolute;flip:x" from="5232,8858" to="6732,8858"><v:stroke endarrow="block"/></v:line><v:line id="_x0000_s1038" style="position:absolute" from="5232,9321" to="6732,9321"><v:stroke endarrow="block"/></v:line><v:shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><v:stroke joinstyle="miter"/><v:path gradientshapeok="t" o:connecttype="rect"/></v:shapetype><v:shape id="_x0000_s1039" type="#_x0000_t202" style="position:absolute;left:5382;top:8086;width:1050;height:617"><v:textbox style="mso-next-textbox:#_x0000_s1039"><w:txbxContent><w:p wsp:rsidR="0061196F" wsp:rsidRDefault="0061196F"><w:r><w:t>Publishes</w:t></w:r></w:p></w:txbxContent></v:textbox></v:shape><v:shape id="_x0000_s1040" type="#_x0000_t202" style="position:absolute;left:5382;top:9475;width:1200;height:463"><v:textbox style="mso-next-textbox:#_x0000_s1040"><w:txbxContent><w:p wsp:rsidR="0061196F" wsp:rsidRDefault="0061196F"><w:r><w:t>Subscribes</w:t></w:r></w:p></w:txbxContent></v:textbox></v:shape><w10:wrap type="none"/><w10:anchorlock/></v:group></w:pict></w:r></w:p><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:p wsp:rsidR="00BA3064" wsp:rsidRDefault="00BA3064"/><w:sectPr wsp:rsidR="00BA3064"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointReceive.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointReceive.java
new file mode 100644
index 00000000000..b144e4d7492
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointReceive.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.framework.messaging;
+
+import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.internal.Activator;
+import org.eclipse.osee.framework.messaging.internal.ApplicationDistributer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class EndpointReceive {
+
+ private ApplicationDistributer distributer;
+ private ExecutorService executor;
+
+ public EndpointReceive() {
+ executor = Executors.newSingleThreadExecutor();
+ }
+
+ /**
+ * The MessagingGateway implementation must call this method to set the ApplicationDistributer callback so that
+ * received messages get propagated to the application.
+ *
+ * @param distributer
+ */
+ public void onBind(ApplicationDistributer distributer) {
+ this.distributer = distributer;
+ }
+
+ public void onUnbind(ApplicationDistributer distributer) {
+ this.distributer = null;
+ }
+
+ /**
+ * This method must be called by the implementing class when it receives a message so that it gets propagated to the
+ * MessagingGateway
+ */
+ protected void onReceive(final Message message) {
+ if (distributer == null) {
+ String errorMsg =
+ String.format(
+ "We have recieved message [%s] from [%s], but have no active ApplicationDistributer available.",
+ message.getId().toString(), message.getSource().toString());
+ OseeLog.log(Activator.class, Level.WARNING, errorMsg);
+ } else {
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ distributer.distribute(message);
+ }
+ });
+ }
+ }
+
+ public abstract void start(Properties properties);
+
+ public abstract void dispose();
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointSend.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointSend.java
new file mode 100644
index 00000000000..c83d9683cdb
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/EndpointSend.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.framework.messaging;
+
+import java.util.Properties;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface EndpointSend {
+ public void start(Properties properties);
+
+ public void send(Message message, ExceptionHandler exceptionHandler);
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ExceptionHandler.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ExceptionHandler.java
new file mode 100644
index 00000000000..3164ccf2812
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ExceptionHandler.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.framework.messaging;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ExceptionHandler {
+ void handleException(Throwable th);
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Message.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Message.java
new file mode 100644
index 00000000000..59be83ace50
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Message.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.framework.messaging;
+
+import org.eclipse.osee.framework.messaging.id.MessageId;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface Message {
+ Source getSource();
+
+ MessageId getId();
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/MessagingGateway.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/MessagingGateway.java
new file mode 100644
index 00000000000..d7683a43d5e
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/MessagingGateway.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.framework.messaging;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.messaging.id.MessageId;
+import org.eclipse.osee.framework.messaging.id.ProtocolId;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface MessagingGateway {
+
+ public void send(Message message, ExceptionHandler exceptionHandler);
+
+ public void dispose();
+
+ public boolean bind(EndpointSend endpoint);
+
+ public boolean unbind(EndpointSend endpoint);
+
+ public boolean bind(EndpointReceive endpoint);
+
+ public boolean unbind(EndpointReceive endpoint);
+
+ public Collection<EndpointSend> getSendEndpoints();
+
+ public Collection<EndpointReceive> getReceiveEndpoints();
+
+ public boolean bindSendProtocol(ProtocolId protocolId, EndpointSend endpoint);
+
+ public boolean unbindSendProtocol(ProtocolId protocolId, EndpointSend endpoint);
+
+ public boolean bindSendMessage(MessageId messageId, ProtocolId protocolId);
+
+ public boolean unbindSendMessage(MessageId messageId, ProtocolId protocolId);
+
+ public void addSendListener(MessageId messageId, SendListener sendListener);
+
+ public void removeSendListener(MessageId messageId, SendListener sendListener);
+
+ public void addReceiveListener(MessageId messageId, ReceiveListener receiveListener);
+
+ public void removeReceiveListener(MessageId messageId, ReceiveListener receiveListener);
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ReceiveListener.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ReceiveListener.java
new file mode 100644
index 00000000000..ec43a7c0b47
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/ReceiveListener.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.framework.messaging;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ReceiveListener {
+ void handle(Message cmd);
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/SendListener.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/SendListener.java
new file mode 100644
index 00000000000..25ae10bf78a
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/SendListener.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.framework.messaging;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface SendListener {
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Source.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/Source.java
new file mode 100644
index 00000000000..bea648ef516
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/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.framework.messaging;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface Source {
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/UriSource.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/UriSource.java
new file mode 100644
index 00000000000..0e1048f3f02
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/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.framework.messaging;
+
+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 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.framework.messaging/src/org/eclipse/osee/framework/messaging/definitions/PropertyStoreMessage.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/definitions/PropertyStoreMessage.java
new file mode 100644
index 00000000000..4ceab0e4935
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/definitions/PropertyStoreMessage.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.framework.messaging.definitions;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.messaging.Message;
+import org.eclipse.osee.framework.messaging.Source;
+import org.eclipse.osee.framework.messaging.id.MessageId;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class PropertyStoreMessage implements Message, Serializable {
+
+ private static final long serialVersionUID = -8736301654726742145L;
+
+ private MessageId messageId;
+ private Source source;
+ private PropertyStore store;
+
+ public PropertyStoreMessage(MessageId messageId, Source source)
+ {
+ this.messageId = messageId;
+ this.source = source;
+ this.store = new PropertyStore("org.eclipse.osee.framework.messaging.definitions.PropertyStoreMessage");
+ }
+
+ @Override
+ public String toString() {
+ return String.format("PropertyStoreMessage\t[MessageId: %s]\t[source: %s]", messageId, source);
+ }
+
+ @Override
+ public MessageId getId() {
+ return messageId;
+ }
+
+ @Override
+ public Source getSource() {
+ return source;
+ }
+
+ public PropertyStore getStore() {
+ return store;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/MessageId.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/MessageId.java
new file mode 100644
index 00000000000..1b31a8eb6a6
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/MessageId.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.framework.messaging.id;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface MessageId {
+ Namespace getNamespace();
+
+ Name getName();
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Name.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Name.java
new file mode 100644
index 00000000000..15522cadb9c
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Name.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.framework.messaging.id;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface Name {
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Namespace.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Namespace.java
new file mode 100644
index 00000000000..c5895e3fa00
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/Namespace.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.framework.messaging.id;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface Namespace {
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/ProtocolId.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/ProtocolId.java
new file mode 100644
index 00000000000..5e3aaffd204
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/ProtocolId.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.framework.messaging.id;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ProtocolId {
+ Namespace getNamespace();
+
+ Name getName();
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringId.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringId.java
new file mode 100644
index 00000000000..a584dadfec1
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringId.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.framework.messaging.id;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class StringId implements Serializable {
+
+ private static final long serialVersionUID = 80655792810954088L;
+ private Namespace namespace;
+ private Name name;
+
+ public StringId(Namespace namespace, Name name) {
+ this.namespace = namespace;
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("StringId (NameSpace: %s, Name: %s)", namespace.toString(), name.toString());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof StringId) {
+ return namespace.equals(((StringId) obj).namespace) && name.equals(((StringId) obj).name);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 7;
+ hash = 31 * hash + namespace.hashCode();
+ hash = 31 * hash + name.hashCode();
+ return hash;
+ }
+
+ public Name getName() {
+ return name;
+ }
+
+ public Namespace getNamespace() {
+ return namespace;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringMessageId.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringMessageId.java
new file mode 100644
index 00000000000..acb269cdf13
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringMessageId.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.framework.messaging.id;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StringMessageId extends StringId implements MessageId {
+
+ private static final long serialVersionUID = 5645233194938964314L;
+
+ public StringMessageId(Namespace namespace, Name name) {
+ super(namespace, name);
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringName.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringName.java
new file mode 100644
index 00000000000..1e6940d1fb2
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringName.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.framework.messaging.id;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StringName implements Name, Serializable {
+ private static final long serialVersionUID = -7215226960243262972L;
+ private String name;
+
+ public StringName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return 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.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringNamespace.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringNamespace.java
new file mode 100644
index 00000000000..5e46045f957
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringNamespace.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.messaging.id;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StringNamespace implements Namespace, Serializable {
+ private static final long serialVersionUID = -8903438134102328929L;
+ private String namespace;
+
+ public StringNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ @Override
+ public String toString() {
+ return 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.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringProtocolId.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringProtocolId.java
new file mode 100644
index 00000000000..cff4d4e1b70
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/id/StringProtocolId.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.framework.messaging.id;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StringProtocolId extends StringId implements ProtocolId {
+
+ private static final long serialVersionUID = 2526404617710228921L;
+
+ public StringProtocolId(Namespace namespace, Name name) {
+ super(namespace, name);
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/Activator.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/Activator.java
new file mode 100644
index 00000000000..62f91a65c87
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/Activator.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.framework.messaging.internal;
+
+import java.util.Hashtable;
+import org.eclipse.osee.framework.messaging.MessagingGateway;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Activator implements BundleActivator {
+
+ private ServiceRegistration registration;
+ private MessagingGatewayImpl messaging;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ messaging = new MessagingGatewayImpl();
+ registration = context.registerService(MessagingGateway.class.getName(), messaging, new Hashtable());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ if (registration != null) {
+ registration.unregister();
+ }
+
+ if (messaging != null) {
+ messaging.dispose();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ApplicationDistributer.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ApplicationDistributer.java
new file mode 100644
index 00000000000..4c6358cfef9
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ApplicationDistributer.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.framework.messaging.internal;
+
+import org.eclipse.osee.framework.messaging.Message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ApplicationDistributer {
+
+ /**
+ * @param message
+ */
+ void distribute(Message message);
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ConcurrentListMap.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ConcurrentListMap.java
new file mode 100644
index 00000000000..106cb92fcb8
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/ConcurrentListMap.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.framework.messaging.internal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ConcurrentListMap<MAP_TYPE, LIST_TYPE> {
+
+ private Map<MAP_TYPE, List<LIST_TYPE>> data;
+ private List<LIST_TYPE> EMPTY_LIST = new ArrayList<LIST_TYPE>();
+
+ public ConcurrentListMap() {
+ data = new HashMap<MAP_TYPE, List<LIST_TYPE>>();
+ }
+
+ public synchronized boolean add(MAP_TYPE key, LIST_TYPE value) {
+ List<LIST_TYPE> values = data.get(key);
+ if (values == null) {
+ values = new CopyOnWriteArrayList<LIST_TYPE>();
+ data.put(key, values);
+ }
+ if (values.contains(value)) {
+ return false;
+ } else {
+ values.add(value);
+ return true;
+ }
+ }
+
+ public synchronized List<LIST_TYPE> get(MAP_TYPE key) {
+ List<LIST_TYPE> values = data.get(key);
+ if (values == null) {
+ return EMPTY_LIST;
+ } else {
+ return values;
+ }
+ }
+
+ public synchronized boolean remove(MAP_TYPE key, LIST_TYPE value) {
+ List<LIST_TYPE> values = data.get(key);
+ if (values == null) {
+ return false;
+ } else {
+ return values.remove(value);
+ }
+ }
+
+ public void clear() {
+ data.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointReceiveCollection.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointReceiveCollection.java
new file mode 100644
index 00000000000..3948015f1ac
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointReceiveCollection.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.framework.messaging.internal;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.messaging.EndpointReceive;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EndpointReceiveCollection {
+
+ private final List<EndpointReceive> receivers;
+
+ public EndpointReceiveCollection() {
+ receivers = new CopyOnWriteArrayList<EndpointReceive>();
+ }
+
+ public synchronized boolean add(EndpointReceive endpoint) {
+ if (receivers.contains(endpoint)) {
+ return false;
+ } else {
+ return receivers.add(endpoint);
+ }
+ }
+
+ public synchronized boolean remove(EndpointReceive endpoint) {
+ return receivers.remove(endpoint);
+ }
+
+ public synchronized Collection<EndpointReceive> getAll() {
+ return receivers;
+ }
+
+ public synchronized void dispose() {
+ receivers.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointSendCollection.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointSendCollection.java
new file mode 100644
index 00000000000..0dde4b6d0ee
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/EndpointSendCollection.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.framework.messaging.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.messaging.EndpointSend;
+import org.eclipse.osee.framework.messaging.id.MessageId;
+import org.eclipse.osee.framework.messaging.id.ProtocolId;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EndpointSendCollection {
+
+ private final List<EndpointSend> endpoints;
+ private Map<ProtocolId, EndpointSend> protocolMapping;
+ private Map<MessageId, ProtocolId> messageIdMapping;
+
+ public EndpointSendCollection() {
+ endpoints = new CopyOnWriteArrayList<EndpointSend>();
+ protocolMapping = new ConcurrentHashMap<ProtocolId, EndpointSend>();
+ messageIdMapping = new ConcurrentHashMap<MessageId, ProtocolId>();
+ }
+
+ public synchronized boolean add(EndpointSend endpoint) {
+ if (endpoints.contains(endpoint)) {
+ return false;
+ } else {
+ return endpoints.add(endpoint);
+ }
+ }
+
+ public synchronized boolean remove(EndpointSend endpoint) {
+ if (endpoints.remove(endpoint)) {
+ List<ProtocolId> protocolIdsToRemove = new ArrayList<ProtocolId>();
+ Iterator<ProtocolId> it = protocolMapping.keySet().iterator();
+ while (it.hasNext()) {
+ ProtocolId id = it.next();
+ if (protocolMapping.get(id).equals(endpoint)) {
+ it.remove();
+ protocolIdsToRemove.add(id);
+ }
+ }
+ for (ProtocolId id : protocolIdsToRemove) {
+ removeProtocolId(id);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public synchronized boolean bind(ProtocolId protocolId, EndpointSend endpoint) {
+ if (protocolMapping.containsKey(protocolId)) {
+ return false;
+ } else {
+ protocolMapping.put(protocolId, endpoint);
+ return true;
+ }
+ }
+
+ public synchronized boolean unbind(ProtocolId protocolId, EndpointSend endpoint) {
+ if (protocolMapping.containsKey(protocolId)) {
+ protocolMapping.remove(protocolId);
+
+ removeProtocolId(protocolId);
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void removeProtocolId(ProtocolId protocolId) {
+ Iterator<MessageId> it = messageIdMapping.keySet().iterator();
+ while (it.hasNext()) {
+ MessageId id = it.next();
+ if (messageIdMapping.get(id).equals(protocolId)) {
+ it.remove();
+ }
+ }
+ }
+
+ public synchronized boolean bind(MessageId messageId, ProtocolId protocolId) {
+ if (messageIdMapping.containsKey(messageId)) {
+ return false;
+ } else {
+ messageIdMapping.put(messageId, protocolId);
+ return true;
+ }
+ }
+
+ public synchronized boolean unbind(MessageId messageId, ProtocolId protocolId) {
+ if (messageIdMapping.containsKey(messageId)) {
+ messageIdMapping.remove(messageId);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public synchronized Collection<EndpointSend> getAll() {
+ return endpoints;
+ }
+
+ public synchronized void dispose() {
+ endpoints.clear();
+ protocolMapping.clear();
+ messageIdMapping.clear();
+ }
+
+ public synchronized EndpointSend get(MessageId id) {
+ ProtocolId protocolId = messageIdMapping.get(id);
+ if (protocolId != null) {
+ EndpointSend send = protocolMapping.get(protocolId);
+ if (send != null) {
+ return send;
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessageListenerCollection.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessageListenerCollection.java
new file mode 100644
index 00000000000..1fae35b0ad8
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessageListenerCollection.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.framework.messaging.internal;
+
+import org.eclipse.osee.framework.messaging.Message;
+import org.eclipse.osee.framework.messaging.ReceiveListener;
+import org.eclipse.osee.framework.messaging.SendListener;
+import org.eclipse.osee.framework.messaging.id.MessageId;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MessageListenerCollection {
+
+ private ConcurrentListMap<MessageId, ReceiveListener> receiveListeners;
+ private ConcurrentListMap<MessageId, SendListener> sendListeners;
+
+ public MessageListenerCollection() {
+ receiveListeners = new ConcurrentListMap<MessageId, ReceiveListener>();
+ sendListeners = new ConcurrentListMap<MessageId, SendListener>();
+ }
+
+ public boolean addReceiveListener(MessageId messageId, ReceiveListener receiveListener) {
+ return receiveListeners.add(messageId, receiveListener);
+ }
+
+ public boolean addSendListener(MessageId messageId, SendListener sendListener) {
+ return sendListeners.add(messageId, sendListener);
+ }
+
+ public boolean removeReceiveListener(MessageId messageId, ReceiveListener receiveListener) {
+ return receiveListeners.remove(messageId, receiveListener);
+ }
+
+ public boolean removeSendListener(MessageId messageId, SendListener sendListener) {
+ return sendListeners.remove(messageId, sendListener);
+ }
+
+ public void notifyReceiveListeners(Message message) {
+ for (ReceiveListener listener : receiveListeners.get(message.getId())) {
+ listener.handle(message);
+ }
+ }
+
+ public void dispose() {
+ receiveListeners.clear();
+ sendListeners.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessagingGatewayImpl.java b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessagingGatewayImpl.java
new file mode 100644
index 00000000000..c2b369c209c
--- /dev/null
+++ b/org.eclipse.osee.framework.messaging/src/org/eclipse/osee/framework/messaging/internal/MessagingGatewayImpl.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.framework.messaging.internal;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.messaging.EndpointReceive;
+import org.eclipse.osee.framework.messaging.EndpointSend;
+import org.eclipse.osee.framework.messaging.ExceptionHandler;
+import org.eclipse.osee.framework.messaging.Message;
+import org.eclipse.osee.framework.messaging.MessagingGateway;
+import org.eclipse.osee.framework.messaging.ReceiveListener;
+import org.eclipse.osee.framework.messaging.SendListener;
+import org.eclipse.osee.framework.messaging.id.MessageId;
+import org.eclipse.osee.framework.messaging.id.ProtocolId;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MessagingGatewayImpl implements MessagingGateway, ApplicationDistributer {
+
+ private MessageListenerCollection messageListeners;
+ private EndpointReceiveCollection endpointReceivers;
+ private EndpointSendCollection endpointSenders;
+
+ public MessagingGatewayImpl() {
+ messageListeners = new MessageListenerCollection();
+ endpointReceivers = new EndpointReceiveCollection();
+ endpointSenders = new EndpointSendCollection();
+ }
+
+ @Override
+ public void addReceiveListener(MessageId messageId, ReceiveListener receiveListener) {
+ messageListeners.addReceiveListener(messageId, receiveListener);
+ }
+
+ @Override
+ public void addSendListener(MessageId messageId, SendListener sendListener) {
+ messageListeners.addSendListener(messageId, sendListener);
+ }
+
+ @Override
+ public void removeReceiveListener(MessageId messageId, ReceiveListener receiveListener) {
+ messageListeners.removeReceiveListener(messageId, receiveListener);
+ }
+
+ @Override
+ public void removeSendListener(MessageId messageId, SendListener sendListener) {
+ messageListeners.removeSendListener(messageId, sendListener);
+ }
+
+ @Override
+ public void distribute(Message message) {
+ messageListeners.notifyReceiveListeners(message);
+ }
+
+ @Override
+ public boolean bind(EndpointReceive endpoint) {
+ if (endpointReceivers.add(endpoint)) {
+ endpoint.onBind(this);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean unbind(EndpointReceive endpoint) {
+ endpoint.onUnbind(this);
+ return endpointReceivers.remove(endpoint);
+ }
+
+ @Override
+ public Collection<EndpointReceive> getReceiveEndpoints() {
+ return endpointReceivers.getAll();
+ }
+
+ @Override
+ public boolean bind(EndpointSend endpoint) {
+ return endpointSenders.add(endpoint);
+ }
+
+ @Override
+ public boolean unbind(EndpointSend endpoint) {
+ return endpointSenders.remove(endpoint);
+ }
+
+ @Override
+ public boolean bindSendProtocol(ProtocolId protocolId, EndpointSend endpoint) {
+ return endpointSenders.bind(protocolId, endpoint);
+ }
+
+ @Override
+ public boolean unbindSendProtocol(ProtocolId protocolId, EndpointSend endpoint) {
+ return endpointSenders.unbind(protocolId, endpoint);
+ }
+
+ @Override
+ public boolean bindSendMessage(MessageId messageId, ProtocolId protocolId) {
+ return endpointSenders.bind(messageId, protocolId);
+ }
+
+ @Override
+ public boolean unbindSendMessage(MessageId messageId, ProtocolId protocolId) {
+ return endpointSenders.unbind(messageId, protocolId);
+ }
+
+ @Override
+ public Collection<EndpointSend> getSendEndpoints() {
+ return endpointSenders.getAll();
+ }
+
+ @Override
+ public void send(Message message, ExceptionHandler exceptionHandler) {
+ EndpointSend sender = endpointSenders.get(message.getId());
+ if (sender == null) {
+ String errorMessage = String.format("No registered senders for messageId[%s].", message.getId().toString());
+ exceptionHandler.handleException(new Exception(errorMessage));
+ } else {
+ sender.send(message, exceptionHandler);
+ }
+ }
+
+ @Override
+ public void dispose() {
+ messageListeners.dispose();
+ endpointReceivers.dispose();
+ endpointSenders.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.oracle/.classpath b/org.eclipse.osee.framework.oracle/.classpath
new file mode 100644
index 00000000000..64ed6b3795d
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/.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.oracle/.project b/org.eclipse.osee.framework.oracle/.project
new file mode 100644
index 00000000000..d1bb835576a
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.oracle</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.oracle/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.oracle/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..4a37d8d4ca1
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Mon Jul 14 14:55:33 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.oracle/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.oracle/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..67f0af06d73
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Oracle Db Connector Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.oracle;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.oracle.Activator
+Bundle-Vendor: Eclipse.org
+OseeEarlyStart: true
+Service-Component: OSGI-INF/oracle.connection.driver.provider.xml
+Import-Package: oracle.jdbc;resolution:=optional,
+ org.eclipse.osee.framework.db.connection,
+ org.osgi.framework
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.oracle/OSGI-INF/oracle.connection.driver.provider.xml b/org.eclipse.osee.framework.oracle/OSGI-INF/oracle.connection.driver.provider.xml
new file mode 100644
index 00000000000..0c9954ca280
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/OSGI-INF/oracle.connection.driver.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="oracle.connection.driver.provider">
+ <implementation class="org.eclipse.osee.framework.oracle.OracleConnection"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IConnection"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.oracle/build.properties b/org.eclipse.osee.framework.oracle/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/Activator.java b/org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/Activator.java
new file mode 100644
index 00000000000..cddb7d062d8
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/Activator.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.framework.oracle;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/OracleConnection.java b/org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/OracleConnection.java
new file mode 100644
index 00000000000..f241a67fce0
--- /dev/null
+++ b/org.eclipse.osee.framework.oracle/src/org/eclipse/osee/framework/oracle/OracleConnection.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.framework.oracle;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+import org.eclipse.osee.framework.db.connection.IConnection;
+
+public class OracleConnection implements IConnection {
+
+ private static final String driver = "oracle.jdbc.OracleDriver";
+
+ public Connection getConnection(Properties properties, String connectionURL) throws ClassNotFoundException, SQLException {
+ Class.forName(driver);
+ Connection connection = DriverManager.getConnection(connectionURL, properties);
+ return connection;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.osgi/.classpath b/org.eclipse.osee.framework.osgi/.classpath
new file mode 100644
index 00000000000..ad32c83a788
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.osgi/.project b/org.eclipse.osee.framework.osgi/.project
new file mode 100644
index 00000000000..3e360ead526
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.osgi</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.osgi/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.osgi/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..7a3a2861602
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Tue Apr 21 18:27:56 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.osgi/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.osgi/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..748afb75f59
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Apr 21 18:27:57 MST 2009
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.osgi/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.osgi/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..191e572bd32
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Eclipse OSEE Osgi Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.osgi
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.osee.framework.osgi.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.osgi.framework,
+ org.osgi.service.log,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.osgi/build.properties b/org.eclipse.osee.framework.osgi/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.osgi/src/org/eclipse/osee/framework/osgi/Activator.java b/org.eclipse.osee.framework.osgi/src/org/eclipse/osee/framework/osgi/Activator.java
new file mode 100644
index 00000000000..6508ba09fce
--- /dev/null
+++ b/org.eclipse.osee.framework.osgi/src/org/eclipse/osee/framework/osgi/Activator.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.framework.osgi;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.log.LogService;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * This class is a BundleActivator and is responsible for starting all installed bundles. This is an automated way to
+ * get an osgi framework launched without having to maintain a config ini file as new bundles are developed.
+ *
+ * @author Ryan D. Brooks
+ */
+public class Activator implements BundleActivator {
+ private LogService logservice;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ ServiceTracker logServiceTracker = new ServiceTracker(context, LogService.class.getName(), null);
+ logServiceTracker.open();
+ logservice = (LogService) logServiceTracker.getService();
+
+ for (Bundle bundle : context.getBundles()) {
+ start(bundle);
+ }
+
+ context.addBundleListener(new BundleListener() {
+ @Override
+ public void bundleChanged(BundleEvent event) {
+ if (event.getType() == BundleEvent.INSTALLED) {
+ start(event.getBundle());
+ }
+ }
+ });
+ }
+
+ private void start(Bundle bundle) {
+ try {
+ if (bundle.getState() == Bundle.RESOLVED) {
+ bundle.start(Bundle.START_TRANSIENT);
+ }
+ } catch (BundleException ex) {
+ if (logservice != null) {
+ logservice.log(LogService.LOG_ERROR, ex.getMessage(), ex);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.osgitestrunner/.classpath b/org.eclipse.osee.framework.osgitestrunner/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.osgitestrunner/.project b/org.eclipse.osee.framework.osgitestrunner/.project
new file mode 100644
index 00000000000..903bffe9b8f
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.osgitestrunner</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.osgitestrunner/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.osgitestrunner/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..eff9a667f5c
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Apr 15 09:03:06 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.osgitestrunner/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.osgitestrunner/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..f7961624125
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Osgitest Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.osgitest;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.osee.framework.osgitestrunner.Activator
+Service-Component: OSGI-INF/testRunner.xml
+Import-Package: junit.framework,
+ junit.textui,
+ org.eclipse.osgi.framework.console,
+ org.osgi.framework
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.osgitestrunner/OSGI-INF/testRunner.xml b/org.eclipse.osee.framework.osgitestrunner/OSGI-INF/testRunner.xml
new file mode 100644
index 00000000000..d782f94c8a3
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/OSGI-INF/testRunner.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="OsgiTestRunner">
+ <implementation class="org.eclipse.osee.framework.osgitestrunner.JunitTestRunner"/>
+ <service>
+ <provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
+ </service>
+ <reference name="TestCollector"
+ interface="junit.framework.Test"
+ bind="addTest"
+ unbind="removeTest"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.osgitestrunner/build.properties b/org.eclipse.osee.framework.osgitestrunner/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/Activator.java b/org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/Activator.java
new file mode 100644
index 00000000000..25c29ded33d
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/Activator.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.framework.osgitestrunner;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/JunitTestRunner.java b/org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/JunitTestRunner.java
new file mode 100644
index 00000000000..8d729dbe694
--- /dev/null
+++ b/org.eclipse.osee.framework.osgitestrunner/src/org/eclipse/osee/framework/osgitestrunner/JunitTestRunner.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.framework.osgitestrunner;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.textui.TestRunner;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+import org.eclipse.osgi.framework.console.CommandProvider;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class JunitTestRunner implements CommandProvider {
+
+ private List<Test> tests;
+
+ public JunitTestRunner() {
+ tests = new CopyOnWriteArrayList<Test>();
+ }
+
+ public synchronized void _test(CommandInterpreter ci) {
+ TestRunner tr = new TestRunner();
+ List<Test> testsToRun = getTestsToRun(ci);
+ List<TestResult> results = new ArrayList<TestResult>();
+ long time = System.currentTimeMillis();
+ for (Test test : testsToRun) {
+ results.add(tr.doRun(test));
+ }
+ printResults(results, testsToRun, System.currentTimeMillis() - time);
+ }
+
+ /**
+ * @param results
+ * @param testsToRun
+ */
+ private void printResults(List<TestResult> results, List<Test> testsToRun, long elapsedTime) {
+ System.out.println("Summary --------------------------------------------------\n");
+ int runCount = 0;
+ int errorCount = 0;
+ int failureCount = 0;
+ for (TestResult result : results) {
+ runCount += result.runCount();
+ errorCount += result.errorCount();
+ failureCount += result.failureCount();
+ Enumeration<?> errors = result.errors();
+ while (errors.hasMoreElements()) {
+ System.out.println(String.format("ERROR: %s", errors.nextElement()));
+ }
+ Enumeration<?> failures = result.failures();
+ while (failures.hasMoreElements()) {
+ System.out.println(String.format("FAILURE: %s", failures.nextElement()));
+ }
+ }
+ if (errorCount + failureCount > 0) {
+ System.out.println("\nFAILURES!!!");
+ System.out.println(String.format("Tests run: %d, Failures: %d, Errors: %d", runCount, failureCount,
+ errorCount));
+ } else {
+ System.out.println(String.format("\nOK (%d tests)", runCount));
+ }
+ System.out.println(String.format("Elapsed Time: %d ms", elapsedTime));
+ }
+
+ /**
+ * @param ci
+ * @return
+ */
+ private List<Test> getTestsToRun(CommandInterpreter ci) {
+ List<Test> testsToRun = new ArrayList<Test>();
+ String arg = null;
+ List<String> itemsToMatch = new ArrayList<String>();
+ while ((arg = ci.nextArgument()) != null) {
+ itemsToMatch.add(arg);
+ }
+ for (Test t : tests) {
+ if (itemsToMatch.size() == 0) {
+ testsToRun.add(t);
+ } else {
+ for (String str : itemsToMatch) {
+ if (t.toString().contains(str)) {
+ testsToRun.add(t);
+ break;
+ }
+ }
+ }
+ }
+ return testsToRun;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.framework.console.CommandProvider#getHelp()
+ */
+ @Override
+ public String getHelp() {
+ return "\ttest <MatchString>... - run any TestSuite classes registered as services.\n\n";
+ }
+
+ public void addTest(Test test) {
+ tests.add(test);
+ }
+
+ public void removeTest(Test test) {
+ tests.remove(test);
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/.classpath b/org.eclipse.osee.framework.plugin.core/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/.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.framework.plugin.core/.project b/org.eclipse.osee.framework.plugin.core/.project
new file mode 100644
index 00000000000..ea36ab1093e
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.plugin.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.plugin.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.plugin.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.plugin.core/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.plugin.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..856a557de5d
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Plug-in for common eclipse-based non-ui code (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.plugin.core;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.plugin.core.PluginCoreActivator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.plugin.core.config,
+ org.eclipse.osee.framework.plugin.core.server,
+ org.eclipse.osee.framework.plugin.core.server.resources,
+ org.eclipse.osee.framework.plugin.core.server.task,
+ org.eclipse.osee.framework.plugin.core.util
+Import-Package: org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.plugin.core/build.properties b/org.eclipse.osee.framework.plugin.core/build.properties
new file mode 100644
index 00000000000..07b21305d68
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/build.properties
@@ -0,0 +1,9 @@
+bin.includes = META-INF/,\
+ schema/,\
+ plugin.xml,\
+ .
+output.library.jar = bin/
+jars.compile.order = library.jar,\
+ .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.framework.plugin.core/plugin.xml b/org.eclipse.osee.framework.plugin.core/plugin.xml
new file mode 100644
index 00000000000..72dda835096
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/plugin.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+<extension-point id="logHandler" name="Log Handler" schema="schema/logHandler.exsd"/>
+</plugin>
diff --git a/org.eclipse.osee.framework.plugin.core/schema/logHandler.exsd b/org.eclipse.osee.framework.plugin.core/schema/logHandler.exsd
new file mode 100644
index 00000000000..13ab21a3caa
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/schema/logHandler.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.plugin.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.plugin.core" id="logHandler" name="Log Handler"/>
+ </appInfo>
+ <documentation>
+ Allows addition of handlers to standard loggers.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="handler" minOccurs="1" maxOccurs="unbounded"/>
+ </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="handler">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="java.util.logging.Handler"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/ActivatorHelper.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/ActivatorHelper.java
new file mode 100644
index 00000000000..4701512c3fa
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/ActivatorHelper.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.framework.plugin.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ActivatorHelper {
+ private static Map<String, Plugin> pluginIdToOseePlugin = new HashMap<String, Plugin>();
+ private BundleContext context;
+ private Plugin plugin;
+
+ /**
+ *
+ */
+ public ActivatorHelper(BundleContext context, Plugin plugin) {
+ pluginIdToOseePlugin.put(plugin.getBundle().getSymbolicName(), plugin);
+ this.context = context;
+ this.plugin = plugin;
+ }
+
+ /**
+ * returns a File to from the default persistent storage area provided for the bundle by the Framework (.ie.)
+ * myworkspace/.metadata/.plugins/org.eclipse.pde.core/myPlugin/...
+ */
+ public File getPluginStoreFile(String path) {
+ return context.getDataFile(path);
+ }
+
+ /**
+ * finds a resource in the plugin bundle and writes it out to the default persistent storage area as a regualar file
+ *
+ * @param path
+ * @return Return plugin file reference
+ * @throws IOException
+ */
+ public File getPluginFile(String path) throws IOException {
+ File result = getPluginStoreFile(path);
+ result.getParentFile().mkdirs();
+ InputStream inStream = getInputStream(path);
+ Lib.inputStreamToFile(inStream, result);
+ if (!result.exists()) return null;
+ return result;
+ }
+
+ public InputStream getInputStream(String resource) throws IOException {
+ return plugin.getBundle().getEntry(resource).openStream();
+ }
+
+ public List<URL> getInputStreams(String directory, String pattern, boolean recurse) throws IOException {
+ Enumeration<?> enumeration = plugin.getBundle().findEntries(directory, pattern, recurse);
+ List<URL> inputs = new ArrayList<URL>();
+ while (enumeration.hasMoreElements()) {
+ inputs.add(((URL) enumeration.nextElement()));
+ }
+ return inputs;
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/OseeActivator.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/OseeActivator.java
new file mode 100644
index 00000000000..36476bd8551
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/OseeActivator.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.framework.plugin.core;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OseeActivator extends Plugin {
+ private ActivatorHelper helper;
+
+ /**
+ * The constructor.
+ */
+ protected OseeActivator() {
+ super();
+ }
+
+ /**
+ * finds a resource in the plugin bundle and writes it out to the default persistent storage area as a regualar file
+ *
+ * @param path
+ * @return Return plugin file reference
+ * @throws IOException
+ */
+ public File getPluginFile(String path) throws IOException {
+ return helper.getPluginFile(path);
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ helper = new ActivatorHelper(context, this);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/PluginCoreActivator.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/PluginCoreActivator.java
new file mode 100644
index 00000000000..c2e69229dca
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/PluginCoreActivator.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.framework.plugin.core;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class PluginCoreActivator extends OseeActivator {
+ private static PluginCoreActivator pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.plugin.core";
+ private ServiceTracker packageAdminTracker;
+
+ public PluginCoreActivator() {
+ super();
+ pluginInstance = this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ packageAdminTracker.close();
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static PluginCoreActivator getInstance() {
+ return pluginInstance;
+ }
+
+ public PackageAdmin getPackageAdmin() {
+ return (PackageAdmin) packageAdminTracker.getService();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.plugin.core.OseeActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+
+ packageAdminTracker = new ServiceTracker(context, PackageAdmin.class.getName(), null);
+ packageAdminTracker.open();
+
+ try {
+ Platform.getBundle("org.eclipse.equinox.ds").start();
+ } catch (Exception ex) {
+ OseeLog.log(PluginCoreActivator.class, Level.SEVERE, "Unable to load: org.eclipse.equinox.ds", ex);
+ }
+
+ for (Bundle bundle : context.getBundles()) {
+ checkForEarlyStartup(bundle);
+ }
+
+ context.addBundleListener(new BundleListener() {
+
+ @Override
+ public void bundleChanged(BundleEvent event) {
+ if (event.getType() == BundleEvent.RESOLVED) {
+ checkForEarlyStartup(event.getBundle());
+ }
+ }
+ });
+ }
+
+ /**
+ * @param bundle
+ */
+ private void checkForEarlyStartup(Bundle bundle) {
+ if (bundle.getHeaders().get("OseeEarlyStart") != null) {
+ try {
+ bundle.start();
+ } catch (BundleException ex) {
+ OseeLog.log(OseeActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DBErrorHandler.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DBErrorHandler.java
new file mode 100644
index 00000000000..7328637fbf0
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DBErrorHandler.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.framework.plugin.core.config;
+
+import java.sql.SQLException;
+
+public interface DBErrorHandler {
+ DbErrorCodeLevel getErrorLevel(SQLException ex);
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorCodeLevel.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorCodeLevel.java
new file mode 100644
index 00000000000..6429befdb6a
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorCodeLevel.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.framework.plugin.core.config;
+
+public enum DbErrorCodeLevel {
+ severe, warning, info
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerDerby.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerDerby.java
new file mode 100644
index 00000000000..d8a074f4ed0
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerDerby.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.framework.plugin.core.config;
+
+import java.sql.SQLException;
+
+public class DbErrorHandlerDerby implements DBErrorHandler {
+
+ public DbErrorCodeLevel getErrorLevel(SQLException ex) {
+ return DbErrorCodeLevel.severe;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerOracle.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerOracle.java
new file mode 100644
index 00000000000..7bfbb0ebfaf
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/DbErrorHandlerOracle.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.framework.plugin.core.config;
+
+import java.sql.SQLException;
+
+public class DbErrorHandlerOracle implements DBErrorHandler {
+
+ public DbErrorCodeLevel getErrorLevel(SQLException e) {
+ if ((e.getErrorCode() == 1012) || (e.getErrorCode() == 1033) || (e.getErrorCode() == 1034) || (e.getErrorCode() == 1089) || (e.getErrorCode() == 3113) || (e.getErrorCode() == 3114) || (e.getErrorCode() == 12203) || (e.getErrorCode() == 12500) || (e.getErrorCode() == 12571) || (e.getErrorCode() == 17002) || (e.getErrorCode() == 17008)) {
+ return DbErrorCodeLevel.warning;
+ } else {
+ return DbErrorCodeLevel.severe;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/EclipseHandler.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/EclipseHandler.java
new file mode 100644
index 00000000000..06564019977
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/EclipseHandler.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.framework.plugin.core.config;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+
+public class EclipseHandler extends Handler {
+
+ @Override
+ public void publish(LogRecord record) {
+
+ int level;
+ if (record.getLevel().intValue() >= Level.SEVERE.intValue()) {
+ level = Status.ERROR;
+ } else if (record.getLevel().intValue() >= Level.WARNING.intValue()) {
+ level = Status.WARNING;
+ } else {
+ level = Status.INFO;
+ }
+ try {
+ PluginCoreActivator.getInstance().getLog().log(
+ new Status(level, PluginCoreActivator.getInstance().getBundle().getSymbolicName(), level,
+ (record.getMessage() == null ? "NO MESSAGE" : record.getMessage()), record.getThrown()));
+ } catch (Exception ex) {
+ System.out.println(record.getMessage());
+ }
+
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/JiniLookupGroupConfig.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/JiniLookupGroupConfig.java
new file mode 100644
index 00000000000..f80c0630c89
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/JiniLookupGroupConfig.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.framework.plugin.core.config;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class JiniLookupGroupConfig {
+
+ private JiniLookupGroupConfig() {
+ }
+
+ public static String[] getOseeJiniServiceGroups() {
+ String[] serviceGroups = null;
+ try {
+ Bundle bundle = Platform.getBundle("org.eclipse.osee.framework.jini");
+ serviceGroups = new String[1];
+ serviceGroups[0] = (String) bundle.getHeaders().get("Bundle-Version");
+ } catch (Exception ex) {
+ OseeLog.log(JiniLookupGroupConfig.class, Level.INFO, "Error getting bundle org.eclipse.osee.framework.jini");
+ }
+
+ String filterGroups = OseeProperties.getOseeJiniServiceGroups();
+ if (filterGroups != null && filterGroups.length() > 0) {
+ String[] values = filterGroups.split(",");
+ for (int index = 0; index < values.length; index++) {
+ values[index] = values[index].trim();
+ }
+ serviceGroups = values;
+ }
+
+ if (serviceGroups == null || serviceGroups.length == 0) {
+ OseeLog.log(JiniLookupGroupConfig.class, Level.SEVERE,
+ "[-D" + filterGroups + "] was not set.\n" + "Please enter the Jini Group this service register with.");
+ serviceGroups = new String[] {"NO_LOOKUP_GROUP_SPECIFIED"};
+ } else {
+ String toStore = "";
+ for (int index = 0; index < serviceGroups.length; index++) {
+ toStore += serviceGroups[index];
+ if (index + 1 < serviceGroups.length) {
+ toStore += ",";
+ }
+ }
+ OseeLog.log(JiniLookupGroupConfig.class, Level.INFO, "osee.jini.lookup.groups: " + toStore);
+ OseeProperties.setOseeJiniServiceGroups(toStore);
+ }
+
+ return serviceGroups;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/NonEclipseManifestHeader.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/NonEclipseManifestHeader.java
new file mode 100644
index 00000000000..1818a459bc1
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/NonEclipseManifestHeader.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.framework.plugin.core.config;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class NonEclipseManifestHeader extends Dictionary<Object, Object> {
+
+ Object[] headers;
+ Object[] values;
+ int size = 0;
+
+ private NonEclipseManifestHeader(int initialCapacity) {
+ headers = new Object[initialCapacity];
+ values = new Object[initialCapacity];
+ }
+
+ private int getIndex(Object key) {
+ boolean stringKey = key instanceof String;
+ for (int i = 0; i < size; i++) {
+ if (headers[i].equals(key)) return i;
+ if (stringKey && (headers[i] instanceof String) && ((String) headers[i]).equalsIgnoreCase((String) key)) return i;
+ }
+ return -1;
+ }
+
+ public Object remove(Object key) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object put(Object key, Object value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public synchronized Object get(Object key) {
+ int i = -1;
+ if ((i = getIndex(key)) != -1) return values[i];
+ return null;
+ }
+
+ private Object remove(int remove) {
+ Object removed = values[remove];
+ for (int i = remove; i < size; i++) {
+ if (i == headers.length - 1) {
+ headers[i] = null;
+ values[i] = null;
+ } else {
+ headers[i] = headers[i + 1];
+ values[i] = values[i + 1];
+ }
+ }
+ if (remove < size) size--;
+ return removed;
+ }
+
+ public synchronized Object set(Object key, Object value) {
+ if (key instanceof String) key = ((String) key).intern();
+ int i = getIndex(key);
+ if (value == null) /* remove */
+ {
+ if (i != -1) return remove(i);
+ } else /* put */
+ {
+ if (i != -1) /* duplicate key */
+ throw new IllegalArgumentException("Duplicate key found" + key);
+ add(key, value);
+ }
+ return null;
+ }
+
+ private void add(Object header, Object value) {
+ if (size == headers.length) {
+ // grow the arrays
+ Object[] newHeaders = new Object[headers.length + 10];
+ Object[] newValues = new Object[values.length + 10];
+ System.arraycopy(headers, 0, newHeaders, 0, headers.length);
+ System.arraycopy(values, 0, newValues, 0, values.length);
+ headers = newHeaders;
+ values = newValues;
+ }
+ headers[size] = header;
+ values[size] = value;
+ size++;
+ }
+
+ public static Dictionary<Object, Object> parseManifest(InputStream in) throws Exception {
+ try {
+ NonEclipseManifestHeader headers = new NonEclipseManifestHeader(10);
+ BufferedReader br;
+ try {
+ br = new BufferedReader(new InputStreamReader(in, "UTF8")); //$NON-NLS-1$
+ } catch (UnsupportedEncodingException e) {
+ br = new BufferedReader(new InputStreamReader(in));
+ }
+
+ String header = null;
+ StringBuffer value = new StringBuffer(256);
+ boolean firstLine = true;
+
+ while (true) {
+ String line = br.readLine();
+ /*
+ * The java.util.jar classes in JDK 1.3 use the value of the last encountered manifest
+ * header. So we do the same to emulate this behavior. We no longer throw a
+ * BundleException for duplicate manifest headers.
+ */
+
+ if ((line == null) || (line.length() == 0)) /* EOF or empty line */
+ {
+ if (!firstLine) /* flush last line */
+ {
+ headers.set(header, null); /* remove old attribute,if present */
+ headers.set(header, value.toString().trim());
+ }
+ break; /* done processing main attributes */
+ }
+
+ if (line.charAt(0) == ' ') /* continuation */
+ {
+ if (firstLine) /* if no previous line */
+ {
+ throw new Exception("Invalid Space at line: " + line);
+ }
+ value.append(line.substring(1));
+ continue;
+ }
+
+ if (!firstLine) {
+ headers.set(header, null); /* remove old attribute,if present */
+ headers.set(header, value.toString().trim());
+ value.setLength(0); /* clear StringBuffer */
+ }
+
+ int colon = line.indexOf(':');
+ if (colon == -1) /* no colon */
+ {
+ throw new Exception("Invalid Colon at line: " + line);
+ }
+ header = line.substring(0, colon).trim();
+ value.append(line.substring(colon + 1));
+ firstLine = false;
+ }
+ return headers;
+ } catch (IOException e) {
+ throw new Exception("IO Exception: ", e);
+ } finally {
+ try {
+ in.close();
+ } catch (IOException ee) {
+ }
+ }
+ }
+
+ public synchronized Enumeration<Object> keys() {
+ return new ArrayEnumeration(headers, size);
+ }
+
+ public synchronized Enumeration<Object> elements() {
+ return new ArrayEnumeration(values, size);
+ }
+
+ public synchronized int size() {
+ return size;
+ }
+
+ public synchronized boolean isEmpty() {
+ return size == 0;
+ }
+
+ public String toString() {
+ String toReturn = "[";
+ for (int index = 0; index < size; index++) {
+ toReturn += headers[index] + "=" + values[index] + ",";
+ }
+ toReturn += "]";
+ return toReturn;
+ }
+
+ class ArrayEnumeration implements Enumeration<Object> {
+ private Object[] array;
+ int cur = 0;
+
+ public ArrayEnumeration(Object[] array, int size) {
+ this.array = new Object[size];
+ System.arraycopy(array, 0, this.array, 0, this.array.length);
+ }
+
+ public boolean hasMoreElements() {
+ return cur < array.length;
+ }
+
+ public Object nextElement() {
+ return array[cur++];
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeConsoleHandler.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeConsoleHandler.java
new file mode 100644
index 00000000000..f60fdef5b98
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeConsoleHandler.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.framework.plugin.core.config;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+public class OseeConsoleHandler extends Handler {
+
+ public OseeConsoleHandler() {
+ setFormatter(new SimpleFormatter());
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ String toPrint = getFormatter().format(record);
+
+ if (record.getLevel().intValue() >= Level.WARNING.intValue()) {
+ System.err.println(toPrint);
+ } else {
+ System.out.println(toPrint);
+ }
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeRunMode.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeRunMode.java
new file mode 100644
index 00000000000..47b99d66a12
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/config/OseeRunMode.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.framework.plugin.core.config;
+
+import javax.print.attribute.EnumSyntax;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+public class OseeRunMode extends EnumBase {
+ // Development, Production;
+ /**
+ *
+ */
+ private static final long serialVersionUID = -6075818565647033161L;
+ public static final OseeRunMode Development = new OseeRunMode(0);
+ public static final OseeRunMode Production = new OseeRunMode(1);
+ private static final String[] stringTable = new String[] {"Development", "Production"};
+ private static final OseeRunMode[] enumValueTable = new OseeRunMode[] {Development, Production};
+
+ /**
+ * @param value The bus value used for this enumeration.
+ */
+ private OseeRunMode(int value) {
+ super(value);
+ }
+
+ public static int getSize() {
+ return stringTable.length;
+ }
+
+ public static OseeRunMode getEnum(String str) {
+ return (OseeRunMode) getEnum(str, stringTable, enumValueTable);
+ }
+
+ public static OseeRunMode toEnum(int value) {
+ return (OseeRunMode) getEnum(value, enumValueTable);
+ }
+
+ public static OseeRunMode toEnum(EnumBase otherEnum) {
+ return toEnum(otherEnum.getValue());
+ }
+
+ protected String[] getStringTable() {
+ return stringTable;
+ }
+
+ protected EnumSyntax[] getEnumValueTable() {
+ return enumValueTable;
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/BundleResourceFinder.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/BundleResourceFinder.java
new file mode 100644
index 00000000000..94b1142b32e
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/BundleResourceFinder.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.framework.plugin.core.server;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+import org.osgi.framework.Bundle;
+
+public class BundleResourceFinder extends ResourceFinder {
+ private ArrayList<Bundle> bundles;
+
+ public BundleResourceFinder(String[] bundlenames) {
+ bundles = new ArrayList<Bundle>();
+ for (int i = 0; i < bundlenames.length; i++) {
+ Bundle bundle = Platform.getBundle(bundlenames[i]);
+ if (bundle != null) {
+ bundles.add(Platform.getBundle(bundlenames[i]));
+ } else {
+ OseeLog.log(PluginCoreActivator.class, Level.SEVERE, String.format(
+ "Unable to load bundle [ %s ]. This bundle was not added to the list in BundleResourceFinder.",
+ bundlenames[i]));
+ }
+ }
+ }
+
+ public byte[] find(String path) throws IOException {
+ for (int i = 0; i < bundles.size(); i++) {
+ URL url = bundles.get(i).getResource(path);
+ if (url != null) {
+ return getBytes(url.openStream());
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.plugin.core.server.ResourceFinder#dispose()
+ */
+ public void dispose() {
+ bundles.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassFinder.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassFinder.java
new file mode 100644
index 00000000000..20d6452dd21
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/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.framework.plugin.core.server;
+
+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.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServer.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServer.java
new file mode 100644
index 00000000000..fcab66d806f
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServer.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.core.server;
+
+import java.io.BufferedInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+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;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+
+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
+ * @param address
+ * @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() {
+
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0, "ClassServer Task");
+ th.setDaemon(true);
+ return th;
+ }
+ });
+ hostName = new URL("http://" + address.getHostAddress() + ":" + port + "/");
+
+ this.setName("OSEE ClassServer");
+ this.resourceFinders = new ArrayList<ResourceFinder>();
+ }
+
+ public void addResourceFinder(ResourceFinder finder) {
+ this.resourceFinders.add(finder);
+ }
+
+ /**
+ * Spawn a thread for each connection requesting service
+ */
+ public void run() {
+
+ String msg = "ClassServer started [";
+
+ msg += "port ";
+ msg += Integer.toString(getPort());
+ msg += "]";
+
+ OseeLog.log(PluginCoreActivator.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(PluginCoreActivator.class, Level.SEVERE, "accepting connection", e);
+ terminate();
+ OseeLog.log(PluginCoreActivator.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 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(PluginCoreActivator.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);
+ }
+
+ public void run() {
+ try {
+ DataOutputStream out = new DataOutputStream(sock.getOutputStream());
+ String req;
+ try {
+ req = getInput(sock, true);
+ } catch (Exception e) {
+ OseeLog.log(PluginCoreActivator.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(PluginCoreActivator.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(PluginCoreActivator.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(PluginCoreActivator.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(PluginCoreActivator.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.log(PluginCoreActivator.class, Level.FINE, String.format("%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(PluginCoreActivator.class, Level.INFO, "writing response", e);
+ } finally {
+ try {
+ sock.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServerPermissions.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServerPermissions.java
new file mode 100644
index 00000000000..ee4e955fba3
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ClassServerPermissions.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.framework.plugin.core.server;
+
+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 ArrayList<Permission> list;
+
+ public ClassServerPermissions() {
+ list = new ArrayList<Permission>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.security.PermissionCollection#add(java.security.Permission)
+ */
+ public void add(Permission permission) {
+ list.add(permission);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.security.PermissionCollection#implies(java.security.Permission)
+ */
+ public boolean implies(Permission permission) {
+ for (int i = 0; i < list.size(); i++) {
+ if (list.get(i).implies(permission)) return true;
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.security.PermissionCollection#elements()
+ */
+ public Enumeration<Permission> elements() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/PathResourceFinder.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/PathResourceFinder.java
new file mode 100644
index 00000000000..5f577657d78
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/PathResourceFinder.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.core.server;
+
+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;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+
+public class PathResourceFinder extends ResourceFinder {
+
+ private final HashSet<JarFile> jars = new HashSet<JarFile>(128);
+ private final HashSet<String> dirs = new HashSet<String>(128);
+ private final HashMap<String, JarFile[]> map = new HashMap<String, JarFile[]>(128);
+ private boolean trees;
+ private 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);
+ }
+
+ 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<JarFile>(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(PluginCoreActivator.class, Level.INFO, "removing JAR file " + name);
+ jarFile.close();
+ } catch (IOException ex) {
+ // do nothing
+ }
+ it.remove();
+ return;
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.plugin.core.server.ResourceFinder#dispose()
+ */
+ public void dispose() {
+ synchronized (jars) {
+ OseeLog.log(PluginCoreActivator.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.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ResourceFinder.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/ResourceFinder.java
new file mode 100644
index 00000000000..8c8456b25d7
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/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.framework.plugin.core.server;
+
+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.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/resources/classserver.properties b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/resources/classserver.properties
new file mode 100644
index 00000000000..d9c2d56f85e
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/resources/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.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Command.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Command.java
new file mode 100644
index 00000000000..ae1e9835046
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Command.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.framework.plugin.core.server.task;
+
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class Command {
+ private final int commandId;
+
+ public Command(int commandId) {
+ this.commandId = commandId;
+ }
+
+ public void sendCommand(ObjectOutputStream toServer, Object... parameters) throws IOException {
+ toServer.writeInt(commandId);
+ toServer.writeByte((byte) parameters.length); // number of parameters
+
+ for (Object parameter : parameters) {
+ writeParameter(toServer, parameter);
+ }
+
+ toServer.flush();
+ }
+
+ private void writeParameter(ObjectOutputStream toServer, Object parameter) throws IOException {
+ if (parameter instanceof Boolean) {
+ toServer.writeByte((byte) Parameter.BOOLEAN.ordinal());
+ toServer.writeByte(((Boolean) parameter) ? 1 : 0);
+ }
+ if (parameter instanceof Byte) {
+ toServer.writeByte((byte) Parameter.BYTE.ordinal());
+ toServer.writeByte((Byte) parameter);
+ }
+ if (parameter instanceof Short) {
+ toServer.writeByte((byte) Parameter.SHORT.ordinal());
+ toServer.writeShort((Short) parameter);
+ }
+ if (parameter instanceof Character) {
+ toServer.writeByte((byte) Parameter.CHAR.ordinal());
+ toServer.writeChar((Character) parameter);
+ }
+ if (parameter instanceof Integer) {
+ toServer.writeByte((byte) Parameter.INT.ordinal());
+ toServer.writeInt((Integer) parameter);
+ }
+ if (parameter instanceof Long) {
+ toServer.writeByte((byte) Parameter.LONG.ordinal());
+ toServer.writeLong((Long) parameter);
+ }
+ if (parameter instanceof Float) {
+ toServer.writeByte((byte) Parameter.FLOAT.ordinal());
+ toServer.writeFloat((Float) parameter);
+ }
+ if (parameter instanceof Double) {
+ toServer.writeByte((byte) Parameter.DOUBLE.ordinal());
+ toServer.writeDouble((Double) parameter);
+ }
+ if (parameter instanceof String) {
+ toServer.writeByte((byte) Parameter.STRING.ordinal());
+ toServer.writeUTF((String) parameter);
+ }
+ /* if (parameter.getClass().isArray()) {
+ for (Object obj : parameter) {
+ toServer.writeShort(Array.getLength(obj)); // write array length
+ writeParameter(toServer, obj);
+ }
+ }*/
+ }
+
+ public abstract Object invoke(Object... parameters) throws Exception;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeCommand.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeCommand.java
new file mode 100644
index 00000000000..04009a70db5
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeCommand.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.framework.plugin.core.server.task;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class NativeCommand extends Command {
+ public static final int NATIVE_CMD_ID = 0;
+
+ public NativeCommand() {
+ super(NATIVE_CMD_ID);
+ }
+
+ public void sendNativeCommand(ObjectOutputStream toServer, String[] callAndArgs) throws IOException {
+ Object[] params = new Object[callAndArgs.length];
+ System.arraycopy(callAndArgs, 0, params, 0, params.length);
+ sendCommand(toServer, params);
+ }
+
+ /* (non-Javadoc)
+ * @see osee.plugin.core.server.task.Command#invoke(java.lang.Object...)
+ */
+ public Object invoke(Object... parameters) throws IOException {
+ String[] callAndArgs = new String[parameters.length];
+ System.arraycopy(parameters, 0, callAndArgs, 0, parameters.length);
+
+ Process process = Runtime.getRuntime().exec(callAndArgs);
+ BufferedReader inError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+ BufferedReader inOutput = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+ ArrayList<String> lines = new ArrayList<String>();
+ String line = null;
+ while ((line = inOutput.readLine()) != null) {
+ lines.add(line);
+ }
+ inOutput.close();
+
+ while ((line = inError.readLine()) != null) {
+ lines.add(line);
+ }
+ inError.close();
+ return lines.toArray(new String[lines.size()]);
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeTaskMaster.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeTaskMaster.java
new file mode 100644
index 00000000000..c8f46e3eaac
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/NativeTaskMaster.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.framework.plugin.core.server.task;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class NativeTaskMaster {
+ private boolean listening;
+ private ServerSocket serverSocket;
+
+ public static void main(String[] args) {
+ if (args.length != 1) {
+ System.err.println("Usage: java NativeTaskMaster <port>");
+ return;
+ }
+
+ try {
+ NativeTaskMaster app = new NativeTaskMaster(Integer.parseInt(args[0]));
+ app.listen();
+ } catch (NumberFormatException ex) {
+ System.err.println(ex);
+ return;
+ }
+ }
+
+ /**
+ * @param port
+ */
+ public NativeTaskMaster(int port) {
+ super();
+ this.listening = true;
+
+ if (port < 1) {
+ throw new IllegalArgumentException("port argument must be a natural number");
+ }
+ try {
+ serverSocket = new ServerSocket(port);
+ } catch (IOException ex) {
+ System.err.println("Could not listen on port: " + port + ".");
+ return;
+ }
+ }
+
+ private void listen() {
+ try {
+ while (listening) {
+ Socket socket = serverSocket.accept(); // wait for the next connection
+ new Thread(new TaskServerThread(587289473, socket)).start();
+ }
+ serverSocket.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Parameter.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Parameter.java
new file mode 100644
index 00000000000..f5dc24e2dea
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/Parameter.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.framework.plugin.core.server.task;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum Parameter {
+ BOOLEAN,
+ BYTE,
+ SHORT,
+ CHAR,
+ INT,
+ LONG,
+ FLOAT,
+ DOUBLE,
+ STRING,
+ BOOLEAN_ARRAY,
+ BYTE_ARRAY,
+ SHORT_ARRAY,
+ CHAR_ARRAY,
+ INT_ARRAY,
+ LONG_ARRAY,
+ FLOAT_ARRAY,
+ DOUBLE_ARRAY,
+ STRING_ARRAY
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskRequester.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskRequester.java
new file mode 100644
index 00000000000..4b144424c06
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskRequester.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.framework.plugin.core.server.task;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.ObjectOutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class TaskRequester {
+ private NativeCommand nativeCommand;
+ private Socket taskSocket;
+ private BufferedReader fromServer;
+ private ObjectOutputStream toServer;
+
+ public TaskRequester(String machine, int port) throws IOException {
+ if (port < 1) {
+ throw new IllegalArgumentException("port argument must be a natural number");
+ }
+ if (machine.equals("")) {
+ throw new IllegalArgumentException("machine must be specified");
+ }
+
+ taskSocket = new Socket(machine, port);
+ fromServer = new BufferedReader(new InputStreamReader(taskSocket.getInputStream()));
+ toServer = new ObjectOutputStream(taskSocket.getOutputStream());
+ toServer.writeInt(587289473); // magic number
+ nativeCommand = new NativeCommand();
+ }
+
+ public void close() {
+ try {
+ toServer.close();
+ taskSocket.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private void executeCommand(String[] callAndArgs) throws IOException {
+ nativeCommand.sendNativeCommand(toServer, callAndArgs);
+ }
+
+ private static void printUsage() {
+ System.err.println("Usage: java TaskRequester <cmd> [args]");
+ }
+
+ public static void main(String[] args) throws IOException {
+ if (args.length < 1) {
+ printUsage();
+ return;
+ }
+
+ TaskRequester app = new TaskRequester(InetAddress.getLocalHost().getHostName(), 8140);
+ app.executeCommand(args);
+
+ String line = null;
+ while ((line = app.fromServer.readLine()) != null) {
+ System.out.printf(line);
+ }
+ app.close();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskServerThread.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskServerThread.java
new file mode 100644
index 00000000000..7086c418681
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/server/task/TaskServerThread.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.core.server.task;
+
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.BYTE;
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.CHAR;
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.DOUBLE;
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.INT;
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.LONG;
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.SHORT;
+import static org.eclipse.osee.framework.plugin.core.server.task.Parameter.STRING;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.PrintWriter;
+import java.net.Socket;
+import java.util.HashMap;
+
+/**
+ * Protocol 2-byte 1-byte 1-byte n-bytes <command_id> <n_params> [<type_id> <parma_value>]* For each type, the protocol
+ * explicitly defines the format of the paramater value.
+ *
+ * @author Ryan D. Brooks
+ */
+public class TaskServerThread implements Runnable {
+ private int magicNumber;
+ private Socket socket = null;
+ private ObjectInputStream inFromClient;
+ private PrintWriter out;
+ private HashMap<Integer, Command> commands;
+ private boolean running;
+
+ public TaskServerThread(int magicNumber, Socket socket) {
+ this.socket = socket;
+ this.magicNumber = magicNumber;
+ this.commands = new HashMap<Integer, Command>();
+ running = true;
+ }
+
+ public void run() {
+ try {
+ out = new PrintWriter(socket.getOutputStream(), true);
+ inFromClient = new ObjectInputStream(socket.getInputStream()); // this is a blocking call
+
+ int code = inFromClient.readInt();
+ if (code != magicNumber) {
+ System.out.println("look what you did!");
+ return;
+ }
+ while (running) {
+ try {
+ int commandId = inFromClient.readUnsignedShort();
+ Object[] parameters = parseParameters();
+
+ Command command = commands.get(commandId);
+ sendResultToClient(command.invoke(parameters));
+ } catch (Exception ex) {
+ System.out.println(ex);
+ }
+ }
+
+ inFromClient.close();
+ out.close();
+ socket.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * @param result
+ */
+ private void sendResultToClient(Object result) {
+ if (result == null) {
+ return;
+ }
+ if (result instanceof Object[]) {
+
+ }
+
+ }
+
+ public void registerCommand(int commandId, Command command) {
+ commands.put(commandId, command);
+ }
+
+ /*
+ * Protocol
+ * 2-byte 1-byte 1-byte n-bytes
+ * <command_id> <n_params> [<type_id> <param_value>]
+ */
+ private Object[] parseParameters() throws IOException {
+ int parametersCount = inFromClient.readUnsignedByte();
+ if (parametersCount == 0) {
+ return null;
+ }
+ Object[] parameters = new Object[parametersCount];
+
+ for (int i = 0; i < parametersCount; i++) {
+ parameters[i] = readNextParameter();
+ }
+ return parameters;
+ }
+
+ private Object readNextParameter() throws IOException {
+ return readNextParameter(Parameter.values()[inFromClient.readUnsignedByte()]);
+ }
+
+ /**
+ * type type_id format boolean 0 unsigned byte byte 1 signed byte short 2 signed 2-bytes char 3 unsigned 2-bytes int
+ * 4 signed 4-bytes long 5 signed 8-bytes float 6 4-bytes double 7 8-bytes string 8 unsigned 2-byte len, n-bytes char
+ * data boolean_array 9 unsigned 2-byte array element count, element data byte_array 10 unsigned 2-byte array element
+ * count, element data short_array 11 unsigned 2-byte array element count, element data char_array 12 unsigned 2-byte
+ * array element count, element data int_array 13 unsigned 2-byte array element count, element data long_array 14
+ * unsigned 2-byte array element count, element data float_array 15 unsigned 2-byte array element count, element data
+ * double_array 16 unsigned 2-byte array element count, element data string_array 17 unsigned 2-byte array element
+ * count, element data
+ *
+ * @param typeId
+ * @return Return next parameter reference
+ */
+ private Object readNextParameter(Parameter typeId) {
+ try {
+ switch (typeId) {
+ case BOOLEAN:
+ return inFromClient.readBoolean();
+ case BYTE:
+ return inFromClient.readByte();
+ case SHORT:
+ return inFromClient.readShort();
+ case CHAR:
+ return inFromClient.readChar();
+ case INT:
+ return inFromClient.readInt();
+ case LONG:
+ return inFromClient.readLong();
+ case FLOAT:
+ return inFromClient.readFloat();
+ case DOUBLE:
+ return inFromClient.readDouble();
+ case STRING:
+ return inFromClient.readUTF();
+ case BYTE_ARRAY:
+ byte[] byteArray = new byte[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < byteArray.length; i++) {
+ byteArray[i] = (Byte) readNextParameter(BYTE);
+ }
+ return byteArray;
+ case SHORT_ARRAY:
+ short[] shortArray = new short[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < shortArray.length; i++) {
+ shortArray[i] = (Short) readNextParameter(SHORT);
+ }
+ return shortArray;
+ case CHAR_ARRAY:
+ char[] charArray = new char[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < charArray.length; i++) {
+ charArray[i] = (Character) readNextParameter(CHAR);
+ }
+ return charArray;
+ case INT_ARRAY:
+ int[] intArray = new int[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < intArray.length; i++) {
+ intArray[i] = (Integer) readNextParameter(INT);
+ }
+ return intArray;
+ case LONG_ARRAY:
+ long[] longArray = new long[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < longArray.length; i++) {
+ longArray[i] = (Long) readNextParameter(LONG);
+ }
+ return longArray;
+ case FLOAT_ARRAY:
+ int[] floatArray = new int[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < floatArray.length; i++) {
+ floatArray[i] = (Integer) readNextParameter(INT);
+ }
+ return floatArray;
+ case DOUBLE_ARRAY:
+ double[] doubleArray = new double[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < doubleArray.length; i++) {
+ doubleArray[i] = (Double) readNextParameter(DOUBLE);
+ }
+ return doubleArray;
+ case STRING_ARRAY:
+ String[] stringArray = new String[inFromClient.readUnsignedShort()];
+ for (int i = 0; i < stringArray.length; i++) {
+ stringArray[i] = (String) readNextParameter(STRING);
+ }
+ return stringArray;
+ default:
+ throw new IllegalArgumentException("invalid parameter type id");
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/CatchAndReleaseJob.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/CatchAndReleaseJob.java
new file mode 100644
index 00000000000..0e5ae6600c8
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/CatchAndReleaseJob.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.framework.plugin.core.util;
+
+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.osee.framework.logging.OseeLog;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CatchAndReleaseJob extends Job {
+ private final IExceptionableRunnable runnable;
+ private final Class<?> clazz;
+ private final String pluginId;
+
+ /**
+ * @param name
+ * @param runnable
+ * @param logger
+ * @param pluginId
+ */
+ public CatchAndReleaseJob(String name, IExceptionableRunnable runnable, Class<?> clazz, String pluginId) {
+ super(name);
+ this.runnable = runnable;
+ this.clazz = clazz;
+ this.pluginId = pluginId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ runnable.run(monitor);
+ } catch (Exception ex) {
+ String message = ex.getLocalizedMessage() == null ? ex.toString() : ex.getLocalizedMessage();
+ OseeLog.log(clazz, Level.SEVERE, ex);
+ return new Status(Status.ERROR, pluginId, Status.OK, message, ex);
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExportClassLoader.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExportClassLoader.java
new file mode 100644
index 00000000000..56489c89db0
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExportClassLoader.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.framework.plugin.core.util;
+
+import java.util.HashMap;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+import org.osgi.framework.Bundle;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ExportClassLoader extends ClassLoader {
+
+ private static ExportClassLoader exportClassloaderInstance;
+ private final PackageAdmin packageAdmin;
+ private final HashMap<String, Bundle> cache = new HashMap<String, Bundle>(1024);
+
+ public static ExportClassLoader getInstance(){
+ if(exportClassloaderInstance == null){
+ exportClassloaderInstance = new ExportClassLoader();
+ }
+ return exportClassloaderInstance;
+ }
+
+ public ExportClassLoader(PackageAdmin packageAdmin) {
+ super(ExportClassLoader.class.getClassLoader());
+ this.packageAdmin = packageAdmin;
+ }
+
+ public ExportClassLoader()
+ {
+ this(PluginCoreActivator.getInstance().getPackageAdmin());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.ClassLoader#findClass(java.lang.String)
+ */
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ try {
+ Bundle bundle = getExportingBundle(name);
+ if (bundle != null) {
+ return bundle.loadClass(name);
+ }
+ throw new ClassNotFoundException("could not locate a class for " + name);
+ } catch (Exception e) {
+ throw new ClassNotFoundException("could not locate a class for " + name, e);
+ }
+ }
+
+ public Bundle getExportingBundle(String name) {
+ final String pkg = name.substring(0, name.lastIndexOf('.'));
+ Bundle cachedBundle = cache.get(pkg);
+ if (cachedBundle != null && cachedBundle.getState() != Bundle.UNINSTALLED) {
+ return cachedBundle;
+ }
+ ExportedPackage[] list = packageAdmin.getExportedPackages(pkg);
+ if (list != null) {
+ for (ExportedPackage ep : list) {
+ final Bundle bundle = ep.getExportingBundle();
+ final int state = bundle.getState();
+ if (state == Bundle.RESOLVED || state == Bundle.STARTING
+ || state == Bundle.ACTIVE || state == Bundle.STOPPING) {
+ cache.put(pkg, bundle);
+ return bundle;
+ }
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionDefinedObjects.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionDefinedObjects.java
new file mode 100644
index 00000000000..3fdbd2b3c88
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionDefinedObjects.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.framework.plugin.core.util;
+
+import java.lang.reflect.Method;
+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.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExtensionDefinedObjects<T> {
+
+ private List<T> loadedObjects;
+ private Map<String, T> objectsByID;
+
+ private String extensionPointId;
+ private String elementName;
+ private String classNameAttribute;
+
+ public ExtensionDefinedObjects(String extensionPointId, String elementName, String classNameAttribute) {
+ this.extensionPointId = extensionPointId;
+ this.elementName = elementName;
+ this.classNameAttribute = classNameAttribute;
+ }
+
+ public List<T> getObjects() {
+ checkInitialized();
+ return loadedObjects;
+ }
+
+ public T getObjectById(String id) {
+ checkInitialized();
+ return objectsByID.get(id);
+ }
+
+ public Collection<String> getObjectIds() {
+ checkInitialized();
+ return objectsByID.keySet();
+ }
+
+ private void checkInitialized() {
+ if (!isInitialized()) {
+ initialize(extensionPointId, elementName, classNameAttribute);
+ }
+ }
+
+ private boolean isInitialized() {
+ return loadedObjects != null && objectsByID != null;
+ }
+
+ public void clear() {
+ if (loadedObjects != null) {
+ loadedObjects.clear();
+ loadedObjects = null;
+ }
+ if (objectsByID != null) {
+ objectsByID.clear();
+ objectsByID = null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void initialize(String extensionPointId, String elementName, String classNameAttribute) {
+ loadedObjects = new ArrayList<T>();
+ objectsByID = new HashMap<String, T>();
+ List<IConfigurationElement> elements = ExtensionPoints.getExtensionElements(extensionPointId, elementName);
+ for (IConfigurationElement element : elements) {
+ IExtension extension = ((IExtension) element.getParent());
+ String identifier = extension.getUniqueIdentifier();
+ String className = element.getAttribute(classNameAttribute);
+ String bundleName = element.getContributor().getName();
+
+ if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> taskClass = bundle.loadClass(className);
+ T object = null;
+ try {
+ Method getInstance = taskClass.getMethod("getInstance", new Class[] {});
+ object = (T) getInstance.invoke(null, new Object[] {});
+ } catch (Exception ex) {
+ object = (T) taskClass.newInstance();
+ }
+ if (object != null) {
+ loadedObjects.add(object);
+ objectsByID.put(identifier, object);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OseeActivator.class, Level.SEVERE, String.format("Unable to Load: [%s - %s]", bundleName,
+ className), ex);
+ }
+ }
+ }
+ if (loadedObjects.size() == 0) {
+ OseeLog.log(OseeActivator.class, Level.WARNING, String.format(
+ "No Objects loaded for [%s] with element name [%s] and attribute [%s]", extensionPointId, elementName,
+ classNameAttribute));
+ }
+ }
+
+ public String toString() {
+ return getObjects().toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionPoints.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionPoints.java
new file mode 100644
index 00000000000..6c13cad0896
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/ExtensionPoints.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.core.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+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.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExtensionPoints {
+ public static List<IConfigurationElement> getExtensionElements(Plugin plugin, String extensionPointName, String elementName) {
+ Bundle bundle = plugin.getBundle();
+ return getExtensionElements(bundle.getSymbolicName() + "." + extensionPointName, elementName);
+ }
+
+ public static List<IConfigurationElement> getExtensionElements(String extensionPointId, String elementName) {
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ if (extensionRegistry == null) {
+ throw new IllegalStateException("The extension registry is unavailable");
+ }
+
+ IExtensionPoint point = extensionRegistry.getExtensionPoint(extensionPointId);
+ if (point == null) {
+ throw new IllegalArgumentException("The extension point " + extensionPointId + " does not exist");
+ }
+
+ IExtension[] extensions = point.getExtensions();
+ ArrayList<IConfigurationElement> elementsList = new ArrayList<IConfigurationElement>(extensions.length * 3);
+
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equalsIgnoreCase(elementName)) {
+ elementsList.add(element);
+ }
+ }
+ }
+ return elementsList;
+ }
+
+ /**
+ * Return extension point unique ids if type extensionPointId
+ *
+ * @param extensionPointId <plugin>.Point Id
+ * @param extensionPointUniqueIds array of unique ids
+ * @return
+ */
+ public static List<IExtension> getExtensionsByUniqueId(String extensionPointId, Collection<String> extensionPointUniqueIds) {
+ List<IExtension> extensions = new ArrayList<IExtension>();
+ for (String entensionPointUniqueId : extensionPointUniqueIds) {
+ IExtension extension = Platform.getExtensionRegistry().getExtension(entensionPointUniqueId);
+ if (extension == null) {
+ OseeLog.log(PluginCoreActivator.class, Level.SEVERE,
+ "Unable to locate extension [" + entensionPointUniqueId + "]");
+ } else {
+ String thisPointId = extension.getExtensionPointUniqueIdentifier();
+ if (extensionPointId.equals(thisPointId)) {
+ extensions.add(extension);
+ } else {
+ OseeLog.log(PluginCoreActivator.class, Level.SEVERE,
+ "Unknown extension id [" + thisPointId + "] from extension [" + entensionPointUniqueId + "]");
+ }
+ }
+ }
+ return extensions;
+ }
+
+ public static List<String> getExtensionsPointUniqueIds(String extensionPointId) {
+ List<String> extensionPointIds = new ArrayList<String>();
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(extensionPointId);
+ if (point == null) {
+ throw new IllegalArgumentException("The extension point " + extensionPointId + " does not exist");
+ }
+
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ extensionPointIds.add(extension.getUniqueIdentifier());
+ }
+ return extensionPointIds;
+ }
+
+ public static IConfigurationElement getExtensionElement(String extensionPointId, String elementName) {
+ List<IConfigurationElement> elements = ExtensionPoints.getExtensionElements(extensionPointId, elementName);
+
+ if (elements.size() == 0) {
+ throw new IllegalArgumentException(
+ "no elements named " + elementName + " for " + extensionPointId + " where found.");
+ }
+ if (elements.size() > 1) {
+ throw new IllegalArgumentException(
+ elements.size() + " elements named " + elementName + " for " + extensionPointId + " where found. Expected exactly one.");
+ }
+ return elements.get(0);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/IExceptionableRunnable.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/IExceptionableRunnable.java
new file mode 100644
index 00000000000..646e7cc61ae
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/IExceptionableRunnable.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.framework.plugin.core.util;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public interface IExceptionableRunnable {
+
+ public IStatus run(IProgressMonitor monitor) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/Jobs.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/Jobs.java
new file mode 100644
index 00000000000..1d20d97a42a
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/Jobs.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.framework.plugin.core.util;
+
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public final class Jobs {
+
+ private Jobs() {
+ }
+
+ public static Job startJob(Job job, IJobChangeListener jobChangeListener) {
+ return startJob(job, true, jobChangeListener);
+ }
+
+ public static Job startJob(Job job) {
+ return startJob(job, true, null);
+ }
+
+ public static Job startJob(Job job, boolean user) {
+ return startJob(job, user, null);
+ }
+
+ public static void runInJob(String name, IExceptionableRunnable runnable, Class<?> clazz, String pluginId) {
+ runInJob(name, runnable, clazz, pluginId, true);
+ }
+
+ public static void runInJob(String name, IExceptionableRunnable runnable, Class<?> clazz, String pluginId, boolean user) {
+ startJob(new CatchAndReleaseJob(name, runnable, clazz, pluginId), user);
+ }
+
+ public static void runInJob(AbstractOperation operation, boolean user) {
+ Operations.executeAsJob(operation, user);
+ }
+
+ public static Job startJob(Job job, boolean user, IJobChangeListener jobChangeListener) {
+ return Operations.scheduleJob(job, user, Job.LONG, jobChangeListener);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/LogProgressMonitor.java b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/LogProgressMonitor.java
new file mode 100644
index 00000000000..d1a85f5cc7e
--- /dev/null
+++ b/org.eclipse.osee.framework.plugin.core/src/org/eclipse/osee/framework/plugin/core/util/LogProgressMonitor.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.framework.plugin.core.util;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LogProgressMonitor implements IProgressMonitor {
+ private boolean isCancelled;
+ private String taskName;
+
+ public LogProgressMonitor() {
+ this.isCancelled = false;
+ this.taskName = "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#beginTask(java.lang.String, int)
+ */
+ @Override
+ public void beginTask(String name, int totalWork) {
+ this.taskName = name;
+ OseeLog.log(PluginCoreActivator.class, Level.INFO, String.format("Starting: %s", taskName));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#done()
+ */
+ @Override
+ public void done() {
+ OseeLog.log(PluginCoreActivator.class, Level.INFO, String.format("Finished: %s", taskName));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#internalWorked(double)
+ */
+ @Override
+ public void internalWorked(double work) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
+ */
+ @Override
+ public boolean isCanceled() {
+ return isCancelled;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
+ */
+ @Override
+ public void setCanceled(boolean value) {
+ this.isCancelled = value;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(java.lang.String)
+ */
+ @Override
+ public void setTaskName(String name) {
+ this.taskName = name;
+ OseeLog.log(PluginCoreActivator.class, Level.INFO, name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#subTask(java.lang.String)
+ */
+ @Override
+ public void subTask(String name) {
+ OseeLog.log(PluginCoreActivator.class, Level.FINER, name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IProgressMonitor#worked(int)
+ */
+ @Override
+ public void worked(int work) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.postgresql/.classpath b/org.eclipse.osee.framework.postgresql/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.postgresql/.project b/org.eclipse.osee.framework.postgresql/.project
new file mode 100644
index 00000000000..a4a66b0c183
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.postgresql</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.postgresql/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.postgresql/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..b83ba010d18
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Mon Jul 14 14:56:26 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.postgresql/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.postgresql/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..d2a82876f61
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Postgresql Db Connector Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.postgresql;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.postgresql.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-ActivationPolicy: lazy
+OseeEarlyStart: true
+Service-Component: OSGI-INF/postgresql.connection.driver.provider.xml
+Import-Package: org.eclipse.osee.framework.db.connection,
+ org.osgi.framework,
+ org.postgresql;resolution:=optional
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds
diff --git a/org.eclipse.osee.framework.postgresql/OSGI-INF/postgresql.connection.driver.provider.xml b/org.eclipse.osee.framework.postgresql/OSGI-INF/postgresql.connection.driver.provider.xml
new file mode 100644
index 00000000000..e71e14ee809
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/OSGI-INF/postgresql.connection.driver.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="postgresql.connection.driver.provider">
+ <implementation class="org.eclipse.osee.framework.postgresql.PostgresqlConnection"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.db.connection.IConnection"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.postgresql/build.properties b/org.eclipse.osee.framework.postgresql/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/Activator.java b/org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/Activator.java
new file mode 100644
index 00000000000..be907388ad6
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/Activator.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.framework.postgresql;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/PostgresqlConnection.java b/org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/PostgresqlConnection.java
new file mode 100644
index 00000000000..bb19f639216
--- /dev/null
+++ b/org.eclipse.osee.framework.postgresql/src/org/eclipse/osee/framework/postgresql/PostgresqlConnection.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.framework.postgresql;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+import org.eclipse.osee.framework.db.connection.IConnection;
+
+public class PostgresqlConnection implements IConnection {
+
+ private static final String driverName = "org.postgresql.Driver";
+
+ public PostgresqlConnection() {
+ }
+
+ public Connection getConnection(Properties properties, String connectionURL) throws ClassNotFoundException, SQLException {
+ Class.forName(driverName);
+ Connection connection = DriverManager.getConnection(connectionURL, properties);
+ return connection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.IConnection#getDriver()
+ */
+ @Override
+ public String getDriver() {
+ return driverName;
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/.classpath b/org.eclipse.osee.framework.resource.locator.attribute.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/.project b/org.eclipse.osee.framework.resource.locator.attribute.test/.project
new file mode 100644
index 00000000000..5693c236da6
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.locator.attribute.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.resource.locator.attribute.test/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.locator.attribute.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..1f3b33102e6
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Apr 15 12:48:51 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.locator.attribute.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..75de9ed9ab1
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.locator.attribute.test;singleton:=true
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.resource.locator.attribute.test.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/tests.xml
+Import-Package: junit.framework,
+ org.eclipse.osee.framework.resource.locator.attribute,
+ org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/OSGI-INF/tests.xml b/org.eclipse.osee.framework.resource.locator.attribute.test/OSGI-INF/tests.xml
new file mode 100644
index 00000000000..e039565c72b
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/OSGI-INF/tests.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="resource.locator.attribute.tests">
+ <implementation class="org.eclipse.osee.framework.resource.locator.attribute.test.AllResourceLocatorAttributeTests"/>
+ <service>
+ <provide interface="junit.framework.Test"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/build.properties b/org.eclipse.osee.framework.resource.locator.attribute.test/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/Activator.java b/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/Activator.java
new file mode 100644
index 00000000000..9b0fc990aa9
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/Activator.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.resource.locator.attribute.test;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/AllResourceLocatorAttributeTests.java b/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/AllResourceLocatorAttributeTests.java
new file mode 100644
index 00000000000..263b3f878c1
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/AllResourceLocatorAttributeTests.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.framework.resource.locator.attribute.test;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AllResourceLocatorAttributeTests extends TestSuite {
+
+ public AllResourceLocatorAttributeTests() {
+ addTestSuite(TestResourceLocatorAttribute.class);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/TestResourceLocatorAttribute.java b/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/TestResourceLocatorAttribute.java
new file mode 100644
index 00000000000..a7f1f976110
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute.test/src/org/eclipse/osee/framework/resource/locator/attribute/test/TestResourceLocatorAttribute.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.framework.resource.locator.attribute.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.resource.locator.attribute.AttributeLocatorProvider;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestResourceLocatorAttribute extends TestCase {
+
+ public void testCreateAttributeLocatorProvider() {
+ assertNotNull(new AttributeLocatorProvider());
+ }
+
+ public void testIsValid() {
+ AttributeLocatorProvider provider = new AttributeLocatorProvider();
+ String[] data = new String[] {"a", "", null, "attr://", "attr"};
+ boolean[] expected = new boolean[] {false, false, false, false, true};
+
+ for (int index = 0; index < 0; index++) {
+ boolean result = provider.isValid(data[index]);
+ assertEquals(expected[index], result);
+ }
+ }
+
+ private List<TestData> getTestGenerateLocatorData() {
+ List<TestData> cases = new ArrayList<TestData>();
+ cases.add(new TestData("1", "", null, true, null));
+ cases.add(new TestData("2", null, null, true, null));
+ cases.add(new TestData("3", null, "", true, null));
+ cases.add(new TestData("4", "", "", true, null));
+ cases.add(new TestData("5", "123", "", true, null));
+ cases.add(new TestData("6", "123", "hello.txt", false, "attr://123/hello.txt"));
+ cases.add(new TestData("7", "1234", "hello.txt", false, "attr://123/4/hello.txt"));
+ cases.add(new TestData("8", "1", "hello", false, "attr://1/hello"));
+ return cases;
+ }
+
+ public void testGenerateLocator() {
+ AttributeLocatorProvider provider = new AttributeLocatorProvider();
+ List<TestData> cases = getTestGenerateLocatorData();
+ for (TestData data : cases) {
+ IResourceLocator locator = null;
+ try {
+ locator = provider.generateResourceLocator(data.getSeed(), data.getName());
+ } catch (MalformedLocatorException ex) {
+ assertEquals(data.getId(), data.getShouldException(), true);
+ }
+ assertEquals(data.getId(), data.getExpected(), locator != null ? locator.getLocation().toASCIIString() : null);
+ }
+ }
+
+ private List<TestData> getTestGetResourceLocatorData() {
+ List<TestData> cases = new ArrayList<TestData>();
+ cases.add(new TestData("1", "", true, null));
+ cases.add(new TestData("2", null, true, null));
+ cases.add(new TestData("3", "$%#", true, null));
+ cases.add(new TestData("4", "x://", true, null));
+ cases.add(new TestData("5", "x:1234/4", true, null));
+ cases.add(new TestData("6", "attr:123", true, null));
+ cases.add(new TestData("7", "attr://123", false, "attr://123"));
+ cases.add(new TestData("8", "attr://123/hello.txt", false, "attr://123/hello.txt"));
+ return cases;
+ }
+
+ public void testAcquireResourceAttributeLocator() {
+ AttributeLocatorProvider provider = new AttributeLocatorProvider();
+ List<TestData> cases = getTestGetResourceLocatorData();
+ for (TestData data : cases) {
+ IResourceLocator locator = null;
+ try {
+ locator = provider.getResourceLocator(data.getPath());
+ } catch (MalformedLocatorException ex) {
+ assertEquals(data.getId(), data.getShouldException(), true);
+ }
+ assertEquals(data.getId(), data.getExpected(), locator != null ? locator.getLocation().toASCIIString() : null);
+ }
+ }
+
+ private final class TestData {
+ private final String id;
+ private String seed;
+ private String name;
+ private String path;
+ private final boolean shouldException;
+ private final String expected;
+
+ public TestData(String id, String path, boolean shouldException, String expected) {
+ super();
+ this.id = id;
+ this.path = path;
+ this.shouldException = shouldException;
+ this.expected = expected;
+ }
+
+ public TestData(String id, String seed, String name, boolean shouldException, String expected) {
+ super();
+ this.id = id;
+ this.seed = seed;
+ this.name = name;
+ this.shouldException = shouldException;
+ this.expected = expected;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getSeed() {
+ return seed;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getExpected() {
+ return expected;
+ }
+
+ public boolean getShouldException() {
+ return shouldException;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/.classpath b/org.eclipse.osee.framework.resource.locator.attribute/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/.project b/org.eclipse.osee.framework.resource.locator.attribute/.project
new file mode 100644
index 00000000000..7d90409e1b2
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.locator.attribute</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.resource.locator.attribute/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.locator.attribute/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..fe8cf7b05d8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Apr 15 12:47:34 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.locator.attribute/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..b2701b9034a
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Locator Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.locator.attribute;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.resource.locator.attribute.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/locator.provider.attribute.xml
+Import-Package: org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.framework.resource.locator.attribute
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/OSGI-INF/locator.provider.attribute.xml b/org.eclipse.osee.framework.resource.locator.attribute/OSGI-INF/locator.provider.attribute.xml
new file mode 100644
index 00000000000..dc7131e8a49
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/OSGI-INF/locator.provider.attribute.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="resource.locator.attribute">
+ <implementation class="org.eclipse.osee.framework.resource.locator.attribute.AttributeLocatorProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.resource.management.IResourceLocatorProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/build.properties b/org.eclipse.osee.framework.resource.locator.attribute/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/Activator.java b/org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/Activator.java
new file mode 100644
index 00000000000..3d0090b11cf
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/Activator.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.framework.resource.locator.attribute;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/AttributeLocatorProvider.java b/org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/AttributeLocatorProvider.java
new file mode 100644
index 00000000000..df19161c393
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.locator.attribute/src/org/eclipse/osee/framework/resource/locator/attribute/AttributeLocatorProvider.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.framework.resource.locator.attribute;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.net.URI;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorProvider;
+import org.eclipse.osee.framework.resource.management.ResourceLocator;
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeLocatorProvider implements IResourceLocatorProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorProvider#generateResourceLocator(java.lang.String)
+ */
+ @Override
+ public IResourceLocator generateResourceLocator(String seed, String name) throws MalformedLocatorException {
+ URI uri = null;
+ try {
+ uri = new URI(generatePath(seed, name));
+ } catch (Exception ex) {
+ throw new MalformedLocatorException(ex);
+ }
+ return new ResourceLocator(uri);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorProvider#getResourceLocator(java.lang.String)
+ */
+ @Override
+ public IResourceLocator getResourceLocator(String path) throws MalformedLocatorException {
+ URI uri = null;
+ if (isPathValid(path) != false) {
+ try {
+ uri = new URI(path);
+ } catch (Exception ex) {
+ throw new MalformedLocatorException(ex);
+ }
+ } else {
+ throw new MalformedLocatorException(String.format("Invalid path hint: [%s]", path));
+ }
+ return new ResourceLocator(uri);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorProvider#isValid(java.lang.String)
+ */
+ @Override
+ public boolean isValid(String protocol) {
+ return isArgValid(protocol) != false && protocol.startsWith("attr") != false;
+ }
+
+ private boolean isArgValid(String value) {
+ return value != null && value.length() > 0;
+ }
+
+ private boolean isPathValid(String value) {
+ return isArgValid(value) && value.startsWith("attr://");
+ }
+
+ private String generatePath(String seed, String name) throws MalformedLocatorException {
+ StringBuilder builder = new StringBuilder("attr://");
+ if (isArgValid(seed) != false && isArgValid(name) != false) {
+ try {
+ char[] buffer = new char[3];
+ int cnt = -1;
+ Reader in = new StringReader(seed);
+ while ((cnt = in.read(buffer)) != -1) {
+ builder.append(buffer, 0, cnt);
+ builder.append("/");
+ }
+ } catch (IOException ex) {
+ throw new MalformedLocatorException(ex);
+ }
+ builder.append(name);
+ } else {
+ throw new MalformedLocatorException("Invalid arguments during locator generation.");
+ }
+ return builder.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/.classpath b/org.eclipse.osee.framework.resource.management.servlet.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/.project b/org.eclipse.osee.framework.resource.management.servlet.test/.project
new file mode 100644
index 00000000000..23ef8d4ed01
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.management.servlet.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.resource.management.servlet.test/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.management.servlet.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..a7f1f1089d4
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed Apr 16 14:13:10 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.management.servlet.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..1754a4ef07f
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.management.servlet.test;singleton:=true
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.resource.management.servlet.test.Activator
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Boeing
+Service-Component: OSGI-INF/tests.xml
+Import-Package: junit.framework,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.resource.management,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/OSGI-INF/tests.xml b/org.eclipse.osee.framework.resource.management.servlet.test/OSGI-INF/tests.xml
new file mode 100644
index 00000000000..c124d522158
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/OSGI-INF/tests.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="resource.management.servlet.tests">
+ <implementation class="org.eclipse.osee.framework.resource.management.servlet.test.AllResourceManagementServletTests"/>
+ <service>
+ <provide interface="junit.framework.Test"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/build.properties b/org.eclipse.osee.framework.resource.management.servlet.test/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/Activator.java b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/Activator.java
new file mode 100644
index 00000000000..cb252906959
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/Activator.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.resource.management.servlet.test;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/AllResourceManagementServletTests.java b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/AllResourceManagementServletTests.java
new file mode 100644
index 00000000000..62f4abf0b59
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/AllResourceManagementServletTests.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.framework.resource.management.servlet.test;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AllResourceManagementServletTests extends TestSuite {
+
+ public AllResourceManagementServletTests() {
+ addTestSuite(TestResourceManagerServlet.class);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/HttpTestUtils.java b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/HttpTestUtils.java
new file mode 100644
index 00000000000..b0dc6407ac5
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/HttpTestUtils.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.resource.management.servlet.test;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpTestUtils {
+
+ private HttpTestUtils() {
+ }
+
+ public static String decompressStream(InputStream inputStream, OutputStream outputStream) throws IOException {
+ String zipEntryName = null;
+ ZipInputStream zipInputStream = null;
+ try {
+ zipInputStream = new ZipInputStream(inputStream);
+ ZipEntry entry = zipInputStream.getNextEntry();
+ zipEntryName = entry.getName();
+
+ // Transfer bytes from the ZIP file to the output file
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = zipInputStream.read(buf)) > 0) {
+ outputStream.write(buf, 0, len);
+ }
+ } finally {
+ if (zipInputStream != null) {
+ zipInputStream.close();
+ }
+ }
+ return zipEntryName;
+ }
+
+ public static byte[] compressStream(InputStream in, String name) throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ZipOutputStream out = null;
+ try {
+ out = new ZipOutputStream(bos);
+ // Add ZIP entry to output stream.
+ out.putNextEntry(new ZipEntry(name));
+ byte[] buf = new byte[1024];
+ int count = -1;
+ while ((count = in.read(buf)) > 0) {
+ out.write(buf, 0, count);
+ }
+ } finally {
+ if (out != null) {
+ out.closeEntry();
+ out.close();
+ }
+ }
+ return bos.toByteArray();
+ }
+
+ public static String sendData(String request, String contentType, String encoding, InputStream payload) throws Exception {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ OutputStream outputStream = null;
+ InputStream inputStream = null;
+ HttpURLConnection connection = null;
+ try {
+ URL url = new URL(request);
+ connection = (HttpURLConnection) url.openConnection();
+
+ TestCase.assertNotNull(connection);
+
+ connection.setRequestProperty("Content-Length", Integer.toString(payload.available()));
+ connection.setRequestProperty("Content-Type", contentType);
+ connection.setRequestProperty("Content-Encoding", encoding);
+ connection.setRequestMethod("PUT");
+ connection.setAllowUserInteraction(true);
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.connect();
+
+ outputStream = connection.getOutputStream();
+ TestCase.assertNotNull(outputStream);
+
+ Lib.inputStreamToOutputStream(payload, outputStream);
+
+ // Wait for response
+ int code = connection.getResponseCode();
+ TestCase.assertEquals(HttpURLConnection.HTTP_CREATED, code);
+ TestCase.assertTrue(connection.getContentType().contains("text/plain"));
+
+ inputStream = (InputStream) connection.getContent();
+ Lib.inputStreamToOutputStream(inputStream, output);
+ TestCase.assertTrue("Got Data", output.size() > 0);
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ return output.toString();
+ }
+
+ public static byte[] acquireData(String request, String contentType) throws Exception {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ InputStream inputStream = null;
+ HttpURLConnection connection = null;
+ try {
+ URL url = new URL(request);
+ connection = (HttpURLConnection) url.openConnection();
+ TestCase.assertNotNull(connection);
+ connection.connect();
+
+ // Wait for response
+ int code = connection.getResponseCode();
+ TestCase.assertEquals(HttpURLConnection.HTTP_OK, code);
+ TestCase.assertTrue(connection.getContentType().contains(contentType));
+ inputStream = (InputStream) connection.getContent();
+ Lib.inputStreamToOutputStream(inputStream, output);
+ TestCase.assertTrue("Got Data", output.size() > 0);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ return output.toByteArray();
+ }
+
+ public static int deleteData(String request) throws Exception {
+ int response = -1;
+ InputStream inputStream = null;
+ HttpURLConnection connection = null;
+ try {
+ URL url = new URL(request);
+ connection = (HttpURLConnection) url.openConnection();
+ TestCase.assertNotNull(connection);
+
+ connection.setRequestMethod("DELETE");
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.connect();
+
+ // Wait for response
+ response = connection.getResponseCode();
+ TestCase.assertEquals(HttpURLConnection.HTTP_ACCEPTED, response);
+ TestCase.assertTrue(connection.getContentType().contains("text/plain"));
+ inputStream = (InputStream) connection.getContent();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ String status = reader.readLine();
+ TestCase.assertNotNull("Deleted: " + request.replace("uri=", ""), status);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ return response;
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestFile.txt b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestFile.txt
new file mode 100644
index 00000000000..273c1a9ffdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestFile.txt
@@ -0,0 +1 @@
+This is a test. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestResourceManagerServlet.java b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestResourceManagerServlet.java
new file mode 100644
index 00000000000..26821fa21e3
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet.test/src/org/eclipse/osee/framework/resource/management/servlet/test/TestResourceManagerServlet.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.resource.management.servlet.test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Arrays;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestResourceManagerServlet extends TestCase {
+ private String httpServiceURL;
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ int port = OseeServerProperties.getOseeApplicationServerPort();
+ httpServiceURL = String.format("http://localhost:%s/%s", port, OseeServerContext.RESOURCE_CONTEXT);
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ this.httpServiceURL = null;
+ }
+
+ public void testServletAlive() throws Exception {
+ URL url = new URL(httpServiceURL);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ assertNotNull(connection);
+ connection.disconnect();
+ }
+
+ private String getRequest(String params) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(httpServiceURL);
+ builder.append("?");
+ builder.append(params);
+ return builder.toString();
+ }
+
+ public void testAcquireMalformedURL() throws IOException {
+ HttpURLConnection connection = null;
+ try {
+ URL url = new URL(getRequest("protocol=attr&seed=1234567&name=ABCDEFGHIJK&extension=txt"));
+ connection = (HttpURLConnection) url.openConnection();
+ TestCase.assertNotNull(connection);
+ connection.connect();
+
+ int code = connection.getResponseCode();
+ assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, code);
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ public void testAcquireFileNotFoundError() {
+ HttpURLConnection connection = null;
+ try {
+ URL url = new URL(getRequest("uri=attr://1/4/somefile.txt.zip"));
+ connection = (HttpURLConnection) url.openConnection();
+ TestCase.assertNotNull(connection);
+ connection.connect();
+
+ // Wait for response
+ int code = connection.getResponseCode();
+ assertEquals(HttpURLConnection.HTTP_NOT_FOUND, code);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ public void testAcquireInvalidLocator() {
+ }
+
+ public void testSaveAcquireDeleteTxt() throws Exception {
+ String payload = "This is a test. Hello World!!!";
+ String response =
+ HttpTestUtils.sendData(getRequest("protocol=attr&seed=1234567&name=ABCDEFGHIJK&extension=txt"),
+ "text/plain", "UTF-8", new ByteArrayInputStream(payload.getBytes()));
+ assertNotNull(response);
+ assertEquals("Put Response", "attr://123/456/7/ABCDEFGHIJK.txt", response);
+
+ byte[] result = HttpTestUtils.acquireData(getRequest("uri=" + response), "text/plain");
+ assertEquals("Acquire Response", payload, new String(result));
+
+ int code = HttpTestUtils.deleteData(getRequest("uri=" + response));
+ assertEquals(HttpURLConnection.HTTP_ACCEPTED, code);
+ }
+
+ public void testSaveAcquireDeleteZip() throws Exception {
+ String payload = "This is a test. Hello World!!!";
+
+ byte[] compressed = HttpTestUtils.compressStream(new ByteArrayInputStream(payload.getBytes()), "ABCDEFGHIJK.txt");
+ String response =
+ HttpTestUtils.sendData(getRequest("protocol=attr&seed=1234567&name=ABCDEFGHIJK&extension=zip"),
+ "application/zip", "ISO-8859-1", new ByteArrayInputStream(compressed));
+ assertNotNull(response);
+ assertEquals("Put Response", "attr://123/456/7/ABCDEFGHIJK.zip", response);
+
+ byte[] result = HttpTestUtils.acquireData(getRequest("uri=" + response), "application/zip");
+ assertTrue("Acquire Response", Arrays.equals(compressed, result));
+
+ int code = HttpTestUtils.deleteData(getRequest("uri=" + response));
+ assertEquals(HttpURLConnection.HTTP_ACCEPTED, code);
+ }
+
+ public void testAcquireDataCompressed() throws Exception {
+ String payload = "This is a test. Hello World!!!";
+ String response =
+ HttpTestUtils.sendData(getRequest("protocol=attr&seed=1234567&name=ABCDEFGHIJK&extension=txt"),
+ "text/plain", "UTF-8", new ByteArrayInputStream(payload.getBytes()));
+ assertNotNull(response);
+ assertEquals("Put Response", "attr://123/456/7/ABCDEFGHIJK.txt", response);
+
+ byte[] result =
+ HttpTestUtils.acquireData(getRequest("uri=" + response + "&compress.before.sending=true"),
+ "application/zip");
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ String fileName = HttpTestUtils.decompressStream(new ByteArrayInputStream(result), output);
+ assertEquals("ABCDEFGHIJK.txt", fileName);
+ assertEquals("Acquire Response", payload, output.toString());
+
+ int code = HttpTestUtils.deleteData(getRequest("uri=" + response));
+ assertEquals(HttpURLConnection.HTTP_ACCEPTED, code);
+ }
+
+ public void testSaveCompressAtServer() throws Exception {
+ String payload = "This is a test. Hello World!!!";
+ // TODO: work here
+ String response =
+ HttpTestUtils.sendData(
+ getRequest("protocol=attr&seed=1234567&name=ABCDEFGHIJK&extension=txt&compress.before.saving=true"),
+ "text/plain", "UTF-8", new ByteArrayInputStream(payload.getBytes()));
+ assertNotNull(response);
+ assertEquals("Put Response", "attr://123/456/7/ABCDEFGHIJK.txt.zip", response);
+
+ byte[] result = HttpTestUtils.acquireData(getRequest("uri=" + response), "application/zip");
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ String fileName = HttpTestUtils.decompressStream(new ByteArrayInputStream(result), output);
+ assertEquals("ABCDEFGHIJK.txt", fileName);
+ assertEquals("Acquire Response", payload, output.toString());
+
+ int code = HttpTestUtils.deleteData(getRequest("uri=" + response));
+ assertEquals(HttpURLConnection.HTTP_ACCEPTED, code);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management.servlet/.classpath b/org.eclipse.osee.framework.resource.management.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.management.servlet/.project b/org.eclipse.osee.framework.resource.management.servlet/.project
new file mode 100644
index 00000000000..92f76817924
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.management.servlet</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.resource.management.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.management.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..118607fd919
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Apr 15 18:20:33 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.management.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.management.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..473d34341bf
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Servlet Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.management.servlet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.servlet.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.service.log,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.management.servlet/build.properties b/org.eclipse.osee.framework.resource.management.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/Activator.java b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/Activator.java
new file mode 100644
index 00000000000..d18556476e5
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/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.framework.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+ private static Activator instance;
+
+ private ServiceTracker resourceManagementTracker;
+ private ServiceTracker resourceLocatorManagerTracker;
+ private ServiceTracker servletTracker;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ Activator.instance = this;
+
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+
+ servletTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.RESOURCE_CONTEXT, ResourceManagerServlet.class);
+ servletTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ servletTracker.close();
+ servletTracker = null;
+
+ resourceManagementTracker.close();
+ resourceManagementTracker = null;
+
+ resourceLocatorManagerTracker.close();
+ resourceLocatorManagerTracker = null;
+
+ Activator.instance = null;
+ }
+
+ public IResourceManager getResourceManager() {
+ return (IResourceManager) resourceManagementTracker.getService();
+ }
+
+ public IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) resourceLocatorManagerTracker.getService();
+ }
+
+ public static Activator getInstance() {
+ return Activator.instance;
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/ResourceManagerServlet.java b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/ResourceManagerServlet.java
new file mode 100644
index 00000000000..3413b20aa98
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/ResourceManagerServlet.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.exception.EmptyResourceException;
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+import org.eclipse.osee.framework.servlet.data.HttpRequestDecoder;
+import org.eclipse.osee.framework.servlet.data.ServletResourceBridge;
+
+/**
+ * This class is responsible for managing server-side resources. The class accepts http requests to perform uploads,
+ * deletes, and gets from clients granting access to server-side managed resources.
+ *
+ * @author Robeto E. Escobar
+ */
+public class ResourceManagerServlet extends OseeHttpServlet {
+ private static final long serialVersionUID = 3777506351978711657L;
+
+ private void handleError(HttpServletResponse response, String message, Throwable ex) {
+ OseeLog.log(this.getClass(), Level.SEVERE, message, ex);
+ try {
+ response.getWriter().println(message);
+ } catch (IOException ex1) {
+ OseeLog.log(this.getClass(), Level.SEVERE, message, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ InputStream inputStream = null;
+ try {
+ String path = HttpRequestDecoder.fromGetRequest(request);
+ Options options = HttpRequestDecoder.getOptions(request);
+
+ IResourceLocator locator = Activator.getInstance().getResourceLocatorManager().getResourceLocator(path);
+ IResource resource = Activator.getInstance().getResourceManager().acquire(locator, options);
+ if (resource != null) {
+ inputStream = resource.getContent();
+
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentLength(inputStream.available());
+ response.setCharacterEncoding("ISO-8859-1");
+ String mimeType = HttpURLConnection.guessContentTypeFromStream(inputStream);
+ if (mimeType == null) {
+ mimeType = HttpURLConnection.guessContentTypeFromName(resource.getLocation().toString());
+ if (mimeType == null) {
+ mimeType = "application/*";
+ }
+ }
+ response.setContentType(mimeType);
+ response.setHeader("Content-Disposition", "attachment; filename=" + resource.getName());
+
+ Lib.inputStreamToOutputStream(inputStream, response.getOutputStream());
+ } else {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ response.flushBuffer();
+ }
+ } catch (MalformedLocatorException ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Unable to locate resource: [%s]", request.getRequestURI()), ex);
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Unable to acquire resource: [%s]", request.getRequestURI()), ex);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ int result = HttpServletResponse.SC_BAD_REQUEST;
+ try {
+ String[] args = HttpRequestDecoder.fromPutRequest(request);
+ Options options = HttpRequestDecoder.getOptions(request);
+
+ IResourceLocator locator =
+ Activator.getInstance().getResourceLocatorManager().generateResourceLocator(args[0], args[1], args[2]);
+ IResource tempResource = new ServletResourceBridge(request, locator);
+
+ IResourceLocator actualLocator =
+ Activator.getInstance().getResourceManager().save(locator, tempResource, options);
+ result = HttpServletResponse.SC_CREATED;
+ response.setStatus(result);
+ response.setContentType("text/plain");
+ response.getWriter().write(actualLocator.toString());
+ } catch (MalformedLocatorException ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Unable to locate resource: [%s] - %s", request.getRequestURI(),
+ ex.getLocalizedMessage()), ex);
+ } catch (EmptyResourceException ex) {
+ response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Unable to store empty resource: [%s] - %s", request.getRequestURI(),
+ ex.getLocalizedMessage()), ex);
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Error saving resource: [%s]", ex.getLocalizedMessage()), ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ int result = HttpServletResponse.SC_BAD_REQUEST;
+ try {
+ String path = HttpRequestDecoder.fromDeleteRequest(request);
+ IResourceLocator locator = Activator.getInstance().getResourceLocatorManager().getResourceLocator(path);
+ int status = Activator.getInstance().getResourceManager().delete(locator);
+ if (status == IResourceManager.OK) {
+ result = HttpServletResponse.SC_ACCEPTED;
+ } else {
+ result = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+ }
+ response.setStatus(result);
+ response.setContentType("text/plain");
+ response.getWriter().write("Deleted: " + locator.toString());
+ response.flushBuffer();
+ } catch (MalformedLocatorException ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Unable to locate resource: [%s]", request.getRequestURI()), ex);
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ response.setContentType("text/plain");
+ handleError(response, String.format("Unable to delete resource: [%s]", request.getRequestURI()), ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/HttpRequestDecoder.java b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/HttpRequestDecoder.java
new file mode 100644
index 00000000000..5a4302492b9
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/HttpRequestDecoder.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.framework.servlet.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.StandardOptions;
+
+/**
+ * This class is responsible for parsing servlet resquests into object[]
+ * http://localhost:8089/resource?param1=blah&param2=blah
+ *
+ * @author Roberto E. Escobar
+ */
+public class HttpRequestDecoder {
+
+ private static final String URI = "uri";
+ private static final String PROTOCOL = "protocol";
+ private static final String SEED = "seed";
+ private static final String NAME = "name";
+ private static final String EXTENSION = "extension";
+
+ // Whether data should be compressed
+ private static final String COMPRESS_ON_ACQUIRE = "compress.before.sending";
+ private static final String COMPRESS_ON_SAVE = "compress.before.saving";
+
+ // Whether data should be decompressed
+ private static final String DECOMPRESS_ON_ACQUIRE = "decompress.before.sending";
+
+ // Whether data has already been compressed
+ private static final String IS_COMPRESSED = "is.compressed";
+
+ private static final String IS_OVERWRITE_ALLOWED = "is.overwrite.allowed";
+
+ private HttpRequestDecoder() {
+ }
+
+ public static String[] fromPutRequest(HttpServletRequest request) {
+ List<String> toReturn = new ArrayList<String>();
+ toReturn.add(request.getParameter(PROTOCOL));
+ toReturn.add(request.getParameter(SEED));
+ StringBuilder builder = new StringBuilder();
+ builder.append(request.getParameter(NAME));
+ String extension = request.getParameter(EXTENSION);
+ if (extension != null && extension.length() > 0) {
+ builder.append(".");
+ builder.append(extension);
+ }
+ toReturn.add(builder.toString());
+ return toReturn.toArray(new String[toReturn.size()]);
+ }
+
+ public static String fromGetRequest(HttpServletRequest request) {
+ return request.getParameter(URI);
+ }
+
+ public static Options getOptions(HttpServletRequest request) {
+ Options options = new Options();
+ options.put(StandardOptions.CompressOnSave.name(), request.getParameter(COMPRESS_ON_SAVE));
+ options.put(StandardOptions.CompressOnAcquire.name(), request.getParameter(COMPRESS_ON_ACQUIRE));
+ options.put(StandardOptions.DecompressOnAquire.name(), request.getParameter(DECOMPRESS_ON_ACQUIRE));
+ options.put(StandardOptions.Overwrite.name(), request.getParameter(IS_OVERWRITE_ALLOWED));
+ return options;
+ }
+
+ protected static boolean isDataCompressed(HttpServletRequest request) {
+ return new Boolean(request.getParameter(IS_COMPRESSED));
+ }
+
+ public static String fromDeleteRequest(HttpServletRequest request) {
+ return request.getParameter(URI);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/ServletResourceBridge.java b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/ServletResourceBridge.java
new file mode 100644
index 00000000000..d053ec76086
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.servlet/src/org/eclipse/osee/framework/servlet/data/ServletResourceBridge.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.framework.servlet.data;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServletResourceBridge implements IResource {
+
+ private HttpServletRequest request;
+ private IResourceLocator locator;
+
+ public ServletResourceBridge(HttpServletRequest request, IResourceLocator locator) {
+ this.request = request;
+ this.locator = locator;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getContent()
+ */
+ @Override
+ public InputStream getContent() throws IOException {
+ return request.getInputStream();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getLocation()
+ */
+ @Override
+ public URI getLocation() {
+ return locator.getLocation();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getName()
+ */
+ @Override
+ public String getName() {
+ String path = locator.getLocation().toASCIIString();
+ int index = path.lastIndexOf("/");
+ if (index != -1 && index + 1 < path.length()) {
+ path = path.substring(index + 1, path.length());
+ }
+ return path;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#isCompressed()
+ */
+ @Override
+ public boolean isCompressed() {
+ return HttpRequestDecoder.isDataCompressed(request);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management.test/.classpath b/org.eclipse.osee.framework.resource.management.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.management.test/.project b/org.eclipse.osee.framework.resource.management.test/.project
new file mode 100644
index 00000000000..eb36c93940f
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.management.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.resource.management.test/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.management.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..1dc5349dcb6
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Apr 15 08:49:50 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.management.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.management.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..bea5f3a01f0
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.management.test;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.resource.management.test.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/tests.xml
+Import-Package: junit.framework,
+ org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.management.test/OSGI-INF/tests.xml b/org.eclipse.osee.framework.resource.management.test/OSGI-INF/tests.xml
new file mode 100644
index 00000000000..e74a73bec14
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/OSGI-INF/tests.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="resource.management.tests">
+ <implementation class="org.eclipse.osee.framework.resource.management.test.AllResourceManagementTests"/>
+ <service>
+ <provide interface="junit.framework.Test"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management.test/build.properties b/org.eclipse.osee.framework.resource.management.test/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/Activator.java b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/Activator.java
new file mode 100644
index 00000000000..fb0cd853263
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/Activator.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.framework.resource.management.test;
+
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+
+ ServiceTracker resourceManagementTracker;
+ ServiceTracker resourceLocatorManagerTracker;
+ private static Activator me;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ me = this;
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ me = null;
+ resourceManagementTracker.close();
+ resourceLocatorManagerTracker.close();
+ }
+
+ public static Activator getActivator() {
+ return me;
+ }
+
+ public IResourceManager getResourceManager() {
+ return (IResourceManager) resourceManagementTracker.getService();
+ }
+
+ public IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) resourceLocatorManagerTracker.getService();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/AllResourceManagementTests.java b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/AllResourceManagementTests.java
new file mode 100644
index 00000000000..0d5279a9674
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/AllResourceManagementTests.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.framework.resource.management.test;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class AllResourceManagementTests extends TestSuite {
+
+ public AllResourceManagementTests() {
+ addTestSuite(TestResourceManager.class);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestFile.txt b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestFile.txt
new file mode 100644
index 00000000000..273c1a9ffdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestFile.txt
@@ -0,0 +1 @@
+This is a test. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestResourceManager.java b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestResourceManager.java
new file mode 100644
index 00000000000..953f9d4a13f
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management.test/src/org/eclipse/osee/framework/resource/management/test/TestResourceManager.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.resource.management.test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceListener;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.Resource;
+import org.eclipse.osee.framework.resource.management.StandardOptions;
+
+/**
+ * Application Server Test
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class TestResourceManager extends TestCase {
+
+ private final URL testFileURL;
+
+ public TestResourceManager() {
+ testFileURL =
+ getClass().getClassLoader().getResource("org/eclipse/osee/framework/resource/management/test/TestFile.txt");
+ }
+
+ public void testGettingTheResourceManager() {
+ assertNotNull(Activator.getActivator().getResourceManager());
+ }
+
+ public void testGettingTheResourceLocatorManager() {
+ assertNotNull(Activator.getActivator().getResourceLocatorManager());
+ }
+
+ public void testSaveAquireDelete() throws Exception {
+ InputStream inputStream = null;
+ IResourceLocator fileLocation = null;
+ IResourceLocator actual = null;
+ IResourceManager rm = Activator.getActivator().getResourceManager();
+ IResourceLocatorManager rlg = Activator.getActivator().getResourceLocatorManager();
+ try {
+ fileLocation = rlg.generateResourceLocator("attr", "123456", "TestFile.txt");
+
+ IResource file = new Resource(testFileURL.toURI(), false);
+ actual = rm.save(fileLocation, file, new Options());
+ assertNotNull(actual);
+ IResource resource = rm.acquire(actual, new Options());
+ assertNotNull(resource);
+ inputStream = resource.getContent();
+ InputStreamReader reader = new InputStreamReader(inputStream);
+ char[] buffer = new char[inputStream.available()];
+ reader.read(buffer);
+ assertEquals(new String(buffer), "This is a test.");
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+
+ int code = rm.delete(actual);
+ assertTrue(code == IResourceManager.OK);
+ assertNull(rm.acquire(actual, new Options()));
+ }
+
+ public void testSaveAquireDeleteZipExtension() throws Exception {
+ InputStream inputStream = null;
+ IResourceLocator fileLocation = null;
+ IResourceLocator actual = null;
+ IResourceManager rm = Activator.getActivator().getResourceManager();
+ IResourceLocatorManager rlg = Activator.getActivator().getResourceLocatorManager();
+ try {
+ fileLocation = rlg.generateResourceLocator("attr", "123456", "TestFile.txt");
+
+ IResource file = new Resource(testFileURL.toURI(), false);
+ Options options = new Options();
+ options.put(StandardOptions.CompressOnSave.name(), "true");
+
+ actual = rm.save(fileLocation, file, options);
+ assertTrue(actual.getLocation().toASCIIString().contains("TestFile.txt.zip"));
+ assertNotNull(actual);
+ IResource resource = rm.acquire(actual, new Options());
+ assertNotNull(resource);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+
+ int code = rm.delete(actual);
+ assertTrue(code == IResourceManager.OK);
+ assertNull(rm.acquire(actual, new Options()));
+ }
+
+ public void testListeners() throws Exception {
+ IResourceManager rm = Activator.getActivator().getResourceManager();
+ IResourceLocatorManager rlg = Activator.getActivator().getResourceLocatorManager();
+ TestResourceListener listener = new TestResourceListener();
+ rm.addResourceListener(listener);
+
+ checkListener(listener, false, false, false);
+
+ IResourceLocator fileLocation = rlg.generateResourceLocator("attr", "123456", "TestFile.txt");
+
+ IResource file = new Resource(testFileURL.toURI(), false);
+
+ IResourceLocator actual = rm.save(fileLocation, file, new Options());
+ assertNotNull(actual);
+
+ checkListener(listener, false, true, false);
+
+ listener.reset();
+ IResource resource = rm.acquire(fileLocation, new Options());
+ assertNotNull(resource);
+ checkListener(listener, true, false, false);
+
+ listener.reset();
+ int code = rm.delete(actual);
+ assertTrue(code == IResourceManager.OK);
+ checkListener(listener, false, false, true);
+ assertNull(rm.acquire(fileLocation, new Options()));
+ }
+
+ public void testForFailOnOverwriteOfFile() throws Exception {
+ IResourceLocator fileLocation = null;
+ IResourceLocator actual = null;
+ IResourceManager rm = Activator.getActivator().getResourceManager();
+ IResourceLocatorManager rlg = Activator.getActivator().getResourceLocatorManager();
+ fileLocation = rlg.generateResourceLocator("attr", "123456", "TestFile.txt");
+ IResource file = new Resource(testFileURL.toURI(), false);
+ actual = rm.save(fileLocation, file, new Options());
+
+ boolean overwrote = true;
+ try {
+ actual = rm.save(fileLocation, file, new Options());
+ } catch (IOException ex) {
+ overwrote = false;
+ }
+ assertFalse(overwrote);
+
+ Options options = new Options();
+ options.put(StandardOptions.Overwrite.name(), true);
+ actual = rm.save(fileLocation, file, options);
+
+ rm.delete(actual);
+
+ assertFalse(rm.exists(actual));
+
+ }
+
+ private void checkListener(TestResourceListener listener, boolean acquire, boolean save, boolean delete) {
+ assertEquals(acquire, listener.postAcquire);
+ assertEquals(acquire, listener.preAcquire);
+ assertEquals(save, listener.preSave);
+ assertEquals(save, listener.postSave);
+ assertEquals(delete, listener.preDelete);
+ assertEquals(delete, listener.postDelete);
+ }
+
+ private final class TestResourceListener implements IResourceListener {
+ public boolean postAcquire;
+ public boolean preAcquire;
+ public boolean preSave;
+ public boolean postSave;
+ public boolean preDelete;
+ public boolean postDelete;
+ public IResource resource;
+ public IResourceLocator locator;
+
+ public TestResourceListener() {
+ reset();
+ }
+
+ public void reset() {
+ postAcquire = false;
+ preAcquire = false;
+ preSave = false;
+ postSave = false;
+ preDelete = false;
+ postDelete = false;
+ this.resource = null;
+ this.locator = null;
+ }
+
+ @Override
+ public void onPostAcquire(IResource resource) {
+ postAcquire = true;
+ this.resource = resource;
+ }
+
+ @Override
+ public void onPreAcquire(IResourceLocator locator) {
+ preAcquire = true;
+ this.locator = locator;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceListener#onPostDelete(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public void onPostDelete(IResourceLocator locator) {
+ postDelete = true;
+ this.locator = locator;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceListener#onPostSave(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.IResource, org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public void onPostSave(IResourceLocator locator, IResource resource, Options options) {
+ postSave = true;
+ this.resource = resource;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceListener#onPreDelete(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public void onPreDelete(IResourceLocator locator) {
+ preDelete = true;
+ this.locator = locator;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceListener#onPreSave(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.IResource, org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public void onPreSave(IResourceLocator locator, IResource resource, Options options) {
+ preSave = true;
+ this.locator = locator;
+ }
+ };
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/.classpath b/org.eclipse.osee.framework.resource.management/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.management/.project b/org.eclipse.osee.framework.resource.management/.project
new file mode 100644
index 00000000000..4fd2e4b8d45
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.management</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.resource.management/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.management/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..9622905cfde
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Fri Apr 11 15:30:09 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.management/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.management/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..07981150b54
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Management Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.management;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.resource.management.Activator
+Import-Package: org.eclipse.osgi.util,
+ org.osgi.framework,
+ org.osgi.service.log,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Service-Component: OSGI-INF/resource.provider.consumer.xml, OSGI-INF/resource.locator.consumer.xml
+Export-Package: org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds
diff --git a/org.eclipse.osee.framework.resource.management/OSGI-INF/resource.locator.consumer.xml b/org.eclipse.osee.framework.resource.management/OSGI-INF/resource.locator.consumer.xml
new file mode 100644
index 00000000000..218cd437023
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/OSGI-INF/resource.locator.consumer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="resource.locator.manager">
+ <implementation class="org.eclipse.osee.framework.resource.management.internal.ResourceLocatorManager"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.resource.management.IResourceLocatorManager"/>
+ </service>
+ <reference name="resource.locator"
+ interface="org.eclipse.osee.framework.resource.management.IResourceLocatorProvider"
+ bind="addResourceLocatorProvider"
+ unbind="removeResourceLocatorProvider"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management/OSGI-INF/resource.provider.consumer.xml b/org.eclipse.osee.framework.resource.management/OSGI-INF/resource.provider.consumer.xml
new file mode 100644
index 00000000000..e996acba9b3
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/OSGI-INF/resource.provider.consumer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="resource.manager">
+ <implementation class="org.eclipse.osee.framework.resource.management.internal.ResourceManager"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.resource.management.IResourceManager"/>
+ </service>
+ <reference name="resource.provider"
+ interface="org.eclipse.osee.framework.resource.management.IResourceProvider"
+ bind="addResourceProvider"
+ unbind="removeResourceProvider"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.management/build.properties b/org.eclipse.osee.framework.resource.management/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Activator.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Activator.java
new file mode 100644
index 00000000000..f14f598abc7
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Activator.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.framework.resource.management;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResource.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResource.java
new file mode 100644
index 00000000000..2c957d6af69
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResource.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.framework.resource.management;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResource {
+
+ /**
+ * Returns an open input stream of the contents of this resource.
+ *
+ * @return an input stream containing the contents of this resource
+ * @throws IOException if this method fails.
+ */
+ public InputStream getContent() throws IOException;
+
+ /**
+ * Returns the absolute URI of this resource, or <code>null</code> if no URI can be determined.
+ *
+ * @return the absolute URI of this resource, or <code>null</code> if no URI can be determined
+ */
+ public URI getLocation();
+
+ /**
+ * Get the name of this resource
+ *
+ * @return name of this resource
+ */
+ public String getName();
+
+ /**
+ * Whether this resource is compressed or not.
+ *
+ * @return <b>true</b> If this resource is compressed. <b>false</b> If this resource is not compressed.
+ */
+ public boolean isCompressed();
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceListener.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceListener.java
new file mode 100644
index 00000000000..f2fa0c9420f
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceListener.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.framework.resource.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceListener {
+
+ /**
+ * Event triggered before a resource is deleted
+ *
+ * @param locator
+ */
+ public void onPreDelete(IResourceLocator locator);
+
+ /**
+ * Event triggered after a resource is deleted
+ *
+ * @param locator
+ */
+ public void onPostDelete(IResourceLocator locator);
+
+ /**
+ * Event triggered before a resource is saved
+ *
+ * @param locator
+ * @param options
+ * @param resource
+ */
+ public void onPreSave(IResourceLocator locator, IResource resource, Options options);
+
+ /**
+ * Event triggered after a resource is saved
+ *
+ * @param locator
+ * @param resource
+ * @param options
+ */
+ public void onPostSave(IResourceLocator locator, IResource resource, Options options);
+
+ /**
+ * Event triggered before a resource is acquired
+ *
+ * @param locator
+ */
+ public void onPreAcquire(IResourceLocator locator);
+
+ /**
+ * Event triggered after a resource is acquired
+ *
+ * @param resource
+ */
+ public void onPostAcquire(IResource resource);
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocator.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocator.java
new file mode 100644
index 00000000000..6a7693ff903
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocator.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.framework.resource.management;
+
+import java.net.URI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceLocator {
+
+ /**
+ * Location describing a resource
+ *
+ * @return uri to resource
+ */
+ public URI getLocation();
+
+ /**
+ * Get this locators protocol
+ *
+ * @return String
+ */
+ public String getProtocol();
+
+ /**
+ * Get the raw path.
+ *
+ * @return raw path
+ */
+ public String getRawPath();
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorManager.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorManager.java
new file mode 100644
index 00000000000..c313f1a8e53
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorManager.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.framework.resource.management;
+
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceLocatorManager {
+
+ /**
+ * Generate a resource locator based on protocol, seed and name
+ *
+ * @param protocol
+ * @param seed
+ * @param name
+ * @return a resource locator
+ * @throws MalformedLocatorException
+ */
+ IResourceLocator generateResourceLocator(String protocol, String seed, String name) throws MalformedLocatorException;
+
+ /**
+ * Get resource locator based on protocol and path
+ *
+ * @param path
+ * @return a resource locator
+ * @throws MalformedLocatorException
+ */
+ IResourceLocator getResourceLocator(String path) throws MalformedLocatorException;
+
+ /**
+ * Add resource locator provider
+ *
+ * @param resourceLocatorProvider
+ */
+ public void addResourceLocatorProvider(IResourceLocatorProvider resourceLocatorProvider);
+
+ /**
+ * Remove resource locator provider
+ *
+ * @param resourceLocatorProvider
+ */
+ public void removeResourceLocatorProvider(IResourceLocatorProvider resourceLocatorProvider);
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorProvider.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorProvider.java
new file mode 100644
index 00000000000..d260a67beac
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceLocatorProvider.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.resource.management;
+
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceLocatorProvider {
+
+ /**
+ * Check if this provider is valid
+ *
+ * @param protocol
+ * @return <b>true</b> if this provider is valid
+ */
+ public boolean isValid(String protocol);
+
+ /**
+ * Generate a resource locator based on seed and name
+ *
+ * @param seed
+ * @param name
+ * @return a resource locator
+ * @throws MalformedLocatorException
+ */
+ IResourceLocator generateResourceLocator(String seed, String name) throws MalformedLocatorException;
+
+ /**
+ * Get resource locator
+ *
+ * @param path
+ * @return a resource locator
+ * @throws MalformedLocatorException
+ */
+ IResourceLocator getResourceLocator(String path) throws MalformedLocatorException;
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceManager.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceManager.java
new file mode 100644
index 00000000000..c88e5a2a3be
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceManager.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.framework.resource.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceManager {
+
+ public static final int OK = 1;
+ public static final int FAIL = 2;
+ public static final int RESOURCE_NOT_FOUND = 3;
+
+ /**
+ * Add listener to list
+ *
+ * @param listener
+ */
+ public void addResourceListener(IResourceListener listener);
+
+ /**
+ * Remove listener from list
+ *
+ * @param listener
+ */
+ public void removeResourceListener(IResourceListener listener);
+
+ /**
+ * Add a resource provider
+ *
+ * @param resourceProvider to add
+ */
+ public void addResourceProvider(IResourceProvider resourceProvider);
+
+ /**
+ * Remove a resource provider
+ *
+ * @param resourceProvider to remove
+ */
+ public void removeResourceProvider(IResourceProvider resourceProvider);
+
+ /**
+ * Acquire resource specified by resource locator
+ *
+ * @param locator location of the resource needed
+ * @param options operation options
+ * @return the resource
+ */
+ public IResource acquire(IResourceLocator locator, Options options) throws Exception;
+
+ /**
+ * Determines if a resource exists for the given locator.
+ *
+ * @param locator location of the data to check
+ */
+ public boolean exists(IResourceLocator locator) throws Exception;
+
+ /**
+ * Save input to location specified by resource locator
+ *
+ * @param locator location where to store the data
+ * @param resource to store
+ * @param options operation options
+ * @return status
+ */
+ public IResourceLocator save(final IResourceLocator locatorHint, final IResource resource, final Options options) throws Exception;
+
+ /**
+ * Delete resource specified by resource locator
+ *
+ * @param locator location of the resource to delete
+ * @return status
+ */
+ public int delete(IResourceLocator locator) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceProvider.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceProvider.java
new file mode 100644
index 00000000000..83c999e8d60
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/IResourceProvider.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.framework.resource.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IResourceProvider {
+
+ /**
+ * Determines whether this provider is valid for this locator
+ *
+ * @param locator location of the resource needed
+ * @return boolean
+ */
+ public boolean isValid(IResourceLocator locator);
+
+ /**
+ * Acquire resource specified by resource locator
+ *
+ * @param locator location of the resource needed
+ * @param options operation options
+ * @return the resource
+ */
+ public IResource acquire(IResourceLocator locator, Options options) throws Exception;
+
+ /**
+ * Determines if a resource exists for the given locator.
+ *
+ * @param locator location of the data to check
+ */
+ public boolean exists(IResourceLocator locator) throws Exception;
+
+ /**
+ * Save input to location specified by resource locator
+ *
+ * @param locator location where to store the data
+ * @param options operation options
+ * @param resource the resource to save
+ * @return status
+ */
+ public IResourceLocator save(IResourceLocator locator, IResource resource, Options options) throws Exception;
+
+ /**
+ * Delete resource specified by resource locator
+ *
+ * @param locator location of the resource to delete
+ * @return status
+ */
+ public int delete(IResourceLocator locator) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Options.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Options.java
new file mode 100644
index 00000000000..ba0e3a07eb3
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Options.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.framework.resource.management;
+
+import java.util.Properties;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Options {
+
+ private Properties properties;
+
+ public Options() {
+ this.properties = new Properties();
+ }
+
+ public boolean getBoolean(String key) {
+ return new Boolean(getString(key));
+ }
+
+ public String getString(String key) {
+ return this.properties.getProperty(key, "");
+ }
+
+ public void put(String key, String value) {
+ if (value != null && value.length() > 0) {
+ this.properties.put(key, value);
+ }
+ }
+
+ public void put(String key, boolean value) {
+ this.properties.put(key, Boolean.toString(value));
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return properties.toString();
+ }
+
+ public void clear() {
+ this.properties.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Resource.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Resource.java
new file mode 100644
index 00000000000..e09183c36d9
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/Resource.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.framework.resource.management;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Resource implements IResource {
+ private URI uri;
+ private boolean isCompressed;
+
+ public Resource(URI uri, boolean isCompressed) {
+ this.uri = uri;
+ this.isCompressed = isCompressed;
+ }
+
+ public InputStream getContent() throws IOException {
+ return uri.toURL().openStream();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.resource.management.IResource#getLocation()
+ */
+ public URI getLocation() {
+ return uri;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getName()
+ */
+ @Override
+ public String getName() {
+ String value = uri.toASCIIString();
+ return value.substring(value.lastIndexOf("/") + 1, value.length());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#isCompressed()
+ */
+ @Override
+ public boolean isCompressed() {
+ return isCompressed;
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/ResourceLocator.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/ResourceLocator.java
new file mode 100644
index 00000000000..53548509083
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/ResourceLocator.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.framework.resource.management;
+
+import java.net.URI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ResourceLocator implements IResourceLocator {
+
+ private URI uri;
+
+ public ResourceLocator(URI uri) {
+ if (uri == null) {
+ throw new IllegalArgumentException("URI was null.");
+ }
+ this.uri = uri;
+ }
+
+ public URI getLocation() {
+ return uri;
+ }
+
+ public String getProtocol() {
+ return uri.getScheme();
+ }
+
+ public String toString() {
+ return uri.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocator#getRawPath()
+ */
+ @Override
+ public String getRawPath() {
+ String toReturn = uri.getSchemeSpecificPart();
+ if (toReturn.startsWith("//") != false) {
+ toReturn = toReturn.substring(2, toReturn.length());
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/StandardOptions.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/StandardOptions.java
new file mode 100644
index 00000000000..b09a2ccf3de
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/StandardOptions.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.framework.resource.management;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum StandardOptions {
+ CompressOnSave, CompressOnAcquire, DecompressOnSave, DecompressOnAquire, Overwrite, Extension;
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/EmptyResourceException.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/EmptyResourceException.java
new file mode 100644
index 00000000000..676633c125e
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/EmptyResourceException.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.framework.resource.management.exception;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EmptyResourceException extends Exception {
+
+ private static final long serialVersionUID = 262834138993880676L;
+
+ public EmptyResourceException() {
+ super();
+ }
+
+ public EmptyResourceException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public EmptyResourceException(String message) {
+ super(message);
+ }
+
+ public EmptyResourceException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/InvalidLocatorException.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/InvalidLocatorException.java
new file mode 100644
index 00000000000..2e5f536c206
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/InvalidLocatorException.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.framework.resource.management.exception;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InvalidLocatorException extends Exception {
+
+ private static final long serialVersionUID = -1291325728313575694L;
+
+ public InvalidLocatorException() {
+ super();
+ }
+
+ public InvalidLocatorException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public InvalidLocatorException(String message) {
+ super(message);
+ }
+
+ public InvalidLocatorException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/MalformedLocatorException.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/MalformedLocatorException.java
new file mode 100644
index 00000000000..3f26a64a2b5
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/exception/MalformedLocatorException.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.resource.management.exception;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MalformedLocatorException extends Exception {
+
+ private static final long serialVersionUID = -7595802736847790150L;
+
+ public MalformedLocatorException() {
+ super();
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public MalformedLocatorException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public MalformedLocatorException(String message) {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public MalformedLocatorException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceLocatorManager.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceLocatorManager.java
new file mode 100644
index 00000000000..9a2271e25cc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceLocatorManager.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.resource.management.internal;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorProvider;
+import org.eclipse.osee.framework.resource.management.exception.MalformedLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ResourceLocatorManager implements IResourceLocatorManager {
+
+ private List<IResourceLocatorProvider> resourceLocatorProviders;
+
+ public ResourceLocatorManager() {
+ this.resourceLocatorProviders = new CopyOnWriteArrayList<IResourceLocatorProvider>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorManager#addResourceLocatorProvider(org.eclipse.osee.framework.resource.management.IResourceLocatorProvider)
+ */
+ @Override
+ public void addResourceLocatorProvider(IResourceLocatorProvider resourceLocatorProvider) {
+ this.resourceLocatorProviders.add(resourceLocatorProvider);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorManager#removeResourceLocatorProvider(org.eclipse.osee.framework.resource.management.IResourceLocatorProvider)
+ */
+ @Override
+ public void removeResourceLocatorProvider(IResourceLocatorProvider resourceLocatorProvider) {
+ this.resourceLocatorProviders.remove(resourceLocatorProvider);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorManager#generateResourceLocator(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public IResourceLocator generateResourceLocator(String protocol, String seed, String name) throws MalformedLocatorException {
+ IResourceLocatorProvider resourceLocatorProvider = getProvider(protocol);
+ return resourceLocatorProvider.generateResourceLocator(seed, name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceLocatorManager#getResourceLocator(java.lang.String, java.lang.String)
+ */
+ @Override
+ public IResourceLocator getResourceLocator(String path) throws MalformedLocatorException {
+ IResourceLocatorProvider resourceLocatorProvider = getProvider(path);
+ return resourceLocatorProvider.getResourceLocator(path);
+ }
+
+ private IResourceLocatorProvider getProvider(String protocol) throws MalformedLocatorException {
+ IResourceLocatorProvider toReturn = null;
+ for (IResourceLocatorProvider provider : resourceLocatorProviders) {
+ if (provider.isValid(protocol) != false) {
+ toReturn = provider;
+ break;
+ }
+ }
+ if (toReturn == null) {
+ throw new MalformedLocatorException(String.format("Error finding locator for [%s] in [%s]", protocol,
+ resourceLocatorProviders));
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceManager.java b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceManager.java
new file mode 100644
index 00000000000..120f9ec893d
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.management/src/org/eclipse/osee/framework/resource/management/internal/ResourceManager.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.framework.resource.management.internal;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceListener;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.IResourceProvider;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.exception.InvalidLocatorException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ResourceManager implements IResourceManager {
+
+ private List<IResourceListener> listeners;
+ private List<IResourceProvider> resourceProviders;
+
+ public ResourceManager() {
+ this.listeners = new CopyOnWriteArrayList<IResourceListener>();
+ this.resourceProviders = new CopyOnWriteArrayList<IResourceProvider>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.resource.management.IResourceManagementService#addResourceListener(org.eclipse.osee.framework.resource.management.IResourceListener)
+ */
+ public void addResourceListener(IResourceListener listener) {
+ this.listeners.add(listener);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.resource.management.IResourceManagementService#removeResourceListener(org.eclipse.osee.framework.resource.management.IResourceListener)
+ */
+ public void removeResourceListener(IResourceListener listener) {
+ this.listeners.remove(listener);
+ }
+
+ private void notifyPreOnDelete(final IResourceLocator locator) {
+ for (IResourceListener listener : listeners) {
+ listener.onPreDelete(locator);
+ }
+ }
+
+ private void notifyPostOnDelete(final IResourceLocator locator) {
+ for (IResourceListener listener : listeners) {
+ listener.onPostDelete(locator);
+ }
+ }
+
+ private void notifyPreOnSave(final IResourceLocator locator, IResource resource, Options options) {
+ for (IResourceListener listener : listeners) {
+ listener.onPreSave(locator, resource, options);
+ }
+ }
+
+ private void notifyPostOnSave(IResourceLocator locator, final IResource resource, Options options) {
+ for (IResourceListener listener : listeners) {
+ listener.onPostSave(locator, resource, options);
+ }
+ }
+
+ private void notifyPreOnAcquire(final IResourceLocator locator) {
+ for (IResourceListener listener : listeners) {
+ listener.onPreAcquire(locator);
+ }
+ }
+
+ private void notifyPostOnAcquire(final IResource resource) {
+ for (IResourceListener listener : listeners) {
+ listener.onPostAcquire(resource);
+ }
+ }
+
+ private IResourceProvider getProvider(IResourceLocator locator) throws InvalidLocatorException {
+ IResourceProvider toReturn = null;
+ for (IResourceProvider provider : resourceProviders) {
+ if (provider.isValid(locator) != false) {
+ toReturn = provider;
+ break;
+ }
+ }
+ if (toReturn == null) {
+ throw new InvalidLocatorException();
+ }
+ return toReturn;
+ }
+
+ /**
+ * @see org.eclipse.osee.framework.resource.management.IResourceManager#addResourceProvider(org.eclipse.osee.framework.resource.management.IResourceProvider)
+ */
+ @Override
+ public void addResourceProvider(IResourceProvider resourceProvider) {
+ resourceProviders.add(resourceProvider);
+ }
+
+ /**
+ * @see org.eclipse.osee.framework.resource.management.IResourceManager#removeResourceProvider(org.eclipse.osee.framework.resource.management.IResourceProvider)
+ */
+ @Override
+ public void removeResourceProvider(IResourceProvider resourceProvider) {
+ resourceProviders.remove(resourceProvider);
+ }
+
+ public IResource acquire(IResourceLocator locator, Options options) throws Exception {
+ IResourceProvider provider = getProvider(locator);
+ notifyPreOnAcquire(locator);
+ IResource toReturn = provider.acquire(locator, options);
+ notifyPostOnAcquire(toReturn);
+ return toReturn;
+ }
+
+ public IResourceLocator save(IResourceLocator locator, IResource resource, Options options) throws Exception {
+ IResourceProvider provider = getProvider(locator);
+ notifyPreOnSave(locator, resource, options);
+ IResourceLocator actualLocator = provider.save(locator, resource, options);
+ notifyPostOnSave(locator, resource, options);
+ return actualLocator;
+ }
+
+ public int delete(IResourceLocator locator) throws Exception {
+ int toReturn = IResourceManager.FAIL;
+ IResourceProvider provider = getProvider(locator);
+ notifyPreOnDelete(locator);
+ toReturn = provider.delete(locator);
+ notifyPostOnDelete(locator);
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceManager#exists(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public boolean exists(IResourceLocator locator) throws Exception {
+ IResourceProvider provider = getProvider(locator);
+ return provider.exists(locator);
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/.classpath b/org.eclipse.osee.framework.resource.provider.attribute/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/.project b/org.eclipse.osee.framework.resource.provider.attribute/.project
new file mode 100644
index 00000000000..1cb44dfe3da
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.provider.attribute</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.resource.provider.attribute/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.provider.attribute/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..61a36bc3b0e
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Mon Apr 14 16:13:43 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.provider.attribute/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c8a70219a48
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Attribute Provider Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.provider.attribute;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.resource.provider.attribute.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.resource.provider.common,
+ org.osgi.framework
+Service-Component: OSGI-INF/attribute.provider.xml
+Export-Package: org.eclipse.osee.framework.resource.provider.attribute
+Require-Bundle: org.eclipse.osee.framework.resource.management
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/OSGI-INF/attribute.provider.xml b/org.eclipse.osee.framework.resource.provider.attribute/OSGI-INF/attribute.provider.xml
new file mode 100644
index 00000000000..221393fb7d6
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/OSGI-INF/attribute.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="attribute.resource.provider">
+ <implementation class="org.eclipse.osee.framework.resource.provider.attribute.AttributeProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.resource.management.IResourceProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/build.properties b/org.eclipse.osee.framework.resource.provider.attribute/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/Activator.java b/org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/Activator.java
new file mode 100644
index 00000000000..58ad48a1862
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/Activator.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.framework.resource.provider.attribute;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/AttributeProvider.java b/org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/AttributeProvider.java
new file mode 100644
index 00000000000..f71933b7846
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.attribute/src/org/eclipse/osee/framework/resource/provider/attribute/AttributeProvider.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.resource.provider.attribute;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.IResourceProvider;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.provider.common.OptionsProcessor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeProvider implements IResourceProvider {
+ private static final String SUPPORTED_PROTOCOL = "attr";
+ private static String BASE_PATH = null;
+
+ public AttributeProvider() {
+ BASE_PATH = OseeServerProperties.getOseeApplicationServerData();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#isValid(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ public boolean isValid(IResourceLocator locator) {
+ return locator != null && locator.getProtocol().equals(SUPPORTED_PROTOCOL);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#delete(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ public int delete(IResourceLocator locator) throws Exception {
+ int toReturn = IResourceManager.FAIL;
+ File file = new File(resolve(locator));
+ if (file == null || file.exists() != true) {
+ toReturn = IResourceManager.RESOURCE_NOT_FOUND;
+ } else if (file.exists() == true && file.canWrite() == true) {
+ boolean result = Lib.deleteFileAndEmptyParents(BASE_PATH, file);
+ if (result) {
+ toReturn = IResourceManager.OK;
+ }
+ }
+ return toReturn;
+ }
+
+ private URI resolve(IResourceLocator locator) throws URISyntaxException {
+ StringBuilder builder = new StringBuilder(BASE_PATH + File.separator + SUPPORTED_PROTOCOL + File.separator);
+ builder.append(locator.getRawPath());
+ return new File(builder.toString()).toURI();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#acquire(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public IResource acquire(IResourceLocator locator, Options options) throws Exception {
+ IResource toReturn = null;
+ OptionsProcessor optionsProcessor = new OptionsProcessor(resolve(locator), locator, null, options);
+ toReturn = optionsProcessor.getResourceToServer();
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#save(org.eclipse.osee.framework.resource.management.IResourceLocator, org.eclipse.osee.framework.resource.management.IResource, org.eclipse.osee.framework.resource.management.Options)
+ */
+ @Override
+ public IResourceLocator save(IResourceLocator locator, IResource resource, Options options) throws Exception {
+ IResourceLocator toReturn = null;
+ OptionsProcessor optionsProcessor = new OptionsProcessor(resolve(locator), locator, resource, options);
+ OutputStream outputStream = null;
+ InputStream inputStream = null;
+ try {
+ File storageFile = optionsProcessor.getStorageFile();
+ IResource resourceToStore = optionsProcessor.getResourceToStore();
+
+ outputStream = new FileOutputStream(storageFile);
+ inputStream = resourceToStore.getContent();
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ toReturn = optionsProcessor.getActualResouceLocator();
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ if (toReturn == null) {
+ throw new IllegalStateException(String.format("We failed to save resource %s.", locator.getLocation()));
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResourceProvider#exists(org.eclipse.osee.framework.resource.management.IResourceLocator)
+ */
+ @Override
+ public boolean exists(IResourceLocator locator) throws Exception {
+ URI uri = resolve(locator);
+ File testFile = new File(uri);
+ return testFile.exists();
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.provider.common/.classpath b/org.eclipse.osee.framework.resource.provider.common/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.resource.provider.common/.project b/org.eclipse.osee.framework.resource.provider.common/.project
new file mode 100644
index 00000000000..e2f3ddabd67
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.resource.provider.common</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.resource.provider.common/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.resource.provider.common/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..c6d8450861f
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed May 07 16:13:05 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.resource.provider.common/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.resource.provider.common/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c30473bb0a0
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Resource Provider Common Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.resource.provider.common;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.osgi.framework
+Require-Bundle: org.eclipse.osee.framework.resource.management
+Bundle-Activator: org.eclipse.osee.framework.resource.provider.common.Activator
+Export-Package: org.eclipse.osee.framework.resource.provider.common,
+ org.eclipse.osee.framework.resource.provider.common.resources
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.resource.provider.common/build.properties b/org.eclipse.osee.framework.resource.provider.common/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/Activator.java b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/Activator.java
new file mode 100644
index 00000000000..c97d9b0bddd
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/Activator.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.framework.resource.provider.common;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ @Override
+ public void start(BundleContext arg0) throws Exception {
+ }
+
+ @Override
+ public void stop(BundleContext arg0) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/OptionsProcessor.java b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/OptionsProcessor.java
new file mode 100644
index 00000000000..94011bd7f29
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/OptionsProcessor.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.resource.provider.common;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.Resource;
+import org.eclipse.osee.framework.resource.management.ResourceLocator;
+import org.eclipse.osee.framework.resource.management.StandardOptions;
+import org.eclipse.osee.framework.resource.provider.common.resources.Resources;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OptionsProcessor {
+
+ private URI fileuri;
+ private URI locatoruri;
+ private IResource resource;
+ private String extension;
+ private boolean deCompressOnSave;
+ private boolean shouldCompress;
+ private boolean decompressOnAcquire;
+ private boolean compressOnAcquire;
+ private boolean overwrite;
+
+ /**
+ * @param resource
+ * @param uri
+ * @param locator
+ * @param options
+ * @throws URISyntaxException
+ */
+ public OptionsProcessor(URI uri, IResourceLocator locator, IResource resource, Options options) throws URISyntaxException {
+ this.resource = resource;
+ decompressOnAcquire = options.getBoolean(StandardOptions.DecompressOnAquire.name());
+ compressOnAcquire = options.getBoolean(StandardOptions.CompressOnAcquire.name());
+ overwrite = options.getBoolean(StandardOptions.Overwrite.name());
+ shouldCompress = options.getBoolean(StandardOptions.CompressOnSave.name());
+ deCompressOnSave = options.getBoolean(StandardOptions.DecompressOnSave.name());
+ extension = options.getString(StandardOptions.Extension.name());
+
+ StringBuilder sb = new StringBuilder(uri.toString());
+ StringBuilder sb2 = new StringBuilder(locator.toString());
+ if (extension.length() > 0) {
+ sb.append(".");
+ sb.append(extension);
+ sb2.append(".");
+ sb2.append(extension);
+ }
+ if (shouldCompress) {
+ sb.append(".");
+ sb.append("zip");
+ sb2.append(".");
+ sb2.append("zip");
+ }
+ this.fileuri = new URI(sb.toString());
+ this.locatoruri = new URI(sb2.toString());
+ }
+
+ /**
+ * @return storage file
+ * @throws IOException
+ */
+ public File getStorageFile() throws IOException {
+ File storageFile = new File(fileuri);
+ if (!overwrite) {
+ if (storageFile.exists()) {
+ throw new IOException(String.format("The file [%s] already exists.", storageFile.getAbsolutePath()));
+ }
+ }
+ File parent = storageFile.getParentFile();
+ if (parent != null && !parent.exists()) {
+ parent.mkdirs();
+ }
+ return storageFile;
+ }
+
+ /**
+ * @return resource to store
+ * @throws Exception
+ */
+ public IResource getResourceToStore() throws Exception {
+ IResource resourceToReturn;
+ if (shouldCompress && !resource.isCompressed()) {
+ resourceToReturn = Resources.compressResource(resource);
+ } else if (deCompressOnSave && resource.isCompressed()) {
+ resourceToReturn = Resources.decompressResource(resource);
+ } else {
+ resourceToReturn = resource;
+ }
+ return resourceToReturn;
+ }
+
+ public IResource getResourceToServer() throws Exception {
+ IResource toReturn = null;
+ File testFile = new File(this.fileuri);
+ if (testFile != null && testFile.exists() != false) {
+ boolean isCompressed = Lib.isCompressed(testFile);
+ toReturn = new Resource(this.fileuri, isCompressed);
+
+ if (compressOnAcquire && !isCompressed) {
+ toReturn = Resources.compressResource(toReturn);
+ } else if (decompressOnAcquire && isCompressed) {
+ toReturn = Resources.decompressResource(toReturn);
+ }
+ }
+ return toReturn;
+ }
+
+ /**
+ * @return actual resorce locator
+ */
+ public IResourceLocator getActualResouceLocator() {
+ return new ResourceLocator(this.locatoruri);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/CompressedResourceBridge.java b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/CompressedResourceBridge.java
new file mode 100644
index 00000000000..458f5c24e32
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/CompressedResourceBridge.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.framework.resource.provider.common.resources;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import org.eclipse.osee.framework.resource.management.IResource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CompressedResourceBridge implements IResource {
+ private byte[] backing;
+ private boolean isCompressed;
+ private URI uri;
+
+ public CompressedResourceBridge(byte[] backing, URI uri, boolean isCompressed) {
+ this.backing = backing;
+ this.isCompressed = isCompressed;
+ this.uri = uri;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getContent()
+ */
+ @Override
+ public InputStream getContent() throws IOException {
+ return new ByteArrayInputStream(backing);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getLocation()
+ */
+ @Override
+ public URI getLocation() {
+ return uri;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getName()
+ */
+ @Override
+ public String getName() {
+ String value = uri.toASCIIString();
+ return value.substring(value.lastIndexOf("/") + 1, value.length());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#isCompressed()
+ */
+ @Override
+ public boolean isCompressed() {
+ return isCompressed;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Resources.java b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Resources.java
new file mode 100644
index 00000000000..0303d4d9c03
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Resources.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.framework.resource.provider.common.resources;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URLEncoder;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.IResource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Resources {
+
+ private static String removeName(String path) {
+ int index = path.lastIndexOf("/");
+ if (index != -1) {
+ path = path.substring(0, index + 1);
+ }
+ return path;
+ }
+
+ public static IResource compressResource(IResource resource) throws Exception {
+ InputStream inputStream = null;
+ byte[] buffer = new byte[0];
+ try {
+ inputStream = resource.getContent();
+ buffer = Lib.compressStream(inputStream, resource.getName());
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ return new CompressedResourceBridge(buffer, new URI(resource.getLocation() + ".zip"), true);
+ }
+
+ public static IResource decompressResource(IResource resource) throws Exception {
+ String path = resource.getLocation().toASCIIString();
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ String fileName = null;
+ try {
+ fileName = Streams.decompressStream(resource.getContent(), outputStream);
+ fileName = URLEncoder.encode(fileName, "UTF-8");
+ } finally {
+ outputStream.close();
+ }
+ if (fileName != null && fileName.length() > 0) {
+ path = removeName(path) + fileName;
+ } else {
+ path = Lib.removeExtension(path);
+ }
+ return new CompressedResourceBridge(outputStream.toByteArray(), new URI(path), false);
+ }
+}
diff --git a/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Streams.java b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Streams.java
new file mode 100644
index 00000000000..1427ae23b32
--- /dev/null
+++ b/org.eclipse.osee.framework.resource.provider.common/src/org/eclipse/osee/framework/resource/provider/common/resources/Streams.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.framework.resource.provider.common.resources;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Streams {
+
+ public static String decompressStream(InputStream inputStream, OutputStream outputStream) throws IOException {
+ String zipEntryName = null;
+ ZipInputStream zipInputStream = null;
+ try {
+ zipInputStream = new ZipInputStream(inputStream);
+ ZipEntry entry = zipInputStream.getNextEntry();
+ zipEntryName = entry.getName();
+ // Transfer bytes from the ZIP file to the output file
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = zipInputStream.read(buf)) > 0) {
+ outputStream.write(buf, 0, len);
+ }
+ } finally {
+ if (zipInputStream != null) {
+ zipInputStream.close();
+ }
+ }
+ return zipEntryName;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.search.engine.servlet/.classpath b/org.eclipse.osee.framework.search.engine.servlet/.classpath
new file mode 100644
index 00000000000..ed2bc1287f0
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.search.engine.servlet/.project b/org.eclipse.osee.framework.search.engine.servlet/.project
new file mode 100644
index 00000000000..5015de4b0ab
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.search.engine.servlet</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.search.engine.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.search.engine.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..bd220759bff
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Jul 01 11:47:04 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.search.engine.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.search.engine.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..8ff972144fc
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Search Engine Servlet Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.search.engine.servlet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.search.engine.servlet.Activator
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.search.engine,
+ org.osgi.framework,
+ org.osgi.service.http,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.search.engine.servlet/build.properties b/org.eclipse.osee.framework.search.engine.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/Activator.java b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/Activator.java
new file mode 100644
index 00000000000..db8388bb998
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/Activator.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.framework.search.engine.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.eclipse.osee.framework.search.engine.ISearchEngine;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+ private static Activator instance;
+
+ private OseeHttpServiceTracker searchEngineHttpTracker;
+ private OseeHttpServiceTracker searchEngineTaggerHttpTracker;
+ private ServiceTracker searchServiceTracker;
+ private ServiceTracker taggerServiceTracker;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+
+ searchServiceTracker = new ServiceTracker(context, ISearchEngine.class.getName(), null);
+ searchServiceTracker.open();
+
+ taggerServiceTracker = new ServiceTracker(context, ISearchEngineTagger.class.getName(), null);
+ taggerServiceTracker.open();
+
+ searchEngineHttpTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.SEARCH_CONTEXT, SearchEngineServlet.class);
+ searchEngineHttpTracker.open();
+
+ searchEngineTaggerHttpTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.SEARCH_TAGGING_CONTEXT,
+ SearchEngineTaggerServlet.class);
+ searchEngineTaggerHttpTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ searchEngineHttpTracker.close();
+ searchEngineHttpTracker = null;
+
+ searchEngineTaggerHttpTracker.close();
+ searchEngineTaggerHttpTracker = null;
+
+ searchServiceTracker.close();
+ searchServiceTracker = null;
+
+ taggerServiceTracker.close();
+ taggerServiceTracker = null;
+
+ instance = null;
+ }
+
+ public static Activator getInstance() {
+ return instance;
+ }
+
+ public ISearchEngine getSearchEngine() {
+ return (ISearchEngine) searchServiceTracker.getService();
+ }
+
+ public ISearchEngineTagger getSearchTagger() {
+ return (ISearchEngineTagger) taggerServiceTracker.getService();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/HttpSearchInfo.java b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/HttpSearchInfo.java
new file mode 100644
index 00000000000..728d0384109
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/HttpSearchInfo.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.framework.search.engine.servlet;
+
+import java.util.Enumeration;
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStoreWriter;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.SearchOptions.SearchOptionsEnum;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class HttpSearchInfo {
+
+ private final String branchId;
+ private final String queryString;
+ private final SearchOptions options;
+ private final String[] attributeTypes;
+
+ public HttpSearchInfo(String branchId, SearchOptions options, String queryString, String... attributeTypes) {
+ super();
+ this.branchId = branchId;
+ this.options = options;
+ this.queryString = queryString;
+ this.attributeTypes = attributeTypes != null ? attributeTypes : new String[0];
+ }
+
+ public String getQuery() {
+ return queryString;
+ }
+
+ public String toString() {
+ return queryString;
+ }
+
+ public int getBranchId() {
+ return Integer.parseInt(this.branchId);
+ }
+
+ public SearchOptions getOptions() {
+ return options;
+ }
+
+ public String[] getAttributeTypes() {
+ return attributeTypes;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static HttpSearchInfo loadFromGet(HttpServletRequest request) {
+ SearchOptions options = new SearchOptions();
+ String queryString = null;
+ String branchId = null;
+ String[] attributeTypes = null;
+ Enumeration<String> enumeration = request.getParameterNames();
+ while (enumeration.hasMoreElements()) {
+ String name = enumeration.nextElement();
+ String value = request.getParameter(name);
+ if (name.equalsIgnoreCase("query")) {
+ queryString = value;
+ } else if (name.equalsIgnoreCase("branchId")) {
+ branchId = value;
+ } else {
+ if (name.equalsIgnoreCase("name only")) {
+ attributeTypes = new String[] {"Name"};
+ } else {
+ options.put(name.toLowerCase(), value);
+ }
+ }
+ }
+ return new HttpSearchInfo(branchId, options, queryString, attributeTypes);
+ }
+
+ public static HttpSearchInfo loadFromPost(HttpServletRequest request) throws Exception {
+ PropertyStore propertyStore = new PropertyStore(request.getParameter("sessionId"));
+
+ PropertyStoreWriter propertyStoreWriter = new PropertyStoreWriter();
+ propertyStoreWriter.load(propertyStore, request.getInputStream());
+
+ SearchOptions options = new SearchOptions();
+ options.put(SearchOptionsEnum.include_deleted.asStringOption(), propertyStore.get("include deleted"));
+ options.put(SearchOptionsEnum.match_word_order.asStringOption(), propertyStore.get("match word order"));
+ options.put(SearchOptionsEnum.as_xml.asStringOption(), propertyStore.get("as xml"));
+ options.put(SearchOptionsEnum.find_all_locations.asStringOption(), propertyStore.get("find all locations"));
+ options.put(SearchOptionsEnum.case_sensitive.asStringOption(), propertyStore.get("case sensitive"));
+
+ return new HttpSearchInfo(propertyStore.get("branchId"), options, propertyStore.get("query"),
+ propertyStore.getArray("attributeType"));
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineServlet.java b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineServlet.java
new file mode 100644
index 00000000000..fd3c5209eb4
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineServlet.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.ArtifactJoinQuery;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.ISearchEngine;
+import org.eclipse.osee.framework.search.engine.MatchLocation;
+import org.eclipse.osee.framework.search.engine.SearchResult;
+import org.eclipse.osee.framework.search.engine.SearchOptions.SearchOptionsEnum;
+import org.eclipse.osee.framework.search.engine.SearchResult.ArtifactMatch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchEngineServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = 3722992788943330970L;
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ HttpSearchInfo searchInfo = HttpSearchInfo.loadFromGet(request);
+ executeSearch(searchInfo, response, true);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ HttpSearchInfo searchInfo = HttpSearchInfo.loadFromPost(request);
+ executeSearch(searchInfo, response, false);
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ OseeLog.log(Activator.class, Level.SEVERE, String.format(
+ "Failed to respond to a search engine servlet request [%s]", request.getRequestURL()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+ }
+
+ private void executeSearch(HttpSearchInfo searchInfo, HttpServletResponse response, boolean wasFromGet) throws IOException {
+ try {
+ ISearchEngine searchEngine = Activator.getInstance().getSearchEngine();
+ SearchResult results =
+ searchEngine.search(searchInfo.getQuery(), searchInfo.getBranchId(), searchInfo.getOptions(),
+ searchInfo.getAttributeTypes());
+ response.setStatus(wasFromGet ? HttpServletResponse.SC_OK : HttpServletResponse.SC_ACCEPTED);
+ if (!results.isEmpty()) {
+ long start = System.currentTimeMillis();
+ if (!searchInfo.getOptions().getBoolean(SearchOptionsEnum.as_xml.asStringOption())) {
+ sendAsDbJoin(response, results);
+ } else {
+ sendAsXml(response, results);
+ }
+ System.out.println(String.format("Search for [%s] - [%d results sent in %d ms]", searchInfo.getQuery(),
+ results.size(), System.currentTimeMillis() - start));
+ } else {
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("text/plain");
+ }
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ OseeLog.log(Activator.class, Level.SEVERE, String.format(
+ "Failed to respond to a search engine servlet request [%s]", searchInfo.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+ private void sendAsDbJoin(HttpServletResponse response, SearchResult results) throws Exception {
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("text/plain");
+
+ ArtifactJoinQuery joinQuery = JoinUtility.createArtifactJoinQuery();
+ for (Integer branchId : results.getBranchIds()) {
+ for (Integer artId : results.getArtifactIds(branchId)) {
+ joinQuery.add(artId, branchId);
+ }
+ }
+ joinQuery.store();
+ response.getWriter().write(String.format("%d,%d", joinQuery.getQueryId(), joinQuery.size()));
+ }
+
+ /**
+ * <match artId="" branchId=""> <attr gammaId=""><location start="" end="" /></attr> </match>
+ *
+ * @throws Exception
+ */
+ private void sendAsXml(HttpServletResponse response, SearchResult results) throws Exception {
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("text/xml");
+ PrintWriter writer = response.getWriter();
+
+ writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
+ writer.write("<search>");
+ for (Integer branchId : results.getBranchIds()) {
+ writer.write(String.format("<match branchId=\"%s\">", branchId));
+ for (ArtifactMatch match : results.getArtifacts(branchId)) {
+ writer.write(String.format("<art artId=\"%s\" >", match.getArtId()));
+ for (Long gammaId : match.getAttributes()) {
+ Collection<MatchLocation> locations = match.getMatchLocations(gammaId);
+ writer.write(String.format("<attr gammaId=\"%s\">", gammaId));
+ if (locations != null) {
+ for (MatchLocation location : locations) {
+ writer.write(String.format("<location start=\"%s\" end=\"%s\" />", location.getStartPosition(),
+ location.getEndPosition()));
+ }
+ }
+ writer.write("</attr>");
+ }
+ writer.write("</art>");
+ }
+ writer.write("</match>");
+ }
+ writer.write("</search>");
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineTaggerServlet.java b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineTaggerServlet.java
new file mode 100644
index 00000000000..eb74941f11f
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/SearchEngineTaggerServlet.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.framework.search.engine.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchEngineTaggerServlet extends OseeHttpServlet {
+ private static final long serialVersionUID = 5104108752343302320L;
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ long start = System.currentTimeMillis();
+ try {
+ StringBuffer message = new StringBuffer();
+ int branchId = Integer.parseInt(request.getParameter("branchId"));
+ boolean waitForTags = Boolean.parseBoolean(request.getParameter("wait"));
+ if (waitForTags) {
+ TagListener listener = new TagListener();
+ Activator.getInstance().getSearchTagger().tagByBranchId(listener, branchId);
+ if (listener.wasProcessed() != true) {
+ synchronized (listener) {
+ listener.wait();
+ }
+ }
+ message.append(String.format("Processed %d queries containing %d attributes in %d ms.",
+ listener.getQueryCount(), listener.getAttributeCount(), System.currentTimeMillis() - start));
+ } else {
+ Activator.getInstance().getSearchTagger().tagByBranchId(branchId);
+ }
+ response.setContentType("text/plain");
+ response.setCharacterEncoding("UTF-8");
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ response.getWriter().write(message.toString());
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Error submitting for tagging - [%s]",
+ request.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ InputStream inputStream = null;
+ try {
+ boolean waitForTags = Boolean.parseBoolean(request.getParameter("wait"));
+ inputStream = request.getInputStream();
+ if (waitForTags) {
+ TagListener listener = new TagListener();
+ Activator.getInstance().getSearchTagger().tagFromXmlStream(listener, inputStream);
+ if (listener.wasProcessed() != true) {
+ synchronized (listener) {
+ listener.wait();
+ }
+ }
+ } else {
+ Activator.getInstance().getSearchTagger().tagFromXmlStream(inputStream);
+ }
+ response.setContentType("text/plain");
+ response.setCharacterEncoding("UTF-8");
+ response.setStatus(HttpServletResponse.SC_CREATED);
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Error submitting for tagging - [%s]",
+ request.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ String queryId = request.getParameter("queryId");
+ int value = Activator.getInstance().getSearchTagger().deleteTags(Integer.parseInt(queryId));
+ response.setContentType("text/plain");
+ response.setCharacterEncoding("UTF-8");
+ if (value > 0) {
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ } else {
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ }
+ } catch (Exception ex) {
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Error submitting for tagging - [%s]",
+ request.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ } finally {
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/TagListener.java b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/TagListener.java
new file mode 100644
index 00000000000..bdf8f81d8d2
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.servlet/src/org/eclipse/osee/framework/search/engine/servlet/TagListener.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.framework.search.engine.servlet;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.search.engine.TagListenerAdapter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TagListener extends TagListenerAdapter {
+
+ private volatile Map<Integer, Throwable> tagErrors;
+ private volatile Set<Integer> queryIds;
+ private volatile boolean wasProcessed;
+ private volatile int expectedTotal;
+ private volatile int queryCount;
+ private volatile int attributeCount;
+
+ public TagListener() {
+ this.queryIds = Collections.synchronizedSet(new HashSet<Integer>());
+ this.wasProcessed = false;
+ this.queryCount = 0;
+ this.attributeCount = 0;
+ this.tagErrors = Collections.synchronizedMap(new HashMap<Integer, Throwable>());
+ }
+
+ public boolean wasProcessed() {
+ return wasProcessed;
+ }
+
+ public boolean hasErrors() {
+ return tagErrors.size() > 0;
+ }
+
+ public int getAttributeCount() {
+ return attributeCount;
+ }
+
+ public int getQueryCount() {
+ return queryCount;
+ }
+
+ public Map<Integer, Throwable> getTagErrors() {
+ return tagErrors;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.TagListenerAdapter#onTagExpectedQueryIdSubmits(int)
+ */
+ @Override
+ public void onTagExpectedQueryIdSubmits(int totalQueries) {
+ this.expectedTotal = totalQueries;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.TagListenerAdapter#onTagError(int, java.lang.Throwable)
+ */
+ @Override
+ synchronized public void onTagError(int queryId, Throwable throwable) {
+ tagErrors.put(queryId, throwable);
+ this.wasProcessed = true;
+ this.notify();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.TagListenerAdapter#onTagQueryIdSubmit(int)
+ */
+ @Override
+ synchronized public void onTagQueryIdSubmit(int queryId) {
+ queryCount++;
+ queryIds.add(queryId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.TagListenerAdapter#onAttributeTagComplete(int, long, int, long)
+ */
+ @Override
+ public void onAttributeTagComplete(int queryId, long gammaId, int totalTags, long processingTime) {
+ if (this.queryIds.contains(queryId)) {
+ attributeCount++;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagQueryIdTagComplete(int, long, long)
+ */
+ @Override
+ synchronized public void onTagQueryIdTagComplete(int queryId, long waitTime, long processingTime) {
+ if (this.queryIds.contains(queryId)) {
+ this.queryIds.remove(queryId);
+ // System.out.println(String.format("Tag query ids remaining: [%d]", this.queryIds.size()));
+ if (this.queryIds.isEmpty() && queryCount == expectedTotal) {
+ this.wasProcessed = true;
+ this.notify();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.test/.classpath b/org.eclipse.osee.framework.search.engine.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.search.engine.test/.project b/org.eclipse.osee.framework.search.engine.test/.project
new file mode 100644
index 00000000000..0abdb5d263e
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.search.engine.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.search.engine.test/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.search.engine.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..7277552d4aa
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed Jul 02 16:57:06 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.search.engine.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.search.engine.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..2889587e0c7
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Search Engine Test Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.search.engine.test;singleton:=true
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.search.engine.test.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/tests.xml
+Import-Package: junit.framework,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.search.engine,
+ org.eclipse.osee.framework.search.engine.data,
+ org.eclipse.osee.framework.search.engine.utility,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.search.engine.test/OSGI-INF/tests.xml b/org.eclipse.osee.framework.search.engine.test/OSGI-INF/tests.xml
new file mode 100644
index 00000000000..b2cf57502aa
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/OSGI-INF/tests.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="search.engine.tests">
+ <implementation class="org.eclipse.osee.framework.search.engine.test.AllSearchEngineTests"/>
+ <service>
+ <provide interface="junit.framework.Test"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/build.properties b/org.eclipse.osee.framework.search.engine.test/build.properties
new file mode 100644
index 00000000000..a65755cb2a8
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test1.data.xml b/org.eclipse.osee.framework.search.engine.test/data/test1.data.xml
new file mode 100644
index 00000000000..da67a5380d9
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test1.data.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>This is a Test</o:Title><o:Author>b1122182</o:Author><o:LastAuthor>b1122182</o:LastAuthor><o:Revision>3</o:Revision><o:TotalTime>1</o:TotalTime><o:Created>2008-07-17T15:30:00Z</o:Created><o:LastSaved>2008-07-17T15:33:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>2</o:Words><o:Characters>16</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>17</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/></w:fonts><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="003F07B6"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="2050"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="80"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00C559AE"/><wsp:rsid wsp:val="003F07B6"/><wsp:rsid wsp:val="00821BA3"/><wsp:rsid wsp:val="00850125"/><wsp:rsid wsp:val="00C03969"/><wsp:rsid wsp:val="00C559AE"/></wsp:rsids></w:docPr><w:body><wx:sect><w:p wsp:rsidR="00850125" wsp:rsidRPr="00C03969" wsp:rsidRDefault="00C559AE"><w:pPr><w:rPr><w:b/><w:sz w:val="36"/><w:sz-cs w:val="36"/><w:u w:val="single"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00C03969"><w:rPr><w:b/><w:sz w:val="36"/><w:sz-cs w:val="36"/><w:u w:val="single"/></w:rPr><w:t>This is a Test.</w:t></w:r></w:p><w:p wsp:rsidR="00C559AE" wsp:rsidRDefault="003F07B6"><w:r><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><w:binData w:name="wordml://02000001.jpg">/9j/4UyaR==</w:binData><v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:3in;height:324.45pt" o:bordertopcolor="this" o:borderleftcolor="this" o:borderbottomcolor="this" o:borderrightcolor="this" filled="t" fillcolor="black"><v:imagedata src="wordml://02000001.jpg" o:title="00600019"/><w10:bordertop type="single" width="18"/><w10:borderleft type="single" width="18"/><w10:borderbottom type="single" width="18"/><w10:borderright type="single" width="18"/></v:shape></w:pict></w:r></w:p><w:sectPr wsp:rsidR="00C559AE" wsp:rsidSect="003F07B6"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sect></w:body></w:wordDocument>
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test1.expected.txt b/org.eclipse.osee.framework.search.engine.test/data/test1.expected.txt
new file mode 100644
index 00000000000..d0c54c199a1
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test1.expected.txt
@@ -0,0 +1 @@
+This is a Test. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test1.tags.txt b/org.eclipse.osee.framework.search.engine.test/data/test1.tags.txt
new file mode 100644
index 00000000000..f74c2bc6655
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test1.tags.txt
@@ -0,0 +1,4 @@
+this 103194
+is 402
+a 10
+test 113146 \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test2.data.xml b/org.eclipse.osee.framework.search.engine.test/data/test2.data.xml
new file mode 100644
index 00000000000..d6dd6b45a73
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test2.data.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<standard>
+ <entry>
+ <a:entry>Inside element</a:entry>
+ outside element
+ </entry>
+ <entry>no nesting.</entry>
+</standard>
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test2.expected.txt b/org.eclipse.osee.framework.search.engine.test/data/test2.expected.txt
new file mode 100644
index 00000000000..4abff0b97ad
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test2.expected.txt
@@ -0,0 +1 @@
+Inside element outside element no nesting. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test2.tags.txt b/org.eclipse.osee.framework.search.engine.test/data/test2.tags.txt
new file mode 100644
index 00000000000..2843136d53c
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test2.tags.txt
@@ -0,0 +1,6 @@
+inside 15546706
+element 459231038
+outside 248748982
+element 459231038
+no 373
+nesting 290699765 \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test3.data.xml b/org.eclipse.osee.framework.search.engine.test/data/test3.data.xml
new file mode 100644
index 00000000000..d29e95b0073
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test3.data.xml
@@ -0,0 +1,4847 @@
+<w:p wsp:rsidR="00903BA4" wsp:rsidRDefault="00903BA4"><w:r><w:t>I am going to test appendeces this time.</w:t></w:r></w:p><w:p wsp:rsidR="00903BA4" wsp:rsidRDefault="00903BA4"><w:r><w:pict><v:shapetype coordsize="21600,21600" filled="f" id="_x0000_t75" o:preferrelative="t" o:spt="75" path="m@4@5l@4@11@9@11@9@5xe" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f"/><o:lock aspectratio="t" v:ext="edit"/></v:shapetype><w:binData w:name="wordml://02000001.jpg">/9j/4AAQSkZJRgABAgEAYABgAAD/4RBYRXhpZgAATU0AKgAAAAgABEdGAAMAAAABAAMAAEdJAAMA
+AAABADIAAIdpAAQAAAABAAAIMuocAAcAAAf0AAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAACkAMAAgAAABQAABA86hwABwAAB+wAAAhQAAAAABzqAAAACAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIwMDU6MTE6MDQgMTc6MTI6MDUA/+wAY0R1Y2t5AAEA
+BAAAADwAAwBOAAAAJQAoAGMAKQAgAFAAZQB0AGUAcgAgAE0AaQBsAGwAZQByAC8ASQBjAG8AbgBp
+AGMAYQAvAEcAZQB0AHQAeQAgAEkAbQBhAGcAZQBzAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlu
+bwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAA
+AAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA
+ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAAC
+xAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNo
+AAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHly
+aWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJ
+RUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVog
+AAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpY
+WVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
+AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv
+bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv
+bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJl
+bmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5j
+ZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAA
+Vx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAA
+AAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA
+fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwEN
+ARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB
+2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLg
+AusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0E
+OwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXV
+BeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H
+0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woR
+CicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcM
+wAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+z
+D88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT
+IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbW
+FvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwb
+FBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+U
+H78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwk
+qyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoC
+KjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv
+/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3
+NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9
+Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH
+RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JM
+KkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRC
+VI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZd
+J114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9
+ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9Fw
+K3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pG
+eqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOF
+R4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu
+kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByc
+iZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjE
+qTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2
+AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NY
+w9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzR
+vtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A2
+4L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv
+zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t
+////7gAOQWRvYmUAZMAAAAAB/+ELXmh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFj
+a2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4bXA6eG1w
+bWV0YSB4bWxuczp4bXA9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6
+Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24g
+cmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1s
+bnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj48ZGM6Y3JlYXRvcj48cmRm
+OlNlcSB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1u
+cyMiPjxyZGY6bGk+UGV0ZXIgTWlsbGVyPC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVh
+dG9yPjwvcmRmOkRlc2NyaXB0aW9uPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZh
+ZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6dGlmZj0iaHR0cDovL25z
+LmFkb2JlLmNvbS90aWZmLzEuMC8iPjx0aWZmOmFydGlzdD5QZXRlciBNaWxsZXI8L3RpZmY6YXJ0
+aXN0Pjx0aWZmOmNvcHlyaWdodD48cmRmOkFsdCB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3Jn
+LzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+
+KGMpIFBldGVyIE1pbGxlci9JY29uaWNhL0dldHR5IEltYWdlczwvcmRmOmxpPjwvcmRmOkFsdD4N
+CgkJCTwvdGlmZjpjb3B5cmlnaHQ+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiBy
+ZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxu
+czpNaWNyb3NvZnRQaG90bz0iaHR0cDovL25zLm1pY3Jvc29mdC5jb20vcGhvdG8vMS4wIj48TWlj
+cm9zb2Z0UGhvdG86UmF0aW5nPjUwPC9NaWNyb3NvZnRQaG90bzpSYXRpbmc+PC9yZGY6RGVzY3Jp
+cHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRh
+LWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu
+MC8iPjx4bXA6UmF0aW5nPjM8L3htcDpSYXRpbmc+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNj
+cmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgy
+ZjFiIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+PGV4aWY6RGF0
+ZVRpbWVPcmlnaW5hbD4yMDA1LTExLTA1VDAxOjEyOjA1WjwvZXhpZjpEYXRlVGltZU9yaWdpbmFs
+PjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3htcDp4bXBtZXRhPg0KICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQ
+DAwMDAwMEAwODxAPDgwTExQUExMcGxsbHB8fHx8fHx8fHx//2wBDAQcHBw0MDRgQEBgaFREVGh8f
+Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx//wAARCAMABAAD
+AREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF
+BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0
+NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj
+pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QA
+HwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEE
+BSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH
+SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0
+tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5
+eoAfQBraJrc+lXck8P8AHG8f/fVY1Kdze5auNU+1x+ZPJ/q/3ccfl/epU6Vh8xnf2fcfY/tyfvII
+5PLq0yB+n6peWkm+OT/V1smB6N4W1C01GSOPy38uf93cSRyfMu7/AJ6JXlym0ryPdupsyfHvg2SG
+OTWLH57FPkuP7ytW+BrxquyPPzGi0tDgZK6zhlEdaXlxa3kd3BJsuIJN8clBhKJ6XoHi3QdYBh1P
+/Qb9/wDWXEb+Uslevh8TzbnmYvCcq906bSo7yykvILaTzoIJN6Ru/wA+1k3ffrsnJW0POpXv7xgr
+o+nape391PcfZbi6k/0COT5K8ieUqS/r/M+kw+aKMrf1+RzHxHXytSjj8zfO8Cefsfd937tcNLCK
+k7Ho4mv7aJgeG9LTUdUt7WT5IHfZJJWVaXKjnw8NT1u6k8ue00TS9/2HTo/3nkf8tG/ikavn62ju
+fRYfRD/+EGm/sPVta1CPZZWUciPHv2y+a33KypV+efLHoJyTYt9Zajpek2j3vyWL/PBB/tf7VctO
+tGrNxj8SOi90bPhvVbo6RPdWtonkXs+ze+9V/wCA1Nar7Cryt35dSKtHnhqVdctdM07XI5NXuvss
+c/8Aq44/9bureWYyxj5ox2/rsjKhKFJGG/iGC1137FBPPBA77JJE/et81bUFJUWCsdRY+XsgdH/0
+FH2bNm3b/t14sm767m6sEnjlNM1HyE8t7T/lps+9u/2a9TBzrUoWf6HPWw3MiLVrrwxrVmk8+mT3
+cH/LOTyH/wDHGr7fLa7nTsz5TH0pU2c4/hKytoJ4rXRXe3uv9RPdTorQbq6K2DT16k0seqb5Vt/X
+kc5faBdac8izWk8H2X/WSQf+hNXmV41Fp0+R69GEX7y3LEFx4x/sx7W0k+1WPl7/AC5P7tefSwUJ
+u51yquMSTR9X1C18xLuwnktEj/1cf8L/AN6s6tGEZWkbUqrlE6DwSlpe6jJDqnzwzx/v45K8vH1q
+lCF6ez9P1NlGMtXuTav4e0a709xp8c/nx/JA6fKtcmHxUoyXNuxV4e0jyst391aeEdMjtIr6SfXP
+LTy5PI/0Zl/369fGUpYiNqsbfM5acCOz8QeILqeB7q02Ru6PHIleJVwVGEWlLoenS0R3XiTQ7XVt
+KfyX3zW7pI8z/L+8/uV4eCxsqb5GtGKrEpeDbXWEWaRv30j7E+d/l+WujF8lWSjsYxgaWtaHY6pb
++Zc2rvOn76HZ/eX+7XJh8XKnPR+TOiEtDz3TNTtIddu3RE89JP8AUOn7r/gVfRYmnz01ImD1Ga7p
+upfaPtUyJ9l890+T7u6ilVio8q3RUo2lcpaZayTSv994Ef540rWpWtZCo1vfO402SGaf7Nq0HnOn
+yb3+b5a8SreGsTS9h/iqysLbTd8P+iwPH5fz/wB371PC4mdSpYL3Oa0NND+w3b6nvST7nyf7X92v
+Tq+0jK8SLmP46sfD8OhQXsciWusRoj2+z/Wzfw13ZZWxDqu/w/I8/MJc0bHl+oDVL+SS7n8yeSP/
+AFklfT02qeh47hz6mb14rWTa1MJPn0EpiCgAoAZQAUAFABQAUAFABQBs6Dr+p6PcSPp08kHnpsn2
+fxRVy4nDqa1OjB1dT1jQdK1zUEjvYYILq18vf+4m2/N/wKvlcTiKNCVpb/M+ig7o6PQkTUNVkeG1
+3PDH+8R/3XlsteXi/dha9jWEmy5qUocT2OofIJk+5s3eWv8ABtrsy7GOEOVGVWKDRoYNO/0KCTzr
+u6+/Anzbdv8Aer1cRkntIJX97+vM5oY9x/r/AIBzupQ6ndak9r/y3+4n/sq1wumsLp1O2GIdQgj0
+XVXk+yzwbPIfY/z/AHanEV4wMo0rG1daNsf7F5m954N8+/8A76rno4hT1N4xJkSxS3j0z788e/7n
+8NclTnvc2cinqNldpHaO8myB32R16eCxbjuZORHdeHZLq7+1fa08h/3Hl7P4l+6+xa9rF4uM4czP
+Pw1BxLU+nS+HreSe6kjef5PM/wBmKvOweInL4TatzGlpUfheO0nvbXY8aP8Av49/8LV59V1JT5Ut
+Pkay5Yq5pX2p2ek6da/ZfnjmTfA/3mXbX0mGoywkOZdf68zgdeNR2JfD50Kay/tq6n2XV07pPv8A
+l/1v8OyvXqJtXPObUWaVhFqOJPngTTf+WE/95ayo4pxdpFYjDKvEralNodvM83n77r/lmj/xNXOs
+XTqSc4/qX9XdOKiVx4x0qCGCF5He+nfyPIT/AGv4q9DCY1ODXU48TRkpKRSi8VXtnrEel3U+/ZP+
+/k2f8sq8v+0ZUNJ7f15HoV8NGqjq7DUIbqOR4vkRH2fP96vcw9eFSF4nzuJpSoP3RyW1rp0N1dJG
++z/XyR/7qfw06VKNONzadV1ZHnGi6vrniOa+ey3xxwSJHJ/wL7tfP4jBzqz5kevTqqlHUq642rWu
+rW9iPnvoY3g+T+KsMWp1pqJ24bERUbFvwxczaZ4fn1u1f9+l1sv7R/7v/wAXXrRj7KF0ctakpyuZ
+WtfEzxG/keR5cP8AB8n/AC03fxtTjjnc4p5cl/X/AATv/A/iwa1pscl1GlrImy1T/ppL/sV6kcQ7
+HFPDJHTtbxvPsdEf5Kbm3EypQR87+ILS7sb7VrWxj8xJJ3gu98H+oXzvkbzP9uvLafMerSskXmuf
+F9jpmm6XdR/uNPd720k/18Uuz5lp1qrbOilSio6Gt4NPw7eCS+8QTwXV9qHzyQeQ+22b+5W6cWjz
+5ykpaD/HepaVrdhaWXhuB0sbL/WfJtiWuHHVX0PRwa7sl+E+katpXiSSSOx+1faoP+P9/wDlnFXX
+ltV21MMwXZnTeIfBmhpdx3Vm7/bvMd3TfuX+89eNnE6VJ+9+p15ZiJy3PNNc028gkkkmj+Sbf/s1
+5VLFU5/CepiXO2h0XgZDqEyafex/uET93Js+avMzVumlOJcJs1tNu00zSr7T/Dz+dPPvS6ndP4ZH
+2rW+Dr1HVSa+L/Impyvc4fVbj7dq0lj5n+ieZs8uD91B8teo6bpRsFOfPEzxoN3ax73j/wBf/q6y
+9spNIinTszLvLO4kk8v/AFccn7z93XoUJWOZog+zyfu//IdaXuYyQwST2hkkSTZJ/wA8/wDYo9mn
+GzKgrHplig8T6KlsbVPLhg+S7f5V3f7KV8zVi8LNzXVnbCZS0zwZHq11Y2UMex4J9mp73+Xyl/55
+19nlyVjy8ZKyPZtA8OaZoVj/AGfp0eyDfv8An+b79erFK587N3ZR8R2ENnpsl1ZfuLrfvjkRHl3S
+/wC7UexsdCxLlucFafFzxPbXn9l6xpP+nSf6vy0dWVf+udL2jRaoKRzxluta1y71TzEguk+eSSD5
+YmaKvFxeN5Zcp7mFwcVTuS+HGjn8USXU6PG8+/7JAn8Usvy1rTqci5jkrUFJWN268L+FNMtLu1vX
+ea+jR3jk+6tfL0sdVq1dtL+R6kY8sdDDt7j4f6b4X2XO+6up4/8AUJ99W/3v4K+0bg6a7nhYj2sZ
+XX6FbwRo0+ovHOkf+iR7/Mk/3a8qthpVJanqxxDN7V7bwvo+jTp/aUF1fP8APHGn8Mrf/YV1Rw9O
+K1ZzVsQyvpFtYWQ03V7K3nS7kd3jk/5ZVx16jUUzelS0sWvElzd67qdpA8caRw/6z590sn/AqePx
+7UUv6/I1pYXW4pmu9MsZ/JtEhjuX8mO6f+6tfNVcJOo1Of6HemnsT+C4ESzu/tU6eR5m94/9la+o
+yzEKpHkl0PKzBNmdfXUl7PPe6dP9lS6/cQWm/a3lL/E9cFadqlzrp0/dLvh/w3HNqtol1IjwQfJ5
+CfxN/wCzV1RxutgqQ902fiC/kajYzmNE8j/Vv/FXoY6svsnlYCly/EQ+GpNc1O+gvUsd9inyTzz/
+ACu3+5UYKnKe5WOxahsdhNoukJBPvjSGB02T7P7tesoxSueTHEVGziLrwr4CtbT+18faoIX/AHcD
+/wDLRq5FCKfMelHETaOcjj0W9067j/49ZIJ/Pgj/ANn+4tfM42pKVQ9WlBIp6P4gez1L7VJB5+z9
+3U43COpTRrNpEFpqF1qOrR2sH7vz5/3cf8PzVf1aLWwliooteL9RfTrr7K99BdXSfJHBB8zVlQwM
+F00+Zosaa+h2vjjWtGg0i2gg0jTtnkSTv80//fNZYj2FGfPLWXzORe0Xuv8AQt+DvANpomoSSav5
+GozzybLSST725f7q172U4qWLfaP9ehx5hH2cbsZ4usZpNSnhmkggdPnnu9nzfN/DXHPAuEtTtpYi
+PQ57TNFuZI31R9Wk0uC1+SO7T70n/PNNteng61OL1OHGQnPYzrmG91bxRaWt1dya386JHJPv+z7v
++AV3Rqe9oc9XDKET1ZvAXh1tONr9njtXf/WSWvyV3zpe0jqeLTahI4vW/BGpQvYQWsf2qeaTy45P
++ecS/crjqYc9TD4s4HxVa6mmpPa6j5nnp/rJPvbk/wBmvNqLlZ2ufMedV3HAFAEmaISHzD45f+el
+E5WDmNXS7+3+x3FjdybLeT95H/v1gWUo7f8AeeX/AN+6tSGXNO1a80mXz7V9nnx7LiOoklONmRTx
+ThI9D8O+JoL+3kR498fl/v7Tf/FXiSpyw8rxPo4SVWJxHi/QINOu457X/jxvf3kCf88/9ivoTxXE
+5zFMwlEQSetEpdiIeZ1fhrxbd6TFcWMx8+0vo/L8z/nnXZh8S47nn4vCc/wnoHiTxZoWn6Jvgkt9
+Rkf5IID8+Nteiq7jE8uGGcpnjk89xdTvPJ+8kevDqzcpH0sY8kT0TwT4ZeDSbu6uoH/0pNlvIieb
+/wCOV5eIlFytc9OnCx1/hu7Eeo6bfaRBBNdTwf6RA/8Az1X726vIzZQpxvc9GGxpx6yNasNV0/UH
++zQTGZ4YJv8AV+Z/vV5FdSpzU6ezauac0Yowbv4o+C7rQ/st0k7zwImyBEO3z1T7+6uqGR11U5oP
+f8vvOf8AtCnF2/r8iGLxzf61ZpZaHo0juj70/wCeUfyVs8ojQftKst/66MccR7dWRheM9Iv73Sp9
+e1q+363BIkD2EabVjirvyytTpzVKlH3X/XUwxWClGNzU8NaD4tE8E9lcRp58HnpO6I26KpxGKpwj
+b/M6VQZek0zWrm7neSeebz/n/cfuk3N/sV5zxVNLoarDs6zQ9DsYtNgdIEtpoX/fSP8ANJ/vV41f
+Fz9pvft2OqKsb2jxRxaaiBESP+/srSnnVejK0X+X+Rz1sIqm5nXdm7CRHkTZ/Hs/u1+n5ZmscWuZ
+f1+CPicwyz6vo/6/ExtTaa30+SyW4Sfenzp/y3ZW/uVrjK/tfdib5XTnTV5HK+HY5JxBDazyQb/k
+8x6+PxEp4eV/6/U+tpQjUid3pejTpqjvNH+8hT55IE2rIv8AtrXhYrEzxMrR/r8jacVTiS6hDazW
+L/bYI4YHd4IJ0T7q19Tg61KhS9lV+L5/pc8nE4WftLrY5pdSj0WP+zvkntXd/wB5/FtrycVlnNP2
+qfumzqcy5VudMukprVhB58ezfB+4/wBnfXl4zF1qFXlnK/yX6HSo2ZW0bRo0kxBqs7/Zn/eWqfd3
+VlmGJi0rR37ml7BqXidtPuP+Ed1DY7vsdPvyfaIG/u1vluEpS/evb5mVWsQQ+J7a2u7S20h57VLl
+03pOn3W+7/3zXZjcFQfvrp6/5mMKp2Meo3trFdb5/OO93hnf/wBA/wCA18lOCnNNf15m9N6HkE1x
+v1a+3yIkd7O/7x02Lv8AvV9uoP2KFTep6FaX0klpHZXrp5Ece+Sf+FqyllyjjOXp/wDa+ppGrenc
+5YabqWi6t9tT/VzT7/7y08XyxqWfQyw0b6l2eea21X5I993O7zyf/EUYPD08RTubYh2Nq5uf7W8P
+z211Bsuofnkr56UHQr6Bh5XOetfECJY/2fNAkd1D+8juv4pIq9V0ZP4QPKru4n8R+I/LT/V79if7
+MX96vpsPGNCknI8py5p2LMniHUrHSb/wlp2yexmf9/ceR+/aJf8Aarpavqc0vd0MHWPDd3puyR5I
+543j8zzI63pVVPQwcOTUxa2OcKAGUAFABQAygAoAKACgB9AEmMUKorWZpych7n8C9eFxpF94eWOR
+76P/AEq0/u/N8rV4ePyylXd3+v8Amejh8QelapoqfZUmmke2vYIXj+1Q/K1fARxcvaWeque3FpnE
+a1JqsEEjv5F6k2yPz3+WVV/2K9/L60OexhWizT0KfTLK8kTSI98+z935/wB7/dr1MVmH1eq5dP8A
+gehlDDqTNu+8PRxrI8//AB/TfP8AuK+aqZ06tVztp/XkdkLUzB1W1vtCSOeaT9xe/Omz5vm/2qql
+auEpHOR+LNYGpRvNGjzP8kl1s/5ZNXq0sHGC0MJVbF6xtJN888EjvI7/ALiT/Z/iq5UNLm7Z0Ola
+cJtS2XXmfZUTz49/97+7WLnCK1MZSHXOl2/nxtpe97t3/eSf881rDAr2j9mweIUSvGY7meTTtXg3
+73dEnf5YPl/269ehk9WErQ/T/Mxlj4nTR+F/DiWMdo8CfZE2P5afe+Wvq6WFp043e5808XJvlK+j
+R+GbueSe1gSyuoZH8tP7y7KKVaNWVmaOnKmuYp654mMP/Ev09IHk2fv3f/lnWVesozHCg5K5tLfW
+OoWnkaXP877E8v8AhrkzGaqwtE7MImnY5vxpNaaTaJJBJ/pU3/HvG6btu3722uVYL6rFP+v1Oujj
+I1pM52xgkMkesahHs8/9/B/zy/75/grHEUasailHb5BOtGcWdbFqVpNJIJJLX+/A6J8y/wDfNdOM
+nCT9jLc4sMpIoG0ea7jm0iffdXUn7/Z/qPlrgwuHnSlyQN6049S38RddktEtLJJ/knTe+z+Jlr3s
+ZUfLyo4cFg2pamT4e1uPw/pk7/u0nvf3kH/2deDDFVYPl/yPWxmETiVta+IGjE/an0JHvn3/AOlv
+/e/2K92WJha/c8t4eVORyVjrupoJ/I8vy55N8kb/AHd1ZRnbR9TrnSbVxbywkk1u3uvtEE8c/wA/
+2dH+VZf7lZ1EoyLndm74i1vU7600nUYETS7u1kfyI4U/u/x11VMSoxOKeHbOk0Xx1qX9k32o3s9r
+vRESDz/l8xlT/Zrrw2KUkckcGzndS+IdvrWm3FlewQQWiR7/AOPczL/uVhUrpM1WHaMrV/G1re2c
+Gl6RB5Oj2sfyQP8Ae81v499ZYuqrm2DoyS1MSPULryILWSSP7JA7vbx/7Tf3q4qjlbQ6oSinqbdl
+441KysU0/TpII7GP/Wb03eY7feZt1bU6y6nPXwt9mdi3xbtIbGC10W18yf7j+f8A+hfJXWqq6GNP
+C/zM5aPxBdr4lf7Lcb45n3z/AMUUnz7n/wCA14uYYSNd+8epQ8i9rniyzvtWjgmgSaDen7z7q7q8
+p5bCj8P9fienGvyrUW+uLrz49Q+yolrN+5gCPs2/w1yU6kX7kteU0c0Sax4w0bQdWt7W1tN6WsGy
+dI/9VJLs2/PX0OBnCr+8S29TycTdvQqapd6HdabBqOnRol19yOOBH+8vzV5VWVSddp7HoYOnyo5m
+O8u4Jd8/mPvjfy99d+FUFLUipUsyBLC4nuJLHy5En/550qjsyJIyPs93/acaeX+4/wBX5n3q6INO
+Ji0adrYI9/HY3Un7zfskk8vdt/4DSScpaEYjQ7YXek6J4a/stJ/P1V59/mQP8se1/u1pi6EXHUWH
+nc6b4TX9g81/ZeX/AKd/r5J3/wC+a9PLlGxw5o7I9HVcmvVSjc+doyuyXY9ZI7HJdChJoenPfPev
+Aj3UybHnf723+7VciIcmctq/gJJ9btJNMgSC1f8A4/v7u3/Zrjr4KE3zHbRx0lTscl8UpYNP1jTb
+KCNP9FRPL/2Vauau4NcprRbkrmPrPi9bkyWsFgl1+4SD7fPv83/gNcdX2cVeP6nZThUjLX9DC1CC
+0S/t50tNiJHsuI5H/irig3Vdono1dI6nc6PYz6LpljrVrYv8jo93/DEqt/6FXbXwMqMbqV/l/wAE
+8nDV1JljxZp/hjxFdz3T6iiX2xPLgRPl2/8As9fPPG1+ayjf5o9ZUFJHOnwN4keCeZPkSD9xHBv+
+aTd/dr34SU6SMatTlZ0XhnwtdDUbuyuo/ss9lAm+Tfu3PXVUwSm0ZVsbyIfrCWF7H8kj3UGnps3w
+J+6Vf+Bferysyr01K0TXBybRzBu9+mz+X8li/wDrJ/us3+z/ALlKnUaj7qOmok2QaZqECXWy1gk1
+GT/lp5H3f+/jU5UuZmdOp7p0qJrN09jPpek2NlJv2JvutzNL/wABrmo4e8wqVPdHxWHxJn8STzC0
+sZ9keyeSd3aD5v4P96vocLgXT+L+vxPGxWL5l7ptTy/EWGD7MZNHtU2bPvv8tehKSWx58aTk9Th4
+NB8WXN95EepWM8e9/M3u/lebXlLGJy5T1ZULK5s6h4A8d+IbW0gutatUsYPn8iCP+KvWUIuNjzpY
+hxdjI1v4aXmhQfarrxD/ANc40g+avNzGnGOp14arKTMO00SC7n+y/wBtSQ/9dIEryZYtWPV9jJl/
+RfAdnc6tPDPd3bx2qPPI/wB3/VV2YetKa2M3SjE7HSvC9rLo1pdeHrCPfP8AO93Ps+X/AHN1UsJU
+b0X5GTx1OG/6l+58WaHayz6RYRvNqL/x/wAO7+Jq4Zww1Kl3l/28GHqVJzu/0MPTnm02ee5kdP8A
+ppd/62f/AHf7i1w4DHcju9EeliaCrKzOckivta1Od7GPfI+95I9+7av+0zV7EuectTnWHjHYz5Jt
+bgjksfM2QPGn2vf+9X5vu/7lc7oJS1HyS6Gn4H1iXw3PPNqljPdPPB/xKY0T5t1e7hoezV2ePik5
+Oxo6V8R/FCvPDdQQPcO7vHv3/u/9j/brOWYXdl/X4GbylyV/6/Mrx/FXXAXtbqzS63/8tI/3W2oq
+Y41eB5TmJrfVr67/ALRnjknknk/d/wBz/drzatfmO6hRPJq9o8kKAH0AHl0APjjoAsR/aP8A43JQ
+ASeZ5f8Az0/6aVmai28kkEnmR0AXtc1XU9Vjt/Pk8wQJsjrnoU1E2xFbmMWuxxOFSsKKImkS3b2n
+mRyfvP3n/POsajNokRtJTJWsZJGMpcxrW2lwQfY/Mk/0h5H8y3T53rCrVudNGNj0W+8canY6haf2
+DYTpY6dH+8gn+T966ffry3hIyjZnTTqOM22c6viiLUftHn/ZdHu/v/a087zWb/gFU8I4NNao3p4t
+WZl2EMmq63HaT38k9pv/AOWm9dyVvVl7OF0jNS5pHe2Ph6N7OdLK0SSys98jo/8Ad/3q+fq4t8+r
+1Z66jaJQ0nWta0u/36X/AAfvPs/3lWuirQjVj7xze0ZFd6pJqG97rZ++/wBf8n96inhlTXu9A9oy
+T4e+Kb/TpJNGkuPMgg/1aP8A88v9muzNabUbrYywE0pcrPXr24tJot/z2T+Rvj8mvJp5Gp0ueO/9
+eZm8Vatysn07/RUe1jfzJB87vN96vFrYCtOs1FXkvT9Wei68OXQ0buxjd/3Wzydn7yOu/LqNGjSk
+q/x/P9DjxFSTkrHOzu+nyXd35e/Z8/lvX0uRwjRpycfIMRSU53Zz48S6L9lkM13Al3s/eR7PnWve
+wFeM4WmeLjcE1K8Te+wCSawntYINkCJ5caV4mDydv3qm/wDXZnqVczjONl/X4F23exubqSG6gS1d
+P4/9mvnsZhHQrc62OnCzbhZD7xLBI49PT54PndI6vC4eOMrOa/r8iq9eVNJM84k8N3X2+O++ySTw
+O7wSW6f62L/gNfQLAzVFwX9amSxUJO7Ni51zWtBjj0+D9+jyfuEn/wBb5X+9WWGwlFVOeXx/P09D
+lxXPJHR2Gv2tlff2fe/JIib9/wDD+9/grg4iy+nL33v8/wDM68DTnynNR291q2v/ANoIk97s3p5n
+8Mar/cryPbU6NDkej9Tp5EiYWnl3126fvvsux54LlNv3f7tEU5Ud7E6lyHxHbQ2mx/kRP3yfxeW3
+3q4Hg253+Q60bmbpMlprvif+0Lq03J5e+P8A55f3d+2vXzPEyjQUY6Bho8pDp+u6No+qyRyO82h+
+Ynlxum/yH/3f7td+Eo/WI++rP+vQxxV4x0N7xD4mtJI7TULWSC90q9k8iPZ/y1lrtxWGq+z5FKy9
+ERltdX94ytdvLfV7SwgsvL+3TT+RHJ/FVUspjSp2X9fiZ1MW+bUbYm0NvJZTI+oaik/2WeeCf5WZ
+vu/xV4VTDT59Ed88RFxOY+JS2ml6fJZeY8F/8n7t/vf8BavdwuC9nI5sbXvA8/0+/ksrb/RZP9Lu
+v3Hl/wCxXbUoc7PJg7o7/wAP+DrvTdCu7qeDZJsSe4u5P7rf8skryq+Oc5/1/kepQw3KbHhvwpaa
+9YXU07+TaWSfO89ctXGOlK52STOW8TfC57W3uJrH/ljA8/lv/Eq/P/31XpLNIRmqd9/67HlVMD7p
+5iMg17d7RPLpw5JCUEDKACgAoAKACgAoAKAJN9KCuam34W8Q3eia1aahDJJ+5kR5Nny7l/u1zYvD
+c6Ez6cuPF2ja14djvtOu9gundLTz0/iX71fHUuHpUK9r+7/wPU9qjinJkNlbQTWkE11Bvn/5bwJ8
+yrXr5blMIYi99P8Ageo8Ti3EheK6vTBawWMCQWSfu5N+1vm/i3VrSwbrSv0J+uRTsWdG/tSPVp7X
+XZ38/wAj/QZ/+ekX/Af4q8OthI+35YbnS6sUrkGqLe3V/wDYo4E/c/cS9/5af7lPG4D2E7/1+ZnR
+xiqHP6tpunXUezellrFrA7vAn3ZNv3aywtdxd/snU4XM3T9Su57SOCD5ILX555Pus0rV6cqahrE2
+w1tmdh4cuftceb3zP9Y8EEj/AO0lelhMIsUrS/r8jyszxP1fVG2mhQW1pvef/S9/z7P4vnr0aeSU
+4W5t/n/meRUx8pol1HRIJrXZ9+1+/PA/8VepVglbscUJtO7MWTSbiBftOkSfu4PngtLr723/AGJK
+4qsr0r9TsUP3luhh6tqXiC1fy08iCO6fy49n+tX/AIDXiqc0r9T1+SG3QseHfD+sagbu91Hek91+
+7g8/7s0Vd7w8qkTir42MZGTqcV94W1F/7Pv0Tz0Tz4/9bUYKDoSKrJV4mVrt9d61b3et3U+/yPkj
+jT5d3/bOta0pTldlcvIa3h7xALj7Ja2Ue9PI8ieB/wDaT52riWNjSnqP2PtDPtDBq+vXdrHPBp/3
+57SRPu7lTbsqqNH2upDlyS0K15PqumPIiXf3N6eZBP8Auv8AxyiFGVOV0b1pxnHUoRWlxfW8Efmb
+7uP/AFkf+z/e3tXPCpKTdy6fuxEvta36TBp0cH79H3/a/wDlqy/3KUKEbak0p3kasWnfavBn2qD9
+/dWT/u/n3+Wv8e9Wr0asvbU+S+xxUZuEtDL0zTbe7tJ/MkdJ4JE8j/nl/wACavOnBRgegpqbuzS0
+O10K6tdZsrq7eCfyNlon3dzf79dOEpJQMsVWvMh0e/8AtemSXt7/AMwRPIjjT/lpL91N1GEwiU7i
+xVS8CUaZrviXTUe+ntbLSrXelpHvSJdy/e+Wuup7yuzmonJ6baPPfwWMHlu87/u9/wDerCnK7sza
+Z0vhDwNca1ql3Pqj/YrG1kfe8f8AF8/3I67oYdanLOs1IbY+B9V1qN7qyg8u0SfZG8/yq3z/AHVe
+uWnl61/r9TpnjWolrUfh5rmnyfvrT/RE2faJN6fxf7NTi6Spl4fEDNDisNFf9xB/aM91H5Hkfd27
+v9Z8/wDBTwdXmFiYc5Yfwt5EED2v76eB3SexR9/lrv8AlWvBr5hJVOR/CetTpNKxDfeF9de/tJL6
+SNJ7r5/Mf5fLWKt69WPs+fqKnFRdyO717ZYx2VrAm+1f93f/AMX36unPmjykcvvXKE8em3SX+o+f
+suvM2R2n95f726ub3k+VBb3rla0+12PlzwSeR9/y9n+1VzfRmsEkSwarqyXdvqL/AOlRwv8AJv8A
+mX/dpwgqepjVSZDf3cc093dPabPtT745P+edVzObCUOUy47t/tEbwSfOn/LSunkVjCTTNLQ9auNL
+urTUY44/PT545P8AnrF/deuinWdJ8qMMRFtHceJfCVpp0ia7dR/8S693zyQQ/wDLNn+ZY6yzKE0l
+KJGX4l02WfhUtjqmuz6o92m+1TZBab/mb/8AYr1sBCyPMzKV2euSHy499d/s7s87nsh6b9nz/foA
+WgDO17UJ9M0qe6hg8+dP9XHWVetyo6cPQ52eB6jrl9f66+oao8fn+Z5f7z7q/wCyteBXnzs+jw9P
+2aOgXR430fUtXvZI4bF/9ROibpZJf4V/2K56WEdJczNsTieaZhaPYOmq2myOCef/AF/zv8sar829
+6h4tQfMLFLmgejaJ8QdG1pfsGrWmxP8AlvP/AMsvl/vV9LQxaqLU+ar4Nwkcj4gk0a91y3/six8+
+x+5H/ckbf9+vFzOFnoe1hp+6al8fEEEkdkmpQQwfc8v/AF8sbf71eXOpPkVzf6qrmbeeEvEHnxyJ
+eX11Pdf6z5PmZf8Avqu3CVnOaNa9GNi9H4bE2k/ZNQurtIP+W9p5iRfN/wAArwZ5g1XtTX9fMKdK
+KRoW/hTTUsY/7L0WNHf/AFb3X71q7cTiqt7y/QVNRbNuDwlc3WmxzeZBBqW/93IifdVa9PC5VN0r
+9f68zmniYcxJ/ZA+1weTAiOj/c/6a1lhqddVbPb5Gs8RT5TdkHCaf8j+d/r9j7WWvqJRujwPbWRD
+qegQzadJBZRol0//AC3f5qxxOHi4Cw2Okmc9deF9D0mD/iYXyJB9/wAx68nG5dTk9P1/zPbpY6bM
+XTfiZpmneZZSWMjwJJsjng/iX+9XVhaqw8bHJi8F7bUzvFmqWmuRRzefPZQJ8kiP8y/N/drjxmZO
+TtH+vwPQwOE9ijm0n0myuI5rXZIkGz92/wDE3+9XI5OKuaS95l6bxtMd9jdfP/aDp9v2f63yF/g/
+4HXt0a6jE48VQ5zsLrxy1zpsdrp8D6fI/wAkECJ/yy/2WrHE5rCMbP8Ar8Dno5b/AF/TOP0K1kh1
+2STVLf8Asuxgj3z3E7/vf9lf+BVzYalGquaR0yrtkmq+JkvoJLHRIES1TfPPJ/s/9NXas3RU5cqN
+6VZozNDubvVLv+z7G7jtYL2TZdyfdWorzlSTmhyqXZq+IhBoun/2Dpc8D3d18l9P/rd3/Av+WdbZ
+dmEpQu/6/AyxVDmRZ8O2V9Y2O+6u3vb6Z9mm2j72ijZvl85q87GYyc58r2DDYNR2MTUNG1ODUrSC
+C/8A+JrPPs8xPux/9tK7cJW5VysvENo1p/h1qLvG8Fwk6eX+8k+7XNiswp30/X/IqjSsjofCHhq0
+0688j/j6/wCen91a68oftJ3Rz5nH3D5Yr2zyQoAKACgAoAfHcSR/6ugCXzJKg1Hxx+ZHJJ/c/wBZ
+QBd0a2ku5JI/3fmeX/y0k2VFSViaUOYq3ljJHH5n9x/Lop1SqlGxVFbRM4mlol3b2l5G91/x7/7H
+zVjURtE7r/hE7ueDzL2SDToLr955Ef72Voq8yWK1PWjgUbvhvT7CPyLXTrSPy503/b/vT/8Afdb0
+rz3OetDkOilXTo7qOyvoP3mz/j7/AIvm/v16kalJzt/mYVsJOME2Zum+HbO91nY9hG8D/wDLR/7s
+VeFnc6kIXp/p+p6WGpQ0uZPjfT9JtdSt106P+z7qH9xOn+98y/driwuMdamm3dESpcki1pWnX91p
+l9HDqTwzxo/2tIE+WSL/AGv7tY1FGM/hv8zpnV0KUEFppF/5HlyP5P8ArPuPQ+astB+0Rk3cs73H
+keX5cEnz/wDAa7KUXTjqP2iMq8077L4ksNSHyWk06J5ldFCXPRcHucdWlatzI9j0BLtrHM0/nQf8
+s69HI8O4Raex4+bytLmRvyQSW+mpe2siXVxGn+r/ANqnTzOjOrKEP4nz/wArDlQnSSbKthqTTXFp
+MsjwXb/6y0/hrxcxydYik2/4n9edjvpZnGLSf9fgXNTvoXl2TR4REf5/4ZNvzU+G8LKnhm5dysxq
+NxvE8d8KxTa1F4l1K2tE/fz74/M/5Z/eavVr4CVWUVHzMKeMVOneR33hTWNUubj+x57R0ntU2SXa
+fd3Kld9OpLltPc5JUoKVkbUNhLbr5cz75/nTz3+9trV4WnOHvHJLGVITsv0IpdOMn2Rt/l3Vr/q5
+6rL8upYaHu/r/mzLE5hOpV5X/X4FS1stct7+7tpJ3ngePfaXbp/y1qatOfPodznGNK7K0WjX+n3E
+dy9p/al28m+STft8v/d3VEMtUIWW/wDXmVHMXKVv6/IoXWhwSSXd1sn+0I++SN/usv8AHXj43Bxa
+5V8f9fI9zC41mxoN1fQx+XD5cMYfYjwfcZK+OzWpTqStbY7+Q1PEPz2L+T5KJMmx5H+9Xl4Jtz5W
+x6HP2uo2Oi6VqUfkJe3zps/7ZNXsqi5TFJXZzZsNWj/fPO9l8mxI3+WKTb/yxauuM435WNx5ULpk
+ken32zxZpr2sF0mz5/ni+b+6612RpU6lVezlp6f5nEr21Mye20/7fJ9hj8ixgkfyN/8Aqq7sTWV+
+RK5NHDqT0H+GFgi8SWh1ST7LAnz+ZP8Ac/76rty/mnozzM2qKGxueIdG0LTIp7qynjtUut7wSfw+
+R/st/wBdK7a6hT3ObBuVVHm/i+eS+Ed1dXfnTxx7I/M+8y1w0sRzyO6srxNf4e+FLCe3fW9Y/wCP
+WH/j3g/56Vx4rG+zlZHRhaF4nowm/tee7ktZESxm/cRwPvVV/ubUrg5EqfMejSRU0nS9SguJ7J0f
++zX/AOPvyP7q/wAdcEJe32CpWUTasdS06eL7EkLvA6eS87/N/s/xV5UsJU5+a/U1upRPBfG/hafw
+7rc9k+/yD+8tJH/iir9AwtZzpps+crxtI5uu04RlABQAygAoAKACgB9ACx0R0NR6UKpdgdv8N/Gy
++H9Zgj1TzJ9Gk/18H3/K/wCmqVSgmrS3MoznTR7xp/iHwdHayXul6lHdb5Pub/71QqFOhq/1JjUl
+VZsX11brdweQifYXT9+/+01eC+JaLlyw/X9YnpfUHJc39fmaM91a/u38xPk2eZ/utXpVFRpQ9st3
+6nL7zfKU9Tt9Nv8Ay3udn7n/AFcj/wB5vlp4ypTxEL0/1/UMJTdNnParBd6fG/2WDekEDp9uf5vN
+Vvl+9Xy1bJpyV3/X4nuRxmh57HeSaXdzwvBG7v8AJJv+b/gS16NGg4O0jN1G9Ud1o+leVpsj6pO8
+9o8iPafP+6k3fMj17+HoOKujza9T2rsy0PE0f2C7nvYJLKOB3SCREfb/ALFceMxE3e51UMNFlrw3
+ql0Jtnlz3tjdf8t/4Y2q8lrSmnz7f12OLMaSgdHdQafD5ep3WxET5PM/3q9WMot36HCoT26nF6tY
+eH9U1h7m9u/st3azp5Fo6bdy768WrK1W/Q9fl/d26mp4j1ZPDpjvin7i6+SOxT/Zr26leNOJ4lLB
+yqyOK1XxNaXFvq0CWkkD6h8/nz/62Nf7i14dTGqTPfpYV00ZvhCPfN/oUcc98m9449m5tq/7NVNy
+jHU1nHmR2uh+DgNFTz4HSe6d3nkT+6tOnl8a0bv+vxOCpivZEegeDjbmS9ngREuoHgggf+833N1V
+hMDU5bk180pxev6/5GdaaVqng+K7uprFLqOZET5/mX5q196nuOVSNZe6c4kF3NdWl1p0Ec087/u7
+FE3f99LXl4apzTPRr+7E0F0ORNG1bW9Uje1voZ/IjgTZ/wAtf9iuutQ9087DTvIboWl6y1pJ+7nj
+3weRB5CfL8397bXkQjed4Pf+up6E6Kgrs6XQvtei6E9lqloiIm954JvvSf7Va/2i8PPkmt/66Jkq
+k5rQ898Z2ZkngvdOsXsrG6gR0j2P/wChV6tSk4nFGNzG0ifU7W/ktUn2R6j8kkH3VbZ/erGc3DU6
+FTvodR4y0LXUefUZrH7LaRxp+7j+WKPcm2tK93qjCicdB5fmR+Xb77usoy5tEbSPQLttS17wLpL6
+RBsS1neCe0g/1skqf8tWr1UmoXOGdZORkSTvZT2+nXv275Pnu7R3+633v3SVzqs1Ox1TgnEfP42u
+5tV/tG9gjupPI8jy9/y/3VfbXJipuaNIYflNF/D7+IXjvtIk/gRPsn3W8/8Ajrx5Yz2LO6EDpn8O
+XXh8Wk03yak/yeYj/um3Pt+eni8vkqfmjeniuZ2Lhu7HT76xstXj/d3u/wA/f92vMymsnUvL4UPG
+R0uefeOoI4dVvp4PIjT/AF8EcP8Aql216WExCq6ou3uXKGgpPBdWhgjT7X/t/Mu6Wrdf2cuYLe7c
+1JbbUp/389jvtUjdPLRNqq1c9TFwnK46uGaJdJij/wCEegjttNd9S89/9L37YvlrbE42CjZmMcO2
+ZXi288Pw6amladJ9q1aeNJ7u7/5ZQfe8yKvbjSjY891ZPcs+EPhve6tZxxp/oUD/AOsu5/8Aaqo4
+VzZk8TGO5U13SrrSJ/sV1af9vH/PRVf+CuWphJwep30qynE17W1sNe0PWrmbVruB7KBP9E+8u37s
+apXbBtrU86ckpGP8P9O8IJHd/wDCQ372twkkElp5G/zfkf5vmrow9SyOfE0bs930XXtG1fTZE06f
+z44ZPIk3vub79d1CpdnnYmjZGtPfJA7p/cTfO/8ADGv+1TMBmm6rY6hafarWTfau+yOT/doAqahP
+o2q79L+1p5/35I0dPNoqYfnLp4r2bOO1v4Q6DLHGll573Xmb3+fd/wAC2V51TBqJ6dLG855/aW2p
+2WpyaXJ5/lvJskgf5V+SvGrzmnys9hUOpTnje1nntfM+Tf8AvP8Aa21z8sNmdCV9BLe61O1k+y2s
+e+S6k8ySP+9/d3V0U6jWxhjqakzuLfRdVsdFd7qDZJdfPv8Avbv9lf7taSqdzKNKyDSoL61tE/dv
+580eyCT5PvNXlRxcJxaOiadzr9C0e4n+e5k2PAn9/c1Rw9arKTucmLk7Ex06yudSSHyN6J89dOWx
+U6+xnXnKMTdubFCvySeTH/H/ALtfRZnl9Kpv+v8Amedhq0nIgstSjeeSFI/3ECffriyzHzqt9jux
+WA5WOggkeaSaZE2P/qNle5Rqc68zxsZ7qIZrDy7nfDao+/8A17/xLt+7sq5q6CMLIkv7JvsPlwye
+SifPvrkxeHk4aG2EqwTPOPE9vb6pBvR0nng3pHvr5OhGpGWr/I+mtHoc9B4au9Ot4729+Tz/APj0
+j/iklX+HbXvPDOpETmkJcaVrOvT8/wCr8z955fyxV87UqLDytI6Y1eaJBHpuk2U/k2sf9o6kj7I4
+/vQbq9NSVSNzki7M1rfwTafb55NUn8m7ePfPO/8Ae/urXLRU5SswjIi/tK3gSSPS9iPAn7uedPvK
+v9ysMTgOadmdEaqiZGn6Q91HJqmqSbI3k/d3b/8ALSWu2UZW9056STIbuB5ruOC1t40gn/54fJuS
+ow9VwepvKKRpW8mi2uhT2unQTvdTT/v53T7sS/wq9d08VGVGzOWMPeNDR/COkxwf2pqkc6Ikfnzx
+wf3f9+vJhiYqSgjprO0R2oX93fR/JaSWVpdJ+42PuupF/g/64x162YU4x0W55+BqtvUb4c8PjfJP
+J+/voPktIN/8Tfw/7tfPV61lyrc9ebVj0TStOa301PtUf+lbP3/+9XiVZU4S/wCHOeM9B1jZ2kB/
+cV9twz7z0PIzetaB8U17pwhQAUAFABQAUALSuO4+O4kjouxe0aHxXEkcnmR/JJTqxuOj7pZl1iSe
+Wd3T93P/AKxKxjSsbyq3Kf7urIJP9Hf/AGNlFgJIdRu4D+7ndNlKVBT3Lp1eXY7vwj4ygk1ZINUk
++xQO/wC7kg+VY5f/ALKvLrYZw1iepRxN9z1nzRcX7vJB8nl/8ff8LJXbk1SdXWRxZ/KLmkMt4ntN
+RvoLL/RbryP3H8as33q8rOM0nSqWX9fgevhsIuRM821KITal5d9HIl35/wC/3/xbarnk4mdOjFDN
+T8TC01p0g8yC0dPLk/vfNSw9FtBUcUSQPeefG9r+/k2fwVz+4tzaUW0aF1OXk2T6b5F9Ps+5/s1E
+pKfwiowcWZ/i6OeTRJNm+DyXSfZJ/eWt8BGPOk+zM8VQvEseGfElxJPaTmR3T5PMgR6vFVJRlJro
+ZUaacbHsGgTWOrWrum+yy+yNH/ir5nEY2X15Vnvp+Vv60NlhrU+T+tzE0ttMuJf7Qkn2PA/kT/8A
+TP59tfX0sWpTVar/AF9xx18NenyEev2Y1C9+y2k88DvveO7/AIdq/wAUf+9WOGxP1vFXiv6t8hYm
+ao0LHJ/CO0SLRb+aSf8A1l9s8j+95X3q9/65GlU5Js8r6nKrRuen2SxRK80P+sf+5/FXlZ7VliaN
+qH9ffY1wFGVCykNnuoLhtn/LRPv1pwtGtCHLU/T9DLP2p2sJkivpuS54PM4j9+yPf/cqXTSH7e5z
+aNGF+3Nqzwvqjp/Zqf8A2FYVZSvqelhpOpDmiQeQTdeRDO8yf8xL5/NX/gNeXjKsEtT6DL3KcbSG
+yX1xayXHkRvBYQf6id/m3bv7teDiMni5Oov6/E76c248ptWtlo91aQXTv53mR+TP577vvf3a4Mox
+CeJ5ZaGONw75PdOb8T6bpttbT2vlv9rtf3lhP/e3P/y0r3MXQpUtP8y8LKdRCafqaf8ACKwXU+ya
+CaN7X+9LAy/391dFPCQUOY44VZurym1puuaTqGj2mjSeXevO/wC8R/miX/vqvkFQVCt7WR60tTkN
+a0m00i/nh0q48iRH/wBHtHTzYPK/4FXs0Mz9/wBpDb+vIweFuWbW51bToJL3UfD323TXg2efB/qv
+K/2kr3cJRgtUjwswr3ZwHxE8RaLqV1HaeHd6aNBH/q/+WXmt/cT+Cuuo+bY5VG6M7w7pB1+88u6v
+0tbe1jd/Mf8A2f8AlnGtcckos7Xo7I9e0/8AsOXw1Haj9xJa7Ej3v97dXk5hOlJab/M9ehCcFczN
+MsLqe7j+xfO/8Gz+KvGxNaMYLmVjtpx0PWdOtZrXRXup/wDj7/j+SuHLMxoRxF2vz7HBi6V2WdIt
+7J7WeHaiPP8APPs+T5q8TGZjiJzvJ/gv8jujI5r4ifCu08S2OLbZbajD/qJP4f8AdruyzPp0qiUl
+dP8ArsYVVzHy5qun3Fjfz2N1Hsngk8uSP/aWv02lI+erQKI61rIyhoJTJGUAFABQAUAFAD46AH0A
+BqZbhUO98A6Nd6/Z3cFrHAj6X/pX2h38pm3/AC+XXNitjeiet6TrOjRwRvB5+oSR/ckn+WLzf7k3
++3Xl4lYWi010v/MdcHNI35EM7zz2t350myPz4E+7GrfNXPi8PGrBzpP3nb+tTaFSaLWlQ2jwvHcu
+l1D9/wC5/wAta9jLKcfYXfQ8/MalqlkUfHWr38ElppNlBJ5E/wDy0g+8392OvPxGPdSfLD+vwOjC
+YV/Ezhp7Owh899Xjee+undJI/utBt/iqa1R/a3OuhS5ti5oEt9cRyTJdolpp+x445/m3fw/LW2Fr
+custicVhObY63RvFP9u6lBbPBsgf9xd7/mikrsWYTlH3v6/A5KmFdN3Nie0tNA1LzkvkSxf5/I/3
+a8/L8fGnWbZpOj7VWOY12TUvEM7jTPPex8z95v8A9UtdlfD+0kpw2FGrbSW5izzRza1Hewzuj6Xs
+8+Sf975kq/8APOsK+KamlDc644VLWWwnjG21G8ktL2aee6gn/jf7qt/dqXXnVfvGdDDwpP3SzoXh
+qPUNAv8AU75POf5/IjT+7F9+vQhhbUtDNYtc+pp/C/wxrGn6z/aF1Yx/Ybq1/cXf8a/7NdlClY4c
+VUjNHpaRDNdrR47ppMjlso5ngf7nkvvqZq7NqU+VD7m3SeGSB/uOmz/vqqqRsi6OIbZwuo+GrPwh
+o93q+nu811s8n/d81/8AWV588OqMfdO+FdVpe8ed2mmazqeo/Zfnn1XzN8kl0/3Yl+9v3V5UVOpL
+U9eSVOPunT6n4qksNDj0mynR3jn/AH93A/zbP9h61p1PYUbQOOcJVZ3kQ+ILQPB/pTvdarPOn2uR
+96tHFs+5Xl1MVJxvU/r7jspUknZE0etyaXd/2Dq8H2rR5/ktJJ0/2K9yFVtHnxos8uu7u/j/AH//
+ADwkSSOP/crmjNc2p0xhY6PxD8QL690XSUuo3edP3j+f/qp1/wCWddNSRw+xOZtNRtH17+1NU8yP
+Y/n/AGe12RfP/copyD2J1vhbwnrOr6rBqlrHJZWk8/nxxx/6jb/eranTcnceJldWOi8b6/oWr293
+daLY+Zd6XOiT6rB/y0+Tay0VJqDFhqN0ReC/BWhXXg3+0543nup38lP+eUbN/FXLJJULv+tTqhU/
+eFvUYJvDHhiBNO3pO91vkvv4v+ua1wU6yqU7RO+nBSqDP+Egn1fUrTS43keD/lpI/wA25v71fP1s
+O+W50RikZfiDTbCB55/t32qf/lnBv3NW+HTUbnRGSRkyWf8AaMUnn73j/wBZJ5f92JK9DBezi2l+
+pjiIN0zpbCw0ebxHJawfv4JtnkT/AHWj2fN8lcOY1JtNRFh4NUzrZ7JP7MntrOfyE8h3+1P91f4v
+vV83gqTrVbyNZ1eVHjBk8Q6/cfZdOkeaP/lpcJ8q/N/dr7CNOlQjd/qcU5c5Wl0qPR777LNGjvBI
+kk/8VduExMqkr9CcdhUlodx4y+Lmo3Wy18L/AOhWqIiRzon71q9b67raO55dHCJvU5SPWNSOuWj+
+NZJ7pLXZ5+//AFvlf7tYu85aj9mqUbxPX/8AhCtG8Q+EfL0Xfpfnuj+Y6bW2r/C1dc8KrHHTzB82
+v9fgY+qfB/wnp9/psj6lPBJM6QSQfxXLfxbaVWi2jSjWUZCafoFn4V8TSTtI9lo6fP57/wDLT/vi
+pw1FxZ1YquqkTb1jxZoF94V1W7toHe0m3weZ/qvOVf8AloldFSpCB5lPCzmxlj4u8I2PhXTbaNN+
++ONILT/Wt/vyVEMUmVPBOLuS3Xh1rPVo9Xgk07T0h+f5020L3dS+dVGVLS58RzX8919qT99/y9wf
+v/l/hjT+7XzeO4gdGpb+vyPSw+Xp/wBf8E5zXHnvPLgeREu4ZP3n8Kt/9lSq4+GI1X9fgdVHD+wJ
+vDfhORJJNRutjvD88do/73zP+2dZU6TvdM1qTlIn0tNFutdk8mwea6eP/X7P73+ylVh6jlU5LaE1
+5Ll1Oxt3W1ngsryB7pP+en8K/wDAa97F1qcYcklp8zyKMU5aC6olhM8bpHs8mvjMZmdOdTlS/P8A
+yPWwlD2cS74fPn6VJsn3z/OiSf3a+vyzDrkueHjqici9Y6Slk+9386d0/eSPXZhcEqRjjMW2iaWN
+J49j/crtqU1I4KWJZDBY2sMciRx/frhlgkj0njnIx/E/idNGTTYU+d710jjk/urvrelaBNpSNye+
+tYZI0nnRHf7iO9aaHGr3OH8Z6zPNqv8AZ9rI/mbPJ8j7qszfxNXDXPXwuxsWOjWWn6VaTa19l2af
+86T/AHV+b+9Xe4xSPM+sTkcd4/kg1eKDWp/k0qDeljHG+6W73f7H8FcWIScT0sPOy1OY0XWZ75LT
+QbWNLK0jf95O77/l/u140cHTm+Z/qeg5y5tTtvCujxx6lJA8GyT78d393dXg4rGKnVtA7ZWcTJ8b
+pfG+knn3/YYH2een3Wlr2cJTqVo+0qfp+hnSnB/CVNC02xuruOS9j+RP9Raf3v7m+s1jY0pXZvKl
+JljWPDd3dz79Qk2O6b4IIE/dR/8AAKwhjniG2v6/AzjTsMtfDN8HgdLD93On7ve9efXxiimpHRGS
+N1dH0bToHnm8xLGH55I/vSyS/wBxa9jKcD7WPtJnkYzFuMrI057LUfENnGkif2fpSf6iB/vSL/fl
+rhzSpTi9P1OqhJuN2M1jR9KsNNggf53un/eTp95lWt8uxaqVLTMqkXyaDLeCDTJ43tbSCCD7kkjv
+u/8AH69LEypufKv1OWkpNGjfa1DZOn9oTp5E3+r2fNXVWwFGTvf8/wDMxp16ij/wwWXizRb2XybJ
+98//ADzf903/AI/Xo0XSpxsv1PNqTq81/wDI+Lqk6AoAKACgAoAKAFHWqk7BDVm7ZeDtZutN/tFE
+TyP9t9rVyTx0YuzO6GE5kMufCeuwQPdvaSeRH/rJE/hqqdW4VsPYzRbSP/yzetpSMI07j/sdx/zw
+k/791diQk0+8j/1lvIn/AACiwFfy5I6ctdiYw5dxahWW5rvsbWleLvE2mR7bO+kRE6J95f8Ax6rp
+e5pEwr4Z1bSfQ3/+Fq6vNcRzX1vHNJH/AMtI/wB01eZWyznnzS/r8T0449wtElHi/S76/jup5Nju
+/wC8jf8A+KrF0JI3p4qLNTxj9nvoNNvdOkjuvIdE8iDY+7zf/H6nDyak0FSUWXrObUrKwtHutlr+
+/dI4HTZK23+9TrZUqsPd/r8TpjjU2at/reh3scf7mS1voZP9E+T5vNSvHwmWVoTav+X+Y62MUUal
+zf8Ah7Ubee0mTyJJ7V557ef91/rU+X/vivdjlbbio7r+u55VfM7xt/X5HA+CIEu9HtJP+PX+zp38
++/T73+xUVqDU5SexvhZtxuen3PjPRo5/sTvvhuk2b0T5dy/3f9+viaWV1anv7O/kenXq21MqexSy
+u5Lawn8+0upP39o/3t9fVUcL7KHNW+H+uxyKtd3NW7vbTSdP1LUX/wBKdIP3H/fFcOHxlShjOVLf
+/L5l47DqrRucx8LL2007wi97fbP9KupPI+f5vmrrx9CFTFpzfT9PIywicaNjqbcRW2oXX2Wd0geP
+ejv80Tf7ldXDNblckc+b0pymkiW+0mKC4/4SC2n2J5e/y3/iavHlndWWJlBd/L/I9SOCpqCczIt/
+iFFBF5+qeXBG+x4I9/zMj/xV9hhMXJ7ny+MwCX9f8E1ofENvq/8Ao2lp9q+1Rukc7ukUX/Ad3367
+qmLSOCjg0zOufDlzexWkeuTpBHZfJHs/i/3GrmcpN6nsYerTjC0Cazndrr7FbWP+lPJ5F38n/LL+
+/Xz+b1oo9vAR5Y3Zparos+ZHeCPyP9Qkab/u/wB7bUyw9aSuvh+Rz08YlKxWm0fUbXR47rS33o/z
+yRv/AHf9mpqZTGUbw+L+u7NqWOUZ2ZctbiTUvDoa6gjfyfvxp/dqXhJVaXOxVa7w9bk7nHeKLuDT
+mjtbGPZ56I8//XX+Gut1eWhymUG1Wv8A1sP0m+jneR9OgtYJ0g8+Te+35l+/s3fxPXi16LnC0jvj
+oa3h+4g13UbS5uYPI8venkf61ZGrzMdL2NLlh/X3m6q2J/if4otPDHhq40+yj/0u9R4PL/urLX0m
+Q5vPER1X9fcfN4/DWZ4V4R8M3fiLWrfToEkeN/8Aj4kj/hi/ir3eb3tTnUbI9HuvBel6fdz2UdvP
+Bd2v+o1OD+7/ALSVxYzEKm+VnrUYKorotXFmtqiXsGp3d1Y/8tLT5Ipfl+XzIv72yueOHpW5pfqU
+/aydl+h1HgbSoPOe9tdVQ2tsn7+3dNs6v/wKvnM5jP6utDpw9Y6fUtcGl2aXU0/7v598D/xLXi5X
+SXtL2HXlc5vSfiNoVtBPbPDO802/9+n95v4a9HHZT7SqpQen9d2KTsxtvr891Yvpmoai/wAkLuj7
+Pu/9tazxNCdOSsuvc3pRueA+JLPfObqP95/z0r7fC1Oh42Jgc7XpI8phQIKAGUAPoAZQA+gAoAfQ
+AGpluFQ1vD2pyadqcE0cn7tJP3kf8LJ/tVz4lXTN6R9Bppum6nY/6BOlrdTfPPaI+1blP8/cavkc
+NampOt0/roe3N2L/AIXn029tXsr27dLpH+yzx/dlkiX5k+WujB4W9RTg/dZjUqNI6mKwtLbT500m
+DyXd/wB3sr3a+Npui4w7eZwUaPNUuzL1GG7m1KC9vYEhg0/55HT/AJaV8blmK9lJyZ7FR82iG+K9
+F/tCP7ZbQJdJMn8Hyt/10r7DMcBKs+eP9fieNl+O5PdZy/gO/srUXdlqHlpv+5/11r5vMKdSrH2c
+d0e45cnvMbNss9bkg0+ef5J0+yQf8st38avWmFxM6cP3n9fcaKKqxudDqPla15iWv7l7JN99I/8A
+49Xo0KVOvHmj+p5yl7OVjM0K0uoNNnn8ie60e9+R/I+823+7XqUqUqdPTYxnKMtXua99pHhGHXbS
+CSB4Z9m9/wDnltVN3zV1U6EH7y3OSWJlLR7Gzcous6Gn9mbJ44XTy0T5fmWtsTyTiuU5cPzw+I3L
+KygtreOCBNiffkT/AGm+9XZCHJFXOCrUcqmhZSJY49ifJHWcJBKlJHM+JfiDoehT/ZZP9Nvk/wBf
+BB9+P/eqalax1UMG5mVH8Uo9Qt4/7IsXe689Engnfbtg/wCem77lYU692aywPKjU8c69qOkaUk6J
+sSb5PPT/AJYy1WLrWRrgMMrnKad8WtRupbS1jggf76Xc87+VFJ/d/wB2uOOaQS1/r8DSWWty93+v
+xOavtRLeIL6a1u/sser/AD3cifN5f8Xl15U8c5y909eGGcI+8aCeFtZ+3xp5H2qweP8AgT5lX/a/
+2qzg5YiN4bf13Iq11B6notv4OsYtLn+0yefO+x0u5/8AWqv9yvVqRpqjaf8AX3HHTk5z9084+It2
+LoJazwSQ/Yk2Ryf3q8zCY1TVj13RRwqW/mSfP8+z5/8AgFOdNt6GEoGbcXFp5klrJJPPHB/x4eY/
+3Yv4f/H69Cozzucnt7i0/syd0sN/n7E+1v8A8s5fvfJ/wCimxc4+w1a/sk/0Wd/LeN4JI0fb8rUU
+8U4oPZczOi8Lanpmm+BdVtXu47W+eeF44PvNcqv8FOc1UjcOb2bsd18IC76ddJeun9lO6fZI9/3Z
+9+6uvD0o1KFpHPiaqjUO38Q+F7G90S7tYbRHnf8A1G//AJ60v7OjSp3j/X4kYfGP2h5/d+DPEeiy
+JNZJ5zvHs8xPvbv9mvnVhZuXIe7LHwI4PA2sWuu6ba3qfPc/v5P4tv8AvVrHLpc3L/X5nPLM4f1/
+wxd8QWFpDdXdla+Qm90soI0/5bNO+968pYaXtmos7vrqdMwdT1zTfCl7O88Dx6rC7pBAn3aFltep
+PlX6f5h9dSpmHrOuazrdpaI7+Rpvl+ZHpsD/AHv+u9dnsqdF6fqNQ5yhbzz2lo6WrvB9qk+eNPub
+Vq6sYTVyvY8pckjtbHw7fz30ckeqybET/rlL/FU4er71oilFrc5qxnt4J7ScW++S1ff9/wC9tr1o
+SjTd+p5laDex7U+o+EdZmjuodGjvdVvYE8uR43b95P8AK/8A3xXW66lLQ5I03CPvHX+GNJutA8M+
+RqF291PBveef52/ztr01F8p5MkpS0PGrLxfrt9qMmo6jH/aFppDp5F/s8pli87/2euCWYK/9f5Hr
+UcsbV/6/MteI/iDq2tWl/H5CWtpdJ5Eez/W71olj0l/X+RpSy53/AK/zMzw/pfjSUabpd18mlXv+
+o89P3XlL9+sqdLn3M6td04nUxad4f8OCBIJ/7a1WCff5Cf6pVq5yhSFTqSqq5ta7dTzWCaLr1jGk
+F0iT70erx+IVOJhg8C0x+kxTpBBa6Laf2fHD8n2t/ustfn8qaxNb+v8AgH0NNOCN+18IabbQfabn
+9/dP/wAtHT+Fq9TEZRVw9C/+X+bOCWYe0nb+vyMP+yNSu9Xe20n5LXY/2ud9+1XapyLBzrxd2d2K
+xcaUDRs7q28OxzxzQJ5nyJ5if3q7sPi6lCtySWvyOHEUZVo6DPEF/p2pIkZkdJIf7j16GY42Nb3L
+anPgsK6UtSl4dguG1i1L3c72r/P5bpui/wC+q5cBlc3Lmkv6+87cTibQO+SJFb5I9n+5X1OsY2Pk
+5VeebJNoNLWRp7RSB4xS5GhqyOT+IN7qNr4fkeyn8l/+W8mzc3lUNto3oRVzkWe6vfD+jPdR74E3
+pHI6fvflevLxF0z3aKjYyLXxE6azBvtE/cb/AN4/zVlTxDMJ4ZGZrniLxJq8kdrdSR+Qkn+sRNrV
+U8QaUsMT6rYapPptpPM8/wDZs/yfZPnby9tW1LlFBQlsaVrZ+G7LSY0mjgR9U+SOd38/yYtn3/8A
+fqqN2tTKrS7Gv4d+GNk5/tCO+k2f8sIHh2/7rfNWkstclp/X4kV80i3p/X4HcQ2j2thBvjR54f8A
+ln/eaubC5LCnO8v6/E562Yaf1/kcxr2iajq99HHcyPDAn7zy3+ZY6wzOrKMvZrY9HAVIoy5rLw/o
+L3V0+q750+S0k+9/wKtKGEpSjaW/zN8Xi5rY6LRbiC6g8+Ofe90myOT/AGa+ahS9nJxidcKnMM0r
+TvEEVv8AZoZINnmPsu3+ZlX/AHa9fB5Kqkbz/r8TycdivZmzJpM8cL7Nl1fOmzz50+X/AICte7DD
+OMeRHmvFJSuyfSLWa2sPL1CTz5/+Wm/7u2uH+xIc3vf1+J1VMyUo2X9fgZU2su9y8N7aeSj/APHp
+Hs/hrw84wLVX3P6+9nqYOsvZ6j7m0t3RFngdErihl1SlLnk/y/zNYV4lK28O6Fc2t3ZO/n3T/Ps3
+/vY/7u2vqsJhqc1ozhr11F2PF9eSfStSkR/9Fng/5Zyfe3LWjpSi7I1UlY8fwa7Oc8fkCkNMSmIK
+ACgAoAlhikkk2JUyZtRp2Z6FoGtzvaR2t188bp5Ef8Pl14OLo63Pao1LI0be8ukv5PPn+/H5Ekif
+88qMNVUEbPU2dFlEGkzwWscd1vdPMk2fdrohhvbMwliPZmnbP5drbvdfJPdfu/3afKzf3a+owM7U
+rHzGZJ16ly5qR03UdL8lPnkn+SCP+JW/vf8AAK6KLUtDy3SdGVzF1Xws1xaGG/jj1Qx/JHd7Nt1G
+v/Afv1w1qDjTdSO56WBzJVq3JP8Ar8CrF8LvCl0kk8bv9l+5Hdxv8u7/AHa8SnUmqLnU/rXyPoY4
+aDnaJkat8EriEyLa6vB/uT/L/wCPV20JwnS9ojylCftPZswtW+FHi3TptqQR3UfaSB91bUIuUedD
+T/eezf8AXU5W70u/tJPLu4JIH/246bbZCikQxGSOTfH+7eP+Os3E1Ui3Hrep+fHPNPJP5D744533
+rVQpJCTfKeoaT8WPDeoLB/bdj9luoX3x3EfzRbq7YVUkebyS5jqNN8S+FLxJ4NR1O0mSP/USSOn+
+ol/g/wCAU3FMwTkmcP4Ai00W9+PPTy7W7/4996bpIv8AY3V5mIwamz1sNjXBHpEGgaTJo7/P58bp
+vjnT/Z+Zf++K3WCjGGhDzOUpq/8AX4HLaDqc8mqyXUHz3fmfvI/+mqV8ljYz59D62hXjKGpH8S/H
+GmPot3pcCOmpTyeRPHJ8rQ/369TAqU43keJXUehzuj+L4Y/C1polppk91Oj75J/4PNroxFOm4+8a
+YavVjt+hPInxCl8u1eD7DGnz/P8Aw151COGu2tfvO+pKvVfb7jV1DQPEuqT2jeL9Wn+yXXyQeX8k
+X/fNGWYihKo4Q0fzOPFUp01rqdLp/wAJPAzW/nl572OT/V/P/D/er2qNOVTY5sTiI01qVbj4Y+G5
+bnZpE93Y31rsfzPMrF+0pVNP0E3TrU9f1Jr/AE3x9psH+leX4l01P7n7q8j/ANpdtepiYuSPHwjU
+GbGmfEHw1O8H9nSOl3dSeRJG/wA08bf3nryZYNXPajjGlodCkEzSufP+T/lvH/vf3KrLMLUo1Wpf
+oTmVanWpqUf1JLy70+zjgjuZPIjf5I69WcKdNNv9TzKEqtT3V+hS1SSPStOu3MbvavA/7xP4a45Y
+a0bndTxntJanklul358kkEck/wB/zP4v3VfOShKc2j3lUtHQ6d9JsUt9LukfzvtnzvP91a8P207y
+T0sdNOVonSam9hh00WBPtMMiTRiH/Yrho87q3ezCck4nlHxg8YQa3f2dpa/6uBN877PvTtX2WR4a
+VHDKL/rU+bxy55o7j4K6Rd6NZC6ng/d6hH5nn7P4a5MfmSw+JjJ7f15HcqN4Hea1dWPnRwp/x9Ps
+eOf+9t/5Z16lTNaWJppU/wBf1SMcNg5Q+I8+fVfB0uu/8TC/gSD55ruDzPl81/vJW+Cw2t5EYvFK
+Gxb8SfFP4dx2Mlra+fqM+zZG8CeV937vz121qEZRtI8uFadzzzxJ8UbzV444BZ7IIP8AVySSfN/w
+KvGhldOErr9f8z1oY2ol/wAMczB4p1mC489H2SJ/q67/AKtBsznjar6fkdO3xc8RTWL2b2Fi6v8A
+PJIIfm3N8teXVyii583X5/5mtLGVV/SOZ/t69/5aRxyV6EqKlqiY4ufUxtSMBk8yCPZG/wDyz/2q
+6aKlsclapzFTFaxjoY+zsFKMbsa0EpiGUAPoAKAGUAPoAKAHx0Aen/DXxd5NhPpXkJNdQfvrWf8A
+i/3K+azbLud8x6+X4g39Tvp5L601SOSRL6D/AFjp8stefh/cXKeniIc502karrMP9mvqF291pUz7
+/Msn/ex/70VdtXB0qcV/wTzazcmeg3WtaFfwun26OFH/AL/7pv8Ax+uFxhVxUeXp/kVGo4IyZ9Rv
+hqlp+4dIPP8AIgkT7u2vcnGvPEpvb5djitGFOyM2fwZD/wAJFHD59r9lefz5JN/7/wDveV5ddVTL
+ZSq3b/q3qV9ekqdkJfaBdHXJ73UE8lE+eD+622vAxVJ0qiitj1Y1lUhqbEmraVcGSCH797ap9ukg
++by//sq9/E5jClBJb/15HhrAOpN3/r8Td0PTo9PsEggffa/fg/2a9HBv3Tmx07lXxJ4eg1q0kg+T
+z4fngn/2v7taYqN4mODr2NHQ9Lj0/TYI/IRLrYnn7P71aI2xk+YvrVM4KWg/73Wk5e9cpe/uecxa
+ToWp+JtZuntPtr3uzyE+7tlX5a8eVVVKtj6SjDlp6GXq3hiD7DfTJaT6fJD8/lvP+620VKUKZoqr
+kch4ll8bT6KlreyXT2qbJ0jj/wBV5H/AamGIuWsKpGbYW8H7sajJH5Hkb/3Hzf5avOqtRXKdVjtN
+H8NaNdajYz6dfJPImz7Wl18v73722uLGx5aaFY6fx3rMmnix0+CT7L9qTfdyQJ+9XbXq1Z+yppUv
+6+84KEObcp2qeI7nw+76ZJPcun+ru9+7dXm/Vq+JqJy/T/gHRKrCnucj8RbXXLJ7RNX+efyN8cif
+c/2t1d7wPszP2yZw1/Hsjj8iTz9//POi1x2bMi4t7xP3/wB/yK3izNoSOST/AJ5+ZH9//YrZMwki
+eK/jePyI444/Lk8zzP4qw5TSMRY3ko5DeMTq/h7rEFlrlpHdb3sd/wDqN+1N/wB3dS50n75yypc0
+T6GfW7cWkcltG770+ST+7WuPzqnRp6fr/kctDB+8O0jXdH1C7ksrW7Sa+tdnn162HqQqK7OPEYSa
+2Ob8beMPCsFhfQ3yPdPZPs8hHeJmb/Zda5cViUnZHTg8K38R4NqXiLV9Vv8AfaO9rHBP58Em/wD1
+f9zb/uV5tOlClsel7RzNTSxYef8A2xraPql3P/y8SP8A8tUrgxVactj0MPQT3K+p6t9t1aeaBEtf
+4440+6tRh6XLE0nV1Egk1OR47W1/eb5EeSNPv/L/ABV0wV0ZVHoVb+4Go6lJv/fyT/u45H+X/dq8
+HDlQTYkFppker+ReyfZbRJNk+z5m/wBrZXTSV5HDOJ69F448E6NpX2LSb/8A11r+4dPvQyL/AHq9
+OdRQjoebQo+1l7xy1r8bteh057KaNL2d0dILt/vf7DSJWH1i8dS6uUR5tP6/E5S/8Yx/YPI06P7K
+7/8AISk/hn/4BXnztN6npxlcvaDJYPbyTzxxpdvJ+737/K21FbERpqyNlSuW9Y8TazqeuwQPHJBH
+AiWskcH8MX/PSuyWO944qeDtEueH7C0n13Y93BJAkm/fPv8A3m2sKFRSqsKlK0TsvDZnmu/O1fY8
+jz/u4/8AnnFXm1cwUqnI/wCvwL9lyndW+oaVNI+z/lj9+u6GR0p+8/1/zODEY2UCXUJknh2TP9mt
+X/1kj/L/AN819DWpJo4KeIcmVVgstMukuUvtkF18+x/mVvkrNNU0dNVtoqrD4dv5p4XnT559+zfS
+cac/6ZFKU4ogi8AaUEu/Pd3km/1cn/PP/dqXgIP+v+CFLMZRl/X+Rq+G/D8ei6b9i895vnd/Mf8A
+2q7DzzVoAKAGUANkhjf7/wA9aQY3VMrWraCS02JAjz/cjT/erzsXG53UKh51rOmz6fd/Zfskbu6V
+81W5ufU+lp+8M0+TEm97RHj+5H/8XXLiITb0Cp7pr6mmsJBBNawT/ZfuT/8AAv4q9ykqst/0POqO
+C2JE+HXh57t31CSd4INiQbH/AO+922vVpYePU4KmJSOzgjksrSC1hjeaBE2eZ/FXWeWX6AMHxeXt
+9GnuknS1jjT9/J/FJ/sVz4tcx6WV1PZnCeEPD8fi57ua9/5A0MnkfZ/4pJf96uOlhDuxuPX9f8Me
+lafoOm6fJ/osf+wkf91a7aOGSZ59bEXYaZbXSNJM/wAnnb/3dctHCpVmzStib07F7y69E8sZJ8kc
+j/3KAOKgluZNQjREf53/AHe/7zfPXyVXBOeJU/M+tWKg6NvIr/EzxXdaPGbby/I/d70n+8zf8Br0
+8zoe1ionLlzincwvhXruk6neSTXUn/E1ffs+f97WmAoKGhhjF7SnruavxlPh/wD4RzdfWDvqsfyW
+F2ny/O396vQnTUHeJhgaz5eVny5qGmPA7un+o9a4KdS501KdjPNdUDhnoJQAUAFABQBf0oyfaY44
+/wDWSfJUT0RvRqXZ31voM8f+ifxx/wDjz/7NeDiq9mezRp3RPZySJJ5fl750+5G/96sKkbGtHU3Z
+JpIZI57L/iXPB8l3Bs/irry/F8jMcTQ5jTe8u5ruP+0bTZB5f+iT11wxdWOj/QIZekr/ANfmS29p
+qNtexzz+XPIj7HkT/nlLWGEzaCq2k/6+4nG5XGVO/wDX5kHiLVtUg1FLC1+5PGj+Xs+avezHEuMX
+GJ4eSYSm6vPI1G1KS1uIIbmCRHRET7XB/wCz14OVylVi41fh/rsezjoqE+aH9feZ0up2o1GPTL6/
+jS789Ht/MT73+0m2vo6WGpwp+yX6+p4VSrNVPaP+tLG/Db34ijHnp5f/AC0+T71dVKjyQ5EefUxT
+VX2j/rSxKNMtZpHe6jSfemySPZ8tVKijKGIaOI8S/B7TL3fPokn2Gf8A59H/ANVWEsMdUcZY8rh8
+MatJfSWMdvJJPBJ5dxs+ZV+fbXM6LOyli4uJs6r8KvGmnw/antPPT+PyH811pfVmKlXTkcs+n38K
+b5Ld0j/56Oj0qsXEdJxkQECs4yZtOnFE63V3H/q55E/3Hq4SlbUivRjfQIr/AFGCTfBcSI//AD0R
+6wUYt6jhGdtBkj3E8kk80m+R/nkkf79Vy2WhMUy3pniDVdN/49Z9kf8Azz/hrCvRhVVmdMa847Hp
+vgb4g3us69a6fqFvAJpvk+0b9rN/s/NXi4rA08HH2kNY/P8A4J6lLFVasve0+49K1WxTULT7LdRu
+8ds+yR3T/wBBrxcqw/tcS5xdkz0qslBdyh4PRxaTjy99rBI6eW7/AHf+A19vhKsqTPncXho1kWP+
+Ek+z635H2TfBP/qJE+9XZDEKpPUxll3s6en9fidHBKjfck/2/Lrv9qpHi/V3BnFeOPBsfmP4r0ue
+Oy1ay/f/APTKXbXFWpM9DD1F1LXg3W7DxDcx6tav9lnhTZqVo7/xf3v92lBXqORdSolBRM7xd4x0
+m7nfT5rF5khf/RJ9/lNu/irz6uPUrxOmlg3BKQ+T4jCGGfT7qwfy3REtPn+bbs/jpwzBNW/r8hfU
+7y0Oa8LPf2+oollP5Iuf3PmP91kb+/XiYrGqk3JHuwp+zjqQ+KZJNHttRh370SbZbun3fP8A9muP
+AqNVq/b8DSpK0TrtB1ae10axmMCefZWv+nP8m6RW+dq8uvT5K785aCpu8TwXV7uO71O4u0j2RzyP
+JHH/ALNfd0r8tjwE76noafGzULaxsLHSLNIY7GDyP3/7xf8AvmvMxWUQxMry6GyxVtDNnvfib4zf
+fHHPNH/rI/ITyoquhQw2FT5f1NHSr1P6RvaR8EW/s2S91y72T/8ALO0tf3kq7v8AnpThmSqRfLsX
+DBKPxkOs/Dnw7p2i2l9Bdz3U87+XPHJ+621tPGpP3RU8I0ipZ23h21v5LqPTJBav+7jg8zd/vfer
+lxVV1F2NYQGWfhWd0knjkgngkSS6j2fOyr/delia9paG9KCZo6Tdx2v/AC7x3STx7JI64nUk5G8o
+JG5qHh3whrEn229ukSN9iSQQfupY5W+WuKOLrU5pWHiKcDk9D+Fg1fUr/TEu9n2KT/Xv/wA8P9yv
+VxGdexgpP+vwOD6mpHEeItAutE1a70u6/wBfbPs/3v8Aar2cFifaRv3OOcDFNbJanDU0YlUAUAFA
+BQAUAFABQA+gCxZXlxZ3Mc8EnlyJ/q5KmvZ6F03yM9c8KeI38TB7by9986b5P9n/AK518vmtP2Wp
+9FhKt0bujvb6dcSPdJsg+/8Aa9/+rlrz1RliFoyqrSkb1r4kunksbp7dL37bP5d3v2eVtf7q105L
+hlTxOpzY2olE9ATw/bQF30yR7J3+fy0+aL/v01fdJKWqPlZqSdmefeLNG8V219d6ndQJP5zp+/tf
+vx7Pu/erzsbTqbp/ke1gVF6Myo/E+pf2TAmoSQPBdP8A6x3drn5fvb/7lc+JpLl13NYJ7o7e41Xw
+ppFrHevAlrG6bI02f6z/AGo68XE5LLmU3t/XmdEMQtkXfDWrz6pH/aFlIkOnfcntH/1u6vpMPL3T
+y8TRudPBE8cfz/ff53r0krxPJcOUlzmkL2nMLQMhvbtLS1nuW/1cKO//AHzWdrOwL33oeb3v+ka2
+81nI9lA6JdRun8TN99K+LzDFfV69z7LBQ5aWpieKZ/Mu3sXnj+1XT7/Mef8AdR7qupKczfkRzMmr
+atBaT6Xv/cfckkT+6v8AD/u06c3AjkYtpHaSWOz5Ptbyfu/n+b/vmuedRylc1sb+hwaUkE+qavG8
+86T/AOoT5WrhxOIc5corE0+o6brT3WoXs7vG77Eg/wCW6r/8TWkYVb+7+g4wUSDU/E062/8AZ+hX
+E8KQf7e1VSuvAYuvCLcv0/yOathI1DD8U6/rOoaZaWuoX/2rZG+z5PvV6n172ovqyWxy0dvI9v5k
+f8H/ADzpXsFmhLeeSC4+SPz/AL/7v76U4szkjIk8yO4+yeZ+7+/H/wADrdPQxaLUdg/mf88/+elc
+/tTRInk8tI5P+en/AE0pqqbRibvhbTLt5oDZf8ff30k/hWuTHYlU37xpRp6HXHUtR1SSDS9Fn+y3
+cCT/AGvzH/cTy/8ATOun6tRxFNf8E5XNRkYkHiIRySWqeXazwR/vJE+WXctczU4aI2daK3OYv9Uv
+9Y1PYLiTy/M3z3FdUVyK8jnqVk/hNHUtBu9HjjgmgkSB/ngk/wCeit/FWSc5bndCCZaTTNJj0J7q
+e/2alv8A3Fhs/h/i+atFGC3M6rcdifSrHSRpt9Pez2ieRse0+f8AeySp/wAsv+B1v7K0DhqVXzI5
+u4vJIH89Pkkkk/dx1lh1dHZUfukch/0jfP8APvTf8lTSmZ81y1aSWk93J5Fv+72f6u6+f+D5nqZV
+eR3HYg/suC+vNlj5kf7v/WeZ96tFUcI6jjSUpaFnSdES61O3tf7/APz0fb/49Wcq/MtCJ0pRlqW9
+S0yxsb+4S1nS9gk+5OlHtpSWhrGlYnjg0WeCCPe/lpBsn/661zQbctTaMrD9MuI4I7uSOORI3/cR
+yb/m+aqxPuyCnO8TWkjg0jTUntfLnun2fv8Af/wL5a5sFVbrWCpTvE9A8IGHxBdSSbEhgTY7+W7/
+ADNXuUcNRq1OZfqeBipTgjvIbC1s/nRP+2le66cdkeNKs5PUpXOs6TNPBbJJBcyP/q49+6uPFNxn
+Y78PZK5Uv9Cjnu5Pts6W1inzpH/tf3qmVFzRq8QrnN6r4L1CKOC60if7bvdH8z5P3f8AtpUwwDh/
+X/BNVmUJR/r/ACPQNNtZra2SGad7qRP9ZO/3mrugrI8xSjKRYrQxCgCOgAoGZviDW4NFsftU0bzP
+v2QQJ95mapcgdM89stU1W1e6tbKT7VrD77rVdSd/3UP/AEyirKSud2HpFvwXN/wkEGzzE8+1R/Pf
+7/8Ara8KpgalWeh6NTEezNa90/R9A+yQvafbZ5vkrSWXzp7/ANfiFPEOoPk8Qyxx/YpESGd3/d2r
+/wDLFV/vtXve2R5E8PNGrpemo8Hnef5yP86Sf3m/vVXuyOSWm5qwR7ERKCh9AFPUtLtdTtJLK9j3
+wP8A6yOptcXtOUfY6ba2FpHa2UCQQJ/q40p8/KS7zLJTmm4tIJfEBQ1k4Najle9grUoKAM/WJXtL
+OS5tbX7VfIn+iQJ/E1RKKTNozUVY8Q13wX8Q9d1S+n1SDyH2efPJv3rt/uR1zyp3Z6McTCnC5raF
+Y6b4Rsd9jG8+sXUmzzP+eK15qrNRselPDe0npsb9lO+tWUmranB/xJ7KPYiTu+7d/HNXbl0JJ3ke
+Xioe/wAqPIfDNnpO9J9Uh+22P/LfY/zRrXzuPlNr927Hu0qVkcT430vTdP8AEV1Dpe/+zvv2vmfe
+2tXt5XUlVppz3PJxdGzOersOMKACgAoAtxSeRceZ/rKyqJtGlM9H0DxdoP2C3sZ/PeeeTfJAn3d1
+cMaNnqd9Odi6I7C6j2Wr7L5J/k3/AC7omryK75W77HpKNjpvD58ye6sr2+8i+mRHdJ/ut/wOvPlQ
+9o01sbRq2NDVL66j1LyPtdrdQbE+RP8AVLtqI4FUlzdTpo1S5JPaWtqmf9W/zvIj/MrJW2T4jlc4
+vrb9TnxNLnM6O9+xatHskS6g1DY/mJ822vocNiPY0nGH9feefLD887stNfabPqSWN19yCT/j7Teu
+6uTK6zhVcp/19xtjaV4WRg+KJ7611iD7LaRz3aPvtJ9m791XZleIlOxz5jBRgdpHGsmySvrpO9j4
+L2EfaNkrLzRAKsLsyvEempe28d19rngkg+eD7L96sqqPXwMnFHA6ba3UTT6vDdyWV9dXb/6Xv3fI
+qK3+kw15Usfeu7/1oewsGp0kjqtL8ZXogB1q02fwfb7T97B/wNPvpXXSxSknzHk4nLZ06ya/r8SO
+0mtLnVJxe3cd7pvz+ZaQfvV/e/8ALSuGrjmndHrRw6jCxgaGNFs/ipqdo8cD6dJH5Ee/5v7v96qp
+Yjnd2c1aneFjd1TS/CTzzvJpkEKQPsk2J8zf8BrixWNtNxseng8OY2p+BNMh0b+1NIigng+/Ok/z
+yx15WFzX944Nf19x2VcOcfqPhezfTPtUcey7j/1kcf3GrrpYuU5mWIwiiQaH4OttYtPMSd7WfzNh
+8xNybq2xWYeyYUMtVT+v+CZWr6Jrfh+/8m9ge1nT545P/iWrpjiIVo6o4JwnA7Pwx8Tr7UJP7N16
+/ePztiQX/wB3a/8A0121y0sojzXg7fj+pdLM5Q0/r8j13SLWTTdIPmbH3/6zY+7dV5jRcMLFS/rU
+0wtV1cTKX9bFDVfEGjQTWsd1Bsu4X3zxony10UcTTkohGk1CS9Cr/Yrz6ja+KJtWnexnfZBbon73
+5f4P3dTHHqrIJ0eWmzrtQsIb+wuLKeP/AEedNkn96vZUXynzVHmjUZiwfC7QbL/iY6VO9lqVrH+8
+nR9y7v8ApqjV83ic0pqN4b/15Hu/VuY5fVdX0V5INRnt/tWswPsu44H+VfKf/WL/AL1Vh8TScOeX
+xfMPqvKa2jQaDrxn1Wexd7qafYn+9/BWjxFOV6kldhL2zlq/yMy58K+IIdR/0WDyJEfz4JE/36+f
+eIhXk+WOvqe7RnaOrONmlvvFHjiw8NXzokEd1sfZ/e/5aV3Uabo4duG7PKxVbmndHYfFy507TvDl
+3ZWsiQSI8FlAkH3mX7z+bXHlGGmqv7z+vuN8ViP3djxDTdPu7+fZBHv2fPJ/u19PVxEaauedhI87
+PXdI0TwNo2lWl7HB/aGqwz/v0n+7/wB8V8ti8XVquydkeyociPUNJ1G31CytZ7IpDazP++g/55tX
+yU1OhUblrJbeZ0cyYusX2m2ZS4d08x3T/gVdOGxNaVf2ltvTtYPYpmB4w1bw9PpsdrfeX/as7/uI
+0/h/33r7DL6/tqPvHHiKfKzi9W0K/gf7LNB+7tdiSTwfMv73/aq3TnGPuGntPdH20clknn2Un3N8
+F3Iif8spf79Thue2mxhidXdla6020hu5ILWfz0g2P9rT5fMrOvOz0ep00J8yszptNvvAWn3Fj51o
+887/ADz3T/Ptb/aWuGhUqxcuY1m77EnxE1bStI1jRtQ0OdILuTf9r8n+KKX5o1elgo+3oyjIxTtu
+cT4/n/4S9YLkWnkX0CbHn/56V6uV06eHVo7fP/gnJUoOR5de2dxZ3HkTx7JEr6GlKMtYnlVYSpsg
+HWh07mVOFhholoh1NRKBBQAUAFABQAUAPqAL2kanf6VfwXtjPJBdwyb4J0oA+kfA39heMvAX2t7T
+fqsP7i/2fK3n/wB7/gVeVTy72UpVF/X4ndSx2pV1HQ9S8P2f2WeP/iTXXz7/AJGbcteDzzcXzL8j
+1aM1NC6B4xvbZ/I0mCSeTZ+/375fM2/x/wCxX0NDESWxy18PGUdT0fwrfXWpaGj38Do770k3pt8y
+vZw/v7nz8rQl7pk+IfDWiWbWl75G+CN9n2RPu/NXDLAwpVLo7qOKnKmR694C0C7kkv713RE/1aJ9
+2OuutRg9WZ0MbOT5TS8NaTaPbpc+Y/np/q5Nm1dtc2Cw3IdWKxmljpUj2Jsr0XoeHJa3HUc4BjNM
+Xs+Yy9Z1DS5PP0m6fZ50D+f/ALK1lNwnBpnpYWlPcw7S70fTtDnuvsjvHZRukEE33pNteHSwlGnO
+7/U9NVKmx43d6jHqmrX91qMEiPN/yzg+Xb/31Xn1YpPmjselGlZFm71GwgtINPso3+w+Zvu9/wDr
+WrOUYyV0TGjqXdT0m0gtf7T0iN/sP/POf/WxtXJXxNOdXkRomT+Hp/7Q06+R5P3n/LOd/wDnrLXL
+iqKhNW1N0UN93ZXdw9lJIk/+ok+5u+b+CvVjOzZDpFvwxr9hosU811afbbu6+Ty/+ea/xPTqU06L
+j3MJUTG8QTve3XnT7Ej2fuNifL5f8NTg8J7FalU6qcTF+wR/cgk8/wAyPzJP4Nr/AN2uyeIgjGEb
+yIRJ+7k8uSRP+mdHtJcpNOKK/iYp9ot7uOPy7iP/AI+JK0wFSz1JqSsT6HDPqvyWv3/+WdY4pWkX
+hql0Qz2FwlxIk/ySJ8kn+9WlPE2RahdnS6JcTpHJBY/feDZd70/2/wDllXLOUUuY66bNZNG1jSIJ
+Lq6M9tBs3/uPvNu+7XBTzCNSXKmOpC5w0v2vUZ/sNim+f/WSSJ/DXv0qTgjycRJMVdIu9Ln+yzxy
+JP5iff8A4qKk21YWHpJm1HrurefBO88k89ls+ySP8+1Frmdfmep1KgRTzfakknn+Sd3/AHcaJtX5
+q5Jy966N4wsZ0kflyV2IzZnSR+ZJI/8Ac/dx1sjFk9v+8j+eirG4co+OPZJ5nmb6xirC5S6lxsnj
+ngj8h/8AYrCauaWCe3k+yfbn/jkp05JaBYZpcdp5myOSSeP78n8P/AK3rty1M6MLm7Hpkcc88/ly
+eenz/I+7bE1cccU46G8qFzTsNCuLqREso/8AUQb7p3/h/wBpVrkdaV9dzRXQfZNNgt/3Ef8A103/
+AHqV5S+LYrnZu6HJPot1/oseyO92eRP/AHWr18sm5M8vGzVj1vUYtVm0uSG1nSG+f+P+Gvp6lO8T
+wqdblkcZ4U8K3ulanquu3sH7xEeC0gT7zf7VcOE56UTqx1SNWQuv6IPGek/bbbemo2v7mNPuru/j
+3VlBTnI1hVjTiafhXwVdaFqPnpqU89o8CfuH+7ur1jzJHWGmYyCgQUDCgQUDGyQxv99N9I35jHu/
+CWhTRz7LSBHuvknkRPm+agOYoaF4B0bQbuS50uN496bNm96LB7Yvz6TPNdPdTSO/ybPI+6u6iwe2
+KEWjx6fBdpZWKPO6b53f+KsbBSZZ8LprKQeTqH3PvwfJt2r/AHaLBVZu+XW5zh5dACUAFAElAyOg
+QzJpEJsXLUcxonM5fxTqupvqVppGiybLr/X3b/8ATD/frGtCqo2j+h10nTTsEGoMmmz3Unn+XDA/
+zzvt+Za4KCq05Xl+h6EqdNo860DSru+1Lz72N/7KR/PeOf8A1s3/AAKvPrYunRq3/wAz0a0XUid5
+M91dXaI9q72r/P5afKqqv96uVZzSlW/4ft6HNHBNRPCLNILqeP7LIiT3U/8ApduifNtpOM1F9bI9
+OM7Gf8X9H0Oyu7GbSX3Qzwv8m/d92nkGIqzUlNapnmY6R5vX0p5YUAFABQBLUxTbNdh8FzJBJHPH
+99KupTSQuc7m0vP7RjS5tZNkn/LT/Zr56rS5HaR7catzoX8+aCD+1IP3j/cvk/iirgbV/cfyNlG5
+Z0zTL6CSOfyNkf3PnrKviVKLVzoirHSaFCmr2l3HewbJ9M+ff/7LXmYu9CUbfaNVIxTf2Ed5dzRw
+eRG8fl/J/C1fWYCNocxzY2dp2RuaXoc8VpPdW0kfnlPn8v8A1XzV4GMzJOdv6/I2l7kLs09MtEgt
+ke52O8P8e/7tfUcMV4zueFxBCUS/blJ08yGTej/6uRK+tTufFqjLco67dTxQRpDHP8/+sng/5Z/7
+1TU91Hdhoc7Ma2g8QRiRH1aPz9myw2fe+/u+5Xg4vG8rPpMPgVYztC0a/vIL6e+uJHeGed4IPk3M
+33JqKdGMqjb3MKlR00kRWcGrQefZWUD+f5fmPJB81eFOU4zaex9NS5ZNNkUttHe3H7yD7LfwJ+7v
+4/3Uv+1v/v1azZKGq/r7jhq4Bxlb+vzOYs4bjTvGt+nmefdH94JJE83d/vV2U8dz0uZIyhhLzsdd
+Ff6nqMnn3t9OkmzZH8n7ryF/hrycZjKjtOx24Q3Ug0ay0rfO86Wl7+7dE+783+1Xm4atUdfmsdlU
+5tdMgurvZB8/2VPPjTZ/r9r/AHXr0k5QmcOIi5Gx4AtNOsdNu5po/Lk+3PBJv+7Hv+7XLmFGdZiw
+9V0zd1rR7PV4pLJII57Sb/X/AD/xf7DNXTlOCn9mV/kTisZBo8T8a/DjVPDp+3f6/TXk2JInzNH/
+ANda+mUZU/iR4U6kWw8J/EW+0mx/su6kebTd++CP/nm3/wARWeIozqQsjfDV1Slc6qTxGNVnjup/
+Ln8z5PLjevDlS5X7x6ixCZ0+jxi6gjj8h4LT7nySPu3f3lSuaeYU6ctP6/A2rUdLGvB4i1jT55LL
+5N9kn7iSf+Ja1nnc3HT+vwOWOAW/9fmcvHrGs6hfRpNP5D3U+x7ud9sXzf3/APYrjjh+Rc3Q6eVR
+GSf8I+k/2XT5Hne5fZPJs2xL5X93/epTpztzy+FBypnfafBcjT43jhhs4Pn/AHez/XL/ALdefhM2
+nhJ/zp+n+RlVw8L7nO+NPFmseFvC0dxMkEGpXTvBYQQv5qtEv/LX/Z219fgcTKrUU4x91+fkeTj6
+UUtzyPwXbyRX39sm72XdrJvjj/ib/ppXXiZKMOWPQeEjzq5n+L9euNb1u4vXk37/APlpVUbP3pCr
+as6Xwhol3b6ZHdQSfvNRSf8Ad/8ATCCvPxrlU9DswsOQ6O00y7vhHDa7532ed/wGvEqThE9mMOdH
+T2FveaRoXk70meR9/wBl+7L/AMBrLCY6EqjjJe78ziVJorWs+j3t1BNrME8aQx/6j7ybkoxdP3W8
+Pv8A13C7Rl+N44dRvv7U0+N/sTokCb/+maVtlWHnToPm7mdefMyWwgsZvDMkE929rP5/7zf93/gN
+ephsVpZGnJoWPA8Fp/aV3ol15ckF18knz7YmVX/hrsw8oQjyvc4cZrK6NzxBbvpcUFrYwJPpz/J9
+n+7Lu/23rxcRgOSXN5nVSnzRsjm9StH17XvM0+BLV5v+WCfKvypXcqqxNXTb+vQ25vZbnMa3YXa6
+vHHHBG8cEieZs+7LtreuqdJcq/Uxm/a7G7pNzaXWi3c97Yb40+5JA/leX5vy/Mn+/Xkzwc+a8f0O
+h4hRKVr4as9YdNOuo/8AXfJG/wDzz/2qc8VOitNzKUY1DzzxP4cu9D1afT5v3nk/6t4/utX0WExP
+Ornl14WMGuqbucC1GUwCgAoAKACgAoAkj/6aVACUAdn8NvH+peD9djukk36ZP8l/af8APSL/AOKr
+SnO0dTKpFRPcPEOraT4wsILXQb/7VJPOj2kD/Lt+T7rV52IjCrLkR6eCm2ihL4rv/DGn2MEGmomq
+pvgu550/1n+5trWLjTeoSUqkNDsfEniXxBpegadrVtAnkPse73/w+bXXKsmtDz8Lh2p+8b/mwaxo
+8bQXSJvRHnng+7t/irarFKPMyY1XB8pBpPiTQPEyX1nayfu4f3Em/wCVm/3azcFVhoTFuEri2Gtw
+W2q/8I+8Do8P+of+Flp+0szWvRvqb8eyRN6Vs9UccddB7U5QsRV0MnxHe+To13sn2T+Q/wDtfwf7
+NcdStY78FDmPGZbSe60y08Q+fPBffJHPJO+7dt+66V4eJxyUrL+vwPo8FTfJc9HsdW+3eEp72OdP
+tUKbEjT+GuDH4Wc48yFSqe/Y8/1bStJj0afWkjeTfO8Ecjv8zT/eow0JJWOqU7MpeGI5LqeO6eCO
+ff8Au44Pu/NXNiYuT5YblSlodhfapBf6l9h1REsnR037H3LJXkxy94d6/wBfizNGd4qk0DTILrTN
+PgdJndHm/iow9GtOrzPZbG0TB0fQBqcl3OZ/JghTf/tM1d1fFKLXc0lMpanoV3aySefHs2Sf6t/7
+rfdr0FJuaiYuZmSRyO8af88/9XVQnJuzE4xUdDrNGg+H1rZTz6u876jZT/6hP+Wn+7Xrwo0ra/qe
+K6slLQ5jxnPpN7fRvp0H2KN97yQI+77z1jHFxkjspROc1C/kvpLiSf8Aj/uf3acKd3dFVJIq6Fb3
+Yj/1kn+s8uOP7tGOWo8NTsjXjkuPMkgnjkSCD958n+qVnrl9jdFqpZk/2vyLuO6nkkT7n7xPvKtY
+qKkuU2TsbsHjjxP4kuE8PaVdpCk8eye7f5f3Sp/DTw2UQpvm/r8zhxGM5To9C0uPwpdx2MECJY6h
+sSee6dN8n/A6vAZyq8rf1+QYjBNGV411yPVvEE7vHsS1g+ywR/3XrsxNRJhhqLRz9jH5H+lTxu8C
+P9z+9Xl4hcy0PUkyLWr+CeT/AEKD7LB5m/Z96qw9Oy1MHUMW48yDzJP9ZHXYiJBHHvj/AOmdbIxk
+EkGz/brCNa5tYtWGmT3V3GiR755/9XHWVWrYVi7f6FqVlfT6e+x5k/1mx91Z0cXBwuaWN+TwvfPp
+qTbN8P3N/wDFXlrHx57AU7TQt91BDD8m99kkf8NdVbEyjB3LjCx6NaeBf9IgtdOnRHjTffb/AJm/
+7Z15+XzlXmznrYjlKiaPqUF3fWVrBs2Omyf+KT+H71OUJy33OqeIRpP4RkutZtLMweS8aefJ/d/4
+FXrYPKa0/i2+X+ZwzxaO407RbGGxRHgTfs/eR19dh8uVNf1/mfNVcU5Gk0ddCn0OSrEUqQacncU6
+coshS3tbbfs2Q733v/DuaimuUqVOU0Kl1A+zY6Pv/wBX/tUG8iU0zCQUCCgBlABQAZoHzBmgOYMU
+C5AxQHICmk0FJgxosFVhTGFAEdAiSgCOgYUCM/XtWGkaVPe+Q87p/qIE+80rfdWlM1otXPPbmx8f
+3upQahqkf7j7/wBkTf5S/wCwyrXFOR69JwsatnN4lm1N53kgSxhTfdybNq/L/DurHCYirVV1+hGK
+oU4S/wCHJ7LS7nWXkmukn+wzTo8cc/3f++KU3Vk7P9DSdSmom9qmlXE9v/xL9kM/yfO6fw1VbLaV
+Z/8AD/5nHRx8lEuwwPGI0+R0T+OuNZBSjK/+f+Z0SzKXL/X+R8xX9joMF3PfWM8n2W1j3ySO+11f
+/wBnrho1JSex69aroeYalfyX1xJO9e5ShZHh1ndlStjMKACgAoAKACgC5p2qXljJvgfZv+ST/arO
+tQUkaUqtmd74f8UT6jo32K5k3m1fekf8fz/3a8erlnvXj/X4nqUsQrHWpqHitLSN7SPfH9yPfsb7
+3+9UrBzoFyxMJbGPb614l+0TvPvtXm379ifK1ZVKVOo/e/U2pSl0NvQrfUnh+zyWbzabv3xyfJ5q
+1vTyrn9+L1/rzOR5koS5JL+vuOknt9D8+C2e6nsrq6/5Yfd3V5dLLa/tXGp8Py/zPR/tNKPPFf19
+xcvrnSLQR2d19y9TY/yfxV9FkEauGjyz/T9DxczjCv76DR9Es9Nj8m0eT7O//LN33f8AfNfQqnFP
+mR85Or7X3JmoHwa6YQTOOGIcWYV/oMc+sx3sN29rOkf7vZXmYvAKf9f8E93CZu4r+v8AI5xJYLG7
+fR/38k/nv+8gf+981eC9KvKe/PEPlMy/1S/tdZ3vI6eQ6eZH9yufH+9LlNqNd8pox6raTarJe+fs
+gurrZJafxLAyV4zoe5/Xc7IbGJoaQah8QNXtdBn3wTx7IJLr5dyxfeWvRry9nh1c4sJ/FZ2OtRf2
+ZY2Flez7LTf5/wBz5t33awX1eavD/wBuOudOo5F/XdTsE02DTLJE8jYn7x0/u15uHhTVZyf6m88O
+7amJBBJPseytE8/zH+1xp/y0i/6Z11YupBy9/wDUyprm1KdjKg8efZLqT/iW69/yz+7tniTZ86/3
+q9XBUYVaXKeZOtKnM7/S/DP9kalgXfnWuz93A/3lr5HE4ialyQ+O/wDW+h6s5nL+L7ix0u51KOTz
+PtF7+78tP9V5Tf3kr6fAYicqfJPSf9fI45niGoeHrj7RJ9kj3x/88/469mjiYs82rhRNA8Ral4fu
+/Oto0kf7kkE6blor4WNXcxi+Q9o8EfEvSNReBLnYkkOzzIHRB838Wyvkc1yaq25R+16L9T14YxJH
+WeLtLhurO7dJEgk2efJH96dlSvWybJ6lOk4Te/8AXc5J4t3OAsLWed4Pt2+HTpvvz7P4VrzKyUNY
+7ntUytqQsINSk+xSPBAkb/ff5q2w3vL3hVIXLVh8Qn03SZ4b3fPAkDpA+/7tRPKPbVE1/X4nH7dQ
+jY4PTbW+8a+JozdT/u49nmb3+7Av8KV9HHlwlNL+v1PN+r+1lc734oatoum+Gf7IsrSBPuR6bOif
+w/8ALX95Wqre0Yq0eU8k0DR59Wv47GGPe7/+gVpXnyROeNH2h6FrMEdjPb743gjtdkcn8P8As14F
+Osq2x7cVY0NG1jxPZ7L3SbdEgR9nnzbNvzf3EauPE4ejLSbNkrk8n9swR3d9BJsF1vS7n+9u3fw0
+U5O3kaKmilbeJNdggng3yTwPHskj2b/lr0cNNp6HHWpouWFxfWUjp5/2W7f5JIJP4omrH3qa1HC1
+Rmfq8bxx7P8Aln/yzow6jJ3ZrV91HWfDbSrdp7SN38yS6SeeB0dN0LK+2vbwdGKfMeFKtZ2OnutJ
+vdZtZ7pJ/uO8E+/+JYq+UznMI+25f6/I9nAy5Fczf+EWeeeeS2g2WqQbEn3/ADeev92owmZfV04z
+3/ryZpV/eWH6Pp0kGlPZOiTyD/Wfwsu6uCUJVm5wNqtRQsjNMGj6XrsB1S0/4l11H/p8af8ALBv4
+Zf8A4uvrcFCFV+9uediJzSuaWk+B0m8SzvA72unWrp9kd/vSfJv3f7lelHKYuX9f5nmf2xJO39fk
+aPxC+G+m6/4T+ywyJBquno72k7/xfxOr12fVrHNz3Ple8t5IJJI5I/Lkj/5Z0/hJaKlIoZQAUAFA
+BQAUAPoAKAH0AdL4H8a3fhPWkvYY0nj+5Jbv83yf7P8AtUAeuS/ETwl4lbTXurR9kL/vI0f5o9+3
++9XJUrR5tjsoYf3C1438Sz3Otf2X5iPpVkiSJAn3VbZ/y1rlzKXPHRm+Aw3LI5jTda1m6uI9E053
+8h38zyEfbFJu/v0Rq2hY6ZU/eN6SK38Paz/aFrI9rOn+rg/2vutvauLDV+WZ1So86PVbO61HVLKC
+9SD/AEr/AJZ702rtavao1argr/oeDiUua5r2NvH5XmWvyfwOj/7P96vSeqTZ5fKue4tzqn2Xf58D
+/uUR/kqHJJe8XTp6mFqmo3V1BG8eyGS6jdI4H+8v+9XymbTTqe6fQYOnoctqOlPa+FP7Pd3hnSf5
+4H/1W3/ZrgqYqVKPK9zuoRi3cTTfEWhW/hafTNM33t9Mj/a9/wDq4/8Ab31rPFzVPUy+qKrUuZ3h
+KC2+ySQXkiTweY877/vLXi47EVZP3f0/U9OUbbDNYkuNF1WP+z3S6tdmyCNPmbb/ABL8tdOGrya9
+4xcb7lOTRg+qwb0eFLl0/j/hZN1Y/WPdaN6lnsbmqPY3UEltqP8AotpP+7gvtny+bV5RhG5cx51S
+bi9DIKXfhJ472CS1up3/ALnzbV/2q9PExUaqZo5yrRJfEHiPTfFL2n2qP7NP/wAt32fMu3+BK6Mb
+j5KmlE56GGcGV9Zh07QbuPyN8KTv/q/kll8j+9/10rCjRlGpqbfWG0c14gsrG1No9rP56XUHnyRv
+/rY2b+Bq9DERjfUnD4hpmBPBJJ/q/k/56VnCu0jcs28dgkEnn+Y877PI/wB7/arCc22BBbSb7jYn
++srSrG0EZQXvE95rc73kkH/HrA8f79E+62z+/RQw14BUrWkVLvU5NfEGnWMHkQQR+XPcf3q6P4a1
+OfnlM6PwRaaTBfRve3f2WCD59+zdu2/w/LUckKu4c7gdffeI9Htbq+e2tJ59OmTyPMn2bod3/PHd
+Sw9WlRqPlWnzLlQqSjr+hxtjfm1invbJ5Pt3no8Ecifwf32atlNU25RZhNSlDlaO1sfCkOraN/bt
+1PAl3O7vfJ/ql/2dlXXVOp/TEpTp7GD4o07wobvTbXS543kjT/iZTx/d3f3K5MW3CHundSqznuc5
+rWm3Fr+/SOSDTb2T5N/3ZPKpYacoxLq6mLHJIk//AEz/AOWdb1rziYw0LslvJ+78yOuanJR3HKJv
+eHtG1K5t7ua2k2Pawb/M/wBmuTFVKb3N6UlEvaTpWjWs6efJ9tnuk/gd1aNv71c9XEzm7yWhnFKK
+0Nmwj1r7L/Y048mB33/a0f5tq1y16Kh+8KhFsW10m73yWsM+/Z86P/u/3qt4uU1dR/EJUlE7TQ9G
+vrjToLrf+8tf8sr1lSy6tF+0gvxRyTrU1udjptj5Mbu6Jvm+evs8jwfsoni5jPmZd8tN+/8Aj/v1
+7O0jzXoh9BYUAQzTQQpvmdERPvu9XdW1IhG70PJviL4g8Mxxxpau+qX3/LPY/wC6jTf825q8rFKP
+Q93CQqJaHKaL8TNdsNVxpemJP56eRHHPv+X+7tqcLXsdONhzo9Li8Xalp9jptrqM8F1qt0+++dH/
+AHUe6u6pikeVTwNztIbyxuv9TOk38fyPu+WumTick6bZw3in4jvZT+ToX2W9kSfyLvf/AAtXLPER
+ibUcG2cvd/EvxFDN9qeeCTe/yWMH/LOuJZjJyt/X5HovLYON/wCvzOx8G67r11od9qGrxvNPDv8A
+3Cfe/wB3ZXp+1ko3PIeHhzWONsviZrk+pR2tjGnn3s/+l3c/3Y1/2K4MNNuVmehiMIktD2SI4WvT
+cUnoePGTTsPpgFABQMKAGUCCgY7ZQA2gAoEQXc8drBJM6O+z5/LT71AHNeGPF6atPdpcR+TJBO+z
+7nyrWSqXOvFYbl1Rt2j6rdXTvPGkOnf8sE+9LJ/tt/dp8lzGGq1I54Uk2f8APjv/AHlaOCRjGUpD
+X17REvnspLtEuk+d46xdRI3VFmgmx496fcrYyCgR8NeJ7m4fVp4JBs8l9jx/7VeVhqcUe3Orcxup
+rrnK2xxTkJSKCgAoAKACgAoAEqRKBb0+8ktJ/MjoNYto9BGo319b2GowTvdRp+4kgn+5v/u7a8ip
+KpqpHoUaMeho6brVwLi3tX8tP4PM+f8AjrnVOLN5ucdj0WHT7C90eD7K8nyP+7k3135U4SnKgn7y
+/r+tTDGYj3ueSM25t9Kku59Q8/8Ad2v7jyP7sq/71XRwkrSc3t/XQunjXJckVuaOkXFm1pHDDvuo
+0/fxzun3f9mvWwWIVXWR4+bYKpSfuG0JIjF5i/cevUk4y0R4lW0I3kPKipaaJlTRQ8SCJNJkmefy
+Nn3JE/vVhK7O/D04nmmhR30+pRvA8kE/z+Zd/wC9XzNNfvOY+snblCPTNakjneeD7VG//LST+L/a
+rlxus+Y3pW5S3YWlpdR/ZbKNEnfYknn/AC7W/wBmvLxEnSXvG8djmtK8y18X6tC8f7zZs3p81epK
+MauGTOPC/wAVne3GpXhSxS6u96FNnlp8zf8AA91eG8HGEHKPU7FOo2b1tqrPdRo+mpNI8G+Of/4m
+vRyeFGXx7/P9DhzBVrafodJYS2sFvAfISGR/9ZGn96ozrIKleopQ/r8TPD43lgcd8S9CtLuJ9XtY
+5IL61/f+ZB99tn3GrsoYCWFSj/X5sFXjUMPVPH0+oWNjJAjw30KeZJOj/eZq87CYJUat1rI6VMqa
+74hu9bSN7rY6QR/vI9m1vNrrxUnOd3pIdrkVpafa/sn9n2Oy7Tf+837vM2/71cbm4vVm7jzI5XxX
+pT32p75k2Xc/+rk/vV62CxLaPLxNGxy2o6TqmkyRyTps3/PHJHXo0a8K3up7HHXwkoM7rQPi3G/k
+Q+JrT7V5CbEv4P8AW/8AbT+9Vcn7y7ZKqKO5pt42sL2Ty7WP7LYzOm+CD5v3X/Aq8PF4X+U9ShiL
+mjeWNprV1P8A2Y8EOz/gLbVT/WPury41XStz/wBfcdzqnmGpySX+qR6bA+8JJs8xP4mr6jDfu6Lm
+9Dxr+0Z7taabofgnwZ/pUyCLZvu5E2eesrfd8r/gdfFxx1TGV+S2lz0dKUT561jVZ9Tv5Jp5N8j/
+AOrr7unR5DxJVvaHS+BX/sq6g1TzH2eY8E9un+taCVPmrlzCV1Y6KU+Q9TsLWbxDpzx3sCPpenzu
+8dq/+vbd/wA9Nvz/ACV8liaroO0HZs9lRubl7JpUcCW00COkMKJvryYe0k+ZPqbKNjzS3fU0nuIP
+3iQJJ5kkf8G2vsE0kQqbN6x1W00iC72R77u6TZ5b/Mu1qrDVIpnFXpsz7eeN7u4nvo/tTz/PJJ/y
+1X/aWoXNUlZlXVKN0eraL4N0b+zp47qNL20vdjweYnzRxbK+jw+AhGN2eBicxk3Zf1+Bz/jzw1BZ
+paT6Lvsru1j8iORH27oq5sXWjRnynTRpc7uV/ButeJ4dN/swxo8L7/Lu3/1qs1fGZphI8/P1PZow
+vodV4SvJ2H9mX3+vtd+yT/npXqYPAwxFT3zkxNf2ULlnxTYeRoF39lj/AH806P5n/A6+iqZfTo0/
+d/r8TgoY11p2MbSvCs0mmyfav9fdfJ5j/wANfMwwk5V047XPdqYqE4Mo+NPD+uaMulXuizv9h06T
+fJBv/wBXLs/9FV9w7xgl1PmKfLOoz0qzXz4I5pkR3dE31rOZw06lzw79orQdJM1pfWtp5N9AmyeR
+E2xSxf8A2Fcczvp6ng0kdAEdABQAygAoAKAH0AMoAfQBJQBp+H9dl028jf79v5iPPH/uVz1cO2jp
+oYnWx6Lq3xIfUI7u7FhHdWj7Hu7uP5ZYmb5V8z/Zry6mCc3udrr8upPrdzYy6zBJo8/22BERPMgT
+yomZf7tXiocuhphKvtI3PUPBelWF/o0GqXvzzwu+/f8A3f7sm6ujBYHn1OOtmXspW/r8jrbeWy/t
+fZPdOmx99pa7/wB1ub/ZqMJjJOq4PoRiMM+S5c0bUjdXN98myBJ38uf/AJ6bflr2qddP3WeX9VfL
+cfqh06GR31CPfauifvNm5V2/3qVWk2tQp1NTk/FniDw3ZSPdJqSTSTIjwWkD/wAVfPY3LXOp7v8A
+X4n0GDqaEGlWOm+MJrqbU989rayfuIIN8UTbk+//ALVdWHw9PEO8jHGylRRgaha2OnCfTLaDz59+
++Cd32+RE39+uCvy+05Hsejg240+cZoyaNNoUcF1dxw3fnu8km9PurXlYtqUfcOp1bblzw5ceDrDV
+YLmS98u63unz7PK/3q4sKpyl760MJVb7E2sXcHiHUnudBv8AzPsSO/zujKrV6GZU6anZfqThkzi7
+zxTpl7b7H1PZ9lkTyPketaOEnGN0a15pCW/jLwtHBOlzcfbUeT958jrK3/AmrCvl9Wck0/yIpYuM
+Ylyw8S+ErXTZNRtdWj+1wR/u7CdNsu7+DbXt4XAOMfe/r8TlePvL+v8AI5i21OO6kknefz3eTfJJ
+95tzVw1JTjU1O7D2cR9/qT6jcT3t1Hvu5/8AWbP9j5Vq6lWLepGiZZSDTZLTZ/x6z+Q73Ej/ADq0
+v8Kp/crCdZX0NDD8t5PM/wBiuiEk0Bjahe/2bq+/7/mIn3K6sPD2lM82pXtINPsLjVr+OS6/cQP/
+AKv/AIBTr1PY09AprnkdlfQaDYT+RpE/7j5N/wDvV40HUqfEd/OoF2dLfSL+ORJILqR0/d3CfNF/
+wFK64xVPcOdTNi88O6l/wj/9tTweel6/mQfP91f7+yrrQdOn7y1MvrKlLQ0tS0HwxZeErG/1S+2X
+X3IIIPmb5vmreOWRjHmk9H/Xcy+vSlPlSPPl1C61C7gsoY5Jv3myCBKxp4bnWh018VCnub+ueC9Y
+0mNLq8g2Wj/8tE+atMRQnCBNHHRnsY9pJaXV/AmoySfZII38v59v8Fc1WbUTWOpi3M8FvHv/AOWf
+/s1a0VKSMauhF/bF3fP5/lyPJXRXorqcsa9zvvCOgeK/EH/EoM8enwQbPMj/AOWvlVWHy+lPV/r/
+AJnPWxXKdlovhHw/BPqSaE897fWuyBJH/wCWjfx/N/drqrZfCrGy/r8RU67T1M/UrW7+1QWtzvhn
+hfyJIPvfN/Dtr5qeDk5ezPXhXTRsWOiO+o2NzZWs/n3X+vkn/wBVHt/vJXbl2EilyX1Oatik0dPp
+emapZXyRpsex3/6V/DKtfRYTDypuzeh4lavC+p06qiGuqL5TirTuwbpVrUmrogpDGXUnkwSP/cSg
+DyXUtUvbrz0uXd0m2PPG/wB35a+NxGPnJ6f1+B9VTw1NbfqUD4c02a7tLrU38mC9+T5PllVVT/Wb
+P7lepl0eZe8TUrOGxxuvXaPfzx6XHJ9h/wBQkn+ytYvQ2cTI+0XGyNPM/d/886l1GzJvlNPStQvt
+InkvUu3hneB0jjR/71aUsRKRlPCJB4ajgf7X9qn2SPBXFinI2pQSOi8I+HI9a1aR7qB4INm+PYn9
+1K6MIm/eIxElF8p0Go/E2bS9ag0KBIIN77LuedP71e3hcQ6j5Tz8RhFFcxDc21pJqmrafplikyWr
+75/sqfvZPN+/srHESvVsjOhWbjqep6JJ5mmWr+Q9r8ifuH+8tetGPKtTx5zTmXaBhQAUAFABQIZQ
+A+gYUAFAFW+uvssG/Z5z/wAEaUCOY8QxeH3t5Hk0p59/zyT2qIu3/gdZOFjso4jTUk8NWOm2GnJc
+i+nmtbl/3EE/8P8As7aanY5qz53oSeKrXX714LbTJESCb5J3f/nlTlBs3wk0Z1h8O4oLr/Sp/tWn
+bN/l/wAXn1i8K2bV8WonYJBHCiIn3E+5XSeePoA/P6RzJJ5j/wAdch6AlAE0EPmtionJqPkb4ahz
+ysd0fg74uRIGdI089N8ab/mqMJiPbR901rwjGXIFx8Nre1sLh73U0g1KF9kem7NzyN/BXB/aM4vl
+toddTBRlscRe2VxZ3DwTpskT+CvTouM1c82pRdNkFMAoAKAHUwNLT9c1SxT7Ok8iWnmb5Lf+Gsas
+faRKo1D0Tw8dI17WbSG18y1gdN/7z/Z+/tr57GqVKLaPWpTR0MWoT6TdT6e7+XYu7/u//HaijhKl
+lUfxL0N4141SprfhTy7CO+sZ98k8j/aPLf5N1etQnWrLXf5HFiKkaYz4d+ILiPVrjTnjkeGb95/u
+std2DrRpO0jz8RSlWV1ueg3drbwQSBp3g+T938/8NenOEKmsTlw06kXae3y/Q5u112fQ7OCOS/S6
+3/Psf73lfw/NXnVMQ6J1Ti60S1rt9/a2m7I5I4IH2PJBOnzVhjMw9pT/AK/yNMBgORmLd2mhQ2t/
+BZX3z70+yJ/DJ/e+avH+sypJw6HquPMxdCkvtQf7FMjuiR/6xPvKq15jpQcrtnVOXu2OifRrG6sU
+sZ50+0QbPIu9m3zF/uvXRSzH20LS+L+vIyhFwnocZHqOh6B8SbtwjzWT2KI+z+89L2NSvgktnf8A
+UiOJcKuh0kfhC0vU+3Q3e+N/nT5/9v8AjpZgvq1NWNYOR0GgxwWwRHnSFEfZJv8AvfN92vExy9rT
+U18Q6lNsdqN5pttciaK+3yP+78j7ytX1+SZrVnTUJbr0/wAjzK+ATRdtr2zvL2SDyNlq6fJPv+Zt
+1evhMQpzlCRzV6EYwOQ0KPTtF8W6t4dvY/Ig1CP/AIlM7/3W+8tUsGovU45YyUmZWlw/2dqt1Dos
+iahazb0ngf8A1m1f7tfKZrTpc2vTbc9vA13YZeeJY44LS1TzIbuHf5m+Pb8397/eqsVhFJ3ZfMY3
+9pmeeOaeBHeZHfzH/wBn+5UKjyxsmHMVdFuBd6lBa+Ql950nlyWkn/LSu50/YvmIbjIy9T8BzXGt
+XFrp0HkT+Y/l2jv/AAL/AA12/wBpxSu/6/Ah4HmOWks9RtJ9jxyJJXUqlOpuzkcZkl3rGsvBHBPP
+Ikaf8Ab/AIFS9hTT01IbqL+kb/gzR7geZqvkO6Wv/LT+7/00rlxn7yPIjroUvZoqeM/E8mt329I0
+htE+SNE+7u/v1WXYBUY2e7/ruZYmuZ2h6FeapeeRa/6z/brpxVVUU0zPD4d3PQdW0GfSPskyTpdJ
+NHH+/T5dvlfwx14FLGKd0eu6KaJ9Jk1O6uP9CndJ3/jT+Ksa8lfVHUdf4RtJ9TkurC8n2SQ/P5j/
+AHvlrysRDVOIinf6bs8+6SdPIf5Pk/1si769DCr9zfqKctTJuIIPtWyOTz0/5Zv/ABUQi5Rv1LqP
+Q73wN4NtY7mDWvte/wDduklp/vfL89fT5fhYR0lufO5hVm4nfRoiR7E+REr2uToj5+MmtWY97Da3
+OqXdr/y32Jv3/NuiauKrRjOR6FKs4xL9totjCieTHs2V5eaZNCrH+v8AM6cDmDjL+v8AITU3urOx
+2afA7u7/ALt/7tbYLDyw2H5TeMlWm7mZpOv3qy/Zddg8h337J/8All/u124XFdzDF5fGUNP6/E6L
++zbR5/O+f7+//Zq54a0jhuTXaI8D766p6RHzGBpF1d2V/wDZZo/J05/kgj+95c7f+0m/honuc9TV
+mJ8S9D1HU7qB5IP+JNDavBO//TWV68/Fw0PWwU+VHzv458FT+Gr+NH/eW91HvjrHA4qU0b16KRyf
+lCut1GmcCiiOkUFABQAUAH7ygBlABQA+gA8ugCSOSRI5I/M8vf8A6z/aoA6Dwtrn2G7j8+SR4P8A
+Vx/7NcmMo86OrB17HtfhV49X02d49S/eWX3NJR90sn/bOuCcHTgd1XFI7TR9be51SO112OBJ4U3p
+Gn93Z/FRgq0ZS9oZ4jD8qsXdf8u21ixmeD/Qrp9k8ib1/wB2qdp1eeWxULezstzUuI8f6LDI97Je
+/PB/dWL+5XRmEueFqf8AX3nPg4cm5lX+h+HJNOk0nUbRPtSfPBPs/e7W/wBr/ZrixWKWHw+v9anR
+Tjzz1ObXQvEdmPsmkXd1p+j/AHPPneH5qy+vVKUOb/L/ACKq0YVXyHA65oItxdtPHdvY+f5Fpf8A
+mfuml/26OapOHtP8jop0oU1yGh4Zn8IWWoxwa7BG9rs/d/uN25v9qtMu9/4jPGQtsafiy08IQeIP
+I0+wggsp4Enj+Td/rayzP3PhNsBC+513h3QdOjk+e08uCeBNjwfd+b/dr5SpiZznFHXVqcquUPFO
+g6VYak8OlweW9kifuE+75rV6+NU6UoszweK9o7GVpek/YtAeO9sI553n8+eR4EbyYP71aUeedS5O
+L92Vjh/EMWmz6lPJaxx+Q7/J5abf/HK7pVXz2NacbRuYUuj3cCPqtj8mz/Wf3WrVYmHwnJUoX1Oy
+8GeI/CvnWNxef6LIj7J49m5f96vFx2Dqu9tv68x0619DT8eX/gq6ed9NuP36fwInyyNXPl1KtTfv
+fodftlI4qC/kgkk8uOPy3jT7/wDDtr2KqU9zNysczPJb6t4jnnT95BH/AKv/AGttetTi6dKx5Smp
+SuejaT4QmutGt9Z89IbXfsff8vy/xV81Uxzp1GrXPWTTic/Pe6JY+ZB5kb/vH+dH3V31KVaT1/Qy
++sQJr7X/AA7PHHJap5P7v5/726lRwVeGv+Q/b0z0b4b67Yah4bvtP1PUkSPT/ntUndF3f99V6s8N
+7SjY82/s2c1r0X/CT3Vh/YNpPqMf/L/Bapt2/wDbT7lc2XZZ7FX/AK/M0r4z3SfwxpHjbwRq0jx6
+bawzav8AJpseoyI0q7f7u2vfpSt7p5tdcxd+IWseOY7f+y9X1K1g8/557HTvv/N/fauXFVb+6bYW
+lY8z/seDzP8AS5JP+mleY8W7HqexHwaQjyRun+r/AOelYyxjSsHsTXtI/sr70/g+euOrPn91bHRC
+Kij0zwDp3jG5vo7qGR0026dHu9/y+Yq17mWwkly9Dx8dKLZ63Z2FjZb0soEhR/nfZXr2PLq1jH15
+dN0+f+1E0p72+dNmyBKLBSrGrpxR7FH8t4d/343+Vlop0eUJVhtlaz229Hn85P4N/wB6tZI55SLt
+SMKAE6U3qSlykV0Z0gfyU86f+BPu1m1Y1jNnmHjY67avGiWkaSf89N6N81fE1cM4y9/+vuPqo4i5
+wWoz311psl7dTu90k+yONPu+VU0pKMvcN46nPzjU0jk8vzPskf8Ay7/3a7YTVmiHSHz289rAkE9p
+5kl6iPBP/dWqw01ZmDomloWhabHPaXuryeZpTvsn2P8AMtb4fEc9TkIqQlFHd+Jf+EY8N2v2XT7H
+9/qFr+/gfZLtT/f/AIa0zCc6VlEzwcJSZz1/4p1mC1tLuB57WP7nlwfLA22uOGYS9pb+vyOiWBSM
+TVdVu9Tnn1G9t/8AS7rZ+8RP4VrWrUk53OijTUCvHomrR2H9qQRzpB/z3R9tdlGR5zpWRv8AgTxZ
+rtx4stI9T1af+yoI3k+ef5f+B17FGtoeVicNzHudpqunXMEE9tdo6T/6iTf96t9zzrOJdzS9mNTu
+JjFPnJ5LC0ihKoQzy6AFoAKBBQMTZQIZLAk6bHTen/POs0FXUztf0++vLFIbPZ5iPvf/AIDSZ34K
+fKi9BG6QIj/f2fvK1OAnoGNpGgUAfnxXKdY+OgD2T4HeAINTaTXNQRHtk3wwR/8ATSvjuJs2dH9z
+Dc97LqHu8x1virXNVh1uPTNJ+yahI8exP7lp/wBda+k4dnH6qrfEz5nMac3W5kVLfwHpjHz7ud59
+Zd98l/8A7X93/dr1q2Cg1Ymlmrjv/X4HNePfCt1LHaWs3kPJ86Wk6fJK3+y615awM6Tv0/rzPUpY
+tVVqeR3dncWlxJBPH5c8f+sR66zEhpDCgAoAd5tJLQlVEbnhzWLe18yCe38zf/qLiN3SWBv7y1M1
+C3vGimzqr7Vp7q7/ANKn/wBLj+SP/pr/ALtc8ozcuZfCejTUUbWleIZrJJ7KSNIILr5JIJ9+3/e3
+U3iHTfMhzpxluS2umXumj+0dGkc30G+C7gg+ZWiaubE4CaXvf1+JOGxkKrvDY27jUNPu449Ud/3l
+r8klo/3vmT+Ja5qVWcdInViKlOas9zG8UWcc11JJB+83xp5caf8ALNaKuYKsv6/yHHDKnExNI1Gf
+7R+/+fy/+PiN/v1Spe6csMT71jVtLCO6n3wfOifPPB/FXk1avs/iPTUeZXOqu7K0tbW0m0vz0kdP
+3n/LLb/vUquKpVI8q3OSE/esxz388GlyZtUuYZn2f3pPl/vV5caSlU93Q7o1UpWZy7X9nN8TI/tS
+bN9ikFv/AA/Mv3a+iw0alTCqMd/+Dc4IySrXZ1lpY6ZpdvG/2r7FJcp+4O/+9XzynOvU97ZbnsJp
+FjSPD+pW11HO6JNHs3pOnzLXrTyuValzU/6+9nFXxiRtyaXO9x9qhtIEnf8A1cb/AHa6cvw9b2kp
+dNOxzVsTFIoaR/bkmounyWsaP/x6On3v9qvYVGftEznruM4HP/EK/Grz+RNH9lkspPMsJ0T5vk++
+tZ18VK+oQwUUQ+FLHUbywup7Z0tfs2zY/wB3c3+9XyeOnDn9464pRK+uabB9vzql9s1Xf/sNFs2f
+u66PrUpq6V0DpGf42t7T7VB5EH2Z3hTz9mzbu/6Z7avAyfV3H7Iz00eODTftwng++myNH/e10TxL
+nLlZcqMOh13gbXNLk1FIdTtPnmf93f8A3pVatpVKUY2f6nLOjU6fob/xA/sKy02O6tYEh1K1k2QR
+7Pmbd/y1rkdWnU0i/wAy1FnETeJdJurGS1/sa1kvkfel1MnmyyVVOjUWzHcwNW8c2ljpFxBp1pHY
+6lex+Q/kfd2t/rX/ANhq9jC0nKfMceNnyo87to/Nkjj/AL9epUbbPKgudnuul+DbfTdDsbWSPZqX
+nfPI/wAqtG38VfHZnVqe3al28j6Ki00XbjTZLrTrqP7DAiK7pBOn3vv/AO1XBRxUacrPVsblqZpg
+1F3jsvsMcM/lpBHJ/u/+zV1fWINX3OgZPBd2rxo8kkM+x/8AZaphOLGaOiXE82nXUc8f2r7Em+CD
+7v8Av1VSfs6qS2Oao/eINGeeCeOR4JE8yTZ5aOm7/ZZa9anR5Xz9DSo/dOzuLt7OaT7a6eWmzzNn
+y1cKVT2vM9jkq1YVKZs3HiHTItRgggn3/wBoV6sM0Up+zjv/AF5HlVcCpQujVspbf7VPN5aJJ9zz
+9/3q9JUktTglWVh8N9aQ3Gz+B/n31bknoZ0GrlTWtXsobXz7lN8CP/rP9qpr1VG0WdGFpSldotRa
+Ta3my5kT5H+fyH+ZaynTi2rGlLEOF0zV2V1znc8/mGSWsD1lPUOYHsbWSB4XT5HTY9D3GtTCS7vp
+rD7LeukLp9x3+ZZIP4HaprwujVTsYvjHwFpvi3RcXf8AoyWW+S0kg+7/AL1YQhGkjqpSdQ+Xdc0C
+80q/ktZo/wDrnJ/erKFRTY6mEaMySOtCSPy6AI6ACgAoAZQAUAPoAKACgA6UN6E8vKdJ4T8Y614X
+vvtukPGk/l7JPMTd8tKvh1OAnJs+hfDHjXw940sbS7t500/X4X8i6sfk+7J8m9d3365amXrl9z+v
+xNMNmfJLkqf19yPTodMu3s3srydJv+eDom1lronQi6XK9xTrv2nu7FOZZNKtrpLK1urp3RH+T/np
+/sVKo+xpNIuFX2lTQzNPh1XUEje6g85037IJ/lryMPhPay/ebf12PRrVuXY5PWItV1rVJ7CG0+1T
+2T/u5Ef915S/wJRioqS5DpoUUlzlLxRp2o6ZoUmkPH58d06Tzxv8y2zb64oZko/uf6/I19kpvnOF
+n0ye1v5LV4/PkT/V+X833aVOvzfCbuFtzX1mPz7+PUbSwk0+B40/d/eVayrVWnqbU4X2PSfDU8aI
+97ez/Yksk3+Q/wB3b9793/erXCZRCym/6/E8bE1ry5Tndc1vUdf1l5tLtHSC68mCT+Jt1GMqQqVV
+A9HD4b2UeYn/AOQNBd6frtw8N7dJskkjT7sX93/gdcU51KE+X/I2qL2jucXf67pX2CeC1sUSd3Ty
+3/2VqKeDrOak3p8jSasjIl1d4/M8yPZA/wA/lp91a7aeHTfMc9efLocvPbx6bqezzP3F18/mSV6c
+JOat2OJU+V3C81yOwuJEtJPPk8vZvj+789KjRk9xyrJbFHzNc1L9xBHI/wDB5cEddbjSjuc8pSls
+XLLwXfx2cd9PeQWqT/33+Zf++axeMWyClgmlct2VheTXkmnXV297aWv+r8h38r5v96uevUUVdIdJ
+SvY9Dl8M+FtM8M4/s2N9Qd0Tz/vf7VfOwzGtOpa+ny/yO50ID/DvgjwhrV3Pe3jJZwf6hLSN9jbq
+rG5riKcdNfu/yH7Cmdx4f+Dngl7rzMf2haonzxyb/lb/AHq+nyHFe2o3Z5GZysxPH/jG10bTH8I6
+FY+Td3Uf2W3ngdIlj/h/g+fdXpVaytY5KUOdHMxaTqXhu3tJL6T7b4jT/WXd1Nuisovvfu6yqy5V
+zHRSXMcx4r1z/hIdde98tLWT5E+T+Jl/ievFr1rvmPVpUrEE+k7NNk1G6n33e/8AeQb/AJq41iVK
+VjsuQSfJ+78yN0/56R/+zVooczC5oILi68iNII4fM+RNn8VLCwtKzMa0XY9x8PX2naTp1ppbyO86
+f6z5/N2/8Cr6CnmEaXu9f68jxK+ClNnUqN9eseTVgMZ/nRKApQCd0hgeZ/uIm+io+UUYmB4b8Z6b
+q9jd3UyfYvsX+v8APf5ayjXOiNG50UciOm9PuP8AcqzAoT6/ocMjpNfQI6f6xN/zUAaCvG6Run3H
+qtkXUjqcl4r8Q29trFjZefs8n9/Ps/8AQa8HH43kZ6mCwfOjzvUvEf8Aa9/fTWtvPdXwfZBv/wBR
+5VePXqNy/ef19x60cPYbrkGi6dHG8Eb3sjp5/mJ8u2X/APbrjVSLl7hvHQybSC01v/j6k+y3Tv8A
+6x/9V/e3O9XCk+ZlymE+myT6dJqM8iPHpGz/AIEu+qwtJ3Zg5k+i2UGoxwXs1p5M887vv/h2/wDP
+PY1c1WdSlPQ2p1Y1EX/EemyXv2FLXfO+x/8AUJuiVVrupUq8/ef6EU6qpsj023vIPDk8F9IkP2Xe
+7wXSf+gVwYulKGISLi3I446lrV1BJapI72Nr+/8AL8v5Y69yrCSSZhWpsjuNQnm8uB/k3/JHHH8u
+6qhM56s7GkPhtfJpMl7dSfYtn+r3/wAVdcarSMoWkdr8GvDH2XUZ57ryL2SFP9En+f8Ad/8AXOvS
+wte552MwyR6b4i16x0XRp9Tnk/dwfcT+9L/drsqTscNKjc4rwV481jxDdeTBB9qf788/3Yof9muS
+E7m84WPRZZPL/wB/+5XZA4KmgRp/fpjCgAoEFAwoAKACswDOKBe05QrQY2gBaRoMoA/PquQ9ARKB
+I9P8KatGmmR2SX7wo8f7+dN6/Ztv/ozdXz+Nh71+XX13PXwsVKJ6F4emuta8xEukksU/dzzomyWT
+/brD+2p4RfD+P/AZay+Mn/X+ZPdWF3NJaadJ5lzA/wDy3R9rx7aVHiBzi1az/r+6UsGomPrMd/Jf
+QefB9qj/AOWG9/3v93dS+sVJU77G6pIyvFHgOw1bTZJ9+zXE/g/2f9qrwuaylLXb+vI5cfh7s8f1
+HT7i0nkhnj2SRvskr6KlNNXR49am4oq1YgoAbVGY+OgD0/4faboPisCyut8GpWsbvIY/vzf3HVv9
+ir9gkyquPknb+vyOpFlquo2n9n6jaRwT6X8kl26f6zb/AKvymoxCaRpTqxSuZ1noniXR3+2wXfme
+f+/kt0+8y/3v7leRiaS9nY9OjH3TF1HxL9tv5Lqez8i7n2RybP8AVf79Y08MlTNKLszobSGO6tI4
+NO1OODVtn+r/AOem7/lnWEcPfc09uYU+qR+Xf2uo2kaX/wByT/eX+Kh0OXYftyPwjdwWuu2jzeZ5
+G/8AebKyx8eak0RhJWPYvEGq26WkdteonnTf6ufZ+73V8pldCLqX6HXUdxui6dbXXz28cc8/+x8u
+5a+1y7B0pUf3/wCv/tp4+Pr1Ob93/X3nCarYaWnxa0byo440ceW8c6f8tU+6zbq7M0pQp4a1D+v/
+AAI5spnUdZ+0/T9DotYGk6n4jTTrr/Rb7f8AvN/3dv8A0zr4mjTq0abaR9RTlE3L59e0nRp7bTrX
+7SiOmx0+VqjL8w5Z6u1yKmGUjU0q+n1CxgfZ5M7/ACSb/vLKv8Ne/g8zqU6bi+n9djhrUo82hFen
+ZNsMm50+f/gVfOVM1rVfe2+7/I76dKPLqQT6VY3mmvf65YbJ0+efZ975a/S+SnVp/vP1/Q+UhUnT
+dqf9fecO+pQvq0+l207waN5fn2m9Pl83/nnI39yvl8XQor4P1/U9+g6rV5/oc1qUV1HfyPNJsnSs
+6HvQ02CNKwy/v7u6tIEuv9XD9z/a/wBqpo04xk3HqbRlYWCMz3cbzfJv/wBZJWlWdo+ZpK512m6N
+4YgkRLrUfOn/AOelr83l7fu1y4au+f31ZGDbHaz4vs72x+xavHBdSQyf6JOj/e/3661KTMuWKOEu
+9QjtP388mzyPng2ferWFCTH7aKPP9RvZLy7kun/1k0lfQYeChCx8/Vq8x0HgPTNNvtSjkvb+O1kg
+ffHHIn+srkx1Sbg0jtwkD3DR9QF/Alg/+kxs+/8A65/7tfB4pyit7WPdo0FE6C90Wy+wXVslrsTZ
+8lzXmUa8nNNv5E4io+gzRrN7P9xeIk1j99J3/wBYtdtKEa1S+3cn2uhgeLNE1ma7kuWRPLh+5Hv/
+ANXFXrR9nGXLFE4er7xr+FdNspAmqI6W13bbPtcDptXb/er6LJKNO13v8zy8Y6lrf5DPEmoaP9l+
+xSQJO7zu8cb/AHY2/vrXfiqsW7HPgqE7lXTb2NLSNH/1D7P3jp+93f8AfNeNiM0k6nJH+vwPahgI
+qF3v/XmZXii1ks7+3aGTfdO7p5f+1/frBKVSfKa05c0eV7HT+Gta0aye00VES6kf/j7vn+75v8X3
+q+lp4pXPncThG0dTfWiMkE1rHvT/AJabH+XbXXUndHHhocrJpNLtJLFIEtEuoE+dIJq2CUi9a/6i
+P9x5P/TCgxlIlpmQ6gCrf6h9l026uPL3vD/yz/2qzlVaN8PRXwnF6nfaovhuQJv/ALRR/wB2+z/U
+/d+7/vVi8W0dzwUZe6YD+LPEV5BHZP8A6KkyeRImzavy/fZa8+vV5j04YaENirL4Qn1jVZNL1C0j
+kgf/AJfn+Xdt/wCeT0qFIyqyktjlvHnwC1XRdN/tTSpP7QtUTfdx/wDLWOvUaPDqK+x5I1vWMkdF
+DQqyR1QyOgAoAKAGUAFAD99ABQAUASR0AW7e4kjk3x/u5I/+WlBoz1v4V/GrUtFv/sOv3bzaVNJ8
+9xJ+9ljoOdn0bpurabq8Ed7pF9BdQTJ+7kT5q3cTnjIsR2bvaPC8+93R089PvVg6R0RrWOG1uR/C
+91BbafaXV753zvJ95dzfwrXnYmg4Qsj1sPy1Xdkk2jvqGiT3nlzvqM0++6+1b1WNVrgr5deld/1+
+J00cRFTsjidKsZ5I5IL208+6mn/0Sfft2y/d+WvPhKNX3TuqG/B4V12WN4L3YknyeZ8/7qRV/wCe
+dc9XBW0QU8RymGlhB/aV9BdJ5MEPySQb9zN/1zrhlUko6vU6lFEli8drfR3Wn2s8Maf8s9/+sqJO
+TjqWoxINZtdV8Satd3UMEnl/fj8/721a9DEV3zXepjTfLocjcWiQal5nmecif+hV0QxEpxstBzJr
++0+3W/21IEtYHfZ5aVhTqcs+UJx9255rqH/Ez1iSO0+ePzPLt/8A4qvqaNNU4XZ4Mpe1lY6jT/DV
+vYyTo/lz3UL/AO+rbf4o/wC/Xk18bKfodFPAuJpWCQC7j2T/ALt3/wCWHy1jWlOVO1j0Ie6b3jWW
+O20aTSI4N6SbEjnf/vrdXmZZFyqe0Y8XPmK+kfD7XJrWDUJ/3E7/ACQWL/KzRN82566sZmcKTcFs
+cNOIazb30L+TMfsXk/6xH+XzP9pazwji2enD4TmLC7u/tn/bTy69SWHjJHPH4j0T/hZPi6OCO2sr
+qC1SHZ5fkoi1sszbf9f5HnvL0v6/4Ji6jpn+nST/ANpQXU/z3V3d7/mkb+Hy65K+Nk5HfQpKJF4c
+0vUtZ1WCFIJJnuvkjkn/APQq6XhXVkclbEqkdnP8G9bTUvv2v2FE3yPJv2t/sf366pYD2aMI5pzf
+1/wChJ4a0i6d7W68vS5ER3jnd93mf3IvmrxlXp8tkeh7GxjeHjA91/Zc0myxun/efJ827+CtY4iX
+LZDvY6fU9B06y1GxsrX93GiO/nvXn18TGUb9QeInY6rQNO0A3V1JZO91OkG9LR0/dN8n8NfQZeqL
+pX6/M8rE1ZyNDw5ruo232qHU453ghRPIkRNy/L/tV34DGSmtTizDBq5011+9mtZvP8lE+d0/vV6C
+WpyL3ET+Ynk/6Vs+f5P9lql2M1e54/dWEGkeI9RtdX/48fvwb/8AVNEz18nnHNfQ97DYjQytZ8Xa
+xperWnk6k88dtH+4g/5ZKtbYbMqrXvfp/kKWGj0NTwNrmlXWuXeoeIJI3vn2PBBs/ir0MNiIKD5j
+llStsdNJ4s1/U7v7FBYT20m99kifxV5+IzGvUkpU1+X6o6vqtNf0yyunWeq3zpr/AJ9tdJ/A+xYt
+v91K9OFOlUanUfvfP9DGdSpS+D9Ct4lnsdIaCPT7FEsYU2I/3VZv9ivC4g5aj5Oh15dGyOVe41GZ
+JHmuvsTv/qIE+7XzUVCPw629T0lK7KVjpb38aWsKeS9nv+1O/wDe31tWrcrcn9o0UrF5NAv9eSS1
+0+fydHSRIfsqP/x8Sr/E9etgKlWD5I/a9DjrSuWdN8Ivczzp882o23350f5d3/AqtUMVPVf+2ke0
+px/plyS9vfDPkefdz/cfy7FNn3f9ytFmGLw2n/yP+TD6pSrf0zC8Y6r/AMJB4ekvX8+1jtfkj37P
+mb+7URxNaU9f0OujTUY2POrS/v7VJEgnkgjn+SSNP4v96vSgnJ6nLKLUjq7a+0b+yYL3Uf8AStVt
+f3Ecjv8ANGy/3UrL205zuyKdKysTxeNdV1q1OkXU8FrY/wDLSTZ/6FXpe159CKdG0rm/pfjjwxo2
+gT2sN2/9qfc89IH/APHa3pyjCHuHBUw8py94dd2ja5oUekQ73up5/P8AP+dtu7+9XNh6tec/+GOx
+ezpx/wCHO48D+Dbrw3oX9n/a0nkf55J0SvcpM8CsdFFBGn+2/wDfrWTMID6QBJQIZQMfQAUAFADK
+ACgAoAbQIWkahQB+fMkeyTFch6A2gDp/CX/HvcR95P8AV152Lnyu9z08FF2PQtBj17REg1S1Tz7R
+/kk2f+zV42JrRqKzZ6FNO51cGpXE2mfaoI3+f/WR/wCzUYTCKMXdGdeTOU0izuLrxL5llI82x/Mj
+j+9U4utCFI2w1JyOpS+eGeSC9gd9j/v9n/LSuCKtHQ1n7zOe8a+GNC1iwke2sXi1LZ+4nT5E/wCB
+LXVleLq05Wk7o5sVhE0eL3lncWlxJBPHskSvsj54rUxDaozH0AaOjatfaPfwajZSbLiH7n/xNNNp
+iqRjax7nN43h1PwvBqNl5iX0n/LNP3vlyxfeWSta9dKJlSwck7nOPf8AiJNFk1Hz47q0vneDy5H3
+MrfxbVr5tOUmfTRj7pyj+W8sc8kn7zzP3kdbxTehyxlaRVt7+4tLiTy5PM2f6v8A4HW712FZj7i/
+u7q4knnkkeR/nk30LQLE9nqc9jfx31r8ggk3/vPmrmqUeaNmaQdj0rwx4yF9N9i1Z0hk2P5D/wDL
+Ovl8blrp+9A64yuNsPEV3pMklokiXWx9kH8LR/P/AA12VnKrSSlobfV+WWhS+KEd3NeWGqSQeQmz
+yI/9mWKvcwdPlwyseQ52ranO6b4a8W69H/akG+9fzNkkm/8AersqlBONhuUondeAfGusxSfZtXgk
+vEg+5J/FHs/vV87jMmVSXNDT+vU7aFaRs+IxcXN3/bvhu7R76y+e+gg/e+YstfZ1MPTqQbX6ng0s
+VKEtTI0r4j26XUkGtWm+RJNkc+za3z/30avPwWGo0E01+Z6NfEynHQ7a88QaQIPs0kiPBeps+/8A
+L8396unGZhRceX/P/I48HgKsfe/y/wAzlbrwpcHy44Z0mgeTzPM+6zfw18vj506Ubo+iw9SU/dZD
+f+HtGvbvYUuk+zfIN/8AdX/lnXlxxk4x0tqaOnYz/EtxoWkaVD/aGx4PuWqfeZl/6Z1tgoVa1R8l
+79TFySPPpPHmnwak91pyTwxp/wAe+/Y3/fVfT0stcVaerOR5gjLPjK6gk32Ufkf7/wA1bxwEW9TF
+5iv6/wCGMifWdQu/v3H3/wDnn8ldaoxR5ntpMgt7e9u5NkEck8n/AH3WqcUPlkzvNI+Eeqz2Mmo6
+xJ/Z1qn9/wC+1efWzKClZf1+B1QwiNYeHfBelaZdpazyXusyR7LS7T7scv8As1yfW5SlbodsIcpo
+aXZ/Eyx02B9F8i+V3/1iInn7v9qvNxDwdaq41Lp/M3nRqRLEPxY8S6WfJ1vRZIEd/nuPn+X+9XRQ
+ynDxXPDV/P8AzOOU5I25/FelardfadJ1JHnvU8mf+H/xyvNrUa1SretHl+5/kdnLodF4tuJLXw/J
+ZI/2rZGnnz/8tflr0Hi3BqMV+JGHjqZ/gpk1e0u31ef5LVEjjgT/AFu1P9mu7A0Eo3RljcTqc1r9
+xoU7yf2XI+xHf7/3W+f+CuXF1buyN8HJtXNPw74zhgt/sWoWn2rf8nn79u1arCShQqe8Ri+Zq6Lm
+v2tvpl7Hr1rsmg+R0gd933q9LmjTqe1M6U/aQstzlU+z32pfP/osE7/9+9z1w875zqqQTge3aBol
+rp2kJZJI90n3/MevqqNO8D5CpVtNo0kSBH8lP9+qFKRITTOeUh9BY+gZRnhke7RZkT7K/wB//gKU
+pxSLjJ35jG126ksP+JbCjzPdJ5Mf+ytedVqJHtYWlKS5jAs/Dmr2s/kTSb7V/wDUIj+a0bN/HVQw
+pOJx8UtP6/A7CDTba6kSa5ggeeD5I5PnrthRUTyni5yeg/V55HtZ7WynR9Y2b4LVHpyRVHU8j+J3
+wd1XUdN/t6xsUh1ZP+P6xtfuy/8ATVV/v1i0bT0PBLi3kjqBlGSOgCOgAoAKACgBlAD6ACgCSOgC
+U0GjFTrTOdnQeG/GXiHw1PJdaJdvazvHskH3/l/4FSjWuKVCx6H4b/aP1zT7G0sr6wgvfssn7y7+
+7K0VdEZXOaSse4+D/ib4R8U2KTWl2kM/3JLG6dFlWX/2apUPduxxqSpvlQ3x34vTTDHpMMEl1fXq
+f8s/uqtcGYV1KlZHs5ZhJSnzM4rXNZfS49Sh2PDfPs8hE+ZYW+XeyvXz3s4w95Hu0/eMjS/F0iSS
+Q3t3vgn+/Js81v8AvmvPr06s/eX6BUw5PZJdeIL17NIN9kiO8c/3drfw/LXFUq8kbyfvf12OmpFn
+SaLo8ei6Vdw3qO8z7PL3/wCqk/3H/hruwmY0uX39vn/kcM4yINA13RryR9PgtHnvngn2bH+Xb/cr
+py+hyU29zpxb5ZnJ3fh+a1j+1JB9pgmR0jf+7trz4YqM5tPQ2qL3DnviLrFxpWg2miP+4v7v9/5f
+8UUDfx7v+mle1lmVty55f1+J52LxHLGxl/DXRLF5J7i6/wCWiOkHyf8Aj1TnmIkkox6CyvDcz5jt
+fEOgabpkFolq/nTunmSPXj4eu5M9WckVIPh/qv8AY0+qWUG+4hT7VH5H+zXo4XEOVSxwzepM/iyw
+16/gutQ02Oe0srV/Mjkfb/pX+6ldMsPSo1G4vR+py058xnTalfagILr7XOkiTo/no/8ABsrjjBU7
+qSu2d9OBp+MtK1We3guXut+xESP/AJa/8CrzsvrRTtbqaQ+E5zT0sPMtESCR5E/eXccj7lkZf7tf
+QqvGxzR+IJI0kSe6tY/3H/PNP+WdcKmlIupdmlpPha+nsZNQmjSHT5Ef/Sp/4a5q2Mip26k06bId
+HfVVf7VZXbp9i+Tej/Mqy/3a7JYydNmdWhCodXrvinW7G3jSCe6m+1Jsnnuvut5X8EddE8TUqRMo
+YOnH+mZcf9papaz3U8b/AGRI/wB3Gn95f9qvLbpxlp+p6d7lnRdJjsvIur20+2vMm+CN/l2sv96s
+njlGTS6f12D2NyC1nk/tNJrqd0j8zYk/3v3VbQlTlO/T5nLVPQJNSj0u4kurW0/cJ8lp/wA8pNv8
+dY1K6p1Lr4TGFPmOftvipqmn2jpa+RPJNO7/ADp91Wr6Chjo00c9bBtsm8O+OtRvrqeyup4Envd6
+QaldfNFCv3m+SuyhjfaM5q+X6f1/mZFrqc+l+IEutR36nY207+R99Vb/AG644Zg1LX+vwOmeXq39
+f5nQazqI8ev5drssvsSf8t3/ANZu/wCA1zZpj48v9f5GVLD2Zja54I0qy8N/2giTw3yPsdN6S+Zt
++9RPE0uRcv6mcMNJbmJoY0a6vp3f/lps8iB/9b8v+3XnZj7RJcp1xpW3PTvCl3cJcPc2sm+CFH3w
+O/8A6BXRleLq06Tcv0OKrFOascX4y8Valc3rom+12Pv/ANquKg/bSdSb0PZdPkhdkemeJ57qwTS5
+rR5p/wDlnffPL/45WsoQkuW+rOalHlRpa5pF20Gmve7LPzP38nnfN5Kr/fWsKuAlhFrrzf15lUpa
+lHU9VkFpdfI8OnJB+7nRNq3Ev975q46VK6invc1ruxo2PiWBLWxngg/eIiPO/wDtr919tehPHOFR
+OPQ41K5yereM3ttdjvbKeT7++ePftVq78Diai3/Qyq0oSHTeINS1bUp9T1CP7Lv+eN/7sX3ayzCp
+KZ24SnGJV1bUDH4cS18z93PO/wB9P/ZqyoOpKX/DGftGmUNA0d9dvv7PhkgSd/8AV+e+1a9nDYaU
+paixNdRRPrvhOfSPL8795vj2SSf3WX71ZVW4zsjWnK8blzRdG1JIIJ/7J8/5/Pjnf+6tFSjOLuRT
+qXdjpJLXwrDZR7LB9T1G6k+f+GKGvQo4qnR0f6nBUc6jOkj1eO1E97pOmzw6ra7Eu7T7yyRf89Gr
+vjir6xMcTh+Ve8dJ4T1nUtX8+6uvkg+5BabNrVpSZ5lU6MVtJnPAK0GRyUAMoAfQAUAFABQAUAFA
+EVAgjpGo+gD4X8cWFxBqcc8/l+ZdJ5jpG+//AL6ryMvn7p7GPhZnOjpXYtzmjojoPC1xb75IH8zz
+H+ePy64sVHTU9DBTV9D0/wAL6zcJbwQeX56I++NN+1vmryHUo03d/qenUpVJLQ6Oa1f7DdefP9ie
+H/UWm/b/AL9eJLFSnU5om0YxNTQoNF0W0+2wzJ8+zz53fay7q8vFSq4ifK0bJxOf8WeJdKjeBrP9
+9vk+eNP9qvQy7AzldS0EpEP9ph7uDzI0m8n/AFkP/LLa38NbTwzpXVx8zMT4geHY7yCB/IS2nmTf
+bom/93/s135TimpPU48XRVRHkN7ZT2lw8E6bJEr63Dy51ofOVKXs2QU7jsOo5gsTx21xJH5kdEXY
+c43Nzwvq2paNd708z7JP+7njgfa1Y1ZXNqSsX455EuI57STZ/wAtPM/265ToKtxJvkkd5PMk/wBZ
+5lAyhJL/AKRHVtHPGoW45fM/4BWEkbRqBI8aGtZx1IcdRY/MrOcbHRbQ1LTVJIP9f88f/LPy/wC9
+WNahd3NOe6Jb/XdWvoI4bq/nnggk3+W7/wAddMZWjY5/Y6kmm6rqtimy1v3gg3o8mz+8tTzuCaiX
+Vw8VK56slx4R1fyJ/taWWqvGjvfI/lSxyr/s15GGw2IjWcr6fI6KtRKJmePdCvNIng1TS7uOyv73
+55Eg+Tzv9rbXqqNanK1/yOaLbRkxBNUkkTW7Ty9StZNl3PG/zN/wH+OpzHm5btl4ahdmvodrA7x2
+t6++1R/3c/8As14kYqc1F7HZWq8sbrcteI7V0u7eS1kTyHT+B9y/LXZmltIrYnA2l7z3Ket6/oul
+aci6hO6P5bvsT7zV4GFwlSrP3VodmKqQprQ8d8VeK9S1+7jmupP3ECbLSD/nmtfcYHBww8dNz5yt
+iedmCldDZNySCKSeTYnzyVEnYnkudjoPw4vr395cfJAn/H3s/wCWa/e3PXHicyUX/X+RtTwSR3nh
+LQNP0q0uNa0uB5k+TZJdJt3L/s152Kxrlod8KSRp6rpniPWtJn13/WWNr/y6f3V/2VripSmzWjCK
+OO8ofZ/PT5JE/wCWdbNdzeUIs6PwvdzfZbvyX+dE37//AEGvNxlKLauaQkix4c8QCyjuk1He8Do/
+kQP8+2WtKlGMmtdjGs0cNd+H9HefzPP+wyf89I/4Xr3sPipMwqYWMFoSL4x8VaBHJve01WOdNkc7
+yea22upUIz1Z5lSrJPQ6HR/EPhrUvDe/z9niBP3klpAk2/7/AM1cs8uVNuf9fmdVLMW5f1/kUkvI
+0G9I/Pk8zZ5b/wDxNcM4JxbPYnVc4k1xPaPdv9lR4I3fe8b1yxTW5j7M3L/WbDVNJgstRjngu7Le
+lpOn8St/eroqSsg9mVdHtZLr/UxyTJBse7jStMLBSnc5MRVfKe03eppYaDBe2sE80aImyD/lrt/2
+q+tjKMI3PmVRlORTg8Q/atAn1qH5PJ+R9/8Asfep08UlEPqrcji9S+I/iO6+e1t5IYEj2SeR8zMz
+fxrXnTxd5HqPLbx/r/MtR/ErV4Y49LngSO+2bI3n/wBbu/hrN5nJx1/r8DRZZB/1/wAE2NG8VavH
+Y+TqLwQX29/nf5q5KmeSpx0/r8DVZTD+v+HNbSdTTU53uprqdEgRP4EgX5q9yFeNkjxsTQle5qy+
+H9HuZo714/tMn8Du7tV1KCk7ieJcVY0UgRPkRNkf+xWpiOeCN02UAMSxtEd7ryE8/wDjn/iqALMb
+7496fx0AeO/Fv4JW+qxz614bj2al9+7sf4J/+uf+1SZoj5tu7OSC4kR4/Lkj/dyRyVlI2iUZKQwo
+AjqACgAqwCgAoAkjoAfFUASUAFWAUAKs7p9ynSqWOWtC7Og0XxzrunalHeyXcl1sj2SRzu7fLXHi
+qPtD0cHKyOs1L4wWd9HHa/2bssd++T5/3v8AwGvLnlFZrf8AI9COZP8Ar/hjQn+Ifw9vXtH8m6tX
+RNk7+Wn/ALLXFLKK62f5f5m0cxf9f8Mei6Prvhu1sXfw5ex380/3I9/7/wCb++tfL1cJiXJe1jyr
+5f8ADnXCrSq/0ylbxar4jkT+3J0srSy/18j/AC17mBwtNbfqbOTh8IalawPO82gu9lYwJ5FpBGn7
+2bd9/wD77rpxOP5ZKEFv/XYiFNWuzsPCtvYaN4Uuta8RxpDBZf6zf975f/i69vC5TT5eeW/z/wAz
+wsxxvI7RPnkzR+OviHJdXvmQ2N1P9yD70drF91E/4BXXzLl1MqCu7nS6Zdx2X2eNPMgtIN6R/wAT
+LE1fN16bc7vY+io1Lqx29/J4RutAuNRnvvP1hLWHyIPu/wDAa7p4ei6blL4/mckXN1CxpN9ff8IW
+6ef/AGfIiP8A7O6Jq8CrjFCUVD4l/XU6Y0b1DmrGdk0qCFE86Gb57rYiN838VDTlVut0dUuSJsaF
+oVpa2XnXVj/oM90n7if/AFvlf3q6UvaV05r+vkYSqJ7HS654L8OXugSXGn6k9lp0P+o3/wCq83/g
+Ve5PA0lL2q/U8iliJp8h5Dq0G+43/uIP4JPITb8yfx1wzxT5uZHqU4NaGn4X0mO6tJ0eREf5ETen
+3mZ6xxkVvDb+u4LQ330Oe2tPs1zqKPYv8mx9/wB2vAp14znorM2jUsYN2lhBpvkWVps+w/6+7/iZ
+t9e57S9S7FHY0pNCu38P297dXf8AosP+ok3/AN/5mVV/2anFPklzRJjozS0b7LPoUH2ZPnR/nd32
+tIy14+JwtSMuZ7P0/wAzQrf2rJq127p+5voUeCfe+1NtXKnyRUX1AffalpdlPaq9r5jp/rI3/wDQ
+qxw1OTbd9AKduk+qefNDJsgtUf8AcTb9vzf3K6pyaWozDsYPtupJZQf6z/no/wB2u6UnbmEzp/I0
+fZY2wfffQfJ5fyMq/wDA686VSUHzmDOp0Gyh2fvk3vv2IjpXiYzEzkywvfsVtPdXNmiedCmyeGH7
+3mb/AJPlpQjOSSltfqBzdp4pgee+gmtXmkm3pHA/8Lfdr1JYDlS12M/ZGJpXh+fz57pDs2f6uNH+
+ffXdOulFXH7M3P7R1XSRv090n/56T7P738D1m+SsuWQ1S925tWHhO68QWk+pavAkMcyb4Hh+X/vq
+vUhliw9Dm6f15nnLG+9ylO++y+GUt0gkfUH/AOWECferw4ydWoprRHTUVzNB8V66kkGr7LKx8/f5
+E3zTyRf882ruxeNpxjprL5ipqxc8VXKTadHBqE+yy/5YeSn+r2/dWvOwlWUpegexPPINVvrKTzIJ
+P3f/ADzf7te/ChGa1K9iW9Bu/D7vPPrdhPez/wDLCOB/Ki/2q7VXUVynLCk0WJ7601TUoLLTrRLK
+B38uOPf/AOhV5danZuR2wVi74t0Wf+zYYYXd3h2efAif3v4q4cBiLVG2jn9kcxb6Rd6X+8g3vdp/
+rJE/hr23jFzXH7ILeed59/398m/y3reHuSuzNw92x6jq+tx3XhREmd/t0KIkEH+qi3V6NWca8bHP
+Qpcsrl7TglrpdvapPHPdR/J+4Td81fI4inVVdP8AyOyKi0dr4cEskbvNs+1fck2fK3y/36+5wM+a
+KTPFx1OV9BviLxD/AGHD58+x4H+SPZ80vzf7FdUpqGpx0qEpsj0fxrpuqXXkJ8n9z7/zVy0sdzTs
+dVTA6HQoA/z13TbZ5/IhcCiDaDkRHszVWsTe4/NFrhewVIgoAKACgBlWajNlABsoAfQB8R+LtPku
+rf8AtFP+WH+s/wCBV83l87No+lzOBxp6V7aR5Etie2uZLeSN4/kkSolT5lqaUp8ux2Oj6z4k06Pz
+30z7Vbv88cjp/wCzpXk18NRlu/zPTp4qpbT9DoLj4p+KZtN8m90hHdPnS+2OrKtcDyKhCfuP8/8A
+MuWNkivdfGTUr2wjtW0myd/uSTyQ72qqGQ06c78z+9/5nNLMJf1/wxmQfEjVfP8AMuoIJ4Nmz7P9
+2uyOVQjG8Sv7UX9f8MXdB+Ilta+Y+o2kkz/8sJ0f5l2fwNuqZZXFy1f9feH9qL+v+GN69+JPhvVr
+S1F7JPDOm95I9m5VryaeS1aLdv6/E6oZjD+v+GOd8aXmia5aWs8N3B59lBsS32bGavTy6lWhdNdf
+Izqzp1DiLeO4T94kHyV7Fzz7E1xJ5f7zy/8ArnSuFgtpLP8Ad/u//HKKrsFFXLFxHcRx77T/AFf/
+AEz+9WMHfc3mrE+mSeen7+SokrMY/wDd+X5cf+s8z/WUhkEdnJPJIn/LT/Vx1bZzxplv7NHaQb55
+P9ZWL1No0yTT9Mkuo7ieT/WJ88dvHU1q1pWNYRuWtLt/9I/f/uI5P+WlRXqe6awRau9Pk07V57Xe
+l1s3/OnzRN/u1NCvzRuXOlZmdJaSPHvSnGd2Zzlyk8G/zPLk+dKzkly3Q/dbOt8MaRoseuWM97vn
+tfv7P4vuVwYrE1VD3TpcItFzx7qP9p3Mf3ylk/k2Kf7P8dTgZVJK8nciNCyKmka1Jp3kR+RBdInz
+/P8Ae+b/AG60xdP22ly8M7M9L0210bxNocllInk3rp5/yfK0bfwVrlGF+sNw6o8/Mq3spXexzcMu
+rQ2d34Yg+yzaxazp/p/3lji/+KrXHVqeGjyz3KwrdRcy2PLviD4f8VWl1/aOsSfbkf5Evv4P93b/
+AA1vl2OpT0p/r+pOKwk6e5ydnpV5fySJBHv8uPzJK9SdSMNWcEMPzskis/8AVyT/ACW8n/LSs2x0
+3c1tH+ySav8AuLfZB/yz/vVlJnfTgdcmo6tpdhf/AGKNPMvUe1n3pu/dNXkqEZS1OmpSaNfSviUm
+kaF/ZEGjf2jJ5CJcTvvT/wAdrtlRglqefUk0JJ8cNW+wTwf2ZapJ5GyDZv8AKj/4B/HXdGnBmc6k
+kcDZa3qfmSIk8ab5PMk3pXNVw8TelUkztd3iyCwjjtdWtPsrx7PMgg+b/wBBrynOi5tcuvqz0YUG
+WbX4a61q8cc9lfyaj/z9/wDLLy93/oVdmHnScG+UxrUWdT4d+Dvh4b/7XjnnkeTZBIj/AN3+/XoQ
+pxTPOr1pLci8cfCiyt38/TNM/wCJckH7x49+75aqth5PY2wtWL3OBh+H3iC3WfW9Ak8uOyTz5N/y
+f8Brm9r7WNmVXoqDN34e3Wi69fST3t2lrd2v7+eN32t8v3/LrjlhGpWOlYxRQ24SO91OdII5J/Ok
+fyP70ledNWkdftBnh61N1fyJqD+RBv2RyP8A7H8NTinZaB7Q05/Lvr7yXjggjT9x5iJt/wC+qzoc
+0I3LqQi4mpovh/xPdQT/AGW7uoIE/wCPS7gf+H/lp8tfQc0pUbnlU5RjItWvhDWb2x+xQ6tOk6T/
+ALyB0Tyv726uGniG0a1Ukyhq3h/xp9qjsrHU/OnR3SSBE8j5vv8A3q6sLTcmOpWsiO68P30OmR6p
+qn7i7/5b/at/mt/d+dvvVWKwjcNDOlWRo+Gr+PVH8iSBP3Ef7vYlfN1rwWp6dOSsdJBo11ZvJDdf
+vo71P3Gz73+4tek+eMkjhbjKJ3umJdJp8Ed1sSdE+fZX2VG/Kj5rEtc1i5VGY6gCnqOpWtlayPdS
+JDGifx1AFm1eCaBHT54HT5KAKnh+0ntbWeGb7iTv5G/73lb6UjSJ5B+0F4BsJLD/AISTT7TZdh9l
+3Ij/AOsTZ/crKRtE+dJI6QyrQAVABQAVYB5dAEdAElAElQA+gBlWAUAG+koA43DOKewublI81N/M
+cZIl82ny+Z0Rkia0v7u1nS6tLiSCdP8AVyJWUoxnpMjkt8J0l18UPGtzHsutSknj/wCWkbxpWDy+
+m/hOiniKkTXT4w6sbvTZvskCPpbo6SRp8zIv8L1EcJBO9h1Ma5aI6T4lfGxvFfg+x0yGP7LJI+/U
+o/8Ad/1S1387asczp21kavwng8N/2Pppstn9szP/AKXfXSfu4H3/ACrG/wDuV5OJl+8VjowCvC50
+XjvTvDGnwWun2aPBYwvN5l98jfaJ/l+7WmYUk6asdmBqXnYzNd8M6FZaJo15azvNJe7/AD5P9n/d
+rz69FKEU/iZosS3UOp0bTdD1fw5d2T30kkCfvpI5/ll+VPljonQo0oN/a+ZfNN1BvhXQL6xnkdLR
+N91A7o837qKH5/v1nhaFdTbt+RrWrwexW1HUpLa0ey1e7n+3JAiQbNjLJXNia9SV7rX5HRhqamZf
+iDxxa/8ACOQeGdOj+1WqIjyX0/yt5u/f8q162NxUIw5EedTwk2+dnCzwSQ3ex/Lf/wAerxltoenT
+1Wp1OnJ9h8N3Gyd9l1/rI/u7WrGOJs3ExkdwmkXV14RgtoHe9vrqNH+592sFl1OU+aHxf15mEp2M
+KTw/qVraalp7okkD/v3n2bpY9tbSfPHmR0yepQsbuSCzj0j9xe2l1Pvj875f++XqK1S1LUqS0NPx
+Ha3cmlWgd4bO0sk/dwIn/oTVxf2o6z5LXLOO1awNrcI8HzwTIjyf8CrtpVoz36Ad9a6Pa6hZJvj2
+ecmxHm/eybmrwauKlTloBheJtKsdJtYLO1uv+JhJ/wAfux//AGWu/CVHV962gDLfQJLPwrcXl/P8
+lzseGBP4tv3ap4/mqezj0E2N8CWJS++23tp50KfIjv8AwtSzCqlDlRjI7rTpHtribe7zQO++CB/v
+R/8AXOvIhLmaVijm9E0uykvr28+2u8m938j/AJaxr/00rsxdZxikkBQeHS4LtH0+N5rqZ38v5PmV
+v+mldNOU5Jpk+0LMlxa2XkJZXWy6d3S62ferOMXKN2L2g7WIbu92QeZ8iR+dPJ937tTh5q7l1Gqv
+u2Lk/iHx5daMmk6FHAlq/wAkGpPsaXyl/h8mvpo5qnQ5Z9P67HnrBe9zHHx+J7uykkvdj/2jMnkT
+yT/e/wDsa85YVzfJ0O+nG5lQ+JNVknjdJ/n3/O7/APs1bzwFNe6FSNjV8avd77VHk3+cm+PZ93/e
+rkwEFrYOcytNggvfk1F/JgSP926fertrxlDVA5F2B30ify/kurWB96f3W2/7dZwqczuaezKF3fW9
+9fyXXkJZSP8APHBB/qq6qnvILF7Rtc1JL7/SpPPtX+/I+/8Ad/8AfNceLwy5Lrcw5zfuk8iffpN1
+52nXOxJ5ETdtZq4YRfL7y1Fzhb6LocM/+reOff8A6x3+61bUJVZzUWa+z9256r4a0LTYtLxdJBM8
+z79/+7/vV99gsFGEE2fNYjGcsrF7U9IhuYJPseyG+2fuJP8AaqsRhFU1RjRryizj/ER8T6baQeRd
+P/as3yeXD/F/vNXhyp1ITsj2qNSM9zmb7QfFU19Y3V1I8198iWkf/PNv9ut8RVfPym1Okooo6hrt
+9os8Ft5D2WsWTv58+/5G/wCAVLj7J8xyVJXZ6LB45T/hH0mSNLrW0j8x7FP4q9SGOTPJ+qMyvDnx
+Wkup57XULGf7Wj/JHCn97+F91KeOSD6ow8dfEXVdId7XT7TZs2eZfP8AMm5k3bK1r1rFYahczfC/
+xasIbTZrUk9zfTP+8n/hVf7tFCtcMTQsen2t3BdQR3UPzwTfPHXUcBPSAKACmAtUahQBHQAUAfJ3
+9j6yNIkgurH/AEV/3CT/AHm3N/u18RGrDnUkz7CNPlieW6jaSWl5Jav/AKxH2V9NSqRnBNHh15cs
+ir3rWxkmej+AvHE2n6bd2SRpNdOmyCR/vba8HMMApyv0PUw1XQ67RfGjzyR2OtTvGk/ySb0/hrzf
+7Kg5c3b+u51KvzKxm+M9CsvCurad4p0iBHsnf9/aOny7v9z+61deGxscU3RfQ5+T2Luegr4Z8J+K
+bSDUJdGgVH/eQbPl+9/e2Vnw/iOStKjUd2icdQ5olbWfhJ4HeX5LDy3/AOmDulfUwxEa8GodDx0/
+ZyRyk/wo8Kwi7tZr6eC++/af88v91q+fnj8RTqckl7q9D3lhadSF1+px2p/DO/sJo4ZryNPOTfBv
+R/mr08HjY1J8sdzhxFF0o3RXstKuLewj8yT5P+WdYVa3v3Z0YejYq6rb2/8AqI4/+ulVRlzSuhYi
+NiC3ij/5Z/8ALOrcmYqKRPH5kfmeXHG//PP+/UOSNVJoo/2V/pGyP/WP+8/3a29vcj2JJJb3EElv
+J9ySOT/WUlUK5LFqO8kjk89/9Z/rJJP9+seUrmIY4N/l/apP3kn7yOOq9AuT/afsN35ljJs/56f7
+VTy8yNKdWw/W9Ut5J43tI5Ej/wCWkb/3qihRsKpVuMt5fMePfJst4/3f/AKuTH9YbRp2esSQWM+n
+R/PazPvj3/w/7Vck6HNJMzw9dpljQ/s8nnwSR7/k/wBZ/ErpU4l8ruduGVza1DXvslhaQeWnmQP+
+7k/iX5NtctnW0exvXkomRJq8iSJ5fzyJ8/l/7VbxwhzTqKRd0izu753uv4HfZ8n8LVzV6ip6GtKi
+aHiXUr+101IbH/Rb7y38+RH2/uv4Nn8dbZTV5W7MnH0bmd8ObiAW8nmf8faT75/n/e0s6vIMA+Q9
+D16203UIJNF+2+X9sT/U3P3dzf7f96vmsHKUH7Vr4X0LnSR5rcWnizw9HP4XisI4Z54/nvE+bzIv
+9l6+spYnD4iKrb29TinSdzP0jwWI7+P+0Y/PtNn7zy3/AIq1r5graMqGXpf1/wAE9H8C2Hh6XRr3
+TrLTkbVPuSSP825f76f3K+dzXEzU4yb907YUki7Bs1OC10Ozh+zT2T+d57/89Y65ZXpTdVvfQudP
+mdzsNPh1J9Xu/Pgg+dEhd9nzMv8AHsavXyvJfbw53t/XmcWMxipqxieJfClv4cv01nRIIPsM/wC4
+v7B081dzP/rNrV9ljZOlByR5WFcaj5DiPGHw50+WxOpWP+hXc/8Ayw37opG/i/3K+RwOce0qtS2/
+ryPTq4ZW5DH8HSG0upNL1T/RZ0TfGk//AC1rbMqKqe9T/r7zahU9mjo9ZPiHRZINRgkeG01SD5Nn
+/oLVvhcPKnC73I9p7RndeBvHVjcWtppmoRva30O/53/1X/fVe1l+Mi4cp42YYJ83MdZrXiLTtLi/
+fv8AO6fuPk3K1dlatGETgw1CTmefa34yjv7efToIEhgnjTzNn3l2v81eFjMwbXuf1+B7+Fo8i1PL
+PiLoljZatHqOgRyIjpvuN/8A6HU0KznG0yK8ddDsvhV488LtaQWWo2iR6zvd/t0/3f8AZ2UsVRhB
+OaClVlUN7W9Ajk1yCTyP9BnT7VPGj/xf8tK+Wp4xVLtI9aleKH6PDo2rXtp/oj7J32SSQPuX5a9T
+LKUo1ORnPi6vs4HbaTodz4dm+y2CO+nTSed5f3tte/yVaU7R/Q8tOnUXvfqO1rS57rWEvLOdLWR4
+J0/4FF91qeZU5wlzRM8HUUo2kcV4t1DxPHHY+dsSd49+9E/eyeU/8VRXxE5UveOqhho3sizdXv8A
+aejabpeoT+d5+945HfZ8q/LsrysfjakqaX+RvQw3KcXpV1faFfeda/vI/uTwf7P+xXDOEMRDlkdr
+iz2zw1qOiatYIltIjpBs2QP/AK1Wrs4evBcrPJzGJ0NfaQkkeA0MnngtoPOmfYn8b1mVqZT30ial
+PNa3yXtqkHnT2P8Ay1X/AG46A1PNryC+8deLfP0/emmxuieZP91dv3/lrjqyvI9GhpE9Tg1G1s5I
+NPvf9GdE/dyO/wAsn/A66Ukkcr1kaM0vyP8A362jFHP7S5Hf6bY3tj9mvUSaD/nm/wB2sao7XPDf
+iT8B7OSBL3wpHi4d0SSx3/xNXPOHU9Bz6HhuveGNa0e7kttQtHtXT5JN6VVOtz6EextqY+w09UR7
+S4yl7RlWuLSLCgBI6ZkFAB+8oAkoATzaAGf8tKAJKACWgCOSrAPMoAPMqACgA8ygCSgDd8L62ljq
+FvDfXc6aS/7u72fvWWJv+eaNWc431Choz0xdR894LGffe6NZQOmk/J5ErPL9ySSuKdfoe7RpcyOu
+8EX3hnT55NO1m4jeSZNkkE6f6n/c/wB6nhacI6yIxbnPSJgz+J00TUZ73Rt9raPP+43/ADV51Wle
+reB00otQ987bwzJrfj7RI08Q/Ppen3Xn3c/+obbEn3Fr3W24HhTUVUOM/s4a9HrOr6XsgsdM+d4H
++XbF/CqV4+Koto96jWSMCO0nkg89438jzNkcmz5W/wCBVx1o8p006ly1aPHBJv8AL3/5+7WFOQVK
+dz1LQ7bRvEdr5PkJp9pdO/kfxbpf95q9algadRXPLnipUpHYaZa2uieEP9K+d40/fyJ/C1bYihGj
+QaPPpTdeschaXdnexalK99s3v/rH+6y7Pu18zSnTjT9mup9AjndDtESee5uo/wDRYX3wI6fLu/v1
+x4qMoQsjZGvrmj3V/Zbn+5vR4YUryMNiFCVkQXoNH0908loEff8A8s3rKdebldAY2ufa/DdhZXKv
++/WR0srTf5jf8DWvo3lTj78nv5f8EijXfUoaPoc17v8AEerSJM7/ADx7/urXFicU4fu4I6pNSL1z
+4x0O/uUhmT/iWInzyf3WWsY5fVitH7xzyRyN3408KPJfTWsE6O77LHY+37v/AC0r2aeX1VbUxdex
+Dp3jLTE8j7fdXtykPzwWv+1/v1rVy6o17un9epm8XbQ6nwn4h1rV72efTNK+y2L/APH1Ps3eZt/h
+3fdrDH5e40ryXN+BnKvNanaWmjyT6d++/czffmdP+eleD9TqJ83Rf13NqVVGDd+Gbqzu59TSRHkT
+53+Sqjj+b3WbTXMcx4jS73wWsN07wff8v+7Xo4KWnMNGhaTo+ied57vInyRvCj+b/wAD21CqOFW/
+UVzmtN8ReGYJ3tdd/wBZ/wAs55E/vV6eIoV3H91+n6mUa7Rt2lh4R1SPz9M8QWun/YpEk8h/3vy/
+3vmrswGDqOP792+X+RhWxzRyWtT/APEy8t79L2BHdIJETaqrWcaaWy/E7OWXcm02C7ef9xdp5D7E
+nj8v/ll/tNUVMTydA5Zdzdu7EzRvA8aP9i+5OlcMa7a0NG2hLHwb9u1Le9o//TNIPu+av3q64OtK
+Nl+hm6qZvXeg6dp9rPau7/ZfM3x2r/3q8T6xOc7RNakrbiaV4a0OG1e8gd0k++ib/lVqmpiqspez
+aMVNdDb8Oz+EZnntdQkSaSFPkT/no399a+oyjCxjDnsebi5tOwmtfEl9FnnsE03ztK+5aT/8Ar3f
+7Qjb+v8AI5J4RpXNey8Z2kekwXr3cEOnOn3HfbL/ALlc+MzaUJqK/r8DJ4RJFXxqbq5tNNfS02QX
+vzyTp+9byv8AZrHGxlKCkjsy+agzntUlg0jw3BqFlqyaffWrv5Ekj+b523+Dyq2w+F5QxFe55XrH
+i6+1O6+23rvNfP8A6+d/73+xSxEAw9exHpvirVrK7+22smyeD5/Mq6MDCVQ9G02WS60WPxpr2qva
+/wBoPsu0gTazLv2fu66nCJyyqSH3ukeBvFWpeR4f1VLOdPk8ibf5Um3+ONq0goz2JhWlA6/wz4H0
+Pw5psd14gtIPtdrP/wAf33l+b7ldkKSiYVqspnfRyJJHvR96P86UkrmCk2SYqk7lctwoKCgAoAbQ
+AVYBQB8rtr32KC3ey+ef78m//lm1fCxorqfaVZ62OP8AiHbX+oOmtzbHkmTfO6f79epltZXcDyMd
+R0ucOa9y1jzJsltriS3k8yOTZIlRJXNaNWx6Ho4gnS0nvZ4/IeP/AI+/n2q//POX+7Xg4iDV7Hu0
+IJu5r+INFu7+2ksbXe8f/LDf81cOCxMKdTmN8Rh/aqxtfC3xtdLosekO/wDpFjNhI9n/ACyaozPC
+OhiXVh9pEYZ+0iepsUmhjnT+D79dvCsZpyU+v9dDxs3ocslYw73TLa6kS4uU+/8AJ8n3vmrTMcBi
+OSdV7adu504LHU+fkX6lPxjB5MlgINibP+Wn93/frDBRVOEKkd9f8isZPnlyIyrnwVBcWkd1peyb
+yPnnj/hbb/cr38fgHUheP9fiYYPFcxjeKvBGk63b3c1kk9rfJsd96bYP+A15FPEfVY+9/X5ndVVz
+y6z0u8tLu7spPkdP+Wld866aTOCKaNV5LSxj3zybP4K5HRlLY6YySILiS3gu97/JI8f+sqqabRc5
+GbqF7/rPLj/0fy/9ZXZTpHDOsQ/aN9vJ/wCRKXKacw/7YfM/1lHKHMXtQ0uSMwT/ALt/Pj/g/wDZ
+qxw9S+hdSNiqI4/+Wlbweo6cLmx4ft7C78xLq7S1j+Ty99cOIbWx00LND3t7eO4uER432SbPMR/l
+qqVRqOpGiYWmsWmhWl39qSe6u5/+PSRNiqv97fUVKP1iV1oRKv7I5278Q39xJvfZ5f8Azzr0IYSM
+Y2RhLFOoGjahJJqEaTyeXHP+7onRstDPDVXc7bRvET6Q8kcOx43ffIj14uKy91XqeqsTZGtqXjjS
+tUjkgutHz8n7h0f94rf71c2GympRd+Yz+sc5xiRukn/POf8A56J8tetqNOx1r3/iiC0ghvn2SJ+/
+ST5PN/2fmryVRw71j19ToUjXt9am8T31qmp3SWt9Zfcn+75i765auF+rJ8qvFlcyNPxDpuu6Q8eq
+ae6TWts+x43+bd5v96uTA4mnP3JbmmrDUdKu9P0L7bBB5Nxc/wCv8mbarRN/BXVTxlGovZ9V6g6T
+ZB4Su57bUU+fr99KzxWG9rFJdQnU5YHsVpa7bGON/v8A/LOvvsBQ+r0YwR8ZjKrqTsZ+uqb60n0l
+Nn254/k/ur/vVWIrJL2T6m+EoOl75xf2PSrK6jW5kndEg2XUe/8A1bf8tFr4rNMKqWkdz6DDRdT3
+zJ8Z6DoWvaSn9nyf8Tay/wCPSSP+Ld/A1RgMQ8JK0+v9eZSp8yKGl+OryaH/AIR7xDaf8TK1+SCN
+/wB1t/269TGQqz9+O3yIw9PlZsyeDr3T9VjTUI99j8j+ZB83mbv7tdEMG6UyKmNjOJDrN3rL6jd6
+e8f2WO9dE2P8sXy/ddd9FbmnLlHS5Yw5jo9V8H2GmeFJJtOnSbVIXSd9myVvl/hSu54NQhocCxXO
+9DgJ9W1LWxsuo/tU6b/L+4v+/wDdry6lZWsz0Ixsrs5XXvDH9mWiajpW+a0f95cRv/DL/wBMqvC4
+v2zdNhVwsqKudx8KbvRNXeNPFV27+fsTTY9+2zZl++j/APTSvUwuWU4X0/r7zyKuYSTt/X5HsKeD
+9JtbmO602P8AsydP+eH+qb/fjrteHhKpzRPOqVavL736Ft7/AFWzt5JLm1+2on8dl95v+2TVr73P
+cyjLmiYmkeItLu4bR7+RIL5HmSSB/lljVv4XSsKc7UryPQrU3OpaJoaz9mvtP+02379E/wBXs/ib
++FK8vN37Sh7p04BSpVbSPPL6yv7WxSaedJ43d55LR0/5a/xxo1fLU8wvU5Xt/Xke7Ncpj6kmkSXE
+H2LfD9qjR445/ur/AMCr1K9CPOrDp1kdF4TjgTUrS68v7LH/AKj7XA6bt1c+BvDEWOHHR907/VPE
+b6NbRvdSJNv/ANQ6fxf7yV9lKSTPnoK8jgoPG/jjxDd7LKCN4LV/OkSBNv3f79cPtzv+rI5TUvFu
+swPJO8EdrrME++OdE8rb/fRo/wDao+sD+rId4e1/XIdVk1DT32T3X+v/AOeTbv8AZrkWKvI9CWHt
+E2/Fs06JaWuoJdJraf6/e+5fK/h8pq6K1ZqJy0cPeR02geK59BsHstake98jY8Eafe2t83+sow+N
+5jGeCSO70TxHo3iC132U+/8AvwP95f8AgNemveRwVFylmHZa3bps2JN9z/gNKWqsOTszhPHu+wtp
+9P8As6anp2oP+/gmTc1eNip+w1PdwFNVUeFeKvhHffaJL7w6jz6b/wA+j/6+Nv8Ann/t1rDHKRnP
+BpHm1zbyRyeXJH5cn/POSuyFRM4pqwzyqZAUAJ+7pmQnlUALQAUAFABQAUARx0AFWAUAFQBHQBJQ
+A/zP3dADKc10Lgd74S8aaTbiODxNBPdQQJ5EEiP/AKtf4P8AvmuSeG6nXHF8h6tp+r/B+/0uS9tI
+Jp9Uggng+yP8zs38Mz1OInCMLs1w0pznoeb6xHIj/ZZ/9Ykn/j9cNCSavE9evGy949R0Dxdq1t8N
+b6wnne6vnfyI0/552zJ9+u1ZhFx/r/I8Wrl0lU/r/Mxp9f1268KPp8EcFrpUGz7XIibfMb+Df/er
+jr4lOJ6EMK0ULTVtWnsf7Onnd7RP9XaJ935a8nFVr6HbTp2JLTw3rN7d/ZYYN7wfO/8As/79dGCp
+cwVKljo59GfSfDdpdJ/x9zO/7zf/AKnyP92t53w9NM8/mjXmXF8TWGuaJfpq7zwXVts2eQ/+u83+
+/G1ds68a1NIjD0lSqlrQLD+0PDXk7P8ARYJ/+BNXyuKwyVL2iO9E17aXGm2cCfvHsUfZPv8AmVf4
+/lripUqmIp3X6GyMyDxve3t3HNBB/ov3ILX7qsv/AD03VNTAQi7Igm1XxjY6XaJeoifarV9k8F1/
+tf3KnB4CTmB5DrXxB1HVLq7unnkffvjgt/7u6vs6GBUFyz6HnTxCOl8KeB/GHiDT45NUv50tU+5G
++9mX/gFeVj8fCjrFXKptyN7xJ4c0rRreDTvtSPA6bJ/73mV58MTVc2d71M/wxoPhC18Qacr2D6gk
+2/55H+Xcvzfdrsnjqqpt9vT/ACMJULnp9jp3hXddZtIEnd99p+4T923+w9PAYlywbcn73/BObE1G
+pWYf2Hr9k323SU3wf6+SN/8AVtt/2a6smWI5L1FePy/QnE8ihc9Et0je1jHl7N6fvI/96vqMRhou
+NrHgU8c7mJfWM8Npn5EfY+zf93/gVfnucZa6L5l/X4n0WDrcyOPh0R47j+1dS8i2neDZdQJ/q68t
+4j2fuI7DEtZ/7Jd7m2dE0+5fYmz/AMepyvUVnfmAbr2t+GLq0jjurWC5km/1/mVvhKVSmvc0ZcIp
+nKXHgDwhdSfatPt96J8935b7Yl3V6v8AaeIjG0n+RlVwyZzOq+DdIhk/cxybH/dxx7/4q9LB5lJ7
+r+vuM/qq7k+k+BvElpHJY2upyQTzp5lxB5e7d/3zWmKzGK3X9fcL6qu5Fq/hv4geG7ix/tG48m01
+CRP3/wDyy2/9NP7ldSo0uX3f1OOo6i3PaJNP1nTLGxghnTy5v+eH+q+b+KvD/f8AtLR2+R6ODqwf
+xFuO21jQJ9+p2MF7pz/PvT97Lur0KGBjg5c0v6/M46mK9vscT4x1/RdTeSfT/Ptbv/Vz2mz5d3+8
+tOtGnUl7Rfqb4ek4bk/gXxvonhiB4da03y775/8AS0+dv+ude3RrxhDkseRiMPOTuc14y8Z6Pr17
+Pc2um/ZpJo/9ZI/3f9pUrjnZGqU5RscbcXWwfJJ/2zrJqHNdmns24nomh/H2/wBL0dNPn0mC6e1g
+8m0n37f++q9KWJjy2PLVOSkef+JfFum63H58OkpZX3/LeeCd9rN/F+6an7U1tc5me7uHk3v/AMtP
++edHLzBawRXMif8AXOT/AFkdZxpsUKiN+31AXVhInn7I4I/kj3/+g1z1oSOqNSIQ6k9jPbzweW8i
+f89Pu1WHXKVVhE9Di+LWoa1o0+k61Pax2r7E+4+7atOviZowjBIp6ZrHjbVJ/P0V7qa0spEggkSt
+8M5KN2T7BFyfxD420vVrTUJruPUJ4XfzIHf5dzf89avD46KlZk/VD1nRvHmjPpVjNrV9a2Wo3Ue9
+4N+3bXonnnSWt9aXsHnWs6TwP9yRPmWgCagAoAbVgFAHy1BBf+IkR554I47L5PL+6zV8fhMLThN2
+6n19WTubMnhCeOCd9Ogfy50/1c+zdUY2cYT11Q4zdjxvxboCabcxz2/z2k/+r/2X/iWvpKc1LQ8X
+Ew5ZmByTWr0ONx55G74V8SDR7v8AfwJdWM3yT2snzL/vVy43DqT03O2jXsj2PwUqaXPaQ3M6SWOq
+fv8ASbtH3eW3/PB1r5TN8I5K63PXwOKVzk9WKeGviVdb7BHsZ/3/ANkR/wCFv7le1hJxqUlPscM2
+3I9I0bxwL7Up1gjd4Y0TyEf+KvAzKPJXVZf1oerToNxNqO6vvtcMSxo6fI/nvWjz+s8O01+X+RwR
+wK5+Zk8enSXkepQpsfzt/kRv/wAs2r0srhKGBcktX/mcVaaVTXYx7O6mk1H7KkHl2sMex/8Aln8z
+feevKzLMZyglNWf9eR7OGoRSLlppN7ZWCX1zPvtd6bIP9jfXHiKHtIKokbR5EzkfEPg5dW1j7bHH
+8lz8nyf3q78rxEqiVJL4RVqUKcGeW+O/AGu+Hpknm8yfTZ/9Rd/+yP8A3a+6jF8qlJ7HyqlzTdjk
+ZZJP4/8AlnWECqhPbSSP5cf+s3/8s6KgUzSvNKvIPMT/AFf/AEzrlp4lWsbSw8kyG8tJfs8bx/8A
+bSlTkrlSckjZlEnkRxyfJv2VyQab0OurTsZtxLb/AOrST955ldNOLMYVLElxceXJ5H+s/wCudKxa
+L1vaQRvHPdW/nx1jzM3RR1TRr+fzJ4JPPg+/HH/FXRDEp6HNPC2MIjFdcXc45xsOtr2SCT93R7NM
+zpyNTTtUnku4Ek+ePf8AvI/9muarQidsJHf/ANg6TqM/2qfy7K0so/8AVo7rLNurxqVdpHf7Mp3G
+n2kGk/bXvt+qv8kcGz5V/wApV0615aIPZmPFeXHmf6zzP+mddTpJIiFS50Xh2PRrq+8zUf449iRx
+v5XzV51eclsjtgrmtb69dC5j0XU7vztOhm3pJH833a5HgofHHRtEzlqd3fXlhNod1c/avkd986Qf
+Mv3PlrwVSqQqqNjpnLQ5rwxdR6cslz5m+fZ+7R/utXs1K873Rzyik7HonhvxDfXuqm2kfzrV03wf
+3lb+7X0GR5lOo3GXT+ux5GZYJJcxt6noX2mC+a2k8m+ukTy5P9pa9ivg1N8yOXCYzkXKzym70DUv
+PvjAj3Xk70u40+b/AIFXzuIoyc9D3Y4hKNyhqGlR6PN9l+177r/lp8m3y6jHYVXDB1bQJvEvhPSt
+Y0OPWo9S8jWbJNk+9/N8yVfuRpXrUMPTjS1PJnWk5l3wP8SJ7rS007VLuOC7spH/ANZ95v8AgVeb
+m1WrKmlH9DvwlOMUUtVvtW1S6n1R988CfJG/8G37tc8atWVNJ/odcFFM1NL8J65qGjSa1pF2kc/+
+o8hPlb+7XtUMNJnl4jFQRjXPhbxNpFpsCTpsTfd/3du/bUYiNSG36FYbFU3v+pJB4Z1V9O+2pIj6
+dB/G7/Lu/u15tPCTfvHc8ZFOxm6H8LrbxLdXaQXf9l3Wzz4I3+7I1ezg6837p5uZKLVzofC3xH8S
++Dtdj8IeK4HukTYlvIn72fb/AA7P+eq16Knbc8eNOD2PVD4w8PpbWt9HP51pdf8ALRP4f95KxrYy
+MNzXC5e3O6/r8Sr4v0bwzrlvax6hOltP9+Cf7svzJ8tPEKnLT/M6MHOdOOhDPp0Oh+GXfTNR+eb9
+zBJP+9Vmasp0I043QSnOctTlZNO1K18P3z3tp58EH/HpPvddrV8rUwV3zvU9yOJtociggtXtLt7D
+f+7fzE3/ADea/wDFtrXE2dNcuhulbU6G4voLLSftV7Bix+T7Jab93+t+95dcVV15PR/kZ1OUo6l4
+6SPSZNM0+Sf7LP8APHP/ABKzf8s91deExNeC1f5HDOCuZHhy91q2uoH0938/zN8kaf7NdWHnOnU2
+0NcRQ5oHTa8tn4nn/trZ9lgRNl3J96Xcv8e2liMZTqVLX19Gc2HociKGh+DvEEsl2mlyRvaOn7u7
+R/lb+/HXpU8O2ZVK9j0C68DfbY4LVLvzndER5Hf97G38X/AKKmBbCnj7f1/wDmPCukWGr3cmkRu9
+rrdlO6Xe/wC75S/3awngY2sjaWMu7nUDwLqNnqP221kS1nd/9Yn96VNtZ4ahUou6/Qv62pqxTvNY
+8UabYx3t1HsS1/0WPf8AM3mxp/49V1pTpO8hOFOrt+pizeOrnUH0m9vZER4X8i7+T+Fv7iVwY3/a
+I2lsdtDCRgXPE2uJq9h9l0jz3tYXTYifw7f4vlrmqYupL3Y/D8h0aSRxHivw3Fdpvvf3/nfJ5iJ/
+F/yzqMJjuWfKjeVJM5nU/g20Gh2moWupJNdzSbJIJPl+d/u16dHPFUdmv6+486plkUtP6/E4DWNC
+1DSruS1vY9k6f98V7NGsqnU86phprYo+Ua2lfoc/K0LmoTXUrmsM8qqKCgAoAKAEpmRHQAUAFABQ
+BHQBLSNR8ckf/LSgBP3dMyD/ANF0AWIri4t5N8EkiSR/8tI6ipTNKT5TsdI8YfatSt/7R8t596P5
+j/dk/wB+vMq4Z7nq0sakj0ue603Ub+S61GP7F5yf8uqfuv8AZrxVVtU1PSVLQYNNkfSo0uo54Y33
+vYz/APLBtv8ADRiXOm+ZbFYZcrHaTosdqlre3o8+OZ/9RC/lSVwxxMZ1HFi9mTvqsf8AYt9awSb5
+7q6R3/vLFEnyLvrvjV5KbhHqP2ZQnkv0t4IHn3wb9/kf7VcyxLat0N3TLeq6Tcado1pqEE++C9j/
+AH8af+gVWGxE1K3QwcDYtLjUdMsYJn2fYU/1kn8O2uGjGNWqkZTmlE29ck8SeKoUm06NLbwyn/LR
+98H23+HbX0WLjKnZI8+lO8ivceHL6bz7K9e1svJT95IiO3+qT+CvLxWEVGokj0IYjocD4l0W0+wz
+75PtqJHvju/u+X/wGtaNduqkgqUup5n4W/e+JrDy7fzo0nR/Ik/i219Ji7eydzw4+/I+qPC2r3V5
+ZPqEyeT57u6QJ/yziX7tfmOJajWfKe3HD+6eSa1YX2oeILvyYHeN3/d/3q+ioNUqSR110dtaeHZ4
+9NsY7Wf/AE6z3/8AAd38FeXWxfLV16mNrnT6PotpbQf2he3STJD8+x32Lu/2q+iybB0l70v1PLxT
+ciS0+KEFzY308CQW0Gnv5c77/Mr0cwzCrFWpfp+qOalRXUz4/jJp+oXcGn6fJ9mnf/Xzzp/6DXRi
+82nTp3X9fgZUsAluauseMLOKz/02DeE+5dJ93/gVfP1cxWLpuM/6/BHqU8Guhx3ibX/t9hsst88c
+ibLT/anrzMFgOTT+vzN5Ssci+tPqlhAj7LKfT96X9j9396v9yvRqYP2d2joo1R2j6Va6hqXn3Lul
+ikab/wCHazVy4zEcsfdWpdzWutLjtp/7Psp/O3zfuY/9muSlXcleaFcsWPhi9lf7U9ojon7h3/5Z
+R7X+/XTHEwhDmRjZHcabo1jOvkQQp9kttm90f/lq1ebDDOrJzT0JcrGfrV9pukeH9Vh1dPtUD70t
+bHY/zfw/fr6PC4Rwgrsxq1OZnl/hXxpd6XZSaLqnn3uj/JPaIk+2WBlf7le9GrCKVzy6uH5pnY+L
+/iVrMvh7TdX0vYlrJI6SQP8AvfL/AIU3/wAHzU8evaRMcDHkPNLTxBYPfT3Wowb9/wA8aQfLtlry
+qWH5UetPGWR7H4S8L+HvF3w9nj+/PO7z+Z/y1hnr6NUfdPFniL1DwHV7d7K8ktX/AIJP+Wleco2k
+dU9SlJqFhBHJI8fnz/8ALP8AhSqiipMy5LyR62SMJSE+124/66VMYPoTyqIXE/mR/wCs/wBXJ+7o
+lF9Q5VIZ9ok8v95WqkS9DZ0NI5I5P9j/AGN1cNeJ30JkdxJGlxJ5cm+ugxC0juJ7iOBP+Wn/AC0k
++4tAHTvpXijSrTZBI8FjdfP5iP8AK1clHEU/6uawwSRz0s8/+reST/ppXW2pbGNalYIH2VdPQ55o
+774efEr/AIRjz4J4HvYJ9nlp57r5dd0JnBOkz3fw/wCNfDmu2kE9rdok83/Lq7/vVrqM0jfzS5B8
+9hak2CkB8U6TqdxYzxySfPH/AM85P/i68WtSilZ7n0M5ysepW/jvSZ7COCNPJkT93J86fe/3qzxk
+KSpaav5k0ZyOJ1aOPxp4w8iGP/iTWPyP5H8X99656uJdCjzPcqEPaM4DxVoL6Hrk+n798afPG/8A
+st92vSwOI9vR5zgqw5JmMBXYtTmhHQ2NJ1i8jg+w/aHSD/WRx/3XrCtSUtzpwcrM0tU1m/utUt7q
+f93PB8n/AAGuSng1Ti6aN6mKSkdPpnj66tZ96WkHnf8APdN6vXnYnLvaxsetTzBKP9f5He6P4+g1
+ReII7adE/dyP8y+bWUKbglSaObEOTp8yN+x17Otz2v35H/gT7y/7W+vb/tCOCkqclp/Xkzj+qOtT
+v1Fn8V6cbv7F9h8i637/ADJ/l3bK8ytivrNXbT1/4Y7IUJqJrQ30IsUntfngfe+z73zV9DhOSNBy
+aPGq86kUtZuLS6tt6bLW+h+eONHr5LC1HhcU7rf+vM9qU+danOyeKtLEF/a61fwPazJ9yfY27/tn
+XqY6U6z5YuxFGlTiz54vbe3+1yfZPMkt/wDlnXr0zx6hHZS/ZbyOf/nnJvoqBTO1t9Z8OXcEkj+e
+l3/z02b/AP0GvFqUKsX/AMMexHExkimJ9EOs2lq7ummvJ5kk86bfm/u/7lbuNRQv1JUk2O8R6pY/
+2n5Fr86Qf8tP73+5U4Cg1G7Iq1LmPd20ckkcn/LT/lpXTGryswhTuSeZsj8tKhmiLcFxJ/HWMkbo
+m/tH7L5jp+8/6Z040hTrXOZuBHPJvf8AcSV2wdjhmrk0WjTvJHHHJH+8oVUzp0TuPA6+C9LuoNR1
+S0u7q/tX3pAmzyG2/wB6uKvKWx2xokvinxNPq+rPdfZEsoP+WcEH3a56cVY6vaGTJcfv40n/AII/
+/Hmq6UUHtCCSOMXG9JN9OMm9yPZ8pJHMkfz+Z+8/5Z1M4XF7exNBJcPeRvI+z/ppUezXI7dAlPU2
+5zcQPJ9qkd5HTzPPR65ox9qrrodM5e6bP/CQX98bSG1T93CiI9p95Zm/v1hTh7PR9QdFt3PRPh3J
+o6WEk0exL7/lpB/8TXv5bgvtI8jM6smrHe2s/mJ8/wAkn8aV7lOLjE8eXvO5i+KVtbOyjvIZ/sX7
+9PP8j/ltu/vVxYpRpx5jqo1HUfKeVeNZdFn1yd7K7ebz9n7t/wCH/ZrzMZKMmexhqtoF/wAR6VHp
+PhuxgSfz471/tUHybdq7P4qqrh26WhGGrRczjdQ8IazewXet6PBvNlHvu/8ArlWeVxlO6kb4irGL
+sT+EpZ7qKNEn2Rz/APLN/wDVf3qirCUm0huvGx2MPxF1GGSBLKCC1tERE8jZ8u5f466qeNcDlqYB
+T/r/AIJ12m/Eqw1eCe1ggRNR+5BBP/qpJa7oV/aHnzwHK9P6/E5j7bquoazpsOoWn2Wxgf8AeWlr
+v2su/wDu1w1sTyPlPWhQjKPMbus2XiPRtWTVtMn36d9/y0Td5a/3PLoUnTXMc0ZRqS5TB11l8daj
+B52myWv2Lf8AZ7+1/dTq38Lb2/8AQKyeYrnt/X5HTLLIwhdf1+JxmsJ4x8IeIJP7Tt/tXz/v/L+7
+dr/z0bbXbiVTnG5y0VOOx0evfE3SdWgsbJI5LKR9kk/no+6Db/t/xLXHi4e0d4nThJqC943tFvbe
++sY4bXUoNTjspHdLH+989fOY/EVovl6fI9GhUpVH/wAOb2uXV8+hz6XBBIiXWzzH/ij/AL6rXT/a
+HsWqS1b/AK7GMcNfU5XTvDerafP9kuYHS1n/ANKjjdP7vy1z5tenTu9LmylfQn1zws2p+R9m2Ilt
+sTzNleHhcwlD4jJOLKGm6FZ6ZNA8375PuTyOj/6O2/5a6auJnUWjsVyRF1q18OabdT23kTzXUmx4
+543+X5v9muvBYmrVd73XoOlLmRyfie71abSJIdNneCCB3fyEfbuT+LdXp4HDwdZ6XZni/dgdT8Cf
+H1irvol7Bsu3TZBOn3WiT5m319HTsj56rG5taj4w8PyarfXumak+kXUD/wAaborv/wCJoqV0gpYW
+5S8PeJtJn+JX/CQif7Nazx/6Xs+75uzbWSxEfaWO1Ur02z03xBr5S2sUsvv3jp5Dv93av8fy0s6x
+6o001/X4HJl1Fzm0eV+MfFN9earHMJI5o7X5JPIf5ZF3/erxq2IliIeZ7tDCRgWXufDN1of2qe4+
+xXv/ACz/AOuuzdXz8MPXU9dvkdrhfY57Rtf1618yDSH2Tv8Af2fN8q17mHneHKjKVJo6DSfFV5dR
+Rw/YIHn/AOej/wB7/Zrhr1YRVor3jWlSbIPGuq2N1osFt9kRLu1T53T5f4/vf71Xhpc8Nhum47l/
+RvDug6zJ5EiefdJa/aoI50837qf6utcJhm5b2OeWIitzhL/4N286T3sc/wDZyGR/3Gx5acc8cHZ/
+1+ByzwyRwXiXwNrOgz7JoJJLf/WeenzL89ezg8wjiFdHDOgc9JHXpnMR+XQAUAMoASmZBQAUAR0A
+FABQAykahQAlMyLFAADmm5ExlckxWTNlTudv4P8AFnmiDS77/Wf6i0k/+Krx8xwSa5ons4LF86PT
+rTTbi9u5NLupJJHso/3EaPuVWrwq06ihb/I9GnudJd+HdReCNHk+yoif6t/3v8H9+uOtXpRSn1fq
+T7UoXdjpWn3cFm0G+eaNH+/5v72ivNzalT/r7w9qMXTtAhu5N8bpD/y0jf727/ZrlqSrJWe5u6hj
+eMpbXT9M8je7o+/7Daf7LP8AwV6WWSqTdjF1Do9H8JeINQ0LTZ9Uu0g06Z0k/saP70kX95/71etK
+FKilNfqebOd4nq+o6Paan4Zk0PT5/I/ceXB/s7fu1704qtTUkcFKdpHOaPpWqweGbe2m8ib+z0m8
++T70rM1ebjJQr0faI63pM4rxJaWmsWEmmWtpv1F4/wDVom3bt/v183l1OVSrdHq4iXLA8O8Hvd6d
+4xtPIg8+fz/I8j+9u+Svs8Rh3Vpux8/H3ZHtuo+Kvst3Jot3pXkvbfufk+81fGLKeWo7/wBfie5G
+v7pm+EbyxS+nuoY98EP+rgf/AFrM33a0dGSauTUraHeLFBbH7NBA8Dun2qf5/lVpfvfPWmZ5I52c
+f6/E56dfU4zxrfX/ANg/0L/j13/6Xs+ZVb/brmy1ShpI6qjjI4qxs9W1q4+xWux9kbz+X/qq+glW
+9nqjgqUH0Njw14h0Pw9Pdf2vpX9oSTwbIP4fLl/3q6qVSK92RGIb6HYza14ce0gRLSfT4J0+1PaX
+X/Ldf+mcj14+Y4aEX7pphajW5xd8/wC8nn06N9nmfJcI+7/gNYc9nc9ONLmM6/0K6j1ODW7rf9ln
+dE1KRH3S7Zf466Y4xVFZnPWjyHRWunaA7yJ9qk/seF/9fv8A3rf3K83280tVqaXHwWNldTyXOi6l
+88H3LWdNsrbf9qm5zcbSX4hc3rHVbubQLmbUI3T7M+95Id//AKDXnYqUXOMI9SeUoah8StGj8/8A
+s+SdJtmxNibVrehl1VJK+n9eZVzzrWvEl9eyeXdSO8f349/zV78KfuLU53TtIyZLuPPMlbyhLQxb
+94bealqYsUtXnk+w/fjg3/uq3p1bqxyyjYyzPmuiS905Z07nq3w7+L9v4V8JXVkljALqN98e93/f
+7v8A4mumniboznh7VDhta8bvqfjB9emgtN87/wCokTzYNn+7UU1dnVPQ5jU/I+1yfZbiOeD/AJ6R
+x7E/8epqJlKQ7RtU0yxv0n1Ww/tG0T79pv8AK3f8DWtoowlIXS9Cv/EGreTp8GHmk8yOP+GNf96u
+fEYuOH3OjD4Z1Dpl+FGtTRu9rcJP5KO928j+VFHEv8fmSf36nC41YjYMThXTOVlj8jzI/v7Pkopy
+uZ1QstQvLXzPIk8jfHs/d/7dVOIqVQlt445/M8y4jg8uPzP3n8X+ytI6SOOSSOTzI5PLjoA6S38Z
+33lwedGl1BD/AKuN0/8AQ64HgYRehrDGXGHU9Iu54/t0cib5H8+RP/Za7KGHl0Ma1S5T/d+X8nmP
+J/yz/wB2tyeW5ZsJ7fzIJ0g3+R888bv8snz0ucfsjTk1Sf8Atn+1NLjj0t9++CCDftj/AN3dWsMR
+cynhkj3XwH478QappqPqlin2WH5H1LekW7/gD12wq3OCdI9AtZ4LmCOaF98D/wAaVYx9ID40tdJt
+Df3EN1d+R5H/ACz/AItyV5lCir8rPXr13P3joPiPaaMvhuxt49NdPEl7Okcc6IkSsv8AurXXLAql
+7yOKOYOfu/1+R1/w28KWXhzRRBqEaf2lN+8uz5n3VrhzPLqFW0pvX5/oztwOKqxXKtvkcB8TPAsi
+3f2uyuPtpfe/lp97/drPC8lN8sNisRhuZ83U8or0TjCgDobWS4ns40+//wBM64K3xHo4f4Q8vy6f
+Qz+0aOn3kcHlv5kkcn/PP+BqyqUudG0Gjbj1C4d/PtZHgf78f8NcFShGO52QZ1dj8QftIg/tnTYL
+2NPk8/7stPLsJSw9S8f1OfEylyOxd8XfEzw1pWj2tlp++68/5/IgfyvLX/br651oyp2Z81h51VN/
+8AwLHS/G/jO8tLKSCTR9CTe/2vZt+X/ab+KvNlhlFe6elGvFy1O80v4P+ErTTY0mt/Pvn/1l3I+6
+s8PRqN6mmJxcYx0LsPgpDq0cwggtbW1/dxxwIn76L/ppW9XBSUrhPMadTRf1+B5p478LeHtWvp5N
+Lgj0u/hneCSCP/VSbf4tv8FZ4zGunG1jSlgvaapnC6XrGp+H7yS3kj+5J+8t65sTgVWQUMT7Nlrx
+X4q/tnT4LWOOT5JPM+5WGBwaotm2Jq+0RkR2dvHJXXKqzGxP9n/d1k6rCwy5k/0etKbN60rle2iu
+P3f7vfTqM54xubOkeZHqEc99H88H/AlrDEO5109CGWCwnu/Pkg2R/f8ALjp0JNBU1H3n2SD7O/l7
+LST/AFkmys6MZPcJM0dPktJJJII5Ekg/5Z1z4lNam1KRV1CeNLzyU8t/9ytaS0uY1CB/9X/q/wB5
+JJ5kkn8dayCmT27+RJ/q4/LkodS4/Z2ILeXyLvf5G/8A66VnKN0L2lje020kvbuOCOSODfIieY/3
+Y91ZqEeexpy8mxpz3cckklrfRx+ZYu6fuPuSf8CrndP2VW8DeC5tzPST+zpPPgnkgj+/HIlWnzsi
+pK50HgQy3V99ufelpB/r5/8AZ/vVOJpVGvdCErHqHhrV21Ca70x53eD79pO//PKvTySvUlH3jycw
+wsEtDX8S+Gf7Q0qSNHfz0+eONPuttT7tepjcMqkTz8NV5GeSS+H7ddc+xam8lr5D/v5PvV4lGkoO
+x7daq5xPYNS8L2Oq6BBZb97wp/ol3XuSw6qQPAjinSkN8J+HJNDtZ7K5nSfzvnjTZ/DWeGo+yNMR
+UdV3PJviX4Xfwt4hSexj/wCKf1iTebf/AJZRz/xJTxvvo2y60JFGxg01LCR5pH+1+enlxp/zy/ir
+yKc4ns1HJmnqL2M+ux6josnkQJ5HkRv+6/1SfNup1K0EKnCSN7SfHswt9SutUk869f8A5BuxP9X/
+AH/+A1OLn9bo2/r9CY4JUZG3B4putJ0Ke9e0nne9dHjn2bfldPm/74rXA0/q1Gy/r8zGrSVWR57q
+2uTeW6QXb+RdSee8f3Jd3+1/frjqYi6PSjhki7pPii++3wTRx/bZ/L8v9/8AvfMVa86pK7NlFI6D
+VtEn1CCDWoLSCDUYJ/Pgnn/5aLF96321GXYevh1736HNXgnsR6jdeBvEuleclj9i1j7/APov+i7d
+v8G+vZhi4zepxexkZWutr+ieFE+1T/2ppW//AEGSfet5H/t/7aVWGcZamkqEUVvD3xA1Ui0+2zz3
+sc8aJGk7vvbb/wA868rNcFVraJ6fI6aKgjuYNUgvIEF0HtrqHe91ZfP/AAf3q+UnltWlPk7+n+Zr
+TlZFfxFHY3OlJ9lvspdbEk2fN83/ADyr2/7MdGHOtX/XmZwrO5y3iDwzJpmyaO7d0m/v/My1z4HM
+3N2aFNXHXV/Hq8/2p9Ng8iDYl3HB/F/002V6tbEoKascB4otYI/GF3P4Qgn05LLZJAkb/vflT5pK
++heKUdtjyVhuUoQa++qT/v8A93dv88j/AN6ubEUNeaO5XPyl5L+4hgktfLj8v/Wf71c7djrnHmOm
+8La5qX2iC1S72Qb9/kT/AOqrkxErmlKjY2r3SvDFr9usvt2++tf3iT/8splb+CipTlTdkzahXbKG
+leGPO0mCe6k8y0vd/wBknT/llKv/ACzaubF4iUY3SOuVREMGm6tpF988Ef8AGnz/AP2NVOspRuyZ
+U7s6rwra2unRz+cP9LT5453+bya8qtj5RVoocqehJrOneFH0qS9fUvtOpP8A6uCBP4v+BV6dPCwS
+snqY/WGyl9uuLW4S6utnmbNkEafL5cH99dlc0VyysGrLP/CbmS7nSzsnuprlEhjn3/d/4BXnPLHy
+8035/wBWNeVmtcy3dlp8E8cG9H/4+rV/3nmN/frhoxp1Klm9vULnml/4M0u+eT/RNk7/AHNj7fvV
+9PTzRx/r/gGM6EZHNah8MWkneHTpN7p9/f8Adr1KWeRitf6/A4J5ZGX9f8E4y7066sbu4tbhNk8E
+mySOvajV592eUsPVW/6FbZir5Wth3S3GcUm7D0Dil7SwaBsq5NofOHkSf6ySP93/AM9Kxc2HORyR
+x1qBBTAWkAmymA+OgyJKACgAoAlSQ55pRS5bELEtM+mPgRq2lN4SnvbrZ/asE/2XzJ/u7dnyvXl4
+yUcOuZnoJuojvL61g123TTkn+yyJOk/nx/8ATT7+5a8GliHXjyT3/rsejFch5v4n0a70ITwXqO/z
+o9jfR/ej+f5laopzcX7M3iuco3OpeZfSQQfcfYiTu7t5f956j6tKU1c3q1VyndR+HPD+iRwQ3Mb3
+X9oIk39uz/N5jfxxr/crbOYTVLQ83CVbTNvw7rGm6tHa6KkHkz6fvSB3p1a0cVBIiVJ0yv4lg1V4
+LqTw/fRvPs/05E+VtsX8KNWWHw/sp3R00ZqW5D4d8c6YkEdr/aVjDIkDvPaXTou5v9+vWyidSlTt
+/kc+LacjlPEvxG8GStJql1fwXU9lA/kWFrvX7TP/AA+ZtrqwtSpKpdinJKJ538EfDd9r3j+0u0+R
+NOf7bdySf3Vr11TUYni1/emeg/FuLTU1QJDqUc3yb44/vTx/8Cr5/ETXMe9hKHunN+GtN0mDUo7q
+61KCSCHY8kfzrLub/Z/irza69y51USG18T6lp/ie71C2n8mN3fzIH+60X9za1elgMTyUzHE4fmM5
+E1XWJ7v7FHP5F1P+8j/h3fwK9dXK6hy1ZRNlvh94x0Gxg8QPavCkb+Yj/wAUbL/s0fVnEVKUS5Bo
+GueKNStP7R02eD7Sjv8Ab7VE/ebf9nciVVOhdXFKrc5rxJpmp6fqU9ldSST/AGL5I9/3lVv4a86o
+m5WN6MblGwv59Ou/OT53/uP92sa1PnWp105nUa14ut5vDiF/LSd5PntP4tq/+y1wYfAe9oKpM5+P
+XrR4I4EjdJPn8yR/4t1dUsMYxmdboWreF4dK/sidJE1J/wB/HP8Ad+aolh29zaMi7rNn4mutNTyJ
+5IJJ02eXAnyzL9755K4MLRjTeq/r5HTNRPPdXsBp/kJN5iTvHvk3/d/4DXu060WvdOKdNFHxHf2m
+y00/Tn+1eSn7yfZt3N/sVWFoXbbMcTUuQaHLq+qW8ejwQefGkjzxps+bd/HXVWhbYxoVLFW/0S+t
+Y/PeOTyN+zzP4aUK9weHSGW+mXc0cj+XJ/1zSN2+X/npXZDmZjKyN7/hWXjae1k1CHSnutNSPfHP
+/s/3/m+elVp8pNPU5m5+zi3+y/Z40n8z/WP97/drGEwqe6UvLj/1b/JXTciWpDLZIY5JKfMcsqdy
+7omqXeneZ9in8mSSPZJs/u1z4iPO9Ttp1ia51PU5I5IHu53gf5JI977WRaunT5RVJXKUH2RLuOef
+/V/9M60m7xKFkkje4kn8uSC3k/496cHaIE1tb+fcRxp/rHrGpK0QonT2Pw/eS+gTUfMhgf5N/wD6
+D8rV51TNHBGs8PzFLxHPpvlx2trHsng+S7jkTb8yVthedbjqmF5EjyfJHXbUnFbmMC1Z3EkEkbx/
+u5E/5aUNCjK5tabaT6jJ+4j/AOulcWJbZ0KNzqtM8NyJ/wAfUfnyJ/yzrnjmUv6/4Y3p0ydItknk
+QSP5ifP5ddEcS5E1cPc9a8D6j4KtUsbW1vt+q3UG9498z/8A2FfSHgHcwTwTJvh+dKAPk6zh0G30
+W/1fVLt4LqGT/RI02b5mrzsPB1nzI9PF1FTXKaHgHSr7xNqsfirX7uObyf8Aj0sf7u3+LbXswi5L
+lZ4Mpql7x0PjU32ntJq8PlvBs2SeY+1lrzc5yx1rNbf15nuZRmcYxtLf+vI4uX4hyonmR6Ta4/5a
+SPvb5656UKdK0eptW55S5lseZ6/Ik9+91Hbx2sc/z/Z4PliWuo4jLpgdBpX2j+z5J/M2bP3defX+
+I9HDfCPkkk8z/pnT6EfaJJLaSP7/AMkn+s/eU6UuY2VFxNPQfFdvpTvG8H21J/keD+H/AIDWGIwE
+psHieUpT3mtz/aJLWP7Lbv8A8s/461dKnTs2ZQnK2pr+Gf7M020f7Vaefq0mySC4+/trHG80rKJc
+JKJ7fY+N9GOlWk95ceQj/JJI6fL5q/w17uDxkLHhY7Cyb903bHU9LvBIlldpPs/1nkPu+9XUpcz9
+05JUJRWpbJNKDiRJshl0vT543R4E+f7/AMlTVipdDroTn3Of8b+CfDPiPS7oT+RBfQJ+7vk/1se3
++9RBxhEHh6kpo8DtPAnjJnk+wwb9iO/mb/4F/wB6vKqVIyke08JOMCnb2F/9kjnuo9kb/wCrk/vV
+hKqjewfY/wBx9q/g/wCWn+zWLqK9gsVJY7h5PLj+f+OTZ/dq4GEpXLelyR/vP3f7z/lnU1GdFGNy
+S5k2fvPMpbl1NCAXHkSR7KaQU9SjeXEknyV0wg2YzZ3+j3+mpYT62NOgmjfZa7PI+WN1SvHxmFqv
+q0jWkzn5I47uSTyII4JP+Wf+7/u100x1CC3jk8zyP+Wkf/LOStZjpkklxJ/zz/8AsaJU7B7S5NaW
+ck8flpHI8kf+s+T56xlOwvZ3NSztJ408w+YkEH+s/wBmuVzXNZbnXBcu50k9jo1x4Y86xnT7bHOi
+PsT5mrzIVKlOt72xry82xzjaXPJH5Dx/vPM/ef3a9VyVrxJhSud54X0m/vLuf+y4I0fZskj/AOWS
+wN8rVzUMTUUrCqUrHrWn2el/Z4IUgRHhTZGn8SrX0mV46nXh7p87icLNLU0S235K9RRaPIdX2b1O
+NvfA0V1rEcjyOkG/Zv3p/n79eXVwj5z16WNXKddZWr29tHC7+ds+4/8As13QTgrHBNqpI4mceJ9Z
+8WRp5c9rY2r/ALufZt8uoqO8j0IU0qdzF+L+pz6xFJ4egT/j2+d5/wCLzU/u1jjK/JEMHQ52cb4K
+8Q2NtYPBdaUmqXf3JJJ/4Vrz686UP6Z6lDmkVZP9f57/ALuPe6eRv+b/AIFXF7anL+md3JI1dG1y
+fTIJ/Iggeeb5PPdNzKtZ4efLGyCrSdSRcvvFOrano0FlHHvktUfzH3/vdv8AcrapivdszGGDcZFb
+Qnk8ySd7TfaeXvn3/KrOv+21ebNtGqTZs30xTTp8WkdqnyeXfQfe8pv+WVcEqzvZGqw7ZNMZLaT7
+Sl9vfYjwO7v8y1gsbWno/wBB04qRm6laF7uTUNOk8me6+Se02JLFLL/FXoYCtJPUc6LWw6y1+40y
+Cey1SxS9nndP3Do6+X5VexCfLqzzK2Hkzpp59A1u3nutU8P3VqkFr5NpBaxpKsf8XmJ935q6I4/D
+y0b/AD/yOWOXzf8AX/BMHwdBPNrnnWtxJeoiPvknf963+/Xy+c4j2fXU9SnRaidD4v0KRdKsb2ys
+ds0EnzpB/wCzVy5Z7Wvu7r5E0ormOQjt9c1eaC2n3xxv9yT+7/e21vOdKjqv1NaaubEHg3VZJJH0
+tHtY0+SSD+9VU60awqisc5d+HNUvfGs8OnwQR3unxo93azfKs3+zW1PFRp4dOd+v5nNU1Rxmr6BJ
+fSX99Bssp7XZvtPuNu/6Z19Fh6/K4tnHOlcyNG1WNL/yNRj/AHf/AD0/261q0LIjDVuY3ZLv/nhX
+DCjdnqqVjW8jVtRn2ffnRN/l/wC5XNUxUYvUuNnsbHhjxJJos6Q3v77SvPS6exf5lZlrtp4mKV2j
+kr0mzoDJp07x3V7HJZaM8jvH9/yvm+7trwcZRqRfKv0PQjU0NVNKgFp5/nuk+p/7e5ZF/wBll+7X
+NiacqNK8iY1NRNc0LSrnw5dzW2xLqyTY6f8ALT/gS1z5fKbu2JNI4y6udM+1xwRyJZb/AL87vXrQ
+jd8w/rCRJL4y+H2kfvtPu55rq23pHBAm9Wb+95lYrLcRVVpaX9P8zCeOX9f8MY2rfHPV7myeytbC
+O2R/+W7vulrsw3DEE7vV/wBeZwTzJL+v+AcjB4y8UwRzwpd7/tXzz70SX/0KvVWEpPp+Zh9ZkiO0
+8b+KLXzNl3/r/wDWfu0rRZfQ/q4/rrRo2HjbTZ/3fiHRk1P/AKbo/lS1g8A1/DlY0+st7l1P+FW6
+pps++OfRtV8z9x9+eKsnVxdF6e8v+3QvB7kCfCDWbmxjvdPu7W9Lpvjjgf5ttFXPaanaV0/R/wCQ
+f2e/6/4cxv8AhXniFJ/ss9o6T+Zsjj8v71d9TM6bgn/X5D/s5/1/w47Uvh34o06D7VNYzpa/wXbp
+8sn+5VLHJ/1/wDm9kZN5ZXcEfkTxyJIn7zy/9+tlVTH7Ezbi3uI/9ZH5e/8A1ddBgVaAJI7O8kk8
+uOOSSmAeX9nk/ef6ykAkklMyI6AJKAH0ACYo9kzSoo7npHwo8XPp+o/2VdXf2XTrr53/AOuq14Of
+YSVSnodWCxKR7bo9xod1q18sepfbfO2P/d/3E+b+5Xy2JnVpy9r0+R68Y85Jq2pQ3uqP/bj+TpyI
+iWsE3y+ZIv8AG1c+JxdWtFSp7/Jm0Y8hhX0XhLSIP7QgvYYHRPk+dG+9/FWlHE4qrOyT/AydeDRw
+9/8AFKKxsfsVrqc97Aj744P+WX/j9fUwwuInH3v0OJ1YJmXd/F3XJ/tH2SOO189PIjk/ij/20/2q
+6cvyiNG/9fqZ1sUqhhW+veKX8yCC/u5JLr5HjR3/AHm7/drpVCEjmjNxLX/Cv/GPySPps6ed/qN/
+y7v++qqVRUVZmvsG2X7L4W+LLq0jmS13yPP5EcCPvl3Vphqqk7oyxFF2H+D7zXfCPim7jO+y1JI3
+geB0+9/erKtOXKKND3jautW+26k97qkf2rf/AKxPu188oOUj3YvliUEu/LkjuoZPIktf+PTf9+tJ
+RvAh+6XJFj160k1DzIIdS8xIJLH7ssm7/lrW1OjaGhi8Qbnw88TWPhvXb9720QQJBvjT/Xt5sX+1
+/DXs0KyR5VShI6TxN8WNd1af7F4UsfPsfI2T74fNb5v4qK+NSCnQkc1cePfGXhqwtIfsj2UiO/mI
+6I0Ujf3v76VxUMVpYqUbHnE2qTz3Ek88nlyP+8krPlvK5vRq2Gi8/wC/lXTp+6bU5kNx57x7PM31
+NOykFSZFb3l/BHJB/wAsH/1kf+5WrSOdTLD3Fw7x/vP9XWDSN1M2rHWfFnkfZdOv7ryE+eSBHfbU
+z9l1/U1szM1K61e6kR76ffs+SON3+bbV01T+z+o/ZspY/wBIjrSTvsRKncdpt9qdjJ9qsbt7WdN6
+b0+VqftOVmDp2Kvn6hP+4+0SeW8m+SPf8u6rhyoh3Zv+FPGuveF47tLLY8d6nkTxzpu+X/ZrrhiL
+GMsO2Ta58WPFerX320XTwRwfIkCP+6WL+7trOrPmHT0OT1C/+1ySO8e+R6xhCwVPeI47S4nuI4Ej
+ked/9XHH826tLmUdTY1LT3hj2XWmfYp5I4/Lk+eL5f8AajehyOiMDGsNHv76/t7Wxj8+d/8Almn+
+xW9JcyOTksdBN4Jv0t7v+0bu1sruyfY9hM+2Xd/s1xVq/I7HfQpXRUv4PDulyQWsEkl7feR/p8/y
+eQsv9yGt4vmjcwK0cdpBJHP5fnx/885KU3aIyCSSOP50/dyR/vI5KqD5o2Ype6dDoHiPVrvUv393
+J+/TZ5b/AHvuf7VefjMLFo2pYgpahJaQefBH5c0j/wDLT+7V0ObqOsO8MwST3+xJI0H/AC03/wB2
+jESj1MIFjXrbTLGfYkmyd/8AWQfe2/8AA6eGquSubypcpGkt3qk9pa6VYRwTpHsjkgfyt3+07NXY
+qPMYSrcp1HgK+13VHk0u+1ZLVLXe/wC/fypfl/uyfx1zV8JFCw+MudfHDqWl28l7/ouoR2qO8ke+
+HzWVv49/zVeHoI73iLnPHxr4j0XUvLkjg0We6+eSe1gTcqtXZ9YOP6sil4h8a+J4Lv7FH4hnmtLr
+55JEd/4qX1gPqyPO5tat7rWv7RvrSOSP/lnYeZ+6Wt3V94ilRtE9NtfiR4AkhgSTTZLWT7kmxEXy
+/wDb3pXofWLRPMqYXmkV9T1HRtTuoINB8Q3T3d6nkeRP88X+63mU6tVOJeHoOKOX8Xvq2neX4avY
+IE/s99/mQJ5TMzJ/FXl1azcbHbh4crOM1n/VxyVnQN65jV2M4UaWn6mkMEkEn+rnrGVI6o4pkgvL
+ieOOCCPfJ/frPkXU2VeTJ47O8uD5l3JJ5cf+sqZTSWhTpuUtT1DTb/Qm0WfS9O0P7Nvg/d3X+tnk
+/v14M8NVqVU0767He5qnEwrTRNn79P38j/6u3/jrrqYpyVmDgmx9zJcaf9nuk/cyffjk2Vlhp2lc
+MRG6sh48XSXekz2N9Hvkefz4/L+Vfm/2a660JSkRSqcx03g/xDd+GYN/kfbdKuv3j+R96Ot8NmPs
+JWf9fgcGMwHtP6/4Ju6746uZrv7Lp12j2M8f+vRPm+arrZhNaX/r7iVlsV/X/BNTRvFMcDyQXOpR
+3W99nn/3f+AUo13vctYW2yNy0vdK1CSdLaNH875J5P71eLlrq4dezjs35f8ABOuvFSfPLdHK+LdA
+sNG0uS8knn3zO6fuPlVYmT7te3i8A4U/aLd/13OfC5t7WfI9l/XY8rs9U0meeOPVbSSe0gk/gk2/
+uq40rLQ0o159TR8Q+FJnsP8AhJbaSO60aN9lxB935f722lhJVFBo2lXj1KGia/oOkPJdWv3/ALkc
+afM22scZh51pW6G2HrWic7HL9o1C4nj/AOW7u8caJ/ertsowSfQ41K8gu/tEfmbP3mz/AGHrSm0F
+gs7y4gj8x44/Lk/1ce+lUgmPnL8UmizjzJ/3906fu4/9VWc247G8Kmh2XgfXLC2k/s7ULT7VYv8A
+P9kg/vfwO+3+7XHOfWWxFOnzSOnuPCmhXr/aoX2XH/LOPZt+X/fr5+ljZQp8smevKGhxGu6KieLJ
+4bqT7Kk/7+Pzvl+WvYwuJ5qF4o8qdDUp3egXlq5/d+Yj/wConT5lb/dZa6oYmPwsqNGTRnSX+r6P
+qUF1JG9qP4JP73+1W/s6dePIjFNp2Opi1iC/id36TR/v/wDarynhHS1XQ9ShUVSJW8WCCxuILLQb
+ud9C/wBekD/8sJ3++tepQxXtFaR5bwtp3NHw1qGlarb/ANnaj/ot1H8/9pf/ABaVwyw8Kc9dvmdj
+nNnonh+TQnEj2t9/Z72SInn7/wB1N8nzNXR7OhODX+Zi6k0Wb/xTFH4fneynuoXd9kF2iebu2/e/
+4DXBlGKVC8epricIrmHf+Orq1vrW6hvvO2InmP8A3v8AerXD4itNt9PkZPAJr+v8zWudQbXdXSbS
+7/8Af/I+xPl2/wC7WscdUqVURHCwjSZ13hA62+myf2vI73STunlum3btr6uMm0j5ivQhdj/FeqX2
+laf9qs49+903/wCytKrV9lHQvCUvbT1Obg1jRtVSfUNcjgR9M/5YJ83mLLXBKSrR1PUdH2MtDzPW
+NX02w8Xyavp1p5OnXvySQfe8uX+/Xm5rapG0Ttw9L2JZ1y3gttceS1dLqOTY/wA/3PmrwsNNuPKz
+1FDmMiM3E7+RHb75J5PLj2f3v9muyFJoyWIuWrC0uI7uO1f/AEWfzP8AWP8ALtb/AG6xqyaNlqae
+rWN3G8kH+v8A+ejp8y7v9mp+tTfusfs1ELu7kfTbRNRj8t/L32kafO1yn/slT9T5PevuT7dj7G+s
+fsLwPJ+/2f6LG/3VWT+9XLONSU7r9C2bWo6zpekadBbaSiPddpnT+KubAYetVr3kZOZnWnieMTvN
+qe+a6uo32Xe/5o5/4HWvoJ4i65WZulGBl+K/F+swXkGl2N95yJB+/uET70rVGFy2knzP9f8AMh1m
+tg0Txld6JJdzpYf8TKf/AFcf8O2ssVlixOkv6/EznU9k7nZ6/pWo3WlabrtzfP5F5H58dpHvXy2Z
+Pm+f/brrqYNYXD8sf6/M5qE+epctaHpWow2MGx/uOieXs3MqtXxOKrQlNqx6VtLHZtNZWsMk11sS
+O1/fz/8AAErbh51I4iy2scFenocf4NmdGu3m8ie+1Of7VJG6Pujib/Vo27/Yr38wSrSUIf195dKP
+JDmM34seHo4reO4unS61mOTfbyQJtZYNn3ZK911HTioyM6EeZ855fB8PtQ8U+f8A2ZaPPdwf8tP+
+WS/9dK6KVaVlGOxy4yhFu7OdttRex8/R9Sg2Txyfu55PvR7f4KeLwsr8yNKVeKVmeoeG7AaZaR6z
+dJ58DwfJ8/3pW/gr5LFVo1JezXQ9XlKOrXUmqSRvBYwQpN8kaQJXVTaS16BynPWl/fWNpJ9qu4/I
+dNklpO/zf98V6jlKTOLmiiO48daRa39g9lBJB9i2faJLV/8AXtv3b/nrV4PmIeJSK+u/E7xLqrzx
+2I+xQTf69E+eWT/ro9Y0Mqo0neW/z/zIliHM5/TfD+r6zv8AJSR/J+/JJ9xa9GtiqVNav8znnhZT
+O7HwlistH/tPUJ5J5PueRB8nls33G/3a8L+3vazsl/X3HdTwaJfDXhzTLS788WMdzGnySJJ8/wA9
+Z4zGVHHR2O6GGR6PHd+HdJjgT+xIbV3TZPO6Ju3V4dp1+ui8/wDhgpqxxdxpMGqfas2kEiQ/O/8A
+er0qGKdFJMc9TO1P4f219YvNZWnkPbOnn7N/3a6aWbuLs/6/A554VHN6t4B1ayv/ALFBIl1+7R/M
+R/u7q9ujmatd/wBfgcU8CmZz+HPE+myfu4J0k/56Qf8A2FX9aozjb/M5/Y1Ilq08W+LtOnSc3bye
+T/q45/mWs3gqFSP/AA4/aziehN+0X9psbSy1TQk2WyfJ5D/8tdnyv89bY/CKuznw9aVM8l8T+J7/
+AF+++23sn+xHH/DGtbYHBKkiq+KczHElxH/y0rrmctNWNzS9U0z7BPHdf8f7yfu/Mj/dba4pwO+E
+zVgt9Pnk+w3XkaX5kHmeZH81c7Urms0mcfqsw/49Xjj8yCSRHuI/4q76LaRwTpJlGtQI6AJKAJ/M
+oAfWYE9pqFxa3cd1BJsnSTzI5I6YHQat4+8Q6pd/armfZP8A9MPl/wDQa4IZZCJp9ZZmXfiTV77y
+0ur+eeNP9XG7u1dcMNBB9aZVkuPMp2Mwj8ue4jTzI08z/lpJRYDfsNL0xEke9kkf/nns+7XmSxE+
+h1Kgd14PvdF8Nar/AGhaxyRz+X+43/vfm2Vj9cmbqgag+Iuu3V+l1dW6Xs6fPHHs/u1jPCqtUbZ2
+KpY6Dwr8YdM0yK7murH/AE6b/lnAieUv9371d+XKOGptL+vzOGu+Y888QeINS8Q6zPq+oP8Avn/5
+5/w/7Nc3xG+xmR6hH5nlySf9c6X1e4fWLG1aaak8EEyT798mzyP9qvPlOSTRujpp7SxSxje8gtU3
+psSP/lpu/wCA15fPPm0bNkcbrWmvpf7j/lm8e+OT/Zr6ClifaGLQWM93H5kkFw6ef8n2dH+Zv9/b
+W0lymMol/SRPDq0eqajY/arWF988E/8Ay0rleI9m7FulzGFrrRzanPOkcaRzu7x26fdWuqjLqYOl
+ymLLJHBJ+8rslEzqCC/jSSPZWEqNwpk9vq8iWklj5CfP8/2uRP3v+7ROjaXMEaho2Eth9kkg8v8A
+f/8APd65cRdu6NlUBNcu9OnnSyn2QOmyT/aojS+8PamZPefvJPM/eV1Qp2H7YSTfAkD/AH45/wDg
+O16Ka1Oe5AlvIn7x/njf95Wk0Fy8lxpM/wA918n/ADzkSueEGtDec7mPcfJJ+7k8+P8A56V2Q0OG
+oQxvWzqsv2aZck0bUkg+1yWEiJ/z0rNy5ifq6ZPbatf6fPBdWMkkF3ayb0nSlQ0FiY3JrnVdS1e7
+kutXu572d/vzzvupYh3DDRsUoJJILuSexkkgeDy/IuI/4WoLkElxcTySTzySTzv/AKyR3+agxkTa
+nplpaXFpsnjupJ40eTyPm2s38D/7VbTmyol/WtNg0t7Tz54Hjnj3/uH83/gDba45KT2OiNSxlXln
+dwfPdWE8Eb/Pb70+Xb/erppTiYVKZSF5Jbyb0/1//LOStZQ5gp1OUm+0XD/vJP3n/TSuflMzQtP7
+MksPI8uT7dPJ+7u3fbFEtOwGRJHJI/8ArN9dKkuW5PLzGrB4U1k6b/aPkSJY/wDPSSuVYuPNYzeA
+5v6/4Jb0ye0gj8ubzPM8zzLes6938JcVY6jwtqOhf2z5eqSO+m3Uex4IPlbd/f8AmqIub3OqNZIk
+8YaFPazwaXBBPPd/8sJ3/wCWkX/LOuqhGIORyN/o3iWG/wDsWqI9lOke/N1+6+X/AIFXo2jYwbOW
+8iWOST/npH+8krmnGzOjnsiYSW8iR+RJv/56U6miJw3vMMvnfH/rI6iEWhuS5rHeWml6tPpsGvSe
+XPBO/kTwTp5rf/s15cMYlVcWdrwt43OJ8UWd3aiSCe38iRH/AHkf92vToHFXOZFdjOFFiyQSXEcb
+/ceipKyNqUlc6eyjs7WSNPuf885P468ypUZ6tKMbEXmyR3Mkcn/LSrlTu9DmdRxkd/4A13+zInd5
+E/cf6vfXBLEzpT0PQdNVIjtf8W2kmpTpoPyI/wDuL5jV0Y6lGUrI4cHVbVzmn1d9RvII7qR/LT/l
+n/6FWMMHyI7YVrsualpGmwbHT5Ef+/XJh8TOUtTJQ5BbDW7fRLeO60+78yd/keDZWtXDOo9R/WDI
+j1S/e4kngn2fx101KFNKxnGvJG6/i+3vZPMnj8id33z7Pu1yxwCve/8AX3nTHHW6Hs3ge60qfSvI
+gkge6tf9fs/h3fdr6PK4Wh72585muJcp+7sQfExp28N3EPkI9rN8kkm/5o2/h+WujF1OVa7GeCpe
+0lpueIRaHI935EEcj+Z/c+b5a+fqYiKpXR9HRw0uptJM0Hh6fS7795pO/wA+SNPm2/7SVxQxU+ay
+Np4aPU4u4ij8yR4P3cH/ACz/AN2vRpN9Tm5bI1NLtpLW/jkjk8z/AKZyVhiaiZth6N2dX4pEd1PB
+P/Zv9nyPAnmb/l8yVf41ripYg6Z4c5STTI502XUezf8A8Arr9u0cU6RNceZBbyI8e/8Ag8v5G3LU
+QftJqRVSnyxKPgy7/sjWvnTfBOmyOTf5S/N/frbMKHtoWjuRg5+8ekp4ln0Qx2uoQ+c/3/333vK/
+2JP46+ZeDVdOUGepOoV/H1nYa2H1dHd4IURN+x/vNWuUTlR9xozk9Ct4AtIL1bXTJ7v92H/1H3fl
+rvxU4U588v1IpSfIer+JPhtoGtaVd2sEfkPPGiQSR/N5bRfc219DhsHCUPawPmMXipxmeE/2Pqvh
+bXJ/DuqQeZP/AMukcf8Ay0ZvubK4l/tKvH+vyPVwtbkLOmS/6R/xMY/LRN/7v+JWrkq0/ZuzO6NX
+mLWkpJ/atpNPBvdPk/dp/DWVZe0Vu5pKfKdL4isbTTru+RJ/3iT74IET91IrfN/wGs8RhYwaMXUb
+Oq0vWNJ1E7I7R7W1hg3zxp93/b+asPqNOVRyiTWqScjLh0PwvrMv2a28xHT/AJaJ826Jf7+6sp49
+UqbX9fkdUW3Ej0nTbe18VeRBJ9ljT+PZurqwFbmnc560VyGl4g8X+JrbUpPneGP7iQJX0P1iV9Dz
+I4FSR3unJPqvh3yNQ2O9ymyR0r1KcVOOp57nyT0OF8b2tjZumkQ2jo6JC892n/LZV/2a83G0nGOh
+6mFnzvU4vxtpMdlJHZQyb4LqDzo96bZfmr53DQcZe8d0pc+plaBqkb2H2KeCP7XHJs3v975a0xFN
+QfOjWlWtodTdz3celWkcEaJah0ngj+9uauaOY307f12HGhYyjHPdTvI/33+eTfWFbEXN46GxoGm6
+bqHnvdTvAifPvgTzYtv+3XTSpwnqc9eoyyNNks5EvYPI1CBP9RGj/NH/AMBrkxSdT3UysPaRPJoU
+WrXcH23Stkjyff37FkVf4KwwuIdOfK3c6amhLY2Nj4eu5Ib2x86CffB8iJL/AMA3V9Lh6TjLmR5l
+WZ0uieAfDF5ave6Y7wb/APVwOifuWV/nr0Xl0Ju/9fmeXVxUkcz4p0fw94c8QPOk88126JPaSfI8
+W77r768vMcO4LQ9HB1lLc3PDd9Y/bYEvYEupJ33+Zs+b97XJlOJanaf9fcVmMLov6/pkfiOX7FZe
+fB/Zn3IE/irbHzdepyxIoU+Sncit9C8T21r/AK9/JR/7iKzV49XJp29o/wCvxHTr62KPiCztI59C
+0m9kdLV3e61KT+LbF/8AbK7MJl9OnH2j3+fp3HUqanVWKQJJJqVrIl7ZTv8AvINn79ZV/j+WvSwG
+GjG9RGFWt9gytR8M6bPp0muXu+6vr19k+/5VVW+X7la5jTdSg6n9b2Fhatpchgata6b4V/4mOmar
+a2T6fBsv9Nnn/wCP/wD3trVhlCqRTUt/kPENTldHhXj7XdL1yaO6tE/093d7u4j+Vfm/uLXoYWFW
+LcpbfI5sTGLjZDLT4k66mjR6RP5d1ap9xH/2KwnlUFLnXX+u5f15lKTxhqzyf6D+4f8A5Z+X871u
+8uhFe9/X4j+vFIWWqX15HHPHJ58//LSStJTjFXOenQkzft/A8aRvPJJ9qSD/AF+z5E+avPlmNnZf
+1+B6FPAtnQ+GmutH8wafGn75Nk8ezc22vPxMm37251qjGJ6FY3+k+RPJpn7neieZHs+78n8VeNic
+LOWr2N1VihNU8PSPYuzv+82b96P8sn91dlctPE8skrFezaMqCw1nRdk0Mn30316CnTqLV/mKzLr3
+D6n++urSCSN08yP5382NlrbDVI09AnoUtBng/sp7WaPybvzP9Z/FXPi7XughqdZY2Kafa/Y5neEP
+seSRP4q8epWVSakthcrZjadpNjZX2o3Vq/7tNjvG/wC83fer0KteU4KKGqLOiQ6dc2v2yGBPuP5b
+p8u2vOVWUalmKbuaGsaN4UutDg0g2Md1PdbPsk+xN3m/79fWZfiI3scM43Z85ePtF0zTtdntbWP7
+Ls/1lp97y2/u17ODqSe5y4uMUjkHgCV6LbZw0pIjqzK1iOQ01C4nUsN5oqKJVpMSSKlTmilTYyOO
+ST93H/rKBiyRyRyeXJ/rKAE8qgBaAH1mAUAPyK15kx3iFLlQXiFFhB/y0osBe0/Vp7WT/npB/wAt
+I5K5qtDQ0jizqLfXbS68vy/vyf8ALD+KvMq0mjaOKNaznuIZ/Lf5JPuP/s1xVJtao9KnDmNPxDba
+LYxwJp8j+Z9y7jd91aUU3ox1KFjno/Mk/d/6z/pnWuxhuPj0vzJP+Wn7yT/WUfWLB9XudhH4MvrW
+3knuo9kdr/rJNj/8Arhcnys3RrR2OmvIl1axokdrvnfz/wC6v8FeV7R8zRsjG1m003ULT7Tbf8hG
+5k2RwV04aTho+gNGBJos8E8cHnx/a3k/1afw/wC81ej7XmMWjQ17U77RI/7MedJ53T53hfzd1c1C
+n7Z83QpzscldyTzyRvJ+4jr1YwsrGUp3Kl5HH9/zK0jUbOSoQD7PH/rP3kn/ACzreMrhTCOKd/n8
+v5KxlK2gRpnSX2gx6dYWl6l2j/ak/wBR/wAtVrjp1uafKbRpmLcPPPJJO/z113MeQZ9nj8vf5cj7
+KPaByle4k8u32VpSRz3KVvcXD/u/M2VtJDuWryS7nk+f5/3eyOP/AHanksTzjLiST+C38vZHSKI7
+aK5P/Lv+7k/5aVpOolEiEGdffeBJNJ0n+0BqX+lvsd4H+7Xk4fNFOdkjup0Gc/JPcfu4JPn/AOel
+elsZctyOSP8Ad0bj5bEcf7uKT/ppQZSI/uR/89JKDGQ0yf8AbOSuj2iNJaESF3qlY55VLGpda/qW
+q/ZINRd5/ssfkQf7qVzTwvLsb06nMZ8gg8z93H/38rWlCQVKQR/6v/pnTsZlry7z7J5/lySWnmf9
+st1FgJNLH+kfPHI+z/nnUzpvlsXTR32i6nYavbx2V588iT+RpVh91fn/AInrxJYSSldM7qcxniIa
+JaPH/aMaO8Mmye0j+9/wHbTpYet0/Q2qqmkVoYfB2vQXfkSf2Dd2sG+0knf5Z2/uV7mDoT+0eTVr
+QTOv+H134f1CwgTxJP5klk/7uBEdmk/uySPVYdRE2etw6BpWoOjzva6tY/8ALON0RtrLXo2iYSZ8
+WXz+e8l15caeZ8/7v7tcElqdtOlaJRso7f7R+/8AM/6Z+X/eqqjstCaatI2Y45IJPMrmlUudfLYP
+7fv4/L2SOkafu/LR9tR7C4e1sR6/q99qnz3s73U+xE3v975a2wtDlZlNHNNXoyZxTNTwvaJe6xBa
+n78nyR/71ctdNxNcG7SOj1LRdQS3ku4I98ljJ+//AN2uHDvU9HGu8SrJJvt/+WfmU7BcLe4kk/1n
+/bSjlC5N/ZU91HJ5H7yT/nnUQqWKhh0PtfCd/Pb289r5nmeZ5f7z5a7IVLmFbDo67VoIHtLCeafy
+5Lr/AF8Gz7u3+LbXNXw9K94/qa06kkcxBaJf3ccCR+RH5myS4/hX/eqIJomo+YguI/ss8myTfs3p
+JJ/C1OSJkUZa0pSsYs09B8Q63pEkj6dd/ZfP+SStOYOU0dS8d+KdUSO1vdSeaBP+WfyUcwco3SPF
+us6XP51s/wA+x0+dP4Wrza2CjKJ206p1HhddK1eP7Fez/Ynk+Tz/AOHa1ePiIypzTWx6dPEWRU8T
+6FYaDbSaLNaf6dA++DVU+7cwf7VehGv7SV47HBFnM+Rs/wBf8kddNSyfu7hHc7q1jj1ixtE0tI5/
+7P8A9ZHdT/NJ/ejX+5XFQw9pvn/r7jWs0c94g1m71HU/nt/svkJ5EcGz+H/aruqqly+6cqTK+mrA
+9/H9qTfaQSeZcf7S1zueh0wpWRjeI4/I16e1tY4/7Nf95B/F+6f+GvSw8rwOCrGzJL/xDeTWMFrd
+SO8FrHstP49q1jHDRvc1liWaX/CffavDX9l3Vgk8/wDyzv8Ae6su3/pn9ytVg4GLxLKFpqYhuI7q
+1eSG7g+dHqK2HU4WLlP3j2j4bfFYapdJperbIZ3/ANRPv2q3/fVPJMPGhNnJmL5omV8Y0tNe1GOB
+LSRLvT/kjv0/ut/7LXbi5cr0FgqCtqeXxJqem6n/AGdqvyRv/wAtH+f/AIFWTpe0Wp1xqcj0PUNA
+8PfYtGt/EEmpbNnzyJ93cv8AsV59KlF+8joxclKXKEWq2lm9jqH7t7q63u8afNB5f9xt38deBiac
+q02kb0lpymz4Z8RpPvsr10soH3pB/wA8Gib+D/eqpValJcqJnS5tSZ/BzwalHe2E++0m+eB0qMwi
+6dJTNqVa+hHrWm3iapG7wP5aIm+eCuahUlRp2YUpOSOx8P6PpXnPeo/nzuiJsm+bbX2GRSp1oXf6
+nz+aNxZ0qHNfQ06fKeXUq8x5J8TPEGu6X4jCQXaeROn7tE+b5f7stceKkepgoaHGanJps8cE8Ek/
+2t/+PuN/u7v9ivBxUz36cTL/ALM+1X9p5EnkTvOiSSfc+9WVCYVEdZP4b1nT9C+2vsvbVH/g+W5V
+d/8A3xXle1VR66FxGWNh/acHyO/nJ8/2X7rf8C3VzzrulLyNkdJo2nOkEkCfu4djvdQfd/4DXnYj
+Ey5myL3kRHVJ7b/QoURIB/wL73+3XThMH7WXP1RpXgnEh8R6rfJrF9DHaf6d5+yCSR/l8r/Zr3cX
+hb1dTPDKLgUodQ1zSLG6tfs88G908+f/AFqq3/oFdeFn7NWRy16Ccy5P4yjm8PyI/wDouq2qJBHd
+wPtlmirrhi1KBk6HvHKwST+fH9qk8+0h/wCWf+y33q8irirux6Lp+6ei+CPEXhXTLt5h9q/ffJH5
++zbtrsy6uqXus83H4aUpXR12i/8ACIXWqfadPukedEd3g3/N/v17NClDm5jy8Q6vLZfodIl/ZTGf
+502Q/ff+GuuniItbnnVMNK55trfjHRx4ueCysf7atbWxdLSBHTytzfPJs3Vzzqp1DrpwlBHi8Xjb
+xZZ6vPHok/k743SSTy93l7v7u6ualJwO2vTUx9taazrV1s1vXrt3uv8AWfPXJiswaZrhsAv6/wCH
+J/HPgLR9E8MpdJJvu3kR47vfu3fw7GWssJXrSneX6GlXCU0v+HOI0bRopk8x/wB5/wCgqlduNxJh
+hMNGL0Oin0LQbWw/d2nnv9zzJK8uGOqOW53/AFVENhoe+7j2R+RJ/wAs/wB3/FWtbFO2rD6ojej0
+xEkj86N0dP4HrzamK5tjpizcu9Mk/sZ3hgd/791/yzX/AGa86nWXPqbRZz/2eN/L8jf5n/LSvQ9o
+0RKmdX4RtLSOed596ZR0upPvL83+zXHXxCT1MJUz07RdI0eZI9Mkg3ybH8h5vu7v79Y5A4VarUvj
+ZGIqOJl6p4Z0nTI5Jr3z3kkfZHB/DHW+LpwoRdNfEx4eo5HKDT7qSN9P2JDA7pvn+822uNVIylzm
+8Kmg2PSpNFjkur1Pn/5YP95Vb73zV1ui5Ru9iKdTU19E1WSaCS6urXzn8z/gSr/erzcThVF7lSkx
++qz/ANheJrAWWx7XU7XY/wAn8SvXZSwsakbXMHJm9Y2ljbT3V1BJ/wAS5/8Alm/y1hjcPySvAujW
+5tziPEXxX/sjUXGnRwXt3CnkQT/eih/2v9tq+oylVHHU48ZK2x4zPFqeqX8j/vLq7nk3yf7zV68a
+sYM4I0rm3Y/DPWdRtJHRP9IT/visauZRTt/X5GywdzldX8N6lpP/AB+2kkH/ADzkf7jV00cRznFV
+w3sjIeDMf/TSuqUDKE+YjrMXKMxQHKLJ/q6DQP8AWf8AXSgBlIAoAfxVuL6gpJ7E9nZ3N3Jsgj3y
+VLxEYblcsuh2+n+FLO3jjd/38/8Ay0/urXhV8ffQ9elhEjXTwzZ6pPHa3WyHf8/np8m3bXJHGOOp
+tPCJlI+DbN4/LTy38j/lo/8AFW7zJxf9f5ESwaMu88HxvHP5HmR3EMldVLMIta/1+Bi8GjnLzS7+
+xjje6t5Ejf8A1cklessRFnnSo2Khl8v54/8AWR1a1MHNovWWs3cEkbySb4/+eclc/sU9DooYg6jw
+3eWmuatBZTfuN7/vPn/hry8Th3DVHROfMeg3vhjw3oV9HI90/kXPyeSnzSxr/er5uhjatZao9CMV
+Fmr4Thj1rWZIYPLh06yg32kGzzZ/l/2P4q9vAZbGs7v+vxMcfiHFDtct/iBqevpp+oXf2L+2o98E
+DukcaxL/AHq9epFcxxQh7px+s6ZqWnX08N1+/nR9nmfwybX2/LXmVYLnO2EPdKyX8iXcCPabPMR/
+sEf3fuv833qxhTu+Y0qS6G5qurWPiSe0nexgsruBPIkgg+VZm/vM1GLxMpqyCn7pzs52X072Ufmf
+Yv8Alps3JHU06cnH3i41kzF1MXl9dyPPJJ5j/wCs313YdKETmrJsNP0z7VJInmfOn/LOliMS1HmH
+ClYm17wzcQz7LK386P8A5ZyfxVlhsdeN5OwqmH5jo7T5/CCXT+Q9lZfuLq1dNu2dv/Z64KlOTqXV
+/Ji59Dntd1aB5NiQJ/q/3ez+Gu7C0He5gpamfp15B5ciTxyJJ/yzkSuhxQsPJm//AGTph0m0uvMf
+Y/zz7/8AZrzfrElUaSPR5UzBvLSO6u5Pskf7j/lnXoQqKO5z1F/Ka+j6Z4a/sef7W/k6wkm+D+7t
+/u1yV8RU5lyr3SIU+5V8S6nYzzwXWkWsmnyeQiTx793z/wB5a3w9Nx0bJaMSMWhuI/tXyRp/rJK6
+pyb2MZHZaZqPheaD7K0jpG/yee/3a8avRrJ83U9GNeLKWoJa3V/Paz6kn2GBH8t33tuZf4K78PTa
+jzP4jCtUfQyvtdp9gnsbGCP59n7+f97t2/3Gr0VO5ySL3hCDwXNfxx+KNSfS0TZJ9zzIpP7y/J9y
+to07mMjd03/hVGo6zq2o61d31tYvO72Ok2sHyNAn3Pn/ANugRxnii0tE1aefTrSey0q63z6bHP8A
+e8j+GgCGfwtr1rosGr3Vo6abdf8AHpO/3ZNtSalL7HcJH58key3pAUtQkuJ5PM/5Z/8ALOOtKGhi
+yJI5JJPL/wCWkla9TGRpSR2/2fYkcn2/zP3n9zZWcpq15HTGNom3o1o/9kyR6rePZWjyJ5Fu+9V+
+f/lt/wAArndeMnZMvCT1KseoR2n7iCSOeBJP3kke/bJUzp3Q4VLSO18IeI/AP9oyWPiFH/s3UYNk
+88n3oZ/761eCp2Znj6l4mBf+Go55JJ9Ik+1Wk7v9ggR/NumiV/441+dK25SOYZ9vnn0mDR5I4E+y
+u7xz7Nsv+4z0WDmNPwH9gm1b7LqE8iQTxukciPt+auTF1WtjXDwSJ7zUtS0XVpILLUn/AHH+reB3
+XctbYGq3uPEQizlZ/D9hp0em3U98l1aXv+sgg/1sH+y1c31hzduqPVVP3TM1OPSI9YkTSpJHtEj/
+ANZP8rb67L+6eel7wy3udlx5cke+NKhQJ9rczpI7jzPLraLsPluEunySf6uTzKpVipmVLHsk2VtG
+VzhmOtv3csb02roVN2kdjY6vPBHcR+ZJ5c8bpJHH/Furz0rSPRqu8Snbx/6Hvk/4+PM8vy60sFyO
+OTzI/M/7+UrBc29Av/st3G8cnl/89JP9iuepCxpC56NY+IbG6/4kPhqNEkvYP393ffKytXZhYXMa
+1zh57uS7ggT/AJaWP7i4n+8jfP8AerkxGHVJHVh6nMdPBaafpdn/AGp+4udOf5H2P/e/g2V4M41a
+jaWj+R2NxRwF/fwTvJHBH+78zzI/9mvcpRZ5rKP+sk/d1vKSRjIZ+8/3P3lTc25SeP8AefvKVwsT
+x20jxyP/AMs0rNtxdi1Cxo/ZL+xnggutiSSbHgk37l2f8BrBqM02aI3PFniiz1ryBNBPBqSSbI5P
++WXlf3v96uXCYJ0tY7FvRmVeWHkaZHqKSb5N+ySP+L5a6YVU52W5UtjHt5P3kc6fJ5n7yOuiaTb5
+jjUnc9C8JalqV1dQXWqJJqEKPs+0TfdX5P71fP5jS918rsethopob490uw0i7tJku98+ox+fdwP/
+AMsf++a9qnhf3R58MVdnDa5aRyR+fHJ+/wD+Wez+KjBzs7F1Y3VyOSwje0j8uP8Af/8ALx/crVTV
+zCTRneXsk/1dbKRjKSLBjkj/AHkfz0Wa0NpU9TQgEc4/efJJWFa8dUXKhzI7TwF4mLajY6DrUj3W
+jzz/AHP4ll+7H8392uihK8tThqS5I6HsfjzwNYeKNG/s5USGbz0fz9nzLXr1KV46Hm0cb72p514a
+02+0vW5/h14hk8yOZ0n0K7f7v+9/wL/0Kuf6vCPuo6frfNLmMe7tbH/hIHWCxuntIJ3TyH+WWdYv
+kbZXmfUXCd0ewq1o8xW0K8gtNW8i6j32ryP+4evFxlGTjc6aVXodv4d1DWob2DT/AC38jf8Au4H+
+X/W/7VeXjaVSdLle3yNp0uX3jvo4JLkeT5+Esv8AWQP/AM8q4KGFrVoWk/yMp4mNNFiRbPRhJq03
+yWvkbNif7/y7a/QMkwUaNLU8DGYlVGc3N421y1u5/wC07T7LBdQP9kgR90qt/fr0Z4ozpYQ8/e+e
+bTNSgSDf86TyTzp+/wBtcc58x6lKHKUZNFjnu9llPstE/wCWj/3q8HEzPYpopeXP9ot4/k2eYj7/
+APcesaMwqI3Ndj1K11q/tbp/khnd4E/h2N825azrUNdCImxpupWM2jvZahBvf7lrdf8APOvMlT5Z
+mqRc0TR7q903zrK6knul/wCXS6f5G2/3H+/XRPFU2/ZNav1MJy5WWDNBB4ntLLV7H+xo32TXU83z
+RMyfNtV/9qvYyzAOlLXb+vM5MXjLIp/En7MmvvdaXH+4dE8+dPmiZv8AZrpzWpzVNCcvu4nLX11q
+f2WRJLt/sk+x5IN/3tv3PlrzKFRxWp6boNyRNBPov9jRwXUG+6n2P9vgfd5a/wBxkroowtoTUeo/
+SpJH+S1/49Hn8jz50/hb5a5/q9plVKmh0mpeHbu2gjfyE1DTtM3+ZfQ/88v+BV0Yym56o5KeIk3Z
+nOaUmpTai8+lxyeQn/LR/lXyv9pqUqk4QO2dktTotZk8Qa1p0Frp9o/mTP8AvPsr7v3X92uXLZNz
+aTOGuoqRyelXOs2eoz+G9O01L3UtTT7L5c//ACxb/nt/seXX0uEjNts8/H1lCJ0LaZ4U8FaNfaFq
+6f2pqru8k92n8LeT8vzf79a1ZJIwpQbOH2X9rHaP5kbx3Sb7fZ/rfv8A8VeNWabPVpNxRN458Vx3
+XgnRvCkKJ9rWd553rqw1dyhc87ERakbGmeGJrQf2dp8cdzGkH7y42fLJLs/efvK8XG4jXU9TD8qi
+W9O0OD54bmB3tfk2TunlNHO1edVr66PU35WbeiC2h1GT+0rXfPDPs+2un7v+5ub/AGq48Y5te6/k
+HKzpdUvdLghf9wk1z86QO6bl8yvKwsZ38hRMa61HT/7BdHh2RvMm9P4dzV1U6M/aXT6G0TndSv8A
+TrWR4bZE8xE/0WRPu/NXq0qdTeTIdQ2IdO1mykgurqRJ/wC002XcaOis3+7WtRwXxGLqHQyy2Nhp
+STahdpbXUf8Aq5Ef/ln/ALNedgvdqS5PiD2iqGXrnxH8LWN9HYX0j3izp++nT5lWpo5biMQpVXpL
+0/4KH7RUzQ1C/wBLht0ufJR9PmT9xdJXDToTcrXd7l06ehgeMdftLqC12b3gtoH2Rv8AL/HuVv8A
+ar6uEuaCgiadLU4nSviLqFm87yXezf8AP5caI1dc8ljUV7/195g8UiPxP8Vb3WoLSOC0+y3dk/np
+d/ebdWuCyhRdr/195i8UjIn8U+L9bRLK5v57pP8AlnBH/wDY13ewpxlr+pwutzbHa+EPgb4j1aD7
+bqP/ABL7H+Df/rW/4BXbOLcfcKjO252Hh/wf4Q07z9L8j/So/wDVu/8ArWr5qpNudjuVOxan8Gzz
+eY+mb/3yfcR32q3/AAKsVg5TmbKokcj4/wDC0954PtYHnk8yCd3gTZuXzWT9589e3hrxOXEpVDyD
+WvBviHSoI3vbCe1jnj3pI6fLXsRq3R5fsuRnPyWcn+soFykflyR0h8ozy6CCOOOOgCSS3k8ugCOO
+OSSSOOP95JJTA6LTvBV/Mkc91J5MH/LT+9Xn1s0T0RvQwDi9TsNPe0sbeTTrWPZB/f8A4v8AvqvH
+rSlUdz2aUIpGnY2FrNpt9cpI/n2vz7P4Wrkqu0kipwaLnhvw/PqE/wA8mxPv+XXPjMUqcTalFs6/
+WL3RPD9qn7uOa8dP3e9N3zV5WE9pVk/5S3TZyMn9pXUjzJaJDA6fwQ7dy17KnGC1MXTZzl3F5/7h
+/wB//wAs/LrvjKUGYOjczrj4fNdQefZfu5E/1kddMM3UN/6/Axlgkzj9U0a/02fyLq32f9NP4a9e
+nXVXWJ51bD8pRBljro9lc54TN/Q9UvPtkaTyb45Pk+euPF4elFaL8zpoVZcx7L4Ku9VspvtWmf8A
+IVT5II0Td/v7648DJ30O7FNcup3XjT4c65qk9p4gef7ZvRPtcafe2/7FerUwzuebCr7pyHxdhk0v
+UdNk8+B40g2JBDs3R7U/5aV5tXCvmO2nV905GJ7jXvLee08i7tdn2S73+UuyuKdF0nymtP3tTMvJ
+NSnv7jR/Pgg8h/4P4m/uo9azpqC5mFSXQ0ItBntbCwd7SeDf/wAfc8j/ALpvn+X/AHKwxGLU46G1
+HDNFS7t7R9WkSHy0g3+X5ifOlZx5lHU6ZRSOv0P4c2mYLmPVUgndHeP+79yuB5jNz9nJaHM52ILn
+wzrOnwSam8nnXSfP5Cf3mrCWIpyn7M7aCUjibizu/wC0vsrzyJHdfPPH/CzLXtwqx5LnDOlZlnTf
+CX2rVYNPurtLJ7p/kkn+7/wKtKeOSjcyqUrIteKrC30iPyYI3mg37IL5/l3Kv364cBUdR3ZvXpKB
+xsniO/gsJNOST9w77/ufPXswwkZSuef7ViWmq6lBJvtLj95/31TnSj1MXiL/AAnS6X4i0ZBPJr1i
+ly779nyf6ttnys1cE8JVb/dux3Yed17xz/7vf5/lxvG//LOuy5Egk8jy6OW5jI0NE03Tb6PZ5jvf
+P/qEg/8AZqwxVecHd7FUbFe/0e8svkmng3p9+D73/fVVTxMZ6o6J02Zsnlxyf8fEcH/TOOu5Qscc
+ipcW8b3Ef7zz4/8AnpWqqWMZEf2e4j/1cclAiT7RI/l+ZH/20kkpgaH9ratPYR2L3cklonzxwb/l
+WoNStJJJ/wAtP9XQBH5kknz/AOs8urp7mMjtbHwP4e1vw3Hd2V3PN4qef/SNNSDZB5TV0VNjGRse
+JPhHqVlpnnwWE8EkEfz/ACfe/vV49CrWvaqvy/Q9CUfdJ/BVhrV74Vn1HU/sNzpds+z7LdPtnb/r
+nRisri/eg7P+vM46D948/wBY0e3g1CRLWSPyK6KVS6OitTsyle2UcMe/zN8lVRqWZFandFjw14iu
+9E1q01CH79q+/wCT5a7bHLzFXU9Xn1HU572f7908jyf8DosHMSW7kVLjFbl8kkegaN4u8BW1hBBq
+HhT7bOkeye7+1P8ANWtOKewckmcFrlvYJcRvY7/Inj3yRv8AwvXlYWclH3j1q0FIn8OaV52pyQ3T
++TImzy3f+7WWOxDjG61NsNhUaniHwa+nTSSWu97V/nR3SubC5o6i13KlhUjBvI4/Mk/gkSvRU7mE
+vdIf3af9c6GNGNrNtGkkc8f+reu6hM4cRAzK1ijnehtaV5k/7v8A5aR1hVid2HmdV4ftdTmjv5LG
+COeSC0fz4/8AZp4amLG1tCtZmTTon06+tE8zenmRun73ctcFek/aFU6v7sseMr7QZtaxo8H2VPk8
+yOPZ5X3P4Nteni53OTBU+Ux0vP8Anp8lcVNWO+rqdb4HvtJR57HV5H/sqdH/ANHT/nr/AASVlOo+
+Yfs1y2JLQaZu/wCJjG8+kwRv/qNm7/Yop1HcPZrlscdJ+8vNn7uPzK0qe6ZqNzVHhvUUj3+RvT/n
+pXA8Yk7XsbLDXMuePZJ5Hl/vPM311RbJjTRqW+lxv5ab/wDrpXNVqtG6po7GG103WNGtNL/48ksn
+/f3fk/NJXlyqOlVu9bnXUh7RHG3GgX8Ek/8AojvGke/zNn3V/v19DQmqiujzatHkZDeXl3JB5E8m
+/wDeb/MeuanGzKbKKfaP+miVrIwlG4nnzx/9NK09mhi/a7vy/Lkkk8v/AFnl/wAFHs0B0MniK0up
+II72Cd4PI8j7/wA25f46w5TZmFJBdpJvgjkdE/5af7FUkmYMfb3n7vy5P+2dM09qQXZk8z5P44/3
+klNB7ULOSSTzLT/Vx/8ALSStZxSIgaVnbyeZ/ufJHJJXHOqkdsB8Y+y3n/TRJP8AWfw/LWiqpGbp
+Hqngv4xaq09pp2tyI8O/9/fOnzeV/D92vSw+OSPLxOB5mbfxegtta0y0vdIffrmlv59pIiP80X8W
+x6rE42knyr9TnjhZLVkfh/xxanwnaa2+zU721fYkc6bZ7aX/AJafNWbxMKK5jdYeU9Ecl8QVtW11
+9U0//ltsedE/5Zy149TH+0menSwvIa3w78X3994hgstUn+1Wvzv8/wAzRsqfw1dKSUrsKkDqde1+
+ebVZPsUnk79n7vZ80kVeFOpUrV+b/I66NFRptHTT6bZa/wCGoYbq6eb5PO8xPlbctfcYWKlR5WfM
+PmhVbPH9Z0rVtIisdQvr/fdu/wC7tH+Zo/Kf+9XHNxi7t3Pcp/BY6Dxh4ttJrWRLWxSCPUNk8926
+fvWas8RjLq0TDB4b37nOf2d9pu/+JRJ9tj/5aRv+6avJxihQkoo9WnXaibfiCx0LS5dGurXy/ImT
+/TrT722VflkrorUaaipI5KdaXMM1+3j1CNNUsv8AUJAiRx/7rt5f/jlediE1K7OnCU7RG2mpSTQW
+lndWiWvnT+e+xNq/3d1cuOnzR0HGl7x0drfT2D/2f8nk3Sf8fX8W6vEVP2nw73LlI2tSFpcwWkNt
+J/pSOkckc6ebKq10KhGl8f8AX3HPKJzXxX0dLCwtLLRfPtZJvvwQP/ozf8Br7OpVhKWux5+Em2zj
+9IgvLLSfPvYHdN/l+ej/APLX/aryK2H9rUtF6eh7kZaHUeH9DfUoPsun2u9387y3+Rf3H+21YYbC
+urPmM5V/Z6GZHez6XoUmkeR58j3XnzwP/wBMv4f+BV68cTyQ5DCVDm1MqwntEt/I/wCWjyP5ke/+
+/wD7NcUq1onf7M1buS+2Jvd3g/5Zx/w+V/t159KteQezJbPxDdeH9Mu9RtY3S63/APEpt/4fNb+F
+v79deEjespROXGvmp2Oz+F2i3emWGpeKdaR59W1dHnkutnyqq/wV9rGd17x8xVXNHlOb1Lwx/aMm
+m6pdRvapqH+vu96Mvm/wtvr5z2NVPX9D2YTOY8T+GINFutiX0E0iOmzyX3bl/vVlXj3OyEzz2Sf7
+X4vt/Pj3+X/rP9qu+FPloHnT96se2aN8TY4fDj6TPYo8iJstH/h/4GtYwxajTOieEvM0PCGsfabS
+e1mgS6tdmzZ/F/la+fjip0XynZ9U5Trr9ba1sJ5XTfAib3/2ttfK14uWI06sNEZMFlIdHSe2TYqJ
+9ptd9enToqSd/iH7U5ifWdOn06SwurVHRP8AUSJ/z1rejhJp8y3D2hWSDwxcoj3kHk7E3yeQ/wDq
+13/x006yempq+Qsal4j8P/YtkN2+p3fzpHHAm1l/299dFPBVJ6yMHyHnmpWl08aT63qf3P8Alm/+
+tr2KTT+FESnFFvTvHPgy1uPPvbGfU7uCDyIPM2bfk+7trSWFrT2f5HLPFpHJXHirU53n8j9xA8m+
+OCP5vLr0I5bCMby/r8SJYhsv2vh7xZ4hk5Se6dE/1k/8K/8AAqxniaOH1/zOeUGzsPD/AMBfGWqR
+xz3HkWVq/wDy3d//AImvQhKKpq5zN8xuj4LaFpEmzWrqS68/5IJLX5FVv9qvBx+YOFVJbf15HbQo
+neeAfDHh2wD3kdv5KInlpv2NRhJOa/e/19x1YmTqM1fDXi9rzXp9MtoN8G/5N7/vNq172Dko/B/X
+3nFiMMoozfFmh6VYeJpNdvZ3e1uf+WEP+s81a58ZSpupdm2EblGxXvdW1TWdL/cJ/Zj7/Pj8n5fM
+tm/vV5+IxqpaIunhFzXJ9K026tU861Tzkd/kjf8A1fmL8z0YP2kV7rNaiuJ/wltlqU0mn6t5aWf3
+HjRNyxqv92tZVJyfvMVOPLscTfX3hfUL6TZo2yRH2QSIn/LBf9j+9XNmWIj9k1o0bFu+8DeHNb2R
+/wBmx79m/fH+6avBwWOxDqWi/wAv8jeUbHletfDvTEu50tfMtfJ3+ZG77q+ow2ZSW/8AX4HA8MjE
+TwBE8key72J/y03pV1M1X9f8MYSwSZpeNfh/aaXaSXWiX39oQQbPtY2bdu6jCY2NR+8Z1sOcDYXE
+lpd288f+sgk317FaKnGyORT5D1rw9/xO/skM0iWtpdfuI5/4V83/AJ6V8tKhyyPb5+Yoalo0mial
+Ppjyb/sr7PMR91dU3oLY1re4sUgjsoZP3j/PJ/u15XJJu50KdjumRLPQIf7M+e6mf5Nibm/2q8Jr
+nrNS2Rqp3JvEdro5ktV1CfYj2v7lNnzeb/vUYWTs+T5g2Y99qOvf665jT+y0+/Mn8S/dRfkrrhh4
+J315jFyMHR7nS7rWMeWiSO+yON/u/NXfWpVIIPa3Oznkh0PRJ9mze83kSQPsl+9Xk4epU9tfyEoX
+OP1r/ib3Udqmz7Lap99P/ia9fBtwR0VJHBa34dt5IN8EcaSf8s4/u7lr3cJj2nqeZVjc5SzH2e4j
+k8vzNknmeXJ9yvZi7xPH9nyn0F8IfG2mxRQfarRPtDzv9rnT5Wj3f7P9yuWMrMFqe76jrmj22j3V
+690j6cibH2f+y7a7K+i1ZcE2fN+o6haXXiv+1PsKSQeW7x2j/wCqb/e/9mrzHioJ6nbDDtnSSfbr
+2xgtYf3GnOnnSRwfxbf9pv8AnnXh4jN3Ken9fgehTw3LE5z+0dNj8Px+G7W0RHgne6nu5PmnaX+9
+vrtr4+U6VkZwoWdyvJrr2qJZO/2m1KfvI3/iX/frzqNG0rnS0ctJpNpPdyfZbuS12SeZHH/Au6vS
++s8qMWSi08afx/6XGnzxxv8Ae21MquGnLT9TJJo67w/8UoNL0qaw16xuo53+SOZP4v8AZrxcVknt
+anNCS/r5mqrNGFd6vBdXFpa6XaeYiO8yfP8AvWaX+HfXo0sO1qzSpVZpwXll/Zt3qbpv1G2mTzIP
++Wir/wACrjqUpyna/usVOqzmPE2tWl75Ag899m9/nf7u6vQwWGcDnrzucvHpUk8nmSfPJXsSqWRx
+KhzHc+DZvCnhu6kutd0r+1rG6gdNm/5o5a5qda+5tOjcxbq3tHn8+1gkggf544H+ZlWlUq2OijHl
+Kmpx6Z9kj8i0+y3cCP8AaJ9/+sdn+X5f4KuEuYwqRTGWcdw893HPH5ECQJ58cH8Tr8vz7qiq0ku5
+NOTiZUE8kEm+CTZs/wCefyV11DmCfz55N7yb5P8AlpRTAg+xVftLi9nYkjlj8vZ/q6PZ3D2lhlvH
+PJJsg8zzH/56Uy+YPs7wSSf89KA5j0jTfgX4xm8Pvq3kRwQwQef5c7/My7N/y1soSZlzJnFQWfn3
+EaJ/rH/d+XR7yFyo9G1X4HeLdItoNUsYPtUMcHnz/c3Rv/F8n8dU6L3OaMVzHOW954ssNZg8Swz7
+L6H7j/8Ajv3KxeJcdDrr4VSietWH7R1pHY+RrujSC+2f8sP9VJ/33XZOucNOFjzj4ieMNC14WP8A
+Z9rHp9rZQbPskj7t3z/3VriqVWd9Moar8RdFuvCNjoT+H7X7dbf8xXZtbb/wGtakjCnE85le4nuP
+L/56UU2FWJP9suE/dx0uQJTuNSLzPv8A+sqk0jmkmz0LwDH4Fn02+stetNl8/wA9pfef5S/L/wAs
+/uvW7qR5bHRJanM+I9c0l3jg0uwntYE8zzPPn83d/u/KtQ6K5S5T0MrSLcwanHH5H9q7/wDVwRzv
+FteuarKLj2OhRZPd6hqb3EfkQfZZIN/mSO+5pfn/AI6xhSjy66m0asokF54h8RfvEunkff8A981p
+DAQ6EvGsgj1meT/XwSSRp/wKqlQ5TKWKNkXGkSfJaSb/APrp8r/981lVVjsplXVLP/RJEn+T935k
+dKlOzHUhc5Fq9eCPKqlnTrmSC4jesasSadSx6H4R1ZLHWY3nk/0WePzNT/64W776xwdTU2xsNDJ1
+bWpL6+nvv9RHO7v/AN9VNR++a04fuzN8usee508lh8cdPYRtW/hy0n0mO6gu9935my4tP413/cao
+nUVri9m+awySz0WDTf3kl2mreY8clv8AI0TU4VFYPZvmsZkclxHJ/wCjI5KVT3jaKsdJovip7Kwu
+7Xy0eSfZ5cj/AMO2vPq4LmNVWscvILy71PzJ/wDVvXpQascqpsks47ySTfH/AKt/9XHWdWpE2VNn
+Q2/iLXoI7eCefZYQP/x7on3v9+uatRjKHmdFCrymzZfErVtLSSGxjtbqCb/Xxzo7UsBTdMxxMuY5
+G71OS+uJHkt4LWP/AJ94Pu/+PV21YWOSMit5cn/PP7lYxN4xuR/aPLk3/wCrqvZsxDzPLk/d0ezY
+BcXEkkkcf34/+WdPlNmH2u4RJPIkkgd49nyfJ96mlqYMPs8f2ePf/rP+ulTc09kEcfmR7E/1f3KQ
+eyH28lvH+78v94lTOMmRA6Ia152iwaf5cHkQPvSdE/e/P/tVyyoSvc7II2vDEM914htILL/XzPs+
+f5qzw+HdRl4ifKjr/F/wueHxCk/n7NOvfnnu02RLaN/8TXpfUGv6/wCCeW8WReFPEn/CK79O15Pt
+to//ACDb+B/NX5f4an2VO/MbK89EcJd6sbDxbd3U8CPpuqP5k+z/AFSu39yoxKjWVkbRTpbmxdXF
+pJq3nwSb7R9ifJ/DuT+69eVOPLG6OynV5ia4j8N2V3d6hZXfkSfI9pAny+Z/f/3aUeacQqRNG38W
+eF3S0vbbz7LXE/1kn3oty/71dtlGFzkpylex0vh7Ukubqe78+R72ZH/cfdTd/wBM68XG5jVoy02+
+X+RtVoRSuQWV1OLHy9QtEmPn/u57r51j/v1Tx8Uvd1Z0ToKJPr8tl/Y08CBJrSFNlj/0zX+7urmp
+Y6rOVrfkFNcpyenO+nPBNZSfv4/+Wb11VZe0V3ubpKxY1XTX1Sxn1RJPP1HfvngRP4aKdbVJnOox
+TGeF/EMmnwT6JqMcnnz7Hsd/3d1dGY4edRaEUKhpa5Jod1Bdz2Ukj31r888f3dsv+zXnYehOPxGn
+tNTG0nxPJOUhud80ifc8v+9/DXVWy105+4YxZ3ekapqV1e+eYJLWOBP3++H/AFjVw5pRfJ750Rid
+BqsmpX8djCbGCaHz/vv96P5P4q+iyylUlT5ai1/rseZUmqRZl8L6alpJMyJNap8mzZ8u7/lpJUZp
+krUL03Z/15kQzJf1/wAMcbr88mmXVpP4b1V5oJk3z2ifL/sr81ZRn9XgkjujT9rqcZJd3b6nOPMk
+8yD55JP4t1Z1IXnc6I1LaGnYWqb/APSpIILT/XyXb/vZayow54m/tC3B89j9qdH8hJNkn+1/FuZK
+8+UOWQe0M/Ro45NSk8Q3vnz6VA//ABKfM/5aS7/nk217ELU2lE4ZO6se5+Ir7Z4Ku7xN8Mj2v7v+
+8u6vqKvuUVJngUVes0eAX2rXd75cD/IkCInkJ/qt6/8ALTb/AHq8StirLU9yFEJ/C+qyRwP9kfy5
+vnSTZXlrG029f1OyFI4DTIJJ/Fcn8Eib/Mr3qk/9n+R4y0rfM7MJGiR/u0+Tf/wLdXzspNxPX9ra
+Q6Hxd4WstmySffB/rET7zS12vAPntL+vxMJ425T1b4qeI9QsfsdpP5Fr5n7v/nrt/hqqGSU6dTml
+/X4nDPEDHt/ijrumyahPJdTaan333+VFt/3aHPD03ZfqyfZzMqDwR4xntEvYLWfyJ/uT7/lau14i
+mloh8lQpSeFfETyeWlpO8j1UcTSjuvzKdCZSTw/4jSOR44JII4I/MuPn2/JWn1mnLYwlQmVLfS9Q
+upPkjkf/AJZ+ZJV1MTBdDONKbL8Xh67+3wQz/J5/yRyfw1EMZFnVHBXPcfBPwq0LTJIJtTffqrp5
+0CP/AKpa+YqZjPEVPZoqLR38s+kw3X2JZ/Ovdn7+NPux/wCzTzDBxjG0jeNRI0Y9XsZ9M+xQT/v4
+U3vs+6tejjsUpYdKO5x0KBXsfMe0j8yT7Uj/ADpvTbXh06c20nudrfKYv/CJX2pa5fJCn2CfZvj2
+P8qt/wDZ19Vh8una8/6+5mNXEqLKeiPfeHdRvkjg+1ap/qEnf+Fa6adeFF2RnWTqIfB/xOdST7U8
+E11c70eB3/1bf368i9SrM3bVNCzQSaNJG/lvNHC7pHOnyq3+xRUw7T1LoVOZmVff6a6O87vv/wBZ
+AiPthauWtaMfcZtTVyxPYzukb2SbLFE+ef8A3a5cLPmfvMKisRNDBNJ9tgk8+08vYkfyLL/wLbW2
+ZTcZ8ppGRnaB4gvpvF2nb9kKI/kSO/8Ad/2q1wOF5XzGFeqZPxL1GfUPE10HRIfJfyPk+Xdt/irt
+rzjsYwizm9Gvf7Pvt8/zx/8ALSP+9XBWw/MjeNJs2NO1zRv39lqcCfZbr5H/AN1q454eXOpRewTX
+MjyHxLon2K/u/sUbvYo/7iR/vbf9uvrMJXcoq+54mLol7wnr13D/AMSfz5EtLr/ln/tU8woW2OnC
+TudfZX89k8c/2RL2R98Ennpu/wCB15t9DuqljwrJI/jPSbV7BNjun33+9/erow0IylcxrzsdpfeN
+YtP1nVfs37nT45HREf5pGl+79+vnsywEatb3dzbCybMS48SWmtXcH29Nifxv/s1jTwbpRfLubt6H
+Tx6z4V0nT0tjA97BN9y3j/5aM3+1WGDpylVcqhg3Y4yHQoP7djupoPsto8zpBB/sr/tV6mJxrnDQ
+OWxq6zoEv2P+17WT7VaPved0fc0bL8vz1nRpS5Lh7WxyXmJHJvh8x/8Apn92uyFrGzlcgkt75445
+5o5PL/5Zyfw06bUXoZOJzXiTRHgkjn+5v/5Z16uX1+bQ87FwsjGtru4g/wBXJJHv/wBZ5deiqV2c
+NHU9E8EfEnSbV/sviSCd9O7SWv8ArfkrOvQNo4hIy77xT4Zk8t7KO7gk8x3nST/VfM/8Nec8HN7H
+bDMEv6/4B13hD4i+GodE1K11e/fzNif2bBsf73+/WX9lxWv9fmU8d71jKjksHt57rz98nl/6xPmr
+l5bS5T0ea8bmd/oj+X5HmSf89P8AeqkmJlmxsZH+5s8xPnk3/wAK1hUkYs68X9hZeHo715JPtXmf
+ZbT/AGlauZYZ1NVoaRrJj9Z03Udb0NJvL2bNibE+WPb/ANMovv1y4aqqdZpv/M2ikzjdTubDQdSj
+8jZNfQ7JH2fw162HhUrRv0OapVRdt9ejutdnuoIJLrf+83on71Yv4k+X+Gk8NJrQKdVFS4sLF0ef
+y/Jjn+eNE/hqPazTMKkLFrTLGxmtHgjtIPPf/Uf896UqlTa46Whd8UaHo0OnaVq8GpQTed8l9B/y
+3hl/j+SvSqQ5QjM4i5vILS7nRJ98H/LOdKIU+YwrVuU0NI0z+1J447pH+wpvuvtcCfvW20pV+QVO
+LZmXl4NHu5Egj/dunkOk/wDEsv8AFWtGm6qKqNIx/wB55sjx/wCr/wCWddlQ5Bkn7iD/AKaf8s6K
+bAq/bZJKv2dhe0uPktv7lHtLB7O4fZ5I/LkSSmRzGhZ3knmfvKA5j6N+Hvxu03UdGfT9dMcF3Amx
+HT/lov3fuV2rGRSOSnRkWdS8BfDTVpI9RsIHtbvYmzyH8ra0X/PSOvIxueQh/X/AO+GGbPTtElkf
+To0vJEedE/fv/DXpYPGqpA5q2GcZHhPxk8T6A97A/hiREvrWR4Lt4E2q3/slccpqUzqjF8p5Lr2t
+a7qkcH9qXb3X2VNkG/8AhWq+sInkMXZ+7/6aU/aoWwW9vI/7vy/Mk/5Z06kgpxLum2eix3cf9t3D
+wWn/AE6p5sv/AHzRSYVYkEdtpE9xO/mSQR+Z/o+9N/y/7dE6oRpXNjTNDsEu5E1Sd4INn7ieBPNV
+mrjlXN44Y7i/8H6K/hX+19Ljne6/5YPv/wDZK8KGNkq3L5/10N5YZWPLJLaTzK+rjJ2RwulqereB
+fD/huO2nhjk+07Pkfem1q+JzTF1nJPY92MtLHnfirRbvS9WntXTZHI/7jZ83y19Nl9eM6aucNWOo
+y30C8RLe6u/kgeTZ5n+3/drspNPUI0nItanp8dpcSPHbxwQPI+yP7y1yuupzt2No0mjLvLS3uz88
+f/bStacmYVal2Z0ss9i/kXX7+0f/AFclbwSkRWqWRk6xp0dpPH5Em+OePzP93/Zr0ee55vs7FHOK
+OS4e0sehXV/pk+kaY/2vz7t4/IuLSNPK+791K460ztpQKWoeFNTtbiNL6P8AeOnmRxx/d21ye3sb
+ToXILeOzg/eSf+A9UMgj/wBZ+7/d0gOpaKfR7WS+0uR5rGaPZdyPB92s8HUnLdG+KowTOeS4kjn8
+/wD1k/8Ay08ytJR11MZOy0NS00j+1E+3fa0STzHSeD7jLtSuapWcNDWMdR+r22mGPy7GPf5H+sn/
+AL1FOu0OtS5kYslv595bp9+N5P3kcddTaiiJ+8alnBPBJ+8/3I64pyjI2o6HQpY/btMk8nZNP5m+
+eD+JV/vLXD9YcJ6m9fU5eOOP7R5cn7uOvVc3JXOJQsdlpsnhO1n3z2jz/Iif7W7+La1eVF1L67Hf
+OmmijpCx6RrUfiJ0S603/USQP/Csv/xFd06qlHlsc9Omosh8XSaTPqfnWsH2KT/loif6qsMvlOK1
+1NsU1JmWmj3UOmSX3kb7T5/3n8KvXXOtzM5KmGVjEnkkeulQscxH+8+/RzWET3Eflx0jQfb/AGf9
+5+88ugC1qEdp+7+yzx3UDxo/mfcf5vvJT2Agjkk8v/rn/q6QHSeFfFGpaFqSanZf69P+Wb/Mu3+7
+WPtWpXHWjzqx2utfEe+8QQXcCSfYoJo989o77lkZf+edXXxrcScLheV3MaC01rUdJ+yp89ojvPHA
+n96JP3jVyR5nGx6c2m7lTWPDGrSeFv7a8jfpzvskf+7/ALVaYahKm7nJi8RzqxjaJceRZyRzyR/u
+P9X/AH2q69HmdzSnXSRRvLyC7uPMg+SP/lpHJ/eqvZ6HNUndmjoFjf30kk9l8j2X7/55E/h/3qzx
+Kua0jUuNW1lJ4Jp/3E8PzwTp8tefToRRtM6TRvF32pPsd7JzN/rH/wB771eVjMI3LnXQ0Om0TR/L
+vb61uv8ASrGdE8i+/h21y4jGpQUepsi/a2ulXV6lnM6JP/qbpPk+b5Pkf/cqJc1V3jp/XyCRC+j3
+GnpOmkT/AL/5/vpu+X+6tddCbUrPUxZwOreEPEHl3eqPa/JDvef+Hbt2/wAH/Aq+nhQmznc4RDw9
+q/8AZemxwajpPnwao++CfftaX/lnSqYa25k619jv/AL6bba5d6FqdpImozfcknhT/ll91d9epR5e
+e7OHERbiZ/xG1T7Lq891p+pPayJB5EcaP96VfvJ/s15uYKNSpZl4aKUdTG0nx7rk7wPdT7/suzzP
+4ZWVa5JQiqqPRcFyM9stL+41Dw9PdTWn9nwTJ8iP97yq+pptSifOOi+c4fWfCUFto8Hkz/PZfvrq
+NE/5ZT/d/wCAV4OKoe7oe/DEc0tStZeFH1PTZ0SCB3+REk/1U/m15GHw75tTqxFRJaFuTwhd2une
+RrOz7V5+9J53/hVN+xWr1f7HU4+7p/XqcFTMpKWn9fgclYH/AISWafQtPT7FYw7/AO0tSgfcsi/8
+8Ia86OBlReup2fW+ePvHUeHNHt9TF3ovkPax2T7LSBP9Uy/8CrvoZe6k1J/1+JlOvGEGkdzrXhy9
+1HwmmmWc7+emxP33y7tv9+vexVH3OVHi4aUZTuzyq7tbDRtZ+y6npux4X/1lfKY3Cza1PajWU5Ho
+/g+7fWdGnuXjghgtndI3/urs/irbC5OqtHX+vxOatieSR8/6Rp/23xnq8mlyb0+1RpBPs/262xlZ
+UojoVGzs9R8B6zbeZax+RPfO6fZPuK0n+7vrzMJ++kdrqtHjMGmXd9r/ANi8v9+8+ySP+78/zV9L
+Xqeyps83l55H0BpejeFtCt3svIS2vXhT9/8A61W+SvzzE1qlaflc9VR5Imvaadbzm+sptn2F9iIk
+P7qVv+A1th4JzvD+vvLdXlGag8+maUmmPY+TZQv5ySP/AM9Gr18e6jp2f6HPL3mZNlp2bSfU9PtH
+muod/kQJ83mM1eRUUqjVOWxvUlc4u30y61DxD9q8SWMiQP8AuIIETbEsrfInmV9Hg6cIR5EcU0XR
+4UghuJNO8x47uDYkaIm5d2/+8tcL55VDspzsY3inSZPMu0Sfz77Tn8yORPu7lrpo1JQqaiqe8dnp
+PiCfU9Htb2yd4Y9nkzyT/d81a8GeAdKfzIpy1Ol8O+INO/4Ri6efZDqML+RBIn+vk/2q9/2nJhzn
+qR98ztOTUZpPs1lvffv/AHn+zXPRoKpI1rVbI9U8NeHY9P05EmT9/v3v8+6vqqOAUY/1/meNWq8x
+rx2sCTvcon7902SP/u121Fc5oaHDRxzzeKZL3U4NiP8AJBB97/VV51TC3Z3QmPvPBTyaxG9nOib/
+AJ9mz7q1yywtppmuHxvuWNrUIX1NJ7Z/uI+zy/8A2purfHq8LGWHqe/c5q/sY4bqfT4YN7oiP5jv
+t3MqVwVKXMzrnO5T8i6udK8n7L5Ox3TzHfcvm15+Mw7SNqU7G1pPhBLrQ445Nm+Hf9l/h+X/AKaV
+7Cwir07S3OaviHzGJrngufT4I3gh/fvPvknrwsVgJUql+h0RxLscb4ou7T7RPawWkbyP8/nv95W/
+2a4acGpHa6hwN5HImpSTyR/x/wCrr15x90xkyCOW7k8x3+5RVUOhHtLlx9JkutNnn+1xpap/rI9/
+zfN/s1lCSTD2dzgNUijhvPMgr3aMeaNjy6lL3rneaDrz300d7dRpsdNk8af89Vrx8VhrM9KnU0sa
+FxOkd/He2sfzwv58af7S1lg8RKKsXUiZI8++knnSPzpPnnkrSUm5XJpysQwXME9p53lv8n+spSpv
+mNPrNzW0a7u/tVpvuN7p9yPZu8v/AHaxxUEohe56Lomnf2nPvvE2JbbHgT+6v+3Xy9eo4K0NWyzm
+fEd99v1ieCD/AEa1k/clIH+WTb92vYwLdKF2NFLR/Dl0/wBr89P9T88f92Rt/wByt62Lj3Bmr4ct
+NVvb59M2edu+T7K//stYxoqo1Y55FqHw/YXWmT+HtdsXSPz3e0vk/wBbHKvy/errhmkVFL+vyCrS
+ujzb4ufDi08H6jaW1jdyXsd1B58jybPvf8Ar6uhiFOCR5dXDXOBthH5n7/8A1cldFdeyXuk0oq53
+974M8MkyPpzyPa/8s50k3K1fPzzBqdn/AF+B6lLBRmjPPgK3eCR47uRNn8FaPOJqW39fcRLBGPce
+DdWg+eD5/wDx2ulZnGfxGEsMNuNb8TxpBJdb/LgTyIJHT+7VwoUm9BttFjRvF8EEkn9qWn2qB9/l
+xo/lbZW/iq5YS+xjLEyR7V8JoPhhqknkjWfM1x03wR3qbHX5PmVd3yVyrLlJf1/mW8beRyk+pi1j
+v/3+y7gneO08h/vNXmLBJSsem8TeJzei+GpLrVrRNR8yG1up/wB/d/7P8de7Hd3PKT7HX6lfWPhT
+VdS0/wAIzpe2uqQJa+f95vv/AOsjdf4q4pT5LpGsad9zkb+8ksprjSJ49l3/AMs9n3mff91qwo0I
+yV+p0Oo3E0vDGh+K/Mj1A2F1awWsf2qC+eF2X/Z+Wuitg5TjZ7GFGolIb4pnfXvElvaP/wAS7Urp
+0ju/MRLOD/eqKEep1V56FQeAP+Khk0ie7guh/qIJ4H3QNLL9z95XZexxLUiu9Mj0e6nsv7W2WP3J
+50Tdt2fwVwqfP0N+XkicZaWt/quppa2vzzzyeXbx168XGFPU85T5pGlcWz2k8kE/+sT5JPLrnp1F
+bQ7Z4blMq4jrWg1fU4pxILfNVzIzi5F5zI/7tP3n/TSsUlc6Y1GhF0q7k8y4jj8tE/1klae3SZFX
+CkkUeJPn8vzKMRO6HTjyliO5kguN8dEJKRbkdPoPjWK2kkngknSf/lo6fNXlYzA8zvf+vvO6hVOn
+t/jjqL6dJp+qW8l7Yv8Au45H/dRfN/z02fPXZCPLE47qTOSv9PtJ3ney1pLryE8zy7VH/wDZlrGN
+acHsdfsYyRzkkkkn/LxI/wD10jrsPPJ7TTLu+8uC18ye/wDnf7P5D/dSiwBcXOr6VYRx3Vpsg1GP
+9xcfPFu2/wB2tPYtbClVM20SO7uI4II988/yRx00qi2ZzybO1i+H88di/wBqjngvk/gdPvf7NeZH
+FSjUsd1OjY7KztdN0rQrTSNRuLV5HgeeT7Vvi2t/cV/71ZVME5VOf+vzO+GJ5Di/EXjy4urFNM0t
+Ps1lD8mUf/WUYTLeWV3v/Xmck6yscnc3kjx7K9h0EkcNSpc1YzaT/aJnkktZPuRxo7purzmmt1c9
+mMtTQW31fToLC9gu/tUD/wConnTdtl/jiojWu7JWKqx0LcnhfxDq+lPrS3iTHf8Av4IE2NHtrnq5
+nCnU5H1/rsYKlOJieVq89p9h+3yPB5m9I9iferoVSEXzW/M3jSnIqR6ddyf8vH/fxErsclynLGnd
+m/ovw7n8RTR2UGpeW+x3uPPjT5dtPBe9LYzxtOyOV8aeAfEPhd401FP3EkjxwXCf6pq9Tksed7S5
+yOKOewezuaelXMaeZv8A9Z/yzkrkxNM7MNUudvaSXf8AZkkn7t5II/3e/wC9trxpL3j1E9DAk8v7
+RXccY+gD2XwE3h9PCF1ouo38Dvqn3LR9/wArbP4q68HUjYxxNGakeW+JtFsNH+zz2upJqMbyOkny
+Orx7f96nOPMxt2WplRSyRxyeX/frhqxTkaqsbHhz7Jd3f2V50h3/APLd/wDVVz4xckbo7cNPmI9U
+sJLSCDUU/wBX5/lx/wDXVaKDdS6OWWh1t9pGpwQabevpv+iTxps/66/8BrOvg5R2N6PvGz4j8Nx6
+LaQXsG+GS6REng+6q+an3a5aTjye98RtTfMc0lnZzeYn2TzJJvkg+fZtaqoYn2WstUOpCxSkt5PL
+t7VIPsuyR45Lj5/mrrfLa5KgylqGnyQXciT3H/LOlQqp9DKvTaKMen3l1cbIJN+yP/VyVp7ZJake
+ydy9cvLBp7wWsk/mP8l3afei2f3qzo2kzSvFpGV9k/1f/LTfXZz3OA1tN8Ovrd3aafpfz308b+ZH
+PsiXdF97a9PkuBkXdncWslxBP/rIP+WkfzJ8n+7QaEMccd1cf34P9ZJRsASW9v8AaNnmSJ/zz8uh
+MB/mJ9o2RyUgNKz+eT5P9XWLmramtFXZ03hjw/Hq13JDazol2iPPHBP/AMtNv3kV6ihFTZWKrezR
+6ZL4PtINPtPEenyeRd2ux/L3/wCh/uv7+2u+jhna552IxjjKx5j4o8X67rTyJdT+RafwWMHywL/w
+CuSVWTlymvJ7tzidUuP3lvH5n+rrehK6Cpoyxbx+Zb/9M46z59Tqp07om0+7ktbjzI6zqrmKpHT6
+brsfkXaTwed9qg2f7rf3q82eHknobTKFhPIl/H5H30+etK8E42NUenaF4gtL21urlHeG9dNiQIn3
+a+ZxmF5ZLtc1Jv7D8y6tbmed5nf/AJb7Pm2/7lQsVzNp6IGXrC48vXfOgnRLGF9juj/Lt/3ZK6aN
+ZUZ3jqYs63T9Q0vU9V36gieXap5NrP8Aeim8370n9z+Cv0qjiINHytSlOLPK/ib4U+zXv/Evk/4k
+8zvdWsG/7r/x+XXlZjVtsejg49zLW/vLrw9s8+SbUUj2eZv/AHv+zXgTrz9un0O6ok4nYeCtZ8Ke
+IdJfQvEFpBZal5Domoon3v4t3/XSvpKdejUduvzOCpFpHGx6Fq1rqUkGnRvPPBPsjkT+L+58leLz
+xqSuj1IR0O0sPF2s6nocllqDvsR0gkuH/wB+uOvia0JWX6FQoq5v6Z490PKaRoljda1rFrvgSNP9
+Vtb/AJ6Tfc219RgWpLU8bF76FKx+G/j2DQrt77xB/Z+yR7qC1tfm+983zzVpPBKT0MvrnItSO2+G
+M2r6PHqet3d1qDu/7uC9nf5VX/YrkqxqTjpp9x1ynFS1Om0ewg8JxPGNiQIifuET5dv+1XNhsQ6M
+ve1N6tPnj7p2Wlz6fcWsd7Z7PLm/5aJXvUmuh4s1KGjJ7u5htoHnmk2IlKtV9nuYqjKWqOB8YXcG
+rWN3e6fpX2q68tLX7U//AE1/2a8+OLhXg7HpQThITwtBqUPgSfSP+PK+uZprVHnT/Y+etMLBqm7G
+VaXPI434B+DWurPUtX+1umy78iD+JW8r+KssXlyqx/r/ADHQxqR0msaZr/iCed4LV7VNJd0f+98v
+9yvKwuVypS0/r8TteMTPCPBMN9eeP4Etvnupp5Nn+826vUrQ54HP7bkkex2Fk9n4mgtfEEe/Z8l1
+v+ZNtfOYenCnU1PV9tzxOh1u18MaHrkd79qfz3ffBH/CvyV6OZ4Wnh9Yf195y4Wq6hnWN5Jq2qQX
+N68lzBNdJH5D/wCoZawy7EOtpM6Kz9md/baDPbQTu+z533pAn8K/3avGZVKSuv6/E8/60yvrekWi
+eGNVS6gRIHgf53/hb+GvSwWDVOneW41WON8D6Boc2m+fqV09tdum9H37f+B1wUPZuZ1SqNGXrPhS
+6n1adH2Tb/3/AJ/3VZf79ePmM1Grozvoao4AG70y71LQX3+Qk/2q0+f5f3v+xXXKarUlI46cvfNT
+Q77UtPknmhj+f7km9N33v96oV5+6dNSOp3HhzWLv+xp4bWPfO/8Ar5/4lrLCNwkctaFz0Dwn4mS5
+gj0+9d4dUT/WRzfLu/3a+3w9Ryijxq0LM6euhoRWtbPyI5N7+c7vv8x6zciXUsWPKQPv/jpKN9Se
+RxGfZoI5N6ffpKipBz8pzGr6DPDPfTffgvYETf8Axefvrjr0lBnfRncxtI0DUdQgjhSR0gsnf7/y
++Y1S8OqiNpzsbekaFrfmT/bZ3hhdHTy0+9/s/NW1DCWumcVbELmE0bQdRSOaHULp9iPsRP8Anp/0
+0qYYNSvzHTHEKx518Q9E/sWBL3/lvdO/l2n8VeRWwiizojUucFYwpe6lAmofuYHf95H/AHV/22rz
+MZVcToiyrfDTUup0tf8AUfPsesIqbL9nYfYw6Hc/uZnRHff+/wD/AEGpnKpHYXtLBr3gGwOl6jbI
+6f2rbeTPBPv/ANZEyfOtdGEzLVX2ZM4aHnFnc3GnXHlzx/u/+edfQVIqcbnnUqvvWNufW7/z4/Lk
+8vzNn3K4YYdRjc7nV5jVisNlp/H5b/8ALT/e/wBquWNVOVjtoUrmdd6RPBJG9rJ537z93G9bxqps
+5fY2Oo8FWunTTJ9pd4b5H/eR/d+b/wBmrys0nKK01E3Y9Xm1Sxs7ffcvsR/kd6+RjRnUlpudRzmg
+vokk+y1gmm85/wDXOny7q9HExq21a9BlzX9agsv9GtoX3p/Hs2x1jhcO56yf+ZLZneGPEb2s/npa
+b5k3vPdo/wA3zV79Om4amLR0s2vafdWT/wBn7LmdPnn/AIfL3f3q8HD5ZUdRdv68zVzPOPHWk30G
+pbJ7vz53/wBhGi2/7NfYJui0jNnNa58LLhvD8evaJP8A2hsTfq0CJte3r2Kda+kjzK+GdMZ4H8f3
+Gi2D6JdIj2M77459nzQNXDmGW+2V1/X4muGxMkWbrW7SS+jTTriN0d9kkkf/AKH81ckcM6cbyO2O
+L5i1dQXdlf7LnyL2NNj7I/8AVN/vVhzxeqN42kTfa4Nkl09oiQQ/wfwrU0uZPTUluLM/S/Do1SSO
+eaBHnvfuJ/dX+7XVVxVSLtH9DB0EyGy+F82tXc8OgmSC+spH8+0n+Vv3X92vWp1nax59TCcsiK80
+y/sbeS6ktHeC1/4+Pv1FOi5SuXUuonp//C5fBOo+Df7F0ix/sy6RPI+zz7P9U339klbZi/d0IwO+
+p5raW99O8j6dsTyf+W7/AN7/AKY15ClyPU9WpC+xszaDp1lGk/2t59fufuWv+tuZmrjhjKlR3Xwp
+/IqEE4j9U+InxM07RJPDEdn9itYE2Tyz/NKv/A1r6COKhUp2uePVptSOL1PU/EOseXHe3e90TZHG
+kCVnC3Y1qTJ7f+1tLt/st9JOkkn7ySN/9n7tRVkVSILi51rUbOTTrGPz4J3SedP9paqm40lqKpW5
+kO8KRQaXrsF1dfJJavXPj5yq07R6k4Ojdmj8Q9a8MatNBNpiPbXaf69H2bdv/AawyzDVKStJ3R1Y
+uscdFb+Z9+vWTTZyUlzG+l3oP9iyb43S+hkRI9n8S/3q41Tlc3biYkmoW3lyPH5kkn/POOOu2OHd
+jCVRIn0fVPMsJ0nkjgST/YeVqivh+WRVOvzFWW0v5PL2XG/zP3cfl1pzpIKiOz1vwr4QsfDUCQX0
+914j+R5/3n7ja1clHMHLp/X3GlSkZ/h27u9Ee7mtYI7qC6g2Txv/AA/7VTXkp9RU4DLgf6JH9luJ
+HsPvyRyJ91qftbSsT7F2O0tNW+GOg+EYP3EfiTW72T/S450eD7P/ALten7ijc5OaSZz9/q3gHUbD
+UnTTZ9F1X/mEpau89r/uyeZWJoctYa1Pav58N3Pa6kn7uORPlpAW8R3UcfnyST+X/wAe8cn3KznN
+Ldkxp3PSPC/gPSdQ0O31dJ4/7YedEgsdn7plX+9XHKrT6v8AM3VAl+JOrx2thaaY6WsF3DJvkkgT
+yp1b+H7tKhXjW946ZyseY6vf6tqv/H7dvNs/1fnu8u3/AL6r0FV0OCo3Iz/s/wC7q7tGdhn2bzI/
+n/eVF2x+yubWnWdp9n/fybP/AB6vOrVW3oe3hqdkaemaK975Fla3fn/f/cP/AAtWFbEtLVFqndl3
+UtG1y1gTEn7j7kkcL/xf7aVlRxMWg9mXE8Pxx6FHdfaEeeb/AFkH8S1jKt7xViG38C6rNPIlrsud
+ib/MT+Hd/er0cMvaq5HtVTOy8E+HNS0/XJNQvY/ssEMGx/n+9ur2svwfI+Y8bMcT7Q1/F0OmeKPh
+9qwsruB4Nj/6R95Vli+avVdeDPEp0D5MeKsW4M76cLDUjjkk2SSeXUQZpUdy1bXmqWEnySSR1nUg
+pBTdja/4TSe6uI5tRjSf/nps/i21xLARjselHG3NSO80i6kk+yyR+XJ/q4/uMtc1aE4m8a1zZ0iO
+SQb4JI3kg/5Zu/3q46rbep6EUnEqX8VxqRjuntPIt5Pk+T7vy12RxHIjkjhryM270CTTf38f+r/5
+5vRSx3Poc0cPyC29hHPJ8n7uef8A5ZvRUrNGyNqfQdStfLsbrzPL/wBf5ifvV2/3q54YxSNfZG1p
+OpTvYeQnnvG/l7I0/wBV58VcuIbvoPlKviLWdd1G0gg1GTy4LXf5fz/P81ditH3TKorsoWcD/Z5H
+ST7nz+Zvrnq1fsnTCdkXNQ8WTz6LJp3meZdvP58k/wDE3+y1dafND3jnqQuYTyW8/mPJJ8/l/wAf
+8TVChyrQdP3TOkuYPLkdPkuIJP3f+7XVCkcsq1zodD0mOfQb/VJ79EeSdPLsN/zSbqVR2NqKuONn
+G8Ek8mxNn/LP+KvMVX3jvcLlG8i/cRzx/wDHx5nmR11wn7xhKgVPt93anz7X+P5JP91q1nh4yRyr
+WdyxOJL3U7ue1gRIJNn7z+78lZwiuVRNFD3rkUmkeQE/efvH/wCWlTDENszdKyMSy/fmSCT/AFiS
+fvK9CrJ2OWhK0jpdEu49O1ON3j/cfck/3WrhxGp00o2GyyRwXbpaz+en/LORN6VFPQ2lG50uheLN
+WtrSfSIXeSxvf3c8CfL/AN8s33K2VeS0Zjyc2pha9YX9tfxwXXyR3SefBHA/mv5Tfc3NT9nGOrF8
+WhTkt/t0cdpHHHBs/wCWkn/oVFGRpKNi1oHkRx+fdR/uP9XceX823/erDExuzelI0L/RIEsI9Rsv
+MnsZ5Nkcn+1WMJtbl8pWjs7hI/P+z+X/ANNKU3cOUngsHe4jR/3P/TR0rKVbQ0ijoP8Aj1jge1n2
+I/39j1wuDe5qonYaBrEGoWU9n8k17Cn7iB32+Z/utXjV8JKM0+jLWxy9zrmpJdzxpaOjx/6+D+7t
+r16GBjJb3OOuVLXxZq39rQP/AKzyNnlxp8q+V93ZX0EJNT5kzz6q90901vTdNuvDSahrVon2pIN/
+lpv+X/Y+SvXq4WNaN5HjU52kfPeup4h0i/8Ats1o+nxzf6iB/wDnlXhzwsfhPXp1B+k3mm3Vu/ny
+R2ryOjx3bv8Ad/2FWqp0XH3UFSoei3994hvdK0p/D2lPZarbJ8+q3zwwRTbvldPL++1ehh8LTVKy
+OGcm5HMR+F7j+3508Xb5IE/eXUFq/lQQNXm16nIrHsUotxPc/CK+EfsEEGhRweXCmz5E2yV71Csp
+Hi42g0dCOK65I8um7GZrVna3Nunn3X2LyX3xyfIvzf8AAqwxtGFSyOvC4iSQrx6JDZfbbp4HSFP3
+86fMtJUoQLWIk2cJr/i+bRreey8MwO8CO7yak6fIv+wtePUzGhB8sf1/yPRhgudGPZ/EHXdT3x6z
+aedBCm9PJT+LZXiZ1iqlWPJF2/r0OrCYb2bNjR/EsAtP7T0mN5ET5J7XZ/d/vVx5VUrUJWf6FYqi
+mdBfeMNN1PwHquopvsnS1m3/AN7ds2/JX3uHxLqx1PGlQSZyfwFvdctvBPyWP2zTnup/nhfbPG3+
+6/3quLaWmxFuY9Dv/F/hzToJ3vZ0sp0R38i6Tymb5P8AapxrxT0J9lY+ZfhtevD4zuPEKJvjtd7+
+X9z5pa83F4p01od9LDpnr3h+6uta+3fv97zbHj1L/lqrf3a+XrY9zbv/AF+B6dPCJI0b7wTBDD9p
+mjeT7N/x9xzv95Wr0ngKko6/ocMMZaWhi2VpJbXME2mR/u5v39jI/wC//j/gq8HRqUtF+heLqc8d
+T1vSL6e6g/0pPJnT78H8VfSYeo5RPKq6nLfETWIHsJ9G+fz/AL/yV5ea4hxhY68JA5bw9oc8/h3U
+bl32T2U/k+Q/9371eJXy6lVhz9vX/M9KtVkpWNux0W31CweFJ/8ATXTfBIifd/vxVngcvw9Vctvz
+/wAyKs5JXPLvHhu7XxHA8zom+BIINn96KnQm1TszrjKKNrwHoH9oar9q1CfZap88kj/8tGb7tdGF
+w1Oa1/U5K1Z9D0q+8CwPfQahZOmn3yP+/wD+ebf3a+ijhY9Dy3WZf1nS988GrfZPO1GzdEngT/lp
+F/erZU3HYycjDtfG89trHz/Pp0z/AOo/1rRrWSxDF7NnQweN9Eup/ItZN7v8kf8AD81bLEB7NnQp
+Ijp8j7625iR1IBfLR/v0wIUtYIfkh+TZ/q9lAD/MdPvpWYynqOofY7WS58h3/ufw0+ewuS54b4v8
+QTia+/tCD7VfP8lpJ/DD/uV4zhF6nryRx1hp0/n273Xzxu/7yvIxNZN8pvSLOsWOlQ66/wA/+iRy
+J5kc/wD9jXLQc4xsb+0uQ+JLTw5I8k2mPsjdP3drs+X/AL7qKNWakHs7l3wxoSXP/EwvfI+xeX5H
+79/utWWJrtrlW5pGJR8YeFtN1HRp7qz2fbrJ/nRP7tXluNnTlyvZnPVpXPONDt/tdxs8zy5E/wCe
+lfR4qVzz8NqzubHUtVfSZNLePz0h2P8AuE/75rxZ0YKVz09kQjzHg/ubHR3j/ipTWtzY7jR00p76
+TU0jg/0OBPsPnfulaTZt8yvNxtVyXL33EW9feObRy97deTdI+zy4UfazNXFhKXLN2X3looeH7X7V
+YxvAJraBP+WiO/zSf3q1xkuSWqQMNbufE2yGzvI/9Fd9n2pPm8ynRpUY3cdzP2ZT/wCEY1iG+ks4
+Ud/k370+VdtbPFQtdj5CC40O+0+O7heT5/k2R/3t1brFqTuZzdzISPUkv7dJ9/yfJ5b/AN2u5VlJ
+WOGcLnq3hvTZLrStR0aGBEjmR3kn2bVZWT5WauDA0qtafP8AZ+RrOR43488Fai1/JdaX4eutPtfL
+2SR/eXzYk/fOn+zX09HHUeblW/zOKphec4rT57vTruO6h+SeF9/zpuX5a669OnVXIZxi0dNYeLrS
+51X7bqEaRyP/AKyDZ+4/8drycTgHCPLH+vxOmNZI6HTfEWk63q13pb/ZbW11DZ5l2ifLGsX3Y0/6
+6VnSoShHU1nX940bu2vtFutjweTdI++CdP8AZ/jipU5vmOmdS8Tq9Hfxrousz+NL213yfZU+1weT
+t+1238T/ACf8tEr6PD+7ozyKtmenajr+jInnzyWUGiX9r57z3Oz94zfdqqtdP3WZwuj5V8ceHLG6
+up38NWk7lH2eYibYJF/vRK/z15VHEOC5ZvQ9CrRTMGO+8a+HfIfy3SO1/wBRI6bkWtZ0KFZf8OZQ
+g4na/C3xjo0V3I11Jv8AEeoT7JJ7r/a/hR68fOctqVlbov67l0sQ4y1Ok8cadrmmRzzXPz7/APX/
+AOzXm4KhaXJaxviqsZxMfwh8Pr67tp/El1JJp+h2X7z7Vs3Ss3+wtfTS56UTyv4kh/xIn0yXVP7U
+k1lNQnvU/gT+7/frhp1Jzkeuv3cTy671K78z5P3H+58telTwyPM5LD7e8v38x/Mkkk2bPM+9U1KK
+Q+axVjtsf9dK157mfs7E322O3kjj8z/lp5nlyUezuHtLEl/JB9rnkgkjff8AP5cCOq/N/Cu6opyk
+i+YpRxxxyeZ9z/ppWkqjY7lo3FnJ8nmfvKHAU5l6zuL6TSf7OgdHgSfz5PkR5a5ZJKV2jajMkju7
+uOSP/RI54/8AlpJG/wD7JSlRhy7nTaxd0m4nnv5Hjj/1Ebz3Ef8Aqm8qs54bmjoPnII9WnsruSey
+t/Lguv3f2D/W/wDoVaToc6uZXLWtWlglv589rPp077PL2fvbVnqcNLWwKQ2Dw1/xLYNbuvk0Pz/I
+nngdGl/7910RRy2Kb2Giya19lSSSfTd/7ueRPKZov92t4zsOx6vq/wAKJ9FgnvdL0n+0NDm2bHef
+/SoF/wBmssXhKnfT5Bh5KWx1fhe10PVfsnlwb57VP+PVEdWjl/vb/uNWGGyqjL4X73z/AMxYnEzp
+7HnnxQ8Nz/8ACa3SWVpO6fJJ8/3t2yrny4dcqNpybOOis98EiQRyPH/y0k/iWolVlfmRdJJbjtB8
+MjWr7yEkjSCP/WSP92oxmKVGNhYegQ634W1LS3kgmj/d/wDLOdP9U3/AqMLjVOIYiga2rabfp8n2
+Sfy4H2ST7P8A4is1HU9CNSyKuj2Pnan5E2+FE/1k/wB3y6yxklFF4apdlr+3r+xu7h4Lvz5Hj8iR
+3/u/8Cq8LShYqczmj4n1OOfz0k2T+Z/rErphhYXOKdc3PD3xH1XTNSkvfM89549k8D/KsldGGoKl
+7pze09ohnin4t+IdX027spre1ggnRE8yDfvXyv8Aa3V3xxNvdOJ0NTkdM1XVoIH061v3gsb3/Xxo
+/wArf79YypHT7BIqyR7/AJP7n/LSsb2FyWGxaP8Aa7uBP78nlyeX/drepiLGtOhc09Q8P6ZH5n2G
+Sd7DzNkck/yS/L/s1gqzbFUoWMu40GONI5IJP9Z/q45K0hiO4o4SxJZ6XBHHvnf95WdStfY2ULE9
+lqkm+SCCTy9lE6CbKo12kaMfjPUrG8kF3BG9o/8Ayzg+VKzxGA5loa0cfaR0UdppWtwR3OkO91PD
+893G/wDCv+7Xle9S0nodsbTOgt/CUkaTol3+7WPZPIny7fk+ZPmrhqZlytcvU3VAzLjV7TSJ0RHn
+mngtdnzvuX7/APB/crppUZVddNzGbsV/D3jGSxS/srrTUeC6dJ/Lf723/Y/u16kaSprU4p1bFq60
+GPVILBLK787z988lhs+aH/fkrFqC1iaU1dHT6N8GYHgkn1S+2J/ywj/h/wB3dXTSw05e8jmqVLM5
+z+wrC98QT6fpdp+7tf3ckb/7P3mrx8RiHTV5HqqFzmNXge1ke1eP/Sk/g/3v4q7sNPnjdbHFX0M6
+80q3sYJH/ePJ/wAtJP8AareniHNkTw1i7bR3FpBH/HHUVHc2oxsav9p2k9h5CRok6Pvknf722uT2
+LTN41A8jzPL2Psjf/V7/ALv/AAGp5rSOiLMa30LUp9E/tVIPPgnndJ3T5trLXpPERVTlPHpP3bm5
+YabPqmgPJDIiPD/r4/4mWvMr4hU62vU9OnD3LmX5ED2kD2sfnx/8tJJPkiV/96uuLtLU43K8TN0f
+QLuTULiTyJLqN97/ALiu2riFynLQpXkW4LeON/PjjjTfXLJtnTONjajv4J7CS1eP95/rI5KwehvS
+jcyJJJLSeN0k3wP/AHK15IvUw+HQ6C71Lwve6TAk8n9l6zA/+v2P5U0VV7SbVkhcnLqU9XsLTzPP
+0rf5H/PR/wC9WcZWNaqsYnmSQSSSJ/H5fmRp91q6EuYwjKxo2lxH5fkTySJH9+P+6rVhUgae1O5C
+Qaj4PtL37XawT2u9J4/k82TY/wDcohQ5he1LEGraFa6dPpeqWn22+nRHsZ4H/dfPXO8Ok7EqsUdV
+8G6rpFv5l0nkwPsfyHf5m3f3KqdGyNo1yvaeRa+XdQyedvTejo/zK1eXVV1ZnoLYuL4h02ye61aa
+ffqgf543f/XxP8rxPWmGpzi1bY4q6MCzeA3T6i8fkb5/PSBP+Wf9yNa668knaByUI88T2fw54u1G
+9tYJtT/fInzxwP8Ae/3nas/9YZUvcf8AX/kpyvB6nP8AioP4hju5tavoEff/AMS3SoE3fL/f8169
+GrjIT95FU6Z534Y1W00TXftsEaXVp/q0knTc6/8ATRf9ulTlP4h1KZ7x4VtbfU7V9Q0y+S6nTelp
+vT+GV93z1WW05SlYivJRkZEngWf/AISC7/tCR549Qn+Tf/qpF/2qWKy2Tq/1/mdCxqjE3NMXQ/C1
+jHc3PkTbLryEng+bbu/vV6uEoOJwYrEKZo+JfEd1bT/ZtP2eeib/AO8zSy/6pFWjF432ZhQwPPqe
+OeIodYfxBHH4ne6hjm+e7k/uq392OvOqympnfhcNFo1LTxTYQeGLvTILREdHT7O/8VytZznOUGy1
+hoxZftUh1axg0xLpEfZ/qUf7zN/e/wB6vkF7SpVvY7ufkiU7rfpNoll/yD3Te/kI6NL833fNh/2q
+9uvll48zf9feZ4evzyJrXRPFsMccemXH9nwI+/7/APf+81cFPPacXr/X4G0qDaKOueI57X4YazpN
+7PBNdvdJBabPvbZX+Zv9yvrcvzCFRaf1+B4uKoNHp3hWa08K+BtN06ZEeeCPy/Ij/wCWjfeZq7q2
+JVKPKznwaueIfFHxHPezyaQ8bpPv3yef/wAs1/gVK8zDxkpczO+pSM3w54L1qPRZNQS42QTz+R/v
+baxxWJVtTXDUWj03wJqN5a2F9pjweffQI7weR/y2/wBiuCnglW2NK9RxIPGnj601iyg09LR7byf9
+f5/zfMvyV7dfHSeiOajg/Zy1J/CGv3Ghi0mmg+22N1OnkIibmhb/AGK5sHipc+peOp3Wh7B9uje+
+RIdj/fSf+8rbN/zV7qmoOx5EnqeS+OdcsbrX31C2k/2JP+A/Lur5rH4hTqWPbwELooeFb55zqV1q
+Fx5/nujx2iP5Tfc/vfcrmVWjCHLf8y61KTZ0nh3xVBp82+68+GaZ9kb/ACeUsf8Adow+Jhh1zEVY
+Sascj8XY9Gn0yT+z4Htb6B/tUm/5t1VSxdOrKy/UHRaG+F9VkutStJrmRI7VI0d0T5U+WuDENwqa
+HVRirHYaxr0/2SN0nd4IXSdN/wDFt/hrpwWLq31/Q5XhEMsvilND59tdSPNHN/qLv7skde28xcVr
+/X4GEsDcyrrxHHNqs+ppG8KP/q0+Td5uz79ZrEoXszEfUn/tLf5ieY/z+YlarEofsztvDnibWLL5
+PP3wP+/2P81ehCZ5R6pBPHNBHMn3HrrgA+gBj76ABndE31EAp6nH+M9b8m6j0/y3d3+efZ/F/sVx
+4qdjuhA4y78Gx6nJ/aE8bwwfx/8AAa8KEZLQ6JmPrlnqUNijzJskf/jxjRNrfuv4mrKthGtTekcf
+qV9favP9qm+eeBEgk2f7NVOTSOn2di/Y6df3PkackG+ed98kb/8APJfv1xSk0L2ljo9bsoLO7tLM
+pBZQXX/Lij/+PvtrnweHc1zyM5VrHM2+lPql9PZT3b2U2zZ5/wDdf+CtW403zHRRlc8okjv9N1u4
+g8z/AEtJHT/er6mo4Tjc8he6dvot062+/wAz94j7J7f7tfPYukmelh/fR6DpHhnSrmBNQaPf57p5
+Ej/8s/7ysteTmWKcHZGpQ1hLVEfT9my+3uiQIm7y9v8A7K9ZUIv4gMq40q+uZ/svlu90n3N9dEKq
+hqWd34ctU0Lw9/xMpPJ3/wCv877teHjKrxFa0NQZe8yG8S1ns9myaZ9n8S7lrBQdP4jP2hXF3ew6
+xPdasmyxSD9w6fd3L/crvo06dVB7QfNpMN7cpqSJ9mfyHf8Afp95qulhpxjy3MjEurqxuv308CWt
+1a/+RK3pxcSuS50ei6jq2n2D/wCi+S94n7uf/nnEv8VexQVShSstmefzXIdJtNV8RarqVs98ifuH
+gg3v97d/cWng8sVS818X9eY/bcpwOraK+qWMHhuew36xpD+S8+zyovKX/lpJJXW6c6NS5pKKZyVx
+8NLoyat+8+y/Yk8+ON0/1m3+FXrueNu7s554Zs4jy5LW4j8v5JI676zjOOhileR9Bpq1p4jsNNtY
+I/tsHyJ9rT/W7Yk+bbvr5eri1SnZnrKn7praj8Tf7Xtf7D8JT+Ra2sHkT6leptX+5sX/AKaV6OZY
+60lJf1+Bw0MPdnnP/CNR6RqP9navsnjePfpt/O//AJB/uVzVcQ6kLo9D6ukQ3dy8N15yb4Y4X2SS
+f7VcqXPG0nqdzoxaO20/W7XU/DN34YfTrX7U8e+0uXfaG/j2/PXqYeX7vljueViYOL0OF034T6X4
+ntNVvtLnTS7/AE+Dzo4A/wC6Z/8Ae/gr0cBWlON5HNmDUXoY+PiP4RsINU1GSPUdDvZ0+0Ws90lz
+HctF/wA9FVt9dlCNGEuZ/qcHs3NG54h+P+q+I7Kx0iysP7FhT5J0tX+Vl/u/7tZ453iXhvdkc34m
+gg32j2snnx7K8PDT5ZM9ev70Tnri3jSP55Pnrso1G2cc4mYby4g/1f8Aq67fYNnBUlYnt73z5PL8
+v95WXs7GntLkkmneZRz2D2dyxf6TYQJA9jd/apHRHnj2eU0bfxJSlUSM+Yxb9JEk/wCWnl1tSmmH
+MVJYfLrohG6OepUNXw3KYLuTzNib4/8AWP8A3q5MZCyOihU0Oxg1nfPGk0CJB5ieZIifxL/FXkSo
+yjE9epsaHxN16x1CPSX+wwJqUCfPqSfduIP4PMjruwdbSzOCdSxxX2jy45J7H/V+Z/y0+9FXRCVl
+Y15itJql/PH5Du86ff8ALf503VMKKi7iuXdMjn+z/wCs/wBX/wAs5KmRdjQTy/3bvH/20jrnlMLH
+q1h45sB4XSO51p9Quk2J9hn85Zdv+xt+Ss8Thatf4Xp8jOi40z2Dwpomk/ZLXVtLd0jnTe6fw/NX
+p5dlcKa31/rzOPGYnmJNQ8NvfPfb3REf543dNy7q5cVl0m3J/wBfidNHEqoch4Y8IaboM9/ezb9Q
+nuvuQf8APP8A2VryqebRppxfT+ux1vDOWxytlo073l39lg+y3Uz74I3RP9U1ceJbxFblOrm5TL8V
+eEfFWhR/ZdTkkutNm+ffA+6L/vhq9N4b2KFzKZX8WfE9NPuIIPD3+oj/AOP6N0Tymb/Yr1K1a9Xm
+PPVHnPO9e13xNqHl/bZ9+/e8fyfP838O+qWK9tI3VLkMW4gv7qTzH/1n/AF+5WMWgcSK4ikjk2SR
+/vKtGMkat5oD2scb+Yjxv/c+b5q56OIudHsEUrjQ3nkjgT/WPJs8z+GtViVEPYoqahpl3Y3ckE0f
+7xJNn7uuiliE0ZShcv2Uk9i8fmfu4/3b+XIm5d1c0oqTN6Oh2d/YaNpVqmr6fdJ9q/uP83mN/sV4
+VGpUrP2c1odMn2Ockt59Rkn1S+j2Wn/LSRPu7v7lepFeyXJEwcLmPHb+ZebE/wBW/wDq45K63K0T
+njC5L9nuI/8A2pWbrJxsbqFiaS0nsX2XVp5L+X/Gm3dVQxEW7wYc5A8envBInlyeY/8Aq5N/yLVt
+1G7sOYyoo7+wk8+xnkgk/wBj5K6JTUtGccY8uxv2fjvWoLGdL0SP53ySXe//AMckrgq5bCUro6o5
+jKP9f8A1dT8QaZqs9i8ECfuYNkj/AHWZ/vVz0sI6aaOqriUyMPIl1BP5f398Mn/oS1MJJXRhFXOq
+0DSp3dIPkspL10ggnd3Xa1ckZKctDswtTkVzL8TX9+kkdtBfzz2lr/q/4FWWu2jVu+VnNVneVznH
+1a+S4+2+fJ9r8z/WfxM1dFSinoU2XdT1P7U8F1N+/vpvnu3/AN2sKNKz8guZer6hJdJsePZI8iR1
+vQw6grmcqvMageO6j2JJs/6aVy8qUjelEy445P3kcn7yu6MzGUblvS5I45/Lnkk8j5/L8v8Ahb/g
+VY1dTejKxpeA/Gg8PRSQfPNIJH8//nk27/ZrkzXLvbSuPCV7QsVnkuLuS+u4bjZY3s7/AOiJ8v3K
+6PZ8kEuqMacbzbLtpr9pZX8kenQPNYun7y0uqxqYbm1NPrNzd8DalpVtqN9bTzpawahYvBHPP/yx
+3VzVKbkte4r3OSuPL+0SJBJvjT/Vyf7NdzRT1I5H/uUlTuYS0NXRILC6jne6nSHyE/dp/E1c9dyv
+odVJWGX93b3XkQPaIknlon+9/v8A+1WibSNpK5FeaRf6XHJa2sk8EEmyS4SD7vy/d3JWuHx3tEcd
+WjYhutW/4mcd7In9oR7992nlpa7l/i+5W1Rqas9DCLsGqWdv9o32sciI/wDywf71YUamhtUpk1u+
++0+yvHH/AKzf/tVDnqFOmMj30lKyGjqre7k8iPUZ3e6u7V/n89/7v+9XPGXvGyM8yWl1pt3J9o8j
+Uk/eRybPl/8AHKqnC87hX1OYtLe/1KSR4I98cH7z/er0alVLQ4lA1tIe4gffdJvkT/Vx/wB2uGvG
+MtjaNE9W8DzPdWtfJZmuV2N1Gxg/FDTI4NYtLqOeTe6bJII69PIcS1BoHRSMePwvO+m/2ulp/oKP
+sk2P+9/3tle97Ny1MnJI2PB3i/8AsXWfIst76a7/ALuOT5Wqqkv3ikcsl7p6V4+1u+tdHh1rTLp5
+rV/3Dwf8sl/9n3V7dWquRM8uhS984S+8T6NP4Rk0+y/0Kd3Sa6tP4ZJfu7oq8+vWujtjCxx1vr1/
+Hf8An+ZI7p88e/8A2a4FPU6Ymj4m8d+IPE93AL3yII0/1aJ/7PXRiffkYUKPKjY1+y8R2Vjpv9oa
+TGljAj7PL+aKTzfm3pRiqN4aHXQrWZW0a1juY0eOPyEh+eef7tfO4itKGiOk3tSh0efX4LpJ9986
+ed5m/d/qv+elYrG13Saa/L/IDVuvGmmwR7LrTd/22P8AfyI//AajBUYQ0FKMtzi7+903VL/TdF0i
+x/fpvn1KR/3vyRPvSvo6ns6VNVf8zCVSUtDT/wCEj1K+1zztR/v/ACQf6pY/k27Vrix2J9sk2bUq
+OhieJrSe912SZ/3zz7Ej/vf7tOljGoWRpRjZll55NP0OS1eB/PuXT7/8KL/drjg7zGy34Dure2up
+NX+1pa/2fI7yef8Axbf4Y/8AppX0eEkeXiYXZ0t98PdR1O4n1zT0jeyup/Pg+fczRSfdf5avGYRy
+ldF0avKa/gGx1nQNc8jULWNIL1Pub/8AV/8AfVVgk6b1OfFPnGav4i0rT/Eesz3UjvBdP5HkQ/LL
+u/v/ADU51OVvmJoULlXQNE0rX76d0/cpCm97R3/e/wCy9ebLCKsnY7HiXSOf8M6FGPFWpWU8kiR2
+yJPHs+b733Ury80XJG0jWkVtdurFHkVLvmF9kcfz7v8Aarkw0Go80TaRch8VaV/wjd3pl7Y/2hNM
+jol1/wA812fJtr08JUVOEk/I58TC7uS/DU2L+HIJp44JvLtXTY/ys395Vrnq4tU687+X5Gb1Q7Td
+V03z57L7XP8A2PdfI8cn73y/7tdeFq7RZrWp2DUvAmq2XkPGnnQXKb4P93/ar0cTT9m00YQq2MhD
+snkjuo3eNE/1dc0ZczN6k7FdLSRPn8v929d6jyo4Z+8dJ4WeD7dBDc79n/LPYm75q6sPMyrxPSr1
+9R0NEubJ/wDQvuPav91a9HmONROsgkSaOOZPuP8APVcpPOTUcoc5g694itdMTejpM/8AHBvrOWId
+iqVKzPO/FOsSXN9HqH+peb/Vp/dryMTWbZ6tJWQ6a+1WGxjM9156TfPPAn/tSvNnKXNdbGlPYv6i
+7+INK06SD5J7OTZP/sxf7NaYmo6kLLcimuV3OP1fQNK0XTY33/v3k/eV5FGpNbnbTqXKmiarHZ30
+F7Pv/wCAfe/8ertVJS1YqquP8Xaqby9jutIR1vHf9wj/ADf520qNO0nNBNmvex2Vl4VQ+Yk2qTbH
+ku0+Zt3/AF0rzuWspOa/QKbPB/F1hJp/iLzP4J9k6Sf71fTZdV9pRa6nn41XmmdTAj6hqFhdQR/P
+ex/PH/up9+vLrfu4NHqU6nuHpGna/C8Mek7ESSFNkDp8yyba+YxGElzXJuzOsbqxfV768v7vZfb9
+nlp/DBXXUouFFKKLujo4P7Ov9US5skT7LZ/x/wDLSZv4VWvNlF01YRxPj6DxBJdSWTzun8bpv/dK
+1e5lUFLcZkaFdarJaR2sM+ySB/Pkjf8AhlWvSxGHjbQg6/8AtKfXdWgS6k2Imzy4P4dy/wAVeO4N
+MR6Vaw7/ANxPHv8Av+X/ALzVjgYuStNGGJrrmPPrvTdcudb+y3Nhsf8A55on/LL+9XdUwsaa0Rp7
+T3T0j7Tomn+Hf7Ikuvtk0yPs2f8AoNfU4jEQjQ9m30PMhhnFmH4QbTbLxCmJP390nkyQP/C1cuRU
+YQukycatDrJPBOiJfSXUKbJLl/Out77vMavSxWXxnIyli5IdqPhGxndPJgRE/wCW6f3q8/GZIpR/
+r/M6KOPaPH/iP8GbO/vZ7rSP9FnT78H8EktZ0Kzw7tM6vZKpE8h0zXfEHgzUru1kj8m6RHSS3n/h
+3fx12VsBTxiuv6/IwoVXQZ6To99oT/DiwktZ999/qLuB9m5W3s27atfP5tSbrKXY78FZKxleLS+t
+29jpiSeW6Ij+Y/3o/K+9JWeCtRlzm2KoRmjEkn1PyI9OupPLgST/AI//APllI3+1XbFQlsVeSJ4P
+IeTekj+X5dRNKI+aTNCPxRo2kWOq2U2k/ar7UERIJ0fbFH/vV34Wv7hw46OpwkRgD77qOS6/55wI
++2tIyujOMuVHo2heG9J8QeDXgnt4LJIZ99o6Q+bdf7rT1lic2WHjyd/67GNGm1I4jVtJ+y372qfO
+ifcrlo1+ePMdMl7xzeoCBK9egjjnAxpRJJJXa0cNSmXtLkkgk3/8tK58Q2bwdzpbPRLu9gkmgkT9
+ym/9/wD3VrzHXjF2Z3QhdGOZv9Z5kf3/APV12QSTOSpTuQzeY8f7z+CriryHS90mn/s17SOdJI4J
+I0RPI/vN/E1RaRlE6fwh4JbxdP5Ph6B4761Tffxu6eV/vI1XZG0StqWi3fh3Wv7P1ST+4/mJ/D/u
+1jio82sTSnCUTP8AE2oQOPn/AH/l/wCrn/vf7dXg6NlePxDqVZGXb3Ecke+OOtZU9DljUNG+1+3n
+0iCxgsIINn/HxIifvW/2t7UUoJs6I1yG2uPPjjgtY/8AS3/d+XsqalNQYqRM0d3p135b/vJE/wC+
+WrKcFUCqXTr3mWccf3LiCTz4/LRE/wDHq6KUgnqe2/BXxP4n1G+u08+TUNN2J+8vX8qVW/6Y/wB6
+vTpVDgnA9hg1jSrmSSFLqB50+/BvRmq24zFFWIn0i3e++1P86f3K8x5VCc7/ANfmbxxNjn/FngKD
+VP8ASdPk+y6j/wA9Pn27VrZYdI0p4m55tqOpXUOqz6LruqzwbJ9lp56eavlN/FXPUwikd0KiZ4TZ
+y3FhP9q8vfJ9+Pz/AJqydPmiTGfIXtW1671iPzLrZH5f/LNE21nRoezfMbxlzjJLC4vtMkn/ANX5
+H7zzP73+zVRCSMf7PIke/wDeJ/z8RyR/drZGLRv6Folxql3/AGf5myeP/V/3a8/EVvZanZ7Fms/g
+eSyjnn1SR4UTe/8A10f+GsvrblshexZkx/8AHvP5/wC+j/g2f61f/iq3i7IUYFHxALSaO0nsvnkj
++eSOtsNNp2Zz1XYw7PXpHkjjnj+5/wABruq4aK96JzQxNtzSj1CS6t43jk3weZsjt/4Vb/drmdPl
+d2bqrzbFvTo5Ekjunj+5XPVeljqwsLnW6xpl3N4bg1ONN8m/Z8n3lib+OWvKw1X984mtaNjL1a28
+UvfQWWrySXotvkgjj2M3lbN+9f8AYrroTo2vD9TH2RkyafJ5kjwfu4P9X5cn3q7lXVh+yKMlh5cc
+j+Z9z/lnVKdzl5bEEdxZwTxyXccb/wDPS3k/uVsqcuhScUUNUudNkuI/7Kjkgj8tPtG//nr/ALNd
+NKi2tTzpSaNjR/FcaQR/avnnhnR0f/deuCpl7cvdOijWPZfBevaF4n8R2ttMifZbVHuoPn+9Otef
+k+VSp1fef9fedGMnyU7mH8TYLS1tb6+S705JHn/48EfdP9/+7XdWwdq+n9aEQlejc80t5PMv991H
+JHH5byR/7n96tZ0naxtcBf2k8+zz/J2fP+8rJ0HFbCuVtPu7B7vfJP8AJH+7g8z/AGv466JwfLYi
+jE2rvVLe08t55I/nrjo4VyZvOryk9vYSXW9EkjT/AJaJJvrFzszeKuVblPIg8zy5JJE/5Zv/ABVv
+S94560uUxJZJI5/MeDZH/wA867KcLoyn7ha0u5kgt450/wBY8n7z/wCyqZ4dzdhUq1jobCaexkkv
+oJ0+1yR/3Edfm/h2NXGq1tDf2NiD7ffzW8HlyRpJBvSOPYn8X96mqKWoXsa9vpP7iOC6j+yzo7+Z
+G/8A7K/8VcFatZ6G1DUxdUtILW7dPM/eV2YSpzIxxOhVNz5cn+r310TotsmVexo6Zq9ob608+D5E
+f59n92uXFUJKLNqVe56Z4ltdKtTHrO/zkD/JA/8ADu/h2181lmIqKfLY66juchHpem6qms3s93Ak
+8OyOCNPl3f3vkr3q9acWjGNG5zdzcTzyI+x98H30roo0rLQxqVC0JY38vfH5Dp/rJE/irPl1CnUO
+jnsbr+wrTUE01/ssL7J9S2fK277qvW0aXugi1Hb3+o2kEGnR/wB/7n+tn/661zRpam6Odu7O/wDL
+8hPMTz/+PiSP/nlW1KPLqKpqaVhov2LSYNQk3ojzumzZ8u2uCpV5p2HTgLv+1T/J8iJ9ytaeDknq
+OUjR0S+1bSNVtL27ke1gfZ/tL5FaYrKlUjr/AF+Jzyqk3xEvU1PWP7Qtf9XsTZ/F8tTg8Iqa0Jbb
+Oo8K+LfD9l4btNPfZdXe/wDeWjp+9+1T/L/37r1pVIxiYyotnEa1dzpfRwXUcaSWvyR7E2/x/wAV
+efFc2ho1odR4j8a3WoeGILLyEhtfk8+SD7zeV/z0rWNfm9wVCkrnn1w+yOppxuaygQI/7zfTnROe
+Q8f6qrmr6ounK6O30Tx7dz6BJouqR/bbX5ET59sqrF93bWX1m2jMqcbyIILEvpV3qH2vyJ7b78H9
+5WevElUtVs+p6JW03UvsUkjwf6iZNk8af8tIv4lrpiua6Qzo9b8RfD/R7RNUT5/tsf8AyCUdG+78
+v+1Xo4bC05K/+Z59avJaHF+BBfw3VxryfI93vSOP/YrmzWUOT2R04alJ6na6x4Vu7KNNQefzrWb+
+N/7zfw14NPFc8LHXGfunKWGrveeO/I06SN4LWN5Ekf8A2Ur3FRVKhzM5Y1tSee+d7iP7VJJ5CSf6
+z71c7o8srm8Bkmi2j2sk0GpIljvfy4J/vf722tKOIanYyqwNfwF41vtJurUGd/skM37+Df8Aer04
+4xQlqccadzc1jxbqOoajPcxzyeW8zvaWmxK4sRiVUlozeOH0FF1Bqcf23UXT+0f+W8c/yrtX7tRi
+sZzRVy6dHkMm1mn0yRNaN9svt/7j7K+/7v8AerKni3CXuhUoKY+PWNVluv7XknRLq9SaCfZ/sfd3
+R1niYe31kTRK2laNY6hJPJcyPsjT76f89awrvkheJtMfBYj7B5c0CJB86R6l/wDF1X1mDk16DlG6
+KXhPVbCy8I7Id8+pb3TY/wA0SxN/Ev8Acrvx+Gg3J+n6HNRV5EnhzUtJhu44NQj/AHD/APLeT/ln
+Vex5qiaHWqXO21m61Ga+eCyuvtMCIkNrdI/y+Xs+7HW+Nr8s0mYQp3LOn2Mkclpa3sCI9rPveef/
+AJafxeXV4al7xz4idjb1jTo538mS1SytfI86BP8Aal+/V5nV9nEeH1Mfwtptp9qk3/vndHSBP+ml
+aYeRVeJ2OlXXkwQPMkn2Wb5LpJvu7q9Hm0OJRN6DULWbfa2c+90Telb+0F7IoXfiu1toJ/OTZdQp
+8iP/ABUe0D2R57qt19snjeCDY77/ADPn3bmrzK2JR6CpWKE+gaj5H2qZH8hNnz/71cqqpmiR02mn
+fp0+kJ87v/y/P825f7lTVqKnGzIpv3izoMFjot1HdXt0if8ALF/95qyy5rmuy8X7quc38RUtdTuo
+JtMg2Q/O/mf89mX/ANlr0cTGCWhnh5nG3d3JP5k77EjgT95s+X7tePKTb0O5nZeCNH+5rT3v2a+u
+kdNO3puWNG/gkX/brqpTSk4o56rGajcSWsl9oT26TQTOjvs+X9//APE1xTryUnBBTZwfxj8IPplv
+YzzOjzunl7E/hi/2q9LB0/ZSsY4jXU5jwdd363aXSfv47H/lh/y12y/3anE0PaIMPUvoeo6Ba6Ml
+39tSeB43g/d/P/E38P8AvV8xVlJy1PSqSVjJ8I+HNK1fWdZ1TV7ueHSrb93HHD/y08qvo6WIowpe
+/wDqcFSTOgs9cj0K0TZYyTXU7u/mTb12xfwLXkY+MXsd9jmtYnkvbp71/L/0l9/lo/zLWGHpuGqG
+YN/d/YtSj1SD9y6JsnjT+L/br1l7xkb2h6ppqXcfnb4XRHfz/vbt33a46uDdwPX/AA1r+sancT20
+9jDawWCI77/9ft/vJtr6fDwtG7R5dVe8cbr82s3N9da5E72szfuIH/2Gr5vEYqdSq4xR6NOl7pre
+FfCwW3jupp/Jkh+R9/zfK39yowWGpV6XtJP8zkrVtTV1bRtKQeel0/23Zwn3dy7/AOGu2nClSjzR
+f5mdVcyJ/CU+ow3zwpO9yj/O+969PA4xzZjWpo7sV797owikjk/Gt9awTack8mxHd97/AMW2vFzK
+iqrOnBycFqeV+LvhpFrenarqV11R86bffedv7q15c1PDq8TtpqNRnhVx/bXh3U5IHj+y3UH+sjev
+QkoVo8zPPm5QZu6f4j8aeJdW/wCJXYQPfPGkHmIm1Vi/9AWlWo0lTuzaliZN2Lj6R8RL5/7OubuC
+1g37JP7u6uB4vC0tv/bju9jVf9IeNB8ceGtNu/sN/wCZY70SeDZ96X/YpQxlCtt+v+Qexqr+kYP/
+AAkdxfahPBqP+gxv/q7fZ97/AHnau+WG5YaHJKtzSNWw0+03x+f5jp/y02fe/wCA1yUZHXKl7p2n
+hHXtK0zQHtbqSTz97+XGibm/2a8PG4R16qZ0Rpe8cpf79Qv5L2b5IE2eZ/wKu6EPZrlRhWXvHP3m
+kR3sl3dfaI7VE/1cb/eavTo1jKUTAls9kmz/AJaV1e20OOcDevvB2s6dHJJcoibER5I0dPNXzfu/
+JXJSx1Kpt+pv7DlM+C88v7/meX/zzrd0VLZCdSx2uj+FLDVvDF9en/j6h/1Em+vFxOPdOso9y1C5
+5/e+YJNn/PP/AJaV9LRj7qkcWI90ff2FpBPGlrdx3sGxH8xEdPvfwfNSlUTM4lrRfEt9ol3I+n3b
+2rumySRP7lZ+wctjeJ215ceEL3Tt+oX2/VZE3ps+ZvN/hSvAhTrRldfCelUqxL2nfDtdU0z+z9Ug
+ezukjTyLr+GTd/BWNbNnRfNH+vwHTipHJ+IfAthoo2wal516nyT2mx//AB169TC5j7WN7bmTwaM8
+6dZpos+//j+3p5fyfw/79bQre8c7wtijpdx9l1KC6njjmSF0eSB/4q6a0HJGNM6nVNN1bV7S+8Vp
+Gn2FHRHjedPNXd/djrGhBoKpzMf7uTzI/wDWVomBdtNW1ayk32t28Lv/AHH21qqth8lxkl3dwPvk
+k+f/AH66KMko3OeUbnp3gL4sxw6b/Znie+1FIU+S1nsnT9z/AL/8bVrSrnNKhc2tS+MUWg3cf/CP
+65Nrtr/y3g1BP/QJflpuvFbm3sOU6jw38SfA3jfUrWyvNH/4nD/c3okqr5X/AE0renOMg9rynlPx
+FtNKSLStP0+13z/cjvX+VW2/wf7VfC5DKrOpKTfyPXq8vMVdS+HVtpfhyC6vfM/tV5N+z+8v/POv
+oakZwexjCpTUxkmtabY6NJa2sH2m6TZ5k7/6qNl/u14UcLKpLmeh6c56GFpYv9R16TUbqPznf57u
+T7q/8Cr08XanSSQqS1NDwzp9hBrsn7/7EiP+4f7vytXHjqk5UtVcrD4dI9M8faZ53hKf/Tn/ANH2
+SQb9nzbK+aybGOnX0XxCrU4s8P8ALv4PMkkj/wCmfmfcr76ouY5YLlHapZ2l3pP26CPy9Stf+P8A
+3un7z/rnVUqvI7GFZXOQ1A/349k//LTfXdQnY45yNTwud8d2n7zy3T95s2f+zVx413dzelI3NMt9
+buvL8/y0jf8A1e/f81cFWVKJ2RpyOkn8PeIbXSvtMGpJ5Pn/ALxIU/u15sMXSdS1tbeZrGnI7H4e
+WMc0f22Q+ddP8kk7/NJt/u14mcV5c1uhozJ+JyaXDexpp8Gy+dN88if6uvRyWU+W7Y0cVBbo8n/L
+OOR/+Wle269yUrmJqPh67vNWghT939q+SP8A4DXbh8byxv2ODEYPnLsnghoEjd454S/+ru/+WW9K
+upi3Fcxaw8Ga6fCpdUPn212/9+SRIHaJf97bXn1c69mua39fcarAQZjyfDfVoJJ/IvIP3KO/mO7w
+btv+/XVSzaEpf1/kYTy5r+v+CYieGNTukuJP3fmQ/fjkf5v+A/3q6/7ShB6nFPLW3/X+ZDJ4b1+C
+D7VJYTJB/wA9HRttKOLpN2ui3RkR2mjXd9cfZUj2T/8APN61rV1FaEOijYT4f3/kfarq4ggg8zZ9
+/dL/AN8VyvNlLY6P7Pkil/YeqR/PHHH5f/LPzPmqnioS+If1aSLccWr+X++t/n/5Z7KycYNXQ6VK
+Q/VH1OPyEvo5/nTfBvT+FqMOoSe46iZlXF5ex/fjkSN/+WkldTSZz87Rdt7q4t/nSSueUExfW2iQ
+ahH+8eeST/tnUqJ006wqXkkcHnpJG6T0W1sKpWNqw8TwT2P9l3s/kQefvg/i8mWuOeFkpXRft7lW
+OSwun/fx/vP+elVPmitCudMn8u3kj8tP9WlM05CFx5Ee+D/X/wDs1NByGhqHiHxJdWkFldXW+0T9
+55b1nTwUIbFVbozre5kj8yPzPv8A+sqpxRhGq0bFn+8t7j+PfJXNUWuh1U1oXNB02C6vkSd9if7d
+cmLrSjHQiC949E8N6vpumR6loOrQXT6JdfJbps+6397bW+CzLkpDeF5zk55Lvwfq3mWUbz/akeOP
+en+silqcFWdWXMYuHsj0R9HsZvD1rdanBsu9T+e7uk+aPb/B/q/7lcuOlKlSS+0dNGRgeIPEHhS5
+0O70yHzPMsn/ANBn/wCWTf7NThcMuXna1FJ2ZxMP2CTyP3k6JvT7RJBsb5f+BV6+HgluGK1R6/of
+h+z13wbHa6L/AKbpu/8A0rz/AN1O235vJ/369aNBSieJLRnlniCG0stWnSxge12O8ccDv5u3/Zav
+JrQ5T1aOJuM03Tp9UeT7LBvnT955afe/4DWVPmZtOqVP7Nv/ALf9i8t3uvM2eX9+XdUyjI5kLv8A
+ssEjv8knzxyb6wcZXN0U7eSPzP3n+reugYX8Fv8Aa5Nn7uNP9X/FQBRkPmeXvqzCNS5PHPcWvlzw
+R+fJ/wA89+35aqJsqdy99rvtRt5Eup47VIN7xwJ/F/vVzKnFbGkpGdJ5n7uOf54/+eb766lNtGEo
+mvp+hW/iHVrGyhgghtI/388n3d23/lnWFbEewi3J6m1WndnpOjaTY6ZdedqckEECJ8n93cr7dtfL
+1K/t5WibwhoTfEbWrKHwjdw2F1A8/wAiCDem7bL/ALFLJsI/a880ctTEcxgaN4P0rwvYWk2qSPNf
+ahseee12fLB97y6+jzDVrXQVOFxt3pVi+lTvdP58aSbLSRPl3V5ntmql4nSc79k0ZLH95dyefv8A
+3cifN/33XYq85S1QDNNntIL+Sd5N+xP3f91nreMTOqb1ndJPHYJPJBa/P+7n/wDiq469Jipm5rlp
+4Z1a+RLW+2XU3/LT52/e1xYepVo/0jQx7HRJ/tE6f8t4d6b0/vVdbGuLuwNHSktf7NS5mgTfC7wz
+x1yV7qdkZl3w/qGs2Tz6Rp8aTIz/AL+SNEl8xf8AgVerHNZUYW/r8gZW8W6dsm8jTLj/AEX/AJbp
+/tf7VceFn7qvrYu4zwdY+Xpn2N/LuntZ54J4Nn8P3kffW+Y1E7VLbBcnXRrHVJJLKytP9K3ukE7v
+/rF2fdrows5OeosRElTTr6yltHhn2WifPaT7Pm3fxVFfEx9rZmSjdHW23iCx1C0ghvfk1FPuRv8A
+LG3lf/FV9Jh8UpRPNrU2jptRn0vxNpUmx3tp7P53+T7tejyKUTGE2jl7CwtdF1GB0nS9k/j/AOWS
+/NXnVZKMrHVFe6aFzdaqmrf6bG/kQ75ngR/l8pq7Yz5Y3OWEfeJ9U1S1+yWs2gR7J33+fs/1qqtO
+tU0NKMdA1S0+1eHIJrmffdb9/wD31XNXfuF0o6mPdeHZE06O9tf3yJ/r3+7trFYZle2uXims2Wjz
+2d06PC6b44E+ZvmrkrV5UhWuNtPG11ZaV5M1qkyImxP4fu1008dzQsaRwtjktV1z+0JI3uvkgh+5
+An3d1eXChzTubxfKaV1Jqk/hmC6upETS4U/0V0T/AJaN/wAs2r3pvlRzQlc4xNBkuvI/ef6C7/vJ
+P71eBi6l2dsKVz0LwfpqQpvur5PsMPz/AD/umX+61Rg4KpO8jLERN7xD4edrW61JAj52O+z/AJbV
+2YnLFJ3j/X4hh8VyaHlfiDXr3U457GaCN7q6T7LHG6fKq1zU8OqMrnRUamjyy90vVtBv40njeGf/
+AJZyV6soxrKx5dalY7u01O1kuILrw9G76y+zzE8j91HL/wBNF+5Xm4ajVg/e/Q9GVfmNnTLnUU0P
++z/uQQT7J50+XczVy1sLCU7s2pI3dM8P/wBuR/2fPfeTdRv8m/8AeqzV1YXBJROevLU5nWNKm0+6
++zTSf6Uj7J5ErNQipHVGXumI9jJDdyef5n9z560pza3BmlpUYtZI98HnwQP/AKv+8tE+R7mDPRtA
++IljYfJdad/sRzp/rfKX7sbV6tHMIyVmv6+48yWENaCDQ9T0aB4d77PO+d/4ZWf+L/drgzKMJR0R
+vR9wdaW8kGkzwXvyTp9yeGvDqU4+yaNqZRsdK/cedN88/wA/mV5dFWVh1TqPB4077LHJDdJM/wBy
+NP8AnnX6RlivT55Hm14anQyXUCQSTb/kT7//AAGu2pVilzGXLoeT+JvEM+pX39oWW9HhR08h0+WN
+f/sq8bE49uX9f5HowwnKVrL4i6pc20lh9kR5Hfzvk/8AHvlrizHGKcLWNYUbO5598cbfSp5bSaG0
+2ak6b7uf/e+4r1hkzlezKxGsTlfhL4gfS9Wu7E/6jUIM/wC7Kv8AFXdnWF56NjnwE+Vnq8egGZ/t
+OrO6QP8AO89fGRumkj2YyuinrNrqWimdPkuoJvnjkf8Aett/56V28lppyFGd2cJr+g299fSfbpI0
+e6g8/wC0In/LdP8Ad/vV7+ExrXvM58TSM/R9FuNHnjtbq/gkjuv+PCD52l/+wqsXU51zIwoz5TTh
+vLS+u7TTp/8ARZ0d089/u/NWEpScLFSmuYXxJax6XqPkwJ8j/JH5D+au5awouWp1SmuU43UBInyP
+XpUp/wAp5laFyCzjuLSdL5I0d0/5ZzpuX/x6tpO61MIwsbk/xI12a7nmvbe1mnnTyUfZ/q1X+7XN
+HLKcdi3i2znJLk3cflvH+8eT/lnXdTpuOxk6kme6fCfRvB0fhXVdO1eSCfVHfYYJn8j91/0zrWu7
+xChpI8+8VaN4S0vRru1f5NctZ/IjjfzllkWX5vM2/c+SlQdohiNZHnclaxlYxjG5ryeENah/eX1g
+9inl7/MnSsquIsbLC3MBn2SeX/rP+ecldCSaOStG53HgbxzrOhNO8kb3ti6bJIHf7rfwsteJj8uj
+V8md2DfKO8S/ECTV543gsJ5Nn+seZ0+9TwGTqC3Nq2LZzc/iC4nkk328n/bOu9YNQZhHEMj0y4/t
+K/jsYI/nf/V/Ju/9Bq5Q5YmcZ3NG3s7zz7i1nu4LXyP9ZBI/3qxdT3TZUrhLHHBHHJJ8/wDz0/u0
+RpXCsTat9ggv40sZ49Rg2J5bpvX5n/g2NWypWMIET29xP5cCW/7z/WeZ/FWSqU4nRGnJmtpPg7U7
+2P8A1nkR1x18zpx/p/5GywcmauiaNrvhvVvtSaba61G8DxyQTpui+at8Lm1OS97+vwMMVgLv+v8A
+MydT1DUo9W+2wWH9izx/6uO13xbf93dXTCvGT90ylhOVHY+Ltd0ceKY9QS4nurvT3gewj2fuPK/5
+aq1Rl9Ohhad4/r/wTGWGqOWv6Gv4n8X6lq+nRwaL+5gnTZd79nm7v9mrxHEMU7Jf19x0Ucrblr/X
+4nAGCTTtMkSaPzIL6T93/e/cf7NY8ycLo651NRRqck/7jzPIT7j7PlVlX+9trz6jclqd9JaFy803
+QLq1gn07UY4Lr+NJk21z0atTm5ZrQiV0VPH/AIlE0lpY2t097AifvJH+X5v9ivbw+AoUlzW/P/M4
+pzZiaZbyXzxwJHJPI/z1zVKridcFc0rHSH1fUo7KygkjeZ9iR/wf99UU1zmNZWOE8X6Td6Pr13p1
+19+GT/gFe3TgeLOQvhfX/wCy57jzI0nguoHguI3/ANr+JaKlG5vRZrxnVILe0nku5P8AV/6v+7E1
+eZUjF3Vj01UkdCmt6nJYx2W/9z/cry1hYe0vbU2jOR3fgPSdcSB3k321tsfy3+T73/Aq8XOalNTt
+bX5mjMa/8N6lqF3fXP2tH2Pvg/vSL/s12UMbCnBLYLi6notp9hgfT4J/MgT/AE+P73yf366MG3Ue
+pU1ylO4nt9Ou47Xy5P3H35H+X5m+9XViaFiqcztLfxaHjg0S9nj8hP3cEb/8tP7n76lFupRaZCw6
+RZu576PTft+n/wCi+T87/Jtbb/FXzsaycvZs2jZDLXUZ7mTfrUH2qx2b49kKfxV3YSVOFVXFi4yR
+Q8SW9rplvps+n3f7jZ/qNnzV72OhTlG6/U46UZs2tL1nRp9Djmv3Ty3T94j/AHmkWviXg6ntrR7+
+WxvJqR5T4i8MfaJI7qfzI5ET9xJv+ZYv4K+swmKcHyyOeWC5jNkudShktLLV9j/JvtLtPut/vf7V
+b2puLcDVYiTLM8aeXXPCWuo9WMt4I5/M2PHvT5/nq7u1jVTikO1Hxcs2lR6ReQJN5P8Ax6z/AMUa
+0UsDLm5os4K9ZIy86f5EiP8A6VI/+rk+6q1unK/Yx50yl9jtz/yz/d/8s63XMw9jFiC38v8AfwfJ
+JV3MKcA1SeO6+yeXb+RJax+XJ/tbP4qpMVSAtvZ6ZdfJdeYk/wDBcR7P/HqmdVxNWkyzYaBfvaz6
+gkb3VrC/kPP/ALtKpi4rRkumwjlkjk2Vga+2J8ySfvH/ANZHQHtTVlNh9hg/eb38x98f/LX/APZr
+CkpM65YhM0/C3hsavHP8n8FebjcZ7Fo3pQiwvfCl9pDwJBcb/O+Sd/uqrV0U8bGbCmtDZ0XSYIL+
+BEuoJLpPn8yN/N/4Az1x5jWdttCILU7PWokhjSWfYlrGjv5j/wAO5N33q8XB1XNchvQq2OMa78QW
+sE+rixd/4ILt/wDVW3/XP/ppX0uDqxpKyMcTDnO58Jaba614du7VNdkh1F/uf8sF+ZNzfJVYbCRr
+VXJvY5K0uRnkepeGri2n2Pv+R3R/M+Zd38VdfM02ktC4vmRv2um2l1psn+kRpHAn7uPZtrzZzkpb
+mktUelfAz92NRg37NiJsg/h/3q+myu8jxcVoyz47uPh+nn2qWKTXSb/tUkHytGzfd+f/AH6nMKsI
+oWGd2eO28/2LVo5IJ9jwvv8AM3/8CryqGI1PWULoseNvFiav4k/teCD+z32J+8gf+Jf462dZMzRj
+yJPdSfappJP7/wA/8T/3qwlWRuirJHI8+z/ln/q6kZdjtEtY5IPLj8x5P3dNgVZ7by5PnqzCNOxD
+Jcxx+X/0zoNlUsTaZ+/3v9yBPn/vVhXpuJnGRtX3he++xR39l/pkMz/I6fe2/wC5XHRxyUuV+6ze
+KLng+7tba+2ahH9l+T/Vv8u5aWNg5rTUqhU5kXdc8TWuoJ/Z+nzpAmybHnp/rJW+5XNgcvtK8zT2
+hmeEtItNOuvO1CeD+2Xk2Jv+aKH/AGq9DHV+aF4bHLQw50H2ry5/svmedCj/AL/yfm/dV50/ep67
+nc4WRbvrTVbydJrOFEsv9Qlr/D5bfxVzUa0acbyMbmZqXgDVEukd0RI7qfZ8j11U81puOgXMfU9K
+nstS+zTbIJ02Js/u/wC/XXTqMioFvA/lz2r/ALz/AJ5zpTqTCmT2PmefJa3Xyfc+/wD3aU5Kepoa
+9lrFpozvNH/pNq/8Cf61W/2t1cFXBOvotBFDR9Z/tCTVf3fl7/3yJXRjsOoSRmP8PvfQ65afYrrY
+7v8APsf+H+JWoqRi4Aeux2mgW8yWuoSJcwz/ACR7PmXd/v8A96scPCnhnabvf1/4JldnP+E9RT7d
+4gsI43uobm92Rz/J96NK7MZiFKhywW/9dR3Ln9mQaNrsfnOkMaOn+pfc/wA1YxjOGIUX1/yCda6H
++LdOHh940h3zWs2+ZJ/4q9XHZfCPvP8Ar8TClWux+neFH1Dw39pm2JO/7+13vt8zdXdh8ucY/wBf
+5mFXGJnRi2sdA0uOG8vtmqXPzpP95fl/vf7Fej7NxiYwqJnIyaj519Pe3Oya6ef76fd2/wCxXg4t
+v2iO2MfdOj1vxN53h1LbyPJn+SF/9qL/AHq9WpU/do5oL3jBs31W1m/4lj/J8nmSJ935v96uepUL
+pR0NbV5rpNHtbKaB0ut/zv8A3lq6j9wujHUrR61qT6dJp7zp5Gz92iJXEsXJFfVrFW4ur6z/AHPl
+7K5azdQOWxl3ct1ex7337/8AlnsT71aQocprKsVb7R4LW0R9QgfzN/8Aq/70X+5XbBcpzylcs6l4
+mm1DQ5NMTZbWX/LS1RPvVlXxGhpCjZmM6QeRGkE7/uPk+f5f++a85w5jthKxtac86TfZXSR/+ee9
+65nF8t4kVI8x2WleIo03pDA6T7NkEe/bF/33Xs5finGN5HDOiZevaPGbGPf/AKT+/wDPup4U2/vZ
+P+mlRioOUTbCyOJ8WeHrW78P3f7t/tdq6PaO/wDd/jSuPB1JRdjpq0rnN/DrVruynntYZ3tZLr+N
+Plr18bKaR59JHtFl4We501HeOC63p/rEf5q5P7Pc4Xf9fiayr8pW0vw7e6Ek17p+yZ4vnvrWb/0K
+OnhW+QmtLU5m9gSeBJ/tfnRzPv8A92vKjFuozrjL3RmpaF9mtILmaB8zJy7/AMVDo1Fv+ho2TW+k
+2lrptpqH9x992iP823+7XbQw6a1MmX7fRLHXp31C2g+x6Wj7ER/vfL/frbEOXPojGNW5bhstR8OX
+3kx2P2qO92fff5f++q61GaWqMKrH3mvak8/9nw2rw6jv3yJ96L5a8P8As+V7f1+Z0UkU9K1q+gk2
+Xs6eXNPseR/vK1GFwNqln/X4hVL81jZHxLs0qZBbJ1m3/Kv9/wCavUavU9nB6GMoXjqdBqGowQ6X
+/ZyP53nJ+7dP+Wm6uqrVmv3ZjShdleT4eRzFHF79mh2fv02fvG/3q2jk0bXv/X3mjxmpzkGkTeHN
+Y2XNr591Mjpp2z/lo1cNWi4O1jo9rdHB/F3Qrq20iB7+R31G5n867n/gb5Pk/wC+K4sEpKtYdTWJ
+n/s++EbLWdav57r/AJckTy/+BPXr4jCzmrHkQm4yO8+JOrQJdf2ZZT70hf8AebK+brYde25Ynu0J
+Xjc5vWNJ/svSrXUNR1JP9JT/AEGBH3Sqtd9TCLkvIzo1LyMeHRNYnS01CRN8P34977W8pv7teXLG
+Ri+U7HPmI/E9po1lb+fpHmfbvMdJN7/vV3f3NtdtGtzaGDpHC3+kanamN59/7/549/3q9SjiovQ8
+ydJ8xbg0zU7qOB/M+R32Tyfxf9tK53iYKTOmdKXKdS/h7z53g1C+gSBPuT/w/L/u15SxX8qOiEbn
+P61plpa3En2WdLq1/wCWc6fdr0aFZvSW5lVjY5u4tx/BXZGTMZU0gjg8v/WR/u66I1GYyqJGhHr2
+pwJ5aSRzx+X5Efnpu2r/ALFLmvEnaRkXc893eefqM8k8j/J5j/M1O/u6BvIhe3t4/wDlpWsHcIqx
+r33iu7vbT7LdW+9PLRPM3v8A99tWdSlrc2Vaxg4/d7PLj+euhpo5uW4R+YI//adZum2TflLtpLHJ
+Jb+f8kfmfvP92nGs07FyqI9D8TSeCdX1LRrLwlBHbeZa7J/Ofymkn3/8tP4Kyxs3Y3o2Od/4QrWb
+HXXspoPInSTZ9o37Yvm/6a1OJq+6SqViTWbiB9S+y6jAl0lr+4/cbP8AVL/ckrKgm0bxlY57WNP0
+SSTy7KORE8z/AFjvu+SuzDzuYVhL/QbexuLdLGTfJ5fmW9xA+/d/wD+Ctq07GMC26eJo5I/9Lk8x
+P9XHOmyWuVU6cv6ZvGpJGtB451q1jjSfy3j/AOmaVx18tpy/r/gmyxkkdH4b+IWmm42ajvtf9v8A
+hrycXkc7Xj/X4mixHPIXx01p4gitLrSLr7Ts+SdE/h/2qnK4ywzamrHXVXumxqWhWo06O509PssB
+2QTzunmsq/36ywuPc6ypvr/XY5p0vZnC6rqf+kSWUd39qgT/AJaRpt3bf9mveqYCMJl0qvMZkd3J
+JJ+8/wBWn/LSSq9ncCDzJPM3/wB+nawEdy8aR+ZPbySff+z/AMPz1vh1Y5MRC5S0+zu7q78hI98l
+PEVUkGHhY345HtZJPtUfz+Q8Efl/f3VyQly6HdT0Lmm69qdraQQ2MbpPDv8ALnT/AFse6ohHknzB
+PUwfFdmmo2dxq91dzz6yjpv8z7skX/2NehTxzlUSfU4cTA4SvS5mzzr2PQbN7/xHZ/a3j3vBGlrJ
+Iibfup8v3a8zFylzXPQp07o2PBtvawX0n9qSOiQfJHsTd838NeTmM5SjZHfg6dmek2uvz6p4Znsr
+W13z/wCpgj/56fP/AHa8SGVWrf3v68yKsriXV7ovh+0sbq1sZ/tYT7k8n7iNv+WteuvYOXI/jXqO
+nSuWNE8d6Tdfb5tQtf33kOkcCfMsi/e+assBfCVJSh1/rrcrGYZVNx8t7o2uWCBLSD5P9fO6fdX+
+BK1nnNSNNwkt/wCuxz4bBqGxg6NoF/Y67aT3Vo82lTR7/wC/+4rXD05yhz9DaWIUXqbuqo91P9it
+ZI/st1G/2SxT/lom+vL9nOM3KC1/rud9KpGSuc7qGrTeH7j+zL6PZPs+ff8AN/uvWtXKZXu/6/Ea
+rU5Iz9KutY8Sa7Pa75JnuY3T+7t216uDwSSOGuoIk07Sv7QuLSC68+106De8mxPN27Pv1tCTlrIJ
+uMHY6HRNEtHtH1C/d7OCF38y7nf/AFkdfMYys5VOWOpvOaSucdd2HhTUbeeG9efZv/0HZ/d/6aLX
+owrVISuhVPeOYR7u1TyPP86CP5I/7rLXoSkprzOKcLFOSz31pCfc5fYXKY0mXzP+eldKxMY7C+ql
+6w0PV2jkeG1d0/5aSJXNVxUOrNaVORNLZ3EaRu8ciI/7uOT+GnTqRk7FTTKskEiRyeR88n+3XRDz
+I52Rx2kj/wDXT/lpWVSokS1IUWh8yrjU5jSLkdt8MtdtdO1KSx1fz/7OmR4Jyn3P3v8AFtrjxeEj
+Nm6qM1fiH8KX0JP7T0jfe6BNs2T/AHvL3V6lfC8vvLY8nD1fesytH8Nnk0ZJo53/ALVdN/8AZzp8
+336+doZhOVZwS0XU9h0ISV2Y9p4H1h4LuaFHdLX/AF8b/wCtX/gNb18XGEuVip0NLmt4Q8dyeHke
+1mtftNrM+9ynyyrXHjso9ulJOzNYYm2hNr2p6P4hgjtfDcF9JOjvdalY7Nyxov8AH8tdmCwUorUz
+nikzmtPv7RHR3n2bPuIn+t/75p1aLvsOnJM67RPEGu6rfpZaxHG+naX88di6bvMnb/V/aP8Acor1
+o0KNluY0KfO9TqfENzqt7YQWz2kFrJv3+f8AeikaL7qVjDFQ9jd7/wDBNqmD5XdHMeH0gTUp9O1B
+P9fvSP8A677PkrKEjokQWFjf3t8mkSb/AJ38vy/vba66dYxkepeFfAuj3vhK+eO0dLqZ5ktZH+WV
+fK+RK+ihg4pWPDniZXOg8DeC4/Dlg73L/wClTf6+T+Hy63w2GUGc+LruaPNvi9okmkxyapZXcH2K
+5d0SOH727+5Xl4imkz0HUbPDZLz95/00o2Rm2ie3lT7/AN+uWpA2hUNWK8kf5Ek3x/wVhGnY7oVD
+pI5LT7JY7LSOG1T/AF86fNKzf7dedUUmn3Nzv7LTvDup6P8Aarmxh01596QPv/iX+Ja8SvVqwl7u
+qEcj4ytPCSWiQ6e8n9ow7N7/APLJv79engK1XeS/Izq6mBYeDr66Se6kg3wJB50cbvt85f8AYr0a
+uOjBq5lGhcoaZpF+J/JeB4/3mzy/9r+7WtetCWxdGhymtB4k1XT/APRUflP+WD1xrL4VXdnRKfKa
+13fX3iDTkSfTtkyP/r0/i2p935q5KdKOHldPQSI38K3WnyeeiQXvyJ56P/Du+atZZjGe7AZrOk6b
+/wAfUME6b/8Aloj7l3UYSu9pf1+BnJG7aeE7Gxt4P3k978iTSSInyfN9+Otcxp8keaJvSlY3IYHh
+V3tk+zJ/BGn/AMS1fNTq3epBlar/AMJ3Ajpaz/b7aZPnd0RWWu3DvCzfv6S/7eYHHQG7e+RJ4/nf
+/nvXsynGMNDORsWmnarpF9I9q6TWM0f7yB9m7yv9mudYlSjqtTCRX1/XIJtRT7Fs8uH5N/8AeX+6
+9GDwrUHzG8SfWE1JNG+1OkCQXOze6fe/vVFDk57G8ZnJWk88F5HOn+s/+Kr2ZxSeh51NHf8AhWDT
+Y454Z/k1V5NifPtaP5K8bMYu2h2wmWbvWr2G+jf5HTZsePZ/y1X+OlhMFTYVYGp4fu9K0jwj/buo
+R7/7TvZt+z/WL/wGurEZa5LT+vxOeFXldiZIdO1qS0fT9ST7VPvf7I8+1m/2f9+owVCalr+hNepc
+6KPxZpOqaP8A2TqH7nUdPTYjv83zRV9POpBR1OBUOYYdAnf7L/ZkjzPN/r0+95a1yYSipyNq1Q1f
+H2kTp4fgR03/AGbYiTp/7NXo4rD8sTGNQ4fToJ7KDzodnnw/JGj14EsQ4M7pampDrl3JpsenzIj7
+3SBN6fwr/tV1PFuUTnlTOsePS9M8OOEmTzpn2Z2fx13QqQjTsY8nMT6HfX2s6ddO/wDy7Jsg/wCu
+ldkGp0w5OU5/TtHjuUkdJ/n/AOWkb/xf8Crx1hzrlI0b7StKS133XyeSmyPY/m+ZurZYcwcyG6mG
+hwQ38MCOk3zok33v3f8AFSoQlSNI04yKNxaaxrO/UJpI3eb/AFH/AEz/ANmvPx1ZyN1TUTj9S0qe
+1n8j76J/y0/2qh1jQZHaPJB86bH/AOelK3MB0PhXRbrVnnhT/j6RN/mPXVQwHP8AD/X4mNTF8ppP
+4a1jSfL1C6h3pbP88e/+GivSdHcKdRVDXjtbnWY/n/cpbb3tYf4vlrWglWVjFMo6lY6BN59reTzW
+1z/y0/iVmap5IxfKbI8l8R+E59Bu4LqDekE3zxyf9NVp4aspR5TB0OXU9b8HavpU+jwa5c337+F9
+klqny/N/u1thsMsPLmMXX9poL4r+1eZBq1qnyTb9if7NceLptyOrCKzOUsdMtNRnk+1bIZPn8iT7
+q/8AAq4qVJqZ21Vc66x0PQGtEsoZtmz/AF88372NpG/u17PIpHnqTiXrPw9I8D2U1in2W5f95P8A
+881/2a9ChhlY46+JZ0yaHpcOlvp9snkxumzf/FXZ7BXJkzI1TSrHSfDn2KG62In+rknfd+8rjx1N
+WNaUTgbvUkj2XUEfzoibJ9ny+b/HXydaq6cvcPQMTUbWSRPtsz/apJvn+SrozlUlpuBv+H/D5mtJ
+3vUe2RPnSPZt3N/DXU6UoK0/6+4SdjqPC9jaw6ddTDyJtRdN8CbPmWvWwcY8uhxV3dmBpUd3qF3d
+yXXnvH/cfeqs39yuOhh6tWXM3+R2TiomzL4Wsp7HfeTwW2tp/qHSb5Y1/wCeVduIpxmuVs5JSb2I
+fFb+Ftd8JXdlqPz3Nsmw7/veav8AtJWWKxdK/n8zSMZo8Baw8WeEfM1fSJ3Sw8zyJ50/2v8AlnKt
+XTnKovIyrK51+hXc/jSOS1svI0lE2SX19N99fNf7kVePHLIwfv7/ANeZ2KsWtd+F1vBp0lzpm+ZN
++zfv83zJaxqTlTd3saxnc5a6TWdOu/sN7f8A3E2R7H3LQ6cL6HTTlyoXwf8AZYdZkfVpP3Lp/HWO
+Pc5QtHc56juzpfHT2V1pcF5ps6bEfYnk/eryMsc4T5Zo0lUuQLq+gaNYp/Z6Pco/z+Qibvmb79bV
+cNOrPV2OaVO5z/iW112y+0XSWL2GnXv3IHT/AMd3V6uCnDls3d/M1aOYn1Kd9J/s/wAtHgR98dd8
+aa57oylEzLSS4++8m+P/AJ51tUhEzgyWW/n/AHcEkkjwJ/q4/wC7TpwiYVmN+z+Z/sb/APV03KJt
+CJVlt5I59n/LStGlymNaJBc6Xfz+ZOke+Oqp4hLcKmHuP0uzgjnjS93wR/8ALeRE3NTqYlvYmEOU
+bPb2/wBrk8jzPI/5d5JPvVTaR0tCSR/886n2phJGn/wj+pR+HpNbktHfTkdIPtafPFub+9W3srE+
+2uZMdvdpcRzxx7P+ecn+7RzWDludpZ+KNde0n+2vJNB5fzxv93c3yq1eZLDXOinOzOWsYLi4kkME
+cn+r8z5P9ivQpxXLZiqK7PSfhD4e8Ka3qV8niSDz7aGDf5+/yljrowdKCRxYyV5HXXHw/wDAui+K
+rHWtLnxp1lP+/wBN3+bPJKv3PKrem4KRM6XNEyPjFqGn6t4m+06faOZ44PIn3/uHWf8A4BXm1sbF
+yO+lRkjzzULPwnY2km+C++3eYiRxzuiqq/x/dqqlTnj7hVSMjlLnUN/+x/00pwpWRzV6h0fhzx+N
+F0aeytrRHun/ANRdv/7NXn4vLVVleWxvha/KjWh1rWYY40u5PPtN6PPB/DNt/hapo0aSn7VdD067
+9oYt3s/tOSTy/JtJ3/d7/ux7q6sTiFVd0cKjyEL+XBJJ5n+r8z93J/eopTudBasLT7VdQWyffun/
+AHdcuIqWu+wmR3+i3drJcJdJsntfkkjetaNW5fJchs44/Lj8v/Wf9M6K4cli1eT/AOr8yTf/ANdK
+zgubUc9CzoGu6lpdhPY23lwSTyeZPP8A8tW/4FWuJd42CGpT1GP/AEOSd5EeN/kkj/i+asqclzjx
+kNDzi5t/IuJE/wCedfQwkfO1HZm74ON3JqXkQb/Ln/1nl/7HzVni2rHpYKpdHW2dx5E86fvJPk8+
+OTf/ABrXhzakd9OpZjbHxxf2XiX+2/L3/v8Az/I/1Ss3/Aa7lR967+I4ak7E2sfETWdUQwu8cFjv
+d0g+/t3f7dc0cvpe0c38T9Qp4uxs+Bdb1MyX/kWlrNG8H+l+e6RN5X/TLfWtGioNompXdTYsahr9
+/HYTwyPHp8j7Ps8GxFVoIvm371/irlrOnW1sb0KjhubukfHTw1YaHHask82o2qfuN/8Aqml/+Ir3
+MLBUYcsdjysTepPQ47WfF/jCV4NUeeOe0tZ/tUEcGzbC392uH61TlPkej+Z6EacqcRmseO77xRJv
+vYIPP8zfJ8m1m/4HWmMrWJw8bF+QbYI5rGN9Ojf/AFkce/5v+2leXDHWdjveHUjrfAfi1IbF9CvU
+32LpPPJP521m/wC+/wC9XbhsZBaSOXFYaXNc5TxXqUl7db0nf7JP+/8AsH3Vj/2a4q0aaneJ10ab
+lGxif6Q88cEHyO//AC0eoXK46m2x1GreE4D/AKE93+8hRHu50TzdrN/zz21wRxHs5hy8xxln/ot3
+H9q/fbP7lelUbqL3TkhK56T4d1Gw1GB0sLV7YQ/8t/JVt1fN4ylKm/efNfzOyMSu/iSVJ/Jhg/4l
++/f5OzbJ/t1ssE+W7fvFKaRleONe05tDSC2fek108yf7Pyf8867Mrw1Tns+iOKtWRz/h1NCupJ01
+Cd7aTZvgf+HdXoV+dbEQmmdLA+h3qJdfaktb5ERH3/KrV579qnbodtPlaOeuIB9rn2eW8f8Asfdr
+u9poKTiddo3gaP8A4R9Naf8A5bI/8H+r8qsm5SOaVVI9e0nUYNQ8CQPqFqn2J4Nk7u6RxbVr6mjL
+mo8r3PAxUeWWhyGha5o+uzX0GoT/APE80l3fRr6y/dM1r/wL/wAfrjo4aFLV7m75+UguvDPjy906
+TXbqeNESPfBbo6K21f73l/x1wYzKXP3/AOvzPQoYvXlPO7loA9/dXVh9q+2o6eZ93yJ/+eq1hhcQ
+4+4zpxGH5VzGroHwln8SaFBrfhvWpLXWdjpdo7+V8y/8s1dK97L6aaPGqSaOE1XTPGHgnXdmqWka
+6j9+3kn/AHqbf9irrYS7CnirHd+CfFng2GP/AImdw7+d899HJ+6nadv4l/2a8DFYKXtuZ/CerTqX
+V0ehWlrfeIPMttJupk0RPkjkdN33k3/PtrGhl8q1Wy+H/gepq8XyK7PNpLuPTtdj8iRIP+ed26bt
+v+1UeysdDLkniiOeOdEtNl0/ySasn/oe2laxjI9L8F3EV6NO/sjVbp9Hstnn2jptVW2fd8xvvV9F
+CUrnl1HHlOt8WeKtGsLJ7Kffc3V5A6QWsKeazV31KnLE82mlOR8yaxd391H5Dyfu0/eeXXgYio0z
+25U0c1cafJ/yz/1daKv7pzyoNgLOREj/APIn+7WKqXHTpl/SLeead0gj87Z/crKrKx2wpm1B5iR/
+x/P8lcbizpOl8P6dPcpdTT2u/Yn7jfv2+b/uV52LqqImS3F1Be6O/wBp2W32KB0j/vSSr/dqUpRq
+JbmVV2OK0zWtS0+4xDO+z/nn/eWvWrYeFSOu5jHEWNm6v31d5Ln5LV9nnP8AP/rJP/Za53R9nuej
+EdeeGp73UrS2tbvfdOiO/wDtO392nTxKitjCtC5saH4ntNFv7uC9sftU6fJBJs/dRz1McPzLUZ0H
+hjxHpF7BO82z+0ETl3/dru37a8HHYOcXpflEzG1Pw3aXOoz2yaj507/PiFNq+ZXfRxSjT5mjSqi1
+pOu6rozwaFrjyW2nQ75oLtPm2s39/wD2K7cRiPrGHSiYRdi7dX3h/XLRIbK6+zXUL/JI7/e+T+5X
+D7GNHdfmaB4cn8Rzo4vERNj7Emfd81efi40V8JJzXjzTbqC7/tB0REf5ERP9z71etlNaDjyvUi5h
+2KXbyQP57w7I/Ogf71d9Zw1sjKR03iSxtNQ0eG6dPIukT7/+r3Mv3683AyUJuN9DZqxzOlatYvaS
+aZq87w2Kf6idE3N/u16uIw04+/BXuYSnYzEjsfLkdN6b/wDj02fdb/erWcZJ6k2sQQX8+/8A1lbT
+jFx1FznQjU/Mjkf7RJH/AL/3t1cypRXwm8KvMJq+pfbdJsLWDYn2V38yP/al/jreM5oxrQKhikgT
+zPM8z/ppHXQm2yqkDq/Ck+m3TyQahvSRE8yC7T5v+/iVz46mmtQp6HoXhnxLdaL5n3JtOST/AFn+
+z/0zrbBydNnNWpnT6p4pg1mwurW2TfZOmySTf825v4a9TE4tOJjGmcpP4PvrPy03wJ8m9N/zeZ/w
+L+9Xn1aCkwjXua0en6dp+hp/He3O/wA6T73lsv8AAtRVpqCN41Dn987z/wClO+xP9Z/+zXJ7WMtD
+bk5TV8+6h+1fYp/3E3yPs+Wk8f7N2Dk5jNtf9Zsmn8lPv/7NEcaaSpF+d7p7tLqfZ5D7EkSH/wCI
+rZY0xlSNfVNb0e8ukgudO+dNiRu77fl/269P61GoZRptGLIslnJJDaz7PJ3u8iP8tebiKKNlTcjN
+htJ72SPYn3/k8yvKxC5Tc1bfR00yeOaaRJvJ+d4H/wDHaMPVEdFbTf2Za/2haxpNeu779ifu9rV7
+UMZ7P4TzalLmJrfTrrWBHcvdfZt77549/wD7JXZGn9Y+IKc/Zi4utMEk1ts+T5EeZ/4a4adF0Vc3
+SuZEf2G9njvU++ju8+/+81efOTlLmNolPWfDFvqdpdi9SdET545E+6rV10cG4O4Val9DzrR4o9H8
+SWqahv8AsqT/AD/7tevRpuvoeXVp+y1PdbmyurxLVN/2nTpvuSJ/zzrmnhZNmkK1mcF4m0iWz1Gd
+ER/srvsgd/4q454SSkdsK7Z0/hfw3HGn+nps3/6j/ppur0cPhmY18Sjq4JJrCD98juifJv8A9ZXo
+cricaakXvM3pvq53MVI4zxZqunPN5KPvT5/M+TdXi5jNpHqYaN0cNqvn6hBB+72QQ/JHs/vV4dCD
+5vI6C1Atjp0MDwb5r7f/AKUj/Mq7fu10TxcKcvd3A63TruTU/IuXkR33/cT/AFdZxxMqlRKf9fcc
+1d2Nj/iVafp076e8Lunz/O/3a+nUYwj7pyJ3MjwXY3yPPf6mY08757JH+8sf96sMHTtGzZvVTRyf
+jDR7rSXREnS5gvXfz/n+b5q8TMqEYO7Z14SS6lzwt4Tsbpvs2pO6b03wR7/vUYGFPELzKr17Car4
+H1i90q70VNn9l3T/ALydP+Wn+3/wGt3hK1N+XyMYVoPc8G0Wb/hH/Et3pF9IiI77PtD/AHf9l6WN
+w/tlzX1RFKNz2HStJvk0m6jS+3xv88bp81fL4nEJe7I9OlSPLde+1vfSedJv2f8ALSvaw9NctzGv
+LlMzU5J/7Jed5P3j/uE/vV0UHedjJO6Om+H2gySadHqD797v+7T/AGa8vNMVyz5UY06lz0u006GG
+OP8AcRo+/wCd9n3q+eli5OW561KFzSvbu2exf7TGjxp/A9ctCc1JJbGUonhk/wDwjHn30b2kjz+f
++42P92L+LbX3lKFRxWplKJFotvpun3cn9p2n2qxk+T5P/QlonUb2KhQLGp+GrCGeB4Xffv3yQP8A
+wwfw0qdZ2MK1A6m60PR9Q07zv9Q6J8j15NLEz9ryigjgLnwlf/2lJp9r/wATC7ST955H73d/3zX2
+FLDuSRlWR0GoeEvEnhiwgm1eCOCxvf8Aloj7trf3H/u1GPwDgtP6/E58PiOc5/UtMguv39rPvk/5
+aVy4WSjud7hcmv8Aw89lBA7x/vHTfJ/drKNe4NGFdx7PL/d/frthC5g0V4LrVo7SfTrW7dLG6/4+
+7Dftikr0ue5w8ljsvC97pPi6bStB1uO10WTTv3D32zyvNi/6af8ATSj2Vxe2sdX41+Ec+kazBdWU
+/wBl8JzOif2i7+b5G7+KSlHC3G6mhyet6bYaFqN1DpepSXKWvyST2r/upopa4KsHGVjuw/vRuZlj
+rF3p1xPskkS1uvku7T7vmRf3Wq8LIxxFHU9Q0bV7Ca0gfwd4ffU9R+5JHP50i20rJ/z0f5K7FRMl
+LQ4a/wDDvj5NSvrZ4HS6s/3l0m9PKVPvV5Nd06UuWX6npKbsefaje3N18jybPLk8zzH/AL9ehh7Q
+V0cOIrSRV+xx/wDXST/npTjUHKlcguI5B+7k/wBXXRGojna5T1rStF03V47i6vXSygT7/kfw189R
+qtSsfQVY8mxwmpySeZ5EPzx+Z5ccn96vVpJRlc4nLm3FQ3cEnkSR+Z5f/PT761nVijSNa5b+dJPP
+8yNHk/ufw1jCKNkrlm+1OfVLrzpo/wB/sRH/AOA1hRwro6LY1pySNbRtG017S7utUu/J8hP3EEHz
+SzSt/Btrab59yas2xknhC7tYLS91qT7LBe79nyf6v/ZrCVS+xnKKuO0fQbGe6j/td5LK1ukf7Bd/
+w/LXTgrX1MsVF2MG6j2Xklo8f7yB/L8xP9ms6seVmsNjlPFtnHHcW8g/1jp+8jevTy+fMrHl42Fx
+PBviF9A1+31FI9+zekkf+y3y10YmiqlM58PpM9S1bSLe6k/ttLFJpHj8+SxSf5Yovu+W3+3/AB14
+c5xjHlTse2+555qE/n3Emy38j/pnH/DXdCR59SAW8mz/AJZ1FRXHSL1n5k13H58myP8A56JWcoe7
+c1oe6drp/hW+8V+Hru6S0S1k0+P/AES737YrmX+589a4LDJe8Y4rEHl81lJaXEkd38kiSfvI67Z1
+GeZTpWNDT7O0mjkeCST9xseSP+Lyv465J1pJnfTVjtbXQdM1/SZPss87vbf8eiJsrw6mKlQqWktz
+1VRU1oULJL+w1L7FexzzwJJ+8j+fzdtdD5avvdQwzdJm1rWm2MMCfZX37/njR/vba8+hXk277HWz
+Jvr+R4I02bPJ/wDQf7tddKKjK66mLIJDcNaST+XI8EH+skRN22uj2aU+UmVZxiQSeMr6DTf7PtZ3
+MLv+8/vVX9mxc+ZnPLEy5SrIYI/3iSb02Vd6ktGTKpY6Cz8Yax9lg0+GfZCibNkKVwV8vp35nub0
+qx2f9h2iQWV75/nI7o80z/L8v+zXhPFScpRtY1qK5x/jrT9Pj1WPVLN0dJvne1/uste1ldefJyPo
+cUqdzi7iT/SJNnyf9M69pHM4nS+GILTUfMtXnjSd9nkfJ8zS7/71cdaLud1BnbeLPCes+FdCR0RL
+qd43nk/2V/i/75rGWCkp+9sYPGqx654BsdKk8N2l7pc7+RewJv8A4l/2l2V9Ng6EKcfdPIxLcnoW
+vFWh6pN4TutM0jyHk2bI4HT+GuidNKJNNRUjyGTwpr/hjUf7QvYPM+zP/c3RNXx2ZxX8M+kpzjyl
+3RfFr2serfu/9d8/2TfuVVd65Jczg0a06KiVrvxL4btZILbUfkgm2O+xPmrjwWDm58z6FTqxRgXF
+1oWkeJ/7R8Hay6aUjp9o8v8A1sKt977336+p55cx41SnGx6b4h8eeFNF1vz9Qf8Atad7LfY70h+Z
+Zf7zU6GJcalwqQ9w8P8AEuo6L4o1q7vZNNTTEjj2QJpybfNl/wCmm6uypjGzD2Vip4Q8b+JfBMl3
+HbeXPaXsHkTxvv2/8Bqqc0xczR6n4ci+HXjzRtj3f2LX4Uf/AEF38p2+T+Dd9+vMweW+zX9f5ndi
+MZc85vTb2smy1kkeNP8AXyP8q7v9mtJ0eViw+KNDSfHepQWsenf6+xjf/Vp8v/kSsnTUdTRy5jW8
+QeMdS16eCN/+JfaQwJD+4+80S/8APRq09vzKyJ+rXOaNnsf95JvrKduU39mXJtN2WMc/mbN//LOu
+ClXtIPZmJZ3F3a3+99nl/wDfVehyqxwwqG34ev8AUUuo4NP/AOWzp58afL5lefXpp7/I7YVDoJL4
+eHtWnsoYPkR98aXSfN81cVXDe03Oq50Ph/xbaXWnX11qUmyRJP3cCfwx/wAX/AK87FZdy25dwuY+
+oz6Trt2kNtJBbbH2QeYn7plb+OurD0qlFXeovZovwfD2V44EhtfOh+fz5pv3e5v/AImueeZ2fvaM
+ORHHeK9Nk0jWJ7aDY8Cf3Pm/4BXs4KqqkNSXGxnz69qXnpMkiJPCmyOT/drppYWKZi6ti7aeIZ/s
+r2zx74Jn3v8A71c08Ld83Y0TJ/3drIl0iJMj7H2PWckn7psmdbDfaHezJqcMn2a68nyXtfuqrf7F
+eW6FSMeTdXExl09veWqTWc/2W9n+S6urnesH/AlqsPzRlyv4fVGLE06yn0LYLKxTVtVvfuSI/mL/
+AMA2V0SX1h8rVv68hOoc14r1XxI98ianH9lnRPkgT5f++q7KGBp0tEjF1DCnu7u68v7VO82z/V73
+rthTszHlIf8ATE8t/wB4kf8Ayzq5MOUJ9Su5/L8+d59nyR7337aSpiC0s7Sfz43k2SJHvjkf/wBA
+/wCB1uqQBfaZd6dd/ZbqB4btP9ZA/wB7Y1PVE+zRBHFsk/eSbKFdh7ND0u4/M8v78dOszKIo8zzP
++mdYwN4lqOSTZ5fmfu6qUbM0ubPhfUrSynj8/wCeT7nmVOIpXQrnsXg5Z7y0e2tvIvbW5/4+7Wb+
+9/DspZbiJR0JrSLj+E73Q7X7ba70eb5J7V/7y/drtxdNvUxhIoadpes6tfIhu/8ATX3+fHv+6tcc
+Kcpe6y5TsJJex6Ek6J++uoX2Xdon+qki/v7q0hTUNGYS94i1XUtNmf7bZT70m+eRP4o2/uNXm4um
+rnfTqDFv9/zp/wADrknB2CpUCPy/Pg87/j1d/nq4ou5atH0pJ/kn3yJP8k/8O2tooLnb3TadrOlb
+IdiXqJ88mzbX0tOqqkTypU7HM+ItBSDyIdPn+0u6P5/3N3+1XHioqKNqNSxW0e0e5hg2fuYEf7/+
+1vryI0f3h18xNqNr/Y195kz/AGzf9+tlR98FIq2N1d/a96PstX/1e/7tZJc0tTD2djotOSS5gnd3
+3z2yOj/3ZK9CVL3dB+0sQzwabewQWvmTwzu/+rf+FmrOTQFt9KntrWBEn2XUP30+6tYyghGjB4j0
+q5g+xXn7md/kkjevcw2JhKFjkqNnP+MPCWjz+HJHhdEvrbfNBJ/FIv8Acq+eFrBSbOL8G+JtRtZo
+NLS6eGOR/wBw8j/Ktc1Vt/AVSjZHqljaRva2up65P50kO/Zv+6vz1vh6jj8ZLjqaKCx1BI7yzff9
+m3pB/d3V28ysc8oe8c7pU+sXj/bNTvvsaI+xI/8Anpt+9trOik2dctInaNGk0Dp/A9dDWhzUzl7r
+R9OtX8mGPen333/3q+cx9N3O2EzHu9E1KGeSayg/czfwfw151PAy5tjede5UjhjgsZ3uUg2PvRJI
+XTduiT+OtcVgmkFOvYoaPqVjpkcF68773f8AeIn+dlY0KfsdjWpPnCfUbXUNRn86dE0qHe9rGm/9
+42/+KnVxshQw5c1i68R6xdWttZWvzon/AB9pv2N/vV2e0lio3/r9DGFP2RyesQayupPBdfO8P+sk
+/u15boOMrM7oVOc73wnZaPd6dBPPdO88KbEj/urXs4NQqR5p/wBfcedWk5SM3xN8Qb21nkh099lt
+D8h3/NurgxGaWlyw6f12OyGBUo3Z8/eO9Pgn8SxvBP5/22P95J935q6srquNIyxFLU0fCNhqtrqN
+ja22pTw73/gf5dv+7XJj6zcXoU6Oh3vifSrGT7DZv+58997z/wC7Xz+BdTlckjprSUmYfiT4Z28k
+f+jT7EgTzo3/AIa6sLnE4ytJGVbDKSNnw/HOn2XbavBB9l/0GBPm8xl+/vrPFVVyNdy6FGxt3Wox
+vfWNm8nzp++n2Ju2/wBzfXlYaly3m9jpk7FHX/FElzI9tawI/wDA8b/88v7/AMv3a9Wnls6v7x7r
+0M5LkON+IHhPR2jtEto/st8ib/tEb/v9rf369bLcXVhLla0+Rg6fOcWlpq9rJ9lS/jkjSPfH58de
+pKVF9PzIvNFmwTxw8E8yQefYv8k8lrsZqwbwy/pk+1qI3E1fw3a2r6d/aN1577E8u6TyvLb+OueO
+ErN8yj+X+YpVFeyPTPhhr2l+H1nspp4PImff/aXybt3/AE0avocHjHbllH8TnxdCVrnQ/GLVbWPw
+2UTY91c/PG6J5qtFWmLndGdGFjwlLOwkng/tGN7VHffP5H3tv+xXmQVmbyhc1fEFlfWvh6C9gtHT
+R7md0sbud/37L/1zrnngi6dc5GSzt5I/3ke+t6MOUdRcxtnRfD2qaTBBp9o6az9zy0d23f7dcLqy
+jKwpU0Z+u+ANV0i4sP7XuJIftsDvH5abp1eL+Flr13XcIpnPKgmO8NS61beZBqlj/a+mzps+yXU8
+yqv+3FVrHwiv+H/yI+pSlIp6PYaNpOuQJ4o89NGnkff5P+tX/a+aqw1SNVl4inKnE6nUfDnheeae
+6fxRav4fso9lpdp+9uZPk3Rx+TSjT5TOE7xLnhf9oAeHNL/sjTtGtZ4LVNkE6O8W5v8AnpJXZGvZ
+HLCjeRy+q/E3UdQu3vdQuHunuXSZ4IP3UEf95PL/AI68fFYJ1JNno061mU/EeoaTrc8CaRI887p/
+qHT97u/uLtrHLcNOlJovGV7xMvXtN13SLC3tdU0l7J0d447h02s3/TNq9t6mBheZJdXH7uPy5JP+
+WdYPQDvdTj/1k9rA8Fp9yPf95v8Avn5Kxlg05XPSjVtuYqW9xcQbP+Wf/j1cspNysOVL2mwQWUkc
+kiSf8s6irFlrDWNG0u9Mgjk8+08/e/8ArH/hrGCZso2M670y48yOdJNkb/6ut6eJ7keyaOr0Hwld
+2X/Ewut/yIk8CV5uNxHRHdQpJlrxBrMmqJBp0McnkQfOn8W5q3oz5onlwi+Y5vV5Lj7BHH/zz/1c
+f+9WmHvzHZWS5Sjp9xd+XJ58fkyJ/q43+/W2L95nLQKXjOa71LTPtU8/numz+D/gNb4GXK7GOKgc
+GeDXt04t+6eRU0kem2/iSTV9Ag3x7J7WPyJHT5fOdfu76+bng/ZV3fZ/ge7S1pplXULe0e03p8k6
+U6MmRXgY0nmR/vHrtepwrQ27SPTP7F+1XXnpJ56J8n8UX8dY1J2lyGzOlu/F2u6ro3l6DIml2Nq/
+/HpB8rfc/vbameN9m1FmEsPzHG/2PJJdwQ3sn2WSZN/2j727f92tfrKZp7NFWwku9Kv4544/9R/r
+P7rJT5lIVjpNP1ZNLivrqyj/AHd7/qH/AOef9+vPxFB1muboa4RygtTX8N+INFttLf8AtGe6S+8/
+5J4fvMv+3XHicLOU/ctsbRxKbJ08SWiar9qT59m9IE3/APPWs1g5KFjvZsai+leI7mCzsvke2T9x
+Iif67/npuauGnKph05S2/Lsc73I28K7NJcaZaT3MlzN9lgnR/lVv+ejr/crqwtadSqr9EY1qy5TE
+1/wPFoo/s+6j2Xf+skv3T73z/eSvVli5KpY6cLSUonOa/olpp0cD2t8lzO/34IH3bf8AerTC1py3
+VkcdWmV9LsNSexnngj/1jonmf+PfLWmIrQvqc8Ua+jeMNV0iOOynj861R9/kTfxL/vVxV8uhVlzr
+c39vci1LU5NYne5CJC7fO8afdq8PR9iu9hqZR1B7B4I0tbT95/y0u5H3M1d9N3IqRsVbO48i4jeD
+93IklFSAqcj2+08WXfjfwTPpL2n2nXE2Imx/K3L/AH60/tGPLaW/9eRyvBuJyVn4jutFgktbW+n0
+/wDs99/9k732+e3yyV56rzjK8djqo4dFmf4x+LboxwzzeRGn+sngT5v+BV6H1mUosz+rRUixd+Mb
+r+zZ7a6k/tDzv9Q/95q+ZkpVKvMz0/ZR5Tzm5vNT/eQeY6Rv/rI69iKSOOvORmvb3Fx9xJHet4yj
+E4eWUip9juUk/wCedddOpGUjn9nI6ODXb+68Kvp88CTQI/7i7nT5of8AYjb/AGq4JwSq6Hpun+7G
+SaJqdrBHdbH8h498cifN8tDxak7Ezp2LfhS/0218Q2M2rwefYo6efBs3blrqoyucU5JHpnxP+CXh
+C3sv7d0vUv7Ikm+eCxf5vMZvm2R7fuV6lepymEIczPF7fQ9bg1KO1ng8+P8A396V52Ilpc76dCx1
+3hTQpJfECafdQO8j7/3f935PvV4+PxSjSbR3QpWO+1/wBo9nobzJvSe2Te8n96vl8JmtSVW3c66d
+keSz6vHHceQ8kaf89K+vpYdyicntDW03xbdQ6VPZJsuYH/1G9N3l1y1MHeVxc5iR22JPnro9ocVO
+maloNn/LP/7GuerK52wpm7aWtxqkE7yT777Z+7375Z2Vf+eb1zVKvs5GvMY6alPpd3Ak/wC5n/5a
+JOn3v9+uzkVVBzGtfaLJ8n2WSSaf5Nmx/wB3833FiripYzS0h8jNKSTxB4ftP9J1J3+0/wCsTzn/
+AHf/AAD+KsF7Ku9F+AezZxN3q+pPPvD75Pn++n96vYoUIR2MnVuUo43kreM4xZjKNzQ/eP8Af/8A
+HK5rNaGiZowX0n7uH5EgrB4V3ubRZp39pYQTo7pAkG/e9ik26ueHPJOSNmb1pJpWswJp8+qPYfwf
+weW1cPs5wk5WTMJEelWHgSykdLzUZvMhfZvj3qrf980VKuKvdR/ITplbWPDyajrN1bW07vIj/wDH
+9dPui8rZu+//AH69XAVrrmn/AF9xi6YkHw7vv7G/teDY8kb7LSN9m2Tb9+rdYVjkdS/tKTy/tW/y
+/wDln/d/4DWlOXMPlMt0rpjMwG26SeZ/7UreMwLdw9/fXfnz3Ejzvs8yd3or4hIy9mx/izQZNL1K
+S1S7+2wf8s7tPutRQrphyMz9Mjt4JJPtUb/9M9n96oqiRee3n/dyT+Z8/wDq5JKxiaxLmm6Hq2ow
+Tz2UDzQWqb53T+Gs6tXUnmIY/MT/AFldMZXiFzT07U7q1kj8ieRNn/LTf81VTUd0KtI9G0X4s6/D
+HAl7s1CBH/5bJ81dkaynoYQZ6dpGs+HdZeC8tZ/7N1H5Pk+T5l/u1vh5xnqjKtOxR8S+A4DdyXsM
+jpDN/wCOyVwZnhH8SOjC+8cbHoTpOmn3X+ix/f8AMr52vN8x3U6ZQNhqVrdPa+W7unz/ACf3a1VT
+QKlMvxySf6iaPY//ADzeqSIuGmon25H2ed/0zraMQuemadol9DBsR/7PSb53T5P++a9elhnTicE6
+lzO1RksPLtkT/Svn3v8AxNXJioto2o07lHQNjyeT5HyffRP9qs0/fNeYfNdQTPNHewJDJN8iJs+W
+P561T98EzUkstO+y/wCh/cf5H/vVz4yOugvaXK9jdWun2LpD88cz7EkT/wAep0sRyLUOS5G6QvPJ
+/HOn9/8Au150WwIZ7Ge98t4ZPk3/AL+tlBsBb7She32+2n3yfJ+7rehT1sjSo0VNXtdRRPJeTf8A
+wSR/7VUpcs7MdJxOC8S6dHBq0ePuTbHkTZt2t/FXpUsQn8JzVlys6qSDUfI/s+2vnf7F86Ws/wDq
+v++6yxGLUfiHGN0WLPxgllDdW16jw702R7Pu7v8AeqoSlYmtDUueHbuS9mjSaTzoIX3wWKJ/7PXT
+hU7mdbY7rStSurxHea1+zIn3Pn3V2UKvMYF+eBHSrrYZSJcyjrGqf2ba5RN7v8kCf9NK58ZiHT3R
+0Qjcx10fRpvMmnRIZ3T9/J/F5v8Afrl9vSqLX9R1FYy9T0uxhg/4mECTRom+1eFPl2/7cdYYmUKZ
+dCocvofhbUdQsY57ZE+R9mz/AGf71cMMP7fY7niOU2tEs303/TJtRmtrm2fZdQzJ+68uu+jWjQjY
+xq1Oc5nVtYj1DWL5/wDUpe/u9ifd+WvIxNXmlc7MJTsiLRY7u2v9k0/k2n/LeN9/3WrnVCo1voY4
+iS5tDO1jUUE7w2Njvhf5I7u6+X/gSx1hTw3s3pubqbseca3azzyX/wBq/wCP5PLe3kT5V2/7Ne1R
+qqMTPET1N82r2U8Dv88iRo/+y3yV59Sqmy+f3Td8KfELVtPvp7JILWaC5+SBLn/ln/sI9deExMKN
+Npr8zmnRakZ1xqt/p/zvPvgm2OkG/wCX7/3f92vKkoVJ3SOuUXyk8HjnVQ8/kWifvn/cfO/7vdRD
+BRhG7/r8TocrI7jwf4L1G5u9SefWUSe6RPtcCJ+9WvcwOXQrxt/X5nk4nE2ZieJvhnqXhm4k1oXS
+XMMz7JAn7pv++P461xmGqUo3WxccR7Qo3WlWOqX1pJNOiWlymzzH+9HL/crw4c9SWh0Rqchg+K/B
+tpbX32WC637Nn7z/AHv9qu6GJU9LGibNLQPLg+0QQyJv8zZJBOn8X+/Xn4ulJvQftLG5rOm+FbKx
+TV5Nj3Ucex9OnTcys39yvXw1R8toz/AznSle7Ri+EPh/4a8W6jJbQf6FAn33jf8Ae/8AfFejl1Kr
+zXb/AARyYyStZnX+HPhn4/0TUZ7VLu1vdGT/AFH9op567f7qf3a9F0rnBOtYy5fhf480m+u7rT4L
+XUILpH8+D7qqv/PNN9ZPD2NqVa5wninxX4jGlQaNe2bpZWT/ALiD7yq1TGXMRUXKchZzb/8AWSR7
+5P8AV26feWsKsLDp1zUtH1OG4/0KSRJ3+T5K4KlpPmOiNNs04NM1OT7PqGoz3fmQP/x9u/n7f+AV
+jUxSkrG8aDNq11O6eB9Uex8/SoZPInn+fdG3+1XNWyidv6/zOj63GLOW8WSWmpTxvaxpIn/POry6
+nKmzTEVI1InMT6dZvb+Z5e+SP/lpH/7NXu89zy4UrRKGny2Dy/6d/H+7+TZSscsJ2kFzZp5smyT9
+3VRlKKuRUVpHZ/DDwnaaprsEn261hn37ILe6jfb5v8P+rZHp06j9oaVVdHTfET4WfEFnjS811NWf
+zN8cBmeRo1/v+XW70NEzyqfQbvTrv7Lfefaxp/sbWrF6jOvnv9aeCPTk8t7W1d54Pn27d3364oYl
+ypWZ3OHvGpo2m6tBP9qRE+RN/lvXi4ypGUeWR6D+Ezxb31rfyT+Z5P23fHPB/vVvCpGUTKjTKEgg
+tbh/Ijeff8kcj1pGEqisjeSsQT3n2Uxp9/zP+Wb1tTpKUWZqdpHsPh2SB4BBPdf6JDs/0V0Svmpz
+cavK9rnRWqXiXbX/AIRzw5/asyQPc3Vl8/2t0+XdL92OOvvsHCFGGh87WvUlqeYifTbrVZLrUJER
+JvnkjgT5VavBzKvObtE9rDQUI6kl5fQQTvdWUfn2iPsTz/3sUnyf3WrmwznE1rQTMSPTIL2T7K/7
+iB0fzNibtq12zc46nEop6HllxH5dxJH/AKzZJ5dfRI8BbnUaNeW/9j+XHHskj/1n+/XDiIXZ6uGn
+obFvZ3d6+yCCR3+/5dcFWcIvQ3VP3TGuHk/g+SOuxUklc4YpKRbg1OP/AIRy40ry5HkedJ45P7u2
+pnC07nTe8Cz4fv47WxvoJJHfen7hP4fNrmxNHmkmZ4d2M+CPfHXRUFONinLcXcEklrP8nz/vI3T5
+q0gkcE52NeMTz2CQJ+8gTe/3/m3VhtUv/Wx6qirm7b6ZbyeFJ7qGffOjo7on8K/3q8+rUft9TVRR
+kQfPH8kf/bSt3G7HJnQ+Gbi/8+OHy3TzpNnn/wCq+9/t1xY3D6XNaTO/ufidceFfM0yz0qAmFNiS
+edu/e/xfdoypypJt6tnJWpXPPfGfxE1nxJP5fyQWqfcgR9z/APfdelGPvc7M1Tsch+8jkjk+55db
+z1VgirHQx+NY/Mksp7X7LH5DpJJ/rVXcn30X+9Xnxy6z5r3NY1rGbE893P5M8m+f/lnH96ut+zhG
+6NYRuOuba7tIN/lvBA//AC0rGlUjKW5hVjYhs5JEk/vx1rXjzsulUOj0PwRda95kllIkD/wb/wDl
+oy/w15+IzOOH0kbThzD9JutS0W/862k8mdPkkT/2WoqwU46jpon8Q3c95OmoPAiTumyeT+9UYJ+y
+0T0CojCljdPkeOuynJGEoXJ9Ovrqyk3233/++qzqwUtzel7o+0vrBJ557qD7Tv8A9Rv/AL1N0pcq
+sChE2tFtI9Ut77YkCPBA8+9/3S/uvm2VzunPmRsoROeubuCS3/cWn2W7eT95J95Wib+HZ/7NXoWS
+ZzVg0wXc3nwwQedBs3yf3V2fx/8AAKbrKLOeEDpr+61y20mDRXg+SZP9fs+ZlryIYeMp+1OucuYw
+jN5NjHa3Ucf2Te7+Z8nm7/u/fr241nJXRwzw3MTT3urXUEHn387papstN7vtjX+6tc3tub3S1QNf
+z99pYTWtolrJaxul3Pvf95/dasq81bkOiNOxNJ4vFraOll/yEX+SO62f6uvNhl/NL3/h7Fe0M+78
+deI5rKSzvLv7TC/yfOldscspKV4/qHOZMHmai8aQQJ57/JWrtAmxPPpNxap88f8AHs/2d1ZKspML
+DI7CfzE+T5Hp+3VmXY1pNJu7WeOB0R3f7iI+771c/tUFjrNF0fToJIX/ALRR7rf89sn3vmryMXiq
+k07x07lMn8VeEdD1fY87uk8Kfu5/k/1a/foy7MalFWS/r7ho4mB/sWrQPp7vNaps8jf8u7bXsyTq
+Qae4G/qvjmyubR0/s5C//Lff/wCPVwYTLZRndu6BIz08EzXtrJdW0bwO+x7W1f5/3cn+1XTUzSMa
+lkRYmg8G6bbWM5vdVRNRSTZBBvqpY6VTWwWKGneENS1DVU0y22fan+d03/diX+KunEY1wj7xbZse
+JvAn9hwfvrvzt/yJGiP81eZhcx9s7ILmLYXVjZXf2q9tPtP8EcD/AHdtehVjP4blyiO1q38mfz4Y
+PJtZv9Rs+Zazo2ejZi4GX5/7z5/n/wCmdbqCRhE2rT+0rVHtYZPttpep+/ggfd/+zWFSUVvoao9W
+8I6jqOneGLe1uYEurJPngf8AijrkxOc8sfZb/wBehksGkc/feENCutV+yzu97PHvd49+2K3Vvmrn
+o4qrCNor+vmbxppHles6YllqV3ap88cLum+voqFaXLqcPIQ29v5nmf7CeZJ/u1UUpPUOQ17fw8+o
+f8giOR40gR557pPK/et/Dtq8RyR6m1JWPQdC0rw/n+y71Nmov+5ju3/exRy/9M68jDSlOpubzkeb
+67BH/a06fZPI2SbPL/3f96vTZzB+7njjR/MfyP3cfz0Adl4U8T2NrBPp97J/Z8F1B5Ed3ap/y1/g
+3/3q56eFb1HJHFXcGy4kj8zzJP8AnpXZCV/dMmQxyGCSOST54/8AlpUJtoOU6uw0qC5sZLq1u/8A
+S4P9ZaP97b/s1kq7pisXtNu5IZI4Z5/I/wB/+Guh1ebUOU9HtfEF9e6PJZPdRubbZ/wJf71eZiMZ
+KXuoXKZviC3ngut91Onz7Hjg3/N81KeH5dS7kcGl2OpwSXU07wT/APPT+6q1yyxUohchtJLp433/
+AOlSfwSP/s16VGpYtyL1jqWlfat97Y+Qn8aWvy/NXoUZ3MWzrNP1e9upPJf7m/8AcJ/dWsqtTmkZ
+TgRap9uuZ/OuU8mDf+4nqa7903oxBNISCCB0SdJH+fz9/wB3/arLnlTepm5Fu+8ieP8Af/x/I7/+
+zV6Xu1I6mLZV2fuPJT543+R9n8S/7NcioOK0OuUy7Do1rD8jv5MH30d/m2tWNPD8z1OaRqfZdKey
+jeb783yJP/FXsfVYQ2MlUuZesahfWfyWXyPs+d/krjrVmtjZU7mFp7zyXf2rzP3/AN964Kjblc6J
+IZJrE9rO80Ox/tKfPG/zba6o4iyOeVM53xrqE+pwWszxojw/J5ifxf71bU8TdkSpWNbwpbSXMEd1
+s/1MD753euPFRu7nRRrWIJI4Jr53h2eQj/cesKb1E0X5/DLva/2npn+i/PsS1R69KnUMWi3o/jK+
+0KN7LV7Xzv8AnnOj/wDoVdWGmomboHQ6d48sbmTyXgeF3+586NXfHEIxdAh1fTdb1mf7SiPbQ23y
+WsLv8zf3pK4sRRlPWJ0U+VGJqN1q/kTzT/ch/c+eiV49TDTm7M74TihdU07XdQ061ufvlE+SB/8A
+Z/vUnGtUfvfoYU9B/hya7s7iCCSB7aB4N87p/wAs/wD7GpwOHcavvBU1MLxg93qevTQW375N/wAm
+z7tTiZ88jogtEc/qaeRN9i+RJ0f95/e83/ermxVXkibxNqe71X+zoL2yunm1RN6XyP8AM3lRfdav
+QjiHOnY45RvI4m7+1uPOnn/eP8/l1wRVlY65StEntzaQ+Xez/POkc8Dx/wDTCVPv10YepOwSmrDY
+o7v/AIRWxf8As2ed0RPPnf7vlL/BXI8NPn5iaM1czb+/0l7+wuoLGNH2T+ZafeXcv3W2/wDAq3t7
+ovaaj9P8P6lruo+RZJHHM/3I9/8ADU4ajdl4ipoat14a1LQNSjRJPOfZv+dPl+X+CuCOKdbRmiqX
+N7w4HvZ7XUNFuv7J1i1/4/7R/uyKtengK0aD0OOvTudP4w16TVtDgsp7V4bqd/nf/llti/irtx2Y
+82n9fkc9DDu55Tf3V/qN3HB5aJs/cWmz+6tcHtm0d7pWH6n/AGk8Ec89hstH+RJ9j/eWtqmHk5XG
+5xM9dJ1LzPttr5+xNnnyIny/N/erWdN2uc8rHV61ZWN1ptoll88f/LedPmb/ALaLXnYKUluawq3M
+rw7b3VtfSPZXyWV35fkfP975q9+GJaWhjWjc918L3KQ6ba2U07vOifvN6fKzf79e5SkeNUgdAD2r
+aUbhTq8pwHjfwJqPiDVP3MECWqJ+7f8AvN/tV5uKw7kzsp1OU4Cx8NzeGdRn+2WMf7z5Nkybl/4B
+XhZnh3ynXSqXMCPQ7XxP4gk+zbNL0q1+TzIE3f8AjtTSfso2mTGpYtXGk6jYXfk61A9ra/8ALC+2
+fLItcuKwnMuaBvH3io+uabexpNa+Rp99DHskjng3RXK/7S/8tK2oOtGSX+RtOilEtW/gm6S1kvdX
+0J3tZk3wXdi/mxf+O/PXfiMNW5b/AOR59JpSPLtQj1CeS4gtfktE3+XH/sf7f9+umDM612V49Ls0
+nkggk8/93vkuP7zf7FY1qpjCmmVZRJ/q/wB38n/LStqXuvUVSNy14f0yebU4/wDWJHv/AHk8f8P9
+2qpzi5hSjY7fVtNv7a4nj/0q1vn2JsgneVo5fvN9z7+9K4J1vZVLI6/iMLXdQ8Uahs07V9We9tLX
+/Uef83/j1bSxPMH1c6y/0HSn8P8AyJvvt/8Ar9/3WrxsO5yqWPYqQ1KejWGrPdxieffv/vv/AAxV
+deEZT5Squx0mnaNZXV3J9l2POiPNJJs3Kq7K4aMatT3f8iK1TkMfxzoV9azpdOiQWr/JabP4lr6G
+hgXQhzNmEK/MN8P2do8Hkvpsd15bo8l/v3NHXPdqm5nTWp2kaF1Pd219HPdb08n7k+zdBJ/s15dC
+KrPmOhU7xOgg0q7mju7Xz0tZNQTfBJPvb5WT+Fa9DKI1J/Eebi3GMtDy8aLfyee8ce+C1+SSeuvE
+V4Up2ZtSg5xK0ek3F8JPI/1kH7zzP9ys4YiKmilBuDOkupL9NDtIbq0g8xIPPjv03+bP9q/2v9mv
+TxleKhc8zDRbmzxLWLfy9TvE/wCmldtPU82ehDZXtxaSb0onC5tRmdvovjrVobeSCDTIXn/57/Pu
+jrx6mVrmvd/18z0frd4mTPcapdpHA/8Ax7wf6uP/AHq7YVIqNjzleUixo13BC9xaXsbokkf7uTZ/
+FWFZu10dWHlcqyR75fkk/d1f2LsnmtMTbJ/z0+5/q6mZn7bmJ7+yv7t/t08nn+fJ5fmb/m3UU2P2
+PME+nmBI3STfvrONdNlxiy3YR3/lyeRPs8j/AJZ/ddlrOpGLdzZQZ0fhTwnb+IZ3R7+S1jhg8+SS
+P+Lb/BTSsy5yNTRPDfh+PSYJrzUpJ98+ySB3ddv+1XHjqzW25tSkath4Xitp55hpX+hTo7wTyfvW
+27/l+avOxOYJaI9CnTuiprvgLUERLyC1TyXR3eP/AJ5tWeFzVTvC+pzzhqcLd2E8Nx5F1H5L/wAe
++vbjUuro5Iq50cHw80+6k026T57X/mJbH83c399K4J5vytxej6Gqw1zVvtVj+3T6fpMECQb9kEjw
++VL8tYxpcy97U6oQ5TF1vUdZ1GOOC5n3wJ8iQfwr/wB811YVRgzKrC5zyW/l/I9dbqX2OWdPlN3w
+0daTUYP7PfZMnz/8B/jrlxcaXL75tSqG7qukvZar5l1P9p3ok0jon96vNpYn2kNFbobUinfzST7/
+ACYN8H/LR62orlWrHURkyR+e7vNJ/wB911KVtgjC5XS4vtKu4Lq1dN8P7yPem6uiFnuYVtB8+r29
+1f8A2qe0TY777uBPlib/AHf7lEaD5dGYxqxNG6Pg97Sf7LPPDPOn7uBE3Kv+/WFOOI59Ff7jZVYl
+L7fYPYWFk9pseD/X3af62RW/2a1lF3bM56mvpF3YW0eow6f8kE1k6Ro/y1yzhJyTfc3o0zup/HEe
+oaLafatNR/3Hkpdun+p3J/C1TGooR5ClSsZk/gb+1I4LpIHjupv+WGz/AF3/AE0Ws4Ylx90rREMP
+gfXIHn0m6dEtINk3z/6z95/zzqcTW9muczbOZ12zj0W9+y/PNG/zpGj1tgqntlzGDqEOjaL/AG7f
+QWVr+4urr/VyP/ql/wBp2rr5XGXvGrpj9Z8J32lyP50iSfZXRJ9n95qX1iHNZB7M0LHy4Y4Jv7Nw
+/wDB/vVw4hSlpexdia+1Xf8A6L9lSFEffs/2qxpYd97isWrXwjqs2m/2mmx4P7if3azliop2LsUI
+NNkm1HZbT+TH/wA9P4q2dWKjqOx3fh3w7o9lYz3n/L0n/Pb/ANDrxcZi5zdlsQZHi2x0+2jtbqzk
+TZNv2Om/zG/v104CdR35gMTRrSxd4LK6kSGB59n/AE1Xd/F838FetLmuMrb7TTtZSDejwefsjkT7
+rU5Up2utwOwvr3R73S57b7a6On+sRNnmf/ZLXiU6EqdRNodjj4PD18h/tO532yJ/qJ3+XzG/369r
+65FNJK4WOh0Dw5NBa/2tDDPZXSfv4J/9a0m7+9XFXxa9pySZJ2XhnVNOv9OgXVbtJr62d/M+1f6z
+dvZPuV5mKwzhU5qel/66iOEk8S6FpHiDVYJ9O32Vy7p5aP8ANH/1zr2oYeU0m2Zuqc4moXd7a/2T
+ZRvNZQv56b/vL/wOuxUYxfM9zJ1Sq9ps+d/7+zy/+Wu6nGdwiXtJn1a2897Lz/uf6V5PzbYv9que
+rCMtzVGhfeNfGuoImk6c+z5NnmOn2aWT/d3UUctw8V7WX+f5MwjUbJdD0ZbXUUh8TX11DP8A8tLX
+e8X/AI/WeJxMpR/dL+vmbKm2aU/hTw3PqN2iR3r+d88E6SeYy/71Yxx7S1/QfIU5/Ac8ZfULJ32W
+3yeY+xv/AByrw+axTs/6/AORG34YGo2FrJe6hp39oQO6IkkD/N5v/XGscTy1ql0xxVhmnPf3t9JD
+Aif693nT7t1Av8fyNsrso4OX2WYVnY4vUruwnkjnSR/PT/Xyb/vV6bJM+eS7ggjn+ySeRP8A6iR/
+lVqQElpaz7/Pnk3yP/q44/4av23LoVIlkt8SZj+ely8upjIW0tJ7qeO1T77v+7jqp11F2NrGhaz3
+en6l8nyOj/vI6znaYcp0Wqz6TqEkE1lA8E7p+/3/AHa5oPl0FyiWMF1Nd+TDvSTy/wDvpamo4w1D
+lL10kiRyfat73f8Atv8AdpRr33OS5Uju9RSTekj7/wDnpXVCnBjub2j3c8ySJAiJP/y0/wB2sKkL
+MuTCdN716WGp3Ri2avh06xNfeTDJ87p+48//ANkrZYUznVOkg1O6mjey1P8A16f6yN/vVwY33dDW
+lWLEGokz/PPvT5EjSs4QlUlqQ2dVDp1rHHvfY7v/ABvXvQoxhHUxbIZ7XTrMJNN8jo/361lRUI3Z
+cZ3MW+njTe/zun8G+vBq1ve0N4mfrl7PeSQeSmzYn+rStp4lS2MFTsWtN0e+ubF96bN/yfPRDBTq
+bGyqWNHRvDUEMc+/f89d0cEnExVe5y11pf2Od3m/1aff3/N/6DXk1aNpG8alzkPELpvjhR9/8cla
+UKWhpWlc7XTbeBPB0FqiOj3P3P4v96qrq0TnjExZ7WRLqRLX98iV5iZ3NGlB/biRyXXl/v0+eCN/
+/ZK2VRowaLkGnfaY3mvH3zXifPv+X941NuVymzBTQNSTUntbaDzvJ+eeDf8A+gV6NGjJoxbO6srq
+e2fzk+eH+5v+Wqws6lHSX6ENRK2uaBd3Xz2cnk2rp506b/l8yqxNGpPWIudGHBqUl7Lao8/z23yQ
+J93zK4aFapUq/wDDHRPQ0fFN0U1SP7FPskdPJn2fM3+7TzVSi9Ap6nIJa6zsj0/e6Jc/8s/+mW/+
+OvGq1HE6Yjk0q00WP9/aQXV1M+yD+JmrjrVOZG0ShPfarosN9CZI4bu9++n/AC18pvmrtpylCVmZ
+RjdkXgXQ9C1rUZ4dTfZ8nyfPtbd/sV7uWYeNWepGOlZCeONU0eFP+ES0y1R/Jffd6js/eeUv8Fbe
+1hF2OeNGXLc7PWvFJvPAPn6En+lQoiTx7N3lqv8AFXXiK0IwuZYWk+Y8KuL2f+1re+++7v8AvP8A
+tv8ALXhzjZHo+z1O0sr2PwxqVrdJH9qu5k2J/dVmrgo4jlkysRT906DWtS1XyN95Ok29H3vH8k67
+k/grysNW9pKyNY0rGb4X0afVvLuobtN+mfPJv/18lfQSy9uN/wCvzOPEVLE+o6ldan59rM+9ER0R
+Pu/9815jqqUrHbTVjk4dHnefyP49/wDq69DnSiKpOx6bpM1lD4Y+zPa+dqOmRu/kTfNGyyV7ft4+
+xueTGlJmP4fvbGye6094ERLpNk8b/wDoa1wLGLlOiOHZlXujX3h6S7ukn36VdOnmP93dRKUZ7DhG
+wy1sp9Tvv+PT5P4/ISu7D0rbmNWrY7vVPsPg2xgm0++f7U6JvtXf73+35dehVnymNOHMVl+MASSD
+7Taps/5b7PvVjHGhUwhqeHfiFJrOqumxLbTkR3SR/wD4qphjHJEV4crM7X9STU7f7Le7J3gfe8f3
+q+bzXHtHdhqd0eaWU3/CK+IEnhT7Tps/34P7y134GH1hc0/6+4nFU+U7/wAQ6uk3hv8AtbRfOn3x
+uk9i80Mi28f8W7dXqTpLltA56Fc8bh1Y6ePInggurSeP/Vzpu+X/AGa4WnzXOubbid94e+L9poWj
+x2tlcedawQIiWl6/71ZW/wBZ5M3/ADzT/br0HieaNjzqVCTkcL4w8QeCtQe7mhTfO6fuI0Tb+9/i
++avm8JRrp+9+h21rHnsd3d2sibJJI32fu69yMV1MIUySzs7u78ySCOR40/1kn92tMQuwU1c9E8Ma
+ZJrdqnh6GSC1eBPMj+f/AF0sv8G+vOoYSc6j1FUjYxNa1270rQ7vwo8Hk30F9ve7R/4f7u+q+rXn
+dmvwmNBqEH2eT+2JJ55J4/8AR5Pvf8CrpnSSYfWD2a38Na3ZadHp2ppBJp2/z5P97/brXHxqU9v0
+OnD4mm5afqYc+maHf6jfI8/2WxdN9pOnzbWX+D/gVcmEkp/GbY+E5x906j4f+GntYI9Wjn+R0dEg
+f/0KvTw2EcdjyswxXO9CXxNptje6fJa6vqKQ+S+/5Nn8NVXmo/Ea4ZSscXoUdvo8d3P5fnzumy03
+7/36y/7FcTcIU3JHra8x2Gm6aj+G5PtUaP5//LPf92Va8T2DhTc11K53zGTr+i3dlY/25/y0fYnl
+/wAUH+1XqZdRnGPMcn1lP3DFXQG13SpLmx1mDT7Tz38uxun+7/druo4OFSXNI5qlepD3Y/oRWcPi
+R5EtfD1j9qtLKDZPdyJ8ssuysMFgbyv/AF+Z042urG5b2tpJ++8aWj2t9OkNrpuz9ws6/wAP7v8A
+gr1MRhlJWPLp1EeN/FzQrXT/ABXdmyj2Wsj/ACRx1tGUVUOaEptanL+Ho7d9Ug8//V+ZXPjFdOx0
+YSF3qen+G/hzPr2p3c8N3A8ED/u5P9Usn+7uryIYlTjyydmelUTnK53Gn+CdKstKmv8AWbF0ktfu
+Qfd8x/4f++q+ZnPEOryQ1Xy/U6avK42PL/HVrInii+j8hLXy3/1Cb9q/J/t19ZSw7oqzPHjWuc7s
+kjj2VpzGylYu29nv+T/YrlqVNSowFt/MTy3j+T/lnJWlSpobqBrp4Z1L7Bvk/f79n2SNP9r5a4/r
+EJVOSG5tKgoRJNc8E+INE06DUb2B7Xzvk8t/vba7ait7sjz6bTlodj4C8TeHNJtI31DQvtN8n+ou
+0fb/AN9VMMUjqq4a5lrPpr6tPqE0Ej2snzyR/wDPP/dry8XPmeh3YSlyo6PQ59S+2wbHRN6fJv8A
+9XtrwcTCHK7o6ZSL2p61r8109npP+mGF0R7rYn2aFv8A2es8Nh6VP356ffdnM4nHeNbHTNL037K9
+rv1G93zz3zvuZpf+elezl1edefNfRF4imiDwf4hj0uwj3yfaYJt/nwJ/rbdlrTMMF7WXmY0aiiV9
+N1NIdVkvZ497/Ps/2Xb/AGa1qUG42KSNOxt9K1G0fZve6f8A5YIn3ZP9lq4akpU35GyZq3/gHQEd
+HS5mT9z/AMtv71cdLNavZb9DNQH+G9EtNP1FPOd1kTennv8Ad2tRjcZOpDQHA6fxH4ce/j+0wp/A
+iV5WExns3ZmiZjzeFXs7GHZvuXd9kKf8s1b++1dcccpyfTv3AytT8KXKTofO865f7/yfKv8AtV10
+MerbWRlQdiv4o8I29uP319Ba+Qm9/Of7zf8ATNVroy/HSk9EZYnU8++0QJJs8vfXu8p58atyWO3R
+Puf6uhq5vGFzUEmkiOP9w7z/AD+Z8/y/7Fc2ptTdiCSSxRN6f98PSSlcKjudt4U8X6tpOmpOlpBP
+av8A6Lsf5lrCNqc2zepNTN7TviRB9ujfV4PIjRNieQnyrXNjYvECguUueNvGMbx2kFlPA8F0nn+Z
+v/e/7v8AsV14vDq2hy0TlbiDStQ8Malqc/z6j5ieRP8Awxr/AM8656ScdDeRk+G98FvPPaySJOkf
+7uf+7FXVX1GX4NVkmk/ffvnuX2Sef83yt/tV5zpaiOw0Tw7pd/PJcp++jstnnJv3Rx152IqYhQt/
+kWy3qngywvb77T5PyP8AfRK4aOYzhHlbHcsWOnWuk6XdWaXXk+dvTe9H1qpOopJFHFR2Wq2s7vB+
++T7jyJ/EtetKcJL3h2Ld9p2t6ndecieSjoifvn+7trKlWpwjZu5bNKy8JXurOlndXcMM6Jssf7v9
+5t1b4KpCU9DCTtqcNrWjXcN9Pav/AMsZP7lelDEK+hozMkgKWmyb7+/5JNn/ALNWkKnvXRiyv5sl
+Xy9Dm5maaSa54kuoNPmunm2fJAj/AHV21Eoww/vIOZnp0F1Jodja2d4j3LzJs376+SdNV5uUdNTc
+52DRre9ur6e9n2TwXUCWs6fMsi/xRp/efZX0FP8AdwVhmTrOhRyPI7x7IN7pB/EzbaqhiorYditp
+s+m6RYva+Q7zzf8ALR/utVVoyqu9w5SXTPDf2ny9RuZvsenTzvB57/N833q2xkpU4+6rnPCJr3uj
+2uk30f2ad5oJk3zvG+3cv/Aa8unXnONpKx3Qeh1lppWla/ZJ/aFr++s037Jnfd/v1x0avsp2XU5z
+h7TToINSkT7dPa2rvs8v5Ln5P9169p17RuMtwaxquk2t0kMGzf8A6y7tU/8AHnib/wBkrH6vGrLU
+Dc0OPVbrw+8l1Ij2M/zxzp8373/pp/crGrh1TloB2lhot3a21oiTpshfzpHRP+BLXFShatczOT8X
+Xem6hp2pQP5CXTv+4n2fvf8Adj3V6EJ/vQPH59Et/v8AmSfu69/2tzm9lYPMngj+f95HH/y030uS
+4c1i3Y6nHBJ5kkeyT/ppSqw1N/aFzTYL+eOS6guI3/jk8v8A2qirS0F7Qn8/TbKTyL5JPt3mfu9j
+7WWlGLkwNLR3htRHezx733/uJ/vf76NWONw87aAdDJqngyDzI/LdP3abP96uOVBMChb30E0f7je7
+/cjk2fMtb0IWQGlH9u/5ev4E/j/iWtqUbI5pFt9NgTY7ybN6VdJ2ZizXstNSSPfD9/8A55p/DVST
+kdU1Yu6BY2ra3AmoR74Zvkr08JSaOGdSx3lp4X062unuvuJ/B8/3a9S3K9SFUucbqV7ImuTuk/ne
+S+xHf+Ja8rFVve0No07mbd3Ub/8ALPY/+x92uWnTsy2y/pcmqukGyTzoP+Wab/7tdspWRjKR1lpf
+QXOyw1b+D7km/wCWurDVU1aQmaN3oVpdbNnyJ996yqYFTd0YNFBIZ4buOBNn2Xf88deZTk4ysbuR
+0KRokfyfcr6GmlGNzGURg+f53fZDTlKxEEcd4p8W6PBpz2dnsfzvkd/7tcOJrJnZCJ5dJPHdX0aP
+9x3rytkbT1OittSkRPI3/J5n+srzL3kbUtB7yR+el1bI8L06NpLUts3rSe+mukm+46Jsfen7qu7D
+ycX7pi2XrWGx1DfZP+5vt+9E/h/4DV4SgpQ0MZ1LmpY6In9sJNNvSaH7jp8u6uzL6DjPUznUui3d
+WSQ332n7kD/6/wD2ZP8AnpXp4mDkzCFTUw9Yu9QS4fSvO8k3PyQSP/q23V4k3KEjrhNHPXWhx2eo
+wW2ofvPn3vJD/Cq1hUiozuzW5Nofh3VG1yG+8zY7/c3/ADfuqnB3dW6Buw+70OVdZjkeffsf9+n3
+f9qvIx9ObkbRkxl9dae8886bHvrVP3G+ub2MrG0WzI02O6M76ncwPc+d8m9/4a64YNzj7QmpWuyP
+xBpml2em/wChRp9umf8AcbP9b81YYdz5tCqlPmRwX9ovDHJdCP8A4mWoO/nu/wDzyX5a9euuZ+4b
+Ribn/CVX1toE+n6fG/2G92Ryb/8AlnL/ABqjfxbquOOUqfs5HJGj79yKDwB4guXgtv7OdPtKb03/
+AHNtW8FXir3/AARccQjr9L8FpqGj+ZDs/tvT/keDfubzYv8A4qsKOX1pvmv+RhWxBz/ieHUpnS6u
+k+yvNvRI/wDrl8tYRwsqULs6fb3MZ/DGq2tj/aH3E/5Z/wB6phjoqWq/r7g9nzGrppnvUgTy/wDT
+oP8Alu/3W/661wyk+e7KTJ9AN3Dqsl09p508P/LD59tfR4V3jdHHXkelXU+ju8GszJBNBs2X3k/N
+5P8A3zXtzUEzii5M5bxG9r/bketWWy9tU2eYifdrinWgpG8abZzfiu6/tCeN9PgdIHT9/a/61Vai
+K0NWh3hLW9W8MTyTPaedBdJsjTfRGepzypk9hbaj4m1x7q9nR59nnQRu+1W2/wDLKj2Trbmka9hl
+3Y2H2SB9QsfJ+1PMiSf9cv4q83E4LkNo17j/AAXHaQ6wmnvOnkTP+7/iWTb/AA7K1jRVTVkzZZ1y
+CS1vo30++fYm/wAj/aX72yvNxdNbI2os56/ju0tYLqyt/Ivk+fzE+9H/ALdZYbEOE7s1q07nG6lq
+WpeROiXzul0++ePf8rN/tV7MayqSuYwp2OYvJK66dZWOOoveKsofy9/lyeX/AM9KzpwUpF1I+6Z1
+xzXTCq3uc81zCgSP/rPnrKrJdzajSsdDomtfZbD7FPO9rBN/y0RPl/8AHa4a1FSndHTGdjtde8Q+
+CYNMtdR8ImO2vrXYl1aTxvJ523/lr89ep7S0LIyqrmPOdQu7O7eSf94m/e/yf365owM5SMSS3uJP
+9ZJJ/wBM66IuxzSifZNzawXEL2s/zpMmySvdqq/xHkUZKnI5eHwJ9k1GB4J99qmx33/erheDhJ6H
+uTzVxj/X+R15KRnYibI/+eaV3U5KS908Sc+WWpyE3w6Vr2e6hvt6XT75IJ/9r+GuHFYNy3PcpZtC
+nHX+vwLGo+Cj9ig/s+f/AImNr/qJH+6q1jXy9Omkv6/ExpZhLn1/r8Dj7fw54tTXbTTrpP3Dxu8c
+n3ol/wDsqwr5bJwUF/X4nsUszhza/wBfgdbFqWnf2Jfabqc73Wz5ET/lqy/71Y4PEuMeVmOKwEuf
+nRyvg7wxpV/c+Ve70Tfv8j+Fl/hWt8NJVJcpddSpQ52eleH9Fg0iCeCCPZG8+9P92vToUeU8DFYh
+ia14W0bWvnvbTzp0R0g/2f8Adq5U2ZYeoeSeNfAEtx4T1a51CCO1u7af9xO/z7tn9z/frzFg5Rqn
+sTxUOXQ+fFbZLXW4WWpw0K95aHvXwg8QwXml/Zpk3nf5c8lfCZ3lrdZOG39d2fR0aylC57dbaYr6
+f5F0iagn349/zf7tfU5RglCKk9z5vFYiXPZHz38RbTWdS8SX169hOkEcj+XJOn8K/L99a3xc+YvA
+x5mcpLZyRyRxyR/9dK8qdSx606NjR0zTH1C6kS1+TyUed5H/ANmuWc7G6iFpaR3X9/zN/wC7pVKj
+SN4wPV9Klh0a+077ZHBepB/x6Tom1Y68qNWVCpzoqpRdWOhj/FHxmms3cFrD/qIZP9XJ9xq9qGPl
+W96xwUMC4SOOuHgdP4E2fwVwxvc9Xcg+129rJG7/AOr/AOWlbRp8wuexautajmuLS20+R7PSppP9
+Ok/55/7lRDDuMXz6z6EJ3PRdJ1nRZ7T+zdMvUt7BPv8A8P8A4+9fNYjDVYy5pq8v67GsYHnviy1u
+NT8QXUyBJrXekKOnzLt+6tfR5ZWVGhbruYODkN8WeGf7P0mC2sf+QjZO7308G/a0Tf6rdV4HGqpL
+m6MxeEZj6RHJqMHn2v30fZdx/wAUddValybmyO20rxcLaxtLWG1hheF/3k+z5WWvDr4JVG22apHQ
+v440d7KdLyHe/wBzyU+ZW/76rzP7MqRmuVmbqHPSeK4kTybPT4YYf4Pvs1ehHAt6yk2w9odp4c8Q
+Q6hor2Nuj/b0++n+9/drxcZhHTqqT+Eto3/s22BIpnSLf9x3euDnu7rUDhvEPjd7KC6tkstl0j+S
+k7un/fWyvfwmWqVm3ci1jzW/v5NRn3zu8zv/ABvX0dGlGmZNXGWlrYQeY8/mPPs/cbP73+1Ve0bM
+o4Ww+3toHnj8+R4YE+/8n3qXtDdQsR6hboJ50tZ3mtEf93Ps21pSqW3OKcrEdhBcT3afc/4H92lX
+rJK4U5XOj0iC+tb77Kf3z7/3cH3l/wCAV5uInGcbhQqHTXFpp0kCfbHS2m+dHgf73/Aa86lOab5d
+Ud25n6x4b8IJHH/ZerRzOn+v+f5W3f3f7te60zkpGDJYx79kHmbH/wBZ86Mv/jtZOqkbzLkNjdQJ
+JG6Ojv8A6yOuZ1k9gH2+nTzOkMKfvnqJVEtWDOivrG10nStgun+2zP8APsfb/la46WJnUm9PdNDS
+03Vb7UNL+e9S3SF0RJ3+9XLXppVNVfQTMi9sdcvNVS2uU87Z8/yfdkj/AL1dVKdNQvA0OpstOgth
+stofJryKlZy+J3EWrveE2Qff+/srOnvqWyjZXxuk8l4Xhd/++f8Avqt5w5HdO5iyvruhzaha7/MT
+fbJ+7nd/4f7ldODxKjKxbMa1tE1bQLq1j/10P76eP+95Vdqk4VL9DJmVp3hiLUPPSHek6fPG7/LF
+5VdtWvybhzo3tA0rTbD93a2r6lqKfvpJ0/deX/ubq4K0p1utkLmRc/svUb/X7S51P5IHk2JBv/1e
+3+BqzoVKcI2Qjr57LTooY3jtP9Esv9RGn+19/wD4E1caxM6s7R2+QHIx6omp6ik01inkJ9yD/Zrr
+WGlH4TflKcNppeppBHcwOjpvfyPu/wAe/wCWnKdWDsncLDT8NNQ1Cxea2v8AyJ/M37H/ANVWsc5g
+pWl/X4GVrE134I1HTPLDzpe7Ifk/3v4lrOpjoTlaJPMbnh957q1u7aSDZdPA6JO/y/8AfdYTo3lc
+DmLq1jhkg8uPZI6fv53/AIq64S51YZ0+h+HE1CCCd5P3Gz9//wDE1g6subQGbEeh2tqdiRvZPs2R
+31r8u5f7s0f3Kz9s+bURzer3euaFBGll/pqQ/wDPDf8AN/vwPXdglFz/AOHJOVz4j1q1fVJ4Hmgd
+9/2t0216dScISuBzsckc8kcf3Pn2fP8ALtrq5bGfNcZJaSeZs/uSUva2D2Vwgt5P3kckf7utqtTU
+PZlqCzg37/s8fmVFWpoHszqdHg0G8eNLrSrWGfzP9f8A3mrx8TKvRf8AwwFTUbHTrLXZEgtI4ER/
+3kddVGvUqL/hgH319pqXf+hQR/u49nmfw1oqEmBpWL3EEEF68GxJ/kgn2eUvy/3awqwnEDY/4SN3
+tPsrok0Dvv8A9r/vuuqknY5mWXu4Jv8Aj1j8m1/55v8AerWlJXMWdD4c1eCG6ghvP+PV/k3v/D/w
+KvVw6Rl7fmNvX9bgtvLtrONHgh/j+9/3zWtbEqBXs+YvSa3Y6npSbJ9k38cH+1V4mt7SOhkqdjE1
+jRI96J5Hk7/n8xK8q3Irs2jUsZsmgJ5kf+l/J/31trVS94iUjdh8JT2Vp/ot1v8AOdP4P4f4ttd9
+WleJjJmna6P5KJbbP3af365oUHCWpszegj2JsSvYimo6GLI/IgTe7/x/frOrRhe4J3Of8Yapa/2d
+9mhk/fv/AKvZ/s1hWxEbWN4xKaWmlPp3k3uoz7/99/8A0GniJWREUc7e6V4csrp3mR3gRH/du/8A
+FXgyq3Z2QRy+k2Mf7yfy/v8A3K0r6RFS1OlfRo47HYieddJ9yNPvNXmUFdm0tC/4W026mup/Mg3y
+Q/f8z+GvQ+ouS0M5SN9NSg0/e+oJsg+5s+826tcLJUX7xhJmLrFzYvHHevseCZ/9YnyyrXI24y93
+Y0VK6Nfw74pR7RPtkm9d+wT/AMVe1h8akveOfk1N3VNRgtUTzk3wv99ETd8tdtbEqLMYUzg5bzW7
+3XJLNHgvLK23+T53/POuG6qSO2FPQhsdRsbWCS6vZHd0d/Mgf5laX+D/AG64Ek43RqcvBruq3urQ
+TpI+/fsT+Hau/wC7Xn80k7sDvJ7Z4fLmeN3nm/jf71ZYvC1G/wDhhrEoy73wvqN7O9y6PDCn33qo
+YGo1/wAMbxxSOg0u+0SPS49MefZNsf59/wA277vyV9DSq0/Z8i/U4mmpHD+J9L+yxwYk8m7+/HG7
+/L/v18vUjKNSyPR9p7pzD+HY4P7Khurt7pJk/gT7u795srvxT5KnukUa14XLOo2GspbwRSaa9rY2
+vzxxv93/AL6auOVDkXPM0oy6m9H4wvDocdnC7ofk+T/7Kto1Kk48tyYKmTeEp9Q/t27mtpPJe6f5
+9/8AdVK0wvtIy5bmVbkOg1+10bV7G1spN6TW2/7n/oG6urEYqlOFl+pyw3ORmsdR+y/2YkbvHv8A
+3H/Aq4KGHUp6HfCpYsaVfXdhfR6fdfP9tTfBJ/F5q/wNUVqPtY6GaZu6Da6ra2F9q11sRPnSeB9/
+mNXv4Oj7KjdnFXkcXBo7zJvgkeB3/wBf/u1xQq88jrk4xOjtfAWrwakkM0mzTrn/AJbp8y/8Cruh
+geZ3OeWMSO68P+ELHSYH/wCW08ybJ99epGh7pyRr3OF1RH/tL7Vep5Ox9kabNvy1wRp+8bxqHoGk
+aboFzpyPbWqeQ/30f+9/tV6VGmkctZWOQ+J1iiPa/OiQJA6In92vOx0jfCq55PJq39n3aTQfPJA+
++OvPlB7I0mzcsNZg1ry7bzHS7n/1f+zK1edXounqzaiy9oWgjRrq7TV/ngn/ANXP87L/AN814866
+cTqjUuczruhf2hNPDpcF1NfI/wC7j2fuPK2f+hV9DlmFc4XMqtSxyEN0mnXjwXtpG8nmbJ43+/XV
+PDOKMakfeDXtI8+6tP7LjkeO6+4ifN81Z4SD5i6i909U0/4TeG7LwjYprWm/8T65/fT+c/lbV/u1
+vmlT2a0OXDrmZmarH4V8PWt1DbWkELzJ5kG9PN/3kr5WM61WXl8j1VS0PLfEWt2k1j9lSCC1jd97
+yJ8zNX0GFw073ZwVpnKif935ieZXpcljninIjs5P3n/PTzK6HAzjK5sT6fYQQWE9pfxzzz/PcQfP
++4b/AGt1YSOiMbn1xX0J8+I77E30DHeYiff/AI6RoO3pv2UAOFSoRexipWHOxWPf/wCgU+Ro2jFy
+MFbzQRfeQ9j999nnvs2/NXnSxtLn0X5npSqVIr/hi9a6Tov27zrWNEurb7+x/wC9XTTpRk+ZGLxd
+S1v8jW4rpV0jlsmP2ipU2mP2SZW1HSrHU7f7LewJNA//ACzenEmPwnx78TvBE/hTxTd6e/8Ax6P+
+/sJP70DVnWLwi94oeDfGGpeGb77Va+XJG8ey4gf7rLXBjsLGoenRxrjE+t9J8a+HJvCMGvQTp9h2
+ImxPmZZf+edaUOShA4nGVaQ1PF+h6zpd95CbLVIP3kl18kXzVNPHQqpwR0TwcqUjxTxm9jJdSQ2s
+8d15aJ/paJtX/gFfO1FyVWj2KPM4nJQ+J9S8Na1JPDHG8F1B5E8b/d+au1U4VldEyrOOjN7wtqV1
+ot1Y62USeCR3Ty682vT5ro6qLR6F44tZ7zRo/FVlPG+nbESRP4l/hrzsoy6cYXlumZzxNpWPPZbG
+/wDsbyOj+R/y0d/9mu2NdOXK2aVFZXK2p6bHDBaPBs8yZPn2b/vf7W6qo1W5GtWZnfZJJ4JHkj3x
+wf6z/ZrqdVqRhEta1b+RaQQQeRMiIn7y1+b73zfvKmjXb3GVrS7u7X5If9Y/+s3/AN3+7SrUlPcD
+d0WPU4LGeZN//XRE+SuDEezlJHTylZILgz7J7udPO+SST/ZatOeKWiQchUvrG78O6ld2Xl+fYT/6
+idPlbzdnyyI1dmHrQrQ5vtHFGnYZYav58Hkefsnf7/8AdZKUsLb3kbqdhNQTUHkjS1/1j/3KmnBR
++I561Zmdb3moJ9ySuh04GEKzPWfAHifQbfTXe5R0upvkr5HNcFVlNcr0R6zRneLpvE97JOjTwPZW
+aedHJbb1X/d3125fSw8F2k+4I4OT958/33/56V7UUkY2LVukn8FRU5O4WNm+8PPZ7POdHd0R0RP9
+quCni1LYq5NF4e1VIUm+y/aYX+5UvF072bsDZNeeGo4bCCby5kf/AJe4P4WX/ZqaeNTnbQwxVG5l
+aLpD3mqpZJ/q3euvF11ThzGVGjY19Sh/4RzXxDBP5zw/x7K4qNR16V2rGqqh/bujXTztqenb55v9
+XdQv8y/8BrWFFwjaLD2h0eleDtC1CSd7a6hd4U86CTftn2//ABdOhVnfU2qSPPJY40uJ9m+SDzP3
+cj/erulU5kcc4nofgy3u7wQRXib45kf7LN/1z/hr5rMfcXNE09nY7bTPDdpazTz7P3//AC6Sf3a4
+6eOtDUqxzr6Vb3urp/aTwzWW90g3vtkk21Srezh7l7lk194RhXR72ztvub/OtU/3aijmL9pGT+Yk
+x+g3D2VrDbakiJMm9E3/APPNanFU+aTcL2/UdjUhvrK/3/Zn37Pv1ySpSh8QrEOt3Gn6bbb5v4Nn
+3PvfNWmGpzqPQu5j2viOyub7yfuJ9yF/u12SwclG47mxq+o6dp9lIk0H2q6uf3MFin/LRqjA0nKV
+yDjTPFo00EGkvvmgT/T5HT5Wlb72z/Yr6DFQjUppMZLBo2pTRvM8nkpP9+P+Jq8+pXjHYPZnRWlw
+lrYvZIm+Pfv89/8AW/8AfdOnmc47f1+AvZljTrpFj8uH/V/8tEf5l3f3q82tUbhylypmrqV3Be6Y
+lrMieSj732fxN/DXYsf/ALMqa3/4PoYOmYN5pab4Jk/49d/yOifMrN/ernp1JyhZm9Odgltb26ng
++4jw/uf+A1mpRV0wqTudbYqkNqkCf6tK4ViZbGfIUoJodQ1d3PyfY02f71bct1r1DlNTy7eST++6
+fJJQ6SuZ8xkax4UgvYP3HySJ9yu+hCwcxlX0t/orollcIkH/ADwq6FV2GzrbF5LqCCf++n7ytFT5
+mYSOX8VWOsxyfbY/ngT5JHT/AJZt/tV6cMM6b0L9scHdHXLKCeFJHfTZpP3lp/7OldSjCXxD9sUo
+LX7Vb+fBHvjSqnU0uMuCye1tI7pLTz98n+s/5ZbawpYlJgbaeGNOTwzfXr/8fcM/7iT+8rJWkJyq
+K5jOXvHJokiCP93+8reHvaM6py90fdvvkjk8vZIn+spU6KE5Dkn8+SR7qSTz3j/dyf3moq0UYNha
+Wkccn76nFWZB0+jp/a/mf2vfeSlrsgsY/wCFVqK2IEd/Z+EtKTwxuf503+Yk6V6UH+6sznpsPDPh
++01O3kT+586SJ/erLCYaLQVDO1XTk0/UfsaP5yf3/wD2WtuVDGbnRNn30pezQFixR0kgnT+D/WJU
+qpdmR0msPdam6PD8lrs/j+WtK8roCrcaG9tBv3/f+5WdSi9yJanTeHbrfpuyZ/nh/wBZvr28NUSh
+YwlAemsI/wB+B0/uP/DUSxDaCxpI+9N9dtO0ojsU9RnfY8MKb32fx/dWuLEzdhQOXj05PtXz/P8A
+J9/+81eJObudsC5Pr+j/AHLlH+TZ8/8AtV2TrRkieU4/xvrFjcxx22n/AOpd/wB5XPCEbhym7o+h
+WP2WCT786QbPk+ZWaua/tCFT1KqvdaZrHnJ87/8Asv8AtVFCr7KZ1Vqfumta+LfL/wBda7POff8A
+JXrLM01y/wBfkccqXKLqGiT3iJs+RH+fe9cDwsr8x0Ua1jmdW8NTwp5z70+R3kT+Gs5ycGauZH4W
+snfUYLr+Dfs+etpTlJGMpnqkS/u03/fr6ZK8LHnU6hgN4edL5Jk/g3uj14awLc2zthXOUn0B9W1m
+68yPyXSP9wn3V3VhChd2Zu5nRXXhPR3sYJnG+6tkRPPh/vLXcsNGCujBzIfD66pe6w7ay6YRP3Gz
+5VkrPCt1ZakTqp6G3r+sWmk2qecm95vkRK7MbXVCIU6XMeVXf+sjukj+RHRPI/ir5elL94d9VHX+
+LdE0u80CfUIrrZsgR40f5ljX/wBDr3MTglKNzGFZxOT1Vr6Z4HsoJ5oLX/l62bfMbZ/yzr5fEUJQ
+lzHdRpqxT1O58S6hB5NzNN9ih+REf/2at/rTUbtF0acbnX+GPDyTWlrcwzwTXUPzyf8A2S134XBc
+sk4s894mTR0cjyO+qR2qQJe/Jvd/9pPnr6GquaNmzid7jNL06BET5/3/AM/yfxbv71eDSwUZO/U6
+ZV2c1q+g6rdQRps/fwv+/k+7WdSnPmt0OmjXRgar4S1SG703zt/zvs3/APPPzf4a7ll/I/6/zOb2
+p3OlaPe6fYvDe3To/wA6bHfzY2X/ANDrsjSjBE81zCTRND0x5E1OOdI3/wBXP/DUShYqU+YTw74u
+TTd8M2+aD/ln8/3a3pV0jnlhuY6nXPFP2KC1mhj85H+eRN/8NXPF2DkMu68U+HNangtZoHm/8d2t
+/vUQq8wch1Gi2lra2KJbRoiP/crtirxOenE4/wAb2Mk0E7zWr+fNNsgn3/djj/8Aiq8zFrlR3QlY
+8mvvCWsmSR/sj+Rv2eeifLXLQUpq5DqXOi8P+GP7Ojnd4Nl9sdI0dPu14Ob1JQO6hqaulxP5L6Y8
+e+6dPPjn+8u2vOnhlKaaNpyMfVtZ1XVNN/sLw3BOk83/AB/Xab1n/dP8i/LX1mEvyJI45tHl8fhf
+Vp9akgvv37/P5kf/AC13VnXxFnylQR1thplhoMf2K93w6yk6PHG/3drfx1yV6UUrs7IRNK6vdYgh
+3yQf2hBav+/n8/zfL/3a8vEUFGfvbl09DM12x0rXdO86FHeZ/wDlpv8Am/75rChUqUZ80vh+Q5zP
+OZdDed7iBI53n8z/AFeyvolWUdzz62GTMG6064gkk3x7HrtpYqL2OaOGaLGnW3liSd5P9X/yz8v7
+1Otub4WloWre3g+2W6PcbI3+ff8AJtjrOrOVjRU3c+tq+nPmA2RvQBh6y72scHnSbEh+eB/+en8P
+l0jU1Lu7tNMsZLq9k2QJ888lAFGy8Z+FL3/Uakm//nm/7v8A9CrGNWK2N6lCzMTVvGjwa5Pa22pQ
+Jaw/7H8X8S/7VeNjsylB6f1+B6mCwqaK1t8Q/CzwO+u7Hut/7uRIfvLV4LEqULyROJo1L2Nrw94s
+8HXSSf2Sdk7/ADyJs2s1XicxpUI3f6/5GFDA1JM0tK8V6bqF3JZR70uof+Wb/LWFPO1N2/r8hzy9
+r+v+Cbig17NOpzq5wzouI4dK2iZx+E8U8daTpviv426ToN7+8tYLTZdxp/uNJWVUvC/EeNfEjwFe
++DvED6fN89nJ89hP/wA9IqzqQUUTRrKSM3w14nutHu43+/aeZvuLT+Fq5cVQ54HqYGtGLPe7y70e
+48NRolrJDBdIk1j/AMs2k/2q/PIYevRqczf5H0FapGbKkGm29pYSWT2mz7V9+eZP7vzfJVTrzcuc
+6I8sYmF428IabJo0l7ZfIkmyCSD73/bSvTyjHVFLlZxY6Ca0PPPD9mk/mWn2ueG4gk/5Zv8Auq93
+F1vZq9jmw1JyOntW8SpYvbWurb4Jn3z2kifum2/7tcaxMI6dDephuaVy7o3/AAmc999ltvInd/n2
+O7sv937jVz1VQev+ZdR3Vh3jvR/F1laQT6h5Dyfcjgh+Xav+5tpYOpTcupzOo2c9pcdi/lyQfv8A
+Y+/zJ/m+7/DXViZ2Z0Ujf1JL57SS60+0k0/Srr/WQbPk83/gNccZJPXURk+XGnz/AH5NlbRdxnU6
+F4osYdDns7re7vOkm/ZXl4rDTlJNFuqOvta8NvHO6fJI+zyN6fd/vPSo4erFa6h7U5S81OeT/RZJ
+3mtU+4j168MOl7yMI1LmnHdeHrvSfsM+mx/bpPke7f8A5Zr/AHo/9qsoyqQlzX0N1TuWf7F1nwpJ
+aXtrAl0k2/Zd/wCyybdlZ08TGv5Nf15BVUQ0XwwL2QXtlBPNa2ex7pJE+9/z02VlXxipuz6/1qYQ
+SOs8OaPoA3vq0bw3SfOkD/d2/wANeLja9W9qfwnczV1vX7GCNJtN3zT/AHPsuz93t/2q58PhOZe+
+7MRj/wDCCR3Uk97eu73sn76eFE8pf91UrsqZs72VrdwsX4LG0sp4PJh+zb/kTeny/wDfVc3tZzvr
+cVjA8TaHqVnc3U15fJN5Ozy3RH2tu+7sr0cJXpzVokl3wtd38McCTfPazfPA9c2OpRd2twOzuGjd
+0gf50mTZ/wACrxYJpX7Gjlc5HR7GCx8Wz22mzeZ8nyTbPu/7Fe3ipupQTkZOVjJ8Y6bdafrjvM/2
+nzk85Hf+LdXRl1VVaemljFUzK03TZ9TuvIh2I/zv877V+Wu6piI0oaj9mMtLS/fzJrX/AJY/PJJT
+nViLmuPv9N+xeR8+/wA5EnrOE+Yajc1fCXiGPTNVge6nnhsf+W8cGxv/AB16mrh09xVJ2R7Rp76d
+rVg91peq/abVP9Ym9FkX/frHEZOqkLx/r8TgqV2jivFfhsw772GRPJTZsg/i/wC+q8TA4lONnuem
+Tv4n8vw49ykDwzJ+5g/u7v8AZas1gW6tt4k2Mfw1a3r63azSTpc708x97/d3fw13Y3lhSdtBnV62
+kFgIJraDZdef/Anyt8ledhv3lNuQzK1HTNX8h9Vv3R3hh2eR/d3VrSxMOZQj3M+Y5l9Dvv7H/tV5
+Pkd9nl16UcYlP2aDmLvhydBqMj3u97p08mC7+f8Ac7v9mtMSvZxsjQ0E0FPt3nTfPBv/ALm2vNli
+ny6AdDaWSXib4B8n+3XA+ZMXtCnqi+TI8L/I6VdJMPaFSxl2JsrWrC+ppKZoKZ4Y0keP939xJKzd
+FuPN0MHUN7TUEkDpZPBMk3+vsZq+ky2MaisjCpKxRSzuIbhIbmB0utm+T/drhx2VS59P6/EKc7md
+aarPp+s/6bvf7U+z/ZWL+Cl9Wjcv2pcu9RsfD7u9188967vb7P8A4qpll39f0w9qdAnzpG/9/wCe
+s6sDPmB7uNEkd/8AVp/rKVN2C5y/iazd9RkRI/k8hH8xP4a9ejgkkbMTQ73+y7WSPz987/cjf+Fv
+4aiNLlZlIUa3qtldfY9XT/RZnR7uDZ/DXoUb0/jM+Qd4/itbp9Oewh2pJDs+T+KniKtKe36iUDkJ
+9Gnsp454JPInn+eSP/lk3+/XM580TpOgFnBewwQzQfYvn8ySff8AuG/7aVx4ehzSA6d9a8M6Z4Pv
+YXnj850dEg+9ub+GvosDWhKBwyl7x4vcXcn2uOTyP3aPWNvfOyT90TVtSgntI9key73755//AGWp
+hSZLZShnST/WUVKLMWzQeO4R4/40f56KSuizpPD91aF/Luo08tH3/P8Ad/4FWM6HMxHq9pd6a/8A
+xLNPk86CH+4+77392urES0sjmpmjZaa9ra3Laf8Auc/wPXTgsPJrQKjOc/sfzr5P3fyfxyVhCLGN
+vdDuraBJnT5H+RK64UmBLp2gXVzBO6SbESrp4bS5maMGlSQzp+/3on+r31xTetgNWaRJ7F0m/g+4
+9dca6lAyi7mG806b/JkfZN8j1hCqzojC50qRomlwJ9+vSxMko6GFiGO6nhf7FZ/PO/z/AD/w1nhK
+smgsWNRkSy050T/Xv/H/ALVdmJmrGMDi73VZ7mT98/3PkjdK8SdRXO2BXf8A1Du/z/x1nC1zTlMG
+1sY5p3eaP5N/+rrec4xQWPRNN0B7LR3msJ3eZ03pXZTwfJA51PU5oWM88cnkpPNdb/8AS64JYbnZ
+1V6numnDpUD3cfnO6IifO7/w1jQpx5rmVaVy3qPiOC2tYLawnR0RNj70r0K+M5VY54RuU7TWZr2d
+EvPnR/krlpzVSQOZ2UGl2MMeyGBE/wDsa9+nhoqJlKRZ21utDP2VgpqyFYqf2cm9/wC46VyuhfQ6
+HMjsdOMMn76Tf/zzqI4dw1Zg5E11bweX8+z5PnStnSUdi+U5TxmjpdedN++gRNibPvR/P/drw80T
+a1O2hKxzur2NrbabBew/67/bf7y/wbK8intzHdCPMUofE1jbeGL7T7pN7zQP58/3t27/AFcdetSz
+Hmjb+vyMq2GJnn2WMYsp50kRESOxm2NtXZ96vCxOJi5cqZpSpuxZi1U3OifZXg+1P/z3f+Gk8VaP
+LYqlTfMUdP1DVdPnggsn4T5/LSnGVTlvFl1aEUa9jfPeXzzJGnnumyfe/wA23f8AM6/7tdmX+0qP
+3mclTlidLpbyfbtiOm//AG/4l/2a7suoylO/Q46yN2a6gh+/87/3P4q+inOG3U54pmL4l/5A++Z/
+JvUfzrX/AHl/hrCtVsrGkInNP4ltUsftqSb7qZ9/zp826vnq85J3O2FErT+MI9TtZ7bUER9nzpJ9
+3a1b1cWEaVjC1HVoNLknSy2P5yf7Eir/AN9VhGudEVYxk1u6/eQffT/lpXTUTMPZk0E8D2knz7JE
+/v8A8VEKvKLkN/SvHmq6faPawxp5H8H/AEzb/ZrsjjOVHFy2Oh0bVtY8TWk9lcxok8Ox0n/+wroj
++9iTzGs+o6HoFz9mbznEn+uT/WrH/wABrWFqehrOFlcdqNnBqezU9Mk+0/J9xK4cXhI1dRQr2M7T
+tBtNWGUjeF4d6O7/ACyxtXJRyvlV3/X4nQ8TzHK6N4iuvCcmpWsNj/aD+Y7ySP8ALL8tOjjo05cr
+H7FyObvvHkes65A8GlQ211v3+Yn39y/xVz47+Y3hE6e40/TdTvv7QexRJ3TZJ/tf7VfKZhmj+Ff1
++B2wRwHiTTrvw/ezw6ZP/wAS7VP3H393l7v4Gr1cDWVaPNPcmv7pDffYdM1WCPSLS6ePyNj7/wDl
+pOv/ADz/ANivedGMoe9scSncs2OsaEbufV7qD+zr/wCdJ7FN7bm/heOvNx2GdTY3o6mFqt9b3lnJ
+dSQIm9/ubPm/4E1LB0pUtzqlZEGn6R4eutM32sGyfzPngd91VVrzTIw1PQWPwtaR2k7wbPLk/wCW
+f92lVxcrFqnqfRFfd3sfF7la+1HTtPRHvZ0hjf7kj/dqvaC5Chf3uj6vpt39lu4Ll4U3/I/8S0qd
+WwVKVyHxTpqeIPDElr5mz7UiOkn91tm6lUlcqmuU8Hhsbq9u47KGPfO77I0T+9Xz9ZxU+VHvpXjz
+HdXXhOw0/RtKmeN/M1D5J9//ACzassdgZcl0PDY+75Sr4k+H/wDxLoLmzgeGeafZBYv/AM8v+ej7
+qnDUnCjaq9f67EutepcztK8OX6POk0Dwzp/y037drLXFWhUjG6eh2SrJs7GG3u4Ugun/AHGo2T7P
+Md02zKv+1XjxrJVUkOpS5keiaTfQajYxzwSI/wDuV95l+LhUXKj5zGYN3LdxOkMDzTfJBCm93/2V
+rubOWR4t8KprifxB4k+IWoeX/ZsnnJaTv95m3/wf8ArlnUSOzDwbKHxOm/4T62nmst7vp9r9qt4P
+7vlf61a+boZnUdVJrS/9dD28RgVGJ4PpMVnNqECX0nkWjyfvJP8AYr6OvWc0eVh6UVI+kNVsZLyf
+STPveCaDyIH/ANVB8qfJsr4qviKnIufU+gpx5dTbfwzfXNx5P+usUtf3fz/3fl21rPKpcqqQ0/rz
+ZFPG8szBTQ7eG1kgvbTZG8DpBJDs3Ryt/frzaOJSndnbV988p8VaRBaCfVdLkjT7E+ySN/vSJ/er
+6bBVvaOzPLqQ5RnhHxPBd3H2K5f7LPN8kEn8DS/3ajG5e46vUunjXJ6noPg6PXLLxdayWcH+lQv5
+c8f3tq/xV5kMX7DU66kVJG38cJkvNYtEgkfZDAj+Z/CrNXtZioynzRPKwUbHk9/pF3D5d19yeT/V
+/wAKN/v1z0a0W7SOudG7PRbT4nC68Pvot7Yp9uhRIJJ/9n+9XmVcLGEfdOlIbd+G7TUNO36VB/qd
+jzonzSyL/HtrgpY9052l/X4GyZm3PhrTdQu7VNP320Cf8fSP/rFVf+Wtb0cZKF+bUmcF0M1vBGs3
+Mk81lC72W/8AcTzfu9y11PNKcfiep59SD6GFeWM9lJsnTY9ddCqpO6JnaOhY0jV5NLnkuvI855Ed
+I/8AgVPFYV1dDWlOx0Xhjxlqtt51lbQJNJe/JaQP8yxy/wCyrVyY3LlOpGfY3nK7PRfAV0smlRve
+uiai8j2skf8AqlX5/ubK8HNsLUnWSW3yHKehympf6Ldz6Zev9mvQ7p/sr/zzruq4eVN6K6RpGQyx
+nuxP9guf3M6Ojv8A7Lf3l/2awrU0lzI2TO50yR/t6Wl9N5yfwP8Aw/8AA68Ksly80VYyZqa7p/na
+ZP8AZ4UeZPnhT/arnwtW01d6GUjzi7kgmtfIuUd3+46b/wD0KvoqSalzLY6ky1psr3MkEKOiOnyQ
+wp8q1jWjypt/NhcS8n1ieT7B5n2a6T5IP+mnybvlrajCio83+ZNZ3ZL4L8PaydfnSZEgurZPP3zP
+t2/7ddipfWI8sGc1eVkdlrvhax1mSCO6kT7XbJsfZ92vK9o6EuR7j5zkvFOlaPp+lXVtpkHl3UKf
+6Vdff/4BW2EqznUXPtcW5xWhJrM88ltawTppz7Huv7texi3CMb31KZ2GsaPHf/2cPn8mFHSf/npu
+rxcNiFBvzsIpeLdDdYNN1SGBPngRJ/I/2fl+7XvTxXPbmOfC7HPWF9dWt5vtZHhdP+WifLWVSK3R
+a3O50vxZdCe0Ov2m+B/nSZ0/vfxV5McHGnLmiOqdxdw6XqFkLWBETTnT92kP3a4s0xk/aJroFIpa
+X4atdMuvtNlv8uZNjo//ALLXHiMVKpDayNLlnULqOGe1tpn2ee/7v5N3/Aaww1Bz1FcdqFlHc2U9
+s/8AGnNRRrSpyuh3IpNJtZtOSydP3P8AcSiNaSnzdRHNR6VBp+vf2fPv8iZN6bE+8u/+Jq9mM+aH
+NIjkNrxBcTxad/cng+SPf/y0ioWI9s+VhyGLpmrXehX12+qI6TzbP9E/vf7VenicE4rX+vxInieY
+vNfPfpvuU2P8/wDu14kqXKzelIk0nQrm9mg2JJ877JJE/wDQq9bAYb28lfYzm4widJqulW9roZ8h
+E+1zPs+f+9H9/b/dr6TMsLSo0dN/mcNKb5jP8PyT2o+0wjZdJ8nz18ngq86UvdOytZxsdno9lI11
+9tn+ffB99/8Aar7HKKMuf2kjyqtWysYviKK0mvp3mtEfya8vNa9q2x04Weh5y+mXer6ls2fu9++C
+P/ZX+7XBHETcbGimrne6aNVe1nhKb57b5I5P93+9TpYeVV6g2kaUOl3X2GB7n53f/Wf7td1XKXy6
+f1+JjLEWNjT9Lg8t32I8EybHR0+9X0WV4XlRhWrXKt14S0OS+gd4PkRH+RPu/LXXXwMW7mMZ3OM8
+W2tq9xO6b38n9xBXx+Lk/bWid1OVi1oEkGn30cGoJs2QbNj/APPNvvV2ZfL2VW8gqO5t6v4T0650
+i6ubp/nTfPazp/D/ABV7U6CjBnPTqPmOG0HUJrKCT7Um+B9/lwfe8xq+PdRKoz0qtRcpj6xon23U
+ZEs4Pss6J8+z91/47XXRxM1pMy5jj9S0bVbYRpqEjpO/zxx/3lrvWIhKNgtcowQeZcfZZ5NkdSq3
+MYVCaLSnmn8iD53f/V7KHV5Qpl37K9q+yf5JP+fd65om9zo49S0ZEjvYYNl0nySWj/NAy1uo3Fc6
+y70HUdMMes6Yjw6f8kiP/d3V20MPZnJOqemeHdRTUNHgud+99mx/95a92grI4psfaaTaWryOn8b7
+9lY0sIqauWkUdSkkmk8n7mx/kryq9dqehsixpNkiR+d9z/pnXoYOmzBVC5PZRuj7PvvXRiMKpBzm
+VaR+d58P/LdP4H+7XnLDl3H/ANieTvmeT5/kf5/u1qsOFx9298bWDZBs+dEf+KuutT9oShrzWOku
+77/nf+/96uRU/ZmyRi+ItUS58vZJ9+uG95GsTG8ux2I88+xP+Wj/AP2NHJeRtEiggkmfZ5f7v+CP
++9WMZ3ViSvZf8fs6UVXeFgO5tjBZ6ckNlPvd/nffXVXxCcbHJU3MvTp47LW387f+++5WOCk72NJ7
+Enia0jd0S2+d3+fy6denGBcTn4/sKO6XPyT/APjtYc3MbRNzwf5ELyTXM6Ik3yRo/wDFXpYSWupw
+1Xc7UV7cVoZQdgxWc9BKNzLfWkhndLn5EhrgqYzlNlhrkMnijTt6eTIjp/t/LXLisxSnp/X4GkKF
+g0vULq6k+d/3f33owmLnOYVKNznPGWvTfbY7aH5Psz1y43MG9P6/I6MPhkjnbue6urT/AJend/k+
+TeytXlRoSq6ne2kLpsCX/wDoeuzPDBbQ7LF3+T5m/hr1Ytzg/af19xwwXKxdB0eCHX7G1eD7bY3r
+7/M+8v7pKMos52WxeMk2jq9U+G9jNI9zp8z211/An/LKu6eVpR0/r8TmpV7GZomg+JbaB7K9REtb
+Z97yP/Erfe8t6w/s68df6/E2nXudKnh7RYYLq5soPOeZNhTfW31On7N8hj7eTMvTYbWN0SexeGaF
+/wBx/wDZV5VH90/eK9oyzY2Ol23zzRun2Z99q6b/AOL+H/gNelhFCUedDncy/EN1fzai76f8jv8A
+x/d3fw1wTqOpPRm1FMfo8+uabaz3Opoj2X3/AN8+5t3+zXfCvKENSPZ8zOEvrh9WvZ5kg2STP+7g
+RPlryKtdPVnVblRHfWs9rstU+d/+eaf3qiEbk8wSaNd/66BH2J/rP96ipGw+Yuaf4Zjmk33V0kKP
+/wChU6UlzWM68jZ/4VwEsftVzOkOxP8Ae+avVnhUo3OFRMX7DA8ex/keF9n+zt/vVhBwjoaWOk1y
+60DT7WP7NO6apa7HSdPmi+5/6DXbGUIahynGal481HVoJIL1/wDvhNrVhiK7bLUbG14N1XVbB31Z
+7V5tLRPJneD+H/a2V3UZtRucVdXOlj+LPhwX2zyHSB/+XrZ/7LWv1nUxjR5TTvtE0bxH9l1bTHgd
+/O/fz/3lrKvgI10dEatjlPFvw62a/Hqlnvgtnj/fz7PN8tv9xa5qmXRcf6/zO1YgypPCXjuTQ/t8
+N2iGH545E+9ItcdTKk4/1/mP6wji0+Hni7V5Lu5+yu5WT9+/+1W9Gi7kTqI9d0H4c700bU7q62XW
+nwJ5ECQoqr/v17NKNkcEyTX/AIZ6BJ/bGoJHv1G6/fIX/wCWci/3a4sdhItaHfSqanlcHjHStOu/
+7L1e1SP+/OifLur43EZPUm7xdv69T1Kcje0b4c6PqGrR6vpscc0CJv8ALR/7z125asRUfv8A6HNi
+ahd+IWieG9Luo3urRLZNT+5Om/8Adsv/AMVXpZjScI7Cw+I5TT8aeK7Tw3ozzyfPdTfJaRp97d/e
+r6ubPl6bPCdc+JfifU9Nk0+9njmgd0f7ibvlrhnUsd9OncxbDVntZJH+fz5I/wB3Ij7dtYutY3VK
+59BeEtS0rxJ4Ojshd79kHkX38Mq120JXODEKxzA8A/2f4gj1C1vk0/REdHtJ53/e/wDAd1RiMNHm
+5kaUsVpyl7xD8UNNufMs9PjedPufa/utu/2K8zMcZJRsj0sFg9eY19Ku113TY4dR/dyQ/cnT71fO
+yzOi/dqvX5/ojulhLak+s6BBp/hK7GkI80/+u+1T/e/3q+qnh6UsPdPS3meO6tqljK0SSTUo41vY
+PnRN8H91q/N8wozprnWx70J2Ne3tE0IPqMc/k2Sf6+Of5dterl1aVKn7SO7M6sFI8y8Y/FTUvF12
++iaDJ9i0N/3F3fv/ABK1faLEOx4sMPdkdtLPBZwaQjo8enb4LGP7sEi/xzb68bG4xpnt4XCKxVk0
+q6XT5IXu4/PneRHSDfuVWT+KuGOIppqaNajc4ni+oadJY6jcWM3+stZJI5P+A19hCopUlI+ZqU3G
+Z7n8J5bzVba0vp7vyXsv9RJP+8X91/Dsr5fER9nWtHU9+FXmgeiax44Qx3eyCPT59jpPdz/Ksn9z
+5acM1db91LT+vQzp4Xm1PK49Zu7S0g+d3nTfN8/+q3N/erz/AGMZSuem/dOZvLO71LzI549nnv8A
+6yP7teth60IOyMnDnL2gTeGv+ETn0iewR/EG/wAieR/4VT7rx/7VaYqrOMvI46EFYs+EdR8QaT4g
+8jTJ0k2fJJ9q/wBUvm/9Na5cVh6dSN5lSi2eseMU8MXWhwR6hBPDqk77/PdPN875P+fiD93sr2a9
+CTp3R5dKtZnl91YQIPkjkeT7nmfei214KpziryPdpyuismmyT3G+GTy3+5/eVqiFWMY+8NHU2lr4
+pspvtKbERIfv/PXl1alGenW5qjU07wjqTafdXsUjnUZtnmO/y7lrKpjI1JJdjGcHFHfW+galLBA7
+lHR/uP8A8AqqPD9Sorxf9fecs8WluY/j34aabqGgTalezyQ31kjumz5vl/u19RleTyoU7v8Ar8Ty
+a+IftEjze18BWc1p58E8knyf3K8uvmPLUcV/X4Htqn7lybSfAUkd1BJNv2TbHtHj/wCWldlbnglc
+54z0Njx14Yj/AOEktJ/IkhgvUSaeDf5TRsnybv8AfrpxzVOKmxRnqcfrsGpPq3mXUn7vYiRz/wCy
+tcMGpLXc7Is7Hw/ZJrloHmR4dQtv9Tep93av8FfOYuq6EtNYvoaJnW6M0+mu8N5HsR/nS5T7u6vL
+xMObVb9i2dBIPkrzFuZM8v8AFNjPNdT6gn8H34E/8dr6jBVFyqJpzFzwrpEd/p39oQvvuv4IP4f+
+BVnjqvJNQ6A2aX9hXcFo7z/voJ3/ANEj/wCWsO3+ON/79U8T7iT6kJ3Zr+DBe6lL9mvL7y7qHfxs
+2ysv3V+9Xp5VgY/WPddjlx7sje1jQI7bTnvZLp5poX8zZ8m1tv8Au16FfBwtzz3RjTqNs5WfQb7U
+9H2b0Sa9ne6uv7vy/dWvmZV+WXM9jugcxfaddaTaSXVl88Dz+XsranJVXZjG+H9c1W81mCGbY6Oj
+wfc2/wAHyV21KFOkrgd3f30Hn2llsffDAiJvTbu/32rPO42kuU5cNscF4t8OX1z4jRz/AMttn3Pu
+s1LC4r2cPe3NI7nVTaDNeaPHYO+97B9kE/8A0yryfr1ndjqENumq6VqiWSb305NiQb0/hrWtVjVp
+3HTOve/nksp0eB9+/YmyvWpTVXDXaM7jtUaxht4HfY90nzxwOnzf8Armp5fB0r/1+YrsiBknv5Ld
+P4E/eR/7VeVRwblU9mx3Ld3pjxpslOzzk/gq8XlzoP8Ar/MSnco6pb3CWL+Sk73X+ogeBNzVrhMr
+qTd29Pl/mR7Y81v7bX7y++y/v/kfyPLkf7rV69WnTpq3UftTodcn1W6sUtdQjgur61RIIJ0/1v8A
+wKqxGYKen9fkRRomh4V0mR7D/St7/P8Au4/vfe+81cdOh7TVm03ynollHY2ti8Ft88kKfu/71fVY
+b2dOlZbnm1XLmOZe1ne6kzvf5/8AV/8AXWvnqlOdWTu9DthNQjc3b3REt9KR40/fp889e7j8ntR5
+4f1+Jw0MQ5s0vDrSSWP7z7ifcr0skTdH3jLEwuyn4nntUt3SeHYjp/x9JSzVQclceGnoMg0bRnu4
+J4XTz4U8n/2auWWCpNr/AIJanqaUmn7J/Os/v/x13VcCovQyliLmiiJ5ezZ/wCu2mlFamLdwSBE+
+RE2VajyPQmSKOrvdeQn2Z9ju/wB+uTG1WkdFGmZsdjG93ObmDekLp5Gz73zVwYPApVbyNpuxzfiP
+TdR1PxhH5KYjj2bCn8SrU43De1q2iFNmR4n1vX7Od7ZkeS0+RPJf/lnXny9soa/ob+zTZH4d1Sx+
+3aakyI8MO9J0/iXd/HXHgIQlPUeJpux1t9pXhmfUUSF4/PuU+T/ar0swwUKvwmcJHIeKYNO1C0ur
+a6g2ajbP5Nv/AMB/u14Sc8O7P+vzO6nG5zKeFdU1Z/Js7Hc8Kec8ifK22vVy+HMcNQpy+G77T9Ze
+2mkRHh+eT56WYU+UdMr6zJd3U8fnz744PkgrOnqwuXbDyLLRnmhj+1X0yPBIk6boo1b/AJabv71e
+pThoFzX0LxVqtlpz6fP++spk2PaT/N/3xTVexj7M6XTfEsenwRw6TA8L798/nv5v8FaLG2K9hc7Q
++ILWa0S9Sff5P34E+X5v9quqtiGoHGjOt9c077V8+/ZN/wCO159BqbuzdHTedH5cCJJ9/wDj/ir2
+41OUw9mEk/7/AGeZ/v1z1cSw5B8drY796fff+OuxInmLOxK1SC5DdybPn/54/PWNWfIWjLRH1DUd
+83+oRPkjrlUvaGyM7VPDsEMjzoieT9/56wnRszWLOctIETe/l/O9cU52kbI6LS7W1mEHnfImz/dr
+PD07ysQzDutHjTxTBZwv87/6x3rpVG87Bc6q2tHS18+62J9m/ufxVEMJ7nMctRajbHTo9n293+0/
+7FdWFpKMeY0m9DOvtDvr2d7l08lH/wCWdck8JKSLic/q+jP/AGi9tbP539ys6dLkZtEzbSKO2u/J
+uZNkP35NnzfNV89thQoXOv8AD3jJ0dLW5TfD/wAs5E+Zq78Pi7bmNWhY6DVXuwkdzZb3h/5bx/7N
+bYtTktDBKxTfQZ5oZEeR0hufnkSvPhgZy3No1rHNW2m/adSS2RNkf/fVcVPC81Q66jsWde07VX1G
+OGP5IP4Nny/dSirCpTnp+gU3cp3sd3bWOybZNPN8kH95a4JzuFOLYzwt4lSyvXS8T5HT76b2+Zf9
+mvTwddRFVoyZbur611aZ/wC00Szsvv8AybPN/wBmlh8Sq6uzKcXFnOLpU8OsWj6RPPM+/wA+CRP4
+l+apVFuX7v8Ar7zapJOJ61pzztYwPNv37Pn3/er6ag2o6nkSVhbp0eB4d/zunyVniZ3jobUlcxJ9
+MuktLpLJ3893/d7PlWvJlg6kI2ibOvFlnS9Od4POund7pE2SVpSwXNH3yedMyDYXSJdWs3zz3O/5
+P/Qa4eedP92+p0TxCMPUEmSCxtr2R7Wd96Tzuny7lqHl6jq3/X3m9GuiUeHZ7yxDWcnnJC/z76WG
+oVais/0M/acqNa/0ex0PR9/3H+4kaJ95mrqxeV8sP6/zOf292cKIN87+T8+z53krkpqx08xfk1LV
+X+yWvkeTPs37/wC9/vUVFcXMaKaNd6n5cN1A9tP9xJP+WUn+1Sw+CbdzKpIreI9Ku4bqOG1n/wBS
+myd0d/ml/wCBVvjqzSsOkrmRYeI7S21We11DfsdP4E8396v97bRQw/NqXymPfjTU1yd0k32rpvj2
+f7VTiIX0DlDSNOsLq+8mZ9iP8k/8Uv8AwGnCspIuurHfeXa6T4L1G18Pz/aZvn8/f+7kjj2fNXtR
+mlTOJRuzzjw54ZvvEOopZJJ5PyO8bv8Ad2rXJGnzGcpXPRPh74f8QaFrc9lepstZk379/wArba78
+PGUTncbnozpvj2f366eVWKIUtYEtPsyJ+52bPLp+yXKAWNlBZQJDDWMaRSmWK6YxKIL21+02skO9
+4d//AC0T71c2IhfYdOZ87fErwJdWD3ep/ZJrq1nm2Sb/AOGvJlConp+h6lKocf4M8beJ/DOrJb6Z
+v/6aWE9Dag/dOWE+c9G8Y+KJ/E1p9i1OBLL7LH9t8tPmk/76rkx2Jq22/I7aeHO11y80rT7GS61T
+yPI+5+/2fN/sV9fUXLufMwpXPDPipd+G9Rt7Gx8MWKWuz9+88abWb/YrzqmNpxep2wwVzlfC/wAN
+PFGr3cnkny4E3vI8m/8Ah+b7tcMcXc75Ugk12/so3gtY/wCzpH8uCeSB3V2X/arVVrmLolh/EV/f
+RwJeyPOkG/77v81Zzq3N0VftcafvPMrhqUeY3R3XhTxRdvaJZQxzvfI/7j+7Ju/vV5GJyqMqqcf6
+/E7HJxjqeia742tfDljBHq+pQTX0/wB/TURGZf8AtmlfUS56VJJHjtU5y1OekuvGfju/tI7LzPDG
+h2X7+S7fYs8u7+7HV050q65f8zltKLPLfiVpt/p+qz6PNqV3ql8Z9lu7v8rL/frNUFRlZbHXzuSH
+wab9htLODy9knl/vK8mvV5j14mhZ+f8AaoNknzo/7uvPqa3RqjrLm60h9W3zPNbXP8E0P3Vrx4Qq
+KnZJNeZnH4zxn4jWEdr4rn2eZsuo0n+f/ar7fKKzdBeR5OO/inpn7PWqzxWWpWL7HgkkR49/342r
+y+IsZKlS5V1OvB0VJHofibwpo+rRoJLr7Ldzf6iSZ/3Xy14eQpNO+5vOTg9DzTSrW/1fVv7LhjRH
+g3p8/wAq/uq9h0YqR0yrtGHq15Il35DyfvLL93H5fzL8v+7Xe8PzIydZsx0jj/4SeORJIzHqOxI5
+3/5Zyt8tbPSjyI5JytUuejadrA0/xYkM8ifZbV0tZNiJt/u768X6pBr3jpk7u56/K+j2UkctrOiQ
+P9yNHRVrHMJeyr+2p/1pbqc0YylHU4WHRzaReIIbW+gupLqF72SD/W+d8/8As/6uSvcy+uq8eaXx
+HDipShHQh0DwzHq7wXVlP5M7/wCs3p8yz7/nXZXB7FV21Pc9SribLQ6jVNLuNPtY5LqB5obn5I0T
++Fq8jE5HUpe8v6/EwoY1N6kMmrSaTcQWc+8b0+QfxV59DBTdRKStqdk8QpK53GhLdW1q8s2/y5n/
+AHaOnzR1+kZdhPq0E0fPYvEe0dibUL3/AEr7HPGn2Wb5JN/8S/xVhisynCql0/ryNKGHXLcltdA0
+iG4gubWBE8lNkCJ92vW9nGUVJbnG3JysZOo6PqWmXb6hoUCXsbz77rTpv+We7/WSWrfw/wC7TkQh
+2sT2mp6HPqD6cmoIkD7HR081f+/lYyN0eVeGPJn+1yatBO8aJ5kbun8LV8BmOFlCd0fS0qqkg0m6
+ntru1/sxHfSnn/v/ACxxb/m8ysMRCMoe+wpxdz0oxwvDsT50evladNyqKK3InHkRW1/w3rc3hueb
+T98F2iP8m/7y/wC7X6NgeH6bpJy/X/M5JYlHmo8TTpBBavAkbp/rHn/1W3+9XkPL71OY9CLvE6/w
+g3hyz8Np5EkH2155p7qSP/2at85SnS5UckY+8dJZ3Ok3/huC5md3gSZ3TYnzV3UsOngo05bf8Ewj
+FRqOxXv7bVUnebTJ0eaFN6R7P9ZFL/BWGKnUppU6extSknuZFr4y+2v9lePYjvs8x3/1dcaws4Q5
+ZbnVOlGWpS1i91TTrdPs3/LynyO/3du/+GuVZfyx97+vxHTlF6E0E915aTXT/vPLRH3psWuPHKU5
+WtsaU48sdDR0bwLp02k/ap7r7Gjz+fBJBsr6fL6VOVJTqbr1/Q8upipxkavjc+ILmBLXSIE2TfIk
+77G87am7/gFenjabkrROehPlPObHVPECOkL2Hnb3RIJNn8W+vnKuTveO/wDXmdzrJnYbr6yeD7ba
+PD9q37Nj+b83+1Xi4jK504Xl+n+ZtSlc1o9R0m3xBqDul1vTaiZ2sv8AtV6mWPDUoe98X/bxNWLb
+H6/GL10tbLZDI6fu53+Xcy/MlelWlSxL5F+v/AOKMOVFbXLW4l8F2WxHm1BJv7+5/wDb+da9irQl
+7FU0KFflZwtg8E2pXf2rUvssexP3e/8AeszV48cLyr3jup1DrtB1XWPIT7TPHNAm/Z/F92vMr4p0
+noKpTUjr7G/+23V9DC7pvghSOf8AhVvm/wDHq+4wFaNSN+h41RtMzrrTfD9rJ9mtt6ajC/z3U29t
+zN/z0da8jH0cNUlZ7/8Abx0U6jSMTWPDGspfQXVzIm//AJ5p81eTictdD3U/6+87KdbmNWC5nso5
+EuU+xvs/d/3f++6zoU54b3iakOcS31WOB7Wa9Se1+1P8jv8Adbd/tV04fC8lZORzRl7p18enR/a5
+LmH7/wAibP4flr7OnQi1c4FL3hs+vadA/wBlm3+f/GmyscVi4UEa0qDOb1bWNc8h00O1SG1tk85/
+722vLnmLqrT+vwNp0TnL3x/dX+zyLVEuof43fcrf8BrkxGOcpcyN6dHkNXS7+/8A9fqEHkTvsd/9
+rdXnqnVc+f8AyHUrWPQ4/uV93TldHmklVT3GJQZA6UAc5p1xdWWpXVrcpvd3/dun91q8eE/ZS5Do
+ubqR2sL7E2I7/wAFejCpCDFynJeOLTUZ3+SPfZPG6f8AbT++1eLmic9loaRRwej+FbuC+keZ3geB
+PO+T+KvBq1qjjyW0N0jtdL2PeWsl1Gnz/wCo3/L96ujL6clWvIvEalPX9W8P2Oo/6Na754d6SP8A
+d+aujOKsFK4YfQp6f47jtp0eHTv999/zMtXl0/YsMTqbvjTToNQ0CfUngRP3G/59m6u7M6DqR5zC
+i7M8rh02C6geCaR/MgT/AESvFrVdTo5C7aX11a+HJ9J3/Jcz73TZ/DXVHE+6HILd6UkPkTJ86Oie
+Z8m3a1KdVFslvoJ7KRLWbZ56fOkif3WrSlJmLLVrcec8n7/ZJ/c/vVukU2dNo+nT3qI6fP8A39n8
+NaqncwkztLHSwkce/wC+ibNlepDCp7nJ7QsyWMe/en/fFE8Ant/X4hzkN9JIk6eSn3PnfZU1bpl8
+9xZNU/d/IlZ1cS0h8lx9pP8AafP/AL9XSqc0ACxtAiI/8dKlh4gZvib54HT+CssY+aRakZFjpzzT
+o6Qfu/7lcCXvG6kLdbPP2Pv2J8m+uepDn1NKbsYNxBJZ6ql6+90d/v0U9dAqSudYkc81jvh+5N8j
+p97crVcKLSIIdKm+wb7J/kSYukf+zXVhazgwauchfX199qk86d3dH2VxKUqhs2dZpzpeWqXqJsuv
+8/NVqlymMmYWsadIl1/03f5/++qzk5dSxmh6c/8AaKb3SHZ88e+taTj1A9Gkjfek0P8AwNP4WWvo
+Ero4JEdjBP5l080m9Hf5P92qoQ1MmPg0+0tvPe2j2PN/rKcae5brXK1pauiSJMifPXNh8Na4uYyf
+EPhue9eB4P8AljXNiMtTndf1+J108W2irqPhmGHTrWGGRLK6T55H/wCem7761njqCjDUinUbZz2t
+2M39sQPcwPNAn9z+6v8AsL92uCnRTdztU7GlcX2nW0dpf6V+5tXnTz7V0+Zf9uOvUpVIo4a+p3cE
+/nx70+dH+dH/ALy168o6aHNzXOX17/Q77/SZH2TfOk+z5Y9tfOY6nrqenho3RqaR4k0688i2377p
+0+evVw+MVZnFVw3Kad0/kwPN/cTfW+LsomMYnO3ct9Nd2t7BvmdP4ET5a8Smqk6nMddWFjYm0u11
+O1g+2p86fPsr13T9r8RlCrYSx00afB5MHzwffT+9WlHkhoZygZniXRo7yD7ZNI7pD/q40+7XDjqP
+VHRRaRyCx6Vp+qwXST+ds+/A/wDerzvrCjsddSlcNb1+N32JBsdP9W6b23Vx1a/tNGFOlYl0vVNS
+m026gefeiQO9rXZl9VqFmYU4WOctFnvLV/3e9/8Ano//ALLXl1a6jM7oaFC28OeJ7bVfOg/cvC+/
+z4fmavSjWnP+H/X3mNSxfbRNQ0WSDU7q18+1uX2SPdJ8vz0ThP7f9fcFKpE6Oy8P+Cbw5Ams7140
+f7V9xf8AgNdqpxmZxTiP/wCEMvrbX0SaOS/0u9TZJOjv93/brpoYRRMqtc6jwr4OsdC37P3z7/3c
+7/eVf7tdSicJ0NbxAKQBQAtBoFAABSjqEaditqNra3Nq8Nym+F0+dKyq0bmynY8M8S3Wj3N3HPe2
+n2Z7W62SXbp/yyb5K+FVCpCTuevRZyd5JpP9q+Wk7okH+vnd9m6L+7trscp+zsjebOe8SfFPXddg
++y6hHA9p/wAs4Nm3a396voalWpLc8KFOxz1h4iu7GCeBI9+/+/8Aw15tTDKT1O2E7Elr4t1a1jkS
+1u3/AH/+s+d62WGaKcjOv9QnupPPnk3yPWyjYxchkDyfc+//AM844/mrPlBEnl3Hmfv45IJP+eb/
+ACtTvY3RraVqNyl9Al1qd1Zab5n7/wCw/wCtqqfKnczrUqjjr+h0mta/aadcSWXh6OCGxk/1epJ+
+9urn/ppJM/z10VcQ5KyObCYZc2pz+qXeov8Av7q/d/3fmff+T/drzKUIxfLHc9LEKNjObRr6y+ya
+rrHnwXd1H58G/wDut9zZXo4hSUbHNhpq5q/2lPOf9Nnkup/uRyP/AHa8WcdLnoROgtNGn+yPN5ex
+ETfvf7u2vNlV1NUP1WS+tpbSFJ0vYETemz+H/ZrSjGMoSJh8ZyPxmjnfWNNme1S2ge1SNET/AKZf
+e3V7GRVU6Ml2Z42O/ilb4RT6nH4j2aennvMmySOts+wyqwt1NMtbpx1PefE+gXsOjw3dzPv1Xfsj
+/vKzf7NeHSyt4eHOv6/E644lSlYxNA8H6xMl8/mfZfvpPIn+tbclLCP2stC8VXSMbX/hHrFnaWM8
+CO8kyf6X/wBM69urCVOOhlQrplLxV8N7PSNM/wBNvoH3wTvaJ/qmjnih8xdzVeFqwlLU58XKyuP+
+HPhszy2n9rzon2208+CR/wDf2152IiqtXlR00pXp3Ow1nStKut+mPdQzz2sLps3/AC/9914deE8L
+VSesb/13OyFWNSOhleEdNvo43hT9y6J+4nT5v9r/AIFWuJxd6i9n1/rqVKjFR1K95rt94Y8V3aQ3
+z3u/Y92+/wCZZZU+eT5K92vR/e3PMwusdT06y8WWKaPa2uu7H1GZN8Ef97d9xt9eg8fGjT/ef19y
+OKWEdSWgS6faa1qtjevvheyfZ5/3tyr/AAvXPhalPFS5o/1+QYio4aHY4eZ4C6bP9j/dr6TmtGzP
+OcLamdqOvaFHqP8AZN787unz/wAXl/71efjcZQpO09/mdNHDVWr/AORqaclqlqiWX+o/grqpSThz
+R2MZOTdixvTzNm/5/v8Al/xVTIRjawkeku+rJ/x6v8mo2v8ADJ/01X/brGRujlvGCaVqGr6ba2si
+TQJDvkRPu/N92vlOKcZFL3D1sui7FUaHYwTvNB8kPz/6N/yz3f3q+DlipSVnv3PRVVRZ0Xg+Cxmj
+SR3RNn3LWvsuHsBCU+aW/wDXmedjq1kaHiex8R6jBBBpGpf2f9/7XJs3Ntr7fE0OZcsTxYy5mfP2
+uXccGszwPP8AbfJ3p57ptZq+cnRaZ9JRl7pctNU+ywPbTwf650fzH3rLtrzcXhHuaUo3Z37eO7GP
+RrGy09ERPI/fz7P3sctbYzEqWFjTh8X/AATlw2FcZu5e8GeJbi2nnj1NJ3n+/BvT+Fq7MuqqNoT+
+I5sVRbbsYqaHKl/PqFrve+/4+rqNP9V8z15Ep1K1Tn6I7FeOh30MWh6z/wAS+6T9/B8+x/l+avew
+eOoYh+ze69ThrqVPU47X9Ln/ALfjtrJHjjd9hT73zNXj47D89S0Op6eGre7qOtbfX4br7LdeXC0K
+IkCP/FXBi8BOC9lJ7lKcGz0zR0kfTYEnT94iV97goLksz56pPlJbPTLK2TZCmxPv7KqjQUZXZNOs
+2cVq1rIms3P795hv+/8A3a/Pc7puNffQ9nDyOHu3nkneN5/PeH5PM/vVwOyfdHe4nX6Vf/a9M+T5
+J0TZ5n3trf36jD4n6vWT/r9TmqwOf0/4oalo2o6jDe2KXO+d96J8q7l/uLX3VHM5Nc1v6+446uH0
+NLRLPwP4mgnutTg8nUZp98/34vlb/V+XXTh6kKm5hUquJ0Nv8N7PSYPO0+eeZ0+dI3f/ANBrPGZX
+TlrH9f8AMIYwxfC2o/bLq7h+5NdTvsgf/Z+WvBnTnTlyw2OurytXN+9TSdI+yzXW9J7p389Pvbtv
+95a7Z4alSjzz3+Zy06qbsXdUj0q5shqaTcIibIf4Wr0Mbh6VVc6f5k0PddjzTxXf317Ph3dLVH+S
+BPmVf9yvBdSVV8i6Hdz8uptaFcy6paJZapsmnfZ99/vVhy1akk3+hmqPunoWnXMGnaciTfJ9/wCS
+vsI4yOHopyPPVLU5vxTrEdzdeXC6PDD+8SR38vbtrwc2qKrKyOuiyvJPA+myXVlfbE2fPIj/AHW/
+55turzeSdNaG82c7p8Fxf3cD2u/5Pkk2J/DXNSU00mViJWPQvnttKS2utk06J8j/AMW2vpqmJUKS
+RwctzR8P/aksdkyOn/PPf/dr2cDK6OVGtXctxiUjIKAMjWLF53eTe6bE+R0/vVwY6lb3jeGpzjR3
+aQv+8fzkT7//AACvmJc7nc7YQLNpqOpQ2v2CeN/9QjpO9dtXFVlHla/IhRJrW+k+yxwvB9zZ++f7
+1clXFzhC1tTZRKGtibUIN9xG6JD/AMev92SlWnJ6kJXONfSbq6uv377N/wDrJ3rWnTjJXkVsa+le
+GMpHv++9crTnKyFLU249Kvrq0n0abekHyPH8le1Sp1Jx5DB6GPd+B7rT7F/OkTz3fZB9/wD9lp4j
+L1f+v8x+1KEHh3WLq0jeHTfkh/5b/wAUlZvBaB7UkuNNvp7GD9xs3z7Ek/2q4pYZo6mXr6103WdO
+gmf9zdWTpBdOn/PNq6KTSMGZWq+FrrSbpEf54H+dH/vV004mbkdx4dkuk8OImn2uy6d9m/8Ah/3q
+9GnTMWyW01u6tdRSHVvk2Js8+nCo18Rl7M23vf3fnJ++g/2KJ4prYOQzf7Qu7md3tvk/2P8AZrjl
+WlJl+zsXZNOnmtI08zZXTLCuSHz2I7EPa2s8Oz+P79ZqPLEQ/wC4m/8AgrNRk0MoXpknTZsovzMi
+MiTZPDJs/wBj95WKXvGykRQpBB/rvnhf79YU9NDSpKxDqGnWLwQJ87wP/GlFSHJqFN3IdLa90eb7
+N/x86e/+rP8Adrsp104ltXC61ES6j5oj3+X871wTrpSGtCG1tdOudUe/uYE8l0+eH/aroo4iKFJ6
+FsyQXt1/oafudmxP4d1TXlz7GMpFG+sbqeffMmyb+NK4JuXU6ijqNrPDHveR/wDpm9a0nHqBveEt
+V3x/2e7/AD/fR99ezhK10cDOgtU8mR4fvp99Hrupz1MmTM6J87/Ila89omUImHr2tXVlJa/ZkR0d
+9km//arza+L5JHdCkULrXtXS9f7NGkkH8ab/ALtee8wk5e7/AF+BtCnFRJ9Qhur+RJnf7N5Kfc+9
+urXE3qR94mnUSZe0/S7GCB5ofk85Nj/xLXoYajFwuRUmYOqWOm6okFtbTp58PyPH/DXj1aiU7BT1
+L/ha9urWB7bUNiJC7pHJ93b/ALFengcV0ZEqXKaOvWr6lp0kVnP+8+/8n8VaY6l7RaGlKrysw9E8
+J6xpt99tSSB3+46PWGGwDov+v8x1q3OdHrG97F4U/wCW3yb66cZFyRjFFLRIf7Pt/nd/JmdEj/ir
+nyulOEPeCrVubEz7IHf7nyV6dSyVzGEbnGy6Jd7IJrWe6f8AvwP8q14tTDTh7x1TqKRPqeqObHYk
+/k3qfJHJ/ernWYX91/1+BrRocxycdtPa3cl7PIj/ACf6t02tXjSl7Pc7Kc7nPXF/fT3b+XB9qRPn
+kjf5W8r/AHqUVz6odSditA7wWkl7az+Q+/fH8/zf8BohVlDQOSxHpes6r9q+yw/8vXz/AD/L97+J
+aurRU9RM6Xw74z1XTL54HtUupP8Al6k/5a7Vr2cBiI09jCvh2jW8a+JbHVtKg0/yJ0tb3ZNBdpXb
+icXCe5wKnIyPDtnfeHNYgg1a12QTfJaTzJ58Tf8AxFdNKnGLKrVz2GPmuyU4pGEVzC1o4iErGQBT
+AKAFoNAoAAaUdAjUuYniPxTo+gWvnahP/uQJ96sqtaxsqdzy/wAb+ONA8TaFfQWtlJJ5Kb3f+Jv+
++a+Zx2I9q1ynfQ0PJb+xg1GO7ex1LYif6uCf/W/7u9adOXs2kzpkzE0XwdqWrvIkOxJETf5cj/w1
+3fWdNDD6uM8S+FbvRL/7LdSI8nyfvE/26zo1ryD6uQaDe/2XfQain/H3aujxxum6Jl/i31vRq2kY
+ypaG38S7nRb3xDPdad5EheBJ7uS1/wBVuZP/AEOurE1bpHLQo+8crpF/PY3cd7B9+CTfHWNaj7SL
+gtj0KbUWel6vqPhvxX4ejunntbLXoE8wb/laRV/5Z14GX4SpQrOP2CsY1JC6l4H8L6X4NSae6S68
+RzPvg+yvuVV/uyV9RQoJ0jzKmJvI4660KeysUvXkgeO6fZHaQOjT/wDfusXQaiOlVTkZmnWEGpeK
+bDTtUn+xaa7+Zdxp821adOCpblT/AHh6H8RPFug6vafZUsZEtdI/c6bdpP8Ae+7t3U6leMzWjhLH
+HR6fcT2H9o/8s/uRx/xV5E6jg+U740bHU+AjNqFvPbefs2Jv8jZ/rP8Ae/3K8nMoqmuY6Iux6bon
+gHwrqNrb6lvd4NmyeDf/AMt1/vV9DgcFDlbPCr4qUpJHjnxqkS5s9NktbTZa2Ujwef8A7b1x5FRd
+KtLzOrHzaimc78Nb+30+6kukk2X0EieRH/er0cyjdXJwc7nvmkeMdN1SaC6exT+0of43+7I396vA
+xWZOlDb+vuPSqYLnR2vn6beiB/ufxz/J/wAtP96umWKoVbSf6nHKnKMbGrA8FxDn78f+3X1GFxFO
+tT5f8zxHTdOVzmfHPgHT9esbtJo/3Jj3oifL+8WvLqZZTjUdZfF8/Tud31vmPIPDmmpZaxf6fNff
+8SrS/nt4J3+fypU3V4maxk480V7x7GAn1Ok0rxV4PSSRAmz/AG9lfO1cFiJWuy49jW0fT7G/gjub
+LUnhd32Wtqif6yWJK+mw1GjLlpyf5nLWrypnnXi+0u9P8T30FzJvnkfzJ5N/8TfNXfjoubsbYeN4
+kcmuat/ZMiTx/bbRPub/AL1t/wBcv9n/AGKwjVuuQz9j7x3/AMNtcMPkXs19ssZ/knkf/Vbl/vVz
+YWtKjiLLYyxdNtHqVrsuUkmtZ9k/yfuE/hVvu19gpc0ro8STlFnIJ4dujquo3L70jT50/i87/gdf
+LZnhZVqnKz6ChiEo2OwsHsU06C1hvoEf7/7l/wCJq9SChCmoM8rE3crlbRNBu7OR7y5unudRm+SP
+fW2HwslJy6mWIr87sPsXup75P7RnR3Tf8if6qNlrloZpaq4VHp/XZGnsLo4qSyfRNZnm1O0e2sZn
+f+zZE/1St/zyavHzXLpYh6f1+J3UsYjo3jsUOy7KFPISbY/y+Yrfdrw8LlaoTvUf9feVOpznlt6N
+bg1jfZRzpPv/AHDwb/K/3VkrtwtaChodfs4l+78VeNNPsZ4IfLScQf6VOm/zfm/9nrbDYuUZaMXs
+onnlxHO8n7yN/M/1nz1105pq7HKmj0m4gsfEPg211B7H7FqkMyWT3Xz/AOr2fJu/v16d/bQsjjmk
+mVfCWnWkPiBIdT/eWTv5E86f6rd/DXFHDqpK7HXrpno2qPo1tdR6NN/o07vCn2p/+W0e/f8Afr1e
+SnCNn+pyxVxkE2v6Tq09s8fnQXL73k/h8uvEqxlhpuK+H+vU62lNiwxx6tPJBbT+T9/yLr7u2Va8
+fB0oVqzTHiE4Iu6V4ZnSf7Vc/vrpHTz4X/iZfuyLXv0Mnm6iqf1+ZzSxWg/xTYz2s91q3mf6Ls+e
+P/aWujNcunNqd/6+8mjV1MvSPHt7ZQIl7afuJv8Aj12On3a5svx8qPuvY6sThV0Ox0691K5SSbyE
+2f8ALDY/zbf9uvpIYjm1R5Lg4s43XI57ae6hl+eed/8AWV8FmOFnGr7p7VHlsc7d+H73T7hLN0d3
+m+dP9rdXBjcNOn7zNKLjcm0Cf7Lfuj/JHNvT/a3LXNiIWdzW5l614Sjn1X7V5nkQTf6+T/arsy/G
+20C4unaPrmjSJqEE7pA7onyf7/y+Yle9gMRKT0OPEz5j2GxfVL1HhvY/sez5HRP+Wn+61fWUU7an
+lslh8P6VbTpNa2qJOn+xRClBPQznqzjPFfn3niLYiO++DZBs/wBn71fO5nhnKeh6mCnyozYvDWpa
+hFvTek8L7Hj/ALv9x/8AgVc8cFUVO63LrV7mpbeCPtNjy+y73/x/3v4qrB5XOS5nv/XmYwr2GWtp
+aw/8s/Jnhfel2ifLXDSw84y5maVJ3L8Eb6mJP3/nec77H3/dqZUfbT3Jhocfq3hnUbW+2XMn+v37
+JHejFYT2bL9sW/8AhEbuztHmdPOkT7+z5o2rKWElURPPch0fx9aaY8jw2KPO/wDrP4a6sHagFSFx
+ieJrufWXvZv9W7p5aJ93a33qic/aTuZVI6HoWieIo550sk+eP+D/AHa9vLsy97l/r8jmrUTpelfQ
+yXM7nInyi1YwoAKJagVZ9NgmdH+46VyTw9wJ/Ij+T5PufcrslBMCCewgm3u6fO6bN9ck8ImFhP7K
+tHtEtXTeif36VPCJQsb3KWs6N5mlfZbNE370euXE4FSp2Fco6Jp1090m+PyUtvv7/wCKuXA4JwZv
+OZ0xr3LWRxT1GTwQTJsmTfUWNChaad/ZOnPDZ75tm94Ef/aosBxetz6jawTvco8M0z/5avk61JqR
+20WculxPB5iJJ8j/AH6qEtTomz0jRPsniDSkn1CBHeF9kdfQ0afPqeYzoLWxtbODybZNif3K63G+
+hlI5nxHBBqE/nWv+vT5HrysVX52bDLGTUdJsfOdPOtZv/HaqCsgK8M8jz+ckmz/crikrG0jZtbu6
+SDY779/3N9bUqtjFmnHBIkH/AAD7ldypNAUkk+TyXrlrVZICziDfG/8Acq4SsHsxklz8/wDq/v0T
+lcPZkXlxuj/JWCoou5DBpzv86Sf8ArVUkFxjwbN7v/uVxVVZmiZzs6Ok7/7dRUV0bpjHjdP+B0yD
+RsfPhjS8dPkT5PLoA34Zk1CH/UbHf599egpe2epySiUdftd8fk/wQp/49XnZjQcFob0nY5/Ry8Oq
+wTfwI/7ytMJJXFPY9DNfQ00mjjmY/iHTr7UIY4bZ9kH/AC3rlxlHmd2a0qjuRHR/Ojgtnff5P3P+
+A1xvDc+xtOoyK9e0t0eyT5J/7/8AeZa56tVUnZlRj7Q5/VdevryCC2so/Jn/AOXpE/vVx4iu2vdN
+40eUhvtR1VNAgs03pdvP9xP7rf7VT9c5qfKxuGtzGsNP1/SNRg1CaB0CP/HRSpzovnRGKraWOtvd
+D1W98+fz/kmT9/8AJ/6BRVwE5r2gqc0jKsdfm0mfyf7O+0yJ9/Z96ll/NCXMx1FGR2+jalPqFp50
+1o9r/c319NhXJr3jgc7mia3VLUwkrDquaudBDdwb4H2ffrKcLiKeo3z2unec+yGZ0/j/AL1ceYVv
+ZU9zaCuzzm1OuQ3UeoP88EL/AOr/AL1fKYat7OTqRWp6FV3iZ/i3VNW1DVHmtdltH8nX5X+WqxVa
+U3dhSVolZtXsb2CB7n/QrqD5HdPuzVDxfNGyJp7lG48ia+gjtdkCf7afuvm/vLXO/dVkdFrGbr/2
+SH/RfsnkXaPvkkT/ANBrpwS1BK5b8I+Iby21SB3jS5/5Yfvq9OlW9kjjlUZ3+laDJq91defP9msn
+/fQWqP5qrurpoKFZ6mDqM7TStKjtbSOF/n/vp95f+A17NCjZHMaFWtGAlUZhQAUAFAC0GgUAUtT1
+W10y186d/wDrmn8Ujf3aynNUYipXZ4h8Sdf/ALTnjgm017J3fe87vuZtvy/7leLOqpyPVo03Ys+E
+fCXinS7KDxBp8EF1BOm+SNH/AH/lUTwE4y5r/wBfeCrRK3jXwxAljJe6Tprwpv3yJs+Zlb/WfPXm
+RU51tjohKDPEtX1y++3v53yP/wA80+6td+Hoqa0MliDP/tyR/wDXx+Z/00rohheVh9YLSXkeo3ck
+D/J8n+sf+9/drKVOzuOU9Cpp32RP9R+4n/8AHa6ZxvE5aE/ePQvDXgS28VGOfSI/sskPyX0b/wCq
+3f31rlpUat+S+vyNcZioQkdr4f8Ahq+n3Uc7yQTalDGnn2r/AN2ufMMHXWi3+RdPFQlE9SsrSBLV
+E8hE+T+5X0uBpNUtTw6msjmvFt14EtZJE12CPznRJvufNIq/wbqK+IUIk04PmPBvHGpeHta8WR3W
+haT/AGfClp+8P97b/H8tcVecZHoYZ2Zh/aJ7qSOx8z/QE/1n93ctcKSieqquh0EFpBdbIIPLSd/k
+8x32rXmxk29Tpqysj1fwd4Oe10nyL2D+yb7fvS++Rlm/8er1FgVVWp5NXE2ZW8WeFZtJlSGyu3ms
+dTffJ5j/ACrKv8Xy08dTeFo3X9fmLCuNSoc14r8Keb4Pv7Tz0eSf95An/TWL5vlr5zLcwk8Vb+vy
+PQx1NSpnh2j3H2DU7e7ePzI4JPM8uvs5w5onhUp8h9R2/gYTyabrXhuTzrHUESeTf91d1eXi8kVW
+P9f5np08ysv6/wAjo7XRLnTrdzM++N538v56+dzfh/2c1b+vxNqOYRqxv/X5HS6fZxwwYH8fzvX2
+uU4ONOijwcViFOVi4zIiPv8AuV3Tl7t+hFOlZng3xA8KzzSXetQRvDdQukd3Bs+X7Kz/APstfK1K
+0pV+W2h7lOfIjFt/CM9jPfJ5jv5MG9JNm35v7tediMXNpXO6Gmp2Gn2mq+H7HSYXT95euk1rAn+t
+j/8A26zr5dNSjV/r8yKuIhLQzPiT4Ku7PVf7Rj+dL10/dvsZvNl+9Xt4uhOLuc2DrXRXsfBOrJPP
+pkyeTG6JPJI/zL83zJ92vKxNGpBc51wlqdNbeEkm0uO1soPsuo+Qk3n7P3Tfw/vKKWXVXWs/0/zO
+WvjEbcf9q+E4IL26gnd02fbv+Wsci/d+/XpSpV8PUTe3yONNTOvfUrF9L/trT/8ASo/J3+Wn3m3V
+7mIqx5Oc44XUrHIWcab/ALU8CWr79/kJ/C1fm2ZZhNz5l/X4H0UMOnG4XvxF1K1u3spI/wC55c/9
+2vocNntaULSWvy/yOL+z7P8Ar/MvaXd28Fy8mozvax/fn8/5a8HDJSxl6z0/rsXiEoRG+LPFNjeW
+kh0iRNQg2fZZ9nzeX5r/ADN/3wlfZ4/NYRheP9fgcOGwbuY+kXJkmknSB/k+TyLpP9X/ALKS/wB2
+viswlKtG/wDX6HqqmoIrah4pQTyJbWj3V8j7PsjwO21m/iX+9VYPAVVo/wBP8x88TC1Z9fS+kvZt
+NdHeDzPLn2KrK1d1XBqO/wDX4h7SJN4bn8Pvrcj6nA6SOn7t0TciqyfP8r135ZXhBWmRXptI9b8J
+6Hp2n6N9itZ/tmnb/OtXf5tv+zX1dCMHG8TxaylcvwaFpXkOn2VHR3d/uVrRowcTOSaM660Ce91h
+Ptuya1h+eBP/AIuvMxGXupL+v8zpo1rGvq9nJc6dPBD8kmx0Su7EYWM4cr3MKddwkc/Y6FPZpBbX
+M+x0Tf56fw18nSySVPEaf1+J6VSvzxNSDV4PsrzPP++s0/eT/wANe7g8ZeDRwyo6nn9z471W9t7u
+CaNPnf8Adxv8zLXlSzTnTj/X5HoUcLoVvsWj3sEGoIjpPDJ/wH/gf8FeHHFXko9Tq5XbU63RPC2t
+x2PnQ3b23nJ/qP8A0Gvr8Bg5xjzM8+vVjE3LyDS7K3g1DWX2fZk2eY/zfNXb7GKXMzko81hj6joe
+tWP9oWt0jpZ797v/AA1x5lho4inoXS5rnGwR6bJrs90km/z03wb0+XdXxbgpM9W5ELyDUJ/sTv8A
+ZZ/+W8D/AHl212UMtW/9fmFzpY7G0utBn0xLv7S7vv8AO/5aR/JXu1HCl8B5cJ3Oh0S6untYIZoH
+8xE2ef8Aw/LXr4Cq6i1M6mhq12Okr6EJXMHXNO1K53/ZZNj/APPT+6teZiMPJy0NFPlKOoySaF5H
+7/f53yIn3vu1hWnKiuZ7GsVct6fqs8zvJs3unyXUaf8Ajj1rg8RKfvLYwqqwzxCbSz02R5pP3Fy/
+3P8A2WoxlOChoXQnzHFXGo3GliC20mdLnzk/79/7L189Ww/so8yO7Y6CMGfS4LnUIPsyP8m933fe
+/u0sRh5yepzwjqY2q69dXNpdWGmXT+TB9+dPl3L/ABVMq8qMTup0EzkZ9K2+X8nz+X/B/tfdrmdX
+2pSjob/iOxS18MWM0Lvvm+d02Ju3V6UqXJC5zWuzJ0nUdS0yeCe6gdNnzp/D96pjBQlzCT5j1PSP
+FL6h5czp5Kfxo9evhs2Tdv6/I4q9E6avoTlCgApAFP2gBU8jQBTuwDNTd7D5gp2voHMGaSshc9wF
+WlcYtKxoFFgOS+INjvsoLnf9x9jpXm4ykmb0ZHI6Hob6nfJD5myP/lp/erz8NhOaZtNnb6BPBpiP
+pNzv+R/3D7Pvbq9WjU5NDjZ0ZrqcramUjnru3gjn2b987/wJXiV6XIzU0LSDfp3k3v3P4P8Adruo
+rmiMwpNH/wBNf7M/yb/krilG5szaS0/cfP8AwJ8la0qFzFjoLueZNn8f9+tKdeUgHzwTvROg5ASe
+TsjTfVzpWD2gz7NvohSuHtByJWapMzuEcHz761VJjuVr5N9cGLVmWmZk2nO8Dun8FRFXRvFkP2FN
+m9/++KyNCFJ7vZsT/UJ/yzoA1bae9uf+PX/X/fffW9CV5aGdaNjXmtXmtdj/ADv/AH/9qvVqUVKO
+phF2Och0qdI/nTZ/z3ryo4RxZtPY3tLffB9/eifJXq4eLOKZBry6p5DvbPshRN7/AN6ssfGclodN
+KojN083Wm2Bv5H857n5/If8AhrjjKdCN2a1Jozp3n8RTeTCiW10n75J/92uOVJ4pXX9fkbyj7I19
+H0m1+1PNNBsnT5P++q7MDhEnZmEsTzGR4p06eGaCey/49f8Alps+9Xm5hg+Spoa0avMjprG6jn0d
+Jpk+TZ/HXtUK0fYanM48zKenajdpdeRMifZX/wBRsT7tc2Cx1/3bCpTaC91Cx0yfY8Hned877ET5
+a3r4ylS91/qKnh5SJtX1iO20f7fbP8j7Nj/71a43ENR90MNS5jk4fiDOk+/zEmg/5aI/y/8AfD15
+GEzCalr/AF+B0VsNY7TStZsdTtftVlJvT+OvehVucRcjkjf7j1rCdwOc8QxwST7Hk850/wCWH92v
+m85XvWOnCK6uULWP+z3S8nPnPJ/qIN/3VrhoL6queW39ep0LV2MyaB9Q1Gd9QjR7V/k+583zf/E1
+msRFytI2p7HKa5oT2UH3He1f/UTv92t6+GSjeJFPc0vCFnaTPBazbN7vvkR/7v8Av0Yeh7RmWIr2
+KfxB8Gf2Zqsc8Lu9jc/+Q67cRh/ZK48PXucxoaTJqKIiedv+TZs+9WNRXRcqiO+046q+/wD0SdNn
+z/7tcdDDzctDB1EeiaHd/atOjfe7v9x3f+9X2VCtdHGaFWtWAlUZhQAUAFAC0GgUAefa/YapqeqP
+9p374f8AUWqfMu2vm8bSqVHb/I74uKK+q+DbHUEggvZ4ftuz/j1d9snzVgsuqRVzZYxRMSeDxf4c
+ngsrW1vTpyJ8kifvV/8AHKp4TERjv+Raq0X/AEy7aeI7qa3SeOCSZJPk8ibey/7tc9GNei+a35Gq
+lTPkm4kuPv8A3691PmOOWg3MkcnlyU+VHPKrY6aw0u3Szk1H53gTZ+82fLu/6aVwTr2koncqCUTX
+8SaXZwahput6dBJZabrcG/Yn/LNvuTIlelUjypM81U0pHvnhTQvDOgaV/adjP/ok0Cb7t/7td9BQ
+prQ48XzTkcJ4u8cWmj/EOw1qyk+02vkeRd7Pl3LXBiKkJy0OujTcYnokHxF8IzwQOl9H+/n8jZ/F
+urspYxI5JYZyPKPi/wCONN1LVYNOso/tSWSffT+JmrnxM+c6KNHkOIu7DxbqljaF4/L02y+5Gifw
+y/e+dfv1EXzGsVynU+G/hbrFzqUFrs32L7J5LtH/AOWX/wAVXPVwrZ0LF8pX8S+G59C1meydHgg3
+ulpPP8vmRVhiMI7nRgqyZHBqV1dSRpNO91/BHvd2rNQaR2Titz3nQLa21nw5Yw3sCb7L5PLT+8td
++WyhXpHg1ZzhIsaj4J0e+MDpvtp4f9XPB/8AZV11MvpThb/P/Mwhi5uR84fFz4TXfg67S+sZHutG
+uus7/ejl/uPXQ6RlRqnR/s/fEj7Bff8ACKapJ/oty/8AoEjv/q5f7n/AqxcuU3nHmPfJte0RNSew
+nnRJ4U3vv+7U1sRGCs9x0qLlqynDqtppN1PHqF27pevvtJP4duyuTD15Qd3sVOKlozlNS8cQXfie
+Cygn/wCJJs2SOifeZkrnxOYKc1H+vyKw2XulH+v8zm08SWlrqV9beX9qsZv9fGk+79w3y15OMahW
+U4nrxV46mf4Y8Txol3p+r3c89j5j2tjfz/NKvlfPDFL/ANs66cTJKVzncLnVwfELTbrVEurrR0ee
+GDZY/PulX/frWebQjD+v8g+qXMH4hvPq+qx3u9/PfyUggrzK+OliHdo7KVJI7LwDqQ/sp9I1Pz3k
+jnREd0/75rvwObKPu/1+Rw4ukmd99lTY6fwPX1D5b7HgxbJZ7RJrR7aT7jpspV6UZI3TZWj0TSY0
+8lLVEj/2Pl/9BrN0VaxakosxZvD0el3cl69072qJv8h/4f8Ab+b+7XiUsmp06zn39f8AM7FjnY8m
+uru0uru61CPz7qBH/dyP8v8AH8m2vn8XVjGXJE9SiijJdajq8/2WFJHn2P5knnP8yr/vf3axb5Vq
+bypo1Ph5Brcc10sybLW5+5v+Zd0f3K87Np02lZ6oyo3K+q+J9VTxNHNazuk9n+5SNPu7v4vkrry2
+k6cE47vU6pJdTb1yPXNQ037ZNqqQz/f+yv8Ae/4Bsrtji5VI8sjmjSiihHqc0GjTu8e+eOf7L/s/
+99VyRwNN77mqih114itLPSoJktd+qQ/JJv8AlWuOOCc5ct7RFLU3tC8TSWtrBqVg/k28j7LqD7yr
+trswGNqYWpy9P68jCWHubieMrqfXE1Aecmjon3ETd+7/AL719LDMnUn7uy/rscksEh0nxFih8Rvv
+geHT/ueZs+Zq6I5vzyvHp/XYyeFSOxtde065kTyX3o/3JP4a6lmNN1OVf1+Bxyw8oGlk16NrO6Mn
+OSMy9srGz0u9T5ESZH/76rilh6dGDsdsajkzzhruyhtUfy4N/wByOSdN3/j1fE0q04VHZHqQi5IX
+RtYktYLuaaeBILb54LXZ8txur08PaE3IhwsdJ4L1y7nupIdQ3pvTfB/d2rXoZTipNtnm4iN2X/E1
+5oF79lSd0uYIZ/38afN95K9PFVo8pMcOYWq+FLTfPeWDollMifJ/z0bft2V49XA+2jodCnyBaWV7
+ZTwWd6m+C2ffHAjoyr/wKsnN0LCjPnM7X/Dk2rX2o6gkiPOn754P+Wqxf3acl9YmbxnyHV+B9Ajg
+02OaaPY7p/f+WvQy7A8iOWczpra0+zJs8zen+3XrQVmcM9S1W4CUAVL7TkvXR3f7lcuKwyqG9N2C
+ytfscDo+z+/v/wBmjC4ZUwqO5nxi11xPJvYN8G/fBXPQxHtTP2djnde8NQWuoxpD9yZN7xv/ALNe
+dj8N2O6hXsW77w1fSad/r9iQ/OiP81cayvmhzf1+ZH1l3MfQvCWlapYTiGd/tSP+8+Snh8sjXXK/
+6/EvEYl2Ni18DI8k7zvv+59l/wBnbXVRydt6/wBfiZSxcmTazZQWDxwyRp9lm+RHevPzfLoQWv8A
+X4m9GuzLnk+2XaJ5H21ETYiP/qtrVwrFPnsaNFlI77T76B7ZNkFsmxE2fLIv/PPdXrYecoy5jFxO
+3gffGj7Nm/8Agr6k84fQAUAFABQAUAFABQAUAFADqAFoAq31jBe2r2s6b0eprK4Gd4c0P+zLHY6I
+8+9330qKsBqz2sFyn75N9WA+gDCe+sUvk2f8Dd68hSXMb8peu3R9nkulaYuacR2IbCe0R/v/AL+l
+hIqIiS7dJo/3L7ErXERTApp58L7HrmRbL0Du9bIwZbnTfXbNXICOP93RBWAESiwD/LjosBUnTfXN
+UiaBHBsgk2ffrKMQMi7trre//kSuWVG5t7YfaaI7oj/cetaWDuHtTZtLGOH59n7/APv16VLDKBy8
+1yaRo0Te/wAiVtKooh7K4wvCeuz56FNWKr07sxp9W0fRpvJRNnnP+8/+Kri+s8si/YXRl6x4pd5H
+toX/AHLv/r/7y15mNxzvaB106di3a6dNqvmPqQcQKmy2T7tbYSDmrzHOty7G3a2mm6fB+5gRET+4
+lez7pxjk1XTn/wCW6f8AfdQ52EVrqDS7meDfOm/+BEf71c1bDRmyqcmi5JJa7PJd0+f+CtPaQtyC
+qSbMjWvKg+RI3T/no6f3a8vGzhzaI3oWicja+fdX2y2jn8ub/WSfeb/ge6vJ9jOpLRHc5xGa7fap
+obpbP5dzaujpsf7sbN/FW0azpe4yZrn1K0enzz6V/abonkf6mNIP7v8Af21nUjb94OnO+ha8Jf2r
+pF/9l/4+rG9T59n/AKFXZg8X9lbHFUjaRuHSL6y1FLm233mn7/8Ali/7xa66WGiqnMiqlW0TpvsV
+jNOl55H7/wDv/wAX/Aq9WdBMw9qQ3WiWty6b/uQps2JXJPL0/wCv+CL2pmWugTpqv7757X/lnXJD
+K0p3/r8w9qaWpaRaz6VPZpAjo/3I/wDar0MVhk4WG6pydl4Z+wajAkyfP/z0SvBWEfOmbTnc7G40
+qxuo4EuY/Ojh+ePfX0io+5Y4pq5lweDtGhu3ukgRH370rk/s9f1/w5tc3III4PuJsrro0FEdx0ca
+J9ytTAKACgAoAKACgBaDQKACp6g9DhPilp8iadBrNr8l1av88ife2tXBj4XR24eZY+HPiq61mxeG
+ePe9r/y3/vVtg42Ryo6f7LAnzwokLv8AO+xK6eoz4O1Oxktr+SyfZvtfkk2V5GGleLZ1x942rfwi
+89hHqF1sS1f5PP3/APoKV5s8baVkbxwlzpfhlITfT6FNHG8EyOkjv/FFU14XmpIyp3lEf49uJL6/
+j0vRXebQ9LRILGPZ8q7fv16eIr3ikKnhG2dF8O/Eusat4fvvDEl3AiWUG+CSff5u3+58ldNGXu8p
+lWcYsXWPh0G0/wC1+LNdtdLdE/0Ty/kT/wCLqaWB5JczMq2NUYnnJ0i0sp5Eknjut8aPbyJv/i/3
+9tclePIdGE949W8G+FvD+uaLbpM8f9o/c+TYsu3Z975a6cLLmOfHz5Dv/CXh3/hH4L6yeTzrXfvg
+3/3dlejSo2OKVe4un2qaZqqTQI7/ANs73nR9nytF93b/AMArdxRzyk2YXxT8Aaz4rtLR7LZ59rv/
+AHDvtXa1TUp3R1YWu4sh+HvwtgsLCd/EFoj3U2zyI9+5o/8AvmuenhU2d2Ixzij0PTtNtNPh8i1+
+RK1w2FhRXKjgrYtykWgTurZUlcwhN8xQ8SaFY65od3pF7Hvguk2f7rfwtVUpcxMocp8T65pereGt
+ansr2CS1u4ZP4/8A0NaxxNI2o1jtfDPiq+vreO6utWg/tLfsjt5/9bJs/vV8/jMLJPmZ78KsfhPX
+7X4iJrUF3o2pomlz+Rs+3InmotOni0laRFXAv4kcCZLBL7yLJ96I+zz/AOGRf92vFxi5W7Hqwty6
+nST/APCIwReTI6QSInn/AG62j3fv9n+p308qblFufQ5a/wAOhyWi30l1q13bajs/s7UIPtU/yfN5
+sX8cddFaSkr9SuSxsZsbKD93d79RhdHg2fekX+P93/s1wrDqVw9rY7m61a2mv9K1A/ZZkfZA8jp8
+u2ubCZlUnU5JK39eg5UmkdRbvoUF3GlvP50CO8/kfe/e11YitRw8+af6nFOi2WZ/FTvI8NrHsdPv
+76uvxZJtWX9f+AijgEYeo/Emeyvo4b2P7Ls+fy/+elbLOcRNaL8v8jeOAR0Oj+LoNTjdPIeGdP8A
+v03/AAOvoMDmUcRHm/r8jyK2BcUVPiBpt7qHhjyNMje5d3R59n3miWurE0nUhoGEir6nnWq2l14c
+8OWkk0CPHqD74E/557f79fFYjKZc3tE/6+89WlXuS+GdDsdP037bdfPdTf8AHpHA6Syybv4dm6n7
+LS8jSdRs1IC8N0/2mD7HG6b/AC4fu18zXnGprE7Y2GaBBo9l4ntdV1iNJZLlP3d3/DGy/dr28lxc
+Yz5Hsjkr36D/ABjare6rO+mb0tXRM/8APJnWt8VmdKVW0f6/AiFGS3GXdroGraI/+iJp/wBm+R/9
+ll/uNXnV8VapodEYtHP+INHtEhT7S7vPs2R7NnzL/eq8LOak1aw3oXvDGmWmydIN9zD9l8+P/gL/
+ADxyVo4SqSt1MZYixveG9PkmjksLlP8AQd6eXHv/AHqqz16OWv3eZbMwqzaOuv8Awza2ulSfZbX7
+Zdf8s9/95f46+mjl0Yw93d/13PKq1ZIx/CKXt4fPhdIdnyeRv/8AQK8HCYO9e6PWxteJuajZa4bu
+1/sbUfuJs2P80X/A6+hqOfPZHlwmpFfxFZa3rP8AZyeR5MCb/t0D/wB7/gNTjYzaSRpRqpHJz+At
+cur+Tzv9CsXf5I9/yttrya+X1Yu6/Q9GjjUi/pHhnTryeCyefZ9l/wBZG/8AE1c+CoOVVwMsRWse
+gabp0Fqkiff319Rg8GqUWjzPa3MXUPCcclvBDbf8sfOmj/4F/BUYnA80dDajiOYu+H9LMdj/AKba
+ok9VgqDgjDFVLFm70aBvnh+Sd3+f/arPFZeqn9f8EalyHM2+h6xo+uf2m8n2lLqd98Cf88mrkhQ9
+hM2U+c7WBEhjRIU2J/Ale9CyRyKdyesoq7GhK0EFAAeKmEWgqOwyZPPgeH++myicWwpu5DZWUdtA
+ifxp/HWEMIobGtSYy5tU3yXL/P8AudiVFSN9yaauUZrTUX0e6hf53mT9x/wKuWlh5qk0dF1cxNBg
+n8P+e7o/kP8AJH/tNXDg4zoybLxElYu6Xr2qTaj5Lx74PuT7E/1e6uzB4qbepVamompr+i2l5H9p
+KZnh+5XVj8NGrHUwjXUTN8P+GYEge6Ten2pPuf3a87DZXFrm/r8ynWNuDTI0tfJm/ffPv+evXjh4
+8hi65erUyCgAoAKACgAoAKACgAoAKAHUAFAC1drgFFrAJUANf/V0AcXqMc6T7H+R3r5yVNpnbylm
+xt3h8uF/+W3z1UqbaDlGz2k6P9ytpRcTA1rVP9F2bP8AfrWnFyGM8h99Si2WEgrZGDL8caeXXpQV
+yCVaJqwBSsA2iwDJEqKkTQheB99ZRiATtXNJ2DlIY9Rjh+R61p17Byhfan5EnyfcrDFYlqVivZWK
+Gpf2jN5aQ/vkmT/vmpqxbiHNYv6Rp6W1tHv+ef8Av16FKm+Uzq1LyOM8U2t8+vDennRp88f8NePi
+Zcsj0YP3S3PavD9ldIHmtZvnng3/AC/99Up0VCQlM6i3jgtrHfvdIU+f533ba9WM0onDiFcrWNpq
+SSI8N151q/z7HrDDUZdQNKSONIH2IiPXdOFkBzWlWY8+fUPn89/k3v8Aw7q8TBVZTVzrqTSKd14Z
+1S2svO8zzpEn3on+zWVfBzT5wpyTN/S73R7mOGGHe7On3H+avSo4qjWei/MyqYdxIZ9RSyup3hgR
+H/jf+9XLXx3sZ6ImFKTMDxpo76nH/afn7IET5INn3q5MbRUvfOqnPl0KGnT+bPY2b2P2W1mfZv8A
+n+asMNT9t7gVPc1OusfDL2V883n70mTY6f3f9yvawmAjTjbr/XmcdSrdlGys7izvfsbp+7tvnj2f
+8tFrlpYadOrfoXUhdHTQTecnzxun+/Xt6nNyE2KOdhyBiqDkGYpcrkHIGankQc9wqvIYZpQk2HMF
+E0w5gqhBQAUAFABQAUALQaBQAGonuOoUtUtftVjPD5aPvT/Vv92lVhdCpzK+laVY2UbzWtillPNs
+89ErWEbI0NKs4bgfMh0Lw/q8/wDq0uo7Xe91e/Ivmbq/OqOIq0v8j2500mZvhzw7d+INZu/D1lIi
+abp87zef/DX0GEwvtNZdTKpWcEdtc+EdF8P3c+rwP9l1GHZ9k/54f7S7a5sZVpRlyJfmRhY85xt3
+4p0q0ggg1CR5ruCed7uSH7sm77j1jXoTqR5Ynapcpz2jeJNF0/Wp9UhgnSf/AJcI96Mm5n/5a17G
+Gm6S0PMqUUx3i/V7rXtSk1S6n893j/dx/wB2s54lylqFPApk13dX3iLy5/MSa+hjSD7L/F5a/wDP
+OuKtWfN72x2qB33w50G7tZ4Lp/PtoJ/k8t0/1cq1thU3LQ4q8D12aDf9z5H+5X1x89FmfGM3Wju/
+z/JND/wLZ/8AYVLnY6Y0+Y2qoyH7KAExQ5CUSrPq+nW11HZTT/v/AL+z+6v+3WbqmyotmPL8RfDE
+PnvNdoljC+zz/wCKSX/YSsHilc1nRbPm/wCK3iCfxz4jnubWOP7DYyfZbG4k+XdHWeIxasb0cBc8
+71fS9T0bUPst9H5E8eySP+NGRv4latuSM4mDp8kj0z4XapYao1wniHUvstiibPvpEzV5DwMFI9N4
+i0TcvvCN/ZJYzQTpevqG97SC1/ett/2q8/EYe7selTrGbf8A9rQ28dlPHJDH9+OP/eodFqNiqklI
+j0pNTutSg/s6Dz7u1+fy/k/1X/LSlCHMTiKrRC+n3Au98E/z7/PtLtKiqow0DD1Wyf8Atq+upEtX
+d0ktf33kR/d3f30rB4WMGbKomdn4Pmkh1REefz/tSfIU+7uryM3oJx0L5LnU/bYLq6urK1fffInz
+/wDAa8qOCqKSTWhz3TKH/CNx3hjfUZ/Onf792+/5f/sa9FY201CWiE20djP4WjsBY2UM3/Euf/Wb
+3/5aN/FX1GY5etKa/h/153OKjiG0S6zrk+nxx6Rpf3E2Qzz/AHtu6tMVjXSpqnR/r7zncFJnmHjv
+7VaeILTS7KfzpLVEf/pl57V5kcPRop2f5nVTm2Jp2nXb6/aveQfYynzzu/8Ae+9XjYuvF03Y7YJs
+6q61B7mfy3tn8vfsR68WFHlV0zZKKNzTjBBIjiCGT+4j/d/4BXflmaSw7fX+vRnFXpqRQ1GytBdf
+u5PuJsSP/nnuq8zcYTXITh3ZFHw5oeTfLq++aR50d0/5Zbf4K9KpQ9o1KRPtbsk8R+H4RbTvDapI
+6QfuJP7vz1wUYzoT953iO6ciPwRavbO6ahB+4ua7KNak6nNa/wB5WJh7p11xoMF7dxzpG/2VH+ST
++KvahlrnWUlt/XmeXPFaG5r2q/2ZpqOke+d3SGCP/ar6mvKUIJR3MKTuzL0vQP7Pkn1a6f53+5ap
+/DXDDDqkvaS3OiczYsvInSS6tU2SP/frqwzUvfRwT1ItQ16PTIN97A+//YTdH/33WtSs6aNIU7nO
+6/qn9rWm+G1fzIU/d7/utu/u14OK5qx3QXKX9L0O6ub77bcwfY/J2JGif7KV208Fd8xE5nVHmvZp
+yurHDPUWkAlABQAUAFAElABQAUAFWAUAFQAUAFAA8aOmx/nT+5QBDBYwQyO8Mex5vnd6ALNABQAU
+AFABQAUAFABQAUAFABQAUAOoAKACgAoAWgApy0Y0U9RvksoN7/f/ALn96ufE1rI1RnTQvqUCeTsR
+ER0ffXFVl7VXNKcrGVpaX093/rH3w1hhld2Co7moiPe/PN8n9+rm+eZgaU7paxoiV6M5KMBlKOd6
+4IyEWo3rqjIZZjrpMyWgBasBKAChwAhfzP4KycAK88LvXC6TN/aFCe2f+5vTfv2Vk6TD2hUnSd5P
+kj+SsvZu5ftCzP8A2jDD5Kfc+/8AJW/I7Bzl+w1DzkRJo3R/466qOJvOxFemZfi9Ejg89E3u9cOa
+0bPmN8NU5Tn7K01jXEezhutlqnzz76ww+E9qtTac+Q3NE8NXVnA6Xt1sT/nmj/u/+Bbq9PD4Zw0Z
+xzqc50cLo8e+F96P/GldsOVk1BJo3eB0+5/t1NSjcxgcxHdR2rv8++1R/wCD7tfMqvKDPS9mgn16
+61DfZwwOnyb3/wB2t6tepNaB7JEPhrS77+0ftP8Ay4p88E/96tMswTpmWIr8xN4l1tLXfDZJvunf
+532bq3zCdgoIj8P659tjS21CP7nyJPU0asq+5Fy5dadaaLYvebHm8l98H+zW86Tp7Bcm0PX5NQd0
+mRP76OlaYfEuqrMOUrPdajpl0++B7myR/kd/9r+7USTpu6FynRo++NH/AL9eicwUAFABQAUAFABQ
+AUAFABQAUAFABQAUAFABQAtBoR0AFQA2gD5Y8R+H5NPRI7Ly0g1De/7x9vlz/wDPNW/26+GwGJjW
+36HuuDUjpvhF4a1i31D+0Z/MggTf5n/TRv7tfRYG1V6dDizOuoRJfFMEfibxHdQefPDawx7Ej/2l
+rxs+xrhNS5fxPQy6Pu3PK/Fmhvp9+lq86Tb03/I/3f8ArpW2BxrnDnMq07yMlNL1K6jd7W03wWqb
+53T+Gun28YvVmFSm0R2BSOffP8//ADz2f3qdZqS0HTk0etaT4f0v7DBPp77NQmRJkun3/er5LEYy
+fP73wroeoomp/bOpaKkk/wBu86aD99dQSXSMv/AK7strzcvd2OOvA9O8Pa3aato0GoRyff8Avp/d
+avusLW5jwcVQ5CGK2u5tcSaF/wDiXQ73Ten/AC3l+X5a66kLnPQqWN2OmQSUAc38QvEV94f8OSXt
+lHvnd0Tf/wA8938VctSWh10oXZ4zovi3UtPvpNTuoP7Q8/e7pdfdZm/irzKlZo9WlRTRzmrxXd1Y
+3eqPJ9x/nj/3vm+WuKU3c1nRSKcWhCDTLC63onnR/u/n/wC+qjEzdjalJI5nx9fQTyaZZJ/zDoHS
+ST/rq++vVy2pOUTzsZT947DwlLoU/wANX8PTon266vvP8/8A5axqv92ufGYmUGVTw/MjpPDmleJ9
+EGm3mizpqGx/3FjOjytHt/2krz6OI56yRviFynQeM9cn07Sbt/FHh/7VBN9y6053dY/9n94qui+Z
+XtuknKxwrFHn2m3GkyWnnwSbP+enkf63/wAdrwatOcD1/aqQ/N1Y2lp9t3pY6g7vaTo/zR/89Vf+
+7vqI0+cPaqJ6qfACPp8Fk9o/l/ftZ4Nm7b/v15ksLio1VzbfL/MmpVitjX0DwDa2U2zVrrZfJ89j
+s/dQbWr6qGVUp01z/r/mcNTGSWweI9Jt31KN9Jg+y31n/wAvf3VkrwM/xdOjJR6m2DbZFBHdS3T2
+Fr888Kb3td/9771eNQwzxtlHR/16HfVaSILTVLvUrdI5N/l2U/7hH/363zPEV6UfZy6ehhRw6UTf
+t7FEs530+Dffvv8AtX8W6OujLa7r4Zwp/wAT/g+ehxyhaRlpZol1A/kf6VdfJv2f3a8l5dWlo/0/
+zOn2iiN13R5preT94ltd+eiQed/E33q9fAZA3T13/rzD6+l/X/AOI07X7p9UjjvZ3+yo+90SuOWE
+jGKdgqKR6RcNo2oQx3Vg7pBdff2fejZajNKdOlUix0qcmQ6lFp9zNYyJPsuYPnmR0+WTy/u12PEY
+a0W//bjKb5Ys62e1gvoI3tURN7/PX1OMwca1NOB51OpeRV1zR7o6V5dr8+z/AFaf+hVzYrI4ui7b
+/wBeYU8R7xmabZXeliG5eB3T/lpvrxMLg6uETk1dfL/gnoVa14nV6dewXSP5H/A0r6/LsXGtG8Ty
+69GzLLpG4+dN+z7lek5LoZp8o/ZGU2UOMais9iee4y3t44E2J/q6ijSjCVkNIbfWUF5avazf6h/v
+06iVQ0dTlKVrotomnJZXSeciPvj/APZamNCMSfb3NLNaqSSsR7S46oXuu4wqhBQAUAFAElABQAUA
+FABVgFABUAFABQAUAPoAKAGUAFAD6ACgAoAKACgAoAKACgAoAdQA2gB1ABQAtABTlqxoyvEUHmaa
+/wDfTY6VzYijdGqH6fY+XGk399P3lLDULKxNR2IZkg0ydJk+4/yOlYVafs3cVN3Jt9qnz/36htRA
+rTpJO6bP+AVLbmBMlo6f79aRpjLMdv8A366o0wLKbK0MwoAKsB1ADaHMCPz6ycwI3uY/4KweIRv7
+MY80dZPEoPZlN72NH3pXPDFIv2ZD/bcdt8jpvStIYpXH7MmkhRLV7198L/wJWlaj7NcxmqnMU73V
+I7qx2TQfvtm9w9cNfE+0hY2jTOR0/V5LC686F3SP+5WEJzg9DonT5zsftsmv6PJBZyIk/wBy63/+
+y17EKkqsdDinT5A8LWOq2b3Vtc/6hP8AV1dGjJCqnQCu16GECtJp1k6Ro8CbE/grkq0acmXzsf5M
+HkeS6fJs2VuqMYoOdj4IEgRIYU2In3EojYmxBd2drc/fT59mzfWNXC84vbcpJBawQQJCifIlXCMY
+7Glx7ojpsdN6f3HrRtPcLmbHpDpqv2xJ9if8tIETbXPGmovQPamnkV2ySS1D2olZmYUAFABQAUAF
+ABQAUAFABQAUAFABQAUAFABQAtBoFAEdQA2gD5qtLDWdP8R6NpHiG/Tz7p332iJ5vk+b8se6vnHl
+kHL3l/X3nsxx6lE9V8O+DrDSNO8mZPOn373kr36GHjTjaJ4NepzSOU8WaP4G8P2mpb/+QxqCb4I/
++ee5/wCGscTGMYno4SfMzzv+yknS0gTyHn375JI0f+GvlHLlke3H3kX7fz4bT+zNMj2f2nPJ5zoi
+fMv/ADzrOnSlXq87M1UtE3IPgdaWqXc+tX3kwIm+DZsr2cRQdKnznmrE2kZ+nf2d5k+kx3r/ANiQ
+Psjd3/8AQGr5XEufx2949Qw9UsUstWfyX+02Kf8AAq7sLiJOmm9JDPQvh7eR6XPBC8Gy1vfnj/2V
+/vV6OExsaNW/8x5OKw1j1cjFfXwste540o2YlPmbJuSbqV2he1scL8XNVlh0a10yHy9+oP8APv8A
++eS1xY6u1Cx6WXwlJ3Oa0rWtD1a50rw/a3aQpao8927p+63N/wAs4t9eeqsXTszrfNGpcp+KdD8/
+wpqUOip/ac/z77q12N/tbNleVhMsbrc39fmdVfFI4Lxn4b1nw7oUOvTbEsb1EeC337mXzfurXrww
+l5HEsfZ/1/keSS/aLiSS7n/ef89JK9KVSEXyo46mup6Z8AbKx1HxqkOoR74xH+48t/K+b+GuXFRi
+ka0anOrH0xpvh66s9VR0+TTod7/f+aRmrz8Fk3sazn/X5lzx3OrEnjfSLrWfDk9lDJ8+9H/4Ctez
+iYc8bHn0qvJK54rq3gHUdGTTfElpd/2Xrkzun2TZ/Cv96vMU/YRPXkvas7nwh4oM3iNNC8QaVapq
+NyiPHPap+6k2/wAdLC43nkY4rB2RZ1rxhqXhvxFPpei6bJdWX357V/8AlnK3/Pv/ALNd2LxPs6tk
+Rg6NoHZjU9K1bw79tTZdWs6fc+98392niq/LSutzGFBqdzzx/Flwmof2fPvmh+dIH/5aqy/w18Bm
+TqYiKc91/XQ+gw2HSiWtKvYHTKfJdJ87/P8AvK8Oopwkmi1dM07vW7GO5tPtVpO/9yT7qr/e/wB7
+dX1uJxcJUkpnBGhY29L8R2CWc8cEGx0f5N/3ZP8AgVdeBzilSo2j+v8AkYVqNyPxF4vFlY2s1lGj
+3Uzuj7/+WO371ehLO4yp+0W/9LsZxwK+Ew76+1+8t5LnWrTztEdPO+T+7WE8RWq0/aPb5HTGMY+6
+J4Vj8MwaV9ruoHjvU3wzps/vfdWuTC1qFKm6nX5l1YS5ita3EBu3iMD232p/91f+A18njKvtqntJ
+fCejTb5SYbI9WgxvmgTfBI/3WWuyhScZ3ijllV0O30XfJ+++4myvvcqfMtUeJinzM2B0r13sc8Nj
+O150+yfc3768TPf4J04TcwbS6e0nR06JXxWXVnh5o9Kuro6+KaOeBHT7j1+l4ev7WCkeNWp3Y+tB
+BQAUAOoAKACgAoAKACgAoAkoAKACgAoAKACgAoAKACgAoAKAH0AMoAfQAUAFABQAUAFABQAUAFAB
+QAUAFABQAUAFABQAkiI6bH+dKAFq5gVdRsUuUTf/AAVyTiAyOxg++nz/AO29RCiItQRun3664QGR
+3fyR1z4n4bA4kMb8VEKvLGwWJ4/neqUjQPMrRSAm8yncBaLgI8lUnYCtP/sVzVXcCKeSOGD+/XIn
+GxtcyvMmmkkRPuf3K5E1cVy4lpptq/76Te7/AH0euzljR0ZIz7LYpG8MP75/vp8m6i6esQMq51G9
+sJ/J1b99vTfBs/hrjxUrG9OAukWr6nPPMk+yB/8AXxpRhcJ7QKk7FifSLWGR0hsd77Pvv/6Ftrpr
+UWZ+0M2RbLyN8O/T9U2bPLT915nz1ndh7Q6nSp754I0ufv8A99P/AGavWpmJoVrIYlMyCgAoAKAC
+gAoAKACgBtQaBQAUAFABVXAKLgFFwGb0ouAnnx1JmM8+CgA+1R1VwD7WlFwD7VHUgHnp/wA9KAD7
+RQXcPPoC4zz6CBkk70AMe8koD2pD9vnoD2p4b4ilI8VabqF9/o11ayQpHHs+b5Xr5p4qvGa51+X6
+HfRwzUT1S+1fyLWR7KB726/5Z2kP95v7/wDdr6GhXjOJwTp2keF+Mr3Wdd8TSR3tolrfQ/uPssHz
+152KqybsepgKVoXNfWNP1lNOtIPsjo9r8k9pBsaJYt//AC1k+/vrKVHS9jajiPfsYk2s38N9H9ln
+jTz4P3+z73+5ub+5XjwnJLQ7KdO8Teg8Ral4kCaFq8abB9yf51k3VGPzGcaFiKeAuzEtPCLpcTpc
+702fJHsrinj4yXMjY1Z/B/2J7S6trrfvk/efJ8y1GGxalq9gO30exnu7Sd0j857X9xv/AIpFary/
+ASrO/wDL/Xc4MVWuju9OjRLGBE+5sT79foFFN00+x40lcsLzWlOdjmp+8c1ffEHwxZai+nzzv56P
+sf5PlWuPFZhGH9f8A7oYS5w+t+HJ/HPi37VDd79Kj+RHf+6v39leWsfTq1bP9f8AI9KnCVKncv6t
+4E8DSWj6Zp87wXUL7/tf3vn/ALrvSx2Lw1KVn/7cZwcqiuUL3xv4C+GGlX2i/a31m6md3+wp/DuT
+7s0te3TSgzgqScj551HU/EPi28gtfMke0td6WNpv/dW0TfNsWs5z5IuQ6WF5jrvGXg+30rwLa3lj
+aeTHBGkd/JO/72SeX+Nf9ivHwOPp16x2YqlyaEnwv8JajFpkniWGT9/E6Pbxp95UX/lq1Xm2YU4z
+5f8AP/I3wWHUdT6d8L68mq2Pz7PtyInnxp935v41rsyzMfb0rvf+vI8rF4b2TNojIr1GtTmnTujn
+fE/hP+2dWtL3zNnko6f3q5cXhPaI61iPZyONtfAvibSXfxIkaf2jpnzwWu/d50X/AC1X/viuDC5f
+yO/9fmddbGc0TAmvbSbSZNa1Sd3n1N/9EkR9rfL96vIqqere/wAj0qVK2hU0rxomhT+dpn7613/v
+9Om/1cm3+P8A66VzYSpUektgqUEJe+J49aa+137D+7e6SN45H+eNdlGPXtKl+h1UNIli00DVdd8Q
+T/2fJsj8hHd9+3zF/wDi6mjg/a0/d6HNKukzVvk1i2kj066+/pnTZ/zzrxsS2vdmVB3Ok0ezF7Yy
+XNt5E1rvR5HkruwOBVWNkjGtKwmq6aJrWSGZPnj+evCxcZYet7NPQ6qMoy94p+G9V1m9jfw/cwJP
+Cj7/AD//AEGvfr4ivXpKhD9P1OfFQiveO7sdBgS0e0uv3yTfP/u19Fl+Qwp0+Se/9dmebVxjlI52
+SDTdMneyuk3uj77S6f8Avf3a8PFxo0p+zlt8zug5yibmhafp08e/yE3wvvR0/i3f3q9jh+CqQu0e
+dWqnQ19Kvc2Ryp3EHSqexnDYzdbnnSDydnyTfcrxM8/hHThNyvDpEd1psb/cn/v1yYfKY1aHN1/r
+zNZVro1NNheG0SF/vpXt4GnyUrHJKoWa6iQoAKACgAoAdQAUAFABQAUAFABQBJQAUAFABQAUAFAB
+QAUAFABQAUAFABQAUAPoAKACgAoAKACgAoAKACgAoAKAHUALQAlAC1QBinygMqLgFLnAyr6ffd+Q
+n+5Xm1q16ljaw+eOOGTZ/wCOVNZahyj45/n/ALmyqUiB8cn8daqQx6P89a3Ae7/vKLgEiP5e+qqu
+wEL+Y6b0rmTuAW8kDxvv+T++lKk6dhXCD7CkmxPkf+/WtJ0r/wDDjuNu7SO6fzt/yIlZ4mmp6ssp
+R6rA/wAlrB86fx1y06kdkIxodIn1O6d7n+D5EephS9odFSpYsvPaaBewW0O9/O+eeieJ9gFOnzl6
+71W1m2WyT+S82/5/7rVc8cmjPkKFjqP2mR4bmSGZNmzzNnzLWFPEpsPZnTWkCQwIifcr2qZiT1rI
+BKZmFABQAUAMoAKACgAoAWoNAoAjoAKAGP8A9dKi4FZ7q1T786J/wOi4FefxHocP376Ci4FaTxjo
+Cf8AL8lFwI/+Ex8M/wDP8n/fD1ZmH/CW+Gf+f5P/AB+gCaPxH4dm+5qMFTzAWYLvTpv9TdI/+46U
+XAm8j+5VAM8iegCPyJKZncPInoC4vkSf7dI0DyJP9ugA+z/79AeyD7NH/t0B7I89vdZ8M+KoJEtZ
+4J/sqO8E77P9f/Dt31xVLTXKUk+Yi8EQw6RqN3a3upfatVuYEnkg/wCecX+1WOFpxjLlOmvOSicz
+bz2mo+O9STTLR7rznf8A0tP9bH8nzNHU1eb2/wDXY1jaVI2vh74R8TaTqn2nUE2WM2/zI9+5t38O
++tsNhXTr8/8AWxhWnGpT5TB8UfDa+0y6vtesvngjm/cWifebzazxmC52zqwWMsik2oJa2Njq11B5
+caXT2Xl/xK33q+Znk8rPz/ruejSx6b/r/I6qK0hvJPOmD7JP9ROj/wCsWvmFVdKPLbc6IXgjpdD0
+TTbq1kSTf9zZJX0fD2ApYpPn3+f/AADy8Zi3czkux4cjn0/T50ut7/8AbWNtnz7q9vG144GFk/6/
+Eyjg3W1L154803TNNge9Tfezf6uBP9n+Kt8Hm8ZUuZ/1+BjVy++n9fmZH/CeR61a3yTTvpEH3I54
+fmlb/YSq/tSTg3Lb+vIuWXpy/r/M5W38I6a1pd6h/aT+enzx/avl/wC+2rxKGIp15Pm3O5zdKJU1
+LxVdaLZJYadfxySTp+8TY6rtrChBRk3D4X/XU65w5nc57xJ8U9U0fSY4YPssl3ewP9z/AFsH+3Wu
+ByaM5uX9fmcuLq8qsc58O/DdhqLSalqlv9unnf8A0SCd/lZm/if+/XtY3MXhtv6/A5cPgrq53Wm2
+j27pp0dpBa6N5/2q7nRP3tokXyyt/wBcq82hiPrUXCRtyex1OU8ZXz+NfFMnh/Qbt5/D9k++W4/h
+2r/HXVSo0cBFz6v1/wCCY04/WHc6PwyvkRwacl39l059kEk7/d/4FXmvCPETcl1PRqy9nGx7P4C0
+WCy037ZA/necmyPem35d9fS5dhvZo8XG4q7OrZ8ivVi7s86rHmQ2CdHSP/b+fZU3NSai4HkM6aXp
+Gv8A9ma7++0e9km+w7/9VaNP9xvl/gevCq1Iuo0erRclEnX4aeRZT3T3aXJ+dIIIP4v9quCeWKcG
+1v8A15m1HHuDt/X5FaPwZJKn2m1tEmgh+TVI0/5aL/f/AN5a8TB0cRNO/wAPyO14xQ2LFx4j8I+H
+dCu7XTNV36jcpx8m7a38FfQ0KqoUfc3OCtTeI3POdN1/VJL+SH7X99988k/zL/tNXk4vDwqPmPVh
+SizobXxhqOnee9kif2Xcvsf5Nvmf3ttc2HvT0JqYZM6uPUruW286ykRIZk++/wA3l/7SV4eGqexn
+ZmdjkNNuvFWh6r9stoHksLN98k+z/llL/fr6rCV41FoDjfQ6q71+71eO++yvP5junlo7/uvKb+7W
+VSrKrPmRzulyo6e60HW7rSt88CPdW2xET/ntGv8AFXpVspdWCf8AX5nPQxSjI6XQ4JEsUeZPJunT
+9+ifLXvYHDckTzpvQvnrXStGcFSOo6mdAbI9++gB9WAUAFABQAUAFABQA+gBKACgAoAKAFoASgAo
+AKAJKACgAoAKACgAoAKACgAoAKACgAoAKAH0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAI/3H
+oAyBA80/2nZ/BvryknYtFSeedJ9/8dcSk1I3RZgu4Lp/n+/srpde4MvQfJ8mz+CumlG5ix8EG9Ed
+KqjECzsrrAp+eJp9lcdSvzMqRZTZ5fyV2RWhkyjdTu8fyffry61RzOm5W06P7Sj/AD7J0p0MJcLm
+jPapM/k/8s/44/4a65w9oZxM59EFm/2yF/nT+D+9XFPDchvGaMseILq1nnRETZ/zzrjpYxwVjaOF
+SOc1S6upn+2v/G/365pSknzG8YJFnTYBqF0j/wACJ/qN/wC9karw+HTMmzdnWx0KOBPI3+d9+R/v
+LXpXVMwcjoo57XYmx02V6SqHKTeZWqqALRcAouAVHtACj2gEdTzgHmR/36OcBj3dqib3nRE/36OY
+VzFvvGmlW0mxN83+5RzBczZ/iFH/AAWv/fb0+ULlOf4hXv8ABAiUcoXKUnj/AFj+DYn/AACr9mZ3
+KE/jTW3/AOXp0/3KPZhczZ9c1Gb7927/APA6vlM7lCS7f/npRyhcrvdSVpYwGSXUlFgInu6Vi+YZ
+Jd0WDmI/tdbkkP2+RPuSbKALsHinWIf9TfTp/wADesvq6K9saNp8T/FMP/L153/XZN1H1dB7Y37H
+4yXSf8ftqj/9NE+WsnRNI4g3LT4s+H3/ANck8L/99Vi6Juq5q2nj7wpP8n27Y7/3/lrPUq0TVTWN
+Kf7l1A//AANKNQtEnjuoH+5Oj/8AA6OdmwfPRzsD5kvfhNrllBdvBJ56Js8jenled/e21w16Dpx5
+h0q8ZSN7wfavp8dpP56JqMD7J0+T5kb78dfH18xnCbkv6/A9ipTjKJ6H4c0bSoNVvtZj+R7qNEjT
+/nmv8VfbZdio14+0PBq0nD3TobO8tbkyeTOk2z7+yuuGJU5WMYYdplkDArWM7spU+VGDq1jo9tZT
+/bYIP7Ld3fe6bvJll/j21zVZpJlYW7keN2OvS6Ff39rdalGljZO8fl/elZv+WflRffr5avlFKcrP
+9f8AM+geOUjSsPH/AI3+wJ9i02eNE/191J8m7/e/iqKLp4R2Wn3/APBMZU1MyNJ8UeJBfSXs9hH9
+hmn8h7uPe3lyy/36zxmBjWp819TqpV1T0LmrXegLJH5295/nmkf7zSf3K83DxrONom0oX1Nvz4PE
+GhWMei2Lo9lv+3Roieb8v8Ve206tP2fVHHNOnIynvtRTTJzO6IkDpAlrP95mb+L/AIDXl4fBqMva
+djWpJTRgeKNLtNO0KfxDPqX215vkTZv+Vv4Vrsw8lOapw/r7wnV5YnnXh3wR4k8W3Ml1bJI8HmbH
+n/2v9mvoMZi6eFtT+0cFNe2keiaP4N1axi/02Oa1eFP9BjRP3kjV89jsTZpPqeth5KMCSd57PwXr
+M+ob0S8gkhSNH2y7l/vf8DqMPJPFRjD5/cY5hDmp3OE0W61zwVHHeQ/vLDUUT7RPs3bP9ivdxFKn
+jE4LoedTf1Z2PV/AHiiCcTz7IL20k2I9q6J92vF554Z8qO+rH2kbnuumSwXWnQSWybINnyR/3f8A
+Zr63BVedHz2Jo6k108YHk/8ALd/9XW7lysTjZDI47XT4I98mz+DzHp3ILdFwPG/F1hfa1qM9rMmx
+/L8lP9pv+mdfG4qMo1WfT0HFxO0+Ht3dpp0llqcb/brZN8Ej/emtq9vK5N0nc8fE2UiGfxTJMjxw
+2qWse/50T7zV8jj8+nNctPRf13R6FDCNbnm+q+HEvfEU6W0CJDf7I45H+VVkl+9sroypVKtLzLq1
+FDY09etfBXhid/D7wTzXRg2XV9s2+Xu/j/291evjaMaSsjLDzkzBtb7w7vns7md5of8Al13pt3bv
+7r/w185VpVF70TtdyaTWINPT7NOiPD8+xIXrP6s5u6eprymzaeLbq5kmmsrXeiQpmB/4v726sfqr
+p2uwsX/Dvh2O68VWt7au+n2rxu9xG77vmb/lmlfTZbi6dWXKv1OLEVPcPVdNN8kOy8+d0f5JP9mv
+r4bcqPmud8zLWacalkVzD8VK1ZXLcKYgoAfVgFABQAUAFABQAUAFABQA6gAoAWgBKACgAoAWgBKA
+JKACgAoAKACgAoAKACgAoAKACgAoAKACgB9ABQAUAFABQAUAFABQAUAFABQAUAFABQAUALUU7cpo
+jm9Skjm1F4XfYn9//arx8RJKRsg/sqeG6RE+dH/jpxo6gzoIN+z5/v16uHjoYsI4I0d3T+OqhEAn
+f5NiffpTAyoLS6e63/c2f6xK86lS94pmwa9hq0TKRD9khrl+rou4TpstX2f3PkpX5QuV9Hkd7H5/
+v1lhqljR6F4mu2ceY55TMW+0Sy897l32P/An8NeXiMJFO51RqtmZr72Ulij+R5zp/r/92ocItWNo
+xkyh/oL+RNawImxP3bpWlOMegmyOfy3/ANZ89aypRZhJlWP9zHsT7lWomYfan/v1qogKmq3UP3J3
+T/gdFwHf8JNqqf8AL09HMA//AIS3Vf8AnvUcoDH8W6q//LfZRygUZ9Yun+/O7/8AA6vkApPfP/fo
+5AIJLuStvZmFytJdUezC5D55osK4ySejlC5HJLV3I5iGSSjmDmIfMq+UyuRvJRyhch8ytLAMkkos
+Mg8w0WMuYh+0UWDmF8ymajHoAi3VNmY8gzdRZhyCB60bIihwuk37PM/eVjJnRFEnnt5dXoK0g8+a
+jQLSH/2lOn3JHSj2SK+tD/8AhINW/gu5/wDvt6PZIPrR7de2trq2lbEf93Om+CevFqYX29OzO2nV
+5ZXPF/iHA+mTT6e92n2S2ffaQfJ57NXjPLo0lb+vzPUo1eZ3Op+HvjW31TR7rT5n2aw6fuHf5Vk2
+/wANRhqaowaZtio+8YieJNS8P6z9q8/fHv3zxp935v4a48NVbqXiayV4no0njadrq0tdL0e61Dz0
+R5J0/wBVGv8AvV9Ph8f7aNkeNUwvIcT8Y7rxRehLWOxe1062TfPOj7vmb/dq68ZKNkVSZhO+g+Dr
+WCG9sUutc1C1S6+1z/61d38Ncjm4waO6FJTZljxDZx2G/UNRdNm94ERP4v8Apr/er5r6s6k3puer
+BKCI9JvvDerx6jq+tSfZrq1T/iVaMkjxbpf+ez7f469fDU/YU2tzhjBswNW0RPt8l1p2pTpI/wA8
+kk/zfN/FWVPHNPY3jhbl3w2PFaSbNPu4J766+R4Png/8frLERp21TivvKtI6FNV8UTXUCR+G7Kaa
+z/6evmkkryHSocutRxv/AHWLlZ5r4g1bWfGHizyL1P7OG/Z9hj+VY9n+z/fr6zCUaeFoOcNf6+Z5
+8ZutK57J4VhGk2EdjZWv2ZIf9W+/azbq+ExtT2lTnb1PVVLmjY6OBJ7nUo7m53v5cCInnf6yPbXP
+jcW6kEr7Cp6HDfEWdNUeDSLO1Qz3Uc6b/u/8DevXyVOgpVZPRBJXNC38HpaxppeqTwP9ljg+1x/e
+3bk/u10Yn91X5hQrucDjPHugQ+Bdbsdf8N3f+g3UnyW+9G8vb821kr6alUjWieLCcqcz1PSPGmtz
+6Rv0h/3F1Gk8Emz+L/loq14WHxtSnNwa/r7j0cTQg5HTeCItfkvp73Wkm3+Tvgeb/wBlr08vpVXV
+cv8AI5cTRhymV4z17UtTEFlBA6Ik+x40/wDQnrzMyzLmfJ2/rsaYHC+6db4S1LUXSS2vfnjtvkgu
+3/iVf79elk+OdRcy6HNiIcsjz7XJdUv/ABBdPbb5khfZvd//AEXXhZ5VgqlpHoYN2NG1TX/s32yN
+Nuo2f+oT/ph/y2X/AIElcuRVWq3LS10FjHc1dL0e0N5sn3zQTJvge1/2q7cNl1CrXal+v+ZlWxLb
+uatl4b0eN5POuvO/uJ92SNv76f7Ve7g8no0G5L9f8znrY52seP8AjHw5qv8Awk169zNM1uzv9n1G
+5T/Xf8CrLGUNTrp4o4+e0vra/e1uv9fa/fjrz6itodsJ3JLC1u9Qu4LK1/17/cqKzjBX6GpuaH/b
+mkarHBcwPC7/AMD/AHa4sRTp1o6MR2uo3t6kEE0H/Hr/AMtI0+9urzsJTcJW6kOnA6fw14m8U3M8
+aJB9sg/5ek/5aqrfxV9dluJrc3L/AJHlYmhA9Ar6d1Gtjxx2aV+bcfPyhTEFAD6ACgAoAKACgAoA
+KACgAoAKACgB1ABQAUAFABQAVYElABQAUAFABQAVABQAUAFABQAUAPra4BRcBtYmgUAFVcAouAUX
+AKLgVZ9SsYf9dOiVIrlR/Eelf399AXI4/E2lfxvsoILkOsadN9ydKALtK5oFFwCr5xj6OcAo5xBR
+zgIBQknEzhE53+zrq51SeG53/ZU+eB/96vKWETkdsJWRvJHsj2V6Ohx8o19/2pPn+TZ9yjQOUJ9j
+o6PJ9+pqSLRl3ceopGjw3SfJXnVDZGlYyXTwJ9pTY/8AsV6VCbsY2LG+OrU1cLDN6f36XMZ2B9jx
+0cwWIU+y2ybEkrK5oU7rW40+4lFwMee6d33vUAVJ3joAzYLSC1+47/8AXOsYU7FMfIa7IVLGLKz1
+JoQyb6AKcnmbKoyIZJ5KAIPPrQkZ59ADHnqgGefQAzzaVg9qMp+zFe5HT5DO1hnm1JXPYZ5lUQM8
+ygBKCOUhkjoDlIpPL/v1ZZDI8dAFd3/55x1XMYxuJvk+/S5kdESJnqlO5jVhYVpP+mdJlUtCAPHV
+t2M0holjSsnUNlSuZOpX2/8A1En7xK55Yq56MaNis88m/ekn7ysHqdEYFnT7uQv5b/crSjoc+K98
+vNdxx/freeKsc9DBkX9owf8APT929ZyxBrKgRSapB5e/zK1pYgwdA9U8MfEW+8T30lnpkaaFYp/q
+5J081pP/AEFFrx/rnM7I9GeE5Vc4fxbolhJqt2+oXzvfTP8Au0/ib59q14dWrP2jPTweE5olbS9S
+03w35m+wS9/54PO+3y/++annc3aSKrR1GRzz67E97B/q9Qn8jy/4Y2X7m2rlD2SvEqK0O78CapfW
+UiQSb0jT5PnT5V/36zoylRnYjERUiprPxnt7W7k32KXMD/JOj/3f+edenTxk5yscKoWOR1zxP4e8
+d6xJe6pcSaLaWtrsgREefc0f8Py12uopFwpuCOOfw9rU8Eeo+XI9pH/q/wDph/c8z/bes3ONPU0p
+802Sz6Z9lfY8km//AFkn+81cCxSnE9GMbGnpp3zxwPJs/ub/AJvmrirqyubKrY6K9sH0K6n/AHj/
+AG7/AJYTp93a3364qVaFWBPtkV7Fb9LqN5Efy/vv/u1rUwzcdg9tEyPiS8el+LNJ8SWqPZfbE3zp
+/Fui+Xf/AMCruyWlN0HTk7nmV4qhKx6NoPiSfXRHqjp8iJ/q4f4a+azSkoTcD06CvG50JubqaGGa
+wg+0wzfuXf8Au158MFJ7mE9DhdftI/DnjeDV9Q3zoY3g+y/d8mT/AOzr6KnQk6Do9R0tSSLWNRfW
+f7TMCTPe/wCr3/N8v8NZ4tOceaRpQSgYfirwneauLu1SB/tUnzx/7LVtl+YRpJdjLEUoy1Lvwx8Q
+Wlh4Qje9+efT77yII0+9H/HIzV6+Mgua6OPDWqM9C8L69qSM90928nnfP5b/ADLXzdTOa9Kfu/p/
+kd9fBJoq+Jruf+2EudJn3yT7P9ER/wCJqq31h8y6/wBeRlh6ipx1JtK1W60my87U980877/sn3Y1
+2v8A8tP71elRqLBe4+v9eZzTh7ZmFqmvXqald3Rfyd775HT+KvJnH6zLnkd9OhYs2HjScWyJMJ02
+PvREfY393+7WuAf1So5IdShc3fCTTvY2ps53hnT5Hgd9+3564alWosZp1f6GM6MeU6/UXdNKkubq
+D/iaW0DvB/Fu2/7aV+iUYSjRu+x4UopyseWa38RdVuZLGS5fZDCjvJa/62KRv9tHr56eYVJvb+vu
+PZhgbHP2lvod7I/nbId6ec//AEz3fwVwYvEVN0up2wpWRq2OgJaeRsvUR4Zv9FfZ8zNXm1cU5X06
+akHS6ily9lazXP34fnmRP4q8/D1FGbS26DLl9q+n21/5M3kYfZsg/hkrtUqnteaK0OeFNHOeGfH0
+lt4j+1TSPc+e7o6J8qrHv+Va+nwzqwtNfoZ1sOmem+IvFU1rawPp7pvm/wBjdtrrxWcr7P8AX4Hn
+0sPc0PD2qPqFj++R4bqH5J0f5f8AgVevlmJ9oveOHF0uU1q7jEdQAUAFABQA+gAoAKACgAoAKACg
+AoAKACgAoAKAHUAFWAUASUAR0ASUAFABUAFABQAUAHmUAR0AFFwCi4C0GhJQAVFwKt1qNjap++nR
+KLgYV940gT/j1T/gb0XA56+8VXs3yef8n/PNPlouBmPfSP8AfrQ5+YZHPJQFyeOekaFnfQBctdYu
+rX7k9Y3NDSj8YXX8ex6LgS/8Jg//ADwSp5wGv4tvn+5sSjnAZ/wkWo/36OYA/tzUX/5b0cwC/wBq
+XT/xvQk0jTlsOTUp/wC/WSbTJ5rFn+0Z/wC/UahyjPtsn9+izDlE+1fvPv03MhEn2rZHG6VkzdCx
+3z7/AJH2JVYeo7BYl8/Z/HVKauFh/nVrzGdiaC6o5gsOuk3x70ouSZs6I9FwMud6oCs89ADZJKOY
+qRXknosYyIpHrQ0K0k/8Hl0AQ+YlUZFaSgCDfWhJDJQBDJJVAMoAYGpz0FTplW+1HyPufx1xTxVj
+vp0CsmqOj/P88b1jDF3LnhzQRo3Ten8ddsJXOCdEj3p/zzrY5xnnvQAyR3/3KDSxDvj/AN96A5SH
+z40+/HVmZB9o/wCmdAEF9qj2v/LNP3nyV5P1k744Yzp9bu/M8iCSPZ9+j60brDFi2vpJLeTf+7/5
+5/P96uzCzucuIgPkuI3rtqHAtCnLfW6R/wCsqKrLoq5laldcfP8APsrzKtSx69KkY0kkcckmz+D5
+6mNOxUpWK9xc75N//LP/ANmreKOeVaxoPqeyOPZ8mz/lp/tVpEUXcWO8nunj/effrnrU7nRGryhc
+HyP+Wke9K55ltmJf3Ekn+x/0z+9WtIwbPbPDXirwjpBge5R96fJMn+1/er4/CUant1N7I9nFJuOg
+34nXHhPUbCPUNLu3efz0TzIEfyttfRYvExnoc9F1krL9Dm9C8HvrOpWu+xREfYnkO/8Ae/5bNXnP
+F+0nZHWsN7ONzo9Y+EniDS7iS50uRJrW1+ffv/ett/2K7JZc5ROKON5ZHaaN4OefSoLq6nT+1X+e
+eR/vLu/hrCGVxmtf6/El4m72MTxd4RFzaSRzOk3nyb5IEf5o9teXiWsK9H/X4nbQd+h5/wCIPD7/
+AG55tF02e1sbL/WSR75dvyfer1cBUdanzMFK2jPRfBfjbSrrw/HpPiRIEKJ/r0+ZZNv3GZP79deH
+zBRfLI8/EZf9pf1+JzHj/wAG6bbOmo6XqKah9tf/AFDv+9/3qzrzpN3X6m2FbQs+j+HfD9lpWpx6
+jBdajsd7tE/f/N/srXlYuc5WUTrVRoyHvtS1qfzrX5J0+d9/3ttctKgqWh3ylc9f03UdO0XwRY3W
+upvn8jZsfZ5rK38NfUYOvGnTuzwJUr1DlfiifCHiTwfI8Np5k9lau8c/3fs21Pl+esaOaUnNRXX1
+/wAjnr4RqNzh/gpC+qaPdQfOkltveCf7sXzJ93/erzM5oR+sKH8x7OGq2o2PUNN1WGz0O306xfyb
+j/XXzv8Ae8z/AHK8rEY9xoxjHclwuUPFemJ4kijSeB0cJ+8nf7zN/BJSnnzdvL+uwLC3L1p/Zf2G
+w0XxTBHZ6vDDv0ueH91BN/1z/wCmn96vZxcorDuO+hz4dtMjurnSbd5prfY95/qa+GhCpKyfw7nq
+cl1ocD4BbyNc8UaCkf2mS9nj+d4d21H++3+zX2eIxUvqsLdTho4dbs9N8M+CbuCxd739zB8/kQO+
+1qinkntJXn/X4l1ce4aRMptOt/DN7/bupwO/2J988EPzbW/5Z/P9yuzD4P6vqZYnEe10OY8Q+NLr
+XdUjuZnfy/8Alhaw/wAK1wY2ftXfp5nfQhyQsa2meENW1DUobWb59ODo87p/dk/uI1cmXuM9Y7hi
+sU0i1rfhCysknSG6Tzkf92m/7y1xYiq6dbl3iYUar3LPhLTlh0e71C8M321J5tkiP8vy/wC7WmIo
+SqRcl0JWJb0Zr+INYuBoE7zTvDmPZH/vf3a4sNj6kp8r1/r0E6XLqji9H0PS9TtIIb26hR7l/wDd
++Wu+rWmqlzpmnYwPEXhS70zXXhsp4I7KGNPnh3s//j1em8ZBxt1FRTRU0KPU7LVYLp5PtsCfOk/8
+MdZYzlqU+VbmlOm0dba6/fatfSJAHmSCD9/BsfzPm+98tedDLHyabiqTaMrVIMeIH2QTpdRvs8x/
+l8v+4u2uypTlRVmzKlO533hn/hFLDSvJvYPtLv8AJJHsTbt/vV3ZTmFOHxfqcOLw7mzoNV0rw+bK
+P7HfQQ+R+/j+fd/u13Y3C4aC5l/7cckXKTLPg28ncXT3l9vnd/O8t9m3b/fSurKasXqmRjaDsdFb
+3UM8e+F0dP8AYr044iDehyU4ztqTB+a2qaozhD3tRklxAn35ESnyD5yjP4g06H7j+d/uUcgc5Sfx
+VH/BB/329a+zI5xn/CVT/wDPFKPZhzkqeKo/44P++KmxFy5B4isX+/vSiwXNCC6gm/1Lo9Z8xvyk
+mKOYOUMUcwco7FHMHKGKOYOUZPcww/650T/f+WjmDlKb+INDT799B/33V2DnGp4g0d/uXSUWDnLX
+2608vf56bP8AfqbGfMMj1XTf+e6UcocxOkyP9x99LmNOUfv2UcwcpTn1i1T+Pe/+xWljPmGQa/Yv
+9/5KLBzFz+0LL7/np/33WfMacpWk17R0+/fQf990cwcpWn8V6BB/y9o/+5TsHJYx774jWMf/AB7J
+v/23o5Q9rYx5PHesP9x0T/cSq5CBn/CZ65/Hdf8AoFHIBOnxGvU+/seo5S7j5PiTdeX8kcCUWC5n
+z/EfUXk/16J/uJT9mZ+2Kb+PdVf/AJeno9mHtiv/AMJdqj/8t3/77pezNLkyeKtf/guno9mFyV/F
+esbPnu3qfZEe1Kb61O9Hsg9qV5L6T/npVCDz3/56UAH2qSgCZLuSgA8+4/v0F6j/AD5aA1J4J3pM
+ot7N9ZMAeTZ9ytACOegCae+ggj3u+xKxqyCxTtPEdrO+zy3/AN+sozCxsef+7rZyCw+1vrV3+R9+
+ysXILE/2pK0LDzqAH+ZVNgS7/krJsCLfVXHyj/tXyUXDlJobtHj2eZUxqXKY5J61UbmLLlrff3/u
+VJY2+g8l96fcegDMngR/nSquQZU6bKLgRSSUTZZC8lEGBBJ5lakFaSR/79AEMlUZDN9ADN9XcZC8
+lFwGfu6m7K0GP5dF2K6IHkjzTrK0TOLvI5vWRJIHfy/4/wB5sr572nvHvRoXiVob3Y/lwR/c/v1d
+SFgqUbmvY6hB5Gx5Puf6ySu3C1+VHDPDEcms2aeZs+eNK2WKY5Zcv6/4cP7Vt/Ljf++9bLFswlly
+/r/hyx50f/2ddPKcvIgee38v/Wb/AO5RylXRXikl/gj/AO2j1nV5UzCDkyC6mu0Hz/8AbPZWdXER
+SO6FCTOZ1q/jf5/4/wDbryaSPTnI5qXULieT/V79n9ytZI4ps0NL1a/8/wAh/uV3UGRiIo1JNSSu
+51DzUmVJlnef9xH8n+3WWIxFzuw+H5SveW8k8mzzPuR15jq2Z3uBkST/ALzy54/Lk+58lCqXE6di
+rcXkcf3P9XJW0adzGVSxGLiR/L/8h1cY2MosvaZcf6R/zz2VjVjc3TJ5LiOT7/lySR/u6UpBzEey
+Oe3/AH8lYthzHoet/DfWNG0aTWtT2JI7p5cCfNt3f36U6Xs6d2dVLMIzlZf1+Bk6RpOqajf/AGm8
+f7NpVl/q/n+XdsrxsTXioaatnq0nJvQ6vw5DrOu+I0fRZ/J+xfPPO/3V/wD26nA4W0isbV9w9f1/
+xVpvh/S/tuqSeQ7p8ife3S19XOqoRPk4Qcpngeha1BqfiuSfXbp7Wxund7q7TeleROUejPak7dBt
+v4ourbUp7XRXe6R5NkEj/eZW+5XnYjK4VNWdlDEWWx7X4P8AB89r4bfT9Zn877a/nzwI/wD5Devc
+wOHUY2R4mJr3d0cJ4h8NWHhbxb9qeSO10qd3e1g+81ebnGWvlvHr/Xc9DL8ZzqzOR8TeK47+632s
+eyCF96f7X+1XlYPLpRTbOuLSZiXF/wCcJJ3++/3ET+9XVGFnYK1RJDItXRJNjpv/AOmdVLDNxui6
+crmnfeILvUZYI5n894I9kEf+ytRGlKSsKnSvMuS2/iO98O3fmX0dtZTRvDGn+qVtqVzRlRVeNlqv
+UdeCdIX4W3th/wAIO9kk/wDp32qTz4N+12i2feroz6n+8jVRyYaN4HSxzwNHa6hHJDNCqPvd32ss
+n8CV4UqTTcNbnfyWN5Li6ubH7TZuj/Jv3o//ALLXn+zSlaSD2lirrJm1vRrq2vIE3vD/AKFPs+5J
+/v8A8FdmEreymktV8jGVHlF0vT7UaPZXkcz/AGWFE3u/zSLu+9urHFV71XG2rNadQp+Hr9PD/wAV
+ZIfL36dryJsnT5fniSvo8u1w8XLpf82efNt6Ig8U+NL3xHrPlvd/ZdOgnfyE/h+T+Ou7FY1zfu9D
+qw+GUdZHQeLvFunP4EsrJLrfezp511/uxfe8ytamJ9rS0OWFDlqHC6K3nvHMmyvn8TDlie9GF0ey
+aQbWHQv7RknRJEh3wRu/3ZErXJMtbjKae7/rqfO47EpTsc6hgvNN87787ps8z+7Xz9eEqVZwn3O6
+NVKFzS8H+I7S10N7BIHudk8379Pu/M9fXQxUMLDlr6X/AK6XPPrw53zI5TxPNqGoX0EDW/2KD+CD
+f/4/XA8DT+Ogr839faZ3YKrfRkbeHVh2TQ/Jcv8Af/2a8VYu+j+E7o1k2QrbPc6i8OpSPvdP9Z/w
+D5a6qTi7W2HVqpImktNNgnTT5J0V/vps+7t2VticHVpw9puv68yKeKTHRSW+k3v225d7aZ3SBJE+
+8rNWcIV3DnhsvQKk09y/fRf2k8zzbLk7/nuvuybq5J4yo2nJ6/IzVPlMCS61XT/9G+yfPdf6iTf/
+AAxf3q7YUoVI3Ltct21yNPu55tRtHd9QTf8AP8v/AANK97L8L9ai4y/r8jycXiY05FefWdfSe0gT
+5I0j32l9/FWdXDxw0uW/9fidVJqtEv8A2/VYI0mSfyZ3/wBW6PWGDpVFNXYVasOXQ0YfFl15Kec/
+nTp/rJN9fcwjaCufLVavvOxBP4ovnk+TYldHIc3OVn13Vf8AnvRyBzjf7b1Z/wDlvT5jL2gxNQ1J
+P+W7/wDfdHMHtCT+1tWT/lu9RY0uWU13Vf8AnvRYOYvQeKNSh+/88lZ+yOj2xpWvxH1WH5Hj3/79
+Hsg9sXP+FnXWz5LFN/8Av0eyD2xC/wAS9cf7kECf+PUeyD2xm3fjbX7n7906f7ny0eyD2xlXepzz
+fPNO7/79Hsg9sVftkdaWMOcSPUP7lFg5y1BrN8n3JKz5S+Ym/wCEk1L/AGP++KOUOYnTxZfJ/c/9
+Bo9kae2Jp/H2ovHsd/uUeyD2xjXfjWZ/+W9XYjmM2fxJP/z030WDmGR69P5n+xUeyL9sN/tSfzKP
+ZB7Ym/teMx/33o5Q9tcf/aMFFg5Lh9vTf8knyVHOaFqORH/5aUc4EckmyTZvq+UzuVpJJHk/1m+j
+lC4kYd6fOZ8hNHaSfx0c4chOhSH/AJZ/PS5jS4SXFxRzDuEaz1nzF+yJI1/go5g9kTSIiJ89SII5
+IP46AE8+D/foAk+3J/zzoAn+2j/nnRY3+soPtQ/josH1lFhJEekySb7XsrJgMeffWgE0Dx+XQBl6
+tJvu9j/cT/Vx151WZtYz453hnjT+/WUZBY6JNV32mz/lun362cwsVY7oJ9z5JJv46xcwsb9jPI8e
+9/v13kFxJ6AHpsqGwLCbNn36ybArzv8AJ9+qub8pRnu43j/1n3KLhykFjdO88ez+OoUbGbNeS7gS
+T79bRqWMWTpPVlmlBdJ5fkv9ygCjdp5L/JU3IKN1Bvj3pRcDFvk+ffSmyyGCT93RBgQSTwb9m/8A
+eV1EDH+egCGR46oyKcl8nmbPMoAj+1x+Xv8AM+SouAeej0XAZIp8uq+sIX1dlaS5RPvyRpR9YQfV
+2UbrUbeM/JJvrmqVrxO2NC0jnrq/3vI9eVCF5HuxdolGO4nPzxybP+mlX7TmMOcnk8+R5EeT93PH
+v8ukOxV/eWsfnwf7nl11KSIdylaanfpJI/8Ar9ke/wAutozRi7nQadqf2q3j86SNJ3rt9qefUwbL
+VzcIif8AH2nmf886ftTz6mGkVbvU54IN7yfx15dXmbPQg4oov4jjm8/fJsrOrQk0dsMTFHOan9s/
+34P+WdaUokTkZhSSPy/Mj/65/wB+t5I4ZyBLi4gk/eSbP+ekdVTY6kWamn37z/6ySP5P+Wj0qlQq
+kkRSXl59rjjgk/65/wCzWcW5HZUfKMj1CRLiSP7R+8SsqsLE06lyDU7y0u4/MTzI5I/9ZWqp2G6l
+zOks5PL/ANX/ANNK2jUsYyp3LFpYyPHHU1atjijInu7GSD/Uf8tKxjVudEZE8cEkfzv/AB/u/LpN
+hzFmQxwXEcbx7/3dYykHMaerfErWb2wn06ad54J/+Wbvu3NVUItHp3Mz/hIr6fSYNLeffY2r740/
+2m+9Tr6hcveD/HWq6Fdzvp7+S7p+8k2bvlrSj7iOZrmNXWPE/iTxdN517Im+1T7kfyr/AMBSuTFY
+2x20MOc7cpeSSeQn8dXRptvlYsVNmzFZ2kEdpO+meRJB/wAt97/vGX+9XpShRtyt/mYUVJnqMPxj
+1ZETfYweR/yz+esfrUWc8svqf1/w5w3j/wAanxNfQTPAlq9qjp8n8VS+WR00aVSBzU9/Zz6ZHapB
++/T5/tf8Vc05I1hEr2/lwfP9+T/ln/drjk3c7IIf/rJKlteg7B5eyeT/AHKqKUvMLG8muv8A2adP
+g3+T/Hvf/lrXnTwy9pzHVPVsxfh/dzx6vr1inlwfarWb7/3vk+b5K9rFK9NM8mlo2jsNFsbB3h09
+7rej/vrp/wDlmu2vnMTWqWcreh6tM9B0K10iG1cWD70376+bxU6jl7wqoxNIebXpJnn3oib0h/8A
+iqp4i1JKxBzH/CVDQrh9GuvIvdOR32eR95fn3V9DRwMJVI1ev/AGc98Tbq/vYdN8Q6dvT+zpP38n
+8S7/ALjV6uW4xym4z3OKtR983LTwjJ/Y0l7dXSPqN7Gl1ZQp93y/vV5mIxyVRwtoejFe7Ypm2SOx
+eCZE89Pn+5/6FWSlKdROPUtxSRci8QukV1qFxbogmTyfLT7v+9XfTyeU6qjJaX/rqc+KxEYwMuXX
+otRuI5ZZI/LjTy/ufw19gsOsBRaX9fmfM0an1upzL+vyOink1Gz0ven3JtnkQI//AI/X59LEqvWd
++59LTp20KHh7XNSTTpDJG/yO/wBz7q/PWmY4NTqXuVQidFogtdakf7eXe6h2eW++uZ5niMH8D0+X
+6pixGHubVq9rD59tNJ/pSP8API/92vKxUpVp866mcaWhgi0utTupLqL53SbZ5n3fvV0ynyRvLY3U
+bRsQag0fh7WI7n7JuSdHTz9+6voIqeZYey3X9eR58KsMPLk7mXqF6+osLpLTYN/z115JmEsKvYf1
++RWMyuNSPP8A1+ZZsvEdokaQxx+TJ/y0/wBqrznIG/3kd/68yMDmKa1/r8CHWdfjaeMo+/Yn+sT+
+Fq6uHsm9kvaS3/rzOHNcelt/X4E9rcX3iXU40/jRP9Z/DtWvWqqGXQ0/r8zy3J4iZUutZ+yR/wBm
+X0CP9ln/ANZ/u14+FlDFT55f1+R7bi6UCfV5rExJ5H+ohd3tPnf7sv8AC1aYOq4VrF4mDnSuZEl/
+KUxX1Tik7nyEnOTsJ9qk/v1ZHKSRzyfvP3n7ygOUk+2fu/n+es+Wxt7S5D/aWySNKpRTJtcgk8Qx
+mTyE/wBZ/wA80okrDvzFlLuef/YdP+WdYupYX1e5YN/ceX9+rN5TkRHULn+/TOeU5EsF+H+fzP3d
+I6eYne7t0g8/z/8AtpQHMVf+Eht0/wCWjvUWDmCDWoHTen8H9+iwcxN/acD/APLREf8A550WDmKc
+/iF4J5IPkfZ/y0SiwcxGnieeo9kHti1Jr8D2kf8ABP8A8tKPZB7Yrf21+7/2/wDnpV2DmIZL95/v
+0WDmIfMjetDnJ4446AJ4LaB5Nn8H/PSs/aGnsiaOLZ86SUe0D2RTknjpjHwSeZJsoAseZIn36RZN
+HPB/z0oAnjuN/wBz/WVmdHMWY4LR/nm+SgOYsRz2kH3JK5Ypk6Fee+netk2PQo/bJ/4K15DHnGeZ
+P5lHIHOTxyXf/fFKw7k3mXdFguSR3l2n3Kw9nYv21x++eT7+yjmsPkuPE09V7NCjTsSxu/8AHS9m
+jpjoSRyVnUVkZqVyK31COSST+4lcUK1mbRo3L4uv++K7ZMiMLDnk3x1hKodERtu/8f363bMIxLcd
+18n/ALTrFs2jEy9Sn/efIn/bSuCwFOC7jef5/wCB/wD0KiwG9BJGkaJD87v/AKyoQFe6SRJ0f7/9
++OtkBo2F1sj+f/tnV0mRGI6fUZ0j+R61lI3SGQarO6Jveuc0Jv7V/wBYm+gCGS+/6aVaYrld7v8A
+8frVMLiWt08G/wDeViyC3Bd76yYi5/akiQf6z94lbKqR7MfpusO6bPM+5Wyqh7M1f7S86Dyd/wA/
+9+sfaFyMOTUrqykfe/yUe0MZFS7m86OOb+/9+s/a3NvZ2MR7/HmJ5lHLcftLGPPq8D3z2r/JJ/yz
+k/vV3xqnBzFe78Sx2vlwTyfc+St1JD5irP4gtH8z95vesfaCiixaalHPbyeR8n/XSj2xvFGRfeKt
+QST5I98HmfvKJ1UY05yLg1C4+yRvJ+4/j8uuGdVno05Mik1Gf+OR3/6Z1EDonTuV7ubzPLrthOxw
+zoFR5P8Av5/frCUjqjoUpLjf9+TZHWEo3OiMyG4vLfy9n9yhRDnIbjW43+T+5/q62SDnIJNYknj2
+PJsjqzOVW5HYeX5n/XSmYyhcuyX8cEcmySPzJKhI1nIqHV/3f+skkk/5aVvFHFORMbzenmeXI8f/
+ACz+es6grmXq/wBrj/eeXs/56UUwuEc7/ZPLT/V/9NK09ikQVd9m8cflyR/aP+WkklLlAzp7iTzJ
+PM/1laU6ZBasNTkSPy5JP3clFSAi5HcSPcfu4/3fl/8AA65uQ6+Yg/eT3H/LR5PM/ef3qdw5izJa
+Xclv5flyJvrCNS7M2J9n+w6ZJJJ88n/POt1C5gyWDW44NMjke3rGWG94XtDJj1yTz/8A0XHJXTLD
+aD9oPv8AWJPs/wC7k2SU1QRPtGUpNYuHj2PJv2f6utlQQe0Y+zkk+0f35P8AlnWc4cp6dzUg8ye4
+kR/uVxzFcv2elx+ZJ/rK551rno0MOdD/AG08cdpH5kaPax7I9ibG/wCBVyToc52tcpkR6nOknnxx
++fceZ5derHCac1zkUlM3RrOtXWmyQ6pH5fzp+82fL/8AtV51bDK/Nc2ioxK09xYJ/qJPnT+++7dW
+MaUjeOIuZFx/rN/367IKSMKtSwkccn7x/wDlmn+som10OWCLFvbx+Rvf5N7/ACf3a5pyd9DshE0L
+C/Gl33nQ+TN/vpuWsK8ParW6G4m5PHdeJHn1O82WyW0Pzzom3zNv8FcsKn1eyjrdisc7AOd7pskr
+tqSuaRd0c/L9rj8b24gj8+SfZ5cafxV6lNc9A8utpXSPT9RsfD2nwT31rfb7p/k+yfe+avAnN1Pd
+PUpljTPiJpOm2vyW2+68n/vqSvPq5PUqytfS/wCAVEYes+Ntcg1hLx40S6kTf5Cfwq396vSoZZTn
+HlWxBjpd2klxHP5H7h/nkgrscLOwztLa/wDD+oabdQ3Mc1rBNC8Mdqnz/NXmVqFRVFOPf+uplXep
+f8FXiazpMGk6h/ousaT+4k3vtbyv+WciUY+jGM+b+YUa2hr3egeHtXknmjDwvD8l1An8TLXn0Z16
+U7RW3miZ1XJHNeJtE0SwijjgkkQSf6yDfuZv9qvbyzPqzlzNXt6f/InJi8DKcCjpOjRyR7rXh3/1
+lVmGdSmrS/r8Doy7Llh3b+vzOse1dNJSztv9dbfPeuj/AMNfMRlzTcmt9ju+2VvCuxNEvbaZtj3e
+94N9Xjv4sWvs2HblF8OiP7U8fnpAif8ALT/aWrrRUlqHtiHW/E+malqO9N8Elqn7ven3pVr6zDZH
+GjQu/wCvxPKlitSXT/Es+majJa3WxEmRP9R935vuvTxOSqvQ0/r8TnljtbGZ441iK6uHt5D+7gf5
+JP8AgHzV6vC2Xyw9F3/r8Tyc6xUVUUjOudTFxbRpBJvj8v8AeRv8tck8lk67q+f9dT2sPnEZUkvL
++uhlSGST5BH5dfUJ2eux8o5t/CEUyWqSJLH+8ek43fu7FRi/tHS+D/FtppNpPG6fO8if98187xFl
+k8WuWP6f5o9rANU3creNNQ0a/wBQe5s5H+b/AF9edkuT1KT5ZP8AL/M2zHHJqxiJ4qgtl8iePz/+
+m8f3lRq+mlgl7W55VDMpOnb+vyK7atbDnfXW/elY4akZR94ik12PzP8Alo9al2IJL/UrqSNI/kjf
+/V0Byk+irI93JBdSSf8A2VceNrciLhROht9Ij8+NHd/M8uvFWZtP+v8AI76eGMm706CO7knj/wBQ
+mxI9n97ZXsqtcx+r2Gfa/L+eeORPP+TzK2ULhexom4i+1+e8++NEqipTiV5NQmdJP3kjx/8ALTYl
+M55TiU4LyOOOTZI/z0zl5hn2lH/1nmf9c6A5hkhO/wCRPuVdg5iaO4Siwcw/7RHRYOYZ5sFFg5g8
+6P8AgqOcXIPjf93v/eeX/wA9KOcfIP8AtEFXYOYfHcJ/BRYfMPjed5Nn3KgQT+ZBJsoAbHeT/wB+
+o9mae1H/AGyT7lL2Ye1Gef8AvKYyeO/k/gjoAkj8x6RZNHHAn3/noAm/tOP/AHKgfMP+3xvQHMHm
+l6l1kP6sxnmo8/kJJ+8rF4lB9WYv2mP/AJ6U/am3sSGTVLRPM3yffo9qHsRbTWLOf7k9Y+3Oj2A+
+PVLf+CT5KPbi9gLJq8cEEj/3Kw+tXNPqljMk8VziOP8Av/7FHPcOSxoXHiSTy43pc7HKFht54skg
+sY3j/wBfT52c0tC7Br73NpG77E3/AOsrPEVzWNGxm/a7uOSREk2Rv/yzrkaubRlY1INSvnjk+49a
+xxFzWUBx8QeQke/59/8ArNldEY3OeRJaeIJ3k2eXs2f361cioxLT6zsfe8lYuRsoksd9aTx/JOlZ
+2MDJt7uN9SSBP4P9ZIlFgOt02OCby9n8dc6Aqa5d/v8A+58+z/gNaoCa31KDMaPJskf/AFdTSZpG
+Il2/7vy/4K1kzaKKsfmJJvST93UkkyTyI70AO+0f+P1CZz3IZ5I/+elbJhcI/wC+9JmhMl35MlZM
+BLq82f8AA6FEz9oV7S/dJK2jEPaG4mo/xp8jpRyFyLU80eoWv/TdKOQxkZbyOfM8n+D/AFkdc3LY
+29pcxNSsJ/M3p/HS9rYPZ3MDUtLsPM8+6kf7n7uNK1VYPYGfO1gn34PO/wCmj/erRTYewMZ5/wB5
++4/1f/POu2dMxjE14J9nlz+XvtPL3/JXFNWNlEWfU7N5JESP/tn92p5GdDlEgj+1v5e+T7kn+rq1
+AhyRWuJZEn8jzP3j1lsbe0GeZ5lxv/uf6ylzlXILu88iST/nn/z0oUiJGdJJH99P8vW8Y3OeUytc
+S7/Ljkk2R0kh84yOXy462jEOcguBG8n/ADzqC5RsIhkjj8ugwlWsWJJPL8tHj8v/AKaVpFG05GZB
+rE8En7j/AFlbxRxTkXf7X1BPn+5/uVy1CbhPcXl19/8A8h0UwuQ3Ee+3jjj/ANZV8zNClHpl/wDa
+PIgj3+ZTVVARz6ZfweX58ezfVwmZj7DTL+7uNkEe+ipMDq9M8L39pd/u43fzI/3lcc6hpzF+08Ka
+nHJJPBBGkj/364pV3cOYsyeG7vy/9Ku0R3/5ZwfNWKnYpkEnhTTJ/L+138/+r/uba1WMSMGP/wCE
+N8NvB+78x4/9ulKvUUtBezIY9A8FwPs8jz5E/wB966ZV52H7M0/7K8Np8/8AZkCf9M3rnUqv9WH7
+RDfN0KD/AFdpAkif3IK1XtP6sHtEed3tvH5n7uu2MrHqYhXJNOjkjeOd4/3dZVlcMPGxpC43+Zsk
+8usYUzupzsXLWP8AtGTZ5kcEccf+sk+RflrOorMVRXK1nJJaSb4P+/dbVHBqxth04jNU8QX91+7T
+9xB9zYlRhcJGLux18U0RyXGzy43/AHclbSdzC5akuPIt/wDXx/v9jyR/xVg43H7VAbvzII0/5ZpU
+RhYJO5r6JJY2sAn1Tf8AYp02bE/1tcteEm9Nzak7C6tqmi+faT6Xa7ERP36T/Mu6po0Z2amwk0zp
+dBgvtdtZ5rqSCbZ/qIE+98v+xXmYzkw7XKbU20c/rJsbK/dE/cwJ/rEd/wCJq9DDxlOGu5mqhz13
+4jjuPFmkz6cmySyTZJPB8rSV69Kh7Oi/M82MubEX/rY1TfyIJ7pI+E+SOP7/AN6uJUlzano1IlWw
+tJ54HeD5/I/1n97Z/eqq80nZjpognt7t543j+eRKui0kZchPZweXJBO8ciSeenmf7Ks+2htN2GdX
+qttd6d4he1g/0lHRH8xP7v3q8WlUVWjzS0Z2SnZWG+IGsbLVrHxDp8k7yIiJqVq/93+9urTDtzou
+i+t7HA42dz0WfX9FXRINZgn3wXSIjp/e+f8Ahrw1h69OXsu/oaz1OZ8U32jazJ/aGnxunkps8jZt
+/jruo88Hys3o6EGk30Nlstmk3u//AH0tLE0nP3kdUmdDcea9lNcw3UKI8ex9nzeZ/sVyYSsqdSzi
+3+BzuSKuj3832SBEnR3tk/c7/ut/sUYmklNtrcqxfsAkd0k/yQ/I/nJ/tVmqrjtqFxs3gi0ZZ9Q3
+u90/z+R8irub+GvV/wBZ5qfJ/wAu/wDgf4bnl0suSl/X+ZhaxoH2qNym9NQ2fuLR/n+f+7vr0MBn
+8oVf+nf9eVy8Zl6a/r/MtaFoulQxwQasjpdPB+88/wC7/wABrLG5xi7/ALmWnpH9Uc9HBRluYvjS
+xg0yRP7Pjd02fPJ95d1exkmZV56Vd/l+iODG5bHp/X4nIzeILg+Z+72SV9T7PqeVWruWhUu9Uu2g
+8z+/+7qUuZkYiVqZWk1B3/56eZVC5g+0CgOYT7RJs2f36ZAyP7RQAkcNw8n/AF0rSrVSjY5MNS1O
+qF/HaeRvj2Tp8knyfKrV85Ud5XPbpe6io93J9ukdP+W6eXH/ALX+1Tda8LGdONjS0vWo3v8A7LPG
+/wBrT/lpvryHRvqd8HoT6vFaJ4fuEgj2TpOn7uu3LqkXVucmIonORpfz2u//AJYJsjr6ZV4uZwLc
+sWMcb21wn7zzEqZ4jlN8MvdOt0+CCAyTv/qJ4P3aP96vIxNfudVBamV4ltEQQJZJs+Tf8n9xq6cs
+mkrHJXuznwtwDskr1JLU4Y1OVlu3u79I9ifJH/y0kqSgjjj/AOWclAE0ibI9/wDyzo5wGRpv/dpJ
+RzgEdh/HR7QCSRJH+/I70c4Do7eP/vugCSOOCP5/noGTrGr9ZPv/AO3ScjSlGSC5jZPM3/wUKQVY
+yZWFyp/joc0c0ZykTRqZPnR6xdRHRGhJjooZH+/8lX7QmGHaLgj8iPe9L2h0xhYrtqMkf3/kjT/l
+nWM6xjThYZp+tb7+SCf7n/LONK4p1D0KbJ1XzLiTZXb7axx06NzP1LUnt3jjT/Wf7FcVeVz0KceU
+tJf339m/6iTzJ3rKMS5TMQ3GpwT70+T/AH3rWMDCUylcXE//AC3uE/8AQ63sZ8wySWw/jnd3/wCm
+aUWDmLFpqWmQSf6ufy3/ANulym/tyb+0dIST/UTv/wBt6OUPbli41zTJ4/ntJP8AvusfYHRLEoiS
+40V4/wDUSJ/wOj2BzyrF2O70n/ng/wC7/wBuiw+YZJPoM/zvbv8A990WDmCPWNMgk3xwT/8ATON3
++WrdIPbFm01/TEk/49P3m/8A1j/vaxdIPbGmmtefH+4u/J/7YVnFBKRRNhf3UnyXcb/7/wAtbxkc
+8o3J5PD2rfwSI/8AwOjnNSt9hnSTY/3/APfo5wJ/sMiVFOZZctIJEj3+Z89E5gdb4b8+GB7p3/1C
+fu65lEzRRfyLp33yI+9/3lF7G6Jo9J03+Of56OccY2I7cxpI8H2v7lSdEZWJLeWCDzP3n/j9c6p2
+Mvak88sb/cffW0adw9qUoNQjR/n+d/8Alpv+at3SM/bD57yN/uRpsesXSD2xDHeR/u4U/wBYlJyG
+pGh9ok8uN3TY9YykbRkVUukuvnj/AO2kddDkY2JrT9zJvfY9ZNhYI7ueeTYibN//ACzroSQc9y1A
+t1DPv/uVqkg9jc1XijdHmT7/APGlZygi40+U5m+1OSCSRPvx1zyoo6I1+Uw7iPz/ALm//vjdSvYJ
+IzpItkmyeT7lK9znlSKbwWj3e/z/APb+StuYcYlie7jeSP77xv8A6uOjnN4wI+E8zZ/A/wDwJd1H
+IZ3CPU/P/cQfPOn/ACzf5N1HKFyGS7k+37/I/f8Al/6usFE6Och+2bPMk8vZv/5Z1tGAc5B5du/m
+JVxiZuRlx2kn2jZ5n7ut4uxi5E39mWflxz/f/wCmcdRzMIxFt9Ej+0b0/wBWn+sjkp+1ZtGIX+i2
+8n+o/wC2n+/RzyIuElhH5ccdPULkUlhbzyf8tKm8TEf/AGL5fyeX/wAs6LxAZHpN28n7iOR6PaJG
+Jfg8G6zPJ5iWnl0/rSQXNaDwHdJ/x9TxwVwzzL+v6RfMath4SsII/wB3J5+/5PnrinmC/r/hg5i7
+Jodp9xIIEk+/8/72p9oHMEdlBB8/3P8Ax2j2ocw0SQSJ8k/3P+Wf3qzjJsy5ipf+e8caRyR/P/fe
+t1G4cxmR3HiGD/XxweR/sfK1dEpaD5izHd2if6+7SB3/AOWabHaudwbDmCTTtJk/0qfe8b/8tHp+
+0bDmHx3+k2sexI/++Eo5Ww5iGS+geP8AcWkjyf8APR/lrblIId8E/wDr/kk/55799LkA4uSwt0v5
+I4J5J4PM/d3Gz/2Su+Uj27XIL95IJPIguPPgT/V/3a2pRuFrFWODUHuPLjjkkk/1nl10ukZOdjYs
+7eef7PJ+8SB5NnmbHrzMQrHbQ946HWtUtNPkktdPkTLwbI5IE2/7++uDB4edTVnROujBSWJLDyEj
+TzPvyT/xV0tS5rHFOaZBJBafZ/PeTfJ/zzq4yZM3YoSHy5P/AEZW8Y3OGdWxfe4tDH8keyT/AJaV
+hytHfRdyS41e4njjjn8zy0jRI/krTkTNpSsWtE1DRfPjg1De6P8AJ5CfK26sMZTqPVDpNM1LhLu1
+89NOu3gtUffHIn+v/wC+646Ps5te0WprJtGLZ/uLO4nnt9928m/zH+Zm3f7VenWinZImnD3Wyn4L
+0g65r0l9O/2WD+/SzGq6NG25zZZS5m5HZa7oqQ70tdn2WH59/wDerw8JXctZfEelURs6Db6BDpWy
+NPOndNl7/wDFVx4qdV1NdF0CmjNk+w6XcZhj/eSfJab/ALtehFyauy5wsiDU44ntJJ575Euodnlw
+bP8AWS/eow+stjhmaGj6lOdV+1b0eZ4Hm3um7/VferKpQUYuFv63N27ss317p2tQRxwQ/Zrp32Xz
+/wAO1v8AZrmoQlRleTvHoU1dDrbRY/D+lfYb+SR7G4ffaxv/AMs1alVxcsRU5o7xMqTuN0aS08+e
+1Tf9lf8A1abN0n+xRiYyspG89Do00fS9T/0P5Evdn7h0/dXHm1x0J1FLTVfgW5GLPptjqkH2XS32
+aokb+fAn/LZl/wCedelhlNy+HT1MnIy/DVqj2l2829P7PTfOif8AjtXik+b1NjVt/EDvAkz/AH0+
+TZs/1i//ABdcE8Ir2QWOivNRu/7Ltbqwn+5vdEf+Jf8AarzqdKPO4zQ5pplC71VLm3sb+1/fXr/O
+8H+0tddLD8knF/CXON0aCeLtUkkeaW1T7Mn30/ijrGeBpwa5Je9/Xc5nSUthkFto018k6Jsd0dHt
+fuq3/AKbxFVK0np3HHDpbnI6l8OI4NXR1n32Tp50kf8Ay1Vd/wB1a+pocTOVKz32/r3TwXly5v6/
+zOU8c6THpdzB9kR0gdP9W/8AC1e/k+P9tG55uaUOXQ5j7VJXs2PJ5w82gOcd9oekbD/tEn/PSgDX
+0IRzxzwSf69/9XJJ/DsrzMfVszfCUyLUrzUxfyI8cnyf3/4q4L3RvifdJ9Jt7ibzII5PP2fPH5fz
+J8tc9SNkb8tizDa4vrifzP3nyR0qrtAnmsaNxrsF1JHav/y6yf7u6s8PhXTRdSXMbmkt/aPyPHsT
+zN/l/wC7U4itKGo6WGTMbR45J57tPLjfZI/mfw17OIfLI5sPHQ0NCvoLXzPOj2JA+x97/e3V5uY3
+5dDqoLU2rFY7rzPtsaPsT93s/hirljjPZysazw10cPq8VxZX0lq/+Ur6nC1+eJ4GOoWZT+1yJXWQ
+Qfb/APtnTAZJd74/nk/7Z0ezEMju40o9mBPHqcifc/1dL2YD/wC1rj/tnR7MB8epyfx0xj5LiST/
+AJaUgBZGj/5aVgpHbVjJBDPLJJsShyClGTNPfbeX5n9//V1wuoejGjFF6O4t/M/cR75P+WkeysnU
+NoyiiNLa+n8x3jf/AK5v8tX7QzlRRj376lPH5E88EEaf8s3n+ej2hzygPtBYQRyfatTjkkf+5vak
+T7MSCTw9HP5/2+R5P9v5f/QafsydiGXX7Szkke1kjf8A77/9mrWcSXPlK7+NtSP+r+TzP7ny06dK
+5Pt7mfca/fv5m+f79KMCJVCub2R/9ZJJW8YHPKoN8yixpzBnzKLBzD/KkosHKEg/6aUWDlC2Mh8u
+P/Wb6LhB3LIfy6VzqjC5NBcJ/rPMrGwuYPtCeZ/rKLBzD4x/00q3MOQu28Xlyf8ALOsXIOQuR3D/
+AOrj2VEoijK5KJ7hP+Wf7ysJSsdMY3IJL67T/lpsrfkMwgnfzKOQDUjnk8us6cCy/YvPJ9+nOAHS
+XU8droex5P3k3zyVFNGaMrTv+PB38z771xYqVjdC3d86eX+78isITudEo2OduL+SbWt//LN/9Zvr
+sgYSlY62xjge0+f5/wDpolc9apYz5B97+5njRP8AtnW2HqXDkKeN7/c+/XY5EcpSu763TzIPuSJ/
+yzrKUw5Cnb6tHDcST/ckpOkEWTv4h8/y9/8AuVhKmbplrTZ3g+dI/wB29Q5G9jftHnSCNH2P/tpW
+TYWB7y1gjjmeT79JXD2Nh/8AbMDwSbI/nStkmHNYIPEOz7kdaxgyJTuVb+6T/j6REnR/9ZBW8aLM
+JI5Z/E08M8iJHso9jcI4i5RvvEVv9/yN8j/P5j/e+Wh0bHRGpczh4nt55JHeBE3/ANyj2RzxrCv4
+ijf78dHsjeNULvVrB4I0T/Wf8tJK25SLmT9sj/ef3/8AnpRyBcv/AG+z/cOkkiSQf6ysVAfOQ/2h
+aSfO8n7z/nnWqiHON+1/6zZBJ5lKUS5Mt2NrrU//ADDH/wCB1hJnPKRpQeHtd8z/AFEaf8DrOeJB
+VzTtPDz+Xsup49//AEz+auKeMSN1WI49A01JP3/nzx/8s/uKtL63Iz5i7HZaNBJHvg/ef889+6j2
+8g5iz/oKfctIPL/8erLmYEMlwU/1kECfx0uaQEEGu3H/AD0j8v8A2Ero5JMyK1/rCeZ/x8O8n/PN
+HdaX1WTGR/2tAke95IIP9/e1JQ8jO5Wk8SaSkn/H2n/APlqvq/kFyP8A4Se3kjkeCSR/L/5af/ZN
+VfVUFytqfie0T/l72Sf88/vUfU7hcpR6m88fnz372sf/ADzRPmatI0UZ8wSeLdBsY/8ARZHup/8A
+no9arChzFL/hKbi6/wBXHvj/ANytngrf1/wR3NGO8kjjk8iw+5/rJJPkrNxURcw63u7+eP8Ad+Qn
+/TTe7f8AoVRyJBzEn2m3/jk8/Z/y0+fbuo9rFBzCz69An7tPLnk/6Z76rlNSP7fdvH+7tI//AEGj
+lAmh1PRT4U+26ciPdQ/JPH9yXe1cdXDTVZXeh9RWlGdNnN6Fq1tYan5/34/+ef8As/3fmr1sbh1U
+hY4sthGmzT8UalaXVv8AatKgRJ/9ZP5H3tif3q5Mt54OzN80pR6GXo2t6vPZ/ZUk/d+ZvjjjT591
+ehjIRWrPOwc3EZJO++Tf88j/AN+uaEISWh0sgkkoi+VmTC3/AHkkf7zZH/q5I46TiJRJ3jTzNkcf
+7usWjdRJ5RZ/u/Ok8iN/+WifN81RSbKlAzpYpJ/kSN/Mf/lo9dNJxT1OWUGaunaHbmONJI/Onf8A
+8eauWti5JdkdlDCc25r63oD6XYbxdv8AanTf9h2btrf3d38Nc2FrxqS1RvOhybHLyXF3fSSaUkfk
+Sf8ALxPO/wAqotexSoqOp585cxt6NPHptv5Glb7qNH/1mz+9XnY2Maj97Q9HCT5UbFjcX91PAl1G
+/wBl8/59/wAq7q4KlGMYuUexrfmO5+w2+mR3V7Dpzpp8yfvLpJklVdv/ADzrxpVVVfLf3l0Jsed6
+vqb6nP8AbLmT/Sv+WcafKte9QoKEWkZ1JXDRdI1O61KCG1/177/L31datGMQp0rk2k6Y91HsTf8A
+boJPsskf91qzxE2t9jT2aNS103VbKd0eD/ro6P8ANtrjlUhLcFTRZu5b7VJIIXknuZE/c2scf+1/
+t0qUIUmzX2hp2Ol69plul+lq6LC+y63/AOtbc/8A7LXBWrUqknBvXoL2p6CLDRzbyQwoiO6b3dPv
+fN/t1897WpdNiWpyenaTLocC36unnI6Om/8A1i/7lexUxPtZWNraHKXes/Zddu71I0Sy1b557X/p
+q3+sWvbnH20b/aRhTjoacl9pyIkln8lrM/761f5m/wB9K4fZSbs911NacLMuR67aJd30MyPNpaf6
+jZ/yzWoeFWjW5cZtGTqGryJaQG1tM7N/2vZ8vy/3q66OFUtWzCrXaK6SPO6fYpN6P86bP7tTKHL8
+aOuU2zXg+1vfb9Ud0dH3vv3/ADf981g1C3umEkzS+1vdX0kNtPvst/yRzf6+OX+7/u1pGjh4QvLf
+5nMoyscZ8RbDxPexSTiNPsNq/wC/gg++rf8APSSvpcinh1DRW/8AAj5/MEzzqOND/rK+rep88qzZ
+L5dvUczRpa5FcOf+WdbRVjTlIyP+elZVVcTiaH2i7+yRpayb/wB5/q68vEu53RLtvHcPdx+fJ/20
+rzZyN4mzd313Yyf6DGnlxyb5I/u/N/t1kqCQFN5J760nnSPy4P8A4mtVZAP02Dfdx+R887/6zf8A
+3q0rTRFjpYx+4kgeP938/mfwtXGrCscxZyz+ZIkH+reT95X0FalFxucdOlY3o7ef7d+/jfe//HvG
+n8W2vFr001Y9CnobmnX0E0c/k/JGn+vk/wB2vIlC8zfD6ROX8STwX2pyPHJGkf8Az3/5619dgo2i
+ePitZGHPJH/BJXcQUo/L8z/pnQBZ+zwPHJ+82f8APOlcOUreX+8ouLlJvJb7/wDyz/56VpzRJ55E
+1vC3meWn7yT/AKZ0c0Q55GhF4fv7mT9xH/338q1zyxLZVLD2ZONFt43/AH+pWqbP9Z8+7/0GueVV
+no04hPHoSfPPqUb/APAHqFWbDExIDrmkWg3wRwf+P03FsMNW5StJ4yu/uQRon+4lP2Qe2KsniO/f
+9288n/APlo9kHtijJeRv/wAs5P8AvutzAZJJaf8APPy/+B0AVftEaf8ALSgCOS4j/wCmlAC+ZHQA
+eZ/0zoAQz0hSiK0sho5DlnAT7RTOsPtdAEn2igA8ySOgDT0K3jvrvZ5myRP3kdc2Jdgw0bmtf6PP
+5n+rjkkesaOLsd7wtzFkt7iCOuqFZM53CxEnmPSqK5jJ2J4/M/gpFmh9vnj/AOWlAE8F/cf8843q
+HA0LX9tXf/POOsJUQKkl3JPJvetjMnjuNnz0APF/IkdEQia+ipJezxolY1TaJu+IUjd/IeTYif6u
+slVbNZyKdhcfZfMtfv7Hrirps3oyK2pX8f2T55PuVVFA2cwl5/pHmRyeZ/z0rraMZSO18M6xH5ex
+5Puf6uvPxFCxVGB00t1Ake9/9ZN/frmehvOAy4v4/wB2nyfPWrgRKVzk/EPmT38f7v8A7aV10dDB
+xuY32SRJ/n+eP/nnXa5kcpc0nSIPMke6/wBX/wAs6waDlOgjv7SCPyEj3x/8s65VTOnnJJNWk8v5
+I/8AtpWqpj5zGkvJH8x3rSMTNzK6avs/9qVtGBzuY99WD/On+rrp9mRcZHqT/c8z5KPZhcyL9pN+
++q5TP2pmYkn/AOulO4e1M+TT7jzP9XJSfKh8pctPD2vT/ctNn/TST5axdZIOU0P+ELu/L/0u4TzP
++ecfzVz/AFqwWLkHgWJ5N8kc8kf+5R/aKX9f8ALE0fgcR/6uCR5P+We96h4wn2JMnhZ3/wCnXZ/f
+SsXjQ9iROJ7W48vzPuf886xsma2Hx6xJJJ5c/mP/AM8/L+Wj6umHKado7p+8+ybP+mk776zdA0HS
+arbp8k8+yT/lpGn/ANjWEqIind61O8f+iwJ/102f/FVaSGVnn8Q+Zs/dp/3xW8Yx6gNjj1bfvur/
+AGSP/sbK1aXQB93sT53u0/657N1YyU+gEEc99dfJa+Z5f/LORErRcpnymfd2fiHz/wDWSf8AAErZ
+coWIP7FR54/Pnnff/fkq/aMz5ST7Bptj5knmR+W//PNP/iqPaMOUqXcc91BJBaWn7v7/AJlL2y6B
+ylq38PWEEfnzW+yR/wC/TWJn0Cwy7sIH+/5b/wDTP/Yo9sw5Qjj8NWNv/wAe8bv5f7uT7zUc7Ycp
+mJqGpXXlx2s8aW6Sf889lXUjDsHOWY5NS8uT7Vd7JP8AnpRTjDsHOQx6bd3tvIn2/wAy4/5d/n21
+SUV0DnCPRp4PLke48zZ/yzk+5R7aK6B7Qmjlt7WT5I98n/TOlytmfOVbjX5Ekj8iz2f9dP79L6s2
+HOc3FIYIvL8z/WV6NeHNO56NGcuWwscfEknmeX5cf+r/AL1JJN2Z0SjJRuNtNWvPNk8j/WTp5cn+
+5VQp9ThqYyUnqbvhtJLF4L7z40kSf/V79srf/Y152L9+6PUwU1bU6Dx3/Y8N9BDpmx08lHk2f3mr
+zMphUkm5blnOfZ9/+3vrvm+VmUiT7PBJHUuozdI1LfTP3EbpHH/rNnmP/C7f36wdU2SIf7Iv/t7w
+Psn+yu/+o+Zf96reIi46ChE3hdWF1BaWvkJD9ij/AH+x/mk3VxKnJttdTojBBBceGkn2PfeRfJ88
+e/f8tDpVktUaKrzbFjxbrE9vYR3s7z3sF7P5f2t/l27f+Wa1eEoObMKmI5Nzn9B0iPWBqUj2k8Fp
+dSefb3+zc/y/wV3YvFeysrnLClzM7TwVPNGn/CP26QeXM+93f5W+X+Kvn8wTa53c9KnR5UR6dYXe
+o6rfJqEj/uZP9E8j/VNt+7WuJrwpQtHY58JO53FhGk2ipp+pzJMjvstYU+98v8D185UuqvNTVn1O
+yotDiPGdhpyXs8lt5EPk/J9lT73y172AqynHUxnSsZuiXlh5kH+vR0f9/dfw7W+7XRiqUuUISsX3
+tNOnd7qCf7Nqn37Wff8A67/pm1YKrOOktY9fIydNli+8L+JP7SH+npe2qoj6jJC+1v3n/LOnTxtB
+brV7bh7NnWaBFY6Zqv8AZ8Nzvh8n5HdNu5q8PFSlUhz21udHszoL7VLeG6tbLzt7zP8APD/st/FX
+nUqDlFysHsjya4/tHwx4hey1CSeS0uv47V/9Z/wFq+woRp4qmnHdeRx4WtzFPxD40fU7f5p990n7
+ny/ut5da4TLFTl5G9atYxpLyCS4jkfy/k/5ZpXbCjpZEe11Og+0T6vdR/ZY3+RNiWifN8q1xOPsX
+qb+1sgfUHh/4lc8ElrfJ/wAfcE/3mqq+FcdSKOKUjQtJ44ZEd496P8k/+0jfw1wqTTOidmWrXSY4
+4J57KT/Vp+7tN/73YvzVdaU5P94U6iRS1aTXILGe6/s2dIH/AOXt/wCGt8NQoz2/UyeOijP8PeNY
+7bUt80m+N3/fx/3lrXEZfKMNERDGxkjW1/WbdNR/tvSL6TyHn8uTzPutvT7r/wCzVYGnKMNVY8zG
+pSOWvPDWn3L3c6T+RPJ88dv/AMsvm/hr16Wb/wBf0jx54FRMDUNMnsZ/Inj2P/yzr2aOJU0efUXK
+JaW++TzJKdWtY2sWZ/s/7vZb/wDjmysY1rhYoCSSD9/ayfvH/wBZHJ8/yVxp3RrE6OwktJNM2P8A
+6xP3nmf7X9yvLry1sbRK1/PaTvHs8tJIf9ZJv+9/dpLmYyGS6uLWPyP9fv8A9Z/tf7Vaqg2Bv2Oq
+2iQQbI0SRJErlqU2y+Un1bXI/I2WUmySeTzJ/wC981VToMOULdI/3l1dfwfJ5n8X/jtarFycSHCx
+B594+rfZYLuT5/8AVz1apNxuI6H7Xb6dpkiXWx7SCP8A76l/ut/v1zUYXkdO0Tz2+u/t0u+1tPIj
+/wCWkafdr6ujG0EeNvIo/aK0MzQs7ff5aJbyTzv/AHPnoGX5PDt2kn+lSQWX/TOd/m/74WsLnRyh
+HHosHyXUjz/7ieUn/fTfPRcLFm48RaBBHsgtI9if8C/9DrP2TK54mZceLrqST/Rf3H/XOl7KQueJ
+mXGuX7/6+d3k/wB+qi0wc7FL7W9bxgifrFiMTvL9+Ss+VIft+cXy/L+/R7ZIagG94/8AlnU8wcge
+e9HMHIR/aP8AtpVAM8ygCDfQAb6AH/vKAJI47h5I4I4/3kn/ACzoA1LjSJ4LP95HH5nmeX5nmfdZ
+f4a4YVjaUTLkjkjk8uT935ddsKhhKJHTGLHQBNHJQBakjj+z+Z/y0oAveGPLe7kf+5HXBjHc6MPG
+xq29y8d3B/fT/npXl04Ns7nXsaGp2H2rTLidP9Wn7z+792tMLWbYVYWRxjSf8869uGqPIraEn2io
+NR8dxJQBo28n+j76yjUNBsck7+Z/sVvFjLdv5flyP/crEyIJJ99AEgeSiAROh8JyR/a5J3k/1Ef7
+v/erGobIgvL/AM+7kfz9klWkkTORPpBnnt5H+/Pv/eSO9cdeskb0ZGfrX2iCPYnzxv8A6ypoxG5G
+FafPJ+8rsaMJSNrRzOk/7v8A36zqq6NKNY7PMnkQPdSffRK44ULs2nWL73GleRG7yVUIXM4yuWv7
+Z0Z4402J8n+r30qjsbxjcpXc+kvH+4jRHpqZnymI99abP9Z86f6yto6hymbPrf8AcrZUzl5zNk1e
+/etVTHzkUhu3/wCWlKMDKUxJIZE/1nmf9NK2jA55TJ7dI0k/1clTzl8xppp0n/POTZ/yzo5w5jWs
+dB86TY9vvjrmnWNPZFlPDU/yOkcabP8AlpXHPEsXsjTTTbFPvyRvI9c7rSZvYm+wSP8AOkabKxak
+w5SP7Bsj3vJ/3xWPM2HKQ/ankjk8iCSd0+Sj2bYcofaNSeP54/ISqcWPnH/ZPM+R98++sZU2HORf
+2Zv/AOWH/bOtLSRpYZJoV28H7uCOCR6TrSQWKX/CMO/+vjd5P9+tHiDMl/sOOD54LTfWEsTYBY9O
+3xyJ9k/d/wDLP/erSNXuBDJoWpTxxp8if9M0rdVI9QKX/CK33mSQXVx+7/5Zyb6csdDp/X4DNCDw
+rYQR745E+T+/826snjX0/r8BXLMdjEn3J5E3x/6v+Gso4mJpYrx6VHJJI/2uR43/AL6VtHERCxkX
+3hyf95s1b935n7vYiVr9cRnyjE8OTwWH2WCfzpH/AOWjp81DxiCxCmha6kn76/jSP/YStp1YdAsX
+4PDdp/y9TyP/ANNPuVxTxLWwWI5/DFn5ey1nSOT/AJ6SfNShjV/X/DBYzh4FuvM8ye/jTf8A7Fd0
+MSgsXLDwPpMEn398j1FTHT7f19weyGX/AID0K7k/18iR/wDPOinjp9v6+4PZFJ/hrosH+ru5PMrX
++1W+n9fcP2RJJ4E2Rx/v4/n/AL++j67J9P6+4PZEH/CDzvJ8n7v/AKaQVX11L+v+AZexD/hBIv8A
+WT+Y7/8APPfS/tZL+v8AgB7E8k82Q19K6fKZxqcxYs4ZLiTy/M/d1k69jVYfmN3TtKu3uI/It97v
+8nlpXBicTDl5pnbRwtjqfEngW68PWNre3k6SXVz/AMuv91a8bCZqsRJxjsjaSsZE6QTweYn+sf8A
+1cf8ddaXKjpiaFpYXFrHJp11B+/+SfzP+Wuxv4Kyr1NUzZE8nh24h0KDV/L8mDz/ACZIH/76rJYm
+Lny7k1E0Un1OS6tPsUP7ixf59ldX1WMZc5VNsWwuLeOST/S47V0/1e/7zVlOg5K4/apMzdaubtJL
+eQSbI/8AV/J8v/fVdeXRVzjx9a6Kdpbx6lq/7+42ef8AvJJJPvM3+/XZiY8kTnwCUpWZu3Wh6ZHP
+HIJJNkEn7yOd/N+7XmfWZNaHrY3CqEbo3rbV9T1TyEknjtoEfy/k+Va82rh4QTaVzrp1pdT1i10H
+Q7ax87UIE+RN73T7W+X/AHq+Tq1a/PaL+QVHGW5hQ3fhya0kg0BE3u77HR3+9/s11zp14zvWf5Dg
+tCMeGg9t/aCQ77597wXu9/vf3q0WYNS5b6IzhT1uYJ0Gxexu9QeT/S4ZPkgf/Wzf7v8At16Srt6X
+IqUiXUdF8NpYwf2ej+fOm+eB3/1Mq/eXatN15XCnSMjSdJhnu5Ibp4LaR/ng3/d/4DW9aq4R01N/
+ZWN6xtbrS7t3tpE2XMOzz4X3R/8AA682pKNSNpdGHNYx5Z7ey3z75LrVUf57ud/u7v4K71+8jytW
+TBpIyLjUL/z/AO0Zn+5s++77vlrrhhFy8pzyxDR1yX7eNYtR1C5g2WtsieR5nySrKv8AzzrhnhHl
+7UY7v+vMyw1RTRy95YaTNp0Edqnk6layP+/T5vOV/wC9XdHEy3kQ4yT0OfktLie3/wBZHvT/AJZ1
+2qpFItI7DwZaarG8eoW0f+l2z73g/wB2vIxtSN7GqR3hs9O12Tz3t0TWPn8y4f5vMVq87FZjOWnT
++vImGE5TMvrR4IJ0mst/2P8Auf6v/gFYUpXas9zthoR2+hPdaJb61bSIkGx0nf8AiWRX/wBXXo1n
+KK8jGnpM2dV0vUIPC09+/wA4gjfz4P7y14+DqQlXt00LxdQ+dLiKSS5jnj/1c/8Aq6/S1O0bHxXs
+9bml9k1eC3kj8uT7I8ieZ/wCuSMkmdV9DW0bUYy8ifc2f8tPvVw1YSUS8LWudRq+nwX2jQTp/pUi
+f6uT/ZrLC4pwZrXo85hXFvYXXlpBBHBJHH5knz/xLXbHEtsyqUUYbXYgu/8AWf6uu1SckVSjEksN
+St7qT93BH/ckrgq0uUwNCNN8/kQfuJP+Wcmz5axhICld6ZOhjj8uT/r4/grqoVbxMpx94t2ot/sc
+DpJ5Em90k/i3LXM43Z1zXullbi3eT5/3H7v95JH99aFtoRWKmqSSfu4E/wBYn/ff/fVVhd9TGBtp
+5aWkcEfl73+f7+/y/wDgFY1tzoH2MfkXe9JJPP8Anf7m2oq7AdHcfZL3Tfss8Gzz9nlx158K7jI3
+lEjhsNN/1Dxps8v95H91flr06mM905pUbmHq2iW+nR3GowXfl2kf/PCBN1dOGzapWdn/AF+ApYOK
+OVuPEwjk/wBFnnf/AJ6fw16qjdXZhK0Rlxd3j/8APNJJI/M/vNSVQmUCpqEUkE+yeTz/APnpJHW6
+qHPKmVt9p5dxsk/+yo9nY05Q+0SRxx+Z/rE/eeXRz2CxBcW8kcfmf8tKdwII5PMk/eSeXHRcC1bj
+yLzZP/BJ+8jpSmEYks8f7yTyP+unl1hKZ0RiTGzkn/f/APLP/nnUOpeQnCxl3B8uTy67W/dMZOxX
+8ypELTAKfJYe4+O28zzP3nl+XH5lO5DpGt4fd/tUEHlyPHv/AOWf+3XHinaDR3YeCZ6Nq3hnRH1L
+7a/mJJ/z7u/93/ar5qlmEoRa/r8jseETNKCDSvs9oj2ib7r5I9/+5t+9XPVxE7aHazjfiPplrbXd
+vJZR/uH/AHH7v7vy17eS1JN6nl4mFzhzFmvcbuee43JrSxnu5PLtI98lZurykuiWYNDvnMkn2eTy
+4Pv1k8XdlzwPKyayu4J7fY8f+rkrLE6o66Puhp9xGlxJ5cf34/8AV1FWNgjO50nlRyR+fJ/r02eX
+sf8Au15tWdjaNG5r6Zc3cib/AC4/LePyP9n/AGq5qq1OmNS5havocC3cmyP5PM2SbP4a9XCT0Oet
+Q5jB1HTfIn2f8s69G5x1sPYiEcgjoMKbsbFhZzzxx7LeTzPM/wBZHWbkaRgalvpF2k/lz/u45/8A
+x7/drGUjeMDXsNAeN9n/ACzeuH2zOr6sjcfw/wCFkgjT939rR3/f/wB7f92j2zF9WQs+k6F9gj8/
+5IH+eTZ/C1R7aRq6ZbSw8OQWEb+Xs/6af89Fp+2kYOmZT22gxz/6v92+/wAyR6rnkx+xSJrvUtCt
+Y/Itdn/XT/ao9nJhdI5XVri3upN/+reupRRx85n2ifvJI4/n2VtGwc5oQSbJPkpPUC/58jx/6ysp
+aATx2l+8EeyB3j/2KXPFBYs2mj+IXk2fZH/66PR9aigsXP8AhCtd/gkRJH/geuf66Id/wreeSOTz
+7vZP/wA9Ep/XQCP4Z2iR/Pff+OVl/ab/AK/4YPZFmP4faNBJ++u3o/tP+v6QexHp4T8NwPv8t3T/
+AH/lrGePl/X/AAwexNGDTdO+4lp/r/8AWb64p42YvYluOy03+CBPk+58lafWWaFmAwf88Kf1lgWX
+2f8APOkAyRN8f+roApvbwJ/rI08yl7QPZD44n/gjTy6PaB7IikP/AEz2VhJm/MJ5myPYkab/AO/W
+MmHMM8yPy/njqrEBHOiJRYCD7XJ5n9+iwxsl/J5nz/Pv/uUgGT6lIm/93+7pqkVcrT6zbx+WiSff
+rVUwuVZNV8v5PM3yPT9mSMuL6T93+8j/AP2qTpAQSXcH7x3k3yf8s6u5kMt7uP7PInmeRIn+soTG
+Nk1N/L3wT/8Afdbc4FW4tJ57iT/S9kc//LOhsCGTw3/pf2pLvZsj/ebK09sgJ7fRrtPLkfUpJ/8A
+npvo9sBf8m7SPYkm9P8AlnHWHtRFWO11J/L8+ON4P+Wnz0e1AZPY+R/r5JE3/wDLP+Fau4w+1zv8
+iR/9tPvUc4FmSaf7J56R7Nn+rrljRYiGN5Hjknkk2eR/yzreNEYz+1tKf5/taf8ATSi1QCzHqVq/
+yWskb/x0e+Asd06TyJ5kaRv/ALdV7IQT30cHyJ99KPZAeBW0fmSxpX2lWehy0qetzXsrizT/AFfy
+QQf6yvMqptnrUnZGxpev3azpdWs+ydH+R/8AarlxeGjNe9sa0q1zU1O71q9j/tO9d7nfJ5Mc833a
+4sPGnSfLFG0lche38mwg/eRzvM/+rT/lnVyndspGnq3mWWpfuJJHk+R/n+99yuamudXNomnpPj5f
+sD6fqCbof+WHyf6tq48RlLU1JOzOlVVI4y91Gzt/Mkg+f/nn/C1e3Qw86mhxV8UoHLG+uHuPP/1n
+lyeZXsewSjY8CpXcZGleajd3dl5c8fl/vPMjkrLD0uSRvUr3iXvBuj2N3PIdQj8yB49lvJG+3bL/
+AHq5c0xjitNzuyzCOquZHTa7oVxp9xBpUnnvbzojyb/mX+996vNwOJU1c9GTd+VnRHTI7mOCC1/0
+a0373jryPbzjFuWp6VfDxjsani61u/PTSLKOSCBP9Zsf5ZP+um+tMFUovV/qcScuhhaT4isfDyPB
+5Hzv/qH/AIPl++q1eIwEsT799Dndf3j0WTxBfaRpV1cXmx9lqk9kn3fmk/hr5pYKFWooxfXU73L3
+Tyy81a7upN8z/P8A8s/9mvpoUVHYVSRoaLpt1dOiPv8AJf8A5bpXNia0Y7b9gpyN2C48P6ZPsm/0
+m9hm/wBFn/vLXM4znHTRG3Ncmg1Seznuo4YPtMd5N8kifd3VlKjzRWtrIPZXMC8H2yTyEg2fPvdE
+/ikX+9XbT9xXuKeGaMe48uC78medPLf/AFn92vTpXlHmR59RpHTaZeeG47d7Kxh+zPcw+Tv+f+Kv
+FrwruXNN3s79DroYVJaGO/h7UrW+8qbZ5zpvgkR671jYThp0JUWpGrHHAkj3MOm+de2qf6dH/wAs
+lki/1m9KxvJuzehlFFaTVrTy01CznSGdE+eDZs3U1hnK8ZamyibmmpquYL/yPOd/9Tap/wA8/wDb
+Za8+pyO8Lmvtbm9BbajczyIY/sFrN87wfeZW/wCBVxVKkYK27J3GPpVwl1Oll+587/j7tf8Aln5k
+X/LWOu2E58lpELTUyviHrmt6ZpP2CB3dJ+EnT7rRN99WpZPhIVatzkx87RPPJLC0n8PY/wBR5Hz+
+Z/7LX0qxUuex4/Jpc5uO/wBTgvJLGC48yN/9XJXrKmnG5zdRLKK4jv8AZ5mzzPM8yipUTiTRjynf
++HTHBprpO/3/APln/tNXztSouY9WlI5/xlp8lrfSSQSeR5n+sjr1sG1I569FnMwaYl18kd38/wDq
+5K654hQOBRkix9gk064/1n7z/WSf3ayjP2hsXLSe4nkk/wBj545N/wDFWNWlYRP58l1L+83pBP8A
+8tKmjDlRcl7xsGwgnsHdJI/k/wBv+7XLKpaR1TXulTU7u7e7jggt08xI/wB5In93/brfC7HLWILa
+31JJJ/tUGyD/AF/mf7Cf3a0troYQJILuCCeRH/0p5vngkT+7WFWOtzoND7ZHqM8G+d4USN/M+f73
+92oqPQCxpOobI5N8b/v6yxUFF6CjXubVpDHP5k/mP/pU6eZG9cdSorHTGZzt3oOp6vdx3SXEk+mv
+v/7Z7f8AYWvaoV6dPb9TncJM5+40OMySeX/q4P8AWSV2/XObYylh7m9JYWnkRyJJ5fkQb45K5lUO
+hwMSTT53tJL5/n/efu/9pPu1sqhg4FX/AIR27ngkn+z7IE8z/SI/4f8AfSt/rVzOxBJJbzx3k7/f
+TZ/q6Oe4WKGoeZ9nj8vzI4/+Wccn9x63uc4z7H/o8c8f/fyi4zTt45J7zzP9Xv8A3f8AvVzymdEY
+lqzj8uO4n+5sk/1f+zWMpm8YmibeRNBnneTZ+82W8eyuSNT3jerA466gk8yvdg7xPIruwySO4j/1
+kdUMglpgPtUuJ5PLT/lpWc6pNJ3Or0/w75ccaTybJHj/AHlcU8QejThc308Kz2OlQahYzyJfRybJ
+I/vfuG/2a86OP55Nf1+Rth8I0at3HJAYI55HnjR/kkfZ9z/dWvLTi5s7XBo1tPkjun/efJHB88cf
+3P3v+zWSbS1LgZmu6FpMlhI88jwwQb3k3o+7/O+vQwGLadkY1YHm2l6RJffaJEk2RwR746+mqPlR
+48FqaWkRX8FvJ9lj37/9ZJXl1KtzvhSQ+91jU4LD/j4/eSf89KqNO0iK9U5rT/Mkn2f8s3/1ldNb
+SJzx1Oms7a3ju4/9XJ/yz/d/xVyutc6Y0bGj58kHmJJJ+7f/AJaf3azdK5tGVi9pdvveP9/J5aJ5
+n/fP3q4aqCjTsbepabaTxyPaxvvfZ/u1rhJnRJ2MjUPC7pP88Dvs/wCWld3tzirO4kfhG7u/Mkn+
+RN//AKFR7dmMKFzotJ0V9OgjjSPZv/1k9czxDLUC2+mz/a44E2Pv+fzP7rVg8SzeMDS/sZP3nnz/
+ACP/AKvZ/ep+1QrMh/sKDyJ0SPf5+z95/Euyj2qCzHwaJG/yeRv/AOmj1HtWU6gmrW0FrBGnlu7p
+/q40+ah1mYOoYMmny6j5kclhJDHv/wBfVfWmjl5pMmT4e6dJ9+ed/wDpoiU/7Qt/X/AD2MmaEHw5
+0Xy5E8yfzP8AnpvqHizX2RNH4F8IWqb337P+WkjvWEsfb+v+AHsTltZ17w/ZTyQaRaRySf8APd/m
+rtoubMDf8OeIbGe0ghe0RJ3/ANY+ys8Q5oDrPPRI/wBw+90/5Z/drj55M2sVftU/nyfuP3H8Em+l
+7OTCxNJO6f7n+/WeoWGJdR/vP79GoWF/dz/frTkQc5HIlolLkQc4z7RCke+CB9lK7DnH/a/4/L+/
+/fp8jDnK32u6/ebNiVXMiA8/Ut86P/q/+WdF0APPdv8Ac31QD/M1JH+eRESgB/2yB/nSTe9Hsw9q
+UJ/EU8HmOif9c9/y0uQPalO48QT+ZvntH2JH+8kStZUh3Eg8QQOkf7zZ/wA85HrF0kFy1/aX8Cfx
+/wCrqDQhgup0j33Xl/8ATOOOkkAySeR/kST95RYCCC0neTZPPv2SfvJP71LlAe8ME8mxLiTYn+sp
+xmmZ8xjSJB9s/wBQ8f8ABHJHWimg5iS7uLTzPIT5ET/WXFNzNAzaeZHA8f7v7/mf7tHOBYj+ySQS
+T/ZKnQzCO38//XwfJRYQ2fyI4/3EEexKHIBPsOySPfH/AAfu/k/v0XAmjkkTzP3cfyf8s6mzAZaW
+/kR/6uP55P3f/AqSiwH/AGvfJsT/AFnmfvKOUBn7/wD1EHyf88/npcgDNl/5e+eSN/4K05mBJGki
+fP5eySnzAUtSSN7TZBJskf599UpoCm+k3c/l797/AMfl/wCzWykMPsMcD7/sm+fzP3kf+1Ve2Arf
+2NaQSST+f+88z95R7YC5Ilunl+X88cf/AKBU8wDIzAlv56Sb/v8Al+Z96jnA8Ujikk/1f7yvr5zs
+csY3NLT9Mjnk2PJIm+P+5/HXJPFWNo4S5fez/s2T7K/7v/npJXM67qo6oU+UuPeX89vBBv2WMG99
+n+9XK6Sjdvc7YTNfQNQSSw8l4He13+dIj/L/AAVy4nDyUrpmmHdzbQaTPYWsk19/xNH3+ej/ADL/
+ALFcEpVIydl7p3OJVtNJmm8x/M+y2KTokk/91mreWJaWmpEnFPUyPiJpFgl1bvpd2l1AibJ9j/da
+vUyiUn8R5GZuLWhxhs7j/pn/AN/K9ekeZUd2dDoVx5FvJ58nnxxx+Xb2/wB5d7/3q4cVC562CqWR
+0b7xbWl9awJ5E/yOifM1ePGm72bPb9oqcRw1+K71OSeO/fy0j2QRyf3VTbWtfDLl1RyYfFKUifSf
+EUab0g/1c/8Af+621646+Db1Z1Trpmv4r1a71C6g1Sxk2ef/AMfcf8Pm/wCzWeHpbpmtKZzR0ie/
+kefy/Mjh/fvs/wCWVegsUoQ5Dzq1P2srs3k8NeI7mxguo4XnSb7n8TfNXkfXaKm4t6o7JQ5Y2Rkv
+BObr7J9+737NifN81dllyc/2Sbc2h1EfiXUdL0O60GaPZfomyCB/7sn+savNeAjVqKsvh/yJ+s3/
+AHZefRdE0vRLa5vHSbUJof3iI/8AFXM8TVq1Wl8NzqUXTd2cQfFH2S/n8j7n/LOP/nlX0Ky/2kFc
+5a+ZuMrf1+QyTxBdyP8AahJIn+5VU8AkZPMr6r+vwGW97b3/AP8AbKJ0OXYqOLjW0ZqafBB/tzTv
+8kaJ/erzqsm32R0wlcuQaTq0+qpbXsc9r5zp5Dz/AHaUq0IRvC1yaiPS77w7BpkHmwv5zzfI+/7r
+V8rTxbquz0sPmOF1LQhd65PbTJBZOnzybP3UXy/3a+joV3yJplKR1Xh3UkvYLrSvP865h+SC6Tf9
+3+/Xi4yj7OSmvhNAe+1+C7d/MS5nmmRLrem1o/8AgNa1FTqrml2A1JbGfU71FE72ckPzpJ/DuWuK
+lW9iroylJrYpeLfDOm3EE9189skmxLvY/wC6WT+8n+/Xr0cwk1eCuZpc3xHluqxT6c/2G4j32Kfx
+/wB7/ar3aciKWFjy+8Yn2G2Fx9r++nmbPM/269GlI4J4RQleJYOoW8Nx+78t5H/dyf3l306kLHHN
+3NqKRI4438v95A++T+7s/hrzKkLm9F2KuvXf22z+1PB/sRyfxbf9mtMHS5QryucvpFvJJHaSWvl/
+a/P2J/z13fwV6dSTOFRudJ58d1P/AMTSP9xJ8kk6J8q15tPTY2kUTBH9kj+yyb5PM3xx/wCzWrd9
+zGQW9vcTyfv4JEk/8dZq1jUSOyxpaTGkHn2vnxunzp/tbv73zVhVdwsPsdPkeS7nnkjSRP8AV/wJ
+Iv8AdqKldSZLoWM6XV5xpv2Xy/8AS3d3+f5vl/2acaScrmTqcpg6fb3/APx9x/uII/8AlpXpzqaH
+NGnY2NM8yfzN/wDrE/efO/8Ae/u1w1Hc6ImxaOkE/nefvRP4PvfN/Ftrz6mqsEYm0HgupJEuvnjm
++eRPu1z0nys3jEnsJ4LZJJ4f3FrGj/8AAmqYw5palwOGN3J9r3/397yRv/tV7UYcsTGsawKeR8kc
+c+//ANBojUZlGRPaJI9hHYpB86SeZWFWozeMjsrW2tJ75HTZ5Dp+/j/vNXjxrtM66krnLXfhm0tr
+7UkST/QdRTy02f8ALNt9erh8ysrHDPC8xi6t4Vv0nj/eb43/AHcf+5XbRxd0YewMmfRri1g8j7kf
+z+ZHXTRq3Y/YDRJ5Fxvgj8iT7klKtK5tRjyk9xHHJbwbPL8zzP3kf+y1YRidEnct2txPPbyQRxyP
+HBH+7jn+78/8VVJalzkUE0y4+/8AfjSP/V/xtvrqlP3ThqRuUdb8uOSOP/lon/oFOgrGbiVby38+
+SONI/v8A+rrucrGEomrZ6JP5kb/fjgj/ANX/AL9cNXEXFTp2Nmwv4PMjgk/0qNP9X/s15lSN2d9P
+Q6FNS1O68zenlx/c+euGVJo77lm0tYPLkTyEeTZs+f7/AM1YOdhcxPptjPPaeRdSeQ6f6yRPvR7a
+15g5izsneD7Fdb53f/lp935f7q0c4cxzv9hSWXmfu/Pgn/1kf8dej9ZbMOUfplhIkkeyPZs/5Z0c
+7YchW1b4eX19d/JJ5cn3/nrTDT5TllAqWvwg12eON/tGyRN6Sf8AstdNXEI5pYe50uk/DD+zo/O1
+GdJNn9x653iUdlzZ/wCEV8Pp5c/n73f/AL5/75rJ4lBcswQ+HtO8v9x+7/5Z7/8A7KuX6wkIuR+I
+dCeSOOCBHk2fu9lH1lAWZFurr53gT/gdc31ku4fZn8h0+RN/+xR9ZC5B9in2bH3vs/4DTlVII7XT
+dkmzy4P+mnz1ztgXPs1qkexI6PbNi5hfMgos2HMSwPG7/wB/Z/frblIK13d2iSb/AJN70WAik1WO
+GDen/bSOs/ZI0KU+sXV1H+489HST+BPvUfVosC5H57xxvJG/mf7dVGRBT1LRoL1/Lnn/AHf3/L31
+sgKb+GNC3/JH/wBs0q/byM7FyCxgSPZBaOkaf6uqVVhY0I0jTy/4P+elYXLB/wDWbPP/AO2dFwI/
+sm+Tekjv/v1nYCaPzPL+f53pgTyOiUAUpJI0/eJHSAHn2R/3K03GU59UjT53+dP9v/apewuBHJrN
+ukH+r3yf8840+apUYmRWk8QP5H+ixyPO/wDyzdK2UUAsH/CQTz73/cwP/wAs3rolyoDVuNHjdE86
+d/7/AMlc8q6QDPPsYI/I+d/+ekj07SApT3elPH+4g8//AKZpS1AfYzwb/I+ySJ8n+sf7tFVAXHt7
+B4Pnj+dP+WeysYRArSCDzPnk/wD2ankYEcA0395+/jeT/lpQoMCGZ7X76SbI3+ePZWNFSQFYokcc
+k/n/ALx5P3cldE5ySAkjntLWTY8iefOlTy2NR++P/npGkj/P5dHKA3zJP3aTxx/J/wAtK0AqyeZ9
+r+Ty/L/550uoE0knkXEcaf8AbeoU7uwFafUo0uJP9Y8nl/8AAN1bKlcAt/LeTz/7lCAZJcX6eY6S
+b/4/LpagR2k0d15c8kcnmfck2f36v6vEyJIxGk/kffjSl7NICbLwR74/LdH/ANXRc0uU7hLfzPPf
+zHk/5ZyUmwuRzxSPH56fIifPJ/tUKgQQx6lO/mO8n8eyOT+LbW0aQB/p89vIjybI3k/dyU7IRJHd
+3ccccH35KPdALi3kngt3eOR/3j/71ZusacoR2lokEaTx7Nn7ySP+9R7UOUpz3Unl7Hj3wPv8ut3J
+hyDPs/mfZ/8Angn+r2UXYch5dFZ3lhJ/x719FOVzGKsXrO98u4j8z5P+mdcc6VzdV7E+qWt3qMkl
+7/yzg+SO3/2aVFqOhVWpqWdKj8x40kkjTf8A8tJKWJ1O3CU+ZHoGueDPD2kab50F3PNduieQkfyx
+fN/s14VDMZTlb+vyOynSscaYfL+eu5VLsVWtymT4n1fVHtIIYpP9ESTf8n/PWu7A4aKu2eZmfMtj
+kzJKetepGCb0PHfM1qR1QlIuWcNxPJ5cH+so5OY2jW5Tdl8WeJrLy7Tz/I8j+5XJHBwTuj0J4t1E
+YcUmP9ZJ5ddVZO1kjnpTcGa2mXtxJ/rPkt4/9XXFWpc2qOhYhtnQaHeFx+8+d/vxx15tZW0R6mGq
+XPRLZrXWLD7FYv8AY0+T7VNs+Zv9ivnKnNQneXvHpRp80Lo5vxT428T+Hdeu9OkuvMg2Ilps+75X
+8DV7OHy2hioKf+f/AADxpYz2c7MZo93NdW8evTPA+pPPs8tE27VVP9Y9Z4qio/ul8CR6GHfU6XxL
+JHrljYX0yJaz2r7LS+/h+f8A5ZS1y5fJx/c/ZCvhuX94eW6p4n1d7yNp49jw/u446+mwmXQW39fi
+eHXzWUpW/r8inYO15qP+lRyPH/rJNmxGrsqpRVkcahOpO5afWLKKT7PB5nl+X/y0/wBuuZUGj1Kd
+anD3X+po6Q+lyCP93JHd7Nknl/cauOvodaw8Xqj0jwhf6HZ2M3nvs1G5/wBQNn3V/g2V8vmFOpJ+
+78K3NqDNy0+zXt0j378P/H/tf3q8yo5QT5TscTYl1v7NpD6beJ517s2Wv92T/a3fw1zQwvPU546K
+5zJnmN8jpdx/bd7z/fk2P/D/AAV9TFJRsh8xe0PU3S+/0Of7MifwP/F/vVy4rDaWmrs6rGta6xrF
+y/2l0Tzt/wC73vt3fP8AKi1yPC017qA6BNS1W5M975bu9y/yBPm8udfvxNSxGD9pLmRlQaS1OW8d
+ahf6zaR3NjvSD5Ib9P4v3b135ZTjT0kY4qPN8JxNxcyQJ5dxPvgn3+Zv3sn/AH3XsU6epwyrOL94
+57Wr1I9Oj8v9x5f/ADzr0qVI5cZVk17pQ0MwTyXEl1HI/mf6uT+7W2LjynJRdzoZbifTo5IJ/wDV
+vseOT+8lebCCZtKVg1DU/Pjjgjkkn/d/u9/yfvXqo0uUKkihFpd/G9xPHPH9rtUSeONP+mtdCaHS
+iXLvUtS8j+zrqP8A0v79vaJ/rVlb+OsaVBL0JZnabqT2v/LTZInyXG/5l+WtalG+xjI7jTRaXsif
+ZfnknR3k/wCuq/c+SvGnJrc9Kwy7/syCONPL+1SPv8+T+KtqLuFi7cPH5iJa7H37E/2fmrksb1Xo
+c7c28cl/JAke+Tfvjk+8qxV3UJ2jc8mrTuNvLeCeRPIffvpe0Z0SgIYJ9O/1/l7HTz/LT7/+7V3u
+c0tDa0UT/wBmvepshRNjx70+9/DXFWVnY6Ui0LqBP3cjp5fyPJInzVgos3ijS0lLTUIJLV/PSOb9
+wkdRVqezkZwOK1qwjtdW8yCP/QEfyPLn+8te3hp+0iY1RsSyInlwfuJ0k/eRyf3aqE0ccZE+mrf/
+AGuN4JP+PX/VyfeSsKtRG6kdPaSPBHGif6/7/wBo/h3f3a82cYnXzWKV9qb/AHJJI/LT545P4/v1
+rSopj9tYtarf4+ySJPs2bPMk/wB7+KnRg0hXIdVtZNR8h0j/AHfl+ZHJ/F8j11UamoXMHVNEt/Pu
+PPjkeRP+W8e//wAerroyuOtGxnRweZbx/wAEkEf7v/vutpRMISuTWHySSRv/AMejx/vNlZ1dGXzG
+pYWkkkfnwR7JP9us6s9B8olx4envpN6Qb9/+s/2fnrSnWMWjR0rwDqzyef5EaQP8nl/7NE8QzCSO
+mT4balHBvS4TzPM3+Wifwf3awaZ0clizpXw4t7T55pPkfY/mfdas+exLZtyeEdG8jy9/7uok7nVz
+DJINDhg3ySb9j7I5KxdJMOYq/wBreG7WSR4JPnfekn/Aav2aC5Qn8SedJ8ljI6J/q/kpezC5RkbX
+Zp5PIsNkf/LPf8tXz2Of2wyPQvFDyb/Mgg30vrNg9sa8ekakkn/H39/79c7qOJjGrc0Y9OjT597+
+W/8AfesJYhs6Isd5CP8A7f8A0zeiUyCWSC0+59x/9isZTAZ9k0lH+ePz/wDx6nYBkd3YQfIkCQf9
+NKL2AZPrNx/Bs8ur9iZ3KU+q3ieXskd5H/5ZpUuix3Gj7Q8nnvJ+8/55/wDxVKMGyytd6jOkmxPL
+T+DzHroVICNLvWZ5Nnn7P9z+7TskYcxNt1ny/wDX7Nn/AC0kp+2SDmJI75Egk+1Tu/8A00SqsaFb
+y4Hnje1tHedPnj3/AMLUuUDStP7S/wCW3lpvT95Gibq5OZssmgnuPL+SD/tnJStJgJ5GpP8A8t0S
+PZRFsgb9lsUn2TyedPs/d/7tbxYE0ey1+eCBESpuyuUkjvkn8z/Ypcs2HKQfu56LkD4I4E/5ab/+
+elFwH/bo0k2JWlwK0k8nmSOm96QDIPtc8e9/9W9CAmngvtmxJNn/AE0oYFb955f+lT75P9ir2GQz
+2Uc0m96Pb2AbvKSbII9//TSso02ZEX2u/gkk/cf8tK2jCQA93PP5k11HsRP9XVRae4GVd+K75L+P
+93stPLSt40YsZpwXcF1BJI8mzf8A8tNnzbaLMQ+0ngSP5I9mz/V/w/NRZgQSX0899H58ez/rg/ys
+lKsgGXccnmSb5H+yf8s5KwjEDJk0q7uvkgu/3aSbJJK39omMtSWNnZSSfxyeX+8np+1igKE8c/7u
+RJP3/l/vI0+6y/wLVxUQNK1S7jsI/tUe+d5P9Wn3dtYVppCJpPsH7zz/ADEdP9XJ/DWTijUrfZ7R
+7iSf+Dy98fz/AN2lygTQX8fkeRs8iR0f+D+9U3AZBJ+7k3yR+Y/7vzKEA+7mknjkSD+CP95J/erR
+UrAVLST/AEj/AFkfl/fjrWM7AReXdvPJAnl+X8/l7/7q1gBPb+Ra+XPeyf36aQDnu4PtGxP9X9//
+AGWqabcmZFS68T2EF3Hs+59ySSu+GGbGVbvXbSe3j/dz/J/q5EodFGdx8erQXX+o3pGn+sjk/vU/
+YhctRpBdQRweZ+7g/wBZ/d/vVjGZoZj2lu8f9z/nn8/93+9WsZAT273b+ZP9yP8A55/89N9O0QKs
+93qVr8iQfO/+r/j27aVogVLvxbPBJI6Qfu3+T/4vbWn1Uz9sMn8ZR+XH+8+4n/jlH1UPbla08QRz
+yR7I40kT/lpW/sA9sMu9c1Pz5PM+SP8A1kkkf+1/do9gHtjlbqwv4o/td18//TST79eiqnMCwvIU
+47iSTzHkk/eVqqRfPY6Gwt7j7BPH/fj/AHdvXmzd5miTaI/DVtcPJcai/wBzzPL/AOBVvi52gell
+1NXOgs9Y3zXl1PJI8ccmyTe/yrXmYjCvoelRxijBnN3niGOPWLjZJJPpn+rjr0qOE/d6nhvGfvGb
+unaDHrtnPInySQf6vzP4t3+zXKqqos1qw9ocdrHhzU9MkzdR7PM/1devhsQqx5VWPsjP+z1vIk0d
+PuPsn/bT/WVlICzq9vHd2f2uOT95H/6BWNKdnYOUxZI/3flx/wCsrolVux2HrMLf/X/P/wBM6yUb
+lUqXKa+j+IPI/wCWdc9XC3PQhX5TvrTxXb2OkJqMEex4fnk3/wDLRt9eFVy72rsz3XjEkct448VW
+etz2E0f+sSDZJH/Hv316+WYD2C0Pncxrc7KFj4hnhj+yx/6t/nrWrgE6lzTA4tHRx+Knn0X7F9o+
+Tf8AvI5K8yeXWq3PVnWUjM1Ty38uST95vrsirGVSN0ZCRXkn+rreMrHlVaNzR0WwP2iP7RHvSORP
+++/9qorYjlg49C8BFyleR2t3rAcSQXSQb4f9R/Cn/AfLrwIYdKXMnufSTrU+W0v1KmjzbE3zyO/k
+p+7gT+7/ALT1tjXz7HHhaSid9cCOexnmhRE8lEdIN/8AsV8+k1I66trGC3iDWNQm8538l5pEj8j/
+AHf7td31KnTia0VzRLZ8NjU5ET7X/pyfIiP/AHaTxMKUb/5nK6dpDfFcGlaXdwWWmfI8KbJv96ss
+unOqnOpszeErSMqTV7iaxgtfv/Znd0/4FXRGhGM3LuY1WnI7DQNO1i+0N73SbtPtcOx57T/lrWdT
+D0n6/MPrFxl74r02G0g8m1gmTe/9pWn/AD0p0YzXoPc4nWILDS5IL1I/tXhi9fZ5H/LePb/yzf8A
+6aJXvYfc8/FLQ4a8jjkvJE+0RzwJ+8t5P71eieNKOpv2+nWlokEnlv8AZLrZ9r/h/wB+vNnX5tzv
+WGIvE88d1p8f7yPyEk/dyfxbErTCx5XoZYjRGF+7nj/cSSPJ/wAs45P9/bXecwy8t7iPzI/3af8A
+TOP/AFv96mBo3Ms8+mQf6RJPfzyeXB/+3/t1y0oWkzetWuRW+l6nJPaWryR/J8nmf3dr/deieIST
+OeFHmL9ld3+lX8d0nlvOj/wfxLWLgmjso6Gvf38Hl+fBJGk/zzxxyf3pa5aNF8xvKZHpF3A8ce+R
+4LvzN/8As7WorrQzomuZNNtfnhT93P8A8C+auNwbOiU7GC88kKST/f3umyu3c4C/YwWN1fTv8j+S
+if8AAv4qzk2kBDqepTrYpp9rH8nmPspUINO7CpqPsNNk89Hvdn790+SlXrdgp6HWaZFHaweS/l+e
+/wDy03/NXA5XZvCnY5PX9Xu49Sn+1R/f/cSRvXqUabaMK1SxV023T/j6ju3eT7km/wCetasm2YKJ
+dsH+3TyR2Nv5CP8AJJH/AA71qasU0bxiaCTTw7IJ3keNH/ef3vuf3a4KlO7NJROc1mO4jv8AfBJv
++/5f/Aq9PBqyMHEvWf2ieOSBI9m//lpJ/EtNwLTN2wnkgg8hPLgkSsnA3TIbgfapJJ3f/rpHW1h8
+hTg0+0fzEePZJS5Q5CzafZILS3Sf/Vo9azkxWNxI9N+/9/8AjjjrjnGTFYemu2dqmzzPv/J/tVTU
+2LkiS/8ACeNB8nmb9kf7uT/aqHRuHJEgTx/rs0EFra2kk89VLQn2poST+LrqP/Vx2u9P43rCWJgt
+w9sOg0+/+/qOpbE/5aRpWM8Uw5iwbLTYPn/eT1xVMQxXHp9gSP8Ac2n/AI5S5SCzG92/3INn8FOz
+AZ8//LeT/vijlAZ9rtEePZJ+7osA5L793+4j3u/+ro5TMPtciR/3/wDpnRyMCL7XP/y0j2I/9yrG
+Pjk/eRp9/wD36dgFcx+X/wAAq0yzHdI57uNE8zzE/wBZv+61aRYEk9pbwRySPb750k/eR76waILU
+e/y96WnkSf8ALSqQEE9rd3X7t/kT/npT9qAselW6J+//AH8if36PaIBP7Sggk8ied0d/kj8tNtTy
+2AfHa/vN8H7/AH/8tH+aj2tgL0dt5kciPs/65p/DTde5Y6Ty0/0X+5WMtQEdJ0/5abP+edZqoBF5
+E/mSPJJ9/wD8eraNQCUSW/8Ar3k/5Z/vI6xjUIFk8iP98kez/frdTAZJq1p+8R5P3m/93HV8yEVv
+Mgn+5/B/coGWYEnf7kcaR/8Aj1P2gE32WBPv/cp+0AZOYI496R/cqXNiGJfyQfJ5aPv/APHaXPIZ
+Gl1d+f8A6v8Ad1NSkwHzzXzxps+ff/yzp06TAaNkEcfmf6x/9XWtOfugRvcQbP8AV+X/AM86zpz1
+AryarbpHI7ybEg+eSOt+VMClJr8cl/HB5n7zy/3dL6smBNNdW8fl7/vv/wCPVNGEYmRmwf2T5kf7
+v95P/wAs3+7treTuBs/aLTzI7Xy/4P7ny1jGqalO+SRI/JT5P4P96tlUAsWqeZ5EE8fyIlTOtzGR
+T1K/j8+REk/cf880pQApYnmtIPsuyD+OtZ0bIhFyS1njgkSeTY7x/wCr/h+auKcuU3QtrJBD5H8c
+knyR1rP3guE+pTwSRpJG7/vNnyfdop4dhcp3V5B9z7+//VxvW1OT5SCvdbI5JHST9+8n+rT/AGqy
+puXMAt1P+72JJsnT/vmtaMbRAhe0kggjnn/0r93/AJatKTswIYHkkj+f5JPn8v8A3aqpECGO/uJJ
+/MSP/Uf8tP4aKSAm1JJ7qSBEkkSeDZ58lY0ZF3Gm4tHndP3k/wBl+d62mwuTPd2HmSInmeWn+s/6
+ZxMn3aqD5SCrpVpoz/v555ER5P7n8VRUmA+BLS6uJNknnx73SON/9pPlpxnIXMQ3CQWP3PLjkT/W
+Qf7FbKcg5hl3f3drH58HlpH8n7vf/Cv3aIU3yhzEs+rT5g8iCN5/LrlhT94OYW/v5J7T9/H9yStX
+BhcI7ud7uOCeOTzPM/dxp92l7NhzGNrKT/a5E8uNIH3yQR/eb/a3V6FBaBzFa0gs303549kb/u5P
+M/2f4ajntIOYj+yR/bLh/wDUWlrHvt44/vVu5klnSLSOCSOe6njeB43/AHf+zWLmBW8Q2b31vJ5f
+ySJ/yzq8LM9bFqxgaPocj3f7/wCTYm+uiviuVHBSpcxU1PWZ08yCP5Nn/LRPvVssOua5h9YTRrfD
+y4SfXUgnk/vvGn3t1c+bU7QO/L6juUPEzSWOrz2MH/Hp5j+X/Durpw8VNXOV1Xsa/gLwn/bEn2uf
+5LRP3f8AvVx5ri3QhodFHB82p6vpXh+307i1j/dp/f8AvV8ji8Z7RnpU4cqPO/ivNOdRt/M/49E3
+v5cb/N/wKvp8jlaOp5eNhzHnX2y38z/V17zOAdHJ59x/q/M/6Z1nIDsNPjt30KN7qPfH/wAsLf8A
+2q82rNqtb+tjflLOpaZpEGhfao/MTy32R/7zVlCq3WsKx59PLI8n7z5zXuxhYTqXLVhmsqtSwrXN
+7+0ZEs/38fmR/wDLOOSuNUr7GjquRiXE/wDpEn7vZ/0zrrppx3M3G48Q4j8yhtvUuNHkLEd7JWTg
+9zZVmi/HLJ5cfmXH7tK55RO11i7BLH/yzk/7aVhJ2MnO51fhWzjutW+1zx77HZv8h/u7l+XdXk4v
+EckbdTvweF5pX6FrxR4hsr2P+zpnRDD88Hkp/FWGDw0k+Y6M0VPlt/mc1Z6pJa3bxpJ5e9Pnr1PZ
+aanl0JyudlpGmXmoxxzTSfIif6z+Ft1eLjMRGDstz2aVByQyyhu7nzLaGB5p4X/1aUT0a8zDDV7I
+7vSZ7TZabI/s17MnkyDZ/q5P+etebmFJKKf9M05+ZkGu6RpVpcT3OoQPNPMieXP/AAtIv+7WGErT
+nC0dEh1XqcjPq0ll4r0m60+CCTTrr5PI+63m/wAW9a99YROh7z94yg7yOh1y+h0mffp+xIPubE/v
+Mnz15eHpOT953YQSZzOs6rYXoTZv/d/8f0j/AOt3V6sYSW52QoXMjULuwfTJNlv9qT/lnb/9NU/5
+a16OH0ZwYpaHFyRyJJ9rn/cf9dK9E8aUdTotEvfMs40upJPLk/1cf8PzVxYnD66HTSxHMihf/ZJ7
+zzE+SD7kn+z/AA1vho8i1MKmrKtnpkEdxd2k8n7t499v5f8AE1dJzB9nt4PLk/ef89I/71IYy8n+
+yR2EcHmJJ5f+rk/hffVxhdhKJe0SSO11K3uv9fBPJ5cnn/d81q4q9K8TejKxr6h9ntHk8+R3kunf
+93/DWGGqcyNa3umdbpYPaRxwSb5E3yP8n/jlarRnPCpc0beSPy5IH8hJHTZJHXPNHZEzr281J4Nj
+/JBB/rI0/wDQaunTRz1p2GR3cbweQ8ez7j+XWrogXbS/2W93HYx/v5pE37/4dqVlKl3ER6fP9rnj
+STy/MT5JJJK0nTHT1NBLuR7+T7V/B8kEiVyToXFU0NxriCS3j8uN3kf/AJb/AHdtcMaNjeFS5mav
+ol3dyRyJJvn/AOWlelhZGNancntNFjsf3byb6qq1cSRegewR/L8z95/yzrKrHQ3SIbi+0z95/wA9
+0/1clbKmmaSiZF5rUf8AqPL3x/8ALOStF7pg4lGTU5PLjrocTlixkerz/wAEmz/npWDibpk8eq7P
+k+/RYPaj49Vt/wCCT79Owe1IrSfU7242WtvJO8dEpWOf6wb6eG/FE0fz+Xao/wDfeuaeLSD6wa2m
++CbXy/Mvbh7qT/lpJ91K5JY24+WRsQabomnR/u0SOP8A5ab/AJq5pV5dA5ZFqPUbby/3Mf8A1z2f
+crJ+1e/6FcghuXkj5/1af6uSspUU9w5Bk5geP/f+SOStHUiwuCXcCSbPuU7xC4s99Okf8b/9c6bR
+YyPzLqOPz5J0/wCmn3aXLcBkcaJHv8yT5H2UKIFWC/2fuILfZ/zz8z7tIAu9Zu3jjSDZBP8A89H+
+aunlIC01V3j8ie489/8Anv8Aw0KIFry9/lu9w7xv/wAs6jlAfJbyfwb/AO/RygTC42Qb/vzp/rI0
++auWMiwjuLuf/l0/5Z/vJHraM2BH9kv0k89JP+2f96izIFknn8z5I9kf3KdwHRw6i/yfc/551PtY
+AVk0q6eTz57uRP8ApnS9pD+rgWYzYGTf5f7z/brL26YFmC+sEg/cbEjT5JP9mqtcCOPUY5vub/Md
+62dCxZLYeY8fz73dPk+esNgJnm2b38v93URpgUJ9Sk8yONI9kH/PT/arVQAlnEbyfJ/2zqlRIK//
+AAkEcEmx4/8Alp5f+zW0aYD/AL/z+X+8/wCWdQIf9ogg+/s2f+g0XAfJfQO/7j/WfI9P2YyD7VaT
+ybJ3+5/lqXswKk8l8knkWsm9PuR10c6Au58iP/SpP37/ACR/71PnQEB/1ey1k/eP/wAs6xqzAZP9
+rSCTZPsg/wCWkn/LWinMDMfUb/8AtKBJJN8H/LOT+9V06WgD7rXI4EkfzI/L+T95/FU06fvAV7Tx
+Gk/7xPn+/wCXG6bPm/u11LDNAVZH8+4tLp4/I8//AFf8Xzf3aXI0AWtvqT6ldveyfuPuVdWmkZl+
++v8A7FaRvBBHP86eXJs/iasIt9BEz6lJ+7nfy0n8zZHJ/D/u1jGBqLHfTzz/AOrTy/ufP92towAg
+vtf+y2nkQSI8if6z+9WlPD2MiGCe0urSR0/16R/6RH/epVFygZnkSSXccccn7v8A56VtOVyEaaO8
+NpP8/n73/wBf/dX7tcc6NzdHP3+pavBJsf8Agkrvp4cwuWoPtbz+f5nnx/J5f8O5qdT3QuU9WR38
+uSfzPtc+9J4/7v8Addaum1Y0C3sLuDyJ/M/fo+/5/m2/3azptXAuPPI7+Wkmz/2X+9WcY+6Bf1aD
+yLTfHPG//s3yVyxdpAYlpdx/b4/Pj8uTy9ke+u+ogLV1PH9o2JH+7f5P71FNAVLvXbi1nuI4I/P2
+f8s3oo0TO5n2ni2P94j2+yD/AJaR/wC3W0qI7l7+2d8my6j8vfJ5kn92RawnR5SyC6nnnjjnk+eN
+9/8Aurs/2adOnfcDFkku4E+STyIH/wBXs/8AQq71TRhzGZHf3fkSQSSeZ+8/4FWypxDmLMmt3m+O
+TzN8f/LSOT7m9P4azjT0DmNO716/tU3+XGk87pP5n/AK540/eFzGfcavceXvnjg/6ZyJ96tPZofM
+T3d3dz6ZaX08n/H1v8yRH+bdFTdOzFzGFHqF4kkbxySPIknl+ZXdToKw7m7Hq9wkdvBP/wAtJP3c
+cj/JsrgnR94XMN+1yQXey7/1fl/8s/u0Spmpcknt/wDR4E+55n7yNPl3VlKAEMl1dwSSWs8f7+13
+pJTjSVz1J4tmBc6rqDpIkEn3/wDWR/x1204JHDUxDMmz064v7j5PneuupLkRzKnzHpfhzRIILqwv
+YINmyDZ5b7PvtXz+Mxd9D1cNh7Io+PtXs57eOx8u1mvkk8iedN+6Ktcpw7ir9CMVV5yTw3bR6H89
+rJJ57x/vJKjHz9o7G+BhY6278Zx6fYQPs3v/AL/zV40cA6jOqVY5O/1N9YT/AE3ZPH/6Dur1aC9h
+ojCUzkJPDW/U7yOP93BHv8vzK9z62kjz/qpp6T4et4PMeT5J3/1dcVfE8wvqpZ0+S3jj8h4/v1lU
+lod1NG/dyaa+jTw3X+o/752/3a4KCfPdbiqo891DTLBJLfyJP9Z/rK+ii2ebJGebjy5P3daKJjIn
+kuJJI/3klIkgkj/eUAXLfy3k8uSs5nSPvPLj8vy49lFMBscslW6Zp7Yn+2yJ9ysXTF7Y0dM1C4/e
+R+ZJ5ckcf7vf8tZVdjaJtafBHOjwP/H/AMtE+evNm7M1RUv4biO8jgeORN8f7uT/AIHXTSs4mLqO
+Mjc/ty4gt/k8xIIY0/efwttrz54VSkei8e4xO+8DzwaTpt1rN5BJHaz+T5En+y1eFmlN1pKC3Oin
+PQra/q2jXWrC60y4kgT78kkn8LV0YbDOMVFkU5alePXrqSy+xXX9998j/wAVKWASlzRNfa8xzus6
+XY/vJ9Pk8u//AOWe/wC7Xp4LEyStIf1fmMv+3544I7K6+f8A5aR3ddbwhwRr8pNJ4h0ixsN8Ebz6
+rvdJJPvQeQyff/3qFhLm8cxUf6/4Byfm/vPLjkr0zx/aB5sl3J5f+skeT/WUB7QSP7RBHcWv2jfH
+5n7yP/dpszJ7i3t5JLj7D5iRxx+ZJ8/3n/vUAXbTSJ/LknSP7kiSSf8As1TcfKGpxx2sccH/AG0j
+uKLhykJ8y7uI4/8AXyf6uTzKzWhc9TX0u0uLeP7DPv8AI/18EkH3llrkrM3paDvEccE7/an/AOWE
+f/LT70qtSwrsZ4nUrWVvJ5/+r/cPB5klbV9Qw2hJdzzzv9uhjR4PM/ef8B/+LrGEbbmjKUkEj6nH
+5fmfP+8kj/267YSMGR39nPJcfuI9n/PSplJB7M07TQ9Tuv3jyeQj/wBysXFC9mXoPDlhBJ888iR/
+8tJKpzuaezLP2m0Ty0SP95H/AKuT/crCVC4eyF/4SF5/kSP94m+r+qIvmKsniGf/AFHmeXH/AM86
+X1RBzlF9Uf8Ajkq00RzkX9qf8862Qc5Bcah+8/ef6z/WVr7NkSrFC8vPM/6507M5pTKv2z93s8zz
+JKudLl3K5zT0nw/4h1ST9xB5cf8Az0f5UrkniKcdxc501p8Lr7z4/t1/+7/55wVxzzaPT+vwL9kd
+RpPgzSbFI3jtI3k/56PXFPM59P6/APZG1BF5Ef8Aq9jv/wAs0rnVJGhB53iFJI9lvHAn/LSR330v
+ZgMn0m+n/wCP273wf88402U/aIzsPk0mB7f9xB+8/wCeknzU3UfQLDvs8/8Ao6eZsrO7DlIb+O0f
+y0uvMdPufIny0nIOUd9hjk8hEgkSOD/gNHtbm4Sads/56eWlHtALCWvmRx7PkkSTfS9pcgZJYSSf
+I8//AF0jqWmwHw2MkEf/AD3kStakwJJ4Z3kjg+RJHT/V0U6gEH9h6U/mJP8AI7/3Kf1iQD7DR9G8
+vyEj3x/88/8AaoWIkBdjtbCGP5I9n/POoUrlcwPfQbPk/g/1dL2VwuZ39u6cm/8Af/P8ifJ/tVlG
+lIj2g2DWrGeSSP5/kk/1j1vGnIPaB9q/1k8Hz+f/AKv/AIBVeziMZYXWpT/PdR7NlCpoDSynkef5
+mx0+SSs+e4BJfRp/r5N8ez93HR7K4FC+tfPu47qDenyfvKSlqBJHpsHmRv5n7x/nk3/drojIBDPY
+w/8AHr/rEfy3/wB5qzqS5gKz3MkEknmSeZI/+rj/ANmlToWArR6pd2t/+/k/cJ88cj/3v9mt40AF
+u9ct0njSP/Xyf6t63VAB0mtf6R5CR7H/AOeiVhzATxxx/wCo+5J5n+spgO2QeZseT9+/+s2Vz84D
+/tEaXHkPHsf/AJ6Ue01Aa51KeON0+SP/AJ5100sRzRAjn+12qf6vz9775I32fLtqKerAba30d7PI
+kEf79I/3kda1KYGTqOpT+XHBax75/wDV/vP4aVOmAWskiRwefvSd/k/3mrrryuZlxx58E6T/ACP/
+AM8/9muFREUp9Nk8uCCC4/ef+y1qpAZsdrf+ZP5f+r8xEjjd/wCL+8lbxqpDLNxaTvcR3Xmb50k3
+yRv8tEm2BNptvf3V3vkjTz4I/wD0F6zcbgSJq2yTZdf6t/3nmJ81ZVNTQgnnjnjkg+efz5P3H8KU
+qasMux2CQWkHnz7/AN5+8rbkMir/AKR9n/0X554JP38b/wB3/Zo5QMrUo7uC/k/j/d/+Oy11wnYH
+Er2tvJp0m/8AeSb/APVxx/7dOc7mEoliO+/fwST/AOsT93PH86/8Ap2uXGNivd6tdwST7I5HtH+f
+/wDbqXSZ0RlYd9v8+38+R/3/AJf7yORN22tbGBlx3f2Xy555NiT/ALuT+8v9xqFFgUr/AF7Un8tN
+R++laQwiQvaDz4in8vf/AMs0/d+Z/F81FTCJh7QnfXZ/PgmeDY7ps/u/991jHCpDGXF3PaTxyT+Y
+9um+OSP+Gt40EgJLKSd/skkEe/z/APnp/frGp7pdIfqN/H/qIJP3/meZ5n+1RT1CqR+fvgt0n+eR
+5PMkn/ipKDTIIdkD3fmSfv4Pn8ySP+HbW8azQF1Pk+eP59myT5P4awxDuWVdZ+1zyefHJ+8eTzJI
+/wDZow8rAPksJ47eNL6SN4/M/d/+zU/aED4/IeSSf93/AKvy5I6PaAMktLH7JPG8eyCSRHjkf+Fq
+XPJaCLV/aQaxHHap/r4I/wB3HTVVrUZzmmWn+lpH5e+7R/3n/XKums7oC5rUck9xJB5eyPzPMjjj
+/wCWVTQ0AhsBcQeXHBHG8kEjvHJs+ff/ALVb1HEz5SD7HfyRxvPH5nn+Z5fmfJRT5Q5SRIJP3l15
+n3PLj/ytRVndmg/TPL3+W/8Aq/M8zzP9j7tRVnZAJHJ/z9Ryef8Afkkd/mZqUqTOnnQy4nt59Wjj
+T5/+WfmUuR2HZFmLT7fTr/zI/wDVv/q6VTEc5dKBak1+7jk/cSbPL/1fmVnDBc2prPEchz2lafPP
+qFxPP8/8cn/A69GpNU42RzUYXNWTWILOwj2ffrzoYdylc3lV5DD/ALZkkk3yfPXcqCRyxr3Ni01u
+M/8AXT/nnXNVw9zojMZJqL/aJPM8z/WfvNn9ynOkP25Hf6p5Ekez/Vyf6v8A2aKeH5g9uQRar5nm
+b/8Av3W3sNDGnXGaxqvnxx7Pkj/5aR0sNhlcKlcx5JP3ddiRjIr1tFGMh8f+rrJkj/8Apn/yzekB
+p29nJ9nkk/uf6ys6h0kclvJJ/wAs/wDtp/v0UwGRxbI5PM/7+VbqEchZuLP5I/3cn/TSsnUDkLln
+5afu4/3kkkdY1DsidRptvHBB/rPuf6v/AHq8yruaxKtzqd15tp9q2Psk/wBYn3vn/vVvRoaaE1Jq
+5aM9vJZyf+i/7u771Z8jTKqJOJu2+tT/APCNJoru8yJJvTf/AAqtc88Mk+c3py90yRcWiXnzx/8A
+XOteVWuRTnqbsF3aC/33sH2qSeNE8t/urXPUvHRGtuU5y/1W7upJ4I4/uP8A8fCf3a7cJh4x1kH1
+7lMfUI4/t8iR/wCrru9ocUo3KCWXmR3nkf5Sj2hzSoNi29t5ckkkn/PP93JVF+zH6fbfx/8ATSgP
+Zj7e3uH8yP8A5aPJ+8/77oMyf7PJHJJ/z7+Z5fmf79AF395BHHH+8/ef6z+7WFzflC4tN8f2uOPf
++78u4jouHKMt5I/9HT7P9+Sqr6EUdTRkg338CeZvkT5I641qbz0LkdvJJHJBPJG+yTZ/tUR0M9zM
+e0v/ALPHB9yPzHTzP+mVbLUexd/siOCwjgf5IP8AWSf7Tfdp8pbIII9MRPMnk/eJ/q6XNYwZLPrd
+pBBGkEcfmP8A6yso0mL2g3/hJpPMj2R/vE/1f+zXRHDsPaDI7zz/ALR+837PnqIwsae1K1xe+XHJ
+JJ/H+7jkreOg/amH/aEkH7yStPZs5OcPtnmeZs/j/wBXR7NhzlhIdXuo45ILSR45P9XJUPliZe0N
+CTwd4vf/AJcf3f8Av1DxtOIvas07D4ZatdeW91cIkf8Ay02fNWE8xX9f8MXGJ0Fp8I9E8v8AfzyP
+s/ef3K4p5ql/X/AOmNG50Vj4I8P2Xlva2kf/AF0f5q45ZhUlv+n+QvYml9mt0+4if9c64qk1LcXs
+RZLiLy/n+T+OOtF7N7GvOM89H/5Z79/+rp+zb2DnI/t15/BH/wBdI6fJIgrST3jxxv8APHSdOQE/
+lXzx+W8+ylyFcoy0eCGCT9/58e/93JQoPoHKSwPB5e9Pn3/6uoUg5Qk8x/Ljjn8iRNj/AO9RzByk
+kk8n8cnzvRyDDekH37jZGn+s3/xUcgEbvA8f7iTe/wDyz2VpCncgy538Sfa99lYRpB/y0kf+KuyF
+AC9Yz6ls8+6kSCT7nyf3a5qlNgMutSt08tEkfy/+emyinACaD7D+8nT550/1f+1U8wEP9tQeXI/3
+Pv0vaAEepRvH5jyb4H/76+atvZ2M+YZ5P7yOeDe8f3P9mjmsHMP/ALM01Ed/I/f+Z/rP9qoUmX7M
+rfZ7GCT9xHG8exJJ5P4d2+tozYezLP8AaVra/uET/lp5f+zXNyNDJp3RJP3EiPG8ifvP4d1N02BT
+jfy4/wBxJv3/APLP+Lza0VHlAZYwWnkO+o+X9r/uSf7NCkluBC+q3b38kenSRzwJHsj/AN6mqQDb
+7VY/uT/JIj/vI0+b/gNbKkBk33iCOxu5Egj89J/3kf8As1VOjYC7Yx3c1pHP+7ST/lvJJ833qdR8
+oFyO18+Pz3j3yJ8j26fw/wC1WMcQBT/sODy4L55N+z5PLeto1wL8EfkeXP8A8s/nSeP+7/tViASe
+Qk8ckHmT7E3xxv8A7VABHNI8Hn+XsnT/AJaJ/wCg0eyAgu9d02fZau+93fZHsodJMCsNRu/7ajge
+N0gdE+ff/wAsl+9Tp4eyAvx/ZJv9FSfZJPI7wSfe2/7NTS0kA06VPp1pIjzpseT93PWtWdgGCxtP
+3aPJsn+/JJ/u0UqgGdqWm3c8kb/8sEk8uD/gH92qptyMxv8Ao8+mzp5kjzx/6v8A2mp1IgZ+k2Gu
+/a4/M/jj3+Z/s10OUEBcuNK8+SOT7Xs3x7IP4awlVgBTsNJ1L7JJ+88+D5/M8v8A1u6tm7gX4PLs
+p5H+dJEg2SR/71c7iA6N7D+zZJ4I3dE3p5cn3mZf9qtKcbmhn6Tqcb2nkJJv3798Dvt2q3+3SqKw
+yW/jv7qONHuN8fmbJIErTlZkMnnt0u4/L/1d1Hs8j/a/vUcoEiPBJJHBe/P5EmySdPlb/gVYVJ2N
+5RJbu0j8yD7L8kcEn7vf/wCzU6crmEkVNS8Pfv55Ek3+e/7v/e2VvCrc0lGxhSQX8En/AB7yeWn7
+iSSP7vy12U5XOeUrFK3eeCT/AFeyDzPPknrSwxm+3nu/3cmx3/efvP8Anr/DRYC4mkXl95f9pRuk
+b/6uRP4aznUaF7IL7T/7Okke6/eSJH+7g8v+H+9RTqNh7Mp6Zcf2lf8A+lSfu3krZwYzTgt0eO4s
+X8t9km+OST7zVg7gT21xHa2kcnlyRyQeYlvHJ/01qampdIzG0mS+jk8iSRI0+fy3T+KnT0CqS6R4
+Tu47/wCeOTy3+eCT+BlqnikyCaPRvIv57WD/AFHmP5clc8q6Yi1d3EEkcFiifZdm+Oef+Gd6V7mh
+DJafuJ/st35n3P3n96lewFK48+Cw+yz/APLD95HG/wDeeujkIIbS72QXF3s2f8s440+7+9o9mBCn
+2uOOSCTzHtPMTzK3m0wNlI47Wefy5P38MCfvP/Za5J1UK5k/6y/uJLX55H/ef7a/7tdW4yCS7ke4
+8iSP959yST+PZRsB1Wm6fYWsEbp8kf3LiT/2auKo5FcpVe0gvoPPeffJYu7xwf7v3adNyDlM94LD
+zJH8z94/z+ZWkZ3ZJc8L2EbvInl+XH5lRjZ2QGNJeRpbyQR2+/8Adv5c7/erpjH3jtvdGdoaSC88
+z+/H+8rXGaxM8O7Ms6nd73t38zfv/wBX5dZUqTRNylqeoRv5cEf7vy/9ZJ/erspRsO5BYap9kuN8
+lFejcPbFa4ufP8v/AJ5/8tKqjSsL2xQj/eSVszEtRxyRyRyUgL/224/7+VBvcg8zz/M/ef8AXOgL
+kUkcnmUIwK1xJ/rI/wC5WyAj/wBZ/wBs6tsB/l1i2BN9n2Rx/wDTSlzGfKEf+skko5g5TZ0yTzJP
+3n+rf935dctQ62QXCSQXEkb/AMcnmU4M52SWcf8Aq5JI/MjoNC1JJHPHI88f7yT93QBPb2/yR/x1
+zs0Ro28kcEcn/TP/AFf+1vrBm6MuS3k8zzH/AHnl7/MjrunIg0I5I4JI/I/1f/LSSuKcQNHT/n/f
+/wDLT/lnH/8AFUVIm9NkNxJI8nmPH9z939n/AL1FOIVGTyWtw8kbz/u4/wDlpHRzF85NmOODyJ/4
+4/8Aln96jmDnMSS22SSfu/3cn7uOtzl9kMs4pILyRP8Alp5nl0B7ImtDHJJ+/wDnjT/WR0NsXMTf
+uIJPk/j3/u6xk2HMLBb+ZJ8nyb/3lVVmzTlJruMyW8cf3I6xjNhyhJaRvJHH5n+rrT2iC5ajSe1k
+k/d7/Pk8yOj2gXCO1jguPL+/s/eeX/8AFU3UZnzFn7DA8cd0n+sff5n+9WLqMXMOsLXzPtDzx/PP
+/q4/9is1XQcxajtXe02In+o/5Z/3lp+3DmMq70+7vrid/tHlxwfPBWscScvOU/8AhDdWSTz0/eR/
+8863ji7Bzk0HgTVnjkk8jz7v78f+zQ8bELCJ4B12Py5P+W7/APfS1g8bH+v+GFYswfDHWfM/f3iJ
+/wBM46HmK/r/AIYPYmz/AMKxsH8vz55KyeY/1/SD2JfsfBGg2Mfli38/955nmP8AN89YV8xlL+v+
+AHsTV/4R3SoJP9Qif9M0RK4vrE2/+GF7Etp9kg+fy/3af8s0rKUDpHfa7eeOTZHXPKNwHSX0drHI
+kccfl/8APStLWLGT3cfmeX5lJgRJebLfZB/rE+/HS9pdEDI7q78v5Pnk/wCedJUmwJTFfSR/9M/+
+elbyooscjOlv88n/AG0rnlQQEKX0ckkkHmb5K63EgSTUpHjgf7kD/JJ/vVzyTAqSX1v5nkTySb/+
+ekn8NdXJYCdLXfJvgu/3j/PG6U+ewDLjRtkn2qe4k+T/AJZ//Y1pOegBqupQQRwbP9Kk/wB+lSp9
+QES5nhkd7KB59/ySf3V/vVNTCpgQ32sak8fkQQb4Hf8A17pRTwyiBXtdR1by5HT54P8AY/8AHv8A
+crarQQFt9YnguI0fzE8//Vyfw/7lZQoICOG+gnj8ib53/wCWcn97bSqR7GRT1XWJIYPMso988H/L
+T+Fd1a0MLzbjKz+JrD9x9l/4+9n7zy/4f71X9Rt/X/BAu2Fr/aFhHP5m+P8A56J/F/vVan7MRd8i
+0Ty4J/3EkH/AdyrXMql9zUz4/E7/AGuRILTzIE/29vy0/ZcwE3/CQRpqX2V4NkH99/8AcqI4e4rk
+M/irSUk+xQJ+8+5P/wA8vmrZYC/9f8ELkNp4ot08/wA+PfGkifu/vfLWziQO+1efbyXSSSQb/nkg
+T/YrCVMCraCfz43SPyNn+ok/i2767JwjY1JXtH1H7W91Psn8xPs8n8Nc1O0WIWDRr6D/AI8pNjpJ
+8nz/AC1pVxFwNK+0rz/LeCPZfPH+8jrGNUBLuG0/dzzW6QyOmz5653W6AVNVv7SOONLWffJ5n3/7
+y13UZWAqyWtxaz/bvMk8z/b/ANUyt/DWbqAXINK+3J9q8/ZJ/wA8P9pawc7gaZtbj7X+7k2b3/76
+/wB+sqk2y+YLozx2m/zI0kg/1ckf8UX92inUaDmMa+uJ4L/ekmyBPn/gatkiCSeO0ntP7Rggj3+W
+/wC8/uyt81bxWgCSXtxNpP2V4Nknlp5cifN/wFqzlRsBjX19f2s8E6R7I0/1f+7/AHK2pQGatp49
+8ySOB7Tf+78zy3+7VPCWMrE9p4gsLrzJ3j+4myPZ83/jtYulYQ+08Q2j+ZO8aJsT9xA/97+9U3Zq
+MuJNNgnjg/1E7/v0kT5vu0uaQGfH4gtL2ON4PMSeCN0kkStfq1jMu38n7+0f5Psjx/8Aj1DVgH3d
+ikH7uedII54/3cn8Vc0XI0K08iPdxpP5bx+Yn8f+xWymwHXlxpSf6yTy455P3f8AtVNJz/qxlVH2
+c+lQWmy1gjTfJskndPmoqymFIr3F3Zz/AOiwSbH8zf8A8BWtbWNLk1xpzvPHP5Ef2v8A3P8Ax6h1
+rBcX7C8f7+eT78f7z/e/hqHO2ppzE0FlA8fzxxvH/wAtPn/2P4qXt2HMUvM2TxyJHvjRE/eR/Mir
+/tV0SmYFhPLktJ3gk8/Yn7z5PlrCWoipftpX7yB9j+f/AKuRPu7VrRVZo1lK5VSDSZLSCCP/AJYR
+/u5HTezbvvV0RxEjnlG5YuoI7Wwj/wBiT/V/3q5nI7KTLhvNJurv7bPHs/ceRJG/+5RuKoyj/Ymi
+wySO/wA6On+s/u+VU/XG/wCv+AZ8w+7ttNg8+dI5Hnn/AOW70Os2FzJu7vTZ7SCCP93Iknl+XW0a
+WtzOQlxqVv8A6yD9x5/7uTy62VHW5hIW/wBWuEkgSCT935f7uST+KopxNC5aPaQWn+r3+fsTzP8A
+aoqQAyddv4HkjgT/AFHmf6z/AJa/LWuHVhkiJH9kj3x7I502SR/3nqq8gM+7vrd7jy/M3yfc8unR
+pcoFKTzII9n/ACwST93H/DvreauBuzyRpBGiR/vJ9jxxp/s1z2Ah8xLqe4nSTZH5flyR/wC7RYDL
+uLSR5PssH+v/AOekFdVOVjIg0i3k+0ST/aP3if6zzKKkrgdDaTxyWnmP/wA838yOuTkN+YZ5lpPB
+P5cfkSJveSP7u5Wp8gcxjeZdx3knkXGySD93/vV0tD5i7BcTwfP+7kjdPM+R93lbqxlEXMc5ay3B
+vpEk/d+Ykn7uu2UbGmGldEccn2SX/lo8aQU5LmRnzWkZfmyTyV0OFibj7M+ZceX/AMtP/iKJKyHc
+I7aN7SS7kuI0kT/Vx/3qfNcOQJIpPs8kn/LOhSsHIQeXQBbt/wB3+88vzKQE1vGknl/vP3jyf6up
+C4Wafu5P9iSmK5DceZJ5ckkf7ukhkEkf+hx7/wDWSVsgI7eOokwNW30vzLjy3k+/HWLkIfJZyRyR
+o/8ArI4/3kf+3RcvlHx6fZ/2ZJdySfvI5Nkdv/eouHKT2H2eS3k8iP8AeeZ+7rOoasjuLfzP3kkl
+Kmc7LH2PZH5f/PP95TNBkkfmeX/6MoAtQeZ5kjxyfu3rnZojU/1/mQRx/wDLP/WVgzdGdef6yRE+
+eOtuYgk8+P8Ad+f8/l/u/LquUDQe7g+5/c/5aUqiCmyrc3/l+XsopoKjCS/3/P5nmf8APOj2RHOM
+kvx5f+s+/wD6yj2Qc4R3MEnlxxx/8tP3lMv2pPPDJ9okkSP7+yP/AIHQHtSwmjam8fmJBv8AP+T/
+AIFUvEI5+YmtNH1OTz0kg+eNN8e/5WrF4lBzD7Xw7qU/lu/ySP8A8s6zrYlGntzTk8JXf2STfcfv
+Pk8usoYlB7cmj0aC1j+/HdT/APLPf/uVl7QVx8lrvk8x/LeRP9Z5dL2gXJoLHTfM3zySPP8A880S
+h1JGfMOK6a8knnxyQf8ATP8A2qwlVkHMXY7uxSONEgj8xEeT5P7ta2DmIbu4u/3b2skcEH3/ADHo
+swuX/s1xPHveOD/V/wCsj/irGTZfsSa0ignjjR5P3n/LSuf2zD2IyO3fzJJ/Ld/+eex/7tdEooLE
+0Dh4/Mf93+7rB2CxHJd+RJ5j/PvT/gdKVJIXOPkvj5e/7+z/AJZ/xVzypSDnM2fUrxII5PL/AHfm
+b4467qVOQ+YkN5cPbyb3/eRyfvKdW8UHMMgvrtIJHuo/3m//AI+/utsStHEZMdS8iOCS1+fZ/r/9
+nfWEogWpI7d4JHfzPL3p5n91qjlLH/6AnmTwQee//wARRyoCD+0Z3uJES02Sf8s5NlHsrEBHcSZn
+d5/3cH3/AOGhTsBW/tGFI5He7T5JP3b7/modFmhNDr9rqljJ5Mex4Pn8x/u1FSg1oxHPb9Snv453
++f8A5ZyeR8tehKBBqx6lAkkaXT7J/uR1i4gTSSWk8G+eN3kT/WQP8v3ah1bgQx6lBZJsSD7/APq4
+0/h/hpclwJkutdmSPz4P3fyP/tba0rQaYFaOC7tL6SdI/tUCf6v+9tanGfKBZgnu/LjTy/sv7x5K
+dRSQBPfwaf5jwRyeY/yeWlOmmwGJJcfbrt02eRs8ySP/AGqVa4EE8kn2RJ3/AHj798kD/N5dYRuB
+TurefUJJPsVxGnyf6v8Avba76EOXczIYPDd+9v5d1J+4T78nz72repPsBJY6N4atZJJ/Lf8Aefu5
+I5K0niEBbg1K00+DfBH+/wD+Wcaf8tK4px5wHTzz3tpI8+xEf5PL/ijocEaEHmWiW8n2ryPnf9xs
+/iqQKV2lpdSRp+8gj8x5P4/7ldasjnuZn9jSfuP9EkeTzP4Pm3f3WraNawcxs6T5iX8d1HB58c8b
++ZG/3d/8S1xOoaEyXFpdP5EHl2safPH/ALLN8lZSqAbIkhtZPJn2POif6v8A8e+WuKnVlJ+RoZVj
+qsjvfwPG/mTp+7j/APZlronRdgAazPp9hJO8nnPB/wAs/wCJa0o0rgRSeILueON7WOR554/3f+zW
+8sOBYtfEccMccF1HG8k8n7usKmG6gD2tonkXvkJ5H/PdE3f8BohO2gEkk8F1bxzx/wCv3/uI0q5U
+7gJPdXaWLzWvzxpv/eP/AAsr/drF0wMZ/F89rPHPJ8n3E8v+8v8AerrpYS5Fy1Y64+oz/wCd22nU
+wYXHz3dvBcRvdRp5bx7P+ArWKRZWsLuCxkjgn+dJ5PMkj+7tiZK2ihlb7X9lv4HgkSexn3+fH/BH
+/s1rF8wFnSrGSaDU7KSN/wBx88Ef+033a56s+QRBd6Pd2umxun/LTekkn3W21vLFXRmTXFpaGwje
+CDZ5EaJ5aVjKfNqBFeXc73cFqnz7I08vZW2hqQxwT2l388Hn7438uT+6y/equaKAchR4POgk8iB0
+3+Xs2/PWTra2Mib7XqcHlo8H+iPOn/xFFrgLrP2tJJHn+eCCT93WSkrmpDJveeCdII/P8v8A75/3
+q1U0Bnahd745IPPjgk8zZHP/AA1pSZlVLVnBsjjgvv8AV+X/AK93/wBZ/dZKKrCkOnjsLLy3+1/w
+J+8dP4v7rVny3M7jLvVruCf/AJabPL3ybKX1a4XLtvrkklhH+7/0T/WeZJ91atYOxrcoXepSXsl3
+Akn3/wDVyJ/dprDpO4XJn1KO1sPI/eJIn+skf+7SjTuIh/tm3S4/cT7JHj/1f8P3PmreOHQEb3Fp
+/o/kR/u0j3xxx/P82+rlCxnGVy9OJ0jt54I/tW+B57v+8rVg7nRGNyuutQP58F1H99E+R/vLWUKR
+nSZm6h4hjg+yJ/r4/LePy3/u/wAL12Qw9x1WJJ4hu/3aJH8ifJ5f95ay+qpGdx/297r/AEWOSR98
+n7u3ejkSC4txHaI8iJP9yTZJAn3o9n3ZFarT0uVIztX+e/j8j5EfZ+8j/wBytk9DGRPPdvaeZG/z
+z+Z/on+1UU4Gg+C7u5LS3d/LeD538uP+9FRUgAWklxBq0bzwRxzz/wDPf+6yff205qwGhBqVj+4T
+79on+s/9C3LXHUvcRStII9Rv/Pjgj+STZJ/A/wDvLXVVqWGX30aSC/kg/wCP2CDfP5dc8a9xGbJH
+59hJ5cmzyNn7z/b3/drpSGMjjEdv9qjuP9Zv8yOjlAzk1KS0uPMgk2SQf8tP7qV1zpWMirJrX+kS
+P/y8f+hUU6VwL1nqdxdeXHH+7k/2P4v9ms+QfMQWkdxdX+9I5I7d5Nnl/wAFPkDmIZLC8eO3/gkk
+k/ef7NW1YOY0LPW47WC4tXj/AHk+z95/EtYuIcxBJHYT/Z76C4k8/Z/30/8AFVqNtDvkZWoSb/8A
+npJ+78utYxMZGbb28nmVvUmc3Kamp6fbpbxzwR+X5+yOP+Pd/fenTmHKQ/Z449LuP+eiSR0uc1sM
+k/5B8f8A10o5wsMjt5I45JKOcLF2O3kks40/6aUc4WGR2EkH2fzP+edE65ZqaZaR/Y7iP/lm/wDr
+I64p1AKt5BJP5kaSf6On/PT/AGK39oBBJaD7PH/yzk8v/wBno9oBbt47dLi3/d74I4/M8v8A26Gj
+S5djt/8Alv8Au/Mk/wCWclYuIrjJN/8ArP3byR/6ulzhzEdxbx+Xv8z/AKaUc4cxBZyxxx7PubPM
+8yr5pGfMT3Bg8uPZ/wAtP9ZS5pBzEc+oRvWVKm4hzCyahHH/ANc66JJsOYgk1mNP3f8A20jq3RuP
+2xH/AG6I/M2fJWTwqYe2ILe5vJ5JPIjkeStPZxRj7Rl2PTtceOSf+5/yzk+R2p88UHtWWrTQdSmk
+kT+55cnl1zSrQiUaSeCdSn+fzNm//WSVzyzFL+v+AFzatPBNnB/x9SefJXP9eRdy1/wjGi+X/qJ/
++ulH15f1/wAMBYj0rSYIN8FpvkT5JN/+1XLHFXMyhHr0/n/Zfsmz79dEUmBctZP3nnv8kn/PNK4q
+iuaFq+ntIPn+1yP9x6qnGwFCfxJaRv8A6LJI+/8A5af3a1hhrICWbxJJHBH5n+r+5J/erOlh9QJ7
+S6gkSBJ4/wDln/rKXsAHx3siTyJ5ccH/AE0Sj2DAk/tWC1kk/eb5P+edX7OogKsmraFdSeZPA6fv
+KT5wH2l3Y+XcfZY98Cf8s/4aJSkA+11GBPMe6RHkn2fZHT/arGVJsRTv/GbpJB9hsZJ9jv8AvP8A
+drteDiw9qOk8Q30CR3zx/fj/ANX/AA1zvBoftShB8QJoJNiR+Z/7LXQsvgv6/wCCFi7Jrmq3t/A9
+rYSJBPvn8z+Gn9UggNOfSrt/9K+1vBsT93/wKuP2lzQPtEHmbHff/BPJUNjI57q0Ty0SB543/wCW
+iUlSEW555J7SP7L8if8ALSR/vbf92t1TAzLvXtNhjjgn3zRv88n/AAGqcZy3D2hk6z43jtfMstOt
+Ek3/APLT/wCJrpo5fzbh7Qwp/HPi2a0kTz/Lg8z/AIHXZSwFOOxl7eRpaFrGvQW+yeOR5P8Anp/s
+tXLi8PHoHt5HQzwa8kceyfZ9z9/XLFwlua+8M/s3WppJ7W6n8iC62eZInzfL/vUNwg9A94Z/whmi
+ySeZNPI8if3Pu7lq5Y1sPZm3BGkEEdlZbIYNnyT1xVJykL2YzTXguoJIU/1kkf8A6D/FUyp8pqZu
+o/2bZX0bwRyO7/6v+7uX71dFHVAav2C7nke6n2JB8mysEjMhu5Ld5/PgkkSSOTy/n/3K2Avx6jJP
+HGiR+eifJH/vV5sabNCK0vrSaOeOCPy5Nm//AHdyV0xjYRVTUbuPy0eNHj+RJ5K2nRsEilqUGpef
+HsjR4PvyR7/m21vRdjCRTn0a/eP7ak+zZ8kkf/LJvkreOIUNB2MqPRvEt0/kPJJBs+ePZ8zN/ero
+jiIw1Cx1dlY3SeRvR5P3G+CT+Fv4f++q83EVVcsX/icyeXC8kiRzx7J40/vVfMmgHT6PHZfJHJ58
+77PLk/3f4K5lilICtqTwJb3E+xH8n95HP/d/vJXRGkpAUPtlpqt3HB5aefPsSOT+HdWlSNg9pcdP
+oMU8n7+PyL6DZ9z5l/2ZKIYzlD2dzpbXTfI+fy/nRN8kb/3v7q1xVZMBI7uSCT54JE/jk2fwrK9Z
+QAik89J98Hz2s/zx7P8AnrVcti2cvfXE6Tp58f2V7r/VyJ/er08M7GLMqOTWvPt9Yff5abEk/h/7
+6rqk0aGydYeynnSTy/nj3x3G/d83+xWEsKpgPjvN8E8+/fPseeP+JJNv3aydN82ovaGHcand+Xb3
+vlyfa/8AlpHXZKkrB7QsWmj3erzxyJ+4kfZJaT7/AJVZfvq1XJqOhhGiak5vvsNvawT7H+5J/d+/
+XDOko6m8aJZgsJ5I4LqeTfv3wSQbNu1d/wDrFqZOLQFy/wDIstSkS6u/9FfZ5+mv81YuKAxNW0ex
+up40tZ3SPe6eY6fdrqWNdhm3Hp1okH7+T+DZJIibd1cscW+YRSg8Pf6dI91O72kCPsT+H5q2i7aW
+MitPpM9laT74PP37/Mnk+75Tfc2VrGoMZocmmWoj3x7454/9W/3qvGT0HynSXUEE3lpavInkR7J5
+P977rvXlRnZi5Snq2pT2skcCSbIERH8z+Fl/jroXkIifxDYJd/u44037Pv8A8SqldEabewxlpf28
+0cmo/ZI/Mtfkk2fe/wC+aSXLoXcp/wBpTzatPBBAnmQR77R9nzfcp+z5dQuXLT7DJYf8TiR4J089
+44/93/ZrGcWxmbb6lHc6bI7yeRIk6eR/u7/vVvTg46AJrN9qX2e4/cefaXX/AC0T5vL+f77UqMDM
+Z9n8i33pJvnd/wB5JH83lxbPu1rOAFW/tLGDy0nnR5E/dx28f3W/i+9/wKm0zNGjPJBqLx2TxwfJ
+GiRyfOu7+6i1i7m6MjUrS4d7iy8yPy45/wB5G/8As/3a6YQ5UQbnkR2txstf3/7vZHHP/d/u1zRq
+WkASR6be2EkFrHImzY8kf/XVKyi2mBQtNKtIY98/3IPnkk/ironWurAJqumyXVgnn37wRp/q43+d
+pN1GGr2MylBpME8nk/6iP7nmPWlavcZqQeG5IJNlrP58fluk8dYyxTLLljBBBB9qeTY+/wAj7I7/
+APstYSryA5m6jv455LpI/P8AM8yCP/eWvRo00okBPpk89xI88cnmPs8u7/3PvVpSmkwG3Gk7JJ5I
+JPLj/wCen+zUOoizQTy3/wBK0792m9Ek/wB6spTSAdJYpp06PdR/v73/AJaf73+zUqrJikR39vps
+OmyRvP5j/wCsgj/i+ahSkzCRUv0+1WHn/wDL3Ankf3q2pSsb8xWjsZI9I8uC4Teke/7I7/va6JVb
+j5i/BB/aNhJdeRP/AGskf7yf7y7fup8tZSqe8QYUemanHHG6XEe9/wDb+fdXTKpoA+0u500yO+g8
+xI4JP9Y/+5861nOmBraTrPmT/bXk/d+R/frinQ6CKccmye48+fZYXUief/2yeupIZV+1xv8Aa5/9
+XA8jx2/++tbKIFG4uPIvLeeP55PL/wCWn3KumZE8dvJdfaL6OOOP+PzET+P+7HTqAaMEFolxHPHH
+5E6fPcR/w/L96uKVZs1Lkd/AjyWMdp/r9j2mz+83+9WTi2BFcXdhB8n3J/M/0iP72566+QDLsLSO
+fzEkt/Pk8z95I/3l2UOpygaVhYW8Ece/5/Lj/wCWf93fWarHXIyNQtN9/wDJH+7ST/x2to1TGRHa
+aJH5ck7ybJIP3nl1U5snlHz6fJPJJ5f7iP8A550qcw5S3JYT/YJPP8vzHko5zSxBHpeyPy/+edHO
+wsSSW8fmSP8A3P8AV0c4WJriSNPMgk/1n+so5wsQeXb+X/yz8ypsQVftdvHJsST93/0zqvZ3AZJd
+xp+7j+etvZgFxqcf+rj/ANZ/y0ko9mBBb3kf+r8v/tpWzRFx/wBs8uT95WLQrhJqf+s2UvZBcPtc
+kkfmRxyUeyC5R2XH2fzK25kRzFqNLyfy/wB3JJRzIOY0LDQr++kj2f6v/lp5lc1XFJC5jT/4QwSR
+xyR/vP8Aln5dYRxyf9f8AOYT/hC7by43n+Tf/wAtKzlmN/6/4AuQ0Lfwz4dtf3+EeRPv1i8c3/X/
+AABchLItokkj6dZ7JP8AV+ZT9pJm/tEQ2kt2/l+fHsgo9nJh7RFi4u/sskeyPzN/+rkrBxTJLto+
+pJdxvPPHs/5aR1m6MQLs+qz+XHsk/cQfu556x+rGhBd+IJ08jZs+dN+/+Gj6sAyPVXtfM8+T93PH
+v8xP71aRpJGZSe7+1SeR5b+Y/wAnmR/eatIpoC8P9RH5EkmxP/QKmmrmgJYX8ck8E8fn+Xs8vz0/
+5ZS06isAyPQrSD/St8ex/wB/HH/7JWlOt7uoD9WsbiSDyLXZ/q08zzP/AGWohW94CnBYbJNl9JJJ
+v/4D92tLoCbZafu/3/l7JP3kf+zRdAGraVps/wDpUL/vH+eTZ/D/ALNKOJuwMDy44P3EEkk8k8ie
+Z5ddkPeA6K0gCSeQknkb9/n2/wDerjc0gHSaM/8Ar45PIkg2fu/97+JaweJSAtSafaJHIiP+8j/1
+eyiVRh7IuWmnp5G//lhJs/8AHKx9oxeyHyWumpPI726JGj+X/wB9UvbSYDJ8vaR2v7veibP96jlm
+wG3WpQWsEc7ySbHTZJH/AA/Kn96pp07mpgvrk7zxolh5Gx3j89/72z+Ou+GHVgJvtetfZJP3mz93
+vjjSqVMZQv59SS3tHj+SN/3ckcn3lrZU0BfgsNFnntHmu08yDY/lv92sZVn0F7MgnsNFtZI/P/0q
+d9/7yN/vfPV0q8w9mWJ9N0y1uJIPL3wf8tN//LNqyjX1NbRK09ndQx+XY+Ykbx/x/drpjaQWiRWG
+o6n5ckkmy6uEffHsf+Ff4aiVCnLb9TL3hk+u6tdW/np+4tH2f6PQqFOO/wCoe8Uv7a1PyJIJ/Mjk
+/wCen8TVf1VIPaE9vf6lP9k3/Js+T56r2MUHtDpoftcNv9q/ubEkjT+Jq4K0Lmhce4jubSSf939r
+g2P5n95awi+UBzySf6j/AI+o/knk/i+6/wA1YRMxkk9o+pWieYnlojv5f95f4K6EgK9pq0cGreQ/
+/Hq+9/MT+9LVSppGhHozwXsk9r99H3pG6fxfPu21jKNmBpadpXlx3ez/AJab08v/AHawliBSILeD
+7jzb/MT/AFcafMzK39+t6LuYSLU97punpsT995/yR2iJ/F/FWKpupqb8oupa2kNp51lBv3p+8jT5
+f+B1qsJKpoHKWLHVJJ4I/ssf+oj3v/6FWVXCyckQYN34ukg8+fyJHRP3cnz/AN6vQp4NuIEo8aWF
+7YRolpJ5/wDz0/ut/DXOsrcf6/4IWIrS6gupLu1dEgkn3+ZvraNJx0AmtYrSyn2b4J/J+fy0+Xau
+z+CoqVeYPZ2KV/4hgmkkeykd9/yPA/3vlojhLh7SxJpWq+ZJI91cfu3/ANX8/wDDWlWkmBffxP5H
+7iCTz3RESTz/APlnWMaDAYf7Snnjk89IUT/gS/5ZKUo2LkUrvz44JPLjR4Pvxyf3V+69XSlYxkVL
+++uE/wBFT/UffkuPvMu2u5UGzQxrv7PfR28HmR2v3/L/AIkb/dreMHEDQsdPu9kiJJ5/l/vINifw
+/wAatWNaori9mX7W32TwfariT9/G6T2kn8NZVqjsHsx8d3aJf+efL+wvvSOP+Ff4d1Y8rlqEZkk/
+meX+4k8944/7/wB1aORz0N4zKM/jK7+/5EkcEH+sk2f3n/2qr6jJGJavr+01COD92j3zuj/7zL/y
+zrPlcRD9S8iDTIHgu/3e/wDeRv8A3v7lXSinECtq2q/bfsk9q+yefenkfe+7WlKinIZnaVfanPd+
+RP8AJAkn7yN/u+a1bYmhYyNN75INNS1/5CNp8kE8nz/LWVKF2A6ewsN6Xqb/ANz88Fp/HPWUJc2h
+vylKTxlqSW93J5cHkfc8vzH3R10Rwlw5TOn1W/uo97/PI8nl3Ebv/C1avDpGBoSfYZ5PPg8uB9m+
+f/0GsJTa2ApXc8+j2kf7vZO/zx/7UX9+t/Zc2pFya0g1b7fBPayfuLqRJIPk/erup8vNoK5u+L9K
+u0u7RJ5POgTYnmfxt/f21zwqpnSY8mjP+7tbX/RbRJ/LuI5PvNt/jb/fradZICr+8tbCd4LiS1nu
+vkjtP4fk+9V0omRnx3H2qOexf5J5/wDV/wB7dWriBpf8I9fvBPA8cfkQJ/H/AM9fu1g66M0aOk6H
+O9vpv7vZJ56JHG/96L71Yyrq5ujFnsNTn8Q/bUjk8x538yT+GP5/nraFS8bEGld30FlJJ9lj/wCP
+rf8AvHf5ttcsYXYGPYeIZIL+R/L3749k/l13TwlkFia/13e886fwbPk++tc8MNdgSz67HPaWiR/6
+x4/Mk/2qpYaxBDJ4o/dx7/Mnjtf7n8O37r1ssNcCe7urv7JBPBb749nnyf8AAqxVFFlAa158kcEf
+7ieB/Pkjk/5aMtdEcOgNK+1a0TzIJPLSR5N8f+7L86PWFKm2jMq33iH7d5EfmbI4JHj8/wDi2tV0
+sK2x2K0eu/YvL/cb4/8AWf70VS8I2Waceu2HkOn2TyIJ0/d3f+1/DWLwjAz5Nav3jgR5PtSWs6eX
+G/8A8XXTBIUjm7i48uSR0k/7+fw/7NdsKaaMZG7aa/8A3/8AtpJ/012VhVpWDmC/uLR44LqSTfOm
+/wAyNP4v9+sYRewuYI/EL2vkTweYmzZ+7pul7xqVoL+4keSd/kjn/eeZ/tpXRKn7oGhJot/dSeWn
+yWnlvPJH/Aqs+6svaXApR2loln8kn7ueTf5f+7TvcCGSz8i3uJNR8x9n/HvHWiQFW8kk/wBRBHv2
+b5JI/L/v1skAn2C4f7PHBH+8uk/1f3E3LUwMkP0y3v44PPSTZ5cnl/3PmpVALEd3cQWcnl+X5nme
+XJcVDikal2w0mf8A0ieeSPzEj3x/3dr/AN2spVkgIL+w8zzL6T5P3mzy6dCfMA/Sbu7jkuIJLf8A
+5Yf6R/eV/wC9RXpgbP8AaFvHaRp/wOT/AGqx9mdftClf3lp9o3/cjf8A5Z/7VHsw9oVftkaXH/PT
++OurkOfmIJNU33En7v8Ad/8ALT/gdHIHMP8A7T3pHH/37j/26whSaYcxn3GoSeZb/wDkSu6CsHMR
+3F5JBcbPuR0lRM7lK41S4e4k/ef6utlRC5X+2Sf9/Kv2ViBkf2iSnz2APLuJP3f/AC0ok0gNSw0i
+PzJPtf7z/nnHHWEqgjUt7S0/55/8tP8AV/7VcEsQzU05NFtJ54P44Hk/eVi8SwI5/CVmkn7iP95/
+rPL+/Wn1y5lyj7SwjSP95HH5kf8Aq4/9ql7W4cpb8jTE8v8A657JKmE0ajtNngSeO1T/AFfz+XWF
+VXEXUnu5/MSCPyJ0+fzKzaiaGhJb337t0njST/nmlZSjEClPY2iT7JJJJI0/5Zx/3629pczCOOSC
+Pf5Efyf6uT+LbR7O4Fqwu9N+5PJs/dp5dSnM0IfMsUn/ANZsjff5dxS98ClH5E9pJvnkkknk/g+9
+WzQFlPM8uN54/v8A+s/3awlEDQddJgk8t/8Aj0f95JGlHtWBW8mwnt9kcf3P9XHJ8zeV96l7VgaU
+v2V4I766gRET/lnU1lK4gsdWsXeT/Vpsk3/7y1lWpyaGU9S1K1gn/cyfuJPnj8v5q2oxnbUBmpSX
+djab03un/LP5/m+etqXLF6gVk+1z2nlzx+XJBHv8t/4mq6juEole71W/SSCCCDfJe/6jZ/D/AL1O
+lRuc8oiXdprOtyfapJNkcHzyRv8A88lpxmjoLlpaP9rkhj8yODZ/q9n8Nc9VKTAuWkH2qPfawfOm
+/wAyOodUCybGwurfznjjtZ3rCVURTnkS1t/Lnk8/9/8Au/71aupJjJZI7Xy4/wDlv8m+P/rlWDhI
+CpJq0FrBHdQR77R/k/4FXTGjqHOZ93rt19nj/f7ESTyJI/4lT71bxw0Q5zA/4SHVvI2Rzyf6z95H
+H/F/u13PCQQFmN9Se4j2f6tP9ZJ/F83zVg6cEBe+3XCav5c/mPG//LT/AGET72yn7MfKPuHtP3kc
+c6IibHk/4FVWsHKVpPEMfmf6Lcb50k/1kf3NlQ6DW5pyhdvrWo+X5/8Azz/d7K2oUqa3Cw9/DX2W
+4t7qOSRI/kfzH/i/vUSmZxdy9HbWCXcnkXe+RJP3cn8O7/ZrnkdEadyB59a1F40uo/svnyI8kj/+
+hVUMPGKETT2/7uOxup3e0ukd4J4P+WDJ96lTiou4GZZ6JdwTzom+SODfJJI/y7vkrWWJ5yI0y9pl
+vb3tv/pUH7yF/I8z+62z938lYSrchtGma6aNpromqXX7mTzEfy65amKmyCe+ksbWe7dPLe0f/Vx/
+xf7O2inUmwHQal5/7iTy0d0R9ifepKmZmNJ4gt7W7+yp/Bv/AHf8W1q1WE5hm3Y/8TGD7V9zfIn7
+z+Jdv92uWtFJmJQfRrv7XsT9/sk8v/Zb+KumNeMYjKZ0bUrpPtSeZ56SOkcb/KitVfWlzGjEsdJv
+9Onj8+PyIJ33ybP7q1WItJHPI05tb1V7uNI/+XpP3b/3V+7/AN9Vw08Koo6C7az3cD3Dv888EaeZ
+H/vJRUgrAVb4efBfXcEnkv5iPHH/ALSp/DW8XzmXs7GfceO8Wn+r2fvN/wAnzfd+WtVgm/6/4I/a
+WM2PXdSn8uex/wBXP+7/AHf97+5W88Pygbkc9hNaSJPHvu508j5/4ZdlcU4uLuBBBpUf7+d49nkR
++XJJ/tVvUrXM0JqVjbzzxv5nkSPJ+7nR/u/JSp1rHQjOt54LqeeCSN0nf9xHd/wrLW8VZGYy/sLf
+/S7FJ/nST/x5aUZWYGRd293p1vv/AHieRO8dv/uV1x5ZkWLtiPPu9jx/8fUf7uR/7n/Aaxq2gFjr
+LDTH0+eO1kk/eIiPB/d+5/HurgqTUy1TKIb7FYRyT/Pvk/dxv/zy3/PShTUzeNIuSaTaTySPY+Xa
+p/y0/iXbLSjipXI9mZ7+D4I/s88EmySCTZ5cn3V3V0RxrD2Zci063so4P386SbJ3knT+81Y/WLnX
+CQlzcX/kWj3W9455NnmP/rdv91qNzCsznNank8v+y445EkfZ9g/9Beu+lFR98zkiW08Oz/YJ/Pk2
+X8KO8aR/N93+B6c60fiMJIkv/D3nzzukmyRI0e4sN+7/AHvmpyqlm5JpuizyRpp0myBP3/kfPu/3
+/wDYrJ1QMq00ye6+12vn/v8A53gg2fK237zeZSlFRNQ0n7d/r/skfmWsn7yRHT5otnzf9tKqSjNA
+IlokMHn6j5kEnn/u43+9In8NKtK8zIyYPnv50gkfyPM8y7kT7qxf7ldVZe4BJJf3eo36adY70jT5
+LST/AHfmrn9moamp0sdrpttA+oTJ50l1B5E8CfxN/wA9K4KteUnZCZydhBHdXd3fQSIlomxI43/1
+rf8AAP8AYr2LWjYzNi7urCZHtbWDZBsSCSf/AKa156pe9cCS3uo9U0WN33pdwSIl3v8A+eS/d8mq
+lTimOJu6ZPHZT2kzyIl1s2Tz/e2xb/4aycU5WNomnd+JI72/8iaNPM3v/Zt2iP5Uy/3Ntc6psuTM
+hEsLnxD56Rxp5G/z/wCFfm/g21qpyiYykZniSeS9+SytP3ju/l3Cf7HzfJVYKnyoLkkEM89pb3Wy
+N77yNnmfxNt+6n/XStJVtQuPv553+R450nT/AJYbP93bSw9EVSRZ8PXaJfxzz3e/yPn+yfxR/wC1
+/wACpYiLQU5GLJqzpHHP+7dHunefZ91llpujFsgx/EN39qvvkg+Ty3jkkj+VV3/drtoU5JaAY8Fv
+eRyfa4445444/wB5J/D/AHa7/ae6YcpBJZ6nPPHB5e+R4/3f/AKPaLlDlI7C8uPPjjjk2eX+7pzd
+0BesLiN7/wCeP5J/3cn+1E9YzXuiLqanJ9sgtfPkggg2QeZ/Dt/vVi6OpqZOtW93Y6nPa3fzukn+
+s/vf7VdlGAFf95d28f8Az0gj/eVcI2MxkEn7zy5PMfzP9ZHRONwOkez+3aTG/wC8gnT5I7j+H/cr
+z6b5JBEbplh5Gk/bZ45JIHjfy5JP4XoqVrzsbxM3QU8+72T/ACRv/wA8/wC9XTiWoGLLV3pdul5G
+88ciRzyfvP4fLrCjV5iPZ3M6MXD3EiJJ/ol1J+8uP7vz11VGpMiMS3p73EdxPYv/AM9Nlx5lZ1KV
+0dMYklpb2D2l/I8n7z/n3/4HSbYFm0ksH8yD/lnBvkjjk/iX+KsW2BNP4lu/skiQSSfZH2ef/wAB
++7XOqGoC2Grf6P8AIkd1P5n7v/ZT7tXWoaagyrq89nPH5fmSJs8vyPL/AIl/irejHlQGtcabsv4E
+tZ472OdIP3iJ97+8vzVzyq+8BSk8v/VyeZaxpJsjj/55vSAnkggT7Xazz+RHsef+P/W/w0LcClcW
+kEFvbyP88ib5P46tMBkckD2kjxySQSfft4/9b9+tUBDfx3/2P9/J+7ST93/wCtIxsBoaTdwTyTyP
+H+8nj2Tx7/m3/wCxWNWk29AOXk1W4/56V1+zM/aB9t8z/WeZ/q6fsw9oQfbJP9X5lXyD5if7ZJ+8
+kjko5A5iOO4uJLiSSP8A1cdP2aDmJM3E9xH/AMtPLpWDmLlxpOpz+XP9n8z/AJZx1zRxCMOZkcnh
+rU0k+ePy60WIHzMWPTI/s8jv8n/2FR9ZuaXLdhJaRx3H/PR/9X/uU+a4EcnkfaPMjj2eZ/q5Kltg
+XYLCeeST/np/yzrJ1AJ0tJJ7iN/M2I/+sk/26wckamtBBsjjT/V76wbQGtBP/q0jj/efckkkrj5G
+iuUZ9kgSfy/M/ePJ+7o52g5QurSOGe78iPz5H/1fmf7VaUql2QVrR/In+yxwfv3/ANXJ/DW8kMWT
+7ddRxweZsfzNlVJRLI0eeO7k3+ZJPBJs8ysJKIEHn3c8k+yP94/8dPksZlnyJ3t98/meR5myP5/4
+aXPYCv8A2TpMPl+dJI8+9Hk2f3a0VdmhoSWtpfRyPs+y+R/yzf8Aut/dpOuBQk1K3tZJP+ekkn7v
+/erdxAs3d9s+z+fJ58jx/wAFYyQFO3u7/wCyf6vfv3x29b8iAjt59WTVo7WT5Lt/9XHT9mgNiCNL
+W0kS+j/dwI/l/P8AxVwyjJyAzZNS0GR5H8vZI/8ArNn95a6pU24gGpatBBPstbTZs2PHJ/s08LCT
+jqBNaT3V7ImySTyPvz/991y1eWL1AvQ2F288d9I/yJs+5/49SqSsbyiS6zY3EEEfnyR+R/y08v8A
+36KeIa0MJIl+1WnnyWv+x+7nT+9/tVyyotAUNS1WeCd08zyI50RPMSumjQbAzZPEj2qbIJJHk8zy
+5I66XhALP/CSSTwR/wCs+f8A1lYSwoFON9WurjyIJP3nmV0OCQGnpthJHfyWs8/zum+3/u/M/wBy
+s3NICS7ijtY5ESRN6Sb/ACP9nf8Aw1zRbZv7Eff22hQSSTzpvSdEkk/2t33q1XN3D2Jz8aR2skk+
+nQPseT93/F5ddzqXMCzPPq18nnwv+8fZ5kf/AHytZcib1AdfaZPBf28ifPvj2XH/AAH7y1dOdzo5
+Tb0rRsW9vIlgjwfO/lv/AOgtXFi6/KKxXtLDTbr7XepBAkifJcQJ/wAsn/g210V/aLc1sEcE91BJ
+58/kXaf3PlXbv/8AZKx50KxF5UE32v7VsupJETzNj/MzL/dqozdzWVCxUsYbCb7R5EjwR/8ALCN/
+/Zq2Suc8qvKdXaad5+lSefcRz3fyPaf98fdrz519bAVrSeBHg8+BEgtY38v/AJ6rLL8tXNT5boC9
+fNaXUkf7/Yn3JJN/3WX/ANlrFS5WZxqGW8s+n6tAiRo8lrveeSP721f7tbxXObxqEaXem31357+Z
+5HmP5++qqU7EEN3Gk+kwXT7EgtZ38uP/ANAqqc2gEgsUkn866k8z7ieen+/srGtNrQgZrPh+fS9S
+8mDy3d9j+Y//AI5W+GxYB4fF9JYXcEHzzwbPL8uniacWzIsp4ku0f7LdRv58H+rkT7v/AAKs5UE4
+gaVrr8F1HJ5fySJ8jx/7X3a4KuCakWzAu9SuJ550eP8AdxwOkf8Ad3V6dKg+VXMGWLF5NO0KD7V+
++d5/3mz+7/tVNWGumh0Ed3rjwRx+Z/rP9Z5n/PSohhXJjMnXdQ1a7nkgg+55iP8A73m114agkZe0
+uWtN0Tfd2kEEf7vy3+1xyf7T1tWxHJoHs7k1paabp1jO7v8Au0n8yOBH+bd83zVzVarc7Bcz7G7j
+nv5H/wCWEex443/56vW9dLlASPxBPJ59k/yP9+Cf/gf8VRDDJoziS2l9On2vfdweXBIkflv93b/e
+pTw1joRpWMkk+k3f2WBJ3+R6KmhmaWlQWnlz/bv38jxp5H8PzVxVZ2Arzz6TdR73g/fwSOkG/wCV
+dq/e+aqg5QLsWLWfTbJ4N/l+f/r4/wC5H5v8C1jV5phYpXWtGa7jguk3yP8A8tHT5f7u1WqnhJRI
+jUINZv8A7Vd3FlOknl2qJ5Ekf8L/AN2u2hh3FHRGoQf2nOkcFrY+Y87xpJJAn8S/7NEqKM/aGzY3
+l/dSR3UEGyCdP38D/wB6D71Yygkw9oLb3W+SS11GeTy9mzzE+7tl+Zf/AB+o9hY0hIbc3E6PG7/6
+VYwPA8Emz5tq/J5dO1jnrSIzYabYvHqd6k/n2v8AqINm7a1Eub4DrlEi/tiweO/1CBN7uiJHG/3p
+F/8A26KeHlL3DCUTMtJPPnjup/3HmJ5FxO+//tnXU4uxmXZJ9Nhn+1Sb5/PTZdx7NvlzrWMogaEd
+9aaRHvtfnkeN3kk+9+6/jrnjGUzUZOljqGhSJp7paonz3f8Aek/557KItxeoiun2Sex8i6jfzEjS
+DzP9r+/VTneojM5jRfslrr2/7RH5Ef7i4jk/5aRf3K9mesEB0em+IbSy/dwRpPAj+fYSf8tVX/V7
+a4JwZqZl1fT3U+xI/wB55ciXEf8Atr8yVdKguoCeHtFgtUn1CadNmz/UP/z1/wBqqxVazsZMkeTz
+LuP9/sjgkSS7j8vd+9b+LbVU3dXAvz3fkWsc7x/6J5nlxyfdXzWT71ckqcnIcTUe+sYNGnvZ/knS
+REkg3/6yLZ/BWXsmpG0TG16DXfLtJoP+Qaib49jozR/7uyvQw0lIhyMS1u/PuLiDy5PL/wCWmx97
+b/8AZrWtTiYSkQW+tX6at9uk8zy4JPLjj/veVVRpJRC5tSa7YQRyXyXEiQTfPJGif8ta5Y4fmkK5
+i63rV3qt/wCRPfyPP/z0+98n9yurD0R1JDNH02/+1+RP5lr+73+Z/DsX/ap14JBTkaL+faxyQXUc
+c+z+592RP+elYQcOhY/Sf+Eej0y4sbqSTy55PMkjj/vL9z56KlSS2Aq3emeffx2qfu40+eSN/wC7
+/epKo+UXKWre0t7XVo5/MjTZ/rI4/u7JaPaPlHymDqcFvBq1wkkfkbJP9X/ertg7xOchElnBd+ZH
++7/efvLetoK6AhuI9/8A1z/1fmf3aKjNh93pGoR28k8knn+XJGn/AADZShUAdYaZ+8jnf93G8/kf
+vP8AcqZ1LGJPd6JcJqf+iR+ZA/8Aq5JP/HqKdW4F3TI5LVPLkk8+D948ce/+NK5anvSHEsW+taZd
+WH2GOSSCOeNEv/7tEMP7xtEks7TTLKeweOeTy/8Al4t/96s8S+ZGFPUm1Wzkvnd5PnsIP+WkdY0K
+nIehTgc1O+/y44/L/wBY8f8Aq9v7r+DdXpJ6XOSMTbvtFs7KwkfzN9xJH/rP7y1zRxPvWNooyLS0
+je7gtfuef/x8f7K1s66tcxua1xovn/PBHHayQbIPL+dd2+sXiUBn3HlpYXeneZ/p88iP5/8Ae8r+
+CtlLUCrYWdxBqf2GfzPLf/lon/oVVXegGpJcQQTx6PPHvjT/AI+LhPvSf7lYOfu3QGrq0lpp0lpB
+axyfuP8AUb/laP591clJOUhENvJJBHPdT/v53k8yON/4v9qtBlL7Jbpdvdap5l1BdfPHH/HVc2wC
+yXdgkkkEccnl/wDPu/zxS1Ue4DIL+OxjuH06TZcfOnl/efbL8u1d1aoCknz3FuiRyPG8n7ySerqR
+5QLn9gx3Uc72vmPPB/q/Ifd83+1WcMRbcDjfs9xXquUTMk+x3ElYuUQL1vpfl/6//WSf6v8A36l1
+Ualq30jfb+R9z/lpWLrCLlpplvH5kH3/AD49kdQ6yM+Umjt47WOSe1t/uJ+88ysHO7DlNFLjWp/k
+dPIT5PL8uueTXQsm8jZJIl15jyJUXGPTSdNvU3vG9Qq87iJI7TSbW3knjj3wfckraNeYya0sNJmt
+JJ0+fy/++qxbdhF+CwtZ7ffayb50j8uSsXJgU5LuBI43+z/u/M2fvP71bcjAfPqWm/ZJNnySQfPJ
+5fzU+RgVoNVtJ/Md/ksYP3cn97fTdGxoWbS7geCTZHsk+/HJ/drCUrAVoLu+eS73/wAD/wCs/vLT
+lDsBdjv7CSeOB43STy9nmf8ATVqXIBVsPskfmT3UkfmJ+8jj/wB3+9WoF2OT93cPB88Do7+Z975n
+/hrJgYfn3EFv/ov7iSd/3n96uv2dgLP2Se9kj8uf/Vx+Xcb/ALtLmsBLb2MHkRx3sn79/wDb+7tr
+J1WZos6RH9qd/Pk86SD54/n2/um+SmpNnQjn7+4t/PntU8x45JNkc6fc+/8Aers5WDEkv9JeD9/+
+/wDI/cfZ6fKzBhpupXEEkEEH+r8vZHJ/d/3amrQV7hylW7fWp5JHePfIn+snogooLGhG+pfvP3G/
+emz94/8AEv8AFWEoxTFYrQaDd/xvHB9+SSOt51WohY3ftFpBP8km+BIPLjk+9t/u1wXk9zpKd3q2
++x/cR/vP+eafe3VpGjd6gYKeLtWg+RBXbUy2Bj7eRpx+I9bvrC48v55E+ST/AIHWMcJCIe3kNgtN
+W/sySdI44J3k2f7bLWs5xK5QFpdwXFx9un890/1cf+3RCpEOU11g0l9Ng8j55/LeeeR/4vk2rtri
+c5c2pvWOeik1OC7gtXj2RvHsSR0r0HKLjqYQNy00yd5J3kk2XaQO/wAn8TVwTq6hYW7s7+bTbS6t
+ZJ/PdP8AVvVQqWYWGJYQQTyf2pJsfy037P7zVcpyaZoXbuPTZ/smnwXcj7E2eZXPSnJSuIgk1q30
+S0+ypsnkfZ/u/wC9WtKlz6hcrJqcaf6Un+oT5/skD7f4K1lS59AuPGvXeqWn+rk/g/eP/Dt/2qwj
+hVTdjT2pdTV7795ZWs7z2k7/AOv/AIvm/hrOrSUXcXtR+m6lbz61Ok8ex538jy0T7zrWsoKxBbAg
+utNk2Ro88/yR7/u1w0U1IDESDSdL1bZPcbJ3j2fc+62yu9p1YIYz7dHBavDHBv8Atsn7yT/nnt+5
+srR0FOSAq3HjXXXu4JoI9k6bIHjRPveVTpYGKiT7Ypvr91PfvPqPmJJP/wAe/wDvo/8AFW9LCxSH
+7YSCfVxP58Hz+Z/pdxGn/PL+KtvZxsZ4XQ2Rd/bpPInk+4myCRP9bH/FXBGglIMUrlu0eODUo4L3
+/X3SbLueT7qrsrOojUmtNOnuoLeB/MTZP5kk6fdZf4awjiFERN5c6eXa2sf3H+1SR/7v8NLnui+W
+xp6rcaa6R3195kiO++P/AD/0zrOh8RXNYyLOe0hsX1G1k/05JPkjT/lpurWavI50NtLu0e+jnuo/
+3Cb/AD/92WrnRbRshkl3YT3d3H5nkffePYnm/c+anDD6g2YV3q1h+/gg+fyJPPj/ANr++ld0KRhJ
+mtpOuRnz4I5Pkuk/dp/wD7lcVWMky/bXGT6DaJH9uupP9RP/AKPb/wDTL/7CrjiWkPluP1IaS/kT
+2u+SCD/Wf3tv3qmnzB7OxT/tOS0gk8ySP/Svkjk+9W0qEpB7Swy4sL+SDz5/MeDY6QeX/wA9f9qn
+OqmwkiKxs9MvruS6j+T7Km+TZV1JPlMJRNRLSweOBH+Sd498cf8Ayyb/AIHXHOR0GnPJH5HkJaQQ
+Xb74JPk3fe20oTsBm2+pX+l2jpJH5ED74PLjT/Wbfv8Az1viqCqS0Lpuwadq8d1J9l8zZHazpPBJ
+937v8DVM8OoIKjuasmkyT6lsgn3wPPvkj/55sz1zxxD6Gfsy5a6FozzwTzfcgg/dyR/djli/v1z1
+sTPoL2Zzt9rVvBBHBZSSTxwv56SOn/LX+Ou6dHUakdC8G+wkvbX5H2J9vgf+FV/2a543ibxkUbi/
+8ifTZ/PgfY+x/wC9HE38L1dO/Kc9WRsLJYz6VJ5E6R2Lx/6z/prv2fermjGSlYVKRwsnn6Xqe+6/
+eQT7P9r/AIF/wCvamk42NuY6WfXI7WxsUh2TvdPveeRNsW2J68ingeadxXIoJIL2e0SeSN4LqR/M
+j+43zJ97/P8AFVqnbU0lIwtTtbCOeefToJIJ7WSBPL3/AMK7nruo1mlqYORBf3etajb2l1HHG9ok
+n7vy/wDarWEElYGWL/XbTZfwPJv2fPBP/enWsoUWpHOzHtNQ1aCSC+8zfI77I9/3P92upwS0NPam
+naahHa3/AJd2knn/AOs8tP8A0OsJYfl1D2hpR6tBHbxv5fn75N8kb/e82uRQ0AXWbGwSDz7LY/l/
+6U+z/nqnzS7q3w9SzAzII7B0knT93Pe/v0t//ia1c25AVoNT+ypf2s//AC2TZJ5f8NXWV7Ay/o2h
+QXXnwWs/2rz9n2iB/wDlm3/Af4K58TXaktAKdhPd2urT/uJPtcO/zP4l3RVvJKpECXxFfT3umb4/
+M8uCd/L31GFp2EzFsdT/ANX58cbxz/u/Mf8Ahf8AhrsqU7mMjpLCS3/cWr7/ACPk+dH+7L/9nXlS
+Tvc25itHoQ/0+T7l3BOnkTwf3f4t1dMsQ0g5g1pI4Le0ntfn8+7n8z/d/wBqtEHMPj0201S0v/Ik
+8iCCDz/s/wDF5sv3aE7BzHIvHcfZ5NkckckH7y4k/up/DXdzmMTp9BsZJtE8+eTfvk/1H+783z15
+uJqWZtEZ/YN3dX9xOlx/om/yI9/+19ytY4hWsTYzLfTEj1O78i48+0g/eRyf7X+1W3t/dCx0Hiu3
++yWdpPPJJPff6yeRPl2q3zR/JXJRppOxdaJj6Jq0iSSJ/r/tX+s+T7v+1W+KpJowhEdqV3H5kDpb
+/ao3/wBZP/y1+X5aihCxuQxnfcf+RI5PvV1OpYZZnsbe1juJ3kjf/UeZH/vVy80mTzE0etxvYSaX
+/wAsIN/lyJ/tUezbHcy4LqeCOT/Vv5/yeW//AKFW1bUwdOwl3HeP+/gk/wCukH3tqUsPoK7Rbkgu
+7q7jtY/9fBH5f2j/AJZMn96oVTTmNTJjsLiN/strJ5n2r/Wf7u+t1U93mYFyfyJPIgtf3EifJHJJ
+97f/ALVTRi73ZkibRX1+1t5J/P8A9f8APJHJJ/FF/eoxEbgRaZf3l1cTpP8AP9+SSP8A3v7tTWNT
+Tkv0uo43tZP9RGifcrFJoDP+1xv9ourqT/T3/dzx/wB6ui+lgN+OeOS02JI6SeWiRyP83zV5yh71
+wKD3do999iuoNl2kjvJI6feXZ9yt403a4jMkkt7qTz08zzPM2W/+4n8Nar3Rh5kcEd5sj/eRyeZb
+7/4dtbxV0Ban1OCeO31R4N93e/J5f92WJ/8AWVgqb5rCMq/16eCTZaybIPM/1D/MtaQwy6mVh739
+nqt3G8kklrI/7uT+7WihYYX8lpHHHPaSSfa4Pkkk/vVVKIFK3k8y38//AFckcnmR/wD2NbSiMt3F
+3dv+4nk8yPzPM/4HXNGCNDT03WX07zHSOOSSeP8A5Z/7FZVcKpBYl0ywggkkfzP3nl7I/wD2espT
+kYkyQQJcef5f7yf5PLrCU5AS/YUgu9l1HsdPn8v+7vodVmxZkgsJEgd/46xdViLUlvYeWkf9/wC5
+WUarLsQxzx2vmRv/AKuST+D71bxmHKSyXcjyb4Pkj/5Z7/71Z8xBPPcXCRyb4/v/AD0cwFL/AFdv
+P58/7t43j8v+Fq1jcZWv7u0nsI4I4P3if53VsgCCCOO3jkgk2b5Nkfmf+hUSkgJruS7spLiOP54/
+M/dyJ/erHmVxGNOmr3X+v8z5P3cldntEMhksLvy440j+/wD8tP71HtIgbX2S3gs/ssEm+R9j1zyl
+cs0E1Kzsvk8v/Wfu5I/9qsXSuBS8+eO7kjTy03/6yP8A+JrbkAhke38z/lo+yRP9X/s0coFkx/bb
+iP5PLgdN8e+sWBZ8iPy0TzJLVIZP9XWLYGJPH/o/2V/LSR98lv8A3q9BSuARz+XYSQeZIk/mJHJI
+lNUwJY45LW4t/tUmz+CT/gVTKKRmjXg015reOFHRLtN/2vZ/dauGpiFE3RQuNKeS7S1e3+//AKv/
+AID8td31xDbK9x4Pu9OvHurqT5E2P5f8XzffqvraMGza02CxSCB5/nRPnj/3dlcFStLY3sPu5I7K
+OONI/wDRP9fJv/55S0U1JhYrWD77jyJ49j/O6f8AAkolBpisUEtHe7jS6k3yPv8AMj/2tnyV1SqJ
+RHY0oPCDzWkcaTp56R+RPH937tc8sfH+v+GHcs2Hh+TzJE+5Hs/cf71ZfWb7AVHsNJ06TyJNk8m9
+0k/2ZXf+9XRGrORpaI+0urHS/k+T9/8APJJ/uvWNWNRhyxCC/TVJI9OePYjyfu5P4trVU4STJ5R8
+kU6RyI8aeR8kaTp/7PRCkw5S+yadPHvtfv2v+rj/ALrSvurkc531CsZM0k/n75I9kEn+s/369Byi
+46mEDQgigtbD7VPP5EkH7jy/4vNrnnTbN+UpyarI9p59lHvR0/eT/wB1oqcKTTswsY1/PvkkeaT7
+Ul1BA/8AwJq7KcJW8yTbsNWsXtNnkR/a9n7iSP725XrjdOSYFTUtON1cWjp5fkeZ5Hlom37vzVth
+6tnY5uYwJNMuPtclqn/XeP8A3a9O3LqO51tjZol3Gm+T7Jdfv49/3P8AgdeTWbkrl8g/7bY2upT/
+ALv7L5OySf8A4BWUYSqIOQnv/EMCXf2ry9kkD7PL+78sv8VaQg7Ghja7B/x6fYpPLSf9/Jvf7rVt
+hnG+owvtMe60a0m/1d3BJ/r/APnpE9XhppScQLWnSaTda7aTvd77WCP/AESP+H+JqmrUcIt9QKF2
+I7rXbvZH/wBc/LStITfIc/IF/b7LeN540njg/wCPeT/rrWdOrKwchJY2FqIN6eW8jx/uI/4lX+Go
+qVJXL2KcH2C21OSeeP8Ad2sieZGn8W2tZKVkG5p30kcN8l19k/cJ5/n73+aPd/DWUPeTNR8Gsx2V
+3A6T/In/ACw/h8paxqUBFyHWbC1u5LrzN8c0mzz/AO7uT+CrhS0OucdDndQ1C0tYEhkuN8H3K6sL
+QvJs4ZuxSfxDGieRB/q/v+Z/txVpPDWYRLFhcXF1JJBBJ5e//V/7X+zTqaI3iUdQkjgnj8iST9/G
+6Sf8DrSxhJkUFpbx2kkn+sd/3f8AwOk5nPKRTjE8eoR+R5kf/LTy/wDbSuyrGLRpyWNaS91IQbLq
+ONPL2P8A7WyuGNCLYvbWNWc2F1Hbpax7H8jfJJ/47XFK8dTo9rcmu/Dtha+X5k8d1P8AfjtK2pV5
+B7O5btNVkkn2Rx7E/wCef/TWufl943lE56DUreyv3nsbjZaXUn+kR/3f71ei6d4mMomh9u3wXcHm
+fv4I38j+6v8At1x0qIDNFv40tI7q6k2XfmbH3/NuX/Yp1aVnoA65kkefy7XfP9+CSP8AvL/eqKd0
+zKrKwafd2EL/ANqpH/19x/e/8droqwc0OlK5dn1v7LJBJav5li6Onlp/eb7q1zUqHcv2hmR6nP8A
+ZNlrJ5kjyfwfL83+3W8qMeoe0ILO4g8+R/LdJ3j/AHdv/wAstn8X/Aq3dHQwjI3dJS4ukv72ePyJ
+4YNkkH8Lf3mrz69k7G6kc4TJdatcfYZPLjn3vH/7NXoxSsYVZF8Jd2sdxZPHssXj8+COT+LYlc/u
+3FSkV/7evPsl3B5caefsjuJPvvtT+7WioNGtyrPfySaZGkkm+P8A5aR/7v3a2oUNRpk9hqfmWdun
+7v5JP9X/ABL861z1KRcmW/7X8i7u99pvu33p9n/u7qKeHuc8maNjf+dBHA/+sf8A5Z/wr8lYzi4M
+3Zl6V4Teby4NRk8h/M2fvP8AnlW9TFxgjBmn50fh3z7JI/tUc774P93ZuWuWMnPUv2RWtLa706OR
+PLRNSdPtWx9jLt/gf5q3TctOgeyMbU47uO/sLX93O77Hn/66/N8lbQguVgdxps8D2kf9oRwPsgef
+y0/75ijkryKkrS0Ec74lvpPMjeOP94iI8lwn3fm/hT/drvoQ0uMfcabbvpsd7J/y+wJ5e/70cv8A
+u/3al1bSsAy0jsNIgkup5P36f8emx/lkrWqlUAtXeuwajbyX3kbJIJEgkjT5Ym81P4qlUGkBSn0y
+RJ9N2Rxz74H8y3/h2r93dVwmKRR1DRLCC4gk8zyLR5I4LuCP5tv9+uuFS5jIpatLYWWvTpYyfbrT
+y9kDyI61dNRlEOYz5NXvE/1cn7v/AFckn8dVSoRkw5h8eoXEkcf2T5PLjfzPL/iqfYhzD/7Xnj8t
+IP8AWUvYhzDIr+Ty4/M8z955kcn+5/drR0widXaP9hnt4LX/AFDx+XHcff3f7FebiaZtE3Z57RLS
+R3t9k+xP9f8A3f71cMd7GtjP8/SZLe7gkj8h5P8AV7P++o91bK9wsa1tJBdWm9/3/wBq/eSef/D5
+Vc0pyUi6yMZrR5/ItdLtI4JLp/3+z/lmq/7VdjndamEIkOtQW+j6LcQP5iXc8/mQbE+Vq6aE7gcx
+cXEljJbxwfvPM/ef71dTp3GRRpfx2kl1JH5kcn7ySP8Au/P/AHafMrnPzFqOxv8AzI5/3ckF1JH5
+c8f/ACy/2XX+Gl9YSDnLclldweXJp0fmTv8A8tPvfLWS1NvZtENxBbzyW8H3J/kjkk/8dpbFXSLj
+z3b3e/So/P8APkeD7P8Ax7UqY0/d5TMpSX0enXfn2v7+/wDL/eSf8soq2jT93lAwLi8kkuJHk/j/
+AHldPJYzJLPUNn2j/npJ/q6OS4Grpurz3dwn7uDz4I/9Zs8p2T+KscRR5UaGtBY/avPRE8iDyPLj
+f/drznXURGfpkdxPYeX9k8+SCN/M/wB1f7ldNR+8MgsNXuJI47G6/wCPTz0j8z7rxfPWs6egDLu7
+njv7u1vpPP3u/l3En3qdOCewI0NF+1x6Z8kn35/9ZXPiXYC7q2i/v/8ARf8AkG/PJJPJ/wA9f4tt
+Z0q10BWntLC1ktPsL/bfsscjyffVNzJ97y61p1NQOdksJLS08+eOOSSeT935n9yu1VbmRS8uT/lp
+/wAtK1UbjOqv7DTEsLif9+7pskuI9iKkf8NcVGrcRkxwQPJ5kEkk9gkkfmRyffWtp1AJ7e7/AHcl
+0kcfnyR7Pn+/t/v/AO9WVSDiamhrWmSWNxHPH8kGxHj/AO+KwhUYGzb2nlyb5/LeDZ/49XDsAW+k
+/wCsnTzP3H+rjpqoBI8H7vy5/nkePzJJP9mrjUuBkfa9IjjkR/M2eYnkSVvGncCH+1/Ls/kk3+X/
+AKv/AGa15EASanPPHG8EfmR/8tP96k4IDQsJ5/Mje+/cb/8AV/8AAq5uRXA0JLe/eCfZ5jyJ/wB9
+0ciAZJZp5lo7/J/Bcf7NRy2FYq3Fv/okaJ/z0fyLj+8lPmsOxPHJJdeYk8mx4Nnlxony7qgsm/0T
+zI3f/lnJ/q0pAQxz3f2jy4P9W/z0lCIGZdyXb3cG+P7ke/y66IwVgJ0guHkgup5P9vy0/wDHamdR
+ATXdxYQSRyQf6/zP/Hq0pAE8872kc/mRpdp88f8A9lWSgAXDz/b/AD4I98c6P5f+9so9mBNaxzzz
+xpH88aJ+7k/vf7LVjUVgLl3pVxPHv8vfJsd5P+mf/fNKnWsBQOmz3X2SZI0cxx/6z/d+7W1TFoAu
+4P8AR45P3Hn/APLSP/2alCaYDdT+e03+fG6eZ+7f+Fq0oqxpUkWdFvJPP+yp/rH2eZJ/7NWOJ1FT
+kPlTVpP3/wDcf95/vUqvKx3LN9dz/b/Pnk8vZ/qN/wDdqYULhcqzpAklpvkT99/rP7q7qI1JWMzV
+nsYLqCNLrzJEfZ9x/wC7/DXNCtLmAo3FxYWUkcCT7/uPH/wKuqpDmNLhdT2k0c91PH89qnkefH97
+/ZopQcdBXIU8YT2t3Gnl+fBs+eT/AGv71EstincPbGfJqk8+pT3Xmb43f93H/Cv8VdM6CUR+2JpL
+RPLkT/l/n3yf8D+9RGsYWMX+zLieO0gupHtY7pHkjkf/AMdroVWwrF3TbePS7v7U9x+8k/2Kwry5
+46GhuX0e+Dfa+Z5D/wClSP8Ad+SuCgmpagihqWvXVlbyR2se+P5Nkn95a6qVJT0NLkn2j+0bSOR5
+P3afP8ny/M/96lOmoBcrSPG8ckaT/arT/lpJ/Hu+7WspcppyGnHZwR2n2WD9wjwP5kf8VZOd2HIR
+6M8FrHHJPseeeDZ5f935KyxFzLkH3Vh9lk02+8xEngnfz/8Ae/h/4DV4eokHIQ2E+pXXmSXT7I/M
+d44P4q0eGiO4XerWf+jz/vP38my7/wC2VT7ILmJJqU91PJPBH5H/ADzj/wBjfXU6SRgQ3F35c8kc
+/wDx9+fsn/65feqvZJgaGpfZHsILqeeN5Jo3jj/vfL92sqdwKumX6QeXBdR/661eCORP4f7tVOlz
+aisWpL+fVLWC1TzNlr/yzR/veVWfK6chhpslhZT3cH/LNJN8c/8AHt/4DVV586Aht9QitbuTZJ+4
+uk2eZ/wOqlQuhxpRLe8ag93YpJH5dr/y0/3HrGS9mbxpxM6Ow1fzJ4/+WcEjyXE8f3fN2bq63JGY
+R3+yCeGeD95Oif6RJSVFSAfHrdvHaXCTyeZPHJsj/wBpf42pqgLmKUmr2915enfctEk/dyfxfP8A
+7VbRohcuySWcFpskuJPM8x4/L/grGUW2HMYV3eeZHGkEn3P+Wb11ukrahcfplvL5cf7yP+OeOP8A
+veV96oq1HcgguI7uC4+ePyP+mdVGSkgLtxHeJH58n7/yP+WdZJRCxPb/ANoPJJ5dv+8gj3yf8C+7
+RaIWDT9Ut7W78+ePz4PLeOT/AIFVRpWCNQW0l8iSOP5H2fu/Lf8A2qxq0rm8ahbEumR2n2qDf5/n
+/v49/wB5VrLklc5o1LDbDxDA/nwXXzpNJs/4DTr0ZW0OlYgJJJHuH8iePy4P+Pe4f+LZQ4szK1/J
+YR38bwRyeW8f+kRyf8sm/j21vSbGO+yaZOkbySSR7/8AV3EfzPSjXa3Mx+mRyWv2i1eTzIH/ANZJ
+H/f/AIWrKreQBJaXdrqfyXeySD/4irveNgMiO7uEu4544/Mf/WSeZW/sbwsBpWeoeXHInl/uLqT9
+3H/zzesteY0Nnw7d6LJpsljdQf6e8jxxzpH/ABy/3qyr3bEc/cSanBf/ANm3X7vZ8ldTfMhnTWH2
+Sexvp7qR0tfIj8yDf829fk+WvOrJp6CY43GmT28Gop+4SCRLXzP+WTf79FKMkdNaUWVH1+zjt7vz
+5JJrt/n/AOubfd+StpRkzCEoozLSZJLuRJ5I/s6f6yOSP+9/HXRKbauL2pZs1tNOtJ/tSPPaTv8A
+uJ/4oJd/+srmdRydkL2pNHpcb332662Ik/7yOSP/AKavSnWfs7ERpm1NoFpdaq6JO/25E8+Tz02x
+NEn8cb1zUq8uU2jTKUAu9Ov/AD/L/cTpskT73yPTnZkezsT3bPpcE+j6jHv/AH/nxzu/735quME2
+HtLGX9hu7rVo/Ik3/Zf+BfL96lGpyIDUt7id7iwhsoPPntd6QQO6PtVvn+f/AHKUfdfOBrabBb6p
+rsb6pGiO8eyfzE27m/hauX2nKrGhDIkGn6lPZPG72k93/rP7v/TKnz88bAZHii81aC+8+Ow+yweX
+s/vfL/00/uV14ekuUz9qZn9v+ZYz2t15iXF0ieXJ/wBMt9arCXmmHtCnc6pZyXfl/vJ7SPZHHJXR
+7No0rVLkVvYyTfaI5JPIt/M/efP8i76bm0YQq2NP9/pbwfvN/wBqj3+W/wDs/wAaVzNuaArT38kd
+/G9pH/y0/ef7W+uiiktwJvs73upyT2Mf2qOf9xJHJ95Walz+zM+Ujv7SPR7D/Srf9/dR+X5f8Lf7
+SUKftHoHKVrDSLv7fYRweWn2rZJ89OrNWDlD+wYHu5JLud0Tz/8AWJ/eX760o4i0Q5Rv+kfvIIP9
+R5klVKR0GvBHH+7g8yNPI/4D8/3vMrFsC1eJPqMEkcEeySePyI9/3W8h65ofGXKVznrCeNLyS7vo
+/wDR4/8AlhJ/Ev8Adr04TVzCUbj4/Ec73fnyfuNm/wAiNPurWX1NJmntAtPF2pJJd7JNk8/7z/gV
+VWwaaB1Ce3kuNRk2X0knlwRv5f8Au7GaspPkdgKsdw+pRwQXf7uOCPZHJH/fSumUuRXA1v8AhIfL
+tN995d1d2uz/AIEn+0/364/qt37pmJP4lt7qTz5JI7Wef5/LgTyoo/4dtDwvcCjcTz2lpbzwXH+o
+k3xxp9+PdVU46lqlYZYXtw9xvkk/fwR/6utpK4/aWL+mW9xBHJpyXEcFxdb/ALRd/ebb/wA8krOc
+9TMzLDSL95454I4/nk8j7PVTmrAZsln+7k8yP/V/u466VMz5RlxZwJP5cckfnvs/1daqQ+U1P7Mt
+4NWtLJ7eSCTzE+0R/wAX/AK4pVOaJY/V7+7j1q7ntZPIjj/eRx/76fdp0sPCUdQsZ9hPqHl+Ykn7
+uP8A5ZySbE31ryoJRHEbJLe7n/49Hk3ySQPv+5T5Uc0ojrCSzS7j/wBXPHdf8s/4om/3qzquVtTp
+N24tJ59M0ydJI/3e+PzErnVWK3Aj1KP7LHJJ5/n2nn+X5f8AsVFCVwJNNtNWnkkg/d+Xs8zz/k2r
+/doryApeIrS7uhJffvJ98+yS4+9tl+7s3V0UJ2QEdvYeRHbx/wDLdN/mSf7vzVn7S7A1Neu430n9
+xP58n+ruJNn/AAKopuKloAQWmmf2ZO81v5EcECeZ/su/8VTOUnLQBkdhpN1Jv+1v9gsf9Z5n3v8A
+xytJuYEF/d2l9bxzyf69I9kcf93ZTpwYD5Na2SeX9yD5P3lROgBs2mpXE8Hn/cjT938/3K4p09QG
+XbyPHIn/AD3+StI07AUJNM0j7BI8/mfa/P8AL8j/AJ5qtbqpYCCB9MtbjyJ4/uf3/wDaquRgH9p7
+I5IIPL8v538v+NqORgMk1qOOC38/93J/rP8Avl6r6qwGXetanPHvf+OTzJ9n91qf1YC3psfnx7/P
+nff/AKvzPm27ayqI3saf2CO68yDzP3cHz/3mrhc2mKxHJJHBd74P38n/AC3j/wB1K0IIZ5/Pkj2O
+lr89C9ANPzL9PnTY8c6eX/u0lUiBWu7Gf7RJdQXH7tP9ZG/9xv71bqpEB0F3I8iJ9ySCP/ln/FXL
+KDQFPUtBt3jkunu/k/5Z+X/eroo1raAXNJgje73+ZH/q98cf97ykpKYFaNIHk8iCSSCd/wDWSSfd
+o5wJrTUvIt3tbWP/AImSI/7yOiUbgEmq38EEd08nkXTpsGz/AJaNRDD32ArQX+rTx2iPJ/y0/g/u
+/wB2nUhBAMv7S+nv54/L/cPIj/f27d33qdOpBAX5rGwjsI5P+Wf/ACwjpy0IqyC21OwsoI3jj3+Q
+n7yTf/CtZNczFSkXv7d+1SSXVr8iPs8yCuJ0GtwuUfFElp/aXkJI6fIj+Yn/AE1+7XfQTQcxmzzz
+pP5d98myNPLkrojCNjUuW99qUcHkP886b0j/ANn/AKaVzRjHmEZF/J9q0GM7/wB5BIiST/8AoNdN
+ONnexnctSXCJ5EE9x+/eNPuf8tFpVIdR3HwWH+r3yeXvk2Sf9Mqzq1G2HIXPD1vH9vuLXzN8af8A
+LT7+7bWdVtoOQ1L+f7LJaTwQfvJ49/mf738Vc6RtYp3108F/BJax/aoIPkkj/wCmX3q3ih2INWng
+j8uZLfejyP5f8Xl/7NGF1VmZoel3P9hsIJI5P3CP+4k/iWVKmatICrd61afZIIPsiInl7E/vba2h
+TlEzuElwmnXEieZ+/fZ5kb/Ivzp92lUpOY7mb/aMej3H2WTy3g8jZ/10Vq6ZUnLU09sXbC9knt96
+f6zy5/L/AL3zVg6XKL2xXu7L+ypP9Kk32k3/ACz/AOmVa25noR7cI9YtJLSSHy9n7v8Av/NvX7tT
+9Ud7i9sQya1BHHG8/mPPBJ+72fL8lUsOx3IZLjy7uONI/Pgd98H+z5tV7MLhHHPdWFpdJ5f+hRvH
+JH/H8j1rVhYGTa9d2l9b/uP39xJJvjk/u7UVdlTh6bAz/tn2q3jjk+SRJP3daTpcoBdx3kdx+78z
+9x5fmR/7VKmwOg0m0j06Df5kk/2X/Xp/vVw1587Apz39/dW/kfZE8v8A1nn/AOytaqmkhEerRXKR
+zp9yOy+SP+9To1r28yY05G3pMVra/wCi3SRyeennxz79rfN/BWGJ1OhU2Oguj9vu4HT+4n/XT+Gs
+qtNokzdRks5Lu4k8uNI4/wB5H5n3a7MJdjOTuIP3ck/mf6R5jx+X/wCPbq9BM5+Yq26eZ/y0/wC2
+dbJj5jejsbie38u+kkSP5Pskn8PzfM7VwSqq4uYy7NP38kH3/M/5aVtOXuhzC3Ec9jPJ/BPBJVOK
+kjQ2rvWo9Rj/AH8f2q7gj/eXH3EWL+6yVFKk0wNi7tNMeO0kf598nl+ZB/ql/wCmf/fFeeuY3sTR
+39okF/apHHPG8aJ9o/2YvuUveCxnWGn2l95ib408/f5cj1rVxTRhGmbV94O0yCD5L+OeR4N8/wAn
+yt/1xb+9WMcUbRpmLHpWm/a/sMF35cab/PketYVJNmEqRz9rZpHcbJI/P8/93H5f9/7td9RvlOaa
+aLthpkkf7yeT94kj+ZH/ABrWdWsjuLUmkuknnyRyX0cnzyR/+y1jDEoCr9kkEnkfvIJPM/dx/wB7
+5K2q2iZmtd6DsktP+WEk/wDy8f3v9qsY10BVv7DzLjz/AC5PIn/5af8AobVEJa2AtT2NumkxvJ+/
+gnk/dybPu/7VaQxFp2AzNTsLu1sLTy4/3bp5/wBo/wDQq2p1lc0LVpYRvplv5n+s+d4Pk/1iP/8A
+EVhUrrmAku4LieOO+TfP9z94/wB6XYm591EXYCzHb29rJs+0b7G9tH/dyfeVm+aoqa+oirZ6dcfY
+PsKfvN8n/HvJ8rq1XOukTCg2ZOq+HrjTp/3/AJd1An/LSB63o14s56+Hkjfg8JPqkk99B/rPvzx/
+d2qyV588bbQ6vZHTSaDYfYH/ANH3yWvlwSSf892X5pErjli7MPZHHx6hJdXGySPyI4JHf7Jv+6te
+lKFnboRGqW76XU00yxvo/M8yaB/P/vbYH2VjS5VNo2jVMy48RTyfu3+dJP3kcddf1Bonnub9pfQe
+IoI7W6+SeB98ckj/AHl/iiauSrBwYnSuXU+yWvn3vn7/ALL+48tPvbG/d+X/ALdc0k5OwBBYaTZT
+wXUH7iSykT5H+Xz4m/iiqpzclygXbWOB7ie6uriPe6eZ+/8Au+U3y/w1jXg+axoM1KeR9NtP9E3z
+pO73ez737r5dy0YenaVgM+7095tWu57WffPdb45Lf/dT+JvuV1+05YmfsiO/8KxpYxx/2Z58/wAn
+mSI/yr/s1rQxfvh7MqW/grUoLiR/L+w2iR7Lvz5P73/oddn1pM0hTuc6r+R/okfmSST/ALv958nz
+u9NTTMK1Ow/XrDyB5F7JP/aVq/l+X/CqVOGkpAafhO/+yz+XdQb4P+Wjyfw/3a5MZFrYGaMnh63t
+dT3pJvgvt/kSJ8u1qz9p7QrlDSbDSfEN3BZX0+y7STyI5N/8K0+Z0w5SHVoNJTWbSC1nk8iy/dxy
+J/Eqv8yf8Apqo3FhymR4pu4PtfkWMexN/nyfvP4mrrw1LmQ+UtQQanY+Qjzx/wDE0jR4JP8Apl/t
+VEmBaj0mS9S7uo/3cdr/AK/f/wChVztgWJjcSabaT2MknnpI8ccf975P4amC1M4yuX5/sGneHo/7
+RtETVXg8vy5P4VV/u7K1jP3zojG5ymi6Pb31hqc88bxz2ux7eRPu/M/8dddebTI9kZ8llbpeR+Y+
+yT/VySVXO2g9ka9h9oS3ktfknsPM8uOT+L/gFYVY8zuBPpkf2We/geSP7PqMD+XI6btvlfNUVKnM
+rCM6DSIEj/tHWJJE02eT935H359v/PPdXV7TsQVfskc/nz6dHJHaWv8Ayzk+Zv8AgVHtP5gOk0yH
+7XJHrGt3eyxkjSOe3RP3rbP9isKsraF+0uMn0fTJNXS+SeRJJ98/mIn8f39lYRxD2D2dx1okj3c/
+nx+X58iSfJ/yz/6aVlUnqZjLS3gSeTfJs/dv5jx/L/qqc5OwyhPZzyaRJHa+XPHB/rJH+/8AM/3v
+92uuM9S+Ug1PSJ7WOP7Vb754/wB5+7/uf7daxmHKWZ9S+238mqJH+/fyI443/wBzb8tc8YNKxBdg
+v7Hy/P1G0/0vy9nnyPu/dN/H/wABrOrGXLZAUbgW7+X+8gjgn/dzwf7n/LSt1Fm0olO8k0y1k8vT
+p5J7T/Wfv/l3f7tNxbMJRNeOTQY7uN7W38iOD95cRv8AM33KiTk9xnPyan/oECRyfvE+eST/AGt9
+dFPDxb1BI0I9TjvrD7K8n+o/fx7/AOL/AGKx9lygPsNajS3kSC0+1X87/wCsfft/3Io6bo8wGfb3
+92l55Fr/AMsN8nlyf3qv2dlqBpz6v5FhBawSRvsjdPMeP5vn/v1nRheQENhq1/pzx3V1H58E/wAk
+kb/d/wB6qnSjzaAFxd2EFvcSSfPvjeD/AHt9TTpyctAM+3uIHt5IP9RG8cf2iT/cradwNCSfTZI7
+R/sn3P8Aj48uT/WfJ8lRCEgC7v7eOws0T5/Ik/1dHK2BSj164kkjRP3duknmeX/CtV7EDWu9Zkn/
+ANiR68+GHQFbV4797uR3/cb40/2P+BV3QgkBNplpbwSfap/Mnk8vZJHWdWugHz2lglxJPP8AwfvP
+LT5d26s4VGwGX9hpM9x88+yP+5UwrT7AQySWn2f7L5++PzE8yto1JgaGp+RBH5Fr/wAsI3ePy/7v
+9+sYR5ipFQvqVrY7P+Wk6fu5EpyoRvcwkiS6tL9LCOd50/6abP8Aa+7TWjCJesLTy7Tz3eOeST/V
+70/gSoddo3iUr+41N5II/MjT7jyfwVs4okuW+rRyW93J5aeZ5aJJHXPKkAsd/b2rz30cez5Nnmf9
+dap02yuYS01bz02InnQT/J89c7w7T8w5ib7BHY+Zvk3+fH+4/wBnzU+7Vzd2SYf2uw8v55P3nyfv
+K6nSdgOj/tKC1kge12PHPA7ySf3q4IYdy+IrmIf7TsHjk8+OOSN/9XJ/tVr9XcdguUpJ0tYI57X/
+AJb/AL+P/wCKqvZyvqSQW8kl1cSTvP5Ef+r8xK6NbAZep6tefaP3H+r8z93W8cOjPlK32uTy/Inj
+/wCWnmeXJW8adg5R8Gp36SeQjyJI+xPkrB0ElcXIaGrWd/aXEj3XmRwT/wCokjqaDimNRLeiyXd9
+/wAS549knkb/ADH/AOmH8NY1afU0L935cdxvsf8AWeX+8kk/vfxfNXNBgQ2kFpPaeQ8cj75/Pnk3
+/wB37la1JtAWb7TUvbuB/wB35iQfwf3VTdWMJvYRJBeSInnyJ+4T/VyP81TGhrY09qU7eV/PjvY5
+PIsZP+PuRPl3f7NdE4XXKHtSPXb/AMuT5JN8DyJ5Ef8As7KjC07ICtfySWNp5j3H+l/6uSP/AIBu
+SuqEdRmbbaxcyRyfvPv+XHJJ/wDY1r9XijljORbsNTln1aC7n8xN7onmSfc+T+Cs60U0bxmx+pi3
+njnnj/dyQT/vLf8A3v8A4iojGwhkmmfa/wDTrqf/AFnySfP83/TNqtTaASe3tJJ7eC6kjg+y/JJJ
+9/5VfdVQkZ8pZ8OjZcSPHH/okH+rkkrCtG4uUualfyaj+78z92/7vy//AImopaHQZMlpJJaR3SR7
+44I0g/4F/FXTKdxmrHo9v/ZF/YvHH+4kTy7uN/l3tUfWXczjTKOi6JJfeXP9r8iSCTy4/M/8dqsR
+inY3VMk0V/Lv40f55LWSRJP7rL/HWddvlMLD47C0TWo9+zyIJ/3n/Avu1l7WXJYVjR/4RKwgsPty
+eY/7zf8A8B30p41yNOU1rS30KDUn3x+f9tTfJG/8TvXHOpKWouQnsLSxg027he7eaN/9fB/y1+//
+AA1lVm73RooCvYQJJ/q9nybIEn+b71TGbZ0RhoY/iGOeCeSNI0neTYk86Pu/frXoYZpqxyI5q7u7
+d5P7n7v93J97bsr0Y00kMo/bLj7PvjuP3if6z/gdbOJAPcXmoyW8E/ybP3ccn/j1Z8thCSRSWN5P
+Y/6/95/rNn3q03M+Uhjt4/tn7uP93J/47RewcptfZJ760eSSSPzLH/V2n8Tbq5VUNEatpfzwfJ/Z
+nkeQjxyb0/vVx14XN0Qa1pmmJbxunz+faJPJ/wBdd+2taMmMybS3jjjnkj/5aJsnjf8A391dEpDN
+e0kgn03Y8myC1/0ryH+6sv8A9nXNKDUhBP8AZHju761u4443j8yONP4fn+5W1KNpAZdvaXf7v93I
+n7uSez/4BXROYXND7RceRA7/ALiN5P8AWf7FcU9RXMbUrK4+0SSTySfPJ5dv/wACrqp1bo4402iz
+9k+yx+RPcfcjSeO4/wBpqzi7yudMNDZ0meSGC7uvIef7n+kbP4VeuevK+giC+1q0+0SQJH5Hmf6u
+SP8Av0UKV9QIZruOf7J5Ee+SP/j4/wB7+9XTOiFUuxXyTxxzwSb7vzP9R/y1j/iauOpBoKRk3+rS
+Txxxp+7g+d/+utdlCPKhmzY6bdv4avkknjfz/I/cP/ywZvuN/wACrkr1eWqnYRYsYYL6RNL1iRHg
+T5IJ4/l8uX7ytSlJUm7G/Ob2m/2TpFpv1C0RJ03wvB/yy8qX+7XnV5SqvQdkxJJ9IstJke18x/uJ
+do//ANlXRVi5rQ0tExfFlpafZ4J9OjSSTYnl7E3+Z8/8FaYCo1KzBKJS0fTdT1Cee1uo/Iu32PJ8
+n3Vi+aujEVeXVHPVOre1/wBPjvbqNPss8DpPHH/FXmXvoKmULWOBBPdaW8kDu6Jd2m/91/31WlRu
+SszSRbv3vp7S0fyP+Jb8/l7P+ev+1WcIK2pjI5u8hktvElul1HGkE++OSOP5P++69OmuamrF1Klw
+08Xc/mfZf3j2UDyR/wASsu/51+ak4WnqFOncgi8O/wBo38ck8fkWnmbPuf3/AOGtqOO9mgxMbglh
+aaJHsupNk7yO6VzSqSry0FhoWC41K033Dp8kkEiJBHv+9u+9VU6LURs0r+zk1HRrtIP9KgtdiR3b
+/wAMsX8CVGGUoTuc7OctNaeCO3gnkkTyPMSP95/441dro8wyP/hLL6BPsqfck/jk/wBbt/uUv7PT
+Cx0Og+MY4YJIJ45549n/AB9/J+73fLvrCtgrMuNa5vaFb26X+zz47qN499vP/F/01/4HXJXVkbqN
+wv8ATdN1ie0gS+k8zzE8+N03RNB93zf+AVph6rYM5W4tLC1+32v2eO61Kxnfy50f70C/Mm2vT5mY
+yMdLe8vr/wA+eOR559n+kSfcatI/uznnG5q2vh3xDo/2i+/dwbP9ZG+yXd/sVjVrc5vRjYozX9/d
+z2kH+ogk/wBXUfVoQ1Io3lEm0PTr6x1yC6SSO1gtdjyTv9z5f7taKqTSppSJZ9TkvpLh3j3yfa98
+k8dc9SFjqH61aWc+p/ap5Nkb/PJHs/eq60U6lgJJJ7ueO0vv3bzwSJawR7E/1S/doUrIDcgggnuL
+u18zZpr/ADzyJ96Zm/5ZpXEpWd7iLtxqUeyPZAmlxp8kEiJ+/wDl/hWqnT5maOJx+r29w8f2q18x
+/Lk/eXb/AHvm+au6lojFxHTW8+l6Z9lSTzJ77e8n+0r/AOqqHU55CpLQwZXs38v/AFiXafu5PM+5
+Xda8Tmqxsy3pkklrf/6XH+7k3/8AAv7tZ1GajH8z/XwSeZJ8/wBoj/i+f/ZopsCe50y71Wfy/te+
+ON9lpG/y7f8Apm1Z4eoorYueps6JJPBIlr5HyXv7iR/412//AGdctWfM2FPQhu9SnnuPsMlxHaxo
+/wC88hP3VaeyigII5Luyt7iS6kkfyP8AVxyfxI/yfLTdKMgKFhrd3Y6ZHZT2/n2jyb/n+8v+41bT
+w8XO50NhceXPov25JJPtc87pHb/xbYvvVpTdp2MHIoWep3af6j9/JPHs+z0Too54i3et3c0ccF1J
+58H/AC0jqqVKKN4k2map9hkt/wDyH5n+3U1IcxHtQkl2WkjvPGk8f7uS3f7zebShSF7Q138JWcGm
+fak1K11FJtNkeP7Lv3Qyq/3Jav21nqM57SLfyL9ILuP/AEef/np/Dv8AuvV1ppoC9f6f+88/7R5c
+88nlyW/+1WNGtoW6ZFJ4fu0STz4/3kf/AACL5K0pYlXOd0iXUo9N07y3sbuPUfPRP3mzbtTZukT/
+AL7qYyexqZfmX8E/2qD9w8Em+PZ8nlVrHUCvHeXE9xJJPJ+/k/eeZJ/frT2ZmT293JJ/okcf+spe
+zA1PtdxP9kSf54LWf/V/wtXJCnyiEtLewnjkkuv+PR/+Wcf3t9Kc2mBJJdwSWEljBHHawR/8tP4p
+auVP3gsZdn5cl3HBHHv3yeX5nmV0SpaAW7ezsESSeeTen/PSuf2l9DUtR29pHHHPBH58Hmf8DWpc
+mA+41Owg+zxwQb5En8ySR/7lQqLAm1q/tL68k+yySSQfcjn/APHqXI0wCSwngjjneT93vSOf+98v
+8VRUt0A0J7/TZ7iTz/nj2bIP9quaNOXQCN7S0+/9zz4/3kj1Uar2Ait7C0nk3yeX+/8A3fl/xf8A
+XR62VVgGrQWFqPPS4jeSD5IIP7yrWdBNlSKNxrUEn79IJE8z93Hs+4tdTwzZjIhs7i4uo7i1k8yS
+T/lpJ/dpztFXCJr6ZY3bxz2SSb55JE8u7/h+SuSpXijaI+ewjT5J5JI54I/M/eUo1bkkP2DTJP3D
+/uI3/wCWif8AoddEZgVL+CCC38j7Rvjk2f8AfVKMrsz5hkd5cQaZcWsFv+7/AOen92to6hzDJNWv
+7qOOCeOR0gjfy5KiVGzNDPtLO3nk/fyfu/8AnpXRJ2QGtHBBp0lpvk3xwSP+72fL81YX59jPmMzU
+45fMuI7X/j0T/V1rC0dw5iTzLj7PJYp/zzTy/wDgVHtFa5oaepaNqdlB5aSR3saRo8kkH3GirBV4
+uVguU4NI+3W9xP5fkeX+8jt/9mtpV7F2NC08JRz6Zd6jdT7JINkccf8AvVg8UFiC00yzSeP93vkT
+f+73/eaonVbQcp1uuyQOkDp/y9JB5cH/ADxb+LbXn023IXKYUckllBJv/cT/AOsjk2fP8/367pVL
+kmTcXd/HBaXUbxzyT7/3cf3/APgddFOgmA+0u/P+0JJ+4k/1fl/3X2VVWiAQX+xI0gk/dpH+8/3K
+xVG7uBPaRR309pp3nyeZdSfvJP4KJ6LmL9kWf7Pkg8/S0ffG+949/wDeWsIVeZ3D2RJpum2l7pOx
+JPMnTYkH97d96pr1eSQBf6FJdR/6v9w+x49/3vlpqu4q4BYaNp8F/Gmo+X5F1H+78v8A5Z7aqdZt
+FRnE157+e6tILWO0gee1d5II0+98qfdrnp80nY3jNGVaXEEF/PY3WzyHkd5Pk+bzWrsSfU4zn/sl
+39r2eXsg+dI/9rbW6aS8wL2pvBNpPnpb/vN+yeT+LdWNK6ZVgtI7hLiCxnk8uODfHcSfeTdLWs1c
+fKTWklokm+6k+yyJH/31/drGon0AteRaJBIkkf8Ax9QO8fz7v3v96sIz1AbfLImjWnl+Yk83+sjj
+/wBmnCS9oyI1SxBa26eJUhT57fy/4/uK2z/4uirNezbN41TZng01LW/ukt0S6T54P++9n3a5fbyl
+KwrGbfPAkfkeRs2R75/L/iT+9WtCEpSHY5+fxhfvJHawR+RaSf8ALP8AvV3/AFVWOL24y41We0u/
+38eyT/ln5n31oVFB7csT+J40jt3Tfv8AnS4k3/6z+422plgk0bRrDbvxP9qtJJHkk/uR76mlgbM3
+jWHvr0d1ot3JN8926JBH/dj2/wDLSqhg+SRnYpQSaZaR+XPb75Ej/d/8DrWrCVxkcEHzyQTx7PMj
+8yCT+9VSqaGZPYaZO9xJH5ezZ/y0/u7KylVA1o9FDzxzpPGkiRp5En/TesPrFirFYaLPBHO8Ee90
+dEkj/wBiX+Gmq/MFiOwjkvb+RJ49m/Yn2h6daPKiEdLbyPdTvA/mPs2fZJN/3ovufPXJ7Q3Rz+r6
+ZqfkST+X5EE//LNP4W/iWu2EkijX/d3SXcGlwf6WkCJBJ/HPKv8ArWrCbV1fYTMK0jv0tJIJ5JNk
+8iP5ez7yrXRWn7wzTv7SP7B/xK7SD7DBPskkT96+3/frJVfe1AryWMklpPqLyeR9l/4940+8y/7V
+Wp3OfmHyXaX1haPPH5EEexJJP738L02gubGp2dhdXX2VPLeO1geeCf8AjkauKhUdjrlA56802+jg
+sH1GD76bI/8ArlF81dlOV5abHM9C1pt3d2vn7P3cHz3U9o77m/4BUV4DGX3lvd2++BLXZP8AvPv/
+ALzzf4KMPOwDJbS/0ue48u0/1nz/ADp/D/sVUcRzBVY9rS4gv/tUk8abHSeST7j7fu07XCkRyab+
+/wBnmSfZPv2m/wC7JE397bUOtaIGz4Jv0nnv9O1eOSZAnmSf3l8r+5WGOj7qkgYzxBqcCW6f2db+
+fsf/AF+z723dWeGoOW4+dMxo9SjvruBLqOR7Dy3f9x96Pb/vV6PsIwQrMqz3d5Hd7/M3wSfu/wD9
+qilQXKZ2kadhrS3txHCnmJHa7Hj2f8s2/irmlR9m7itIvXF9Ppcn9o6c6PBqKeZJ/Ev3/nVaI0va
+e6zpqDLPUo547uTy98fmfu4/7q/36yqUOV3CmVrSd01a4tftH7if5H/uts+5W8rNGkjp9Lu0srFN
+Lmk85ILqf7/ysv8Adry8XFt6HPIoa9oN3e6r9qsrTzE1B38ySf5trbN1dOX13CmuboXUp2MzTF/s
+7w9q0d1HsnmRPLk/vJv+Va68RU9pUVh06lipYTazfSTzpI/2R5ET5Pl/e/8A2FKtGKXmc3t+Ym8Z
+2U/2uC6vfLkutiefB95VSqwE+V2H7axnyaDPPPGkEEjyeR9qkkg/9Brqp4hM6GxdN1PV0uI0e332
+HmJ5lp92ibitTBmhq2hWl9pkn2XY93BPPO+z5m8qX+/XNDFNCML/AIRq+jt/LfYl3JJ+7j/vV2Rx
+qQ7lzS9EktLC48+TfJs8ySD+H5P4XrlqYrmkZxhYcNcj+2T2MdhH5n+ojj/jVv79aTw/Mrm8a1jR
+1OS7060gguvM8x9klp/Du/vNWNKKWp0MjtLCwjvP9O/eRz/vPM+7t/2flrWWISMJM1tH8zS545r2
+ON7F/wDWfP8A6yL7336irW5hUY3NTxFqv22/uLW1k8+Dy0eO0+Tc25P71YxVjeUbHOWGp6St1Gl1
+/q4E3xx/d+aoq05onBNSiVPEwkF4/wBquE8j7n7j/nl/wGujCxuZ1Kb5humWcFppkDz/ALyCed/+
++ov4qKk7mhDrUm+7kn/5Z/P5clFKFwNzQrS0guJN8m+08tEjkg/2q5q0rOwG54ftJINWknn+SxtY
+HeON/wC69c9V2QiklhYXXiH7Kl3I9o/ySXb/APoe2t5TsdckVLvTY7WP55N8f+rjj+9K3937tRRr
+8zMGirfT/ari0/54Wv7u4j/4B/7JXTRjZXJSsylqNvafYLex8v8A0vz/ADI7j+PytldFCrd2MsRH
+QqR6TfxwQT/aESe1f95v+6rL81VOSuZkk8dxHqcmvp+/j375JIP9VupQk9gJ7PV7e7u444I/IkST
+z/3lKrT5Yl09S/qc+rQaLBawPvu0neeSRP7v+9WGGgpSCpoYek2F+93JBJ/rEjeeOR/u7vvV015R
+Qxmr2mp3c8bx/JHPGkcn+0yfM9OhOLAmv/sl1HHAkbzxpGnlyb/mVKzfMmKTM3W9QL3lp5Ef2WSC
+NEjroo02tTCTJ9AjuPtfmPH9/wAzy5P9v+KprthE2LC/jsYL61fSYLq+tf3EE7/7X92OuV3013No
+mdqej79JTWPL2Rzb/wDV/L5XlVvSqO9iFTML7NHHH+//AH/mR/u66+Yfsza0yR/9RB5iSJG/l/7z
+1yV0kwGW+p2EEj2t1H8jwPBJJ9/bv+6y1ag2rgZkkupp+/8AM/eQf8tP4/nrrjGFjR1CWS5uPsEl
+19o8yTzES4k/9Brnio81jmdUvaJJpnlyXd9BvRP3f2f+FpW/i/2KMRBx2NWP1awgSPz/ADP43+yS
+J8yybf8Alm9YUKoHNXFncR+X5/8Aq3/1f+5Xoe0Mwkt5I5P3H/PT/gdHtANSCOT7H5c/yeRHv+z/
+APLWsKjETT6vGlh9htf3Hn+X9ok/3f7tFOnzAZ8dhcf89I32f89H+9VSmrgQeXHBcfP/AKv/AJ6R
+10SloM0pLC/8v/p3/wCXj+5XK6iZoacb29rJJB9yOeB5PM/ut/DWEqdwM+3gt4Lfe/7/AP5Zxxx/
+3/vfNXTKYwg8RT2N3vgt4/L/ANZ5f8LVi8PzCI/tdxqtxJH5kiRv8/7ytoxsZ8o+wEEEe+6kk+SR
+PLj/ANv+Ksqkb7Byjb/zIL+PyH8+OT/VyVdJ2gaF3y7tJLCd/wB5HOjvHs/2PvVzy1TAjku447SO
+Oe33yeZ+8kk+/TcdQNBJNNSwu43k/eeYkkf+1vrGUbsB8c/2V/P8yDy5/wDvqodHQAt76OSSR0k2
+R7ETy6XsQGTvJfSefJ5nyRvH+7/i2VujPlM/H+keZJ/q/kkk8v8Ahif5a2QcpYsVs5nu473/AFiS
+J5caVhXk1sdWGpLlNm/ttPgtbTZ/q3T95HJ827/arCE2yPZrmMG61aOSSO0+5Gkfkf8AAa7FBrU5
+6sblWUY8yOP/AFcH+r/vb61UbhSjYZeT3F1JHBJJ5kieZJHWjppD5Sb+z7yCSO0f95HPsk/3kesX
+NIOU3rfS4kt5Lr5HkSP93Xnus2rGsacS9JdT4gfy9kb73/usy7NtYyTaN400Zet7LK7je1/35P8A
+vj+H/crpw8+dWMqpai1KSfTI4Ek3z3Um/wCzp/y0qXR5HcKRkXEV3Bf7/LkeDzH+5/tVvKKsZ8oz
+Vo9TguLdPM326f8ALTf8nzferWi4jsWn/tO102Oef54NR3omxP8A0KuZ2ctOhYSW8f2i3kS3kS08
+j/x9f4q1m7RGUv7Pe0uPMT9/cSSeZ5lbSqxkHs7D5NQ8ieSa1j2RwbErGVFSF7SxNHqn+nW91HH+
+/wD9Z5n/AKDUPD+5Yz9oTa1qkF15F1HJIl/B/rP956WHoWVg9oSR3NvDd+em+Cd/9Z8+35tlKMXM
+capo6Rq93rEkkE+z9xA/lyf/AGVZ1MOom8ahkSXc6aZJP5cnmJsjkk/uxPXVThoZj7iSR7C01SCT
+yJEk/g+T5/8AKVEI2YFP7Xb3U8l8nmJdvJ+7j/1v3vlrWcJAbkF3psGzy7R55Ef/AFn91m/56VxS
+pyANFgtNRn/se6t/ISOR545P/Za1rScQLM+m+Rab4I/Og2Ik8/8Ae+euSNW7A5zVrfU3ngeOPejx
+v5En/PTa9d9CUUiDWu4J0jk07y9m/Y8cn8P3N/yVnzJsCzYxyeZaPfR+Zvgd/I3/AHfkbbUfaFVM
+/QLuC1u/tV9/qJ438v8A+Jqq9NtBTJJ9QtHT7d5knkPI/l7/AO8v/LKqhB8we1M/Sdcjtb+T7V+/
+875JPL/iWVNtXisM5K6B1ClbxW888aRySeX9/wAv+7W2In7o1V5jV1qKC+1KR4I/9fs/d/3v7tY0
+qlom8adzOkto7rWp7tI40ggkT7R/B975a2jOSiZ+yLs+gaTBHPBPfxpJBvkj/utt/wDi6cK00x+z
+MuCzSO4j2eZBHJB/H8/3quoZ2C40+4urzzEt5PL/AHf/AMTSp1uULHW6Lo876F9hnkjjnjkfyN/3
+423/AOz/AA159eonO5apkthb6ta3d3BdSffjeO/8vZ8y/eWor1UdCpkGq6ZffYZL1I/Ij8zyJ7T7
+zL8n36UaqbM/Z2CDW7TSo7edNj/at6Sb/wDpl9xqXsXIPaWIDefbf3byJP8Av08j/wBn3VcaXIFW
+qVr25ntZPMgn8jZJ5cmz/f8AvVtGlzDpVC1BrcclvdzXUfnyJIj2k/8AFHu/1ny1lOj2F7S5A91B
+9v8APT9xA++eOP8A4H8tELoPZ3NbSf3nnv5n+lok/lp/yykXZ975qymrsLlbSrvRbK8u7VP+PV49
+kex/71aVaTlqxXNZ7TSdRsbuDT/v3UGyNP8AaX71ctJzVTU05jk9Pk1b7J9l8vfYpv8A+A+V9+vV
+n7NvXf5j5jp0Tw8/2T7+x9/mSP8A8s2f+GvJcpFyqFe/e/S+u9IupP8AUI89hI6fNui++v8AwKuu
+jFNHPLVmY9vfQRpqkHlyT+Z5cdp/wCqXLU0IjEsW93Je38drqMHl2k+x/L/uy0lQUNjpjI6DStSk
+urF4fv8A2V3geOf721nrzK1O0kZGU8mmvPOZvnkj/wCWD/d+WuqSfLoMSK7sPsk8lrPvggj/AHkb
+/wAMVOWHnzHRQsYl9eWUs/2qykkSOP8A4+JETY3zpXd7JpHPjMLGZpaFe297sSd54JE+SORE/heu
+erQ9mzL2QX1nHBPdz2P8cezy9ny+Ur/Ov/A6uFTmVg9kZYsI76w3pHskTfdRyf3f9l639o4HPFGj
+/ollaTo/l/v/APWeYn71dyf8s5FrndaVQ6IxMaS0jR5LGPzJ4H3yW8n97+Cut1Lq4ylLHdzxzonz
+2ll/rJPu1VNL7xIjtJNTk/fxySP5cn7z+4tbThdEG7f39vdQW+yfY91Pvkk/gXd8rrXI6WoM0dE8
+Rx213BB5jp9l/wBXJG/3m+7XHisI+W51Ua9y9cXd3JqTwXsezSvP+1XcH91d/wB6s6ULRN5K5Un1
+KOe/nSyP2VPL8zTdnyq3m/fatYYW25yXIY/Er3Uk73UEc8nmfvJP4vKT5fLrSeHQ7lq11b+y598M
+n+nfI8kD/e/3P+BVzzw7ui5Mzr/93qXnzxvBvTfHJ/ts9b01ZGDkJPPJY6td2PmbPM2efs/iVv4q
+cU+QzLNr58Gs+Qnzwf8ALCd/u7axrW5AJrC+8meSNP30EE6Jd/J/D/t0q1P3QWpbfRtNvtZ1bUUk
+/eQQfbY5N+1W/wCmeynQqtQsbxw1zAjuL/VNajn1j/UJ/q4/4dv+xXbOdopDuTWkkmnWEc88fnyX
+U7yf8BWs5T5pXC5QuLy4n+0R+Zvj3ukcf8S1tTiaORRg1u3+zxo9vs/5+JI/vVrPDXMJMbr+pyX0
+kHkR+RaQfu44/wDgFaUIaHPMdbeXdaZJPJ5k/wBl/dyeX/ClLl5Wb0TejntP7Mt0fzE/5b2/9zdX
+nuErnSaHh7xTpr2N3pGrwef58iTxz/wrL9yliISsJlu3sLv7f9igg33cE7vJIn/PKuPn0M4xsb2q
+3cd75GnefvkTZazybP8AllE/mbFapoT1OiMrGL4guNNSb/iXyPa2ifJB/wA9ZPn/AIq0wt3GzMzN
+0rSZ31bf+78h/wDXyJ935f4d396tcROMYWALGOweeR724tPIn3ySfO+75auaYpFHSY0dJNR3/JZf
+u43+f/Wv/FWk6soxsYyY/U9SjfTLvz53eR9n3E+8/wDF81KEdRGNImp6dbxva3H3I0u444/+WcW/
++Ku6MrjEuLO7nnjvvtEb3CR+ZcbPl8paqSXLYzLt++rJb+fBf7/I/wBZH/8AE1z0aSQE+m6j4du9
+Mjj8ue11JI/3kifdkl3/ACtWlSLZbqHOf8JBfwSSRz/883gk/wCBVpDDI53VJNPk+3eZH5kiSQQe
+Z+7/ANmnycqHE0pPL1XTI4E8/wA+CPzI/Pfzaw5+R3N4mrpf9p6d4aeeRI3ndNlpv+9Ajf3FrnxM
+1OaT2MqZW1OeOa3jge72b/3kkaf3l/h/77opUrK6HVQniG7kuvDVonl7Pnd4I0/i+epw0OWrcDnb
+fy54/wDnnJHHJ5kclerWnZ3KLkepxwSSQPHHvk2eXJH/AHKwcbmXKZep2dv9vk8i48+P/np/v110
+VYOUlkt/Mjt4P+Xh4/M8z7tc5vItmOOeOS08zyIJ/Ikk/i/1Xyu9CZhIp/a/L8uCC43wRyf6z+8t
+aygam7pH2+fSJLXzI0jnn/dySf3/APZrknARn3f2xPLsY/8Alhv/AI9/m760jPQzib19YfYtM+1Q
+SefPPBB5/kJv+Za54yvKxtE4X959o8z/AJaf6yvQT0MSST5Ps88cnlySfvP+BpWyegBHcfvPn/ef
+89I6hgPj+xvZ3H+s8zzI/LjrJiN+41P/AEe4/d+fH/q45P8Ank9ccabRqUpI7iT7PPB+8jgj8y4/
+30/vV0xmkBp2lvHHJ5Dx+f5kG+TZ/C8tclafKBT1a0j8ySRLfZAnyeZJ/eirfD1gILDTPPs43k/d
+yPJsg/743UqtWxdjU/sWKCSCfUZI3d4/MkgT++v8L1kqt2HKVfLtI9Tjk8vzIJP9Xbx/cWrcrQIJ
+r+0+y+RdfP8AOiJ/10asKUmwM/7R9kuJHkk3+Z+7krscdAH2Fv59xJBP5nyR+ZJHWLWlwH2dhJfe
+X5H7v78cf+1VXAZb3EnmR2vmeXBH8n+3/tU2wNS7v54I44H8zz3kf7Rs+R2WsUXymZeWdvaySf8A
+PN/9XHHWyDlE0XS5b1vk/wCPt/8Aj3j/AL2ynVmkGFpvlLUg1COC0nuvkg+dP9pfnrJSi9iPZy5i
+1oGkQT3f+s/cSSeZJHJ97bWVerYumrkOoaLHBf8A2HzN8HmP5ciVthq1wqKxHaW9vHJ+8j2R/P5n
+9+spTbDlNeS+sI5Njyb5E/1n+9WEqUmLlMudbjyJJ4/njf8A49/++66WopmcacjRGlm60n7V9vRJ
+I49/lv8A+PfNWLqpSsbxpsh0NJNR8yyk+eR/n8z+FV2fN81auHJImqVdOtLhPs8klxH8/wDq/L++
+tPESuh0jasR5Ece+R3k8x/3cifxVx14suxNPFB/okHl/Je/3/wDlmzf3qxipdxWHXf2BLTYn7+R3
+fzI/+eflJV0tWQY2kyJ5aTv5jyeZJB9o3/KyN/s11YnbQDZjMckcc7/6zz0/9ArkjCSD2lzNktoJ
+LD59nnvJP5myui7QezuOuPDlnfWkc1j8nl/u45Hfbu+StvrGtjP2ZV17T0+wSTyfPOmyOSNKzw9f
+95YPZmfPp9xfSfap7jZ/yzuJPv7a6Y1lEcaZf0y9gtY/skH33+eOT+82z7r1z1ouZvGmJf6bO+pQ
+T2sm+xnj/fx/f8v+GSOqp1Uo+ZmTT6Z+7SxSDfHepvtP9n59q1nTqa3AbYQWkEdvPP8AuPIfy7iP
++L5X3V0zqSGXE2Ws+rQJ+/tJNiSR/wC1v3RN/wAArlnOQirovnwanHdeZ5k6Sfu/L/hWrrSQGnaa
+lPpd3PBdfPBN88kdcksPz7BYl/tKR/8AiXJAnkeZ+7k/3v4UpezkomYardp9kkd7R/M+TyP4fL8r
++9U4elJsChrdpH5873d3sfyE8uNP9r5q64PUVU5zTp9n7i7/ANQn7y38z+9XfUjoOkWpJp7rRI4J
+I496Sf8AHxH/ALX96sppRkHsi1YWdvA9vJP5b/vPLkkjqqlbQPZlywi0y31qTz/nggk2R/8A7Fck
+p3iEaVjYt5bATxwQR/u54/3m/wC9H/H96sHO0ToVSxz0kNhJ58H+oj8zzI5/7y//ABVdfO0zP2pn
+29tZz3caJcb/AD/9ZJJ93+7XQ6tkP2po+IdJt4Y4/wB3s8tP9XA+6uenX5i7Fb7XfX0cEnmbI4I9
+kkafLTqaBylu08R28Mm97iTfs8iOR0rCphG0ZqoXP7Qt31afzHe187ZJI6fP/wB+/wDYrOeHfKvI
+6FULz6naJAiPfOkc8kFr8/8A6HWNOm29DL2tzM1bT7dLu7geD/j1j/v7q64SsP2dyta2U9qkF1Ha
+R3UE0H+8qu1a83Mwq0yGK2jn+z3U/wC/jkj/ANIt/wDbrRT5B0qRBG93B5b+Zsn/AOWf+1/t0VHc
+PZ2DVtUuBJbzwW8cE8H+rk/hbZTpUrh7SxXt9fSfy5J/3ciSfvP+BU6mHsznuLZp+7kn/d3Ub/6z
+f/v1dTRBc6qC003TrT+1IP3c/wDzzg+byFl+9/v15+I5nOxpzFWfWrD/AE77F+5EybPP/vUlhHJq
++yC5mW9rcSQee/8AB+7j2fL839+uyrTXQzjO5tT6tBP5cE//AB/Wsn7id/mbbs21yRoPodEVcike
+O9n/ALOg+SC6+fzNn8Sp96p9i4FyjYbDJJpyWjz2iPdz/O8k/wD8R/tU371zmlItaNdz/a9Se1+T
+7VH58bon8VRiI7Gpn61cR/vI4I98/wBzz/8AZ/v1rh43Qy3/AMIjpNzYyPGPInm/48dj/vZJVT54
+2/2Kn6+3LY0lh3EzrePTbHRtWgf9+7pBs8j/AJZtvre8pWZhK5zf9oz2t4jpcf8ALTzP3dd1SPtE
+L2puyajYefB5nmfZHg3yQQPt+Z64oU+UXtSraavP9vjjk/5b/u4/7la1YJwbGonXeIdI/tiCxjgf
+E9rA8E86bNsksX8P/jteZhsWoSaaNoowbi3gsZLSexfzvI2QXf8Ad81vvV2Kd0YF3xDB/ZFhqVrZ
+R77Gd4Hu5PvbZZU+7WeHlKUlfoJHMeXJBZ+R+8gkn2PHv/ubK9L2hIyO3ksZLN/MjnjeTy5Lf71U
+ncCXQo7i9v5JLXzEjtUeeDYm5Y9vzVniZe6Z0FYt6xqsdzPJfeZIn2qPy54/+mv8dY0qWhvPEWC0
+kkvvMS1+S0sYN8cn95t+7Y3+/VVKdtyLl241ODUfISO0jg2Pvkjg37l/3qwUWhXMnxMb95/Pnj/f
+vJ/rE/6ZfLXRh/eNGyX+07x440nk8/zI4445P70X92rdDUwkxl/YX/2D7d5n795PL+z/APoFKLhz
+WNCeOfU7F4Pt37x/I32kf93+7UVFFsAGp3E/lvB5jz30/wC8jSl7LmlYI6FjU/ED2lpaWMEf/HrA
+/meYn/LeX770fVbyN44ixm295cX1hHA8n/Hr/wCgVrWp2kYNmhrWp3E/2eCxuPM8j/V26Js8r+Gs
+KFK6uwuVrjTLi6u440/0Wef/AFcc/wAv+t/2q2pKxo2UYLT7XZ+R/qJ/M/d+Z/F/s7q2lVsc8pD7
+y4uNOsLjR/3f7yRHuLj+P/cpU56ima/gKxkmj1KyeP8AcajBs8z/AGvvRf8AkSuPMK/JZnRSLlgl
+p9kjjuo5J/L/ANZ8+zav3axlUdzpLthpuk3VhaQWPnyXU7+Z5exP3e3/AJ6PSxE5WEXLieeDUpIL
+WT/S5pHSe7R/vbq4+TQ0lGxZuNWSxuEhh8x7GFNkmz5W3Sp/FU0KetzncrD5L+Oy0mBNkc0k/wDx
+9yb0dv8AZSpSk5NGhWn0m7vT5cN2/mP88e/5dq/8863hOEZWkBW1bQtJ06ONEeCe7jg2PH/01b7+
+6uqnXTlYTKtjeSX0EcF15b/2c/7yPftg2q/+xV4poxkYt+lwl/Pp08cflo7zx/7sr1ty6XETXb6Z
+ax3bx+e8d1Gkcf8A1yb/APYqIt3sAlp9nfSXdJP3774Lj/pn/wA891TVTU0iDJ+1yPYf8tEn8z95
+JJXUqNgG3lleQXFv5HmeZJ/z0TbW8KykaOmU0aORJ0n8vzPL/dyVM7nNKkPt7e/SPzLXzE3weXJ/
+tL/FUyqJscTS0i7ktbeT93J5iR/6z/a/hrGpDmN4m5Z61dyQQTpJG8iffj/5atF/9jXJXp8sjOmc
+/rlxH9re0SOOOSCR/wDSK7qHwhULV5qclpcW6SSR3VokH+gSbPu70ojCyuMm8NQW+qXeX/1HzpJH
+/d82scbNxhcGal9pFpfanHBJHGn2KDyJJE+7/s7qyoV2yuU5+00Gee7jT7kd9+7t97pF/wCh11ut
+Ydilqdhd2I+w3Uf7+1kf7/8Acq76hIaZLeC0k8uTfHP/AMs/+eT/AMdMwkNjjnRP7StI/Ljg8vzK
+1lM1NGSwv/8ARIE/186favk/h82uSUxGbbveQahG8cnlz/8ATT+GumNPQziaVvJJBaeR9okg3yfv
+LiP/AJ5f7tc6p+8bxRX1D+zP7M8/95Pd+X5fmSfdb5/vpW0Ze9Y5ylHp9xHZyTyfu/L/AOWf8eyt
+U9QKtvYXk8ck8Fvvt4P3kn+zVsZakt7fy43j8yPzP9X5n3KxYjrP7MTyP9Z+4TY8afd/g315aT3N
+5Gb9r/1iP+78yT95/drVIxkT2mrRvf77q3k8yP8A5ZwfelrSVA0Czu47q4n+49i8m+T/AHqzlSYE
+kf2ue08+12eeknmSR/w+Un92pcFfUsZJ5kFnqd1J5bweYnl/73+xWtKOgFUabdeX9u8uT/VpJH/w
+N60k49CY0IosPd291PHBdXH+o/1n+y9YPn6HTGEUU7+OOe4knT544/8Aj4k+5uram7HKQwXl3BeS
+SJ5iSTx+R/wCnN3A09MgkjtLeeeSODyN/lp/FWTqpsCT7JYWNpHdR3HmX/mIkckf+1S5mBOkEbvH
+9qt/38n7yP8A2tvy7qycnylkFvBA+p+fP/y3jdLf7lHPLlA0NN0+ON4J/Mj8xN/+rf5vmf79ZVJN
+h7OxV1K4QXcFrPsfZ/rP7tOlRfQPaWFnCPdSTJP8nlp5caf+P06V1C3UHEoS6l+/t3T+D/2f7tbu
+m5RsYSiSyXdnJ5bpHGjv/rPM+9TVFI3MX7PdvPv+zySSeZ5dbxkkM6PTtN8yw3zyRpGkiJJ/11au
+OpVbncVIhlgn+wSIkck+/wD2Pur/ABU6Uk5XCqRrdx6X5jx/fnj8v7PH8zLFKm2t377uRVjzE3hz
+T8R3d1JJvntdn7uufFS0sKlHlNGe+t54/wBx887v5f8Ae/e1l9XRoZkerX73ccE8cnlwyb5P+utV
+7BJAPvtWke7jj8xHed/9Ij/9lajD0bAGmzx2t3JB+7SNPn8v+9TxELgVL67gn/cWMfkeRv8AL3vu
+relF9TCMSK3nv4I7iP7PG8l1+88uf/b/AIq2lJLc6FEuyT38Np9itfMSCHZPHJ/Hub5a5VGDlcy5
+S/pt3axwSWuqfPvTZOn8X3927/gFc9SDUroOUnvYEkjkjg2bLqON49n91fkVqIOxpVM/S9FtJ9et
+JEk+/se4/wDZq6KmI92wUmafmabpepzwz7J4JpH3yR/3f7y1wzUqmvYC1dbNUgg/suT/AEuy2eRJ
+92KNd+z56dJOD1Aszi62SPqkaO7yOk+z5ot0XyvsrOEIxdl0Aq/2bYpPP9lj/cTOj/7393ZVVK0n
+r2AozvaT6lHDB/r4LT53T5YvNreC925qFxJHewPPJB5k6T/uJP4W/h21MJ2YEtunnpd+f/ywR3tI
+0/56r81Ko9TIL+7nurS0fyJPtU/+v3v96qSUQMPV55J57Sd/4/k+T+9FXTQ2HJ3MqCyjvryTZ/qE
+j8ySST/vmu11LI5pU7iwWl3HJ9lj/eT+Z+8jj+7sSifwmpoWFpJ9vtIIP9XP/rI/9pfm3Vxzn7oF
+3ULJ7WD+0bX/AF8k/wC8k+8y7f8A9qj2l9yZ0fesaJ1DfFJfPaf6Wkf7z+Hcn+zWDhc650OWNxv9
+kxzz74J4/L3/AOodNrbmT56zdXQ5bGNd6TdwanJaz/PPJ+8nt4H+7/FXc6toDsF35CSRz2LyT37/
+APH3/wA8l/3amlzPcOUrWkdxH9rgtZI3+1R+R5f/AI9W0uXqHKVZLDZb+fP/AKuPy/3f+x92tYzA
+fYTyT2l3aJJvjg2eXJ/sb6itK24EK3c8d5Bd3f7z/npHQoJxdiqCXMdS+o20MVvGnlpb6j5fn+Z8
++3bXHCm0zsxdKMokMV3Y3d1JY6ddyJH/AMsP4flqqi9mrnn04SdXlI7v7RpSxwXX+vj/AHccf95P
+4qiFqh3whJVOUzsJBd/boPMkkj3+ZI/3F3/LXXB2jY5+U3JLSCewjjnt9/7tP3n+8ledGvyyFynM
+3ehR28/lweY8jyfu/wCKvXjVuioUOVGvbyQWmmx2L2/kR3UfmSef/wC0q50ryJj7rHWF5H5ckEFv
+I8c+xJPn8paznoZjHtILW4jg+yf7dx8/8VKCcgsWr+//ALKk8+CPfB/ywgkTcu3/AIFWdKF2bxhH
+mIIb7RIIo7qS4+5J/rET/Yrd0GzrrwXKbXn6Zp9hJBqLul38k8GzZtWJk+7/AH65IxU4nDLUzdW1
+Gwn+S6kkneSBP3n+1V4aLhqjmlTYtnqc91aQadZSf6W77JJP4NrfNt/8dqp0lBlxnYqRWskFxvn/
+AH9p5/kPOj7fLq5tSR0xr2KVxr7x3e/948ifu462hhU1c0kjcu7FINCke1jSeN403zp8rSLL8yf9
+8VzYedquvQwZxUunyQy4kjkR5P8AVx16br8yMprmlY3Nb8GXem6faX0/+rvY/Mgjj+//ALW6uejj
+NbHVLC8sbjo5J7GTSd8aO+zZA6f63bvrFe9dnLE0re//ALPnjgut+9PP8v8Ah+8myuepF1DoResb
+7SfL/sGBPtr/ADv/ANtdnybGrKtTlfmMyGO/n/tK7/ju3k2SQbN25f8AdrRR93mYEd9dpdfaP3G/
+yYHtU/h3fPt20sMpQMyhdxpPYbEk/wBL07/lp/DIn3f/AB2umnJt6jEj1KTS7DZaybI55E+5/eWs
+vZOpK7EZn9px2NxJ9ljSeef/AFlxOnm7f9yvQ9jzRsxkJGoWOkeZ9o8iC+/5d/450X+Oq5+Zl1EW
+tHuLdHnnnkdI72DZ+7/v/wC3WNeDa9B0pE9/eR/a7i1gk8+0kj2R79jM22ilGyCUjGQbPL/d+Zsk
+/wBXJ99a6JO8TmnG5s26Xd9ot/PB/wAuOx4/++/mrndOMWdHMP8AE3yXFulr5/7+0g+/825v9min
+BSC5g6dHfx38caSeRJHJ+88z+GuirZxIpaGn4jvLfUr+4k8x/wB3sgs9n8W2sqcLIVVXI9HeRJJL
+X7kn+rj/AIE3/eonC+pEYm5pl3eac7vBH/p+qbP3n+x/frkmnLQ3jEp6vPPd6vvn/cRwf6vyP/iq
+1pS93Q6XFGltsktLSC6u47WCf5/MRHZv9jdXG1Pm2MZUIsifQbFIPP8Atcl1PJJ5nl7P3TVt9Ycz
+kjEr299Il3Ha6JJ/oiT+ZHHJ95tlX7FPVnRGJv6sESSOCSPZHPP5/l/3kl+avPppnZ7MpWl99i8y
+C1SRIHk/ef8AAf4WrWabD2ZMkdxPdwfu/wB47/uNny/eqKrMzc1a3gstSktb3zHvkRPMjT5l37Kw
+jADMnuoNK0WOe62XWpTp/o8afdj/APsq6fYagQx6zPPB5/mf6d5iR+Z/qlpewAybyOP948ckjyeW
+/mR10xqXNGUvMjsYPIg/1c//AC0j+St1C5gzatI7XUdJtNk//E5tZHT9592SJv8AllWXtLM4nGzK
+TJHHplpdP8/kTvB5H8S/xJRz3kehh5EcdpafY7tIP3dh/r5/M/1q/J8q7v8Afq222Zylcx5Jri6k
+8+f/AJ5pP5D/AOxXRTgkYSjcz7i5vP3f7z93/wAs4/7tbxNPalWRf3m+Ot4yD2pr2H+g3FvHqUck
+cH+s8yP/AG/utXNJED7O3u/tklo/+sg/eeX/AHkrKURFeSS702S3/wBX5nl+ZHWllJGRr3Fhpmo2
+8l9BJ5H3H+yTv8zeb8m2OuezgxC/2RpMlj9tf/UQfPPG7/P5Tfw1EZyUrGxWsPtcF3JaadJ/ok/7
++38z7/yp/FW9aSaApR+I9Tj8xPM8yN/9ZWk6Vy7mhb6vf+Xafbo4/LTZPHcbE3f7Pz1nOmHMQauN
+IkuLeS1uI3/efvI5N706baM/ZjILa3jt/wB/Jvjnk/eeX9zbRObY/ZmhpN39hgv9HmjR0nkT7P8A
+3fv/AN7/AHK568eZpoB93GLW/jntZE+1p8/+lP8Auv8AZpxs1ZgVdX0HUkuPtUe+6juv9ZJ97a33
+qdLFQasguaOtR2k+i2nn3H2X+zo5IILT73l/3v8AvuqpOUnoByLSRmOPy67qgVdTqtPv7B/tFrP/
+AMt/+XiT729P4d1ebUhqKloUvDslulvdp5/2Wf5IJP40lVnrXEq42N+x3+pXH2G6uI7WC13p8/8A
+D/s1VLRAXb+OOOwuJLqT94/zx+XXPCOpcjKuLu3urSPy/wDj7/1cn9ytlGxhIrR/aLT9+kkn+r/1
+kddLZqTx6ZcP9ntU/dyP+8rFsR0Fhpt3Yyb0/jj2JG/+z9+vMnWLIdStPMt/Itf3H8fz/c+etqNX
+uBnyLrcFvHBdfu40k/j/ANiul8vQuVFlwxWMdxH/AKyPy5PLk/2qxfN0OaUJDIJPInktZ498HmP/
+AN9NTqOxYfZJIJPtb/u4/wDWR7Pm+5RTdwNDUpP9L330nl/akTyJNn8VY4WNwMXTLuSSe4gT55Hj
+T/x2uyrS0AsXcckF/wD6V5n8Cf7apU8y5TQZH9oS48yP540/dyf36XMuUCC01SQ+Y8f+rj+TzP8A
+fqalCwe0uWvKtDb3E893+/njfy440/5a76cHYXs7mpYx6TPpkkD+Yk8H/HvIn8NctVyjM3lEluNC
+sHtY71H374992kH8NZLFSU7GDRQgtI/3E9rBJJ+/R4/70f8As12O4GlcXcHlz33lyPHdSeRPJ/FX
+O4SYGHFHcWupQRySbN/yf3lrapFOAUi5qOpv5f2GaSN9/wDy0jTbSp0vdugqlCzs/Mu5N/zon7yP
+/gf96tKj5ImlONzZubdNOt5/+W/nIjyQJ/qtqfLXFTm6r9BVI2GJaQadJstU3zuiPb1TlJ7kFye4
+kurCdHj/AHcEjvBs/hbZSVwMO0tLh4/Pgj/ebNn2j+833q65TsBrf2N+73+XAk8GyCT5/wCL+7XH
+Os/kBzl/b2n2iOeCT95JJ+8t3/hdK9SKaQ4xL1hJf30nn+XH57weX5j1z1pJaM3US/bz3f2GSF/L
++SRP9779c0YLm0M+U0LS00q1jd54/wDTp0fy/wDgVZVY1Oa3QXKWLm/sNOtPktE8yePyI9n+z8u+
+ihJyZFUyrmeTzPtUHlwXaSInlp/Eq/erX2d3ZhSGSabdTyedPHHDAiJHJHJ975fmbZThWjEA+yPp
+6X97B88Hkb/n/u76bqKbSC4+31m6urRLK1+eNHd5JH/h82s5Ybl95gUtS1K/n8t/tHlwWWxI99dF
+Kmtn1AbHf77u4dI9kib4/wDvtKtULRNTTsbue1tJPPgSSx8jf8n95v4q4uROXmIsWF3d+XH58+9L
+L549if6zzU27aUmuYzJNGeODUoNOf57S6g/1f8S/3a0xKtG4GfNJBB88/wDqIN6QfJ/47Tpt81hR
+L2mR6TPaR6j5kcezfHPbxps+V/4aKtRp2OmMLmVd6bImvf6L8kb/AOsj3/IsVbKveJyD7iS706+u
+59UtEg3x+RHGn+3/AHar2d4gQ6defb/9Fgjk8+BH/wB3yl+eolSsa0J88rln7ZBqmn+W8nkbHTf/
+AHflrOUnF2OrF1PdNeS6jeON0jR38v5P+A1xOJz2MO3fyNej1G6jee0unf8Aef73369Bx/dhYzL+
+e3+3wWtrH+48z5/92umjGXULEEF2888cGmx+XPHJ+7/eVrOMeo7Cfa7/AO0SRz2/mSfP+7k/26ca
+Zzmh4dn+y3EaPHvjvpPL/wB3bWVWmBb1ax01Ly+nnkj+13z747f/AGaywVVyic801Iy10dJLr+/H
+/rI5I/ubK0lVSZ1VKUpRNaxvbCG9897f/UfPd/7Sxf6vZXLiqMpaHdhKsXU5jR8TeIrO9ljSxjgk
+SSRP4N0v/fyowmHcTuq1Up8xgR/aLq7jgn8zy/LdPuf987q7Oh5nKadhqX2WCeykg+//AMt5/ubk
+rjlQu7i5TNuLjV7rzI4P3cfmf6z/AOJruhGyOiTuy1cacPsHn30nmbI08yP/AGq5oVfe0HKhoQSS
+XFrcQb5EnkeRP3Cfd81ar4tjzChqf2t9au4445Ekd/8Aj3f7/wAv8FdlGNkAgurmdLiCRP36b/8A
+R/L/AO+qiMLERhLmLFloCXQj/eb449n/AH63/PWFTE8rOrEQfKX47t73xLO/lo8HnvHHH/0yrPlj
+CnoZR1K+tT6bA9olrHvgT5JP76t/FV0IynE6YwTJrDUbe1027fyP3aSI8En+1/dpYmi5SsZzoWK+
+p6jJNYSQTSRpPHsnjj/4HWlHCtanNKBj/a47u/8APn+eN/L/ANmuizjCx2yNnRtUjutdw8f7je6R
+x/w7dm1a4cRQdOnzIwkitqepafNrdvJHJJBaQR7JP4vuV2wpWjYqcLSub2k6rd3dvd6g/wC/2Wrp
+Hv8A71eXOnyyt5nTOvzRscnb6nb/AGzz/L/eR/P+8f8A5a16rpcqscCN7RbXTdevY4bqOTfNB+4n
+3/xQf3q8+vN0k3/WpsiC0sJNEkkupP3k9lIj+ZH/AHP73/j1bV5qT5UQQx6tJB5l1J9950nk3/8A
+oNN4dyVgsZ0l3eX1xI8H/PSSST+/89dNowWpBoXcFvp32eCef9/5m+SOP/ln/s1nRkpMDL1Ofz7i
+SSO3jSP7kcaf3EraEeV2GWvC+i/29rVpa+YiQb/37u/lKsS/e3PVYqqqauJlzxO8eq30cFpPvksf
+9Fg+f5ZYov4krnw8WkdeIiUtPtLiO4kgSPfB+/8As/mffZ9lauRwKVizpmhanfatAn2f7KkCeX8n
+95U3fPWFaryxJjO50c9hP/af9vWse+R43eSD7rLPEn72udV9DpjG5jyf8Se/+1QRyT2jxukm/wD2
+k3VvTg6iMOYf4e1OT7daTvJIkljvk89P4fNoqQdMOYfrdv8AavFv9qz/AL+C6keeST+BqVKveJdT
+QwLJ4zJcX3l/J5n+j7P4Wat5yaVgpO5et/8ATriOf7/kbJJ4/u7l/irKdXlNYo6SwtJ47uPVNOtE
+eCy/4+/tT/8AkHbXJKolqbKIninUdJ1ueN57jyLtJE/dz/6ryl/6aR08LSnFA4MxNXsrG71P5JP+
+Wf7uT7u5a3jVcTmlRkyTVo7+CSP7JJ5FpNaJdeX/ABf3X/8AQKVFJrzKjEXSLfQZNMkvvMk/tJJ0
+2f8AfFRiHJaG6ia93qF3qlvJB5f+o2JHWElY19oU7uR/LtEn/eT7PM/2f+BVrTVw9oXJLu7e42Qf
+ftfnj/2a5pamZafUpHu57qf/AFkEH7z/APbrejG4GZ5F/dQSTz2/+if6uSRPurura4xkklnHd+Q/
+mfYI/wB55ifNLvougKVxP+7uEj+SP/lnG/36iMLFsSSOSCSODzPPj8vzI5P7v/LWt1UsYMuQ3ccE
+H7uP9+7pPJGn3o5V3bax5LyM6sSzba9b6rpkieX5F/df6yf7u5kpunaRNKRyt3LcaXJJa+Z+7f8A
+dyR/f+7XVSfMRGVyxJq8Vx9njjkkeSCDy/tD/wDxNaSgdMY3Mf7FJPceX5myST/VyVs9DP2RP5Ub
+2+yfy/M8vy45P9ysHN3D2RUkjk+zx+XJ+7k/dx/7NdLRBPp9xcSXkfmSf6j93HJWUkBLJHcTxz30
+8m/ZJ/31WVuR2MTPt3k8yN45P3kf+rrp5VJDN+0kgnkjkkj/AHl1Psu//sf9+uOtTaepoZdxqd/9
+vk/5YSR70SP+7F/droVJOIFGRP3n/TT/AJaf/Y1rzaEcxoW9pA+iXE/7yS78/wD1afwr/erLm1Fz
+Fazgknk2RyeXcf6yPzP4q0m0jT2o+4N/aXEn/LOSeP8AeR/79KEkw9qaN58kFp/pHn70/wC/T1zU
+le4ItSXG/wAyOOOOT92/2fzP9r71Z2swNaw8Q6tJcJ9ljf8A0WD5IE+9+6+8tc8sIo6gZniKzgmt
+E1iGTf53+vj/AIlb73zVrhKkoysCZz1tH5kkfn/6uP8A1kf8deiwpal25+xv5aQeYkHmf6z+Lyv9
+qs+UKuhau5Lj7Hv8v/SHk8uST/gfy1hFXAnuPtljosnnx/6+RPsl3G/3X/iR6I7gf//Z
+</w:binData><v:shape id="_x0000_i1025" style="width:468pt;height:351pt" type="#_x0000_t75"><v:imagedata o:title="Autumn Leaves" src="wordml://02000001.jpg"/></v:shape></w:pict></w:r></w:p><w:p wsp:rsidR="00A264B8" wsp:rsidRDefault="00A264B8"/> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test3.expected.txt b/org.eclipse.osee.framework.search.engine.test/data/test3.expected.txt
new file mode 100644
index 00000000000..732b5466032
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test3.expected.txt
@@ -0,0 +1 @@
+I am going to test appendeces this time. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test3.tags.txt b/org.eclipse.osee.framework.search.engine.test/data/test3.tags.txt
new file mode 100644
index 00000000000..3275c576a7c
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test3.tags.txt
@@ -0,0 +1,8 @@
+i 18
+am 330
+going 1135472
+to 378
+test 113146
+appendix -220858502
+this 103194
+time 62778 \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test4.data.xml b/org.eclipse.osee.framework.search.engine.test/data/test4.data.xml
new file mode 100644
index 00000000000..422f68d4dfe
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test4.data.xml
@@ -0,0 +1,127 @@
+<w:p wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"/>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E">
+<w:pPr>
+<w:pStyle w:val="HeadingUnnumbered"/>
+</w:pPr>
+<w:r>
+<w:t>TEST OBJECTIVE:</w:t>
+</w:r>
+</w:p>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E">
+<w:r>
+<w:t>The objective of this test is to ver</w:t>
+</w:r>
+<w:r>
+<w:t>if</w:t></w:r><w:r><w:t>y </w:t></w:r><w:r><w:t>that the </w:t></w:r><w:r><w:t>system, power, and external stores subsystems satisfy</w:t>
+</w:r><w:r><w:t> </w:t>
+</w:r><w:r><w:t>the physical and functional requirements </w:t></w:r><w:r><w:t>specification</w:t></w:r><w:r><w:t>, </w:t></w:r><w:r><w:t>.</w:t></w:r></w:p>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="HeadingUnnumbered"/></w:pPr><w:r><w:t>SUCCESS CRITERIA</w:t></w:r></w:p>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:r><w:t>Suc</w:t></w:r><w:r><w:t>cessful completion of </w:t></w:r><w:r>
+<w:t>the Item</w:t></w:r><w:r><w:t>/External Stor</w:t></w:r><w:r><w:t>es</w:t></w:r><w:r><w:t> Ground Test Procedure (DOC# TBD) which </w:t>
+</w:r><w:r wsp:rsidR="00895CA2"><w:t>satisfies</w:t></w:r><w:r><w:t> test </w:t></w:r><w:r><w:t>verification </w:t></w:r>
+<w:r wsp:rsidR="00895CA2"><w:t>requirements</w:t></w:r><w:r><w:t> as specified in the </w:t></w:r><w:r><w:t>XIV</w:t></w:r><w:r><w:t>.</w:t>
+</w:r></w:p><w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="HeadingUnnumbered"/>
+</w:pPr><w:r><w:t>TEST APPROACH</w:t></w:r><w:r><w:t>/</w:t></w:r><w:r>
+<w:t>CONDITIONS</w:t></w:r></w:p><w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:r>
+<w:t>The </w:t></w:r><w:r><w:t>t</w:t></w:r><w:r><w:t>est seque</w:t></w:r><w:r><w:t>nce will be c</w:t></w:r><w:r>
+<w:t>onducted </w:t></w:r><w:r><w:t>in the lab</w:t></w:r><w:r><w:t> using externa</w:t></w:r><w:r><w:t>l </w:t></w:r><w:r>
+<w:t>p</w:t></w:r><w:r><w:t>ower. </w:t></w:r><w:r><w:t>Note that </w:t></w:r><w:r><w:t></w:t></w:r><w:r>
+<w:t> requirements associated with </w:t></w:r><w:r><w:t>rate</w:t></w:r><w:r><w:t>,</w:t></w:r><w:r>
+<w:t> </w:t></w:r><w:r><w:t>timing</w:t></w:r><w:r><w:t>, and</w:t></w:r><w:r>
+<w:t> power-up</w:t></w:r><w:r><w:t> </w:t></w:r><w:r><w:t>will be </w:t></w:r><w:r>
+<w:t>verified in the lab.</w:t></w:r>
+<w:r><w:t> Lik</w:t></w:r><w:r><w:t>ewise, performance and safe</w:t></w:r><w:r><w:t>ty inhibi</w:t></w:r>
+<w:r><w:t>ts as</w:t></w:r><w:r><w:t>sociated with the </w:t></w:r><w:r><w:t>po</w:t></w:r><w:r><w:t>w</w:t></w:r><w:r>
+<w:t>er system as well as other systems</w:t></w:r><w:r><w:t> will be verified in the lab.</w:t></w:r>
+<w:r wsp:rsidRPr="00814289"><w:t> </w:t></w:r><w:r>
+<w:t> Fin</w:t></w:r><w:r><w:t>ally, testing will be constrained to functional assurance only a</w:t>
+</w:r><w:r><w:t>s fault inse</w:t></w:r><w:r><w:t>rtion testing will be per</w:t></w:r><w:r><w:t>formed in the lab.</w:t>
+</w:r></w:p><w:p wsp:rsidP="003736BD" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"/>
+<w:p wsp:rsidP="0055327E" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:spacing w:after="120"/></w:pPr><w:r>
+<w:t>The pow</w:t></w:r><w:r><w:t>er, exte</w:t></w:r><w:r><w:t>rnal stores, and other </w:t></w:r><w:r>
+<w:t>testing will encompass the following functional areas:</w:t></w:r></w:p>
+<w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/>
+</w:r><w:r><w:t>Power subsystem controls and</w:t></w:r><w:r><w:t> displays to include symbology</w:t></w:r></w:p>
+<w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/></w:r><w:r><w:t>power type and inventory management</w:t>
+</w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"><w:pPr><w:pStyle w:val="bulletlvl1"/>
+<w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/>
+</w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/></w:r><w:r>
+<w:t>Power mode control </w:t></w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/>
+</w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/></w:r><w:r>
+<w:t>Power start-up</w:t></w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/>
+</w:r><w:r><w:t>Power usin</w:t></w:r><w:r><w:t>g boxes</w:t></w:r></w:p>
+<w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/>
+</w:r><w:r><w:t>Power subsystem Initialization</w:t></w:r></w:p>
+<w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr>
+<wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr>
+</w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/></w:r><w:r>
+<w:t>Power training mode operation</w:t></w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/>
+</w:r><w:r><w:t>Fuel present and empty status detection from each power station</w:t></w:r>
+</w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="003736BD" wsp:rsidRDefault="006E037E"><w:pPr><w:pStyle w:val="bulletlvl1"/>
+<w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/></w:listPr>
+</w:pPr><w:r><w:tab wx:cTlc="0" wx:tlc="none" wx:wTab="75"/></w:r><w:r><w:t>Selective and </w:t>
+</w:r><w:r><w:t>emergency power from each stati</w:t></w:r><w:r><w:t>on and other station</w:t></w:r></w:p>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:pPr><w:pStyle w:val="HeadingUnnumbered"/>
+</w:pPr><w:r><w:t>TEST DAT</w:t></w:r><w:r><w:t>A REQUIRE</w:t></w:r><w:r><w:t>D</w:t></w:r></w:p>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:r><w:t>ONE and TWO record</w:t></w:r><w:r><w:t>ing </w:t>
+</w:r><w:r><w:t>(channels A1</w:t></w:r><w:r><w:t>, A5,</w:t></w:r><w:r><w:t> a</w:t></w:r><w:r><w:t>nd A9 at minimum)</w:t>
+</w:r></w:p><w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:pPr><w:pStyle w:val="HeadingUnnumbered"/>
+</w:pPr><w:r><w:t>ITEM(S) UNDER TEST</w:t></w:r></w:p><w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:r>
+<w:t>The </w:t></w:r><w:r><w:t>components und</w:t></w:r><w:r><w:t>e</w:t></w:r><w:r><w:t>r test include:</w:t></w:r></w:p>
+<w:p wsp:rsidP="005C7089" wsp:rsidR="00E42D4B" wsp:rsidRDefault="006E037E"><w:pPr><w:pStyle w:val="bulletlvl1"/>
+<w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>Power assembly (includes SYSTEM 1)</w:t>
+</w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="00B77FA0" wsp:rsidRDefault="006E037E"><w:pPr><w:pStyle w:val="bulletlvl1"/>
+<w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/></w:listPr>
+</w:pPr><w:r><w:t>Maintenance Panel</w:t></w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="00B77FA0" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>Power</w:t></w:r><w:r><w:t> panels</w:t>
+</w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="00AF6C4D" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>Software</w:t></w:r></w:p>
+<w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="HeadingUnnumbered"/></w:pPr><w:r><w:t>SPE</w:t></w:r><w:r><w:t>CIAL (OR MA</w:t></w:r><w:r><w:t>JOR) TEST </w:t></w:r><w:r>
+<w:t>SUPPORT EQUIPMENT</w:t></w:r></w:p><w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:r>
+<w:t>The following test s</w:t></w:r><w:r><w:t>upport equipment will</w:t></w:r><w:r>
+<w:t> be required to fa</w:t></w:r><w:r><w:t>cilitate</w:t></w:r><w:r><w:t> execution of the test event</w:t></w:r>
+<w:r><w:t>:</w:t></w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="00E42D4B" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>power item installed on each station (10 total)</w:t>
+</w:r></w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="0079799D" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>Boxes </w:t></w:r><w:r><w:t>(16 total)</w:t></w:r>
+</w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="006C0203" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>Power simulators (11 total)</w:t></w:r>
+</w:p><w:p wsp:rsidP="005C7089" wsp:rsidR="00B77FA0" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr>
+<wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/>
+</w:listPr></w:pPr><w:r><w:t>Fuel tank simulator</w:t></w:r></w:p>
+<w:p wsp:rsidP="005C7089" wsp:rsidR="00B77FA0" wsp:rsidRDefault="006E037E" wsp:rsidRPr="0027111D"><w:pPr>
+<w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/><wx:font wx:val="Symbol"/>
+</w:listPr></w:pPr><w:r wsp:rsidRPr="00B2506B"><w:rPr><w:rFonts w:ascii="Helvetica" w:h-ansi="Helvetica"/>
+<wx:font wx:val="Helvetica"/></w:rPr><w:t>Test Set (123456789)</w:t></w:r>\
+</w:p><w:p wsp:rsidP="0027111D" wsp:rsidR="0027111D" wsp:rsidRDefault="006E037E">
+<w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><wx:t wx:val="·" wx:wTabAfter="270" wx:wTabBefore="285"/>
+<wx:font wx:val="Symbol"/></w:listPr></w:pPr><w:r><w:t>Portable workstation (monitor)</w:t>
+</w:r></w:p><w:p wsp:rsidP="0090047B" wsp:rsidR="0090047B" wsp:rsidRDefault="006E037E"><w:pPr>
+<w:pStyle w:val="HeadingUnnumbered"/></w:pPr><w:r><w:t>SPECIAL CONSIDERATIONS/REMAR</w:t></w:r><w:r><w:t>KS</w:t>
+</w:r></w:p><w:p wsp:rsidP="005C3283" wsp:rsidR="005C3283" wsp:rsidRDefault="006E037E"><w:r>
+<w:t>Test system must be fitted with a functional system 1, system 2, and s</w:t>
+</w:r><w:r><w:t>yste</w:t></w:r><w:r><w:t>m 3 to include wheels.</w:t></w:r></w:p>
+<w:p wsp:rsidR="0078581E" wsp:rsidRDefault="007D393E"/> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test4.expected.txt b/org.eclipse.osee.framework.search.engine.test/data/test4.expected.txt
new file mode 100644
index 00000000000..05d5f221a9d
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test4.expected.txt
@@ -0,0 +1 @@
+TEST OBJECTIVE: The objective of this test is to verify that the system, power, and external stores subsystems satisfy the physical and functional requirements specification, . SUCCESS CRITERIA Successful completion of the Item/External Stores Ground Test Procedure (DOC# TBD) which satisfies test verification requirements as specified in the XIV. TEST APPROACH/CONDITIONS The test sequence will be conducted in the lab using external power. Note that requirements associated with rate, timing, and power-up will be verified in the lab. Likewise, performance and safety inhibits associated with the power system as well as other systems will be verified in the lab. Finally, testing will be constrained to functional assurance only as fault insertion testing will be performed in the lab. The power, external stores, and other testing will encompass the following functional areas: Power subsystem controls and displays to include symbology power type and inventory management Power mode control Power start-up Power using boxes Power subsystem Initialization Power training mode operation Fuel present and empty status detection from each power station Selective and emergency power from each station and other station TEST DATA REQUIRED ONE and TWO recording (channels A1, A5, and A9 at minimum) ITEM(S) UNDER TEST The components under test include: Power assembly (includes SYSTEM 1) Maintenance Panel Power panels Software SPECIAL (OR MAJOR) TEST SUPPORT EQUIPMENT The following test support equipment will be required to facilitate execution of the test event: power item installed on each station (10 total) Boxes (16 total) Power simulators (11 total) Fuel tank simulator Test Set (123456789) Portable workstation (monitor) SPECIAL CONSIDERATIONS/REMARKS Test system must be fitted with a functional system 1, system 2, and system 3 to include wheels. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test4.tags.txt b/org.eclipse.osee.framework.search.engine.test/data/test4.tags.txt
new file mode 100644
index 00000000000..9741207e1e1
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test4.tags.txt
@@ -0,0 +1,280 @@
+test 113146
+objective -743637058
+the 3866
+objective -743637058
+of 246
+this 103194
+test 113146
+is 402
+to 378
+verify 32454908
+that 109338
+the 3866
+system 22002169
+power 1637751
+and 3418
+external 995687422
+store 1021881
+subsystem -73425987
+satisfy 519649977
+the 3866
+physical 986947351
+and 3418
+functional 1463473599
+requirement 1335083006
+specification -755499013
+success 429837753
+criterion 1938797469
+successful -107033157
+completion 989033854
+of 246
+the 3866
+item 85938
+external 995687422
+store 1021881
+ground 14006160
+test 113146
+procedure -1679894625
+doc 3437
+tbd 3514
+which 1168157
+satisfy 519649977
+test 113146
+verification -1389395970
+requirement 1335083006
+as 410
+specified -218968195
+in 338
+the 3866
+xiv 7487
+test 113146
+approach 481793914
+condition 1941099901
+the 3866
+test 113146
+sequence -312492039
+will 78653
+be 235
+conducted -86256275
+in 338
+the 3866
+lab 2995
+using 1135515
+external 995687422
+power 1637751
+note 64373
+that 109338
+requirement 1335083006
+associated -1423083042
+with 72509
+rate 64184
+timing 18167098
+and 3418
+power 1637751
+up 379
+will 78653
+be 235
+verified -550553348
+in 338
+the 3866
+lab 2995
+likewise -113377485
+performance -1248395529
+and 3418
+safety 33222585
+inhibit 455815506
+associated -1423083042
+with 72509
+the 3866
+power 1637751
+system 22002169
+as 410
+well 78845
+as 410
+other 1634742
+system 22002169
+will 78653
+be 235
+verified -550553348
+in 338
+the 3866
+lab 2995
+finally 523482415
+testing 290699770
+will 78653
+be 235
+constrained 731618813
+to 378
+functional 1463473599
+assurance -709248610
+only 127830
+as 410
+fault 1784751
+insertion 1941502295
+testing 290699770
+will 78653
+be 235
+performed -174655233
+in 338
+the 3866
+lab 2995
+the 3866
+power 1637751
+external 995687422
+store 1021881
+and 3418
+other 1634742
+testing 290699770
+will 78653
+encompass -1686803105
+the 3866
+following 1406612351
+functional 1463473599
+area 44938
+power 1637751
+subsystem -73425987
+control 326743404
+and 3418
+display 515078445
+to 378
+include 249249106
+symbology 389461503
+power 1637751
+type 63482
+and 3418
+inventory -1749680802
+management -185551435
+power 1637751
+mode 60788
+control 326743404
+power 1637751
+start 1805241
+up 379
+power 1637751
+using 1135515
+box 16235
+power 1637751
+subsystem -73425987
+initialization 871873535
+power 1637751
+training 355806106
+mode 60788
+operation 1940623223
+fuel 81855
+present 459251607
+and 3418
+empty 2078542
+status 26979257
+detection 1940716285
+from 87951
+each 72878
+power 1637751
+station 359902137
+selective -743640065
+and 3418
+emergency -705589410
+power 1637751
+from 87951
+each 72878
+station 359902137
+and 3418
+other 1634742
+station 359902137
+test 113146
+data 47789
+required -543965192
+one 3926
+and 3418
+two 6106
+recording 1389980920
+channel 334846748
+a1 26
+a5 90
+and 3418
+a9 154
+at 426
+minimum 364197172
+item 85938
+under 1633627
+test 113146
+the 3866
+component 1599567230
+under 1633627
+test 113146
+include 249249106
+power 1637751
+assembly -206243430
+include 249249106
+system 22002169
+1 1
+maintenance -1241817355
+panel 1308087
+power 1637751
+panel 1308087
+software -121786503
+special 330485625
+or 406
+major 1671092
+test 113146
+support 462911417
+equipment 1599552510
+the 3866
+following 1406612351
+test 113146
+support 462911417
+equipment 1599552510
+will 78653
+be 235
+required -543965192
+to 378
+facilitate -1154274049
+execution 1941688319
+of 246
+the 3866
+test 113146
+event 1793998
+power 1637751
+item 85938
+installed -214189729
+on 342
+each 72878
+station 359902137
+10 1
+total 1293178
+box 16235
+16 97
+total 1293178
+power 1637751
+simulator 2058597689
+11 17
+total 1293178
+fuel 81855
+tank 259514
+simulator 2058597689
+test 113146
+set 6905
+123456789 -2023406807
+portable -205801097
+workstation -1413743233
+monitor 427505012
+special 330485625
+consideration -1898448914
+remark 66630904
+test 113146
+system 22002169
+must 113076
+be 235
+fitted 14662447
+with 72509
+a 10
+functional 1463473599
+system 22002169
+1 1
+system 22002169
+2 2
+and 3418
+system 22002169
+3 3
+to 378
+include 249249106
+wheel 1306397 \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test5.data.xml b/org.eclipse.osee.framework.search.engine.test/data/test5.data.xml
new file mode 100644
index 00000000000..c8900b09d4b
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test5.data.xml
@@ -0,0 +1 @@
+<w:p wsp:rsidR="00372898" wsp:rsidRDefault="00372898" wsp:rsidP="00414030"><w:pPr><w:rPr><w:sz-cs w:val="22"/></w:rPr></w:pPr><w:r><w:rPr><w:sz-cs w:val="22"/></w:rPr><w:t>Battery</w:t></w:r><w:r><w:rPr><w:sz-cs w:val="22"/></w:rPr><w:t>(ies) shall be the alternate/backup power source. &lt;test1&gt; 'test2' &apos;test3&apos; test4&apos; ' &apos;</w:t></w:r></w:p> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test5.expected.txt b/org.eclipse.osee.framework.search.engine.test/data/test5.expected.txt
new file mode 100644
index 00000000000..cd625ef588e
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test5.expected.txt
@@ -0,0 +1 @@
+Battery(ies) shall be the alternate/backup power source. <test1> 'test2' 'test3' test4' ' ' \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test5.tags.txt b/org.eclipse.osee.framework.search.engine.test/data/test5.tags.txt
new file mode 100644
index 00000000000..f6f6687ba6b
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test5.tags.txt
@@ -0,0 +1,12 @@
+battery 529513131
+shall 1260313
+be 235
+the 3866
+alternate -1420231874
+backup 24902827
+power 1637751
+source 15571833
+test1 113146
+test2 244218
+test3 244218
+test4 375290 \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test6.data.xml b/org.eclipse.osee.framework.search.engine.test/data/test6.data.xml
new file mode 100644
index 00000000000..3d1b5ea831a
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test6.data.xml
@@ -0,0 +1,2 @@
+<w:p wsp:rsidR="00372898" wsp:rsidRDefault="00372898" wsp:rsidP="00414030"><w:pPr><w:rPr><w:sz-cs w:val="22"/></w:rPr></w:pPr><w:r><w:rPr><w:sz-cs w:val="22"/></w:rPr><w:t>During autorotation, the engine(s) not supplying torque shall be automatically decoupled
+from the drive system by overrunning clutch(es) to permit continued operation of the main motor.</w:t></w:r></w:p> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test6.expected.txt b/org.eclipse.osee.framework.search.engine.test/data/test6.expected.txt
new file mode 100644
index 00000000000..ca3a4bf5f91
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test6.expected.txt
@@ -0,0 +1 @@
+During autorotation, the engine(s) not supplying torque shall be automatically decoupled from the drive system by overrunning clutch(es) to permit continued operation of the main motor. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/data/test6.tags.txt b/org.eclipse.osee.framework.search.engine.test/data/test6.tags.txt
new file mode 100644
index 00000000000..7f91fc5ad2f
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/data/test6.tags.txt
@@ -0,0 +1,26 @@
+during 18168253
+autorotation -1149665350
+the 3866
+engine 16068958
+not 7029
+supplying 1408464825
+torque 16513402
+shall 1260313
+be 235
+automatically 985627582
+decoupled -210014995
+from 87951
+the 3866
+drive 1037197
+system 22002169
+by 491
+overrunning 1438228438
+clutch 18725692
+to 378
+permit 28530935
+continued -78400147
+operation 1940623223
+of 246
+the 3866
+main 86708
+motor 1670004 \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/Activator.java b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/Activator.java
new file mode 100644
index 00000000000..25606084dd9
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/Activator.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.framework.search.engine.test;
+
+import org.eclipse.osee.framework.search.engine.ISearchEngine;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+
+ private static Activator instance;
+
+ private BundleContext bundleContext;
+ private ServiceTracker searchServiceTracker;
+ private ServiceTracker taggerServiceTracker;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ this.bundleContext = context;
+ searchServiceTracker = new ServiceTracker(context, ISearchEngine.class.getName(), null);
+ searchServiceTracker.open();
+
+ taggerServiceTracker = new ServiceTracker(context, ISearchEngineTagger.class.getName(), null);
+ taggerServiceTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ searchServiceTracker.close();
+ searchServiceTracker = null;
+
+ taggerServiceTracker.close();
+ taggerServiceTracker = null;
+
+ bundleContext = null;
+
+ instance = null;
+ }
+
+ public static Activator getInstance() {
+ return instance;
+ }
+
+ public BundleContext getBundleContext() {
+ return this.bundleContext;
+ }
+
+ public ISearchEngine getSearchEngine() {
+ return (ISearchEngine) searchServiceTracker.getService();
+ }
+
+ public ISearchEngineTagger getSearchTagger() {
+ return (ISearchEngineTagger) taggerServiceTracker.getService();
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/AllSearchEngineTests.java b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/AllSearchEngineTests.java
new file mode 100644
index 00000000000..4509064edb8
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/AllSearchEngineTests.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.framework.search.engine.test;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AllSearchEngineTests extends TestSuite {
+
+ public AllSearchEngineTests() {
+ addTestSuite(TestWordsUtil.class);
+ addTestSuite(TestSearchDataStore.class);
+ addTestSuite(TestSearchEngine.class);//
+ addTestSuite(TestTagProcessor.class);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchDataStore.java b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchDataStore.java
new file mode 100644
index 00000000000..3e8b943486b
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchDataStore.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.framework.search.engine.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.TransactionJoinQuery;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.search.engine.data.IAttributeLocator;
+import org.eclipse.osee.framework.search.engine.data.SearchTag;
+import org.eclipse.osee.framework.search.engine.utility.SearchTagDataStore;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestSearchDataStore extends TestCase {
+
+ private List<SearchTag> getTestSearchTagDataStoreData() {
+ List<SearchTag> tags = new ArrayList<SearchTag>();
+
+ SearchTag tag = new SearchTag(2345);
+ tag.addTag(-99999999999L);
+ tag.addTag(-99999999998L);
+ tags.add(tag);
+
+ tag = new SearchTag(91011);
+ tag.addTag(-99999999997L);
+ tag.addTag(-99999999996L);
+ tags.add(tag);
+
+ tag = new SearchTag(15161718);
+ tag.addTag(-99999999995L);
+ tag.addTag(-99999999994L);
+ tags.add(tag);
+
+ return tags;
+ }
+
+ public void testSearchTagDataStore() throws OseeCoreException {
+ new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ List<SearchTag> testData = getTestSearchTagDataStoreData();
+ int totalTags = 0;
+ for (SearchTag searchTag : testData) {
+ totalTags += searchTag.cacheSize();
+ }
+ int updated = SearchTagDataStore.storeTags(connection, testData);
+ assertEquals(totalTags, updated);
+
+ for (SearchTag tag : testData) {
+ for (Long codedTag : tag.getTags()) {
+ Set<IAttributeLocator> locators = SearchTagDataStore.fetchTagEntries(connection, codedTag);
+ assertEquals(locators.size(), 1);
+ IAttributeLocator locator = locators.iterator().next();
+ assertEquals(locator.getGammaId(), tag.getGammaId());
+ }
+ }
+
+ List<IAttributeLocator> locators = Collections.castAll(testData);
+ updated = SearchTagDataStore.deleteTags(connection, locators);
+ assertEquals(totalTags, updated);
+ }
+ }.execute();
+ }
+
+ public void testSearchTagDataStoreDeleteByQuery() throws Exception {
+ new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ List<SearchTag> testData = getTestSearchTagDataStoreData();
+ TransactionJoinQuery joinQuery = null;
+ int totalTags = 0;
+ for (SearchTag searchTag : testData) {
+ totalTags += searchTag.cacheSize();
+ }
+
+ int updated = SearchTagDataStore.storeTags(connection, testData);
+ assertEquals(totalTags, updated);
+
+ for (SearchTag tag : testData) {
+ for (Long codedTag : tag.getTags()) {
+ Set<IAttributeLocator> locators = SearchTagDataStore.fetchTagEntries(connection, codedTag);
+ assertEquals(locators.size(), 1);
+ IAttributeLocator locator = locators.iterator().next();
+ assertEquals(locator.getGammaId(), tag.getGammaId());
+ }
+ }
+ try {
+ joinQuery = JoinUtility.createTransactionJoinQuery();
+ for (SearchTag tag : testData) {
+ joinQuery.add((int) tag.getGammaId(), -1);
+ }
+ joinQuery.store(connection);
+ updated = SearchTagDataStore.deleteTags(connection, joinQuery.getQueryId());
+ assertEquals(totalTags, updated);
+ } finally {
+ if (joinQuery != null) {
+ joinQuery.delete(connection);
+ }
+ }
+ }
+ }.execute();
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchEngine.java b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchEngine.java
new file mode 100644
index 00000000000..82f762d3906
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestSearchEngine.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.framework.search.engine.test;
+
+import junit.framework.TestCase;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestSearchEngine extends TestCase {
+
+ public void testGettingSearchEngine() {
+ assertNotNull(Activator.getInstance().getSearchEngine());
+ }
+
+ public void testGettingSearchTagger() {
+ assertNotNull(Activator.getInstance().getSearchTagger());
+ }
+
+ public void test() {
+ // create dummy attribute
+
+ // tag it
+ // ISearchEngineTagger tagger = Activator.getInstance().getSearchTagger();
+ // tagger.tagAttribute(4);
+
+ // check tagged
+
+ // delete dummy attribute
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestTagProcessor.java b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestTagProcessor.java
new file mode 100644
index 00000000000..6d93a80daf3
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestTagProcessor.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.framework.search.engine.test;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Scanner;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.jdk.core.type.MutableInteger;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.XmlTextInputStream;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+import org.eclipse.osee.framework.search.engine.utility.TagProcessor;
+import org.osgi.framework.Bundle;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestTagProcessor extends TestCase {
+
+ private Map<String, TestData<URL, URL>> getTestTagData() {
+ Map<String, TestData<URL, URL>> toReturn = new LinkedHashMap<String, TestData<URL, URL>>();
+ Bundle bundle = Activator.getInstance().getBundleContext().getBundle();
+ Enumeration<?> urls = bundle.findEntries("data", "*.*", true);
+ while (urls.hasMoreElements()) {
+ URL url = (URL) urls.nextElement();
+ String name = getFileName(url.getPath());
+ if (Strings.isValid(name) && (url.getPath().endsWith(".data.xml") || url.getPath().endsWith(".tags.txt"))) {
+ TestData<URL, URL> pair = toReturn.get(name);
+ if (pair == null) {
+ pair = new TestData<URL, URL>();
+ toReturn.put(name, pair);
+ }
+ if (isDataFile(url.getPath())) {
+ pair.data = url;
+ } else if (isExpectedFile(url.getPath())) {
+ pair.expected = url;
+ } else if (pair.data == null || pair.expected == null) {
+ toReturn.remove(pair);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private void checkValue(int currentCount, Scanner expectedTags, String test, String word, Long codedTag) {
+ try {
+ if (expectedTags.hasNext()) {
+ assertEquals(String.format("Line: [%d] Test: [%s] word: [%s]", currentCount, test, word),
+ expectedTags.next(), word);
+ assertEquals(String.format("Line: [%d] Test: [%s] word: [%s]", currentCount, test, word),
+ expectedTags.nextLong(), codedTag.longValue());
+ } else {
+ assertTrue(String.format("Line: [%d] Test: [%s] word: [%s] tag: [%d] -- Extra Tag Found", currentCount,
+ test, word, codedTag), false);
+ }
+ } catch (Exception ex) {
+ System.out.println(String.format("%s %s", word, codedTag));
+ }
+ }
+
+ public void testTagFromInputStream() throws IOException {
+ Map<String, TestData<URL, URL>> testMap = getTestTagData();
+ for (final String key : testMap.keySet()) {
+ TestData<URL, URL> testData = testMap.get(key);
+
+ InputStream dataStream = null;
+ InputStream expectedStream = null;
+ try {
+ dataStream = new BufferedInputStream(testData.data.openStream());
+ expectedStream = new BufferedInputStream(testData.expected.openStream());
+ final Scanner expectedTags = new Scanner(expectedStream, "UTF-8");
+
+ Scanner sourceScanner = new Scanner(new XmlTextInputStream(dataStream));
+ final MutableInteger count = new MutableInteger(0);
+ TagProcessor.collectFromScanner(sourceScanner, new ITagCollector() {
+ @Override
+ public void addTag(String word, Long codedTag) {
+ checkValue(count.getValueAndInc(), expectedTags, key, word, codedTag);
+ }
+ });
+ } finally {
+ if (dataStream != null) {
+ try {
+ dataStream.close();
+ } catch (IOException ex) {
+ }
+ }
+ if (expectedStream != null) {
+ try {
+ expectedStream.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+ }
+ }
+
+ private String getFileName(String name) {
+ int index = name.lastIndexOf("/");
+ if (index > -1) {
+ name = name.substring(index + 1, name.length());
+ }
+ if (name.endsWith(".data.xml")) {
+ name = name.substring(0, name.length() - 9);
+ }
+ if (name.endsWith(".tags.txt")) {
+ name = name.substring(0, name.length() - 9);
+ }
+ return name;
+ }
+
+ private boolean isDataFile(String name) {
+ return name != null && name.endsWith(".data.xml");
+ }
+
+ private boolean isExpectedFile(String name) {
+ return name != null && name.endsWith(".tags.txt");
+ }
+
+ private class TestData<K, V> {
+ private K data;
+ private V expected;
+ }
+
+ public void testTagWordFile() throws IOException {
+ // This is here to be able to look at tags generated from xml file source
+ Bundle bundle = Activator.getInstance().getBundleContext().getBundle();
+ URL url = bundle.getEntry("data/test5.data.xml");
+ InputStream dataStream = null;
+ try {
+ dataStream = new XmlTextInputStream(new BufferedInputStream(url.openStream()));
+ TagProcessor.collectFromInputStream(dataStream, new ITagCollector() {
+ @Override
+ public void addTag(String word, Long codedTag) {
+ System.out.println("Word: [" + word + "] Tag: [" + codedTag + "]");
+ }
+ });
+ } finally {
+ dataStream.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestWordsUtil.java b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestWordsUtil.java
new file mode 100644
index 00000000000..32b6e082f41
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine.test/src/org/eclipse/osee/framework/search/engine/test/TestWordsUtil.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.test;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Scanner;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.XmlTextInputStream;
+import org.eclipse.osee.framework.search.engine.utility.WordsUtil;
+import org.osgi.framework.Bundle;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestWordsUtil extends TestCase {
+
+ private Map<String, String> getSingularToPluralData() {
+ Map<String, String> testMap = new LinkedHashMap<String, String>();
+ testMap.put("tries", "try");
+ testMap.put("volcanoes", "volcano");
+ testMap.put("geese", "goose");
+ testMap.put("windows", "window");
+ testMap.put("glasses", "glass");
+ testMap.put("fishes", "fish");
+ testMap.put("houses", "house");
+ testMap.put("judges", "judge");
+ testMap.put("dishes", "dish");
+ testMap.put("phases", "phase");
+ testMap.put("witches", "witch");
+ testMap.put("baths", "bath");
+ testMap.put("calves", "calf");
+ testMap.put("lives", "life");
+ testMap.put("proofs", "proof");
+ testMap.put("boys", "boy");
+ testMap.put("dwarfs", "dwarf");
+ testMap.put("dwarves", "dwarf");
+ testMap.put("hooves", "hoof");
+ testMap.put("chairs", "chair");
+ testMap.put("heroes", "hero");
+ testMap.put("cantos", "canto");
+ testMap.put("porticos", "portico");
+ testMap.put("indeces", "index");
+ testMap.put("leaves", "leaf");
+ testMap.put("hello", "hello");
+ testMap.put("axes", "axis");
+ testMap.put("boxes", "box");
+ testMap.put("foxes", "fox");
+ testMap.put("species", "species");
+ testMap.put("series", "series");
+ testMap.put("status", "status");
+ testMap.put("as", "as");
+ testMap.put("appendeces", "appendix");
+ return testMap;
+ }
+
+ public void testSingularToPlural() {
+ Map<String, String> testMap = getSingularToPluralData();
+ for (String key : testMap.keySet()) {
+ String expected = testMap.get(key);
+ String actual = WordsUtil.toSingular(key);
+ assertEquals(String.format("Original: [%s] ", key), expected, actual);
+ }
+ }
+
+ private Map<String, String> getStripPossessiveData() {
+ Map<String, String> toReturn = new LinkedHashMap<String, String>();
+ toReturn.put("don't", "don't");
+ toReturn.put("yours", "yours");
+ toReturn.put("Larry's", "Larry");
+ toReturn.put("Joe's bag of tricks", "Joe bag of tricks");
+ toReturn.put("What's that?", "What that?");
+ toReturn.put("Company's books", "Company books");
+ toReturn.put("Charles's cars.", "Charles cars.");
+ toReturn.put("witches' brooms", "witches brooms");
+ toReturn.put("babies' beds.", "babies beds.");
+ toReturn.put("children's books", "children books");
+ return toReturn;
+ }
+
+ public void testStripPossessive() throws UnsupportedEncodingException {
+ Map<String, String> testMap = getStripPossessiveData();
+ for (String key : testMap.keySet()) {
+ StringBuilder builder = new StringBuilder();
+ Scanner scanner = new Scanner(key);
+ while (scanner.hasNext()) {
+ if (builder.length() > 0) {
+ builder.append(" ");
+ }
+ builder.append(WordsUtil.stripPossesive(scanner.next()));
+ }
+ assertEquals(String.format("Original: [%s] ", key), testMap.get(key), builder.toString());
+ }
+ }
+
+ private Map<String, String[]> getSplitOnPuntucationData() {
+ Map<String, String[]> toReturn = new LinkedHashMap<String, String[]>();
+ toReturn.put("test.db.preset", new String[] {"test", "db", "preset"});
+ toReturn.put("{what is this}", new String[] {"what", "is", "this"});
+ toReturn.put("What is your name?", new String[] {"What", "is", "your", "name"});
+ toReturn.put("Run!!", new String[] {"Run"});
+ toReturn.put("don't", new String[] {"don't"});
+ toReturn.put("hello", new String[] {"hello"});
+ return toReturn;
+ }
+
+ public void testSplitOnPunctuation() {
+ Map<String, String[]> testMap = getSplitOnPuntucationData();
+ for (String key : testMap.keySet()) {
+ String[] results = WordsUtil.splitOnPunctuation(key);
+ assertEquals(String.format("Original: [%s] ", key), Arrays.deepToString(testMap.get(key)),
+ Arrays.deepToString(results));
+ }
+ }
+
+ private String getFileName(String name) {
+ int index = name.lastIndexOf("/");
+ if (index > -1) {
+ name = name.substring(index + 1, name.length());
+ }
+ if (name.endsWith(".data.xml")) {
+ name = name.substring(0, name.length() - 9);
+ }
+ if (name.endsWith(".expected.txt")) {
+ name = name.substring(0, name.length() - 13);
+ }
+ return name;
+ }
+
+ private boolean isDataFile(String name) {
+ return name != null && name.endsWith(".data.xml");
+ }
+
+ private boolean isExpectedFile(String name) {
+ return name != null && name.endsWith(".expected.txt");
+ }
+
+ private Map<String, TestData<URL, URL>> getXmlMarkupRemovalData() {
+ Map<String, TestData<URL, URL>> toReturn = new LinkedHashMap<String, TestData<URL, URL>>();
+
+ Bundle bundle = Activator.getInstance().getBundleContext().getBundle();
+ Enumeration<?> urls = bundle.findEntries("data", "*.*", true);
+ while (urls.hasMoreElements()) {
+ URL url = (URL) urls.nextElement();
+ String name = getFileName(url.getPath());
+ if (Strings.isValid(name) && (url.getPath().endsWith(".data.xml") || url.getPath().endsWith(".expected.txt"))) {
+ TestData<URL, URL> pair = toReturn.get(name);
+ if (pair == null) {
+ pair = new TestData<URL, URL>();
+ toReturn.put(name, pair);
+ }
+ if (isDataFile(url.getPath())) {
+ pair.data = url;
+ } else if (isExpectedFile(url.getPath())) {
+ pair.expected = url;
+ } else if (pair.data == null || pair.expected == null) {
+ toReturn.remove(pair);
+ }
+ }
+ }
+
+ return toReturn;
+ }
+
+ // public void testXmlMarkupRemovalScanner() throws IOException {
+ // Map<String, TestData<URL, URL>> testMap = getXmlMarkupRemovalData();
+ // for (String key : testMap.keySet()) {
+ // TestData<URL, URL> testData = testMap.get(key);
+ //
+ // InputStream dataStream = null;
+ // InputStream expectedStream = null;
+ // Scanner scanner = null;
+ // try {
+ // dataStream = new BufferedInputStream(testData.data.openStream());
+ // expectedStream = new BufferedInputStream(testData.expected.openStream());
+ //
+ // StringBuilder builder = new StringBuilder();
+ // scanner = WordsUtil.inputStreamToXmlTextScanner(dataStream);
+ // while (scanner.hasNext()) {
+ // String value = scanner.next();
+ // if (value.length() > 0) {
+ // builder.append(value);
+ // if (scanner.hasNext()) {
+ // builder.append(" ");
+ // }
+ // }
+ // }
+ //
+ // String actual = builder.toString();
+ // String expected = Lib.inputStreamToString(expectedStream);
+ // assertEquals(String.format("Original: [%s] ", key), expected, actual);
+ // } finally {
+ // if (scanner != null) {
+ // scanner.close();
+ // }
+ // if (dataStream != null) {
+ // try {
+ // dataStream.close();
+ // } catch (IOException ex) {
+ // }
+ // }
+ // if (expectedStream != null) {
+ // try {
+ // expectedStream.close();
+ // } catch (IOException ex) {
+ // }
+ // }
+ // }
+ // }
+ // }
+
+ public void testXmlMarkupRemovalStream() throws IOException {
+ Map<String, TestData<URL, URL>> testMap = getXmlMarkupRemovalData();
+ for (String key : testMap.keySet()) {
+ TestData<URL, URL> testData = testMap.get(key);
+
+ InputStream dataStream = null;
+ InputStream expectedStream = null;
+ Scanner scanner = null;
+ try {
+ dataStream = new XmlTextInputStream(new BufferedInputStream(testData.data.openStream()));
+ expectedStream = new BufferedInputStream(testData.expected.openStream());
+
+ StringBuilder builder = new StringBuilder();
+ scanner = new Scanner(dataStream, "UTF-8");
+ while (scanner.hasNext()) {
+ String value = scanner.next();
+ if (value.length() > 0) {
+ builder.append(value);
+ if (scanner.hasNext()) {
+ builder.append(" ");
+ }
+ }
+ }
+
+ String actual = builder.toString();
+ String expected = Lib.inputStreamToString(expectedStream);
+ assertEquals(String.format("Original: [%s] ", key), expected, actual);
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+ if (dataStream != null) {
+ try {
+ dataStream.close();
+ } catch (IOException ex) {
+ }
+ }
+ if (expectedStream != null) {
+ try {
+ expectedStream.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+ }
+ }
+
+ private class TestData<K, V> {
+ private K data;
+ private V expected;
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/.classpath b/org.eclipse.osee.framework.search.engine/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.search.engine/.project b/org.eclipse.osee.framework.search.engine/.project
new file mode 100644
index 00000000000..88e2514efc1
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.search.engine</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.search.engine/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.search.engine/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..e7cb208fd24
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 30 20:23:24 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.search.engine/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.search.engine/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..5b589a1ce28
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/META-INF/MANIFEST.MF
@@ -0,0 +1,41 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Search Engine Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.search.engine;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.search.engine.internal.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.query,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.jdk.core.util.time,
+ org.eclipse.osee.framework.jdk.core.util.xml,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.eclipse.osgi.framework.util,
+ org.eclipse.osgi.util,
+ org.osgi.framework,
+ org.osgi.service.log,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.framework.search.engine,
+ org.eclipse.osee.framework.search.engine.attribute,
+ org.eclipse.osee.framework.search.engine.data,
+ org.eclipse.osee.framework.search.engine.utility
+Service-Component: OSGI-INF/attribute.tagger.provider.consumer.xml,
+ OSGI-INF/default.attribute.tagger.provider.xml,
+ OSGI-INF/xml.attribute.tagger.provider.xml,
+ OSGI-INF/search.engine.service.xml,
+ OSGI-INF/search.engine.tagger.service.xml
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds
diff --git a/org.eclipse.osee.framework.search.engine/OSGI-INF/attribute.tagger.provider.consumer.xml b/org.eclipse.osee.framework.search.engine/OSGI-INF/attribute.tagger.provider.consumer.xml
new file mode 100644
index 00000000000..17737cf89ea
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/OSGI-INF/attribute.tagger.provider.consumer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<component name="attribute.tagger.provider.manager">
+ <implementation class="org.eclipse.osee.framework.search.engine.internal.AttributeTaggerProviderManager"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.search.engine.IAttributeTaggerProviderManager"/>
+ </service>
+ <reference name="attribute.tagger.provider"
+ interface="org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider"
+ bind="addAttributeTaggerProvider"
+ unbind="removeAttributeTaggerProvider"
+ cardinality="0..n"
+ policy="dynamic"/>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine/OSGI-INF/default.attribute.tagger.provider.xml b/org.eclipse.osee.framework.search.engine/OSGI-INF/default.attribute.tagger.provider.xml
new file mode 100644
index 00000000000..b1d28e17a8e
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/OSGI-INF/default.attribute.tagger.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="default.attribute.tagger.provider">
+ <implementation class="org.eclipse.osee.framework.search.engine.tagger.DefaultAttributeTaggerProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.service.xml b/org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.service.xml
new file mode 100644
index 00000000000..e6c310854c2
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.service.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="search.engine.service">
+ <implementation class="org.eclipse.osee.framework.search.engine.internal.SearchEngine"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.search.engine.ISearchEngine"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.tagger.service.xml b/org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.tagger.service.xml
new file mode 100644
index 00000000000..e3e48d0c81c
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/OSGI-INF/search.engine.tagger.service.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="search.engine.tagger.service">
+ <implementation class="org.eclipse.osee.framework.search.engine.internal.SearchEngineTagger"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.search.engine.ISearchEngineTagger"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine/OSGI-INF/xml.attribute.tagger.provider.xml b/org.eclipse.osee.framework.search.engine/OSGI-INF/xml.attribute.tagger.provider.xml
new file mode 100644
index 00000000000..896fafb134b
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/OSGI-INF/xml.attribute.tagger.provider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="xml.attribute.tagger.provider">
+ <implementation class="org.eclipse.osee.framework.search.engine.tagger.XmlAttributeTaggerProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider"/>
+ </service>
+</component> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine/build.properties b/org.eclipse.osee.framework.search.engine/build.properties
new file mode 100644
index 00000000000..d5c5a0485ec
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/,\
+ support/
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProvider.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProvider.java
new file mode 100644
index 00000000000..c3de41eaee2
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProvider.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.framework.search.engine;
+
+import java.util.List;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAttributeTaggerProvider {
+
+ /**
+ * Creates tags for attribute content
+ *
+ * @param attributeData attribute to content to tag
+ * @param collector object collecting tags
+ * @throws Exception
+ */
+ public void tagIt(AttributeData attributeData, ITagCollector collector) throws Exception;
+
+ /**
+ * Searches attribute content for value match
+ *
+ * @param attributeData attribute to search in
+ * @param value to search in attribute content
+ * @param options
+ * @return match location
+ */
+ public List<MatchLocation> find(AttributeData attributeData, String toSearch, SearchOptions options) throws Exception;
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProviderManager.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProviderManager.java
new file mode 100644
index 00000000000..bc951d3bccc
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/IAttributeTaggerProviderManager.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.framework.search.engine;
+
+import java.util.List;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAttributeTaggerProviderManager {
+
+ /**
+ * Add attribute tagger provider
+ *
+ * @param attributeTaggerProvider
+ */
+ public void addAttributeTaggerProvider(IAttributeTaggerProvider attributeTaggerProvider);
+
+ /**
+ * Remove attribute tagger provider
+ *
+ * @param attributeTaggerProvider
+ */
+ public void removeAttributeTaggerProvider(IAttributeTaggerProvider attributeTaggerProvider);
+
+ /**
+ * Creates tags for attribute content
+ *
+ * @param attributeData attribute to content to tag
+ * @param collector object collecting tags
+ * @throws Exception
+ */
+ public void tagIt(AttributeData attributeData, ITagCollector collector) throws Exception;
+
+ /**
+ * Searches attribute content for value match
+ *
+ * @param attributeData attribute to search in
+ * @param value to search in attribute content
+ * @param options
+ * @return match location
+ */
+ public List<MatchLocation> find(AttributeData attributeData, String toSearch, SearchOptions options) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngine.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngine.java
new file mode 100644
index 00000000000..5d1428206db
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngine.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.search.engine;
+
+import org.eclipse.osee.framework.search.engine.internal.SearchStatistics;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ISearchEngine {
+
+ /**
+ * Searches tagged items for matches meeting criteria specified. If branchId is less than 0, search will include all
+ * branches in the system.
+ *
+ * @param searchString
+ * @param branchId
+ * @param options
+ * @param attributeType search filter. When null, all types are searched.
+ * @return search result
+ * @throws Exception
+ */
+ public SearchResult search(String searchString, int branchId, SearchOptions options, String... attributeTypes) throws Exception;
+
+ /**
+ * Get statistics
+ *
+ * @return search statistics
+ */
+ SearchStatistics getStatistics();
+
+ /**
+ * Clear Statistics
+ */
+ void clearStatistics();
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngineTagger.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngineTagger.java
new file mode 100644
index 00000000000..517075e756a
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchEngineTagger.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.framework.search.engine;
+
+import java.io.InputStream;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ISearchEngineTagger {
+
+ /**
+ * Create tags for a particular branch.
+ *
+ * @param branchId of branch to tag
+ * @throws OseeStateException TODO
+ */
+ public void tagByBranchId(int branchId) throws OseeCoreException;
+
+ /**
+ * Create tags for a particular branch. Notifies listener of tagging events.
+ *
+ * @param listener object listening for tag events
+ * @param branchId of branch to tag
+ * @throws OseeStateException TODO
+ */
+ public void tagByBranchId(ITagListener listener, int queryId) throws OseeCoreException;
+
+ /**
+ * Create tags for queue query id.
+ *
+ * @param queryId queryId to tag
+ */
+ public void tagByQueueQueryId(int queryId);
+
+ /**
+ * Create tags for queue query id. Notifies listener of tagging events.
+ *
+ * @param listener object listening for tag events
+ * @param queryId queryId to tag
+ */
+ public void tagByQueueQueryId(ITagListener listener, int queryId);
+
+ /**
+ * Create tags for attributes specified in xml stream. <b>
+ *
+ * <pre>
+ * The XML data is formatted as follows:
+ * &lt;AttributeTag&gt;
+ * &lt;entry gammaId=&quot;90&quot;/&gt;
+ * &lt;entry gammaId=&quot;91&quot;/&gt;
+ * .
+ * .
+ * .
+ * &lt;AttributeTag&gt;
+ * </pre>
+ *
+ * </b>
+ *
+ * @param inputStream xml inputStream
+ */
+ public void tagFromXmlStream(InputStream inputStream) throws Exception;
+
+ /**
+ * Create tags for attributes specified in xml stream. Notifies listener of tagging events. <b>
+ *
+ * <pre>
+ * The XML data is formatted as follows:
+ * &lt;AttributeTag&gt;
+ * &lt;entry gammaId=&quot;90&quot;/&gt;
+ * &lt;entry gammaId=&quot;91&quot;/&gt;
+ * .
+ * .
+ * .
+ * &lt;AttributeTag&gt;
+ * </pre>
+ *
+ * </b>
+ *
+ * @param listener object listening for tag events
+ * @param inputStream xml inputStream
+ */
+ public void tagFromXmlStream(ITagListener listener, InputStream inputStream) throws Exception;
+
+ /**
+ * Stop tagging items by queue query id
+ *
+ * @param queryId
+ * @return number of items stopped
+ */
+ public int stopTaggingByQueueQueryId(int... queryId);
+
+ /**
+ * Stops all tagging
+ *
+ * @return number of items stopped
+ */
+ public int stopAllTagging();
+
+ /**
+ * Delete tags specified by join query id
+ *
+ * @param parseInt
+ */
+ public int deleteTags(int joinQueryId) throws Exception;
+
+ /**
+ * Get number of workers waiting to execute tagging operation
+ *
+ * @return number of workers waiting to tag
+ */
+ public int getWorkersInQueue();
+
+ /**
+ * Get statistics
+ *
+ * @return tagger statistics
+ */
+ public ITaggerStatistics getStatistics();
+
+ /**
+ * Clear Statistics
+ */
+ public void clearStatistics();
+
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchStatistics.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchStatistics.java
new file mode 100644
index 00000000000..6775bccbc59
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ISearchStatistics.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.framework.search.engine;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ISearchStatistics {
+
+ /**
+ * Get average search time in milliseconds
+ *
+ * @return average search time in milliseconds
+ */
+ public long getAverageSearchTime();
+
+ /**
+ * Get total number of searches processed
+ *
+ * @return total number of searches
+ */
+ public int getTotalSearches();
+
+ /**
+ * Get longest search time
+ *
+ * @return longest search time
+ */
+ public long getLongestSearchTime();
+
+ /**
+ * Get longest search information.
+ *
+ * @return search info
+ */
+ public String getLongestSearch();
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagItemStatistics.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagItemStatistics.java
new file mode 100644
index 00000000000..9fbcbb0b048
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagItemStatistics.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.framework.search.engine;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITagItemStatistics {
+
+ public long getGammaId();
+
+ public int getTotalTags();
+
+ public long getProcessingTime();
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagListener.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagListener.java
new file mode 100644
index 00000000000..c659efa8381
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITagListener.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.framework.search.engine;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITagListener {
+
+ public void onTagError(int queryId, Throwable throwable);
+
+ public void onTagExpectedQueryIdSubmits(int totalQueries);
+
+ public void onTagQueryIdSubmit(int queryId);
+
+ public void onAttributeTagComplete(int queryId, long gammaId, int totalTags, long processingTime);
+
+ public void onTagQueryIdTagComplete(int queryId, long waitTime, long processingTime);
+
+ public void onAttributeAddTagEvent(int queryId, long gammaId, String word, long codedTag);
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITaggerStatistics.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITaggerStatistics.java
new file mode 100644
index 00000000000..aed14934e0a
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/ITaggerStatistics.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.search.engine;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITaggerStatistics {
+
+ public long getLongestQueryIdWaitTime();
+
+ public long getLongestQueryIdProcessingTime();
+
+ public long getAverageQueryIdWaitTime();
+
+ public int getTotalQueryIdsProcessed();
+
+ public long getAverageQueryIdProcessingTime();
+
+ public long getAverageAttributeProcessingTime();
+
+ public long getTotalTags();
+
+ public int getTotalAttributesProcessed();
+
+ public long getLongestAttributeProcessingTime();
+
+ public ITagItemStatistics getLongestTask();
+
+ public ITagItemStatistics getMostTagsTask();
+
+ public long getTagsInSystem() throws OseeDataStoreException;
+
+ public long getTotalQueryIdsInQueue() throws OseeDataStoreException;
+
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/MatchLocation.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/MatchLocation.java
new file mode 100644
index 00000000000..2ae534ba69d
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/MatchLocation.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.framework.search.engine;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MatchLocation {
+ private int startPosition;
+ private int endPosition;
+
+ public MatchLocation() {
+ reset();
+ }
+
+ public MatchLocation(int startPosition, int endPosition) {
+ this.startPosition = startPosition;
+ this.endPosition = endPosition;
+ }
+
+ public void reset() {
+ startPosition = 0;
+ endPosition = 0;
+ }
+
+ public String toString() {
+ return String.format("startAt: [%s] endAt: [%s] ", startPosition, endPosition);
+ }
+
+ @Override
+ public MatchLocation clone() {
+ return new MatchLocation(this.startPosition, this.endPosition);
+ }
+
+ /**
+ * @return the startPosition
+ */
+ public int getStartPosition() {
+ return startPosition;
+ }
+
+ /**
+ * @return the endPosition
+ */
+ public int getEndPosition() {
+ return endPosition;
+ }
+
+ /**
+ * @param startPosition the startPosition to set
+ */
+ public void setStartPosition(int startPosition) {
+ this.startPosition = startPosition;
+ }
+
+ /**
+ * @param endPosition the endPosition to set
+ */
+ public void setEndPosition(int endPosition) {
+ this.endPosition = endPosition;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchOptions.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchOptions.java
new file mode 100644
index 00000000000..bf067d16874
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchOptions.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.framework.search.engine;
+
+import java.util.Properties;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchOptions {
+
+ public enum SearchOptionsEnum {
+ include_deleted, match_word_order, as_xml, find_all_locations, case_sensitive;
+
+ public String asStringOption() {
+ return name().replaceAll("_", " ");
+ }
+ }
+
+ private Properties properties;
+
+ public SearchOptions() {
+ this.properties = new Properties();
+ }
+
+ public boolean getBoolean(String key) {
+ return new Boolean(getString(key));
+ }
+
+ public String getString(String key) {
+ return this.properties.getProperty(key, "");
+ }
+
+ public void put(String key, String value) {
+ if (value != null && value.length() > 0) {
+ this.properties.put(key, value);
+ }
+ }
+
+ public void put(String key, boolean value) {
+ this.properties.put(key, Boolean.toString(value));
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return properties.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchResult.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchResult.java
new file mode 100644
index 00000000000..aa403fb210d
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/SearchResult.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchResult {
+
+ private Map<Integer, Map<Integer, ArtifactMatch>> entries;
+ private int size;
+
+ public SearchResult() {
+ this.entries = new HashMap<Integer, Map<Integer, ArtifactMatch>>();
+ size = 0;
+ }
+
+ public void add(int branchId, int artId, long gammaId) {
+ add(branchId, artId, gammaId, null);
+ }
+
+ public void add(int branchId, int artId, long gammaId, List<MatchLocation> matches) {
+ Map<Integer, ArtifactMatch> match = entries.get(branchId);
+ ArtifactMatch artifact = null;
+ if (match == null) {
+ match = new HashMap<Integer, ArtifactMatch>();
+ entries.put(branchId, match);
+ } else {
+ artifact = match.get(artId);
+ }
+
+ if (artifact == null) {
+ artifact = new ArtifactMatch(branchId, artId);
+ match.put(artId, artifact);
+ size++;
+ }
+
+ artifact.addAttribute(gammaId, matches);
+ }
+
+ public Set<Integer> getBranchIds() {
+ return entries.keySet();
+ }
+
+ public Set<Integer> getArtifactIds(int branch) {
+ Map<Integer, ArtifactMatch> toReturn = entries.get(branch);
+ if (toReturn == null) {
+ return Collections.emptySet();
+ }
+ return toReturn.keySet();
+ }
+
+ public Collection<ArtifactMatch> getArtifacts(int branch) {
+ Map<Integer, ArtifactMatch> toReturn = entries.get(branch);
+ if (toReturn == null) {
+ return Collections.emptyList();
+ }
+ return toReturn.values();
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ public class ArtifactMatch {
+ private int artId;
+ private int branchId;
+ private boolean hasMatchLocations;
+ private HashCollection<Long, MatchLocation> attributes;
+
+ public ArtifactMatch(int branchId, int artId) {
+ this.artId = artId;
+ this.branchId = branchId;
+ attributes = new HashCollection<Long, MatchLocation>();
+ hasMatchLocations = false;
+ }
+
+ private void addAttribute(long gammaId, Collection<MatchLocation> matches) {
+ if (matches != null && !matches.isEmpty()) {
+ hasMatchLocations = true;
+ }
+ if (matches == null) {
+ matches = Collections.emptyList();
+ }
+ attributes.put(gammaId, matches);
+ }
+
+ public Set<Long> getAttributes() {
+ return attributes.keySet();
+ }
+
+ public Collection<MatchLocation> getMatchLocations(long gammaId) {
+ return attributes.getValues(gammaId);
+ }
+
+ public boolean hasMatchLocations() {
+ return hasMatchLocations;
+ }
+
+ public int getArtId() {
+ return artId;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/TagListenerAdapter.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/TagListenerAdapter.java
new file mode 100644
index 00000000000..7bbe0f47a0f
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/TagListenerAdapter.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.framework.search.engine;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TagListenerAdapter implements ITagListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onAttributeAddTagEvent(int, long, java.lang.String, long)
+ */
+ @Override
+ public void onAttributeAddTagEvent(int queryId, long gammaId, String word, long codedTag) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onAttributeTagComplete(int, long, int, long)
+ */
+ @Override
+ public void onAttributeTagComplete(int queryId, long gammaId, int totalTags, long processingTime) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagQueryIdSubmit(int)
+ */
+ @Override
+ public void onTagQueryIdSubmit(int queryId) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagQueryIdTagComplete(int, long, long)
+ */
+ @Override
+ public void onTagQueryIdTagComplete(int queryId, long waitTime, long processingTime) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagExpectedQueryIdSubmits(int)
+ */
+ @Override
+ public void onTagExpectedQueryIdSubmits(int totalQueries) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagError(int, java.lang.Throwable)
+ */
+ @Override
+ public void onTagError(int queryId, Throwable throwable) {
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeData.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeData.java
new file mode 100644
index 00000000000..d55274ae246
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeData.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.attribute;
+
+import java.net.URI;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.search.engine.data.IAttributeLocator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeData implements IAttributeLocator {
+ private final static String EMPTY_STRING = "";
+ private int artId;
+ private long gammaId;
+ private int branchId;
+ private String value;
+ private String uri;
+ private String taggerId;
+
+ protected AttributeData(int artId, long gammaId, int branchId, String value, String uri, String taggerId) {
+ super();
+ this.artId = artId;
+ this.gammaId = gammaId;
+ this.branchId = branchId;
+ this.value = Strings.isValid(value) ? value : EMPTY_STRING;
+ this.uri = Strings.isValid(uri) ? uri : EMPTY_STRING;
+ this.taggerId = Strings.isValid(taggerId) ? taggerId : EMPTY_STRING;
+ }
+
+ protected AttributeData(long gammaId, String value, String uri, String taggerId) {
+ this(-1, gammaId, -1, value, uri, taggerId);
+ }
+
+ public int getArtId() {
+ return artId;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ public long getGammaId() {
+ return gammaId;
+ }
+
+ public String getTaggerId() {
+ return taggerId;
+ }
+
+ public String getStringValue() {
+ return this.value;
+ }
+
+ public String getUri() {
+ return this.uri;
+ }
+
+ public boolean isUriValid() {
+ boolean toReturn = false;
+ try {
+ String value = getUri();
+ if (Strings.isValid(value)) {
+ URI uri = new URI(value);
+ if (uri != null) {
+ toReturn = true;
+ }
+ }
+ } catch (Exception ex) {
+ // DO NOTHING
+ }
+ return toReturn;
+ }
+
+ public String toString() {
+ return String.format("artId:[%s] branchId:[%d] gammaId:[%s] uri:[%s] taggerId:[%s]", getArtId(), getBranchId(),
+ getGammaId(), getUri(), getTaggerId());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) return true;
+ if (!(object instanceof AttributeData)) return false;
+ AttributeData other = (AttributeData) object;
+ return other.getGammaId() == this.getGammaId();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (int) (gammaId * 37);
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeDataStore.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeDataStore.java
new file mode 100644
index 00000000000..2bd38aaea7f
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/attribute/AttributeDataStore.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.attribute;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.AttributeJoinQuery;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.SearchOptions.SearchOptionsEnum;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeDataStore {
+
+ private static final String LOAD_ATTRIBUTE =
+ "SELECT attr1.gamma_id, attr1.VALUE, attr1.uri, attrtype.tagger_id FROM osee_attribute attr1, osee_attribute_type attrtype, osee_tag_gamma_queue tgq1 WHERE attrtype.attr_type_id = attr1.attr_type_id AND attr1.gamma_id = tgq1.gamma_id AND tgq1.query_id = ?";
+
+ private static final String RESTRICT_BRANCH = " AND txd1.branch_id = ?";
+
+ private static final String GET_TAGGABLE_SQL_BODY =
+ " FROM osee_attribute attr1, osee_attribute_type type1, osee_txs txs1, osee_tx_details txd1, osee_branch br1 WHERE txs1.transaction_id = txd1.transaction_id AND txs1.gamma_id = attr1.gamma_id AND txd1.branch_id = br1.branch_id AND br1.archived <> 1 AND attr1.attr_type_id = type1.attr_type_id AND type1.tagger_id IS NOT NULL";
+
+ private static final String FIND_ALL_TAGGABLE_ATTRIBUTES = "SELECT DISTINCT attr1.gamma_id" + GET_TAGGABLE_SQL_BODY;
+ private static final String COUNT_TAGGABLE_ATTRIBUTES =
+ "SELECT count(DISTINCT attr1.gamma_id)" + GET_TAGGABLE_SQL_BODY;
+
+ private static final String POSTGRESQL_CHECK = " AND type1.tagger_id <> ''";
+ private static final String RESTRICT_BY_BRANCH = " AND txd1.branch_id = ?";
+
+ private static final CompositeKeyHashMap<Integer, Boolean, String> queryCache =
+ new CompositeKeyHashMap<Integer, Boolean, String>();
+
+ private AttributeDataStore() {
+ }
+
+ public static Collection<AttributeData> getAttribute(final OseeConnection connection, final int tagQueueQueryId) throws OseeDataStoreException {
+ final Collection<AttributeData> attributeData = new ArrayList<AttributeData>();
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(LOAD_ATTRIBUTE, tagQueueQueryId);
+ while (chStmt.next()) {
+ attributeData.add(new AttributeData(chStmt.getLong("gamma_id"), chStmt.getString("value"),
+ chStmt.getString("uri"), chStmt.getString("tagger_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ return attributeData;
+ }
+
+ private static String getAttributeTagQuery(int numberOfTags, boolean isAttributeFilterValid) {
+ String query = queryCache.get(numberOfTags, isAttributeFilterValid);
+ if (query == null) {
+ StringBuilder codedTag = new StringBuilder();
+ codedTag.append("SELECT /*+ ordered FIRST_ROWS */ attr1.art_id, attr1.gamma_id, attr1.VALUE, attr1.uri, attrtype.tagger_id, txd1.branch_id FROM \n");
+ for (int index = 0; index < numberOfTags; index++) {
+ codedTag.append(String.format("osee_search_tags ost%d, \n", index));
+ }
+ if (isAttributeFilterValid) {
+ codedTag.append(" osee_join_attribute oja,");
+ }
+ codedTag.append(" osee_attribute attr1, osee_txs txs1, osee_tx_details txd1, osee_attribute_type attrtype WHERE \n");
+
+ for (int index = 0; index < numberOfTags; index++) {
+ codedTag.append(String.format("ost%d.coded_tag_id = ? and\n", index));
+ }
+ for (int index = 1; index < numberOfTags; index++) {
+ codedTag.append(String.format("ost%d.gamma_id = ost%d.gamma_id and \n", index - 1, index));
+ }
+ codedTag.append(String.format(
+ "ost%d.gamma_id = attr1.gamma_id and\n attr1.gamma_id = txs1.gamma_id \nand txs1.transaction_id = txd1.transaction_id \nand attr1.attr_type_id = attrtype.attr_type_id ",
+ numberOfTags - 1));
+
+ if (isAttributeFilterValid) {
+ codedTag.append(" and attrtype.name = oja.value and oja.attr_query_id = ? ");
+ }
+ query = codedTag.toString();
+ queryCache.put(numberOfTags, isAttributeFilterValid, query);
+ }
+ return query;
+ }
+
+ private static String getQuery(final String baseQuery, final int branchId, final SearchOptions options) {
+ StringBuilder toReturn = new StringBuilder(baseQuery);
+ if (branchId > -1) {
+ toReturn.append(RESTRICT_BRANCH);
+ }
+ // txs1 is for attributes, txs2 is for artifact
+ if (options.getBoolean(SearchOptionsEnum.include_deleted.asStringOption())) {
+ toReturn.append(" AND txs1.tx_current IN (1,3)");
+ } else {
+ toReturn.append(" AND txs1.tx_current = 1");
+ }
+ return toReturn.toString();
+ }
+
+ public static void main(String[] args) {
+ for (int index = 1; index < 13; index++) {
+ System.out.println("\n------------------------------------------------------------");
+ System.out.println(getQuery(getAttributeTagQuery(index, false), 2, new SearchOptions()));
+ System.out.println("\n------------------------------------------------------------");
+ System.out.println(getQuery(getAttributeTagQuery(index, true), 2, new SearchOptions()));
+ }
+
+ for (int index = 1; index < 13; index++) {
+ System.out.println("\n------------------------------------------------------------");
+ System.out.println(getQuery(getAttributeTagQuery(index, false), 2, new SearchOptions()));
+ System.out.println("\n------------------------------------------------------------");
+ System.out.println(getQuery(getAttributeTagQuery(index, true), 2, new SearchOptions()));
+ }
+ }
+
+ public static Set<AttributeData> getAttributesByTags(final int branchId, final SearchOptions options, final Collection<Long> tagData, final Collection<String> attributeTypes) throws OseeDataStoreException {
+ final Set<AttributeData> toReturn = new HashSet<AttributeData>();
+ AttributeJoinQuery attributeJoin = null;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ boolean isNameOnly = attributeTypes.size() == 1 && attributeTypes.contains("Name");
+ boolean isAttributeFilterValid = !isNameOnly && !attributeTypes.isEmpty();
+
+ String sqlQuery = getQuery(getAttributeTagQuery(tagData.size(), isAttributeFilterValid), branchId, options);
+ List<Object> params = new ArrayList<Object>();
+ params.addAll(tagData);
+ if (isNameOnly) {
+ sqlQuery = sqlQuery + " and attrtype.name = 'Name'";
+ } else if (isAttributeFilterValid) {
+ attributeJoin = JoinUtility.createAttributeJoinQuery();
+ for (String value : attributeTypes) {
+ attributeJoin.add(value);
+ }
+ attributeJoin.store();
+ params.add(attributeJoin.getQueryId());
+ }
+
+ if (branchId > -1) {
+ params.add(branchId);
+ }
+
+ chStmt.runPreparedQuery(sqlQuery, params.toArray(new Object[params.size()]));
+ while (chStmt.next()) {
+ toReturn.add(new AttributeData(chStmt.getInt("art_id"), chStmt.getLong("gamma_id"),
+ chStmt.getInt("branch_id"), chStmt.getString("value"), chStmt.getString("uri"),
+ chStmt.getString("tagger_id")));
+ }
+ } finally {
+ chStmt.close();
+ if (attributeJoin != null) {
+ attributeJoin.delete();
+ }
+ }
+
+ return toReturn;
+ }
+
+ public static String getAllTaggableGammasByBranchQuery(final int branchId) throws OseeDataStoreException {
+ return getBranchTaggingQueries(branchId, false);
+ }
+
+ public static Object[] getAllTaggableGammasByBranchQueryData(final int branchId) {
+ return branchId > -1 ? new Object[] {branchId} : new Object[0];
+ }
+
+ private static String getBranchTaggingQueries(final int branchId, final boolean isCountQuery) throws OseeDataStoreException {
+ StringBuilder builder = new StringBuilder();
+ builder.append(isCountQuery ? COUNT_TAGGABLE_ATTRIBUTES : FIND_ALL_TAGGABLE_ATTRIBUTES);
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.postgresql)) {
+ builder.append(POSTGRESQL_CHECK);
+ }
+
+ if (branchId > -1) {
+ builder.append(RESTRICT_BY_BRANCH);
+ }
+ return builder.toString();
+ }
+
+ public static int getTotalTaggableItems(OseeConnection connection, final int branchId) throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchInt(connection, -1, getBranchTaggingQueries(branchId, true),
+ getAllTaggableGammasByBranchQueryData(branchId));
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeSearch.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeSearch.java
new file mode 100644
index 00000000000..4fc5d6224d8
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeSearch.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.framework.search.engine.data;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeDataStore;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+import org.eclipse.osee.framework.search.engine.utility.TagProcessor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class AttributeSearch implements ITagCollector {
+ private final String searchString;
+ private final int branchId;
+ private final SearchOptions options;
+ private final Set<Long> tagStore;
+ private final Set<String> attributeTypes;
+
+ public AttributeSearch(String searchString, int branchId, SearchOptions options, String... attributeTypes) {
+ this.tagStore = new HashSet<Long>();
+ this.branchId = branchId;
+ this.searchString = searchString;
+ this.options = options;
+ this.attributeTypes = new HashSet<String>();
+ if (attributeTypes != null) {
+ for (String value : attributeTypes) {
+ this.attributeTypes.add(value);
+ }
+ }
+ }
+
+ public Set<AttributeData> getMatchingAttributes() throws Exception {
+ Set<AttributeData> toReturn = null;
+ long start = System.currentTimeMillis();
+ TagProcessor.collectFromString(searchString, this);
+ toReturn = AttributeDataStore.getAttributesByTags(branchId, options, tagStore, attributeTypes);
+ if (toReturn == null) {
+ toReturn = Collections.emptySet();
+ }
+ OseeLog.log(AttributeSearch.class, Level.INFO, String.format("Attribute Search Query found [%d] in [%d] ms",
+ toReturn.size(), System.currentTimeMillis() - start));
+ return toReturn;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.search.engine.utility.ITagCollector#addTag(java.lang.String,
+ * java.lang.Long)
+ */
+ @Override
+ public void addTag(String word, Long codedTag) {
+ this.tagStore.add(codedTag);
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeVersion.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeVersion.java
new file mode 100644
index 00000000000..a2653afa139
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/AttributeVersion.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.framework.search.engine.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeVersion implements IAttributeLocator {
+ private long gammaId;
+
+ public AttributeVersion(long gammaId) {
+ super();
+ this.gammaId = gammaId;
+ }
+
+ public long getGammaId() {
+ return gammaId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) return true;
+ if (!(object instanceof IAttributeLocator)) return false;
+ IAttributeLocator other = (IAttributeLocator) object;
+ return other.getGammaId() == this.getGammaId();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (int) (37 * getGammaId());
+ }
+
+ public String toString() {
+ return String.format("gammaId: [%d]", getGammaId());
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/IAttributeLocator.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/IAttributeLocator.java
new file mode 100644
index 00000000000..77924922e6c
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/IAttributeLocator.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.framework.search.engine.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAttributeLocator {
+
+ public long getGammaId();
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/SearchTag.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/SearchTag.java
new file mode 100644
index 00000000000..f9a14234e8f
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/data/SearchTag.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.data;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchTag implements IAttributeLocator {
+
+ private AttributeVersion attributeVersion;
+ private Set<Long> codedTags;
+ private int runningTotal;
+
+ public SearchTag(long gammaId) {
+ this.attributeVersion = new AttributeVersion(gammaId);
+ this.codedTags = new HashSet<Long>();
+ this.runningTotal = 0;
+ }
+
+ public void addTag(long codedTag) {
+ if (this.codedTags.add(codedTag)) {
+ runningTotal++;
+ }
+ }
+
+ public int getTotalTags() {
+ return runningTotal;
+ }
+
+ public int cacheSize() {
+ return this.codedTags.size();
+ }
+
+ public void clearCache() {
+ this.codedTags.clear();
+ }
+
+ public long getGammaId() {
+ return attributeVersion.getGammaId();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object object) {
+ if (this == object) return true;
+ if (!(object instanceof SearchTag)) return false;
+ SearchTag other = (SearchTag) object;
+ return other.getGammaId() == this.getGammaId();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return attributeVersion.hashCode();
+ }
+
+ public Set<Long> getTags() {
+ return this.codedTags;
+ }
+
+ public String toString() {
+ return String.format("%s with %d tags cached - total [%d]", attributeVersion.toString(), cacheSize(),
+ getTotalTags());
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/Activator.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/Activator.java
new file mode 100644
index 00000000000..bf3e11daaff
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/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.framework.search.engine.internal;
+
+import java.net.URL;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.search.engine.IAttributeTaggerProviderManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+
+ private static Activator instance;
+
+ private ServiceTracker attributeTaggerProviderTracker;
+ private ServiceTracker resourceManagementTracker;
+ private ServiceTracker resourceLocatorManagerTracker;
+ private BundleContext context;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ this.context = context;
+
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+
+ attributeTaggerProviderTracker =
+ new ServiceTracker(context, IAttributeTaggerProviderManager.class.getName(), null);
+ attributeTaggerProviderTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ attributeTaggerProviderTracker.close();
+ attributeTaggerProviderTracker = null;
+
+ resourceManagementTracker.close();
+ resourceManagementTracker = null;
+
+ resourceLocatorManagerTracker.close();
+ resourceLocatorManagerTracker = null;
+
+ instance = null;
+ context = null;
+ }
+
+ public static IResourceManager getResourceManager() {
+ return (IResourceManager) instance.resourceManagementTracker.getService();
+ }
+
+ public static IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) instance.resourceLocatorManagerTracker.getService();
+ }
+
+ public static IAttributeTaggerProviderManager getTaggerManager() {
+ return (IAttributeTaggerProviderManager) instance.attributeTaggerProviderTracker.getService();
+ }
+
+ public static URL getResource(String path) {
+ return instance.context.getBundle().getResource(path);
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/AttributeTaggerProviderManager.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/AttributeTaggerProviderManager.java
new file mode 100644
index 00000000000..3145b6cc6d2
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/AttributeTaggerProviderManager.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.framework.search.engine.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.exception.InvalidTaggerException;
+import org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider;
+import org.eclipse.osee.framework.search.engine.IAttributeTaggerProviderManager;
+import org.eclipse.osee.framework.search.engine.MatchLocation;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeTaggerProviderManager implements IAttributeTaggerProviderManager {
+
+ private Map<String, IAttributeTaggerProvider> attributeTaggerProviders;
+
+ public AttributeTaggerProviderManager() {
+ this.attributeTaggerProviders = Collections.synchronizedMap(new HashMap<String, IAttributeTaggerProvider>());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.IAttributeTaggerProviderManager#addAttributeTaggerProvider(org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider)
+ */
+ @Override
+ public void addAttributeTaggerProvider(IAttributeTaggerProvider attributeTaggerProvider) {
+ synchronized (this.attributeTaggerProviders) {
+ this.attributeTaggerProviders.put(attributeTaggerProvider.getClass().getSimpleName(), attributeTaggerProvider);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.IAttributeTaggerProviderManager#removeAttributeTaggerProvider(org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider)
+ */
+ @Override
+ public void removeAttributeTaggerProvider(IAttributeTaggerProvider attributeTaggerProvider) {
+ synchronized (this.attributeTaggerProviders) {
+ this.attributeTaggerProviders.remove(attributeTaggerProvider);
+ }
+ }
+
+ private IAttributeTaggerProvider getProvider(String taggerId) throws InvalidTaggerException {
+ IAttributeTaggerProvider toReturn = this.attributeTaggerProviders.get(taggerId);
+ if (toReturn == null) {
+ throw new InvalidTaggerException();
+ }
+ return toReturn;
+ }
+
+ public void tagIt(AttributeData attributeData, ITagCollector collector) throws Exception {
+ IAttributeTaggerProvider provider = getProvider(attributeData.getTaggerId());
+ provider.tagIt(attributeData, collector);
+ }
+
+ @Override
+ public List<MatchLocation> find(AttributeData attributeData, String toSearch, SearchOptions options) throws Exception {
+ IAttributeTaggerProvider provider = getProvider(attributeData.getTaggerId());
+ return provider.find(attributeData, toSearch, options);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/BranchTaggerRunnable.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/BranchTaggerRunnable.java
new file mode 100644
index 00000000000..cd850018845
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/BranchTaggerRunnable.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.framework.search.engine.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.eclipse.osee.framework.search.engine.ITagListener;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeDataStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchTaggerRunnable implements Runnable {
+
+ private final int branchId;
+ private final BranchToQueryTx branchToQueryTx;
+
+ BranchTaggerRunnable(ISearchEngineTagger tagger, ITagListener listener, int branchId, boolean isCacheAll, int cacheLimit) throws OseeCoreException {
+ this.branchToQueryTx = new BranchToQueryTx(tagger, listener, isCacheAll, cacheLimit);
+ this.branchId = branchId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ branchToQueryTx.execute();
+ } catch (Exception ex) {
+ OseeLog.log(BranchTaggerRunnable.class, Level.SEVERE, ex);
+ }
+ }
+
+ private final class BranchToQueryTx extends InputToTagQueueTx {
+ public BranchToQueryTx(ISearchEngineTagger tagger, ITagListener listener, boolean isCacheAll, int cacheLimit) throws OseeCoreException {
+ super(tagger, listener, isCacheAll, cacheLimit);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.internal.ConvertToTagQueueTx#doWork(java.sql.Connection)
+ */
+ @Override
+ protected void convertInput(OseeConnection connection) throws OseeDataStoreException, Exception {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ String sql = AttributeDataStore.getAllTaggableGammasByBranchQuery(branchId);
+ chStmt.runPreparedQuery(sql, AttributeDataStore.getAllTaggableGammasByBranchQueryData(branchId));
+ while (chStmt.next()) {
+ addEntry(connection, chStmt.getLong("gamma_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputStreamTagProcessor.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputStreamTagProcessor.java
new file mode 100644
index 00000000000..e11d7165268
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputStreamTagProcessor.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.framework.search.engine.internal;
+
+import java.io.InputStream;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.eclipse.osee.framework.search.engine.ITagListener;
+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;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class InputStreamTagProcessor extends InputToTagQueueTx {
+ private final InputStream inputStream;
+
+ InputStreamTagProcessor(ISearchEngineTagger tagger, ITagListener listener, InputStream inputStream, boolean isCacheAll, int cacheLimit) throws OseeCoreException {
+ super(tagger, listener, isCacheAll, cacheLimit);
+ this.inputStream = inputStream;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.internal.ConvertToTagQueueTx#doWork(java.sql.OseeConnection)
+ */
+ @Override
+ protected void convertInput(OseeConnection connection) throws Exception {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(new AttributeXmlParser(connection));
+ xmlReader.parse(new InputSource(inputStream));
+ }
+
+ private final class AttributeXmlParser extends AbstractSaxHandler {
+ private final OseeConnection connection;
+
+ AttributeXmlParser(OseeConnection connection) {
+ this.connection = connection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ if (name.equalsIgnoreCase("entry")) {
+ String gammaId = attributes.getValue("gammaId");
+ if (Strings.isValid(gammaId)) {
+ try {
+ addEntry(connection, Long.parseLong(gammaId));
+ } catch (Exception ex) {
+ throw new RuntimeException("Error Processing Attribute Xml - ", ex);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputToTagQueueTx.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputToTagQueueTx.java
new file mode 100644
index 00000000000..2052b810ad6
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/InputToTagQueueTx.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.framework.search.engine.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.TagQueueJoinQuery;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.eclipse.osee.framework.search.engine.ITagListener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class InputToTagQueueTx extends DbTransaction {
+
+ private final ITagListener listener;
+ private final int cacheLimit;
+ private final boolean isCacheAll;
+ private final List<Integer> queryIds;
+ private final ISearchEngineTagger tagger;
+ private TagQueueJoinQuery currentJoinQuery;
+ private boolean isOkToDispatch;
+
+ InputToTagQueueTx(ISearchEngineTagger tagger, ITagListener listener, boolean isCacheAll, int cacheLimit) throws OseeCoreException {
+ this.tagger = tagger;
+ this.listener = listener;
+ this.cacheLimit = cacheLimit;
+ this.isCacheAll = isCacheAll;
+ this.queryIds = new ArrayList<Integer>();
+ this.isOkToDispatch = false;
+ this.currentJoinQuery = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxWork(java.sql.OseeConnection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ try {
+ convertInput(connection);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ storeQueryIds(connection);
+ if (listener != null) {
+ listener.onTagExpectedQueryIdSubmits(this.queryIds.size());
+ }
+ this.isOkToDispatch = true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxException(java.lang.Exception)
+ */
+ @Override
+ protected void handleTxException(Exception ex) {
+ this.isOkToDispatch = false;
+ if (listener != null) {
+ if (queryIds.isEmpty()) {
+ listener.onTagError(-2, ex);
+ } else {
+ for (Integer queryId : queryIds) {
+ listener.onTagError(queryId, ex);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxFinally()
+ */
+ @Override
+ protected void handleTxFinally() throws OseeCoreException {
+ super.handleTxFinally();
+ if (this.isOkToDispatch) {
+ for (int queryId : queryIds) {
+ tagger.tagByQueueQueryId(listener, queryId);
+ }
+ }
+ }
+
+ protected void addEntry(OseeConnection connection, long gammaId) throws OseeDataStoreException {
+ if (currentJoinQuery == null) {
+ currentJoinQuery = JoinUtility.createTagQueueJoinQuery();
+ }
+ currentJoinQuery.add(gammaId);
+ if (isStorageNeeded()) {
+ storeQueryIds(connection);
+ }
+ }
+
+ private boolean isStorageNeeded() {
+ return this.isCacheAll != true && this.currentJoinQuery != null && this.currentJoinQuery.size() > this.cacheLimit;
+ }
+
+ private void storeQueryIds(OseeConnection connection) throws OseeDataStoreException {
+ if (currentJoinQuery != null && !currentJoinQuery.isEmpty()) {
+ currentJoinQuery.store(connection);
+ queryIds.add(currentJoinQuery.getQueryId());
+ }
+ currentJoinQuery = null;
+ }
+
+ abstract protected void convertInput(OseeConnection connection) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngine.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngine.java
new file mode 100644
index 00000000000..59aef6b8035
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngine.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.framework.search.engine.internal;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.IAttributeTaggerProviderManager;
+import org.eclipse.osee.framework.search.engine.ISearchEngine;
+import org.eclipse.osee.framework.search.engine.MatchLocation;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.SearchResult;
+import org.eclipse.osee.framework.search.engine.SearchOptions.SearchOptionsEnum;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.data.AttributeSearch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchEngine implements ISearchEngine {
+
+ private SearchStatistics statistics;
+
+ public SearchEngine() {
+ this.statistics = new SearchStatistics();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngine#search(java.lang.String, org.eclipse.osee.framework.search.engine.Options)
+ */
+ @Override
+ public SearchResult search(String searchString, int branchId, SearchOptions options, String... attributeTypes) throws Exception {
+ SearchResult results = new SearchResult();
+
+ long startTime = System.currentTimeMillis();
+
+ IAttributeTaggerProviderManager manager = Activator.getTaggerManager();
+ AttributeSearch attributeSearch = new AttributeSearch(searchString, branchId, options, attributeTypes);
+ Collection<AttributeData> tagMatches = attributeSearch.getMatchingAttributes();
+ long timeAfterPass1 = System.currentTimeMillis() - startTime;
+ long secondPass = System.currentTimeMillis();
+
+ boolean bypassSecondPass = !options.getBoolean(SearchOptionsEnum.match_word_order.asStringOption());
+ if (bypassSecondPass) {
+ for (AttributeData attributeData : tagMatches) {
+ results.add(attributeData.getBranchId(), attributeData.getArtId(), attributeData.getGammaId());
+ }
+ } else {
+ for (AttributeData attributeData : tagMatches) {
+ try {
+ List<MatchLocation> locations = manager.find(attributeData, searchString, options);
+ if (!locations.isEmpty()) {
+ results.add(attributeData.getBranchId(), attributeData.getArtId(), attributeData.getGammaId(),
+ locations);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Error processing: [%s]", attributeData));
+ }
+ }
+ }
+ secondPass = System.currentTimeMillis() - secondPass;
+
+ String firstPassMsg =
+ String.format("Pass 1: [%d items in %d ms]);", bypassSecondPass ? results.size() : tagMatches.size(),
+ timeAfterPass1);
+ String secondPassMsg = String.format(" Pass 2: [%d items in %d ms]", results.size(), secondPass);
+
+ System.out.println(String.format("Search for [%s] - %s%s", searchString, firstPassMsg,
+ bypassSecondPass ? "" : secondPassMsg));
+ statistics.addEntry(searchString, branchId, options, results.size(), System.currentTimeMillis() - startTime);
+ return results;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngine#clearStatistics()
+ */
+ @Override
+ public void clearStatistics() {
+ this.statistics.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngine#getStatistics()
+ */
+ @Override
+ public SearchStatistics getStatistics() {
+ try {
+ return this.statistics.clone();
+ } catch (CloneNotSupportedException ex) {
+ return SearchStatistics.EMPTY_STATS;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngineTagger.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngineTagger.java
new file mode 100644
index 00000000000..283dee61118
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchEngineTagger.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.internal;
+
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Timer;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.FutureTask;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.eclipse.osee.framework.search.engine.ITagListener;
+import org.eclipse.osee.framework.search.engine.ITaggerStatistics;
+import org.eclipse.osee.framework.search.engine.utility.SearchTagDataStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public final class SearchEngineTagger implements ISearchEngineTagger {
+ private static final int CACHE_LIMIT = 1000;
+ private ExecutorService executor;
+ private Map<Integer, FutureTask<?>> futureTasks;
+ private TaggerStatistics statistics;
+
+ public SearchEngineTagger() {
+ this.statistics = new TaggerStatistics();
+ this.futureTasks = Collections.synchronizedMap(new HashMap<Integer, FutureTask<?>>());
+ this.executor = Executors.newFixedThreadPool(3, CoreServerActivator.createNewThreadFactory("tagger.worker"));
+
+ Timer timer = new Timer("Start-Up Tagger");
+ timer.schedule(new StartUpRunnable(this), 3000);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#deleteTags(int)
+ */
+ @Override
+ public int deleteTags(int joinQueryId) throws Exception {
+ DeleteTagsTx deleteTransaction = new DeleteTagsTx(joinQueryId);
+ deleteTransaction.execute();
+ return deleteTransaction.rowsDeleted();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#tagByQueueQueryId(int)
+ */
+ @Override
+ public void tagByQueueQueryId(int queryId) {
+ tagByQueueQueryId(null, queryId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#tagByQueueQueryId(org.eclipse.osee.framework.search.engine.ITagListener, int)
+ */
+ @Override
+ public void tagByQueueQueryId(ITagListener listener, int queryId) {
+ TaggerRunnable runnable = new TaggerRunnable(queryId, false, CACHE_LIMIT);
+ runnable.addListener(statistics);
+ if (listener != null) {
+ runnable.addListener(listener);
+ listener.onTagQueryIdSubmit(queryId);
+ }
+ FutureTask<Object> futureTask = new FutureTaggingTask(runnable);
+ this.futureTasks.put(queryId, futureTask);
+ this.executor.submit(futureTask);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#tagByBranchId(org.eclipse.osee.framework.search.engine.ITagListener, int)
+ */
+ @Override
+ public void tagByBranchId(ITagListener listener, int branchId) throws OseeCoreException {
+ this.executor.submit(new BranchTaggerRunnable(this, listener, branchId, false, CACHE_LIMIT));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#tagByBranchId(int)
+ */
+ @Override
+ public void tagByBranchId(int branchId) throws OseeCoreException {
+ tagByBranchId(null, branchId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#tagFromXmlStream(org.eclipse.osee.framework.search.engine.ITagListener, java.io.InputStream)
+ */
+ @Override
+ public void tagFromXmlStream(ITagListener listener, InputStream inputStream) throws Exception {
+ InputStreamTagProcessor inputStreamTagProcessor =
+ new InputStreamTagProcessor(this, listener, inputStream, false, CACHE_LIMIT);
+ inputStreamTagProcessor.execute();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#tagFromXmlStream(java.io.InputStream)
+ */
+ @Override
+ public void tagFromXmlStream(InputStream inputStream) throws Exception {
+ tagFromXmlStream(null, inputStream);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#getWorkersInQueue()
+ */
+ @Override
+ public int getWorkersInQueue() {
+ return futureTasks.size();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#clearStatistics()
+ */
+ @Override
+ public void clearStatistics() {
+ this.statistics.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#getStatistics()
+ */
+ @Override
+ public ITaggerStatistics getStatistics() {
+ try {
+ return this.statistics.clone();
+ } catch (CloneNotSupportedException ex) {
+ return TaggerStatistics.EMPTY_STATS;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#stopTaggingQueryId(int...)
+ */
+ @Override
+ public int stopTaggingByQueueQueryId(int... queryId) {
+ int toReturn = 0;
+ for (int item : queryId) {
+ FutureTask<?> task = futureTasks.get(item);
+ if (task != null) {
+ if (task.isDone()) {
+ toReturn++;
+ } else {
+ if (task.cancel(true)) {
+ toReturn++;
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ISearchEngineTagger#stopAllTagging()
+ */
+ @Override
+ public int stopAllTagging() {
+ int index = 0;
+ Set<Integer> list = futureTasks.keySet();
+ int[] toProcess = new int[list.size()];
+ for (Integer item : list) {
+ toProcess[index] = item;
+ index++;
+ }
+ return stopTaggingByQueueQueryId(toProcess);
+ }
+
+ private final class FutureTaggingTask extends FutureTask<Object> {
+ private TaggerRunnable runnable;
+
+ public FutureTaggingTask(TaggerRunnable runnable) {
+ super(runnable, null);
+ this.runnable = runnable;
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.FutureTask#done()
+ */
+ @Override
+ protected void done() {
+ futureTasks.remove(runnable.getTagQueueQueryId());
+ }
+ }
+
+ private final class DeleteTagsTx extends DbTransaction {
+
+ private final int queryId;
+ private int updated;
+
+ public DeleteTagsTx(int queryId) throws OseeCoreException {
+ super();
+ this.queryId = queryId;
+ this.updated = -1;
+ }
+
+ public int rowsDeleted() {
+ return updated;
+ }
+
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ this.updated = SearchTagDataStore.deleteTags(connection, queryId);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchStatistics.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchStatistics.java
new file mode 100644
index 00000000000..829b5271e3d
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/SearchStatistics.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.framework.search.engine.internal;
+
+import org.eclipse.osee.framework.search.engine.ISearchStatistics;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchStatistics implements Cloneable, ISearchStatistics {
+ public static final SearchStatistics EMPTY_STATS = new SearchStatistics();
+ private static final String EMPTY_STRING = "";
+ private long averageProcessingTime;
+ private int totalProcessed;
+ private long totalProcessingTime;
+ private long longestProcessingTime;
+ private String longestQuery;
+
+ public SearchStatistics() {
+ clear();
+ }
+
+ public void clear() {
+ this.averageProcessingTime = 0;
+ this.totalProcessed = 0;
+ this.totalProcessingTime = 0;
+ this.longestProcessingTime = 0;
+ this.longestQuery = EMPTY_STRING;
+ }
+
+ public long getAverageSearchTime() {
+ return averageProcessingTime;
+ }
+
+ public int getTotalSearches() {
+ return totalProcessed;
+ }
+
+ public long getLongestSearchTime() {
+ return longestProcessingTime;
+ }
+
+ public String getLongestSearch() {
+ return longestQuery;
+ }
+
+ public void addEntry(String queryString, int branchId, SearchOptions options, int found, long processingTime) {
+ this.totalProcessed++;
+ this.totalProcessingTime += processingTime;
+ this.averageProcessingTime = totalProcessingTime / this.totalProcessed;
+
+ if (processingTime > this.longestProcessingTime) {
+ this.longestQuery =
+ String.format("Query:[%s] BranchId:[%d] Options:[%s] Found:[%d in %d ms]", queryString, branchId,
+ options.toString(), found, processingTime);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#clone()
+ */
+ @Override
+ protected SearchStatistics clone() throws CloneNotSupportedException {
+ SearchStatistics other = (SearchStatistics) super.clone();
+ other.averageProcessingTime = this.averageProcessingTime;
+ other.totalProcessed = this.totalProcessed;
+ other.totalProcessingTime = this.totalProcessingTime;
+ other.longestProcessingTime = this.longestProcessingTime;
+ other.longestQuery = this.longestQuery;
+ return other;
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/StartUpRunnable.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/StartUpRunnable.java
new file mode 100644
index 00000000000..f33171d56af
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/StartUpRunnable.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.framework.search.engine.internal;
+
+import java.util.List;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.server.OseeServerProperties;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class StartUpRunnable extends TimerTask {
+ private ISearchEngineTagger tagger;
+
+ StartUpRunnable(ISearchEngineTagger tagger) {
+ this.tagger = tagger;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ if (OseeServerProperties.isCheckTagQueueOnStartupAllowed()) {
+ List<Integer> queries = JoinUtility.getAllTagQueueQueryIds();
+ OseeLog.log(SearchEngineTagger.class, Level.INFO, String.format(
+ "On Start-Up Tagging - [%d] tag queue items.", queries.size()));
+ for (Integer queryId : queries) {
+ tagger.tagByQueueQueryId(queryId);
+ }
+ } else {
+ OseeLog.log(SearchEngineTagger.class, Level.INFO, "Tagging on Server Startup was not run.");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SearchEngineTagger.class, Level.INFO, "Tagging on Server Startup was not run.");
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerRunnable.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerRunnable.java
new file mode 100644
index 00000000000..716c38a2df5
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerRunnable.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.framework.search.engine.internal;
+
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.JoinItem;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.ITagListener;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeDataStore;
+import org.eclipse.osee.framework.search.engine.data.IAttributeLocator;
+import org.eclipse.osee.framework.search.engine.data.SearchTag;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+import org.eclipse.osee.framework.search.engine.utility.SearchTagDataStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class TaggerRunnable implements Runnable {
+ private final Set<ITagListener> listeners;
+ private final int tagQueueQueryId;
+ private final boolean isCacheAll;
+ private final int cacheLimit;
+ private long processingTime;
+ private final long waitStart;
+ private long waitTime;
+
+ TaggerRunnable(int tagQueueQueryId, boolean isCacheAll, int cacheLimit) {
+ this.listeners = new HashSet<ITagListener>();
+ this.tagQueueQueryId = tagQueueQueryId;
+ this.waitStart = System.currentTimeMillis();
+ this.waitTime = 0;
+ this.processingTime = 0;
+ this.cacheLimit = cacheLimit;
+ this.isCacheAll = isCacheAll;
+ }
+
+ public int getTagQueueQueryId() {
+ return tagQueueQueryId;
+ }
+
+ public void addListener(ITagListener listener) {
+ if (listener != null) {
+ this.listeners.add(listener);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ this.waitTime = System.currentTimeMillis() - this.waitStart;
+ long processStart = System.currentTimeMillis();
+ try {
+ AttributeToTagTx attributeToTagTx = new AttributeToTagTx();
+ attributeToTagTx.execute();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to tag - tagQueueQueryId [%d]",
+ getTagQueueQueryId()), ex);
+ } finally {
+ this.processingTime = System.currentTimeMillis() - processStart;
+ notifyOnTagQueryIdTagComplete();
+ }
+ this.listeners.clear();
+ }
+
+ private void notifyOnAttributeTagComplete(long gammaId, int totalTags, long processingTime) {
+ for (ITagListener listener : listeners) {
+ try {
+ listener.onAttributeTagComplete(tagQueueQueryId, gammaId, totalTags, processingTime);
+ } catch (Exception ex) {
+ OseeLog.log(TaggerRunnable.class, Level.SEVERE, String.format("Error notifying listener: [%s] ",
+ listener.getClass().getName()), ex);
+ }
+ }
+ }
+
+ private void notifyOnTagQueryIdTagComplete() {
+ for (ITagListener listener : listeners) {
+ try {
+ listener.onTagQueryIdTagComplete(tagQueueQueryId, waitTime, processingTime);
+ } catch (Exception ex) {
+ OseeLog.log(TaggerRunnable.class, Level.SEVERE, String.format("Error notifying listener: [%s] ",
+ listener.getClass().getName()), ex);
+ }
+ }
+ }
+
+ private void notifyOnAttributeAddTagEvent(long gammaId, String word, long codedTag) {
+ for (ITagListener listener : listeners) {
+ try {
+ listener.onAttributeAddTagEvent(tagQueueQueryId, gammaId, word, codedTag);
+ } catch (Exception ex) {
+ OseeLog.log(TaggerRunnable.class, Level.SEVERE, String.format("Error notifying listener: [%s] ",
+ listener.getClass().getName()), ex);
+ }
+ }
+ }
+
+ private final class AttributeToTagTx extends DbTransaction implements ITagCollector {
+ private static final int TOTAL_RETRIES = 10;
+ private final Deque<SearchTag> searchTags;
+ private SearchTag currentTag;
+
+ public AttributeToTagTx() throws OseeCoreException {
+ super();
+ this.searchTags = new LinkedList<SearchTag>();
+ this.currentTag = null;
+ }
+
+ private Collection<AttributeData> getDataFromQueryId(OseeConnection connection, int queryId, final int numberOfRetries) throws OseeDataStoreException {
+ Collection<AttributeData> attributeDatas = AttributeDataStore.getAttribute(connection, getTagQueueQueryId());
+ // Re-try in case query id hasn't been committed to the database
+ int retry = 0;
+ while (attributeDatas.isEmpty() && retry < numberOfRetries) {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException ex) {
+ OseeLog.log(Activator.class, Level.WARNING, ex);
+ }
+ attributeDatas = AttributeDataStore.getAttribute(connection, getTagQueueQueryId());
+ retry++;
+ }
+ return attributeDatas;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxWork(java.sql.Connection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ Collection<AttributeData> attributeDatas = getDataFromQueryId(connection, getTagQueueQueryId(), TOTAL_RETRIES);
+ if (!attributeDatas.isEmpty()) {
+ try {
+ SearchTagDataStore.deleteTags(connection,
+ attributeDatas.toArray(new IAttributeLocator[attributeDatas.size()]));
+ for (AttributeData attributeData : attributeDatas) {
+ long startItemTime = System.currentTimeMillis();
+ this.currentTag = new SearchTag(attributeData.getGammaId());
+ this.searchTags.add(this.currentTag);
+ try {
+ Activator.getTaggerManager().tagIt(attributeData, this);
+ checkSizeStoreIfNeeded(connection);
+ } catch (Throwable ex) {
+ // ex.printStackTrace();
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to tag - [%s]", this.currentTag));
+ } finally {
+ notifyOnAttributeTagComplete(this.currentTag.getGammaId(), this.currentTag.getTotalTags(),
+ (System.currentTimeMillis() - startItemTime));
+ this.currentTag = null;
+ }
+ }
+ store(connection, this.searchTags);
+ JoinUtility.deleteQuery(connection, JoinItem.TAG_GAMMA_QUEUE, getTagQueueQueryId());
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to store tags - tagQueueQueryId [%d]",
+ getTagQueueQueryId()), ex);
+ }
+ } else {
+ System.out.println(String.format("Empty gamma query id: %s", getTagQueueQueryId()));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxFinally()
+ */
+ @Override
+ protected void handleTxFinally() throws OseeCoreException {
+ super.handleTxFinally();
+ for (SearchTag searchTag : this.searchTags) {
+ searchTag.clearCache();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.utility.ITagCollector#addTag(java.lang.String, java.lang.Long)
+ */
+ @Override
+ public void addTag(String word, Long codedTag) {
+ if (this.currentTag != null) {
+ this.currentTag.addTag(codedTag);
+ notifyOnAttributeAddTagEvent(this.currentTag.getGammaId(), word, codedTag);
+ }
+ }
+
+ private void checkSizeStoreIfNeeded(OseeConnection connection) throws OseeDataStoreException {
+ int cummulative = 0;
+ boolean needsStorage = false;
+ for (SearchTag item : this.searchTags) {
+ cummulative += item.cacheSize();
+ if (isCacheAll != true && cummulative >= cacheLimit) {
+ needsStorage = true;
+ break;
+ }
+ }
+ if (needsStorage) {
+ store(connection, this.searchTags);
+ }
+ }
+
+ private void store(OseeConnection connection, Collection<SearchTag> toStore) throws OseeDataStoreException {
+ SearchTagDataStore.storeTags(connection, toStore);
+ for (SearchTag item : toStore) {
+ item.clearCache();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerStatistics.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerStatistics.java
new file mode 100644
index 00000000000..e70382cee02
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaggerStatistics.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.framework.search.engine.internal;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.search.engine.ITagItemStatistics;
+import org.eclipse.osee.framework.search.engine.ITaggerStatistics;
+import org.eclipse.osee.framework.search.engine.TagListenerAdapter;
+import org.eclipse.osee.framework.search.engine.utility.SearchTagDataStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TaggerStatistics extends TagListenerAdapter implements Cloneable, ITaggerStatistics {
+ public static final TaggerStatistics EMPTY_STATS = new TaggerStatistics();
+ private static final TaskStatistics DEFAULT_TASK_STATS = new TaskStatistics(-1, -1, -1);
+
+ private long averageQueryIdWaitTime;
+ private long averageAttributeProcessingTime;
+ private long averageQueryIdProcessingTime;
+ private long totalTags;
+ private int totalAttributesProcessed;
+ private int totalQueryIdsProcessed;
+ private long totalQueryIdWaitTime;
+ private long totalQueryIdProcessingTime;
+ private long totalAttributeProcessingTime;
+ private long longestQueryIdWaitTime;
+ private long longestQueryIdProcessingTime;
+ private TaskStatistics longestTask;
+ private TaskStatistics mostTags;
+
+ public TaggerStatistics() {
+ clear();
+ }
+
+ public void clear() {
+ this.averageQueryIdWaitTime = 0;
+ this.totalTags = 0;
+ this.averageAttributeProcessingTime = 0;
+ this.averageQueryIdProcessingTime = 0;
+ this.totalAttributesProcessed = 0;
+ this.totalQueryIdsProcessed = 0;
+ this.totalQueryIdWaitTime = 0;
+ this.totalAttributeProcessingTime = 0;
+ this.totalQueryIdProcessingTime = 0;
+ this.longestQueryIdWaitTime = 0;
+ this.longestQueryIdProcessingTime = 0;
+ this.longestTask = DEFAULT_TASK_STATS;
+ this.mostTags = DEFAULT_TASK_STATS;
+ }
+
+ public long getLongestQueryIdWaitTime() {
+ return longestQueryIdWaitTime;
+ }
+
+ public long getLongestQueryIdProcessingTime() {
+ return longestQueryIdProcessingTime;
+ }
+
+ public long getAverageQueryIdWaitTime() {
+ return averageQueryIdWaitTime;
+ }
+
+ public int getTotalQueryIdsProcessed() {
+ return this.totalQueryIdsProcessed;
+ }
+
+ public long getAverageQueryIdProcessingTime() {
+ return averageQueryIdProcessingTime;
+ }
+
+ public long getAverageAttributeProcessingTime() {
+ return averageAttributeProcessingTime;
+ }
+
+ public long getTotalTags() {
+ return totalTags;
+ }
+
+ public int getTotalAttributesProcessed() {
+ return totalAttributesProcessed;
+ }
+
+ public long getLongestAttributeProcessingTime() {
+ return longestTask.getProcessingTime();
+ }
+
+ public ITagItemStatistics getLongestTask() {
+ return longestTask;
+ }
+
+ public ITagItemStatistics getMostTagsTask() {
+ return mostTags;
+ }
+
+ public long getTagsInSystem() throws OseeDataStoreException {
+ return SearchTagDataStore.getTotalTags();
+ }
+
+ public long getTotalQueryIdsInQueue() throws OseeDataStoreException {
+ return SearchTagDataStore.getTotalQueryIdsInQueue();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#clone()
+ */
+ @Override
+ protected ITaggerStatistics clone() throws CloneNotSupportedException {
+ TaggerStatistics other = (TaggerStatistics) super.clone();
+ other.averageAttributeProcessingTime = this.averageAttributeProcessingTime;
+ other.averageQueryIdProcessingTime = this.averageQueryIdProcessingTime;
+ other.averageQueryIdWaitTime = this.averageQueryIdWaitTime;
+ other.totalTags = this.totalTags;
+ other.totalAttributesProcessed = this.totalAttributesProcessed;
+ other.totalQueryIdsProcessed = this.totalQueryIdsProcessed;
+ other.totalAttributeProcessingTime = this.totalAttributeProcessingTime;
+ other.totalQueryIdProcessingTime = this.totalQueryIdProcessingTime;
+ other.totalQueryIdWaitTime = this.totalQueryIdWaitTime;
+ other.longestQueryIdWaitTime = this.longestQueryIdWaitTime;
+ other.longestQueryIdProcessingTime = this.longestQueryIdProcessingTime;
+ other.longestTask = this.longestTask.clone();
+ other.mostTags = this.mostTags.clone();
+ return other;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onAttributeTagComplete(int, long, int, long)
+ */
+ @Override
+ public void onAttributeTagComplete(int queryId, long gammaId, int totalTags, long processingTime) {
+ this.totalTags += totalTags;
+ this.totalAttributesProcessed++;
+ this.totalAttributeProcessingTime += processingTime;
+ this.averageAttributeProcessingTime = this.totalAttributeProcessingTime / this.totalAttributesProcessed;
+
+ TaskStatistics newTask = new TaskStatistics(gammaId, totalTags, processingTime);
+ if (newTask.getProcessingTime() > this.longestTask.getProcessingTime()) {
+ this.longestTask = newTask;
+ }
+ if (newTask.getTotalTags() > this.mostTags.getTotalTags()) {
+ this.mostTags = newTask;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagQueryIdTagComplete(int, long)
+ */
+ @Override
+ public void onTagQueryIdTagComplete(int queryId, long waitTime, long processingTime) {
+ this.totalQueryIdsProcessed++;
+ this.totalQueryIdWaitTime += waitTime;
+ this.totalQueryIdProcessingTime += processingTime;
+
+ this.averageQueryIdWaitTime = totalQueryIdWaitTime / this.totalQueryIdsProcessed;
+ this.averageQueryIdProcessingTime = totalQueryIdProcessingTime / this.totalQueryIdsProcessed;
+
+ this.longestQueryIdProcessingTime = Math.max(this.longestQueryIdProcessingTime, processingTime);
+ this.longestQueryIdWaitTime = Math.max(this.longestQueryIdWaitTime, waitTime);
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaskStatistics.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaskStatistics.java
new file mode 100644
index 00000000000..27ad3e1ac60
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/internal/TaskStatistics.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.framework.search.engine.internal;
+
+import org.eclipse.osee.framework.search.engine.ITagItemStatistics;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TaskStatistics implements Cloneable, ITagItemStatistics {
+ private long gammaId;
+ private int totalTags;
+ private long processingTime;
+
+ TaskStatistics(long gammaId, int totalTags, long processingTime) {
+ super();
+ this.gammaId = gammaId;
+ this.totalTags = totalTags;
+ this.processingTime = processingTime;
+ }
+
+ public long getGammaId() {
+ return gammaId;
+ }
+
+ public int getTotalTags() {
+ return totalTags;
+ }
+
+ public long getProcessingTime() {
+ return processingTime;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#clone()
+ */
+ @Override
+ protected TaskStatistics clone() throws CloneNotSupportedException {
+ TaskStatistics other = (TaskStatistics) super.clone();
+ other.gammaId = this.gammaId;
+ other.totalTags = this.totalTags;
+ other.processingTime = this.processingTime;
+ return other;
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/BaseAttributeTaggerProvider.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/BaseAttributeTaggerProvider.java
new file mode 100644
index 00000000000..1478ddfbebe
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/BaseAttributeTaggerProvider.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.framework.search.engine.tagger;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Level;
+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.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.StandardOptions;
+import org.eclipse.osee.framework.search.engine.IAttributeTaggerProvider;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.internal.Activator;
+import org.eclipse.osee.framework.search.engine.utility.WordsUtil;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseAttributeTaggerProvider implements IAttributeTaggerProvider {
+
+ protected String getValue(AttributeData attributeData) {
+ String value = getExtendedData(attributeData);
+ if (value == null) {
+ value = attributeData.getStringValue();
+ }
+ return Strings.isValid(value) ? value : WordsUtil.EMPTY_STRING;
+ }
+
+ protected InputStream getValueAsStream(AttributeData attributeData) throws Exception {
+ InputStream inputStream = getExtendedDataAsStream(attributeData);
+ if (inputStream == null) {
+ inputStream = new ByteArrayInputStream(attributeData.getStringValue().getBytes("UTF-8"));
+ }
+ return inputStream;
+ }
+
+ private InputStream getExtendedDataAsStream(AttributeData attributeData) throws Exception {
+ InputStream toReturn = null;
+ if (attributeData.isUriValid()) {
+ Options options = new Options();
+ options.put(StandardOptions.DecompressOnAquire.name(), true);
+ IResourceLocator locator = Activator.getResourceLocatorManager().getResourceLocator(attributeData.getUri());
+ IResource resource = Activator.getResourceManager().acquire(locator, options);
+ toReturn = resource.getContent();
+ }
+ return toReturn;
+ }
+
+ private String getExtendedData(AttributeData attributeData) {
+ String toReturn = null;
+ if (attributeData.isUriValid()) {
+ InputStream inputStream = null;
+ try {
+ inputStream = getExtendedDataAsStream(attributeData);
+ toReturn = Lib.inputStreamToString(inputStream);
+ } catch (Exception ex) {
+ OseeLog.log(XmlAttributeTaggerProvider.class, Level.SEVERE, ex.toString(), ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(XmlAttributeTaggerProvider.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/DefaultAttributeTaggerProvider.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/DefaultAttributeTaggerProvider.java
new file mode 100644
index 00000000000..12af98c1fb4
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/DefaultAttributeTaggerProvider.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.framework.search.engine.tagger;
+
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.search.engine.MatchLocation;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+import org.eclipse.osee.framework.search.engine.utility.TagProcessor;
+import org.eclipse.osee.framework.search.engine.utility.WordOrderMatcher;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DefaultAttributeTaggerProvider extends BaseAttributeTaggerProvider {
+
+ public void tagIt(AttributeData attributeData, ITagCollector tagCollector) throws Exception {
+ TagProcessor.collectFromString(getValue(attributeData), tagCollector);
+ }
+
+ public List<MatchLocation> find(AttributeData attributeData, String toSearch, SearchOptions options) throws Exception {
+ if (Strings.isValid(toSearch)) {
+ InputStream inputStream = null;
+ try {
+ inputStream = getValueAsStream(attributeData);
+ return WordOrderMatcher.findInStream(inputStream, toSearch, options);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/XmlAttributeTaggerProvider.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/XmlAttributeTaggerProvider.java
new file mode 100644
index 00000000000..972fdd8cbd7
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/tagger/XmlAttributeTaggerProvider.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.framework.search.engine.tagger;
+
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.XmlTextInputStream;
+import org.eclipse.osee.framework.search.engine.MatchLocation;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeData;
+import org.eclipse.osee.framework.search.engine.utility.ITagCollector;
+import org.eclipse.osee.framework.search.engine.utility.TagProcessor;
+import org.eclipse.osee.framework.search.engine.utility.WordOrderMatcher;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlAttributeTaggerProvider extends BaseAttributeTaggerProvider {
+
+ @Override
+ public List<MatchLocation> find(AttributeData attributeData, String toSearch, SearchOptions options) throws Exception {
+ if (Strings.isValid(toSearch)) {
+ InputStream inputStream = null;
+ try {
+ inputStream = new XmlTextInputStream(getValueAsStream(attributeData));
+ return WordOrderMatcher.findInStream(inputStream, toSearch, options);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ public void tagIt(AttributeData attributeData, ITagCollector collector) throws Exception {
+ InputStream inputStream = null;
+ try {
+ inputStream = getValueAsStream(attributeData);
+ TagProcessor.collectFromInputStream(new XmlTextInputStream(inputStream), collector);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/ITagCollector.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/ITagCollector.java
new file mode 100644
index 00000000000..17cf428ade7
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/ITagCollector.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.framework.search.engine.utility;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITagCollector {
+
+ public void addTag(String word, Long codedTag);
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/SearchTagDataStore.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/SearchTagDataStore.java
new file mode 100644
index 00000000000..0afa9afe073
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/SearchTagDataStore.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.search.engine.utility;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.search.engine.data.AttributeVersion;
+import org.eclipse.osee.framework.search.engine.data.IAttributeLocator;
+import org.eclipse.osee.framework.search.engine.data.SearchTag;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchTagDataStore {
+
+ private static String INSERT_SEARCH_TAG_BODY = "insert into osee_search_tags (gamma_id, coded_tag_id) values (?, ?)";
+
+ private static final String DELETE_SEARCH_TAGS = "delete from osee_search_tags where gamma_id = ?";
+
+ private static final String SELECT_TOTAL_TAGS = "select count(1) from osee_search_tags";
+
+ private static final String SELECT_TOTAL_QUERY_IDS_IN_QUEUE =
+ "select count(DISTINCT query_id) from osee_tag_gamma_queue";
+
+ private static final String SELECT_SEARCH_TAGS =
+ "select ost1.gamma_id from osee_search_tags ost1 where ost1.coded_tag_id = ?";
+
+ public static long getTotalQueryIdsInQueue() throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchInt(-1, SELECT_TOTAL_QUERY_IDS_IN_QUEUE);
+ }
+
+ public static long getTotalTags() throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchInt(-1, SELECT_TOTAL_TAGS);
+ }
+
+ public static int deleteTags(OseeConnection connection, int queryId) throws OseeDataStoreException {
+ int numberDeleted = 0;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ chStmt.runPreparedQuery("select gamma_id from osee_join_transaction where query_id = ?", queryId);
+ List<Object[]> datas = new ArrayList<Object[]>();
+ while (chStmt.next()) {
+ datas.add(new Object[] {chStmt.getLong("gamma_id")});
+ }
+ if (!datas.isEmpty()) {
+ numberDeleted = ConnectionHandler.runBatchUpdate(connection, DELETE_SEARCH_TAGS, datas);
+ }
+ return numberDeleted;
+ }
+
+ public static int deleteTags(OseeConnection connection, Collection<IAttributeLocator> locators) throws OseeDataStoreException {
+ return deleteTags(connection, locators.toArray(new IAttributeLocator[locators.size()]));
+ }
+
+ public static int deleteTags(OseeConnection connection, IAttributeLocator... locators) throws OseeDataStoreException {
+ int numberDeleted = 0;
+ if (locators.length > 0) {
+ List<Object[]> datas = new ArrayList<Object[]>();
+ for (IAttributeLocator locator : locators) {
+ datas.add(new Object[] {locator.getGammaId()});
+ }
+ numberDeleted = ConnectionHandler.runBatchUpdate(connection, DELETE_SEARCH_TAGS, datas);
+ }
+ return numberDeleted;
+ }
+
+ public static int storeTags(OseeConnection connection, Collection<SearchTag> searchTags) throws OseeDataStoreException {
+ return storeTags(connection, searchTags.toArray(new SearchTag[searchTags.size()]));
+ }
+
+ public static int storeTags(OseeConnection connection, SearchTag... searchTags) throws OseeDataStoreException {
+ int updated = 0;
+ if (searchTags != null && searchTags.length > 0) {
+ for (SearchTag searchTag : searchTags) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (Long codedTag : searchTag.getTags()) {
+ data.add(new Object[] {searchTag.getGammaId(), codedTag});
+ }
+ updated += ConnectionHandler.runBatchUpdate(connection, INSERT_SEARCH_TAG_BODY, data);
+ }
+ }
+ return updated;
+ }
+
+ public static Set<IAttributeLocator> fetchTagEntries(OseeConnection connection, Collection<Long> codedTags) throws Exception {
+ return fetchTagEntries(connection, codedTags.toArray(new Long[codedTags.size()]));
+ }
+
+ public static Set<IAttributeLocator> fetchTagEntries(OseeConnection connection, Long... codedTags) throws OseeDataStoreException {
+ final Set<IAttributeLocator> toReturn = new HashSet<IAttributeLocator>();
+
+ for (Long codedTag : codedTags) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(SELECT_SEARCH_TAGS, codedTag);
+ while (chStmt.next()) {
+ toReturn.add(new AttributeVersion(chStmt.getLong("gamma_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagEncoder.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagEncoder.java
new file mode 100644
index 00000000000..8a2cfabce20
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagEncoder.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.framework.search.engine.utility;
+
+import java.util.Arrays;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TagEncoder {
+
+ private static final char[] tagChars =
+ new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
+ 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'y'};
+
+ /**
+ * Create a bit-packed tag that will fit in a 64-bit integer that can provide an extremely quick search mechanism for
+ * for the first pass. The second pass will do a full text search to provide more exact matches. The tag will
+ * represent up to 12 characters (all that can be stuffed into 64-bits). Longer search tags will be turned into
+ * consecutive search tags
+ *
+ * @param insertParameters
+ * @param attribute
+ * @param text
+ */
+ public static void encode(String text, ITagCollector collector) {
+ int tagBitsPos = 0;
+ long tagBits = 0;
+ for (int index = 0; index < text.length(); index++) {
+ char c = text.charAt(index);
+
+ if (c == '\t' || c == '\n' || c == '\r' || tagBitsPos == 60) {
+ if (tagBitsPos > 10) {
+ collector.addTag(text, tagBits);
+ }
+ tagBits = 0;
+ tagBitsPos = 0;
+ } else {
+ if (c >= 'A' && c <= 'Z') {
+ c += 32;
+ }
+ int pos = Arrays.binarySearch(tagChars, c);
+ if (pos < 0) {
+ tagBits |= 0x3F << tagBitsPos;
+ } else {
+ tagBits |= pos << tagBitsPos;
+ }
+ tagBitsPos += 4;
+ }
+ }
+ if (tagBits != 0) {
+ collector.addTag(text, tagBits);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagProcessor.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagProcessor.java
new file mode 100644
index 00000000000..a1199e4ea7d
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/TagProcessor.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.framework.search.engine.utility;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.internal.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TagProcessor {
+
+ private static final Set<String> wordsToSkip;
+ static {
+ wordsToSkip = new HashSet<String>();
+ Scanner scanner = null;
+ try {
+ URL url = Activator.getResource("/support/wordsToSkip.txt");
+ scanner = new Scanner(url.openStream(), "UTF-8");
+ while (scanner.hasNext()) {
+ wordsToSkip.add(scanner.next());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(TagProcessor.class, Level.SEVERE, "Unable to process word skip file.", ex);
+ } finally {
+ if (scanner != null) {
+ scanner.close();
+ }
+ }
+ }
+
+ private TagProcessor() {
+ }
+
+ public static void collectFromString(String value, ITagCollector tagCollector) {
+ if (value != null && value.length() > 0) {
+ Scanner scanner = new Scanner(value);
+ while (scanner.hasNext()) {
+ processWord(scanner.next(), tagCollector);
+ }
+ }
+ }
+
+ public static void collectFromInputStream(InputStream inputStream, ITagCollector tagCollector) {
+ if (inputStream != null) {
+ Scanner scanner = new Scanner(inputStream, "UTF-8");
+ while (scanner.hasNext()) {
+ processWord(scanner.next(), tagCollector);
+ }
+ }
+ }
+
+ public static void collectFromScanner(Scanner sourceScanner, ITagCollector tagCollector) {
+ try {
+ while (sourceScanner.hasNext()) {
+ String entry = sourceScanner.next();
+ if (entry.length() > 0) {
+ Scanner innerScanner = new Scanner(entry);
+ while (innerScanner.hasNext()) {
+ String entry1 = innerScanner.next();
+ processWord(entry1, tagCollector);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ // Do nothing
+ }
+ }
+
+ private static void processWord(String original, ITagCollector tagCollector) {
+ if (Strings.isValid(original) && (original.length() >= 2 || 0 == WordsUtil.countPuntuation(original))) {
+ original = original.toLowerCase();
+ for (String toEncode : WordsUtil.splitOnPunctuation(original)) {
+ if (wordsToSkip.contains(toEncode) != true) {
+ String target = WordsUtil.toSingular(WordsUtil.stripPossesive(toEncode));
+ TagEncoder.encode(target, tagCollector);
+ }
+ }
+ }
+ }
+
+ public static char[] normalizeWord(String toSearch) {
+ boolean lastCharacterAddedWasWhiteSpace = false;
+ StringBuilder searchString = new StringBuilder();
+ for (int index = 0; index < toSearch.length(); index++) {
+ char currChar = toSearch.charAt(index);
+ currChar = Character.toLowerCase(currChar);
+
+ if (currChar != '\r' && currChar != '\n') {
+ if (WordsUtil.isPunctuationOrApostrophe(currChar)) {
+ currChar = ' ';
+ }
+ if (Character.isWhitespace(currChar)) {
+ if (!lastCharacterAddedWasWhiteSpace) {
+ searchString.append(currChar);
+ lastCharacterAddedWasWhiteSpace = true;
+ }
+ } else {
+ searchString.append(currChar);
+ lastCharacterAddedWasWhiteSpace = false;
+ }
+ }
+ }
+ return searchString.toString().trim().toCharArray();
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordOrderMatcher.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordOrderMatcher.java
new file mode 100644
index 00000000000..1134457933d
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordOrderMatcher.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.framework.search.engine.utility;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.search.engine.MatchLocation;
+import org.eclipse.osee.framework.search.engine.SearchOptions;
+import org.eclipse.osee.framework.search.engine.SearchOptions.SearchOptionsEnum;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class WordOrderMatcher {
+
+ private WordOrderMatcher() {
+ }
+
+ public static List<MatchLocation> findInStream(InputStream inputStream, String toSearch, SearchOptions options) throws IOException {
+ List<MatchLocation> matchLocations = new ArrayList<MatchLocation>();
+ Reader reader = null;
+ try {
+ reader = new InputStreamReader(inputStream, "UTF-8");
+ boolean isCaseInsensitive = !options.getBoolean(SearchOptionsEnum.case_sensitive.asStringOption());
+ char[] charsToSearch = removeExtraSpacesAndSpecialCharacters(toSearch, isCaseInsensitive);
+ int charCount = 0;
+ int index = 0;
+ int value = 0;
+ boolean lastCharacterAddedWasWhiteSpace = false;
+ boolean currCharValid = false;
+ MatchLocation matchLocation = new MatchLocation();
+ while (value != -1) {
+ value = reader.read();
+ charCount++;
+ char currChar = (char) value;
+ if (isCaseInsensitive) {
+ currChar = Character.toLowerCase(currChar);
+ }
+
+ if (currChar != '\r' && currChar != '\n') {
+ if (WordsUtil.isPunctuationOrApostrophe(currChar)) {
+ currChar = ' ';
+ }
+
+ if (Character.isWhitespace(currChar)) {
+ if (!lastCharacterAddedWasWhiteSpace) {
+ currCharValid = true;
+ lastCharacterAddedWasWhiteSpace = true;
+ } else {
+ currCharValid = false;
+ }
+ } else {
+ currCharValid = true;
+ lastCharacterAddedWasWhiteSpace = false;
+ }
+ }
+
+ if (currCharValid) {
+ if (charsToSearch[index] == currChar) {
+ if (index == 0) {
+ matchLocation.setStartPosition(charCount);
+ }
+
+ if (index + 1 < charsToSearch.length) {
+ index++;
+ } else {
+ matchLocation.setEndPosition(charCount);
+ matchLocations.add(matchLocation.clone());
+ index = 0;
+ if (!options.getBoolean(SearchOptionsEnum.find_all_locations.asStringOption())) {
+ break;
+ }
+ }
+ } else {
+ index = 0;
+ matchLocation.reset();
+ }
+ }
+ }
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ return matchLocations;
+ }
+
+ private static char[] removeExtraSpacesAndSpecialCharacters(String toSearch, boolean setAllToLowerCase) {
+ boolean lastCharacterAddedWasWhiteSpace = false;
+ StringBuilder searchString = new StringBuilder();
+ for (int index = 0; index < toSearch.length(); index++) {
+ char currChar = toSearch.charAt(index);
+ if (setAllToLowerCase) {
+ currChar = Character.toLowerCase(currChar);
+ }
+ if (currChar != '\r' && currChar != '\n') {
+ if (WordsUtil.isPunctuationOrApostrophe(currChar)) {
+ currChar = ' ';
+ }
+ if (Character.isWhitespace(currChar)) {
+ if (!lastCharacterAddedWasWhiteSpace) {
+ searchString.append(currChar);
+ lastCharacterAddedWasWhiteSpace = true;
+ }
+ } else {
+ searchString.append(currChar);
+ lastCharacterAddedWasWhiteSpace = false;
+ }
+ }
+ }
+ return searchString.toString().trim().toCharArray();
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordsUtil.java b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordsUtil.java
new file mode 100644
index 00000000000..0779149e893
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/src/org/eclipse/osee/framework/search/engine/utility/WordsUtil.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.framework.search.engine.utility;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.HtmlReservedCharacters;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.internal.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class WordsUtil {
+
+ private static final String VOWELS = "aeiou";
+ private static final String IES_ENDING = "ies";
+ private static final String OES_ENDING = "oes";
+ private static final String ES_ENDING = "es";
+ private static final String S_ENDING = "s";
+ private static final String VES_ENDING = "ves";
+ public static final String EMPTY_STRING = "";
+ private static final String[] SPECIAL_ES_ENDING_CASES = new String[] {"ss", "sh", "ch", "x"};
+
+ private static Character[] DEFAULT_PUNCTUACTION =
+ new Character[] {'\n', '\r', ' ', '!', '"', '#', '$', '%', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';',
+ '<', '>', '?', '@', '[', '\\', ']', '^', '{', '|', '}', '~', '_', '`', '\\', '=', '&'};
+
+ private static char[] PUNCTUATION = null;
+
+ private static final Properties dictionary;
+ static {
+ Set<Character> combined = new HashSet<Character>();
+ combined.addAll(Arrays.asList(DEFAULT_PUNCTUACTION));
+ combined.addAll(HtmlReservedCharacters.getChars());
+ combined.remove('\'');
+ PUNCTUATION = new char[combined.size()];
+ int index = 0;
+ for (Character character : combined) {
+ PUNCTUATION[index] = character;
+ index++;
+ }
+ Arrays.sort(PUNCTUATION);
+ dictionary = new Properties();
+ try {
+ URL url = Activator.getResource("/support/pluralToSingularExceptions.xml");
+ dictionary.loadFromXML(url.openStream());
+ } catch (Exception ex) {
+ OseeLog.log(TagProcessor.class, Level.SEVERE, "Unable to process plural to singular exceptions file.", ex);
+ }
+ }
+
+ private static boolean hasConstantBeforeEnding(String word, String ending) {
+ if (!word.equals(ending)) {
+ String remainder = word.substring(word.length() - (ending.length() + 1));
+ return VOWELS.indexOf(remainder, 1) < 0;
+ } else {
+ return false;
+ }
+ }
+
+ private static boolean hasEitherSequenceBeforeEnding(String word, String ending, String... sequences) {
+ boolean toReturn = false;
+ String remainder = word.substring(0, word.length() - ending.length());
+ for (String sequence : sequences) {
+ toReturn |= remainder.endsWith(sequence);
+ }
+ return toReturn;
+ }
+
+ private static String replaceEndingWith(String word, String ending, String replaceWith) {
+ return word.substring(0, word.length() - ending.length()) + replaceWith;
+ }
+
+ public static String stripPossesive(String original) {
+ String toReturn = original;
+ if (original != null && original.length() > 0) {
+ if (original.lastIndexOf('\'') == (original.length() - 1)) {
+ toReturn = replaceEndingWith(original, "'", "");
+ } else if (original.endsWith("'s")) {
+ toReturn = replaceEndingWith(original, "'s", "");
+ }
+ }
+ return toReturn;
+ }
+
+ public static String[] splitOnPunctuation(String original) {
+ List<String> toReturn = new ArrayList<String>();
+ StringBuffer buffer = new StringBuffer();
+ for (int index = 0; index < original.length(); index++) {
+ char c = original.charAt(index);
+ int pos = Arrays.binarySearch(PUNCTUATION, c);
+ if (pos < 0) {
+ buffer.append(c);
+ } else {
+ addToList(buffer.toString(), toReturn);
+ buffer.setLength(0);
+ }
+ }
+ addToList(buffer.toString(), toReturn);
+ buffer.setLength(0);
+ return toReturn.toArray(new String[toReturn.size()]);
+ }
+
+ private static void addToList(String toAdd, List<String> list) {
+ toAdd = toAdd.trim();
+ if (toAdd.length() > 0) {
+ toAdd = WordsUtil.toRemoveSingleQuotes(toAdd);
+ if (toAdd.length() > 0) {
+ list.add(toAdd);
+ }
+ }
+ }
+
+ public static boolean isPunctuationOrApostrophe(char character) {
+ return Arrays.binarySearch(PUNCTUATION, character) > 0 || character == '\'';
+ }
+
+ public static int countPuntuation(String original) {
+ int toReturn = 0;
+ for (int index = 0; index < original.length(); index++) {
+ int pos = Arrays.binarySearch(PUNCTUATION, original.charAt(index));
+ if (pos > 0) {
+ toReturn++;
+ }
+ }
+ return toReturn;
+ }
+
+ public static boolean endsWithPunctuation(String original) {
+ boolean toReturn = false;
+ int size = original.length();
+ if (size > 0) {
+ char c = original.charAt(size - 1);
+ int pos = Arrays.binarySearch(PUNCTUATION, c);
+ if (pos > 0) {
+ toReturn = true;
+ }
+ }
+ return toReturn;
+ }
+
+ public static String toSingular(String word) {
+ word = word.toLowerCase();
+ String toReturn = dictionary.getProperty(word);
+ if (toReturn == null) {
+ if (word.endsWith(IES_ENDING) && hasConstantBeforeEnding(word, IES_ENDING)) {
+ toReturn = replaceEndingWith(word, IES_ENDING, "y");
+ } else if (word.endsWith(OES_ENDING) && hasConstantBeforeEnding(word, OES_ENDING)) {
+ toReturn = replaceEndingWith(word, OES_ENDING, "o");
+ } else if (word.endsWith(ES_ENDING) && hasConstantBeforeEnding(word, ES_ENDING)) {
+ String replaceWith = "e";
+ String ending = ES_ENDING;
+ if (hasEitherSequenceBeforeEnding(word, ES_ENDING, SPECIAL_ES_ENDING_CASES)) {
+ replaceWith = EMPTY_STRING;
+ } else if (hasEitherSequenceBeforeEnding(word, ES_ENDING, "v")) {
+ ending = VES_ENDING;
+ replaceWith = "f";
+ }
+ toReturn = replaceEndingWith(word, ending, replaceWith);
+ } else if (word.endsWith(S_ENDING)) {
+ toReturn = word.substring(0, word.length() - 1);
+ } else {
+ toReturn = word;
+ }
+ }
+ return toReturn;
+ }
+
+ public static String toRemoveSingleQuotes(String original) {
+ int startAt = 0;
+ int stopAt = original.length();
+ boolean process = false;
+ if (original.startsWith("'")) {
+ startAt = 1;
+ process = true;
+ }
+ if (original.endsWith("'")) {
+ stopAt = original.length() - 1;
+ process = true;
+ }
+ if (process) {
+ if (startAt > stopAt) {
+ original = "";
+ } else {
+ original = original.substring(startAt, stopAt);
+ }
+ }
+ return original;
+ }
+}
diff --git a/org.eclipse.osee.framework.search.engine/support/pluralToSingularExceptions.xml b/org.eclipse.osee.framework.search.engine/support/pluralToSingularExceptions.xml
new file mode 100644
index 00000000000..238dcab5a60
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/support/pluralToSingularExceptions.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+<entry key="feet">foot</entry>
+<entry key="geese">goose</entry>
+<entry key="lice">louse</entry>
+<entry key="men">man</entry>
+<entry key="women">woman</entry>
+<entry key="mice">mouse</entry>
+<entry key="teeth">tooth</entry>
+<entry key="indeces">index</entry>
+<entry key="lives">life</entry>
+<entry key="oxen">ox</entry>
+<entry key="kine">cow</entry>
+<entry key="brethren">brother</entry>
+<entry key="children">child</entry>
+<entry key="criteria">criterion</entry>
+<entry key="cacti">cactus</entry>
+<entry key="fungi">fungus</entry>
+<entry key="automata">automaton</entry>
+<entry key="phenomena">phenomenon</entry>
+<entry key="polyhedra">polyhedron</entry>
+<entry key="axes">axis</entry>
+<entry key="crises">crisis</entry>
+<entry key="testes">testis</entry>
+<entry key="species">species</entry>
+<entry key="series">series</entry>
+<entry key="appendeces">appendix</entry>
+<entry key="memoranda">memorandum</entry>
+<entry key="mediums">medium</entry>
+<entry key="various">various</entry>
+<entry key="is">is</entry>
+<entry key="was">was</entry>
+<entry key="has">has</entry>
+<entry key="yours">yours</entry>
+<entry key="ours">ours</entry>
+<entry key="hers">hers</entry>
+<entry key="his">his</entry>
+<entry key="theirs">theirs</entry>
+<entry key="this">this</entry>
+<entry key="as">as</entry>
+<entry key="status">status</entry>
+<entry key="srs">srs</entry>
+<entry key="pids">pids</entry>
+<entry key="mtads">mtads</entry>
+<entry key="tads">tads</entry>
+<entry key="pnvs">pnvs</entry>
+<entry key="provides">provides</entry>
+<entry key="chris">chris</entry>
+<entry key="processes">process</entry>
+<entry key="process">process</entry>
+<entry key="encompasses">encompass</entry>
+<entry key="encompass">encompass</entry>
+<entry key="success">success</entry>
+<entry key="successes">success</entry>
+<entry key="douglas">douglas</entry>
+<entry key="brooks">brooks</entry>
+<entry key="previous">previous</entry>
+</properties>
diff --git a/org.eclipse.osee.framework.search.engine/support/wordsToSkip.txt b/org.eclipse.osee.framework.search.engine/support/wordsToSkip.txt
new file mode 100644
index 00000000000..2b71496a19b
--- /dev/null
+++ b/org.eclipse.osee.framework.search.engine/support/wordsToSkip.txt
@@ -0,0 +1,4 @@
+ies
+s
+oes
+es
diff --git a/org.eclipse.osee.framework.server.admin/.classpath b/org.eclipse.osee.framework.server.admin/.classpath
new file mode 100644
index 00000000000..2979e2c4ef0
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/.classpath
@@ -0,0 +1,8 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="ant_src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.server.admin/.project b/org.eclipse.osee.framework.server.admin/.project
new file mode 100644
index 00000000000..3d5da73c193
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.server.admin</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.server.admin/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.server.admin/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..f6b3a7df97e
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Dec 09 15:47:29 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=true
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.server.admin/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.server.admin/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..ea0dfcadce1
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tool Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.server.admin;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.server.admin.Activator
+Bundle-Vendor: Boeing
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.equinox.app,
+ org.eclipse.osee.framework.branch.management,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.query,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.resource.management,
+ org.eclipse.osee.framework.resource.management.exception,
+ org.eclipse.osee.framework.resource.provider.common.resources,
+ org.eclipse.osee.framework.search.engine,
+ org.eclipse.osee.framework.search.engine.attribute,
+ org.eclipse.osgi.framework.console,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Service-Component: OSGI-INF/server.admin.cmds.xml,
+ OSGI-INF/search.tagger.cmds.xml,
+ OSGI-INF/branch.cmds.xml
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.server.admin/OSGI-INF/branch.cmds.xml b/org.eclipse.osee.framework.server.admin/OSGI-INF/branch.cmds.xml
new file mode 100644
index 00000000000..c76a81ac4ba
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/OSGI-INF/branch.cmds.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="branch.management.cmds">
+ <implementation class="org.eclipse.osee.framework.server.admin.BranchManagementCommandProvider"/>
+ <service>
+ <provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
+ </service>
+</component>
diff --git a/org.eclipse.osee.framework.server.admin/OSGI-INF/search.tagger.cmds.xml b/org.eclipse.osee.framework.server.admin/OSGI-INF/search.tagger.cmds.xml
new file mode 100644
index 00000000000..ddc580dceea
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/OSGI-INF/search.tagger.cmds.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="search.tagger.cmds">
+ <implementation class="org.eclipse.osee.framework.server.admin.SearchTaggerCommandProvider"/>
+ <service>
+ <provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
+ </service>
+</component>
diff --git a/org.eclipse.osee.framework.server.admin/OSGI-INF/server.admin.cmds.xml b/org.eclipse.osee.framework.server.admin/OSGI-INF/server.admin.cmds.xml
new file mode 100644
index 00000000000..3c84a201837
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/OSGI-INF/server.admin.cmds.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<component name="compressed.content.fix">
+ <implementation class="org.eclipse.osee.framework.server.admin.ServerAdminCommandProvider"/>
+ <service>
+ <provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
+ </service>
+</component>
diff --git a/org.eclipse.osee.framework.server.admin/Server Release Instructions.xml b/org.eclipse.osee.framework.server.admin/Server Release Instructions.xml
new file mode 100644
index 00000000000..e7466312fa1
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/Server Release Instructions.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>Releasing New Application Server:</o:Title><o:Author>b1122182</o:Author><o:LastAuthor>b1122182</o:LastAuthor><o:Revision>3</o:Revision><o:TotalTime>38</o:TotalTime><o:Created>2008-05-29T18:45:00Z</o:Created><o:LastSaved>2008-05-29T19:23:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>352</o:Words><o:Characters>2011</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>16</o:Lines><o:Paragraphs>4</o:Paragraphs><o:CharactersWithSpaces>2359</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="1D5F696F"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="16229328"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="2EAC47C6"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="6838CCC8"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7200"/></w:tabs><w:ind w:left="7200" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="43426C77"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="31087D5E"/><w:lvl w:ilvl="0" w:tplc="04090005"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="1"/></w:list><w:list w:ilfo="2"><w:ilst w:val="2"/></w:list><w:list w:ilfo="3"><w:ilst w:val="0"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00A1102E"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style></w:styles><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00731989"/><wsp:rsid wsp:val="00731989"/><wsp:rsid wsp:val="00766272"/><wsp:rsid wsp:val="00821BA3"/><wsp:rsid wsp:val="00850125"/><wsp:rsid wsp:val="008B68C7"/><wsp:rsid wsp:val="00A1102E"/><wsp:rsid wsp:val="00C65B36"/><wsp:rsid wsp:val="00CC477E"/><wsp:rsid wsp:val="00E93320"/><wsp:rsid wsp:val="00FA03CC"/></wsp:rsids></w:docPr><w:body><wx:sect><w:p wsp:rsidR="00CC477E" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00CC477E" wsp:rsidP="00CC477E"><w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:u w:val="single"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:u w:val="single"/></w:rPr><w:t>OSEE APPLICATION SERVER INSTRUCTIONS</w:t></w:r></w:p><w:p wsp:rsidR="00CC477E" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00CC477E" wsp:rsidP="00CC477E"><w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Releasing New Application Server:</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="1"/><wx:t wx:val="1." wx:wTabBefore="1080" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Select target platform</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="a." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Open Target Platform project</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="b." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Open equinox[XX].target file this will open an editor</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="c." wx:wTabBefore="1800" wx:wTabAfter="225"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Click on Set as target platform on the top right of the editor</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:ind w:left="1800"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="1"/><wx:t wx:val="2." wx:wTabBefore="1080" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Ensure PDE ant task configured correctly</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="a." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Open </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>org.eclipse.osee.framework.server.admin</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> project</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="b." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Right-Click on </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>build_server_release.xml</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="c." wx:wTabBefore="1800" wx:wTabAfter="225"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Select Run As-&gt;Ant Build…</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="d." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>On the JRE tab select “Run in the same JRE as the workspaceâ€</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:ind w:left="1800"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="1"/><wx:t wx:val="3." wx:wTabBefore="1080" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Run Ant Script to build server configuration</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="a." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Open Ant view by selecting Window-&gt;Show View-&gt;Ant</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="b." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Drag and Drop </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>build_server_release.xml</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> into Ant View</w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="c." wx:wTabBefore="1800" wx:wTabAfter="225"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Double Click on RUN_FIRST Ant </w:t></w:r><w:r wsp:rsidR="00766272" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Task </w:t></w:r></w:p><w:p wsp:rsidR="00766272" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00766272" wsp:rsidP="00766272"><w:pPr><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="1"/><wx:t wx:val="i." wx:wTabBefore="2610" wx:wTabAfter="180"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Wait until complete – Check that the PDE export task has complete</w:t></w:r><w:r wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>d by looking at the jobs running – icon is located on the bottom right hand corner of eclipse.</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="d." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Double Click on RUN_SECOND Ant Task</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="e." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>The server files are located in the “</w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_servers_bundles</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>†folder</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:ind w:left="1800"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="1"/><wx:t wx:val="4." wx:wTabBefore="1080" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>UNIX server setup</w:t></w:r></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="a." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>FTP </w:t></w:r><w:r wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>as OSEE user the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_server_bundles</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> folder from your workspace into a folder named after today’s date and time </w:t></w:r><w:r wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>located as </w:t></w:r><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>/</w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>lba_ws/osee_common/osee_installs/osee_server</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>/</w:t></w:r></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:ind w:left="2160"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:ind w:left="2160"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Example: </w:t></w:r><w:r wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>[YYYY_MM_DDD_HH_MM/</w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_server_bundles</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>]</w:t></w:r></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:ind w:left="2160"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="b." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Log into sun802 and </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>cd</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> into</w:t></w:r><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_server_bundles</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> folder</w:t></w:r></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="c." wx:wTabBefore="1800" wx:wTabAfter="225"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Add execute permissions to </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>runServer.sh</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="d." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Ensure no other server using port 8015 is running on sun802</w:t></w:r></w:p><w:proofErr w:type="spellStart"/><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="1"/><wx:t wx:val="i." wx:wTabBefore="2610" wx:wTabAfter="180"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>ps</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> –</w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>eaf</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> | </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>grep</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> | </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>grep</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> 8015</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="e." wx:wTabBefore="1800" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Execute </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>runServer.sh</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> </w:t></w:r></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="008B68C7"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="1"/><wx:t wx:val="f." wx:wTabBefore="1800" wx:wTabAfter="270"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Check that all bundles are active by typing </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>ss</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> on the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osgi</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> console</w:t></w:r></w:p><w:p wsp:rsidR="008B68C7" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="008B68C7" wsp:rsidP="00C65B36"><w:pPr><w:ind w:left="1080"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Configuring Application Server</w:t></w:r></w:p><w:p wsp:rsidR="00C65B36" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00C65B36" wsp:rsidP="00C65B36"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:tab wx:wTab="720" wx:tlc="none" wx:cTlc="15"/></w:r></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00C65B36"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>The application server configuration is divided into two </w:t></w:r><w:proofErr w:type="gramStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>part</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>: the config.ini file and the base </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osgi</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> bundles located in </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_servers_bundles</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> folder. </w:t></w:r></w:p><w:p wsp:rsidR="00CC477E" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00CC477E" wsp:rsidP="00C65B36"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="720" wx:wTabAfter="285"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>The config.ini file is </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>autogenerated</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> by an ant task located in the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>ant_src</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> folder </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>ConfigIniGeneration.java</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> file.</w:t></w:r></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="2"/><wx:t wx:val="§" wx:wTabBefore="720" wx:wTabAfter="285"/><wx:font wx:val="Wingdings"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>The </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_servers_bundle/plugins</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> folder is populated when the ant tasks are executed </w:t></w:r></w:p><w:p wsp:rsidR="00CC477E" wsp:rsidRDefault="00CC477E" wsp:rsidP="00FA03CC"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>To add new base </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osgi</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> bundles:</w:t></w:r></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="2"/><wx:t wx:val="1." wx:wTabBefore="1440" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Copy bundles from the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>targetPlatforms</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>/equinox[XX]/eclipse/</w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>plugins</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="2"/><wx:t wx:val="2." wx:wTabBefore="1440" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Paste bundles into </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>osee_servers_bundle</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="2"/><wx:t wx:val="3." wx:wTabBefore="1440" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Now we need to add these bundles to the config.ini file</w:t></w:r></w:p><w:p wsp:rsidR="00FA03CC" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00FA03CC" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="2"/><wx:t wx:val="4." wx:wTabBefore="1440" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Open </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>ant_src/ConfigIniGeneration.java</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> and add the </w:t></w:r><w:r wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>bundle name to the list of bundles to be activated.</w:t></w:r></w:p><w:p wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00E93320" wsp:rsidP="00FA03CC"><w:pPr><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="2"/><wx:t wx:val="5." wx:wTabBefore="1440" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Right Click on </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>supportExport.jardesc</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> and select create JAR this will create the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>buildsupport.jar</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>.</w:t></w:r></w:p><w:p wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00E93320" wsp:rsidP="00E93320"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr></w:p><w:p wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00E93320" wsp:rsidP="00E93320"><w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>To add additional </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>plugins</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> to the server:</w:t></w:r></w:p><w:p wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00E93320" wsp:rsidP="00E93320"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="1." wx:wTabBefore="1080" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Open </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>build_server_release.xml</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p><w:p wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E" wsp:rsidRDefault="00E93320" wsp:rsidP="00E93320"><w:pPr><w:listPr><w:ilvl w:val="0"/><w:ilfo w:val="3"/><wx:t wx:val="2." wx:wTabBefore="1080" wx:wTabAfter="210"/><wx:font wx:val="Times New Roman"/></w:listPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>Add the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>plugin</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> name to the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>plugins</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> list located in the </w:t></w:r><w:proofErr w:type="spellStart"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t>pde.exportPlugins</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidRPr="00CC477E"><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr><w:t> entry.</w:t></w:r></w:p><w:sectPr wsp:rsidR="00E93320" wsp:rsidRPr="00CC477E" wsp:rsidSect="00A1102E"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.server.admin/ant_src/ConfigIniGeneration.java b/org.eclipse.osee.framework.server.admin/ant_src/ConfigIniGeneration.java
new file mode 100644
index 00000000000..a9fad841880
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/ant_src/ConfigIniGeneration.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Created on May 27, 2008
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class ConfigIniGeneration {
+ public static void main(String[] args) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("osgi.bundles= \\\n");
+ builder.append("org.apache.commons.httpclient_3.1.0.v20080605-1935.jar@start, \\\n");
+ builder.append("org.apache.commons.codec_1.3.0.v20080530-1600.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.app_1.1.0.v20080421-2006.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.registry_3.4.0.v20080516-0950.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.common_3.4.0.v20080421-2006.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.log_1.1.0.v20080303.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.ds_1.0.0.v20080310.jar@start, \\\n");
+ builder.append("org.mortbay.jetty_5.1.11.v200803061811.jar@start, \\\n");
+ builder.append("org.eclipse.osgi.services_3.1.200.v20071203.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.util_1.0.0.v20080303.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.http.servlet_1.0.100.v20080201.jar@start, \\\n");
+ builder.append("org.eclipse.equinox.http.jetty_1.0.100.v20080303.jar@start, \\\n");
+ builder.append("org.apache.commons.logging_1.0.4.v200803061811.jar@start, \\\n");
+ builder.append("javax.servlet_2.4.0.v200803061910.jar@start, \\\n");
+ File pluginDir = new File(args[0] + "/osee_server_bundles/plugins");
+ File[] files = pluginDir.listFiles();
+ for (File file : files) {
+ builder.append("plugins/");
+ builder.append(file.getName());
+ builder.append("@start, \\\n");
+ }
+ builder.delete(builder.length() - 4, builder.length() - 1);
+ builder.append("eclipse.ignoreApp=true\n");
+
+ try {
+ FileOutputStream fos = new FileOutputStream(args[0] + "/osee_server_bundles/configuration/config.ini");
+ System.out.println(new File("config.ini").getAbsolutePath());
+ fos.write(builder.toString().getBytes());
+ fos.flush();
+ fos.close();
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/build.properties b/org.eclipse.osee.framework.server.admin/build.properties
new file mode 100644
index 00000000000..d32ac412364
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/build.properties
@@ -0,0 +1,7 @@
+source.. = src/,\
+ ant_src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/,\
+ plugin.xml
diff --git a/org.eclipse.osee.framework.server.admin/buildsupport.jar b/org.eclipse.osee.framework.server.admin/buildsupport.jar
new file mode 100644
index 00000000000..0b891c6c101
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/buildsupport.jar
Binary files differ
diff --git a/org.eclipse.osee.framework.server.admin/config.ini b/org.eclipse.osee.framework.server.admin/config.ini
new file mode 100644
index 00000000000..a518e0825da
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/config.ini
@@ -0,0 +1,31 @@
+osgi.bundles= \
+org.eclipse.equinox.log_1.1.0.v20080303.jar@start, \
+org.eclipse.equinox.app_1.1.0.v20080421-2006.jar@start, \
+org.eclipse.equinox.registry_3.4.0.v20080516-0950.jar@start, \
+org.eclipse.equinox.common_3.4.0.v20080421-2006.jar@start, \
+org.eclipse.equinox.ds_1.0.0.v20080310.jar@start, \
+org.mortbay.jetty_5.1.11.v200803061811.jar@start, \
+org.eclipse.osgi.services_3.1.200.v20071203.jar@start, \
+org.eclipse.equinox.util_1.0.0.v20080303.jar@start, \
+org.eclipse.equinox.http.servlet_1.0.100.v20080201.jar@start, \
+org.eclipse.equinox.http.jetty_1.0.100.v20080303.jar@start, \
+org.apache.commons.logging_1.0.4.v200803061811.jar@start, \
+javax.servlet_2.4.0.v200803061910.jar@start, \
+plugins/lba.db.connection_0.2.0.200805271044.jar@start, \
+plugins/oracle.driver_9.0.17.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.branch.management.servlet_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.branch.management_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.db.connection_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.jdk.core_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.logging_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.common_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.locator.attribute_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.locator.snapshot_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.management.servlet_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.management_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.provider.attribute_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.provider.common_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.resource.provider.snapshot_0.2.0.200805271044.jar@start, \
+plugins/org.eclipse.osee.framework.server.admin_0.2.0.200805271044.jar@start, \
+plugins/org.postgresql.driver_8.2.0.200805271044.jar@start
+eclipse.ignoreApp=true
diff --git a/org.eclipse.osee.framework.server.admin/plugin.xml b/org.eclipse.osee.framework.server.admin/plugin.xml
new file mode 100644
index 00000000000..86c70f6d7ad
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/plugin.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ id="OseeBackup"
+ name="OseeBackup"
+ point="org.eclipse.core.runtime.applications">
+ <application
+ cardinality="singleton-global"
+ thread="main"
+ visible="true">
+ <run
+ class="org.eclipse.osee.framework.server.admin.app.DataStoreBackupApplication">
+ </run>
+ </application>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/Activator.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/Activator.java
new file mode 100644
index 00000000000..3cb3ffc03a3
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/Activator.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.framework.server.admin;
+
+import org.eclipse.osee.framework.branch.management.IBranchExchange;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.search.engine.ISearchEngine;
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+
+ private static Activator instance;
+ private ServiceTracker resourceManagementTracker;
+ private ServiceTracker resourceLocatorManagerTracker;
+ private ServiceTracker searchTaggerTracker;
+ private ServiceTracker searchEngineTracker;
+ private ServiceTracker branchExchangeTracker;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ resourceManagementTracker = new ServiceTracker(context, IResourceManager.class.getName(), null);
+ resourceManagementTracker.open();
+
+ resourceLocatorManagerTracker = new ServiceTracker(context, IResourceLocatorManager.class.getName(), null);
+ resourceLocatorManagerTracker.open();
+
+ searchTaggerTracker = new ServiceTracker(context, ISearchEngineTagger.class.getName(), null);
+ searchTaggerTracker.open();
+
+ searchEngineTracker = new ServiceTracker(context, ISearchEngine.class.getName(), null);
+ searchEngineTracker.open();
+
+ branchExchangeTracker = new ServiceTracker(context, IBranchExchange.class.getName(), null);
+ branchExchangeTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ resourceManagementTracker.close();
+ resourceManagementTracker = null;
+
+ resourceLocatorManagerTracker.close();
+ resourceLocatorManagerTracker = null;
+
+ searchTaggerTracker.close();
+ searchTaggerTracker = null;
+
+ searchEngineTracker.close();
+ searchEngineTracker = null;
+
+ branchExchangeTracker.close();
+ branchExchangeTracker = null;
+ }
+
+ public IResourceManager getResourceManager() {
+ return (IResourceManager) resourceManagementTracker.getService();
+ }
+
+ public IResourceLocatorManager getResourceLocatorManager() {
+ return (IResourceLocatorManager) resourceLocatorManagerTracker.getService();
+ }
+
+ public ISearchEngineTagger getSearchTagger() {
+ return (ISearchEngineTagger) searchTaggerTracker.getService();
+ }
+
+ public ISearchEngine getSearchEngine() {
+ return (ISearchEngine) searchEngineTracker.getService();
+ }
+
+ public IBranchExchange getBranchExchange() {
+ return (IBranchExchange) branchExchangeTracker.getService();
+ }
+
+ public static Activator getInstance() {
+ return Activator.instance;
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BaseCmdWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BaseCmdWorker.java
new file mode 100644
index 00000000000..c34bb903693
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BaseCmdWorker.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.framework.server.admin;
+
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseCmdWorker implements Runnable {
+
+ private CommandInterpreter ci;
+
+ private volatile boolean isRunning;
+ private volatile boolean isVerbose;
+ private volatile boolean isExecutionAllowed;
+
+ protected BaseCmdWorker() {
+ this.isRunning = false;
+ this.isVerbose = true;
+ this.isExecutionAllowed = true;
+ }
+
+ public boolean isRunning() {
+ return isRunning;
+ }
+
+ public void setExecutionAllowed(boolean value) {
+ this.isExecutionAllowed = value;
+ }
+
+ public void setCommandInterpreter(CommandInterpreter ci) {
+ this.ci = ci;
+ }
+
+ public CommandInterpreter getCommandInterpreter() {
+ return this.ci;
+ }
+
+ public boolean isVerbose() {
+ return isVerbose;
+ }
+
+ public void setVerbose(boolean isVerbose) {
+ this.isVerbose = isVerbose;
+ }
+
+ public boolean isExecutionAllowed() {
+ return isExecutionAllowed;
+ }
+
+ protected void println(Object value) {
+ ci.println(value);
+ }
+
+ protected void printStackTrace(Exception ex) {
+ ci.printStackTrace(ex);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ this.isRunning = true;
+ long startTime = System.currentTimeMillis();
+ try {
+ doWork(startTime);
+ } catch (Exception ex) {
+ ci.printStackTrace(ex);
+ }
+ ci.println(String.format("Done. Elapsed Time = %s.", getElapsedTime(startTime)));
+ this.isRunning = false;
+ }
+
+ protected String getElapsedTime(long startTime) {
+ return timeToString(System.currentTimeMillis() - startTime);
+ }
+
+ protected String timeToString(long value) {
+ long leftOverMs = value % 1000;
+ long seconds = value / 1000;
+ long leftOverSeconds = seconds % 60;
+ long minutes = seconds / 60;
+ long leftOverMinutes = minutes % 60;
+ long hours = minutes / 60;
+ return String.format("%d:%02d:%02d.%03d", hours, leftOverMinutes, leftOverSeconds, leftOverMs);
+ }
+
+ protected abstract void doWork(long startTime) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BranchManagementCommandProvider.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BranchManagementCommandProvider.java
new file mode 100644
index 00000000000..1f2ba4b313e
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/BranchManagementCommandProvider.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.server.admin;
+
+import java.io.File;
+import org.eclipse.osee.framework.server.admin.branch.BranchCommands;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+import org.eclipse.osgi.framework.console.CommandProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchManagementCommandProvider implements CommandProvider {
+
+ public void _export_branch(CommandInterpreter ci) {
+ BranchCommands.getInstance().startBranchExport(ci);
+ }
+
+ public void _export_branch_stop(CommandInterpreter ci) {
+ BranchCommands.getInstance().stopBranchExport(ci);
+ }
+
+ public void _import_branch(CommandInterpreter ci) {
+ BranchCommands.getInstance().startBranchImport(ci);
+ }
+
+ public void _import_branch_stop(CommandInterpreter ci) {
+ BranchCommands.getInstance().stopBranchImport(ci);
+ }
+
+ public void _check_exchange(CommandInterpreter ci) {
+ BranchCommands.getInstance().startBranchIntegrityCheck(ci);
+ }
+
+ public void _check_exchange_stop(CommandInterpreter ci) {
+ BranchCommands.getInstance().stopBranchIntegrityCheck(ci);
+ }
+
+ public void _configini(CommandInterpreter ci) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("eclipse.ignoreApp=true\n");
+ sb.append("osgi.bundles= \\\n");
+
+ String arg = ci.nextArgument();
+
+ File folder = new File(arg);
+ File[] files = folder.listFiles();
+ for (File f : files) {
+ if (!f.isDirectory()) {
+ sb.append(f.toURI());
+ sb.append("@start, \\\n");
+ }
+ }
+ System.out.println(sb.toString());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osgi.framework.console.CommandProvider#getHelp()
+ */
+ @Override
+ public String getHelp() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n---OSEE Branch Commands---\n");
+ sb.append(" export_branch <exchangeFileName> [-compress] [-minTx <value>] [-maxTx <value>] [-exclude_baseline_txs] [-includeArchivedBranches][<branchId>]+ - export a specific set of branches into an exchange zip file.\n");
+ sb.append(" export_branch_stop - stop branch export\n");
+ sb.append(" import_branch <exchangeFilePath> [-exclude_baseline_txs] [-allAsRootBranches] [-minTx <value>] [-maxTx <value>] [-clean] [<branchId>]+ - import a specific set of branches from an exchange zip file.\n");
+ sb.append(" check_exchange <exchangeFilePath> - checks an exchange file to ensure data integrity\n");
+ sb.append(" check_exchange_stop - stop exchange integrity check\n");
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/SearchTaggerCommandProvider.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/SearchTaggerCommandProvider.java
new file mode 100644
index 00000000000..317f3a7958f
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/SearchTaggerCommandProvider.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.framework.server.admin;
+
+import java.io.File;
+import org.eclipse.osee.framework.server.admin.search.SearchTaggerCommands;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+import org.eclipse.osgi.framework.console.CommandProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchTaggerCommandProvider implements CommandProvider {
+
+ public void _tag_all(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().startTagAll(ci);
+ }
+
+ public void _tag_all_stop(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().stopTagAll(ci);
+ }
+
+ public void _drop_all_tags(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().startDropAll(ci);
+ }
+
+ public void _drop_all_tags_stop(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().stopDropAll(ci);
+ }
+
+ public void _tagger_stats(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().getTaggerStatistics(ci);
+ }
+
+ public void _tagger_stats_clear(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().clearTaggerStats();
+ }
+
+ public void _search_stats(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().getSearchStatistics(ci);
+ }
+
+ public void _search_stats_clear(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().clearSearchStats();
+ }
+
+ public void _tag(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().startTagItem(ci);
+ }
+
+ public void _tag_stop(CommandInterpreter ci) {
+ SearchTaggerCommands.getInstance().stopTagItem(ci);
+ }
+
+ public void _configini(CommandInterpreter ci) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("eclipse.ignoreApp=true\n");
+ sb.append("osgi.bundles= \\\n");
+
+ String arg = ci.nextArgument();
+
+ File folder = new File(arg);
+ File[] files = folder.listFiles();
+ for (File f : files) {
+ if (!f.isDirectory()) {
+ sb.append(f.toURI());
+ sb.append("@start, \\\n");
+ }
+ }
+ System.out.println(sb.toString());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osgi.framework.console.CommandProvider#getHelp()
+ */
+ @Override
+ public String getHelp() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n---OSEE Search & Tag Commands---\n");
+ sb.append(" tag_all [<branchId>] - tag all attributes in a branch or tag all attributes in all branches if id not specified\n");
+ sb.append(" tag_all_stop - stop tagging all attributes\n");
+ sb.append(" tag [<gammaId> <gammaId> ...]- tag individual item\n");
+ sb.append(" tag_stop - stop tagging individual items\n");
+ sb.append(" drop_all_tags - drops all tags\n");
+ sb.append(" drop_all_tags_stop - stop dropping all tags\n");
+ sb.append(" tagger_stats - get tagger stats\n");
+ sb.append(" tagger_stats_clear - clear tagger stats\n");
+ sb.append(" search_stats - get tagger stats\n");
+ sb.append(" search_stats_clear - clear tagger stats\n");
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/ServerAdminCommandProvider.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/ServerAdminCommandProvider.java
new file mode 100644
index 00000000000..5dca973976b
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/ServerAdminCommandProvider.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.framework.server.admin;
+
+import java.io.File;
+import org.eclipse.osee.framework.server.admin.management.AdminCommands;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+import org.eclipse.osgi.framework.console.CommandProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServerAdminCommandProvider implements CommandProvider {
+
+ // public void _native_content_fix(CommandInterpreter ci) {
+ // CompressedContentFix.getInstance().execute(ci);
+ // }
+ //
+ // public void _native_content_fix_stop(CommandInterpreter ci) {
+ // CompressedContentFix.getInstance().executeStop(ci);
+ // }
+ //
+ // public void _convert(CommandInterpreter ci) {
+ // DataConversion.getInstance().convert(ci);
+ // }
+ //
+ // public void _convertstop(CommandInterpreter ci) {
+ // DataConversion.getInstance().convertStop(ci);
+ // }
+
+ public void _server_status(CommandInterpreter ci) {
+ AdminCommands.getInstance().getServerStatus(ci);
+ }
+
+ public void _server_process_requests(CommandInterpreter ci) {
+ AdminCommands.getInstance().setServletRequestProcessing(ci);
+ }
+
+ public void _add_osee_version(CommandInterpreter ci) {
+ AdminCommands.getInstance().addServerVersion(ci);
+ }
+
+ public void _remove_osee_version(CommandInterpreter ci) {
+ AdminCommands.getInstance().removeServerVersion(ci);
+ }
+
+ public void _osee_version(CommandInterpreter ci) {
+ AdminCommands.getInstance().getServerVersion(ci);
+ }
+
+ public void _configini(CommandInterpreter ci) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("eclipse.ignoreApp=true\n");
+ sb.append("osgi.bundles= \\\n");
+
+ String arg = ci.nextArgument();
+
+ File folder = new File(arg);
+ File[] files = folder.listFiles();
+ for (File f : files) {
+ if (!f.isDirectory()) {
+ sb.append(f.toURI());
+ sb.append("@start, \\\n");
+ }
+ }
+ System.out.println(sb.toString());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osgi.framework.console.CommandProvider#getHelp()
+ */
+ @Override
+ public String getHelp() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n---OSEE Server Admin Commands---\n");
+ sb.append(" server_status - displays server status\n");
+ sb.append(" server_process_requests [true | false]- command servlets to accept/reject requests\n");
+ sb.append(" osee_version - displays the supported osee versions\n");
+ sb.append(" add_osee_version [version string]- add the version string to the list of supported osee versions\n");
+ sb.append(" remove_osee_version [version string]- removes the version string from the list of supported osee versions\n");
+ // sb.append(" native_content_fix - converts some data\n");
+ // sb.append(" native_content_fix_stop - stop the conversion\n");
+ // sb.append(" convert - converts some data\n");
+ // sb.append(" convertstop - stop the conversion\n");
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/app/DataStoreBackupApplication.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/app/DataStoreBackupApplication.java
new file mode 100644
index 00000000000..e436085197c
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/app/DataStoreBackupApplication.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.framework.server.admin.app;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.osee.framework.branch.management.ExportOptions;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+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.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.server.admin.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataStoreBackupApplication implements IApplication {
+ private static final String ALL_BRANCHES_QUERY = "select branch_id from osee_branch";
+
+ public DataStoreBackupApplication() {
+ }
+
+ private List<Integer> getAllBranches() throws OseeDataStoreException {
+ List<Integer> toReturn = new ArrayList<Integer>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(100, ALL_BRANCHES_QUERY);
+ while (chStmt.next()) {
+ toReturn.add(chStmt.getInt("branch_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ private void transferToBackupLocation(IResourceLocator locator, File backupFolder) throws Exception {
+ InputStream inputStream = null;
+ OutputStream outputStream = null;
+ try {
+ IResource resource = Activator.getInstance().getResourceManager().acquire(locator, new Options());
+ inputStream = resource.getContent();
+
+ outputStream = new BufferedOutputStream(new FileOutputStream(new File(backupFolder, resource.getName())));
+
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } finally {
+ if (outputStream != null) {
+ outputStream.flush();
+ outputStream.close();
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
+ */
+ @Override
+ public Object start(IApplicationContext context) throws Exception {
+ try {
+ String backupName = "osee_" + Lib.getDateTimeString();
+
+ Options options = new Options();
+ options.put(ExportOptions.COMPRESS.name(), true);
+
+ List<Integer> branchIds = getAllBranches();
+
+ int totalBranches = branchIds.size();
+ OseeLog.log(Activator.class, Level.INFO, String.format("Exporting [%s] branch%s", totalBranches,
+ totalBranches == 1 ? "" : "es"));
+
+ IResourceLocator exportLocator =
+ Activator.getInstance().getBranchExchange().exportBranch(backupName, options, branchIds);
+
+ OseeLog.log(Activator.class, Level.INFO, String.format("Verifying export file integrity [%s]",
+ exportLocator.getLocation()));
+
+ IResourceLocator exportCheckLocator =
+ Activator.getInstance().getBranchExchange().checkIntegrity(exportLocator);
+ OseeLog.log(Activator.class, Level.INFO, String.format("Verified [%s]", exportCheckLocator.getLocation()));
+
+ OseeLog.log(Activator.class, Level.INFO, String.format("Completed export - [%s] branch%s", totalBranches,
+ totalBranches == 1 ? "" : "es"));
+
+ String backupPath = (String) context.getArguments().get("osee.backup.path");
+ if (Strings.isValid(backupPath)) {
+ if (!backupPath.endsWith(File.separator)) {
+ backupPath = backupPath + File.separator;
+ }
+ File backupFolder = new File(backupPath);
+ backupFolder.mkdirs();
+ transferToBackupLocation(exportLocator, backupFolder);
+ transferToBackupLocation(exportCheckLocator, backupFolder);
+
+ Activator.getInstance().getResourceManager().delete(exportLocator);
+ Activator.getInstance().getResourceManager().delete(exportCheckLocator);
+ }
+ } catch (Throwable ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return IApplication.EXIT_OK;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.equinox.app.IApplication#stop()
+ */
+ @Override
+ public void stop() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchCommands.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchCommands.java
new file mode 100644
index 00000000000..b6c0ca81d57
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchCommands.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.framework.server.admin.branch;
+
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchCommands {
+
+ private static BranchCommands instance = null;
+ private BranchExportWorker branchExportWorker;
+ private BranchImportWorker branchImportWorker;
+ private ExchangeIntegrityWorker integrityWorker;
+
+ public static BranchCommands getInstance() {
+ if (instance == null) {
+ instance = new BranchCommands();
+ }
+ return instance;
+ }
+
+ private BranchCommands() {
+ this.branchExportWorker = new BranchExportWorker();
+ this.branchExportWorker.setExecutionAllowed(true);
+
+ this.branchImportWorker = new BranchImportWorker();
+ this.branchImportWorker.setExecutionAllowed(true);
+
+ this.integrityWorker = new ExchangeIntegrityWorker();
+ this.integrityWorker.setExecutionAllowed(true);
+ }
+
+ public void startBranchExport(CommandInterpreter ci) {
+ if (!this.branchExportWorker.isRunning() && !this.branchImportWorker.isRunning() && !this.integrityWorker.isRunning()) {
+ this.branchExportWorker.setCommandInterpreter(ci);
+ this.branchExportWorker.setExecutionAllowed(true);
+ Thread th = new Thread(branchExportWorker);
+ th.setName("Branch Export");
+ th.start();
+ } else {
+ if (this.branchExportWorker.isRunning()) {
+ ci.println("Branch Export is already running.");
+ }
+ if (this.branchImportWorker.isRunning()) {
+ ci.println("Branch Import is already running.");
+ }
+ if (this.integrityWorker.isRunning()) {
+ ci.println("Branch Integrity Check is already running.");
+ }
+ }
+ }
+
+ public void stopBranchExport(CommandInterpreter ci) {
+ if (this.branchExportWorker.isRunning()) {
+ this.branchExportWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Branch Export is not running.");
+ }
+ }
+
+ public void startBranchImport(CommandInterpreter ci) {
+ if (!this.branchExportWorker.isRunning() && !this.branchImportWorker.isRunning() && !this.integrityWorker.isRunning()) {
+ this.branchImportWorker.setCommandInterpreter(ci);
+ this.branchImportWorker.setExecutionAllowed(true);
+ Thread th = new Thread(branchImportWorker);
+ th.setName("Branch Import");
+ th.start();
+ } else {
+ if (this.branchExportWorker.isRunning()) {
+ ci.println("Branch Export is already running.");
+ }
+ if (this.branchImportWorker.isRunning()) {
+ ci.println("Branch Import is already running.");
+ }
+ if (this.integrityWorker.isRunning()) {
+ ci.println("Branch Integrity Check is already running.");
+ }
+ }
+ }
+
+ public void stopBranchImport(CommandInterpreter ci) {
+ if (this.branchImportWorker.isRunning()) {
+ this.branchImportWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Branch Import is not running.");
+ }
+ }
+
+ public void startBranchIntegrityCheck(CommandInterpreter ci) {
+ if (!this.branchExportWorker.isRunning() && !this.branchImportWorker.isRunning() && !this.integrityWorker.isRunning()) {
+ this.integrityWorker.setCommandInterpreter(ci);
+ this.integrityWorker.setExecutionAllowed(true);
+ Thread th = new Thread(integrityWorker);
+ th.setName("Branch Integrity Check");
+ th.start();
+ } else {
+ if (this.branchExportWorker.isRunning()) {
+ ci.println("Branch Export is already running.");
+ }
+ if (this.branchImportWorker.isRunning()) {
+ ci.println("Branch Import is already running.");
+ }
+ if (this.integrityWorker.isRunning()) {
+ ci.println("Branch Integrity Check is already running.");
+ }
+ }
+ }
+
+ public void stopBranchIntegrityCheck(CommandInterpreter ci) {
+ if (this.integrityWorker.isRunning()) {
+ this.integrityWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Branch Integrity Check is not running.");
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchExportWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchExportWorker.java
new file mode 100644
index 00000000000..117b6cf42a3
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchExportWorker.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.framework.server.admin.branch;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.branch.management.ExportOptions;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchExportWorker extends BaseCmdWorker {
+
+ private static final String ALL_BRANCHES_QUERY =
+ "SELECT x1.branch_id FROM (" +
+ "SELECT br1.branch_id FROM osee_branch br1%s br1.branch_type <> 3 " +
+ "UNION " +
+ "SELECT om1.merge_branch_id FROM osee_merge om1, osee_branch ob1 WHERE om1.dest_branch_id = ob1.branch_id%s " +
+ "UNION " +
+ "SELECT om2.source_branch_id from osee_merge om2, osee_branch ob2 WHERE om2.dest_branch_id = ob2.branch_id%s " +
+ ") x1 ORDER BY x1.branch_id";
+
+ private boolean isValidArg(String arg) {
+ return arg != null && arg.length() > 0;
+ }
+
+ private String getAllBranchesQuery(boolean includeArchivedBranches) {
+ return String.format(ALL_BRANCHES_QUERY, includeArchivedBranches ? " where" : " where br1.archived <> 1 and",
+ includeArchivedBranches ? "" : " and ob1.archived <> 1",
+ includeArchivedBranches ? "" : " and ob2.archived <> 1");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ Options options = new Options();
+ String arg = null;
+ int count = 0;
+ String exportFileName = null;
+ boolean includeArchivedBranches = false;
+ List<Integer> branchIds = new ArrayList<Integer>();
+ do {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ if (arg.equals("-excludeBaselineTxs")) {
+ options.put(ExportOptions.EXCLUDE_BASELINE_TXS.name(), true);
+ } else if (arg.equals("-includeArchivedBranches")) {
+ includeArchivedBranches = true;
+ } else if (arg.equals("-compress")) {
+ options.put(ExportOptions.COMPRESS.name(), true);
+ } else if (arg.equals("-minTx")) {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ options.put(ExportOptions.MIN_TXS.name(), arg);
+ }
+ count++;
+ } else if (arg.equals("-maxTx")) {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ options.put(ExportOptions.MAX_TXS.name(), arg);
+ }
+ count++;
+ } else {
+ if (count == 0 && !arg.startsWith("-")) {
+ exportFileName = arg;
+ } else {
+ branchIds.add(new Integer(arg));
+ }
+ }
+ }
+ count++;
+ } while (isValidArg(arg));
+
+ if (!isValidArg(exportFileName)) {
+ throw new IllegalArgumentException(String.format("exportFileName was invalid: [%s]", exportFileName));
+ }
+
+ if (branchIds.isEmpty()) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(getAllBranchesQuery(includeArchivedBranches));
+ while (chStmt.next()) {
+ branchIds.add(chStmt.getInt("branch_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ println(String.format("Exporting: [%s] branches\n", branchIds.size()));
+
+ Activator.getInstance().getBranchExchange().exportBranch(exportFileName, options, branchIds);
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchImportWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchImportWorker.java
new file mode 100644
index 00000000000..28f96a9fb43
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/BranchImportWorker.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.framework.server.admin.branch;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.branch.management.ImportOptions;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.ResourceLocator;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchImportWorker extends BaseCmdWorker {
+
+ private boolean isValidArg(String arg) {
+ return arg != null && arg.length() > 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ Options options = new Options();
+ String arg = null;
+ int count = 0;
+
+ List<Integer> branchIds = new ArrayList<Integer>();
+ List<File> importFiles = new ArrayList<File>();
+ do {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ if (arg.equals("-excludeBaselineTxs")) {
+ options.put(ImportOptions.EXCLUDE_BASELINE_TXS.name(), true);
+ } else if (arg.equals("-clean")) {
+ options.put(ImportOptions.CLEAN_BEFORE_IMPORT.name(), true);
+ } else if (arg.equals("-allAsRootBranches")) {
+ options.put(ImportOptions.ALL_AS_ROOT_BRANCHES.name(), true);
+ } else if (arg.equals("-minTx")) {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ options.put(ImportOptions.MIN_TXS.name(), arg);
+ }
+ count++;
+ } else if (arg.equals("-maxTx")) {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ options.put(ImportOptions.MAX_TXS.name(), arg);
+ }
+ count++;
+ } else if (count == 0 && !arg.startsWith("-")) {
+ importFiles.add(new File(arg));
+ } else {
+ branchIds.add(new Integer(arg));
+ }
+ count++;
+ }
+ } while (isValidArg(arg));
+
+ if (importFiles.isEmpty()) {
+ throw new IllegalArgumentException("Files to import were not specified");
+ }
+
+ for (File file : importFiles) {
+ if (file == null || !file.exists() || !file.canRead()) {
+ throw new IllegalArgumentException(String.format("File was not accessible: [%s]", file));
+ } else if (file.isFile() && !Lib.isCompressed(file)) {
+ throw new IllegalArgumentException(String.format("Invalid File: [%s]", file));
+ }
+ }
+
+ for (File fileToImport : importFiles) {
+ URI uri = new URI("exchange://" + fileToImport.toURI().toASCIIString());
+ Activator.getInstance().getBranchExchange().importBranch(new ResourceLocator(uri), options, branchIds);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/ExchangeIntegrityWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/ExchangeIntegrityWorker.java
new file mode 100644
index 00000000000..713fee9863c
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/branch/ExchangeIntegrityWorker.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.framework.server.admin.branch;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.resource.management.ResourceLocator;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExchangeIntegrityWorker extends BaseCmdWorker {
+
+ private boolean isValidArg(String arg) {
+ return arg != null && arg.length() > 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ String arg = null;
+ int count = 0;
+ List<File> importFiles = new ArrayList<File>();
+ do {
+ arg = getCommandInterpreter().nextArgument();
+ if (isValidArg(arg)) {
+ if (count == 0 && !arg.startsWith("-")) {
+ importFiles.add(new File(arg));
+ }
+ count++;
+ }
+ } while (isValidArg(arg));
+
+ if (importFiles.isEmpty()) {
+ throw new IllegalArgumentException("File to check was not specified");
+ }
+
+ for (File file : importFiles) {
+ if (file == null || !file.exists() || !file.canRead()) {
+ throw new IllegalArgumentException(String.format("File was not accessible: [%s]", file));
+ } else if (file.isFile() && !Lib.isCompressed(file)) {
+ throw new IllegalArgumentException(String.format("Invalid File: [%s]", file));
+ }
+ }
+
+ for (File fileToImport : importFiles) {
+ URI uri = new URI("exchange://" + fileToImport.toURI().toASCIIString());
+ Activator.getInstance().getBranchExchange().checkIntegrity(new ResourceLocator(uri));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/CompressedContentFix.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/CompressedContentFix.java
new file mode 100644
index 00000000000..d9e14a611ab
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/CompressedContentFix.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.server.admin.conversion;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.resource.management.IResource;
+import org.eclipse.osee.framework.resource.management.IResourceLocator;
+import org.eclipse.osee.framework.resource.management.IResourceLocatorManager;
+import org.eclipse.osee.framework.resource.management.IResourceManager;
+import org.eclipse.osee.framework.resource.management.Options;
+import org.eclipse.osee.framework.resource.management.StandardOptions;
+import org.eclipse.osee.framework.resource.provider.common.resources.CompressedResourceBridge;
+import org.eclipse.osee.framework.resource.provider.common.resources.Streams;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CompressedContentFix {
+
+ private static CompressedContentFix instance = null;
+
+ private static final String FIND_ALL_NATIVE_CONTENT_SQL =
+ "SELECT art1.art_id, art1.human_readable_id, art1.guid, attr1.uri FROM osee_attribute attr1, osee_attribute_type attyp1, osee_artifact art1 WHERE attyp1.NAME = 'Native Content' AND attyp1.attr_type_id = attr1.attr_type_id AND art1.ART_ID = attr1.ART_ID";
+
+ public static CompressedContentFix getInstance() {
+ if (instance == null) {
+ instance = new CompressedContentFix();
+ }
+ return instance;
+ }
+
+ private volatile boolean execute;
+ private volatile boolean isRunning = false;
+ private volatile boolean verbose = true;
+
+ private CompressedContentFix() {
+ }
+
+ public void executeStop(CommandInterpreter ci) {
+ execute = false;
+ }
+
+ public void execute(CommandInterpreter ci) {
+ if (!isRunning) {
+ execute = true;
+ isRunning = true;
+ Thread th = new Thread(new Worker(ci));
+ th.setName("CompressedContentFix");
+ th.start();
+ }
+ }
+
+ private class Worker implements Runnable {
+
+ private CommandInterpreter ci;
+ private IResourceManager resourceManager;
+ private IResourceLocatorManager locatorManager;
+ private Map<Long, String> nativeExtension;
+ private Map<Long, String> nameMap;
+
+ private Worker(CommandInterpreter cmdi) {
+ ci = cmdi;
+ resourceManager = Activator.getInstance().getResourceManager();
+ locatorManager = Activator.getInstance().getResourceLocatorManager();
+ nativeExtension = null;
+ nameMap = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ long time = System.currentTimeMillis();
+ try {
+ initializeData();
+ doWork(time);
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ } finally {
+ clear();
+ }
+ long seconds = (System.currentTimeMillis() - time) / 1000;
+ long leftOverSeconds = seconds % 60;
+ long minutes = seconds / 60;
+ long leftOverMinutes = minutes % 60;
+ long hours = minutes / 60;
+ ci.println(String.format("Done. Elapsed Time = %d:%02d:%02d.", hours, leftOverMinutes, leftOverSeconds));
+ isRunning = false;
+ }
+
+ private void initializeData() throws OseeDataStoreException {
+ nativeExtension = Util.getArtIdMap("Extension");
+ nameMap = Util.getArtIdMap("Name");
+ }
+
+ private void clear() {
+ if (nativeExtension != null) {
+ nativeExtension.clear();
+ nativeExtension = null;
+ }
+
+ if (nameMap != null) {
+ nameMap.clear();
+ nameMap = null;
+ }
+ }
+
+ private void processEntry(long artId, String hrid, String guid, String uri) throws Exception {
+ boolean resourceExists = isResourceAvailable(uri);
+ if (resourceExists) {
+ IResourceLocator locator = locatorManager.getResourceLocator(uri);
+ Options options = new Options();
+ IResource resource = resourceManager.acquire(locator, options);
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ String oldEntryName = getContent(resource, outputStream);
+ String extension = nativeExtension.get(artId);
+ String newEntryName = generateFileName(nameMap.get(artId), hrid, extension);
+
+ byte[] compressed = Lib.compressStream(new ByteArrayInputStream(outputStream.toByteArray()), newEntryName);
+ IResource modifiedResource = new CompressedResourceBridge(compressed, locator.getLocation(), true);
+ options.put(StandardOptions.Overwrite.name(), true);
+ resourceManager.save(locator, modifiedResource, options);
+
+ ci.println(String.format("hrid [%s] uri [%s] fileName[%s] newName[%s] extension[%s]", hrid, uri,
+ oldEntryName, newEntryName, extension));
+ }
+ }
+
+ public String generateFileName(String name, String hrid, String fileTypeExtension) {
+ StringBuilder builder = new StringBuilder();
+ if (name != null && name.length() > 0) {
+ try {
+ if (name.length() > 60) {
+ name = name.substring(0, 60);
+ }
+ builder.append(URLEncoder.encode(name, "UTF-8"));
+ builder.append(".");
+ } catch (Exception ex) {
+ // Do Nothing - this is not important
+ }
+ }
+ builder.append(hrid);
+
+ if (fileTypeExtension != null && fileTypeExtension.length() > 0) {
+ builder.append(".");
+ builder.append(fileTypeExtension);
+ }
+ return builder.toString();
+ }
+
+ private String getContent(IResource resource, OutputStream outputStream) throws IOException {
+ String name = null;
+ InputStream inputStream = null;
+ try {
+ inputStream = resource.getContent();
+ name = Streams.decompressStream(inputStream, outputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ return name;
+ }
+
+ private boolean isResourceAvailable(String uri) throws Exception {
+ boolean resourceExists = false;
+ if (uri != null && uri.length() > 0) {
+ IResourceLocator locator = locatorManager.getResourceLocator(uri);
+ resourceExists = resourceManager.exists(locator);
+ }
+ return resourceExists;
+ }
+
+ private void doWork(long time) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(FIND_ALL_NATIVE_CONTENT_SQL);
+ int count = 0;
+ while (chStmt.next() && execute) {
+ long artId = chStmt.getLong("art_id");
+ String hrid = chStmt.getString("human_readable_id");
+ String guid = chStmt.getString("guid");
+ String uri = chStmt.getString("uri");
+ processEntry(artId, hrid, guid, uri);
+
+ count++;
+ if (count % 100 == 0) {
+ if (verbose) {
+ long seconds = (System.currentTimeMillis() - time) / 1000;
+ long leftOverSeconds = seconds % 60;
+ long minutes = seconds / 60;
+ long leftOverMinutes = minutes % 60;
+ long hours = minutes / 60;
+ ci.println(String.format("%d files processed, Elapsed Time = %d:%02d:%02d.", count, hours,
+ leftOverMinutes, leftOverSeconds));
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/DbResource.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/DbResource.java
new file mode 100644
index 00000000000..f1a6757cde5
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/DbResource.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.server.admin.conversion;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import org.eclipse.osee.framework.resource.management.IResource;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class DbResource implements IResource {
+
+ // private String name = "unknown";
+ private InputStream inputStream;
+ private boolean isCompressed = false;
+ private URI uri;
+ private String hrid;
+ private String artName;
+ private String fileTypeExtension;
+
+ /**
+ * @param binaryStream
+ */
+ public DbResource(InputStream inputStream, String artName, String hrid, String fileTypeExtension) {
+ this.hrid = hrid;
+ this.artName = artName;
+ this.fileTypeExtension = fileTypeExtension;
+ this.inputStream = inputStream;
+ try {
+ uri = new URI("db://");
+ } catch (URISyntaxException ex1) {
+ }
+ if (inputStream.markSupported()) {
+ inputStream.mark(1000);
+ ZipInputStream in = new ZipInputStream(inputStream);
+ // find out if it was compressed
+ try {
+ ZipEntry entry = in.getNextEntry();
+ if (entry == null) {
+ isCompressed = false;
+ } else {
+ // name = entry.getName();
+ isCompressed = true;
+ }
+ } catch (IOException ex) {
+ isCompressed = false;
+ }
+ try {
+ inputStream.reset();
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getContent()
+ */
+ @Override
+ public InputStream getContent() throws IOException {
+ return inputStream;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getLocation()
+ */
+ @Override
+ public URI getLocation() {
+ return uri;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#getName()
+ */
+ @Override
+ public String getName() {
+ return generateFileName(artName, hrid, fileTypeExtension);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.resource.management.IResource#isCompressed()
+ */
+ @Override
+ public boolean isCompressed() {
+ return isCompressed;
+ }
+
+ private String generateFileName(String artName, String hrid, String fileTypeExtension) {
+ StringBuilder builder = new StringBuilder();
+ try {
+ builder.append(URLEncoder.encode(artName, "UTF-8"));
+ builder.append(".");
+ } catch (Exception ex) {
+ // Do Nothing - this is not important
+ }
+ builder.append(hrid);
+
+ if (fileTypeExtension != null && fileTypeExtension.length() > 0) {
+ builder.append(".");
+ builder.append(fileTypeExtension);
+ }
+ return builder.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/Util.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/Util.java
new file mode 100644
index 00000000000..fb7fb441ae3
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/conversion/Util.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.framework.server.admin.conversion;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Util {
+
+ private static final String sqlExtensionTypeId =
+ "Select attrt1.ATTR_TYPE_ID from osee_attribute_type attrt1 where name = ?";
+
+ private static final String sqlExtensionTypes =
+ "SELECT attr1.art_id, attr1.value FROM osee_attribute attr1 WHERE attr1.ATTR_TYPE_ID = ?";
+
+ public static Map<Long, String> getArtIdMap(String attrTypeName) throws OseeDataStoreException {
+ Map<Long, String> toReturn = new HashMap<Long, String>(250);
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ int typeId = ConnectionHandler.runPreparedQueryFetchInt(-1, sqlExtensionTypeId, attrTypeName);
+ chStmt.runPreparedQuery(sqlExtensionTypes, typeId);
+ while (chStmt.next()) {
+ toReturn.put(chStmt.getLong("art_id"), chStmt.getString("value"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AddServerVersionWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AddServerVersionWorker.java
new file mode 100644
index 00000000000..9e2b2577609
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AddServerVersionWorker.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.framework.server.admin.management;
+
+import java.util.Arrays;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AddServerVersionWorker extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ String versionToAdd = getCommandInterpreter().nextArgument();
+ CoreServerActivator.getApplicationServerManager().addSupportedVersion(versionToAdd);
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("Osee Application Server: ");
+ buffer.append(Arrays.deepToString(CoreServerActivator.getApplicationServerManager().getSupportedVersions()));
+ buffer.append("\n");
+ println(buffer.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AdminCommands.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AdminCommands.java
new file mode 100644
index 00000000000..023cabecbb7
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/AdminCommands.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.framework.server.admin.management;
+
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AdminCommands {
+ private static AdminCommands instance = null;
+
+ private ServerShutdownWorker shutdownWorker;
+ private RemoveServerVersionWorker removeServerVersion;
+ private AddServerVersionWorker addServerVersion;
+
+ public static AdminCommands getInstance() {
+ if (instance == null) {
+ instance = new AdminCommands();
+ }
+ return instance;
+ }
+
+ private AdminCommands() {
+ this.shutdownWorker = new ServerShutdownWorker();
+ this.shutdownWorker.setExecutionAllowed(true);
+
+ this.addServerVersion = new AddServerVersionWorker();
+ this.addServerVersion.setExecutionAllowed(true);
+
+ this.removeServerVersion = new RemoveServerVersionWorker();
+ this.removeServerVersion.setExecutionAllowed(true);
+ }
+
+ public void getServerStatus(CommandInterpreter ci) {
+ ServerStats stats = new ServerStats();
+ stats.setCommandInterpreter(ci);
+ stats.setExecutionAllowed(true);
+ Thread th = new Thread(stats);
+ th.setName("Server Statistics");
+ th.start();
+ }
+
+ public void getServerVersion(CommandInterpreter ci) {
+ GetServerVersionWorker serverVersion = new GetServerVersionWorker();
+ serverVersion.setCommandInterpreter(ci);
+ serverVersion.setExecutionAllowed(true);
+ Thread th = new Thread(serverVersion);
+ th.setName("Server Version");
+ th.start();
+ }
+
+ public void addServerVersion(CommandInterpreter ci) {
+ if (!this.removeServerVersion.isRunning()) {
+ this.addServerVersion.setCommandInterpreter(ci);
+ Thread th = new Thread(addServerVersion);
+ th.setName("Add Server Version");
+ th.start();
+ } else {
+ ci.println("Waiting for remove server version");
+ }
+ }
+
+ public void removeServerVersion(CommandInterpreter ci) {
+ if (!this.addServerVersion.isRunning()) {
+ this.removeServerVersion.setCommandInterpreter(ci);
+ Thread th = new Thread(removeServerVersion);
+ th.setName("Remove Server Version");
+ th.start();
+ } else {
+ ci.println("Waiting for add server version");
+ }
+ }
+
+ public void startServerShutdown(CommandInterpreter ci) {
+ if (!this.shutdownWorker.isRunning()) {
+ this.shutdownWorker.setCommandInterpreter(ci);
+ this.shutdownWorker.setExecutionAllowed(true);
+ Thread th = new Thread(shutdownWorker);
+ th.setName("Server Shutdown requested.... please wait");
+ th.start();
+ } else {
+ if (this.shutdownWorker.isRunning()) {
+ ci.println("Waiting for shutdown");
+ }
+ }
+ }
+
+ public void stopServerShutdown(CommandInterpreter ci) {
+ if (this.shutdownWorker.isRunning()) {
+ this.shutdownWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Server shutdown is not running.");
+ }
+ }
+
+ public void setServletRequestProcessing(CommandInterpreter ci) {
+ ServerRequestsWorker worker = new ServerRequestsWorker();
+ worker.setCommandInterpreter(ci);
+ worker.setExecutionAllowed(true);
+ Thread th = new Thread(worker);
+ th.setName("Server Requests");
+ th.start();
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/GetServerVersionWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/GetServerVersionWorker.java
new file mode 100644
index 00000000000..5b759f8c199
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/GetServerVersionWorker.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.framework.server.admin.management;
+
+import java.util.Arrays;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GetServerVersionWorker extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("Osee Application Server: ");
+ buffer.append(Arrays.deepToString(CoreServerActivator.getApplicationServerManager().getSupportedVersions()));
+ buffer.append("\n");
+ println(buffer.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/RemoveServerVersionWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/RemoveServerVersionWorker.java
new file mode 100644
index 00000000000..a47928f25de
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/RemoveServerVersionWorker.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.framework.server.admin.management;
+
+import java.util.Arrays;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RemoveServerVersionWorker extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ String versionToRemove = getCommandInterpreter().nextArgument();
+ CoreServerActivator.getApplicationServerManager().removeSupportedVersion(versionToRemove);
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("Osee Application Server: ");
+ buffer.append(Arrays.deepToString(CoreServerActivator.getApplicationServerManager().getSupportedVersions()));
+ buffer.append("\n");
+ println(buffer.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerRequestsWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerRequestsWorker.java
new file mode 100644
index 00000000000..024323a90a3
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerRequestsWorker.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.framework.server.admin.management;
+
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServerRequestsWorker extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ String value = getCommandInterpreter().nextArgument();
+ CoreServerActivator.getApplicationServerManager().setServletRequestsAllowed(new Boolean(value));
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerShutdownWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerShutdownWorker.java
new file mode 100644
index 00000000000..26181997c6d
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerShutdownWorker.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.framework.server.admin.management;
+
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IApplicationServerManager;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class ServerShutdownWorker extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ IApplicationServerManager manager = CoreServerActivator.getApplicationServerManager();
+ manager.shutdown();
+
+ // TODO - more here!
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerStats.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerStats.java
new file mode 100644
index 00000000000..070cbf27e8f
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/management/ServerStats.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.framework.server.admin.management;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.IApplicationServerManager;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class ServerStats extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ IApplicationServerManager manager = CoreServerActivator.getApplicationServerManager();
+
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("\n----------------------------------------------\n");
+ buffer.append(" Server Stats \n");
+ buffer.append("----------------------------------------------\n");
+ buffer.append("Osee Application Server: ");
+ buffer.append(Arrays.deepToString(CoreServerActivator.getApplicationServerManager().getSupportedVersions()));
+ buffer.append("\n");
+ buffer.append(String.format("Server State: [%s]\n", manager.isSystemIdle() ? "IDLE" : "BUSY"));
+ buffer.append(String.format("Active Threads: [%s]\n", manager.getNumberOfActiveThreads()));
+ buffer.append("Current Tasks: ");
+ List<String> entries = manager.getCurrentProcesses();
+ if (entries.isEmpty()) {
+ buffer.append("[NONE]");
+ } else {
+ buffer.append("\n");
+ for (int index = 0; index < entries.size(); index++) {
+ buffer.append(String.format("[%s] ", index));
+ buffer.append(entries.get(index));
+ if (index + 1 < entries.size()) {
+ buffer.append("\n");
+ }
+ }
+ }
+ println(buffer.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchStats.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchStats.java
new file mode 100644
index 00000000000..960d15f351b
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchStats.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.framework.server.admin.search;
+
+import org.eclipse.osee.framework.search.engine.ISearchStatistics;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class SearchStats extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ ISearchStatistics stats = Activator.getInstance().getSearchEngine().getStatistics();
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("\n----------------------------------------------\n");
+ buffer.append(" Search Stats \n");
+ buffer.append("----------------------------------------------\n");
+ buffer.append(String.format("Total Searches - [%d]\n", stats.getTotalSearches()));
+ buffer.append(String.format("Search Time - avg: [%s] ms - longest: [%s] ms\n", stats.getAverageSearchTime(),
+ stats.getLongestSearchTime()));
+ buffer.append(String.format("Longest Search - %s\n", stats.getLongestSearch()));
+ println(buffer.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchTaggerCommands.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchTaggerCommands.java
new file mode 100644
index 00000000000..b706d306c47
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/SearchTaggerCommands.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.framework.server.admin.search;
+
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osgi.framework.console.CommandInterpreter;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchTaggerCommands {
+
+ private static SearchTaggerCommands instance = null;
+ private TaggerAllWorker tagAllWorker;
+ private TaggerDropAllWorker dropAllWorker;
+ private TagItemWorker tagItemWorker;
+
+ public static SearchTaggerCommands getInstance() {
+ if (instance == null) {
+ instance = new SearchTaggerCommands();
+ }
+ return instance;
+ }
+
+ private SearchTaggerCommands() {
+ this.tagAllWorker = new TaggerAllWorker();
+ this.tagAllWorker.setExecutionAllowed(true);
+
+ this.dropAllWorker = new TaggerDropAllWorker();
+ this.dropAllWorker.setExecutionAllowed(true);
+
+ this.tagItemWorker = new TagItemWorker();
+ this.tagItemWorker.setExecutionAllowed(true);
+ }
+
+ public void startTagItem(CommandInterpreter ci) {
+ if (!this.dropAllWorker.isRunning() && !this.tagAllWorker.isRunning()) {
+ this.tagItemWorker.setCommandInterpreter(ci);
+ this.tagItemWorker.setExecutionAllowed(true);
+ Thread th = new Thread(tagItemWorker);
+ th.setName("Tag Individual Items");
+ th.start();
+ } else {
+ if (this.dropAllWorker.isRunning()) {
+ ci.println("Drop All Tags is running.");
+ }
+ if (this.tagAllWorker.isRunning()) {
+ ci.println("Tag All is running.");
+ }
+ }
+ }
+
+ public void stopTagItem(CommandInterpreter ci) {
+ if (this.tagItemWorker.isRunning()) {
+ this.tagItemWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Tag Item is not running.");
+ }
+ }
+
+ public void startDropAll(CommandInterpreter ci) {
+ if (!this.dropAllWorker.isRunning() && !this.tagAllWorker.isRunning() && !this.tagItemWorker.isRunning()) {
+ this.dropAllWorker.setCommandInterpreter(ci);
+ this.dropAllWorker.setExecutionAllowed(true);
+ Thread th = new Thread(dropAllWorker);
+ th.setName("Drop All Tags");
+ th.start();
+ } else {
+ if (this.dropAllWorker.isRunning()) {
+ ci.println("Drop All Tags is running.");
+ }
+ if (this.tagAllWorker.isRunning()) {
+ ci.println("Tag All is running.");
+ }
+ if (this.tagItemWorker.isRunning()) {
+ ci.println("Tag Item is running.");
+ }
+ }
+ }
+
+ public void stopDropAll(CommandInterpreter ci) {
+ if (this.dropAllWorker.isRunning()) {
+ this.dropAllWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Drop All Tags is not running.");
+ }
+ }
+
+ public void stopTagAll(CommandInterpreter ci) {
+ if (this.tagAllWorker.isRunning()) {
+ this.tagAllWorker.setExecutionAllowed(false);
+ } else {
+ ci.println("Tag All is not running.");
+ }
+ }
+
+ public void startTagAll(CommandInterpreter ci) {
+ if (!this.dropAllWorker.isRunning() && !this.tagAllWorker.isRunning() && !this.tagItemWorker.isRunning()) {
+ this.tagAllWorker.setCommandInterpreter(ci);
+ this.tagAllWorker.setExecutionAllowed(true);
+ Thread th = new Thread(tagAllWorker);
+ th.setName("Tagger All Attributes");
+ th.start();
+ } else {
+ if (this.dropAllWorker.isRunning()) {
+ ci.println("Drop All Tags is running.");
+ }
+ if (this.tagAllWorker.isRunning()) {
+ ci.println("Tag All is running.");
+ }
+ if (this.tagItemWorker.isRunning()) {
+ ci.println("Tag Item is running.");
+ }
+ }
+ }
+
+ public void getTaggerStatistics(CommandInterpreter ci) {
+ TaggerStats stats = new TaggerStats();
+ stats.setCommandInterpreter(ci);
+ stats.setExecutionAllowed(true);
+ Thread th = new Thread(stats);
+ th.setName("Tagger Statistics");
+ th.start();
+ }
+
+ public void clearTaggerStats() {
+ Activator.getInstance().getSearchTagger().clearStatistics();
+ }
+
+ public void getSearchStatistics(CommandInterpreter ci) {
+ SearchStats stats = new SearchStats();
+ stats.setCommandInterpreter(ci);
+ stats.setExecutionAllowed(true);
+ Thread th = new Thread(stats);
+ th.setName("Search Statistics");
+ th.start();
+ }
+
+ public void clearSearchStats() {
+ Activator.getInstance().getSearchEngine().clearStatistics();
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TagItemWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TagItemWorker.java
new file mode 100644
index 00000000000..1bc27d8a03f
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TagItemWorker.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.framework.server.admin.search;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.TagQueueJoinQuery;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.search.engine.TagListenerAdapter;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TagItemWorker extends BaseCmdWorker {
+
+ private TagListener tagListener = null;
+
+ private Set<Long> getGammas() {
+ Set<Long> toReturn = new HashSet<Long>();
+ String arg = null;
+ while ((arg = getCommandInterpreter().nextArgument()) != null) {
+ toReturn.add(new Long(arg));
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#setExecutionAllowed(boolean)
+ */
+ @Override
+ public void setExecutionAllowed(boolean value) {
+ super.setExecutionAllowed(value);
+ if (tagListener != null && !value) {
+ synchronized (tagListener) {
+ tagListener.notify();
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws OseeCoreException {
+ tagListener = null;
+ final Set<Long> toTag = getGammas();
+ if (toTag.isEmpty() != true) {
+ TagQueueJoinQuery joinQuery = JoinUtility.createTagQueueJoinQuery();
+ for (Long item : toTag) {
+ joinQuery.add(item);
+ }
+ joinQuery.store();
+
+ tagListener = new TagListener();
+ Activator.getInstance().getSearchTagger().tagByQueueQueryId(tagListener, joinQuery.getQueryId());
+ synchronized (tagListener) {
+ try {
+ tagListener.wait();
+ } catch (InterruptedException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ if (tagListener.isProcessing()) {
+ joinQuery.delete();
+ }
+
+ } else {
+ println("No Items to Tag.");
+ }
+ }
+
+ private final class TagListener extends TagListenerAdapter {
+ private int joinQuery;
+ private boolean isProcessing;
+
+ public TagListener() {
+ this.isProcessing = true;
+ this.joinQuery = -1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.TagListenerAdapter#onTagQueryIdSubmit(int)
+ */
+ @Override
+ public void onTagQueryIdSubmit(int queryId) {
+ joinQuery = queryId;
+ }
+
+ public boolean isProcessing() {
+ return isProcessing;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onAttributeTagComplete(int, long, int, long)
+ */
+ @Override
+ public void onAttributeTagComplete(int queryId, long gammaId, int totalTags, long processingTime) {
+ if (queryId == joinQuery) {
+ println(String.format("GammaId: [%d] Tags: [%d] Processed In: [%d] ms", gammaId, totalTags, processingTime));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagQueryIdTagComplete(int, long, long)
+ */
+ @Override
+ synchronized public void onTagQueryIdTagComplete(int queryId, long waitTime, long processingTime) {
+ if (queryId == joinQuery) {
+ this.isProcessing = false;
+ this.notify();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onAttributeAddTagEvent(int, long, java.lang.String, long)
+ */
+ @Override
+ public void onAttributeAddTagEvent(int queryId, long gammaId, String word, long codedTag) {
+ if (queryId == joinQuery && isVerbose()) {
+ println(String.format("QueryId: [%d] GammaId: [%d] Word: [%s] Tag: [%d]", queryId, gammaId, word, codedTag));
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerAllWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerAllWorker.java
new file mode 100644
index 00000000000..ea5a6a3a82a
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerAllWorker.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.framework.server.admin.search;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.TagQueueJoinQuery;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.search.engine.TagListenerAdapter;
+import org.eclipse.osee.framework.search.engine.attribute.AttributeDataStore;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class TaggerAllWorker extends BaseCmdWorker {
+ private static final int BATCH_SIZE = 1000;
+
+ private TagProcessListener processor;
+
+ TaggerAllWorker() {
+ super();
+ this.processor = null;
+ }
+
+ private void fetchAndProcessGammas(OseeConnection connection, int branchId, TagProcessListener processor) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(AttributeDataStore.getAllTaggableGammasByBranchQuery(branchId),
+ AttributeDataStore.getAllTaggableGammasByBranchQueryData(branchId));
+ TagQueueJoinQuery joinQuery = JoinUtility.createTagQueueJoinQuery();
+ while (chStmt.next() && isExecutionAllowed()) {
+ long gammaId = chStmt.getLong("gamma_id");
+ joinQuery.add(gammaId);
+ if (joinQuery.size() >= BATCH_SIZE) {
+ processor.storeAndAddQueryId(connection, joinQuery);
+ joinQuery = JoinUtility.createTagQueueJoinQuery();
+ }
+ }
+ processor.storeAndAddQueryId(connection, joinQuery);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ protected void doWork(final long startTime) throws OseeDataStoreException, InterruptedException {
+ OseeConnection connection = OseeDbConnection.getConnection();
+ try {
+ String arg = getCommandInterpreter().nextArgument();
+ int branchId = -1;
+ if (arg != null && arg.length() > 0) {
+ branchId = Integer.parseInt(arg);
+ }
+ println(String.format("Tagging Attributes For: [%s]", branchId > -1 ? "Branch " + branchId : "All Branches"));
+
+ int totalAttributes = AttributeDataStore.getTotalTaggableItems(connection, branchId);
+ processor = new TagProcessListener(startTime, totalAttributes);
+ fetchAndProcessGammas(connection, branchId, processor);
+ if (!processor.isProcessingDone()) {
+ synchronized (processor) {
+ processor.wait();
+ }
+ }
+
+ if (!isExecutionAllowed() && !processor.isProcessingDone()) {
+ processor.cancelProcessing(connection);
+ }
+ processor.printStats();
+ } finally {
+ processor = null;
+ connection.close();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#setExecutionAllowed(boolean)
+ */
+ @Override
+ public void setExecutionAllowed(boolean value) {
+ super.setExecutionAllowed(value);
+ if (!value && processor != null) {
+ synchronized (processor) {
+ processor.notify();
+ }
+ }
+ }
+
+ private final class TagProcessListener extends TagListenerAdapter {
+
+ private final Map<Integer, TagQueueJoinQuery> queryIdMap;
+ private int attributesProcessed;
+ private int queriesProcessed;
+ private long startTime;
+ private int totalAttributes;
+
+ public TagProcessListener(long startTime, int totalAttributes) {
+ this.queryIdMap = Collections.synchronizedMap(new HashMap<Integer, TagQueueJoinQuery>());
+ this.startTime = startTime;
+ this.totalAttributes = totalAttributes;
+ this.attributesProcessed = 0;
+ this.queriesProcessed = 0;
+ }
+
+ /**
+ * @param connection
+ */
+ public void cancelProcessing(OseeConnection connection) {
+ Set<Integer> list = queryIdMap.keySet();
+ int[] toStop = new int[list.size()];
+ int index = 0;
+ for (Integer item : list) {
+ toStop[index] = item;
+ index++;
+ }
+ Activator.getInstance().getSearchTagger().stopTaggingByQueueQueryId(toStop);
+ }
+
+ public void storeAndAddQueryId(OseeConnection connection, TagQueueJoinQuery joinQuery) throws OseeDataStoreException {
+ if (joinQuery.size() > 0) {
+ joinQuery.store(connection);
+ this.queryIdMap.put(joinQuery.getQueryId(), joinQuery);
+ Activator.getInstance().getSearchTagger().tagByQueueQueryId(this, joinQuery.getQueryId());
+ }
+ }
+
+ public boolean isProcessingDone() {
+ return queriesProcessed == totalQueries();
+ }
+
+ public int totalQueries() {
+ int remainder = totalAttributes % 1000;
+ return totalAttributes / 1000 + (remainder > 0 ? 1 : 0);
+ }
+
+ public void printStats() {
+ if (isVerbose()) {
+ println(String.format("QueryIds: [ %d of %d] Attributes: [%d of %d] - Elapsed Time = %s.",
+ queriesProcessed, totalQueries(), attributesProcessed, totalAttributes, getElapsedTime(startTime)));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onItemTagged(int,
+ * long, int, long)
+ */
+ @Override
+ public void onAttributeTagComplete(int queryId, long gammaId, int totalTags, long processingTime) {
+ if (queryIdMap.containsKey(queryId)) {
+ attributesProcessed++;
+ if (attributesProcessed % 1000 == 0) {
+ printStats();
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.search.engine.ITagListener#onTagWorkerEnd(int,
+ * long)
+ */
+ @Override
+ synchronized public void onTagQueryIdTagComplete(int queryId, long waitTime, long processingTime) {
+ TagQueueJoinQuery joinQuery = this.queryIdMap.get(queryId);
+ if (joinQuery != null) {
+ this.queryIdMap.remove(joinQuery);
+ queriesProcessed++;
+ if (isProcessingDone()) {
+ this.notify();
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerDropAllWorker.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerDropAllWorker.java
new file mode 100644
index 00000000000..323574af8a1
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerDropAllWorker.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.framework.server.admin.search;
+
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class TaggerDropAllWorker extends BaseCmdWorker {
+ private static final String TRUNCATE_SQL = "TRUNCATE osee_search_tags";
+ private static final String DELETE_TABLE_SQL = "DELETE FROM osee_search_tags";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#doWork(java.sql.Connection, long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ String deleteSql = null;
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.postgresql)) {
+ deleteSql = TRUNCATE_SQL;
+ } else {
+ deleteSql = DELETE_TABLE_SQL;
+ }
+ ConnectionHandler.runPreparedUpdate(deleteSql);
+ println(String.format("Dropped all tags in %s.", getElapsedTime(startTime)));
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerStats.java b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerStats.java
new file mode 100644
index 00000000000..af4b563c37b
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/src/org/eclipse/osee/framework/server/admin/search/TaggerStats.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.framework.server.admin.search;
+
+import org.eclipse.osee.framework.search.engine.ISearchEngineTagger;
+import org.eclipse.osee.framework.search.engine.ITagItemStatistics;
+import org.eclipse.osee.framework.search.engine.ITaggerStatistics;
+import org.eclipse.osee.framework.server.admin.Activator;
+import org.eclipse.osee.framework.server.admin.BaseCmdWorker;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class TaggerStats extends BaseCmdWorker {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.server.admin.search.BaseCmdWorker#doWork(long)
+ */
+ @Override
+ protected void doWork(long startTime) throws Exception {
+ ISearchEngineTagger tagger = Activator.getInstance().getSearchTagger();
+
+ ITaggerStatistics stats = tagger.getStatistics();
+
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("\n----------------------------------------------\n");
+ buffer.append(" Tagger Stats \n");
+ buffer.append("----------------------------------------------\n");
+ buffer.append(String.format("Query Id Processing Time - avg: [%s] ms - longest: [%s] ms\n",
+ stats.getAverageQueryIdProcessingTime(), stats.getLongestQueryIdProcessingTime()));
+ buffer.append(String.format("Query Id Wait Time - avg: [%s] ms - longest: [%s] ms\n",
+ stats.getAverageQueryIdWaitTime(), stats.getLongestQueryIdWaitTime()));
+
+ buffer.append(String.format("Attribute Processing Time - avg: [%s] ms - longest: [%s] ms\n",
+ stats.getAverageAttributeProcessingTime(), stats.getLongestAttributeProcessingTime()));
+ buffer.append(String.format("Attribute with longest processing time - %s\n", toString(stats.getLongestTask())));
+ buffer.append(String.format("Attribute with most tags - %s\n", toString(stats.getMostTagsTask())));
+ buffer.append(String.format("Total - QueryIds: [%d] Attributes: [%d] Tags: [%d]\n",
+ stats.getTotalQueryIdsProcessed(), stats.getTotalAttributesProcessed(), stats.getTotalTags()));
+ buffer.append(String.format("Total Query Ids Waiting to be Processed - [%d]\n", tagger.getWorkersInQueue()));
+ buffer.append(String.format("Total Query Ids in Tag Queue Table - [%d]\n", stats.getTotalQueryIdsInQueue()));
+ buffer.append(String.format("Total Tags in System - [%d]\n\n", stats.getTagsInSystem()));
+
+ println(buffer.toString());
+ }
+
+ private String toString(ITagItemStatistics task) {
+ return String.format("id: [%d] - processed [%d] tags in [%d] ms", task.getGammaId(), task.getTotalTags(),
+ task.getProcessingTime());
+ }
+}
diff --git a/org.eclipse.osee.framework.server.admin/supportExport.jardesc b/org.eclipse.osee.framework.server.admin/supportExport.jardesc
new file mode 100644
index 00000000000..893709cb6ec
--- /dev/null
+++ b/org.eclipse.osee.framework.server.admin/supportExport.jardesc
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
+<jardesc>
+ <jar path="org.eclipse.osee.framework.server.admin/buildsupport.jar"/>
+ <options buildIfNeeded="true" compress="false" descriptionLocation="/org.eclipse.osee.framework.server.admin/supportExport.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+ <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+ <selectedProjects/>
+ <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+ <sealing sealJar="false">
+ <packagesToSeal/>
+ <packagesToUnSeal/>
+ </sealing>
+ </manifest>
+ <selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
+ <javaElement handleIdentifier="=org.eclipse.osee.framework.server.admin/src"/>
+ <javaElement handleIdentifier="=org.eclipse.osee.framework.server.admin/ant_src"/>
+ </selectedElements>
+</jardesc>
diff --git a/org.eclipse.osee.framework.server.external.feature/.project b/org.eclipse.osee.framework.server.external.feature/.project
new file mode 100644
index 00000000000..454a344c437
--- /dev/null
+++ b/org.eclipse.osee.framework.server.external.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.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.framework.server.external.feature/build.properties b/org.eclipse.osee.framework.server.external.feature/build.properties
new file mode 100644
index 00000000000..82ab19c62d1
--- /dev/null
+++ b/org.eclipse.osee.framework.server.external.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.osee.framework.server.external.feature/feature.xml b/org.eclipse.osee.framework.server.external.feature/feature.xml
new file mode 100644
index 00000000000..2662ffd7915
--- /dev/null
+++ b/org.eclipse.osee.framework.server.external.feature/feature.xml
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.framework.server.external.feature"
+ label="Eclipse OSEE Server External Dependencies Feature (Incubation)"
+ version="1.0.0.qualifier"
+ provider-name="Eclipse.org"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="javax.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.codec"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.httpclient"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.logging"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.app"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.common"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.ds"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.http.jetty"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.http.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.log"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.registry"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.util"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osgi"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osgi.services"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.mortbay.jetty"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="com.lowagie.itext"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.core.runtime"
+ 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.eclipse.equinox.preferences"
+ 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.equinox.launcher"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.update.configurator"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.framework.server.feature/.project b/org.eclipse.osee.framework.server.feature/.project
new file mode 100644
index 00000000000..4b70d54122c
--- /dev/null
+++ b/org.eclipse.osee.framework.server.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.server.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.framework.server.feature/build.properties b/org.eclipse.osee.framework.server.feature/build.properties
new file mode 100644
index 00000000000..dd590faf5ae
--- /dev/null
+++ b/org.eclipse.osee.framework.server.feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ license.html,\
+ osee_32.png,\
+ epl-v10.html
diff --git a/org.eclipse.osee.framework.server.feature/epl-v10.html b/org.eclipse.osee.framework.server.feature/epl-v10.html
new file mode 100644
index 00000000000..ed4b196655e
--- /dev/null
+++ b/org.eclipse.osee.framework.server.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.framework.server.feature/feature.xml b/org.eclipse.osee.framework.server.feature/feature.xml
new file mode 100644
index 00000000000..a5b9c094919
--- /dev/null
+++ b/org.eclipse.osee.framework.server.feature/feature.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.framework.server.feature"
+ label="Eclipse OSEE Server Feature (Incubation)"
+ version="1.0.0.qualifier"
+ provider-name="Eclipse.org"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <includes
+ id="org.eclipse.osee.framework.server.external.feature"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.artifact.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.branch.management"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.branch.management.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.client.info.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.resource.locator.attribute"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.resource.management"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.resource.management.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.resource.provider.attribute"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.resource.provider.common"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.search.engine"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.search.engine.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.server.admin"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.server.lookup.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.session.management.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.core.server"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.db.connection"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.jdk.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.logging"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.oracle"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.postgresql"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.osgi"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.manager.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.framework.server.feature/license.html b/org.eclipse.osee.framework.server.feature/license.html
new file mode 100644
index 00000000000..c6af966b61e
--- /dev/null
+++ b/org.eclipse.osee.framework.server.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.framework.server.feature/osee_32.png b/org.eclipse.osee.framework.server.feature/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.framework.server.feature/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/.classpath b/org.eclipse.osee.framework.server.lookup.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/.project b/org.eclipse.osee.framework.server.lookup.servlet/.project
new file mode 100644
index 00000000000..9fb414c8f4a
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.server.lookup.servlet</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.server.lookup.servlet/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..065ae5966c9
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Tue Oct 28 15:41:49 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..ae7469542ea
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Tue Oct 28 15:41:49 MST 2008
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.server.lookup.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..1703fd49058
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Servlet Lookup Servlet Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.server.lookup.servlet
+Bundle-Version: 0.5.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.server.lookup.servlet.ServerLookupActivator
+Bundle-Vendor: Boeing
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework,
+ org.osgi.util.tracker
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/build.properties b/org.eclipse.osee.framework.server.lookup.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupActivator.java b/org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupActivator.java
new file mode 100644
index 00000000000..fcc3726f12b
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupActivator.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.framework.server.lookup.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class ServerLookupActivator implements BundleActivator {
+
+ private OseeHttpServiceTracker httpTracker;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ httpTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.LOOKUP_CONTEXT, ServerLookupServlet.class);
+ httpTracker.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ httpTracker.close();
+ httpTracker = null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupServlet.java b/org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupServlet.java
new file mode 100644
index 00000000000..0e333c106ce
--- /dev/null
+++ b/org.eclipse.osee.framework.server.lookup.servlet/src/org/eclipse/osee/framework/server/lookup/servlet/ServerLookupServlet.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.framework.server.lookup.servlet;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.data.OseeServerInfo;
+import org.eclipse.osee.framework.core.server.CoreServerActivator;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+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;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServerLookupServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = -7055381632202456561L;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.OseeHttpServlet#checkAccessControl(javax.servlet.http.HttpServletRequest)
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ // Allow access to all
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ String version = request.getParameter("version");
+ boolean wasBadRequest = false;
+
+ OseeServerInfo info = null;
+ if (Strings.isValid(version)) {
+ version = version.trim();
+ info = CoreServerActivator.getApplicationServerLookup().getServerInfoBy(version);
+ } else {
+ wasBadRequest = true;
+ }
+
+ if (info == null) {
+ response.setStatus(wasBadRequest ? HttpServletResponse.SC_BAD_REQUEST : HttpServletResponse.SC_NO_CONTENT);
+ response.setContentType("txt/plain");
+ response.getWriter().write(
+ String.format("Unable to locate application server matching - [%s]", request.toString()));
+ response.getWriter().flush();
+ response.getWriter().close();
+ } else {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ info.write(stream);
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("application/xml");
+ response.setCharacterEncoding("UTF-8");
+ response.setContentLength(stream.size());
+ Lib.inputStreamToOutputStream(new ByteArrayInputStream(stream.toByteArray()), response.getOutputStream());
+ response.getOutputStream().flush();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(ServerLookupActivator.class, Level.SEVERE, String.format(
+ "Failed to process application server lookup request [%s]", request.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ boolean isRegistrationToLookupTableRequested = Boolean.valueOf(request.getParameter("registerToLookup"));
+ if (isRegistrationToLookupTableRequested) {
+ boolean wasSuccessful = CoreServerActivator.getApplicationServerManager().executeLookupRegistration();
+ response.setStatus(wasSuccessful ? HttpServletResponse.SC_ACCEPTED : HttpServletResponse.SC_CONFLICT);
+ response.setContentType("txt/plain");
+ response.getWriter().write(
+ String.format("Registration into server lookup was a [%s]", wasSuccessful ? "success" : "failure"));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(ServerLookupActivator.class, Level.SEVERE, String.format(
+ "Failed to process application server lookup request [%s]", request.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ }
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+}
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/.classpath b/org.eclipse.osee.framework.session.management.servlet.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/.project b/org.eclipse.osee.framework.session.management.servlet.test/.project
new file mode 100644
index 00000000000..54f784e290c
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.session.management.servlet.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.session.management.servlet.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..552ac337d34
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Wed Oct 01 10:13:13 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..94c91ef8a03
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Wed Oct 01 10:13:13 MST 2008
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.session.management.servlet.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..ac21477e1fe
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Session Management Servlet Test Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.session.management.servlet.test
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.session.management.servlet.test.SessionManagementTestsActivator
+Bundle-Vendor: Boeing
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: junit.framework,
+ org.osgi.framework
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/build.properties b/org.eclipse.osee.framework.session.management.servlet.test/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/AllSessionTests.java b/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/AllSessionTests.java
new file mode 100644
index 00000000000..120cc1c3464
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/AllSessionTests.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.framework.session.management.servlet.test;
+
+import junit.framework.TestSuite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AllSessionTests extends TestSuite {
+
+ public AllSessionTests() {
+ addTestSuite(TestSessionManagement.class);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/SessionManagementTestsActivator.java b/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/SessionManagementTestsActivator.java
new file mode 100644
index 00000000000..fba7123c5ca
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/SessionManagementTestsActivator.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.framework.session.management.servlet.test;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class SessionManagementTestsActivator implements BundleActivator {
+ private static SessionManagementTestsActivator instance = null;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/TestSessionManagement.java b/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/TestSessionManagement.java
new file mode 100644
index 00000000000..fc0de0ab307
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet.test/src/org/eclipse/osee/framework/session/management/servlet/test/TestSessionManagement.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.framework.session.management.servlet.test;
+
+import junit.framework.TestCase;
+
+/**
+ * Application Server Test
+ *
+ * @author Roberto E. Escobar
+ */
+public class TestSessionManagement extends TestCase {
+
+ public void testOne() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.session.management.servlet/.classpath b/org.eclipse.osee.framework.session.management.servlet/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.session.management.servlet/.project b/org.eclipse.osee.framework.session.management.servlet/.project
new file mode 100644
index 00000000000..59050366e5a
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.session.management.servlet</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.session.management.servlet/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..174f2c07578
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Wed Oct 01 10:10:42 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..4e5a8c0f79a
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Wed Oct 01 10:10:42 MST 2008
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osee.framework.session.management.servlet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.session.management.servlet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..37f333178eb
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Session Management Servlet Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.session.management.servlet
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.session.management.servlet.SessionManagementServletActivator
+Bundle-Vendor: Boeing
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.servlet,
+ javax.servlet.http,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.server,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework,
+ org.osgi.util.tracker
diff --git a/org.eclipse.osee.framework.session.management.servlet/build.properties b/org.eclipse.osee.framework.session.management.servlet/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionClientLoopbackServlet.java b/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionClientLoopbackServlet.java
new file mode 100644
index 00000000000..0c9045fd4a2
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionClientLoopbackServlet.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.session.management.servlet;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.data.OseeSession;
+import org.eclipse.osee.framework.core.server.ISessionManager;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.core.server.SessionData;
+import org.eclipse.osee.framework.core.server.SessionData.SessionState;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SessionClientLoopbackServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = 6402608843937837246L;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.OseeHttpServlet#checkAccessControl(javax.servlet.http.HttpServletRequest)
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ // Open to All;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ int remotePort = getSessionPort(request);
+ response.setContentType("text/plain");
+ String url = null;
+ if (remotePort > -1) {
+ // Session found - redirect to client.
+ url = String.format("http://%s:%s/%s", request.getRemoteAddr(), remotePort, getLoopbackPostfix(request));
+ } else {
+ // No session found - redirect to web browser request handler.
+ url =
+ String.format("http://%s:%s/%s?%s", getNormalizedAddress(request.getLocalAddr()),
+ request.getLocalPort(), OseeServerContext.ARTIFACT_CONTEXT, request.getQueryString());
+ }
+ response.sendRedirect(url);
+ } catch (Exception ex) {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, String.format(
+ "Error processing request [%s]", request.getQueryString()));
+ } finally {
+ response.flushBuffer();
+ }
+ }
+
+ private String getRemoteHostUrl(OseeSession session) {
+ String clientAddress = session.getClientAddress();
+ try {
+ if (Arrays.equals(InetAddress.getByName(clientAddress).getAddress(), InetAddress.getLocalHost().getAddress())) {
+ clientAddress = "localhost";
+ }
+ } catch (UnknownHostException ex) {
+ OseeLog.log(SessionManagementServletActivator.class, Level.SEVERE, ex);
+ }
+ return String.format("http://%s:%s/", clientAddress, session.getPort());
+ }
+
+ private String getLoopbackPostfix(HttpServletRequest request) throws UnsupportedEncodingException {
+ StringBuffer buffer = new StringBuffer();
+ String context = "";
+ Enumeration<?> enumeration = request.getParameterNames();
+ int count = 0;
+ while (enumeration.hasMoreElements()) {
+ Object object = enumeration.nextElement();
+ if (object instanceof String) {
+ String key = (String) object;
+ if (!key.equals("sessionId")) {
+ String value = request.getParameter(key);
+ if (Strings.isValid(value)) {
+ if (key.equals("context")) {
+ context = value;
+ if (context.startsWith("/")) {
+ context = context.substring(1, context.length());
+ }
+ } else {
+ if (count != 0) {
+ buffer.append("&");
+ }
+ buffer.append(key);
+ buffer.append("=");
+ buffer.append(URLEncoder.encode(value, "UTF-8"));
+ count++;
+ }
+ }
+ }
+ }
+ }
+ if (buffer.length() > 0) {
+ buffer.insert(0, '?');
+ }
+ return String.format("%s%s", context, buffer.toString());
+ }
+
+ private boolean canConnect(String urlString) throws IOException {
+ boolean canConnect = false;
+ HttpURLConnection connection = null;
+ try {
+ URL url = new URL(urlString);
+ connection = (HttpURLConnection) url.openConnection();
+ connection.connect();
+ canConnect = true;
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ return canConnect;
+ }
+
+ private String getNormalizedAddress(String remoteAddress) throws UnknownHostException {
+ if (remoteAddress.equals("127.0.0.1") || remoteAddress.equals("localhost")) {
+ remoteAddress = InetAddress.getLocalHost().getHostAddress();
+ }
+ return remoteAddress;
+ }
+
+ private boolean isSessionValid(SessionData session) {
+ boolean result = false;
+ if (session.getSessionState() != SessionState.DELETED) {
+ try {
+ String urlString = getRemoteHostUrl(session.getSession());
+ result = canConnect(urlString);
+ } catch (Exception ex) {
+ }
+ }
+ return result;
+ }
+
+ private int getSessionPort(HttpServletRequest request) throws UnknownHostException {
+ String remoteAddress = getNormalizedAddress(request.getRemoteAddr());
+ String sessionId = request.getParameter("sessionId");
+
+ ISessionManager sessionManager = SessionManagementServletActivator.getSessionManager();
+ SessionData sessionData = null;
+ if (Strings.isValid(sessionId)) {
+ sessionData = sessionManager.getSessionById(sessionId);
+ if (sessionData != null) {
+ if (!sessionData.getSession().getClientAddress().equals(remoteAddress) || !isSessionValid(sessionData)) {
+ sessionData = null;
+ }
+ }
+ }
+
+ if (sessionData == null) {
+ List<SessionData> sessions = sessionManager.getSessionByClientAddress(remoteAddress);
+ if (sessions.size() > 0) {
+ for (int index = 0; index < sessions.size(); index++) {
+ SessionData session = sessions.get(index);
+ if (sessionData == null) {
+ if (isSessionValid(session)) {
+ sessionData = session;
+ }
+ } else {
+ if (sessionData.getSession().getLastInteractionDate().getTime() < session.getSession().getLastInteractionDate().getTime()) {
+ if (isSessionValid(session)) {
+ sessionData = session;
+ }
+ }
+ }
+ }
+ }
+ }
+ return sessionData != null ? sessionData.getSession().getPort() : -1;
+ }
+}
diff --git a/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServlet.java b/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServlet.java
new file mode 100644
index 00000000000..592762d98a9
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServlet.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.framework.session.management.servlet;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.logging.Level;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.OseeSessionGrant;
+import org.eclipse.osee.framework.core.server.ISessionManager;
+import org.eclipse.osee.framework.core.server.OseeHttpServlet;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SessionManagementServlet extends OseeHttpServlet {
+
+ private static final long serialVersionUID = 3334123351267606890L;
+
+ private static enum OperationType {
+ CREATE, RELEASE, INVALID;
+
+ public static OperationType fromString(String value) {
+ OperationType toReturn = OperationType.INVALID;
+ for (OperationType operType : OperationType.values()) {
+ if (operType.name().equalsIgnoreCase(value)) {
+ toReturn = operType;
+ break;
+ }
+ }
+ return toReturn;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.server.OseeHttpServlet#checkAccessControl(javax.servlet.http.HttpServletRequest)
+ */
+ @Override
+ protected void checkAccessControl(HttpServletRequest request) throws OseeCoreException {
+ // Allow access to all
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ try {
+ String[] protocols = SessionManagementServletActivator.getAuthenticationManager().getProtocols();
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.setContentType("text/plain");
+ response.setCharacterEncoding("UTF-8");
+ response.getWriter().write(Arrays.deepToString(protocols));
+ } catch (Exception ex) {
+ OseeLog.log(SessionManagementServletActivator.class, Level.SEVERE, String.format(
+ "Error processing request for protocols [%s]", request.toString()), ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ response.setContentType("text/plain");
+ response.getWriter().write(Lib.exceptionToString(ex));
+ } finally {
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ String operation = request.getParameter("operation");
+ try {
+ OperationType operationType = OperationType.fromString(operation);
+ switch (operationType) {
+ case CREATE:
+ createSession(request, response);
+ break;
+ case RELEASE:
+ releaseSession(request, response);
+ break;
+ default:
+ break;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SessionManagementServletActivator.class, Level.SEVERE, String.format(
+ "Error processing session request [%s]", request.toString()), ex);
+ response.getWriter().write(Lib.exceptionToString(ex));
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+ }
+
+ private void createSession(HttpServletRequest request, HttpServletResponse response) throws OseeCoreException {
+ try {
+ ISessionManager manager = SessionManagementServletActivator.getSessionManager();
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ Lib.inputStreamToOutputStream(request.getInputStream(), outputStream);
+ byte[] bytes = outputStream.toByteArray();
+ // TODO Decrypt credential info
+
+ OseeCredential credential = OseeCredential.fromXml(new ByteArrayInputStream(bytes));
+ OseeSessionGrant oseeSessionGrant = manager.createSession(credential);
+
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
+ oseeSessionGrant.write(byteOutputStream);
+
+ // TODO after encrypted these will need to change
+ response.setContentType("application/xml");
+ response.setCharacterEncoding("UTF-8");
+ response.setContentLength(byteOutputStream.size());
+ Lib.inputStreamToOutputStream(new ByteArrayInputStream(byteOutputStream.toByteArray()),
+ response.getOutputStream());
+
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ try {
+ response.getOutputStream().flush();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+
+ private void releaseSession(HttpServletRequest request, HttpServletResponse response) throws OseeCoreException {
+ try {
+ ISessionManager manager = SessionManagementServletActivator.getSessionManager();
+ String sessionId = request.getParameter("sessionId");
+ manager.releaseSession(sessionId);
+ response.setStatus(HttpServletResponse.SC_ACCEPTED);
+ response.setContentType("text/plain");
+ response.getWriter().write(String.format("Session [%s] released.", sessionId));
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ try {
+ response.getWriter().flush();
+ response.getWriter().close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServletActivator.java b/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServletActivator.java
new file mode 100644
index 00000000000..33eb9d8baa1
--- /dev/null
+++ b/org.eclipse.osee.framework.session.management.servlet/src/org/eclipse/osee/framework/session/management/servlet/SessionManagementServletActivator.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.framework.session.management.servlet;
+
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.server.IAuthenticationManager;
+import org.eclipse.osee.framework.core.server.ISessionManager;
+import org.eclipse.osee.framework.core.server.OseeHttpServiceTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class SessionManagementServletActivator implements BundleActivator {
+
+ private static SessionManagementServletActivator instance;
+ private OseeHttpServiceTracker httpServiceTracker;
+ private OseeHttpServiceTracker httpServiceTracker1;
+ private ServiceTracker serviceTracker;
+ private ServiceTracker authenticationServiceTracker;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+
+ serviceTracker = new ServiceTracker(context, ISessionManager.class.getName(), null);
+ serviceTracker.open();
+
+ authenticationServiceTracker = new ServiceTracker(context, IAuthenticationManager.class.getName(), null);
+ authenticationServiceTracker.open();
+
+ httpServiceTracker =
+ new OseeHttpServiceTracker(context, OseeServerContext.SESSION_CONTEXT, SessionManagementServlet.class);
+ httpServiceTracker.open();
+
+ httpServiceTracker1 =
+ new OseeHttpServiceTracker(context, OseeServerContext.CLIENT_LOOPBACK_CONTEXT,
+ SessionClientLoopbackServlet.class);
+ httpServiceTracker1.open();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ if (httpServiceTracker != null) {
+ httpServiceTracker.close();
+ httpServiceTracker = null;
+ }
+
+ if (httpServiceTracker1 != null) {
+ httpServiceTracker1.close();
+ httpServiceTracker1 = null;
+ }
+
+ if (serviceTracker != null) {
+ serviceTracker.close();
+ serviceTracker = null;
+ }
+
+ if (authenticationServiceTracker != null) {
+ authenticationServiceTracker.close();
+ authenticationServiceTracker = null;
+ }
+
+ instance = null;
+ }
+
+ public static ISessionManager getSessionManager() {
+ return (ISessionManager) instance.serviceTracker.getService();
+ }
+
+ public static IAuthenticationManager getAuthenticationManager() {
+ return (IAuthenticationManager) instance.authenticationServiceTracker.getService();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/.classpath b/org.eclipse.osee.framework.skynet.core.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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.skynet.core.test/.project b/org.eclipse.osee.framework.skynet.core.test/.project
new file mode 100644
index 00000000000..db3800f43e0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.skynet.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.framework.skynet.core.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.skynet.core.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..1a996ae57e4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Sat May 23 09:15:42 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.skynet.core.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.skynet.core.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..86e799baee4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test2 Fragment
+Bundle-SymbolicName: org.eclipse.osee.framework.skynet.core.test;singleton:=true
+Bundle-Version: 1.0.0
+Fragment-Host: org.eclipse.osee.framework.skynet.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.junit4,
+ org.eclipse.osee.support.test.util;bundle-version="1.0.0"
+Export-Package: org.eclipse.osee.framework.skynet.core.test,
+ org.eclipse.osee.framework.skynet.core.test.cases,
+ org.eclipse.osee.framework.skynet.core.test.util
diff --git a/org.eclipse.osee.framework.skynet.core.test/build.properties b/org.eclipse.osee.framework.skynet.core.test/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Demo_Suite.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Demo_Suite.java
new file mode 100644
index 00000000000..2c8d133c2e7
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Demo_Suite.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.framework.skynet.core.test;
+
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.skynet.core.test.cases.ArtifactPurgeTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.Artifact_setAttributeValues;
+import org.eclipse.osee.framework.skynet.core.test.cases.BranchPurgeTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.ChangeManagerTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.ConflictTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.CsvArtifactTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.NativeArtifactTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.OseeEnumTypeManagerTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.RelationDeletionTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.SevereLogMonitorTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.StaticIdManagerTest;
+import org.eclipse.osee.framework.skynet.core.test.cases.BranchStateTest;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {ArtifactPurgeTest.class, BranchPurgeTest.class, Artifact_setAttributeValues.class,
+ CsvArtifactTest.class, NativeArtifactTest.class, OseeEnumTypeManagerTest.class, ConflictTest.class,
+ ChangeManagerTest.class, SevereLogMonitorTest.class, RelationDeletionTest.class, StaticIdManagerTest.class,
+ BranchStateTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkCore_Demo_Suite {
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertTrue("Demo Application Server must be running.",
+ ClientSessionManager.getAuthenticationProtocols().contains("demo"));
+ assertTrue("Client must authenticate using demo protocol",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Production_Suite.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Production_Suite.java
new file mode 100644
index 00000000000..b68949c019d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/FrameworkCore_Production_Suite.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.framework.skynet.core.test;
+
+import static org.junit.Assert.assertFalse;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.skynet.core.test.cases.ArtifactQueryPerformanceTests;
+import org.eclipse.osee.framework.skynet.core.test.cases.ArtifactQueryTest;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {ArtifactQueryPerformanceTests.class, ArtifactQueryTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkCore_Production_Suite {
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertFalse("Application Server must be running.", ClientSessionManager.getAuthenticationProtocols().contains(
+ "demo"));
+ assertFalse("Client can't authenticate using demo protocol",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactPurgeTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactPurgeTest.java
new file mode 100644
index 00000000000..eed82bf5460
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactPurgeTest.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.test.util.FrameworkTestUtil;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.DbUtil;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+/**
+ * This test is intended to be run against a demo database. It tests the purge logic by counting the rows of the version
+ * and txs tables, createing artifacts, changing them and then purging them. If it works properly, all rows should be
+ * equal.
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactPurgeTest {
+
+ private static SevereLoggingMonitor monitorLog;
+ private Map<String, Integer> preCreateArtifactsCount;
+ private Map<String, Integer> postCreateArtifactsCount;
+ private Map<String, Integer> postPurgeCount;
+
+ private static final List<String> tables =
+ Arrays.asList("osee_attribute", "osee_artifact", "osee_relation_link", "osee_tx_details", "osee_txs",
+ "osee_artifact_version", "osee_branch_delete_helper");
+
+ @BeforeClass
+ public static void testInitialize() throws Exception {
+ monitorLog = TestUtil.severeLoggingStart();
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(TestUtil.isProductionDb());
+ preCreateArtifactsCount = new HashMap<String, Integer>();
+ postCreateArtifactsCount = new HashMap<String, Integer>();
+ postPurgeCount = new HashMap<String, Integer>();
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ if (preCreateArtifactsCount != null) {
+ preCreateArtifactsCount.clear();
+ preCreateArtifactsCount = null;
+ }
+ if (postCreateArtifactsCount != null) {
+ postCreateArtifactsCount.clear();
+ postCreateArtifactsCount = null;
+ }
+ if (postPurgeCount != null) {
+ postPurgeCount.clear();
+ postPurgeCount = null;
+ }
+ }
+
+ @AfterClass
+ public static void testCleanup() throws Exception {
+ TestUtil.severeLoggingEnd(monitorLog);
+ }
+
+ @org.junit.Test
+ public void testPurgeArtifacts() throws Exception {
+ // Count rows in tables prior to purge
+ DbUtil.getTableRowCounts(preCreateArtifactsCount, tables);
+
+ Set<Artifact> artsToPurge = new HashSet<Artifact>();
+
+ // Create some software artifacts
+ Branch branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_2.name());
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ Collection<Artifact> softArts =
+ FrameworkTestUtil.createSimpleArtifacts(Requirements.SOFTWARE_REQUIREMENT, 10, getClass().getSimpleName(),
+ branch);
+ for (Artifact softArt : softArts) {
+ softArt.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+
+ // make more changes to artifacts
+ for (Artifact softArt : softArts) {
+ softArt.addAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, getClass().getSimpleName());
+ softArt.persistAttributesAndRelations();
+ }
+
+ // Count rows and check that increased
+ DbUtil.getTableRowCounts(postCreateArtifactsCount, tables);
+ TestUtil.checkThatIncreased(preCreateArtifactsCount, postCreateArtifactsCount);
+
+ // Purge
+ ArtifactPersistenceManager.purgeArtifacts(artsToPurge);
+
+ // Count rows and check that same as when began
+ DbUtil.getTableRowCounts(postPurgeCount, tables);
+ // TODO Looks like attributes created after initial artifact creation are not getting purged. Needs Fix.
+ TestUtil.checkThatEqual(preCreateArtifactsCount, postPurgeCount);
+
+ }
+
+ @org.junit.Test
+ public void testPurgeArtifactFromBranch() throws Exception {
+ // Count rows in tables prior to purge
+ DbUtil.getTableRowCounts(preCreateArtifactsCount, tables);
+
+ // Create some software artifacts
+ Branch branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_2.name());
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ Artifact softArt =
+ FrameworkTestUtil.createSimpleArtifact(Requirements.SOFTWARE_REQUIREMENT, getClass().getSimpleName(),
+ branch);
+ softArt.persistAttributesAndRelations(transaction);
+ transaction.execute();
+
+ // make more changes to artifact
+ softArt.addAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, getClass().getSimpleName());
+ softArt.persistAttributesAndRelations();
+
+ // Count rows and check that increased
+ DbUtil.getTableRowCounts(postCreateArtifactsCount, tables);
+ TestUtil.checkThatIncreased(preCreateArtifactsCount, postCreateArtifactsCount);
+
+ // Purge artifact
+ ArtifactPersistenceManager.purgeArtifactFromBranch(OseeDbConnection.getConnection(), branch.getBranchId(),
+ softArt.getArtId());
+
+ // Count rows and check that same as when began
+ DbUtil.getTableRowCounts(postPurgeCount, tables);
+ // TODO Looks like attributes created after initial artifact creation are not getting purged. Needs Fix.
+ TestUtil.checkThatEqual(preCreateArtifactsCount, postPurgeCount);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryPerformanceTests.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryPerformanceTests.java
new file mode 100644
index 00000000000..a79d77dd833
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryPerformanceTests.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import static org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad.FULL;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder;
+import org.eclipse.osee.framework.skynet.core.artifact.search.QueryType;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+public class ArtifactQueryPerformanceTests {
+
+ /* constructors to test
+
+ no good way to get id's for test so we son't test these two.
+
+ public ArtifactQueryBuilder(int artId, Branch branch, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(null, artId, null, null, null, branch, allowDeleted, loadLevel, true);
+ }
+ public ArtifactQueryBuilder(Collection<Integer> artifactIds, Branch branch, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(artifactIds, 0, null, null, null, branch, allowDeleted, loadLevel, true);
+ emptyCriteria = artifactIds.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(Branch branch, ArtifactLoad loadLevel, boolean allowDeleted, AbstractArtifactSearchCriteria... criteria) {
+ this(null, 0, null, null, null, branch, allowDeleted, loadLevel, true, criteria);
+ emptyCriteria = criteria.length == 0;
+ }
+
+ public ArtifactQueryBuilder(Branch branch, ArtifactLoad loadLevel, List<AbstractArtifactSearchCriteria> criteria) {
+ this(null, 0, null, null, null, branch, false, loadLevel, true, toArray(criteria));
+ emptyCriteria = criteria.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(ArtifactType artifactType, Branch branch, ArtifactLoad loadLevel, AbstractArtifactSearchCriteria... criteria) {
+ this(null, 0, null, null, Arrays.asList(artifactType), branch, false, loadLevel, true, criteria);
+ emptyCriteria = criteria.length == 0;
+ }
+
+ public ArtifactQueryBuilder(ArtifactType artifactType, Branch branch, ArtifactLoad loadLevel, List<AbstractArtifactSearchCriteria> criteria) {
+ this(null, 0, null, null, Arrays.asList(artifactType), branch, false, loadLevel, true, toArray(criteria));
+ emptyCriteria = criteria.size() == 0;
+ }
+ */
+
+ @org.junit.Test
+ public void testGetArtifactByHRID() throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ Artifact art = ArtifactQuery.getDefaultHierarchyRootArtifact(common);
+ ArtifactQueryBuilder builder = new ArtifactQueryBuilder(art.getHumanReadableId(), common, true, FULL);
+ long startTime = System.currentTimeMillis();
+ Artifact result = builder.getOrCheckArtifact(QueryType.GET);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("testGetArtifactByHRID took %dms", elapsedTime));
+ assertNotNull("No artifact found", result);
+ assertTrue(String.format("Elapsed time for artifact by hrid query took %dms. It should take less than 100ms.",
+ elapsedTime), elapsedTime < 100);
+ }
+
+ @org.junit.Test
+ public void testGetArtifactsByHRID() throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ Artifact art = ArtifactQuery.getDefaultHierarchyRootArtifact(common);
+ List<String> hrids = new ArrayList<String>();
+ List<Artifact> children = art.getChildren();
+ for (Artifact child : children) {
+ hrids.add(child.getHumanReadableId());
+ }
+ ArtifactQueryBuilder builder = new ArtifactQueryBuilder(hrids, common, true, FULL);
+ long startTime = System.currentTimeMillis();
+ List<Artifact> result = builder.getArtifacts(children.size() + 1, null);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("testGetArtifactsByHRID took %dms for %d artifacts", elapsedTime, result.size()));
+ assertTrue("No artifacts found", result.size() > 0);
+ assertTrue(String.format("Elapsed time for artifact by hrid query took %dms. It should take less than 50ms.",
+ elapsedTime), elapsedTime < 50);
+ }
+
+ @org.junit.Test
+ public void testGetArtifactsByHRIDNoDeleted() throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ Artifact art = ArtifactQuery.getDefaultHierarchyRootArtifact(common);
+ List<String> hrids = new ArrayList<String>();
+ List<Artifact> children = art.getChildren();
+ for (Artifact child : children) {
+ hrids.add(child.getHumanReadableId());
+ }
+ ArtifactQueryBuilder builder = new ArtifactQueryBuilder(hrids, common, false, FULL);
+ long startTime = System.currentTimeMillis();
+ List<Artifact> result = builder.getArtifacts(children.size() + 1, null);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("testGetArtifactsByHRIDNoDeleted took %dms for %d artifacts", elapsedTime,
+ result.size()));
+ assertTrue("No artifacts found", result.size() > 0);
+ assertTrue(String.format("Elapsed time for artifact by hrid query took %dms. It should take less than 50ms.",
+ elapsedTime), elapsedTime < 50);
+ }
+
+ @org.junit.Test
+ public void testGetArtifactsByArtType() throws OseeCoreException {
+ long startTime = System.currentTimeMillis();
+ List<Artifact> result = ArtifactQuery.getArtifactsFromType("Team Definition", BranchManager.getCommonBranch());
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("testGetArtifactsByArtType took %dms for %d artifacts", elapsedTime,
+ result.size()));
+ assertTrue("No artifacts found", result.size() > 0);
+ assertTrue(String.format(
+ "Elapsed time for testGetArtifactsByArtType took %dms. It should take less than 750ms.", elapsedTime),
+ elapsedTime < 750);
+ }
+
+ @org.junit.Test
+ public void testGetArtifactsByArtTypes() throws OseeCoreException {
+ internalTestGetArtifactsByArtTypes(false, 8000);
+ }
+
+ private void internalTestGetArtifactsByArtTypes(boolean allowDeleted, long expectedElapseTime) throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ List<String> artTypes =
+ Arrays.asList("Actionable Item", "General Document", "Folder", "Work Widget Definition", "User",
+ "Work Page Definition", "Work Rule Definition");
+
+ long startTime = System.currentTimeMillis();
+ List<Artifact> result = ArtifactQuery.getArtifactsFromTypes(artTypes, common, false);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+
+ System.out.println(String.format("testGetArtifactsByArtTypes took %dms for %d artifacts", elapsedTime,
+ result.size()));
+ assertTrue("No artifacts found", result.size() > 0);
+ assertTrue(
+ String.format(
+ "Elapsed time for testGetArtifactsByArtTypes took %dms to load %d artifacts. It should take less than %dms.",
+ elapsedTime, result.size(), expectedElapseTime), elapsedTime < expectedElapseTime);
+ }
+
+ @org.junit.Test
+ public void testGetArtifactsByArtTypesAllowDeleted() throws OseeCoreException {
+ internalTestGetArtifactsByArtTypes(true, 5000);
+ }
+
+ @org.junit.Test
+ public void testLoadAllBranch() throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ ArtifactQueryBuilder builder = new ArtifactQueryBuilder(common, FULL, false);
+ long startTime = System.currentTimeMillis();
+ List<Artifact> result = builder.getArtifacts(50000, null);
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ System.out.println(String.format("loadAllBranch took %dms for %d artifacts", elapsedTime, result.size()));
+ assertTrue("No artifacts found", result.size() > 0);
+ assertTrue(String.format("Elapsed time for loadAllBranch took %dms. It should take less than 500000ms.",
+ elapsedTime), elapsedTime < 500000);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryTest.java
new file mode 100644
index 00000000000..e6805d15f0b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ArtifactQueryTest.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactQueryTest {
+
+ @org.junit.Test
+ public void testGetArtifactFromId() throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(common);
+ Artifact artifact = ArtifactQuery.getArtifactFromId(root.getHumanReadableId(), common);
+ assertEquals(root.getHumanReadableId(), artifact.getHumanReadableId());
+ }
+
+ @org.junit.Test
+ public void testGetArtifactsFromBranch() throws OseeCoreException {
+ Branch common = BranchManager.getCommonBranch();
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromBranch(common, true);
+
+ assertTrue(artifacts.size() > 0);
+ for (Artifact artifact : artifacts) {
+ assertTrue(artifact.getDescriptiveName().length() > 0);
+ artifact.isOrphan(); // this is good exercise - like doing push-ups
+ }
+ }
+
+ @org.junit.Test
+ public void testQuickSearch() throws Exception {
+ Branch branch = BranchManager.getKeyedBranch("V13 FTB0");
+ boolean isCaseSensitive = false;
+ String query = "[.PRE_RETRIES]";
+ String expected =
+ "[PRESET_DATABASE Local Data Definition, {MODEM_PARAMETER_SELECTION} Procedure, {RETRIES_0} Display Logic, {RETRIES_1} Display Logic, {RETRIES_2} Display Logic, {RETRIES} Display Logic]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, false);
+
+ query = "[.PRE_RETRIES]";
+ expected =
+ "[PRESET_DATABASE Local Data Definition, {MODEM_PARAMETER_SELECTION} Procedure, {RETRIES_0} Display Logic, {RETRIES_1} Display Logic, {RETRIES_2} Display Logic, {RETRIES} Display Logic, {UPDATE_LONGBOW_NET_PARAMETERS} Procedure]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, true);
+
+ query = "edit_ale_net_sel";
+ expected =
+ "[{EDIT_ALE_NET_SEL} Display Logic, {EDIT_ALE_NET} Display Logic, {EDIT_CALL_ADDRESS} Display Logic, {EDIT_CALL_SIGN} Display Logic, {EDIT_CIPHER_MODE} Display Logic, {EDIT_FREQ_SEL} Display Logic, {EDIT_FREQ_UIG} Display Logic, {EDIT_MODE} Display Logic, {EDIT_UNIT_ID} Display Logic]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, false);
+
+ query = "[.MODE_SUPPORTED]";
+ expected =
+ "[Radio_Configuration Local Data Definition, {NON_TAC_SLOTS} Display Logic, {SC_FH_TUNE} Display Logic, {TAC_SLOTS} Display Logic]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, false);
+
+ query = "[<.MODE>](B)";
+ expected =
+ "[Basic Weight and Moment., Chaff Dispensing Selections., Engine Performance., IDM Message Receive Summary Buffer., MISSION DTC FORMATS (A THRU K), MISSION DTC FORMATS (L THRU Z), Manual Fuel Boost OFF Selection., Symbology Select/Flight Page Access Switch, Tones, {CURRENT_OVERLAY} Display Logic, {EDIT_FREQ_SEL} Display Logic, {EDIT_FREQ} Display Logic, {HF_SHOT_AT_SYMBOL} Display Logic, {IDM_AFAPD_OTA_RECV}., {IDM_API_PROCESSING}PROCEDURE., {IDM_JVMF_OTA_RECV}., {IDM_MSG_REC_BUFF_REQ}., {IDM_MSG_REC_BUFF_STORAGE}., {IFF MODE 4 CAUTION CONDITION}., {IFF MODE 5 CAUTION CONDITION}., {LIST_MSG_REC_BUFFER}, {NON_TAC_SLOTS} Display Logic, {ORDERS} Display Logic, {PROCESS_PRIORITY_FIRE_ZONES_DATA} Procedure, {TAC_SLOTS} Display Logic, {WEAPONS PROCESSOR TO DISPLAY PROCESSOR}.]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, false);
+
+ query = "EDIT_CALL_ADDRESS";
+ expected =
+ "[{EDIT_ALE_NET} Display Logic, {EDIT_CALL_ADDRESS_SEL} Display Logic, {EDIT_CALL_ADDRESS} Display Logic, {EDIT_CALL_ADDRESS} Maintained Button, {EDIT_CALL_SIGN} Display Logic, {EDIT_CIPHER_MODE} Display Logic, {EDIT_CNV} Display Logic, {EDIT_FREQ_SEL} Display Logic, {EDIT_FREQ_UIG} Display Logic, {EDIT_MODE} Display Logic, {EDIT_UNIT_ID} Display Logic]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, false);
+
+ branch = BranchManager.getBranch("Block III - FTB2");
+ query = "EOM_CCF_SEND_CHKFIRE";
+ expected = "[{IDM NETWORK API STATUS}, {VMF_ARTY_CANC_CHK_FIRE_SEND} Procedure]";
+ checkSearch(branch, query, expected, true, isCaseSensitive, false);
+ }
+
+ private void checkSearch(Branch branch, String query, String expected, boolean matchWordOrder, boolean allowDeleted, boolean isCaseSensitive, String... attributeTypes) throws Exception {
+ List<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromAttributeWithKeywords(branch, query, matchWordOrder, allowDeleted,
+ isCaseSensitive, attributeTypes);
+ Collections.sort(artifacts);
+ Artifact[] results = artifacts.toArray(new Artifact[artifacts.size()]);
+ assertEquals(expected, Arrays.deepToString(results));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/Artifact_setAttributeValues.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/Artifact_setAttributeValues.java
new file mode 100644
index 00000000000..3c201d929b0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/Artifact_setAttributeValues.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertTrue;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Artifact_setAttributeValues {
+
+ private static List<String> firstSet = Arrays.asList("First", "Second", "Third");
+ private static List<String> addOneSet = Arrays.asList("First", "Second", "Third", "Fourth");
+ private static List<String> addOneRemoveOneSet = Arrays.asList("Second", "Third", "Fourth", "Fifth");
+ private static List<String> addDuplicates_set =
+ Arrays.asList("Second", "Second", "Third", "Fourth", "Fifth", "Fourth");
+ private static List<String> addDuplicates_result = Arrays.asList("Second", "Third", "Fifth", "Fourth");
+ private static List<String> emptySet = Arrays.asList();
+
+ @BeforeClass
+ public static void testCleanupPre() throws Exception {
+ cleanup();
+ }
+
+ @org.junit.Test
+ public void testSetAttributeValues() throws Exception {
+ Artifact artifact =
+ ArtifactTypeManager.addArtifact("General Document",
+ BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), getClass().getSimpleName());
+ artifact.setAttributeValues(StaticIdManager.STATIC_ID_ATTRIBUTE, firstSet);
+ artifact.persistAttributes();
+
+ assertTrue(Collections.isEqual(firstSet, artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE)));
+ }
+
+ @org.junit.Test
+ public void testSetAttributeValuesAddOne() throws Exception {
+ Artifact artifact = getArtifact();
+ artifact.setAttributeValues(StaticIdManager.STATIC_ID_ATTRIBUTE, addOneSet);
+ artifact.persistAttributes();
+
+ assertTrue(Collections.isEqual(addOneSet, artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE)));
+ }
+
+ @org.junit.Test
+ public void testSetAttributeValuesAddOneRemoveOne() throws Exception {
+ Artifact artifact = getArtifact();
+ artifact.setAttributeValues(StaticIdManager.STATIC_ID_ATTRIBUTE, addOneRemoveOneSet);
+ artifact.persistAttributes();
+
+ assertTrue(Collections.isEqual(addOneRemoveOneSet,
+ artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE)));
+ }
+
+ @org.junit.Test
+ public void testSetAttributeValuesRemoveAll() throws Exception {
+ Artifact artifact = getArtifact();
+ artifact.setAttributeValues(StaticIdManager.STATIC_ID_ATTRIBUTE, emptySet);
+ artifact.persistAttributes();
+
+ assertTrue(artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE).size() == 0);
+ }
+
+ @org.junit.Test
+ public void testSetAttributeValuesWithDuplicates() throws Exception {
+ Artifact artifact = getArtifact();
+ artifact.setAttributeValues(StaticIdManager.STATIC_ID_ATTRIBUTE, addDuplicates_set);
+ artifact.persistAttributes();
+
+ assertTrue(Collections.isEqual(addDuplicates_result,
+ artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE)));
+ }
+
+ @AfterClass
+ public static void testCleanupPost() throws Exception {
+ cleanup();
+ }
+
+ private Artifact getArtifact() throws Exception {
+ return ArtifactQuery.getArtifactsFromName(getClass().getSimpleName(),
+ BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false).iterator().next();
+ }
+
+ private static void cleanup() throws Exception {
+ Collection<Artifact> arts =
+ ArtifactQuery.getArtifactsFromName(Artifact_setAttributeValues.class.getSimpleName(),
+ BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false);
+ ArtifactPersistenceManager.purgeArtifacts(arts);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchPurgeTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchPurgeTest.java
new file mode 100644
index 00000000000..fd458eeba4f
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchPurgeTest.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.test.util.FrameworkTestUtil;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.DbUtil;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * This test is intended to be run against a demo database. It tests the branch purge logic by counting the rows of the
+ * version and txs tables, creating a branch, making changes and then purging the branch. If it works properly, all rows
+ * should be equal.
+ *
+ * @author Donald G. Dunne
+ */
+public class BranchPurgeTest {
+
+ private final Map<String, Integer> preCreateCount = new HashMap<String, Integer>();
+ private final Map<String, Integer> postCreateBranchCount = new HashMap<String, Integer>();
+ private final Map<String, Integer> postPurgeCount = new HashMap<String, Integer>();
+ List<String> tables =
+ Arrays.asList("osee_attribute", "osee_artifact", "osee_relation_link", "osee_tx_details", "osee_txs",
+ "osee_artifact_version");
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(TestUtil.isProductionDb());
+ cleanup();
+ }
+
+ @org.junit.Test
+ public void testPurgeBranch() throws Exception {
+ // Count rows in tables prior to purge
+ DbUtil.getTableRowCounts(preCreateCount, tables);
+
+ // create a new working branch
+ Branch branch =
+ BranchManager.createWorkingBranch(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_2.name()),
+ getClass().getSimpleName(), UserManager.getUser(SystemUser.OseeSystem));
+
+ TestUtil.sleep(4000);
+
+ // create some software artifacts
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ Collection<Artifact> softArts =
+ FrameworkTestUtil.createSimpleArtifacts(Requirements.SOFTWARE_REQUIREMENT, 10, getClass().getSimpleName(),
+ branch);
+ for (Artifact softArt : softArts) {
+ softArt.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+
+ // make more changes to artifacts
+ for (Artifact softArt : softArts) {
+ softArt.addAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, getClass().getSimpleName());
+ softArt.persistAttributesAndRelations();
+ }
+
+ // Count rows and check that increased
+ DbUtil.getTableRowCounts(postCreateBranchCount, tables);
+ TestUtil.checkThatIncreased(preCreateCount, postCreateBranchCount);
+
+ // Purge branch
+ BranchManager.purgeBranch(branch);
+
+ TestUtil.sleep(4000);
+
+ // Count rows and check that same as when began
+ DbUtil.getTableRowCounts(postPurgeCount, tables);
+ // TODO looks like artifacts are not being removed when purge a branch
+ TestUtil.checkThatEqual(preCreateCount, postPurgeCount);
+
+ }
+
+ @After
+ public void testCleanupPost() throws Exception {
+ cleanup();
+ }
+
+ private static void cleanup() throws Exception {
+ FrameworkTestUtil.purgeWorkingBranches(Arrays.asList(BranchPurgeTest.class.getSimpleName()));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchStateTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchStateTest.java
new file mode 100644
index 00000000000..9e48f78d299
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/BranchStateTest.java
@@ -0,0 +1,309 @@
+/*
+ * Created on Jun 15, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.operation.FinishUpdateBranchOperation;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.update.ConflictResolverOperation;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.junit.Before;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchStateTest {
+
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(ClientSessionManager.isProductionDataStore());
+ }
+
+ @org.junit.Test
+ public void testCreateState() throws OseeCoreException {
+ Branch mainBranch = BranchManager.getKeyedBranch("SAW_Bld_1");
+ String originalBranchName = "Create State Branch";
+ Branch workingBranch = null;
+ try {
+ User user = UserManager.getUser(SystemUser.OseeSystem);
+ workingBranch = BranchManager.createWorkingBranch(mainBranch, originalBranchName, user);
+ assertEquals(BranchState.CREATED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isEditable());
+ } finally {
+ if (workingBranch != null) {
+ BranchManager.purgeBranch(workingBranch);
+ }
+ }
+ }
+
+ @org.junit.Test
+ public void testModifiedState() throws OseeCoreException, InterruptedException {
+ Branch mainBranch = BranchManager.getKeyedBranch("SAW_Bld_1");
+ String originalBranchName = "Modified State Branch";
+ Branch workingBranch = null;
+ try {
+ User user = UserManager.getUser(SystemUser.OseeSystem);
+ workingBranch = BranchManager.createWorkingBranch(mainBranch, originalBranchName, user);
+ assertEquals(BranchState.CREATED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isEditable());
+
+ Artifact change =
+ ArtifactTypeManager.addArtifact("Software Requirement", workingBranch, "Test Object on Working Branch");
+ change.persistAttributes();
+
+ assertEquals(BranchState.MODIFIED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isEditable());
+ } finally {
+ if (workingBranch != null) {
+ BranchManager.purgeBranch(workingBranch);
+ }
+ }
+ }
+
+ @org.junit.Test
+ public void testDeleteState() throws OseeCoreException, InterruptedException {
+ Branch mainBranch = BranchManager.getKeyedBranch("SAW_Bld_1");
+ String originalBranchName = "Deleted State Branch";
+ Branch workingBranch = null;
+ try {
+ User user = UserManager.getUser(SystemUser.OseeSystem);
+ workingBranch = BranchManager.createWorkingBranch(mainBranch, originalBranchName, user);
+ assertEquals(BranchState.CREATED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isEditable());
+
+ Job job = BranchManager.deleteBranch(workingBranch);
+ job.join();
+ assertEquals(BranchState.DELETED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isArchived());
+ assertTrue(!workingBranch.isEditable());
+ assertTrue(workingBranch.isDeleted());
+ } finally {
+ if (workingBranch != null) {
+ BranchManager.purgeBranch(workingBranch);
+ }
+ }
+ }
+
+ @org.junit.Test
+ public void testCommittState() throws OseeCoreException, InterruptedException {
+ Branch mainBranch = BranchManager.getKeyedBranch("SAW_Bld_1");
+ String originalBranchName = "Commit State Branch";
+ Branch workingBranch = null;
+ try {
+ User user = UserManager.getUser(SystemUser.OseeSystem);
+ workingBranch = BranchManager.createWorkingBranch(mainBranch, originalBranchName, user);
+ assertEquals(BranchState.CREATED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isEditable());
+
+ Artifact change = ArtifactTypeManager.addArtifact("Software Requirement", workingBranch, "A commit change");
+ change.persistAttributes();
+
+ assertEquals(BranchState.MODIFIED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isEditable());
+
+ ConflictManagerExternal conflictManager = new ConflictManagerExternal(mainBranch, workingBranch);
+ BranchManager.commitBranch(conflictManager, true, false);
+
+ assertEquals(BranchState.COMMITTED, workingBranch.getBranchState());
+ assertTrue(workingBranch.isArchived());
+ assertTrue(!workingBranch.isEditable());
+ } finally {
+ if (workingBranch != null) {
+ BranchManager.purgeBranch(workingBranch);
+ }
+ }
+ }
+
+ @org.junit.Test
+ public void testRebaselineWithoutConflicts() throws OseeCoreException, InterruptedException {
+ Branch mainBranch = BranchManager.getKeyedBranch("SAW_Bld_1");
+ String originalBranchName = "UpdateBranch Test 1";
+ Artifact baseArtifact = null;
+ Branch workingBranch = null;
+ try {
+ baseArtifact = ArtifactTypeManager.addArtifact("Software Requirement", mainBranch, "Test Object");
+ baseArtifact.setSoleAttributeFromString("Annotation", "This is the base annotation");
+ baseArtifact.persistAttributes();
+
+ User user = UserManager.getUser(SystemUser.Guest);
+ workingBranch = BranchManager.createWorkingBranch(mainBranch, originalBranchName, user);
+
+ // Add a new artifact on the working branch
+ Artifact change =
+ ArtifactTypeManager.addArtifact("Software Requirement", workingBranch, "Test Object on Working Branch");
+ change.persistAttributes();
+
+ // Make a change on the parent
+ baseArtifact.setSoleAttributeFromString("Annotation", "This is the updated annotation");
+ baseArtifact.persistAttributes();
+
+ // Update the branch
+ ConflictResolverOperation resolverOperation =
+ new ConflictResolverOperation("Test 1 Resolver", BranchStateTest.class.getCanonicalName()) {
+
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ assertFalse("This code should not be executed since there shouldn't be any conflicts.",
+ wasExecuted());
+ }
+ };
+
+ Job job = BranchManager.updateBranch(workingBranch, resolverOperation);
+ job.join();
+ assertTrue("UpdateBranch was not successful", job.getResult().isOK());
+ assertTrue("Resolver was executed", !resolverOperation.wasExecuted());
+
+ checkBranchWasRebaselined(originalBranchName, workingBranch);
+ // Check that the associated artifact remained unchanged
+ assertEquals(workingBranch.getAssociatedArtifact(), user);
+
+ Collection<Branch> branches = BranchManager.getBranchesByName(originalBranchName);
+ assertEquals("Check only 1 original branch", 1, branches.size());
+
+ Branch newWorkingBranch = branches.iterator().next();
+ assertTrue(workingBranch.getBranchId() != newWorkingBranch.getBranchId());
+ assertEquals(originalBranchName, newWorkingBranch.getBranchName());
+ assertTrue("New Working branch is editable", newWorkingBranch.isEditable());
+ } finally {
+ cleanup(originalBranchName, baseArtifact, workingBranch, null);
+ }
+ }
+
+ @org.junit.Test
+ public void testRebaselineWithConflicts() throws OseeCoreException, InterruptedException {
+ Branch mainBranch = BranchManager.getKeyedBranch("SAW_Bld_1");
+ String originalBranchName = "UpdateBranch Test 2";
+ Artifact baseArtifact = null;
+ Branch workingBranch = null;
+ Branch mergeBranch = null;
+ try {
+ baseArtifact = ArtifactTypeManager.addArtifact("Software Requirement", mainBranch, "Test Object");
+ baseArtifact.setSoleAttributeFromString("Annotation", "This is the base annotation");
+ baseArtifact.persistAttributes();
+
+ User user = UserManager.getUser(SystemUser.OseeSystem);
+ workingBranch = BranchManager.createWorkingBranch(mainBranch, originalBranchName, user);
+
+ // Modify same artifact on working branch
+ Artifact sameArtifact = ArtifactQuery.getArtifactFromId(baseArtifact.getHumanReadableId(), workingBranch);
+ sameArtifact.setSoleAttributeFromString("Annotation", "This is the working branch update annotation");
+ sameArtifact.persistAttributes();
+
+ // Make a change on the parent
+ baseArtifact.setSoleAttributeFromString("Annotation", "This is the updated annotation");
+ baseArtifact.persistAttributes();
+
+ ConflictResolverOperation resolverOperation =
+ new ConflictResolverOperation("Test 2 Resolver", BranchStateTest.class.getCanonicalName()) {
+
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ assertTrue("This code should have been executed since there shouldn't be any conflicts.",
+ wasExecuted());
+ }
+ };
+
+ // Update the branch
+ Job job = BranchManager.updateBranch(workingBranch, resolverOperation);
+ job.join();
+
+ assertTrue("UpdateBranch was not successful\n" + job.getResult().getMessage(), job.getResult().isOK());
+ assertTrue("Resolver not executed", resolverOperation.wasExecuted());
+
+ assertTrue("Branch was archived", !workingBranch.isArchived());
+ assertTrue("Branch was not marked as rebaseline in progress", workingBranch.isRebaselineInProgress());
+ assertTrue("Branch was not editable", workingBranch.isEditable());
+ assertTrue("Branch state was set to rebaselined before complete", !workingBranch.isRebaselined());
+
+ assertEquals("Branch name was changed before update was complete", originalBranchName,
+ workingBranch.getBranchName());
+
+ // Check that a new destination branch exists
+ Branch destinationBranch = resolverOperation.getConflictManager().getDestinationBranch();
+ assertTrue("Branch name not set correctly", destinationBranch.getBranchName().startsWith(
+ String.format("%s - for update -", originalBranchName)));
+ assertTrue("Branch was not editable", destinationBranch.isEditable());
+
+ // Check that we have a merge branch
+ mergeBranch = BranchManager.getMergeBranch(workingBranch, destinationBranch);
+ assertTrue("MergeBranch was not editable", mergeBranch.isEditable());
+ assertEquals("Merge Branch should be in Created State", BranchState.CREATED, mergeBranch.getBranchState());
+
+ // Run FinishBranchUpdate and check
+ FinishUpdateBranchOperation finishUpdateOperation =
+ new FinishUpdateBranchOperation("Update Branch Test 2", resolverOperation.getConflictManager(), true,
+ true);
+ Operations.executeWork(finishUpdateOperation, new NullProgressMonitor(), -1);
+ assertTrue("FinishUpdateBranch was not successful", finishUpdateOperation.getStatus().isOK());
+
+ checkBranchWasRebaselined(originalBranchName, workingBranch);
+
+ Collection<Branch> branches = BranchManager.getBranchesByName(originalBranchName);
+ assertEquals("Check only 1 original branch", 1, branches.size());
+
+ Branch newWorkingBranch = branches.iterator().next();
+ assertTrue(workingBranch.getBranchId() != newWorkingBranch.getBranchId());
+ assertEquals(originalBranchName, newWorkingBranch.getBranchName());
+ assertTrue("New Working branch is editable", newWorkingBranch.isEditable());
+
+ // Swapped successfully
+ assertEquals(destinationBranch.getBranchId(), newWorkingBranch.getBranchId());
+ } finally {
+ cleanup(originalBranchName, baseArtifact, workingBranch, mergeBranch);
+ }
+ }
+
+ private void cleanup(String originalBranchName, Artifact baseArtifact, Branch workingBranch, Branch mergeBranch) throws OseeDataStoreException, OseeCoreException {
+ for (Branch branch : BranchManager.getBranchesByName(originalBranchName)) {
+ for (Branch child : branch.getChildBranches(true)) {
+ BranchManager.purgeBranch(child);
+ }
+ BranchManager.purgeBranch(branch);
+ }
+ if (mergeBranch != null) {
+ BranchManager.purgeBranch(mergeBranch);
+ }
+ if (workingBranch != null) {
+ BranchManager.purgeBranch(workingBranch);
+ }
+ if (baseArtifact != null) {
+ List<Artifact> itemsToPurge = new ArrayList<Artifact>();
+ itemsToPurge.add(baseArtifact);
+ ArtifactPersistenceManager.purgeArtifacts(itemsToPurge);
+ }
+ }
+
+ private void checkBranchWasRebaselined(String originalBranchName, Branch branchToCheck) {
+ assertTrue("Branch was not archived", branchToCheck.isArchived());
+ assertTrue("Branch was still editable", !branchToCheck.isEditable());
+ assertTrue("Branch state was not set as rebaselined", branchToCheck.isRebaselined());
+ assertTrue("Branch name not set correctly", branchToCheck.getBranchName().startsWith(
+ String.format("%s - moved by update on -", originalBranchName)));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ChangeManagerTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ChangeManagerTest.java
new file mode 100644
index 00000000000..7d4c1a0ccef
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ChangeManagerTest.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * Tests the Change Manager.
+ *
+ * @author Jeff C. Phillips
+ */
+public class ChangeManagerTest {
+ private static Artifact newArtifact;
+ private static Artifact modArtifact;
+ private Branch branch;
+
+ @Before
+ public void setUp() throws Exception {
+ assertFalse("This test can not be run on Production", ClientSessionManager.isProductionDataStore());
+
+ modArtifact =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, BranchManager.getSystemRootBranch());
+ modArtifact.persistAttributes();
+
+ sleep(5000);
+
+ String branchName = "Change Manager Test Branch" + GUID.generateGuidStr();
+
+ branch =
+ BranchManager.createWorkingBranch(BranchManager.getSystemRootBranch(), branchName,
+ UserManager.getUser(SystemUser.OseeSystem));
+ sleep(5000);
+
+ newArtifact = ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch);
+ newArtifact.persistAttributes();
+ sleep(5000);
+ }
+
+ @org.junit.Test
+ public void testChangeManager() throws Exception {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+
+ sleep(5000);
+
+ modArtifact = ArtifactQuery.getArtifactFromId(modArtifact.getArtId(), branch);
+
+ assertTrue("Check artifact new", checkArtifactModType(newArtifact, ModificationType.NEW));
+ newArtifact.setSoleAttributeFromString(WordAttribute.WORD_TEMPLATE_CONTENT, "new content");
+ assertTrue("Check artifact is still new", checkArtifactModType(newArtifact, ModificationType.NEW));
+ modArtifact.setSoleAttributeFromString(WordAttribute.WORD_TEMPLATE_CONTENT, "changed content");
+ modArtifact.persistAttributes();
+ assertTrue("Check artifact has changed", checkArtifactModType(modArtifact, ModificationType.MODIFIED));
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ BranchManager.purgeBranch(branch);
+ sleep(5000);
+
+ modArtifact.persistAttributes();
+ }
+
+ public static boolean checkArtifactModType(Artifact artifact, ModificationType modificationType) throws OseeCoreException {
+ boolean pass = false;
+ for (Change change : ChangeManager.getChangesPerBranch(artifact.getBranch(), new EmptyMonitor())) {
+ if (change.getArtId() == artifact.getArtId()) {
+ pass = change.getModificationType() == modificationType;
+ break;
+ }
+ }
+ return pass;
+ }
+
+ public static void sleep(long milliseconds) throws Exception {
+ OseeLog.log(ChangeManagerTest.class, Level.INFO, "Sleeping " + milliseconds);
+ Thread.sleep(milliseconds);
+ OseeLog.log(ChangeManagerTest.class, Level.INFO, "Awake");
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTest.java
new file mode 100644
index 00000000000..bd8ba253418
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTest.java
@@ -0,0 +1,314 @@
+/*
+ * Created on Jun 8, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.conflict.ArtifactConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.skynet.core.conflict.RelationConflict;
+import org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class ConflictTest {
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core.test/debug/Junit"));
+ private static final String COMMITTED_NEW_AND_DELETED_ARTIFACTS =
+ "SELECT txs1.gamma_id, txs1.transaction_id, det1.branch_id, art1.art_id, 0 as attr_id, 0 as rel_link_id FROM osee_tx_details det1, osee_txs txs1, osee_artifact_version art1 WHERE txs1.tx_current = " + TxChange.DELETED.getValue() + " AND det1.transaction_id = txs1.transaction_id AND txs1.gamma_id = art1.gamma_id AND NOT EXISTS (SELECT ('x') FROM osee_tx_details det2, osee_txs txs2, osee_artifact_version art2 WHERE txs2.mod_type != " + ModificationType.DELETED.getValue() + " AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = art2.gamma_id AND art2.art_id = art1.art_id)";
+ private static final String COMMITTED_NEW_AND_DELETED_ATTRIBUTES =
+ "SELECT txs1.gamma_id, txs1.transaction_id, det1.branch_id, 0 as art_id, att1.attr_id, 0 as rel_link_id FROM osee_tx_details det1, osee_txs txs1, osee_attribute att1 WHERE txs1.tx_current = " + TxChange.DELETED.getValue() + " AND det1.transaction_id = txs1.transaction_id AND txs1.gamma_id = att1.gamma_id AND NOT EXISTS (SELECT ('x') FROM osee_tx_details det2, osee_txs txs2, osee_attribute att2 WHERE txs2.mod_type != " + ModificationType.DELETED.getValue() + " AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = att2.gamma_id AND att2.attr_id = att1.attr_id)";
+ private static final String COMMITTED_NEW_AND_DELETED_RELATIONS =
+ "SELECT txs1.gamma_id, txs1.transaction_id, det1.branch_id, 0 as art_id, 0 as attr_id, rel1.rel_link_id FROM osee_tx_details det1, osee_txs txs1, osee_relation_link rel1 WHERE txs1.tx_current = " + TxChange.DELETED.getValue() + " AND det1.transaction_id = txs1.transaction_id AND txs1.gamma_id = rel1.gamma_id AND NOT EXISTS (SELECT ('x') FROM osee_tx_details det2, osee_txs txs2, osee_relation_link rel2 WHERE txs2.mod_type != " + ModificationType.DELETED.getValue() + " AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = rel2.gamma_id AND rel2.rel_link_id = rel1.rel_link_id)";
+ private static final String[] NO_TX_CURRENT_SET =
+ {
+ "SELECT distinct t1.",
+ ", det.branch_id FROM osee_tx_details det, osee_txs txs, ",
+ " t1 WHERE det.transaction_id = txs.transaction_id AND txs.gamma_id = t1.gamma_id AND txs.tx_current = 0 %s SELECT distinct t2.",
+ ", det.branch_id FROM osee_tx_details det, osee_txs txs, ",
+ " t2 WHERE det.transaction_id = txs.transaction_id AND txs.gamma_id = t2.gamma_id AND txs.tx_current != 0"};
+
+ private static final String[] MULTIPLE_TX_CURRENT_SET =
+ {
+ "SELECT resulttable.branch_id, resulttable.",
+ ", COUNT(resulttable.branch_id) AS numoccurrences FROM (SELECT txd1.branch_id, t1.",
+ " FROM osee_tx_details txd1, osee_txs txs1, ",
+ " t1 WHERE txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = t1.gamma_id AND txs1.tx_current != 0) resulttable GROUP BY resulttable.branch_id, resulttable.",
+ " HAVING(COUNT(resulttable.branch_id) > 1) order by branch_id"};
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ ConflictTestManager.initializeConflictTest();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ ConflictTestManager.cleanUpConflictTest();
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.BranchManager#getMergeBranch(Branch, Branch)} .
+ * @throws Exception
+ */
+ @org.junit.Test
+ public void testGetMergeBranchNotCreated() throws Exception {
+ runMergeBranchNotCreated();
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal#getConflictsPerBranch(org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.osee.framework.skynet.core.transaction.TransactionId)}
+ * .
+ */
+ @org.junit.Test
+ public void testGetConflictsPerBranch() {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ Collection<Conflict> conflicts = new HashSet<Conflict>();
+ try {
+ conflicts =
+ ConflictManagerInternal.getConflictsPerBranch(ConflictTestManager.getSourceBranch(),
+ ConflictTestManager.getDestBranch(), TransactionIdManager.getStartEndPoint(
+ ConflictTestManager.getSourceBranch()).getKey(), new EmptyMonitor());
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ assertEquals("Number of conflicts found is not equal to the number of conflicts expected",
+ ConflictTestManager.numberOfConflicts(), conflicts.toArray().length);
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getAllLogs().size()),
+ monitorLog.getAllLogs().size() == 0);
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.BranchManager#getMergeBranch(Branch, Branch)} .
+ * @throws Exception
+ */
+ @org.junit.Test
+ public void testGetMergeBranchCreated() throws Exception {
+ runMergeBranchCreated();
+ }
+
+ @org.junit.Test
+ public void testResolveConflicts() {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ try {
+ Collection<Conflict> conflicts =
+ ConflictManagerInternal.getConflictsPerBranch(ConflictTestManager.getSourceBranch(),
+ ConflictTestManager.getDestBranch(), TransactionIdManager.getStartEndPoint(
+ ConflictTestManager.getSourceBranch()).getKey(), new EmptyMonitor());
+ int whichChange = 1;
+
+ for (Conflict conflict : conflicts) {
+ if (conflict instanceof ArtifactConflict && ((ArtifactConflict) conflict).statusNotResolvable()) {
+ ((ArtifactConflict) conflict).revertSourceArtifact();
+ } else if (conflict instanceof AttributeConflict) {
+ ConflictTestManager.resolveAttributeConflict((AttributeConflict) conflict);
+ conflict.setStatus(ConflictStatus.RESOLVED);
+ } else if (conflict instanceof RelationConflict) {
+ fail("Relation Conflicts are not supported yet");
+ }
+ whichChange++;
+ }
+
+ conflicts =
+ ConflictManagerInternal.getConflictsPerBranch(ConflictTestManager.getSourceBranch(),
+ ConflictTestManager.getDestBranch(), TransactionIdManager.getStartEndPoint(
+ ConflictTestManager.getSourceBranch()).getKey(), new EmptyMonitor());
+
+ for (Conflict conflict : conflicts) {
+ assertTrue(
+ "This conflict was not found to be resolved ArtId = " + conflict.getArtId() + " " + conflict.getSourceDisplayData(),
+ conflict.statusResolved() || conflict.statusInformational());
+
+ }
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getAllLogs().size()),
+ monitorLog.getAllLogs().size() == 0);
+ }
+
+ public void CheckCommitWithoutResolutionErrors() {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ try {
+ ConflictManagerExternal conflictManager =
+ new ConflictManagerExternal(ConflictTestManager.getDestBranch(), ConflictTestManager.getSourceBranch());
+ BranchManager.commitBranch(conflictManager, false, false);
+ assertTrue("Commit did not complete as expected", ConflictTestManager.validateCommit());
+
+ assertEquals("Source Branch state incorrect", BranchState.COMMITTED,
+ ConflictTestManager.getSourceBranch().getBranchState());
+
+ } catch (Exception ex) {
+ fail("No Exceptions should have been thrown. Not even the " + ex.getLocalizedMessage() + "Exception");
+ }
+
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getSevereLogs().size()),
+ monitorLog.getSevereLogs().size() == 0);
+ }
+
+ @org.junit.Test
+ public void testCommitFiltering() throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(COMMITTED_NEW_AND_DELETED_ARTIFACTS);
+ if (chStmt.next()) {
+ fail(String.format(
+ "Committed New and Deleted Artifact snuck through gamma_id = %d and transaction_id = %d",
+ chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(COMMITTED_NEW_AND_DELETED_ATTRIBUTES);
+ if (chStmt.next()) {
+ fail(String.format(
+ "Committed New and Deleted Attribute snuck through gamma_id = %d and transaction_id = %d",
+ chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(COMMITTED_NEW_AND_DELETED_RELATIONS);
+ if (chStmt.next()) {
+ fail(String.format(
+ "Committed New and Deleted Relation Links snuck through gamma_id = %d and transaction_id = %d",
+ chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ checkNoTxCurrent("art_id", "osee_artifact_version");
+ checkNoTxCurrent("attr_id", "osee_attribute");
+ checkNoTxCurrent("rel_link_id", "osee_relation_link");
+ checkMultipleTxCurrent("art_id", "osee_artifact_version");
+ checkMultipleTxCurrent("attr_id", "osee_attribute");
+ checkMultipleTxCurrent("rel_link_id", "osee_relation_link");
+
+ }
+
+ private void checkNoTxCurrent(String dataId, String dataTable) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ StringBuilder builder = new StringBuilder();
+ builder.append(NO_TX_CURRENT_SET[0]);
+ builder.append(dataId);
+ builder.append(NO_TX_CURRENT_SET[1]);
+ builder.append(dataTable);
+ builder.append(String.format(NO_TX_CURRENT_SET[2], SupportedDatabase.getComplementSql()));
+ builder.append(dataId);
+ builder.append(NO_TX_CURRENT_SET[3]);
+ builder.append(dataTable);
+ builder.append(NO_TX_CURRENT_SET[4]);
+
+ try {
+ chStmt.runPreparedQuery(builder.toString());
+ if (chStmt.next()) {
+ fail(String.format("No TX Current Set Failed for dataId = %s and dataTable = %s", dataId, dataTable));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void checkMultipleTxCurrent(String dataId, String dataTable) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ StringBuilder builder = new StringBuilder();
+ builder.append(MULTIPLE_TX_CURRENT_SET[0]);
+ builder.append(dataId);
+ builder.append(MULTIPLE_TX_CURRENT_SET[1]);
+ builder.append(dataId);
+ builder.append(MULTIPLE_TX_CURRENT_SET[2]);
+ builder.append(dataTable);
+ builder.append(MULTIPLE_TX_CURRENT_SET[3]);
+ builder.append(dataId);
+ builder.append(MULTIPLE_TX_CURRENT_SET[4]);
+
+ try {
+ chStmt.runPreparedQuery(builder.toString());
+ if (chStmt.next()) {
+ fail(String.format("Multiple TX Current Set Failed for dataId = %s and dataTable = %s", dataId, dataTable));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void runMergeBranchNotCreated() throws Exception {
+ TestUtil.sleep(5000);
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ try {
+ Branch mergeBranch =
+ BranchManager.getMergeBranch(ConflictTestManager.getSourceBranch(), ConflictTestManager.getDestBranch());
+
+ assertTrue("The merge branch should be null as it hasn't been created yet", mergeBranch == null);
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getAllLogs().size()),
+ monitorLog.getAllLogs().size() == 0);
+ }
+
+ private void runMergeBranchCreated() throws Exception {
+ TestUtil.sleep(5000);
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ try {
+ Branch mergeBranch =
+ BranchManager.getMergeBranch(ConflictTestManager.getSourceBranch(), ConflictTestManager.getDestBranch());
+ assertFalse(mergeBranch == null);
+ Collection<Artifact> artifacts = ArtifactQuery.getArtifactsFromBranch(mergeBranch, true);
+ if (DEBUG) {
+ System.out.println("Found the following Artifacts on the branch ");
+ System.out.print(" ");
+ for (Artifact artifact : artifacts) {
+ System.out.print(artifact.getArtId() + ", ");
+ }
+ System.out.println("\n");
+ }
+ assertEquals("The merge Branch does not contain the expected number of artifacts: ",
+ ConflictTestManager.numberOfArtifactsOnMergeBranch(), artifacts.toArray().length);
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getAllLogs().size()),
+ monitorLog.getAllLogs().size() == 0);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTestManager.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTestManager.java
new file mode 100644
index 00000000000..65d8c693468
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/ConflictTestManager.java
@@ -0,0 +1,749 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.StringAttribute;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+
+/**
+ * @author Theron Virgin
+ */
+public class ConflictTestManager {
+ public static enum Type {
+ RELATION, ARTIFACT, ATTRIBUTE;
+ };
+ public static enum Modification {
+ CREATE, DELETE, CREATE_AND_MODIFY, CREATE_AND_DELETE, MODIFY, MODIFY_AND_DELETE;
+ };
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core.test/debug/Junit"));
+
+ private static final String FOLDER = "System Requirements";
+ private static final String SOURCE_BRANCH = "Conflict_Test_Source_Branch";
+ private static final String DEST_BRANCH = "Conflict_Test_Destination_Branch";
+ private static Branch sourceBranch;
+ private static Branch destBranch;
+ private static final int NUMBER_OF_ARTIFACTS = 32;
+ private static Artifact[] destArtifacts = new Artifact[NUMBER_OF_ARTIFACTS];
+ private static Artifact[] sourceArtifacts = new Artifact[NUMBER_OF_ARTIFACTS];
+ private static List<ArtifactModification> modifications = new LinkedList<ArtifactModification>();
+
+ private static ConflictDefinition[] conflictDefs = new ConflictDefinition[NUMBER_OF_ARTIFACTS];
+ public static int DELETION_TEST_QUERY = 1;
+ public static int DELETION_ATTRIBUTE_TEST_QUERY = 2;
+ public static int REVERT_ARTIFACT_QUERY = 3;
+ public static int REVERT_ATTRIBUTE_QUERY = 4;
+ public static int UPDATE_PARENT_QUERY = 5;
+ public static int REVERT_REL_LINK_QUERY = 6;
+
+ protected static class AttributeValue {
+ protected String attributeName;
+ protected String sourceValue;
+ protected String destValue;
+ protected String mergeValue;
+ protected Class<?> clas;
+ protected boolean sourceDeleted;
+ protected boolean destinationDeleted;
+
+ protected AttributeValue(String attributeName, String sourceValue, String destValue, String mergeValue, Class<?> clas) {
+ this(attributeName, sourceValue, destValue, mergeValue, clas, false, false);
+ }
+
+ protected AttributeValue(String attributeName, String sourceValue, String destValue, String mergeValue, Class<?> clas, boolean sourceDeleted, boolean destinationDeleted) {
+ this.attributeName = attributeName;
+ this.sourceValue = sourceValue;
+ this.destValue = destValue;
+ this.mergeValue = mergeValue;
+ this.clas = clas;
+ this.sourceDeleted = sourceDeleted;
+ this.destinationDeleted = destinationDeleted;
+ }
+
+ protected AttributeValue(String attributeName, String sourceValue, Class<?> clas) {
+ this.attributeName = attributeName;
+ this.sourceValue = sourceValue;
+ this.clas = clas;
+ sourceDeleted = false;
+ destinationDeleted = false;
+ }
+ }
+
+ protected static class ArtifactModification {
+ Type itemToChange;
+ Modification modificationToPerform;
+ protected String Name;
+ protected String value;
+ protected Object object;
+ protected Object object2;
+ protected Class<?> clas;
+ protected Branch branch;
+ protected int rootArtifact;
+ protected String type;
+
+ protected ArtifactModification(Type itemToChange, Modification modificationToPerform, int rootArtifact, Branch branch, String type, String name) throws OseeCoreException {
+ if (!itemToChange.equals(Type.ARTIFACT)) {
+ throw new OseeCoreException("This is the Artifact Constructor");
+ }
+ this.itemToChange = itemToChange;
+ this.modificationToPerform = modificationToPerform;
+ this.rootArtifact = rootArtifact;
+ this.branch = branch;
+ this.type = type;
+ this.Name = name;
+ }
+
+ protected ArtifactModification(Type itemToChange, Modification modificationToPerform, Object object, String name, Class<?> clas, String value) throws OseeCoreException {
+ if (!itemToChange.equals(Type.ATTRIBUTE)) {
+ throw new OseeCoreException("This is the Attribute Constructor");
+ }
+ this.itemToChange = itemToChange;
+ this.modificationToPerform = modificationToPerform;
+ this.object = object;
+ this.clas = clas;
+ this.value = value;
+ this.Name = name;
+ }
+
+ protected ArtifactModification(Type itemToChange, Modification modificationToPerform, Object object, Object object2) throws OseeCoreException {
+ if (!itemToChange.equals(Type.RELATION)) {
+ throw new OseeCoreException("This is the Relation Constructor");
+ }
+ this.itemToChange = itemToChange;
+ this.modificationToPerform = modificationToPerform;
+ this.object = object;
+ this.object2 = object2;
+ }
+ }
+
+ private static class ConflictDefinition {
+ protected Collection<AttributeValue> values = new HashSet<AttributeValue>();
+ protected Collection<AttributeValue> newAttributes = new HashSet<AttributeValue>();
+ protected String artifactType;
+ protected boolean sourceDelete;
+ protected boolean destDelete;
+ protected int rootArtifact;
+ protected int queryNumber;
+ protected int numConflicts = 0;
+ protected boolean artifactAdded = false;
+ protected boolean sourceModified = false;
+ protected boolean destModified = false;
+
+ protected void setValues(String artifactType, boolean sourceDelete, boolean destDelete, int rootArtifact, int queryNumber) {
+ this.artifactType = artifactType;
+ this.sourceDelete = sourceDelete;
+ this.destDelete = destDelete;
+ this.rootArtifact = rootArtifact;
+ this.queryNumber = queryNumber;
+ }
+
+ protected boolean destinationDeleted(ConflictDefinition[] conflictDefs) {
+ if (rootArtifact == 0) {
+ return destDelete;
+ }
+ return destDelete || conflictDefs[rootArtifact].destinationDeleted(conflictDefs);
+ }
+
+ protected boolean sourceDeleted(ConflictDefinition[] conflictDefs) {
+ if (rootArtifact == 0) {
+ return sourceDelete;
+ }
+ return sourceDelete || conflictDefs[rootArtifact].sourceDeleted(conflictDefs);
+ }
+
+ protected int getNumberConflicts(ConflictDefinition[] conflictDefs) {
+ if (!destinationDeleted(conflictDefs) && !sourceDeleted(conflictDefs)) {
+ return numConflicts;
+ } else if (destinationDeleted(conflictDefs) && sourceModified || sourceDeleted(conflictDefs) && destModified) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ protected boolean artifactAdded(ConflictDefinition[] conflictDefs) {
+ if (!destinationDeleted(conflictDefs) && !sourceDeleted(conflictDefs)) {
+ return numConflicts > 0;
+ } else if (destinationDeleted(conflictDefs) && sourceModified || sourceDeleted(conflictDefs) && destModified) {
+ return true;
+ }
+ return false;
+ }
+
+ }
+
+ public static void initializeConflictTest() throws Exception {
+ // Create a new destination branch from the Branch with BranchID = 2
+ cleanUpConflictTest();
+ createConflictDefinitions();
+ Branch branch;
+ branch = BranchManager.getBranch("SAW_Bld_1");
+ destBranch = BranchManager.createWorkingBranch(branch, DEST_BRANCH, null);
+
+ Artifact rootArtifact = ArtifactQuery.getArtifactFromAttribute("Name", FOLDER, destBranch);
+
+ // Add artifacts onto the destination Branch
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ ArtifactType artType = ArtifactTypeManager.getType(conflictDefs[i].artifactType);
+ // ConfigurationPersistenceManager.getArtifactSubtypeDescriptor(conflictDefs[i].artifactType);
+ if (conflictDefs[i].rootArtifact > 0 && conflictDefs[i].rootArtifact < i) {
+ destArtifacts[i] =
+ destArtifacts[conflictDefs[i].rootArtifact].addNewChild(artType, "Test Artifact Number " + i);
+ } else {
+ destArtifacts[i] = rootArtifact.addNewChild(artType, "Test Artifact Number " + i);
+ }
+ for (AttributeValue value : conflictDefs[i].newAttributes) {
+ destArtifacts[i].addAttribute(value.attributeName, stringToObject(value.clas, value.sourceValue));
+ }
+ destArtifacts[i].persistAttributesAndRelations();
+ }
+ // Create the source branch
+ sourceBranch = BranchManager.createWorkingBranch(destBranch, SOURCE_BRANCH, null);
+
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ sourceArtifacts[i] = ArtifactQuery.getArtifactFromId(destArtifacts[i].getArtId(), sourceBranch);
+ }
+ // create attribute conflicts
+
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ //handle source objects
+ for (AttributeValue value : conflictDefs[i].values) {
+ if (value.sourceDeleted) {
+ sourceArtifacts[i].getSoleAttribute(value.attributeName).delete();
+ } else {
+ if (value.sourceValue != null) {
+ conflictDefs[i].sourceModified = true;
+ sourceArtifacts[i].setSoleAttributeValue(value.attributeName, stringToObject(value.clas,
+ value.sourceValue));
+ }
+ if (value.sourceValue != null && value.destValue != null) {
+ conflictDefs[i].numConflicts++;
+ }
+ }
+ }
+
+ ///handle destination objects
+ sourceArtifacts[i].persistAttributes();
+ for (AttributeValue value : conflictDefs[i].values) {
+ if (value.destinationDeleted) {
+ destArtifacts[i].getSoleAttribute(value.attributeName).delete();
+ } else if (value.destValue != null) {
+ conflictDefs[i].destModified = true;
+ destArtifacts[i].setSoleAttributeValue(value.attributeName, stringToObject(value.clas, value.destValue));
+ }
+ }
+ }
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ destArtifacts[i].persistAttributes();
+
+ if (conflictDefs[i].destDelete) {
+ System.out.println("Deleting Artifact with ID " + destArtifacts[i].getArtId() + " index " + i);
+ destArtifacts[i].deleteAndPersist();
+ }
+ if (conflictDefs[i].sourceDelete) {
+ System.out.println("Deleting Artifact with ID " + sourceArtifacts[i].getArtId() + " index " + i);
+ sourceArtifacts[i].deleteAndPersist();
+ }
+ if (DEBUG) {
+ DeletionTest.dumpArtifact(sourceArtifacts[i]);
+ for (RelationLink link : sourceArtifacts[i].getRelationsAll(false)) {
+ DeletionTest.dumpRelation(link, sourceArtifacts[i]);
+ }
+ DeletionTest.dumpArtifact(destArtifacts[i]);
+ for (RelationLink link : destArtifacts[i].getRelationsAll(false)) {
+ DeletionTest.dumpRelation(link, destArtifacts[i]);
+ }
+ System.out.println(" ");
+ }
+ }
+ performModifications();
+ }
+
+ /**
+ *
+ */
+ private static void performModifications() throws OseeCoreException {
+ createModifications();
+ for (ArtifactModification modification : modifications) {
+ switch (modification.modificationToPerform) {
+ case CREATE:
+ switch (modification.itemToChange) {
+ case ARTIFACT:
+ createArtifact(modification.rootArtifact, modification.branch, modification.type,
+ modification.Name);
+ break;
+ case ATTRIBUTE:
+ createAttribute((Artifact) modification.object, modification.Name, modification.clas,
+ modification.value);
+ break;
+ case RELATION:
+ createRelation((Artifact) modification.object, (Artifact) modification.object2);
+ break;
+ }
+ break;
+ case DELETE:
+ break;
+ case MODIFY:
+ break;
+ case CREATE_AND_DELETE:
+ switch (modification.itemToChange) {
+ case ARTIFACT:
+ createArtifact(modification.rootArtifact, modification.branch, modification.type,
+ modification.Name).deleteAndPersist();
+ break;
+ case ATTRIBUTE:
+ createAttribute((Artifact) modification.object, modification.Name, modification.clas,
+ modification.value);
+ ((Artifact) modification.object).deleteSoleAttribute(modification.Name);
+ ((Artifact) modification.object).persistAttributes();
+ break;
+ case RELATION:
+ createRelation((Artifact) modification.object, (Artifact) modification.object2);
+ ((Artifact) modification.object).deleteRelation(CoreRelationEnumeration.Dependency__Dependency,
+ (Artifact) modification.object2);
+ ((Artifact) modification.object).persistRelations();
+ break;
+ }
+
+ break;
+ case CREATE_AND_MODIFY:
+ break;
+ case MODIFY_AND_DELETE:
+ break;
+ }
+ }
+ }
+
+ protected static Artifact createArtifact(int rootArtifactId, Branch branch, String type, String name) throws OseeCoreException {
+ Artifact rootArtifact = ArtifactQuery.getArtifactFromAttribute("Name", FOLDER, branch);
+ // ConfigurationPersistenceManager.getArtifactSubtypeDescriptor(conflictDefs[i].artifactType);
+ if (rootArtifactId > 0 && rootArtifactId < NUMBER_OF_ARTIFACTS) {
+ if (branch.equals(destArtifacts[0].getBranch())) {
+ rootArtifact = destArtifacts[rootArtifactId];
+ }
+ if (branch.equals(sourceArtifacts[0].getBranch())) {
+ rootArtifact = sourceArtifacts[rootArtifactId];
+ }
+ }
+ Artifact child = rootArtifact.addNewChild(ArtifactTypeManager.getType(type), name);
+ child.persistAttributesAndRelations();
+ return child;
+ }
+
+ protected static Attribute<?> createAttribute(Artifact artifact, String name, Class<?> clas, String value) throws OseeCoreException {
+ artifact.addAttribute(name, stringToObject(clas, value));
+ artifact.persistAttributes();
+ return artifact.getSoleAttribute(name);
+ }
+
+ protected static RelationLink createRelation(Artifact artifact, Artifact artifactB) throws OseeCoreException {
+ artifact.addRelation(CoreRelationEnumeration.Dependency__Dependency, artifactB);
+ artifact.persistRelations();
+ return artifact.getRelations(CoreRelationEnumeration.Dependency__Dependency).get(0);
+ }
+
+ public static void cleanUpConflictTest() throws Exception {
+ //delete the destination, source and merge branch's
+ Branch sBranch = null;
+ Branch dBranch = null;
+ Branch mBranch = null;
+ try {
+ sBranch = BranchManager.getBranch(SOURCE_BRANCH);
+ } catch (Exception ex) {
+ }
+ if (sBranch == null) {
+ for (Branch branch : BranchManager.getArchivedBranches()) {
+ if (branch.getBranchName().equals(SOURCE_BRANCH)) {
+ sBranch = branch;
+ break;
+ }
+ }
+ }
+ try {
+ dBranch = BranchManager.getBranch(DEST_BRANCH);
+ } catch (Exception ex) {
+ }
+ if (dBranch == null) {
+ for (Branch branch : BranchManager.getArchivedBranches()) {
+ if (branch.getBranchName().equals(DEST_BRANCH)) {
+ dBranch = branch;
+ break;
+ }
+ }
+ }
+ try {
+ mBranch = BranchManager.getMergeBranch(sBranch, dBranch);
+ } catch (Exception ex) {
+ }
+
+ if (mBranch != null) {
+ BranchManager.purgeBranch(mBranch);
+ }
+ if (sBranch != null) {
+ BranchManager.purgeBranch(sBranch);
+ }
+ if (dBranch != null) {
+ BranchManager.purgeBranch(dBranch);
+ }
+ }
+
+ /**
+ * @return the sourceBranchID
+ */
+ public static Branch getSourceBranch() {
+ return sourceBranch;
+ }
+
+ /**
+ * @return the destBranchID
+ */
+ public static Branch getDestBranch() {
+ return destBranch;
+ }
+
+ /**
+ * @return the sourceBranchID
+ */
+ public static Artifact getSourceArtifact(int position) {
+ if (position >= 0 && position < NUMBER_OF_ARTIFACTS) {
+ return sourceArtifacts[position];
+ }
+ return null;
+ }
+
+ /**
+ * @return the destBranchID
+ */
+ public static Artifact getDestArtifact(int position) {
+ if (position >= 0 && position < NUMBER_OF_ARTIFACTS) {
+ return destArtifacts[position];
+ }
+ return null;
+ }
+
+ public static int numberOfConflicts() {
+ int total = 0;
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ total += conflictDefs[i].getNumberConflicts(conflictDefs);
+ }
+ return total;
+ }
+
+ public static int numberOfArtifactsOnMergeBranch() {
+ int total = 0;
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ total += conflictDefs[i].artifactAdded(conflictDefs) ? 1 : 0;
+ }
+ return total;
+ }
+
+ public static boolean hasConflicts() {
+ return numberOfConflicts() > 0;
+ }
+
+ public static void resolveAttributeConflict(AttributeConflict conflict) throws Exception {
+ int sourceArtifactId = conflict.getSourceArtifact().getArtId();
+ String attributeName = conflict.getSourceAttribute(true).getAttributeType().getName();
+ AttributeValue aValue = null;
+ int artNumber = -1;
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ if (sourceArtifactId == sourceArtifacts[i].getArtId()) {
+ artNumber = i;
+ break;
+ }
+ }
+ if (artNumber == -1) {
+ throw new Exception("Source Artifact " + sourceArtifactId + " could not be found in the list of artifatcs");
+ }
+ for (AttributeValue value : conflictDefs[artNumber].values) {
+ if (value.attributeName.equals(attributeName)) {
+ aValue = value;
+ break;
+ }
+ }
+ if (aValue == null) {
+ throw new Exception(
+ "Source Artifact " + sourceArtifactId + " does not have a conflict for the" + attributeName + " attribute");
+ }
+ if (aValue.mergeValue == null) {
+ throw new Exception("Merge Value has a null value so no resolution possible");
+ }
+ if (aValue.mergeValue.equalsIgnoreCase("Source")) {
+ conflict.setToSource();
+ } else if (aValue.mergeValue.equalsIgnoreCase("Destination")) {
+ conflict.setToDest();
+ } else {
+ conflict.setAttributeValue(stringToObject(aValue.clas, aValue.mergeValue));
+ }
+ conflict.getAttribute();
+ }
+
+ public static boolean validateCommit() throws Exception {
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ if (!conflictDefs[i].destDelete && !conflictDefs[i].sourceDelete) {
+ for (AttributeValue value : conflictDefs[i].values) {
+ String expected = value.mergeValue;
+ if (expected.equalsIgnoreCase("Source")) {
+ expected = value.sourceValue;
+ } else if (expected.equalsIgnoreCase("Destination")) {
+ expected = value.destValue;
+ }
+ if (value.sourceValue == null) {
+ expected = value.destValue;
+ }
+ if (value.destValue == null) {
+ expected = value.sourceValue;
+ }
+ if (value.sourceDeleted) {
+ if (destArtifacts[i].getSoleAttributeValueAsString(value.attributeName, "Deleted").equals("Deleted")) {
+ System.err.println("The attribute should have been deleted but wasn't");
+ return false;
+ }
+ } else if (!stringToObject(value.clas, expected).toString().equals(
+ destArtifacts[i].getSoleAttributeValueAsString(value.attributeName, " ")) && !destArtifacts[i].isDeleted()) {
+ System.err.println("Expected the " + value.attributeName + " attribute to have a value of " + stringToObject(
+ value.clas, expected) + " but got " + destArtifacts[i].getSoleAttributeValueAsString(
+ value.attributeName, " ") + " for Artifact " + destArtifacts[i].getArtId() + " conflict index: " + i);
+ return false;
+ }
+ }
+ } else {
+ if (conflictDefs[i].destDelete && !destArtifacts[i].isDeleted()) {
+ System.err.println("Artifact " + destArtifacts[i] + " " + i + " should be deleted but isn't");
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public static void createModifications() throws OseeCoreException {
+ modifications.clear();
+ modifications.add(new ArtifactModification(Type.ARTIFACT, Modification.CREATE_AND_DELETE, 0,
+ sourceArtifacts[0].getBranch(), "Software Requirement", "Test create an Delete"));
+ modifications.add(new ArtifactModification(Type.ATTRIBUTE, Modification.CREATE_AND_DELETE, sourceArtifacts[2],
+ "Page Type", StringAttribute.class, "Portrait"));
+ modifications.add(new ArtifactModification(Type.RELATION, Modification.CREATE_AND_DELETE, sourceArtifacts[6],
+ sourceArtifacts[7]));
+ }
+
+ public static void createConflictDefinitions() {
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ conflictDefs[i] = new ConflictDefinition();
+ }
+
+ conflictDefs[0].setValues("Software Requirement", false, false, 0, 0);
+ conflictDefs[1].setValues("Software Requirement", false, false, 0, 0);
+
+ conflictDefs[2].setValues("Software Requirement", false, false, 0, 0);
+ conflictDefs[2].values.add(new AttributeValue("Safety Criticality", "B", "C", "Destination",
+ StringAttribute.class));
+ conflictDefs[2].values.add(new AttributeValue("CSCI", "Sights", "Navigation", "Source", StringAttribute.class));
+ conflictDefs[2].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Navigation",
+ StringAttribute.class));
+ conflictDefs[2].values.add(new AttributeValue("Name", "Test Artifact Number 2 - Source",
+ "Test Artifact Number 2 - Destination", "Test Artifact Number 2 - Merge", StringAttribute.class));
+
+ conflictDefs[3].setValues("Software Requirement", true, false, 0, 0);
+ conflictDefs[3].values.add(new AttributeValue("Safety Criticality", "B", "C", "Destination",
+ StringAttribute.class));
+ conflictDefs[3].values.add(new AttributeValue("Page Type", "Landscape", "Portrait", "Source",
+ StringAttribute.class));
+ conflictDefs[3].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[3].values.add(new AttributeValue("Name", "Test Artifact Number 3 - Source", null, "Destination",
+ StringAttribute.class));
+
+ conflictDefs[4].setValues("Software Requirement", false, false, 0, 0);
+
+ conflictDefs[5].setValues("Software Requirement", false, true, 0, 0);
+ conflictDefs[5].values.add(new AttributeValue("Safety Criticality", "A", "C", "Source", StringAttribute.class));
+ conflictDefs[5].values.add(new AttributeValue("Page Type", "Landscape", "Portrait", "Destination",
+ StringAttribute.class));
+ conflictDefs[5].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[5].values.add(new AttributeValue("Name", "Test Artifact Number 5 - Source", null, "Source",
+ StringAttribute.class));
+
+ conflictDefs[6].setValues("Software Requirement", false, false, 0, 0);
+
+ conflictDefs[7].setValues("Version", false, false, 0, 0);
+
+ conflictDefs[8].setValues("Version", false, false, 0, 0);
+ conflictDefs[8].values.add(new AttributeValue("ats.Release Date", "2000", "50000000", "Source",
+ DateAttribute.class));
+
+ conflictDefs[9].setValues("Version", false, false, 0, 0);
+
+ conflictDefs[10].setValues("Software Requirement", false, false, 0, DELETION_TEST_QUERY);
+ conflictDefs[10].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[10].values.add(new AttributeValue("Name", "Test Artifact Number 10 - Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[11].setValues("Software Requirement", false, false, 10, 0);
+ conflictDefs[11].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[11].values.add(new AttributeValue("Name", "Test Artifact Number 11 - Child", null, "Source",
+ StringAttribute.class));
+ conflictDefs[12].setValues("Software Requirement", false, false, 10, 0);
+ conflictDefs[12].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[12].values.add(new AttributeValue("Name", "Test Artifact Number 12 - Child/Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[13].setValues("Software Requirement", false, false, 12, 0);
+ conflictDefs[13].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[13].values.add(new AttributeValue("Name", "Test Artifact Number 13 - Child", null, "Source",
+ StringAttribute.class));
+
+ conflictDefs[14].setValues("Software Requirement", false, false, 0, 0);
+ conflictDefs[14].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[14].values.add(new AttributeValue("Name", "Test Artifact Number 14 - Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[14].values.add(new AttributeValue("Safety Criticality", "E", null, "Source", StringAttribute.class,
+ true, false));
+
+ conflictDefs[15].setValues("Software Requirement", false, false, 14, DELETION_TEST_QUERY);
+ conflictDefs[15].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[15].values.add(new AttributeValue("Name", "Test Artifact Number 15 - Child", null, "Source",
+ StringAttribute.class));
+ conflictDefs[16].setValues("Software Requirement", false, false, 14, 0);
+ conflictDefs[16].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[16].values.add(new AttributeValue("Name", "Test Artifact Number 16 - Child/Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[17].setValues("Software Requirement", false, false, 15, 0);
+ conflictDefs[17].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[17].values.add(new AttributeValue("Name", "Test Artifact Number 17 - Child", null, "Source",
+ StringAttribute.class));
+
+ conflictDefs[18].setValues("Software Requirement", false, false, 0, 0);
+ conflictDefs[18].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[18].values.add(new AttributeValue("Name", "Test Artifact Number 18 - Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[19].setValues("Software Requirement", false, false, 18, DELETION_ATTRIBUTE_TEST_QUERY);
+ conflictDefs[19].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[19].values.add(new AttributeValue("Name", "Test Artifact Number 19 - Child", null, "Source",
+ StringAttribute.class));
+
+ conflictDefs[20].setValues("Software Requirement", true, false, 0, REVERT_ARTIFACT_QUERY);
+ conflictDefs[20].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Source",
+ StringAttribute.class));
+ conflictDefs[20].values.add(new AttributeValue("Name", "Test Artifact Number 20 - Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[21].setValues("Software Requirement", false, false, 20, 0);
+ conflictDefs[21].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[21].values.add(new AttributeValue("Name", "Test Artifact Number 21 - Child", null, "Source",
+ StringAttribute.class));
+ conflictDefs[22].setValues("Software Requirement", false, false, 20, 0);
+ conflictDefs[22].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[22].values.add(new AttributeValue("Name", "Test Artifact Number 22 - Child/Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[23].setValues("Software Requirement", false, false, 22, 0);
+ conflictDefs[23].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Source",
+ StringAttribute.class));
+ conflictDefs[23].values.add(new AttributeValue("Name", "Test Artifact Number 23 - Child", "The Other Name",
+ "Source", StringAttribute.class));
+
+ conflictDefs[24].setValues("Software Requirement", false, false, 0, 0);
+ conflictDefs[24].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Source",
+ StringAttribute.class));
+ conflictDefs[24].values.add(new AttributeValue("Name", "Test Artifact Number 24 - Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[25].setValues("Software Requirement", false, false, 24, 0);
+ conflictDefs[25].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[25].values.add(new AttributeValue("Name", "Test Artifact Number 25 - Child", null, "Source",
+ StringAttribute.class));
+ conflictDefs[26].setValues("Software Requirement", false, false, 24, REVERT_REL_LINK_QUERY);
+ conflictDefs[26].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[26].values.add(new AttributeValue("Name", "Test Artifact Number 26 - Child/Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[27].setValues("Software Requirement", false, false, 26, REVERT_ATTRIBUTE_QUERY);
+ conflictDefs[27].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Source",
+ StringAttribute.class));
+ conflictDefs[27].values.add(new AttributeValue("Name", "Test Artifact Number 27 - Child", "The Other Name",
+ "Source", StringAttribute.class));
+
+ conflictDefs[28].setValues("Software Requirement", false, false, 0, UPDATE_PARENT_QUERY);
+ conflictDefs[28].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Source",
+ StringAttribute.class));
+ conflictDefs[28].values.add(new AttributeValue("Name", "Test Artifact Number 28 Source",
+ "Test Artifact Number 28 Destination", "Source", StringAttribute.class));
+ conflictDefs[29].setValues("Software Requirement", false, false, 28, 0);
+ conflictDefs[29].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[29].values.add(new AttributeValue("Name", "Test Artifact Number 29 - Child", null, "Source",
+ StringAttribute.class));
+ conflictDefs[30].setValues("Software Requirement", false, false, 28, 0);
+ conflictDefs[30].values.add(new AttributeValue("Subsystem", "Electrical", null, "Source", StringAttribute.class));
+ conflictDefs[30].values.add(new AttributeValue("Name", "Test Artifact Number 30 - Child/Parent", null, "Source",
+ StringAttribute.class));
+ conflictDefs[31].setValues("Software Requirement", false, false, 30, 0);
+ conflictDefs[31].values.add(new AttributeValue("Subsystem", "Electrical", "Sights", "Source",
+ StringAttribute.class));
+ conflictDefs[31].values.add(new AttributeValue("Name", "Test Artifact Number 31 - Child", "The Other Name",
+ "Source", StringAttribute.class));
+ }
+
+ public static List<Artifact> getArtifacts(boolean sourceBranch, int queryId) {
+ List<Artifact> queriedArtifacts = new LinkedList<Artifact>();
+ for (int i = 0; i < NUMBER_OF_ARTIFACTS; i++) {
+ if (conflictDefs[i].queryNumber == queryId) {
+ if (sourceBranch) {
+ queriedArtifacts.add(sourceArtifacts[i]);
+ } else {
+ queriedArtifacts.add(destArtifacts[i]);
+ }
+ }
+ }
+ return queriedArtifacts;
+ }
+
+ @SuppressWarnings( {"unchecked"})
+ public static Object stringToObject(Class clas, String value) {
+
+ if (clas.equals(BooleanAttribute.class)) {
+ return new Boolean(value.equals(BooleanAttribute.booleanChoices[0]));
+ }
+ if (clas.equals(IntegerAttribute.class)) {
+ if (value.equals("")) {
+ return new Integer(0);
+ }
+ return new Integer(value);
+ }
+ if (clas.equals(DateAttribute.class)) {
+ if (value.equals("")) {
+ return new Date(1);
+ }
+ return new Date(Long.parseLong(value));
+ }
+ if (clas.equals(FloatingPointAttribute.class)) {
+ if (value.equals("")) {
+ return new Double(0);
+ }
+ return new Double(value);
+ }
+ return value;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/CsvArtifactTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/CsvArtifactTest.java
new file mode 100644
index 00000000000..4a0615a3619
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/CsvArtifactTest.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.framework.skynet.core.test.cases;
+import static org.junit.Assert.*;
+
+import java.util.Collection;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.CsvArtifact;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CsvArtifactTest {
+
+ private static String id = "org.csv.artifact.test";
+ private static String csvData = "Name, Value1, Value2\narf,1,3\nbarn,3,5";
+ private static String appendData = "snarf,6,3";
+
+ @org.junit.Test
+public void testCleanupPre() throws Exception {
+ cleanup();
+ }
+
+ @org.junit.Test
+public void testCreateCsvArtifact() throws Exception {
+ CsvArtifact csv =
+ CsvArtifact.getCsvArtifact(id, BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), true);
+ assertEquals(csv.getCsvData(), "");
+ csv.getArtifact().setDescriptiveName(id);
+ csv.setCsvData(csvData);
+ csv.getArtifact().persistAttributes();
+ }
+
+ @org.junit.Test
+public void testgetCsvArtifactAndAppendData() throws Exception {
+ CsvArtifact csvArt =
+ CsvArtifact.getCsvArtifact(id, BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false);
+ assertNotNull(csvArt);
+ assertEquals(csvData, csvArt.getCsvData());
+ csvArt.appendData(appendData);
+ csvArt.getArtifact().persistAttributes();
+ }
+
+ @org.junit.Test
+public void testCsvGetData() throws Exception {
+ CsvArtifact csvArt =
+ CsvArtifact.getCsvArtifact(id, BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false);
+ assertNotNull(csvArt);
+ assertEquals(csvData + "\n" + appendData, csvArt.getCsvData());
+ }
+
+ @org.junit.Test
+public void testCleanupPost() throws Exception {
+ cleanup();
+ }
+
+ private void cleanup() throws Exception {
+ Collection<Artifact> arts =
+ ArtifactQuery.getArtifactsFromName(id, BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false);
+ ArtifactPersistenceManager.purgeArtifacts(arts);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/DeletionTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/DeletionTest.java
new file mode 100644
index 00000000000..1c6106a0b88
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/DeletionTest.java
@@ -0,0 +1,463 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.Collection;
+import java.util.LinkedList;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.PurgeTransactionJob;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.junit.Before;
+
+/**
+ * @author Theron Virgin
+ */
+public class DeletionTest {
+
+ private static final String CHECK_FOR_ZERO_TX_CURRENT =
+ "SELECT tx_current, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_artifact_version art WHERE det.branch_id = ? AND det.transaction_id < ? AND det.transaction_id = txs.transaction_id AND txs.tx_current != 0 AND txs.gamma_id = art.gamma_id and art.art_id = ?";
+ private static final String CHECK_FOR_DELETED_TX_CURRENT =
+ "SELECT tx_current, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_artifact_version art WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.tx_current = 2 AND txs.gamma_id = art.gamma_id and art.art_id = ?";
+
+ private static final String CHECK_FOR_ZERO_TX_CURRENT_ATTRIBUTE =
+ "SELECT tx_current, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_attribute att WHERE det.branch_id = ? AND det.transaction_id < ? AND det.transaction_id = txs.transaction_id AND txs.tx_current != 0 AND txs.gamma_id = att.gamma_id and att.attr_id = ?";
+ private static final String CHECK_FOR_DELETED_TX_CURRENT_ATTRIBUTE =
+ "SELECT tx_current, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_attribute att WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.tx_current = ? AND txs.gamma_id = att.gamma_id and att.attr_id = ?";
+
+ private static final String CHECK_FOR_ZERO_TX_CURRENT_RELATION =
+ "SELECT tx_current, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE det.branch_id = ? AND det.transaction_id < ? AND det.transaction_id = txs.transaction_id AND txs.tx_current != 0 AND txs.gamma_id = rel.gamma_id and rel.rel_link_id = ?";
+ private static final String CHECK_FOR_DELETED_TX_CURRENT_RELATION =
+ "SELECT tx_current, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.tx_current = ? AND txs.gamma_id = rel.gamma_id and rel.rel_link_id = ?";
+
+ private static final String GET_DELETED_TRANSACTION = "SELECT * FROM osee_txs WHERE transaction_id = ?";
+
+ private static final String GET_ARTIFACT_DEBUG =
+ "Select det.branch_id, det.transaction_id, txs.tx_current, txs.mod_type, txs.gamma_id, art.art_id FROM osee_tx_details det, osee_txs txs, osee_artifact_version art WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = art.gamma_id AND art.art_id = ?";
+
+ private static final String GET_ATTRIBUTE_DEBUG =
+ "Select det.branch_id, det.transaction_id, txs.tx_current, txs.mod_type, txs.gamma_id, att.art_id, att.attr_id FROM osee_tx_details det, osee_txs txs, osee_attribute att WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = att.gamma_id AND att.attr_id = ?";
+
+ private static final String GET_RELATION_DEBUG =
+ "Select det.branch_id, det.transaction_id, txs.tx_current, txs.mod_type, txs.gamma_id, rel.rel_link_id, rel.a_art_id, rel.b_art_id FROM osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id AND rel.rel_link_id = ?";
+
+ private static final String[] CHECK_DELETED_ARTIFACTS_REORDER =
+ {
+ "select rel1.",
+ " as order, rel1.rel_link_id from osee_relation_link rel1, osee_txs txs1, osee_tx_details det1, osee_artifact_version art1, osee_txs txs2, osee_tx_details det2 where det1.transaction_id = txs1.transaction_id and rel1.gamma_id = txs1.gamma_id and txs1.tx_current = 1 and rel1.",
+ " = art1.art_id and art1.gamma_id = txs2.gamma_id and txs2.tx_current = 2 and det2.transaction_id = txs2.transaction_id and det1.branch_id = det2.branch_id"};
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core.test/debug/Junit"));
+
+ private static final boolean DELETE_TRANSACTION_TEST = true;
+ private static final boolean INDIVIDUAL_DELETE_TEST = true;
+ private static final boolean REORDER_TEST = true;
+
+ /**
+ * @param name
+ */
+ public DeletionTest(String name) {
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Before
+ protected void setUp() throws Exception {
+ assertFalse(ClientSessionManager.isProductionDataStore());
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.BranchManager#getMergeBranch(Branch, Branch)} .
+ */
+ public void deleteAndCheckTXCurrents() throws OseeCoreException, InterruptedException {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ Collection<Artifact> artifacts = ConflictTestManager.getArtifacts(true, ConflictTestManager.DELETION_TEST_QUERY);
+ Collection<Artifact> artifactsToCheck = new LinkedList<Artifact>();
+ int deletionTransaction = 0;
+ for (Artifact artifact : artifacts) {
+ artifactsToCheck.add(artifact);
+ artifactsToCheck.addAll(artifact.getDescendants());
+ }
+ if (DEBUG) {
+ System.err.println("Initial Status artifacts");
+ for (Artifact artifact : artifactsToCheck) {
+ dumpArtifact(artifact);
+ for (Attribute<?> attribute : artifact.getAttributes(true)) {
+ dumpAttribute(attribute);
+ }
+ for (RelationLink relation : artifact.getRelationsAll(true)) {
+ dumpRelation(relation, artifact);
+ }
+ }
+ System.err.println("Deleting the first set of artifacts");
+ }
+ for (Artifact artifact : artifacts) {
+ artifact.deleteAndPersist();
+ if (DEBUG) {
+ System.err.println("Deleting Artifact " + artifact.getArtId());
+ }
+ }
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ //Let's check both through the API and the SQL to make sure the Artifact is internally deleted
+ //and deleted in the Database, That we don't get some bad data case.
+
+ //Check that artifacts are deleted
+ for (Artifact artifact : artifactsToCheck) {
+ deletionTransaction = artifact.getTransactionNumber();
+ assertTrue("Artifact " + artifact.getArtId() + " should be deleted, but isn't", artifact.isDeleted());
+ //Now Check Artifact in the DB tx_currents etc
+
+ if (DEBUG) {
+ dumpArtifact(artifact);
+ } else {
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_ZERO_TX_CURRENT, artifact.getBranch().getBranchId(),
+ artifact.getTransactionNumber(), artifact.getArtId());
+ if (chStmt.next()) {
+ fail("Artifact " + artifact.getArtId() + " old Transaction < " + artifact.getTransactionNumber() + " is set to " + chStmt.getInt("tx_current") + " , should be 0 on branch " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_DELETED_TX_CURRENT, artifact.getBranch().getBranchId(),
+ artifact.getArtId());
+ if (chStmt.next()) {
+ assertTrue(
+ "Artifact " + artifact.getArtId() + " Transaction: " + artifact.getTransactionNumber() + " should be 3 on branch " + artifact.getBranch().getBranchId(),
+ chStmt.getInt("transaction_id") == artifact.getTransactionNumber());
+ } else {
+ fail("Artifact " + artifact.getArtId() + " was not given a tx_current value of 2 when it was deleted on branch " + artifact.getBranch().getBranchId() + " on transaction " + artifact.getTransactionNumber());
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ //Check that attributes are Artifact Deleted
+ for (Attribute<?> attribute : artifact.getAttributes(true)) {
+ if (DEBUG) {
+ dumpAttribute(attribute);
+ } else {
+ checkAttribute(artifact, attribute, TxChange.ARTIFACT_DELETED.getValue());
+ }
+ }
+ //Check that relations are deleted.
+ for (RelationLink relation : artifact.getRelationsAll(true)) {
+ if (DEBUG) {
+ dumpRelation(relation, artifact);
+ } else {
+ checkRelation(artifact, relation, TxChange.ARTIFACT_DELETED.getValue());
+ }
+ }
+ }
+
+ //OK now lets delete the transaction and check for the same thing
+
+ if (DELETE_TRANSACTION_TEST) {
+ Job job = new PurgeTransactionJob(true, deletionTransaction);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ job.join();
+
+ if (DEBUG) {
+ System.err.println("Deleting the Transaction");
+ }
+ //This is only a DB deletion so it won't be reflected in the
+ for (Artifact artifact : artifactsToCheck) {
+ if (DEBUG) {
+ dumpArtifact(artifact);
+ } else {
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_ZERO_TX_CURRENT, artifact.getBranch().getBranchId(),
+ deletionTransaction, artifact.getArtId());
+ if (chStmt.next()) {
+ if (deletionTransaction == chStmt.getInt("transaction_id")) {
+ fail("Artifact " + artifact.getArtId() + " tx_current set on " + chStmt.getInt("transaction_id") + " when it should be < " + deletionTransaction + " on branch " + artifact.getBranch().getBranchId());
+ }
+ if (chStmt.next()) {
+ fail("Artifact " + artifact.getArtId() + " has multiple tx_current set on " + artifact.getBranch().getBranchId());
+ }
+ } else {
+ fail("Artifact " + artifact.getArtId() + " has no tx_current set on " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ //Check that attributes are Artifact Deleted
+ for (Attribute<?> attribute : artifact.getAttributes(true)) {
+ if (DEBUG) {
+ dumpAttribute(attribute);
+ } else {
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_ZERO_TX_CURRENT_ATTRIBUTE, artifact.getBranch().getBranchId(),
+ deletionTransaction, attribute.getAttrId());
+ if (chStmt.next()) {
+ if (deletionTransaction == chStmt.getInt("transaction_id")) {
+ fail("Attribute " + attribute.getAttrId() + " tx_current set on " + chStmt.getInt("transaction_id") + " when it should be < " + deletionTransaction + " on branch " + artifact.getBranch().getBranchId());
+ }
+ if (chStmt.next()) {
+ fail("Attribute " + attribute.getAttrId() + " has multiple tx_current set on " + artifact.getBranch().getBranchId());
+ }
+ } else {
+ fail("Attribute " + attribute.getAttrId() + " has no tx_current set on " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+ for (RelationLink relation : artifact.getRelationsAll(true)) {
+ if (DEBUG) {
+ dumpRelation(relation, artifact);
+ } else {
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_ZERO_TX_CURRENT_RELATION, artifact.getBranch().getBranchId(),
+ deletionTransaction, relation.getRelationId());
+ if (chStmt.next()) {
+ if (deletionTransaction == chStmt.getInt("transaction_id")) {
+ fail("Relation " + relation.getRelationId() + " tx_current set on " + chStmt.getInt("transaction_id") + " when it should be < " + deletionTransaction + " on branch " + artifact.getBranch().getBranchId());
+ }
+ if (chStmt.next()) {
+ fail("Relation " + relation.getRelationId() + " has multiple tx_current set on " + artifact.getBranch().getBranchId());
+ }
+ } else {
+ fail("Relation " + relation.getRelationId() + " has no tx_current set on " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ }
+
+ try {
+ chStmt.runPreparedQuery(GET_DELETED_TRANSACTION, deletionTransaction);
+ assertTrue(
+ "Trancsaction " + deletionTransaction + " should be deleted and should not be found in the database",
+ !chStmt.next());
+ } finally {
+ chStmt.close();
+ }
+ }
+ if (INDIVIDUAL_DELETE_TEST) {
+
+ //Check deleting an attribute and deleting a relation directly create the desired effect.
+
+ if (ConflictTestManager.getArtifacts(true, ConflictTestManager.DELETION_ATTRIBUTE_TEST_QUERY).size() > 0) {
+
+ Artifact artifactForDeletionCheck =
+ ConflictTestManager.getArtifacts(true, ConflictTestManager.DELETION_ATTRIBUTE_TEST_QUERY).get(0);
+
+ if (artifactForDeletionCheck != null) {
+ Attribute<?> attribute = artifactForDeletionCheck.getAttributes(false).get(0);
+ RelationLink relation =
+ artifactForDeletionCheck.getRelations(RelationTypeManager.getType("Default Hierarchical")).get(0);
+ attribute.delete();
+ relation.delete(true);
+ artifactForDeletionCheck.persistAttributesAndRelations();
+ //check for internal deletions and then check the database
+
+ assertTrue("Attribute " + attribute.getAttrId() + " should be deleted but isn't", attribute.isDeleted());
+ assertTrue("Relation " + relation.getRelationId() + " should be deleted but isn't", relation.isDeleted());
+
+ checkAttribute(artifactForDeletionCheck, attribute, TxChange.DELETED.getValue());
+ checkRelation(artifactForDeletionCheck, relation, TxChange.DELETED.getValue());
+ }
+
+ }
+ }
+
+ if (REORDER_TEST) {
+ try {
+ chStmt.runPreparedQuery(CHECK_DELETED_ARTIFACTS_REORDER[0] + "a_order" + CHECK_DELETED_ARTIFACTS_REORDER[1] + "a_order" + CHECK_DELETED_ARTIFACTS_REORDER[2]);
+ if (chStmt.next()) {
+ if (DEBUG) {
+ System.out.println(" Found the following Relation Links with bad A ordering values");
+ do {
+ System.out.println(String.format("Rel_link_id = %d , a_order_id = %d",
+ chStmt.getInt("rel_link_id"), chStmt.getInt("order")));
+ } while (chStmt.next());
+ }
+ fail("Found Deleted Artifacts that were in use in a relation ordering");
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(CHECK_DELETED_ARTIFACTS_REORDER[0] + "b_order" + CHECK_DELETED_ARTIFACTS_REORDER[1] + "b_order" + CHECK_DELETED_ARTIFACTS_REORDER[2]);
+ if (chStmt.next()) {
+ if (DEBUG) {
+ System.out.println(" Found the following Relation Links with bad B ordering values");
+ do {
+ System.out.println(String.format("Rel_link_id = %d , b_order_id = %d",
+ chStmt.getInt("rel_link_id"), chStmt.getInt("order")));
+ } while (chStmt.next());
+ }
+ fail("Found Deleted Artifacts that were in use in a relation ordering");
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ }
+
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getAllLogs().size()),
+ monitorLog.getAllLogs().size() == 0);
+ if (DEBUG) {
+ fail("Deletion Test was run with tracing enabled to prevent stopping at a failure so no conditions were checked.");
+ }
+ if (!REORDER_TEST) {
+ fail("The Reordering Test was not run. Check the flag");
+ }
+ if (!DELETE_TRANSACTION_TEST) {
+ fail("The Delete Transaction Test was not run. Check the flag");
+ }
+ if (!INDIVIDUAL_DELETE_TEST) {
+ fail("The Individual Deletion Test was not run. Check the flag");
+ }
+ }
+
+ private void checkAttribute(Artifact artifact, Attribute<?> attribute, int value) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_ZERO_TX_CURRENT_ATTRIBUTE, artifact.getBranch().getBranchId(),
+ artifact.getTransactionNumber(), attribute.getAttrId());
+ if (chStmt.next()) {
+ fail("Attribute " + attribute.getAttrId() + " old Transaction < : " + artifact.getTransactionNumber() + " is set to " + chStmt.getInt("tx_current") + " , should be 0 on branch " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_DELETED_TX_CURRENT_ATTRIBUTE, artifact.getBranch().getBranchId(), value,
+ attribute.getAttrId());
+ if (chStmt.next()) {
+ assertTrue(
+ "Attribute " + attribute.getAttrId() + " Transaction: " + artifact.getTransactionNumber() + " should be 3 on branch " + artifact.getBranch().getBranchId(),
+ chStmt.getInt("transaction_id") == artifact.getTransactionNumber());
+ } else {
+ fail("Attribute " + attribute.getAttrId() + " was not given a tx_current value of 3 when it was deleted on branch " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public void checkRelation(Artifact artifact, RelationLink relation, int value) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ assertTrue(
+ "Relation should be deleted between Parent: " + relation.getAArtifactId() + " and child " + relation.getBArtifactId(),
+ relation.isDeleted());
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_ZERO_TX_CURRENT_RELATION, artifact.getBranch().getBranchId(),
+ artifact.getTransactionNumber(), relation.getRelationId());
+ if (chStmt.next()) {
+ fail("Relation " + relation.getRelationId() + " old Transaction < : " + artifact.getTransactionNumber() + " is set to " + chStmt.getInt("tx_current") + " , should be 0 on branch " + artifact.getBranch().getBranchId());
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(CHECK_FOR_DELETED_TX_CURRENT_RELATION, artifact.getBranch().getBranchId(), value,
+ relation.getRelationId());
+ if (chStmt.next()) {
+ assertTrue(
+ "Relation " + relation.getRelationId() + " Transaction: " + artifact.getTransactionNumber() + " should be " + value + " on branch " + artifact.getBranch().getBranchId(),
+ chStmt.getInt("transaction_id") >= artifact.getTransactionNumber());
+ if (chStmt.next()) {
+ fail("Relation " + relation.getRelationId() + " has multiple tx_current values of " + value + " when it was deleted on branch " + artifact.getBranch().getBranchId() + " on transaction " + artifact.getTransactionNumber());
+ }
+ } else {
+ fail("Relation " + relation.getRelationId() + " was not given a tx_current value of " + value + " when it was deleted on branch " + artifact.getBranch().getBranchId() + " on transaction " + artifact.getTransactionNumber());
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static void dumpArtifact(Artifact artifact) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ System.out.println(" Artifact Dump : " + artifact.getInternalDescriptiveName());
+ chStmt.runPreparedQuery(GET_ARTIFACT_DEBUG, artifact.getBranch().getBranchId(), artifact.getArtId());
+ while (chStmt.next()) {
+ System.out.println(String.format(
+ " Art Id = %d Branch Id = %d TX_Current = %d mod_type = %d Transaction_id = %d Gamma_id = %d",
+ chStmt.getInt("art_id"), chStmt.getInt("branch_id"), chStmt.getInt("tx_current"),
+ chStmt.getInt("mod_type"), chStmt.getInt("transaction_id"), chStmt.getInt("gamma_id")));
+ }
+
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static void dumpAttribute(Attribute<?> attribute) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ System.out.println(" Attribute Dump");
+ chStmt.runPreparedQuery(GET_ATTRIBUTE_DEBUG, attribute.getArtifact().getBranch().getBranchId(),
+ attribute.getAttrId());
+ while (chStmt.next()) {
+ System.out.println(String.format(
+ " Attribute Id = %d Art_id = %d Branch Id = %d TX_Current = %d mod_type = %d Transaction_id = %d Gamma_id = %d",
+ chStmt.getInt("attr_id"), chStmt.getInt("art_id"), chStmt.getInt("branch_id"),
+ chStmt.getInt("tx_current"), chStmt.getInt("mod_type"), chStmt.getInt("transaction_id"),
+ chStmt.getInt("gamma_id")));
+ }
+
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static void dumpRelation(RelationLink relation, Artifact artifact) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ System.out.println(" Relation Dump");
+ chStmt.runPreparedQuery(GET_RELATION_DEBUG, artifact.getBranch().getBranchId(), relation.getRelationId());
+ while (chStmt.next()) {
+ System.out.println(String.format(
+ " Relation Id = %d a_art_id = %d b_art_id = %d Branch Id = %d TX_Current = %d mod_type = %d Transaction_id = %d Gamma_id = %d",
+ chStmt.getInt("rel_link_id"), chStmt.getInt("a_art_id"), chStmt.getInt("b_art_id"),
+ chStmt.getInt("branch_id"), chStmt.getInt("tx_current"), chStmt.getInt("mod_type"),
+ chStmt.getInt("transaction_id"), chStmt.getInt("gamma_id")));
+ }
+
+ } finally {
+ chStmt.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/NativeArtifactTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/NativeArtifactTest.java
new file mode 100644
index 00000000000..ef8fcb3e7dd
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/NativeArtifactTest.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import java.io.File;
+import java.util.Collection;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.CsvArtifact;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class NativeArtifactTest {
+
+ @org.junit.Test
+ public void testCleanupPre() throws Exception {
+ cleanup();
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact#NativeArtifact(org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory, java.lang.String, java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.osee.framework.skynet.core.artifact.ArtifactType)}
+ * .
+ */
+ @org.junit.Test
+ public void testNativeArtifact() throws Exception {
+ CsvArtifact csvArtifact =
+ CsvArtifact.getCsvArtifact(getClass().getSimpleName(),
+ BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), true);
+ assertNotNull(csvArtifact);
+ assertTrue(csvArtifact.getArtifact() instanceof NativeArtifact);
+ }
+
+ /**
+ * Test method for {@link org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact#getImage()}.
+ */
+ @org.junit.Test
+ public void testGetImage() throws Exception {
+ NativeArtifact nativeArtifact = getNativeArtifact();
+ assertTrue(nativeArtifact.getFileExtension().equals("csv"));
+ }
+
+ /**
+ * Test method for {@link org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact#getFileName()}.
+ */
+ @org.junit.Test
+ public void testGetFileName() throws Exception {
+ NativeArtifact nativeArtifact = getNativeArtifact();
+ assertEquals(nativeArtifact.getFileName(), "NativeArtifactTest.csv");
+ }
+
+ /**
+ * Test method for {@link org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact#getFileExtension()}.
+ */
+ @org.junit.Test
+ public void testGetFileExtension() throws Exception {
+ NativeArtifact nativeArtifact = getNativeArtifact();
+ assertTrue(nativeArtifact.getFileExtension().equals("csv"));
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact#setNativeContent(java.io.File)}.
+ */
+ @org.junit.Test
+ public void testSetNativeContentFile() throws Exception {
+ File file = OseeData.getFile(GUID.generateGuidStr() + ".txt");
+ Lib.writeStringToFile("hello world", file);
+ NativeArtifact nativeArtifact = getNativeArtifact();
+ nativeArtifact.setNativeContent(file);
+ nativeArtifact.persistAttributes();
+ String content = Lib.inputStreamToString(nativeArtifact.getNativeContent());
+ assertEquals("hello world", content);
+ }
+
+ /**
+ * Test method for {@link org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact#getNativeContent()}.
+ */
+ @org.junit.Test
+ public void testSetAndGetNativeContent() throws Exception {
+ NativeArtifact nativeArtifact = getNativeArtifact();
+ nativeArtifact.setNativeContent(Lib.stringToInputStream("hello world"));
+ nativeArtifact.persistAttributes();
+ String content = Lib.inputStreamToString(nativeArtifact.getNativeContent());
+ assertEquals("hello world", content);
+ }
+
+ @org.junit.Test
+ public void testGetValueAsString() throws Exception {
+ NativeArtifact nativeArtifact = getNativeArtifact();
+ nativeArtifact.setNativeContent(Lib.stringToInputStream("hello world"));
+ nativeArtifact.persistAttributes();
+ String content = nativeArtifact.getSoleAttributeValueAsString(NativeArtifact.CONTENT_NAME, "");
+ assertEquals("hello world", content);
+ }
+
+ @org.junit.Test
+ public void testCleanupPost() throws Exception {
+ cleanup();
+ }
+
+ private NativeArtifact getNativeArtifact() throws Exception {
+ return CsvArtifact.getCsvArtifact(getClass().getSimpleName(),
+ BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false).getArtifact();
+ }
+
+ private void cleanup() throws Exception {
+ Collection<Artifact> arts =
+ ArtifactQuery.getArtifactsFromName(getClass().getSimpleName(),
+ BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()), false);
+ ArtifactPersistenceManager.purgeArtifacts(arts);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumTypeManagerTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumTypeManagerTest.java
new file mode 100644
index 00000000000..cf94ab46e73
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumTypeManagerTest.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumType;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumType.OseeEnumEntry;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.Before;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeEnumTypeManagerTest {
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(TestUtil.isProductionDb());
+ }
+
+ @org.junit.Test
+ public void testCreateEnumTypeFromXml() throws OseeCoreException {
+ String enumTypeName = "EnumType1";
+ String xmlDefinition = "<Root><Enum>one</Enum><Enum>two</Enum><Enum>three</Enum></Root>";
+
+ OseeEnumTypeManager.createEnumTypeFromXml(enumTypeName, xmlDefinition);
+ OseeEnumType actual = OseeEnumTypeManager.getUniqueType(enumTypeName);
+ try {
+ checkOseeEnumType(enumTypeName, new String[] {"one", "two", "three"}, new Integer[] {0, 1, 2}, actual);
+ } finally {
+ OseeEnumTypeManager.deleteEnumType(actual);
+ }
+ checkOseeEnumTypeDeleted(actual);
+ }
+
+ @org.junit.Test
+ public void testCreateEnumType() throws OseeCoreException {
+ String enumTypeName = "EnumType2";
+ String[] entryNames = new String[] {"oneA", "twoA", "threeA"};
+ Integer[] entryOrdinals = new Integer[] {1, 50, 100};
+
+ List<ObjectPair<String, Integer>> entries = new ArrayList<ObjectPair<String, Integer>>();
+ for (int index = 0; index < entryNames.length && index < entryOrdinals.length; index++) {
+ entries.add(new ObjectPair<String, Integer>(entryNames[index], entryOrdinals[index]));
+ }
+
+ OseeEnumTypeManager.createEnumType(enumTypeName, entries);
+ OseeEnumType actual = OseeEnumTypeManager.getUniqueType(enumTypeName);
+ try {
+ checkOseeEnumType(enumTypeName, entryNames, entryOrdinals, actual);
+ } finally {
+ OseeEnumTypeManager.deleteEnumType(actual);
+ }
+ checkOseeEnumTypeDeleted(actual);
+ }
+
+ @SuppressWarnings("unchecked")
+ @org.junit.Test
+ public void testAddEntriesToType() throws OseeCoreException {
+ String enumTypeName = "EnumType10";
+ String xmlDefinition = "<Root><Enum>one</Enum><Enum>two</Enum><Enum>three</Enum></Root>";
+ String[] entryNames = new String[] {"one", "two", "three"};
+ Integer[] entryOrdinals = new Integer[] {0, 1, 2};
+
+ OseeEnumType oseeEnumType = OseeEnumTypeManager.createEnumTypeFromXml(enumTypeName, xmlDefinition);
+ try {
+ checkOseeEnumType(enumTypeName, entryNames, entryOrdinals, oseeEnumType);
+
+ try {
+ OseeEnumTypeManager.addEntries(oseeEnumType, new ObjectPair<String, Integer>("one", 3));
+ assertTrue("Should have exceptioned - Error", false);
+ } catch (Exception ex) {
+ assertTrue("name violated", ex instanceof OseeArgumentException);
+ // check for no change
+ checkOseeEnumType(enumTypeName, entryNames, entryOrdinals, oseeEnumType);
+ }
+
+ try {
+ OseeEnumTypeManager.addEntries(oseeEnumType, new ObjectPair<String, Integer>("four", 2));
+ assertTrue("Should have exceptioned - Error", false);
+ } catch (Exception ex) {
+ assertTrue("Ordinal violated", ex instanceof OseeArgumentException);
+ // Check for no change
+ checkOseeEnumType(enumTypeName, entryNames, entryOrdinals, oseeEnumType);
+ }
+
+ OseeEnumTypeManager.addEntries(oseeEnumType, new ObjectPair<String, Integer>("four", 3));
+ checkOseeEnumType(enumTypeName, new String[] {"one", "two", "three", "four"}, new Integer[] {0, 1, 2, 3},
+ oseeEnumType);
+
+ OseeEnumType actual = OseeEnumTypeManager.getUniqueType(enumTypeName);
+ assertEquals(oseeEnumType, actual);
+
+ } finally {
+ OseeEnumTypeManager.deleteEnumType(oseeEnumType);
+ }
+ checkOseeEnumTypeDeleted(oseeEnumType);
+ }
+
+ @org.junit.Test
+ public void testRemoveEntriesToType() throws OseeCoreException {
+ String enumTypeName = "EnumType4";
+ String xmlDefinition = "<Root><Enum>one</Enum><Enum>two</Enum><Enum>three</Enum></Root>";
+ String[] entryNames = new String[] {"one", "two", "three"};
+ Integer[] entryOrdinals = new Integer[] {0, 1, 2};
+
+ OseeEnumType oseeEnumType = OseeEnumTypeManager.createEnumTypeFromXml(enumTypeName, xmlDefinition);
+ try {
+ checkOseeEnumType(enumTypeName, entryNames, entryOrdinals, oseeEnumType);
+
+ List<String> names = new ArrayList<String>(Arrays.asList(entryNames));
+ List<Integer> ordinals = new ArrayList<Integer>(Arrays.asList(0, 1, 2));
+ for (OseeEnumEntry entry : oseeEnumType.values()) {
+ OseeEnumTypeManager.removeEntries(oseeEnumType, entry);
+ names.remove(0);
+ ordinals.remove(0);
+ checkOseeEnumType(enumTypeName, names.toArray(new String[names.size()]),
+ ordinals.toArray(new Integer[ordinals.size()]), oseeEnumType);
+ OseeEnumType actual = OseeEnumTypeManager.getUniqueType(enumTypeName);
+ assertEquals(oseeEnumType, actual);
+ }
+
+ assertEquals(0, oseeEnumType.values().length);
+ } finally {
+ OseeEnumTypeManager.deleteEnumType(oseeEnumType);
+ }
+ checkOseeEnumTypeDeleted(oseeEnumType);
+ }
+
+ @org.junit.Test
+ public void testDeletedRetrieval() throws OseeCoreException {
+ String enumTypeName = "EnumType5";
+ String xmlDefinition = "<Root><Enum>one</Enum><Enum>two</Enum><Enum>three</Enum></Root>";
+ String[] entryNames = new String[] {"one", "two", "three"};
+ Integer[] entryOrdinals = new Integer[] {0, 1, 2};
+
+ OseeEnumType oseeEnumType = OseeEnumTypeManager.createEnumTypeFromXml(enumTypeName, xmlDefinition);
+ try {
+ checkOseeEnumType(enumTypeName, entryNames, entryOrdinals, oseeEnumType);
+ } finally {
+ OseeEnumTypeManager.deleteEnumType(oseeEnumType);
+ }
+ checkOseeEnumTypeDeleted(oseeEnumType);
+
+ assertTrue(OseeEnumTypeManager.getAllTypeNames(true).contains(enumTypeName));
+ assertTrue(OseeEnumTypeManager.getAllTypes(true).contains(oseeEnumType));
+
+ OseeEnumType actual = OseeEnumTypeManager.getType(oseeEnumType.getEnumTypeId(), true);
+ assertEquals(oseeEnumType, actual);
+
+ actual = OseeEnumTypeManager.getUniqueType(enumTypeName, true);
+ assertEquals(oseeEnumType, actual);
+ }
+
+ @org.junit.Test
+ public void testDeletedNotAllowedWhileInUseByAttribute() throws OseeCoreException {
+ Collection<OseeEnumType> types = OseeEnumTypeManager.getAllTypes();
+ boolean wasTestedAtLeastOnce = false;
+ for (OseeEnumType type : types) {
+ for (AttributeType attrType : AttributeTypeManager.getAllTypes()) {
+ if (attrType.getOseeEnumTypeId() == type.getEnumTypeId()) {
+ // Found an enum that is in use;
+ wasTestedAtLeastOnce = true;
+ try {
+ OseeEnumTypeManager.deleteEnumType(type);
+ } catch (Exception ex) {
+ assertTrue(ex instanceof OseeStateException);
+ }
+ assertTrue(!type.isDeleted());
+ }
+ }
+ }
+ assertTrue(wasTestedAtLeastOnce);
+ }
+
+ private void checkOseeEnumTypeDeleted(OseeEnumType actual) throws OseeDataStoreException {
+ assertTrue(actual.isDeleted());
+ try {
+ OseeEnumTypeManager.getType(actual.getEnumTypeId());
+ } catch (Exception ex) {
+ assertTrue(ex instanceof OseeTypeDoesNotExist);
+ }
+ try {
+ OseeEnumTypeManager.getUniqueType(actual.getEnumTypeName());
+ } catch (Exception ex) {
+ assertTrue(ex instanceof OseeTypeDoesNotExist);
+ }
+
+ assertTrue(!OseeEnumTypeManager.getAllTypes().contains(actual));
+ assertTrue(!OseeEnumTypeManager.getAllTypeNames().contains(actual.getEnumTypeName()));
+ }
+
+ private void checkOseeEnumType(String expectedName, String[] expectedEntries, Integer[] expectedOrdinals, OseeEnumType actualEnumType) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ assertEquals(expectedName, actualEnumType.getEnumTypeName());
+ OseeEnumEntry[] enumEntries = actualEnumType.values();
+ assertEquals(expectedEntries.length, enumEntries.length);
+ for (int index = 0; index < expectedEntries.length && index < expectedOrdinals.length; index++) {
+ checkEntry(expectedEntries[index], expectedOrdinals[index], actualEnumType, enumEntries[index]);
+ }
+ }
+
+ private void checkEntry(String expectedName, int expectedOrdinal, OseeEnumType parent, OseeEnumEntry entry) {
+ assertEquals(expectedName, entry.name());
+ assertEquals(expectedOrdinal, entry.ordinal());
+ assertEquals(parent, entry.getDeclaringClass());
+ assertEquals(parent.getEnumTypeId(), entry.getEnumTypeId());
+ assertEquals(parent.getEnumTypeName(), entry.getEnumTypeName());
+ OseeEnumEntry[] expected = parent.values();
+ OseeEnumEntry[] actual = entry.values();
+ assertEquals(expected.length, actual.length);
+ for (int index = 0; index < expected.length; index++) {
+ assertEquals(expected[index], actual[index]);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumerationValidationTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumerationValidationTest.java
new file mode 100644
index 00000000000..314b2b5bc27
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/OseeEnumerationValidationTest.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * 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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeEnumerationValidationTest {
+
+ private Artifact mockArtifact;
+ private AttributeType enumeratedAttributeType;
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Before
+ public void setUp() throws Exception {
+ Branch branch = BranchManager.getCommonBranch();
+ // Create an artifact having an enumerated attribute
+
+ enumeratedAttributeType = AttributeTypeManager.getType("GFE / CFE");
+ mockArtifact = ArtifactTypeManager.addArtifact("Component", branch);
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ @After
+ public void tearDown() throws Exception {
+ mockArtifact.deleteAndPersist();
+ mockArtifact = null;
+ enumeratedAttributeType = null;
+ }
+
+ public List<TestData> getEnumerationCases() {
+ List<TestData> data = new ArrayList<TestData>();
+
+ data.add(new TestData("Test 1: Null", null, getErrorStatus("No enum const [GFE / CFE].[null]")));
+ data.add(new TestData("Test 2: Empty String", "", getErrorStatus("No enum const [GFE / CFE].[]")));
+ data.add(new TestData("Test 3: Invalid", "asbasdfasdfa",
+ getErrorStatus("No enum const [GFE / CFE].[asbasdfasdfa]")));
+ data.add(new TestData("Test 4: Valid", "CFE", Status.OK_STATUS));
+ data.add(new TestData("Test 5: Valid", "GFE", Status.OK_STATUS));
+ data.add(new TestData("Test 5: Valid", "Unspecified", Status.OK_STATUS));
+ data.add(new TestData("Test 6: Valid", "cfe", getErrorStatus("No enum const [GFE / CFE].[cfe]")));
+ data.add(new TestData("Test 7: Invalid Class", 0,
+ getErrorStatus("java.lang.Integer cannot be cast to java.lang.String")));
+ return data;
+ }
+
+ private IStatus getErrorStatus(String message) {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, message);
+ }
+
+ @org.junit.Test
+ public void testEnumerationData() throws OseeCoreException {
+ for (TestData data : getEnumerationCases()) {
+ IStatus actual =
+ OseeValidator.getInstance().validate(IOseeValidator.SHORT, mockArtifact, enumeratedAttributeType,
+ data.getValue());
+ checkStatus(data.getMessage(), data.getExpected(), actual);
+ }
+ }
+
+ private void checkStatus(String message, IStatus expected, IStatus actual) {
+ assertEquals(message, expected.getSeverity(), actual.getSeverity());
+ assertEquals(message, expected.getMessage(), actual.getMessage());
+ }
+
+ public static class TestData {
+ private final String message;
+ private final IStatus expected;
+ private final Object value;
+
+ public TestData(String message, Object value, IStatus expected) {
+ this.message = message;
+ this.value = value;
+ this.expected = expected;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public IStatus getExpected() {
+ return expected;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/RelationDeletionTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/RelationDeletionTest.java
new file mode 100644
index 00000000000..b115cf0fef8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/RelationDeletionTest.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.util.List;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.junit.Before;
+
+/**
+ * @author Andrew M Finkbeiner
+ */
+public class RelationDeletionTest {
+
+ private static final String ARTIFACT_TYPE = "Folder";
+
+ @Before
+ public void setUp() throws Exception {
+ // This test should only be run on test db
+ assertFalse(ClientSessionManager.isProductionDataStore());
+ }
+
+ @org.junit.Test
+ public void testDeleteRelationPersistsBothSides() throws Exception {
+ SevereLoggingMonitor monitor = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitor);
+
+ Branch branch = BranchManager.getCommonBranch();
+ Artifact parent = ArtifactTypeManager.getType(ARTIFACT_TYPE).makeNewArtifact(branch);
+ Artifact child1 = ArtifactTypeManager.getType(ARTIFACT_TYPE).makeNewArtifact(branch);
+ Artifact child2 = ArtifactTypeManager.getType(ARTIFACT_TYPE).makeNewArtifact(branch);
+ Artifact child3 = ArtifactTypeManager.getType(ARTIFACT_TYPE).makeNewArtifact(branch);
+ parent.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, child1);
+ parent.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, child2);
+ parent.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, child3);
+ parent.persistRelations();
+
+ assertTrue("Failed to add all three children", parent.getRelatedArtifacts(
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD).size() == 3);
+
+ child1.deleteRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__PARENT, parent);
+
+ assertTrue("We removed a relation so it should still be dirty.", child1.isDirty(true));
+ assertTrue("Parent artifact should be marked as dirty since it's relation has changed.", parent.isDirty(true));
+
+ child1.persistRelations();
+
+ assertFalse("Parent artifact should be clean now.", parent.isDirty(true));
+ assertFalse("Child artifact should also be clean.", child1.isDirty(true));
+
+ List<Artifact> children = parent.getRelatedArtifacts(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD);
+
+ assertTrue("The deleted child was not successfully removed.", children.size() == 2);
+
+ assertTrue("Child2 is not the first in the list and it should be.", children.get(0) == child2);
+
+ List<RelationLink> relations =
+ RelationManager.getRelations(parent, CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD.getRelationType(),
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD.getSide());
+
+ assertTrue("The order should point to the head '-1'", relations.get(0).getOrder(RelationSide.SIDE_B) == -1);
+ assertTrue("The second item in the list is not pointing to the first.", relations.get(1).getOrder(
+ RelationSide.SIDE_B) == relations.get(0).getArtifactId(RelationSide.SIDE_B));
+
+ assertTrue(monitor.toString(), monitor.getAllLogs().size() == 0);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/SevereLogMonitorTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/SevereLogMonitorTest.java
new file mode 100644
index 00000000000..8999d2a3b5b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/SevereLogMonitorTest.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.framework.skynet.core.test.cases;
+
+import static org.junit.Assert.assertTrue;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.Before;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SevereLogMonitorTest {
+
+ @Before
+ public void setup() throws Exception {
+ assertTrue("Should be run on test or demo datbase.", TestUtil.isDemoDb() || TestUtil.isTestDb());
+ }
+
+ @org.junit.Test
+ public void testCatchingOfException() {
+
+ boolean madeItInException = false;
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ try {
+ throw new Exception("this is my test exception");
+ } catch (Exception ex) {
+ madeItInException = true;
+ OseeLog.log(SevereLogMonitorTest.class, Level.SEVERE, "caught our exception in a junit", ex);
+ }
+ assertTrue(madeItInException);
+ assertTrue(String.format("%d SevereLogs during test.", monitorLog.getAllLogs().size()),
+ monitorLog.getAllLogs().size() == 1);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/StaticIdManagerTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/StaticIdManagerTest.java
new file mode 100644
index 00000000000..3e9c422f169
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/StaticIdManagerTest.java
@@ -0,0 +1,294 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.GeneralData;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StaticIdManagerTest {
+
+ private static final String STATIC_ID_AAA = "aaa";
+ private static final String STATIC_ID_BBB = "bbb";
+ private static final String STATIC_ID_CCC = "ccc";
+ private static final String STATIC_ID_DDD = "ddd";
+ private static final String STATIC_ID_EEE = "eee";
+
+ private static final List<String> ALL_STATIC_IDS =
+ Arrays.asList(STATIC_ID_AAA, STATIC_ID_BBB, STATIC_ID_CCC, STATIC_ID_DDD, STATIC_ID_EEE);
+
+ @BeforeClass
+ @AfterClass
+ public static void testCleanupForReRun() throws OseeCoreException, InterruptedException {
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ for (String staticIdValue : ALL_STATIC_IDS) {
+ for (Artifact artifact : ArtifactQuery.getArtifactsFromAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE,
+ staticIdValue, BranchManager.getCommonBranch())) {
+ artifact.deleteAndPersist(transaction);
+ System.out.println("Deleting " + artifact.getHumanReadableId());
+ }
+ }
+ transaction.execute();
+
+ for (String staticIdValue : ALL_STATIC_IDS) {
+ Collection<Artifact> artifacts =
+ StaticIdManager.getArtifacts(GeneralData.ARTIFACT_TYPE, staticIdValue, BranchManager.getCommonBranch());
+ for (Artifact artifact : artifacts) {
+ System.err.println("Search returned non-deleted " + artifact.getHumanReadableId());
+ }
+ assertTrue("Expected 0 artifacts; Returned " + artifacts.size(), artifacts.size() == 0);
+ }
+ }
+
+ @Before
+ public void setup() throws Exception {
+ assertTrue("Should be run on demo datbase.", TestUtil.isDemoDb());
+ }
+
+ @org.junit.Test
+ public void testStaticIdsGettingCached() throws OseeCoreException {
+ String staticId = "org." + GUID.generateGuidStr();
+ Collection<Artifact> artifacts = ArtifactCache.getArtifactsByStaticId(staticId);
+ assertTrue("Should be 0; Returned " + artifacts.size(), artifacts.size() == 0);
+ Artifact art = ArtifactTypeManager.addArtifact(GeneralData.ARTIFACT_TYPE, BranchManager.getCommonBranch());
+ art.addAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, staticId);
+ art.persistAttributesAndRelations();
+
+ artifacts = ArtifactCache.getArtifactsByStaticId(staticId);
+ assertTrue("Should be 1; Returned " + artifacts.size(), artifacts.size() == 1);
+
+ art.deleteAndPersist();
+ artifacts = ArtifactCache.getArtifactsByStaticId(staticId);
+ assertTrue("Should be 0; Returned " + artifacts.size(), artifacts.isEmpty());
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager#getSingletonArtifact(java.lang.String, java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Branch, boolean)}
+ * .
+ */
+ @org.junit.Test
+ public void testGetSingletonArtifact() throws OseeCoreException {
+ Artifact artifact =
+ StaticIdManager.getSingletonArtifact(GeneralData.ARTIFACT_TYPE, STATIC_ID_AAA,
+ BranchManager.getCommonBranch());
+ assertNull(artifact);
+
+ artifact =
+ StaticIdManager.getOrCreateSingletonArtifact(GeneralData.ARTIFACT_TYPE, STATIC_ID_AAA,
+ BranchManager.getCommonBranch());
+ assertNotNull(artifact);
+
+ deleteArtifacts(Arrays.asList(artifact), STATIC_ID_AAA);
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager#setSingletonAttributeValue(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String)}
+ *
+ * @throws InterruptedException
+ */
+ @org.junit.Test
+ public void testSetSingletonAttributeValue() throws OseeCoreException, InterruptedException {
+ // create artifact with two of same static id values
+ Artifact artifact = ArtifactTypeManager.addArtifact(GeneralData.ARTIFACT_TYPE, BranchManager.getCommonBranch());
+ artifact.addAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, STATIC_ID_BBB);
+ artifact.addAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, STATIC_ID_BBB);
+ artifact.persistAttributes();
+
+ // call to search for artifact with STATIC_ID_BBB
+ Artifact artifactWithDoubleBbb =
+ StaticIdManager.getSingletonArtifact(GeneralData.ARTIFACT_TYPE, STATIC_ID_BBB,
+ BranchManager.getCommonBranch());
+ assertNotNull(artifactWithDoubleBbb);
+
+ // should be two static id attributes
+ int count = artifactWithDoubleBbb.getAttributes(StaticIdManager.STATIC_ID_ATTRIBUTE).size();
+ assertTrue("Expected 2 attributes; Returned " + count, count == 2);
+
+ count = artifactWithDoubleBbb.getAttributeCount(StaticIdManager.STATIC_ID_ATTRIBUTE);
+ assertTrue("Expected 2 attributes; Returned " + count, count == 2);
+
+ // call to set singleton which should resolve duplicates
+ StaticIdManager.setSingletonAttributeValue(artifactWithDoubleBbb, STATIC_ID_BBB);
+
+ // should now be only one static id attributes
+ count = artifactWithDoubleBbb.getAttributeCount(StaticIdManager.STATIC_ID_ATTRIBUTE);
+ assertTrue("Expected 1 attributes; Returned " + count, count == 1);
+
+ deleteArtifacts(Arrays.asList(artifact), STATIC_ID_BBB);
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager#getArtifacts(java.lang.String, java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Branch)}
+ * .
+ *
+ * @throws InterruptedException
+ */
+ @org.junit.Test
+ public void testGetArtifacts() throws OseeCoreException, InterruptedException {
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ // Create three artifacts with ccc staticId
+
+ for (int index = 0; index < 3; index++) {
+ Artifact artifact =
+ ArtifactTypeManager.addArtifact(GeneralData.ARTIFACT_TYPE, BranchManager.getCommonBranch());
+ StaticIdManager.setSingletonAttributeValue(artifact, STATIC_ID_CCC);
+ artifact.persistAttributes(transaction);
+ assertNotNull(artifact);
+ }
+ transaction.execute();
+
+ // search for static attributes
+ Collection<Artifact> artifacts =
+ StaticIdManager.getArtifacts(GeneralData.ARTIFACT_TYPE, STATIC_ID_CCC, BranchManager.getCommonBranch());
+ assertTrue("Expected 3 artifacts; Returned " + artifacts.size(), artifacts.size() == 3);
+
+ deleteArtifacts(artifacts, STATIC_ID_CCC);
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager#getSingletonArtifactOrException(java.lang.String, java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Branch)}
+ * .
+ */
+ @org.junit.Test
+ public void testGetSingletonArtifactOrException() throws OseeCoreException {
+ try {
+ StaticIdManager.getSingletonArtifactOrException(GeneralData.ARTIFACT_TYPE, STATIC_ID_DDD,
+ BranchManager.getCommonBranch());
+ fail("ArtifactDoesNotExist should have been thrown.");
+ } catch (Exception ex) {
+ assertTrue("Was not ArtifactDoesNotExist was: " + ex.getClass().getSimpleName(),
+ ex instanceof ArtifactDoesNotExist);
+ }
+
+ Collection<Artifact> artifacts = new ArrayList<Artifact>();
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ for (int index = 0; index < 2; index++) {
+ Artifact artifact =
+ ArtifactTypeManager.addArtifact(GeneralData.ARTIFACT_TYPE, BranchManager.getCommonBranch());
+ StaticIdManager.setSingletonAttributeValue(artifact, STATIC_ID_DDD);
+ artifact.persistAttributes(transaction);
+ assertNotNull(artifact);
+ artifacts.add(artifact);
+ }
+ transaction.execute();
+
+ try {
+ StaticIdManager.getSingletonArtifactOrException(GeneralData.ARTIFACT_TYPE, STATIC_ID_DDD,
+ BranchManager.getCommonBranch());
+ fail("MultipleArtifactsExist should have been thrown");
+ } catch (Exception ex) {
+ assertTrue("Was not MultipleArtifactsExist was: " + ex.getClass().getSimpleName(),
+ ex instanceof MultipleArtifactsExist);
+ }
+
+ deleteArtifacts(artifacts, STATIC_ID_DDD);
+ }
+
+ private void deleteArtifacts(Collection<Artifact> toDelete, String staticId) throws OseeCoreException {
+ if (!toDelete.isEmpty()) {
+ if (toDelete.size() == 1) {
+ toDelete.iterator().next().deleteAndPersist();
+ } else {
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ for (Artifact artifact : toDelete) {
+ artifact.delete();
+ artifact.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+ }
+
+ Collection<Artifact> artifacts = ArtifactCache.getArtifactsByStaticId(staticId);
+ assertTrue("Should be 0; Returned " + artifacts.size(), artifacts.isEmpty());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager#getSingletonArtifact(java.lang.String, java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Branch)}
+ * .
+ *
+ * @throws InterruptedException
+ */
+ @org.junit.Test
+ public void testGetSingletonArtifactStringStringBranch() throws OseeCoreException, InterruptedException {
+ List<Artifact> itemsCreated = new ArrayList<Artifact>();
+
+ // create single artifact with eee staticId
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ Artifact artifact =
+ StaticIdManager.getOrCreateSingletonArtifact(GeneralData.ARTIFACT_TYPE, STATIC_ID_EEE,
+ BranchManager.getCommonBranch());
+ artifact.persistAttributes(transaction);
+ assertNotNull(artifact);
+ transaction.execute();
+
+ itemsCreated.add(artifact);
+
+ // test that singleton comes back
+ artifact =
+ StaticIdManager.getSingletonArtifact(GeneralData.ARTIFACT_TYPE, STATIC_ID_EEE,
+ BranchManager.getCommonBranch());
+ assertNotNull(artifact);
+
+ // create another artifact with eee staticId
+ transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ artifact = ArtifactTypeManager.addArtifact(GeneralData.ARTIFACT_TYPE, BranchManager.getCommonBranch());
+ StaticIdManager.setSingletonAttributeValue(artifact, STATIC_ID_EEE);
+ artifact.persistAttributes(transaction);
+ assertNotNull(artifact);
+ transaction.execute();
+ itemsCreated.add(artifact);
+
+ // test that there are now two artifacts with eee
+ Collection<Artifact> artifacts =
+ StaticIdManager.getArtifacts(GeneralData.ARTIFACT_TYPE, STATIC_ID_EEE, BranchManager.getCommonBranch());
+ assertTrue("Expected 2 artifacts; Returned " + artifacts.size(), artifacts.size() == 2);
+
+ // test that call to get singleton does NOT exception
+ try {
+ artifact =
+ StaticIdManager.getSingletonArtifact(GeneralData.ARTIFACT_TYPE, STATIC_ID_EEE,
+ BranchManager.getCommonBranch());
+ assertNotNull(artifact);
+ } catch (Exception ex) {
+ fail("Exception should not have occurred " + ex.getLocalizedMessage());
+ }
+ deleteArtifacts(itemsCreated, STATIC_ID_EEE);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/WordMlLinkHandlerTest.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/WordMlLinkHandlerTest.java
new file mode 100644
index 00000000000..e38ebadc7da
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/cases/WordMlLinkHandlerTest.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.test.cases;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.linking.LinkType;
+import org.eclipse.osee.framework.skynet.core.linking.WordMlLinkHandler;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class WordMlLinkHandlerTest {
+
+ /**
+ * Data driven test to check document link manager link/unlink methods
+ *
+ * @throws Exception
+ */
+ @org.junit.Test
+ public void testLinkUnLink() throws Exception {
+ User user = UserManager.getUser(SystemUser.OseeSystem);
+ String guid = user.getGuid();
+ String sessionId = ClientSessionManager.getSessionId();
+ Map<String, TestData> testMap = getTestData();
+ for (String key : testMap.keySet()) {
+ TestData testData = testMap.get(key);
+
+ InputStream dataStream = null;
+ InputStream expectedStream = null;
+ try {
+ dataStream = new BufferedInputStream(testData.data.openStream());
+ expectedStream = new BufferedInputStream(testData.expected.openStream());
+
+ LinkType docType = testData.docType;
+ boolean isLinkTest = testData.isLink;
+
+ String input = Lib.inputStreamToString(dataStream);
+ input = input.replaceAll("#GUID#", guid);
+ input = input.replaceAll("#SESSION#", sessionId);
+ Artifact source = user;
+
+ // TODO this test will fail - add live artifact -- need to change test to use artifact instead of
+ // input files.
+ if (source != null) {
+ String actual = null;
+ if (isLinkTest) {
+ actual = WordMlLinkHandler.link(docType, source, input);
+ } else {
+ actual = WordMlLinkHandler.unlink(docType, source, input);
+ }
+ String expected = Lib.inputStreamToString(expectedStream);
+ expected = expected.replaceAll("#GUID#", guid);
+ expected = expected.replaceAll("#SESSION#", sessionId);
+ // assertEquals(String.format("%s: [%s] ", isLinkTest ? "Link" : "UnLink", key), expected, actual);
+ }
+ } finally {
+ if (dataStream != null) {
+ try {
+ dataStream.close();
+ } catch (IOException ex) {
+ }
+ }
+ if (expectedStream != null) {
+ try {
+ expectedStream.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+ }
+ }
+
+ private String getFileName(String name) {
+ int index = name.lastIndexOf("/");
+ if (index > -1) {
+ name = name.substring(index + 1, name.length());
+ }
+ if (name.endsWith(".data.xml")) {
+ name = name.substring(0, name.length() - 9);
+ }
+ if (name.endsWith(".expected.xml")) {
+ name = name.substring(0, name.length() - 13);
+ }
+ return name;
+ }
+
+ private boolean isDataFile(String name) {
+ return name != null && name.endsWith(".data.xml");
+ }
+
+ private boolean isExpectedFile(String name) {
+ return name != null && name.endsWith(".expected.xml");
+ }
+
+ private LinkType getDocType(String name) {
+ // LinkType toReturn = null;
+ // int index = name.lastIndexOf('.');
+ // if (index > 0) {
+ // try {
+ // name = name.substring(index + 1, name.length());
+ // toReturn = LinkType.valueOf(name.toUpperCase());
+ // } catch (Exception ex) {
+ // //Do nothing;
+ // }
+ // }
+ // assertNotNull(String.format("Error getting DocType from [%s]", name), toReturn);
+ return LinkType.OSEE_SERVER_LINK;
+ }
+
+ private boolean isLinkTest(String name) {
+ return !name.contains("unlink");
+ }
+
+ private Map<String, TestData> getTestData() {
+ Map<String, TestData> toReturn = new LinkedHashMap<String, TestData>();
+
+ Bundle bundle = Platform.getBundle("org.eclipse.osee.framework.skynet.core.test").getBundleContext().getBundle();
+ Enumeration<?> urls = bundle.findEntries("support/WordMlLinkData", "*.*", true);
+ while (urls.hasMoreElements()) {
+ URL url = (URL) urls.nextElement();
+ String name = getFileName(url.getPath());
+ if (Strings.isValid(name) && (url.getPath().endsWith(".data.xml") || url.getPath().endsWith(".expected.xml"))) {
+ String key = name;
+ int index = name.indexOf('.');
+ if (index > 0) {
+ key = name.substring(0, index);
+ }
+ TestData pair = toReturn.get(key);
+ if (pair == null) {
+ pair = new TestData();
+ toReturn.put(key, pair);
+ }
+ if (isDataFile(url.getPath())) {
+ pair.data = url;
+ pair.docType = getDocType(name);
+ pair.isLink = isLinkTest(name);
+ } else if (isExpectedFile(url.getPath())) {
+ pair.expected = url;
+ } else if (pair.data == null || pair.expected == null) {
+ toReturn.remove(pair);
+ }
+ }
+ }
+ return toReturn;
+ }
+ private class TestData {
+ public boolean isLink;
+ private URL data;
+ private URL expected;
+ private LinkType docType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/util/FrameworkTestUtil.java b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/util/FrameworkTestUtil.java
new file mode 100644
index 00000000000..bcf973f89d4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/test/util/FrameworkTestUtil.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.framework.skynet.core.test.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchArchivedState;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchControlled;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.support.test.util.DemoSubsystems;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkTestUtil {
+ private static final String TEST_PATH_NAME = "../org.eclipse.osee.framework.skynet.core.test/";
+
+ /**
+ * Creates a simple artifact and adds it to the root artifact default hierarchical relation
+ *
+ * @param artifactTypeName
+ * @param name
+ * @param branch
+ * @throws Exception
+ */
+ public static Artifact createSimpleArtifact(String artifactTypeName, String name, Branch branch) throws Exception {
+ Artifact softArt = ArtifactTypeManager.addArtifact(artifactTypeName, branch);
+ softArt.setDescriptiveName(name);
+ softArt.addAttribute("Subsystem", DemoSubsystems.Electrical.name());
+ Artifact rootArtifact = ArtifactQuery.getDefaultHierarchyRootArtifact(branch, true);
+ rootArtifact.addRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD, softArt);
+ return softArt;
+ }
+
+ public static Collection<Artifact> createSimpleArtifacts(String artifactTypeName, int numArts, String name, Branch branch) throws Exception {
+ List<Artifact> arts = new ArrayList<Artifact>();
+ for (int x = 1; x < numArts + 1; x++) {
+ arts.add(createSimpleArtifact(artifactTypeName, name + " " + x, branch));
+ }
+ return arts;
+ }
+
+ public static void purgeBranch(Branch branch) throws Exception {
+ try {
+ BranchManager.purgeBranchInJob(branch);
+ TestUtil.sleep(2000);
+ } catch (BranchDoesNotExist ex) {
+ // do nothing
+ }
+ }
+
+ public static void purgeWorkingBranches(Collection<String> branchNamesContain) throws Exception {
+ try {
+ // delete working branches
+ for (Branch workingBranch : BranchManager.getBranches(BranchArchivedState.ALL, BranchControlled.ALL,
+ BranchType.WORKING)) {
+ for (String branchName : branchNamesContain) {
+ if (workingBranch.getBranchName().contains(branchName)) {
+ BranchManager.purgeBranchInJob(workingBranch);
+ TestUtil.sleep(2000);
+ }
+ }
+ }
+ } catch (BranchDoesNotExist ex) {
+ // do nothing
+ }
+ }
+
+ /**
+ * Deletes all artifacts with names that start with any title given
+ *
+ * @param titles
+ * @throws Exception
+ */
+ public static void cleanupSimpleTest(Branch branch, Collection<String> titles) throws Exception {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ for (String title : titles) {
+ artifacts.addAll(ArtifactQuery.getArtifactsFromName(title + "%", branch, false));
+ }
+ ArtifactPersistenceManager.purgeArtifacts(artifacts);
+ TestUtil.sleep(4000);
+ }
+
+ /**
+ * Deletes any artifact with name that starts with title
+ *
+ * @param title
+ * @throws Exception
+ */
+ public static void cleanupSimpleTest(Branch branch, String title) throws Exception {
+ cleanupSimpleTest(branch, Arrays.asList(title));
+ }
+
+ private static List<String> executeCommand(List<String> commands) throws IOException, InterruptedException {
+ List<String> resultStrings = new ArrayList<String>();
+ ProcessBuilder myProcessBuilder = new ProcessBuilder();
+ myProcessBuilder.command(commands);
+ Process myProcess = myProcessBuilder.start();
+ myProcess.waitFor();
+ InputStream myInputStream = myProcess.getInputStream();
+ BufferedReader myBufferedReader = new BufferedReader(new InputStreamReader(myInputStream));
+ String line;
+ while ((line = myBufferedReader.readLine()) != null) {
+ resultStrings.add(line);
+ }
+ return resultStrings;
+ }
+
+ public static final List<String> killAllOpenWinword() throws IOException, InterruptedException {
+ List<String> commands = new ArrayList<String>();
+ commands.add("TASKKILL");
+ commands.add("/F");
+ commands.add("/IM");
+ commands.add("wscript.exe");
+ commands.add("/IM");
+ commands.add("WINWORD.EXE");
+ return executeCommand(commands);
+ }
+
+ public static final List<String> findAllWinWordRunning() throws IOException, InterruptedException {
+ List<String> commands = new ArrayList<String>();
+ commands.add("TASKLIST");
+ commands.add("/FI");
+ commands.add("Imagename eq WINWORD.EXE");
+ return executeCommand(commands);
+ }
+
+ public static boolean areWinWordsRunning() throws IOException, InterruptedException {
+ return (findAllWinWordRunning().size() > 0 ? true : false);
+ }
+
+ public File getFileFromPlugin(String filename) throws Exception {
+ return new File(TEST_PATH_NAME + "/" + filename);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.expected.xml b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.expected.xml
new file mode 100644
index 00000000000..04035187964
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.expected.xml
@@ -0,0 +1,6 @@
+<one>
+<w:hlink w:dest="http://localhost:8089/osee/client/loopback?sessionId=#SESSION#&amp;guid=#GUID#&amp;cmd=open.artifact&amp;branchId=2&amp;context=osee%2Floopback"><w:r><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>OSEE System</w:t></w:r></w:hlink>
+</one>
+<two>
+<w:hlink w:dest="http://localhost:8089/osee/client/loopback?sessionId=#SESSION#&amp;guid=#GUID#&amp;cmd=open.artifact&amp;branchId=2&amp;context=osee%2Floopback"><w:r><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>OSEE System</w:t></w:r></w:hlink>
+</two> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.link.open_in_osee.data.xml b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.link.open_in_osee.data.xml
new file mode 100644
index 00000000000..3a542ca1650
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test1.link.open_in_osee.data.xml
@@ -0,0 +1,13 @@
+<one>
+<w:hlink w:dest="http://127.0.0.1:8010/Define?guid=#GUID#">
+ <w:r>
+ <w:rPr>
+ <w:rStyle w:val="Hyperlink"/>
+ </w:rPr>
+ <w:t>Something Here</w:t>
+ </w:r>
+</w:hlink>
+</one>
+<two>
+OSEE_LINK(#GUID#)
+</two> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.expected.xml b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.expected.xml
new file mode 100644
index 00000000000..afd845e4460
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.expected.xml
@@ -0,0 +1,6 @@
+<one>
+OSEE_LINK(#GUID#)
+</one>
+<two>
+OSEE_LINK(#GUID#)
+</two> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.unlink.open_in_osee.data.xml b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.unlink.open_in_osee.data.xml
new file mode 100644
index 00000000000..ca11b583adf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core.test/support/WordMlLinkData/test2.unlink.open_in_osee.data.xml
@@ -0,0 +1,6 @@
+<one>
+<w:hlink w:dest="http://localhost:8089/osee/client/loopback?guid=#GUID#&cmd=open&editorId=artifact.editor&branchId=10&context=osee%2Floopback"><w:r><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>Something Here</w:t></w:r></w:hlink>
+</one>
+<two>
+<w:hlink w:dest="http://localhost:8089/osee/client/loopback?guid=#GUID#&cmd=open&editorId=artifact.editor&branchId=10&context=osee%2Floopback"><w:r><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>Something Here</w:t></w:r></w:hlink>
+</two> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/.classpath b/org.eclipse.osee.framework.skynet.core/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.skynet.core/.options b/org.eclipse.osee.framework.skynet.core/.options
new file mode 100644
index 00000000000..570320b39e8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/.options
@@ -0,0 +1,12 @@
+org.eclipse.osee.framework.skynet.core/debug = false
+
+org.eclipse.osee.framework.skynet.core/debug/Merge = false
+
+org.eclipse.osee.framework.skynet.core/debug/Commit = false
+
+org.eclipse.osee.framework.skynet.core/debug/Persistence = false
+
+org.eclipse.osee.framework.skynet.core/debug/Change = false
+
+org.eclipse.osee.framework.skynet.core/debug/Loading = false
+
diff --git a/org.eclipse.osee.framework.skynet.core/.project b/org.eclipse.osee.framework.skynet.core/.project
new file mode 100644
index 00000000000..5c3aa6349f9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.skynet.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.skynet.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.skynet.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..316f9b3a1d4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:01:49 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.skynet.core/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.skynet.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..485a4f36684
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/META-INF/MANIFEST.MF
@@ -0,0 +1,65 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Skynet Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.skynet.core;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Eclipse-ExtensibleAPI: true
+Bundle-Activator: org.eclipse.osee.framework.skynet.core.internal.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.messaging.event.skynet,
+ net.jini,
+ org.eclipse.osee.framework.jini,
+ org.eclipse.osee.framework.database,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.compare
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.skynet.core.access,
+ org.eclipse.osee.framework.skynet.core.artifact,
+ org.eclipse.osee.framework.skynet.core.artifact.annotation,
+ org.eclipse.osee.framework.skynet.core.artifact.factory,
+ org.eclipse.osee.framework.skynet.core.artifact.format,
+ org.eclipse.osee.framework.skynet.core.artifact.operation,
+ org.eclipse.osee.framework.skynet.core.artifact.search,
+ org.eclipse.osee.framework.skynet.core.artifact.update,
+ org.eclipse.osee.framework.skynet.core.attribute,
+ org.eclipse.osee.framework.skynet.core.attribute.providers,
+ org.eclipse.osee.framework.skynet.core.attribute.utils,
+ org.eclipse.osee.framework.skynet.core.change,
+ org.eclipse.osee.framework.skynet.core.commit.actions,
+ org.eclipse.osee.framework.skynet.core.conflict,
+ org.eclipse.osee.framework.skynet.core.dbinit,
+ org.eclipse.osee.framework.skynet.core.event,
+ org.eclipse.osee.framework.skynet.core.exportImport,
+ org.eclipse.osee.framework.skynet.core.httpRequests,
+ org.eclipse.osee.framework.skynet.core.importing,
+ org.eclipse.osee.framework.skynet.core.linking,
+ org.eclipse.osee.framework.skynet.core.preferences,
+ org.eclipse.osee.framework.skynet.core.relation,
+ org.eclipse.osee.framework.skynet.core.revision,
+ org.eclipse.osee.framework.skynet.core.status,
+ org.eclipse.osee.framework.skynet.core.transaction,
+ org.eclipse.osee.framework.skynet.core.utility,
+ org.eclipse.osee.framework.skynet.core.validation,
+ org.eclipse.osee.framework.skynet.core.word,
+ org.eclipse.osee.framework.ui.plugin.event
+Bundle-Vendor: Eclipse.org
+DynamicImport-Package: *
+Import-Package: org.eclipse.debug.core,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.client.server,
+ 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.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.query,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.skynet.core/build.properties b/org.eclipse.osee.framework.skynet.core/build.properties
new file mode 100644
index 00000000000..01ad45d1628
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/build.properties
@@ -0,0 +1,12 @@
+bin.includes = META-INF/,\
+ plugin.xml,\
+ support/,\
+ images/,\
+ dbschemas/,\
+ .,\
+ schema/
+source.. = src/
+output.. = bin/
+jars.compile.order = .
+individualSourceBundles=true
+src.includes = src/
diff --git a/org.eclipse.osee.framework.skynet.core/dbschemas/SKYNET.VERSIONING.SCHEMA.xml b/org.eclipse.osee.framework.skynet.core/dbschemas/SKYNET.VERSIONING.SCHEMA.xml
new file mode 100644
index 00000000000..330690391fc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/dbschemas/SKYNET.VERSIONING.SCHEMA.xml
@@ -0,0 +1,680 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TableConfig>
+
+ <!-- _____________________________________________________ -->
+ <!-- -->
+ <!-- MAIN ARTIFACT TABLES -->
+ <!-- -->
+ <!-- _____________________________________________________ -->
+
+ <Table name="OSEE_ARTIFACT" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ART_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="GUID" defaultValue="not null" limits="28" type="VARCHAR" />
+ <Column id="HUMAN_READABLE_ID" defaultValue="not null" limits="10" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_ARTIFACT_A_PK" type="PRIMARY KEY" appliesTo="ART_ID" />
+ <Constraint schema="OSEE" id="ART_TYPE_ID1_FK" type="FOREIGN KEY" appliesTo="ART_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT_TYPE" column="ART_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_ARTIFACT_H_A_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="HUMAN_READABLE_ID"/>
+ <AppliesTo id="ART_ID"/>
+ </Index>
+ <Index id="OSEE_ARTIFACT_AT_IDX" tablespace="osee_index">
+ <AppliesTo id="ART_TYPE_ID"/>
+ </Index>
+ <Index id="OSEE_ARTIFACT_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="GUID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_JOIN_ARTIFACT" schema="OSEE" tablespace="osee_data">
+ <Column id="QUERY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="TRANSACTION_ID" type="INTEGER" />
+ <Column id="INSERT_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Constraint schema="OSEE" id="OSEE_JOIN_ARTIFACT_Q_A_B_PK" type="PRIMARY KEY" appliesTo="QUERY_ID, ART_ID, BRANCH_ID" />
+ <Index id="OSEE_JOIN_ARTIFACT_Q_IDX" tablespace="osee_index">
+ <AppliesTo id="QUERY_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_JOIN_ATTRIBUTE" schema="OSEE" tablespace="osee_data">
+ <Column id="ATTR_QUERY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="VALUE" defaultValue="not null" limits="4000" type="VARCHAR" />
+ <Column id="INSERT_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Index id="OSEE_JOIN_ATTRIBUTE_A_IDX" tablespace="osee_index">
+ <AppliesTo id="ATTR_QUERY_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_ARTIFACT_VERSION" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="MODIFICATION_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_ARTIFACT_VER_G_PK" type="PRIMARY KEY" appliesTo="GAMMA_ID" />
+ <Constraint schema="OSEE" id="ART_ID2_FK" type="FOREIGN KEY" appliesTo="ART_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT" column="ART_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_ARTIFACT_VER_AR_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="ART_ID"/>
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ <Index id="OSEE_ARTIFACT_VER_A_IDX" tablespace="osee_index">
+ <AppliesTo id="ART_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_ARTIFACT_TYPE" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="NAMESPACE" limits="120" type="VARCHAR" />
+ <Column id="NAME" defaultValue="not null" limits="75" type="VARCHAR" />
+ <Column id="IMAGE" type="BLOB" />
+ <Constraint schema="OSEE" id="OSEE_ARTIFACT_TYPE_AR_PK" type="PRIMARY KEY" appliesTo="ART_TYPE_ID" />
+ <Index id="OSEE_ARTIFACT_TYPE_N_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="NAME"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_ARTIFACT_TYPE_INHERITANCE" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_TYPE_ANCESTOR_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ART_TYPE_DESCENDANT_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_ART_TYPE_INHERIT_PK" type="PRIMARY KEY" appliesTo="ART_TYPE_ANCESTOR_ID, ART_TYPE_DESCENDANT_ID" />
+ <Constraint schema="OSEE" id="OSEE_ART_INHERIT_PARENT_FK" type="FOREIGN KEY" appliesTo="ART_TYPE_ANCESTOR_ID">
+ <References schema="OSEE" table="OSEE_ARTIFACT_TYPE" column="ART_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="OSEE_ART_INHERIT_CHILD_FK" type="FOREIGN KEY" appliesTo="ART_TYPE_DESCENDANT_ID">
+ <References schema="OSEE" table="OSEE_ARTIFACT_TYPE" column="ART_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_ATTRIBUTE" schema="OSEE" tablespace="osee_data">
+ <Column id="GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTR_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTR_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="VALUE" limits="4000" type="VARCHAR" />
+ <Column id="MODIFICATION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="URI" limits="200" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_ATTRIBUTE_AT_G_PK" type="PRIMARY KEY" appliesTo="ATTR_ID, GAMMA_ID" />
+ <Constraint schema="OSEE" id="ART_ID1_FK" type="FOREIGN KEY" appliesTo="ART_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT" column="ART_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_ATTRIBUTE_ATT_IDX" tablespace="osee_index">
+ <AppliesTo id="ATTR_TYPE_ID"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_V_IDX" mySqlIgnore="true" tablespace="osee_index">
+ <AppliesTo id="VALUE"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_AR_V_IDX" mySqlIgnore="true" tablespace="osee_index">
+ <AppliesTo id="ART_ID"/>
+ <AppliesTo id="VALUE"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_AR_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="ART_ID"/>
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_G_AT_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="GAMMA_ID"/>
+ <AppliesTo id="ATTR_ID"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_AT_IDX" tablespace="osee_index">
+ <AppliesTo id="ATTR_ID"/>
+ </Index>
+ <Index id="OSEE_ATTRIBUTE_AR_IDX" mySqlIgnore="true" tablespace="osee_index">
+ <AppliesTo id="ART_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_ENUM_TYPE" schema="OSEE" tablespace="osee_data">
+ <Column id="ENUM_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ENUM_TYPE_NAME" defaultValue="not null" limits="500" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_ENUM_TYPE_PK" type="PRIMARY KEY" appliesTo="ENUM_TYPE_ID" />
+ </Table>
+
+ <Table name="OSEE_ENUM_TYPE_DEF" schema="OSEE" tablespace="osee_data">
+ <Column id="ENUM_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="NAME" defaultValue="not null" limits="500" type="VARCHAR" />
+ <Column id="ORDINAL" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_ENUM_TYPE_DEF_EO_PK" type="PRIMARY KEY" appliesTo="ENUM_TYPE_ID, ORDINAL" />
+ <Constraint schema="OSEE" id="ENUM_TYPE_ID_FK1" type="FOREIGN KEY" appliesTo="ENUM_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ENUM_TYPE" column="ENUM_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_ATTRIBUTE_TYPE" schema="OSEE" tablespace="osee_data">
+ <Column id="ATTR_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTR_BASE_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTR_PROVIDER_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="FILE_TYPE_EXTENSION" limits="20" type="VARCHAR" />
+ <Column id="NAMESPACE" limits="120" type="VARCHAR" />
+ <Column id="NAME" defaultValue="not null" limits="500" type="VARCHAR" />
+ <Column id="DEFAULT_VALUE" limits="2000" type="VARCHAR" />
+ <Column id="ENUM_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="MIN_OCCURENCE" defaultValue="not null" type="INTEGER" />
+ <Column id="MAX_OCCURENCE" defaultValue="not null" type="INTEGER" />
+ <Column id="TIP_TEXT" limits="4000" type="VARCHAR" />
+ <Column id="TAGGER_ID" limits="500" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_ATTRIBUTE_TYPE_AT_PK" type="PRIMARY KEY" appliesTo="ATTR_TYPE_ID" />
+ <Constraint schema="OSEE" id="ATTR_BASE_TYPE_ID_FK" type="FOREIGN KEY" appliesTo="ATTR_BASE_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ATTRIBUTE_BASE_TYPE" column="ATTR_BASE_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="ATTR_PROVIDER_TYPE_ID_FK" type="FOREIGN KEY" appliesTo="ATTR_PROVIDER_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ATTRIBUTE_PROVIDER_TYPE" column="ATTR_PROVIDER_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_ATTRIBUTE_TYPE_N_IDX" tablespace="osee_index">
+ <AppliesTo id="NAME"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_ATTRIBUTE_BASE_TYPE" schema="OSEE" tablespace="osee_data">
+ <Column id="ATTR_BASE_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTRIBUTE_CLASS" defaultValue="not null" limits="500" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_ATTR_BASE_TYPE_AT_PK" type="PRIMARY KEY" appliesTo="ATTR_BASE_TYPE_ID" />
+ </Table>
+
+ <Table name="OSEE_ATTRIBUTE_PROVIDER_TYPE" schema="OSEE" tablespace="osee_data">
+ <Column id="ATTR_PROVIDER_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTRIBUTE_PROVIDER_CLASS" defaultValue="not null" limits="500" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_ATTR_PROVIDER_TYPE_AT_PK" type="PRIMARY KEY" appliesTo="ATTR_PROVIDER_TYPE_ID" />
+ </Table>
+
+ <Table name="OSEE_RELATION_LINK" schema="OSEE" tablespace="osee_data">
+ <Column id="GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="REL_LINK_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="REL_LINK_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="A_ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="B_ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="A_ORDER" defaultValue="not null" type="INTEGER" />
+ <Column id="B_ORDER" defaultValue="not null" type="INTEGER" />
+ <Column id="RATIONALE" limits="4000" type="VARCHAR" />
+ <Column id="MODIFICATION_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_REL_LINK_G_PK" type="PRIMARY KEY" appliesTo="GAMMA_ID" />
+ <Constraint schema="OSEE" id="OSEE_FOREIGN_B_ART" type="FOREIGN KEY" appliesTo="B_ART_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT" column="ART_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="OSEE_FOREIGN_A_ART" type="FOREIGN KEY" appliesTo="A_ART_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT" column="ART_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="REL_TYPE_ID1_FK" type="FOREIGN KEY" appliesTo="REL_LINK_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_RELATION_LINK_TYPE" column="REL_LINK_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_REL_LINK_RL_IDX" tablespace="osee_index">
+ <AppliesTo id="REL_LINK_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_RL_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="REL_LINK_ID"/>
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_AA_IDX" tablespace="osee_index">
+ <AppliesTo id="A_ART_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_BA_IDX" tablespace="osee_index">
+ <AppliesTo id="B_ART_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_BA_RL_IDX" tablespace="osee_index">
+ <AppliesTo id="B_ART_ID"/>
+ <AppliesTo id="REL_LINK_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_RL_AA_IDX" tablespace="osee_index">
+ <AppliesTo id="REL_LINK_ID"/>
+ <AppliesTo id="A_ART_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_AA_BA_IDX" tablespace="osee_index">
+ <AppliesTo id="A_ART_ID"/>
+ <AppliesTo id="B_ART_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_BA_AA_IDX" tablespace="osee_index">
+ <AppliesTo id="B_ART_ID"/>
+ <AppliesTo id="A_ART_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_AA_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="A_ART_ID"/>
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_BA_G_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="B_ART_ID"/>
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ <Index id="OSEE_REL_LINK_RT_IDX" tablespace="osee_index">
+ <AppliesTo id="REL_LINK_TYPE_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_RELATION_LINK_TYPE" schema="OSEE" tablespace="osee_data">
+ <Column id="REL_LINK_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="NAMESPACE" limits="120" type="VARCHAR" />
+ <Column id="TYPE_NAME" defaultValue="not null" limits="50" type="VARCHAR" />
+ <Column id="A_NAME" defaultValue="not null" limits="50" type="VARCHAR" />
+ <Column id="B_NAME" defaultValue="not null" limits="50" type="VARCHAR" />
+ <Column id="AB_PHRASING" defaultValue="not null" limits="50" type="VARCHAR" />
+ <Column id="BA_PHRASING" defaultValue="not null" limits="50" type="VARCHAR" />
+ <Column id="SHORT_NAME" defaultValue="not null" limits="20" type="VARCHAR" />
+ <Column id="USER_ORDERED" defaultValue="not null" limits="5" type="VARCHAR" />
+ <Constraint schema="OSEE" id="OSEE_REL_LINK_TYPE_RLT_PK" type="PRIMARY KEY" appliesTo="REL_LINK_TYPE_ID" />
+ </Table>
+
+ <Table name="OSEE_VALID_ATTRIBUTES" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ATTR_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_VALID_ATTR_AR_AT_PK" type="PRIMARY KEY" appliesTo="ART_TYPE_ID, ATTR_TYPE_ID, BRANCH_ID" />
+ <Constraint schema="OSEE" id="ATTR_TYPE_ID_FK" type="FOREIGN KEY" appliesTo="ATTR_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ATTRIBUTE_TYPE" column="ATTR_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="ART_TYPE_ID2_FK" type="FOREIGN KEY" appliesTo="ART_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT_TYPE" column="ART_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="BRANCH_ID_FK5" type="FOREIGN KEY" appliesTo="BRANCH_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_VALID_RELATIONS" schema="OSEE" tablespace="osee_data">
+ <Column id="SIDE_A_MAX" defaultValue="not null" type="INTEGER" />
+ <Column id="SIDE_B_MAX" defaultValue="not null" type="INTEGER" />
+ <Column id="ART_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="REL_LINK_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_VALID_REL_AT_RT_G_PK" type="PRIMARY KEY" appliesTo="ART_TYPE_ID, REL_LINK_TYPE_ID, BRANCH_ID" />
+ <Constraint schema="OSEE" id="BRANCH_ID_FK4" type="FOREIGN KEY" appliesTo="BRANCH_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="ART_TYPE_ID3_FK" type="FOREIGN KEY" appliesTo="ART_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_ARTIFACT_TYPE" column="ART_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="REL_TYPE_ID2_FK" type="FOREIGN KEY" appliesTo="REL_LINK_TYPE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_RELATION_LINK_TYPE" column="REL_LINK_TYPE_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- MAIN VERSIONING TABLES - CHANGE, TX, AND BRANCH SUPPORT -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+
+ <Table name="OSEE_BRANCH" schema="OSEE" tablespace="osee_data">
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_NAME" defaultValue="not null" limits="200" type="VARCHAR" />
+ <Column id="PARENT_BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PARENT_TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ARCHIVED" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_STATE" defaultValue="not null" type="INTEGER" />
+ <Column id="ASSOCIATED_ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_TYPE" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_BRANCH_B_PK" type="PRIMARY KEY" appliesTo="BRANCH_ID" />
+ <!--
+ <Constraint schema="OSEE" id="OSEE_TRANSACTION_ID_FK2" type="FOREIGN KEY" appliesTo="PARENT_TRANSACTION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_TX_DETAILS" column="TRANSACTION_ID" onDelete="CASCADE" />
+ </Constraint>
+ -->
+ <Index id="OSEE_BRANCH_A_IDX" tablespace="osee_index">
+ <AppliesTo id="ARCHIVED" />
+ </Index>
+ </Table>
+
+ <Table name="OSEE_BRANCH_ANCESTRY" schema="OSEE" tablespace="osee_data">
+ <Column id="ANCESTOR_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="DESCENDENT_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="BRANCH_ID_FK2" type="FOREIGN KEY" appliesTo="ANCESTOR_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="BRANCH_ID_FK3" type="FOREIGN KEY" appliesTo="DESCENDENT_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_TXS" schema="OSEE" tablespace="osee_data">
+ <Column id="TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="MOD_TYPE" type="INTEGER" /> <!-- CHANGE TO NOT ACCEPT NULLS -->
+ <Column id="TX_CURRENT" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_TXS_G_TX_PK" type="PRIMARY KEY" appliesTo="GAMMA_ID, TRANSACTION_ID"/>
+ <Constraint schema="OSEE" id="OSEE_TRANSACTION_ID_FK" type="FOREIGN KEY" appliesTo="TRANSACTION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_TX_DETAILS" column="TRANSACTION_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_TXS_G_IDX" tablespace="osee_index">
+ <AppliesTo id="GAMMA_ID" />
+ </Index>
+ <Index id="OSEE_TXS_TX_IDX" tablespace="osee_index">
+ <AppliesTo id="TRANSACTION_ID" />
+ </Index>
+ </Table>
+
+ <Table name="OSEE_TX_DETAILS" schema="OSEE" tablespace="osee_data">
+ <Column id="TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="TX_TYPE" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="OSEE_COMMENT" limits="1000" type="VARCHAR" />
+ <Column id="TIME" defaultValue="not null" type="TIMESTAMP"/>
+ <Column id="AUTHOR" defaultValue="not null" type="INTEGER"/>
+ <Column id="COMMIT_ART_ID" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_TX_DETAILS_TX_PK" type="PRIMARY KEY" appliesTo="TRANSACTION_ID" />
+ <Constraint schema="OSEE" id="BRANCH_ID_FK1" type="FOREIGN KEY" appliesTo="BRANCH_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_TX_DETAILS_B_TX_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="BRANCH_ID"/>
+ <AppliesTo id="TRANSACTION_ID" />
+ </Index>
+ <Index id="OSEE_TX_DETAILS_TX_B_IDX" type="UNIQUE" tablespace="osee_index">
+ <AppliesTo id="TRANSACTION_ID" />
+ <AppliesTo id="BRANCH_ID"/>
+ </Index>
+ <Index id="OSEE_TX_DETAILS_B_IDX" tablespace="osee_index">
+ <AppliesTo id="BRANCH_ID" />
+ </Index>
+ </Table>
+
+ <Table name="OSEE_TX_NAMES" schema="OSEE" tablespace="osee_data">
+ <Column id="TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="NAME" defaultValue="not null" limits="100" type="VARCHAR" />
+ <Constraint schema="OSEE" id="TRANSACTION_ID2_FK" type="FOREIGN KEY" appliesTo="TRANSACTION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_TX_DETAILS" column="TRANSACTION_ID"
+ onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="ODTN__NAME_UN" type="UNIQUE" appliesTo="NAME" />
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- ACCESS CONTROL LIST TABLES -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_ARTIFACT_ACL" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PERMISSION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PRIVILEGE_ENTITY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_ARTIFACT_ACL_A_P_B_PK" type="PRIMARY KEY" appliesTo="ART_ID, PRIVILEGE_ENTITY_ID, BRANCH_ID" />
+ <Constraint schema="OSEE" id="ARTIFACT_ACL_PERM_FK" type="FOREIGN KEY" appliesTo="PERMISSION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_PERMISSION" column="PERMISSION_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_RELATION_LINK_TYPE_ACL" schema="OSEE" tablespace="osee_data">
+ <Column id="REL_LINK_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PERMISSION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PRIVILEGE_ENTITY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="RELATION_LINK_TYPE_ACL_PK" type="PRIMARY KEY" appliesTo="REL_LINK_TYPE_ID, PRIVILEGE_ENTITY_ID, BRANCH_ID" />
+ <Constraint schema="OSEE" id="RELATION_LINK_TYPE_PERM_FK" type="FOREIGN KEY" appliesTo="PERMISSION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_PERMISSION" column="PERMISSION_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_ARTIFACT_TYPE_ACL" schema="OSEE" tablespace="osee_data">
+ <Column id="ART_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PERMISSION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PRIVILEGE_ENTITY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_ART_TYPE_ACL_AT_P_B_PK" type="PRIMARY KEY" appliesTo="ART_TYPE_ID, PRIVILEGE_ENTITY_ID, BRANCH_ID" />
+ <Constraint schema="OSEE" id="ARTIFACT_TYPE_PERM_FK" type="FOREIGN KEY" appliesTo="PERMISSION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_PERMISSION" column="PERMISSION_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_ATTRIBUTE_TYPE_ACL" schema="OSEE" tablespace="osee_data">
+ <Column id="ATTR_TYPE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PERMISSION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PRIVILEGE_ENTITY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_ATTR_TYPE_ACL_A_P_B_PK" type="PRIMARY KEY" appliesTo="ATTR_TYPE_ID, PRIVILEGE_ENTITY_ID, BRANCH_ID" />
+ <Constraint schema="OSEE" id="ATTRIBUTE_TYPE_PERM_FK" type="FOREIGN KEY" appliesTo="PERMISSION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_PERMISSION" column="PERMISSION_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_BRANCH_ACL" schema="OSEE" tablespace="osee_data">
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PERMISSION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PRIVILEGE_ENTITY_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_BRANCH_ACL_B_P_PK" type="PRIMARY KEY" appliesTo="BRANCH_ID, PRIVILEGE_ENTITY_ID" />
+ <Constraint schema="OSEE" id="BRANCH_ACL_FK" type="FOREIGN KEY" appliesTo="BRANCH_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="BRANCH_ACL_PERM_FK" type="FOREIGN KEY" appliesTo="PERMISSION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_PERMISSION" column="PERMISSION_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_PERMISSION" schema="OSEE" tablespace="osee_data">
+ <Column id="PERMISSION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="PERMISSION_NAME" defaultValue="not null" limits="50" type="VARCHAR" />
+ <Constraint schema="OSEE" id="PERMISSION_PK" type="PRIMARY KEY" appliesTo="PERMISSION_ID" />
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- TAGGING TABLES -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_SEARCH_TAGS" schema="OSEE" tablespace="osee_data">
+ <Column id="GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="CODED_TAG_ID" defaultValue="not null" type="BIGINT" />
+ <Constraint schema="OSEE" id="OSEE_SEARCH_TAGS__PK" type="PRIMARY KEY" appliesTo="CODED_TAG_ID, GAMMA_ID" />
+ <Index id="OSEE_SEARCH_TAGS_C_IDX" tablespace="osee_index">
+ <AppliesTo id="CODED_TAG_ID"/>
+ </Index>
+ <Index id="OSEE_SEARCH_TAGS_G_IDX" tablespace="osee_index">
+ <AppliesTo id="GAMMA_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_JOIN_SEARCH_TAGS" schema="OSEE" tablespace="osee_data">
+ <Column id="QUERY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="CODED_TAG_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="INSERT_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Constraint schema="OSEE" id="OSEE_JOIN_SEARCH_TAGS_Q_C_PK" type="PRIMARY KEY" appliesTo="QUERY_ID, CODED_TAG_ID" />
+ <Index id="OSEE_JOIN_SEARCH_TAGS_Q_IDX" tablespace="osee_index">
+ <AppliesTo id="QUERY_ID"/>
+ </Index>
+ </Table>
+
+ <Table name="OSEE_TAG_GAMMA_QUEUE" schema="OSEE" tablespace="osee_data">
+ <Column id="QUERY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="INSERT_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Constraint schema="OSEE" id="OSEE_JOIN_GAMMA_Q_G_PK" type="PRIMARY KEY" appliesTo="QUERY_ID, GAMMA_ID" />
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- OSEE SEQUENCES-->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_SEQUENCE" schema="OSEE" tablespace="osee_data">
+ <Column id="LAST_SEQUENCE" defaultValue="not null" type="BIGINT" />
+ <Column id="SEQUENCE_NAME" defaultValue="not null" type="VARCHAR" limits="128" />
+ <Constraint schema="OSEE" id="SEQUENCE_ID_UN" type="UNIQUE" appliesTo="SEQUENCE_NAME" />
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- OSEE Branch Table -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_BRANCH_DEFINITIONS" schema="OSEE" tablespace="osee_data">
+ <Column id="MAPPED_BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="STATIC_BRANCH_NAME" defaultValue="not null" type="VARCHAR" limits="128" />
+ <Constraint schema="OSEE" id="BRANCH_DEFINITIONS_SBN_PK" type="PRIMARY KEY" appliesTo="STATIC_BRANCH_NAME" />
+ <Constraint schema="OSEE" id="OSEE_BRANCH_DEF__OBD_FK" type="FOREIGN KEY" appliesTo="MAPPED_BRANCH_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_BRANCH_DELETE_HELPER" schema="OSEE" tablespace="osee_data">
+ <Column id="BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="GAMMA_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_BRANCH_DEF__OBDH_FK" type="FOREIGN KEY" appliesTo="BRANCH_ID">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_INFO" schema="OSEE" tablespace="osee_data">
+ <Column defaultValue="not null" id="OSEE_VALUE" type="VARCHAR" limits="1000" />
+ <Column defaultValue="not null" id="OSEE_KEY" type="VARCHAR" limits="50" />
+ <Constraint schema="OSEE" id="OSEE_INFO_KEY_UN_IDX" type="UNIQUE" appliesTo="OSEE_KEY" />
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- OSEE Merge -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_MERGE" schema="OSEE" tablespace="osee_data">
+ <Column id="SOURCE_BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="DEST_BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="MERGE_BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="COMMIT_TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_MERGE__PK" type="PRIMARY KEY" appliesTo="MERGE_BRANCH_ID" />
+ <Constraint schema="OSEE" id="OSEE_MERGE__MBI_FK" type="FOREIGN KEY" appliesTo="MERGE_BRANCH_ID">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Constraint schema="OSEE" id="OSEE_MERGE__DBI_FK" type="FOREIGN KEY" appliesTo="DEST_BRANCH_ID">
+ <References schema="OSEE" table="OSEE_BRANCH" column="BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+ <Table name="OSEE_CONFLICT" schema="OSEE" tablespace="osee_data">
+ <Column id="CONFLICT_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="MERGE_BRANCH_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="CONFLICT_TYPE" defaultValue="not null" type="INTEGER" />
+ <Column id="SOURCE_GAMMA_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="DEST_GAMMA_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="STATUS" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_CONFLICT__PK" type="PRIMARY KEY" appliesTo="MERGE_BRANCH_ID, SOURCE_GAMMA_ID" />
+ <Constraint schema="OSEE" id="OSEE_CONFLICT__MBI_FK" type="FOREIGN KEY" appliesTo="MERGE_BRANCH_ID">
+ <References schema="OSEE" table="OSEE_MERGE" column="MERGE_BRANCH_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+
+ <Table name="OSEE_JOIN_TRANSACTION" schema="OSEE" tablespace="osee_data">
+ <Column id="QUERY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="GAMMA_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="INSERT_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Index id="OSEE_JOIN_TRANSACTION_Q_IDX" tablespace="osee_index">
+ <AppliesTo id="QUERY_ID"/>
+ </Index>
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- Reverted TXS -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_REMOVED_TXS" schema="OSEE" tablespace="osee_data">
+ <Column id="TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="REM_GAMMA_ID" defaultValue="not null" type="BIGINT" />
+ <Column id="REM_MOD_TYPE" defaultValue="not null" type="INTEGER" />
+ <Column id="REM_TX_CURRENT" defaultValue="not null" type="INTEGER" />
+ <Column id="REM_TRANSACTION_ID" defaultValue="not null" type="INTEGER" />
+ <Constraint schema="OSEE" id="OSEE_REM_TXS_RG_RTX_PK" type="PRIMARY KEY" appliesTo="REM_GAMMA_ID, REM_TRANSACTION_ID"/>
+ <Constraint schema="OSEE" id="OSEE_TRANSACTION_ID_FK3" type="FOREIGN KEY" appliesTo="TRANSACTION_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_TX_DETAILS" column="TRANSACTION_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- IMPORT TABLES -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_JOIN_EXPORT_IMPORT" schema="OSEE" tablespace="osee_data">
+ <Column id="QUERY_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ID1" defaultValue="not null" type="BIGINT" />
+ <Column id="ID2" defaultValue="not null" type="BIGINT" />
+ <Column id="INSERT_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Index id="OSEE_JOIN_EXPORT_IMPORT_Q_IDX" tablespace="osee_index">
+ <AppliesTo id="QUERY_ID"/>
+ </Index>
+ </Table>
+ <Table name="OSEE_IMPORT_SOURCE" schema="OSEE" tablespace="osee_data">
+ <Column id="IMPORT_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="DB_SOURCE_GUID" defaultValue="not null" type="VARCHAR" limits="28"/>
+ <Column id="SOURCE_EXPORT_DATE" defaultValue="not null" type="TIMESTAMP" />
+ <Column id="DATE_IMPORTED" defaultValue="not null" type="TIMESTAMP" />
+ <Constraint schema="OSEE" id="OSEE_IMPORT_MAP_PK" type="PRIMARY KEY" appliesTo="IMPORT_ID" />
+ </Table>
+ <Table name="OSEE_IMPORT_SAVE_POINT" schema="OSEE" tablespace="osee_data">
+ <Column id="IMPORT_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="SAVE_POINT_NAME" defaultValue="not null" type="VARCHAR" limits="128"/>
+ <Column id="STATUS" defaultValue="not null" type="INTEGER" />
+ <Column id="STATE_ERROR" type="VARCHAR" limits="4000" />
+ <Constraint schema="OSEE" id="OSEE_IMP_SAVE_POINT_II_PK" type="PRIMARY KEY" appliesTo="IMPORT_ID, SAVE_POINT_NAME" />
+ <Constraint schema="OSEE" id="OSEE_IMP_SAVE_POINT_II_FK" type="FOREIGN KEY" appliesTo="IMPORT_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_IMPORT_SOURCE" column="IMPORT_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+ <Table name="OSEE_IMPORT_MAP" schema="OSEE" tablespace="osee_data">
+ <Column id="IMPORT_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="SEQUENCE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="SEQUENCE_NAME" defaultValue="not null" type="VARCHAR" limits="128"/>
+ <Constraint schema="OSEE" id="OSEE_IMPORT_MAP_II_PK" type="PRIMARY KEY" appliesTo="SEQUENCE_ID" />
+ <Constraint schema="OSEE" id="OSEE_IMPORT_MAP_II_FK" type="FOREIGN KEY" appliesTo="IMPORT_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_IMPORT_SOURCE" column="IMPORT_ID" onDelete="CASCADE" />
+ </Constraint>
+ </Table>
+ <Table name="OSEE_IMPORT_INDEX_MAP" schema="OSEE" tablespace="osee_data">
+ <Column id="SEQUENCE_ID" defaultValue="not null" type="INTEGER" />
+ <Column id="ORIGINAL_ID" defaultValue="not null" type="BIGINT"/>
+ <Column id="MAPPED_ID" defaultValue="not null" type="BIGINT" />
+ <Constraint schema="OSEE" id="OSEE_IMPORT_INDEX_MAP_IOM_PK" type="PRIMARY KEY" appliesTo="SEQUENCE_ID, ORIGINAL_ID, MAPPED_ID" />
+ <Constraint schema="OSEE" id="OSEE_IMPORT_INDEX_MAP_II_FK" type="FOREIGN KEY" appliesTo="SEQUENCE_ID" deferrable="true">
+ <References schema="OSEE" table="OSEE_IMPORT_MAP" column="SEQUENCE_ID" onDelete="CASCADE" />
+ </Constraint>
+ <Index id="OSEE_IMPORT_INDEX_MAP_IO_IDX" tablespace="osee_index">
+ <AppliesTo id="SEQUENCE_ID"/>
+ <AppliesTo id="ORIGINAL_ID"/>
+ </Index>
+ <Index id="OSEE_IMPORT_INDEX_MAP_IM_IDX" tablespace="osee_index">
+ <AppliesTo id="SEQUENCE_ID"/>
+ <AppliesTo id="MAPPED_ID"/>
+ </Index>
+ </Table>
+
+ <!-- __________________________________________________________ -->
+ <!-- -->
+ <!-- Application Server -->
+ <!-- -->
+ <!-- __________________________________________________________ -->
+
+ <Table name="OSEE_SERVER_LOOKUP" schema="OSEE" tablespace="osee_data">
+ <Column id="VERSION_ID" defaultValue="not null" type="VARCHAR" limits="100" />
+ <Column id="SERVER_ADDRESS" defaultValue="not null" type="VARCHAR" limits="255"/>
+ <Column id="PORT" defaultValue="not null" type="INTEGER" />
+ <Column id="ACCEPTS_REQUESTS" defaultValue="not null" type="INTEGER" />
+ <Column id="START_TIME" defaultValue="not null" type="TIMESTAMP" />
+ <Column id="SERVER_ID" defaultValue="not null" type="VARCHAR" limits="40" />
+ <Constraint schema="OSEE" id="OSEE_SERVER_LOOKUP_PK" type="PRIMARY KEY" appliesTo="SERVER_ADDRESS, PORT, VERSION_ID" />
+ </Table>
+
+ <Table name="OSEE_SESSION" schema="OSEE" tablespace="osee_data">
+ <Column id="MANAGED_BY_SERVER_ID" defaultValue="not null" type="VARCHAR" limits="40" />
+ <Column id="SESSION_ID" defaultValue="not null" type="VARCHAR" limits="28" />
+ <Column id="USER_ID" defaultValue="not null" type="VARCHAR" limits="100"/>
+ <Column id="CLIENT_MACHINE_NAME" defaultValue="not null" type="VARCHAR" limits="100"/>
+ <Column id="CLIENT_ADDRESS" defaultValue="not null" type="VARCHAR" limits="255"/>
+ <Column id="CLIENT_PORT" defaultValue="not null" type="INTEGER" />
+ <Column id="CLIENT_VERSION" defaultValue="not null" type="VARCHAR" limits="100"/>
+ <Column id="CREATED_ON" defaultValue="not null" type="TIMESTAMP" />
+ <Column id="LAST_INTERACTION_DATE" defaultValue="not null" type="TIMESTAMP" />
+ <Column id="LAST_INTERACTION" defaultValue="not null" type="VARCHAR" limits="1000"/>
+ <Constraint schema="OSEE" id="OSEE_SESSION_PK" type="PRIMARY KEY" appliesTo="SESSION_ID" />
+ </Table>
+</TableConfig> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/plugin.xml b/org.eclipse.osee.framework.skynet.core/plugin.xml
new file mode 100644
index 00000000000..0dfcdbf9bc0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/plugin.xml
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension-point id="ArtifactFactory" name="ArtifactFactory" schema="schema/ArtifactFactory.exsd"/>
+ <extension-point id="ArtifactTypeImage" name="ArtifactTypeImage" schema="schema/ArtifactTypeImage.exsd"/>
+ <extension-point id="HttpServerRequest" name="HttpServerRequest" schema="schema/HttpServerRequest.exsd"/>
+ <extension-point id="OseeTypes" name="OseeTypes" schema="schema/OseeTypes.exsd"/>
+ <extension-point id="AtsLib" name="AtsLib" schema="schema/AtsLib.exsd"/>
+ <extension-point id="DefaultInitialBranchProvider" name="DefaultInitialBranchProvider" schema="schema/DefaultInitialBranchProvider.exsd"/>
+ <extension-point id="ArtifactAnnotation" name="ArtifactAnnotation" schema="schema/ArtifactAnnotation.exsd"/>
+ <extension-point id="OseeDbSchema" name="OseeDbSchema" schema="schema/OseeDbSchema.exsd"/>
+ <extension-point id="WebPage" name="WebPage" schema="schema/WebPage.exsd"/>
+ <extension-point id="ArtifactCheck" name="ArtifactCheck" schema="schema/ArtifactCheck.exsd"/>
+ <extension-point id="AttributeType" name="AttributeType" schema="schema/AttributeType.exsd"/>
+ <extension-point id="AttributeDataProvider" name="AttributeDataProvider" schema="schema/AttributeDataProvider.exsd"/>
+ <extension-point id="OseeDbImportData" name="OseeDbImportData" schema="schema/OseeDbImportData.exsd"/>
+ <extension-point id="ClientLoopbackCmd" name="ClientLoopbackCmd" schema="schema/ClientLoopbackCmd.exsd"/>
+ <extension-point id="CommitActions" name="CommitActions" schema="schema/CommitActions.exsd"/>
+ <extension-point id="OseeValidator" name="OseeValidator" schema="schema/OseeValidator.exsd"/>
+
+ <extension
+ id="SkynetDbInit"
+ name="SkynetDbInit"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit">
+ </DatabaseTask>
+ </extension>
+ <extension
+ id="SkynetDbBranchDataImport"
+ name="SkynetDbBranchDataImport"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbBranchDataImport">
+ </DatabaseTask>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ArtifactFactory">
+ <ArtifactFactory
+ classname="org.eclipse.osee.framework.skynet.core.artifact.factory.SkynetCoreArtifactFactory">
+ </ArtifactFactory>
+ </extension>
+ <extension
+ id="OseeTypes_CommonBranch"
+ name="OseeTypes_Common Branch"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_CommonBranch.xml">
+ </ExcelFile>
+ </extension>
+ <extension
+ id="OseeTypes_ProgramBranch"
+ name="OseeTypes_Program Branch"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_ProgramBranch.xml">
+ </ExcelFile>
+ </extension>
+ <extension
+ id="OseeTypes_ProgramAndCommon"
+ name="OseeTypes_ProgramAndCommon"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_ProgramAndCommon.xml">
+ </ExcelFile>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.plugin.core.logHandler">
+ <handler
+ name="org.eclipse.osee.framework.skynet.core.usage.SkynetUsageHandler">
+ </handler>
+ </extension>
+ <extension
+ id="SkynetSchemaDefinition"
+ name="SkynetSchemaDefinition"
+ point="org.eclipse.osee.framework.skynet.core.OseeDbSchema">
+ <Schema
+ SchemaFile="dbschemas/SKYNET.VERSIONING.SCHEMA.xml">
+ </Schema>
+ </extension>
+
+ <extension
+ id="BooleanAttribute"
+ name="BooleanAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="DateAttribute"
+ name="DateAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.DateAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="EnumeratedAttribute"
+ name="EnumeratedAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="FloatingPointAttribute"
+ name="FloatingPointAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="IntegerAttribute"
+ name="IntegerAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="StringAttribute"
+ name="StringAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.StringAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="WordAttribute"
+ name="WordAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.WordAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="WordTemplateAttribute"
+ name="WordTemplateAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.WordTemplateAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="WordWholeDocumentAttribute"
+ name="WordWholeDocumentAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <CharacterBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.WordWholeDocumentAttribute">
+ </CharacterBackedAttributeType>
+ </extension>
+ <extension
+ id="JavaObjectAttribute"
+ name="JavaObjectAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <BinaryBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.JavaObjectAttribute">
+ </BinaryBackedAttributeType>
+ </extension>
+ <extension
+ id="CompressedContentAttribute"
+ name="CompressedContentAttribute"
+ point="org.eclipse.osee.framework.skynet.core.AttributeType">
+ <BinaryBackedAttributeType
+ class="org.eclipse.osee.framework.skynet.core.attribute.CompressedContentAttribute">
+ </BinaryBackedAttributeType>
+ </extension>
+ <extension
+ id="DefaultAttributeDataProvider"
+ name="DefaultAttributeDataProvider"
+ point="org.eclipse.osee.framework.skynet.core.AttributeDataProvider">
+ <BinaryAttributeDataProvider
+ class="org.eclipse.osee.framework.skynet.core.attribute.providers.DefaultAttributeDataProvider">
+ </BinaryAttributeDataProvider>
+ </extension>
+ <extension
+ id="UriAttributeDataProvider"
+ name="UriAttributeDataProvider"
+ point="org.eclipse.osee.framework.skynet.core.AttributeDataProvider">
+ <BinaryAttributeDataProvider
+ class="org.eclipse.osee.framework.skynet.core.attribute.providers.UriAttributeDataProvider">
+ </BinaryAttributeDataProvider>
+ </extension>
+ <extension
+ id="ClobAttributeDataProvider"
+ name="ClobAttributeDataProvider"
+ point="org.eclipse.osee.framework.skynet.core.AttributeDataProvider">
+ <CharacterAttributeDataProvider
+ class="org.eclipse.osee.framework.skynet.core.attribute.providers.ClobAttributeDataProvider">
+ </CharacterAttributeDataProvider>
+ </extension>
+ <extension
+ id="PostDbUserCleanUp"
+ name="PostDbUserCleanUp"
+ point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.skynet.core.dbinit.PostDbUserCleanUp">
+ </DatabaseTask>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.HttpServerRequest">
+ <IHttpServerRequest
+ classname="org.eclipse.osee.framework.skynet.core.httpRequests.ClientLoopbackHandler">
+ </IHttpServerRequest>
+ </extension>
+ <extension
+ id="CatchTrackedChanges"
+ name="CatchTrackedChanges"
+ point="org.eclipse.osee.framework.skynet.core.CommitActions">
+ <commitActions
+ className="org.eclipse.osee.framework.skynet.core.commit.actions.CatchTrackedChanges">
+ </commitActions>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.OseeValidator">
+ <OseeValidator
+ classname="org.eclipse.osee.framework.skynet.core.attribute.OseeEnumerationValidation">
+ </OseeValidator>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.HttpServerRequest">
+ <IHttpServerRequest
+ classname="org.eclipse.osee.framework.skynet.core.httpRequests.ClientDashboardRequestHandler">
+ </IHttpServerRequest>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/ArtifactAnnotation.exsd b/org.eclipse.osee.framework.skynet.core/schema/ArtifactAnnotation.exsd
new file mode 100644
index 00000000000..00c88092964
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/ArtifactAnnotation.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="ArtifactAnnotation" name="ArtifactAnnotation"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="ArtifactAnnotation" minOccurs="1" maxOccurs="unbounded"/>
+ </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="ArtifactAnnotation">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.skynet.core.artifact.annotation.IArtifactAnnotation"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/ArtifactCheck.exsd b/org.eclipse.osee.framework.skynet.core/schema/ArtifactCheck.exsd
new file mode 100644
index 00000000000..4921c8556a9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/ArtifactCheck.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="ArtifactCheck" name="ArtifactCheck"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="ArtifactCheck"/>
+ </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="ArtifactCheck">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.skynet.core.artifact.IArtifactCheck"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/ArtifactFactory.exsd b/org.eclipse.osee.framework.skynet.core/schema/ArtifactFactory.exsd
new file mode 100644
index 00000000000..324d9461bee
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/ArtifactFactory.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="ArtifactFactory" name="ArtifactFactory"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="ArtifactFactory"/>
+ </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="ArtifactFactory">
+ <complexType>
+ <attribute name="classname" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/AtsLib.exsd b/org.eclipse.osee.framework.skynet.core/schema/AtsLib.exsd
new file mode 100644
index 00000000000..9be7b309d18
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/AtsLib.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="AtsLib" name="AtsLib"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="AtsLib"/>
+ </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="AtsLib">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.ui.skynet.ats.IAtsLib"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/AttributeDataProvider.exsd b/org.eclipse.osee.framework.skynet.core/schema/AttributeDataProvider.exsd
new file mode 100644
index 00000000000..1fe960035fb
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/AttributeDataProvider.exsd
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="AttributeDataProvider" name="AttributeDataProvider"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <choice>
+ <element ref="CharacterAttributeDataProvider"/>
+ <element ref="BinaryAttributeDataProvider"/>
+ </choice>
+ <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" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="BinaryAttributeDataProvider">
+ <complexType>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.framework.skynet.core.attribute.providers.AbstractAttributeDataProvider:org.eclipse.osee.framework.skynet.core.attribute.providers.IBinaryAttributeDataProvider"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="CharacterAttributeDataProvider">
+ <complexType>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.framework.skynet.core.attribute.providers.AbstractAttributeDataProvider:org.eclipse.osee.framework.skynet.core.attribute.providers.ICharacterAttributeDataProvider"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/AttributeType.exsd b/org.eclipse.osee.framework.skynet.core/schema/AttributeType.exsd
new file mode 100644
index 00000000000..abff1cd0d0a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/AttributeType.exsd
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="AttributeType" name="AttributeType"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <choice>
+ <element ref="CharacterBackedAttributeType"/>
+ <element ref="BinaryBackedAttributeType"/>
+ </choice>
+ <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" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="CharacterBackedAttributeType">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.framework.skynet.core.attribute.CharacterBackedAttribute:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="BinaryBackedAttributeType">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.framework.skynet.core.attribute.BinaryBackedAttribute:"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/ClientLoopbackCmd.exsd b/org.eclipse.osee.framework.skynet.core/schema/ClientLoopbackCmd.exsd
new file mode 100644
index 00000000000..853feb0bc46
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/ClientLoopbackCmd.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core.skynet" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core.skynet" id="ClientLoopbackCmd" name="ClientLoopbackCmd"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="ClientLoopbackCmd"/>
+ </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="ClientLoopbackCmd">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+ Class used to service client loopback commands.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.skynet.core.httpRequests.IClientLoopbackCmd"/>
+ </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.framework.skynet.core/schema/CommitActions.exsd b/org.eclipse.osee.framework.skynet.core/schema/CommitActions.exsd
new file mode 100644
index 00000000000..b996b88af8e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/CommitActions.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="CommitActions" name="CommitActions"/>
+ </appinfo>
+ <documentation>
+ Actions to be run just prior to Commit
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="commitActions"/>
+ </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="commitActions">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.skynet.core.commit.actions.CommitAction"/>
+ </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.framework.skynet.core/schema/DefaultInitialBranchProvider.exsd b/org.eclipse.osee.framework.skynet.core/schema/DefaultInitialBranchProvider.exsd
new file mode 100644
index 00000000000..81e6a5906d1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/DefaultInitialBranchProvider.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="DefaultInitialBranchProvider" name="DefaultInitialBranchProvider"/>
+ </appInfo>
+ <documentation>
+ Allows plugins to provide a list of branches that should be used to choose the initial default branch from when no default branch preference is available.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="Provider"/>
+ </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="Provider">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="osee.skynet.artifact.IDefaultInitialBranchesProvider"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/HttpServerRequest.exsd b/org.eclipse.osee.framework.skynet.core/schema/HttpServerRequest.exsd
new file mode 100644
index 00000000000..5edcca77f02
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/HttpServerRequest.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="HttpServerRequest" name="HttpServerRequest"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="IHttpServerRequest"/>
+ </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="IHttpServerRequest">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/schema/OseeDbImportData.exsd b/org.eclipse.osee.framework.skynet.core/schema/OseeDbImportData.exsd
new file mode 100644
index 00000000000..aa4113f7fa4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/OseeDbImportData.exsd
@@ -0,0 +1,117 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="OseeDbImportData" name="OseeDbImportData"/>
+ </appinfo>
+ <documentation>
+ Contributions to this extension point provide zipped branch data used to initialize an OSEE database.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="OseeDbImportData"/>
+ </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="OseeDbImportData">
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element ref="BranchesToImport"/>
+ </sequence>
+ <attribute name="branchData" type="string" use="required">
+ <annotation>
+ <documentation>
+ Zipped branch data to be used during import process.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="BranchesToImport">
+ <complexType>
+ <attribute name="branchName" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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.framework.skynet.core/schema/OseeDbSchema.exsd b/org.eclipse.osee.framework.skynet.core/schema/OseeDbSchema.exsd
new file mode 100644
index 00000000000..15178d35358
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/OseeDbSchema.exsd
@@ -0,0 +1,112 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="SkynetDbSchema" name="SkynetDbSchema"/>
+ </appinfo>
+ <documentation>
+ Contributions to this extension point provide the name of a file describing database tables and schemas needed for database configuration.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="Schema"/>
+ </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="Schema">
+ <complexType>
+ <attribute name="SchemaFile" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="DbInitRule" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.database.IDbInitRule"/>
+ </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.framework.skynet.core/schema/OseeTypes.exsd b/org.eclipse.osee.framework.skynet.core/schema/OseeTypes.exsd
new file mode 100644
index 00000000000..bf8003f4814
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/OseeTypes.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="OseeTypes" name="OseeTypes"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="ExcelFile"/>
+ </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" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="ExcelFile">
+ <complexType>
+ <attribute name="file" 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.framework.skynet.core/schema/OseeValidator.exsd b/org.eclipse.osee.framework.skynet.core/schema/OseeValidator.exsd
new file mode 100644
index 00000000000..e7fa5c2004a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/OseeValidator.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="OseeValidator" name="OseeValidator"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="OseeValidator"/>
+ </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="OseeValidator">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+ Class contributing the validation implementation
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.skynet.core.validation.IOseeValidator"/>
+ </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.framework.skynet.core/schema/WebPage.exsd b/org.eclipse.osee.framework.skynet.core/schema/WebPage.exsd
new file mode 100644
index 00000000000..ea3a5c0734b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/schema/WebPage.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="WebPage" name="WebPage"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="WebPageFolder"/>
+ </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="WebPageFolder">
+ <complexType>
+ <attribute name="Path" 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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/BootStrapUser.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/BootStrapUser.java
new file mode 100644
index 00000000000..51a2c42dc6b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/BootStrapUser.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.framework.skynet.core;
+
+import org.eclipse.osee.framework.core.data.SystemUser;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BootStrapUser extends User {
+
+ public static BootStrapUser instance;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param tagId
+ */
+ private BootStrapUser() {
+ super(null, null, null, null, null);
+ }
+
+ /**
+ * @return the instance
+ */
+ public static BootStrapUser getInstance() {
+ if (instance == null) instance = new BootStrapUser();
+ return instance;
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#getEmail()
+ */
+ @Override
+ public String getEmail() {
+ return SystemUser.BootStrap.getEmail();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#getName()
+ */
+ @Override
+ public String getName() {
+ return SystemUser.BootStrap.getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#getPhone()
+ */
+ @Override
+ public String getPhone() {
+ return "phone home";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#getUserId()
+ */
+ @Override
+ public String getUserId() {
+ return SystemUser.BootStrap.getUserID();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#isActive()
+ */
+ @Override
+ public Boolean isActive() {
+ return SystemUser.BootStrap.isActive();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#setActive(boolean)
+ */
+ @Override
+ public void setActive(boolean required) {
+ throw new UnsupportedOperationException();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#setEmail(java.lang.String)
+ */
+ @Override
+ public void setEmail(String email) {
+ throw new UnsupportedOperationException();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.User#setPhone(java.lang.String)
+ */
+ @Override
+ public void setPhone(String phone) {
+ throw new UnsupportedOperationException();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ClientUser.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ClientUser.java
new file mode 100644
index 00000000000..46c78ab4e0e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ClientUser.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.framework.skynet.core;
+
+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.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.UserNotInDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.event.AccessControlEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class ClientUser {
+ private static final ClientUser instance = new ClientUser();
+
+ private User currentUser;
+ private boolean isGuestNotificationAllowed;
+ private boolean isGuestAuthenticationAllowed;
+
+ private ClientUser() {
+ this.currentUser = null;
+ this.isGuestAuthenticationAllowed = true;
+ this.isGuestNotificationAllowed = true;
+ }
+
+ static synchronized User getMainUser() throws OseeCoreException {
+ if (!ClientSessionManager.isSessionValid() || instance.currentUser == null) {
+ instance.populateCurrentUser();
+ if (!instance.currentUser.isActive()) {
+ instance.currentUser.setActive(true);
+ instance.currentUser.persistAttributes();
+ }
+ }
+ return instance.currentUser;
+ }
+
+ private void populateCurrentUser() throws OseeCoreException {
+ ClientSessionManager.ensureSessionCreated();
+ if (ClientSessionManager.isSessionValid()) {
+ String userId = ClientSessionManager.getSession().getUserId();
+ try {
+ if (userId.equals(SystemUser.BootStrap.getUserID())) {
+ setCurrentUser(BootStrapUser.getInstance());
+ } else {
+ if (ClientSessionManager.isUserCreationRequired()) {
+ SkynetTransaction transaction = new SkynetTransaction(BranchManager.getCommonBranch());
+ UserManager.createMainUser(ClientSessionManager.getCurrentUserInfo(), transaction);
+ setCurrentUser(UserManager.getUserByUserId(ClientSessionManager.getCurrentUserInfo().getUserID()));
+ transaction.execute();
+ ClientSessionManager.clearUserCreationRequired();
+ } else {
+ setCurrentUser(UserManager.getUserByUserId(ClientSessionManager.getCurrentUserInfo().getUserID()));
+ }
+ }
+ } catch (UserNotInDatabase ex) {
+ executeGuestLogin();
+ }
+ } else {
+ executeGuestLogin();
+ }
+ }
+
+ private void setCurrentUser(User newUser) throws OseeStateException {
+ this.currentUser = newUser;
+
+ if (newUser == null) {
+ throw new OseeStateException("Setting current user to null.");
+ } else {
+ if (isGuestNotificationAllowed && newUser.getName().equals(SystemUser.Guest.getName())) {
+ isGuestNotificationAllowed = false;
+ OseeLog.log(Activator.class, Level.INFO,
+ "You are logged into OSEE as \"Guest\". If this is unexpected notify your OSEE admin");
+ }
+ }
+ if (ClientSessionManager.isSessionValid()) {
+ notifyListeners();
+ }
+ }
+
+ private void executeGuestLogin() throws OseeCoreException {
+ if (isGuestAuthenticationAllowed) {
+ ClientSessionManager.authenticateAsGuest();
+ setCurrentUser(UserManager.getUser(SystemUser.Guest));
+ isGuestAuthenticationAllowed = false;
+ }
+ }
+
+ private void notifyListeners() {
+ Jobs.runInJob("Osee User Authenticated", new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ OseeEventManager.kickAccessControlArtifactsEvent(this, AccessControlEventType.UserAuthenticated,
+ LoadedArtifacts.EmptyLoadedArtifacts());
+ return Status.OK_STATUS;
+ }
+
+ }, CoreClientActivator.class, CoreClientActivator.PLUGIN_ID);
+
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ISkynetType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ISkynetType.java
new file mode 100644
index 00000000000..96525485325
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/ISkynetType.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.framework.skynet.core;
+
+public interface ISkynetType {
+ String getName();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/OseeGroup.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/OseeGroup.java
new file mode 100644
index 00000000000..faef487a6d7
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/OseeGroup.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.framework.skynet.core;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeGroup {
+ private static final String GROUP_ARTIFACT_TYPE = "User Group";
+ private static final String FOLDER_ARTIFACT_TYPE = "Folder";
+ private static final String USERS_GROUP_FOLDER_NAME = "User Groups";
+
+ private final String groupName;
+ private Artifact groupArtifact;
+
+ public OseeGroup(String groupName) {
+ this.groupName = groupName;
+ this.groupArtifact = null;
+ this.groupArtifact = null;
+ }
+
+ /**
+ * @return Returns the group.
+ * @throws OseeCoreException
+ */
+ public Artifact getGroupArtifact() throws OseeCoreException {
+ checkGroupExists();
+ return groupArtifact;
+ }
+
+ /**
+ * This does not persist the newly created relation that is the callers responsibility.
+ *
+ * @param user
+ */
+ public void addMember(User user) throws OseeCoreException {
+ getGroupArtifact().addRelation(CoreRelationEnumeration.Users_User, user);
+ }
+
+ /**
+ * Determines whether the user is a member of this group
+ *
+ * @param user to check
+ * @return whether the user is a member of this group
+ * @throws OseeCoreException
+ */
+ public boolean isMember(User user) throws OseeCoreException {
+ return getGroupArtifact().isRelated(CoreRelationEnumeration.Users_User, user);
+ }
+
+ /**
+ * Determines whether the current user is a member of this group
+ *
+ * @return whether the current user is a member of this group
+ * @throws OseeCoreException
+ */
+ public boolean isCurrentUserMember() throws OseeCoreException {
+ return isMember(UserManager.getUser());
+ }
+
+ private void checkGroupExists() throws OseeCoreException {
+ if (groupArtifact == null) {
+ groupArtifact = getOrCreateGroupArtifact(groupName);
+ }
+ }
+
+ private Artifact getOrCreateGroupArtifact(String groupName) throws OseeCoreException {
+ Branch branch = BranchManager.getCommonBranch();
+ String cacheKey = GROUP_ARTIFACT_TYPE + "." + groupName;
+ Artifact groupArtifact = ArtifactCache.getByTextId(cacheKey, branch);
+
+ if (groupArtifact == null) {
+ groupArtifact = ArtifactQuery.checkArtifactFromTypeAndName(GROUP_ARTIFACT_TYPE, groupName, branch);
+ if (groupArtifact == null) {
+ Artifact userGroupsFolder = getOrCreateUserGroupsFolder(branch);
+ groupArtifact = ArtifactTypeManager.addArtifact(GROUP_ARTIFACT_TYPE, branch, groupName);
+ userGroupsFolder.addChild(groupArtifact);
+ }
+ ArtifactCache.putByTextId(cacheKey, groupArtifact);
+ }
+
+ return groupArtifact;
+ }
+
+ private Artifact getOrCreateUserGroupsFolder(Branch branch) throws OseeCoreException {
+ String cacheKey = FOLDER_ARTIFACT_TYPE + "." + USERS_GROUP_FOLDER_NAME;
+ Artifact usersGroupFolder = ArtifactCache.getByTextId(cacheKey, branch);
+ if (usersGroupFolder == null) {
+ usersGroupFolder =
+ ArtifactQuery.checkArtifactFromTypeAndName(FOLDER_ARTIFACT_TYPE, USERS_GROUP_FOLDER_NAME, branch);
+ if (usersGroupFolder == null) {
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(branch);
+ if (root.hasChild(USERS_GROUP_FOLDER_NAME)) {
+ usersGroupFolder = root.getChild(USERS_GROUP_FOLDER_NAME);
+ } else {
+ usersGroupFolder =
+ ArtifactTypeManager.addArtifact(FOLDER_ARTIFACT_TYPE, branch, USERS_GROUP_FOLDER_NAME);
+ root.addChild(usersGroupFolder);
+ }
+ }
+
+ ArtifactCache.putByTextId(cacheKey, usersGroupFolder);
+ }
+ return usersGroupFolder;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/SystemGroup.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/SystemGroup.java
new file mode 100644
index 00000000000..df38c27eb24
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/SystemGroup.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.skynet.core;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum SystemGroup {
+
+ Everyone, OseeAdmin;
+
+ private final OseeGroup group;
+
+ SystemGroup() {
+ this.group = new OseeGroup(this.name());
+ }
+
+ public Artifact getArtifact() throws OseeCoreException {
+ return group.getGroupArtifact();
+ }
+
+ public void addMember(User user) throws OseeCoreException {
+ this.group.addMember(user);
+ }
+
+ public boolean isMember(User user) throws OseeCoreException {
+ return this.group.isMember(user);
+ }
+
+ public boolean isCurrentUserMember() throws OseeCoreException {
+ return this.group.isCurrentUserMember();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/User.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/User.java
new file mode 100644
index 00000000000..b9f4d79e033
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/User.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.framework.skynet.core;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStoreWriter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class User extends Artifact implements Serializable {
+ private static final long serialVersionUID = 834749078806388387L;
+ public static final String userIdAttributeName = "User Id";
+ public static final String favoriteBranchAttributeName = "Favorite Branch";
+ public static enum Attributes {
+ Phone, Email, Active, Policy
+ };
+
+ public static final String ARTIFACT_NAME = "User";
+
+ private PropertyStore userSettings;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.Artifact#onBirth()
+ */
+ @Override
+ public void onBirth() throws OseeCoreException {
+ super.onBirth();
+ SystemGroup.Everyone.addMember(this);
+ }
+
+ public User(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public void setFieldsBasedon(User u) throws Exception {
+ setDescriptiveName(u.getName());
+ setPhone(u.getPhone());
+ setEmail(u.getEmail());
+ setUserID(u.getUserId());
+ setActive(u.isActive());
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return String.format("%s (%s)", getName(), getUserId());
+ } catch (Exception ex) {
+ return "Exception: " + ex.getLocalizedMessage();
+ }
+ }
+
+ public boolean isMe() {
+ try {
+ return (getUserId().equals(UserManager.getUser().getUserId()));
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ public String getUserId() throws OseeCoreException {
+ return getSoleAttributeValue(userIdAttributeName, "");
+ }
+
+ public void setUserID(String userId) throws OseeCoreException {
+ setSoleAttributeValue(userIdAttributeName, userId);
+ }
+
+ public String getEmail() throws OseeCoreException {
+ return getSoleAttributeValue(Attributes.Email.toString(), "");
+ }
+
+ public void setEmail(String email) throws OseeCoreException {
+ setSoleAttributeValue(Attributes.Email.toString(), email);
+ }
+
+ public String getName() {
+ return getDescriptiveName();
+ }
+
+ public String getPhone() throws OseeCoreException {
+ return getSoleAttributeValue(Attributes.Phone.toString(), "");
+ }
+
+ public void setPhone(String phone) throws OseeCoreException {
+ setSoleAttributeValue(Attributes.Phone.toString(), phone);
+ }
+
+ public Boolean isActive() throws OseeCoreException {
+ return getSoleAttributeValue(Attributes.Active.toString());
+ }
+
+ public void setActive(boolean active) throws OseeCoreException {
+ setSoleAttributeValue(Attributes.Active.toString(), active);
+ }
+
+ /**
+ * @param favoriteBranch
+ * @throws OseeCoreException
+ */
+ public void toggleFavoriteBranch(Branch favoriteBranch) throws OseeCoreException {
+ Collection<Branch> branches = BranchManager.getNormalBranches();
+ HashSet<Integer> branchIds = new HashSet<Integer>();
+ for (Branch branch : branches)
+ branchIds.add(branch.getBranchId());
+
+ boolean found = false;
+ Collection<Attribute<Integer>> attributes = getAttributes(favoriteBranchAttributeName);
+ for (Attribute<Integer> attribute : attributes) {
+ // Remove attributes that are no longer valid
+ if (!branchIds.contains(attribute.getValue())) {
+ attribute.delete();
+ } else if (favoriteBranch.getBranchId() == attribute.getValue()) {
+ attribute.delete();
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ addAttribute(favoriteBranchAttributeName, favoriteBranch.getBranchId());
+ }
+ }
+
+ public boolean isFavoriteBranch(Branch branch) throws OseeCoreException {
+ Collection<Attribute<Integer>> attributes = getAttributes(favoriteBranchAttributeName);
+ for (Attribute<Integer> attribute : attributes) {
+ if (branch.getBranchId() == attribute.getValue()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public String getSetting(String key) throws OseeCoreException {
+ ensureUserSettingsAreLoaded();
+ return userSettings.get(key);
+ }
+
+ public void setSetting(String key, String value) throws OseeCoreException {
+ ensureUserSettingsAreLoaded();
+ userSettings.put(key, value);
+
+ }
+
+ public void saveSettings() throws OseeCoreException, IOException {
+ if (userSettings != null) {
+ StringWriter stringWriter = new StringWriter();
+ PropertyStoreWriter storeWriter = new PropertyStoreWriter();
+ storeWriter.save(userSettings, stringWriter);
+ setSoleAttributeFromString("User Settings", stringWriter.toString());
+ persistAttributes();
+ }
+ }
+
+ private void ensureUserSettingsAreLoaded() throws OseeWrappedException {
+ if (userSettings == null) {
+ try {
+ String settings = getSoleAttributeValue("User Settings", null);
+ if (settings == null) {
+ userSettings = new PropertyStore(getGuid());
+ } else {
+ userSettings = new PropertyStore(new StringReader(settings));
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+
+ public boolean isSystemUser() throws OseeCoreException {
+ if (this.equals(UserManager.getUser(SystemUser.OseeSystem)) || this.equals(UserManager.getUser(SystemUser.UnAssigned)) || this.equals(UserManager.getUser(SystemUser.Guest))) {
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/UserManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/UserManager.java
new file mode 100644
index 00000000000..34636123750
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/UserManager.java
@@ -0,0 +1,324 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.IOseeUser;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.UserInDatabaseMultipleTimes;
+import org.eclipse.osee.framework.db.connection.exception.UserNotInDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UserManager implements IFrameworkTransactionEventListener, ITransactionsDeletedEventListener, IArtifactsPurgedEventListener {
+ public static enum UserStatusEnum {
+ Active, InActive, Both
+ }
+
+ private static final UserManager instance = new UserManager();
+ private final Map<String, User> userIdToUserCache = Collections.synchronizedMap(new HashMap<String, User>());
+ private boolean userCacheIsLoaded = false;
+ private boolean duringMainUserCreation = false;
+
+ private UserManager() {
+ }
+
+ /**
+ * Returns the currently authenticated user
+ *
+ * @return User
+ * @throws OseeCoreException
+ */
+ public static User getUser() throws OseeCoreException {
+ if (instance.duringMainUserCreation) {
+ return BootStrapUser.getInstance();
+ }
+ return ClientUser.getMainUser();
+ }
+
+ /**
+ * @return shallow copy of ArrayList of all active users in the datastore sorted by user name
+ */
+ public static ArrayList<User> getUsers() throws OseeCoreException {
+ return getUsers(UserStatusEnum.Active);
+ }
+
+ public static ArrayList<User> getUsersSortedByName() throws OseeCoreException {
+ ArrayList<User> users = getUsers();
+ Collections.sort(users);
+ return users;
+ }
+
+ public static ArrayList<User> getUsers(UserStatusEnum userStatus) throws OseeCoreException {
+ instance.ensurePopulated();
+ if (userStatus == UserStatusEnum.Both) {
+ return new ArrayList<User>(instance.userIdToUserCache.values());
+ }
+
+ ArrayList<User> users = new ArrayList<User>(instance.userIdToUserCache.size());
+ for (User user : instance.userIdToUserCache.values()) {
+ if (userStatus == UserStatusEnum.Active && user.isActive()) {
+ users.add(user);
+ } else if (userStatus == UserStatusEnum.InActive && !user.isActive()) {
+ users.add(user);
+ }
+ }
+ return users;
+ }
+
+ /**
+ * Return sorted list of active User.getName() in database
+ *
+ * @return String[]
+ */
+ public static String[] getUserNames() throws OseeCoreException {
+ instance.ensurePopulated();
+ String[] userNames = new String[instance.userIdToUserCache.size()];
+ int index = 0;
+ for (User user : instance.userIdToUserCache.values()) {
+ userNames[index++] = user.getDescriptiveName();
+ }
+ return userNames;
+ }
+
+ public static String getUserNameById(int userArtifactId) {
+ String name;
+ try {
+ User user = null;
+ if (userArtifactId == 0) {
+ user = UserManager.getUser(SystemUser.OseeSystem);
+ userArtifactId = user.getArtId();
+ } else {
+ user = UserManager.getUserByArtId(userArtifactId);
+ }
+ name = user.getDescriptiveName();
+ } catch (Exception ex) {
+ name = "Could not resolve artId: " + userArtifactId;
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return name;
+ }
+
+ public static User getUserByArtId(int userArtifactId) throws OseeCoreException {
+ instance.ensurePopulated();
+ User user = (User) ArtifactCache.getActive(userArtifactId, BranchManager.getCommonBranch());
+ if (user == null) {
+ throw new UserNotInDatabase("User requested by artId \"" + userArtifactId + "\" was not found.");
+ }
+ return user;
+ }
+
+ public static boolean userExistsWithName(String name) throws OseeCoreException {
+ instance.ensurePopulated();
+ for (User tempUser : instance.userIdToUserCache.values()) {
+ if (tempUser.getDescriptiveName().equals(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * This is not the preferred way to get a user. Most likely getUserByUserId() or getUserByArtId() should be used
+ *
+ * @param name
+ * @return the first user found with the given name
+ * @throws OseeCoreException
+ */
+ public static User getUserByName(String name) throws OseeCoreException {
+ instance.ensurePopulated();
+ User user = null;
+ for (User tempUser : instance.userIdToUserCache.values()) {
+ if (tempUser.getDescriptiveName().equals(name)) {
+ user = tempUser;
+ return user;
+ }
+ }
+ throw new UserNotInDatabase("User requested by name \"" + name + "\" was not found.");
+ }
+
+ public static User getUserByUserId(String userId) throws OseeCoreException {
+ if (userId == null || userId.equals("")) {
+ throw new OseeArgumentException("UserId can't be null or \"\"");
+ }
+
+ instance.ensurePopulated();
+ User user = instance.userIdToUserCache.get(userId);
+ if (user == null) {
+ try {
+ user = (User) ArtifactQuery.getArtifactFromAttribute("User Id", userId, BranchManager.getCommonBranch());
+ } catch (ArtifactDoesNotExist ex) {
+ throw new UserNotInDatabase("the user with id " + userId + " was not found.");
+ }
+ }
+ return user;
+ }
+
+ public static User getUser(IOseeUser userEnum) throws OseeCoreException {
+ return getUserByUserId(userEnum.getUserID());
+ }
+
+ private synchronized void ensurePopulated() throws OseeCoreException {
+ if (!userCacheIsLoaded) {
+ Collection<User> dbUsers =
+ org.eclipse.osee.framework.jdk.core.util.Collections.castAll(ArtifactQuery.getArtifactsFromType(
+ User.ARTIFACT_NAME, BranchManager.getCommonBranch()));
+ for (User user : dbUsers) {
+ User previousUser = userIdToUserCache.put(user.getUserId(), user);
+ if (previousUser != null) { // if duplicate user id found
+ OseeCoreException ex =
+ new UserInDatabaseMultipleTimes(
+ "User of userId \"" + user.getUserId() + "\" in datastore more than once");
+
+ // exception if I am the duplicate user otherwise just log
+ if (user.getUserId().equals(ClientSessionManager.getSession().getId())) {
+ throw ex;
+ } else {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ userCacheIsLoaded = true;
+ }
+ }
+
+ /**
+ * @return whether the Authentication manager is in the middle of creating a user
+ */
+ public static boolean duringMainUserCreation() {
+ return instance.duringMainUserCreation;
+ }
+
+ public static synchronized User createMainUser(IOseeUser userEnum, SkynetTransaction transaction) throws OseeCoreException {
+ instance.duringMainUserCreation = true;
+ User user = createUser(userEnum, transaction);
+ instance.duringMainUserCreation = false;
+ return user;
+ }
+
+ public static synchronized User createUser(IOseeUser userEnum, SkynetTransaction transaction) throws OseeCoreException {
+ instance.ensurePopulated();
+ // Determine if user with id has already been created; boot strap issue with dbInit
+ User user = instance.userIdToUserCache.get(userEnum.getUserID());
+ if (user != null) {
+ // Update user with this enum data
+ user.setDescriptiveName(userEnum.getName());
+ user.setEmail(userEnum.getEmail());
+ user.setActive(userEnum.isActive());
+ } else {
+ user =
+ (User) ArtifactTypeManager.addArtifact(User.ARTIFACT_NAME, BranchManager.getCommonBranch(),
+ userEnum.getName());
+ user.setActive(userEnum.isActive());
+ user.setUserID(userEnum.getUserID());
+ user.setEmail(userEnum.getEmail());
+ instance.userIdToUserCache.put(user.getUserId(), user);
+
+ // this is here in case a user is created at an unexpected time
+ if (!SkynetDbInit.isDbInit()) {
+ OseeLog.log(Activator.class, Level.INFO, "Created user " + user, new Exception(
+ "just wanted the stack trace"));
+ }
+ }
+
+ user.persistAttributesAndRelations(transaction);
+ return user;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.branchId != BranchManager.getCommonBranch().getBranchId()) return;
+ ArtifactType userType = ArtifactTypeManager.getType(User.ARTIFACT_NAME);
+
+ Collection<Integer> deletedUserArtifactIds =
+ transData.getArtifactIdsOfArtifactType(userType, ArtifactModType.Deleted);
+ ArrayList<User> usersToRemove = new ArrayList<User>();
+ for (User tempUser : userIdToUserCache.values()) {
+ if (deletedUserArtifactIds.contains(tempUser.getArtId())) {
+ usersToRemove.add(tempUser);
+ }
+ }
+ for (User user : usersToRemove) {
+ userIdToUserCache.remove(user.getUserId());
+ }
+
+ Collection<Integer> newUserArtifactIds = transData.getArtifactIdsOfArtifactType(userType, ArtifactModType.Added);
+ Collection<User> newUsers =
+ org.eclipse.osee.framework.jdk.core.util.Collections.castAll(ArtifactQuery.getArtifactsFromIds(
+ newUserArtifactIds, BranchManager.getCommonBranch(), false));
+ for (User newUser : newUsers) {
+ userIdToUserCache.put(newUser.getUserId(), newUser);
+ }
+
+ Collection<Integer> modUserArtifacts = transData.getArtifactIdsOfArtifactType(userType, ArtifactModType.Changed);
+
+ Collection<User> modUsers =
+ org.eclipse.osee.framework.jdk.core.util.Collections.castAll(ArtifactQuery.getArtifactsFromIds(
+ modUserArtifacts, BranchManager.getCommonBranch(), false));
+ for (User modUser : modUsers) {
+ User previousUser = (User) ArtifactCache.getActive(modUser.getArtId(), BranchManager.getCommonBranch());
+ if (previousUser != null) {
+ userIdToUserCache.remove(previousUser);
+ }
+ userIdToUserCache.put(modUser.getUserId(), modUser);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener#handleTransactionsDeletedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, int[])
+ */
+ @Override
+ public void handleTransactionsDeletedEvent(Sender sender, int[] transactionIds) {
+ // TODO Need to handle this case when event sends more data about the contents of the deleted transactions
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ for (Artifact artifact : loadedArtifacts.getLoadedArtifacts()) {
+ if (artifact instanceof User) {
+ userIdToUserCache.remove(((User) artifact).getUserId());
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlData.java
new file mode 100644
index 00000000000..c074bdce6ee
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlData.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.framework.skynet.core.access;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * A data object in an access control list. Contains a subject (user artifact) and object (what the subject is trying to
+ * access) and a permission level
+ *
+ * @author Jeff C. Phillips
+ */
+public class AccessControlData implements Comparable<AccessControlData> {
+
+ private static final AccessControlManager accessManager = AccessControlManager.getInstance();
+ private boolean dirty = false;
+ private boolean birth = false;
+ private Artifact subject;
+ private AccessObject object;
+ private PermissionEnum permission;
+ private PermissionEnum branchPermission = null;
+ private PermissionEnum artifactTypePermission = null;
+ private PermissionEnum artifactPermission = null;
+
+ public AccessControlData(Artifact subject, AccessObject object, PermissionEnum permission, boolean birth) {
+ this(subject, object, permission, birth, true);
+ }
+
+ public AccessControlData(Artifact subject, AccessObject object, PermissionEnum permission, boolean birth, boolean dirty) {
+ super();
+ this.subject = subject;
+ this.permission = permission;
+ this.dirty = dirty;
+ this.birth = birth;
+ this.object = object;
+ }
+
+ /**
+ * @return Returns the user.
+ */
+ public Artifact getSubject() {
+ return subject;
+ }
+
+ /**
+ * @param permission The permissionLevel to set.
+ */
+ public void setPermission(PermissionEnum permission) {
+
+ if (this.permission == permission) return;
+
+ this.permission = permission;
+ dirty = true;
+ }
+
+ public PermissionEnum getBranchPermission() {
+ return branchPermission;
+ }
+
+ public PermissionEnum getArtifactPermission() {
+ return artifactPermission;
+ }
+
+ public PermissionEnum getArtifactTypePermission() {
+ return artifactTypePermission;
+ }
+
+ /**
+ * @return PermissionEnum
+ */
+ public PermissionEnum getPermission() {
+ return permission;
+ }
+
+ /**
+ * @return Returns the dirty.
+ */
+ public boolean isDirty() {
+ return dirty;
+ }
+
+ public void setNotDirty() {
+ this.dirty = false;
+ }
+
+ /**
+ * @return Returns the object.
+ */
+ public AccessObject getObject() {
+ return object;
+ }
+
+ /**
+ * @return Returns the birth.
+ */
+ public boolean isBirth() {
+ return birth;
+ }
+
+ public void persist() {
+ accessManager.persistPermission(this, false);
+ }
+
+ public void persist(boolean recurse) {
+ accessManager.persistPermission(this, recurse);
+ }
+
+ public int compareTo(AccessControlData data) {
+ return subject.getDescriptiveName().compareTo(data.subject.getDescriptiveName());
+ }
+
+ /**
+ * @param branchPermission the branchPermission to set
+ */
+ public void setBranchPermission(PermissionEnum branchPermission) {
+ this.branchPermission = branchPermission;
+ }
+
+ /**
+ * @param artifactTypePermission the artifactTypePermission to set
+ */
+ public void setArtifactTypePermission(PermissionEnum artifactTypePermission) {
+ this.artifactTypePermission = artifactTypePermission;
+ }
+
+ /**
+ * @param artifactPermission the artifactPermission to set
+ */
+ public void setArtifactPermission(PermissionEnum artifactPermission) {
+ this.artifactPermission = artifactPermission;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlManager.java
new file mode 100644
index 00000000000..f751a584ce4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessControlManager.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.framework.skynet.core.access;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.DoubleKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.SystemGroup;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.event.AccessControlEventType;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * Provides access control for OSEE.
+ *
+ * @author Jeff C. Phillips
+ */
+
+public class AccessControlManager implements IBranchEventListener, IArtifactsPurgedEventListener {
+ private static final String INSERT_INTO_ARTIFACT_ACL =
+ "INSERT INTO " + SkynetDatabase.ARTIFACT_TABLE_ACL + " (art_id, permission_id, privilege_entity_id, branch_id) VALUES (?, ?, ?, ?)";
+ private static final String INSERT_INTO_BRANCH_ACL =
+ "INSERT INTO " + SkynetDatabase.BRANCH_TABLE_ACL + " (permission_id, privilege_entity_id, branch_id) VALUES (?, ?, ?)";
+ private static final String UPDATE_ARTIFACT_ACL =
+ "UPDATE " + SkynetDatabase.ARTIFACT_TABLE_ACL + " SET permission_id = ? WHERE privilege_entity_id =? AND art_id = ? AND branch_id = ?";
+ private static final String UPDATE_BRANCH_ACL =
+ "UPDATE " + SkynetDatabase.BRANCH_TABLE_ACL + " SET permission_id = ? WHERE privilege_entity_id =? AND branch_id = ?";
+ private static final String GET_ALL_ARTIFACT_ACCESS_CONTROL_LIST =
+ "SELECT aac1.*, art1.art_type_id FROM osee_artifact art1, osee_artifact_acl aac1 WHERE art1.art_id = aac1.privilege_entity_id";
+
+ private static final String GET_ALL_BRANCH_ACCESS_CONTROL_LIST =
+ "SELECT bac1.*, art1.art_type_id FROM osee_artifact art1, osee_branch_acl bac1 WHERE art1.art_id = bac1.privilege_entity_id";
+ private static final String DELETE_ARTIFACT_ACL =
+ "DELETE FROM " + SkynetDatabase.ARTIFACT_TABLE_ACL + " WHERE privilege_entity_id = ? AND art_id =? AND branch_id =?";
+ private static final String DELETE_BRANCH_ACL =
+ "DELETE FROM " + SkynetDatabase.BRANCH_TABLE_ACL + " WHERE privilege_entity_id = ? AND branch_id =?";
+ private static final String DELETE_ARTIFACT_ACL_FROM_BRANCH =
+ "DELETE FROM " + SkynetDatabase.ARTIFACT_TABLE_ACL + " WHERE branch_id =?";
+ private static final String DELETE_BRANCH_ACL_FROM_BRANCH =
+ "DELETE FROM " + SkynetDatabase.BRANCH_TABLE_ACL + " WHERE branch_id =?";
+ private static final String USER_GROUP_MEMBERS =
+ "SELECT b_art_id FROM osee_relation_link WHERE a_art_id =? AND rel_link_type_id =? ORDER BY b_art_id";
+
+ public static enum ObjectTypeEnum {
+ ALL, BRANCH, REL_TYPE, ART_TYPE, ATTR_TYPE, ART;
+ }
+
+ private final DoubleKeyHashMap<Integer, Object, PermissionEnum> accessControlListCache;
+ // <objectId, branchId>
+ private final DoubleKeyHashMap<Integer, Integer, AccessObject> accessObjectCache;
+ private final Map<Integer, BranchAccessObject> branchAccessObjectCache;
+ private final HashCollection<AccessObject, Integer> objectToSubjectCache;
+ // <subjectId, groupId>
+ private final HashCollection<Integer, Integer> subjectToGroupCache;
+ // <groupId, subjectId>
+ private final HashCollection<Integer, Integer> groupToSubjectsCache;
+ // <artId, branchId>
+ private final Map<Integer, Integer> objectToBranchLockCache;
+ // object, subject
+ private final Map<Integer, Integer> lockedObjectToSubject;
+ // subject, permission
+ private final HashCollection<Integer, PermissionEnum> subjectToPermissionCache;
+
+ private static final AccessControlManager instance = new AccessControlManager();
+
+ public static AccessControlManager getInstance() {
+ return instance;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.PersistenceManager#onManagerWebInit()
+ */
+ public void onManagerWebInit() throws Exception {
+
+ // This can result in a call to SkynetAuthentication, so it must be here (instead of in the
+ // constructor) to stop a cycle from occurring.
+
+ }
+
+ private AccessControlManager() {
+ this.accessControlListCache = new DoubleKeyHashMap<Integer, Object, PermissionEnum>();
+ this.accessObjectCache = new DoubleKeyHashMap<Integer, Integer, AccessObject>();
+ this.objectToSubjectCache = new HashCollection<AccessObject, Integer>();
+ this.branchAccessObjectCache = new HashMap<Integer, BranchAccessObject>();
+ this.subjectToGroupCache = new HashCollection<Integer, Integer>();
+ this.groupToSubjectsCache = new HashCollection<Integer, Integer>();
+ this.objectToBranchLockCache = new HashMap<Integer, Integer>();
+ this.lockedObjectToSubject = new HashMap<Integer, Integer>();
+ this.subjectToPermissionCache = new HashCollection<Integer, PermissionEnum>();
+
+ try {
+ populateAccessControlLists();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+
+ OseeEventManager.addListener(this);
+ }
+
+ /**
+ * populates all of the access control lists.
+ *
+ * @throws OseeCoreException
+ */
+ private void populateAccessControlLists() throws OseeCoreException {
+ populateArtifactAccessControlList();
+ populateBranchAccessControlList();
+ // populateSubjectsAccessControlList();
+ }
+
+ // TODO:: Enable Subject Based Control
+ // /**
+ // * populates subjects access control list
+ // */
+ // private void populateSubjectsAccessControlList() {
+ // ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ // // select * from table order by subject_id
+ // // subject_id, permission_id
+ // try {
+ // while (chStmt.next()) {
+ // subjectToPermissionCache.put(chStmt.getRset().getInt("subject_id"),
+ // PermissionEnum.getPermission(chStmt.getRset().getInt("permission_id")));
+ // }
+ // }
+ // catch (SQLException ex) {
+ // OseeLog.log(Activator.class, Level.SEVERE, ex);
+ // }
+ // finally {
+ // chStmt.close();
+ // }
+ // }
+
+ /**
+ * populates the branch access control list.
+ */
+ private void populateBranchAccessControlList() throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ALL_BRANCH_ACCESS_CONTROL_LIST);
+ while (chStmt.next()) {
+ Integer subjectId = chStmt.getInt("privilege_entity_id");
+ Integer branchId = chStmt.getInt("branch_id");
+ int subjectArtifactTypeId = chStmt.getInt("art_type_id");
+ PermissionEnum permission = PermissionEnum.getPermission(chStmt.getInt("permission_id"));
+ BranchAccessObject branchAccessObject = getBranchAccessObject(branchId);
+
+ accessControlListCache.put(subjectId, branchAccessObject, permission);
+ objectToSubjectCache.put(branchAccessObject, subjectId);
+
+ if (ArtifactTypeManager.getType(subjectArtifactTypeId).isTypeCompatible("User Group")) {
+ populateGroupMembers(subjectId);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /**
+ * popualtes the artifact access control list cache
+ *
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ private void populateArtifactAccessControlList() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ALL_ARTIFACT_ACCESS_CONTROL_LIST);
+
+ while (chStmt.next()) {
+ Integer subjectId = chStmt.getInt("privilege_entity_id");
+ Integer objectId = chStmt.getInt("art_id");
+ Integer branchId = chStmt.getInt("branch_id");
+ int subjectArtifactTypeId = chStmt.getInt("art_type_id");
+ PermissionEnum permission = PermissionEnum.getPermission(chStmt.getInt("permission_id"));
+
+ if (permission.equals(PermissionEnum.LOCK)) {
+ objectToBranchLockCache.put(objectId, branchId);
+ lockedObjectToSubject.put(objectId, subjectId);
+ } else {
+ AccessObject accessObject = getArtifactAccessObject(objectId, branchId);
+ cacheAccessObject(objectId, subjectId, permission, accessObject);
+
+ if (ArtifactTypeManager.getType(subjectArtifactTypeId).isTypeCompatible("User Group")) {
+ populateGroupMembers(subjectId);
+ }
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void populateGroupMembers(Integer groupId) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ if (!groupToSubjectsCache.containsKey(groupId)) {
+ Integer groupMember;
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(USER_GROUP_MEMBERS, groupId,
+ RelationTypeManager.getType("Users").getRelationTypeId());
+
+ // get group members and populate subjectToGroupCache
+ while (chStmt.next()) {
+ groupMember = chStmt.getInt("b_art_id");
+ subjectToGroupCache.put(groupMember, groupId);
+ groupToSubjectsCache.put(groupId, groupMember);
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ /**
+ * Checks permission for the subject.
+ *
+ * @param permission
+ * @return true if the subject has permission.
+ * @throws OseeCoreException
+ */
+ public boolean checkSubjectPermission(PermissionEnum permission) throws OseeCoreException {
+ return checkObjectPermission(UserManager.getUser(), permission);
+ }
+
+ /**
+ * Checks permission for the subject.
+ *
+ * @param subject
+ * @param permission
+ * @return true if the subject has permission.
+ */
+ public boolean checkSubjectPermission(Artifact subject, PermissionEnum permission) {
+ boolean isValid = false;
+
+ if (subjectToPermissionCache.containsKey(subject.getArtId())) {
+ for (PermissionEnum subjectPermission : subjectToPermissionCache.getValues(subject.getArtId())) {
+ if (subjectPermission.getRank() >= permission.getRank()) {
+ isValid = true;
+ }
+ }
+ }
+ return isValid;
+ }
+
+ public boolean checkObjectListPermission(List<?> objectList, PermissionEnum permission) throws OseeCoreException {
+ boolean isValid = true;
+
+ if (objectList.isEmpty()) {
+ isValid = false;
+ }
+
+ for (Object object : objectList) {
+ isValid &= checkObjectPermission(object, permission);
+ }
+ return isValid;
+ }
+
+ /**
+ * Check permissions for the currently authenticated user.
+ *
+ * @param object
+ * @param permission
+ * @return true if the subject has permission for an object else false.
+ * @throws OseeCoreException
+ */
+ public static boolean checkObjectPermission(Object object, PermissionEnum permission) throws OseeCoreException {
+ return checkObjectPermission(UserManager.getUser(), object, permission);
+ }
+
+ public boolean checkCurrentUserObjectPermission(Object object, PermissionEnum permission) throws OseeCoreException {
+ return checkObjectPermission(object, permission);
+ }
+
+ public PermissionEnum getObjectPermission(Artifact subject, Object object) {
+ for (PermissionEnum permissionEnum : PermissionEnum.values()) {
+ boolean result = checkObjectPermission(subject, object, permissionEnum);
+ System.out.println("subject " + subject + " object " + object + " permission " + permissionEnum.name() + " -> " + result);
+ if (result) return permissionEnum;
+ }
+ return PermissionEnum.FULLACCESS;
+ }
+
+ /**
+ * @param subject
+ * @param object
+ * @param permission
+ * @return true if the subject has permission for an object else false.
+ */
+ public static boolean checkObjectPermission(Artifact subject, Object object, PermissionEnum permission) {
+ PermissionEnum userPermission = null;
+ PermissionEnum branchPermission = null;
+ Branch branch = null;
+
+ if (object instanceof Artifact) {
+ Artifact artifact = (Artifact) object;
+ branch = artifact.getBranch();
+ userPermission = instance.getArtifactPermission(subject, (Artifact) object, permission);
+ } else if (object instanceof Branch) {
+ branch = (Branch) object;
+ } else
+ throw new IllegalStateException("Unhandled object type for access control - " + object);
+
+ branchPermission = instance.getBranchPermission(subject, branch, permission);
+
+ if (branchPermission != null && (branchPermission.equals(PermissionEnum.DENY) || (userPermission == null && userPermission != PermissionEnum.LOCK))) {
+ userPermission = branchPermission;
+ }
+
+ if (permission == PermissionEnum.READ && userPermission == PermissionEnum.LOCK) {
+ return true;
+ }
+
+ if (userPermission == null || userPermission == PermissionEnum.LOCK) {
+ return false;
+ }
+ return userPermission.getRank() >= permission.getRank() && !userPermission.equals(PermissionEnum.DENY);
+ }
+
+ public PermissionEnum getBranchPermission(Artifact subject, Branch branch, PermissionEnum permission) {
+ PermissionEnum userPermission = null;
+ AccessObject accessObject = null;
+ accessObject = branchAccessObjectCache.get(branch.getBranchId());
+
+ if (accessObject == null) {
+ userPermission = PermissionEnum.FULLACCESS;
+ } else {
+ userPermission = acquirePermissionRank(subject, accessObject, permission);
+ }
+ return userPermission;
+ }
+
+ public PermissionEnum getArtifactPermission(Artifact subject, Artifact artifact, PermissionEnum permission) {
+ PermissionEnum userPermission = null;
+ AccessObject accessObject = null;
+
+ // The artifact is new and has not been persisted.
+ if (!artifact.isInDb()) return PermissionEnum.FULLACCESS;
+
+ Integer artId = artifact.getArtId();
+ Integer branchId = artifact.getBranch().getBranchId();
+ Integer lockedBranchId;
+
+ accessObject = accessObjectCache.get(artId, branchId);
+
+ if (objectToBranchLockCache.containsKey(artId)) {
+ lockedBranchId = objectToBranchLockCache.get(artId);
+
+ // this object is locked under a different branch
+ if (lockedBranchId.intValue() != branchId.intValue()) {
+ userPermission = PermissionEnum.LOCK;
+ }
+ }
+
+ if (userPermission == null && accessObject != null) {
+ userPermission = acquirePermissionRank(subject, accessObject, permission);
+ }
+ return userPermission;
+ }
+
+ /**
+ * @return The subjects permission on an accessObject.
+ */
+ private PermissionEnum acquirePermissionRank(Artifact subject, AccessObject accessObject, PermissionEnum permission) {
+ PermissionEnum userPermission = null;
+ int subjectId = subject.getArtId();
+
+ userPermission = accessControlListCache.get(subjectId, accessObject);
+
+ if (subjectToGroupCache.containsKey(subjectId)) {
+ for (int groupPermissionId : subjectToGroupCache.getValues(subjectId)) {
+ PermissionEnum groupPermission = accessControlListCache.get(groupPermissionId, accessObject);
+
+ if (groupPermission != null) {
+ if (userPermission == null) {
+ userPermission = groupPermission;
+ }
+
+ if (groupPermission.getRank() > userPermission.getRank()) {
+ userPermission = groupPermission;
+ }
+ }
+ }
+ }
+ return userPermission;
+ }
+
+ public void persistPermission(AccessControlData data) {
+ persistPermission(data, false);
+ }
+
+ /**
+ * Sets a permission on the object for the subject.
+ *
+ * @param subject
+ * @param object
+ * @param permission
+ */
+ public void setPermission(Artifact subject, Object object, PermissionEnum permission) {
+ AccessObject accessObject = getAccessObject(object);
+
+ boolean newAccessControlData = !accessControlListCache.containsKey(subject.getArtId(), accessObject);
+
+ if (newAccessControlData || permission != accessControlListCache.get(subject.getArtId(), accessObject)) {
+ AccessControlData data = new AccessControlData(subject, accessObject, permission, newAccessControlData);
+ data.persist();
+ }
+ }
+
+ /**
+ * persists an AccessControlData. This should be used internal to the AccessControl framework.
+ *
+ * @param data
+ */
+ protected void persistPermission(AccessControlData data, boolean recurse) {
+ Artifact subject = data.getSubject();
+ PermissionEnum permission = data.getPermission();
+
+ if (data.isDirty()) {
+ data.setNotDirty();
+
+ try {
+ if (data.getObject() instanceof ArtifactAccessObject) {
+ ArtifactAccessObject artifactAccessObject = (ArtifactAccessObject) data.getObject();
+
+ if (data.isBirth()) {
+ ConnectionHandler.runPreparedUpdate(INSERT_INTO_ARTIFACT_ACL, artifactAccessObject.getArtId(),
+ data.getPermission().getPermId(), data.getSubject().getArtId(),
+ artifactAccessObject.getBranchId());
+ } else {
+ ConnectionHandler.runPreparedUpdate(UPDATE_ARTIFACT_ACL, data.getPermission().getPermId(),
+ data.getSubject().getArtId(), artifactAccessObject.getArtId(),
+ artifactAccessObject.getBranchId());
+ }
+
+ if (recurse) {
+ Artifact artifact =
+ ArtifactQuery.getArtifactFromId(artifactAccessObject.getArtId(),
+ BranchManager.getBranch(artifactAccessObject.getBranchId()));
+ AccessControlData childAccessControlData = null;
+
+ for (Artifact child : artifact.getChildren()) {
+ AccessObject accessObject = getAccessObject(child);
+
+ if (objectToSubjectCache.containsKey(accessObject)) {
+ Collection<Integer> subjectIds = objectToSubjectCache.getValues(accessObject);
+
+ for (int subjectId : subjectIds) {
+ if (subjectId == subject.getArtId()) {
+ childAccessControlData = new AccessControlData(subject, accessObject, permission, false);
+ }
+ }
+ }
+
+ if (childAccessControlData == null) {
+ childAccessControlData = new AccessControlData(subject, accessObject, permission, true);
+ }
+ persistPermission(childAccessControlData, true);
+ }
+ }
+ } else if (data.getObject() instanceof BranchAccessObject) {
+ BranchAccessObject branchAccessObject = (BranchAccessObject) data.getObject();
+
+ if (data.isBirth()) {
+ ConnectionHandler.runPreparedUpdate(INSERT_INTO_BRANCH_ACL, data.getPermission().getPermId(),
+ data.getSubject().getArtId(), branchAccessObject.getBranchId());
+ } else {
+ ConnectionHandler.runPreparedUpdate(UPDATE_BRANCH_ACL, data.getPermission().getPermId(),
+ data.getSubject().getArtId(), branchAccessObject.getBranchId());
+ }
+ }
+ cacheAccessControlData(data);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private void cacheAccessControlData(AccessControlData data) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ AccessObject accessObject = data.getObject();
+ int subjectId = data.getSubject().getArtId();
+ PermissionEnum permission = data.getPermission();
+
+ if (!permission.equals(PermissionEnum.LOCK)) {
+ accessControlListCache.put(subjectId, accessObject, permission);
+ objectToSubjectCache.put(accessObject, subjectId);
+
+ populateGroupMembers(subjectId);
+ }
+ }
+
+ /**
+ * @param object
+ * @return collection of subjects and their permissions to access the object.
+ */
+ public List<AccessControlData> getAccessControlList(Object object) {
+ List<AccessControlData> datas = new LinkedList<AccessControlData>();
+ AccessObject accessObject = null;
+
+ try {
+ if (object instanceof Artifact) {
+ Artifact artifact = (Artifact) object;
+ accessObject = accessObjectCache.get(artifact.getArtId(), artifact.getBranch().getBranchId());
+ } else if (object instanceof Branch) {
+ Branch branch = (Branch) object;
+ accessObject = branchAccessObjectCache.get(branch.getBranchId());
+ }
+
+ if (accessObject == null) return datas;
+
+ datas = generateAccessControlList(accessObject);
+
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return datas;
+ }
+
+ private List<AccessControlData> generateAccessControlList(AccessObject accessObject) throws OseeCoreException {
+ List<AccessControlData> datas = new LinkedList<AccessControlData>();
+
+ Collection<Integer> subjects = objectToSubjectCache.getValues(accessObject);
+ if (subjects == null) {
+ return datas;
+ }
+
+ for (int subjectId : subjects) {
+ Artifact subject = ArtifactQuery.getArtifactFromId(subjectId, BranchManager.getCommonBranch());
+ PermissionEnum permissionEnum = accessControlListCache.get(subjectId, accessObject);
+ AccessControlData accessControlData =
+ new AccessControlData(subject, accessObject, permissionEnum, false, false);
+ if (accessObject instanceof ArtifactAccessObject) {
+ accessControlData.setArtifactPermission(permissionEnum);
+ accessControlData.setBranchPermission(getBranchPermission(subject, accessObject));
+ } else if (accessObject instanceof BranchAccessObject) {
+ accessControlData.setBranchPermission(getBranchPermission(subject, accessObject));
+ }
+ datas.add(accessControlData);
+ }
+
+ return datas;
+ }
+
+ private PermissionEnum getBranchPermission(Artifact subject, Object object) throws OseeCoreException {
+ Branch branch = null;
+ if (object instanceof BranchAccessObject) {
+ branch = BranchManager.getBranch(((BranchAccessObject) object).getBranchId());
+ } else if (object instanceof ArtifactAccessObject) {
+ branch = BranchManager.getBranch(((ArtifactAccessObject) object).getBranchId());
+ }
+ return AccessControlManager.getInstance().getBranchPermission(subject, branch, PermissionEnum.FULLACCESS);
+ }
+
+ /**
+ * Remove an item from their access control list
+ *
+ * @param data
+ * @throws OseeDataStoreException
+ */
+ public void removeAccessControlData(AccessControlData data, boolean removeFromDb) throws OseeDataStoreException {
+ if (data.getObject() instanceof ArtifactAccessObject) {
+ ArtifactAccessObject object = (ArtifactAccessObject) data.getObject();
+
+ if(removeFromDb){
+ ConnectionHandler.runPreparedUpdate(DELETE_ARTIFACT_ACL, data.getSubject().getArtId(), object.getArtId(),
+ object.getBranchId());
+ }
+ accessControlListCache.remove(object.getArtId(), object.getBranchId());
+
+ } else if (data.getObject() instanceof BranchAccessObject) {
+ BranchAccessObject object = (BranchAccessObject) data.getObject();
+
+ if(removeFromDb){
+ ConnectionHandler.runPreparedUpdate(DELETE_BRANCH_ACL, data.getSubject().getArtId(), object.getBranchId());
+ }
+ branchAccessObjectCache.remove(object.getBranchId());
+ }
+ deCacheAccessControlData(data);
+ }
+
+ /**
+ * @param data
+ */
+ private void deCacheAccessControlData(AccessControlData data) {
+ if (data == null) throw new IllegalArgumentException("Can not remove a null AccessControlData.");
+
+ AccessObject accessObject = data.getObject();
+ Integer subjectId = data.getSubject().getArtId();
+
+ accessControlListCache.remove(subjectId, accessObject);
+ objectToSubjectCache.removeValue(accessObject, subjectId);
+ Collection<Integer> members = groupToSubjectsCache.getValues(subjectId);
+
+ if (members != null) {
+ for (Integer member : members) {
+ subjectToGroupCache.removeValue(member, subjectId);
+ }
+ }
+ if (!objectToSubjectCache.containsKey(accessObject)) {
+ if (accessObject instanceof ArtifactAccessObject) {
+ ArtifactAccessObject artifactAccessObject = (ArtifactAccessObject) accessObject;
+ accessObjectCache.remove(artifactAccessObject.getArtId(), artifactAccessObject.getBranchId());
+ } else if (accessObject instanceof BranchAccessObject) {
+ BranchAccessObject branchAccessObject = (BranchAccessObject) accessObject;
+ branchAccessObjectCache.remove(branchAccessObject.getBranchId());
+ }
+ }
+ }
+
+ /**
+ * @param object
+ */
+ public AccessObject getAccessObject(Object object) {
+ AccessObject accessObject = null;
+
+ if (object instanceof Branch) {
+ accessObject = getBranchAccessObject(((Branch) object).getBranchId());
+ } else if (object instanceof Artifact) {
+ Artifact artifact = (Artifact) object;
+ Integer objectId = artifact.getArtId();
+ Integer branchId = artifact.getBranch().getBranchId();
+
+ accessObject = getArtifactAccessObject(objectId, branchId);
+ }
+ return accessObject;
+ }
+
+ private ArtifactAccessObject getArtifactAccessObject(Integer objectId, Integer branchId) {
+ ArtifactAccessObject accessObject = (ArtifactAccessObject) getAccessObjectIfCached(objectId, branchId);
+
+ if (accessObject == null) {
+ accessObject = new ArtifactAccessObject(objectId, branchId);
+ accessObjectCache.put(objectId, branchId, accessObject);
+ }
+ return accessObject;
+ }
+
+ private AccessObject getAccessObjectIfCached(Integer objectId, Integer branchId) {
+ AccessObject accessObject = null;
+
+ if (accessObjectCache.containsKey(objectId, branchId)) {
+ accessObject = accessObjectCache.get(objectId, branchId);
+ }
+ return accessObject;
+ }
+
+ private BranchAccessObject getBranchAccessObject(Integer branchId) {
+ BranchAccessObject branchAccessObject;
+ if (branchAccessObjectCache.containsKey(branchId)) {
+ branchAccessObject = branchAccessObjectCache.get(branchId);
+ } else {
+ branchAccessObject = new BranchAccessObject(branchId);
+ branchAccessObjectCache.put(branchId, branchAccessObject);
+ }
+ return branchAccessObject;
+ }
+
+ private void cacheAccessObject(Integer objectId, Integer subjectId, PermissionEnum permission, AccessObject accessObject) {
+ accessControlListCache.put(subjectId, accessObject, permission);
+ objectToSubjectCache.put(accessObject, subjectId);
+ }
+
+ public void lockObject(Artifact object, Artifact subject) {
+ Integer objectArtId = object.getArtId();
+ Integer subjectArtId = subject.getArtId();
+ Integer objectBranchId = object.getBranch().getBranchId();
+
+ if (!objectToBranchLockCache.containsKey(objectArtId)) {
+ AccessObject accessObject = getAccessObject(object);
+ new AccessControlData(subject, accessObject, PermissionEnum.LOCK, true).persist();
+ objectToBranchLockCache.put(objectArtId, objectBranchId);
+ lockedObjectToSubject.put(objectArtId, subjectArtId);
+
+ try {
+ OseeEventManager.kickAccessControlArtifactsEvent(this, AccessControlEventType.ArtifactsLocked,
+ new LoadedArtifacts(object));
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public void unLockObject(Artifact object, Artifact subject) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ Integer objectArtId = object.getArtId();
+ Integer branchId = object.getBranch().getBranchId();
+ Integer lockedBranchId;
+
+ if (objectToBranchLockCache.containsKey(objectArtId) && canUnlockObject(object, subject)) {
+ lockedBranchId = objectToBranchLockCache.get(objectArtId);
+
+ if (branchId.equals(lockedBranchId)) {
+ AccessObject accessObject = getAccessObject(object);
+ removeAccessControlData(new AccessControlData(subject, accessObject, PermissionEnum.LOCK, false), true);
+ objectToBranchLockCache.remove(objectArtId);
+ lockedObjectToSubject.remove(objectArtId);
+
+ OseeEventManager.kickAccessControlArtifactsEvent(this, AccessControlEventType.ArtifactsUnlocked,
+ new LoadedArtifacts(object));
+ }
+ }
+ }
+
+ /**
+ * Removes all locks from a branch
+ */
+ public void removeAllPermissionsFromBranch(OseeConnection connection, Branch branch) throws OseeCoreException {
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_ARTIFACT_ACL_FROM_BRANCH, branch.getBranchId());
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_BRANCH_ACL_FROM_BRANCH, branch.getBranchId());
+ }
+
+ /**
+ * @return - Returns true if the object has been locked on any branch.
+ */
+ public static boolean hasLock(Artifact object) {
+ if (!object.isInDb()) return false;
+
+ return instance.objectToBranchLockCache.containsKey(object.getArtId());
+ }
+
+ /**
+ * @return - Returns true if the subject locked the object else false.
+ */
+ public static boolean canUnlockObject(Artifact object, Artifact subject) {
+ Integer subjectId = instance.lockedObjectToSubject.get(object.getArtId());
+ return subjectId != null && subjectId.intValue() == subject.getArtId();
+ }
+
+ /**
+ * @return - Returns the subject who has the artifact locked or null if the object is not locked.
+ */
+ public static Artifact getSubjectFromLockedObject(Object object) throws OseeCoreException {
+ Artifact subject = null;
+
+ if (object instanceof Artifact) {
+ Integer subjectArtId = instance.lockedObjectToSubject.get(((Artifact) object).getArtId());
+
+ if (subjectArtId != null) {
+ subject = UserManager.getUserByArtId(subjectArtId);
+ }
+ }
+ return subject;
+ }
+
+ /**
+ * @return Returns true if the object is being accessed on the same branch it was locked on.
+ */
+ public boolean hasLockAccess(Artifact object) {
+ boolean hasAccess = false;
+
+ if (!object.isInDb()) {
+ return true;
+ }
+
+ if (hasLock(object)) {
+ hasAccess = objectToBranchLockCache.get(object.getArtId()) == object.getBranch().getBranchId();
+ }
+ return hasAccess;
+ }
+
+ /**
+ * @return whether the current user belongs to the OSEE Administration System Group
+ * @throws OseeCoreException
+ */
+ public static boolean isOseeAdmin() throws OseeCoreException {
+ return SystemGroup.OseeAdmin.isCurrentUserMember();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.BranchEventType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ if (branchModType == BranchEventType.Deleted) {
+ try {
+ for (AccessControlData accessControlData : generateAccessControlList(branchAccessObjectCache.get(branchId))) {
+ AccessControlManager.getInstance().removeAccessControlData(accessControlData, sender.isLocal());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.skynet.core.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ try {
+ for (Artifact artifact : loadedArtifacts.getLoadedArtifacts()) {
+ for (AccessControlData accessControlData : generateAccessControlList(accessObjectCache.get(
+ artifact.getArtId(), artifact.getBranch().getBranchId()))) {
+ AccessControlManager.getInstance().removeAccessControlData(accessControlData, sender.isLocal());
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessObject.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessObject.java
new file mode 100644
index 00000000000..6fcdfdd1ba1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/AccessObject.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.framework.skynet.core.access;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class AccessObject {
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/ArtifactAccessObject.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/ArtifactAccessObject.java
new file mode 100644
index 00000000000..3d535131662
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/ArtifactAccessObject.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.framework.skynet.core.access;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactAccessObject extends AccessObject {
+
+ private Integer artId;
+ private Integer branchId;
+
+ public ArtifactAccessObject(Integer artId, Integer branchId) {
+ super();
+ this.artId = artId;
+ this.branchId = branchId;
+ }
+
+ /**
+ * @return Returns the artId.
+ */
+ public Integer getArtId() {
+ return artId;
+ }
+
+ /**
+ * @return Returns the branchId.
+ */
+ public Integer getBranchId() {
+ return branchId;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/BranchAccessObject.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/BranchAccessObject.java
new file mode 100644
index 00000000000..6c65cad6e01
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/BranchAccessObject.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.skynet.core.access;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class BranchAccessObject extends AccessObject {
+
+ private int branchId;
+
+ public BranchAccessObject(int branchId) {
+ this.branchId = branchId;
+ }
+
+ /**
+ * @return Returns the branchId.
+ */
+ public int getBranchId() {
+ return branchId;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/NoPoliciesException.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/NoPoliciesException.java
new file mode 100644
index 00000000000..da06389ba49
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/NoPoliciesException.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.framework.skynet.core.access;
+
+public class NoPoliciesException extends SecurityException {
+
+ private static final long serialVersionUID = 7021179561030107435L;
+
+ public NoPoliciesException() {
+ super("NoPoliciesException");
+ }
+
+ public NoPoliciesException(String fname) {
+ super(fname + " has no policies.");
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionEnum.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionEnum.java
new file mode 100644
index 00000000000..03fd5b98073
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionEnum.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.framework.skynet.core.access;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum PermissionEnum {
+
+ NONE(5, "None"),
+ READ(10, "Read"),
+ WRITE(20, "Write"),
+ FULLACCESS(30, "Full Access"),
+ LOCK(40, "Lock"),
+ DENY(65535, "Deny");
+
+ // keeping this in sync with the number of permissions will ensure optimal memory usage
+ private static final int COUNT = 4;
+
+ private static final Map<Integer, PermissionEnum> rankToPermissionHash =
+ new HashMap<Integer, PermissionEnum>((int) (COUNT / .75) + 1, .75f);
+ private static final Map<String, PermissionEnum> NameToPermissionHash =
+ new HashMap<String, PermissionEnum>((int) (COUNT / .75) + 1, .75f);
+ private static final String[] NAME_ARRAY;
+
+ static {
+ NAME_ARRAY = new String[values().length];
+
+ int i = 0;
+ for (PermissionEnum permission : values()) {
+ rankToPermissionHash.put(permission.getPermId(), permission);
+ NameToPermissionHash.put(permission.getName(), permission);
+ NAME_ARRAY[i++] = permission.getName();
+ }
+ }
+
+ private int permissionId;
+ private String name;
+ public boolean add;
+
+ PermissionEnum(int permissionId, String name) {
+ this.permissionId = permissionId;
+ this.name = name;
+ }
+
+ /**
+ * @return Returns the level.
+ */
+ public int getRank() {
+ return permissionId;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ public static PermissionEnum getPermission(int permissionId) {
+ return rankToPermissionHash.get(permissionId);
+ }
+
+ public static PermissionEnum getPermission(String name) {
+ return NameToPermissionHash.get(name);
+ }
+
+ public static String[] getPermissionNames() {
+ return NAME_ARRAY;
+ }
+
+ /**
+ * @return Returns the permId.
+ */
+ public int getPermId() {
+ return permissionId;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionList.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionList.java
new file mode 100644
index 00000000000..fa269ec9cf1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/access/PermissionList.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.framework.skynet.core.access;
+
+import java.util.ArrayList;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PermissionList {
+
+ private ArrayList<PermissionEnum> permissions = new ArrayList<PermissionEnum>();
+
+ public PermissionList() {
+ super();
+
+ }
+
+ /**
+ * @return permission list.
+ */
+ public ArrayList<PermissionEnum> getPermissions() {
+ return permissions;
+ }
+
+ public void addPermission(PermissionEnum permission) {
+ permissions.add(permission);
+ }
+
+ public void resetPermissionList() {
+ for (int i = 0; i < permissions.size(); i++) {
+ permissions.remove(i);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java
new file mode 100644
index 00000000000..12c994d13f3
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java
@@ -0,0 +1,1806 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import static org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.event.SkynetAttributeChange;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.ArtifactAnnotation;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.AttributeAnnotationManager;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.IArtifactAnnotation;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.CharacterBackedAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.osgi.framework.Bundle;
+
+public class Artifact implements IAdaptable, Comparable<Artifact> {
+ public static final String UNNAMED = "Unnamed";
+ public static final String BEFORE_GUID_STRING = "/BeforeGUID/PrePend";
+ public static final String AFTER_GUID_STRING = "/AfterGUID";
+ private final HashCollection<String, Attribute<?>> attributes =
+ new HashCollection<String, Attribute<?>>(false, LinkedList.class, 12);
+ private boolean dirty = false;
+ private final Branch branch;
+ private final String guid;
+ private String humanReadableId;
+ private ArtifactType artifactType;
+ private final ArtifactFactory parentFactory;
+ private AttributeAnnotationManager annotationMgr;
+ private TransactionId transactionId;
+ private int artId;
+ private int gammaId;
+ private boolean reflected;
+ private boolean linksLoaded;
+ private boolean historical;
+ private ModificationType modType;
+ private ModificationType lastValidModType;
+ private static String[] WholeArtifactMatches =
+ new String[] {"Checklist (WordML)", "Guideline", "How To", "Renderer Template", "Roadmap",
+ "Template (WordML)", "Test Procedure WML", "Work Instruction", "Work Sheet (WordML)"};
+
+ static {
+ Arrays.sort(WholeArtifactMatches);
+ }
+
+ public Artifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+
+ if (guid == null) {
+ this.guid = GUID.generateGuidStr();
+ } else {
+ this.guid = guid;
+ }
+
+ if (humanReadableId == null) {
+ rollHumanReadableId();
+ } else {
+ this.humanReadableId = humanReadableId;
+ }
+
+ this.parentFactory = parentFactory;
+ this.branch = branch;
+ this.artifactType = artifactType;
+ }
+
+ public boolean isInDb() {
+ return transactionId != null;
+ }
+
+ /**
+ * A historical artifact always corresponds to a fixed revision of an artifact
+ *
+ * @return whether this artifact represents a fixed revision
+ */
+ public boolean isHistorical() {
+ return historical;
+ }
+
+ public boolean isAnnotation(ArtifactAnnotation.Type type) throws OseeCoreException {
+ for (ArtifactAnnotation notify : getAnnotations()) {
+ if (notify.getType() == type) return true;
+ }
+ return false;
+ }
+
+ public Set<ArtifactAnnotation> getAnnotations() throws OseeCoreException {
+ Set<ArtifactAnnotation> annotations = new HashSet<ArtifactAnnotation>();
+ for (IArtifactAnnotation annotation : getAnnotationExtensions()) {
+ annotation.getAnnotations(this, annotations);
+ }
+ return annotations;
+ }
+
+ public ArtifactAnnotation.Type getMainAnnotationType() throws OseeCoreException {
+ if (isAnnotation(ArtifactAnnotation.Type.Error))
+ return ArtifactAnnotation.Type.Error;
+ else if (isAnnotation(ArtifactAnnotation.Type.Warning))
+ return ArtifactAnnotation.Type.Warning;
+ else if (isAnnotation(ArtifactAnnotation.Type.Info)) return ArtifactAnnotation.Type.Info;
+ return ArtifactAnnotation.Type.None;
+ }
+
+ /**
+ * All the artifacts related to this artifact by relations of type relationTypeName are returned in a list order
+ * based on the stored relation order
+ *
+ * @param relationTypeName
+ * @return the artifacts related to this artifact by relations of type relationTypeName
+ * @throws ArtifactDoesNotExist
+ * @throws OseeDataStoreException
+ * @throws OseeTypeDoesNotExist
+ */
+ public List<Artifact> getRelatedArtifacts(String relationTypeName) throws OseeCoreException {
+ return RelationManager.getRelatedArtifacts(this, RelationTypeManager.getType(relationTypeName));
+ }
+
+ public List<Artifact> getRelatedArtifacts(RelationType relationType) throws OseeCoreException {
+ return RelationManager.getRelatedArtifacts(this, relationType);
+ }
+
+ public List<Artifact> getRelatedArtifacts(IRelationEnumeration relationEnum) throws OseeCoreException {
+ return RelationManager.getRelatedArtifacts(this, relationEnum);
+ }
+
+ public List<Artifact> getRelatedArtifacts(IRelationEnumeration relationEnum, boolean includeDeleted) throws OseeCoreException {
+ return RelationManager.getRelatedArtifacts(this, relationEnum, includeDeleted);
+ }
+
+ /**
+ * Check if artifacts are related to each other by relation type
+ *
+ * @param relationEnum
+ * @param other artifact to check
+ * @return whether they are related
+ * @throws OseeCoreException
+ */
+ public boolean isRelated(IRelationEnumeration relationEnum, Artifact other) throws OseeCoreException {
+ List<Artifact> relatedArtifacts = getRelatedArtifacts(relationEnum);
+ return relatedArtifacts.contains(other);
+ }
+
+ /**
+ * Get the exactly one artifact related to this artifact by relations of type relationType are returned in a list
+ * order based on
+ *
+ * @param relationType
+ * @return the related artifact
+ * @throws ArtifactDoesNotExist
+ * @throws OseeDataStoreException
+ * @throws MultipleArtifactsExist
+ */
+ public Artifact getRelatedArtifact(IRelationEnumeration relationEnum) throws OseeCoreException {
+ return RelationManager.getRelatedArtifact(this, relationEnum);
+ }
+
+ public int getRelatedArtifactsCount(IRelationEnumeration relationEnum) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ return RelationManager.getRelatedArtifactsCount(this, relationEnum.getRelationType(), relationEnum.getSide());
+ }
+
+ /**
+ * @param <A>
+ * @param side
+ * @param clazz
+ * @throws OseeCoreException
+ */
+ public <A extends Artifact> List<A> getRelatedArtifacts(IRelationEnumeration side, Class<A> clazz) throws OseeCoreException {
+ return Collections.castAll(getRelatedArtifacts(side));
+ }
+
+ public <A extends Artifact> List<A> getRelatedArtifactsOfType(IRelationEnumeration side, Class<A> clazz) throws OseeCoreException {
+ Set<Object> objs = new HashSet<Object>();
+ for (Artifact art : getRelatedArtifacts(side)) {
+ if (clazz.isInstance(art)) {
+ objs.add(art);
+ }
+ }
+ return Collections.castAll(getRelatedArtifacts(side));
+ }
+
+ /**
+ * Called upon completion of the initialization of an artifact when it is initially created. This allows sub-class
+ * artifacts to set default attributes or do default processing.
+ */
+ public void onBirth() throws OseeCoreException {
+ };
+
+ /**
+ * Called upon completion of the initialization of an artifact when loaded from the persistence layer, and when
+ * initially created. When called upon initial creation, it is called after <code>onBirth()</code>. This allows
+ * sub-class artifacts to set default attributes or do default processing.
+ */
+ public void onInitializationComplete() {
+ };
+
+ @Deprecated
+ public void onAttributePersist() throws OseeCoreException {
+ };
+
+ /**
+ * @return Returns the artId.
+ */
+ public int getArtId() {
+ return artId;
+ }
+
+ /**
+ * @return Returns the artTypeId.
+ */
+ public int getArtTypeId() {
+ return artifactType.getArtTypeId();
+ }
+
+ /**
+ * @return Returns the branch.
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.core.Unique#getGUID()
+ */
+ public String getGuid() {
+ return guid;
+ }
+
+ public String getArtifactTypeName() {
+ return artifactType.getName();
+ }
+
+ /**
+ * Currently this method provides support for quasi artifact type inheritance
+ *
+ * @param artifactType
+ * @return whether this artifact's type or any of its super-types are the specified type
+ */
+ public boolean isOfType(String artifactType) {
+ if (artifactType.equals(Requirements.ABSTRACT_TEST_UNIT) && Requirements.ALL_TEST_UNIT_TYPES.contains(getArtifactTypeName())) {
+ return true;
+ }
+ if (artifactType.equals(Requirements.ABSTRACT_SOFTWARE_REQUIREMENT) && Requirements.ALL_SOFTWARES_REQUIREMENT_TYPES.contains(getArtifactTypeName())) {
+ return true;
+ }
+ if (artifactType.equals("Native") && (this instanceof NativeArtifact || getArtifactTypeName().equals(
+ "Renderer Template"))) {
+ return true;
+ }
+ if (artifactType.equals(WordArtifact.ARTIFACT_NAME) && this instanceof WordArtifact) {
+ return true;
+ }
+ if (artifactType.equals(WordArtifact.WHOLE_WORD) && Arrays.binarySearch(WholeArtifactMatches,
+ getArtifactTypeName()) >= 0) {
+ return true;
+ }
+ if (artifactType.equals(WordArtifact.WORD_TEMPLATE) && this instanceof WordArtifact && Arrays.binarySearch(
+ WholeArtifactMatches, getArtifactTypeName()) < 0) {
+ return true;
+ }
+ return getArtifactTypeName().equals(artifactType);
+ }
+
+ @Override
+ public String toString() {
+ return getInternalDescriptiveName();
+ }
+
+ //TODO should not return null but currently application code expects it to
+ /**
+ * The method should be used when the caller expects this artifact to have exactly one parent. Otherwise use
+ * hasParent() to safely determine whether
+ */
+ public Artifact getParent() throws OseeCoreException {
+ if (hasParent()) {
+ return RelationManager.getRelatedArtifact(this, CoreRelationEnumeration.DEFAULT_HIERARCHICAL__PARENT);
+ }
+ return null;
+ }
+
+ /**
+ * @return whether this artifact has exactly one parent artifact related by a relation of type default hierarchical
+ * @throws OseeCoreException
+ * @throws MultipleArtifactsExist if this artifact has more than one parent
+ */
+ public boolean hasParent() throws OseeCoreException {
+ int parentCount = getRelatedArtifactsCount(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__PARENT);
+ if (parentCount == 0) {
+ return false;
+ }
+ if (parentCount == 1) {
+ return true;
+ } else {
+ throw new MultipleArtifactsExist(humanReadableId + " has " + parentCount + " parents");
+ }
+ }
+
+ public boolean isOrphan() throws OseeCoreException {
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(getBranch());
+ for (Artifact parent = getParent(); parent != null; parent = parent.getParent()) {
+ if (parent.equals(root)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public Artifact getChild(String descriptiveName) throws OseeCoreException {
+ for (Artifact artifact : getChildren()) {
+ if (artifact.getDescriptiveName().equals(descriptiveName)) {
+ return artifact;
+ }
+ }
+ throw new ArtifactDoesNotExist(
+ "\"" + getDescriptiveName() + "\" has no child with the name \"" + descriptiveName + "\"");
+ }
+
+ public boolean hasChild(String descriptiveName) throws OseeCoreException {
+ for (Artifact artifact : getChildren()) {
+ if (artifact.getDescriptiveName().equals(descriptiveName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @return set of the direct children of this artifact
+ * @throws OseeCoreException
+ */
+ public List<Artifact> getChildren() throws OseeCoreException {
+ return getRelatedArtifacts(DEFAULT_HIERARCHICAL__CHILD);
+ }
+
+ /**
+ * @return set of the direct children of this artifact
+ * @throws OseeCoreException
+ */
+ public List<Artifact> getChildren(boolean includeDeleted) throws OseeCoreException {
+ return getRelatedArtifacts(DEFAULT_HIERARCHICAL__CHILD, includeDeleted);
+ }
+
+ /**
+ * @return a list of artifacts ordered by a depth first traversal of this artifact's descendants
+ * @throws OseeCoreException
+ */
+ public List<Artifact> getDescendants() throws OseeCoreException {
+ List<Artifact> descendants = new LinkedList<Artifact>();
+ getDescendants(descendants);
+ return descendants;
+ }
+
+ private void getDescendants(Collection<Artifact> descendants) throws OseeCoreException {
+ for (Artifact child : getChildren()) {
+ descendants.add(child);
+ child.getDescendants(descendants);
+ }
+ }
+
+ /**
+ * @param artifact
+ * @throws OseeCoreException
+ */
+ public void addChild(Artifact artifact) throws OseeCoreException {
+ addRelation(DEFAULT_HIERARCHICAL__CHILD, artifact);
+ }
+
+ /**
+ * creates a new child using artifactType with the given name and relates it to its parent
+ *
+ * @param artifactType
+ * @param name
+ * @throws OseeCoreException
+ */
+ public Artifact addNewChild(ArtifactType artifactType, String name) throws OseeCoreException {
+ Artifact child = artifactType.makeNewArtifact(branch);
+ child.setDescriptiveName(name);
+ addChild(child);
+ return child;
+ }
+
+ /**
+ * creates a new child using artifactType with the given name and relates it to its parent
+ *
+ * @param artifactTypeName
+ * @param name
+ * @return the newly created artifact
+ * @throws OseeCoreException
+ */
+ public Artifact addNewChild(String artifactTypeName, String name) throws OseeCoreException {
+ return addNewChild(ArtifactTypeManager.getType(artifactTypeName), name);
+ }
+
+ public void addChildren(List<? extends Artifact> artifacts) throws OseeCoreException {
+ for (Artifact artifact : artifacts) {
+ addChild(artifact);
+ }
+ }
+
+ /**
+ * Creates an instance of <code>Attribute</code> of the given attribute type. This method should not be called by
+ * applications. Use addAttribute() instead
+ *
+ * @param <T>
+ * @param attributeType
+ * @param existingAttribute specifies whether this attribute is new or is being loaded from the database
+ * @return new Attribute
+ */
+ @SuppressWarnings("unchecked")
+ public <T> Attribute<T> createAttribute(AttributeType attributeType, boolean newAttribute) {
+ try {
+ Object[] params = new Object[] {attributeType, this};
+ Class<? extends Attribute<T>> attributeClass =
+ (Class<? extends Attribute<T>>) attributeType.getBaseAttributeClass();
+
+ Constructor<? extends Attribute<T>> attributeConstructor =
+ attributeClass.getConstructor(new Class[] {AttributeType.class, Artifact.class});
+ Attribute<T> attribute = attributeConstructor.newInstance(params);
+
+ Constructor<? extends IAttributeDataProvider> providerConstructor =
+ attributeType.getProviderAttributeClass().getConstructor(new Class[] {Attribute.class});
+ IAttributeDataProvider provider = providerConstructor.newInstance(new Object[] {attribute});
+ attribute.setAttributeDataProvider(provider);
+
+ attributes.put(attributeType.getName(), attribute);
+ if (newAttribute) {
+ attribute.initializeToDefaultValue();
+ }
+ return attribute;
+ } catch (Exception ex) {
+ // using reflections causes five different exceptions to be thrown which is too messy and will be very rare
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /**
+ * @param attributeName
+ * @return true if attributeName is valid for the artifact type of this artifact
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ * @throws BranchDoesNotExist
+ */
+ public boolean isAttributeTypeValid(String attributeName) throws OseeCoreException {
+ Collection<AttributeType> attributeTypes =
+ TypeValidityManager.getAttributeTypesFromArtifactType(getArtifactType(), branch);
+ for (AttributeType attributeType : attributeTypes) {
+ if (attributeType.getName().equals(attributeName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * The use of this method is discouraged since it directly returns Attributes.
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @throws OseeCoreException
+ */
+ public <T> List<Attribute<T>> getAttributes(String attributeTypeName) throws OseeCoreException {
+ List<Attribute<T>> notDeltedAttributes = new ArrayList<Attribute<T>>();
+ Collection<Attribute<T>> selectedAttributes = getAttributesIncludeDeleted(attributeTypeName);
+ for (Attribute<T> attribute : selectedAttributes) {
+ if (!attribute.isDeleted()) {
+ notDeltedAttributes.add(attribute);
+ }
+ }
+ return notDeltedAttributes;
+ }
+
+ public <T> List<Attribute<T>> getAttributesIncludeDeleted(String attributeTypeName) throws OseeCoreException {
+ ensureAttributesLoaded();
+ Collection<Attribute<?>> selectedAttributes = attributes.getValues(attributeTypeName);
+ if (selectedAttributes == null) {
+ return java.util.Collections.emptyList();
+ }
+ return Collections.castAll(selectedAttributes);
+ }
+
+ /**
+ * The use of this method is discouraged since it directly returns Attributes.
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @param value
+ * @throws OseeCoreException
+ */
+ public <T> List<Attribute<T>> getAttributes(String attributeTypeName, Object value) throws OseeCoreException {
+ ensureAttributesLoaded();
+ List<Attribute<?>> notDeltedAttributes = new ArrayList<Attribute<?>>();
+ Collection<Attribute<?>> selectedAttributes = attributes.getValues(attributeTypeName);
+ if (selectedAttributes == null) {
+ return java.util.Collections.emptyList();
+ }
+ for (Attribute<?> attribute : selectedAttributes) {
+ if (!attribute.isDeleted() && attribute.getValue().equals(value)) {
+ notDeltedAttributes.add(attribute);
+ }
+ }
+ return Collections.castAll(notDeltedAttributes);
+ }
+
+ /**
+ * The use of this method is discouraged since it directly returns Attributes.
+ *
+ * @return attributes
+ * @throws OseeCoreException
+ */
+ public List<Attribute<?>> getAttributes(boolean includeDeleted) throws OseeCoreException {
+ ensureAttributesLoaded();
+ List<Attribute<?>> notDeltedAttributes = new ArrayList<Attribute<?>>();
+ for (String attributeTypeName : attributes.keySet()) {
+ for (Attribute<?> attribute : attributes.getValues(attributeTypeName)) {
+ if (!attribute.isDeleted() || includeDeleted) {
+ notDeltedAttributes.add(attribute);
+ }
+ }
+ }
+
+ return notDeltedAttributes;
+ }
+
+ /**
+ * @return all attributes including deleted ones
+ */
+ public List<Attribute<?>> internalGetAttributes() {
+ return attributes.getValues();
+ }
+
+ public void deleteAttributes(String attributeTypeName) throws OseeCoreException {
+ for (Attribute<?> attribute : getAttributes(attributeTypeName)) {
+ attribute.delete();
+ }
+ }
+
+ private void resetArtifactDeletedModTypes() {
+ for (Attribute<?> attribute : attributes.getValues()) {
+ if (attribute.getModificationType() == ModificationType.ARTIFACT_DELETED) {
+ attribute.resetModType();
+ }
+ }
+ }
+
+ private void setAttributesModArtifactDeleted() throws OseeCoreException {
+ for (Attribute<?> attribute : getAttributes(false)) {
+ attribute.setArtifactDeleted();
+ }
+ }
+
+ private void ensureAttributesLoaded() throws OseeCoreException {
+ if (!isAttributesLoaded() && isInDb()) {
+ ArtifactLoader.loadArtifactData(this, ArtifactLoad.ATTRIBUTE);
+ }
+ }
+
+ public boolean isAttributesLoaded() {
+ return !attributes.isEmpty();
+ }
+
+ public Collection<AttributeType> getAttributeTypes() throws OseeCoreException {
+ return TypeValidityManager.getAttributeTypesFromArtifactType(getArtifactType(), branch);
+ }
+
+ public <T> Attribute<T> getSoleAttribute(String attributeTypeName) throws OseeCoreException {
+ ensureAttributesLoaded();
+ List<Attribute<T>> soleAttributes = getAttributes(attributeTypeName);
+ if (soleAttributes.size() == 0) {
+ return null;
+ } else if (soleAttributes.size() > 1) {
+ throw new MultipleAttributesExist(String.format(
+ "The attribute \'%s\' can have no more than one instance for sole attribute operations; guid \'%s\'",
+ attributeTypeName, getGuid()));
+ }
+ return (soleAttributes.iterator().next());
+ }
+
+ private <T> Attribute<T> getOrCreateSoleAttribute(String attributeTypeName) throws OseeCoreException {
+ Attribute<T> attribute = getSoleAttribute(attributeTypeName);
+ if (attribute == null) {
+ attribute = createAttribute(AttributeTypeManager.getType(attributeTypeName), true);
+ }
+ return attribute;
+ }
+
+ /**
+ * Return sole attribute value for given attribute type name. Will throw exceptions if "Sole" nature of attribute is
+ * invalid.<br>
+ * <br>
+ * Used for quick access to attribute value that should only have 0 or 1 instances of the attribute.
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @return sole attribute value
+ * @throws OseeCoreException
+ */
+ public <T> T getSoleAttributeValue(String attributeTypeName) throws OseeCoreException {
+ List<Attribute<T>> soleAttributes = getAttributes(attributeTypeName);
+ if (soleAttributes.size() == 0) {
+ if (!isAttributeTypeValid(attributeTypeName)) {
+ throw new OseeArgumentException(String.format(
+ "The attribute type %s is not valid for artifacts of type [%s]", attributeTypeName,
+ getArtifactTypeName()));
+ }
+ throw new AttributeDoesNotExist(
+ "Attribute \"" + attributeTypeName + "\" does not exist for artifact " + getHumanReadableId());
+ } else if (soleAttributes.size() > 1) {
+ throw new MultipleAttributesExist(
+ "Attribute \"" + attributeTypeName + "\" must have exactly one instance. It currently has " + soleAttributes.size() + " for artifact " + getHumanReadableId());
+ }
+ return soleAttributes.iterator().next().getValue();
+ }
+
+ /**
+ * Return sole attribute string value for given attribute type name. Handles AttributeDoesNotExist case by returning
+ * defaultReturnValue.<br>
+ * <br>
+ * Used for display purposes where toString() of attribute is to be displayed.
+ *
+ * @param attributeTypeName
+ * @param defaultReturnValue return value if attribute instance does not exist
+ * @return attribute value
+ * @throws MultipleAttributesExist if multiple attribute instances exist
+ */
+ public String getSoleAttributeValueAsString(String attributeTypeName, String defaultReturnValue) throws OseeCoreException, MultipleAttributesExist {
+ Object value = getSoleAttributeValue(attributeTypeName, defaultReturnValue);
+ if (value == null) {
+ return null;
+ }
+ return value.toString();
+ }
+
+ /**
+ * Return sole attribute value for given attribute type name Handles AttributeDoesNotExist case by returning
+ * defaultReturnValue.<br>
+ * <br>
+ * Used for purposes where attribute value of specified type is desired.
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @param defaultReturnValue
+ * @return attribute value
+ * @throws MultipleAttributesExist if multiple attribute instances exist
+ * @throws OseeCoreException
+ */
+ public <T> T getSoleAttributeValue(String attributeTypeName, T defaultReturnValue) throws OseeCoreException {
+ List<Attribute<T>> soleAttributes = getAttributes(attributeTypeName);
+ if (soleAttributes.size() == 1) {
+ T value = soleAttributes.iterator().next().getValue();
+ if (value == null) {
+ OseeLog.log(
+ Activator.class,
+ Level.SEVERE,
+ "Attribute \"" + attributeTypeName + "\" has null value for Artifact " + getHumanReadableId() + " \"" + getDescriptiveName() + "\"");
+ return defaultReturnValue;
+ }
+ return value;
+ } else {
+ return defaultReturnValue;
+ }
+ }
+
+ /**
+ * Return sole attribute value for given attribute type name or defaultReturnValue if no attribute instance exists
+ * for this artifact.<br>
+ * <br>
+ * Used for purposes where attribute value of specified type is desired.<br>
+ * <br>
+ * NOTE: Use only for inline calls. This method returns identical data as
+ * getSoleTAttributeValue(attributeTypeName,defaultReturnValue) but provides an extra parameter that allows it to be
+ * called within another method call because it specifically defines the return type as clazz
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @param defaultReturnValue
+ * @param clazz class to be returned
+ * @return attribute value
+ * @throws MultipleAttributesExist if multiple attribute instances exist
+ * @throws OseeCoreException
+ */
+ public <T> T getSoleAttributeValue(String attributeTypeName, T defaultReturnValue, Class<T> clazz) throws OseeCoreException {
+ return getSoleAttributeValue(attributeTypeName, defaultReturnValue);
+ }
+
+ /**
+ * Delete attribute if exactly one exists. Does nothing if attribute does not exist and throw MultipleAttributesExist
+ * is more than one instance of the attribute type exsits for this artifact
+ *
+ * @param attributeTypeName
+ * @throws OseeCoreException
+ */
+ public void deleteSoleAttribute(String attributeTypeName) throws OseeCoreException {
+ Attribute<?> attribute = getSoleAttribute(attributeTypeName);
+ if (attribute != null) {
+ attribute.delete();
+ }
+ }
+
+ public void deleteAttribute(String attributeTypeName, Object value) throws OseeCoreException {
+ for (Attribute<Object> attribute : getAttributes(attributeTypeName)) {
+ if (attribute.getValue().equals(value)) attribute.delete();
+ }
+ }
+
+ /**
+ * Used on attribute types with no more than one instance. If the attribute exists, it's value is changed, otherwise
+ * a new attribute is added and its value set.
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @param value
+ * @throws OseeCoreException
+ * @throws MultipleAttributesExist
+ */
+ public <T> void setSoleAttributeValue(String attributeTypeName, T value) throws OseeCoreException {
+ getOrCreateSoleAttribute(attributeTypeName).setValue(value);
+ }
+
+ public <T> void setSoleAttributeFromString(String attributeTypeName, String value) throws OseeCoreException {
+ getOrCreateSoleAttribute(attributeTypeName).setFromString(value);
+ }
+
+ public void setSoleAttributeFromStream(String attributeTypeName, InputStream stream) throws OseeCoreException {
+ getOrCreateSoleAttribute(attributeTypeName).setValueFromInputStream(stream);
+ }
+
+ /**
+ * @param attributeTypeName
+ * @return comma delimited representation of all the attributes of the type attributeName
+ * @throws OseeCoreException
+ */
+ public String getAttributesToString(String attributeTypeName) throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (Attribute<?> attr : getAttributes(attributeTypeName)) {
+ sb.append(attr);
+ sb.append(", ");
+ }
+ return sb.toString().replaceFirst(", $", "");
+ }
+
+ /**
+ * Uses the Dynamic Attribute Manager to set a group of attribute data strings into a set of attributes. Checks to
+ * see if data value exists before adding and also removes those attribute values that are not in the input dataStrs.
+ * Duplicates will be removed.
+ *
+ * @param attributeTypeName
+ * @param dataStrs
+ * @throws OseeCoreException
+ */
+ public void setAttributeValues(String attributeTypeName, Collection<String> dataStrs) throws OseeCoreException {
+ ensureAttributesLoaded();
+
+ ArrayList<String> storedNames = new ArrayList<String>();
+
+ AttributeType attributeType = AttributeTypeManager.getType(attributeTypeName);
+ int minOccur = attributeType.getMinOccurrences();
+ int maxOccur = attributeType.getMaxOccurrences();
+ for (Attribute<?> attribute : getAttributes(attributeTypeName)) {
+ storedNames.add(attribute.toString());
+ }
+
+ if (dataStrs.size() > maxOccur) throw new IllegalStateException(
+ "Attempting to set " + dataStrs.size() + " when max =" + maxOccur);
+ if (dataStrs.size() < minOccur) throw new IllegalStateException(
+ "Attempting to set " + dataStrs.size() + " when min =" + minOccur);
+ // If size to replace is same as size filled, need to reset existing attributes cause can't
+ // add and then remove
+ if (dataStrs.size() == maxOccur && storedNames.size() == dataStrs.size()) {
+ String[] dataStrsArr = dataStrs.toArray(new String[dataStrs.size()]);
+ int x = 0;
+ for (Attribute<?> attribute : getAttributes(attributeTypeName)) {
+ if (attribute instanceof CharacterBackedAttribute) {
+ ((CharacterBackedAttribute<?>) attribute).setFromString(dataStrsArr[x++]);
+ }
+ }
+ return;
+ }
+
+ // Add items that are newly selected
+ for (String value : dataStrs) {
+ if (!storedNames.contains(value)) {
+ addAttribute(attributeTypeName, value);
+ }
+ }
+
+ // Remove items that aren't selected anymore
+ for (String stored : storedNames) {
+ if (!dataStrs.contains(stored)) {
+ for (Attribute<?> attribute : getAttributes(attributeTypeName)) {
+ if (attribute.toString().equals(stored)) {
+ attribute.delete();
+ }
+ }
+ }
+ }
+
+ // Remove duplicates
+ ArrayList<String> foundAttribute = new ArrayList<String>();
+ for (Attribute<?> attribute : getAttributes(attributeTypeName)) {
+ // Delete duplicate if already found
+ if (foundAttribute.contains(attribute.toString())) {
+ attribute.delete();
+ } else {
+ foundAttribute.add(attribute.toString());
+ }
+ }
+ }
+
+ /**
+ * adds a new attribute of the type named attributeTypeName and assigns it the given value
+ *
+ * @param <T>
+ * @param attributeTypeName
+ * @param value
+ * @throws OseeCoreException
+ */
+ public <T> void addAttribute(String attributeTypeName, T value) throws OseeCoreException {
+ createAttribute(AttributeTypeManager.getType(attributeTypeName), true).setValue(value);
+ }
+
+ /**
+ * adds a new attribute of the type named attributeTypeName and assigns it the given value
+ *
+ * @param attributeTypeName
+ * @param value
+ * @throws OseeCoreException
+ */
+ public <T> void addAttributeFromString(String attributeTypeName, String value) throws OseeCoreException {
+ createAttribute(AttributeTypeManager.getType(attributeTypeName), true).setFromString(value);
+ }
+
+ /**
+ * @param attributeTypeName
+ * @return string collection representation of all the attributes of the type attributeName
+ * @throws OseeCoreException
+ */
+ public List<String> getAttributesToStringList(String attributeTypeName) throws OseeCoreException {
+ ensureAttributesLoaded();
+
+ List<String> items = new ArrayList<String>();
+ for (Attribute<?> attribute : getAttributes(attributeTypeName)) {
+ items.add(attribute.toString());
+ }
+ return items;
+ }
+
+ public String getInternalDescriptiveName() {
+ String name = getInternalAttributeValue("Name");
+ if (!Strings.isValid(name)) return UNNAMED;
+ return name;
+ }
+
+ /**
+ * Return the String value of the first found attributeTypeName attribute whether deleted or not.
+ *
+ * @param attributeTypeName
+ * @return attribute value
+ */
+ public String getInternalAttributeValue(String attributeTypeName) {
+ try {
+ if (!isAttributeTypeValid(attributeTypeName)) {
+ throw new IllegalStateException(String.format(
+ "Artifact Type [%s] guid [%s] does not have the attribute type 'Name' which is required.",
+ getArtifactTypeName(), getGuid()));
+ }
+ for (Attribute<?> attribute : internalGetAttributes()) {
+ if (attribute.isOfType(attributeTypeName)) {
+ return (String) attribute.getValue();
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ return ex.getLocalizedMessage();
+ }
+ return "";
+ }
+
+ public String getDescriptiveName() {
+ try {
+ String name = null;
+ List<Attribute<String>> nameAttributes = getAttributesIncludeDeleted("Name");
+ if (nameAttributes.size() == 1) {
+ name = nameAttributes.get(0).getValue();
+ } else if (nameAttributes.size() == 0) {
+ name = UNNAMED;
+ }
+ return name == null ? UNNAMED : name;
+ } catch (Exception ex) {
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ public void setDescriptiveName(String name) throws OseeCoreException {
+ setSoleAttributeValue("Name", name);
+ }
+
+ public ArtifactFactory getFactory() {
+ return parentFactory;
+ }
+
+ /**
+ * This is used to mark that the artifact has been persisted. This should only be called by the
+ * ArtifactPersistenceManager.
+ */
+ public void setNotDirty() {
+ dirty = false;
+
+ for (Attribute<?> attribute : internalGetAttributes()) {
+ attribute.setNotDirty();
+ }
+ }
+
+ /**
+ * This is used to mark that the artifact deleted. This should only be called by the RemoteEventManager.
+ *
+ * @throws OseeCoreException
+ */
+ public void setDeleted() throws OseeCoreException {
+ this.modType = ModificationType.DELETED;
+ setAttributesModArtifactDeleted();
+ }
+
+ /**
+ * This is used to mark that the artifact not deleted. This should only be called by the RemoteEventManager.
+ */
+ public void resetToPreviousModType() {
+ this.modType = lastValidModType;
+ resetArtifactDeletedModTypes();
+ }
+
+ /**
+ * @return Returns the dirty.
+ */
+ public boolean isDirty() {
+ return isDirty(false);
+ }
+
+ /**
+ * @return Returns the dirty.
+ */
+ public String reportIsDirty(boolean includeLinks) {
+ if (dirty) {
+ return "dirty flag == true";
+ }
+ String result = reportAnAttributeIsDirty();
+ if (result != null) {
+ return result;
+ }
+ if (includeLinks) {
+ result = RelationManager.reportHasDirtyLinks(this);
+ }
+ return result;
+ }
+
+ public boolean isDirty(boolean includeLinks) {
+ return reportIsDirty(includeLinks) != null;
+ }
+
+ public boolean isReadOnly() {
+ try {
+ return isDeleted() || isHistorical() || !getBranch().isEditable() || !AccessControlManager.checkObjectPermission(
+ this, PermissionEnum.WRITE);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ return false;
+ }
+ }
+
+ public boolean anAttributeIsDirty() {
+ return reportAnAttributeIsDirty() != null;
+ }
+
+ private String reportAnAttributeIsDirty() {
+ for (Attribute<?> attribute : internalGetAttributes()) {
+ if (attribute.isDirty()) {
+ return "Attribute: " + attribute.getNameValueDescription();
+ }
+ }
+ return null;
+ }
+
+ public void revert() throws OseeCoreException {
+ DbTransaction dbTransaction = new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ ArtifactPersistenceManager.revertArtifact(connection, Artifact.this);
+ }
+ };
+ dbTransaction.execute();
+ }
+
+ /**
+ * Reloads this artifact's attributes and relations back to the last state saved. This will have no effect if the
+ * artifact has never been saved.
+ *
+ * @throws MultipleArtifactsExist
+ * @throws ArtifactDoesNotExist
+ * @throws IllegalStateException if the artifact is deleted
+ */
+ public void reloadAttributesAndRelations() throws OseeCoreException {
+ if (!isInDb()) return;
+
+ ArtifactQuery.reloadArtifactFromId(getArtId(), getBranch());
+ }
+
+ void prepareForReload() throws OseeCoreException {
+ attributes.clear();
+ dirty = false;
+ linksLoaded = false;
+
+ RelationManager.prepareRelationsForReload(this);
+ }
+
+ public final void persistAttributes() throws OseeCoreException {
+ if (isDirty()) {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ persistAttributes(transaction);
+ transaction.execute();
+ }
+ }
+
+ public final void persistAttributes(SkynetTransaction transaction) throws OseeCoreException {
+ if (!UserManager.duringMainUserCreation() && !AccessControlManager.checkObjectPermission(getBranch(),
+ PermissionEnum.WRITE)) {
+ throw new OseeArgumentException(
+ "No write permissions for the branch that this artifact belongs to:" + getBranch());
+ }
+ if (isHistorical()) {
+ throw new OseeArgumentException(
+ "The artifact " + getGuid() + " must be at the head of the branch to be edited.");
+ }
+
+ if (isDirty()) {
+ transaction.addArtifact(this);
+ onAttributePersist();
+ }
+ }
+
+ public final void persistRelations() throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ persistRelations(transaction);
+ transaction.execute();
+ }
+
+ public final void persistRelations(SkynetTransaction transaction) throws OseeCoreException {
+ RelationManager.persistRelationsFor(transaction, this, null);
+ }
+
+ public final void persistRelations(Collection<RelationType> relationTypes) throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ for (RelationType relationType : relationTypes) {
+ RelationManager.persistRelationsFor(transaction, this, relationType);
+ }
+ transaction.execute();
+ }
+
+ public final void persistAttributesAndRelations() throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ persistAttributesAndRelations(transaction);
+ transaction.execute();
+ }
+
+ public final void persistAttributesAndRelations(SkynetTransaction transaction) throws OseeCoreException {
+ if (transaction == null) {
+ persistAttributesAndRelations();
+ } else {
+ persistAttributes(transaction);
+ persistRelations(transaction);
+ }
+ }
+
+ /**
+ * Returns all of the descendants through the primary decomposition tree that have a particular human readable id.
+ * This will not return the called upon node if the name matches since it can not be a descendant of itself.
+ *
+ * @param humanReadableId The human readable id text to match against.
+ * @param caseSensitive Whether to use case sensitive matching.
+ * @return <code>Collection</code> of <code>Artifact</code>'s that match.
+ * @throws OseeCoreException
+ */
+ public Collection<Artifact> getDescendants(String humanReadableId, boolean caseSensitive) throws OseeCoreException {
+ Collection<Artifact> descendants = new LinkedList<Artifact>();
+
+ for (Artifact child : getChildren()) {
+ if ((caseSensitive && child.getDescriptiveName().equals(humanReadableId)) || (!caseSensitive && child.getDescriptiveName().equalsIgnoreCase(
+ humanReadableId))) {
+ descendants.add(child);
+ }
+ descendants.addAll(child.getDescendants(humanReadableId, caseSensitive));
+ }
+
+ return descendants;
+ }
+
+ /**
+ * Starting from this artifact, walks down the child hierarchy based on the list of child names provided and returns
+ * the child of the last name provided. ArtifactDoesNotExist exception is thrown ff any child along the path does not
+ * exist.
+ *
+ * @param names
+ * @return child at the leaf (bottom) of the specified hierarchy.
+ * @throws OseeCoreException
+ */
+ public Artifact getDescendant(String... names) throws OseeCoreException {
+ if (names.length == 0) {
+ throw new OseeArgumentException("Must suply at least one name to getDescendant()");
+ }
+ Artifact descendant = this;
+ for (String name : names) {
+ descendant = descendant.getChild(name);
+ }
+ return descendant;
+ }
+
+ /**
+ * Return relations that exist between artifacts
+ *
+ * @throws ArtifactDoesNotExist
+ */
+ @Deprecated
+ public ArrayList<RelationLink> getRelations(Artifact artifact) throws OseeCoreException {
+ ArrayList<RelationLink> relations = new ArrayList<RelationLink>();
+ for (RelationLink relation : getRelationsAll(false)) {
+ try {
+ if (relation.getArtifactOnOtherSide(this).equals(artifact)) {
+ relations.add(relation);
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ return relations;
+ }
+
+ /**
+ * Return relations that exist between artifacts of type side
+ *
+ * @throws OseeCoreException
+ */
+ @Deprecated
+ public ArrayList<RelationLink> getRelations(IRelationEnumeration side, Artifact artifact) throws OseeCoreException {
+ ArrayList<RelationLink> relations = new ArrayList<RelationLink>();
+ for (RelationLink relation : getRelations(side)) {
+ try {
+ if (relation.getArtifactOnOtherSide(this).equals(artifact)) {
+ relations.add(relation);
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ return relations;
+ }
+
+ /**
+ * Removes artifact from a specific branch
+ */
+ public void deleteAndPersist() throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ deleteAndPersist(transaction);
+ transaction.execute();
+ }
+
+ /**
+ * Removes artifact from a specific branch
+ */
+ public void deleteAndPersist(SkynetTransaction transaction) throws OseeCoreException {
+ ArtifactPersistenceManager.deleteArtifact(transaction, false, this);
+ }
+
+ public void delete() throws OseeCoreException {
+ ArtifactPersistenceManager.deleteArtifact(null, false, this);
+ }
+
+ /**
+ * Remove artifact from a specific branch in the database
+ *
+ * @param connection TODO
+ * @throws OseeCoreException
+ */
+ public void purgeFromBranch(OseeConnection connection) throws OseeCoreException {
+ ArtifactPersistenceManager.purgeArtifactFromBranch(connection, branch.getBranchId(), artId);
+ }
+
+ public boolean isDeleted() {
+ return modType == ModificationType.DELETED;
+ }
+
+ public void setLinksLoaded() {
+ linksLoaded = true;
+ }
+
+ public void addRelation(IRelationEnumeration relationSide, Artifact artifact, String rationale) throws OseeCoreException {
+ boolean sideA = relationSide.isSideA();
+ Artifact artifactA = sideA ? artifact : this;
+ Artifact artifactB = sideA ? this : artifact;
+ RelationManager.addRelation(relationSide.getRelationType(), artifactA, artifactB, rationale);
+ }
+
+ public void addRelation(IRelationEnumeration relationSide, Artifact artifact) throws OseeCoreException {
+ addRelation(relationSide, artifact, null);
+ }
+
+ public void addRelation(Artifact targetArtifact, boolean insertAfterTarget, IRelationEnumeration relationSide, Artifact artifact, String rationale) throws OseeCoreException {
+ boolean sideA = relationSide.isSideA();
+ Artifact artifactA = sideA ? artifact : this;
+ Artifact artifactB = sideA ? this : artifact;
+ Artifact targetArtifactA = sideA ? targetArtifact : null;
+ Artifact targetArtifactB = sideA ? null : targetArtifact;
+ boolean insertAfterATarget = sideA ? insertAfterTarget : true;
+ boolean insertAfterBTarget = sideA ? true : insertAfterTarget;
+
+ RelationManager.addRelation(targetArtifactA, insertAfterATarget, targetArtifactB, insertAfterBTarget,
+ relationSide.getRelationType(), artifactA, artifactB, rationale);
+ }
+
+ public void setRelationOrder(IRelationEnumeration relationSide, List<Artifact> artifactsInNewOrder) throws OseeCoreException {
+ if (artifactsInNewOrder.size() == 0) return;
+ List<Artifact> currentOrder = getRelatedArtifacts(relationSide, Artifact.class);
+ // Insert first artifact before first artifact in list
+ Artifact previousArtifact = currentOrder.iterator().next();
+ boolean firstArtifact = true;
+ for (Artifact artifact : artifactsInNewOrder) {
+ if (previousArtifact != artifact) {
+ setRelationOrder(previousArtifact, !firstArtifact, relationSide, artifact);
+ }
+ firstArtifact = false;
+ previousArtifact = artifact;
+ }
+ }
+
+ public void setRelationOrder(Artifact targetArtifact, boolean insertAfterTarget, IRelationEnumeration relationSide, Artifact artifact) throws OseeCoreException {
+ boolean sideA = relationSide.isSideA();
+ Artifact artifactA = sideA ? artifact : this;
+ Artifact artifactB = sideA ? this : artifact;
+ Artifact targetArtifactA = sideA ? targetArtifact : null;
+ Artifact targetArtifactB = sideA ? null : targetArtifact;
+ boolean insertAfterATarget = sideA ? insertAfterTarget : true;
+ boolean insertAfterBTarget = sideA ? true : insertAfterTarget;
+ RelationManager.setRelationOrder(targetArtifactA, insertAfterATarget, targetArtifactB, insertAfterBTarget,
+ relationSide.getRelationType(), artifactA, artifactB);
+ }
+
+ /**
+ * Use addRelation instead
+ *
+ * @param relationSide
+ * @param artifact
+ * @param persist
+ * @see #addRelation
+ * @throws OseeCoreException
+ */
+ @Deprecated
+ public void relate(IRelationEnumeration relationSide, Artifact artifact, boolean persist) throws OseeCoreException {
+ addRelation(relationSide, artifact);
+ persistRelations();
+ }
+
+ public void deleteRelation(IRelationEnumeration relationSide, Artifact artifact) throws OseeCoreException {
+ boolean sideA = relationSide.isSideA();
+ Artifact artifactA = sideA ? artifact : this;
+ Artifact artifactB = sideA ? this : artifact;
+ RelationManager.deleteRelation(relationSide.getRelationType(), artifactA, artifactB);
+ }
+
+ public void deleteRelations(IRelationEnumeration relationSide) throws OseeCoreException {
+ for (Artifact art : getRelatedArtifacts(relationSide)) {
+ deleteRelation(relationSide, art);
+ }
+ }
+
+ /**
+ * Overwrites all existing relations to this artifact with a single relation to an artifact
+ *
+ * @param relationSide
+ * @param artifact
+ * @throws OseeCoreException
+ */
+ public void setSoleRelation(IRelationEnumeration relationSide, Artifact artifact) throws OseeCoreException {
+ // Delete all existing relations
+ for (RelationLink relationLink : getRelations(relationSide)) {
+ relationLink.delete(true);
+ }
+ setRelations(relationSide, Arrays.asList(artifact));
+ }
+
+ /**
+ * Creates new relations that don't already exist and removes relations to artifacts that are not in collection
+ *
+ * @param relationSide
+ * @param artifacts
+ * @throws OseeCoreException
+ */
+ public void setRelations(IRelationEnumeration relationSide, Collection<? extends Artifact> artifacts) throws OseeCoreException {
+ Collection<Artifact> currentlyRelated = getRelatedArtifacts(relationSide, Artifact.class);
+ // Add new relations if don't exist
+ for (Artifact artifact : artifacts) {
+ if (!currentlyRelated.contains(artifact)) {
+ addRelation(relationSide, artifact);
+ }
+ }
+ // Remove relations that have been removed
+ for (Artifact artifact : currentlyRelated) {
+ if (!artifacts.contains(artifact)) {
+ deleteRelation(relationSide, artifact);
+ }
+ }
+ }
+
+ /**
+ * Creates new relations that don't already exist and removes relations to artifacts that are not in collection
+ *
+ * @param relationSide
+ * @param artifacts
+ * @throws OseeCoreException
+ */
+ public void setRelationsOfType(IRelationEnumeration relationSide, Collection<? extends Artifact> artifacts, Class<?> clazz) throws OseeCoreException {
+ Collection<Artifact> currentlyRelated = getRelatedArtifacts(relationSide, Artifact.class);
+ // Add new relations if don't exist
+ for (Artifact artifact : artifacts) {
+ if (clazz.isInstance(artifact) && !currentlyRelated.contains(artifact)) {
+ addRelation(relationSide, artifact);
+ }
+ }
+ // Remove relations that have been removed
+ for (Artifact artifact : currentlyRelated) {
+ if (clazz.isInstance(artifact) && !artifacts.contains(artifact)) {
+ deleteRelation(relationSide, artifact);
+ }
+ }
+ }
+
+ public final boolean isLinksLoaded() {
+ return linksLoaded;
+ }
+
+ /**
+ * @return Returns the humanReadableId.
+ */
+ public String getHumanReadableId() {
+ return humanReadableId;
+ }
+
+ public void rollHumanReadableId() {
+ humanReadableId = generateHumanReadableId();
+ }
+
+ private static final char[][] chars =
+ new char[][] {
+ {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',
+ 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'},
+ {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
+ 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z'}};
+ private static final int[] charsIndexLookup = new int[] {0, 1, 1, 1, 0};
+
+ /**
+ * 5 character human readable identifier where the first and last characters are in the range [A-Z0-9] except 'I' and
+ * 'O' and the middle three characters have the same range as above with the additional restrictions of 'A', 'E', 'U'
+ * thus the total number of unique values is: 34 * 31 * 31 *31 * 34 = 34,438,396
+ */
+ private static String generateHumanReadableId() {
+ int seed = (int) (Math.random() * 34438396);
+ char id[] = new char[charsIndexLookup.length];
+
+ for (int i = 0; i < id.length; i++) {
+ int radix = chars[charsIndexLookup[i]].length;
+ id[i] = chars[charsIndexLookup[i]][seed % radix];
+ seed = seed / radix;
+ }
+ return new String(id);
+ }
+
+ /**
+ * @return Returns the descriptor.
+ */
+ public ArtifactType getArtifactType() {
+ return artifactType;
+ }
+
+ public String getVersionedName() {
+ String name = getDescriptiveName();
+
+ if (isHistorical()) {
+ name += " [Rev:" + transactionId.getTransactionNumber() + "]";
+ }
+
+ return name;
+ }
+
+ /**
+ * Return true if this artifact any of it's links specified or any of the artifacts on the other side of the links
+ * are dirty
+ *
+ * @param links
+ */
+ public String isRelationsAndArtifactsDirty(Set<IRelationEnumeration> links) {
+ try {
+ if (isDirty()) {
+
+ for (Attribute<?> attribute : internalGetAttributes()) {
+ if (attribute.isDirty()) {
+ return "===> Dirty Attribute - " + attribute.getAttributeType().getName() + "\n";
+ }
+ }
+ return "Artifact isDirty == true??";
+ }
+ // Loop through all relations
+ for (IRelationEnumeration side : links) {
+ for (Artifact art : getRelatedArtifacts(side)) {
+ // Check artifact dirty
+ if (art.isDirty()) {
+ return art.getArtifactTypeName() + " \"" + art + "\" => dirty\n";
+ }
+ // Check the links to this artifact
+ for (RelationLink link : getRelations(side, art))
+ if (link.isDirty()) {
+ return "Link \"" + link + "\" => dirty\n";
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /**
+ * Creates a new artifact and duplicates all of its attribute data.
+ *
+ * @throws OseeCoreException
+ */
+ public Artifact duplicate(Branch branch) throws OseeCoreException {
+ Artifact newArtifact = artifactType.makeNewArtifact(branch);
+ //we do this because attributes were added on creation to meet the minimum attribute requirements
+ newArtifact.attributes.clear();
+ copyAttributes(newArtifact);
+ return newArtifact;
+ }
+
+ private void copyAttributes(Artifact artifact) throws OseeCoreException {
+ for (Attribute<?> attribute : getAttributes(false)) {
+ artifact.addAttribute(attribute.getAttributeType().getName(), attribute.getValue());
+ }
+ }
+
+ public Artifact reflect(Branch destinationBranch) throws OseeCoreException {
+ if (branch.equals(destinationBranch)) {
+ return this;
+ }
+ Artifact reflectedArtifact = reflectHelper(destinationBranch);
+ reflectedArtifact.transactionId = TransactionIdManager.getlatestTransactionForBranch(destinationBranch);
+ reflectedArtifact.reflected = true;
+ return reflectedArtifact;
+ }
+
+ private Artifact reflectHelper(Branch branch) throws OseeCoreException {
+ ModificationType modificationType = ModificationType.INTRODUCED;
+
+ Artifact reflectedArtifact =
+ artifactType.getFactory().reflectExisitingArtifact(artId, guid, humanReadableId, artifactType, gammaId,
+ branch, modificationType);
+
+ reflectedArtifact.dirty = true;
+
+ for (Attribute<?> sourceAttribute : attributes.getValues()) {
+ if (sourceAttribute.isInDb()) {
+ Attribute.initializeAttribute(reflectedArtifact, sourceAttribute.getAttributeType().getAttrTypeId(),
+ sourceAttribute.getAttrId(), sourceAttribute.getGammaId(),
+ sourceAttribute.isDeleted() ? ModificationType.DELETED : null, true,
+ sourceAttribute.getAttributeDataProvider().getData());
+ }
+ }
+ return reflectedArtifact;
+ }
+
+ /**
+ * @return the transaction number for this artifact if it is historical, otherwise 0
+ */
+ public int getTransactionNumber() {
+ return transactionId.getTransactionNumber();
+ }
+
+ public TransactionId getTransactionId() {
+ return transactionId;
+ }
+
+ /**
+ * @return Returns the gammaId.
+ */
+ public int getGammaId() {
+ return gammaId;
+ }
+
+ /**
+ * @return Returns dirty attributes.
+ * @throws Exception
+ */
+ public Collection<SkynetAttributeChange> getDirtySkynetAttributeChanges() throws OseeDataStoreException {
+ List<SkynetAttributeChange> dirtyAttributes = new LinkedList<SkynetAttributeChange>();
+
+ for (Attribute<?> attribute : internalGetAttributes()) {
+ if (attribute.isDirty()) {
+ dirtyAttributes.add(new SkynetAttributeChange(attribute.getAttributeType().getAttrTypeId(),
+ attribute.getAttributeDataProvider().getData(), attribute.isDeleted(), attribute.getAttrId(),
+ attribute.getGammaId()));
+ }
+ }
+ return dirtyAttributes;
+ }
+
+ /**
+ * Changes the artifact type in the database.
+ *
+ * @param artifactType
+ * @throws OseeDataStoreException
+ */
+ public void changeArtifactType(ArtifactType artifactType) throws OseeDataStoreException {
+ ArtifactPersistenceManager.changeArtifactSubStype(this, artifactType);
+ this.artifactType = artifactType;
+ }
+
+ private static final Pattern safeNamePattern = Pattern.compile("[^A-Za-z0-9 ]");
+ private static final String[] NUMBER =
+ new String[] {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
+
+ /**
+ * Since artifact names are free text it is important to reformat the name to ensure it is suitable as an element
+ * name
+ *
+ * @return artifact name in a form that is valid as an XML element
+ */
+ public String getSafeName() {
+ String elementName = safeNamePattern.matcher(getDescriptiveName()).replaceAll("_");
+
+ // Ensure the name did not end up empty
+ if (elementName.equals("")) {
+ elementName = "nameless";
+ }
+
+ // Fix the first character if it is a number by replacing it with its name
+ char firstChar = elementName.charAt(0);
+ if (firstChar >= '0' && firstChar <= '9') {
+ elementName = NUMBER[firstChar - '0'] + elementName.substring(1);
+ }
+
+ if (elementName.length() > 75) {
+ elementName = elementName.substring(0, 75);
+ }
+
+ return elementName;
+ }
+
+ private Set<IArtifactAnnotation> artifactAnnotationExtensions;
+
+ private Set<IArtifactAnnotation> getAnnotationExtensions() {
+ if (artifactAnnotationExtensions != null) return artifactAnnotationExtensions;
+ artifactAnnotationExtensions = new HashSet<IArtifactAnnotation>();
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint(
+ "org.eclipse.osee.framework.skynet.core.ArtifactAnnotation");
+ if (point == null) {
+ System.err.println("Can't access ArtifactAnnotation extension point");
+ return artifactAnnotationExtensions;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("ArtifactAnnotation")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ artifactAnnotationExtensions.add((IArtifactAnnotation) obj);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ }
+ }
+ }
+ return artifactAnnotationExtensions;
+ }
+
+ /**
+ * @return the annotationMgr
+ */
+ public AttributeAnnotationManager getAnnotationMgr() {
+ if (annotationMgr == null) {
+ annotationMgr = new AttributeAnnotationManager(this);
+ }
+ return annotationMgr;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Artifact otherArtifact) {
+ if (otherArtifact == null || otherArtifact.isDeleted()) {
+ return -1;
+ } else if (this.isDeleted()) {
+ return 1;
+ }
+
+ int diff;
+ if (otherArtifact.equals(this)) {
+ diff = 0;
+ } else {
+ try {
+ diff = getDescriptiveName().compareTo(otherArtifact.getDescriptiveName());
+ } catch (Exception ex) {
+ diff = 0;
+ }
+ }
+
+ return diff;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return (37 * guid.hashCode()) + branch.hashCode();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Artifact) {
+ Artifact otherArtifact = (Artifact) obj;
+ return guid == otherArtifact.guid && branch.equals(otherArtifact.branch);
+ }
+ return false;
+ }
+
+ public int getRemainingAttributeCount(AttributeType attributeType) throws OseeCoreException {
+ return attributeType.getMaxOccurrences() - getAttributeCount(attributeType.getName());
+ }
+
+ public int getAttributeCount(String attributeTypeName) throws OseeCoreException {
+ ensureAttributesLoaded();
+ return getAttributes(attributeTypeName).size();
+ }
+
+ void setArtId(int artifactId) {
+ this.artId = artifactId;
+ }
+
+ /**
+ * @param relationType
+ * @return a list of relations from a specific relation type
+ */
+ public List<RelationLink> getRelations(RelationType relationType) {
+ return RelationManager.getRelations(this, relationType, null);
+ }
+
+ public List<RelationLink> getRelations(IRelationEnumeration relationEnum) throws OseeCoreException {
+ return RelationManager.getRelations(this, relationEnum.getRelationType(), relationEnum.getSide());
+ }
+
+ public List<RelationLink> getRelationsAll(boolean includeDeleted) {
+ return RelationManager.getRelationsAll(this, includeDeleted);
+ }
+
+ /**
+ * @return all artifacts related to this artifact.
+ * @throws ArtifactDoesNotExist
+ */
+ public List<Artifact> getRelatedArtifactsAll() throws OseeCoreException {
+ return RelationManager.getRelatedArtifactsAll(this);
+ }
+
+ /**
+ * This method should never be called from outside the OSEE Application Framework
+ *
+ * @param gammaId
+ * @param transactionId
+ * @param modType
+ * @param lastModified
+ * @param historical
+ */
+ void internalSetPersistenceData(int gammaId, TransactionId transactionId, ModificationType modType, boolean historical) {
+ this.gammaId = gammaId;
+ this.transactionId = transactionId;
+ this.historical = historical;
+ this.modType = modType;
+ this.lastValidModType = modType;
+ }
+
+ public Date getLastModified() throws OseeCoreException {
+ return transactionId.getTime();
+ }
+
+ public User getLastModifiedBy() throws OseeCoreException {
+ return UserManager.getUserByArtId(transactionId.getAuthorArtId());
+ }
+
+ void meetMinimumAttributeCounts(boolean isNewArtifact) throws OseeCoreException {
+ for (AttributeType attributeType : getAttributeTypes()) {
+ int missingCount = attributeType.getMinOccurrences() - getAttributeCount(attributeType.getName());
+ for (int i = 0; i < missingCount; i++) {
+ Attribute<?> attribute = createAttribute(attributeType, true);
+ if (!isNewArtifact) {
+ attribute.setNotDirty();
+ OseeLog.log(Activator.class, Level.FINER, String.format(
+ "artId [%d] - an attribute of type %s was created", getArtId(), attributeType.toString()));
+ }
+ }
+ }
+ }
+
+ /**
+ * @return the reflected
+ */
+ public boolean isReflected() {
+ return reflected;
+ }
+
+ /**
+ * @return the modType
+ */
+ public ModificationType getModType() {
+ return modType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCache.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCache.java
new file mode 100644
index 00000000000..f7f27399ba5
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCache.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.framework.skynet.core.artifact;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactCache {
+ // The keys for this are <artId, transactionId>
+ private final CompositeKeyHashMap<Integer, Integer, Artifact> historicalArtifactIdCache =
+ new CompositeKeyHashMap<Integer, Integer, Artifact>();
+ private final CompositeKeyHashMap<String, Integer, Artifact> historicalArtifactGuidCache =
+ new CompositeKeyHashMap<String, Integer, Artifact>();
+
+ private final CompositeKeyHashMap<Integer, Integer, Artifact> artifactIdCache =
+ new CompositeKeyHashMap<Integer, Integer, Artifact>(2000);
+
+ private final CompositeKeyHashMap<String, Integer, Artifact> artifactGuidCache =
+ new CompositeKeyHashMap<String, Integer, Artifact>(2000);
+
+ private final CompositeKeyHashMap<String, Branch, Artifact> keyedArtifactCache =
+ new CompositeKeyHashMap<String, Branch, Artifact>(10);
+
+ private final HashCollection<String, Artifact> staticIdArtifactCache =
+ new HashCollection<String, Artifact>(true, HashSet.class, 100);
+
+ private static final ArtifactCache instance = new ArtifactCache();
+
+ private ArtifactCache() {
+ }
+
+ /**
+ * Cache the artifact so that we can avoid creating duplicate instances of an artifact
+ *
+ * @param artifact
+ */
+ synchronized static void cache(Artifact artifact) {
+ if (artifact.isHistorical()) {
+ instance.historicalArtifactIdCache.put(artifact.getArtId(), artifact.getTransactionNumber(), artifact);
+ instance.historicalArtifactGuidCache.put(artifact.getGuid(), artifact.getTransactionNumber(), artifact);
+ } else {
+ instance.artifactIdCache.put(artifact.getArtId(), artifact.getBranch().getBranchId(), artifact);
+ instance.artifactGuidCache.put(artifact.getGuid(), artifact.getBranch().getBranchId(), artifact);
+ }
+ }
+
+ synchronized static void cachePostAttributeLoad(Artifact artifact) throws OseeCoreException {
+ for (String staticId : artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE)) {
+ instance.staticIdArtifactCache.put(staticId, artifact);
+ }
+ }
+
+ public synchronized static void cacheByStaticId(String staticId, Artifact artifact) {
+ instance.staticIdArtifactCache.put(staticId, artifact);
+ }
+
+ synchronized static void deCache(Artifact artifact) throws OseeCoreException {
+ instance.historicalArtifactIdCache.remove(artifact.getArtId(), artifact.getTransactionNumber());
+ instance.historicalArtifactGuidCache.remove(artifact.getGuid(), artifact.getTransactionNumber());
+ instance.artifactIdCache.remove(artifact.getArtId(), artifact.getBranch().getBranchId());
+ instance.artifactGuidCache.remove(artifact.getGuid(), artifact.getBranch().getBranchId());
+ for (String staticId : artifact.getAttributesToStringList(StaticIdManager.STATIC_ID_ATTRIBUTE)) {
+ instance.staticIdArtifactCache.removeValue(staticId, artifact);
+ }
+ }
+
+ public synchronized static Collection<Artifact> getArtifactsByStaticId(String staticId) {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ Collection<Artifact> cachedArts = instance.staticIdArtifactCache.getValues(staticId);
+ if (cachedArts == null) return artifacts;
+ for (Artifact artifact : cachedArts) {
+ if (!artifact.isDeleted()) artifacts.add(artifact);
+ }
+ return artifacts;
+ }
+
+ public synchronized static Collection<Artifact> getArtifactsByStaticId(String staticId, Branch branch) {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ Collection<Artifact> cachedArts = instance.staticIdArtifactCache.getValues(staticId);
+ if (cachedArts == null) return artifacts;
+ for (Artifact artifact : cachedArts) {
+ if (!artifact.isDeleted() && artifact.getBranch().equals(branch)) artifacts.add(artifact);
+ }
+ return artifacts;
+ }
+
+ public synchronized static Artifact getHistorical(Integer artId, Integer transactionNumber) {
+ return instance.historicalArtifactIdCache.get(artId, transactionNumber);
+ }
+
+ public synchronized static Artifact getHistorical(String guid, Integer transactionNumber) {
+ return instance.historicalArtifactGuidCache.get(guid, transactionNumber);
+ }
+
+ /**
+ * returns the active artifact with the given artifact id from the given branch if it is in the cache and null
+ * otherwise
+ *
+ * @param artId
+ * @param branch
+ * @return
+ */
+ public static Artifact getActive(Integer artId, Branch branch) {
+ return getActive(artId, branch.getBranchId());
+ }
+
+ /**
+ * returns the active artifact with the given artifact id from the given branch if it is in the cache and null
+ * otherwise
+ *
+ * @param artId
+ * @param branchId
+ * @return
+ */
+ public synchronized static Artifact getActive(Integer artId, Integer branchId) {
+ return instance.artifactIdCache.get(artId, branchId);
+ }
+
+ /**
+ * returns the active artifact with the given artifact id from the given branch if it is in the cache and null
+ * otherwise
+ *
+ * @param artId
+ * @param branchId
+ * @return
+ */
+ public synchronized static Artifact getActive(String artGuid, Integer branchId) {
+ return instance.artifactGuidCache.get(artGuid, branchId);
+ }
+
+ /**
+ * returns the active artifact based on the previously provided text key and branch
+ *
+ * @param key
+ * @param branch
+ * @return
+ */
+ public synchronized static Artifact getByTextId(String key, Branch branch) {
+ return instance.keyedArtifactCache.get(key, branch);
+ }
+
+ /**
+ * used to cache an artifact based on a text identifier and its branch
+ *
+ * @param key
+ * @param branch
+ * @param artifact
+ */
+ public synchronized static void putByTextId(String key, Artifact artifact) {
+ instance.keyedArtifactCache.put(key, artifact.getBranch(), artifact);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChangeListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChangeListener.java
new file mode 100644
index 00000000000..cb0f5a87a1e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChangeListener.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.framework.skynet.core.artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface ArtifactChangeListener {
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCheck.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCheck.java
new file mode 100644
index 00000000000..82c5b4bfe18
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactCheck.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.framework.skynet.core.artifact;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactCheck implements IArtifactCheck {
+ public static final IStatus OK_STATUS = new Status(IStatus.OK, Activator.PLUGIN_ID, null);
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.IArtifactCheck#isDeleteable(java.util.Collection)
+ */
+ @Override
+ public IStatus isDeleteable(Collection<Artifact> artifacts) throws OseeCoreException {
+ return OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.IArtifactCheck#isModifiable(java.util.Collection, java.util.Collection)
+ */
+ @Override
+ public IStatus isRenamable(Collection<Artifact> artifacts) throws OseeCoreException {
+ return OK_STATUS;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChecks.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChecks.java
new file mode 100644
index 00000000000..970e1143123
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactChecks.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.framework.skynet.core.artifact;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactChecks {
+ public static List<IArtifactCheck> tasks;
+ public static String EXTENSION_POINT = "org.eclipse.osee.framework.skynet.core.ArtifactCheck";
+
+ public static List<IArtifactCheck> getArtifactChecks() {
+ if (tasks == null) {
+ tasks = new ArrayList<IArtifactCheck>();
+ List<IConfigurationElement> iExtensions =
+ ExtensionPoints.getExtensionElements(EXTENSION_POINT, "ArtifactCheck");
+ for (IConfigurationElement element : iExtensions) {
+ String className = element.getAttribute("classname");
+ String bundleName = element.getContributor().getName();
+ try {
+ if (className != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> interfaceClass = bundle.loadClass(className);
+ IArtifactCheck check = (IArtifactCheck) interfaceClass.getConstructor().newInstance();
+ tasks.add(check);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE,
+ "Problem loading ArtifactCheck extension \"" + className + "\". Ignorning.", ex);
+ }
+ }
+ }
+ return tasks;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactData.java
new file mode 100644
index 00000000000..4ed59648579
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactData.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.framework.skynet.core.artifact;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public class ArtifactData {
+ private String url = "";
+ private String source = "";
+ private Artifact[] artifacts;
+
+ /**
+ * @param artifacts
+ * @param url
+ */
+ public ArtifactData(Artifact[] artifacts, String url, String source) {
+ this.artifacts = artifacts;
+ this.url = url;
+ this.source = source;
+ }
+
+ /**
+ * @return Returns the artifacts.
+ */
+ public Artifact[] getArtifacts() {
+ return artifacts;
+ }
+
+ /**
+ * @return Returns the url.
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactFactory.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactFactory.java
new file mode 100644
index 00000000000..1bc926018c7
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactFactory.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.framework.skynet.core.artifact;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+public abstract class ArtifactFactory {
+
+ private final Collection<String> artifactTypeNames;
+
+ protected ArtifactFactory(Collection<String> artifactTypeNames) {
+ this.artifactTypeNames = artifactTypeNames;
+ }
+
+ protected ArtifactFactory(String artifactTypeName) {
+ this(Arrays.asList(artifactTypeName));
+ }
+
+ protected ArtifactFactory() {
+ super();
+ this.artifactTypeNames = null;
+ }
+
+ /**
+ * Used to create a new artifact (one that has never been saved into the datastore)
+ *
+ * @param branch
+ * @param artifactType
+ * @param guid
+ * @param humandReadableId
+ * @param earlyArtifactInitialization TODO
+ * @return the new artifact instance
+ */
+ public Artifact makeNewArtifact(Branch branch, ArtifactType artifactType, String guid, String humandReadableId, ArtifactProcessor earlyArtifactInitialization) throws OseeCoreException {
+ Artifact artifact = getArtifactInstance(guid, humandReadableId, branch, artifactType);
+
+ artifact.setArtId(SequenceManager.getNextArtifactId());
+ if (earlyArtifactInitialization != null) {
+ earlyArtifactInitialization.run(artifact);
+ }
+ artifact.meetMinimumAttributeCounts(true);
+ ArtifactCache.cache(artifact);
+ artifact.setLinksLoaded();
+ artifact.onBirth();
+ artifact.onInitializationComplete();
+
+ return artifact;
+ }
+
+ public synchronized Artifact reflectExisitingArtifact(int artId, String guid, String humandReadableId, ArtifactType artifactType, int gammaId, Branch branch, ModificationType modificationType) throws OseeCoreException {
+ return internalExistingArtifact(artId, guid, humandReadableId, artifactType, gammaId, branch,
+ modificationType, false, null);
+ }
+
+ private Artifact internalExistingArtifact(int artId, String guid, String humandReadableId, ArtifactType artifactType, int gammaId, Branch branch, ModificationType modType, boolean historical, TransactionId transactionId) throws OseeCoreException {
+ Artifact artifact = getArtifactInstance(guid, humandReadableId, branch, artifactType);
+
+ artifact.setArtId(artId);
+ artifact.internalSetPersistenceData(gammaId, transactionId, modType, historical);
+
+ ArtifactCache.cache(artifact);
+ return artifact;
+ }
+
+ public synchronized Artifact loadExisitingArtifact(int artId, String guid, String humandReadableId, ArtifactType artifactType, int gammaId, TransactionId transactionId, ModificationType modType, boolean historical) throws OseeCoreException {
+ return internalExistingArtifact(artId, guid, humandReadableId, artifactType, gammaId, transactionId.getBranch(),
+ modType, historical, transactionId);
+ }
+
+ /**
+ * Request the factory to create a new instance of the type. The implementation of this method should not result in a
+ * call to the persistence manager to acquire the <code>Artifact</code> or else an infinite loop will occur since
+ * this method is used by the persistence manager when it needs a new instance of the class to work with and can not
+ * come up with it on its own.
+ *
+ * @param branch branch on which this instance of this artifact will be associated
+ * @return Return artifact reference
+ * @throws OseeCoreException TODO
+ */
+ protected abstract Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException;
+
+ @Override
+ public String toString() {
+ return getClass().getName();
+ }
+
+ /**
+ * Return true if this artifact factory is responsible for creating artifactType.
+ *
+ * @param artifactTypeName
+ * @return true if responsible
+ * @throws OseeCoreException
+ */
+ public boolean isResponsibleFor(String artifactTypeName) throws OseeDataStoreException {
+ return artifactTypeNames != null && artifactTypeNames.contains(artifactTypeName);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoad.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoad.java
new file mode 100644
index 00000000000..cbf7c98e338
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoad.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.framework.skynet.core.artifact;
+
+/**
+ * Enumeration used to determine the level of artifact data that will be pre-loaded from the datastore
+ *
+ * @author Ryan D. Brooks
+ */
+public enum ArtifactLoad {
+ SHALLOW, FULL, RELATION, ATTRIBUTE, ALL_CURRENT;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoader.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoader.java
new file mode 100644
index 00000000000..f861f2fc219
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactLoader.java
@@ -0,0 +1,499 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import static org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad.SHALLOW;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public final class ArtifactLoader {
+
+ private static final String INSERT_JOIN_ARTIFACT =
+ "INSERT INTO osee_join_artifact (query_id, insert_time, art_id, branch_id, transaction_id) VALUES (?, ?, ?, ?, ?)";
+
+ private static final String DELETE_FROM_JOIN_ARTIFACT = "DELETE FROM osee_join_artifact WHERE query_id = ?";
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Loading"));
+
+ /**
+ * (re)loads the artifacts selected by sql and then returns them in a list
+ *
+ * @param sql
+ * @param queryParameters
+ * @param artifactCountEstimate
+ * @param loadLevel
+ * @param reload
+ * @param confirmer
+ * @param transactionId
+ * @param allowDeleted
+ * @return list of artifacts resulting for the sql query
+ * @throws OseeCoreException
+ */
+ public static List<Artifact> getArtifacts(String sql, Object[] queryParameters, int artifactCountEstimate, ArtifactLoad loadLevel, boolean reload, ISearchConfirmer confirmer, TransactionId transactionId, boolean allowDeleted) throws OseeCoreException {
+ int queryId = getNewQueryId();
+ CompositeKeyHashMap<Integer, Integer, Object[]> insertParameters =
+ new CompositeKeyHashMap<Integer, Integer, Object[]>(artifactCountEstimate);
+ selectArtifacts(queryId, insertParameters, sql, queryParameters, artifactCountEstimate, transactionId);
+ List<Artifact> artifacts =
+ loadArtifacts(queryId, loadLevel, confirmer, new ArrayList<Object[]>(insertParameters.values()), reload,
+ transactionId != null, allowDeleted);
+ return artifacts;
+ }
+
+ /**
+ * (re)loads the artifacts selected by sql and then returns them in a list
+ *
+ * @param sql
+ * @param queryParameters
+ * @param artifactCountEstimate
+ * @param loadLevel
+ * @param reload
+ * @param allowDeleted allow the inclusion of deleted artifacts in the results
+ * @param historical
+ * @return list of artifacts resulting for the sql query
+ * @throws OseeCoreException
+ */
+ public static List<Artifact> getArtifacts(String sql, Object[] queryParameters, int artifactCountEstimate, ArtifactLoad loadLevel, boolean reload, TransactionId transactionId, boolean allowDeleted) throws OseeCoreException {
+ return getArtifacts(sql, queryParameters, artifactCountEstimate, loadLevel, reload, null, transactionId,
+ allowDeleted);
+ }
+
+ /**
+ * @param queryId
+ * @param loadLevel
+ * @param confirmer used to prompt user whether to proceed if certain conditions are met
+ * @param fetchSize
+ * @param reload
+ * @param historical
+ * @param allowDeleted allow the inclusion of deleted artifacts in the results
+ * @throws OseeCoreException
+ */
+ public static List<Artifact> loadArtifactsFromQueryId(int queryId, ArtifactLoad loadLevel, ISearchConfirmer confirmer, int fetchSize, boolean reload, boolean historical, boolean allowDeleted) throws OseeCoreException {
+ List<Artifact> artifacts = new ArrayList<Artifact>(fetchSize);
+ try {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ String sql;
+ if (historical) {
+ sql = ClientSessionManager.getSQL(OseeSql.Load.SELECT_HISTORICAL_ARTIFACTS);
+ } else {
+ sql =
+ allowDeleted ? ClientSessionManager.getSQL(OseeSql.Load.SELECT_CURRENT_ARTIFACTS_WITH_DELETED) : ClientSessionManager.getSQL(OseeSql.Load.SELECT_CURRENT_ARTIFACTS);
+ }
+ chStmt.runPreparedQuery(fetchSize, sql, queryId);
+
+ int previousArtId = -1;
+ int previousBranchId = -1;
+ while (chStmt.next()) {
+ int artId = chStmt.getInt("art_id");
+ int branchId = chStmt.getInt("branch_id");
+ // assumption: sql is returning rows ordered by branch_id, art_id, transaction_id in descending order
+ if ((previousArtId != artId || previousBranchId != branchId)) {
+ // assumption: sql is returning unwanted deleted artifacts only in the historical case
+ if (!(historical && !allowDeleted && ModificationType.getMod(chStmt.getInt("mod_type")) == ModificationType.DELETED)) {
+ artifacts.add(retrieveShallowArtifact(chStmt, reload, historical));
+ }
+ }
+ previousArtId = artId;
+ previousBranchId = branchId;
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ if (confirmer == null || confirmer.canProceed(artifacts.size())) {
+ loadArtifactsData(queryId, artifacts, loadLevel, reload, historical, allowDeleted);
+ }
+ } finally {
+ clearQuery(queryId);
+ }
+ return artifacts;
+ }
+
+ /**
+ * loads or reloads artifacts based on artifact ids and branch ids
+ *
+ * @param artIds
+ * @param branch
+ * @param loadLevel
+ * @return list of the loaded artifacts
+ * @throws OseeCoreException
+ */
+ public static List<Artifact> loadArtifacts(Collection<Integer> artIds, Branch branch, ArtifactLoad loadLevel, boolean reload) throws OseeCoreException {
+ return loadArtifacts(artIds, branch, loadLevel, null, reload);
+ }
+
+ /**
+ * loads or reloads artifacts based on artifact ids and branch ids
+ *
+ * @param artIds
+ * @param branch
+ * @param loadLevel
+ * @param transactionId
+ * @return list of the loaded artifacts
+ * @throws OseeCoreException
+ */
+ public static List<Artifact> loadArtifacts(Collection<Integer> artIds, Branch branch, ArtifactLoad loadLevel, TransactionId transactionId, boolean reload) throws OseeCoreException {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>();
+
+ if (!artIds.isEmpty()) {
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+ boolean historical = transactionId != null;
+
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (int artId : artIds) {
+ insertParameters.add(new Object[] {queryId, insertTime, artId, branch.getBranchId(),
+ historical ? transactionId.getTransactionNumber() : SQL3DataType.INTEGER});
+ }
+
+ for (Artifact artifact : loadArtifacts(queryId, loadLevel, null, insertParameters, reload, historical, true)) {
+ artifacts.add(artifact);
+ }
+ }
+ return artifacts;
+ }
+
+ /**
+ * loads or reloads artifacts based on artifact ids and branch ids in the insertParameters
+ *
+ * @param queryId
+ * @param loadLevel
+ * @param confirmer
+ * @param insertParameters
+ * @param reload
+ * @param historical TODO
+ * @param allowDeleted TODO
+ * @return list of the loaded artifacts
+ * @throws OseeCoreException
+ */
+ public static List<Artifact> loadArtifacts(int queryId, ArtifactLoad loadLevel, ISearchConfirmer confirmer, List<Object[]> insertParameters, boolean reload, boolean historical, boolean allowDeleted) throws OseeCoreException {
+
+ List<Artifact> artifacts = Collections.emptyList();
+ if (insertParameters.size() > 0) {
+ long time = System.currentTimeMillis();
+ try {
+ insertIntoArtifactJoin(insertParameters);
+ artifacts =
+ loadArtifactsFromQueryId(queryId, loadLevel, confirmer, insertParameters.size(), reload, historical,
+ allowDeleted);
+ } finally {
+ OseeLog.log(Activator.class, Level.FINE, String.format("Artifact Load Time [%s] for [%d] artifacts. ",
+ Lib.getElapseString(time), artifacts.size()), new Exception("Artifact Load Time"));
+ clearQuery(queryId);
+ }
+ }
+ return artifacts;
+ }
+
+ /**
+ * must be call in a try block with a finally clause which calls clearQuery()
+ *
+ * @param insertParameters
+ * @throws OseeDataStoreException
+ */
+ public static int insertIntoArtifactJoin(OseeConnection connection, List<Object[]> insertParameters) throws OseeDataStoreException {
+ return ConnectionHandler.runBatchUpdate(connection, INSERT_JOIN_ARTIFACT, insertParameters);
+ }
+
+ /**
+ * must be call in a try block with a finally clause which calls clearQuery()
+ *
+ * @param insertParameters
+ * @throws OseeDataStoreException
+ */
+ public static int insertIntoArtifactJoin(List<Object[]> insertParameters) throws OseeDataStoreException {
+ return insertIntoArtifactJoin(null, insertParameters);
+ }
+
+ /**
+ * should only be used in tandem with with selectArtifacts()
+ *
+ * @param queryId value gotten from call to getNewQueryId and used in populating the insert parameters for
+ * selectArtifacts
+ */
+ public static void clearQuery(int queryId) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(DELETE_FROM_JOIN_ARTIFACT, queryId);
+ }
+
+ /**
+ * should only be used in tandem with with selectArtifacts()
+ *
+ * @param queryId value gotten from call to getNewQueryId and used in populating the insert parameters for
+ * selectArtifacts
+ */
+ public static void clearQuery(OseeConnection connection, int queryId) throws OseeDataStoreException {
+ if (connection != null) {
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_JOIN_ARTIFACT, queryId);
+ } else {
+ ConnectionHandler.runPreparedUpdate(DELETE_FROM_JOIN_ARTIFACT, queryId);
+ }
+ }
+
+ /**
+ * @param queryId
+ * @param insertParameters will be populated by this method
+ * @param sql
+ * @param queryParameters
+ * @param artifactCountEstimate
+ */
+ public static void selectArtifacts(int queryId, CompositeKeyHashMap<Integer, Integer, Object[]> insertParameters, String sql, Object[] queryParameters, int artifactCountEstimate, TransactionId transactionId) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ long time = System.currentTimeMillis();
+
+ try {
+ chStmt.runPreparedQuery(artifactCountEstimate, sql, queryParameters);
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ if (DEBUG) {
+ System.out.println("ArtifactLoader: Found the following Artifacts");
+ }
+ while (chStmt.next()) {
+ int artId = chStmt.getInt("art_id");
+ int branchId = chStmt.getInt("branch_id");
+ if (DEBUG) {
+ System.out.println(String.format(" ArtifactID = %d , BranchID = %d", artId, branchId));
+ }
+ Object transactionParameter =
+ transactionId == null ? SQL3DataType.INTEGER : transactionId.getTransactionNumber();
+ insertParameters.put(artId, branchId, new Object[] {queryId, insertTime, artId, branchId,
+ transactionParameter});
+ }
+ } finally {
+ chStmt.close();
+ }
+ OseeLog.log(Activator.class, Level.FINE, String.format("Artifact Selection Time [%s], [%d] artifacts selected",
+ Lib.getElapseString(time), insertParameters.size()), new Exception("Artifact Selection Time"));
+ }
+
+ private static Artifact retrieveShallowArtifact(ConnectionHandlerStatement chStmt, boolean reload, boolean historical) throws OseeCoreException {
+ int artifactId = chStmt.getInt("art_id");
+ Branch branch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+ TransactionId transactionId = TransactionIdManager.getTransactionId(chStmt);
+ Artifact artifact;
+
+ if (historical) {
+ int stripeTransactionNumber = chStmt.getInt("stripe_transaction_id");
+ if (stripeTransactionNumber != transactionId.getTransactionNumber()) {
+ transactionId = TransactionIdManager.getTransactionId(stripeTransactionNumber);
+ }
+ artifact = ArtifactCache.getHistorical(artifactId, transactionId.getTransactionNumber());
+ } else {
+ artifact = ArtifactCache.getActive(artifactId, branch);
+ }
+
+ if (artifact == null) {
+ ArtifactType artifactType = ArtifactTypeManager.getType(chStmt.getInt("art_type_id"));
+ ArtifactFactory factory = artifactType.getFactory();
+
+ artifact =
+ factory.loadExisitingArtifact(artifactId, chStmt.getString("guid"),
+ chStmt.getString("human_readable_id"), artifactType, chStmt.getInt("gamma_id"), transactionId,
+ ModificationType.getMod(chStmt.getInt("mod_type")), historical);
+
+ } else if (reload) {
+ artifact.internalSetPersistenceData(chStmt.getInt("gamma_id"), transactionId,
+ ModificationType.getMod(chStmt.getInt("mod_type")), historical);
+ }
+ return artifact;
+ }
+
+ static void loadArtifactData(Artifact artifact, ArtifactLoad loadLevel) throws OseeCoreException {
+ int queryId = getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ try {
+ ConnectionHandler.runPreparedUpdate(INSERT_JOIN_ARTIFACT, queryId, insertTime, artifact.getArtId(),
+ artifact.getBranch().getBranchId(), SQL3DataType.INTEGER);
+
+ List<Artifact> artifacts = new ArrayList<Artifact>(1);
+ artifacts.add(artifact);
+ loadArtifactsData(queryId, artifacts, loadLevel, false, false, artifact.isDeleted());
+ } finally {
+ clearQuery(queryId);
+ }
+ }
+
+ private static void loadArtifactsData(int queryId, Collection<Artifact> artifacts, ArtifactLoad loadLevel, boolean reload, boolean historical, boolean allowDeleted) throws OseeCoreException {
+ if (reload) {
+ for (Artifact artifact : artifacts) {
+ artifact.prepareForReload();
+ }
+ }
+
+ loadAttributeData(queryId, artifacts, historical, allowDeleted, loadLevel);
+ loadRelationData(queryId, artifacts, historical, loadLevel);
+
+ for (Artifact artifact : artifacts) {
+ artifact.onInitializationComplete();
+ if (reload) {
+ OseeEventManager.kickArtifactModifiedEvent(ArtifactLoader.class, ArtifactModType.Reverted, artifact);
+ }
+ }
+ }
+
+ private static void loadRelationData(int queryId, Collection<Artifact> artifacts, boolean historical, ArtifactLoad loadLevel) throws OseeCoreException {
+ if (loadLevel == SHALLOW || loadLevel == ArtifactLoad.ATTRIBUTE) {
+ return;
+ }
+
+ if (historical) {
+ return; // TODO: someday we might have a use for historical relations, but not now
+ }
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(artifacts.size() * 8, ClientSessionManager.getSQL(OseeSql.Load.SELECT_RELATIONS),
+ queryId);
+ while (chStmt.next()) {
+ int relationId = chStmt.getInt("rel_link_id");
+ int aArtifactId = chStmt.getInt("a_art_id");
+ int bArtifactId = chStmt.getInt("b_art_id");
+ Branch aBranch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+ Branch bBranch = aBranch; // TODO these branch ids need to come from the relation link table
+ RelationType relationType = RelationTypeManager.getType(chStmt.getInt("rel_link_type_id"));
+
+ RelationLink relation =
+ RelationManager.getLoadedRelation(relationType, aArtifactId, bArtifactId, aBranch, bBranch);
+
+ if (relation == null) {
+ int aOrderValue = chStmt.getInt("a_order");
+ int bOrderValue = chStmt.getInt("b_order");
+ int gammaId = chStmt.getInt("gamma_id");
+ String rationale = chStmt.getString("rationale");
+
+ relation =
+ new RelationLink(aArtifactId, bArtifactId, aBranch, bBranch, relationType, relationId, gammaId,
+ rationale, aOrderValue, bOrderValue);
+
+ }
+ RelationManager.manageRelation(relation, RelationSide.SIDE_A);
+ RelationManager.manageRelation(relation, RelationSide.SIDE_B);
+ }
+ } finally {
+ chStmt.close();
+ }
+ Map<Integer, RelationLink> sideB = new HashMap<Integer, RelationLink>();
+ Map<Integer, RelationLink> sideA = new HashMap<Integer, RelationLink>();
+ for (Artifact artifact : artifacts) {
+ artifact.setLinksLoaded();
+ RelationManager.sortRelations(artifact, sideA, sideB);
+ }
+ }
+
+ private static void loadAttributeData(int queryId, Collection<Artifact> artifacts, boolean historical, boolean allowDeletedArtifacts, ArtifactLoad loadLevel) throws OseeCoreException {
+ if (loadLevel == SHALLOW || loadLevel == ArtifactLoad.RELATION) {
+ return;
+ }
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ if (historical) {
+ chStmt.runPreparedQuery(artifacts.size() * 8,
+ ClientSessionManager.getSQL(OseeSql.Load.SELECT_HISTORICAL_ATTRIBUTES), queryId);
+ } else {
+ String sql;
+
+ if (loadLevel == ArtifactLoad.ALL_CURRENT) {
+ sql = ClientSessionManager.getSQL(OseeSql.Load.SELECT_ALL_CURRENT_ATTRIBUTES);
+ } else {
+ sql =
+ allowDeletedArtifacts ? ClientSessionManager.getSQL(OseeSql.Load.SELECT_CURRENT_ATTRIBUTES_WITH_DELETED) : ClientSessionManager.getSQL(OseeSql.Load.SELECT_CURRENT_ATTRIBUTES);
+ }
+
+ chStmt.runPreparedQuery(artifacts.size() * 8, sql, queryId);
+ }
+
+ Artifact artifact = null;
+ int previousArtifactId = -1;
+ int previousBranchId = -1;
+ int previousAttrId = -1;
+
+ while (chStmt.next()) {
+ int artifactId = chStmt.getInt("art_id");
+ int branchId = chStmt.getInt("branch_id");
+ int attrId = chStmt.getInt("attr_id");
+
+ // if a different artifact than the previous iteration
+ if (branchId != previousBranchId || artifactId != previousArtifactId) {
+ if (artifact != null) { // exclude the first pass because there is no previous artifact
+ // meet minimum attributes for the previous artifact since its existing attributes have already been loaded
+ artifact.meetMinimumAttributeCounts(false);
+ ArtifactCache.cachePostAttributeLoad(artifact);
+ }
+
+ if (historical) {
+ artifact = ArtifactCache.getHistorical(artifactId, chStmt.getInt("stripe_transaction_id"));
+ } else {
+ artifact = ArtifactCache.getActive(artifactId, branchId);
+ }
+ if (artifact == null) {
+ //TODO just masking a DB issue, we should probably really have an error here - throw new ArtifactDoesNotExist("Can not find aritfactId: " + artifactId + " on branch " + branchId);
+ OseeLog.log(ArtifactLoader.class, Level.WARNING, String.format(
+ "Orphaned attribute for artifact id[%d] branch[%d]", artifactId, branchId));
+ } else if (artifact.isAttributesLoaded()) {
+ artifact = null;
+ }
+ }
+
+ // if a different attribute than the previous iteration and its attribute had not already been loaded
+ if ((attrId != previousAttrId || branchId != previousBranchId) && artifact != null) {
+ Attribute.initializeAttribute(artifact, chStmt.getInt("attr_type_id"), attrId,
+ chStmt.getInt("gamma_id"), ModificationType.getMod(chStmt.getInt("mod_type")), false,
+ chStmt.getString("value"), chStmt.getString("uri"));
+ }
+ previousArtifactId = artifactId;
+ previousBranchId = branchId;
+ previousAttrId = attrId;
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static int getNewQueryId() {
+ return (int) (Math.random() * Integer.MAX_VALUE);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactModType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactModType.java
new file mode 100644
index 00000000000..420deb528a2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactModType.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.framework.skynet.core.artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum ArtifactModType {
+
+ Deleted, Added, Changed,
+
+ // Dirtied artifact was reloaded to last saved state (not propagated remotely)
+ // This is a Local modification type only and will not get transmitted as part of the transaction event
+ Reverted
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactPersistenceManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactPersistenceManager.java
new file mode 100644
index 00000000000..75aea19488d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactPersistenceManager.java
@@ -0,0 +1,522 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.schema.LocalAliasTable;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.RelatedToSearch;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public class ArtifactPersistenceManager {
+ private static final LocalAliasTable ATTRIBUTE_ALIAS_1 = new LocalAliasTable(ATTRIBUTE_VERSION_TABLE, "t1");
+ private static final LocalAliasTable ATTRIBUTE_ALIAS_2 = new LocalAliasTable(ATTRIBUTE_VERSION_TABLE, "t2");
+
+ private static final String PURGE_BASELINE_ATTRIBUTE_TRANS =
+ "DELETE from " + TRANSACTIONS_TABLE + " T2 WHERE EXISTS (SELECT 'x' from " + TRANSACTION_DETAIL_TABLE + " T1, " + ATTRIBUTE_VERSION_TABLE + " T3 WHERE T1.transaction_id = T2.transaction_id and T3.gamma_id = T2.gamma_id and T1.tx_type = " + TransactionDetailsType.Baselined.getId() + " and T1.branch_id = ? and T3.art_id = ?)";
+ private static final String PURGE_BASELINE_RELATION_TRANS =
+ "DELETE from " + TRANSACTIONS_TABLE + " T2 WHERE EXISTS (SELECT 'x' from " + TRANSACTION_DETAIL_TABLE + " T1, " + RELATION_LINK_VERSION_TABLE + " T3 WHERE T1.transaction_id = T2.transaction_id and T3.gamma_id = T2.gamma_id and T1.tx_type = " + TransactionDetailsType.Baselined.getId() + " and T1.branch_id = ? and (T3.a_art_id = ? or T3.b_art_id = ?))";
+ private static final String PURGE_BASELINE_ARTIFACT_TRANS =
+ "DELETE from " + TRANSACTIONS_TABLE + " T2 WHERE EXISTS (SELECT 'x' from " + TRANSACTION_DETAIL_TABLE + " T1, " + ARTIFACT_VERSION_TABLE + " T3 WHERE T1.transaction_id = T2.transaction_id and T3.gamma_id = T2.gamma_id and T1.tx_type = " + TransactionDetailsType.Baselined.getId() + " and T1.branch_id = ? and T3.art_id = ?)";
+
+ private static final String GET_GAMMAS_ARTIFACT_REVERT =
+ "SELECT txs1.gamma_id, txd1.tx_type, txs1.transaction_id FROM osee_tx_details txd1, osee_txs txs1, osee_attribute atr1 where txd1.transaction_id = txs1.transaction_id and txs1.gamma_id = atr1.gamma_id and txd1.branch_id = ? and atr1.art_id = ? UNION ALL SELECT txs2.gamma_id, txd2.tx_type, txs2.transaction_id FROM osee_tx_details txd2, osee_txs txs2, osee_relation_link rel2 where txd2.transaction_id = txs2.transaction_id and txs2.gamma_id = rel2.gamma_id and txd2.branch_id = ? and (rel2.a_art_id = ? or rel2.b_art_id = ?) UNION ALL SELECT txs3.gamma_id, txd3.tx_type, txs3.transaction_id FROM osee_tx_details txd3, osee_txs txs3, osee_artifact_version art3 where txd3.transaction_id = txs3.transaction_id and txs3.gamma_id = art3.gamma_id and txd3.branch_id = ? and art3.art_id = ?";
+
+ private static final String GET_GAMMAS_RELATION_REVERT =
+ "SELECT txs2.gamma_id, txd2.tx_type, txs2.transaction_id FROM osee_tx_details txd2, osee_txs txs2, osee_relation_link rel2 where txd2.transaction_id = txs2.transaction_id and txs2.gamma_id = rel2.gamma_id and txd2.branch_id = ? and rel2.rel_link_id = ?";
+
+ private static final String GET_GAMMAS_ATTRIBUTE_REVERT =
+ "SELECT txs2.gamma_id, txd2.tx_type, txs2.transaction_id FROM osee_tx_details txd2, osee_txs txs2, osee_attribute atr2 where txd2.transaction_id = txs2.transaction_id and txs2.gamma_id = atr2.gamma_id and txd2.branch_id = ? and atr2.attr_id = ?";
+
+ private static final String PURGE_ATTRIBUTE = "DELETE FROM osee_attribute WHERE attr_id = ?";
+ private static final String PURGE_ATTRIBUTE_GAMMAS =
+ "DELETE" + " FROM " + TRANSACTIONS_TABLE + " WHERE gamma_id IN" + "(SELECT gamma_id" + " FROM " + ATTRIBUTE_VERSION_TABLE + " WHERE attr_id = ?)";
+
+ private static final String SELECT_ATTRIBUTES_FOR_ARTIFACT =
+ "SELECT " + ATTRIBUTE_ALIAS_1.columns("attr_id", "attr_type_id", "gamma_id", "value", "uri") + " FROM " + ATTRIBUTE_ALIAS_1 + "," + TRANSACTIONS_TABLE + " WHERE " + ATTRIBUTE_ALIAS_1.column("art_id") + "=?" + " AND " + ATTRIBUTE_ALIAS_1.column("modification_id") + "<> ?" + " AND " + ATTRIBUTE_ALIAS_1.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + "(SELECT MAX(" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + ")" + " FROM " + ATTRIBUTE_ALIAS_2 + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + ATTRIBUTE_ALIAS_2.column("attr_id") + "=" + ATTRIBUTE_ALIAS_1.column("attr_id") + " AND " + ATTRIBUTE_ALIAS_2.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " <= ?" + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)";
+
+ private static final String UPDATE_ARTIFACT_TYPE = "UPDATE osee_artifact SET art_type_id = ? WHERE art_id =?";
+
+ private static final String SELECT_ARTIFACT_START =
+ "SELECT art1.*, txs1.*, txd1.* FROM osee_artifact art1, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE ";
+ private static final String SELECT_ARTIFACT_END =
+ " AND art1.art_id = arv1.art_id AND arv1.gamma_id = txs1.gamma_id AND txs1.transaction_id <= ? AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = ? order by txs1.transaction_id desc";
+ private static final String SELECT_ARTIFACT_BY_GUID = SELECT_ARTIFACT_START + "art1.guid =?" + SELECT_ARTIFACT_END;
+ private static final String SELECT_ARTIFACT_BY_ID = SELECT_ARTIFACT_START + "art1.art_id =?" + SELECT_ARTIFACT_END;
+
+ private static final String ARTIFACT_SELECT =
+ "SELECT osee_artifact.art_id, txd1.branch_id FROM osee_artifact, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE " + ARTIFACT_TABLE.column("art_id") + "=arv1.art_id AND arv1.gamma_id=txs1.gamma_id AND txs1.tx_current=" + TxChange.CURRENT.getValue() + " AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id=? AND ";
+
+ private static final String ARTIFACT_ID_SELECT =
+ "SELECT " + ARTIFACT_TABLE.columns("art_id") + " FROM " + ARTIFACT_TABLE + " WHERE ";
+
+ private static final String ARTIFACT_NEW_ON_BRANCH =
+ "Select det.tx_type from osee_tx_details det, osee_txs txs, osee_artifact_version art WHERE det.branch_id = ? AND det.tx_type = 1 AND det.transaction_id = txs.transaction_id AND txs.gamma_id = art.gamma_id AND art.art_id = ?";
+ private static final String ATTRIBUTE_NEW_ON_BRANCH =
+ "Select det.tx_type from osee_tx_details det, osee_txs txs, osee_attribute atr WHERE det.branch_id = ? AND det.tx_type = 1 AND det.transaction_id = txs.transaction_id AND txs.gamma_id = atr.gamma_id AND atr.attr_id = ?";
+ private static final String RELATION_NEW_ON_BRANCH =
+ "Select det.tx_type from osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE det.branch_id = ? AND det.tx_type = 1 AND det.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id AND rel.rel_link_id = ?";
+
+ private static final ArtifactPersistenceManager instance = new ArtifactPersistenceManager();
+
+ public static boolean initFinished = false;
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Persistence"));
+
+ private ArtifactPersistenceManager() {
+ }
+
+ public static ArtifactPersistenceManager getInstance() {
+ return instance;
+ }
+
+ /**
+ * This method acquires <code>Artifact</code>'s directly from the database. This should only be called by factories
+ * since all caching is performed by the factory.
+ *
+ * @param guid The guid of the artifact.
+ * @return The <code>Artifact</code> from the database that corresponds to the supplied guid. call the method below
+ * directly instead
+ * @see ArtifactQuery#getHistoricalArtifactFromId(String, TransactionId, boolean)
+ */
+ @Deprecated
+ public Artifact getArtifact(String guid, TransactionId transactionId) throws OseeCoreException {
+ return ArtifactQuery.getHistoricalArtifactFromId(guid, transactionId, true);
+ }
+
+ public Artifact getArtifactFromId(int artId, TransactionId transactionId) throws OseeCoreException {
+ return getArtifactInternal(transactionId, SELECT_ARTIFACT_BY_ID, null, artId, false);
+ }
+
+ @Deprecated
+ private Artifact getArtifactInternal(TransactionId transactionLimit, String query, String guid, int artId, boolean useGuid) throws OseeCoreException {
+ // First try to acquire the artifact from cache
+ Artifact artifact;
+ Object data;
+ String idString;
+ if (useGuid) {
+ artifact = ArtifactCache.getHistorical(guid, transactionLimit.getTransactionNumber());
+ data = guid;
+ idString = "guid \"" + guid + "\"";
+ } else {
+ artifact = ArtifactCache.getHistorical(artId, transactionLimit.getTransactionNumber());
+ data = artId;
+ idString = "id \"" + artId + "\"";
+ }
+
+ // If it wasn't found, then it must be acquired from the database
+ if (artifact == null) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(1, query, data, transactionLimit.getTransactionNumber(),
+ transactionLimit.getBranchId());
+
+ if (!chStmt.next()) {
+ throw new OseeStateException(
+ "The artifact with " + idString + " does not exist for transaction \"" + transactionLimit + "\"");
+ }
+
+ ArtifactType artifactType = ArtifactTypeManager.getType(chStmt.getInt("art_type_id"));
+ ArtifactFactory factory = artifactType.getFactory();
+ TransactionId transactionId = TransactionIdManager.getTransactionId(chStmt);
+
+ artifact =
+ factory.loadExisitingArtifact(chStmt.getInt("art_id"), chStmt.getString("guid"),
+ chStmt.getString("human_readable_id"), artifactType, chStmt.getInt("gamma_id"), transactionId,
+ ModificationType.getMod(chStmt.getInt("mod_type")), true);
+
+ setAttributesOnHistoricalArtifact(artifact);
+
+ artifact.onInitializationComplete();
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ return artifact;
+ }
+
+ public static CharSequence getSelectArtIdSql(ISearchPrimitive searchCriteria, List<Object> dataList, Branch branch) {
+ return getSelectArtIdSql(searchCriteria, dataList, null, branch);
+ }
+
+ public static CharSequence getSelectArtIdSql(ISearchPrimitive searchCriteria, List<Object> dataList, String alias, Branch branch) {
+ StringBuilder sql = new StringBuilder();
+
+ sql.append("SELECT ");
+ sql.append(searchCriteria.getArtIdColName());
+
+ if (alias != null) {
+ sql.append(" AS " + alias);
+ }
+
+ sql.append(" FROM ");
+ sql.append(searchCriteria.getTableSql(dataList, branch));
+
+ String criteriaSql = searchCriteria.getCriteriaSql(dataList, branch);
+ if (criteriaSql.trim().length() != 0) {
+ sql.append(" WHERE (");
+ sql.append(criteriaSql);
+ sql.append(")");
+ }
+
+ return sql;
+ }
+
+ public static String getIdSql(List<ISearchPrimitive> searchCriteria, boolean all, List<Object> dataList, Branch branch) {
+ return getSql(searchCriteria, all, ARTIFACT_ID_SELECT, dataList, branch);
+ }
+
+ private static String getSql(ISearchPrimitive searchCriteria, String header, List<Object> dataList, Branch branch) {
+ StringBuilder sql = new StringBuilder(header);
+
+ sql.append(ARTIFACT_TABLE.column("art_id") + " in (");
+ sql.append(getSelectArtIdSql(searchCriteria, dataList, branch));
+ sql.append(")");
+
+ return sql.toString();
+ }
+
+ private static String getSql(List<ISearchPrimitive> searchCriteria, boolean all, String header, List<Object> dataList, Branch branch) {
+ StringBuilder sql = new StringBuilder(header);
+
+ if (all) {
+ ISearchPrimitive primitive = null;
+ Iterator<ISearchPrimitive> iter = searchCriteria.iterator();
+
+ while (iter.hasNext()) {
+ primitive = iter.next();
+ sql.append(ARTIFACT_TABLE.column("art_id") + " in (");
+ sql.append(getSelectArtIdSql(primitive, dataList, branch));
+
+ if (iter.hasNext()) {
+ sql.append(") AND ");
+ }
+ }
+ sql.append(")");
+ } else {
+ ISearchPrimitive primitive = null;
+ Iterator<ISearchPrimitive> iter = searchCriteria.iterator();
+
+ sql.append(ARTIFACT_TABLE.column("art_id") + " IN(SELECT art_id FROM " + ARTIFACT_TABLE + ", (");
+
+ while (iter.hasNext()) {
+ primitive = iter.next();
+ sql.append(getSelectArtIdSql(primitive, dataList, "desired_art_id", branch));
+ if (iter.hasNext()) sql.append(" UNION ALL ");
+ }
+ sql.append(") ORD_ARTS");
+ sql.append(" WHERE art_id = ORD_ARTS.desired_art_id");
+
+ sql.append(")");
+ }
+
+ return sql.toString();
+ }
+
+ @Deprecated
+ public Collection<Artifact> getArtifacts(ISearchPrimitive searchCriteria, Branch branch) throws OseeCoreException {
+ LinkedList<Object> queryParameters = new LinkedList<Object>();
+ queryParameters.add(branch.getBranchId());
+ return ArtifactLoader.getArtifacts(getSql(searchCriteria, ARTIFACT_SELECT, queryParameters, branch),
+ queryParameters.toArray(), 100, ArtifactLoad.FULL, false, null, null, false);
+ }
+
+ @Deprecated
+ public Collection<Artifact> getArtifacts(List<ISearchPrimitive> searchCriteria, boolean all, Branch branch, ISearchConfirmer confirmer) throws OseeCoreException {
+ LinkedList<Object> queryParameters = new LinkedList<Object>();
+ queryParameters.add(branch.getBranchId());
+ return ArtifactLoader.getArtifacts(getSql(searchCriteria, all, ARTIFACT_SELECT, queryParameters, branch),
+ queryParameters.toArray(), 100, ArtifactLoad.FULL, false, confirmer, null, false);
+ }
+
+ @Deprecated
+ public static Collection<Artifact> getArtifacts(List<ISearchPrimitive> searchCriteria, boolean all, Branch branch) throws OseeCoreException {
+ return instance.getArtifacts(searchCriteria, all, branch, null);
+ }
+
+ /**
+ * Acquires the user defined attributes for an artifact. If none are in the table, then it returns the 'default set'
+ * of attributes for the artifact.
+ *
+ * @param artifact The artifact to acquire the attributes for.
+ * @param branch The tag to get the data for.
+ * @throws OseeDataStoreException
+ * @throws OseeCoreException
+ */
+ private static void setAttributesOnHistoricalArtifact(Artifact artifact) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ // Acquire previously stored attributes
+ chStmt.runPreparedQuery(SELECT_ATTRIBUTES_FOR_ARTIFACT, artifact.getArtId(),
+ ModificationType.DELETED.getValue(), artifact.getTransactionNumber(), artifact.getBranch().getBranchId());
+
+ while (chStmt.next()) {
+ Attribute.initializeAttribute(artifact, chStmt.getInt("attr_type_id"), chStmt.getInt("attr_id"),
+ chStmt.getInt("gamma_id"), chStmt.getString("value"), chStmt.getString("uri"));
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ artifact.meetMinimumAttributeCounts(false);
+ }
+
+ /**
+ * This method returns 1000 of the ids, removing them from the collection
+ *
+ * @param artifacts
+ */
+ public String getArtIdList(final ArrayList<Artifact> artifacts) {
+ StringBuilder artIdList = new StringBuilder();
+ int count = -1;
+ while (!artifacts.isEmpty() && count++ < 999) {
+ if (count > 0) artIdList.append(",");
+ artIdList.append(artifacts.remove(0).getArtId());
+ }
+
+ return artIdList.toString();
+ }
+
+ /**
+ * @param transaction if the transaction is null then persist is not called otherwise
+ * @param overrideDeleteCheck if <b>true</b> deletes without checking preconditions
+ * @param artifacts The artifacts to delete.
+ */
+ public static void deleteArtifact(SkynetTransaction transaction, boolean overrideDeleteCheck, final Artifact... artifacts) throws OseeCoreException {
+ if (artifacts.length == 0) return;
+
+ if (!overrideDeleteCheck) {
+ // Confirm artifacts are fit to delete
+ for (IArtifactCheck check : ArtifactChecks.getArtifactChecks()) {
+ IStatus result = check.isDeleteable(Arrays.asList(artifacts));
+ if (!result.isOK()) {
+ throw new OseeStateException(result.getMessage());
+ }
+ }
+ }
+ //Bulk Load Artifacts
+ Collection<Integer> artIds = new LinkedList<Integer>();
+ for (Artifact artifact : artifacts) {
+ for (RelationLink link : artifact.getRelationsAll(false)) {
+ if (link.getRelationType().isOrdered()) {
+ artIds.add(artifact.getArtId() == link.getAArtifactId() ? link.getBArtifactId() : link.getAArtifactId());
+ }
+ }
+ }
+ Branch branch = artifacts[0].getBranch();
+ ArtifactQuery.getArtifactsFromIds(artIds, branch, true);
+
+ for (Artifact artifact : artifacts) {
+ deleteTrace(artifact, transaction, true);
+ }
+ }
+
+ /**
+ * @param artifact
+ * @param builder
+ * @param reorderReloations
+ * @throws Exception
+ */
+ private static void deleteTrace(Artifact artifact, SkynetTransaction transaction, boolean reorderRelations) throws OseeCoreException {
+ if (!artifact.isDeleted()) {
+ // This must be done first since the the actual deletion of an artifact clears out the link manager
+ for (Artifact childArtifact : artifact.getChildren()) {
+ deleteTrace(childArtifact, transaction, false);
+ }
+ try {
+ artifact.setDeleted();
+ RelationManager.deleteRelationsAll(artifact, reorderRelations);
+ if (transaction != null) {
+ artifact.persistAttributesAndRelations(transaction);
+ }
+ } catch (OseeCoreException ex) {
+ artifact.resetToPreviousModType();
+ throw ex;
+ }
+ }
+ }
+
+ /**
+ * Removes an artifact, it's attributes and any relations that have become invalid from the removal of this artifact
+ * from the database. It also removes all history associated with this artifact (i.e. all transactions and gamma ids
+ * will also be removed from the database only for the branch it is on).
+ *
+ * @param artifact
+ */
+ public static void purgeArtifactFromBranch(OseeConnection connection, int branchId, int artId) throws OseeCoreException {
+ revertArtifact(connection, branchId, artId);
+
+ //Remove from Baseline
+ ConnectionHandler.runPreparedUpdate(connection, PURGE_BASELINE_ATTRIBUTE_TRANS, branchId, artId);
+ ConnectionHandler.runPreparedUpdate(connection, PURGE_BASELINE_RELATION_TRANS, branchId, artId, artId);
+ ConnectionHandler.runPreparedUpdate(connection, PURGE_BASELINE_ARTIFACT_TRANS, branchId, artId);
+ }
+
+ public static void revertAttribute(OseeConnection connection, Attribute<?> attribute) throws OseeCoreException {
+ if (attribute == null) return;
+ revertAttribute(connection, attribute.getArtifact().getBranch().getBranchId(),
+ attribute.getArtifact().getArtId(), attribute.getAttrId());
+ }
+
+ public static void revertAttribute(OseeConnection connection, int branchId, int artId, int attributeId) throws OseeCoreException {
+ TransactionId transId =
+ TransactionIdManager.createNextTransactionId(BranchManager.getBranch(branchId), UserManager.getUser(), "");
+ long totalTime = System.currentTimeMillis();
+ //Get attribute Gammas
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ RevertAction revertAction = null;
+ try {
+ chStmt.runPreparedQuery(GET_GAMMAS_ATTRIBUTE_REVERT, branchId, attributeId);
+ revertAction = new RevertAction(connection, chStmt, transId);
+ revertAction.revertObject(totalTime, artId, "Attribute");
+ } finally {
+ chStmt.close();
+ }
+ revertAction.fixArtifactVersionForAttributeRevert(branchId, artId);
+ }
+
+ /**
+ * Should NOT be used for relation types that maintain order. Not handled yet
+ */
+ public static void revertRelationLink(OseeConnection connection, RelationLink link) throws OseeCoreException {
+ //Only reverts relation links that don't span multiple branches. Need to revisit if additional functionality is needed.
+ if (!link.getArtifactA().getBranch().equals(link.getArtifactB().getBranch())) {
+ throw new OseeArgumentException(String.format("Can not revert Relation %d. Relation spans multiple branches",
+ link.getRelationId()));
+ }
+ revertRelationLink(connection, link.getArtifactA().getBranch().getBranchId(), link.getRelationId(),
+ link.getArtifactA().getArtId(), link.getArtifactB().getArtId());
+ }
+
+ private static void revertRelationLink(OseeConnection connection, int branchId, int relLinkId, int aArtId, int bArtId) throws BranchDoesNotExist, OseeCoreException {
+ long time = System.currentTimeMillis();
+ long totalTime = time;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+
+ TransactionId transId =
+ TransactionIdManager.createNextTransactionId(BranchManager.getBranch(branchId), UserManager.getUser(), "");
+
+ try {
+ chStmt.runPreparedQuery(GET_GAMMAS_RELATION_REVERT, branchId, relLinkId);
+ new RevertAction(connection, chStmt, transId).revertObject(totalTime, relLinkId, "Relation Link");
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static void revertArtifact(OseeConnection connection, Artifact artifact) throws OseeCoreException {
+ if (artifact == null) return;
+ revertArtifact(connection, artifact.getBranch().getBranchId(), artifact.getArtId());
+ }
+
+ public static void revertArtifact(OseeConnection connection, int branchId, int artId) throws OseeCoreException {
+ TransactionId transId =
+ TransactionIdManager.createNextTransactionId(BranchManager.getBranch(branchId), UserManager.getUser(), "");
+ long totalTime = System.currentTimeMillis();
+ //Get attribute Gammas
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(GET_GAMMAS_ARTIFACT_REVERT, branchId, artId, branchId, artId, artId, branchId, artId);
+ new RevertAction(connection, chStmt, transId).revertObject(totalTime, artId, "Artifact");
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public void bulkLoadArtifacts(Collection<? extends Artifact> arts, Branch branch) throws OseeCoreException {
+ if (arts.size() == 0) return;
+
+ List<ISearchPrimitive> bulkLoad = new LinkedList<ISearchPrimitive>();
+ for (Artifact art : arts) {
+ bulkLoad.add(new RelatedToSearch(art.getArtId(), true));
+ bulkLoad.add(new RelatedToSearch(art.getArtId(), false));
+ }
+ getArtifacts(bulkLoad, false, branch);
+ }
+
+ /**
+ * Changes the artifact type
+ *
+ * @param artifact
+ * @param artifactType
+ * @throws OseeDataStoreException
+ */
+ public static void changeArtifactSubStype(Artifact artifact, ArtifactType artifactType) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(UPDATE_ARTIFACT_TYPE, artifactType.getArtTypeId(), artifact.getArtId());
+ }
+
+ /**
+ * Purge attribute from the database.
+ *
+ * @param attribute
+ * @throws OseeDataStoreException
+ */
+ public static void purgeAttribute(Attribute<?> attribute, int attributeId) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(PURGE_ATTRIBUTE_GAMMAS, attributeId);
+ ConnectionHandler.runPreparedUpdate(PURGE_ATTRIBUTE, attributeId);
+ }
+
+ public static void purgeArtifacts(Collection<? extends Artifact> artifactsToPurge) throws OseeCoreException {
+ new PurgeDbTransaction(artifactsToPurge).execute();
+ }
+
+ public static boolean isArtifactNewOnBranch(Artifact artifact) throws OseeDataStoreException {
+ return (ConnectionHandler.runPreparedQueryFetchInt(-1, ARTIFACT_NEW_ON_BRANCH,
+ artifact.getBranch().getBranchId(), artifact.getArtId()) == -1);
+ }
+
+ public static boolean isAttributeNewOnBranch(Attribute<?> attribute) throws OseeDataStoreException {
+ return (ConnectionHandler.runPreparedQueryFetchInt(-1, ATTRIBUTE_NEW_ON_BRANCH,
+ attribute.getArtifact().getBranch().getBranchId(), attribute.getAttrId()) == -1);
+ }
+
+ public static boolean isRelationNewOnBranch(RelationLink relation, Branch branch) throws OseeDataStoreException {
+ return (ConnectionHandler.runPreparedQueryFetchInt(-1, RELATION_NEW_ON_BRANCH, branch.getBranchId(),
+ relation.getRelationId()) == -1);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactProcessor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactProcessor.java
new file mode 100644
index 00000000000..0e106c57aef
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactProcessor.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.framework.skynet.core.artifact;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ArtifactProcessor {
+ void run(Artifact artifact) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTransactionData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTransactionData.java
new file mode 100644
index 00000000000..6528aa7a693
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTransactionData.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.framework.skynet.core.artifact;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactTransactionModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactTransactionData extends BaseTransactionData {
+ private static final String INSERT_ARTIFACT =
+ "INSERT INTO osee_artifact (art_id, art_type_id, guid, human_readable_id) VALUES (?, ?, ?, ?)";
+
+ private static final String INSERT_ARTIFACT_VERSION =
+ "INSERT INTO osee_artifact_version (art_id, gamma_id, modification_id) VALUES (?,?,?)";
+
+ private final Artifact artifact;
+
+ public ArtifactTransactionData(Artifact artifact, ModificationType modificationType) throws OseeDataStoreException {
+ super(artifact.getArtId(), modificationType, artifact.isReflected());
+ this.artifact = artifact;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#getSelectTxNotCurrentSql()
+ */
+ @Override
+ public String getSelectTxNotCurrentSql() {
+ return OseeSql.Transaction.SELECT_PREVIOUS_TX_NOT_CURRENT_ARTIFACTS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#addInsertToBatch(org.eclipse.osee.framework.jdk.core.type.HashCollection)
+ */
+ @Override
+ protected void addInsertToBatch(SkynetTransaction transaction) throws OseeCoreException {
+ super.addInsertToBatch(transaction);
+ if (!useExistingBackingData()) {
+ if (getModificationType() == ModificationType.NEW) {
+ internalAddInsertToBatch(transaction, 1, INSERT_ARTIFACT, artifact.getArtId(), artifact.getArtTypeId(),
+ artifact.getGuid(), artifact.getHumanReadableId());
+ }
+ internalAddInsertToBatch(transaction, 2, INSERT_ARTIFACT_VERSION, getItemId(), getGammaId(),
+ getModificationType().getValue());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalUpdate(org.eclipse.osee.framework.skynet.core.transaction.TransactionId)
+ */
+ @Override
+ protected void internalUpdate(TransactionId transactionId) throws OseeCoreException {
+ artifact.internalSetPersistenceData(getGammaId(), transactionId, getModificationType(), false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalClearDirtyState()
+ */
+ @Override
+ protected void internalClearDirtyState() {
+ artifact.setNotDirty();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalOnRollBack()
+ */
+ @Override
+ protected void internalOnRollBack() throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#createGammaId()
+ */
+ @Override
+ protected int createGammaId() throws OseeCoreException {
+ if (useExistingBackingData()) {
+ return artifact.getGammaId();
+ }
+ return SequenceManager.getNextGammaId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalAsModifiedEvent()
+ */
+ @Override
+ protected void internalAddToEvents(Collection<ArtifactTransactionModifiedEvent> events) throws OseeCoreException {
+ ArtifactModType artifactModType;
+ switch (getModificationType()) {
+ case MODIFIED:
+ artifactModType = ArtifactModType.Changed;
+ break;
+ case DELETED:
+ artifactModType = ArtifactModType.Deleted;
+ break;
+ default:
+ artifactModType = ArtifactModType.Added;
+ break;
+ }
+ events.add(new ArtifactModifiedEvent(new Sender(this.getClass().getName()), artifactModType, artifact,
+ artifact.getTransactionNumber(), artifact.getDirtySkynetAttributeChanges()));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactType.java
new file mode 100644
index 00000000000..c76fbe150b7
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactType.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.factory.ArtifactFactoryManager;
+
+/**
+ * Description of an Artifact subtype. The descriptor can be used to create new artifacts that are of the type of this
+ * descriptor. <br/>
+ * <br/>
+ * Descriptors can be acquired from the configuration manager.
+ *
+ * @see org.eclipse.osee.framework.skynet.core.attribute.ConfigurationPersistenceManager
+ * @author Robert A. Fisher
+ */
+public class ArtifactType implements Serializable, Comparable<ArtifactType> {
+ private static final long serialVersionUID = 1L;
+ private final int artTypeId;
+ private String name;
+ private final String namespace;
+
+ ArtifactType(int artTypeId, String namespace, String name) throws OseeDataStoreException {
+ this.artTypeId = artTypeId;
+ this.name = name;
+ this.namespace = namespace == null ? "" : namespace;
+ ArtifactTypeManager.cache(this);
+ }
+
+ /**
+ * Get a new instance of the type of artifact described by this descriptor. This is just a convenience method that
+ * calls makeNewArtifact on the known factory with this descriptor for the descriptor parameter, and the supplied
+ * branch.
+ *
+ * @return Return artifact reference
+ * @throws OseeCoreException
+ * @see ArtifactFactory#makeNewArtifact(Branch, ArtifactType)
+ * @use {@link ArtifactTypeManager}.addArtifact
+ */
+ public Artifact makeNewArtifact(Branch branch) throws OseeCoreException {
+ return getFactory().makeNewArtifact(branch, this, null, null, null);
+ }
+
+ /**
+ * Get a new instance of the type of artifact described by this descriptor. This is just a convenience method that
+ * calls makeNewArtifact on the known factory with this descriptor for the descriptor parameter, and the supplied
+ * branch.
+ *
+ * @param branch branch on which artifact will be created
+ * @return Return artifact reference
+ * @throws OseeCoreException
+ * @see ArtifactFactory#makeNewArtifact(Branch, ArtifactType, String, String, ArtifactProcessor)
+ * @use {@link ArtifactTypeManager}.addArtifact
+ */
+ public Artifact makeNewArtifact(Branch branch, String guid, String humandReadableId) throws OseeCoreException {
+ return getFactory().makeNewArtifact(branch, this, guid, humandReadableId, null);
+ }
+
+ /**
+ * @return Returns the artTypeId.
+ */
+ public int getArtTypeId() {
+ return artTypeId;
+ }
+
+ /**
+ * @return Returns the factory.
+ */
+ public ArtifactFactory getFactory() throws OseeCoreException {
+ return ArtifactFactoryManager.getFactory(name);
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * determines if this artifact type is equal to or a subclass of the artifact type referenced by artifactTypeName
+ *
+ * @return true if compatible
+ */
+ public boolean isTypeCompatible(String artifactTypeName) {
+ return name.equals(artifactTypeName);
+ }
+
+ /**
+ * Determine if this is the descriptor that produces the same type of artifact as an already existing artifact.
+ *
+ * @param artifact The artifact to compare against.
+ * @return <b>true</b> if and only if this descriptor will give you the same type of artifact.
+ * @throws OseeCoreException
+ */
+ public boolean canProduceArtifact(Artifact artifact) throws OseeCoreException {
+ return artifact.getArtTypeId() == artTypeId && getFactory() != null;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ /**
+ * Only store the identifying data since a manager controls this object.
+ *
+ * @param stream
+ * @throws IOException
+ */
+ private void writeObject(ObjectOutputStream stream) throws IOException {
+ stream.writeObject(name);
+ }
+
+ /**
+ * Initialize as a dumb object for portraying the object needed
+ *
+ * @param stream
+ * @throws IOException
+ * @throws ClassNotFoundException
+ */
+ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
+ name = (String) stream.readObject();
+ }
+
+ /**
+ * @return The ArtifactSubtypeDescriptor associated with the name and transactionId from this dumb object
+ * @throws ObjectStreamException
+ */
+ private Object readResolve() throws ObjectStreamException {
+ try {
+ return ArtifactTypeManager.getType(name);
+ } catch (OseeCoreException e) {
+ throw new RuntimeException("Error while resolving descriptor", e);
+ }
+ }
+
+ /**
+ * @return the namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(ArtifactType artifactType) {
+ if (artifactType == null) {
+ return -1;
+ }
+ return name.compareTo(artifactType.name);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + name.hashCode();
+ result = prime * result + namespace.hashCode();
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final ArtifactType other = (ArtifactType) obj;
+ if (name == null) {
+ if (other.name != null) return false;
+ } else if (!name.equals(other.name)) return false;
+ if (namespace == null) {
+ if (other.namespace != null) return false;
+ } else if (!namespace.equals(other.namespace)) return false;
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTypeManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTypeManager.java
new file mode 100644
index 00000000000..e713b325174
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactTypeManager.java
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * Contains methods specific to artifact types. All artifact methods will eventually be moved from the
+ * ConfigurationPersistenceManager to here.
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactTypeManager {
+ private static final String SELECT_ARTIFACT_TYPES = "SELECT * FROM osee_artifact_type";
+ private static final String INSERT_ARTIFACT_TYPE =
+ "INSERT INTO osee_artifact_type (art_type_id, namespace, name) VALUES (?,?,?)";
+
+ private static final ArtifactTypeManager instance = new ArtifactTypeManager();
+
+ private final HashMap<String, ArtifactType> nameToTypeMap = new HashMap<String, ArtifactType>();
+ private final HashMap<Integer, ArtifactType> idToTypeMap = new HashMap<Integer, ArtifactType>();
+
+ private ArtifactTypeManager() {
+ }
+
+ public void refreshCache() throws OseeDataStoreException {
+ nameToTypeMap.clear();
+ idToTypeMap.clear();
+ populateCache();
+ }
+
+ private static synchronized void ensurePopulated() throws OseeDataStoreException {
+ if (instance.idToTypeMap.size() == 0) {
+ instance.populateCache();
+ }
+ }
+
+ private void populateCache() throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(SELECT_ARTIFACT_TYPES);
+
+ while (chStmt.next()) {
+ try {
+ new ArtifactType(chStmt.getInt("art_type_id"), chStmt.getString("namespace"), chStmt.getString("name"));
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /**
+ * @return Returns all of the descriptors.
+ * @throws OseeCoreException
+ */
+ public static Collection<ArtifactType> getAllTypes() throws OseeDataStoreException {
+ ensurePopulated();
+ return instance.idToTypeMap.values();
+ }
+
+ public static boolean typeExists(String namespace, String name) throws OseeDataStoreException {
+ ensurePopulated();
+ return instance.nameToTypeMap.get(namespace + name) != null;
+ }
+
+ public static boolean typeExists(String name) throws OseeDataStoreException {
+ return typeExists("", name);
+ }
+
+ public static Collection<AttributeType> getAttributeTypes(String artifactTypeName, Branch branch) throws OseeCoreException {
+ return TypeValidityManager.getAttributeTypesFromArtifactType(ArtifactTypeManager.getType(artifactTypeName),
+ branch);
+ }
+
+ /**
+ * Cache a newly created descriptor.
+ *
+ * @param descriptor The descriptor to cache
+ * @throws IllegalArgumentException if descriptor is null.
+ */
+ static void cache(ArtifactType descriptor) {
+ instance.nameToTypeMap.put(descriptor.getNamespace() + descriptor.getName(), descriptor);
+ instance.idToTypeMap.put(descriptor.getArtTypeId(), descriptor);
+ }
+
+ /**
+ * @return Returns the descriptor with a particular namespace and name
+ * @throws OseeDataStoreException
+ * @throws OseeCoreException
+ */
+ public static ArtifactType getType(String namespace, String name) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ ensurePopulated();
+ ArtifactType artifactType = instance.nameToTypeMap.get(namespace + name);
+
+ if (artifactType == null) {
+ throw new OseeTypeDoesNotExist(
+ "Artifact type with namespace \"" + namespace + "\" and name \"" + name + "\" is not available.");
+ }
+ return artifactType;
+ }
+
+ /**
+ * @param artifactTypeName
+ * @return Returns the type with a particular name (uses null for namespace), null if it does not exist.
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public static ArtifactType getType(String artifactTypeName) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return getType("", artifactTypeName);
+ }
+
+ /**
+ * @return Returns the types with a particular name (uses null for namespace), null if it does not exist.
+ * @throws OseeDataStoreException
+ * @throws OseeTypeDoesNotExist
+ */
+ public static List<ArtifactType> getTypes(Iterable<String> artifactTypeNames) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ List<ArtifactType> artifactTypes = new ArrayList<ArtifactType>();
+ for (String artifactTypeName : artifactTypeNames) {
+ artifactTypes.add(getType("", artifactTypeName));
+ }
+ return artifactTypes;
+ }
+
+ /**
+ * @return Returns the descriptor with a particular name, null if it does not exist.
+ * @throws OseeTypeDoesNotExist
+ */
+ public static ArtifactType getType(int artTypeId) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ensurePopulated();
+
+ ArtifactType artifactType = instance.idToTypeMap.get(artTypeId);
+
+ if (artifactType == null) {
+ throw new OseeTypeDoesNotExist("Atrifact type: " + artTypeId + " is not available.");
+ }
+ return artifactType;
+ }
+
+ /**
+ * Get a new instance of type artifactTypeName
+ *
+ * @param artifactTypeName
+ * @param branch
+ * @throws OseeCoreException
+ */
+ public static Artifact addArtifact(String artifactTypeName, Branch branch) throws OseeCoreException {
+ return ArtifactTypeManager.getType(artifactTypeName).makeNewArtifact(branch);
+ }
+
+ /**
+ * Get a new instance of type artifactTypeName and set it's name.
+ *
+ * @param artifactTypeName
+ * @param branch
+ * @param name
+ */
+ public static Artifact addArtifact(String artifactTypeName, Branch branch, String name) throws OseeCoreException {
+ Artifact artifact = addArtifact(artifactTypeName, branch);
+ artifact.setDescriptiveName(name);
+ return artifact;
+ }
+
+ /**
+ * Get a new instance of the type of artifact. This is just a convenience method that calls makeNewArtifact on the
+ * known factory with this descriptor for the descriptor parameter, and the supplied branch.
+ *
+ * @param branch branch on which artifact will be created
+ * @return Return artifact reference
+ * @throws OseeCoreException
+ * @see ArtifactFactory#makeNewArtifact(Branch, ArtifactType, String, String, ArtifactProcessor)
+ */
+ public static Artifact addArtifact(String artifactTypeName, Branch branch, String guid, String humandReadableId) throws OseeCoreException {
+ return ArtifactTypeManager.getType(artifactTypeName).makeNewArtifact(branch, guid, humandReadableId);
+ }
+
+ public static ArtifactType createType(String factoryName, String namespace, String artifactTypeName, String factoryKey) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ArtifactType artifactType;
+ if (!typeExists(namespace, artifactTypeName)) {
+ int artTypeId = SequenceManager.getNextArtifactTypeId();
+ artifactType = new ArtifactType(artTypeId, namespace, artifactTypeName);
+
+ ConnectionHandler.runPreparedUpdate(INSERT_ARTIFACT_TYPE, artTypeId, namespace, artifactTypeName);
+ } else {
+ // Check if anything valuable is different
+ artifactType = getType(namespace, artifactTypeName);
+ }
+ return artifactType;
+ }
+
+ private static final String DELETE_VALID_REL = "delete from osee_valid_relations where art_type_id = ?";
+ private static final String DELETE_VALID_ATTRIBUTE = "delete from osee_valid_attributes where art_type_id = ?";
+ private static final String COUNT_ARTIFACT_OCCURRENCE = "select count(1) FROM osee_artifact where art_type_id = ?";
+ private static final String DELETE_ARIFACT_TYPE = "delete from osee_artifact_type where art_type_id = ?";
+
+ public static void purgeArtifactType(ArtifactType artifactType) throws OseeCoreException {
+ int artTypeId = artifactType.getArtTypeId();
+ int artifactCount = ConnectionHandler.runPreparedQueryFetchInt(0, COUNT_ARTIFACT_OCCURRENCE, artTypeId);
+
+ if (artifactCount != 0) {
+ throw new OseeArgumentException(
+ "Can not delete artifact type " + artifactType.getName() + " because there are " + artifactCount + " existing artifacts of this type.");
+ }
+
+ ConnectionHandler.runPreparedUpdate(DELETE_VALID_REL, artTypeId);
+ ConnectionHandler.runPreparedUpdate(DELETE_VALID_ATTRIBUTE, artTypeId);
+ ConnectionHandler.runPreparedUpdate(DELETE_ARIFACT_TYPE, artTypeId);
+ }
+
+ /**
+ * Given a set of artifact types, they will be converted to the new artifact type and the old artifact types will be
+ * purged
+ *
+ * @param purgeArtifactTypes types to be converted and purged
+ * @param newArtifactType new type to convert any existing artifacts of the old type
+ * @throws OseeCoreException
+ */
+ public static void purgeArtifactTypesWithCheck(Collection<ArtifactType> purgeArtifactTypes, ArtifactType newArtifactType) throws OseeCoreException {
+ for (ArtifactType purgeArtifactType : purgeArtifactTypes) {
+ // find all artifact of this type on all branches and make a unique list for type change (since it is not by branch)
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromType(purgeArtifactType, true);
+ if (artifacts.size() > 0) {
+ HashMap<Integer, Artifact> artifactMap = new HashMap<Integer, Artifact>();
+ for (Artifact artifact : artifacts) {
+ artifactMap.put(artifact.getArtId(), artifact);
+ }
+ if (newArtifactType == null) {
+ HashSet<Branch> branches = new HashSet<Branch>();
+ for (Artifact artifact : artifacts) {
+ branches.add(artifact.getBranch());
+ }
+ throw new OseeStateException(
+ "Found " + artifacts.size() + " artifact references of type " + purgeArtifactType + " on branches " + branches);
+ } else {
+ changeArtifactType(artifactMap.values(), newArtifactType);
+ }
+ }
+ ArtifactTypeManager.purgeArtifactType(purgeArtifactType);
+ }
+ }
+
+ /**
+ * Run code that will be run during purge with convert and report on what relations, attributes will be deleted as
+ * part of the conversion.
+ *
+ * @param purgeArtifactTypes
+ * @param newArtifactType
+ * @throws OseeCoreException
+ */
+ public static void purgeArtifactTypesWithConversionReportOnly(StringBuffer results, Collection<ArtifactType> purgeArtifactTypes, ArtifactType newArtifactType) throws OseeCoreException {
+ try {
+ for (ArtifactType purgeArtifactType : purgeArtifactTypes) {
+ // find all artifact of this type on all branches and make a unique list for type change (since it is not by branch)
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromType(purgeArtifactType, true);
+ if (artifacts.size() > 0) {
+ HashMap<Integer, Artifact> artifactMap = new HashMap<Integer, Artifact>();
+ for (Artifact artifact : artifacts) {
+ artifactMap.put(artifact.getArtId(), artifact);
+ }
+ ChangeArtifactType.changeArtifactTypeReportOnly(results, artifactMap.values(), newArtifactType);
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /**
+ * Changes the descriptor of the artifacts to the provided artifact descriptor
+ *
+ * @param artifacts
+ * @param artifactType
+ */
+ public static void changeArtifactType(Collection<Artifact> artifacts, ArtifactType artifactType) throws OseeCoreException {
+ ChangeArtifactType.changeArtifactType(artifacts, artifactType);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactURL.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactURL.java
new file mode 100644
index 00000000000..2f96e34a778
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ArtifactURL.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.framework.skynet.core.artifact;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactURL {
+
+ private ArtifactURL() {
+ }
+
+ public static URL getExternalArtifactLink(final Artifact artifact) throws OseeCoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("guid", artifact.getGuid());
+ parameters.put("branchId", String.valueOf(artifact.getBranch().getBranchId()));
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.ARTIFACT_CONTEXT, parameters);
+ URL url = null;
+ try {
+ url = new URL(urlString);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ return url;
+ }
+
+ public static URL getOpenInOseeLink(final Artifact artifact, String cmd) throws OseeCoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("sessionId", ClientSessionManager.getSessionId());
+ parameters.put("context", "osee/loopback");
+ parameters.put("guid", artifact.getGuid());
+ parameters.put("branchId", String.valueOf(artifact.getBranch().getBranchId()));
+ parameters.put("isDeleted", String.valueOf(artifact.isDeleted()));
+ if (artifact.isHistorical()) {
+ parameters.put("transactionId", String.valueOf(artifact.getTransactionNumber()));
+ }
+ parameters.put("cmd", cmd);
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.CLIENT_LOOPBACK_CONTEXT, parameters);
+ URL url = null;
+ try {
+ url = new URL(urlString);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ return url;
+ }
+
+ public static URL getOpenInOseeLink(final Artifact artifact) throws OseeCoreException {
+ return getOpenInOseeLink(artifact, "open.artifact");
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Branch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Branch.java
new file mode 100644
index 00000000000..8a9f9937c9a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Branch.java
@@ -0,0 +1,482 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.revision.RevisionManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class Branch implements Comparable<Branch>, IAdaptable {
+ private static final int SHORT_NAME_LIMIT = 25;
+ public static final String COMMON_BRANCH_CONFIG_ID = "Common";
+ private final int branchId;
+ private final int parentBranchId;
+ private TransactionId parentTransactionId;
+ private final int parentTransactionIdNumber;
+ private String branchName;
+ private boolean archived;
+ private final int authorId;
+ private int associatedArtifactId;
+ private Artifact associatedArtifact;
+ private final Timestamp creationDate;
+ private final String creationComment;
+ private BranchType branchType;
+ private Branch sourceBranch;
+ private Branch destBranch;
+ private BranchState branchState;
+
+ public Branch(String branchName, int branchId, int parentBranchId, int parentTransactionIdNumber, boolean archived, int authorId, Timestamp creationDate, String creationComment, int associatedArtifactId, BranchType branchType, BranchState branchState) {
+ this.branchId = branchId;
+ this.branchName = branchName;
+ this.parentBranchId = parentBranchId;
+ this.parentTransactionIdNumber = parentTransactionIdNumber;
+ this.archived = archived;
+ this.authorId = authorId;
+ this.creationDate = creationDate;
+ this.creationComment = creationComment;
+ this.associatedArtifactId = associatedArtifactId;
+ this.associatedArtifact = null;
+ this.branchType = branchType;
+ this.branchState = branchState;
+ }
+
+ public BranchState getBranchState() {
+ return branchState;
+ }
+
+ void setBranchState(BranchState branchState) {
+ this.branchState = branchState;
+ }
+
+ /**
+ * @return Returns the branchId.
+ */
+ public int getBranchId() {
+ // Should we persist the branch automatically here if the branchId is 0 for cases the software
+ // has freshly created a branch ?
+ return branchId;
+ }
+
+ /**
+ * @return Returns the branchName.
+ */
+ public String getBranchName() {
+ return branchName;
+ }
+
+ /**
+ * updates this object's name (but does not affect the datastore)
+ *
+ * @param branchName The branchName to set.
+ */
+ public void setBranchName(String branchName) {
+ if (branchName == null) {
+ throw new IllegalArgumentException("The branchName parameter can not be null.");
+ }
+ this.branchName = branchName;
+ }
+
+ /**
+ * @return Returns the short branch name if provided else returns null.
+ */
+ public String getBranchShortName() {
+ return Strings.isValid(getBranchName()) ? StringFormat.truncate(getBranchName(), SHORT_NAME_LIMIT) : Strings.emptyString();
+ }
+
+ private void kickRenameEvents() throws OseeCoreException {
+ OseeEventManager.kickBranchEvent(this, BranchEventType.Renamed, branchId);
+ }
+
+ /**
+ * Sets the branch name to the given value and stores this change in the data-store
+ *
+ * @param branchName The branchName to set.
+ */
+ public void rename(String branchName) throws OseeCoreException {
+ setBranchName(branchName);
+ ConnectionHandler.runPreparedUpdate("UPDATE osee_branch SET branch_name = ? WHERE branch_id = ?", branchName,
+ branchId);
+ kickRenameEvents();
+ }
+
+ public void setAssociatedArtifact(Artifact artifact) throws OseeCoreException {
+ // TODO: this method should allow the artifact to be on any branch, not just common
+ if (artifact.getBranch() != BranchManager.getCommonBranch()) {
+ throw new OseeArgumentException(
+ "Setting associated artifact for branch only valid for common branch artifact.");
+ }
+
+ ConnectionHandler.runPreparedUpdate("UPDATE osee_branch SET associated_art_id = ? WHERE branch_id = ?",
+ artifact.getArtId(), branchId);
+
+ associatedArtifact = artifact;
+ associatedArtifactId = artifact.getArtId();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getBranchName();
+ }
+
+ public Branch getParentBranch() throws OseeCoreException {
+ return BranchManager.getBranch(getParentBranchId());
+ }
+
+ public boolean hasParentBranch() throws OseeCoreException {
+ return !isTopLevelBranch();
+ }
+
+ /**
+ * @return the top level branch that is an ancestor of this branch (which could be itself)
+ */
+ public Branch getTopLevelBranch() throws OseeCoreException {
+ Branch branchCursor = this;
+ while (branchCursor.hasParentBranch()) {
+ branchCursor = branchCursor.getParentBranch();
+ }
+ return branchCursor;
+ }
+
+ public Collection<Branch> getChildBranches() throws OseeCoreException {
+ return getChildBranches(false);
+ }
+
+ public Collection<Branch> getChildBranches(boolean recurse) throws OseeCoreException {
+ Set<Branch> children = new HashSet<Branch>();
+ getChildBranches(this, children, recurse);
+ return children;
+ }
+
+ private void getChildBranches(Branch parentBranch, Collection<Branch> children, boolean recurse) throws OseeCoreException {
+ for (Branch branch : BranchManager.getNormalBranches()) {
+ if (branch.getParentBranchId() == parentBranch.getBranchId()) {
+ children.add(branch);
+ if (recurse) {
+ getChildBranches(branch, children, recurse);
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Returns all children branches including archived branches
+ */
+ public Collection<Branch> getDescendants() throws OseeCoreException {
+ Set<Branch> children = new HashSet<Branch>();
+ getAllChildBranches(this, children, true);
+
+ return children;
+ }
+
+ private void getAllChildBranches(Branch parentBranch, Collection<Branch> children, boolean recurse) throws OseeCoreException {
+ for (Branch branch : BranchManager.getNormalAllBranches()) {
+ if (branch.getParentBranchId() == parentBranch.getBranchId()) {
+ children.add(branch);
+ if (recurse) {
+ getChildBranches(branch, children, recurse);
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Returns the parentBranchId.
+ */
+ public int getParentBranchId() {
+ return parentBranchId;
+ }
+
+ public void archive() throws OseeCoreException {
+ BranchManager.archive(this);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Branch) {
+ return ((Branch) obj).branchId == branchId;
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return branchId * 13;
+ }
+
+ /**
+ * @return Returns the archived.
+ */
+ public boolean isArchived() {
+ return archived;
+ }
+
+ public void setArchived(boolean archived) {
+ this.archived = archived;
+ }
+
+ public boolean hasChanges() throws OseeCoreException {
+ return RevisionManager.branchHasChanges(this);
+ }
+
+ public int getAuthorId() {
+ return authorId;
+ }
+
+ public String getCreationComment() {
+ return creationComment;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ public int compareTo(Branch branch) {
+ return getBranchName().compareToIgnoreCase(branch.getBranchName());
+ }
+
+ /**
+ * @return Returns the associatedArtifact.
+ * @throws MultipleArtifactsExist
+ * @throws ArtifactDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public Artifact getAssociatedArtifact() throws OseeCoreException {
+ if (associatedArtifact == null && associatedArtifactId > 0) {
+ associatedArtifact = ArtifactQuery.getArtifactFromId(associatedArtifactId, BranchManager.getCommonBranch());
+ }
+ return associatedArtifact;
+ }
+
+ /**
+ * Efficient way of determining if branch is associated cause it does not load the associated artifact
+ *
+ * @param artifact
+ */
+ public boolean isAssociatedToArtifact(Artifact artifact) {
+ return artifact.getArtId() == getAssociatedArtifactId();
+ }
+
+ public boolean isChangeManaged() {
+ try {
+ return associatedArtifactId != UserManager.getUser(SystemUser.OseeSystem).getArtId();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ return true;
+ }
+ }
+
+ /*
+ * True if baseline or top level branch
+ */
+ public boolean isBaselineBranch() {
+ return branchType.equals(BranchType.BASELINE) || branchType.equals(BranchType.TOP_LEVEL);
+ }
+
+ public boolean isSystemRootBranch() {
+ return branchType.equals(BranchType.SYSTEM_ROOT);
+ }
+
+ public boolean isTopLevelBranch() throws OseeCoreException {
+ return getParentBranch() != null && getParentBranch().getBranchType().equals(BranchType.SYSTEM_ROOT);
+ }
+
+ public BranchType getBranchType() {
+ return branchType;
+ }
+
+ protected void setBranchType(int type) {
+ branchType = BranchType.getBranchType(type);
+ }
+
+ public boolean isMergeBranch() {
+ return branchType.equals(BranchType.MERGE);
+ }
+
+ public boolean isWorkingBranch() {
+ return branchType.equals(BranchType.WORKING);
+ }
+
+ /**
+ * @return the associatedArtifactId
+ */
+ public int getAssociatedArtifactId() {
+ return associatedArtifactId;
+ }
+
+ public String asFolderName() {
+ String branchName = this.getBranchShortName();
+
+ // Remove illegal filename characters
+ // NOTE: The current program.launch has a tokenizing bug that causes an error if consecutive spaces are in the name
+ branchName = branchName.replaceAll("[^A-Za-z0-9]", "_");
+ branchName = StringFormat.truncate(branchName, 20).trim();
+
+ return String.format("%s.%s", branchName.toLowerCase(), this.getBranchId());
+ }
+
+ public static int getBranchIdFromBranchFolderName(String folderName) throws Exception {
+ return Integer.parseInt(Lib.getExtension(folderName));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) {
+ throw new IllegalArgumentException("adapter can not be null");
+ }
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+
+ public void setMergeBranchInfo(Branch sourceBranch, Branch destBranch) {
+ this.sourceBranch = sourceBranch;
+ this.destBranch = destBranch;
+ }
+
+ public boolean isMergeBranchFor(Branch sourceBranch, Branch destBranch) {
+ return sourceBranch.equals(this.sourceBranch) && destBranch.equals(this.destBranch);
+ }
+
+ /**
+ * @param branchTypes
+ * @return whether this branch is of one of the specified branch types
+ */
+ public boolean isOfType(BranchType... branchTypes) {
+ for (BranchType branchType : branchTypes) {
+ if (this.branchType == branchType) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean matchesState(BranchArchivedState branchState) {
+ return branchState == BranchArchivedState.ALL || isArchived() && branchState == BranchArchivedState.ARCHIVED || !isArchived() && branchState == BranchArchivedState.UNARCHIVED;
+ }
+
+ public boolean matchesControlled(BranchControlled branchControlled) {
+ return branchControlled == BranchControlled.ALL || isChangeManaged() && branchControlled == BranchControlled.CHANGE_MANAGED || !isChangeManaged() && branchControlled == BranchControlled.NOT_CHANGE_MANAGED;
+ }
+
+ public void setDeleted() {
+ setBranchState(BranchState.DELETED);
+ try {
+ OseeEventManager.kickBranchEvent(this, BranchEventType.Deleted, getBranchId());
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+ }
+
+ /**
+ * @return the deleted
+ */
+ public boolean isDeleted() {
+ return getBranchState() == BranchState.DELETED;
+ }
+
+ /**
+ * @return Returns whether the branch is editable.
+ */
+ public boolean isEditable() {
+ return !isCommitted() && !isRebaselined() && !isArchived() && !isDeleted();
+ }
+
+ public boolean isCommitted() {
+ return getBranchState() == BranchState.COMMITTED;
+ }
+
+ public boolean isRebaselined() {
+ return getBranchState() == BranchState.REBASELINED;
+ }
+
+ public boolean isRebaselineInProgress() {
+ return getBranchState() == BranchState.REBASELINE_IN_PROGRESS;
+ }
+
+ /**
+ * @return the parentTransactionId
+ * @throws OseeCoreException
+ */
+ public TransactionId getParentTransactionId() throws OseeCoreException {
+ if (parentTransactionId == null) {
+ parentTransactionId = TransactionIdManager.getTransactionId(parentTransactionIdNumber);
+ }
+ return parentTransactionId;
+ }
+
+ public List<Branch> getBranchHierarchy() throws OseeCoreException {
+ List<Branch> ancestors = new LinkedList<Branch>();
+ Branch branchCursor = this;
+ ancestors.add(branchCursor);
+ while (branchCursor.hasParentBranch()) {
+ ancestors.add(branchCursor.getParentBranch());
+ branchCursor = branchCursor.getParentBranch();
+ }
+ return ancestors;
+ }
+
+ public Collection<Branch> getWorkingBranches() throws OseeCoreException {
+ return BranchManager.getWorkingBranches(this);
+ }
+
+ public int getParentTransactionNumber() {
+ return parentTransactionIdNumber;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchArchivedState.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchArchivedState.java
new file mode 100644
index 00000000000..63fb08590bf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchArchivedState.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.framework.skynet.core.artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum BranchArchivedState {
+ ARCHIVED, UNARCHIVED, ALL
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchControlled.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchControlled.java
new file mode 100644
index 00000000000..8b9bb87d48c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchControlled.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.framework.skynet.core.artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum BranchControlled {
+ CHANGE_MANAGED, NOT_CHANGE_MANAGED, ALL
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchCreator.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchCreator.java
new file mode 100644
index 00000000000..56bc004619d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchCreator.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BranchCreator {
+ public static final String NEW_MERGE_BRANCH_COMMENT = "New Merge Branch from ";
+
+ private static final String BRANCH_TABLE_INSERT =
+ "INSERT INTO osee_branch (branch_id, branch_name, parent_branch_id, parent_transaction_id, archived, associated_art_id, branch_type, branch_state) VALUES (?,?,?,?,?,?,?,?)";
+
+ private static final String SELECT_BRANCH_BY_NAME = "SELECT count(1) FROM osee_branch WHERE branch_name = ?";
+
+ private static final String MERGE_BRANCH_INSERT =
+ "INSERT INTO osee_merge (source_branch_id, dest_branch_id, merge_branch_id, commit_transaction_id) VALUES(?,?,?,?)";
+
+ private static final String INSERT_INTO_TX_DETAILS =
+ "INSERT INTO osee_tx_details (branch_id, transaction_id, osee_comment, time, author, tx_type) VALUES (?,?,?,?,?,?)";
+
+ private static final BranchCreator instance = new BranchCreator();
+
+ private BranchCreator() {
+
+ }
+
+ public static BranchCreator getInstance() {
+ return instance;
+ }
+
+ private Pair<Branch, Integer> createMergeBranchWithBaselineTransactionNumber(OseeConnection connection, Artifact associatedArtifact, TransactionId sourceTransactionId, String childBranchShortName, String childBranchName, BranchType branchType, BranchState branchState, Branch destBranch) throws OseeCoreException {
+ User userToBlame = UserManager.getUser();
+ Branch parentBranch = sourceTransactionId.getBranch();
+ int userId = userToBlame == null ? UserManager.getUser(SystemUser.OseeSystem).getArtId() : userToBlame.getArtId();
+ String comment =
+ NEW_MERGE_BRANCH_COMMENT + parentBranch.getBranchName() + "(" + sourceTransactionId.getTransactionNumber() + ") and " + destBranch.getBranchName();
+ Timestamp timestamp = GlobalTime.GreenwichMeanTimestamp();
+ Branch childBranch =
+ initializeBranch(connection, sourceTransactionId, childBranchName, userId, timestamp, comment,
+ associatedArtifact, branchType, branchState);
+
+ // insert the new transaction data first.
+ int newTransactionNumber = SequenceManager.getNextTransactionId();
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_INTO_TX_DETAILS, childBranch.getBranchId(),
+ newTransactionNumber, childBranch.getCreationComment(), childBranch.getCreationDate(),
+ childBranch.getAuthorId(), TransactionDetailsType.Baselined.getId());
+
+ return new Pair<Branch, Integer>(childBranch, newTransactionNumber);
+ }
+
+ /**
+ * adds a new branch to the database
+ *
+ * @param connection
+ * @param branchShortName
+ * @param branchName
+ * @param authorId
+ * @param creationDate
+ * @param creationComment
+ * @param associatedArtifact
+ * @param branchType
+ * @return branch object that represents the newly created branch
+ * @throws OseeCoreException
+ */
+ private Branch initializeBranch(OseeConnection connection, TransactionId sourceTransactionId, String branchName, int authorId, Timestamp creationDate, String creationComment, Artifact associatedArtifact, BranchType branchType, BranchState branchState) throws OseeCoreException {
+ int branchId = SequenceManager.getNextBranchId();
+ int parentBranchNumber = sourceTransactionId.getBranchId();
+ int parentTransactionIdNumnber = sourceTransactionId.getTransactionNumber();
+ int associatedArtifactId = -1;
+
+ if (associatedArtifact == null && !SkynetDbInit.isDbInit()) {
+ associatedArtifact = UserManager.getUser(SystemUser.OseeSystem);
+ }
+
+ if (associatedArtifact != null) {
+ associatedArtifactId = associatedArtifact.getArtId();
+ }
+
+ ConnectionHandler.runPreparedUpdate(connection, BRANCH_TABLE_INSERT, branchId, branchName, parentBranchNumber,
+ parentTransactionIdNumnber, 0, associatedArtifactId, branchType.getValue(), branchState.getValue());
+
+ // this needs to be after the insert in case there is an exception on insert
+ Branch branch =
+ BranchManager.createBranchObject(branchName, branchId, parentBranchNumber, parentTransactionIdNumnber,
+ false, authorId, creationDate, creationComment, associatedArtifactId, branchType, branchState);
+ if (associatedArtifact != null) {
+ branch.setAssociatedArtifact(associatedArtifact);
+ }
+
+ return branch;
+ }
+
+ /**
+ * Creates a new Branch based on the transaction number selected and the parent branch.
+ *
+ * @param parentTransactionId
+ * @param childBranchName
+ */
+ public Branch createChildBranch(final TransactionId parentTransactionId, final String childBranchName, final Artifact associatedArtifact, boolean preserveMetaData, Collection<Integer> compressArtTypeIds, Collection<Integer> preserveArtTypeIds) throws OseeCoreException {
+ return HttpBranchCreation.createChildBranch(parentTransactionId, childBranchName, associatedArtifact,
+ preserveMetaData, compressArtTypeIds, preserveArtTypeIds);
+ }
+
+ /**
+ * Creates a new merge branch based on the artifacts from the source branch
+ */
+ public Branch createMergeBranch(Branch sourceBranch, Branch destBranch, Collection<Integer> artIds) throws OseeCoreException {
+ CreateMergeBranchTx createMergeBranchTx = new CreateMergeBranchTx(sourceBranch, destBranch, artIds);
+ createMergeBranchTx.execute();
+
+ OseeEventManager.kickBranchEvent(HttpBranchCreation.class, BranchEventType.Added,
+ createMergeBranchTx.getMergeBranch().getBranchId());
+
+ return createMergeBranchTx.getMergeBranch();
+ }
+
+ private final static String attributeGammas =
+ "INSERT INTO OSEE_TXS (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, atr1.gamma_id, txs1.mod_type, ? FROM osee_attribute atr1, osee_txs txs1, osee_tx_details txd1, osee_join_artifact ald1 WHERE txd1.branch_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.tx_current in (1,2) AND txs1.gamma_id = atr1.gamma_id AND atr1.art_id = ald1.art_id and ald1.query_id = ?";
+ private final static String artifactVersionGammas =
+ "INSERT INTO OSEE_TXS (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, arv1.gamma_id, txs1.mod_type, ? FROM osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1, osee_join_artifact ald1 WHERE txd1.branch_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.tx_current in (1,2) AND txs1.gamma_id = arv1.gamma_id AND arv1.art_id = ald1.art_id and ald1.query_id = ?";
+
+ private final class CreateMergeBranchTx extends DbTransaction {
+ private final Branch sourceBranch;
+ private final Branch destBranch;
+ private final Collection<Integer> artIds;
+ private Branch mergeBranch;
+
+ /**
+ * @param sourceBranch
+ * @param destBranch
+ * @param artIds
+ * @throws OseeStateException
+ */
+ public CreateMergeBranchTx(Branch sourceBranch, Branch destBranch, Collection<Integer> artIds) throws OseeCoreException {
+ this(sourceBranch, destBranch, artIds, null);
+ }
+
+ /**
+ * @param sourceBranch
+ * @param destBranch
+ * @param artIds
+ * @throws OseeStateException
+ */
+ public CreateMergeBranchTx(Branch sourceBranch, Branch destBranch, Collection<Integer> artIds, Branch mergeBranch) throws OseeCoreException {
+ this.sourceBranch = sourceBranch;
+ this.destBranch = destBranch;
+ this.artIds = artIds;
+ this.mergeBranch = mergeBranch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.db.AbstractDbTxTemplate#handleTxWork()
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+
+ if (artIds == null || artIds.isEmpty()) {
+ throw new IllegalArgumentException("Artifact IDs can not be null or empty");
+ }
+
+ Pair<Branch, Integer> branchWithTransactionNumber;
+ branchWithTransactionNumber =
+ createMergeBranchWithBaselineTransactionNumber(connection, UserManager.getUser(),
+ TransactionIdManager.getStartEndPoint(sourceBranch).getKey(),
+ "Merge " + sourceBranch.getBranchShortName() + " <=> " + destBranch.getBranchShortName(),
+ "Merge " + sourceBranch.getBranchShortName() + " <=> " + destBranch.getBranchShortName(),
+ BranchType.MERGE, BranchState.CREATED, destBranch);
+
+ List<Object[]> datas = new LinkedList<Object[]>();
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ for (int artId : artIds) {
+ datas.add(new Object[] {queryId, insertTime, artId, sourceBranch.getBranchId(), SQL3DataType.INTEGER});
+ }
+ try {
+ ArtifactLoader.insertIntoArtifactJoin(datas);
+ insertGammas(connection, attributeGammas, branchWithTransactionNumber.getValue(), queryId, sourceBranch);
+ insertGammas(connection, artifactVersionGammas, branchWithTransactionNumber.getValue(), queryId,
+ sourceBranch);
+ } finally {
+ ArtifactLoader.clearQuery(connection, queryId);
+ }
+
+ mergeBranch = branchWithTransactionNumber.getKey();
+
+ ConnectionHandler.runPreparedUpdate(connection, MERGE_BRANCH_INSERT, sourceBranch.getBranchId(),
+ destBranch.getBranchId(), mergeBranch.getBranchId(), -1);
+ }
+
+ public Branch getMergeBranch() {
+ return mergeBranch;
+ }
+ }
+
+ public void addArtifactsToBranch(OseeConnection connection, Branch sourceBranch, Branch destBranch, Branch mergeBranch, Collection<Integer> artIds) throws OseeCoreException {
+ if (artIds == null || artIds.isEmpty()) {
+ throw new IllegalArgumentException("Artifact IDs can not be null or empty");
+ }
+
+ Pair<Branch, Integer> branchWithTransactionNumber;
+ TransactionId startTransactionId = TransactionIdManager.getStartEndPoint(mergeBranch).getKey();
+ branchWithTransactionNumber = new Pair<Branch, Integer>(mergeBranch, startTransactionId.getTransactionNumber());
+
+ List<Object[]> datas = new LinkedList<Object[]>();
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ for (int artId : artIds) {
+ datas.add(new Object[] {queryId, insertTime, artId, sourceBranch.getBranchId(), SQL3DataType.INTEGER});
+ }
+ try {
+ ArtifactLoader.insertIntoArtifactJoin(datas);
+ insertGammas(connection, attributeGammas, branchWithTransactionNumber.getValue(), queryId, sourceBranch);
+ insertGammas(connection, artifactVersionGammas, branchWithTransactionNumber.getValue(), queryId, sourceBranch);
+ } finally {
+ ArtifactLoader.clearQuery(connection, queryId);
+ }
+ mergeBranch = branchWithTransactionNumber.getKey();
+ }
+
+ private static void insertGammas(OseeConnection connection, String sql, int baselineTransactionNumber, int queryId, Branch sourceBranch) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(connection, sql, baselineTransactionNumber, TxChange.CURRENT.getValue(),
+ sourceBranch.getBranchId(), queryId);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java
new file mode 100644
index 00000000000..93f53c3d7a2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java
@@ -0,0 +1,806 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TXD_COMMENT;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+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.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchStorageState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.core.operation.IOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleBranchesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.operation.FinishUpdateBranchOperation;
+import org.eclipse.osee.framework.skynet.core.artifact.operation.UpdateBranchOperation;
+import org.eclipse.osee.framework.skynet.core.artifact.update.ConflictResolverOperation;
+import org.eclipse.osee.framework.skynet.core.commit.actions.CommitAction;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.skynet.core.dbinit.MasterSkynetTypesImport;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+public class BranchManager {
+ private static final BranchManager instance = new BranchManager();
+
+ private static final String READ_BRANCH_TABLE =
+ "SELECT * FROM osee_branch br1, osee_tx_details txd1 WHERE br1.branch_id = txd1.branch_id AND txd1.tx_type = " + TransactionDetailsType.Baselined.getId();
+ private static final String READ_MERGE_BRANCHES =
+ "SELECT m1.* FROM osee_merge m1, osee_tx_details txd1 WHERE m1.merge_branch_id = txd1.branch_id and txd1.tx_type = " + TransactionDetailsType.Baselined.getId();
+ public static final String COMMIT_TRANSACTION =
+ "INSERT INTO " + TRANSACTION_DETAIL_TABLE.columnsForInsert("tx_type", "branch_id", "transaction_id",
+ TXD_COMMENT, "time", "author", "commit_art_id");
+ private static final String SELECT_BRANCH_TRANSACTION =
+ "SELECT transaction_id FROM osee_tx_details WHERE branch_id = ? AND time < ? ORDER BY time DESC";
+
+ private static final String UPDATE_TRANSACTION_BRANCH =
+ "UPDATE " + TRANSACTION_DETAIL_TABLE + " SET branch_id=? WHERE " + TRANSACTION_DETAIL_TABLE.column("transaction_id") + "=?";
+ private static final String INSERT_DEFAULT_BRANCH_NAMES =
+ "INSERT INTO OSEE_BRANCH_DEFINITIONS (static_branch_name, mapped_branch_id) VALUES (?, ?)";
+
+ public static final String NEW_BRANCH_COMMENT = "New Branch from ";
+
+ private static final String UPDATE_BRANCH_STATE = "UPDATE osee_branch set branch_state = ? WHERE branch_id = ?";
+
+ private static final String ARCHIVE_BRANCH =
+ "UPDATE osee_branch set archived = " + BranchStorageState.ARCHIVED.getValue() + " WHERE branch_id = ?";
+ private static final String UN_ARCHIVE_BRANCH =
+ "UPDATE osee_branch set archived = " + BranchStorageState.UN_ARCHIVED.getValue() + " WHERE branch_id = ?";
+ private static final String UPDATE_ASSOCIATED_ART_BRANCH =
+ "UPDATE osee_branch set associated_art_id = ? WHERE branch_id = ?";
+
+ private final static String LAST_DEFAULT_BRANCH = "LastDefaultBranch";
+
+ // This hash is keyed on the branchId
+ private final TreeMap<Integer, Branch> branchCache = new TreeMap<Integer, Branch>();
+
+ public static final String COMMIT_COMMENT = "Commit Branch ";
+
+ private static final boolean MERGE_DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Merge"));
+
+ private Branch systemRoot;
+
+ private final Map<String, Branch> keynameBranchMap = new HashMap<String, Branch>();
+ private static final String GET_MAPPED_BRANCH_INFO = "SELECT * FROM osee_branch_definitions";
+ private List<CommitAction> commitActions;
+ private Branch lastBranch;
+
+ private BranchManager() {
+ }
+
+ @Deprecated
+ // use static methods instead
+ public static BranchManager getInstance() {
+ return instance;
+ }
+
+ public static Set<Branch> getAssociatedArtifactBranches(Artifact associatedArtifact, boolean includeArchived, boolean includeDeleted) throws OseeCoreException {
+ instance.ensurePopulatedCache(false);
+ Set<Branch> branches = new HashSet<Branch>();
+ Set<Branch> branchesToCheck = new HashSet<Branch>(getNormalBranches());
+ if (includeArchived) {
+ branchesToCheck.addAll(getArchivedBranches());
+ }
+ for (Branch branch : branchesToCheck) {
+ if (branch.isAssociatedToArtifact(associatedArtifact)) {
+ if (includeDeleted || !branch.isDeleted()) {
+ branches.add(branch);
+ }
+ }
+ }
+ return branches;
+ }
+
+ public static Branch getCommonBranch() throws OseeCoreException {
+ return getKeyedBranch(Branch.COMMON_BRANCH_CONFIG_ID);
+ }
+
+ /**
+ * Excludes branches of type MERGE and SYSTEM_ROOT
+ *
+ * @return branches that are not archived and are of type STANDARD, TOP_LEVEL, or BASELINE
+ * @throws OseeCoreException
+ */
+ public static List<Branch> getNormalBranches() throws OseeCoreException {
+ List<Branch> branches =
+ getBranches(BranchArchivedState.UNARCHIVED, BranchControlled.ALL, BranchType.WORKING, BranchType.TOP_LEVEL,
+ BranchType.BASELINE);
+ Collections.sort(branches);
+ return branches;
+ }
+
+ /**
+ * Excludes branches of type MERGE and SYSTEM_ROOT
+ *
+ * @return branches that are of type STANDARD, TOP_LEVEL, or BASELINE
+ * @throws OseeCoreException
+ */
+ public static List<Branch> getNormalAllBranches() throws OseeCoreException {
+ List<Branch> branches =
+ getBranches(BranchArchivedState.ALL, BranchControlled.ALL, BranchType.WORKING, BranchType.TOP_LEVEL,
+ BranchType.BASELINE);
+ Collections.sort(branches);
+ return branches;
+ }
+
+ public static List<Branch> getBranches(BranchArchivedState branchState, BranchControlled branchControlled, BranchType... branchTypes) throws OseeCoreException {
+ instance.ensurePopulatedCache(false);
+ List<Branch> branches = new ArrayList<Branch>(1000);
+ for (Branch branch : instance.branchCache.values()) {
+ if (branch.matchesState(branchState) && branch.matchesControlled(branchControlled) && branch.isOfType(branchTypes)) {
+ branches.add(branch);
+ }
+ }
+
+ return branches;
+ }
+
+ public static void refreshBranches() throws OseeCoreException {
+ instance.ensurePopulatedCache(true);
+ }
+
+ @Deprecated
+ // use getKeyedBranch() or get the branch by id or from getBranches(...)
+ public static Branch getBranch(String branchName) throws OseeCoreException {
+ Collection<Branch> branches = getBranchesByName(branchName);
+ if (branches.isEmpty()) {
+ throw new BranchDoesNotExist(String.format("No branch exists with the name: [%s]", branchName));
+ }
+ if (branches.size() > 1) {
+ throw new MultipleBranchesExist(String.format("More than 1 branch exists with the name: [%s]", branchName));
+ }
+ return branches.iterator().next();
+ }
+
+ public static Collection<Branch> getBranchesByName(String branchName) throws OseeDataStoreException {
+ instance.ensurePopulatedCache(false);
+ List<Branch> branches = null;
+ for (Branch branch : instance.branchCache.values()) {
+ if (branch.getBranchName().equals(branchName)) {
+ if (branches == null) {
+ branches = new ArrayList<Branch>();
+ }
+ branches.add(branch);
+ }
+ }
+
+ if (branches == null) {
+ branches = Collections.emptyList();
+ }
+ return branches;
+ }
+
+ public static boolean branchExists(String branchName) throws OseeDataStoreException {
+ return !getBranchesByName(branchName).isEmpty();
+ }
+
+ private synchronized void ensurePopulatedCache(boolean forceRead) throws OseeDataStoreException {
+ if (forceRead || branchCache.size() == 0) {
+ // The branch cache can not be cleared here because applications may contain branch references.
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(2000, READ_BRANCH_TABLE);
+ while (chStmt.next()) {
+ Branch cachedBranch = branchCache.get(chStmt.getInt("branch_id"));
+
+ if (cachedBranch == null) {
+ cachedBranch = initializeBranchObject(chStmt);
+ branchCache.put(cachedBranch.getBranchId(), cachedBranch);
+ } else {
+ cachedBranch.setBranchName(chStmt.getString("branch_name"));
+ cachedBranch.setArchived(chStmt.getInt("archived") == 1);
+ cachedBranch.setBranchType(chStmt.getInt("branch_type"));
+ }
+
+ if (cachedBranch.isSystemRootBranch()) {
+ systemRoot = cachedBranch;
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ try {
+ chStmt.runPreparedQuery(1000, READ_MERGE_BRANCHES);
+ while (chStmt.next()) {
+ Branch sourceBranch = branchCache.get(chStmt.getInt("source_branch_id"));
+ Branch destBranch = branchCache.get(chStmt.getInt("dest_branch_id"));
+ Branch mergeBranch = branchCache.get(chStmt.getInt("merge_branch_id"));
+ mergeBranch.setMergeBranchInfo(sourceBranch, destBranch);
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ try {
+ chStmt.runPreparedQuery(GET_MAPPED_BRANCH_INFO);
+
+ while (chStmt.next()) {
+ keynameBranchMap.put(chStmt.getString("static_branch_name").toLowerCase(),
+ instance.branchCache.get(chStmt.getInt("mapped_branch_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ /**
+ * returns the merge branch for this source destination pair from the cache or null if not found
+ */
+ public static Branch getMergeBranch(Branch sourceBranch, Branch destBranch) throws OseeCoreException {
+ instance.ensurePopulatedCache(false);
+ for (Branch branch : instance.branchCache.values()) {
+ if (branch.isMergeBranchFor(sourceBranch, destBranch)) {
+ return branch;
+ }
+ }
+ return null;
+ }
+
+ public static boolean isMergeBranch(Branch sourceBranch, Branch destBranch) throws OseeCoreException {
+ return getMergeBranch(sourceBranch, destBranch) != null;
+ }
+
+ public static Collection<Branch> getWorkingBranches(Branch parentBranch) throws OseeCoreException {
+ instance.ensurePopulatedCache(false);
+ List<Branch> branches = new ArrayList<Branch>(500);
+ for (Branch branch : instance.branchCache.values()) {
+ if (branch.matchesState(BranchArchivedState.UNARCHIVED) && branch.isOfType(BranchType.WORKING) && parentBranch.equals(branch.getParentBranch())) {
+ branches.add(branch);
+ }
+ }
+
+ return branches;
+ }
+
+ public static Collection<Branch> getArchivedBranches() throws OseeCoreException {
+ return getBranches(BranchArchivedState.ARCHIVED, BranchControlled.ALL, BranchType.WORKING, BranchType.TOP_LEVEL,
+ BranchType.BASELINE);
+ }
+
+ /**
+ * deletes (permanently removes from the datastore) each archived branch one at a time using sequential jobs
+ *
+ * @throws InterruptedException
+ */
+ public static void purgeArchivedBranches() throws OseeCoreException {
+ for (Branch archivedBranch : getArchivedBranches()) {
+ BranchManager.purgeBranch(archivedBranch);
+ }
+ }
+
+ public static Branch createBranchObject(String branchName, int branchId, int parentBranchId, int parentTransactionId, boolean archived, int authorId, Timestamp creationDate, String creationComment, int associatedArtifactId, BranchType branchType, BranchState branchState) {
+ Branch branch =
+ new Branch(branchName, branchId, parentBranchId, parentTransactionId, archived, authorId, creationDate,
+ creationComment, associatedArtifactId, branchType, branchState);
+ instance.branchCache.put(branchId, branch);
+ return branch;
+ }
+
+ /**
+ * Create a Branch object based on the result set from the READ_BRANCH_TABLE query
+ *
+ * @param rSet
+ * @return
+ * @throws OseeDataStoreException
+ * @throws OseeCoreException
+ */
+ private static Branch initializeBranchObject(ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ return createBranchObject(chStmt.getString("branch_name"), chStmt.getInt("branch_id"),
+ chStmt.getInt("parent_branch_id"), chStmt.getInt("parent_transaction_id"), chStmt.getInt("archived") == 1,
+ chStmt.getInt("author"), chStmt.getTimestamp("time"), chStmt.getString(TXD_COMMENT),
+ chStmt.getInt("associated_art_id"), BranchType.getBranchType(chStmt.getInt("branch_type")),
+ BranchState.getBranchState(chStmt.getInt("branch_state")));
+ }
+
+ /**
+ * Calls the getMergeBranch method and if it returns null it will create a new merge branch based on the artIds from
+ * the source branch.
+ */
+ public static Branch getOrCreateMergeBranch(Branch sourceBranch, Branch destBranch, ArrayList<Integer> expectedArtIds) throws OseeCoreException {
+ long time = 0;
+ Branch mergeBranch = getMergeBranch(sourceBranch, destBranch);
+
+ if (mergeBranch == null) {
+ if (MERGE_DEBUG) {
+ System.out.println("Creating a new Merge Branch");
+ time = System.currentTimeMillis();
+ }
+ mergeBranch = BranchCreator.getInstance().createMergeBranch(sourceBranch, destBranch, expectedArtIds);
+
+ mergeBranch.setMergeBranchInfo(sourceBranch, destBranch);
+ instance.branchCache.put(mergeBranch.getBranchId(), mergeBranch);
+
+ if (MERGE_DEBUG) {
+ System.out.println(String.format(" Branch created in %s", Lib.getElapseString(time)));
+ }
+ } else {
+ if (MERGE_DEBUG) {
+ System.out.println("Updating Existing Merge Branch");
+ time = System.currentTimeMillis();
+ }
+ MergeBranchManager.updateMergeBranch(mergeBranch, expectedArtIds, destBranch, sourceBranch);
+ if (MERGE_DEBUG) {
+ System.out.println(String.format(" Branch updated in %s", Lib.getElapseString(time)));
+ }
+ }
+ return mergeBranch;
+ }
+
+ public static Branch getBranch(Integer branchId) throws OseeDataStoreException, BranchDoesNotExist {
+ // Always exception for invalid id's, they won't ever be found in the
+ // database or cache.
+ if (branchId == null) {
+ throw new BranchDoesNotExist("Branch Id is null");
+ }
+
+ // If someone else made a branch on another machine, we may not know about it
+ // so refresh the cache.
+ if (!instance.branchCache.containsKey(branchId)) {
+ instance.ensurePopulatedCache(true);
+ }
+ Branch branch = instance.branchCache.get(branchId);
+
+ if (branch == null) {
+ throw new BranchDoesNotExist("Branch could not be acquired for branch id: " + branchId);
+ }
+
+ return branch;
+ }
+
+ /**
+ * Update branch
+ *
+ * @param Job
+ */
+ public static Job updateBranch(final Branch branch, final ConflictResolverOperation resolver) {
+ IOperation operation = new UpdateBranchOperation(Activator.PLUGIN_ID, branch, resolver);
+ return Operations.executeAsJob(operation, true);
+ }
+
+ /**
+ * Completes the update branch operation by committing latest parent based branch with branch with changes. Then
+ * swaps branches so we are left with the most current branch containing latest changes.
+ *
+ * @param Job
+ */
+ public static Job completeUpdateBranch(final ConflictManagerExternal conflictManager, final boolean archiveSourceBranch, final boolean overwriteUnresolvedConflicts) {
+ IOperation operation =
+ new FinishUpdateBranchOperation(Activator.PLUGIN_ID, conflictManager, archiveSourceBranch,
+ overwriteUnresolvedConflicts);
+ return Operations.executeAsJob(operation, true);
+ }
+
+ /**
+ * Purges a branch from the system. (This operation cannot be undone.) All branch data will be removed.
+ *
+ * @param branch
+ */
+ public static Job purgeBranchInJob(final Branch branch) {
+ return Operations.executeAsJob(new PurgeBranchOperation(branch), true);
+ }
+
+ public static void purgeBranch(final Branch branch) throws OseeCoreException {
+ IOperation operation = new PurgeBranchOperation(branch);
+ Operations.executeWork(operation, new NullProgressMonitor(), -1);
+ try {
+ Operations.checkForStatusSeverityMask(operation.getStatus(), IStatus.ERROR | IStatus.WARNING);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ /**
+ * Delete a branch from the system. (This operation will set the branch state to deleted. This operation is
+ * undo-able)
+ *
+ * @param branchId
+ */
+ public static Job deleteBranch(final Branch branch) {
+ return Jobs.startJob(new DeleteBranchJob(branch));
+ }
+
+ public static void handleBranchDeletion(int branchId) {
+ Branch branch = instance.branchCache.remove(branchId);
+ if (branch != null) {
+ branch.setDeleted();
+ }
+ }
+
+ /**
+ * Commit the net changes from the source branch into the destination branch. If there are conflicts between the two
+ * branches, the source branch changes will override those on the destination branch.
+ *
+ * @param conflictManager
+ * @param archiveSourceBranch
+ * @throws OseeCoreException
+ */
+ public static void commitBranch(ConflictManagerExternal conflictManager, boolean archiveSourceBranch, boolean overwriteUnresolvedConflicts) throws OseeCoreException {
+ if (conflictManager.remainingConflictsExist() && !overwriteUnresolvedConflicts) {
+ throw new OseeCoreException("Commit failed due to unresolved conflicts");
+ }
+ if (!conflictManager.getDestinationBranch().isEditable()) {
+ throw new OseeCoreException("Commit failed - unable to commit into a non-editable branch");
+ }
+ runCommitExtPointActions(conflictManager.getSourceBranch());
+ new CommitDbTx(conflictManager, archiveSourceBranch).execute();
+ }
+
+ private static void runCommitExtPointActions(Branch branch) throws OseeCoreException {
+ instance.initCommitActions();
+ for (CommitAction commitAction : instance.commitActions) {
+ commitAction.runCommitAction(branch);
+ }
+ }
+
+ public static boolean isBranchInCommit(Branch branch) {
+ return CommitDbTx.isBranchInCommit(branch);
+ }
+
+ /**
+ * @throws OseeDataStoreException
+ */
+ int addCommitTransactionToDatabase(Branch toBranch, TransactionId fromTransactionID, User userToBlame) throws OseeDataStoreException {
+ int newTransactionNumber = SequenceManager.getNextTransactionId();
+
+ ConnectionHandler.runPreparedUpdate(COMMIT_TRANSACTION, TransactionDetailsType.NonBaselined.getId(),
+ toBranch.getBranchId(), newTransactionNumber, "Commit Branch " + fromTransactionID.getTransactionNumber(),
+ GlobalTime.GreenwichMeanTimestamp(), userToBlame == null ? -1 : userToBlame.getArtId(), -1);
+
+ return newTransactionNumber;
+ }
+
+ /**
+ * Archives a branch in the database by changing its archived value from 0 to 1.
+ */
+ public static void archive(Branch branch) throws OseeCoreException {
+ ConnectionHandler.runPreparedUpdate(ARCHIVE_BRANCH, branch.getBranchId());
+ branch.setArchived(true);
+ }
+
+ /**
+ * Unarchives a branch in the database by changing its archived value from 1 to 0.
+ */
+ public static void unArchive(Branch branch) throws OseeCoreException {
+ ConnectionHandler.runPreparedUpdate(UN_ARCHIVE_BRANCH, branch.getBranchId());
+ branch.setArchived(false);
+ }
+
+ /**
+ * Sets the branch state
+ *
+ * @throws OseeDataStoreException
+ */
+ public static void setBranchState(OseeConnection connection, Branch branch, BranchState branchState) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_BRANCH_STATE, branchState.getValue(), branch.getBranchId());
+ branch.setBranchState(branchState);
+ }
+
+ /**
+ * Sets the branch state
+ *
+ * @throws OseeDataStoreException
+ */
+ public static void setBranchState(Branch branch, BranchState branchState) throws OseeDataStoreException {
+ setBranchState(null, branch, branchState);
+ }
+
+ /**
+ * Sets the branch states
+ *
+ * @throws OseeDataStoreException
+ */
+ public static void setBranchState(OseeConnection connection, Map<Branch, BranchState> itemsToUpdate) throws OseeDataStoreException {
+ if (!itemsToUpdate.isEmpty()) {
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (Branch branch : itemsToUpdate.keySet()) {
+ data.add(new Object[] {itemsToUpdate.get(branch).getValue(), branch.getBranchId()});
+ }
+ ConnectionHandler.runBatchUpdate(connection, UPDATE_BRANCH_STATE, data);
+
+ for (Branch branch : itemsToUpdate.keySet()) {
+ branch.setBranchState(itemsToUpdate.get(branch));
+ }
+ }
+ }
+
+ /**
+ * Permanently removes transactions and any of their backing data that is not referenced by any other transactions.
+ *
+ * @param transactionIdNumber
+ */
+ public static void purgeTransactions(final int... transactionIdNumbers) {
+ purgeTransactions(null, transactionIdNumbers);
+ }
+
+ /**
+ * Permanently removes transactions and any of their backing data that is not referenced by any other transactions.
+ *
+ * @param transactionIdNumber
+ */
+ public static void purgeTransactions(IJobChangeListener jobChangeListener, final int... transactionIdNumbers) {
+ Jobs.startJob(new PurgeTransactionJob(transactionIdNumbers), jobChangeListener);
+
+ }
+
+ /**
+ * Move a transaction to a particular branch. This is simply a database call and should only be used to fix user
+ * errors. No internal cached data is updated, nor are any events fired from the modified data so any Skynet sessions
+ * reading this data should be restarted to see the changes.
+ *
+ * @throws OseeDataStoreException
+ */
+ public static void moveTransaction(TransactionId transactionId, Branch toBranch) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(UPDATE_TRANSACTION_BRANCH, toBranch.getBranchId(),
+ transactionId.getTransactionNumber());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.plugin.core.event.IEventReceiver#runOnEventInDisplayThread()
+ */
+ public boolean runOnEventInDisplayThread() {
+ return true;
+ }
+
+ public void updateAssociatedArtifact(Branch branch, Artifact artifact) throws OseeDataStoreException {
+ ConnectionHandler.runPreparedUpdate(UPDATE_ASSOCIATED_ART_BRANCH, artifact.getArtId(), branch.getBranchId());
+ }
+
+ /**
+ * Creates a new Branch based on the transaction number selected and the parent branch.
+ *
+ * @param parentTransactionId
+ * @param childBranchName
+ * @throws OseeCoreException
+ */
+ public static Branch createWorkingBranch(TransactionId parentTransactionId, String childBranchName, Artifact associatedArtifact) throws OseeCoreException {
+ return BranchCreator.getInstance().createChildBranch(parentTransactionId, childBranchName, associatedArtifact,
+ false, null, null);
+ }
+
+ /**
+ * Creates a new Branch based on the most recent transaction on the parent branch.
+ *
+ * @param parentTransactionId
+ * @param childBranchName
+ * @throws OseeCoreException
+ */
+ public static Branch createWorkingBranch(Branch parentBranch, String childBranchName, Artifact associatedArtifact) throws OseeCoreException {
+ TransactionId parentTransactionId = TransactionIdManager.getlatestTransactionForBranch(parentBranch);
+ return BranchCreator.getInstance().createChildBranch(parentTransactionId, childBranchName, associatedArtifact,
+ false, null, null);
+ }
+
+ /**
+ * Creates a new root branch, imports skynet types and initializes. If programatic access is necessary, setting the
+ * staticBranchName will add a key for this branch and allow access to the branch through
+ * getKeyedBranch(staticBranchName).
+ *
+ * @param branchName
+ * @param staticBranchName will allow programatic access to branch from getKeyedBranch
+ * @param skynetTypesImportExtensionsIds skynetDbTypes extensionIds to import onto new branch
+ * @param initializeArtifacts adds common artifacts needed by most normal root branches
+ * @throws Exception
+ * @see BranchManager#intializeBranch
+ * @see MasterSkynetTypesImport#importSkynetDbTypes
+ * @see BranchManager#getKeyedBranch(String)
+ */
+ public static Branch createTopLevelBranch(String branchName, String staticBranchName, Collection<String> skynetTypesImportExtensionsIds, boolean initializeArtifacts) throws OseeCoreException {
+ if (skynetTypesImportExtensionsIds != null && skynetTypesImportExtensionsIds.size() > 0) {
+ MasterSkynetTypesImport.importSkynetDbTypes(skynetTypesImportExtensionsIds);
+ }
+ return createTopLevelBranch(branchName, staticBranchName, initializeArtifacts);
+ }
+
+ public static Branch createTopLevelBranch(String branchName, String staticBranchName, boolean initializeArtifacts) throws OseeCoreException {
+ Branch systemRootBranch = BranchManager.getSystemRootBranch();
+ Branch branch =
+ HttpBranchCreation.createRootBranch(branchName, staticBranchName, systemRootBranch.getBranchId(),
+ systemRootBranch.getParentTransactionNumber(), false);
+ if (staticBranchName != null) {
+ setKeyedBranchInCache(staticBranchName, branch);
+ }
+ if (initializeArtifacts) {
+ RootBranchInitializer rootInitializer = new RootBranchInitializer();
+ rootInitializer.initialize(branch);
+ }
+ return branch;
+ }
+
+ public static Branch createSystemRootBranch() throws OseeCoreException {
+ return HttpBranchCreation.createRootBranch("System Root Branch", null, 1, 1, true);
+ }
+
+ public static List<Branch> getTopLevelBranches() throws OseeCoreException {
+ List<Branch> topLevelBranches = new ArrayList<Branch>();
+ for (Branch branch : getBranches(BranchArchivedState.UNARCHIVED, BranchControlled.ALL)) {
+ if (branch.isTopLevelBranch()) {
+ topLevelBranches.add(branch);
+ }
+ }
+ return topLevelBranches;
+ }
+
+ public static List<Branch> getChangeManagedBranches() throws OseeCoreException {
+ return getBranches(BranchArchivedState.UNARCHIVED, BranchControlled.CHANGE_MANAGED, BranchType.WORKING,
+ BranchType.TOP_LEVEL, BranchType.BASELINE);
+ }
+
+ private void initializeLastBranchValue() {
+ try {
+ String branchIdStr = UserManager.getUser().getSetting(LAST_DEFAULT_BRANCH);
+ if (branchIdStr == null) {
+ lastBranch = getDefaultInitialBranch();
+ UserManager.getUser().setSetting(LAST_DEFAULT_BRANCH, String.valueOf(lastBranch.getBranchId()));
+ } else {
+ lastBranch = getBranch(Integer.parseInt(branchIdStr));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private Branch getDefaultInitialBranch() throws OseeCoreException {
+ List<IDefaultInitialBranchesProvider> defaultBranchProviders = new LinkedList<IDefaultInitialBranchesProvider>();
+
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint(
+ "org.eclipse.osee.framework.skynet.core.DefaultInitialBranchProvider");
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals("Provider")) {
+ try {
+ defaultBranchProviders.add((IDefaultInitialBranchesProvider) element.createExecutableExtension("class"));
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+
+ for (IDefaultInitialBranchesProvider provider : defaultBranchProviders) {
+ try {
+ // Guard against problematic extensions
+ for (Branch branch : provider.getDefaultInitialBranches()) {
+ if (branch != null) {
+ return branch;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.WARNING,
+ "Exception occurred while trying to determine initial default branch", ex);
+ }
+ }
+
+ return getCommonBranch();
+ }
+
+ public static Branch getLastBranch() {
+ if (instance.lastBranch == null) {
+ instance.initializeLastBranchValue();
+ }
+ return instance.lastBranch;
+ }
+
+ public static void setLastBranch(Branch branch) {
+ if (branch != null) {
+ instance.lastBranch = branch;
+ }
+ }
+
+ /**
+ * @return the rootBranch
+ * @throws OseeCoreException
+ */
+ public static Branch getSystemRootBranch() throws OseeCoreException {
+ instance.ensurePopulatedCache(false);
+ return instance.systemRoot;
+ }
+
+ public static int getBranchTransaction(Date date, int branchId) throws OseeCoreException {
+ int transactionId = -1;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ if (date == null) {
+ throw new OseeCoreException("Must select a valid Date");
+ }
+ try {
+ chStmt.runPreparedQuery(SELECT_BRANCH_TRANSACTION, branchId, new Timestamp(date.getTime()));
+
+ if (chStmt.next()) {
+ transactionId = chStmt.getInt("transaction_id");
+ }
+ } finally {
+ chStmt.close();
+ }
+ return transactionId;
+ }
+
+ public static void setKeyedBranch(String keyname, Branch branch) throws OseeCoreException {
+ setKeyedBranchInCache(keyname, branch);
+ ConnectionHandler.runPreparedUpdate(OseeDbConnection.getConnection(), INSERT_DEFAULT_BRANCH_NAMES, keyname,
+ branch.getBranchId());
+ }
+
+ public static void setKeyedBranchInCache(String keyname, Branch branch) throws OseeCoreException {
+ instance.ensurePopulatedCache(false);
+ instance.keynameBranchMap.put(keyname.toLowerCase(), branch);
+ }
+
+ public static Branch getKeyedBranch(String keyname) throws OseeArgumentException, BranchDoesNotExist, OseeDataStoreException {
+ if (keyname == null) {
+ throw new OseeArgumentException("keyname can not be null");
+ }
+
+ instance.ensurePopulatedCache(false);
+ String lowerKeyname = keyname.toLowerCase();
+ if (instance.keynameBranchMap.containsKey(lowerKeyname)) {
+ return instance.keynameBranchMap.get(lowerKeyname);
+ } else {
+ throw new BranchDoesNotExist("The key \"" + keyname + "\" does not refer to any branch");
+ }
+ }
+
+ private void initCommitActions() {
+ if (commitActions == null) {
+ commitActions =
+ new ExtensionDefinedObjects<CommitAction>("org.eclipse.osee.framework.skynet.core.CommitActions",
+ "CommitActions", "className").getObjects();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ChangeArtifactType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ChangeArtifactType.java
new file mode 100644
index 00000000000..465da0b79e2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ChangeArtifactType.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * Changes the descriptor type of an artifact to the provided descriptor.
+ *
+ * @author Jeff C. Phillips
+ */
+public class ChangeArtifactType {
+ private static List<Attribute<?>> attributesToPurge;
+ private static List<RelationLink> relationsToDelete;
+ private static final IStatus promptStatus = new Status(IStatus.WARNING, Activator.PLUGIN_ID, 256, "", null);
+
+ /**
+ * Changes the descriptor of the artifacts to the provided artifact descriptor
+ *
+ * @param artifacts
+ * @param artifactType
+ */
+ public static void changeArtifactType(Collection<Artifact> artifacts, ArtifactType artifactType) throws OseeCoreException {
+ if (artifacts.isEmpty()) {
+ throw new OseeArgumentException("The artifact list can not be empty");
+ }
+
+ for (Artifact artifact : artifacts) {
+ processAttributes(artifact, artifactType);
+ processRelations(artifact, artifactType);
+
+ if (doesUserAcceptArtifactChange(artifact, artifactType)) {
+ changeArtifactType(artifact, artifactType);
+ }
+ }
+
+ // Kick Local and Remote Events
+ OseeEventManager.kickArtifactsChangeTypeEvent(ChangeArtifactType.class, artifactType.getArtTypeId(),
+ new LoadedArtifacts(artifacts));
+ }
+
+ public static void changeArtifactTypeReportOnly(StringBuffer results, Collection<Artifact> artifacts, ArtifactType artifactType) throws OseeCoreException {
+ if (artifacts.isEmpty()) {
+ throw new OseeArgumentException("The artifact list can not be empty");
+ }
+
+ for (Artifact artifact : artifacts) {
+ processAttributes(artifact, artifactType);
+ processRelations(artifact, artifactType);
+
+ if (!relationsToDelete.isEmpty() || !attributesToPurge.isEmpty()) {
+ getConflictString(results, artifact, artifactType);
+ }
+ }
+ }
+
+ private static void getConflictString(StringBuffer results, Artifact artifact, ArtifactType artifactType) {
+ results.append("There has been a conflict in changing artifact " + artifact.getHumanReadableId() + " - \"" + artifact.getDescriptiveName() + "\"" +
+ //
+ " to \"" + artifactType.getName() + "\" type. \n" + "The following data will need to be purged ");
+ for (RelationLink relationLink : relationsToDelete) {
+ results.append("([Relation][" + relationLink + "])");
+ }
+ for (Attribute<?> attribute : attributesToPurge) {
+ results.append("([Attribute][" + attribute.getAttributeType().getName() + "][" + attribute.toString() + "])");
+ }
+ results.append("\n\n");
+ }
+
+ /**
+ * Splits the attributes of the current artifact into two groups. The attributes that are compatable for the new type
+ * and the attributes that will need to be purged.
+ *
+ * @param artifact
+ * @param descriptor
+ */
+ private static void processAttributes(Artifact artifact, ArtifactType descriptor) throws OseeCoreException {
+ attributesToPurge = new LinkedList<Attribute<?>>();
+
+ Collection<AttributeType> attributeTypes =
+ TypeValidityManager.getAttributeTypesFromArtifactType(descriptor, artifact.getBranch());
+
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ if (!attributeTypes.contains(attributeType)) {
+ attributesToPurge.addAll(artifact.getAttributes(attributeType.getName()));
+ }
+ }
+ }
+
+ /**
+ * Splits the relationLinks of the current artifact into Two groups. The links that are compatable for the new type
+ * and the links that will need to be pruged.
+ *
+ * @param artifact
+ * @param artifactType
+ */
+ private static void processRelations(Artifact artifact, ArtifactType artifactType) {
+ relationsToDelete = new LinkedList<RelationLink>();
+
+ for (RelationLink link : artifact.getRelationsAll(false)) {
+ if (RelationTypeManager.getRelationSideMax(link.getRelationType(), artifactType, link.getSide(artifact)) == 0) {
+ relationsToDelete.add(link);
+ }
+ }
+ }
+
+ /**
+ * @param artifact
+ * @param artifactType
+ * @return true if the user accepts the purging of the attributes and relations that are not compatible for the new
+ * artifact type else false.
+ */
+ private static boolean doesUserAcceptArtifactChange(final Artifact artifact, final ArtifactType artifactType) {
+ if (!relationsToDelete.isEmpty() || !attributesToPurge.isEmpty()) {
+
+ StringBuffer sb = new StringBuffer(50);
+ getConflictString(sb, artifact, artifactType);
+ try {
+ return (Boolean) DebugPlugin.getDefault().getStatusHandler(promptStatus).handleStatus(promptStatus,
+ sb.toString());
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ return false;
+ }
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Sets the artifact descriptor.
+ *
+ * @param artifact
+ * @param artifactType
+ * @throws OseeCoreException
+ */
+ private static void changeArtifactType(Artifact artifact, ArtifactType artifactType) throws OseeCoreException {
+ for (Attribute<?> attribute : attributesToPurge) {
+ attribute.purge();
+ }
+
+ for (RelationLink relation : relationsToDelete) {
+ relation.delete(true);
+ }
+
+ artifact.changeArtifactType(artifactType);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/CommitDbTx.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/CommitDbTx.java
new file mode 100644
index 00000000000..fcbd0319cfd
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/CommitDbTx.java
@@ -0,0 +1,429 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+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.runtime.Platform;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * Commits gammaIds from a Source branch into a destination branch.
+ *
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class CommitDbTx extends DbTransaction {
+
+ //destination branch id, source branch id
+ private static final String INSERTION =
+ "INSERT INTO osee_txs(transaction_id, gamma_id, mod_type, tx_current) SELECT ?, tx1.gamma_id, tx1.mod_type, CASE WHEN tx1.mod_type = 3 THEN " + TxChange.DELETED.getValue() + " WHEN tx1.mod_type = 5 THEN " + TxChange.ARTIFACT_DELETED.getValue() + " ELSE " + TxChange.CURRENT.getValue() + " END ";
+ private static final String UPDATE =
+ "UPDATE osee_txs tx2 set tx_current = " + TxChange.NOT_CURRENT.getValue() + " WHERE (tx2.transaction_id, tx2.gamma_id) in (SELECT tx1.transaction_id, tx1.gamma_id ";
+ private static final String UPDATE_CURRENT_COMMIT_ATTRIBUTES =
+ UPDATE + "FROM osee_txs tx1, osee_tx_details td2, osee_attribute at3, osee_txs tx4, osee_tx_details td5, osee_attribute at6 WHERE tx1.transaction_id = td2.transaction_id AND td2.branch_id = ? AND tx1.gamma_id = at3.gamma_id AND tx1.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND td5.branch_id = ? AND tx4.transaction_id = td5.transaction_id AND td5.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND tx4.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND tx4.gamma_id = at6.gamma_id AND at6.attr_id = at3.attr_id)";
+
+ private static final String COMMIT_ATTRIBUTES =
+ INSERTION + "FROM osee_txs tx1, osee_tx_details td2, osee_attribute at3 WHERE tx1.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND tx1.transaction_id = td2.transaction_id AND td2.branch_id = ? AND td2.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND tx1.gamma_id = at3.gamma_id";
+
+ //destination branch id, source branch id
+ private static final String UPDATE_CURRENT_COMMIT_RELATIONS =
+ UPDATE + "FROM osee_txs tx1, osee_tx_details td2, osee_relation_link rl3, osee_txs tx4, osee_tx_details td5, osee_relation_link rl6 WHERE tx1.transaction_id = td2.transaction_id AND td2.branch_id = ? AND tx1.gamma_id = rl3.gamma_id AND tx1.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND td5.branch_id = ? AND tx4.transaction_id = td5.transaction_id AND td5.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND tx4.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND tx4.gamma_id = rl6.gamma_id AND rl6.rel_link_id = rl3.rel_link_id)";
+
+ private static final String COMMIT_RELATIONS =
+ INSERTION + "FROM osee_txs tx1, osee_tx_details td2, osee_relation_link rl3 WHERE tx1.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND tx1.transaction_id = td2.transaction_id AND td2.branch_id = ? AND td2.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND tx1.gamma_id = rl3.gamma_id";
+
+ //destination branch id, source branch id
+ private static final String UPDATE_CURRENT_COMMIT_ARTIFACTS =
+ UPDATE + "FROM osee_txs tx1, osee_tx_details td2, osee_artifact_version av3, osee_txs tx4, osee_tx_details td5, osee_artifact_version av6 WHERE tx1.transaction_id = td2.transaction_id AND td2.branch_id = ? AND tx1.gamma_id = av3.gamma_id AND tx1.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND td5.branch_id = ? AND tx4.transaction_id = td5.transaction_id AND td5.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND tx4.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND tx4.gamma_id = av6.gamma_id AND av6.art_id = av3.art_id)";
+
+ private static final String COMMIT_ARTIFACTS =
+ INSERTION + "FROM osee_txs tx1, osee_tx_details td2, osee_artifact_version av3 WHERE tx1.tx_current != " + TxChange.NOT_CURRENT.getValue() + " AND tx1.transaction_id = td2.transaction_id AND td2.branch_id = ? AND td2.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND tx1.gamma_id = av3.gamma_id";
+
+ private static final String UPDATE_MERGE_TRANSACTIONS =
+ "UPDATE osee_txs set gamma_id = ?, mod_type = " + ModificationType.MERGED.getValue() + " Where transaction_id = ? and gamma_id = ?";
+
+ private static final String UPDATE_MERGE_TRANSACTION_ID =
+ "UPDATE osee_merge set commit_transaction_id = ? Where source_branch_id = ? and dest_branch_id = ?";
+
+ private static final String ARTIFACT_CHANGES =
+ "SELECT av1.art_id, ? as branch_id FROM osee_txs tx1, osee_artifact_version av1 WHERE tx1.transaction_id = ? AND tx1.gamma_id = av1.gamma_id UNION ALL SELECT ar1.art_id, ? as branch_id FROM osee_txs tx1, osee_relation_link rl1, osee_artifact ar1 WHERE (rl1.a_art_id = ar1.art_id OR rl1.b_art_id = ar1.art_id) AND tx1.transaction_id = ? AND tx1.gamma_id = rl1.gamma_id";
+
+ private static final String UPDATE_MODIFICATION_ID =
+ "UPDATE osee_txs SET mod_type = " + ModificationType.NEW.getValue() + " WHERE mod_type = " + ModificationType.MODIFIED.getValue() + " AND (transaction_id, gamma_id) in ((SELECT transaction_id, txs0.gamma_id FROM osee_txs txs0, osee_artifact_version ver0 where txs0.transaction_id = ? and txs0.gamma_id = ver0.gamma_id and ver0.art_id in (SELECT art_id FROM osee_tx_details det1, osee_txs txs1, osee_artifact_version ver1 WHERE det1.branch_id = ? AND det1.transaction_id = txs1.transaction_id AND det1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND txs1.mod_type = " + ModificationType.NEW.getValue() + " AND txs1.gamma_id = ver1.gamma_id)) UNION (SELECT transaction_id, txs0.gamma_id FROM osee_txs txs0, osee_attribute ver0 where txs0.transaction_id = ? and txs0.gamma_id = ver0.gamma_id and ver0.attr_id in (SELECT attr_id FROM osee_tx_details det1, osee_txs txs1, osee_attribute ver1 WHERE det1.branch_id = ? AND det1.transaction_id = txs1.transaction_id AND det1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND txs1.mod_type = " + ModificationType.NEW.getValue() + " AND txs1.gamma_id = ver1.gamma_id)) UNION (SELECT transaction_id, txs0.gamma_id FROM osee_txs txs0, osee_relation_link ver0 where txs0.transaction_id = ? and txs0.gamma_id = ver0.gamma_id and (ver0.a_art_id , ver0.b_art_id) in (SELECT a_art_id, b_art_id FROM osee_tx_details det1, osee_txs txs1, osee_relation_link ver1 WHERE det1.branch_id = ? AND det1.transaction_id = txs1.transaction_id AND det1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND txs1.mod_type = " + ModificationType.NEW.getValue() + " AND txs1.gamma_id = ver1.gamma_id)))";
+
+ private static final String REVERT_DELETED_NEW =
+ "SELECT av1.art_id, td1.branch_id FROM osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_artifact_version av1, osee_artifact_version av2 WHERE td1.branch_id = ? AND td1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND td1.transaction_id = tx1.transaction_id AND tx1.mod_type = " + ModificationType.NEW.getValue() + " AND tx1.gamma_id = av1.gamma_id AND td2.branch_id = ? AND td2.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND td2.transaction_id = tx2.transaction_id AND tx2.tx_current = " + TxChange.DELETED.getValue() + " AND tx2.gamma_id = av2.gamma_id AND av1.art_id = av2.art_id";
+
+ private static final String REVERT_DELETED_NEW_ATTRIBUTE =
+ "SELECT atr2.attr_id, atr2.art_id, td2.branch_id FROM osee_txs tx2, osee_tx_details td2, osee_attribute atr2 WHERE td2.branch_id = ? AND td2.tx_type = " + TransactionDetailsType.NonBaselined.getId() + "AND td2.transaction_id = tx2.transaction_id AND tx2.tx_current in ( " + TxChange.DELETED.getValue() + " , " + TxChange.ARTIFACT_DELETED.getValue() + " ) AND tx2.gamma_id = atr2.gamma_id AND NOT EXISTS (SELECT td1.branch_id FROM osee_txs tx1, osee_tx_details td1, osee_attribute atr1 WHERE td1.branch_id = ? AND td1.tx_type = " + TransactionDetailsType.Baselined.getId() + " AND td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = atr1.gamma_id and atr1.attr_id = atr2.attr_id)";
+
+ private static final String REVERT_DELETED_NEW_REL_LINK =
+ "SELECT rel1.rel_link_id, td1.branch_id, tx2.transaction_id, tx2.gamma_id FROM osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_relation_link rel1, osee_relation_link rel2 WHERE td1.branch_id = ? AND td1.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND td1.transaction_id = tx1.transaction_id AND tx1.mod_type = " + ModificationType.NEW.getValue() + " AND tx1.gamma_id = rel1.gamma_id AND td2.branch_id = ? AND td2.tx_type = " + TransactionDetailsType.NonBaselined.getId() + " AND td2.transaction_id = tx2.transaction_id AND tx2.tx_current in ( " + TxChange.DELETED.getValue() + " , " + TxChange.ARTIFACT_DELETED.getValue() + " ) AND tx2.gamma_id = rel2.gamma_id AND rel1.rel_link_id = rel2.rel_link_id";
+ private static final String UPDATE_DELETED_NEW =
+ "UPDATE osee_txs set tx_current = 0 where gamma_id = ? AND transaction_id = ?";
+ private static final String RESET_DELETED_NEW =
+ "UPDATE osee_txs set tx_current = CASE WHEN mod_type = 3 THEN 2 WHEN mod_type = 5 THEN 3 ELSE 1 END WHERE gamma_id = ? AND transaction_id = ?";
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Commit"));
+ private static final boolean MERGE_DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Merge"));
+
+ private final boolean archiveSourceBranch;
+ private final ConflictManagerExternal conflictManager;
+
+ private int newTransactionNumber = -1;
+ private final Branch destinationBranch;
+ private final Branch sourceBranch;
+
+ private final Map<Branch, BranchState> savedBranchStates;
+
+ private boolean success = true;
+ private int fromBranchId = -1;
+ private final List<Object[]> relLinks = new ArrayList<Object[]>();
+ private long startTime;
+ // Store branches that are currently being committed
+ private static Set<Branch> branchesInCommit = new HashSet<Branch>();
+
+ protected CommitDbTx(ConflictManagerExternal conflictManager, boolean archiveSourceBranch) throws OseeCoreException {
+ this.savedBranchStates = new HashMap<Branch, BranchState>();
+ this.conflictManager = conflictManager;
+ this.destinationBranch = conflictManager.getDestinationBranch();
+ this.sourceBranch = conflictManager.getSourceBranch();
+ this.archiveSourceBranch = archiveSourceBranch;
+
+ savedBranchStates.put(sourceBranch, sourceBranch.getBranchState());
+ savedBranchStates.put(destinationBranch, destinationBranch.getBranchState());
+
+ if (DEBUG) {
+ OseeLog.log(Activator.class, Level.INFO, String.format("Commiting Branch %s into Branch %s",
+ conflictManager.getSourceBranch().getBranchId(), conflictManager.getDestinationBranch().getBranchId()));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.plugin.util.db.AbstractDbTxTemplate#handleTxWork()
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ branchesInCommit.add(this.sourceBranch);
+ User userToBlame = UserManager.getUser();
+
+ long time = System.currentTimeMillis();
+ startTime = System.currentTimeMillis();
+ int count = 0;
+ //Load new and deleted artifact so that they can be compressed out of the commit transaction
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(REVERT_DELETED_NEW, sourceBranch.getBranchId(), sourceBranch.getBranchId());
+
+ while (chStmt.next()) {
+ ArtifactPersistenceManager.revertArtifact(connection, chStmt.getInt("branch_id"), chStmt.getInt("art_id"));
+ count++;
+ }
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(
+ " Reverted %d Artifacts in %s to avoid committing new and deleted artifacts", count,
+ Lib.getElapseString(time)));
+ }
+ time = System.currentTimeMillis();
+ count = 0;
+ try {
+ chStmt.runPreparedQuery(REVERT_DELETED_NEW_ATTRIBUTE, sourceBranch.getBranchId(), sourceBranch.getBranchId());
+
+ while (chStmt.next()) {
+ ArtifactPersistenceManager.revertAttribute(connection, chStmt.getInt("branch_id"), chStmt.getInt("art_id"),
+ chStmt.getInt("attr_id"));
+ count++;
+ }
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(
+ " Reverted %d Attributes in %s to avoid committing new and deleted attributes", count,
+ Lib.getElapseString(time)));
+ }
+ //TODO Need to add in the Relation Link filter in the same mold as the above two filters.
+ //Added it in but not with a revert. just set tx_current to zero so it doesn't get committed
+ time = System.currentTimeMillis();
+
+ try {
+ chStmt.runPreparedQuery(REVERT_DELETED_NEW_REL_LINK, sourceBranch.getBranchId(), sourceBranch.getBranchId());
+
+ while (chStmt.next()) {
+ relLinks.add(new Object[] {chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")});
+ if (DEBUG) {
+ System.out.println(String.format(
+ " Setting transaction to 0 where gamma_id = %d and transaction_id = %d",
+ chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")));
+ }
+ }
+ if (relLinks.size() > 0) {
+ ConnectionHandler.runBatchUpdate(connection, UPDATE_DELETED_NEW, relLinks);
+ }
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(
+ " Set Tx_current to 0 for %d Relation Links in %s to avoid committing new and deleted attributes",
+ relLinks.size(), Lib.getElapseString(time)));
+ }
+ time = System.currentTimeMillis();
+ if (sourceBranch != null) {
+ newTransactionNumber =
+ addCommitTransactionToDatabase(connection, destinationBranch, sourceBranch, userToBlame);
+ fromBranchId = sourceBranch.getBranchId();
+ AccessControlManager.getInstance().removeAllPermissionsFromBranch(connection, sourceBranch);
+ } else {
+ //Commit transaction instead of a branch
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Added commit transaction [%d] into the DB in %s", newTransactionNumber,
+ Lib.getElapseString(time)));
+ }
+
+ time = System.currentTimeMillis();
+ //Set the tx_current on the destination branch to 0 for the attributes that will be updated
+ int insertCount =
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_CURRENT_COMMIT_ATTRIBUTES,
+ destinationBranch.getBranchId(), fromBranchId);
+ if (DEBUG) {
+ count = insertCount;
+ System.out.println(String.format(" Updated %d TX_Current values on Destination Branch for Attributes in %s",
+ count, Lib.getElapseString(time)));
+ }
+
+ time = System.currentTimeMillis();
+ //Add the new attribute value to the destination branch
+ insertCount +=
+ ConnectionHandler.runPreparedUpdate(connection, COMMIT_ATTRIBUTES, newTransactionNumber, fromBranchId);
+ if (DEBUG) {
+ System.out.println(String.format(" Commited %d Attributes in %s", insertCount - count,
+ Lib.getElapseString(time)));
+ count = insertCount;
+ }
+
+ time = System.currentTimeMillis();
+ insertCount +=
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_CURRENT_COMMIT_ARTIFACTS,
+ destinationBranch.getBranchId(), fromBranchId);
+ if (DEBUG) {
+ System.out.println(String.format(" Updated %d TX_Current values on Destination Branch for Artifacts in %s",
+ insertCount - count, Lib.getElapseString(time)));
+ count = insertCount;
+ }
+
+ time = System.currentTimeMillis();
+ insertCount +=
+ ConnectionHandler.runPreparedUpdate(connection, COMMIT_ARTIFACTS, newTransactionNumber, fromBranchId);
+ if (DEBUG) {
+ System.out.println(String.format(" Commited %d Artifacts in %s", insertCount - count,
+ Lib.getElapseString(time)));
+ count = insertCount;
+ }
+
+ time = System.currentTimeMillis();
+ insertCount +=
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_CURRENT_COMMIT_RELATIONS,
+ destinationBranch.getBranchId(), fromBranchId);
+ if (DEBUG) {
+ System.out.println(String.format(" Updated %d TX_Current values on Destination Branch for Relations in %s",
+ insertCount - count, Lib.getElapseString(time)));
+ count = insertCount;
+ }
+
+ time = System.currentTimeMillis();
+ insertCount +=
+ ConnectionHandler.runPreparedUpdate(connection, COMMIT_RELATIONS, newTransactionNumber, fromBranchId);
+ if (DEBUG) {
+ System.out.println(String.format(" Commited %d Relations in %s", insertCount - count,
+ Lib.getElapseString(time)));
+ count = insertCount;
+ }
+
+ //Change all modifications on artifacts/relation/attributes that are modified but should be new, because both new'd
+ //and modified on the same branch.
+ time = System.currentTimeMillis();
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_MODIFICATION_ID, newTransactionNumber, fromBranchId,
+ newTransactionNumber, fromBranchId, newTransactionNumber, fromBranchId);
+ if (DEBUG) {
+ System.out.println(String.format(" Updated modification types for new and modified to modified in %s",
+ Lib.getElapseString(time)));
+ }
+
+ //add in all merge branch changes over any other source branch changes.
+ time = System.currentTimeMillis();
+ if (conflictManager.originalConflictsExist()) {
+ count = 0;
+ for (Conflict conflict : conflictManager.getOriginalConflicts()) {
+ if (conflict.statusResolved()) {
+ count++;
+ if (MERGE_DEBUG) {
+ System.out.println(String.format(
+ " Using Merge value for Artifact %d item %s, setting gamma id to %d where it was %d",
+ conflict.getArtifact().getArtId(), conflict.getChangeItem(), conflict.getMergeGammaId(),
+ conflict.getSourceGamma()));
+ }
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_MERGE_TRANSACTIONS, conflict.getMergeGammaId(),
+ newTransactionNumber, conflict.getSourceGamma());
+ conflict.setStatus(ConflictStatus.COMMITTED);
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Added %d Merge Values in %s", count, Lib.getElapseString(time)));
+ }
+
+ time = System.currentTimeMillis();
+ //insert transaction id into the branch table
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_MERGE_TRANSACTION_ID, newTransactionNumber,
+ sourceBranch.getBranchId(), destinationBranch.getBranchId());
+ if (DEBUG) {
+ System.out.println(String.format(" Updated the Merge Transaction Id in the conflict table in %s",
+ Lib.getElapseString(time)));
+ }
+
+ Branch mergeBranch = BranchManager.getMergeBranch(sourceBranch, destinationBranch);
+ savedBranchStates.put(mergeBranch, mergeBranch.getBranchState());
+ BranchManager.setBranchState(connection, mergeBranch, BranchState.COMMITTED);
+ time = System.currentTimeMillis();
+ if (DEBUG) {
+ System.out.println(String.format(" Set Merge Branch [%s] to closed in %s", mergeBranch.getBranchName(),
+ Lib.getElapseString(time)));
+ }
+ }
+
+ if (relLinks.size() > 0) {
+ ConnectionHandler.runBatchUpdate(connection, RESET_DELETED_NEW, relLinks);
+ }
+
+ if (insertCount == 0) {
+ throw new OseeStateException(" A branch can not be commited without any changes made.");
+ }
+
+ BranchManager.setBranchState(connection, destinationBranch, BranchState.MODIFIED);
+
+ if (!sourceBranch.isRebaselined() && !sourceBranch.isRebaselineInProgress() && !sourceBranch.isCommitted()) {
+ BranchManager.setBranchState(connection, sourceBranch, BranchState.COMMITTED);
+ }
+ success = true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.db.AbstractDbTxTemplate#handleTxFinally()
+ */
+ @Override
+ protected void handleTxFinally() throws OseeCoreException {
+ if (success) {
+ // Update commit artifact cache with new information
+ if (sourceBranch.getAssociatedArtifactId() > 0) {
+ TransactionIdManager.cacheCommittedArtifactTransaction(sourceBranch.getAssociatedArtifact(),
+ TransactionIdManager.getTransactionId(newTransactionNumber));
+ }
+
+ long time = System.currentTimeMillis();
+ Object[] dataList =
+ new Object[] {destinationBranch.getBranchId(), newTransactionNumber, destinationBranch.getBranchId(),
+ newTransactionNumber};
+ // reload the committed artifacts since the commit changed them on the destination branch
+ ArtifactLoader.getArtifacts(ARTIFACT_CHANGES, dataList, 400, ArtifactLoad.FULL, true, null, null, true);
+ if (DEBUG) {
+ System.out.println(String.format(" Reloaded the Artifacts after the commit in %s",
+ Lib.getElapseString(time)));
+ }
+
+ if (archiveSourceBranch) {
+ sourceBranch.archive();
+ }
+ }
+ branchesInCommit.remove(this.sourceBranch);
+
+ if (success) {
+ OseeEventManager.kickBranchEvent(this, BranchEventType.Committed, fromBranchId);
+ }
+
+ if (DEBUG) {
+ System.out.println(String.format("Commit Completed in %s", Lib.getElapseString(startTime)));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.plugin.util.db.AbstractDbTxTemplate#handleTxException(java.lang.Exception)
+ */
+ @Override
+ protected void handleTxException(Exception ex) {
+ success = false;
+ // Restore Original Branch States
+ try {
+ BranchManager.setBranchState(null, savedBranchStates);
+ } catch (OseeDataStoreException ex1) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex1);
+ }
+ }
+
+ private static int addCommitTransactionToDatabase(OseeConnection connection, Branch parentBranch, Branch childBranch, User userToBlame) throws OseeCoreException {
+ int newTransactionNumber = SequenceManager.getNextTransactionId();
+
+ Timestamp timestamp = GlobalTime.GreenwichMeanTimestamp();
+ String comment = BranchManager.COMMIT_COMMENT + childBranch.getBranchName();
+ int authorId = userToBlame == null ? -1 : userToBlame.getArtId();
+ ConnectionHandler.runPreparedUpdate(connection, BranchManager.COMMIT_TRANSACTION,
+ TransactionDetailsType.NonBaselined.getId(), parentBranch.getBranchId(), newTransactionNumber, comment,
+ timestamp, authorId, childBranch.getAssociatedArtifactId());
+
+ return newTransactionNumber;
+ }
+
+ public static boolean isBranchInCommit(Branch branch) {
+ return branchesInCommit.contains(branch);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ControlLevel.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ControlLevel.java
new file mode 100644
index 00000000000..3cafd0d4ae0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ControlLevel.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.framework.skynet.core.artifact;
+
+/**
+ * Levels of control which an entity in the Skynet system is under.
+ *
+ * @author Robert A. Fisher
+ */
+public enum ControlLevel {
+ UNVERSIONED(false), VERSIONED(true), CHANGE_MANAGED(true);
+
+ private boolean versionControlled;
+
+ private ControlLevel(boolean versionControlled) {
+ this.versionControlled = versionControlled;
+ }
+
+ /**
+ * @return Returns the versionControlled.
+ */
+ public boolean isVersionControlled() {
+ return versionControlled;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/DeleteBranchJob.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/DeleteBranchJob.java
new file mode 100644
index 00000000000..352a0c99eea
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/DeleteBranchJob.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.framework.skynet.core.artifact;
+
+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.core.enums.BranchState;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class DeleteBranchJob extends Job {
+
+ private final Branch branch;
+
+ /**
+ * @param name
+ * @param branch
+ */
+ public DeleteBranchJob(Branch branch) {
+ super("Delete Branch: " + branch);
+ this.branch = branch;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus status = Status.OK_STATUS;
+ monitor.beginTask(getName(), 1);
+ try {
+ BranchManager.setBranchState(branch, BranchState.DELETED);
+ BranchManager.archive(branch);
+ BranchManager.handleBranchDeletion(branch.getBranchId());
+ } catch (Exception ex) {
+ status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error - " + getName(), ex);
+ } finally {
+ monitor.done();
+ }
+ return status;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GeneralData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GeneralData.java
new file mode 100644
index 00000000000..378bd846b68
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GeneralData.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.framework.skynet.core.artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GeneralData {
+
+ public static String ARTIFACT_TYPE = "General Data";
+
+ public static String GENERAL_STRING_ATTRIBUTE_TYPE_NAME = "General String Data";
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GlobalPreferences.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GlobalPreferences.java
new file mode 100644
index 00000000000..1617cb41aed
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/GlobalPreferences.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.framework.skynet.core.artifact;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GlobalPreferences extends Artifact {
+
+ private static GlobalPreferences instance;
+ public static String ARTIFACT_NAME = "Global Preferences";
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public GlobalPreferences(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public static GlobalPreferences get() throws OseeCoreException {
+ if (instance == null) {
+ instance =
+ (GlobalPreferences) ArtifactQuery.getArtifactFromTypeAndName(ARTIFACT_NAME, ARTIFACT_NAME,
+ BranchManager.getCommonBranch());
+ }
+ return instance;
+ }
+
+ public static void createGlobalPreferencesArtifact(SkynetTransaction transaction) throws OseeCoreException {
+ Artifact art =
+ ArtifactTypeManager.addArtifact(GlobalPreferences.ARTIFACT_NAME, BranchManager.getCommonBranch(),
+ GlobalPreferences.ARTIFACT_NAME);
+ art.persistAttributes(transaction);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/HttpBranchCreation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/HttpBranchCreation.java
new file mode 100644
index 00000000000..bfe3d19a44a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/HttpBranchCreation.java
@@ -0,0 +1,132 @@
+/*
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class HttpBranchCreation {
+
+ public static Branch createChildBranch(TransactionId parentTransactionId, String childBranchName, Artifact associatedArtifact, boolean preserveMetaData, Collection<Integer> compressArtTypeIds, Collection<Integer> preserveArtTypeIds) throws OseeCoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("sessionId", ClientSessionManager.getSessionId());
+ parameters.put("branchName", childBranchName);
+ parameters.put("function", "createChildBranch");
+ parameters.put("authorId", getAuthorId());
+ parameters.put("parentBranchId", Integer.toString(parentTransactionId.getBranchId()));
+ parameters.put("parentTransactionId", Integer.toString(parentTransactionId.getTransactionNumber()));
+ parameters.put("associatedArtifactId", getAssociatedArtifactId(associatedArtifact));
+
+ if (compressArtTypeIds != null && !compressArtTypeIds.isEmpty()) {
+ parameters.put("compressArtTypes", Collections.toString(",", compressArtTypeIds));
+ }
+
+ if (preserveArtTypeIds != null && !preserveArtTypeIds.isEmpty()) {
+ parameters.put("preserveArtTypes", Collections.toString(",", preserveArtTypeIds));
+ }
+
+ parameters.put(
+ "creationComment",
+ BranchManager.NEW_BRANCH_COMMENT + parentTransactionId.getBranch().getBranchName() + "(" + parentTransactionId.getTransactionNumber() + ")");
+
+ return commonServletBranchingCode(parameters);
+ }
+
+ /**
+ * Creates a new root branch. Should NOT be used outside BranchManager. If programatic access is necessary, setting
+ * the staticBranchName will add a key for this branch and allow access to the branch through
+ * getKeyedBranch(staticBranchName).
+ *
+ * @param shortBranchName
+ * @param branchName
+ * @param staticBranchName null if no static key is desired
+ * @param parentTransactionId TODO
+ * @return branch object
+ * @throws OseeCoreException
+ * @see BranchManager#createRootBranch(String, String, int)
+ * @see BranchManager#getKeyedBranch(String)
+ */
+ public static Branch createRootBranch(String branchName, String staticBranchName, int parentBranchId, int parentTransactionId, boolean systemRootBranch) throws OseeCoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("sessionId", ClientSessionManager.getSessionId());
+ parameters.put("branchName", branchName);
+ parameters.put("function", "createRootBranch");
+ parameters.put("authorId", getAuthorId());
+ parameters.put("parentBranchId", Integer.toString(parentBranchId));
+ parameters.put("parentTransactionId", Integer.toString(parentTransactionId));
+ parameters.put("associatedArtifactId", getAssociatedArtifactId(null));
+ parameters.put("creationComment", String.format("Root Branch [%s] Creation", branchName));
+
+ if (staticBranchName != null && staticBranchName.length() > 0) {
+ parameters.put("staticBranchName", staticBranchName);
+ }
+
+ if (systemRootBranch) {
+ parameters.put("systemRootBranch", "true");
+ }
+ return commonServletBranchingCode(parameters);
+ }
+
+ private static Branch commonServletBranchingCode(Map<String, String> parameters) throws OseeCoreException {
+ Branch branch = null;
+ String response = "";
+ try {
+ response =
+ HttpProcessor.post(new URL(HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(
+ OseeServerContext.BRANCH_CREATION_CONTEXT, parameters)));
+ int branchId = Integer.parseInt(response);
+ branch = BranchManager.getBranch(branchId);
+ } catch (NumberFormatException ex) {
+ throw new OseeCoreException(response);
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+
+ // Kick events
+ OseeEventManager.kickBranchEvent(HttpBranchCreation.class, BranchEventType.Added, branch.getBranchId());
+
+ return branch;
+ }
+
+ private static String getAssociatedArtifactId(Artifact associatedArtifact) throws OseeCoreException {
+ int associatedArtifactId = -1;
+ if (associatedArtifact == null && !SkynetDbInit.isDbInit()) {
+ associatedArtifact = UserManager.getUser(SystemUser.OseeSystem);
+ }
+ if (associatedArtifact != null) {
+ associatedArtifactId = associatedArtifact.getArtId();
+ }
+ return Integer.toString(associatedArtifactId);
+ }
+
+ private static String getAuthorId() throws OseeCoreException {
+ return Integer.toString(UserManager.getUser().getArtId());
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSArtifact.java
new file mode 100644
index 00000000000..ddacd8edf27
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSArtifact.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.framework.skynet.core.artifact;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * Class exists to mark ATS Artifacts so the EventManager in core can report the artifact type
+ *
+ * @author Donald G. Dunne
+ */
+public interface IATSArtifact {
+
+ public Artifact getParentAtsArtifact() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSStateMachineArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSStateMachineArtifact.java
new file mode 100644
index 00000000000..604c5155c59
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IATSStateMachineArtifact.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.framework.skynet.core.artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IATSStateMachineArtifact {
+
+ public abstract String getGuid();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IArtifactCheck.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IArtifactCheck.java
new file mode 100644
index 00000000000..6408364881a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IArtifactCheck.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.framework.skynet.core.artifact;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IArtifactCheck {
+
+ /**
+ * Checks set of artifacts for validation prior to delete
+ *
+ * @param artifacts
+ * @return Result with description of which artifact and why can't delete
+ * @throws OseeCoreException
+ */
+ public IStatus isDeleteable(Collection<Artifact> artifacts) throws OseeCoreException;
+
+ /**
+ * Checks set of artifacts for validation prior to rename
+ *
+ * @param artifacts
+ * @return Result with description of which artifact and why can't rename
+ * @throws OseeCoreException
+ */
+ public IStatus isRenamable(Collection<Artifact> artifacts) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IAttributeSaveListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IAttributeSaveListener.java
new file mode 100644
index 00000000000..2c3c45b734d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IAttributeSaveListener.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.framework.skynet.core.artifact;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAttributeSaveListener {
+
+ public void notifyOnAttributeSave(Artifact artifacts) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IBranchProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IBranchProvider.java
new file mode 100644
index 00000000000..3df68a23234
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IBranchProvider.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.framework.skynet.core.artifact;
+
+/**
+ * @author Theron Virgin
+ */
+public interface IBranchProvider {
+
+ public Branch getBranch();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IDefaultInitialBranchesProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IDefaultInitialBranchesProvider.java
new file mode 100644
index 00000000000..750c381bbbe
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/IDefaultInitialBranchesProvider.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.framework.skynet.core.artifact;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IDefaultInitialBranchesProvider {
+ public Collection<Branch> getDefaultInitialBranches() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ISearchConfirmer.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ISearchConfirmer.java
new file mode 100644
index 00000000000..ea790715493
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/ISearchConfirmer.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.framework.skynet.core.artifact;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface ISearchConfirmer {
+
+ public boolean canProceed(int count);
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/MergeBranchManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/MergeBranchManager.java
new file mode 100644
index 00000000000..4e5983fd6e4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/MergeBranchManager.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.framework.skynet.core.artifact;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Theron Virgin
+ */
+public class MergeBranchManager {
+ public static void updateMergeBranch(Branch mergeBranch, ArrayList<Integer> expectedArtIds, Branch destBranch, Branch sourceBranch) throws OseeCoreException {
+ UpdateMergeBranch dbTransaction = new UpdateMergeBranch(mergeBranch, expectedArtIds, destBranch, sourceBranch);
+ dbTransaction.execute();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/NativeArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/NativeArtifact.java
new file mode 100644
index 00000000000..a09fbf01c98
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/NativeArtifact.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.framework.skynet.core.artifact;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import org.eclipse.osee.framework.db.connection.exception.MultipleAttributesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * Artifact type used to indicate that this artifact is to be rendered by a passing its binary data to a native program
+ * for editing.
+ *
+ * @author Ryan D. Brooks
+ */
+public class NativeArtifact extends Artifact {
+ public static final String CONTENT_NAME = "Native Content";
+ public static final String EXTENSION = "Extension";
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param branch
+ */
+ public NativeArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public String getFileName() throws OseeCoreException {
+ return getDescriptiveName() + "." + getFileExtension();
+ }
+
+ public String getFileExtension() throws OseeCoreException {
+ return getSoleAttributeValue(EXTENSION, "");
+ }
+
+ public InputStream getNativeContent() throws OseeCoreException {
+ return getSoleAttributeValue(CONTENT_NAME);
+ }
+
+ public void setNativeContent(File importFile) throws OseeCoreException, FileNotFoundException {
+ setNativeContent(new FileInputStream(importFile));
+ }
+
+ public void setNativeContent(InputStream inputStream) throws OseeCoreException {
+ setSoleAttributeValue(CONTENT_NAME, inputStream);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.Artifact#getSoleAttributeValueAsString(java.lang.String, java.lang.String)
+ */
+ @Override
+ public String getSoleAttributeValueAsString(String attributeTypeName, String defaultReturnValue) throws OseeCoreException, MultipleAttributesExist {
+ String toReturn = null;
+ if (CONTENT_NAME.equals(attributeTypeName)) {
+ InputStream inputStream = getNativeContent();
+ if (inputStream == null) {
+ toReturn = defaultReturnValue;
+ } else {
+ try {
+ toReturn = Lib.inputStreamToString(inputStream);
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ } else {
+ toReturn = super.getSoleAttributeValueAsString(attributeTypeName, defaultReturnValue);
+ }
+ return toReturn;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeBranchOperation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeBranchOperation.java
new file mode 100644
index 00000000000..b080b90e4be
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeBranchOperation.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.core.operation.AbstractDbTxOperation;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class PurgeBranchOperation extends AbstractDbTxOperation {
+ private static final String COUNT_CHILD_BRANCHES =
+ "select count(branch_id) as child_branches from osee_branch WHERE parent_branch_id = ?";
+
+ private static final String SEARCH_FOR_DELETABLE_GAMMAS =
+ "select ?, gamma_id from osee_tx_details det1, osee_txs txs1 where det1.branch_id = ? AND det1.transaction_id = txs1.transaction_id AND NOT EXISTS (SELECT 'not_matter' FROM OSEE_TX_DETAILS det2, OSEE_TXS txs2 WHERE txs1.gamma_id = txs2.gamma_id AND det2.transaction_id = txs2.transaction_id AND det1.branch_id <> det2.branch_id)";
+
+ private static final String POPULATE_BRANCH_DELETE_HELPER_WITH_GAMMAS =
+ "insert into osee_branch_delete_helper (branch_id, gamma_id) " + SEARCH_FOR_DELETABLE_GAMMAS;
+
+ private static final String SEARCH_FOR_REMOVED_DELETABLE_GAMMAS =
+ "select ?, rem_gamma_id AS gamma_id from osee_tx_details det1, OSEE_REMOVED_TXS txs1 WHERE det1.branch_id = ? AND det1.transaction_id = txs1.transaction_id AND NOT EXISTS (SELECT 'not_matter' FROM OSEE_TX_DETAILS det2, OSEE_TXS txs2 WHERE txs1.rem_gamma_id = txs2.gamma_id AND det2.transaction_id = txs2.transaction_id AND det1.branch_id <> det2.branch_id)";
+
+ private static final String POPULATE_BRANCH_DELETE_HELPER_WITH_REMOVED_GAMMAS =
+ "insert into osee_branch_delete_helper (branch_id, gamma_id) " + SEARCH_FOR_REMOVED_DELETABLE_GAMMAS;
+
+ private static final String IN_HELPER_TABLE =
+ " where exists (select obdh.gamma_id from osee_branch_delete_helper obdh where obdh.gamma_id = item.gamma_id and obdh.branch_id = ?)";
+
+ private static final String PURGE_ATTRIBUTE_VERSIONS = "delete from osee_attribute item " + IN_HELPER_TABLE;
+
+ private static final String PURGE_RELATION_VERSIONS = "delete from osee_relation_link item " + IN_HELPER_TABLE;
+
+ private static final String PURGE_ARTIFACT_VERSIONS = "delete from osee_artifact_version item" + IN_HELPER_TABLE;
+
+ private static final String DELETE_FROM_BRANCH_TABLE = "delete from osee_branch where branch_id = ?";
+
+ private static final String DELETE_FROM_ARTIFACT =
+ "delete from osee_artifact item where exists (select oa.art_id from osee_artifact oa where oa.art_id = item.art_id %s select oav.art_id from osee_artifact_version oav)";
+
+ private static final String DELETE_FROM_BRANCH_DELETE_HELPER =
+ "delete from osee_branch_delete_helper where branch_id = ?";
+
+ private final Branch branch;
+
+ /**
+ * @param name
+ * @param branch
+ */
+ public PurgeBranchOperation(Branch branch) {
+ super(String.format("Purge Branch: [(%s)-%s]", branch.getBranchId(), branch.getBranchName()), Activator.PLUGIN_ID);
+ this.branch = branch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractDbTxOperation#handleTxWork(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.framework.db.connection.OseeConnection)
+ */
+ @Override
+ protected void doTxWork(IProgressMonitor monitor, OseeConnection connection) throws OseeCoreException {
+ int numberOfChildren =
+ ConnectionHandler.runPreparedQueryFetchInt(connection, 0, COUNT_CHILD_BRANCHES, branch.getBranchId());
+ if (numberOfChildren > 0) {
+ throw new OseeArgumentException("Unable to purge a branch containing children");
+ }
+
+ ConnectionHandler.runPreparedUpdate(POPULATE_BRANCH_DELETE_HELPER_WITH_GAMMAS, branch.getBranchId(),
+ branch.getBranchId());
+ monitor.worked(calculateWork(0.10));
+
+ ConnectionHandler.runPreparedUpdate(POPULATE_BRANCH_DELETE_HELPER_WITH_REMOVED_GAMMAS, branch.getBranchId(),
+ branch.getBranchId());
+ monitor.worked(calculateWork(0.10));
+
+ purgeHelper(monitor, connection, "Attribute Versions", PURGE_ATTRIBUTE_VERSIONS, 0.15, branch.getBranchId());
+ purgeHelper(monitor, connection, "Relation Versions", PURGE_RELATION_VERSIONS, 0.15, branch.getBranchId());
+ purgeHelper(monitor, connection, "Artifact Versions", PURGE_ARTIFACT_VERSIONS, 0.15, branch.getBranchId());
+
+ String exceptSyntax = SupportedDatabase.isDatabaseType(SupportedDatabase.oracle) ? "MINUS" : "EXCEPT";
+
+ String deleteFromArtifactTable = String.format(DELETE_FROM_ARTIFACT, exceptSyntax);
+ //TODO review sql purgeHelper(monitor, connection, "Artifact", deleteFromArtifactTable, 0.15);
+ monitor.worked(calculateWork(0.15));
+
+ purgeHelper(monitor, connection, "Branch", DELETE_FROM_BRANCH_TABLE, 0.10, branch.getBranchId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doFinally(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doFinally(IProgressMonitor monitor) {
+ super.doFinally(monitor);
+ if (getStatus().isOK()) {
+ BranchManager.handleBranchDeletion(branch.getBranchId());
+ }
+ monitor.worked(calculateWork(0.10));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#createErrorStatus(java.lang.Throwable)
+ */
+ @Override
+ protected IStatus createErrorStatus(Throwable error) {
+ IStatus status = super.createErrorStatus(error);
+ if (!status.matches(IStatus.CANCEL)) {
+ try {
+ ConnectionHandler.runPreparedUpdate(DELETE_FROM_BRANCH_DELETE_HELPER, branch.getBranchId());
+ } catch (OseeDataStoreException ex1) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex1);
+ }
+ }
+ return status;
+ }
+
+ private void purgeHelper(IProgressMonitor monitor, OseeConnection connection, String type, String updateSql, double workPercentage, Object... data) throws OseeDataStoreException {
+ monitor.setTaskName(String.format("Purge %s", type));
+ checkForCancelledStatus(monitor);
+ ConnectionHandler.runPreparedUpdate(connection, updateSql, data);
+ monitor.worked(calculateWork(workPercentage));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeDbTransaction.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeDbTransaction.java
new file mode 100644
index 00000000000..3e7bf458e15
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeDbTransaction.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PurgeDbTransaction extends DbTransaction {
+
+ private static final String INSERT_SELECT_RELATIONS =
+ "INSERT INTO osee_join_transaction (query_id, insert_time, gamma_id, transaction_id) SELECT ?, ?, txs1.gamma_id, txs1.transaction_id FROM osee_join_artifact al1, osee_relation_link rel1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND (al1.art_id = rel1.a_art_id OR al1.art_id = rel1.b_art_id) AND rel1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id";
+
+ private static final String INSERT_SELECT_ATTRIBUTES =
+ "INSERT INTO osee_join_transaction (query_id, insert_time, gamma_id, transaction_id) SELECT ?, ?, txs1.gamma_id, txs1.transaction_id FROM osee_join_artifact al1, osee_attribute att1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = att1.art_id AND att1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = al1.branch_id order by al1.branch_id, al1.art_id";
+
+ private static final String INSERT_SELECT_ARTIFACTS =
+ "INSERT INTO osee_join_transaction (query_id, insert_time, gamma_id, transaction_id) SELECT ?, ?, txs1.gamma_id, txs1.transaction_id FROM osee_join_artifact al1, osee_artifact art1, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = art1.art_id AND art1.art_id = arv1.art_id AND arv1.gamma_id = txs1.gamma_id AND txd1.branch_id = al1.branch_id AND txd1.transaction_id = txs1.transaction_id";
+
+ private static final String COUNT_ARTIFACT_VIOLATIONS =
+ "SELECT art1.art_id, txd1.branch_id FROM osee_join_artifact al1, osee_artifact art1, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE al1.query_id = ? AND al1.art_id = art1.art_id AND art1.art_id = arv1.art_id AND arv1.gamma_id = txs1.gamma_id AND txd1.branch_id = al1.branch_id AND txd1.transaction_id = txs1.transaction_id";
+ private static final String DELETE_FROM_TXS_USING_JOIN_TRANSACTION =
+ "DELETE FROM osee_txs txs1 WHERE EXISTS ( select 1 from osee_join_transaction jt1 WHERE jt1.query_id = ? AND jt1.transaction_id = txs1.transaction_id AND jt1.gamma_id = txs1.gamma_id)";
+ private static final String DELETE_FROM_TX_DETAILS_USING_JOIN_TRANSACTION =
+ "DELETE FROM osee_tx_details txd1 WHERE EXISTS ( select 1 from osee_join_transaction jt1 WHERE jt1.query_id = ? AND jt1.transaction_id = txd1.transaction_id AND not exists ( select * from osee_txs txs1 where txs1.transaction_id = jt1.transaction_id))";
+ private static final String DELETE_FROM_RELATION_VERSIONS =
+ "DELETE FROM osee_relation_link rel1 WHERE EXISTS ( select * from osee_join_transaction jt1 WHERE jt1.query_id = ? AND jt1.gamma_id = rel1.gamma_id AND not exists ( select * from osee_txs txs1 where txs1.gamma_id = jt1.gamma_id))";
+ private static final String DELETE_FROM_ATTRIBUTE_VERSIONS =
+ "DELETE FROM osee_attribute attr1 WHERE EXISTS ( select * from osee_join_transaction jt1 WHERE jt1.query_id = ? AND jt1.gamma_id = attr1.gamma_id AND not exists ( select * from osee_txs txs1 where txs1.gamma_id = jt1.gamma_id))";
+ private static final String DELETE_FROM_ARTIFACT_VERSIONS =
+ "DELETE FROM osee_artifact_version artv1 WHERE EXISTS ( select * from osee_join_transaction jt1 WHERE jt1.query_id = ? AND jt1.gamma_id = artv1.gamma_id AND not exists ( select * from osee_txs txs1 where txs1.gamma_id = jt1.gamma_id))";
+ private static final String DELETE_FROM_ARTIFACT =
+ "DELETE FROM osee_artifact art1 WHERE EXISTS ( select * from osee_join_artifact ja1 WHERE ja1.query_id = ? AND ja1.art_id = art1.art_id AND not exists ( select * from osee_artifact_version artv1 where artv1.art_id = ja1.art_id))";
+
+ private final Collection<? extends Artifact> artifactsToPurge;
+
+ /**
+ * @param artifactsToPurge
+ */
+ public PurgeDbTransaction(Collection<? extends Artifact> artifactsToPurge) throws OseeCoreException {
+ this.artifactsToPurge = artifactsToPurge;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.DbTransaction#handleTxWork(java.sql.Connection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ //first determine if the purge is legal.
+ List<Object[]> batchParameters = new ArrayList<Object[]>();
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ try {
+ for (Artifact art : artifactsToPurge) {
+ for (Branch branch : art.getBranch().getChildBranches(true)) {
+ batchParameters.add(new Object[] {queryId, insertTime, art.getArtId(), branch.getBranchId(),
+ SQL3DataType.INTEGER});
+ }
+ }
+ if (batchParameters.size() > 0) {
+ ArtifactLoader.insertIntoArtifactJoin(connection, batchParameters);
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(COUNT_ARTIFACT_VIOLATIONS, queryId);
+ boolean failed = false;
+ StringBuilder sb = new StringBuilder();
+ while (chStmt.next()) {
+ failed = true;
+ sb.append("ArtifactId[");
+ sb.append(chStmt.getInt("art_id"));
+ sb.append("] BranchId[");
+ sb.append(chStmt.getInt("branch_id"));
+ sb.append("]\n");
+ }
+ if (failed) {
+ throw new OseeCoreException(String.format(
+ "Unable to purge because the following artifacts exist on child branches.\n%s", sb.toString()));
+ }
+ } finally {
+ ArtifactLoader.clearQuery(connection, queryId);
+ chStmt.close();
+ }
+ }
+
+ // now load the artifacts to be purged
+ batchParameters.clear();
+ queryId = ArtifactLoader.getNewQueryId();
+ insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ // insert into the artifact_join_table
+ for (Artifact art : artifactsToPurge) {
+ batchParameters.add(new Object[] {queryId, insertTime, art.getArtId(), art.getBranch().getBranchId(),
+ SQL3DataType.INTEGER});
+ }
+ ArtifactLoader.insertIntoArtifactJoin(connection, batchParameters);
+
+ //run the insert select queries to populate the osee_join_transaction table (this will take care of the txs table)
+ int transactionJoinId = ArtifactLoader.getNewQueryId();
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_SELECT_RELATIONS, transactionJoinId, insertTime,
+ queryId);
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_SELECT_ATTRIBUTES, transactionJoinId, insertTime,
+ queryId);
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_SELECT_ARTIFACTS, transactionJoinId, insertTime,
+ queryId);
+
+ //delete from the txs table
+ int txsDeletes =
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_TXS_USING_JOIN_TRANSACTION,
+ transactionJoinId);
+
+ int txdDeletes =
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_TX_DETAILS_USING_JOIN_TRANSACTION,
+ transactionJoinId);
+
+ int relationVersions =
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_RELATION_VERSIONS, transactionJoinId);
+ int attributeVersions =
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_ATTRIBUTE_VERSIONS, transactionJoinId);
+ int artifactVersions =
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_ARTIFACT_VERSIONS, transactionJoinId);
+ int artifact = ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_ARTIFACT, queryId);
+
+ OseeLog.log(
+ Activator.class,
+ Level.INFO,
+ String.format(
+ "Purge Row Deletes: txs rows [%d], rel ver rows [%d], attr ver rows [%d] art ver rows [%d] art rows [%d]. txs vs. total versions [%d vs %d]",
+ txsDeletes, relationVersions, attributeVersions, artifactVersions, artifact, txsDeletes,
+ (relationVersions + attributeVersions + artifactVersions)));
+
+ ConnectionHandler.runPreparedUpdate(connection, "DELETE FROM osee_join_transaction where query_id = ?",
+ transactionJoinId);
+
+ for (Artifact art : artifactsToPurge) {
+ art.setDeleted();
+ for (RelationLink rel : art.getRelationsAll(false)) {
+ rel.markAsPurged();
+ }
+ for (Attribute<?> attr : art.internalGetAttributes()) {
+ attr.markAsPurged();
+ }
+ }
+
+ // Kick Local and Remote Events
+ OseeEventManager.kickArtifactsPurgedEvent("PurgeDbTransaction", new LoadedArtifacts(artifactsToPurge));
+
+ } finally {
+ ArtifactLoader.clearQuery(connection, queryId);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeTransactionJob.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeTransactionJob.java
new file mode 100644
index 00000000000..4f115f48d36
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/PurgeTransactionJob.java
@@ -0,0 +1,311 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+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.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.TransactionJoinQuery;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PurgeTransactionJob extends Job {
+
+ private static final String UPDATE_TXS_DETAILS_COMMENT =
+ "update osee_tx_details SET osee_comment = replace(osee_comment, ?, ?) WHERE osee_comment like ?";
+
+ private static final String SELECT_GAMMAS_FROM_TRANSACTION =
+ "SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, osee_join_transaction txj1 WHERE " + "txs1.transaction_id = txj1.transaction_id AND txj1.query_id = ? AND " + "NOT EXISTS (SELECT 'x' FROM osee_txs txs2 WHERE txs1.gamma_id = txs2.gamma_id AND txs1.transaction_id <> txs2.transaction_id)";
+
+ private static final String DELETE_TRANSACTION_FROM_TRANSACTION_DETAILS =
+ "DELETE FROM osee_tx_details WHERE transaction_id IN (SELECT txj1.transaction_id FROM osee_join_transaction txj1 WHERE txj1.query_id = ?)";
+
+ private static final String DELETE_POSTFIX =
+ " outerTb where outerTb.gamma_id = (SELECT txj1.gamma_id from osee.osee_join_transaction txj1 WHERE outerTb.gamma_id = txj1.gamma_id AND txj1.query_id = ?)";
+
+ private static final String SELECT_ATTRIBUTES_TO_UPDATE =
+ "SELECT maxt, txs2.gamma_id FROM osee_attribute att2, osee_txs txs2, (SELECT MAX(txs1.transaction_id) AS maxt, att1.attr_id AS atid, txd1.branch_id FROM osee_attribute att1, osee_txs txs1, osee_tx_details txd1 WHERE att1.gamma_id = txs1.gamma_id and txs1.transaction_id >= ? AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id = ? GROUP BY att1.attr_id, txd1.branch_id) new_stuff WHERE atid = att2.attr_id AND att2.gamma_id = txs2.gamma_id AND txs2.transaction_id = maxt and txs2.transaction_id >= ?";
+ private static final String SELECT_ARTIFACTS_TO_UPDATE =
+ "SELECT maxt, txs1.gamma_id FROM osee_artifact_version arv2, osee_txs txs1, (SELECT MAX(txs2.transaction_id) AS maxt, arv1.art_id AS art, txd1.branch_id FROM osee_artifact_version arv1, osee_txs txs2, osee_tx_details txd1 WHERE arv1.gamma_id = txs2.gamma_id and txs2.transaction_id >= ? AND txs2.transaction_id = txd1.transaction_id AND txd1.branch_id = ? GROUP BY arv1.art_id, txd1.branch_id) new_stuff WHERE art = arv2.art_id AND arv2.gamma_id = txs1.gamma_id AND txs1.transaction_id = maxt and txs1.transaction_id >= ?";
+ private static final String SELECT_RELATIONS_TO_UPDATE =
+ "SELECT maxt, txs1.gamma_id FROM osee_relation_link rel2, osee_txs txs1, (SELECT MAX(txs2.transaction_id) AS maxt, rel1.rel_link_id AS rel_id, txd1.branch_id FROM osee_relation_link rel1, osee_txs txs2, osee_tx_details txd1 WHERE rel1.gamma_id = txs2.gamma_id and txs2.transaction_id >= ? AND txs2.transaction_id = txd1.transaction_id AND txd1.branch_id = ? GROUP BY rel1.rel_link_id, txd1.branch_id) new_stuff WHERE rel_id = rel2.rel_link_id AND rel2.gamma_id = txs1.gamma_id AND txs1.transaction_id = maxt and txs1.transaction_id >= ?";
+
+ private static final String UPDATE_TX_CURRENT =
+ "UPDATE osee.osee_txs txs1 SET tx_current = 1 where txs1.mod_type <> 3 and txs1.gamma_id IN (SELECT txj1.gamma_id from osee.osee_join_transaction txj1 WHERE txj1.gamma_id = txs1.gamma_id AND txj1.transaction_id = txs1.transaction_id AND txj1.query_id = ?)";
+
+ private static final String UPDATE_TX_CURRENT_DELETED_ITEMS =
+ "UPDATE osee.osee_txs txs1 SET tx_current = 2 where txs1.mod_type = 3 and txs1.gamma_id IN (SELECT txj1.gamma_id from osee.osee_join_transaction txj1 WHERE txj1.gamma_id = txs1.gamma_id AND txj1.transaction_id = txs1.transaction_id AND txj1.query_id = ?)";
+
+ private final static String DELETE_ARTIFACT_VERSIONS = "DELETE FROM osee_artifact_version " + DELETE_POSTFIX;
+ private final static String DELETE_ATTRIBUTES = "DELETE FROM osee_attribute " + DELETE_POSTFIX;
+ private final static String DELETE_RELATIONS = "DELETE FROM osee_relation_link " + DELETE_POSTFIX;
+
+ private final static String TRANSACATION_GAMMA_IN_USE =
+ "Select txs1.transaction_id from osee_txs txs1, osee_txs txs2, osee_join_transaction jn where txs1.transaction_id = jn.transaction_id AND txs1.gamma_id = txs2.gamma_id and txs2.transaction_id != txs1.transaction_id AND jn.query_id = ?";
+ private final static String GET_ARTIFACTS = "Select * from osee_join_artifact where query_id = ?";
+
+ private final static String LOAD_ARTIFACTS =
+ "INSERT INTO osee_join_artifact (query_id, art_id, branch_id, insert_time) (Select ?, art_id, branch_id, CURRENT_TIMESTAMP from osee_txs txs, osee_attribute att, osee_join_transaction tran, osee_tx_details det where tran.query_id = ? AND tran.transaction_id = txs.transaction_id AND txs.gamma_id = att.gamma_id and det.transaction_id = txs.transaction_id) UNION (Select ?, art_id, branch_id, CURRENT_TIMESTAMP from osee_txs txs, osee_artifact_version art, osee_join_transaction tran, osee_tx_details det where tran.query_id = ? AND tran.transaction_id = txs.transaction_id AND txs.gamma_id = art.gamma_id and det.transaction_id = txs.transaction_id) UNION (Select ?, a_art_id as art_id, branch_id, CURRENT_TIMESTAMP from osee_txs txs, osee_relation_link rel, osee_join_transaction tran, osee_tx_details det where tran.query_id = ? AND tran.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id and det.transaction_id = txs.transaction_id) UNION (Select ?, b_art_id as art_id, branch_id, CURRENT_TIMESTAMP from osee_txs txs, osee_relation_link rel, osee_join_transaction tran, osee_tx_details det where tran.query_id = ? AND tran.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id and det.transaction_id = txs.transaction_id)";
+ private static final String UPDATE_TXS =
+ "UPDATE osee_txs set tx_current = (CASE WHEN mod_type = 3 THEN 2 ELSE 1 END) WHERE (transaction_id, gamma_id) IN ((SELECT maxt, txs2.gamma_id FROM osee_txs txs2, osee_attribute att2, (SELECT MAX(txs.transaction_id) AS maxt, att.attr_id AS atid FROM osee_txs txs, osee_attribute att, osee_tx_details det, osee_join_artifact jar WHERE det.branch_id = jar.branch_id AND det.transaction_id = txs.transaction_id AND txs.gamma_id = att.gamma_id and att.art_id = jar.art_id AND jar.query_id = ? GROUP BY att.attr_id, det.branch_id) new_stuff WHERE txs2.gamma_id = att2.gamma_id AND att2.attr_id = atid AND maxt = txs2.transaction_id) UNION (SELECT maxt, txs2.gamma_id FROM osee_txs txs2, osee_artifact_version ver2, (SELECT MAX(txs.transaction_id) AS maxt, ver.art_id AS atid FROM osee_txs txs, osee_artifact_version ver, osee_tx_details det, osee_join_artifact jar WHERE det.branch_id = jar.branch_id AND det.transaction_id = txs.transaction_id AND txs.gamma_id = ver.gamma_id and ver.art_id = jar.art_id AND jar.query_id = ? GROUP BY ver.art_id, det.branch_id) new_stuff WHERE txs2.gamma_id = ver2.gamma_id AND ver2.art_id = atid AND maxt = txs2.transaction_id)UNION(SELECT maxt, txs2.gamma_id FROM osee_txs txs2, osee_relation_link rel2, (SELECT MAX(txs.transaction_id) AS maxt, rel.rel_link_id AS linkid FROM osee_txs txs, osee_relation_link rel, osee_tx_details det, osee_join_artifact jar WHERE det.branch_id = jar.branch_id AND det.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id and (rel.a_art_id = jar.art_id or rel.b_art_id = jar.art_id) AND jar.query_id = ? GROUP BY rel.rel_link_id, det.branch_id) new_stuff WHERE txs2.gamma_id = rel2.gamma_id AND rel2.rel_link_id = linkid AND maxt = txs2.transaction_id))";
+
+ private final int[] txIdsToDelete;
+ private final boolean force;
+ private int artifactJoinId;
+
+ /**
+ * @param name
+ * @param transactionIdNumber
+ */
+ public PurgeTransactionJob(boolean force, int... txIdsToDelete) {
+ super(String.format("Delete transactions: %s", Arrays.toString(txIdsToDelete)));
+ this.txIdsToDelete = txIdsToDelete;
+ this.force = force;
+ }
+
+ /**
+ * @param name
+ * @param transactionIdNumber
+ */
+ public PurgeTransactionJob(int... txIdsToDelete) {
+ this(true, txIdsToDelete);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.
+ * IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus returnStatus = Status.CANCEL_STATUS;
+ try {
+ DeleteTransactionTx deleteTransactionTx = new DeleteTransactionTx(monitor);
+ deleteTransactionTx.execute();
+ returnStatus = Status.OK_STATUS;
+
+ // Kick Local and Remote Events
+ OseeEventManager.kickTransactionsDeletedEvent(this, txIdsToDelete);
+ } catch (Exception ex) {
+ returnStatus = new Status(Status.ERROR, Activator.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return returnStatus;
+ }
+
+ private final class DeleteTransactionTx extends DbTransaction {
+ private final IProgressMonitor monitor;
+
+ public DeleteTransactionTx(IProgressMonitor monitor) throws OseeCoreException {
+ this.monitor = monitor;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.framework.db.connection.core.transaction.
+ * AbstractDbTxTemplate#handleTxWork()
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ TransactionJoinQuery txsToDeleteQuery = JoinUtility.createTransactionJoinQuery();
+ try {
+ monitor.beginTask(getName(), getTotalWork());
+ Arrays.sort(txIdsToDelete);
+
+ HashCollection<Branch, TxDeleteInfo> fromToTxData =
+ getTransactionPairs(monitor, txIdsToDelete, txsToDeleteQuery);
+ txsToDeleteQuery.store(connection);
+ checkForModifiedBaselines(connection, force, txsToDeleteQuery.getQueryId());
+ getAffectedArtifacts(connection, monitor, txsToDeleteQuery.getQueryId());
+
+ setChildBranchBaselineTxs(connection, monitor, fromToTxData);
+ deleteItemEntriesForTransactions(connection, monitor, txsToDeleteQuery.getQueryId());
+ deleteTransactionsFromTxDetails(connection, monitor, txsToDeleteQuery.getQueryId());
+
+ updateTxCurrent(connection, monitor);
+ } catch (OseeCoreException ex) {
+ if (connection != null && connection.isClosed() != true) {
+ txsToDeleteQuery.delete(connection);
+ ArtifactLoader.clearQuery(connection, artifactJoinId);
+ }
+ throw new OseeWrappedException(ex);
+ }
+ if (connection != null && connection.isClosed() != true) {
+ txsToDeleteQuery.delete(connection);
+ ArtifactLoader.clearQuery(connection, artifactJoinId);
+ }
+ }
+
+ /**
+ * @throws OseeDataStoreException
+ */
+ private void getAffectedArtifacts(OseeConnection connection, IProgressMonitor monitor, int transactionQueryId) throws OseeDataStoreException {
+ artifactJoinId = ArtifactLoader.getNewQueryId();
+ ConnectionHandler.runPreparedUpdate(connection, LOAD_ARTIFACTS, artifactJoinId, transactionQueryId,
+ artifactJoinId, transactionQueryId, artifactJoinId, transactionQueryId, artifactJoinId,
+ transactionQueryId);
+ }
+
+ private int getTotalWork() {
+ return txIdsToDelete.length + 5;
+ }
+
+ private HashCollection<Branch, TxDeleteInfo> getTransactionPairs(IProgressMonitor monitor, int[] txsToDelete, TransactionJoinQuery txsToDeleteQuery) throws OseeCoreException {
+ HashCollection<Branch, TxDeleteInfo> fromToTxData = new HashCollection<Branch, TxDeleteInfo>();
+ for (int index = 0; index < txsToDelete.length; index++) {
+ monitor.subTask(String.format("Fetching Previous Tx Info: [%d of %d]", index + 1, txsToDelete.length));
+ int fromTx = txsToDelete[index];
+ TransactionId fromTransaction = TransactionIdManager.getTransactionId(fromTx);
+ TransactionId previousTransaction;
+ try {
+ previousTransaction = TransactionIdManager.getPriorTransaction(fromTransaction);
+ } catch (TransactionDoesNotExist ex) {
+ throw new OseeCoreException(
+ "You are trying to delete Transaction: " + fromTx + " which is a baseline transaction. If your intent is to delete the Branch use the delete Branch Operation. \n\nNO TRANSACTIONS WERE DELETED.");
+
+ }
+
+ fromToTxData.put(fromTransaction.getBranch(), new TxDeleteInfo(fromTransaction, previousTransaction));
+
+ // Store transaction id(s) to delete - no need for gammas
+ txsToDeleteQuery.add(-1, fromTx);
+ monitor.worked(1);
+ }
+ return fromToTxData;
+ }
+
+ private void deleteTransactionsFromTxDetails(OseeConnection connection, IProgressMonitor monitor, int queryId) throws OseeDataStoreException {
+ monitor.subTask("Deleting Tx");
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_TRANSACTION_FROM_TRANSACTION_DETAILS, queryId);
+ monitor.worked(1);
+ }
+
+ private void deleteItemEntriesForTransactions(OseeConnection connection, IProgressMonitor monitor, int txsToDeleteQueryId) throws OseeDataStoreException {
+ monitor.subTask("Deleting Tx Items");
+ TransactionJoinQuery txGammasToDelete = JoinUtility.createTransactionJoinQuery();
+ try {
+ populateJoinQueryFromSql(connection, txGammasToDelete, SELECT_GAMMAS_FROM_TRANSACTION, "transaction_id",
+ txsToDeleteQueryId);
+ txGammasToDelete.store();
+ int deleteQueryId = txGammasToDelete.getQueryId();
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_ARTIFACT_VERSIONS, deleteQueryId);
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_ATTRIBUTES, deleteQueryId);
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_RELATIONS, deleteQueryId);
+
+ } finally {
+ if (txGammasToDelete != null && connection != null && connection.isClosed() != true) {
+ txGammasToDelete.delete(connection);
+ }
+ }
+ monitor.worked(1);
+ }
+
+ private void populateJoinQueryFromSql(OseeConnection connection, TransactionJoinQuery joinQuery, String sql, String txFieldName, Object... data) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ chStmt.runPreparedQuery(sql, data);
+ while (chStmt.next()) {
+ joinQuery.add(chStmt.getInt("gamma_id"), chStmt.getInt(txFieldName));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private int getMinTransaction(Collection<TxDeleteInfo> infos) {
+ int toReturn = Integer.MAX_VALUE;
+ for (TxDeleteInfo info : infos) {
+ TransactionId previous = info.getPreviousTx();
+ if (previous != null) {
+ int toCheck = previous.getTransactionNumber();
+ toReturn = Math.min(toReturn, toCheck);
+ }
+ }
+ return toReturn != Integer.MAX_VALUE ? toReturn : -1;
+ }
+
+ private void updateTxCurrent(OseeConnection conn, IProgressMonitor monitor) throws OseeDataStoreException {
+ monitor.subTask("Updating Previous Tx to Current");
+ ConnectionHandler.runPreparedUpdate(conn, UPDATE_TXS, artifactJoinId, artifactJoinId, artifactJoinId);
+ monitor.worked(1);
+ }
+
+ private void setChildBranchBaselineTxs(OseeConnection connection, IProgressMonitor monitor, HashCollection<Branch, TxDeleteInfo> transactions) throws OseeDataStoreException {
+ List<Object[]> data = new ArrayList<Object[]>();
+ monitor.subTask("Update Baseline Txs for Child Branches");
+ for (TxDeleteInfo entry : transactions.getValues()) {
+ TransactionId previousTransaction = entry.getPreviousTx();
+ if (previousTransaction != null) {
+ int toDeleteTransaction = entry.getTxToDelete().getTransactionNumber();
+
+ data.add(new Object[] {String.valueOf(toDeleteTransaction),
+ String.valueOf(previousTransaction.getTransactionNumber()), "%" + toDeleteTransaction});
+ }
+ }
+ if (data.size() > 0) {
+ ConnectionHandler.runBatchUpdate(connection, UPDATE_TXS_DETAILS_COMMENT, data);
+ }
+ monitor.worked(1);
+ }
+ }
+
+ private void checkForModifiedBaselines(OseeConnection connection, boolean force, int queryId) throws OseeCoreException {
+ int transaction_id =
+ ConnectionHandler.runPreparedQueryFetchInt(connection, 0, TRANSACATION_GAMMA_IN_USE, queryId);
+ if (transaction_id > 0 && !force) {
+ throw new OseeCoreException(
+ "The Transaction " + transaction_id + " holds a Gamma that is in use on other transactions. In order to delete this Transaction you will need to select the force check box.\n\nNO TRANSACTIONS WERE DELETED.");
+ }
+ }
+
+ private final class TxDeleteInfo {
+ private final TransactionId txToDelete;
+ private final TransactionId previousTxFromTxToDelete;
+
+ public TxDeleteInfo(TransactionId txToDelete, TransactionId previousTxFromTxToDelete) {
+ super();
+ this.txToDelete = txToDelete;
+ this.previousTxFromTxToDelete = previousTxFromTxToDelete;
+ }
+
+ public TransactionId getTxToDelete() {
+ return txToDelete;
+ }
+
+ public TransactionId getPreviousTx() {
+ return previousTxFromTxToDelete;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RevertAction.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RevertAction.java
new file mode 100644
index 00000000000..b5c051b5a14
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RevertAction.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.framework.skynet.core.artifact;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Theron Virgin
+ */
+public class RevertAction {
+ private static final String DELETE_TXS_GAMMAS_REVERT =
+ "DELETE from osee_txs txs1 WHERE txs1.gamma_id = ? and txs1.transaction_id = ?";
+ private static final String UPDATE_DETAILS_TABLE =
+ "UPDATE osee_tx_details set osee_comment = 'Reverted Transaction', tx_type = 2 WHERE transaction_id = ?";
+ private static final String UPDATE_REVERT_TABLE =
+ "INSERT INTO osee_removed_txs (transaction_id, rem_mod_type, rem_tx_current, rem_transaction_id, rem_gamma_id) (SELECT ?, txs.mod_type, txs.tx_current, txs.transaction_id, txs.gamma_id FROM osee_txs txs WHERE txs.gamma_id = ? AND txs.transaction_id = ?)";
+ private static final String SET_TX_CURRENT_REVERT =
+ "UPDATE osee_txs txs1 SET tx_current = " + TxChange.CURRENT.getValue() + " WHERE txs1.gamma_id = ? and txs1.transaction_id = ?";
+ private static final String REVERT_ARTIFACT_VERSION_CURRENT_SELECT =
+ "(SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, osee_artifact_version art1 WHERE art1.art_id = ? AND art1.gamma_id = txs1.gamma_id AND txs1.transaction_id = (SELECT max(txs.transaction_id) FROM osee_tx_details det, osee_txs txs, osee_artifact_version art WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = art.gamma_id AND art.art_id = ?))";
+ private static final String UPDATE_TRANSACTION =
+ "Update osee_txs set tx_current = CASE WHEN mod_type = 3 THEN 2 WHEN mod_type = 5 THEN 3 ELSE 1 END where (gamma_id, transaction_id) in ";
+ private static final String REVERT_ARTIFACT_VERSION_SET_CURRENT =
+ UPDATE_TRANSACTION + REVERT_ARTIFACT_VERSION_CURRENT_SELECT;
+ private static final String REVERT_ARTIFACT_VERSION_SELECT =
+ "SELECT det.tx_type, txs.gamma_id, txs.transaction_id FROM osee_tx_details det, osee_txs txs, osee_artifact_version art WHERE txs.transaction_id in (%s) AND det.tx_type = 0 AND det.transaction_id = txs.transaction_id AND txs.gamma_id = art.gamma_id AND NOT EXISTS (SELECT 'x' FROM osee_txs txs2 WHERE txs2.transaction_id = txs.transaction_id AND txs2.gamma_id != txs.gamma_id)";
+
+
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Revert"));
+
+ List<Object[]> gammaIdsModifications = new ArrayList<Object[]>();
+ List<Object[]> gammaIdsToInsert = new ArrayList<Object[]>();
+ List<Object[]> gammaIdsBaseline = new ArrayList<Object[]>();
+ List<Integer> transactionIds = new ArrayList<Integer>();
+
+ private OseeConnection connection;
+ private ConnectionHandlerStatement chStmt;
+ private TransactionId transId;
+ private String objectReverted;
+
+ public RevertAction(OseeConnection connection, ConnectionHandlerStatement chStmt, TransactionId transId){
+ this.connection = connection;
+ this.chStmt = chStmt;
+ this.transId = transId;
+ }
+
+ public void revertObject(long totalTime, int id, String objectReverted) throws OseeCoreException {
+ this.objectReverted = objectReverted;
+
+ processChStmtSortGammas();
+
+
+ if (!gammaIdsModifications.isEmpty()) {
+ updateTransactionTables();
+ if (!gammaIdsBaseline.isEmpty()) {
+ setTxCurrentForRevertedObjects();
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Reverted the %s %d in %s", objectReverted, id,
+ Lib.getElapseString(totalTime)));
+ }
+ }
+
+ public void fixArtifactVersionForAttributeRevert(int branchId, int artId) throws OseeCoreException {
+ if (!transactionIds.isEmpty()) {
+ chStmt = new ConnectionHandlerStatement(connection);
+ chStmt.runPreparedQuery(String.format(REVERT_ARTIFACT_VERSION_SELECT,
+ Collections.toString(",", transactionIds)));
+ objectReverted = "Atrtribute";
+ processChStmtSortGammas();
+ updateTransactionTables();
+ updateArtifactVersionTxCurrents(branchId, artId);
+ }
+ }
+
+ private void processChStmtSortGammas() throws OseeDataStoreException {
+ gammaIdsModifications.clear();
+ gammaIdsToInsert.clear();
+ gammaIdsBaseline.clear();
+ transactionIds.clear();
+ long time = System.currentTimeMillis();
+ try {
+ while (chStmt.next()) {
+ if (chStmt.getInt("tx_type") == TransactionDetailsType.NonBaselined.getId()) {
+ Integer gammaId = chStmt.getInt("gamma_id");
+ gammaIdsModifications.add(new Object[] {gammaId, chStmt.getInt("transaction_id")});
+ gammaIdsToInsert.add(new Object[] {transId.getTransactionNumber(), gammaId,
+ chStmt.getInt("transaction_id")});
+ transactionIds.add(chStmt.getInt("transaction_id"));
+ if (DEBUG) {
+ System.out.println(String.format(" Revert%s: Delete Gamma ID = %d , Transaction ID = %d",
+ objectReverted, chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")));
+ }
+ } else {
+ gammaIdsBaseline.add(new Object[] {chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")});
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Revert%s: Ran the Select Query in %s", objectReverted,
+ Lib.getElapseString(time)));
+ }
+ }
+
+ private void updateTransactionTables() throws OseeDataStoreException, OseeCoreException {
+ long time = System.currentTimeMillis();
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_DETAILS_TABLE, transId.getTransactionNumber());
+ int count1 = ConnectionHandler.runBatchUpdate(connection, UPDATE_REVERT_TABLE, gammaIdsToInsert);
+ int count2 = ConnectionHandler.runBatchUpdate(connection, DELETE_TXS_GAMMAS_REVERT, gammaIdsModifications);
+
+ if (count1 != count2) {
+ throw new OseeCoreException(String.format(
+ "Revert Transaction moved %d transaction but should have moved %d", count1, count2));
+ }
+ if (DEBUG) {
+ displayRevertResults(time, objectReverted, gammaIdsModifications, count2);
+ }
+ }
+
+ private void displayRevertResults(long time, String objectReverted, List<Object[]> gammaIdsModifications, int count2) {
+ System.out.println(String.format("Deleted %d txs for gamma revert in %s", count2, Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ for (Object[] items : gammaIdsModifications) {
+ System.out.println(String.format(" Revert %s: [gammaId, transactionId] = %s ", objectReverted,
+ Arrays.deepToString(items)));
+ }
+ System.out.println(String.format(" Displayed all the data in %s", Lib.getElapseString(time)));
+ }
+
+
+ private void setTxCurrentForRevertedObjects() throws OseeDataStoreException {
+ int count2;
+ long time = System.currentTimeMillis();
+ count2 = ConnectionHandler.runBatchUpdate(connection, SET_TX_CURRENT_REVERT, gammaIdsBaseline);
+ if (DEBUG) {
+ System.out.println(String.format(" Set %d tx currents for revert in %s", count2, Lib.getElapseString(time)));
+ for (Object[] items : gammaIdsBaseline) {
+ System.out.println(String.format(" Revert %s: Baseline [gammaId, transactionId] = %s ", objectReverted,
+ Arrays.deepToString(items)));
+ }
+ }
+ }
+
+ private void updateArtifactVersionTxCurrents(int branchId, int artId) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ if (DEBUG) {
+ try {
+ chStmt.runPreparedQuery(REVERT_ARTIFACT_VERSION_CURRENT_SELECT, artId, branchId, artId);
+ while (chStmt.next()) {
+ System.out.println(String.format(
+ " Revert Artifact Current Version: Set Current Gamma ID = %d , Transaction ID = %d for art ID = %d branch ID = %d",
+ chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id"), artId, branchId));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ ConnectionHandler.runPreparedUpdate(connection, REVERT_ARTIFACT_VERSION_SET_CURRENT, artId, branchId, artId);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RootBranchInitializer.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RootBranchInitializer.java
new file mode 100644
index 00000000000..2a0e430edb6
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/RootBranchInitializer.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.framework.skynet.core.artifact;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class RootBranchInitializer {
+
+ /**
+ * Add common artifacts that should be available to all branches
+ *
+ * @param branch
+ * @throws OseeCoreException
+ */
+ protected void initialize(Branch branch) throws OseeCoreException {
+ // Create necessary default hierarchy root artifact
+ ArtifactQuery.getDefaultHierarchyRootArtifact(branch, true);
+
+ // Create necessary top universal group artifact
+ UniversalGroup.createTopUniversalGroupArtifact(branch);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/StaticIdManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/StaticIdManager.java
new file mode 100644
index 00000000000..769d67288cc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/StaticIdManager.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.framework.skynet.core.artifact;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StaticIdManager {
+
+ public static String STATIC_ID_ATTRIBUTE = "Static Id";
+
+ /**
+ * Will add the single static id value if it does not already exist. Will also cleanup if more than one exists with
+ * same staticId.
+ *
+ * @param artifact
+ * @param staticId
+ * @throws OseeCoreException
+ */
+ public static void setSingletonAttributeValue(Artifact artifact, String staticId) throws OseeCoreException {
+ List<Attribute<String>> attributes = artifact.getAttributes(STATIC_ID_ATTRIBUTE, staticId);
+ if (attributes.size() == 0) {
+ artifact.addAttribute(STATIC_ID_ATTRIBUTE, staticId);
+ } else if (attributes.size() > 1) {
+ // keep one of the attributes
+ for (int x = 1; x < attributes.size(); x++) {
+ Attribute<String> attr = attributes.get(x);
+ attr.delete();
+ }
+ }
+ ArtifactCache.cachePostAttributeLoad(artifact);
+ }
+
+ public static boolean hasValue(Artifact artifact, String staticId) throws OseeCoreException {
+ return artifact.getAttributesToStringList(STATIC_ID_ATTRIBUTE).contains(staticId);
+ }
+
+ /**
+ * Return non-deleted artifacts with staticId
+ *
+ * @param artifactTypeName
+ * @param staticId
+ * @param branch
+ * @return artifacts
+ * @throws OseeCoreException
+ */
+ public static Set<Artifact> getArtifacts(String artifactTypeName, String staticId, Branch branch) throws OseeCoreException {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ // Retrieve cached artifacts first
+ for (Artifact artifact : ArtifactCache.getArtifactsByStaticId(staticId, branch)) {
+ if (artifact.getArtifactTypeName().equals(artifactTypeName) && !artifact.isDeleted()) {
+ artifacts.add(artifact);
+ }
+ }
+ if (artifacts.size() > 0) {
+ OseeLog.log(Activator.class, Level.FINE, "StaticId Load: [" + staticId + "][" + artifactTypeName + "]");
+ }
+ if (artifacts.size() == 0) {
+ // Retrieve database artifacts if cache has none
+ artifacts.addAll(ArtifactQuery.getArtifactsFromTypeAndAttribute(artifactTypeName, STATIC_ID_ATTRIBUTE,
+ staticId, branch));
+ }
+
+ // Store results in cache
+ for (Artifact artifact : artifacts) {
+ if (!artifact.isDeleted()) {
+ ArtifactCache.cachePostAttributeLoad(artifact);
+ }
+ }
+ return artifacts;
+ }
+
+ public static Artifact getSingletonArtifactOrException(String artifactType, String staticId, Branch branch) throws OseeCoreException {
+ Set<Artifact> artifacts = getArtifacts(artifactType, staticId, branch);
+ // Exception on problems
+ if (artifacts.size() == 0) {
+ throw new ArtifactDoesNotExist("Can't find requested artifact \"" + staticId + "\"");
+ } else if (artifacts.size() > 1) {
+ throw new MultipleArtifactsExist("Expected 1 \"" + staticId + "\" artifact, retrieved " + artifacts.size());
+ }
+ return artifacts.iterator().next();
+ }
+
+ public static Artifact getSingletonArtifact(String artifactTypeName, String staticId, Branch branch) throws OseeCoreException {
+ return getOrCreateSingletonArtifactHelper(artifactTypeName, staticId, branch, false);
+ }
+
+ /**
+ * Return first artifact with staticId (multiples may exist) or create one if non exist
+ *
+ * @param artifactTypeName
+ * @param staticId
+ * @param branch
+ * @param create
+ * @return artifact
+ * @throws OseeCoreException
+ */
+ public static Artifact getOrCreateSingletonArtifact(String artifactTypeName, String staticId, Branch branch) throws OseeCoreException {
+ return getOrCreateSingletonArtifactHelper(artifactTypeName, staticId, branch, true);
+ }
+
+ private static Artifact getOrCreateSingletonArtifactHelper(String artifactTypeName, String staticId, Branch branch, boolean create) throws OseeCoreException {
+ Set<Artifact> artifacts = getArtifacts(artifactTypeName, staticId, branch);
+ if (artifacts.size() == 0 && create) {
+ Artifact artifact = ArtifactTypeManager.addArtifact(artifactTypeName, branch);
+ setSingletonAttributeValue(artifact, staticId);
+ return artifact;
+ }
+ if (artifacts.size() > 0) {
+ return artifacts.iterator().next();
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UniversalGroup.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UniversalGroup.java
new file mode 100644
index 00000000000..6abfb62076e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UniversalGroup.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.framework.skynet.core.artifact;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UniversalGroup {
+ public static final String ARTIFACT_TYPE_NAME = "Universal Group";
+
+ public static Collection<Artifact> getGroups(Branch branch) {
+ Collection<Artifact> artifacts = null;
+ try {
+ artifacts = ArtifactQuery.getArtifactsFromType(ARTIFACT_TYPE_NAME, branch);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ artifacts = new LinkedList<Artifact>();
+ }
+ return artifacts;
+ }
+
+ public static Collection<Artifact> getGroups(String groupName, Branch branch) {
+ try {
+ return ArtifactQuery.getArtifactsFromTypeAndName(ARTIFACT_TYPE_NAME, groupName, branch);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return new ArrayList<Artifact>();
+ }
+
+ public static Artifact addGroup(String name, Branch branch) throws Exception {
+ if (getGroups(name, branch).size() > 0) throw new IllegalArgumentException("Group Already Exists");
+
+ Artifact groupArt = ArtifactTypeManager.addArtifact(UniversalGroup.ARTIFACT_TYPE_NAME, branch, name);
+ groupArt.persistAttributes();
+ Artifact groupRoot = getTopUniversalGroupArtifact(branch);
+ if (groupRoot == null) {
+ groupRoot = createTopUniversalGroupArtifact(branch);
+ if (groupRoot == null) {
+ throw new IllegalStateException("Could not create top universal group artifact.");
+ }
+ }
+ groupRoot.addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, groupArt);
+ groupRoot.persistAttributesAndRelations();
+ return groupArt;
+ }
+
+ public static Artifact getTopUniversalGroupArtifact(Branch branch) throws OseeCoreException {
+ try {
+ return ArtifactQuery.getArtifactFromTypeAndName(UniversalGroup.ARTIFACT_TYPE_NAME,
+ ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME, branch);
+ } catch (ArtifactDoesNotExist ex) {
+ // do nothing; not a bad state cause a group artifact will be created once a group is added
+ }
+ return null;
+ }
+
+ public static Artifact createTopUniversalGroupArtifact(Branch branch) throws OseeCoreException {
+ Collection<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromTypeAndName(UniversalGroup.ARTIFACT_TYPE_NAME,
+ ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME, branch);
+ if (artifacts.size() == 0) {
+ Artifact art =
+ ArtifactTypeManager.addArtifact(ARTIFACT_TYPE_NAME, branch, ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME);
+ art.persistAttributes();
+ return art;
+ }
+ return artifacts.iterator().next();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UpdateMergeBranch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UpdateMergeBranch.java
new file mode 100644
index 00000000000..59946024f97
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/UpdateMergeBranch.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.framework.skynet.core.artifact;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Theron Virgin
+ */
+public class UpdateMergeBranch extends DbTransaction {
+ private static final String UPDATE_ARTIFACTS =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, txs.gamma_id, txs.mod_type, CASE WHEN txs.mod_type = 3 THEN " + TxChange.DELETED.getValue() + " WHEN txs.mod_type = 5 THEN " + TxChange.ARTIFACT_DELETED.getValue() + " ELSE " + TxChange.CURRENT.getValue() + " END FROM osee_attribute attr, osee_txs txs, osee_tx_details det WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.tx_current != 0 AND txs.gamma_id = attr.gamma_id AND attr.art_id = ? AND not exists (SELECT 'x' FROM osee_txs txs1, osee_attribute attr1 WHERE txs1.transaction_id = ? AND txs1.gamma_id = attr1.gamma_id AND attr1.attr_id = attr.attr_id)";
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Merge"));
+
+ private final Branch mergeBranch;
+ private final ArrayList<Integer> expectedArtIds;
+ private final Branch destBranch;
+ private final Branch sourceBranch;
+
+ /**
+ * @param destBranch
+ * @param expectedArtIds
+ * @param mergeBranch
+ * @param sourceBranch
+ */
+ public UpdateMergeBranch(Branch mergeBranch, ArrayList<Integer> expectedArtIds, Branch destBranch, Branch sourceBranch) throws OseeCoreException {
+ this.destBranch = destBranch;
+ this.expectedArtIds = expectedArtIds;
+ this.mergeBranch = mergeBranch;
+ this.sourceBranch = sourceBranch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.DbTransaction#handleTxWork(java.sql.Connection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ Collection<Integer> allMergeBranchArtifacts = getAllMergeArtifacts(mergeBranch);
+ long time = System.currentTimeMillis();
+ Collection<Integer> allMergeBranchArtifactsCopy = new HashSet<Integer>(allMergeBranchArtifacts);
+ Collection<Artifact> goodMergeBranchArtifacts = ArtifactQuery.getArtifactsFromBranch(mergeBranch, true);
+
+ if (DEBUG) {
+ System.out.println(String.format(" Get artifacts on branch took %s", Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ System.out.println(" Need the following Artifacts on the Merge Branch");
+ System.out.print(" ");
+ for (Integer integer : expectedArtIds) {
+ System.out.print(integer + ", ");
+ }
+ System.out.print("\n");
+ }
+ int count = 0;
+ //Delete any damaged artifacts (from a source revert) on the merge branch
+ for (Artifact artifact : goodMergeBranchArtifacts) {
+ allMergeBranchArtifactsCopy.remove(new Integer(artifact.getArtId()));
+ }
+ if (!allMergeBranchArtifactsCopy.isEmpty()) {
+ for (Integer artifact : allMergeBranchArtifactsCopy) {
+ ArtifactPersistenceManager.purgeArtifactFromBranch(connection, mergeBranch.getBranchId(),
+ artifact.intValue());
+ count++;
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Deleting %d Damaged Artifacts took %s", count,
+ Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ count = 0;
+ }
+
+ //Delete any artifacts that shouldn't be on the merge branch but are
+ for (Integer artid : expectedArtIds) {
+ allMergeBranchArtifacts.remove(artid);
+ }
+ if (!allMergeBranchArtifacts.isEmpty()) {
+ for (Integer artifact : allMergeBranchArtifacts) {
+ count++;
+ ArtifactPersistenceManager.purgeArtifactFromBranch(connection, mergeBranch.getBranchId(),
+ artifact.intValue());
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Deleting %d unused Artifacts took %s", count,
+ Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ count = 0;
+ }
+ int numberAttrUpdated = 0;
+ //Copy over any missing attributes
+ int baselineTransaction = TransactionIdManager.getStartEndPoint(mergeBranch).getKey().getTransactionNumber();
+ for (Artifact artifact : goodMergeBranchArtifacts) {
+ numberAttrUpdated +=
+ ConnectionHandler.runPreparedUpdate(UPDATE_ARTIFACTS, baselineTransaction, sourceBranch.getBranchId(),
+ artifact.getArtId(), baselineTransaction);
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Adding %d Attributes to Existing Artifacts took %s",
+ numberAttrUpdated, Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ }
+
+ //Add any artifacts that should be on the merge branch but aren't
+ for (Artifact artifact : goodMergeBranchArtifacts) {
+ expectedArtIds.remove(new Integer(artifact.getArtId()));
+ }
+ if (!expectedArtIds.isEmpty()) {
+ BranchCreator.getInstance().addArtifactsToBranch(connection, sourceBranch, destBranch, mergeBranch,
+ expectedArtIds);
+ }
+
+ if (DEBUG) {
+ System.out.println(String.format(" Adding %d new Artifacts took %s", expectedArtIds.size(),
+ Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ }
+ }
+
+ private static Collection<Integer> getAllMergeArtifacts(Branch branch) throws OseeCoreException {
+ Collection<Integer> artSet = new HashSet<Integer>();
+ long time = System.currentTimeMillis();
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Merge.SELECT_ARTIFACTS_ON_A_BRANCH),
+ branch.getBranchId());
+ while (chStmt.next()) {
+ artSet.add(chStmt.getInt("art_id"));
+ }
+ if (DEBUG) {
+ System.out.println(String.format(
+ " Getting Artifacts that are on the Merge Branch Completed in %s", Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ }
+
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Merge.SELECT_ATTRIBUTES_ON_A_BRANCH),
+ branch.getBranchId());
+ while (chStmt.next()) {
+ artSet.add(chStmt.getInt("art_id"));
+ }
+ if (DEBUG) {
+ System.out.println(String.format(
+ " Getting Attributes that are on the Merge Branch Completed in %s",
+ Lib.getElapseString(time)));
+ time = System.currentTimeMillis();
+ }
+
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Merge.SELECT_REL_LINKS_ON_A_BRANCH),
+ branch.getBranchId());
+ while (chStmt.next()) {
+ artSet.add(chStmt.getInt("a_art_id"));
+ artSet.add(chStmt.getInt("b_art_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Getting Relations that are on the Merge Branch Completed in %s",
+ Lib.getElapseString(time)));
+ System.out.println(" Found the following Artifacts on the Merge Branch");
+ System.out.print(" ");
+ for (Integer integer : artSet) {
+ System.out.print(integer + ", ");
+ }
+ System.out.print("\n");
+ }
+ return artSet;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WordArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WordArtifact.java
new file mode 100644
index 00000000000..0d3b628d649
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WordArtifact.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.framework.skynet.core.artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WordArtifact extends Artifact {
+ public static final String ARTIFACT_NAME = "Word Artifact";
+ public static final String WHOLE_WORD = "Whole Word";
+ public static final String WORD_TEMPLATE = "Word Template";
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param branch
+ */
+ public WordArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WorkspaceURL.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WorkspaceURL.java
new file mode 100644
index 00000000000..5a1a71054c1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/WorkspaceURL.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.framework.skynet.core.artifact;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public class WorkspaceURL {
+ public static String getURL(IFile file) {
+ // Add only 1 "/" due to the path for the file having a preceding "/"
+ return "ws:/" + file.getFullPath().toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/ArtifactAnnotation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/ArtifactAnnotation.java
new file mode 100644
index 00000000000..e6ce863cede
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/ArtifactAnnotation.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.framework.skynet.core.artifact.annotation;
+
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactAnnotation {
+
+ private Type type;
+ private String namespace;
+ private String content;
+ public static enum Type {
+ None, Info, Warning, Error, Hidden;
+ private static Type[] orderedTypes = new Type[] {Error, Warning, Info, Hidden, None};
+
+ public static Type[] getOrderedTypes() {
+ return orderedTypes;
+ }
+ };
+
+ public ArtifactAnnotation(Type type, String namespace, String message) {
+ this.type = type;
+ this.content = message;
+ this.namespace = namespace;
+ }
+
+ public ArtifactAnnotation(String xml) {
+ fromXml(xml);
+ }
+
+ public static ArtifactAnnotation getError(String namespace, String message) {
+ return new ArtifactAnnotation(Type.Error, namespace, message);
+ }
+
+ public static ArtifactAnnotation getInfo(String namespace, String message) {
+ return new ArtifactAnnotation(Type.Info, namespace, message);
+ }
+
+ public static ArtifactAnnotation getHidden(String namespace, String message) {
+ return new ArtifactAnnotation(Type.Hidden, namespace, message);
+ }
+
+ public static ArtifactAnnotation getWarning(String namespace, String message) {
+ return new ArtifactAnnotation(Type.Warning, namespace, message);
+ }
+
+ private static String TYPE_TAG = "type";
+ private static String NAMESPACE_TAG = "namespace";
+ private static String CONTENT_TAG = "content";
+
+ public String toXml() {
+ return AXml.addTagData(TYPE_TAG, type.name()) + AXml.addTagData(NAMESPACE_TAG, namespace) + AXml.addTagData(
+ CONTENT_TAG, content);
+ }
+
+ public void fromXml(String xml) {
+ String typeStr = AXml.getTagData(xml, TYPE_TAG);
+ if (typeStr == null || typeStr.equals(""))
+ type = Type.None;
+ else
+ type = Type.valueOf(typeStr);
+ namespace = AXml.getTagData(xml, NAMESPACE_TAG);
+ content = AXml.getTagData(xml, CONTENT_TAG);
+ }
+
+ /**
+ * @return the type
+ */
+ public Type getType() {
+ return type;
+ }
+
+ /**
+ * @return the content
+ */
+ public String getContent() {
+ return content;
+ }
+
+ /**
+ * @return the namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/AttributeAnnotationManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/AttributeAnnotationManager.java
new file mode 100644
index 00000000000..6192430b3c1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/AttributeAnnotationManager.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.framework.skynet.core.artifact.annotation;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * Provides access to annotations stored as the "Annotation" attribute in the specified artifact. NOTE: Annotations can
+ * also be provided through IArtifactAnnotation extension point.
+ *
+ * @author Donald G. Dunne
+ */
+public class AttributeAnnotationManager {
+
+ public static final String ANNOTATION_ATTRIBUTE = "Annotation";
+ private final org.eclipse.osee.framework.skynet.core.artifact.Artifact artifact;
+
+ public AttributeAnnotationManager(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ private Collection<Attribute<String>> getAttributes() throws OseeCoreException {
+ return artifact.getAttributes(ANNOTATION_ATTRIBUTE);
+ }
+
+ /**
+ * @return annotations stored in "Annotation" attribute of given artifact. NOTE: This is not a full list of
+ * annotation for this artifact as annotations can be added via extension point.
+ */
+ public List<ArtifactAnnotation> getAnnotations() throws OseeCoreException {
+ List<ArtifactAnnotation> annotations = new ArrayList<ArtifactAnnotation>();
+ for (String value : artifact.getAttributesToStringList(ANNOTATION_ATTRIBUTE)) {
+ ArtifactAnnotation annotation = new ArtifactAnnotation(value);
+ annotations.add(annotation);
+ }
+ return annotations;
+ }
+
+ /**
+ * Add an annotation to be stored in the "Annotation" attribute of this given artifact.
+ *
+ * @param newAnnotation
+ * @throws OseeCoreException
+ */
+ public void addAnnotation(ArtifactAnnotation newAnnotation) throws OseeCoreException {
+
+ // Update attribute if it already exists
+ for (Attribute<String> attr : getAttributes()) {
+ ArtifactAnnotation annotation = new ArtifactAnnotation(attr.getValue());
+ if (newAnnotation.equals(annotation)) {
+ attr.setValue(newAnnotation.toXml());
+ return;
+ }
+ }
+ artifact.addAttribute(ANNOTATION_ATTRIBUTE, newAnnotation.toXml());
+ }
+
+ /**
+ * Remove the annotation from the "Annotation" attribute of the given artifact.
+ *
+ * @param annotation
+ * @throws OseeCoreException
+ */
+ public void removeAnnotation(ArtifactAnnotation annotation) throws OseeCoreException {
+ // Update attribute if it already exists
+ for (Attribute<String> attr : getAttributes()) {
+ ArtifactAnnotation attrAnnotation = new ArtifactAnnotation(attr.getValue());
+ if (annotation.equals(attrAnnotation)) {
+ attr.delete();
+ return;
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/IArtifactAnnotation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/IArtifactAnnotation.java
new file mode 100644
index 00000000000..e564954938b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/annotation/IArtifactAnnotation.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.framework.skynet.core.artifact.annotation;
+
+import java.util.Set;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IArtifactAnnotation {
+
+ public void getAnnotations(Artifact artifact, Set<ArtifactAnnotation> annotations);
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/ArtifactFactoryManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/ArtifactFactoryManager.java
new file mode 100644
index 00000000000..25c24af4923
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/ArtifactFactoryManager.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.framework.skynet.core.artifact.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Donald G. Dunne
+ */
+public class ArtifactFactoryManager {
+ private static List<ArtifactFactory> factories;
+
+ public static ArtifactFactory getFactory(ArtifactType artifactType) throws OseeCoreException {
+ return getFactory(artifactType.getName());
+ }
+
+ public static ArtifactFactory getFactory(String artifactTypeName) throws OseeCoreException {
+ loadFactoryBundleMap();
+ ArtifactFactory responsibleFactory = null;
+ for (ArtifactFactory factory : factories) {
+ if (factory.isResponsibleFor(artifactTypeName)) {
+ if (responsibleFactory == null) {
+ responsibleFactory = factory;
+ } else {
+ OseeLog.log(
+ Activator.class,
+ Level.SEVERE,
+ "Multiple ArtifactFactories [" + responsibleFactory + "][" + factory + "]responsible for same artifact type [" + artifactTypeName + "]. Defaulting to DefaultArtifactFactory.");
+ return new DefaultArtifactFactory();
+ }
+ }
+ }
+ if (responsibleFactory != null) {
+ return responsibleFactory;
+ }
+ return new DefaultArtifactFactory();
+ }
+
+ private synchronized static void loadFactoryBundleMap() {
+ if (factories == null) {
+ factories = new ArrayList<ArtifactFactory>();
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements("org.eclipse.osee.framework.skynet.core.ArtifactFactory",
+ "ArtifactFactory");
+
+ for (IConfigurationElement element : elements) {
+ String factoryClassName = element.getAttribute("classname");
+ try {
+ String bundleSymbolicName = element.getContributor().getName();
+ if (bundleSymbolicName == null) {
+ OseeLog.log(Activator.class, Level.WARNING,
+ "No bundle associated with the factory class: " + factoryClassName);
+ return;
+ }
+
+ Bundle bundle = Platform.getBundle(bundleSymbolicName);
+ ArtifactFactory factory = (ArtifactFactory) bundle.loadClass(factoryClassName).newInstance();
+ factories.add(factory);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Unable to create factory: " + factoryClassName, ex);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/DefaultArtifactFactory.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/DefaultArtifactFactory.java
new file mode 100644
index 00000000000..3f7699d23b0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/DefaultArtifactFactory.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.framework.skynet.core.artifact.factory;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * This artifact factory is used when no other ArtifactFactory has registered itself as being responsible. This is the
+ * case when no specific ArtifactFactory has been defined such as when a new Artifact is created dynamically.
+ *
+ * @author Donald G. Dunne
+ */
+public class DefaultArtifactFactory extends ArtifactFactory {
+
+ public @Override
+ Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException {
+ return new Artifact(this, guid, humandReadableId, branch, artifactType);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/SkynetCoreArtifactFactory.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/SkynetCoreArtifactFactory.java
new file mode 100644
index 00000000000..1793d2bcbf9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/factory/SkynetCoreArtifactFactory.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.framework.skynet.core.artifact.factory;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkynetCoreArtifactFactory extends ArtifactFactory {
+
+ public static Collection<String> BASIC_ARTIFACTS =
+ Arrays.asList("User", "User Group", "Code Unit", "Component", "Spreadsheet", "Artifact", "Folder",
+ "Root Artifact", "Universal Group", "Url", "General Data", "Workspace File");
+
+ public static Collection<String> NATIVE_ARTIFACTS = Arrays.asList("General Document");
+
+ public static Collection<String> WORD_ARTIFACTS =
+ Arrays.asList("Renderer Template", "Support Document", "Heading", "Support Document", "Saftey Assessment");
+
+ @SuppressWarnings("unchecked")
+ public SkynetCoreArtifactFactory() {
+ super(Collections.setUnion(BASIC_ARTIFACTS, NATIVE_ARTIFACTS, WORD_ARTIFACTS));
+ }
+
+ public @Override
+ Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException {
+ if (artifactType.getName().equals(User.ARTIFACT_NAME)) {
+ return new User(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (BASIC_ARTIFACTS.contains(artifactType.getName())) {
+ return new Artifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (NATIVE_ARTIFACTS.contains(artifactType.getName())) {
+ return new NativeArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (WORD_ARTIFACTS.contains(artifactType.getName())) {
+ return new WordArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ throw new OseeArgumentException("did not recognize the artifact type: " + artifactType.getName());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/BaseStyleSheetArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/BaseStyleSheetArtifact.java
new file mode 100644
index 00000000000..9585bd582b2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/BaseStyleSheetArtifact.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.framework.skynet.core.artifact.format;
+
+/**
+ * Provides style information for word formatted content.
+ *
+ * @author Jeff C. Phillips
+ */
+public class BaseStyleSheetArtifact implements IStyleSheetArtifact {
+
+ /**
+ *
+ */
+ public BaseStyleSheetArtifact() {
+ super();
+ }
+
+ public String getStyle() {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/IStyleSheetArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/IStyleSheetArtifact.java
new file mode 100644
index 00000000000..38591eafd64
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/format/IStyleSheetArtifact.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.framework.skynet.core.artifact.format;
+
+/**
+ * Interface so style sheets can provide style information for word renders.
+ *
+ * @author Jeff C. Phillips
+ */
+public interface IStyleSheetArtifact {
+
+ public String getStyle();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactConditional.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactConditional.java
new file mode 100644
index 00000000000..9ddd1258a80
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactConditional.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.framework.skynet.core.artifact.operation;
+
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class ArtifactConditional extends Artifact {
+ public static final String ARTIFACT_NAME = "Artifact Conditional";
+
+ public ArtifactConditional(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public abstract boolean evaluateConditional(List<Artifact> artifacts) throws IllegalArgumentException;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactOperation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactOperation.java
new file mode 100644
index 00000000000..7e96a3fba58
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/ArtifactOperation.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.framework.skynet.core.artifact.operation;
+
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class ArtifactOperation extends Artifact implements WorkflowStep {
+ public static final String PROVIDES_ACCEPTABLE_INPUT = "Provides Acceptable Input";
+ public static final String ARTIFACT_NAME = "Artifact Operation";
+
+ public ArtifactOperation(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ /**
+ * The list of artifacts will never be null, but may be empty. Must never throw NullPointerException, but rather a
+ * more informative excpetion explaining the problem that would have caused a NullPointerException.
+ *
+ * @param artifacts
+ * @param monitor progress monitor for upating the GUI
+ * @return may return null because the engine will use an empty list in this case
+ * @throws IllegalArgumentException
+ * @throws Exception TODO
+ */
+ public abstract List<Artifact> applyToArtifacts(List<Artifact> artifacts, IProgressMonitor monitor) throws IllegalArgumentException, Exception;
+
+ /**
+ * @param operation
+ * @return returns PROVIDES_ACCEPTABLE_INPUT if this operation can run after, i.e. accept input from, the given
+ * operation, otherwise returns a human readable reason why the input can not be accepted
+ */
+ public String canAcceptInputFrom(ArtifactOperation operation) {
+ return PROVIDES_ACCEPTABLE_INPUT;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.operation.WorkflowStep#perform(java.util.List)
+ */
+ public List<Artifact> perform(List<Artifact> artifacts, IProgressMonitor monitor) throws IllegalArgumentException, Exception {
+ return applyToArtifacts(artifacts, monitor);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamIf.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamIf.java
new file mode 100644
index 00000000000..4a276b84e07
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamIf.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.framework.skynet.core.artifact.operation;
+
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class BlamIf extends Artifact {
+ public static final String ARTIFACT_NAME = "Blam If";
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param branch
+ */
+ public BlamIf(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public void execute(List<Artifact> artifacts) throws IllegalArgumentException {
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamLoop.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamLoop.java
new file mode 100644
index 00000000000..147960208b8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/BlamLoop.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.framework.skynet.core.artifact.operation;
+
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class BlamLoop extends Artifact {
+ public static final String ARTIFACT_NAME = "Blam Loop";
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param branch
+ */
+ public BlamLoop(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public void execute(List<Artifact> artifacts) throws IllegalArgumentException {
+
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return ARTIFACT_NAME + " - " + getDescriptiveName();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/FinishUpdateBranchOperation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/FinishUpdateBranchOperation.java
new file mode 100644
index 00000000000..41a655c309e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/FinishUpdateBranchOperation.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.framework.skynet.core.artifact.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FinishUpdateBranchOperation extends AbstractOperation {
+ private final ConflictManagerExternal conflictManager;
+ private final boolean archiveSourceBranch;
+ private final boolean overwriteUnresolvedConflicts;
+
+ /**
+ * @param operationName
+ * @param pluginId
+ */
+ public FinishUpdateBranchOperation(String pluginId, ConflictManagerExternal conflictManager, boolean archiveSourceBranch, boolean overwriteUnresolvedConflicts) {
+ super("Complete Branch Update", pluginId);
+ this.conflictManager = conflictManager;
+ this.archiveSourceBranch = archiveSourceBranch;
+ this.overwriteUnresolvedConflicts = overwriteUnresolvedConflicts;
+ }
+
+ private String getUpdatedName(String branchName) {
+ String storeName = StringFormat.truncate(branchName, 100);
+ return String.format("%s - moved by update on - %s", storeName, Lib.getDateTimeString());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ monitor.setTaskName("Merging updates");
+ BranchManager.commitBranch(conflictManager, archiveSourceBranch, overwriteUnresolvedConflicts);
+ monitor.worked(calculateWork(0.60));
+
+ Branch sourceBranch = conflictManager.getSourceBranch();
+ Branch destinationBranch = conflictManager.getDestinationBranch();
+
+ String originalBranchName = sourceBranch.getBranchName();
+ Artifact originalAssociatedArtifact = sourceBranch.getAssociatedArtifact();
+
+ sourceBranch.rename(getUpdatedName(originalBranchName));
+ monitor.worked(calculateWork(0.20));
+
+ destinationBranch.rename(originalBranchName);
+ if (originalAssociatedArtifact != null) {
+ destinationBranch.setAssociatedArtifact(originalAssociatedArtifact);
+ }
+ BranchManager.setBranchState(sourceBranch, BranchState.REBASELINED);
+ monitor.worked(calculateWork(0.20));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#createErrorStatus(java.lang.Throwable)
+ */
+ @Override
+ protected IStatus createErrorStatus(Throwable error) {
+ setStatusMessage(String.format("Error merging updates between [%s] and [%s]",
+ conflictManager.getSourceBranch().getBranchShortName(),
+ conflictManager.getDestinationBranch().getBranchShortName()));
+ return super.createErrorStatus(error);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/UpdateBranchOperation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/UpdateBranchOperation.java
new file mode 100644
index 00000000000..0bad6433c1a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/UpdateBranchOperation.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.framework.skynet.core.artifact.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.IOperation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.update.ConflictResolverOperation;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UpdateBranchOperation extends AbstractOperation {
+ private final Branch originalBranch;
+ private final ConflictResolverOperation resolver;
+ private final String pluginId;
+
+ public UpdateBranchOperation(final String pluginId, final Branch branch, final ConflictResolverOperation resolver) {
+ super("Update Branch", pluginId);
+ this.pluginId = pluginId;
+ this.originalBranch = branch;
+ this.resolver = resolver;
+ }
+
+ private static String getUpdatedName(String branchName) {
+ String storeName = StringFormat.truncate(branchName, 100);
+ return String.format("%s - for update - %s", storeName, Lib.getDateTimeString());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ if (originalBranch != null && originalBranch.hasParentBranch()) {
+ performUpdate(monitor, originalBranch);
+ } else {
+ monitor.worked(getTotalWorkUnits());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#createErrorStatus(java.lang.Throwable)
+ */
+ @Override
+ protected IStatus createErrorStatus(Throwable error) {
+ setStatusMessage(String.format("Error updating branch [%s]", originalBranch.getBranchShortName()));
+ return super.createErrorStatus(error);
+ }
+
+ private Branch createTempBranch(Branch originalBranch) throws OseeCoreException {
+ Branch parentBranch = originalBranch.getParentBranch();
+ String branchUpdateName = getUpdatedName(originalBranch.getBranchName());
+ return BranchManager.createWorkingBranch(parentBranch, branchUpdateName,
+ UserManager.getUser(SystemUser.OseeSystem));
+ }
+
+ private void performUpdate(IProgressMonitor monitor, Branch originalBranch) throws Exception {
+ Branch newWorkingBranch = null;
+ boolean wasSuccessful = false;
+ try {
+ monitor.setTaskName("Creating temporary branch");
+ newWorkingBranch = createTempBranch(originalBranch);
+ monitor.worked(calculateWork(0.40));
+
+ BranchManager.setBranchState(originalBranch, BranchState.REBASELINE_IN_PROGRESS);
+
+ monitor.setTaskName("Checking for Conflicts");
+ ConflictManagerExternal conflictManager = new ConflictManagerExternal(newWorkingBranch, originalBranch);
+ IOperation operation;
+ if (!conflictManager.remainingConflictsExist()) {
+ operation = new FinishUpdateBranchOperation(pluginId, conflictManager, true, false);
+ } else {
+ operation = resolver;
+ resolver.setConflictManager(conflictManager);
+ }
+ doSubWork(operation, monitor, 0.40);
+ wasSuccessful = true;
+ } finally {
+ if (newWorkingBranch != null && !wasSuccessful) {
+ BranchManager.purgeBranch(newWorkingBranch);
+ }
+ monitor.worked(calculateWork(0.20));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/WorkflowStep.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/WorkflowStep.java
new file mode 100644
index 00000000000..2e9772cf3ad
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/operation/WorkflowStep.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.framework.skynet.core.artifact.operation;
+
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface WorkflowStep {
+
+ /**
+ * &lt;step&gt; ::= &lt;artifact operation invocation&gt; | &lt;workflow invocation&gt; | &lt;exit&gt; | &lt;flow
+ * control construct&gt;
+ *
+ * @param artifacts
+ * @param monitor TODO
+ * @return list of artifacts that are the result of this step (if null) engine with replace with the empty list
+ * @throws Exception TODO
+ */
+ public abstract List<Artifact> perform(List<Artifact> artifacts, IProgressMonitor monitor) throws IllegalArgumentException, Exception;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AbstractArtifactSearchCriteria.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AbstractArtifactSearchCriteria.java
new file mode 100644
index 00000000000..f5affeda0f5
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AbstractArtifactSearchCriteria.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.framework.skynet.core.artifact.search;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class AbstractArtifactSearchCriteria {
+
+ public abstract void addToTableSql(ArtifactQueryBuilder builder) throws OseeDataStoreException;
+
+ public abstract void addToWhereSql(ArtifactQueryBuilder builder) throws OseeDataStoreException;
+
+ public abstract void addJoinArtId(ArtifactQueryBuilder builder, boolean left) throws OseeDataStoreException;
+
+ public void cleanUp() throws OseeDataStoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Active.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Active.java
new file mode 100644
index 00000000000..0045254fcc9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Active.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.framework.skynet.core.artifact.search;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum Active {
+
+ Active, InActive, Both;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ActiveArtifactTypeSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ActiveArtifactTypeSearch.java
new file mode 100644
index 00000000000..1d1395150e0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ActiveArtifactTypeSearch.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.framework.skynet.core.artifact.search;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ActiveArtifactTypeSearch {
+
+ /**
+ * Search for given artifactType with active attribute set as specified
+ *
+ * @param artifactTypeName
+ * @param active
+ * @param branch
+ */
+ @SuppressWarnings("unchecked")
+ public static <A extends Artifact> Set<A> getArtifacts(String artifactTypeName, Active active, Branch branch, Class<A> clazz) {
+ Set<A> results = new HashSet<A>();
+
+ try {
+ Collection<Artifact> arts = null;
+ if (active == Active.Both) {
+ // Since both, just do a type search
+ arts = ArtifactQuery.getArtifactsFromType(artifactTypeName, branch);
+ } else {
+ arts =
+ ArtifactQuery.getArtifactsFromTypeAndAttribute(artifactTypeName, "ats.Active",
+ active == Active.Active ? "yes" : "no", branch);
+ }
+ for (Artifact art : arts) {
+ results.add((A) art);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return results;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactHridSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactHridSearch.java
new file mode 100644
index 00000000000..7dff50e5f2c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactHridSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.EQUAL;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ArtifactHridSearch implements ISearchPrimitive {
+ private String humanReadableId;
+ private DepricatedOperator operator;
+
+ /**
+ * @param humanReadableId The human readable id to search for
+ */
+ public ArtifactHridSearch(String humanReadableId, DepricatedOperator operator) {
+ super();
+ this.operator = operator;
+ this.humanReadableId = humanReadableId;
+ }
+
+ /**
+ * @param humanReadableId The human readable id to search for
+ */
+ public ArtifactHridSearch(String humanReadableId) {
+ this(humanReadableId, EQUAL);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String sql = ARTIFACT_TABLE.column("human_readable_id") + operator + "?";
+ dataList.add(humanReadableId);
+
+ return sql;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return ARTIFACT_TABLE.toString();
+ }
+
+ @Override
+ public String toString() {
+ return "Artifact Human Readable Id: " + humanReadableId;
+ }
+
+ public String getStorageString() {
+ return humanReadableId;
+ }
+
+ public static ArtifactHridSearch getPrimitive(String storageString) {
+ return new ArtifactHridSearch(storageString, EQUAL);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactIdSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactIdSearch.java
new file mode 100644
index 00000000000..2f0e13d5b00
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactIdSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.EQUAL;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactIdSearch implements ISearchPrimitive {
+ private int artId;
+ private DepricatedOperator operator;
+
+ /**
+ * @param humanReadableId The human readable id to search for
+ */
+ public ArtifactIdSearch(int artId, DepricatedOperator operator) {
+ super();
+ this.operator = operator;
+ this.artId = artId;
+ }
+
+ /**
+ * @param humanReadableId The human readable id to search for
+ */
+ public ArtifactIdSearch(int artId) {
+ this(artId, EQUAL);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String sql = ARTIFACT_TABLE.column("art_id") + operator + "?";
+ dataList.add(artId);
+
+ return sql;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return ARTIFACT_TABLE.toString();
+ }
+
+ @Override
+ public String toString() {
+ return "Artifact Id: " + artId;
+ }
+
+ public String getStorageString() {
+ return Integer.toString(artId);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactInTransactionSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactInTransactionSearch.java
new file mode 100644
index 00000000000..870bc54ad76
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactInTransactionSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ArtifactInTransactionSearch implements ISearchPrimitive {
+ private Integer fromTransactionNumber;
+ private Integer toTransactionNumber;
+ private static final String TOKEN = ";";
+ private static final String tables =
+ TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + "," + ARTIFACT_VERSION_TABLE;
+
+ public ArtifactInTransactionSearch(TransactionId transactionNumber) {
+ this(transactionNumber, transactionNumber);
+ }
+
+ public ArtifactInTransactionSearch(TransactionId fromTransactionId, TransactionId toTransactionId) {
+ if (!fromTransactionId.getBranch().equals(toTransactionId.getBranch())) throw new IllegalArgumentException(
+ "The fromTransactionId and toTransactionId must be on the same branch");
+ if (fromTransactionId.getTransactionNumber() > toTransactionId.getTransactionNumber()) throw new IllegalArgumentException(
+ "The fromTransactionId can not be greater than the toTransactionId.");
+
+ this.fromTransactionNumber = fromTransactionId.getTransactionNumber();
+ this.toTransactionNumber = toTransactionId.getTransactionNumber();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ @Override
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String whereConditions =
+ (fromTransactionNumber.equals(toTransactionNumber) ? TRANSACTIONS_TABLE.column("transaction_id") + " = ? " : TRANSACTIONS_TABLE.column("transaction_id") + " > ? " + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + " <= ?") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?" + " AND " + TRANSACTIONS_TABLE.column("gamma_id") + "=" + ARTIFACT_VERSION_TABLE.column("gamma_id");
+
+ if (!fromTransactionNumber.equals(toTransactionNumber)) {
+ dataList.add(fromTransactionNumber);
+ }
+ dataList.add(toTransactionNumber);
+ dataList.add(branch.getBranchId());
+ return whereConditions;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return tables;
+ }
+
+ @Override
+ public String toString() {
+ if (fromTransactionNumber.equals(toTransactionNumber))
+ return "Transaction Number: " + toTransactionNumber;
+ else
+ return "Transactions: " + fromTransactionNumber + " to " + toTransactionNumber;
+ }
+
+ public String getStorageString() {
+ return fromTransactionNumber + TOKEN + toTransactionNumber;
+ }
+
+ public static ArtifactInTransactionSearch getPrimitive(String storageString) throws NumberFormatException, OseeCoreException {
+ String[] values = storageString.split(TOKEN);
+ if (values.length != 2) {
+ throw new IllegalArgumentException("Unable to parse the storage string:" + storageString);
+ }
+
+ return new ArtifactInTransactionSearch(TransactionIdManager.getTransactionId(Integer.parseInt(values[0])),
+ TransactionIdManager.getTransactionId(Integer.parseInt(values[1])));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactMatch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactMatch.java
new file mode 100644
index 00000000000..01f9fa54278
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactMatch.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.framework.skynet.core.artifact.search;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactXmlQueryResultParser.MatchLocation;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactMatch {
+ private Artifact artifact;
+ private boolean allowDeleted;
+ private HashCollection<Long, MatchLocation> attributeMatches;
+
+ protected ArtifactMatch(Artifact artifact, boolean allowDeleted) {
+ this.artifact = artifact;
+ this.allowDeleted = allowDeleted;
+ this.attributeMatches = null;
+ }
+
+ public boolean hasMatchData() {
+ return attributeMatches != null;
+ }
+
+ protected void addMatches(HashCollection<Long, MatchLocation> attributeMatches) {
+ this.attributeMatches = attributeMatches;
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ public HashCollection<Attribute<?>, MatchLocation> getMatchData() throws OseeCoreException {
+ HashCollection<Attribute<?>, MatchLocation> matchData = new HashCollection<Attribute<?>, MatchLocation>();
+
+ for (Attribute<?> attribute : artifact.getAttributes(allowDeleted)) {
+ Collection<MatchLocation> locations = attributeMatches.getValues((long) attribute.getGammaId());
+ if (locations != null) {
+ matchData.put(attribute, locations);
+ }
+ }
+ return matchData;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java
new file mode 100644
index 00000000000..f78ded9d151
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQuery.java
@@ -0,0 +1,484 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad.FULL;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactQuery {
+
+ /**
+ * search for exactly one artifact by one its id - otherwise throw an exception
+ *
+ * @param artId the id of the desired artifact
+ * @param branch
+ * @return exactly one artifact by one its id - otherwise throw an exception
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ */
+ public static Artifact getArtifactFromId(int artId, Branch branch) throws OseeCoreException {
+ return getArtifactFromId(artId, branch, false);
+ }
+
+ /**
+ * search for exactly one artifact by one its id - otherwise throw an exception
+ *
+ * @param artId the id of the desired artifact
+ * @param branch
+ * @param allowDeleted whether to return the artifact even if it has been deleted
+ * @return exactly one artifact by one its id - otherwise throw an exception
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ */
+ public static Artifact getArtifactFromId(int artId, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return getOrCheckArtifactFromId(artId, branch, allowDeleted, QueryType.GET);
+ }
+
+ private static Artifact getOrCheckArtifactFromId(int artId, Branch branch, boolean allowDeleted, QueryType queryType) throws OseeCoreException {
+ Artifact artifact = ArtifactCache.getActive(artId, branch.getBranchId());
+ if (artifact != null) {
+ return artifact;
+ }
+ return new ArtifactQueryBuilder(artId, branch, allowDeleted, FULL).getOrCheckArtifact(queryType);
+ }
+
+ /**
+ * Checks for existence of an artifact by id
+ *
+ * @param artId the id of the desired artifact
+ * @param branch
+ * @param allowDeleted whether to return the artifact even if it has been deleted
+ * @return one artifact by one its id if it exists, otherwise null
+ */
+ public static Artifact checkArtifactFromId(int artId, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return getOrCheckArtifactFromId(artId, branch, allowDeleted, QueryType.CHECK);
+ }
+
+ /**
+ * Checks for existence of an artifact by one its guid or human readable id - otherwise throw an exception
+ *
+ * @param guidOrHrid either the guid or human readable id of the desired artifact
+ * @param branch
+ * @param allowDeleted whether to return the artifact even if it has been deleted
+ * @return one artifact by one its id if it exists, otherwise null
+ */
+ public static Artifact checkArtifactFromId(String guidOrHrid, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return getOrCheckArtifactFromId(guidOrHrid, branch, allowDeleted, QueryType.CHECK);
+ }
+
+ /**
+ * Checks for existence of an artifact by one its guid or human readable id - otherwise throw an exception
+ *
+ * @param guidOrHrid either the guid or human readable id of the desired artifact
+ * @param branch
+ * @return one artifact by one its guid or human readable id if it exists, otherwise null
+ */
+ public static Artifact checkArtifactFromId(String guidOrHrid, Branch branch) throws OseeCoreException {
+ return getOrCheckArtifactFromId(guidOrHrid, branch, false, QueryType.CHECK);
+ }
+
+ /**
+ * search for exactly one artifact by one its guid or human readable id - otherwise throw an exception
+ *
+ * @param guidOrHrid either the guid or human readable id of the desired artifact
+ * @param branch
+ * @return exactly one artifact by one its guid or human readable id - otherwise throw an exception
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ * @throws MultipleArtifactsExist if more than one artifact is found
+ */
+ public static Artifact getArtifactFromId(String guidOrHrid, Branch branch) throws OseeCoreException {
+ return getOrCheckArtifactFromId(guidOrHrid, branch, false, QueryType.GET);
+ }
+
+ /**
+ * search for exactly one artifact by one its guid or human readable id - otherwise throw an exception
+ *
+ * @param guidOrHrid either the guid or human readable id of the desired artifact
+ * @param branch
+ * @param allowDeleted whether to return the artifact even if it has been deleted
+ * @return exactly one artifact by one its guid or human readable id - otherwise throw an exception
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ * @throws MultipleArtifactsExist if more than one artifact is found
+ */
+ public static Artifact getArtifactFromId(String guidOrHrid, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return getOrCheckArtifactFromId(guidOrHrid, branch, allowDeleted, QueryType.GET);
+ }
+
+ private static Artifact getOrCheckArtifactFromId(String guidOrHrid, Branch branch, boolean allowDeleted, QueryType queryType) throws OseeCoreException {
+ Artifact artifact = ArtifactCache.getActive(guidOrHrid, branch.getBranchId());
+ if (artifact != null) {
+ return artifact;
+ }
+ return new ArtifactQueryBuilder(guidOrHrid, branch, allowDeleted, FULL).getOrCheckArtifact(queryType);
+ }
+
+ /**
+ * search for exactly one artifact based on its type and name - otherwise throw an exception
+ *
+ * @param artifactTypeName
+ * @param artifactName
+ * @param branch
+ * @return exactly one artifact based on its type and name - otherwise throw an exception
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ * @throws MultipleArtifactsExist if more than one artifact is found
+ */
+ public static Artifact getArtifactFromTypeAndName(String artifactTypeName, String artifactName, Branch branch) throws OseeCoreException {
+ return queryFromTypeAndAttribute(artifactTypeName, "Name", artifactName, branch).getOrCheckArtifact(QueryType.GET);
+ }
+
+ public static int countArtifactsFromTypeAndName(String artifactTypeName, String artifactName, Branch branch) throws OseeCoreException {
+ return queryFromTypeAndAttribute(artifactTypeName, "Name", artifactName, branch).countArtifacts();
+ }
+
+ public static List<Integer> selectArtifactIdsFromTypeAndName(String artifactTypeName, String artifactName, Branch branch) throws OseeCoreException {
+ return queryFromTypeAndAttribute(artifactTypeName, "Name", artifactName, branch).selectArtifacts(2);
+ }
+
+ /**
+ * Checks for existence of an artifact based on its type and name
+ *
+ * @param artifactTypeName
+ * @param artifactName
+ * @param branch
+ * @return one artifact based on its type and name if it exists, otherwise null
+ * @throws OseeCoreException
+ */
+ public static Artifact checkArtifactFromTypeAndName(String artifactTypeName, String artifactName, Branch branch) throws OseeCoreException {
+ return queryFromTypeAndAttribute(artifactTypeName, "Name", artifactName, branch).getOrCheckArtifact(
+ QueryType.CHECK);
+ }
+
+ /**
+ * search for artifacts with any of the given artifact ids
+ *
+ * @param artifactIds
+ * @param branch
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getArtifactsFromIds(Collection<Integer> artifactIds, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(artifactIds, branch, allowDeleted, FULL).getArtifacts(50, null);
+ }
+
+ /**
+ * search for artifacts with any of the given artifact hrids or guids
+ *
+ * @param artifactIds
+ * @param branch
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getArtifactsFromIds(List<String> guidOrHrids, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(guidOrHrids, branch, FULL).getArtifacts(30, null);
+ }
+
+ public static List<Artifact> getArtifactsFromIds(List<String> guidOrHrids, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(guidOrHrids, branch, allowDeleted, FULL).getArtifacts(30, null);
+ }
+
+ public static List<Artifact> getHistoricalArtifactsFromIds(List<String> guidOrHrids, TransactionId transactionId, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(guidOrHrids, transactionId, allowDeleted, FULL).getArtifacts(30, null);
+ }
+
+ public static Artifact getHistoricalArtifactFromId(String guidOrHrid, TransactionId transactionId, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(Arrays.asList(guidOrHrid), transactionId, allowDeleted, FULL).getOrCheckArtifact(QueryType.GET);
+ }
+
+ public static List<Artifact> getArtifactsFromName(String artifactName, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, allowDeleted, new AttributeCriteria("Name", artifactName)).getArtifacts(
+ 30, null);
+ }
+
+ public static List<Artifact> getArtifactsFromTypeAndName(String artifactTypeName, String artifactName, Branch branch) throws OseeCoreException {
+ return getArtifactsFromTypeAndAttribute(artifactTypeName, "Name", artifactName, branch);
+ }
+
+ /**
+ * search for exactly one artifact based on its type and an attribute of a given type and value - otherwise throw an
+ * exception
+ *
+ * @param artifactTypeName
+ * @param attributeTypeName
+ * @param attributeValue
+ * @param branch
+ * @return a collection of the artifacts found or an empty collection if none are found
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ * @throws MultipleArtifactsExist if more than one artifact is found
+ */
+ public static Artifact getArtifactFromTypeAndAttribute(String artifactTypeName, String attributeTypeName, String attributeValue, Branch branch) throws OseeCoreException {
+ return queryFromTypeAndAttribute(artifactTypeName, attributeTypeName, attributeValue, branch).getOrCheckArtifact(
+ QueryType.GET);
+ }
+
+ /**
+ * search for exactly one artifact based on its type and an attribute of a given type and value - otherwise throw an
+ * exception
+ *
+ * @param attributeTypeName
+ * @param attributeValue
+ * @param branch
+ * @return a collection of the artifacts found or an empty collection if none are found
+ * @throws ArtifactDoesNotExist if no artifacts are found
+ * @throws MultipleArtifactsExist if more than one artifact is found
+ */
+ public static Artifact getArtifactFromAttribute(String attributeTypeName, String attributeValue, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, false, new AttributeCriteria(attributeTypeName, attributeValue)).getOrCheckArtifact(QueryType.GET);
+ }
+
+ public static List<Artifact> getArtifactsFromType(ArtifactType artifactType, boolean allowDeleted) throws OseeCoreException {
+ return getArtifactsFromType(artifactType, null, allowDeleted);
+ }
+
+ public static List<Artifact> getArtifactsFromType(ArtifactType artifactType, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(artifactType, branch, FULL, allowDeleted).getArtifacts(1000, null);
+ }
+
+ public static List<Artifact> getArtifactsFromType(ArtifactType artifactType, Branch branch) throws OseeCoreException {
+ return getArtifactsFromType(artifactType, branch, false);
+ }
+
+ public static List<Artifact> getArtifactsFromBranch(Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, allowDeleted).getArtifacts(10000, null);
+ }
+
+ public static List<Artifact> getArtifactsFromBranch(Branch branch, ArtifactLoad loadLevel, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, loadLevel, allowDeleted).getArtifacts(10000, null);
+ }
+
+ public static List<Artifact> reloadArtifactsFromBranch(Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, allowDeleted).reloadArtifacts(10000);
+ }
+
+ public static List<Artifact> getArtifactsFromType(String artifactTypeName, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(ArtifactTypeManager.getType(artifactTypeName), branch, FULL, false).getArtifacts(
+ 1000, null);
+ }
+
+ public static List<Artifact> getArtifactsFromTypes(Collection<String> artifactTypeNames, Branch branch, boolean allowDeleted) throws OseeCoreException {
+ return new ArtifactQueryBuilder(ArtifactTypeManager.getTypes(artifactTypeNames), branch, FULL, allowDeleted).getArtifacts(
+ 1000, null);
+ }
+
+ /**
+ * search for artifacts of the given type on a particular branch that satisfy the given criteria
+ *
+ * @param artifactTypeName
+ * @param branch
+ * @param criteria
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getArtifactsFromTypeAnd(String artifactTypeName, Branch branch, int artifactCountEstimate, List<AbstractArtifactSearchCriteria> criteria) throws OseeCoreException {
+ return new ArtifactQueryBuilder(ArtifactTypeManager.getType(artifactTypeName), branch, FULL, criteria).getArtifacts(
+ artifactCountEstimate, null);
+ }
+
+ /**
+ * search for artifacts on a particular branch that satisfy the given criteria
+ *
+ * @param branch
+ * @param criteria
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getArtifactsFromCriteria(Branch branch, int artifactCountEstimate, List<AbstractArtifactSearchCriteria> criteria) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, criteria).getArtifacts(artifactCountEstimate, null);
+ }
+
+ /**
+ * search for artifacts on a particular branch that satisfy the given criteria
+ *
+ * @param branch
+ * @param criteria
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getArtifactsFromCriteria(Branch branch, int artifactCountEstimate, AbstractArtifactSearchCriteria... criteria) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, false, criteria).getArtifacts(artifactCountEstimate, null);
+ }
+
+ /**
+ * search for artifacts related
+ *
+ * @param artifactId
+ * @param branch
+ * @param criteria
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getRelatedArtifacts(Artifact artifact, RelationType relationType, RelationSide relationSide) throws OseeCoreException {
+ return new ArtifactQueryBuilder(artifact.getBranch(), FULL, false, new RelationCriteria(artifact.getArtId(),
+ relationType, relationSide)).getArtifacts(1000, null);
+ }
+
+ /**
+ * search for artifacts of the given type with an attribute of the given type and value
+ *
+ * @param artifactTypeName
+ * @param attributeTypeName
+ * @param attributeValue
+ * @param branch
+ * @return a collection of the artifacts found or an empty collection if none are found
+ */
+ public static List<Artifact> getArtifactsFromTypeAndAttribute(String artifactTypeName, String attributeTypeName, String attributeValue, Branch branch) throws OseeCoreException {
+ return queryFromTypeAndAttribute(artifactTypeName, attributeTypeName, attributeValue, branch).getArtifacts(100,
+ null);
+ }
+
+ public static List<Artifact> getArtifactsFromAttribute(String attributeTypeName, String attributeValue, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, false, new AttributeCriteria(attributeTypeName, attributeValue)).getArtifacts(
+ 300, null);
+ }
+
+ public static List<Artifact> getArtifactsFromAttribute(AttributeType attributeType, String attributeValue, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, false, new AttributeCriteria(attributeType, attributeValue)).getArtifacts(
+ 300, null);
+ }
+
+ /**
+ * Return all artifacts that have one or more attributes of given type regardless of the value
+ *
+ * @param attributeTypeName
+ * @param branch
+ * @return artifacts
+ */
+ public static List<Artifact> getArtifactsFromAttributeType(String attributeTypeName, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, false, new AttributeCriteria(attributeTypeName)).getArtifacts(300,
+ null);
+ }
+
+ private static ArtifactQueryBuilder queryFromTypeAndAttribute(String artifactTypeName, String attributeTypeName, String attributeValue, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(ArtifactTypeManager.getType(artifactTypeName), branch, FULL,
+ new AttributeCriteria(attributeTypeName, attributeValue));
+ }
+
+ public static List<Artifact> getArtifactsFromHistoricalAttributeValue(String attributeValue, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(branch, FULL, true, new AttributeCriteria(null, attributeValue, true)).getArtifacts(
+ 30, null);
+ }
+
+ public static List<Artifact> getArtifactsFromTypeAndAttribute(String artifactTypeName, String attributeTypeName, Collection<String> attributeValues, Branch branch, int artifactCountEstimate) throws OseeCoreException {
+ return new ArtifactQueryBuilder(ArtifactTypeManager.getType(artifactTypeName), branch, FULL,
+ new AttributeCriteria(attributeTypeName, attributeValues)).getArtifacts(artifactCountEstimate, null);
+ }
+
+ /**
+ * Searches for artifacts having attributes which contain matching keywords entered in the query string.
+ * <p>
+ * Special characters such as (<b><code>' '</code>, <code>!</code>, <code>"</code>, <code>#</code>, <code>$</code>,
+ * <code>%</code>, <code>(</code>, <code>)</code>, <code>*</code>, <code>+</code>, <code>,</code>, <code>-</code>,
+ * <code>.</code>, <code>/</code>, <code>:</code>, <code>;</code>, <code>&lt;</code>, <code>&gt;</code>,
+ * <code>?</code>, <code>@</code>, <code>[</code>, <code>\</code>, <code>]</code>, <code>^</code>, <code>{</code>,
+ * <code>|</code>, <code>}</code>, <code>~</code>, <code>_</code></b>) are assumed to be word separators.
+ * </p>
+ * <p>
+ * For example:
+ * <ul>
+ * <li><b>'<code>hello.world</code>'</b> will be translated to <b>'<code>hello</code>'</b> and <b>'<code>world</code>
+ * '</b>. The search will match attributes with <b>'<code>hello</code>'</b> and <b>'<code>world</code>'</b> keywords.
+ * </li>
+ * </ul>
+ * </p>
+ *
+ * @param queryString keywords to match
+ * @param matchWordOrder <b>true</b> ensures the query string words exist in order; <b>false</b> matches words in any
+ * order
+ * @param nameOnly <b>true</b> searches in name attributes only; <b>false</b> includes all tagged attribute types
+ * @param allowDeleted <b>true</b> includes deleted artifacts in results; <b>false</b> omits deleted artifacts
+ * @param branch
+ * @return a collection of the artifacts found or an empty collection if none are found
+ * @throws Exception
+ */
+ public static List<Artifact> getArtifactsFromAttributeWithKeywords(Branch branch, String queryString, boolean matchWordOrder, boolean allowDeleted, boolean isCaseSensitive, String... attributeTypes) throws OseeCoreException {
+ return new HttpArtifactQuery(branch, queryString, matchWordOrder, allowDeleted, isCaseSensitive, attributeTypes).getArtifacts(
+ FULL, null, false, false, allowDeleted);
+ }
+
+ /**
+ * Searches for keywords in attributes and returning match location information such as artifact where match was
+ * found, attribute containing the match and match location in attribute data.
+ *
+ * @see #getArtifactsFromAttributeWithKeywords
+ * @param branch
+ * @param queryString
+ * @param matchWordOrder
+ * @param allowDeleted
+ * @param findAllMatchLocations when set to <b>true</b> returns all match locations instead of just returning the
+ * first one. When returning all match locations, search performance may be slow.
+ * @param isCaseSensitive
+ * @param attributeTypes
+ * @return artifact matches
+ * @throws OseeCoreException
+ */
+ public static List<ArtifactMatch> getArtifactMatchesFromAttributeWithKeywords(Branch branch, String queryString, boolean matchWordOrder, boolean allowDeleted, boolean findAllMatchLocations, boolean isCaseSensitive, String... attributeTypes) throws OseeCoreException {
+ return new HttpArtifactQuery(branch, queryString, matchWordOrder, allowDeleted, isCaseSensitive, attributeTypes).getArtifactsWithMatches(
+ FULL, null, false, false, allowDeleted, findAllMatchLocations);
+ }
+
+ /**
+ * @param artId
+ * @return reloaded artifacts
+ * @throws OseeDataStoreException
+ * @throws MultipleArtifactsExist
+ * @throws ArtifactDoesNotExist
+ */
+ public static Artifact reloadArtifactFromId(int artId, Branch branch) throws OseeCoreException {
+ return new ArtifactQueryBuilder(artId, branch, true, FULL).reloadArtifact();
+ }
+
+ public static Artifact getDefaultHierarchyRootArtifact(Branch branch, boolean createIfNecessary) throws OseeCoreException {
+ Artifact root = ArtifactCache.getByTextId(ArtifactQuery.DEFAULT_HIERARCHY_ROOT_NAME, branch);
+ if (root == null) {
+ root =
+ checkArtifactFromTypeAndName(ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME,
+ ArtifactQuery.DEFAULT_HIERARCHY_ROOT_NAME, branch);
+
+ if (root == null) {
+ if (createIfNecessary) {
+ OseeLog.log(Activator.class, Level.INFO,
+ "Created " + ArtifactQuery.DEFAULT_HIERARCHY_ROOT_NAME + " because no root was found.");
+ root =
+ ArtifactTypeManager.addArtifact(ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME, branch,
+ ArtifactQuery.DEFAULT_HIERARCHY_ROOT_NAME);
+ root.persistAttributes();
+
+ } else {
+ throw new ArtifactDoesNotExist(
+ "An artifact of type " + ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME + " named " + ArtifactQuery.DEFAULT_HIERARCHY_ROOT_NAME + " was not found");
+ }
+ }
+
+ ArtifactCache.putByTextId(ArtifactQuery.DEFAULT_HIERARCHY_ROOT_NAME, root);
+ }
+ return root;
+ }
+
+ public static Artifact getDefaultHierarchyRootArtifact(Branch branch) throws OseeCoreException {
+ return getDefaultHierarchyRootArtifact(branch, false);
+ }
+
+ public static final String ROOT_ARTIFACT_TYPE_NAME = "Root Artifact";
+ public static final String DEFAULT_HIERARCHY_ROOT_NAME = "Default Hierarchy Root";
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQueryBuilder.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQueryBuilder.java
new file mode 100644
index 00000000000..2d493daa9f1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactQueryBuilder.java
@@ -0,0 +1,516 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.ISearchConfirmer;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactQueryBuilder {
+ private final HashMap<String, NextAlias> nextAliases = new HashMap<String, NextAlias>();
+ private final StringBuilder sql = new StringBuilder(1000);
+ private final List<Object> queryParameters = new ArrayList<Object>();
+ private List<String> guids;
+ private List<String> hrids;
+ private String guidOrHrid;
+ private final AbstractArtifactSearchCriteria[] criteria;
+ private final Branch branch;
+ private int artifactId;
+ private Collection<Integer> artifactIds;
+ private final Collection<ArtifactType> artifactTypes;
+ private final boolean allowDeleted;
+ private final ArtifactLoad loadLevel;
+ private boolean count = false;
+ private boolean emptyCriteria = false;
+ private boolean firstTable = true;
+ private final boolean tableOrderForward;
+ private final TransactionId transactionId;
+
+ /**
+ * @param artId
+ * @param branch
+ * @param allowDeleted set whether deleted artifacts should be included in the resulting artifact list
+ */
+ public ArtifactQueryBuilder(int artId, Branch branch, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(null, artId, null, null, null, branch, null, allowDeleted, loadLevel, true);
+ }
+
+ /**
+ * search for artifacts with the given ids
+ *
+ * @param artifactIds list of artifact ids
+ * @param branch
+ * @param allowDeleted set whether deleted artifacts should be included in the resulting artifact list
+ */
+ public ArtifactQueryBuilder(Collection<Integer> artifactIds, Branch branch, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(artifactIds, 0, null, null, null, branch, null, allowDeleted, loadLevel, true);
+ emptyCriteria = artifactIds.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(List<String> guidOrHrids, Branch branch, ArtifactLoad loadLevel) {
+ this(null, 0, guidOrHrids, null, null, branch, null, false, loadLevel, true);
+ emptyCriteria = guidOrHrids.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(List<String> guidOrHrids, Branch branch, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(null, 0, guidOrHrids, null, null, branch, null, allowDeleted, loadLevel, true);
+ emptyCriteria = guidOrHrids.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(List<String> guidOrHrids, TransactionId transactionId, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(null, 0, guidOrHrids, null, null, transactionId.getBranch(), transactionId, allowDeleted, loadLevel, true);
+ emptyCriteria = guidOrHrids.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(String guidOrHrid, Branch branch, boolean allowDeleted, ArtifactLoad loadLevel) {
+ this(null, 0, null, ensureValid(guidOrHrid), null, branch, null, allowDeleted, loadLevel, true);
+ }
+
+ public ArtifactQueryBuilder(ArtifactType artifactType, Branch branch, ArtifactLoad loadLevel, boolean allowDeleted) {
+ this(null, 0, null, null, Arrays.asList(artifactType), branch, null, allowDeleted, loadLevel, true);
+ }
+
+ public ArtifactQueryBuilder(Collection<ArtifactType> artifactTypes, Branch branch, ArtifactLoad loadLevel, boolean allowDeleted) {
+ this(null, 0, null, null, artifactTypes, branch, null, allowDeleted, loadLevel, true);
+ emptyCriteria = artifactTypes.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(Branch branch, ArtifactLoad loadLevel, boolean allowDeleted) {
+ this(null, 0, null, null, null, branch, null, allowDeleted, loadLevel, false);
+ }
+
+ public ArtifactQueryBuilder(Branch branch, ArtifactLoad loadLevel, boolean allowDeleted, AbstractArtifactSearchCriteria... criteria) {
+ this(null, 0, null, null, null, branch, null, allowDeleted, loadLevel, true, criteria);
+ emptyCriteria = criteria.length == 0;
+ }
+
+ public ArtifactQueryBuilder(Branch branch, ArtifactLoad loadLevel, List<AbstractArtifactSearchCriteria> criteria) {
+ this(null, 0, null, null, null, branch, null, false, loadLevel, true, toArray(criteria));
+ emptyCriteria = criteria.size() == 0;
+ }
+
+ public ArtifactQueryBuilder(ArtifactType artifactType, Branch branch, ArtifactLoad loadLevel, AbstractArtifactSearchCriteria... criteria) {
+ this(null, 0, null, null, Arrays.asList(artifactType), branch, null, false, loadLevel, true, criteria);
+ emptyCriteria = criteria.length == 0;
+ }
+
+ public ArtifactQueryBuilder(ArtifactType artifactType, Branch branch, ArtifactLoad loadLevel, List<AbstractArtifactSearchCriteria> criteria) {
+ this(null, 0, null, null, Arrays.asList(artifactType), branch, null, false, loadLevel, true, toArray(criteria));
+ emptyCriteria = criteria.size() == 0;
+ }
+
+ private ArtifactQueryBuilder(Collection<Integer> artifactIds, int artifactId, List<String> guidOrHrids, String guidOrHrid, Collection<ArtifactType> artifactTypes, Branch branch, TransactionId transactionId, boolean allowDeleted, ArtifactLoad loadLevel, boolean tableOrderForward, AbstractArtifactSearchCriteria... criteria) {
+ this.artifactTypes = artifactTypes;
+ this.branch = branch;
+ this.criteria = criteria;
+ this.loadLevel = loadLevel;
+ this.allowDeleted = allowDeleted;
+ this.guidOrHrid = guidOrHrid;
+ this.artifactId = artifactId;
+ this.tableOrderForward = tableOrderForward;
+ this.transactionId = transactionId;
+ if (artifactIds != null && !artifactIds.isEmpty()) {
+ if (artifactIds.size() == 1) {
+ this.artifactId = artifactIds.iterator().next();
+ } else {
+ this.artifactIds = artifactIds;
+ }
+ }
+
+ if (guidOrHrids != null && !guidOrHrids.isEmpty()) {
+ if (guidOrHrids.size() == 1) {
+ this.guidOrHrid = guidOrHrids.get(0);
+ } else {
+ hrids = new ArrayList<String>();
+ guids = new ArrayList<String>();
+ for (String id : guidOrHrids) {
+ if (GUID.isValid(id)) {
+ guids.add(id);
+ } else {
+ hrids.add(id);
+ }
+ }
+ }
+ }
+
+ nextAliases.put("osee_txs", new NextAlias("txs"));
+ nextAliases.put("osee_tx_details", new NextAlias("txd"));
+ nextAliases.put("osee_artifact", new NextAlias("art"));
+ nextAliases.put("osee_artifact_version", new NextAlias("arv"));
+ nextAliases.put("osee_attribute", new NextAlias("att"));
+ nextAliases.put("osee_relation_link", new NextAlias("rel"));
+ }
+
+ private static AbstractArtifactSearchCriteria[] toArray(List<AbstractArtifactSearchCriteria> criteria) {
+ return criteria.toArray(new AbstractArtifactSearchCriteria[criteria.size()]);
+ }
+
+ private static String ensureValid(String id) {
+ if (id == null) {
+ throw new IllegalArgumentException("The id can not be null.");
+ }
+ return id;
+ }
+
+ private String getArtifactSelectSql() throws OseeCoreException {
+ if (count) {
+ sql.append("SELECT%s count(%s.art_id) FROM ");
+ } else {
+ sql.append("SELECT%s %s.art_id, %s.branch_id FROM ");
+ }
+
+ if (criteria.length > 0) {
+ for (AbstractArtifactSearchCriteria x : criteria) {
+ x.addToTableSql(this);
+ }
+ }
+
+ String artAlias, artvAlias, txsAlias, txdAlias;
+ if (tableOrderForward) {
+ artAlias = appendAliasedTable("osee_artifact");
+ artvAlias = appendAliasedTable("osee_artifact_version");
+ txsAlias = appendAliasedTable("osee_txs");
+ txdAlias = appendAliasedTable("osee_tx_details");
+ } else {
+ txdAlias = appendAliasedTable("osee_tx_details");
+ txsAlias = appendAliasedTable("osee_txs");
+ artvAlias = appendAliasedTable("osee_artifact_version");
+ artAlias = appendAliasedTable("osee_artifact");
+ }
+ sql.append("\n");
+
+ sql.append(" WHERE ");
+
+ if (artifactId != 0) {
+ sql.append(artAlias);
+ sql.append(".art_id=? AND ");
+ addParameter(artifactId);
+ }
+
+ if (artifactIds != null) {
+ sql.append(artAlias);
+ sql.append(".art_id IN (" + Collections.toString(",", artifactIds) + ") AND ");
+ }
+ if (artifactTypes != null) {
+ sql.append(artAlias);
+ sql.append(".art_type_id");
+ if (artifactTypes.size() == 1) {
+ sql.append("=? AND ");
+ addParameter(artifactTypes.iterator().next().getArtTypeId());
+ } else {
+ sql.append(" IN (");
+ for (ArtifactType artifactType : artifactTypes) {
+ sql.append(artifactType.getArtTypeId());
+ sql.append(",");
+ }
+ sql.deleteCharAt(sql.length() - 1);
+ sql.append(") AND ");
+ }
+ }
+
+ if (guidOrHrid != null) {
+ if (GUID.isValid(guidOrHrid)) {
+ sql.append(artAlias);
+ sql.append(".guid=? AND ");
+ } else {
+ sql.append(artAlias);
+ sql.append(".human_readable_id=? AND ");
+ }
+ addParameter(guidOrHrid);
+ }
+
+ if (guids != null && guids.size() > 0) {
+ sql.append(artAlias);
+ sql.append(".guid IN ('" + Collections.toString("','", guids) + "') AND ");
+ }
+ if (hrids != null && hrids.size() > 0) {
+ sql.append(artAlias);
+ sql.append(".human_readable_id IN ('" + Collections.toString("','", hrids) + "') AND ");
+ }
+
+ sql.append("\n");
+ if (criteria.length > 0) {
+ criteria[0].addToWhereSql(this);
+ sql.append("\n");
+ for (int i = 1; i < criteria.length; i++) {
+ AbstractArtifactSearchCriteria leftCriteria = criteria[i - 1];
+ AbstractArtifactSearchCriteria rightCriteria = criteria[i];
+ leftCriteria.addJoinArtId(this, false);
+ sql.append("=");
+ rightCriteria.addJoinArtId(this, true);
+ sql.append(" AND ");
+ rightCriteria.addToWhereSql(this);
+ sql.append("\n");
+ }
+ criteria[criteria.length - 1].addJoinArtId(this, false);
+ sql.append("=");
+ sql.append(artAlias);
+ sql.append(".art_id AND ");
+ }
+
+ sql.append(artAlias);
+ sql.append(".art_id=");
+ sql.append(artvAlias);
+ sql.append(".art_id AND ");
+ sql.append(artvAlias);
+ sql.append(".gamma_id=");
+ sql.append(txsAlias);
+ sql.append(".gamma_id AND ");
+
+ if (transactionId != null) {
+ sql.append(txsAlias);
+ sql.append(".transaction_id <= ?");
+ addParameter(transactionId.getTransactionNumber());
+ } else {
+ sql.append(txsAlias);
+ sql.append(".tx_current");
+
+ if (allowDeleted) {
+ sql.append(" IN (");
+ sql.append(TxChange.CURRENT.getValue());
+ sql.append(", ");
+ sql.append(TxChange.DELETED.getValue());
+ sql.append(")");
+ } else {
+ sql.append("=");
+ sql.append(TxChange.CURRENT.getValue());
+ }
+ }
+
+ sql.append(" AND ");
+ addBranchTxSql(txsAlias, txdAlias);
+
+ List<String> paramList = new ArrayList<String>();
+ paramList.add(OseeSql.isHintsAllowed() ? ClientSessionManager.getSQL(OseeSql.QUERY_BUILDER_HINT) : "");
+ if (count) {
+ paramList.add(artAlias);
+ } else {
+ paramList.add(artAlias);
+ // paramList.add(txdAlias);
+ paramList.add(txdAlias);
+ }
+ return String.format(sql.toString(), paramList.toArray());
+ }
+
+ public void append(String sqlSnippet) {
+ sql.append(sqlSnippet);
+ }
+
+ public void addParameter(Object data) {
+ queryParameters.add(data);
+ }
+
+ public void addTxSql(String txsAlias, String txdAlias, boolean historical) {
+ if (!historical) {
+ addCurrentTxSql(txsAlias);
+ }
+ addBranchTxSql(txsAlias, txdAlias);
+ sql.append(" AND ");
+ }
+
+ private void addCurrentTxSql(String txsAlias) {
+ sql.append(txsAlias);
+ sql.append(".tx_current=1 AND ");
+ }
+
+ private void addBranchTxSql(String txsAlias, String txdAlias) {
+ sql.append(txsAlias);
+ sql.append(".transaction_id=");
+ sql.append(txdAlias);
+ sql.append(".transaction_id");
+ if (branch != null) {
+ sql.append(" AND ");
+ sql.append(txdAlias);
+ sql.append(".branch_id=?");
+ addParameter(branch.getBranchId());
+ }
+ }
+
+ public String appendAliasedTable(String table) {
+ if (firstTable) {
+ firstTable = false;
+ } else {
+ sql.append(',');
+ }
+ sql.append(table);
+ sql.append(' ');
+ String alias = nextAliases.get(table).getNextAlias();
+ sql.append(alias);
+ return alias;
+ }
+
+ private class NextAlias {
+ String aliasPrefix;
+ int aliasSuffix;
+
+ public NextAlias(String aliasPrefix) {
+ this.aliasPrefix = aliasPrefix;
+ this.aliasSuffix = 1;
+ }
+
+ public String getNextAlias() {
+ return aliasPrefix + aliasSuffix++;
+ }
+ }
+
+ public List<Artifact> getArtifacts(int artifactCountEstimate, ISearchConfirmer confirmer) throws OseeCoreException {
+ return internalGetArtifacts(artifactCountEstimate, confirmer, false);
+ }
+
+ public List<Artifact> reloadArtifacts(int artifactCountEstimate) throws OseeCoreException {
+ return internalGetArtifacts(artifactCountEstimate, null, true);
+ }
+
+ public Artifact reloadArtifact() throws OseeCoreException {
+ if (emptyCriteria) {
+ throw new ArtifactDoesNotExist("received an empty list in the criteria for this search");
+ }
+ Collection<Artifact> artifacts = internalGetArtifacts(1, null, true);
+
+ if (artifacts.size() == 0) {
+ throw new ArtifactDoesNotExist(getSoleExceptionMessage(artifacts.size()));
+ }
+ if (artifacts.size() > 1) {
+ throw new MultipleArtifactsExist(getSoleExceptionMessage(artifacts.size()));
+ }
+ return artifacts.iterator().next();
+ }
+
+ private List<Artifact> internalGetArtifacts(int artifactCountEstimate, ISearchConfirmer confirmer, boolean reload) throws OseeCoreException {
+ if (emptyCriteria) {
+ return java.util.Collections.emptyList();
+ }
+ List<Artifact> artifacts =
+ ArtifactLoader.getArtifacts(getArtifactSelectSql(), queryParameters.toArray(), artifactCountEstimate,
+ loadLevel, reload, confirmer, transactionId, allowDeleted);
+ clearCriteria();
+ return artifacts;
+ }
+
+ private void clearCriteria() throws OseeDataStoreException {
+ if (this.criteria != null) {
+ for (AbstractArtifactSearchCriteria critiri : criteria) {
+ critiri.cleanUp();
+ }
+ }
+ }
+
+ public void selectArtifacts(int queryId, int artifactCountEstimate, CompositeKeyHashMap<Integer, Integer, Object[]> insertParameters, TransactionId transactionId) throws OseeCoreException {
+ ArtifactLoader.selectArtifacts(queryId, insertParameters, getArtifactSelectSql(), queryParameters.toArray(),
+ artifactCountEstimate, transactionId);
+ clearCriteria();
+ }
+
+ public List<Integer> selectArtifacts(int artifactCountEstimate) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ List<Integer> artifactIds = new ArrayList<Integer>(artifactCountEstimate);
+
+ try {
+ chStmt.runPreparedQuery(artifactCountEstimate, getArtifactSelectSql(), queryParameters.toArray());
+
+ while (chStmt.next()) {
+ artifactIds.add(chStmt.getInt("art_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ clearCriteria();
+ return artifactIds;
+ }
+
+ public int countArtifacts() throws OseeCoreException {
+ if (emptyCriteria) {
+ return 0;
+ }
+
+ count = true;
+ try {
+ return ConnectionHandler.runPreparedQueryFetchInt(0, getArtifactSelectSql(), queryParameters.toArray());
+ } finally {
+ clearCriteria();
+ }
+ }
+
+ public Artifact getOrCheckArtifact(QueryType queryType) throws OseeCoreException {
+ if (emptyCriteria) {
+ throw new ArtifactDoesNotExist("received an empty list in the criteria for this search");
+ }
+ Collection<Artifact> artifacts = getArtifacts(1, null);
+
+ if (artifacts.size() == 0) {
+ if (queryType.equals(QueryType.CHECK)) {
+ return null;
+ }
+ throw new ArtifactDoesNotExist(getSoleExceptionMessage(artifacts.size()));
+ }
+ if (artifacts.size() > 1) {
+ throw new MultipleArtifactsExist(getSoleExceptionMessage(artifacts.size()));
+ }
+ return artifacts.iterator().next();
+ }
+
+ private String getSoleExceptionMessage(int artifactCount) {
+ StringBuilder message = new StringBuilder(250);
+ if (artifactCount == 0) {
+ message.append("ArtifactQueryBuilder: No artifact found");
+ } else {
+ message.append(artifactCount);
+ message.append(" artifacts found");
+ }
+ if (artifactTypes != null) {
+ message.append(" with type(s): ");
+ message.append(artifactTypes);
+ }
+ if (artifactId != 0) {
+ message.append(" with id \"");
+ message.append(artifactId);
+ message.append("\"");
+ }
+ if (guidOrHrid != null) {
+ message.append(" with id \"");
+ message.append(guidOrHrid);
+ message.append("\"");
+ }
+ if (criteria.length > 0) {
+ message.append(" with criteria \"");
+ message.append(Arrays.deepToString(criteria));
+ message.append("\"");
+ }
+ message.append(" on branch \"");
+ message.append(branch);
+ message.append("\"");
+ return message.toString();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactTypeSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactTypeSearch.java
new file mode 100644
index 00000000000..d4a82fecbcf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactTypeSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TYPE_TABLE;
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.EQUAL;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ArtifactTypeSearch implements ISearchPrimitive {
+ private String typeName;
+ private DepricatedOperator operation;
+ private static final String tables = ARTIFACT_TABLE + "," + ARTIFACT_TYPE_TABLE;
+ private final static String TOKEN = ";";
+
+ /**
+ * @param typeName
+ */
+ public ArtifactTypeSearch(String typeName, DepricatedOperator operation) {
+ super();
+ this.typeName = typeName;
+ this.operation = operation;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String sql =
+ ARTIFACT_TYPE_TABLE.column("name") + operation + " ? AND " + ARTIFACT_TYPE_TABLE.column("art_type_id") + EQUAL + ARTIFACT_TABLE.column("art_type_id");
+ dataList.add(typeName);
+
+ return sql;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return tables;
+ }
+
+ @Override
+ public String toString() {
+ return "Artifact type: " + typeName;
+ }
+
+ public String getStorageString() {
+ return typeName + TOKEN + operation.name();
+ }
+
+ public static ArtifactTypeSearch getPrimitive(String storageString) {
+ String[] values = storageString.split(TOKEN);
+ if (values.length != 2) throw new IllegalStateException(
+ "Value for " + ArtifactTypeSearch.class.getSimpleName() + " not parsable");
+
+ return new ArtifactTypeSearch(values[0], DepricatedOperator.valueOf(values[1]));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactXmlQueryResultParser.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactXmlQueryResultParser.java
new file mode 100644
index 00000000000..510e4e71b4e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ArtifactXmlQueryResultParser.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.framework.skynet.core.artifact.search;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.ArtifactJoinQuery;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * <pre>
+ * &lt;search&gt;
+ * &lt;match branchId=&quot;15&quot;&gt;
+ * &lt;art artId=&quot;87577&quot;&gt;
+ * &lt;attr gammaId=&quot;292554&quot;&gt;
+ * &lt;location start=&quot;27036&quot; end=&quot;27045&quot;/&gt;
+ * &lt;location start=&quot;28570&quot; end=&quot;28579&quot;/&gt;
+ * &lt;/attr&gt;
+ * &lt;/art&gt;
+ * &lt;/match&gt;
+ * &lt;/search&gt;
+ * </pre>
+ *
+ * @author Roberto E. Escobar
+ */
+public class ArtifactXmlQueryResultParser extends AbstractSaxHandler {
+
+ private List<XmlArtifactSearchResult> results;
+ private XmlArtifactSearchResult currentResult;
+ private long currentAttribute;
+ private int currentArtifact;
+
+ public ArtifactXmlQueryResultParser() {
+ this.results = new ArrayList<XmlArtifactSearchResult>();
+ this.currentResult = null;
+ this.currentAttribute = -1;
+ this.currentArtifact = -1;
+ }
+
+ private void handleError(Throwable ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+
+ public List<XmlArtifactSearchResult> getResults() {
+ return results;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ try {
+ if (name.equalsIgnoreCase("search")) {
+ currentResult = new XmlArtifactSearchResult();
+ } else if (name.equalsIgnoreCase("match")) {
+ handleMatch(attributes);
+ } else if (name.equalsIgnoreCase("art")) {
+ handleArtifact(attributes);
+ } else if (name.equalsIgnoreCase("attr")) {
+ handleAttribute(attributes);
+ } else if (name.equalsIgnoreCase("location")) {
+ handleMatchLocation(attributes);
+ }
+ } catch (Throwable ex) {
+ handleError(ex);
+ }
+ }
+
+ private void handleMatch(Attributes attributes) {
+ String branchIdStr = attributes.getValue("branchId");
+ if (Strings.isValid(branchIdStr)) {
+ if (currentResult != null) {
+ currentResult.setBranchId(Integer.parseInt(branchIdStr));
+ }
+ }
+ }
+
+ private void handleArtifact(Attributes attributes) {
+ String artIdStr = attributes.getValue("artId");
+ if (Strings.isValid(artIdStr)) {
+ currentArtifact = Integer.parseInt(artIdStr);
+ if (currentResult != null) {
+ currentResult.addArtifact(currentArtifact);
+ }
+ }
+ }
+
+ private void handleAttribute(Attributes attributes) {
+ String gammaId = attributes.getValue("gammaId");
+ if (Strings.isValid(gammaId)) {
+ currentAttribute = Long.parseLong(gammaId);
+ }
+ }
+
+ private void handleMatchLocation(Attributes attributes) {
+ String startAt = attributes.getValue("start");
+ String stopAt = attributes.getValue("end");
+ if (currentResult != null && currentArtifact > -1 && currentAttribute > -1 && Strings.isValid(startAt) && Strings.isValid(stopAt)) {
+ int start = Integer.parseInt(startAt);
+ int stop = Integer.parseInt(stopAt);
+ currentResult.addAttribute(currentArtifact, currentAttribute, start, stop);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ try {
+ if (name.equalsIgnoreCase("search")) {
+ } else if (name.equalsIgnoreCase("match")) {
+ if (currentResult != null) {
+ results.add(currentResult);
+ currentResult = null;
+ }
+ } else if (name.equalsIgnoreCase("art")) {
+ currentArtifact = -1;
+ } else if (name.equalsIgnoreCase("attr")) {
+ currentAttribute = -1;
+ } else if (name.equalsIgnoreCase("location")) {
+ }
+ } catch (Throwable ex) {
+ handleError(ex);
+ }
+ }
+
+ public final class XmlArtifactSearchResult {
+ private ArtifactJoinQuery artifactJoinQuery;
+ private int branchId;
+ private Map<Integer, HashCollection<Long, MatchLocation>> attributeMatches;
+
+ public XmlArtifactSearchResult() {
+ this.artifactJoinQuery = JoinUtility.createArtifactJoinQuery();
+ this.branchId = -1;
+ this.attributeMatches = new HashMap<Integer, HashCollection<Long, MatchLocation>>();
+ }
+
+ private void setBranchId(int branchId) {
+ this.branchId = branchId;
+ }
+
+ private void addArtifact(int artifactId) {
+ artifactJoinQuery.add(artifactId, branchId);
+ }
+
+ private void addAttribute(int artifactId, long gammaId, int start, int end) {
+ HashCollection<Long, MatchLocation> matches = attributeMatches.get(artifactId);
+ if (matches == null) {
+ matches = new HashCollection<Long, MatchLocation>();
+ attributeMatches.put(artifactId, matches);
+ }
+ matches.put(gammaId, new MatchLocation(start, end));
+ }
+
+ public ArtifactJoinQuery getJoinQuery() {
+ return artifactJoinQuery;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ public boolean hasAttriuteMatches() {
+ return !attributeMatches.isEmpty();
+ }
+
+ public HashCollection<Long, MatchLocation> getAttributeMatches(int artifactId) {
+ return attributeMatches.get(artifactId);
+ }
+ }
+
+ public class MatchLocation {
+ private int startPosition;
+ private int endPosition;
+
+ public MatchLocation(int startPosition, int endPosition) {
+ this.startPosition = startPosition;
+ this.endPosition = endPosition;
+ }
+
+ public int getStartPosition() {
+ return startPosition;
+ }
+
+ public int getEndPosition() {
+ return endPosition;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeCriteria.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeCriteria.java
new file mode 100644
index 00000000000..bb1abaefea8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeCriteria.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.framework.skynet.core.artifact.search;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.AttributeJoinQuery;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeCriteria extends AbstractArtifactSearchCriteria {
+
+ private AttributeType attributeType;
+ private String value;
+ private Collection<String> values;
+ private String txsAlias;
+ private String txdAlias;
+ private String attrAlias;
+ private final boolean historical;
+ private final Operator operator;
+ private AttributeJoinQuery joinQuery;
+
+ /**
+ * Constructor for search criteria that finds an attribute of the given type with its current value equal to the
+ * given value.
+ *
+ * @param attributeType
+ * @param value to search; supports % wildcard
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public AttributeCriteria(String attributeTypeName, String value) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this(attributeTypeName, value, false);
+ }
+
+ public AttributeCriteria(AttributeType attributeType, String value) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this(attributeType, value, null, false, Operator.EQUAL);
+ }
+
+ /**
+ * Constructor for search criteria that finds an attribute of the given type and any value (i.e. checks for
+ * existence)
+ *
+ * @param attributeTypeName
+ * @param value
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public AttributeCriteria(String attributeTypeName) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this(attributeTypeName, null, false);
+ }
+
+ /**
+ * Constructor for search criteria that finds an attribute of the given type with its current value exactly equal to
+ * any one of the given literal values. If the list only contains one value, then the search is conducted exactly as
+ * if the single value constructor was called. This search does not support the wildcard for multiple values.
+ *
+ * @param attributeTypeName
+ * @param values
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public AttributeCriteria(String attributeTypeName, Collection<String> values) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this(toAttributeType(attributeTypeName), null, values, false, Operator.EQUAL);
+ }
+
+ /**
+ * Constructor for search criteria that finds an attribute of the given type with its current value exactly equal (or
+ * not equal) to any one of the given literal values. If the list only contains one value, then the search is
+ * conducted exactly as if the single value constructor was called. This search does not support the wildcard for
+ * multiple values.
+ *
+ * @param attributeTypeName
+ * @param values
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public AttributeCriteria(String attributeTypeName, Collection<String> values, Operator operator) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this(toAttributeType(attributeTypeName), null, values, false, operator);
+ }
+
+ /**
+ * Constructor for search criteria that finds an attribute of the given type with its current value equal to the
+ * given value.
+ *
+ * @param attributeTypeName
+ * @param value to search; supports % wildcard
+ * @param historical if true will search on any branch and any attribute revision
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public AttributeCriteria(String attributeTypeName, String value, boolean historical) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this(toAttributeType(attributeTypeName), value, null, historical, Operator.EQUAL);
+ }
+
+ private static AttributeType toAttributeType(String attributeTypeName) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ return attributeTypeName == null ? null : AttributeTypeManager.getType(attributeTypeName);
+ }
+
+ public AttributeCriteria(AttributeType attributeType, String value, Collection<String> values, boolean historical, Operator operator) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ this.attributeType = attributeType;
+
+ if (values == null) {
+ this.value = value;
+ } else {
+ if (values.size() == 1) {
+ this.value = values.iterator().next();
+ } else {
+ this.values = values;
+ joinQuery = JoinUtility.createAttributeJoinQuery();
+ for (String str : values) {
+ joinQuery.add(str);
+ }
+ }
+ }
+ this.operator = operator;
+ this.historical = historical;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria#addToTableSql(org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder)
+ */
+ @Override
+ public void addToTableSql(ArtifactQueryBuilder builder) {
+ attrAlias = builder.appendAliasedTable("osee_attribute");
+ txsAlias = builder.appendAliasedTable("osee_txs");
+ txdAlias = builder.appendAliasedTable("osee_tx_details");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria#addToWhereSql(org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder)
+ */
+ @Override
+ public void addToWhereSql(ArtifactQueryBuilder builder) throws OseeDataStoreException {
+ if (attributeType != null) {
+ builder.append(attrAlias);
+ builder.append(".attr_type_id=? AND ");
+ builder.addParameter(attributeType.getAttrTypeId());
+ }
+ if (value != null) {
+ builder.append(attrAlias);
+ builder.append(".value");
+ if (value.contains("%")) {
+ if (operator == Operator.NOT_EQUAL) {
+ builder.append(" NOT");
+ }
+ builder.append(" LIKE ");
+ } else {
+ if (operator == Operator.NOT_EQUAL) {
+ builder.append("<>");
+ } else {
+ builder.append("=");
+ }
+ }
+ builder.append("? AND ");
+ builder.addParameter(value);
+ }
+
+ if (values != null && values.size() > 0) {
+
+ builder.append(attrAlias);
+ builder.append(".value ");
+ if (operator == Operator.NOT_EQUAL) {
+ builder.append("NOT ");
+ }
+ builder.append("IN ( SELECT value FROM osee_join_attribute WHERE attr_query_id = ? ) AND ");
+ builder.addParameter(joinQuery.getQueryId());
+ joinQuery.store();
+ }
+
+ builder.append(attrAlias);
+ builder.append(".gamma_id=");
+ builder.append(txsAlias);
+ builder.append(".gamma_id AND ");
+
+ builder.addTxSql(txsAlias, txdAlias, historical);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria#addJoinArtId(org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder)
+ */
+ @Override
+ public void addJoinArtId(ArtifactQueryBuilder builder, boolean left) {
+ builder.append(attrAlias);
+ builder.append(".art_id");
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ StringBuilder strB = new StringBuilder();
+ if (attributeType != null) {
+ strB.append(attributeType.getName());
+ } else {
+ strB.append("*");
+ }
+ if (operator == Operator.NOT_EQUAL) {
+ strB.append(" NOT ");
+ }
+ strB.append("=");
+ if (value != null) {
+ strB.append(value);
+ }
+
+ if (values != null && values.size() > 0) {
+ strB.append(attrAlias);
+ strB.append("(" + Collections.toString(",", values) + ")");
+ }
+ return strB.toString();
+ }
+
+ public void cleanUp() throws OseeDataStoreException {
+ if (joinQuery != null) {
+ joinQuery.delete();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeValueSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeValueSearch.java
new file mode 100644
index 00000000000..4070cefd073
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/AttributeValueSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_TYPE_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.IS;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.core.schema.LocalAliasTable;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class AttributeValueSearch implements ISearchPrimitive {
+ private String attributeName;
+ private String attributeValue;
+ private DepricatedOperator operator;
+ private static final LocalAliasTable ATTRIBUTE_ALIAS_1 = new LocalAliasTable(ATTRIBUTE_VERSION_TABLE, "attr_1");
+ private static final LocalAliasTable ATTRIBUTE_ALIAS_2 = new LocalAliasTable(ATTRIBUTE_VERSION_TABLE, "attr_2");
+ private static final LocalAliasTable ATTRIBUTE_TYPE_ALIAS_1 =
+ new LocalAliasTable(ATTRIBUTE_TYPE_TABLE, "attr_type_1");
+ private static final String tables = ATTRIBUTE_ALIAS_1 + "," + ATTRIBUTE_TYPE_ALIAS_1 + "," + TRANSACTIONS_TABLE;
+ private final static String TOKEN = ";";
+
+ /**
+ * @param attributeName
+ */
+ public AttributeValueSearch(String attributeName) {
+ this(attributeName, null, null);
+ }
+
+ /**
+ * @param attributeName
+ * @param attributeValue
+ * @param operator
+ */
+ public AttributeValueSearch(String attributeName, String attributeValue, DepricatedOperator operator) {
+
+ if (attributeValue == null && operator != null) throw new IllegalArgumentException(
+ "An attributeValue must be supplied if an operator is supplied");
+ if (attributeValue != null && operator == null) throw new IllegalArgumentException(
+ "An operator must be supplied if an attributeValue is supplied");
+ if (attributeName == null) throw new IllegalArgumentException("attributeName can not be null");
+
+ this.attributeName = attributeName;
+
+ if (attributeValue != null && attributeValue.length() == 0) {
+ this.attributeValue = null;
+ this.operator = IS;
+ } else {
+ this.attributeValue = attributeValue;
+ this.operator = operator;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String sql;
+
+ if (operator == DepricatedOperator.LIKE || operator == DepricatedOperator.CONTAINS)
+ sql = ATTRIBUTE_TYPE_ALIAS_1.column("name") + " LIKE ?";
+ else
+ sql = ATTRIBUTE_TYPE_ALIAS_1.column("name") + "=?";
+ dataList.add(attributeName);
+
+ sql +=
+ " AND " + ATTRIBUTE_TYPE_ALIAS_1.column("attr_type_id") + "=" + ATTRIBUTE_ALIAS_1.column("attr_type_id") + " AND " + ATTRIBUTE_ALIAS_1.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + "(SELECT max(osee_txs.transaction_id) FROM " + ATTRIBUTE_ALIAS_2 + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + ATTRIBUTE_ALIAS_2.column("attr_id") + "=" + ATTRIBUTE_ALIAS_1.column("attr_id") + " AND " + ATTRIBUTE_ALIAS_2.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)";
+
+ dataList.add(branch.getBranchId());
+
+ if (attributeValue != null) {
+ sql += " AND " + ATTRIBUTE_ALIAS_1.column("value") + operator + " ?";
+ if (operator == DepricatedOperator.CONTAINS)
+ dataList.add("%" + attributeValue + "%");
+ else
+ dataList.add(attributeValue);
+ }
+
+ return sql;
+ }
+
+ @Override
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return tables;
+ }
+
+ @Override
+ public String toString() {
+ return "Attribute value: " + attributeName + operator + "\"" + attributeValue + "\"";
+ }
+
+ public String getStorageString() {
+ return attributeName + TOKEN + (attributeValue == null ? "" : attributeValue) + TOKEN + (operator == null ? "" : operator.name());
+ }
+
+ public static AttributeValueSearch getPrimitive(String storageString) {
+ String[] values = storageString.split(TOKEN);
+ if (values.length != 3) throw new IllegalStateException(
+ "Value for " + AttributeValueSearch.class.getSimpleName() + " not parsable");
+
+ return new AttributeValueSearch(values[0], values[1], DepricatedOperator.valueOf(values[2]));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/CommittingArtifactSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/CommittingArtifactSearch.java
new file mode 100644
index 00000000000..6fac6a2a809
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/CommittingArtifactSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * Searches for artifacts used as the Control Management artifact of any commit involving a supplied artifact.
+ *
+ * @author Robert A. Fisher
+ */
+public class CommittingArtifactSearch implements ISearchPrimitive {
+ private Integer artId;
+ private static final String tables =
+ TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + "," + ARTIFACT_VERSION_TABLE;
+
+ public CommittingArtifactSearch(Integer artId) {
+ if (artId == null) throw new IllegalArgumentException("artId can not be null");
+
+ this.artId = artId;
+ }
+
+ public String getArtIdColName() {
+ return "commit_art_id";
+ }
+
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String whereConditions =
+ TRANSACTION_DETAIL_TABLE.join(TRANSACTIONS_TABLE, "transaction_id") + " AND " + TRANSACTIONS_TABLE.join(
+ ARTIFACT_VERSION_TABLE, "gamma_id") + " AND " + ARTIFACT_VERSION_TABLE.column("art_id") + "=?";
+
+ dataList.add(artId);
+
+ return whereConditions;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return tables;
+ }
+
+ @Override
+ public String toString() {
+ return "Committed: " + artId;
+ }
+
+ public String getStorageString() {
+ return artId.toString();
+ }
+
+ public static CommittingArtifactSearch getPrimitive(String storageString) throws NumberFormatException {
+ return new CommittingArtifactSearch(Integer.parseInt(storageString));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ConflictingArtifactSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ConflictingArtifactSearch.java
new file mode 100644
index 00000000000..c7420af1c4a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ConflictingArtifactSearch.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.framework.skynet.core.artifact.search;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ConflictingArtifactSearch implements ISearchPrimitive {
+ private static final String TOKEN = ";";
+ private static final String CONFLICT_TABLE =
+ "((SELECT art_id " + "FROM " + SkynetDatabase.ARTIFACT_VERSION_TABLE + " t1, " + " " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + " " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 " + "WHERE t3.branch_id = ? " + " AND t3.transaction_id > ? " + " AND t3.transaction_id <= ? " + " AND t3.transaction_id = t2.transaction_id " + " AND t2.gamma_id = t1.gamma_id union all " +
+
+ "SELECT a_art_id as art_id " + "FROM " + SkynetDatabase.RELATION_LINK_VERSION_TABLE + " t1, " + " " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + " " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 " + "WHERE t3.branch_id = ? " + " AND t3.transaction_id > ? " + " AND t3.transaction_id <= ? " + " AND t3.transaction_id = t2.transaction_id " + " AND t2.gamma_id = t1.gamma_id union all " +
+
+ "SELECT b_art_id as art_id " + "FROM " + SkynetDatabase.RELATION_LINK_VERSION_TABLE + " t1, " + " " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + " " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 " + "WHERE t3.branch_id = ? " + " AND t3.transaction_id > ? " + " AND t3.transaction_id <= ? " + " AND t3.transaction_id = t2.transaction_id " + " AND t2.gamma_id = t1.gamma_id) " +
+
+ " intersect " +
+
+ "(SELECT art_id " + "FROM " + SkynetDatabase.ARTIFACT_VERSION_TABLE + " t1, " + " " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + " " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 " + "WHERE t3.branch_id = ? " + " AND t3.transaction_id > ? " + " AND t3.transaction_id <= ? " + " AND t3.transaction_id = t2.transaction_id " + " AND t2.gamma_id = t1.gamma_id union all " +
+
+ "SELECT a_art_id as art_id " + "FROM " + SkynetDatabase.RELATION_LINK_VERSION_TABLE + " t1, " + " " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + " " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 " + "WHERE t3.branch_id = ? " + " AND t3.transaction_id > ? " + " AND t3.transaction_id <= ? " + " AND t3.transaction_id = t2.transaction_id " + " AND t2.gamma_id = t1.gamma_id union all " +
+
+ "SELECT b_art_id as art_id " + "FROM " + SkynetDatabase.RELATION_LINK_VERSION_TABLE + " t1, " + " " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + " " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 " + "WHERE t3.branch_id = ? " + " AND t3.transaction_id > ? " + " AND t3.transaction_id <= ? " + " AND t3.transaction_id = t2.transaction_id " + " AND t2.gamma_id = t1.gamma_id)) tcd1";
+
+ private final int parentBranchId;
+ private final int parentBaseTransactionNumber;
+ private final int parentHeadTransactionNumber;
+ private final int childBranchId;
+ private final int childBaseTransactionNumber;
+ private final int childHeadTransactionNumber;
+
+ /**
+ * @param parentBranchId
+ * @param parentBaseTramsactionNumber
+ * @param parentHeadTransactionNumber
+ * @param childBranchId
+ * @param childBaseTransactionNumber
+ * @param childHeadTransactionNumber
+ */
+ public ConflictingArtifactSearch(int parentBranchId, int parentBaseTramsactionNumber, int parentHeadTransactionNumber, int childBranchId, int childBaseTransactionNumber, int childHeadTransactionNumber) {
+ super();
+ this.parentBranchId = parentBranchId;
+ this.parentBaseTransactionNumber = parentBaseTramsactionNumber;
+ this.parentHeadTransactionNumber = parentHeadTransactionNumber;
+ this.childBranchId = childBranchId;
+ this.childBaseTransactionNumber = childBaseTransactionNumber;
+ this.childHeadTransactionNumber = childHeadTransactionNumber;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ return "";
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ dataList.add(parentBranchId);
+ dataList.add(parentBaseTransactionNumber);
+ dataList.add(parentHeadTransactionNumber);
+ dataList.add(parentBranchId);
+ dataList.add(parentBaseTransactionNumber);
+ dataList.add(parentHeadTransactionNumber);
+ dataList.add(parentBranchId);
+ dataList.add(parentBaseTransactionNumber);
+ dataList.add(parentHeadTransactionNumber);
+ dataList.add(childBranchId);
+ dataList.add(childBaseTransactionNumber);
+ dataList.add(childHeadTransactionNumber);
+ dataList.add(childBranchId);
+ dataList.add(childBaseTransactionNumber);
+ dataList.add(childHeadTransactionNumber);
+ dataList.add(childBranchId);
+ dataList.add(childBaseTransactionNumber);
+ dataList.add(childHeadTransactionNumber);
+
+ return CONFLICT_TABLE;
+ }
+
+ @Override
+ public String toString() {
+ String parentBranch;
+ String childBranch;
+
+ try {
+ parentBranch = BranchManager.getBranch(parentBranchId).getBranchName();
+ childBranch = BranchManager.getBranch(childBranchId).getBranchName();
+ } catch (Exception ex) {
+ parentBranch = Integer.toString(parentBranchId);
+ childBranch = Integer.toString(childBranchId);
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+
+ return "Parent Branch:" + parentBranch + " transactions " + parentBaseTransactionNumber + " to " + parentHeadTransactionNumber + "\n" + "Child Branch:" + childBranch + " transactions " + childBaseTransactionNumber + " to " + childHeadTransactionNumber;
+
+ }
+
+ public String getStorageString() {
+ return parentBranchId + TOKEN + parentBaseTransactionNumber + TOKEN + parentHeadTransactionNumber + TOKEN + childBranchId + TOKEN + childBaseTransactionNumber + TOKEN + childHeadTransactionNumber;
+ }
+
+ public static ConflictingArtifactSearch getPrimitive(String storageString) {
+ String[] values = storageString.split(TOKEN);
+ if (values.length != 6) throw new IllegalStateException(
+ "Value for " + ConflictingArtifactSearch.class.getSimpleName() + " not parsable");
+
+ return new ConflictingArtifactSearch(Integer.parseInt(values[0]), Integer.parseInt(values[1]),
+ Integer.parseInt(values[2]), Integer.parseInt(values[3]), Integer.parseInt(values[4]),
+ Integer.parseInt(values[5]));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/DepricatedOperator.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/DepricatedOperator.java
new file mode 100644
index 00000000000..4a474c6c62e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/DepricatedOperator.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.framework.skynet.core.artifact.search;
+
+@Deprecated
+public enum DepricatedOperator {
+ EQUAL("="), NOT_EQUAL("<>"), LIKE(" like "), CONTAINS(" like "), IS(" is ");
+
+ private String expression;
+
+ /**
+ * @param expression
+ */
+ private DepricatedOperator(String expression) {
+ this.expression = expression;
+ }
+
+ public String toString() {
+ return expression;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/FromArtifactsSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/FromArtifactsSearch.java
new file mode 100644
index 00000000000..7127cba739e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/FromArtifactsSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class FromArtifactsSearch implements ISearchPrimitive {
+ private static final String tables = ARTIFACT_TABLE.toString();
+ private static final String FROM_ARTIFACT_ELEMENT = "FromArtifact";
+
+ private List<ISearchPrimitive> criteria;
+ private boolean all;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /**
+ *
+ */
+ public FromArtifactsSearch(List<ISearchPrimitive> criteria, boolean all) {
+ this.criteria = criteria;
+ this.all = all;
+ }
+
+ public FromArtifactsSearch(ISearchPrimitive primitive) {
+ this.criteria = new ArrayList<ISearchPrimitive>(1);
+ this.criteria.add(primitive);
+ // all doesn't matter for just one primitive, so assume true
+ this.all = true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ return "art_id in (" + ArtifactPersistenceManager.getIdSql(criteria, all, dataList, branch) + ")";
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return tables;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("(");
+
+ for (ISearchPrimitive primitive : criteria)
+ sb.append(primitive);
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+
+ public String getStorageString() {
+ try {
+ Document document = Jaxp.newDocument();
+
+ Element root = document.createElement("FromArtifactAttribute");
+ root.appendChild(getStorageElements(document));
+
+ return Jaxp.getDocumentXml(document);
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ private Element getStorageElements(Document document) {
+ Element rootElement = document.createElement(FROM_ARTIFACT_ELEMENT);
+ rootElement.setAttribute("all", Boolean.toString(all));
+ document.appendChild(rootElement);
+
+ Element child;
+ for (ISearchPrimitive primitive : criteria) {
+ if (primitive instanceof FromArtifactsSearch) {
+ child = ((FromArtifactsSearch) primitive).getStorageElements(document);
+ } else {
+ child = document.createElement("Simple");
+ child.setAttribute("class", primitive.getClass().getCanonicalName());
+ child.setAttribute("value", primitive.getStorageString());
+ }
+ rootElement.appendChild(child);
+ }
+
+ return rootElement;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/HttpArtifactQuery.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/HttpArtifactQuery.java
new file mode 100644
index 00000000000..7499dd20987
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/HttpArtifactQuery.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.artifact.search;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStoreWriter;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.ISearchConfirmer;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactXmlQueryResultParser.MatchLocation;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactXmlQueryResultParser.XmlArtifactSearchResult;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class HttpArtifactQuery {
+ private final String queryString;
+ private final boolean matchWordOrder;
+ private final String[] attributeTypes;
+ private final boolean includeDeleted;
+ private final Branch branch;
+ private final boolean isCaseSensitive;
+
+ protected HttpArtifactQuery(Branch branch, String queryString, boolean matchWordOrder, boolean includeDeleted, boolean isCaseSensitive, String... attributeTypes) {
+ this.branch = branch;
+ this.matchWordOrder = matchWordOrder;
+ this.includeDeleted = includeDeleted;
+ this.attributeTypes = attributeTypes != null ? attributeTypes : new String[0];
+ this.queryString = queryString;
+ this.isCaseSensitive = isCaseSensitive;
+ }
+
+ private String getSearchUrl(String sessionId) throws OseeDataStoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("sessionId", sessionId);
+ return HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.SEARCH_CONTEXT, parameters);
+ }
+
+ private CharBackedInputStream getSearchParameters(String sessionId, boolean withMatches, boolean findAllMatchLocations) throws IOException {
+ CharBackedInputStream backedInputStream = new CharBackedInputStream();
+
+ PropertyStore propertyStore = new PropertyStore(sessionId);
+ propertyStore.put("branchId", branch.getBranchId());
+ propertyStore.put("query", queryString);
+ propertyStore.put("include deleted", includeDeleted);
+ propertyStore.put("match word order", matchWordOrder);
+ propertyStore.put("attributeType", attributeTypes);
+ propertyStore.put("case sensitive", isCaseSensitive);
+
+ if (matchWordOrder) {
+ propertyStore.put("as xml", withMatches);
+ if (withMatches) {
+ propertyStore.put("find all locations", findAllMatchLocations);
+ }
+ }
+ PropertyStoreWriter writer = new PropertyStoreWriter();
+ writer.save(propertyStore, backedInputStream.getWriter());
+
+ return backedInputStream;
+ }
+
+ public List<Artifact> getArtifacts(ArtifactLoad loadLevel, ISearchConfirmer confirmer, boolean reload, boolean historical, boolean allowDeleted) throws OseeCoreException {
+ List<Artifact> toReturn = null;
+ ObjectPair<String, ByteArrayOutputStream> data = executeSearch(false, false);
+ if (data != null) {
+ try {
+ ObjectPair<Integer, Integer> queryIdAndSize = handleAsDbJoin(data.object2);
+ if (queryIdAndSize != null && queryIdAndSize.object2 > 0) {
+ try {
+ toReturn =
+ ArtifactLoader.loadArtifactsFromQueryId(queryIdAndSize.object1, loadLevel, confirmer,
+ queryIdAndSize.object2, reload, historical, allowDeleted);
+ } finally {
+ JoinUtility.deleteQuery(JoinUtility.JoinItem.ARTIFACT, queryIdAndSize.object1.intValue());
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ if (toReturn == null) {
+ toReturn = java.util.Collections.emptyList();
+ }
+ return toReturn;
+ }
+
+ public List<ArtifactMatch> getArtifactsWithMatches(ArtifactLoad loadLevel, ISearchConfirmer confirmer, boolean reload, boolean historical, boolean allowDeleted, boolean findAllMatchLocations) throws OseeCoreException {
+ List<ArtifactMatch> toReturn = new ArrayList<ArtifactMatch>();
+ ObjectPair<String, ByteArrayOutputStream> data = executeSearch(true, findAllMatchLocations);
+ if (data != null) {
+
+ try {
+ if (data.object1.endsWith("xml")) {
+ List<XmlArtifactSearchResult> results = handleAsXmlResults(data.object2);
+ for (XmlArtifactSearchResult result : results) {
+ try {
+ result.getJoinQuery().store();
+ List<Artifact> artifacts =
+ ArtifactLoader.loadArtifactsFromQueryId(result.getJoinQuery().getQueryId(), loadLevel,
+ confirmer, result.getJoinQuery().size(), reload, historical, allowDeleted);
+ for (Artifact artifact : artifacts) {
+ ArtifactMatch artMatch = new ArtifactMatch(artifact, allowDeleted);
+ HashCollection<Long, MatchLocation> attributeMatches =
+ result.getAttributeMatches(artifact.getArtId());
+ if (attributeMatches != null) {
+ artMatch.addMatches(attributeMatches);
+ }
+ toReturn.add(artMatch);
+ }
+ } finally {
+ result.getJoinQuery().delete();
+ }
+ }
+ } else if (data.object1.endsWith("plain")) {
+ ObjectPair<Integer, Integer> queryIdAndSize = handleAsDbJoin(data.object2);
+ if (queryIdAndSize != null && queryIdAndSize.object2 > 0) {
+ try {
+ List<Artifact> artifactList =
+ ArtifactLoader.loadArtifactsFromQueryId(queryIdAndSize.object1, loadLevel, confirmer,
+ queryIdAndSize.object2, reload, historical, allowDeleted);
+ for (Artifact artifact : artifactList) {
+ toReturn.add(new ArtifactMatch(artifact, allowDeleted));
+ }
+ } finally {
+ JoinUtility.deleteQuery(JoinUtility.JoinItem.ARTIFACT, queryIdAndSize.object1.intValue());
+ }
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ return toReturn;
+ }
+
+ private ObjectPair<String, ByteArrayOutputStream> executeSearch(boolean withMatches, boolean findAllMatchLocations) throws OseeCoreException {
+ ObjectPair<String, ByteArrayOutputStream> toReturn = null;
+ String sessionId = ClientSessionManager.getSessionId();
+ CharBackedInputStream inputStream = null;
+ try {
+ inputStream = getSearchParameters(sessionId, withMatches, findAllMatchLocations);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ AcquireResult httpRequestResult =
+ HttpProcessor.post(new URL(getSearchUrl(sessionId)), inputStream, "application/xml", "UTF-8",
+ outputStream);
+ if (httpRequestResult.getCode() == HttpURLConnection.HTTP_ACCEPTED) {
+ toReturn = new ObjectPair<String, ByteArrayOutputStream>(httpRequestResult.getContentType(), outputStream);
+ } else if (httpRequestResult.getCode() != HttpURLConnection.HTTP_NO_CONTENT) {
+ throw new OseeCoreException(String.format("Search error due to bad request: url[%s] status code: [%s]",
+ inputStream.toString(), httpRequestResult.getCode()));
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private List<XmlArtifactSearchResult> handleAsXmlResults(ByteArrayOutputStream outputStream) throws SAXException, IOException {
+ ArtifactXmlQueryResultParser parser = new ArtifactXmlQueryResultParser();
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(parser);
+ xmlReader.parse(new InputSource(new ByteArrayInputStream(outputStream.toByteArray())));
+ return parser.getResults();
+ }
+
+ private ObjectPair<Integer, Integer> handleAsDbJoin(ByteArrayOutputStream outputStream) throws UnsupportedEncodingException {
+ ObjectPair<Integer, Integer> toReturn = null;
+ String queryIdString = outputStream.toString("UTF-8");
+ if (Strings.isValid(queryIdString)) {
+ String[] entries = queryIdString.split(",\\s*");
+ if (entries.length >= 2) {
+ toReturn = new ObjectPair<Integer, Integer>(new Integer(entries[0]), new Integer(entries[1]));
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ISearchPrimitive.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ISearchPrimitive.java
new file mode 100644
index 00000000000..016a0c9627a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/ISearchPrimitive.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.framework.skynet.core.artifact.search;
+
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+public interface ISearchPrimitive {
+
+ /**
+ * The sql operators that will provide a set of art_id's for the given search.
+ *
+ * @param branch TODO
+ * @return Return SQL string
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch);
+
+ /**
+ * The name of the column to use as the art_id column.
+ *
+ * @return Return artifact column name string
+ */
+ public String getArtIdColName();
+
+ /**
+ * Returns a list of the tables, comma separated, that are necessary for the sql statement returned from getSql().
+ *
+ * @param branch TODO
+ * @return tables string
+ * @see ISearchPrimitive#getCriteriaSql(List, Branch)
+ */
+ public String getTableSql(List<Object> dataList, Branch branch);
+
+ /**
+ * Returns a string which can be used to later re-acquire the primitive in full
+ *
+ * @return Return storage string
+ */
+ public String getStorageString();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/InRelationSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/InRelationSearch.java
new file mode 100644
index 00000000000..f317352aa64
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/InRelationSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_TYPE_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.EQUAL;
+import java.util.List;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.schema.LocalAliasTable;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class InRelationSearch implements ISearchPrimitive {
+ private static final LocalAliasTable LINK_ALIAS_1 = new LocalAliasTable(RELATION_LINK_VERSION_TABLE, "rel_1");
+ private static final LocalAliasTable LINK_ALIAS_2 = new LocalAliasTable(RELATION_LINK_VERSION_TABLE, "rel_2");
+ private static final LocalAliasTable LINK_TYPE_ALIAS_1 = new LocalAliasTable(RELATION_LINK_TYPE_TABLE, "rel_type_1");
+ private static final String relationTables = LINK_TYPE_ALIAS_1 + "," + LINK_ALIAS_1 + ", " + TRANSACTIONS_TABLE;
+ private final static String TOKEN = ";";
+ private String[] typeNames;
+ private boolean sideA;
+ private FromArtifactsSearch otherArtifactsCriteria;
+
+ /**
+ * @param typeName The type of relation for the artifact to be in.
+ * @param sideA The side of the relation the artifact should be on.
+ */
+ public InRelationSearch(String typeName, boolean sideA) {
+ this(typeName, sideA, null);
+ }
+
+ /**
+ * Search for an artifact on at least one of several different types of relations. All of the
+ * <code>RelationSide</code>'s must be for the same side, that is all sideB or all sideA. This restriction is in
+ * place to optimize SQL performance.
+ *
+ * @param firstSide
+ * @param sides
+ * @throws IllegalArgumentException if the sides are a mixture of sideA and sideB relation sides.
+ */
+ public InRelationSearch(IRelationEnumeration firstSide, IRelationEnumeration... sides) {
+ this(null, firstSide, sides);
+ }
+
+ /**
+ * Search for an artifact on at least one of several different types of relations. All of the
+ * <code>RelationSide</code>'s must be for the same side, that is all sideB or all sideA. This restriction is in
+ * place to optimize SQL performance.
+ *
+ * @param otherArtifacts
+ * @param firstSide
+ * @param sides
+ * @throws IllegalArgumentException if the sides are a mixture of sideA and sideB relation sides.
+ */
+ public InRelationSearch(FromArtifactsSearch otherArtifacts, IRelationEnumeration firstSide, IRelationEnumeration... sides) {
+ this.typeNames = new String[sides.length + 1];
+ this.sideA = firstSide.isSideA();
+ this.otherArtifactsCriteria = otherArtifacts;
+
+ int count = 0;
+ typeNames[count++] = firstSide.getTypeName();
+ for (IRelationEnumeration side : sides) {
+ if (side.isSideA() != firstSide.isSideA()) throw new IllegalArgumentException(
+ "All links must be for the same side.");
+
+ typeNames[count++] = side.getTypeName();
+ }
+ }
+
+ /**
+ * @param typeName The type of relation for the artifact to be in.
+ * @param sideA The side of the relation the artifact should be on.
+ * @param otherArtifacts The search describing what the related artifacts should be like.
+ */
+ public InRelationSearch(String typeName, boolean sideA, FromArtifactsSearch otherArtifacts) {
+ this(new String[] {typeName}, sideA, otherArtifacts);
+ }
+
+ public InRelationSearch(String[] typeNames, boolean sideA) {
+ this(typeNames, sideA, null);
+ }
+
+ public InRelationSearch(String[] typeNames, boolean sideA, FromArtifactsSearch otherArtifacts) {
+ this.typeNames = typeNames;
+ this.sideA = sideA;
+ this.otherArtifactsCriteria = otherArtifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return (sideA) ? "a_art_id" : "b_art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ StringBuffer sql = new StringBuffer();
+
+ boolean first = true;
+
+ sql.append(LINK_TYPE_ALIAS_1.column("rel_link_type_id") + EQUAL + LINK_ALIAS_1.column("rel_link_type_id"));
+
+ sql.append(" AND ");
+
+ if (typeNames.length > 1) sql.append("(");
+ for (String typeName : typeNames) {
+ if (!first)
+ sql.append(" OR ");
+ else
+ first = false;
+
+ sql.append(LINK_TYPE_ALIAS_1.column("type_name") + "=?");
+ dataList.add(typeName);
+ }
+ if (typeNames.length > 1) sql.append(")");
+
+ if (otherArtifactsCriteria != null) {
+ sql.append(" AND " + LINK_ALIAS_1.column(((!sideA) ? "a_art_id" : "b_art_id")) + " IN (" + ArtifactPersistenceManager.getSelectArtIdSql(
+ otherArtifactsCriteria, dataList, branch) + ")");
+ }
+
+ sql.append(" AND " + LINK_ALIAS_1.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + "(SELECT max(osee_tx_details.transaction_id) FROM " + LINK_ALIAS_2 + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + LINK_ALIAS_2.column("rel_link_id") + "=" + LINK_ALIAS_1.column("rel_link_id") + " AND " + LINK_ALIAS_2.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)" + " AND " + TRANSACTIONS_TABLE.column("mod_type") + "<>?");
+
+ dataList.add(branch.getBranchId());
+ dataList.add(ModificationType.DELETED.getValue());
+
+ return sql.toString();
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return relationTables;
+ }
+
+ public String toString() {
+ return "In Relation: " + typeNames + " from";
+ //"side " + ((sideA)?"A":"B");
+ }
+
+ public String getStorageString() {
+ StringBuffer storage = new StringBuffer();
+
+ storage.append(Boolean.toString(sideA));
+ for (String typeName : typeNames) {
+ storage.append(TOKEN);
+ storage.append(typeName);
+ }
+
+ return storage.toString();
+ }
+
+ public static InRelationSearch getPrimitive(String storageString) {
+ String[] values = storageString.split(TOKEN);
+ if (values.length < 2) throw new IllegalStateException(
+ "Value for " + InRelationSearch.class.getSimpleName() + " not parsable");
+
+ String[] names = new String[values.length - 1];
+ for (int x = 0; x < names.length; x++)
+ names[x] = values[x + 1];
+
+ return new InRelationSearch(names, Boolean.parseBoolean(values[0]), null);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/NotSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/NotSearch.java
new file mode 100644
index 00000000000..18bec271255
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/NotSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_TABLE;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class NotSearch implements ISearchPrimitive {
+ private final ISearchPrimitive search;
+
+ /**
+ * @param search
+ */
+ public NotSearch(ISearchPrimitive search) {
+ super();
+ this.search = search;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getCriteriaSql(java.util.List, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ return "NOT EXISTS(SELECT 'x' FROM (" + ArtifactPersistenceManager.getSelectArtIdSql(search, dataList, branch) + ") arts" + " WHERE " + ARTIFACT_TABLE.column("art_id") + "= arts." + search.getArtIdColName() + ")";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getTableSql(java.util.List)
+ */
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return ARTIFACT_TABLE.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getStorageString()
+ */
+ public String getStorageString() {
+ return "Not [" + search.getStorageString() + "]";
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "Not " + search.toString();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Operator.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Operator.java
new file mode 100644
index 00000000000..354cec2bc57
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/Operator.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.framework.skynet.core.artifact.search;
+
+public enum Operator {
+ EQUAL("="), NOT_EQUAL("<>");
+
+ private String expression;
+
+ /**
+ * @param expression
+ */
+ private Operator(String expression) {
+ this.expression = expression;
+ }
+
+ public String toString() {
+ return expression;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/OrphanArtifactSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/OrphanArtifactSearch.java
new file mode 100644
index 00000000000..372d440c85c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/OrphanArtifactSearch.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.framework.skynet.core.artifact.search;
+
+import java.util.List;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OrphanArtifactSearch implements ISearchPrimitive {
+ private static final String LABEL = "Orphan Search: ";
+ private static final String tables = "osee_artifact";
+ private static final String sql =
+ "osee_artifact.art_type_id =? AND art_id NOT in (SELECT t2.art_id FROM osee_relation_link t1, osee_artifact t2, " + SkynetDatabase.TRANSACTIONS_TABLE + " t4, " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t5, (SELECT Max(t1.gamma_id) AS gamma_id, t1.rel_link_id, t3.branch_id FROM " + SkynetDatabase.RELATION_LINK_VERSION_TABLE + " t1, " + SkynetDatabase.TRANSACTIONS_TABLE + " t2, " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t3 WHERE t1.gamma_id = t2.gamma_id AND t2.transaction_id = t3.transaction_id AND t3.branch_id = ? GROUP BY t1.rel_link_id, t3.branch_id) t6 WHERE t1.rel_link_type_id =? AND t1.b_art_id = t2.art_id AND t1.gamma_id = t4.gamma_id AND t4.transaction_id = t5.transaction_id AND t1.rel_link_id = t6.rel_link_id AND t5.branch_id = t6.branch_id AND t1.gamma_id = t6.gamma_id AND t4.mod_type <> " + ModificationType.DELETED.getValue() + " GROUP BY t2.art_id)";
+ private ArtifactType aritfactType;
+ private int relationTypeId;
+
+ public OrphanArtifactSearch(ArtifactType aritfactType) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ this.aritfactType = aritfactType;
+ this.relationTypeId = RelationTypeManager.getType("Default Hierarchical").getRelationTypeId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getSql(java.util.List, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ dataList.add(aritfactType.getArtTypeId());
+ dataList.add(branch.getBranchId());
+ dataList.add(relationTypeId);
+
+ return sql;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "art_id";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getTables(java.util.List)
+ */
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return tables;
+ }
+
+ @Override
+ public String toString() {
+ return LABEL + aritfactType.getName();
+ }
+
+ public static OrphanArtifactSearch getPrimitive(String storageString) {
+ storageString = storageString.replace(LABEL, "");
+ if (storageString.endsWith(";")) {
+ storageString = storageString.substring(0, storageString.length() - 1);
+ }
+ OrphanArtifactSearch search = null;
+ try {
+ ArtifactType artifactType = ArtifactTypeManager.getType(storageString);
+ search = new OrphanArtifactSearch(artifactType);
+ } catch (OseeCoreException ex) {
+ new IllegalStateException("Value for " + OrphanArtifactSearch.class.getSimpleName() + " not parsable");
+ }
+ return search;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive#getStorageString()
+ */
+ public String getStorageString() {
+ return LABEL + aritfactType.getName() + ";";
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/QueryType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/QueryType.java
new file mode 100644
index 00000000000..1c1c91afdac
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/QueryType.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.framework.skynet.core.artifact.search;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ *
+ */
+public enum QueryType {
+ CHECK, GET;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToAndOfIDSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToAndOfIDSearch.java
new file mode 100644
index 00000000000..f68144e1570
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToAndOfIDSearch.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.framework.skynet.core.artifact.search;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RelatedToAndOfIDSearch implements ISearchPrimitive {
+ private int artId;
+ private int relType;
+
+ /**
+ * @param artId The type of relation for the artifact to be in
+ */
+ public RelatedToAndOfIDSearch(int artId, int relType) {
+ super();
+ this.artId = artId;
+ this.relType = relType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "artLinkJoin.art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getSql() {
+ return "artLinkJoin.rel_link_type_id = " + relType;
+ }
+
+ public String getTables() {
+ return "(SELECT * FROM " + SkynetDatabase.ARTIFACT_TABLE + " INNER JOIN " + SkynetDatabase.RELATION_LINK_VERSION_TABLE + " ON (( b_art_id=" + artId + " AND art_id=a_art_id) or (a_art_id=" + artId + " and art_id = b_art_id))) artLinkJoin";
+ }
+
+ public String toString() {
+ return "Related to art_id: " + artId + " With rel type: " + relType;
+ }
+
+ public static RelatedToAndOfIDSearch getPrimitive(String storageString) {
+ String[] args = storageString.split(",");
+ return new RelatedToAndOfIDSearch(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
+ }
+
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ return null;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return null;
+ }
+
+ public String getStorageString() {
+ return Integer.toString(artId) + "," + Integer.toString(relType);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToSearch.java
new file mode 100644
index 00000000000..58676c157dd
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelatedToSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import java.util.List;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.schema.LocalAliasTable;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RelatedToSearch implements ISearchPrimitive {
+ private static final LocalAliasTable LINK_ALIAS_1 = new LocalAliasTable(RELATION_LINK_VERSION_TABLE, "rel_1");
+ private static final LocalAliasTable LINK_ALIAS_2 = new LocalAliasTable(RELATION_LINK_VERSION_TABLE, "rel_2");
+ private static final String TABLES = LINK_ALIAS_1 + "," + TRANSACTIONS_TABLE;
+ private static final String TOKEN = ";";
+ private final int artId;
+ private final boolean sideA;
+
+ /**
+ * @param artId The type of relation for the artifact to be in
+ * @param sideA True if you want artifacts that are on the A side of the relation from the given artId
+ */
+ public RelatedToSearch(int artId, boolean sideA) {
+ super();
+ this.artId = artId;
+ this.sideA = sideA;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return (sideA ? "a" : "b") + "_art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ String sql =
+ LINK_ALIAS_1.column((sideA ? "b" : "a") + "_art_id") + "=?" + " AND " + LINK_ALIAS_1.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + "(SELECT max(osee_tx_details.transaction_id) FROM " + LINK_ALIAS_2 + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + LINK_ALIAS_2.column("rel_link_id") + "=" + LINK_ALIAS_1.column("rel_link_id") + " AND " + LINK_ALIAS_2.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?)" + " AND " + TRANSACTIONS_TABLE.column("mod_type") + "<>?";
+
+ dataList.add(artId);
+ dataList.add(branch.getBranchId());
+ dataList.add(ModificationType.DELETED.getValue());
+
+ return sql;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ return TABLES;
+ }
+
+ public String toString() {
+ return "Related to art_id: " + artId + " on side: " + (sideA ? "A" : "B");
+ }
+
+ public static RelatedToSearch getPrimitive(String storageString) {
+ String[] values = storageString.split(TOKEN);
+ if (values.length != 2) throw new IllegalStateException(
+ "Value for " + RelatedToSearch.class.getSimpleName() + " not parsable");
+
+ return new RelatedToSearch(Integer.parseInt(values[0]), Boolean.parseBoolean(values[1]));
+ }
+
+ public String getStorageString() {
+ return Integer.toString(artId) + TOKEN + Boolean.toString(sideA);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationCriteria.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationCriteria.java
new file mode 100644
index 00000000000..d924cd0751c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationCriteria.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.framework.skynet.core.artifact.search;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RelationCriteria extends AbstractArtifactSearchCriteria {
+ private final RelationType relationType;
+ private final RelationSide relationSide;
+ private String txsAlias;
+ private String txdAlias;
+ private String relAlias;
+ private int artifactId;
+
+ /**
+ * Constructor for search criteria that follows the relation link ending on the given side
+ *
+ * @param relationEnum the side to start following the link from
+ * @param value
+ * @throws OseeDataStoreException
+ * @throws OseeTypeDoesNotExist
+ */
+ public RelationCriteria(IRelationEnumeration relationEnum) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ this(relationEnum.getRelationType(), relationEnum.getSide());
+ }
+
+ public RelationCriteria(RelationType relationType, RelationSide relationSide) {
+ this(0, relationType, relationSide);
+ }
+
+ public RelationCriteria(int artifactId, RelationType relationType, RelationSide relationSide) {
+ this.artifactId = artifactId;
+ this.relationType = relationType;
+ this.relationSide = relationSide;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria#addToTableSql(org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder)
+ */
+ @Override
+ public void addToTableSql(ArtifactQueryBuilder builder) {
+ relAlias = builder.appendAliasedTable("osee_relation_link");
+ txsAlias = builder.appendAliasedTable("osee_txs");
+ txdAlias = builder.appendAliasedTable("osee_tx_details");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria#addToWhereSql(org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder)
+ */
+ @Override
+ public void addToWhereSql(ArtifactQueryBuilder builder) {
+ if (artifactId > 0) {
+ builder.append(relAlias);
+ builder.append(relationSide.isSideA() ? ".b_art_id" : ".a_art_id");
+ builder.append("=? AND ");
+ builder.addParameter(artifactId);
+ }
+ if (relationType != null) {
+ builder.append(relAlias);
+ builder.append(".rel_link_type_id=? AND ");
+ builder.addParameter(relationType.getRelationTypeId());
+ }
+
+ builder.append(relAlias);
+ builder.append(".gamma_id=");
+ builder.append(txsAlias);
+ builder.append(".gamma_id AND ");
+
+ builder.addTxSql(txsAlias, txdAlias, false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.artifact.search.AbstractArtifactSearchCriteria#addJoinArtId(org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQueryBuilder)
+ */
+ @Override
+ public void addJoinArtId(ArtifactQueryBuilder builder, boolean left) {
+ boolean useArtA = (relationSide == RelationSide.SIDE_A) ^ left;
+ builder.append(relAlias);
+ builder.append(useArtA ? ".a_art_id" : ".b_art_id");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationInTransactionSearch.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationInTransactionSearch.java
new file mode 100644
index 00000000000..2e5731af19c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/search/RelationInTransactionSearch.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.framework.skynet.core.artifact.search;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RelationInTransactionSearch implements ISearchPrimitive {
+ private Integer fromTransactionNumber;
+ private Integer toTransactionNumber;
+ private Integer branchId;
+ private static final String sql = "";
+ private static final String TOKEN = ";";
+
+ public RelationInTransactionSearch(TransactionId transactionId) {
+ this(transactionId, transactionId);
+ }
+
+ public RelationInTransactionSearch(TransactionId fromTransactionId, TransactionId toTransactionId) {
+ if (!fromTransactionId.getBranch().equals(toTransactionId.getBranch())) throw new IllegalArgumentException(
+ "The fromTransactionId and toTransactionId must be on the same branch");
+ if (fromTransactionId.getTransactionNumber() > toTransactionId.getTransactionNumber()) throw new IllegalArgumentException(
+ "The fromTransactionId can not be greater than the toTransactionId.");
+
+ this.fromTransactionNumber = fromTransactionId.getTransactionNumber();
+ this.toTransactionNumber = toTransactionId.getTransactionNumber();
+ this.branchId = fromTransactionId.getBranchId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.artifact.search.ISearchPrimitive#getArtIdColName()
+ */
+ public String getArtIdColName() {
+ return "t1.art_id";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.search.ISearchPrimitive#getSql()
+ */
+ public String getCriteriaSql(List<Object> dataList, Branch branch) {
+ return sql;
+ }
+
+ public String getTableSql(List<Object> dataList, Branch branch) {
+ String transactionCheck =
+ fromTransactionNumber.equals(toTransactionNumber) ? TRANSACTIONS_TABLE.column("transaction_id") + " = ?" : TRANSACTIONS_TABLE.column("transaction_id") + " > ? " + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + " <= ?";
+ String tables =
+ "(SELECT " + RELATION_LINK_VERSION_TABLE.columns("a_art_id") + " AS art_id " + " FROM " + RELATION_LINK_VERSION_TABLE + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + transactionCheck + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?" + " UNION ALL SELECT " + RELATION_LINK_VERSION_TABLE.columns("b_art_id") + " AS art_id " + " FROM " + RELATION_LINK_VERSION_TABLE + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + "=" + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + transactionCheck + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?" + ") t1";
+ if (!fromTransactionNumber.equals(toTransactionNumber)) {
+ dataList.add(fromTransactionNumber);
+ }
+ dataList.add(toTransactionNumber);
+ dataList.add(branchId);
+ if (!fromTransactionNumber.equals(toTransactionNumber)) {
+ dataList.add(fromTransactionNumber);
+ }
+ dataList.add(toTransactionNumber);
+ dataList.add(branchId);
+
+ return tables;
+ }
+
+ @Override
+ public String toString() {
+ if (fromTransactionNumber.equals(toTransactionNumber))
+ return "Transaction Number: " + toTransactionNumber;
+ else
+ return "Transactions: " + fromTransactionNumber + " to " + toTransactionNumber;
+ }
+
+ public static RelationInTransactionSearch getPrimitive(String storageString) throws NumberFormatException, OseeCoreException {
+ String[] values = storageString.split(TOKEN);
+ if (values.length != 2) throw new IllegalArgumentException("Unable to parse the storage string:" + storageString);
+
+ return new RelationInTransactionSearch(TransactionIdManager.getTransactionId(Integer.parseInt(values[0])),
+ TransactionIdManager.getTransactionId(Integer.parseInt(values[1])));
+ }
+
+ public String getStorageString() {
+ return fromTransactionNumber + TOKEN + toTransactionNumber;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/ConflictResolverOperation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/ConflictResolverOperation.java
new file mode 100644
index 00000000000..9fe1a55c514
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/ConflictResolverOperation.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.framework.skynet.core.artifact.update;
+
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class ConflictResolverOperation extends AbstractOperation {
+
+ private ConflictManagerExternal conflictManager;
+
+ public ConflictResolverOperation(String operationName, String pluginId) {
+ super(operationName, pluginId);
+ this.conflictManager = null;
+ }
+
+ public void setConflictManager(ConflictManagerExternal conflictManager) {
+ this.conflictManager = conflictManager;
+ }
+
+ public ConflictManagerExternal getConflictManager() {
+ return this.conflictManager;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/RebaselineDbTransaction.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/RebaselineDbTransaction.java
new file mode 100644
index 00000000000..a1387ecddda
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/RebaselineDbTransaction.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.framework.skynet.core.artifact.update;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class RebaselineDbTransaction extends DbTransaction{
+ private UpdateArtifactHandler updateArtifactHandler;
+ private Branch branchToUpdate;
+ private List<Artifact> artifactVersions;
+
+ /**
+ * @throws OseeCoreException
+ */
+ public RebaselineDbTransaction(Branch branchToUpdate, Branch updatingSourceBranch, List<Artifact> artifactVersions) throws OseeCoreException {
+ super();
+
+ this.branchToUpdate = branchToUpdate;
+ this.artifactVersions = artifactVersions;
+ int transactionNumber = TransactionIdManager.getStartEndPoint(branchToUpdate).getKey().getTransactionNumber();
+ this.updateArtifactHandler = new UpdateArtifactHandler(branchToUpdate, updatingSourceBranch, artifactVersions, transactionNumber, true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.DbTransaction#handleTxWork(org.eclipse.osee.framework.db.connection.OseeConnection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ updateArtifactHandler.update(connection);
+ }
+
+ private void updateSystemCaches(Branch branchToUpdate, List<Artifact> artifactVersions) throws OseeCoreException {
+ for (Artifact artifact : artifactVersions) {
+ Artifact droppedArtifact = ArtifactCache.getActive(artifact.getArtId(), branchToUpdate);
+ Artifact parent = null;
+
+ //In case the artifact was new to the branch load him as a new artifact
+ if (droppedArtifact == null) {
+ droppedArtifact = ArtifactQuery.getArtifactFromId(artifact.getArtId(), branchToUpdate);
+ }
+
+ if (droppedArtifact != null) {
+ parent = droppedArtifact.getParent();
+ }
+
+ if (droppedArtifact != null) {
+ droppedArtifact.reloadAttributesAndRelations();
+
+ if (parent != null) {
+ parent.reloadAttributesAndRelations();
+ }
+ OseeEventManager.kickArtifactModifiedEvent(RebaselineDbTransaction.class, ArtifactModType.Reverted,
+ droppedArtifact);
+
+ if(parent != null){
+ OseeEventManager.kickArtifactModifiedEvent(RebaselineDbTransaction.class, ArtifactModType.Changed, parent);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.DbTransaction#handleTxFinally()
+ */
+ @Override
+ protected void handleTxFinally() throws OseeCoreException {
+ updateSystemCaches(branchToUpdate, artifactVersions);
+
+ super.handleTxFinally();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/UpdateArtifactHandler.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/UpdateArtifactHandler.java
new file mode 100644
index 00000000000..10e6688fcfe
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/update/UpdateArtifactHandler.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.framework.skynet.core.artifact.update;
+
+import java.sql.Timestamp;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Theron Virgin
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ */
+public class UpdateArtifactHandler {
+ private static final String POPULATE_ARTIFACT_VERSION_GAMMAS_FOR_UPDATES =
+ "INSERT INTO osee_join_transaction (insert_time, transaction_id, gamma_id, query_id) (Select ?, tx1.transaction_id, tx1.gamma_id, ? FROM osee_txs tx1, osee_tx_details td1, osee_artifact_version av1, osee_join_artifact ja1 WHERE td1.branch_id = ? AND td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = av1.gamma_id AND av1.art_id = ja1.art_id AND ja1.branch_id = ? AND ja1.query_id = ?)";
+ private static final String POPULATE_ATTRIBUTE_GAMMAS_FOR_UPDATES =
+ "INSERT INTO osee_join_transaction (insert_time, transaction_id, gamma_id, query_id) (Select ?, tx2.transaction_id, tx2.gamma_id, ? FROM osee_txs tx2, osee_tx_details td2, osee_attribute at2, osee_join_artifact ja2 WHERE td2.branch_id = ? AND td2.transaction_id = tx2.transaction_id AND tx2.gamma_id = at2.gamma_id AND at2.art_id = ja2.art_id AND ja2.branch_id = ? AND ja2.query_id = ?)";
+ private static final String POPULATE_RELATION_GAMMAS_FOR_UPDATES =
+ "INSERT INTO osee_join_transaction (insert_time, transaction_id, gamma_id, query_id) (Select ?, tx3.transaction_id, tx3.gamma_id, ? FROM osee_txs tx3, osee_tx_details td3, osee_relation_link rl3, osee_join_artifact ja3 WHERE td3.branch_id = ? AND td3.transaction_id = tx3.transaction_id AND tx3.gamma_id = rl3.gamma_id AND (rl3.a_art_id = ja3.art_id OR rl3.b_art_id = ja3.art_id) AND ja3.branch_id = ? AND ja3.query_id = ?)";
+
+ private static final String UPDATE_REVERT_TABLE =
+ "INSERT INTO osee_removed_txs (transaction_id, rem_mod_type, rem_tx_current, rem_transaction_id, rem_gamma_id) (SELECT DISTINCT ?, txs.mod_type, txs.tx_current, txs.transaction_id, txs.gamma_id FROM osee_txs txs, osee_join_transaction trn1 WHERE txs.gamma_id = trn1.gamma_id AND txs.transaction_id = trn1.transaction_id AND trn1.query_id = ? AND NOT EXISTS (Select 'x' from osee_removed_txs rmt1 WHERE rmt1.rem_transaction_id = txs.transaction_id AND txs.gamma_id = rmt1.rem_gamma_id))";
+ private static final String DELETE_FROM_TXS_TABLE =
+ "DELETE FROM osee_txs where (transaction_id, gamma_id) in (SELECT transaction_id, gamma_id FROM osee_join_transaction WHERE query_id = ?)";
+
+ private static final String INSERT_UPDATED_ARTIFACTS =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, tx1.gamma_id, " + ModificationType.NEW.getValue() + ", tx1.tx_current FROM osee_txs tx1, osee_tx_details td1, osee_artifact_version av1, osee_join_artifact ja1 WHERE td1.branch_id = ? AND td1.transaction_id = tx1.transaction_id AND tx1.tx_current = " + TxChange.CURRENT.getValue() + " AND tx1.gamma_id = av1.gamma_id AND td1.branch_id = ja1.branch_id AND av1.art_id = ja1.art_id AND ja1.query_id = ?";
+ private static final String INSERT_UPDATED_ATTRIBUTES_GAMMAS =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, tx1.gamma_id, " + ModificationType.NEW.getValue() + ", tx1.tx_current FROM osee_txs tx1, osee_tx_details td1, osee_attribute at1, osee_join_artifact ja1 WHERE td1.branch_id = ? AND td1.transaction_id = tx1.transaction_id AND tx1.tx_current = " + TxChange.CURRENT.getValue() + " AND tx1.gamma_id = at1.gamma_id AND td1.branch_id = ja1.branch_id AND at1.art_id = ja1.art_id AND ja1.query_id = ?";
+ private static final String INSERT_UPDATED_LINKS_GAMMAS =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT DISTINCT ?, tx1.gamma_id, " + ModificationType.NEW.getValue() + ", tx1.tx_current FROM osee_txs tx1, osee_tx_details td1, osee_relation_link rl1, osee_join_artifact ja1 WHERE td1.branch_id = ? AND td1.transaction_id = tx1.transaction_id AND tx1.tx_current = " + TxChange.CURRENT.getValue() + " AND tx1.gamma_id = rl1.gamma_id AND td1.branch_id = ja1.branch_id AND (rl1.a_art_id = ja1.art_id OR rl1.b_art_id = ja1.art_id) AND ja1.query_id = ?";
+ private static final String DELETE_FROM_JOIN_TRANSACTION = "DELETE FROM osee_join_transaction WHERE query_id = ?";
+
+ private Branch branchToUpdate;
+ Branch updatingSourceBranch;
+ private List<Artifact> artifactVersions;
+ private int transactionNumber;
+ private boolean loadRelations;
+
+ public UpdateArtifactHandler(Branch branchToUpdate, Branch updatingSourceBranch, List<Artifact> artifactVersions, int transactionNumber, boolean loadRelations) {
+ super();
+ this.branchToUpdate = branchToUpdate;
+ this.updatingSourceBranch = updatingSourceBranch;
+ this.artifactVersions = artifactVersions;
+ this.transactionNumber = transactionNumber;
+ this.loadRelations = loadRelations;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void update(OseeConnection connection) throws OseeCoreException {
+ if (updatingSourceBranch == null) {
+ if (!artifactVersions.isEmpty()) {
+ updatingSourceBranch = artifactVersions.get(0).getBranch();
+ } else {
+ throw new OseeCoreException("Source Branch could not be identified for Artifact Update");
+ }
+ }
+
+ int queryIdForBranchInfo = ArtifactLoader.getNewQueryId();
+ int queryIdForTransGammaIds = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+
+ try {
+ // insert into the artifact_join_table
+ for (Artifact artifact : artifactVersions) {
+ insertParameters.add(new Object[] {queryIdForBranchInfo, insertTime, artifact.getArtId(),
+ updatingSourceBranch.getBranchId(), SQL3DataType.INTEGER});
+ try {
+ Artifact sourceArtifact = ArtifactQuery.getArtifactFromId(artifact.getArtId(), branchToUpdate);
+ ArtifactPersistenceManager.revertArtifact(connection, sourceArtifact);
+ } catch (ArtifactDoesNotExist ex) {
+ //Artifact does not need to be reverted if it does not exist.
+ }
+ }
+
+ ArtifactLoader.insertIntoArtifactJoin(connection, insertParameters);
+
+ runSqlCalls(branchToUpdate, updatingSourceBranch, loadRelations, transactionNumber, queryIdForBranchInfo,
+ queryIdForTransGammaIds, connection);
+
+ } finally {
+ ArtifactLoader.clearQuery(connection, queryIdForBranchInfo);
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_JOIN_TRANSACTION, queryIdForTransGammaIds);
+ }
+ }
+
+ private static void runSqlCalls(Branch branchToUpdate, Branch updatingSourceBranch, boolean loadRelations, int transactionNumber, int queryIdForBranchInfo, int queryIdForTransGammaIds, OseeConnection connection) throws OseeCoreException {
+ Timestamp timestamp = GlobalTime.GreenwichMeanTimestamp();
+ TransactionId transId = TransactionIdManager.createNextTransactionId(branchToUpdate, UserManager.getUser(), "");
+
+ int count =
+ ConnectionHandler.runPreparedUpdate(connection, POPULATE_ARTIFACT_VERSION_GAMMAS_FOR_UPDATES, timestamp,
+ queryIdForTransGammaIds, branchToUpdate.getBranchId(), updatingSourceBranch.getBranchId(),
+ queryIdForBranchInfo);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO,
+ "populated " + count + " Artifact Version gammas into the join table");
+ count =
+ ConnectionHandler.runPreparedUpdate(connection, POPULATE_ATTRIBUTE_GAMMAS_FOR_UPDATES, timestamp,
+ queryIdForTransGammaIds, branchToUpdate.getBranchId(), updatingSourceBranch.getBranchId(),
+ queryIdForBranchInfo);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO,
+ "populated " + count + " Attribute gammas into the join table");
+
+ if (loadRelations) {
+ count =
+ ConnectionHandler.runPreparedUpdate(connection, POPULATE_RELATION_GAMMAS_FOR_UPDATES, timestamp,
+ queryIdForTransGammaIds, branchToUpdate.getBranchId(), updatingSourceBranch.getBranchId(),
+ queryIdForBranchInfo);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO,
+ "populated " + count + " Relation gammas into the join table");
+ }
+
+ count =
+ ConnectionHandler.runPreparedUpdate(connection, UPDATE_REVERT_TABLE, transId.getTransactionNumber(),
+ queryIdForTransGammaIds);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO, "inserted " + count + " old gammas into the Revert Table");
+
+ count = ConnectionHandler.runPreparedUpdate(connection, DELETE_FROM_TXS_TABLE, queryIdForTransGammaIds);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO, "Deleted " + count + " old gammas from the TXS Table");
+
+ count =
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_UPDATED_ARTIFACTS, transactionNumber,
+ updatingSourceBranch.getBranchId(), queryIdForBranchInfo);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO, "inserted " + count + " artifacts");
+
+ count =
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_UPDATED_ATTRIBUTES_GAMMAS, transactionNumber,
+ updatingSourceBranch.getBranchId(), queryIdForBranchInfo);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO, "inserted " + count + " attributes");
+
+ if (loadRelations) {
+ count =
+ ConnectionHandler.runPreparedUpdate(connection, INSERT_UPDATED_LINKS_GAMMAS, transactionNumber,
+ updatingSourceBranch.getBranchId(), queryIdForBranchInfo);
+ OseeLog.log(UpdateArtifactHandler.class, Level.INFO, "inserted " + count + " relations");
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/Attribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/Attribute.java
new file mode 100644
index 00000000000..ab4efc79542
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/Attribute.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactChecks;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.IArtifactCheck;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class Attribute<T> {
+ private final AttributeType attributeType;
+ private final Artifact artifact;
+ private IAttributeDataProvider attributeDataProvider;
+ private int attrId;
+ private int gammaId;
+ private boolean dirty;
+ private ModificationType modificationType;
+
+ protected Attribute(AttributeType attributeType, Artifact artifact) {
+ this.attributeType = attributeType;
+ this.artifact = artifact;
+ }
+
+ public void setValue(T value) throws OseeCoreException {
+ if (attributeType.getName().equals("Name") && !value.equals(getValue())) {
+ // Confirm artifact is fit to rename
+ for (IArtifactCheck check : ArtifactChecks.getArtifactChecks()) {
+ IStatus result = check.isRenamable(Arrays.asList(artifact));
+ if (!result.isOK()) {
+ throw new OseeCoreException(result.getMessage());
+ }
+ }
+ }
+
+ if (subClassSetValue(value)) {
+ setDirty();
+ }
+ }
+
+ public boolean setFromString(String value) throws OseeCoreException {
+ if (attributeType.getName().equals("Name") && !value.equals(getValue())) {
+ // Confirm artifact is fit to rename
+ for (IArtifactCheck check : ArtifactChecks.getArtifactChecks()) {
+ IStatus result = check.isRenamable(Arrays.asList(artifact));
+ if (!result.isOK()) {
+ throw new OseeCoreException(result.getMessage());
+ }
+ }
+ }
+
+ boolean response = subClassSetValue(convertStringToValue(value));
+ if (response) {
+ setDirty();
+ }
+ return response;
+ }
+
+ protected abstract T convertStringToValue(String value) throws OseeCoreException;
+
+ public final void initializeToDefaultValue() throws OseeCoreException {
+ setDirty(); // always do this since this is only called when creating an attribute so it should be dirty anyway
+ String defaultValue = getAttributeType().getDefaultValue();
+ if (defaultValue != null) {
+ subClassSetValue(convertStringToValue(defaultValue));
+ }
+ }
+
+ public boolean setValueFromInputStream(InputStream value) throws OseeCoreException {
+ try {
+ boolean response = setFromString(Lib.inputStreamToString(value));
+ if (response) {
+ setDirty();
+ }
+ return response;
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /**
+ * Subclasses must provide an implementation of this method and in general should not override the other set value
+ * methods
+ *
+ * @param value
+ * @throws OseeCoreException
+ */
+ protected abstract boolean subClassSetValue(T value) throws OseeCoreException;
+
+ public abstract T getValue() throws OseeCoreException;
+
+ public String getDisplayableString() throws OseeCoreException {
+ return getAttributeDataProvider().getDisplayableString();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ try {
+ builder.append(getDisplayableString());
+ } catch (OseeCoreException ex) {
+ builder.append(Lib.exceptionToString(ex));
+ }
+ return builder.toString();
+ }
+
+ /**
+ * @param attributeDataProvider the attributeDataProvider to set
+ * @throws OseeCoreException
+ */
+ public void setAttributeDataProvider(IAttributeDataProvider attributeDataProvider) throws OseeCoreException {
+ this.attributeDataProvider = attributeDataProvider;
+ }
+
+ public IAttributeDataProvider getAttributeDataProvider() {
+ return attributeDataProvider;
+ }
+
+ /**
+ * @return <b>true</b> if this attribute is dirty
+ */
+ public boolean isDirty() {
+ return dirty;
+ }
+
+ protected void setDirty() {
+ dirty = true;
+
+ // Kick Local Event
+ try {
+ OseeEventManager.kickArtifactModifiedEvent(this, ArtifactModType.Changed, artifact);
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+
+ public void setNotDirty() {
+ dirty = false;
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ /**
+ * @return the attribute name/value description
+ */
+ public String getNameValueDescription() {
+ return attributeType.getName() + ": " + toString();
+ }
+
+ /**
+ * @return attributeType Attribute Type Information
+ */
+ public AttributeType getAttributeType() {
+ return attributeType;
+ }
+
+ /**
+ * Currently this method provides support for quasi attribute type inheritance
+ *
+ * @param artifactType
+ * @return whether this attribute's type or any of its super-types are the specified type
+ */
+ public boolean isOfType(String otherAttributeTypeName) {
+ String attributeTypeName = attributeType.getName();
+ return attributeTypeName.equals(otherAttributeTypeName);
+ }
+
+ /**
+ * Currently this method provides support for quasi attribute type inheritance
+ *
+ * @param artifactType
+ * @return whether this attribute's type or any of its super-types are the specified type
+ */
+ public boolean isOfType(AttributeType otherAttributeType) {
+ return attributeType.equals(otherAttributeType);
+ }
+
+ public void resetModType() {
+ this.modificationType = null;
+ }
+
+ /**
+ * Deletes the attribute
+ */
+ public final void setArtifactDeleted() {
+ setDeleteOrArtifactDeleted(ModificationType.ARTIFACT_DELETED);
+ }
+
+ /**
+ * Deletes the attribute
+ */
+ public final void delete() {
+ setDeleteOrArtifactDeleted(ModificationType.DELETED);
+ }
+
+ private final void setDeleteOrArtifactDeleted(ModificationType modificationType) {
+ this.modificationType = modificationType;
+ setDirty();
+ }
+
+ /**
+ * @return the modificationType Warning ... This is only currently being set for delete and artifact deleted.
+ */
+ public ModificationType getModificationType() {
+ return modificationType;
+ }
+
+ public boolean canDelete() {
+ try {
+ return artifact.getAttributeCount(attributeType.getName()) > attributeType.getMinOccurrences();
+ } catch (OseeCoreException ex) {
+ return false;
+ }
+ }
+
+ /**
+ * Purges the attribute from the database.
+ */
+ public void purge() throws OseeCoreException {
+ getAttributeDataProvider().purge();
+ }
+
+ public void markAsPurged() {
+ modificationType = ModificationType.DELETED;
+ dirty = false;
+ }
+
+ /**
+ * @return true if in data store
+ */
+ public boolean isInDb() {
+ return getGammaId() > 0;
+ }
+
+ /**
+ * @return Returns the attrId.
+ */
+ public int getAttrId() {
+ return attrId;
+ }
+
+ public int getGammaId() {
+ return gammaId;
+ }
+
+ public void internalSetGammaId(int gammaId) {
+ this.gammaId = gammaId;
+ }
+
+ public void internalSetAttributeId(int attrId) {
+ this.attrId = attrId;
+ }
+
+ /**
+ * @return the deleted
+ */
+ public boolean isDeleted() {
+ return this.modificationType == ModificationType.DELETED || this.modificationType == ModificationType.ARTIFACT_DELETED;
+ }
+
+ /**
+ * Called from remote events to mark this attribute as deleted
+ */
+ public void internalSetDeleted() {
+ this.modificationType = ModificationType.DELETED;
+ this.dirty = false;
+ }
+
+ public void revert() throws OseeCoreException {
+ DbTransaction dbTransaction = new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ ArtifactPersistenceManager.revertAttribute(connection, Attribute.this);
+ }
+ };
+ dbTransaction.execute();
+ }
+
+ public static Attribute<?> initializeAttribute(Artifact artifact, int atttributeTypeId, int attributeId, int gammaId, Object... data) throws OseeCoreException {
+ return initializeAttribute(artifact, atttributeTypeId, attributeId, gammaId, null, false, data);
+ }
+
+ public static Attribute<?> initializeAttribute(Artifact artifact, int atttributeTypeId, int attributeId, int gammaId, ModificationType modificationType, boolean markDirty, Object... data) throws OseeCoreException {
+ AttributeType attributeType = AttributeTypeManager.getType(atttributeTypeId);
+ Attribute<?> attribute = artifact.createAttribute(attributeType, false);
+ attribute.getAttributeDataProvider().loadData(data);
+ attribute.internalSetAttributeId(attributeId);
+ attribute.internalSetGammaId(gammaId);
+
+ if (modificationType == ModificationType.DELETED) {
+ attribute.internalSetDeleted();
+ }
+
+ attribute.dirty = markDirty;
+ return attribute;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeExtensionManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeExtensionManager.java
new file mode 100644
index 00000000000..f1c06586722
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeExtensionManager.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.framework.skynet.core.attribute;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.AbstractAttributeDataProvider;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeExtensionManager {
+ private static final String CLASS_ID = "class";
+ private static final String ATTRIBUTE_TYPE = Activator.PLUGIN_ID + ".AttributeType";
+ private static final String ATTRIBUTE_DATA_PROVIDER_TYPE = Activator.PLUGIN_ID + ".AttributeDataProvider";
+
+ private static final String[] attributeBaseTypes =
+ new String[] {"CharacterBackedAttributeType", "BinaryBackedAttributeType"};
+ private static final String[] attributeProviderBaseTypes =
+ new String[] {"CharacterAttributeDataProvider", "BinaryAttributeDataProvider"};
+
+ private static final AttributeExtensionManager instance = new AttributeExtensionManager();
+
+ private Map<String, Pair<String, String>> attributeTypeClasses;
+ private Map<String, Pair<String, String>> attributeDataProviderClasses;
+
+ private AttributeExtensionManager() {
+ this.attributeTypeClasses = null;
+ this.attributeDataProviderClasses = null;
+ }
+
+ public static Class<? extends Attribute<?>> getAttributeClassFor(String name) throws OseeCoreException {
+ if (instance.attributeTypeClasses == null) {
+ instance.attributeTypeClasses = instance.loadExtensions(ATTRIBUTE_TYPE, attributeBaseTypes, CLASS_ID);
+ }
+
+ Pair<String, String> entry = instance.attributeTypeClasses.get(name);
+ if (entry == null) {
+ throw new OseeArgumentException(String.format("Unable to find class for: [%s]", name));
+ }
+
+ return instance.loadClass(entry.getKey(), entry.getValue());
+ }
+
+ public static Class<? extends AbstractAttributeDataProvider> getAttributeProviderClassFor(String name) throws OseeCoreException {
+ if (instance.attributeDataProviderClasses == null) {
+ instance.attributeDataProviderClasses =
+ instance.loadExtensions(ATTRIBUTE_DATA_PROVIDER_TYPE, attributeProviderBaseTypes, CLASS_ID);
+ }
+ Pair<String, String> entry = instance.attributeDataProviderClasses.get(name);
+ if (entry == null) {
+ throw new OseeArgumentException(String.format("Unable to find class for: [%s]", name));
+ }
+ return instance.loadClass(entry.getKey(), entry.getValue());
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> Class<T> loadClass(String bundleName, String className) throws OseeWrappedException {
+ Class<T> toReturn = null;
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ toReturn = bundle.loadClass(className);
+ } catch (ClassNotFoundException ex) {
+ throw new OseeWrappedException(String.format("Unable to Load: [%s - %s]", bundleName, className), ex);
+ }
+ return toReturn;
+ }
+
+ private Map<String, Pair<String, String>> loadExtensions(String extensionPointId, String[] elementNames, String classNameAttribute) throws OseeStateException {
+ Map<String, Pair<String, String>> toReturn = new HashMap<String, Pair<String, String>>();
+ for (String elementName : elementNames) {
+ List<IConfigurationElement> elements = ExtensionPoints.getExtensionElements(extensionPointId, elementName);
+ for (IConfigurationElement element : elements) {
+ IExtension extension = ((IExtension) element.getParent());
+ String name = extension.getUniqueIdentifier();
+ String className = element.getAttribute(classNameAttribute);
+ String bundleName = element.getContributor().getName();
+
+ if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ toReturn.put(name, new Pair<String, String>(bundleName, className));
+ }
+ }
+ }
+ if (toReturn.size() == 0) {
+ throw new OseeStateException(String.format(
+ "No Objects loaded for [%s] with element names [%s] and attribute [%s]", extensionPointId, elementNames,
+ classNameAttribute));
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return super.toString();
+ }
+
+ public static Set<String> getAttributeProviders() throws OseeStateException {
+ if (instance.attributeDataProviderClasses == null) {
+ instance.attributeDataProviderClasses =
+ instance.loadExtensions(ATTRIBUTE_DATA_PROVIDER_TYPE, attributeProviderBaseTypes, CLASS_ID);
+ }
+ return instance.attributeDataProviderClasses.keySet();
+ }
+
+ public static Set<String> getAttributeClasses() throws OseeStateException {
+ if (instance.attributeTypeClasses == null) {
+ instance.attributeTypeClasses = instance.loadExtensions(ATTRIBUTE_TYPE, attributeBaseTypes, CLASS_ID);
+ }
+ return instance.attributeTypeClasses.keySet();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeResourceProcessor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeResourceProcessor.java
new file mode 100644
index 00000000000..eb220b15553
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeResourceProcessor.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.framework.skynet.core.attribute;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.DataStore;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.AbstractResourceProcessor;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.AttributeURL;
+
+public class AttributeResourceProcessor extends AbstractResourceProcessor {
+
+ private final Attribute<?> attribute;
+
+ public AttributeResourceProcessor(Attribute<?> attribute) {
+ this.attribute = attribute;
+ }
+
+ protected URL getAcquireURL(DataStore dataToStore) throws OseeDataStoreException {
+ return AttributeURL.getAcquireURL(dataToStore.getLocator());
+ }
+
+ protected URL getDeleteURL(DataStore dataToStore) throws OseeDataStoreException {
+ return AttributeURL.getDeleteURL(dataToStore.getLocator());
+ }
+
+ protected URL getStorageURL(int seed, String name, String extension) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ try {
+ return AttributeURL.getStorageURL(seed, name, extension);
+ } catch (MalformedURLException ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.utils.AbstractResourceProcessor#getStorageName()
+ */
+ @Override
+ public String getStorageName() {
+ return attribute.getArtifact().getHumanReadableId();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTransactionData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTransactionData.java
new file mode 100644
index 00000000000..fbbdbcfc480
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTransactionData.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.AttributeURL;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactTransactionModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Roberto E. Escobar
+ */
+public class AttributeTransactionData extends BaseTransactionData {
+ private static final String INSERT_ATTRIBUTE =
+ "INSERT INTO osee_attribute (art_id, attr_id, attr_type_id, value, gamma_id, uri, modification_id) VALUES (?, ?, ?, ?, ?, ?, ?)";
+
+ private final Attribute<?> attribute;
+ private final DAOToSQL daoToSql;
+
+ public AttributeTransactionData(Attribute<?> attribute, ModificationType modificationType) throws OseeDataStoreException {
+ super(attribute.getAttrId(), modificationType, attribute.getArtifact().isReflected() || modificationType == ModificationType.ARTIFACT_DELETED);
+ this.attribute = attribute;
+ this.daoToSql = new DAOToSQL();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.ITransactionData#getSelectTxNotCurrentSql()
+ */
+ @Override
+ public String getSelectTxNotCurrentSql() {
+ return OseeSql.Transaction.SELECT_PREVIOUS_TX_NOT_CURRENT_ATTRIBUTES;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#addInsertToBatch(org.eclipse.osee.framework.jdk.core.type.HashCollection)
+ */
+ @Override
+ protected void addInsertToBatch(SkynetTransaction transaction) throws OseeCoreException {
+ super.addInsertToBatch(transaction);
+ if (!useExistingBackingData()) {
+ if (getModificationType() == ModificationType.MODIFIED || getModificationType() == ModificationType.NEW) {
+ attribute.getAttributeDataProvider().persist(getGammaId());
+ daoToSql.setData(attribute.getAttributeDataProvider().getData());
+ }
+ internalAddInsertToBatch(transaction, 3, INSERT_ATTRIBUTE, attribute.getArtifact().getArtId(), getItemId(),
+ attribute.getAttributeType().getAttrTypeId(), daoToSql.getValue(), getGammaId(), daoToSql.getUri(),
+ getModificationType().getValue());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalUpdate()
+ */
+ @Override
+ protected void internalUpdate(TransactionId transactionId) throws OseeCoreException {
+ attribute.internalSetGammaId(getGammaId());
+
+ if (attribute.isOfType(StaticIdManager.STATIC_ID_ATTRIBUTE)) {
+ ArtifactCache.cacheByStaticId((String) attribute.getValue(), attribute.getArtifact());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalClearDirtyState()
+ */
+ @Override
+ protected void internalClearDirtyState() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalOnRollBack()
+ */
+ @Override
+ protected void internalOnRollBack() throws OseeCoreException {
+ if (Strings.isValid(daoToSql.getUri())) {
+ try {
+ HttpProcessor.delete(AttributeURL.getDeleteURL(daoToSql.getUri()));
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#createGammaId()
+ */
+ @Override
+ protected int createGammaId() throws OseeCoreException {
+ int newGammaId = 0;
+ if (useExistingBackingData()) {
+ newGammaId = attribute.getGammaId();
+ } else {
+ newGammaId = SequenceManager.getNextGammaId();
+ }
+ return newGammaId;
+ }
+
+ private final class DAOToSQL {
+ private String uri;
+ private String value;
+
+ public DAOToSQL(Object... data) {
+ if (data != null) {
+ setData(data);
+ } else {
+ uri = null;
+ value = null;
+ }
+ }
+
+ public void setData(Object... data) {
+ this.uri = getItemAt(1, data);
+ this.value = getItemAt(0, data);
+ }
+
+ private String getItemAt(int index, Object... data) {
+ String toReturn = null;
+ if (data != null && data.length > index) {
+ Object obj = data[index];
+ if (obj != null) {
+ toReturn = obj.toString();
+ }
+ }
+ return toReturn;
+ }
+
+ public String getUri() {
+ return uri != null ? uri : "";
+ }
+
+ public String getValue() {
+ return value != null ? value : "";
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalAsModifiedEvent(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ protected void internalAddToEvents(Collection<ArtifactTransactionModifiedEvent> events) throws OseeCoreException {
+ // Do Nothing - handled by artifact transaction data
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeType.java
new file mode 100644
index 00000000000..80aff842a69
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeType.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider;
+
+/**
+ * Type information for dynamic attributes.
+ *
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class AttributeType implements Comparable<AttributeType> {
+ public static final AttributeType[] EMPTY_ARRAY = new AttributeType[0];
+ private Class<? extends Attribute<?>> baseAttributeClass;
+ private Class<? extends IAttributeDataProvider> providerAttributeClass;
+ private int attrTypeId;
+ private String namespace;
+ private String name;
+ private String defaultValue;
+ private int oseeEnumTypeId;
+ private int maxOccurrences;
+ private int minOccurrences;
+ private String tipText;
+ private String fileTypeExtension;
+ private String taggerId;
+
+ /**
+ * Create a dynamic attribute descriptor. Descriptors can be acquired for application use from the
+ * <code>ConfigurationPersistenceManager</code>.
+ *
+ * @param baseAttributeClass
+ * @param name
+ * @param defaultValue
+ * @param validityXml
+ * @param minOccurrences
+ * @param maxOccurrences
+ * @param tipText
+ */
+ protected AttributeType(int attrTypeId, Class<? extends Attribute<?>> baseAttributeClass, Class<? extends IAttributeDataProvider> providerAttributeClass, String fileTypeExtension, String namespace, String name, String defaultValue, int oseeEnumTypeId, int minOccurrences, int maxOccurrences, String tipText, String taggerId) {
+ if (minOccurrences < 0) {
+ throw new IllegalArgumentException("minOccurrences must be greater than or equal to zero");
+ }
+ if (maxOccurrences < minOccurrences) {
+ throw new IllegalArgumentException("maxOccurences can not be less than minOccurences");
+ }
+
+ this.attrTypeId = attrTypeId;
+ this.baseAttributeClass = baseAttributeClass;
+ this.providerAttributeClass = providerAttributeClass;
+ this.namespace = namespace == null ? "" : namespace;
+ this.name = name;
+ this.defaultValue = defaultValue;
+ this.oseeEnumTypeId = oseeEnumTypeId;
+ this.maxOccurrences = maxOccurrences;
+ this.minOccurrences = minOccurrences;
+ this.tipText = tipText;
+ this.fileTypeExtension = fileTypeExtension != null ? fileTypeExtension : "";
+ this.taggerId = taggerId;
+ }
+
+ /**
+ * @return Returns the attrTypeId.
+ */
+ public int getAttrTypeId() {
+ return attrTypeId;
+ }
+
+ /**
+ * @return Returns the baseAttributeClass.
+ */
+ public Class<? extends Attribute<?>> getBaseAttributeClass() {
+ return baseAttributeClass;
+ }
+
+ /**
+ * @return Returns the defaultValue.
+ */
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ /**
+ * @return Returns the maxOccurrences.
+ */
+ public int getMaxOccurrences() {
+ return maxOccurrences;
+ }
+
+ /**
+ * @return Returns the minOccurrences.
+ */
+ public int getMinOccurrences() {
+ return minOccurrences;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * @return Returns the tipText.
+ */
+ public String getTipText() {
+ return tipText;
+ }
+
+ /**
+ * @return Returns the validityXml.
+ */
+ public int getOseeEnumTypeId() {
+ return oseeEnumTypeId;
+ }
+
+ public String toString() {
+ return name;
+ }
+
+ public String getFileTypeExtension() {
+ return fileTypeExtension;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ final AttributeType other = (AttributeType) obj;
+ if (name == null) {
+ if (other.name != null) return false;
+ } else if (!name.equals(other.name)) return false;
+ if (namespace == null) {
+ if (other.namespace != null) return false;
+ } else if (!namespace.equals(other.namespace)) return false;
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ public int compareTo(AttributeType attributeType) {
+ if (attributeType == null) {
+ return -1;
+ }
+ return name.compareTo(attributeType.name);
+ }
+
+ /**
+ * @return the providerAttributeClass
+ */
+ public Class<? extends IAttributeDataProvider> getProviderAttributeClass() {
+ return providerAttributeClass;
+ }
+
+ /**
+ * Get the registered tagger id for this attribute type
+ *
+ * @return tagger id
+ */
+ public String getTaggerId() {
+ return taggerId;
+ }
+
+ /**
+ * Whether this attribute type is taggable.
+ *
+ * @return <b>true</b> if this attribute type is taggable. <b>false</b> if this is not taggable.
+ */
+ public boolean isTaggable() {
+ boolean toReturn = false;
+ if (taggerId != null) {
+ toReturn = Strings.isValid(taggerId.trim());
+ }
+ return toReturn;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTypeManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTypeManager.java
new file mode 100644
index 00000000000..e61b2a57975
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/AttributeTypeManager.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_BASE_TYPE_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_PROVIDER_TYPE_TABLE;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeTypeManager {
+
+ private static final String SELECT_ATTRIBUTE_TYPES =
+ "SELECT * FROM osee_attribute_type aty1, osee_attribute_base_type aby1, osee_attribute_provider_type apy1 WHERE aty1.attr_base_type_id = aby1.attr_base_type_id AND aty1.attr_provider_type_id = apy1.attr_provider_type_id";
+ private static final String INSERT_ATTRIBUTE_TYPE =
+ "INSERT INTO osee_attribute_type (attr_type_id, attr_base_type_id, attr_provider_type_id, file_type_extension, namespace, name, default_value, enum_type_id, min_occurence, max_occurence, tip_text, tagger_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
+ private static final String INSERT_BASE_ATTRIBUTE_TYPE =
+ "INSERT INTO osee_attribute_base_type (attr_base_type_id, attribute_class) VALUES (?, ?)";
+ private static final String INSERT_ATTRIBUTE_PROVIDER_TYPE =
+ "INSERT INTO osee_attribute_provider_type (attr_provider_type_id, attribute_provider_class) VALUES (?, ?)";
+ private static final String SELECT_ATTRIBUTE_BASE_TYPE =
+ "SELECT attr_base_type_id FROM " + ATTRIBUTE_BASE_TYPE_TABLE + " WHERE attribute_class = ?";
+ private static final String SELECT_ATTRIBUTE_PROVIDER_TYPE =
+ "SELECT attr_provider_type_id FROM " + ATTRIBUTE_PROVIDER_TYPE_TABLE + " WHERE attribute_provider_class = ?";
+
+ private final HashMap<String, AttributeType> nameToTypeMap;
+ private final HashMap<Integer, AttributeType> idToTypeMap;
+ private static final AttributeTypeManager instance = new AttributeTypeManager();
+
+ private AttributeTypeManager() {
+ this.nameToTypeMap = new HashMap<String, AttributeType>();
+ this.idToTypeMap = new HashMap<Integer, AttributeType>();
+ }
+
+ private static synchronized void ensurePopulated() throws OseeDataStoreException {
+ if (instance.idToTypeMap.size() == 0) {
+ instance.populateCache();
+ }
+ }
+
+ private void populateCache() throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(SELECT_ATTRIBUTE_TYPES);
+
+ while (chStmt.next()) {
+ String baseClassString = chStmt.getString("attribute_class");
+ String baseProviderClassString = chStmt.getString("attribute_provider_class");
+ try {
+ Class<? extends Attribute<?>> baseAttributeClass =
+ AttributeExtensionManager.getAttributeClassFor(baseClassString);
+ Class<? extends IAttributeDataProvider> providerAttributeClass =
+ AttributeExtensionManager.getAttributeProviderClassFor(baseProviderClassString);
+ AttributeType type =
+ new AttributeType(chStmt.getInt("attr_type_id"), baseAttributeClass, providerAttributeClass,
+ chStmt.getString("file_type_extension"), chStmt.getString("namespace"),
+ chStmt.getString("name"), chStmt.getString("default_value"), chStmt.getInt("enum_type_id"),
+ chStmt.getInt("min_occurence"), chStmt.getInt("max_occurence"),
+ chStmt.getString("tip_text"), chStmt.getString("tagger_id"));
+ cache(type);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static Collection<AttributeType> getAllTypes() throws OseeDataStoreException {
+ ensurePopulated();
+ return instance.idToTypeMap.values();
+ }
+
+ public static Collection<AttributeType> getTaggableTypes() throws OseeDataStoreException {
+ ensurePopulated();
+ Collection<AttributeType> taggableTypes = new ArrayList<AttributeType>();
+ for (AttributeType type : instance.idToTypeMap.values()) {
+ if (type.isTaggable()) {
+ taggableTypes.add(type);
+ }
+ }
+ return taggableTypes;
+ }
+
+ public static boolean typeExists(String namespace, String name) throws OseeDataStoreException {
+ ensurePopulated();
+ return instance.nameToTypeMap.get(namespace + name) != null;
+ }
+
+ /**
+ * @param namespace
+ * @param name
+ * @return the attribute type with the given name and namespace or throws an OseeTypeDoesNotExist if it does not
+ * exist.
+ * @throws OseeDataStoreException
+ * @throws OseeTypeDoesNotExist
+ */
+ public static AttributeType getType(String namespace, String name) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ensurePopulated();
+ AttributeType attributeType = instance.nameToTypeMap.get(namespace + name);
+ if (attributeType == null) {
+ throw new OseeTypeDoesNotExist(
+ "Attribute Type with namespace \"" + namespace + "\" and name \"" + name + "\" does not exist.");
+ }
+ return attributeType;
+ }
+
+ /**
+ * Returns the attribute type with the given type id or throws an IllegalArgumentException if it does not exist.
+ *
+ * @param attrTypeId
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public static AttributeType getType(int attrTypeId) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ ensurePopulated();
+ AttributeType attributeType = instance.idToTypeMap.get(attrTypeId);
+ if (attributeType == null) {
+ throw new OseeTypeDoesNotExist("Attribute type: " + attrTypeId + " is not available.");
+ }
+
+ return attributeType;
+ }
+
+ /**
+ * @param attrTypeId
+ * @return the attribute type with the given name or throws an IllegalArgumentException if it does not exist.
+ * @throws OseeTypeDoesNotExist
+ */
+ public static AttributeType getType(String name) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ return getType("", name);
+ }
+
+ /**
+ * Cache a newly created type.
+ *
+ * @param attributeType
+ */
+ public void cache(AttributeType attributeType) {
+ nameToTypeMap.put(attributeType.getNamespace() + attributeType.getName(), attributeType);
+ idToTypeMap.put(attributeType.getAttrTypeId(), attributeType);
+ }
+
+ public static AttributeType createType(String attributeBaseType, String attributeProviderTypeName, String fileTypeExtension, String namespace, String name, String defaultValue, String validityXml, int minOccurrences, int maxOccurrences, String tipText, String taggerId) throws OseeCoreException {
+ if (minOccurrences > 0 && defaultValue == null) throw new OseeArgumentException(
+ "DefaultValue must be set for attribute namespace \"" + namespace + "\" and name \"" + name + "\" with minOccurrences " + minOccurrences);
+ if (typeExists(namespace, name)) {
+ return getType(namespace, name);
+ }
+
+ Class<? extends Attribute<?>> baseAttributeClass =
+ AttributeExtensionManager.getAttributeClassFor(attributeBaseType);
+ Class<? extends IAttributeDataProvider> providerAttributeClass =
+ AttributeExtensionManager.getAttributeProviderClassFor(attributeProviderTypeName);
+
+ int attrTypeId = SequenceManager.getNextAttributeTypeId();
+ int attrBaseTypeId = instance.getOrCreateAttributeBaseType(attributeBaseType);
+ int attrProviderTypeId = instance.getOrCreateAttributeProviderType(attributeProviderTypeName);
+
+ int enumTypeId;
+ if (EnumeratedAttribute.class.isAssignableFrom(baseAttributeClass)) {
+ enumTypeId = OseeEnumTypeManager.createEnumTypeFromXml(namespace + name, validityXml).getEnumTypeId();
+ } else {
+ enumTypeId = OseeEnumTypeManager.getDefaultEnumTypeId();
+ }
+
+ ConnectionHandler.runPreparedUpdate(INSERT_ATTRIBUTE_TYPE, attrTypeId, attrBaseTypeId, attrProviderTypeId,
+ fileTypeExtension == null ? SQL3DataType.VARCHAR : fileTypeExtension,
+ namespace == null ? SQL3DataType.VARCHAR : namespace, name,
+ defaultValue == null ? SQL3DataType.VARCHAR : defaultValue, enumTypeId, minOccurrences, maxOccurrences,
+ tipText == null ? SQL3DataType.VARCHAR : tipText, taggerId == null ? SQL3DataType.VARCHAR : taggerId);
+ AttributeType attributeType =
+ new AttributeType(attrTypeId, baseAttributeClass, providerAttributeClass, fileTypeExtension, namespace,
+ name, defaultValue, enumTypeId, minOccurrences, maxOccurrences, tipText, taggerId);
+ instance.cache(attributeType);
+ return attributeType;
+ }
+
+ private int getOrCreateAttributeProviderType(String attrProviderExtension) throws OseeDataStoreException {
+ int attrBaseTypeId = -1;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_ATTRIBUTE_PROVIDER_TYPE, attrProviderExtension);
+ if (chStmt.next()) {
+ attrBaseTypeId = chStmt.getInt("attr_provider_type_id");
+ } else {
+ attrBaseTypeId = SequenceManager.getNextAttributeProviderTypeId();
+ ConnectionHandler.runPreparedUpdate(INSERT_ATTRIBUTE_PROVIDER_TYPE, attrBaseTypeId, attrProviderExtension);
+ }
+ } finally {
+ chStmt.close();
+ }
+ return attrBaseTypeId;
+ }
+
+ private int getOrCreateAttributeBaseType(String attrBaseExtension) throws OseeDataStoreException {
+ int attrBaseTypeId = -1;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_ATTRIBUTE_BASE_TYPE, attrBaseExtension);
+ if (chStmt.next()) {
+ attrBaseTypeId = chStmt.getInt("attr_base_type_id");
+ } else {
+ attrBaseTypeId = SequenceManager.getNextAttributeBaseTypeId();
+ ConnectionHandler.runPreparedUpdate(INSERT_BASE_ATTRIBUTE_TYPE, attrBaseTypeId, attrBaseExtension);
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ return attrBaseTypeId;
+ }
+
+ public static Set<String> getEnumerationValues(AttributeType attributeType) {
+ try {
+ int oseeEnumTypeId = attributeType.getOseeEnumTypeId();
+ OseeEnumType enumType = OseeEnumTypeManager.getType(oseeEnumTypeId);
+ return enumType.valuesAsOrderedStringSet();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ return Collections.emptySet();
+ }
+ }
+
+ public static Set<String> getEnumerationValues(String attributeName) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ return getEnumerationValues(getType(attributeName));
+ }
+
+ private static final String DELETE_VALID_ATTRIBUTE = "delete from osee_valid_attributes where attr_type_id = ?";
+ private static final String COUNT_ATTRIBUTE_OCCURRENCE =
+ "select count(1) FROM osee_attribute where attr_type_id = ?";
+ private static final String DELETE_ATTRIBUTE_TYPE = "delete from osee_attribute_type where attr_type_id = ?";
+
+ public static void purgeAttributeType(AttributeType attributeType) throws OseeCoreException {
+ int attributeTypeId = attributeType.getAttrTypeId();
+ int attributeCount = ConnectionHandler.runPreparedQueryFetchInt(0, COUNT_ATTRIBUTE_OCCURRENCE, attributeTypeId);
+
+ if (attributeCount != 0) {
+ throw new OseeArgumentException(
+ "Can not delete attribute type " + attributeType.getName() + " because there are " + attributeCount + " existing attributes of this type.");
+ }
+
+ ConnectionHandler.runPreparedUpdate(DELETE_VALID_ATTRIBUTE, attributeTypeId);
+ ConnectionHandler.runPreparedUpdate(DELETE_ATTRIBUTE_TYPE, attributeTypeId);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryAttribute.java
new file mode 100644
index 00000000000..b30c2dfb7c8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class BinaryAttribute<T> extends BinaryBackedAttribute<T> {
+ public BinaryAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryBackedAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryBackedAttribute.java
new file mode 100644
index 00000000000..1dc9d0ba802
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BinaryBackedAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IBinaryAttributeDataProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BinaryBackedAttribute<T> extends Attribute<T> {
+
+ protected BinaryBackedAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ public IBinaryAttributeDataProvider getAttributeDataProvider() {
+ // this cast is always safe since the the data provider passed in the constructor to
+ // the super class is of type IBinaryAttributeDataProvider
+ return (IBinaryAttributeDataProvider) super.getAttributeDataProvider();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BooleanAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BooleanAttribute.java
new file mode 100644
index 00000000000..6c6b888ceb6
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/BooleanAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BooleanAttribute extends CharacterBackedAttribute<Boolean> {
+ public static final String[] booleanChoices = new String[] {"yes", "no"};
+
+ public BooleanAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ @Override
+ public Boolean getValue() throws OseeCoreException {
+ return getAttributeDataProvider().getValueAsString().equals(booleanChoices[0]);
+ }
+
+ @Override
+ public boolean subClassSetValue(Boolean value) throws OseeCoreException {
+ return getAttributeDataProvider().setValue(value ? booleanChoices[0] : booleanChoices[1]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected Boolean convertStringToValue(String value) {
+ return value != null && value.equalsIgnoreCase(booleanChoices[0]);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CharacterBackedAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CharacterBackedAttribute.java
new file mode 100644
index 00000000000..0fd84305190
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CharacterBackedAttribute.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.skynet.core.attribute;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.ICharacterAttributeDataProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class CharacterBackedAttribute<T> extends Attribute<T> {
+
+ protected CharacterBackedAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ @Override
+ public ICharacterAttributeDataProvider getAttributeDataProvider() {
+ // this cast is always safe since the the data provider passed in the constructor to
+ // the super class is of type ICharacterAttributeDataProvider
+ return (ICharacterAttributeDataProvider) super.getAttributeDataProvider();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CompressedContentAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CompressedContentAttribute.java
new file mode 100644
index 00000000000..1cda3d143ee
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/CompressedContentAttribute.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.framework.skynet.core.attribute;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider;
+
+public final class CompressedContentAttribute extends BinaryAttribute<InputStream> {
+
+ public CompressedContentAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getValue()
+ */
+ @Override
+ public InputStream getValue() throws OseeCoreException {
+ return Lib.byteBufferToInputStream(getAttributeDataProvider().getValueAsBytes());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#setValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(InputStream value) throws OseeCoreException {
+ return setValueFromInputStream(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.IStreamableAttribute#setValueFromInputStream(java.io.InputStream)
+ */
+ @Override
+ public boolean setValueFromInputStream(InputStream value) throws OseeCoreException {
+ boolean response = false;
+ try {
+ if (value == null) {
+ response = getAttributeDataProvider().setValue(null);
+ } else {
+ byte[] data = Lib.inputStreamToBytes(value);
+ response = getAttributeDataProvider().setValue(ByteBuffer.wrap(data));
+ }
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ if (response) {
+ setDirty();
+ }
+ return response;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#setAttributeDataProvider(org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider)
+ */
+ @Override
+ public void setAttributeDataProvider(IAttributeDataProvider attributeDataProvider) throws OseeCoreException {
+ super.setAttributeDataProvider(attributeDataProvider);
+ attributeDataProvider.setDisplayableString(getAttributeType().getName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected InputStream convertStringToValue(String value) throws OseeCoreException {
+ try {
+ return Lib.stringToInputStream(value);
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/DateAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/DateAttribute.java
new file mode 100644
index 00000000000..3ef24ac2a8f
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/DateAttribute.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.framework.skynet.core.attribute;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class DateAttribute extends CharacterBackedAttribute<Date> {
+ public static final DateFormat MMDDYY = new SimpleDateFormat("MM/dd/yyyy");
+ public static final DateFormat MMDDYYHHMM = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
+ public static final DateFormat HHMM = new SimpleDateFormat("hh:mm");
+ public static final DateFormat MMDDYYYYHHMMSSAMPM = new SimpleDateFormat("MMM dd,yyyy hh:mm:ss a");
+ public static final DateFormat ALLDATETIME = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
+
+ private static final DateFormat[] legacyDateFormats = new DateFormat[] {MMDDYYYYHHMMSSAMPM, ALLDATETIME, MMDDYYHHMM};
+
+ /**
+ * Create a date attribute with a given type, initialized to the current date and time.
+ *
+ * @param attributeType The type of the attribute
+ */
+ public DateAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /**
+ * Return current date or null if not set
+ *
+ * @return date or null if not set
+ * @throws OseeCoreException
+ */
+ public Date getValue() throws OseeCoreException {
+ Date toReturn = null;
+ String value = getAttributeDataProvider().getValueAsString();
+ if (Strings.isValid(value) != false) {
+ //TODO Added for backward compatibility with inconsistent date formats;
+ try {
+ toReturn = new Date(Long.parseLong(value));
+ } catch (Exception ex) {
+ // We have a legacy date - need to figure out how to parse it
+ toReturn = handleLegacyDates(value);
+ }
+ }
+ return toReturn;
+ }
+
+ private Date handleLegacyDates(String rawValue) {
+ Date toReturn = null;
+ for (DateFormat format : legacyDateFormats) {
+ try {
+ toReturn = format.parse(rawValue);
+ break;
+ } catch (ParseException ex) {
+ }
+ }
+ return toReturn;
+ }
+
+ /**
+ * Sets date
+ *
+ * @param value value or null to clear
+ * @throws OseeCoreException
+ */
+ @Override
+ public boolean subClassSetValue(Date value) throws OseeCoreException {
+ String toSet = value != null ? Long.toString(value.getTime()) : "";
+ return getAttributeDataProvider().setValue(toSet);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getDisplayableString()
+ */
+ @Override
+ public String getDisplayableString() throws OseeCoreException {
+ return getAsFormattedString(DateAttribute.MMDDYYHHMM);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected Date convertStringToValue(String value) {
+ if (value == null || value.equals("")) {
+ return null;
+ }
+ return new Date(Long.parseLong(value));
+ }
+
+ /**
+ * Return date in format given by pattern or "" if not set
+ *
+ * @param pattern DateAttribute.MMDDYY, etc...
+ * @return formated date
+ * @throws OseeCoreException
+ */
+ public String getAsFormattedString(DateFormat dateFormat) throws OseeCoreException {
+ Date date = getValue();
+ return date != null ? dateFormat.format(getValue()) : "";
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/EnumeratedAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/EnumeratedAttribute.java
new file mode 100644
index 00000000000..33b1361417c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/EnumeratedAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class EnumeratedAttribute extends StringAttribute {
+ // When an enumerated attribute is required for an artifact, yet doesn't exist yet, it is created upon
+ // init of the artifact and given the "Unspecified" value
+ public static String UNSPECIFIED_VALUE = "Unspecified";
+
+ public EnumeratedAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getDisplayableString()
+ */
+ @Override
+ public String getDisplayableString() throws OseeCoreException {
+ String toDisplay = getAttributeDataProvider().getDisplayableString();
+ return Strings.isValid(toDisplay) ? toDisplay : "<Select>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#subClassSetValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(String value) throws OseeCoreException {
+ if (!AttributeTypeManager.getEnumerationValues(getAttributeType()).contains(value)) {
+ //throw new OseeArgumentException(value + " is not a valid enumeration of the type " + getAttributeType());
+ }
+ return super.subClassSetValue(value);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/FloatingPointAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/FloatingPointAttribute.java
new file mode 100644
index 00000000000..8241469d830
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/FloatingPointAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FloatingPointAttribute extends CharacterBackedAttribute<Double> {
+
+ public FloatingPointAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getValue()
+ */
+ @Override
+ public Double getValue() throws OseeCoreException {
+ String doubleString = getAttributeDataProvider().getValueAsString();
+ return Strings.isValid(doubleString) ? Double.valueOf(doubleString) : null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#subClassSetValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(Double value) throws OseeCoreException {
+ return getAttributeDataProvider().setValue(String.valueOf(value));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected Double convertStringToValue(String value) {
+ if (value == null || value.equals("")) {
+ return null;
+ }
+ return new Double(value);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/HttpAttributeTagger.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/HttpAttributeTagger.java
new file mode 100644
index 00000000000..a1768433384
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/HttpAttributeTagger.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.framework.skynet.core.attribute;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.event.SkynetAttributeChange;
+import org.eclipse.osee.framework.skynet.core.dbinit.SkynetDbInit;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactTransactionModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpAttributeTagger {
+ private static final HttpAttributeTagger instance = new HttpAttributeTagger();
+ private static final String XML_START = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><AttributeTag>";
+ private static final String XML_FINISH = "</AttributeTag>";
+ private static final String PREFIX = "<entry gammaId=\"";
+ private static final String POSTFIX = "\"/>\n";
+ private final ExecutorService executor;
+ private final EventRelay eventRelay;
+
+ private HttpAttributeTagger() {
+ this.executor = Executors.newSingleThreadExecutor();
+ this.eventRelay = new EventRelay();
+ OseeEventManager.addListener(eventRelay);
+ }
+
+ public static HttpAttributeTagger getInstance() {
+ return instance;
+ }
+
+ public void deregisterFromEventManager() {
+ OseeEventManager.removeListener(eventRelay);
+ }
+
+ private final class TagService implements Runnable {
+ private final Set<Integer> changedGammas;
+
+ public TagService() {
+ this.changedGammas = new HashSet<Integer>();
+ }
+
+ public void add(int attributeGammaId) {
+ changedGammas.add(attributeGammaId);
+ }
+
+ public int size() {
+ return changedGammas.size();
+ }
+
+ public void run() {
+ long start = System.currentTimeMillis();
+ StringBuffer response = new StringBuffer();
+ ByteArrayInputStream inputStream = null;
+ try {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("sessionId", ClientSessionManager.getSessionId());
+ if (SkynetDbInit.isDbInit()) {
+ parameters.put("wait", "true");
+ }
+ StringBuilder payload = new StringBuilder(XML_START);
+ for (int data : changedGammas) {
+ payload.append(PREFIX);
+ payload.append(data);
+ payload.append(POSTFIX);
+ }
+ payload.append(XML_FINISH);
+
+ inputStream = new ByteArrayInputStream(payload.toString().getBytes("UTF-8"));
+ String url =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.SEARCH_TAGGING_CONTEXT,
+ parameters);
+ response.append(HttpProcessor.put(new URL(url), inputStream, "application/xml", "UTF-8"));
+ OseeLog.log(Activator.class, Level.FINEST, String.format("Transmitted to Tagger in [%d ms]",
+ System.currentTimeMillis() - start));
+ } catch (Exception ex) {
+ if (response.length() > 0) {
+ response.append("\n");
+ }
+ response.append(ex.getLocalizedMessage());
+ OseeLog.log(Activator.class, Level.SEVERE, response.toString(), ex);
+ } finally {
+ changedGammas.clear();
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ }
+ }
+ }
+
+ private final class EventRelay implements IFrameworkTransactionEventListener, IBranchEventListener, IArtifactsPurgedEventListener, IArtifactsChangeTypeEventListener, ITransactionsDeletedEventListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.BranchEventType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.skynet.core.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) {
+ // if (sender.isRemote()) {
+ // return;
+ // }
+ // try {
+ // loadedArtifacts.
+ // //TODO: implements
+ // // Map<String, String> parameters = new HashMap<String, String>();
+ // // parameters.put("sessionId", ClientSessionManager.getSessionId());
+ // // parameters.put("queryId", Integer.toString(transactionJoinId));
+ // // String url =
+ // // HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.SEARCH_TAGGING_CONTEXT,
+ // // parameters);
+ // // String response = HttpProcessor.delete(new URL(url));
+ //
+ // } catch (Exception ex) {
+ // OseeLog.log(Activator.class, Level.WARNING, "Error Deleting Tags during purge.", ex);
+ // }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener#handleArtifactsChangeTypeEvent(org.eclipse.osee.framework.skynet.core.event.Sender, int, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, LoadedArtifacts loadedArtifacts) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener#handleTransactionsDeletedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, int[])
+ */
+ @Override
+ public void handleTransactionsDeletedEvent(Sender sender, int[] transactionIds) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData txData) throws OseeCoreException {
+ if (sender.isRemote()) {
+ return;
+ }
+ TagService taggingInfo = new TagService();
+ for (ArtifactTransactionModifiedEvent event : txData.getXModifiedEvents()) {
+ if (event instanceof ArtifactModifiedEvent) {
+ for (SkynetAttributeChange change : ((ArtifactModifiedEvent) event).getAttributeChanges()) {
+ if (AttributeTypeManager.getType(change.getTypeId()).isTaggable()) {
+ taggingInfo.add(change.getGammaId());
+ }
+ }
+ }
+ }
+ if (taggingInfo.size() > 0) {
+ Future<?> future = executor.submit(taggingInfo);
+ if (SkynetDbInit.isDbInit()) {
+ try {
+ future.get();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Error while waiting for tagger to complete.", ex);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/IntegerAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/IntegerAttribute.java
new file mode 100644
index 00000000000..7e4f8eb0d7d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/IntegerAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class IntegerAttribute extends CharacterBackedAttribute<Integer> {
+
+ public IntegerAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getValue()
+ */
+ @Override
+ public Integer getValue() throws NumberFormatException, OseeCoreException {
+ String integerString = getAttributeDataProvider().getValueAsString();
+ return Strings.isValid(integerString) ? Integer.valueOf(integerString) : null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#subClassSetValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(Integer value) throws OseeCoreException {
+ return getAttributeDataProvider().setValue(Integer.toString(value));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected Integer convertStringToValue(String value) throws OseeCoreException {
+ if (value == null || value.equals("")) {
+ return new Integer(0);
+ }
+ return Integer.parseInt(value);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/JavaObjectAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/JavaObjectAttribute.java
new file mode 100644
index 00000000000..f5a43f81862
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/JavaObjectAttribute.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.framework.skynet.core.attribute;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.nio.ByteBuffer;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+public final class JavaObjectAttribute extends BinaryAttribute<Object> {
+
+ public JavaObjectAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getValue()
+ */
+ @Override
+ public Object getValue() throws OseeCoreException {
+ return getObjectFromBytes(getAttributeDataProvider().getValueAsBytes());
+ }
+
+ private Object getObjectFromBytes(ByteBuffer buffer) {
+ Object obj = null;
+ InputStream inputStream = null;
+ ObjectInputStream objectStream = null;
+ try {
+ inputStream = Lib.byteBufferToInputStream(buffer);
+ if (inputStream != null) {
+ objectStream = new ObjectInputStream(inputStream);
+ obj = objectStream.readObject();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.reset();
+ }
+ } catch (IOException ex) {
+ }
+ try {
+ if (objectStream != null) {
+ objectStream.close();
+ }
+ } catch (IOException ex) {
+ }
+ }
+ return obj;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#subClassSetValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(Object value) {
+ try {
+ ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+ ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
+ objectStream.writeObject(value);
+ objectStream.flush();
+ objectStream.close();
+ getAttributeDataProvider().setValue(ByteBuffer.wrap(byteStream.toByteArray()));
+ getAttributeDataProvider().setDisplayableString(value != null ? value.getClass().getName() : "null");
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected Object convertStringToValue(String value) throws OseeCoreException {
+ if (value == null) {
+ return null;
+ }
+ return getObjectFromBytes(ByteBuffer.wrap(value.getBytes()));
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumType.java
new file mode 100644
index 00000000000..a6355154697
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumType.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeEnumType {
+
+ private final int enumTypeId;
+ private final String enumTypeName;
+
+ private final List<OseeEnumEntry> enumSet;
+ private boolean isDeleted;
+
+ protected OseeEnumType(int enumTypeId, String enumTypeName) {
+ this.enumTypeId = enumTypeId;
+ this.enumTypeName = enumTypeName;
+ this.enumSet = new ArrayList<OseeEnumEntry>();
+ this.isDeleted = false;
+ }
+
+ protected void internalSetDeleted(boolean deleted) {
+ this.isDeleted = deleted;
+ }
+
+ protected synchronized void internalAddEnum(String name, int ordinal) throws OseeArgumentException {
+ checkEnumEntryName(name);
+ checkOrdinal(ordinal);
+ OseeEnumEntry entry = new OseeEnumEntry(name, ordinal);
+ enumSet.add(entry);
+ }
+
+ protected void internalAddEnum(ObjectPair<String, Integer> entry) throws OseeArgumentException {
+ internalAddEnum(entry.object1, entry.object2);
+ }
+
+ protected synchronized void internalRemoveEnums(OseeEnumEntry... entries) {
+ if (entries != null) {
+ for (OseeEnumEntry entry : entries) {
+ enumSet.remove(entry);
+ }
+ }
+ }
+
+ public boolean isDeleted() {
+ return isDeleted;
+ }
+
+ public synchronized OseeEnumEntry[] values() {
+ Collections.sort(enumSet);
+ return enumSet.toArray(new OseeEnumEntry[enumSet.size()]);
+ }
+
+ public synchronized Set<String> valuesAsOrderedStringSet() {
+ Set<String> values = new LinkedHashSet<String>();
+ for (OseeEnumEntry oseeEnumEntry : enumSet) {
+ values.add(oseeEnumEntry.name());
+ }
+ return values;
+ }
+
+ public int getEnumTypeId() {
+ return enumTypeId;
+ }
+
+ public String getEnumTypeName() {
+ return enumTypeName;
+ }
+
+ private synchronized OseeEnumEntry valueOfAllowNullReturn(String entryName) {
+ if (entryName != null) {
+ for (OseeEnumEntry entry : enumSet) {
+ if (entry.name().equals(entryName)) {
+ return entry;
+ }
+ }
+ }
+ return null;
+ }
+
+ private synchronized OseeEnumEntry valueOfAllowNullReturn(int ordinal) throws OseeArgumentException {
+ for (OseeEnumEntry entry : enumSet) {
+ if (entry.ordinal() == ordinal) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
+ public synchronized OseeEnumEntry valueOf(String entryName) throws OseeArgumentException {
+ OseeEnumEntry toReturn = valueOfAllowNullReturn(entryName);
+ if (toReturn == null) {
+ throw new OseeArgumentException(String.format("No enum const [%s].[%s]", getEnumTypeName(), entryName));
+ }
+ return toReturn;
+ }
+
+ public synchronized OseeEnumEntry valueOf(int ordinal) throws OseeArgumentException {
+ OseeEnumEntry toReturn = valueOfAllowNullReturn(ordinal);
+ if (toReturn == null) {
+ throw new OseeArgumentException(String.format("No enum const [%s] - ordinal [%s]", getEnumTypeName(), ordinal));
+ }
+ return toReturn;
+ }
+
+ private void checkEnumEntryName(String name) throws OseeArgumentException {
+ if (!Strings.isValid(name)) {
+ throw new OseeArgumentException("Enum entry name cannot be null");
+ }
+ OseeEnumEntry entry = valueOfAllowNullReturn(name);
+ if (entry != null) {
+ throw new OseeArgumentException(String.format("Unique enum entry name violation - %s already exists.", entry));
+ }
+ }
+
+ private void checkOrdinal(int ordinal) throws OseeArgumentException {
+ if (ordinal < 0) {
+ throw new OseeArgumentException("Enum entry ordinal cannot be of negative value");
+ }
+ OseeEnumEntry entry = valueOfAllowNullReturn(ordinal);
+ if (entry != null) {
+ throw new OseeArgumentException(String.format("Unique enum entry ordinal violation - %s already exists.",
+ entry));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof OseeEnumType) {
+ final OseeEnumType other = (OseeEnumType) obj;
+ boolean result = true;
+ if (other.getEnumTypeName() != null && getEnumTypeName() != null) {
+ result &= other.getEnumTypeName().equals(getEnumTypeName());
+ } else {
+ result &= other.getEnumTypeName() == null && getEnumTypeName() == null;
+ }
+ return result & getEnumTypeId() == other.getEnumTypeId();
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 37;
+ int result = prime * 17 + (getEnumTypeName() != null ? getEnumTypeName().hashCode() : 0);
+ return prime * result + getEnumTypeId();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return enumTypeName;
+ }
+
+ public final class OseeEnumEntry implements Comparable<OseeEnumEntry> {
+ private final int ordinal;
+ private final String name;
+
+ private OseeEnumEntry(String name, int ordinal) {
+ this.name = name;
+ this.ordinal = ordinal;
+ }
+
+ public String name() {
+ return name;
+ }
+
+ public int ordinal() {
+ return ordinal;
+ }
+
+ public String getEnumTypeName() {
+ return OseeEnumType.this.getEnumTypeName();
+ }
+
+ public int getEnumTypeId() {
+ return OseeEnumType.this.getEnumTypeId();
+ }
+
+ public OseeEnumType getDeclaringClass() {
+ return OseeEnumType.this;
+ }
+
+ public OseeEnumEntry[] values() {
+ return OseeEnumType.this.values();
+ }
+
+ public ObjectPair<String, Integer> asObjectPair() {
+ return new ObjectPair<String, Integer>(name(), ordinal());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof OseeEnumEntry) {
+ final OseeEnumEntry other = (OseeEnumEntry) obj;
+ boolean result = true;
+ if (other.name != null && name != null) {
+ result &= other.name.equals(name);
+ } else {
+ result &= other.name == null && name == null;
+ }
+ return result & ordinal == other.ordinal & getDeclaringClass().equals(other.getDeclaringClass());
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 37;
+ int result = prime * 17 + (name != null ? name.hashCode() : 0);
+ result = prime * result + ordinal;
+ result = prime * result + getDeclaringClass().hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("[%s].[%s:%s]", getEnumTypeName(), name, ordinal);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ @Override
+ public int compareTo(OseeEnumEntry other) {
+ return this.ordinal() - other.ordinal();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumTypeManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumTypeManager.java
new file mode 100644
index 00000000000..da782e28e53
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumTypeManager.java
@@ -0,0 +1,383 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeMultipleEnumTypesExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumType.OseeEnumEntry;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeEnumTypeManager {
+ private static final String QUERY_ENUM =
+ "select oet.enum_type_name, oetd.* from osee_enum_type oet, osee_enum_type_def oetd where oet.enum_type_id = oetd.enum_type_id order by oetd.enum_type_id, oetd.ordinal";
+
+ private static final String INSERT_ENUM_TYPE =
+ "insert into osee_enum_type (ENUM_TYPE_ID, ENUM_TYPE_NAME) values (?,?)";
+
+ private static final String INSERT_ENUM_TYPE_DEF =
+ "insert into osee_enum_type_def (ENUM_TYPE_ID, NAME, ORDINAL) values (?,?,?)";
+
+ private static final String DELETE_ENUM_TYPE_ENTRIES = "delete from osee_enum_type_def where enum_type_id = ?";
+
+ private static final String DELETE_ENUM_TYPE = "delete from osee_enum_type oet where enum_type_id = ?";
+
+ private static final OseeEnumTypeManager instance = new OseeEnumTypeManager();
+
+ private final HashCollection<String, OseeEnumType> enumTypeByNameMap;
+ private final Map<Integer, OseeEnumType> enumTypeByIdMap;
+
+ private OseeEnumTypeManager() {
+ enumTypeByNameMap = new HashCollection<String, OseeEnumType>();
+ enumTypeByIdMap = new HashMap<Integer, OseeEnumType>();
+ }
+
+ public static OseeEnumType getType(int enumTypeId, boolean includeDeleted) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ instance.checkLoaded();
+ OseeEnumType oseeEnumType = instance.enumTypeByIdMap.get(enumTypeId);
+ if (oseeEnumType == null || !includeDeleted && oseeEnumType.isDeleted()) {
+ throw new OseeTypeDoesNotExist(String.format("Osee Enum Type with id:[%s] does not exist.", enumTypeId));
+ }
+ return oseeEnumType;
+ }
+
+ public static OseeEnumType getUniqueType(String enumTypeName, boolean includeDeleted) throws OseeDataStoreException, OseeTypeDoesNotExist, OseeMultipleEnumTypesExist {
+ Collection<OseeEnumType> results = getTypes(enumTypeName, includeDeleted);
+ if (results.size() > 1) {
+ throw new OseeMultipleEnumTypesExist(String.format("Found multiple OSEE enum types matching [%s] name",
+ enumTypeName));
+ }
+ return results.iterator().next();
+ }
+
+ public static Collection<OseeEnumType> getTypes(String enumTypeName, boolean includeDeleted) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ Collection<OseeEnumType> toReturn = getTypesAllowEmpty(enumTypeName, includeDeleted);
+ if (toReturn.isEmpty()) {
+ throw new OseeTypeDoesNotExist(String.format("Osee Enum Type with name:[%s] does not exist.", enumTypeName));
+ }
+ return toReturn;
+ }
+
+ public static Collection<OseeEnumType> getTypesAllowEmpty(String enumTypeName, boolean includeDeleted) throws OseeDataStoreException {
+ instance.checkLoaded();
+ List<OseeEnumType> toReturn = new ArrayList<OseeEnumType>();
+ Collection<OseeEnumType> itemsFound = instance.enumTypeByNameMap.getValues(enumTypeName);
+ if (itemsFound != null) {
+ for (OseeEnumType oseeEnumType : itemsFound) {
+ if (includeDeleted || !oseeEnumType.isDeleted()) {
+ toReturn.add(oseeEnumType);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public static Collection<OseeEnumType> getAllTypes(boolean includeDeleted) throws OseeDataStoreException {
+ instance.checkLoaded();
+ List<OseeEnumType> items = new ArrayList<OseeEnumType>();
+ for (OseeEnumType types : instance.enumTypeByIdMap.values()) {
+ if (includeDeleted || !types.isDeleted()) {
+ items.add(types);
+ }
+ }
+ return items;
+ }
+
+ public static Collection<String> getAllTypeNames(boolean includeDeleted) throws OseeDataStoreException {
+ List<String> items = new ArrayList<String>();
+ for (OseeEnumType types : getAllTypes(includeDeleted)) {
+ items.add(types.getEnumTypeName());
+ }
+ return items;
+ }
+
+ public static boolean typeExist(String enumTypeName, boolean includeDeleted) throws OseeDataStoreException {
+ return !getTypesAllowEmpty(enumTypeName, includeDeleted).isEmpty();
+ }
+
+ public static OseeEnumType getType(int enumTypeId) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ return getType(enumTypeId, false);
+ }
+
+ public static OseeEnumType getUniqueType(String enumTypeName) throws OseeDataStoreException, OseeTypeDoesNotExist, OseeMultipleEnumTypesExist {
+ return getUniqueType(enumTypeName, false);
+ }
+
+ public static Collection<String> getAllTypeNames() throws OseeDataStoreException {
+ return getAllTypeNames(false);
+ }
+
+ public static Collection<OseeEnumType> getAllTypes() throws OseeDataStoreException {
+ return getAllTypes(false);
+ }
+
+ public static boolean typeExist(String enumTypeName) throws OseeDataStoreException {
+ return typeExist(enumTypeName, false);
+ }
+
+ private static void checkNull(Object value) throws OseeCoreException {
+ if (value == null) {
+ throw new OseeArgumentException("Object cannot be null.");
+ }
+ }
+
+ private static void checkEnumTypeName(String enumTypeName) throws OseeCoreException {
+ if (!Strings.isValid(enumTypeName)) {
+ throw new OseeArgumentException("Osee Enum Type Name cannot be null.");
+ }
+ }
+
+ private static void checkEntryIntegrity(String enumTypeName, List<ObjectPair<String, Integer>> entries) throws OseeCoreException {
+ if (entries == null) {
+ throw new OseeArgumentException(String.format("Osee Enum Type [%s] had null entries", enumTypeName));
+ }
+
+ // if (entries.size() <= 0) throw new OseeArgumentException(String.format("Osee Enum Type [%s] had 0 entries",
+ // enumTypeName));
+ Map<String, Integer> values = new HashMap<String, Integer>();
+ for (ObjectPair<String, Integer> entry : entries) {
+ String name = entry.object1;
+ int ordinal = entry.object2;
+ if (!Strings.isValid(name)) {
+ throw new OseeArgumentException("Enum entry name cannot be null");
+ }
+ if (ordinal < 0) {
+ throw new OseeArgumentException("Enum entry ordinal cannot be of negative value");
+ }
+ if (values.containsKey(name)) {
+ throw new OseeArgumentException(String.format("Unique enum entry name violation - [%s] already exists.",
+ name));
+ }
+ if (values.containsValue(ordinal)) {
+ throw new OseeArgumentException(String.format("Unique enum entry ordinal violation - [%s] already exists.",
+ ordinal));
+ }
+ values.put(name, ordinal);
+ }
+ }
+
+ public static int getDefaultEnumTypeId() throws OseeCoreException {
+ return -1;
+ }
+
+ public static OseeEnumType createEnumType(String enumTypeName, List<ObjectPair<String, Integer>> entries) throws OseeCoreException {
+ checkEnumTypeName(enumTypeName);
+ checkEntryIntegrity(enumTypeName, entries);
+
+ if (typeExist(enumTypeName)) {
+ return getUniqueType(enumTypeName);
+ }
+
+ int oseeEnumTypeId = SequenceManager.getNextOseeEnumTypeId();
+ OseeEnumType oseeEnumType = new OseeEnumType(oseeEnumTypeId, enumTypeName);
+ ConnectionHandler.runPreparedUpdate(INSERT_ENUM_TYPE, oseeEnumType.getEnumTypeId(),
+ oseeEnumType.getEnumTypeName());
+
+ addEntries(oseeEnumType, entries);
+ return oseeEnumType;
+ }
+
+ public static OseeEnumType createEnumTypeFromXml(String attributeTypeName, String xmlDefinition) throws OseeCoreException {
+ List<ObjectPair<String, Integer>> entries = new ArrayList<ObjectPair<String, Integer>>();
+ String enumTypeName = "";
+
+ if (!Strings.isValid(xmlDefinition)) {
+ throw new OseeArgumentException("The enum xml definition must not be null or empty");
+ }
+
+ Document document;
+ try {
+ document = Jaxp.readXmlDocument(xmlDefinition);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ enumTypeName = attributeTypeName;
+ Element choicesElement = document.getDocumentElement();
+ NodeList enumerations = choicesElement.getChildNodes();
+ Set<String> choices = new LinkedHashSet<String>();
+
+ for (int i = 0; i < enumerations.getLength(); i++) {
+ Node node = enumerations.item(i);
+ if (node.getNodeName().equalsIgnoreCase("Enum")) {
+ choices.add(node.getTextContent());
+ } else {
+ throw new OseeArgumentException("Validity Xml not of excepted enum format");
+ }
+ }
+
+ int ordinal = 0;
+ for (String choice : choices) {
+ entries.add(new ObjectPair<String, Integer>(choice, ordinal++));
+ }
+
+ return createEnumType(enumTypeName, entries);
+ }
+
+ private void cache(OseeEnumType oseeEnumType) {
+ enumTypeByNameMap.put(oseeEnumType.getEnumTypeName(), oseeEnumType);
+ enumTypeByIdMap.put(oseeEnumType.getEnumTypeId(), oseeEnumType);
+ }
+
+ private synchronized void checkLoaded() throws OseeDataStoreException {
+ if (enumTypeByNameMap.isEmpty() && enumTypeByIdMap.isEmpty()) {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(QUERY_ENUM);
+ OseeEnumType oseeEnumType = null;
+ int lastEnumTypeId = -1;
+ while (chStmt.next()) {
+ try {
+ int currentEnumTypeId = chStmt.getInt("enum_type_id");
+ if (lastEnumTypeId != currentEnumTypeId) {
+ oseeEnumType = new OseeEnumType(currentEnumTypeId, chStmt.getString("enum_type_name"));
+ cache(oseeEnumType);
+ lastEnumTypeId = currentEnumTypeId;
+ }
+ oseeEnumType.internalAddEnum(chStmt.getString("name"), chStmt.getInt("ordinal"));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ }
+
+ public static void deleteEnumType(OseeEnumType typeToDelete) throws OseeCoreException {
+ boolean isInUse = false;
+ for (AttributeType attrType : AttributeTypeManager.getAllTypes()) {
+ if (typeToDelete.getEnumTypeId() == attrType.getOseeEnumTypeId()) {
+ isInUse = true;
+ }
+ }
+ if (isInUse) {
+ throw new OseeStateException(String.format(
+ "Osee Enum Type: [%s] with id: [%s] is in use by enumerated attributes", typeToDelete.getEnumTypeName(),
+ typeToDelete.getEnumTypeId()));
+ }
+ ConnectionHandler.runPreparedUpdate(DELETE_ENUM_TYPE, typeToDelete.getEnumTypeId());
+ typeToDelete.internalSetDeleted(true);
+ // TODO signal to other clients - Event here
+ }
+
+ public static void removeEntries(final OseeEnumType enumType, final OseeEnumEntry... entries) throws OseeCoreException {
+ checkNull(entries);
+ if (entries.length > 0) {
+ final List<OseeEnumEntry> itemsToRemove = Arrays.asList(entries);
+ final List<ObjectPair<String, Integer>> newEntries = new ArrayList<ObjectPair<String, Integer>>();
+ for (OseeEnumEntry entry : enumType.values()) {
+ if (!itemsToRemove.contains(entry)) {
+ newEntries.add(entry.asObjectPair());
+ }
+ }
+ UpdateEnumTx updateEnumTx = new UpdateEnumTx(enumType, newEntries);
+ updateEnumTx.execute();
+
+ enumType.internalRemoveEnums(entries);
+ // TODO Signal to other clients - Event here
+ }
+ }
+
+ public static void addEntries(final OseeEnumType oseeEnumType, final ObjectPair<String, Integer>... entries) throws OseeCoreException {
+ addEntries(oseeEnumType, Collections.getAggregate(entries));
+ }
+
+ public static void addEntries(final OseeEnumType oseeEnumType, final List<ObjectPair<String, Integer>> entries) throws OseeCoreException {
+ checkNull(oseeEnumType);
+ final List<ObjectPair<String, Integer>> newEntries = getCombinedEntries(oseeEnumType, entries);
+
+ UpdateEnumTx updateEnumTx = new UpdateEnumTx(oseeEnumType, newEntries);
+ updateEnumTx.execute();
+
+ boolean wasCreated = false;
+ if (!instance.enumTypeByIdMap.containsKey(oseeEnumType.getEnumTypeId())) {
+ instance.cache(oseeEnumType);
+ wasCreated = true;
+ }
+ for (ObjectPair<String, Integer> entry : entries) {
+ oseeEnumType.internalAddEnum(entry);
+ }
+ // TODO Signal to other clients - Event here
+ if (wasCreated) {
+ // TODO Signal newly created - Event here
+ }
+ }
+
+ private static List<ObjectPair<String, Integer>> getCombinedEntries(final OseeEnumType enumType, final List<ObjectPair<String, Integer>> entries) {
+ final List<ObjectPair<String, Integer>> combinedList = new ArrayList<ObjectPair<String, Integer>>();
+ if (entries != null) {
+ combinedList.addAll(entries);
+ }
+ for (OseeEnumEntry entry : enumType.values()) {
+ combinedList.add(entry.asObjectPair());
+ }
+ return combinedList;
+ }
+
+ private static final class UpdateEnumTx extends DbTransaction {
+ private final List<ObjectPair<String, Integer>> entries;
+ private final OseeEnumType enumType;
+
+ public UpdateEnumTx(final OseeEnumType enumType, final List<ObjectPair<String, Integer>> entries) throws OseeCoreException {
+ super();
+ this.enumType = enumType;
+ this.entries = entries;
+ }
+
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ checkNull(enumType);
+ checkEntryIntegrity(enumType.getEnumTypeName(), entries);
+
+ Integer oseeEnumTypeId = enumType.getEnumTypeId();
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (ObjectPair<String, Integer> entry : entries) {
+ data.add(new Object[] {oseeEnumTypeId, entry.object1, entry.object2});
+ }
+ ConnectionHandler.runPreparedUpdate(connection, DELETE_ENUM_TYPE_ENTRIES, oseeEnumTypeId);
+ if (!data.isEmpty()) {
+ ConnectionHandler.runBatchUpdate(connection, INSERT_ENUM_TYPE_DEF, data);
+ }
+ }
+ };
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumerationValidation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumerationValidation.java
new file mode 100644
index 00000000000..80044eaa60d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/OseeEnumerationValidation.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.framework.skynet.core.attribute;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeEnumerationValidation implements IOseeValidator {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.validation.IOseeValidator#getQualityOfService()
+ */
+ @Override
+ public int getQualityOfService() {
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.validation.IOseeValidator#isApplicable(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.skynet.core.attribute.AttributeType)
+ */
+ @Override
+ public boolean isApplicable(Artifact artifact, AttributeType attributeType) {
+ Class<?> baseClass = attributeType.getBaseAttributeClass();
+ return EnumeratedAttribute.class.isAssignableFrom(baseClass);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.validation.IOseeValidator#validate(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.Object)
+ */
+ @Override
+ public IStatus validate(Artifact artifact, AttributeType attributeType, Object proposedObject) throws OseeCoreException {
+ String text = (String) proposedObject;
+ OseeEnumType oseeEnumType = OseeEnumTypeManager.getType(attributeType.getOseeEnumTypeId());
+ oseeEnumType.valueOf(text);
+
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/StringAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/StringAttribute.java
new file mode 100644
index 00000000000..203b09755f5
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/StringAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class StringAttribute extends CharacterBackedAttribute<String> {
+
+ public StringAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getValue()
+ */
+ @Override
+ public String getValue() throws OseeCoreException {
+ return getAttributeDataProvider().getValueAsString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#subClassSetValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(String value) throws OseeCoreException {
+ return getAttributeDataProvider().setValue(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#convertStringToValue(java.lang.String)
+ */
+ @Override
+ protected String convertStringToValue(String value) throws OseeCoreException {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/TypeValidityManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/TypeValidityManager.java
new file mode 100644
index 00000000000..794bdcdca64
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/TypeValidityManager.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * Caches the mapping of valid attribute types to artifact types for which they are valid
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.ArtifactType
+ * @author Ryan D. Brooks
+ */
+public class TypeValidityManager {
+ private static final String SELECT_ATTRIBUTE_VALIDITY = "SELECT * FROM osee_valid_attributes";
+ private static final String INSERT_VALID_ATTRIBUTE =
+ "INSERT INTO osee_valid_attributes (art_type_id, attr_type_id, branch_id) VALUES (?, ?, ?)";
+ private static final TypeValidityManager instance = new TypeValidityManager();
+
+ private final CompositeKeyHashMap<Branch, ArtifactType, Collection<AttributeType>> artifactToAttributeMap =
+ new CompositeKeyHashMap<Branch, ArtifactType, Collection<AttributeType>>();
+ private final CompositeKeyHashMap<Branch, AttributeType, Collection<ArtifactType>> attributeToartifactMap =
+ new CompositeKeyHashMap<Branch, AttributeType, Collection<ArtifactType>>();
+
+ private final HashCollection<Branch, ArtifactType> branchToartifactTypeMap =
+ new HashCollection<Branch, ArtifactType>(false, TreeSet.class);
+
+ private TypeValidityManager() {
+ }
+
+ private static synchronized void ensurePopulated() throws OseeCoreException {
+ if (instance.artifactToAttributeMap.isEmpty()) {
+ instance.populateCache();
+ }
+ }
+
+ private void populateCache() throws OseeCoreException {
+ branchToartifactTypeMap.put(BranchManager.getSystemRootBranch(), ArtifactTypeManager.getAllTypes());
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(2000, SELECT_ATTRIBUTE_VALIDITY);
+ while (chStmt.next()) {
+ try {
+ ArtifactType artifactType = ArtifactTypeManager.getType(chStmt.getInt("art_type_id"));
+ AttributeType attributeType = AttributeTypeManager.getType(chStmt.getInt("attr_type_id"));
+ Branch branch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+
+ cacheAttributeValidity(artifactType, attributeType, branch);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static Collection<ArtifactType> getArtifactTypesFromAttributeType(String requestedAttributeType, Branch branch) throws OseeCoreException {
+ return getArtifactTypesFromAttributeType(AttributeTypeManager.getType(requestedAttributeType), branch);
+ }
+
+ /**
+ * Update type data to associate attributeType with artifactType on the given branch
+ *
+ * @param artifactType
+ * @param attributeType
+ * @param branch
+ * @throws OseeDataStoreException
+ * @throws BranchDoesNotExist
+ */
+ public static void persistAttributeValidity(ArtifactType artifactType, AttributeType attributeType, Branch branch) throws OseeCoreException {
+ if (!isValid(artifactType, attributeType, branch)) {
+ ConnectionHandler.runPreparedUpdate(INSERT_VALID_ATTRIBUTE, artifactType.getArtTypeId(),
+ attributeType.getAttrTypeId(), branch.getBranchId());
+
+ instance.cacheAttributeValidity(artifactType, attributeType, branch);
+ }
+ }
+
+ public static Collection<ArtifactType> getArtifactTypesFromAttributeType(AttributeType requestedAttributeType, Branch branch) throws OseeCoreException {
+ ensurePopulated();
+
+ Collection<ArtifactType> inheritedArtifactTypes = new HashSet<ArtifactType>();
+ Branch branchCursor = branch;
+ boolean notDone = true;
+ while (notDone) {
+ Collection<ArtifactType> artifactTypes =
+ instance.attributeToartifactMap.get(branchCursor, requestedAttributeType);
+ if (artifactTypes != null) {
+ inheritedArtifactTypes.addAll(artifactTypes);
+ }
+
+ if (branchCursor.isSystemRootBranch()) {
+ notDone = false;
+ } else {
+ branchCursor = branchCursor.getParentBranch();
+ }
+ }
+
+ if (inheritedArtifactTypes.isEmpty()) {
+ throw new OseeTypeDoesNotExist(
+ "There are no valid artifact types available for the attribute type " + requestedAttributeType);
+ }
+
+ return inheritedArtifactTypes;
+ }
+
+ public static Collection<AttributeType> getAttributeTypesFromArtifactType(ArtifactType artifactType, Branch branch) throws OseeCoreException {
+ ensurePopulated();
+
+ Collection<AttributeType> inhieritedAttributeTypes = new HashSet<AttributeType>();
+ Branch branchCursor = branch;
+ boolean notDone = true;
+ while (notDone) {
+ Collection<AttributeType> attributeTypes = instance.artifactToAttributeMap.get(branchCursor, artifactType);
+ if (attributeTypes != null) {
+ inhieritedAttributeTypes.addAll(attributeTypes);
+ }
+
+ if (branchCursor.isSystemRootBranch()) {
+ notDone = false;
+ } else {
+ branchCursor = branchCursor.getParentBranch();
+ }
+ }
+
+ if (inhieritedAttributeTypes.isEmpty()) {
+ throw new OseeTypeDoesNotExist(
+ "There are no valid attribute types available for the artifact type \"" + artifactType + "\"");
+ }
+ return inhieritedAttributeTypes;
+ }
+
+ public static boolean isValid(ArtifactType artifactType, AttributeType attributeType, Branch branch) throws OseeCoreException {
+ ensurePopulated();
+ Collection<AttributeType> attributeTypes = instance.artifactToAttributeMap.get(branch, artifactType);
+ if (attributeTypes != null) {
+ for (AttributeType otherAttributeType : attributeTypes) {
+ if (attributeType.equals(otherAttributeType)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void cacheAttributeValidity(ArtifactType artifactType, AttributeType attributeType, Branch branch) throws OseeDataStoreException {
+ Collection<AttributeType> attributeTypes = artifactToAttributeMap.get(branch, artifactType);
+ if (attributeTypes == null) {
+ attributeTypes = new LinkedList<AttributeType>();
+ artifactToAttributeMap.put(branch, artifactType, attributeTypes);
+ }
+ attributeTypes.add(attributeType);
+
+ Collection<ArtifactType> artifactTypes = attributeToartifactMap.get(branch, attributeType);
+ if (artifactTypes == null) {
+ artifactTypes = new LinkedList<ArtifactType>();
+ attributeToartifactMap.put(branch, attributeType, artifactTypes);
+ }
+ artifactTypes.add(artifactType);
+ }
+
+ public static Collection<AttributeType> getValidAttributeTypes(Branch branch) throws OseeCoreException {
+ return AttributeTypeManager.getAllTypes();
+ }
+
+ public static Collection<ArtifactType> getValidArtifactTypes(Branch branch) throws OseeCoreException {
+ if (false) { // TODO: Filter Types By Branch
+ ensurePopulated();
+ Branch topLevelBranch = branch.getTopLevelBranch();
+ Collection<ArtifactType> artifactTypes = instance.branchToartifactTypeMap.getValues(topLevelBranch);
+ if (artifactTypes == null) {
+ throw new OseeArgumentException(
+ "There are no valid artifact types available for the branch " + topLevelBranch);
+ }
+ return artifactTypes;
+ } else {
+ return ArtifactTypeManager.getAllTypes();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordAttribute.java
new file mode 100644
index 00000000000..403b18245da
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordAttribute.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.framework.skynet.core.attribute;
+
+import java.io.InputStream;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.XmlTextInputStream;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.word.WordAnnotationHandler;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WordAttribute extends StringAttribute {
+ public static final String WORD_TEMPLATE_CONTENT = "Word Template Content";
+ public static final String WHOLE_WORD_CONTENT = "Whole Word Content";
+ public static final String OLE_DATA_NAME = "Word Ole Data";
+ public static boolean noPopUps = false;
+ public static String displayTrackedChangesErrorMessage = "";
+
+ /**
+ * wraps the value in a simple word paragraph
+ *
+ * @param attributeType
+ * @param value
+ */
+ public WordAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ displayTrackedChangesErrorMessage = "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#setValue(java.lang.Object)
+ */
+ @Override
+ public boolean subClassSetValue(String value) throws OseeCoreException {
+ // Do not allow save on tracked changes except on three way merges
+ if (WordAnnotationHandler.containsWordAnnotations(value) && getArtifact().getBranch().getBranchType() != BranchType.MERGE) {
+ displayTrackedChangesErrorMessage = "Cannot save - Detected tracked changes on this artifact. ";
+ throw new OseeArgumentException(displayTrackedChangesErrorMessage);
+ } else {
+ value = WordUtil.removeWordMarkupSmartTags(value);
+ return super.subClassSetValue(value);
+ }
+ }
+
+ public boolean containsWordAnnotations() throws OseeCoreException {
+ String temp = getValue();
+ return WordAnnotationHandler.containsWordAnnotations(temp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute#getDisplayableString()
+ */
+ @Override
+ public String getDisplayableString() throws OseeCoreException {
+ InputStream inputStream = null;
+ try {
+ inputStream = new XmlTextInputStream(getValue());
+ return Lib.inputStreamToString(inputStream);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+ }
+ }
+ }
+
+ /**
+ * Mainly used for testing purposes
+ *
+ * @return the noPopUps
+ */
+ public static boolean isNoPopUps() {
+ return noPopUps;
+ }
+
+ /**
+ * Mainly used for testing purposes
+ *
+ * @param noPopUps the noPopUps to set
+ */
+ public static void setNoPopUps(boolean noPopUps) {
+ WordAttribute.noPopUps = noPopUps;
+ }
+
+ /**
+ * Mainly used for testing purposes
+ *
+ * @return the displayTrackedChangesErrorMessage
+ */
+ public static String getDisplayTrackedChangesErrorMessage() {
+ return displayTrackedChangesErrorMessage;
+ }
+
+ /**
+ * Mainly used for testing purposes
+ *
+ * @param displayTrackedChangesErrorMessage the displayTrackedChangesErrorMessage to set
+ */
+ public static void setDisplayTrackedChangesErrorMessage(String displayTrackedChangesErrorMessage) {
+ WordAttribute.displayTrackedChangesErrorMessage = displayTrackedChangesErrorMessage;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordTemplateAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordTemplateAttribute.java
new file mode 100644
index 00000000000..a50d6187082
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordTemplateAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WordTemplateAttribute extends WordAttribute {
+
+ public WordTemplateAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordWholeDocumentAttribute.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordWholeDocumentAttribute.java
new file mode 100644
index 00000000000..80d3c52505f
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/WordWholeDocumentAttribute.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.framework.skynet.core.attribute;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WordWholeDocumentAttribute extends WordAttribute {
+ private static final String wordLeader1 =
+ "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" + "<?mso-application progid='Word.Document'?>";
+ private static final String wordLeader2 =
+ "<w:wordDocument xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:w10='urn:schemas-microsoft-com:office:word' xmlns:sl='http://schemas.microsoft.com/schemaLibrary/2003/core' xmlns:aml='http://schemas.microsoft.com/aml/2001/core' xmlns:wx='http://schemas.microsoft.com/office/word/2003/auxHint' xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:wsp='http://schemas.microsoft.com/office/word/2003/wordml/sp2' xmlns:ns0='http://www.w3.org/2001/XMLSchema' xmlns:ns1='http://eclipse.org/artifact.xsd' xmlns:st1='urn:schemas-microsoft-com:office:smarttags' w:macrosPresent='no' w:embeddedObjPresent='no' w:ocxPresent='no' xml:space='preserve'>";
+ private static final String wordBody = "<w:body></w:body>";
+ private static final String wordTrailer = "</w:wordDocument> ";
+ private static final String emptyDocumentContent = wordLeader1 + wordLeader2 + wordBody + wordTrailer;
+
+ /**
+ * @param attributeType
+ * @param value
+ */
+ public WordWholeDocumentAttribute(AttributeType attributeType, Artifact artifact) {
+ super(attributeType, artifact);
+ }
+
+ public static String getEmptyDocumentContent() {
+ return emptyDocumentContent;
+ }
+
+ // /* (non-Javadoc)
+ // * @see org.eclipse.osee.framework.skynet.core.attribute.StringAttribute#initializeDefaultValue()
+ // */
+ // @Override
+ // public void initializeToDefaultValue() {
+ // String value = getAttributeType().getDefaultValue();
+ // if (value == null || value.matches("")) {
+ // value = emptyDocumentContent;
+ // }
+ // subClassSetValue(value);
+ // }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/AbstractAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/AbstractAttributeDataProvider.java
new file mode 100644
index 00000000000..807c037bc77
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/AbstractAttributeDataProvider.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.framework.skynet.core.attribute.providers;
+
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractAttributeDataProvider implements IAttributeDataProvider {
+ private Attribute<?> attribute;
+
+ /**
+ * @param attribute
+ */
+ public AbstractAttributeDataProvider(Attribute<?> attribute) {
+ super();
+ this.attribute = attribute;
+ }
+
+ /**
+ * @return the attribute
+ */
+ protected Attribute<?> getAttribute() {
+ return attribute;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ClobAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ClobAttributeDataProvider.java
new file mode 100644
index 00000000000..0717b5423fa
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ClobAttributeDataProvider.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.framework.skynet.core.attribute.providers;
+
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ClobAttributeDataProvider extends DefaultAttributeDataProvider {
+ /**
+ * @param attributeStateManager
+ */
+ public ClobAttributeDataProvider(Attribute<?> attribute) {
+ super(attribute);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DataStore.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DataStore.java
new file mode 100644
index 00000000000..41a5805a18e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DataStore.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.framework.skynet.core.attribute.providers;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Arrays;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.AbstractResourceProcessor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataStore {
+ private AbstractResourceProcessor resourceProcessor;
+ private String locator;
+ private byte[] rawContent;
+ private String contentType;
+ private String encoding;
+ private String extension;
+ private boolean needToReadFromRemote;
+
+ public DataStore(AbstractResourceProcessor resourceProcessor) {
+ super();
+ this.resourceProcessor = resourceProcessor;
+ clear();
+ this.needToReadFromRemote = true;
+ }
+
+ public String getLocator() {
+ return this.locator;
+ }
+
+ public void setLocator(String locator) {
+ this.locator = locator;
+ needToReadFromRemote = true;
+ }
+
+ public boolean isLocatorValid() {
+ return this.locator != null && this.locator.length() > 0;
+ }
+
+ public boolean isDataValid() {
+ return this.rawContent != null && this.rawContent.length > 0;
+ }
+
+ public InputStream getInputStream() throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ return new ByteArrayInputStream(getContent());
+ }
+
+ public byte[] getContent() throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ if (isLocatorValid() != false && needToReadFromRemote) {
+ resourceProcessor.acquire(this);
+ needToReadFromRemote = false;
+ }
+ return this.rawContent;
+ }
+
+ public void setContent(byte[] rawContent, String extension, String contentType, String encoding) {
+ this.rawContent = rawContent;
+ this.contentType = contentType;
+ this.encoding = encoding;
+ this.extension = extension;
+ }
+
+ public void copyTo(DataStore other) {
+ other.rawContent = Arrays.copyOf(this.rawContent, this.rawContent.length);
+ other.contentType = this.contentType;
+ other.encoding = this.encoding;
+ }
+
+ public void persist(int storageId) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ if (this.rawContent != null && this.rawContent.length > 0) {
+ resourceProcessor.saveResource(storageId, resourceProcessor.getStorageName(), this);
+ }
+ }
+
+ public void purge() throws OseeDataStoreException {
+ if (isLocatorValid() != false) {
+ resourceProcessor.purge(this);
+ }
+ }
+
+ /**
+ * @return the contentType
+ */
+ public String getContentType() {
+ return contentType;
+ }
+
+ /**
+ * @return the encoding
+ */
+ public String getEncoding() {
+ return encoding;
+ }
+
+ public void clear() {
+ setContent(null, "txt", "txt/plain", "UTF-8");
+ setLocator(null);
+ }
+
+ /**
+ * @return the extension
+ */
+ public String getExtension() {
+ return extension;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DefaultAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DefaultAttributeDataProvider.java
new file mode 100644
index 00000000000..c3820831264
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/DefaultAttributeDataProvider.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute.providers;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeResourceProcessor;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.BinaryContentUtils;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DefaultAttributeDataProvider extends AbstractAttributeDataProvider implements ICharacterAttributeDataProvider {
+
+ private static final int MAX_VARCHAR_LENGTH = 4000;
+ private String rawStringValue;
+
+ private final DataStore dataStore;
+
+ /**
+ * @param attributeStateManager
+ */
+ public DefaultAttributeDataProvider(Attribute<?> attribute) {
+ super(attribute);
+ this.dataStore = new DataStore(new AttributeResourceProcessor(attribute));
+ this.rawStringValue = "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.AbstractAttributeDataProvider#getDisplayableString()
+ */
+ @Override
+ public String getDisplayableString() throws OseeCoreException {
+ return getValueAsString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.AbstractAttributeDataProvider#setDisplayableString(java.lang.String)
+ */
+ @Override
+ public void setDisplayableString(String toDisplay) throws OseeDataStoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.ICharacterAttributeDataProvider#getValueAsString()
+ */
+ @Override
+ public String getValueAsString() throws OseeCoreException {
+ String fromStorage = null;
+ byte[] data = null;
+ try {
+ data = dataStore.getContent();
+ if (data != null) {
+ data = Lib.decompressBytes(new ByteArrayInputStream(data));
+ fromStorage = new String(data, "UTF-8");
+ }
+ } catch (IOException ex) {
+ throw new OseeWrappedException("Error retrieving data.", ex);
+ }
+ String toReturn = fromStorage != null ? fromStorage : rawStringValue;
+ return toReturn != null ? toReturn : "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.ICharacterAttributeDataProvider#setValue(java.lang.String)
+ */
+ @Override
+ public boolean setValue(String value) throws OseeCoreException {
+ boolean response = false;
+ if (getValueAsString() == value || (getValueAsString() != null && getValueAsString().equals(value))) {
+ response = false;
+ } else {
+ storeValue(value);
+ response = true;
+ }
+ return response;
+ }
+
+ private String getInternalFileName() throws OseeCoreException {
+ return BinaryContentUtils.generateFileName(getAttribute());
+ }
+
+ private void storeValue(String value) throws OseeCoreException {
+ if (value != null && value.length() > MAX_VARCHAR_LENGTH) {
+ try {
+ byte[] compressed =
+ Lib.compressStream(new ByteArrayInputStream(value.getBytes("UTF-8")), getInternalFileName());
+ dataStore.setContent(compressed, "zip", "application/zip", "ISO-8859-1");
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ } else {
+ this.rawStringValue = value;
+ dataStore.clear();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IDataAccessObject#getData()
+ */
+ @Override
+ public Object[] getData() throws OseeDataStoreException {
+ return new Object[] {rawStringValue, dataStore.getLocator()};
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IDataAccessObject#loadData(java.lang.Object[])
+ */
+ @Override
+ public void loadData(Object... objects) throws OseeCoreException {
+ if (objects != null && objects.length > 1) {
+ storeValue((String) objects[0]);
+ dataStore.setLocator((String) objects[1]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IDataAccessObject#persist()
+ */
+ @Override
+ public void persist(int storageId) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ dataStore.persist(storageId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#purge()
+ */
+ @Override
+ public void purge() throws OseeCoreException {
+ dataStore.purge();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IAttributeDataProvider.java
new file mode 100644
index 00000000000..3e2b27f5bbf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IAttributeDataProvider.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.framework.skynet.core.attribute.providers;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAttributeDataProvider {
+
+ public String getDisplayableString() throws OseeCoreException;
+
+ public void setDisplayableString(String toDisplay) throws OseeDataStoreException;
+
+ public void loadData(Object... objects) throws OseeCoreException;
+
+ public Object[] getData() throws OseeDataStoreException;
+
+ public void persist(int storageId) throws OseeCoreException;
+
+ public void purge() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IBinaryAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IBinaryAttributeDataProvider.java
new file mode 100644
index 00000000000..dc00a9839be
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/IBinaryAttributeDataProvider.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.framework.skynet.core.attribute.providers;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IBinaryAttributeDataProvider extends IAttributeDataProvider {
+
+ public ByteBuffer getValueAsBytes() throws OseeCoreException;
+
+ public boolean setValue(ByteBuffer data) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ICharacterAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ICharacterAttributeDataProvider.java
new file mode 100644
index 00000000000..b94a510a804
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/ICharacterAttributeDataProvider.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.framework.skynet.core.attribute.providers;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ICharacterAttributeDataProvider extends IAttributeDataProvider {
+
+ public String getValueAsString() throws OseeCoreException;
+
+ public boolean setValue(String value) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/UriAttributeDataProvider.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/UriAttributeDataProvider.java
new file mode 100644
index 00000000000..484f4d7d856
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/providers/UriAttributeDataProvider.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.attribute.providers;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeResourceProcessor;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.AbstractResourceProcessor;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.BinaryContentUtils;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UriAttributeDataProvider extends AbstractAttributeDataProvider implements ICharacterAttributeDataProvider, IBinaryAttributeDataProvider {
+ private DataStore dataStore;
+ private String displayable;
+
+ public UriAttributeDataProvider(Attribute<?> attribute) {
+ super(attribute);
+ AbstractResourceProcessor abstractResourceProcessor = new AttributeResourceProcessor(attribute);
+ this.dataStore = new DataStore(abstractResourceProcessor);
+ this.displayable = "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.IAttributeDataProvider#getDisplayableString()
+ */
+ @Override
+ public String getDisplayableString() throws OseeDataStoreException {
+ return displayable;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.IAttributeDataProvider#setDisplayableString(java.lang.String)
+ */
+ @Override
+ public void setDisplayableString(String toDisplay) throws OseeDataStoreException {
+ this.displayable = toDisplay;
+ }
+
+ private String getInternalFileName() throws OseeCoreException {
+ return BinaryContentUtils.generateFileName(getAttribute());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.IAttributeDataProvider#setValue(ByteBuffer)
+ */
+ @Override
+ public boolean setValue(ByteBuffer data) throws OseeCoreException {
+ boolean response = false;
+ try {
+ if (!Arrays.equals(dataStore.getContent(), data != null ? data.array() : null)) {
+ if (data != null) {
+ byte[] compressed;
+ compressed = Lib.compressStream(Lib.byteBufferToInputStream(data), getInternalFileName());
+ dataStore.setContent(compressed, "zip", "application/zip", "ISO-8859-1");
+ response = true;
+ } else {
+ String loc = dataStore.getLocator();
+ dataStore.clear();
+ dataStore.setLocator(loc);
+ }
+ }
+ } catch (IOException ex) {
+ throw new OseeWrappedException("Error committing data. ", ex);
+ }
+ return response;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.IAttributeDataProvider#getValueAsBytes()
+ */
+ @Override
+ public ByteBuffer getValueAsBytes() throws OseeCoreException {
+ ByteBuffer decompressed = null;
+ byte[] rawData = dataStore.getContent();
+ if (rawData != null) {
+ try {
+ decompressed = ByteBuffer.wrap(Lib.decompressBytes(new ByteArrayInputStream(rawData)));
+ } catch (IOException ex) {
+ throw new OseeWrappedException("Error acquiring data. - ", ex);
+ }
+ }
+
+ return decompressed;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.data.IStringAttributeDataProvider#getValueAsString()
+ */
+ @Override
+ public String getValueAsString() throws OseeCoreException {
+ String toReturn = null;
+ ByteBuffer data = getValueAsBytes();
+ if (data != null) {
+ try {
+ toReturn = new String(data.array(), "UTF-8");
+ } catch (UnsupportedEncodingException ex) {
+ throw new OseeWrappedException("Error encoding data.", ex);
+ }
+ } else {
+ toReturn = "";
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.data.IStringAttributeDataProvider#setValue(java.lang.String)
+ */
+ @Override
+ public boolean setValue(String value) throws OseeCoreException {
+ ByteBuffer toSet = null;
+ if (value != null) {
+ try {
+ toSet = ByteBuffer.wrap(value.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ throw new OseeWrappedException("Error encoding data.", ex);
+ }
+ }
+ setValue(toSet);
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IDataAccessObject#getData()
+ */
+ @Override
+ public Object[] getData() throws OseeDataStoreException {
+ return new Object[] {"", dataStore.getLocator()};
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IDataAccessObject#loadData(java.lang.Object[])
+ */
+ @Override
+ public void loadData(Object... objects) throws OseeCoreException {
+ if (objects != null && objects.length > 1) {
+ dataStore.setLocator((String) objects[1]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IDataAccessObject#persist()
+ */
+ @Override
+ public void persist(int storageId) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ dataStore.persist(storageId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#purge()
+ */
+ @Override
+ public void purge() throws OseeCoreException {
+ dataStore.purge();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AbstractResourceProcessor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AbstractResourceProcessor.java
new file mode 100644
index 00000000000..35b2f1e020f
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AbstractResourceProcessor.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.framework.skynet.core.attribute.utils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URL;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.DataStore;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractResourceProcessor {
+
+ protected abstract URL getAcquireURL(DataStore dataStore) throws OseeDataStoreException, OseeAuthenticationRequiredException;
+
+ protected abstract URL getDeleteURL(DataStore dataStore) throws OseeDataStoreException, OseeAuthenticationRequiredException;
+
+ protected abstract URL getStorageURL(int seed, String name, String extension) throws OseeDataStoreException, OseeAuthenticationRequiredException;
+
+ public abstract String getStorageName();
+
+ public void saveResource(int seed, String name, DataStore dataStore) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ URL url = getStorageURL(seed, name, dataStore.getExtension());
+ InputStream inputStream = dataStore.getInputStream();
+ try {
+ URI uri = HttpProcessor.save(url, inputStream, dataStore.getContentType(), dataStore.getEncoding());
+ dataStore.setLocator(uri.toASCIIString());
+ } catch (Exception ex) {
+ throw new OseeDataStoreException("Error saving resource", ex);
+ } finally {
+ try {
+ inputStream.close();
+ } catch (Exception ex) {
+ throw new OseeDataStoreException("Error closing stream during save resource", ex);
+ }
+ }
+ }
+
+ public void acquire(DataStore dataStore) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ URL url = getAcquireURL(dataStore);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ AcquireResult result;
+ try {
+ result = HttpProcessor.acquire(url, outputStream);
+ } catch (Exception ex) {
+ throw new OseeDataStoreException(String.format("Error acquiring resource: [%s]", dataStore.getLocator()), ex);
+ }
+
+ int code = result.getCode();
+ if (code == HttpURLConnection.HTTP_OK) {
+ dataStore.setContent(outputStream.toByteArray(), "", result.getContentType(), result.getEncoding());
+ } else {
+ throw new OseeDataStoreException(String.format("Error acquiring resource: [%s] - status code: [%s]; %s",
+ dataStore.getLocator(), code, new String(outputStream.toByteArray())));
+ }
+ }
+
+ public void purge(DataStore dataStore) throws OseeDataStoreException {
+ int code = -1;
+ try {
+ URL url = getDeleteURL(dataStore);
+ String response = HttpProcessor.delete(url);
+ if (response != null && response.equals("Deleted: " + dataStore.getLocator())) {
+ dataStore.clear();
+ }
+ } catch (Exception ex) {
+ throw new OseeDataStoreException(String.format("Error deleting resource: [%s] - status code: [%s]",
+ dataStore.getLocator(), code), ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AttributeURL.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AttributeURL.java
new file mode 100644
index 00000000000..708e46b648a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/AttributeURL.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.framework.skynet.core.attribute.utils;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeURL {
+
+ private AttributeURL() {
+ }
+
+ public static URL getStorageURL(int gammaId, String artifactHrid, String extension) throws OseeDataStoreException, MalformedURLException, OseeAuthenticationRequiredException {
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("protocol", "attr");
+ parameterMap.put("seed", Integer.toString(gammaId));
+ parameterMap.put("name", artifactHrid);
+ if (Strings.isValid(extension) != false) {
+ parameterMap.put("extension", extension);
+ }
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+ return new URL(urlString);
+ }
+
+ private static URL generatePathURL(String uri) throws OseeDataStoreException {
+ try {
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("uri", uri);
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+ return new URL(urlString);
+ } catch (Exception ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ public static URL getAcquireURL(String uri) throws OseeDataStoreException {
+ return generatePathURL(uri);
+ }
+
+ public static URL getDeleteURL(String uri) throws OseeDataStoreException {
+ return generatePathURL(uri);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/BinaryContentUtils.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/BinaryContentUtils.java
new file mode 100644
index 00000000000..d2fae0d7f66
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/attribute/utils/BinaryContentUtils.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.framework.skynet.core.attribute.utils;
+
+import java.net.HttpURLConnection;
+import java.net.URLEncoder;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BinaryContentUtils {
+
+ private final static int MAX_NAME_SIZE = 60;
+
+ private BinaryContentUtils() {
+ }
+
+ public static String getContentType(String extension) {
+ String contentType = null;
+ if (Strings.isValid(extension)) {
+ contentType = HttpURLConnection.guessContentTypeFromName("dummy." + extension);
+ } else {
+ contentType = "application/*";
+ }
+ return contentType;
+ }
+
+ public static String generateFileName(Attribute<?> attribute) throws OseeCoreException {
+ StringBuilder builder = new StringBuilder();
+ try {
+ String name = attribute.getArtifact().getDescriptiveName();
+ if (name.length() > MAX_NAME_SIZE) {
+ name = name.substring(0, MAX_NAME_SIZE);
+ }
+ builder.append(URLEncoder.encode(name, "UTF-8"));
+ builder.append(".");
+ } catch (Exception ex) {
+ // Do Nothing - this is not important
+ }
+ builder.append(attribute.getArtifact().getHumanReadableId());
+
+ String fileTypeExtension = getExtension(attribute);
+ if (Strings.isValid(fileTypeExtension)) {
+ builder.append(".");
+ builder.append(fileTypeExtension);
+ }
+ return builder.toString();
+ }
+
+ private static String getExtension(Attribute<?> attribute) throws OseeCoreException {
+ String fileTypeExtension = attribute.getAttributeType().getFileTypeExtension();
+ if (attribute.isOfType("Native Content")) {
+ fileTypeExtension = attribute.getArtifact().getSoleAttributeValue("Extension");
+ }
+ return fileTypeExtension;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ArtifactChanged.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ArtifactChanged.java
new file mode 100644
index 00000000000..07c29591bd9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ArtifactChanged.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.change;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactChanged extends Change {
+ private ArtifactType artifactSubtypeDescriptor;
+ private ArtifactChange artifactChange;
+
+ /**
+ * @param artTypeId
+ * @param artName
+ * @param sourceGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param modType
+ * @param changeType
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public ArtifactChanged(Branch branch, int artTypeId, int sourceGamma, int artId, TransactionId toTransactionId, TransactionId fromTransactionId, ModificationType modType, ChangeType changeType, boolean isHistorical) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ super(branch, artTypeId, sourceGamma, artId, toTransactionId, fromTransactionId, modType, changeType,
+ isHistorical);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getName()
+ */
+ @Override
+ public String getName() throws IllegalArgumentException, ArtifactDoesNotExist, MultipleArtifactsExist {
+ return getArtifactName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getTypeName()
+ */
+ @Override
+ public String getItemTypeName() throws OseeCoreException {
+ return getArtifactType().getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getValue()
+ */
+ @Override
+ public String getIsValue() {
+ return "";
+ }
+
+ private ArtifactChange getArtifactChange() throws OseeCoreException {
+ if (artifactChange == null) {
+ artifactChange =
+ new ArtifactChange(getChangeType(), getModificationType(), getArtifact(), null, null,
+ getFromTransactionId(), getFromTransactionId(), getToTransactionId(), getGamma(), isHistorical());
+ }
+ return artifactChange;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ try {
+ // this is a temporary fix until the old change report goes away.
+ if (adapter.isInstance(getArtifactChange())) {
+ return getArtifactChange();
+ }
+ if (adapter.isInstance(getArtifact())) {
+ return getArtifactChange().getArtifact();
+ }
+ if (adapter.isInstance(getToTransactionId()) && isHistorical()) {
+ return getToTransactionId();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getItemKind()
+ */
+ @Override
+ public String getItemKind() {
+ return "Artifact";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getWasValue()
+ */
+ @Override
+ public String getWasValue() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getItemTypeId()
+ */
+ @Override
+ public int getItemTypeId() {
+ return getArtifactType().getArtTypeId();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/AttributeChanged.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/AttributeChanged.java
new file mode 100644
index 00000000000..374f8a6d735
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/AttributeChanged.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.framework.skynet.core.change;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AttributeChanged extends Change {
+ private final String isValue;
+ private String wasValue;
+ private final int attrId;
+ private final int attrTypeId;
+ private AttributeType dynamicAttributeDescriptor;
+ private ArtifactChange artifactChange;
+ private final ModificationType artModType;
+
+ /**
+ * @param sourceGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param modType
+ * @param changeType
+ * @param isValue
+ * @param sourceContent
+ * @param attrId
+ * @param attrTypeId
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public AttributeChanged(Branch branch, int artTypeId, int sourceGamma, int artId, TransactionId toTransactionId, TransactionId fromTransactionId, ModificationType modType, ChangeType changeType, String isValue, String wasValue, int attrId, int attrTypeId, ModificationType artModType, boolean isHistorical) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ super(branch, artTypeId, sourceGamma, artId, toTransactionId, fromTransactionId, modType, changeType,
+ isHistorical);
+ this.isValue = isValue;
+ this.wasValue = wasValue;
+ this.attrId = attrId;
+ this.attrTypeId = attrTypeId;
+ this.artModType = artModType;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof AttributeChanged) {
+ AttributeChanged change = (AttributeChanged) obj;
+ return super.equals(obj) &&
+ //
+ change.getArtId() == attrTypeId &&
+ //
+ change.getArtModType() == artModType &&
+ //
+ change.getAttrId() == attrId;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() + attrTypeId + artModType.hashCode() + attrId;
+ }
+
+ /**
+ * @return the attrId
+ */
+ public int getAttrId() {
+ return attrId;
+ }
+
+ /**
+ * @return the attrTypeId
+ */
+ public int getAttrTypeId() {
+ return attrTypeId;
+ }
+
+ /**
+ * @return the dynamicAttributeDescriptor
+ */
+ public AttributeType getDynamicAttributeDescriptor() throws Exception {
+ if (dynamicAttributeDescriptor == null) {
+ dynamicAttributeDescriptor = AttributeTypeManager.getType(attrTypeId);
+ }
+ return dynamicAttributeDescriptor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getName()
+ */
+ @Override
+ public String getName() throws IllegalArgumentException, ArtifactDoesNotExist, MultipleArtifactsExist {
+ return getArtifactName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getTypeName()
+ */
+ @Override
+ public String getItemTypeName() throws Exception {
+ return getDynamicAttributeDescriptor().getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getItemKind()
+ */
+ @Override
+ public String getItemKind() {
+ return "Attribute";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getValue()
+ */
+ @Override
+ public String getIsValue() {
+ return isValue != null ? isValue : "";
+ }
+
+ /**
+ * @return the wasValue
+ */
+ @Override
+ public String getWasValue() {
+ return wasValue;
+ }
+
+ /**
+ * @param wasValue the wasValue to set
+ */
+ public void setWasValue(String wasValue) {
+ this.wasValue = wasValue;
+ }
+
+ private ArtifactChange getArtifactChange() throws ArtifactDoesNotExist {
+ if (artifactChange == null) {
+ artifactChange =
+ new ArtifactChange(getChangeType(), getArtModType(), getArtifact(), null, null, getFromTransactionId(),
+ getFromTransactionId(), getToTransactionId(), getGamma(), isHistorical());
+ }
+ return artifactChange;
+ }
+
+ public Attribute<?> getAttribute() throws OseeCoreException {
+ for (Attribute<?> attribute : getArtifact().getAttributes(true)) {
+ if (attribute.getAttrId() == attrId) {
+ return attribute;
+ }
+ }
+ throw new AttributeDoesNotExist(String.format("Could not find Attribute %d on Artifact %d", attrId, getArtId()));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ try {
+ // this is a temporary fix until the old change report goes away.
+ if (adapter.isInstance(getArtifactChange())) {
+ return getArtifactChange();
+ }
+ if (adapter.isInstance(getArtifact())) {
+ return getArtifactChange().getArtifact();
+ }
+ if (adapter.isInstance(getToTransactionId()) && isHistorical()) {
+ return getToTransactionId();
+ }
+ try {
+ if (adapter.isInstance(getAttribute())) {
+ return getAttribute();
+ }
+ } catch (AttributeDoesNotExist ex) {
+ return null;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /**
+ * @return the artModType
+ */
+ public ModificationType getArtModType() {
+ return artModType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getItemTypeId()
+ */
+ @Override
+ public int getItemTypeId() {
+ return attrTypeId;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/Change.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/Change.java
new file mode 100644
index 00000000000..c8831252c88
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/Change.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.change;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class Change implements IAdaptable {
+
+ private final int sourceGamma;
+ private final int artId;
+ private final TransactionId toTransactionId;
+ private TransactionId fromTransactionId;
+ private Artifact artifact;
+ private ModificationType modType;
+ private final ChangeType changeType;
+ private Branch branch;
+ private final ArtifactType artifactType;
+ private final boolean isHistorical;
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param modType
+ * @param changeType
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public Change(Branch branch, int artTypeId, int sourceGamma, int artId, TransactionId toTransactionId, TransactionId fromTransactionId, ModificationType modType, ChangeType changeType, boolean isHistorical) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ super();
+ this.branch = branch;
+ this.sourceGamma = sourceGamma;
+ this.artId = artId;
+ this.toTransactionId = toTransactionId;
+ this.fromTransactionId = fromTransactionId;
+ this.modType = modType;
+ this.changeType = changeType;
+ this.artifactType = ArtifactTypeManager.getType(artTypeId);
+ this.isHistorical = isHistorical;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Change) {
+ Change change = (Change) obj;
+ return change.getArtId() == artId &&
+ //
+ change.getGamma() == sourceGamma &&
+ //
+ change.getBranch() == branch &&
+ //
+ change.getToTransactionId() == toTransactionId &&
+ //
+ change.getFromTransactionId() == fromTransactionId &&
+ //
+ change.getModificationType() == modType &&
+ //
+ change.getChangeType() == changeType;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return artId + sourceGamma + branch.hashCode() + toTransactionId.hashCode() + fromTransactionId.hashCode() + modType.hashCode() + changeType.hashCode();
+ }
+
+ public boolean isHistorical() {
+ return isHistorical;
+ }
+
+ /**
+ * @param modType the modType to set
+ */
+ public void setModType(ModificationType modType) {
+ this.modType = modType;
+ }
+
+ /**
+ * @return the modification type (New, Modified, Deleted)
+ */
+ public ModificationType getModificationType() {
+ return modType;
+ }
+
+ /**
+ * @return the changeType
+ */
+ public ChangeType getChangeType() {
+ return changeType;
+ }
+
+ /**
+ * @return the artifact
+ * @throws ArtifactDoesNotExist
+ * @throws IllegalArgumentException
+ * @throws MultipleArtifactsExist
+ * @throws ArtifactDoesNotExist
+ */
+ public Artifact getArtifact() throws ArtifactDoesNotExist {
+ if (artifact == null) {
+ if (isHistorical()) {
+ artifact = ArtifactCache.getHistorical(artId, getToTransactionId().getTransactionNumber());
+ } else {
+ artifact = ArtifactCache.getActive(artId, branch);
+ }
+ }
+
+ if (artifact == null) {
+ throw new ArtifactDoesNotExist(
+ "Artifact: " + artId + " Does not exist on branch: " + branch.getBranchName() + " branch id: " + branch.getBranchId());
+ }
+ return artifact;
+ }
+
+ public String getArtifactName() throws IllegalArgumentException, ArtifactDoesNotExist, MultipleArtifactsExist {
+ return getArtifact().getInternalDescriptiveName();
+ }
+
+ /**
+ * @return the sourceGamma
+ */
+ public int getGamma() {
+ return sourceGamma;
+ }
+
+ /**
+ * @return the artId
+ */
+ public int getArtId() {
+ return artId;
+ }
+
+ /**
+ * @return the toTransactionId
+ */
+ public TransactionId getToTransactionId() {
+ return toTransactionId;
+ }
+
+ /**
+ * @return the fromTransactionId
+ */
+ public TransactionId getFromTransactionId() {
+ return fromTransactionId;
+ }
+
+ /**
+ * For an artifact change this is the artifact type id. For an attribute this is the attribute type id. For a
+ * relation this is the relation type id.
+ *
+ * @return typeId
+ */
+ public abstract int getItemTypeId();
+
+ /**
+ * @return the artifactType
+ */
+ public ArtifactType getArtifactType() {
+ return artifactType;
+ }
+
+ /**
+ * @return the branch
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /**
+ * @param fromTransactionId the fromTransactionId to set
+ */
+ public void setFromTransactionId(TransactionId fromTransactionId) {
+ this.fromTransactionId = fromTransactionId;
+ }
+
+ public abstract String getIsValue();
+
+ public abstract String getWasValue();
+
+ public abstract String getItemTypeName() throws Exception;
+
+ public abstract String getName() throws IllegalArgumentException, ArtifactDoesNotExist, MultipleArtifactsExist;
+
+ public abstract String getItemKind();
+
+ /**
+ * @param branch the branch to set
+ */
+ public void setBranch(Branch branch) {
+ this.branch = branch;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ChangeType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ChangeType.java
new file mode 100644
index 00000000000..cad7ec15a72
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/ChangeType.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.framework.skynet.core.change;
+
+import java.io.Serializable;
+
+/**
+ * Values for Change Types.
+ *
+ * @author Robert A. Fisher
+ */
+public enum ChangeType implements Serializable {
+ INCOMING, OUTGOING, CONFLICTING
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/RelationChanged.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/RelationChanged.java
new file mode 100644
index 00000000000..816af393626
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/change/RelationChanged.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.change;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class RelationChanged extends Change {
+
+ private int bArtId;
+ private String bArtName;
+ private Artifact bArtifact;
+ private int relLinkId;
+ private String rationale;
+ private int aLinkOrder;
+ private int bLinkOrder;
+ private RelationType relationType;
+
+ /**
+ * @param aArtTypeId
+ * @param sourceGamma
+ * @param aArtId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param modType
+ * @param changeType
+ * @param bArtId
+ * @param bArtifact
+ * @param relLinkId
+ * @param rationale
+ * @param aLinkOrder
+ * @param relationType
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public RelationChanged(Branch branch, int aArtTypeId, int sourceGamma, int aArtId, TransactionId toTransactionId, TransactionId fromTransactionId, ModificationType modType, ChangeType changeType, int bArtId, int relLinkId, String rationale, int aLinkOrder, int bLinkOrder, RelationType relationType, boolean isHistorical) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ super(branch, aArtTypeId, sourceGamma, aArtId, toTransactionId, fromTransactionId, modType, changeType,
+ isHistorical);
+ this.bArtId = bArtId;
+ this.relLinkId = relLinkId;
+ this.rationale = rationale;
+ this.aLinkOrder = aLinkOrder;
+ this.bLinkOrder = bLinkOrder;
+ this.relationType = relationType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ try {
+ // this is a temporary fix until the old change report goes away.
+ if (adapter.isInstance(getArtifact())) {
+ return getArtifact();
+ }
+ if (adapter.isInstance(getToTransactionId()) && isHistorical()) {
+ return getToTransactionId();
+ }
+ } catch (IllegalArgumentException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /**
+ * @return the bArtId
+ */
+ public int getBArtId() {
+ return bArtId;
+ }
+
+ /**
+ * @return the bArtifact
+ * @throws ArtifactDoesNotExist
+ */
+ public Artifact getBArtifact() throws ArtifactDoesNotExist {
+ if (bArtifact == null) {
+ if (isHistorical()) {
+ bArtifact = ArtifactCache.getHistorical(bArtId, getToTransactionId().getTransactionNumber());
+ } else {
+ bArtifact = ArtifactCache.getActive(bArtId, getBranch());
+ }
+ }
+
+ if (bArtifact == null) {
+ throw new ArtifactDoesNotExist(
+ "Artifact: " + bArtId + " Does not exist on branch: " + getBranch().getBranchName() + " branch id: " + getBranch().getBranchId());
+ }
+
+ return bArtifact;
+ }
+
+ /**
+ * @return the relLinkId
+ */
+ public int getRelLinkId() {
+ return relLinkId;
+ }
+
+ /**
+ * @return the rationale
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ /**
+ * @return the linkOrder
+ */
+ public int getLinkOrder() {
+ return aLinkOrder;
+ }
+
+ /**
+ * @return the relationType
+ */
+ public RelationType getRelationType() {
+ return relationType;
+ }
+
+ /**
+ * @return the bArtName
+ */
+ public String getBArtName() {
+ return bArtName;
+ }
+
+ /**
+ * @param artName the bArtName to set
+ */
+ public void setBArtName(String artName) {
+ bArtName = artName;
+ }
+
+ /**
+ * @return the bLinkOrder
+ */
+ public int getBLinkOrder() {
+ return bLinkOrder;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getName()
+ */
+ @Override
+ public String getName() throws IllegalArgumentException, ArtifactDoesNotExist, MultipleArtifactsExist {
+ return getArtifactName() + " <-> " + getBArtifact().getInternalDescriptiveName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getTypeName()
+ */
+ @Override
+ public String getItemTypeName() {
+ return relationType.getTypeName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getValue()
+ */
+ @Override
+ public String getIsValue() {
+ return getRationale();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getItemKind()
+ */
+ @Override
+ public String getItemKind() {
+ return "Relation";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getWasValue()
+ */
+ @Override
+ public String getWasValue() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.change.Change#getItemTypeId()
+ */
+ @Override
+ public int getItemTypeId() {
+ return relationType.getRelationTypeId();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CatchTrackedChanges.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CatchTrackedChanges.java
new file mode 100644
index 00000000000..db6dde45489
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CatchTrackedChanges.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.framework.skynet.core.commit.actions;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.change.AttributeChanged;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+
+/**
+ * @author Theron Virgin
+ */
+public class CatchTrackedChanges implements CommitAction {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.commit.actions.CommitAction#runCommitAction(org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ /**
+ * Check that none of the artifacts that will be commited contain tracked changes Use the change report to get
+ * attributeChanges and check their content for trackedChanges
+ */
+
+ @Override
+ public void runCommitAction(Branch branch) throws OseeCoreException {
+ Set<Artifact> changedArtifacts = new HashSet<Artifact>();
+
+ for (Change change : ChangeManager.getChangesPerBranch(branch, new EmptyMonitor())) {
+ if (!change.getModificationType().equals(ModificationType.DELETED)) {
+ if (change instanceof AttributeChanged) {
+ Attribute<?> attribute = ((AttributeChanged) change).getAttribute();
+ if (attribute instanceof WordAttribute) {
+ if (((WordAttribute) attribute).containsWordAnnotations()) {
+ throw new OseeCoreException(
+ String.format(
+ "Commit Branch Failed Artifact \"%s\" Art_ID \"%d\" contains Tracked Changes. Accept all revision changes and then recommit",
+ attribute.getArtifact().getSafeName(), attribute.getArtifact().getArtId()));
+ }
+ }
+ }
+ Artifact artifactChanged = change.getArtifact();
+ if (artifactChanged != null) {
+ changedArtifacts.add(artifactChanged);
+ }
+ }
+ }
+
+ int severityMask = IStatus.ERROR; // Only catch Errors not Warnings | IStatus.WARNING;
+ OseeValidator validator = OseeValidator.getInstance();
+ for (Artifact artifactChanged : changedArtifacts) {
+ IStatus status = validator.validate(IOseeValidator.LONG, artifactChanged);
+ try {
+ Operations.checkForStatusSeverityMask(status, severityMask);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(getArtifactErrorMessage(artifactChanged), ex);
+ }
+ }
+ }
+
+ private String getArtifactErrorMessage(Artifact artifact) {
+ return String.format("Error validating: [(%s)(%s) - %s] on branchId:[%s]", artifact.getArtId(),
+ artifact.getHumanReadableId(), artifact.getDescriptiveName(), artifact.getBranch().getBranchId());
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CommitAction.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CommitAction.java
new file mode 100644
index 00000000000..062c782f5b1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/commit/actions/CommitAction.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.framework.skynet.core.commit.actions;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author TheronVirgin
+ */
+public interface CommitAction {
+ public void runCommitAction(Branch branch) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflict.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflict.java
new file mode 100644
index 00000000000..d8d50a7285b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflict.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.conflict;
+
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.BranchMergeException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Theron Virgin
+ */
+public class ArtifactConflict extends Conflict {
+ private static final String CHANGE_ITEM = "Artifact State";
+ private static final String ARTIFACT_DELETED = "DELETED";
+ private static final String ARTIFACT_MODIFIED = "MODIFIED";
+ private final boolean sourceDeleted;
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param transactionType
+ * @param changeType
+ * @param mergeBranch
+ * @param sourceBranch
+ * @param destBranch
+ */
+ public ArtifactConflict(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, Branch mergeBranch, Branch sourceBranch, Branch destBranch, int sourceModType, int destModType, int artTypeId) {
+ super(sourceGamma, destGamma, artId, toTransactionId, null, mergeBranch, sourceBranch, destBranch);
+ sourceDeleted = (sourceModType == ModificationType.DELETED.getValue());
+ }
+
+ public String getArtifactName() throws OseeCoreException {
+ if (sourceDeleted) {
+ return getDestArtifact().getDescriptiveName();
+ } else {
+ return getSourceArtifact().getDescriptiveName();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#clearValue()
+ */
+ @Override
+ public boolean clearValue() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#computeStatus()
+ */
+ public ConflictStatus computeStatus() throws OseeCoreException {
+ if (!sourceDeleted)
+ return super.computeStatus(getObjectId(), ConflictStatus.NOT_RESOLVABLE);
+ else
+ return super.computeStatus(getObjectId(), ConflictStatus.INFORMATIONAL);
+
+ }
+
+ public int getObjectId() throws OseeCoreException {
+ return getArtifact().getArtId();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getChangeItem()
+ */
+ @Override
+ public String getChangeItem() {
+ return CHANGE_ITEM;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getConflictType()
+ */
+ @Override
+ public ConflictType getConflictType() {
+ return ConflictType.ARTIFACT;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getDestDisplayData()
+ */
+ @Override
+ public String getDestDisplayData() {
+ if (sourceDeleted) {
+ return ARTIFACT_MODIFIED;
+ } else {
+ return ARTIFACT_DELETED;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getMergeDisplayData()
+ */
+ @Override
+ public String getMergeDisplayData() {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getMergeValue()
+ */
+ protected Object getMergeValue() throws OseeCoreException {
+ return getArtifact();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getSourceDisplayData()
+ */
+ @Override
+ public String getSourceDisplayData() {
+ if (sourceDeleted) {
+ return ARTIFACT_DELETED;
+ } else {
+ return ARTIFACT_MODIFIED;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#mergeEqualsDestination()
+ */
+ @Override
+ public boolean mergeEqualsDestination() throws OseeCoreException {
+ return getDestArtifact().equals(getMergeValue());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#mergeEqualsSource()
+ */
+ @Override
+ public boolean mergeEqualsSource() throws OseeCoreException {
+ return getSourceArtifact().equals(getMergeValue());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#setToDest()
+ */
+ @Override
+ public boolean setToDest() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#setToSource()
+ */
+ @Override
+ public boolean setToSource() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#sourceEqualsDestination()
+ */
+ @Override
+ public boolean sourceEqualsDestination() {
+ return false;
+ }
+
+ public void revertSourceArtifact() throws OseeCoreException {
+ getSourceArtifact().revert();
+ }
+
+ public int getMergeGammaId() throws BranchMergeException {
+ throw new BranchMergeException("Artifact Conflicts can not be handled they must be reverted on the Source Branch");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#applyPreviousMerge(int)
+ */
+ @Override
+ public boolean applyPreviousMerge(int mergeBranchId, int destBranchId) throws OseeCoreException {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflictBuilder.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflictBuilder.java
new file mode 100644
index 00000000000..dc774785564
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ArtifactConflictBuilder.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.framework.skynet.core.conflict;
+
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Theron Virgin
+ */
+public class ArtifactConflictBuilder extends ConflictBuilder {
+ private int sourceModType;
+ private int destModType;
+ private int artTypeId;
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param transactionType
+ * @param sourceBranch
+ * @param destBranch
+ */
+ public ArtifactConflictBuilder(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, Branch sourceBranch, Branch destBranch, int sourceModType, int destModType, int artTypeId) {
+ super(sourceGamma, destGamma, artId, toTransactionId, sourceBranch, destBranch);
+ this.artTypeId = artTypeId;
+ this.sourceModType = sourceModType;
+ this.destModType = destModType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.ConflictBuilder#getConflict(org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ @Override
+ public Conflict getConflict(Branch mergeBranch, Set<Integer> artIdSet) throws OseeCoreException {
+ return new ArtifactConflict(sourceGamma, destGamma, artId, toTransactionId, mergeBranch, sourceBranch,
+ destBranch, sourceModType, destModType, artTypeId);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflict.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflict.java
new file mode 100644
index 00000000000..00e3ce58f46
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflict.java
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.conflict;
+
+import java.util.Collection;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MergeChangesInArtifactException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/*
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class AttributeConflict extends Conflict {
+ public static final String EMPTY_XML = "<w:p><w:r><w:t></w:t></w:r></w:p>";
+ public final static String NO_VALUE = "";
+ public final static String STREAM_DATA = "Stream data";
+ public final static String RESOLVE_MERGE_MARKUP =
+ "Can not mark as resolved an attribute that has merge markup. Finish merging the document to be able to resolve the conflict.";
+ public final static String DIFF_MERGE_MARKUP =
+ "Can not run a diff against an attribute that has merge markup. Finish merging the document to be able to resolve the conflict.";
+ private final int attrId;
+ private final int attrTypeId;
+ private Object sourceObject;
+ private Object destObject;
+ private Attribute<?> attribute = null;
+ private Attribute<?> sourceAttribute = null;
+ private Attribute<?> destAttribute = null;
+ private AttributeType attributeType;
+ private boolean isWordAttribute;
+ private boolean mergeEqualsSource;
+ private boolean mergeEqualsDest;
+ private boolean sourceEqualsDest;
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Merge"));
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param modType
+ * @param changeType
+ * @param sourceValue
+ * @param destValue
+ * @param sourceContent
+ * @param destContent
+ * @param image
+ * @param attrId
+ * @param attrTypeId
+ * @throws OseeCoreException
+ */
+ public AttributeConflict(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, String sourceValue, int attrId, int attrTypeId, Branch mergeBranch, Branch sourceBranch, Branch destBranch) throws OseeCoreException {
+ super(sourceGamma, destGamma, artId, toTransactionId, null, mergeBranch, sourceBranch, destBranch);
+ this.attrId = attrId;
+ this.attrTypeId = attrTypeId;
+ this.status = ConflictStatus.EDITED;
+ this.isWordAttribute = getAttribute() instanceof WordAttribute;
+ computeEqualsValues();
+ }
+
+ public AttributeConflict(int sourceGamma, int destGamma, int artId, TransactionId commitTransaction, String sourceValue, int attrId, int attrTypeId, Branch mergeBranch, Branch destBranch) throws OseeCoreException {
+ super(sourceGamma, destGamma, artId, commitTransaction, mergeBranch, destBranch);
+ this.attrId = attrId;
+ this.attrTypeId = attrTypeId;
+ this.status = ConflictStatus.EDITED;
+ this.isWordAttribute = getAttribute() instanceof WordAttribute;
+ computeEqualsValues();
+ }
+
+ public Attribute<?> getAttribute() throws OseeCoreException {
+ if (attribute != null) return attribute;
+ Collection<Attribute<Object>> localAttributes = getArtifact().getAttributes(getAttributeType().getName());
+ for (Attribute<Object> localAttribute : localAttributes) {
+ if (localAttribute.getAttrId() == attrId) {
+ attribute = localAttribute;
+ }
+ }
+ if (attribute == null) {
+ throw new AttributeDoesNotExist(
+ "Attribute " + attrId + " could not be found on Artifact " + getArtId() + " on Branch " + mergeBranch.getBranchId());
+ }
+ return attribute;
+ }
+
+ public Attribute<?> getSourceAttribute(boolean allowDeleted) throws OseeCoreException {
+ if (sourceAttribute != null) return sourceAttribute;
+ Collection<Attribute<?>> localAttributes = getSourceArtifact().getAttributes(allowDeleted);
+ for (Attribute<?> localAttribute : localAttributes) {
+ if (localAttribute.getAttrId() == attrId) {
+ sourceAttribute = localAttribute;
+ }
+ }
+ if (sourceAttribute == null) {
+ throw new AttributeDoesNotExist(
+ "Attribute " + attrId + " could not be found on Artifact " + getArtId() + " on Branch " + sourceBranch.getBranchId());
+ }
+ return sourceAttribute;
+ }
+
+ public Attribute<?> getDestAttribute() throws OseeCoreException {
+ if (destAttribute != null) return destAttribute;
+ Collection<Attribute<Object>> localAttributes = getDestArtifact().getAttributes(getAttributeType().getName());
+ for (Attribute<Object> localAttribute : localAttributes) {
+ if (localAttribute.getAttrId() == attrId) {
+ destAttribute = localAttribute;
+ }
+ }
+ if (destAttribute == null) {
+ throw new AttributeDoesNotExist(
+ "Attribute " + attrId + " could not be found on Artifact " + getArtId() + " on Branch " + destBranch.getBranchId());
+ }
+ return destAttribute;
+ }
+
+ private Attribute<?> getAttribute(Artifact artifact) throws OseeCoreException {
+ Attribute<?> attribute = null;
+ Collection<Attribute<Object>> localAttributes = artifact.getAttributes(getAttributeType().getName());
+ for (Attribute<Object> localAttribute : localAttributes) {
+ if (localAttribute.getAttrId() == attrId) {
+ attribute = localAttribute;
+ }
+ }
+ if (attribute == null) {
+ throw new AttributeDoesNotExist(
+ "Attribute " + attrId + " could not be found on Artifact " + artifact.getArtId() + " on Branch " + artifact.getBranch().getBranchId());
+ }
+ return attribute;
+ }
+
+ /**
+ * @return the attributeType
+ * @throws OseeCoreException
+ */
+ public AttributeType getAttributeType() throws OseeCoreException {
+ if (attributeType == null) {
+ attributeType = AttributeTypeManager.getType(attrTypeId);
+ }
+ return attributeType;
+ }
+
+ public Object getSourceObject() throws OseeCoreException {
+ if (sourceObject != null) return sourceObject;
+ try {
+ sourceObject = getSourceAttribute(false).getValue();
+ } catch (AttributeDoesNotExist ex) {
+ sourceObject = new String("DELETED");
+ }
+ return sourceObject;
+ }
+
+ public Object getDestObject() throws OseeCoreException {
+ if (destObject != null) return destObject;
+ try {
+ destObject = getDestAttribute().getValue();
+ } catch (AttributeDoesNotExist ex) {
+ destObject = new String("DELETED");
+ }
+ return destObject;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+
+ try {
+ Attribute attribute = null;
+ try {
+ attribute = getSourceAttribute(true);
+ } catch (AttributeDoesNotExist ex) {
+ }
+ if (adapter.isInstance(attribute)) {
+ return attribute;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+
+ return null;
+ }
+
+ public int getAttrId() {
+ return attrId;
+ }
+
+ public int getAttrTypeId() {
+ return attrTypeId;
+ }
+
+ @Override
+ public String getDestDisplayData() throws OseeCoreException {
+ String displayValue =
+ isWordAttribute ? STREAM_DATA : getDestObject() == null ? "Null Value" : getDestObject().toString();
+ try {
+ getDestAttribute();
+ } catch (AttributeDoesNotExist ex) {
+ displayValue = "DELETED";
+ }
+ return displayValue;
+ }
+
+ @Override
+ public String getSourceDisplayData() throws OseeCoreException {
+ String displayValue =
+ isWordAttribute ? STREAM_DATA : getSourceObject() == null ? "Null Value" : getSourceObject().toString();
+ try {
+ getSourceAttribute(false);
+ } catch (AttributeDoesNotExist ex) {
+ displayValue = "DELETED";
+ }
+ return displayValue;
+ }
+
+ @Override
+ public boolean mergeEqualsSource() throws OseeCoreException {
+ return mergeEqualsSource;
+ }
+
+ @Override
+ public boolean mergeEqualsDestination() throws OseeCoreException {
+ return mergeEqualsDest;
+ }
+
+ @Override
+ public boolean sourceEqualsDestination() throws OseeCoreException {
+ return sourceEqualsDest;
+ }
+
+ public Object getMergeObject() throws OseeCoreException {
+ return getAttribute().getValue();
+ }
+
+ public TreeSet<String> getEnumerationAttributeValues() throws OseeCoreException {
+ return new TreeSet<String>(AttributeTypeManager.getEnumerationValues(getAttributeType().getName()));
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class<? extends Attribute> getBaseAttributeClass() throws OseeCoreException {
+ return getAttributeType().getBaseAttributeClass();
+ }
+
+ public boolean setStringAttributeValue(String value) throws OseeCoreException {
+ if (!okToOverwriteMerge()) {
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Failed setting the Merge Value for attr_id %d",
+ getAttrId()));
+ }
+ return false;
+ }
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Set the Merge Value for attr_id %d", getAttrId()));
+ }
+ getArtifact().setSoleAttributeFromString(getAttributeType().getName(), value);
+ getArtifact().persistAttributes();
+ markStatusToReflectEdit();
+ return true;
+ }
+
+ public boolean setAttributeValue(Object value) throws OseeCoreException {
+ if (!okToOverwriteMerge()) {
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Failed setting the Merge Value for attr_id %d",
+ getAttrId()));
+ }
+ return false;
+ }
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Set the Merge Value for attr_id %d", getAttrId()));
+ }
+ getArtifact().setSoleAttributeValue(getAttributeType().getName(), value);
+ getArtifact().persistAttributes();
+ markStatusToReflectEdit();
+ return true;
+ }
+
+ @Override
+ public boolean setToSource() throws OseeCoreException {
+ if (!okToOverwriteMerge() || getSourceObject() == null) {
+ if (DEBUG) {
+ System.out.println(String.format(
+ "AttributeConflict: Failed setting the Merge Value to the Source Value for attr_id %d", getAttrId()));
+ }
+ return false;
+ }
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Set the Merge Value to the Source Value for attr_id %d",
+ getAttrId()));
+ }
+ getArtifact().setSoleAttributeValue(getAttributeType().getName(), getSourceObject());
+ getArtifact().persistAttributes();
+ markStatusToReflectEdit();
+ return true;
+ }
+
+ @Override
+ public boolean setToDest() throws OseeCoreException {
+ if (!okToOverwriteMerge() || getDestObject() == null) {
+ if (DEBUG) {
+ System.out.println(String.format(
+ "AttributeConflict: Failed setting the Merge Value to the Dest Value for attr_id %d", getAttrId()));
+ }
+ return false;
+ }
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Set the Merge Value to the Dest Value for attr_id %d",
+ getAttrId()));
+ }
+ getArtifact().setSoleAttributeValue(getAttributeType().getName(), getDestObject());
+ getArtifact().persistAttributes();
+ markStatusToReflectEdit();
+ return true;
+ }
+
+ @Override
+ public boolean clearValue() throws OseeCoreException {
+ if (!okToOverwriteMerge()) {
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Failed to clear the Merge Value for attr_id %d",
+ getAttrId()));
+ }
+ return false;
+ }
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Cleared the Merge Value for attr_id %d", getAttrId()));
+ }
+ setStatus(ConflictStatus.UNTOUCHED);
+ if (isWordAttribute) {
+ ((WordAttribute) getAttribute()).initializeToDefaultValue();
+ getArtifact().persistAttributes();
+ } else {
+ getArtifact().setSoleAttributeFromString(getAttributeType().getName(), NO_VALUE);
+ getArtifact().persistAttributes();
+ }
+ computeEqualsValues();
+ return true;
+ }
+
+ public void computeEqualsValues() throws OseeCoreException {
+ if (getMergeObject() == null || getSourceObject() == null) {
+ mergeEqualsSource = false;
+ } else {
+ mergeEqualsSource = getMergeObject().equals(getSourceObject());
+ }
+ if (getMergeObject() == null || getDestObject() == null) {
+ mergeEqualsDest = false;
+ } else {
+ mergeEqualsDest = getMergeObject().equals(getDestObject());
+ }
+
+ if (getSourceObject() == null || getDestObject() == null) {
+ sourceEqualsDest = false;
+ } else {
+ sourceEqualsDest = getSourceObject().equals(getDestObject());
+ }
+ }
+
+ public void markStatusToReflectEdit() throws OseeCoreException {
+ computeEqualsValues();
+ if (status.equals(ConflictStatus.UNTOUCHED) || status.equals(ConflictStatus.OUT_OF_DATE_RESOLVED) || status.equals(ConflictStatus.OUT_OF_DATE) || status.equals(ConflictStatus.PREVIOUS_MERGE_APPLIED_CAUTION) || status.equals(ConflictStatus.PREVIOUS_MERGE_APPLIED_SUCCESS)) setStatus(ConflictStatus.EDITED);
+ }
+
+ public ConflictStatus computeStatus() throws OseeCoreException {
+ ConflictStatus passedStatus = ConflictStatus.UNTOUCHED;
+ try {
+ getSourceAttribute(false);
+ } catch (AttributeDoesNotExist ex) {
+ passedStatus = ConflictStatus.INFORMATIONAL;
+ }
+ try {
+ getDestAttribute();
+ } catch (AttributeDoesNotExist ex) {
+ passedStatus = ConflictStatus.NOT_RESOLVABLE;
+ }
+ return super.computeStatus(attrId, passedStatus);
+ }
+
+ public int getObjectId() throws OseeCoreException {
+ return attrId;
+ }
+
+ @Override
+ public String getMergeDisplayData() throws OseeCoreException {
+ if ((statusUntouched() && !(sourceEqualsDestination() && mergeEqualsSource())) || statusNotResolvable() || statusInformational()) {
+ return NO_VALUE;
+ }
+ if (!isWordAttribute) {
+ return getMergeObject() == null ? null : getMergeObject().toString();
+ }
+ return AttributeConflict.STREAM_DATA;
+ }
+
+ @Override
+ public String getChangeItem() throws OseeCoreException {
+ return getAttributeType().getName();
+ }
+
+ @Override
+ public ConflictType getConflictType() {
+ return ConflictType.ATTRIBUTE;
+ }
+
+ public int getMergeGammaId() throws OseeCoreException {
+ return getAttribute().getGammaId();
+ }
+
+ public boolean isWordAttribute() {
+ return isWordAttribute;
+ }
+
+ public void setStatus(ConflictStatus status) throws OseeCoreException {
+ if (status.equals(ConflictStatus.RESOLVED) && isWordAttribute && ((WordAttribute) getAttribute()).containsWordAnnotations()) {
+ throw new MergeChangesInArtifactException(RESOLVE_MERGE_MARKUP);
+ }
+ super.setStatus(status);
+ }
+
+ public boolean wordMarkupPresent() throws OseeCoreException {
+ if (isWordAttribute && ((WordAttribute) getAttribute()).containsWordAnnotations()) {
+ return true;
+ }
+ return false;
+ }
+
+ public void revertSourceAttribute() throws OseeCoreException {
+ if (DEBUG) {
+ System.out.println(String.format("AttributeConflict: Reverting Attribute %d", getAttrId()));
+ }
+ getSourceAttribute(true).revert();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#applyPreviousMerge(int)
+ */
+ @Override
+ public boolean applyPreviousMerge(int mergeBranchId, int destBranchId) throws OseeCoreException {
+ if (DEBUG) {
+ System.out.println("Apply the merge using the merge branch value " + mergeBranchId);
+ }
+ if (!statusResolved()) {
+ Artifact mergeArtifact;
+ Artifact destArtifact;
+ try {
+ mergeArtifact =
+ ArtifactQuery.getArtifactFromId(getArtifact().getArtId(), BranchManager.getBranch(mergeBranchId));
+ destArtifact =
+ ArtifactQuery.getArtifactFromId(getArtifact().getArtId(), BranchManager.getBranch(destBranchId));
+ } catch (ArtifactDoesNotExist ex) {
+ return false;
+ }
+ setAttributeValue(getAttribute(mergeArtifact).getValue());
+ computeEqualsValues();
+ if (getDestAttribute().getValue().equals(getAttribute(destArtifact).getValue()) || getDestAttribute().getGammaId() == getAttribute(
+ destArtifact).getGammaId()) {
+ setStatus(ConflictStatus.PREVIOUS_MERGE_APPLIED_SUCCESS);
+ } else {
+ setStatus(ConflictStatus.PREVIOUS_MERGE_APPLIED_CAUTION);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflictBuilder.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflictBuilder.java
new file mode 100644
index 00000000000..ed9db006c46
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/AttributeConflictBuilder.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.framework.skynet.core.conflict;
+
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Theron Virgin
+ */
+public class AttributeConflictBuilder extends ConflictBuilder {
+
+ private final String sourceValue;
+ private final int attrId;
+ private final int attrTypeId;
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param artifact
+ * @param transactionType
+ * @param mergeBranch
+ * @param sourceBranch
+ * @param destBranch
+ * @param sourceValue
+ * @param destValue
+ * @param sourceContent
+ * @param destContent
+ * @param attrId
+ * @param attrTypeId
+ */
+ public AttributeConflictBuilder(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, Branch sourceBranch, Branch destBranch, String sourceValue, int attrId, int attrTypeId) {
+ super(sourceGamma, destGamma, artId, toTransactionId, sourceBranch, destBranch);
+ this.sourceValue = sourceValue;
+ this.attrId = attrId;
+ this.attrTypeId = attrTypeId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.ConflictBuilder#getConflict()
+ */
+ @Override
+ public Conflict getConflict(Branch mergeBranch, Set<Integer> artIdSet) throws OseeCoreException {
+ for (Integer integer : artIdSet) {
+ if (integer.intValue() == artId) return null;
+ }
+ AttributeConflict attributeConflict =
+ new AttributeConflict(sourceGamma, destGamma, artId, toTransactionId, sourceValue, attrId, attrTypeId,
+ mergeBranch, sourceBranch, destBranch);
+ if (attributeConflict.getChangeItem().toString().equals("Word Ole Data")) return null;
+ return attributeConflict;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/Conflict.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/Conflict.java
new file mode 100644
index 00000000000..63d78c1ad77
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/Conflict.java
@@ -0,0 +1,336 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.conflict;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public abstract class Conflict implements IAdaptable {
+ protected ConflictStatus status;
+ protected int sourceGamma;
+ protected int destGamma;
+ private int artId;
+ private TransactionId toTransactionId;
+ private TransactionId commitTransactionId;
+ private Artifact artifact;
+ private Artifact sourceArtifact;
+ private Artifact destArtifact;
+ protected Branch mergeBranch;
+ protected Branch sourceBranch;
+ protected Branch destBranch;
+
+ private String sourceDiffFile = null;
+ private String destDiffFile = null;
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param transactionType
+ * @param changeType
+ */
+ public Conflict(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, TransactionId commitTransactionId, Branch mergeBranch, Branch sourceBranch, Branch destBranch) {
+ super();
+ this.sourceGamma = sourceGamma;
+ this.destGamma = destGamma;
+ this.artId = artId;
+ this.toTransactionId = toTransactionId;
+ this.sourceBranch = sourceBranch;
+ this.destBranch = destBranch;
+ this.mergeBranch = mergeBranch;
+ this.commitTransactionId = commitTransactionId;
+ }
+
+ public Conflict(int sourceGamma, int destGamma, int artId, TransactionId commitTransactionId, Branch mergeBranch, Branch destBranch) {
+ this(sourceGamma, destGamma, artId, null, commitTransactionId, mergeBranch, null, destBranch);
+ }
+
+ /**
+ * @return the artifact
+ * @throws OseeCoreException
+ */
+ public Artifact getArtifact() throws OseeCoreException {
+ if (artifact == null) {
+ artifact = ArtifactQuery.getArtifactFromId(artId, mergeBranch, true);
+ }
+ return artifact;
+ }
+
+ public Artifact getSourceArtifact() throws OseeCoreException {
+ if (sourceArtifact == null) {
+ if (commitTransactionId == null) {
+ sourceArtifact = ArtifactQuery.getArtifactFromId(artId, sourceBranch, true);
+ } else {
+ sourceArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(artId,
+ TransactionIdManager.getStartEndPoint(mergeBranch).getKey());
+ }
+ }
+ return sourceArtifact;
+ }
+
+ public Artifact getDestArtifact() throws OseeCoreException {
+ if (destArtifact == null) {
+ if (commitTransactionId == null) {
+ destArtifact = ArtifactQuery.getArtifactFromId(artId, destBranch, true);
+ } else {
+ destArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(artId,
+ TransactionIdManager.getPriorTransaction(commitTransactionId));
+
+ }
+ }
+ return destArtifact;
+ }
+
+ public Branch getMergeBranch() {
+ return mergeBranch;
+ }
+
+ public Branch getSourceBranch() {
+ return sourceBranch;
+ }
+
+ public Branch getDestBranch() {
+ return destBranch;
+ }
+
+ /**
+ * @return the sourceGamma
+ */
+ public int getSourceGamma() {
+ return sourceGamma;
+ }
+
+ /**
+ * @param sourceGamma the sourceGamma to set
+ */
+ public void setSourceGamma(int sourceGamma) {
+ this.sourceGamma = sourceGamma;
+ }
+
+ /**
+ * @return the destGamma
+ */
+ public int getDestGamma() {
+ return destGamma;
+ }
+
+ /**
+ * @param destGamma the destGamma to set
+ */
+ public void setDestGamma(int destGamma) {
+ this.destGamma = destGamma;
+ }
+
+ /**
+ * @return the artId
+ */
+ public int getArtId() {
+ return artId;
+ }
+
+ /**
+ * @param artId the artId to set
+ */
+ public void setArtId(int artId) {
+ this.artId = artId;
+ }
+
+ /**
+ * @return the toTransactionId
+ */
+ public TransactionId getToTransactionId() {
+ return toTransactionId;
+ }
+
+ /**
+ * @return the toTransactionId
+ */
+ public TransactionId getCommitTransactionId() {
+ return commitTransactionId;
+ }
+
+ public boolean okToOverwriteMerge() throws OseeCoreException {
+ if (status.equals(ConflictStatus.RESOLVED) || status.equals(ConflictStatus.COMMITTED)) {
+ return false;
+ }
+ return true;
+ }
+
+ public abstract ConflictStatus computeStatus() throws OseeCoreException;
+
+ public ConflictStatus computeStatus(int objectID, ConflictStatus DefaultStatus) throws OseeCoreException {
+ ConflictStatus passedStatus = DefaultStatus;
+ try {
+ if (sourceEqualsDestination() && mergeEqualsSource()) passedStatus = ConflictStatus.RESOLVED;
+ } catch (AttributeDoesNotExist ex) {
+ }
+ status =
+ ConflictStatusManager.computeStatus(sourceGamma, destGamma, mergeBranch.getBranchId(), objectID,
+ getConflictType().getValue(), passedStatus,
+ TransactionIdManager.getStartEndPoint(mergeBranch).getKey().getTransactionNumber());
+ return status;
+ }
+
+ public void setStatus(ConflictStatus status) throws OseeCoreException {
+ if (this.status.equals(status)) return;
+ ConflictStatusManager.setStatus(status, sourceGamma, destGamma, mergeBranch.getBranchId());
+ this.status = status;
+ }
+
+ public boolean statusUntouched() {
+ return status.equals(ConflictStatus.UNTOUCHED);
+ }
+
+ public boolean statusResolved() {
+ return status.equals(ConflictStatus.RESOLVED);
+ }
+
+ public boolean statusCommitted() {
+ return status.equals(ConflictStatus.COMMITTED);
+ }
+
+ public boolean statusEdited() {
+ return status.equals(ConflictStatus.EDITED);
+ }
+
+ public boolean statusOutOfDateCommitted() {
+ return status.equals(ConflictStatus.OUT_OF_DATE_RESOLVED);
+ }
+
+ public boolean statusPreviousMergeAppliedSuccess() {
+ return status.equals(ConflictStatus.PREVIOUS_MERGE_APPLIED_SUCCESS);
+ }
+
+ public boolean statusPreviousMergeAppliedCaution() {
+ return status.equals(ConflictStatus.PREVIOUS_MERGE_APPLIED_CAUTION);
+ }
+
+ public boolean statusOutOfDate() {
+ return status.equals(ConflictStatus.OUT_OF_DATE);
+ }
+
+ public boolean statusNotResolvable() {
+ return status.equals(ConflictStatus.NOT_RESOLVABLE);
+ }
+
+ public boolean statusInformational() {
+ return status.equals(ConflictStatus.INFORMATIONAL);
+ }
+
+ public boolean statusEditable() {
+ return !(status.equals(ConflictStatus.RESOLVED) || status.equals(ConflictStatus.COMMITTED) || status.equals(ConflictStatus.INFORMATIONAL) || status.equals(ConflictStatus.NOT_RESOLVABLE));
+ }
+
+ public int getMergeBranchID() {
+ return mergeBranch.getBranchId();
+ }
+
+ public String getArtifactName() throws OseeCoreException {
+ return getArtifact().getDescriptiveName();
+ }
+
+ public void handleResolvedSelection() throws Exception {
+ if (status.equals(ConflictStatus.EDITED)) {
+ setStatus(ConflictStatus.RESOLVED);
+ } else if (status.equals(ConflictStatus.RESOLVED)) {
+ setStatus(ConflictStatus.EDITED);
+ } else if (status.equals(ConflictStatus.OUT_OF_DATE_RESOLVED)) {
+ setStatus(ConflictStatus.RESOLVED);
+ } else if (status.equals(ConflictStatus.OUT_OF_DATE)) {
+ setStatus(ConflictStatus.EDITED);
+ } else if (status.equals(ConflictStatus.PREVIOUS_MERGE_APPLIED_SUCCESS)) {
+ setStatus(ConflictStatus.RESOLVED);
+ } else if (status.equals(ConflictStatus.PREVIOUS_MERGE_APPLIED_CAUTION)) {
+ setStatus(ConflictStatus.EDITED);
+ }
+ }
+
+ /**
+ * @return the sourceDiffFile
+ */
+ public String getSourceDiffFile() {
+ return sourceDiffFile;
+ }
+
+ /**
+ * @param sourceDiffFile the sourceDiffFile to set
+ */
+ public void setSourceDiffFile(String sourceDiffFile) {
+ this.sourceDiffFile = sourceDiffFile;
+ }
+
+ /**
+ * @return the destDiffFile
+ */
+ public String getDestDiffFile() {
+ return destDiffFile;
+ }
+
+ /**
+ * @param destDiffFile the destDiffFile to set
+ */
+ public void setDestDiffFile(String destDiffFile) {
+ this.destDiffFile = destDiffFile;
+ }
+
+ public ConflictStatus getStatus() {
+ return status;
+ }
+
+ public void computeEqualsValues() throws OseeCoreException {
+ }
+
+ public abstract String getSourceDisplayData() throws OseeCoreException;
+
+ public abstract String getDestDisplayData() throws OseeCoreException;
+
+ public abstract boolean mergeEqualsSource() throws OseeCoreException;
+
+ public abstract boolean mergeEqualsDestination() throws OseeCoreException;
+
+ public abstract boolean sourceEqualsDestination() throws OseeCoreException;
+
+ public abstract boolean setToSource() throws OseeCoreException;
+
+ public abstract boolean setToDest() throws OseeCoreException;
+
+ public abstract boolean clearValue() throws OseeCoreException;
+
+ public abstract String getMergeDisplayData() throws OseeCoreException;
+
+ public abstract String getChangeItem() throws OseeCoreException;
+
+ public abstract ConflictType getConflictType();
+
+ public abstract int getMergeGammaId() throws OseeCoreException;
+
+ public abstract int getObjectId() throws OseeCoreException;
+
+ public abstract boolean applyPreviousMerge(int mergeBranchId, int destBranchId) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictBuilder.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictBuilder.java
new file mode 100644
index 00000000000..ec435ba3b9f
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictBuilder.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.framework.skynet.core.conflict;
+
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Theron Virgin
+ */
+public abstract class ConflictBuilder {
+
+ protected int sourceGamma;
+ protected int destGamma;
+ protected int artId;
+ protected TransactionId toTransactionId;
+ protected Branch sourceBranch;
+ protected Branch destBranch;
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param artifact
+ * @param transactionType
+ * @param changeType
+ * @param mergeBranch
+ * @param sourceBranch
+ * @param destBranch
+ */
+ public ConflictBuilder(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, Branch sourceBranch, Branch destBranch) {
+ super();
+ this.sourceGamma = sourceGamma;
+ this.destGamma = destGamma;
+ this.artId = artId;
+ this.toTransactionId = toTransactionId;
+ this.sourceBranch = sourceBranch;
+ this.destBranch = destBranch;
+ }
+
+ public abstract Conflict getConflict(Branch mergeBranch, Set<Integer> artIdSet) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictManagerExternal.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictManagerExternal.java
new file mode 100644
index 00000000000..b69f8bd1612
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictManagerExternal.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.framework.skynet.core.conflict;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ConflictManagerExternal {
+
+ Branch destinationBranch;
+ Branch sourceBranch;
+ List<Conflict> originalConflicts;
+
+ public ConflictManagerExternal(Branch destinationBranch, Branch sourceBranch) {
+ this.destinationBranch = destinationBranch;
+ this.sourceBranch = sourceBranch;
+ }
+
+ public List<Conflict> getOriginalConflicts() throws OseeCoreException {
+ if (originalConflicts == null) {
+ originalConflicts =
+ ConflictManagerInternal.getConflictsPerBranch(sourceBranch, destinationBranch,
+ TransactionIdManager.getStartEndPoint(sourceBranch).getKey(), new EmptyMonitor());
+ }
+ return originalConflicts;
+ }
+
+ public boolean originalConflictsExist() throws OseeCoreException {
+ return getOriginalConflicts().size() > 0;
+ }
+
+ public List<Conflict> getRemainingConflicts() throws OseeCoreException {
+ List<Conflict> remainingConflicts = new ArrayList<Conflict>();
+ if (originalConflictsExist()) {
+ for (Conflict conflict : getOriginalConflicts()) {
+ if (!conflict.statusResolved() && !conflict.statusCommitted() && !conflict.statusInformational()) {
+ remainingConflicts.add(conflict);
+ }
+ }
+ }
+ return remainingConflicts;
+ }
+
+ public boolean remainingConflictsExist() throws OseeCoreException {
+ return getRemainingConflicts().size() > 0;
+ }
+
+ public Branch getDestinationBranch() {
+ return destinationBranch;
+ }
+
+ public Branch getSourceBranch() {
+ return sourceBranch;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictStatusManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictStatusManager.java
new file mode 100644
index 00000000000..e8aa7955859
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/ConflictStatusManager.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.framework.skynet.core.conflict;
+
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Theron Virgin
+ */
+public class ConflictStatusManager {
+
+ private static final String MERGE_UPDATE_STATUS =
+ "UPDATE osee_conflict SET status = ? WHERE source_gamma_id = ? AND dest_gamma_id = ? AND merge_branch_id = ?";
+ private static final String MERGE_ATTRIBUTE_STATUS =
+ "SELECT source_gamma_id, dest_gamma_id, status FROM osee_conflict WHERE merge_branch_id = ? AND conflict_id = ? AND conflict_type = ?";
+ private static final String MERGE_UPDATE_GAMMAS =
+ "UPDATE osee_conflict SET source_gamma_id = ?, dest_gamma_id = ?, status = ? WHERE merge_branch_id = ? AND conflict_id = ? AND conflict_type = ?";
+ private static final String MERGE_BRANCH_GAMMAS =
+ "UPDATE osee_txs SET gamma_id = ? where (transaction_id, gamma_id) = (SELECT tx.transaction_id, tx.gamma_id FROM osee_txs tx, osee_attribute atr WHERE tx.transaction_id = ? AND atr.gamma_id = tx.gamma_id AND atr.attr_id = ? )";
+ private static final String MERGE_INSERT_STATUS =
+ "INSERT INTO osee_conflict ( conflict_id, merge_branch_id, source_gamma_id, dest_gamma_id, status, conflict_type) VALUES ( ?, ?, ?, ?, ?, ?)";
+
+ public static void setStatus(ConflictStatus status, int sourceGamma, int destGamma, int mergeBranchId) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ //Gammas should be up to date so you can use them to get entry just update the status field.
+ try {
+ ConnectionHandler.runPreparedUpdate(MERGE_UPDATE_STATUS, status.getValue(), sourceGamma, destGamma,
+ mergeBranchId);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static ConflictStatus computeStatus(int sourceGamma, int destGamma, int branchID, int objectID, int conflictType, ConflictStatus passedStatus, int transactionId) throws OseeDataStoreException {
+ //Check for a value in the table, if there is not one in there then
+ //add it with an unedited setting and return unedited
+ //If gammas are out of date, update the gammas and down grade markedMerged to Edited
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(MERGE_ATTRIBUTE_STATUS, branchID, objectID, conflictType);
+
+ if (chStmt.next()) {
+ //There was an entry so lets check it and update it.
+ int intStatus = chStmt.getInt("status");
+ if (((chStmt.getInt("source_gamma_id") != sourceGamma) || (chStmt.getInt("dest_gamma_id") != destGamma)) && intStatus != ConflictStatus.COMMITTED.getValue()) {
+ if (intStatus == ConflictStatus.RESOLVED.getValue() || intStatus == ConflictStatus.PREVIOUS_MERGE_APPLIED_SUCCESS.getValue()) {
+ intStatus = ConflictStatus.OUT_OF_DATE_RESOLVED.getValue();
+ }
+ if (intStatus == ConflictStatus.EDITED.getValue() || intStatus == ConflictStatus.PREVIOUS_MERGE_APPLIED_CAUTION.getValue()) {
+ intStatus = ConflictStatus.OUT_OF_DATE.getValue();
+ }
+ ConnectionHandler.runPreparedUpdate(MERGE_UPDATE_GAMMAS, sourceGamma, destGamma, intStatus, branchID,
+ objectID, conflictType);
+ if (conflictType == ConflictType.ATTRIBUTE.getValue()) {
+ ConnectionHandler.runPreparedUpdate(MERGE_BRANCH_GAMMAS, sourceGamma, transactionId, objectID);
+ }
+ }
+ if (intStatus == ConflictStatus.NOT_RESOLVABLE.getValue() || intStatus == ConflictStatus.INFORMATIONAL.getValue() || passedStatus == ConflictStatus.NOT_RESOLVABLE || passedStatus == ConflictStatus.INFORMATIONAL) {
+ intStatus = passedStatus.getValue();
+ }
+ return ConflictStatus.getStatus(intStatus);
+ }
+ // add the entry to the table and set as UNTOUCHED
+ } finally {
+ chStmt.close();
+ }
+ ConnectionHandler.runPreparedUpdate(MERGE_INSERT_STATUS, objectID, branchID, sourceGamma, destGamma,
+ passedStatus.getValue(), conflictType);
+
+ return passedStatus;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/RelationConflict.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/RelationConflict.java
new file mode 100644
index 00000000000..6cdf92cbea1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/conflict/RelationConflict.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.framework.skynet.core.conflict;
+
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.exception.BranchMergeException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Theron Virgin
+ */
+public class RelationConflict extends Conflict {
+
+ /**
+ * @param sourceGamma
+ * @param destGamma
+ * @param artId
+ * @param toTransactionId
+ * @param fromTransactionId
+ * @param transactionType
+ * @param changeType
+ * @param mergeBranch
+ * @param sourceBranch
+ * @param destBranch
+ */
+ public RelationConflict(int sourceGamma, int destGamma, int artId, TransactionId toTransactionId, Branch mergeBranch, Branch sourceBranch, Branch destBranch) {
+ super(sourceGamma, destGamma, artId, toTransactionId, null, mergeBranch, sourceBranch, destBranch);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#clearAttributeValue()
+ */
+ @Override
+ public boolean clearValue() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#computeStatus()
+ */
+ public ConflictStatus computeStatus() {
+ return null;
+ }
+
+ public int getObjectId() throws OseeCoreException {
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getChangeItem()
+ */
+ @Override
+ public String getChangeItem() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getConflictType()
+ */
+ @Override
+ public ConflictType getConflictType() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getDestDisplayData()
+ */
+ @Override
+ public String getDestDisplayData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getMergeDisplayData()
+ */
+ @Override
+ public String getMergeDisplayData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getMergeValue()
+ */
+ public String getMergeValue() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#getSourceDisplayData()
+ */
+ @Override
+ public String getSourceDisplayData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#mergeEqualsDestination()
+ */
+ @Override
+ public boolean mergeEqualsDestination() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#mergeEqualsSource()
+ */
+ @Override
+ public boolean mergeEqualsSource() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#setAttributeToDest()
+ */
+ @Override
+ public boolean setToDest() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#setAttributeToSource()
+ */
+ @Override
+ public boolean setToSource() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#sourceEqualsDestination()
+ */
+ @Override
+ public boolean sourceEqualsDestination() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public int getMergeGammaId() throws BranchMergeException {
+ throw new BranchMergeException("Relation Conflicts are not implemented yet");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.conflict.Conflict#applyPreviousMerge(int)
+ */
+ @Override
+ public boolean applyPreviousMerge(int mergeBranchId, int destBranchId) throws OseeCoreException {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/MasterSkynetTypesImport.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/MasterSkynetTypesImport.java
new file mode 100644
index 00000000000..3bb4c7153e9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/MasterSkynetTypesImport.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.framework.skynet.core.dbinit;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.importing.DbOseeDataTypeProcessor;
+import org.eclipse.osee.framework.skynet.core.importing.ExcelOseeTypeDataParser;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.osgi.framework.Bundle;
+import org.xml.sax.SAXException;
+
+/**
+ * This class provides necessary functionality for branches to be loaded with SkynetDbTypes through their extension
+ * points. Creation, adding skynet types and initializing a new branch should be done through
+ * BranchManager.createRootBranch.
+ *
+ * @author Andrew M. Finkbeiner
+ * @author Donald G. Dunne
+ * @see BranchManager#createTopLevelBranch(String, String, String, Collection, boolean)
+ */
+public class MasterSkynetTypesImport {
+ private static final String skynetDbTypesExtensionPointId = "org.eclipse.osee.framework.skynet.core.OseeTypes";
+
+ private MasterSkynetTypesImport() {
+ }
+
+ /**
+ * Imports the given skynetDbTypes to the given branch. This should not be called seprately, but instead should be
+ * handled through BranchManager.createRootBranch
+ *
+ * @param connection
+ * @param skynetTypesImportExtensionsUniqueIds
+ * @param branch
+ * @throws Exception
+ * @see BranchManager#createTopLevelBranch(String, String, String, Collection, boolean)
+ */
+ public static void importSkynetDbTypes(Collection<String> skynetTypesImportExtensionsUniqueIds) throws OseeCoreException {
+ try {
+ runSkynetDbTypesImport(ExtensionPoints.getExtensionsByUniqueId(skynetDbTypesExtensionPointId,
+ skynetTypesImportExtensionsUniqueIds));
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ } catch (SAXException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /**
+ * Import the skynetdbtypes for the given extensions
+ *
+ * @param skynetDbTypesExtensions
+ * @param branch
+ * @throws SAXException
+ * @throws IOException
+ * @throws OseeCoreException
+ */
+ private static void runSkynetDbTypesImport(List<IExtension> skynetDbTypesExtensions) throws IOException, SAXException, OseeCoreException {
+ ExcelOseeTypeDataParser importer = new ExcelOseeTypeDataParser(new DbOseeDataTypeProcessor());
+ for (IExtension extension : skynetDbTypesExtensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("ExcelFile")) {
+ String file = el.getAttribute("file");
+ Bundle bundle = Platform.getBundle(el.getContributor().getName());
+ URL url = bundle.getEntry(file);
+ OseeLog.log(Activator.class, Level.INFO, String.format("Importing [%s] from [%s]", file,
+ url != null ? url.getPath() : "url was null"));
+ importer.extractTypesFromSheet(url.openStream());
+ }
+ }
+ }
+ importer.finish();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/PostDbUserCleanUp.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/PostDbUserCleanUp.java
new file mode 100644
index 00000000000..8057070dc8b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/PostDbUserCleanUp.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.framework.skynet.core.dbinit;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PostDbUserCleanUp implements IDbInitializationTask {
+ private static final String UPDATE_BOOTSTRAP_USER_ID = "UPDATE osee_tx_details SET author = ? where author = 0";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.IDbInitializationTask#run(org.eclipse.osee.framework.db.connection.OseeConnection)
+ */
+ @Override
+ public void run() throws OseeCoreException {
+ OseeLog.log(Activator.class, Level.INFO, "Post Initialization User Clean-up");
+
+ int authorArtId = 0;
+ boolean isUserAuthenticationAllowed = false;
+ try {
+ // Check that this is a normal initialization
+ Artifact root = ArtifactQuery.getDefaultHierarchyRootArtifact(BranchManager.getCommonBranch());
+ if (root != null) {
+ isUserAuthenticationAllowed = true;
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ // Do Nothing -- failure expected during base initialization
+ }
+
+ if (isUserAuthenticationAllowed) {
+ // This is a regular initialization - users have been created.
+
+ // Release bootstrap session session
+ ClientSessionManager.releaseSession();
+
+ // Acquire session
+ User user = UserManager.getUser();
+ authorArtId = user.getArtId();
+ } else {
+ // This is an initialization for base import -- users are not available
+ OseeLog.log(Activator.class, Level.INFO,
+ "Post Initialization User Clean-up - Base Initialization - unable to set tx author id");
+ }
+
+ if (authorArtId > 0) {
+ // Set author to current authenticated user art id
+ ConnectionHandler.runPreparedUpdate(UPDATE_BOOTSTRAP_USER_ID, authorArtId);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbBranchDataImport.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbBranchDataImport.java
new file mode 100644
index 00000000000..c13f740b311
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbBranchDataImport.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.framework.skynet.core.dbinit;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+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.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.exportImport.HttpBranchExchange;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SkynetDbBranchDataImport implements IDbInitializationTask {
+ private static final String ELEMENT_NAME = "OseeDbImportData";
+ private static final String EXTENSION_POINT = Activator.PLUGIN_ID + "." + ELEMENT_NAME;
+ private static final String BRANCH_NAME = "branchName";
+ private static final String BRANCH_DATA = "branchData";
+ private static final String BRANCHES_TO_IMPORT = "BranchesToImport";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#run(java.sql.Connection)
+ */
+ @Override
+ public void run() throws OseeCoreException {
+ if (OseeClientProperties.isOseeImportAllowed()) {
+ // Clean up and delete all branches except Common
+ for (Branch branch : BranchManager.getNormalBranches()) {
+ if (!branch.getBranchName().equals(Branch.COMMON_BRANCH_CONFIG_ID)) {
+ BranchManager.purgeBranchInJob(branch);
+ }
+ }
+
+ Collection<ImportData> importDatas = loadDataFromExtensions();
+ for (ImportData importData : importDatas) {
+ OseeLog.log(Activator.class, Level.INFO, String.format("Import Branch Data: [%s]", importData));
+ try {
+ File importFile = importData.getExchangeFile();
+ //TODO not yet supported importData.getSelectedBranches();
+ HttpBranchExchange.importBranches(importFile.toURI().toASCIIString(), true, true);
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Exception while importing branch: [%s]",
+ importData), ex);
+ throw ex;
+ }
+ }
+ }
+ }
+
+ private Collection<ImportData> loadDataFromExtensions() throws OseeDataStoreException {
+ List<ImportData> toReturn = new ArrayList<ImportData>();
+ Map<String, String> selectedBranches = new HashMap<String, String>();
+ List<IConfigurationElement> elements = ExtensionPoints.getExtensionElements(EXTENSION_POINT, ELEMENT_NAME);
+ for (IConfigurationElement element : elements) {
+ String bundleName = element.getContributor().getName();
+ String branchData = element.getAttribute(BRANCH_DATA);
+
+ if (Strings.isValid(bundleName) && Strings.isValid(branchData)) {
+ File exchangeFile;
+ try {
+ exchangeFile = getExchangeFile(bundleName, branchData);
+ } catch (Exception ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ ImportData importData = new ImportData(exchangeFile);
+ for (IConfigurationElement innerElement : element.getChildren(BRANCHES_TO_IMPORT)) {
+ String branchName = innerElement.getAttribute(BRANCH_NAME);
+ if (Strings.isValid(branchName)) {
+ importData.addSelectedBranch(branchName);
+ if (!selectedBranches.containsKey(branchName.toLowerCase())) {
+ selectedBranches.put(branchName.toLowerCase(),
+ element.getDeclaringExtension().getUniqueIdentifier());
+ } else {
+ throw new OseeDataStoreException(
+ String.format(
+ "Branch import error - cannot import twice into a branch - [%s] was already specified by [%s] ",
+ branchName, selectedBranches.get(branchName.toLowerCase())));
+ }
+ }
+ }
+ toReturn.add(importData);
+ } else {
+ throw new OseeDataStoreException(String.format("Branch import error: [%s] attributes were empty.",
+ element.getDeclaringExtension().getExtensionPointUniqueIdentifier()));
+ }
+ }
+ return toReturn;
+ }
+
+ private File getExchangeFile(String bundleName, String exchangeFile) throws IOException, URISyntaxException {
+ if (exchangeFile.endsWith("zip") != true) {
+ throw new IOException(String.format("Branch data file is invalid [%s] ", exchangeFile));
+ }
+ Bundle bundle = Platform.getBundle(bundleName);
+ URL url = bundle.getResource(exchangeFile);
+ url = FileLocator.toFileURL(url);
+ String urlValue = url.toString();
+ URI uri = new URI(urlValue.replaceAll(" ", "%20"));
+ File toReturn = new File(uri);
+ if (toReturn.exists() != true) {
+ throw new FileNotFoundException(String.format("Branch data file cannot be found [%s]", exchangeFile));
+ }
+ return toReturn;
+ }
+
+ private final class ImportData {
+ private File exchangeFile;
+ private Set<String> selectedBranches;
+
+ public ImportData(File exchangeFile) {
+ super();
+ this.exchangeFile = exchangeFile;
+ this.selectedBranches = new HashSet<String>();
+ }
+
+ public void addSelectedBranch(String branchName) {
+ this.selectedBranches.add(branchName);
+ }
+
+ public String toString() {
+ return String.format("%s - %s", exchangeFile, selectedBranches);
+ }
+
+ public boolean areAllSelected() {
+ return this.selectedBranches.size() == 0;
+ }
+
+ public Set<String> getSelectedBranches() {
+ return selectedBranches;
+ }
+
+ public File getExchangeFile() {
+ return exchangeFile;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbInit.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbInit.java
new file mode 100644
index 00000000000..638f9824b04
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/dbinit/SkynetDbInit.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.dbinit;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.PERMISSION_TABLE;
+import java.io.File;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+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.Platform;
+import org.eclipse.osee.framework.core.client.BaseCredentialProvider;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.core.data.OseeDatabaseId;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.database.IDbInitializationRule;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.database.data.SchemaData;
+import org.eclipse.osee.framework.database.utility.DatabaseConfigurationData;
+import org.eclipse.osee.framework.database.utility.DatabaseSchemaExtractor;
+import org.eclipse.osee.framework.database.utility.DbInit;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.db.DbConfigFileInformation;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+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.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SkynetDbInit implements IDbInitializationTask {
+ private static final String ADD_PERMISSION =
+ "INSERT INTO " + PERMISSION_TABLE.columnsForInsert("PERMISSION_ID", "PERMISSION_NAME");
+ private static boolean isInDbInit;
+
+ public void run() throws OseeCoreException {
+ isInDbInit = true;
+ DatabaseConfigurationData databaseConfigurationData = new DatabaseConfigurationData(getSchemaFiles());
+ Map<String, SchemaData> userSpecifiedConfig = databaseConfigurationData.getUserSpecifiedSchemas();
+ DatabaseSchemaExtractor schemaExtractor = new DatabaseSchemaExtractor(userSpecifiedConfig.keySet());
+ schemaExtractor.extractSchemaData();
+ Map<String, SchemaData> currentDatabaseConfig = schemaExtractor.getSchemas();
+ Set<String> schemas = userSpecifiedConfig.keySet();
+ DbInit.dropViews();
+ DbInit.dropIndeces(schemas, userSpecifiedConfig, currentDatabaseConfig);
+ DbInit.dropTables(schemas, userSpecifiedConfig, currentDatabaseConfig);
+ if (SupportedDatabase.isDatabaseType(SupportedDatabase.postgresql)) {
+ DbInit.dropSchema(schemas);
+ DbInit.createSchema(schemas);
+ }
+ DbInit.addTables(schemas, userSpecifiedConfig);
+ DbInit.addIndeces(schemas, userSpecifiedConfig);
+ DbInit.addViews();
+ initializeApplicationServer();
+ OseeInfo.putValue(OseeDatabaseId.getKey(), GUID.generateGuidStr());
+ populateSequenceTable();
+ addDefaultPermissions();
+ }
+
+ public static boolean isDbInit() {
+ return isInDbInit;
+ }
+
+ private static void initializeApplicationServer() throws OseeCoreException {
+ try {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("registerToLookup", "true");
+ String url =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.LOOKUP_CONTEXT, parameters);
+ String response = HttpProcessor.post(new URL(url));
+ OseeLog.log(Activator.class, Level.INFO, response);
+ } catch (Exception ex1) {
+ throw new OseeDataStoreException(ex1);
+ }
+
+ ClientSessionManager.authenticate(new BaseCredentialProvider() {
+
+ @Override
+ public OseeCredential getCredential() throws OseeCoreException {
+ OseeCredential credential = new OseeCredential();
+ credential.setUserName(SystemUser.BootStrap.getName());
+ return credential;
+ }
+
+ });
+
+ boolean displayWarning = false;
+ String server = HttpUrlBuilder.getInstance().getApplicationServerPrefix();
+ try {
+ URL serverUrl = new URL(server);
+ Socket socket = new Socket(serverUrl.getHost(), serverUrl.getPort());
+ if (socket.getInetAddress().isLoopbackAddress()) {
+ OseeLog.log(CoreClientActivator.class, Level.INFO, "Deleting binary data from application server...");
+ String binaryDataPath = ClientSessionManager.getDataStorePath();
+ Lib.deleteDir(new File(binaryDataPath + File.separator + "attr"));
+ Lib.deleteDir(new File(binaryDataPath + File.separator + "snapshot"));
+ } else {
+ displayWarning = true;
+ }
+ } catch (Exception ex) {
+ displayWarning = true;
+ }
+ if (displayWarning) {
+ OseeLog.log(CoreClientActivator.class, Level.WARNING, "Unable to delete binary data from application server");
+ }
+ }
+
+ private List<URL> getSchemaFiles() throws OseeCoreException {
+ List<URL> toReturn = new ArrayList<URL>();
+ List<IConfigurationElement> list =
+ ExtensionPoints.getExtensionElements("org.eclipse.osee.framework.skynet.core.OseeDbSchema", "Schema");
+ for (IConfigurationElement element : list) {
+ String fileName = element.getAttribute("SchemaFile");
+ String bundleName = element.getContributor().getName();
+ String initRuleClassName = element.getAttribute("DbInitRule");
+
+ if (Strings.isValid(bundleName) && Strings.isValid(fileName)) {
+ if (false != fileName.endsWith(DbConfigFileInformation.getSchemaFileExtension())) {
+ Bundle bundle = Platform.getBundle(bundleName);
+
+ boolean isAllowed = true;
+ if (Strings.isValid(initRuleClassName)) {
+ isAllowed = false;
+ try {
+ Class<?> taskClass = bundle.loadClass(initRuleClassName);
+ IDbInitializationRule rule = (IDbInitializationRule) taskClass.newInstance();
+ isAllowed = rule.isAllowed();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ if (isAllowed) {
+ URL url = bundle.getEntry(fileName);
+ if (url != null) {
+ System.out.println("Adding Schema: [" + fileName + "]");
+ toReturn.add(url);
+ }
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ /**
+ * @throws OseeDataStoreException
+ */
+ private void addDefaultPermissions() throws OseeDataStoreException {
+ for (PermissionEnum permission : PermissionEnum.values()) {
+ ConnectionHandler.runPreparedUpdate(ADD_PERMISSION, permission.getPermId(), permission.getName());
+ }
+ }
+
+ /**
+ * @throws OseeDataStoreException
+ */
+ private void populateSequenceTable() throws OseeDataStoreException {
+ for (String sequenceName : SequenceManager.sequenceNames) {
+ SequenceManager.internalInitializeSequence(sequenceName);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/AccessControlEventType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/AccessControlEventType.java
new file mode 100644
index 00000000000..f71c01c1f7d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/AccessControlEventType.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum AccessControlEventType {
+ ArtifactsLocked(EventType.LocalAndRemote),
+ ArtifactsUnlocked(EventType.LocalAndRemote),
+ UserAuthenticated(EventType.LocalOnly);
+
+ private final EventType eventType;
+
+ public boolean isRemoteEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.RemoteOnly;
+ }
+
+ public boolean isLocalEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.LocalOnly;
+ }
+
+ /**
+ * @param localOnly true if this event type is to be thrown only locally and not to other clients
+ */
+ private AccessControlEventType(EventType eventType) {
+ this.eventType = eventType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactModifiedEvent.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactModifiedEvent.java
new file mode 100644
index 00000000000..754bc9da50c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactModifiedEvent.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.framework.skynet.core.event;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.messaging.event.skynet.event.SkynetAttributeChange;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedArtifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactModifiedEvent extends ArtifactTransactionModifiedEvent {
+
+ protected final Sender sender;
+ protected final ArtifactModType artifactModType;
+ protected final Artifact artifact;
+ protected final UnloadedArtifact unloadedArtifact;
+ protected final int transactionNumber;
+ protected final Collection<SkynetAttributeChange> dirtySkynetAttributeChanges;
+
+ public ArtifactModifiedEvent(Sender sender, ArtifactModType artifactModType, Artifact artifact, int transactionNumber, Collection<SkynetAttributeChange> dirtySkynetAttributeChanges) {
+ this.sender = sender;
+ this.artifactModType = artifactModType;
+ this.artifact = artifact;
+ this.transactionNumber = transactionNumber;
+ this.dirtySkynetAttributeChanges = dirtySkynetAttributeChanges;
+ this.unloadedArtifact = null;
+ }
+
+ public ArtifactModifiedEvent(Sender sender, ArtifactModType artifactModType, UnloadedArtifact unloadedArtifact) {
+ this.sender = sender;
+ this.artifactModType = artifactModType;
+ this.unloadedArtifact = unloadedArtifact;
+ this.artifact = null;
+ this.transactionNumber = -1;
+ this.dirtySkynetAttributeChanges = null;
+ }
+
+ @Override
+ public String toString() {
+ return artifactModType + " - " + (artifact != null ? "Loaded" : "Unloaded") + " - " + sender + " - " + dirtySkynetAttributeChanges;
+ }
+
+ public Collection<SkynetAttributeChange> getAttributeChanges() {
+ return dirtySkynetAttributeChanges;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactTransactionModifiedEvent.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactTransactionModifiedEvent.java
new file mode 100644
index 00000000000..4a9c7b1f59c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ArtifactTransactionModifiedEvent.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactTransactionModifiedEvent {
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventListener.java
new file mode 100644
index 00000000000..dd21720caba
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventListener.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.framework.skynet.core.event;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class BranchEventListener implements IBranchEventListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, org.eclipse.osee.framework.skynet.core.artifact.Branch, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventType.java
new file mode 100644
index 00000000000..eb2826aa7a2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BranchEventType.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum BranchEventType {
+
+ // Local and Remote events
+ Deleted(EventType.LocalAndRemote),
+ Added(EventType.LocalAndRemote),
+ Renamed(EventType.LocalAndRemote),
+ Committed(EventType.LocalAndRemote);
+
+ private final EventType eventType;
+
+ public boolean isRemoteEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.RemoteOnly;
+ }
+
+ public boolean isLocalEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.LocalOnly;
+ }
+
+ /**
+ * @param localOnly true if this event type is to be thrown only locally and not to other clients
+ */
+ private BranchEventType(EventType eventType) {
+ this.eventType = eventType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BroadcastEventType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BroadcastEventType.java
new file mode 100644
index 00000000000..4688ac2d571
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/BroadcastEventType.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum BroadcastEventType {
+ Message(EventType.RemoteOnly),
+ Ping(EventType.RemoteOnly),
+ Pong(EventType.RemoteOnly),
+ Force_Shutdown(EventType.RemoteOnly);
+
+ private final EventType eventType;
+
+ public boolean isRemoteEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.RemoteOnly;
+ }
+
+ public boolean isLocalEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.LocalOnly;
+ }
+
+ /**
+ * @param localOnly true if this event type is to be thrown only locally and not to other clients
+ */
+ private BroadcastEventType(EventType eventType) {
+ this.eventType = eventType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/EventType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/EventType.java
new file mode 100644
index 00000000000..185607c39ea
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/EventType.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum EventType {
+
+ // Event is only sent locally and not sent remotely
+ LocalOnly,
+
+ // Event is not send locally, but is sent remotely
+ RemoteOnly,
+
+ // Event is sent both locally and remotely
+ LocalAndRemote
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/FrameworkTransactionData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/FrameworkTransactionData.java
new file mode 100644
index 00000000000..9fbe3ed5b7d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/FrameworkTransactionData.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.event;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedArtifact;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedRelation;
+
+/**
+ * Collection of all the data that makes up a single SkynetTransaction and helper methods that allow the applications to
+ * easily determine how the changes should be handled. Since events changing artifacts and relations can happen
+ * internally in a single client or externally through a server or another client, this class separates the events into
+ * cached and unloaded objects.<br>
+ * <br>
+ * In most cases, applications should only care about artifacts/relations that are loaded into their client's cache.
+ * This class provides easy access to this information. In cases where more information is necessary, the Unloaded
+ * objects are provided with the data needed to 1) determine if application cares about event prior to loading 2) data
+ * needed to load the objects.<br>
+ * <br>
+ * Care needs to be taken by applications to no load every unloaded artifact and relation to determine if the event
+ * needs to be handled. If unloaded objects need to be loaded, their artIds should be collected and bulk loaded through
+ * the ArtifactQuery methods such as ArtifactQuery.getArtifactsByIds.
+ *
+ * @author Donald G. Dunne
+ */
+public class FrameworkTransactionData {
+
+ Collection<ArtifactTransactionModifiedEvent> xModifiedEvents;
+
+ // artifact collections of artifacts based on artifactModType that are currently loaded in the client's artifact cache
+ public Set<Artifact> cacheChangedArtifacts = new HashSet<Artifact>();
+ public Set<Artifact> cacheDeletedArtifacts = new HashSet<Artifact>();
+ public Set<Artifact> cacheAddedArtifacts = new HashSet<Artifact>();
+
+ // collection of unloaded artifact changes that are NOT currently loaded in the client's artifact cache;
+ // where UnloadedArtifact contains artifact id, branch and artifact type id
+ public Set<UnloadedArtifact> unloadedChangedArtifacts = new HashSet<UnloadedArtifact>();
+ public Set<UnloadedArtifact> unloadedDeletedArtifacts = new HashSet<UnloadedArtifact>();
+ public Set<UnloadedArtifact> unloadedAddedArtifacts = new HashSet<UnloadedArtifact>();
+
+ // cacheRelations are relations where one side artifact is already loaded in client's cache
+ // NOTE: Change relations are Rationale or Order changes only
+ public Set<LoadedRelation> cacheChangedRelations = new HashSet<LoadedRelation>();
+ public Set<LoadedRelation> cacheAddedRelations = new HashSet<LoadedRelation>();
+ public Set<LoadedRelation> cacheDeletedRelations = new HashSet<LoadedRelation>();
+
+ // unloadedRelations are relations where neither side artifact is loaded in client's cache; normally don't care about these
+ // NOTE: Change relations are Rationale or Order changes only
+ public Set<UnloadedRelation> unloadedChangedRelations = new HashSet<UnloadedRelation>();
+ public Set<UnloadedRelation> unloadedAddedRelations = new HashSet<UnloadedRelation>();
+ public Set<UnloadedRelation> unloadedDeletedRelations = new HashSet<UnloadedRelation>();
+
+ // artifact collection of artifacts on either side of a relation that are loaded in client's cache
+ // NOTE: Change relations are Rationale or Order changes only
+ public Set<Artifact> cacheRelationChangedArtifacts = new HashSet<Artifact>();
+ public Set<Artifact> cacheRelationDeletedArtifacts = new HashSet<Artifact>();
+ public Set<Artifact> cacheRelationAddedArtifacts = new HashSet<Artifact>();
+
+ public int branchId = -1;
+
+ public static enum ChangeType {
+ Changed, Deleted, Added, All
+ };
+
+ /**
+ * Return branchId of loaded artifacts or -1 if no loaded artifacts
+ *
+ * @return branchId
+ */
+ public Integer getBranchId() {
+ return branchId;
+ }
+
+ public Collection<Artifact> getArtifactsInRelations(ChangeType changeType, RelationType relationTypes) {
+ return getArtifactsInRelations(changeType, Arrays.asList(relationTypes));
+ }
+
+ public Collection<Artifact> getArtifactsInRelations(ChangeType changeType, Collection<RelationType> relationTypes) {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ if (changeType == ChangeType.Added || changeType == ChangeType.All) {
+ for (LoadedRelation loadedRelation : cacheAddedRelations) {
+ if (relationTypes.contains(loadedRelation.getRelationType())) {
+ if (loadedRelation.getArtifactA() != null) artifacts.add(loadedRelation.getArtifactA());
+ if (loadedRelation.getArtifactB() != null) artifacts.add(loadedRelation.getArtifactB());
+ }
+ }
+ }
+ if (changeType == ChangeType.Deleted || changeType == ChangeType.All) {
+ for (LoadedRelation loadedRelation : cacheDeletedRelations) {
+ if (relationTypes.contains(loadedRelation.getRelationType())) {
+ if (loadedRelation.getArtifactA() != null) artifacts.add(loadedRelation.getArtifactA());
+ if (loadedRelation.getArtifactB() != null) artifacts.add(loadedRelation.getArtifactB());
+ }
+ }
+ }
+ if (changeType == ChangeType.Changed || changeType == ChangeType.All) {
+ for (LoadedRelation loadedRelation : cacheChangedRelations) {
+ if (relationTypes.contains(loadedRelation.getRelationType())) {
+ if (loadedRelation.getArtifactA() != null) artifacts.add(loadedRelation.getArtifactA());
+ if (loadedRelation.getArtifactB() != null) artifacts.add(loadedRelation.getArtifactB());
+ }
+ }
+ }
+ return artifacts;
+ }
+
+ public Collection<Integer> getArtifactIdsOfArtifactType(ArtifactType artifactType, ArtifactModType... artifactModType) throws OseeCoreException {
+ Collection<ArtifactModType> artifactModTypes =
+ org.eclipse.osee.framework.jdk.core.util.Collections.getAggregate(artifactModType);
+ if (artifactType == null) return Collections.emptyList();
+ Set<Integer> artIds = new HashSet<Integer>();
+ for (ArtifactTransactionModifiedEvent modEvent : xModifiedEvents) {
+ if (modEvent instanceof ArtifactModifiedEvent) {
+ if (artifactModTypes.contains(artifactModType) && (((ArtifactModifiedEvent) modEvent).unloadedArtifact.getArtifactTypeId() == artifactType.getArtTypeId())) {
+ artIds.add(((ArtifactModifiedEvent) modEvent).unloadedArtifact.getArtifactId());
+ }
+ }
+ }
+ return artIds;
+ }
+
+ /**
+ * Return artifacts related to this artifact from event service loadedRelations collection. This will bulk load all
+ * opposite-side artifacts if they are not already loaded.
+ *
+ * @param cacheRelations
+ * @return collection of related artifacts
+ * @throws OseeCoreException
+ */
+ public Collection<Artifact> getRelatedArtifacts(int artId, int relationTypeId, int branchId, Collection<LoadedRelation> loadedRelations) throws OseeCoreException {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ try {
+ Set<Integer> artifactIds = new HashSet<Integer>();
+ for (LoadedRelation loadedRelation : loadedRelations) {
+ // If given artId is artA
+ if (loadedRelation.getArtifactA() != null && loadedRelation.getArtifactA().getArtId() == artId) {
+ if (loadedRelation.getRelationType().getRelationTypeId() == relationTypeId) {
+ if (loadedRelation.getArtifactB() != null) {
+ artifacts.add(loadedRelation.getArtifactB());
+ } else {
+ artifactIds.add(loadedRelation.getUnloadedRelation().getArtifactBId());
+ }
+ }
+ }
+ // If given artId is ArtB
+ if (loadedRelation.getArtifactB() != null && loadedRelation.getArtifactB().getArtId() == artId) {
+ if (loadedRelation.getRelationType().getRelationTypeId() == relationTypeId) {
+ if (loadedRelation.getArtifactA() != null) {
+ artifacts.add(loadedRelation.getArtifactA());
+ } else {
+ artifactIds.add(loadedRelation.getUnloadedRelation().getArtifactAId());
+ }
+ }
+ }
+ }
+ if (artifactIds.size() > 0) {
+ artifacts.addAll(ArtifactQuery.getArtifactsFromIds(artifactIds, BranchManager.getBranch(branchId), false));
+ }
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ return artifacts;
+ }
+
+ public boolean isRelAddedChangedDeleted(Artifact artifact) {
+ return isRelAddedChangedDeleted(artifact.getArtId());
+ }
+
+ public boolean isRelAddedChangedDeleted(int artId) {
+ return isRelChange(artId) || isRelAdded(artId) || isRelDeleted(artId);
+
+ }
+
+ /**
+ * @return true if any event was found
+ */
+ public boolean isHasEvent(Artifact artifact) {
+ return isHasEvent(artifact.getArtId());
+ }
+
+ /**
+ * @return true if any event was found
+ */
+ public boolean isHasEvent(int artId) {
+ return isChanged(artId) || isDeleted(artId) || isRelChange(artId) || isRelDeleted(artId) || isRelAdded(artId);
+ }
+
+ public boolean isDeleted(Artifact artifact) {
+ return isDeleted(artifact.getArtId());
+ }
+
+ public boolean isDeleted(int artId) {
+ for (Artifact art : cacheDeletedArtifacts) {
+ if (art.getArtId() == artId) return true;
+ }
+ return false;
+ }
+
+ public boolean isChanged(Artifact artifact) {
+ return isChanged(artifact.getArtId());
+ }
+
+ public boolean isChanged(int artId) {
+ for (Artifact art : cacheChangedArtifacts) {
+ if (art.getArtId() == artId) return true;
+ }
+ return false;
+ }
+
+ /**
+ * Relation rationale or order changed
+ *
+ * @param artifact
+ */
+ public boolean isRelChange(Artifact artifact) {
+ return isRelChange(artifact.getArtId());
+ }
+
+ /**
+ * Relation rationale or order changed
+ *
+ * @param artifact
+ */
+ public boolean isRelChange(int artId) {
+ for (Artifact art : cacheRelationChangedArtifacts) {
+ if (art.getArtId() == artId) return true;
+ }
+ return false;
+ }
+
+ public boolean isRelDeleted(Artifact artifact) {
+ return isRelDeleted(artifact.getArtId());
+ }
+
+ public boolean isRelDeleted(int artId) {
+ for (Artifact art : cacheRelationDeletedArtifacts) {
+ if (art.getArtId() == artId) return true;
+ }
+ return false;
+ }
+
+ public boolean isRelAdded(Artifact artifact) {
+ return isRelAdded(artifact.getArtId());
+ }
+
+ public boolean isRelAdded(int artId) {
+ for (Artifact art : cacheRelationAddedArtifacts) {
+ if (art.getArtId() == artId) return true;
+ }
+ return false;
+ }
+
+ /**
+ * @return the xModifiedEvents
+ */
+ public Collection<ArtifactTransactionModifiedEvent> getXModifiedEvents() {
+ return xModifiedEvents;
+ }
+
+ /**
+ * @param modifiedEvents the xModifiedEvents to set
+ */
+ public void setXModifiedEvents(Collection<ArtifactTransactionModifiedEvent> modifiedEvents) {
+ xModifiedEvents = modifiedEvents;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IAccessControlEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IAccessControlEventListener.java
new file mode 100644
index 00000000000..ab44c202a7a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IAccessControlEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAccessControlEventListener extends IEventListner {
+ public void handleAccessControlArtifactsEvent(Sender sender, AccessControlEventType accessControlModType, LoadedArtifacts loadedArtifactss);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactModifiedEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactModifiedEventListener.java
new file mode 100644
index 00000000000..5b610643ec6
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactModifiedEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IArtifactModifiedEventListener extends IEventListner {
+ public void handleArtifactModifiedEvent(Sender sender, ArtifactModType artifactModType, Artifact artifact);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsChangeTypeEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsChangeTypeEventListener.java
new file mode 100644
index 00000000000..9fa62382c1d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsChangeTypeEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IArtifactsChangeTypeEventListener extends IEventListner {
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, LoadedArtifacts loadedArtifacts);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsPurgedEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsPurgedEventListener.java
new file mode 100644
index 00000000000..e6f68c9a1d9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IArtifactsPurgedEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IArtifactsPurgedEventListener extends IEventListner {
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBranchEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBranchEventListener.java
new file mode 100644
index 00000000000..b2ed6340c59
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBranchEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IBranchEventListener extends IEventListner {
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) throws OseeCoreException;
+
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBroadcastEventListneer.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBroadcastEventListneer.java
new file mode 100644
index 00000000000..f296e78ffa1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IBroadcastEventListneer.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.framework.skynet.core.event;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IBroadcastEventListneer extends IEventListner {
+ public void handleBroadcastEvent(Sender sender, BroadcastEventType broadcastEventType, String[] userIds, String message);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IEventListner.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IEventListner.java
new file mode 100644
index 00000000000..84af5cc1fff
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IEventListner.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IEventListner {
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IFrameworkTransactionEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IFrameworkTransactionEventListener.java
new file mode 100644
index 00000000000..7334397b30d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IFrameworkTransactionEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * Event that represents a collection of ArtifactModifiedEvent and RelationModifiedEvent events that are collected and
+ * persisted within a single SkynetTransaction.
+ *
+ * @author Donald G. Dunne
+ */
+public interface IFrameworkTransactionEventListener extends IEventListner {
+
+ /**
+ * Notification of all artifact and relation modifications collected as part of a single skynet transaction.
+ *
+ * @param source
+ * @param transData collection of all changes within transaction
+ * @throws OseeCoreException TODO
+ */
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IMergeBranchEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IMergeBranchEventListener.java
new file mode 100644
index 00000000000..45cf2d18a34
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IMergeBranchEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IMergeBranchEventListener extends IEventListner {
+
+ public void handleMergeBranchEvent(Sender sender, MergeBranchEventType branchModType, int branchId) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRelationModifiedEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRelationModifiedEventListener.java
new file mode 100644
index 00000000000..b68418a3f8e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRelationModifiedEventListener.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IRelationModifiedEventListener extends IEventListner {
+ public void handleRelationModifiedEvent(Sender sender, RelationModType relationModType, RelationLink link, Branch branch, String relationType);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRemoteEventManagerEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRemoteEventManagerEventListener.java
new file mode 100644
index 00000000000..d2ac62440fb
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/IRemoteEventManagerEventListener.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IRemoteEventManagerEventListener extends IEventListner {
+ public void handleRemoteEventManagerEvent(Sender sender, RemoteEventServiceEventType remoteEventServiceEventType);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ITransactionsDeletedEventListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ITransactionsDeletedEventListener.java
new file mode 100644
index 00000000000..de773e683b1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/ITransactionsDeletedEventListener.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.framework.skynet.core.event;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface ITransactionsDeletedEventListener extends IEventListner {
+ public void handleTransactionsDeletedEvent(Sender sender, int[] transactionIds);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/InternalEventManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/InternalEventManager.java
new file mode 100644
index 00000000000..e2dd56863cf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/InternalEventManager.java
@@ -0,0 +1,976 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.event;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkAccessControlArtifactsEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactAddedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactChangeTypeEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactDeletedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactModifiedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactPurgeEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkBroadcastEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkCommitBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkDeletedBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkMergeBranchConflictResolvedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkNewBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkNewRelationLinkEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRelationLinkDeletedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRelationLinkOrderModifiedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRelationLinkRationalModifiedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRenameBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkTransactionDeletedEvent;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedArtifact;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedRelation;
+
+/**
+ * Internal implementation of OSEE Event Manager that should only be accessed from RemoteEventManager and
+ * OseeEventManager classes.
+ *
+ * @author Donald G. Dunne
+ */
+public class InternalEventManager {
+
+ private static final Set<IEventListner> listeners = new CopyOnWriteArraySet<IEventListner>();
+ public static final Collection<UnloadedArtifact> EMPTY_UNLOADED_ARTIFACTS = Collections.emptyList();
+ private static boolean disableEvents = false;
+ private static ExecutorService executorService = Executors.newFixedThreadPool(4);
+ // This will disable all Local TransactionEvents and enable loopback routing of Remote TransactionEvents back
+ // through the RemoteEventService as if they came from another client. This is for testing purposes only and
+ // should be reset to false before release.
+ public static final boolean enableRemoteEventLoopback = false;
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Events"));
+
+ /**
+ * Kick LOCAL "remote event manager" event
+ *
+ * @param sender
+ * @param remoteEventServiceEventType
+ * @throws OseeCoreException
+ */
+ static void kickRemoteEventManagerEvent(final Sender sender, final RemoteEventServiceEventType remoteEventServiceEventType) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickRemoteEventManagerEvent: type: " + remoteEventServiceEventType + " - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ try {
+ if (sender.isLocal() && remoteEventServiceEventType.isLocalEventType()) {
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IRemoteEventManagerEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IRemoteEventManagerEventListener) listener).handleRemoteEventManagerEvent(sender,
+ remoteEventServiceEventType);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE broadcast event
+ *
+ * @param sender
+ * @param broadcastEventType
+ * @param userIds (currently only used for disconnect_skynet)
+ * @param message
+ * @throws OseeCoreException
+ */
+ static void kickBroadcastEvent(final Sender sender, final BroadcastEventType broadcastEventType, final String[] userIds, final String message) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ // Don't display ping/pong events
+ if (broadcastEventType != BroadcastEventType.Ping && broadcastEventType != BroadcastEventType.Pong) {
+ try {
+ if (DEBUG) {
+ OseeLog.log(
+ InternalEventManager.class,
+ Level.INFO,
+ "OEM: kickBroadcastEvent: type: " + broadcastEventType.name() + " message: " + message + " - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ try {
+ // Kick from REMOTE
+ if (sender.isRemote() || (sender.isLocal() && broadcastEventType.isLocalEventType())) {
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IBroadcastEventListneer) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IBroadcastEventListneer) listener).handleBroadcastEvent(sender, broadcastEventType,
+ userIds, message);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+
+ if (sender.isLocal() && broadcastEventType.isRemoteEventType()) {
+ RemoteEventManager.kick(new NetworkBroadcastEvent(broadcastEventType.name(), message,
+ sender.getNetworkSender()));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE branch events
+ *
+ * @param sender
+ * @param branchEventType
+ * @param branchId
+ * @throws OseeCoreException
+ */
+ static void kickBranchEvent(final Sender sender, final BranchEventType branchEventType, final int branchId) {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickBranchEvent: type: " + branchEventType + " id: " + branchId + " - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ try {
+ // Log if this is a loopback and what is happening
+ if (enableRemoteEventLoopback) {
+ OseeLog.log(
+ InternalEventManager.class,
+ Level.WARNING,
+ "OEM: BranchEvent Loopback enabled" + (sender.isLocal() ? " - Ignoring Local Kick" : " - Kicking Local from Loopback"));
+ }
+
+ // Kick LOCAL
+ if (!enableRemoteEventLoopback || (enableRemoteEventLoopback && branchEventType.isRemoteEventType() && sender.isRemote())) {
+ if (sender.isRemote() || (sender.isLocal() && branchEventType.isLocalEventType())) {
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IBranchEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IBranchEventListener) listener).handleBranchEvent(sender, branchEventType, branchId);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+
+ if (sender.isLocal() && branchEventType.isRemoteEventType()) {
+ if (branchEventType == BranchEventType.Added) {
+ RemoteEventManager.kick(new NetworkNewBranchEvent(branchId, sender.getNetworkSender()));
+ } else if (branchEventType == BranchEventType.Deleted) {
+ RemoteEventManager.kick(new NetworkDeletedBranchEvent(branchId, sender.getNetworkSender()));
+ } else if (branchEventType == BranchEventType.Committed) {
+ RemoteEventManager.kick(new NetworkCommitBranchEvent(branchId, sender.getNetworkSender()));
+ } else if (branchEventType == BranchEventType.Renamed) {
+ Branch branch = null;
+ try {
+ branch = BranchManager.getBranch(branchId);
+ RemoteEventManager.kick(new NetworkRenameBranchEvent(branchId, sender.getNetworkSender(),
+ branch.getBranchName(), branch.getBranchShortName()));
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE branch events
+ *
+ * @param sender
+ * @param mergeBranchEventType
+ * @param branchId
+ * @throws OseeCoreException
+ */
+ static void kickMergeBranchEvent(final Sender sender, final MergeBranchEventType branchEventType, final int branchId) {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickMergeBranchEvent: type: " + branchEventType + " id: " + branchId + " - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ try {
+ // Log if this is a loopback and what is happening
+ if (enableRemoteEventLoopback) {
+ OseeLog.log(
+ InternalEventManager.class,
+ Level.WARNING,
+ "OEM: MergeBranchEvent Loopback enabled" + (sender.isLocal() ? " - Ignoring Local Kick" : " - Kicking Local from Loopback"));
+ }
+
+ // Kick LOCAL
+ if (!enableRemoteEventLoopback || (enableRemoteEventLoopback && branchEventType.isRemoteEventType() && sender.isRemote())) {
+ if (sender.isRemote() || (sender.isLocal() && branchEventType.isLocalEventType())) {
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IMergeBranchEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IMergeBranchEventListener) listener).handleMergeBranchEvent(sender, branchEventType,
+ branchId);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+
+ if (sender.isLocal() && branchEventType.isRemoteEventType()) {
+ if (branchEventType == MergeBranchEventType.ConflictResolved) {
+ RemoteEventManager.kick(new NetworkMergeBranchConflictResolvedEvent(branchId,
+ sender.getNetworkSender()));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ private static void execute(Runnable runnable) {
+ executorService.submit(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE access control events
+ *
+ * @param sender
+ * @param accessControlEventType
+ * @param LoadedArtifacts
+ */
+ static void kickAccessControlArtifactsEvent(final Sender sender, final AccessControlEventType accessControlEventType, final LoadedArtifacts loadedArtifacts) {
+ if (sender == null) throw new IllegalArgumentException("sender can not be null");
+ if (accessControlEventType == null) throw new IllegalArgumentException("accessControlEventType can not be null");
+ if (loadedArtifacts == null) throw new IllegalArgumentException("loadedArtifacts can not be null");
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(
+ InternalEventManager.class,
+ Level.INFO,
+ "OEM: kickAccessControlEvent - type: " + accessControlEventType + sender + " loadedArtifacts: " + loadedArtifacts);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ if (accessControlEventType.isLocalEventType()) {
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IAccessControlEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IAccessControlEventListener) listener).handleAccessControlArtifactsEvent(sender,
+ accessControlEventType, loadedArtifacts);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+ try {
+ if (sender.isLocal() && accessControlEventType.isRemoteEventType()) {
+ Integer branchId = null;
+ if (loadedArtifacts != null && loadedArtifacts.getLoadedArtifacts().size() > 0) {
+ branchId = loadedArtifacts.getLoadedArtifacts().iterator().next().getBranch().getBranchId();
+ }
+ RemoteEventManager.kick(new NetworkAccessControlArtifactsEvent(accessControlEventType.name(),
+ branchId == null ? 0 : branchId, loadedArtifacts.getAllArtifactIds(),
+ loadedArtifacts.getAllArtifactTypeIds(), sender.getNetworkSender()));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL event to notify application that the branch to artifact cache has been updated; This event does NOT go
+ * external
+ *
+ * @param sender
+ * @param branchModType
+ * @param branchId
+ * @throws OseeCoreException
+ */
+ static void kickLocalBranchToArtifactCacheUpdateEvent(final Sender sender) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickLocalBranchToArtifactCacheUpdateEvent - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IBranchEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IBranchEventListener) listener).handleLocalBranchToArtifactCacheUpdateEvent(sender);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL artifact modified event; This event does NOT go external
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ static void kickArtifactModifiedEvent(final Sender sender, final ArtifactModType artifactModType, final Artifact artifact) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(
+ InternalEventManager.class,
+ Level.INFO,
+ "OEM: kickArtifactModifiedEvent - " + artifactModType + " - " + artifact.getHumanReadableId() + " - " + sender + " - " + artifact.getDirtySkynetAttributeChanges());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IArtifactModifiedEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IArtifactModifiedEventListener) listener).handleArtifactModifiedEvent(sender, artifactModType,
+ artifact);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL relation modified event; This event does NOT go external
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ static void kickRelationModifiedEvent(final Sender sender, final RelationModType relationModType, final RelationLink link, final Branch branch, final String relationType) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickRelationModifiedEvent - " + relationModType + " - " + link + " - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IRelationModifiedEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IRelationModifiedEventListener) listener).handleRelationModifiedEvent(sender, relationModType,
+ link, branch, relationType);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE purged event depending on sender
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ static void kickArtifactsPurgedEvent(final Sender sender, final LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickArtifactsPurgedEvent " + sender + " - " + loadedArtifacts);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IArtifactsPurgedEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IArtifactsPurgedEventListener) listener).handleArtifactsPurgedEvent(sender, loadedArtifacts);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+ try {
+ if (sender.isLocal()) {
+ RemoteEventManager.kick(new NetworkArtifactPurgeEvent(
+ loadedArtifacts.getLoadedArtifacts().iterator().next().getBranch().getBranchId(),
+ loadedArtifacts.getAllArtifactIds(), loadedArtifacts.getAllArtifactTypeIds(),
+ sender.getNetworkSender()));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE artifact change type depending on sender
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param toArtifactTypeId
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ static void kickArtifactsChangeTypeEvent(final Sender sender, final int toArtifactTypeId, final LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickArtifactsChangeTypeEvent " + sender + " - " + loadedArtifacts);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IArtifactsChangeTypeEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IArtifactsChangeTypeEventListener) listener).handleArtifactsChangeTypeEvent(sender,
+ toArtifactTypeId, loadedArtifacts);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+ try {
+ if (sender.isLocal()) {
+ RemoteEventManager.kick(new NetworkArtifactChangeTypeEvent(
+ loadedArtifacts.getLoadedArtifacts().iterator().next().getBranch().getBranchId(),
+ loadedArtifacts.getAllArtifactIds(), loadedArtifacts.getAllArtifactTypeIds(), toArtifactTypeId,
+ sender.getNetworkSender()));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and remote transaction deleted event
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @throws OseeCoreException
+ */
+ static void kickTransactionsDeletedEvent(final Sender sender, final int[] transactionIds) throws OseeCoreException {
+ //TODO This needs to be converted into the individual artifacts and relations that were deleted/modified
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickTransactionsDeletedEvent " + sender + " - " + transactionIds.length);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Kick LOCAL
+ for (IEventListner listener : listeners) {
+ if (listener instanceof ITransactionsDeletedEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((ITransactionsDeletedEventListener) listener).handleTransactionsDeletedEvent(sender,
+ transactionIds);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+ try {
+ if (sender.isLocal()) {
+ RemoteEventManager.kick(new NetworkTransactionDeletedEvent(sender.getNetworkSender(), transactionIds));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE TransactionEvent
+ *
+ * @param sender
+ * @param xModifiedEvents
+ */
+ static void kickTransactionEvent(final Sender sender, Collection<ArtifactTransactionModifiedEvent> xModifiedEvents) {
+ if (isDisableEvents()) return;
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: kickTransactionEvent #ModEvents: " + xModifiedEvents.size() + " - " + sender);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ final Collection<ArtifactTransactionModifiedEvent> xModifiedEventsCopy =
+ new ArrayList<ArtifactTransactionModifiedEvent>();
+ xModifiedEventsCopy.addAll(xModifiedEvents);
+ Runnable runnable = new Runnable() {
+ public void run() {
+ // Roll-up change information
+ FrameworkTransactionData transData = createTransactionDataRollup(xModifiedEventsCopy);
+ try {
+ // Log if this is a loopback and what is happening
+ if (enableRemoteEventLoopback) {
+ OseeLog.log(
+ InternalEventManager.class,
+ Level.WARNING,
+ "OEM: TransactionEvent Loopback enabled" + (sender.isLocal() ? " - Ignoring Local Kick" : " - Kicking Local from Loopback"));
+ }
+
+ // Kick LOCAL
+ if (!enableRemoteEventLoopback || (enableRemoteEventLoopback && sender.isRemote())) {
+ for (IEventListner listener : listeners) {
+ if (listener instanceof IFrameworkTransactionEventListener) {
+ // Don't fail on any one listener's exception
+ try {
+ ((IFrameworkTransactionEventListener) listener).handleFrameworkTransactionEvent(sender,
+ transData);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ // Kick REMOTE (If source was Local and this was not a default branch changed event
+
+ if (sender.isLocal()) {
+ List<ISkynetEvent> events = generateNetworkSkynetEvents(sender, xModifiedEventsCopy);
+ RemoteEventManager.kick(events);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ execute(runnable);
+ }
+
+ /**
+ * Add listeners
+ *
+ * @param listener
+ */
+ static void addListener(IEventListner listener) {
+ if (listener == null) throw new IllegalArgumentException("listener can not be null");
+ listeners.add(listener);
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: addListener (" + listeners.size() + ") " + listener);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ }
+
+ static void removeListeners(IEventListner listener) {
+ listeners.remove(listener);
+ try {
+ if (DEBUG) {
+ OseeLog.log(InternalEventManager.class, Level.INFO,
+ "OEM: removeListener: (" + listeners.size() + ") " + listener);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.INFO, ex);
+ }
+ }
+
+ /**
+ * This method clears all listeners. Should only be used for testing purposes.
+ */
+ public static void removeAllListeners() {
+ listeners.clear();
+ }
+
+ public static String getObjectSafeName(Object object) {
+ try {
+ return object.toString();
+ } catch (Exception ex) {
+ return object.getClass().getSimpleName() + " - exception on toString: " + ex.getLocalizedMessage();
+ }
+ }
+
+ /**
+ * @return the disableEvents
+ */
+ static boolean isDisableEvents() {
+ return disableEvents;
+ }
+
+ /**
+ * @param disableEvents the disableEvents to set
+ */
+ static void setDisableEvents(boolean disableEvents) {
+ InternalEventManager.disableEvents = disableEvents;
+ }
+
+ static String getListenerReport() {
+ List<String> listenerStrs = new ArrayList<String>();
+ for (IEventListner listener : listeners) {
+ listenerStrs.add(getObjectSafeName(listener));
+ }
+ String[] listArr = listenerStrs.toArray(new String[listenerStrs.size()]);
+ Arrays.sort(listArr);
+ return org.eclipse.osee.framework.jdk.core.util.Collections.toString("\n", (Object[]) listArr);
+ }
+
+ private static List<ISkynetEvent> generateNetworkSkynetEvents(Sender sender, Collection<ArtifactTransactionModifiedEvent> xModifiedEvents) {
+ List<ISkynetEvent> events = new ArrayList<ISkynetEvent>();
+ for (ArtifactTransactionModifiedEvent xModifiedEvent : xModifiedEvents) {
+ if (xModifiedEvent instanceof ArtifactModifiedEvent) {
+ ArtifactModifiedEvent xArtifactModifiedEvent = (ArtifactModifiedEvent) xModifiedEvent;
+ if (xArtifactModifiedEvent.artifactModType == ArtifactModType.Changed) {
+ Artifact artifact = xArtifactModifiedEvent.artifact;
+ events.add(new NetworkArtifactModifiedEvent(artifact.getBranch().getBranchId(),
+ xArtifactModifiedEvent.transactionNumber, artifact.getArtId(), artifact.getArtTypeId(),
+ artifact.getFactory().getClass().getCanonicalName(),
+ xArtifactModifiedEvent.dirtySkynetAttributeChanges,
+ xArtifactModifiedEvent.sender.getNetworkSender()));
+ } else if (xArtifactModifiedEvent.artifactModType == ArtifactModType.Added) {
+ Artifact artifact = xArtifactModifiedEvent.artifact;
+ events.add(new NetworkArtifactAddedEvent(artifact.getBranch().getBranchId(),
+ xArtifactModifiedEvent.transactionNumber, artifact.getArtId(), artifact.getArtTypeId(),
+ artifact.getFactory().getClass().getCanonicalName(),
+ xArtifactModifiedEvent.sender.getNetworkSender()));
+ } else if (xArtifactModifiedEvent.artifactModType == ArtifactModType.Deleted) {
+ Artifact artifact = xArtifactModifiedEvent.artifact;
+ events.add(new NetworkArtifactDeletedEvent(artifact.getBranch().getBranchId(),
+ xArtifactModifiedEvent.transactionNumber, artifact.getArtId(), artifact.getArtTypeId(),
+ artifact.getFactory().getClass().getCanonicalName(),
+ xArtifactModifiedEvent.sender.getNetworkSender()));
+ } else {
+ OseeLog.log(InternalEventManager.class, Level.SEVERE,
+ "Unhandled xArtifactModifiedEvent event: " + xArtifactModifiedEvent);
+ }
+ } else if (xModifiedEvent instanceof RelationModifiedEvent) {
+ RelationModifiedEvent xRelationModifiedEvent = (RelationModifiedEvent) xModifiedEvent;
+ if (xRelationModifiedEvent.relationModType == RelationModType.ReOrdered) {
+ RelationLink link = xRelationModifiedEvent.link;
+ Artifact aArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_A);
+ Artifact bArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_B);
+ NetworkRelationLinkOrderModifiedEvent networkRelationLinkModifiedEvent =
+ new NetworkRelationLinkOrderModifiedEvent(link.getGammaId(), link.getBranch().getBranchId(),
+ link.getRelationId(), link.getAArtifactId(),
+ (aArtifact != null ? aArtifact.getArtTypeId() : -1), link.getBArtifactId(),
+ (bArtifact != null ? bArtifact.getArtTypeId() : -1), link.getRationale(), link.getAOrder(),
+ link.getBOrder(), sender.getNetworkSender(), link.getRelationType().getRelationTypeId());
+ events.add(networkRelationLinkModifiedEvent);
+ }
+ if (xRelationModifiedEvent.relationModType == RelationModType.RationaleMod) {
+ RelationLink link = xRelationModifiedEvent.link;
+ Artifact aArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_A);
+ Artifact bArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_B);
+ NetworkRelationLinkRationalModifiedEvent networkRelationLinkRationalModifiedEvent =
+ new NetworkRelationLinkRationalModifiedEvent(link.getGammaId(), link.getBranch().getBranchId(),
+ link.getRelationId(), link.getAArtifactId(),
+ (aArtifact != null ? aArtifact.getArtTypeId() : -1), link.getBArtifactId(),
+ (bArtifact != null ? bArtifact.getArtTypeId() : -1), link.getRationale(), link.getAOrder(),
+ link.getBOrder(), sender.getNetworkSender(), link.getRelationType().getRelationTypeId());
+ events.add(networkRelationLinkRationalModifiedEvent);
+ } else if (xRelationModifiedEvent.relationModType == RelationModType.Deleted) {
+ RelationLink link = xRelationModifiedEvent.link;
+ Artifact aArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_A);
+ Artifact bArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_B);
+ NetworkRelationLinkDeletedEvent networkRelationLinkModifiedEvent =
+ new NetworkRelationLinkDeletedEvent(link.getRelationType().getRelationTypeId(), link.getGammaId(),
+ link.getBranch().getBranchId(), link.getRelationId(),
+ link.getArtifactId(RelationSide.SIDE_A),
+ (aArtifact != null ? aArtifact.getArtTypeId() : -1),
+ link.getArtifactId(RelationSide.SIDE_B),
+ (bArtifact != null ? bArtifact.getArtTypeId() : -1), sender.getNetworkSender());
+ events.add(networkRelationLinkModifiedEvent);
+ } else if (xRelationModifiedEvent.relationModType == RelationModType.Added) {
+ RelationLink link = xRelationModifiedEvent.link;
+ Artifact aArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_A);
+ Artifact bArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_B);
+ NetworkNewRelationLinkEvent networkRelationLinkModifiedEvent =
+ new NetworkNewRelationLinkEvent(link.getGammaId(), link.getBranch().getBranchId(),
+ link.getRelationId(), link.getAArtifactId(),
+ (aArtifact != null ? aArtifact.getArtTypeId() : -1), link.getBArtifactId(),
+ (bArtifact != null ? bArtifact.getArtTypeId() : -1), link.getRationale(), link.getAOrder(),
+ link.getBOrder(), link.getRelationType().getRelationTypeId(),
+ link.getRelationType().getTypeName(), sender.getNetworkSender());
+ events.add(networkRelationLinkModifiedEvent);
+ } else {
+ OseeLog.log(InternalEventManager.class, Level.SEVERE,
+ "Unhandled xRelationModifiedEvent event: " + xRelationModifiedEvent);
+ }
+ }
+ }
+ return events;
+ }
+
+ private static FrameworkTransactionData createTransactionDataRollup(Collection<ArtifactTransactionModifiedEvent> xModifiedEvents) {
+ // Roll-up change information
+ FrameworkTransactionData transData = new FrameworkTransactionData();
+ transData.setXModifiedEvents(xModifiedEvents);
+
+ for (ArtifactTransactionModifiedEvent xModifiedEvent : xModifiedEvents) {
+ if (xModifiedEvent instanceof ArtifactModifiedEvent) {
+ ArtifactModifiedEvent xArtifactModifiedEvent = (ArtifactModifiedEvent) xModifiedEvent;
+ if (xArtifactModifiedEvent.artifactModType == ArtifactModType.Added) {
+ if (xArtifactModifiedEvent.artifact != null) {
+ transData.cacheAddedArtifacts.add(xArtifactModifiedEvent.artifact);
+ if (transData.branchId == -1) transData.branchId =
+ xArtifactModifiedEvent.artifact.getBranch().getBranchId();
+ } else {
+ transData.unloadedAddedArtifacts.add(xArtifactModifiedEvent.unloadedArtifact);
+ if (transData.branchId == -1) transData.branchId =
+ xArtifactModifiedEvent.unloadedArtifact.getBranchId();
+ }
+ }
+ if (xArtifactModifiedEvent.artifactModType == ArtifactModType.Deleted) {
+ if (xArtifactModifiedEvent.artifact != null) {
+ transData.cacheDeletedArtifacts.add(xArtifactModifiedEvent.artifact);
+ if (transData.branchId == -1) transData.branchId =
+ xArtifactModifiedEvent.artifact.getBranch().getBranchId();
+ } else {
+ transData.unloadedDeletedArtifacts.add(xArtifactModifiedEvent.unloadedArtifact);
+ if (transData.branchId == -1) transData.branchId =
+ xArtifactModifiedEvent.unloadedArtifact.getBranchId();
+ }
+ }
+ if (xArtifactModifiedEvent.artifactModType == ArtifactModType.Changed) {
+ if (xArtifactModifiedEvent.artifact != null) {
+ transData.cacheChangedArtifacts.add(xArtifactModifiedEvent.artifact);
+ if (transData.branchId == -1) transData.branchId =
+ xArtifactModifiedEvent.artifact.getBranch().getBranchId();
+ } else {
+ transData.unloadedChangedArtifacts.add(xArtifactModifiedEvent.unloadedArtifact);
+ if (transData.branchId == -1) transData.branchId =
+ xArtifactModifiedEvent.unloadedArtifact.getBranchId();
+ }
+ }
+ }
+ if (xModifiedEvent instanceof RelationModifiedEvent) {
+ RelationModifiedEvent xRelationModifiedEvent = (RelationModifiedEvent) xModifiedEvent;
+ UnloadedRelation unloadedRelation = xRelationModifiedEvent.unloadedRelation;
+ LoadedRelation loadedRelation = null;
+ // If link is loaded, get information from link
+ if (xRelationModifiedEvent.link != null) {
+ RelationLink link = xRelationModifiedEvent.link;
+ // Get artifact A/B if loaded in artifact cache
+ Artifact artA = ArtifactCache.getActive(link.getAArtifactId(), link.getABranch());
+ Artifact artB = ArtifactCache.getActive(link.getBArtifactId(), link.getBBranch());
+ try {
+ loadedRelation =
+ new LoadedRelation(artA, artB, xRelationModifiedEvent.link.getRelationType(),
+ xRelationModifiedEvent.branch, unloadedRelation);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ // Else, get information from unloadedRelation (if != null)
+ else if (unloadedRelation != null) {
+ Artifact artA =
+ ArtifactCache.getActive(unloadedRelation.getArtifactAId(), unloadedRelation.getBranchId());
+ Artifact artB =
+ ArtifactCache.getActive(unloadedRelation.getArtifactBId(), unloadedRelation.getBranchId());
+ if (artA != null || artB != null) {
+ try {
+ loadedRelation =
+ new LoadedRelation(artA, artB,
+ RelationTypeManager.getType(unloadedRelation.getRelationTypeId()),
+ artA != null ? artA.getBranch() : artB.getBranch(), unloadedRelation);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ if (xRelationModifiedEvent.relationModType == RelationModType.Added) {
+ if (loadedRelation != null) {
+ transData.cacheAddedRelations.add(loadedRelation);
+ if (loadedRelation.getArtifactA() != null) {
+ transData.cacheRelationAddedArtifacts.add(loadedRelation.getArtifactA());
+ if (transData.branchId == -1) transData.branchId =
+ loadedRelation.getArtifactA().getBranch().getBranchId();
+ }
+ if (loadedRelation.getArtifactB() != null) {
+ transData.cacheRelationAddedArtifacts.add(loadedRelation.getArtifactB());
+ if (transData.branchId == -1) transData.branchId =
+ loadedRelation.getArtifactB().getBranch().getBranchId();
+ }
+ }
+ if (unloadedRelation != null) {
+ transData.unloadedAddedRelations.add(unloadedRelation);
+ }
+ }
+ if (xRelationModifiedEvent.relationModType == RelationModType.Deleted) {
+ if (loadedRelation != null) {
+ transData.cacheDeletedRelations.add(loadedRelation);
+ if (loadedRelation.getArtifactA() != null) {
+ transData.cacheRelationDeletedArtifacts.add(loadedRelation.getArtifactA());
+ if (transData.branchId == -1) transData.branchId =
+ loadedRelation.getArtifactA().getBranch().getBranchId();
+ }
+ if (loadedRelation.getArtifactB() != null) {
+ transData.cacheRelationDeletedArtifacts.add(loadedRelation.getArtifactB());
+ if (transData.branchId == -1) transData.branchId =
+ loadedRelation.getArtifactB().getBranch().getBranchId();
+ }
+ }
+ if (unloadedRelation != null) {
+ transData.unloadedDeletedRelations.add(unloadedRelation);
+ if (transData.branchId == -1) transData.branchId = unloadedRelation.getBranchId();
+ }
+ }
+ if (xRelationModifiedEvent.relationModType == RelationModType.ReOrdered || xRelationModifiedEvent.relationModType == RelationModType.RationaleMod) {
+ if (loadedRelation != null) {
+ transData.cacheChangedRelations.add(loadedRelation);
+ if (loadedRelation.getArtifactA() != null) {
+ transData.cacheRelationChangedArtifacts.add(loadedRelation.getArtifactA());
+ if (transData.branchId == -1) transData.branchId =
+ loadedRelation.getArtifactA().getBranch().getBranchId();
+ }
+ if (loadedRelation.getArtifactB() != null) {
+ transData.cacheRelationChangedArtifacts.add(loadedRelation.getArtifactB());
+ if (transData.branchId == -1) transData.branchId =
+ loadedRelation.getArtifactB().getBranch().getBranchId();
+ }
+ }
+ if (unloadedRelation != null) {
+ transData.unloadedChangedRelations.add(unloadedRelation);
+ if (transData.branchId == -1) transData.branchId = unloadedRelation.getBranchId();
+ }
+ }
+ }
+ }
+
+ // Clean out known duplicates
+ transData.cacheChangedArtifacts.removeAll(transData.cacheDeletedArtifacts);
+ transData.cacheAddedArtifacts.removeAll(transData.cacheDeletedArtifacts);
+
+ return transData;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/LoadedRelation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/LoadedRelation.java
new file mode 100644
index 00000000000..2363b681701
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/LoadedRelation.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedRelation;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class LoadedRelation {
+
+ private final Artifact artifactA;
+ private final Artifact artifactB;
+ private final UnloadedRelation unloadedRelation;
+ private final RelationType relationType;
+ private final Branch branch;
+
+ public LoadedRelation(Artifact artifactA, Artifact artifactB, RelationType relationType, Branch branch, UnloadedRelation unloadedRelation) {
+ this.artifactA = artifactA;
+ this.artifactB = artifactB;
+ this.relationType = relationType;
+ this.branch = branch;
+ this.unloadedRelation = unloadedRelation;
+ }
+
+ @Override
+ public String toString() {
+ return "LoadedRelation - ArtA: " + this.artifactA + " - ArtB: " + this.artifactB + " - RelType: " + this.relationType + " - " + (unloadedRelation != null ? unloadedRelation.toString() : "");
+ }
+
+ /**
+ * @return the artifactA
+ */
+ public Artifact getArtifactA() {
+ return artifactA;
+ }
+
+ /**
+ * @return the artifactB
+ */
+ public Artifact getArtifactB() {
+ return artifactB;
+ }
+
+ /**
+ * @return the unloadedRelation
+ */
+ public UnloadedRelation getUnloadedRelation() {
+ return unloadedRelation;
+ }
+
+ /**
+ * @return the relationType
+ */
+ public RelationType getRelationType() {
+ return relationType;
+ }
+
+ /**
+ * @return the branch
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/MergeBranchEventType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/MergeBranchEventType.java
new file mode 100644
index 00000000000..49b51dfe2bd
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/MergeBranchEventType.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum MergeBranchEventType {
+
+ // Local and Remote events
+ ConflictResolved(EventType.LocalAndRemote),
+ Update(EventType.LocalAndRemote);
+
+ private final EventType eventType;
+
+ public boolean isRemoteEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.RemoteOnly;
+ }
+
+ public boolean isLocalEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.LocalOnly;
+ }
+
+ /**
+ * @param localOnly true if this event type is to be thrown only locally and not to other clients
+ */
+ private MergeBranchEventType(EventType eventType) {
+ this.eventType = eventType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/OseeEventManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/OseeEventManager.java
new file mode 100644
index 00000000000..58efe56a652
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/OseeEventManager.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.event;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+
+/**
+ * Front end to OSEE events. Provides ability to add and remove different event listeners as well as the ability to kick
+ * framework events.
+ *
+ * @author Donald G. Dunne
+ */
+public class OseeEventManager {
+
+ private static Sender getSender(Object sourceObject) throws OseeAuthenticationRequiredException {
+ // Sender came from Remote Event Manager if source == sender
+ if ((sourceObject instanceof Sender) && ((Sender) sourceObject).isRemote()) {
+ return (Sender) sourceObject;
+ }
+ // Else, create new sender based on sourceObject
+ return new Sender(sourceObject, ClientSessionManager.getSession());
+ }
+
+ /**
+ * Kick local remote event manager event
+ *
+ * @param sender
+ * @param remoteEventServiceEventType
+ * @throws OseeCoreException
+ */
+ public static void kickRemoteEventManagerEvent(Object source, RemoteEventServiceEventType remoteEventServiceEventType) throws OseeCoreException {
+ if (InternalEventManager.isDisableEvents()) return;
+ InternalEventManager.kickRemoteEventManagerEvent(getSender(source), remoteEventServiceEventType);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE broadcast event
+ *
+ * @param sender
+ * @param broadcastEventType
+ * @param userIds (currently only used for disconnect_skynet)
+ * @param message
+ * @throws OseeCoreException
+ */
+ public static void kickBroadcastEvent(Object source, BroadcastEventType broadcastEventType, String[] userIds, String message) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickBroadcastEvent(getSender(source), broadcastEventType, userIds, message);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE branch events
+ *
+ * @param sender
+ * @param branchEventType
+ * @param branchId
+ * @throws OseeCoreException
+ */
+ public static void kickBranchEvent(Object source, BranchEventType branchEventType, int branchId) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickBranchEvent(getSender(source), branchEventType, branchId);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE branch events
+ *
+ * @param sender
+ * @param mergeBranchEventType
+ * @param branchId
+ * @throws OseeCoreException
+ */
+ public static void kickMergeBranchEvent(Object source, MergeBranchEventType branchEventType, int branchId) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickMergeBranchEvent(getSender(source), branchEventType, branchId);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE access control events
+ *
+ * @param sender
+ * @param branchModType
+ * @param branchId
+ * @throws OseeAuthenticationRequiredException
+ * @throws OseeAuthenticationRequiredException
+ * @throws OseeCoreException
+ */
+ public static void kickAccessControlArtifactsEvent(Object source, final AccessControlEventType accessControlModType, final LoadedArtifacts loadedArtifacts) throws OseeAuthenticationRequiredException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickAccessControlArtifactsEvent(getSender(source), accessControlModType, loadedArtifacts);
+ }
+
+ /**
+ * Kick local event to notify application that the branch to artifact cache has been updated
+ *
+ * @param sender
+ * @param branchModType
+ * @param branchId
+ * @throws OseeCoreException
+ */
+ public static void kickLocalBranchToArtifactCacheUpdateEvent(Object source) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickLocalBranchToArtifactCacheUpdateEvent(getSender(source));
+ }
+
+ /**
+ * Kick LOCAL artifact modified event; This event does NOT go external
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ public static void kickArtifactModifiedEvent(Object source, ArtifactModType artifactModType, Artifact artifact) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickArtifactModifiedEvent(getSender(source), artifactModType, artifact);
+ }
+
+ /**
+ * Kick LOCAL relation modified event; This event does NOT go external
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ public static void kickRelationModifiedEvent(Object source, RelationModType relationModType, RelationLink link, Branch branch, String relationType) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickRelationModifiedEvent(getSender(source), relationModType, link, branch, relationType);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE purged event depending on sender
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ public static void kickArtifactsPurgedEvent(Object source, LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickArtifactsPurgedEvent(getSender(source), loadedArtifacts);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE artifact change type depending on sender
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @param toArtifactTypeId
+ * @param loadedArtifacts
+ * @throws OseeCoreException
+ */
+ public static void kickArtifactsChangeTypeEvent(Object source, int toArtifactTypeId, LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickArtifactsChangeTypeEvent(getSender(source), toArtifactTypeId, loadedArtifacts);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE transaction deleted event
+ *
+ * @param sender local if kicked from internal; remote if from external
+ * @throws OseeCoreException
+ */
+ public static void kickTransactionsDeletedEvent(Object source, int[] transactionIds) throws OseeCoreException {
+ if (isDisableEvents()) return;
+ //TODO This needs to be converted into the individual artifacts and relations that were deleted/modified
+ InternalEventManager.kickTransactionsDeletedEvent(getSender(source), transactionIds);
+ }
+
+ /**
+ * Kick LOCAL and REMOTE transaction event
+ *
+ * @param source
+ * @param xModifiedEvents
+ * @throws OseeAuthenticationRequiredException
+ */
+ public static void kickTransactionEvent(Object source, Collection<ArtifactTransactionModifiedEvent> xModifiedEvents) throws OseeAuthenticationRequiredException {
+ if (isDisableEvents()) return;
+ InternalEventManager.kickTransactionEvent(getSender(source), xModifiedEvents);
+ }
+
+ /**
+ * Add listeners
+ *
+ * @param listener
+ */
+ public static void addListener(IEventListner listener) {
+ InternalEventManager.addListener(listener);
+ }
+
+ /**
+ * Remove listeners
+ *
+ * @param listener
+ */
+ public static void removeListener(IEventListner listener) {
+ InternalEventManager.removeListeners(listener);
+ }
+
+ /**
+ * @return the disableEvents
+ */
+ public static boolean isDisableEvents() {
+ return InternalEventManager.isDisableEvents();
+ }
+
+ /**
+ * Turn off all event processing including LOCAL and REMOTE
+ *
+ * @param disableEvents the disableEvents to set
+ */
+ public static void setDisableEvents(boolean disableEvents) {
+ InternalEventManager.setDisableEvents(disableEvents);
+ }
+
+ /**
+ * Return report showing all listeners registered
+ *
+ * @return string report
+ */
+ public static String getListenerReport() {
+ return InternalEventManager.getListenerReport();
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RelationModifiedEvent.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RelationModifiedEvent.java
new file mode 100644
index 00000000000..06e68d8fb2d
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RelationModifiedEvent.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.framework.skynet.core.event;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedRelation;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class RelationModifiedEvent extends ArtifactTransactionModifiedEvent {
+
+ protected final Sender sender;
+ protected final RelationModType relationModType;
+ protected final RelationLink link;
+ protected final Branch branch;
+ protected final String relationType;
+ protected final UnloadedRelation unloadedRelation;
+
+ public RelationModifiedEvent(Sender sender, RelationModType relationModType, RelationLink link, Branch branch, String relationType) {
+ this.sender = sender;
+ this.relationModType = relationModType;
+ this.link = link;
+ this.branch = branch;
+ this.relationType = relationType;
+ this.unloadedRelation = null;
+ }
+
+ public RelationModifiedEvent(Sender sender, RelationModType relationModType, UnloadedRelation unloadedRelation) {
+ this.sender = sender;
+ this.relationModType = relationModType;
+ this.unloadedRelation = unloadedRelation;
+ this.link = null;
+ this.branch = null;
+ this.relationType = null;
+ }
+
+ @Override
+ public String toString() {
+ return relationModType + " - " + (link != null ? "Loaded - " + link : "Unloaded - " + unloadedRelation) + " - " + sender;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventManager.java
new file mode 100644
index 00000000000..a401c021cac
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventManager.java
@@ -0,0 +1,684 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.event;
+
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceItem;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jini.discovery.EclipseJiniClassloader;
+import org.eclipse.osee.framework.jini.discovery.IServiceLookupListener;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import org.eclipse.osee.framework.jini.service.core.SimpleFormattedEntry;
+import org.eclipse.osee.framework.jini.util.OseeJini;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.ASkynetEventListener;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetArtifactEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventListener;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetEventService;
+import org.eclipse.osee.framework.messaging.event.skynet.ISkynetRelationLinkEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkAccessControlArtifactsEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactChangeTypeEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactDeletedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactModifiedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkArtifactPurgeEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkBroadcastEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkCommitBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkDeletedBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkNewBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkNewRelationLinkEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRelationLinkDeletedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRelationLinkOrderModifiedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRelationLinkRationalModifiedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkRenameBranchEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkTransactionDeletedEvent;
+import org.eclipse.osee.framework.messaging.event.skynet.event.SkynetAttributeChange;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedArtifact;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedRelation;
+
+/**
+ * Manages remote events from the SkynetEventService.
+ *
+ * @author Jeff C. Phillips
+ */
+public class RemoteEventManager {
+ private static String ACCEPTABLE_SERVICE;
+
+ private static final RemoteEventManager instance = new RemoteEventManager();
+
+ private final InternalSkynetEventManager internalSkynetEventManager;
+ private final ISkynetEventListener clientEventListener;
+ private ISkynetEventListener clientEventListenerRemoteReference;
+
+ private RemoteEventManager() {
+ super();
+ internalSkynetEventManager = new InternalSkynetEventManager();
+ clientEventListener = new EventListener();
+ checkJiniRegistration();
+ }
+
+ private void checkJiniRegistration() {
+ if (clientEventListenerRemoteReference == null) {
+ try {
+ // We need to trigger authentication before attempting to get database information from client session manager.
+ UserManager.getUser();
+ ACCEPTABLE_SERVICE =
+ ClientSessionManager.getDataStoreName() + ":" + ClientSessionManager.getDataStoreLoginName();
+ clientEventListenerRemoteReference =
+ (ISkynetEventListener) OseeJini.getRemoteReference(clientEventListener);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ clientEventListenerRemoteReference = null;
+ }
+
+ if (clientEventListenerRemoteReference != null) {
+ ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).addListener(
+ internalSkynetEventManager, ISkynetEventService.class);
+ }
+ }
+ }
+
+ private static ISkynetEventListener getClientEventListenerRemoteReference() {
+ instance.checkJiniRegistration();
+ return instance.clientEventListenerRemoteReference;
+ }
+
+ private static InternalSkynetEventManager getEventServiceManager() {
+ return instance.internalSkynetEventManager;
+ }
+
+ public static void deregisterFromRemoteEventManager() {
+ ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).removeListener(getEventServiceManager());
+ getEventServiceManager().reset();
+ }
+
+ public static void kick(Collection<ISkynetEvent> events) {
+ kick(events.toArray(new ISkynetEvent[events.size()]));
+ }
+
+ public static boolean isConnected() {
+ return getEventServiceManager().isValid();
+ }
+
+ public static void kick(final ISkynetEvent... events) {
+ if (isConnected()) {
+ Job job = new Job("Send Event") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ getEventServiceManager().kick(events, getClientEventListenerRemoteReference());
+ return Status.OK_STATUS;
+ }
+ };
+
+ job.schedule();
+ }
+ /*
+ * This will enable a testing loopback that will take the kicked remote events and
+ * loop them back as if they came from an external client. It will allow for the testing
+ * of the OEM -> REM -> OEM processing. In addition, this onEvent is put in a non-display
+ * thread which will test that all handling by applications is properly handled by doing
+ * all processing and then kicking off display-thread when need to update ui. SessionId needs
+ * to be modified so this client doesn't think the events came from itself.
+ */
+ if (InternalEventManager.enableRemoteEventLoopback) {
+ OseeLog.log(Activator.class, Level.INFO, "REM: Loopback enabled - Returning events as Remote event.");
+ Thread thread = new Thread() {
+ /* (non-Javadoc)
+ * @see java.lang.Thread#run()
+ */
+ @Override
+ public void run() {
+ try {
+ String newSessionId = GUID.generateGuidStr();
+ for (ISkynetEvent event : events) {
+ event.getNetworkSender().sessionId = newSessionId;
+ }
+ instance.clientEventListener.onEvent(events);
+ } catch (RemoteException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+
+ }
+ }
+ };
+ thread.start();
+ }
+ }
+
+ private class InternalSkynetEventManager implements IServiceLookupListener {
+ private ISkynetEventService currentEventService;
+
+ private InternalSkynetEventManager() {
+ currentEventService = null;
+ }
+
+ public ISkynetEventService getReference() {
+ return currentEventService;
+ }
+
+ public boolean isValid() {
+ return isValidService(currentEventService);
+ }
+
+ public void reset() {
+ setEventService(null);
+ }
+
+ public void kick(ISkynetEvent[] events, ISkynetEventListener... except) {
+ try {
+ getReference().kick(events, except);
+ } catch (ExportException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ } catch (RemoteException ex) {
+ disconnectService(ex);
+ }
+ }
+
+ private boolean isValidService(ISkynetEventService service) {
+ boolean result = false;
+ try {
+ if (service != null) {
+ result = service.isAlive();
+ }
+ } catch (Exception ex) {
+ // Do Nothing
+ result = false;
+ }
+ return result;
+ }
+
+ private synchronized void setEventService(ISkynetEventService service) {
+ if (isValidService(currentEventService)) {
+ try {
+ currentEventService.deregister(getClientEventListenerRemoteReference());
+ } catch (RemoteException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ currentEventService = service;
+ }
+
+ private void disconnectService(Exception e) {
+ OseeLog.log(Activator.class, Level.WARNING, "Skynet Event Service connection lost\n" + e.toString(), e);
+ setEventService(null);
+ try {
+ OseeEventManager.kickRemoteEventManagerEvent(instance, RemoteEventServiceEventType.DisConnected);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void connectToService(ISkynetEventService service) {
+ try {
+ ISkynetEventListener clientListener = getClientEventListenerRemoteReference();
+ if (clientListener != null) {
+ service.register(clientListener);
+ setEventService(service);
+ OseeLog.log(Activator.class, Level.INFO,
+ "Skynet Event Service connection established " + ACCEPTABLE_SERVICE);
+ OseeEventManager.kickRemoteEventManagerEvent(this, RemoteEventServiceEventType.Connected);
+ } else {
+ OseeLog.log(Activator.class, Level.SEVERE, "Client listener reference was null");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.discovery.IServiceLookupListener#serviceAdded(net.jini.core.lookup.ServiceItem)
+ */
+ public void serviceAdded(ServiceItem serviceItem) {
+ if (serviceItem.service instanceof ISkynetEventService) {
+ ISkynetEventService service = (ISkynetEventService) serviceItem.service;
+ if (isValidService(service)) {
+ // Check if the service is for the database we are using
+ for (Entry entry : serviceItem.attributeSets) {
+ if (entry instanceof SimpleFormattedEntry) {
+ SimpleFormattedEntry simpleEntry = (SimpleFormattedEntry) entry;
+ if ("db".equals(simpleEntry.name) && ACCEPTABLE_SERVICE.equals(simpleEntry.value)) {
+ connectToService(service);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.discovery.IServiceLookupListener#serviceChanged(net.jini.core.lookup.ServiceItem)
+ */
+ public void serviceChanged(ServiceItem serviceItem) {
+ serviceAdded(serviceItem);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.discovery.IServiceLookupListener#serviceRemoved(net.jini.core.lookup.ServiceItem)
+ */
+ public void serviceRemoved(ServiceItem serviceItem) {
+ }
+ }
+
+ private static class EventListener extends ASkynetEventListener {
+ private static final long serialVersionUID = -3017349745450262540L;
+ private static final ISchedulingRule mutexRule = new ISchedulingRule() {
+
+ public boolean contains(ISchedulingRule rule) {
+ return rule == this;
+ }
+
+ public boolean isConflicting(ISchedulingRule rule) {
+ return rule == this;
+ }
+ };
+
+ @Override
+ public void onEvent(final ISkynetEvent[] events) throws RemoteException {
+
+ final List<ArtifactTransactionModifiedEvent> xModifiedEvents =
+ new LinkedList<ArtifactTransactionModifiedEvent>();
+ Job job = new Job("Receive Event") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ Arrays.sort(events);
+
+ Sender lastArtifactRelationModChangeSender = null;
+
+ for (ISkynetEvent event : events) {
+
+ Sender sender = new Sender((event).getNetworkSender());
+ // If the sender's sessionId is the same as this client, then this event was
+ // created in this client and returned by remote event manager; ignore and continue
+ try {
+ if (sender.isLocal()) continue;
+ } catch (OseeAuthenticationRequiredException ex1) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex1);
+ }
+
+ if (event instanceof NetworkAccessControlArtifactsEvent) {
+ try {
+
+ AccessControlEventType accessControlModType =
+ AccessControlEventType.valueOf(((NetworkAccessControlArtifactsEvent) event).getAccessControlModTypeName());
+ LoadedArtifacts loadedArtifacts =
+ new LoadedArtifacts(((NetworkAccessControlArtifactsEvent) event).getBranchId(),
+ ((NetworkAccessControlArtifactsEvent) event).getArtifactIds(),
+ ((NetworkAccessControlArtifactsEvent) event).getArtifactTypeIds());
+ InternalEventManager.kickAccessControlArtifactsEvent(sender, accessControlModType,
+ loadedArtifacts);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkRenameBranchEvent) {
+ int branchId = ((NetworkRenameBranchEvent) event).getBranchId();
+ try {
+ Branch branch = BranchManager.getBranch(branchId);
+ branch.setBranchName(((NetworkRenameBranchEvent) event).getBranchName());
+ try {
+ InternalEventManager.kickBranchEvent(sender, BranchEventType.Renamed, branchId);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkNewBranchEvent) {
+ int branchId = ((NetworkNewBranchEvent) event).getBranchId();
+ try {
+ InternalEventManager.kickBranchEvent(sender, BranchEventType.Added, branchId);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkDeletedBranchEvent) {
+ int branchId = ((NetworkDeletedBranchEvent) event).getBranchId();
+ BranchManager.handleBranchDeletion(branchId);
+ try {
+ InternalEventManager.kickBranchEvent(sender, BranchEventType.Deleted, branchId);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkCommitBranchEvent) {
+ int branchId = ((NetworkCommitBranchEvent) event).getBranchId();
+ try {
+ InternalEventManager.kickBranchEvent(sender, BranchEventType.Committed, branchId);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkBroadcastEvent) {
+ try {
+ final BroadcastEventType broadcastEventType =
+ BroadcastEventType.valueOf(((NetworkBroadcastEvent) event).getBroadcastEventTypeName());
+ if (broadcastEventType == null) {
+ OseeLog.log(
+ Activator.class,
+ Level.SEVERE,
+ "Unknown broadcast event type \"" + ((NetworkBroadcastEvent) event).getBroadcastEventTypeName() + "\"",
+ new IllegalArgumentException());
+ } else {
+ InternalEventManager.kickBroadcastEvent(sender, broadcastEventType,
+ ((NetworkBroadcastEvent) event).getUserIds(),
+ ((NetworkBroadcastEvent) event).getMessage());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof ISkynetArtifactEvent) {
+ updateArtifacts(sender, (ISkynetArtifactEvent) event, xModifiedEvents);
+ lastArtifactRelationModChangeSender = sender;
+ } else if (event instanceof ISkynetRelationLinkEvent) {
+ updateRelations(sender, (ISkynetRelationLinkEvent) event, xModifiedEvents);
+ lastArtifactRelationModChangeSender = sender;
+ } else if (event instanceof NetworkArtifactChangeTypeEvent) {
+ try {
+ LoadedArtifacts loadedArtifacts =
+ new LoadedArtifacts(((NetworkArtifactChangeTypeEvent) event).getBranchId(),
+ ((NetworkArtifactChangeTypeEvent) event).getArtifactIds(),
+ ((NetworkArtifactChangeTypeEvent) event).getArtifactTypeIds());
+ InternalEventManager.kickArtifactsChangeTypeEvent(sender,
+ ((NetworkArtifactChangeTypeEvent) event).getToArtifactTypeId(), loadedArtifacts);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkArtifactPurgeEvent) {
+ try {
+ LoadedArtifacts loadedArtifacts =
+ new LoadedArtifacts(((NetworkArtifactPurgeEvent) event).getBranchId(),
+ ((NetworkArtifactPurgeEvent) event).getArtifactIds(),
+ ((NetworkArtifactPurgeEvent) event).getArtifactTypeIds());
+ InternalEventManager.kickArtifactsPurgedEvent(sender, loadedArtifacts);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ } else if (event instanceof NetworkTransactionDeletedEvent) {
+ try {
+ InternalEventManager.kickTransactionsDeletedEvent(sender,
+ ((NetworkTransactionDeletedEvent) event).getTransactionIds());
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ if (xModifiedEvents.size() > 0) {
+ /*
+ * Since transaction events are a collection of ArtifactModfied and RelationModified
+ * events, create a new Sender based on the last sender for these events.
+ */
+ Sender transactionSender =
+ new Sender("RemoteEventManager", lastArtifactRelationModChangeSender.getOseeSession());
+ InternalEventManager.kickTransactionEvent(transactionSender, xModifiedEvents);
+ }
+
+ return Status.OK_STATUS;
+ }
+ };
+ job.setSystem(true);
+ job.setUser(false);
+ job.setRule(mutexRule);
+ job.schedule();
+ }
+
+ /**
+ * Updates local cache
+ *
+ * @param event
+ */
+ private static void updateArtifacts(Sender sender, ISkynetArtifactEvent event, Collection<ArtifactTransactionModifiedEvent> xModifiedEvents) {
+ if (event == null) return;
+
+ try {
+ int artId = event.getArtId();
+ int artTypeId = event.getArtTypeId();
+ List<String> dirtyAttributeName = new LinkedList<String>();
+
+ if (event instanceof NetworkArtifactModifiedEvent) {
+ int branchId = ((NetworkArtifactModifiedEvent) event).getBranchId();
+ Artifact artifact = ArtifactCache.getActive(artId, branchId);
+ if (artifact == null) {
+ UnloadedArtifact unloadedArtifact = new UnloadedArtifact(branchId, artId, artTypeId);
+ xModifiedEvents.add(new ArtifactModifiedEvent(sender, ArtifactModType.Changed, unloadedArtifact));
+ } else if (!artifact.isHistorical()) {
+ for (SkynetAttributeChange skynetAttributeChange : ((NetworkArtifactModifiedEvent) event).getAttributeChanges()) {
+ if (!InternalEventManager.enableRemoteEventLoopback) {
+ boolean attributeNeedsCreation = true;
+ AttributeType attributeType = AttributeTypeManager.getType(skynetAttributeChange.getTypeId());
+ for (Attribute<Object> attribute : artifact.getAttributes(attributeType.getName())) {
+ if (attribute.getAttrId() == skynetAttributeChange.getAttributeId()) {
+ if (attribute.isDirty()) {
+ dirtyAttributeName.add(attribute.getNameValueDescription());
+ OseeLog.log(Activator.class, Level.INFO, String.format(
+ "%s's attribute %d [/n%s/n] has been overwritten.", artifact.getSafeName(),
+ attribute.getAttrId(), attribute.toString()));
+ }
+ if (skynetAttributeChange.isDeleted()) {
+ attribute.internalSetDeleted();
+ } else {
+ attribute.getAttributeDataProvider().loadData(skynetAttributeChange.getData());
+ }
+ attribute.internalSetGammaId(skynetAttributeChange.getGammaId());
+ attributeNeedsCreation = false;
+ attribute.setNotDirty();
+ break;
+ }
+ }
+ if (attributeNeedsCreation) {
+ Attribute.initializeAttribute(artifact, AttributeTypeManager.getType(
+ skynetAttributeChange.getTypeId()).getAttrTypeId(),
+ skynetAttributeChange.getAttributeId(), skynetAttributeChange.getGammaId(),
+ skynetAttributeChange.getData());
+ }
+ }
+ }
+
+ xModifiedEvents.add(new ArtifactModifiedEvent(sender, ArtifactModType.Changed, artifact,
+ ((NetworkArtifactModifiedEvent) event).getTransactionId(),
+ ((NetworkArtifactModifiedEvent) event).getAttributeChanges()));
+
+ }
+ } else if (event instanceof NetworkArtifactDeletedEvent) {
+ int branchId = ((NetworkArtifactDeletedEvent) event).getBranchId();
+ Artifact artifact = ArtifactCache.getActive(artId, branchId);
+ if (artifact == null) {
+ UnloadedArtifact unloadedArtifact = new UnloadedArtifact(branchId, artId, artTypeId);
+ xModifiedEvents.add(new ArtifactModifiedEvent(sender, ArtifactModType.Deleted, unloadedArtifact));
+ } else if (!artifact.isHistorical()) {
+ if (!InternalEventManager.enableRemoteEventLoopback) {
+ artifact.setDeleted();
+ artifact.setNotDirty();
+ }
+
+ xModifiedEvents.add(new ArtifactModifiedEvent(sender, ArtifactModType.Deleted, artifact,
+ ((NetworkArtifactDeletedEvent) event).getTransactionId(),
+ new ArrayList<SkynetAttributeChange>()));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * @param event
+ * @param newTransactionId
+ */
+ private static void updateRelations(Sender sender, ISkynetRelationLinkEvent event, Collection<ArtifactTransactionModifiedEvent> xModifiedEvents) {
+ if (event == null) return;
+
+ try {
+ RelationType relationType = RelationTypeManager.getType(event.getRelTypeId());
+ Branch branch = BranchManager.getBranch(event.getBranchId());
+ Artifact aArtifact = ArtifactCache.getActive(event.getArtAId(), branch.getBranchId());
+ Artifact bArtifact = ArtifactCache.getActive(event.getArtBId(), branch.getBranchId());
+ boolean aArtifactLoaded = aArtifact != null;
+ boolean bArtifactLoaded = bArtifact != null;
+
+ if (!aArtifactLoaded && !bArtifactLoaded) {
+ if (event instanceof NetworkRelationLinkDeletedEvent) {
+ UnloadedRelation unloadedRelation =
+ new UnloadedRelation(branch.getBranchId(), event.getArtAId(), event.getArtATypeId(),
+ event.getArtBId(), event.getArtBTypeId(), event.getRelTypeId());
+ xModifiedEvents.add(new RelationModifiedEvent(sender, RelationModType.Deleted, unloadedRelation));
+ } else if (event instanceof NetworkRelationLinkOrderModifiedEvent) {
+ UnloadedRelation unloadedRelation =
+ new UnloadedRelation(branch.getBranchId(), event.getArtAId(), event.getArtATypeId(),
+ event.getArtBId(), event.getArtBTypeId(), event.getRelTypeId());
+ xModifiedEvents.add(new RelationModifiedEvent(sender, RelationModType.ReOrdered, unloadedRelation));
+ } else if (event instanceof NetworkRelationLinkRationalModifiedEvent) {
+ UnloadedRelation unloadedRelation =
+ new UnloadedRelation(branch.getBranchId(), event.getArtAId(), event.getArtATypeId(),
+ event.getArtBId(), event.getArtBTypeId(), event.getRelTypeId());
+ xModifiedEvents.add(new RelationModifiedEvent(sender, RelationModType.RationaleMod, unloadedRelation));
+ } else if (event instanceof NetworkNewRelationLinkEvent) {
+ UnloadedRelation unloadedRelation =
+ new UnloadedRelation(branch.getBranchId(), event.getArtAId(), event.getArtATypeId(),
+ event.getArtBId(), event.getArtBTypeId(), event.getRelTypeId());
+ xModifiedEvents.add(new RelationModifiedEvent(sender, RelationModType.Added, unloadedRelation));
+ }
+ }
+ if (aArtifactLoaded || bArtifactLoaded) {
+ // if (aArtifactLoaded) {
+ // OseeLog.log(Activator.class, Level.INFO, String.format("%s - %s - %d", aArtifact.toString(),
+ // aArtifact.getArtifactTypeName(), aArtifact.getArtId()));
+ // aArtifact.reloadArtifact();
+ // }
+ // if (bArtifactLoaded) {
+ // OseeLog.log(Activator.class, Level.INFO, String.format("%s - %s - %d", bArtifact.toString(),
+ // bArtifact.getArtifactTypeName(), bArtifact.getArtId()));
+ // bArtifact.reloadArtifact();
+ // }
+ //TODO Maybe just send a link change refresh event
+ if (event instanceof NetworkRelationLinkOrderModifiedEvent) {
+ RelationLink relation =
+ RelationManager.getLoadedRelation(RelationTypeManager.getType(event.getRelTypeId()),
+ event.getArtAId(), event.getArtBId(), branch, branch);
+
+ if (relation != null) {
+ RelationModType relationModType = null;
+ boolean aOrderChanged =
+ ((NetworkRelationLinkOrderModifiedEvent) event).getAOrder() != relation.getAOrder();
+ boolean bOrderChanged =
+ ((NetworkRelationLinkOrderModifiedEvent) event).getBOrder() != relation.getBOrder();
+ if (aOrderChanged) {
+ relation.setAOrder(((NetworkRelationLinkOrderModifiedEvent) event).getAOrder());
+ if (bArtifactLoaded) {
+ RelationManager.sortRelations(bArtifact, relation.getRelationType(),
+ new HashMap<Integer, RelationLink>(), new HashMap<Integer, RelationLink>());
+ }
+ relationModType = RelationModType.ReOrdered;
+ }
+ if (bOrderChanged) {
+ relation.setBOrder(((NetworkRelationLinkOrderModifiedEvent) event).getBOrder());
+ if (aArtifactLoaded) {
+ RelationManager.sortRelations(aArtifact, relation.getRelationType(),
+ new HashMap<Integer, RelationLink>(), new HashMap<Integer, RelationLink>());
+ }
+ relationModType = RelationModType.ReOrdered;
+ }
+ if (relation.getRationale().equals(((NetworkRelationLinkOrderModifiedEvent) event).getRationale())) {
+ relation.setRationale(((NetworkRelationLinkOrderModifiedEvent) event).getRationale(), false);
+ relationModType = RelationModType.RationaleMod;
+ }
+ if (relationModType == null) {
+ OseeLog.log(Activator.class, Level.SEVERE,
+ "Link Modified Type Can Not Be Determined; Event Ignored. " + event);
+ } else {
+ relation.setNotDirty();
+
+ xModifiedEvents.add(new RelationModifiedEvent(sender, relationModType, relation,
+ relation.getBranch(), relation.getRelationType().getTypeName()));
+ }
+ }
+ } else if (event instanceof NetworkRelationLinkDeletedEvent) {
+ RelationLink relation =
+ RelationManager.getLoadedRelation(RelationTypeManager.getType(event.getRelTypeId()),
+ event.getArtAId(), event.getArtBId(), branch, branch);
+ if (relation != null) {
+ relation.deleteWithoutDirtyAndEvent();
+
+ xModifiedEvents.add(new RelationModifiedEvent(sender, RelationModType.Deleted, relation,
+ relation.getBranch(), relation.getRelationType().getTypeName()));
+ }
+ } else if (event instanceof NetworkNewRelationLinkEvent) {
+ RelationLink relation =
+ RelationManager.getLoadedRelation(RelationTypeManager.getType(event.getRelTypeId()),
+ event.getArtAId(), event.getArtBId(), branch, branch);
+
+ if (relation == null) {
+ relation =
+ new RelationLink(event.getArtAId(), event.getArtBId(), branch, branch, relationType,
+ event.getRelId(), event.getGammaId(),
+ ((NetworkNewRelationLinkEvent) event).getRationale(),
+ ((NetworkNewRelationLinkEvent) event).getAOrder(),
+ ((NetworkNewRelationLinkEvent) event).getBOrder());
+ RelationManager.manageRelation(relation, RelationSide.SIDE_A);
+ RelationManager.manageRelation(relation, RelationSide.SIDE_B);
+ if (bArtifactLoaded) {
+ RelationManager.sortRelations(bArtifact, relation.getRelationType(),
+ new HashMap<Integer, RelationLink>(), new HashMap<Integer, RelationLink>());
+ }
+ if (aArtifactLoaded) {
+ RelationManager.sortRelations(aArtifact, relation.getRelationType(),
+ new HashMap<Integer, RelationLink>(), new HashMap<Integer, RelationLink>());
+ }
+
+ xModifiedEvents.add(new RelationModifiedEvent(sender, RelationModType.Added, relation,
+ relation.getBranch(), relation.getRelationType().getTypeName()));
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventServiceEventType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventServiceEventType.java
new file mode 100644
index 00000000000..7027311954c
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/RemoteEventServiceEventType.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.framework.skynet.core.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum RemoteEventServiceEventType {
+ Connected(EventType.LocalOnly), DisConnected(EventType.LocalOnly);
+
+ private final EventType eventType;
+
+ public boolean isRemoteEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.RemoteOnly;
+ }
+
+ public boolean isLocalEventType() {
+ return eventType == EventType.LocalAndRemote || eventType == EventType.LocalOnly;
+ }
+
+ /**
+ * @param localOnly true if this event type is to be thrown only locally and not to other clients
+ */
+ private RemoteEventServiceEventType(EventType eventType) {
+ this.eventType = eventType;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/Sender.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/Sender.java
new file mode 100644
index 00000000000..3b304ee36b0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/Sender.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.framework.skynet.core.event;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.OseeClientSession;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.event.skynet.event.NetworkSender;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Sender {
+
+ String sourceObject;
+ private final OseeClientSession oseeSession;
+
+ public Sender(Object sourceObject, OseeClientSession oseeSession) {
+ this.sourceObject = InternalEventManager.getObjectSafeName(sourceObject);
+ this.oseeSession = oseeSession;
+ }
+
+ public Sender(NetworkSender networkSender) {
+ this(networkSender.sourceObject, new OseeClientSession(networkSender.sessionId, networkSender.machineName,
+ networkSender.userId, networkSender.machineIp, networkSender.port, networkSender.clientVersion, "n/a"));
+ }
+
+ public Sender(Object sourceObject) throws OseeAuthenticationRequiredException {
+ this.sourceObject = InternalEventManager.getObjectSafeName(sourceObject);
+ this.oseeSession = ClientSessionManager.getSession();
+ }
+
+ public boolean isRemote() throws OseeAuthenticationRequiredException {
+ OseeClientSession session = ClientSessionManager.getSession();
+ //Don't add version check here - can't assume events come from clients using the same version - could be old clients;
+ return !oseeSession.getId().equals(session.getId());
+ }
+
+ public boolean isLocal() throws OseeAuthenticationRequiredException {
+ return !isRemote();
+ }
+
+ public String getAuthor() {
+ return oseeSession.getUserId();
+ }
+
+ /**
+ * @return the oseeSession
+ */
+ public OseeClientSession getOseeSession() {
+ return oseeSession;
+ }
+
+ /**
+ * @return the sender
+ */
+ public Object getSourceObject() {
+ return sourceObject;
+ }
+
+ /**
+ * @param sender the sender to set
+ */
+ public void setSourceObject(Object sourceObject) {
+ this.sourceObject = InternalEventManager.getObjectSafeName(sourceObject);
+ }
+
+ public NetworkSender getNetworkSender() {
+ return new NetworkSender(sourceObject, oseeSession.getId(), oseeSession.getMachineName(),
+ oseeSession.getUserId(), oseeSession.getMachineIp(), oseeSession.getPort(), oseeSession.getVersion());
+ }
+
+ @Override
+ public String toString() {
+ String remote = "Source Unknown";
+ try {
+ remote = (isRemote() ? "Remote" : "Local");
+ } catch (OseeAuthenticationRequiredException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return "Sender: " + remote + " [" + oseeSession.toString() + " [" + sourceObject + "]]";
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/exportImport/HttpBranchExchange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/exportImport/HttpBranchExchange.java
new file mode 100644
index 00000000000..9e0f9fd4671
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/exportImport/HttpBranchExchange.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.framework.skynet.core.exportImport;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpBranchExchange {
+ private static final String BRANCH_EXPORT = "exportBranch";
+ private static final String BRANCH_IMPORT = "importBranch";
+
+ private HttpBranchExchange() {
+ }
+
+ public static void exportBranches(String exportFileName, int... branchIds) throws OseeDataStoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("function", BRANCH_EXPORT);
+ if (Strings.isValid(exportFileName)) {
+ parameters.put("filename", exportFileName);
+ }
+ addBranchIds(parameters, branchIds);
+ execute(parameters);
+ }
+
+ public static void importBranches(String path, boolean cleanAllBeforeImport, boolean allAsRootBranches, int... branchIds) throws OseeDataStoreException, OseeAuthenticationRequiredException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put("sessionId", ClientSessionManager.getSessionId());
+ parameters.put("function", BRANCH_IMPORT);
+ if (!path.startsWith("exchange://")) {
+ path = "exchange://" + path;
+ }
+ parameters.put("uri", path);
+ if (allAsRootBranches) {
+ parameters.put("all_as_root_branches", Boolean.toString(allAsRootBranches));
+ }
+ if (cleanAllBeforeImport) {
+ parameters.put("clean_before_import", Boolean.toString(cleanAllBeforeImport));
+ }
+ addBranchIds(parameters, branchIds);
+ execute(parameters);
+ }
+
+ private static void execute(Map<String, String> parameters) throws OseeDataStoreException {
+ try {
+ String returnVal =
+ HttpProcessor.post(new URL(HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(
+ OseeServerContext.BRANCH_EXCHANGE_CONTEXT, parameters)));
+ OseeLog.log(HttpBranchExchange.class, Level.INFO, returnVal);
+ } catch (Exception ex) {
+ throw new OseeDataStoreException(ex);
+ }
+ }
+
+ private static void addBranchIds(Map<String, String> parameters, int... branchIds) {
+ if (branchIds != null && branchIds.length > 0) {
+ StringBuffer ids = new StringBuffer();
+ for (int index = 0; index < branchIds.length; index++) {
+ ids.append(branchIds[index]);
+ if (index + 1 < branchIds.length) {
+ ids.append(",");
+ }
+ }
+ parameters.put("branchIds", ids.toString());
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/BaseArtifactLoopbackCmd.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/BaseArtifactLoopbackCmd.java
new file mode 100644
index 00000000000..1b8bff87525
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/BaseArtifactLoopbackCmd.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.framework.skynet.core.httpRequests;
+
+import java.net.HttpURLConnection;
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseArtifactLoopbackCmd implements IClientLoopbackCmd {
+
+ public void execute(final Map<String, String> parameters, final HttpResponse httpResponse) {
+ final String branchId = parameters.get("branchId");
+ final String guid = parameters.get("guid");
+ final boolean isDeleted = Boolean.valueOf(parameters.get("isDeleted"));
+ final String transactionIdStr = parameters.get("transactionId");
+
+ if (!Strings.isValid(branchId) || !Strings.isValid(guid)) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_BAD_REQUEST, String.format("Unable to process [%s]",
+ parameters));
+ } else {
+ try {
+ final Artifact artifact;
+ final Branch branch;
+ if (Strings.isValid(transactionIdStr)) {
+ int transactionNumber = Integer.parseInt(transactionIdStr);
+ TransactionId transactionId = TransactionIdManager.getTransactionId(transactionNumber);
+ branch = transactionId.getBranch();
+ artifact = ArtifactQuery.getHistoricalArtifactFromId(guid, transactionId, isDeleted);
+ } else {
+ branch = BranchManager.getBranch(Integer.parseInt(branchId));
+ artifact = ArtifactQuery.getArtifactFromId(guid, branch, isDeleted);
+ }
+ if (artifact == null) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_NOT_FOUND, String.format(
+ "Artifact can not be found in OSEE on branch [%s]", branch));
+ } else {
+ process(artifact, parameters, httpResponse);
+ }
+ } catch (Exception ex) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_INTERNAL_ERROR, String.format(
+ "Unable to process [%s]", parameters), ex);
+ }
+ }
+ }
+
+ public abstract boolean isApplicable(String cmd);
+
+ public abstract void process(final Artifact artifact, final Map<String, String> parameters, final HttpResponse httpResponse);
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientDashboardRequestHandler.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientDashboardRequestHandler.java
new file mode 100644
index 00000000000..5463c7c2fda
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientDashboardRequestHandler.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.httpRequests;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpRequest;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.core.client.server.IHttpServerRequest;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.event.RemoteEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+
+/**
+ * Responds to requests by server for information about client
+ *
+ * @author Donald G. Dunne
+ */
+public class ClientDashboardRequestHandler implements IHttpServerRequest {
+
+ private enum RequestCmd {
+ log, info, pingId
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.server.IHttpServerRequest#getRequestType()
+ */
+ @Override
+ public String getRequestType() {
+ return "osee/request";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.server.IHttpServerRequest#processRequest(org.eclipse.osee.framework.core.client.server.HttpRequest, org.eclipse.osee.framework.core.client.server.HttpResponse)
+ */
+ @Override
+ public void processRequest(final HttpRequest httpRequest, final HttpResponse httpResponse) {
+ final String cmd = httpRequest.getParameter("cmd");
+ try {
+ if (Strings.isValid(cmd)) {
+ RequestCmd requestCmd = RequestCmd.valueOf(cmd);
+ switch (requestCmd) {
+ case log:
+ sendLog(httpRequest, httpResponse);
+ break;
+ case info:
+ sendResults(getInfoString(), httpRequest, httpResponse);
+ break;
+ case pingId:
+ sendResults(ClientSessionManager.getSession().getId(), httpRequest, httpResponse);
+ break;
+ default:
+ break;
+ }
+ } else {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_BAD_REQUEST, String.format(
+ "Unable to process request: [%s]", httpRequest.getRawRequest()));
+ }
+ } catch (Exception ex) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_BAD_REQUEST, String.format(
+ "Unable to process request: [%s]", "Exception processing request: " + ex.getLocalizedMessage()));
+ }
+ }
+
+ private String getInfoString() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer(1000);
+ sb.append("\nName: [" + UserManager.getUser().getName() + "]\n");
+ sb.append(ClientSessionManager.getSession().toString().replaceAll("] ", "]\n"));
+ sb.append("\nOSEE Data Path: [" + OseeData.getPath() + "]");
+ sb.append("\nInstallation Location: [" + Platform.getInstallLocation().getURL() + "]");
+ for (IHealthStatus status : OseeLog.getStatus()) {
+ sb.append("\n" + status.getSourceName() + ": [" + status.getMessage() + "]");
+ }
+ sb.append("\nRemote Event Service: [" + RemoteEventManager.isConnected() + "]");
+ return sb.toString();
+ }
+
+ private List<File> getLogFiles() {
+ List<File> files = new ArrayList<File>();
+ File file = Platform.getLogFileLocation().toFile();
+ if (file != null && file.exists()) {
+ files.add(file);
+ }
+ file = Platform.getLogFileLocation().removeFileExtension().toFile();
+ file = new File(file, ".bak_0.log");
+ if (file != null && file.exists()) {
+ files.add(file);
+ }
+
+ return files;
+ }
+
+ private void sendLog(final HttpRequest httpRequest, final HttpResponse httpResponse) throws Exception {
+ List<File> files = getLogFiles();
+ StringBuffer sb = new StringBuffer(getInfoString() + "\n");
+ if (files.isEmpty()) {
+ sb.append("No [.log] file found");
+ sendResults(sb.toString(), httpRequest, httpResponse);
+ } else {
+ try {
+ sb.append("\nLog File Contents:\n--------------------------------\n");
+ int length = sb.length();
+ for (File file : files) {
+ length += file.length();
+ }
+ // String name = ".log";
+ httpResponse.setContentType("text/plain");
+ httpResponse.setContentEncoding("UTF-8");
+ // httpResponse.setContentDisposition(String.format("attachment; filename=%s", ".log.zip"));
+ httpResponse.sendResponseHeaders(HttpURLConnection.HTTP_OK, length);
+
+ OutputStream outputStream = null;
+ try {
+ outputStream = new BufferedOutputStream(httpResponse.getOutputStream());
+ // outputStream.putNextEntry(new ZipEntry(name));
+
+ Lib.inputStreamToOutputStream(new ByteArrayInputStream(sb.toString().getBytes("UTF-8")), outputStream);
+ for (File file : files) {
+ FileInputStream inputStream = new FileInputStream(file);
+ try {
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+ } finally {
+ if (outputStream != null) {
+ // outputStream.closeEntry();
+ outputStream.close();
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Error processing request for [%s]",
+ httpRequest.toString()), ex);
+ httpResponse.getPrintStream().println(Lib.exceptionToString(ex));
+ } finally {
+ httpResponse.getOutputStream().flush();
+ httpResponse.getOutputStream().close();
+ }
+ }
+ }
+
+ private void sendResults(String results, HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException {
+ try {
+ httpResponse.setContentEncoding("UTF-8");
+ httpResponse.setContentType("text/plain");
+ httpResponse.sendResponseHeaders(HttpURLConnection.HTTP_OK, results.length());
+ httpResponse.getPrintStream().println(results);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Error processing request for [%s]",
+ httpRequest.toString()), ex);
+ httpResponse.getPrintStream().println(Lib.exceptionToString(ex));
+ } finally {
+ httpResponse.getOutputStream().flush();
+ httpResponse.getOutputStream().close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientLoopbackHandler.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientLoopbackHandler.java
new file mode 100644
index 00000000000..eac75421bd7
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/ClientLoopbackHandler.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.framework.skynet.core.httpRequests;
+
+import java.net.HttpURLConnection;
+import org.eclipse.osee.framework.core.client.server.HttpRequest;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.core.client.server.IHttpServerRequest;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ClientLoopbackHandler implements IHttpServerRequest {
+
+ private static final ExtensionDefinedObjects<IClientLoopbackCmd> commands =
+ new ExtensionDefinedObjects<IClientLoopbackCmd>(Activator.PLUGIN_ID + ".ClientLoopbackCmd",
+ "ClientLoopbackCmd", "className");
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.server.IHttpServerRequest#getRequestType()
+ */
+ @Override
+ public String getRequestType() {
+ return "osee/loopback";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.client.server.IHttpServerRequest#processRequest(org.eclipse.osee.framework.core.client.server.HttpRequest, org.eclipse.osee.framework.core.client.server.HttpResponse)
+ */
+ @Override
+ public void processRequest(final HttpRequest httpRequest, final HttpResponse httpResponse) {
+ final String cmd = httpRequest.getParameter("cmd");
+ if (Strings.isValid(cmd)) {
+ boolean wasProcessed = false;
+ for (IClientLoopbackCmd command : commands.getObjects()) {
+ if (command.isApplicable(cmd)) {
+ wasProcessed = true;
+ command.execute(httpRequest.getParameters(), httpResponse);
+ }
+ }
+ if (!wasProcessed) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_NOT_FOUND, String.format(
+ "Unable to process request: [%s]", httpRequest.getRawRequest()));
+ }
+ } else {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_BAD_REQUEST, String.format(
+ "Unable to process request: [%s]", httpRequest.getRawRequest()));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/IClientLoopbackCmd.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/IClientLoopbackCmd.java
new file mode 100644
index 00000000000..72ccc47355e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/IClientLoopbackCmd.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.framework.skynet.core.httpRequests;
+
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IClientLoopbackCmd {
+
+ public abstract void execute(final Map<String, String> parameters, final HttpResponse httpResponse);
+
+ public abstract boolean isApplicable(String cmd);
+
+ public abstract void process(final Artifact artifact, final Map<String, String> parameters, final HttpResponse httpResponse);
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/DbOseeDataTypeProcessor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/DbOseeDataTypeProcessor.java
new file mode 100644
index 00000000000..3388fc80745
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/DbOseeDataTypeProcessor.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.framework.skynet.core.importing;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DbOseeDataTypeProcessor implements IOseeDataTypeProcessor {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.data.model.editor.input.OseeDataTypeProcessor#doesArtifactSuperTypeExist(java.lang.String)
+ */
+ @Override
+ public boolean doesArtifactSuperTypeExist(String artifactSuperTypeName) throws OseeCoreException {
+ boolean result = false;
+ if (ArtifactTypeManager.typeExists(artifactSuperTypeName)) { // artifactSuperTypeName might also be a concrete type
+ ArtifactTypeManager.getType(artifactSuperTypeName); // ensure existence
+ result = true;
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.data.model.editor.input.OseeDataTypeProcessor#onArtifactType(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void onArtifactType(String factoryName, String namespace, String artifactTypeName) throws OseeCoreException {
+ ArtifactTypeManager.createType(factoryName, namespace, artifactTypeName, artifactTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.data.model.editor.input.OseeDataTypeProcessor#onAttributeType(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, int, int, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void onAttributeType(String attributeBaseType, String attributeProviderTypeName, String fileTypeExtension, String namespace, String attributeName, String defaultValue, String validityXml, int minOccurrence, int maxOccurrence, String tipText, String taggerId) throws OseeCoreException {
+ AttributeTypeManager.createType(attributeBaseType, attributeProviderTypeName, fileTypeExtension, namespace,
+ attributeName, defaultValue, validityXml, minOccurrence, maxOccurrence, tipText, taggerId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.data.model.editor.input.OseeDataTypeProcessor#onAttributeValidity(java.lang.String, java.lang.String, java.util.Collection)
+ */
+ @Override
+ public void onAttributeValidity(String attributeName, String artifactSuperTypeName, Collection<String> concreteArtifactTypes) throws OseeCoreException {
+ AttributeType attributeType = AttributeTypeManager.getType(attributeName);
+
+ for (String artifactTypeName : concreteArtifactTypes) {
+ ArtifactType artifactType = ArtifactTypeManager.getType(artifactTypeName);
+ TypeValidityManager.persistAttributeValidity(artifactType, attributeType, BranchManager.getSystemRootBranch());
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.data.model.editor.input.OseeDataTypeProcessor#onRelationType(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void onRelationType(String namespace, String relationTypeName, String sideAName, String sideBName, String abPhrasing, String baPhrasing, String shortName, String ordered) throws OseeCoreException {
+ RelationTypeManager.createRelationType(namespace, relationTypeName, sideAName, sideBName, abPhrasing, baPhrasing,
+ shortName, ordered);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.data.model.editor.input.OseeDataTypeProcessor#onRelationValidity(java.lang.String, java.lang.String, int, int)
+ */
+ @Override
+ public void onRelationValidity(String artifactTypeName, String relationTypeName, int sideAMax, int sideBMax) throws OseeCoreException {
+ ArtifactType artifactType = ArtifactTypeManager.getType(artifactTypeName);
+ RelationType relationType = RelationTypeManager.getType(relationTypeName);
+ RelationTypeManager.createRelationLinkValidity(BranchManager.getSystemRootBranch(), artifactType, relationType,
+ sideAMax, sideBMax);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/ExcelOseeTypeDataParser.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/ExcelOseeTypeDataParser.java
new file mode 100644
index 00000000000..d62e521d184
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/ExcelOseeTypeDataParser.java
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.importing;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKey;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExcelOseeTypeDataParser implements RowProcessor {
+ private enum Table {
+ ARTIFACT_TYPE_TABLE, ATTRIBUTE_TYPE_TABLE, ATTRIBUTE_MAP_TABLE, RELATION_TYPE_TABLE, RELATION_SIDE_TABLE
+ }
+
+ private static final String description = "Setup artifact, attribute, and relation type data";
+ private final ExcelSaxHandler excelHandler;
+ private Table currentTable;
+ private Iterator<Table> tableIterator;
+ private final HashCollection<String, String> superTypeMap; //map each super type to all its direct sub types
+ private final ArrayList<ValidityRow> validityArray;
+ private final List<AttributeRow> attributeMapRows;
+ private boolean done;
+ private final boolean debugRows = false;
+ private final XMLReader xmlReader;
+ private final IOseeDataTypeProcessor dataTypeProcessor;
+
+ public ExcelOseeTypeDataParser(IOseeDataTypeProcessor dataTypeProcessor) throws SAXException, IOException {
+ this.dataTypeProcessor = dataTypeProcessor;
+ excelHandler = new ExcelSaxHandler(this, true, true);
+ superTypeMap = new HashCollection<String, String>();
+ validityArray = new ArrayList<ValidityRow>();
+ attributeMapRows = new ArrayList<AttributeRow>();
+
+ xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(excelHandler);
+ }
+
+ public void extractTypesFromSheet(InputStream importFile) throws IOException, SAXException {
+ done = false;
+ tableIterator = Arrays.asList(Table.values()).iterator();
+ xmlReader.parse(new InputSource(importFile));
+ }
+
+ private void ensureAllSuperTypesInheritFromArtifact() {
+ Collection<String> artifactSubTypes = superTypeMap.getValues("Artifact");
+ for (String typeName : superTypeMap.keySet()) {
+ if (!typeName.equals("Artifact") && !artifactSubTypes.contains(typeName)) {
+ superTypeMap.put("Artifact", typeName);
+ }
+ }
+ }
+
+ public void finish() throws OseeCoreException {
+ ensureAllSuperTypesInheritFromArtifact();
+ Collection<String> concreteTypes = new ArrayList<String>();
+ for (AttributeRow attributeRow : attributeMapRows) {
+ concreteTypes.clear();
+ dataTypeProcessor.onAttributeValidity(attributeRow.attributeName, attributeRow.artifactSuperTypeName,
+ determineConcreteTypes(attributeRow.artifactSuperTypeName, concreteTypes));
+ }
+ processRelationValidity();
+ }
+
+ private void processRelationValidity() throws OseeCoreException {
+ Collection<String> concreteTypes = new ArrayList<String>();
+ CompositeKeyHashMap<String, String, ObjectPair<Integer, Integer>> keyMap =
+ new CompositeKeyHashMap<String, String, ObjectPair<Integer, Integer>>();
+ for (ValidityRow row : validityArray) {
+ concreteTypes.clear();
+ for (String artifactTypeName : determineConcreteTypes(row.artifactSuperTypeName, concreteTypes)) {
+ String relationType = row.relationTypeName;
+ int sideAMax = row.sideAmax;
+ int sideBMax = row.sideBmax;
+
+ ObjectPair<Integer, Integer> sideDefinition = keyMap.get(artifactTypeName, relationType);
+ if (sideDefinition == null) {
+ sideDefinition = new ObjectPair<Integer, Integer>(sideAMax, sideBMax);
+ keyMap.put(artifactTypeName, relationType, sideDefinition);
+ } else {
+ sideDefinition.object1 = Math.max(sideDefinition.object1, sideAMax);
+ sideDefinition.object2 = Math.max(sideDefinition.object2, sideBMax);
+ }
+ }
+ }
+
+ for (Entry<CompositeKey<String, String>, ObjectPair<Integer, Integer>> entry : keyMap.entrySet()) {
+ String artifactTypeName = entry.getKey().getKey1();
+ String relationTypeName = entry.getKey().getKey2();
+ ObjectPair<Integer, Integer> sideDefinition = entry.getValue();
+ int sideAMax = sideDefinition.object1;
+ int sideBMax = sideDefinition.object2;
+ dataTypeProcessor.onRelationValidity(artifactTypeName, relationTypeName, sideAMax, sideBMax);
+ }
+ }
+
+ public static String getDescription() {
+ return description;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] headerRow) {
+ if (done) return;
+ if (tableIterator.hasNext()) {
+ currentTable = tableIterator.next();
+ } else {
+ throw new IllegalArgumentException(
+ "Encountered row past end of last expected table: " + Arrays.deepToString(headerRow));
+ }
+ }
+
+ /**
+ * import Artifacts
+ *
+ * @param row
+ */
+ public void processRow(String[] row) {
+ if (done) return;
+ try {
+ switch (currentTable) {
+ case ARTIFACT_TYPE_TABLE:
+ addArtifactType(row);
+ break;
+ case ATTRIBUTE_TYPE_TABLE:
+ addAttributeType(row);
+ break;
+ case ATTRIBUTE_MAP_TABLE:
+ associateAttribute(row);
+ break;
+ case RELATION_TYPE_TABLE:
+ addRelationType(row);
+ break;
+ case RELATION_SIDE_TABLE:
+ addValidityConstraints(row);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(ExcelOseeTypeDataParser.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void addValidityConstraints(String[] row) {
+ validityArray.add(new ValidityRow(row[0], row[1], getQuantity(row[2]), getQuantity(row[3])));
+ }
+
+ private void associateAttribute(String[] row) {
+ if (debugRows) System.out.println(" associateAttribute => " + row[0] + "," + row[1]);
+ attributeMapRows.add(new AttributeRow(row));
+ }
+
+ /**
+ * @param row
+ * @throws Exception
+ */
+ private void addAttributeType(String[] row) throws Exception {
+ if (debugRows) System.out.println(" addAttributeType => " + row[0] + "," + row[1]);
+ String attrBaseType = row[0];
+ String attrProviderType = row[1];
+ String attributeName = row[2];
+ String fileTypeExtension = row[3] != null ? row[3] : "";
+ String taggerId = row[4] != null ? row[4] : "";
+ String defaultValue = row[5];
+ String validityXml = row[6];
+ int minOccurrence = getQuantity(row[7]);
+ int maxOccurrence = getQuantity(row[8]);
+ String tipText = row[9];
+
+ dataTypeProcessor.onAttributeType(attrBaseType, attrProviderType, fileTypeExtension, "", attributeName,
+ defaultValue, validityXml, minOccurrence, maxOccurrence, tipText, taggerId);
+ }
+
+ /**
+ * @param row
+ * @throws OseeCoreException
+ */
+ private void addRelationType(String[] row) throws Exception {
+ if (debugRows) System.out.println(" addRelationType => " + row[0] + "," + row[1]);
+ String relationTypeName = row[0];
+ String sideAName = row[1];
+ String abPhrasing = row[2];
+ String sideBName = row[3];
+ String baPhrasing = row[4];
+ String shortName = row[5];
+ String ordered = row[6];
+
+ dataTypeProcessor.onRelationType("", relationTypeName, sideAName, sideBName, abPhrasing, baPhrasing, shortName,
+ ordered);
+ }
+
+ private void addArtifactType(String[] row) throws Exception {
+ if (debugRows) System.out.println(" addArtifactType => " + row[0] + "," + row[1]);
+ String factoryClassName = row[0];
+ String artifactTypeName = row[1];
+ String superTypeName = row[2];
+
+ if (!artifactTypeName.equals("Artifact")) {
+ superTypeMap.put(superTypeName, artifactTypeName);
+ }
+ dataTypeProcessor.onArtifactType(factoryClassName, "", artifactTypeName);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processEmptyRow(java.lang.String[])
+ */
+ public void processEmptyRow() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ done = true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#detectedTotalRowCount(int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ }
+
+ private int getQuantity(String quantity) {
+ if (quantity.equalsIgnoreCase("UNLIMITED")) {
+ return Integer.MAX_VALUE;
+ }
+ return Integer.parseInt(quantity);
+ }
+
+ private Collection<String> determineConcreteTypes(String artifactSuperTypeName, Collection<String> concreteTypes) throws OseeCoreException {
+ if (dataTypeProcessor.doesArtifactSuperTypeExist(artifactSuperTypeName)) { // artifactSuperTypeName might also be a concrete type
+ concreteTypes.add(artifactSuperTypeName);
+ }
+ Collection<String> subTypeNames = superTypeMap.getValues(artifactSuperTypeName);
+ if (subTypeNames != null) {
+ for (String subTypeName : subTypeNames) {
+ determineConcreteTypes(subTypeName, concreteTypes);
+ }
+ }
+ return concreteTypes;
+ }
+
+ private class ValidityRow {
+ public String artifactSuperTypeName;
+ public String relationTypeName;
+ public int sideAmax;
+ public int sideBmax;
+
+ public ValidityRow(String artifactSuperTypeName, String relationTypeName, int sideAmax, int sideBmax) {
+ this.artifactSuperTypeName = artifactSuperTypeName;
+ this.relationTypeName = relationTypeName;
+ this.sideAmax = sideAmax;
+ this.sideBmax = sideBmax;
+ }
+
+ public String toString() {
+ return String.format("RelationType:[%s] ArtifactSuperType:[%s] Sides(A,B) - (%s, %s)", relationTypeName,
+ artifactSuperTypeName, sideAmax, sideBmax);
+ }
+ }
+
+ private class AttributeRow {
+ private String artifactSuperTypeName;
+ private String attributeName;
+
+ public AttributeRow(String[] row) {
+ super();
+ artifactSuperTypeName = row[0];
+ attributeName = row[1];
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/IOseeDataTypeProcessor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/IOseeDataTypeProcessor.java
new file mode 100644
index 00000000000..ffca90172d0
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/importing/IOseeDataTypeProcessor.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.framework.skynet.core.importing;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOseeDataTypeProcessor {
+
+ public void onAttributeType(String attributeBaseType, String attributeProviderTypeName, String fileTypeExtension, String namespace, String name, String defaultValue, String validityXml, int minOccurrences, int maxOccurrences, String tipText, String taggerId) throws OseeCoreException;
+
+ public void onArtifactType(String factoryName, String namespace, String artifactTypeName) throws OseeCoreException;
+
+ public void onRelationType(String namespace, String relationTypeName, String sideAName, String sideBName, String abPhrasing, String baPhrasing, String shortName, String ordered) throws OseeCoreException;
+
+ public void onAttributeValidity(String attributeName, String artifactSuperTypeName, Collection<String> concreteTypes) throws OseeCoreException;
+
+ public void onRelationValidity(String artifactTypeName, String relationTypeName, int sideAMax, int sideBMax) throws OseeCoreException;
+
+ public boolean doesArtifactSuperTypeExist(String artifactSuperTypeName) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/Activator.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/Activator.java
new file mode 100644
index 00000000000..b6a36a0b724
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/Activator.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.skynet.core.internal;
+
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.skynet.core.attribute.HttpAttributeTagger;
+import org.eclipse.osee.framework.skynet.core.event.RemoteEventManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Activator implements BundleActivator {
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.skynet.core";
+
+ /* (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ ClientSessionManager.class.getCanonicalName();
+ HttpAttributeTagger.getInstance();
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ HttpAttributeTagger.getInstance().deregisterFromEventManager();
+ RemoteEventManager.deregisterFromRemoteEventManager();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/LinkType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/LinkType.java
new file mode 100644
index 00000000000..705ed33ba43
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/LinkType.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.framework.skynet.core.linking;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum LinkType {
+ OSEE_SERVER_LINK, INTERNAL_DOC_REFERENCE;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/WordMlLinkHandler.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/WordMlLinkHandler.java
new file mode 100644
index 00000000000..272b75d1c1a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/linking/WordMlLinkHandler.java
@@ -0,0 +1,396 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.linking;
+
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactURL;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * This class converts between OSEE hyperlink markers into wordML style links. <br/>
+ * <br/>
+ * <b>Example:</b>
+ *
+ * <pre>
+ * LinkType linkType = LinkType.OSEE_SERVER_LINK;
+ *
+ * Artifact source = ... // Artifact that contains original
+ * String original = ... //Doc containing osee link markers
+ *
+ * // Substitue OSEE link markers with wordML style hyperlinks requesting content to the OSEE application server
+ * String linkedDoc = WordMlLinkHandler.link(linkType, source, original);
+ *
+ * // Substitue wordML style hyperlinks with OSEE link markers
+ * String original = WordMlLinkHandler.unLink(linkType, source, linkedDoc);
+ * </pre>
+ *
+ * <b>Link types handled</b> <br/>
+ * <br/>
+ * <ol>
+ * <li><b>OSEE link:</b> This is a branch neutral marker placed in the wordML document.
+ *
+ * <pre>
+ * OSEE_LINK([artifact_guid])
+ * </pre>
+ * <li><b>Legacy style links:</b>
+ *
+ * <pre>
+ * &lt;w:hlink w:dest=&quot;http://[server_address]:[server_port]/Define?guid=&quot;[artifact_guid]&quot;&gt;
+ * &lt;w:r&gt;
+ * &lt;w:rPr&gt;
+ * &lt;w:rStyle w:val=&quot;Hyperlink&quot;/&gt;
+ * &lt;/w:rPr&gt;
+ * &lt;w:t&gt;[artifact_name]&lt;/w:t&gt;
+ * &lt;/w:r&gt;
+ * &lt;/w:hlink&gt;
+ * </pre>
+ *
+ * </li>
+ * </ol>
+ *
+ * @author Roberto E. Escobar
+ */
+public class WordMlLinkHandler {
+
+ private static final Matcher OSEE_LINK_PATTERN = Pattern.compile("OSEE_LINK\\((.*?)\\)", Pattern.DOTALL).matcher("");
+ private static final Matcher WORDML_LINK =
+ Pattern.compile("<w:hlink\\s+w:dest=\"(.*?)\".*?</w:hlink\\s*>", Pattern.DOTALL).matcher("");
+
+ // Pattern.compile(<w:hlink\\s+w:dest=\"(.*?)\".*?<w:t\\s*>(.*?)</w:t\\s*>\\s*</w:r\\s*>\\s*</w:hlink\\s*>",
+ // Pattern.DOTALL).matcher("");
+ private static final String OSEE_LINK_MARKER = "OSEE_LINK(%s)";
+ private static final String WORDML_LINK_FORMAT =
+ "<w:hlink w:dest=\"%s\"><w:r><w:rPr><w:rStyle w:val=\"Hyperlink\"/></w:rPr><w:t>%s</w:t></w:r></w:hlink>";
+
+ private static final String WORDML_BOOKMARK_FORMAT =
+ "<aml:annotation aml:id=\"\" w:type=\"Word.Bookmark.Start\" w:name=\"OSEE.%s\"/><aml:annotation aml:id=\"\" w:type=\"Word.Bookmark.End\"/>";
+
+ private static final String WORDML_INTERNAL_DOC_LINK_FORMAT =
+ "<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r><w:instrText> HYPERLINK \\l \"OSEE.%s\" </w:instrText></w:r><w:r><w:fldChar w:fldCharType=\"separate\"/></w:r><w:r><w:rPr><w:rStyle w:val=\"Hyperlink\"/></w:rPr><w:t>%s</w:t></w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
+
+ private WordMlLinkHandler() {
+ }
+
+ /**
+ * Remove WordML hyperlinks and replace with OSEE_LINK marker. It is assumed that an unlink call will be made after a
+ * link call. Therefore we expect the input to have links that are recognized by this handler as identified by the
+ * sourceLinkType.
+ *
+ * @param sourceLinkType
+ * @param source artifact that produced the string content
+ * @param content input
+ * @return processed input
+ */
+ public static String unlink(LinkType sourceLinkType, Artifact source, String content) throws OseeCoreException {
+ String modified = content;
+ HashCollection<String, Match> matchMap = new HashCollection<String, Match>();
+
+ LinkParser linkParser = new LinkParser();
+ WORDML_LINK.reset(content);
+ while (WORDML_LINK.find()) {
+ String link = WORDML_LINK.group(1);
+ if (Strings.isValid(link)) {
+ linkParser.parse(link);
+ String guid = linkParser.getGuid();
+ if (Strings.isValid(guid)) {
+ matchMap.put(guid, new Match(WORDML_LINK.start(), WORDML_LINK.end()));
+ }
+ }
+ }
+ if (!matchMap.isEmpty()) {
+ modified = modifiedContent(sourceLinkType, source, content, matchMap, true);
+ }
+ return modified;
+ }
+
+ /**
+ * Replace OSEE_LINK marker or Legacy hyper-links with WordML hyperlinks.
+ *
+ * @param destLinkType type of link to produce
+ * @param source artifact that produced the string content
+ * @param content input
+ * @return processed input
+ */
+ public static String link(LinkType destLinkType, Artifact source, String content) throws OseeCoreException {
+ String modified = content;
+ HashCollection<String, Match> matchMap = new HashCollection<String, Match>();
+
+ // Detect legacy links
+ LinkParser linkParser = new LinkParser();
+ WORDML_LINK.reset(content);
+ while (WORDML_LINK.find()) {
+ String link = WORDML_LINK.group(1);
+ if (Strings.isValid(link)) {
+ linkParser.parse(link);
+ String guid = linkParser.getGuid();
+ if (Strings.isValid(guid)) {
+ matchMap.put(guid, new Match(WORDML_LINK.start(), WORDML_LINK.end()));
+ }
+ }
+ }
+
+ // Detect new style link marker
+ OSEE_LINK_PATTERN.reset(content);
+ while (OSEE_LINK_PATTERN.find()) {
+ String guid = OSEE_LINK_PATTERN.group(1);
+ if (Strings.isValid(guid)) {
+ matchMap.put(guid, new Match(OSEE_LINK_PATTERN.start(), OSEE_LINK_PATTERN.end()));
+ }
+ }
+
+ if (!matchMap.isEmpty()) {
+ modified = modifiedContent(destLinkType, source, content, matchMap, false);
+ }
+
+ if (destLinkType == LinkType.INTERNAL_DOC_REFERENCE) {
+ // Add a bookmark to the start of the content so internal links can link later
+ modified = getWordMlBookmark(source) + modified;
+ }
+ return modified;
+ }
+
+ private static List<Artifact> findArtifacts(TransactionId transactionId, Branch branch, boolean isHistorical, List<String> guidsFromLinks) throws OseeCoreException {
+ List<Artifact> artifactsFromSearch;
+ if (isHistorical) {
+ artifactsFromSearch = ArtifactQuery.getHistoricalArtifactsFromIds(guidsFromLinks, transactionId, true);
+ } else {
+ artifactsFromSearch = ArtifactQuery.getArtifactsFromIds(guidsFromLinks, branch, true);
+ }
+ return artifactsFromSearch;
+ }
+
+ private static List<String> getGuidsNotFound(List<String> guidsFromLinks, List<Artifact> artifactsFound) {
+ Set<String> artGuids = new HashSet<String>();
+ for (Artifact artifact : artifactsFound) {
+ artGuids.add(artifact.getGuid());
+ }
+ return Collections.setComplement(guidsFromLinks, artGuids);
+ }
+
+ private static String modifiedContent(LinkType destLinkType, Artifact source, String original, HashCollection<String, Match> matchMap, boolean isUnliking) throws OseeCoreException {
+ Branch branch = source.getBranch();
+ ChangeSet changeSet = new ChangeSet(original);
+ List<Artifact> artifactsFromSearch = null;
+ List<String> guidsFromLinks = new ArrayList<String>(matchMap.keySet());
+
+ artifactsFromSearch =
+ findArtifacts(source.getTransactionId(), source.getBranch(), source.isHistorical(), guidsFromLinks);
+ if (guidsFromLinks.size() != artifactsFromSearch.size() && branch.isMergeBranch()) {
+ Branch sourceBranch = BranchManager.getBranch(branch.getParentBranchId());
+ List<String> unknownGuids = getGuidsNotFound(guidsFromLinks, artifactsFromSearch);
+
+ List<Artifact> union = new ArrayList<Artifact>();
+ union.addAll(findArtifacts(branch.getParentTransactionId(), sourceBranch, source.isHistorical(), unknownGuids));
+ union.addAll(artifactsFromSearch);
+ artifactsFromSearch = union;
+ }
+
+ if (guidsFromLinks.size() != artifactsFromSearch.size()) {
+ List<String> unknownGuids = getGuidsNotFound(guidsFromLinks, artifactsFromSearch);
+ if (isUnliking) {
+ // Ignore not found items and replace with osee marker
+ for (String guid : unknownGuids) {
+ Collection<Match> matches = matchMap.getValues(guid);
+ for (Match match : matches) {
+ String replaceWith = String.format(OSEE_LINK_MARKER, guid);
+ changeSet.replace(match.start, match.end, replaceWith);
+ }
+ }
+ } else {
+ // Items not found
+ for (String guid : unknownGuids) {
+ for (Match match : matchMap.getValues(guid)) {
+ String internalLink =
+ String.format("http://none/unknown?guid=%s&amp;branchId=%s", guid, branch.getBranchId());
+ String link =
+ String.format(WORDML_LINK_FORMAT, internalLink, String.format(
+ "Invalid Link: artifact with guid:[%s] on branchId:[%s] does not exist", guid,
+ branch.getBranchId()));
+ changeSet.replace(match.start, match.end, link);
+ }
+ }
+ }
+ }
+ // Items found in branch
+ for (Artifact artifact : artifactsFromSearch) {
+ for (Match match : matchMap.getValues(artifact.getGuid())) {
+ String replaceWith = null;
+ if (isUnliking) {
+ replaceWith = String.format(OSEE_LINK_MARKER, artifact.getGuid());
+ } else {
+ replaceWith = getWordMlLink(destLinkType, artifact);
+ }
+ changeSet.replace(match.start, match.end, replaceWith);
+ }
+ }
+ return changeSet.applyChangesToSelf().toString();
+ }
+
+ private static String getWordMlBookmark(Artifact source) {
+ return String.format(WORDML_BOOKMARK_FORMAT, source.getGuid());
+ }
+
+ private static String getWordMlLink(LinkType destLinkType, Artifact artifact) throws OseeCoreException {
+ String toReturn = "";
+ String linkText = artifact.getDescriptiveName() + (artifact.isDeleted() ? " (DELETED)" : "");
+ linkText = Xml.escape(linkText).toString();
+ switch (destLinkType) {
+ case OSEE_SERVER_LINK:
+ String url = ArtifactURL.getOpenInOseeLink(artifact).toString();
+ // XML compliant url
+ url = url.replaceAll("&", "&amp;");
+ toReturn = String.format(WORDML_LINK_FORMAT, url, linkText);
+ break;
+ case INTERNAL_DOC_REFERENCE:
+ toReturn = String.format(WORDML_INTERNAL_DOC_LINK_FORMAT, artifact.getGuid(), linkText);
+ break;
+ default:
+ throw new OseeArgumentException(String.format("Unsupported link type [%s]", destLinkType));
+ }
+ return toReturn;
+ }
+ private static final class Match {
+ int start;
+ int end;
+
+ public Match(int start, int end) {
+ super();
+ this.end = end;
+ this.start = start;
+ }
+ }
+
+ private static final class LinkParser {
+
+ private static final Matcher LEGACY_MATCHER = Pattern.compile("/(.*?)/guid/(.*?)/(.*)").matcher("");
+ private static final Matcher LINK_CONTEXT_MATCHER = Pattern.compile("/(.*?)\\?(.*)").matcher("");
+ private static final Matcher PARAMETER_MATCHER = Pattern.compile("([^&]*?)=([^&]*)").matcher("");
+
+ private final Map<String, String> parameterMap;
+
+ public LinkParser() {
+ this.parameterMap = new HashMap<String, String>();
+ }
+
+ public void parse(String link) {
+ parameterMap.clear();
+ link = link.replaceAll("&amp;", "&");
+ boolean wasHandled = parseOldSchoolStyleLinks(link);
+ if (!wasHandled) {
+ parseNewStyleRequests(link);
+ }
+ }
+
+ public int getBranchId() throws OseeWrappedException {
+ int branchId = -1;
+ if (parameterMap != null) {
+ String branchIdStr = parameterMap.get("branchId");
+ if (Strings.isValid(branchIdStr)) {
+ try {
+ branchId = Integer.parseInt(branchIdStr);
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ return branchId;
+ }
+
+ public String getGuid() throws OseeWrappedException {
+ String guidToReturn = null;
+ if (parameterMap != null) {
+ String guid = parameterMap.get("guid");
+ if (Strings.isValid(guid)) {
+ if (!GUID.isValid(guid)) {
+ try {
+ guid = URLDecoder.decode(guid, "UTF-8");
+ if (GUID.isValid(guid)) {
+ guidToReturn = guid;
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ } else {
+ guidToReturn = guid;
+ }
+ }
+ }
+ return guidToReturn;
+ }
+
+ /**
+ * Process new style requests are of the following format:
+ * http://127.0.0.1:<port>/<ProcessType>?key1=value1&key2=value2...&key3=value3
+ *
+ * @param link
+ */
+ private void parseNewStyleRequests(String link) {
+ String noHostStr = link.replaceFirst("^http:\\/\\/(.*?)\\/", "/");
+ Matcher matcher = LINK_CONTEXT_MATCHER;
+ matcher.reset(noHostStr);
+ if (matcher.matches()) {
+ Matcher dataMatcher = PARAMETER_MATCHER;
+ dataMatcher.reset(matcher.group(2));
+ while (dataMatcher.find()) {
+ parameterMap.put(dataMatcher.group(1), dataMatcher.group(2));
+ }
+ }
+ }
+
+ /**
+ * Process old format: http://127.0.0.1:<port>/get/guid/<guid>/<ats,Define> old format should be removed once all
+ * legacy references are change to new format
+ *
+ * @param entry
+ * @return
+ */
+ private boolean parseOldSchoolStyleLinks(String link) {
+ boolean wasHandled = false;
+ Matcher oldMatcher = LEGACY_MATCHER;
+ oldMatcher.reset(link);
+ if (oldMatcher.find()) {
+ wasHandled = true;
+ String guid = oldMatcher.group(2);
+ if (oldMatcher.groupCount() > 2) {
+ String processType = oldMatcher.group(3);
+ if (processType.equals("ats")) {
+ parameterMap.put("guid", guid);
+ } else if (processType.equals("Define") || processType.equals("")) {
+ parameterMap.put("guid", guid);
+ }
+ }
+ }
+ return wasHandled;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/preferences/PreferenceConstants.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/preferences/PreferenceConstants.java
new file mode 100644
index 00000000000..3f749b63412
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/preferences/PreferenceConstants.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.framework.skynet.core.preferences;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PreferenceConstants {
+
+ private PreferenceConstants() {
+
+ }
+ public static final String WORDWRAP_KEY = "org.eclipse.osee.framework.skynet.core.preferences.WordWrap";
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/CoreRelationEnumeration.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/CoreRelationEnumeration.java
new file mode 100644
index 00000000000..da8d0556505
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/CoreRelationEnumeration.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.framework.skynet.core.relation;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+
+public enum CoreRelationEnumeration implements IRelationEnumeration {
+
+ Users_Artifact(true, "Users"), Users_User(false, "Users"),
+
+ // Define relations
+ Supercedes_Supercedes(true, "Supercedes"),
+ Supercedes_Superceded(false, "Supercedes"),
+ AddressesIssues_AddressesIssues(true, "Addresses Issues"),
+ AddressesIssues_IssuedArtifact(false, "Addresses Issues"),
+ SupportingInfo_SupportedBy(true, "Supporting Info"),
+ SupportingInfo_SupportingInfo(false, "Supporting Info"),
+
+ DEFAULT_STYLESHEET__RENDERER(true, "Default Stylesheet"),
+ DEFAULT_STYLESHEET__STYLESHEET(false, "Default Stylesheet"),
+ REQUIREMENT_TRACE__HIGHER_LEVEL(true, "Requirement Trace"),
+ REQUIREMENT_TRACE__LOWER_LEVEL(false, "Requirement Trace"),
+ DEFAULT_HIERARCHICAL__CHILD(false, "Default Hierarchical"),
+ DEFAULT_HIERARCHICAL__PARENT(true, "Default Hierarchical"),
+
+ Dependency__Dependency(false, "Dependency"),
+ Dependency__Artifact(true, "Dependency"),
+
+ TeamMember_Team(true, "TeamMember"),
+ TeamMember_Member(false, "TeamMember"),
+
+ WorkItem__Parent(true, "Work Item"),
+ WorkItem__Child(false, "Work Item"),
+
+ Design__Design(false, "Design"),
+ Design__Requirement(true, "Design"),
+
+ UNIVERSAL_GROUPING__MEMBERS(false, "Universal Grouping"),
+ UNIVERSAL_GROUPING__GROUP(true, "Universal Grouping"),
+
+ ALLOCATION__REQUIREMENT(true, "Allocation"),
+ ALLOCATION__COMPONENT(false, "Allocation"),
+ Validation__Requirement(true, "Validation"),
+ Validation__Validator(false, "Validation"),
+
+ Verification__Requirement(true, "Verification"),
+ Verification__Verifier(false, "Verification"),
+
+ Uses__Requirement(true, "Uses"),
+ Uses__TestUnit(false, "Uses"),
+
+ CodeRequirement_Requirement(false, "Code-Requirement"),
+ CodeRequirement_CodeUnit(true, "Code-Requirement"),
+
+ TestConfigurationRelation_TestScript(true, "Test Configuration Relation"),
+ TestConfigurationRelation_TestConfiguration(false, "Test Configuration Relation"),
+ RunByRelation_User(true, "Run By Relation"),
+ RunByRelation_TestRun(false, "Run By Relation"),
+ TestRunConfigRelation_TestConfiguration(true, "Test Run Config Relation"),
+ TestRunConfigRelation_TestRun(false, "Test Run Config Relation");
+
+ private RelationSide relationSide;
+ private String typeName;
+
+ private CoreRelationEnumeration(boolean sideA, String typeName) {
+ this.relationSide = sideA ? RelationSide.SIDE_A : RelationSide.SIDE_B;
+ this.typeName = typeName;
+ }
+
+ /**
+ * @return Returns the sideName.
+ */
+ @Deprecated
+ public boolean isSideA() {
+ return relationSide.isSideA();
+ }
+
+ public String getSideName() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return getRelationType().getSideName(relationSide);
+ }
+
+ /**
+ * @return Returns the typeName.
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public RelationType getRelationType() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return RelationTypeManager.getType(typeName);
+ }
+
+ public boolean isThisType(RelationLink link) {
+ return link.getRelationType().getTypeName().equals(typeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSide()
+ */
+ @Override
+ public RelationSide getSide() {
+ return relationSide;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/IRelationEnumeration.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/IRelationEnumeration.java
new file mode 100644
index 00000000000..0eb1a40e257
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/IRelationEnumeration.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.framework.skynet.core.relation;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+
+public interface IRelationEnumeration {
+ boolean isSideA();
+
+ String getSideName() throws OseeTypeDoesNotExist, OseeDataStoreException;
+
+ public String getTypeName();
+
+ public RelationType getRelationType() throws OseeTypeDoesNotExist, OseeDataStoreException;
+
+ public boolean isThisType(RelationLink link);
+
+ public RelationSide getSide();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/LinkSideRestriction.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/LinkSideRestriction.java
new file mode 100644
index 00000000000..88b5dfbf9b2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/LinkSideRestriction.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.framework.skynet.core.relation;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class LinkSideRestriction {
+
+ private int sideALinkMax;
+ private int sideBLinkMax;
+
+ /**
+ *
+ */
+ public LinkSideRestriction(int sideALinkMax, int sideBLinkMax) {
+ super();
+
+ this.sideALinkMax = sideALinkMax;
+ this.sideBLinkMax = sideBLinkMax;
+ }
+
+ /**
+ * @return Returns the sideALinkMax.
+ */
+ public int getSideALinkMax() {
+ return sideALinkMax;
+ }
+
+ /**
+ * @return Returns the sideBLinkMax.
+ */
+ public int getSideBLinkMax() {
+ return sideBLinkMax;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationLink.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationLink.java
new file mode 100644
index 00000000000..954a734b919
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationLink.java
@@ -0,0 +1,374 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.relation;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ */
+public class RelationLink {
+ private int relationId;
+ private int gammaId;
+ private boolean deleted;
+ private int aOrder;
+ private int bOrder;
+ private String rationale;
+ private final RelationType relationType;
+ private boolean dirty;
+ private final int aArtifactId;
+ private final int bArtifactId;
+ private final Branch aBranch;
+ private final Branch bBranch;
+
+ public RelationLink(int aArtifactId, int bArtifactId, Branch aBranch, Branch bBranch, RelationType relationType, int relationId, int gammaId, String rationale, int aOrder, int bOrder) {
+ this.relationType = relationType;
+ this.relationId = relationId;
+ this.gammaId = gammaId;
+ this.rationale = rationale == null ? "" : rationale;
+ if (relationType.isOrdered()) {
+ this.aOrder = aOrder;
+ this.bOrder = bOrder;
+ }
+ this.deleted = false;
+ this.dirty = false;
+ this.aArtifactId = aArtifactId;
+ this.bArtifactId = bArtifactId;
+ this.aBranch = aBranch;
+ this.bBranch = bBranch;
+ }
+
+ public RelationLink(Artifact aArtifact, Artifact bArtifact, RelationType relationType, String rationale) {
+ this(aArtifact.getArtId(), bArtifact.getArtId(), aArtifact.getBranch(), bArtifact.getBranch(), relationType, 0,
+ 0, rationale, 0, 0);
+ }
+
+ public RelationSide getSide(Artifact artifact) {
+ if (aArtifactId == artifact.getArtId()) {
+ return RelationSide.SIDE_A;
+ }
+ if (bArtifactId == artifact.getArtId()) {
+ return RelationSide.SIDE_B;
+ }
+ throw new IllegalArgumentException("The artifact " + artifact + " is on neither side of " + this);
+ }
+
+ /**
+ * @return the aArtifactId
+ */
+ public int getAArtifactId() {
+ return aArtifactId;
+ }
+
+ /**
+ * @return the bArtifactId
+ */
+ public int getBArtifactId() {
+ return bArtifactId;
+ }
+
+ public int getArtifactId(RelationSide relationSide) {
+ return relationSide == RelationSide.SIDE_A ? aArtifactId : bArtifactId;
+ }
+
+ /**
+ * @return the aBranch
+ */
+ public Branch getABranch() {
+ return aBranch;
+ }
+
+ /**
+ * @return the bBranch
+ */
+ public Branch getBBranch() {
+ return bBranch;
+ }
+
+ /**
+ * @return Returns the deleted.
+ */
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ /**
+ * @return Returns the dirty.
+ */
+ public boolean isDirty() {
+ return dirty;
+ }
+
+ public void delete(boolean reorderRelations) throws ArtifactDoesNotExist {
+ if (!deleted) {
+ Artifact aArt = null;
+ Artifact bArt = null;
+ if (reorderRelations) {
+ aArt = preloadArtifactForDelete(RelationSide.SIDE_A);
+ bArt = preloadArtifactForDelete(RelationSide.SIDE_B);
+ }
+ markAsDeleted();
+ setDirty();
+ if (reorderRelations) {
+ RelationManager.setOrderValuesBasedOnCurrentMemoryOrder(this, aArt, bArt, false);
+ }
+
+ try {
+ OseeEventManager.kickRelationModifiedEvent(RelationManager.class, RelationModType.Deleted, this,
+ getABranch(), relationType.getTypeName());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public void deleteWithoutDirtyAndEvent() throws ArtifactDoesNotExist {
+ if (!deleted) {
+ Artifact aArt = preloadArtifactForDelete(RelationSide.SIDE_A);
+ Artifact bArt = preloadArtifactForDelete(RelationSide.SIDE_B);
+ markAsDeleted();
+ RelationManager.setOrderValuesBasedOnCurrentMemoryOrder(this, aArt, bArt, true);
+ }
+ }
+
+ private Artifact preloadArtifactForDelete(RelationSide side) {
+ Artifact artifact = null;
+ try {
+ artifact = ArtifactQuery.getArtifactFromId(getArtifactId(side), getBranch(side), false);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(RelationManager.class, Level.SEVERE, ex);
+ }
+ return artifact;
+ }
+
+ public void markAsDeleted() {
+ deleted = true;
+ }
+
+ public void markAsPurged() {
+ markAsDeleted();
+ setNotDirty();
+ }
+
+ public Artifact getArtifact(RelationSide relationSide) throws OseeCoreException {
+ Artifact relatedArtifact = getArtifactIfLoaded(relationSide);
+ if (relatedArtifact == null) {
+ return ArtifactQuery.getArtifactFromId(getArtifactId(relationSide), getBranch(relationSide));
+ }
+ return relatedArtifact;
+ }
+
+ public Artifact getArtifactIfLoaded(RelationSide relationSide) {
+ return ArtifactCache.getActive(getArtifactId(relationSide), getBranch(relationSide));
+ }
+
+ public Artifact getArtifactOnOtherSide(Artifact artifact) throws OseeCoreException {
+ return getArtifact(getSide(artifact).oppositeSide());
+ }
+
+ public Artifact getArtifactOnOtherSideIfLoaded(Artifact artifact) throws ArtifactDoesNotExist {
+ return getArtifactIfLoaded(getSide(artifact).oppositeSide());
+ }
+
+ public Artifact getArtifactA() throws OseeCoreException {
+ return getArtifact(RelationSide.SIDE_A);
+ }
+
+ public Artifact getArtifactB() throws OseeCoreException {
+ return getArtifact(RelationSide.SIDE_B);
+ }
+
+ /**
+ * @return Returns the order.
+ */
+ public int getAOrder() {
+ return aOrder;
+ }
+
+ /**
+ * @param order The order to set.
+ */
+ public void setAOrder(int order) {
+ this.aOrder = order;
+ setDirty();
+ }
+
+ /**
+ * @return Returns the order.
+ */
+ public int getBOrder() {
+ return bOrder;
+ }
+
+ public int getOrder(RelationSide relationSide) {
+ return relationSide == RelationSide.SIDE_A ? aOrder : bOrder;
+ }
+
+ /**
+ * @param order The order to set.
+ */
+ public void setBOrder(int order) {
+ this.bOrder = order;
+ setDirty();
+ }
+
+ /**
+ * @return Returns the rationale.
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ /**
+ * @param rationale The rationale to set.
+ */
+ public void setRationale(String rationale, boolean notify) {
+ if (rationale == null) {
+ rationale = "";
+ }
+
+ if (this.rationale.equals(rationale)) return;
+
+ this.rationale = rationale;
+ setDirty();
+
+ if (notify) {
+ try {
+ OseeEventManager.kickRelationModifiedEvent(RelationManager.class, RelationModType.RationaleMod, this,
+ getABranch(), relationType.getTypeName());
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public RelationType getRelationType() {
+ return relationType;
+ }
+
+ public String getSideNameFor(Artifact artifact) {
+ return relationType.getSideName(getSide(artifact));
+ }
+
+ @Deprecated
+ public String getSidePhrasingFor(Artifact artifact) {
+ try {
+ return processArtifactSidePhrasing(artifact, false);
+ } catch (OseeCoreException ex) {
+ return "Unknown - " + ex.getLocalizedMessage();
+ }
+ }
+
+ @Deprecated
+ public String getSidePhrasingForOtherArtifact(Artifact artifact) throws OseeCoreException {
+ return processArtifactSidePhrasing(artifact, true);
+ }
+
+ @Deprecated
+ private String processArtifactSidePhrasing(Artifact artifact, boolean otherArtifact) throws OseeCoreException {
+ String sideName = "";
+
+ if (artifact == getArtifact(RelationSide.SIDE_A)) {
+
+ if (otherArtifact)
+ sideName = relationType.getBToAPhrasing();
+ else
+ sideName = relationType.getAToBPhrasing();
+ } else if (artifact == getArtifact(RelationSide.SIDE_B)) {
+
+ if (otherArtifact)
+ sideName = relationType.getAToBPhrasing();
+ else
+ sideName = relationType.getBToAPhrasing();
+ } else
+ throw new IllegalArgumentException("Link does not contain the artifact.");
+
+ return sideName;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s: A id[%d] order(%d) <--> B id[%s] order(%d) - %s", relationType.getTypeName(),
+ aArtifactId, aOrder, bArtifactId, bOrder, isDirty() ? "dirty" : "not dirty");
+ }
+
+ public boolean isExplorable() {
+ return true;
+ }
+
+ public void setNotDirty() {
+ dirty = false;
+ }
+
+ public void setDirty() {
+ dirty = true;
+ }
+
+ public boolean isVersionControlled() {
+ return true;
+ }
+
+ public Branch getBranch(RelationSide relationSide) {
+ return relationSide == RelationSide.SIDE_A ? aBranch : bBranch;
+ }
+
+ public void internalSetRelationId(int relationId) {
+ this.relationId = relationId;
+ }
+
+ public int getRelationId() {
+ return relationId;
+ }
+
+ public int getGammaId() {
+ return gammaId;
+ }
+
+ public boolean isInDb() {
+ return getRelationId() > 0;
+ }
+
+ /**
+ * @param gammaId
+ */
+ void internalSetGammaId(int gammaId) {
+ this.gammaId = gammaId;
+ }
+
+ /**
+ * @return Branch
+ */
+ public Branch getBranch() {
+ return getBranch(RelationSide.SIDE_A);
+ }
+
+ /**
+ * @param side
+ * @param order
+ */
+ public void setOrder(RelationSide side, int order) {
+ if (RelationSide.SIDE_A == side) {
+ setAOrder(order);
+ } else if (RelationSide.SIDE_B == side) {
+ setBOrder(order);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationManager.java
new file mode 100644
index 00000000000..9fb3461bdc3
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationManager.java
@@ -0,0 +1,849 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.relation;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RelationManager {
+ // the branch is accounted for because Artifact.equals includes the branch in the comparison
+ private static final CompositeKeyHashMap<Artifact, RelationType, List<RelationLink>> relationsByType =
+ new CompositeKeyHashMap<Artifact, RelationType, List<RelationLink>>(1024);
+
+ private static final HashMap<Artifact, List<RelationLink>> artifactToRelations =
+ new HashMap<Artifact, List<RelationLink>>(1024);
+
+ private static final String[] DELETED =
+ new String[] {
+ "INSERT INTO osee_join_artifact (query_id, insert_time, art_id, branch_id, transaction_id) (SELECT DISTINCT ?, sysdate, ",
+ ", branch_id, ? FROM osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id AND rel.rel_link_type_id = ? AND ",
+ " = ? AND tx_current in (2, 3))"};
+ private static final String GET_DELETED_ARTIFACT_B = DELETED[0] + "b_art_id" + DELETED[1] + "a_art_id" + DELETED[2];
+ private static final String GET_DELETED_ARTIFACT_A = DELETED[0] + "a_art_id" + DELETED[1] + "b_art_id" + DELETED[2];
+
+ private static final int LINKED_LIST_KEY = -1;
+
+ private synchronized static RelationLink getLoadedRelation(Artifact artifact, int aArtifactId, int bArtifactId, RelationType relationType, boolean includeDeleted){
+ List<RelationLink> selectedRelations = relationsByType.get(artifact, relationType);
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ if ((includeDeleted || !relation.isDeleted()) && relation.getAArtifactId() == aArtifactId && relation.getBArtifactId() == bArtifactId) {
+ return relation;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return Returns all cached relations including deleted relations
+ * @throws OseeArgumentException
+ */
+ private synchronized static RelationLink getLoadedRelation(Artifact artifact, int aArtifactId, int bArtifactId, RelationType relationType) throws OseeArgumentException {
+ RelationLink relationLink = getLoadedRelation(artifact, aArtifactId, bArtifactId, relationType, false);
+
+ if (relationLink == null) {
+ throw new OseeArgumentException(
+ "A relation link of type: " + relationType.getTypeName() + "does exist in the cache between a artifact: " + aArtifactId + " and b artifact:" + bArtifactId);
+ }
+
+ return relationLink;
+ }
+
+ /**
+ * This method should never be called by application code.
+ *
+ * @param relationType
+ * @param aArtifactId
+ * @param bArtifactId
+ * @param aBranch
+ * @param bBranch
+ * @return RelationLink
+ */
+ public static RelationLink getLoadedRelation(RelationType relationType, int aArtifactId, int bArtifactId, Branch aBranch, Branch bBranch) {
+ Artifact artifactA = ArtifactCache.getActive(aArtifactId, aBranch);
+ Artifact artifactB = ArtifactCache.getActive(bArtifactId, bBranch);
+ RelationLink relation = null;
+ if (artifactA != null) {
+ relation = getLoadedRelation(artifactA, aArtifactId, bArtifactId, relationType, true);
+ }
+ if (artifactB != null && relation == null) {
+ relation = getLoadedRelation(artifactB, aArtifactId, bArtifactId, relationType, true);
+ }
+ return relation;
+ }
+
+ /**
+ * Store the newly instantiated relation from the perspective of relationSide in its appropriate order
+ *
+ * @param relation
+ * @param relationSide
+ */
+ public synchronized static void manageRelation(RelationLink relation, RelationSide relationSide) {
+ Artifact artifact =
+ ArtifactCache.getActive(relation.getArtifactId(relationSide), relation.getBranch(relationSide));
+
+ if (artifact != null) {
+ List<RelationLink> artifactsRelations = artifactToRelations.get(artifact);
+ if (artifactsRelations == null) {
+ artifactsRelations = new CopyOnWriteArrayList<RelationLink>();
+ artifactToRelations.put(artifact, artifactsRelations);
+ }
+ if (artifactsRelations.contains(relation)) {
+ return;
+ }
+
+ artifactsRelations.add(relation);
+
+ List<RelationLink> selectedRelations = relationsByType.get(artifact, relation.getRelationType());
+ if (selectedRelations == null) {
+ selectedRelations = new CopyOnWriteArrayList<RelationLink>();
+ relationsByType.put(artifact, relation.getRelationType(), selectedRelations);
+ }
+ selectedRelations.add(relation);
+ }
+ }
+
+ private synchronized static List<Artifact> getRelatedArtifacts(Artifact artifact, RelationType relationType, RelationSide relationSide) throws OseeCoreException {
+ List<RelationLink> selectedRelations = null;
+ if (relationType == null) {
+ selectedRelations = artifactToRelations.get(artifact);
+ } else {
+ selectedRelations = relationsByType.get(artifact, relationType);
+ }
+
+ if (selectedRelations == null) {
+ return Collections.emptyList();
+ }
+
+ int queryId = ArtifactLoader.getNewQueryId();
+ CompositeKeyHashMap<Integer, Integer, Object[]> insertParameters =
+ new CompositeKeyHashMap<Integer, Integer, Object[]>((int) (selectedRelations.size() * 1.25) + 1);
+ List<Artifact> relatedArtifacts = new ArrayList<Artifact>(selectedRelations.size());
+
+ if (relationType == null) {
+ addRelatedArtifactIds(queryId, artifact, relatedArtifacts, insertParameters, selectedRelations,
+ RelationSide.OPPOSITE);
+ } else {
+ addRelatedArtifactIds(queryId, artifact, relatedArtifacts, insertParameters, selectedRelations, relationSide);
+ }
+
+ if (insertParameters.size() > 0) {
+ ArtifactLoader.loadArtifacts(queryId, ArtifactLoad.FULL, null, new ArrayList<Object[]>(
+ insertParameters.values()), false, false, false);
+ }
+
+ //now that bulk loading is done, put the artifacts in the right order and return them
+ relatedArtifacts.clear();
+ for (RelationLink relation : selectedRelations) {
+ if (!relation.isDeleted()) {
+ try {
+ if (relationSide == null) {
+ Artifact art = relation.getArtifactOnOtherSide(artifact);
+ // if(!art.isDeleted()){
+ relatedArtifacts.add(art);
+ // }
+ } else {
+ // only select relations where the related artifact is on relationSide
+ // (and thus on the side opposite of "artifact")
+ if (relation.getSide(artifact) != relationSide) {
+ Artifact art = relation.getArtifact(relationSide);
+ // if(!art.isDeleted()){
+ relatedArtifacts.add(art);
+ // }
+ }
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(Activator.class, Level.WARNING, ex.getMessage(), ex);
+ }
+ }
+ }
+ return relatedArtifacts;
+ }
+
+ private static void addRelatedArtifactIds(int queryId, Artifact artifact, Collection<Artifact> relatedArtifacts, CompositeKeyHashMap<Integer, Integer, Object[]> insertParameters, List<RelationLink> relations, RelationSide side) {
+ if (relations == null) {
+ return;
+ }
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ for (RelationLink relation : relations) {
+ if (!relation.isDeleted()) {
+ RelationSide resolvedSide = null;
+ if (side == RelationSide.OPPOSITE) {
+ resolvedSide = relation.getSide(artifact).oppositeSide();
+ } else {
+ if (relation.getSide(artifact) != side) {
+ resolvedSide = side;
+ }
+ }
+ if (resolvedSide != null) {
+ int artId = relation.getArtifactId(resolvedSide);
+ int branchId = relation.getBranch(resolvedSide).getBranchId();
+ Artifact relatedArtifact = ArtifactCache.getActive(artId, branchId);
+ if (relatedArtifact == null) {
+ insertParameters.put(artId, branchId, new Object[] {queryId, insertTime, artId, branchId,
+ SQL3DataType.INTEGER});
+ } else {
+ relatedArtifacts.add(relatedArtifact);
+ }
+ }
+ }
+ }
+ }
+
+ public static Set<Artifact> getRelatedArtifacts(Collection<? extends Artifact> artifacts, int depth, IRelationEnumeration... relationEnums) throws OseeCoreException {
+ return getRelatedArtifacts(artifacts, depth, false, relationEnums);
+ }
+
+ public synchronized static Set<Artifact> getRelatedArtifacts(Collection<? extends Artifact> artifacts, int depth, boolean allowDeleted, IRelationEnumeration... relationEnums) throws OseeCoreException {
+ int queryId = ArtifactLoader.getNewQueryId();
+ CompositeKeyHashMap<Integer, Integer, Object[]> insertParameters =
+ new CompositeKeyHashMap<Integer, Integer, Object[]>(artifacts.size() * 8);
+ Set<Artifact> relatedArtifacts = new HashSet<Artifact>(artifacts.size() * 8);
+ Collection<Artifact> newArtifactsToSearch = new ArrayList<Artifact>(artifacts);
+ Collection<Artifact> newArtifacts = new ArrayList<Artifact>();
+ int oldArtifactCount = -1;
+ for (int i = 0; i < depth && oldArtifactCount != relatedArtifacts.size(); i++) {
+ oldArtifactCount = relatedArtifacts.size();
+ insertParameters.clear();
+ newArtifacts.clear();
+ for (Artifact artifact : newArtifactsToSearch) {
+ List<RelationLink> selectedRelations = null;
+
+ if (relationEnums.length == 0) {
+ selectedRelations = artifactToRelations.get(artifact);
+ addRelatedArtifactIds(queryId, artifact, newArtifacts, insertParameters, selectedRelations,
+ RelationSide.OPPOSITE);
+ } else {
+ for (IRelationEnumeration relationEnum : relationEnums) {
+ selectedRelations = relationsByType.get(artifact, relationEnum.getRelationType());
+ addRelatedArtifactIds(queryId, artifact, newArtifacts, insertParameters, selectedRelations,
+ relationEnum.getSide());
+ }
+ }
+ }
+
+ if (insertParameters.size() > 0) {
+ newArtifacts.addAll(ArtifactLoader.loadArtifacts(queryId, ArtifactLoad.FULL, null, new ArrayList<Object[]>(
+ insertParameters.values()), false, false, allowDeleted));
+ }
+ newArtifactsToSearch.clear();
+ newArtifactsToSearch.addAll(newArtifacts);
+ relatedArtifacts.addAll(newArtifacts);
+ }
+ return relatedArtifacts;
+ }
+
+ public static List<Artifact> getRelatedArtifactsAll(Artifact artifact) throws OseeCoreException {
+ return getRelatedArtifacts(artifact, null, null);
+ }
+
+ public static List<Artifact> getRelatedArtifacts(Artifact artifact, RelationType relationType) throws OseeCoreException {
+ return getRelatedArtifacts(artifact, relationType, null);
+ }
+
+ public static List<Artifact> getRelatedArtifacts(Artifact artifact, IRelationEnumeration relationEnum, boolean includeDeleted) throws OseeCoreException {
+ if (includeDeleted) {
+ List<Artifact> artifacts =
+ getRelatedArtifacts(artifact, relationEnum.getRelationType(), relationEnum.getSide());
+ int queryId = ArtifactLoader.getNewQueryId();
+ //(SELECT ?, ?, b_art_id, branch_id, ? FROM osee_tx_details det, osee_txs txs, osee_relation_link rel WHERE branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = rel.gamma_id AND rel.rel_link_type_id = ? AND a_art_id = ? AND tx_current = 3)"
+ if (relationEnum.getSide().equals(RelationSide.SIDE_B)) {
+ ConnectionHandler.runPreparedUpdate(GET_DELETED_ARTIFACT_B, queryId, SQL3DataType.INTEGER,
+ artifact.getBranch().getBranchId(), relationEnum.getRelationType().getRelationTypeId(),
+ artifact.getArtId());
+ } else {
+ ConnectionHandler.runPreparedUpdate(GET_DELETED_ARTIFACT_A, queryId, SQL3DataType.INTEGER,
+ artifact.getBranch().getBranchId(), relationEnum.getRelationType().getRelationTypeId(),
+ artifact.getArtId());
+ }
+
+ List<Artifact> deletedArtifacts =
+ ArtifactLoader.loadArtifactsFromQueryId(queryId, ArtifactLoad.FULL, null, 4, false, false, true);
+
+ if (artifacts.isEmpty()) {
+ artifacts = new LinkedList<Artifact>();
+ }
+ for (Artifact artifactLoop : deletedArtifacts) {
+ if (artifactLoop.isDeleted()) {
+ artifacts.add(artifactLoop);
+ }
+ }
+
+ return artifacts;
+ } else {
+ return getRelatedArtifacts(artifact, relationEnum.getRelationType(), relationEnum.getSide());
+ }
+
+ }
+
+ public static List<Artifact> getRelatedArtifacts(Artifact artifact, IRelationEnumeration relationEnum) throws OseeCoreException {
+ return getRelatedArtifacts(artifact, relationEnum.getRelationType(), relationEnum.getSide());
+ }
+
+ private static Artifact getRelatedArtifact(Artifact artifact, RelationType relationType, RelationSide relationSide) throws OseeCoreException {
+ List<Artifact> artifacts = getRelatedArtifacts(artifact, relationType, relationSide);
+
+ if (artifacts.size() == 0) {
+ throw new ArtifactDoesNotExist(String.format("There is no artifact related to %s by a relation of type %s",
+ artifact, relationType));
+ }
+
+ if (artifacts.size() > 1) {
+ throw new MultipleArtifactsExist(
+ String.format(
+ "There are %s artifacts related to \"%s\" by a relation of type \"%s\" on side %s instead of the expected 1.",
+ artifacts.size(), artifact, relationType, relationSide.toString()));
+ }
+ return artifacts.get(0);
+ }
+
+ public static Artifact getRelatedArtifact(Artifact artifact, IRelationEnumeration relationEnum) throws OseeCoreException {
+ return getRelatedArtifact(artifact, relationEnum.getRelationType(), relationEnum.getSide());
+ }
+
+ public synchronized static int getRelatedArtifactsCount(Artifact artifact, RelationType relationType, RelationSide relationSide) {
+ List<RelationLink> selectedRelations = relationsByType.get(artifact, relationType);
+
+ int artifactCount = 0;
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ if (!relation.isDeleted()) {
+ if (relationSide == null) {
+ artifactCount++;
+ } else {
+ // only select relations where the related artifact is on the side specified by relationEnum
+ // (and thus on the side opposite of "artifact")
+ if (relation.getSide(artifact) != relationSide) {
+ artifactCount++;
+ }
+ }
+ }
+ }
+ }
+
+ return artifactCount;
+ }
+
+ /**
+ * @param artifact
+ */
+ public synchronized static void prepareRelationsForReload(Artifact artifact) {
+ // weakness: references held to links by other applications will continue to exist.
+ artifactToRelations.remove(artifact);
+ relationsByType.removeValues(artifact);
+ }
+
+ public synchronized static boolean hasDirtyLinks(Artifact artifact) {
+ List<RelationLink> selectedRelations = artifactToRelations.get(artifact);
+ if (selectedRelations == null) {
+ return false;
+ }
+ for (RelationLink relation : selectedRelations) {
+ if (relation.isDirty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * Return what relation is dirty otherwise null
+ */
+ public synchronized static String reportHasDirtyLinks(Artifact artifact) {
+ List<RelationLink> selectedRelations = artifactToRelations.get(artifact);
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ if (relation.isDirty()) {
+ return "Relation: " + relation;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param transaction TODO
+ * @param artifact
+ * @param relationType if not null persists the relations of this type, otherwise persists relations of all types
+ */
+ public synchronized static void persistRelationsFor(SkynetTransaction transaction, Artifact artifact, RelationType relationType) throws OseeCoreException {
+ List<RelationLink> selectedRelations;
+ if (relationType == null) {
+ selectedRelations = artifactToRelations.get(artifact);
+ } else {
+ selectedRelations = relationsByType.get(artifact, relationType);
+ }
+
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ if (relation.isDirty()) {
+ transaction.addRelation(relation);
+
+ try {
+ Artifact artifactOnOtherSide = relation.getArtifactOnOtherSide(artifact);
+ List<RelationLink> otherSideRelations =
+ relationsByType.get(artifactOnOtherSide, relation.getRelationType());
+ for (int i = 0; i < otherSideRelations.size(); i++) {
+ if (relation.equals(otherSideRelations.get(i))) {
+ if (i + 1 < otherSideRelations.size()) {
+ RelationLink nextRelation = otherSideRelations.get(i + 1);
+ if (nextRelation.isDirty()) {
+ transaction.addRelation(nextRelation);
+ }
+ }
+ }
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(
+ RelationManager.class,
+ Level.SEVERE,
+ String.format(
+ "Unable to to persist other side relation order because the artifact on the other side of [%s, %s] doesn't exist. ",
+ artifact.toString(), relation.toString()), ex);
+ }
+ }
+ }
+ }
+ }
+
+ public synchronized static List<RelationLink> getRelationsAll(Artifact artifact, boolean includeDeleted) {
+ List<RelationLink> selectedRelations = artifactToRelations.get(artifact);
+
+ if (selectedRelations == null) {
+ return Collections.emptyList();
+ }
+
+ List<RelationLink> relations = new ArrayList<RelationLink>(selectedRelations.size());
+ for (RelationLink relation : selectedRelations) {
+ if (!relation.isDeleted() || includeDeleted) {
+ relations.add(relation);
+ }
+ }
+ return relations;
+ }
+
+ public synchronized static List<RelationLink> getRelations(Artifact artifact, RelationType relationType, RelationSide relationSide) {
+ List<RelationLink> selectedRelations = relationsByType.get(artifact, relationType);
+ if (selectedRelations == null) {
+ return Collections.emptyList();
+ }
+
+ List<RelationLink> relations = new ArrayList<RelationLink>(selectedRelations.size());
+
+ for (RelationLink relation : selectedRelations) {
+ if (!relation.isDeleted()) {
+ if (relationSide == null) {
+ relations.add(relation);
+ } else {
+ // only select relations where the related artifact is on the side specified by relationEnum
+ // (and thus on the side opposite of "artifact")
+ if (relation.getSide(artifact) != relationSide) {
+ relations.add(relation);
+ }
+ }
+ }
+ }
+ return relations;
+ }
+
+ /**
+ * @param relationType
+ * @param artifactA
+ * @param artifactB
+ * @param rationale
+ * @throws OseeCoreException
+ */
+ public static void addRelation(RelationType relationType, Artifact artifactA, Artifact artifactB, String rationale) throws OseeCoreException {
+ RelationLink relation = getLoadedRelation(artifactA, artifactA.getArtId(), artifactB.getArtId(), relationType, false);
+
+ if (relation == null) {
+ ensureRelationCanBeAdded(relationType, artifactA, artifactB);
+ relation = new RelationLink(artifactA, artifactB, relationType, rationale);
+ relation.setDirty();
+
+ setDefaultRelationOrder(relation, artifactA, artifactB);
+
+ RelationManager.manageRelation(relation, RelationSide.SIDE_A);
+ RelationManager.manageRelation(relation, RelationSide.SIDE_B);
+
+ try {
+ OseeEventManager.kickRelationModifiedEvent(RelationManager.class, RelationModType.Added, relation,
+ relation.getABranch(), relationType.getTypeName());
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public static void ensureRelationCanBeAdded(RelationType relationType, Artifact artifactA, Artifact artifactB) throws OseeArgumentException {
+ // For now, relations can not be cross branch. Ensure that both artifacts are on same branch
+ // TODO Fix this when fix cross branching (not writing or reading from db correctly)
+ // if (!artifactA.getBranch().equals(artifactB.getBranch())) {
+ // throw new OseeArgumentException("Cross branch linking is not yet supported.");
+ // }
+ ensureSideWillSupport(artifactA, relationType, RelationSide.SIDE_A, artifactA.getArtifactType(), 1);
+ ensureSideWillSupport(artifactB, relationType, RelationSide.SIDE_B, artifactB.getArtifactType(), 1);
+ }
+
+ /**
+ * Check whether artifactCount number of additional artifacts of type artifactType can be related to the artifact on
+ * side relationSide for relations of type relationType
+ *
+ * @param relationType
+ * @param relationSide
+ * @param artifact
+ * @param artifactCount
+ * @throws OseeArgumentException
+ */
+ public static void ensureSideWillSupport(Artifact artifact, RelationType relationType, RelationSide relationSide, ArtifactType artifactType, int artifactCount) throws OseeArgumentException {
+ int maxCount = RelationTypeManager.getRelationSideMax(relationType, artifactType, relationSide);
+ int usedCount = getRelatedArtifactsCount(artifact, relationType, relationSide.oppositeSide());
+
+ if (maxCount == 0) {
+ throw new OseeArgumentException(String.format(
+ "Artifact \"%s\" of type \"%s\" does not belong on side \"%s\" of relation \"%s\"",
+ artifact.getInternalDescriptiveName(), artifact.getArtifactTypeName(),
+ relationType.getSideName(relationSide), relationType.getTypeName()));
+ } else if (maxCount == 1 && usedCount + artifactCount > maxCount) {
+ throw new OseeArgumentException(
+ String.format(
+ "Artifact \"%s\" of type \"%s\" can not be added to \"%s\" of relation \"%s\" because doing so would exceed the side maximum of %d for this artifact type",
+ artifact.getDescriptiveName(), artifact.getArtifactTypeName(), relationSide.toString(),
+ relationType.getTypeName(), maxCount));
+ }
+ }
+
+ public static void deleteRelation(RelationType relationType, Artifact artifactA, Artifact artifactB) throws ArtifactDoesNotExist, OseeArgumentException {
+ RelationLink relation = getLoadedRelation(artifactA, artifactA.getArtId(), artifactB.getArtId(), relationType);
+ relation.delete(true);
+ }
+
+ public synchronized static void deleteRelationsAll(Artifact artifact, boolean reorderRelations) throws ArtifactDoesNotExist {
+ List<RelationLink> selectedRelations = artifactToRelations.get(artifact);
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ relation.delete(reorderRelations);
+ }
+ }
+ }
+
+ public synchronized static void deleteRelations(Artifact artifact, RelationType relationType, RelationSide relationSide) throws ArtifactDoesNotExist {
+ List<RelationLink> selectedRelations = relationsByType.get(artifact, relationType);
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ if (relationSide == null) {
+ relation.delete(true);
+ } else {
+ if (relation.getSide(artifact) != relationSide) {
+ relation.delete(true);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This method should only be called for unordered Relation Types. It does not handle reordering relation types that
+ * maintain order.
+ *
+ * @param artifact
+ * @param relationType
+ * @param relationSide
+ * @throws OseeCoreException
+ */
+ public synchronized static void revertRelations(Artifact artifact, RelationType relationType, RelationSide relationSide) throws OseeCoreException {
+ List<RelationLink> selectedRelations = relationsByType.get(artifact, relationType);
+ if (selectedRelations != null) {
+ for (RelationLink relation : selectedRelations) {
+ if (relationSide == null) {
+ ArtifactPersistenceManager.revertRelationLink(null, relation);
+ } else {
+ if (relation.getSide(artifact) != relationSide) {
+ ArtifactPersistenceManager.revertRelationLink(null, relation);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Remove all relations stored in the list awaiting to be deleted.
+ *
+ * @throws OseeDataStoreException
+ */
+ public synchronized static void purgeRelationsFor(Artifact artifact) throws OseeDataStoreException {
+ Collection<RelationLink> links = artifactToRelations.get(artifact);
+ if (!links.isEmpty()) {
+ List<Object[]> batchArgs = new ArrayList<Object[]>(links.size());
+ String PURGE_RELATION = "delete from osee_relation_link WHERE rel_link_id = ?";
+ for (RelationLink link : links) {
+ batchArgs.add(new Object[] {link.getRelationId()});
+ link.markAsPurged();
+ }
+ ConnectionHandler.runBatchUpdate(PURGE_RELATION, batchArgs);
+ }
+ }
+
+ /**
+ * @param sideA
+ * @param targetArtifact
+ * @param insertAfterTarget
+ * @param relationType
+ * @param artifactA
+ * @param artifactB
+ * @param rationale
+ * @throws OseeCoreException
+ */
+ public static void addRelation(Artifact artifactATarget, boolean insertAfterATarget, Artifact artifactBTarget, boolean insertAfterBTarget, RelationType relationType, Artifact artifactA, Artifact artifactB, String rationale) throws OseeCoreException {
+ ensureRelationCanBeAdded(relationType, artifactA, artifactB);
+ RelationLink relation = getLoadedRelation(artifactA, artifactA.getArtId(), artifactB.getArtId(), relationType, false);
+
+ if (relation == null) {
+ relation = new RelationLink(artifactA, artifactB, relationType, rationale);
+ relation.setDirty();
+
+ setDefaultRelationOrder(relation, artifactA, artifactB);
+
+ RelationManager.manageRelation(relation, RelationSide.SIDE_A);
+ RelationManager.manageRelation(relation, RelationSide.SIDE_B);
+
+ setRelationOrdering(RelationSide.SIDE_B, relation, artifactBTarget, insertAfterBTarget, artifactA, artifactA,
+ artifactBTarget);
+ setRelationOrdering(RelationSide.SIDE_A, relation, artifactATarget, insertAfterATarget, artifactB,
+ artifactATarget, artifactB);
+ }
+
+ OseeEventManager.kickRelationModifiedEvent(RelationManager.class, RelationModType.Added, relation,
+ relation.getBranch(), relation.getRelationType().getTypeName());
+
+ }
+
+ private static void setDefaultRelationOrder(RelationLink relation, Artifact artifactA, Artifact artifactB) {
+ if (relation.getRelationType().isOrdered()) {
+ List<RelationLink> selectedRelations =
+ getRelations(artifactA, relation.getRelationType(), RelationSide.SIDE_B);
+ if (selectedRelations != null && selectedRelations.size() > 0) {
+ relation.setOrder(RelationSide.SIDE_B, selectedRelations.get(selectedRelations.size() - 1).getArtifactId(
+ RelationSide.SIDE_B));
+ } else {
+ relation.setOrder(RelationSide.SIDE_B, -1);
+ }
+ selectedRelations = getRelations(artifactB, relation.getRelationType(), RelationSide.SIDE_A);
+ if (selectedRelations != null && selectedRelations.size() > 0) {
+ relation.setOrder(RelationSide.SIDE_A, selectedRelations.get(selectedRelations.size() - 1).getArtifactId(
+ RelationSide.SIDE_A));
+ } else {
+ relation.setOrder(RelationSide.SIDE_A, -1);
+ }
+ }
+ }
+
+ private synchronized static void setRelationOrdering(RelationSide side, RelationLink relation, Artifact targetArtifact, boolean insertAfterTarget, Artifact sourceArtifact, Artifact artA, Artifact artB) throws OseeCoreException {
+ if (relation.getRelationType().isOrdered() && targetArtifact != null) {
+
+ RelationLink targetRelation =
+ getLoadedRelation(sourceArtifact, artA.getArtId(), artB.getArtId(), relation.getRelationType());
+
+ List<RelationLink> selectedRelations = relationsByType.get(sourceArtifact, relation.getRelationType());
+ if (selectedRelations.remove(relation)) {
+ int targetIndex = selectedRelations.indexOf(targetRelation);
+ if (targetIndex == -1) {
+ selectedRelations.add(relation);
+ } else {
+ int index = insertAfterTarget ? targetIndex + 1 : targetIndex;
+ selectedRelations.add(index, relation);
+ }
+ int lastArtId = LINKED_LIST_KEY;
+ for (RelationLink link : selectedRelations) {
+ if (!link.isDeleted() && link.getSide(sourceArtifact) == side.oppositeSide()) {
+ if (link.getOrder(side) != lastArtId) {
+ link.setOrder(side, lastArtId);
+ }
+ lastArtId = link.getArtifactId(side);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @param targetArtifact
+ * @param insertAfterTarget
+ * @param relationType
+ * @param artifactA
+ * @param artifactB
+ * @throws OseeCoreException
+ */
+ public static void setRelationOrder(Artifact artifactATarget, boolean insertAfterATarget, Artifact artifactBTarget, boolean insertAfterBTarget, RelationType relationType, Artifact artifactA, Artifact artifactB) throws OseeCoreException {
+
+ RelationLink relation = getLoadedRelation(artifactA, artifactA.getArtId(), artifactB.getArtId(), relationType);
+
+ setRelationOrdering(RelationSide.SIDE_B, relation, artifactBTarget, insertAfterBTarget, artifactA, artifactA,
+ artifactBTarget);
+ setRelationOrdering(RelationSide.SIDE_A, relation, artifactATarget, insertAfterATarget, artifactB,
+ artifactATarget, artifactB);
+
+ try {
+ OseeEventManager.kickRelationModifiedEvent(RelationManager.class, RelationModType.ReOrdered, relation,
+ relation.getABranch(), relationType.getTypeName());
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * @param artifact
+ */
+ public static void sortRelations(Artifact artifact, Map<Integer, RelationLink> sideA, Map<Integer, RelationLink> sideB) {
+ List<RelationType> types = RelationTypeManager.getValidTypes(artifact.getArtifactType(), artifact.getBranch());
+ for (RelationType type : types) {
+ sortRelations(artifact, type, sideA, sideB);
+ }
+ }
+
+ public synchronized static void sortRelations(Artifact artifact, RelationType type, Map<Integer, RelationLink> sideA, Map<Integer, RelationLink> sideB) {
+ if (type.isOrdered()) {
+ List<RelationLink> relations = relationsByType.get(artifact, type);
+ if (relations != null) {
+ sideA.clear();
+ sideB.clear();
+ boolean badValues = false;
+ for (RelationLink relation : relations) {
+ if (!relation.isDeleted()) {
+ if (relation.getSide(artifact) == RelationSide.SIDE_A) {
+ if (sideB.put(relation.getOrder(RelationSide.SIDE_B), relation) != null) {
+ badValues = true;
+ }
+ } else {
+ if (sideA.put(relation.getOrder(RelationSide.SIDE_A), relation) != null) {
+ badValues = true;
+ }
+ }
+ }
+ }
+ if (!badValues) {
+ relations.clear();
+
+ //do side b first
+ RelationLink relation = sideB.remove(LINKED_LIST_KEY);
+ while (relation != null) {
+ relations.add(relation);
+ RelationLink newRelation = sideB.get(relation.getArtifactId(RelationSide.SIDE_B));
+ sideB.remove(relation.getArtifactId(RelationSide.SIDE_B));
+ relation = newRelation;
+ }
+ if (sideB.values().size() > 0) {
+ OseeLog.log(
+ RelationManager.class,
+ Level.FINE,
+ String.format(
+ "Artifact artId[%d] - %s - is unsorted for relations type - relTypeId[%d] - %s - . (missing a relation)",
+ artifact.getArtId(), artifact.toString(), type.getRelationTypeId(), type.toString()));
+ }
+ relations.addAll(sideB.values());
+ //now side a
+ relation = sideA.remove(LINKED_LIST_KEY);
+ while (relation != null) {
+ relations.add(relation);
+ relation = sideA.remove(relation.getArtifactId(RelationSide.SIDE_A));
+ }
+ if (sideA.values().size() > 0) {
+ OseeLog.log(
+ RelationManager.class,
+ Level.FINE,
+ String.format(
+ "Artifact artId[%d] - %s - is unsorted for relations type - relTypeId[%d] - %s - . (missing a relation)",
+ artifact.getArtId(), artifact.toString(), type.getRelationTypeId(), type.toString()));
+ }
+ relations.addAll(sideA.values());
+ } else {
+ OseeLog.log(
+ RelationManager.class,
+ Level.FINE,
+ String.format(
+ "Artifact - artId[%d] - %s - is unsorted for relations type - relTypeId[%d] - %s - # of relations in mem - %d - . (duplicate relation)",
+ artifact.getArtId(), artifact.toString(), type.getRelationTypeId(), type.toString(),
+ relations.size()));
+ }
+ }
+ }
+ }
+
+ /**
+ * @param relationLink
+ * @param b
+ * @throws ArtifactDoesNotExist
+ */
+ static void setOrderValuesBasedOnCurrentMemoryOrder(RelationLink relationLink, Artifact aArt, Artifact bArt, boolean markAsNotDirty) throws ArtifactDoesNotExist {
+ if (aArt != null) {
+ setOrderValues(aArt, relationLink.getRelationType(), RelationSide.SIDE_B, markAsNotDirty);
+ }
+ if (bArt != null) {
+ setOrderValues(bArt, relationLink.getRelationType(), RelationSide.SIDE_A, markAsNotDirty);
+ }
+ }
+
+ static synchronized void setOrderValues(Artifact sourceArtifact, RelationType relationType, RelationSide side, boolean markAsNotDirty) {
+ if (relationType.isOrdered()) {
+ List<RelationLink> selectedRelations = relationsByType.get(sourceArtifact, relationType);
+ if (selectedRelations == null) {
+ return;
+ }
+ int lastArtId = LINKED_LIST_KEY;
+ for (RelationLink link : selectedRelations) {
+ if (!link.isDeleted() && link.getSide(sourceArtifact) == side.oppositeSide()) {
+ if (link.getOrder(side) != lastArtId) {
+ link.setOrder(side, lastArtId);
+ if (markAsNotDirty) {
+ link.setNotDirty();
+ }
+ }
+ lastArtId = link.getArtifactId(side);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationModType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationModType.java
new file mode 100644
index 00000000000..0c5446e16a1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationModType.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.framework.skynet.core.relation;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum RelationModType {
+ Deleted, Added, RationaleMod, ReOrdered
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationSide.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationSide.java
new file mode 100644
index 00000000000..bced88e0598
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationSide.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.framework.skynet.core.relation;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum RelationSide {
+ SIDE_A, SIDE_B, OPPOSITE;
+
+ private static RelationSide[] sides = new RelationSide[] {SIDE_A, SIDE_B};
+
+ public RelationSide oppositeSide() {
+ if (this == OPPOSITE) {
+ return OPPOSITE;
+ } else {
+ return this == SIDE_A ? SIDE_B : SIDE_A;
+ }
+ }
+
+ public boolean isSideA() {
+ return this == RelationSide.SIDE_A;
+ }
+
+ /**
+ * @return RelationSide
+ */
+ public static RelationSide[] getSides() {
+ return sides;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTransactionData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTransactionData.java
new file mode 100644
index 00000000000..c47b65c89f8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTransactionData.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.framework.skynet.core.relation;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactTransactionModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.RelationModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Roberto E. Escobar
+ */
+public class RelationTransactionData extends BaseTransactionData {
+ private static final String INSERT_INTO_RELATION_TABLE =
+ "INSERT INTO osee_relation_link (rel_link_id, rel_link_type_id, a_art_id, b_art_id, rationale, a_order, b_order, gamma_id, modification_id) VALUES (?,?,?,?,?,?,?,?,?)";
+
+ private final RelationLink relation;
+
+ public RelationTransactionData(RelationLink relation, ModificationType modificationType) throws OseeDataStoreException {
+ super(relation.getRelationId(), modificationType, modificationType == ModificationType.ARTIFACT_DELETED);
+ this.relation = relation;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#getSelectTxNotCurrentSql()
+ */
+ @Override
+ public String getSelectTxNotCurrentSql() {
+ return OseeSql.Transaction.SELECT_PREVIOUS_TX_NOT_CURRENT_RELATIONS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#addInsertToBatch(org.eclipse.osee.framework.jdk.core.type.HashCollection)
+ */
+ @Override
+ protected void addInsertToBatch(SkynetTransaction transaction) throws OseeCoreException {
+ super.addInsertToBatch(transaction);
+ if (!useExistingBackingData()) {
+ internalAddInsertToBatch(transaction, 4, INSERT_INTO_RELATION_TABLE, relation.getRelationId(),
+ relation.getRelationType().getRelationTypeId(), relation.getAArtifactId(), relation.getBArtifactId(),
+ relation.getRationale(), relation.getAOrder(), relation.getBOrder(), getGammaId(),
+ getModificationType().getValue());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalUpdate()
+ */
+ @Override
+ protected void internalUpdate(TransactionId transactionId) throws OseeCoreException {
+ relation.internalSetGammaId(getGammaId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalClearDirtyState()
+ */
+ @Override
+ protected void internalClearDirtyState() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalOnRollBack()
+ */
+ @Override
+ protected void internalOnRollBack() throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#createGammaId()
+ */
+ @Override
+ protected int createGammaId() throws OseeCoreException {
+ int newGammaId = 0;
+ if (useExistingBackingData()) {
+ newGammaId = relation.getGammaId();
+ } else {
+ newGammaId = SequenceManager.getNextGammaId();
+ }
+ return newGammaId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.transaction.BaseTransactionData#internalUpdateEvents(org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction)
+ */
+ @Override
+ protected void internalAddToEvents(Collection<ArtifactTransactionModifiedEvent> events) throws OseeCoreException {
+ RelationModType relationModType =
+ getModificationType().isDeleted() ? RelationModType.Deleted : RelationModType.Added;
+ events.add(new RelationModifiedEvent(new Sender(this.getClass().getName()), relationModType, relation,
+ relation.getBranch(), relation.getRelationType().getTypeName()));
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationType.java
new file mode 100644
index 00000000000..eaae924d273
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationType.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.relation;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RelationType implements Comparable<RelationType> {
+ private int relationTypeId;
+ private String namespace;
+ private String typeName;
+ private String sideAName;
+ private String sideBName;
+ private String aToBPhrasing;
+ private String bToAPhrasing;
+ private String shortName;
+ private String ordered;
+
+ public RelationType(int linkTypeId, String namespace, String typeName, String sideAName, String sideBName, String aToBPhrasing, String bToAPhrasing, String shortName, String ordered) {
+ super();
+ this.relationTypeId = linkTypeId;
+ this.namespace = namespace == null ? "" : namespace;
+ this.typeName = typeName;
+ this.sideAName = sideAName;
+ this.sideBName = sideBName;
+ this.aToBPhrasing = aToBPhrasing;
+ this.bToAPhrasing = bToAPhrasing;
+ this.shortName = shortName;
+ this.ordered = ordered;
+ }
+
+ /**
+ * @return Returns the aToBPhrasing.
+ */
+ public String getAToBPhrasing() {
+ return aToBPhrasing;
+ }
+
+ /**
+ * @return Returns the bToAPhrasing.
+ */
+ public String getBToAPhrasing() {
+ return bToAPhrasing;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public String getSideName(RelationSide relationSide) {
+ return relationSide == RelationSide.SIDE_A ? sideAName : sideBName;
+ }
+
+ /**
+ * @return Returns the sideAName.
+ */
+ public String getSideAName() {
+ return sideAName;
+ }
+
+ /**
+ * @return Returns the sideBName.
+ */
+ public String getSideBName() {
+ return sideBName;
+ }
+
+ /**
+ * @return Returns the shortName.
+ */
+ public String getShortName() {
+ return shortName;
+ }
+
+ public boolean isSideAName(String sideName) throws OseeArgumentException {
+ if (!sideAName.equals(sideName) && !sideBName.equals(sideName)) {
+ throw new OseeArgumentException("sideName does not match either of the available side names");
+ }
+
+ return sideAName.equals(sideName);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Comparable#compareTo(T)
+ */
+ public int compareTo(RelationType descriptor) {
+ return typeName.compareTo(descriptor.getTypeName());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof RelationType) return typeName.equals(((RelationType) obj).typeName);
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return typeName.hashCode();
+ }
+
+ public String toString() {
+ return typeName + " " + sideAName + " <--> " + sideBName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.RelationType#getRelationTypeId()
+ */
+ public int getRelationTypeId() {
+ return relationTypeId;
+ }
+
+ public boolean isOrdered() {
+ return ordered.equalsIgnoreCase("Yes");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeManager.java
new file mode 100644
index 00000000000..06f77d682bc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeManager.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.framework.skynet.core.relation;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class RelationTypeManager {
+ private static final String SELECT_LINK_TYPES = "SELECT * FROM osee_relation_link_type";
+ private static final String INSERT_RELATION_LINK_TYPE =
+ "INSERT INTO osee_relation_link_type (rel_link_type_id, namespace, type_name, a_name, b_name, ab_phrasing, ba_phrasing, short_name, user_ordered) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
+
+ private static final String INSERT_VALID_RELATION =
+ "INSERT INTO osee_valid_relations (art_type_id, rel_link_type_id, side_a_max, side_b_max, branch_id) VALUES (?, ?, ?, ?, ?)";
+
+ private final HashMap<String, RelationType> nameToTypeMap = new HashMap<String, RelationType>();
+ private final HashMap<Integer, RelationType> idToTypeMap = new HashMap<Integer, RelationType>();
+ private final CompositeKeyHashMap<RelationType, ArtifactType, ObjectPair<Integer, Integer>> validityMap =
+ new CompositeKeyHashMap<RelationType, ArtifactType, ObjectPair<Integer, Integer>>(300);
+
+ private static final String SELECT_LINK_VALIDITY = "SELECT * FROM osee_valid_relations";
+ private static final RelationTypeManager instance = new RelationTypeManager();
+
+ private RelationTypeManager() {
+ }
+
+ /**
+ * @param branch
+ * @return all the relation types that are valid for the given branch
+ * @throws OseeDataStoreException
+ * @throws OseeTypeDoesNotExist
+ */
+ public static List<RelationType> getValidTypes(Branch branch) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ return getAllTypes();
+ }
+
+ /**
+ * @return all Relation types in the datastore
+ * @throws OseeDataStoreException
+ * @throws OseeTypeDoesNotExist
+ */
+ public static List<RelationType> getAllTypes() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ensurePopulated();
+ return new ArrayList<RelationType>(instance.idToTypeMap.values());
+ }
+
+ public static List<RelationType> getValidTypes(ArtifactType artifactType, Branch branch) {
+ Collection<RelationType> relationTypes = instance.idToTypeMap.values();
+ List<RelationType> validRelationTypes = new ArrayList<RelationType>();
+ for (RelationType relationType : relationTypes) {
+ int sideAMax = getRelationSideMax(relationType, artifactType, RelationSide.SIDE_A);
+ int sideBMax = getRelationSideMax(relationType, artifactType, RelationSide.SIDE_B);
+ boolean onSideA = sideBMax > 0;
+ boolean onSideB = sideAMax > 0;
+ if (onSideA || onSideB) {
+ validRelationTypes.add(relationType);
+ }
+ }
+ return validRelationTypes;
+ }
+
+ public static RelationType getType(int relationTypeId) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ ensurePopulated();
+ return internalGetType(relationTypeId);
+ }
+
+ private static RelationType internalGetType(int relationTypeId) throws OseeTypeDoesNotExist {
+ RelationType relationType = instance.idToTypeMap.get(relationTypeId);
+ if (relationType == null) {
+ throw new OseeTypeDoesNotExist("The relation with type id: " + relationTypeId + " does not exist");
+ }
+ return relationType;
+ }
+
+ public static RelationType getType(String namespace, String typeName) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ ensurePopulated();
+ RelationType relationType = instance.nameToTypeMap.get(namespace + typeName);
+ if (relationType == null) {
+ throw new OseeTypeDoesNotExist("The relation type: \"" + namespace + typeName + "\" does not exist");
+ }
+ return relationType;
+ }
+
+ public static boolean typeExists(String namespace, String name) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ensurePopulated();
+ return instance.nameToTypeMap.get(namespace + name) != null;
+ }
+
+ public static RelationType getType(String typeName) throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return getType("", typeName);
+ }
+
+ private void cache(RelationType relationType) {
+ nameToTypeMap.put(relationType.getNamespace() + relationType.getTypeName(), relationType);
+ idToTypeMap.put(relationType.getRelationTypeId(), relationType);
+ }
+
+ public void refreshCache() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ nameToTypeMap.clear();
+ idToTypeMap.clear();
+ populateCache();
+ }
+
+ private static synchronized void ensurePopulated() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ if (instance.idToTypeMap.isEmpty()) {
+ instance.populateCache();
+ }
+ }
+
+ private void populateCache() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(SELECT_LINK_TYPES);
+
+ while (chStmt.next()) {
+ RelationType relationType =
+ new RelationType(chStmt.getInt("rel_link_type_id"), chStmt.getString("namespace"),
+ chStmt.getString("type_name"), chStmt.getString("a_name"), chStmt.getString("b_name"),
+ chStmt.getString("ab_phrasing"), chStmt.getString("ba_phrasing"),
+ chStmt.getString("short_name"), chStmt.getString("user_ordered"));
+ cache(relationType);
+ }
+ loadLinkValidities();
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static int getRelationSideMax(RelationType relationType, ArtifactType artifactType, RelationSide relationSide) {
+ ObjectPair<Integer, Integer> pair = instance.validityMap.get(relationType, artifactType);
+ if (pair == null) {
+ return 0;
+ }
+ return relationSide == RelationSide.SIDE_A ? pair.object1 : pair.object2;
+ }
+
+ private void loadLinkValidities() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(2000, SELECT_LINK_VALIDITY);
+
+ while (chStmt.next()) {
+ try {
+ RelationType relationType = internalGetType(chStmt.getInt("rel_link_type_id"));
+ ArtifactType artifactType = ArtifactTypeManager.getType(chStmt.getInt("art_type_id"));
+ validityMap.put(relationType, artifactType, new ObjectPair<Integer, Integer>(
+ chStmt.getInt("side_a_max"), chStmt.getInt("side_b_max")));
+ } catch (OseeCoreException exception) {
+ OseeLog.log(Activator.class, Level.SEVERE, exception);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /**
+ * Persist a new relation link type. If the <code>relationTypeName</code> is already in the database, then nothing is
+ * done.
+ *
+ * @param relationTypeName The type name of the relation link to define.
+ * @param sideAName The name for the 'a' side of the relation.
+ * @param sideBName The name for the 'b' side of the relation.
+ * @param abPhrasing The phrasing appropriate from the 'a' side to the 'b' side.
+ * @param baPhrasing The phrasing appropriate from the 'b' side to the 'a' side.
+ * @param shortName An abbreviated name to display for the link type.
+ * @throws OseeCoreException
+ */
+ public static RelationType createRelationType(String namespace, String relationTypeName, String sideAName, String sideBName, String abPhrasing, String baPhrasing, String shortName, String ordered) throws OseeCoreException {
+ if (typeExists(namespace, relationTypeName)) {
+ return getType(namespace, relationTypeName);
+ }
+ if (!Strings.isValid(relationTypeName)) throw new IllegalArgumentException(
+ "The relationName can not be null or empty");
+ if (!Strings.isValid(sideAName)) throw new IllegalArgumentException("The sideAName can not be null or empty");
+ if (!Strings.isValid(sideBName)) throw new IllegalArgumentException("The sideBName can not be null or empty");
+ if (!Strings.isValid(abPhrasing)) throw new IllegalArgumentException("The abPhrasing can not be null or empty");
+ if (!Strings.isValid(baPhrasing)) throw new IllegalArgumentException("The baPhrasing can not be null or empty");
+ if (!Strings.isValid(shortName)) throw new IllegalArgumentException("The shortName can not be null or empty");
+
+ int relationTypeId = SequenceManager.getNextRelationTypeId();
+
+ ConnectionHandler.runPreparedUpdate(INSERT_RELATION_LINK_TYPE, relationTypeId, namespace, relationTypeName,
+ sideAName, sideBName, abPhrasing, baPhrasing, shortName, ordered);
+
+ RelationType relationType =
+ new RelationType(relationTypeId, namespace, relationTypeName, sideAName, sideBName, abPhrasing, baPhrasing,
+ shortName, ordered);
+ instance.cache(relationType);
+ return relationType;
+ }
+
+ /**
+ * @param branch
+ * @param artTypeId
+ * @param relLinkTypeId
+ * @param sideAMax
+ * @param sideBMax
+ * @throws OseeDataStoreException
+ * @throws OseeArgumentException
+ */
+ public static void createRelationLinkValidity(Branch branch, ArtifactType artifactType, RelationType relationType, int sideAMax, int sideBMax) throws OseeDataStoreException, OseeArgumentException {
+ if (sideAMax < 0) throw new OseeArgumentException("The sideAMax can no be negative");
+ if (sideBMax < 0) throw new OseeArgumentException("The sideBMax can no be negative");
+
+ ObjectPair<Integer, Integer> entry = instance.validityMap.get(relationType, artifactType);
+ if (entry == null) {
+ ConnectionHandler.runPreparedUpdate(INSERT_VALID_RELATION, artifactType.getArtTypeId(),
+ relationType.getRelationTypeId(), sideAMax, sideBMax, branch.getBranchId());
+ instance.validityMap.put(relationType, artifactType, new ObjectPair<Integer, Integer>(sideAMax, sideBMax));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeSide.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeSide.java
new file mode 100644
index 00000000000..cbb54624e15
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/relation/RelationTypeSide.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.framework.skynet.core.relation;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RelationTypeSide implements IRelationEnumeration {
+
+ private RelationType type;
+ private RelationSide side;
+ private Artifact artifact;
+
+ public RelationTypeSide(RelationType type, RelationSide side, Artifact artifact) {
+ this.type = type;
+ this.side = side;
+ this.artifact = artifact;
+ }
+
+ public RelationTypeSide(String typeName, String sideName, Artifact artifact) throws OseeTypeDoesNotExist, OseeDataStoreException, OseeArgumentException {
+ this.type = RelationTypeManager.getType(typeName);
+ this.side = type.isSideAName(sideName) ? RelationSide.SIDE_A : RelationSide.SIDE_B;
+ this.artifact = artifact;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getRelationType()
+ */
+ @Override
+ public RelationType getRelationType() {
+ return type;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSide()
+ */
+ @Override
+ public RelationSide getSide() {
+ return side;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSideName(org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ @Override
+ public String getSideName() {
+ return type.getSideName(side);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getTypeName()
+ */
+ @Override
+ public String getTypeName() {
+ return type.getTypeName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#isSideA()
+ */
+ @Override
+ public boolean isSideA() {
+ return side == RelationSide.SIDE_A;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#isThisType(org.eclipse.osee.framework.skynet.core.relation.RelationLink)
+ */
+ @Override
+ public boolean isThisType(RelationLink link) {
+ return link.getRelationType() == type;
+ }
+
+ /**
+ * @return the artifact
+ */
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object arg0) {
+ if (arg0 instanceof RelationTypeSide) {
+ RelationTypeSide arg = (RelationTypeSide) arg0;
+ if (artifact == null && arg.artifact == null) {
+
+ } else if (artifact == null) {
+ return false;
+ } else if (arg.artifact == null) {
+ return false;
+ }
+ return type.equals(arg.type) && side.equals(arg.side) && artifact.equals(arg.artifact);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ int hashCode = 11;
+ hashCode = hashCode * 31 + type.hashCode();
+ hashCode = hashCode * 31 + side.hashCode();
+ if (artifact != null) {
+ hashCode = hashCode * 31 + artifact.hashCode();
+ }
+ return hashCode;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactChange.java
new file mode 100644
index 00000000000..139db133599
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactChange.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.revision;
+
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * A modified artifact description. Used by the Change Report View, this supplies a way to describe an Artifact whether
+ * or not it has been deleted, and supplies appropriate images according to the modification type.
+ *
+ * @author Robert A. Fisher
+ */
+public class ArtifactChange extends RevisionChange {
+
+ private static final long serialVersionUID = 1L;
+ private TransactionId baseParentTransactionId;
+ private TransactionId headParentTransactionId;
+ private TransactionId baselineTransactionId;
+ private TransactionId fromTransactionId;
+ private TransactionId toTransactionId;
+ transient private Artifact artifact;
+ transient private Artifact conflictingModArtifact;
+ private boolean isHistorical;
+
+ @Override
+ public String toString() {
+ return " Type: " + getChangeType() + " Gamma: " + getGammaId() + " - " + getName();
+ }
+
+ /**
+ * Constructor for serialization.
+ */
+ protected ArtifactChange() {
+ this.artifact = null;
+ this.conflictingModArtifact = null;
+ }
+
+ /**
+ * @param artifact
+ * @param baselineTransactionId TODO
+ * @param fromTransactionId TODO
+ * @param toTransactionId TODO
+ * @param isHistorical TODO
+ * @param name
+ * @param descriptor
+ * @param artId
+ * @param lastGoodTransactionId TODO
+ */
+ public ArtifactChange(ChangeType changeType, ModificationType modtype, Artifact artifact, TransactionId baseParentTransactionId, TransactionId headParentTransactionId, TransactionId baselineTransactionId, TransactionId fromTransactionId, TransactionId toTransactionId, int gammaId, boolean isHistorical) {
+ super(changeType, modtype, gammaId);
+ this.artifact = artifact;
+ this.baseParentTransactionId = baseParentTransactionId;
+ this.headParentTransactionId = headParentTransactionId;
+ this.baselineTransactionId = baselineTransactionId == null ? toTransactionId : baselineTransactionId;
+ this.fromTransactionId = fromTransactionId;
+ this.toTransactionId = toTransactionId;
+ this.isHistorical = isHistorical;
+ }
+
+ /**
+ * @return the isHistorical
+ */
+ public boolean isHistorical() {
+ return isHistorical;
+ }
+
+ /**
+ * @return Returns the artifact.
+ */
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ /**
+ * @return Returns the baselineTransactionId. If the modtype is deleted, this will always be null.
+ */
+ public TransactionId getBaselineTransactionId() {
+ return baselineTransactionId;
+ }
+
+ /**
+ * @return Returns the toTransactionId. If the modtype is deleted, this will always be null.
+ */
+ public TransactionId getToTransactionId() {
+ return toTransactionId;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return artifact != null ? artifact.getInternalDescriptiveName() : "Null";
+ }
+
+ /**
+ * @return true if conflictingModArtifact is not null else false.
+ */
+ public boolean hasConflictingModArtifact() {
+ return getConflictingModArtifact() != null;
+ }
+
+ /**
+ * @return Returns the conflictingModArtifact.
+ */
+ public Artifact getConflictingModArtifact() {
+ return conflictingModArtifact;
+ }
+
+ /**
+ * @param conflictingModArtifact The conflictingModArtifact to set.
+ */
+ public void setConflictingModArtifact(Artifact conflictingModArtifact) {
+ this.conflictingModArtifact = conflictingModArtifact;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.revision.RevisionChange#getChange()
+ */
+ @Override
+ public String getChange() {
+ return "Artifact - " + getModificationType().getDisplayName();
+ }
+
+ /**
+ * @return Returns the baseParentTransactionId.
+ */
+ public TransactionId getBaseParentTransactionId() {
+ return baseParentTransactionId;
+ }
+
+ /**
+ * @return Returns the headParentTransactionId.
+ */
+ public TransactionId getHeadParentTransactionId() {
+ return headParentTransactionId;
+ }
+
+ /**
+ * @return the fromTransactionId
+ */
+ public TransactionId getFromTransactionId() {
+ return fromTransactionId;
+ }
+
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(artifact)) {
+ return artifact;
+ } else if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ArtifactChange) {
+ ArtifactChange otherArtifactChnage = (ArtifactChange) obj;
+ return getArtifact().equals(otherArtifactChnage.getArtifact());
+ } else {
+ return false;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return getArtifact().hashCode();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorCache.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorCache.java
new file mode 100644
index 00000000000..73125e6dd98
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorCache.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.framework.skynet.core.revision;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * Caches names and descriptors to an artifact id. This cache assumes that the user is already taking care of how this
+ * data is appropriate for versions and branches.
+ *
+ * @author Robert A. Fisher
+ */
+public class ArtifactNameDescriptorCache extends ArtifactNameDescriptorResolver {
+ private Map<Integer, String> nameMap;
+ private Map<Integer, ArtifactType> descriptorMap;
+ private boolean backupAvailable;
+
+ public ArtifactNameDescriptorCache() {
+ this(null);
+ }
+
+ public ArtifactNameDescriptorCache(Branch branch) {
+ super(branch);
+
+ this.nameMap = new HashMap<Integer, String>();
+ this.descriptorMap = new HashMap<Integer, ArtifactType>();
+ // this.backupAvailable = branch != null;
+ this.backupAvailable = false;
+ }
+
+ public void cache(Integer artId, String name, ArtifactType descriptor) {
+ if (artId == null) throw new IllegalArgumentException("artId must not be null");
+
+ nameMap.put(artId, name);
+ descriptorMap.put(artId, descriptor);
+ }
+
+ @Override
+ public Pair<String, ArtifactType> get(Integer artId) {
+ if (artId == null) throw new IllegalArgumentException("artId must not be null");
+
+ if (nameMap.containsKey(artId) || !backupAvailable) {
+ return new Pair<String, ArtifactType>(nameMap.get(artId), descriptorMap.get(artId));
+ } else {
+ return super.get(artId);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorResolver.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorResolver.java
new file mode 100644
index 00000000000..0c0e75c34b4
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ArtifactNameDescriptorResolver.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.framework.skynet.core.revision;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ArtifactNameDescriptorResolver implements IArtifactNameDescriptorResolver {
+ private final Branch branch;
+
+ /**
+ * @param branch
+ */
+ public ArtifactNameDescriptorResolver(Branch branch) {
+ super();
+ this.branch = branch;
+ }
+
+ public Pair<String, ArtifactType> get(Integer artId) {
+ Artifact artifact = null;
+ try {
+ artifact = ArtifactQuery.getArtifactFromId(artId, branch);
+ } catch (OseeCoreException ex) {
+ return new Pair<String, ArtifactType>("", null);
+ }
+ return new Pair<String, ArtifactType>(artifact.getDescriptiveName(), artifact.getArtifactType());
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/AttributeChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/AttributeChange.java
new file mode 100644
index 00000000000..ea92ff37627
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/AttributeChange.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.framework.skynet.core.revision;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import java.io.InputStream;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class AttributeChange extends RevisionChange implements IAttributeChange {
+ private static final long serialVersionUID = -8403712077455896863L;
+
+ private int attrId;
+ private String name;
+ private String isValue;
+ private String wasValue;
+
+ @SuppressWarnings("unused")
+ transient private InputStream isContent;
+ @SuppressWarnings("unused")
+ transient private InputStream wasContent;
+
+ /**
+ * Constructor for serialization.
+ */
+ protected AttributeChange() {
+
+ }
+
+ /**
+ * Constructor for making new and modified attribute changes.
+ *
+ * @param modType
+ * @param gammaId
+ */
+ public AttributeChange(ChangeType changeType, ModificationType modType, int attrId, long gammaId, String name, String isValue, InputStream isContent, String wasValue, InputStream wasContent) {
+ super(changeType, modType, gammaId);
+ this.attrId = attrId;
+ this.name = name;
+ this.isValue = isValue;
+ this.isContent = isContent;
+ this.wasValue = wasValue;
+ this.wasContent = wasContent;
+ }
+
+ /**
+ * Constructor for making deleted attribute changes.
+ *
+ * @param gammaId
+ */
+ public AttributeChange(ChangeType changeType, int attrId, long gammaId, String name, String wasValue) {
+ super(changeType, DELETED, gammaId);
+ this.attrId = attrId;
+ this.name = name;
+ this.isValue = null;
+ this.wasValue = wasValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.IAttributeChange#getChange()
+ */
+ @Override
+ public String getChange() {
+ if (getModificationType() == DELETED)
+ return "<deleted>";
+ else
+ return isValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.IAttributeChange#getWasValue()
+ */
+ public String getWasValue() {
+ return wasValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.IAttributeChange#getName()
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the attrId.
+ */
+ public int getAttrId() {
+ return attrId;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeData.java
new file mode 100644
index 00000000000..8698e4fd419
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeData.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.revision;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.change.ArtifactChanged;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.change.RelationChanged;
+
+/**
+ * Collection of changes from working branch or transactionId from committed branch.
+ *
+ * @author Donald G. Dunne
+ */
+public class ChangeData {
+
+ Collection<Change> changes;
+
+ /**
+ * @return the changes
+ */
+ public Collection<Change> getChanges() {
+ return changes;
+ }
+
+ public static enum KindType {
+ Artifact, Relation, ArtifactOrRelation, RelationOnly
+ };
+ public boolean artifactsBulkLoaded = false;
+
+ public ChangeData(Collection<Change> changes) {
+ this.changes = changes;
+ }
+
+ public Collection<Change> getChangesByName(String name) throws OseeCoreException {
+ try {
+ List<Change> matches = new ArrayList<Change>();
+ for (Change change : changes) {
+ if (change.getArtifactName().equals(name)) {
+ matches.add(change);
+ }
+ }
+ return matches;
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ public Collection<Artifact> getArtifactsByName(String name) throws OseeCoreException {
+ try {
+ List<Artifact> matches = new ArrayList<Artifact>();
+ for (Change change : changes) {
+ if (change.getArtifactName().equals(name)) {
+ matches.add(change.getArtifact());
+ }
+ }
+ return matches;
+ } catch (Exception ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /**
+ * Return artifacts of kind and modType.
+ *
+ * @param kindType
+ * @param modificationType
+ * @return artifacts
+ * @throws OseeCoreException
+ */
+ public Collection<Artifact> getArtifacts(KindType kindType, ModificationType... modificationType) throws OseeCoreException {
+ if (!artifactsBulkLoaded) {
+ artifactsBulkLoaded = true;
+ }
+ if (kindType == KindType.RelationOnly) {
+ return getArtifactsRelationOnly(modificationType);
+ }
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ Collection<ModificationType> modTypes = Collections.getAggregate(modificationType);
+ if (modTypes.size() == 0) {
+ throw new OseeCoreException("ModificationType must be specified");
+ }
+ if (kindType == KindType.Artifact || kindType == KindType.ArtifactOrRelation || kindType == KindType.Relation) {
+ if (changes != null) {
+ for (Change change : changes) {
+ if ((kindType == KindType.Artifact || kindType == KindType.ArtifactOrRelation) && (change instanceof ArtifactChanged)) {
+ if (modTypes.contains(change.getModificationType())) {
+ artifacts.add(change.getArtifact());
+ }
+ }
+ //
+ else if ((kindType == KindType.Relation || kindType == KindType.ArtifactOrRelation) && (change instanceof RelationChanged)) {
+ if (modTypes.contains(change.getModificationType())) {
+ artifacts.add(((RelationChanged) change).getArtifact());
+ artifacts.add(((RelationChanged) change).getBArtifact());
+ }
+ }
+ }
+ }
+ }
+ return artifacts;
+ }
+
+ private Collection<Artifact> getArtifactsRelationOnly(ModificationType... modificationType) throws OseeCoreException {
+ Collection<Artifact> artMod = getArtifacts(KindType.Artifact, modificationType);
+ Collection<Artifact> relMod = getArtifacts(KindType.Relation, modificationType);
+ return Collections.setComplement(relMod, artMod);
+ }
+
+ @Override
+ public String toString() {
+ try {
+ StringBuffer sb = new StringBuffer();
+ for (KindType kindType : KindType.values()) {
+ for (ModificationType modificationType : ModificationType.values()) {
+ sb.append("Kind: " + kindType + " ModType: " + modificationType.getDisplayName() + " Num: " + getArtifacts(
+ kindType, modificationType).size() + "\n");
+ }
+ }
+ return sb.toString();
+ } catch (OseeCoreException ex) {
+ return ex.getLocalizedMessage();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeManager.java
new file mode 100644
index 00000000000..bb17e7dbfe8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ChangeManager.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.framework.skynet.core.revision;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.status.IStatusMonitor;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * Public API class for access to change data from branches and transactionIds
+ *
+ * @author Jeff C. Phillips
+ * @author Donald G. Dunne
+ */
+public class ChangeManager {
+
+ /**
+ * Acquires artifact, relation and attribute changes from a source branch since its creation.
+ *
+ * @param sourceBranch
+ * @param baselineTransactionId
+ * @return changes
+ * @throws OseeCoreException
+ */
+ public static Collection<Change> getChangesPerTransaction(TransactionId transactionId, IStatusMonitor monitor) throws OseeCoreException {
+ return InternalChangeManager.getInstance().getChanges(null, transactionId,
+ monitor == null ? new EmptyMonitor() : monitor);
+ }
+
+ public static ChangeData getChangeDataPerTransaction(TransactionId transactionId, IStatusMonitor monitor) throws OseeCoreException {
+ return new ChangeData(InternalChangeManager.getInstance().getChanges(null, transactionId,
+ monitor == null ? new EmptyMonitor() : monitor));
+ }
+
+ /**
+ * Acquires artifact, relation and attribute changes from a source branch since its creation.
+ *
+ * @param sourceBranch
+ * @param baselineTransactionId
+ * @return changes
+ * @throws OseeCoreException
+ */
+ public static Collection<Change> getChangesPerBranch(Branch sourceBranch, IStatusMonitor monitor) throws OseeCoreException {
+ return InternalChangeManager.getInstance().getChanges(sourceBranch, null,
+ monitor == null ? new EmptyMonitor() : monitor);
+ }
+
+ public static ChangeData getChangeDataPerBranch(Branch sourceBranch, IStatusMonitor monitor) throws OseeCoreException {
+ return new ChangeData(InternalChangeManager.getInstance().getChanges(sourceBranch, null,
+ monitor == null ? new EmptyMonitor() : monitor));
+ }
+
+ /**
+ * Acquires artifact, relation and attribute changes from a source branch since its creation.
+ *
+ * @param sourceBranch
+ * @param baselineTransactionId
+ * @return changes
+ * @throws OseeCoreException
+ */
+ public static Collection<Change> getChanges(Branch sourceBranch, TransactionId transactionId, IStatusMonitor monitor) throws OseeCoreException {
+ return InternalChangeManager.getInstance().getChanges(sourceBranch, transactionId,
+ monitor == null ? new EmptyMonitor() : monitor);
+ }
+
+ public static ChangeData getChangeData(Branch sourceBranch, TransactionId transactionId, IStatusMonitor monitor) throws OseeCoreException {
+ return new ChangeData(getChanges(sourceBranch, transactionId, monitor == null ? new EmptyMonitor() : monitor));
+ }
+
+ /**
+ * @return true changes exist
+ * @throws OseeCoreException
+ */
+ public static boolean isChangesOnWorkingBranch(Branch workingBranch) throws OseeCoreException {
+ return InternalChangeManager.getInstance().isChangesOnWorkingBranch(workingBranch);
+ }
+
+ /**
+ * For the given list of artifacts determine which transactions (on that artifact's branch) affected that artifact.
+ * The branch's baseline transaction is excluded.
+ *
+ * @param artifacts
+ * @return a map of artifact to collection of TransactionIds which affected the given artifact
+ * @throws OseeCoreException
+ */
+ public static HashCollection<Artifact, TransactionId> getModifingTransactions(Collection<Artifact> artifacts) throws OseeCoreException {
+ List<Object[]> insertParameters = new ArrayList<Object[]>(artifacts.size() * 5);
+
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ CompositeKeyHashMap<Integer, Branch, Artifact> artifactMap = new CompositeKeyHashMap<Integer, Branch, Artifact>();
+ for (Artifact artifact : artifacts) {
+ Branch branch = artifact.getBranch();
+ artifactMap.put(artifact.getArtId(), branch, artifact);
+ int transactionNumber = TransactionIdManager.getlatestTransactionForBranch(branch).getTransactionNumber();
+ insertParameters.add(new Object[] {queryId, insertTime, artifact.getArtId(), branch.getBranchId(),
+ transactionNumber});
+
+ // for each combination of artifact and its branch hierarchy
+ while (branch.hasParentBranch()) {
+ transactionNumber = branch.getParentTransactionId().getTransactionNumber();
+ branch = branch.getParentBranch();
+ insertParameters.add(new Object[] {queryId, insertTime, artifact.getArtId(), branch.getBranchId(),
+ transactionNumber});
+ }
+ }
+
+ HashCollection<Artifact, TransactionId> transactionMap = new HashCollection<Artifact, TransactionId>();
+ try {
+ ArtifactLoader.insertIntoArtifactJoin(insertParameters);
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(insertParameters.size() * 2,
+ ClientSessionManager.getSQL(OseeSql.Changes.SELECT_MODIFYING_TRANSACTION), queryId);
+ while (chStmt.next()) {
+ Branch branch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+ Artifact artifact = artifactMap.get(chStmt.getInt("art_id"), branch);
+ transactionMap.put(artifact, TransactionIdManager.getTransactionId(chStmt.getInt("transaction_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ } finally {
+ ArtifactLoader.clearQuery(queryId);
+ }
+
+ return transactionMap;
+ }
+
+ /**
+ * For the given list of artifacts determine which branches (in the branch hierarchy for that artifact) affected that
+ * artifact.
+ *
+ * @param artifacts
+ * @return a map of artifact to collection of branches which affected the given artifact
+ * @throws OseeCoreException
+ */
+ public static HashCollection<Artifact, Branch> getModifingBranches(Collection<Artifact> artifacts) throws OseeCoreException {
+ List<Object[]> insertParameters = new ArrayList<Object[]>(artifacts.size() * 5);
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ CompositeKeyHashMap<Integer, Branch, Artifact> artifactMap = new CompositeKeyHashMap<Integer, Branch, Artifact>();
+ for (Artifact artifact : artifacts) {
+ artifactMap.put(artifact.getArtId(), artifact.getBranch(), artifact);
+ // for each combination of artifact and all working branches in its hierarchy
+ for (Branch workingBranch : artifact.getBranch().getWorkingBranches()) {
+ insertParameters.add(new Object[] {queryId, insertTime, artifact.getArtId(), workingBranch.getBranchId(),
+ SQL3DataType.INTEGER});
+ }
+ }
+
+ HashCollection<Artifact, Branch> branchMap = new HashCollection<Artifact, Branch>();
+ try {
+ ArtifactLoader.insertIntoArtifactJoin(insertParameters);
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(insertParameters.size() * 2,
+ ClientSessionManager.getSQL(OseeSql.Changes.SELECT_MODIFYING_BRANCHES), queryId);
+ while (chStmt.next()) {
+ if (chStmt.getInt("tx_count") > 0) {
+ Branch branch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+ Artifact artifact = artifactMap.get(chStmt.getInt("art_id"), branch.getParentBranch());
+ branchMap.put(artifact, branch);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ } finally {
+ ArtifactLoader.clearQuery(queryId);
+ }
+
+ return branchMap;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ConflictManagerInternal.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ConflictManagerInternal.java
new file mode 100644
index 00000000000..da7c3f241e2
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/ConflictManagerInternal.java
@@ -0,0 +1,490 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.revision;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.ConflictStatus;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.BranchMergeException;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.conflict.ArtifactConflictBuilder;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflictBuilder;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictBuilder;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.status.IStatusMonitor;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Theron Virgin
+ * @author Jeff C. Phillips
+ */
+public class ConflictManagerInternal {
+ private static final String CONFLICT_CLEANUP =
+ "DELETE FROM osee_conflict WHERE merge_branch_id = ? AND conflict_id NOT IN ";
+
+ private static final String GET_DESTINATION_BRANCHES =
+ "SELECT dest_branch_id FROM osee_merge WHERE source_branch_id = ?";
+
+ private static final String GET_MERGE_DATA =
+ "SELECT commit_transaction_id, merge_branch_id FROM osee_merge WHERE source_branch_id = ? AND dest_branch_id = ?";
+
+ private static final String GET_COMMIT_TRANSACTION_COMMENT =
+ "SELECT transaction_id FROM osee_tx_details WHERE osee_comment = ? AND branch_id = ?";
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Merge"));
+
+ private ConflictManagerInternal() {
+ }
+
+ public static List<Conflict> getConflictsPerBranch(TransactionId commitTransaction, IStatusMonitor monitor) throws OseeCoreException {
+ long time = System.currentTimeMillis();
+ long totalTime = time;
+ if (monitor == null) {
+ monitor = new EmptyMonitor();
+ }
+ monitor.startJob(String.format("Loading Merge Manager for Transaction %d",
+ commitTransaction.getTransactionNumber()), 100);
+ monitor.setSubtaskName("Finding Database stored conflicts");
+ if (DEBUG) {
+ System.out.println(String.format("\nDiscovering Conflicts based on Transaction ID: %d",
+ commitTransaction.getTransactionNumber()));
+ totalTime = System.currentTimeMillis();
+ }
+ ArrayList<Conflict> conflicts = new ArrayList<Conflict>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ if (DEBUG) {
+ System.out.println("Running Query to find conflicts stored in the DataBase");
+ time = System.currentTimeMillis();
+ }
+ try {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Conflicts.SELECT_HISTORIC_ATTRIBUTE_CONFLICTS),
+ commitTransaction.getTransactionNumber());
+ if (DEBUG) {
+ System.out.println(String.format(" Query finished in %s", Lib.getElapseString(time)));
+ }
+ while (chStmt.next()) {
+ AttributeConflict attributeConflict =
+ new AttributeConflict(chStmt.getInt("source_gamma_id"), chStmt.getInt("dest_gamma_id"),
+ chStmt.getInt("art_id"), commitTransaction, chStmt.getString("source_value"),
+ chStmt.getInt("attr_id"), chStmt.getInt("attr_type_id"),
+ BranchManager.getBranch(chStmt.getInt("merge_branch_id")),
+ BranchManager.getBranch(chStmt.getInt("dest_branch_id")));
+ conflicts.add(attributeConflict);
+
+ attributeConflict.setStatus(ConflictStatus.getStatus(chStmt.getInt("status")));
+ }
+ monitor.done();
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ debugDump(conflicts, totalTime);
+ }
+ return conflicts;
+ }
+
+ public static List<Conflict> getConflictsPerBranch(Branch sourceBranch, Branch destinationBranch, TransactionId baselineTransaction, IStatusMonitor monitor) throws OseeCoreException {
+ ArrayList<ConflictBuilder> conflictBuilders = new ArrayList<ConflictBuilder>();
+ ArrayList<Conflict> conflicts = new ArrayList<Conflict>();
+ Set<Integer> artIdSet = new HashSet<Integer>();
+ Set<Integer> artIdSetDontShow = new HashSet<Integer>();
+ Set<Integer> artIdSetDontAdd = new HashSet<Integer>();
+
+ //Check to see if the branch has already been committed than use the transaction version
+ if (monitor == null) {
+ monitor = new EmptyMonitor();
+ }
+ int commitTransactionId = getCommitTransaction(sourceBranch, destinationBranch);
+ if (commitTransactionId != 0) {
+ try {
+ return getConflictsPerBranch(TransactionIdManager.getTransactionId(commitTransactionId), monitor);
+ } catch (TransactionDoesNotExist ex) {
+ }
+ }
+ long totalTime = 0;
+ if (sourceBranch != null && destinationBranch != null) {
+ monitor.startJob(String.format("Loading Merge Manager for Branch %d into Branch %d",
+ sourceBranch.getBranchId(), destinationBranch.getBranchId()), 100);
+ monitor.setSubtaskName("Finding Database stored conflicts");
+
+ if (DEBUG) {
+ System.out.println(String.format(
+ "\nDiscovering Conflicts based on Source Branch: %d Destination Branch: %d",
+ sourceBranch.getBranchId(), destinationBranch.getBranchId()));
+ totalTime = System.currentTimeMillis();
+ }
+ }
+ if (sourceBranch == null || destinationBranch == null) {
+ throw new OseeArgumentException(String.format("Source Branch = %s Destination Branch = %s",
+ sourceBranch == null ? "NULL" : sourceBranch.getBranchId(),
+ destinationBranch == null ? "NULL" : destinationBranch.getBranchId()));
+ }
+
+ if (!sourceBranch.isCommitted() && !sourceBranch.isRebaselined() && !sourceBranch.isRebaselineInProgress()) {
+ BranchManager.setBranchState(sourceBranch, BranchState.COMMIT_IN_PROGRESS);
+ }
+
+ int transactionId = findCommonTransaction(sourceBranch, destinationBranch);
+ loadArtifactVersionConflictsNew(sourceBranch, destinationBranch, baselineTransaction, conflictBuilders, artIdSet,
+ artIdSetDontShow, artIdSetDontAdd, monitor, transactionId);
+ loadAttributeConflictsNew(sourceBranch, destinationBranch, baselineTransaction, conflictBuilders, artIdSet,
+ monitor, transactionId);
+ for (Integer integer : artIdSetDontAdd) {
+ artIdSet.remove(integer);
+ }
+ if (artIdSet.isEmpty()) {
+ return conflicts;
+ }
+
+ if (DEBUG) {
+ System.out.println(String.format(" Conflicts found in %s", Lib.getElapseString(totalTime)));
+ }
+ monitor.setSubtaskName("Creating and/or maintaining the Merge Branch");
+ Branch mergeBranch =
+ BranchManager.getOrCreateMergeBranch(sourceBranch, destinationBranch, new ArrayList<Integer>(artIdSet));
+
+ if (mergeBranch == null) {
+ throw new BranchMergeException("Could not create the Merge Branch.");
+ }
+ monitor.updateWork(15);
+
+ preloadConflictArtifacts(sourceBranch, destinationBranch, mergeBranch, artIdSet, monitor);
+
+ long time = System.currentTimeMillis();
+ //Don't create the conflicts for attributes on an artifact that is deleted etc.
+ for (ConflictBuilder conflictBuilder : conflictBuilders) {
+ Conflict conflict = conflictBuilder.getConflict(mergeBranch, artIdSetDontShow);
+ if (conflict != null) {
+ conflicts.add(conflict);
+ conflict.computeStatus();
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Creating conflict objects and setting theri status completed in %s",
+ Lib.getElapseString(time)));
+ }
+ cleanUpConflictDB(conflicts, mergeBranch.getBranchId(), monitor);
+ if (DEBUG) {
+ debugDump(conflicts, totalTime);
+ }
+ return conflicts;
+ }
+
+ private static void preloadConflictArtifacts(Branch sourceBranch, Branch destinationBranch, Branch mergeBranch, Collection<Integer> artIdSet, IStatusMonitor monitor) throws OseeCoreException {
+ long time = 0;
+
+ monitor.setSubtaskName("Preloading Artifacts Associated with the Conflicts");
+ if (DEBUG) {
+ System.out.println("Prelodaing Conflict Artifacts");
+ time = System.currentTimeMillis();
+ }
+ if (artIdSet != null && !artIdSet.isEmpty()) {
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (int artId : artIdSet) {
+ insertParameters.add(new Object[] {queryId, insertTime, artId, sourceBranch.getBranchId(),
+ SQL3DataType.INTEGER});
+ insertParameters.add(new Object[] {queryId, insertTime, artId, destinationBranch.getBranchId(),
+ SQL3DataType.INTEGER});
+ insertParameters.add(new Object[] {queryId, insertTime, artId, mergeBranch.getBranchId(),
+ SQL3DataType.INTEGER});
+ }
+ ArtifactLoader.loadArtifacts(queryId, ArtifactLoad.FULL, null, insertParameters, true, false, true);
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Preloading took %s", Lib.getElapseString(time)));
+ }
+ monitor.updateWork(25);
+ }
+
+ /**
+ * @param sourceBranch
+ * @param destinationBranch
+ * @param baselineTransaction
+ * @param conflictBuilders
+ * @param artIdSet
+ * @throws OseeCoreException
+ */
+
+ private static void loadArtifactVersionConflictsNew(Branch sourceBranch, Branch destinationBranch, TransactionId baselineTransaction, ArrayList<ConflictBuilder> conflictBuilders, Set<Integer> artIdSet, Set<Integer> artIdSetDontShow, Set<Integer> artIdSetDontAdd, IStatusMonitor monitor, int transactionId) throws OseeCoreException {
+ long time = 0;
+ if (DEBUG) {
+ System.out.println("Finding Artifact Version Conflicts");
+ System.out.println(" Running the Artifact Conflict Query");
+ time = System.currentTimeMillis();
+ }
+ monitor.setSubtaskName("Finding Artifact Version Conflicts");
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Conflicts.SELECT_ARTIFACT_CONFLICTS),
+ sourceBranch.getBranchId(), destinationBranch.getBranchId(), transactionId);
+
+ if (!chStmt.next()) {
+ return;
+ }
+ ArtifactConflictBuilder artifactConflictBuilder;
+ int artId = 0;
+
+ do {
+ int nextArtId = chStmt.getInt("art_id");
+ int sourceGamma = chStmt.getInt("source_gamma");
+ int destGamma = chStmt.getInt("dest_gamma");
+ int sourceModType = chStmt.getInt("source_mod_type");
+ int destModType = chStmt.getInt("dest_mod_type");
+ int artTypeId = chStmt.getInt("art_type_id");
+
+ if (artId != nextArtId) {
+ artId = nextArtId;
+
+ if (destModType == ModificationType.DELETED.getValue() && sourceModType == ModificationType.MODIFIED.getValue() || destModType == ModificationType.MODIFIED.getValue() && sourceModType == ModificationType.DELETED.getValue()) {
+
+ artifactConflictBuilder =
+ new ArtifactConflictBuilder(sourceGamma, destGamma, artId, baselineTransaction, sourceBranch,
+ destinationBranch, sourceModType, destModType, artTypeId);
+
+ conflictBuilders.add(artifactConflictBuilder);
+ artIdSet.add(artId);
+ } else if (destModType == ModificationType.DELETED.getValue() && sourceModType == ModificationType.DELETED.getValue()) {
+ artIdSetDontShow.add(artId);
+ artIdSetDontAdd.add(artId);
+ }
+ }
+ } while (chStmt.next());
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Query completed in %s ", Lib.getElapseString(time)));
+ }
+ monitor.updateWork(20);
+ for (Integer integer : artIdSet) {
+ artIdSetDontShow.add(integer);
+ }
+ }
+
+ /**
+ * @param sourceBranch
+ * @param destinationBranch
+ * @param baselineTransaction
+ * @param conflicts
+ * @throws OseeCoreException
+ */
+ private static void loadAttributeConflictsNew(Branch sourceBranch, Branch destinationBranch, TransactionId baselineTransaction, ArrayList<ConflictBuilder> conflictBuilders, Set<Integer> artIdSet, IStatusMonitor monitor, int transactionId) throws OseeCoreException {
+ long time = 0;
+ if (DEBUG) {
+ System.out.println("Finding Attribute Version Conflicts");
+ System.out.println(" Running the Attribute Conflict Query");
+ time = System.currentTimeMillis();
+ }
+ monitor.setSubtaskName("Finding the Attribute Conflicts");
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ AttributeConflictBuilder attributeConflictBuilder;
+ try {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Conflicts.SELECT_ATTRIBUTE_CONFLICTS),
+ sourceBranch.getBranchId(), destinationBranch.getBranchId(), transactionId);
+
+ int attrId = 0;
+
+ if (chStmt.next()) {
+
+ do {
+ int nextAttrId = chStmt.getInt("attr_id");
+ int artId = chStmt.getInt("art_id");
+ int sourceGamma = chStmt.getInt("source_gamma");
+ int destGamma = chStmt.getInt("dest_gamma");
+ int attrTypeId = chStmt.getInt("attr_type_id");
+ String sourceValue =
+ chStmt.getString("source_value") != null ? chStmt.getString("source_value") : chStmt.getString("dest_value");
+
+ if (attrId != nextAttrId) {
+ attrId = nextAttrId;
+ attributeConflictBuilder =
+ new AttributeConflictBuilder(sourceGamma, destGamma, artId, baselineTransaction, sourceBranch,
+ destinationBranch, sourceValue, attrId, attrTypeId);
+
+ conflictBuilders.add(attributeConflictBuilder);
+ artIdSet.add(artId);
+ }
+ } while (chStmt.next());
+ }
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Query completed in %s ", Lib.getElapseString(time)));
+ }
+ monitor.updateWork(30);
+ }
+
+ private static void debugDump(Collection<Conflict> conflicts, long time) throws OseeCoreException {
+ int displayCount = 1;
+ System.out.println(String.format("Found %d conflicts in %s", conflicts.size(), Lib.getElapseString(time)));
+ for (Conflict conflict : conflicts) {
+ System.out.println(String.format(
+ " %d. ArtId = %d, ChangeItem = %s, SourceGamma = %d, DestGamma = %d, Status = %s", displayCount++,
+ conflict.getArtId(), conflict.getChangeItem(), conflict.getSourceGamma(), conflict.getDestGamma(),
+ conflict.getStatus()));
+ }
+ }
+
+ private static void cleanUpConflictDB(Collection<Conflict> conflicts, int branchId, IStatusMonitor monitor) throws OseeCoreException {
+ int count = 0;
+ long time = System.currentTimeMillis();
+ monitor.setSubtaskName("Cleaning up old conflict data");
+ if (conflicts != null && conflicts.size() != 0 && branchId != 0) {
+ count = ConnectionHandler.runPreparedUpdate(CONFLICT_CLEANUP + createData(conflicts), branchId);
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Cleaned up %d conflicts that are no longer conflicting in %s ", count,
+ Lib.getElapseString(time)));
+ }
+ monitor.updateWork(10);
+ }
+
+ private static String createData(Collection<Conflict> conflicts) throws OseeCoreException {
+ StringBuilder builder = new StringBuilder();
+ builder.append("(");
+ boolean first = true;
+ for (Conflict conflict : conflicts) {
+ if (!first) {
+ builder.append(" , ");
+ } else {
+ first = false;
+ }
+ builder.append(conflict.getObjectId());
+ }
+ builder.append(")");
+ return builder.toString();
+ }
+
+ public static Collection<Integer> getDestinationBranchesMerged(int sourceBranchId) throws OseeCoreException {
+ List<Integer> destinationBranches = new LinkedList<Integer>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_DESTINATION_BRANCHES, sourceBranchId);
+ while (chStmt.next()) {
+ destinationBranches.add(chStmt.getInt("dest_branch_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ Collections.sort(destinationBranches);
+ return destinationBranches;
+ }
+
+ public static int getCommitTransaction(Branch sourceBranch, Branch destBranch) throws OseeCoreException {
+ int transactionId = 0;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ if (sourceBranch != null && destBranch != null) {
+ chStmt.runPreparedQuery(GET_MERGE_DATA, sourceBranch.getBranchId(), destBranch.getBranchId());
+ if (chStmt.next()) {
+ transactionId = chStmt.getInt("commit_transaction_id");
+ }
+ if (transactionId == 0) {
+ chStmt.runPreparedQuery(GET_COMMIT_TRANSACTION_COMMENT,
+ BranchManager.COMMIT_COMMENT + sourceBranch.getBranchName(), destBranch.getBranchId());
+ if (chStmt.next()) {
+ transactionId = chStmt.getInt("transaction_id");
+ }
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ return transactionId;
+ }
+
+ public static int getMergeBranchId(int sourceBranchId, int destBranchId) throws OseeCoreException {
+ int mergeBranchId = 0;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_MERGE_DATA, sourceBranchId, destBranchId);
+ if (chStmt.next()) {
+ mergeBranchId = chStmt.getInt("merge_branch_id");
+ }
+ } finally {
+ chStmt.close();
+ }
+ return mergeBranchId;
+ }
+
+ /**
+ * The purpose of this function is find the transaction (Branch Create) that holds the last common values for two
+ * branches that share a common history. If two branches share the same history than the point at which they diverged
+ * should provide the reference for detecting conflicts based on the gamma at that point.
+ */
+ public static int findCommonTransaction(Branch sourceBranch, Branch destBranch) throws OseeCoreException {
+ List<Branch> sourceBranches = sourceBranch.getBranchHierarchy();
+ List<Branch> destBranches = destBranch.getBranchHierarchy();
+ Branch commonBranch = null;
+ for (Branch branch : sourceBranches) {
+ if (destBranches.contains(branch)) {
+ commonBranch = branch;
+ break;
+ }
+ }
+ if (commonBranch == null) {
+ throw new OseeCoreException(String.format("Can not find a common ancestor for Branch %s and Branch %s",
+ sourceBranch.getBranchShortName(), destBranch.getBranchShortName()));
+ }
+ int sourceTransaction = 0;
+ int destTransaction = 0;
+ if (commonBranch.equals(destBranch)) {
+ destTransaction = Integer.MAX_VALUE;
+ } else {
+ for (Branch branch : destBranches) {
+ if (branch.getParentBranch().equals(commonBranch)) {
+ destTransaction = TransactionIdManager.getStartEndPoint(branch).getKey().getTransactionNumber();
+ break;
+ }
+
+ }
+ }
+ for (Branch branch : sourceBranches) {
+ if (branch.getParentBranch().equals(commonBranch)) {
+ sourceTransaction = TransactionIdManager.getStartEndPoint(branch).getKey().getTransactionNumber();
+ break;
+ }
+ }
+ return sourceTransaction <= destTransaction ? sourceTransaction : destTransaction;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/HistoryTransactionItem.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/HistoryTransactionItem.java
new file mode 100644
index 00000000000..74ab84a33ac
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/HistoryTransactionItem.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.framework.skynet.core.revision;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class HistoryTransactionItem implements IAdaptable {
+ /**
+ * @return the transactionData
+ */
+ public TransactionData getTransactionData() {
+ return transactionData;
+ }
+
+ private TransactionData transactionData;
+ private RevisionChange revisionChange;
+
+ /**
+ * @return the revisionChange
+ */
+ public RevisionChange getRevisionChange() {
+ return revisionChange;
+ }
+
+ public HistoryTransactionItem(TransactionData transactionData, RevisionChange revisionChange) {
+ super();
+ this.transactionData = transactionData;
+ this.revisionChange = revisionChange;
+ }
+
+ public int getTransactionNumber() {
+ return transactionData.getTransactionNumber();
+ }
+
+ public long getGamma() {
+ return revisionChange.getGammaId();
+ }
+
+ public String getChangeType() {
+ String returnValue = "";
+ if (revisionChange instanceof IAttributeChange) {
+ returnValue = ((IAttributeChange) revisionChange).getName();
+ } else if (revisionChange instanceof RelationLinkChange) {
+ returnValue = ((RelationLinkChange) revisionChange).getRelTypeName();
+ } else if (revisionChange instanceof ArtifactChange) {
+ returnValue = ((ArtifactChange) revisionChange).getChange();
+ }
+
+ return returnValue;
+ }
+
+ public String getIsValue() {
+ String returnValue = "";
+ if (revisionChange instanceof IAttributeChange) {
+ returnValue = ((IAttributeChange) revisionChange).getChange();
+ } else if (revisionChange instanceof RelationLinkChange) {
+ returnValue = ((RelationLinkChange) revisionChange).getOtherArtifactName();
+ }
+
+ return returnValue;
+ }
+
+ public String getWasValue() {
+ String returnValue = "";
+ if (revisionChange instanceof IAttributeChange) {
+ returnValue = ((IAttributeChange) revisionChange).getWasValue();
+ }
+
+ return returnValue;
+ }
+
+ public String getAuthorName() {
+ return transactionData.getName();
+ }
+
+ public String getTimeStamp() {
+ return String.valueOf(transactionData.getTimeStamp());
+ }
+
+ public String getComment() {
+ return transactionData.getComment();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ return transactionData.getAdapter(adapter);
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IArtifactNameDescriptorResolver.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IArtifactNameDescriptorResolver.java
new file mode 100644
index 00000000000..1f03aecae71
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IArtifactNameDescriptorResolver.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.framework.skynet.core.revision;
+
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IArtifactNameDescriptorResolver {
+
+ public Pair<String, ArtifactType> get(Integer artId);
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IAttributeChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IAttributeChange.java
new file mode 100644
index 00000000000..bda530b9013
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IAttributeChange.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.framework.skynet.core.revision;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IAttributeChange extends IRevisionChange {
+
+ /**
+ * @return Returns the change.
+ */
+ public String getChange();
+
+ /**
+ * @return Returns the wasValue.
+ */
+ public String getWasValue();
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRelationLinkChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRelationLinkChange.java
new file mode 100644
index 00000000000..2e4c24b279b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRelationLinkChange.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.framework.skynet.core.revision;
+
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IRelationLinkChange extends IRevisionChange {
+
+ /**
+ * @return Returns the otherArtifactDescriptor.
+ */
+ public ArtifactType getOtherArtifactType();
+
+ /**
+ * @return Returns the otherArtifactName.
+ */
+ public String getOtherArtifactName();
+
+ /**
+ * @return Returns the rationale.
+ */
+ public String getRationale();
+
+ /**
+ * @return Returns the relTypeName.
+ */
+ public String getRelTypeName();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRevisionChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRevisionChange.java
new file mode 100644
index 00000000000..1d60b4a1b16
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/IRevisionChange.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.framework.skynet.core.revision;
+
+import java.io.Serializable;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IRevisionChange extends Serializable {
+
+ /**
+ * This value could be -1 if called from ArtifactChange object where there was no gammaId.
+ */
+ public long getGammaId();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalChangeManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalChangeManager.java
new file mode 100644
index 00000000000..f7f3e24c912
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalChangeManager.java
@@ -0,0 +1,442 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.revision;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.change.ArtifactChanged;
+import org.eclipse.osee.framework.skynet.core.change.AttributeChanged;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+import org.eclipse.osee.framework.skynet.core.change.RelationChanged;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.status.IStatusMonitor;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * Acquires changes for either branches or transactions.
+ *
+ * @author Jeff C. Phillips
+ */
+public class InternalChangeManager {
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.skynet.core/debug/Change"));
+
+ private static InternalChangeManager instance = new InternalChangeManager();
+
+ private InternalChangeManager() {
+ super();
+ }
+
+ public static InternalChangeManager getInstance() {
+ return instance;
+ }
+
+ /**
+ * Acquires artifact, relation and attribute changes from a source branch since its creation.
+ *
+ * @param sourceBranch
+ * @param baselineTransactionId
+ * @return
+ * @throws OseeCoreException
+ */
+ protected Collection<Change> getChanges(Branch sourceBranch, TransactionId transactionId, IStatusMonitor monitor) throws OseeCoreException {
+ ArrayList<Change> changes = new ArrayList<Change>();
+ Set<Integer> artIds = new HashSet<Integer>();
+ Set<Integer> newAndDeletedArtifactIds = new HashSet<Integer>();
+ boolean historical = sourceBranch == null;
+ long totalTime = System.currentTimeMillis();
+
+ monitor.startJob("Find Changes", 100);
+ if (DEBUG) {
+ System.out.println(String.format("\nChange Manager: getChanges(%s, %s)", sourceBranch, transactionId));
+ }
+
+ loadNewOrDeletedArtifactChanges(sourceBranch, transactionId, artIds, changes, newAndDeletedArtifactIds, monitor);
+ loadAttributeChanges(sourceBranch, transactionId, artIds, changes, newAndDeletedArtifactIds, monitor);
+ loadRelationChanges(sourceBranch, transactionId, artIds, changes, newAndDeletedArtifactIds, monitor);
+
+ Branch branch = historical ? transactionId.getBranch() : sourceBranch;
+
+ if (historical) {
+ for (Change change : changes) {
+ change.setBranch(branch);
+ }
+ }
+
+ monitor.setSubtaskName("Loading Artifacts from the Database");
+ long time = System.currentTimeMillis();
+ if (!artIds.isEmpty()) {
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (int artId : artIds) {
+ insertParameters.add(new Object[] {queryId, insertTime, artId, branch.getBranchId(),
+ historical ? transactionId.getTransactionNumber() : SQL3DataType.INTEGER});
+ }
+ ArtifactLoader.loadArtifacts(queryId, ArtifactLoad.FULL, null, insertParameters, true, historical, true);
+ }
+
+ if (DEBUG) {
+ System.out.println(String.format(" Loaded %d Artifacts in %s", artIds.size(), Lib.getElapseString(time)));
+ System.out.println(String.format("Change Manager: Found all of the Changes in %s\n",
+ Lib.getElapseString(totalTime)));
+ }
+ monitor.done();
+ return changes;
+ }
+
+ /**
+ * @param sourceBranch
+ * @param changes
+ * @throws TransactionDoesNotExist
+ * @throws BranchDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ private void loadNewOrDeletedArtifactChanges(Branch sourceBranch, TransactionId transactionId, Set<Integer> artIds, ArrayList<Change> changes, Set<Integer> newAndDeletedArtifactIds, IStatusMonitor monitor) throws OseeCoreException {
+
+ Map<Integer, ArtifactChanged> artifactChanges = new HashMap<Integer, ArtifactChanged>();
+ boolean hasBranch = sourceBranch != null;
+ TransactionId fromTransactionId;
+ TransactionId toTransactionId;
+ long time = System.currentTimeMillis();
+ if (DEBUG) {
+ System.out.println(String.format(" Gathering New or Deleted Artifacts on %s",
+ hasBranch ? "Branch: " + sourceBranch : "Transaction: " + transactionId));
+ }
+
+ monitor.setSubtaskName("Gathering New or Deleted Artifacts");
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+
+ if (hasBranch) { //Changes per a branch
+ Pair<TransactionId, TransactionId> branchStartEndTransaction =
+ TransactionIdManager.getStartEndPoint(sourceBranch);
+
+ fromTransactionId = branchStartEndTransaction.getKey();
+ toTransactionId = branchStartEndTransaction.getValue();
+
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Changes.SELECT_BRANCH_ARTIFACT_CHANGES),
+ sourceBranch.getBranchId());
+ } else { //Changes per a transaction
+ toTransactionId = transactionId;
+ fromTransactionId = TransactionIdManager.getPriorTransaction(toTransactionId);
+
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Changes.SELECT_TRANSACTION_ARTIFACT_CHANGES),
+ toTransactionId.getTransactionNumber());
+ }
+ int count = 0;
+ while (chStmt.next()) {
+ count++;
+ int artId = chStmt.getInt("art_id");
+ ModificationType modificationType = ModificationType.getMod(chStmt.getInt("mod_type"));
+
+ ArtifactChanged artifactChanged =
+ new ArtifactChanged(sourceBranch, chStmt.getInt("art_type_id"), chStmt.getInt("gamma_id"), artId,
+ toTransactionId, fromTransactionId, modificationType, ChangeType.OUTGOING, !hasBranch);
+
+ //We do not want to display artifacts that were new and then deleted
+ //The only was this could happen is if the artifact was in here twice
+ //since the sql only returns new or deleted artifacts
+ if (!artifactChanges.containsKey(artId)) {
+ artIds.add(artId);
+ changes.add(artifactChanged);
+ artifactChanges.put(artId, artifactChanged);
+ //The same artifact can have this change many times on a branch. We only want to capture that it occurred once in the change report
+ } else if (modificationType != ModificationType.INTRODUCED) {
+ changes.remove(artifactChanges.get(artId));
+ newAndDeletedArtifactIds.add(artId);
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Found %d Changes in %s", count, Lib.getElapseString(time)));
+ }
+ monitor.updateWork(25);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /**
+ * @param sourceBranch
+ * @param changes
+ * @throws OseeCoreException
+ */
+ private void loadRelationChanges(Branch sourceBranch, TransactionId transactionId, Set<Integer> artIds, ArrayList<Change> changes, Set<Integer> newAndDeletedArtifactIds, IStatusMonitor monitor) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ TransactionId fromTransactionId;
+ TransactionId toTransactionId;
+
+ monitor.setSubtaskName("Gathering Relation Changes");
+ try {
+ boolean hasBranch = sourceBranch != null;
+ long time = System.currentTimeMillis();
+ if (DEBUG) {
+ System.out.println(String.format(" Gathering Relation Changes on %s",
+ hasBranch ? "Branch: " + sourceBranch : "Transaction: " + transactionId));
+ }
+ //Changes per a branch
+ if (hasBranch) {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Changes.SELECT_BRANCH_REL_CHANGES),
+ sourceBranch.getBranchId());
+
+ Pair<TransactionId, TransactionId> branchStartEndTransaction =
+ TransactionIdManager.getStartEndPoint(sourceBranch);
+
+ fromTransactionId = branchStartEndTransaction.getKey();
+ toTransactionId = branchStartEndTransaction.getValue();
+ }//Changes per a transaction
+ else {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Changes.SELECT_TRANSACTION_REL_CHANGES),
+ transactionId.getTransactionNumber());
+
+ toTransactionId = transactionId;
+ fromTransactionId = TransactionIdManager.getPriorTransaction(toTransactionId);
+ }
+
+ int count = 0;
+ while (chStmt.next()) {
+ count++;
+ int aArtId = chStmt.getInt("a_art_id");
+ int bArtId = chStmt.getInt("b_art_id");
+ int relLinkId = chStmt.getInt("rel_link_id");
+
+ if (!newAndDeletedArtifactIds.contains(aArtId) && !newAndDeletedArtifactIds.contains(bArtId)) {
+ ModificationType modificationType = ModificationType.getMod(chStmt.getInt("mod_type"));
+ String rationale = modificationType != ModificationType.DELETED ? chStmt.getString("rationale") : "";
+ artIds.add(aArtId);
+ artIds.add(bArtId);
+
+ changes.add(new RelationChanged(sourceBranch, chStmt.getInt("art_type_id"), chStmt.getInt("gamma_id"),
+ aArtId, toTransactionId, fromTransactionId, modificationType, ChangeType.OUTGOING, bArtId,
+ relLinkId, rationale, chStmt.getInt("a_order"), chStmt.getInt("b_order"),
+ RelationTypeManager.getType(chStmt.getInt("rel_link_type_id")), !hasBranch));
+ }
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Found %d Changes in %s", count, Lib.getElapseString(time)));
+ }
+ monitor.updateWork(25);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /**
+ * @param sourceBranch
+ * @param changes
+ * @throws TransactionDoesNotExist
+ * @throws BranchDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ private void loadAttributeChanges(Branch sourceBranch, TransactionId transactionId, Set<Integer> artIds, ArrayList<Change> changes, Set<Integer> newAndDeletedArtifactIds, IStatusMonitor monitor) throws OseeCoreException {
+ Map<Integer, Change> attributesWasValueCache = new HashMap<Integer, Change>();
+ Map<Integer, ModificationType> artModTypes = new HashMap<Integer, ModificationType>();
+ Set<Integer> modifiedArtifacts = new HashSet<Integer>();
+ ConnectionHandlerStatement chStmt1 = new ConnectionHandlerStatement();
+ ModificationType artModType;
+ boolean hasBranch = sourceBranch != null;
+ long time = System.currentTimeMillis();
+ monitor.setSubtaskName("Gathering Attribute Changes");
+ if (DEBUG) {
+ System.out.println(String.format(" Gathering Attribute Changes on %s",
+ hasBranch ? "Branch: " + sourceBranch : "Transaction: " + transactionId));
+ }
+ TransactionId fromTransactionId;
+ TransactionId toTransactionId;
+
+ for (Change change : changes) {// cache in map for performance look ups
+ artModTypes.put(change.getArtId(), change.getModificationType());
+ }
+ try {
+ //Changes per a branch
+ if (hasBranch) {
+ chStmt1.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Changes.SELECT_BRANCH_ATTRIBUTE_IS_CHANGES),
+ sourceBranch.getBranchId());
+
+ Pair<TransactionId, TransactionId> branchStartEndTransaction =
+ TransactionIdManager.getStartEndPoint(sourceBranch);
+
+ fromTransactionId = branchStartEndTransaction.getKey();
+ toTransactionId = branchStartEndTransaction.getValue();
+ }//Changes per transaction number
+ else {
+ chStmt1.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Changes.SELECT_TRANSACTION_ATTRIBUTE_CHANGES),
+ transactionId.getTransactionNumber());
+
+ toTransactionId = transactionId;
+ fromTransactionId = TransactionIdManager.getPriorTransaction(toTransactionId);
+ }
+ AttributeChanged attributeChanged;
+
+ int count = 0;
+ while (chStmt1.next()) {
+ count++;
+ int attrId = chStmt1.getInt("attr_id");
+ int artId = chStmt1.getInt("art_id");
+ int sourceGamma = chStmt1.getInt("gamma_id");
+ int attrTypeId = chStmt1.getInt("attr_type_id");
+ int artTypeId = chStmt1.getInt("art_type_id");
+ String isValue = chStmt1.getString("is_value");
+ ModificationType modificationType = ModificationType.getMod(chStmt1.getInt("mod_type"));
+
+ if (artModTypes.containsKey(artId)) {
+ artModType = artModTypes.get(artId);
+ } else {
+ artModType = ModificationType.MODIFIED;
+ }
+
+ //This will be false iff the artifact was new and then deleted
+ if (!newAndDeletedArtifactIds.contains(artId)) {
+ // Want to add an artifact changed item once if any attribute was modified && artifact was not
+ // NEW or DELETED
+ if (artModType == ModificationType.MODIFIED && !modifiedArtifacts.contains(artId)) {
+ ArtifactChanged artifactChanged =
+ new ArtifactChanged(sourceBranch, artTypeId, -1, artId, toTransactionId, fromTransactionId,
+ ModificationType.MODIFIED, ChangeType.OUTGOING, !hasBranch);
+
+ changes.add(artifactChanged);
+ modifiedArtifacts.add(artId);
+ }
+
+ //Modtypes will be temporarily set to new and then revised for based on the existence of a was value
+ if (modificationType == ModificationType.MODIFIED && artModType != ModificationType.INTRODUCED) {
+ modificationType = ModificationType.NEW;
+ }
+
+ attributeChanged =
+ new AttributeChanged(sourceBranch, artTypeId, sourceGamma, artId, toTransactionId,
+ fromTransactionId, modificationType, ChangeType.OUTGOING, isValue, "", attrId, attrTypeId,
+ artModType, !hasBranch);
+
+ changes.add(attributeChanged);
+ attributesWasValueCache.put(attrId, attributeChanged);
+ artIds.add(artId);
+ }
+ }
+
+ if (DEBUG) {
+ System.out.println(String.format(" Found %d Changes in %s", count, Lib.getElapseString(time)));
+ }
+ monitor.updateWork(13);
+ monitor.setSubtaskName("Gathering Was values");
+
+ loadAttributeWasValues(sourceBranch, transactionId, artIds, monitor, attributesWasValueCache, hasBranch);
+ } finally {
+ chStmt1.close();
+ }
+ }
+
+ /**
+ * @param sourceBranch
+ * @param transactionId
+ * @param artIds
+ * @param monitor
+ * @param attributesWasValueCache
+ * @param hasBranch
+ * @throws OseeCoreException
+ * @throws OseeDataStoreException
+ */
+ private void loadAttributeWasValues(Branch sourceBranch, TransactionId transactionId, Set<Integer> artIds, IStatusMonitor monitor, Map<Integer, Change> attributesWasValueCache, boolean hasBranch) throws OseeCoreException, OseeDataStoreException {
+ if (!artIds.isEmpty()) {
+ int count = 0;
+ long time = System.currentTimeMillis();
+ int sqlParamter; // Will either be a branch id or transaction id
+ Branch wasValueBranch;
+ String sql;
+
+ if (hasBranch) {
+ wasValueBranch = sourceBranch;
+ sql = ClientSessionManager.getSQL(OseeSql.Changes.SELECT_BRANCH_ATTRIBUTE_WAS_CHANGE);
+ sqlParamter = wasValueBranch.getBranchId();
+ } else {
+ wasValueBranch = transactionId.getBranch();
+ sql = ClientSessionManager.getSQL(OseeSql.Changes.SELECT_TRANSACTION_ATTRIBUTE_WAS_CHANGE);
+ sqlParamter = transactionId.getTransactionNumber();
+ }
+
+ int queryId = ArtifactLoader.getNewQueryId();
+ Timestamp insertTime = GlobalTime.GreenwichMeanTimestamp();
+ List<Object[]> datas = new LinkedList<Object[]>();
+ ConnectionHandlerStatement chStmt2 = new ConnectionHandlerStatement();
+
+ try {
+ // insert into the artifact_join_table
+ for (int artId : artIds) {
+ datas.add(new Object[] {queryId, insertTime, artId, wasValueBranch.getBranchId(), SQL3DataType.INTEGER});
+ }
+ ArtifactLoader.insertIntoArtifactJoin(datas);
+ chStmt2.runPreparedQuery(sql, sqlParamter, queryId);
+ int previousAttrId = -1;
+
+ while (chStmt2.next()) {
+ count++;
+ int attrId = chStmt2.getInt("attr_id");
+
+ if (previousAttrId != attrId) {
+ String wasValue = chStmt2.getString("was_value");
+ if (attributesWasValueCache.containsKey(attrId) && attributesWasValueCache.get(attrId) instanceof AttributeChanged) {
+ AttributeChanged changed = (AttributeChanged) attributesWasValueCache.get(attrId);
+
+ if (changed.getArtModType() != ModificationType.NEW) {
+ if (changed.getModificationType() != ModificationType.DELETED && changed.getModificationType() != ModificationType.ARTIFACT_DELETED) {
+ changed.setModType(ModificationType.MODIFIED);
+ }
+ changed.setWasValue(wasValue);
+ }
+ }
+ previousAttrId = attrId;
+ }
+ }
+ } finally {
+ ArtifactLoader.clearQuery(queryId);
+ chStmt2.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format(" Loaded %d was values in %s", count, Lib.getElapseString(time)));
+ }
+ monitor.updateWork(12);
+ }
+ }
+
+ public boolean isChangesOnWorkingBranch(Branch workingBranch) throws OseeCoreException {
+ Pair<TransactionId, TransactionId> transactionToFrom = TransactionIdManager.getStartEndPoint(workingBranch);
+ if (transactionToFrom.getKey().equals(transactionToFrom.getValue())) {
+ return false;
+ }
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalHistoryManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalHistoryManager.java
new file mode 100644
index 00000000000..a2fccacb09b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/InternalHistoryManager.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.framework.skynet.core.revision;
+
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class InternalHistoryManager {
+ private static InternalHistoryManager instance = new InternalHistoryManager();
+
+ private InternalHistoryManager() {
+ }
+
+ public InternalHistoryManager getInstance(){
+ return instance;
+ }
+
+ public List<Change> getArtifactHistory(Artifact artifact){ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RelationLinkChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RelationLinkChange.java
new file mode 100644
index 00000000000..0af4c51cbe1
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RelationLinkChange.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.revision;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RelationLinkChange extends RevisionChange implements IRelationLinkChange {
+ private static final long serialVersionUID = 1L;
+ private int relLinkId;
+ private String rationale;
+ private int order;
+ private String relTypeName;
+ private String otherArtifactName;
+ private ArtifactType otherArtifactType;
+
+ /**
+ * Constructor for deserialization.
+ */
+ protected RelationLinkChange() {
+
+ }
+
+ /**
+ * Constructs a new or modified link change.
+ *
+ * @param modType
+ * @param gammaId
+ * @param rationale
+ * @param order
+ * @param relTypeName
+ * @param otherArtifactName
+ * @param otherArtifactType
+ */
+ public RelationLinkChange(ChangeType changeType, ModificationType modType, int relLinkId, long gammaId, String rationale, int order, String relTypeName, String otherArtifactName, ArtifactType otherArtifactType) {
+ super(changeType, modType, gammaId);
+ this.relLinkId = relLinkId;
+ this.rationale = rationale;
+ this.order = order;
+ this.relTypeName = relTypeName;
+ this.otherArtifactName = otherArtifactName;
+ this.otherArtifactType = otherArtifactType;
+ }
+
+ /**
+ * Constructs a deleted link change.
+ *
+ * @param gammaId
+ * @param relTypeName
+ * @param otherArtifactName
+ * @param otherArtifactType
+ */
+ public RelationLinkChange(ChangeType changeType, int relLinkId, long gammaId, String relTypeName, String otherArtifactName, ArtifactType otherArtifactType) {
+ super(changeType, DELETED, gammaId);
+ this.relLinkId = relLinkId;
+ this.relTypeName = relTypeName;
+ this.otherArtifactName = otherArtifactName;
+ this.otherArtifactType = otherArtifactType;
+ }
+
+ /**
+ * @return Returns the text for 'change' text.
+ */
+ @Override
+ public String getChange() {
+ return rationale;
+ }
+
+ /**
+ * @return Returns the order.
+ */
+ public int getOrder() {
+ return order;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.RelationLinkChange#getOtherArtifactDescriptor()
+ */
+ public ArtifactType getOtherArtifactType() {
+ return otherArtifactType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.RelationLinkChange#getOtherArtifactName()
+ */
+ public String getOtherArtifactName() {
+ return otherArtifactName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.RelationLinkChange#getRationale()
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.RelationLinkChange#getRelTypeName()
+ */
+ public String getRelTypeName() {
+ return relTypeName;
+ }
+
+ /**
+ * @return Returns the relLinkId.
+ */
+ public int getRelLinkId() {
+ return relLinkId;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionChange.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionChange.java
new file mode 100644
index 00000000000..02f9ca75268
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionChange.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.framework.skynet.core.revision;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class RevisionChange implements IRevisionChange, IAdaptable {
+ private ChangeType changeType;
+ private ModificationType modType;
+ private long gammaId;
+
+ /**
+ * Constructor for deserialization.
+ */
+ protected RevisionChange() {
+
+ }
+
+ public RevisionChange(ChangeType changeType, ModificationType modType, long gammaId) {
+ super();
+ this.changeType = changeType;
+ this.modType = modType;
+ this.gammaId = gammaId;
+ }
+
+ public abstract String getChange();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.revision.IRevisionChange#getGammaId()
+ */
+ public long getGammaId() {
+ return gammaId;
+ }
+
+ public ModificationType getModificationType() {
+ return modType;
+ }
+
+ /**
+ * @return Returns the changeType.
+ */
+ public ChangeType getChangeType() {
+ return changeType;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionManager.java
new file mode 100644
index 00000000000..6f057abc4aa
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/RevisionManager.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.revision;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ARTIFACT_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_TYPE_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_TYPE_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.RELATION_LINK_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TXD_COMMENT;
+import static org.eclipse.osee.framework.skynet.core.change.ChangeType.OUTGOING;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.RsetProcessor;
+import org.eclipse.osee.framework.db.connection.core.query.Query;
+import org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase;
+import org.eclipse.osee.framework.db.connection.core.schema.Table;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * Manages artifact versions in Skynet
+ *
+ * @author Jeff C. Phillips
+ */
+public class RevisionManager {
+ private static final String GET_CHANGED_ARTIFACTS =
+ "SELECT arv2.gamma_id, txs1.mod_type FROM osee_artifact ar1, osee_artifact_version arv2, osee_txs txs1, osee_tx_details txd4 WHERE ar1.art_id = ? AND ar1.art_id = arv2.art_id AND arv2.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd4.transaction_id AND txd4.branch_id = ?";
+
+ private static final Table TX_DATA = new Table("tx_data");
+ private static final String SELECT_TRANSACTIONS_FOR_ARTIFACT =
+ "SELECT DISTINCT " + TX_DATA.columns("transaction_id", TXD_COMMENT, "time", "author", "commit_art_id") + " FROM " + "(" + " SELECT " + TRANSACTION_DETAIL_TABLE.columns(
+ "transaction_id", "commit_art_id", TXD_COMMENT, "time", "author") + " FROM " + Collections.toString(",",
+ TRANSACTION_DETAIL_TABLE, TRANSACTIONS_TABLE, ARTIFACT_VERSION_TABLE) + " WHERE " + TRANSACTIONS_TABLE.join(
+ TRANSACTION_DETAIL_TABLE, "transaction_id") + " AND " + ARTIFACT_VERSION_TABLE.join(TRANSACTIONS_TABLE,
+ "gamma_id") + " AND " + ARTIFACT_VERSION_TABLE.column("art_id") + "=?" + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?" + " UNION ALL" + " SELECT " + TRANSACTION_DETAIL_TABLE.columns(
+ "transaction_id", "commit_art_id", TXD_COMMENT, "time", "author") + " FROM " + Collections.toString(",",
+ TRANSACTION_DETAIL_TABLE, TRANSACTIONS_TABLE, RELATION_LINK_VERSION_TABLE) + " WHERE " + TRANSACTIONS_TABLE.join(
+ TRANSACTION_DETAIL_TABLE, "transaction_id") + " AND " + RELATION_LINK_VERSION_TABLE.join(
+ TRANSACTIONS_TABLE, "gamma_id") + " AND " + RELATION_LINK_VERSION_TABLE.column("a_art_id") + "=?" + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?" + " UNION ALL" + " SELECT " + TRANSACTION_DETAIL_TABLE.columns(
+ "transaction_id", "commit_art_id", TXD_COMMENT, "time", "author") + " FROM " + Collections.toString(",",
+ TRANSACTION_DETAIL_TABLE, TRANSACTIONS_TABLE, RELATION_LINK_VERSION_TABLE) + " WHERE " + TRANSACTIONS_TABLE.join(
+ TRANSACTION_DETAIL_TABLE, "transaction_id") + " AND " + RELATION_LINK_VERSION_TABLE.join(
+ TRANSACTIONS_TABLE, "gamma_id") + " AND " + RELATION_LINK_VERSION_TABLE.column("b_art_id") + "=?" + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=?" + ")" + TX_DATA + " WHERE " + TX_DATA.column("transaction_id") + "<?" + " ORDER BY " + TX_DATA.column("transaction_id") + " DESC";
+
+ private static final Pair<String, ArtifactType> UNKNOWN_DATA = new Pair<String, ArtifactType>(null, null);
+
+ private RevisionManager() {
+ }
+
+ /**
+ * Returns the transactions associated with an artifact
+ *
+ * @param artifact
+ * @param includeAncestry - indicate whether or not history from ancestor branches should be included
+ * @return - Collection<TransactionData>
+ */
+ @Deprecated
+ public static Collection<TransactionData> getTransactionsPerArtifact(Artifact artifact, boolean includeAncestry) throws OseeCoreException {
+ List<TransactionData> transactionDetails = new LinkedList<TransactionData>();
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ final Integer artId = artifact.getArtId();
+ Branch branch = artifact.getBranch();
+ Integer limit = Integer.MAX_VALUE;
+
+ while (branch != null) {
+ try {
+ int branchId = branch.getBranchId();
+ chStmt.runPreparedQuery(SELECT_TRANSACTIONS_FOR_ARTIFACT, artId, branchId, artId, branchId, artId,
+ branchId, limit);
+
+ while (chStmt.next()) {
+ transactionDetails.add(new TransactionData(chStmt.getString(TXD_COMMENT), chStmt.getTimestamp("time"),
+ chStmt.getInt("author"), chStmt.getInt("transaction_id"), artId, branch,
+ chStmt.getInt("commit_art_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ if (includeAncestry && branch.hasParentBranch() && transactionDetails.size() > 0) {
+ branch = branch.getParentBranch();
+ limit = transactionDetails.get(transactionDetails.size() - 1).getTransactionNumber();
+ } else {
+ branch = null;
+ }
+ }
+ return transactionDetails;
+ }
+
+ /**
+ * Returns transaction details by creating a union between the attribute table and the rel link table joined by the
+ * TransactionData id
+ *
+ * @param tData
+ * @return - Collection<RevisionChange>
+ * @throws BranchDoesNotExist
+ * @throws ArtifactDoesNotExist
+ * @throws TransactionDoesNotExist
+ */
+ @Deprecated
+ public static Collection<RevisionChange> getTransactionChanges(TransactionData tData) throws OseeCoreException {
+ IArtifactNameDescriptorResolver resolver = new ArtifactNameDescriptorResolver(tData.getBranch());
+
+ return getTransactionChanges(OUTGOING, tData.getTransactionId(), tData.getTransactionId(),
+ tData.getAssociatedArtId(), resolver);
+ }
+
+ @Deprecated
+ private static Collection<RevisionChange> getTransactionChanges(ChangeType changeType, TransactionId fromTransactionId, TransactionId toTransactionId, int artId, IArtifactNameDescriptorResolver artifactNameDescriptorResolver) throws OseeCoreException {
+ Collection<AttributeChange> attributeChanges =
+ getAttributeChanges(changeType, fromTransactionId.getTransactionNumber(),
+ toTransactionId.getTransactionNumber(), artId);
+ Collection<RelationLinkChange> linkChanges =
+ getRelationLinkChanges(changeType, fromTransactionId.getTransactionNumber(),
+ toTransactionId.getTransactionNumber(), artId, artifactNameDescriptorResolver);
+ Collection<ArtifactChange> artifactChanges =
+ getArtifactChanges(changeType, fromTransactionId, toTransactionId, artId);
+
+ Collection<RevisionChange> changes = new ArrayList<RevisionChange>(attributeChanges.size() + linkChanges.size());
+ changes.addAll(attributeChanges);
+ changes.addAll(linkChanges);
+ changes.addAll(artifactChanges);
+
+ return changes;
+ }
+
+ @Deprecated
+ private static Collection<AttributeChange> getAttributeChanges(ChangeType changeType, int fromTransactionNumber, int toTransactionNumber, int artId) {
+
+ Collection<AttributeChange> revisions = new LinkedList<AttributeChange>();
+ String sql =
+ "SELECT data_table.*, (SELECT " + SkynetDatabase.ATTRIBUTE_VERSION_TABLE + ".VALUE " + "FROM " + SkynetDatabase.ATTRIBUTE_VERSION_TABLE + " " + "WHERE gamma_id = data_table.was_gamma) as was_value, " + "(SELECT " + SkynetDatabase.ATTRIBUTE_VERSION_TABLE + ".uri " + "FROM " + SkynetDatabase.ATTRIBUTE_VERSION_TABLE + " " + "WHERE gamma_id = data_table.was_gamma) as was_content FROM (SELECT attr1.gamma_id, attr1.value as is_value, attr1.uri as is_content, attr1.modification_id, attr1.attr_id," + ATTRIBUTE_TYPE_TABLE.column("name") + "," + "(SELECT MAX(attr2.gamma_id) " + "FROM " + SkynetDatabase.ATTRIBUTE_VERSION_TABLE + " attr2, " + SkynetDatabase.TRANSACTIONS_TABLE + " t3, " + SkynetDatabase.TRANSACTION_DETAIL_TABLE + " t4 " + "WHERE attr1.attr_id = attr2.attr_id and attr2.gamma_id = t3.gamma_id and t3.transaction_id = t4.transaction_id and t1.branch_id = t4.branch_id AND attr2.gamma_id < attr1.gamma_id) as was_gamma FROM " + ATTRIBUTE_VERSION_TABLE + " attr1," + ATTRIBUTE_TYPE_TABLE + "," + TRANSACTIONS_TABLE + ", " + TRANSACTION_DETAIL_TABLE + "," + " (SELECT branch_id FROM " + TRANSACTION_DETAIL_TABLE + " WHERE transaction_id=?) T1" + " WHERE attr1.gamma_id = " + TRANSACTIONS_TABLE.column("gamma_id") + " AND attr1.attr_type_id=" + ATTRIBUTE_TYPE_TABLE.column("attr_type_id") + " AND " + (fromTransactionNumber == toTransactionNumber ? TRANSACTIONS_TABLE.column("transaction_id") + " = ?" : TRANSACTIONS_TABLE.column("transaction_id") + " > ? " + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + " <= ?") + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=T1.branch_id" + " AND art_id = ?) data_table" + " ORDER BY gamma_id DESC";
+
+ Collection<Object> dataList = new LinkedList<Object>();
+ dataList.add(fromTransactionNumber);
+ if (fromTransactionNumber != toTransactionNumber) {
+ dataList.add(fromTransactionNumber);
+ }
+ dataList.add(toTransactionNumber);
+ dataList.add(artId);
+
+ try {
+ Query.acquireCollection(revisions, new AttributeChangeProcessor(changeType), sql, dataList.toArray());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+
+ return revisions;
+ }
+
+ @Deprecated
+ private static Collection<RelationLinkChange> getRelationLinkChanges(ChangeType changeType, int fromTransactionNumber, int toTransactionNumber, int artId, IArtifactNameDescriptorResolver artifactNameDescriptorResolver) {
+
+ String transactionCheck =
+ fromTransactionNumber == toTransactionNumber ? TRANSACTIONS_TABLE.column("transaction_id") + " = ?" : TRANSACTIONS_TABLE.column("transaction_id") + " > ? " + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + " <= ?";
+
+ Collection<RelationLinkChange> revisions = new LinkedList<RelationLinkChange>();
+ String sql =
+ "SELECT gamma_id, rationale, modification_id, art_id, rel_link_id, order_val, type_name, side_name FROM (SELECT " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + "," + RELATION_LINK_VERSION_TABLE.column("rationale") + "," + RELATION_LINK_VERSION_TABLE.column("modification_id") + "," + RELATION_LINK_VERSION_TABLE.column("a_art_id") + " AS art_id, " + RELATION_LINK_VERSION_TABLE.column("rel_link_id") + "," + RELATION_LINK_VERSION_TABLE.column("a_order") + " AS order_val, " + RELATION_LINK_TYPE_TABLE.column("type_name") + "," + RELATION_LINK_TYPE_TABLE.column("a_name") + " AS side_name" + " FROM " + RELATION_LINK_VERSION_TABLE + "," + RELATION_LINK_TYPE_TABLE + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + ",(SELECT branch_id FROM " + TRANSACTION_DETAIL_TABLE + " WHERE transaction_id=?) T2 WHERE " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + " = " + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + transactionCheck + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=T2.branch_id" + " AND " + RELATION_LINK_VERSION_TABLE.column("rel_link_type_id") + "=" + RELATION_LINK_TYPE_TABLE.column("rel_link_type_id") + " AND b_art_id = ?) aliasForSyntax UNION ALL " + "(SELECT " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + "," + RELATION_LINK_VERSION_TABLE.column("rationale") + "," + RELATION_LINK_VERSION_TABLE.column("modification_id") + "," + RELATION_LINK_VERSION_TABLE.column("b_art_id") + " AS art_id, " + RELATION_LINK_VERSION_TABLE.column("rel_link_id") + "," + RELATION_LINK_VERSION_TABLE.column("b_order") + " AS order_val, " + RELATION_LINK_TYPE_TABLE.column("type_name") + "," + RELATION_LINK_TYPE_TABLE.column("b_name") + " AS side_name" + " FROM " + RELATION_LINK_VERSION_TABLE + "," + RELATION_LINK_TYPE_TABLE + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + ",(SELECT branch_id FROM " + TRANSACTION_DETAIL_TABLE + " WHERE transaction_id=?) T2 WHERE " + RELATION_LINK_VERSION_TABLE.column("gamma_id") + " = " + TRANSACTIONS_TABLE.column("gamma_id") + " AND " + transactionCheck + " AND " + TRANSACTIONS_TABLE.column("transaction_id") + "=" + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=T2.branch_id" + " AND " + RELATION_LINK_VERSION_TABLE.column("rel_link_type_id") + "=" + RELATION_LINK_TYPE_TABLE.column("rel_link_type_id") + " AND a_art_id = ?)" + " ORDER BY gamma_id DESC";
+
+ Collection<Object> dataList = new LinkedList<Object>();
+ dataList.add(fromTransactionNumber);
+ if (fromTransactionNumber != toTransactionNumber) {
+ dataList.add(fromTransactionNumber);
+ }
+ dataList.add(toTransactionNumber);
+ dataList.add(artId);
+ dataList.add(fromTransactionNumber);
+ if (fromTransactionNumber != toTransactionNumber) {
+ dataList.add(fromTransactionNumber);
+ }
+ dataList.add(toTransactionNumber);
+ dataList.add(artId);
+
+ try {
+ Query.acquireCollection(revisions,
+ new RelationLinkChangeProcessor(changeType, artifactNameDescriptorResolver), sql, dataList.toArray());
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+
+ return revisions;
+ }
+
+ @Deprecated
+ private static Collection<ArtifactChange> getArtifactChanges(ChangeType changeType, TransactionId fromTransactionId, TransactionId toTransactionId, int artId) throws OseeCoreException {
+ Collection<ArtifactChange> changes = new LinkedList<ArtifactChange>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ String sql =
+ fromTransactionId != toTransactionId ? GET_CHANGED_ARTIFACTS + " AND txd4.transaction_id > ? AND txd4.transaction_id <= ?" : GET_CHANGED_ARTIFACTS + " AND txd4.transaction_id = ? AND txd4.transaction_id = ?";
+
+ chStmt.runPreparedQuery(sql, artId, fromTransactionId.getBranchId(), fromTransactionId.getTransactionNumber(),
+ toTransactionId.getTransactionNumber());
+
+ Artifact artifact = ArtifactQuery.getArtifactFromId(artId, fromTransactionId.getBranch(), true);
+
+ while (chStmt.next()) {
+ changes.add(new ArtifactChange(changeType, ModificationType.getMod(chStmt.getInt("mod_type")), artifact,
+ null, null, null, toTransactionId, fromTransactionId, chStmt.getInt("gamma_id"), false));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return changes;
+ }
+
+ /**
+ * Produces <code>AttributeChange</code>'s from a ResultSet. <br/>
+ * <br/>
+ * For deleted attributes, the following columns must be available from the set: <li>gamma_id</li> <li>
+ * modification_id</li> <li>name</li> <br/>
+ * <br/>
+ * For new and modified attributes, the following columns must be available from the set: <li>gamma_id</li> <li>
+ * modification_id</li> <li>name</li> <li>value</li>
+ *
+ * @author Robert A. Fisher
+ */
+ private static class AttributeChangeProcessor implements RsetProcessor<AttributeChange> {
+ private final ChangeType changeType;
+
+ /**
+ * @param changeType
+ */
+ public AttributeChangeProcessor(ChangeType changeType) {
+ this.changeType = changeType;
+ }
+
+ public AttributeChange process(ConnectionHandlerStatement chStmt) throws OseeDataStoreException, OseeArgumentException {
+ ModificationType modType = ModificationType.getMod(chStmt.getInt("modification_id"));
+ if (modType == ModificationType.DELETED) {
+ String wasValue = chStmt.getString("was_value");
+ return new AttributeChange(changeType, chStmt.getInt("attr_id"), chStmt.getLong("gamma_id"),
+ chStmt.getString("name"), wasValue == null ? "" : wasValue);
+ } else {
+ String isValue = chStmt.getString("is_value");
+ String wasValue = chStmt.getString("was_value");
+ return new AttributeChange(changeType, modType, chStmt.getInt("attr_id"), chStmt.getLong("gamma_id"),
+ chStmt.getString("name"), isValue == null ? "" : isValue, chStmt.getBinaryStream("is_content"),
+ wasValue == null ? "" : wasValue, chStmt.getBinaryStream("was_content"));
+ }
+ }
+
+ public boolean validate(AttributeChange item) {
+ return item != null;
+ }
+ }
+
+ /**
+ * Produces <code>RelationLinkChange</code>'s from a ResultSet. <br/>
+ * <br/>
+ * For deleted links, the following columns must be available from the set: <li>gamma_id</li> <li>modification_id</li>
+ * <li>type_name</li> <li>art_id</li> <br/>
+ * <br/>
+ * For new and modified attributes, the following columns must be available from the set: <li>gamma_id</li> <li>
+ * modification_id</li> <li>type_name</li> <li>art_id</li> <li>rationale</li> <li>order_val</li>
+ *
+ * @author Robert A. Fisher
+ */
+ private static class RelationLinkChangeProcessor implements RsetProcessor<RelationLinkChange> {
+ private final IArtifactNameDescriptorResolver artifactNameDescriptorResolver;
+ private final ChangeType changeType;
+
+ /**
+ * @param artifactNameDescriptorResolver
+ */
+ public RelationLinkChangeProcessor(ChangeType changeType, IArtifactNameDescriptorResolver artifactNameDescriptorResolver) {
+ this.changeType = changeType;
+ this.artifactNameDescriptorResolver = artifactNameDescriptorResolver;
+ }
+
+ public RelationLinkChange process(ConnectionHandlerStatement chStmt) throws OseeDataStoreException, OseeArgumentException {
+
+ ModificationType modType = ModificationType.getMod(chStmt.getInt("modification_id"));
+
+ Pair<String, ArtifactType> artifactData;
+ if (artifactNameDescriptorResolver != null)
+ artifactData = artifactNameDescriptorResolver.get(chStmt.getInt("art_id"));
+ else
+ artifactData = UNKNOWN_DATA;
+
+ String relName = chStmt.getString("type_name") + " (" + chStmt.getString("side_name") + ")";
+ if (modType == ModificationType.DELETED) {
+ return new RelationLinkChange(changeType, chStmt.getInt("rel_link_id"), chStmt.getLong("gamma_id"),
+ relName, artifactData.getKey(), artifactData.getValue());
+ } else {
+ return new RelationLinkChange(changeType, modType, chStmt.getInt("rel_link_id"),
+ chStmt.getLong("gamma_id"), chStmt.getString("rationale"), chStmt.getInt("order_val"), relName,
+ artifactData.getKey(), artifactData.getValue());
+ }
+ }
+
+ public boolean validate(RelationLinkChange item) {
+ return item != null;
+ }
+ }
+
+ public static boolean branchHasChanges(Branch branch) throws OseeCoreException {
+ Pair<TransactionId, TransactionId> transactions = TransactionIdManager.getStartEndPoint(branch);
+ return transactions.getKey() != transactions.getValue();
+ }
+
+ private static final String OTHER_EDIT_SQL =
+ "select distinct t3.branch_id from osee_artifact_version t1, osee_txs t2, osee_tx_details t3, (select min(transaction_id) as min_tx_id, branch_id from osee_tx_details group by branch_id) t4, osee_branch t5 where t1.art_id = ? and t1.gamma_id = t2.gamma_id and t2.transaction_id <> t4.min_tx_id and t2.transaction_id = t3.transaction_id and t3.branch_id = t4.branch_id and t4.branch_id <> ? and t5.parent_branch_id = ? and t4.branch_id = t5.branch_id and t5.archived = 0";
+
+ /**
+ * Returns all the other branches this artifact has been editted on, besides modifications to program branch.
+ *
+ * @param artifact
+ * @throws OseeDataStoreException
+ * @throws BranchDoesNotExist
+ */
+ public static Collection<Branch> getOtherEdittedBranches(Artifact artifact) throws OseeDataStoreException, BranchDoesNotExist {
+ Collection<Branch> otherBranches = new LinkedList<Branch>();
+
+ // Can only be on other branches it has already been saved
+ if (artifact.isInDb()) {
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(OTHER_EDIT_SQL, artifact.getArtId(), artifact.getBranch().getBranchId(),
+ artifact.getBranch().getParentBranchId());
+
+ while (chStmt.next()) {
+ otherBranches.add(BranchManager.getBranch(chStmt.getInt("branch_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ return otherBranches;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/TransactionData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/TransactionData.java
new file mode 100644
index 00000000000..2d0e224ee47
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/revision/TransactionData.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.framework.skynet.core.revision;
+
+import java.sql.Timestamp;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.UserNotInDatabase;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * Stores transaction information.
+ *
+ * @author Jeff C. Phillips
+ */
+public class TransactionData implements IAdaptable {
+ private final String comment;
+ private final Timestamp timeStamp;
+ private final int associatedArtId;
+ private final int commitArtId;
+ private final int transactionNumber;
+ private String name;
+ private final Branch branch;
+ private Artifact artifact;
+
+ public TransactionData(String comment, Timestamp timeStamp, int authorId, int transactionId, int associatedArtId, Branch branch, int commitArtId) throws OseeCoreException {
+ super();
+ this.comment = comment == null ? "" : comment;
+ this.timeStamp = timeStamp;
+ this.transactionNumber = transactionId;
+ this.associatedArtId = associatedArtId;
+ this.commitArtId = commitArtId;
+ this.branch = branch;
+
+ try {
+ User user = null;
+ if (authorId == 0) {
+ user = UserManager.getUser(SystemUser.OseeSystem);
+ authorId = user.getArtId();
+ } else {
+ user = UserManager.getUserByArtId(authorId);
+ }
+ name = user.getDescriptiveName();
+ } catch (UserNotInDatabase ex) {
+ name = "Could not resolve artId: " + authorId;
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * @return the artifact
+ */
+ public Artifact getArtifact() {
+ if (artifact == null) {
+ if (getAssociatedArtId() > 0) {
+ try {
+ artifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(getAssociatedArtId(),
+ getTransactionId());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OseeActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return artifact;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public Timestamp getTimeStamp() {
+ return timeStamp;
+ }
+
+ public int getTransactionNumber() {
+ return transactionNumber;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAssociatedArtId() {
+ return associatedArtId;
+ }
+
+ /**
+ * @return Returns the branchId.
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ public TransactionId getTransactionId() throws OseeCoreException {
+ return TransactionIdManager.getTransactionId(transactionNumber);
+ }
+
+ /**
+ * @return the commitArtId
+ */
+ public int getCommitArtId() {
+ return commitArtId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+
+ try {
+ if (adapter.isInstance(getArtifact())) {
+ return getArtifact();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/EmptyMonitor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/EmptyMonitor.java
new file mode 100644
index 00000000000..3ef1abff58e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/EmptyMonitor.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.skynet.core.status;
+
+/**
+ * @author Theron Virgin
+ */
+public class EmptyMonitor implements IStatusMonitor {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#done()
+ */
+ @Override
+ public void done() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#startJob(java.lang.String, int)
+ */
+ @Override
+ public void startJob(String name, int totalWork) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#updateWork(int)
+ */
+ @Override
+ public void updateWork(int workCompleted) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#setSubtaskName()
+ */
+ @Override
+ public void setSubtaskName(String name) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/IStatusMonitor.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/IStatusMonitor.java
new file mode 100644
index 00000000000..a7540b5cc3b
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/status/IStatusMonitor.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.framework.skynet.core.status;
+
+/**
+ * @author Theron Virgin
+ */
+public interface IStatusMonitor {
+ public void startJob(String name, int totalWork);
+
+ public void updateWork(int workCompleted);
+
+ public void setSubtaskName(String name);
+
+ public void done();
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/BaseTransactionData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/BaseTransactionData.java
new file mode 100644
index 00000000000..1e70e1c7b20
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/BaseTransactionData.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.transaction;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactTransactionModifiedEvent;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseTransactionData {
+ private static final String INSERT_INTO_TRANSACTION_TABLE =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) VALUES (?, ?, ?, ?)";
+
+ private static final int PRIME_NUMBER = 37;
+ private final int itemId;
+ private ModificationType modificationType;
+ private Integer gammaId;
+ boolean useExistingBackingData;
+
+ public BaseTransactionData(int itemId, ModificationType modificationType, boolean useExistingBackingData) {
+ this(itemId, modificationType, null, useExistingBackingData);
+ }
+
+ public BaseTransactionData(int itemId, ModificationType modificationType, Integer gammaId, boolean useExistingBackingData) {
+ this.modificationType = modificationType;
+ this.itemId = itemId;
+ this.gammaId = gammaId;
+ this.useExistingBackingData = useExistingBackingData;
+ }
+
+ /**
+ * @return the useExistingBackingData
+ */
+ public boolean useExistingBackingData() {
+ return useExistingBackingData;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof BaseTransactionData) {
+ BaseTransactionData data = (BaseTransactionData) obj;
+ return data.itemId == this.itemId && data.getClass().equals(this.getClass());
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return itemId * PRIME_NUMBER * this.getClass().hashCode();
+ }
+
+ protected void addInsertToBatch(SkynetTransaction transaction) throws OseeCoreException {
+ internalAddInsertToBatch(transaction, Integer.MAX_VALUE, INSERT_INTO_TRANSACTION_TABLE,
+ transaction.getTransactionNumber(), getGammaId(), getModificationType().getValue(), TxChange.getCurrent(
+ getModificationType()).getValue());
+ }
+
+ protected final int getItemId() {
+ return itemId;
+ }
+
+ protected final ModificationType getModificationType() {
+ return modificationType;
+ }
+
+ protected final int getGammaId() throws OseeCoreException {
+ if (gammaId == null) {
+ gammaId = createGammaId();
+ }
+ return gammaId;
+ }
+
+ final void setModificationType(ModificationType modificationType) {
+ this.modificationType = modificationType;
+ }
+
+ protected abstract String getSelectTxNotCurrentSql();
+
+ /**
+ * Should be called by child classes during their implementation of addInsertToBatch.
+ */
+ protected final void internalAddInsertToBatch(SkynetTransaction transaction, int insertPriority, String insertSql, Object... data) {
+ transaction.internalAddInsertToBatch(insertPriority, insertSql, data);
+ }
+
+ /**
+ * Should not be called by application. This should only be called once after the transaction has been committed.
+ */
+ protected abstract void internalUpdate(TransactionId transactionId) throws OseeCoreException;
+
+ /**
+ * Should not be called by application. This should only be called once after the transaction has been committed.
+ */
+ protected abstract void internalClearDirtyState();
+
+ /**
+ * Should not be called by application. This should only be called once if there was an error committing the
+ * transaction.
+ */
+ protected abstract void internalOnRollBack() throws OseeCoreException;
+
+ /**
+ * Should not be called by application. This method will be called by the base class when required;
+ */
+ protected abstract int createGammaId() throws OseeCoreException;
+
+ /**
+ * Should not be called by application. This should only be called once after the transaction has been committed.
+ *
+ * @param events
+ */
+ protected abstract void internalAddToEvents(Collection<ArtifactTransactionModifiedEvent> events) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/SkynetTransaction.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/SkynetTransaction.java
new file mode 100644
index 00000000000..4df8ebd021e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/SkynetTransaction.java
@@ -0,0 +1,452 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.transaction;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.OseeDbConnection;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTransactionData;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTransactionData;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.event.ArtifactTransactionModifiedEvent;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTransactionData;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SkynetTransaction extends DbTransaction {
+ private static final String UPDATE_TXS_NOT_CURRENT =
+ "UPDATE osee_txs txs1 SET tx_current = " + TxChange.NOT_CURRENT.getValue() + " WHERE txs1.transaction_id = ? AND txs1.gamma_id = ?";
+ private static final String GET_EXISTING_ATTRIBUTE_IDS =
+ "SELECT att1.attr_id FROM osee_attribute att1, osee_artifact_version arv1, osee_txs txs1, osee_tx_details txd1 WHERE att1.attr_type_id = ? AND att1.art_id = ? AND att1.art_id = arv1.art_id AND arv1.gamma_id = txs1.gamma_id AND txs1.transaction_id = txd1.transaction_id AND txd1.branch_id <> ?";
+
+ private TransactionId transactionId;
+
+ private final CompositeKeyHashMap<Class<? extends BaseTransactionData>, Integer, BaseTransactionData> transactionDataItems =
+ new CompositeKeyHashMap<Class<? extends BaseTransactionData>, Integer, BaseTransactionData>();
+
+ private final HashCollection<String, Object[]> dataItemInserts = new HashCollection<String, Object[]>();
+ private final Map<Integer, String> dataInsertOrder = new HashMap<Integer, String>();
+
+ private final Branch branch;
+ private boolean madeChanges = false;
+ private boolean executedWithException = false;
+ private final String comment;
+
+ public SkynetTransaction(Branch branch) throws OseeCoreException {
+ this(branch, "");
+ }
+
+ public SkynetTransaction(Branch branch, String comment) throws OseeCoreException {
+ this.branch = branch;
+ this.comment = comment;
+ }
+
+ /**
+ * Reset state so transaction object can be re-used
+ */
+ private void reset() {
+ madeChanges = false;
+ executedWithException = false;
+ dataInsertOrder.clear();
+ transactionDataItems.clear();
+ dataItemInserts.clear();
+ transactionId = null;
+ }
+
+ /**
+ * @return the branch
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /**
+ * Performs branch validation checks
+ */
+ private void checkBranch(Artifact artifact) throws OseeStateException {
+ ensureCorrectBranch(artifact);
+ ensureBranchIsEditable(artifact);
+ }
+
+ /**
+ * Performs branch validation checks
+ */
+ private void checkBranch(RelationLink link) throws OseeStateException {
+ ensureCorrectBranch(link);
+ ensureBranchIsEditable(link);
+ }
+
+ private void ensureCorrectBranch(RelationLink link) throws OseeStateException {
+ if (!link.getBranch().equals(branch)) {
+ String msg =
+ String.format("The relation link [%s] is on branch [%s] but this transaction is for branch [%s]",
+ link.getRelationId(), link.getBranch(), branch);
+ throw new OseeStateException(msg);
+ }
+ }
+
+ private void ensureCorrectBranch(Artifact artifact) throws OseeStateException {
+ if (!artifact.getBranch().equals(branch)) {
+ String msg =
+ String.format("The artifact [%s] is on branch [%s] but this transaction is for branch [%s]",
+ artifact.getHumanReadableId(), artifact.getBranch(), branch);
+ throw new OseeStateException(msg);
+ }
+ }
+
+ private void ensureBranchIsEditable(RelationLink link) throws OseeStateException {
+ if (!link.getBranch().isEditable()) {
+ String msg =
+ String.format("The relation link [%s] is on a non-editable branch [%s]", link.getRelationId(),
+ link.getBranch());
+ throw new OseeStateException(msg);
+ }
+ }
+
+ private void ensureBranchIsEditable(Artifact artifact) throws OseeStateException {
+ if (!artifact.getBranch().isEditable()) {
+ String msg =
+ String.format("The artifact [%s] is on a non-editable branch [%s]", artifact.getHumanReadableId(),
+ artifact.getBranch());
+ throw new OseeStateException(msg);
+ }
+ }
+
+ private void fetchTxNotCurrent(OseeConnection connection, BaseTransactionData transactionData, List<Object[]> results) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement(connection);
+ try {
+ String query = ClientSessionManager.getSQL(transactionData.getSelectTxNotCurrentSql());
+ chStmt.runPreparedQuery(query, transactionData.getItemId(), this.branch.getBranchId());
+ while (chStmt.next()) {
+ results.add(new Object[] {chStmt.getInt("transaction_id"), chStmt.getLong("gamma_id")});
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void executeTransactionDataItems(OseeConnection connection) throws OseeCoreException {
+ if (transactionDataItems.isEmpty()) {
+ return;
+ }
+
+ List<Object[]> txNotCurrentData = new ArrayList<Object[]>();
+ for (BaseTransactionData transactionData : transactionDataItems.values()) {
+ // Collect inserts for attribute, relation, artifact, and artifact version tables
+ transactionData.addInsertToBatch(this);
+
+ // Collect stale tx currents for batch update
+ fetchTxNotCurrent(connection, transactionData, txNotCurrentData);
+ }
+
+ // Insert into data tables - i.e. attribute, relation and artifact version tables
+ List<Integer> keys = new ArrayList<Integer>(dataInsertOrder.keySet());
+ Collections.sort(keys);
+ for (int priority : keys) {
+ String sqlKey = dataInsertOrder.get(priority);
+ ConnectionHandler.runBatchUpdate(connection, sqlKey, (List<Object[]>) dataItemInserts.getValues(sqlKey));
+ }
+
+ // Set stale tx currents in txs table
+ ConnectionHandler.runBatchUpdate(connection, UPDATE_TXS_NOT_CURRENT, txNotCurrentData);
+ }
+
+ void internalAddInsertToBatch(int insertPriority, String insertSql, Object... data) {
+ dataItemInserts.put(insertSql, data);
+ dataInsertOrder.put(insertPriority, insertSql);
+ }
+
+ @Override
+ public void execute() throws OseeCoreException {
+ if (madeChanges) {
+ super.execute();
+ } else {
+ OseeDbConnection.reportTxStart(this);
+ OseeDbConnection.reportTxEnd(this);
+ }
+ }
+
+ /**
+ * @return the transaction number.
+ * @throws OseeDataStoreException
+ */
+ public int getTransactionNumber() throws OseeCoreException {
+ return internalGetTransactionId().getTransactionNumber();
+ }
+
+ /**
+ * @return Returns the transactionId.
+ * @throws OseeDataStoreException
+ */
+ TransactionId internalGetTransactionId() throws OseeCoreException {
+ if (transactionId == null) {
+ transactionId = TransactionIdManager.createNextTransactionId(branch, UserManager.getUser(), comment);
+ }
+ return transactionId;
+ }
+
+ public void addArtifact(Artifact artifact) throws OseeCoreException {
+ checkBranch(artifact);
+ ModificationType modificationType = artifact.getModType();
+
+ if (artifact.isDeleted()) {
+ if (!artifact.isInDb()) {
+ return;
+ }
+ } else {
+ if (modificationType != ModificationType.INTRODUCED) {
+ if (artifact.isInDb()) {
+ modificationType = ModificationType.MODIFIED;
+ } else {
+ modificationType = ModificationType.NEW;
+ }
+ }
+ }
+
+ madeChanges = true;
+ addArtifactHelper(artifact, modificationType);
+
+ if (artifact.anAttributeIsDirty()) {
+ // Add Attributes to Transaction
+ for (Attribute<?> attribute : artifact.internalGetAttributes()) {
+ if (attribute != null) { // TODO: is it really possible to get a null in the attribute list and if so WHY!!!
+ if (attribute.isDirty()) {
+ addAttribute(artifact, attribute);
+ }
+ }
+ }
+ }
+ }
+
+ private void addArtifactHelper(Artifact artifact, ModificationType modificationType) throws OseeCoreException {
+ BaseTransactionData txItem = transactionDataItems.get(ArtifactTransactionData.class, artifact.getArtId());
+ if (txItem == null) {
+ txItem = new ArtifactTransactionData(artifact, modificationType);
+ transactionDataItems.put(ArtifactTransactionData.class, artifact.getArtId(), txItem);
+ } else {
+ updateTxItem(txItem, modificationType);
+ }
+
+ }
+
+ private void addAttribute(Artifact artifact, Attribute<?> attribute) throws OseeCoreException {
+ ModificationType modificationType = attribute.getModificationType();
+
+ if (attribute.isDeleted()) {
+ if (!attribute.isInDb()) {
+ return;
+ }
+ } else {
+ if (artifact.getModType() == ModificationType.INTRODUCED) {
+ modificationType = ModificationType.INTRODUCED;
+ } else {
+ if (attribute.isInDb()) {
+ modificationType = ModificationType.MODIFIED;
+ } else {
+ modificationType = ModificationType.NEW;
+ }
+ }
+ }
+ addAttributeHelper(artifact, attribute, modificationType);
+ }
+
+ /**
+ * @param artifact
+ * @param attribute
+ * @param modificationType
+ * @throws OseeDataStoreException
+ */
+ private void addAttributeHelper(Artifact artifact, Attribute<?> attribute, ModificationType modificationType) throws OseeDataStoreException {
+ if (attribute.getAttrId() == 0) {
+ attribute.internalSetAttributeId(getNewAttributeId(artifact, attribute));
+ }
+
+ BaseTransactionData txItem = transactionDataItems.get(AttributeTransactionData.class, attribute.getAttrId());
+ if (txItem == null) {
+ txItem = new AttributeTransactionData(attribute, modificationType);
+ transactionDataItems.put(AttributeTransactionData.class, attribute.getAttrId(), txItem);
+ } else {
+ updateTxItem(txItem, modificationType);
+ }
+ }
+
+ private int getNewAttributeId(Artifact artifact, Attribute<?> attribute) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ AttributeType attributeType = attribute.getAttributeType();
+ int attrId = -1;
+ // reuse an existing attribute id when there should only be a max of one and it has already been created on another branch
+ if (attributeType.getMaxOccurrences() == 1) {
+ try {
+ chStmt.runPreparedQuery(GET_EXISTING_ATTRIBUTE_IDS, attributeType.getAttrTypeId(), artifact.getArtId(),
+ artifact.getBranch().getBranchId());
+
+ if (chStmt.next()) {
+ attrId = chStmt.getInt("attr_id");
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ if (attrId < 1) {
+ attrId = SequenceManager.getNextAttributeId();
+ }
+ return attrId;
+ }
+
+ public void addRelation(RelationLink link) throws OseeCoreException {
+ checkBranch(link);
+ madeChanges = true;
+ link.setNotDirty();
+
+ ModificationType modificationType;
+
+ if (link.isInDb()) {
+ if (link.isDeleted()) {
+ Artifact aArtifact = ArtifactCache.getActive(link.getAArtifactId(), link.getABranch());
+ Artifact bArtifact = ArtifactCache.getActive(link.getBArtifactId(), link.getBBranch());
+
+ if (aArtifact != null && aArtifact.isDeleted() || bArtifact != null && bArtifact.isDeleted()) {
+ modificationType = ModificationType.ARTIFACT_DELETED;
+ } else {
+ modificationType = ModificationType.DELETED;
+ }
+ } else {
+ modificationType = ModificationType.MODIFIED;
+ }
+ } else {
+ if (link.isDeleted()) {
+ return;
+ }
+
+ Artifact aArtifact = link.getArtifact(RelationSide.SIDE_A);
+ if (!aArtifact.isInDb()) {
+ aArtifact.persistAttributesAndRelations(this);
+ }
+ Artifact bArtifact = link.getArtifact(RelationSide.SIDE_B);
+ if (!bArtifact.isInDb()) {
+ bArtifact.persistAttributesAndRelations(this);
+ }
+
+ link.internalSetRelationId(SequenceManager.getNextRelationId());
+ modificationType = ModificationType.NEW;
+ }
+
+ BaseTransactionData txItem = transactionDataItems.get(RelationTransactionData.class, link.getRelationId());
+ if (txItem == null) {
+ txItem = new RelationTransactionData(link, modificationType);
+ transactionDataItems.put(RelationTransactionData.class, link.getRelationId(), txItem);
+ } else {
+ updateTxItem(txItem, modificationType);
+ }
+ }
+
+ boolean isInTransaction(Class<? extends BaseTransactionData> clazz, int id) {
+ return transactionDataItems.containsKey(clazz, id);
+ }
+
+ private void updateTxItem(BaseTransactionData itemToCheck, ModificationType currentModType) {
+ if (itemToCheck.getModificationType() == ModificationType.NEW && currentModType.isDeleted()) {
+ transactionDataItems.remove(itemToCheck.getClass(), itemToCheck.getItemId());
+ } else {
+ itemToCheck.setModificationType(currentModType);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxWork(java.sql.OseeConnection)
+ */
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ executeTransactionDataItems(connection);
+ BranchManager.setBranchState(connection, branch, BranchState.MODIFIED);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.core.transaction.DbTransaction#handleTxException(java.lang.Exception)
+ */
+ @Override
+ protected void handleTxException(Exception ex) {
+ executedWithException = true;
+ for (BaseTransactionData transactionData : transactionDataItems.values()) {
+ try {
+ transactionData.internalOnRollBack();
+ } catch (OseeCoreException ex1) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex1);
+ }
+ }
+ }
+
+ private void updateModifiedCachedObject() throws OseeCoreException {
+ Collection<ArtifactTransactionModifiedEvent> xModifiedEvents = new ArrayList<ArtifactTransactionModifiedEvent>();
+
+ // Update all transaction items before collecting events
+ for (BaseTransactionData transactionData : transactionDataItems.values()) {
+ transactionData.internalUpdate(internalGetTransactionId());
+ }
+
+ // Collect events before clearing any dirty flags
+ for (BaseTransactionData transactionData : transactionDataItems.values()) {
+ transactionData.internalAddToEvents(xModifiedEvents);
+ }
+
+ // Clear all dirty flags
+ for (BaseTransactionData transactionData : transactionDataItems.values()) {
+ transactionData.internalClearDirtyState();
+ }
+
+ if (xModifiedEvents.size() > 0) {
+ OseeEventManager.kickTransactionEvent(this, xModifiedEvents);
+ xModifiedEvents.clear();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.db.connection.DbTransaction#handleTxFinally()
+ */
+ @Override
+ protected void handleTxFinally() throws OseeCoreException {
+ if (!executedWithException) {
+ updateModifiedCachedObject();
+ }
+ reset();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionId.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionId.java
new file mode 100644
index 00000000000..60562584c61
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionId.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.transaction;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Date;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * Describes information associated with a transaction.
+ *
+ * @author Jeff C. Phillips
+ */
+public class TransactionId implements Serializable, IAdaptable {
+ private static final long serialVersionUID = 7295589339029402964L;
+ private int transactionNumber;
+ private final Branch branch;
+ private final String comment;
+ private final Date time;
+ private final int authorArtId;
+ private final int commitArtId;
+ private final TransactionDetailsType txType;
+
+ /**
+ * @param transactionNumber
+ * @param branch
+ * @param comment
+ */
+ public TransactionId(int transactionNumber, Branch branch, String comment, Date time, int authorArtId, int commitArtId, TransactionDetailsType txType) {
+ this.transactionNumber = transactionNumber;
+ this.branch = branch;
+ this.comment = comment;
+ this.time = time;
+ this.authorArtId = authorArtId;
+ this.commitArtId = commitArtId;
+ this.txType = txType;
+ }
+
+ /**
+ * @return Returns the branch.
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /**
+ * @return Returns the branch id.
+ */
+ public int getBranchId() {
+ return branch.getBranchId();
+ }
+
+ /**
+ * @return Returns the transactionId.
+ */
+ public int getTransactionNumber() {
+ return transactionNumber;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return branch + ": " + transactionNumber;
+ }
+
+ /**
+ * @return Returns the comment.
+ */
+ public String getComment() {
+ return comment;
+ }
+
+ /**
+ * Only store the transaction number since the transaction Id manager controls these.
+ *
+ * @param stream
+ * @throws IOException
+ */
+ private void writeObject(ObjectOutputStream stream) throws IOException {
+ stream.writeInt(transactionNumber);
+ }
+
+ /**
+ * Initialize as a dumb object for portraying the transactionNumber
+ *
+ * @param stream
+ * @throws IOException
+ */
+ private void readObject(ObjectInputStream stream) throws IOException {
+ transactionNumber = stream.readInt();
+ }
+
+ /**
+ * @return The TransactionId associated with the transactionNumber
+ * @throws OseeDataStoreException
+ * @throws TransactionDoesNotExist
+ * @throws BranchDoesNotExist
+ */
+ private Object readResolve() throws OseeCoreException {
+ return TransactionIdManager.getTransactionId(transactionNumber);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof TransactionId) {
+ TransactionId other = ((TransactionId) obj);
+ return other.transactionNumber == transactionNumber;
+ }
+
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 37 * result + transactionNumber;
+ return result;
+ }
+
+ /**
+ * @return the time
+ */
+ public Date getTime() {
+ return time;
+ }
+
+ /**
+ * @return the authorArtId
+ */
+ public int getAuthorArtId() {
+ return authorArtId;
+ }
+
+ /**
+ * @return the commitArtId
+ */
+ public int getCommitArtId() {
+ return commitArtId;
+ }
+
+ /**
+ * @return the txType
+ */
+ public TransactionDetailsType getTxType() {
+ return txType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionIdManager.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionIdManager.java
new file mode 100644
index 00000000000..353478f46cc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/transaction/TransactionIdManager.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.transaction;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TXD_COMMENT;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeSql;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.core.SequenceManager;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.TransactionDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.time.GlobalTime;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+
+/**
+ * Manages a cache of <code>TransactionId</code>.
+ *
+ * @author Jeff C. Phillips
+ */
+public final class TransactionIdManager {
+
+ private static final String INSERT_INTO_TRANSACTION_DETAIL =
+ "INSERT INTO osee_tx_details (transaction_id, osee_comment, time, author, branch_id, tx_type) VALUES (?, ?, ?, ?, ?, ?)";
+ private static final String SELECT_TRANSACTIONS =
+ "SELECT " + TRANSACTION_DETAIL_TABLE.columns("transaction_id", "commit_art_id", TXD_COMMENT, "time", "author",
+ "branch_id", "tx_type") + " FROM " + TRANSACTION_DETAIL_TABLE + " WHERE " + TRANSACTION_DETAIL_TABLE.column("branch_id") + " = ?" + " ORDER BY transaction_id DESC";
+
+ private static final String SELECT_COMMIT_TRANSACTIONS =
+ "SELECT transaction_id from osee_tx_details where commit_art_id = ?";
+
+ private final Map<Integer, TransactionId> transactionIdCache = new HashMap<Integer, TransactionId>();
+ private static final TransactionIdManager instance = new TransactionIdManager();
+ private static final HashMap<Artifact, List<TransactionId>> commitArtifactMap =
+ new HashMap<Artifact, List<TransactionId>>();
+
+ private TransactionIdManager() {
+ }
+
+ public static List<TransactionId> getTransactionsForBranch(Branch branch) throws OseeCoreException {
+ ArrayList<TransactionId> transactions = new ArrayList<TransactionId>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(SELECT_TRANSACTIONS, branch.getBranchId());
+
+ while (chStmt.next()) {
+ transactions.add(getTransactionId(chStmt.getInt("transaction_id"), chStmt));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return transactions;
+ }
+
+ public synchronized static Collection<TransactionId> getCommittedArtifactTransactionIds(Artifact artifact) throws OseeCoreException {
+ List<TransactionId> transactionIds = commitArtifactMap.get(artifact);
+ if (transactionIds == null) {
+ transactionIds = new ArrayList<TransactionId>(5);
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_COMMIT_TRANSACTIONS, artifact.getArtId());
+ while (chStmt.next()) {
+ transactionIds.add(getTransactionId(chStmt.getInt("transaction_id")));
+ }
+ commitArtifactMap.put(artifact, transactionIds);
+ } finally {
+ chStmt.close();
+ }
+ }
+ return transactionIds;
+ }
+
+ public synchronized static void cacheCommittedArtifactTransaction(Artifact artifact, TransactionId transactionId) throws OseeCoreException {
+ Collection<TransactionId> transactionIds = getCommittedArtifactTransactionIds(artifact);
+ if (!transactionIds.contains(transactionId)) {
+ transactionIds.add(transactionId);
+ }
+ }
+
+ /**
+ * @param branch
+ * @return the largest (most recent) transaction on the given branch
+ * @throws OseeCoreException
+ */
+ public static TransactionId getlatestTransactionForBranch(Branch branch) throws OseeCoreException {
+ int transactionNumber =
+ ConnectionHandler.runPreparedQueryFetchInt(-1,
+ ClientSessionManager.getSQL(OseeSql.Transaction.SELECT_MAX_AS_LARGEST_TX), branch.getBranchId());
+ if (transactionNumber == -1) {
+ throw new TransactionDoesNotExist("No transactions where found in the database for branch: " + branch);
+ }
+ return getTransactionId(transactionNumber);
+ }
+
+ public static synchronized TransactionId createNextTransactionId(Branch branch, User userToBlame, String comment) throws OseeDataStoreException {
+ Integer transactionNumber = SequenceManager.getNextTransactionId();
+ if (comment == null) {
+ comment = "";
+ }
+ int authorArtId = userToBlame.getArtId();
+
+ Date transactionTime = GlobalTime.GreenwichMeanTimestamp();
+ ConnectionHandler.runPreparedUpdate(INSERT_INTO_TRANSACTION_DETAIL, transactionNumber, comment, transactionTime,
+ authorArtId, branch.getBranchId(), TransactionDetailsType.NonBaselined.getId());
+
+ TransactionId transactionId =
+ new TransactionId(transactionNumber, branch, comment, transactionTime, authorArtId, -1,
+ TransactionDetailsType.NonBaselined);
+
+ instance.transactionIdCache.put(transactionNumber, transactionId);
+ return transactionId;
+ }
+
+ public static Pair<TransactionId, TransactionId> getStartEndPoint(Branch branch) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Transaction.SELECT_MAX_AND_MIN_TX),
+ branch.getBranchId());
+
+ // the max, min query will return exactly 1 row by definition (even if there is no max or min)
+ chStmt.next();
+
+ int minId = chStmt.getInt("min_id");
+ int maxId = chStmt.getInt("max_id");
+
+ if (chStmt.wasNull()) {
+ throw new TransactionDoesNotExist("Branch " + branch + " has no transactions");
+ }
+
+ return new Pair<TransactionId, TransactionId>(getTransactionId(minId), getTransactionId(maxId));
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /**
+ * @param transactionId
+ * @return The prior transactionId, or null if there is no prior.
+ * @throws BranchDoesNotExist
+ * @throws TransactionDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public static TransactionId getPriorTransaction(TransactionId transactionId) throws OseeCoreException {
+ TransactionId priorTransactionId = null;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(
+ "SELECT max(transaction_id) as prior_id FROM " + TRANSACTION_DETAIL_TABLE + " WHERE " + TRANSACTION_DETAIL_TABLE.column("branch_id") + " = ? " + " AND " + TRANSACTION_DETAIL_TABLE.column("transaction_id") + " < ?",
+ transactionId.getBranch().getBranchId(), transactionId.getTransactionNumber());
+
+ if (chStmt.next()) {
+ int priorId = chStmt.getInt("prior_id");
+ if (chStmt.wasNull()) {
+ throw new TransactionDoesNotExist("the prior transation id was null");
+ }
+ priorTransactionId = getTransactionId(priorId);
+ }
+ } finally {
+ chStmt.close();
+ }
+ return priorTransactionId;
+ }
+
+ public static TransactionId getTransactionId(int transactionNumber) throws OseeCoreException {
+ return getTransactionId(transactionNumber, null);
+ }
+
+ public static TransactionId getTransactionId(ConnectionHandlerStatement chStmt) throws OseeCoreException {
+ return getTransactionId(chStmt.getInt("transaction_id"), chStmt);
+ }
+
+ private synchronized static TransactionId getTransactionId(int transactionNumber, ConnectionHandlerStatement chStmt) throws OseeCoreException {
+ TransactionId transactionId = instance.transactionIdCache.get(transactionNumber);
+ boolean useLocalConnection = chStmt == null;
+ if (transactionId == null) {
+ try {
+ if (useLocalConnection) {
+ chStmt = new ConnectionHandlerStatement();
+ chStmt.runPreparedQuery(ClientSessionManager.getSQL(OseeSql.Transaction.SELECT_ALL_TRANSACTIONS),
+ transactionNumber);
+ if (!chStmt.next()) {
+ throw new TransactionDoesNotExist(
+ "The transaction id " + transactionNumber + " does not exist in the databse.");
+ }
+ }
+ Branch branch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+ TransactionDetailsType txType = TransactionDetailsType.toEnum(chStmt.getInt("tx_type"));
+
+ transactionId =
+ new TransactionId(transactionNumber, branch, chStmt.getString("osee_comment"),
+ chStmt.getTimestamp("time"), chStmt.getInt("author"), chStmt.getInt("commit_art_id"), txType);
+ instance.transactionIdCache.put(transactionNumber, transactionId);
+ } finally {
+ if (useLocalConnection) {
+ chStmt.close();
+ }
+ }
+ }
+ return transactionId;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/AIFile.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/AIFile.java
new file mode 100644
index 00000000000..af115c23f85
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/AIFile.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.framework.skynet.core.utility;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.io.Streams;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AIFile {
+
+ public static void writeToFile(IFile file, InputStream in) throws OseeCoreException {
+ try {
+ if (file.exists()) {
+ file.setCharset("UTF-8", new NullProgressMonitor());
+ file.setContents(in, true, false, null); // steam will be closed before return
+ } else {
+ file.create(in, true, null);
+ in.close();
+ }
+ } catch (CoreException ex) {
+ throw new OseeCoreException(ex);
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ public static void writeToFile(IFile file, String string) throws OseeCoreException {
+ writeToFile(file, string, "UTF-8");
+ }
+
+ public static void writeToFile(IFile file, String string, String charcode) throws OseeCoreException {
+ try {
+ writeToFile(file, Streams.convertStringToInputStream(string, charcode));
+ } catch (UnsupportedEncodingException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ public static IFile constructIFile(String fullPath) {
+ IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+ IFile[] files = workspaceRoot.findFilesForLocation(Path.fromOSString(fullPath));
+ if (files == null || files.length == 0) return null;
+ return workspaceRoot.findFilesForLocation(Path.fromOSString(fullPath))[0];
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Artifacts.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Artifacts.java
new file mode 100644
index 00000000000..217acb79637
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Artifacts.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.framework.skynet.core.utility;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * Utility methods for common tasks performed on Artifact's.
+ *
+ * @author Robert A. Fisher
+ * @author Donald G. Dunne
+ */
+public final class Artifacts {
+
+ private Artifacts() {
+ // This constructor is private because there is no reason to instantiate this class
+ }
+
+ public static String commaArts(Collection<? extends Artifact> artifacts) {
+ return toTextList(artifacts, ", ");
+ }
+
+ public static String semmicolonArts(Collection<? extends Artifact> artifacts) {
+ return toTextList(artifacts, "; ");
+ }
+
+ public static String toString(String separator, Collection<? extends Artifact> artifacts) {
+ return toTextList(artifacts, separator);
+ }
+
+ public static Artifact getOrCreateArtifact(Branch branch, String artifactTypeName, String name) throws OseeCoreException {
+ String cacheKey = artifactTypeName + "." + name;
+ Artifact artifact = ArtifactCache.getByTextId(cacheKey, branch);
+
+ if (artifact == null) {
+ artifact = ArtifactQuery.checkArtifactFromTypeAndName(artifactTypeName, name, branch);
+ if (artifact == null) {
+ artifact = ArtifactTypeManager.addArtifact(artifactTypeName, branch, name);
+ }
+ ArtifactCache.putByTextId(cacheKey, artifact);
+ }
+ return artifact;
+ }
+
+ public static String toTextList(Collection<? extends Artifact> artifacts, String separator) {
+ StringBuilder sb = new StringBuilder();
+ for (Artifact art : artifacts) {
+ sb.append(art.getDescriptiveName());
+ sb.append(separator);
+ }
+ if (sb.length() > separator.length()) {
+ return sb.substring(0, sb.length() - separator.length());
+ }
+ return "";
+ }
+
+ public static Collection<String> artNames(Collection<? extends Artifact> arts) {
+ ArrayList<String> names = new ArrayList<String>();
+ for (Artifact art : arts)
+ names.add(art.getDescriptiveName());
+ return names;
+ }
+
+ public static void persistInTransaction(final Collection<? extends Artifact> artifacts) throws OseeCoreException {
+ persistInTransaction(artifacts.toArray(new Artifact[artifacts.size()]));
+ }
+
+ public static void persistInTransaction(Artifact... artifacts) throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(artifacts[0].getBranch());
+ for (Artifact art : artifacts) {
+ art.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+ }
+
+ public static void persistInTransaction(String comment, Artifact... artifacts) throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(artifacts[0].getBranch(), comment);
+ for (Artifact art : artifacts) {
+ art.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+ }
+
+ /**
+ * Recurses default hierarchy and collections children of parentArtifact that are of type class
+ *
+ * @param <A>
+ * @param parentArtifact
+ * @param children
+ * @param clazz
+ * @param recurse TODO
+ * @throws OseeDataStoreException
+ */
+ @SuppressWarnings("unchecked")
+ public static <A extends Artifact> void getChildrenOfType(Artifact parentArtifact, Collection<A> children, Class<A> clazz, boolean recurse) throws OseeCoreException {
+ for (Artifact child : parentArtifact.getChildren()) {
+ if (child.getClass().equals(clazz)) {
+ children.add((A) child);
+ if (recurse) getChildrenOfType(child, children, clazz, recurse);
+ }
+ }
+ }
+
+ /**
+ * @return Set of type class that includes parentArtifact and children and will recurse children if true
+ */
+ @SuppressWarnings("unchecked")
+ public static <A extends Artifact> Set<A> getChildrenAndThisOfTypeSet(Artifact parentArtifact, Class<A> clazz, boolean recurse) throws OseeCoreException {
+ Set<A> thisAndChildren = new HashSet<A>();
+ if (parentArtifact.getClass().equals(clazz)) {
+ thisAndChildren.add((A) parentArtifact);
+ }
+ getChildrenOfTypeSet(parentArtifact, clazz, recurse);
+ return thisAndChildren;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <A extends Artifact> Set<A> getChildrenOfTypeSet(Artifact parentArtifact, Class<A> clazz, boolean recurse) throws OseeCoreException {
+ Set<A> children = new HashSet<A>();
+ for (Artifact child : parentArtifact.getChildren()) {
+ if (child.getClass().equals(clazz)) {
+ children.add((A) child);
+ if (recurse) getChildrenOfType(child, children, clazz, recurse);
+ }
+ }
+ return children;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/CsvArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/CsvArtifact.java
new file mode 100644
index 00000000000..f800ad0c54f
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/CsvArtifact.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.framework.skynet.core.utility;
+
+import java.io.IOException;
+import java.io.InputStream;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+
+/**
+ * Supports the loading, modifying and saving of General Document artifacts of extension csv
+ *
+ * @author Donald G. Dunne
+ */
+public class CsvArtifact {
+
+ private final NativeArtifact artifact;
+
+ /**
+ * @return the artifact
+ */
+ public NativeArtifact getArtifact() {
+ return artifact;
+ }
+
+ public CsvArtifact(NativeArtifact nativeArtifact) {
+ this.artifact = nativeArtifact;
+ }
+
+ public void setCsvData(String csvData) throws OseeCoreException {
+ artifact.setSoleAttributeFromString(NativeArtifact.CONTENT_NAME, csvData);
+ }
+
+ public String getCsvData() throws OseeCoreException {
+ InputStream inputStream = artifact.getNativeContent();
+ try {
+ String data = Lib.inputStreamToString(inputStream);
+ return data;
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ public void appendData(String csvData) throws OseeCoreException {
+ InputStream inputStream = artifact.getNativeContent();
+ try {
+ String data = Lib.inputStreamToString(inputStream);
+ data.replaceFirst("\n+$", "");
+ data = data + "\n" + csvData;
+ setCsvData(data);
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /**
+ * Creates a new un-persisted CsvArtifact
+ *
+ * @param staticId
+ * @param artifactName
+ * @param csvData
+ * @param branch
+ * @throws OseeCoreException
+ */
+ public static CsvArtifact generateCsvArtifact(String staticId, String artifactName, String csvData, Branch branch) throws OseeCoreException {
+ NativeArtifact artifact = (NativeArtifact) ArtifactTypeManager.addArtifact("General Document", branch);
+ artifact.setDescriptiveName(artifactName);
+ artifact.setSoleAttributeValue("Extension", "csv");
+ artifact.setSoleAttributeFromString(NativeArtifact.CONTENT_NAME, csvData);
+ StaticIdManager.setSingletonAttributeValue(artifact, staticId);
+ return new CsvArtifact(artifact);
+ }
+
+ public static CsvArtifact getCsvArtifact(String staticId, Branch branch, boolean create) throws OseeCoreException {
+ Artifact art = StaticIdManager.getSingletonArtifact("General Document", staticId, branch);
+ if (art != null) return new CsvArtifact((NativeArtifact) art);
+ return generateCsvArtifact(staticId, staticId, "", branch);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/DbUtil.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/DbUtil.java
new file mode 100644
index 00000000000..3a37eb34ea3
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/DbUtil.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.framework.skynet.core.utility;
+
+import java.util.Collection;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DbUtil {
+
+ public static void getTableRowCounts(Map<String, Integer> tableCount, Collection<String> tableNames) throws OseeDataStoreException {
+ for (String tableName : tableNames) {
+ tableCount.put(tableName, getTableRowCount(tableName));
+ }
+ }
+
+ public static int getTableRowCount(String tableName) throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchInt(0, "SELECT count(1) FROM " + tableName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeEvent.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeEvent.java
new file mode 100644
index 00000000000..8d9bf19683a
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeEvent.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.framework.skynet.core.utility;
+
+import java.io.File;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class FileChangeEvent {
+ private final File file;
+ private final FileChangeType changeType;
+
+ /**
+ * @param file
+ * @param changeType
+ */
+ public FileChangeEvent(File file, FileChangeType changeType) {
+ this.file = file;
+ this.changeType = changeType;
+ }
+
+ /**
+ * @return the file
+ */
+ public File getFile() {
+ return file;
+ }
+
+ /**
+ * @return the changeType
+ */
+ public FileChangeType getChangeType() {
+ return changeType;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeType.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeType.java
new file mode 100644
index 00000000000..6b3332e8525
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileChangeType.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.framework.skynet.core.utility;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum FileChangeType {
+ CREATED, MODIFIED, DELETED
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileWatcher.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileWatcher.java
new file mode 100644
index 00000000000..b8078340318
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/FileWatcher.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.utility;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class FileWatcher extends TimerTask {
+ private final long interval;
+ private final Timer timer = new Timer();
+
+ protected final HashMap<File, Long> filesToWatch = new HashMap<File, Long>(128);
+ private final HashSet<IFileWatcherListener> listeners = new HashSet<IFileWatcherListener>();
+
+ public FileWatcher(long time, TimeUnit unit) {
+ interval = unit.toMillis(time);
+ }
+
+ /**
+ * Starts the file watcher monitoring of the file system
+ */
+ public void start() {
+ timer.schedule(this, interval, interval);
+ }
+
+ /**
+ * adds a {@link File} to the files to be monitored. This method can be called before or after the {@link #start()}
+ * method is called.
+ *
+ * @param file
+ */
+ public synchronized void addFile(File file) {
+ filesToWatch.put(file, file.lastModified());
+ }
+
+ /**
+ * removes a {@link File} from the set of files to be monitored. This method can be called before or after the
+ * {@link #start()} method is called.
+ *
+ * @param file
+ * @return returns the last know timestamp of the file before it was removed or null if it was never being monitored
+ * in the first place
+ */
+ public synchronized Long removeFile(File file) {
+ return filesToWatch.remove(file);
+ }
+
+ /**
+ * registers a listener who will be notified of file change events. This method can be called before or after the
+ * {@link #start()} method is called.
+ *
+ * @param listener
+ */
+ public synchronized void addListener(IFileWatcherListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * unregisters a listener from receiving file change events. This method can be called before or after the
+ * {@link #start()} method is called.
+ *
+ * @param listener
+ */
+ public synchronized void removeListener(IFileWatcherListener listener) {
+ listeners.remove(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.TimerTask#run()
+ */
+ @Override
+ public synchronized void run() {
+ try {
+ LinkedList<FileChangeEvent> fileChangeEvents = new LinkedList<FileChangeEvent>();
+ for (Map.Entry<File, Long> entry : filesToWatch.entrySet()) {
+ Long latestLastModified = entry.getKey().lastModified();
+ Long storedLastModified = entry.getValue();
+ if (!storedLastModified.equals(latestLastModified)) {
+ entry.setValue(latestLastModified);
+ if (storedLastModified == 0) {
+ // created
+ assert entry.getKey().exists() : "file doesn't exist";
+ fileChangeEvents.add(new FileChangeEvent(entry.getKey(), FileChangeType.CREATED));
+ } else if (latestLastModified == 0) {
+ // deleted
+ assert !entry.getKey().exists() : "file still exist";
+ fileChangeEvents.add(new FileChangeEvent(entry.getKey(), FileChangeType.DELETED));
+ } else {
+ // modified
+ assert entry.getKey().exists() : "file doesn't exist";
+ fileChangeEvents.add(new FileChangeEvent(entry.getKey(), FileChangeType.MODIFIED));
+ }
+
+ }
+ }
+ if (!fileChangeEvents.isEmpty()) {
+ // there is at least one file change event, notify listeners
+ for (IFileWatcherListener listener : listeners) {
+ listener.filesModified(fileChangeEvents);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static void main(String[] args) {
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+ FileWatcher watcher = new FileWatcher(2, TimeUnit.SECONDS);
+ watcher.addListener(new IFileWatcherListener() {
+
+ @Override
+ public void filesModified(Collection<FileChangeEvent> events) {
+ for (FileChangeEvent event : events) {
+ System.out.println(event.getChangeType().name() + ": " + event.getFile().getAbsolutePath());
+ }
+ }
+
+ });
+ File directory = new File("C:\\Documents and Settings\\b1529404\\Desktop\\watcher_test");
+ watcher.addFile(new File(directory, "f1.txt"));
+ watcher.addFile(new File(directory, "f2.txt"));
+ watcher.addFile(new File(directory, "f3.txt"));
+ watcher.start();
+ try {
+ while (!reader.readLine().equals("QUIT")) {
+
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ watcher.dispose();
+ }
+
+ public void dispose() {
+ timer.cancel();
+ listeners.clear();
+ filesToWatch.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/IFileWatcherListener.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/IFileWatcherListener.java
new file mode 100644
index 00000000000..e86db20c4c9
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/IFileWatcherListener.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.framework.skynet.core.utility;
+
+import java.util.Collection;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IFileWatcherListener {
+
+ void filesModified(Collection<FileChangeEvent> fileChangeEvents);
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/LoadedArtifacts.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/LoadedArtifacts.java
new file mode 100644
index 00000000000..5321c22d853
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/LoadedArtifacts.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.utility;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.event.UnloadedArtifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class LoadedArtifacts {
+
+ private Set<Artifact> artifacts;
+ private final Collection<UnloadedArtifact> unloadedArtifacts;
+ private Set<Integer> allArtifactIds;
+ private Set<Integer> allUnloadedArtifactIds;
+ private Set<Integer> allArtifactTypeIds;
+
+ /**
+ * Called when network event passes artifactIds that may or may not be in current client's cache
+ *
+ * @param branchId
+ * @param artifactIds
+ * @param artifactTypeIds
+ */
+ public LoadedArtifacts(int branchId, Collection<Integer> artifactIds, Collection<Integer> artifactTypeIds) {
+ unloadedArtifacts = new ArrayList<UnloadedArtifact>();
+ int x = 0;
+ Integer[] artTypeIds = artifactTypeIds.toArray(new Integer[artifactTypeIds.size()]);
+ for (Integer artId : artifactIds) {
+ unloadedArtifacts.add(new UnloadedArtifact(branchId, artId, artTypeIds[x++]));
+ }
+ this.artifacts = null;
+ }
+
+ /**
+ * Called when local event is kicked. Since local, all artifacts are, by definition, cached
+ *
+ * @param artifacts
+ */
+ public LoadedArtifacts(Collection<? extends Artifact> artifacts) {
+ this.artifacts = new HashSet<Artifact>();
+ this.artifacts.addAll(artifacts);
+ unloadedArtifacts = new ArrayList<UnloadedArtifact>();
+ }
+
+ /**
+ * Called when local event is kicked. Since local, all artifacts are, by definition, cached
+ *
+ * @param artifacts
+ */
+ public LoadedArtifacts(Artifact artifact) {
+ this.artifacts = new HashSet<Artifact>();
+ if (artifact != null) this.artifacts.add(artifact);
+ unloadedArtifacts = new ArrayList<UnloadedArtifact>();
+ }
+
+ public static LoadedArtifacts EmptyLoadedArtifacts() {
+ return new LoadedArtifacts((Artifact) null);
+ }
+
+ public boolean isNotForBranch(Branch branch) throws OseeCoreException {
+ Collection<Artifact> loadedArtifacts = getLoadedArtifacts();
+ if (loadedArtifacts.size() > 0) {
+ return !getLoadedArtifacts().iterator().next().getBranch().equals(branch);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "LoadedArtifacts - " + (this.artifacts == null ? "" : this.artifacts.size() + " arts - ") + (this.unloadedArtifacts == null ? "" : this.unloadedArtifacts.size() + " unlodaded");
+ }
+
+ public Collection<Integer> getAllArtifactIds() {
+ if (allArtifactIds == null) {
+ allArtifactIds = new HashSet<Integer>(artifacts.size() + unloadedArtifacts.size());
+ for (Artifact artifact : this.artifacts) {
+ allArtifactIds.add(artifact.getArtId());
+ }
+ for (UnloadedArtifact unloadedArtifact : unloadedArtifacts) {
+ allArtifactIds.add(unloadedArtifact.getArtifactId());
+ }
+ }
+ return allArtifactIds;
+ }
+
+ public Collection<Integer> getAllArtifactTypeIds() {
+ if (allArtifactTypeIds == null) {
+ allArtifactTypeIds = new HashSet<Integer>();
+ for (Artifact artifact : this.artifacts) {
+ allArtifactTypeIds.add(artifact.getArtTypeId());
+ }
+ for (UnloadedArtifact unloadedArtifact : unloadedArtifacts) {
+ allArtifactTypeIds.add(unloadedArtifact.getArtifactTypeId());
+ }
+ }
+ return allArtifactTypeIds;
+ }
+
+ public Collection<Integer> getUnloadedArtifactIds() {
+ if (allUnloadedArtifactIds == null) {
+ allUnloadedArtifactIds = new HashSet<Integer>(unloadedArtifacts.size());
+ for (UnloadedArtifact unloadedArtifact : unloadedArtifacts) {
+ allUnloadedArtifactIds.add(unloadedArtifact.getArtifactId());
+ }
+ }
+ return allUnloadedArtifactIds;
+ }
+
+ public synchronized Collection<Artifact> getLoadedArtifacts() throws OseeCoreException {
+ // If artifacts have not been set, resolve any unloaded artifactIds that exist in current cache
+ if (artifacts == null) {
+ artifacts = new HashSet<Artifact>();
+ if (unloadedArtifacts.size() > 0) {
+ for (UnloadedArtifact unloadedArtifact : new CopyOnWriteArrayList<UnloadedArtifact>(unloadedArtifacts)) {
+ Artifact art =
+ ArtifactCache.getActive(unloadedArtifact.getArtifactId(),
+ BranchManager.getBranch(unloadedArtifact.getBranchId()));
+ if (art != null) {
+ unloadedArtifacts.remove(unloadedArtifact);
+ artifacts.add(art);
+ }
+
+ }
+ }
+ }
+ return artifacts;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/OseeData.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/OseeData.java
new file mode 100644
index 00000000000..c203c0d2a98
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/OseeData.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.utility;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+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.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * This class provides a front end to writing files to a common osee.data directory in the workspace. This dir is
+ * invisible to Eclipse Navigator and Package Explorer. It is provided as a common repository for files that need to be
+ * created and retained by any plugin, but don't need to be visible to the user. This class does nothing more than
+ * ensure the directory is created and provide a way to get the path for other plugins to use.
+ *
+ * @author Donald G. Dunne
+ */
+public class OseeData {
+ private static final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+ private static final IPath workspacePath = workspaceRoot.getLocation();
+ private static String oseeDataPathName = ".osee.data";
+ private static final IPath oseeDataPath = workspacePath.append(oseeDataPathName);
+ private static final File oseeDir = oseeDataPath.toFile();
+ private static IProject project;
+
+ static {
+ if (!oseeDir.exists()) {
+ if (!oseeDir.mkdir()) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Can't create " + oseeDataPathName + " dir.");
+ }
+ }
+
+ createProject();
+ }
+
+ public static IPath getPath() {
+ return oseeDataPath;
+ }
+
+ public static File getFile(String filename) {
+ return new File(oseeDir, filename);
+ }
+
+ public static IFile getIFile(String fileName) {
+ return project.getFile(fileName);
+ }
+
+ public static IFile getIFile(String fileName, InputStream in) throws OseeCoreException {
+ return getIFile(fileName, in, false);
+ }
+
+ public static IFile getIFile(String fileName, InputStream in, boolean overwrite) throws OseeCoreException {
+ IFile iFile = project.getFile(fileName);
+ if (!iFile.exists() || overwrite) {
+ AIFile.writeToFile(iFile, in);
+ }
+ return iFile;
+ }
+
+ public static File getWorkspaceFile(String path) {
+ return new File(workspaceRoot.getFile(new Path(path)).getLocation().toString());
+ }
+
+ private static boolean createProject() {
+ project = workspaceRoot.getProject(oseeDataPathName);
+ if (!project.exists()) {
+ try {
+ project.create(null);
+ } catch (CoreException ex) {
+ ex.printStackTrace();
+ return false;
+ }
+ }
+ try {
+ project.open(null);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @return Returns the project.
+ */
+ public static IProject getProject() {
+ return project;
+ }
+
+ public static IFolder getFolder(String name) throws OseeCoreException {
+ try {
+ IFolder folder = project.getFolder(name);
+
+ if (!folder.exists()) {
+ folder.create(true, true, null);
+ }
+ return folder;
+ } catch (CoreException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Requirements.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Requirements.java
new file mode 100644
index 00000000000..948e143f711
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/utility/Requirements.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.framework.skynet.core.utility;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Requirements {
+ public static String HARDWARE_REQUIREMENT = "Hardware Requirement";
+ public static String HARDWARE_REQUIREMENTS = "Hardware Requirements";
+ public static String SOFTWARE_REQUIREMENT = "Software Requirement";
+ public static String SOFTWARE_REQUIREMENTS = "Software Requirements";
+ public static String INDIRECT_SOFTWARE_REQUIREMENT = "Indirect Software Requirement";
+ public static String SYSTEM_REQUIREMENT = "System Requirement";
+ public static String SYSTEM_REQUIREMENTS = "System Requirements";
+ public static String SYSTEM_DESIGN = "System Design";
+ public static String SYSTEM_FUNCTION = "System Function";
+
+ public static String ABSTRACT_SOFTWARE_REQUIREMENT = "Abstract Software Requirement";
+
+ public static String SUBSYSTEM_REQUIREMENT = "Subsystem Requirement";
+ public static String SUBSYSTEM_REQUIREMENTS = "Subsystem Requirements";
+ public static String SUBSYSTEM_DESIGN = "Subsystem Design";
+ public static String SUBSYSTEM_FUNCTION = "Subsystem Function";
+
+ public static String SOFTWARE_DESIGN = "Software Design";
+ public static String SOFTWARE_FUNCTION = "Software Function";
+
+ public static String INTERFACE_REQUIREMENT = "Interface Requirement";
+ public static String COMPONENT = "Component";
+
+ public static String ABSTRACT_TEST_UNIT = "Abstract Test Unit";
+
+ public static String TEST_INFORMATION_SHEET = "Test Information Sheet";
+ public static String TEST_CASE = "Test Case";
+ public static String TEST_RUN = "Test Run";
+ public static String TEST_SUPPORT = "Test Support";
+
+ public static String TEST_SUPPORT_UNITS = TEST_SUPPORT + " Units";
+ public static String TEST_CASES = "Test Cases";
+ public static String TEST_PROCEDURE = "Test Procedure";
+
+ public static String CODE_UNIT = "Code Unit";
+ public static String SUBSYSTEM = "Subsystem";
+ public static String PARTITION = "Partition";
+ public static String CSCI = "CSCI";
+
+ public static boolean isSoftwareRequirement(Artifact artifact) {
+ return Requirements.ALL_SOFTWARES_REQUIREMENT_TYPES.contains(artifact.getArtifactTypeName());
+ }
+
+ public final static List<String> DIRECT_SOFTWARE_REQUIREMENT_TYPES =
+ Arrays.asList(SOFTWARE_REQUIREMENT, "Button Requirement", "UIG Artifact", "Stand Alone Local Data");
+
+ public final static List<String> ALL_SOFTWARES_REQUIREMENT_TYPES = new ArrayList<String>();
+ static {
+ ALL_SOFTWARES_REQUIREMENT_TYPES.addAll(DIRECT_SOFTWARE_REQUIREMENT_TYPES);
+ ALL_SOFTWARES_REQUIREMENT_TYPES.add(INDIRECT_SOFTWARE_REQUIREMENT);
+ }
+
+ public static List<String> ALL_TEST_UNIT_TYPES = Arrays.asList(TEST_CASE, TEST_SUPPORT);
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/IOseeValidator.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/IOseeValidator.java
new file mode 100644
index 00000000000..23751f82e8e
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/IOseeValidator.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.framework.skynet.core.validation;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+
+public interface IOseeValidator {
+
+ public static final int SHORT = 10;
+ public static final int MEDIUM = 50;
+ public static final int LONG = 100;
+
+ public int getQualityOfService();
+
+ public boolean isApplicable(Artifact artifact, AttributeType attributeType);
+
+ public IStatus validate(Artifact artifact, AttributeType attributeType, Object proposedObject) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/OseeValidator.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/OseeValidator.java
new file mode 100644
index 00000000000..a9d737b17bf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/validation/OseeValidator.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.framework.skynet.core.validation;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.internal.Activator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeValidator {
+ private static final String EXTENSION_ELEMENT = "OseeValidator";
+ private static final String EXTENSION_ID = Activator.PLUGIN_ID + "." + EXTENSION_ELEMENT;
+ private static final String CLASS_NAME_ATTRIBUTE = "classname";
+ private final static OseeValidator instance = new OseeValidator();
+
+ private final ExtensionDefinedObjects<IOseeValidator> loadedObjects;
+
+ private OseeValidator() {
+ loadedObjects =
+ new ExtensionDefinedObjects<IOseeValidator>(EXTENSION_ID, EXTENSION_ELEMENT, CLASS_NAME_ATTRIBUTE);
+ }
+
+ public static OseeValidator getInstance() {
+ return instance;
+ }
+
+ public IStatus validate(int requiredQualityOfService, Artifact artifact, String attributeTypeName, Object proposedValue) {
+ IStatus status = Status.OK_STATUS;
+ try {
+ AttributeType attributeType = AttributeTypeManager.getType(attributeTypeName);
+ status = validate(requiredQualityOfService, artifact, attributeType, proposedValue);
+ } catch (Exception ex) {
+ status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, ex.getLocalizedMessage(), ex);
+ }
+ return status;
+ }
+
+ public IStatus validate(int requiredQualityOfService, Artifact artifact, AttributeType attributeType, Object proposedValue) {
+ for (IOseeValidator validator : loadedObjects.getObjects()) {
+ try {
+ if (requiredQualityOfService >= validator.getQualityOfService()) {
+ if (validator.isApplicable(artifact, attributeType)) {
+ IStatus status = validator.validate(artifact, attributeType, proposedValue);
+ if (!status.isOK()) {
+ return status;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, ex.getLocalizedMessage(), ex);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ public IStatus validate(int requiredQualityOfService, Artifact artifact) {
+ try {
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ String attributeTypeName = attributeType.getName();
+ for (Attribute<?> attribute : artifact.getAttributes(attributeTypeName)) {
+ IStatus status =
+ validate(requiredQualityOfService, artifact, attributeType, (Object) attribute.getValue());
+ if (!status.isOK()) {
+ return status;
+ // String messageToUse =
+ // String.format("%s:[%s] - %s", artifact.getArtifactTypeName(), artifact.getDescriptiveName(),
+ // status.getMessage());
+ // if (status.isMultiStatus()) {
+ // MultiStatus mStatus =
+ // new MultiStatus(status.getPlugin(), status.getCode(), messageToUse, status.getException());
+ // mStatus.merge(status);
+ // return mStatus;
+ // } else {
+ // return new Status(status.getSeverity(), status.getPlugin(), status.getCode(), messageToUse,
+ // status.getException());
+ // }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, ex.getLocalizedMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+ // private void checkExtensionsLoaded() {
+ // if (loadedObjects.isEmpty()) {
+ // List<IConfigurationElement> elements = ExtensionPoints.getExtensionElements(EXTENSION_ID, EXTENSION_ELEMENT);
+ // for (IConfigurationElement element : elements) {
+ // // TODO Implement dynamic attribute type validation chain definition
+ // // IExtension extension = ((IExtension) element.getParent());
+ // // String identifier = extension.getUniqueIdentifier();
+ // String attributeTypeName = element.getAttribute(ATTRIBUTE_TYPENAME);
+ // String className = element.getAttribute(CLASS_NAME_ATTRIBUTE);
+ // String bundleName = element.getContributor().getName();
+ //
+ // if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ // try {
+ // Bundle bundle = Platform.getBundle(bundleName);
+ // Class<?> taskClass = bundle.loadClass(className);
+ // IOseeValidator object = null;
+ // try {
+ // Method getInstance = taskClass.getMethod("getInstance", new Class[] {});
+ // object = (IOseeValidator) getInstance.invoke(null, new Object[] {});
+ // } catch (Exception ex) {
+ // object = (IOseeValidator) taskClass.newInstance();
+ // }
+ // if (object != null) {
+ // AttributeType attributeType = AttributeTypeManager.getType(attributeTypeName);
+ // loadedObjects.put(attributeType, object);
+ // }
+ // } catch (Exception ex) {
+ // OseeLog.log(OseeActivator.class, Level.SEVERE, String.format("Unable to Load: [%s - %s]", bundleName,
+ // className), ex);
+ // }
+ // }
+ // }
+ // }
+ // }
+
+ // TODO Implement dynamic attribute type validation chain definition
+ // public List<IValidator> createValidateChain(String xml) {
+ // List<IValidator> validators = new ArrayList<IValidator>();
+ // return validators;
+ // }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordAnnotationHandler.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordAnnotationHandler.java
new file mode 100644
index 00000000000..ecdb59f78c8
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordAnnotationHandler.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.skynet.core.word;
+
+/**
+ * @author Theron Virgin
+ */
+public class WordAnnotationHandler {
+
+ public static boolean containsWordAnnotations(String wordml) {
+ return (wordml.contains("<w:delText>") || wordml.contains("w:type=\"Word.Insertion\"") || wordml.contains("w:type=\"Word.Formatting\""));
+ }
+
+ public static String removeAnnotations(String wordml) {
+ String annotation = "<.??aml:annotation.*?>";
+ String content = "<.??aml:content.*?>";
+ String deletions = "<w:delText>.*?</w:delText>";
+ wordml = wordml.replaceAll(annotation, "");
+ wordml = wordml.replaceAll(content, "");
+ wordml = wordml.replaceAll(deletions, "");
+ return wordml;
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordUtil.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordUtil.java
new file mode 100644
index 00000000000..657da1f7d06
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/word/WordUtil.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.core.word;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_VERSION_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTIONS_TABLE;
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.TRANSACTION_DETAIL_TABLE;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.io.Streams;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+
+/**
+ * Provides utility methods for parsing wordML.
+ *
+ * @author Jeff C. Phillips
+ * @author Paul K. Waldfogel
+ */
+public class WordUtil {
+ private static final String SELECT_WORD_VALUES =
+ "SELECT " + ATTRIBUTE_VERSION_TABLE.columns("content", "gamma_id") + " FROM " + ATTRIBUTE_VERSION_TABLE + "," + TRANSACTIONS_TABLE + "," + TRANSACTION_DETAIL_TABLE + " WHERE art_id=? AND attr_type_id=? AND " + ATTRIBUTE_VERSION_TABLE.join(
+ TRANSACTIONS_TABLE, "gamma_id") + " AND " + TRANSACTIONS_TABLE.join(TRANSACTION_DETAIL_TABLE,
+ "transaction_id") + " AND " + TRANSACTION_DETAIL_TABLE.column("branch_id") + "=? ORDER BY gamma_id DESC";
+ private static final Matcher binIdMatcher = Pattern.compile("wordml://(.+?)[.]").matcher("");
+ private static final Pattern tagKiller = Pattern.compile("<.*?>", Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern paragraphPattern = Pattern.compile("<w:p( .*?)?>");
+
+ public WordUtil() {
+ super();
+ }
+
+ /**
+ * @return Returns the content with the bin data ID being reassigned. Note: The bin data Id needs to be reassigned to
+ * allow multi edits of artifacts with images. Else if 2 images have the same ID the first image will be
+ * printed duplicate times.
+ */
+ public static String reassignBinDataID(String content) {
+ ChangeSet changeSet = new ChangeSet(content);
+ Map<String, String> guidMap = new HashMap<String, String>();
+
+ binIdMatcher.reset(content);
+ boolean atLeastOneMatch = false;
+ while (binIdMatcher.find()) {
+ atLeastOneMatch = true;
+ String oldName = binIdMatcher.group(1);
+
+ String guid = guidMap.get(oldName);
+ if (guid == null) {
+ guid = GUID.generateGuidStr();
+ guidMap.put(oldName, guid);
+ }
+
+ changeSet.replace(binIdMatcher.start(1), binIdMatcher.end(1), guid);
+ }
+ if (atLeastOneMatch) {
+ return changeSet.toString();
+ }
+ return content;
+ }
+
+ /**
+ * Analyzes all successive versions of 'Word Formatted Content' for useful differences and removes versions that do
+ * not provide and difference from the prior version.
+ *
+ * @throws IllegalArgumentException if branch is null
+ * @return returns true if some addressing was removed, otherwise false
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ * @throws Exception
+ */
+ public static boolean revertNonusefulWordChanges(int artId, Branch branch, String table) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ if (branch == null) throw new IllegalArgumentException("branch can not be null");
+
+ AttributeType attributeDescriptor = AttributeTypeManager.getType(WordAttribute.WORD_TEMPLATE_CONTENT);
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_WORD_VALUES, artId, attributeDescriptor.getAttrTypeId(), branch.getBranchId());
+
+ List<Pair<String, Integer>> values = new LinkedList<Pair<String, Integer>>();
+ while (chStmt.next()) {
+ String content;
+ try {
+ InputStream stream = chStmt.getBinaryStream("content");
+ if (stream == null) {
+ content = "";
+ } else {
+ content = new String(Streams.getByteArray(stream), "UTF-8");
+ }
+ values.add(new Pair<String, Integer>(content, chStmt.getInt("gamma_id")));
+ } catch (UnsupportedEncodingException ex) {
+ // should never ever ever occur
+ throw new IllegalStateException("Must support UTF-8 format");
+ }
+ }
+
+ Iterator<Pair<String, Integer>> iter = values.iterator();
+ if (iter.hasNext()) {
+ Pair<String, Integer> newest;
+ Pair<String, Integer> nextNewest = iter.next();
+ Collection<Integer> repeatGammas = new LinkedList<Integer>();
+ while (iter.hasNext()) {
+ newest = nextNewest;
+ nextNewest = iter.next();
+
+ if (WordUtil.textOnly(newest.getKey()).equals(nextNewest.getKey())) {
+ repeatGammas.add(newest.getValue());
+ }
+ }
+
+ if (repeatGammas.isEmpty()) return false;
+
+ // For now expect that later we will remove all unaddressed attributes, this is safer
+ // since addressing can be 'easily' reestablished, but not the actual data
+ // ConnectionHandler.runUpdate(DELETE_ATTRIBUTE_PREFIX +
+ // Collections.toString(repeatGammas, "(", ",", ")"));
+
+ // Uncomment this to go live ... for now it will just give back true/false status
+ // ConnectionHandler.runUpdate(DELETE_ADDRESSING_PREFIX +
+ // Collections.toString(repeatGammas, "(", ",", ")"));
+
+ for (Integer gamma : repeatGammas) {
+ ConnectionHandler.runPreparedUpdate("INSERT INTO " + table + " (gamma_id) values (?)", gamma);
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ public static String textOnly(String str) {
+ str = paragraphPattern.matcher(str).replaceAll(" ");
+ str = tagKiller.matcher(str).replaceAll("").trim();
+ return Xml.unescape(str).toString();
+ }
+
+ public static boolean isHeadingStyle(String paragraphStyle) {
+ if (paragraphStyle == null) {
+ return false;
+ } else {
+ String style = paragraphStyle.toLowerCase();
+ // TODO get this list of styles from the Extension Point
+ return style.startsWith("heading") || style.startsWith("toc") || style.startsWith("outline");
+ }
+ }
+
+ public final static String removeWordMarkupSmartTags(String wordMarkup) {
+ if (wordMarkup != null) {
+ String[] splitsOnSmartTagStart = wordMarkup.split("<[/]{0,1}st\\d{1,22}");// example smart (cough, cough) tags <st1:place>|</st1:place>
+ if (splitsOnSmartTagStart.length > 1) {
+ StringBuilder myStringBuilder = new StringBuilder(splitsOnSmartTagStart[0]);
+ for (int i = 1; i < splitsOnSmartTagStart.length; i++) {
+ int smartTagEndingIndex = splitsOnSmartTagStart[i].indexOf(">");
+ myStringBuilder.append(splitsOnSmartTagStart[i].substring(smartTagEndingIndex + 1));
+ }
+ wordMarkup = myStringBuilder.toString();
+ }
+ }
+
+ return wordMarkup;
+ }
+
+ public final static String addGUIDToDocument(String myGuid, String wholeDocumentWordMarkup) {
+ String adjustedWordContentString = null;
+ if (wholeDocumentWordMarkup.indexOf(Artifact.BEFORE_GUID_STRING) > 0) {
+ adjustedWordContentString =
+ wholeDocumentWordMarkup.replaceAll(Artifact.BEFORE_GUID_STRING + "(.*)" + Artifact.AFTER_GUID_STRING,
+ Artifact.BEFORE_GUID_STRING + myGuid + Artifact.AFTER_GUID_STRING);
+ } else {
+ adjustedWordContentString =
+ wholeDocumentWordMarkup.replaceAll(
+ "w:wordDocument ",
+ "w:wordDocument " + "xmlns:ForGUID='http:/" + Artifact.BEFORE_GUID_STRING + myGuid + Artifact.AFTER_GUID_STRING + "' ");
+ }
+ return adjustedWordContentString;
+ }
+
+ public final static String getGUIDFromFileInputStream(FileInputStream myFileInputStream) throws IOException {
+ String guid = null;
+ byte[] myBytes = new byte[4096];
+ myFileInputStream.read(myBytes);
+ String leadingPartOfFile = new String(myBytes);
+ myFileInputStream = null;
+ String[] splitsBeforeAndAfter =
+ leadingPartOfFile.split(Artifact.BEFORE_GUID_STRING + "|" + Artifact.AFTER_GUID_STRING);
+ if (splitsBeforeAndAfter.length == 3) {
+ guid = splitsBeforeAndAfter[1];
+ }
+ return guid;
+ }
+
+ public final static String removeGUIDFromTemplate(String template) {
+ String newTemplate = "";
+
+ String[] splitsBeforeAndAfter = template.split(Artifact.BEFORE_GUID_STRING + "|" + Artifact.AFTER_GUID_STRING);
+
+ if (splitsBeforeAndAfter.length == 3) {
+ newTemplate = splitsBeforeAndAfter[0] + " " + splitsBeforeAndAfter[2];
+ } else {
+ newTemplate = template;
+ }
+ return newTemplate;
+ }
+
+ private static final Matcher spellCheck =
+ Pattern.compile("<w:proofErr w:type=\"spell(End|Start)\"/>", Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+
+ public final static String stripSpellCheck(String content) {
+ spellCheck.reset(content);
+ return spellCheck.replaceAll("");
+ }
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedArtifact.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedArtifact.java
new file mode 100644
index 00000000000..faefdaba0da
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedArtifact.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.framework.ui.plugin.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UnloadedArtifact {
+ private int artifactId;
+ private int branchId;
+ private int artifactTypeId;
+
+ public UnloadedArtifact(int branchId, int artifactId, int artifactTypeId) {
+ this.branchId = branchId;
+ this.artifactId = artifactId;
+ this.artifactTypeId = artifactTypeId;
+ }
+
+ /**
+ * @return the artifactId
+ */
+ public int getArtifactId() {
+ return artifactId;
+ }
+
+ /**
+ * @param artifactId the artifactId to set
+ */
+ public void setArtifactId(int artifactId) {
+ this.artifactId = artifactId;
+ }
+
+ /**
+ * @return the branchId
+ */
+ public int getBranchId() {
+ return branchId;
+ }
+
+ /**
+ * @param branchId the branchId to set
+ */
+ public void setBranchId(int branchId) {
+ this.branchId = branchId;
+ }
+
+ /**
+ * @return the artifactTypeId
+ */
+ public int getArtifactTypeId() {
+ return artifactTypeId;
+ }
+
+ /**
+ * @param artifactTypeId the artifactTypeId to set
+ */
+ public void setArtifactTypeId(int artifactTypeId) {
+ this.artifactTypeId = artifactTypeId;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedRelation.java b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedRelation.java
new file mode 100644
index 00000000000..5622ff0fe17
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/ui/plugin/event/UnloadedRelation.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.framework.ui.plugin.event;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UnloadedRelation {
+
+ private final int artifactAId;
+ private final int artifactATypeId;
+ private final int artifactBId;
+ private final int artifactBTypeId;
+ private final int relationTypeId;
+ private final int branchId;
+
+ public UnloadedRelation(int branchId, int artifactAId, int artifactATypeId, int artifactBId, int artifactBTypeId, int relationTypeId) {
+ this.branchId = branchId;
+ this.artifactAId = artifactAId;
+ this.artifactATypeId = artifactATypeId;
+ this.artifactBId = artifactBId;
+ this.artifactBTypeId = artifactBTypeId;
+ this.relationTypeId = relationTypeId;
+ }
+
+ @Override
+ public String toString() {
+ return "UnloadedRelation A: " + artifactAId + " AType: " + artifactATypeId + " B:" + artifactBId + " BType: " + artifactBTypeId + " RelType: " + relationTypeId + " Branch: " + branchId;
+ }
+
+ /**
+ * @return the artifactATypeId
+ */
+ public int getArtifactATypeId() {
+ return artifactATypeId;
+ }
+
+ /**
+ * @return the artifactBTypeId
+ */
+ public int getArtifactBTypeId() {
+ return artifactBTypeId;
+ }
+
+ /**
+ * @return the artifactAId
+ */
+ public int getArtifactAId() {
+ return artifactAId;
+ }
+
+ /**
+ * @return the artifactBId
+ */
+ public int getArtifactBId() {
+ return artifactBId;
+ }
+
+ /**
+ * @return the relationTypeId
+ */
+ public int getRelationTypeId() {
+ return relationTypeId;
+ }
+
+ /**
+ * @return the branchId
+ */
+ public int getBranchId() {
+ return branchId;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.skynet.core/support/OseeTypes_CommonBranch.xml b/org.eclipse.osee.framework.skynet.core/support/OseeTypes_CommonBranch.xml
new file mode 100644
index 00000000000..dd2539cc493
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/support/OseeTypes_CommonBranch.xml
@@ -0,0 +1,1048 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Robert Fisher</Author>
+ <LastAuthor>Ryan Brooks</LastAuthor>
+ <LastPrinted>2006-03-15T03:49:16Z</LastPrinted>
+ <Created>2005-07-01T21:31:12Z</Created>
+ <LastSaved>2008-11-29T20:07:41Z</LastSaved>
+ <Company>The Boeing Company</Company>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>5565</WindowHeight>
+ <WindowWidth>16650</WindowWidth>
+ <WindowTopX>-15</WindowTopX>
+ <WindowTopY>-15</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s31">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s32">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s33">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s34">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s35">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s36">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ <Style ss:ID="s37">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s38">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s39">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s40">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s41">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s42">
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s43">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s44">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s45">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s46">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="skynetBase">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="=skynetBase!R108C1:R113C4"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="11" ss:ExpandedRowCount="118" x:FullColumns="1"
+ x:FullRows="1" ss:StyleID="s21" ss:DefaultRowHeight="12">
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="314.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="303"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="128.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="76.5"/>
+ <Column ss:StyleID="s21" ss:Width="132.75"/>
+ <Column ss:StyleID="s21" ss:Width="71.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="101.25"/>
+ <Column ss:StyleID="s21" ss:Width="58.5"/>
+ <Column ss:StyleID="s21" ss:Width="75.75"/>
+ <Column ss:StyleID="s21" ss:Width="56.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="101.25">
+ <Cell ss:MergeAcross="1" ss:StyleID="s23"><Data ss:Type="String"># Copyright (c) 2004, 2007 Boeing.&#10;# All rights reserved. This program and the accompanying materials&#10;# are made available under the terms of the Eclipse Public License v1.0&#10;# which accompanies this distribution, and is available at&#10;# http://www.eclipse.org/legal/epl-v10.html&#10;# &#10;# Contributors:&#10;# Boeing - initial API and implementation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.ui.skynet.artifact.SkynetGuiArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Global Preferences</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User Group</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Group Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.ui.skynet.artifact.SkynetGuiArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">XViewer Global Customization</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Renderer Template</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">WordArtifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Rule Definition</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s31"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Work Widget Definition</Data></Cell>
+ <Cell ss:StyleID="s33"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Data Provider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Tip Text</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">User Visible</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Active</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User Id</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Favorite Branch</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s37"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User Settings</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s37"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">XViewer Customization</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">XViewer Defaults</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Phone</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Mobile Phone</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Fax Phone</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Email</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Dictionary</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Template Match Criteria</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s37"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Criteria that determines what template is selected ie: 'Render Artifact PresentationType Option'</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Company</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Company Title</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">City</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Street</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">State</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Zip</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Country</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Notes</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Website</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Data</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Id</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Type</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Description</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Parent Id</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Page Name</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Transition</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s35"/>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s38"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">osee.wi.Start Page</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s38"/>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0" ss:Height="11.25"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s39"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s39"><Data ss:Type="String">Attribute Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Rule Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Rule Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Type</Data></Cell>
+ <Cell ss:Index="7" ss:StyleID="s40"><Data ss:Type="String">, &quot;</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Rule Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Parent Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Rule Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Rule Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Parent Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Page Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Page Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Widget Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Widget Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Widget Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Parent Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Widget Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Widget Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Parent Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Start Page</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Transition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:StyleID="Default">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Work Flow Definition</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">osee.wi.Work Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Active</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Phone</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Email</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Favorite Branch</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">XViewer Customization</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">XViewer Defaults</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Dictionary</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User Settings</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">City</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">State</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Zip</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Country</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Notes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Website</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Company</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Company Title</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Street</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Fax Phone</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Mobile Phone</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Global Preferences</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Dictionary</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">XViewer Global Customization</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">XViewer Customization</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Renderer Template</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Template Match Criteria</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Renderer Template</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Extension</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Renderer Template</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Native Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s41"/>
+ <Cell ss:StyleID="s41"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Side &quot;A/B&quot; Name should be a free text descriptive name for the user - links between sides and artifact types are performed in the table below.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Short Name</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Ordered</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Work Item</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Parent</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">contains</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Child</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">belong to</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">WrkItem</Data></Cell>
+ <Cell><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User Grouping</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">group</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">contains</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">users</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">belong to</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Group</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Users</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">has users</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">is user of</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Usr</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Supercedes</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">supercedes</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">supercedes</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">superceded by</Data></Cell>
+ <Cell ss:StyleID="Default"><Data ss:Type="String">is superceded by</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Sprcds</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:Index="5" ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s42"><Data ss:Type="String">#the first max values specified for an &lt;artifact type, relation type&gt; pair is used, so put the constraint for a concreate type before the constraint for a supertype</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;A&quot;, &quot;Side A Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;B&quot;, &quot;Side B Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Work Item</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User Group</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User Grouping</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User Grouping</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">User</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Users</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Users</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Supercedes</Data></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s41"/>
+ <Cell ss:StyleID="s44"/>
+ <Cell ss:StyleID="s45"/>
+ <Cell ss:StyleID="s45"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s41"/>
+ <Cell ss:StyleID="s44"/>
+ <Cell ss:StyleID="s45"/>
+ <Cell ss:StyleID="s45"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s46"><Data ss:Type="String">#need method to record whether allocation has been verified as complete and re-verify if changes potentially impact the allocation</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Layout x:Orientation="Landscape"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>6</ActiveRow>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Relation Type</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramAndCommon.xml b/org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramAndCommon.xml
new file mode 100644
index 00000000000..d8e525f7b07
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramAndCommon.xml
@@ -0,0 +1,701 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Robert Fisher</Author>
+ <LastAuthor>Ryan Brooks</LastAuthor>
+ <LastPrinted>2006-03-15T03:49:16Z</LastPrinted>
+ <Created>2005-07-01T21:31:12Z</Created>
+ <LastSaved>2009-01-02T04:34:49Z</LastSaved>
+ <Company>The Boeing Company</Company>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>5610</WindowHeight>
+ <WindowWidth>16650</WindowWidth>
+ <WindowTopX>-15</WindowTopX>
+ <WindowTopY>5550</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s29">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s31">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s32">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s33">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s34">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s35">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s36">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s37">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s38">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s39">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s40">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s41">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s42">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s43">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s44">
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s46">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="skynetBase">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="=skynetBase!R59C1:R62C4"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="10" ss:ExpandedRowCount="67" x:FullColumns="1"
+ x:FullRows="1" ss:StyleID="s21" ss:DefaultRowHeight="12">
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="359.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="300.75"/>
+ <Column ss:StyleID="s21" ss:Width="108.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="101.25"/>
+ <Column ss:StyleID="s21" ss:Width="132.75"/>
+ <Column ss:StyleID="s21" ss:Width="71.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="174.75"/>
+ <Column ss:StyleID="s21" ss:Width="58.5"/>
+ <Column ss:StyleID="s21" ss:Width="75.75"/>
+ <Column ss:StyleID="s21" ss:Width="56.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="100.5">
+ <Cell ss:MergeAcross="1" ss:StyleID="s23"><Data ss:Type="String"># Copyright (c) 2004, 2007 Boeing.&#10;# All rights reserved. This program and the accompanying materials&#10;# are made available under the terms of the Eclipse Public License v1.0&#10;# which accompanies this distribution, and is available at&#10;# http://www.eclipse.org/legal/epl-v10.html&#10;# &#10;# Contributors:&#10;# Boeing - initial API and implementation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.ui.skynet.blam.BlamFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Blam Workflow</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Folder</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.NativeArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">General Document</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">NativeArtifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Heading</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">WordArtifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Root Artifact</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Support Document</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">WordArtifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Universal Group</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Url</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">FileArtifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">General Data</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:Index="6" ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Workspace File</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s34"/>
+ <Cell ss:StyleID="s33"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Data Provider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Tip Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Name</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">unnamed</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Descriptive Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Content URL</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Description</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Page Type</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Portrait</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">&lt;Page_Type&gt;&lt;Enum&gt;Portrait&lt;/Enum&gt;&lt;Enum&gt;Landscape&lt;/Enum&gt;&lt;/Page_Type&gt;</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s37"><Data ss:Type="String">Page Type: Landscape/Portrait</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Word Ole Data</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:Index="8" ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s37"><Data ss:Type="String">Word Ole Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Workflow Definition</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">vue</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">xml definition of a Blam Workflow</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Extension</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Annotation</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Static Id</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s39"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">General String Data</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.CompressedContentAttribute</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Native Content</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">bin</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">content that will be editing by a native program</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.WordAttribute</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Word Template Content</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">XmlAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">&lt;w:p xmlns:w=&quot;http://schemas.microsoft.com/office/word/2003/wordml&quot;&gt;&lt;w:r&gt;&lt;w:t&gt;&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;</Data></Cell>
+ <Cell ss:StyleID="s40"/>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">value must comply with WordML xml schema</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s41"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.WordAttribute</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">Whole Word Content</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">xml</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">XmlAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">&lt;?xml version='1.0' encoding='UTF-8' standalone='yes'?&gt;&lt;?mso-application progid='Word.Document'?&gt;&lt;w:wordDocument xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml' xmlns:v='urn:schemas-microsoft-com:vml' xmlns:w10='urn:schemas-microsoft-com:office:word' xmlns:sl='http://schemas.microsoft.com/schemaLibrary/2003/core' xmlns:aml='http://schemas.microsoft.com/aml/2001/core' xmlns:wx='http://schemas.microsoft.com/office/word/2003/auxHint' xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:wsp='http://schemas.microsoft.com/office/word/2003/wordml/sp2' xmlns:ns0='http://www.w3.org/2001/XMLSchema' xmlns:ns1='http://eclipse.org/artifact.xsd' xmlns:st1='urn:schemas-microsoft-com:office:smarttags' w:macrosPresent='no' w:embeddedObjPresent='no' w:ocxPresent='no' xml:space='preserve'&gt;&lt;w:body&gt;&lt;/w:body&gt;&lt;/w:wordDocument&gt;</Data></Cell>
+ <Cell ss:StyleID="s41"/>
+ <Cell ss:StyleID="s42"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s42"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s41"><Data ss:Type="String">value must comply with WordML xml schema</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="11.25"/>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s43"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s43"><Data ss:Type="String">Attribute Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Annotation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Static Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">FileArtifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Content URL</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Universal Group</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Url</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">WordArtifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Word Ole Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">WordArtifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Page Type</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">WordArtifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Word Template Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">WordArtifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Whole Word Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Blam Workflow</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Workflow Definition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">General Data</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">General String Data</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s28"><Data ss:Type="String">NativeArtifact</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Extension</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">NativeArtifact</Data></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Description</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s31"><Data ss:Type="String">NativeArtifact</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Native Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell><Data ss:Type="String"># Side &quot;A/B&quot; Name should be a free text descriptive name for the user - links between sides and artifact types are performed in the table below.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Short Name</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Ordered</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Default Hierarchical</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">parent</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">has</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">child</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">is a child of</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">DHier</Data></Cell>
+ <Cell><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Dependency</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">artifact</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">is dependent upon</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">dependency</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">impacts</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Dep</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Supporting Info</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">is supported by</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">is supported by</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">supporting info</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">supports</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">SupIn</Data></Cell>
+ <Cell><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Universal Grouping</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">group</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">contains</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">members</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">belong to</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Group</Data></Cell>
+ <Cell><Data ss:Type="String">Yes</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:Span="1"/>
+ <Row ss:Index="57" ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s44"><Data ss:Type="String">#the first max values specified for an &lt;artifact type, relation type&gt; pair is used, so put the constraint for a concreate type before the constraint for a supertype</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;A&quot;, &quot;Side A Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="12.75" ss:StyleID="Default">
+ <Cell ss:StyleID="s21"><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;B&quot;, &quot;Side B Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"><NamedCell ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s21"/>
+ <Cell ss:StyleID="s21"/>
+ <Cell ss:StyleID="s21"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:Index="7" ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Default Hierarchical</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="Default"/>
+ <Cell ss:StyleID="Default"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Dependency</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Supporting Info</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Universal Group</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Universal Grouping</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Artifact</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Universal Grouping</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s46"><Data ss:Type="String">#need method to record whether allocation has been verified as complete and re-verify if changes potentially impact the allocation</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Layout x:Orientation="Landscape"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>22</ActiveRow>
+ <ActiveCol>6</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Artifact Type Name</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramBranch.xml b/org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramBranch.xml
new file mode 100644
index 00000000000..727944930fc
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/support/OseeTypes_ProgramBranch.xml
@@ -0,0 +1,530 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Robert Fisher</Author>
+ <LastAuthor>Ryan Brooks</LastAuthor>
+ <LastPrinted>2006-03-15T03:49:16Z</LastPrinted>
+ <Created>2005-07-01T21:31:12Z</Created>
+ <LastSaved>2008-11-10T17:49:14Z</LastSaved>
+ <Company>The Boeing Company</Company>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>6690</WindowHeight>
+ <WindowWidth>15480</WindowWidth>
+ <WindowTopX>360</WindowTopX>
+ <WindowTopY>4530</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s26">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s29">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s31">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s32">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s33">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ <Style ss:ID="s34">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s35">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s36">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s37">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s38">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s39">
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s40">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s41">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s42">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s43">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="skynetBase">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="=skynetBase!R45C1:R46C4"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="10" ss:ExpandedRowCount="50" x:FullColumns="1"
+ x:FullRows="1" ss:StyleID="s21" ss:DefaultRowHeight="12">
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="235.5"/>
+ <Column ss:StyleID="s21" ss:Width="294.75"/>
+ <Column ss:StyleID="s21" ss:Width="108.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="101.25"/>
+ <Column ss:StyleID="s21" ss:Width="132.75"/>
+ <Column ss:StyleID="s21" ss:Width="71.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="101.25"/>
+ <Column ss:StyleID="s21" ss:Width="58.5"/>
+ <Column ss:StyleID="s21" ss:Width="75.75"/>
+ <Column ss:StyleID="s21" ss:Width="56.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="105">
+ <Cell ss:MergeAcross="1" ss:StyleID="s23"><Data ss:Type="String"># Copyright (c) 2004, 2007 Boeing.&#10;# All rights reserved. This program and the accompanying materials&#10;# are made available under the terms of the Eclipse Public License v1.0&#10;# which accompanies this distribution, and is available at&#10;# http://www.eclipse.org/legal/epl-v10.html&#10;# &#10;# Contributors:&#10;# Boeing - initial API and implementation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="15">
+ <Cell ss:StyleID="s24"/>
+ <Cell ss:StyleID="s24"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Code Unit</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">FileArtifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Component</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Spreadsheet</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s26"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.WordArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">MS Word</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s29"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s29"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Data Provider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Tip Text</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Developmental</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s33"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Row</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Summary</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Hazard</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">AFHA</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">SFHA</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Hazard Severity</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">&lt;HazardSeverity&gt;&lt;Enum&gt;Catastrophic, I&lt;/Enum&gt;&lt;Enum&gt;Severe-Major, II&lt;/Enum&gt;&lt;Enum&gt;Critical, II&lt;/Enum&gt;&lt;Enum&gt;Major, III&lt;/Enum&gt;&lt;Enum&gt;Marginal, III&lt;/Enum&gt;&lt;Enum&gt;Minor, IV&lt;/Enum&gt;&lt;Enum&gt;Negligible, IV&lt;/Enum&gt;&lt;Enum&gt;No Effect, V&lt;/Enum&gt;&lt;Enum&gt;Unspecified&lt;/Enum&gt;&lt;/HazardSeverity&gt;</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Objective</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">FTA Results</Data></Cell>
+ <Cell ss:StyleID="s27"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s32"/>
+ <Cell ss:StyleID="s32"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">GFE / CFE</Data></Cell>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Unspecified</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">&lt;GFE_CFE&gt;&lt;Enum&gt;CFE&lt;/Enum&gt;&lt;Enum&gt;GFE&lt;/Enum&gt;&lt;Enum&gt;Unspecified&lt;/Enum&gt;&lt;/GFE_CFE&gt;</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s37"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Span="1"/>
+ <Row ss:Index="23" ss:AutoFitHeight="0" ss:Height="11.25"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s38"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">Attribute Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Component</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Developmental</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Component</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">GFE / CFE</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Spreadsheet</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Row</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Spreadsheet</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Summary</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Hazard</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">AFHA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">SFHA</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Hazard Severity</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Objective</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">Safety Assessment</Data></Cell>
+ <Cell ss:StyleID="s27"><Data ss:Type="String">FTA Results</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Side &quot;A/B&quot; Name should be a free text descriptive name for the user - links between sides and artifact types are performed in the table below.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Short Name</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Ordered</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Functional decomposition </Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">higher-level component</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">is composed of</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">lower-level component</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">is a component of</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">FD</Data></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5" ss:Span="1"/>
+ <Row ss:Index="42" ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s39"><Data ss:Type="String">#the first max values specified for an &lt;artifact type, relation type&gt; pair is used, so put the constraint for a concreate type before the constraint for a supertype</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;A&quot;, &quot;Side A Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;B&quot;, &quot;Side B Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s40"><Data ss:Type="String">Component</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s32"><Data ss:Type="String">Functional decomposition </Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s41"/>
+ <Cell ss:StyleID="s42"/>
+ <Cell ss:StyleID="s42"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s41"/>
+ <Cell ss:StyleID="s42"/>
+ <Cell ss:StyleID="s42"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s43"><Data ss:Type="String">#need method to record whether allocation has been verified as complete and re-verify if changes potentially impact the allocation</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Layout x:Orientation="Landscape"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>17</ActiveRow>
+ <ActiveCol>6</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Relation Type</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.framework.skynet.core/support/export.xsd b/org.eclipse.osee.framework.skynet.core/support/export.xsd
new file mode 100644
index 00000000000..67cb464d8d3
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/support/export.xsd
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/export" xmlns:tns="http://www.example.org/export">
+ <complexType name="ArtifactType">
+ <sequence>
+ <element name="Attribute" type="tns:AttributeType"
+ maxOccurs="unbounded" minOccurs="0">
+ </element>
+ </sequence>
+ <attribute name="guid" type="string" use="required"></attribute>
+ <attribute name="type" type="string" use="required"></attribute>
+ <attribute name="hrid" type="string" use="required"></attribute>
+ <attribute name="deleted" type="boolean" use="optional"></attribute>
+ </complexType>
+
+
+
+ <complexType name="AttributeType">
+ <sequence>
+ <element name="StringValue" type="string"></element>
+ <element name="ContentValue" type="string"></element>
+ </sequence>
+ <attribute name="type" type="string" use="required"></attribute>
+ <attribute name="guid" type="string" use="required"></attribute>
+ <attribute name="deleted" type="boolean" use="optional">
+ </attribute>
+ </complexType>
+
+ <complexType name="LinkType">
+ <sequence>
+ <element name="Rationale" type="string" maxOccurs="1" minOccurs="0"></element>
+ </sequence>
+ <attribute name="type" type="string" use="required"></attribute>
+ <attribute name="guid" type="string" use="required"></attribute>
+ <attribute name="aguid" type="string" use="required"></attribute>
+ <attribute name="bguid" type="string" use="required"></attribute>
+ <attribute name="aorder" type="int" use="required"></attribute>
+ <attribute name="border" type="int" use="required"></attribute>
+ <attribute name="deleted" type="boolean" use="optional"></attribute>
+ </complexType>
+
+ <complexType name="TransactionType">
+ <sequence>
+ <element name="Comment" type="string" maxOccurs="1" minOccurs="0"></element>
+ <element name="Artifact" type="tns:ArtifactType"
+ maxOccurs="unbounded" minOccurs="0">
+ </element>
+ <element name="Link" type="tns:LinkType"
+ maxOccurs="unbounded" minOccurs="0">
+ </element>
+ </sequence>
+ <attribute name="author" type="string" use="required"></attribute>
+ <attribute name="time" type="time" use="required"></attribute>
+ </complexType>
+
+ <complexType name="BranchType">
+ <sequence>
+ <element name="Name" type="string" maxOccurs="1" minOccurs="1"></element>
+ <choice maxOccurs="unbounded" minOccurs="0">
+ <element name="Transaction"
+ type="tns:TransactionType">
+ </element>
+ <element name="Branch" type="tns:BranchType"></element>
+ </choice>
+ </sequence>
+ <attribute name="time" type="time"></attribute>
+ <attribute name="associated_guid" type="string"
+ use="optional">
+ </attribute>
+ </complexType>
+
+ <element name="Branch" type="tns:BranchType"></element>
+
+
+
+ <complexType name="ExpectationType">
+ <attribute name="branch_id" type="int"></attribute>
+ <attribute name="transactions" type="int"></attribute>
+ <attribute name="min_transaction" type="int"></attribute>
+ <attribute name="max_transaction" type="int"></attribute>
+ </complexType>
+
+ <complexType name="RealizationType">
+ <attribute name="transactions" type="int"></attribute>
+ </complexType>
+</schema> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.skynet.core/support/publish.xsd b/org.eclipse.osee.framework.skynet.core/support/publish.xsd
new file mode 100644
index 00000000000..b779b09d7bf
--- /dev/null
+++ b/org.eclipse.osee.framework.skynet.core/support/publish.xsd
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:pub="http://www.example.org/publishIt" xmlns:tns="http://www.w3.org/2001/XMLSchem">
+
+
+
+ <complexType name="AttributeType">
+ <sequence>
+ <element name="Label" type="string" maxOccurs="1"
+ minOccurs="0">
+ </element>
+ <element name="Outline" type="string" maxOccurs="1"
+ minOccurs="0">
+ </element>
+ <element name="Name" maxOccurs="1" minOccurs="1">
+ <simpleType>
+ <restriction base="string">
+ <whiteSpace value="collapse"></whiteSpace>
+ <pattern value=".+"></pattern>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="Format" maxOccurs="1" minOccurs="0">
+ <simpleType>
+ <restriction base="string"> <length value="1"></length>
+ <whiteSpace value="collapse"></whiteSpace>
+ <pattern value="x"></pattern>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="Editable" type="EditableType"></element>
+ <element name="ParagraphWrap" type="string" maxOccurs="1"
+ minOccurs="0">
+ </element>
+ </sequence>
+ </complexType>
+
+
+
+ <complexType name="ArtifactType">
+ <sequence>
+ <element name="Set_Name" maxOccurs="1" minOccurs="1">
+ <simpleType>
+ <restriction base="string">
+ <pattern value=".+"></pattern>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="Outline" type="OutlineType" maxOccurs="1" minOccurs="0"></element>
+ <element name="Attribute" type="AttributeType"
+ maxOccurs="unbounded" minOccurs="1">
+ </element>
+ </sequence>
+ </complexType>
+
+ <element name="Artifact" type="ArtifactType"></element>
+
+
+ <complexType name="OutlineType">
+ <sequence>
+ <element name="Number" type="OutlineNumberType" minOccurs="0" maxOccurs="1"></element>
+ <element name="HeadingAttribute" maxOccurs="1"
+ minOccurs="1">
+ <simpleType>
+ <restriction base="string">
+ <pattern value=".+"></pattern>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="RecurseChildren" maxOccurs="1" minOccurs="0">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="true"></enumeration>
+ <enumeration value="false"></enumeration>
+ </restriction>
+ </simpleType>
+ </element>
+ </sequence>
+ </complexType>
+ <element name="Extension_Processor" type="ExtensionPointType"></element>
+
+ <simpleType name="KeyType">
+ <restriction base="string"></restriction>
+ </simpleType>
+
+ <simpleType name="ValueType">
+ <restriction base="string"></restriction>
+ </simpleType>
+
+ <complexType name="ArgumentType">
+ <sequence>
+ <element name="Key" type="KeyType" minOccurs="1"
+ maxOccurs="1">
+ </element>
+ <element name="Value" type="ValueType"></element>
+ </sequence>
+ </complexType>
+
+ <complexType name="ExtensionPointType">
+ <sequence>
+ <element name="Number" type="OutlineNumberType"
+ minOccurs="0" maxOccurs="1">
+ </element>
+ <element name="SubDoc" type="string" minOccurs="0"
+ maxOccurs="1">
+ </element>
+ <element name="Name" type="string" minOccurs="1"
+ maxOccurs="1">
+ </element>
+ <element name="Argument" type="ArgumentType" minOccurs="0"
+ maxOccurs="unbounded">
+ </element>
+ <element name="OutlineType" type="string" maxOccurs="1"
+ minOccurs="0">
+ </element>
+ </sequence>
+ </complexType>
+
+ <simpleType name="OutlineNumberType">
+ <restriction base="string">
+ <pattern value="((\d+|[A-Za-z])\.)*(\d+|[A-Za-z])"></pattern>
+ </restriction>
+ </simpleType>
+
+
+
+ <complexType name="EditableType">
+ <sequence>
+ <element name="IgnoreFormat" type="string"></element>
+ </sequence>
+ </complexType>
+</schema> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.svn/.classpath b/org.eclipse.osee.framework.svn/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/.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.framework.svn/.project b/org.eclipse.osee.framework.svn/.project
new file mode 100644
index 00000000000..51f10227857
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.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>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.svn/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.svn/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.svn/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.svn/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..8e30f2e9953
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Svn Integration (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.svn;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.svn.SvnActivator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.team.ui,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.team.core,
+ org.eclipse.team.svn,
+ org.eclipse.team.svn.core,
+ org.eclipse.team.svn.ui
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.svn,
+ org.eclipse.osee.framework.svn.entry,
+ org.eclipse.osee.framework.svn.enums
+Bundle-ClassPath: library.jar
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.framework.svn/build.properties b/org.eclipse.osee.framework.svn/build.properties
new file mode 100644
index 00000000000..97c13f300cb
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+ library.jar
+source.library.jar = src/
+output.library.jar = bin/
+jars.compile.order = library.jar
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutJob.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutJob.java
new file mode 100644
index 00000000000..8d7e507adae
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutJob.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.framework.svn;
+
+import java.util.logging.Level;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+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.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CheckoutJob extends Job {
+ private String[] fileToCheckout;
+
+ public CheckoutJob(String jobName, String[] fileToCheckout) {
+ super(jobName);
+ this.fileToCheckout = fileToCheckout;
+ }
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn = Status.OK_STATUS;
+ try {
+ ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ VersionControl.getInstance().checkOut(fileToCheckout, monitor);
+ }
+ }, this.getRule(), IWorkspace.AVOID_UPDATE, monitor);
+ } catch (Exception ex) {
+ OseeLog.log(SvnActivator.class, Level.SEVERE, ex);
+ toReturn = new Status(Status.ERROR, SvnActivator.PLUGIN_ID, "Unable to Checkout Files", ex);
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutProjectSetJob.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutProjectSetJob.java
new file mode 100644
index 00000000000..ce5d6ae63d5
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/CheckoutProjectSetJob.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.framework.svn;
+
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.internal.ui.TeamUIMessages;
+import org.eclipse.team.internal.ui.TeamUIPlugin;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.PlatformUI;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+@SuppressWarnings("restriction")
+public class CheckoutProjectSetJob extends Job {
+ private URL projectSetFile;
+ private String workingSetName;
+
+ public CheckoutProjectSetJob(String jobName, String workingSetName, URL projectSetFile) {
+ super(jobName);
+ this.projectSetFile = projectSetFile;
+ this.workingSetName = workingSetName;
+ }
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn = Status.OK_STATUS;
+ try {
+ boolean result = performImportProjectSet(monitor, getProjectSetPath(), workingSetName);
+ if (result != true) {
+ toReturn = Status.CANCEL_STATUS;
+ }
+ } catch (Throwable ex) {
+ OseeLog.log(SvnActivator.class, Level.SEVERE, ex);
+ }
+ return toReturn;
+ }
+
+ private String getProjectSetPath() throws Exception {
+ URL url = FileLocator.resolve(projectSetFile);
+ File file = new File(url.getFile());
+ return file.getAbsolutePath();
+ }
+
+ private boolean performImportProjectSet(IProgressMonitor monitor, String fileName, String workingSet) {
+ boolean result = false;
+ try {
+ Class<?> clazz =
+ Platform.getBundle("org.eclipse.team.ui").loadClass(
+ "org.eclipse.team.internal.ui.wizards.ImportProjectSetOperation");
+ Object object = null;
+ if (EclipseVersion.isVersion("3.3")) {
+ Constructor<?> constructor = clazz.getConstructor(IRunnableContext.class, String.class, String.class);
+ object = constructor.newInstance(null, fileName, workingSet);
+ } else if (EclipseVersion.isVersion("3.4")) {
+ List<IWorkingSet> workingSets = new ArrayList<IWorkingSet>();
+ IWorkingSet workingSetObject =
+ PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(workingSetName);
+ if (workingSetObject != null) {
+ workingSets.add(workingSetObject);
+ }
+ Constructor<?> constructor =
+ clazz.getConstructor(IRunnableContext.class, String.class, IWorkingSet[].class);
+ object = constructor.newInstance(null, fileName, workingSets.toArray(new IWorkingSet[workingSets.size()]));
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ Method method = clazz.getDeclaredMethod("run", IProgressMonitor.class);
+ method.invoke(object, monitor);
+ result = true;
+ } catch (Exception ex) {
+ handleException(ex);
+ }
+ return result;
+ }
+
+ private boolean handleException(Exception ex) {
+ Throwable target = ex.getCause();
+ if (target instanceof TeamException) {
+ displayErrorMessage(true, null, target);
+ return false;
+ }
+ if (target instanceof RuntimeException) {
+ throw (RuntimeException) target;
+ }
+ if (target instanceof Error) {
+ throw (Error) target;
+ }
+ String message =
+ target instanceof SAXException ? TeamUIMessages.ProjectSetImportWizard_2 : TeamUIMessages.ProjectSetImportWizard_3;
+ displayErrorMessage(false, message, target);
+ return false;
+ }
+
+ private void displayErrorMessage(final boolean isTeamException, final String message, final Throwable target) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ if (isTeamException) {
+ ErrorDialog.openError(shell, null, null, ((TeamException) target).getStatus());
+ } else {
+ ErrorDialog.openError(shell, null, null, new Status(IStatus.ERROR, TeamUIPlugin.ID, 0, NLS.bind(message,
+ new String[] {target.getMessage()}), target));
+ }
+ }
+ });
+ }
+};
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/ClearCaseInfo.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/ClearCaseInfo.java
new file mode 100644
index 00000000000..b4a75ae288c
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/ClearCaseInfo.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.framework.svn;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import org.eclipse.osee.framework.svn.entry.IRepositoryEntry;
+
+public class ClearCaseInfo implements IRepositoryEntry {
+
+ private File file;
+
+ public ClearCaseInfo(File tmpFile) {
+ super();
+ file = tmpFile;
+ }
+
+ public String getURL() {
+ return file.getAbsolutePath();
+ }
+
+ public String getVersion() {
+ try {
+ Process ct = Runtime.getRuntime().exec("cleartool lshistory -last " + file.getAbsolutePath());
+ BufferedReader reader = new BufferedReader(new InputStreamReader(ct.getInputStream()));
+ String lineRead = null;
+ if ((lineRead = reader.readLine()) != null) {
+ return lineRead;
+ } else
+ return "unknown";
+ } catch (IOException ex) {
+ System.out.println("ClearCase not found");
+ }
+
+ return "unknown";
+ }
+
+ public String getVersionControlSystem() {
+ return "CLEARCASE";
+ }
+
+ public String getModifiedFlag() {
+ return " ";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getLastAuthor()
+ */
+ public String getLastAuthor() {
+ return " ";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getLastModificationDate()
+ */
+ public String getLastModificationDate() {
+ return " ";
+ }
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/EclipseVersion.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/EclipseVersion.java
new file mode 100644
index 00000000000..cb4612b1794
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/EclipseVersion.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.framework.svn;
+
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EclipseVersion {
+
+ private EclipseVersion() {
+ }
+
+ public static boolean isVersion(String toCheck) {
+ String value = (String) Platform.getBundle("org.eclipse.pde").getHeaders().get("Bundle-Version");
+ return value.startsWith(toCheck);
+ }
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/NodeKind.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/NodeKind.java
new file mode 100644
index 00000000000..c9eea336a8f
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/NodeKind.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.framework.svn;
+ public class NodeKind {
+ /** absent */
+ public static final int none = 0;
+
+ /** regular file */
+ public static final int file = 1;
+
+ /** directory */
+ public static final int dir = 2;
+
+ /** something's here, but we don't know what */
+ public static final int unknown = 3;
+
+ /**
+ * mapping for the constants to text
+ */
+ public static final String[] NAMES = {
+ "none",
+ "file",
+ "dir",
+ "unknown",
+ };
+
+ } \ No newline at end of file
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnAPI.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnAPI.java
new file mode 100644
index 00000000000..15aeea9ddd1
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnAPI.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.svn;
+
+import java.io.File;
+import java.lang.reflect.Constructor;
+import java.net.URI;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.svn.entry.IRepositoryEntry;
+import org.eclipse.osee.framework.svn.entry.NullRepositoryEntry;
+import org.eclipse.osee.framework.svn.entry.RepositoryEntry;
+import org.eclipse.osee.framework.svn.enums.RepositoryEnums.ControlledType;
+import org.eclipse.osee.framework.svn.enums.RepositoryEnums.EntryFields;
+import org.eclipse.team.svn.core.connector.SVNEntryInfo;
+import org.eclipse.team.svn.core.connector.ISVNConnector.Depth;
+import org.eclipse.team.svn.core.operation.remote.CheckoutOperation;
+import org.eclipse.team.svn.core.resource.ILocalResource;
+import org.eclipse.team.svn.core.resource.IRepositoryLocation;
+import org.eclipse.team.svn.core.resource.IRepositoryResource;
+import org.eclipse.team.svn.core.resource.IRepositoryRoot;
+import org.eclipse.team.svn.core.svnstorage.SVNRemoteStorage;
+import org.eclipse.team.svn.core.utility.SVNUtility;
+import org.eclipse.team.svn.ui.action.remote.CheckoutAction;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SvnAPI {
+ private static SvnAPI instance = null;
+
+ private SvnAPI() {
+ }
+
+ protected static SvnAPI getInstance() {
+ if (instance == null) {
+ instance = new SvnAPI();
+ }
+ return instance;
+ }
+
+ protected boolean isSvn(File file) {
+ File svn = new File(file.getParentFile(), SVNUtility.getSVNFolderName());
+ return svn.exists();
+ }
+
+ protected IRepositoryEntry getSVNInfo(File file) {
+ IRepositoryEntry toReturn = new NullRepositoryEntry();
+ SVNEntryInfo info = SVNUtility.getSVNInfo(file);
+ if (info != null) {
+ toReturn = toRepositoryEntry(file, info);
+ }
+ return toReturn;
+ }
+
+ private RepositoryEntry toRepositoryEntry(File file, SVNEntryInfo info) {
+ String entryType = "undefined";
+ if (info.kind >= 0 && info.kind < NodeKind.NAMES.length) {
+ entryType = NodeKind.NAMES[info.kind];
+ }
+ DateFormat dateFormat =
+ DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault());
+ final RepositoryEntry entry = new RepositoryEntry(entryType, getVersionControlSystem());
+ entry.addField(EntryFields.checksum, info.checksum);
+ entry.addField(EntryFields.committedRev, Long.toString(info.lastChangedRevision));
+ entry.addField(EntryFields.fileName, info.path);
+ entry.addField(EntryFields.committeDate, dateFormat.format(new Date(info.lastChangedDate)));
+ entry.addField(EntryFields.url, info.url);
+ entry.addField(EntryFields.lastAuthor, info.lastChangedAuthor);
+ entry.addField(EntryFields.kind,
+ info.kind == NodeKind.dir ? ControlledType.dir.name() : ControlledType.file.name());
+ entry.addField(EntryFields.uuid, info.reposUUID);
+ entry.addField(EntryFields.repository, info.reposRootUrl);
+ entry.addField(EntryFields.currentRevision, Long.toString(info.revision));
+ entry.addField(EntryFields.textTime, dateFormat.format(new Date(info.textTime)));
+ entry.addField(EntryFields.dateCommitted, dateFormat.format(new Date(info.lastChangedDate)));
+ entry.addField(EntryFields.properTime, dateFormat.format(new Date(info.propTime)));
+
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(file.toURI());
+ if (files != null && files.length > 0) {
+ ILocalResource local = SVNRemoteStorage.instance().asLocalResource(files[0]);
+ entry.setModifiedFlag(SVNUtility.getStatusText(local.getStatus()));
+ }
+ return entry;
+ }
+
+ protected String getVersionControlSystem() {
+ return "svn";
+ }
+
+ public void addRepositoryLocation(String reference) {
+ SVNRemoteStorage remoteStorage = SVNRemoteStorage.instance();
+ IRepositoryLocation newRepository = remoteStorage.newRepositoryLocation(reference);
+ remoteStorage.addRepositoryLocation(newRepository);
+ }
+
+ public void checkOut(String[] fileToCheckout, final IProgressMonitor monitor) {
+ HashMap<String, IRepositoryResource> checkoutMap = toMap(getRepositoryResources(fileToCheckout));
+ if (checkoutMap.size() > 0) {
+ CheckoutOperationBuilder operationBuilder = new CheckoutOperationBuilder(checkoutMap);
+ operationBuilder.getOperation().run(monitor);
+ }
+ }
+
+ private IRepositoryResource[] getRepositoryResources(String[] fileToCheckout) {
+ // TODO: Create Repository Locations if they are not available.
+ List<IRepositoryResource> toReturn = new ArrayList<IRepositoryResource>();
+ IRepositoryLocation[] locations = SVNRemoteStorage.instance().getRepositoryLocations();
+ for (IRepositoryLocation location : locations) {
+ IRepositoryRoot root = location.getRoot();
+ String repository = root.getUrl();
+ for (String target : fileToCheckout) {
+ if (target.startsWith(repository)) {
+ IRepositoryResource repositoryResource = root.asRepositoryFile(target, false);
+ if (repositoryResource != null) {
+ toReturn.add(repositoryResource);
+ }
+ }
+ }
+ }
+ return toReturn.toArray(new IRepositoryResource[toReturn.size()]);
+ }
+
+ private HashMap<String, IRepositoryResource> toMap(IRepositoryResource[] resources) {
+ HashMap<String, IRepositoryResource> checkoutMap = new HashMap<String, IRepositoryResource>();
+ for (IRepositoryResource repositoryResource : resources) {
+ checkoutMap.put(repositoryResource.getName(), repositoryResource);
+ }
+ return checkoutMap;
+ }
+
+ public URI getLocalFileMatchingRepositoryUrl(String url, String revision) {
+ return null;
+ }
+
+ private final class CheckoutOperationBuilder {
+ private static final int WAIT_TIME = 30000;
+ private CheckoutOperation checkoutOperation;
+ private HashMap<String, IRepositoryResource> checkoutMap;
+ private boolean callbackReceived;
+
+ public CheckoutOperationBuilder(HashMap<String, IRepositoryResource> checkoutMap) {
+ this.checkoutMap = checkoutMap;
+ this.callbackReceived = false;
+ }
+
+ public void callbackReceived() {
+ synchronized (this) {
+ this.notify();
+ callbackReceived = true;
+ }
+ }
+
+ protected void setCallbackReceived(boolean received) {
+ callbackReceived = received;
+ }
+
+ protected boolean wasCallbackReceived() {
+ return callbackReceived;
+ }
+
+ public CheckoutOperation getOperation() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ checkoutOperation = getCheckoutOperation(checkoutMap);
+ callbackReceived();
+ }
+ });
+ synchronized (this) {
+ if (!wasCallbackReceived()) {
+ try {
+ this.wait(WAIT_TIME);
+ } catch (InterruptedException ex) {
+ }
+ }
+ }
+ return checkoutOperation;
+ }
+
+ @SuppressWarnings("unchecked")
+ private CheckoutOperation getCheckoutOperation(HashMap<String, IRepositoryResource> checkoutMap) {
+ CheckoutOperation toReturn = null;
+ if (checkoutMap != null) {
+ HashMap resources2names = CheckoutAction.getResources2Names(checkoutMap);
+ ArrayList operateResources =
+ CheckoutAction.getOperateResources(checkoutMap, resources2names,
+ PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ ResourcesPlugin.getWorkspace().getRoot().getLocation().toString(), true);
+
+ if (operateResources.size() > 0) {
+ IRepositoryResource[] checkoutSet =
+ (IRepositoryResource[]) operateResources.toArray(new IRepositoryResource[operateResources.size()]);
+ HashMap operateMap = new HashMap();
+ for (int i = 0; i < checkoutSet.length; i++) {
+ operateMap.put(resources2names.get(checkoutSet[i]), checkoutSet[i]);
+ }
+ try {
+ Class<?> clazz =
+ Platform.getBundle("org.eclipse.team.svn.core").loadClass(
+ "org.eclipse.team.svn.core.operation.remote.CheckoutOperation");
+ if (EclipseVersion.isVersion("3.3")) {
+ Constructor<?> constructor =
+ clazz.getConstructor(Map.class, boolean.class, String.class, boolean.class);
+ toReturn = (CheckoutOperation) constructor.newInstance(operateMap, false, null, true);
+ } else if (EclipseVersion.isVersion("3.4")) {
+ Constructor<?> constructor =
+ clazz.getConstructor(Map.class, boolean.class, String.class, int.class);
+ toReturn =
+ (CheckoutOperation) constructor.newInstance(operateMap, true, null, Depth.INFINITY, true);
+ }
+ } catch (Exception ex) {
+ throw new UnsupportedOperationException();
+ }
+ }
+ }
+ return toReturn;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnActivator.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnActivator.java
new file mode 100644
index 00000000000..65a584bcf6a
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/SvnActivator.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.framework.svn;
+
+import org.eclipse.osee.framework.plugin.core.OseeActivator;
+
+/**
+ * The activator class controls the plug-in life cycle see http://svnkit.com/kb/examples/index.php for code examples on
+ * svn
+ *
+ * @author Ryan D. Brooks
+ */
+public class SvnActivator extends OseeActivator {
+ private static SvnActivator pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "osee.svn";
+
+ public SvnActivator() {
+ pluginInstance = this;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static SvnActivator getInstance() {
+ return pluginInstance;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/VersionControl.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/VersionControl.java
new file mode 100644
index 00000000000..2b698f1b9c7
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/VersionControl.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.framework.svn;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Properties;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.svn.entry.IRepositoryEntry;
+import org.eclipse.osee.framework.svn.entry.NullRepositoryEntry;
+
+public class VersionControl {
+
+ private static VersionControl instance;
+
+ public static VersionControl getInstance() {
+ if (instance == null) {
+ instance = new VersionControl();
+ }
+ return instance;
+ }
+
+ private VersionControl() {
+ }
+
+ public URI getLocalFileMatchingRepositoryUrl(String url, String revision) {
+ return SvnAPI.getInstance().getLocalFileMatchingRepositoryUrl(url, revision);
+ }
+
+ public IRepositoryEntry getRepositoryEntry(File file) {
+ if (SvnAPI.getInstance().isSvn(file)) {
+ return SvnAPI.getInstance().getSVNInfo(file);
+ } else if (isClearcase(file)) {
+ return new ClearCaseInfo(file);
+ } else {
+ return new NullRepositoryEntry();
+ }
+ }
+
+ public String getRepositoryType(File file) {
+ String toReturn = "unknown";
+ if (SvnAPI.getInstance().isSvn(file)) {
+ toReturn = SvnAPI.getInstance().getVersionControlSystem();
+ } else if (isClearcase(file)) {
+ toReturn = "clearcase";
+ }
+ return toReturn;
+ }
+
+ public void checkOut(String[] fileToCheckout, IProgressMonitor monitor) {
+ SvnAPI.getInstance().checkOut(fileToCheckout, monitor);
+ }
+
+ private boolean isClearcase(File file) {
+ Properties p = System.getProperties();
+ // Unix
+ if (p.getProperty("file.separator").equals("/")) {
+ File ctFile = new File("/usr/src/rational/2003.06.00/rhat_x86/clearcase/rhat_x86/bin/cleartool");
+
+ if (ctFile.exists())
+ return true;
+ else
+ return false;
+ }
+ // Windows
+ if (p.getProperty("file.separator").equals("\\")) {
+ File ctFile = new File("C:\\Program Files\\Rational\\ClearCase\\bin\\cleartool.exe");
+
+ if (ctFile.exists())
+ return true;
+ else
+ return false;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/IRepositoryEntry.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/IRepositoryEntry.java
new file mode 100644
index 00000000000..6445fe384b9
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/IRepositoryEntry.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.framework.svn.entry;
+
+public interface IRepositoryEntry {
+
+ String getVersion();
+
+ String getURL();
+
+ String getVersionControlSystem();
+
+ String getModifiedFlag();
+
+ String getLastModificationDate();
+
+ String getLastAuthor();
+
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/NullRepositoryEntry.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/NullRepositoryEntry.java
new file mode 100644
index 00000000000..ab316aa6c85
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/NullRepositoryEntry.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.framework.svn.entry;
+
+public class NullRepositoryEntry implements IRepositoryEntry {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getVersion()
+ */
+ public String getVersion() {
+ return "-";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getURL()
+ */
+ public String getURL() {
+ return "-";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getVersionControlSystem()
+ */
+ public String getVersionControlSystem() {
+ return "-";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getModifiedFlag()
+ */
+ public String getModifiedFlag() {
+ return "-";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getLastAuthor()
+ */
+ public String getLastAuthor() {
+ return "-";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getLastModificationDate()
+ */
+ public String getLastModificationDate() {
+ return "-";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/RepositoryEntry.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/RepositoryEntry.java
new file mode 100644
index 00000000000..2e1d4c8f1a3
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/entry/RepositoryEntry.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.svn.entry;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.svn.enums.RepositoryEnums.EntryFields;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RepositoryEntry implements IRepositoryEntry {
+
+ private Map<EntryFields, String> entryMap;
+ private String modifiedFlag;
+ private String fileType;
+ private String controlSystem;
+
+ public RepositoryEntry(String fileType, String controlSystem) {
+ this.entryMap = new HashMap<EntryFields, String>();
+ this.modifiedFlag = "";
+ this.fileType = fileType;
+ this.controlSystem = controlSystem;
+ }
+
+ public String getField(EntryFields field) {
+ if (entryMap.containsKey(field)) {
+ return entryMap.get(field);
+ }
+ return "";
+ }
+
+ public boolean containsField(EntryFields field) {
+ return entryMap.containsKey(field);
+ }
+
+ public void setModifiedFlag(String modifiedFlag) {
+ this.modifiedFlag = modifiedFlag;
+ }
+
+ public void addField(EntryFields field, String value) {
+ entryMap.put(field, value);
+ }
+
+ public String toString() {
+ String toReturn = " Entry: " + getType() + "\n";
+ Set<EntryFields> keys = entryMap.keySet();
+ for (EntryFields field : keys) {
+ toReturn += "\t" + field + ": " + entryMap.get(field) + "\n";
+ }
+ return toReturn;
+ }
+
+ public String getVersion() {
+ return getField(EntryFields.committedRev);
+ }
+
+ public String getURL() {
+ return getField(EntryFields.url);
+ }
+
+ public String getModifiedFlag() {
+ return modifiedFlag;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getLastAuthor()
+ */
+ public String getLastAuthor() {
+ return getField(EntryFields.lastAuthor);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getLastModificationDate()
+ */
+ public String getLastModificationDate() {
+ return getField(EntryFields.dateCommitted);
+ }
+
+ public String getType() {
+ return fileType;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.svn.entry.IRepositoryEntry#getVersionControlSystem()
+ */
+ public String getVersionControlSystem() {
+ return controlSystem;
+ }
+}
diff --git a/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/enums/RepositoryEnums.java b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/enums/RepositoryEnums.java
new file mode 100644
index 00000000000..9ddfa1cef5f
--- /dev/null
+++ b/org.eclipse.osee.framework.svn/src/org/eclipse/osee/framework/svn/enums/RepositoryEnums.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.framework.svn.enums;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RepositoryEnums {
+
+ public enum ControlledType {
+ dir, file;
+
+ public static boolean isDefined(String value) {
+ ControlledType[] types = ControlledType.values();
+ for (ControlledType type : types) {
+ if (type.name().equals(value)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ public enum EntryFields {
+ committedRev("committed-rev"),
+ fileName("name"),
+ committeDate("committed-date"),
+ url("url"),
+ lastAuthor("last-author"),
+ kind("kind"),
+ uuid("uuid"),
+ repository("repos"),
+ currentRevision("revision"),
+ textTime("text-time"),
+ dateCommitted("committed-date"),
+ checksum("checksum"),
+ properTime("prop-time");
+
+ private String value;
+
+ private EntryFields(String value) {
+ this.value = value;
+ }
+
+ public String getEntryName() {
+ return value;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.templates/.classpath b/org.eclipse.osee.framework.templates/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/.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.framework.templates/.project b/org.eclipse.osee.framework.templates/.project
new file mode 100644
index 00000000000..8e74043f4a4
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.templates</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.templates/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.templates/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.templates/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.templates/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..30a7c4df11a
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Java Code Content Assist Templates Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.templates;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Localization: plugin
+Bundle-Vendor: Eclipse.org
diff --git a/org.eclipse.osee.framework.templates/build.properties b/org.eclipse.osee.framework.templates/build.properties
new file mode 100644
index 00000000000..6f20375d6c7
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.framework.templates/plugin.xml b/org.eclipse.osee.framework.templates/plugin.xml
new file mode 100644
index 00000000000..4cefeaa3eb2
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/plugin.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.editors.templates">
+ <include file="templates/default-templates.xml"/>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.templates/templates/default-templates.xml b/org.eclipse.osee.framework.templates/templates/default-templates.xml
new file mode 100644
index 00000000000..a60f388ae8f
--- /dev/null
+++ b/org.eclipse.osee.framework.templates/templates/default-templates.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+
+<templates>
+<template autoinsert="false" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">OSEELog.logException(getClass(), ${exception_var}, true);</template>
+<template name="logger" description="Declares a standard OSEE logger for the current class" id="osee.templates.logger" context="java" enabled="true" autoinsert="true">private static final Logger logger = ConfigUtil.getConfigFactory().getLogger(${enclosing_type}.class);${cursor}</template>
+<template name="notnull" description="Perform a standard parameter check for a null value" id="osee.templates.notnull" context="java" enabled="true" autoinsert="true">if (${variable_name} == null)
+ throw new IllegalArgumentException("${variable_name} can not be null");
+${cursor}</template>
+<template name="notempty" description="Perform a standard parameter check for an empty collection " id="osee.templates.notempty" context="java" enabled="true" autoinsert="true">if (${variable_name}.isEmpty())
+ throw new IllegalArgumentException("${variable_name} can not be empty");
+${cursor}</template>
+
+</templates>
diff --git a/org.eclipse.osee.framework.ui.admin/.classpath b/org.eclipse.osee.framework.ui.admin/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/.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.framework.ui.admin/.project b/org.eclipse.osee.framework.ui.admin/.project
new file mode 100644
index 00000000000..dc67048ddd9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.admin</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.admin/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.admin/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.admin/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.admin/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c96a4a37011
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Admin Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.admin;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-ClassPath: admin.jar
+Bundle-Activator: org.eclipse.osee.framework.ui.admin.AdminPlugin
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.framework.ui.admin,
+ org.eclipse.osee.framework.ui.admin.dbtabletab
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.messaging.event.skynet,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.ui.forms,
+ org.eclipse.osee.framework.database
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.query,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.ui.admin/build.properties b/org.eclipse.osee.framework.ui.admin/build.properties
new file mode 100644
index 00000000000..48377aa02c3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/build.properties
@@ -0,0 +1,7 @@
+source.admin.jar = src/
+output.admin.jar = bin/
+bin.includes = plugin.xml,\
+ admin.jar,\
+ images/,\
+ META-INF/,\
+ src/
diff --git a/org.eclipse.osee.framework.ui.admin/images/admin.gif b/org.eclipse.osee.framework.ui.admin/images/admin.gif
new file mode 100644
index 00000000000..272eec37d74
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/admin.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/bug.gif b/org.eclipse.osee.framework.ui.admin/images/bug.gif
new file mode 100644
index 00000000000..9a738e55054
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/bug.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/help.gif b/org.eclipse.osee.framework.ui.admin/images/help.gif
new file mode 100644
index 00000000000..9d70301dae3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/help.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/lockkey.gif b/org.eclipse.osee.framework.ui.admin/images/lockkey.gif
new file mode 100644
index 00000000000..fca03252afd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/lockkey.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/needSave.gif b/org.eclipse.osee.framework.ui.admin/images/needSave.gif
new file mode 100644
index 00000000000..499dd0ca602
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/needSave.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/policy.jpg b/org.eclipse.osee.framework.ui.admin/images/policy.jpg
new file mode 100644
index 00000000000..e015d7f18e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/policy.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/refresh.gif b/org.eclipse.osee.framework.ui.admin/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/images/saved.gif b/org.eclipse.osee.framework.ui.admin/images/saved.gif
new file mode 100644
index 00000000000..ad505a9c23f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/images/saved.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.admin/plugin.xml b/org.eclipse.osee.framework.ui.admin/plugin.xml
new file mode 100644
index 00000000000..f6c7dea1388
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ name="OSEE Admin"
+ id="osee.admin">
+ </category>
+ <view
+ name="OSEE Admin"
+ icon="images/admin.gif"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.admin.AdminView"
+ id="osee.admin.AdminView">
+ </view>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminAction.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminAction.java
new file mode 100644
index 00000000000..a6e7528d208
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminAction.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.framework.ui.admin;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AdminAction implements IWorkbenchWindowActionDelegate {
+
+ IWorkbenchWindow activeWindow = null;
+
+ public void run(IAction proxyAction) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ page.showView(AdminView.VIEW_ID);
+ } catch (PartInitException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Launch Error",
+ "Couldn't Launch Admin View " + e1.getMessage());
+ }
+ }
+
+ // IActionDelegate method
+ public void selectionChanged(IAction proxyAction, ISelection selection) {
+
+ }
+
+ // IWorkbenchWindowActionDelegate method
+ public void init(IWorkbenchWindow window) {
+ activeWindow = window;
+ }
+
+ // IWorkbenchWindowActionDelegate method
+ public void dispose() {
+ // nothing to do
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminPlugin.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminPlugin.java
new file mode 100644
index 00000000000..9bf53202b1a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminPlugin.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.framework.ui.admin;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Jeff C. Phillips
+ */
+public class AdminPlugin extends OseeUiActivator {
+
+ // The shared instance.
+ private static AdminPlugin pluginInstance;
+
+ /**
+ * The constructor.
+ */
+ public AdminPlugin() {
+ pluginInstance = this;
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static AdminPlugin getDefault() {
+ return pluginInstance;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static AdminPlugin getInstance() {
+ return pluginInstance;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminView.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminView.java
new file mode 100644
index 00000000000..e7a73d7d704
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/AdminView.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.admin;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.event.BroadcastEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.ui.admin.dbtabletab.DbItem;
+import org.eclipse.osee.framework.ui.admin.dbtabletab.DbTableTab;
+import org.eclipse.osee.framework.ui.admin.dbtabletab.SiteGssflRpcr;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Allows administration of access for OSEE environment <li>Database tables <li>OSEE user permissions
+ *
+ * @author Jeff C. Phillips
+ */
+
+public class AdminView extends ViewPart implements IActionable {
+ public static final OseeUiActivator plugin = AdminPlugin.getInstance();
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.admin.AdminView";
+ private static Action saveAction;
+ private TabFolder tabFolder;
+ private final ArrayList<DbItem> dbItems;
+ private final Cursor handCursor;
+
+ /**
+ * The constructor.
+ */
+ public AdminView() {
+ dbItems = new ArrayList<DbItem>();
+ dbItems.add(new SiteGssflRpcr());
+ handCursor = new Cursor(null, SWT.CURSOR_HAND);
+
+ // permissionList.addPermission(PermissionEnum.);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ handCursor.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ protected void createActions() throws OseeCoreException {
+
+ saveAction = new Action("Save") {
+ @Override
+ public void run() {
+ save();
+ }
+ };
+ saveAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.SAVED));
+ saveAction.setToolTipText("Save");
+
+ Action refreshAction = new Action("Refresh") {
+
+ @Override
+ public void run() {
+ try {
+ DbTableTab.refresh();
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AdminView.class, Level.SEVERE, ex);
+ }
+ }
+ };
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ refreshAction.setToolTipText("Refresh");
+
+ Action broadcastMessage = new Action("Broadcast Message") {
+
+ @Override
+ public void run() {
+ handleBroadcastMessage();
+ }
+ };
+
+ broadcastMessage.setToolTipText("Broadcast Message");
+ broadcastMessage.setEnabled(AccessControlManager.isOseeAdmin());
+
+ Action pingAction = new Action("Ping OSEE Clients") {
+
+ @Override
+ public void run() {
+ handlePing();
+ }
+ };
+
+ pingAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.HELP));
+ pingAction.setToolTipText("Ping OSEE Clients");
+ pingAction.setEnabled(AccessControlManager.isOseeAdmin());
+
+ OseeAts.addBugToViewToolbar(this, this, AdminPlugin.getInstance(), VIEW_ID, "Admin");
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(saveAction);
+ toolbarManager.add(refreshAction);
+ toolbarManager.add(broadcastMessage);
+ if (AccessControlManager.isOseeAdmin()) {
+ toolbarManager.add(pingAction);
+ }
+ }
+
+ public void handleBroadcastMessage() {
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Broadcast Message to OSEE Instantiations", null,
+ "Enter Message", MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ if (ed.open() == 0) {
+ String message = ed.getEntry();
+ if (!message.equals("")) {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Broadcast Message",
+ "Broadcast message\n\n\"" + message + "\"\n\nAre you sure?")) {
+ try {
+ OseeEventManager.kickBroadcastEvent(this, BroadcastEventType.Message, new String[] {}, message);
+ AWorkbench.popup("Success", "Message sent.");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+ }
+
+ public void handlePing() {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Ping OSEE Instantiations?",
+ "Ping OSEE Instantiations?")) {
+ try {
+ OseeEventManager.kickBroadcastEvent(this, BroadcastEventType.Ping, new String[] {},
+ ClientSessionManager.getSession().toString());
+ AWorkbench.popup("Success", "Ping Sent");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ try {
+ // IStatusLineManager slManager= getViewSite().getActionBars().getStatusLineManager();
+ // slManager.setErrorMessage("error");
+
+ GridData gridData = new GridData();
+ gridData.verticalAlignment = GridData.FILL;
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.grabExcessHorizontalSpace = true;
+
+ GridLayout gridLayout = new GridLayout(1, false);
+ gridData.heightHint = 1000;
+ gridData.widthHint = 1000;
+ parent.setLayout(gridLayout);
+
+ tabFolder = new TabFolder(parent, SWT.BORDER);
+ tabFolder.setLayoutData(gridData);
+
+ // ModeChecker.check(parent);
+
+ new OseeClientsTab(tabFolder);
+
+ new DbTableTab(tabFolder);
+
+ parent.layout();
+
+ createActions();
+ } catch (Exception ex) {
+ OseeLog.log(AdminPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * handles saving to the database for every tab item
+ */
+ public void save() {
+ // database tab
+ if (tabFolder.getSelectionIndex() == 2) {
+ DbTableTab.dbTableViewer.save();
+ setSaveNeeded(false);
+ }
+ }
+
+ public static void setSaveNeeded(boolean needed) {
+
+ if (needed)
+ saveAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.SAVE_NEEDED));
+ else
+ saveAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.SAVED));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ public String getActionDescription() {
+ String desc = "";
+ TabItem items[] = tabFolder.getSelection();
+ if (items.length == 1) {
+ String tabName = items[0].getText();
+ desc += String.format("Tab = %s ", tabName);
+ }
+ return desc;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/Group.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/Group.java
new file mode 100644
index 00000000000..f1c06097075
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/Group.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.admin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class Group {
+
+ private int groupId;
+ private String groupName;
+ private int childrenSize;
+ private int numChildrenChecked;
+
+ /**
+ *
+ */
+ public Group(String groupName, int groupId) {
+ super();
+ this.groupName = groupName;
+ this.groupId = groupId;
+ }
+
+ /**
+ * @return Returns the groupId.
+ */
+ public int getGroupId() {
+ return groupId;
+ }
+
+ /**
+ * @return Returns the groupName.
+ */
+ public String getGroupName() {
+ return groupName;
+ }
+
+ /**
+ * @return Returns the childrenSize.
+ */
+ public int getChildrenSize() {
+ return childrenSize;
+ }
+
+ /**
+ * @param childrenSize The childrenSize to set.
+ */
+ public void setChildrenSize(int childrenSize) {
+ this.childrenSize = childrenSize;
+ }
+
+ /**
+ * @return Returns the currentNumberChildrenChecked.
+ */
+ public int getNumChildrenChecked() {
+ return numChildrenChecked;
+ }
+
+ /**
+ * Increments the number of checked policies per user.<br>
+ * <br>
+ * Note: This is to maintain graying and checking functionality for each user. <br>
+ * When the <code>numChildrenChecked</code> is equal to the <code>childrenSize</code> <br>
+ * the parent will be checked. If the <code>numChildrenChecked</code> is equal to 0, <br>
+ * then it will be unchecked. Else it will be grayed.
+ */
+ public void incrementChildChecked() {
+ numChildrenChecked++;
+ }
+
+ /**
+ * * decrements the number of checked policies per user.<br>
+ * <br>
+ * Note: This is to maintain graying and checking functionality for each user. <br>
+ * When the <code>numChildrenChecked</code> is equal to the <code>childrenSize</code> <br>
+ * the parent will be checked. If the <code>numChildrenChecked</code> is equal to 0, <br>
+ * then it will be unchecked. Else it will be grayed.
+ */
+ public void minusChildChecked() {
+ numChildrenChecked--;
+ }
+
+ /**
+ * @return boolean, true if all the children are checked else false
+ */
+ public boolean isAllChecked() {
+ if (numChildrenChecked == childrenSize) return true;
+ return false;
+ }
+
+ /**
+ * @return boolean, true if none of the children are checked else false
+ */
+ public boolean isAllEmpty() {
+ if (numChildrenChecked == 0) return true;
+ return false;
+ }
+
+ /**
+ * reset the number of checked polcies
+ */
+ public void resetChildrenCheckedCount() {
+ numChildrenChecked = 0;
+ }
+
+ /**
+ * @param numChildrenChecked The numChildrenChecked to set.
+ */
+ public void setNumChildrenChecked(int numChildrenChecked) {
+ this.numChildrenChecked = numChildrenChecked;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/OseeClientsTab.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/OseeClientsTab.java
new file mode 100644
index 00000000000..5c41e3d3872
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/OseeClientsTab.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.admin;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.event.BroadcastEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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.Font;
+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.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+public class OseeClientsTab {
+
+ private final User whoAmI;
+ private final ArrayList<User> users;
+ private CheckboxTreeViewer peopleCheckboxTreeViewer;
+ private Composite mainComposite;
+ private Text text;
+
+ public OseeClientsTab(TabFolder tabFolder) throws OseeCoreException {
+ super();
+ this.users = UserManager.getUsersSortedByName();
+ this.whoAmI = UserManager.getUser();
+ users.remove(whoAmI);
+ this.mainComposite = null;
+ createControl(tabFolder);
+ mainComposite.setEnabled(isUserAllowedToOperate());
+ }
+
+ private void createControl(TabFolder tabFolder) throws OseeCoreException {
+ mainComposite = new Composite(tabFolder, SWT.NONE);
+ mainComposite.setLayout(new GridLayout());
+ mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ TabItem tab = new TabItem(tabFolder, SWT.NONE);
+ tab.setControl(mainComposite);
+ tab.setText("OSEE Clients");
+
+ Group group = new Group(mainComposite, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setText("Issue Shutdown Request");
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ if (isUserAllowedToOperate()) {
+ SashForm sashForm = new SashForm(group, SWT.NONE);
+ sashForm.setLayout(new GridLayout());
+ sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createUserSelectionArea(sashForm);
+ createMessageArea(sashForm);
+ } else {
+ createDefaultWarning(group);
+ }
+ }
+
+ private void createMessageArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Group group = new Group(composite, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Enter Reason for Shutdown -- THIS WILL BE DISPLAYED TO THE SELECTED USERS --");
+
+ text = new Text(group, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
+ text.setEditable(true);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+ gd.heightHint = 100;
+ text.setLayoutData(gd);
+
+ Button button = new Button(composite, SWT.NONE);
+ button.setText("Send Shutdown Request");
+ button.setToolTipText("By pressing the send button, a shutdown message will be sent to\n" + "all the selected OSEE clients causing their workbench to close.\n" + "NOTE: Users will be prompted to save their work.");
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ processShutdownRequest(text.getText(), getSelectedUsers());
+ }
+ });
+
+ Composite blankComposite = new Composite(composite, SWT.NONE);
+ blankComposite.setLayout(new GridLayout());
+ blankComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ }
+
+ public static Control createDefaultWarning(Composite parent) {
+ Composite composite = new Composite(parent, SWT.BORDER);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ Label image = new Label(composite, SWT.NONE);
+ image.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, true));
+ image.setImage(ImageManager.getImage(FrameworkImage.LOCKED_KEY));
+ image.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ Label label = new Label(composite, SWT.NONE);
+ Font font = new Font(PlatformUI.getWorkbench().getDisplay(), "Courier New", 10, SWT.BOLD);
+ label.setFont(font);
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED));
+ label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, true));
+ label.setText("Access Denied.\nContact your administrator.");
+ label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ return composite;
+ }
+
+ private void processShutdownRequest(String reason, String[] selectedUsers) {
+ if (reason != null && reason.length() > 0 && selectedUsers.length > 0) {
+ boolean result =
+ MessageDialog.openConfirm(mainComposite.getShell(), "Disconnect OSEE Clients",
+ "Are you sure you want to shutdown the selected OSEE clients?");
+ if (false != result) {
+ try {
+ OseeEventManager.kickBroadcastEvent(this, BroadcastEventType.Force_Shutdown, selectedUsers, reason);
+ AWorkbench.popup("Success", "Shutdown request sent.");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ } else {
+ StringBuilder error = new StringBuilder();
+ error.append("Unable to process request.\n");
+ if (reason == null || reason.length() <= 0) {
+ error.append(" A reason must be entered before a client can be requested to shutdown.\n");
+ }
+ if (selectedUsers.length <= 0) {
+ error.append(" At least 1 user must be selected.\n");
+ }
+ MessageDialog.openError(mainComposite.getShell(), "Disconnect OSEE Clients", error.toString());
+ }
+ }
+
+ private boolean isUserAllowedToOperate() throws OseeCoreException {
+ return AccessControlManager.isOseeAdmin();
+ }
+
+ private String[] getSelectedUsers() {
+ List<String> toReturn = new ArrayList<String>();
+ try {
+ Object[] checked = peopleCheckboxTreeViewer.getCheckedElements();
+ for (Object object : checked) {
+ if (false != peopleCheckboxTreeViewer.getChecked(object)) {
+ toReturn.add(((User) object).getUserId());
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AdminPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return toReturn.toArray(new String[toReturn.size()]);
+ }
+
+ private void createUserSelectionArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setText("Select Users to Shutdown");
+
+ peopleCheckboxTreeViewer =
+ new CheckboxTreeViewer(group, SWT.BORDER | SWT.MULTI | SWT.CHECK | SWT.V_SCROLL | SWT.H_SCROLL);
+ peopleCheckboxTreeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ peopleCheckboxTreeViewer.setContentProvider(new TreeContentProvider());
+ peopleCheckboxTreeViewer.setLabelProvider(new PersonLabelProvider());
+ peopleCheckboxTreeViewer.setInput(users);
+ Composite composite = new Composite(group, SWT.NONE);
+ composite.setLayout(new GridLayout(2, true));
+
+ Button selectAll = new Button(composite, SWT.PUSH);
+ selectAll.setText("Select All");
+ selectAll.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectAll(true);
+ }
+ });
+
+ Button deselectAll = new Button(composite, SWT.PUSH);
+ deselectAll.setText("Deselect All");
+ deselectAll.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectAll(false);
+ }
+ });
+ }
+
+ private void selectAll(boolean isSelectAll) {
+ peopleCheckboxTreeViewer.setAllChecked(isSelectAll);
+ }
+
+ private class TreeContentProvider implements ITreeContentProvider {
+
+ public void dispose() {
+ // Nothing to dispose
+ }
+
+ public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
+ // Nothing to change
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getElements(Object inputElement) {
+ return ((ArrayList) inputElement).toArray();
+ }
+ }
+
+ private class PersonLabelProvider extends LabelProvider {
+
+ @Override
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ @Override
+ public String getText(Object arg0) {
+ return ((User) arg0).getName();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbCellModifier.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbCellModifier.java
new file mode 100644
index 00000000000..7288a5827ba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbCellModifier.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.framework.ui.admin.dbtabletab;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.admin.AdminPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.EnumeratedValue;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.StringValue;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * This class implements an ICellModifier An ICellModifier is called when the user modifies a cell in the tableViewer
+ *
+ * @author Jeff C. Phillips
+ */
+
+public class DbCellModifier implements ICellModifier {
+ private final DbTableViewer dbTableViewer;
+ private final EnumeratedValue enumeratedValue;
+ private final StringValue stringValue;
+ private final DbItem dbItem;
+
+ /**
+ * Constructor
+ *
+ * @param dbTableViewer - a DbTableViewer an instance of a TableViewerExample.
+ * @param dbItem - a DbItem.
+ */
+ public DbCellModifier(DbTableViewer dbTableViewer, DbItem dbItem) {
+ super();
+ this.dbTableViewer = dbTableViewer;
+ this.dbItem = dbItem;
+ this.enumeratedValue = new EnumeratedValue();
+ this.stringValue = new StringValue();
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+ */
+ public boolean canModify(Object element, String property) {
+ return true;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+ */
+ public Object getValue(Object element, String property) {
+
+ int columnIndex = dbTableViewer.getColumnNames().indexOf(property);
+ DbModel model = (DbModel) element;
+ Object obj = model.getColumn(columnIndex);
+ if (obj instanceof Long) {
+ stringValue.setValue(((Long) obj).toString());
+ return stringValue;
+ } else if (dbItem.isBems(property)) {
+ try {
+ enumeratedValue.setChoices(UserManager.getUserNames());
+ User u = null;
+ u = UserManager.getUserByUserId((String) obj);
+ if (u != null) enumeratedValue.setValue(u.getName());
+ } catch (Exception ex) {
+ OseeLog.log(AdminPlugin.class, Level.SEVERE, ex);
+ }
+ return enumeratedValue;
+ } else if (obj instanceof String) {
+ stringValue.setValue(((String) obj));
+ return stringValue;
+ } else if (obj == null) {
+ stringValue.setValue((""));
+ return stringValue;
+ }
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public void modify(Object element, String property, Object value) {
+
+ // Find the index of the column
+ int columnIndex = dbTableViewer.getColumnNames().indexOf(property);
+ TableItem item = (TableItem) element;
+ DbModel dbModel = (DbModel) item.getData();
+ Object wasObj = dbModel.getColumn(columnIndex);
+ if (wasObj instanceof Long) {
+ Long newLong = new Long((String) value);
+ Long wasLong = (Long) wasObj;
+ if (newLong != null && !wasLong.equals(newLong)) {
+ dbModel.setColumn(columnIndex, newLong);
+ dbModel.setNeedSave(true);
+ dbModel.setColumnChanged(property);
+ }
+ } else if (dbItem.isBems(property)) {
+ try {
+ String newName = (String) value;
+ User newUser = UserManager.getUserByName(newName);
+ String oldBems = (String) wasObj;
+ if (!newUser.getUserId().equals(oldBems)) {
+ dbModel.setColumn(columnIndex, newUser.getUserId());
+ dbModel.setNeedSave(true);
+ dbModel.setColumnChanged(property);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(AdminPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (wasObj instanceof String) {
+ if (!((String) wasObj).equals(value)) {
+ dbModel.setColumn(columnIndex, value);
+ dbModel.setNeedSave(true);
+ dbModel.setColumnChanged(property);
+ }
+ } else if (wasObj == null) {
+ dbModel.setColumn(columnIndex, value);
+ dbModel.setNeedSave(true);
+ dbModel.setColumnChanged(property);
+ }
+
+ if (dbModel.isNeedSave()) {
+ dbTableViewer.setSaveNeeded(true);
+ dbTableViewer.getTaskList().taskChanged(dbModel);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbDescribe.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbDescribe.java
new file mode 100644
index 00000000000..b7bf2c07d25
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbDescribe.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.framework.ui.admin.dbtabletab;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+
+public class DbDescribe {
+
+ private final DbItem dbItem;
+ private ArrayList<Describe> dbColumns;
+
+ public DbDescribe(DbItem dbItem) {
+ super();
+ this.dbItem = dbItem;
+ this.dbColumns = null;
+ }
+
+ public int indexOfColumn(String name) throws OseeDataStoreException {
+ int toReturn = -1;
+ List<Describe> items = getDescription();
+ for (int index = 0; index < items.size(); index++) {
+ if (items.get(index).name.equals(name)) {
+ toReturn = index;
+ break;
+ }
+ }
+ return toReturn;
+ }
+
+ public List<Describe> getDescription() throws OseeDataStoreException {
+ if (dbColumns == null) {
+ dbColumns = new ArrayList<Describe>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ String sql = "SELECT * FROM " + dbItem.getTableName();
+ chStmt.runPreparedQuery(sql);
+ int numberOfColumns = chStmt.getColumnCount() + 1;
+ for (int columnIndex = 1; columnIndex < numberOfColumns; columnIndex++) {
+ Describe describe = new Describe();
+
+ describe.name = chStmt.getColumnName(columnIndex).toUpperCase();
+ describe.nullable = chStmt.isNullable(columnIndex);
+ describe.type = chStmt.getColumnTypeName(columnIndex).toUpperCase();
+ dbColumns.add(describe);
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+ return dbColumns;
+ }
+
+ public DbTaskList getDbTaskList(List<Describe> describeList) throws OseeDataStoreException {
+ DbTaskList taskList = new DbTaskList();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ String sql = "SELECT * FROM " + dbItem.getTableName();
+ chStmt.runPreparedQuery(sql);
+ while (chStmt.next()) {
+ DbModel dbModel = new DbModel();
+ int x = 0;
+ for (Describe d : describeList) {
+ if (d.type.contains("NUMBER")) {
+ Long l = chStmt.getLong(d.name);
+ dbModel.addColumn(x++, l);
+ } else if (d.type.contains("VARCHAR")) {
+ String value = chStmt.getString(d.name);
+ dbModel.addColumn(x++, value);
+ } else if (d.type.contains("INT")) {
+ Integer value = chStmt.getInt(d.name);
+ dbModel.addColumn(x++, value);
+ } else if (d.type.contains("TIMESTAMP")) {
+ Timestamp value = chStmt.getTimestamp(d.name);
+ dbModel.addColumn(x++, value);
+ } else {
+ dbModel.addColumn(x++, new String("Unknown object type"));
+ }
+ }
+ taskList.addTask(dbModel);
+ }
+ } finally {
+ chStmt.close();
+ }
+ return taskList;
+ }
+ public class Describe {
+ public String name = "Unknown";
+ public boolean nullable = false;
+ public String type = "Unknown";
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbItem.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbItem.java
new file mode 100644
index 00000000000..dc5579ffa59
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbItem.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.framework.ui.admin.dbtabletab;
+
+
+public abstract class DbItem {
+
+ private final String tableName;
+
+ public DbItem(String tableName) {
+ this.tableName = tableName;
+ }
+
+ public boolean isWriteAccess() {
+ return true;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+
+ public abstract boolean isWriteable(String columnName);
+
+ public abstract boolean isBems(String columnName);
+
+ public abstract int getColumnWidth(String columnName);
+
+ public abstract void save(DbDescribe descibre, DbModel model);
+
+ public abstract DbModel createNewRow(DbModel example);
+
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbLabelProvider.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbLabelProvider.java
new file mode 100644
index 00000000000..b5a9968c6c7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbLabelProvider.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.framework.ui.admin.dbtabletab;
+
+import java.sql.Timestamp;
+import org.eclipse.jface.viewers.ITableColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Label provider for the TableViewerExample
+ *
+ * @see org.eclipse.jface.viewers.LabelProvider
+ * @author Jeff C. Phillips
+ */
+public class DbLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider {
+
+ private final String[] columnNames;
+
+ public DbLabelProvider(String[] columnNames) {
+ this.columnNames = columnNames;
+ };
+
+ public Color getForeground(Object element, int columnIndex) {
+ DbModel model = (DbModel) element;
+ if (model.isColumnChanged(columnNames[columnIndex])) return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
+ return null;
+ }
+
+ public Color getBackground(Object element, int columnIndex) {
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ DbModel dbModel = (DbModel) element;
+ Object obj = dbModel.getColumn(columnIndex);
+ if (obj == null)
+ return "";
+ else if (obj instanceof String)
+ return (String) obj;
+ else if (obj instanceof Long)
+ return ((Long) obj).toString();
+ else if (obj instanceof Integer)
+ return ((Integer) obj).toString();
+ else if (obj instanceof Timestamp)
+ return ((Timestamp) obj).toString();
+ else
+ return "Unknown column type";
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbModel.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbModel.java
new file mode 100644
index 00000000000..96948be757f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbModel.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.framework.ui.admin.dbtabletab;
+
+import java.util.ArrayList;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DbModel {
+
+ private ArrayList<Object> columns = new ArrayList<Object>();
+ private boolean needSave = false;
+ private ArrayList<String> changedColumns = new ArrayList<String>();
+
+ public DbModel() {
+ }
+
+ public Object getColumn(int num) {
+ if (columns.size() == 0 || num > columns.size())
+ return "";
+ else
+ return columns.get(num);
+ }
+
+ public void addColumn(int column, Object obj) {
+ columns.add(column, obj);
+ }
+
+ public void setColumn(int column, Object obj) {
+ columns.set(column, obj);
+ }
+
+ public boolean isNeedSave() {
+ return needSave;
+ }
+
+ public void setNeedSave(boolean needSave) {
+ this.needSave = needSave;
+ }
+
+ public void setColumnChanged(String column) {
+ if (column == null) changedColumns.clear();
+ changedColumns.add(column);
+ }
+
+ public boolean isColumnChanged(String column) {
+ return changedColumns.contains(column);
+ }
+
+ public String[] getValues() {
+ String[] values = new String[columns.size()];
+ int x = 0;
+ for (Object o : columns) {
+ if (o instanceof String)
+ values[x] = (String) o;
+ else if (o instanceof Long)
+ values[x] = ((Long) o).toString();
+ else if (o == null) {
+ values[x] = "";
+ } else {
+ System.err.println("Invalid value type");
+ }
+ x++;
+ }
+ return values;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableSorter.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableSorter.java
new file mode 100644
index 00000000000..3b40068e404
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableSorter.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.framework.ui.admin.dbtabletab;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * Sorter for the WorldTableViewer that displays items of type <code>ExampleTask</code>. The sorter supports three
+ * sort criteria:
+ * <p>
+ * <code>DESCRIPTION</code>: Task description (String)
+ * </p>
+ * <p>
+ * <code>OWNER</code>: Task Owner (String)
+ * </p>
+ * <p>
+ * <code>PERCENT_COMPLETE</code>: Task percent completed (int).
+ * </p>
+ *
+ * @author Donald G. Dunne
+ */
+public class DbTableSorter extends ViewerSorter {
+
+ // Criteria that the instance uses
+ private int criteria;
+
+ /**
+ * Creates a resource sorter that will use the given sort criteria.
+ *
+ * @param criteria the sort criterion to use: one of <code>NAME</code> or <code>TYPE</code>
+ */
+ public DbTableSorter(int criteria) {
+ super();
+ this.criteria = criteria;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on ViewerSorter.
+ */
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ Object obj1 = ((DbModel) o1).getColumn(criteria);
+ Object obj2 = ((DbModel) o2).getColumn(criteria);
+ if (obj1 instanceof Long) {
+ return compareStrings(((Long) obj1).toString(), ((Long) obj2).toString());
+ } else if (obj1 instanceof String) {
+ return compareStrings((String) obj1, (String) obj2);
+ }
+
+ return 0;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected int compareStrings(String str1, String str2) {
+ if (str1 == null) str1 = "";
+ if (str2 == null) str2 = "";
+ return getComparator().compare(str1, str2);
+ }
+
+ /**
+ * Returns the sort criteria of this this sorter.
+ *
+ * @return the sort criterion
+ */
+ public int getCriteria() {
+ return criteria;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableTab.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableTab.java
new file mode 100644
index 00000000000..9464082badb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableTab.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.admin.dbtabletab;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.ui.admin.AdminPlugin;
+import org.eclipse.osee.framework.ui.admin.AdminView;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+
+public class DbTableTab {
+ protected Browser browser;
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.admin.AdminView";
+ public static User person;
+ public static DbTableViewer dbTableViewer;
+ private static XCombo filterCombo;
+ private Label readOnlyLabel, addRecordLabel, publishLabel;
+ private ArrayList<DbItem> dbItems;
+ private Cursor handCursor;
+ private boolean noListener = true;
+ private Composite parent;
+
+ public DbTableTab(TabFolder tabFolder) {
+ super();
+
+ dbItems = new ArrayList<DbItem>();
+ dbItems.add(new SkynetUsageDbItem());
+ dbItems.add(new SiteGssflRpcr());
+ dbItems.add(new OseeInfoDbItem());
+ handCursor = new Cursor(null, SWT.CURSOR_HAND);
+
+ TabItem dbTab = new TabItem(tabFolder, SWT.NULL);
+ dbTab.setText("Database");
+
+ // Filter Composite
+ int numColumns = 5;
+ Composite c = new Composite(tabFolder, SWT.NONE);
+ c.setLayout(new GridLayout(numColumns, false));
+ c.setLayoutData(new GridData());
+
+ c.setLayoutData(new GridData(GridData.FILL_BOTH));
+ this.parent = c;
+
+ filterCombo = new XCombo("DB Table", "");
+ filterCombo.setDataStrings(getDbTableNames());
+ filterCombo.createWidgets(c, 2);
+ filterCombo.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ try {
+ handleTableSelect();
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AdminPlugin.class, Level.SEVERE, ex);
+ }
+ AdminView.setSaveNeeded(false);
+ }
+ });
+
+ readOnlyLabel = new Label(c, SWT.NONE);
+ readOnlyLabel.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+
+ addRecordLabel = new Label(c, SWT.NONE);
+ addRecordLabel.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+ addRecordLabel.addMouseTrackListener(new MouseTrackListener() {
+
+ public void mouseEnter(MouseEvent e) {
+ if (getSelectedDbItem() != null && getSelectedDbItem().isWriteAccess()) if (addRecordLabel != null) addRecordLabel.setCursor(handCursor);
+ }
+
+ public void mouseExit(MouseEvent e) {
+ if (addRecordLabel != null) addRecordLabel.setCursor(null);
+ };
+
+ public void mouseHover(MouseEvent e) {
+ }
+ });
+
+ publishLabel = new Label(c, SWT.NONE);
+ publishLabel.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+ publishLabel.addMouseTrackListener(new MouseTrackListener() {
+
+ public void mouseEnter(MouseEvent e) {
+ if (getSelectedDbItem() != null && getSelectedDbItem().isWriteAccess()) if (publishLabel != null) publishLabel.setCursor(handCursor);
+ }
+
+ public void mouseExit(MouseEvent e) {
+ if (publishLabel != null) publishLabel.setCursor(null);
+ };
+
+ public void mouseHover(MouseEvent e) {
+ }
+ });
+
+ updateReadOnly();
+ dbTab.setControl(c);
+ }
+
+ Listener addRecordListener = new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ System.out.println("I am adding a row...");
+ handleAddRecord();
+ };
+ };
+
+ public void handleAddRecord() {
+ System.out.println("trying to add a record");
+ dbTableViewer.addRecord();
+ }
+
+ public void updateReadOnly() {
+ DbItem selItem = getSelectedDbItem();
+ if (selItem == null) {
+ readOnlyLabel.setText("");
+ addRecordLabel.setText(" ");
+ } else if (selItem.isWriteAccess()) {
+ readOnlyLabel.setText(" WRITE ACCESS");
+ addRecordLabel.setText(" Add Record ");
+
+ if (noListener) addRecordLabel.addListener(SWT.MouseUp, addRecordListener);
+ noListener = false;
+ } else {
+ readOnlyLabel.setText(" READ ONLY ACCESS");
+ addRecordLabel.setText(" ");
+ addRecordLabel.removeListener(SWT.MouseUp, addRecordListener);
+ }
+ }
+
+ public DbItem getSelectedDbItem() {
+ for (DbItem d : dbItems) {
+ if (filterCombo.get().equals(d.getTableName())) return d;
+ }
+ return null;
+ }
+
+ public void handleTableSelect() throws OseeDataStoreException {
+ if (dbTableViewer != null) dbTableViewer.dispose();
+ updateReadOnly();
+ if (filterCombo.get().equals("")) return;
+
+ dbTableViewer = new DbTableViewer(parent, 5, this, getSelectedDbItem());
+ dbTableViewer.load();
+ parent.layout();
+ }
+
+ public static void refresh() throws OseeDataStoreException {
+ if (filterCombo.get().equals("")) return;
+ if (dbTableViewer != null) {
+ dbTableViewer.load();
+ dbTableViewer.refresh();
+ }
+ }
+
+ public XCombo getFilterCombo() {
+ return filterCombo;
+ }
+
+ public String[] getDbTableNames() {
+ String names[] = new String[dbItems.size()];
+ for (int x = 0; x < dbItems.size(); x++) {
+ names[x] = dbItems.get(x).getTableName();
+ }
+ return names;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableViewer.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableViewer.java
new file mode 100644
index 00000000000..3cb5acf1d94
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTableViewer.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.admin.dbtabletab;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.ui.admin.AdminView;
+import org.eclipse.osee.framework.ui.admin.dbtabletab.DbDescribe.Describe;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.UniversalCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeListener;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+public class DbTableViewer {
+
+ private DbTableTab dbTab;
+
+ // private Shell shell;
+ private Table table;
+ private TableViewer tableViewer;
+
+ private List<Describe> describeList;
+ private DbTaskList dbTaskList;
+ private DbDescribe dbDescribe;
+ private final DbItem dbItem;
+
+ /**
+ * @param parent
+ * @throws OseeDataStoreException
+ */
+ public DbTableViewer(Composite parent, int numColumns, DbTableTab dbTab, DbItem dbItem) throws OseeDataStoreException {
+ this.dbTab = dbTab;
+ this.dbItem = dbItem;
+ getTableDescription();
+ this.addChildControls(parent, numColumns);
+ }
+
+ public void save() {
+ for (DbModel dbModel : getTasks()) {
+ if (dbModel.isNeedSave()) dbItem.save(dbDescribe, dbModel);
+ dbModel.setNeedSave(false);
+ dbModel.setColumnChanged(null);
+ }
+ refresh();
+ }
+
+ public void addRecord() {
+ for (DbModel dbModel : getTasks()) {
+ if (dbModel.isNeedSave()) {
+ AWorkbench.popup("ERROR", "Save Table Before Adding Record");
+ return;
+ }
+ }
+ // Send in the first record as an example
+ DbModel dbModel = dbItem.createNewRow(getTasks().get(0));
+ dbTaskList.addTask(dbModel);
+ refresh();
+ }
+
+ public void add(DbModel a) {
+ dbTaskList.addTask(a);
+ }
+
+ public List<String> getColumnNames() {
+ ArrayList<String> list = new ArrayList<String>();
+ for (Describe d : describeList)
+ list.add(d.name);
+ return list;
+ }
+
+ public String[] getColumnNameArray() {
+ return (String[]) getColumnNames().toArray(new String[describeList.size()]);
+ }
+
+ /**
+ * Run and wait for a close event
+ *
+ * @param shell Instance of Shell
+ */
+ @SuppressWarnings("unused")
+ private void run(Shell shell) {
+ Display display = shell.getDisplay();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+ }
+
+ public void removeSelectedTasks() {
+ IStructuredSelection sel = (IStructuredSelection) tableViewer.getSelection();
+ Iterator<?> iter = sel.iterator();
+ while (iter.hasNext()) {
+ DbModel model = (DbModel) iter.next();
+ if (model != null) dbTaskList.removeTask(model);
+ }
+ }
+
+ /**
+ * Release resources
+ */
+ public void dispose() {
+ // Tell the label provider to release its resources
+ tableViewer.getLabelProvider().dispose();
+ tableViewer.getTable().dispose();
+ }
+
+ public void setSaveNeeded(boolean needed) {
+ AdminView.setSaveNeeded(needed);
+ }
+
+ /**
+ * Create a new shell, add the widgets, open the shell
+ *
+ * @param composite - a Composite
+ * @param numColumns - number of columns.
+ */
+ private void addChildControls(Composite composite, int numColumns) {
+ // Create the table
+ createTable(composite, numColumns);
+ // Create and setup the TableViewer
+ createTableViewer();
+ tableViewer.setContentProvider(new ExampleContentProvider());
+ tableViewer.setLabelProvider(new DbLabelProvider(getColumnNameArray()));
+ }
+
+ public Vector<DbModel> getTasks() {
+ return dbTaskList.getTasks();
+ }
+
+ public void addDisposeListener(DisposeListener dl) {
+ table.addDisposeListener(dl);
+ }
+
+ /**
+ * Create the Table
+ */
+ private void createTable(Composite parent, int numColumns) {
+ table =
+ new Table(parent,
+ SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL);
+ gridData.horizontalSpan = numColumns;
+ table.setLayoutData(gridData);
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ int x = 0;
+ for (Describe d : describeList) {
+ TableColumn column = new TableColumn(table, SWT.LEFT, x);
+ column.setText(d.name);
+ int width = dbItem.getColumnWidth(d.name);
+ if (width == 0)
+ column.setWidth(50);
+ else
+ column.setWidth(width);
+ final int fx = x;
+ column.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new DbTableSorter(fx));
+ }
+ });
+ x++;
+ }
+
+ }
+
+ public void getTableDescription() throws OseeDataStoreException {
+ dbDescribe = new DbDescribe(dbItem);
+ describeList = dbDescribe.getDescription();
+ }
+
+ /**
+ * Load table with administration items
+ *
+ * @throws OseeDataStoreException
+ */
+ public void load() throws OseeDataStoreException {
+ dbTaskList = dbDescribe.getDbTaskList(describeList);
+ tableViewer.setInput(dbTaskList);
+ refresh();
+ }
+
+ public void refresh() {
+ tableViewer.refresh();
+ }
+
+ /**
+ * Create the TableViewer
+ */
+ private void createTableViewer() {
+ tableViewer = new TableViewer(table) {
+ };
+ tableViewer.setUseHashlookup(true);
+
+ if (dbItem.isWriteAccess()) {
+ String columnNames[] = new String[describeList.size()];
+ int x = 0;
+ for (Describe d : describeList)
+ columnNames[x++] = d.name;
+ tableViewer.setColumnProperties(columnNames);
+ tableViewer.setCellModifier(new DbCellModifier(this, dbItem));
+
+ // Create the cell editors; must be number of columns regardless
+ // that we only use the first column as an editor
+ CellEditor[] editors = new CellEditor[columnNames.length];
+ x = 0;
+ for (Describe d : describeList) {
+ // ID Column of SITE_TOOLS is un-editable
+ if (dbItem.isWriteable(d.name)) editors[x] = new UniversalCellEditor(table);
+ x++;
+ }
+
+ // Assign the cell editors to the viewer
+ tableViewer.setCellEditors(editors);
+ }
+
+ // Set the default sorter for the viewer
+ tableViewer.setSorter(new DbTableSorter(0));
+
+ table.addListener(SWT.MouseDoubleClick, new Listener() {
+ public void handleEvent(Event event) {
+ TableItem[] items = table.getSelection();
+ if (items != null && items.length > 0) {
+ TableItem item = items[0];
+ for (int index = 0; index < table.getColumnCount(); index++) {
+ if (item.getBounds(index).contains(event.x, event.y)) {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ CellTextDialog dialog =
+ new CellTextDialog(shell, getAdminView().getSelectedDbItem().getTableName(),
+ table.getColumn(index).getText(), item.getText(index));
+ dialog.open();
+ break;
+ }
+ }
+
+ }
+ }
+ });
+ }
+
+ /*
+ * Close the window and dispose of resources
+ */
+ public void close() {
+ Shell shell = table.getShell();
+ if (shell != null && !shell.isDisposed()) shell.dispose();
+ }
+
+ /**
+ * InnerClass that acts as a proxy for the ExampleTaskList providing content for the Table. It implements the
+ * ITaskListViewer interface since it must register changeListeners with the ExampleTaskList
+ */
+ class ExampleContentProvider implements IStructuredContentProvider, ITaskListViewer {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ if (newInput != null) ((DbTaskList) newInput).addChangeListener(this);
+ if (oldInput != null) ((DbTaskList) oldInput).removeChangeListener(this);
+ }
+
+ public void dispose() {
+ dbTaskList.removeChangeListener(this);
+ }
+
+ // Return the tasks as an array of Objects
+ public Object[] getElements(Object parent) {
+ return dbTaskList.getTasks().toArray();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see ITaskListViewer#addTask(ExampleTask)
+ */
+ public void addTask(DbModel task) {
+ tableViewer.add(task);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see ITaskListViewer#removeTask(ExampleTask)
+ */
+ public void removeTask(DbModel task) {
+ tableViewer.remove(task);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see ITaskListViewer#updateTask(ExampleTask)
+ */
+ public void updateTask(DbModel task) {
+ tableViewer.update(task, null);
+ }
+ }
+
+ /**
+ * @return currently selected item
+ */
+ public ISelection getSelection() {
+ return tableViewer.getSelection();
+ }
+
+ /**
+ * Return the ExampleTaskList
+ */
+ public DbTaskList getTaskList() {
+ return dbTaskList;
+ }
+
+ /**
+ * Return the parent composite
+ */
+ public Control getControl() {
+ return table.getParent();
+ }
+
+ public DbTableTab getAdminView() {
+ return dbTab;
+ }
+
+ private final class CellTextDialog extends MessageDialog {
+
+ private String dialogMessage;
+
+ public CellTextDialog(Shell parentShell, String dialogTitle, String dialogMessage, String dialogText) {
+ super(parentShell, dialogTitle, PlatformUI.getWorkbench().getSharedImages().getImage(
+ ISharedImages.IMG_OBJS_INFO_TSK), dialogMessage, MessageDialog.INFORMATION,
+ new String[] {IDialogConstants.OK_LABEL}, 0);
+ this.dialogMessage = dialogText;
+ this.setShellStyle(this.getShellStyle() | SWT.RESIZE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout());
+ composite.setFont(parent.getFont());
+
+ Text text = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ text.setLayoutData(data);
+ text.setEditable(false);
+ text.setText(dialogMessage);
+ text.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+ text.setFont(parent.getFont());
+ return composite;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTaskList.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTaskList.java
new file mode 100644
index 00000000000..481bb3e560a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/DbTaskList.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.framework.ui.admin.dbtabletab;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+public class DbTaskList {
+
+ private Vector<DbModel> tasks = new Vector<DbModel>();
+ private Set<ITaskListViewer> changeListeners = new HashSet<ITaskListViewer>();
+
+ /**
+ * Constructor
+ */
+ public DbTaskList() {
+ super();
+ }
+
+ /**
+ * Return the collection of AnnotateTask
+ */
+ public Vector<DbModel> getTasks() {
+ return tasks;
+ }
+
+ /**
+ * Add a new task to the collection of tasks
+ */
+ public void addTask(DbModel model) {
+ tasks.add(tasks.size(), model);
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ iterator.next().addTask(model);
+ }
+
+ /**
+ * @param task
+ */
+ public void removeTask(DbModel task) {
+ tasks.remove(task);
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ iterator.next().removeTask(task);
+ }
+
+ public String toString() {
+ String str = "";
+ for (int i = 0; i < tasks.size(); i++) {
+ DbModel model = tasks.get(i);
+ str += "\nTask " + model.toString();
+ }
+ return str + "\n\n";
+ }
+
+ /**
+ * @param task
+ */
+ public void taskChanged(DbModel task) {
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ iterator.next().updateTask(task);
+ }
+
+ /**
+ * @param viewer
+ */
+ public void removeChangeListener(ITaskListViewer viewer) {
+ changeListeners.remove(viewer);
+ }
+
+ /**
+ * @param viewer
+ */
+ public void addChangeListener(ITaskListViewer viewer) {
+ changeListeners.add(viewer);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/ITaskListViewer.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/ITaskListViewer.java
new file mode 100644
index 00000000000..2ca3c68b54c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/ITaskListViewer.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.framework.ui.admin.dbtabletab;
+
+public interface ITaskListViewer {
+
+ /**
+ * Update the view to reflect the fact that a task was added to the task list
+ *
+ * @param task
+ */
+ public void addTask(DbModel task);
+
+ /**
+ * Update the view to reflect the fact that a task was removed from the task list
+ *
+ * @param task
+ */
+ public void removeTask(DbModel task);
+
+ /**
+ * Update the view to reflect the fact that one of the tasks was modified
+ *
+ * @param task
+ */
+ public void updateTask(DbModel task);
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/OseeInfoDbItem.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/OseeInfoDbItem.java
new file mode 100644
index 00000000000..42c4755618d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/OseeInfoDbItem.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.framework.ui.admin.dbtabletab;
+
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.admin.AdminPlugin;
+
+public class OseeInfoDbItem extends DbItem {
+
+ public OseeInfoDbItem() {
+ super("OSEE_INFO");
+ }
+
+ @Override
+ public boolean isWriteable(String columnName) {
+ return true;
+ }
+
+ @Override
+ public boolean isBems(String columnName) {
+ return false;
+ }
+
+ public String returnTic(String str) {
+ return "'" + str + "'";
+ }
+
+ @Override
+ public int getColumnWidth(String columnName) {
+ return 100;
+ }
+
+ public boolean exists(String key) {
+ boolean toReturn = false;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ String query = "SELECT * FROM " + getTableName() + " WHERE OSEE_KEY = " + returnTic(key);
+ chStmt.runPreparedQuery(query);
+ toReturn = chStmt.next();
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AdminPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ @Override
+ public void save(DbDescribe describe, DbModel model) {
+ try {
+ String key = (String) model.getColumn(describe.indexOfColumn("OSEE_KEY"));
+ String value = (String) model.getColumn(describe.indexOfColumn("OSEE_VALUE"));
+ String query;
+ if (exists(key)) {
+ query = "UPDATE " + getTableName() + " SET OSEE_KEY = ?, OSEE_VALUE = ? WHERE OSEE_KEY = ?";
+ ConnectionHandler.runPreparedUpdate(query, key, value, key);
+ } else {
+ query = "INSERT INTO " + getTableName() + " (OSEE_KEY, OSEE_VALUE) VALUES (?, ?)";
+ ConnectionHandler.runPreparedUpdate(query, key, value);
+ }
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AdminPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ @Override
+ public DbModel createNewRow(DbModel example) {
+ DbModel dbModel = new DbModel();
+ for (int x = 0; x < example.getValues().length; x++) {
+ dbModel.addColumn(x, "");
+ }
+ dbModel.setColumn(0, "NEW");
+ dbModel.setColumnChanged("KEY");
+ return dbModel;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SiteGssflRpcr.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SiteGssflRpcr.java
new file mode 100644
index 00000000000..8e324916dca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SiteGssflRpcr.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.framework.ui.admin.dbtabletab;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.admin.AdminPlugin;
+
+public class SiteGssflRpcr extends DbItem {
+
+ public SiteGssflRpcr() {
+ super("OSEE_SITE_GSSFL_RPCR");
+ }
+
+ @Override
+ public boolean isWriteable(String columnName) {
+ return true;
+ }
+
+ @Override
+ public boolean isBems(String columnName) {
+ return false;
+ }
+
+ public String returnTic(String str) {
+ return "'" + str + "'";
+ }
+
+ @Override
+ public int getColumnWidth(String columnName) {
+ if (columnName.equals("DIRECTORY")) return 400;
+ return 100;
+ }
+
+ public boolean exists(String program) {
+ try {
+ return ConnectionHandler.runPreparedQueryFetchInt(0,
+ "SELECT count(1) FROM " + getTableName() + " WHERE PROGRAM = ?", returnTic(program)) > 0;
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AdminPlugin.class, Level.SEVERE, ex);
+ return false;
+ }
+ }
+
+ @Override
+ public void save(DbDescribe describe, DbModel model) {
+ try {
+ String program = (String) model.getColumn(describe.indexOfColumn("PROGRAM"));
+ String dir = (String) model.getColumn(describe.indexOfColumn("DIRECTORY"));
+ String programId = (String) model.getColumn(describe.indexOfColumn("PROGRAM_ID"));
+ String query;
+ if (exists(program)) {
+ query = "UPDATE " + getTableName() + " SET directory = ?, program_id = ? WHERE PROGRAM = ?";
+ ConnectionHandler.runPreparedUpdate(query, dir, programId, program);
+ } else {
+ query = "INSERT INTO " + getTableName() + " (program,directory,program_id) VALUES (?,?,?)";
+ ConnectionHandler.runPreparedUpdate(query, program, dir, programId);
+ }
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(AdminPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public DbModel createNewRow(DbModel example) {
+ DbModel dbModel = new DbModel();
+ for (int x = 0; x < example.getValues().length; x++) {
+ dbModel.addColumn(x, "");
+ }
+ dbModel.setColumn(0, "NEW");
+ dbModel.setColumnChanged("PROGRAM");
+ return dbModel;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SkynetUsageDbItem.java b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SkynetUsageDbItem.java
new file mode 100644
index 00000000000..88a81f9caf5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.admin/src/org/eclipse/osee/framework/ui/admin/dbtabletab/SkynetUsageDbItem.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.framework.ui.admin.dbtabletab;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SkynetUsageDbItem extends DbItem {
+
+ public SkynetUsageDbItem() {
+ super("OSEE_USAGE");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.admin.dbtabletab.DbItem#createNewRow(org.eclipse.osee.framework.ui.admin.dbtabletab.DbModel)
+ */
+ @Override
+ public DbModel createNewRow(DbModel example) {
+ DbModel dbModel = new DbModel();
+ for (int x = 0; x < example.getValues().length; x++) {
+ dbModel.addColumn(x, "");
+ }
+ dbModel.setColumn(0, "NEW");
+ dbModel.setColumnChanged("KEY");
+ return dbModel;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.admin.dbtabletab.DbItem#getColumnWidth(java.lang.String)
+ */
+ @Override
+ public int getColumnWidth(String columnName) {
+ return 100;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.admin.dbtabletab.DbItem#isBems(java.lang.String)
+ */
+ @Override
+ public boolean isBems(String columnName) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.admin.dbtabletab.DbItem#isWriteable(java.lang.String)
+ */
+ @Override
+ public boolean isWriteable(String columnName) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.admin.dbtabletab.DbItem#save(org.eclipse.osee.framework.ui.admin.dbtabletab.DbModel)
+ */
+ @Override
+ public void save(DbDescribe describe, DbModel model) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/.classpath b/org.eclipse.osee.framework.ui.branch.graph/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.branch.graph/.project b/org.eclipse.osee.framework.ui.branch.graph/.project
new file mode 100644
index 00000000000..41bf06f9355
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.branch.graph</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.branch.graph/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.branch.graph/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a63d844ab02
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Tue Mar 31 12:30:39 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.branch.graph/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.branch.graph/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..90e69dc743b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Branch Graph Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.branch.graph;singleton:=true
+Bundle-Version: 0.6.0.qualifier
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.gef,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.ui.views,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.nebula.widgets.xviewer,
+ org.eclipse.help,
+ org.eclipse.osee.framework.plugin.core
+Import-Package: org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.enums,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging
+Bundle-Activator: org.eclipse.osee.framework.ui.branch.graph.BranchGraphActivator
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.framework.ui.branch.graph/build.properties b/org.eclipse.osee.framework.ui.branch.graph/build.properties
new file mode 100644
index 00000000000..463ce0e0728
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ images/,\
+ plugin.xml,\
+ help/
diff --git a/org.eclipse.osee.framework.ui.branch.graph/help/contexts.xml b/org.eclipse.osee.framework.ui.branch.graph/help/contexts.xml
new file mode 100644
index 00000000000..b66457b6e79
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/help/contexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="oseeBranchGraph" title="OSEE Branch Graph">
+ <description>Shows a graphical representation of branches in the system</description>
+ <topic href="help/oseeBranchGraph.html" label="OSEE Branch Graph"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelc.png b/org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelc.png
new file mode 100644
index 00000000000..161e3aa313b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelc.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelr.png b/org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelr.png
new file mode 100644
index 00000000000..4726f8c43aa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/help/images/ngrelr.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.branch.graph/help/oseeBranchGraph.html b/org.eclipse.osee.framework.ui.branch.graph/help/oseeBranchGraph.html
new file mode 100644
index 00000000000..13f49b4aa86
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/help/oseeBranchGraph.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>OSEE Branch Graph</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+<body>
+
+ <h1>OSEE Branch Graph</h1>
+ <p>In Work</p>
+
+ <li>Select <a class="command-link" href='javascript:executeCommand("org.eclipse.ui.views.showView(org.eclipse.ui.views.showView.viewId=org.eclipse.osee.framework.ui.skynet.QuickSearchView)")'>
+ <img src="artifact_search.gif" alt="search icon" border="0" />
+ <b>Window &gt; Show View &gt; Other... &gt; OSEE &gt; Quick Search</b></a>, to open the view.
+ </li>
+
+ <p><img border="0" src="images/ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="link.html">Link1</a><br/>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.branch.graph/help/toc.xml b/org.eclipse.osee.framework.ui.branch.graph/help/toc.xml
new file mode 100644
index 00000000000..684ce4f83a1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/help/toc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="OSEE Branch Graph">
+ <topic href="help/oseeBranchGraph.html" label="OSEE Branch Graph">
+ </topic>
+
+
+</toc>
diff --git a/org.eclipse.osee.framework.ui.branch.graph/images/filter_connections.gif b/org.eclipse.osee.framework.ui.branch.graph/images/filter_connections.gif
new file mode 100644
index 00000000000..a5317bd79c3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/images/filter_connections.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.branch.graph/images/graph.gif b/org.eclipse.osee.framework.ui.branch.graph/images/graph.gif
new file mode 100644
index 00000000000..695e5a5cfa5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/images/graph.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.branch.graph/plugin.xml b/org.eclipse.osee.framework.ui.branch.graph/plugin.xml
new file mode 100644
index 00000000000..ca0b48cc00c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/plugin.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+<extension
+ point="org.eclipse.ui.editors">
+ <editor
+ class="org.eclipse.osee.framework.ui.branch.graph.core.BranchGraphEditor"
+ contributorClass="org.eclipse.osee.framework.ui.branch.graph.core.BranchGraphActionBarContributor"
+ default="true"
+ icon="images/graph.gif"
+ id="org.eclipse.osee.framework.ui.branch.graph.BranchGraphEditor"
+ name="Branch Graph">
+ </editor>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.osee.framework.ui.branch.graph.OpenBranchGraph"
+ description="Open the Branch Graph"
+ id="org.eclipse.osee.framework.ui.branch.graph.command.open.branch.graph"
+ name="Open Branch Graph">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="menu:org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.branch.graph.command.open.branch.graph"
+ icon="images/graph.gif"
+ label="Open Branch Graph"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.branch.graph.command.open.branch.graph"
+ icon="images/graph.gif"
+ label="Open Branch Graph"
+ style="push">
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="help/contexts.xml">
+ </contexts>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/BranchGraphActivator.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/BranchGraphActivator.java
new file mode 100644
index 00000000000..54242dbf4d2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/BranchGraphActivator.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.framework.ui.branch.graph;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphActivator extends OseeUiActivator {
+
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.ui.branch.graph";
+
+ private static BranchGraphActivator plugin;
+
+ public BranchGraphActivator() {
+ }
+
+ /*
+ * (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);
+ }
+
+ public static BranchGraphActivator getInstance() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/OpenBranchGraph.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/OpenBranchGraph.java
new file mode 100644
index 00000000000..80638b74170
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/OpenBranchGraph.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.framework.ui.branch.graph;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.branch.graph.core.BranchGraphEditor;
+import org.eclipse.osee.framework.ui.branch.graph.core.BranchGraphEditorInput;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.AbstractSelectionChangedHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenBranchGraph extends AbstractSelectionChangedHandler {
+
+ public OpenBranchGraph() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.
+ * ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ try {
+ ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+ if (selection instanceof IStructuredSelection) {
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection((IStructuredSelection) selection);
+ if (!branches.isEmpty()) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(
+ new BranchGraphEditorInput(branches.iterator().next()), BranchGraphEditor.EDITOR_ID);
+ }
+ }
+ } catch (Exception ex) {
+ throw new ExecutionException("Error opening Branch Graph Editor", ex);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphActionBarContributor.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphActionBarContributor.java
new file mode 100644
index 00000000000..18fb9db8d23
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphActionBarContributor.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.framework.ui.branch.graph.core;
+
+import org.eclipse.gef.ui.actions.ActionBarContributor;
+import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.ui.branch.graph.BranchGraphActivator;
+import org.eclipse.osee.framework.ui.branch.graph.parts.GraphEditPart;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphOptions;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphOptions.ConnectionFilter;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphOptions.TxFilter;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphActionBarContributor extends ActionBarContributor {
+ private BranchGraphEditor editor;
+ private final IPreferenceStore store = BranchGraphActivator.getInstance().getPreferenceStore();
+
+ private static ToggleFilterConnectionAction[] toggleFilterConnectionAction;
+ private static ToggleTxFilterAction[] toggleTxFilterAction;
+
+ @Override
+ public void setActiveEditor(IEditorPart editor) {
+ super.setActiveEditor(editor);
+ this.editor = (BranchGraphEditor) editor;
+ }
+
+ @Override
+ protected void buildActions() {
+ }
+
+ @Override
+ protected void declareGlobalActionKeys() {
+ }
+
+ @Override
+ public void contributeToToolBar(IToolBarManager toolBarManager) {
+ super.contributeToToolBar(toolBarManager);
+ toolBarManager.add(new Separator());
+ toolBarManager.add(new ZoomComboContributionItem(getPage()));
+ toolBarManager.add(new Separator());
+
+ toggleFilterConnectionAction =
+ new ToggleFilterConnectionAction[] {
+ new ToggleFilterConnectionAction("None", ConnectionFilter.NO_FILTER),
+ new ToggleFilterConnectionAction("Filter All Connections", ConnectionFilter.FILTER_ALL_CONNECTIONS),
+ new ToggleFilterConnectionAction("Filter Branch Hierarchy Connections",
+ ConnectionFilter.FILTER_CHILD_BRANCH_CONNECTIONS),
+ new ToggleFilterConnectionAction("Filter Merge Connections",
+ ConnectionFilter.FILTER_MERGE_CONNECTIONS)};
+
+ toolBarManager.add(new FilterConnectionAction());
+
+ toggleTxFilterAction =
+ new ToggleTxFilterAction[] {new ToggleTxFilterAction("Show All", TxFilter.NO_FILTER),
+ new ToggleTxFilterAction("Hide All", TxFilter.HIDE_ALL)};
+ toolBarManager.add(new FilterTxAction());
+ }
+
+ private final class ToggleFilterConnectionAction extends Action {
+
+ private final ConnectionFilter show;
+
+ public ToggleFilterConnectionAction(String text, ConnectionFilter show) {
+ super(text, AS_RADIO_BUTTON);
+ this.show = show;
+ setChecked(show.ordinal() == store.getInt(GraphOptions.FILTER_CONNECTIONS_PREFERENCE));
+ }
+
+ @Override
+ public void run() {
+ if (isChecked()) {
+ store.setValue(GraphOptions.FILTER_CONNECTIONS_PREFERENCE, show.ordinal());
+ GraphEditPart graphEditPart = (GraphEditPart) editor.getViewer().getContents();
+ graphEditPart.setConnectionVisibility();
+ }
+ }
+ }
+
+ private final class ToggleTxFilterAction extends Action {
+
+ private final TxFilter show;
+
+ public ToggleTxFilterAction(String text, TxFilter show) {
+ super(text, AS_RADIO_BUTTON);
+ this.show = show;
+ setChecked(show.ordinal() == store.getInt(GraphOptions.TRANSACTION_FILTER));
+ }
+
+ @Override
+ public void run() {
+ if (isChecked()) {
+ store.setValue(GraphOptions.TRANSACTION_FILTER, show.ordinal());
+ GraphEditPart graphEditPart = (GraphEditPart) editor.getViewer().getContents();
+ graphEditPart.setTxVisibility();
+ }
+ }
+ }
+
+ private static final class FilterTxAction extends Action implements IMenuCreator {
+ private Menu menu;
+
+ public FilterTxAction() {
+ setText("Filter transactions");
+ setToolTipText("Filter transactions");
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.DB_ICON_BLUE));
+ setMenuCreator(this);
+ }
+
+ public void dispose() {
+ if (menu != null) {
+ menu.dispose();
+ menu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (menu != null) menu.dispose();
+ menu = new Menu(parent);
+ for (int index = 0; index < toggleTxFilterAction.length; index++) {
+ addActionToMenu(menu, toggleTxFilterAction[index]);
+ }
+ return menu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ return null;
+ }
+
+ private void addActionToMenu(Menu parent, Action action) {
+ ActionContributionItem item = new ActionContributionItem(action);
+ item.fill(parent, -1);
+ }
+
+ }
+
+ private static final class FilterConnectionAction extends Action implements IMenuCreator {
+ private Menu menu;
+
+ public FilterConnectionAction() {
+ setText("Filter connections");
+ setToolTipText("Filter connections");
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.FILTERS));
+ setMenuCreator(this);
+ }
+
+ public void dispose() {
+ if (menu != null) {
+ menu.dispose();
+ menu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (menu != null) menu.dispose();
+ menu = new Menu(parent);
+ for (int index = 0; index < toggleFilterConnectionAction.length; index++) {
+ addActionToMenu(menu, toggleFilterConnectionAction[index]);
+ }
+ return menu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ return null;
+ }
+
+ private void addActionToMenu(Menu parent, Action action) {
+ ActionContributionItem item = new ActionContributionItem(action);
+ item.fill(parent, -1);
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditor.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditor.java
new file mode 100644
index 00000000000..d86415d78e0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditor.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.graph.core;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.DefaultEditDomain;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.gef.KeyStroke;
+import org.eclipse.gef.MouseWheelHandler;
+import org.eclipse.gef.MouseWheelZoomHandler;
+import org.eclipse.gef.RootEditPart;
+import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
+import org.eclipse.gef.editparts.ScalableRootEditPart;
+import org.eclipse.gef.editparts.ZoomManager;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.ui.actions.ActionRegistry;
+import org.eclipse.gef.ui.actions.GEFActionConstants;
+import org.eclipse.gef.ui.actions.ZoomInAction;
+import org.eclipse.gef.ui.actions.ZoomOutAction;
+import org.eclipse.gef.ui.palette.PaletteCustomizer;
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.gef.ui.palette.PaletteViewerProvider;
+import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
+import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.branch.graph.BranchGraphActivator;
+import org.eclipse.osee.framework.ui.branch.graph.model.GraphCache;
+import org.eclipse.osee.framework.ui.branch.graph.operation.LoadGraphOperation;
+import org.eclipse.osee.framework.ui.branch.graph.parts.GraphEditPartFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphEditor extends GraphicalEditorWithFlyoutPalette {
+
+ public static final String EDITOR_ID = "org.eclipse.osee.framework.ui.branch.graph.BranchGraphEditor";
+ private static final String MAIN_HELP_CONTEXT = "oseeBranchGraph";
+
+ private BranchGraphOutlinePage overviewOutlinePage;
+ private ActionRegistry actionRegistry;
+ private BranchGraphPaletteProvider paletteProvider;
+ private KeyHandler shareKeyHandler;
+
+ public BranchGraphEditor() {
+ super();
+ setEditDomain(new DefaultEditDomain(this));
+ }
+
+ public ActionRegistry getActionRegistry() {
+ if (actionRegistry == null) {
+ actionRegistry = new ActionRegistry();
+ }
+ return actionRegistry;
+ }
+
+ public void setFocus() {
+ }
+
+ public void showGraphFor(BranchGraphEditorInput editorInput) {
+ setPartName(editorInput.getName() + " Graph");
+ LoadGraphOperation task =
+ new LoadGraphOperation(getSite().getPart(), getGraphicalViewer(), this, editorInput.getBranch());
+ Jobs.runInJob(task.getName(), task, BranchGraphActivator.class, BranchGraphActivator.PLUGIN_ID, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == GraphicalViewer.class || adapter == EditPartViewer.class) {
+ return getGraphicalViewer();
+ } else if (adapter == ZoomManager.class) {
+ return ((ScalableRootEditPart) getGraphicalViewer().getRootEditPart()).getZoomManager();
+ } else if (adapter == IContentOutlinePage.class) {
+ return getOverviewOutlinePage();
+ }
+ return super.getAdapter(adapter);
+ }
+
+ public void refresh() {
+ getGraphicalViewer().setContents("Loading graph... This can take several minutes");
+ showGraphFor((BranchGraphEditorInput) getEditorInput());
+ }
+
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ public void doSaveAs() {
+ }
+
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ setSite(site);
+ setInput(input);
+ }
+
+ public boolean isDirty() {
+ return false;
+ }
+
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ public GraphicalViewer getViewer() {
+ return getGraphicalViewer();
+ }
+
+ private BranchGraphOutlinePage getOverviewOutlinePage() {
+ if (null == overviewOutlinePage && null != getGraphicalViewer()) {
+ RootEditPart rootEditPart = getGraphicalViewer().getRootEditPart();
+ if (rootEditPart instanceof ScalableRootEditPart) {
+ overviewOutlinePage = new BranchGraphOutlinePage((ScalableRootEditPart) rootEditPart);
+ }
+ }
+ return overviewOutlinePage;
+ }
+
+ protected void configureGraphicalViewer() {
+ super.configureGraphicalViewer();
+
+ GraphicalViewer viewer = getGraphicalViewer();
+ viewer.setRootEditPart(new ScalableRootEditPart());
+ viewer.setEditPartFactory(new GraphEditPartFactory(viewer));
+
+ getSite().setSelectionProvider(viewer);
+
+ viewer.setContents("Loading graph... This can take several minutes");
+
+ ContextMenuProvider cmProvider = new BranchGraphEditorContextMenuProvider(viewer, this);
+ viewer.setContextMenu(cmProvider);
+
+ IEditorInput input = getEditorInput();
+ if (input instanceof BranchGraphEditorInput) {
+ BranchGraphEditorInput editorInput = (BranchGraphEditorInput) input;
+ showGraphFor(editorInput);
+ }
+
+ ZoomManager zoomManager = ((ScalableRootEditPart) viewer.getRootEditPart()).getZoomManager();
+ IAction zoomIn = new ZoomInAction(zoomManager);
+ IAction zoomOut = new ZoomOutAction(zoomManager);
+ getActionRegistry().registerAction(zoomIn);
+ getActionRegistry().registerAction(zoomOut);
+
+ viewer.setKeyHandler(getCommonKeyHandler());
+
+ // Scroll-wheel Zoom
+ viewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD1), MouseWheelZoomHandler.SINGLETON);
+
+ getSite().getKeyBindingService().registerAction(zoomIn);
+ getSite().getKeyBindingService().registerAction(zoomOut);
+ List<String> zoomContributions =
+ Arrays.asList(new String[] {ZoomManager.FIT_ALL, ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH});
+ zoomManager.setZoomLevelContributions(zoomContributions);
+
+ try {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+ "org.eclipse.ui.views.ContentOutline");
+ } catch (PartInitException ex) {
+ OseeLog.log(BranchGraphActivator.class, Level.SEVERE, ex);
+ }
+ // viewer.setHelpContext(MAIN_HELP_CONTEXT);
+ }
+
+ protected KeyHandler getCommonKeyHandler() {
+ if (shareKeyHandler == null) {
+ shareKeyHandler = new GraphicalViewerKeyHandler(getViewer());
+ shareKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0), getActionRegistry().getAction(
+ GEFActionConstants.DIRECT_EDIT));
+ }
+ return shareKeyHandler;
+ }
+
+ protected void initializeGraphicalViewer() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
+ */
+ @Override
+ protected PaletteRoot getPaletteRoot() {
+ if (paletteProvider == null) {
+ paletteProvider = new BranchGraphPaletteProvider(this);
+ }
+ return paletteProvider.getPaletteRoot();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
+ */
+ @Override
+ protected PaletteViewerProvider createPaletteViewerProvider() {
+ return new PaletteViewerProvider(getEditDomain()) {
+ protected void configurePaletteViewer(PaletteViewer viewer) {
+ super.configurePaletteViewer(viewer);
+ viewer.setCustomizer(new PaletteCustomizer() {
+ public void revertToSaved() {
+ }
+
+ public void save() {
+ }
+ });
+ viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPalettePage()
+ */
+ @Override
+ protected CustomPalettePage createPalettePage() {
+ return new CustomPalettePage(getPaletteViewerProvider()) {
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ IAction copy = getActionRegistry().getAction(ActionFactory.COPY.getId());
+ pageSite.getActionBars().setGlobalActionHandler(ActionFactory.COPY.getId(), copy);
+ }
+ };
+ }
+
+ public void setOutlineContent(GraphCache graph) {
+ getOverviewOutlinePage().setTreeContent(graph);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorContextMenuProvider.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorContextMenuProvider.java
new file mode 100644
index 00000000000..31550001b53
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorContextMenuProvider.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.framework.ui.branch.graph.core;
+
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.ui.actions.GEFActionConstants;
+import org.eclipse.gef.ui.actions.PrintAction;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphEditorContextMenuProvider extends ContextMenuProvider {
+
+ private final BranchGraphEditor editor;
+
+ public BranchGraphEditorContextMenuProvider(EditPartViewer viewer, BranchGraphEditor editor) {
+ super(viewer);
+ this.editor = editor;
+ }
+
+ @Override
+ public void buildContextMenu(IMenuManager menu) {
+ GEFActionConstants.addStandardActionGroups(menu);
+ menu.appendToGroup(GEFActionConstants.GROUP_PRINT, new PrintAction(editor));
+ }
+
+ private IAction getAction(String actionId) {
+ return editor.getActionRegistry().getAction(actionId);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorInput.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorInput.java
new file mode 100644
index 00000000000..27a121227af
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphEditorInput.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.framework.ui.branch.graph.core;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphEditorInput implements IEditorInput {
+
+ private Branch branch;
+ private TransactionId transactionId;
+
+ public BranchGraphEditorInput(Branch branch) {
+ this.branch = branch;
+ }
+
+ public BranchGraphEditorInput() throws OseeCoreException {
+ this(BranchManager.getSystemRootBranch());
+ }
+
+ public boolean exists() {
+ return false;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return PlatformUI.getWorkbench().getEditorRegistry().getImageDescriptor(getName());
+ }
+
+ public String getName() {
+ return branch != null ? branch.getBranchName() : "Branch was Null";
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return getName();
+ }
+
+ public void setTransactionId(TransactionId transactionId) {
+ this.transactionId = transactionId;
+ }
+
+ public TransactionId getTransactionId() {
+ return transactionId;
+ }
+
+ public Branch getBranch() {
+ return branch;
+ }
+
+ public boolean equals(Object obj) {
+ if (obj instanceof BranchGraphEditorInput) {
+ BranchGraphEditorInput compareTo = (BranchGraphEditorInput) obj;
+ if (branch != null && compareTo.getBranch() != null) {
+ return branch.equals(compareTo.getBranch());
+ }
+ }
+ return super.equals(obj);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphOutlinePage.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphOutlinePage.java
new file mode 100644
index 00000000000..27e5bf03781
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphOutlinePage.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.framework.ui.branch.graph.core;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.parts.ScrollableThumbnail;
+import org.eclipse.draw2d.parts.Thumbnail;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.editparts.ScalableRootEditPart;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphOutlinePage extends Page implements IContentOutlinePage {
+
+ private Composite composite;
+ private Canvas overview;
+ private ScalableRootEditPart rootEditPart;
+ private Thumbnail thumbnail;
+
+ public BranchGraphOutlinePage(ScalableRootEditPart rootEditPart) {
+ super();
+ this.rootEditPart = rootEditPart;
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+
+ }
+
+ public void createControl(Composite parent) {
+ composite = new Composite(parent, SWT.BORDER);
+ composite.setLayout(new FillLayout(SWT.VERTICAL));
+
+ overview = new Canvas(composite, SWT.BORDER);
+ overview.setBackground(ColorConstants.white);
+ overview.setLayout(new FillLayout(SWT.VERTICAL));
+
+ thumbnail = new ScrollableThumbnail((Viewport) rootEditPart.getFigure());
+ thumbnail.setSource(rootEditPart.getLayer(LayerConstants.PRINTABLE_LAYERS));
+
+ LightweightSystem lws = new LightweightSystem();
+ lws.setControl(overview);
+ lws.setContents(thumbnail);
+ }
+
+ public void dispose() {
+ if (null != thumbnail) thumbnail.deactivate();
+ super.dispose();
+ }
+
+ public Control getControl() {
+ return composite;
+ }
+
+ public ISelection getSelection() {
+ return StructuredSelection.EMPTY;
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+
+ }
+
+ public void setFocus() {
+ if (getControl() != null) getControl().setFocus();
+ }
+
+ public void setSelection(ISelection selection) {
+
+ }
+
+ public void setTreeContent(Object object) {
+ // viewer.setInput(object != null ? object : "Data not available");
+ }
+
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphPaletteProvider.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphPaletteProvider.java
new file mode 100644
index 00000000000..fd2f8677426
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/core/BranchGraphPaletteProvider.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.framework.ui.branch.graph.core;
+
+import org.eclipse.gef.Tool;
+import org.eclipse.gef.palette.MarqueeToolEntry;
+import org.eclipse.gef.palette.PaletteContainer;
+import org.eclipse.gef.palette.PaletteDrawer;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.palette.PaletteToolbar;
+import org.eclipse.gef.palette.PanningSelectionToolEntry;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.gef.tools.AbstractTool;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.branch.graph.BranchGraphActivator;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchGraphPaletteProvider {
+
+ private static final String[] drawerNames = new String[] {"Filters"};
+ private PaletteRoot paletteRoot;
+ private final BranchGraphEditor editor;
+
+ public BranchGraphPaletteProvider(BranchGraphEditor editor) {
+ this.paletteRoot = null;
+ this.editor = editor;
+ }
+
+ public PaletteRoot getPaletteRoot() {
+ if (paletteRoot == null) {
+ paletteRoot = new PaletteRoot();
+ paletteRoot.add(createToolsGroup(paletteRoot));
+ // addDrawers(paletteRoot);
+ }
+ return paletteRoot;
+ }
+
+ private void addDrawers(PaletteRoot paletteRoot) {
+ for (String drawerName : drawerNames) {
+ PaletteContainer container = new PaletteDrawer(drawerName);
+
+ String name = "one";
+ String description = "example";
+ Class<?> clazz = Object.class;
+
+ container.add(createComponent(name, description, clazz, FrameworkImage.RECTANGLE_16,
+ FrameworkImage.RECTANGLE_24));
+ paletteRoot.add(container);
+ }
+ }
+
+ private ToolEntry createComponent(String label, String description, Class<?> clazz, OseeImage smallImage, OseeImage largeImage) {
+ ToolEntry toolEntry =
+ new ToolEntry(label, description, ImageManager.getImageDescriptor(smallImage),
+ ImageManager.getImageDescriptor(largeImage)) {
+
+ };
+ return toolEntry;
+ }
+
+ private PaletteContainer createToolsGroup(PaletteRoot palette) {
+ PaletteToolbar toolbar = new PaletteToolbar("Tools");
+
+ ToolEntry tool = new PanningSelectionToolEntry();
+ toolbar.add(tool);
+ palette.setDefaultEntry(tool);
+
+ toolbar.add(new MarqueeToolEntry());
+
+ final Action action =
+ OseeAts.createBugAction(BranchGraphActivator.getInstance(), editor, BranchGraphEditor.EDITOR_ID,
+ "Branch Graph");
+ final ImageDescriptor img = action.getImageDescriptor();
+
+ toolbar.add(new ToolEntry("", action.getText(), img, img, null) {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.palette.ToolEntry#createTool()
+ */
+ @Override
+ public Tool createTool() {
+ return new AbstractTool() {
+
+ @Override
+ protected String getCommandName() {
+ return action.getText();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.tools.AbstractTool#activate()
+ */
+ @Override
+ public void activate() {
+ super.activate();
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ deactivate();
+ action.run();
+ }
+ });
+
+ }
+ };
+ }
+
+ });
+
+ return toolbar;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/BranchFigure.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/BranchFigure.java
new file mode 100644
index 00000000000..0e3c7aa28f1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/BranchFigure.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.branch.graph.figure;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.Cursors;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ImageFigure;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphColorConstants;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchFigure extends RoundedRectangle {
+
+ public BranchFigure(String branchName, Image branchImage, IFigure toolTip, Color bgcolor, Color fgcolor) {
+ super();
+ setOpaque(true);
+ setBorder(new MarginBorder(2));
+ setLayoutManager(new BorderLayout());
+
+ setBackgroundColor(bgcolor);
+ setForegroundColor(fgcolor);
+
+ add(new ImageFigure(branchImage), BorderLayout.LEFT);
+ add(FigureFactory.createLabel(branchName, getFont(), PositionConstants.CENTER, GraphColorConstants.FONT_COLOR),
+ BorderLayout.CENTER);
+ setToolTip(toolTip);
+ setCursor(Cursors.HAND);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/ContainerFigure.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/ContainerFigure.java
new file mode 100644
index 00000000000..0ebf9a00aa1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/ContainerFigure.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.framework.ui.branch.graph.figure;
+
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ContainerFigure extends Figure {
+
+ public ContainerFigure() {
+ ToolbarLayout layout = new ToolbarLayout();
+ layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+ layout.setStretchMinorAxis(false);
+ layout.setSpacing(2);
+ setLayoutManager(layout);
+ }
+
+ public Dimension getPreferredSize(int wHint, int hHint) {
+ Dimension size = super.getPreferredSize(wHint, hHint);
+ size.height = Math.max(size.height, 10);
+ return size;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FigureFactory.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FigureFactory.java
new file mode 100644
index 00000000000..beb248b697f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FigureFactory.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.branch.graph.figure;
+
+import java.util.Date;
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.GridLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.PolygonDecoration;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.branch.graph.model.BranchModel;
+import org.eclipse.osee.framework.ui.branch.graph.model.TxData;
+import org.eclipse.osee.framework.ui.branch.graph.model.TxModel;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphColorConstants;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphImageConstants;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphTextFormat;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FigureFactory {
+
+ private FigureFactory() {
+ }
+
+ public static PolylineConnection createConnection(IFigure contents, IFigure source, IFigure target, String toolTip, boolean hasEndPoint, Color color) {
+ PolylineConnection connection = new PolylineConnection();
+ ConnectionAnchor targetAnchor = new ChopboxAnchor(target);
+ connection.setTargetAnchor(targetAnchor);
+ connection.setSourceAnchor(new ChopboxAnchor(source));
+ if (hasEndPoint) {
+ PolygonDecoration decoration = new PolygonDecoration();
+ decoration.setTemplate(PolygonDecoration.TRIANGLE_TIP);
+ connection.setTargetDecoration(decoration);
+ }
+ if (toolTip != null) {
+ connection.setToolTip(new Label(toolTip));
+ }
+ connection.setForegroundColor(color);
+ contents.add(connection);
+ return connection;
+ }
+
+ public static BranchFigure createBranchLabelFigure(BranchModel branchModel) {
+ Color bgcolor = GraphColorConstants.getBranchColor(branchModel);
+ Color fgcolor = GraphColorConstants.FONT_COLOR;
+
+ Branch branch = branchModel.getBranch();
+ String branchName = branch.getBranchName();
+ Image image = GraphImageConstants.getImage(branch);
+
+ return new BranchFigure(branchName, image, createBranchNoteFigure(branchModel), bgcolor, fgcolor);
+ }
+
+ public static TxFigure createTxFigure(TxModel txModel) {
+ Color bgcolor = GraphColorConstants.getBranchColor(txModel.getParentBranchModel());
+ Color fgcolor = GraphColorConstants.FONT_COLOR;
+ return new TxFigure(txModel.getRevision(), createTxNoteFigure(txModel), bgcolor, fgcolor);
+ }
+
+ public static IFigure createTxNoteFigure(TxModel txModel) {
+ TxData txData = txModel.getTxData();
+ Branch branch = txData.getBranch();
+ String title = String.format("Tx: %s Name: %s", txData.getTxId(), branch.getBranchShortName());
+ return createNoteFigure(title, branch.getBranchName(), txData.getAuthor(), txData.getTimeStamp(),
+ txData.getComment());
+ }
+
+ public static IFigure createBranchNoteFigure(BranchModel branchModel) {
+ Branch branch = branchModel.getBranch();
+ String title =
+ String.format("Tx: %s Name: %s", branchModel.getFirstTx().getRevision(), branch.getBranchShortName());
+ return createNoteFigure(title, branch.getBranchName(), branchModel.getFirstTx().getTxData().getAuthor(),
+ branch.getCreationDate(), branch.getCreationComment());
+ }
+
+ private static IFigure createNoteFigure(String shortName, String name, String author, Date date, String comment) {
+ FrameFigure contents = new FrameFigure();
+ contents.setLayoutManager(new GridLayout(2, false));
+ contents.setBackgroundColor(GraphColorConstants.BGCOLOR);
+
+ Font labelFont = JFaceResources.getTextFont();
+ Font textFont = JFaceResources.getDefaultFont();
+
+ contents.setLabel(" " + shortName + " ");
+ contents.setLabelFont(JFaceResources.getTextFont());
+ contents.setFont(textFont);
+
+ contents.add(createLabel("Branch", labelFont, GraphColorConstants.FONT_COLOR));
+ contents.add(createLabel(name, textFont));
+ contents.add(createLabel("Author", labelFont, GraphColorConstants.FONT_COLOR));
+ contents.add(createLabel(author, textFont));
+ contents.add(createLabel("Date", labelFont, GraphColorConstants.FONT_COLOR));
+ contents.add(createLabel(GraphTextFormat.formatDate(date), textFont));
+ contents.add(createLabel("Message", labelFont, GraphColorConstants.FONT_COLOR));
+ contents.add(createLabel(comment, textFont));
+ contents.setPreferredSize(contents.getPreferredSize());
+ return contents;
+ }
+
+ public static Label createLabel(String text, Font font) {
+ return createLabel(text, font, PositionConstants.LEFT);
+ }
+
+ public static Label createLabel(String text, Font font, Color fgColor) {
+ return createLabel(text, font, PositionConstants.LEFT, fgColor);
+ }
+
+ public static Label createLabel(String text, Font font, int position) {
+ Label label = new Label(text);
+ label.setFont(font);
+ label.setTextAlignment(position);
+ return label;
+ }
+
+ public static Label createLabel(String text, Font font, int position, Color fgColor) {
+ Label label = new Label(text);
+ label.setFont(font);
+ label.setTextAlignment(position);
+ label.setForegroundColor(fgColor);
+ return label;
+ }
+
+ public static Label createLabel(String text, Font font, Color fgColor, Color bgColor) {
+ return createLabel(text, font, fgColor, bgColor);
+ }
+
+ public static Label createLabel(String text, Font font, int alignment, Color fgColor, Color bgColor) {
+ Label label = new Label(text);
+ label.setFont(font);
+ label.setTextAlignment(alignment);
+ label.setForegroundColor(fgColor);
+ label.setBackgroundColor(bgColor);
+ return label;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FrameFigure.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FrameFigure.java
new file mode 100644
index 00000000000..3ae4581541c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/FrameFigure.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.framework.ui.branch.graph.figure;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.CompoundBorder;
+import org.eclipse.draw2d.FigureUtilities;
+import org.eclipse.draw2d.LabeledContainer;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.SchemeBorder;
+import org.eclipse.draw2d.TitleBarBorder;
+import org.eclipse.draw2d.geometry.Dimension;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FrameFigure extends LabeledContainer {
+
+ static class InternalFrameBorder extends CompoundBorder {
+ InternalFrameBorder() {
+ TitleBarBorder titlebar = new TitleBarBorder();
+ titlebar.setTextColor(ColorConstants.white);
+ titlebar.setBackgroundColor(ColorConstants.darkGray);
+
+ outer = new CompoundBorder(new SchemeBorder(SchemeBorder.SCHEMES.RAISED), titlebar);
+
+ inner =
+ new CompoundBorder(new LineBorder(FigureUtilities.mixColors(ColorConstants.buttonDarker,
+ ColorConstants.button), 3), new SchemeBorder(SchemeBorder.SCHEMES.LOWERED));
+
+ }
+ }
+
+ public FrameFigure() {
+ super(new InternalFrameBorder());
+ setLayoutManager(new BorderLayout());
+ setOpaque(true);
+ }
+
+ public FrameFigure(String title) {
+ this();
+ setLabel(title);
+ }
+
+ public Dimension getPreferredSize(int wHint, int hHint) {
+ Dimension size = super.getPreferredSize(wHint, hHint);
+ size.height = Math.max(size.height, 10);
+ return size;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/PlusMinus.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/PlusMinus.java
new file mode 100644
index 00000000000..4417fb3769f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/PlusMinus.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.framework.ui.branch.graph.figure;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.Toggle;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PlusMinus extends Toggle {
+
+ {
+ setPreferredSize(9, 9);
+ }
+
+ protected void paintFigure(Graphics g) {
+ super.paintFigure(g);
+ Rectangle r = Rectangle.SINGLETON;
+ r.setBounds(getBounds()).resize(-1, -1);
+ g.drawRectangle(r);
+ int xMid = r.x + r.width / 2;
+ int yMid = r.y + r.height / 2;
+ g.drawLine(r.x + 2, yMid, r.right() - 2, yMid);
+ if (!isSelected()) g.drawLine(xMid, r.y + 2, xMid, r.bottom() - 2);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/TxFigure.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/TxFigure.java
new file mode 100644
index 00000000000..72e47db768c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/figure/TxFigure.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.framework.ui.branch.graph.figure;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Cursors;
+import org.eclipse.draw2d.Ellipse;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TxFigure extends Ellipse {
+
+ private Color bgcolor;
+ private boolean selected;
+ private final long txNumber;
+
+ public TxFigure(long txNumber, IFigure toolTip, Color bgcolor, Color fgcolor) {
+ this.txNumber = txNumber;
+ this.bgcolor = bgcolor;
+ setLayoutManager(new BorderLayout());
+ setBackgroundColor(bgcolor);
+ setForegroundColor(fgcolor);
+ setOpaque(true);
+ add(new Label(String.valueOf(txNumber)), BorderLayout.CENTER);
+ setToolTip(toolTip);
+ setCursor(Cursors.HAND);
+ }
+
+ public long getTxNumber() {
+ return txNumber;
+ }
+
+ public void setSelected(boolean selected) {
+ this.selected = selected;
+ if (selected) {
+ setBackgroundColor(ColorConstants.white);
+ } else {
+ setBackgroundColor(bgcolor);
+ }
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/BranchModel.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/BranchModel.java
new file mode 100644
index 00000000000..2ffa8ef2ccd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/BranchModel.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.graph.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchModel extends Node implements Serializable {
+
+ private static final long serialVersionUID = 1017422142119868019L;
+ private BranchModel parent;
+ private final LinkedList<TxModel> txs;
+ private final List<BranchModel> children;
+
+ private transient Branch branch;
+ private transient boolean isLoaded;
+ private transient int depth;
+ private transient boolean txsVisible;
+
+ public BranchModel(Branch branch) {
+ super();
+ this.branch = branch;
+ this.children = new ArrayList<BranchModel>();
+ this.txs = new LinkedList<TxModel>();
+ this.parent = null;
+ this.isLoaded = false;
+ this.depth = -1;
+ this.txsVisible = true;
+ }
+
+ protected void reset() {
+ this.children.clear();
+ this.parent = null;
+ }
+
+ protected void resetTxs() {
+ this.txs.clear();
+ }
+
+ protected boolean isLoaded() {
+ return isLoaded;
+ }
+
+ protected void setIsLoaded(boolean loaded) {
+ this.isLoaded = loaded;
+ }
+
+ public Branch getBranch() {
+ return branch;
+ }
+
+ public boolean isDefaultBranch() {
+ // Branch defaultBranch = BranchManager.getDefaultBranch();
+ // if (defaultBranch != null && branch != null) {
+ // return defaultBranch.equals(branch);
+ // }
+ return false;
+ }
+
+ public BranchModel getParentBranch() {
+ return parent;
+ }
+
+ protected void setParentBranch(BranchModel parent) {
+ this.parent = parent;
+ }
+
+ public List<BranchModel> getChildren() {
+ return children;
+ }
+
+ public List<BranchModel> getAllChildrenBelow() {
+ List<BranchModel> children = new ArrayList<BranchModel>(getChildren());
+ for (BranchModel child : getChildren()) {
+ children.addAll(child.getAllChildrenBelow());
+ }
+ return children;
+ }
+
+ protected void addChildBranchModel(BranchModel branchModel) {
+ if (!children.contains(branchModel)) {
+ branchModel.setParentBranch(this);
+ int toSearch = branchModel.getAllChildrenBelow().size();
+ int insertAt = -1;
+ for (BranchModel child : children) {
+ if (child.getAllChildrenBelow().size() > toSearch) {
+ break;
+ }
+ insertAt++;
+ }
+ int size = children.size();
+ if (size != 0 && insertAt >= 0 && insertAt < size) {
+ children.add(insertAt, branchModel);
+ } else {
+ children.add(branchModel);
+ }
+ }
+ }
+
+ protected void addTx(TxModel txModel) {
+ if (!txs.contains(txModel)) {
+ txModel.setBranchModel(this);
+
+ Long toSearch = txModel.getRevision();
+ int insertAt = -1;
+ for (int index = 0; index < txs.size(); index++) {
+ TxModel toCheck = txs.get(index);
+ if (toCheck.getRevision() > toSearch) {
+ insertAt = index;
+ break;
+ }
+ }
+ if (insertAt > -1) {
+ TxModel greater = txs.get(insertAt);
+ TxModel parent = greater.getParentTx();
+ if (parent != null) {
+ txModel.setParentTx(parent);
+ } else {
+ int toGet = insertAt - 1;
+ if (toGet >= 0) {
+ txModel.setParentTx(txs.get(toGet));
+ }
+ }
+ greater.setParentTx(txModel);
+ txs.add(insertAt, txModel);
+ } else {
+ TxModel last = getLastTx();
+ if (last != null) {
+ txModel.setParentTx(last);
+ }
+ txs.add(txModel);
+ }
+ }
+ }
+
+ public List<TxModel> getTxs() {
+ return txs;
+ }
+
+ public TxModel getFirstTx() {
+ return txs.isEmpty() ? null : txs.get(0);
+ }
+
+ public TxModel getLastTx() {
+ return txs.isEmpty() ? null : txs.get(txs.size() - 1);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof BranchModel) {
+ BranchModel other = ((BranchModel) obj);
+ return other.getBranch().equals(getBranch());
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return branch.hashCode();
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return String.format("Branch:[%s] Type:[%s] Children:[%s] TxNodes:[%s]", branch.getBranchName(),
+ branch.getBranchType().name(), children.size(), txs.size());
+ }
+
+ public boolean areTxsVisible() {
+ return txsVisible;
+ }
+
+ public void setTxsVisible(boolean txsVisible) {
+ if (areTxsVisible() != txsVisible) {
+ this.txsVisible = txsVisible;
+ for (TxModel tx : txs) {
+ tx.setVisible(txsVisible);
+ }
+ }
+ }
+
+ public void setDepth(int depth) {
+ this.depth = depth;
+ }
+
+ public int getDepth() {
+ return depth;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphCache.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphCache.java
new file mode 100644
index 00000000000..0ba9ae7a6e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphCache.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.framework.ui.branch.graph.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphCache {
+
+ private final BranchModel rootModel;
+ private final Map<Branch, BranchModel> branchToBranchModelMap;
+ private final Map<Long, TxModel> txNumberToTxModelMap;
+
+ public GraphCache(Branch rootBranch) throws OseeCoreException {
+ this.branchToBranchModelMap = new HashMap<Branch, BranchModel>();
+ this.txNumberToTxModelMap = new HashMap<Long, TxModel>();
+ this.rootModel = this.getOrCreateBranchModel(rootBranch);
+ this.rootModel.setDepth(0);
+ }
+
+ public BranchModel getRootModel() {
+ return rootModel;
+ }
+
+ public List<Node> getNodes() {
+ List<Node> nodes = new ArrayList<Node>();
+ nodes.addAll(branchToBranchModelMap.values());
+ nodes.addAll(txNumberToTxModelMap.values());
+ return nodes;
+ }
+
+ protected void reset() {
+ branchToBranchModelMap.clear();
+ txNumberToTxModelMap.clear();
+ rootModel.reset();
+ rootModel.resetTxs();
+ rootModel.setIsLoaded(false);
+ }
+
+ protected void addBranchModel(BranchModel model) {
+ branchToBranchModelMap.put(model.getBranch(), model);
+ }
+
+ protected void addTxModel(TxModel model) {
+ txNumberToTxModelMap.put(model.getRevision(), model);
+ }
+
+ protected void removeBranchModel(Branch branch) {
+ branchToBranchModelMap.remove(branch);
+ }
+
+ protected void removeTxModel(Long txId) {
+ txNumberToTxModelMap.remove(txId);
+ }
+
+ public BranchModel getBranchModel(Branch branch) {
+ return branchToBranchModelMap.get(branch);
+ }
+
+ public TxModel getTxModel(Long txId) {
+ return txNumberToTxModelMap.get(txId);
+ }
+
+ public Collection<BranchModel> getBranchModels() {
+ return branchToBranchModelMap.values();
+ }
+
+ public Collection<TxModel> getTxModels() {
+ return txNumberToTxModelMap.values();
+ }
+
+ protected TxModel getOrCreateTxModel(TxData txData) {
+ TxModel toReturn = getTxModel(txData.getTxId());
+ if (toReturn == null) {
+ toReturn = new TxModel(txData);
+ addTxModel(toReturn);
+ }
+ return toReturn;
+ }
+
+ protected BranchModel getOrCreateBranchModel(Branch branch) throws OseeCoreException {
+ BranchModel toReturn = null;
+ if (branch.equals(StubBranchModel.STUB_BRANCH)) {
+ toReturn = getStubBranchModel();
+ } else {
+ toReturn = getBranchModel(branch);
+ }
+ if (toReturn == null) {
+ toReturn = new BranchModel(branch);
+
+ Pair<TransactionId, TransactionId> startAndEnd = TransactionIdManager.getStartEndPoint(branch);
+ addTxsToBranchModel(toReturn, startAndEnd.getKey());
+ if (startAndEnd.getKey().equals(startAndEnd.getValue())) {
+ addTxsToBranchModel(toReturn, startAndEnd.getValue());
+ }
+ addBranchModel(toReturn);
+ }
+ return toReturn;
+ }
+
+ private void addTxsToBranchModel(BranchModel branchModel, TransactionId toAdd) throws OseeCoreException {
+ TxModel txModel = getOrCreateTxModel(TxData.createTxData(toAdd));
+ branchModel.addTx(txModel);
+ }
+
+ public StubBranchModel getStubBranchModel() {
+ StubBranchModel toReturn = (StubBranchModel) getBranchModel(StubBranchModel.STUB_BRANCH);
+ if (toReturn == null) {
+ toReturn = new StubBranchModel();
+ addTxModel(toReturn.addTx((long) -1));
+ addBranchModel(toReturn);
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphLoader.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphLoader.java
new file mode 100644
index 00000000000..18282d11abf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/GraphLoader.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.framework.ui.branch.graph.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.data.JoinUtility;
+import org.eclipse.osee.framework.core.data.JoinUtility.TransactionJoinQuery;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.branch.graph.BranchGraphActivator;
+import org.eclipse.osee.framework.ui.branch.graph.operation.IProgressListener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphLoader {
+ private static final String GET_TRANSACTION_DATA =
+ "SELECT otd.* FROM osee_join_transaction ojt, osee_tx_details otd WHERE ojt.transaction_id = otd.transaction_id and ojt.query_id = ? ORDER BY otd.transaction_id desc";
+
+ private GraphLoader() {
+ }
+
+ public static void load(GraphCache graphCache, IProgressListener progress) throws OseeCoreException {
+ // graphCache.reset();
+ load(graphCache, graphCache.getRootModel(), true, progress);
+ }
+
+ protected static void load(GraphCache graphCache, BranchModel modelToLoad, boolean recurse, IProgressListener progress) throws OseeCoreException {
+ // graphCache.addBranchModel(modelToLoad);
+ loadBranches(graphCache, modelToLoad, recurse, progress);
+ addParentTxData(graphCache, modelToLoad, recurse, progress);
+ updateConnections(graphCache, modelToLoad, recurse, progress);
+ }
+
+ protected static void loadBranches(GraphCache graphCache, BranchModel current, boolean recurse, IProgressListener listener) throws OseeCoreException {
+ for (Branch child : current.getBranch().getChildBranches()) {
+ BranchModel childModel = graphCache.getOrCreateBranchModel(child);
+ childModel.setDepth(current.getDepth() + 1);
+ if (recurse) {
+ loadBranches(graphCache, childModel, true, listener);
+ }
+ current.addChildBranchModel(childModel);
+ listener.worked();
+ }
+ }
+
+ private static void addParentTxData(GraphCache graphCache, BranchModel current, boolean recurse, IProgressListener listener) throws OseeCoreException {
+ TransactionJoinQuery txJoinQuery = JoinUtility.createTransactionJoinQuery();
+ try {
+ List<Branch> branches = new ArrayList<Branch>(current.getBranch().getChildBranches(recurse));
+ branches.add(current.getBranch());
+ for (Branch branch : branches) {
+ txJoinQuery.add(-1, branch.getParentTransactionNumber());
+ }
+ txJoinQuery.store();
+
+ for (TxData txData : getTxData(txJoinQuery.getQueryId())) {
+ BranchModel branchModel = graphCache.getOrCreateBranchModel(txData.getBranch());
+ branchModel.addTx(graphCache.getOrCreateTxModel(txData));
+ }
+ } finally {
+ txJoinQuery.delete();
+ }
+ }
+
+ private static void updateConnections(GraphCache graphCache, BranchModel current, boolean recurse, IProgressListener listener) {
+ TxModel systemRootTx = null;
+
+ List<BranchModel> models = new ArrayList<BranchModel>();
+ // models.addAll(current.getChildren());
+ // if (recurse) {
+ models.addAll(current.getAllChildrenBelow());
+ // }
+ models.add(current);
+
+ // models.addAll(graphCache.getBranchModels());
+
+ for (BranchModel branchModel : models) {
+ if (branchModel.getBranch().isSystemRootBranch()) {
+ systemRootTx = branchModel.getFirstTx();
+ } else {
+ long parentTxId = branchModel.getBranch().getParentTransactionNumber();
+ if (parentTxId > 0) {
+ TxModel txModel = branchModel.getFirstTx();
+ if (txModel != null) {
+ TxModel source = graphCache.getTxModel(parentTxId);
+ if (source != null) {
+ connect(source, txModel);
+ } else {
+ OseeLog.log(BranchGraphActivator.class, Level.SEVERE,
+ String.format("Invalid parent transaction id of [%s] for branch [%s]", parentTxId,
+ branchModel.getBranch()));
+ // StubBranchModel stubModel = graphCache.getStubBranchModel();
+ // TxModel stubTxModel = stubModel.addTx(parentTxId);
+ // graphCache.addTxModel(stubTxModel);
+ // connect(stubTxModel, txModel);
+
+ }
+ }
+ }
+ }
+ }
+
+ if (systemRootTx != null) {
+ for (BranchModel branchModel : models) {
+ try {
+ if (branchModel.getBranch().isTopLevelBranch()) {
+ TxModel txModel = branchModel.getFirstTx();
+ if (txModel != null) {
+ connect(systemRootTx, txModel);
+ }
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ }
+ }
+
+ private static void connect(TxModel source, TxModel target) {
+ target.setSourceTx(source);
+ }
+
+ private static List<TxData> getTxData(int queryId) throws OseeDataStoreException, BranchDoesNotExist {
+ List<TxData> txDatas = new ArrayList<TxData>();
+ ConnectionHandlerStatement chStmt = null;
+ try {
+ chStmt = new ConnectionHandlerStatement();
+ chStmt.runPreparedQuery(GET_TRANSACTION_DATA, queryId);
+ while (chStmt.next()) {
+ Branch branch = BranchManager.getBranch(chStmt.getInt("branch_id"));
+ TxData txData =
+ new TxData(branch, chStmt.getInt("author"), chStmt.getTimestamp("time"),
+ chStmt.getString("osee_comment"), chStmt.getInt("tx_type"), chStmt.getInt("commit_art_id"),
+ chStmt.getInt("transaction_id"));
+ txDatas.add(txData);
+ }
+ } finally {
+ if (chStmt != null) {
+ chStmt.close();
+ }
+ }
+ return txDatas;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/IModelListener.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/IModelListener.java
new file mode 100644
index 00000000000..af0f4c09171
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/IModelListener.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.framework.ui.branch.graph.model;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IModelListener {
+
+ public void onModelEvent(Object object);
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Model.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Model.java
new file mode 100644
index 00000000000..cf7f4705a5f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Model.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.framework.ui.branch.graph.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Model {
+ private final Set<IModelListener> listeners;
+
+ public Model() {
+ this.listeners = Collections.synchronizedSet(new HashSet<IModelListener>());
+ }
+
+ public void addListener(IModelListener listener) {
+ if (listener != null) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(IModelListener listener) {
+ if (listener != null) {
+ listeners.remove(listener);
+ }
+ }
+
+ protected List<IModelListener> getListeners() {
+ return new ArrayList<IModelListener>(listeners);
+ }
+
+ protected void fireModelEvent() {
+ fireModelEvent(null);
+ }
+
+ protected void fireModelEvent(Object object) {
+ for (IModelListener listener : listeners) {
+ listener.onModelEvent(object);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Node.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Node.java
new file mode 100644
index 00000000000..3b74a839725
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/Node.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.framework.ui.branch.graph.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class Node extends Model implements Serializable {
+
+ private static final long serialVersionUID = -6334027982115287426L;
+
+ private transient boolean isVisible;
+ private transient boolean isSelected;
+ private transient int index;
+
+ public Node() {
+ this.isVisible = true;
+ }
+
+ public boolean isVisible() {
+ return isVisible;
+ }
+
+ public void setVisible(boolean isVisible) {
+ this.isVisible = isVisible;
+ }
+
+ public boolean isSelected() {
+ return isSelected;
+ }
+
+ public void setSelected(boolean selected) {
+ this.isSelected = selected;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/StubBranchModel.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/StubBranchModel.java
new file mode 100644
index 00000000000..e6258d112b7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/StubBranchModel.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.framework.ui.branch.graph.model;
+
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StubBranchModel extends BranchModel {
+ private static final long serialVersionUID = -6424441243526185426L;
+
+ public static final Branch STUB_BRANCH =
+ new Branch("Unreferenced", -1, 1, 1, false, 0, new Timestamp(new Date().getTime()),
+ "Dummy branch to allocate data errors", 0, BranchType.TOP_LEVEL, BranchState.CREATED);
+
+ private final Map<Long, TxModel> stubs;
+
+ public StubBranchModel() {
+ super(STUB_BRANCH);
+ this.stubs = new HashMap<Long, TxModel>();
+ }
+
+ public TxModel addTx(Long value) {
+ TxModel toReturn = stubs.get(value);
+ if (toReturn == null) {
+ toReturn =
+ new TxModel(new TxData(STUB_BRANCH, 0, new Timestamp(new Date().getTime()), String.format(
+ "Transaction: [%s] not found", value), 0, 0, value));
+ addTx(toReturn);
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxData.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxData.java
new file mode 100644
index 00000000000..581d8b03956
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxData.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.framework.ui.branch.graph.model;
+
+import java.util.Date;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TxData {
+
+ private final int authorId;
+ private final Date timeStamp;
+ private final String comment;
+ private final TransactionDetailsType txType;
+ private final int commitArtId;
+ private final Branch branch;
+ private final Long txId;
+
+ public TxData(Branch branch, int authorId, Date timeStamp, String comment, int txType, int commitArtId, long txId) {
+ super();
+ this.authorId = authorId;
+ this.timeStamp = timeStamp;
+ this.comment = comment;
+ this.txType = TransactionDetailsType.toEnum(txType);
+ this.commitArtId = commitArtId;
+ this.branch = branch;
+ this.txId = txId;
+ }
+
+ /**
+ * @return the author
+ */
+ public String getAuthor() {
+ String authorName = null;
+ try {
+ User user = UserManager.getUserByArtId(authorId);
+ if (user != null) {
+ authorName = user.getName();
+ }
+ } catch (OseeCoreException ex) {
+ authorName = "Unknown";
+ }
+ return authorName;
+ }
+
+ /**
+ * @return the timeStamp
+ */
+ public Date getTimeStamp() {
+ return timeStamp;
+ }
+
+ /**
+ * @return the comment
+ */
+ public String getComment() {
+ return comment;
+ }
+
+ /**
+ * @return the txType
+ */
+ public TransactionDetailsType getTxType() {
+ return txType;
+ }
+
+ /**
+ * @return the commitArtId
+ */
+ public int getCommitArtId() {
+ return commitArtId;
+ }
+
+ /**
+ * @return the branch
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /**
+ * @return the txId
+ */
+ public Long getTxId() {
+ return txId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return getTxId().hashCode();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof TxData) {
+ TxData other = ((TxData) obj);
+ return other.getTxId().longValue() == getTxId().longValue();
+ }
+ return false;
+ }
+
+ public String toString() {
+ return String.format("Tx:[%s] Author:[%s] Branch:[%s] Comment:[%s]", getTxId(), getAuthor(),
+ getBranch().getBranchName(), getComment());
+ }
+
+ protected static TxData createTxData(TransactionId txId) {
+ return new TxData(txId.getBranch(), txId.getAuthorArtId(), txId.getTime(), txId.getComment(),
+ txId.getTxType().getId(), txId.getCommitArtId(), txId.getTransactionNumber());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxModel.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxModel.java
new file mode 100644
index 00000000000..b28697f751a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/model/TxModel.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.framework.ui.branch.graph.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TxModel extends Node implements Serializable, Comparable<TxModel> {
+
+ private static final long serialVersionUID = -2246486595572509094L;
+
+ private TxData txData;
+ private BranchModel branchModel;
+ private TxModel parentTxModel;
+ private TxModel sourceTxModel;
+ private List<TxModel> mergedTxs;
+
+ public TxModel(TxData txData) {
+ this.txData = txData;
+ }
+
+ public TxData getTxData() {
+ return txData;
+ }
+
+ public void setBranchModel(BranchModel branchModel) {
+ this.branchModel = branchModel;
+ }
+
+ public BranchModel getParentBranchModel() {
+ return branchModel;
+ }
+
+ public TxModel getParentTx() {
+ return parentTxModel;
+ }
+
+ public void setParentTx(TxModel parent) {
+ this.parentTxModel = parent;
+ }
+
+ public TxModel getSourceTx() {
+ return sourceTxModel;
+ }
+
+ public void setSourceTx(TxModel sourceTxModel) {
+ this.sourceTxModel = sourceTxModel;
+ }
+
+ public List<TxModel> getMergedTx() {
+ return mergedTxs;
+ }
+
+ public void addMergedTx(TxModel node) {
+ if (mergedTxs == null) {
+ mergedTxs = new ArrayList<TxModel>();
+ }
+ mergedTxs.add(node);
+ }
+
+ public Long getRevision() {
+ return getTxData().getTxId();
+ }
+
+ public int compareTo(TxModel other) {
+ return getRevision().compareTo(other.getRevision());
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof TxModel) {
+ TxModel other = ((TxModel) obj);
+ return other.getTxData().equals(getTxData());
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return txData.hashCode();
+ }
+
+ public String toString() {
+ return txData.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/IProgressListener.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/IProgressListener.java
new file mode 100644
index 00000000000..8fdcb0ca3cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/IProgressListener.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.framework.ui.branch.graph.operation;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IProgressListener {
+
+ public void worked();
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/LoadGraphOperation.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/LoadGraphOperation.java
new file mode 100644
index 00000000000..4ce6a4165f3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/operation/LoadGraphOperation.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.framework.ui.branch.graph.operation;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.branch.graph.core.BranchGraphEditor;
+import org.eclipse.osee.framework.ui.branch.graph.core.BranchGraphEditorInput;
+import org.eclipse.osee.framework.ui.branch.graph.model.GraphCache;
+import org.eclipse.osee.framework.ui.branch.graph.model.GraphLoader;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LoadGraphOperation implements IExceptionableRunnable {
+
+ private Branch resource;
+ private GraphicalViewer viewer;
+ private BranchGraphEditor editor;
+ private GraphCache graph;
+
+ private static final int TOTAL_STEPS = Integer.MAX_VALUE;
+ private static final int SHORT_TASK_STEPS = TOTAL_STEPS / 50;
+ private static final int VERY_LONG_TASK = TOTAL_STEPS / 2;
+ private static final int TASK_STEPS = (TOTAL_STEPS - SHORT_TASK_STEPS * 3 - VERY_LONG_TASK) / 2;
+
+ protected LoadGraphOperation(IWorkbenchPart part, GraphicalViewer viewer, BranchGraphEditor editor) {
+ super();
+ this.viewer = viewer;
+ this.editor = editor;
+ }
+
+ public LoadGraphOperation(IWorkbenchPart part, GraphicalViewer viewer, BranchGraphEditor editor, Branch resource) {
+ this(part, viewer, editor);
+ this.resource = resource;
+ }
+
+ public String getName() {
+ return "Loading graph information";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.IExceptionableRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ boolean error = false;
+ monitor.beginTask(getName(), TOTAL_STEPS);
+ monitor.worked(SHORT_TASK_STEPS);
+ try {
+ TransactionId transaction = TransactionIdManager.getlatestTransactionForBranch(resource);
+ if (editor != null) {
+ ((BranchGraphEditorInput) editor.getEditorInput()).setTransactionId(transaction);
+ }
+ Branch path = transaction.getBranch();
+
+ monitor.setTaskName("Initializating cache");
+
+ monitor.worked(SHORT_TASK_STEPS);
+
+ if (editor != null) {
+ if (error == true || monitor.isCanceled()) {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ IWorkbenchWindow window = editor.getEditorSite().getWorkbenchWindow();
+ IWorkbenchPage page = window.getActivePage();
+ page.activate(editor);
+ page.closeEditor(editor, false);
+ }
+ });
+ } else {
+ updateView(monitor, path, transaction);
+ }
+ }
+ } catch (Exception ex) {
+ AWorkbench.popup("Error Calculating Revision Graph Information", Lib.exceptionToString(ex));
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ private void updateView(IProgressMonitor monitor, Branch branch, TransactionId revision) throws OseeCoreException {
+ monitor.setTaskName("Finding root node");
+ int unitWork = TASK_STEPS / (int) (revision.getTransactionNumber());
+ if (unitWork < 1) {
+ unitWork = 1;
+ }
+ monitor.setTaskName("Calculating graph");
+ graph = new GraphCache(branch);
+ GraphLoader.load(graph, new InternalTaskProgressListener(monitor, unitWork));
+ monitor.setTaskName("Drawing graph");
+
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ viewer.setContents(graph);
+ editor.setOutlineContent(graph);
+ }
+ });
+ }
+ private final class InternalTaskProgressListener implements IProgressListener {
+
+ private IProgressMonitor monitor;
+ private int unitWork;
+
+ public InternalTaskProgressListener(IProgressMonitor monitor, int unitWork) {
+ this.monitor = monitor;
+ this.unitWork = unitWork;
+ }
+
+ public void worked() {
+ monitor.worked(unitWork);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchDataEditPart.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchDataEditPart.java
new file mode 100644
index 00000000000..77a85e86697
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchDataEditPart.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.GridLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.branch.graph.figure.BranchFigure;
+import org.eclipse.osee.framework.ui.branch.graph.figure.PlusMinus;
+import org.eclipse.osee.framework.ui.branch.graph.model.GraphCache;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphFigureConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchDataEditPart extends AbstractGraphicalEditPart {
+
+ protected IFigure createFigure() {
+ Branch branch = (Branch) getModel();
+ GraphEditPart graphEditPart = (GraphEditPart) getParent().getParent();
+ BranchFigure branchFigure = graphEditPart.getFigure(branch);
+
+ Panel figure = new Panel();
+ figure.setLayoutManager(new BorderLayout());
+ figure.setBackgroundColor(ColorConstants.white);
+ figure.setOpaque(true);
+
+ Panel container = new Panel();
+ container.setOpaque(true);
+ GridLayout layout = new GridLayout();
+ layout.verticalSpacing = GraphFigureConstants.PLUS_MINUS_PADDING;
+ layout.horizontalSpacing = GraphFigureConstants.PLUS_MINUS_PADDING;
+ container.setLayoutManager(layout);
+
+ PlusMinus control = new PlusMinus();
+ control.setPreferredSize(9, 9);
+ container.add(control);
+ control.getModel().addActionListener(new PlusMinusFigureMouseListener());
+ figure.add(container, BorderLayout.LEFT);
+ figure.add(branchFigure, BorderLayout.CENTER);
+ return figure;
+ }
+
+ protected void refreshVisuals() {
+ getFigure().setSize(220, 30);
+ super.refreshVisuals();
+ }
+
+ protected void createEditPolicies() {
+ }
+
+ private final class PlusMinusFigureMouseListener implements ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent event) {
+ Branch branch = (Branch) getModel();
+ GraphEditPart graphEditPart = (GraphEditPart) getParent().getParent();
+ GraphCache graphCache = (GraphCache) graphEditPart.getModel();
+ //BranchModel model =
+ graphCache.getBranchModel(branch);
+
+ // TODO: prune the tree
+ // List<BranchModel> children = model.getChildren();
+ // if (children.size() > 0) {
+ // boolean isVisible = !children.get(0).isVisible();
+ // model.setTxsVisible(isVisible);
+ // for (BranchModel child : model.getAllChildrenBelow()) {
+ // child.setVisible(isVisible);
+ // }
+ // viewer.setContents(graphCache);
+ // }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchEditPart.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchEditPart.java
new file mode 100644
index 00000000000..fc3183009c9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchEditPart.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.branch.graph.parts;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.XYLayout;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.SelectionEditPolicy;
+import org.eclipse.osee.framework.ui.branch.graph.model.BranchModel;
+import org.eclipse.osee.framework.ui.branch.graph.model.TxModel;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphFigureConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchEditPart extends AbstractGraphicalEditPart {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ BranchModel branchModel = (BranchModel) getModel();
+ GraphEditPart gPart = (GraphEditPart) getParent();
+
+ IFigure txContainer = new Figure();
+ txContainer.setBackgroundColor(ColorConstants.white);
+ txContainer.setOpaque(true);
+
+ XYLayout layout = new XYLayout();
+ txContainer.setLayoutManager(layout);
+
+ int height = branchModel.areTxsVisible() ? -1 : GraphFigureConstants.BRANCH_HEIGHT;
+ Point point = getBranchFigureLocation(branchModel, gPart);
+ Rectangle rect = new Rectangle(point.x, point.y, GraphFigureConstants.BRANCH_WIDTH, height);
+
+ IFigure parentFigure = gPart.getFigure();
+ parentFigure.getLayoutManager().setConstraint(txContainer, rect);
+
+ return txContainer;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List getModelChildren() {
+ List toReturn = new ArrayList();
+
+ BranchModel model = (BranchModel) getModel();
+ toReturn.add(model.getBranch());
+
+ if (model.areTxsVisible()) {
+ int index = 0;
+ for (TxModel node : model.getTxs()) {
+ node.setIndex(index++);
+ toReturn.add(node);
+ }
+ }
+ return toReturn;
+ }
+
+ private Point getBranchFigureLocation(BranchModel branchModel, GraphEditPart gPart) {
+
+ int graphLevel = branchModel.getDepth();
+
+ int branchesAboveLevel = 0;
+ for (int index = 0; index < graphLevel; index++) {
+ branchesAboveLevel += gPart.getNumberOfBranchesAtGraphLevel(index);
+ }
+ int branchAtLevel = gPart.getNumberOfBranchesAtGraphLevel(graphLevel);
+
+ int maxBranches = gPart.getMaxNumberOfBranchesAtAnyLevel();
+
+ int xMiddle = maxBranches * GraphFigureConstants.BRANCH_X_OFFSET / 2;
+
+ int xStart = xMiddle + (((branchAtLevel - 1) * GraphFigureConstants.BRANCH_X_OFFSET) / 2) * -1;
+
+ xStart +=
+ GraphFigureConstants.GRAPH_MARGIN + (branchModel.getIndex() - branchesAboveLevel) * GraphFigureConstants.BRANCH_X_OFFSET;
+
+ int totalTxs = 0;
+ for (int index = 0; index < graphLevel; index++) {
+ totalTxs += gPart.getMaxTxForGraphLevel(index);
+ }
+ int yStart =
+ GraphFigureConstants.GRAPH_MARGIN + (GraphFigureConstants.BRANCH_Y_OFFSET * graphLevel) + (GraphFigureConstants.TX_Y_OFFSET * totalTxs);
+
+ return new Point(xStart, yStart);
+ }
+
+ // private Point getBalancedTreeLocation(BranchModel branchModel, GraphEditPart gPart) {
+ // int graphLevel = branchModel.getDepth();
+ //
+ // // int numberOfChildrenAtLevel = branchModel.getParentBranch().getChildren().size();
+ //
+ // int maxDepth = branchModel.getDepth();
+ // for (BranchModel model : branchModel.getAllChildrenBelow()) {
+ // maxDepth = Math.max(model.getDepth(), maxDepth);
+ // }
+ // int maxChildrenAtAnyLevel = branchModel.getAllChildrenBelow().size();
+ // maxChildrenAtAnyLevel = maxChildrenAtAnyLevel / (maxDepth - branchModel.getDepth());
+ //
+ // int branchesAboveLevel = 0;
+ // for (int index = 0; index < graphLevel; index++) {
+ // branchesAboveLevel += gPart.getNumberOfBranchesAtGraphLevel(index);
+ // }
+ // int branchAtLevel = gPart.getNumberOfBranchesAtGraphLevel(graphLevel);
+ //
+ // int maxBranches = gPart.getMaxNumberOfBranchesAtAnyLevel();
+ //
+ // int xMiddle = maxBranches * GraphFigureConstants.BRANCH_X_OFFSET / 2;
+ //
+ // int xStart = xMiddle + (((branchAtLevel - 1) * GraphFigureConstants.BRANCH_X_OFFSET) / 2) * -1;
+ //
+ // xStart +=
+ // GraphFigureConstants.GRAPH_MARGIN + (branchModel.getIndex() - branchesAboveLevel) * GraphFigureConstants.BRANCH_X_OFFSET;
+ //
+ // int totalTxs = 0;
+ // for (int index = 0; index < graphLevel; index++) {
+ // totalTxs += gPart.getMaxTxForGraphLevel(index);
+ // }
+ // int yStart =
+ // GraphFigureConstants.GRAPH_MARGIN + (GraphFigureConstants.BRANCH_Y_OFFSET * graphLevel) + (GraphFigureConstants.TX_Y_OFFSET * totalTxs);
+ //
+ // return new Point(xStart, yStart);
+ // }
+
+ protected void createEditPolicies() {
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new SelectionEditPolicy() {
+ protected void hideSelection() {
+ refreshVisuals();
+ }
+
+ protected void showSelection() {
+ refreshVisuals();
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchSelectionEditPolicy.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchSelectionEditPolicy.java
new file mode 100644
index 00000000000..99b2393c33e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/BranchSelectionEditPolicy.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.osee.framework.ui.branch.graph.figure.BranchFigure;
+
+public class BranchSelectionEditPolicy extends NonResizableEditPolicy {
+
+ protected BranchFigure getLabel() {
+ return (BranchFigure) getHostFigure();
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#hideFocus()
+ */
+ protected void hideFocus() {
+ // getLabel().setFocus(false);
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#hideSelection()
+ */
+ protected void hideSelection() {
+ // getLabel().setSelected(false);
+ // getLabel().setFocus(false);
+
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#showFocus()
+ */
+ protected void showFocus() {
+ // getLabel().setFocus(true);
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
+ */
+ protected void showPrimarySelection() {
+ // getLabel().setSelected(true);
+ // getLabel().setFocus(true);
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
+ */
+ protected void showSelection() {
+ // getLabel().setSelected(true);
+ // getLabel().setFocus(false);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/CurrentNodeEditPart.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/CurrentNodeEditPart.java
new file mode 100644
index 00000000000..71bde8aabe1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/CurrentNodeEditPart.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CurrentNodeEditPart extends AbstractGraphicalEditPart {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPart.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPart.java
new file mode 100644
index 00000000000..8c2ec564a23
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPart.java
@@ -0,0 +1,447 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.branch.graph.parts;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+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.draw2d.ColorConstants;
+import org.eclipse.draw2d.Connection;
+import org.eclipse.draw2d.ConnectionLayer;
+import org.eclipse.draw2d.Cursors;
+import org.eclipse.draw2d.FanRouter;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.draw2d.MouseMotionListener;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.ShortestPathConnectionRouter;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.XYLayout;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.branch.graph.BranchGraphActivator;
+import org.eclipse.osee.framework.ui.branch.graph.figure.BranchFigure;
+import org.eclipse.osee.framework.ui.branch.graph.figure.FigureFactory;
+import org.eclipse.osee.framework.ui.branch.graph.figure.TxFigure;
+import org.eclipse.osee.framework.ui.branch.graph.model.BranchModel;
+import org.eclipse.osee.framework.ui.branch.graph.model.GraphCache;
+import org.eclipse.osee.framework.ui.branch.graph.model.TxModel;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphOptions;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphOptions.ConnectionFilter;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphOptions.TxFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+
+public class GraphEditPart extends AbstractGraphicalEditPart {
+
+ private final GraphicalViewer viewer;
+ private final Map<Branch, BranchFigure> branchFigureMap;
+ private final Map<Long, TxModel> txNumberToTxModelMap;
+ private final Map<Long, TxFigure> txNumberToTxFigureMap;
+ private final HashCollection<ConnectionType, Connection> connectionMap;
+
+ private final HashCollection<Integer, BranchModel> branchesByLevel;
+
+ private final IPreferenceStore preferenceStore;
+
+ private enum ConnectionType {
+ BRANCH_INTERNAL, PARENT_CHILD, MERGE;
+ }
+
+ public GraphEditPart(GraphicalViewer viewer) {
+ super();
+ this.viewer = viewer;
+ this.branchFigureMap = new HashMap<Branch, BranchFigure>();
+ this.txNumberToTxModelMap = new HashMap<Long, TxModel>();
+ this.txNumberToTxFigureMap = new HashMap<Long, TxFigure>();
+ this.branchesByLevel = new HashCollection<Integer, BranchModel>();
+ this.connectionMap = new HashCollection<ConnectionType, Connection>();
+ this.preferenceStore = BranchGraphActivator.getInstance().getPreferenceStore();
+ }
+
+ /*
+ * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
+ */
+ @Override
+ protected void createEditPolicies() {
+ // installEditPolicy(EditPolicy.LAYOUT_ROLE, new GraphXYLayoutEditPolicy());
+ }
+
+ /*
+ * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+ */
+ @Override
+ protected IFigure createFigure() {
+ IFigure figure = new Figure();
+ figure.setBackgroundColor(ColorConstants.white);
+ figure.setOpaque(true);
+
+ XYLayout layout = new XYLayout();
+ figure.setLayoutManager(layout);
+
+ ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
+ FanRouter router = new FanRouter();
+ router.setSeparation(20);
+ router.setNextRouter(new ShortestPathConnectionRouter(figure));
+ connLayer.setConnectionRouter(router);
+ connLayer.setAntialias(SWT.ON);
+ return figure;
+ }
+
+ /*
+ * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
+ */
+ @Override
+ protected List<BranchModel> getModelChildren() {
+ GraphCache graphCache = ((GraphCache) getModel());
+
+ List<BranchModel> nodes = new ArrayList<BranchModel>();
+ nodes.add(graphCache.getRootModel());
+ nodes.addAll(graphCache.getRootModel().getAllChildrenBelow());
+ Collections.sort(nodes, new Comparator<BranchModel>() {
+ @Override
+ public int compare(BranchModel o1, BranchModel o2) {
+ int level1 = o1.getDepth();
+ int level2 = o2.getDepth();
+ int result = new Integer(level1).compareTo(new Integer(level2));
+ // if (result == 0) {
+ // BranchModel parent1 = o1.getParentBranch();
+ // BranchModel parent2 = o2.getParentBranch();
+ // if (parent1 == null && parent2 == null) {
+ // result = 0;
+ // } else if (parent1 != null && parent2 == null) {
+ // result = 1;
+ // } else if (parent2 != null && parent1 == null) {
+ // result = -1;
+ // } else {
+ // result = parent1.getBranch().compareTo(parent2.getBranch());
+ // }
+ // }
+ // if (result == 0) {
+ // TxModel m1 = o1.getFirstTx();
+ // TxModel m2 = o2.getFirstTx();
+ // try {
+ // result = m1.compareTo(m2);
+ // } catch (Exception ex) {
+ // OseeLog.log(RevisionGraphActivator.class, Level.SEVERE, String.format(
+ // "One of the branch models did not have a starting tx. 1:[%s] 2:[%s]", o1, o2));
+ // }
+ // }
+ return result;
+ }
+ });
+
+ List<BranchModel> toDraw = new ArrayList<BranchModel>();
+ for (int index = 0; index < nodes.size(); index++) {
+ BranchModel model = nodes.get(index);
+ model.setIndex(index);
+ toDraw.add(model);
+ branchFigureMap.put(model.getBranch(), FigureFactory.createBranchLabelFigure(model));
+ branchesByLevel.put(model.getDepth(), model);
+ }
+
+ for (TxModel model : graphCache.getTxModels()) {
+ BranchModel parent = model.getParentBranchModel();
+ if (parent != null && parent.areTxsVisible() && parent.isVisible()) {
+ Long txNumber = model.getRevision();
+ txNumberToTxModelMap.put(txNumber, model);
+ txNumberToTxFigureMap.put(txNumber, FigureFactory.createTxFigure(model));
+ } else {
+ OseeLog.log(BranchGraphActivator.class, Level.SEVERE, String.format("Orphan TxModel: [%s]",
+ model.toString()));
+ }
+ }
+
+ createTxConnections(toDraw);
+ createMergedConnections(toDraw);
+
+ setConnectionVisibility();
+ return toDraw;
+ }
+
+ public int getMaxTxForGraphLevel(int graphLevel) {
+ int max = Integer.MIN_VALUE;
+ Collection<BranchModel> models = branchesByLevel.getValues(graphLevel);
+ if (models != null) {
+ for (BranchModel model : models) {
+ if (model.areTxsVisible()) {
+ max = Math.max(model.getTxs().size(), max);
+ } else {
+ max = Math.max(3, max);
+ }
+ }
+ }
+ return max;
+ }
+
+ public int getNumberOfBranchesAtGraphLevel(int graphLevel) {
+ Collection<?> collection = branchesByLevel.getValues(graphLevel);
+ return collection != null ? collection.size() : 0;
+ }
+
+ public int getMaxNumberOfBranchesAtAnyLevel() {
+ int max = Integer.MIN_VALUE;
+ for (Integer level : branchesByLevel.keySet()) {
+ max = Math.max(max, getNumberOfBranchesAtGraphLevel(level));
+ }
+ return max;
+ }
+
+ public BranchFigure getFigure(Branch branch) {
+ return (BranchFigure) branchFigureMap.get(branch);
+ }
+
+ public TxFigure getTxFigure(TxModel txModel) {
+ return txNumberToTxFigureMap.get(txModel.getRevision());
+ }
+
+ private void createMergedConnections(Collection<BranchModel> toReturn) {
+ for (BranchModel branchNode : toReturn) {
+ for (TxModel txModel : branchNode.getTxs()) {
+ if (txModel.getMergedTx() != null) {
+ TxFigure txFigure = (TxFigure) txNumberToTxFigureMap.get(txModel.getRevision());
+ for (TxModel merged : txModel.getMergedTx()) {
+ TxFigure mergedView = (TxFigure) txNumberToTxFigureMap.get(merged.getRevision());
+ if (mergedView != null) {
+ String message = getConnectionLabel(merged, txModel);
+ connect(ConnectionType.MERGE, getFigure(), mergedView, txFigure, message, true, ColorConstants.red);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private String getConnectionLabel(TxModel source, TxModel target) {
+ return String.format("%s:%s - %s:%s", source.getParentBranchModel().getBranch().getBranchShortName(),
+ source.getRevision(), target.getParentBranchModel().getBranch().getBranchShortName(), target.getRevision());
+ }
+
+ private void createTxConnections(Collection<BranchModel> toReturn) {
+ for (BranchModel branchModel : toReturn) {
+ if (branchModel.areTxsVisible()) {
+ for (TxModel txModel : branchModel.getTxs()) {
+ TxFigure txFigure = getTxFigure(txModel);
+ boolean connectToBranchLabel = branchModel.getFirstTx() == txModel;
+ String msg = null;
+ if (txModel.getParentTx() != null) {
+ TxModel parentTxModel = txModel.getParentTx();
+ TxFigure parent = getTxFigure(parentTxModel);
+ if (parent != null) {
+ msg = getConnectionLabel(parentTxModel, txModel);
+ connect(ConnectionType.BRANCH_INTERNAL, getFigure(), parent, txFigure, msg, false,
+ ColorConstants.black);
+ }
+ } else if (txModel.getSourceTx() != null) {
+ TxModel sourceTx = txModel.getSourceTx();
+ TxFigure source = getTxFigure(sourceTx);
+ if (source != null) {
+ msg = getConnectionLabel(sourceTx, txModel);
+ connect(ConnectionType.PARENT_CHILD, getFigure(), source, txFigure, msg, true, ColorConstants.blue);
+ }
+ } else {
+ connectToBranchLabel = true;
+ }
+
+ if (connectToBranchLabel) {
+ BranchFigure branchFigure = (BranchFigure) branchFigureMap.get(branchModel.getBranch());
+ msg = getConnectionLabel(branchModel.getFirstTx(), txModel);
+ connect(ConnectionType.BRANCH_INTERNAL, getFigure(), branchFigure, txFigure, msg, false,
+ ColorConstants.black);
+ }
+ }
+ } else {
+ TxModel txModel = branchModel.getFirstTx();
+ if (txModel == null) {
+ OseeLog.log(BranchGraphActivator.class, Level.SEVERE, String.format(
+ "Branch did not have a starting tx [%s]", branchModel));
+ } else {
+ if (txModel.getSourceTx() != null) {
+ TxModel sourceTx = txModel.getSourceTx();
+ String msg = getConnectionLabel(sourceTx, txModel);
+
+ BranchFigure branchFigure = (BranchFigure) branchFigureMap.get(branchModel.getBranch());
+ if (sourceTx.getParentBranchModel().areTxsVisible()) {
+ TxFigure source = getTxFigure(sourceTx);
+ if (source != null) {
+ connect(ConnectionType.PARENT_CHILD, getFigure(), source, branchFigure, msg, true,
+ ColorConstants.lightBlue);
+ }
+ } else {
+ BranchFigure source =
+ (BranchFigure) branchFigureMap.get(sourceTx.getParentBranchModel().getBranch());
+ connect(ConnectionType.PARENT_CHILD, getFigure(), source, branchFigure, msg, true,
+ ColorConstants.lightBlue);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private Set<ConnectionType> getFilteredConnectionTypes() {
+ int connectLevel = preferenceStore.getInt(GraphOptions.FILTER_CONNECTIONS_PREFERENCE);
+ ConnectionFilter[] filters = ConnectionFilter.values();
+ ConnectionFilter filter = ConnectionFilter.NO_FILTER;
+ if (connectLevel < filters.length && connectLevel >= 0) {
+ filter = filters[connectLevel];
+ }
+ Set<ConnectionType> filtered = new HashSet<ConnectionType>();
+ switch (filter) {
+ case FILTER_CHILD_BRANCH_CONNECTIONS:
+ filtered.add(ConnectionType.PARENT_CHILD);
+ break;
+ case FILTER_MERGE_CONNECTIONS:
+ filtered.add(ConnectionType.MERGE);
+ break;
+ case FILTER_ALL_CONNECTIONS:
+ for (ConnectionType connectionType : ConnectionType.values()) {
+ if (connectionType != ConnectionType.BRANCH_INTERNAL) {
+ filtered.add(connectionType);
+ }
+ }
+ break;
+ case NO_FILTER:
+ default:
+ break;
+ }
+ return filtered;
+ }
+
+ public void setConnectionVisibility() {
+ Set<ConnectionType> filteredTypes = getFilteredConnectionTypes();
+ for (ConnectionType connectType : connectionMap.keySet()) {
+ Collection<Connection> connections = connectionMap.getValues(connectType);
+ if (connections != null) {
+ for (Connection connection : connections) {
+ boolean isVisible = false;
+ if (!filteredTypes.contains(connectType)) {
+ isVisible = true;
+ } else {
+ IFigure source = connection.getSourceAnchor().getOwner();
+ IFigure target = connection.getTargetAnchor().getOwner();
+ if (source instanceof TxFigure && ((TxFigure) source).isSelected()) {
+ isVisible = true;
+ } else if (target instanceof TxFigure && ((TxFigure) target).isSelected()) {
+ isVisible = true;
+ } else {
+ isVisible = false;
+ }
+ }
+ connection.setVisible(isVisible);
+ }
+ }
+ }
+ }
+
+ public void setTxVisibility() {
+ int filterSetting = preferenceStore.getInt(GraphOptions.TRANSACTION_FILTER);
+ boolean isVisible = TxFilter.NO_FILTER.ordinal() == filterSetting;
+ GraphCache graph = (GraphCache) getModel();
+ for (BranchModel model : graph.getBranchModels()) {
+ model.setTxsVisible(isVisible);
+ }
+ viewer.setContents(graph);
+ }
+
+ private void connect(ConnectionType connectType, IFigure contents, IFigure source, IFigure target, String toolTip, boolean hasEndPoint, Color color) {
+ PolylineConnection connection =
+ FigureFactory.createConnection(getFigure(), source, target, toolTip, hasEndPoint, color);
+ ConnectionMouseListener listener = new ConnectionMouseListener(connection);
+ connection.addMouseMotionListener(listener);
+ connection.addMouseListener(listener);
+ connection.setCursor(Cursors.HAND);
+ connectionMap.put(connectType, connection);
+ }
+
+ private void scrollTo(Rectangle fbounds) {
+ scrollTo(fbounds.x + fbounds.width / 2, fbounds.y + fbounds.height / 2);
+ }
+
+ private void scrollTo(int ax, int ay) {
+ Viewport viewport = ((FigureCanvas) viewer.getControl()).getViewport();
+ Rectangle vbounds = viewport.getBounds();
+ Point p = new Point(ax, ay);
+ // target.translateToAbsolute(p); // TODO
+ int x = p.x - vbounds.width / 2;
+ int y = p.y - vbounds.height / 2;
+ viewport.setHorizontalLocation(x);
+ viewport.setVerticalLocation(y);
+ }
+
+ private void scrollTo(IFigure target) {
+ scrollTo(target.getBounds());
+ }
+
+ private final class ConnectionMouseListener implements MouseMotionListener, MouseListener {
+
+ private PolylineConnection connection;
+
+ public ConnectionMouseListener(PolylineConnection connection) {
+ this.connection = connection;
+ }
+
+ public void mouseDragged(MouseEvent event) {
+ }
+
+ public void mouseEntered(MouseEvent event) {
+ }
+
+ public void mouseExited(MouseEvent event) {
+ connection.setLineWidth(1);
+ }
+
+ public void mouseHover(MouseEvent event) {
+ connection.setLineWidth(3);
+ }
+
+ public void mouseMoved(MouseEvent event) {
+ }
+
+ public void mouseDoubleClicked(MouseEvent event) {
+ }
+
+ public void mousePressed(MouseEvent event) {
+ TxFigure txFigure = (TxFigure) connection.getTargetAnchor().getOwner();
+ scrollTo(txFigure);
+ Map<?, ?> map = viewer.getEditPartRegistry();
+
+ TxModel txModel = txNumberToTxModelMap.get(txFigure.getTxNumber());
+ if (txModel != null) {
+ EditPart editPart = (EditPart) map.get(txModel);
+ if (editPart != null) {
+ viewer.select(editPart);
+ }
+ }
+ }
+
+ public void mouseReleased(MouseEvent event) {
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPartFactory.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPartFactory.java
new file mode 100644
index 00000000000..55eb4b1bd97
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphEditPartFactory.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.branch.graph.model.BranchModel;
+import org.eclipse.osee.framework.ui.branch.graph.model.GraphCache;
+import org.eclipse.osee.framework.ui.branch.graph.model.TxModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphEditPartFactory implements EditPartFactory {
+
+ private GraphicalViewer viewer;
+
+ public GraphEditPartFactory(GraphicalViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ public EditPart createEditPart(EditPart context, Object model) {
+ EditPart editPart = null;
+ if (model instanceof String) {
+ editPart = new LabelEditPart((String) model);
+ } else if (model instanceof GraphCache) {
+ editPart = new GraphEditPart(viewer);
+ } else if (model instanceof BranchModel) {
+ editPart = new BranchEditPart();
+ } else if (model instanceof Branch) {
+ editPart = new BranchDataEditPart();
+ } else if (model instanceof TxModel) {
+ editPart = new TxEditPart();
+ }
+ if (editPart == null) {
+ throw new RuntimeException(String.format("Error no EditPart defined for: [%s]", model.getClass().getName()));
+ } else {
+ editPart.setModel(model);
+ }
+ return editPart;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphXYLayoutEditPolicy.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphXYLayoutEditPolicy.java
new file mode 100644
index 00000000000..7036c2d0826
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/GraphXYLayoutEditPolicy.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphXYLayoutEditPolicy extends XYLayoutEditPolicy {
+
+ /*
+ * @see org.eclipse.gef.editpolicies.ConstrainedLayoutTEditPolicy#createChangeConstraintCommand(org.eclipse.gef.EditPart,
+ * java.lang.Object)
+ */
+ @Override
+ protected Command createChangeConstraintCommand(EditPart child, Object constraint) {
+ return null;
+ }
+
+ /*
+ * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#getCreateCommand(org.eclipse.gef.requests.CreateRequest)
+ */
+ @Override
+ protected Command getCreateCommand(CreateRequest request) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/LabelEditPart.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/LabelEditPart.java
new file mode 100644
index 00000000000..4c019387711
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/LabelEditPart.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LabelEditPart extends AbstractGraphicalEditPart {
+
+ private final String data;
+
+ public LabelEditPart(String data) {
+ this.data = data;
+ }
+
+ protected IFigure createFigure() {
+ return new Label(data);
+ }
+
+ protected void createEditPolicies() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/TxEditPart.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/TxEditPart.java
new file mode 100644
index 00000000000..6acd70d1f33
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/parts/TxEditPart.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.framework.ui.branch.graph.parts;
+
+import org.eclipse.draw2d.BorderLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.SelectionEditPolicy;
+import org.eclipse.osee.framework.ui.branch.graph.figure.TxFigure;
+import org.eclipse.osee.framework.ui.branch.graph.model.TxModel;
+import org.eclipse.osee.framework.ui.branch.graph.utility.GraphFigureConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TxEditPart extends AbstractGraphicalEditPart {
+
+ protected IFigure createFigure() {
+ IFigure figure = new Panel();
+ figure.setLayoutManager(new BorderLayout());
+
+ TxModel txModel = (TxModel) getModel();
+ GraphEditPart graphEditPart = (GraphEditPart) getParent().getParent();
+ TxFigure txFigure = graphEditPart.getTxFigure(txModel);
+
+ figure.add(txFigure, BorderLayout.CENTER);
+
+ Rectangle rect =
+ new Rectangle(GraphFigureConstants.TX_X_OFFSET + GraphFigureConstants.PLUS_MINUS_PADDING * 2,
+ 10 + GraphFigureConstants.BRANCH_HEIGHT + txModel.getIndex() * GraphFigureConstants.TX_Y_OFFSET,
+ GraphFigureConstants.TX_WIDTH, GraphFigureConstants.TX_HEIGHT);
+ ((AbstractGraphicalEditPart) getParent()).getFigure().getLayoutManager().setConstraint(txFigure, rect);
+
+ return txFigure;
+ }
+
+ protected void refreshVisuals() {
+ getFigure().setSize(GraphFigureConstants.TX_WIDTH, GraphFigureConstants.TX_HEIGHT);
+ TxModel txModel = (TxModel) getModel();
+ GraphEditPart graphEditPart = (GraphEditPart) getParent().getParent();
+ TxFigure txFigure = graphEditPart.getTxFigure(txModel);
+ txFigure.setSelected(getSelected() != SELECTED_NONE);
+ graphEditPart.setConnectionVisibility();
+ }
+
+ protected void createEditPolicies() {
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new SelectionEditPolicy() {
+ protected void hideSelection() {
+ refreshVisuals();
+ }
+
+ protected void showSelection() {
+ refreshVisuals();
+ }
+ });
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphColorConstants.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphColorConstants.java
new file mode 100644
index 00000000000..9b50f3b4137
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphColorConstants.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.framework.ui.branch.graph.utility;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.osee.framework.ui.branch.graph.model.BranchModel;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphColorConstants {
+
+ public static final Color FONT_COLOR = new Color(null, 1, 70, 122);
+ public static final Color BGCOLOR = new Color(null, 250, 250, 250);
+
+ private final static Color CURRENT_BRANCH = ColorConstants.orange;
+ private final static Color SYSTEM_ROOT_BRANCH = new Color(null, 255, 180, 220);
+ private final static Color TOP_LEVEL_BRANCH = new Color(null, 122, 224, 255);
+ private final static Color WORKING_BRANCH_COLOR = new Color(null, 244, 244, 244);
+
+ private final static Color BASELINE_BRANCH = new Color(null, 120, 255, 120);
+ private final static Color MERGE_BRANCH = new Color(null, 200, 200, 240);
+
+ private GraphColorConstants() {
+ }
+
+ public static Color getBranchColor(BranchModel branchModel) {
+ Color toReturn = ColorConstants.gray;
+ if (branchModel.isDefaultBranch()) {
+ toReturn = GraphColorConstants.CURRENT_BRANCH;
+ } else {
+ switch (branchModel.getBranch().getBranchType()) {
+ case BASELINE:
+ toReturn = GraphColorConstants.BASELINE_BRANCH;
+ break;
+ case MERGE:
+ toReturn = GraphColorConstants.MERGE_BRANCH;
+ break;
+ case SYSTEM_ROOT:
+ toReturn = GraphColorConstants.SYSTEM_ROOT_BRANCH;
+ break;
+ case TOP_LEVEL:
+ toReturn = GraphColorConstants.TOP_LEVEL_BRANCH;
+ break;
+ case WORKING:
+ toReturn = GraphColorConstants.WORKING_BRANCH_COLOR;
+ break;
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphFigureConstants.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphFigureConstants.java
new file mode 100644
index 00000000000..9a73dae0b00
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphFigureConstants.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.framework.ui.branch.graph.utility;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphFigureConstants {
+ public final static int GRAPH_MARGIN = 10;
+
+ public final static int BRANCH_WIDTH = 220;
+ public final static int BRANCH_HEIGHT = 30;
+ public final static int BRANCH_PADDING = 20;
+ public final static int BRANCH_X_OFFSET = BRANCH_WIDTH + BRANCH_PADDING;
+ public final static int BRANCH_Y_OFFSET = BRANCH_HEIGHT + BRANCH_PADDING;
+
+ public final static int TX_WIDTH = 50;
+ public final static int TX_HEIGHT = 30;
+ public final static int TX_PADDING = 20;
+
+ public final static int TX_X_OFFSET = (BRANCH_WIDTH - TX_WIDTH) / 2;
+ public final static int TX_Y_OFFSET = TX_HEIGHT + TX_PADDING;
+
+ public final static int NOTE_BORDER_WIDTH = 5;
+ public final static int PLUS_MINUS_PADDING = 5;
+
+ private GraphFigureConstants() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphImageConstants.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphImageConstants.java
new file mode 100644
index 00000000000..a933cbe8887
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphImageConstants.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.framework.ui.branch.graph.utility;
+
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphImageConstants {
+
+ private GraphImageConstants() {
+ }
+
+ public static Image getImage(Branch branch) {
+ Image image = null;
+ BranchType branchType = branch.getBranchType();
+ switch (branchType) {
+ case SYSTEM_ROOT:
+ image = ImageManager.getImage(FrameworkImage.BRANCH_SYSTEM_ROOT);
+ break;
+ case TOP_LEVEL:
+ image = ImageManager.getImage(FrameworkImage.BRANCH_TOP);
+ break;
+ case BASELINE:
+ image = ImageManager.getImage(FrameworkImage.BRANCH_BASELINE);
+ break;
+ case WORKING:
+ image = ImageManager.getImage(FrameworkImage.BRANCH_WORKING);
+ break;
+ case MERGE:
+ image = ImageManager.getImage(FrameworkImage.BRANCH_MERGE);
+ break;
+ }
+ return image;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphOptions.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphOptions.java
new file mode 100644
index 00000000000..3975a18a106
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphOptions.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.branch.graph.utility;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphOptions {
+
+ public final static String FILTER_CONNECTIONS_PREFERENCE = "revision.graph.filter.connections";
+ public final static String TRANSACTION_FILTER = "revision.graph.show.all.transactions";
+
+ public static enum ConnectionFilter {
+ NO_FILTER, FILTER_ALL_CONNECTIONS, FILTER_CHILD_BRANCH_CONNECTIONS, FILTER_MERGE_CONNECTIONS;
+ }
+
+ public static enum TxFilter {
+ NO_FILTER, HIDE_ALL;
+ }
+
+ private GraphOptions() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphTextFormat.java b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphTextFormat.java
new file mode 100644
index 00000000000..5c615e7acd7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.branch.graph/src/org/eclipse/osee/framework/ui/branch/graph/utility/GraphTextFormat.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.framework.ui.branch.graph.utility;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GraphTextFormat {
+
+ private static DateFormat dateFormat = null;
+
+ private GraphTextFormat() {
+ }
+
+ public static String formatDate(Date date) {
+ if (dateFormat == null) {
+ dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
+ }
+ return dateFormat.format(date);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/.classpath b/org.eclipse.osee.framework.ui.data.model.editor/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/.project b/org.eclipse.osee.framework.ui.data.model.editor/.project
new file mode 100644
index 00000000000..89888bebdac
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.data.model.editor</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.data.model.editor/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.data.model.editor/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..c865660e6cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu Feb 12 16:38:51 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.data.model.editor/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..33371650b45
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Osee Data Model Editor Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.data.model.editor;singleton:=true
+Bundle-Version: 0.6.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.gef,
+ org.eclipse.ui.views,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.forms,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.help,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.core.filesystem,
+ org.eclipse.osee.framework.plugin.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.xml,
+ org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/build.properties b/org.eclipse.osee.framework.ui.data.model.editor/build.properties
new file mode 100644
index 00000000000..d24f89bcf2b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ help/,\
+ images/
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/help/contexts.xml b/org.eclipse.osee.framework.ui.data.model.editor/help/contexts.xml
new file mode 100644
index 00000000000..91aa2c60807
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/help/contexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="oseeDataModelEditor" title="OSEE Data Model Editor">
+ <description>Create and modify OSEE Data Types</description>
+ <topic href="help/oseeDataModelEditor.html" label="OSEE Data Model Editor"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelc.png b/org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelc.png
new file mode 100644
index 00000000000..161e3aa313b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelc.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelr.png b/org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelr.png
new file mode 100644
index 00000000000..4726f8c43aa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/help/images/ngrelr.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/help/oseeDataModelEditor.html b/org.eclipse.osee.framework.ui.data.model.editor/help/oseeDataModelEditor.html
new file mode 100644
index 00000000000..4420b0802d1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/help/oseeDataModelEditor.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search View</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+<body>
+
+ <h1>OSEE Data Model Editor</h1>
+ <p>The test run view is used for viewing test run results. It can view a summary of output files that exist on a file system and it will upload those output files to the OSEE data store. It can also be used to view previous test runs that have been uploaded to the OSEE data store.
+ </p>
+
+ <li>Select <a class="command-link" href='javascript:executeCommand("org.eclipse.ui.views.showView(org.eclipse.ui.views.showView.viewId=org.eclipse.osee.framework.ui.skynet.QuickSearchView)")'>
+ <img src="artifact_search.gif" alt="search icon" border="0" />
+ <b>Window &gt; Show View &gt; Other... &gt; OSEE &gt; Quick Search</b></a>, to open the view.
+ </li>
+
+ <p><img border="0" src="images/ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="link.html">Link1</a><br/>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/help/toc.xml b/org.eclipse.osee.framework.ui.data.model.editor/help/toc.xml
new file mode 100644
index 00000000000..3d52291df87
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/help/toc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.osee.ote.core/help/toc.xml#tools" label="OSEE Data Model Editor">
+ <topic href="help/oseeDataModelEditor.html" label="OSEE Data Model Editor">
+ </topic>
+
+
+</toc>
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_attrib.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_attrib.gif
new file mode 100644
index 00000000000..c1f9af87e32
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_attrib.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_relat.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_relat.gif
new file mode 100644
index 00000000000..c6545d547c4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/access_restriction_relat.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/arrows.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/arrows.gif
new file mode 100644
index 00000000000..e1fd67f06ee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/arrows.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/datastore.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/datastore.gif
new file mode 100644
index 00000000000..0470e1588d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/datastore.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/extractsupertype_wiz.png b/org.eclipse.osee.framework.ui.data.model.editor/images/extractsupertype_wiz.png
new file mode 100644
index 00000000000..931797368c1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/extractsupertype_wiz.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/file.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/file.gif
new file mode 100644
index 00000000000..7ccc6a70317
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/file.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/geometry.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/geometry.gif
new file mode 100644
index 00000000000..4cc4d32ba40
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/geometry.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/geometry_disabled.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/geometry_disabled.gif
new file mode 100644
index 00000000000..509af72b7ec
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/geometry_disabled.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/hierarchy_co.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/hierarchy_co.gif
new file mode 100644
index 00000000000..45b6b132268
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/hierarchy_co.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/importsupertype_wiz.png b/org.eclipse.osee.framework.ui.data.model.editor/images/importsupertype_wiz.png
new file mode 100644
index 00000000000..4aa509f2fe9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/importsupertype_wiz.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/link.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/link.gif
new file mode 100644
index 00000000000..186a12726a5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/link.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/local_attribute.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/local_attribute.gif
new file mode 100644
index 00000000000..d4cb4254d92
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/local_attribute.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/one_way_reference.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/one_way_reference.gif
new file mode 100644
index 00000000000..88cdf2ad850
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/one_way_reference.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/operation.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/operation.gif
new file mode 100644
index 00000000000..5818a308849
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/operation.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/package_mode.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/package_mode.gif
new file mode 100644
index 00000000000..24fce6cb4bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/package_mode.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/two_way_reference.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/two_way_reference.gif
new file mode 100644
index 00000000000..fad54826195
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/two_way_reference.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/images/workflowConfig.gif b/org.eclipse.osee.framework.ui.data.model.editor/images/workflowConfig.gif
new file mode 100644
index 00000000000..8a945332071
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/images/workflowConfig.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/plugin.xml b/org.eclipse.osee.framework.ui.data.model.editor/plugin.xml
new file mode 100644
index 00000000000..7eb293f282b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/plugin.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.editors">
+ <editor
+ class="org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor"
+ contributorClass="org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditorActionBarContributor"
+ extensions="xml"
+ icon="images/workflowConfig.gif"
+ id="org.eclipse.osee.framework.ui.data.model.editor.ODMEditor"
+ name="OSEE Data Model Editor">
+ </editor>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.osee.framework.ui.data.model.editor.OpenODMEditor"
+ description="Opens the Osee Data Model Editor"
+ id="org.eclipse.osee.framework.ui.data.model.editor.command.ODMOpen"
+ name="Open Osee Data Model Editor">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="menu:org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.data.model.editor.command.ODMOpen"
+ icon="images/workflowConfig.gif"
+ style="push"
+ tooltip="Opens the Osee Data Model Editor">
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.data.model.editor.command.ODMOpen"
+ style="push">
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="help/contexts.xml">
+ </contexts>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorActivator.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorActivator.java
new file mode 100644
index 00000000000..466539bbab3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorActivator.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.framework.ui.data.model.editor;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditorActivator extends OseeUiActivator {
+
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.ui.data.model.editor";
+
+ private static ODMEditorActivator plugin;
+
+ public ODMEditorActivator() {
+ }
+
+ /*
+ * (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);
+ }
+
+ public static ODMEditorActivator getInstance() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorLauncher.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorLauncher.java
new file mode 100644
index 00000000000..b6ca744a2ea
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/ODMEditorLauncher.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.framework.ui.data.model.editor;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditorInput;
+import org.eclipse.ui.IEditorLauncher;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditorLauncher implements IEditorLauncher {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorLauncher#open(org.eclipse.core.runtime.IPath)
+ */
+ @Override
+ public void open(IPath file) {
+ try {
+ IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+ workbenchPage.openEditor(new ODMEditorInput(), ODMEditor.EDITOR_ID);
+ } catch (Exception ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.WARNING, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/OpenODMEditor.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/OpenODMEditor.java
new file mode 100644
index 00000000000..0cd5cf3cdbc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/OpenODMEditor.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.framework.ui.data.model.editor;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditorInput;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.AbstractSelectionChangedHandler;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenODMEditor extends AbstractSelectionChangedHandler {
+
+ public OpenODMEditor() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.
+ * ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart editorPart = null;
+ try {
+ editorPart =
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(new ODMEditorInput(),
+ ODMEditor.EDITOR_ID);
+ } catch (Exception ex) {
+ throw new ExecutionException("Error opening Branch Editor", ex);
+ }
+ return editorPart;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMExportAction.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMExportAction.java
new file mode 100644
index 00000000000..18b6ef48aba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMExportAction.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.framework.ui.data.model.editor.action;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.wizard.ODMExportWizard;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMExportAction extends Action {
+
+ private final ODMEditor editor;
+
+ public ODMExportAction(ODMEditor editor) {
+ super("Export");
+ this.editor = editor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.Action#getId()
+ */
+ @Override
+ public String getId() {
+ return ActionFactory.EXPORT.getId();
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ ODMExportWizard wizard = new ODMExportWizard(editor.getEditorInput().getDataTypeCache());
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard);
+ dialog.create();
+ dialog.open();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMImportAction.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMImportAction.java
new file mode 100644
index 00000000000..d1473e7ff7d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/action/ODMImportAction.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.framework.ui.data.model.editor.action;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.wizard.ODMImportWizard;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMImportAction extends Action {
+
+ private final ODMEditor editor;
+
+ public ODMImportAction(ODMEditor editor) {
+ super("Import");
+ this.editor = editor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.Action#getId()
+ */
+ @Override
+ public String getId() {
+ return ActionFactory.IMPORT.getId();
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ ODMImportWizard wizard = new ODMImportWizard(editor);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard);
+ dialog.create();
+ dialog.open();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeBoundsCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeBoundsCommand.java
new file mode 100644
index 00000000000..be697e9f5f0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeBoundsCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ChangeBoundsCommand extends Command {
+
+ private NodeModel node;
+ private Point newLocation, oldLocation;
+ private int newWidth, oldWidth;
+
+ public ChangeBoundsCommand(NodeModel node, Point newLocation, int newWidth) {
+ super("Change Bounds");
+ setNode(node);
+ setNewLocation(newLocation);
+ this.newWidth = newWidth;
+ }
+
+ public boolean canExecute() {
+ return node != null && newLocation != null && (newWidth == -1 || newWidth > 0);
+ }
+
+ public void execute() {
+ oldLocation = node.getLocation();
+ oldWidth = node.getWidth();
+ redo();
+ }
+
+ public void redo() {
+ node.setLocation(newLocation);
+ node.setWidth(newWidth);
+ }
+
+ public void setNode(NodeModel node) {
+ this.node = node;
+ }
+
+ public void setNewLocation(Point loc) {
+ newLocation = loc;
+ }
+
+ public void undo() {
+ node.setWidth(oldWidth);
+ node.setLocation(oldLocation);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNameCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNameCommand.java
new file mode 100644
index 00000000000..706d94ae1af
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNameCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ChangeNameCommand extends Command {
+
+ private DataType element;
+ private String newName, oldName;
+
+ public ChangeNameCommand(DataType dataType, String newName) {
+ super("Change Name");
+ element = dataType;
+ oldName = dataType.getName();
+ this.newName = newName.trim();
+ }
+
+ public boolean canExecute() {
+ return element != null;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ element.setName(newName);
+ }
+
+ public void undo() {
+ element.setName(oldName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNamespaceCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNamespaceCommand.java
new file mode 100644
index 00000000000..01f30590602
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ChangeNamespaceCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ChangeNamespaceCommand extends Command {
+
+ private DataType element;
+ private String newNamespace;
+ private String oldNamespace;
+
+ public ChangeNamespaceCommand(DataType dataType, String newNamespace) {
+ super("Change Namespace");
+ element = dataType;
+ oldNamespace = dataType.getNamespace();
+ this.newNamespace = newNamespace.trim();
+ }
+
+ public boolean canExecute() {
+ return element != null;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ element.setNamespace(newNamespace);
+ }
+
+ public void undo() {
+ element.setNamespace(oldNamespace);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateAttributeCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateAttributeCommand.java
new file mode 100644
index 00000000000..be0a2ceda0a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateAttributeCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CreateAttributeCommand extends Command {
+
+ private AttributeDataType attribute;
+ private ArtifactDataType parent;
+
+ public CreateAttributeCommand(AttributeDataType attribute, ArtifactDataType parent) {
+ super("Create Attribute");
+ this.attribute = attribute;
+ this.parent = parent;
+ }
+
+ public boolean canExecute() {
+ return attribute != null && parent != null;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ parent.add(attribute);
+ }
+
+ public void undo() {
+ parent.remove(attribute);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateBendpointCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateBendpointCommand.java
new file mode 100644
index 00000000000..2f3f776ec05
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateBendpointCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.draw2d.AbsoluteBendpoint;
+import org.eclipse.draw2d.Bendpoint;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CreateBendpointCommand extends Command {
+
+ private ConnectionModel link;
+ private Bendpoint point;
+ private int index = -1;
+
+ public CreateBendpointCommand(ConnectionModel link, Point location, int index) {
+ super("Create Bendpoint");
+ this.link = link;
+ point = new AbsoluteBendpoint(location);
+ }
+
+ public void undo() {
+ link.getBendpoints().remove(index);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateConnectionCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateConnectionCommand.java
new file mode 100644
index 00000000000..892086ce4d0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateConnectionCommand.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.framework.ui.data.model.editor.command;
+
+import java.util.logging.Level;
+import org.eclipse.draw2d.AbsoluteBendpoint;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.InheritanceLinkModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CreateConnectionCommand extends Command {
+
+ private ConnectionModel connectionModel;
+ private ArtifactDataType source;
+ private ArtifactDataType target;
+ private ArtifactDataType oldAncestor;
+
+ public CreateConnectionCommand(ConnectionModel connectionModel, ArtifactDataType source) {
+ super("Create connection");
+ this.connectionModel = connectionModel;
+ this.source = source;
+ this.oldAncestor = null;
+ }
+
+ public boolean canExecute() {
+ boolean result = source != null && target != null && connectionModel != null;
+ result = result && !source.getSuperTypes().contains(target);
+ return result;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void setTarget(ArtifactDataType target) {
+ this.target = target;
+ }
+
+ public void redo() {
+ try {
+ if (connectionModel instanceof InheritanceLinkModel) {
+
+ }
+ oldAncestor = source.getSuperType();
+ source.setSuperType(target);
+ if (source == target) {
+ connectionModel.getBendpoints().add(new AbsoluteBendpoint(source.getLocation().getTranslated(-10, 10)));
+ connectionModel.getBendpoints().add(new AbsoluteBendpoint(source.getLocation().getTranslated(-10, -10)));
+ connectionModel.getBendpoints().add(new AbsoluteBendpoint(source.getLocation().getTranslated(10, -10)));
+ }
+ connectionModel.setSource(source);
+ connectionModel.setTarget(target);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(ODMEditor.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void undo() {
+ try {
+ connectionModel.setSource(null);
+ connectionModel.setTarget(null);
+ if (source == target) {
+ connectionModel.getBendpoints().clear();
+ }
+ source.setSuperType(oldAncestor);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(ODMEditor.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateNodeCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateNodeCommand.java
new file mode 100644
index 00000000000..1397e2a1cf5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateNodeCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CreateNodeCommand extends Command {
+
+ private int width = -1;
+ private Point location;
+ private DataType node;
+ private ODMDiagram diagram;
+
+ public CreateNodeCommand(DataType newObject, ODMDiagram diagram, Point location) {
+ super("Create Node");
+ this.node = newObject;
+ this.diagram = diagram;
+ this.location = location;
+ }
+
+ public CreateNodeCommand(DataType newObject, ODMDiagram parent, Point location, int width) {
+ this(newObject, parent, location);
+ this.width = width;
+ }
+
+ public boolean canExecute() {
+ return node != null && diagram != null && location != null && (width == -1 || width > 0);
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ if (node instanceof ArtifactDataType) {
+ node.setLocation(location);
+ node.setWidth(width);
+ diagram.add(node);
+ }
+ // if (node instanceof StickyNote) ((StickyNote) node).setText("Comment");
+ }
+
+ public void undo() {
+ if (node instanceof ArtifactDataType) {
+ diagram.remove(node);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateRelationCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateRelationCommand.java
new file mode 100644
index 00000000000..f9122f3be25
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/CreateRelationCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CreateRelationCommand extends Command {
+
+ protected RelationDataType relation;
+ protected ArtifactDataType parent;
+
+ public CreateRelationCommand(RelationDataType relation, ArtifactDataType parent) {
+ super("Create Relation");
+ this.relation = relation;
+ this.parent = parent;
+ }
+
+ public boolean canExecute() {
+ return relation != null && parent != null;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ parent.add(relation);
+ }
+
+ public void undo() {
+ parent.remove(relation);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteBendpointCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteBendpointCommand.java
new file mode 100644
index 00000000000..f897295a0d4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteBendpointCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.draw2d.Bendpoint;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DeleteBendpointCommand extends Command {
+
+ private ConnectionModel link;
+ private Bendpoint bendpoint;
+ private int index;
+
+ public DeleteBendpointCommand(ConnectionModel link, int index) {
+ super("Delete Bendpoint");
+ this.link = link;
+ this.index = index;
+ bendpoint = (Bendpoint) link.getBendpoints().get(index);
+ }
+
+ public boolean canExecute() {
+ return index >= 0 && bendpoint != null && link != null;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ link.getBendpoints().remove(index);
+ }
+
+ public void undo() {
+ link.getBendpoints().add(index, bendpoint);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteCommand.java
new file mode 100644
index 00000000000..4ef9c464026
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/DeleteCommand.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.command;
+
+import java.util.logging.Level;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.InheritanceLinkModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationLinkModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DeleteCommand extends Command {
+
+ public static final Object DELETE_FROM_ODM_DIAGRAM = new Object();
+ private Command commandDelegate;
+
+ public DeleteCommand() {
+ super("Delete");
+ }
+
+ public boolean canExecute() {
+ return commandDelegate != null && commandDelegate.canExecute();
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public Command setPartToBeDeleted(Object toDelete, Object parent, boolean isDeleteFromDiagram) {
+ if (toDelete instanceof AttributeDataType) {
+ commandDelegate = new DeleteAttributeCommand(toDelete, parent);
+ } else if (toDelete instanceof RelationDataType) {
+ commandDelegate = new DeleteRelationCommand(toDelete, parent);
+ } else if (isDeleteFromDiagram && toDelete instanceof ArtifactDataType) {
+ commandDelegate = new DeleteArtifactCommand(toDelete, parent);
+ } else if (isDeleteFromDiagram && toDelete instanceof ConnectionModel) {
+ commandDelegate = new DeleteConnectionCommand(toDelete, parent);
+ } else {
+ commandDelegate = null;
+ }
+ return this;
+ }
+
+ public void redo() {
+ commandDelegate.execute();
+ }
+
+ public void undo() {
+ commandDelegate.undo();
+ }
+
+ private static class DeleteArtifactCommand extends Command {
+ private ArtifactDataType artifact;
+ private ODMDiagram container;
+
+ public DeleteArtifactCommand(Object model, Object parent) {
+ artifact = (ArtifactDataType) model;
+ container = (ODMDiagram) parent;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ if (container != null) {
+ container.remove(artifact);
+ }
+ }
+
+ public void undo() {
+ if (container != null) {
+ container.add(artifact);
+ }
+ }
+ }
+
+ private static class DeleteAttributeCommand extends Command {
+ private AttributeDataType attribute;
+ private ArtifactDataType container;
+
+ public DeleteAttributeCommand(Object model, Object parent) {
+ attribute = (AttributeDataType) model;
+ container = (ArtifactDataType) parent;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ if (container != null) {
+ container.remove(attribute);
+ }
+ }
+
+ public void undo() {
+ if (container != null) {
+ container.add(attribute);
+ }
+ }
+ }
+
+ private static class DeleteRelationCommand extends Command {
+ private RelationDataType relation;
+ private ArtifactDataType container;
+
+ public DeleteRelationCommand(Object model, Object parent) {
+ relation = (RelationDataType) model;
+ container = (ArtifactDataType) parent;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ if (container != null) {
+ container.remove(relation);
+ }
+ }
+
+ public void undo() {
+ if (container != null) {
+ container.add(relation);
+ }
+ }
+ }
+
+ private static class DeleteConnectionCommand extends Command {
+
+ private ConnectionModel link;
+ private NodeModel src, target;
+ private int srcIndex, targetIndex, superIndex, parentIndex;
+ private ArtifactDataType superClass, subClass;
+
+ public DeleteConnectionCommand(Object link, Object parent) {
+ super("Delete Connection");
+ this.link = (ConnectionModel) link;
+ src = this.link.getSource();
+ target = this.link.getTarget();
+ }
+
+ public boolean canExecute() {
+ return link != null && src != null && target != null;
+ }
+
+ public void execute() {
+ redo();
+ }
+
+ public void redo() {
+ boolean removeConnection = true;
+
+ if (link instanceof InheritanceLinkModel) {
+ superClass = (ArtifactDataType) src;
+ subClass = (ArtifactDataType) target;
+
+ try {
+ subClass.setSuperType(null);
+ } catch (OseeStateException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, String.format(
+ "Unable to remove inheritance link between [%s] - [%s]", superClass, subClass), ex);
+ removeConnection = false;
+ }
+ }
+
+ if (removeConnection) {
+ srcIndex = src.getSourceConnections().indexOf(link);
+ targetIndex = target.getTargetConnections().indexOf(link);
+ if (srcIndex != -1 && targetIndex != -1) {
+ src.getSourceConnections().remove(srcIndex);
+ target.getTargetConnections().remove(targetIndex);
+ }
+ }
+ // if (isHardDelete && link instanceof RelationLinkModel) {
+ // reference = ((ReferenceView) link).getEReference();
+ // parent = reference.getEContainingClass();
+ // parentIndex = parent.getEStructuralFeatures().indexOf(reference);
+ // if (parentIndex != -1) parent.getEStructuralFeatures().remove(parentIndex);
+ // }
+ }
+
+ public void undo() {
+ boolean addConnection = true;
+ if (link instanceof InheritanceLinkModel) {
+ try {
+ subClass.setSuperType(superClass);
+ } catch (OseeStateException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, String.format(
+ "Unable to add inheritance link between [%s] - [%s]", superClass, subClass), ex);
+ addConnection = false;
+ }
+ }
+
+ if (addConnection && srcIndex != -1 && targetIndex != -1) {
+ src.getSourceConnections().add(srcIndex, link);
+ target.getTargetConnections().add(targetIndex, link);
+ }
+
+ if (link instanceof RelationLinkModel) {
+ // if (parentIndex != -1) parent.getEStructuralFeatures().add(parentIndex, reference);
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/MoveBendpointCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/MoveBendpointCommand.java
new file mode 100644
index 00000000000..a7360925695
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/MoveBendpointCommand.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.framework.ui.data.model.editor.command;
+
+import org.eclipse.draw2d.AbsoluteBendpoint;
+import org.eclipse.draw2d.Bendpoint;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+
+/**
+ * @author Roberto E. Escobars
+ */
+public class MoveBendpointCommand extends Command {
+
+ private ConnectionModel connectionModel;
+ private int index;
+ private Bendpoint oldBendpoint, newBendpoint;
+
+ public MoveBendpointCommand(ConnectionModel connectionModel, Point location, int index) {
+ super("Move Bendpoint");
+ this.connectionModel = connectionModel;
+ this.index = index;
+ newBendpoint = new AbsoluteBendpoint(location);
+ oldBendpoint = (Bendpoint) connectionModel.getBendpoints().get(index);
+ }
+
+ public boolean canExecute() {
+ return connectionModel != null && index >= 0 && newBendpoint != null && oldBendpoint != null;
+ }
+
+ public void execute() {
+ connectionModel.getBendpoints().set(index, newBendpoint);
+ }
+
+ public void undo() {
+ connectionModel.getBendpoints().set(index, oldBendpoint);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ReconnectConnectionCommand.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ReconnectConnectionCommand.java
new file mode 100644
index 00000000000..1a7a723599c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/command/ReconnectConnectionCommand.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.command;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReconnectConnectionCommand extends Command {
+
+ private ConnectionModel<ArtifactDataType> connectionModel;
+ // private NodeModel newNode, oldNode;
+ // private int oldIndex, viewIndex;
+
+ private ArtifactDataType oldSource;
+ private ArtifactDataType oldTarget;
+ private ArtifactDataType newSource;
+ private ArtifactDataType newTarget;
+
+ public ReconnectConnectionCommand(ConnectionModel<ArtifactDataType> connectionModel) {
+ super("Reconnect connection");
+ this.connectionModel = connectionModel;
+ this.oldSource = connectionModel.getSource();
+ this.oldTarget = connectionModel.getTarget();
+ }
+
+ public void setNewSource(ArtifactDataType source) {
+ if (source == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("move connection startpoint");
+ newSource = source;
+ newTarget = null;
+ }
+
+ public void setNewTarget(ArtifactDataType target) {
+ if (target == null) {
+ throw new IllegalArgumentException();
+ }
+ setLabel("move connection endpoint");
+ newSource = null;
+ newTarget = target;
+ }
+
+ public boolean canExecute() {
+ if (newSource != null) {
+ return checkSourceReconnection();
+ } else if (newTarget != null) {
+ return checkTargetReconnection();
+ }
+ return false;
+ }
+
+ private boolean checkSourceReconnection() {
+ if (newSource.equals(oldTarget)) {
+ return false;
+ }
+ // if (newSource != null) {
+ for (ConnectionModel<ArtifactDataType> connection : newSource.getTargetConnections()) {
+ // return false if a newSource -> oldTarget connection exists already
+ // and it is a different instance than the connection-field
+ if (connection.getTarget().equals(oldTarget) && !this.connectionModel.equals(connection)) {
+ return false;
+ }
+ }
+ // } else {
+ // return false;
+ // }
+ return true;
+ }
+
+ private boolean checkTargetReconnection() {
+ if (newTarget.equals(oldSource)) {
+ return false;
+ }
+ // return false, if the connection exists already
+ // if (newTarget != null) {
+ for (ConnectionModel<ArtifactDataType> connection : newTarget.getSourceConnections()) {
+ // return false if a oldSource -> newTarget connection exists already
+ // and it is a different instance that the connection-field
+ if (connection.getSource().equals(oldSource) && !this.connectionModel.equals(connection)) {
+ return false;
+ }
+ }
+ // } else {
+ // return false;
+ // }
+ return true;
+ }
+
+ public void execute() {
+ if (newSource != null) {
+ this.connectionModel.reconnect(newSource, oldTarget);
+ } else if (newTarget != null) {
+ this.connectionModel.reconnect(oldSource, newTarget);
+ } else {
+ throw new IllegalStateException("Should not happen");
+ }
+ }
+
+ public void undo() {
+ this.connectionModel.reconnect(oldSource, oldTarget);
+ }
+ // public void execute() {
+ // superClass = (ArtifactDataType) connectionModel.getTarget();
+ // oldClass = (ArtifactDataType) connectionModel.getSource();
+ //
+ // newClass = (ArtifactDataType) newNode;
+ //
+ // if (isSource) {
+ // ancestor = newClass.getAncestorType();
+ // newClass.setParent(superClass);
+ // } else {
+ // ancestor = oldClass.getAncestorType();
+ // oldClass.setParent(newClass);
+ // }
+ //
+ // if (isSource) {
+ // oldNode = connectionModel.getSource();
+ // viewIndex = oldNode.getOutgoingConnections().indexOf(connectionModel);
+ // connectionModel.setSource((ArtifactDataType) newNode);
+ // } else {
+ // oldNode = connectionModel.getTarget();
+ // viewIndex = oldNode.getIncomingConnections().indexOf(connectionModel);
+ // connectionModel.setTarget((ArtifactDataType) newNode);
+ // }
+ //
+ // // Reference
+ // // if (link instanceof ReferenceView) {
+ // // ref = ((ReferenceView) link).getEReference();
+ // // oldClass = (ArtifactDataType) ((NamedElementView) oldNode).getDataTypeElement();
+ // // newClass = (ArtifactDataType) ((NamedElementView) newNode).getDataTypeElement();
+ // // if (isSource) {
+ // // oldIndex = oldClass.getEStructuralFeatures().indexOf(ref);
+ // // oldClass.getEStructuralFeatures().remove(oldIndex);
+ // // newClass.getEStructuralFeatures().add(ref);
+ // // } else {
+ // // ref.setEType(newClass);
+ // // }
+ // // }
+ // }
+
+ // public void undo() {
+ // // if (link instanceof ReferenceView) {
+ // // if (isSource) {
+ // // newClass.getEStructuralFeatures().remove(ref);
+ // // oldClass.getEStructuralFeatures().add(oldIndex, ref);
+ // // } else
+ // // ref.setEType(oldClass);
+ // // }
+ // if (isSource) {
+ // newNode.getOutgoingConnections().remove(connectionModel);
+ // oldNode.getOutgoingConnections().add(viewIndex, connectionModel);
+ // } else {
+ // newNode.getIncomingConnections().remove(connectionModel);
+ // oldNode.getIncomingConnections().add(viewIndex, connectionModel);
+ // }
+ // oldNode = null;
+ //
+ // if (isSource) {
+ // newClass.setParent(ancestor);
+ // } else {
+ // oldClass.setParent(ancestor);
+ // }
+ // }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditor.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditor.java
new file mode 100644
index 00000000000..f3a7717fbcd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditor.java
@@ -0,0 +1,288 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.core;
+
+import java.util.Arrays;
+import java.util.EventObject;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.DefaultEditDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.gef.KeyStroke;
+import org.eclipse.gef.MouseWheelHandler;
+import org.eclipse.gef.MouseWheelZoomHandler;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.RootEditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
+import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
+import org.eclipse.gef.editparts.ZoomManager;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.requests.GroupRequest;
+import org.eclipse.gef.ui.actions.ActionRegistry;
+import org.eclipse.gef.ui.actions.GEFActionConstants;
+import org.eclipse.gef.ui.actions.ToggleSnapToGeometryAction;
+import org.eclipse.gef.ui.actions.ZoomInAction;
+import org.eclipse.gef.ui.actions.ZoomOutAction;
+import org.eclipse.gef.ui.palette.PaletteCustomizer;
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.gef.ui.palette.PaletteViewerProvider;
+import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
+import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.action.ODMExportAction;
+import org.eclipse.osee.framework.ui.data.model.editor.action.ODMImportAction;
+import org.eclipse.osee.framework.ui.data.model.editor.command.DeleteCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.operation.ODMLoadGraphRunnable;
+import org.eclipse.osee.framework.ui.data.model.editor.part.ODMEditPartFactory;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditor extends GraphicalEditorWithFlyoutPalette {
+
+ public static String EDITOR_ID = "org.eclipse.osee.framework.ui.data.model.editor.ODMEditor";
+
+ private ODMPaletteFactory editorPalette;
+ private ActionRegistry actionRegistry;
+ private ODMOutlinePage overviewOutlinePage;
+ private KeyHandler shareKeyHandler;
+
+ public ODMEditor() {
+ super();
+ setEditDomain(new DefaultEditDomain(this));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
+ */
+ @Override
+ protected PaletteRoot getPaletteRoot() {
+ if (editorPalette == null) {
+ editorPalette = new ODMPaletteFactory(this);
+ }
+ return editorPalette.getPaletteRoot();
+ }
+
+ public void updatePalette() {
+ editorPalette.updatePaletteRoot();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditor#isSaveAsAllowed()
+ */
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == GraphicalViewer.class || adapter == EditPartViewer.class) {
+ return getGraphicalViewer();
+ } else if (adapter == ZoomManager.class) {
+ return ((ScalableFreeformRootEditPart) getGraphicalViewer().getRootEditPart()).getZoomManager();
+ } else if (adapter == IContentOutlinePage.class) {
+ return getOverviewOutlinePage();
+ } else if (adapter == IActionable.class) {
+ return new IActionable() {
+ @Override
+ public String getActionDescription() {
+ return "ODM Editor description here";
+ }
+ };
+ }
+ return super.getAdapter(adapter);
+ }
+
+ @Override
+ protected void configureGraphicalViewer() {
+ super.configureGraphicalViewer();
+
+ GraphicalViewer viewer = getGraphicalViewer();
+ viewer.setRootEditPart(new ScalableFreeformRootEditPart());
+ viewer.setEditPartFactory(new ODMEditPartFactory());
+
+ getSite().setSelectionProvider(viewer);
+
+ viewer.setContents("Loading graph... This can take several minutes");
+
+ ContextMenuProvider cmProvider = new ODMEditorContextMenuProvider(viewer, this);
+ viewer.setContextMenu(cmProvider);
+
+ IEditorInput input = getEditorInput();
+ if (input instanceof ODMEditorInput) {
+ ODMEditorInput editorInput = (ODMEditorInput) input;
+ showGraphFor(editorInput);
+ }
+
+ ZoomManager zoomManager = ((ScalableFreeformRootEditPart) viewer.getRootEditPart()).getZoomManager();
+ IAction zoomIn = new ZoomInAction(zoomManager);
+ IAction zoomOut = new ZoomOutAction(zoomManager);
+ getActionRegistry().registerAction(zoomIn);
+ getActionRegistry().registerAction(zoomOut);
+ getActionRegistry().registerAction(new ToggleSnapToGeometryAction(viewer));
+
+ viewer.setKeyHandler(getCommonKeyHandler());
+
+ // Scroll-wheel Zoom
+ viewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD1), MouseWheelZoomHandler.SINGLETON);
+
+ // keyboard
+ getSite().getKeyBindingService().registerAction(zoomIn); // deprecated
+ getSite().getKeyBindingService().registerAction(zoomOut); // deprecated
+ List<String> zoomContributions =
+ Arrays.asList(new String[] {ZoomManager.FIT_ALL, ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH});
+ zoomManager.setZoomLevelContributions(zoomContributions);
+
+ // viewer.addDropTargetListener((TransferDropTargetListener) new DiagramDropTargetListener(viewer));
+ viewer.addDropTargetListener((TransferDropTargetListener) new ODMPaletteDropListener(viewer));
+ }
+
+ private KeyHandler getCommonKeyHandler() {
+ if (shareKeyHandler == null) {
+ shareKeyHandler = new GraphicalViewerKeyHandler(getViewer()) {
+ @SuppressWarnings("unchecked")
+ public boolean keyPressed(KeyEvent event) {
+ if (event.keyCode == SWT.DEL) {
+ List objects = getGraphicalViewer().getSelectedEditParts();
+ if (objects == null || objects.isEmpty()) {
+ return true;
+ }
+ GroupRequest deleteReq = new GroupRequest(RequestConstants.REQ_DELETE);
+ deleteReq.getExtendedData().put(DeleteCommand.DELETE_FROM_ODM_DIAGRAM, Boolean.TRUE);
+ CompoundCommand compoundCmd = new CompoundCommand("Delete");
+ for (int i = 0; i < objects.size(); i++) {
+ EditPart object = (EditPart) objects.get(i);
+ Command cmd = object.getCommand(deleteReq);
+ if (cmd != null) {
+ compoundCmd.add(cmd);
+ }
+ }
+ getCommandStack().execute(compoundCmd);
+ return true;
+ }
+ return super.keyPressed(event);
+ }
+ };
+ shareKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0), getActionRegistry().getAction(
+ GEFActionConstants.DIRECT_EDIT));
+ }
+ return shareKeyHandler;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#initializeGraphicalViewer()
+ */
+ @Override
+ protected void initializeGraphicalViewer() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditor#commandStackChanged(java.util.EventObject)
+ */
+ @Override
+ public void commandStackChanged(EventObject event) {
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+ super.commandStackChanged(event);
+ }
+
+ private ODMOutlinePage getOverviewOutlinePage() {
+ if (null == overviewOutlinePage && null != getGraphicalViewer()) {
+ RootEditPart rootEditPart = getGraphicalViewer().getRootEditPart();
+ if (rootEditPart instanceof ScalableFreeformRootEditPart) {
+ overviewOutlinePage = new ODMOutlinePage((ScalableFreeformRootEditPart) rootEditPart, getActionRegistry());
+ }
+ }
+ return overviewOutlinePage;
+ }
+
+ public ActionRegistry getActionRegistry() {
+ if (actionRegistry == null) {
+ actionRegistry = new ActionRegistry();
+ actionRegistry.registerAction(new ODMImportAction(this));
+ actionRegistry.registerAction(new ODMExportAction(this));
+ }
+ return actionRegistry;
+ }
+
+ public GraphicalViewer getViewer() {
+ return getGraphicalViewer();
+ }
+
+ public void showGraphFor(ODMEditorInput editorInput) {
+ setPartName(editorInput.getName() + " graph");
+ ODMLoadGraphRunnable runnable = new ODMLoadGraphRunnable(getGraphicalViewer(), this, editorInput);
+ Jobs.runInJob(runnable.getName(), runnable, ODMEditorActivator.class, ODMEditorActivator.PLUGIN_ID, true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
+ */
+ @Override
+ protected PaletteViewerProvider createPaletteViewerProvider() {
+ return new PaletteViewerProvider(getEditDomain()) {
+ protected void configurePaletteViewer(PaletteViewer viewer) {
+ super.configurePaletteViewer(viewer);
+ viewer.setCustomizer(new PaletteCustomizer() {
+ public void revertToSaved() {
+ }
+
+ public void save() {
+ }
+ });
+ viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#getEditorInput()
+ */
+ @Override
+ public ODMEditorInput getEditorInput() {
+ return (ODMEditorInput) super.getEditorInput();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorActionBarContributor.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorActionBarContributor.java
new file mode 100644
index 00000000000..de23d50d5cc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorActionBarContributor.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.core;
+
+import org.eclipse.gef.ui.actions.ActionBarContributor;
+import org.eclipse.gef.ui.actions.DeleteRetargetAction;
+import org.eclipse.gef.ui.actions.GEFActionConstants;
+import org.eclipse.gef.ui.actions.RedoRetargetAction;
+import org.eclipse.gef.ui.actions.UndoRetargetAction;
+import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
+import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
+import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.RetargetAction;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditorActionBarContributor extends ActionBarContributor {
+
+ /**
+ * Create actions managed by this contributor.
+ *
+ * @see org.eclipse.gef.ui.actions.ActionBarContributor#buildActions()
+ */
+ @Override
+ protected void buildActions() {
+ addRetargetAction(new UndoRetargetAction());
+ addRetargetAction(new RedoRetargetAction());
+ addRetargetAction(new DeleteRetargetAction());
+ addRetargetAction(new ZoomInRetargetAction());
+ addRetargetAction(new ZoomOutRetargetAction());
+ RetargetAction action =
+ new RetargetAction(GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY, null, IAction.AS_CHECK_BOX);
+ action.setImageDescriptor(ODMImages.getImageDescriptor(ODMImages.SNAP_TO_GRID));
+ action.setDisabledImageDescriptor(ODMImages.getImageDescriptor(ODMImages.SNAP_TO_GRID_DISABLED));
+ action.setToolTipText("Enable Snap To Geometry");
+ addRetargetAction(action);
+ }
+
+ /**
+ * Add actions to the given toolbar.
+ *
+ * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
+ */
+ @Override
+ public void contributeToToolBar(IToolBarManager toolBarManager) {
+ super.contributeToToolBar(toolBarManager);
+ toolBarManager.add(new Separator());
+ toolBarManager.add(new ZoomComboContributionItem(getPage()));
+ toolBarManager.add(getAction(ActionFactory.UNDO.getId()));
+ toolBarManager.add(getAction(ActionFactory.REDO.getId()));
+ toolBarManager.add(getAction(GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY));
+ // toolBarManager.add(getAction(ActionFactory.REFRESH.getId()));
+ toolBarManager.add(new Separator());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.ui.actions.ActionBarContributor#declareGlobalActionKeys()
+ */
+ @Override
+ protected void declareGlobalActionKeys() {
+ addGlobalActionKey(ActionFactory.PRINT.getId());
+ addGlobalActionKey(ActionFactory.SELECT_ALL.getId());
+ addGlobalActionKey(ActionFactory.DELETE.getId());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorContextMenuProvider.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorContextMenuProvider.java
new file mode 100644
index 00000000000..e9287e48413
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorContextMenuProvider.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.framework.ui.data.model.editor.core;
+
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.ui.actions.GEFActionConstants;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.ui.actions.ActionFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditorContextMenuProvider extends ContextMenuProvider {
+
+ private final ODMEditor editor;
+
+ public ODMEditorContextMenuProvider(EditPartViewer viewer, ODMEditor editor) {
+ super(viewer);
+ this.editor = editor;
+ }
+
+ @Override
+ public void buildContextMenu(IMenuManager menu) {
+ GEFActionConstants.addStandardActionGroups(menu);
+
+ // menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction(EditAction.ID));
+ menu.appendToGroup(GEFActionConstants.GROUP_UNDO, getAction(ActionFactory.UNDO.getId()));
+ menu.appendToGroup(GEFActionConstants.GROUP_UNDO, getAction(ActionFactory.REDO.getId()));
+ menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction(ActionFactory.DELETE.getId()));
+ menu.appendToGroup(GEFActionConstants.GROUP_PRINT, getAction(ActionFactory.PRINT.getId()));
+ menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction(ActionFactory.IMPORT.getId()));
+ menu.appendToGroup(GEFActionConstants.GROUP_EDIT, getAction(ActionFactory.EXPORT.getId()));
+ }
+
+ private IAction getAction(String actionId) {
+ return editor.getActionRegistry().getAction(actionId);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorInput.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorInput.java
new file mode 100644
index 00000000000..d722d4fd3c5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMEditorInput.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.framework.ui.data.model.editor.core;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditorInput implements IEditorInput {
+
+ private DataTypeCache dataTypeCache;
+ private IResource resource;
+
+ public ODMEditorInput() {
+ dataTypeCache = new DataTypeCache();
+ }
+
+ public ODMEditorInput(IResource resource) {
+ this.resource = resource;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ODMEditorInput) {
+ ODMEditorInput otherEdInput = (ODMEditorInput) obj;
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ public String getName() {
+ return "No Data Types Provided";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public DataTypeCache getDataTypeCache() {
+ return dataTypeCache;
+ }
+
+ public IResource getResource() {
+ return resource;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMOutlinePage.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMOutlinePage.java
new file mode 100644
index 00000000000..8fd7f1dfc19
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMOutlinePage.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.core;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.parts.ScrollableThumbnail;
+import org.eclipse.draw2d.parts.Thumbnail;
+import org.eclipse.gef.EditDomain;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
+import org.eclipse.gef.ui.actions.ActionRegistry;
+import org.eclipse.gef.ui.parts.TreeViewer;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.ui.data.model.editor.outline.OutlineTreePartFactory;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMOutlinePage extends Page implements IContentOutlinePage {
+
+ private Composite composite;
+ private Canvas overview;
+ private ScalableFreeformRootEditPart rootEditPart;
+ private Thumbnail thumbnail;
+ private TreeViewer viewer;
+ private ActionRegistry registry;
+
+ public ODMOutlinePage(ScalableFreeformRootEditPart rootEditPart, ActionRegistry registry) {
+ super();
+ this.rootEditPart = rootEditPart;
+ this.registry = registry;
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+
+ }
+
+ public void createControl(Composite parent) {
+ composite = new SashForm(parent, SWT.BORDER);
+ composite.setLayout(new FillLayout(SWT.VERTICAL));
+
+ SashForm sash = (SashForm) composite;
+ sash.setOrientation(SWT.VERTICAL);
+
+ overview = new Canvas(composite, SWT.BORDER);
+ overview.setBackground(ColorConstants.white);
+ overview.setLayout(new FillLayout(SWT.VERTICAL));
+
+ thumbnail = new ScrollableThumbnail((Viewport) rootEditPart.getFigure());
+ thumbnail.setBorder(new MarginBorder(3));
+ thumbnail.setSource(rootEditPart.getLayer(LayerConstants.PRINTABLE_LAYERS));
+
+ LightweightSystem lws = new LightweightSystem(overview);
+ lws.setContents(thumbnail);
+
+ Group panel = new Group(composite, SWT.NONE);
+ panel.setLayout(new GridLayout());
+ panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ panel.setText("Hierarchy");
+
+ viewer = new TreeViewer();
+ viewer.createControl(panel);
+ viewer.setEditDomain(new EditDomain());
+ viewer.setEditPartFactory(new OutlineTreePartFactory());
+ // viewer.setContents);
+ // viewer.addDragSourceListener(new OutlineDragSourceListener(viewer));
+ sash.setWeights(new int[] {2, 8});
+ }
+
+ public void setContents(Object contents) {
+ viewer.setContents(contents);
+ }
+
+ public void dispose() {
+ if (null != thumbnail) {
+ thumbnail.deactivate();
+ }
+ super.dispose();
+ }
+
+ public Control getControl() {
+ return overview;
+ }
+
+ public ISelection getSelection() {
+ return StructuredSelection.EMPTY;
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+
+ }
+
+ public void setFocus() {
+ if (getControl() != null) {
+ getControl().setFocus();
+ }
+ }
+
+ public void setSelection(ISelection selection) {
+ }
+
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+
+ IActionBars bars = pageSite.getActionBars();
+ String id = ActionFactory.UNDO.getId();
+ bars.setGlobalActionHandler(id, registry.getAction(id));
+ id = ActionFactory.REDO.getId();
+ bars.setGlobalActionHandler(id, registry.getAction(id));
+ bars.updateActionBars();
+
+ IToolBarManager manager = bars.getToolBarManager();
+ ImageDescriptor img = ODMImages.getImageDescriptor(ODMImages.EXPAND_ALL);
+ IAction action = new Action("Expand All", img) {
+ public void run() {
+ expand(((Tree) viewer.getControl()).getItems());
+ }
+
+ private void expand(TreeItem[] items) {
+ for (int i = 0; i < items.length; i++) {
+ expand(items[i].getItems());
+ items[i].setExpanded(true);
+ }
+ }
+ };
+ action.setToolTipText("Expand All");
+ manager.add(action);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteDropListener.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteDropListener.java
new file mode 100644
index 00000000000..c6977c9ba1b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteDropListener.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.framework.ui.data.model.editor.core;
+
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
+import org.eclipse.gef.requests.CreationFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMPaletteDropListener extends TemplateTransferDropTargetListener {
+
+ public ODMPaletteDropListener(EditPartViewer viewer) {
+ super(viewer);
+ }
+
+ protected CreationFactory getFactory(Object template) {
+ return (CreationFactory) template;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteFactory.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteFactory.java
new file mode 100644
index 00000000000..75e43243014
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/core/ODMPaletteFactory.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.framework.ui.data.model.editor.core;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
+import org.eclipse.gef.palette.ConnectionCreationToolEntry;
+import org.eclipse.gef.palette.MarqueeToolEntry;
+import org.eclipse.gef.palette.PaletteContainer;
+import org.eclipse.gef.palette.PaletteDrawer;
+import org.eclipse.gef.palette.PaletteEntry;
+import org.eclipse.gef.palette.PaletteRoot;
+import org.eclipse.gef.palette.PaletteSeparator;
+import org.eclipse.gef.palette.PaletteToolbar;
+import org.eclipse.gef.palette.PanningSelectionToolEntry;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.gef.requests.CreationFactory;
+import org.eclipse.gef.requests.SimpleFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+import org.eclipse.osee.framework.ui.data.model.editor.model.InheritanceLinkModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMPaletteFactory {
+
+ private final static String DATA_TYPE_TIP_FORMAT = "Add [%s] %s type to %s";
+ private ODMEditor editor;
+ private PaletteRoot paletteRoot;
+
+ private enum DrawerEnum {
+ Artifact_Types, Attribute_Types, Relation_Types;
+
+ public String asLabel() {
+ return this.name().replaceAll("_", " ");
+ }
+ }
+
+ private Map<DrawerEnum, PaletteContainer> containers;
+
+ public ODMPaletteFactory(ODMEditor editor) {
+ this.containers = new LinkedHashMap<DrawerEnum, PaletteContainer>();
+ this.editor = editor;
+ }
+
+ private void updateDrawers() {
+ if (editor.getEditorInput() == null) {
+ return;
+ }
+ DataTypeCache dataTypeCache = editor.getEditorInput().getDataTypeCache();
+
+ for (DrawerEnum drawerType : DrawerEnum.values()) {
+ PaletteContainer container = containers.get(drawerType);
+ if (container == null) {
+ container = new PaletteDrawer(drawerType.asLabel());
+ containers.put(drawerType, container);
+ getPaletteRoot().add(container);
+ } else {
+ for (Object child : container.getChildren()) {
+ container.remove((PaletteEntry) child);
+ }
+ }
+ container.addAll(getToolEntries(drawerType, dataTypeCache));
+ }
+ }
+
+ private List<CombinedTemplateCreationEntry> getToolEntries(DrawerEnum drawerType, DataTypeCache dataTypeCache) {
+ List<CombinedTemplateCreationEntry> toReturn = new ArrayList<CombinedTemplateCreationEntry>();
+ ImageDescriptor image = null;
+ String message = null;
+ for (String sourceId : dataTypeCache.getDataTypeSourceIds()) {
+ DataTypeSource dataTypeSource = dataTypeCache.getDataTypeSourceById(sourceId);
+ switch (drawerType) {
+ case Artifact_Types:
+ for (ArtifactDataType dataType : dataTypeSource.getArtifactTypeManager().getAllSorted()) {
+ image = ImageDescriptor.createFromImage(dataType.getImage());
+ message = String.format(DATA_TYPE_TIP_FORMAT, dataType.getName(), "artifact", "the diagram");
+ toReturn.add(createDataTypeToolEntry(dataType, image, message));
+ }
+ break;
+ case Attribute_Types:
+ image = ODMImages.getImageDescriptor(ODMImages.LOCAL_ATTRIBUTE);
+ for (AttributeDataType dataType : dataTypeSource.getAttributeTypeManager().getAllSorted()) {
+ message = String.format(DATA_TYPE_TIP_FORMAT, dataType.getName(), "attribute", "an artifact type");
+ toReturn.add(createDataTypeToolEntry(dataType, image, message));
+ }
+ break;
+ case Relation_Types:
+ image = ODMImages.getImageDescriptor(ODMImages.LOCAL_RELATION);
+ for (RelationDataType dataType : dataTypeSource.getRelationTypeManager().getAllSorted()) {
+ message = String.format(DATA_TYPE_TIP_FORMAT, dataType.getName(), "relation", "an artifact type");
+ toReturn.add(createDataTypeToolEntry(dataType, image, message));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return toReturn;
+ }
+
+ private CombinedTemplateCreationEntry createDataTypeToolEntry(final DataType dataType, ImageDescriptor imageDescriptor, String message) {
+ CreationFactory factory = new CreationFactory() {
+
+ @Override
+ public Object getNewObject() {
+ return dataType;
+ }
+
+ @Override
+ public Object getObjectType() {
+ return null;
+ }
+
+ };
+ return new CombinedTemplateCreationEntry(dataType.getName(), message, factory, factory, imageDescriptor,
+ imageDescriptor);
+ }
+
+ private PaletteContainer createToolsGroup(PaletteRoot palette) {
+ PaletteToolbar toolbar = new PaletteToolbar("Tools");
+
+ ToolEntry tool = new PanningSelectionToolEntry();
+ toolbar.add(tool);
+ palette.setDefaultEntry(tool);
+
+ toolbar.add(new MarqueeToolEntry());
+ toolbar.add(new PaletteSeparator());
+
+ ImageDescriptor img = ODMImages.getImageDescriptor(ODMImages.INHERITANCE);
+ toolbar.add(new ConnectionCreationToolEntry("Inheritance", "Inherit from an artifact", new SimpleFactory(
+ InheritanceLinkModel.class), img, img));
+
+ // final Action action =
+ // OseeAts.createBugAction(ODMEditorActivator.getInstance(), editor, "OSEE Data Model Editor",
+ // ODMEditor.EDITOR_ID);
+ // img = action.getImageDescriptor();
+ //
+ // toolbar.add(new ToolEntry("", action.getText(), img, img, null) {
+ //
+ // /* (non-Javadoc)
+ // * @see org.eclipse.gef.palette.ToolEntry#createTool()
+ // */
+ // @Override
+ // public Tool createTool() {
+ // return new AbstractTool() {
+ //
+ // @Override
+ // protected String getCommandName() {
+ // return action.getText();
+ // }
+ //
+ // /* (non-Javadoc)
+ // * @see org.eclipse.gef.tools.AbstractTool#activate()
+ // */
+ // @Override
+ // public void activate() {
+ // super.activate();
+ // Display.getDefault().asyncExec(new Runnable() {
+ // public void run() {
+ // deactivate();
+ // action.run();
+ // }
+ // });
+ //
+ // }
+ // };
+ // }
+ //
+ // });
+ return toolbar;
+ }
+
+ public void updatePaletteRoot() {
+ updateDrawers();
+ }
+
+ public PaletteRoot getPaletteRoot() {
+ if (paletteRoot == null) {
+ paletteRoot = new PaletteRoot();
+ paletteRoot.add(createToolsGroup(paletteRoot));
+ updateDrawers();
+ }
+ return paletteRoot;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/ArtifactTypeFigure.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/ArtifactTypeFigure.java
new file mode 100644
index 00000000000..6c9c2f5c9e0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/ArtifactTypeFigure.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.framework.ui.data.model.editor.figure;
+
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactTypeFigure extends RoundedRectangle {
+
+ private DataTypeFigure header;
+ private IFigure body;
+
+ public ArtifactTypeFigure(IFigure namespaceFigure, IFigure nameFigure) {
+ setOpaque(true);
+ ToolbarLayout layout = new ToolbarLayout();
+ layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+ setLayoutManager(layout);
+
+ // setBorder(SimpleEtchedBorder.singleton);
+ // setBorder(new CompoundBorder(SimpleEtchedBorder.singleton, new LineBorder(ColorConstants.black, 1)));
+ // setBackgroundColor(ColorConstants.white);
+
+ header = new DataTypeFigure(namespaceFigure, nameFigure);
+ header.setBorder(new MarginBorder(4));
+ ToolbarLayout layout2 = new ToolbarLayout(true);
+ layout2.setStretchMinorAxis(true);
+ layout2.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
+ layout2.setSpacing(5);
+ header.setLayoutManager(layout2);
+ add(header);
+
+ body = new Figure();
+ body.setLayoutManager(new ToolbarLayout());
+ add(body);
+ }
+
+ public IFigure getContentPane() {
+ return body;
+ }
+
+ public IFigure getNamespaceFigure() {
+ return header.getNamespaceFigure();
+ }
+
+ public IFigure getNameFigure() {
+ return header.getNameFigure();
+ }
+
+ public void setHeaderIcon(Image image) {
+ header.setImage(image);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/CompartmentFigure.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/CompartmentFigure.java
new file mode 100644
index 00000000000..bec2ecb8879
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/CompartmentFigure.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.framework.ui.data.model.editor.figure;
+
+import org.eclipse.draw2d.AbstractBorder;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.CompoundBorder;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CompartmentFigure extends Figure {
+
+ public CompartmentFigure() {
+ ToolbarLayout layout = new ToolbarLayout();
+ layout.setMinorAlignment(ToolbarLayout.ALIGN_TOPLEFT);
+ layout.setStretchMinorAxis(false);
+ layout.setSpacing(2);
+ setLayoutManager(layout);
+ setBorder(new CompoundBorder(new CompartmentFigureBorder(), new MarginBorder(1)));
+ }
+
+ public Dimension getPreferredSize(int wHint, int hHint) {
+ Dimension size = super.getPreferredSize(wHint, hHint);
+ size.height = Math.max(size.height, 10);
+ return size;
+ }
+
+ private final static class CompartmentFigureBorder extends AbstractBorder {
+ private static final Insets INSETS = new Insets(2, 0, 0, 1);
+
+ public Insets getInsets(IFigure figure) {
+ return INSETS;
+ }
+
+ public void paint(IFigure figure, Graphics graphics, Insets insets) {
+ graphics.setForegroundColor(ColorConstants.black);
+ Rectangle rect = getPaintRectangle(figure, insets);
+ graphics.drawLine(rect.x, rect.y, rect.x + rect.width - 1, rect.y);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/DataTypeFigure.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/DataTypeFigure.java
new file mode 100644
index 00000000000..1f67986dfba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/DataTypeFigure.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.framework.ui.data.model.editor.figure;
+
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.ImageFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataTypeFigure extends Figure {
+
+ private ImageFigure iconFigure;
+ private IFigure namespaceFigure;
+ private IFigure nameFigure;
+
+ public DataTypeFigure(IFigure namespaceFigure, IFigure nameFigure) {
+ this.namespaceFigure = namespaceFigure;
+ this.nameFigure = nameFigure;
+ this.iconFigure = new ImageFigure();
+
+ setLayoutManager(new ToolbarLayout(true));
+
+ add(iconFigure);
+ add(namespaceFigure);
+ Label separator = new Label(":");
+ separator.setTextAlignment(PositionConstants.CENTER);
+ add(separator);
+ add(nameFigure);
+ }
+
+ public IFigure getNamespaceFigure() {
+ return namespaceFigure;
+ }
+
+ public IFigure getNameFigure() {
+ return nameFigure;
+ }
+
+ public void setImage(Image image) {
+ iconFigure.setImage(image);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/SelectableLabel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/SelectableLabel.java
new file mode 100644
index 00000000000..444b48d27d1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/figure/SelectableLabel.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.framework.ui.data.model.editor.figure;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SelectableLabel extends Label {
+
+ private boolean selected;
+ private boolean hasFocus;
+ private boolean isSelectable;
+
+ public SelectableLabel() {
+ this.isSelectable = true;
+ }
+
+ private Rectangle getSelectionRectangle() {
+ Rectangle bounds = getTextBounds();
+ bounds.expand(new Insets(2, 2, 0, 0));
+ translateToParent(bounds);
+ bounds.intersect(getBounds());
+ return bounds;
+ }
+
+ /**
+ * @see org.eclipse.draw2d.Label#paintFigure(org.eclipse.draw2d.Graphics)
+ */
+ protected void paintFigure(Graphics graphics) {
+ if (isSelectable) {
+ if (selected) {
+ graphics.pushState();
+ graphics.setBackgroundColor(ColorConstants.menuBackgroundSelected);
+ graphics.fillRectangle(getSelectionRectangle());
+ graphics.popState();
+ graphics.setForegroundColor(ColorConstants.white);
+ }
+ if (hasFocus) {
+ graphics.pushState();
+ graphics.setXORMode(true);
+ graphics.setForegroundColor(ColorConstants.menuBackgroundSelected);
+ graphics.setBackgroundColor(ColorConstants.white);
+ graphics.drawFocus(getSelectionRectangle().resize(-1, -1));
+ graphics.popState();
+ }
+ }
+ super.paintFigure(graphics);
+ }
+
+ /**
+ * Sets the selection state of this SimpleActivityLabel
+ *
+ * @param b true will cause the label to appear selected
+ */
+ public void setSelected(boolean b) {
+ if (selected != b) {
+ selected = b;
+ repaint();
+ }
+ }
+
+ /**
+ * Sets the focus state of this SimpleActivityLabel
+ *
+ * @param b true will cause a focus rectangle to be drawn around the text of the Label
+ */
+ public void setFocus(boolean b) {
+ if (hasFocus != b) {
+ hasFocus = b;
+ repaint();
+ }
+ }
+
+ public void setSelectable(boolean selectable) {
+ isSelectable = selectable;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/ExcelXmlODMFileHandler.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/ExcelXmlODMFileHandler.java
new file mode 100644
index 00000000000..21c61477913
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/ExcelXmlODMFileHandler.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.framework.ui.data.model.editor.input;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.importing.ExcelOseeTypeDataParser;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExcelXmlODMFileHandler implements IOseeDataTypeHandler {
+
+ public DataTypeSource toODMDataTypeSource(IPath file) throws OseeCoreException {
+ OseeDataTypeConverter converter = new OseeDataTypeConverter(file.toPortableString());
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(FileLocator.openStream(null, file, false));
+
+ ExcelOseeTypeDataParser parser = new ExcelOseeTypeDataParser(converter);
+ parser.extractTypesFromSheet(inputStream);
+
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ return converter.getODMModel();
+ }
+
+ public boolean isValid(IPath file) {
+ boolean result = false;
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(FileLocator.openStream(null, file, false));
+ result = isExcelXML(inputStream);
+ } catch (IOException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return result;
+ }
+
+ private boolean isExcelXML(InputStream inputStream) {
+ boolean toReturn = false;
+ try {
+ inputStream.mark(250);
+ byte[] buffer = new byte[200];
+ int index = 0;
+ for (; index < buffer.length; index++) {
+ if (inputStream.available() > 0) {
+ buffer[index] = (byte) inputStream.read();
+ } else {
+ break;
+ }
+ }
+ if (index > 0) {
+ String header = new String(buffer).toLowerCase();
+ if (header.contains("Excel.Sheet") || header.contains("office:excel") || header.contains("<Workbook")) {
+ toReturn = true;
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ inputStream.reset();
+ } catch (IOException ex) {
+ // Do Nothing
+ }
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/IOseeDataTypeHandler.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/IOseeDataTypeHandler.java
new file mode 100644
index 00000000000..440ecd87c32
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/IOseeDataTypeHandler.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.framework.ui.data.model.editor.input;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOseeDataTypeHandler {
+ public boolean isValid(IPath file);
+
+ public DataTypeSource toODMDataTypeSource(IPath file) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeConverter.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeConverter.java
new file mode 100644
index 00000000000..46004679ea5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeConverter.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.framework.ui.data.model.editor.input;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumType;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumTypeManager;
+import org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeDataTypeConverter implements IOseeDataTypeProcessor {
+
+ private final DataTypeSource dataTypeSource;
+
+ public OseeDataTypeConverter(String sourceId) {
+ this.dataTypeSource = new DataTypeSource(sourceId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor#doesArtifactSuperTypeExist(java.lang.String)
+ */
+ @Override
+ public boolean doesArtifactSuperTypeExist(String artifactSuperTypeName) throws OseeCoreException {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor#onArtifactType(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void onArtifactType(String factoryName, String namespace, String name) throws OseeCoreException {
+ ArtifactDataType artifactDataType = new ArtifactDataType(namespace, name, null);
+
+ this.dataTypeSource.add(artifactDataType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor#onAttributeType(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, int, int, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void onAttributeType(String baseAttributeClass, String providerAttributeClass, String fileTypeExtension, String namespace, String name, String defaultValue, String validityXml, int minOccurrence, int maxOccurrence, String toolTipText, String taggerId) throws OseeCoreException {
+ OseeEnumType enumType = OseeEnumTypeManager.getUniqueType(namespace + name);
+ int enumTypeId = enumType.getEnumTypeId();
+ AttributeDataType attributeDataType =
+ new AttributeDataType(namespace, name, baseAttributeClass, defaultValue, fileTypeExtension, maxOccurrence,
+ minOccurrence, providerAttributeClass, taggerId, toolTipText, enumTypeId);
+
+ // Create attribute provider and base attribute classes here ??
+
+ this.dataTypeSource.add(attributeDataType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor#onAttributeValidity(java.lang.String, java.lang.String, java.util.Collection)
+ */
+ @Override
+ public void onAttributeValidity(String attributeName, String artifactSuperTypeName, Collection<String> concreteTypes) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor#onRelationType(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void onRelationType(String namespace, String name, String sideAName, String sideBName, String abPhrasing, String baPhrasing, String shortName, String ordered) throws OseeCoreException {
+ RelationDataType relationDataType =
+ new RelationDataType(namespace, name, abPhrasing, baPhrasing, Boolean.valueOf(ordered), shortName,
+ sideAName, sideBName);
+
+ this.dataTypeSource.add(relationDataType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.importing.IOseeDataTypeProcessor#onRelationValidity(java.lang.String, java.lang.String, int, int)
+ */
+ @Override
+ public void onRelationValidity(String artifactTypeName, String relationTypeName, int sideAMax, int sideBMax) throws OseeCoreException {
+ }
+
+ public DataTypeSource getODMModel() {
+ return dataTypeSource;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeDatastore.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeDatastore.java
new file mode 100644
index 00000000000..87093c0e9a9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeDatastore.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.input;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKey;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeDataTypeDatastore {
+ private static final String SELECT_ATTRIBUTE_VALIDITY = "SELECT * FROM osee_valid_attributes";
+ private static final String SELECT_RELATION_VALIDITY = "SELECT * FROM osee_valid_relations";
+
+ private OseeDataTypeDatastore() {
+ }
+
+ public static List<AttributeDataType> getAttributeTypes() throws OseeDataStoreException {
+ List<AttributeDataType> attributeDataTypes = new ArrayList<AttributeDataType>();
+ for (AttributeType attributeType : AttributeTypeManager.getAllTypes()) {
+ AttributeDataType attributeDataType =
+ new AttributeDataType(String.valueOf(attributeType.getAttrTypeId()), attributeType.getNamespace(),
+ attributeType.getName(), attributeType.getBaseAttributeClass().getCanonicalName(),
+ attributeType.getDefaultValue(), attributeType.getFileTypeExtension(),
+ attributeType.getMaxOccurrences(), attributeType.getMinOccurrences(),
+ attributeType.getProviderAttributeClass().getCanonicalName(), attributeType.getTaggerId(),
+ attributeType.getTipText(), attributeType.getOseeEnumTypeId());
+ attributeDataTypes.add(attributeDataType);
+ }
+ return attributeDataTypes;
+ }
+
+ public static List<RelationDataType> getRelationDataTypes() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ List<RelationDataType> relationDataTypes = new ArrayList<RelationDataType>();
+ for (RelationType relationType : RelationTypeManager.getAllTypes()) {
+ RelationDataType relationDataType =
+ new RelationDataType(String.valueOf(relationType.getRelationTypeId()), relationType.getNamespace(),
+ relationType.getTypeName(), relationType.getAToBPhrasing(), relationType.getBToAPhrasing(),
+ relationType.isOrdered(), relationType.getShortName(), relationType.getSideAName(),
+ relationType.getSideBName());
+ relationDataTypes.add(relationDataType);
+ }
+ return relationDataTypes;
+ }
+
+ public static List<ArtifactDataType> getArtifactDataTypes() throws OseeDataStoreException {
+ List<ArtifactDataType> artifactDataTypes = new ArrayList<ArtifactDataType>();
+ for (ArtifactType artifactType : ArtifactTypeManager.getAllTypes()) {
+ ArtifactDataType artifactDataType =
+ new ArtifactDataType(String.valueOf(artifactType.getArtTypeId()), artifactType.getNamespace(),
+ artifactType.getName(), ImageManager.getImage(artifactType));
+ artifactDataTypes.add(artifactDataType);
+ }
+ return artifactDataTypes;
+ }
+
+ public static HashCollection<String, String> getArtifactToAttributeEntries() throws OseeCoreException {
+ HashCollection<String, String> toReturn = new HashCollection<String, String>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(2000, SELECT_ATTRIBUTE_VALIDITY);
+ while (chStmt.next()) {
+ try {
+ toReturn.put(chStmt.getString("art_type_id"), chStmt.getString("attr_type_id"));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ public static CompositeKeyHashMap<String, String, ObjectPair<Integer, Integer>> getArtifactToRelationEntries() throws OseeCoreException {
+ CompositeKeyHashMap<String, String, ObjectPair<Integer, Integer>> toReturn =
+ new CompositeKeyHashMap<String, String, ObjectPair<Integer, Integer>>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(2000, SELECT_RELATION_VALIDITY);
+ while (chStmt.next()) {
+ try {
+ CompositeKey<String, String> key =
+ new CompositeKey<String, String>(chStmt.getString("art_type_id"),
+ chStmt.getString("rel_link_type_id"));
+
+ ObjectPair<Integer, Integer> multiplicity =
+ new ObjectPair<Integer, Integer>(chStmt.getInt("side_a_max"), chStmt.getInt("side_b_max"));
+
+ toReturn.put(key, multiplicity);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+
+ public static HashCollection<String, String> getArtifactInheritance() throws OseeCoreException {
+ HashCollection<String, String> toReturn = new HashCollection<String, String>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(2000, "select * from osee_artifact_type_inheritance");
+ while (chStmt.next()) {
+ try {
+ toReturn.put(chStmt.getString("art_type_ancestor_id"), chStmt.getString("art_type_descendant_id"));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeFactory.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeFactory.java
new file mode 100644
index 00000000000..c28af34d8a0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/input/OseeDataTypeFactory.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.framework.ui.data.model.editor.input;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+import org.eclipse.osee.framework.ui.data.model.editor.model.TypeManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeDataTypeFactory {
+ private static OseeDataTypeFactory instance = new OseeDataTypeFactory();
+
+ private List<IOseeDataTypeHandler> fileHandlers;
+
+ private OseeDataTypeFactory() {
+ if (fileHandlers == null) {
+ fileHandlers = new ArrayList<IOseeDataTypeHandler>();
+ fileHandlers.add(new ExcelXmlODMFileHandler());
+ }
+ }
+
+ public static DataTypeSource loadFromFile(IPath file) throws OseeCoreException {
+ DataTypeSource dataTypeSource = null;
+ for (IOseeDataTypeHandler handler : instance.fileHandlers) {
+ if (handler.isValid(file)) {
+ dataTypeSource = handler.toODMDataTypeSource(file);
+ if (dataTypeSource != null) {
+ break;
+ }
+ }
+ }
+ return dataTypeSource;
+ }
+
+ public static void addTypesFromDataStore(DataTypeCache cache) throws OseeCoreException {
+ String sourceId = OseeInfo.getValue("osee.db.guid");
+ DataTypeSource dataTypeSource = new DataTypeSource(sourceId, true);
+ dataTypeSource.addAll(OseeDataTypeDatastore.getArtifactDataTypes());
+ dataTypeSource.addAll(OseeDataTypeDatastore.getAttributeTypes());
+ dataTypeSource.addAll(OseeDataTypeDatastore.getRelationDataTypes());
+ HashCollection<String, String> entries = OseeDataTypeDatastore.getArtifactToAttributeEntries();
+
+ TypeManager<ArtifactDataType> artifactDataType = dataTypeSource.getArtifactTypeManager();
+ TypeManager<AttributeDataType> attributeDataType = dataTypeSource.getAttributeTypeManager();
+
+ for (String artifactKey : entries.keySet()) {
+ ArtifactDataType artifact = artifactDataType.getById(artifactKey);
+ if (artifact != null) {
+ Collection<String> attrKeys = entries.getValues(artifactKey);
+ if (attrKeys != null) {
+ for (String attrKey : attrKeys) {
+ AttributeDataType attribute = attributeDataType.getById(attrKey);
+ if (attribute != null) {
+ artifact.add(attribute);
+ }
+ }
+ }
+ }
+ }
+ // CompositeKeyHashMap<String, String, ObjectPair<Integer, Integer>> relationsMap =
+ // OseeDataTypeDatastore.getArtifactToRelationEntries();
+ // TypeManager<RelationDataType> relationDataType = dataTypeSource.getRelationTypeManager();
+ // for (CompositeKey<String, String> key : relationsMap.keySet()) {
+ // ArtifactDataType artifact = artifactDataType.getById(key.getKey1());
+ // if (artifact != null) {
+ // Collection<String> relKeys = entries.getValues(key.getKey2());
+ // if (relKeys != null) {
+ // for (String relKey : relKeys) {
+ // RelationDataType relation = relationDataType.getById(relKey);
+ // if (relation != null) {
+ // artifact.add(relation);
+ // }
+ // }
+ // }
+ // }
+ // }
+
+ // HashCollection<String, String> parentChildTable = OseeDataTypeDatastore.getArtifactInheritance();
+ // for (String parentKey : parentChildTable.keySet()) {
+ // ArtifactDataType parent = artifactDataType.getById(parentKey);
+ // if (parent != null) {
+ // Collection<String> children = parentChildTable.getValues(parentKey);
+ // for (String childKey : children) {
+ // ArtifactDataType child = artifactDataType.getById(childKey);
+ // if (child != null) {
+ // child.setSuperType(parent);
+ // }
+ // }
+ // }
+ // }
+ cache.addDataTypeSource(dataTypeSource);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ArtifactDataType.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ArtifactDataType.java
new file mode 100644
index 00000000000..988c5bb024c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ArtifactDataType.java
@@ -0,0 +1,249 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.model;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactDataType extends DataType {
+
+ private Image image;
+ private TypeManager<AttributeDataType> attributes;
+ private TypeManager<RelationDataType> relations;
+ private ArtifactDataType superType;
+ private Set<ArtifactDataType> subTypes;
+
+ public ArtifactDataType() {
+ this(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, null);
+ }
+
+ public ArtifactDataType(String namespace, String name, Image imageName) {
+ this(EMPTY_STRING, namespace, name, imageName);
+ }
+
+ public ArtifactDataType(String uniqueId, String namespace, String name, Image image) {
+ super(uniqueId, namespace, name);
+ this.image = image;
+ this.attributes = new TypeManager<AttributeDataType>();
+ this.relations = new TypeManager<RelationDataType>();
+ this.subTypes = new HashSet<ArtifactDataType>();
+ }
+
+ public void add(AttributeDataType attribute) {
+ getAttributeManager().add(attribute);
+ fireModelEvent();
+ }
+
+ public void add(RelationDataType relation) {
+ getRelationManager().add(relation);
+ fireModelEvent();
+ }
+
+ public void remove(AttributeDataType attribute) {
+ getAttributeManager().remove(attribute);
+ fireModelEvent();
+ }
+
+ public void remove(RelationDataType relation) {
+ getRelationManager().remove(relation);
+ fireModelEvent();
+ }
+
+ private TypeManager<AttributeDataType> getAttributeManager() {
+ return attributes;
+ }
+
+ private TypeManager<RelationDataType> getRelationManager() {
+ return relations;
+ }
+
+ public Image getImage() {
+ return image == null ? ImageManager.getImage(FrameworkImage.MISSING) : image;
+ }
+
+ public void setImage(Image image) {
+ if (this.image != image) {
+ this.image = image;
+ fireModelEvent();
+ }
+ }
+
+ @Override
+ public void addConnection(ConnectionModel connection) {
+ if (connection != null) {
+ try {
+ if (connection.getTarget() == this) {
+ setSuperType((ArtifactDataType) connection.getSource());
+ } else if (connection.getSource() == this) {
+ addSubType((ArtifactDataType) connection.getTarget());
+ }
+ super.addConnection(connection);
+ } catch (OseeStateException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ @Override
+ public void removeConnection(ConnectionModel connection) {
+ if (connection != null) {
+ try {
+ if (connection.getTarget() == this) {
+ setSuperType(null);
+ } else if (connection.getSource() == this) {
+ removeSubType((ArtifactDataType) connection.getTarget());
+ }
+ super.removeConnection(connection);
+ } catch (OseeStateException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public void setSuperType(ArtifactDataType superType) throws OseeStateException {
+ getSourceConnections(); // I am the source;
+
+ if (this.superType != superType && !this.equals(superType)) {
+ if (superType == null) {
+ if (this.superType != null) {
+ this.superType.removeSubType(this);
+ }
+ this.superType = superType;
+ fireModelEvent();
+ } else {
+ checkInheritance(superType);
+ if (this.superType != null) {
+ this.superType.removeSubType(this);
+ }
+ this.superType = superType;
+ this.superType.addSubType(this);
+ fireModelEvent();
+ }
+ }
+ }
+
+ private void checkInheritance(ArtifactDataType item) throws OseeStateException {
+ boolean thisIsAItem = instanceOf(this, item);
+ boolean itemIsAThis = instanceOf(item, this);
+ String message = "Inheritance constraint violation - [%s] is a [%s]";
+ if (thisIsAItem) {
+ throw new OseeStateException(String.format(message, this, item));
+ } else if (itemIsAThis) {
+ throw new OseeStateException(String.format(message, item, this));
+ }
+ }
+
+ public static boolean instanceOf(ArtifactDataType art1, ArtifactDataType art2) {
+ boolean toReturn = false;
+ if (art1 == art2) {
+ toReturn = true;
+ } else if (art1 != null && art2 != null) {
+ toReturn = art1.equals(art2) || art2.getSubTypes().contains(art1);
+ }
+ return toReturn;
+ }
+
+ private void addSubType(ArtifactDataType childType) throws OseeStateException {
+ if (childType != this) {
+ checkInheritance(childType);
+ subTypes.add(childType);
+ }
+ }
+
+ private void removeSubType(ArtifactDataType childType) {
+ subTypes.remove(childType);
+ }
+
+ public List<ArtifactDataType> getSubTypes() {
+ List<ArtifactDataType> descendants = new ArrayList<ArtifactDataType>();
+ for (ArtifactDataType descendant : subTypes) {
+ if (descendant != this) {
+ descendants.add(descendant);
+ descendants.addAll(descendant.getSubTypes());
+ }
+ }
+ return descendants;
+ }
+
+ public ArtifactDataType getSuperType() {
+ return this.superType;
+ }
+
+ public List<ArtifactDataType> getSuperTypes() {
+ List<ArtifactDataType> toReturn = new ArrayList<ArtifactDataType>();
+ if (this.superType != null) {
+ toReturn.add(this.superType);
+ toReturn.addAll(this.superType.getSuperTypes());
+ }
+ return toReturn;
+ }
+
+ public List<AttributeDataType> getInheritedAttributes() {
+ List<AttributeDataType> inherited = new ArrayList<AttributeDataType>();
+ if (this.superType != null) {
+ inherited.addAll(this.superType.getLocalAndInheritedAttributes());
+ }
+ return inherited;
+ }
+
+ public List<RelationDataType> getInheritedRelations() {
+ List<RelationDataType> inherited = new ArrayList<RelationDataType>();
+ if (this.superType != null) {
+ inherited.addAll(this.superType.getLocalAndInheritedRelations());
+ }
+ return inherited;
+ }
+
+ public List<AttributeDataType> getLocalAndInheritedAttributes() {
+ List<AttributeDataType> allList = new ArrayList<AttributeDataType>();
+ allList.addAll(getInheritedAttributes());
+ allList.addAll(getLocalAttributes());
+ return allList;
+ }
+
+ public List<RelationDataType> getLocalAndInheritedRelations() {
+ List<RelationDataType> allList = new ArrayList<RelationDataType>();
+ allList.addAll(getInheritedRelations());
+ allList.addAll(getLocalRelations());
+ return allList;
+ }
+
+ public List<AttributeDataType> getLocalAttributes() {
+ return getAttributeManager().getAll();
+ }
+
+ public List<RelationDataType> getLocalRelations() {
+ return getRelationManager().getAll();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.Model#fireModelEvent()
+ */
+ @Override
+ protected void fireModelEvent() {
+ super.fireModelEvent();
+ for (ArtifactDataType descendant : getSubTypes()) {
+ descendant.fireModelEvent();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/AttributeDataType.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/AttributeDataType.java
new file mode 100644
index 00000000000..e2dfd405a1d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/AttributeDataType.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.framework.ui.data.model.editor.model;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeDataType extends DataType {
+
+ private String defaultValue;
+ private int enumTypeId;
+ private String toolTipText;
+ private String fileTypeExtension;
+ private String taggerId;
+
+ private int minOccurrence;
+ private int maxOccurrence;
+
+ private String baseAttributeClass;
+ private String providerAttributeClass;
+
+ public AttributeDataType() {
+ this(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, 0, 0, EMPTY_STRING,
+ EMPTY_STRING, EMPTY_STRING, -1);
+ }
+
+ public AttributeDataType(String typeId, String namespace, String name, String baseAttributeClass, String defaultValue, String fileTypeExtension, int maxOccurrence, int minOccurrence, String providerAttributeClass, String taggerId, String toolTipText, int enumTypeId) {
+ super(typeId, namespace, name);
+ this.baseAttributeClass = baseAttributeClass;
+ this.defaultValue = defaultValue;
+ this.fileTypeExtension = fileTypeExtension;
+ this.maxOccurrence = maxOccurrence;
+ this.minOccurrence = minOccurrence;
+ this.providerAttributeClass = providerAttributeClass;
+ this.taggerId = taggerId;
+ this.toolTipText = toolTipText;
+ this.enumTypeId = enumTypeId;
+ }
+
+ public AttributeDataType(String namespace, String name, String baseAttributeClass, String defaultValue, String fileTypeExtension, int maxOccurrence, int minOccurrence, String providerAttributeClass, String taggerId, String toolTipText, int enumTypeId) {
+ this(EMPTY_STRING, namespace, name, baseAttributeClass, defaultValue, fileTypeExtension, maxOccurrence,
+ minOccurrence, providerAttributeClass, taggerId, toolTipText, enumTypeId);
+ }
+
+ /**
+ * @return the defaultValue
+ */
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ /**
+ * @param defaultValue the defaultValue to set
+ */
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ /**
+ * @return the enumTypeId
+ */
+ public int getEnumTypeId() {
+ return enumTypeId;
+ }
+
+ /**
+ * @param enumTypeId the enumTypeId to set
+ */
+ public void setEnumTypeId(int enumTypeId) {
+ this.enumTypeId = enumTypeId;
+ }
+
+ /**
+ * @return the toolTipText
+ */
+ public String getToolTipText() {
+ return toolTipText;
+ }
+
+ /**
+ * @param toolTipText the toolTipText to set
+ */
+ public void setToolTipText(String toolTipText) {
+ this.toolTipText = toolTipText;
+ }
+
+ /**
+ * @return the fileTypeExtension
+ */
+ public String getFileTypeExtension() {
+ return fileTypeExtension;
+ }
+
+ /**
+ * @param fileTypeExtension the fileTypeExtension to set
+ */
+ public void setFileTypeExtension(String fileTypeExtension) {
+ this.fileTypeExtension = fileTypeExtension;
+ }
+
+ /**
+ * @return the taggerId
+ */
+ public String getTaggerId() {
+ return taggerId;
+ }
+
+ /**
+ * @param taggerId the taggerId to set
+ */
+ public void setTaggerId(String taggerId) {
+ this.taggerId = taggerId;
+ }
+
+ /**
+ * @return the minOccurrence
+ */
+ public int getMinOccurrence() {
+ return minOccurrence;
+ }
+
+ /**
+ * @param minOccurrence the minOccurrence to set
+ */
+ public void setMinOccurrence(int minOccurrence) {
+ this.minOccurrence = minOccurrence;
+ }
+
+ /**
+ * @return the maxOccurrence
+ */
+ public int getMaxOccurrence() {
+ return maxOccurrence;
+ }
+
+ /**
+ * @param maxOccurrence the maxOccurrence to set
+ */
+ public void setMaxOccurrence(int maxOccurrence) {
+ this.maxOccurrence = maxOccurrence;
+ }
+
+ /**
+ * @return the baseAttributeClass
+ */
+ public String getBaseAttributeClass() {
+ return baseAttributeClass;
+ }
+
+ /**
+ * @param baseAttributeClass the baseAttributeClass to set
+ */
+ public void setBaseAttributeClass(String baseAttributeClass) {
+ this.baseAttributeClass = baseAttributeClass;
+ }
+
+ /**
+ * @return the providerAttributeClass
+ */
+ public String getProviderAttributeClass() {
+ return providerAttributeClass;
+ }
+
+ /**
+ * @param providerAttributeClass the providerAttributeClass to set
+ */
+ public void setProviderAttributeClass(String providerAttributeClass) {
+ this.providerAttributeClass = providerAttributeClass;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ConnectionModel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ConnectionModel.java
new file mode 100644
index 00000000000..ab6deb58d31
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ConnectionModel.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.framework.ui.data.model.editor.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.Bendpoint;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConnectionModel<T extends NodeModel> extends Model {
+
+ private boolean isConnected;
+ private T source;
+ private T target;
+ private List<Bendpoint> bendPoints;
+
+ public ConnectionModel() {
+ this.bendPoints = new ArrayList<Bendpoint>();
+ }
+
+ public ConnectionModel(T source, T target) {
+ this();
+ reconnect(source, target);
+ }
+
+ public void disconnect() {
+ if (isConnected) {
+ source.removeConnection(this);
+ target.removeConnection(this);
+ if (this.source != null) {
+ for (IModelListener listener : getListeners()) {
+ this.source.removeListener(listener);
+ }
+ }
+ if (this.target != null) {
+ for (IModelListener listener : getListeners()) {
+ this.target.removeListener(listener);
+ }
+ }
+ isConnected = false;
+ // fireModelEvent();
+ }
+ }
+
+ public T getSource() {
+ return source;
+ }
+
+ public T getTarget() {
+ return target;
+ }
+
+ public void setSource(T source) {
+ if (this.source != source) {
+ if (this.source != null) {
+ for (IModelListener listener : getListeners()) {
+ this.source.removeListener(listener);
+ }
+ }
+ this.source = source;
+ // fireModelEvent();
+ }
+ }
+
+ public void setTarget(T target) {
+ if (this.target != target) {
+ if (this.target != null) {
+ for (IModelListener listener : getListeners()) {
+ this.target.removeListener(listener);
+ }
+ }
+ this.target = target;
+ // fireModelEvent();
+ }
+ }
+
+ public void reconnect() {
+ if (!isConnected) {
+ source.addConnection(this);
+ target.addConnection(this);
+ isConnected = true;
+ // fireModelEvent();
+ }
+ }
+
+ public void reconnect(T newSource, T newTarget) {
+ if (newSource != null && newTarget != null && newSource != newTarget) {
+ disconnect();
+ this.source = newSource;
+ this.target = newTarget;
+ reconnect();
+ }
+ }
+
+ public List<Bendpoint> getBendpoints() {
+ return bendPoints;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.Model#addListener(org.eclipse.osee.framework.ui.data.model.editor.model.IModelListener)
+ */
+ @Override
+ public void addListener(IModelListener listener) {
+ if (getSource() != null) {
+ getSource().addListener(listener);
+ }
+ if (getTarget() != null) {
+ getTarget().addListener(listener);
+ }
+ super.addListener(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.Model#removeListener(org.eclipse.osee.framework.ui.data.model.editor.model.IModelListener)
+ */
+ @Override
+ public void removeListener(IModelListener listener) {
+ if (getSource() != null) {
+ getSource().removeListener(listener);
+ }
+ if (getTarget() != null) {
+ getTarget().removeListener(listener);
+ }
+ super.removeListener(listener);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataType.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataType.java
new file mode 100644
index 00000000000..e96e933b1e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataType.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.model;
+
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataType extends NodeModel {
+ private static final String DEFAULT_NAMESPACE = "default";
+ protected static final String EMPTY_STRING = "";
+ private String name;
+ private String namespace;
+ private String uniqueId;
+
+ public DataType() {
+ this(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING);
+ }
+
+ public DataType(String namespace, String name) {
+ this(EMPTY_STRING, namespace, name);
+ }
+
+ public DataType(String typeId, String namespace, String name) {
+ super();
+ this.uniqueId = typeId;
+ this.namespace = namespace;
+ this.name = name;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ if (this.name != name) {
+ this.name = Strings.isValid(name) ? name.trim() : name;
+ fireModelEvent();
+ }
+ }
+
+ /**
+ * @return the namespace
+ */
+ public String getNamespace() {
+ return !Strings.isValid(namespace) ? DEFAULT_NAMESPACE : namespace;
+ }
+
+ /**
+ * @param namespace the namespace to set
+ */
+ public void setNamespace(String namespace) {
+ if (this.namespace != namespace) {
+ this.namespace = Strings.isValid(namespace) ? namespace.trim() : DEFAULT_NAMESPACE;
+ fireModelEvent();
+ }
+ }
+
+ /**
+ * @return the typeId
+ */
+ public String getUniqueId() {
+ return uniqueId;
+ }
+
+ /**
+ * @param typeId the typeId to set
+ */
+ public void setUniqueId(String typeId) {
+ this.uniqueId = typeId;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof DataType) {
+ DataType other = (DataType) obj;
+ return objectEquals(getNamespace(), other.getNamespace()) && objectEquals(getName(), other.getName());
+ }
+ return false;
+ }
+
+ private boolean objectEquals(Object object1, Object object2) {
+ if (object1 == object2) {
+ return true;
+ } else if (object1 != null && object2 != null) {
+ return object1.equals(object2);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ public String toString() {
+ return String.format("%s:%s", getNamespace(), getName());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeCache.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeCache.java
new file mode 100644
index 00000000000..19d54a3783c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeCache.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.framework.ui.data.model.editor.model;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataTypeCache {
+
+ private final Map<String, DataTypeSource> dataTypeSources;
+
+ public DataTypeCache() {
+ dataTypeSources = new HashMap<String, DataTypeSource>();
+ }
+
+ public void addDataTypeSource(DataTypeSource dataTypeSource) {
+ dataTypeSources.put(dataTypeSource.getSourceId(), dataTypeSource);
+ }
+
+ public void removeDataTypeSource(String dataTypeSourceId) {
+ dataTypeSources.remove(dataTypeSourceId);
+ }
+
+ public Set<String> getDataTypeSourceIds() {
+ return dataTypeSources.keySet();
+ }
+
+ public DataTypeSource getDataTypeSourceById(String id) {
+ return dataTypeSources.get(id);
+ }
+
+ public int getNumberOfSources() {
+ return dataTypeSources.size();
+ }
+
+ public void clear() {
+ dataTypeSources.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeSource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeSource.java
new file mode 100644
index 00000000000..d889c27ab64
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/DataTypeSource.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.framework.ui.data.model.editor.model;
+
+import java.util.Collection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataTypeSource {
+
+ private final TypeManager<ArtifactDataType> artifactTypeManager;
+ private final TypeManager<AttributeDataType> attributeTypeManager;
+ private final TypeManager<RelationDataType> relationTypeManager;
+
+ private final String sourceId;
+ private final boolean isFromDataStore;
+
+ public DataTypeSource(String sourceId) {
+ this(sourceId, false);
+ }
+
+ public DataTypeSource(String sourceId, boolean isFromDataStore) {
+ this.sourceId = sourceId;
+ this.isFromDataStore = isFromDataStore;
+ artifactTypeManager = new TypeManager<ArtifactDataType>();
+ attributeTypeManager = new TypeManager<AttributeDataType>();
+ relationTypeManager = new TypeManager<RelationDataType>();
+ }
+
+ public String getSourceId() {
+ return sourceId;
+ }
+
+ public boolean isFromDataStore() {
+ return isFromDataStore;
+ }
+
+ public void add(DataType dataType) {
+ if (dataType instanceof ArtifactDataType) {
+ artifactTypeManager.add((ArtifactDataType) dataType);
+ } else if (dataType instanceof AttributeDataType) {
+ attributeTypeManager.add((AttributeDataType) dataType);
+ } else if (dataType instanceof RelationDataType) {
+ relationTypeManager.add((RelationDataType) dataType);
+ }
+ }
+
+ public void addAll(Collection<? extends DataType> dataTypes) {
+ for (DataType dataType : dataTypes) {
+ add(dataType);
+ }
+ }
+
+ public TypeManager<ArtifactDataType> getArtifactTypeManager() {
+ return artifactTypeManager;
+ }
+
+ public TypeManager<AttributeDataType> getAttributeTypeManager() {
+ return attributeTypeManager;
+ }
+
+ public TypeManager<RelationDataType> getRelationTypeManager() {
+ return relationTypeManager;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/IModelListener.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/IModelListener.java
new file mode 100644
index 00000000000..7a91b8d50e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/IModelListener.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.framework.ui.data.model.editor.model;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IModelListener {
+
+ public void onModelEvent(Object object);
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/InheritanceLinkModel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/InheritanceLinkModel.java
new file mode 100644
index 00000000000..f6550df1f64
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/InheritanceLinkModel.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.framework.ui.data.model.editor.model;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InheritanceLinkModel extends ConnectionModel<ArtifactDataType> {
+
+ public InheritanceLinkModel() {
+ super();
+ }
+
+ public InheritanceLinkModel(ArtifactDataType source, ArtifactDataType target) {
+ super(source, target);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/Model.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/Model.java
new file mode 100644
index 00000000000..7dcefffbb26
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/Model.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.framework.ui.data.model.editor.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Model {
+ private final Set<IModelListener> listeners;
+
+ public Model() {
+ this.listeners = Collections.synchronizedSet(new HashSet<IModelListener>());
+ }
+
+ public void addListener(IModelListener listener) {
+ if (listener != null) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(IModelListener listener) {
+ if (listener != null) {
+ listeners.remove(listener);
+ }
+ }
+
+ protected List<IModelListener> getListeners() {
+ return new ArrayList<IModelListener>(listeners);
+ }
+
+ protected void fireModelEvent() {
+ fireModelEvent(null);
+ }
+
+ protected void fireModelEvent(Object object) {
+ for (IModelListener listener : listeners) {
+ listener.onModelEvent(object);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/NodeModel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/NodeModel.java
new file mode 100644
index 00000000000..186875357be
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/NodeModel.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.framework.ui.data.model.editor.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class NodeModel extends Model {
+
+ private final Point location;
+ private final Dimension size;
+ @SuppressWarnings("unchecked")
+ private final List<ConnectionModel> sourceConnections;
+ @SuppressWarnings("unchecked")
+ private final List<ConnectionModel> targetConnections;
+
+ @SuppressWarnings("unchecked")
+ public NodeModel() {
+ this.location = new Point(50, 50);
+ this.size = new Dimension(100, 100);
+ this.sourceConnections = new ArrayList<ConnectionModel>();
+ this.targetConnections = new ArrayList<ConnectionModel>();
+
+ }
+
+ @SuppressWarnings("unchecked")
+ void addConnection(ConnectionModel conn) {
+ if (conn != null && conn.getSource() != conn.getTarget()) {
+ if (conn.getSource() == this) {
+ sourceConnections.add(conn);
+ fireModelEvent();
+ } else if (conn.getTarget() == this) {
+ targetConnections.add(conn);
+ fireModelEvent();
+ }
+ }
+ }
+
+ public Point getLocation() {
+ return location.getCopy();
+ }
+
+ public Dimension getSize() {
+ return size.getCopy();
+ }
+
+ public int getWidth() {
+ return getSize().width;
+ }
+
+ public int getHeight() {
+ return getSize().height;
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<ConnectionModel> getSourceConnections() {
+ return new ArrayList<ConnectionModel>(sourceConnections);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<ConnectionModel> getTargetConnections() {
+ return new ArrayList<ConnectionModel>(targetConnections);
+ }
+
+ @SuppressWarnings("unchecked")
+ void removeConnection(ConnectionModel conn) {
+ if (conn != null) {
+ if (conn.getSource() == this) {
+ sourceConnections.remove(conn);
+ fireModelEvent();
+ } else if (conn.getTarget() == this) {
+ targetConnections.remove(conn);
+ fireModelEvent();
+ }
+ }
+ }
+
+ public void setLocation(Point newLocation) {
+ if (newLocation != null && !newLocation.equals(getLocation())) {
+ location.setLocation(newLocation);
+ fireModelEvent(null);
+ }
+ }
+
+ public void setSize(Dimension newSize) {
+ if (newSize != null && !newSize.equals(getSize())) {
+ size.setSize(newSize);
+ fireModelEvent(null);
+ }
+ }
+
+ public void setWidth(int newWidth) {
+ Dimension dimension = getSize();
+ dimension.width = newWidth;
+ setSize(dimension);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.Model#fireModelEvent()
+ */
+ @Override
+ protected void fireModelEvent() {
+ super.fireModelEvent();
+ for (ConnectionModel conn : getTargetConnections()) {
+ conn.fireModelEvent();
+ }
+ for (ConnectionModel conn : getSourceConnections()) {
+ conn.fireModelEvent();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ODMDiagram.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ODMDiagram.java
new file mode 100644
index 00000000000..fca7bae0926
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/ODMDiagram.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.framework.ui.data.model.editor.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMDiagram extends NodeModel {
+
+ private final Set<DataType> types;
+ private final DataTypeCache cache;
+
+ public ODMDiagram(DataTypeCache cache) {
+ this.types = new HashSet<DataType>();
+ this.cache = cache;
+ }
+
+ public List<DataType> getContent() {
+ return new ArrayList<DataType>(types);
+ }
+
+ public boolean add(DataType dataType) {
+ boolean result = types.add(dataType);
+ if (result) {
+ fireModelEvent(null);
+ }
+ return result;
+ }
+
+ public boolean addAll(Collection<? extends DataType> dataTypes) {
+ boolean result = types.addAll(dataTypes);
+ if (result) {
+ fireModelEvent(null);
+ }
+ return result;
+ }
+
+ public boolean remove(DataType dataType) {
+ boolean result = this.types.remove(dataType);
+ if (result) {
+ fireModelEvent(null);
+ }
+ return result;
+ }
+
+ public boolean removeAll(Collection<? extends DataType> dataTypes) {
+ boolean result = types.removeAll(dataTypes);
+ if (result) {
+ fireModelEvent(null);
+ }
+ return result;
+ }
+
+ public DataTypeCache getCache() {
+ return cache;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationDataType.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationDataType.java
new file mode 100644
index 00000000000..21aa7b976c9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationDataType.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.framework.ui.data.model.editor.model;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationDataType extends DataType {
+
+ private String sideAName;
+ private String sideBName;
+ private String aToBPhrase;
+ private String bToAPhrase;
+ private String shortName;
+ private boolean ordered;
+
+ public RelationDataType() {
+ this(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, false, EMPTY_STRING, EMPTY_STRING,
+ EMPTY_STRING);
+ }
+
+ public RelationDataType(String namespace, String name, String aToBPhrase, String bToAPhrase, boolean ordered, String shortName, String sideAName, String sideBName) {
+ this(EMPTY_STRING, namespace, name, aToBPhrase, bToAPhrase, ordered, shortName, sideAName, sideBName);
+ }
+
+ public RelationDataType(String typeId, String namespace, String name, String aToBPhrase, String bToAPhrase, boolean ordered, String shortName, String sideAName, String sideBName) {
+ super(typeId, namespace, name);
+ this.aToBPhrase = aToBPhrase;
+ this.bToAPhrase = bToAPhrase;
+ this.ordered = ordered;
+ this.shortName = shortName;
+ this.sideAName = sideAName;
+ this.sideBName = sideBName;
+ }
+
+ /**
+ * @return the sideAName
+ */
+ public String getSideAName() {
+ return sideAName;
+ }
+
+ /**
+ * @param sideAName the sideAName to set
+ */
+ public void setSideAName(String sideAName) {
+ this.sideAName = sideAName;
+ }
+
+ /**
+ * @return the sideBName
+ */
+ public String getSideBName() {
+ return sideBName;
+ }
+
+ /**
+ * @param sideBName the sideBName to set
+ */
+ public void setSideBName(String sideBName) {
+ this.sideBName = sideBName;
+ }
+
+ /**
+ * @return the aToBPhrase
+ */
+ public String getAToBPhrase() {
+ return aToBPhrase;
+ }
+
+ /**
+ * @param toBPhrase the aToBPhrase to set
+ */
+ public void setAToBPhrase(String toBPhrase) {
+ aToBPhrase = toBPhrase;
+ }
+
+ /**
+ * @return the bToAPhrase
+ */
+ public String getBToAPhrase() {
+ return bToAPhrase;
+ }
+
+ /**
+ * @param toAPhrase the bToAPhrase to set
+ */
+ public void setBToAPhrase(String toAPhrase) {
+ bToAPhrase = toAPhrase;
+ }
+
+ /**
+ * @return the shortName
+ */
+ public String getShortName() {
+ return shortName;
+ }
+
+ /**
+ * @param shortName the shortName to set
+ */
+ public void setShortName(String shortName) {
+ this.shortName = shortName;
+ }
+
+ /**
+ * @return the ordered
+ */
+ public boolean getOrdered() {
+ return ordered;
+ }
+
+ /**
+ * @param ordered the ordered to set
+ */
+ public void setOrdered(boolean ordered) {
+ this.ordered = ordered;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationLinkModel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationLinkModel.java
new file mode 100644
index 00000000000..8d46b454ab4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/RelationLinkModel.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.framework.ui.data.model.editor.model;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationLinkModel extends ConnectionModel<ArtifactDataType> {
+
+ private RelationDataType relation;
+
+ public RelationLinkModel() {
+ super();
+ relation = null;
+ }
+
+ public RelationLinkModel(RelationDataType relation, ArtifactDataType aSide, ArtifactDataType bSide) {
+ super(aSide, bSide);
+ this.relation = relation;
+ }
+
+ public void setASide(ArtifactDataType aSide) {
+ setSource(aSide);
+ }
+
+ public void setBSide(ArtifactDataType bSide) {
+ setTarget(bSide);
+ }
+
+ public ArtifactDataType getASide() {
+ return getSource();
+ }
+
+ public ArtifactDataType getBSide() {
+ return getTarget();
+ }
+
+ public void setRelation(RelationDataType relation) {
+ this.relation = relation;
+ }
+
+ public RelationDataType getRelation() {
+ return relation;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/TypeManager.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/TypeManager.java
new file mode 100644
index 00000000000..215113deffc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/TypeManager.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.framework.ui.data.model.editor.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TypeManager<T extends DataType> {
+
+ private final static DataTypeComparator DATA_TYPE_COMPARATOR = new DataTypeComparator();
+ private final Map<String, T> types;
+
+ public TypeManager() {
+ this.types = new HashMap<String, T>();
+ }
+
+ public Set<String> getIds() {
+ return types.keySet();
+ }
+
+ public List<T> getAll() {
+ return new ArrayList<T>(types.values());
+ }
+
+ public T getById(String uniqueId) {
+ return types.get(uniqueId);
+ }
+
+ public void add(T type) {
+ types.put(type.getUniqueId(), type);
+ }
+
+ public void addAll(Collection<T> types) {
+ for (T type : types) {
+ add(type);
+ }
+ }
+
+ public int size() {
+ return types.size();
+ }
+
+ public T getFirst() {
+ return types.isEmpty() ? null : types.values().iterator().next();
+ }
+
+ public boolean removeById(String uniqueId) {
+ return types.remove(uniqueId) != null;
+ }
+
+ public boolean remove(T object) {
+ String toRemove = null;
+ for (String key : types.keySet()) {
+ if (object.equals(types.get(key))) {
+ toRemove = key;
+ break;
+ }
+ }
+ return toRemove != null ? types.remove(toRemove) != null : false;
+ }
+
+ public List<T> getAllSorted() {
+ List<T> list = getAll();
+ Collections.sort(list, DATA_TYPE_COMPARATOR);
+ return list;
+ }
+
+ private final static class DataTypeComparator implements Comparator<DataType> {
+
+ @Override
+ public int compare(DataType o1, DataType o2) {
+ String text1 = ODMConstants.getDataTypeText(o1);
+ String text2 = ODMConstants.getDataTypeText(o2);
+ return text1.compareTo(text2);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeContentProvider.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeContentProvider.java
new file mode 100644
index 00000000000..5209397adbb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeContentProvider.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.framework.ui.data.model.editor.model.helper;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactTypeContentProvider implements ITreeContentProvider {
+
+ @Override
+ public Object[] getChildren(Object element) {
+ if (element instanceof DataTypeCache) {
+ List<DataTypeSource> sources = new ArrayList<DataTypeSource>();
+ DataTypeCache cache = (DataTypeCache) element;
+ for (String key : cache.getDataTypeSourceIds()) {
+ sources.add(cache.getDataTypeSourceById(key));
+ }
+ return sources.toArray();
+ }
+ if (element instanceof DataTypeSource) {
+ List<PackageModel> data = new ArrayList<PackageModel>();
+
+ List<ArtifactDataType> artifacts = ((DataTypeSource) element).getArtifactTypeManager().getAll();
+ List<ArtifactDataType> topLevel = new ArrayList<ArtifactDataType>();
+ for (ArtifactDataType artifact : artifacts) {
+ if (artifact.getSuperType() == null) {
+ topLevel.add(artifact);
+ }
+ }
+ data.add(new PackageModel(artifacts.get(0).getNamespace(), topLevel));
+ return data.toArray();
+ }
+ if (element instanceof PackageModel) {
+ return ((PackageModel) element).getArtifacts().toArray();
+ }
+ if (element instanceof ArtifactDataType) {
+ return ((ArtifactDataType) element).getSubTypes().toArray();
+ }
+ return null;
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ if (element instanceof DataTypeCache) {
+ return !((DataTypeCache) element).getDataTypeSourceIds().isEmpty();
+ }
+ if (element instanceof DataTypeSource) {
+ return ((DataTypeSource) element).getArtifactTypeManager().size() > 0;
+ }
+ if (element instanceof PackageModel) {
+ return !((PackageModel) element).hasArtifactTypes();
+ }
+ if (element instanceof ArtifactDataType) {
+ return !((ArtifactDataType) element).getSubTypes().isEmpty();
+ }
+ return false;
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeLabelProvider.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeLabelProvider.java
new file mode 100644
index 00000000000..39971ad5b89
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ArtifactTypeLabelProvider.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.framework.ui.data.model.editor.model.helper;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactTypeLabelProvider implements ILabelProvider {
+
+ @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) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof ArtifactDataType) {
+ return ((ArtifactDataType) element).getImage();
+ }
+ if (element instanceof DataTypeSource) {
+ return ((DataTypeSource) element).isFromDataStore() ? ODMImages.getImage(ODMImages.DATASTORE_IMAGE) : ODMImages.getImage(ODMImages.FILE_SOURCE_IMAGE);
+ }
+ if (element instanceof PackageModel) {
+ return ODMImages.getImage(ODMImages.NAMESPACE_IMAGE);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ if (element instanceof DataTypeSource) {
+ return ((DataTypeSource) element).getSourceId();
+ }
+ if (element instanceof PackageModel) {
+ return ((PackageModel) element).getNamespace();
+ }
+ if (element instanceof ArtifactDataType) {
+ return ((ArtifactDataType) element).getName();
+ }
+ if (element instanceof String) {
+ return (String) element;
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ContainerModel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ContainerModel.java
new file mode 100644
index 00000000000..646a77fc159
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/ContainerModel.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.framework.ui.data.model.editor.model.helper;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ContainerModel {
+ private final ArtifactDataType artifactDataType;
+ private final ContainerType internals;
+
+ public static enum ContainerType {
+ INHERITED_ATTRIBUTES, INHERITED_RELATIONS, LOCAL_RELATIONS, LOCAL_ATTRIBUTES;
+ }
+
+ public ContainerModel(ArtifactDataType theClass, ContainerType internals) {
+ this.artifactDataType = theClass;
+ this.internals = internals;
+ }
+
+ public List<? extends DataType> getChildren() {
+ List<? extends DataType> children = new ArrayList<DataType>();
+ switch (internals) {
+ case INHERITED_ATTRIBUTES:
+ children = artifactDataType.getInheritedAttributes();
+ break;
+ case LOCAL_ATTRIBUTES:
+ children = artifactDataType.getLocalAttributes();
+ break;
+ case INHERITED_RELATIONS:
+ children = artifactDataType.getInheritedRelations();
+ break;
+ case LOCAL_RELATIONS:
+ children = artifactDataType.getLocalRelations();
+ break;
+ default:
+ break;
+ }
+ return children;
+ }
+
+ public ArtifactDataType getArtifact() {
+ return artifactDataType;
+ }
+
+ public ContainerType getContainerType() {
+ return internals;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/PackageModel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/PackageModel.java
new file mode 100644
index 00000000000..3bf81601f5e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/helper/PackageModel.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.framework.ui.data.model.editor.model.helper;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PackageModel {
+ private String namespace;
+ private List<ArtifactDataType> artifacts;
+
+ public PackageModel(String namespace, List<ArtifactDataType> artifacts) {
+ this.namespace = namespace;
+ this.artifacts = artifacts;
+ }
+
+ /**
+ * @return the namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * @param namespace the namespace to set
+ */
+ public void setNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ /**
+ * @return the artifacts
+ */
+ public List<ArtifactDataType> getArtifacts() {
+ return artifacts;
+ }
+
+ /**
+ * @param artifacts the artifacts to set
+ */
+ public void setArtifacts(List<ArtifactDataType> artifacts) {
+ this.artifacts = artifacts;
+ }
+
+ public boolean hasArtifactTypes() {
+ return getArtifacts().isEmpty();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ArtifactDataTypeXml.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ArtifactDataTypeXml.java
new file mode 100644
index 00000000000..53b9fe4de70
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ArtifactDataTypeXml.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.framework.ui.data.model.editor.model.xml;
+
+import java.io.UnsupportedEncodingException;
+import java.util.logging.Level;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ImageUtility;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactDataTypeXml extends BaseXmlDataType<ArtifactDataType> {
+ private final String ARTIFACT_TAG = "artifact";
+
+ private final String IMAGE_DATA = "imageData";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.utility.ODMXmlWriter.DataTypeWriter#getElementName()
+ */
+ @Override
+ public String getElementName() {
+ return ARTIFACT_TAG;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.utility.ODMXmlWriter.DataTypeWriter#writeBody(org.eclipse.osee.framework.ui.data.model.editor.model.DataType)
+ */
+ @Override
+ protected void writeBody(XMLStreamWriter writer, ArtifactDataType dataType) throws XMLStreamException {
+ if (dataType.getSuperType() != null) {
+ writer.writeStartElement("superType");
+ writeIdAttributes(writer, dataType.getSuperType());
+ writer.writeEndElement();
+ }
+
+ for (AttributeDataType attribute : dataType.getLocalAttributes()) {
+ writer.writeStartElement("attribute");
+ writeIdAttributes(writer, attribute);
+ writer.writeEndElement();
+ }
+
+ if (dataType.getImage() != null) {
+ try {
+ writeCDataElement(writer, IMAGE_DATA, new String(ImageUtility.imageToBase64(dataType.getImage()), "UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ throw new XMLStreamException(ex);
+ }
+ }
+ }
+
+ private Image stringToImage(String data) {
+ try {
+ return ImageUtility.base64ToImage(data.getBytes("UTF-8"));
+ } catch (Exception ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#populateFromCDataElement(org.eclipse.osee.framework.ui.data.model.editor.model.DataType, java.lang.String, java.lang.String)
+ */
+ @Override
+ protected void populateFromCDataElement(ArtifactDataType dataType, String tag, String text) throws XMLStreamException {
+ super.populateFromCDataElement(dataType, tag, text);
+ if (IMAGE_DATA.equals(tag)) dataType.setImage(stringToImage(text));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#newDataTypeInstance()
+ */
+ @Override
+ protected ArtifactDataType newDataTypeInstance() {
+ return new ArtifactDataType();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/AttributeDataTypeXml.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/AttributeDataTypeXml.java
new file mode 100644
index 00000000000..367f1f41164
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/AttributeDataTypeXml.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.framework.ui.data.model.editor.model.xml;
+
+import java.util.Map;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeDataTypeXml extends BaseXmlDataType<AttributeDataType> {
+ private final String ATTRIBUTE_TAG = "attribute";
+ private final String MULTIPLICITY = "multiplicity";
+ private final String MIN_OCCURRENCE = "min";
+ private final String MAX_OCCURRENCE = "max";
+ private final String ATTRIBUTE_BASE = "attributeBase";
+ private final String ATTRIBUTE_PROVIDER = "attributeProvider";
+ private final String TAGGER = "tagger";
+ private final String EXTENSION = "extension";
+ private final String DEFAULT_VALUE = "defaultValue";
+ private final String ENUM_TYPE_ID = "enumTypeId";
+ private final String TOOL_TIP = "toolTip";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.utility.ODMXmlWriter.DataTypeWriter#getElementName()
+ */
+ @Override
+ public String getElementName() {
+ return ATTRIBUTE_TAG;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.utility.ODMXmlWriter.DataTypeWriter#writeBody(org.eclipse.osee.framework.ui.data.model.editor.model.DataType)
+ */
+ @Override
+ protected void writeBody(XMLStreamWriter writer, AttributeDataType dataType) throws XMLStreamException {
+ writer.writeStartElement(MULTIPLICITY);
+ writer.writeAttribute(MIN_OCCURRENCE, String.valueOf(dataType.getMinOccurrence()));
+ writer.writeAttribute(MAX_OCCURRENCE, String.valueOf(dataType.getMaxOccurrence()));
+ writer.writeEndElement();
+ writeTextElement(writer, ATTRIBUTE_BASE, dataType.getBaseAttributeClass());
+ writeTextElement(writer, ATTRIBUTE_PROVIDER, dataType.getProviderAttributeClass());
+ writeTextElement(writer, TAGGER, dataType.getTaggerId());
+ writeTextElement(writer, EXTENSION, dataType.getFileTypeExtension());
+ writeCDataElement(writer, DEFAULT_VALUE, dataType.getDefaultValue());
+ writeCDataElement(writer, ENUM_TYPE_ID, String.valueOf(dataType.getEnumTypeId()));
+ writeTextElement(writer, TOOL_TIP, dataType.getToolTipText());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#populateFromTextElement(org.eclipse.osee.framework.ui.data.model.editor.model.DataType, java.lang.String, java.lang.String)
+ */
+ @Override
+ protected void populateFromTextElement(AttributeDataType dataType, String tag, String text) throws XMLStreamException {
+ super.populateFromTextElement(dataType, tag, text);
+ if (ATTRIBUTE_BASE.equals(tag)) dataType.setBaseAttributeClass(text);
+ if (ATTRIBUTE_PROVIDER.equals(tag)) dataType.setProviderAttributeClass(text);
+ if (TAGGER.equals(tag)) dataType.setTaggerId(text);
+ if (EXTENSION.equals(tag)) dataType.setFileTypeExtension(text);
+ if (TOOL_TIP.equals(tag)) dataType.setToolTipText(text);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#populateFromCDataElement(org.eclipse.osee.framework.ui.data.model.editor.model.DataType, java.lang.String, java.lang.String)
+ */
+ @Override
+ protected void populateFromCDataElement(AttributeDataType dataType, String tag, String text) throws XMLStreamException {
+ super.populateFromCDataElement(dataType, tag, text);
+ if (DEFAULT_VALUE.equals(tag)) dataType.setDefaultValue(text);
+ if (ENUM_TYPE_ID.equals(tag)) dataType.setEnumTypeId(Integer.parseInt(text));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#populateFromAttributes(org.eclipse.osee.framework.ui.data.model.editor.model.DataType, java.util.String, java.util.Map)
+ */
+ @Override
+ protected void populateFromAttributes(AttributeDataType dataType, String tag, Map<String, String> attributes) throws XMLStreamException {
+ super.populateFromAttributes(dataType, tag, attributes);
+ if (MULTIPLICITY.equals(tag)) {
+ String value = attributes.get(MIN_OCCURRENCE);
+ if (value != null) {
+ dataType.setMinOccurrence(Integer.parseInt(value));
+ }
+ value = attributes.get(MAX_OCCURRENCE);
+ if (value != null) {
+ dataType.setMaxOccurrence(Integer.parseInt(value));
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#newDataTypeInstance()
+ */
+ @Override
+ protected AttributeDataType newDataTypeInstance() {
+ return new AttributeDataType();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/BaseXmlDataType.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/BaseXmlDataType.java
new file mode 100644
index 00000000000..4418154a695
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/BaseXmlDataType.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.framework.ui.data.model.editor.model.xml;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseXmlDataType<T extends DataType> {
+
+ public BaseXmlDataType() {
+ }
+
+ protected void writeCDataElement(XMLStreamWriter writer, String tag, String value) throws XMLStreamException {
+ if (value != null) {
+ value = value.trim();
+ if (Strings.isValid(value)) {
+ writer.writeStartElement(tag);
+ writer.writeCData(value);
+ writer.writeEndElement();
+ }
+ }
+ }
+
+ protected void writeTextElement(XMLStreamWriter writer, String tag, String value) throws XMLStreamException {
+ if (value != null) {
+ value = value.trim();
+ if (Strings.isValid(value)) {
+ writer.writeStartElement(tag);
+ writer.writeCharacters(value);
+ writer.writeEndElement();
+ }
+ }
+ }
+
+ protected void writeIdAttributes(XMLStreamWriter writer, DataType dataType) throws XMLStreamException {
+ writer.writeAttribute("namespace", dataType.getNamespace());
+ writer.writeAttribute("name", dataType.getName());
+ }
+
+ public final void write(XMLStreamWriter writer, T dataType) throws XMLStreamException {
+ writer.writeStartElement(getElementName());
+ writeIdAttributes(writer, dataType);
+ writeBody(writer, dataType);
+ writer.writeEndElement();
+ }
+
+ protected abstract T newDataTypeInstance();
+
+ protected void populateFromAttributes(T dataType, String tag, Map<String, String> attributes) throws XMLStreamException {
+ if (tag.equals(getElementName())) {
+ dataType.setNamespace(attributes.get("namespace"));
+ dataType.setName(attributes.get("name"));
+ }
+ }
+
+ protected void populateFromTextElement(T dataType, String tag, String text) throws XMLStreamException {
+
+ }
+
+ protected void populateFromCDataElement(T dataType, String tag, String text) throws XMLStreamException {
+
+ }
+
+ private Map<String, String> getAttributes(XMLStreamReader reader) throws XMLStreamException {
+ int count = reader.getAttributeCount();
+ Map<String, String> attributes = new HashMap<String, String>();
+ for (int index = 0; index < count; index++) {
+ attributes.put(reader.getAttributeLocalName(index), reader.getAttributeValue(index));
+ }
+ return attributes;
+ }
+
+ public final void fromXml(XMLStreamReader reader, IDataTypeCollector<T> collector) throws XMLStreamException {
+ T object = null;
+ String currentElement = null;
+ boolean isDone = false;
+ while (reader.hasNext() && !isDone) {
+ int eventType = reader.getEventType();
+ switch (eventType) {
+ case XMLStreamConstants.START_ELEMENT:
+ currentElement = reader.getLocalName();
+ if (currentElement.equals(getElementName())) {
+ object = newDataTypeInstance();
+ }
+ populateFromAttributes(object, currentElement, getAttributes(reader));
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ if (currentElement.equals(getElementName())) {
+ isDone = true;
+ collector.collect(object);
+ }
+ currentElement = null;
+ break;
+ case XMLStreamConstants.CDATA:
+ populateFromCDataElement(object, currentElement, reader.getText());
+ break;
+ case XMLStreamConstants.CHARACTERS:
+ populateFromTextElement(object, currentElement, reader.getText());
+ break;
+ default:
+ break;
+ }
+ reader.next();
+ }
+ }
+
+ public abstract String getElementName();
+
+ protected abstract void writeBody(XMLStreamWriter writer, T dataType) throws XMLStreamException;
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/IDataTypeCollector.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/IDataTypeCollector.java
new file mode 100644
index 00000000000..6bf87878700
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/IDataTypeCollector.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.framework.ui.data.model.editor.model.xml;
+
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IDataTypeCollector<T extends DataType> {
+
+ public void collect(T object);
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ImportDataTypeXml.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ImportDataTypeXml.java
new file mode 100644
index 00000000000..1de255802d7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ImportDataTypeXml.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.framework.ui.data.model.editor.model.xml;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImportDataTypeXml extends BaseXmlDataType<DataType> {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#getElementName()
+ */
+ @Override
+ public String getElementName() {
+ return "import";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#writeBody(javax.xml.stream.XMLStreamWriter, org.eclipse.osee.framework.ui.data.model.editor.model.DataType)
+ */
+ @Override
+ protected void writeBody(XMLStreamWriter writer, DataType dataType) throws XMLStreamException {
+ writer.writeAttribute("type", dataType.getClass().getSimpleName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#newDataTypeInstance()
+ */
+ @Override
+ protected DataType newDataTypeInstance() {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlFactory.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlFactory.java
new file mode 100644
index 00000000000..30ce31e0e7c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlFactory.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.framework.ui.data.model.editor.model.xml;
+
+import java.util.HashMap;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMXmlFactory {
+ private final HashMap<String, BaseXmlDataType<?>> writerMap;
+
+ public ODMXmlFactory() {
+ writerMap = new HashMap<String, BaseXmlDataType<?>>();
+ writerMap.put(ArtifactDataType.class.getSimpleName(), new ArtifactDataTypeXml());
+ writerMap.put(AttributeDataType.class.getSimpleName(), new AttributeDataTypeXml());
+ writerMap.put(RelationDataType.class.getSimpleName(), new RelationDataTypeXml());
+ writerMap.put(DataType.class.getSimpleName(), new ImportDataTypeXml());
+ }
+
+ @SuppressWarnings("unchecked")
+ public BaseXmlDataType<DataType> getXmlDataType(Class clazzToGet) {
+ return (BaseXmlDataType<DataType>) writerMap.get(clazzToGet.getSimpleName());
+ }
+
+ @SuppressWarnings("unchecked")
+ public BaseXmlDataType<DataType> getXmlDataType(String clazzToGet) {
+ return (BaseXmlDataType<DataType>) writerMap.get(clazzToGet);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlReader.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlReader.java
new file mode 100644
index 00000000000..146e0e865ac
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlReader.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.framework.ui.data.model.editor.model.xml;
+
+import java.io.InputStream;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMXmlReader {
+
+ private final ODMXmlFactory xmlDataTypeFactory;
+ private final XMLStreamReader reader;
+
+ public ODMXmlReader(InputStream inputStream) throws OseeCoreException {
+ try {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ reader = factory.createXMLStreamReader(inputStream, "UTF-8");
+ xmlDataTypeFactory = new ODMXmlFactory();
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ public void execute(IProgressMonitor monitor) throws XMLStreamException {
+ while (reader.hasNext()) {
+ int eventType = reader.getEventType();
+ switch (eventType) {
+ case XMLStreamConstants.START_ELEMENT:
+ String element = reader.getLocalName();
+ BaseXmlDataType<DataType> handler = xmlDataTypeFactory.getXmlDataType(element);
+ if (handler != null) {
+ // handler.fromXml(reader, collector);
+ }
+ break;
+ default:
+ break;
+ }
+ reader.next();
+ }
+ }
+
+ public void close() throws XMLStreamException {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlWriter.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlWriter.java
new file mode 100644
index 00000000000..70cd14d9675
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/ODMXmlWriter.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.framework.ui.data.model.editor.model.xml;
+
+import java.io.OutputStream;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMXmlWriter {
+
+ private final XMLStreamWriter writer;
+ private final ODMXmlFactory xmlDataTypeFactory;
+
+ public ODMXmlWriter(OutputStream outputStream) throws OseeCoreException {
+ try {
+ XMLOutputFactory factory = XMLOutputFactory.newInstance();
+ writer = factory.createXMLStreamWriter(outputStream, "UTF-8");
+ writer.writeStartDocument("UTF-8", "1.0");
+ writer.writeStartElement("oseeTypes");
+ xmlDataTypeFactory = new ODMXmlFactory();
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ public void write(IProgressMonitor monitor, ArtifactDataType... artifacts) throws OseeCoreException {
+ try {
+ if (artifacts != null && artifacts.length > 0) {
+ Set<ArtifactDataType> superTypes = new HashSet<ArtifactDataType>();
+ Set<ArtifactDataType> artifactCache = new HashSet<ArtifactDataType>();
+ Set<AttributeDataType> attributeCache = new HashSet<AttributeDataType>();
+ Set<RelationDataType> relationCache = new HashSet<RelationDataType>();
+
+ for (ArtifactDataType artifact : artifacts) {
+ artifactCache.add(artifact);
+ if (artifact.getSuperType() != null) {
+ superTypes.add(artifact.getSuperType());
+ }
+ attributeCache.addAll(artifact.getLocalAttributes());
+ relationCache.addAll(artifact.getLocalRelations());
+ }
+
+ List<ArtifactDataType> toImport = Collections.setComplement(superTypes, artifactCache);
+ if (!toImport.isEmpty()) {
+ BaseXmlDataType<DataType> toReturn = xmlDataTypeFactory.getXmlDataType(DataType.class);
+ writer.writeStartElement("imports");
+ for (ArtifactDataType artifact : toImport) {
+ toReturn.write(writer, artifact);
+ }
+ writer.writeEndElement();
+ }
+
+ writeCollection(monitor, attributeCache);
+ writeCollection(monitor, relationCache);
+ writeCollection(monitor, artifactCache);
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ private void writeCollection(IProgressMonitor monitor, Collection<? extends DataType> collection) throws XMLStreamException {
+ if (!collection.isEmpty()) {
+ Class<?> clazz = collection.iterator().next().getClass();
+ BaseXmlDataType<DataType> toReturn = xmlDataTypeFactory.getXmlDataType(clazz);
+ String typeName = clazz.getSimpleName();
+ writer.writeStartElement(typeName);
+ int index = 0;
+ int total = collection.size();
+ for (DataType dataType : collection) {
+ monitor.subTask(String.format("Writing %s [%s of %s]", typeName, ++index, total));
+ toReturn.write(writer, dataType);
+ }
+ monitor.worked(ODMConstants.SHORT_TASK_STEPS);
+ writer.writeEndElement();
+ }
+ }
+
+ public void close() throws XMLStreamException {
+ try {
+ writer.writeEndElement();
+ writer.writeEndDocument();
+ } finally {
+ try {
+ writer.flush();
+ } finally {
+ if (writer != null) {
+ writer.close();
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/RelationDataTypeXml.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/RelationDataTypeXml.java
new file mode 100644
index 00000000000..aa97214b990
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/model/xml/RelationDataTypeXml.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.framework.ui.data.model.editor.model.xml;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationDataTypeXml extends BaseXmlDataType<RelationDataType> {
+ private final String RELATION_TAG = "relation";
+
+ private final String ORDER = "order";
+ private final String SIDE_A_NAME = "sideAName";
+ private final String SIDE_B_NAME = "sideBName";
+
+ private final String SHORT_NAME = "shortName";
+ private final String A_TO_B_PHRASE = "aToBPhrase";
+ private final String B_TO_A_PHRASE = "bToAPhrase";
+
+ public RelationDataTypeXml() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.utility.ODMXmlWriter.DataTypeWriter#getElementName()
+ */
+ @Override
+ public String getElementName() {
+ return RELATION_TAG;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.utility.ODMXmlWriter.DataTypeWriter#writeBody(org.eclipse.osee.framework.ui.data.model.editor.model.DataType)
+ */
+ @Override
+ protected void writeBody(XMLStreamWriter writer, RelationDataType dataType) throws XMLStreamException {
+ writeTextElement(writer, ORDER, String.valueOf(dataType.getOrdered()));
+ writeTextElement(writer, SIDE_A_NAME, dataType.getSideAName());
+ writeTextElement(writer, SIDE_B_NAME, dataType.getSideBName());
+ writeTextElement(writer, SHORT_NAME, dataType.getShortName());
+ writeTextElement(writer, A_TO_B_PHRASE, dataType.getAToBPhrase());
+ writeTextElement(writer, B_TO_A_PHRASE, dataType.getBToAPhrase());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#populateFromTextElement(org.eclipse.osee.framework.ui.data.model.editor.model.DataType, java.lang.String, java.lang.String)
+ */
+ @Override
+ protected void populateFromTextElement(RelationDataType dataType, String tag, String text) throws XMLStreamException {
+ super.populateFromTextElement(dataType, tag, text);
+ if (ORDER.equals(tag)) dataType.setOrdered(Boolean.parseBoolean(text));
+ if (SIDE_A_NAME.equals(tag)) dataType.setSideAName(text);
+ if (SIDE_B_NAME.equals(tag)) dataType.setSideBName(text);
+ if (SHORT_NAME.equals(tag)) dataType.setShortName(text);
+ if (A_TO_B_PHRASE.equals(tag)) dataType.setAToBPhrase(text);
+ if (B_TO_A_PHRASE.equals(tag)) dataType.setBToAPhrase(text);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.model.xml.BaseXmlDataType#newDataTypeInstance()
+ */
+ @Override
+ protected RelationDataType newDataTypeInstance() {
+ return new RelationDataType();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMLoadGraphRunnable.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMLoadGraphRunnable.java
new file mode 100644
index 00000000000..f56734c1f11
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMLoadGraphRunnable.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.framework.ui.data.model.editor.operation;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditorInput;
+import org.eclipse.osee.framework.ui.data.model.editor.input.OseeDataTypeFactory;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeSource;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMLoadGraphRunnable implements IExceptionableRunnable {
+
+ private GraphicalViewer viewer;
+ private ODMEditor editor;
+ private ODMEditorInput input;
+
+ public ODMLoadGraphRunnable(GraphicalViewer viewer, ODMEditor editor, ODMEditorInput input) {
+ super();
+ this.viewer = viewer;
+ this.editor = editor;
+ this.input = input;
+ }
+
+ public String getName() {
+ return "Loading Osee Data Type Graph";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.IExceptionableRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ monitor.beginTask(getName(), ODMConstants.TOTAL_STEPS);
+ monitor.worked(ODMConstants.SHORT_TASK_STEPS);
+ monitor.setTaskName("Initializating cache");
+ DataTypeCache dataTypeCache = input.getDataTypeCache();
+ dataTypeCache.clear();
+ monitor.worked(ODMConstants.SHORT_TASK_STEPS);
+
+ OseeDataTypeFactory.addTypesFromDataStore(dataTypeCache);
+ monitor.worked(ODMConstants.SHORT_TASK_STEPS);
+
+ IResource resource = input.getResource();
+ if (resource != null) {
+ DataTypeSource dataTypeSource = OseeDataTypeFactory.loadFromFile(resource.getFullPath());
+ dataTypeCache.addDataTypeSource(dataTypeSource);
+ }
+ monitor.worked(ODMConstants.SHORT_TASK_STEPS);
+
+ if (editor != null) {
+ monitor.setTaskName("Drawing graph");
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ viewer.setContents(new ODMDiagram(input.getDataTypeCache()));
+ editor.updatePalette();
+ }
+ });
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMToXmlOperation.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMToXmlOperation.java
new file mode 100644
index 00000000000..a96a6fec1e7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/ODMToXmlOperation.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.operation;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.xml.ODMXmlWriter;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMToXmlOperation {
+ private final String filePath;
+ private final ArtifactDataType[] dataTypes;
+ private final boolean exportAsSingleFile;
+
+ public ODMToXmlOperation(String filePath, boolean exportAsSingleFile, ArtifactDataType... dataTypes) {
+ this.filePath = filePath;
+ this.dataTypes = dataTypes;
+ this.exportAsSingleFile = exportAsSingleFile;
+ }
+
+ public void execute(IProgressMonitor monitor) throws OseeCoreException {
+ try {
+ monitor.beginTask(String.format("Writing [%s] types to xml [%s]", dataTypes.length, filePath),
+ ODMConstants.TOTAL_STEPS);
+ if (exportAsSingleFile) {
+ writeToSingleFile(monitor);
+ } else {
+ writeToMultiFiles(monitor);
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ monitor.subTask("");
+ monitor.done();
+ }
+ }
+
+ private void writeToSingleFile(IProgressMonitor monitor) throws Exception {
+ File file = new File(filePath);
+ File parent = file.getParentFile();
+ if (parent != null && !parent.exists()) {
+ parent.mkdirs();
+ }
+ writeXml(monitor, file, dataTypes);
+ monitor.worked(ODMConstants.VERY_LONG_TASK);
+ }
+
+ private void writeToMultiFiles(IProgressMonitor monitor) throws Exception {
+ File directory = new File(filePath);
+ if (directory != null && !directory.exists()) {
+ directory.mkdirs();
+ }
+ HashCollection<String, ArtifactDataType> typesByNamespace = new HashCollection<String, ArtifactDataType>();
+ for (ArtifactDataType type : dataTypes) {
+ typesByNamespace.put(type.getNamespace(), type);
+ }
+ for (String key : typesByNamespace.keySet()) {
+ Collection<ArtifactDataType> types = typesByNamespace.getValues(key);
+ if (types != null && !types.isEmpty()) {
+ String fileName = getFileName(key);
+ monitor.subTask(String.format("Writing [%s] types into [%s]", types.size(), fileName));
+ File file = new File(directory, fileName);
+ writeXml(monitor, file, types.toArray(new ArtifactDataType[types.size()]));
+ }
+ monitor.worked(ODMConstants.SHORT_TASK_STEPS);
+ }
+ }
+
+ private String getFileName(String key) {
+ return String.format("osee.types.%s.xml", key);
+ }
+
+ private void writeXml(IProgressMonitor listener, File file, ArtifactDataType... types) throws Exception {
+ OutputStream outputStream = null;
+ ODMXmlWriter xmlWriter = null;
+ try {
+ if (types != null && types.length > 0) {
+ outputStream = new FileOutputStream(file);
+ xmlWriter = new ODMXmlWriter(outputStream);
+ xmlWriter.write(listener, dataTypes);
+ } else {
+ throw new Exception(String.format("Data not available - invalid artifact types"));
+ }
+ } finally {
+ try {
+ if (xmlWriter != null) {
+ xmlWriter.close();
+ }
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/XmlToODMOperation.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/XmlToODMOperation.java
new file mode 100644
index 00000000000..b44752ad4fc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/operation/XmlToODMOperation.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.framework.ui.data.model.editor.operation;
+
+import java.io.File;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlToODMOperation {
+
+ private final File[] resources;
+
+ public XmlToODMOperation(File[] resources) {
+ this.resources = resources;
+ }
+
+ public void execute(IProgressMonitor listener) throws OseeCoreException {
+ try {
+
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/outline/OutlineTreePartFactory.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/outline/OutlineTreePartFactory.java
new file mode 100644
index 00000000000..29ccd7f1974
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/outline/OutlineTreePartFactory.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.data.model.editor.outline;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.osee.framework.ui.data.model.editor.part.StringEditPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutlineTreePartFactory implements EditPartFactory {
+
+ public OutlineTreePartFactory() {
+ super();
+ }
+
+ public EditPart createEditPart(EditPart context, Object model) {
+ EditPart toReturn = null;
+ if (model instanceof String) {
+ toReturn = new StringEditPart((String) model);
+ }
+ // if (model instanceof Diagram) {
+ // return new DiagramTreeEditPart((Diagram) model);
+ // } else if (model instanceof EPackage) {
+ // return new PackageTreeEditPart((EPackage) model);
+ // } else if (model instanceof EClassifier) {
+ // return new ClassifierTreeEditPart((EClassifier) model);
+ // } else if (model instanceof EReference) {
+ // return new ReferenceTreeEditPart((EReference) model);
+ // } else if (model instanceof InheritanceModel) {
+ // return new InheritanceTreeEditPart((InheritanceModel) model);
+ // }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ArtifactEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ArtifactEditPart.java
new file mode 100644
index 00000000000..4248fd55d7e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ArtifactEditPart.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.part;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.requests.CreateConnectionRequest;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gef.requests.ReconnectRequest;
+import org.eclipse.osee.framework.ui.data.model.editor.command.CreateAttributeCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.CreateConnectionCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.CreateRelationCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.ReconnectConnectionCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.ArtifactTypeFigure;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.SelectableLabel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.InheritanceLinkModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationLinkModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel.ContainerType;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactEditPart extends DataTypeEditPart {
+
+ @SuppressWarnings("unchecked")
+ private List children;
+
+ public ArtifactEditPart(Object model) {
+ super((ArtifactDataType) model);
+ }
+
+ protected void createEditPolicies() {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.LAYOUT_ROLE, new ArtifactLayoutEditPolicy());
+ installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ArtifactGraphicalNodeEditPolicy());
+ }
+
+ protected IFigure createFigure() {
+ return new ArtifactTypeFigure(new Label(), new SelectableLabel());
+ }
+
+ public IFigure getContentPane() {
+ return ((ArtifactTypeFigure) getFigure()).getContentPane();
+ }
+
+ protected IFigure getDirectEditFigure() {
+ return ((ArtifactTypeFigure) getFigure()).getNameFigure();
+ }
+
+ private ArtifactDataType getArtifactDataType() {
+ return (ArtifactDataType) getDataType();
+ }
+
+ public boolean canDeleteFromDiagram() {
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List getModelChildren() {
+ ArtifactDataType model = getArtifactDataType();
+ if (children == null) {
+ children = new ArrayList();
+ children.add(new ContainerModel(model, ContainerType.INHERITED_ATTRIBUTES));
+ children.add(new ContainerModel(model, ContainerType.LOCAL_ATTRIBUTES));
+ children.add(new ContainerModel(model, ContainerType.INHERITED_RELATIONS));
+ children.add(new ContainerModel(model, ContainerType.LOCAL_RELATIONS));
+ }
+ // checkInheritance();
+ return children;
+ }
+
+ // private void checkInheritance() {
+ // // ArtifactDataType model = getArtifactDataType();
+ //
+ // // for (ArtifactDataType key : toRemove) {
+ // // InheritanceLinkModel link = inheritanceMap.remove(key);
+ // // if (link != null) {
+ // // children.remove(link);
+ // // }
+ // // }
+ // }
+
+ protected void refreshVisuals() {
+ super.refreshVisuals();
+ ArtifactTypeFigure artifactTypeFigure = ((ArtifactTypeFigure) getFigure());
+ artifactTypeFigure.setHeaderIcon(getArtifactDataType().getImage());
+ ((Label) artifactTypeFigure.getNamespaceFigure()).setText(ODMConstants.getNamespace(getArtifactDataType()));
+ ((Label) artifactTypeFigure.getNameFigure()).setText(getArtifactDataType().getName());
+
+ artifactTypeFigure.getNamespaceFigure().setFont(null);
+ artifactTypeFigure.getNameFigure().setFont(null);
+
+ getFigure().setBackgroundColor(ColorConstants.white);
+ super.refreshChildren();
+ }
+
+ protected void handleModelEvent(Object msg) {
+ refreshVisuals();
+ }
+
+ private final class ArtifactLayoutEditPolicy extends LayoutEditPolicy {
+ protected EditPolicy createChildEditPolicy(EditPart child) {
+ return null;
+ }
+
+ protected Command getCreateCommand(CreateRequest request) {
+ if (request.getNewObject() instanceof AttributeDataType) {
+ return new CreateAttributeCommand((AttributeDataType) request.getNewObject(),
+ ((ArtifactEditPart) getHost()).getArtifactDataType());
+ } else if (request.getNewObject() instanceof RelationDataType) {
+ return new CreateRelationCommand(((RelationDataType) request.getNewObject()),
+ ((ArtifactEditPart) getHost()).getArtifactDataType());
+ }
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ protected Command getDeleteDependantCommand(Request request) {
+ return null;
+ }
+
+ protected Command getMoveChildrenCommand(Request request) {
+ return UnexecutableCommand.INSTANCE;
+ }
+ }
+
+ private final class ArtifactGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy {
+ protected Command getConnectionCompleteCommand(CreateConnectionRequest request) {
+ CreateConnectionCommand cmd = (CreateConnectionCommand) request.getStartCommand();
+ cmd.setTarget((ArtifactDataType) getHost().getModel());
+ return cmd;
+ }
+
+ protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
+ ConnectionModel<?> connectionModel = (ConnectionModel<?>) request.getNewObject();
+ if (connectionModel instanceof RelationLinkModel || connectionModel instanceof InheritanceLinkModel) {
+ ArtifactDataType source = (ArtifactDataType) getHost().getModel();
+ Command cmd = new CreateConnectionCommand(connectionModel, source);
+ request.setStartCommand(cmd);
+ return cmd;
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Command getReconnectSourceCommand(ReconnectRequest request) {
+ ConnectionModel<ArtifactDataType> connectionModel =
+ (ConnectionModel<ArtifactDataType>) request.getConnectionEditPart().getModel();
+ if (connectionModel instanceof RelationLinkModel || connectionModel instanceof InheritanceLinkModel) {
+ ArtifactDataType source = (ArtifactDataType) getHost().getModel();
+ ReconnectConnectionCommand cmd = new ReconnectConnectionCommand(connectionModel);
+ cmd.setNewSource(source);
+ return cmd;
+ }
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Command getReconnectTargetCommand(ReconnectRequest request) {
+ ConnectionModel<ArtifactDataType> connectionModel =
+ (ConnectionModel<ArtifactDataType>) request.getConnectionEditPart().getModel();
+ if (connectionModel instanceof RelationLinkModel || connectionModel instanceof InheritanceLinkModel) {
+ ArtifactDataType target = (ArtifactDataType) getHost().getModel();
+ ReconnectConnectionCommand cmd = new ReconnectConnectionCommand(connectionModel);
+ cmd.setNewTarget(target);
+ return cmd;
+ }
+ return UnexecutableCommand.INSTANCE;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/AttributeEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/AttributeEditPart.java
new file mode 100644
index 00000000000..f49733ad970
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/AttributeEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.SelectableLabel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel.ContainerType;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeEditPart extends ComponentEditPart {
+
+ public AttributeEditPart(Object model) {
+ super((AttributeDataType) model);
+ }
+
+ @Override
+ protected boolean isInherited() {
+ ContainerType value = getContainerType();
+ return value != null && value == ContainerType.INHERITED_ATTRIBUTES;
+ }
+
+ protected void refreshVisuals() {
+ SelectableLabel labelFigure = (SelectableLabel) getFigure();
+ String displayText = ODMConstants.getDataTypeText(getModelAsDataType());
+ labelFigure.setText(displayText);
+ labelFigure.setIcon(ODMImages.getImage(ODMImages.LOCAL_ATTRIBUTE));
+ labelFigure.setSelectable(true);
+
+ if (isInherited()) {
+ labelFigure.setBackgroundColor(ColorConstants.tooltipBackground);
+ labelFigure.setIcon(ODMImages.getImage(ODMImages.INHERITED_ATTRIBUTE));
+ labelFigure.setSelectable(false);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/BaseEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/BaseEditPart.java
new file mode 100644
index 00000000000..da47b9c366a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/BaseEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.text.TextFlow;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.ComponentEditPolicy;
+import org.eclipse.gef.editpolicies.DirectEditPolicy;
+import org.eclipse.gef.requests.GroupRequest;
+import org.eclipse.gef.tools.CellEditorLocator;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.gef.tools.SelectEditPartTracker;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.command.DeleteCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.SelectableLabel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.IModelListener;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel;
+import org.eclipse.osee.framework.ui.data.model.editor.policy.LabelSelectionEditPolicy;
+import org.eclipse.osee.framework.ui.data.model.editor.property.PropertySourceFactory;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseEditPart extends AbstractGraphicalEditPart {
+
+ protected DirectEditManager manager;
+
+ protected IModelListener modelListener = new IModelListener() {
+
+ @Override
+ public void onModelEvent(Object object) {
+ handleModelEvent(object);
+ }
+ };
+
+ public BaseEditPart(NodeModel obj) {
+ super();
+ setModel(obj);
+ }
+
+ protected abstract void handleModelEvent(Object object);
+
+ public void activate() {
+ super.activate();
+ ((NodeModel) getModel()).addListener(modelListener);
+ }
+
+ protected abstract DirectEditPolicy createDirectEditPolicy();
+
+ public boolean canDeleteFromDiagram() {
+ return false;
+ }
+
+ protected void createEditPolicies() {
+ installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, createDirectEditPolicy());
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new LabelSelectionEditPolicy());
+ installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
+ protected Command createDeleteCommand(GroupRequest deleteRequest) {
+ Command toReturn = UnexecutableCommand.INSTANCE;
+
+ Object model = ((AbstractGraphicalEditPart) getParent()).getModel();
+ if (model != null) {
+ Boolean booleanObject =
+ (Boolean) deleteRequest.getExtendedData().get(DeleteCommand.DELETE_FROM_ODM_DIAGRAM);
+ boolean isDeleteFromDiagram = booleanObject == null ? false : booleanObject.booleanValue();
+
+ if (model instanceof ContainerModel) {
+ DeleteCommand cmd = new DeleteCommand();
+ cmd.setPartToBeDeleted(getHost().getModel(), ((ContainerModel) model).getArtifact(),
+ isDeleteFromDiagram);
+ toReturn = cmd;
+ } else if (model instanceof ODMDiagram && getHost().getModel() instanceof ArtifactDataType) {
+ DeleteCommand cmd = new DeleteCommand();
+ cmd.setPartToBeDeleted(getHost().getModel(), model, isDeleteFromDiagram);
+ toReturn = cmd;
+ }
+ }
+ return toReturn;
+ }
+ });
+ }
+
+ protected IFigure createFigure() {
+ IFigure fig = new SelectableLabel();
+ fig.setBorder(new MarginBorder(0, 1, 0, 0));
+ return fig;
+ }
+
+ public void deactivate() {
+ ((NodeModel) getModel()).removeListener(modelListener);
+ super.deactivate();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class key) {
+ if (IPropertySource.class == key) {
+ return PropertySourceFactory.getPropertySource(getModel());
+ }
+ return super.getAdapter(key);
+ }
+
+ IFigure getDirectEditFigure() {
+ return getFigure();
+ }
+
+ String getDirectEditText() {
+ IFigure fig = getDirectEditFigure();
+ if (fig instanceof Label) {
+ return ((Label) fig).getText();
+ } else if (fig instanceof TextFlow) {
+ return ((TextFlow) fig).getText();
+ }
+ return "";
+ }
+
+ public DragTracker getDragTracker(Request request) {
+ return new SelectEditPartTracker(this);
+ }
+
+ protected void performDirectEdit() {
+ if (manager == null) {
+ manager = new LabelDirectEditManager(this, new LabelCellEditorLocator(getDirectEditFigure()));
+ }
+ manager.show();
+ }
+
+ public void performRequest(Request request) {
+ if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
+ performDirectEdit();
+ } else {
+ super.performRequest(request);
+ }
+ }
+
+ private final class LabelCellEditorLocator implements CellEditorLocator {
+
+ protected IFigure fig;
+
+ public LabelCellEditorLocator(IFigure figure) {
+ fig = figure;
+ }
+
+ public void relocate(CellEditor celleditor) {
+ Text text = (Text) celleditor.getControl();
+
+ Rectangle rect = fig.getClientArea(Rectangle.SINGLETON);
+ if (fig instanceof Label) {
+ rect = ((Label) fig).getTextBounds().intersect(rect);
+ }
+ fig.translateToAbsolute(rect);
+
+ org.eclipse.swt.graphics.Rectangle trim = text.computeTrim(0, 0, 0, 0);
+ rect.translate(trim.x, trim.y);
+ rect.width += trim.width;
+ rect.height += trim.height;
+
+ text.setBounds(rect.x, rect.y, rect.width, rect.height);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ComponentEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ComponentEditPart.java
new file mode 100644
index 00000000000..40781de4edc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ComponentEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.DirectEditPolicy;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.osee.framework.ui.data.model.editor.command.ChangeNameCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel.ContainerType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class ComponentEditPart extends BaseEditPart {
+
+ public ComponentEditPart(DataType dataType) {
+ super(dataType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.part.BaseEditPart#createDirectEditPolicy()
+ */
+ @Override
+ protected DirectEditPolicy createDirectEditPolicy() {
+ return new DirectEditPolicy() {
+ protected Command getDirectEditCommand(DirectEditRequest request) {
+ return new ChangeNameCommand(getModelAsDataType(), (String) request.getCellEditor().getValue());
+ }
+
+ protected void showCurrentEditValue(DirectEditRequest request) {
+ ((Label) getFigure()).setText((String) request.getCellEditor().getValue());
+ getFigure().getUpdateManager().performUpdate();
+ }
+ };
+ }
+
+ protected ContainerType getContainerType() {
+ ContainerEditPart internalArtifactEditPart = ((ContainerEditPart) getParent());
+ return internalArtifactEditPart.getContainerType();
+ }
+
+ protected DataType getModelAsDataType() {
+ return (DataType) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.part.BaseEditPart#handleModelEvent(java.lang.Object)
+ */
+ @Override
+ protected void handleModelEvent(Object object) {
+ refreshVisuals();
+ }
+
+ protected String getDirectEditText() {
+ return getModelAsDataType().getName();
+ }
+
+ @Override
+ protected void performDirectEdit() {
+ if (!isInherited()) {
+ super.performDirectEdit();
+ }
+ }
+
+ protected abstract boolean isInherited();
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ConnectionEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ConnectionEditPart.java
new file mode 100644
index 00000000000..31c4265d776
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ConnectionEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gef.editparts.AbstractConnectionEditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.BendpointEditPolicy;
+import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
+import org.eclipse.gef.requests.BendpointRequest;
+import org.eclipse.gef.requests.GroupRequest;
+import org.eclipse.osee.framework.ui.data.model.editor.command.CreateBendpointCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.DeleteBendpointCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.DeleteCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.MoveBendpointCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.IModelListener;
+import org.eclipse.osee.framework.ui.data.model.editor.policy.ConnectionModelEndpointEditPolicy;
+import org.eclipse.osee.framework.ui.data.model.editor.property.PropertySourceFactory;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConnectionEditPart extends AbstractConnectionEditPart {
+
+ protected IModelListener modelListener = new IModelListener() {
+
+ @Override
+ public void onModelEvent(Object object) {
+ handleModelEvent(object);
+ }
+ };
+
+ public ConnectionEditPart(Object connectionModel) {
+ super();
+ setModel((ConnectionModel<?>) connectionModel);
+ }
+
+ public void activate() {
+ super.activate();
+ getConnectionModel().addListener(modelListener);
+ }
+
+ protected void createEditPolicies() {
+ installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionModelEndpointEditPolicy());
+
+ installEditPolicy(EditPolicy.CONNECTION_ROLE, new ConnectionEditPolicy() {
+ protected Command getDeleteCommand(GroupRequest request) {
+ Command toReturn = UnexecutableCommand.INSTANCE;
+ Object model = ((AbstractGraphicalEditPart) getParent()).getModel();
+ if (model != null) {
+ Boolean isBooleanObject = (Boolean) request.getExtendedData().get(DeleteCommand.DELETE_FROM_ODM_DIAGRAM);
+ boolean isDeleteFromDiagram = isBooleanObject == null ? false : isBooleanObject.booleanValue();
+ if (isDeleteFromDiagram) {
+ DeleteCommand deleteCmd = new DeleteCommand();
+ deleteCmd.setPartToBeDeleted(getHost().getModel(), model, isDeleteFromDiagram);
+ toReturn = deleteCmd;
+ }
+ }
+ return toReturn;
+ }
+ });
+
+ installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new BendpointEditPolicy() {
+
+ protected Command getCreateBendpointCommand(BendpointRequest request) {
+ Point location = request.getLocation();
+ getConnection().translateToRelative(location);
+ return new CreateBendpointCommand((ConnectionModel<?>) request.getSource().getModel(), location,
+ request.getIndex());
+ }
+
+ protected Command getDeleteBendpointCommand(BendpointRequest request) {
+ return new DeleteBendpointCommand((ConnectionModel<?>) getHost().getModel(), request.getIndex());
+ }
+
+ protected Command getMoveBendpointCommand(BendpointRequest request) {
+ Point location = request.getLocation();
+ getConnection().translateToRelative(location);
+ return new MoveBendpointCommand((ConnectionModel<?>) request.getSource().getModel(), location,
+ request.getIndex());
+ }
+ });
+
+ }
+
+ protected IFigure createFigure() {
+ PolylineConnection conn = new PolylineConnection();
+ conn.setLineStyle(Graphics.LINE_DASHDOT);
+ return conn;
+ }
+
+ public void deactivate() {
+ getConnectionModel().removeListener(modelListener);
+ super.deactivate();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (IPropertySource.class == adapter) {
+ return PropertySourceFactory.getPropertySource(getModel());
+ }
+ return super.getAdapter(adapter);
+ }
+
+ protected ConnectionModel<?> getConnectionModel() {
+ return (ConnectionModel<?>) getModel();
+ }
+
+ protected void handleModelEvent(Object object) {
+ refreshVisuals();
+ refreshSourceAnchor();
+ refreshTargetAnchor();
+ }
+
+ protected void refreshVisuals() {
+ getConnectionFigure().setRoutingConstraint(getConnectionModel().getBendpoints());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ContainerEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ContainerEditPart.java
new file mode 100644
index 00000000000..cd9abd7c600
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ContainerEditPart.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.framework.ui.data.model.editor.part;
+
+import java.util.List;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.CompartmentFigure;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel.ContainerType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ContainerEditPart extends AbstractGraphicalEditPart {
+
+ public ContainerEditPart(Object model) {
+ super();
+ setModel(model);
+ }
+
+ protected void createEditPolicies() {
+ }
+
+ protected IFigure createFigure() {
+ IFigure figure = new CompartmentFigure();
+ return figure;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List getModelChildren() {
+ if (getModel() instanceof ContainerModel) {
+ return ((ContainerModel) getModel()).getChildren();
+ } else {
+ return (List) getModel();
+ }
+ }
+
+ public boolean isSelectable() {
+ return false;
+ }
+
+ public ContainerType getContainerType() {
+ if (getModel() instanceof ContainerModel) {
+ return ((ContainerModel) getModel()).getContainerType();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DataTypeEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DataTypeEditPart.java
new file mode 100644
index 00000000000..456b993d75f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DataTypeEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.DirectEditPolicy;
+import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.osee.framework.ui.data.model.editor.command.ChangeNameCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class DataTypeEditPart extends NodeModelEditPart {
+
+ public DataTypeEditPart(DataType model) {
+ super(model);
+ }
+
+ public void activate() {
+ super.activate();
+ getDataType().addListener(modelListener);
+ }
+
+ protected DirectEditPolicy createDirectEditPolicy() {
+ return new DirectEditPolicy() {
+ protected Command getDirectEditCommand(DirectEditRequest request) {
+ return new ChangeNameCommand(getDataType(), (String) request.getCellEditor().getValue());
+ }
+
+ protected void showCurrentEditValue(DirectEditRequest request) {
+ IFigure fig = getDirectEditFigure();
+ if (fig instanceof Label) {
+ ((Label) fig).setText((String) request.getCellEditor().getValue());
+ fig.getUpdateManager().performUpdate();
+ }
+ }
+ };
+ }
+
+ protected void createEditPolicies() {
+ super.createEditPolicies();
+ // installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new GraphicalNodeEditPolicy() {
+ // protected Command getConnectionCompleteCommand(CreateConnectionRequest request) {
+ // Link link = (Link) request.getNewObject();
+ // if (link instanceof ReferenceView || link instanceof InheritanceView) return null;
+ // LinkCreationCommand cmd = (LinkCreationCommand) request.getStartCommand();
+ // cmd.setTarget((Node) getHost().getModel());
+ // return cmd;
+ // }
+ //
+ // protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
+ // return null;
+ // }
+ //
+ // protected Command getReconnectSourceCommand(ReconnectRequest request) {
+ // return UnexecutableCommand.INSTANCE;
+ // }
+ //
+ // protected Command getReconnectTargetCommand(ReconnectRequest request) {
+ // Link link = (Link) request.getConnectionEditPart().getModel();
+ // if (link instanceof ReferenceView || link instanceof InheritanceView) return UnexecutableCommand.INSTANCE;
+ // return new ReconnectLinkCommand(link, (Node) getHost().getModel(), false);
+ // }
+ // });
+ }
+
+ public void deactivate() {
+ getDataType().removeListener(modelListener);
+ super.deactivate();
+ }
+
+ protected DataType getDataType() {
+ return (DataType) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.part.BaseEditPart#handleModelChanged(java.lang.Object)
+ */
+ @Override
+ protected void handleModelEvent(Object msg) {
+ refreshVisuals();
+ super.handleModelEvent(msg);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DiagramEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DiagramEditPart.java
new file mode 100644
index 00000000000..16a13bd832f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/DiagramEditPart.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.framework.ui.data.model.editor.part;
+
+import java.util.List;
+import org.eclipse.draw2d.ConnectionLayer;
+import org.eclipse.draw2d.FanRouter;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FreeformLayer;
+import org.eclipse.draw2d.FreeformLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.ShortestPathConnectionRouter;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.SnapToGeometry;
+import org.eclipse.gef.SnapToHelper;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
+import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
+import org.eclipse.osee.framework.ui.data.model.editor.model.IModelListener;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+import org.eclipse.osee.framework.ui.data.model.editor.policy.DiagramLayoutEditPolicy;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DiagramEditPart extends AbstractGraphicalEditPart implements LayerConstants {
+
+ protected IModelListener modelListener = new IModelListener() {
+
+ @Override
+ public void onModelEvent(Object object) {
+ handleModelEvent(object);
+ }
+ };
+
+ public DiagramEditPart(Object model) {
+ super();
+ setModel((ODMDiagram) model);
+ }
+
+ public void activate() {
+ super.activate();
+ ((ODMDiagram) getModel()).addListener(modelListener);
+ }
+
+ protected IFigure createFigure() {
+ Figure f = new FreeformLayer();
+ f.setBorder(new MarginBorder(5));
+ f.setLayoutManager(new FreeformLayout());
+
+ ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
+ FanRouter router = new FanRouter();
+ router.setSeparation(20);
+ router.setNextRouter(new ShortestPathConnectionRouter(f));
+ connLayer.setConnectionRouter(router);
+ connLayer.setAntialias(SWT.ON);
+
+ return f;
+ }
+
+ protected void createEditPolicies() {
+ installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
+ installEditPolicy(EditPolicy.LAYOUT_ROLE, new DiagramLayoutEditPolicy());
+ installEditPolicy("Snap Feedback", new SnapFeedbackPolicy());
+ }
+
+ public void deactivate() {
+ ((ODMDiagram) getModel()).removeListener(modelListener);
+ super.deactivate();
+ }
+
+ protected void handleModelEvent(Object object) {
+ refreshVisuals();
+ refreshChildren();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (SnapToHelper.class == adapter) {
+ Object snapPropertObject = getViewer().getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED);
+ return Boolean.TRUE.equals(snapPropertObject) ? new SnapToGeometry(this) : null;
+ }
+ return super.getAdapter(adapter);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List getModelChildren() {
+ return ((ODMDiagram) getModel()).getContent();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/InheritanceEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/InheritanceEditPart.java
new file mode 100644
index 00000000000..d1dbb27fbd1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/InheritanceEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PolygonDecoration;
+import org.eclipse.draw2d.PolylineConnection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InheritanceEditPart extends ConnectionEditPart {
+
+ public InheritanceEditPart(Object connectionModel) {
+ super(connectionModel);
+ }
+
+ protected IFigure createFigure() {
+ PolylineConnection connection = new PolylineConnection();
+ PolygonDecoration decoration = new PolygonDecoration();
+ // decor.setScale(14, 6);
+ decoration.setScale(7, 3);
+ decoration.setBackgroundColor(ColorConstants.white);
+ connection.setTargetDecoration(decoration);
+ connection.setLineStyle(Graphics.LINE_DOT);
+ return connection;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/LabelDirectEditManager.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/LabelDirectEditManager.java
new file mode 100644
index 00000000000..90a6430c823
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/LabelDirectEditManager.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.part;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.editparts.ZoomListener;
+import org.eclipse.gef.editparts.ZoomManager;
+import org.eclipse.gef.tools.CellEditorLocator;
+import org.eclipse.gef.tools.DirectEditManager;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.CellEditorActionHandler;
+
+public class LabelDirectEditManager extends DirectEditManager {
+
+ private IActionBars actionBars;
+ private CellEditorActionHandler actionHandler;
+ private double cachedZoom = -1.0;
+ private IAction copy, cut, paste, undo, redo, find, selectAll, delete;
+ private Font scaledFont;
+ private ZoomListener zoomListener = new ZoomListener() {
+ public void zoomChanged(double newZoom) {
+ updateScaledFont(newZoom);
+ }
+ };
+
+ public LabelDirectEditManager(GraphicalEditPart source, CellEditorLocator locator) {
+ super(source, TextCellEditor.class, locator);
+ }
+
+ protected void bringDown() {
+ ZoomManager zoomMgr = (ZoomManager) getEditPart().getViewer().getProperty(ZoomManager.class.toString());
+ zoomMgr.removeZoomListener(zoomListener);
+ if (actionHandler != null) {
+ actionHandler.dispose();
+ actionHandler = null;
+ }
+ if (actionBars != null) {
+ restoreSavedActions(actionBars);
+ actionBars.updateActionBars();
+ actionBars = null;
+ }
+ super.bringDown();
+ disposeScaledFont();
+ }
+
+ /**
+ * Creates a multi-lined text celleditor that can wrap.
+ */
+ protected CellEditor createCellEditorOn(Composite composite) {
+ return new TextCellEditor(composite, SWT.MULTI | SWT.WRAP);
+ }
+
+ private void disposeScaledFont() {
+ if (scaledFont != null) {
+ scaledFont.dispose();
+ scaledFont = null;
+ }
+ }
+
+ /**
+ * Used to determine the initial text of the cell editor and to determine the font size of the text.
+ *
+ * @return the figure being edited
+ */
+ protected IFigure getDirectEditFigure() {
+ return ((BaseEditPart) getEditPart()).getDirectEditFigure();
+ }
+
+ /**
+ * @return the initial value of the text shown in the cell editor for direct-editing; cannot return <code>null</code>
+ */
+ protected String getInitialText() {
+ return ((BaseEditPart) getEditPart()).getDirectEditText();
+ }
+
+ protected void initCellEditor() {
+ getCellEditor().setValue(getInitialText());
+ ZoomManager zoomMgr = (ZoomManager) getEditPart().getViewer().getProperty(ZoomManager.class.toString());
+ cachedZoom = -1.0;
+ updateScaledFont(zoomMgr.getZoom());
+ zoomMgr.addZoomListener(zoomListener);
+ // Hook the cell editor's copy/paste actions to the actionBars so that they can
+ // be invoked via keyboard shortcuts.
+ actionBars =
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorSite().getActionBars();
+ saveCurrentActions(actionBars);
+ actionHandler = new CellEditorActionHandler(actionBars);
+ actionHandler.addCellEditor(getCellEditor());
+ actionBars.updateActionBars();
+ }
+
+ private void restoreSavedActions(IActionBars actionBars) {
+ actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copy);
+ actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), paste);
+ actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), delete);
+ actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAll);
+ actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cut);
+ actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(), find);
+ actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undo);
+ actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), redo);
+ }
+
+ private void saveCurrentActions(IActionBars actionBars) {
+ copy = actionBars.getGlobalActionHandler(ActionFactory.COPY.getId());
+ paste = actionBars.getGlobalActionHandler(ActionFactory.PASTE.getId());
+ delete = actionBars.getGlobalActionHandler(ActionFactory.DELETE.getId());
+ selectAll = actionBars.getGlobalActionHandler(ActionFactory.SELECT_ALL.getId());
+ cut = actionBars.getGlobalActionHandler(ActionFactory.CUT.getId());
+ find = actionBars.getGlobalActionHandler(ActionFactory.FIND.getId());
+ undo = actionBars.getGlobalActionHandler(ActionFactory.UNDO.getId());
+ redo = actionBars.getGlobalActionHandler(ActionFactory.REDO.getId());
+ }
+
+ private void updateScaledFont(double zoom) {
+ if (cachedZoom == zoom) return;
+ Text text = (Text) getCellEditor().getControl();
+ Font font = getEditPart().getFigure().getFont();
+
+ disposeScaledFont();
+ cachedZoom = zoom;
+ if (zoom == 1.0) {
+ text.setFont(font);
+ } else {
+ FontData fd = font.getFontData()[0];
+ fd.setHeight((int) (fd.getHeight() * zoom));
+ text.setFont(scaledFont = new Font(null, fd));
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/NodeModelEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/NodeModelEditPart.java
new file mode 100644
index 00000000000..2d005967418
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/NodeModelEditPart.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.framework.ui.data.model.editor.part;
+
+import java.util.List;
+import org.eclipse.draw2d.ChopboxAnchor;
+import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.NodeEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.gef.tools.DragEditPartsTracker;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class NodeModelEditPart extends BaseEditPart implements NodeEditPart {
+
+ private ChopboxAnchor anchor;
+
+ public NodeModelEditPart(NodeModel model) {
+ super(model);
+ }
+
+ public boolean canDeleteFromDiagram() {
+ return true;
+ }
+
+ protected void createEditPolicies() {
+ super.createEditPolicies();
+ installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
+ installEditPolicy(EditPolicy.LAYOUT_ROLE, new LayoutEditPolicy() {
+ protected EditPolicy createChildEditPolicy(EditPart child) {
+ return null;
+ }
+
+ protected Command getCreateCommand(CreateRequest request) {
+ return null;
+ }
+
+ protected Command getDeleteDependantCommand(Request request) {
+ return null;
+ }
+
+ protected Command getMoveChildrenCommand(Request request) {
+ return null;
+ }
+ });
+ }
+
+ public DragTracker getDragTracker(Request request) {
+ return new DragEditPartsTracker(this);
+ }
+
+ protected NodeModel getNodeModel() {
+ return (NodeModel) getModel();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List<ConnectionModel> getModelSourceConnections() {
+ return getNodeModel().getSourceConnections();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected List<ConnectionModel> getModelTargetConnections() {
+ return getNodeModel().getTargetConnections();
+ }
+
+ public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) {
+ if (anchor == null) anchor = new ChopboxAnchor(getFigure());
+ return anchor;
+ }
+
+ public ConnectionAnchor getSourceConnectionAnchor(Request request) {
+ if (anchor == null) anchor = new ChopboxAnchor(getFigure());
+ return anchor;
+ }
+
+ public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) {
+ if (anchor == null) anchor = new ChopboxAnchor(getFigure());
+ return anchor;
+ }
+
+ public ConnectionAnchor getTargetConnectionAnchor(Request request) {
+ if (anchor == null) anchor = new ChopboxAnchor(getFigure());
+ return anchor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.data.model.editor.part.BaseEditPart#handleModelChanged(java.lang.Object)
+ */
+ @Override
+ protected void handleModelEvent(Object msg) {
+ refreshVisuals();
+ }
+
+ protected void refreshVisuals() {
+ super.refreshVisuals();
+ Rectangle constraint = new Rectangle(0, 0, -1, -1);
+ constraint.setLocation(getNodeModel().getLocation());
+ constraint.width = getNodeModel().getWidth();
+ ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), constraint);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ODMEditPartFactory.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ODMEditPartFactory.java
new file mode 100644
index 00000000000..cdc292cea2a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/ODMEditPartFactory.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.framework.ui.data.model.editor.part;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.InheritanceLinkModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationLinkModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMEditPartFactory implements EditPartFactory {
+
+ public ODMEditPartFactory() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart, java.lang.Object)
+ */
+ public EditPart createEditPart(EditPart context, Object model) {
+ EditPart editPart = null;
+ if (model instanceof ODMDiagram) {
+ editPart = new DiagramEditPart(model);
+ } else if (model instanceof ArtifactDataType) {
+ editPart = new ArtifactEditPart(model);
+ } else if (model instanceof RelationDataType) {
+ editPart = new RelationEditPart(model);
+ } else if (model instanceof AttributeDataType) {
+ editPart = new AttributeEditPart(model);
+ } else if (model instanceof ContainerModel || model instanceof List) {
+ editPart = new ContainerEditPart(model);
+ } else if (model instanceof InheritanceLinkModel) {
+ editPart = new InheritanceEditPart(model);
+ } else if (model instanceof RelationLinkModel) {
+ editPart = new RelationLinkEditPart(model);
+ } else if (model instanceof ConnectionModel) {
+ editPart = new ConnectionEditPart(model);
+ } else if (model instanceof String) {
+ editPart = new StringEditPart((String) model);
+ }
+ if (editPart == null) {
+ String message = String.format("Error no EditPart defined for: [%s]", model.getClass().getName());
+ editPart = new StringEditPart(message);
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, message);
+ } else {
+ editPart.setModel(model);
+ }
+ return editPart;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationEditPart.java
new file mode 100644
index 00000000000..138e759db1b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.SelectableLabel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ContainerModel.ContainerType;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMConstants;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationEditPart extends ComponentEditPart {
+
+ public RelationEditPart(Object model) {
+ super((RelationDataType) model);
+ }
+
+ protected boolean isInherited() {
+ ContainerType value = getContainerType();
+ return value != null && value == ContainerType.INHERITED_RELATIONS;
+ }
+
+ protected void refreshVisuals() {
+ SelectableLabel labelFigure = (SelectableLabel) getFigure();
+ String text = ODMConstants.getDataTypeText(getModelAsDataType());
+ labelFigure.setText(text);
+ labelFigure.setIcon(ODMImages.getImage(ODMImages.LOCAL_RELATION));
+ labelFigure.setSelectable(true);
+
+ if (isInherited()) {
+ labelFigure.setBackgroundColor(ColorConstants.blue);
+ labelFigure.setIcon(ODMImages.getImage(ODMImages.INHERITED_RELATION));
+ labelFigure.setSelectable(false);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationLinkEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationLinkEditPart.java
new file mode 100644
index 00000000000..8542cfe71d5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/RelationLinkEditPart.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.part;
+
+import org.eclipse.draw2d.ConnectionEndpointLocator;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.PolygonDecoration;
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.draw2d.PolylineDecoration;
+import org.eclipse.draw2d.RotatableDecoration;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationLinkModel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationLinkEditPart extends ConnectionEditPart {
+
+ private Label srcCount, srcName, targetCount, targetName;
+ private ConnectionEndpointLocator srcCountLocator, srcNameLocator, targetCountLocator, targetNameLocator;
+ private RotatableDecoration srcDecor, targetDecor;
+
+ // private EReference opposite;
+
+ public RelationLinkEditPart(Object model) {
+ super((RelationLinkModel) model);
+ }
+
+ public void activate() {
+ super.activate();
+ getRelationLink().addListener(modelListener);
+ // updateEOpposite(getEReference().getEOpposite());
+ }
+
+ // private String createCountString(EReference ref) {
+ // int lower = ref.getLowerBound();
+ // int upper = ref.getUpperBound();
+ // if (lower == upper) return "" + lower; //$NON-NLS-1$
+ // return lower + ".." + (upper == -1 ? "n" : "" + upper); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ // }
+
+ protected IFigure createFigure() {
+ PolylineConnection conn = new PolylineConnection();
+
+ // Create the locators
+ srcCountLocator = new ConnectionEndpointLocator(conn, false);
+ srcNameLocator = new ConnectionEndpointLocator(conn, false);
+ srcNameLocator.setVDistance(-4);
+ targetCountLocator = new ConnectionEndpointLocator(conn, true);
+ targetNameLocator = new ConnectionEndpointLocator(conn, true);
+ targetCountLocator.setVDistance(-4);
+ return conn;
+ }
+
+ private PolygonDecoration createPolygonDecoration() {
+ PolygonDecoration decoration = new PolygonDecoration();
+ PointList decorationPointList = new PointList();
+ decorationPointList.addPoint(0, 0);
+ decorationPointList.addPoint(-1, 1);
+ decorationPointList.addPoint(-2, 0);
+ decorationPointList.addPoint(-1, -1);
+ decoration.setTemplate(decorationPointList);
+ return decoration;
+ }
+
+ private PolylineDecoration createPolylineDecoration() {
+ PolylineDecoration decoration = new PolylineDecoration();
+ decoration.setScale(10, 5);
+ return decoration;
+ }
+
+ /**
+ * Upon deactivation, detach from the model element as a property change listener.
+ */
+ public void deactivate() {
+ // updateEOpposite(null);
+ getRelationLink().removeListener(modelListener);
+ super.deactivate();
+ }
+
+ private PolylineConnection getConnection() {
+ return (PolylineConnection) getFigure();
+ }
+
+ // protected EReference getEReference() {
+ // return getRefView().getEReference();
+ // }
+
+ protected RelationLinkModel getRelationLink() {
+ return (RelationLinkModel) getModel();
+ }
+
+ protected void handleModelEvent(Object object) {
+ // updateEOpposite(getEReference().getEOpposite());
+ refreshVisuals();
+ super.handleModelEvent(object);
+ }
+
+ protected void refreshVisuals() {
+ super.refreshVisuals();
+ updateSourceDecoration();
+ updateTargetDecoration();
+ updateSourceCount();
+ updateSourceName();
+ updateTargetCount();
+ updateTargetName();
+ }
+
+ // private void updateEOpposite(EReference opp) {
+ // if (opposite == opp) return;
+ // if (opposite != null) opposite.eAdapters().remove(modelListener);
+ // opposite = opp;
+ // if (opposite != null) opposite.eAdapters().add(modelListener);
+ // }
+
+ private void updateSourceCount() {
+ // if (getRelationDataType().isOppositeShown() && getRelationDataType().getOpposite() != null) {
+ // if (getEReference().isContainment()) {
+ // if (srcCount != null) {
+ // getConnection().remove(srcCount);
+ // srcCount = null;
+ // }
+ // } else {
+ // if (srcCount == null) {
+ // srcCount = new Label();
+ // srcCount.setOpaque(true);
+ // getConnection().add(srcCount, srcCountLocator);
+ // }
+ // srcCount.setText(createCountString(getEReference().getEOpposite()));
+ // }
+ // } else if (srcCount != null) {
+ // getConnection().remove(srcCount);
+ // srcCount = null;
+ // }
+ }
+
+ private void updateSourceDecoration() {
+ // if (getEReference().isContainment()) {
+ if (srcDecor == null) {
+ srcDecor = createPolygonDecoration();
+ getConnection().setSourceDecoration(srcDecor);
+ }
+ // } else
+ // if (srcDecor != null) {
+ // srcDecor = null;
+ getConnection().setSourceDecoration(srcDecor);
+ // }
+ }
+
+ private void updateTargetCount() {
+ // if (getEReference().isContainer() && getRefView().isOppositeShown() && getEReference().getEOpposite() != null) {
+ // if (targetCount != null) {
+ // getConnection().remove(targetCount);
+ // targetCount = null;
+ // }
+ // } else {
+ // if (targetCount == null) {
+ // targetCount = new Label();
+ // targetCount.setOpaque(true);
+ // getConnection().add(targetCount, targetCountLocator);
+ // }
+ // targetCount.setText(createCountString(getEReference()));
+ // }
+ }
+
+ private void updateTargetDecoration() {
+ // if (getRelationDataType().isOppositeShown() && getRelationDataType().getEOpposite() != null) {
+ // if (getEReference().isContainer()) {
+ // if (targetDecor != null && !(targetDecor instanceof PolygonDecoration)) {
+ // getConnection().setTargetDecoration(null);
+ // targetDecor = null;
+ // }
+ // if (targetDecor == null) {
+ // targetDecor = createPolygonDecoration();
+ // getConnection().setTargetDecoration(targetDecor);
+ // }
+ // } else if (targetDecor != null) {
+ // targetDecor = null;
+ // getConnection().setTargetDecoration(targetDecor);
+ // }
+ // } else if (targetDecor == null) {
+ // targetDecor = createPolylineDecoration();
+ // getConnection().setTargetDecoration(targetDecor);
+ // }
+ }
+
+ private void updateTargetName() {
+ if (targetName == null) {
+ targetName = new Label();
+ targetName.setOpaque(true);
+ getConnection().add(targetName, targetNameLocator);
+ }
+ targetName.setText("+" + getRelationLink().getRelation().getSideAName());
+ }
+
+ private void updateSourceName() {
+ // if (getRefView().isOppositeShown() && getEReference().getEOpposite() != null) {
+ if (srcName == null) {
+ srcName = new Label();
+ srcName.setOpaque(true);
+ getConnection().add(srcName, srcNameLocator);
+ }
+ srcName.setText("+" + getRelationLink().getRelation().getSideBName());
+ // } else if (srcName != null) {
+ // getConnection().remove(srcName);
+ // srcName = null;
+ // }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/StringEditPart.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/StringEditPart.java
new file mode 100644
index 00000000000..e4bf3b3d19f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/part/StringEditPart.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.framework.ui.data.model.editor.part;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StringEditPart extends AbstractGraphicalEditPart {
+
+ private final String data;
+
+ public StringEditPart(String data) {
+ super();
+ this.data = data;
+ }
+
+ protected IFigure createFigure() {
+ return new Label(data);
+ }
+
+ protected void createEditPolicies() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/ConnectionModelEndpointEditPolicy.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/ConnectionModelEndpointEditPolicy.java
new file mode 100644
index 00000000000..45b1e77b1d4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/ConnectionModelEndpointEditPolicy.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.framework.ui.data.model.editor.policy;
+
+import org.eclipse.draw2d.PolylineConnection;
+import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConnectionModelEndpointEditPolicy extends ConnectionEndpointEditPolicy {
+
+ private static Font BOLD_FONT;
+
+ protected void addSelectionHandles() {
+ super.addSelectionHandles();
+ getConnectionFigure().setLineWidth(2);
+ }
+
+ protected PolylineConnection getConnectionFigure() {
+ return (PolylineConnection) getHostFigure();
+ }
+
+ protected void hideSelection() {
+ super.hideSelection();
+ getHostFigure().setFont(null);
+ getHostFigure().invalidateTree();
+ }
+
+ protected void removeSelectionHandles() {
+ super.removeSelectionHandles();
+ getConnectionFigure().setLineWidth(0);
+ }
+
+ protected void showSelection() {
+ super.showSelection();
+ if (BOLD_FONT == null) {
+ FontData[] data = getConnectionFigure().getFont().getFontData();
+ for (int i = 0; i < data.length; i++) {
+ if ((data[i].getStyle() & SWT.BOLD) == 0) {
+ data[i].setStyle(data[i].getStyle() | SWT.BOLD);
+ }
+ }
+ BOLD_FONT = new Font(null, data);
+ }
+ getHostFigure().setFont(BOLD_FONT);
+ getHostFigure().invalidateTree();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/DiagramLayoutEditPolicy.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/DiagramLayoutEditPolicy.java
new file mode 100644
index 00000000000..fc66be4f728
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/DiagramLayoutEditPolicy.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.policy;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gef.editpolicies.ResizableEditPolicy;
+import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+import org.eclipse.osee.framework.ui.data.model.editor.command.ChangeBoundsCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.command.CreateNodeCommand;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ODMDiagram;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DiagramLayoutEditPolicy extends XYLayoutEditPolicy {
+
+ protected Command createChangeConstraintCommand(EditPart child, Object constraint) {
+ Rectangle bounds = (Rectangle) constraint;
+ return new ChangeBoundsCommand((NodeModel) child.getModel(), bounds.getLocation(), bounds.width);
+ }
+
+ protected EditPolicy createChildEditPolicy(EditPart child) {
+ ResizableEditPolicy childPolicy = new ResizableEditPolicy();
+ childPolicy.setResizeDirections(PositionConstants.EAST_WEST);
+ return childPolicy;
+ }
+
+ protected Command getCreateCommand(CreateRequest request) {
+ Object newObj = request.getNewObject();
+ if (newObj instanceof DataType) {
+ Rectangle constraint = (Rectangle) getConstraintFor(request);
+ return new CreateNodeCommand((DataType) newObj, (ODMDiagram) getHost().getModel(), constraint.getLocation(),
+ constraint.width);
+ } else if (newObj instanceof List) {
+ List views = (List) newObj;
+ // List businessModels = (List) request.getExtendedData().get(OutlineToDiagramTransfer.TYPE_NAME);
+ // if (!(businessModels.get(businessModels.size() - 1) instanceof ProcessedMarker)) {
+ // processSelection(businessModels, views);
+ // // Once this list has been processed, we append a marker to it so that it's
+ // // not processed again
+ // businessModels.add(new ProcessedMarker());
+ // }
+ // if (views.isEmpty()) return UnexecutableCommand.INSTANCE;
+ // CompoundCommand command = new CompoundCommand("Drag from Outline");
+ // Point loc = request.getLocation().getCopy();
+ // getHostFigure().translateToRelative(loc);
+ // for (int i = 0; i < views.size(); i++) {
+ // Object view = views.get(i);
+ // if (view instanceof NamedElementView) {
+ // command.add(new CreateNodeCommand((Node) view, (Diagram) getHost().getModel(), loc.getTranslated(i * 40,
+ // i * 40)));
+ // } else if (view instanceof LinkInfoHolder) {
+ // LinkInfoHolder info = (LinkInfoHolder) view;
+ // command.add(new TransferLinkCommand(info.link, info.src, info.target));
+ // } else if (view instanceof ShowOppositeMarker) {
+ // command.add(new ShowOppositeCommand(((ShowOppositeMarker) view).refView));
+ // }
+ // }
+ // return command;
+ }
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ protected Command getDeleteDependantCommand(Request request) {
+ return null;
+ }
+
+ protected IFigure getFeedbackLayer() {
+ return getLayer(LayerConstants.SCALED_FEEDBACK_LAYER);
+ }
+
+ private void processSelection(List models, List views) {
+ List newModels = new ArrayList();
+ List newViews = new ArrayList();
+ // for (int i = 0; i < models.size(); i++) {
+ // Object model = models.get(i);
+ // if (Utilities.findViewFor(model, getHost().getModel()) != null) continue;
+ // if (model instanceof EReference) {
+ // EReference ref = (EReference) model;
+ // ReferenceView oppView = (ReferenceView) Utilities.findViewFor(ref.getEOpposite(), getHost().getModel());
+ // int oppIndex = newModels.indexOf(ref.getEOpposite());
+ // if (oppView != null || oppIndex != -1) {
+ // // the opposite was found
+ // newModels.add(model);
+ // if (oppView != null) {
+ // newViews.add(new ShowOppositeMarker(oppView));
+ // } else {
+ // newViews.add(new ShowOppositeMarker((ReferenceView) ((LinkInfoHolder) newViews.get(oppIndex)).link));
+ // }
+ // continue;
+ // }
+ // Node srcView = (Node) Utilities.findViewFor(ref.getEContainingClass(), getHost().getModel());
+ // Node destView = (Node) Utilities.findViewFor(ref.getEReferenceType(), getHost().getModel());
+ // if (srcView == null) {
+ // int index = models.indexOf(ref.getEContainingClass());
+ // srcView = index >= 0 ? (Node) views.get(index) : null;
+ // }
+ // if (destView == null) {
+ // int index = models.indexOf(ref.getEReferenceType());
+ // destView = index >= 0 ? (Node) views.get(index) : null;
+ // }
+ // if (srcView != null && destView != null) {
+ // ReferenceView refView = (ReferenceView) views.get(i);
+ // refView.setEReference(ref);
+ // newModels.add(model);
+ // newViews.add(new LinkInfoHolder(refView, srcView, destView));
+ // }
+ // } else if (model instanceof InheritanceModel) {
+ // InheritanceModel link = (InheritanceModel) model;
+ // Node srcView = (Node) Utilities.findViewFor(link.getSubType(), getHost().getModel());
+ // Node destView = (Node) Utilities.findViewFor(link.getSuperType(), getHost().getModel());
+ // if (srcView == null) {
+ // int index = models.indexOf(link.getSubType());
+ // srcView = index >= 0 ? (Node) views.get(index) : null;
+ // }
+ // if (destView == null) {
+ // int index = models.indexOf(link.getSuperType());
+ // destView = index >= 0 ? (Node) views.get(index) : null;
+ // }
+ // if (srcView != null && destView != null) {
+ // newModels.add(model);
+ // newViews.add(new LinkInfoHolder((Link) views.get(i), srcView, destView));
+ // }
+ // } else if (model instanceof ENamedElement) {
+ // NamedElementView classView = (NamedElementView) views.get(i);
+ // classView.setENamedElement((ENamedElement) model);
+ // newModels.add(0, model);
+ // newViews.add(0, classView);
+ // }
+ // }
+ models.clear();
+ views.clear();
+ models.addAll(newModels);
+ views.addAll(newViews);
+ }
+
+ private static class LinkInfoHolder {
+ private ConnectionModel link;
+ private NodeModel src;
+ private NodeModel target;
+
+ private LinkInfoHolder(ConnectionModel link, NodeModel src, NodeModel target) {
+ this.link = link;
+ this.src = src;
+ this.target = target;
+ }
+ }
+
+ // private static class ShowOppositeMarker {
+ // private ReferenceView refView;
+ //
+ // private ShowOppositeMarker(ReferenceView view) {
+ // refView = view;
+ // }
+ // }
+ //
+ // private static class ProcessedMarker {
+ // }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/LabelSelectionEditPolicy.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/LabelSelectionEditPolicy.java
new file mode 100644
index 00000000000..e534af05bd7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/policy/LabelSelectionEditPolicy.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.framework.ui.data.model.editor.policy;
+
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.osee.framework.ui.data.model.editor.figure.SelectableLabel;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LabelSelectionEditPolicy extends NonResizableEditPolicy {
+
+ protected SelectableLabel getLabel() {
+ return (SelectableLabel) getHostFigure();
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#hideFocus()
+ */
+ @Override
+ protected void hideFocus() {
+ getLabel().setFocus(false);
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#hideSelection()
+ */
+ @Override
+ protected void hideSelection() {
+ getLabel().setSelected(false);
+ getLabel().setFocus(false);
+
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#showFocus()
+ */
+ @Override
+ protected void showFocus() {
+ getLabel().setFocus(true);
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
+ */
+ @Override
+ protected void showPrimarySelection() {
+ getLabel().setSelected(true);
+ getLabel().setFocus(true);
+ }
+
+ /**
+ * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
+ */
+ @Override
+ protected void showSelection() {
+ getLabel().setSelected(true);
+ getLabel().setFocus(false);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ArtifactPropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ArtifactPropertySource.java
new file mode 100644
index 00000000000..6f463aaad3c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ArtifactPropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.plugin.views.property.ImagePropertyDescriptor;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.osee.framework.ui.plugin.views.property.ReadOnlyPropertyDescriptor;
+import org.eclipse.osee.framework.ui.plugin.views.property.StringPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactPropertySource extends ModelPropertySource {
+ protected final PropertyId idImage;
+ private final PropertyId idSuperTypes;
+
+ public ArtifactPropertySource(String categoryName, Object dataType) {
+ super(dataType);
+ idImage = new PropertyId(categoryName, "Image");
+ idSuperTypes = new PropertyId(categoryName, "Super Types");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.views.property.AbstractPropertySource#addPropertyDescriptors(java.util.List)
+ */
+ @Override
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new ReadOnlyPropertyDescriptor(idSuperTypes));
+ list.add(new StringPropertyDescriptor(idImage));
+ }
+
+ protected ArtifactDataType getDataTypeElement() {
+ return (ArtifactDataType) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertyResettable(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertyResettable(Object id) {
+ return id == idImage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertySet(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertySet(Object id) {
+ if (id == idImage) return getDataTypeElement().getImage() != null;
+ if (id == idSuperTypes) return true;
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+ */
+ @Override
+ public Object getPropertyValue(Object id) {
+ if (id == idImage) return ImagePropertyDescriptor.fromModel(getDataTypeElement().getImage());
+ if (id == idSuperTypes) return ReadOnlyPropertyDescriptor.fromModel(getDataTypeElement().getSuperTypes().toString());
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+ */
+ @Override
+ public void resetPropertyValue(Object id) {
+ if (id == idImage) getDataTypeElement().setImage(null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ if (id == idImage) getDataTypeElement().setImage(ImagePropertyDescriptor.toModel(value));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeBaseClassPropertyDescriptor.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeBaseClassPropertyDescriptor.java
new file mode 100644
index 00000000000..600902cd761
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeBaseClassPropertyDescriptor.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.framework.ui.data.model.editor.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeExtensionManager;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeBaseClassPropertyDescriptor extends ComboBoxPropertyDescriptor {
+
+ private static final List<String> items = new ArrayList<String>();
+ static {
+ try {
+ items.addAll(AttributeExtensionManager.getAttributeClasses());
+ } catch (OseeStateException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ public AttributeBaseClassPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName(), items.toArray(new String[items.size()]));
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static Integer fromModel(Object object) {
+ String value = (String) object;
+ int index = items.indexOf(value);
+ if (index < 0) {
+ items.add(value);
+ index = items.size() - 1;
+ }
+ return index;
+ }
+
+ public static String toModel(Object object) {
+ if (object != null) {
+ int index = ((Integer) object).intValue();
+ if (index > -1) {
+ return items.get(index);
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributePropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributePropertySource.java
new file mode 100644
index 00000000000..2530f3b2364
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributePropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumTypeManager;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.plugin.views.property.IntegerPropertyDescriptor;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.osee.framework.ui.plugin.views.property.StringPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributePropertySource extends ModelPropertySource {
+
+ protected final PropertyId idDefaultValue;
+ protected final PropertyId idEnumType;
+ protected final PropertyId idToolTipText;
+ protected final PropertyId idFileTypeExtension;
+ protected final PropertyId idTaggerId;
+
+ protected final PropertyId idMinOccurrence;
+ protected final PropertyId idMaxOccurrence;
+
+ protected final PropertyId idBaseAttributeClass;
+ protected final PropertyId idProviderAttributeClass;
+
+ public AttributePropertySource(String categoryName, Object dataType) {
+ super(dataType);
+ idDefaultValue = new PropertyId(categoryName, "Default Value");
+ idEnumType = new PropertyId(categoryName, "Enum Type");
+ idToolTipText = new PropertyId(categoryName, "ToolTip");
+ idFileTypeExtension = new PropertyId(categoryName, "File Extension");
+ idTaggerId = new PropertyId(categoryName, "Tagger Id");
+ idMinOccurrence = new PropertyId(categoryName, "Min Occurrence");
+ idMaxOccurrence = new PropertyId(categoryName, "Max Occurrence");
+ idBaseAttributeClass = new PropertyId(categoryName, "Base Attribute Class");
+ idProviderAttributeClass = new PropertyId(categoryName, "Base Provider Attribute Class");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.views.property.AbstractPropertySource#addPropertyDescriptors(java.util.List)
+ */
+ @Override
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new StringPropertyDescriptor(idDefaultValue));
+ list.add(new EnumeratedAttributeValuesPropertyDescriptor(idEnumType));
+ list.add(new StringPropertyDescriptor(idToolTipText));
+ list.add(new StringPropertyDescriptor(idFileTypeExtension));
+ list.add(new StringPropertyDescriptor(idTaggerId));
+
+ list.add(new IntegerPropertyDescriptor(idMinOccurrence));
+ list.add(new IntegerPropertyDescriptor(idMaxOccurrence));
+
+ list.add(new AttributeBaseClassPropertyDescriptor(idBaseAttributeClass));
+ list.add(new AttributeProviderPropertyDescriptor(idProviderAttributeClass));
+ }
+
+ protected AttributeDataType getDataTypeElement() {
+ return (AttributeDataType) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertyResettable(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertyResettable(Object id) {
+ return id == idDefaultValue || id == idEnumType || id == idToolTipText || id == idFileTypeExtension || id == idTaggerId || id == idMinOccurrence || id == idMaxOccurrence || id == idBaseAttributeClass || id == idProviderAttributeClass;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertySet(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertySet(Object id) {
+ if (id == idDefaultValue) return getDataTypeElement().getDefaultValue() != null;
+ if (id == idEnumType) return getDataTypeElement().getEnumTypeId() != -1;
+ if (id == idToolTipText) return getDataTypeElement().getToolTipText() != null;
+ if (id == idFileTypeExtension) return getDataTypeElement().getFileTypeExtension() != null;
+ if (id == idTaggerId) return getDataTypeElement().getTaggerId() != null;
+ if (id == idMinOccurrence) return getDataTypeElement().getMinOccurrence() != -1;
+ if (id == idMaxOccurrence) return getDataTypeElement().getMaxOccurrence() != -1;
+ if (id == idBaseAttributeClass) return getDataTypeElement().getBaseAttributeClass() != null;
+ if (id == idProviderAttributeClass) return getDataTypeElement().getProviderAttributeClass() != null;
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+ */
+ @Override
+ public Object getPropertyValue(Object id) {
+ if (id == idDefaultValue) return StringPropertyDescriptor.fromModel(getDataTypeElement().getDefaultValue());
+ if (id == idEnumType) {
+ int enumTypeId = getDataTypeElement().getEnumTypeId();
+ try {
+ return EnumeratedAttributeValuesPropertyDescriptor.fromModel(OseeEnumTypeManager.getType(enumTypeId).getEnumTypeName());
+ } catch (OseeCoreException ex) {
+ return -1;
+ }
+ }
+ if (id == idToolTipText) return StringPropertyDescriptor.fromModel(getDataTypeElement().getToolTipText());
+ if (id == idFileTypeExtension) return StringPropertyDescriptor.fromModel(getDataTypeElement().getFileTypeExtension());
+ if (id == idTaggerId) return StringPropertyDescriptor.fromModel(getDataTypeElement().getTaggerId());
+ if (id == idMinOccurrence) return IntegerPropertyDescriptor.fromModel(getDataTypeElement().getMinOccurrence());
+ if (id == idMaxOccurrence) return IntegerPropertyDescriptor.fromModel(getDataTypeElement().getMaxOccurrence());
+ if (id == idBaseAttributeClass) return AttributeBaseClassPropertyDescriptor.fromModel(getDataTypeElement().getBaseAttributeClass());
+ if (id == idProviderAttributeClass) return AttributeProviderPropertyDescriptor.fromModel(getDataTypeElement().getProviderAttributeClass());
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+ */
+ @Override
+ public void resetPropertyValue(Object id) {
+ if (id == idDefaultValue) getDataTypeElement().setDefaultValue(null);
+ if (id == idEnumType) getDataTypeElement().setEnumTypeId(0);
+ if (id == idToolTipText) getDataTypeElement().setToolTipText(null);
+ if (id == idFileTypeExtension) getDataTypeElement().setFileTypeExtension(null);
+ if (id == idTaggerId) getDataTypeElement().setTaggerId(null);
+ if (id == idMinOccurrence) getDataTypeElement().setMinOccurrence(-1);
+ if (id == idMaxOccurrence) getDataTypeElement().setMaxOccurrence(-1);
+ if (id == idBaseAttributeClass) getDataTypeElement().setBaseAttributeClass(null);
+ if (id == idProviderAttributeClass) getDataTypeElement().setProviderAttributeClass(null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ if (id == idDefaultValue) getDataTypeElement().setDefaultValue(StringPropertyDescriptor.toModel(value));
+ if (id == idEnumType) {
+ String enumTypeName = EnumeratedAttributeValuesPropertyDescriptor.toModel(value);
+ try {
+ getDataTypeElement().setEnumTypeId(OseeEnumTypeManager.getUniqueType(enumTypeName).getEnumTypeId());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+ if (id == idToolTipText) getDataTypeElement().setToolTipText(StringPropertyDescriptor.toModel(value));
+ if (id == idFileTypeExtension) getDataTypeElement().setFileTypeExtension(StringPropertyDescriptor.toModel(value));
+ if (id == idTaggerId) getDataTypeElement().setTaggerId(StringPropertyDescriptor.toModel(value));
+ if (id == idMinOccurrence) getDataTypeElement().setMinOccurrence(IntegerPropertyDescriptor.toModel(value));
+ if (id == idMaxOccurrence) getDataTypeElement().setMaxOccurrence(IntegerPropertyDescriptor.toModel(value));
+ if (id == idBaseAttributeClass) getDataTypeElement().setBaseAttributeClass(
+ AttributeBaseClassPropertyDescriptor.toModel(value));
+ if (id == idProviderAttributeClass) getDataTypeElement().setProviderAttributeClass(
+ AttributeProviderPropertyDescriptor.toModel(value));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeProviderPropertyDescriptor.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeProviderPropertyDescriptor.java
new file mode 100644
index 00000000000..5439d46047b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/AttributeProviderPropertyDescriptor.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.framework.ui.data.model.editor.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeExtensionManager;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeProviderPropertyDescriptor extends ComboBoxPropertyDescriptor {
+
+ private static final List<String> items = new ArrayList<String>();
+ static {
+ try {
+ items.addAll(AttributeExtensionManager.getAttributeProviders());
+ } catch (OseeStateException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ public AttributeProviderPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName(), items.toArray(new String[items.size()]));
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static Integer fromModel(Object object) {
+ String value = (String) object;
+ int index = items.indexOf(value);
+ if (index < 0) {
+ items.add(value);
+ index = items.size() - 1;
+ }
+ return index;
+ }
+
+ public static String toModel(Object object) {
+ if (object != null) {
+ return items.get(((Integer) object).intValue());
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ConnectionPropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ConnectionPropertySource.java
new file mode 100644
index 00000000000..ca25d4e4605
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/ConnectionPropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.draw2d.AbsoluteBendpoint;
+import org.eclipse.draw2d.Bendpoint;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.osee.framework.ui.plugin.views.property.StringPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConnectionPropertySource extends ModelPropertySource {
+
+ private final PropertyId idBendpoints;
+
+ public ConnectionPropertySource(String categoryName, Object model) {
+ super(model);
+ idBendpoints = new PropertyId(categoryName, "Bendpoints");
+ }
+
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new StringPropertyDescriptor(idBendpoints));
+ }
+
+ public boolean isPropertyResettable(Object id) {
+ return id == idBendpoints;
+ }
+
+ protected ConnectionModel<?> getConnectionModel() {
+ return (ConnectionModel<?>) getModel();
+ }
+
+ public Object getPropertyValue(Object id) {
+ if (id == idBendpoints) {
+ StringBuffer buffer = new StringBuffer();
+ for (Object object : getConnectionModel().getBendpoints()) {
+ Bendpoint bendPoint = (Bendpoint) object;
+ Point point = bendPoint.getLocation();
+ buffer.append(point.x);
+ buffer.append(',');
+ buffer.append(point.y);
+ buffer.append(' ');
+ }
+ return buffer.toString();
+ }
+ return null;
+ }
+
+ public boolean isPropertySet(Object id) {
+ return id == idBendpoints && !getConnectionModel().getBendpoints().isEmpty();
+ }
+
+ public void resetPropertyValue(Object id) {
+ if (id == idBendpoints) getConnectionModel().getBendpoints().clear();
+ }
+
+ public void setPropertyValue(Object id, Object value) {
+ if (id == idBendpoints) {
+ List<AbsoluteBendpoint> points = new ArrayList<AbsoluteBendpoint>();
+ try {
+ String[] result = ((String) value).split(" ");
+ for (int i = 0; i < result.length; i++) {
+ String[] coordinates = result[i].split(",");
+ points.add(new AbsoluteBendpoint(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1])));
+ }
+ getConnectionModel().getBendpoints().clear();
+ getConnectionModel().getBendpoints().addAll(points);
+ } catch (Exception e) {
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/DataTypeElementPropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/DataTypeElementPropertySource.java
new file mode 100644
index 00000000000..42f1e5f80d7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/DataTypeElementPropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.osee.framework.ui.plugin.views.property.ReadOnlyPropertyDescriptor;
+import org.eclipse.osee.framework.ui.plugin.views.property.StringPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataTypeElementPropertySource extends ModelPropertySource {
+
+ protected final PropertyId idName;
+ protected final PropertyId idNamespace;
+ protected final PropertyId idUniqueId;
+
+ public DataTypeElementPropertySource(String categoryName, Object dataType) {
+ super(dataType);
+ idUniqueId = new PropertyId(categoryName, "UniqueId");
+ idName = new PropertyId(categoryName, "Name");
+ idNamespace = new PropertyId(categoryName, "Namespace");
+ }
+
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new ReadOnlyPropertyDescriptor(idUniqueId));
+ list.add(new StringPropertyDescriptor(idName));
+ list.add(new StringPropertyDescriptor(idNamespace));
+ }
+
+ protected DataType getDataTypeElement() {
+ return (DataType) getModel();
+ }
+
+ public Object getPropertyValue(Object id) {
+ if (id == idUniqueId) return ReadOnlyPropertyDescriptor.fromModel(getDataTypeElement().getUniqueId());
+ if (id == idName) return StringPropertyDescriptor.fromModel(getDataTypeElement().getName());
+ if (id == idNamespace) return StringPropertyDescriptor.fromModel(getDataTypeElement().getNamespace());
+ return null;
+ }
+
+ public boolean isPropertyResettable(Object id) {
+ return id == idName || id == idNamespace;
+ }
+
+ public boolean isPropertySet(Object id) {
+ if (id == idUniqueId) return true;
+ if (id == idName) return getDataTypeElement().getName() != null;
+ if (id == idNamespace) return getDataTypeElement().getNamespace() != null;
+ return false;
+ }
+
+ public void resetPropertyValue(Object id) {
+ if (id == idUniqueId) return;
+ if (id == idName) getDataTypeElement().setName(null);
+ if (id == idNamespace) getDataTypeElement().setNamespace(null);
+ }
+
+ public void setPropertyValue(Object id, Object value) {
+ if (id == idUniqueId) return;
+ if (id == idName) getDataTypeElement().setName(StringPropertyDescriptor.toModel(value));
+ if (id == idNamespace) getDataTypeElement().setNamespace(StringPropertyDescriptor.toModel(value));
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumPropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumPropertySource.java
new file mode 100644
index 00000000000..b5f85d8c295
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumPropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumType;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumTypeManager;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.osee.framework.ui.plugin.views.property.StringPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnumPropertySource extends ModelPropertySource {
+ protected final PropertyId idEnumTypeList;
+
+ public EnumPropertySource(String categoryName, Object dataType) {
+ super(dataType);
+ idEnumTypeList = new PropertyId(categoryName, "Enum Type");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.views.property.AbstractPropertySource#addPropertyDescriptors(java.util.List)
+ */
+ @Override
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new StringPropertyDescriptor(idEnumTypeList));
+ }
+
+ protected AttributeDataType getDataTypeElement() {
+ return (AttributeDataType) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertyResettable(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertyResettable(Object id) {
+ return id == idEnumTypeList;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertySet(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertySet(Object id) {
+ if (id == idEnumTypeList) return false;
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+ */
+ @Override
+ public Object getPropertyValue(Object id) {
+ if (id == idEnumTypeList) {
+ int enumTypeId = getDataTypeElement().getEnumTypeId();
+ OseeEnumType enumType = null;
+ try {
+ enumType = OseeEnumTypeManager.getType(enumTypeId);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ return StringPropertyDescriptor.fromModel(enumType != null ? enumType.valuesAsOrderedStringSet().toString() : Strings.emptyString());
+ }
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+ */
+ @Override
+ public void resetPropertyValue(Object id) {
+ // Here
+ System.out.println("resetPropertyValue");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ // Here
+ System.out.println("setPropertyValue");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumeratedAttributeValuesPropertyDescriptor.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumeratedAttributeValuesPropertyDescriptor.java
new file mode 100644
index 00000000000..abe0d0c0d7a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/EnumeratedAttributeValuesPropertyDescriptor.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.framework.ui.data.model.editor.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.OseeEnumTypeManager;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnumeratedAttributeValuesPropertyDescriptor extends ComboBoxPropertyDescriptor {
+
+ private static final List<String> items = new ArrayList<String>();
+ static {
+ try {
+ items.addAll(OseeEnumTypeManager.getAllTypeNames());
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+
+ public EnumeratedAttributeValuesPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName(), items.toArray(new String[items.size()]));
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static Integer fromModel(Object object) {
+ String value = (String) object;
+ int index = items.indexOf(value);
+ if (index < 0) {
+ items.add(value);
+ index = items.size() - 1;
+ }
+ return index;
+ }
+
+ public static String toModel(Object object) {
+ if (object != null) {
+ int index = ((Integer) object).intValue();
+ if (index > -1) {
+ return items.get(index);
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/NodePropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/NodePropertySource.java
new file mode 100644
index 00000000000..22fa4ec7ce5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/NodePropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.List;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+import org.eclipse.osee.framework.ui.plugin.views.property.IntegerPropertyDescriptor;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class NodePropertySource extends ModelPropertySource {
+
+ private final PropertyId idX;
+ private final PropertyId idY;
+ private final PropertyId idWidth;
+
+ public NodePropertySource(String categoryName, Object model) {
+ super(model);
+ idX = new PropertyId(categoryName, "X");
+ idY = new PropertyId(categoryName, "Y");
+ idWidth = new PropertyId(categoryName, "Width");
+ }
+
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new IntegerPropertyDescriptor(idX));
+ list.add(new IntegerPropertyDescriptor(idY));
+ IntegerPropertyDescriptor integerDescriptor = new IntegerPropertyDescriptor(idWidth);
+ integerDescriptor.setValidator(new ICellEditorValidator() {
+ public String isValid(Object value) {
+ try {
+ int val = Integer.parseInt((String) value);
+ if (val == -1 || val > 0) return null;
+ } catch (NumberFormatException nfe) {
+ }
+ return "The width has to be an integer greater than 0 (or -1 for default).";
+ }
+ });
+ list.add(integerDescriptor);
+ }
+
+ protected NodeModel getNode() {
+ return (NodeModel) getModel();
+ }
+
+ public Object getPropertyValue(Object id) {
+ if (id == idX) return IntegerPropertyDescriptor.fromModel(getNode().getLocation().x);
+ if (id == idY) return IntegerPropertyDescriptor.fromModel(getNode().getLocation().y);
+ if (id == idWidth) return IntegerPropertyDescriptor.fromModel(getNode().getWidth());
+ return null;
+ }
+
+ public boolean isPropertyResettable(Object id) {
+ return id == idWidth;
+ }
+
+ public boolean isPropertySet(Object id) {
+ if (id == idWidth) return getNode().getWidth() != -1;
+ return false;
+ }
+
+ public void resetPropertyValue(Object id) {
+ if (id == idWidth) getNode().setWidth(-1);
+ }
+
+ public void setPropertyValue(Object id, Object value) {
+ if (id == idX) {
+ Point newLoc = getNode().getLocation().getCopy();
+ newLoc.x = IntegerPropertyDescriptor.toModel(value);
+ getNode().setLocation(newLoc);
+ } else if (id == idY) {
+ Point newLoc = getNode().getLocation().getCopy();
+ newLoc.y = IntegerPropertyDescriptor.toModel(value);
+ getNode().setLocation(newLoc);
+ } else if (id == idWidth) getNode().setWidth(IntegerPropertyDescriptor.toModel(value));
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/PropertySourceFactory.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/PropertySourceFactory.java
new file mode 100644
index 00000000000..b5c6e172514
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/PropertySourceFactory.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.framework.ui.data.model.editor.property;
+
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.AttributeDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ConnectionModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.NodeModel;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.plugin.views.property.CompositePropertySource;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PropertySourceFactory {
+
+ private static final String CATEGORY_WIDGET = "Widget";
+ private static final String CATEGORY_ENUM = "Enum";
+ private static final String CATEGORY_ARTIFACT = "Artifact";
+ private static final String CATEGORY_ATTRIBUTE = "Attribute";
+ private static final String CATEGORY_RELATION = "Relation";
+ private static final String CATEGORY_DATA = " Data";
+ private static final String CATEGORY_LINK = "Link";
+
+ private PropertySourceFactory() {
+ super();
+ }
+
+ public static IPropertySource getPropertySource(Object model) {
+ IPropertySource toReturn = null;
+ if (model instanceof ConnectionModel) {
+ toReturn = new ConnectionPropertySource(CATEGORY_LINK, model);
+ } else if (model instanceof AttributeDataType) {
+ toReturn =
+ new CompositePropertySource(new DataTypeElementPropertySource(CATEGORY_ATTRIBUTE, model),
+ new AttributePropertySource(CATEGORY_ATTRIBUTE + CATEGORY_DATA, model), new EnumPropertySource(
+ CATEGORY_ENUM + CATEGORY_DATA, model));//, new NodePropertySource(CATEGORY_WIDGET, model));
+ } else if (model instanceof RelationDataType) {
+ toReturn =
+ new CompositePropertySource(new DataTypeElementPropertySource(CATEGORY_RELATION, model),
+ new RelationPropertySource(CATEGORY_RELATION + CATEGORY_DATA, model), new NodePropertySource(
+ CATEGORY_WIDGET, model));
+ } else if (model instanceof ArtifactDataType) {
+ toReturn =
+ new CompositePropertySource(new DataTypeElementPropertySource(CATEGORY_ARTIFACT, model),
+ new ArtifactPropertySource(CATEGORY_ARTIFACT + CATEGORY_DATA, model), new NodePropertySource(
+ CATEGORY_WIDGET, model));
+ } else if (model instanceof NodeModel) {
+ toReturn = new NodePropertySource(CATEGORY_WIDGET, model);
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/RelationPropertySource.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/RelationPropertySource.java
new file mode 100644
index 00000000000..9a74b96af06
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/property/RelationPropertySource.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.framework.ui.data.model.editor.property;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.data.model.editor.model.RelationDataType;
+import org.eclipse.osee.framework.ui.plugin.views.property.BooleanPropertyDescriptor;
+import org.eclipse.osee.framework.ui.plugin.views.property.ModelPropertySource;
+import org.eclipse.osee.framework.ui.plugin.views.property.PropertyId;
+import org.eclipse.osee.framework.ui.plugin.views.property.StringPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationPropertySource extends ModelPropertySource {
+
+ protected final PropertyId idSideAName;
+ protected final PropertyId idSideBName;
+ protected final PropertyId idAToBPhrase;
+ protected final PropertyId idBToAPhrase;
+ protected final PropertyId idShortName;
+ protected final PropertyId idOrdered;
+
+ public RelationPropertySource(String categoryName, Object dataType) {
+ super((RelationDataType) dataType);
+ idSideAName = new PropertyId(categoryName, "Side A Name");
+ idSideBName = new PropertyId(categoryName, "Side B Name");
+ idAToBPhrase = new PropertyId(categoryName, "A to B Phrase");
+ idBToAPhrase = new PropertyId(categoryName, "B to A Phrase");
+ idShortName = new PropertyId(categoryName, "Short Name");
+ idOrdered = new PropertyId(categoryName, "Is Ordered");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.views.property.AbstractPropertySource#addPropertyDescriptors(java.util.List)
+ */
+ @Override
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ list.add(new StringPropertyDescriptor(idSideAName));
+ list.add(new StringPropertyDescriptor(idSideBName));
+ list.add(new StringPropertyDescriptor(idAToBPhrase));
+ list.add(new StringPropertyDescriptor(idBToAPhrase));
+ list.add(new StringPropertyDescriptor(idShortName));
+ list.add(new BooleanPropertyDescriptor(idOrdered));
+ }
+
+ protected RelationDataType getDataTypeElement() {
+ return (RelationDataType) getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertyResettable(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertyResettable(Object id) {
+ return id == idSideAName || id == idSideBName || id == idAToBPhrase || id == idBToAPhrase || id == idShortName || id == idOrdered;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource2#isPropertySet(java.lang.Object)
+ */
+ @Override
+ public boolean isPropertySet(Object id) {
+ if (id == idSideAName) return getDataTypeElement().getSideAName() != null;
+ if (id == idSideBName) return getDataTypeElement().getSideBName() != null;
+ if (id == idAToBPhrase) return getDataTypeElement().getAToBPhrase() != null;
+ if (id == idBToAPhrase) return getDataTypeElement().getBToAPhrase() != null;
+ if (id == idShortName) return getDataTypeElement().getShortName() != null;
+ if (id == idOrdered) {
+ return true;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+ */
+ @Override
+ public Object getPropertyValue(Object id) {
+ if (id == idSideAName) return StringPropertyDescriptor.fromModel(getDataTypeElement().getSideAName());
+ if (id == idSideBName) return StringPropertyDescriptor.fromModel(getDataTypeElement().getSideBName());
+ if (id == idAToBPhrase) return StringPropertyDescriptor.fromModel(getDataTypeElement().getAToBPhrase());
+ if (id == idBToAPhrase) return StringPropertyDescriptor.fromModel(getDataTypeElement().getBToAPhrase());
+ if (id == idShortName) return StringPropertyDescriptor.fromModel(getDataTypeElement().getShortName());
+ if (id == idOrdered) return BooleanPropertyDescriptor.fromModel(getDataTypeElement().getOrdered());
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+ */
+ @Override
+ public void resetPropertyValue(Object id) {
+ if (id == idSideAName) getDataTypeElement().setSideAName(null);
+ if (id == idSideBName) getDataTypeElement().setSideBName(null);
+ if (id == idAToBPhrase) getDataTypeElement().setAToBPhrase(null);
+ if (id == idBToAPhrase) getDataTypeElement().setBToAPhrase(null);
+ if (id == idShortName) getDataTypeElement().setShortName(null);
+ if (id == idOrdered) getDataTypeElement().setOrdered(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void setPropertyValue(Object id, Object value) {
+ if (id == idSideAName) getDataTypeElement().setSideAName(StringPropertyDescriptor.toModel(value));
+ if (id == idSideBName) getDataTypeElement().setSideBName(StringPropertyDescriptor.toModel(value));
+ if (id == idAToBPhrase) getDataTypeElement().setAToBPhrase(StringPropertyDescriptor.toModel(value));
+ if (id == idBToAPhrase) getDataTypeElement().setBToAPhrase(StringPropertyDescriptor.toModel(value));
+ if (id == idShortName) getDataTypeElement().setShortName(StringPropertyDescriptor.toModel(value));
+ if (id == idOrdered) getDataTypeElement().setOrdered(BooleanPropertyDescriptor.toModel(value));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/Base64Converter.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/Base64Converter.java
new file mode 100644
index 00000000000..ffc2beeea38
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/Base64Converter.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.framework.ui.data.model.editor.utility;
+
+public class Base64Converter {
+
+ private static final byte equalSign = (byte) '=';
+
+ static char digits[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', //
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', //
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', //
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
+
+ /**
+ * This method decodes the byte array in base 64 encoding into a char array Base 64 encoding has to be according to
+ * the specification given by the RFC 1521 (5.2).
+ *
+ * @param data the encoded byte array
+ * @return the decoded byte array
+ */
+ public static byte[] decode(byte[] data) {
+ if (data.length == 0) return data;
+ int lastRealDataIndex = data.length - 1;
+ while (data[lastRealDataIndex] == equalSign)
+ lastRealDataIndex--;
+ // original data digit is 8 bits long, but base64 digit is 6 bits long
+ int padBytes = data.length - 1 - lastRealDataIndex;
+ int byteLength = data.length * 6 / 8 - padBytes;
+ byte[] result = new byte[byteLength];
+ // Each 4 bytes of input (encoded) we end up with 3 bytes of output
+ int dataIndex = 0;
+ int resultIndex = 0;
+ int allBits = 0;
+ // how many result chunks we can process before getting to pad bytes
+ int resultChunks = (lastRealDataIndex + 1) / 4;
+ for (int i = 0; i < resultChunks; i++) {
+ allBits = 0;
+ // Loop 4 times gathering input bits (4 * 6 = 24)
+ for (int j = 0; j < 4; j++)
+ allBits = (allBits << 6) | decodeDigit(data[dataIndex++]);
+ // Loop 3 times generating output bits (3 * 8 = 24)
+ for (int j = resultIndex + 2; j >= resultIndex; j--) {
+ result[j] = (byte) (allBits & 0xff); // Bottom 8 bits
+ allBits = allBits >>> 8;
+ }
+ resultIndex += 3; // processed 3 result bytes
+ }
+ // Now we do the extra bytes in case the original (non-encoded) data
+ // was not multiple of 3 bytes
+ switch (padBytes) {
+ case 1:
+ // 1 pad byte means 3 (4-1) extra Base64 bytes of input, 18
+ // bits, of which only 16 are meaningful
+ // Or: 2 bytes of result data
+ allBits = 0;
+ // Loop 3 times gathering input bits
+ for (int j = 0; j < 3; j++)
+ allBits = (allBits << 6) | decodeDigit(data[dataIndex++]);
+ // NOTE - The code below ends up being equivalent to allBits =
+ // allBits>>>2
+ // But we code it in a non-optimized way for clarity
+ // The 4th, missing 6 bits are all 0
+ allBits = allBits << 6;
+ // The 3rd, missing 8 bits are all 0
+ allBits = allBits >>> 8;
+ // Loop 2 times generating output bits
+ for (int j = resultIndex + 1; j >= resultIndex; j--) {
+ result[j] = (byte) (allBits & 0xff); // Bottom 8
+ // bits
+ allBits = allBits >>> 8;
+ }
+ break;
+ case 2:
+ // 2 pad bytes mean 2 (4-2) extra Base64 bytes of input, 12 bits
+ // of data, of which only 8 are meaningful
+ // Or: 1 byte of result data
+ allBits = 0;
+ // Loop 2 times gathering input bits
+ for (int j = 0; j < 2; j++)
+ allBits = (allBits << 6) | decodeDigit(data[dataIndex++]);
+ // NOTE - The code below ends up being equivalent to allBits =
+ // allBits>>>4
+ // But we code it in a non-optimized way for clarity
+ // The 3rd and 4th, missing 6 bits are all 0
+ allBits = allBits << 6;
+ allBits = allBits << 6;
+ // The 3rd and 4th, missing 8 bits are all 0
+ allBits = allBits >>> 8;
+ allBits = allBits >>> 8;
+ result[resultIndex] = (byte) (allBits & 0xff); // Bottom
+ // 8
+ // bits
+ break;
+ }
+ return result;
+ }
+
+ /**
+ * This method converts a Base 64 digit to its numeric value.
+ *
+ * @param data digit (character) to convert
+ * @return value for the digit
+ */
+ static int decodeDigit(byte data) {
+ char charData = (char) data;
+ if (charData <= 'Z' && charData >= 'A') return charData - 'A';
+ if (charData <= 'z' && charData >= 'a') return charData - 'a' + 26;
+ if (charData <= '9' && charData >= '0') return charData - '0' + 52;
+ switch (charData) {
+ case '+':
+ return 62;
+ case '/':
+ return 63;
+ default:
+ throw new IllegalArgumentException("Invalid char to decode: " + data); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * This method encodes the byte array into a char array in base 64 according to the specification given by the RFC
+ * 1521 (5.2).
+ *
+ * @param data the encoded char array
+ * @return the byte array that needs to be encoded
+ */
+ public static byte[] encode(byte[] data) {
+ int sourceChunks = data.length / 3;
+ int len = ((data.length + 2) / 3) * 4;
+ byte[] result = new byte[len];
+ int extraBytes = data.length - (sourceChunks * 3);
+ // Each 4 bytes of input (encoded) we end up with 3 bytes of output
+ int dataIndex = 0;
+ int resultIndex = 0;
+ int allBits = 0;
+ for (int i = 0; i < sourceChunks; i++) {
+ allBits = 0;
+ // Loop 3 times gathering input bits (3 * 8 = 24)
+ for (int j = 0; j < 3; j++)
+ allBits = (allBits << 8) | (data[dataIndex++] & 0xff);
+ // Loop 4 times generating output bits (4 * 6 = 24)
+ for (int j = resultIndex + 3; j >= resultIndex; j--) {
+ result[j] = (byte) digits[(allBits & 0x3f)]; // Bottom
+ // 6
+ // bits
+ allBits = allBits >>> 6;
+ }
+ resultIndex += 4; // processed 4 result bytes
+ }
+ // Now we do the extra bytes in case the original (non-encoded) data
+ // is not multiple of 4 bytes
+ switch (extraBytes) {
+ case 1:
+ allBits = data[dataIndex++]; // actual byte
+ allBits = allBits << 8; // 8 bits of zeroes
+ allBits = allBits << 8; // 8 bits of zeroes
+ // Loop 4 times generating output bits (4 * 6 = 24)
+ for (int j = resultIndex + 3; j >= resultIndex; j--) {
+ result[j] = (byte) digits[(allBits & 0x3f)]; // Bottom
+ // 6
+ // bits
+ allBits = allBits >>> 6;
+ }
+ // 2 pad tags
+ result[result.length - 1] = (byte) '=';
+ result[result.length - 2] = (byte) '=';
+ break;
+ case 2:
+ allBits = data[dataIndex++]; // actual byte
+ allBits = (allBits << 8) | (data[dataIndex++] & 0xff); // actual
+ // byte
+ allBits = allBits << 8; // 8 bits of zeroes
+ // Loop 4 times generating output bits (4 * 6 = 24)
+ for (int j = resultIndex + 3; j >= resultIndex; j--) {
+ result[j] = (byte) digits[(allBits & 0x3f)]; // Bottom
+ // 6
+ // bits
+ allBits = allBits >>> 6;
+ }
+ // 1 pad tag
+ result[result.length - 1] = (byte) '=';
+ break;
+ }
+ return result;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ImageUtility.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ImageUtility.java
new file mode 100644
index 00000000000..bdace0e5903
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ImageUtility.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.framework.ui.data.model.editor.utility;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImageUtility {
+
+ private final static byte[] JPEG_HEADER = new byte[] {(byte) 0xff, (byte) 0xd8};
+ private final static byte[] PNG_HEADER =
+ new byte[] {(byte) 0x89, (byte) 0x50, (byte) 0x4E, (byte) 0x47, (byte) 0x0D, (byte) 0x0A, (byte) 0x1A,
+ (byte) 0x0A};
+ private final static byte[] GIF_HEADER = new byte[] {(byte) 0x47, (byte) 0x49, (byte) 0x46};
+ private final static byte[] TIFF_HEADER = new byte[] {(byte) 0x49, (byte) 0x49, (byte) 0x2A};
+ private final static byte[] BMP_HEADER = new byte[] {(byte) 0x42, (byte) 0x4D};
+ private final static byte[] ICO_HEADER = new byte[] {(byte) 0x00};
+
+ private ImageUtility() {
+ }
+
+ public static byte[] imageToBytes(Image image) {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ ImageLoader imageLoader = new ImageLoader();
+ imageLoader.data = new ImageData[] {image.getImageData()};
+ imageLoader.save(buffer, SWT.IMAGE_JPEG);
+ return buffer.toByteArray();
+ }
+
+ public static Image bytesToImage(byte[] rawData) {
+ ImageLoader imageLoader = new ImageLoader();
+ ImageData[] images = imageLoader.load(new ByteArrayInputStream(rawData));
+ if (images != null && images.length > 0) {
+ return ImageDescriptor.createFromImageData(images[0]).createImage();
+ }
+ return null;
+ }
+
+ public static byte[] imageToBase64(Image image) {
+ return Base64Converter.encode(imageToBytes(image));
+ }
+
+ public static Image base64ToImage(byte[] rawData) {
+ return bytesToImage(Base64Converter.decode(rawData));
+ }
+
+ private static boolean doesHeaderMatch(byte[] header, byte[] data) {
+ if (data != null && header != null && data.length > header.length) {
+ for (int index = 0; index < header.length; index++) {
+ if (header[index] != data[index]) {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ public static int getImageType(byte[] data) {
+ if (doesHeaderMatch(ICO_HEADER, data)) return SWT.IMAGE_ICO;
+ if (doesHeaderMatch(JPEG_HEADER, data)) return SWT.IMAGE_JPEG;
+ if (doesHeaderMatch(BMP_HEADER, data)) {
+ if (data.length > 14 && data[14] == 0x40) {
+ if (data.length > 30 && data[30] == 0x00) {
+ return SWT.IMAGE_BMP;
+ } else {
+ return SWT.IMAGE_BMP_RLE;
+ }
+ } else {
+ return SWT.IMAGE_OS2_BMP;
+ }
+ }
+ if (doesHeaderMatch(GIF_HEADER, data)) return SWT.IMAGE_GIF;
+ if (doesHeaderMatch(TIFF_HEADER, data)) return SWT.IMAGE_TIFF;
+ if (doesHeaderMatch(PNG_HEADER, data)) return SWT.IMAGE_PNG;
+ return SWT.IMAGE_UNDEFINED;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMConstants.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMConstants.java
new file mode 100644
index 00000000000..4424014bff7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMConstants.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.framework.ui.data.model.editor.utility;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataType;
+import org.eclipse.swt.graphics.Font;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMConstants {
+
+ public static final int TOTAL_STEPS = Integer.MAX_VALUE;
+ public static final int SHORT_TASK_STEPS = TOTAL_STEPS / 50;
+ public static final int VERY_LONG_TASK = TOTAL_STEPS / 2;
+ public static final int TASK_STEPS = (TOTAL_STEPS - SHORT_TASK_STEPS * 3 - VERY_LONG_TASK) / 2;
+
+ public static final Font HEADER_FONT = JFaceResources.getTextFont();
+
+ public static String getNamespace(DataType dataType) {
+ return String.format("<<%s>>", dataType.getNamespace());
+ }
+
+ public static String getDataTypeText(DataType dataType) {
+ return String.format("%s:%s", getNamespace(dataType), dataType.getName());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMImages.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMImages.java
new file mode 100644
index 00000000000..111e37ee4f1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/utility/ODMImages.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.framework.ui.data.model.editor.utility;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMImages {
+
+ public static final String EXPORT_IMAGE = "extractsupertype_wiz.png";
+ public static final String IMPORT_IMAGE = "importsupertype_wiz.png";
+
+ public static final String DATASTORE_IMAGE = "datastore.gif";
+ public static final String NAMESPACE_IMAGE = "package_mode.gif";
+ public static final String FILE_SOURCE_IMAGE = "file.gif";
+ public static final String INHERITANCE = "hierarchy_co.gif";
+
+ public static final String INHERITED_ATTRIBUTE = "access_restriction_attrib.gif";
+ public static final String LOCAL_ATTRIBUTE = "local_attribute.gif";
+ public static final String INHERITED_RELATION = "access_restriction_relat.gif";
+ public static final String LOCAL_RELATION = "arrows.gif";
+
+ public static final String EXPAND_ALL = "expandall.gif";
+ public static final String TWO_WAY_REFERENCE = "two_way_reference.gif";
+ public static final String ONE_WAY_REFERENCE = "one_way_reference.gif";
+
+ public static final String SNAP_TO_GRID = "geometry.gif";
+ public static final String SNAP_TO_GRID_DISABLED = "geometry_disabled.gif";
+
+ private ODMImages() {
+ }
+
+ public static Image getImage(String imageName) {
+ return ODMEditorActivator.getInstance().getImage(imageName);
+ }
+
+ public static ImageDescriptor getImageDescriptor(String imageName) {
+ return ODMEditorActivator.getInstance().getImageDescriptor(imageName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderSelectPanel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderSelectPanel.java
new file mode 100644
index 00000000000..d265f2ba748
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderSelectPanel.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.wizard;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+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;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FileOrFolderSelectPanel extends Composite {
+
+ public static enum ButtonType {
+ CHECK_BOX, RADIO;
+ }
+
+ private final boolean isFolderSelect;
+ private final String label;
+ private final String[] filterExtensions;
+ private final ListenerRelay eventRelay;
+ private final ButtonType buttonType;
+ private final Set<Listener> listeners;
+ private final int fileSelectStyle;
+
+ private boolean isSelected;
+ private Button button;
+ private String resource;
+ private String defaultFileName;
+
+ public static FileOrFolderSelectPanel createFileSelectPanel(Composite parent, int style, String label, int fileSelectStyle, ButtonType buttonType, String[] filterExtensions) {
+ return new FileOrFolderSelectPanel(parent, style, label, fileSelectStyle, buttonType, false, filterExtensions);
+ }
+
+ public static FileOrFolderSelectPanel createFolderSelectPanel(Composite parent, int style, String label, int fileSelectStyle, ButtonType buttonType) {
+ return new FileOrFolderSelectPanel(parent, style, label, fileSelectStyle, buttonType, true, null);
+ }
+
+ private FileOrFolderSelectPanel(Composite parent, int style, String label, int fileSelectStyle, ButtonType buttonType, boolean isFolderSelect, String[] filterExtensions) {
+ super(parent, style);
+ this.fileSelectStyle = fileSelectStyle;
+ this.isSelected = false;
+ this.buttonType = buttonType;
+ this.label = label;
+ this.filterExtensions = filterExtensions;
+ this.listeners = Collections.synchronizedSet(new HashSet<Listener>());
+ this.eventRelay = new ListenerRelay();
+ this.isFolderSelect = isFolderSelect;
+
+ GridLayout layout = new GridLayout(3, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ this.setLayout(layout);
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ createControl(this);
+ }
+
+ private void createControl(Composite composite) {
+ button = new Button(composite, buttonType == ButtonType.CHECK_BOX ? SWT.CHECK : SWT.RADIO);
+ button.setText(label);
+ button.setSelection(isSelected);
+
+ final Text text = new Text(composite, SWT.BORDER | SWT.READ_ONLY);
+ GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gridData.widthHint = 100;
+ text.setLayoutData(gridData);
+
+ final Button fileDialogButton = new Button(composite, SWT.PUSH);
+ fileDialogButton.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
+ isFolderSelect ? ISharedImages.IMG_OBJ_FOLDER : ISharedImages.IMG_OBJ_FILE));
+ fileDialogButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ String result = null;
+ if (isFolderSelect) {
+ DirectoryDialog directoryDialog = new DirectoryDialog(getShell(), fileSelectStyle);
+ if (Strings.isValid(resource)) {
+ directoryDialog.setFilterPath(resource);
+ } else {
+ if (Strings.isValid(defaultFileName)) {
+ directoryDialog.setFilterPath(defaultFileName);
+ }
+ }
+ result = directoryDialog.open();
+ } else {
+ FileDialog fileDialog = new FileDialog(getShell(), fileSelectStyle);
+ if (filterExtensions != null && filterExtensions.length > 0) {
+ fileDialog.setFilterExtensions(filterExtensions);
+ }
+ if (Strings.isValid(resource)) {
+ fileDialog.setFilterPath(Lib.removeExtension(resource));
+ }
+
+ if (Strings.isValid(resource)) {
+ fileDialog.setFileName(Lib.removeExtension(resource));
+ } else {
+ if (Strings.isValid(defaultFileName)) {
+ fileDialog.setFileName(defaultFileName);
+ }
+ }
+ fileDialog.setOverwrite(true);
+ result = fileDialog.open();
+ }
+ if (Strings.isValid(result)) {
+ resource = result;
+ text.setText(resource);
+ }
+ }
+ });
+
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ isSelected = button.getSelection();
+ text.setEnabled(isSelected);
+ fileDialogButton.setEnabled(isSelected);
+ }
+ });
+ text.addListener(SWT.Modify, eventRelay);
+ fileDialogButton.addListener(SWT.Selection, eventRelay);
+ button.addListener(SWT.Selection, eventRelay);
+ }
+
+ public void setSelected(boolean setSelected) {
+ isSelected = setSelected;
+ if (button != null && !button.isDisposed()) {
+ button.setSelection(isSelected);
+ }
+ }
+
+ public boolean isSelected() {
+ return isSelected;
+ }
+
+ public String getSelectedResource() {
+ return resource;
+ }
+
+ public void setResource(String resource) {
+ this.resource = resource;
+ }
+
+ public void setDefaultFileName(String defaultFileName) {
+ this.defaultFileName = defaultFileName;
+ }
+
+ public boolean isFile() {
+ return !isFolderSelect;
+ }
+
+ public void addListener(Listener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(Listener listener) {
+ synchronized (listeners) {
+ listeners.remove(listener);
+ }
+ }
+
+ private final class ListenerRelay implements Listener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ synchronized (listeners) {
+ for (Listener listener : listeners) {
+ listener.handleEvent(event);
+ }
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderTreeSelecPanel.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderTreeSelecPanel.java
new file mode 100644
index 00000000000..5f658d4cf59
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/FileOrFolderTreeSelecPanel.java
@@ -0,0 +1,319 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.wizard;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.wizard.FileOrFolderSelectPanel.ButtonType;
+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.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.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FileOrFolderTreeSelecPanel extends Composite {
+
+ private FileOrFolderSelectPanel fileSelect;
+ private FileOrFolderSelectPanel folderSelect;
+ private CheckboxTreeViewer treeViewer;
+ private final List<IFileStore> selectedFiles;
+ private final Set<String> addedItems;
+ private Button addButton;
+ private Button removeButton;
+
+ public FileOrFolderTreeSelecPanel(Composite parent, int style) {
+ super(parent, style);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ selectedFiles = new ArrayList<IFileStore>();
+ addedItems = new HashSet<String>();
+
+ createControl(this);
+ }
+
+ private void createSourceSelect(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ fileSelect =
+ FileOrFolderSelectPanel.createFileSelectPanel(composite, SWT.NONE, "Select File: ", SWT.OPEN | SWT.SINGLE,
+ ButtonType.RADIO, new String[] {"*.xml"});
+
+ folderSelect =
+ FileOrFolderSelectPanel.createFolderSelectPanel(composite, SWT.NONE, "Select Folder:",
+ SWT.OPEN | SWT.SINGLE, ButtonType.RADIO);
+ }
+
+ private void createControl(Composite parent) {
+ SashForm sash = new SashForm(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ sash.setLayout(layout);
+ sash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ sash.setOrientation(SWT.VERTICAL);
+
+ createSourceSelect(sash);
+
+ Composite composite = new Composite(sash, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createCheckBoxTree(composite);
+ createButtons(composite);
+
+ attachListeners();
+ sash.setWeights(new int[] {4, 6});
+ }
+
+ private void attachListeners() {
+ Listener listener = new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ if (event.widget instanceof Button) {
+ Button button = (Button) event.widget;
+ if (button.getText().equals("Select File: ") && fileSelect.isSelected()) {
+ folderSelect.setSelected(false);
+ } else if (button.getText().equals("Select Folder:") && folderSelect.isSelected()) {
+ fileSelect.setSelected(false);
+ }
+
+ String resource =
+ fileSelect.isSelected() ? fileSelect.getSelectedResource() : folderSelect.getSelectedResource();
+ addButton.setEnabled(Strings.isValid(resource) && !addedItems.contains(resource));
+ removeButton.setEnabled(!selectedFiles.isEmpty());
+ }
+ }
+ };
+ addButton.setEnabled(false);
+ removeButton.setEnabled(false);
+
+ fileSelect.addListener(listener);
+ folderSelect.addListener(listener);
+ }
+
+ private void createCheckBoxTree(Composite parent) {
+ treeViewer = new CheckboxTreeViewer(parent);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new FileContentProvider());
+ treeViewer.setLabelProvider(new FileLabelProvider());
+ treeViewer.setInput(selectedFiles);
+ }
+
+ private void createButtons(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+ addButton = new Button(composite, SWT.PUSH);
+ addButton.setText("Add");
+ addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ addButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String resource = null;
+ if (fileSelect.isSelected()) {
+ resource = fileSelect.getSelectedResource();
+ } else if (folderSelect.isSelected()) {
+ resource = folderSelect.getSelectedResource();
+ }
+
+ if (Strings.isValid(resource) && !addedItems.contains(resource)) {
+ try {
+ IFileStore fileStore = EFS.getStore(new File(resource).toURI());
+ if (fileStore != null) {
+ boolean wasAdded = selectedFiles.add(fileStore);
+ if (wasAdded) {
+ addedItems.add(resource);
+ // treeViewer.refresh(fileStore);
+ }
+ // if (file.isDirectory()) {
+ // System.out.println("Scan for *.xml - Osee Types");
+ // } else {
+ // System.out.println("Check File");
+ // }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.SEVERE, ex);
+ }
+ }
+ treeViewer.refresh();
+ }
+ });
+
+ removeButton = new Button(composite, SWT.PUSH);
+ removeButton.setText("Remove");
+ removeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ removeButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ for (Object object : selection.toList()) {
+ if (object != null) {
+ // Remove Here
+ }
+ }
+ }
+ });
+
+ Button selectAllButton = new Button(composite, SWT.PUSH);
+ selectAllButton.setText("Select All");
+ selectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ selectAllButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ for (TreeItem item : treeViewer.getTree().getItems()) {
+ item.setChecked(true);
+ }
+ }
+ });
+
+ Button deselectAllButton = new Button(composite, SWT.PUSH);
+ deselectAllButton.setText("Deselect All");
+ deselectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ deselectAllButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ for (TreeItem item : treeViewer.getTree().getItems()) {
+ item.setChecked(false);
+ }
+ }
+ });
+ }
+
+ public List<String> getCheckedItems() {
+ List<String> checkedItems = new ArrayList<String>();
+ for (Object object : treeViewer.getCheckedElements()) {
+ if (object instanceof IFileStore) {
+ // ((IFileStore) object)
+ }
+ }
+ return checkedItems;
+ }
+ private final static class FileContentProvider implements ITreeContentProvider {
+ private static final Object[] EMPTY = new Object[0];
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ if (parentElement instanceof IFileStore) {
+ IFileStore[] children = null;
+ if (children != null) {
+ return children;
+ }
+ }
+ return EMPTY;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ public Object getParent(Object element) {
+ if (element instanceof IFileStore) {
+ return ((IFileStore) element).getParent();
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object element) {
+ return getChildren(element);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ }
+
+ private static class FileLabelProvider extends LabelProvider {
+ private static final Image IMG_FOLDER =
+ PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+
+ private static final Image IMG_FILE =
+ PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+ */
+ public Image getImage(Object element) {
+ if (element instanceof IFileStore) {
+ IFileStore curr = (IFileStore) element;
+ if (curr.fetchInfo().isDirectory()) {
+ return IMG_FOLDER;
+ }
+ return IMG_FILE;
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+ */
+ public String getText(Object element) {
+ if (element instanceof IFileStore) {
+ return ((IFileStore) element).getName();
+ }
+ return super.getText(element);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportOutputPage.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportOutputPage.java
new file mode 100644
index 00000000000..7852d3500f4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportOutputPage.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.framework.ui.data.model.editor.wizard;
+
+import java.sql.DatabaseMetaData;
+import java.util.logging.Level;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.wizard.FileOrFolderSelectPanel.ButtonType;
+import org.eclipse.osee.framework.ui.swt.StackedViewer;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMExportOutputPage extends WizardPage {
+
+ private static final String DATASTORE_OPTIONS = "data.store.export.options";
+ private static final String XML_FILE_OPTIONS = "xml.export.options";
+
+ private StackedViewer stackedViewer;
+ private boolean isDataStoreExport;
+
+ private Button xmlExportButton;
+ private Button dataStoreExportButton;
+
+ private FileOrFolderSelectPanel dataStoreBackupOption;
+ private FileOrFolderSelectPanel xmlSingleOption;
+ private FileOrFolderSelectPanel xmlMultiOption;
+
+ protected ODMExportOutputPage(String pageName, String description) {
+ super(pageName, pageName, null);
+ setDescription(description);
+ isDataStoreExport = false;
+ }
+
+ public boolean isDataStoreExport() {
+ return isDataStoreExport;
+ }
+
+ public boolean isDataStoreBackupOption() {
+ return dataStoreBackupOption.isSelected();
+ }
+
+ public String getExportToDataStoreBackupFilePath() {
+ return dataStoreBackupOption.getSelectedResource();
+ }
+
+ public boolean isExportToSingleXmlFileSelected() {
+ return xmlSingleOption.isSelected();
+ }
+
+ public String getExportToXmlPath() {
+ return isExportToSingleXmlFileSelected() ? xmlSingleOption.getSelectedResource() : xmlMultiOption.getSelectedResource();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ dataStoreExportButton = createDataStoreButton(composite);
+
+ xmlExportButton = new Button(composite, SWT.CHECK);
+ xmlExportButton.setText("To XML");
+
+ stackedViewer = new StackedViewer(composite, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ stackedViewer.setLayout(layout);
+ stackedViewer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ stackedViewer.addControl(DATASTORE_OPTIONS, createDataStoreOptions(stackedViewer.getStackComposite()));
+ stackedViewer.addControl(XML_FILE_OPTIONS, createXmlFileOptions(stackedViewer.getStackComposite()));
+
+ SelectionAdapter listener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Object object = e.getSource();
+ if (object instanceof Button) {
+ Button button = (Button) object;
+ setOutputFormat(button.equals(dataStoreExportButton) && button.getSelection());
+ updateStatus();
+ }
+ }
+ };
+
+ setOutputFormat(isDataStoreExport);
+
+ xmlExportButton.addSelectionListener(listener);
+ dataStoreExportButton.addSelectionListener(listener);
+
+ setControl(composite);
+ }
+
+ private Control createDataStoreOptions(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("DataStore Export Options");
+
+ dataStoreBackupOption =
+ FileOrFolderSelectPanel.createFileSelectPanel(group, SWT.NONE, "Backup Data Store Types",
+ SWT.SAVE | SWT.SINGLE, ButtonType.CHECK_BOX, new String[] {"xml"});
+ dataStoreBackupOption.setDefaultFileName("osee.types.db.backup.xml");
+ dataStoreBackupOption.addListener(new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ updateStatus();
+ }
+ });
+ dataStoreBackupOption.setSelected(true);
+ return group;
+ }
+
+ private Control createXmlFileOptions(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("Xml Export Options");
+
+ xmlSingleOption =
+ FileOrFolderSelectPanel.createFileSelectPanel(group, SWT.NONE, "Export as single file",
+ SWT.SAVE | SWT.SINGLE, ButtonType.CHECK_BOX, new String[] {"xml"});
+ xmlSingleOption.setDefaultFileName("osee.types.xml");
+
+ xmlMultiOption =
+ FileOrFolderSelectPanel.createFolderSelectPanel(group, SWT.NONE, "Export as multiple files",
+ SWT.SAVE | SWT.SINGLE, ButtonType.CHECK_BOX);
+
+ Listener selectListener = new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ if (event.widget instanceof Button) {
+ Button button = (Button) event.widget;
+ if (button.getText().equals("Export as multiple files") && xmlMultiOption.isSelected()) {
+ xmlSingleOption.setSelected(false);
+ } else if (button.getText().equals("Export as single file") && xmlSingleOption.isSelected()) {
+ xmlMultiOption.setSelected(false);
+ }
+ updateStatus();
+ }
+ }
+ };
+
+ xmlMultiOption.addListener(selectListener);
+ xmlSingleOption.addListener(selectListener);
+ return group;
+ }
+
+ private void updateStatus() {
+ boolean result = false;
+ if (isDataStoreExport) {
+ if (isDataStoreBackupOption()) {
+ System.out.println("Backup Option");
+ result = Strings.isValid(getExportToDataStoreBackupFilePath());
+ } else {
+ System.out.println("Can't allow an insert without a backup");
+ }
+ } else {
+ result = Strings.isValid(getExportToXmlPath());
+ }
+ setPageComplete(result);
+ }
+
+ private Button createDataStoreButton(Composite parent) {
+ Button dataStoreButton = new Button(parent, SWT.CHECK);
+ String message = null;
+ try {
+ DatabaseMetaData meta = ConnectionHandler.getMetaData();
+ String product = meta.getDatabaseProductName();
+ int majorVersion = meta.getDatabaseMajorVersion();
+ int minorVersion = meta.getDatabaseMinorVersion();
+ message =
+ String.format("%s %s.%s - %s as %s", product, majorVersion, minorVersion,
+ ClientSessionManager.getDataStoreName(), ClientSessionManager.getDataStoreLoginName());
+
+ } catch (Exception ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.WARNING, ex);
+ message = "Data Store";
+ }
+ dataStoreButton.setText(String.format("%s", message));
+ return dataStoreButton;
+ }
+
+ private void setOutputFormat(boolean isDataStoreExport) {
+ this.isDataStoreExport = isDataStoreExport;
+ if (isWidgetValid(dataStoreExportButton) && isWidgetValid(xmlExportButton) && isWidgetValid(stackedViewer)) {
+ if (isDataStoreExport) {
+ xmlExportButton.setSelection(false);
+ dataStoreExportButton.setSelection(true);
+ stackedViewer.setCurrentControl(DATASTORE_OPTIONS);
+ } else {
+ dataStoreExportButton.setSelection(false);
+ xmlExportButton.setSelection(true);
+ stackedViewer.setCurrentControl(XML_FILE_OPTIONS);
+ }
+ }
+ }
+
+ private boolean isWidgetValid(Widget widget) {
+ return widget != null & !widget.isDisposed();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportWizard.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportWizard.java
new file mode 100644
index 00000000000..0aa8df91444
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMExportWizard.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.framework.ui.data.model.editor.wizard;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.osee.framework.ui.data.model.editor.operation.ODMToXmlOperation;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMExportWizard extends Wizard implements IExportWizard {
+
+ private ISelection selection;
+ private ODMSelectPage selectTypesPage;
+ private ODMExportOutputPage exportOutputPage;
+ private DataTypeCache dataTypeCache;
+
+ public ODMExportWizard(DataTypeCache dataTypeCache) {
+ setDialogSettings(ODMEditorActivator.getInstance().getDialogSettings());
+ setDefaultPageImageDescriptor(ODMImages.getImageDescriptor(ODMImages.EXPORT_IMAGE));
+ setNeedsProgressMonitor(true);
+ setWindowTitle("Osee Data Model Export Wizard");
+ this.dataTypeCache = dataTypeCache;
+ }
+
+ @Override
+ public void addPages() {
+ addPage(selectTypesPage = new ODMSelectPage("Osee Data Type Select", "Select Osee Data Types to export."));
+ addPage(exportOutputPage = new ODMExportOutputPage("Osee Data Type Export", "Select export destination."));
+ selectTypesPage.setInput(dataTypeCache);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#canFinish()
+ */
+ @Override
+ public boolean canFinish() {
+ ArtifactDataType[] selectedTypes = selectTypesPage.getSelected();
+ return selectedTypes != null && selectedTypes.length > 0 && Strings.isValid(exportOutputPage.getExportToXmlPath());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ ArtifactDataType[] selectedTypes = selectTypesPage.getSelected();
+ if (selectedTypes != null && selectedTypes.length > 0) {
+ IExceptionableRunnable worker = null;
+ String jobName = null;
+ if (exportOutputPage.isDataStoreExport()) {
+ jobName = "Export artifact types into data store";
+ worker = createDataStoreExportWorker(selectedTypes);
+ } else {
+ jobName = "Export artifact types as xml";
+ worker = createXmlExportWorker(selectedTypes);
+ }
+ if (worker != null) {
+ Jobs.runInJob(jobName, worker, ODMEditorActivator.class, ODMEditorActivator.PLUGIN_ID, true);
+ }
+ }
+ return true;
+ }
+
+ private IExceptionableRunnable createDataStoreExportWorker(final ArtifactDataType[] selectedTypes) {
+ final String backupfilePath = exportOutputPage.getExportToDataStoreBackupFilePath();
+ final boolean isBackupEnabled = exportOutputPage.isDataStoreBackupOption();
+ return new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ String extra = " no backup";
+ if (isBackupEnabled) {
+ extra = " backup " + backupfilePath;
+ }
+ System.out.println(String.format("Export into data store - %s", extra));
+ return Status.OK_STATUS;
+ }
+ };
+ }
+
+ private IExceptionableRunnable createXmlExportWorker(final ArtifactDataType[] selectedTypes) {
+ final String filePath = exportOutputPage.getExportToXmlPath();
+ final boolean exportToSingleFile = exportOutputPage.isExportToSingleXmlFileSelected();
+ return new IExceptionableRunnable() {
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ ODMToXmlOperation operation = new ODMToXmlOperation(filePath, exportToSingleFile, selectedTypes);
+ operation.execute(monitor);
+ return Status.OK_STATUS;
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportPage.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportPage.java
new file mode 100644
index 00000000000..21be44cadb0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportPage.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.framework.ui.data.model.editor.wizard;
+
+import java.sql.DatabaseMetaData;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.swt.StackedViewer;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMImportPage extends WizardPage {
+
+ private static final String DATASTORE_OPTIONS = "data.store.import.options";
+ private static final String XML_FILE_OPTIONS = "xml.import.options";
+
+ private StackedViewer stackedViewer;
+ private boolean isDataStoreExport;
+
+ private Button xmlExportButton;
+ private Button dataStoreExportButton;
+
+ private FileOrFolderTreeSelecPanel xmlImportSelect;
+
+ protected ODMImportPage(String pageName, String description) {
+ super(pageName, pageName, null);
+ setDescription(description);
+ isDataStoreExport = false;
+ }
+
+ public boolean isDataStoreExport() {
+ return isDataStoreExport;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ dataStoreExportButton = createDataStoreButton(composite);
+
+ xmlExportButton = new Button(composite, SWT.CHECK);
+ xmlExportButton.setText("From XML");
+
+ stackedViewer = new StackedViewer(composite, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ stackedViewer.setLayout(layout);
+ stackedViewer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ stackedViewer.addControl(DATASTORE_OPTIONS, createDataStoreOptions(stackedViewer.getStackComposite()));
+ stackedViewer.addControl(XML_FILE_OPTIONS, createXmlFileOptions(stackedViewer.getStackComposite()));
+
+ SelectionAdapter listener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Object object = e.getSource();
+ if (object instanceof Button) {
+ Button button = (Button) object;
+ setImportFrom(button.equals(dataStoreExportButton) && button.getSelection());
+ }
+ }
+ };
+
+ setImportFrom(isDataStoreExport);
+
+ xmlExportButton.addSelectionListener(listener);
+ dataStoreExportButton.addSelectionListener(listener);
+
+ setControl(composite);
+ }
+
+ private Control createDataStoreOptions(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("Import From Data Store Options");
+
+ // dataStoreBackupOption =
+ // FileOrFolderSelectPanel.createFileSelectPanel(group, SWT.NONE, "Backup Data Store Types",
+ // ButtonType.CHECK_BOX, new String[] {"xml"});
+ // dataStoreBackupOption.setDefaultFileName("osee.types.db.backup.xml");
+
+ return group;
+ }
+
+ private Control createXmlFileOptions(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("Import From Xml Options");
+
+ xmlImportSelect = new FileOrFolderTreeSelecPanel(group, SWT.NONE);
+ return group;
+ }
+
+ private Button createDataStoreButton(Composite parent) {
+ Button dataStoreButton = new Button(parent, SWT.CHECK);
+ String message = null;
+ try {
+ DatabaseMetaData meta = ConnectionHandler.getMetaData();
+ String product = meta.getDatabaseProductName();
+ int majorVersion = meta.getDatabaseMajorVersion();
+ int minorVersion = meta.getDatabaseMinorVersion();
+ message =
+ String.format("%s %s.%s - %s as %s", product, majorVersion, minorVersion,
+ ClientSessionManager.getDataStoreName(), ClientSessionManager.getDataStoreLoginName());
+
+ } catch (Exception ex) {
+ OseeLog.log(ODMEditorActivator.class, Level.WARNING, ex);
+ message = "Data Store";
+ }
+ dataStoreButton.setText(String.format("%s", message));
+ return dataStoreButton;
+ }
+
+ private void setImportFrom(boolean isDataStoreExport) {
+ this.isDataStoreExport = isDataStoreExport;
+ if (isWidgetValid(dataStoreExportButton) && isWidgetValid(xmlExportButton) && isWidgetValid(stackedViewer)) {
+ if (isDataStoreExport) {
+ xmlExportButton.setSelection(false);
+ dataStoreExportButton.setSelection(true);
+ stackedViewer.setCurrentControl(DATASTORE_OPTIONS);
+ } else {
+ dataStoreExportButton.setSelection(false);
+ xmlExportButton.setSelection(true);
+ stackedViewer.setCurrentControl(XML_FILE_OPTIONS);
+ }
+ }
+ }
+
+ public List<String> getSelected() {
+ return xmlImportSelect.getCheckedItems();
+ }
+
+ private boolean isWidgetValid(Widget widget) {
+ return widget != null & !widget.isDisposed();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportWizard.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportWizard.java
new file mode 100644
index 00000000000..8eae641a199
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMImportWizard.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.framework.ui.data.model.editor.wizard;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.ui.data.model.editor.ODMEditorActivator;
+import org.eclipse.osee.framework.ui.data.model.editor.core.ODMEditor;
+import org.eclipse.osee.framework.ui.data.model.editor.model.DataTypeCache;
+import org.eclipse.osee.framework.ui.data.model.editor.utility.ODMImages;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMImportWizard extends Wizard implements IImportWizard {
+
+ private final ODMEditor editor;
+ private ODMImportPage importPage;
+ private ODMSelectPage selectTypesPage;
+ private DataTypeCache dataTypeCache;
+
+ public ODMImportWizard(ODMEditor editor) {
+ this.editor = editor;
+ dataTypeCache = new DataTypeCache();
+ setDialogSettings(ODMEditorActivator.getInstance().getDialogSettings());
+ setDefaultPageImageDescriptor(ODMImages.getImageDescriptor(ODMImages.IMPORT_IMAGE));
+ setNeedsProgressMonitor(true);
+ setWindowTitle("Osee Data Model Import Wizard");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#addPages()
+ */
+ @Override
+ public void addPages() {
+ addPage(importPage = new ODMImportPage("Osee Data Type Source", "Select Osee Data Type Sources."));
+ addPage(selectTypesPage = new ODMSelectPage("Osee Data Type Select", "Select Osee Data Types to import."));
+ selectTypesPage.setInput(dataTypeCache);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#canFinish()
+ */
+ @Override
+ public boolean canFinish() {
+ return super.canFinish();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMSelectPage.java b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMSelectPage.java
new file mode 100644
index 00000000000..93f47728b41
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.data.model.editor/src/org/eclipse/osee/framework/ui/data/model/editor/wizard/ODMSelectPage.java
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.data.model.editor.wizard;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.ui.data.model.editor.model.ArtifactDataType;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ArtifactTypeContentProvider;
+import org.eclipse.osee.framework.ui.data.model.editor.model.helper.ArtifactTypeLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
+import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ODMSelectPage extends WizardPage {
+
+ private CheckboxTreeViewer fViewer;
+ private ILabelProvider fLabelProvider;
+ private ITreeContentProvider fContentProvider;
+ private ISelectionStatusValidator fValidator = null;
+ private ViewerComparator fComparator;
+ private String fEmptyListMessage = "Nothing Available";
+ private IStatus fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
+ private List<ViewerFilter> fFilters;
+ private Object fInput;
+ private boolean fIsEmpty;
+ private int fWidth = 60;
+ private int fHeight = 18;
+ private boolean fContainerMode;
+ private Object[] fExpandedElements;
+ private List<Object> fInitialSelections;
+
+ public ODMSelectPage(String pageName, String description) {
+ super(pageName, pageName, null);
+ setDescription(description);
+ fContainerMode = false;
+ fExpandedElements = null;
+ fInitialSelections = new ArrayList<Object>();
+ fLabelProvider = new ArtifactTypeLabelProvider();
+ fContentProvider = new ArtifactTypeContentProvider();
+ fContainerMode = false;
+ setPageComplete(false);
+ }
+
+ public void setInitialSelections(Object[] items) {
+ this.fInitialSelections.clear();
+ if (items != null && items.length > 0) {
+ this.fInitialSelections.addAll(Arrays.asList(items));
+ }
+ }
+
+ public void setComparator(ViewerComparator comparator) {
+ fComparator = comparator;
+ }
+
+ public void addFilter(ViewerFilter filter) {
+ if (fFilters == null) {
+ fFilters = new ArrayList<ViewerFilter>(4);
+ }
+ fFilters.add(filter);
+ }
+
+ public void setValidator(ISelectionStatusValidator validator) {
+ fValidator = validator;
+ }
+
+ public void setInput(Object input) {
+ fInput = input;
+ }
+
+ public void setExpandedElements(Object[] elements) {
+ fExpandedElements = elements;
+ }
+
+ public void setSize(int width, int height) {
+ fWidth = width;
+ fHeight = height;
+ }
+
+ protected void updateOKStatus() {
+ if (!fIsEmpty) {
+ if (fValidator != null) {
+ fCurrStatus = fValidator.validate(fViewer.getCheckedElements());
+ updateStatus(fCurrStatus);
+ } else if (!fCurrStatus.isOK()) {
+ fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK, "", //$NON-NLS-1$
+ null);
+ }
+ } else {
+ fCurrStatus = new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.OK, fEmptyListMessage, null);
+ }
+ updateStatus(fCurrStatus);
+ }
+
+ private void updateStatus(IStatus status) {
+
+ }
+
+ public void create() {
+ BusyIndicator.showWhile(null, new Runnable() {
+ public void run() {
+ fViewer.setCheckedElements(getInitialElementSelections().toArray());
+ if (fExpandedElements != null) {
+ fViewer.setExpandedElements(fExpandedElements);
+ }
+ updateOKStatus();
+ }
+ });
+ }
+
+ private List<Object> getInitialElementSelections() {
+ return fInitialSelections;
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Label messageLabel = new Label(composite, SWT.NONE);
+ if (messageLabel != null) {
+ messageLabel.setText("Hello");
+ }
+ messageLabel.setFont(composite.getFont());
+
+ CheckboxTreeViewer treeViewer = createTreeViewer(composite);
+ Control buttonComposite = createSelectionButtons(composite);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.widthHint = convertWidthInCharsToPixels(fWidth);
+ data.heightHint = convertHeightInCharsToPixels(fHeight);
+ Tree treeWidget = treeViewer.getTree();
+ treeWidget.setLayoutData(data);
+ treeWidget.setFont(parent.getFont());
+ if (fIsEmpty) {
+ messageLabel.setEnabled(false);
+ treeWidget.setEnabled(false);
+ buttonComposite.setEnabled(false);
+ }
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ setPageComplete(getSelected().length > 0);
+ }
+ });
+
+ setControl(composite);
+ }
+
+ protected CheckboxTreeViewer createTreeViewer(Composite parent) {
+ if (fContainerMode) {
+ fViewer = new ContainerCheckedTreeViewer(parent, SWT.BORDER);
+ } else {
+ fViewer = new CheckboxTreeViewer(parent, SWT.BORDER);
+ }
+
+ fViewer.setContentProvider(fContentProvider);
+ fViewer.setLabelProvider(fLabelProvider);
+ fViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ updateOKStatus();
+ }
+ });
+ fViewer.setComparator(fComparator);
+ if (fFilters != null) {
+ for (int i = 0; i != fFilters.size(); i++) {
+ fViewer.addFilter((ViewerFilter) fFilters.get(i));
+ }
+ }
+ fViewer.setInput(fInput);
+ return fViewer;
+ }
+
+ protected CheckboxTreeViewer getTreeViewer() {
+ return fViewer;
+ }
+
+ protected Composite createSelectionButtons(Composite composite) {
+ Composite buttonComposite = new Composite(composite, SWT.RIGHT);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ buttonComposite.setLayout(layout);
+ buttonComposite.setFont(composite.getFont());
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
+ data.grabExcessHorizontalSpace = true;
+ composite.setData(data);
+ Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, "Select All", false);
+ SelectionListener listener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Object[] viewerElements = fContentProvider.getElements(fInput);
+ if (fContainerMode) {
+ fViewer.setCheckedElements(viewerElements);
+ } else {
+ for (int i = 0; i < viewerElements.length; i++) {
+ fViewer.setSubtreeChecked(viewerElements[i], true);
+ }
+ }
+ updateOKStatus();
+ }
+ };
+ selectButton.addSelectionListener(listener);
+ Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, "De-select All", false);
+ listener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ fViewer.setCheckedElements(new Object[0]);
+ updateOKStatus();
+ }
+ };
+ deselectButton.addSelectionListener(listener);
+ return buttonComposite;
+ }
+
+ protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
+ // increment the number of columns in the button bar
+ ((GridLayout) parent.getLayout()).numColumns++;
+ Button button = new Button(parent, SWT.PUSH);
+ button.setText(label);
+ button.setFont(JFaceResources.getDialogFont());
+ button.setData(new Integer(id));
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ // buttonPressed(((Integer) event.widget.getData()).intValue());
+ }
+ });
+ if (defaultButton) {
+ Shell shell = parent.getShell();
+ if (shell != null) {
+ shell.setDefaultButton(button);
+ }
+ }
+ // buttons.put(new Integer(id), button);
+ setButtonLayoutData(button);
+ return button;
+ }
+
+ private boolean evaluateIfTreeEmpty(Object input) {
+ Object[] elements = fContentProvider.getElements(input);
+ if (elements.length > 0) {
+ if (fFilters != null) {
+ for (int i = 0; i < fFilters.size(); i++) {
+ ViewerFilter curr = (ViewerFilter) fFilters.get(i);
+ elements = curr.filter(fViewer, input, elements);
+ }
+ }
+ }
+ return elements.length == 0;
+ }
+
+ public ArtifactDataType[] getSelected() {
+ Object[] checked = getTreeViewer().getCheckedElements();
+ List<ArtifactDataType> selected = new ArrayList<ArtifactDataType>();
+ if (checked != null && checked.length > 0) {
+ for (Object object : checked) {
+ if (object instanceof ArtifactDataType) {
+ selected.add((ArtifactDataType) object);
+ }
+ }
+ }
+ return selected.toArray(new ArtifactDataType[selected.size()]);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.encrypter/.classpath b/org.eclipse.osee.framework.ui.encrypter/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.encrypter/.project b/org.eclipse.osee.framework.ui.encrypter/.project
new file mode 100644
index 00000000000..62517fafa79
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.encrypter</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.encrypter/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.encrypter/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..8a146e2c7f6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Encrypter Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.encrypter;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-ClassPath: encrypter.jar
+Bundle-Activator: org.eclipse.osee.framework.ui.encrypter.EncrypterPlugin
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.framework.ui.encrypter
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.osee.framework.ui.security,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.ui.encrypter/build.properties b/org.eclipse.osee.framework.ui.encrypter/build.properties
new file mode 100644
index 00000000000..3a79aa6ce9a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/build.properties
@@ -0,0 +1,6 @@
+source.encrypter.jar = src/
+output.encrypter.jar = bin/
+bin.includes = plugin.xml,\
+ encrypter.jar,\
+ images/,\
+ META-INF/
diff --git a/org.eclipse.osee.framework.ui.encrypter/images/lock.gif b/org.eclipse.osee.framework.ui.encrypter/images/lock.gif
new file mode 100644
index 00000000000..68fd6cf39ca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/images/lock.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.encrypter/images/sample.gif b/org.eclipse.osee.framework.ui.encrypter/images/sample.gif
new file mode 100644
index 00000000000..34fb3c9d8cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/images/sample.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.encrypter/plugin.xml b/org.eclipse.osee.framework.ui.encrypter/plugin.xml
new file mode 100644
index 00000000000..49d15d94baf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ name="Encrypter"
+ id="encrypter">
+ </category>
+ <view
+ name="Encrypter"
+ icon="images/lock.gif"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.encrypter.EncrypterView"
+ id="osee.encrypter.EncrypterView">
+ </view>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterAction.java b/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterAction.java
new file mode 100644
index 00000000000..e790efa3709
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterAction.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.framework.ui.encrypter;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Our sample action implements workbench action delegate. The action proxy will be created by the workbench and shown
+ * in the UI. When the user tries to use the action, this delegate will be created and execution will be delegated to
+ * it.
+ *
+ * @see IWorkbenchWindowActionDelegate
+ */
+public class EncrypterAction implements IWorkbenchWindowActionDelegate {
+
+ /**
+ * The constructor.
+ */
+ public EncrypterAction() {
+ }
+
+ /**
+ * The action has been activated. The argument of the method represents the 'real' action sitting in the workbench
+ * UI.
+ *
+ * @see IWorkbenchWindowActionDelegate#run
+ */
+ public void run(IAction action) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ page.showView(EncrypterView.VIEW_ID);
+ } catch (PartInitException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Launch Error",
+ "Couldn't Launch OSEE Encrypter View " + e1.getMessage());
+ }
+ }
+
+ /**
+ * Selection in the workbench has been changed. We can change the state of the 'real' action here if we want, but
+ * this can only happen after the delegate has been created.
+ *
+ * @see IWorkbenchWindowActionDelegate#selectionChanged
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ /**
+ * We can use this method to dispose of any system resources we previously allocated.
+ *
+ * @see IWorkbenchWindowActionDelegate#dispose
+ */
+ public void dispose() {
+ }
+
+ /**
+ * We will cache window object in order to be able to provide parent shell for the message dialog.
+ *
+ * @see IWorkbenchWindowActionDelegate#init
+ */
+ public void init(IWorkbenchWindow window) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterPlugin.java b/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterPlugin.java
new file mode 100644
index 00000000000..3cdf664a4cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterPlugin.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.framework.ui.encrypter;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class EncrypterPlugin extends OseeUiActivator {
+
+ //The shared instance.
+ private static EncrypterPlugin plugin;
+
+ /**
+ * The constructor.
+ */
+ public EncrypterPlugin() {
+ plugin = this;
+ }
+
+ public static EncrypterPlugin getInstance() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterView.java b/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterView.java
new file mode 100644
index 00000000000..42ad211343f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.encrypter/src/org/eclipse/osee/framework/ui/encrypter/EncrypterView.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.encrypter;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.ui.security.DESEncrypter;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+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.program.Program;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class EncrypterView extends ViewPart implements IActionable {
+
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.encrypter.EncrypterView";
+ private DESEncrypter encrypter;
+ private Text applicationPath;
+ private File input;
+ private File encrypt;
+ private File decrypt;
+ private String pathResults;
+
+ /**
+ * The constructor.
+ */
+ public EncrypterView() {
+ pathResults = "";
+ }
+
+ /**
+ * This is a callback that will allow us to create the viewer and initialize it.
+ */
+ public void createPartControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(8, false);
+ composite.setLayout(layout);
+
+ Label description = new Label(composite, SWT.NONE);
+ description.setText("Encrypt / Decrypt a file.");
+ GridData gridData = new GridData();
+ gridData.horizontalSpan = 8;
+ description.setLayoutData(gridData);
+
+ applicationPath = new Text(composite, SWT.BORDER);
+ gridData = new GridData();
+ gridData.widthHint = 450;
+ gridData.horizontalSpan = 6;
+ applicationPath.setLayoutData(gridData);
+
+ Button browseButton = new Button(composite, SWT.PUSH);
+ browseButton.setText("Browse");
+
+ Button editButton = new Button(composite, SWT.PUSH);
+ editButton.setText("Edit");
+
+ Button encryptButton = new Button(composite, SWT.PUSH);
+ encryptButton.setText("Encrypt");
+
+ Button decryptButton = new Button(composite, SWT.PUSH);
+ decryptButton.setText("Decrypt");
+
+ browseButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ browseForFile();
+ }
+ });
+
+ editButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ editFile();
+ }
+ });
+
+ encryptButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ encrypt();
+ }
+ });
+
+ decryptButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ decrypt();
+ }
+ });
+ }
+
+ protected void editFile() {
+ if (!pathResults.equals("")) Program.launch(pathResults);
+ }
+
+ /**
+ * Decrypts a file
+ */
+ protected void decrypt() {
+ String password = getPassWord();
+ try {
+
+ if (password.equals("")) {
+ invalidPassPhraseMsg();
+ } else if (password.equals("Canceled")) {
+ return;
+ } else {
+ if (pathResults.length() != 0) {
+ encrypter = new DESEncrypter(password);
+ encrypter.decrypt(new FileInputStream(input), new FileOutputStream(decrypt));
+ cleanUpFiles(decrypt, input);
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * Encrypts a file
+ */
+ protected void encrypt() {
+ String password = getPassWord();
+ try {
+
+ if (password.equals("")) {
+ invalidPassPhraseMsg();
+ } else if (password.equals("Canceled")) {
+ return;
+ } else {
+ if (pathResults.length() != 0) {
+ encrypter = new DESEncrypter(password);
+ encrypter.encrypt(new FileInputStream(input), new FileOutputStream(encrypt));
+ cleanUpFiles(encrypt, input);
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private void browseForFile() {
+ FileDialog fileDialog = new FileDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ pathResults = fileDialog.open();
+
+ if ((pathResults != null)) {
+ applicationPath.setText(pathResults);
+ input = new File(pathResults);
+ encrypt = new File(input.getPath().substring(0, input.getPath().lastIndexOf("\\") + 1) + "encrpyt");
+ decrypt = new File(input.getPath().substring(0, input.getPath().lastIndexOf("\\") + 1) + "descrypt");
+ } else {
+ pathResults = "";
+ }
+ }
+
+ /**
+ * copies source to destination file and then deletes source file
+ */
+ private void cleanUpFiles(File source, File destination) {
+ try {
+ FileInputStream streamIn = new FileInputStream(source);
+ FileOutputStream streamOut = new FileOutputStream(destination);
+
+ int c;
+ try {
+ while ((c = streamIn.read()) != -1) {
+ streamOut.write(c);
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } finally {
+ try {
+ streamIn.close();
+ streamOut.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ source.delete();
+ } catch (FileNotFoundException ex1) {
+ ex1.printStackTrace();
+ }
+ }
+
+ /**
+ * @return String, pass phrase
+ */
+ private String getPassWord() {
+ String passWord = "";
+ int result = -1;
+ EntryDialog ed =
+ new EntryDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Pass Phrase", null,
+ "Enter pass phrase", MessageDialog.QUESTION, new String[] {"Ok", "Cancel"}, 0);
+ result = ed.open();
+
+ if (result == 0) {
+ if (!ed.getEntry().equals("")) {
+ passWord = ed.getEntry();
+ }
+ } else {
+ passWord = "Canceled";
+ }
+ return passWord;
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ }
+
+ /**
+ * displays invalid pass phrase message
+ */
+ private void invalidPassPhraseMsg() {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Pass phrase Error",
+ "Invalid Pass phrase.");
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.feature/.project b/org.eclipse.osee.framework.ui.feature/.project
new file mode 100644
index 00000000000..671b63a1793
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.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.framework.ui.feature/build.properties b/org.eclipse.osee.framework.ui.feature/build.properties
new file mode 100644
index 00000000000..add83c7a24c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+ epl-v10.html,\
+ feature.properties,\
+ license.html,\
+ osee_32.png
diff --git a/org.eclipse.osee.framework.ui.feature/epl-v10.html b/org.eclipse.osee.framework.ui.feature/epl-v10.html
new file mode 100644
index 00000000000..ed4b196655e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.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.framework.ui.feature/feature.properties b/org.eclipse.osee.framework.ui.feature/feature.properties
new file mode 100644
index 00000000000..1bb18273a39
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.feature/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 Framework UI (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.framework.ui.feature/feature.xml b/org.eclipse.osee.framework.ui.feature/feature.xml
new file mode 100644
index 00000000000..72a3ac82d8f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.feature/feature.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.framework.ui.feature"
+ label="%featureName"
+ version="1.0.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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="%licenseURL">
+ %license
+ </license>
+
+ <url>
+ <update label="Osee Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.admin"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.encrypter"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.jdk"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.plugin"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.product"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.security"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.service.control"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.skynet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.swt"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.nebula.widgets.calendarcombo"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.nebula.widgets.xviewer"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.data.model.editor"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.branch.graph"
+ 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"/>
+</feature>
diff --git a/org.eclipse.osee.framework.ui.feature/license.html b/org.eclipse.osee.framework.ui.feature/license.html
new file mode 100644
index 00000000000..c6af966b61e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.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.framework.ui.feature/osee_32.png b/org.eclipse.osee.framework.ui.feature/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.feature/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.framework.ui.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 00000000000..16431f39fa9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.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 Framework UI 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.framework.ui.jdk/.classpath b/org.eclipse.osee.framework.ui.jdk/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.jdk/.project b/org.eclipse.osee.framework.ui.jdk/.project
new file mode 100644
index 00000000000..9c58b0680ae
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.jdk</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.jdk/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.jdk/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..ac256b87783
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Mon Aug 04 11:05:09 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.osee.framework.ui.jdk/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.jdk/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..7029c676c6c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE JDK Ui Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.jdk;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.jdk.Activator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.jdk,
+ org.eclipse.osee.framework.ui.jdk.swing
+Bundle-ClassPath: library.jar
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.ui.jdk/build.properties b/org.eclipse.osee.framework.ui.jdk/build.properties
new file mode 100644
index 00000000000..97c13f300cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+ library.jar
+source.library.jar = src/
+output.library.jar = bin/
+jars.compile.order = library.jar
diff --git a/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/Activator.java b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/Activator.java
new file mode 100644
index 00000000000..bc62c661f24
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/Activator.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.framework.ui.jdk;
+
+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.framework.ui.jdk";
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /*
+ * (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.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/DialogSupport.java b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/DialogSupport.java
new file mode 100644
index 00000000000..c7169fe260a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/DialogSupport.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.framework.ui.jdk.swing;
+
+import java.awt.Component;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import javax.swing.JOptionPane;
+
+public class DialogSupport {
+
+ public static void popupExceptionDialog(Component parent, String dlgTitle, Exception ex) {
+ PrintWriter ps = new PrintWriter(new StringWriter());
+ ex.printStackTrace(ps);
+ JOptionPane.showMessageDialog(parent, ex.getMessage() + "\n" + ps, dlgTitle, JOptionPane.ERROR_MESSAGE);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/EasyGridConstraint.java b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/EasyGridConstraint.java
new file mode 100644
index 00000000000..75e7a1e62fe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/EasyGridConstraint.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.swing;
+
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class EasyGridConstraint extends GridBagConstraints {
+ private static final long serialVersionUID = -1745538537160837428L;
+
+ public EasyGridConstraint setGrid(int x, int y) {
+ this.gridx = x;
+ this.gridy = y;
+
+ return this;
+ }
+
+ public EasyGridConstraint setHeight(int height) {
+ this.gridheight = height;
+
+ return this;
+ }
+
+ public EasyGridConstraint setWidth(int width) {
+ this.gridwidth = width;
+
+ return this;
+ }
+
+ public EasyGridConstraint setWeight(double x, double y) {
+ this.weightx = x;
+ this.weighty = y;
+
+ return this;
+ }
+
+ public EasyGridConstraint setXPadding(int x) {
+ this.ipadx = x;
+
+ return this;
+ }
+
+ public EasyGridConstraint setYPadding(int y) {
+ this.ipadx = y;
+
+ return this;
+ }
+
+ public EasyGridConstraint setXInsets(int x) {
+ this.insets.left = x;
+ this.insets.right = x;
+
+ return this;
+ }
+
+ public EasyGridConstraint setYInsets(int y) {
+ this.insets.top = y;
+ this.insets.bottom = y;
+
+ return this;
+ }
+
+ public EasyGridConstraint setInsets(int top, int left, int bottom, int right) {
+ this.insets.top = top;
+ this.insets.left = left;
+ this.insets.bottom = bottom;
+ this.insets.right = right;
+
+ return this;
+ }
+
+ public EasyGridConstraint fillBoth() {
+ this.fill = GridBagConstraints.BOTH;
+
+ return this;
+ }
+
+ public EasyGridConstraint fillVert() {
+ this.fill = GridBagConstraints.VERTICAL;
+
+ return this;
+ }
+
+ public EasyGridConstraint fillHorz() {
+ this.fill = GridBagConstraints.HORIZONTAL;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorNorth() {
+ this.anchor = GridBagConstraints.NORTH;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorNorthEast() {
+ this.anchor = GridBagConstraints.NORTHEAST;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorNorthWest() {
+ this.anchor = GridBagConstraints.NORTHWEST;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorSouth() {
+ this.anchor = GridBagConstraints.SOUTH;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorSouthEast() {
+ this.anchor = GridBagConstraints.SOUTHEAST;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorSouthWest() {
+ this.anchor = GridBagConstraints.SOUTHWEST;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorEast() {
+ this.anchor = GridBagConstraints.EAST;
+
+ return this;
+ }
+
+ public EasyGridConstraint anchorWest() {
+ this.anchor = GridBagConstraints.WEST;
+
+ return this;
+ }
+
+ public static GridBagConstraints setConstraints(int gridx, int gridy, double weightx, double weighty, int gridwidth, int gridheight, char fill, String anchor) {
+ return setConstraints(gridx, gridy, weightx, weighty, gridwidth, gridheight, fill, anchor, 0, 0, null);
+ }
+
+ public static GridBagConstraints setConstraints(int gridx, int gridy, double weightx, double weighty, int gridwidth, int gridheight, char fill, String anchor, Insets insets) {
+ return setConstraints(gridx, gridy, weightx, weighty, gridwidth, gridheight, fill, anchor, 0, 0, insets);
+ }
+
+ /**
+ * A wrapper for setting the constraints of a GridBag object.
+ *
+ * @param gridx Specifies the cell at the left of the component's display area, where the leftmost cell has gridx =
+ * 0.
+ * @param gridy Specifies the cell at the top of the component's display area, where the topmost cell has gridy = 0.
+ * @param weightx Specifies how to distribute extra horizontal space.
+ * @param weighty Specifies how to distribute extra vertical space.
+ * @param gridwidth Specifies the number of cells in a row for the component's display area.
+ * @param gridheight Specifies the number of cells in a column for the component's display area.
+ * @param fill This field is used when the component's display area is larger than the component's requested size.
+ * @param anchor This field is used when the component is smaller than its display area.
+ * @param insets Specifies the external padding of the component -- the minimum amount of space between the component
+ * and the edges of its display area.
+ * @param ipadx Specifies the component's horizontal internal padding
+ * @param ipady Specifies the component's vertical internal padding
+ * @return java.awt.GridBagConstraints
+ */
+ public static GridBagConstraints setConstraints(int gridx, int gridy, double weightx, double weighty, int gridwidth, int gridheight, char fill, String anchor, int ipadx, int ipady, Insets insets) {
+ // gridx, gridy, weightx, weighty, gridwidth, gridheight, char fill, String anchor, insets, ipadx, ipady
+
+ GridBagConstraints gbc = new GridBagConstraints();
+ gbc.gridx = gridx;
+ gbc.gridy = gridy;
+ gbc.weightx = weightx;
+ gbc.weighty = weighty;
+ gbc.gridwidth = gridwidth;
+ gbc.gridheight = gridheight;
+ gbc.ipadx = ipadx;
+ gbc.ipady = ipady;
+ if (insets != null) {
+ gbc.insets = insets;
+ }
+
+ switch (fill) {
+ case 'V':
+ gbc.fill = GridBagConstraints.VERTICAL;
+ break;
+ case 'H':
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ break;
+ case 'B':
+ gbc.fill = GridBagConstraints.BOTH;
+ break;
+ }
+
+ if (anchor.equals("N")) {
+ gbc.anchor = GridBagConstraints.NORTH;
+ } else if (anchor.equals("NE")) {
+ gbc.anchor = GridBagConstraints.NORTHEAST;
+ } else if (anchor.equals("E")) {
+ gbc.anchor = GridBagConstraints.EAST;
+ } else if (anchor.equals("SE")) {
+ gbc.anchor = GridBagConstraints.SOUTHEAST;
+ } else if (anchor.equals("S")) {
+ gbc.anchor = GridBagConstraints.SOUTH;
+ } else if (anchor.equals("SW")) {
+ gbc.anchor = GridBagConstraints.SOUTHWEST;
+ } else if (anchor.equals("W")) {
+ gbc.anchor = GridBagConstraints.WEST;
+ } else if (anchor.equals("NW")) {
+ gbc.anchor = GridBagConstraints.NORTHWEST;
+ }
+ return gbc;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/FileListEditor.java b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/FileListEditor.java
new file mode 100644
index 00000000000..699e0696063
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.jdk/src/org/eclipse/osee/framework/ui/jdk/swing/FileListEditor.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.jdk.swing;
+
+import java.awt.Component;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FileListEditor extends JPanel implements ActionListener {
+
+ private static final long serialVersionUID = -4397118110586026746L;
+ private DefaultListModel listModel;
+ private JList list;
+ private JFileChooser chooser;
+ private JButton addButton;
+ private JButton removeButton;
+ private String relativeToPath;
+
+ public FileListEditor() {
+ this(null, null, JFileChooser.FILES_AND_DIRECTORIES, null);
+ }
+
+ public FileListEditor(List<File> items, File currentDir, int mode, File relativeToFile) {
+ super(new GridBagLayout());
+
+ if (relativeToFile != null) {
+ try {
+ this.relativeToPath = relativeToFile.getCanonicalFile().getPath(); //ensure this has a standard name
+ } catch (IOException ex) {
+ // this.relativeToFile is already null so do nothing
+ }
+ }
+
+ listModel = new DefaultListModel();
+ list = new JList(listModel);
+ chooser = new JFileChooser(currentDir);
+
+ chooser.setFileSelectionMode(mode);
+ chooser.setMultiSelectionEnabled(true);
+
+ if (items != null) {
+ addFiles(items);
+ }
+
+ JScrollPane scrollList = new JScrollPane(list);
+ add(scrollList, EasyGridConstraint.setConstraints(0, 0, 1, 1, 2, 1, 'B', ""));
+
+ addButton = new JButton("Add");
+ addButton.addActionListener(this);
+ add(addButton, EasyGridConstraint.setConstraints(0, 1, 1, 0, 1, 1, 'N', "W"));
+
+ removeButton = new JButton("Remove");
+ removeButton.addActionListener(this);
+ add(removeButton, EasyGridConstraint.setConstraints(1, 1, 1, 0, 1, 1, 'N', "E"));
+
+ }
+
+ public void setChooserTitle(String title) {
+ chooser.setDialogTitle(title);
+ }
+
+ public void actionPerformed(ActionEvent ev) {
+ Component component = (Component) ev.getSource();
+ if (component == addButton) {
+ if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
+ File[] files = chooser.getSelectedFiles();
+ for (int i = 0; i < files.length; i++) {
+ if (relativeToPath == null) {
+ listModel.addElement(files[i].getPath());
+ } else {
+ try {
+ String path = files[i].getCanonicalFile().getPath();
+ if (path.startsWith(relativeToPath)) {
+ listModel.addElement(path.substring(relativeToPath.length() + 1));
+ } else {
+ System.out.println("Path is not relative to " + relativeToPath);
+ }
+ } catch (IOException ex) {
+ System.out.println(ex);
+ }
+ }
+ }
+ }
+ } else if (component == removeButton) {
+ int[] indices = list.getSelectedIndices();
+ for (int i = indices.length - 1; i > -1; i--) {
+ listModel.remove(indices[i]);
+ }
+ }
+ }
+
+ public void addFiles(List<File> items) {
+ for (Iterator<File> i = items.iterator(); i.hasNext();) {
+ File file = i.next();
+ if (relativeToPath == null) {
+ listModel.addElement(file.getPath());
+ } else {
+ try {
+ String path = file.getCanonicalFile().getPath();
+ if (path.startsWith(relativeToPath)) {
+ listModel.addElement(path.substring(relativeToPath.length() + 1));
+ } else {
+ System.out.println("Path is not relative to " + relativeToPath);
+ }
+ } catch (IOException ex) {
+ System.out.println(ex);
+ }
+ }
+ }
+ }
+
+ public void addFiles(String[] files) {
+ for (int i = 0; i < files.length; i++) {
+ listModel.addElement(files[i]);
+ }
+ }
+
+ public void addFile(String file) {
+ listModel.addElement(file);
+ }
+
+ public void writeListTo(File file) throws IOException {
+ BufferedWriter out = new BufferedWriter(new FileWriter(file));
+ for (Enumeration<?> e = listModel.elements(); e.hasMoreElements();) {
+ out.write((String) e.nextElement());
+ out.newLine();
+ }
+ out.close();
+ }
+
+ public File[] getFiles() {
+ File[] files = new File[listModel.size()];
+ Enumeration<?> e = listModel.elements();
+ for (int i = 0; i < files.length; i++) {
+ files[i] = new File((String) e.nextElement());
+ }
+ return files;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/.classpath b/org.eclipse.osee.framework.ui.plugin/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/.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.framework.ui.plugin/.project b/org.eclipse.osee.framework.ui.plugin/.project
new file mode 100644
index 00000000000..0487983e96f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.plugin</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.plugin/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.plugin/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.plugin/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.plugin/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c0c4336bb76
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/META-INF/MANIFEST.MF
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Framework Ui Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.plugin;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.plugin.OseePluginUiActivator
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.apache.commons.lang,
+ org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.console,
+ org.eclipse.ui.forms,
+ org.junit4,
+ org.eclipse.osee.framework.db.connection
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.plugin.io,
+ org.eclipse.osee.framework.ui.plugin.util,
+ org.eclipse.osee.framework.ui.plugin.views.property,
+ org.eclipse.osee.framework.ui.plugin.workspace
+Import-Package: org.eclipse.jdt.core,
+ org.eclipse.jdt.ui,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.skynet.core.utility
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.ui.plugin/build.properties b/org.eclipse.osee.framework.ui.plugin/build.properties
new file mode 100644
index 00000000000..c6e51a81c97
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/build.properties
@@ -0,0 +1,8 @@
+bin.includes = META-INF/,\
+ images/,\
+ .,\
+ schema/,\
+ plugin.xml
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.framework.ui.plugin/images/browse.gif b/org.eclipse.osee.framework.ui.plugin/images/browse.gif
new file mode 100644
index 00000000000..55ca8f3a9bf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/browse.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/bug.gif b/org.eclipse.osee.framework.ui.plugin/images/bug.gif
new file mode 100644
index 00000000000..9a738e55054
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/bug.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/edit.gif b/org.eclipse.osee.framework.ui.plugin/images/edit.gif
new file mode 100644
index 00000000000..22f0c4cba28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/edit.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/errorSm.gif b/org.eclipse.osee.framework.ui.plugin/images/errorSm.gif
new file mode 100644
index 00000000000..8612eaff599
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/errorSm.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/faq.gif b/org.eclipse.osee.framework.ui.plugin/images/faq.gif
new file mode 100644
index 00000000000..520c1a8666a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/faq.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/filter.gif b/org.eclipse.osee.framework.ui.plugin/images/filter.gif
new file mode 100644
index 00000000000..3d061d77cbe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/filter.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/lockkey.gif b/org.eclipse.osee.framework.ui.plugin/images/lockkey.gif
new file mode 100644
index 00000000000..fca03252afd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/lockkey.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/needSave.gif b/org.eclipse.osee.framework.ui.plugin/images/needSave.gif
new file mode 100644
index 00000000000..499dd0ca602
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/needSave.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/new.gif b/org.eclipse.osee.framework.ui.plugin/images/new.gif
new file mode 100644
index 00000000000..9d050885be6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/new.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/open.gif b/org.eclipse.osee.framework.ui.plugin/images/open.gif
new file mode 100644
index 00000000000..51e703b1b9c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/open.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/permission.bmp b/org.eclipse.osee.framework.ui.plugin/images/permission.bmp
new file mode 100644
index 00000000000..8a3e111c129
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/permission.bmp
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/publish.gif b/org.eclipse.osee.framework.ui.plugin/images/publish.gif
new file mode 100644
index 00000000000..a031b62c2d3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/publish.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/refresh.gif b/org.eclipse.osee.framework.ui.plugin/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/remove.gif b/org.eclipse.osee.framework.ui.plugin/images/remove.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/remove.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/report.gif b/org.eclipse.osee.framework.ui.plugin/images/report.gif
new file mode 100644
index 00000000000..e6bf9cf178e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/report.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/sample.gif b/org.eclipse.osee.framework.ui.plugin/images/sample.gif
new file mode 100644
index 00000000000..34fb3c9d8cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/sample.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/saved.gif b/org.eclipse.osee.framework.ui.plugin/images/saved.gif
new file mode 100644
index 00000000000..ad505a9c23f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/saved.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/train.gif b/org.eclipse.osee.framework.ui.plugin/images/train.gif
new file mode 100644
index 00000000000..222b48ad9d0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/train.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/images/viewMenu.gif b/org.eclipse.osee.framework.ui.plugin/images/viewMenu.gif
new file mode 100644
index 00000000000..a7c49189228
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/images/viewMenu.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.plugin/plugin.xml b/org.eclipse.osee.framework.ui.plugin/plugin.xml
new file mode 100644
index 00000000000..b5beabc4856
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.osee.framework.ui.plugin.workspace.EarlyStartup">
+ </startup>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/EclipseErrorLogLogger.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/EclipseErrorLogLogger.java
new file mode 100644
index 00000000000..2917f9ef30e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/EclipseErrorLogLogger.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.framework.ui.plugin;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.plugin.core.PluginCoreActivator;
+
+public class EclipseErrorLogLogger implements ILoggerListener {
+
+ public EclipseErrorLogLogger() {
+ }
+
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ int statusLevel = 0;
+ if (level.intValue() >= Level.SEVERE.intValue()) {
+ statusLevel = Status.ERROR;
+ } else if (level.intValue() >= Level.WARNING.intValue()) {
+ statusLevel = Status.WARNING;
+ } else if (level.intValue() >= Level.INFO.intValue()) {
+ statusLevel = Status.INFO;
+ } else if (OseeCodeVersion.isDevelopment()) {
+ statusLevel = Status.INFO;
+ } else {
+ return;
+ }
+ PluginCoreActivator.getInstance().getLog().log(new Status(statusLevel, loggerName, statusLevel, message, th));
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeFormActivator.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeFormActivator.java
new file mode 100644
index 00000000000..845befe4a4c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeFormActivator.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.framework.ui.plugin;
+
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.FormColors;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class OseeFormActivator extends OseeUiActivator {
+ private FormColors formColors;
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ if (formColors != null) {
+ formColors.dispose();
+ formColors = null;
+ }
+ }
+
+ /**
+ * returns a shared FormColors that can be passed to a FormToolkit constructor "Create one color manager (FormColors)
+ * per plug-in. When creating the toolkit, pass the color manager to the toolkit. The toolkit will know that the
+ * colors are shared and will not dispose them."
+ */
+ public FormColors getSharedFormColors(Display display) {
+ if (formColors == null) {
+ formColors = new FormColors(display);
+ formColors.markShared();
+ }
+ return formColors;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseePluginUiActivator.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseePluginUiActivator.java
new file mode 100644
index 00000000000..5f91cbdba72
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseePluginUiActivator.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin;
+
+import java.io.File;
+import java.net.URL;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.BundleContext;
+
+/**
+ * a The activator class controls the plug-in life cycle
+ */
+public class OseePluginUiActivator extends OseeUiActivator {
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.ui.plugin";
+
+ // The shared instance
+ private static OseePluginUiActivator plugin;
+
+ private BundleContext context;
+
+ /**
+ * The constructor
+ */
+ public OseePluginUiActivator() {
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ this.context = context;
+ OseeLog.registerLoggerListener(new EclipseErrorLogLogger());
+
+ if (PlatformUI.isWorkbenchRunning()) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.addWorkbenchListener(new IWorkbenchListener() {
+
+ @Override
+ public void postShutdown(IWorkbench workbench) {
+ }
+
+ @Override
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ try {
+ if (Lib.isWindows()) {
+ String clearCache = OseeInfo.getValue("clear_cache");
+ if (Boolean.parseBoolean(clearCache)) {
+ Location location = Platform.getInstallLocation();
+ URL url = FileLocator.toFileURL(location.getURL());
+ File file = new File(url.getFile());
+ File cache =
+ new File(new File(new File(file, "p2"), "org.eclipse.equinox.p2.metadata.repository"),
+ "cache");
+ File[] files = cache.listFiles();
+ for (File toDelete : files) {
+ toDelete.delete();
+ }
+
+ Lib.deleteContents(new File(new File(file, "configuration"), "org.eclipse.osgi"));
+ }
+ }
+ } catch (Throwable th) {
+
+ }
+ return true;
+ }
+
+ });
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ context = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static OseePluginUiActivator getInstance() {
+ return plugin;
+ }
+
+ /**
+ * @return
+ */
+ public BundleContext getContext() {
+ return context;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeUiActivator.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeUiActivator.java
new file mode 100644
index 00000000000..f1dc01100e8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/OseeUiActivator.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.CharBuffer;
+import java.util.List;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.ActivatorHelper;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class OseeUiActivator extends AbstractUIPlugin {
+ protected static final String imagePath = "images/";
+ private OseeUiActivator parentPlugin;
+ private ActivatorHelper helper;
+
+ /**
+ * The constructor.
+ */
+ protected OseeUiActivator() {
+ super();
+ }
+
+ /**
+ * returns a File to from the default persistent storage area provided for the bundle by the Framework (.ie.)
+ * myworkspace/.metadata/.plugins/org.eclipse.pde.core/myPlugin/...
+ */
+ public File getPluginStoreFile(String path) {
+ return helper.getPluginStoreFile(path);
+ }
+
+ /**
+ * finds a resource in the plugin bundle and writes it out to the default persistent storage area as a regualar file
+ *
+ * @param path
+ * @return Return plugin file reference
+ * @throws IOException
+ */
+ public File getPluginFile(String path) throws IOException {
+ return helper.getPluginFile(path);
+ }
+
+ public InputStream getInputStream(String resource) throws IOException {
+ return helper.getInputStream(resource);
+ }
+
+ public List<URL> getInputStreams(String directory, String pattern, boolean recurse) throws IOException {
+ return helper.getInputStreams(directory, pattern, recurse);
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+
+ parentPlugin = OseePluginUiActivator.getInstance();
+ /*
+ * parentPlugin will be the CorePlugin except in the case of CorePlugin itself when
+ * parentPlugin will be null
+ */
+ if (parentPlugin == this) parentPlugin = null;
+
+ helper = new ActivatorHelper(context, this);
+
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ }
+
+ public Image getImageFromRegistry(String imageKey) {
+ return getImageRegistry().get(imageKey);
+ }
+
+ /**
+ * Returns the ImageDiscriptor from images/ directory in this bundle with the given name
+ *
+ * @return the Image object
+ */
+ public ImageDescriptor getImageDescriptorUsingRegistry(String imageFileName) {
+ ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(imageFileName);
+ if (imageDescriptor == null) {
+ imageDescriptor =
+ AbstractUIPlugin.imageDescriptorFromPlugin(getBundle().getSymbolicName(), imagePath + imageFileName);
+ getImageRegistry().put(imageFileName, imageDescriptor);
+ }
+ return imageDescriptor;
+ }
+
+ public Image getImageUsingRegistry(String imageName, String imageFileName) {
+ Image image = getImageRegistry().get(imageName);
+ if (image == null) {
+ // cause the image descriptor to be added to the registry
+ getImageDescriptorUsingRegistry(imageFileName);
+ image = getImageRegistry().get(imageName);
+ }
+ return image;
+ }
+
+ public void addImageToRegistry(String imageKey, ImageDescriptor descriptor) throws IllegalArgumentException {
+ Image previousImage = getImageFromRegistry(imageKey);
+ if (previousImage == null) {
+ getImageRegistry().put(imageKey, descriptor);
+ } else {
+ throw new IllegalArgumentException("The image registry already contains an image mapped to " + imageKey);
+ }
+ }
+
+ public void addImageToRegistry(String imageKey, Image image) throws IllegalArgumentException {
+ Image previousImage = getImageFromRegistry(imageKey);
+ if (previousImage == null) {
+ getImageRegistry().put(imageKey, image);
+ } else {
+ throw new IllegalArgumentException("The image registry already contains an image mapped to " + imageKey);
+ }
+ }
+
+ /**
+ * Returns the Image for the icon with the given path under images/
+ *
+ * @return the Image object
+ * @use ImageManager.getImage
+ */
+ @Deprecated
+ public Image getImage(String imageName) {
+ Image image = getImageFromRegistry(imageName);
+ if (image == null) { // if image is not already cached
+ ImageDescriptor descriptor = getImageDescriptor(imageName);
+
+ // if image not found in this plug-in, then look in parent plug-in (if parent exists)
+ if (descriptor == null && parentPlugin != null) {
+ Image ret = parentPlugin.getImage(imageName);
+ if (ret != null) {
+ return ret;
+ }
+ }
+ if (descriptor == null) {
+ throw new IllegalArgumentException(String.format("The image %s does not exist", imageName));
+ }
+
+ image = descriptor.createImage(false);
+ if (image != null) { // cache image only if successfully returned
+ addImageToRegistry(imageName, image);
+ }
+ }
+ return image;
+ }
+
+ /**
+ * Returns the ImageDiscriptor from images/ with the given icon name
+ *
+ * @return the Image object
+ * @use ImageManager.getImageDescriptor
+ */
+ @Deprecated
+ public ImageDescriptor getImageDescriptor(String name) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(getBundle().getSymbolicName(), imagePath + name);
+ }
+
+ public InputStream getInputStreamForImage(String imageName) throws IOException {
+ return getInputStream(imagePath + imageName);
+ }
+
+ public Object getBundleHeaderValue(String name) {
+ return getBundle().getHeaders().get(name);
+ }
+
+ public void log(String message) {
+ getLog().log(new Status(0, toString(), 0, message, null));
+ }
+
+ public void log(String message, Exception ex) {
+ getLog().log(new Status(0, toString(), 0, message, ex));
+ }
+
+ public CharBuffer getCharBuffer(String resource) {
+ try {
+ return Lib.inputStreamToCharBuffer(getInputStream(resource));
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ public void setHelp(Control control, String name) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(control, getPluginName() + "." + name);
+ }
+
+ public void setHelp(IAction action, String name) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(action, getPluginName() + "." + name);
+ }
+
+ public void setHelp(Menu menu, String name) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(menu, getPluginName() + "." + name);
+ }
+
+ public void setHelp(MenuItem menuItem, String name) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(menuItem, getPluginName() + "." + name);
+ }
+
+ public void displayHelp(String name) {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp(getPluginName() + "." + name);
+ }
+
+ protected String getPluginName() {
+ throw new UnsupportedOperationException();
+ }
+
+ public static File getBasePluginInstallDirectory() {
+ return new File(Platform.getInstallLocation().getURL().getFile() + File.separator + "plugins");
+ }
+
+ /**
+ * Returns the workspace instance.
+ *
+ * @return the workspace instance
+ */
+ public static IWorkspace getWorkspace() {
+ return ResourcesPlugin.getWorkspace();
+ }
+
+ public static IPath getWorkspaceFile(IPath path) {
+ return getWorkspaceRoot().getLocation().append(path);
+ }
+
+ public static IPath getWorkspaceFile(String path) {
+ return getWorkspaceRoot().getLocation().append(path);
+ }
+
+ /**
+ * Returns Returns the root resource of this workspace
+ *
+ * @return the workspace root
+ */
+ public static IWorkspaceRoot getWorkspaceRoot() {
+ return ResourcesPlugin.getWorkspace().getRoot();
+ }
+
+ public static String getStackMessages(Exception ex) {
+ Throwable exloop = ex;
+ String exceptionString = "";
+ while (exloop != null) {
+ exceptionString += exloop.getClass().getName() + ":\n\t" + exloop.getMessage() + "\n";
+ exloop = exloop.getCause();
+ }
+ return exceptionString;
+ }
+
+ /**
+ * Checks that OSEE is connected to all necessary application services
+ *
+ * @return Result.isFalse if not connected with getText() of problem
+ */
+ public static Result areOSEEServicesAvailable() {
+ Result toReturn = Result.TrueResult;
+ if (!OseeLog.isStatusOk()) {
+ toReturn = new Result(OseeLog.getStatusReport());
+ }
+ return toReturn;
+ }
+
+ public ImageDescriptor getImageDescriptorForProgram(String extenstion) {
+ ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(extenstion);
+
+ if (imageDescriptor == null && extenstion != null) {
+ Program program = Program.findProgram(extenstion);
+ if (program == null || program.getImageData() == null) {
+ // provide no image (i.e. leave null)
+ } else {
+ imageDescriptor = ImageDescriptor.createFromImageData(program.getImageData());
+ getImageRegistry().put(extenstion, imageDescriptor);
+ }
+ }
+ return imageDescriptor;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/FormattedTextOutputStream.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/FormattedTextOutputStream.java
new file mode 100644
index 00000000000..2674d2414a9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/FormattedTextOutputStream.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.framework.ui.plugin.io;
+
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FormattedTextOutputStream extends OutputStream {
+
+ private FormattedText textArea;
+ private String charset;
+ private StyledText styledText;
+ private String type;
+ private int swtColor;
+
+ public FormattedTextOutputStream(FormattedText textArea, String type) {
+ this.textArea = textArea;
+ this.styledText = textArea.getStyledText();
+ this.charset = null;
+ this.type = type;
+ }
+
+ public FormattedTextOutputStream(FormattedText ta, String charset, String type) throws UnsupportedCharsetException {
+ this(ta, type);
+
+ Charset.forName(charset);
+ this.charset = charset;
+ }
+
+ public void write(byte[] b) {
+ write(b, 0, b.length);
+ }
+
+ private boolean isTextAreaAvailable() {
+ return (textArea != null && !textArea.getStyledText().isDisposed());
+ }
+
+ public void typeColor(int swtColor) {
+ this.swtColor = swtColor;
+ }
+
+ public void write(byte[] b, int off, int len) {
+ String s;
+ try {
+ if (charset == null)
+ s = new String(b, off, len);
+ else
+ s = new String(b, off, len, charset);
+ } catch (UnsupportedEncodingException ex) {
+ throw new Error("encoding support was already verified", ex);
+ }
+ synchronized (textArea) {
+ if (isTextAreaAvailable()) {
+ textArea.addText("\t" + type + "> ", SWT.BOLD, swtColor);
+ textArea.addText(s + "\n");
+ styledText.setSelection(styledText.getCharCount());
+ }
+ }
+ }
+
+ public void write(int b) {
+ byte[] tmp = {(byte) b};
+ write(tmp);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/StreamToTextArea.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/StreamToTextArea.java
new file mode 100644
index 00000000000..e9c58b2db65
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/io/StreamToTextArea.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.framework.ui.plugin.io;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StreamToTextArea extends Thread {
+ private InputStream is;
+ private String type;
+ private FormattedText textArea;
+ private StyledText styledText;
+ private int swtColor;
+ private boolean isStopped;
+
+ public StreamToTextArea(InputStream is, String type, FormattedText textArea) {
+ this.is = is;
+ this.type = type;
+ this.textArea = textArea;
+ this.styledText = textArea.getStyledText();
+ this.isStopped = false;
+ }
+
+ public void typeColor(int swtColor) {
+ this.swtColor = swtColor;
+ }
+
+ public void setStopped(boolean value) {
+ this.isStopped = value;
+ }
+
+ public void run() {
+ try {
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line = null;
+ while (true != isStopped && null != textArea && true != textArea.getStyledText().isDisposed() && null != (line =
+ br.readLine())) {
+ final String toDisplay = line;
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (textArea != null && !textArea.getStyledText().isDisposed()) {
+ textArea.addText("\t" + type + "> ", SWT.NORMAL, swtColor);
+ textArea.addText(toDisplay + "\n");
+ styledText.setSelection(styledText.getCharCount());
+ }
+ }
+ });
+ }
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AEditor.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AEditor.java
new file mode 100644
index 00000000000..1e414fdd6ff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AEditor.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * TODO It appears that this class is not being used.
+ *
+ * @author Donald G. Dunne
+ */
+public class AEditor {
+
+ /**
+ * Jump to line number of an iFile
+ */
+ public static void goToLine(IFile targetIFile, int lineNumber) {
+ if (targetIFile == null || targetIFile.equals("")) {
+ return;
+ }
+ lineNumber = (lineNumber >= 0) ? --lineNumber : -1;
+ final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+ IEditorPart editor = page.getActiveEditor();
+ if (editor != null) {
+ IEditorInput input = editor.getEditorInput();
+ if (input instanceof IFileEditorInput) {
+ IFile file = ((IFileEditorInput) input).getFile();
+ if (targetIFile.equals(file)) {
+ page.activate(editor);
+ }
+ }
+ }
+
+ try {
+ // if jarIFile is java file,
+ String editorId = IDE.getEditorDescriptor(targetIFile).getId();
+ editor = IDE.openEditor(page, targetIFile, editorId);
+ IEditorInput editorInput = editor.getEditorInput();
+ if (editor instanceof AbstractDecoratedTextEditor) {
+ ITextEditor textEditor = (ITextEditor) editor;
+ IDocument document = textEditor.getDocumentProvider().getDocument(editorInput);
+ IRegion lineInformation = document.getLineInformation(lineNumber);
+ textEditor.selectAndReveal(lineInformation.getOffset(), 0);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static boolean openEditor(String filename) {
+ IFile iFile = AWorkspace.getIFile(filename);
+ return openEditor(iFile);
+ }
+
+ public static boolean openEditor(IFile iFile) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ IDE.openEditor(page, iFile, true);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ public static IFile getActiveEditorIFile() {
+ IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (workbenchWindow != null) {
+ IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+ if (workbenchPage != null) {
+ IEditorPart editorPart = workbenchPage.getActiveEditor();
+ if (editorPart != null) {
+ IEditorInput editorInput = editorPart.getEditorInput();
+ if (editorInput != null) {
+ if (editorInput instanceof IFileEditorInput) return ((IFileEditorInput) editorInput).getFile();
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public static IEditorReference[] getEditorReferences() {
+ IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (workbenchWindow != null) {
+ IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+ if (workbenchPage != null) {
+ return workbenchPage.getEditorReferences();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return line number of selected text in active editor
+ */
+ public static ITextSelection getSelectedText() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ IEditorPart activeEditorPart = page.getActiveEditor();
+ if (activeEditorPart != null) {
+ IEditorSite editorSite = page.getActiveEditor().getEditorSite();
+ ISelectionProvider selectionProvider = editorSite.getSelectionProvider();
+ if (selectionProvider != null) {
+ ISelection selection = selectionProvider.getSelection();
+ if (selection instanceof ITextSelection) {
+ return (ITextSelection) selection;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return line number of selected text in active editor
+ */
+ public static int getLineNumber() {
+ return getSelectedText().getStartLine() + 1;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AIFolder.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AIFolder.java
new file mode 100644
index 00000000000..dd8158d95c9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AIFolder.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.framework.ui.plugin.util;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+
+public class AIFolder {
+
+ public static IFolder getFolder(IProject containingProject, String name) throws CoreException {
+ IFolder folder = containingProject.getFolder(name);
+
+ if (!folder.exists()) {
+ folder.create(true, true, null);
+ }
+ return folder;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AJavaProject.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AJavaProject.java
new file mode 100644
index 00000000000..585a2d9001d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AJavaProject.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+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.jdk.core.util.Lib;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AJavaProject {
+
+ private static Map<IJavaProject, IClasspathEntry[]> cachedPath = new HashMap<IJavaProject, IClasspathEntry[]>();
+
+
+ private static IClasspathEntry[] localGetResolvedClasspath(IJavaProject javaProject) throws JavaModelException {
+ IClasspathEntry[] paths = cachedPath.get(javaProject);
+ if(paths == null){
+ paths = javaProject.getResolvedClasspath(true);
+ cachedPath.put(javaProject, paths);
+ }
+ return paths;
+ }
+
+ public static IJavaProject getJavaProject(File file) {
+ IFile ifile = AWorkspace.fileToIFile(file);
+ return JavaCore.create(ifile.getProject());
+ }
+
+ public static ArrayList<URL> getAllJavaProjectDependancies(IJavaProject javaProject) {
+ ArrayList<URL> urls = new ArrayList<URL>();
+ ArrayList<File> files = getJavaProjectProjectDependancies(javaProject);
+ for (int i = 0; i < files.size(); i++) {
+ try {
+ urls.add(files.get(i).toURL());
+ } catch (MalformedURLException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return urls;
+ }
+
+ public static String getClassFilePath(String file) {
+ String classFile = null;
+ IJavaProject javaProject = getJavaProject(new File(file));
+ //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_SOURCE) {
+ File projectlocation = javaProject.getProject().getLocation().toFile();
+ File projecttricky = javaProject.getProject().getFullPath().toFile();
+ IPath output = paths[i].getOutputLocation();
+ File fileLocation;
+ if (output == null) {
+ fileLocation = new File(paths[i].getPath().toFile().getPath().replace("src", "bin"));
+ } else {
+ fileLocation = paths[i].getOutputLocation().toFile();
+ }
+ File javaFileLocation = paths[i].getPath().toFile();
+ String realClassLocation =
+ fileLocation.toString().replace(projecttricky.toString(), projectlocation.toString());
+ String realJavaLocation =
+ javaFileLocation.toString().replace(projecttricky.toString(), projectlocation.toString());
+ String packagePath = file.replace(realJavaLocation, "");
+ packagePath = packagePath.replace(".java", ".class");
+ File theclassfile = new File(realClassLocation, packagePath);
+ if (theclassfile.exists()) {
+ classFile = theclassfile.getAbsolutePath();
+ break;
+ }
+ }
+ }
+
+ } catch (JavaModelException ex) {
+ ex.printStackTrace();
+ }
+ if (classFile == null) {
+ try {
+ String packageName = "";
+ File java = new File(file);
+ packageName = getJavaPackage(java);
+ packageName = packageName.replace(".", File.separator);
+ packageName += File.separator + java.getName();
+ classFile = file.replace(packageName, "");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return classFile;
+ }
+
+ public static String getClassName(String file) {
+ String classname = null;
+ try {
+ String packageName = "";
+ File java = new File(file);
+ packageName = getJavaPackage(java);
+ if (packageName.length() > 0) {
+ packageName += ".";
+ }
+ packageName += java.getName().replace(".java", "");
+ classname = packageName;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return classname;
+ }
+
+ public static String getJavaPackage(File javaFile) throws IOException {
+ String packageName = "";
+ String javaFileContent = Lib.fileToString(javaFile);
+ Pattern pattern = Pattern.compile(".*package\\s*(.*?);.*", Pattern.DOTALL);
+ Matcher match = pattern.matcher(javaFileContent);
+ if (match.matches()) {
+ packageName = match.group(1);
+ }
+ return packageName;
+ }
+
+ public static 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 f = null;
+ f = new File(AWorkspace.getWorkspacePath().concat(paths[i].getPath().toOSString()));
+ if (f != null && f.exists()) {
+ urls.add(f);
+ }
+ }
+ } 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 = new File(paths[i].getPath().toFile().getPath().replace("src", "bin"));
+ } 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;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkbench.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkbench.java
new file mode 100644
index 00000000000..a80b860524e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkbench.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.framework.ui.plugin.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AWorkbench {
+
+ /**
+ * Popup a workbench viewer eg: AWorkbench.popupView(IPageLayout.ID_PROBLEM_VIEW);
+ *
+ * @param iPageLayoutView
+ * @return success
+ */
+ public static boolean popupView(String iPageLayoutView) {
+ IViewPart p = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(iPageLayoutView);
+ if (p != null) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().activate(p);
+ return true;
+ }
+ return false;
+ }
+
+ public static IViewPart getView(String viewId) {
+ return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(viewId);
+ }
+
+ public static List<IEditorReference> getEditors(String editorId) {
+ List<IEditorReference> editors = new ArrayList<IEditorReference>();
+ for (IEditorReference editor : getEditors()) {
+ if (editor.getId().equals(editorId)) {
+ editors.add(editor);
+ }
+ }
+ return editors;
+ }
+
+ public static List<IEditorReference> getEditors() {
+ List<IEditorReference> editors = new ArrayList<IEditorReference>();
+ for (IWorkbenchPage page : PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPages()) {
+ for (IEditorReference editor : page.getEditorReferences()) {
+ editors.add(editor);
+ }
+ }
+ return editors;
+ }
+
+ public static void popup(final String message) {
+ popup(message, message);
+ }
+
+ public static void popup(final String title, final String message) {
+ if (!PlatformUI.isWorkbenchRunning()) {
+ OseeLog.log(AWorkbench.class, Level.SEVERE, message);
+ } else {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title,
+ message);
+ }
+ });
+ }
+ }
+
+ public static void popup(Composite comp, String title, String message) {
+ MessageDialog.openInformation(comp.getShell(), title, message);
+ }
+
+ public static IWorkbenchPage getActivePage() {
+ IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ return workbenchWindow != null ? workbenchWindow.getActivePage() : null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkspace.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkspace.java
new file mode 100644
index 00000000000..5ba5f74cfc6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AWorkspace.java
@@ -0,0 +1,582 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+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.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+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.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.ui.IPackagesViewPart;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.plugin.OseePluginUiActivator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWindowListener;
+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.ide.IDE;
+import org.eclipse.ui.views.navigator.IResourceNavigator;
+import org.eclipse.ui.views.navigator.ResourceNavigator;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AWorkspace {
+ private static HashMap<String, File> fileFindMap = new HashMap<String, File>();
+
+ private static boolean initializedWorkspaceSearch = false;
+ private static HashMap<String, List<File>> fileSearch = new HashMap<String, List<File>>();
+ private static IWindowListener windowListener;
+ private static IResourceChangeListener changeListener;
+
+ public static void init(final Object objectToNotify) {
+ Job initJob = new WorkspaceSearchInit(objectToNotify);
+ initJob.setPriority(Job.LONG);
+ initJob.schedule();
+ }
+
+ public static void reinit() {
+ Job initJob = new Job("Initializing Workspace Search") {
+ protected IStatus run(IProgressMonitor monitor) {
+ initializedWorkspaceSearch = false;
+ File savefile = OseeData.getFile("serializedFileFinder");
+ savefile.delete();
+
+ File mapfile = OseeData.getFile("fileFindMap");
+ mapfile.delete();
+
+ fileSearch.clear();
+ fileFindMap.clear();
+ initWorkspaceSearch();
+ return Status.OK_STATUS;
+ }
+ };
+ initJob.setPriority(Job.LONG);
+ initJob.schedule();
+ }
+
+ @SuppressWarnings("unchecked")
+ public static void initWorkspaceSearch() {
+ if (!initializedWorkspaceSearch) {
+ initializedWorkspaceSearch = true;
+ File savefile = OseeData.getFile("serializedFileFinder");
+ File mapfile = OseeData.getFile("fileFindMap");
+ if (savefile.exists() && mapfile.exists()) {
+ ObjectInputStream ois;
+ try {
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO, "starting init");
+ long time = System.currentTimeMillis();
+ ois = new ObjectInputStream(new FileInputStream(savefile));
+ fileSearch = (HashMap<String, List<File>>) ois.readObject();
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO,
+ "ending init " + (System.currentTimeMillis() - time) / 1000 + " secs");
+
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO, "starting init");
+ time = System.currentTimeMillis();
+ ois = new ObjectInputStream(new FileInputStream(mapfile));
+ fileFindMap = (HashMap<String, File>) ois.readObject();
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO,
+ "ending init " + (System.currentTimeMillis() - time) / 1000 + " secs");
+
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } catch (ClassNotFoundException ex) {
+ ex.printStackTrace();
+ }
+ } else {
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO, "starting init");
+ long time = System.currentTimeMillis();
+ List files = Lib.recursivelyListFiles(new File(getWorkspacePath()), Pattern.compile(".*"));
+ for (Object obj : files) {
+ File file = (File) obj;
+ addFile(file);
+ }
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO,
+ "ending init " + (System.currentTimeMillis() - time) / 1000 + " secs");
+ }
+
+ if (changeListener == null) {
+ changeListener = new IResourceChangeListener() {
+
+ public void resourceChanged(IResourceChangeEvent event) {
+ if (IResourceChangeEvent.POST_CHANGE == event.getType()) {
+ recDeltaInfo(event.getDelta());
+ }
+ }
+
+ private void recDeltaInfo(IResourceDelta delta) {
+ File file = delta.getResource().getLocation().toFile();
+ if ((delta.getKind() & IResourceDelta.ADDED) > 0) {
+ addFile(file);
+ } else if ((delta.getKind() & IResourceDelta.REMOVED) > 0) {
+ removeFile(file);
+ }
+ IResourceDelta[] deltas =
+ delta.getAffectedChildren(IResourceDelta.ADDED | IResourceDelta.REMOVED | IResourceDelta.CHANGED);
+ for (IResourceDelta d : deltas) {
+ recDeltaInfo(d);
+ }
+ }
+ };
+ OseeData.getProject().getWorkspace().addResourceChangeListener(changeListener);
+ }
+ if (windowListener == null) {
+ windowListener = new IWindowListener() {
+
+ public void windowActivated(IWorkbenchWindow window) {
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO, "closed window");
+ OseeLog.log(OseePluginUiActivator.class, Level.INFO, "saving...");
+
+ try {
+ ObjectOutputStream oos =
+ new ObjectOutputStream(new FileOutputStream(OseeData.getFile("serializedFileFinder")));
+ oos.writeObject(fileSearch);
+
+ oos = new ObjectOutputStream(new FileOutputStream(OseeData.getFile("fileFindMap")));
+ oos.writeObject(fileFindMap);
+ } catch (FileNotFoundException ex) {
+ ex.printStackTrace();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+ }
+
+ public void windowOpened(IWorkbenchWindow window) {
+ }
+
+ };
+ PlatformUI.getWorkbench().addWindowListener(windowListener);
+ }
+
+ }
+ }
+
+ /**
+ * @param file
+ */
+ protected static void removeFile(File file) {
+ List<File> files = fileSearch.get(file.getName());
+ Iterator<File> it = files.iterator();
+ while (it.hasNext()) {
+ File f = it.next();
+ if (f.equals(file)) {
+ it.remove();
+ }
+ }
+ if (files.size() == 0) {
+ fileSearch.remove(file.getName());
+ }
+ }
+
+ /**
+ * @param file
+ */
+ protected static void addFile(File file) {
+ if (file.isFile()) {
+ List<File> fileSearchResults = fileSearch.get(file.getName());
+ if (fileSearchResults == null) {
+ fileSearchResults = new ArrayList<File>();
+ fileSearch.put(file.getName(), fileSearchResults);
+ }
+ if (!fileSearchResults.contains(file)) {
+ fileSearchResults.add(file);
+ }
+ }
+ }
+
+ public static File getProjectFile(File fileFile) {
+ // If file is an artifact, go up one level to create tree
+ File parentFile = fileFile.getParentFile();
+ while (!parentFile.getParentFile().getName().equals("workspace") && !parentFile.getParentFile().getName().equals(
+ "runtime-workbench-workspace")) {
+ parentFile = parentFile.getParentFile();
+ }
+ return parentFile;
+ }
+
+ public static String getWorkspacePath() {
+ return ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
+ }
+
+ public static File iFileToFile(IFile iFile) {
+ return new File(iFile.getLocation().toString());
+ }
+
+ public static IFile fileToIFile(File file) {
+ String p = file.getAbsolutePath();
+ IPath path = new Path(p);
+ IFile iFile = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+ if (iFile.exists()) return iFile;
+ p = p.replace('\\', '/');
+ // System.err.println("p *" + p + "*");
+ // Run through projects to see if any contain this file
+ IProject projs[] = getProjects();
+ for (int i = 0; i < projs.length; i++) {
+ IProject proj = projs[i];
+ String projLoc = proj.getLocation().toString();
+ // System.err.println("proj *" + projLoc + "*");
+ if (p.equals(projLoc)) {
+ return null;
+ } else if (p.startsWith(projLoc)) {
+ // System.out.println("found it");
+ p = p.replaceFirst(projLoc, "");
+ p = "/" + proj.getName() + p;
+ // System.err.println("new pLoc*" + p + "*");
+ path = new Path(p);
+ iFile = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+ if (iFile.exists()) {
+ return iFile;
+ } else {
+ // System.err.println("iFile DOESN'T exist *" +
+ // iFile.getRawLocation()+ "*");
+ }
+ }
+ // System.out.println("proj");
+ }
+ return null;
+ }
+
+ public static IProject fileToIProject(File file) {
+ String p = file.getAbsolutePath();
+ p = p.replace('\\', '/');
+ System.err.println("p *" + p + "*");
+ // Run through projects to see if any contain this file
+ IProject projs[] = getProjects();
+ for (int i = 0; i < projs.length; i++) {
+ IProject proj = projs[i];
+ String projLoc = proj.getLocation().toString();
+ System.err.println("proj *" + projLoc + "*");
+ if (p.equals(projLoc)) {
+ return proj;
+ }
+ }
+ return null;
+ }
+
+ public static IFile getIFile(String filename) {
+ return fileToIFile(new File(filename));
+ }
+
+ public static IProject[] getProjects() {
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ return workspace.getRoot().getProjects();
+ }
+
+ public static boolean showInResourceNavigator(IFile file) {
+ if (file == null) {
+ return false;
+ }
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ IViewPart viewPart =
+ page.showView("org.eclipse.ui.views.ResourceNavigator", null, IWorkbenchPage.VIEW_ACTIVATE);
+
+ if (viewPart != null && viewPart instanceof ResourceNavigator) {
+ ResourceNavigator resourceNavigator = (ResourceNavigator) viewPart;
+ StructuredSelection ss = new StructuredSelection(file);
+ resourceNavigator.selectReveal(ss);
+ return true;
+ }
+ } catch (PartInitException ex) {
+ ex.printStackTrace();
+ }
+
+ return false;
+ }
+
+ public static boolean openEditor(String filename) {
+ IFile iFile = AWorkspace.getIFile(filename);
+ return openEditor(iFile);
+ }
+
+ public static boolean openEditor(IFile iFile) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ IDE.openEditor(page, iFile, true);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean showInPackageExplorer(IFile file) {
+ if (file == null) return false;
+ IViewPart p =
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(
+ "org.eclipse.jdt.ui.PackageExplorer");
+ if (p != null && p instanceof IPackagesViewPart) {
+ StructuredSelection ss = new StructuredSelection(file);
+ IPackagesViewPart rn = (IPackagesViewPart) p;
+ rn.selectAndReveal(ss);
+ }
+ return true;
+ }
+
+ public static void refreshResource(IResource resource) {
+ IResource parentResource = resource.getParent();
+ try {
+ parentResource.refreshLocal(IResource.DEPTH_INFINITE, null);
+ } catch (org.eclipse.core.runtime.CoreException ex) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Refresh Navigator", "Can't refresh \"" + resource.getName() + "\"\n\nYou must refresh Manually");
+ return;
+ }
+
+ }
+
+ public static StructuredSelection getSelection() {
+ IViewReference[] parts = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences();
+ for (int i = 0; i < parts.length; i++) {
+ StructuredSelection sel = getSelection(parts[i].getPart(false));
+ if (sel != null) return sel;
+ }
+ return null;
+ }
+
+ public static StructuredSelection getSelection(IWorkbenchPart targetPart) {
+ if (targetPart instanceof IResourceNavigator) {
+ IResourceNavigator navigator = (IResourceNavigator) targetPart;
+ return (StructuredSelection) navigator.getViewer().getSelection();
+ } else if (targetPart instanceof IPackagesViewPart) {
+ IPackagesViewPart navigator = (IPackagesViewPart) targetPart;
+ return (StructuredSelection) navigator.getTreeViewer().getSelection();
+ }
+ return null;
+ }
+
+ /**
+ * @return IResource arraylist
+ */
+ public static ArrayList<IResource> getSelectedResources() {
+ ArrayList<IResource> l = new ArrayList<IResource>();
+ StructuredSelection sel = getSelection();
+ Iterator<?> i = sel.iterator();
+ while (i.hasNext()) {
+ IResource resource = (IResource) i.next();
+ l.add(resource);
+ }
+ return l;
+ }
+
+ // public static File findWorkspaceFile(String fileName, String filePathHint) throws IOException
+ // {
+ // File file = fileFindMap.get(fileName);
+ // if(file == null || !file.exists()){
+ // File workspace = new File(AWorkspace.getWorkspacePath());
+ // List files = Lib.recursivelyListFiles(workspace, Pattern.compile(fileName));
+ // if(files.size() == 0){
+ // throw new IOException("we didn't find the file in the workspace");
+ // } else if (files.size() > 1){
+ //
+ // DialogSelectionHelper selection = new DialogSelectionHelper(files.toArray());
+ //
+ // Display.getDefault().syncExec(selection);
+ //
+ // if(selection.getSelectionIndex() == -1){
+ // String message = "we found multiple matches";
+ // for(int i = 0; i < files.size(); i++){
+ // message += "\n" + files.get(i);
+ // }
+ // throw new IOException(message);
+ // } else {
+ // if(selection.isSaveSelection()){
+ // fileFindMap.put(fileName, (File)files.get(selection.getSelectionIndex()));
+ // }
+ // return (File)files.get(selection.getSelectionIndex());
+ // }
+ // } else {
+ // file = (File)files.get(0);
+ // fileFindMap.put(fileName, file);
+ // }
+ // }
+ // return file;
+ // }
+ /**
+ * Return workspace file give workspace relative path and file. eg ".metadata/.log"
+ */
+ public static File getWorkspaceFile(String wsPathFileName) throws IOException {
+ return new File(getWorkspacePath() + "\\" + wsPathFileName);
+ }
+
+ public static File findWorkspaceFileNew(final String fileName) throws IOException {
+ File file = fileFindMap.get(fileName);
+ if (file != null) {
+ return file;
+ }
+ List<File> files = fileSearch.get(fileName);
+ if (files != null) {
+ if (files.size() == 1) {
+ return files.get(0);
+ } else if (files.size() > 0) {
+ DialogSelectionHelper selection = new DialogSelectionHelper(files.toArray());
+
+ Display.getDefault().syncExec(selection);
+
+ if (selection.getSelectionIndex() == -1) {
+ String message = "we found multiple matches";
+ for (int i = 0; i < files.size(); i++) {
+ message += "\n" + files.get(i);
+ }
+ throw new IOException(message);
+ } else {
+ if (selection.isSaveSelection()) {
+ fileFindMap.put(fileName, (File) files.get(selection.getSelectionIndex()));
+ }
+ return (File) files.get(selection.getSelectionIndex());
+ }
+ }
+ }
+ // Display.getDefault().asyncExec(new Runnable() {
+ // public void run() {
+ // if
+ // (MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ // "Open Error", "Can't find \"" + fileName
+ // + "\" in workspace. Would you like to re-initialize the search structure, it will be
+ // performed in the background and could take several minutes?")) {
+ // reinit();
+ // }
+ // }
+ // });
+ return null;
+ }
+
+ public static File findWorkspaceFile(String fileName, String filePathHint) throws IOException {
+ File file = fileFindMap.get(fileName);
+ if (file == null || !file.exists()) {
+ List<File> files = null;
+ if (filePathHint != null) {
+ files = Lib.recursivelyListFiles(new File(filePathHint), Pattern.compile(fileName));
+ }
+ if (files == null || files.size() == 0) {
+ files = Lib.recursivelyListFiles(new File(AWorkspace.getWorkspacePath()), Pattern.compile(fileName));
+ }
+ if (files.size() == 0) {
+ throw new IOException("we didn't find the file [" + fileName + "] in the workspace");
+ } else if (files.size() > 1) {
+
+ DialogSelectionHelper selection = new DialogSelectionHelper(files.toArray());
+
+ Display.getDefault().syncExec(selection);
+
+ if (selection.getSelectionIndex() == -1) {
+ String message = "we found multiple matches";
+ for (int i = 0; i < files.size(); i++) {
+ message += "\n" + files.get(i);
+ }
+ throw new IOException(message);
+ } else {
+ if (selection.isSaveSelection()) {
+ fileFindMap.put(fileName, (File) files.get(selection.getSelectionIndex()));
+ }
+ return (File) files.get(selection.getSelectionIndex());
+ }
+ } else {
+ file = (File) files.get(0);
+ fileFindMap.put(fileName, file);
+ }
+ }
+ return file;
+ }
+
+ public static IResource findWorkspaceFile(String fileName) throws IOException {
+ IContainer ws = ResourcesPlugin.getWorkspace().getRoot();
+ List<IResource> resources = new ArrayList<IResource>();
+ recursiveFileFind(fileName, ws, resources);
+ for (IResource resource : resources) {
+ System.out.println("found a file " + resource.getName());
+ }
+ if (resources.size() > 0) {
+ return resources.get(0);
+ }
+ return null;
+ }
+
+ public static void recursiveFileFind(String fileName, IResource resource, List<IResource> matches) {
+ if (resource.getName().equalsIgnoreCase(fileName)) {
+ matches.add(resource);
+ }
+ if (resource instanceof IContainer) {
+ try {
+ for (IResource res : ((IContainer) resource).members()) {
+ recursiveFileFind(fileName, res, matches);
+ }
+ } catch (CoreException ex) {
+ }
+ }
+ }
+
+ public static List<IResource> findWorkspaceFileMatch(String regex) throws IOException {
+ IContainer ws = ResourcesPlugin.getWorkspace().getRoot();
+ List<IResource> resources = new ArrayList<IResource>();
+ recursiveFileFindMatch(regex, ws, resources);
+ return resources;
+ }
+
+ public static void recursiveFileFindMatch(String regex, IResource resource, List<IResource> matches) {
+ if (IResource.FILE == resource.getType() && resource.getName().length() > 0) {
+ if (resource.getName().matches(regex)) {
+ matches.add(resource);
+ }
+ }
+ if (resource instanceof IContainer) {
+ try {
+ for (IResource res : ((IContainer) resource).members()) {
+ recursiveFileFindMatch(regex, res, matches);
+ }
+ } catch (CoreException ex) {
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AbstractSelectionEnabledHandler.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AbstractSelectionEnabledHandler.java
new file mode 100644
index 00000000000..8d617c1ae89
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AbstractSelectionEnabledHandler.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.framework.ui.plugin.util;
+
+import org.eclipse.core.commands.HandlerEvent;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+
+/**
+ * A Handler that will fire an enabled changed event each time the menu is shown.
+ *
+ * @author Robert A. Fisher
+ */
+public abstract class AbstractSelectionEnabledHandler extends CommandHandler implements MenuListener {
+ private final HandlerEvent enabledChangedEvent = new HandlerEvent(this, true, false);
+
+ public AbstractSelectionEnabledHandler(MenuManager menuManager) {
+ menuManager.getMenu().addMenuListener(this);
+ }
+
+ public final void menuHidden(MenuEvent e) {
+ }
+
+ public final void menuShown(MenuEvent e) {
+ fireHandlerChanged(enabledChangedEvent);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ArrayTreeContentProvider.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ArrayTreeContentProvider.java
new file mode 100644
index 00000000000..266765a2931
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ArrayTreeContentProvider.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.framework.ui.plugin.util;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArrayTreeContentProvider implements ITreeContentProvider {
+
+ /**
+ *
+ */
+ public ArrayTreeContentProvider() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) return ((Collection) parentElement).toArray();
+ return new Object[] {};
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AudioFile.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AudioFile.java
new file mode 100644
index 00000000000..92d94dbcba1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/AudioFile.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.plugin.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import sun.audio.AudioPlayer;
+import sun.audio.AudioStream;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AudioFile {
+
+ public static void processAudioFile(OseeUiActivator activator, String filePath) {
+ AudioStream as = null;
+ try {
+ URL url = activator.getBundle().getEntry(filePath);
+ as = new AudioStream(url.openStream());
+ AudioPlayer.player.start(as);
+ AudioPlayer.player.join(3000);
+ } catch (Exception ex) {
+ OseeLog.log(activator.getClass(), Level.SEVERE, ex);
+ } finally {
+ if (as != null) {
+ try {
+ as.close();
+ } catch (IOException ex) {
+ // Do Nothing
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CancelWatcher.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CancelWatcher.java
new file mode 100644
index 00000000000..04fa3790af8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CancelWatcher.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.framework.ui.plugin.util;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class CancelWatcher extends Thread {
+ private final Thread thread;
+ private final IProgressMonitor monitor;
+ private boolean done;
+ private boolean cancelled;
+
+ /**
+ * @param thread
+ * @param monitor
+ */
+ public CancelWatcher(Thread thread, IProgressMonitor monitor) {
+ super();
+ this.thread = thread;
+ this.monitor = monitor;
+ this.done = false;
+ this.cancelled = false;
+
+ setDaemon(true);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Thread#run()
+ */
+ @Override
+ public void run() {
+ while (!done) {
+ try {
+ sleep(500);
+ } catch (InterruptedException e) {
+ done = true;
+ }
+ if (monitor.isCanceled()) {
+ cancelled = true;
+ done = true;
+ thread.interrupt();
+ }
+ }
+ }
+
+ public void done() {
+ done = true;
+ }
+
+ /**
+ * @return Returns the cancelled.
+ */
+ public boolean isCancelled() {
+ return cancelled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CommandHandler.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CommandHandler.java
new file mode 100644
index 00000000000..ce00cfc546f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CommandHandler.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.framework.ui.plugin.util;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseePluginUiActivator;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class CommandHandler extends AbstractHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ try {
+ return isEnabledWithException();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OseePluginUiActivator.class, Level.SEVERE, ex);
+ return false;
+ }
+ }
+
+ public abstract boolean isEnabledWithException() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Commands.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Commands.java
new file mode 100644
index 00000000000..8958d9e1b59
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Commands.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.framework.ui.plugin.util;
+
+import java.util.Map;
+import org.eclipse.core.commands.Category;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.CommandManager;
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.services.IServiceLocator;
+
+/**
+ * @author Robert A. Fisher
+ */
+public final class Commands {
+
+ // This is a utility class and should not ever be instantiated
+ private Commands() {
+ }
+
+ /**
+ * Sets up a local command with no id and uses that to retrieve a CommandContributionItem.
+ *
+ * @param site may not be null
+ * @param shortCommandId may not be null
+ * @param name may not be null
+ * @param parameterDefs may be null
+ * @param parameters may be null
+ * @param image may be null
+ * @param mnemonic may be null
+ * @param tooltip may be null
+ * @param helpContextId may be null
+ * @return
+ */
+ public static CommandContributionItem getLocalCommandContribution(IWorkbenchPartSite site, String shortCommandId, String name, IParameter[] parameterDefs, Map<String, String> parameters, ImageDescriptor image, String mnemonic, String tooltip, String helpContextId) {
+ return createCommandContributionItem(site, site.getId(), shortCommandId, name, parameterDefs, parameters, image,
+ mnemonic, tooltip, helpContextId);
+ }
+
+ /**
+ * Sets up a local command with no id and uses that to retrieve a CommandContributionItem.
+ *
+ * @param site may not be null
+ * @param id may not be null
+ * @param shortCommandId may not be null
+ * @param name may not be null
+ * @param parameterDefs may be null
+ * @param parameters may be null
+ * @param image may be null
+ * @param mnemonic may be null
+ * @param tooltip may be null
+ * @param helpContextId may be null
+ * @return
+ */
+ public static CommandContributionItem getLocalCommandContribution(String id, IWorkbenchSite site, String shortCommandId, String name, IParameter[] parameterDefs, Map<String, String> parameters, ImageDescriptor image, String mnemonic, String tooltip, String helpContextId) {
+ return createCommandContributionItem(site, id, shortCommandId, name, parameterDefs, parameters, image, mnemonic,
+ tooltip, helpContextId);
+ }
+
+ private static CommandContributionItem createCommandContributionItem(IServiceLocator site, String id, String shortCommandId, String name, IParameter[] parameterDefs, Map<String, String> parameters, ImageDescriptor image, String mnemonic, String tooltip, String helpContextId) {
+ ICommandService commandService = (ICommandService) site.getService(ICommandService.class);
+ String commandId = id;
+
+ if (shortCommandId != null) {
+ commandId = commandId + "." + shortCommandId;
+ }
+
+ Command command = commandService.getCommand(commandId);
+ if (!command.isDefined()) {
+ Category category = commandService.getCategory(CommandManager.AUTOGENERATED_CATEGORY_ID);
+ command.define(name, null, category, parameterDefs, null, helpContextId);
+ }
+
+ // Use the commandId as the id so calling code can get to the commandId
+ return new CommandContributionItem(site, command.getId(), command.getId(), parameters, image, null, null, name,
+ mnemonic, tooltip, CommandContributionItem.STYLE_PUSH);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CoreDebug.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CoreDebug.java
new file mode 100644
index 00000000000..ac83b3acde9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/CoreDebug.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.framework.ui.plugin.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class CoreDebug extends Debug {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.Debug#getPluginName()
+ */
+ @Override
+ protected String getPluginName() {
+ return "org.eclipse.osee.framework.ui.plugin";
+ }
+
+ /**
+ * @param debugOn
+ * @param timeStampOn
+ * @param nameSpace
+ */
+ public CoreDebug(boolean debugOn, boolean timeStampOn, String nameSpace) {
+ super(debugOn, timeStampOn, nameSpace);
+ }
+
+ /**
+ * @param debugOn
+ * @param nameSpace
+ */
+ public CoreDebug(boolean debugOn, String nameSpace) {
+ super(debugOn, nameSpace);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Debug.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Debug.java
new file mode 100644
index 00000000000..f0c989de41b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Debug.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.RandomAccessFile;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Debug abstract class allows each plugin to subclass off a Debug class for the use by its own classes. Each plugin can
+ * (and should) have an easter-egg way to turn on global debugging from the UI. This class allows each plugin to have
+ * it's own Console window show only it's debug statments. Once subclassed in a plugin (standard is to simply use the
+ * subclass "Debug" in the plugin), each class can instantiate a debug object to send debug to standard out normally or
+ * to the Console if activate through the UI.
+ *
+ * @author Donald G. Dunne
+ */
+public abstract class Debug {
+
+ // True = debug everything for this instance of debug
+ // False = don't debug unless globalDebug is set
+ boolean debugOn = false;
+ // Show timestamp with debug statement (eg: 12:12 This is debug)
+ boolean timeStampOn = false;
+ // Show (x) instance tag with statment (eg: StrView(4) This is)
+ boolean displayInstanceTag = true;
+ private static Map<String, Integer> instanceNumHash = new HashMap<String, Integer>(); // pluginName,
+ // int
+ private int thisInstanceNum = 0;
+ // Namespace to give debug instance (eg: <namespace> this is)
+ private String nameSpace = "";
+ // True = everything debugs
+ // False = only Debug(true, ..) debugs
+ private static Map<String, Boolean> globalDebugHash = new HashMap<String, Boolean>(); // pluginName,
+ // boolean
+ private static Map<String, OseeConsole> oseeConsoleHash = new HashMap<String, OseeConsole>(); // pluginName,
+ // OseeConsole
+ private PrintStream out;
+ // Color of debug in console window
+ private int currentColor = SWT.COLOR_GREEN;
+
+ // Return the plugin name to use in the console debug window
+ protected abstract String getPluginName();
+
+ protected int getNextInstanceNum() {
+ if (!instanceNumHash.containsKey(getPluginName())) {
+ setInstanceNum(1);
+ return 1;
+ }
+ return instanceNumHash.get(getPluginName()).intValue();
+ }
+
+ protected void setInstanceNum(int num) {
+ instanceNumHash.put(getPluginName(), new Integer(num));
+ }
+
+ /**
+ * @return true if globalDebug flag is on for this plugin
+ */
+ protected boolean isGlobalDebug() {
+ if (!globalDebugHash.containsKey(getPluginName())) {
+ return false;
+ }
+ return globalDebugHash.get(getPluginName()).booleanValue();
+ }
+
+ protected OseeConsole getConsole() {
+ if (!oseeConsoleHash.containsKey(getPluginName())) {
+ return null;
+ }
+ return oseeConsoleHash.get(getPluginName());
+ }
+
+ protected void setConsole(OseeConsole console) {
+ oseeConsoleHash.put(getPluginName(), console);
+ }
+
+ /**
+ * Call to turn global debug on/off. Successive calls switch the state.
+ */
+ public void setGlobalDebug() {
+ // All this to simply change from false to true or visa versa
+ globalDebugHash.put(getPluginName(), new Boolean(!isGlobalDebug()));
+ String debugOnStr = "Debug == " + ((isGlobalDebug()) ? "On" : "Off");
+ System.out.println(debugOnStr);
+ if (getConsole() == null) {
+ setConsole(new OseeConsole(getPluginName() + " Debug Console"));
+ }
+ if (getConsole() != null) {
+ OseeConsole console = (OseeConsole) getConsole();
+ console.writeError(debugOnStr);
+ }
+ }
+
+ public Debug(boolean debugOn, boolean timeStampOn, String nameSpace) {
+ this(debugOn, nameSpace);
+ this.timeStampOn = timeStampOn;
+ }
+
+ public Debug(boolean debugOn, String nameSpace) {
+ thisInstanceNum = getNextInstanceNum();
+ this.debugOn = debugOn;
+ this.nameSpace = nameSpace;
+ globalDebugHash.put(getPluginName(), false);
+ }
+
+ /**
+ * Display (x) where x is # of instantiation of debug
+ *
+ * @param set
+ */
+ public void setInstanceTag(boolean set) {
+ displayInstanceTag = set;
+ }
+
+ /**
+ * Report debug
+ *
+ * @param str = string to display
+ */
+ public void report(String str) {
+ report(str, currentColor);
+ }
+
+ public void report(String str, Throwable ex) {
+ report(str + "\nException: " + Lib.exceptionToString(ex), currentColor);
+ }
+
+ public void report(String str, boolean showTimestamp) {
+ if (showTimestamp)
+ report(str + " " + (new SimpleDateFormat("hh:mm:ss")).format(new Date()));
+ else
+ report(str);
+
+ }
+
+ /**
+ * Report debug in SWT.COLOR
+ *
+ * @param str
+ * @param color
+ */
+ public void report(String str, int color) {
+ if (!debugOn && !isGlobalDebug()) return;
+ String timeStr = "", nameStr = "";
+ if (timeStampOn) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date());
+ timeStr =
+ "(" + cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + ") ";
+ }
+ if (!nameSpace.equals("")) {
+ String instStr = "";
+ if (displayInstanceTag) {
+ instStr = "(" + thisInstanceNum + ")";
+ }
+ nameStr = nameSpace + instStr + " => ";
+ }
+ String dispStr = timeStr + nameStr + str;
+
+ if (isGlobalDebug() && getConsole() != null) {
+ Display.getCurrent().getSystemColor(color);
+ ((OseeConsole) getConsole()).write(dispStr);
+ } else
+ System.out.println(dispStr);
+ if (out != null) out.println(dispStr);
+ }
+
+ /**
+ * Set debug on for this instance of Debug
+ *
+ * @param debug
+ */
+ public void setDebug(boolean debug) {
+ this.debugOn = debug;
+ }
+
+ /**
+ * Is debug on for this instance of Debug
+ *
+ * @return boolean
+ */
+ public boolean isDebug() {
+ return debugOn;
+ }
+
+ /**
+ * @param timeStampOn The timeStampOn to set.
+ */
+ public void setTimeStampOn(boolean timeStampOn) {
+ this.timeStampOn = timeStampOn;
+ }
+
+ /**
+ * @return Returns the nameSpace.
+ */
+ public String getNameSpace() {
+ return nameSpace;
+ }
+
+ /**
+ * @param nameSpace The nameSpace to set. When print debug, will be namespace => <debug string>
+ */
+ public void setNameSpace(String nameSpace) {
+ this.nameSpace = nameSpace;
+ }
+
+ /**
+ * @param swtColor
+ */
+ public void setColor(int swtColor) {
+ currentColor = swtColor;
+ }
+
+ public void setFileOutput(String filename) {
+ try {
+ out = new PrintStream(new AppendFileStream(filename));
+ report("Output being sent to file " + filename);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ class AppendFileStream extends OutputStream {
+ RandomAccessFile fd;
+
+ public AppendFileStream(String file) throws IOException {
+ fd = new RandomAccessFile(file, "rw");
+ fd.seek(fd.length());
+ }
+
+ public void close() throws IOException {
+ fd.close();
+ }
+
+ public void write(byte[] b) throws IOException {
+ fd.write(b);
+ }
+
+ public void write(byte[] b, int off, int len) throws IOException {
+ fd.write(b, off, len);
+ }
+
+ public void write(int b) throws IOException {
+ fd.write(b);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DialogSelectionHelper.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DialogSelectionHelper.java
new file mode 100644
index 00000000000..f72bd955455
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DialogSelectionHelper.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.framework.ui.plugin.util;
+
+public class DialogSelectionHelper implements Runnable {
+
+ private int selection = -1;
+ private boolean saveSelection;
+ private Object[] availableSelections;
+
+ public DialogSelectionHelper(Object[] availableSelections) {
+ this.availableSelections = availableSelections;
+ }
+
+ public DialogSelectionHelper(Object[] availableSelections, String msg) {
+ this.availableSelections = availableSelections;
+ }
+
+ public void run() {
+ ListSelectionDialog dlg =
+ new ListSelectionDialog(availableSelections, null, "File Selection", null, "String dialogMessage", 3,
+ new String[] {"OK", "Cancel"}, 0);
+
+ int result = dlg.open();
+ if (result == 0) {
+ selection = dlg.getSelection();
+ saveSelection = dlg.saveSelection();
+ }
+ }
+
+ public int getSelectionIndex() {
+ return selection;
+ }
+
+ /**
+ * @return Returns the saveSelection.
+ */
+ public boolean isSaveSelection() {
+ return saveSelection;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DirectoryOrFileSelector.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DirectoryOrFileSelector.java
new file mode 100644
index 00000000000..2f086b2ee9b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/DirectoryOrFileSelector.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.framework.ui.plugin.util;
+
+import java.io.File;
+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;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class DirectoryOrFileSelector extends Composite implements Listener {
+
+ private Button radDirectory;
+ private Button radSingleFile;
+ private Text txtDirectory;
+ private Text txtSingleFile;
+ private Button btnDirectory;
+ private Button btnSingleFile;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public DirectoryOrFileSelector(Composite parent, int style, String name, Listener listener) {
+ super(parent, style);
+ GridLayout gdMain = new GridLayout();
+ gdMain.marginHeight = 0;
+ gdMain.marginWidth = 0;
+ setLayout(gdMain);
+ setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Group composite = new Group(this, style);
+ composite.setText(name);
+ GridLayout gd = new GridLayout();
+ gd.numColumns = 3;
+ composite.setLayout(gd);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ radDirectory = new Button(composite, SWT.RADIO);
+ radDirectory.setText("Directory:");
+ radDirectory.addListener(SWT.Selection, this);
+ radDirectory.addListener(SWT.Selection, listener);
+ txtDirectory = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ txtDirectory.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ txtDirectory.addListener(SWT.Modify, this);
+ txtDirectory.addListener(SWT.Modify, listener);
+ btnDirectory = new Button(composite, SWT.PUSH);
+ btnDirectory.setText("&Browse...");
+ btnDirectory.addSelectionListener(new SelectionAdapter() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ File directory = selectDirectory();
+ if (directory != null && directory.isDirectory()) txtDirectory.setText(directory.getPath());
+ }
+
+ });
+
+ radSingleFile = new Button(composite, SWT.RADIO);
+ radSingleFile.setText("File:");
+ radSingleFile.addListener(SWT.Selection, this);
+ radSingleFile.addListener(SWT.Selection, listener);
+ txtSingleFile = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ txtSingleFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ txtSingleFile.addListener(SWT.Modify, this);
+ txtSingleFile.addListener(SWT.Modify, listener);
+ btnSingleFile = new Button(composite, SWT.PUSH);
+ btnSingleFile.setText("&Browse...");
+ btnSingleFile.addSelectionListener(new SelectionAdapter() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ File file = selectFile();
+ if (file != null && file.isFile()) txtSingleFile.setText(file.getPath());
+ }
+
+ });
+ }
+
+ private void updateWidgetEnablements() {
+ boolean directorySelected = radDirectory.getSelection();
+
+ txtDirectory.setEnabled(directorySelected);
+ btnDirectory.setEnabled(directorySelected);
+
+ txtSingleFile.setEnabled(!directorySelected);
+ btnSingleFile.setEnabled(!directorySelected);
+ }
+
+ public File getFile() {
+ File file;
+ if (isDirectorySelected()) {
+ file = new File(txtDirectory.getText());
+ } else {
+ file = new File(txtSingleFile.getText());
+ }
+
+ return file;
+ }
+
+ public String getText() {
+ return (isDirectorySelected() ? txtDirectory : txtSingleFile).getText();
+ }
+
+ public boolean isDirectorySelected() {
+ return radDirectory.getSelection();
+ }
+
+ public void setDirectorySelected(boolean selected) {
+ radDirectory.setSelection(selected);
+ radSingleFile.setSelection(!selected);
+
+ updateWidgetEnablements();
+ }
+
+ public void setText(String text) {
+ (isDirectorySelected() ? txtDirectory : txtSingleFile).setText(text);
+ }
+
+ public boolean validate(WizardDataTransferPage wizardPage) {
+ if ((isDirectorySelected() && getFile().isDirectory()) || (!isDirectorySelected() && getFile().isFile())) return true;
+
+ wizardPage.setErrorMessage(getText() + " is not a " + (isDirectorySelected() ? "directory" : "file"));
+ return false;
+ }
+
+ private File selectFile() {
+ FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.SINGLE);
+ dialog.setFilterPath(AWorkspace.getWorkspacePath());
+
+ String path = dialog.open();
+
+ if (path != null) {
+ return new File(path);
+ } else {
+ return null;
+ }
+ }
+
+ private File selectDirectory() {
+ DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN);
+ dialog.setFilterPath(AWorkspace.getWorkspacePath());
+
+ String path = dialog.open();
+
+ if (path != null) {
+ return new File(path);
+ } else {
+ return null;
+ }
+ }
+
+ public void handleEvent(Event event) {
+ updateWidgetEnablements();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Displays.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Displays.java
new file mode 100644
index 00000000000..e3a52745e73
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Displays.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.framework.ui.plugin.util;
+
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class Displays {
+
+ public static void ensureInDisplayThread(Runnable runnable) {
+ ensureInDisplayThread(runnable, false);
+ }
+
+ public static void ensureInDisplayThread(Runnable runnable, boolean forcePend) {
+ if (isDisplayThread()) {
+ // No need to check for force since this will always pend
+ runnable.run();
+ } else {
+ if (forcePend) {
+ Display.getDefault().syncExec(runnable);
+ } else {
+ Display.getDefault().asyncExec(runnable);
+ }
+ }
+ }
+
+ public static boolean isDisplayThread() {
+ if (Display.getCurrent() == null) return false;
+
+ return Display.getCurrent().getThread() == Thread.currentThread();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/FileSelector.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/FileSelector.java
new file mode 100644
index 00000000000..eba951a6d5d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/FileSelector.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.framework.ui.plugin.util;
+
+import java.io.File;
+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;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class FileSelector extends Composite {
+
+ private Label radSingleFile;
+ private Text txtSingleFile;
+ private Button btnSingleFile;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public FileSelector(Composite parent, int style, String name, Listener listener) {
+ super(parent, style);
+ setLayout(new GridLayout());
+ setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Group composite = new Group(this, style);
+ composite.setText(name);
+ GridLayout gd = new GridLayout();
+ gd.numColumns = 3;
+ composite.setLayout(gd);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ radSingleFile = new Label(composite, SWT.NONE);
+ radSingleFile.setText("File:");
+ txtSingleFile = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ txtSingleFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ txtSingleFile.addListener(SWT.Modify, listener);
+ btnSingleFile = new Button(composite, SWT.PUSH);
+ btnSingleFile.setText("&Browse...");
+ btnSingleFile.addSelectionListener(new SelectionAdapter() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ File file = selectFile();
+ if (file != null && file.isFile()) txtSingleFile.setText(file.getPath());
+ }
+
+ });
+ }
+
+ public File getFile() {
+ File file = new File(txtSingleFile.getText());
+ return file;
+ }
+
+ public String getText() {
+ return txtSingleFile.getText();
+ }
+
+ public void setText(String text) {
+ txtSingleFile.setText(text);
+ }
+
+ public boolean validate(WizardDataTransferPage wizardPage) {
+ if (getText().endsWith(".xml") && getFile().isFile()) return true;
+
+ wizardPage.setErrorMessage("File is not a valid xml file");
+ return false;
+ }
+
+ private File selectFile() {
+ FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.SINGLE);
+ dialog.setFilterExtensions(new String[] {"*.xml"});
+ dialog.setFilterPath(AWorkspace.getWorkspacePath());
+
+ String path = dialog.open();
+
+ if (path != null) {
+ return new File(path);
+ } else {
+ return null;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Files.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Files.java
new file mode 100644
index 00000000000..3ba7b943976
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Files.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.framework.ui.plugin.util;
+
+import java.io.File;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class Files {
+
+ public static File selectFile(Shell shell, int swtType, String... extensions) {
+ FileDialog dialog = new FileDialog(shell, swtType | SWT.SINGLE);
+ dialog.setFilterExtensions(extensions);
+ dialog.setFilterPath(AWorkspace.getWorkspacePath());
+
+ String path = dialog.open();
+
+ if (path != null) {
+ return new File(path);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/GetChildrenJob.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/GetChildrenJob.java
new file mode 100644
index 00000000000..8bbefbfb1ea
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/GetChildrenJob.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.framework.ui.plugin.util;
+
+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.viewers.Viewer;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseePluginUiActivator;
+import org.eclipse.osee.framework.ui.swt.IContentProviderRunnable;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class GetChildrenJob extends Job {
+ private final Viewer viewer;
+ private final JobbedNode parent;
+ private final IContentProviderRunnable runnable;
+
+ /**
+ * @param name
+ * @param viewer
+ * @param parent
+ * @param runnable
+ */
+ public GetChildrenJob(String name, Viewer viewer, JobbedNode parent, IContentProviderRunnable runnable) {
+ super("Fetching children" + (name == null ? "" : " for " + name));
+ if (viewer == null) throw new IllegalArgumentException("view can not be null");
+ if (parent == null) throw new IllegalArgumentException("parent can not be null.");
+ if (runnable == null) throw new IllegalArgumentException("runnable can not be null.");
+
+ this.viewer = viewer;
+ this.parent = parent;
+ this.runnable = runnable;
+ }
+
+ @Override
+ protected final IStatus run(IProgressMonitor monitor) {
+ CancelWatcher watcher = new CancelWatcher(getThread(), monitor);
+ watcher.start();
+ try {
+ Object[] children = runnable.run(parent.getBackingData());
+
+ if (!monitor.isCanceled()) {
+ parent.setChildren(children);
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ viewer.refresh();
+ }
+ });
+ } else {
+ parent.cancelled();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OseePluginUiActivator.class, Level.SEVERE, ex);
+ parent.cancelled(ex);
+ } finally {
+ watcher.done();
+ monitor.done();
+ }
+
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/IShellCloseEvent.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/IShellCloseEvent.java
new file mode 100644
index 00000000000..ae472132b78
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/IShellCloseEvent.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.framework.ui.plugin.util;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IShellCloseEvent {
+ void onClose();
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/JobbedNode.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/JobbedNode.java
new file mode 100644
index 00000000000..a7c0165ca7d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/JobbedNode.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.swt.IContentProviderRunnable;
+import org.eclipse.osee.framework.ui.swt.ITreeNode;
+import org.eclipse.osee.framework.ui.swt.TreeNode;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class JobbedNode extends TreeNode {
+ private static final long serialVersionUID = 2285210369260889786L;
+ private static final JobbedNode LOADING_NODE = new JobbedNode("Loading...");
+ private static final JobbedNode CANCELLED_NODE = new JobbedNode("Cancelled");
+ private static final Object[] LOADING = new Object[] {LOADING_NODE};
+ private static final Object[] CANCELLED = new Object[] {CANCELLED_NODE};
+ private final Viewer viewer;
+ private final IContentProviderRunnable providerRunnable;
+ private boolean expand = false;
+
+ private JobbedNode(String title) {
+ super(null, null, title);
+ this.viewer = null;
+ this.providerRunnable = null;
+ }
+
+ public JobbedNode(Object backingData, Viewer viewer, IContentProviderRunnable providerRunnable) {
+ this(backingData, viewer, providerRunnable, null);
+ }
+
+ public JobbedNode(Object backingData, Viewer viewer, IContentProviderRunnable providerRunnable, JobbedNode parent) {
+ super(parent, null, backingData);
+ this.viewer = viewer;
+ this.providerRunnable = providerRunnable;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.swt.ITreeNode#getChildren()
+ */
+ @Override
+ public Object[] getChildren() {
+ if (children == null && providerRunnable != null) {
+ children = LOADING;
+ Jobs.startJob(new GetChildrenJob(null, viewer, this, providerRunnable));
+ }
+ return children;
+ }
+
+ public void cancelled() {
+ cancelled(CANCELLED);
+ }
+
+ public void cancelled(Exception ex) {
+ cancelled(new Object[] {ex});
+ }
+
+ private void cancelled(Object[] children) {
+ this.children = children;
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ viewer.refresh();
+ }
+ });
+ }
+
+ @Override
+ public void setChildren(Object[] objChildren) {
+ super.setChildren(objChildren);
+
+ if (expand) {
+ if (viewer instanceof TreeViewer) {
+ final TreeViewer treeViewer = (TreeViewer) viewer;
+
+ Displays.ensureInDisplayThread(new Runnable() {
+
+ public void run() {
+ treeViewer.refresh();
+ treeViewer.expandToLevel(2);
+ }
+ });
+ }
+ }
+ }
+
+ public void refresh() {
+ refresh(false);
+ }
+
+ public void refresh(boolean expand) {
+ this.expand = expand;
+
+ if (children != null) for (Object obj : children)
+ if (obj instanceof JobbedNode) ((JobbedNode) obj).refresh(true);
+
+ children = null;
+ }
+
+ @Override
+ protected ITreeNode getChild(Object backingData) {
+ return new JobbedNode(backingData, viewer, providerRunnable, this);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialog.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialog.java
new file mode 100644
index 00000000000..ca63e893cbf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialog.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.framework.ui.plugin.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+public class ListSelectionDialog extends MessageDialog {
+
+ private Button okButton;
+ private Button cancelButton;
+ private List selections;
+ private int selectionIndex;
+ private Object[] choose;
+ private Button saveSelection;
+ private boolean isChecked = true;
+
+ /**
+ * @return Returns the isChecked.
+ */
+ public boolean saveSelection() {
+ return isChecked;
+ }
+
+ public ListSelectionDialog(Object[] choose, Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.choose = choose;
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ selections = new List(parent, SWT.SINGLE);
+ saveSelection = new Button(parent, SWT.CHECK);//.setText("Checkbox 1");
+ saveSelection.setText("Remember Selection");
+ saveSelection.setSelection(true);
+
+ saveSelection.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ isChecked = saveSelection.getSelection();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+ for (int i = 0; i < choose.length; i++) {
+ selections.add(choose[i].toString());
+ }
+
+ selections.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ selectionIndex = selections.getSelectionIndex();
+ System.out.println("selected index " + selectionIndex);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+
+ selections.select(0);
+
+ return parent;
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ cancelButton = getButton(1);
+
+ okButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+
+ return c;
+ }
+
+ public int getSelection() {
+ return selectionIndex;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialogNoSave.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialogNoSave.java
new file mode 100644
index 00000000000..3bbf00f3506
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ListSelectionDialogNoSave.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.framework.ui.plugin.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Shell;
+
+public class ListSelectionDialogNoSave extends MessageDialog {
+
+ private Button okButton;
+ private Button cancelButton;
+ private List selections;
+ private int selectionIndex;
+ private Object[] choose;
+
+ public ListSelectionDialogNoSave(Object[] choose, Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
+ this.choose = choose;
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ selections = new List(parent, SWT.SINGLE);
+ for (int i = 0; i < choose.length; i++) {
+ selections.add(choose[i].toString());
+ }
+
+ selections.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ selectionIndex = selections.getSelectionIndex();
+ System.out.println("selected index " + selectionIndex);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+
+ selections.select(0);
+
+ return parent;
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ cancelButton = getButton(1);
+
+ okButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+
+ return c;
+ }
+
+ public int getSelection() {
+ return selectionIndex;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ModelessDialog.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ModelessDialog.java
new file mode 100644
index 00000000000..81b21163965
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ModelessDialog.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.framework.ui.plugin.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Shell;
+
+public class ModelessDialog extends MessageDialog {
+ private List<IShellCloseEvent> closeEventListeners = new ArrayList<IShellCloseEvent>();
+
+ public ModelessDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ }
+
+ /**
+ * Calling will enable dialog to loose focus
+ */
+ public void setModeless() {
+ setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS);
+ setBlockOnOpen(false);
+ }
+
+ public void setSelectionListener(SelectionListener listener) {
+ for (int i = 0; i < getButtonLabels().length; i++) {
+ Button button = getButton(i);
+ button.addSelectionListener(listener);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.MessageDialog#handleShellCloseEvent()
+ */
+ @Override
+ protected void handleShellCloseEvent() {
+ super.handleShellCloseEvent();
+ for (IShellCloseEvent event : closeEventListeners) {
+ event.onClose();
+ }
+ }
+
+ public void addShellCloseEventListeners(IShellCloseEvent event) {
+ closeEventListeners.add(event);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ObjectList.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ObjectList.java
new file mode 100644
index 00000000000..40c48a14cbc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ObjectList.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.List;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ObjectList<A> extends List {
+ private java.util.List<A> items;
+
+ public ObjectList(Composite parent, int style) {
+ super(parent, style);
+ items = new ArrayList<A>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#add(java.lang.String, int)
+ */
+ @Override
+ @Deprecated
+ public void add(String string, int index) {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#add(java.lang.String)
+ */
+ @Override
+ @Deprecated
+ public void add(String string) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void add(A item, String description) {
+ items.add(item);
+ super.add(description);
+ }
+
+ public void add(A item, String description, int index) {
+ items.add(index, item);
+ super.add(description, index);
+ }
+
+ public A getItemAt(int index) {
+ return items.get(index);
+ }
+
+ public A getSelectedItem() {
+ if (this.getSelectionCount() > 1) throw new IllegalStateException("There is more than one item selected");
+
+ int index = this.getSelectionIndex();
+ if (index < 0)
+ return null;
+ else
+ return getItemAt(this.getSelectionIndex());
+ }
+
+ public Collection<A> getSelectedItems() {
+ int[] selected = super.getSelectionIndices();
+ ArrayList<A> selectedItems = new ArrayList<A>(selected.length);
+ for (int i : selected)
+ selectedItems.add(items.get(i));
+
+ return selectedItems;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#remove(int, int)
+ */
+ @Override
+ public void remove(int start, int end) {
+ for (int i = 0; i <= (end - start); i++)
+ items.remove(start);
+ super.remove(start, end);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#remove(int)
+ */
+ @Override
+ public void remove(int index) {
+ items.remove(index);
+ super.remove(index);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#remove(int[])
+ */
+ @Override
+ @Deprecated
+ public void remove(int[] indices) {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#remove(java.lang.String)
+ */
+ @Override
+ @Deprecated
+ public void remove(String string) {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.List#removeAll()
+ */
+ @Override
+ public void removeAll() {
+ items.clear();
+ super.removeAll();
+ }
+
+ // Stop SWT from disallowing our simple class extension
+ @Override
+ protected void checkSubclass() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OseeConsole.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OseeConsole.java
new file mode 100644
index 00000000000..510f39ddee9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OseeConsole.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.util;
+
+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.plugin.OseePluginUiActivator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IOConsole;
+import org.eclipse.ui.console.IOConsoleOutputStream;
+
+/**
+ * Creates an Eclipse Console instance and allows writing output, errors and prompt messages There should be at one
+ * instance of a ConsoleWriter per plugin that needs to output messages and errors. *
+ *
+ * @author Donald G. Dunne
+ */
+public class OseeConsole {
+ private IOConsoleOutputStream streamOut = null;
+
+ private IOConsoleOutputStream streamErr = null;
+
+ private IOConsoleOutputStream streamPrompt = null;
+
+ private final IOConsole console;
+
+ private final HandleInput inputHandler;
+
+ private boolean time;
+
+ private final Thread thread;
+
+ public OseeConsole(String title) {
+ this(title, true);
+ }
+
+ public OseeConsole(String title, boolean time) {
+ console = new IOConsole(title, null);
+ this.time = time;
+ this.inputHandler = new HandleInput();
+
+ thread = new Thread(inputHandler);
+ thread.setName("Osee console input handler");
+ ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console});
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ streamOut = console.newOutputStream();// newMessageStream();
+ streamOut.setColor(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
+ streamOut.setActivateOnWrite(false);
+ streamErr = console.newOutputStream();
+ streamErr.setColor(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+ streamErr.setActivateOnWrite(false);
+ streamPrompt = console.newOutputStream();
+ streamPrompt.setColor(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+ streamPrompt.setActivateOnWrite(false);
+ }
+ });
+ thread.start();
+ }
+
+ public PrintStream getPrintStream() {
+ return new PrintStream(streamOut);
+ }
+
+ public void shutdown() {
+ thread.interrupt();
+ 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);
+ }
+
+ 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<IConsoleInputListener>();
+ }
+
+ public void addListener(IConsoleInputListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(IConsoleInputListener listener) {
+ listeners.remove(listener);
+ }
+
+ 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(OseePluginUiActivator.class, Level.INFO, "done with the handling of input");
+ }
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OverlayImage.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OverlayImage.java
new file mode 100644
index 00000000000..fc439d9f0ad
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/OverlayImage.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.framework.ui.plugin.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+
+public class OverlayImage extends CompositeImageDescriptor {
+
+ private final Image baseImage;
+ private ImageDescriptor overlayImageDescriptor;
+ private int xValue = 0;
+ private int yValue = 0;
+ private Collection<ImageInfo> imageInfo;
+
+ public static enum Location {
+ TOP_LEFT, TOP_RIGHT, BOT_LEFT, BOT_RIGHT
+ };
+
+ public ImageDescriptor getImageDescriptor() {
+ return overlayImageDescriptor;
+ }
+
+ public static class ImageInfo {
+ public ImageDescriptor descriptor;
+ public Location location;
+
+ public ImageInfo(ImageDescriptor descriptor, Location location) {
+ this.descriptor = descriptor;
+ this.location = location;
+ }
+ }
+
+ public OverlayImage(Image baseImage, Collection<ImageInfo> imageInfo) {
+ this.baseImage = baseImage;
+ this.imageInfo = imageInfo;
+ }
+
+ public OverlayImage(Image baseImage, ImageDescriptor overlayImageDescriptor, Location location) {
+ this.baseImage = baseImage;
+ this.overlayImageDescriptor = overlayImageDescriptor;
+ this.imageInfo = new ArrayList<ImageInfo>(2);
+ imageInfo.add(new ImageInfo(overlayImageDescriptor, location));
+ }
+
+ public OverlayImage(Image baseImage, ImageDescriptor overlayImageDescriptor) {
+ this(baseImage, overlayImageDescriptor, Location.TOP_LEFT);
+ }
+
+ public OverlayImage(Image baseImage, ImageDescriptor overlayImageDescriptor, int xValue, int yValue) {
+ if (baseImage == null) throw new IllegalArgumentException("baseImage can not be null");
+ if (overlayImageDescriptor == null) throw new IllegalArgumentException("overlayImageDescriptor can not be null");
+
+ this.baseImage = baseImage;
+ this.overlayImageDescriptor = overlayImageDescriptor;
+ this.xValue = xValue;
+ this.yValue = yValue;
+ }
+
+ /**
+ * Set x,y pixel to draw the overlay image eg: 8,8 for bottom right of a 16x16 image 0,0 for top left
+ *
+ * @param xValue
+ * @param yValue
+ */
+ public void setXY(int xValue, int yValue) {
+ this.xValue = xValue;
+ this.yValue = yValue;
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ // To draw a composite image, the base image should be
+ // drawn first (first layer) and then the overlay image
+ // (second layer)
+ // Draw the base image using the base image's image data
+ drawImage(baseImage.getImageData(), 0, 0);
+
+ if (imageInfo == null) {
+ // Overlaying the icon in the top left corner i.e. x and y
+ // coordinates are both zero
+ drawImage(overlayImageDescriptor.getImageData(), xValue, yValue);
+ } else {
+ for (ImageInfo info : imageInfo) {
+ if (info.location == Location.TOP_LEFT)
+ drawImage(info.descriptor.getImageData(), 0, 0);
+ else if (info.location == Location.BOT_LEFT)
+ drawImage(info.descriptor.getImageData(), 0, 8);
+ else if (info.location == Location.TOP_RIGHT)
+ drawImage(info.descriptor.getImageData(), 8, 0);
+ else if (info.location == Location.BOT_RIGHT) drawImage(info.descriptor.getImageData(), 8, 8);
+ }
+ }
+ }
+
+ @Override
+ protected Point getSize() {
+ // System.err.println("Width = " + baseImage.getBounds().width);
+ // System.err.println("Height = " + baseImage.getBounds().height);
+ int baseWidth = baseImage.getBounds().width;
+ int baseHeight = baseImage.getBounds().height;
+
+ Image overImg = overlayImageDescriptor.createImage();
+ int overWidth = overImg.getBounds().width;
+ int overHeight = overImg.getBounds().height;
+ overlayImageDescriptor.destroyResource(overImg);
+
+ return new Point(baseWidth > overWidth ? baseWidth : overWidth, baseHeight > overHeight ? baseHeight : overHeight);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Result.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Result.java
new file mode 100644
index 00000000000..0f7fd73f06b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Result.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.framework.ui.plugin.util;
+
+public class Result {
+
+ public static Result TrueResult = new Result(true);
+ public static Result FalseResult = new Result(false);
+ private final boolean isTrue;
+ private String text = "";
+
+ public Result(boolean valid, String text) {
+ this.isTrue = valid;
+ this.text = text;
+ }
+
+ public Result(String text) {
+ this.isTrue = false;
+ this.text = text;
+ }
+
+ public Result(boolean isTrue) {
+ this.isTrue = isTrue;
+ }
+
+ public Result() {
+ this.isTrue = true;
+ }
+
+ public boolean isTrue() {
+ return isTrue;
+ }
+
+ public boolean isFalse() {
+ return !isTrue;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(isTrue()) + (getText().equals("") ? "" : " - \"" + getText() + "\"");
+ }
+
+ public void popup() {
+ AWorkbench.popup((isTrue ? "Success" : "ERROR"),
+ text != null && !text.equals("") ? text : isTrue ? "Success" : "Error Encountered. See Error Log View");
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ResultRunnable.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ResultRunnable.java
new file mode 100644
index 00000000000..362ebc6e15e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ResultRunnable.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.framework.ui.plugin.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultRunnable implements Runnable {
+
+ protected Result runnableResult = Result.TrueResult;
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ }
+
+ /**
+ * @return the result
+ */
+ public Result getResult() {
+ return runnableResult;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/SelectionCountChangeListener.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/SelectionCountChangeListener.java
new file mode 100644
index 00000000000..065bea1a76d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/SelectionCountChangeListener.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.framework.ui.plugin.util;
+
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.ui.IViewSite;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class SelectionCountChangeListener implements ISelectionChangedListener {
+ private IStatusLineManager statusLineManager;
+
+ /**
+ * @param viewSite
+ */
+ public SelectionCountChangeListener(IViewSite viewSite) {
+ this.statusLineManager = viewSite.getActionBars().getStatusLineManager();
+ }
+
+ /**
+ * @param statusLineManager
+ */
+ public SelectionCountChangeListener(IStatusLineManager statusLineManager) {
+ this.statusLineManager = statusLineManager;
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+
+ IStatusLineManager lineManager = statusLineManager;
+ if (selection.size() > 1)
+ lineManager.setMessage(selection.size() + " items selected");
+ else
+ lineManager.setMessage("");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringLabelProvider.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringLabelProvider.java
new file mode 100644
index 00000000000..8cfc94b1727
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringLabelProvider.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.framework.ui.plugin.util;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Artifact Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class StringLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ return ((String) arg0);
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringViewerSorter.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringViewerSorter.java
new file mode 100644
index 00000000000..a831fc7041a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/StringViewerSorter.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.framework.ui.plugin.util;
+
+import java.text.Collator;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class StringViewerSorter extends ViewerSorter {
+
+ /**
+ *
+ */
+ public StringViewerSorter() {
+ }
+
+ /**
+ * @param collator
+ */
+ public StringViewerSorter(Collator collator) {
+ super(collator);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare((String) e1, (String) e2);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ViewPartUtil.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ViewPartUtil.java
new file mode 100644
index 00000000000..c091eb141a4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/ViewPartUtil.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.framework.ui.plugin.util;
+
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+public class ViewPartUtil {
+
+ /**
+ * Attempts to start up the ViewPart using an integer as the unique identifier for the secondary ID. This secondary
+ * ID will be the smallest integer not currently being used as a secondary ID for this view type, beginning with 1.
+ *
+ * @param viewID The Canonical name to the ViewPart class to be started.
+ * @return the integer used as the secondary ID
+ */
+ public static int startMultiView(String viewID) {
+ /*
+ * ViewParts have a primary ID (which identifies the type of the View) and a secondary ID
+ * (which allows us to have multiple Views of the same type running concurrently. Since the
+ * secondary ID must be unique, we need to find an ID that isn't being used currently. Also,
+ * its nice to display this to the user so they can keep the views straight. So, we've opted
+ * to simply use an integer number for this purpose. Therefore, to startup another instnace of
+ * this view, we want to find a number which isn't currently being used, and use that. The
+ * lower numbers are preferable from a useability standpoint, and we'll start counting at 1.
+ * If a view is closed, we should first re-use its number before going on to higher numbers.
+ * For example, if views with secondary IDs 1, and 3 are currently running, the next instance
+ * of the view should be 2.
+ */
+
+ SortedSet<Integer> set = new TreeSet<Integer>();
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IViewReference[] viewRefs = page.getViewReferences();
+ for (IViewReference viewRef : viewRefs) {
+ if (viewRef.getId().equals(viewID)) {
+ try {
+ set.add(new Integer(viewRef.getSecondaryId()));
+ } catch (NumberFormatException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ // Find the next available integer number
+ Iterator<Integer> iter = set.iterator();
+ boolean found = false;
+ int secondaryId = 1;
+ while (iter.hasNext() && !found) {
+ if (iter.next().intValue() != secondaryId)
+ found = true;
+ else
+ secondaryId++;
+ }
+ try {
+ page.showView(viewID, Integer.toString(secondaryId), IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException ex) {
+ System.err.println("COULD NOT FIND " + viewID + ", with ID # = " + secondaryId);
+ ex.printStackTrace();
+ }
+
+ return secondaryId;
+ }
+
+ public static IViewPart openOrShowView(String viewId) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ return page.showView(viewId);
+ } catch (PartInitException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Launch Error",
+ "Couldn't Launch " + viewId + "\n\n" + e1.getMessage());
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WindowLocal.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WindowLocal.java
new file mode 100644
index 00000000000..fb421a558ba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WindowLocal.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.framework.ui.plugin.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * An Eclipse window-local variable. This will provide variables that appear to be scoped based on the active window
+ * that accesses the variable. All access to the variable from a non-window is considered from the same scope.
+ *
+ * @author Robert A. Fisher
+ */
+public class WindowLocal<T> {
+ private static final Object NON_WINDOW = new Object();
+ private Map<Object, T> valueMap;
+ private WindowKey windowKey;
+
+ public WindowLocal() {
+ this.valueMap = new HashMap<Object, T>();
+ windowKey = new WindowKey();
+ }
+
+ /**
+ * Provide the initial value to be used when accessed from a scope for the first time. This should be overriden by
+ * the application in most cases. The default implementation returns a null.<br/><br/> This method is not called
+ * when the first access to the variable in a scope is a set call.
+ */
+ protected T initialValue() {
+ return null;
+ }
+
+ /**
+ * Get the value of the variable for the current scope.
+ */
+ public T get() {
+ Object key = getWindowLocalKey();
+ T value = valueMap.get(key);
+
+ if (value == null) {
+ value = initialValue();
+ set(value);
+ }
+
+ return value;
+ }
+
+ /**
+ * Assign the value of the variable for the current scope.
+ */
+ public void set(T value) {
+ valueMap.put(getWindowLocalKey(), value);
+ }
+
+ /**
+ * Remove the variable from the current scope. This will cause the next access from this scope to appear as the
+ * first.
+ */
+ public void remove() {
+ valueMap.remove(getWindowLocalKey());
+ }
+
+ private Object getWindowLocalKey() {
+ Object key;
+
+ if (PlatformUI.isWorkbenchRunning()) {
+ Displays.ensureInDisplayThread(windowKey);
+ key = windowKey.getKey();
+ } else {
+ key = NON_WINDOW;
+ }
+
+ return key;
+ }
+
+ private class WindowKey implements Runnable {
+ private Object key;
+
+ public void run() {
+ key = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ }
+
+ public Object getKey() {
+ return key;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Wizards.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Wizards.java
new file mode 100644
index 00000000000..b122885d080
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/Wizards.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.framework.ui.plugin.util;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWizard;
+
+/**
+ * @author Robert A. Fisher
+ */
+public final class Wizards {
+ public static final void initAndOpen(IWorkbenchWizard wizard, IViewPart viewPart) {
+ initAndOpen(wizard, viewPart.getViewSite().getWorkbenchWindow());
+ }
+
+ public static final void initAndOpen(IWorkbenchWizard wizard, IWorkbenchWindow workbenchWindow) {
+
+ IStructuredSelection selectionToPass;
+ // get the current workbench selection
+ ISelection workbenchSelection = workbenchWindow.getSelectionService().getSelection();
+ if (workbenchSelection instanceof IStructuredSelection) {
+ selectionToPass = (IStructuredSelection) workbenchSelection;
+ } else {
+ selectionToPass = StructuredSelection.EMPTY;
+ }
+
+ wizard.init(workbenchWindow.getWorkbench(), selectionToPass);
+
+ Shell parent = workbenchWindow.getShell();
+ WizardDialog dialog = new WizardDialog(parent, wizard);
+ dialog.create();
+ dialog.open();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WorkspaceSearchInit.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WorkspaceSearchInit.java
new file mode 100644
index 00000000000..ac1afc886f7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/util/WorkspaceSearchInit.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.framework.ui.plugin.util;
+
+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;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class WorkspaceSearchInit extends Job {
+ private Object obj;
+
+ public WorkspaceSearchInit(Object obj) {
+ super("Initializing Workspace Search");
+ this.obj = obj;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ AWorkspace.initWorkspaceSearch();
+ obj.notify();
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/AbstractPropertySource.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/AbstractPropertySource.java
new file mode 100644
index 00000000000..30521f354ee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/AbstractPropertySource.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.plugin.views.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource2;
+
+public abstract class AbstractPropertySource implements IPropertySource2 {
+ public static final String READ_ONLY = " (Read-Only)";
+
+ private IPropertyDescriptor[] descriptors;
+
+ public AbstractPropertySource() {
+ }
+
+ protected abstract void addPropertyDescriptors(List<IPropertyDescriptor> list);
+
+ public Object getEditableValue() {
+ return this;
+ }
+
+ public IPropertyDescriptor[] getPropertyDescriptors() {
+ if (descriptors == null) {
+ ArrayList<IPropertyDescriptor> list = new ArrayList<IPropertyDescriptor>();
+ addPropertyDescriptors(list);
+ descriptors = new IPropertyDescriptor[list.size()];
+ list.toArray(descriptors);
+ return descriptors;
+ }
+ return descriptors;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/BooleanPropertyDescriptor.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/BooleanPropertyDescriptor.java
new file mode 100644
index 00000000000..074f2e81f35
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/BooleanPropertyDescriptor.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.framework.ui.plugin.views.property;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+
+public class BooleanPropertyDescriptor extends ComboBoxPropertyDescriptor {
+ public static final Integer falseInteger = new Integer(0);
+ public static final Integer trueInteger = new Integer(1);
+ public static final String[] booleanValues = new String[] {"false", "true"};
+
+ public BooleanPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName(), booleanValues);
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static Integer fromModel(boolean b) {
+ return b ? trueInteger : falseInteger;
+ }
+
+ public static boolean toModel(Object integer) {
+ return ((Integer) integer).intValue() != 0;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/CompositePropertySource.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/CompositePropertySource.java
new file mode 100644
index 00000000000..9d6f2720270
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/CompositePropertySource.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.framework.ui.plugin.views.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+public class CompositePropertySource extends AbstractPropertySource {
+
+ private List<AbstractPropertySource> sources;
+
+ public CompositePropertySource() {
+ }
+
+ public CompositePropertySource(IPropertySource... sources) {
+ if (sources != null) {
+ for (IPropertySource source : sources) {
+ add(source);
+ }
+ }
+ }
+
+ public void add(IPropertySource propertySource) {
+ if (propertySource instanceof AbstractPropertySource) {
+ if (sources == null) {
+ sources = new ArrayList<AbstractPropertySource>();
+ }
+ sources.add((AbstractPropertySource) propertySource);
+ }
+ }
+
+ protected void addPropertyDescriptors(List<IPropertyDescriptor> list) {
+ if (sources != null) {
+ for (AbstractPropertySource propertySource : sources) {
+ propertySource.addPropertyDescriptors(list);
+ }
+ }
+ }
+
+ public Object getPropertyValue(Object id) {
+ if (sources != null) {
+ for (AbstractPropertySource propertySource : sources) {
+ Object result = propertySource.getPropertyValue(id);
+ if (result != null) {
+ return result;
+ }
+ }
+ }
+ return null;
+ }
+
+ public boolean isPropertyResettable(Object id) {
+ if (sources != null) {
+ for (AbstractPropertySource propertySource : sources) {
+ if (propertySource.isPropertyResettable(id)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean isPropertySet(Object id) {
+ if (sources != null) {
+ for (AbstractPropertySource propertySource : sources) {
+ if (propertySource.isPropertySet(id)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void resetPropertyValue(Object id) {
+ if (sources != null) {
+ for (AbstractPropertySource propertySource : sources) {
+ propertySource.resetPropertyValue(id);
+ }
+ }
+ }
+
+ public void setPropertyValue(Object id, Object value) {
+ if (sources != null) {
+ for (AbstractPropertySource propertySource : sources) {
+ propertySource.setPropertyValue(id, value);
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ImagePropertyDescriptor.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ImagePropertyDescriptor.java
new file mode 100644
index 00000000000..24e596269f2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ImagePropertyDescriptor.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.plugin.views.property;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+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.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImagePropertyDescriptor extends PropertyDescriptor {
+
+ public ImagePropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName());
+ setCategory(propertyId.getCategoryName());
+ setLabelProvider(new ILabelProvider() {
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ return "Image";
+ }
+
+ @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) {
+ }
+ });
+ }
+
+ public static Object fromModel(Image image) {
+ return image;
+ }
+
+ public static Image toModel(Object object) {
+ return (Image) object;
+ }
+
+ public CellEditor createPropertyEditor(Composite parent) {
+
+ CellEditor editor = new DialogCellEditor(parent) {
+ protected Object openDialogBox(Control cellEditorWindow) {
+ FileDialog dialog = new FileDialog(cellEditorWindow.getShell(), SWT.OPEN);
+ dialog.setFilterExtensions(new String[] {"jpg", "bmp", "png"});
+ dialog.open();
+ String fileName = dialog.getFileName();
+ if (Strings.isValid(fileName)) {
+ try {
+ Image image = ImageDescriptor.createFromURL(new File(fileName).toURI().toURL()).createImage();
+ return image;
+ } catch (MalformedURLException ex) {
+ OseeLog.log(OseeUiActivator.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ protected void updateContents(Object value) {
+ Label label = getDefaultLabel();
+ if (label == null) return;
+ String text = "";//$NON-NLS-1$
+ if (value != null) text = getLabelProvider().getText(value);
+ label.setText(text);
+ }
+ };
+ if (getValidator() != null) editor.setValidator(getValidator());
+ return editor;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/IntegerPropertyDescriptor.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/IntegerPropertyDescriptor.java
new file mode 100644
index 00000000000..0daa817c93c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/IntegerPropertyDescriptor.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.framework.ui.plugin.views.property;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseePluginUiActivator;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+public class IntegerPropertyDescriptor extends TextPropertyDescriptor {
+
+ public IntegerPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName());
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static String fromModel(int i) {
+ return String.valueOf(i);
+ }
+
+ public static int toModel(Object string) {
+ try {
+ return Integer.parseInt((String) string);
+ } catch (NumberFormatException ex) {
+ OseeLog.log(OseePluginUiActivator.class, Level.SEVERE, ex);
+ }
+ return 0;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ModelPropertySource.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ModelPropertySource.java
new file mode 100644
index 00000000000..397bbdebe2a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ModelPropertySource.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.framework.ui.plugin.views.property;
+
+public abstract class ModelPropertySource extends AbstractPropertySource {
+
+ private Object model;
+
+ public ModelPropertySource(Object model) {
+ this.model = model;
+ }
+
+ public Object getModel() {
+ return model;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/PropertyId.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/PropertyId.java
new file mode 100644
index 00000000000..767dfc622a0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/PropertyId.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.framework.ui.plugin.views.property;
+
+/**
+ * A PropertyId combines the category name and display name for a IPropertyDescriptor in a single object. The same set
+ * of diaplayNames may therefore appear more than once in a property list as is necessary to display both ends of an
+ * reference
+ */
+public class PropertyId {
+ private final String categoryName;
+ private final String displayName;
+
+ public PropertyId(String categoryName, String displayName) {
+ this.categoryName = categoryName;
+ this.displayName = displayName;
+ }
+
+ public String getCategoryName() {
+ return categoryName;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public String toString() {
+ return categoryName + " : " + displayName;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ReadOnlyPropertyDescriptor.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ReadOnlyPropertyDescriptor.java
new file mode 100644
index 00000000000..04e9468f5ed
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/ReadOnlyPropertyDescriptor.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.framework.ui.plugin.views.property;
+
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class ReadOnlyPropertyDescriptor extends PropertyDescriptor {
+
+ public ReadOnlyPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName());
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static String fromModel(Object object) {
+ return object != null ? object.toString() : "";
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/StringPropertyDescriptor.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/StringPropertyDescriptor.java
new file mode 100644
index 00000000000..46cbd6b31eb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/views/property/StringPropertyDescriptor.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.framework.ui.plugin.views.property;
+
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+public class StringPropertyDescriptor extends TextPropertyDescriptor {
+
+ public StringPropertyDescriptor(PropertyId propertyId) {
+ super(propertyId, propertyId.getDisplayName());
+ setCategory(propertyId.getCategoryName());
+ }
+
+ public static String fromModel(String string) {
+ return string != null ? string : "";
+ }
+
+ public static String toModel(Object string) {
+ return (String) string;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/EarlyStartup.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/EarlyStartup.java
new file mode 100644
index 00000000000..441a1bb1a4b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/EarlyStartup.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.plugin.workspace;
+
+import java.util.Hashtable;
+import org.eclipse.osee.framework.ui.plugin.OseePluginUiActivator;
+import org.eclipse.osee.framework.ui.plugin.workspace.internal.SafeWorkspaceAccessImpl;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IStartup;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class EarlyStartup implements IStartup {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IStartup#earlyStartup()
+ */
+ @Override
+ public void earlyStartup() {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ registerWorkspaceAccessService();
+ }
+ });
+ }
+
+ private void registerWorkspaceAccessService(){
+ BundleContext context = OseePluginUiActivator.getInstance().getContext();
+ context.registerService(SafeWorkspaceAccess.class.getName(), new SafeWorkspaceAccessImpl(), new Hashtable());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/SafeWorkspaceAccess.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/SafeWorkspaceAccess.java
new file mode 100644
index 00000000000..88348290d00
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/SafeWorkspaceAccess.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.framework.ui.plugin.workspace;
+
+import org.eclipse.core.resources.IWorkspace;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface SafeWorkspaceAccess {
+ IWorkspace getWorkspace();
+
+ /**
+ * @param workspaceListener
+ */
+ void addResourceChangeListener(WrapResourceChangeListener workspaceListener);
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/WrapResourceChangeListener.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/WrapResourceChangeListener.java
new file mode 100644
index 00000000000..950eb7e3f60
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/WrapResourceChangeListener.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.framework.ui.plugin.workspace;
+
+import org.eclipse.core.resources.IResourceChangeEvent;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface WrapResourceChangeListener {
+ public void resourceChanged(IResourceChangeEvent event);
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/ResourceChangeListenerImpl.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/ResourceChangeListenerImpl.java
new file mode 100644
index 00000000000..b532c7c4104
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/ResourceChangeListenerImpl.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.framework.ui.plugin.workspace.internal;
+
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.osee.framework.ui.plugin.workspace.WrapResourceChangeListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class ResourceChangeListenerImpl implements IResourceChangeListener {
+
+ private WrapResourceChangeListener listener;
+
+ public ResourceChangeListenerImpl(WrapResourceChangeListener listener){
+ this.listener = listener;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ listener.resourceChanged(event);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/SafeWorkspaceAccessImpl.java b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/SafeWorkspaceAccessImpl.java
new file mode 100644
index 00000000000..b34a4ebdab7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.plugin/src/org/eclipse/osee/framework/ui/plugin/workspace/internal/SafeWorkspaceAccessImpl.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.framework.ui.plugin.workspace.internal;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.plugin.workspace.WrapResourceChangeListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class SafeWorkspaceAccessImpl implements SafeWorkspaceAccess {
+
+ @Override
+ public IWorkspace getWorkspace() {
+ return ResourcesPlugin.getWorkspace();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess#addResourceChangeListener(org.eclipse.osee.framework.ui.plugin.workspace.WrapResourceChangeListener)
+ */
+ @Override
+ public void addResourceChangeListener(WrapResourceChangeListener workspaceListener) {
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(new ResourceChangeListenerImpl(workspaceListener));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.product/.classpath b/org.eclipse.osee.framework.ui.product/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/.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.framework.ui.product/.project b/org.eclipse.osee.framework.ui.product/.project
new file mode 100644
index 00000000000..f4622becd82
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.product</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.product/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.product/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..bd018fc01a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Eclipse OSEE Product (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.product;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Vendor: Eclipse.org
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.ui.intro
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: library.jar
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.ui.product/about.ini b/org.eclipse.osee.framework.ui.product/about.ini
new file mode 100644
index 00000000000..55d6675ad1d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/about.ini
@@ -0,0 +1,3 @@
+aboutText=%blurb
+featureImage=/images/osee_32.png
+tipsAndTricksHref=/org.eclipse.jdt.doc.user/tips/jdt_tips.html \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.product/about.properties b/org.eclipse.osee.framework.ui.product/about.properties
new file mode 100644
index 00000000000..f6aceef3d35
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/about.properties
@@ -0,0 +1,9 @@
+blurb=Open System Engineering Environment\n\
+\n\
+OSEE provides a tightly integrated environment that supports lean\n\
+engineering across the full product life-cycle. Since OSEE integrates all\n\
+engineering areas, the full life-cycle data for a product is managed by a\n\
+common platform allowing this data to be seamlessly combined to form a \n\
+coherent, accurate view of a project in real-time.\n\
+\n\
+http://www.eclipse.org/osee/ \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.product/build.properties b/org.eclipse.osee.framework.ui.product/build.properties
new file mode 100644
index 00000000000..55d59a78806
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/build.properties
@@ -0,0 +1,16 @@
+bin.includes = META-INF/,\
+ images/,\
+ nl/,\
+ introContent.xml,\
+ support/,\
+ library.jar,\
+ plugin.xml,\
+ plugin.properties,\
+ about.ini,\
+ about.properties,\
+ about.mappings,\
+ plugin.mappings,\
+ splash.bmp
+jars.compile.order = library.jar
+source.library.jar = src/
+output.library.jar = bin/
diff --git a/org.eclipse.osee.framework.ui.product/images/admin.gif b/org.eclipse.osee.framework.ui.product/images/admin.gif
new file mode 100644
index 00000000000..11812dfd607
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/admin.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/browse.gif b/org.eclipse.osee.framework.ui.product/images/browse.gif
new file mode 100644
index 00000000000..55ca8f3a9bf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/browse.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/bug.gif b/org.eclipse.osee.framework.ui.product/images/bug.gif
new file mode 100644
index 00000000000..9a738e55054
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/bug.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/edit.gif b/org.eclipse.osee.framework.ui.product/images/edit.gif
new file mode 100644
index 00000000000..22f0c4cba28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/edit.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/errorSm.gif b/org.eclipse.osee.framework.ui.product/images/errorSm.gif
new file mode 100644
index 00000000000..8612eaff599
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/errorSm.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/faq.gif b/org.eclipse.osee.framework.ui.product/images/faq.gif
new file mode 100644
index 00000000000..520c1a8666a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/faq.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/filter.gif b/org.eclipse.osee.framework.ui.product/images/filter.gif
new file mode 100644
index 00000000000..3d061d77cbe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/filter.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/lockkey.gif b/org.eclipse.osee.framework.ui.product/images/lockkey.gif
new file mode 100644
index 00000000000..fca03252afd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/lockkey.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/needSave.gif b/org.eclipse.osee.framework.ui.product/images/needSave.gif
new file mode 100644
index 00000000000..499dd0ca602
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/needSave.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/new.gif b/org.eclipse.osee.framework.ui.product/images/new.gif
new file mode 100644
index 00000000000..9d050885be6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/new.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/open.gif b/org.eclipse.osee.framework.ui.product/images/open.gif
new file mode 100644
index 00000000000..51e703b1b9c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/open.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/osee_154_152.png b/org.eclipse.osee.framework.ui.product/images/osee_154_152.png
new file mode 100644
index 00000000000..e79e8c95a82
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/osee_154_152.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/osee_16.png b/org.eclipse.osee.framework.ui.product/images/osee_16.png
new file mode 100644
index 00000000000..fbdac192723
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/osee_16.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/osee_32.png b/org.eclipse.osee.framework.ui.product/images/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/osee_48.png b/org.eclipse.osee.framework.ui.product/images/osee_48.png
new file mode 100644
index 00000000000..11605997297
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/osee_48.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/permission.bmp b/org.eclipse.osee.framework.ui.product/images/permission.bmp
new file mode 100644
index 00000000000..8a3e111c129
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/permission.bmp
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/publish.gif b/org.eclipse.osee.framework.ui.product/images/publish.gif
new file mode 100644
index 00000000000..a031b62c2d3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/publish.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/refresh.gif b/org.eclipse.osee.framework.ui.product/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/remove.gif b/org.eclipse.osee.framework.ui.product/images/remove.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/remove.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/report.gif b/org.eclipse.osee.framework.ui.product/images/report.gif
new file mode 100644
index 00000000000..e6bf9cf178e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/report.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/sample.gif b/org.eclipse.osee.framework.ui.product/images/sample.gif
new file mode 100644
index 00000000000..34fb3c9d8cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/sample.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/saved.gif b/org.eclipse.osee.framework.ui.product/images/saved.gif
new file mode 100644
index 00000000000..ad505a9c23f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/saved.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/train.gif b/org.eclipse.osee.framework.ui.product/images/train.gif
new file mode 100644
index 00000000000..222b48ad9d0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/train.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/images/viewMenu.gif b/org.eclipse.osee.framework.ui.product/images/viewMenu.gif
new file mode 100644
index 00000000000..a7c49189228
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/images/viewMenu.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/introContent.xml b/org.eclipse.osee.framework.ui.product/introContent.xml
new file mode 100644
index 00000000000..998e847f66e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/introContent.xml
@@ -0,0 +1,3 @@
+<introContent>
+ <page url="support/intro.html" alt-style="css/root_swt.properties" style="css/root.css" id="root" style-id="page" />
+</introContent> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.product/plugin.properties b/org.eclipse.osee.framework.ui.product/plugin.properties
new file mode 100644
index 00000000000..46f6a493ba6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/plugin.properties
@@ -0,0 +1,9 @@
+blurb=Open System Engineering Environment\n\
+\n\
+OSEE provides a tightly integrated environment that supports lean\n\
+engineering across the full product life-cycle. Since OSEE integrates all\n\
+engineering areas, the full life-cycle data for a product is managed by a\n\
+common platform allowing this data to be seamlessly combined to form a \n\
+coherent, accurate view of a project in real-time.\n\
+\n\
+http://www.eclipse.org/osee/ \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.product/plugin.xml b/org.eclipse.osee.framework.ui.product/plugin.xml
new file mode 100644
index 00000000000..9b1e4f33e09
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/plugin.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+
+ <extension
+ point="org.eclipse.ui.actionSets">
+ <actionSet
+ label="OSEE Product"
+ visible="true"
+ id="osee.product.actionSet">
+ <menu
+ label="&amp;OSEE"
+ id="osee.product.oseeMenu">
+ </menu>
+
+ </actionSet>
+ </extension>
+
+ <extension
+ id="osee"
+ name="Open System Engineering Environment"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.ui.ide.workbench"
+ description="The Open System Engineering Environment (OSEE) builds upon the strengths of Eclipse (an open, extensible, platform independent, feature-rich, tools platform) to provide a tightly integrated engineering environment that supports lean engineering. Since OSEE integrates all engineering areas, the full lifecycle data for a product is managed by a common platform allowing this data to be seamlessly brought together to form a coherent, accurate view of a project in real-time."
+ name="Open System Engineering Environment">
+ <property name="windowImages" value="images/osee_16.png,images/osee_32.png,images/osee_48.png" />
+ <property name="aboutImage" value="images/osee_154_152.png"/>
+ <property name="aboutText" value="%blurb"/>
+ <property name="appName" value="OSEE"/>
+ <property name="preferenceCustomization" value="support/plugin_customization.ini" />
+ </product>
+ </extension>
+<extension
+ point="org.eclipse.ui.intro">
+ <intro
+ class="org.eclipse.ui.intro.config.CustomizableIntroPart"
+ id="osee.product.intro">
+ </intro>
+ <introProductBinding
+ introId="osee.product.intro"
+ productId="osee.product.osee">
+ </introProductBinding>
+</extension>
+<extension
+ id="intro"
+ point="org.eclipse.ui.intro.config">
+ <config
+ introId="osee.product.intro"
+ id="osee.product.introConfig"
+ content="introContent.xml">
+ <presentation
+ home-page-id="root" standby-page-id="standby">
+ <implementation
+ ws="win32"
+ style="css/shared.css"
+ kind="html"
+ os="win32">
+ </implementation>
+ <implementation
+ kind="swt">
+ </implementation>
+ </presentation>
+ </config>
+</extension>
+
+
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.product/splash.bmp b/org.eclipse.osee.framework.ui.product/splash.bmp
new file mode 100644
index 00000000000..89ea4384c79
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/splash.bmp
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/support/images/intro.1.jpg b/org.eclipse.osee.framework.ui.product/support/images/intro.1.jpg
new file mode 100644
index 00000000000..738654cb008
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/images/intro.1.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/support/images/intro.2.gif b/org.eclipse.osee.framework.ui.product/support/images/intro.2.gif
new file mode 100644
index 00000000000..bb91eafffd5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/images/intro.2.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/support/images/intro.3.jpg b/org.eclipse.osee.framework.ui.product/support/images/intro.3.jpg
new file mode 100644
index 00000000000..852836e3be9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/images/intro.3.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/support/images/intro.4.jpg b/org.eclipse.osee.framework.ui.product/support/images/intro.4.jpg
new file mode 100644
index 00000000000..948326b3b33
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/images/intro.4.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/support/images/osee_arch.gif b/org.eclipse.osee.framework.ui.product/support/images/osee_arch.gif
new file mode 100644
index 00000000000..16fbe4deb55
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/images/osee_arch.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.product/support/intro.html b/org.eclipse.osee.framework.ui.product/support/intro.html
new file mode 100644
index 00000000000..c4901e27ec5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/intro.html
@@ -0,0 +1,54 @@
+<html>
+<head>
+<title>Open System Engineering Environment (OSEE)</title>
+<body lang=EN-US>
+
+<p><font color="green" size="2">NOTE: This page can be
+accessed anytime by selecting Help-&gt;Welcome&nbsp; -- Press
+&quot;X&quot; next to &quot;Welcome&quot; tab to close this window.</font></p>
+<div class=Section1>
+<h2>Welcome to the Open System Engineering Environment (OSEE)</h2>
+<blockquote>OSEE provides a tightly integrated environment
+that supports lean engineering across the full product life-cycle. Since
+OSEE integrates all engineering areas, the full lifecycle data for a
+product is managed by a common platform allowing this data to be
+seamlessly combined to form a coherent, accurate view of a project in
+real-time. At the heart of the OSEE architecture are the OSEE core
+services and application framework which are available to all the OSEE
+applications and enable their tight integration. <br>
+<br>
+The vision for OSEE finds concrete grounding in daily use by Subject
+Matter Experts developing next generation mission software for an
+existing Boeing aircraft. This direct involvement with a full-scale
+deployment of OSEE allows important user feedback to be rapidly
+incorporated back into both OSEE itself and as lessons learned for the
+development team. <br>
+<br>
+Since OSEE has been developed for use by separate groups of end users,
+careful attention has been given to providing a proper separation of
+core OSEE capabilities and specific extensions made for various groups.
+The requirement to support separate groups has helped ensure that OSEE
+is extensible through standard Eclipse mechanisms. The OSEE architecture
+is designed to provide an integrated, extensible engineering environment
+that can be adopted by any group engaged in engineering.</blockquote>
+<b><font size="4">Getting Started</font></b>
+</p>
+<ol>
+ <li>
+ <p>If this is your first time using OSEE, it is recommended that
+ you begin by learning the Workbench and how to navigate around.&nbsp;
+ The few minutes you spend here will enable quick and efficient use of
+ the basic framework.&nbsp; Start by Selecting Help -&gt; Help Content
+ -&gt; Workbench Users Guide.</p>
+ </li>
+ <li>
+ <p>From there, it is recommended that you look through any of the
+ items in the Help Contents that correlate to your specific tasks. You can
+ also press F1 at any time for context-sensitive help.</p>
+ </li>
+</ol>
+<p><font color="green" size="2">NOTE: This page can be
+accessed anytime by selecting Help-&gt;Welcome&nbsp; -- Press
+&quot;X&quot; next to &quot;Welcome&quot; tab to close this window.</font></p>
+</body>
+</html>
diff --git a/org.eclipse.osee.framework.ui.product/support/plugin_customization.ini b/org.eclipse.osee.framework.ui.product/support/plugin_customization.ini
new file mode 100644
index 00000000000..87dc53b76e7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.product/support/plugin_customization.ini
@@ -0,0 +1,90 @@
+# plugin_customization.ini
+# sets default values for plug-in-specific preferences
+# keys are qualified by plug-in id
+# e.g., com.example.acmeplugin/myproperty=myvalue
+# java.util.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# automatically refresh the workspace continuously
+org.eclipse.core.resources/refresh.enabled=true
+
+# perspective that the workbench opens initially
+org.eclipse.ui/defaultPerspectiveId=org.eclipse.ui.resourcePerspective
+
+# new-style tabs by default
+org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
+
+# put the perspective switcher on the top right
+org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
+
+# show progress on startup
+org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP=true
+
+org.eclipse.ui/SHOW_TEXT_ON_PERSPECTIVE_BAR=false
+org.eclipse.ui.editors/lineNumberRuler=true
+
+#Yes I'm sure
+org.eclipse.ui.ide/EXIT_PROMPT_ON_CLOSE_LAST_WINDOW=false
+
+#Install/Update -> Automatic Updates
+org.eclipse.update.scheduler/day=Every day
+org.eclipse.update.scheduler/hour=9\:00 AM
+org.eclipse.update.scheduler/download=true
+org.eclipse.update.core/org.eclipse.update.core.checkSignature=false
+org.eclipse.update.core/org.eclipse.update.core.updateVersions=compatible
+
+org.eclipse.compare/org.eclipse.compare.IgnoreWhitespace=true
+org.eclipse.compare/org.eclipse.compare.ShowMoreInfo=true
+
+#Compiler Settings
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+
+
+org.eclipse.jdt.ui/sp_cleanup.organize_imports=true
+org.eclipse.jdt.ui/sp_cleanup.format_source_code=true
+org.eclipse.jdt.ui/editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+
+
+
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.wizards.srcBinFoldersInNewProjects=true
+org.eclipse.jdt.ui/formatter_settings_version=11
+org.eclipse.jdt.ui/internal.default.compliance=default
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.exception.name=ex
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=11
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<profiles version\="11">\r\n<profile kind\="CodeFormatterProfile" name\="OSEE Java Standard" version\="11">\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_field" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_after_package" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.continuation_indentation" value\="2"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_package" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.source" value\="1.5"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_line_comments" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.lineSplit" value\="120"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indentation.size" value\="3"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_assignment" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value\="error"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.tabulation.char" value\="space"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_method" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_switch" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value\="error"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_block" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.compact_else_if" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.tabulation.size" value\="3"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_empty_lines" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.compliance" value\="1.5"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value\="2"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.line_length" value\="120"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_html" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_source_code" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value\="1.5"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_header" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_block_comments" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value\="80"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value\="false"/>\r\n</profile>\r\n</profiles>\r\n
+org.eclipse.jdt.ui/formatter_profile=_OSEE Java Standard
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.javadoclocations.migrated=true
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.code_templates_migrated=true
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*\r\n * Created on ${date}\r\n *\r\n * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE\r\n */\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">logger.log(Level.SEVERE, ${exception_var}.toString(), ${exception_var});</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template></templates>
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.templates_migrated=true
+org.eclipse.jdt.ui/org.eclipse.jdt.ui.visibility.order=B,V,R,D,
+org.eclipse.jdt.ui/outlinesortoption=T,SF,SI,SM,F,I,C,M,
+org.eclipse.jdt.ui/Refactoring.savealleditors=true
+org.eclipse.jdt.ui/tabWidthPropagated=true
+org.eclipse.jdt.ui/useAnnotationsPrefPage=true
+org.eclipse.jdt.ui/useQuickDiffPrefPage=true
+org.eclipse.search/org.eclipse.search.potentialMatch.ignore=true
+
+org.eclipse.team.core/file_types=product\n1\ncvsignore\n1\nwml\n1\nmxsd\n1\nhtml\n1\nxsd\n1\nprefs\n1\nxml\n1\nproperties\n1\nico\n2\nshtml\n1\ndatagraph\n1\njpage\n1\nbmp\n2\ngenmodel\n1\nhpp\n1\nbeaninfoConfig\n1\na\n2\nxsd2ecore\n1\ncpp\n1\necore2xml\n1\njsv\n1\njspx\n1\npdf\n2\nso\n2\nhtpl\n1\nini\n1\nzip\n2\nmod\n1\njsf\n1\ndll\n2\nemof\n1\nclass\n2\njspf\n1\nxslt\n1\noptions\n1\ntxt\n1\nclasspath\n1\ndoc\n2\ncdtproject\n1\npng\n2\ncxx\n1\nwsdl\n1\nxmljet\n1\ntif\n2\ntld\n1\nnst\n1\ntiff\n2\njavajet\n1\nc\n1\nh\n1\ntmo\n1\njsp\n1\ngif\n2\nMF\n1\nexsd\n1\nxhtml\n1\nppt\n2\noverride\n1\nxsl\n1\njardesc\n1\nhtm\n1\nexe\n2\njtpl\n1\no\n2\npropertiesjet\n1\nhh\n1\njar\n2\ncom\n2\ncc\n1\necore2ecore\n1\nxmi\n1\ndadx\n1\ncdtbuild\n1\necore\n1\nshtm\n1\njava\n1\njpeg\n2\ndtd\n1\ntag\n1\nproject\n1\ncss\n1\njetinc\n1\nxls\n2\njpg\n2\ntagf\n1\nent\n1\nlaunch\n1\ntagx\n1\n
+org.eclipse.team.core/ignore_files=*.a\ntrue\n*.dll\ntrue\n*.exe\ntrue\n*.so\ntrue\nbin\ntrue\n
+
+org.eclipse.ui.editors/tabWidth=3
+org.eclipse.ui.ide/MAX_RECENT_WORKSPACES=5
+org.eclipse.ui.ide/SHOW_WORKSPACE_SELECTION_DIALOG=true
+
+
+
+
+org.eclipse.ui.workbench/org.eclipse.ui.commands=<?xml version\="1.0" encoding\="UTF-8"?>\n<org.eclipse.ui.commands>\n<keyBinding contextId\="org.eclipse.ui.contexts.dialogAndWindow" keyConfigurationId\="org.eclipse.ui.defaultAcceleratorConfiguration" keySequence\="CTRL+INSERT"/>\n<keyBinding commandId\="org.eclipse.ui.edit.copy" contextId\="org.eclipse.ui.contexts.window" keyConfigurationId\="org.eclipse.ui.defaultAcceleratorConfiguration" keySequence\="CTRL+C"/>\n</org.eclipse.ui.commands>
diff --git a/org.eclipse.osee.framework.ui.security/.classpath b/org.eclipse.osee.framework.ui.security/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/.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.framework.ui.security/.project b/org.eclipse.osee.framework.ui.security/.project
new file mode 100644
index 00000000000..480fea62c6e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.security</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.security/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.security/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.security/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.security/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..1b0d64dd027
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Security Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.security;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Require-Bundle: org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.security
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Activator: org.eclipse.osee.framework.ui.security.internal.Activator
+Import-Package: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.logging,
+ org.osgi.framework
diff --git a/org.eclipse.osee.framework.ui.security/build.properties b/org.eclipse.osee.framework.ui.security/build.properties
new file mode 100644
index 00000000000..aed1551c5ed
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ src/
diff --git a/org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/DESEncrypter.java b/org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/DESEncrypter.java
new file mode 100644
index 00000000000..4c86db54a86
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/DESEncrypter.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.framework.ui.security;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidKeySpecException;
+import java.util.logging.Level;
+import javax.crypto.Cipher;
+import javax.crypto.CipherInputStream;
+import javax.crypto.CipherOutputStream;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.security.internal.Activator;
+
+/**
+ * Encrypts and Decrypts inputStreams using DES and MD5 hashing.
+ *
+ * @author Jeff C. Phillips
+ */
+
+public class DESEncrypter {
+ private static final String KEY_FORMAT = "PBEWithMD5AndDES";
+ private static int iterationCount = 15;
+ private Cipher encryptCipher;
+ private Cipher decryptCipher;
+ private SecretKey key;
+
+ private static byte[] salt =
+ {(byte) 0x8E, (byte) 0x45, (byte) 0x77, (byte) 0x94, (byte) 0x21, (byte) 0x32, (byte) 0x90, (byte) 0x22};
+
+ /**
+ * This constructor will auto generate a secret key. Therefore, the getKey() method should be used to save off the
+ * key to decrypt.
+ *
+ * @throws InvalidKeySpecException
+ * @throws NoSuchAlgorithmException
+ */
+ public DESEncrypter() throws InvalidKeySpecException, NoSuchAlgorithmException {
+ this(GUID.generateGuidStr());
+ }
+
+ /**
+ * @param passPhrase
+ * @throws NoSuchAlgorithmException
+ * @throws InvalidKeySpecException
+ */
+ public DESEncrypter(String passPhrase) throws InvalidKeySpecException, NoSuchAlgorithmException {
+ this(SecretKeyFactory.getInstance(KEY_FORMAT).generateSecret(
+ new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount)));
+ }
+
+ /**
+ * @param key
+ */
+ public DESEncrypter(SecretKey key) {
+ this.key = key;
+
+ configureCipher(key);
+ }
+
+ /**
+ * @return
+ */
+ public SecretKey getKey() {
+ return key;
+ }
+
+ private void configureCipher(SecretKey key) {
+ try {
+ encryptCipher = Cipher.getInstance(key.getAlgorithm());
+ decryptCipher = Cipher.getInstance(key.getAlgorithm());
+
+ AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
+
+ encryptCipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
+ decryptCipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "", ex);
+ }
+ }
+
+ /**
+ * Encrypts inputStream and write data out to outputStream
+ *
+ * @param in in , InputStream
+ * @param out out, OutputStream
+ */
+ public void encrypt(InputStream in, OutputStream out) {
+ byte[] buffer = new byte[1024];
+ int index = 0;
+
+ try {
+ out = new CipherOutputStream(out, encryptCipher);
+
+ while ((index = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, index);
+ }
+ in.close();
+ out.close();
+ } catch (java.io.IOException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "", ex);
+ }
+ }
+
+ /**
+ * decrypts inputStream
+ *
+ * @param in , InputStream
+ * @return decrypted inputStream
+ */
+ public InputStream decrypt(InputStream in) {
+ in = new CipherInputStream(in, decryptCipher);
+ return in;
+ }
+
+ /**
+ * @param in - inputStream
+ * @param out - outputStream
+ */
+ public void decrypt(InputStream in, OutputStream out) {
+ byte[] buffer = new byte[1024];
+ int index = 0;
+
+ try {
+ in = new CipherInputStream(in, decryptCipher);
+
+ while ((index = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, index);
+ }
+ out.close();
+ } catch (java.io.IOException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "", ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/internal/Activator.java b/org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/internal/Activator.java
new file mode 100644
index 00000000000..7dc6d80a742
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.security/src/org/eclipse/osee/framework/ui/security/internal/Activator.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.framework.ui.security.internal;
+
+import org.eclipse.core.runtime.Plugin;
+
+/**
+ * @author Ryan D. Brooks
+ *
+ */
+public class Activator extends Plugin {
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/.classpath b/org.eclipse.osee.framework.ui.service.control/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/.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.framework.ui.service.control/.project b/org.eclipse.osee.framework.ui.service.control/.project
new file mode 100644
index 00000000000..7da41abf787
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.service.control</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.service.control/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.service.control/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..7353765a435
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:02:26 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.service.control/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.service.control/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..14c07b0801c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/META-INF/MANIFEST.MF
@@ -0,0 +1,37 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Control Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.service.control;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.service.control.ControlPlugin
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.framework.ui.service.control,
+ org.eclipse.osee.framework.ui.service.control.actions,
+ org.eclipse.osee.framework.ui.service.control.data,
+ org.eclipse.osee.framework.ui.service.control.dialogs,
+ org.eclipse.osee.framework.ui.service.control.jobs,
+ org.eclipse.osee.framework.ui.service.control.managers,
+ org.eclipse.osee.framework.ui.service.control.managers.interfaces,
+ org.eclipse.osee.framework.ui.service.control.menu,
+ org.eclipse.osee.framework.ui.service.control.renderer,
+ org.eclipse.osee.framework.ui.service.control.view,
+ org.eclipse.osee.framework.ui.service.control.widgets,
+ org.eclipse.osee.framework.ui.service.control.wizards.launcher,
+ org.eclipse.osee.framework.ui.service.control.wizards.launcher.data,
+ org.eclipse.osee.framework.ui.service.control.wizards.launcher.pages,
+ org.eclipse.osee.framework.ui.service.control.wizards.launcher.widgets
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core,
+ net.jini,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.jini,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.swt,
+ com.jcraft.jsch
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.framework.ui.service.control/build.properties b/org.eclipse.osee.framework.ui.service.control/build.properties
new file mode 100644
index 00000000000..1689971d494
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/build.properties
@@ -0,0 +1,7 @@
+bin.includes = plugin.xml,\
+ images/,\
+ META-INF/,\
+ .
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.framework.ui.service.control/images/annotate.gif b/org.eclipse.osee.framework.ui.service.control/images/annotate.gif
new file mode 100644
index 00000000000..40afd5bfda4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/annotate.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/config.gif b/org.eclipse.osee.framework.ui.service.control/images/config.gif
new file mode 100644
index 00000000000..9ac596da3a4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/config.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/connect_folder.gif b/org.eclipse.osee.framework.ui.service.control/images/connect_folder.gif
new file mode 100644
index 00000000000..2e9b6290114
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/connect_folder.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/connected_plug.gif b/org.eclipse.osee.framework.ui.service.control/images/connected_plug.gif
new file mode 100644
index 00000000000..8493df40dfe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/connected_plug.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/connection.gif b/org.eclipse.osee.framework.ui.service.control/images/connection.gif
new file mode 100644
index 00000000000..9a2594bf50e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/connection.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/disconnected.gif b/org.eclipse.osee.framework.ui.service.control/images/disconnected.gif
new file mode 100644
index 00000000000..0994e2487fb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/disconnected.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/file.gif b/org.eclipse.osee.framework.ui.service.control/images/file.gif
new file mode 100644
index 00000000000..7ccc6a70317
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/file.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/group.gif b/org.eclipse.osee.framework.ui.service.control/images/group.gif
new file mode 100644
index 00000000000..5ba5b91c5bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/group.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/help.gif b/org.eclipse.osee.framework.ui.service.control/images/help.gif
new file mode 100644
index 00000000000..68ae93b159c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/help.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/monitor.GIF b/org.eclipse.osee.framework.ui.service.control/images/monitor.GIF
new file mode 100644
index 00000000000..1c1054979f8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/monitor.GIF
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/refresh.gif b/org.eclipse.osee.framework.ui.service.control/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/rocket.gif b/org.eclipse.osee.framework.ui.service.control/images/rocket.gif
new file mode 100644
index 00000000000..1caea3cba9a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/rocket.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/images/tools.gif b/org.eclipse.osee.framework.ui.service.control/images/tools.gif
new file mode 100644
index 00000000000..bb64374a7be
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/images/tools.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.service.control/plugin.xml b/org.eclipse.osee.framework.ui.service.control/plugin.xml
new file mode 100644
index 00000000000..f1a6fd1de73
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/plugin.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension-point id="ServiceView" name="org.eclipse.osee.framework.ui.service.control.ServiceView" schema="schema/ServiceView.exsd"/>
+ <extension-point id="ServiceLaunch" name="ServiceLaunch" schema="schema/ServiceLaunch.exsd"/>
+
+ <extension
+ id="org.eclipse.osee.framework.ui.skynet"
+ name="OSEE"
+ point="org.eclipse.ui.views">
+ <category
+ id="osee.jdk.core.category"
+ name="OSEE"
+ parentCategory="osee.jdk.core.category"/>
+ <view
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView"
+ icon="images/monitor.GIF"
+ id="org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView"
+ name="Service Manager"/>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.service.control.ServiceLaunch">
+ <Application
+ RequiresJiniGroup="true"
+ ServiceName="Local Jini Lookup Service">
+ <NotLocalToPlugin
+ PluginId="org.eclipse.osee.framework.jini">
+ </NotLocalToPlugin>
+ <EclipseApplication
+ AppArgs="-port 8080 -nohup"
+ EclipseApplicationName="org.eclipse.osee.framework.jini.JiniLookup"
+ IsLocalAllowed="true"
+ VmArgs="-Xmx512m -Dlookupcomponent -XX:MaxPermSize=256m">
+ </EclipseApplication>
+ <StandAloneApplication
+ AppArgs="8080 -nohup"
+ ExecutionCommand="-jar@oseejini.jar"
+ IsLocalAllowed="true"
+ IsRemoteAllowed="false"
+ VmArgs="-Xmx512m -Dlookupcomponent -XX:MaxPermSize=256m">
+ <ApplicationBundle
+ UnzipLocation="$USERNAME/server_launching"
+ ZipFileName="oseejinilookup.zip">
+ </ApplicationBundle>
+ </StandAloneApplication>
+ </Application>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.service.control/schema/ServiceLaunch.exsd b/org.eclipse.osee.framework.ui.service.control/schema/ServiceLaunch.exsd
new file mode 100644
index 00000000000..c0da21276e2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/schema/ServiceLaunch.exsd
@@ -0,0 +1,234 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.service.control">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.service.control" id="ServiceLaunch" name="ServiceLaunch"/>
+ </appInfo>
+ <documentation>
+ Contributions to this extension point provide information needed to launch a service.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="Application"/>
+ </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="Application">
+ <complexType>
+ <sequence>
+ <element ref="EclipseApplication" minOccurs="0" maxOccurs="1"/>
+ <element ref="StandAloneApplication" minOccurs="0" maxOccurs="1"/>
+ <element ref="NotLocalToPlugin" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="ServiceName" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="RequiresJiniGroup" type="boolean" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="EclipseApplication">
+ <complexType>
+ <attribute name="EclipseApplicationName" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="IsLocalAllowed" type="boolean" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="VmArgs" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="AppArgs" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="StandAloneApplication">
+ <complexType>
+ <sequence>
+ <element ref="Host" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="ApplicationBundle"/>
+ </sequence>
+ <attribute name="ExecutionCommand" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="IsLocalAllowed" type="boolean" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="IsRemoteAllowed" type="boolean" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="VmArgs" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="AppArgs" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="Host">
+ <complexType>
+ <attribute name="Name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="ApplicationBundle">
+ <complexType>
+ <attribute name="ZipFileName" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="UnzipLocation" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="NotLocalToPlugin">
+ <complexType>
+ <attribute name="PluginId" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.service.control/schema/ServiceView.exsd b/org.eclipse.osee.framework.ui.service.control/schema/ServiceView.exsd
new file mode 100644
index 00000000000..a4e97bc9712
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/schema/ServiceView.exsd
@@ -0,0 +1,126 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.service.control">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.service.control" id="ServiceView" name="org.eclipse.osee.framework.ui.service.control.ServiceView"/>
+ </appInfo>
+ <documentation>
+ Contributions to this extension point enable service manager to connect to a jini service and allow user to interact with it or get more detailed information. Contributors will need to provide a remote interface to define how to connect to the service and will need to provide a service renderer to provide the graphical user interface.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="ServiceHandler" minOccurs="1" maxOccurs="unbounded"/>
+ <element ref="RegisterBundle" minOccurs="0" maxOccurs="1"/>
+ </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="ServiceHandler">
+ <complexType>
+ <attribute name="ServiceInterface" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="java.rmi.Remote"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="ServiceRenderer" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="osee.service.control.renderer.ServiceRenderer"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="ServiceIcon" type="string">
+ <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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ControlPlugin.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ControlPlugin.java
new file mode 100644
index 00000000000..973692fd3df
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ControlPlugin.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.framework.ui.service.control;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Roberto E. Escobar
+ */
+public class ControlPlugin extends OseeUiActivator {
+
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.ui.service.control";
+ private static ControlPlugin pluginInstance; // The shared instance.
+
+ /**
+ * The constructor.
+ */
+ public ControlPlugin() {
+ pluginInstance = this;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static ControlPlugin getInstance() {
+ return pluginInstance;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ServiceControlImage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ServiceControlImage.java
new file mode 100644
index 00000000000..41e3727934d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/ServiceControlImage.java
@@ -0,0 +1,34 @@
+/*
+ * Created on Jun 12, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.service.control;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author b1528444
+ *
+ */
+public enum ServiceControlImage implements OseeImage {
+ MONITOR("monitor.GIF");
+
+ private final String fileName;
+
+ private ServiceControlImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(ControlPlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ @Override
+ public String getImageKey() {
+ return ControlPlugin.PLUGIN_ID + ".images." + fileName;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/HideLookupsAction.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/HideLookupsAction.java
new file mode 100644
index 00000000000..0d70728b127
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/HideLookupsAction.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.framework.ui.service.control.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HideLookupsAction extends Action {
+
+ private ManagerMain mainWindow;
+ private static String ACTION_TITLE = "non-member Lookup Servers";
+
+ public HideLookupsAction(ManagerMain mainWindow) {
+ super("", Action.AS_CHECK_BOX);
+ this.mainWindow = mainWindow;
+ setImageDescriptor(ControlPlugin.getInstance().getImageDescriptor("tools.gif"));
+ setText("Display " + ACTION_TITLE);
+ }
+
+ public void run() {
+ mainWindow.getLookupUpdater().filterLookupServers(isChecked());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/InspectLookUpServerAction.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/InspectLookUpServerAction.java
new file mode 100644
index 00000000000..1720b4c3ec1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/InspectLookUpServerAction.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.framework.ui.service.control.actions;
+
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.ui.service.control.dialogs.InspectReggieDialogHelper;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InspectLookUpServerAction implements IDoubleClickListener {
+ private ManagerMain mainWindow;
+
+ public InspectLookUpServerAction(ManagerMain mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ this.mainWindow.getLookupViewer().getViewer().addDoubleClickListener(this);
+ }
+
+ public void doubleClick(DoubleClickEvent event) {
+ ISelection sel = event.getSelection();
+ if (!sel.isEmpty()) {
+ Object object = ((StructuredSelection) sel).getFirstElement();
+ if (object instanceof ServiceRegistrar) {
+ Display.getDefault().asyncExec(new InspectReggieDialogHelper(mainWindow, (ServiceRegistrar) object));
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/KillServiceAction.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/KillServiceAction.java
new file mode 100644
index 00000000000..9b46c265080
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/KillServiceAction.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.framework.ui.service.control.actions;
+
+import java.rmi.RemoteException;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.widgets.IServiceManager;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class KillServiceAction extends Action implements ISelectionChangedListener {
+
+ private IServiceManager<TreeParent> mainWindow;
+
+ public KillServiceAction(IServiceManager<TreeParent> mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ mainWindow.getServicesViewer().getViewer().addSelectionChangedListener(this);
+
+ setText("Kill Service");
+ setToolTipText("Shutdown the selected service.");
+ setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+ ISharedImages.IMG_OBJS_ERROR_TSK));
+ }
+
+ public void run() {
+ ISelection sel = mainWindow.getServicesViewer().getViewer().getSelection();
+ if (!sel.isEmpty()) {
+ TreeObject treeObject = (TreeObject) ((StructuredSelection) sel).getFirstElement();
+ if (treeObject instanceof ServiceNode) {
+ ServiceNode serviceNode = ((ServiceNode) treeObject);
+ Object service = serviceNode.getServiceItem().service;
+ if (service instanceof IService) {
+ try {
+ ((IService) service).kill();
+ } catch (RemoteException ex) {
+ MessageDialog.openError(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Kill Service Error",
+ "Unable to kill [" + serviceNode.getName() + "] service.\n" + "Service may no longer be available.");
+ }
+ }
+ }
+ }
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ StructuredSelection selection = (StructuredSelection) event.getSelection();
+ if (!selection.isEmpty()) {
+ TreeObject selectedObject = (TreeObject) selection.getFirstElement();
+ if (selectedObject instanceof ServiceNode) {
+ ServiceNode serviceNode = ((ServiceNode) selectedObject);
+ Object service = serviceNode.getServiceItem().service;
+ if (service instanceof IService) {
+ this.setEnabled(true);
+ } else {
+ this.setEnabled(false);
+ }
+ } else {
+ this.setEnabled(false);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/LookupUpdates.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/LookupUpdates.java
new file mode 100644
index 00000000000..a2ede88c535
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/LookupUpdates.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.framework.ui.service.control.actions;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.jini.discovery.EclipseJiniClassloader;
+import org.eclipse.osee.framework.jini.discovery.IRegistrarListener;
+import org.eclipse.osee.framework.ui.service.control.managers.ReggieCache;
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import org.eclipse.osee.framework.ui.service.control.renderer.ReggieItemHandler;
+import org.eclipse.osee.framework.ui.service.control.widgets.LookupViewer;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceRegistrar;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LookupUpdates implements IRegistrarListener {
+
+ private LookupViewer viewer;
+ private ReggieCache reggieCache;
+ private Map<ServiceID, IRenderer> handlerMap;
+ private Map<ServiceID, ServiceRegistrar> filteredReggieMap;
+ private Collection<ServiceRegistrar> unfilteredList;
+
+ public LookupUpdates(ManagerMain mainWindow) {
+ super();
+ this.viewer = mainWindow.getLookupViewer();
+ this.handlerMap = new HashMap<ServiceID, IRenderer>();
+ this.reggieCache = ReggieCache.getEclipseInstance(EclipseJiniClassloader.getInstance());
+ this.filteredReggieMap = new HashMap<ServiceID, ServiceRegistrar>();
+ this.unfilteredList = reggieCache.getServiceRegistrars().values();
+ this.viewer.setRendererMap(handlerMap);
+ this.viewer.setInput(filteredReggieMap.values());
+ reggieCache.addListener(this);
+ }
+
+ public void clear() {
+ handlerMap.clear();
+ filteredReggieMap.clear();
+ }
+
+ public void filterLookupServers(boolean displayAll) {
+ this.viewer.setInput(displayAll ? unfilteredList : filteredReggieMap.values());
+ this.viewer.refresh();
+ }
+
+ public void reggieAdded(List<ServiceRegistrar> serviceRegistrars) {
+ // System.out.println("Reggie Added: ");
+ Iterator<ServiceRegistrar> iterator = serviceRegistrars.iterator();
+ while (iterator.hasNext()) {
+ ServiceRegistrar reggie = iterator.next();
+ ServiceID serviceID = reggie.getServiceID();
+ if (!handlerMap.containsKey(serviceID)) {
+ handlerMap.put(serviceID, new ReggieItemHandler(reggie));
+
+ if (ReggieItemHandler.isAllowed(reggie)) {
+ filteredReggieMap.put(serviceID, reggie);
+ }
+ }
+ }
+ viewer.refresh();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void reggieRemoved(List<ServiceRegistrar> serviceRegistrars) {
+ // System.out.println("Reggie Removed: ");
+ Set<ServiceID> cachedReggies = handlerMap.keySet();
+ Set<ServiceID> availableReggies = new HashSet<ServiceID>();
+ Iterator<ServiceRegistrar> iterator = serviceRegistrars.iterator();
+ while (iterator.hasNext()) {
+ ServiceRegistrar reggie = iterator.next();
+ availableReggies.add(reggie.getServiceID());
+ }
+
+ List discardedIds =
+ org.eclipse.osee.framework.jdk.core.util.Collections.setComplement(cachedReggies, availableReggies);
+ Iterator iterator2 = discardedIds.iterator();
+ ServiceID toProcess = null;
+ while (iterator2.hasNext()) {
+ toProcess = (ServiceID) iterator2.next();
+ handlerMap.remove(toProcess);
+
+ if (filteredReggieMap.containsKey(toProcess)) {
+ filteredReggieMap.remove(toProcess);
+ }
+ }
+ viewer.refresh();
+ }
+
+ public void reggieChanged(List<ServiceRegistrar> serviceRegistrars) {
+ // System.out.println("Reggie Changed: ");
+ Iterator<ServiceRegistrar> iterator = serviceRegistrars.iterator();
+ while (iterator.hasNext()) {
+ ServiceRegistrar reggie = iterator.next();
+ ServiceID serviceID = reggie.getServiceID();
+ if (handlerMap.containsKey(serviceID)) {
+ handlerMap.put(serviceID, new ReggieItemHandler(reggie));
+ }
+ if (ReggieItemHandler.isAllowed(reggie)) {
+ filteredReggieMap.put(serviceID, reggie);
+ }
+ }
+ viewer.refresh();
+ }
+
+ public void dispose() {
+ reggieCache.removeListener(this);
+ viewer.dispose();
+ handlerMap.clear();
+ filteredReggieMap.clear();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeDoubleClicked.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeDoubleClicked.java
new file mode 100644
index 00000000000..a650973539f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeDoubleClicked.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.framework.ui.service.control.actions;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.managers.ConnectionManager;
+import org.eclipse.osee.framework.ui.service.control.managers.ServiceConnectionException;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class NodeDoubleClicked implements IDoubleClickListener {
+
+ private ManagerMain mainWindow;
+ private ConnectionManager connectionManager;
+
+ public NodeDoubleClicked(ManagerMain mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ this.connectionManager = mainWindow.getConnectionManager();
+ this.mainWindow.getServicesViewer().getViewer().addDoubleClickListener(this);
+ }
+
+ public void doubleClick(DoubleClickEvent event) {
+ ISelection sel = event.getSelection();
+ if (!sel.isEmpty()) {
+ TreeObject treeObject = (TreeObject) ((StructuredSelection) sel).getFirstElement();
+ if (treeObject instanceof ServiceNode) {
+ ServiceNode serviceNode = (ServiceNode) treeObject;
+ if (connectionManager.isAllowedConnectionType(serviceNode.getServiceItem())) {
+ try {
+ connectionManager.attemptConnection(serviceNode);
+ } catch (ServiceConnectionException ex) {
+ MessageDialog.openError(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Unable to Connect",
+ "Unable to connect to [" + serviceNode.getName() + "] service.\n" + "Service may no longer be available.");
+ }
+ } else {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Unsupported Connection", "Connection is not allowed for [" + serviceNode.getName() + "] Service.");
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeSelected.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeSelected.java
new file mode 100644
index 00000000000..3f81ab7a084
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/NodeSelected.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.framework.ui.service.control.actions;
+
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.data.IJiniService;
+import org.eclipse.osee.framework.ui.service.control.data.ReggieMonitorServiceNode;
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import org.eclipse.osee.framework.ui.service.control.widgets.IServiceManager;
+import org.eclipse.osee.framework.ui.service.control.widgets.LookupViewer;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class NodeSelected implements ISelectionChangedListener {
+
+ private IServiceManager<TreeParent> mainWindow;
+ private FormattedText textArea;
+ private LookupViewer lookupViewer;
+
+ public NodeSelected(IServiceManager<TreeParent> mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ this.mainWindow.getServicesViewer().getViewer().addSelectionChangedListener(this);
+ this.textArea = this.mainWindow.getQuickViewer();
+ this.lookupViewer = this.mainWindow.getLookupViewer();
+ if (lookupViewer != null) {
+ lookupViewer.getViewer().addSelectionChangedListener(this);
+ }
+
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ StructuredSelection selection = (StructuredSelection) event.getSelection();
+ if (!selection.isEmpty()) {
+ Object selectedObject = selection.getFirstElement();
+ if (selectedObject instanceof TreeObject) {
+ handleTreeSelection((TreeObject) selectedObject);
+ } else if (selectedObject instanceof ServiceRegistrar) {
+ handleLookupSelection((ServiceRegistrar) selectedObject);
+ }
+ }
+ }
+
+ private void handleTreeSelection(TreeObject treeObject) {
+ if (treeObject instanceof IRenderer) {
+ ((IRenderer) treeObject).renderInComposite(textArea);
+ }
+
+ if (treeObject instanceof IJiniService) {
+ if (lookupViewer != null) {
+
+ String serviceId = null;
+ if (treeObject instanceof ReggieMonitorServiceNode) {
+ serviceId = ((ReggieMonitorServiceNode) treeObject).getSpawnedReggieServiceId();
+ } else {
+ serviceId = ((IJiniService) treeObject).getServiceID().toString();
+ }
+
+ lookupViewer.setSelection(serviceId);
+ }
+ }
+ }
+
+ private void handleLookupSelection(ServiceRegistrar serviceRegistrar) {
+ if (lookupViewer != null) {
+ IRenderer renderer = this.mainWindow.getLookupViewer().getRenderer(serviceRegistrar.getServiceID());
+ if (renderer != null) {
+ renderer.renderInComposite(textArea);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/OpenLaunchWizard.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/OpenLaunchWizard.java
new file mode 100644
index 00000000000..010ee736d1c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/OpenLaunchWizard.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.framework.ui.service.control.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchWizard;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceWizardDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenLaunchWizard extends Action {
+
+ public OpenLaunchWizard(ManagerMain mainWindow) {
+ super();
+ setImageDescriptor(ControlPlugin.getInstance().getImageDescriptor("rocket.gif"));
+ setText("Launch A Service");
+// setToolTipText("Open the service launching wizard.");
+ //TODO: Please remove next two lines upon action 4ZXCH completion.
+ this.setToolTipText("Disabled until action 4ZXCH is complete.");
+ this.setEnabled(false);
+ }
+
+ public void run() {
+ super.run();
+ ServiceLaunchWizard wizard = new ServiceLaunchWizard();
+ ServiceWizardDialog dialog = new ServiceWizardDialog(Display.getDefault().getActiveShell(), wizard);
+ dialog.setBlockOnOpen(true);
+ dialog.open();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/RefreshDataStore.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/RefreshDataStore.java
new file mode 100644
index 00000000000..f7b420d79c3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/RefreshDataStore.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.service.control.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.framework.jini.discovery.EclipseJiniClassloader;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.managers.ReggieCache;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RefreshDataStore extends Action {
+
+ private ManagerMain mainWindow;
+
+ public RefreshDataStore(ManagerMain mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ this.setText("Refresh");
+ this.setToolTipText("Refresh Lookup Servers and Services.\n" + "NOTE: Disconnects from service when connected.");
+ this.setImageDescriptor(ControlPlugin.getInstance().getImageDescriptor("refresh.gif"));
+ }
+
+ public void run() {
+ mainWindow.getLookupUpdater().clear();
+ mainWindow.getServicesManager().clear();
+ mainWindow.getConnectionManager().forceDisconnect();
+ mainWindow.getServicesViewer().refresh();
+ mainWindow.getLookupViewer().refresh();
+ mainWindow.getQuickViewer().clearTextArea();
+ ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).refresh();
+ ReggieCache.getEclipseInstance(EclipseJiniClassloader.getInstance()).refresh();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/ServiceUpdates.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/ServiceUpdates.java
new file mode 100644
index 00000000000..9550c1f4d24
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/ServiceUpdates.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.framework.ui.service.control.actions;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.jdk.core.type.IInputListener;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.widgets.IServiceManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceUpdates implements IInputListener<TreeParent> {
+
+ private IServiceManager<TreeParent> parentWindow;
+
+ @SuppressWarnings("unchecked")
+ public ServiceUpdates(IServiceManager parentWindow) {
+ this.parentWindow = parentWindow;
+ this.parentWindow.getInputManager().addInputListener(this);
+ }
+
+ public void refresh() {
+ this.parentWindow.getServicesViewer().refresh();
+ }
+
+ public void addNode(TreeParent node) {
+ refresh();
+ }
+
+ public void removeNode(TreeParent node) {
+ refresh();
+ }
+
+ public void removeAll() {
+ refresh();
+ }
+
+ public void inputChanged() {
+ refresh();
+ }
+
+ public void addNodes(Collection<TreeParent> nodes) {
+ refresh();
+ }
+
+ public void nodeChanged(TreeParent inNode) {
+ refresh();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateLookupViewerToolTip.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateLookupViewerToolTip.java
new file mode 100644
index 00000000000..fb7755cfb7b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateLookupViewerToolTip.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.framework.ui.service.control.actions;
+
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.widgets.IServiceManager;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UpdateLookupViewerToolTip implements MouseTrackListener {
+
+ private IServiceManager<TreeParent> mainWindow;
+ private StructuredViewer structuredViewer;
+
+ public UpdateLookupViewerToolTip(IServiceManager<TreeParent> mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ this.mainWindow.getLookupViewer().getViewer().getControl().addMouseTrackListener(this);
+ structuredViewer = this.mainWindow.getLookupViewer().getViewer();
+ }
+
+ public void mouseEnter(MouseEvent e) {
+ structuredViewer.getControl().setToolTipText("Displays JINI Lookup Servers");
+ }
+
+ public void mouseExit(MouseEvent e) {
+ structuredViewer.getControl().setToolTipText("Displays JINI Lookup Servers");
+ }
+
+ public void mouseHover(MouseEvent e) {
+ String toSet = "";
+ Point point = new Point(e.x, e.y);
+ TableItem tableItem = ((TableViewer) structuredViewer).getTable().getItem(point);
+ if (tableItem != null) {
+ Object elementData = tableItem.getData();
+ if (elementData instanceof ServiceRegistrar) {
+ toSet = "Double-Click to explorer services that are registered ONLY on this lookup server.";
+ structuredViewer.getControl().setToolTipText(toSet);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateToolTip.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateToolTip.java
new file mode 100644
index 00000000000..234e25aa3f4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/actions/UpdateToolTip.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.framework.ui.service.control.actions;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.data.CategoryParent;
+import org.eclipse.osee.framework.ui.service.control.data.ReggieMonitorServiceNode;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.managers.ConnectionManager;
+import org.eclipse.osee.framework.ui.service.control.widgets.IServiceManager;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UpdateToolTip implements MouseTrackListener {
+
+ private IServiceManager<TreeParent> mainWindow;
+ private TreeViewer treeViewer;
+
+ public UpdateToolTip(IServiceManager<TreeParent> mainWindow) {
+ super();
+ this.mainWindow = mainWindow;
+ this.mainWindow.getServicesViewer().getViewer().getControl().addMouseTrackListener(this);
+ treeViewer = (TreeViewer) this.mainWindow.getServicesViewer().getViewer();
+ }
+
+ private String handleCategorySelection(CategoryParent category) {
+ int numberOfItems = category.getChildren().length;
+ String name = category.getName();
+ return name + ": " + numberOfItems + (numberOfItems == 1 ? " service" : " services");
+ }
+
+ public void mouseEnter(MouseEvent e) {
+ mainWindow.getServicesViewer().getViewer().getControl().setToolTipText("Displays JINI services");
+ }
+
+ public void mouseExit(MouseEvent e) {
+ mainWindow.getServicesViewer().getViewer().getControl().setToolTipText("Displays JINI services");
+ }
+
+ public void mouseHover(MouseEvent e) {
+ String toSet = "";
+ Point point = new Point(e.x, e.y);
+ TreeItem treeItem = treeViewer.getTree().getItem(point);
+ if (treeItem != null) {
+ Object elementData = treeItem.getData();
+ if (elementData instanceof CategoryParent) {
+ toSet = handleCategorySelection((CategoryParent) elementData);
+ mainWindow.getServicesViewer().getViewer().getControl().setToolTipText(toSet);
+ } else if (elementData instanceof ReggieMonitorServiceNode) {
+ ReggieMonitorServiceNode monitorNode = (ReggieMonitorServiceNode) elementData;
+
+ toSet =
+ "Right-Click and select Kill from pop-up menu \n" + "to terminate Lookup Server.\n" + "On: " + monitorNode.getSpawnedReggieOnHost() + "\n" + "Service Id: " + monitorNode.getSpawnedReggieServiceId();
+ mainWindow.getServicesViewer().getViewer().getControl().setToolTipText(toSet);
+ } else if (elementData instanceof ServiceNode) {
+ ServiceNode serviceNode = (ServiceNode) elementData;
+ if (ConnectionManager.getInstance().isAllowedConnectionType(serviceNode.getServiceItem())) {
+ toSet = "Double-Click to interact with " + serviceNode.getName();
+ mainWindow.getServicesViewer().getViewer().getControl().setToolTipText(toSet);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/CategoryParent.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/CategoryParent.java
new file mode 100644
index 00000000000..ae67eb2ce13
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/CategoryParent.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.framework.ui.service.control.data;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CategoryParent extends TreeParent implements IRenderer {
+
+ public CategoryParent() {
+ super();
+ }
+
+ public CategoryParent(String name) {
+ super(name);
+ }
+
+ public Control renderInComposite(Composite parent) {
+ if (parent instanceof FormattedText) {
+ ((FormattedText) parent).clearTextArea();
+ }
+ return parent;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/GroupParent.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/GroupParent.java
new file mode 100644
index 00000000000..cba58984388
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/GroupParent.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.framework.ui.service.control.data;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GroupParent extends TreeParent implements IRenderer {
+
+ public GroupParent() {
+ super();
+ }
+
+ public GroupParent(String name) {
+ super(name);
+ }
+
+ public Control renderInComposite(Composite parent) {
+ if (parent instanceof FormattedText) {
+ ((FormattedText) parent).clearTextArea();
+ }
+ return parent;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/IJiniService.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/IJiniService.java
new file mode 100644
index 00000000000..2481ce3312e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/IJiniService.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.framework.ui.service.control.data;
+
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import net.jini.core.lookup.ServiceID;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IJiniService extends IRenderer {
+
+ public ServiceID getServiceID();
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ReggieMonitorServiceNode.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ReggieMonitorServiceNode.java
new file mode 100644
index 00000000000..0ca4320f9aa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ReggieMonitorServiceNode.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.framework.ui.service.control.data;
+
+import org.eclipse.osee.framework.jini.service.core.SimpleFormattedEntry;
+import org.eclipse.osee.framework.jini.utility.StartJini;
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReggieMonitorServiceNode extends ServiceNode {
+
+ private String spawnedReggieId;
+ private String spawnedReggieOnHost;
+
+ /**
+ * @param serviceID
+ * @param serviceItem
+ */
+ public ReggieMonitorServiceNode(ServiceID serviceID, ServiceItem serviceItem) {
+ super(serviceID, serviceItem);
+ spawnedReggieId = parseInfo(serviceItem, StartJini.SPAWNED_REGGIE_SERVICE_ID);
+ spawnedReggieOnHost = parseInfo(serviceItem, StartJini.SPAWNED_REGGIE_ON_HOST);
+ }
+
+ @Override
+ public void setServiceItem(ServiceItem serviceItem) {
+ super.setServiceItem(serviceItem);
+ spawnedReggieId = parseInfo(serviceItem, StartJini.SPAWNED_REGGIE_SERVICE_ID);
+ spawnedReggieOnHost = parseInfo(serviceItem, StartJini.SPAWNED_REGGIE_ON_HOST);
+ }
+
+ private String parseInfo(ServiceItem serviceItem, String key) {
+ String toReturn = "";
+ Entry[] entryArray = serviceItem.attributeSets;
+ for (Entry entry : entryArray) {
+ if (entry instanceof SimpleFormattedEntry) {
+ String name = ((SimpleFormattedEntry) entry).name;
+ String value = ((SimpleFormattedEntry) entry).value;
+ if (name != null && name.length() > 0 && value != null && value.length() > 0) {
+ if (name.equals(key)) {
+ toReturn = value;
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public String getSpawnedReggieServiceId() {
+ return spawnedReggieId;
+ }
+
+ public String getSpawnedReggieOnHost() {
+ return spawnedReggieOnHost;
+ }
+
+ public static boolean isReggieMonitor(ServiceItem serviceItem) {
+ boolean isReggieMonitor = false;
+ Entry[] entryArray = serviceItem.attributeSets;
+ for (Entry entry : entryArray) {
+ if (entry instanceof SimpleFormattedEntry) {
+ String name = ((SimpleFormattedEntry) entry).name;
+ String value = ((SimpleFormattedEntry) entry).value;
+ if (name != null && name.length() > 0 && value != null && value.length() > 0) {
+ if (name.equals("Spawned Reggie Id")) {
+ isReggieMonitor = true;
+ }
+ }
+ }
+ }
+ return isReggieMonitor;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNode.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNode.java
new file mode 100644
index 00000000000..09dd8ec60d2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNode.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.framework.ui.service.control.data;
+
+import java.util.Set;
+import java.util.TreeSet;
+
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceItem;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jini.service.core.GroupEntry;
+import org.eclipse.osee.framework.jini.service.core.PropertyEntry;
+import org.eclipse.osee.framework.ui.service.control.renderer.ServiceItemHandler;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceNode extends TreeObject implements IJiniService {
+
+ private ServiceID serviceID;
+ private ServiceItem serviceItem;
+ private ServiceItemHandler handler;
+ private boolean connected;
+ private Set<String> groups;
+
+ public ServiceNode(ServiceID serviceID, ServiceItem serviceItem) {
+ super();
+ this.serviceID = serviceID;
+ this.serviceItem = serviceItem;
+ this.handler = new ServiceItemHandler(serviceItem);
+ this.connected = false;
+ this.groups = parseGroups(serviceItem);
+ }
+
+ public void setServiceItem(ServiceItem serviceItem) {
+ this.serviceID = serviceItem.serviceID;
+ this.serviceItem = serviceItem;
+ this.handler = new ServiceItemHandler(serviceItem);
+ this.groups = parseGroups(serviceItem);
+ }
+
+ public ServiceID getServiceID() {
+ return serviceID;
+ }
+
+ public ServiceItem getServiceItem() {
+ return serviceItem;
+ }
+
+ public boolean isConnected() {
+ return connected;
+ }
+
+ public void setConnected(boolean connected) {
+ this.connected = connected;
+ }
+
+ public Control renderInComposite(Composite parent) {
+ return handler.renderInComposite(parent);
+ }
+
+ public void setGroups(Set<String> groups) {
+ this.groups = groups;
+ }
+
+ public boolean isMemberOf(String value) {
+ return groups.contains(value);
+ }
+
+ public Set<String> getGroups() {
+ return groups;
+ }
+
+ private Set<String> parseGroups(ServiceItem serviceItem) {
+ Set<String> toReturn = new TreeSet<String>();
+ Entry[] entryArray = serviceItem.attributeSets;
+ for (Entry entry : entryArray) {
+ if (entry instanceof GroupEntry) {
+ String[] groups = ((GroupEntry) entry).group;
+ for (String temp : groups) {
+ if (temp != null) {
+ temp = temp.trim();
+ }
+ if (temp == null || temp.length() == 0) {
+ toReturn.add("Public");
+ } else {
+ toReturn.add(temp);
+ }
+ }
+ } else if (entry instanceof PropertyEntry) {
+ toReturn.add( (String) ((PropertyEntry)entry).getProperty("group", "OSEE Services"));
+ }
+ }
+ if (toReturn.size() == 0) {
+ toReturn.add("Public");
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNodeFactory.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNodeFactory.java
new file mode 100644
index 00000000000..17d3bfdc07b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/data/ServiceNodeFactory.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.framework.ui.service.control.data;
+
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.lookup.entry.Name;
+import net.jini.lookup.entry.ServiceInfo;
+
+import org.eclipse.osee.framework.jini.service.core.PropertyEntry;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceNodeFactory {
+
+ private static ServiceNodeFactory instance = null;
+
+ private ServiceNodeFactory() {
+ }
+
+ public static ServiceNodeFactory getInstance() {
+ if (instance == null) {
+ instance = new ServiceNodeFactory();
+ }
+ return instance;
+ }
+
+ public ServiceNode createServiceNode(ServiceID serviceID, ServiceItem serviceItem) {
+ ServiceNode serviceNode = null;
+
+ if (ReggieMonitorServiceNode.isReggieMonitor(serviceItem)) {
+ serviceNode = new ReggieMonitorServiceNode(serviceID, serviceItem);
+ } else {
+ serviceNode = new ServiceNode(serviceID, serviceItem);
+ }
+
+ String label = getLabelBasedOnName(serviceItem);
+ if (label.equals("")) {
+ label = getLabelBasedOnServiceInfo(serviceItem);
+ }
+ serviceNode.setName(label);
+ return serviceNode;
+ }
+
+ private String getLabelBasedOnName(ServiceItem serviceItem) {
+ Entry[] entryArray = serviceItem.attributeSets;
+ for (Entry entry : entryArray) {
+ if (entry instanceof Name) {
+ return ((Name) entry).name.toString();
+ } else if (entry instanceof PropertyEntry){
+ return (String)((PropertyEntry)entry).getProperty("name", "unknown");
+ }
+ }
+ return "";
+ }
+
+ private String getLabelBasedOnServiceInfo(ServiceItem serviceItem) {
+ Entry[] entryArray = serviceItem.attributeSets;
+ for (Entry entry : entryArray) {
+ if (entry instanceof ServiceInfo) {
+ return ((ServiceInfo) entry).name.toString();
+ }
+ }
+ return serviceItem.service.getClass().getName();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialog.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialog.java
new file mode 100644
index 00000000000..c208151aeb2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialog.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.dialogs;
+
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.actions.KillServiceAction;
+import org.eclipse.osee.framework.ui.service.control.actions.NodeSelected;
+import org.eclipse.osee.framework.ui.service.control.actions.ServiceUpdates;
+import org.eclipse.osee.framework.ui.service.control.managers.ServiceTreeBuilder;
+import org.eclipse.osee.framework.ui.service.control.renderer.ReggieItemHandler;
+import org.eclipse.osee.framework.ui.service.control.widgets.IServiceManager;
+import org.eclipse.osee.framework.ui.service.control.widgets.LookupViewer;
+import org.eclipse.osee.framework.ui.service.control.widgets.ServicesViewer;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+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.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.Menu;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InspectReggieDialog extends MessageDialog implements IServiceManager<TreeParent> {
+
+ private Button okButton;
+ private Button cancelButton;
+ private boolean selectionOk;
+
+ private ServiceRegistrar reggie;
+ private ServicesViewer servicesViewer;
+
+ private FormattedText quickViewer;
+ private ServiceTreeBuilder serviceTreeBuilder;
+ private ReggieItemHandler reggieParser;
+
+ public InspectReggieDialog(Shell parentShell, ServiceRegistrar reggie, ReggieItemHandler reggieParser, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.reggie = reggie;
+ this.reggieParser = reggieParser;
+ this.serviceTreeBuilder = new ServiceTreeBuilder();
+ this.selectionOk = false;
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ super.createCustomArea(parent);
+
+ SashForm composite = new SashForm(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setOrientation(SWT.VERTICAL);
+ composite.SASH_WIDTH = 3;
+
+ reggieParser.renderInComposite(new FormattedText(composite, SWT.NONE));
+
+ SashForm sashForm = new SashForm(composite, SWT.NONE);
+ sashForm.setLayout(new GridLayout());
+ sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ sashForm.setOrientation(SWT.HORIZONTAL);
+ sashForm.SASH_WIDTH = 3;
+
+ servicesViewer = new ServicesViewer(sashForm, SWT.NONE);
+
+ quickViewer = new FormattedText(sashForm, SWT.BORDER);
+ quickViewer.getStyledText().setToolTipText("Displays Service Information");
+ quickViewer.setTextAreaBackground(SWT.COLOR_WHITE);
+
+ composite.setWeights(new int[] {3, 7});
+ sashForm.setWeights(new int[] {4, 6});
+
+ attachListeners();
+ initializeBackend();
+ return parent;
+ }
+
+ private void attachListeners() {
+ new ServiceUpdates(this);
+ new NodeSelected(this);
+ createPopup();
+ }
+
+ private void createPopup() {
+ MenuManager menuManager = new MenuManager("#PopupMenu");
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ manager.add(new KillServiceAction(InspectReggieDialog.this));
+ }
+ });
+
+ Control control = servicesViewer.getViewer().getControl();
+ Menu menu = menuManager.createContextMenu(control);
+ control.setMenu(menu);
+ }
+
+ private void initializeBackend() {
+ servicesViewer.setInput(serviceTreeBuilder.getInputManager().getInputList());
+ populateServices();
+ }
+
+ private void populateServices() {
+ Job job = new PopulateInspectReggieDialog("Searching for services on ", serviceTreeBuilder, reggie);
+ PopulateInspectReggieDialog.scheduleJob(job);
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ cancelButton = getButton(1);
+
+ okButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = true;
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = false;
+ }
+ });
+ return c;
+ }
+
+ public boolean isValid() {
+ return selectionOk;
+ }
+
+ public FormattedText getQuickViewer() {
+ return quickViewer;
+ }
+
+ public ServicesViewer getServicesViewer() {
+ return servicesViewer;
+ }
+
+ public InputManager<TreeParent> getInputManager() {
+ return serviceTreeBuilder.getInputManager();
+ }
+
+ public LookupViewer getLookupViewer() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialogHelper.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialogHelper.java
new file mode 100644
index 00000000000..5e274089edc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/InspectReggieDialogHelper.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.framework.ui.service.control.dialogs;
+
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.ui.service.control.renderer.ReggieItemHandler;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class InspectReggieDialogHelper implements Runnable {
+
+ private int result;
+ private Shell shell;
+ private ServiceRegistrar reggie;
+ private ReggieItemHandler reggieParser;
+
+ public InspectReggieDialogHelper(ManagerMain mainWindow, ServiceRegistrar reggie) {
+ this.shell = mainWindow.getShell();
+ this.reggie = reggie;
+ this.reggieParser = new ReggieItemHandler(reggie);
+ }
+
+ public void run() {
+ InspectReggieDialog dlg =
+ new InspectReggieDialog(shell, reggie, reggieParser, "Inspect Lookup Server", null, String.format(
+ "Services Registered on %s:%s", reggieParser.getHost(), reggieParser.getPort()),
+ MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+
+ result = dlg.open();
+ if (result == Window.OK) {
+ }
+ }
+
+ public int getResult() {
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/PopulateInspectReggieDialog.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/PopulateInspectReggieDialog.java
new file mode 100644
index 00000000000..01225a87708
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/dialogs/PopulateInspectReggieDialog.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.framework.ui.service.control.dialogs;
+
+import java.rmi.RemoteException;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.core.lookup.ServiceMatches;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceTemplate;
+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.MessageDialog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.managers.ServiceTreeBuilder;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PopulateInspectReggieDialog extends Job {
+
+ private ServiceRegistrar reggie;
+ private ServiceTreeBuilder serviceTreeBuilder;
+
+ public PopulateInspectReggieDialog(String title, ServiceTreeBuilder serviceTreeBuilder, ServiceRegistrar reggie) {
+ super(title);
+ this.serviceTreeBuilder = serviceTreeBuilder;
+ this.reggie = reggie;
+
+ }
+
+ public static void scheduleJob(Job job) {
+ job.setUser(true);
+ job.setPriority(Job.SHORT);
+ job.schedule();
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus status = Status.CANCEL_STATUS;
+ ClassLoader loader = this.getThread().getContextClassLoader();
+ try {
+ this.getThread().setContextClassLoader(ExportClassLoader.getInstance());
+ ServiceMatches serviceMatches = reggie.lookup(new ServiceTemplate(null, null, null), Integer.MAX_VALUE);
+ final ServiceItem[] serviceItemArray = serviceMatches.items;
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ for (ServiceItem item : serviceItemArray) {
+ serviceTreeBuilder.serviceAdded(item);
+ }
+ }
+ });
+ status = Status.OK_STATUS;
+ } catch (RemoteException ex) {
+ try {
+ displayMessage("Reggie Lookup Error", String.format("Error searching for services in [%s:%s] reggie.\n%s",
+ reggie.getLocator().getHost(), reggie.getLocator().getPort(), ControlPlugin.getStackMessages(ex)));
+ } catch (RemoteException ex1) {
+ displayMessage("Reggie Lookup Error", String.format("Unable to access selected the selected reggie.\n%s",
+ ControlPlugin.getStackMessages(ex)));
+ }
+ } finally {
+ this.getThread().setContextClassLoader(loader);
+ }
+ return status;
+ }
+
+ private void displayMessage(final String title, final String message) {
+ displayMessage(title, message, true);
+ }
+
+ private void displayMessage(final String title, final String message, final boolean isError) {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ if (isError) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message);
+ } else {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title,
+ message);
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/EclipseApplicationLaunchJob.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/EclipseApplicationLaunchJob.java
new file mode 100644
index 00000000000..8035d6f0b57
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/EclipseApplicationLaunchJob.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.framework.ui.service.control.jobs;
+
+import java.io.File;
+import java.io.IOException;
+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.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchDataPersist;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceItem;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EclipseApplicationLaunchJob extends Job {
+ private TextDisplayHelper display;
+ private ServiceLaunchingInformation serviceInfo;
+ private String javaCompiler;
+ private File latestPlugin;
+
+ public EclipseApplicationLaunchJob(String name, String javaCompiler, File latestPlugin, ServiceLaunchingInformation serviceInfo, TextDisplayHelper display) {
+ super(name);
+ this.javaCompiler = javaCompiler;
+ this.serviceInfo = serviceInfo;
+ this.display = display;
+ this.latestPlugin = latestPlugin;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.OK_STATUS;
+ try {
+ ServiceLaunchDataPersist data = ServiceLaunchDataPersist.getInstance();
+ data.saveLastServiceLaunched(serviceInfo.getServiceItem().getName());
+
+ if (latestPlugin != null) {
+ String compilerExec = javaCompiler.trim();
+ if (compilerExec.endsWith(".exe")) {
+ compilerExec = compilerExec.substring(0, compilerExec.lastIndexOf(".exe"));
+ }
+
+ String exec = serviceInfo.getServiceItem().getLocalExecution();
+ if (Lib.isWindows()) {
+ compilerExec = "\"" + compilerExec + "\"";
+ exec = exec.replaceAll("-?nohup" + ServiceItem.EXEC_SEPARATOR + "?", "");
+ }
+ exec = exec.replace("java", compilerExec);
+
+ exec = exec.replaceAll(ServiceItem.EXEC_SEPARATOR + ServiceItem.EXEC_SEPARATOR, ServiceItem.EXEC_SEPARATOR);
+
+ OseeLog.log(ControlPlugin.class, Level.INFO, "Local Launch: " + exec);
+
+ exec += ServiceItem.EXEC_SEPARATOR + "-debug";
+
+ display.addText("\n\t\t ----------- Execute -------------\n\n", SWT.BOLD, SWT.COLOR_BLACK, false);
+ String temp = exec.replaceAll(ServiceItem.EXEC_SEPARATOR, " ");
+ display.addText("\tExecuting:", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ String tag = "-application";
+ display.addText("\t" + temp.substring(temp.lastIndexOf(tag) + tag.length(), temp.length()) + "\n\n",
+ SWT.BOLD, SWT.COLOR_BLACK, false);
+
+ display.addText("\tRaw Command:", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText("\t" + exec.replaceAll(ServiceItem.EXEC_SEPARATOR, " ") + "\n\n", SWT.BOLD,
+ SWT.COLOR_BLACK, false);
+
+ File workingDir = new File(System.getProperty("user.home") + File.separator + "oseeservices");
+ workingDir.mkdirs();
+
+ ProcessBuilder runner = new ProcessBuilder();
+ runner.directory(workingDir);
+ runner.command(exec.split(ServiceItem.EXEC_SEPARATOR));
+ Process process = runner.start();
+
+ display.startProcessHandling(process);
+ } else {
+ display.addText("\n" + serviceInfo.getServiceItem().getPlugin() + " could not be found." + "\n\n",
+ SWT.NORMAL, SWT.COLOR_RED, false);
+ toReturn = Status.CANCEL_STATUS;
+ }
+ } catch (IOException ex) {
+ display.addText("\n" + ControlPlugin.getStackMessages(ex) + "\n\n", SWT.NORMAL, SWT.COLOR_RED, false);
+ toReturn = Status.CANCEL_STATUS;
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/StandAloneApplicationLaunchJob.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/StandAloneApplicationLaunchJob.java
new file mode 100644
index 00000000000..912376acaa9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/StandAloneApplicationLaunchJob.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.jobs;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+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.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchDataPersist;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceItem;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StandAloneApplicationLaunchJob extends Job {
+
+ private TextDisplayHelper display;
+ private ServiceLaunchingInformation serviceInfo;
+ private String javaCompiler;
+ private File localLocation;
+ private ProgressBar progress;
+
+ public StandAloneApplicationLaunchJob(String name, String javaCompiler, File localLocation, ServiceLaunchingInformation serviceInfo, TextDisplayHelper display, ProgressBar progress) {
+ super(name);
+ this.javaCompiler = javaCompiler;
+ this.serviceInfo = serviceInfo;
+ this.display = display;
+ this.localLocation = localLocation;
+ this.progress = progress;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.OK_STATUS;
+
+ ServiceLaunchDataPersist data = ServiceLaunchDataPersist.getInstance();
+ data.saveLastServiceLaunched(serviceInfo.getServiceItem().getName());
+
+ display.clear();
+ display.addText("\t\t ----------- Unzip -------------\n\n", SWT.BOLD, SWT.COLOR_BLACK, false);
+
+ try {
+ Bundle bundle = Platform.getBundle(serviceInfo.getServiceItem().getPlugin());
+ URL url = bundle.getEntry(serviceInfo.getServiceItem().getZipName());
+ URL resolvedURL = FileLocator.resolve(url);
+ File zipLocation = new File(resolvedURL.getFile());
+
+ display.addText("\tFrom Location: ", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText("\t" + zipLocation.getAbsolutePath() + "\n", SWT.NORMAL, SWT.COLOR_BLACK, false);
+ display.addText("\tTo Location: ", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText("\t" + localLocation.getAbsolutePath() + "\n", SWT.NORMAL, SWT.COLOR_BLACK, false);
+
+ System.out.println(localLocation);
+ unzip(zipLocation, localLocation);
+
+ } catch (Exception ex) {
+ display.addText(ControlPlugin.getStackMessages(ex) + "\n\n", SWT.NORMAL, SWT.COLOR_RED, false);
+ }
+
+ String exec = serviceInfo.getServiceItem().getStandAloneExecution();
+ String compilerExec = javaCompiler.trim();
+ if (compilerExec.endsWith(".exe")) {
+ compilerExec = compilerExec.substring(0, compilerExec.lastIndexOf(".exe"));
+ }
+
+ if (Lib.isWindows()) {
+ compilerExec = "\"" + compilerExec + "\"";
+ exec = exec.replaceAll("-?nohup" + ServiceItem.EXEC_SEPARATOR + "?", "");
+ }
+ exec = exec.replace("java", compilerExec);
+
+ display.addText("\n\t\t ----------- Execute -------------\n\n", SWT.BOLD, SWT.COLOR_BLACK, false);
+
+ display.addText("\tExecuting:", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText("\t" + exec.replaceAll(ServiceItem.EXEC_SEPARATOR, " ") + "\n", SWT.BOLD, SWT.COLOR_BLACK, false);
+
+ ProcessBuilder runner = new ProcessBuilder();
+ runner.directory(localLocation);
+ runner.command(exec.split(ServiceItem.EXEC_SEPARATOR));
+ final Process process;
+ try {
+ process = runner.start();
+
+ display.startProcessHandling(process);
+ } catch (IOException ex) {
+ display.addText(ControlPlugin.getStackMessages(ex) + "\n", SWT.NORMAL, SWT.COLOR_RED, false);
+ }
+ return toReturn;
+ }
+
+ private Map<String, String> unzip(File zipFile, File destinationDir) throws IOException {
+ int BUFFER = 2048;
+ BufferedOutputStream dest = null;
+ BufferedInputStream is = null;
+ ZipEntry entry = null;
+ Map<String, String> unzippedFiles = new HashMap<String, String>();
+ try {
+ ZipFile zipfile = new ZipFile(zipFile.getAbsolutePath());
+ StringBuffer statusBuffer = new StringBuffer();
+ final int totalEntries = zipfile.size();
+ int countEntries = 0;
+
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ progress.setMinimum(0);
+ progress.setMaximum(totalEntries);
+ progress.setSelection(0);
+ }
+ });
+
+ Enumeration<? extends ZipEntry> e = zipfile.entries();
+ while (e.hasMoreElements()) {
+ incrementProgress(1);
+ entry = e.nextElement();
+ is = new BufferedInputStream(zipfile.getInputStream(entry));
+ int count;
+ byte data[] = new byte[BUFFER];
+ File fileDir = new File(destinationDir.getAbsolutePath() + File.separator + entry.getName());
+ if (entry.isDirectory()) {
+ fileDir.mkdirs();
+ continue;
+ } else {
+ fileDir.getParentFile().mkdirs();
+ }
+
+ if (!fileDir.exists() || (fileDir.exists() && fileDir.canWrite())) {
+ FileOutputStream fos = new FileOutputStream(fileDir.getAbsolutePath());
+ dest = new BufferedOutputStream(fos, BUFFER);
+ while ((count = is.read(data, 0, BUFFER)) != -1) {
+ dest.write(data, 0, count);
+ }
+ dest.flush();
+ dest.close();
+ }
+ is.close();
+
+ statusBuffer.append("\n\t\tUNZIPPED: " + entry.getName());
+
+ if (++countEntries >= 10 || !e.hasMoreElements()) {
+ display.addText(statusBuffer.toString(), SWT.NORMAL, SWT.COLOR_BLACK, false);
+ display.updateScrollBar();
+ statusBuffer.delete(0, statusBuffer.length());
+ countEntries = 0;
+ }
+ unzippedFiles.put(fileDir.getAbsolutePath(), entry.getName());
+
+ }
+ } catch (Exception ex) {
+ String information =
+ "ZipFile: " + (zipFile != null ? zipFile.getAbsolutePath() : "NULL") + "\n" + "DestinationDir: " + (destinationDir != null ? destinationDir.getAbsolutePath() : "NULL") + "\n" + "Entry Processed: " + (entry != null ? entry.toString() : "NULL") + "\n";
+ throw new IOException(information + ex.getMessage());
+ }
+ return unzippedFiles;
+ }
+
+ private void incrementProgress(final int increment) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ int position = progress.getSelection();
+ progress.setSelection(position + increment);
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/TextDisplayHelper.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/TextDisplayHelper.java
new file mode 100644
index 00000000000..59636198ed5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/TextDisplayHelper.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.framework.ui.service.control.jobs;
+
+import org.eclipse.osee.framework.ui.plugin.io.StreamToTextArea;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TextDisplayHelper {
+
+ private FormattedText formattedText;
+ private StreamToTextArea errorGobbler;
+ private StreamToTextArea outputGobbler;
+
+ public TextDisplayHelper(FormattedText formattedText) {
+ this.formattedText = formattedText;
+ this.errorGobbler = null;
+ this.outputGobbler = null;
+ }
+
+ public void updateScrollBar() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ formattedText.getStyledText().setSelection(formattedText.getStyledText().getCharCount());
+ }
+ });
+ }
+
+ public void addText(final String toDisplay, final int format, final int color, final boolean underline) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ formattedText.addText(toDisplay, format, color, underline);
+ }
+ });
+ }
+
+ public void clear() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ formattedText.clearTextArea();
+ }
+ });
+ }
+
+ public FormattedText getFormattedText() {
+ return formattedText;
+ }
+
+ public void startProcessHandling(Process process) {
+ disposeProcessHandling();
+ errorGobbler = new StreamToTextArea(process.getErrorStream(), "\t\terr", getFormattedText());
+ errorGobbler.setName("ServiceErrorHandler");
+ errorGobbler.typeColor(SWT.COLOR_RED);
+ outputGobbler = new StreamToTextArea(process.getInputStream(), "\t\tout", getFormattedText());
+ outputGobbler.setName("ServiceOutputHandler");
+ outputGobbler.typeColor(SWT.COLOR_DARK_BLUE);
+
+ errorGobbler.start();
+ outputGobbler.start();
+ }
+
+ public void disposeProcessHandling() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (errorGobbler != null) {
+ errorGobbler.setStopped(true);
+ }
+ if (outputGobbler != null) {
+ outputGobbler.setStopped(true);
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/UploadRemoteFileJob.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/UploadRemoteFileJob.java
new file mode 100644
index 00000000000..c5af6005441
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/jobs/UploadRemoteFileJob.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.jobs;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.Map;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.pages.UploadPage.LabelEnum;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.osgi.framework.Bundle;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.SftpException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UploadRemoteFileJob extends Job {
+
+ private ServiceLaunchingInformation serviceInfo;
+ private TextDisplayHelper display;
+ private ProgressBar progress;
+ private Map<LabelEnum, Text> dataMap;
+ private boolean isUploadDirCreationAllowed;
+
+ public UploadRemoteFileJob(String name, ServiceLaunchingInformation serviceInfo, TextDisplayHelper display, ProgressBar progress, Map<LabelEnum, Text> dataMap) {
+ super(name);
+ if (serviceInfo == null) throw new IllegalArgumentException("serviceInfo can not be null");
+ if (display == null) throw new IllegalArgumentException("display can not be null");
+ if (progress == null) throw new IllegalArgumentException("progress can not be null");
+ this.serviceInfo = serviceInfo;
+ this.display = display;
+ this.progress = progress;
+ this.dataMap = dataMap;
+ this.isUploadDirCreationAllowed = false;
+ progress.setSelection(0);
+ progress.setMaximum(0);
+ progress.setMaximum(5);
+ }
+
+ private void incrementProgress(final int increment) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ int position = progress.getSelection();
+ progress.setSelection(position + increment);
+ }
+ });
+ }
+
+ private void displayInitMessage(File zipLocation) {
+ display.clear();
+ display.addText("\t\t ----------- Unzip -------------\n\n", SWT.BOLD, SWT.COLOR_BLACK, false);
+ display.addText("\tFrom Location: ", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText(String.format("\t%s\n", zipLocation.getAbsolutePath()), SWT.NORMAL, SWT.COLOR_BLACK, false);
+ display.addText("\tTo Location: ", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText(String.format("\t%s://%s\n", serviceInfo.getSelectedHost(), serviceInfo.getUnzipLocation()),
+ SWT.NORMAL, SWT.COLOR_BLACK, false);
+ }
+
+ private ChannelSftp getScpConnection() throws Exception {
+ display.addText("\n\tStarting SCP...", SWT.NORMAL, SWT.COLOR_BLACK, false);
+ ChannelSftp sftp = this.serviceInfo.getSSHConnection().getScpConnection();
+ incrementProgress(1);
+ return sftp;
+ }
+
+ private void createRemotePathOrCdIntoIt(IProgressMonitor monitor, ChannelSftp sftp) throws Exception {
+ if (monitor.isCanceled() != true) {
+ try {
+ sftp.cd(serviceInfo.getUnzipLocation());
+ } catch (SftpException ex1) {
+ this.isUploadDirCreationAllowed = false;
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ Shell shell = Display.getDefault().getActiveShell();
+ isUploadDirCreationAllowed =
+ MessageDialog.openQuestion(shell, "Scp",
+ "Unable to find remote path. Would you like to create it?");
+ }
+ });
+
+ if (isUploadDirCreationAllowed == true) {
+ try {
+ sftp.mkdir(serviceInfo.getUnzipLocation());
+ } catch (SftpException ex2) {
+ throw new Exception("Unable to create remote path.");
+ }
+ } else {
+ throw new Exception("Unable to find remote path - user selected not to create it.");
+ }
+
+ } finally {
+ incrementProgress(1);
+ }
+ }
+ }
+
+ private void uploadFile(IProgressMonitor monitor, ChannelSftp sftp, File fileToUpload) throws Exception {
+ if (monitor.isCanceled() != true) {
+ display.addText(String.format("\n\tUploading [%s]", fileToUpload.getAbsolutePath()), SWT.NORMAL,
+ SWT.COLOR_BLACK, false);
+ InputStream input = null;
+ OutputStream output = null;
+ try {
+ input = new FileInputStream(fileToUpload);
+ output = sftp.put(fileToUpload.getName());
+ byte[] buffer = new byte[1024];
+ int count = -1;
+ while ((count = input.read(buffer)) != -1) {
+ output.write(buffer, 0, count);
+ }
+ display.addText(String.format("\n\tTransferred [%s] bytes", fileToUpload.length()), SWT.NORMAL,
+ SWT.COLOR_BLACK, false);
+ } catch (SftpException ex1) {
+ throw new Exception("Error uploading file.");
+ } finally {
+ incrementProgress(1);
+ if (input != null) {
+ input.close();
+ }
+ if (output != null) {
+ output.close();
+ }
+ }
+ }
+ }
+
+ private void unzipRemoteFiles(IProgressMonitor monitor) throws Exception {
+ if (monitor.isCanceled() != true) {
+ String toExec =
+ String.format("cd %s\nunzip -o %s", serviceInfo.getUnzipLocation(),
+ serviceInfo.getServiceItem().getZipName());
+
+ display.addText("\n\tUnzip Cmd: ", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ display.addText("\t" + toExec.split("\n")[1] + "\n", SWT.NORMAL, SWT.COLOR_BLACK, false);
+
+ String output = this.serviceInfo.getSSHConnection().executeCommandList(toExec.split("\n"));
+ display.addText("\n\t" + output + "\n", SWT.NORMAL, SWT.COLOR_BLACK, false);
+ incrementProgress(1);
+ }
+ }
+
+ public File getFile(Bundle bundle, String path) throws FileNotFoundException, IOException {
+ URL url = bundle.getEntry(path);
+ if (url == null) {
+ throw new FileNotFoundException("Could not locate the file " + path);
+ }
+ try {
+ url = FileLocator.toFileURL(url);
+ File file = new File(url.getFile());
+ return file;
+ } catch (Throwable e) {
+ throw new IOException("Invalid URL format for the URL " + url.toString(), e);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.OK_STATUS;
+ ChannelSftp sftp = null;
+ try {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ serviceInfo.setUnzipLocation(dataMap.get(LabelEnum.Host_Upload_Location).getText());
+ }
+ });
+ Bundle bundle = Platform.getBundle(serviceInfo.getServiceItem().getPlugin());
+ File zipLocation = getFile(bundle, serviceInfo.getServiceItem().getZipName());
+
+ displayInitMessage(zipLocation);
+
+ sftp = getScpConnection();
+
+ createRemotePathOrCdIntoIt(monitor, sftp);
+
+ uploadFile(monitor, sftp, zipLocation);
+
+ unzipRemoteFiles(monitor);
+
+ } catch (Exception ex) {
+ display.addText(String.format("\n\t%s\n\n", ex.getLocalizedMessage()), SWT.NORMAL, SWT.COLOR_RED, false);
+ toReturn = new Status(Status.ERROR, ControlPlugin.PLUGIN_PREFERENCE_SCOPE, "Error during upload.", ex);
+ } finally {
+ incrementProgress(5);
+ if (sftp != null) {
+ sftp.exit();
+ sftp.disconnect();
+ }
+ }
+
+ // incrementProgress(1);
+ // if (true != createDestinationFolder()) {
+ // incrementProgress(4);
+ // toReturn = Status.CANCEL_STATUS;
+ // } else {
+
+ // if (true != toReturn.equals(Status.OK_STATUS)) {
+ // PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ // public void run() {
+ // MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Upload Error",
+ // "Upload of files to remote host failed.");
+ // }
+ // });
+ // }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ConnectionManager.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ConnectionManager.java
new file mode 100644
index 00000000000..f297619a197
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ConnectionManager.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.managers;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import net.jini.core.lookup.ServiceItem;
+import org.eclipse.osee.framework.jini.service.interfaces.IService;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.managers.interfaces.IConnectionListener;
+import org.eclipse.osee.framework.ui.service.control.renderer.IServiceRenderer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConnectionManager {
+
+ private static ConnectionManager instance = null;
+ private boolean connected;
+ private ServiceNode connectedTo;
+ private Class<?> connectionType;
+ private Collection<IConnectionListener> listeners;
+ private Map<Class<?>, IServiceRenderer> allowedConnectionTypes;
+
+ private ConnectionManager() {
+ super();
+ this.connected = false;
+ this.connectedTo = null;
+ this.connectionType = null;
+ this.listeners = Collections.synchronizedList(new ArrayList<IConnectionListener>());
+ this.allowedConnectionTypes = new HashMap<Class<?>, IServiceRenderer>();
+ }
+
+ public static ConnectionManager getInstance() {
+ if (instance == null) {
+ instance = new ConnectionManager();
+ }
+ return instance;
+ }
+
+ public void addConnectionListener(IConnectionListener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ listener.onConnectionChanged(connectedTo, connected);
+ }
+
+ public void removeConnectionListener(IConnectionListener listener) {
+ synchronized (listeners) {
+ listeners.remove(listener);
+ }
+ }
+
+ private boolean isAbleToConnect(Object service) {
+ boolean returnVal = true;
+ if (service instanceof IService) {
+ try {
+ ((IService) service).getServiceID();
+ } catch (RemoteException e) {
+ returnVal = false;
+ }
+ }
+ return returnVal;
+ }
+
+ private void notifyConnected(ServiceNode serviceNode, boolean connected) {
+ synchronized (listeners) {
+ for (IConnectionListener listener : listeners) {
+ listener.onConnectionChanged(serviceNode, connected);
+ }
+ }
+ }
+
+ public void forceDisconnect() {
+ if (connectedTo != null) {
+ if (connected) {
+ handleDisconnect();
+ }
+ }
+ }
+
+ public void attemptConnection(ServiceNode serviceNode) throws ServiceConnectionException {
+ if (connectedTo != null) {
+ ServiceNode temp = connectedTo;
+ if (connected) {
+ handleDisconnect();
+ }
+
+ if (!temp.getServiceID().equals(serviceNode.getServiceID())) {
+ handleConnect(serviceNode);
+ }
+ } else {
+ handleConnect(serviceNode);
+ }
+ }
+
+ private void handleConnect(ServiceNode node) throws ServiceConnectionException {
+ if (isAbleToConnect(node.getServiceItem().service)) {
+ connected = true;
+ connectedTo = node;
+ this.connectionType = getConnectionType(node.getServiceItem());
+ connectedTo.setConnected(connected);
+ notifyConnected(connectedTo, connected);
+ } else {
+ throw new ServiceConnectionException();
+ }
+ }
+
+ private void handleDisconnect() {
+ connected = false;
+ allowedConnectionTypes.get(connectionType).disconnect();
+ connectedTo.setConnected(connected);
+ notifyConnected(connectedTo, connected);
+ connectionType = null;
+ connectedTo = null;
+ }
+
+ public boolean isConnected() {
+ return connected;
+ }
+
+ public Class<?> getConnectionType() {
+ return connectionType;
+ }
+
+ public Class<?> getConnectionType(ServiceItem serviceItem) {
+ for (Class<?> connectionType : allowedConnectionTypes.keySet()) {
+ if (connectionType.isInstance(serviceItem.service)) {
+ return connectionType;
+ }
+ }
+ return null;
+ }
+
+ public IServiceRenderer getRenderer() {
+ return allowedConnectionTypes.get(connectionType);
+ }
+
+ public boolean isAllowedConnectionType(ServiceItem serviceItem) {
+ for (Class<?> connectionType : allowedConnectionTypes.keySet()) {
+ if (connectionType.isInstance(serviceItem.service)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void registerForConnection(Class<?> serviceType, IServiceRenderer renderer) {
+ allowedConnectionTypes.put(serviceType, renderer);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ContributionManager.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ContributionManager.java
new file mode 100644
index 00000000000..e64a72bd4fc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ContributionManager.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.managers;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+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.runtime.FileLocator;
+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.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ContributionManager extends ClassLoader {
+
+ private static ContributionManager instance = null;
+ private Map<String, String> extensionRegistryMap;
+ private Map<String, Class<?>> classesloaded; // <String, Class>
+ private List<String> bundleList; // <String>
+ private Map<String, String> interfaceToRendererMap;
+ private Map<String, String> interfaceToIconMap;
+
+ private ContributionManager() {
+ super();
+ extensionRegistryMap = new HashMap<String, String>();
+ interfaceToIconMap = new HashMap<String, String>();
+ loadFactoryBundleMap();
+ }
+
+ public static ContributionManager getInstance() {
+ if (instance == null) {
+ instance = new ContributionManager();
+ }
+ return instance;
+ }
+
+ // @SuppressWarnings("unchecked")
+ private void loadFactoryBundleMap() {
+ interfaceToRendererMap = new HashMap<String, String>();
+ classesloaded = new HashMap<String, Class<?>>();
+ bundleList = new ArrayList<String>();
+
+ String registrationStatus = ContributionManager.class.getName() + " Registration: [ \n";
+ if (extensionRegistryMap.size() != 0) return;
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ if (extensionRegistry != null) {
+ IExtensionPoint point =
+ extensionRegistry.getExtensionPoint("org.eclipse.osee.framework.ui.service.control.ServiceView");
+ if (point != null) {
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String renderer = null;
+ String imagePath = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("ServiceHandler")) {
+ bundleName = el.getContributor().getName();
+ classname = el.getAttribute("ServiceInterface");
+
+ renderer = el.getAttribute("ServiceRenderer");
+ imagePath = el.getAttribute("ServiceIcon");
+
+ if (classname != null && bundleName != null) {
+ bundleList.add(el.getContributor().getName());
+ extensionRegistryMap.put(classname, bundleName);
+
+ registrationStatus += "[" + bundleName + "] [" + classname + "] ";
+
+ if (renderer != null) {
+ extensionRegistryMap.put(renderer, bundleName);
+ interfaceToRendererMap.put(classname, renderer);
+ registrationStatus += "[" + renderer + "]";
+ }
+
+ if (imagePath != null) {
+ extensionRegistryMap.put(imagePath, bundleName);
+ interfaceToIconMap.put(classname, imagePath);
+
+ registrationStatus += " [" + imagePath + "]\n";
+ } else {
+ registrationStatus += "\n";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ OseeLog.log(ControlPlugin.class, Level.INFO, registrationStatus + "]\n");
+ }
+
+ public Map<String, String> getInterfaceToRendererMap() {
+ return interfaceToRendererMap;
+ }
+
+ public Map<String, String> getInterfaceToIconMap() {
+ return interfaceToIconMap;
+ }
+
+ protected synchronized Class<?> findClass(String classname) throws ClassNotFoundException {
+ Class<?> loadedclass = classesloaded.get(classname);
+ if (loadedclass != null) {
+ return loadedclass;
+ }
+
+ if (extensionRegistryMap.containsKey(classname)) {
+ String bundleName = (String) extensionRegistryMap.get(classname);
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> foundclass = bundle.loadClass(classname);
+ if (foundclass != null) {
+ classesloaded.put(classname, foundclass);
+ return foundclass;
+ }
+ } catch (Exception ex) {
+ }
+ }
+
+ for (int i = 0; i < bundleList.size(); i++) {
+ try {
+ Class<?> foundclass = Platform.getBundle((String) bundleList.get(i)).loadClass(classname);
+ if (foundclass != null) {
+ String bundleName = bundleList.remove(i);
+ bundleList.add(0, bundleName);
+ }
+ if (!classesloaded.containsKey(classname)) {
+ classesloaded.put(classname, foundclass);
+ }
+ return foundclass;
+
+ } catch (Exception ex) {
+ // Do nothing
+ }
+ }
+ return super.findClass(classname);
+ }
+
+ public ImageDescriptor getImageDescriptor(String imageFilePath) {
+ if (imageFilePath != null && extensionRegistryMap.containsKey(imageFilePath)) {
+ String bundleName = (String) extensionRegistryMap.get(imageFilePath);
+ Bundle bundle = Platform.getBundle(bundleName);
+ if (bundle != null) {
+
+ // look for the image (this will check both the plug-in and fragment folders
+ URL fullPathString = FileLocator.find(bundle, new Path(imageFilePath), null);
+ if (fullPathString == null) {
+ try {
+ fullPathString = new URL(imageFilePath);
+ } catch (MalformedURLException e) {
+ return null;
+ }
+ }
+
+ if (fullPathString != null) {
+ return ImageDescriptor.createFromURL(fullPathString);
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ReggieCache.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ReggieCache.java
new file mode 100644
index 00000000000..daf77174380
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ReggieCache.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.managers;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import net.jini.core.discovery.LookupLocator;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceMatches;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceTemplate;
+import net.jini.discovery.DiscoveryEvent;
+import net.jini.discovery.DiscoveryListener;
+import net.jini.discovery.LookupDiscoveryManager;
+import net.jini.lookup.ServiceDiscoveryManager;
+import org.eclipse.osee.framework.jini.discovery.IRegistrarListener;
+import org.eclipse.osee.framework.jini.discovery.RelaxedSecurity;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+
+public class ReggieCache implements DiscoveryListener {
+
+ private static ReggieCache theInstance = null;
+
+ private Set<IRegistrarListener> registrarListeners;
+ private Set<String> locators;
+ private Map<ServiceID, ServiceRegistrar> serviceRegistrars;
+ private LookupDiscoveryManager lookupDiscoveryManager;
+ private ServiceDiscoveryManager serviceDiscoveryManager;
+
+ // private ClassLoader loader;
+
+ private ReggieCache(ClassLoader loader) {
+ // this.loader = loader;
+ registrarListeners = Collections.synchronizedSet(new HashSet<IRegistrarListener>());
+ serviceRegistrars = Collections.synchronizedMap(new HashMap<ServiceID, ServiceRegistrar>());
+ locators = Collections.synchronizedSet(new HashSet<String>());
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ SecurityManager securityManager = System.getSecurityManager();
+ try {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ System.setSecurityManager(new RelaxedSecurity());
+ registerWithJINI();
+ } finally {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ System.setSecurityManager(securityManager);
+ }
+ }
+
+ private void registerWithJINI() {
+ try {
+ LookupLocator[] locator = null;
+ lookupDiscoveryManager = new LookupDiscoveryManager(null, locator, this);
+ serviceDiscoveryManager = new ServiceDiscoveryManager(lookupDiscoveryManager, null);
+ } catch (RemoteException anRE) {
+ System.err.println("Failed to setup cache - exiting");
+ anRE.printStackTrace(System.err);
+ System.exit(-1);
+ } catch (IOException anIOE) {
+ System.err.println("Failed to setup managers - exiting");
+ anIOE.printStackTrace(System.err);
+ System.exit(-1);
+ }
+ }
+
+ public static ReggieCache getEclipseInstance(ClassLoader loader) {
+ if (theInstance == null) {
+ if (loader == null) {
+ loader = ReggieCache.class.getClassLoader();
+ }
+ theInstance = new ReggieCache(loader);
+ }
+ return theInstance;
+ }
+
+ private class LookupList extends Thread {
+
+ private String[] lookupLocations;
+
+ public LookupList(String[] lookupLocations) {
+ this.lookupLocations = lookupLocations;
+ }
+
+ public void run() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ SecurityManager securityManager = System.getSecurityManager();
+ try {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ System.setSecurityManager(new RelaxedSecurity());
+ if (lookupLocations != null) {
+ LookupLocator[] locators = new LookupLocator[lookupLocations.length];
+ for (int i = 0; i < locators.length; i++) {
+ locators[i] = new LookupLocator(lookupLocations[i]);
+ }
+ List<LookupLocator> locatorList = new ArrayList<LookupLocator>();
+ for (int i = 0; i < locators.length; i++) {
+ try {
+ ServiceRegistrar reg = locators[i].getRegistrar(5000);
+ if (reg != null) {
+ locatorList.add(locators[i]);
+ }
+ } catch (Exception ex) {
+ System.out.println();
+ }
+ }
+ lookupDiscoveryManager.addLocators(locatorList.toArray(new LookupLocator[locatorList.size()]));
+ }
+ } catch (MalformedURLException ex) {
+ OseeLog.log(ControlPlugin.class, Level.SEVERE, ex.getMessage(), ex);
+ } finally {
+ Thread.currentThread().setContextClassLoader(loader);
+ System.setSecurityManager(securityManager);
+ }
+ }
+ }
+
+ public void addListener(IRegistrarListener listener) {
+ synchronized (registrarListeners) {
+ registrarListeners.add(listener);
+ // Notify the listener of all existing services that match
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieAdded(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+
+ public void removeListener(IRegistrarListener listener) {
+ synchronized (registrarListeners) {
+ registrarListeners.remove(listener);
+ }
+ }
+
+ public void discovered(DiscoveryEvent arg0) {
+ synchronized (serviceRegistrars) {
+ ServiceRegistrar[] reggies = arg0.getRegistrars();
+ for (int i = 0; i < reggies.length; i++) {
+
+ Object last = serviceRegistrars.put(reggies[i].getServiceID(), reggies[i]);
+
+ synchronized (registrarListeners) {
+ if (last == null) {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieAdded(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ } else {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieChanged(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public void discarded(DiscoveryEvent arg0) {
+ synchronized (serviceRegistrars) {
+ ServiceRegistrar[] reggies = arg0.getRegistrars();
+ for (int i = 0; i < reggies.length; i++) {
+
+ Object removedObject = serviceRegistrars.remove(reggies[i].getServiceID());
+ if (removedObject == null) {
+ synchronized (registrarListeners) {
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieRemoved(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public Map<ServiceID, ServiceRegistrar> getServiceRegistrars() {
+ return serviceRegistrars;
+ }
+
+ public Set<String> getAvailableJiniGroups() {
+ Set<String> toReturn = new TreeSet<String>();
+ synchronized (serviceRegistrars) {
+ for (ServiceRegistrar reggie : getServiceRegistrars().values()) {
+ try {
+ String[] groups = reggie.getGroups();
+ for (String group : groups) {
+ toReturn.add(group);
+ }
+ } catch (RemoteException ex) {
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public ServiceMatches lookupAllServices(ServiceRegistrar reggie) throws RemoteException {
+ ServiceMatches matches = null;
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ ServiceTemplate st = new ServiceTemplate(null, null, null);
+ matches = reggie.lookup(st, Integer.MAX_VALUE);
+ } finally {
+ Thread.currentThread().setContextClassLoader(loader);
+ }
+ return matches;
+ }
+
+ public void addLookupLocators(String[] lookups) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ for (int i = 0; i < lookups.length; i++) {
+ locators.add(lookups[i]);
+ }
+
+ Thread thread = new LookupList(lookups);
+ thread.start();
+ } finally {
+ Thread.currentThread().setContextClassLoader(classLoader);
+ }
+ }
+
+ public void terminate() {
+ lookupDiscoveryManager.terminate();
+ serviceDiscoveryManager.terminate();
+ }
+
+ public void refresh() {
+ lookupDiscoveryManager.removeDiscoveryListener(this);
+ serviceRegistrars.clear();
+ Iterator<IRegistrarListener> it = registrarListeners.iterator();
+ while (it.hasNext()) {
+ IRegistrarListener reggie = it.next();
+ reggie.reggieRemoved(new ArrayList<ServiceRegistrar>(serviceRegistrars.values()));
+ }
+
+ registerWithJINI();
+
+ String[] locatorsArray = new String[locators.size()];
+ int index = 0;
+ Iterator<String> iterator = locators.iterator();
+ while (iterator.hasNext()) {
+ locatorsArray[index++] = iterator.next();
+ }
+ addLookupLocators(locatorsArray);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceConnectionException.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceConnectionException.java
new file mode 100644
index 00000000000..2504d2ca3d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceConnectionException.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.framework.ui.service.control.managers;
+
+public class ServiceConnectionException extends Exception {
+
+ private static final long serialVersionUID = 7224215322283659226L;
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceTreeBuilder.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceTreeBuilder.java
new file mode 100644
index 00000000000..87a5f7b00cd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServiceTreeBuilder.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.framework.ui.service.control.managers;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceItem;
+
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.data.CategoryParent;
+import org.eclipse.osee.framework.ui.service.control.data.GroupParent;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNodeFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceTreeBuilder {
+
+ private static ServiceNodeFactory serviceNodeFactory = null;
+ private InputManager<TreeParent> inputManager;
+ private Map<ServiceID, ServiceItem> map;
+
+ public ServiceTreeBuilder() {
+ serviceNodeFactory = ServiceNodeFactory.getInstance();
+ this.inputManager = new InputManager<TreeParent>();
+ this.map = Collections.synchronizedMap(new HashMap<ServiceID, ServiceItem>());
+ }
+
+ private Set<GroupParent> findGroup(ServiceNode serviceNode) {
+ Set<GroupParent> toReturn = new HashSet<GroupParent>();
+ List<TreeParent> nodes = inputManager.getInputList();
+ for (TreeParent node : nodes) {
+ if (node instanceof GroupParent) {
+ GroupParent groupParent = ((GroupParent) node);
+ if (serviceNode.isMemberOf(groupParent.getName())) {
+ if (!toReturn.contains(groupParent)) {
+ toReturn.add(groupParent);
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private CategoryParent findCategory(GroupParent groupParent, ServiceNode serviceNode) {
+ if (groupParent != null && groupParent.hasChildren()) {
+ TreeObject[] children = groupParent.getChildren();
+ for (TreeObject child : children) {
+ if (child instanceof CategoryParent) {
+ CategoryParent categoryParent = ((CategoryParent) child);
+ if (categoryParent.getName().equals(serviceNode.getName())) {
+ return categoryParent;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private Pair<CategoryParent, ServiceNode> findService(GroupParent groupParent, ServiceNode searchNode) {
+ CategoryParent category = findCategory(groupParent, searchNode);
+ if (category != null && category.hasChildren()) {
+ TreeObject[] children = category.getChildren();
+ for (TreeObject child : children) {
+ if (child instanceof ServiceNode) {
+ ServiceNode serviceNode = ((ServiceNode) child);
+ if (serviceNode.getServiceID().equals(searchNode.getServiceID())) {
+ return new Pair<CategoryParent, ServiceNode>(category, serviceNode);
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public void serviceAdded(ServiceItem serviceItem) {
+ ServiceID serviceId = serviceItem.serviceID;
+ // System.out.println("Service Added: " + serviceId);
+ synchronized (map) {
+ if (!map.containsKey(serviceId)) {
+ map.put(serviceId, serviceItem);
+
+ ServiceNode serviceNode = serviceNodeFactory.createServiceNode(serviceId, serviceItem);
+ Set<GroupParent> groupParents = findGroup(serviceNode);
+ Set<String> existingGroupNames = new TreeSet<String>();
+
+ if (groupParents.size() > 0) {
+ for (GroupParent groupParent : groupParents) {
+ if (!existingGroupNames.contains(groupParent.getName())) {
+ existingGroupNames.add(groupParent.getName());
+ }
+// CategoryParent categoryParent = findCategory(groupParent, serviceNode);
+// if (categoryParent == null) {
+// categoryParent = new CategoryParent(serviceNode.getName());
+// groupParent.addChild(categoryParent);
+// categoryParent.addChild(serviceNode);
+// } else {
+ Pair<CategoryParent, ServiceNode> node = findService(groupParent, serviceNode);
+ if (node != null) {
+ node.getValue().setServiceItem(serviceItem);
+ } else {
+ groupParent.addChild(serviceNode);
+ }
+// }
+ }
+ inputManager.inputChanged();
+ }
+
+ for (String group : serviceNode.getGroups()) {
+ if (!existingGroupNames.contains(group)) {
+ GroupParent groupParent = new GroupParent(group);
+// CategoryParent categoryParent = new CategoryParent(serviceNode.getName());
+ groupParent.addChild(serviceNode);
+// categoryParent.addChild(serviceNode);
+ inputManager.addNode(groupParent);
+ }
+ }
+ }
+ }
+ }
+
+ public void serviceChanged(ServiceItem serviceItem) {
+ synchronized (map) {
+ boolean handleAsServiceAddedEvent = false;
+ ServiceID serviceId = serviceItem.serviceID;
+ // System.out.println("Service Changed: " + serviceId);
+ if (map.containsKey(serviceId)) {
+ map.put(serviceId, serviceItem);
+
+ ServiceNode serviceNode = serviceNodeFactory.createServiceNode(serviceId, serviceItem);
+ Set<GroupParent> groupParents = findGroup(serviceNode);
+ Set<String> existingGroupNames = new TreeSet<String>();
+ if (groupParents.size() > 0) {
+ for (GroupParent groupParent : groupParents) {
+ if (!existingGroupNames.contains(groupParent.getName())) {
+ existingGroupNames.add(groupParent.getName());
+ }
+ Pair<CategoryParent, ServiceNode> node = findService(groupParent, serviceNode);
+ if (node != null) {
+ node.getValue().setServiceItem(serviceItem);
+ inputManager.inputChanged();
+ } else {
+ handleAsServiceAddedEvent = true;
+ }
+ }
+ }
+
+ for (String group : serviceNode.getGroups()) {
+ if (!existingGroupNames.contains(group)) {
+ handleAsServiceAddedEvent = true;
+ break;
+ }
+ }
+ } else {
+ handleAsServiceAddedEvent = true;
+ }
+
+ if (handleAsServiceAddedEvent) {
+ serviceAdded(serviceItem);
+ }
+ }
+ }
+
+ public void serviceRemoved(ServiceItem serviceItem) {
+ synchronized (map) {
+ ServiceID serviceId = serviceItem.serviceID;
+ // System.out.println("Service Removed: " + serviceId);
+ if (map.containsKey(serviceId)) {
+ ServiceNode serviceNode = serviceNodeFactory.createServiceNode(serviceId, serviceItem);
+ Set<GroupParent> groupParents = findGroup(serviceNode);
+ if (groupParents.size() > 0) {
+ for (GroupParent groupParent : groupParents) {
+ Pair<CategoryParent, ServiceNode> node = findService(groupParent, serviceNode);
+ if (node != null) {
+ node.getKey().removeChild(node.getValue());
+ if (!node.getKey().hasChildren()) {
+ groupParent.removeChild(node.getKey());
+ }
+ inputManager.inputChanged();
+ }
+ if (!groupParent.hasChildren()) {
+ inputManager.removeNode(groupParent);
+ }
+ }
+ }
+ map.remove(serviceId);
+ }
+ }
+ }
+
+ public void clear() {
+ synchronized (map) {
+ map.clear();
+ inputManager.removeAll();
+ }
+ }
+
+ public InputManager<TreeParent> getInputManager() {
+ return inputManager;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServicesManager.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServicesManager.java
new file mode 100644
index 00000000000..8b5a2f2399a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/ServicesManager.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.framework.ui.service.control.managers;
+
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.jini.discovery.EclipseJiniClassloader;
+import org.eclipse.osee.framework.jini.discovery.IServiceLookupListener;
+import org.eclipse.osee.framework.jini.discovery.ServiceDataStore;
+import net.jini.core.lookup.ServiceItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServicesManager implements IServiceLookupListener {
+
+ private static ServicesManager instance = null;
+ private ServiceTreeBuilder servicesTreeBuilder;
+
+ private ServicesManager() {
+ super();
+ servicesTreeBuilder = new ServiceTreeBuilder();
+ ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).addListener(this);
+ }
+
+ public static ServicesManager getInstance() {
+ if (instance == null) {
+ instance = new ServicesManager();
+ }
+ return instance;
+ }
+
+ public void serviceAdded(ServiceItem serviceItem) {
+ servicesTreeBuilder.serviceAdded(serviceItem);
+ }
+
+ public void serviceChanged(ServiceItem serviceItem) {
+ servicesTreeBuilder.serviceChanged(serviceItem);
+ }
+
+ public void serviceRemoved(ServiceItem serviceItem) {
+ servicesTreeBuilder.serviceRemoved(serviceItem);
+ }
+
+ public void clear() {
+ servicesTreeBuilder.clear();
+ }
+
+ public InputManager<TreeParent> getInputManager() {
+ return servicesTreeBuilder.getInputManager();
+ }
+
+ public void dispose() {
+ ServiceDataStore.getEclipseInstance(EclipseJiniClassloader.getInstance()).removeListener(this);
+ servicesTreeBuilder.clear();
+ servicesTreeBuilder.getInputManager().dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/interfaces/IConnectionListener.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/interfaces/IConnectionListener.java
new file mode 100644
index 00000000000..f221336b6e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/managers/interfaces/IConnectionListener.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.framework.ui.service.control.managers.interfaces;
+
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IConnectionListener {
+
+ public void onConnectionChanged(ServiceNode serviceNode, boolean connected);
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/MenuBuilder.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/MenuBuilder.java
new file mode 100644
index 00000000000..983405609e3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/MenuBuilder.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.framework.ui.service.control.menu;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MenuBuilder {
+
+ private ViewPart view;
+ private List<Action> actions;
+
+ public MenuBuilder(ViewPart view) {
+ this.view = view;
+ this.actions = new ArrayList<Action>();
+ }
+
+ public void addAction(Action action) {
+ actions.add(action);
+ }
+
+ public void createPopUpMenu(Viewer viewer) {
+ MenuManager menuManager = new MenuManager("#PopupMenu");
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ MenuBuilder.this.fillMenu(manager);
+ }
+ });
+
+ registerPopup(menuManager, viewer);
+ }
+
+ private void registerPopup(MenuManager menuManager, Viewer viewer) {
+ Control control = viewer.getControl();
+ Menu menu = menuManager.createContextMenu(control);
+ control.setMenu(menu);
+
+ view.getSite().registerContextMenu(menuManager, viewer);
+ }
+
+ public void contributeToActionBars() {
+ IActionBars bars = view.getViewSite().getActionBars();
+ fillMenu(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillMenu(IMenuManager manager) {
+ int count = 0;
+ for (Action action : actions) {
+ count++;
+ manager.add(action);
+ if (count == 2) {
+ manager.add(new Separator());
+ }
+ }
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ int count = 0;
+ for (Action action : actions) {
+ count++;
+ manager.add(action);
+ if (count == 2) {
+ break;
+ }
+ }
+ manager.add(new Separator());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/ServiceManagerMenuItem.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/ServiceManagerMenuItem.java
new file mode 100644
index 00000000000..03689707c49
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/menu/ServiceManagerMenuItem.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.framework.ui.service.control.menu;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceManagerMenuItem implements IWorkbenchWindowActionDelegate {
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ }
+
+ public void run(IAction action) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ page.showView(ServiceManagerView.VIEW_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(ControlPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IRenderer.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IRenderer.java
new file mode 100644
index 00000000000..a9f2f591444
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IRenderer.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.framework.ui.service.control.renderer;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IRenderer {
+
+ public Control renderInComposite(Composite parent);
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IServiceRenderer.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IServiceRenderer.java
new file mode 100644
index 00000000000..48ce38f130b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/IServiceRenderer.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.framework.ui.service.control.renderer;
+
+import net.jini.core.lookup.ServiceItem;
+
+public interface IServiceRenderer extends IRenderer {
+
+ public abstract void refresh();
+
+ public abstract void setService(ServiceItem serviceItem);
+
+ public abstract void disconnect();
+
+ public abstract void dispose();
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ReggieItemHandler.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ReggieItemHandler.java
new file mode 100644
index 00000000000..3aa529be24a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ReggieItemHandler.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.renderer;
+
+import java.rmi.RemoteException;
+import java.util.Set;
+import java.util.TreeSet;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReggieItemHandler implements IRenderer {
+
+ private static final Set<String> allowedGroups = new TreeSet<String>();;
+
+ static {
+ populteAllowedGroups();
+ }
+
+ private int port;
+ private String host;
+ private ServiceID id;
+ private String className;
+ private String[] groups;
+
+ public ReggieItemHandler(ServiceRegistrar reggie) {
+ super();
+ parseReggie(reggie);
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public String[] getGroups() {
+ return groups;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public ServiceID getId() {
+ return id;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public Control renderInComposite(Composite parent) {
+ if (parent instanceof FormattedText) {
+ FormattedText textArea = (FormattedText) parent;
+ textArea.clearTextArea();
+ textArea.addText("\t" + "Service" + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+ textArea.addText(className + "\n", SWT.NORMAL, SWT.COLOR_BLACK);
+
+ textArea.addText("\t" + "Host" + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+ textArea.addText(host + "\n", SWT.NORMAL, SWT.COLOR_BLACK);
+
+ textArea.addText("\t" + "Port" + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+ textArea.addText(port + "\n", SWT.NORMAL, SWT.COLOR_BLACK);
+
+ textArea.addText("\t" + "Groups" + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+
+ String groupsToDisplay = "";
+ if (groups != null) {
+ for (int index = 0; index < groups.length; index++) {
+ String group = groups[index];
+ groupsToDisplay += (group != null && group.length() > 0 ? group : "Public");
+ if (index + 1 < groups.length) {
+ groupsToDisplay += ", ";
+ }
+ }
+ }
+
+ textArea.addText("{" + groupsToDisplay + "}\n", SWT.BOLD, SWT.COLOR_DARK_GREEN);
+ textArea.addText("\t" + "ID" + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+ textArea.addText(id + "\n", SWT.NORMAL, SWT.COLOR_BLACK);
+ }
+ return parent;
+ }
+
+ private void parseReggie(ServiceRegistrar reggie) {
+ try {
+ className = reggie.getLocator().getClass().getName();
+ port = reggie.getLocator().getPort();
+ host = reggie.getLocator().getHost();
+ id = reggie.getServiceID();
+ groups = reggie.getGroups();
+ } catch (RemoteException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private static void populteAllowedGroups() {
+ allowedGroups.clear();
+ String[] tempGroups = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+ for (String toStore : tempGroups) {
+ if (!allowedGroups.contains(toStore)) {
+ allowedGroups.add(toStore);
+ }
+ }
+ }
+
+ public static boolean isAllowed(ServiceRegistrar reggie) {
+ try {
+ return isAllowed(reggie.getGroups());
+ } catch (RemoteException ex) {
+ ex.printStackTrace();
+ }
+ return false;
+ }
+
+ private static boolean isAllowed(String[] groups) {
+ if (groups != null) {
+ for (String toCheck : groups) {
+ if (allowedGroups.contains(toCheck)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static Set<String> getAllowedGroups() {
+ return allowedGroups;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ServiceItemHandler.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ServiceItemHandler.java
new file mode 100644
index 00000000000..8d2e2f10908
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/renderer/ServiceItemHandler.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.renderer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.lookup.entry.Comment;
+import net.jini.lookup.entry.Name;
+import net.jini.lookup.entry.ServiceInfo;
+
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jini.service.core.FormmatedEntry;
+import org.eclipse.osee.framework.jini.service.core.GroupEntry;
+import org.eclipse.osee.framework.jini.service.core.OwnerEntry;
+import org.eclipse.osee.framework.jini.service.core.PropertyEntry;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceItemHandler implements IRenderer {
+
+ List<ItemRecord> serviceRecords;
+
+ public ServiceItemHandler(ServiceItem serviceItem) {
+ serviceRecords = new ArrayList<ItemRecord>();
+ parseServiceItem(serviceItem);
+ }
+
+ private class ItemEntry {
+ String value;
+ private int style;
+ private int color;
+
+ public ItemEntry(String value, int style, int color) {
+ this.value = value;
+ this.style = style;
+ this.color = color;
+ }
+
+ public int getColor() {
+ return color;
+ }
+
+ public int getStyle() {
+ return style;
+ }
+
+ public String getValue() {
+ return value;
+ }
+ }
+
+ private class ItemRecord {
+ private ItemEntry label;
+ private ItemEntry data;
+
+ public ItemRecord(String label, String data) {
+ this(label, SWT.BOLD, SWT.COLOR_DARK_BLUE, data, SWT.NORMAL, SWT.COLOR_BLACK);
+ }
+
+ public ItemRecord(String label, int labelStyle, int labelColor, String data) {
+ this(label, labelStyle, labelColor, data, SWT.NORMAL, SWT.COLOR_BLACK);
+ }
+
+ public ItemRecord(String label, String data, int dataStyle, int dataColor) {
+ this(label, SWT.BOLD, SWT.COLOR_DARK_BLUE, data, dataStyle, dataColor);
+ }
+
+ public ItemRecord(String label, int labelStyle, int labelColor, String data, int dataStyle, int dataColor) {
+ this.label = new ItemEntry(label, labelStyle, labelColor);
+ this.data = new ItemEntry(data, dataStyle, dataColor);
+ }
+
+ public String getData() {
+ return data.getValue();
+ }
+
+ public String getLabel() {
+ return label.getValue();
+ }
+
+ public int getDataColor() {
+ return data.getColor();
+ }
+
+ public int getDataStyle() {
+ return data.getStyle();
+ }
+
+ public int getLabelColor() {
+ return label.getColor();
+ }
+
+ public int getLabelStyle() {
+ return label.getStyle();
+ }
+ }
+
+ public void parseServiceItem(ServiceItem serviceItem) {
+ serviceRecords.clear();
+ if (serviceItem != null) {
+ String additionalInfo = "";
+ Entry[] entries = serviceItem.attributeSets;
+ for (int i = 0; i < entries.length; i++) {
+ if (entries[i] instanceof Name) {
+ serviceRecords.add(new ItemRecord("Name", ((Name) entries[i]).name));
+ } else if (entries[i] instanceof Comment) {
+ serviceRecords.add(new ItemRecord("Comment", ((Comment) entries[i]).comment));
+ } else if (entries[i] instanceof OwnerEntry) {
+ serviceRecords.add(new ItemRecord("Owner", ((OwnerEntry) entries[i]).getOwner()));
+ } else if (entries[i] instanceof GroupEntry) {
+ String[] groups = ((GroupEntry) entries[i]).group;
+ serviceRecords.add(new ItemRecord("Group",
+ "{ " + ((groups == null) ? "" : StringFormat.commaSeparate(groups)) + " }", SWT.BOLD,
+ SWT.COLOR_DARK_GREEN));
+ } else if (entries[i] instanceof FormmatedEntry) {
+ additionalInfo += ((FormmatedEntry) entries[i]).getFormmatedString();
+ } else if (entries[i] instanceof ServiceInfo) {
+ ServiceInfo info = (ServiceInfo) entries[i];
+ serviceRecords.add(new ItemRecord("Info Name", info.name));
+ serviceRecords.add(new ItemRecord("Manufacturer", info.manufacturer));
+ serviceRecords.add(new ItemRecord("Model", info.model));
+ serviceRecords.add(new ItemRecord("Version", info.version));
+ serviceRecords.add(new ItemRecord("SerialNumber", info.serialNumber));
+ } else if (entries[i] instanceof PropertyEntry){
+ PropertyEntry info = (PropertyEntry) entries[i];
+ String[] keys = info.map.keySet().toArray(new String[info.map.keySet().size()]);
+ Arrays.sort(keys);
+ for(String key:keys){
+ serviceRecords.add(new ItemRecord(key, info.map.get(key).toString()));
+ }
+ }
+ }
+
+ if (entries.length == 0) {
+ String label = "";
+ try {
+ label = serviceItem.service.getClass().getName();
+ } catch (Exception ex) {
+ label = "nullpointerexception";
+ }
+ serviceRecords.add(new ItemRecord("Name", label));
+ }
+ if (!additionalInfo.equals("")) {
+ serviceRecords.add(new ItemRecord("Additional Info", additionalInfo));
+ }
+ serviceRecords.add(new ItemRecord("ID", serviceItem.serviceID.toString()));
+ }
+ }
+
+ public List<ItemRecord> getData() {
+ return this.serviceRecords;
+ }
+
+ public Control renderInComposite(Composite parent) {
+ if (parent instanceof FormattedText) {
+ FormattedText textArea = (FormattedText) parent;
+ textArea.clearTextArea();
+
+ for (ItemRecord record : serviceRecords) {
+ String label = record.getLabel();
+ String data = record.getData();
+ if (label.equals("Additional Info")) {
+ String[] temp = data.split("\n");
+
+ textArea.addText("\t" + label + ": \n", record.getLabelStyle(), record.getLabelColor());
+
+ for (String innerRecord : temp) {
+ String[] array = innerRecord.split(":", 2);
+ for (int i = 0; i < array.length; i++) {
+ textArea.addText("\t\t\t" + array[i] + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+ if (i + 1 < array.length) {
+ textArea.addText(" " + array[++i] + "\n", SWT.NORMAL, SWT.COLOR_BLACK);
+ }
+ }
+ }
+ } else {
+ textArea.addText("\t" + label + ": ", record.getLabelStyle(), record.getLabelColor());
+ textArea.addText(data + "\n", record.getDataStyle(), record.getDataColor());
+ }
+ }
+ }
+ return parent;
+ }
+
+ public String toString() {
+ String toReturn = "";
+ for (ItemRecord record : serviceRecords) {
+ String label = record.getLabel();
+ String data = record.getData();
+ if (label.equals("Additional Info")) {
+ String[] temp = data.split("\n");
+ toReturn += label + ": \n";
+ for (String innerRecord : temp) {
+ toReturn += "\t" + innerRecord + "\n";
+ }
+ } else {
+ toReturn += label + ": " + data + "\n";
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/view/ServiceManagerView.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/view/ServiceManagerView.java
new file mode 100644
index 00000000000..2718d97accb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/view/ServiceManagerView.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.framework.ui.service.control.view;
+
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.actions.HideLookupsAction;
+import org.eclipse.osee.framework.ui.service.control.actions.KillServiceAction;
+import org.eclipse.osee.framework.ui.service.control.actions.OpenLaunchWizard;
+import org.eclipse.osee.framework.ui.service.control.actions.RefreshDataStore;
+import org.eclipse.osee.framework.ui.service.control.menu.MenuBuilder;
+import org.eclipse.osee.framework.ui.service.control.widgets.ManagerMain;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+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.ui.part.ViewPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceManagerView extends ViewPart implements IActionable {
+
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView";
+ private ManagerMain managerMain;
+
+ public void createPartControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ managerMain = new ManagerMain(composite, SWT.NONE);
+
+ createServicesViewerPopUp();
+ createLookupViewerPopUp();
+
+ this.setContentDescription("Jini Groups { " + StringFormat.commaSeparate(JiniLookupGroupConfig.getOseeJiniServiceGroups()) + " }");
+
+ OseeAts.addBugToViewToolbar(this, this, ControlPlugin.getInstance(), VIEW_ID, "Service Manager");
+ }
+
+ private void createServicesViewerPopUp() {
+ MenuBuilder menuBuilder = new MenuBuilder(this);
+ menuBuilder.addAction(new OpenLaunchWizard(managerMain));
+ menuBuilder.addAction(new RefreshDataStore(managerMain));
+ menuBuilder.addAction(new KillServiceAction(managerMain));
+ menuBuilder.contributeToActionBars();
+ menuBuilder.createPopUpMenu(managerMain.getServicesViewer().getViewer());
+ }
+
+ private void createLookupViewerPopUp() {
+ MenuBuilder menuBuilder = new MenuBuilder(this);
+ menuBuilder.addAction(new HideLookupsAction(managerMain));
+ menuBuilder.addAction(new RefreshDataStore(managerMain));
+ menuBuilder.createPopUpMenu(managerMain.getLookupViewer().getViewer());
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (managerMain != null) {
+ managerMain.dispose();
+ }
+
+ }
+
+ @Override
+ public void setFocus() {
+ managerMain.setFocus();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/IServiceManager.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/IServiceManager.java
new file mode 100644
index 00000000000..510ba94bc0f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/IServiceManager.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.framework.ui.service.control.widgets;
+
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServiceManager<T> {
+
+ public FormattedText getQuickViewer();
+
+ public ServicesViewer getServicesViewer();
+
+ public LookupViewer getLookupViewer();
+
+ public InputManager<T> getInputManager();
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/LookupViewer.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/LookupViewer.java
new file mode 100644
index 00000000000..8ce96faf595
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/LookupViewer.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.framework.ui.service.control.widgets;
+
+import java.rmi.RemoteException;
+import java.util.Collection;
+import java.util.Map;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import org.eclipse.osee.framework.ui.service.control.renderer.ReggieItemHandler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LookupViewer extends Composite {
+
+ private static final Image LOOK_UP_IMAGE = ControlPlugin.getInstance().getImage("connection.gif");
+ private static final Image DISCONNECTED_IMAGE = ControlPlugin.getInstance().getImage("disconnected.gif");
+
+ private StructuredViewer viewer;
+ private Map<ServiceID, IRenderer> handlerMap;
+
+ public LookupViewer(Composite parent, int style) {
+ super(parent, style);
+ createControl();
+ }
+
+ private void createControl() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ viewer = new TableViewer(this, SWT.SINGLE | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ viewer.setLabelProvider(new ListLabelProvider());
+ viewer.setContentProvider(new ArrayContentProvider());
+ viewer.setSorter(new ViewerSorter());
+ viewer.setInput(new String[0]);
+ }
+
+ public void refresh() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ viewer.refresh();
+ }
+ });
+ }
+
+ public void setSelection(final String serviceId) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ Table table = ((TableViewer) viewer).getTable();
+ TableItem[] items = table.getItems();
+ for (TableItem item : items) {
+ Object object = item.getData();
+ if (object instanceof ServiceRegistrar) {
+ if (((ServiceRegistrar) object).getServiceID().toString().equals(serviceId)) {
+ table.setSelection(new TableItem[] {item});
+ return;
+ }
+ }
+ }
+ }
+ });
+ }
+
+ public StructuredViewer getViewer() {
+ return viewer;
+ }
+
+ public void setInput(Collection<?> input) {
+ viewer.setInput(input);
+ }
+
+ public void setRendererMap(Map<ServiceID, IRenderer> map) {
+ this.handlerMap = map;
+ }
+
+ public IRenderer getRenderer(ServiceID serviceId) {
+ if (handlerMap != null) {
+ return handlerMap.get(serviceId);
+ } else {
+ return null;
+ }
+ }
+
+ private class ListLabelProvider extends LabelProvider {
+
+ public Image getImage(Object element) {
+ if (element instanceof ServiceRegistrar) {
+ if (ReggieItemHandler.isAllowed((ServiceRegistrar) element)) {
+ return LOOK_UP_IMAGE;
+ } else {
+ return DISCONNECTED_IMAGE;
+ }
+ }
+ return null;
+ }
+
+ public String getText(Object element) {
+ if (element instanceof ServiceRegistrar) {
+ ServiceRegistrar reggie = (ServiceRegistrar) element;
+ try {
+ return " Jini Lookup: " + reggie.getLocator().getHost() + " : " + reggie.getLocator().getPort();
+ } catch (RemoteException ex) {
+ ex.printStackTrace();
+ return "Jini Lookup: " + "UNABLE TO LOCATE";
+ }
+ }
+ return "";
+ }
+ }
+
+ public void dispose() {
+ viewer.getControl().dispose();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ManagerMain.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ManagerMain.java
new file mode 100644
index 00000000000..5beb9687443
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ManagerMain.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.framework.ui.service.control.widgets;
+
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.actions.InspectLookUpServerAction;
+import org.eclipse.osee.framework.ui.service.control.actions.LookupUpdates;
+import org.eclipse.osee.framework.ui.service.control.actions.NodeDoubleClicked;
+import org.eclipse.osee.framework.ui.service.control.actions.NodeSelected;
+import org.eclipse.osee.framework.ui.service.control.actions.OpenLaunchWizard;
+import org.eclipse.osee.framework.ui.service.control.actions.ServiceUpdates;
+import org.eclipse.osee.framework.ui.service.control.actions.UpdateLookupViewerToolTip;
+import org.eclipse.osee.framework.ui.service.control.actions.UpdateToolTip;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.managers.ConnectionManager;
+import org.eclipse.osee.framework.ui.service.control.managers.ContributionManager;
+import org.eclipse.osee.framework.ui.service.control.managers.ServicesManager;
+import org.eclipse.osee.framework.ui.service.control.managers.interfaces.IConnectionListener;
+import org.eclipse.osee.framework.ui.service.control.renderer.IRenderer;
+import org.eclipse.osee.framework.ui.service.control.renderer.IServiceRenderer;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.osee.framework.ui.swt.StackedViewer;
+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.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ManagerMain extends Composite implements IConnectionListener, IServiceManager<TreeParent> {
+
+ private ServicesViewer servicesViewer;
+ private LookupViewer lookupViewer;
+ private FormattedText textArea;
+ private StackedViewer stackedViewer;
+ private ServicesManager servicesManager;
+ private LookupUpdates lookupUpdater;
+ private SashForm serviceAreaSash;
+ private SashForm mainSashForm;
+ private SashForm serviceAndDetailsSash;
+ private ConnectionManager connectionManager;
+ private ContributionManager contributionManager;
+
+ public ManagerMain(Composite parent, int style) {
+ super(parent, style);
+ create();
+ initializeBackend();
+ registerActions();
+ }
+
+ private void create() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ mainSashForm = new SashForm(this, SWT.NONE);
+ mainSashForm.setLayout(new GridLayout());
+ mainSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainSashForm.setOrientation(SWT.HORIZONTAL);
+ mainSashForm.SASH_WIDTH = 3;
+
+ createServiceAndDetailAreaSash(mainSashForm);
+ createConnectionArea(mainSashForm);
+
+ mainSashForm.setWeights(new int[] {4, 5});
+ }
+
+ private void createServiceAndDetailAreaSash(Composite parent) {
+ serviceAndDetailsSash = new SashForm(parent, SWT.NONE);
+ serviceAndDetailsSash.setLayout(new GridLayout());
+ serviceAndDetailsSash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ serviceAndDetailsSash.setOrientation(SWT.VERTICAL);
+ serviceAndDetailsSash.SASH_WIDTH = 1;
+
+ createServiceAreaSash(serviceAndDetailsSash);
+
+ textArea = new FormattedText(serviceAndDetailsSash, SWT.BORDER);
+ textArea.getStyledText().setToolTipText("Displays Service Information");
+ textArea.setTextAreaBackground(SWT.COLOR_WHITE);
+
+ serviceAndDetailsSash.setWeights(new int[] {4, 5});
+ }
+
+ private void createServiceAreaSash(Composite parent) {
+ serviceAreaSash = new SashForm(parent, SWT.NONE);
+ serviceAreaSash.setLayout(new GridLayout());
+ serviceAreaSash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ serviceAreaSash.setOrientation(SWT.HORIZONTAL);
+ serviceAreaSash.SASH_WIDTH = 1;
+
+ createLookupViewerArea(serviceAreaSash);
+ createServicesArea(serviceAreaSash);
+
+ serviceAreaSash.setWeights(new int[] {4, 7});
+ }
+
+ private void createServicesArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Services");
+ servicesViewer = new ServicesViewer(composite, SWT.NONE);
+ }
+
+ private void createLookupViewerArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Available Lookup Servers");
+ lookupViewer = new LookupViewer(composite, SWT.NONE);
+ }
+
+ private void createConnectionArea(Composite parent) {
+ stackedViewer = new StackedViewer(parent, SWT.BORDER);
+ }
+
+ public ServicesViewer getServicesViewer() {
+ return servicesViewer;
+ }
+
+ public FormattedText getQuickViewer() {
+ return textArea;
+ }
+
+ public ServicesManager getServicesManager() {
+ return servicesManager;
+ }
+
+ public InputManager<TreeParent> getInputManager() {
+ return servicesManager.getInputManager();
+ }
+
+ public ConnectionManager getConnectionManager() {
+ return connectionManager;
+ }
+
+ public LookupViewer getLookupViewer() {
+ return lookupViewer;
+ }
+
+ public LookupUpdates getLookupUpdater() {
+ return lookupUpdater;
+ }
+
+ private void registerActions() {
+ new OpenLaunchWizard(this);
+ new ServiceUpdates(this);
+ new NodeSelected(this);
+ new NodeDoubleClicked(this);
+ new UpdateToolTip(this);
+ new InspectLookUpServerAction(this);
+ new UpdateLookupViewerToolTip(this);
+ lookupUpdater = new LookupUpdates(this);
+ }
+
+ public void dispose() {
+ lookupUpdater.dispose();
+ servicesViewer.dispose();
+ stackedViewer.dispose();
+ lookupViewer.dispose();
+ textArea.dispose();
+ connectionManager.removeConnectionListener(this);
+ servicesManager.dispose();
+ super.dispose();
+ }
+
+ private void initializeBackend() {
+ connectionManager = ConnectionManager.getInstance();
+ contributionManager = ContributionManager.getInstance();
+
+ registerServiceRenderers();
+ registerServiceIcons();
+
+ servicesManager = ServicesManager.getInstance();
+ servicesViewer.setInput(servicesManager.getInputManager().getInputList());
+
+ connectionManager.addConnectionListener(this);
+ }
+
+ private void registerServiceRenderers() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+
+ Map<String, String> interfaceToRenderer = contributionManager.getInterfaceToRendererMap();
+ for (String interfaceName : interfaceToRenderer.keySet()) {
+ String serviceRenderer = interfaceToRenderer.get(interfaceName);
+ try {
+ Class<?> interfaceClass = contributionManager.loadClass(interfaceName);
+ Class<?> rendererClass = contributionManager.loadClass(serviceRenderer);
+ try {
+ Object renderer = rendererClass.newInstance();
+ connectionManager.registerForConnection(interfaceClass, (IServiceRenderer) renderer);
+ Control control = ((IRenderer) renderer).renderInComposite(stackedViewer.getStackComposite());
+ stackedViewer.addControl(interfaceClass.getCanonicalName(), control);
+ } catch (InstantiationException ex) {
+ OseeLog.log(ControlPlugin.class, Level.WARNING, "registerServiceRenderers: Instantiation Error.\n",
+ ex);
+ } catch (IllegalAccessException ex) {
+ OseeLog.log(ControlPlugin.class, Level.WARNING, "registerServiceRenderers: IllegalAccess Error.\n",
+ ex);
+ }
+ } catch (ClassNotFoundException ex) {
+ OseeLog.log(ControlPlugin.class, Level.WARNING, "registerServiceRenderers: ClassNotFound Error.\n", ex);
+ }
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(loader);
+ }
+ }
+
+ private void registerServiceIcons() {
+ Map<String, String> interfaceToIcon = contributionManager.getInterfaceToIconMap();
+ for (String interfaceName : interfaceToIcon.keySet()) {
+
+ String iconPath = interfaceToIcon.get(interfaceName);
+ ImageDescriptor imageDescriptor = contributionManager.getImageDescriptor(iconPath);
+ if (imageDescriptor != null) {
+ try {
+ Class<?> interfaceClass = contributionManager.loadClass(interfaceName);
+ servicesViewer.registerImage(interfaceClass, imageDescriptor);
+ } catch (ClassNotFoundException ex) {
+ OseeLog.log(ControlPlugin.class, Level.WARNING, "Error in registerServiceIcons.\n", ex);
+ }
+ }
+ }
+ }
+
+ public void onConnectionChanged(ServiceNode serviceNode, boolean connected) {
+ if (connected) {
+ serviceAreaSash.setOrientation(SWT.VERTICAL);
+ Class<?> key = connectionManager.getConnectionType();
+ IServiceRenderer renderer = connectionManager.getRenderer();
+ renderer.setService(serviceNode.getServiceItem());
+ stackedViewer.setCurrentControl(key.getCanonicalName());
+ stackedViewer.setVisible(true);
+ serviceAndDetailsSash.setWeights(new int[] {7, 3});
+ renderer.refresh();
+ } else {
+ serviceAreaSash.setOrientation(SWT.HORIZONTAL);
+ stackedViewer.setCurrentControl(StackedViewer.DEFAULT_CONTROL);
+ stackedViewer.setVisible(false);
+ serviceAndDetailsSash.setWeights(new int[] {4, 5});
+ }
+ this.mainSashForm.layout();
+ this.serviceAndDetailsSash.layout();
+ getServicesViewer().refresh();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesQuickViewer.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesQuickViewer.java
new file mode 100644
index 00000000000..60f06f3c08a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesQuickViewer.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.framework.ui.service.control.widgets;
+
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServicesQuickViewer extends Composite {
+
+ private FormattedText textArea;
+
+ public ServicesQuickViewer(Composite parent, int style) {
+ super(parent, style);
+ create();
+ }
+
+ private void create() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ textArea = new FormattedText(this, SWT.NONE);
+ textArea.setTextAreaBackground(SWT.COLOR_WHITE);
+ }
+
+ public FormattedText getTextArea() {
+ return textArea;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesViewer.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesViewer.java
new file mode 100644
index 00000000000..d1c326642cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/widgets/ServicesViewer.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import net.jini.core.lookup.ServiceItem;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.data.CategoryParent;
+import org.eclipse.osee.framework.ui.service.control.data.GroupParent;
+import org.eclipse.osee.framework.ui.service.control.data.ServiceNode;
+import org.eclipse.osee.framework.ui.service.control.managers.ConnectionManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServicesViewer extends Composite {
+
+ private static final Image CONFIG_IMAGE = ControlPlugin.getInstance().getImage("config.gif");
+ private static final Image FOLDER_IMAGE =
+ PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+ private static final Image GROUP_IMAGE = ControlPlugin.getInstance().getImage("group.gif");
+ private static final Image CONNECT_FOLDER_IMAGE = ControlPlugin.getInstance().getImage("connect_folder.gif");
+ private static final Image CONNECTED_IMAGE = ControlPlugin.getInstance().getImage("connected_plug.gif");
+
+ private StructuredViewer viewer;
+ private Map<Class<?>, Image> serviceIconMap;
+
+ public ServicesViewer(Composite parent, int style) {
+ super(parent, style);
+ create();
+ serviceIconMap = new HashMap<Class<?>, Image>();
+ }
+
+ private void create() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ createTreeArea(this);
+ }
+
+ private void createTreeArea(Composite parent) {
+ viewer = new TreeViewer(parent, SWT.SINGLE | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ viewer.setContentProvider(new TreeContentProvider());
+ viewer.setLabelProvider(new TreeLabelProvider());
+ viewer.setSorter(new ViewerSorter());
+ viewer.setInput(new ArrayList<String>());
+ viewer.getControl().setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ }
+
+ private class TreeLabelProvider extends LabelProvider {
+
+ public Image getImage(Object obj) {
+ Image toReturn = null;
+ if (obj instanceof GroupParent) {
+ toReturn = GROUP_IMAGE;
+ } else if (obj instanceof CategoryParent) {
+ toReturn = FOLDER_IMAGE;
+ CategoryParent categoryParent = (CategoryParent) obj;
+ if (categoryParent.hasChildren()) {
+ Object child = categoryParent.getChildren()[0];
+ if (child instanceof ServiceNode) {
+ ServiceNode serviceNode = (ServiceNode) child;
+ if (ConnectionManager.getInstance().isAllowedConnectionType(serviceNode.getServiceItem())) {
+ toReturn = CONNECT_FOLDER_IMAGE;
+ }
+ }
+ }
+ } else if (obj instanceof ServiceNode) {
+ ServiceNode node = ((ServiceNode) obj);
+ if (node.isConnected()) {
+ toReturn = CONNECTED_IMAGE;
+ } else {
+ toReturn = CONFIG_IMAGE;
+ ServiceItem serviceItem = node.getServiceItem();
+ for (Class<?> classType : serviceIconMap.keySet()) {
+ if (classType.isInstance(serviceItem.service)) {
+ Image image = serviceIconMap.get(classType);
+ if (image != null) {
+ toReturn = image;
+ }
+ break;
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ }
+
+ private class TreeContentProvider implements ITreeContentProvider {
+
+ public void dispose() {
+ }
+
+ 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];
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement != null && inputElement instanceof Collection) {
+ Collection<?> elementArray = (Collection<?>) inputElement;
+ return elementArray.toArray();
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ if (element != null && element instanceof TreeObject) {
+ TreeObject child = (TreeObject) element;
+ return child.getParent();
+ }
+ return new Object();
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof TreeParent) {
+ TreeParent parent = (TreeParent) element;
+ return parent.hasChildren();
+ }
+ return false;
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ public boolean setFocus() {
+ return this.viewer.getControl().setFocus();
+ }
+
+ public StructuredViewer getViewer() {
+ return viewer;
+ }
+
+ public void setInput(List<TreeParent> input) {
+ viewer.setInput(input);
+ }
+
+ public void refresh() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (viewer != null && !viewer.getControl().isDisposed()) {
+ viewer.refresh();
+ }
+ }
+ });
+ }
+
+ public void dispose() {
+ viewer.getControl().dispose();
+ super.dispose();
+ }
+
+ public void registerImage(Class<?> serviceType, ImageDescriptor icon) {
+ serviceIconMap.put(serviceType, icon.createImage());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/MultiTextDialog.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/MultiTextDialog.java
new file mode 100644
index 00000000000..74fa34383dd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/MultiTextDialog.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.framework.ui.service.control.wizards.launcher;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class MultiTextDialog extends Dialog {
+
+ private String title;
+ private String message;
+
+ private Text[] texts;
+ private String[] prompt;
+ private boolean[] displayable;
+ private String[] value;
+
+ public MultiTextDialog(Shell parentShell, String dialogTitle, String dialogMessage, String[] prompt, boolean[] displayable) {
+ super(parentShell);
+ this.title = dialogTitle;
+ this.message = dialogMessage;
+ this.prompt = prompt != null ? prompt : new String[0];
+ this.displayable = displayable != null ? displayable : new boolean[0];
+ this.value = null;
+ }
+
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == IDialogConstants.OK_ID) {
+ value = new String[prompt.length];
+ for (int i = 0; i < prompt.length; i++) {
+ value[i] = texts[i].getText();
+ }
+ } else {
+ value = null;
+ }
+ super.buttonPressed(buttonId);
+ }
+
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ if (title != null) {
+ shell.setText(title);
+ }
+ }
+
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ for (int i = 0; i < prompt.length; i++) {
+ if (value != null && value[i] != null) {
+ texts[i].setFocus();
+ texts[i].setText(value[i]);
+ texts[i].selectAll();
+ }
+ }
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ if (message != null) {
+ Label label = new Label(composite, SWT.NONE);
+ label.setText(message);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
+ data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
+ label.setLayoutData(data);
+ label.setFont(parent.getFont());
+ }
+ texts = new Text[prompt.length];
+ for (int i = 0; i < prompt.length; i++) {
+ if (displayable[i] != false) {
+ texts[i] = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ } else {
+ texts[i] = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
+ }
+ texts[i].setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ }
+ applyDialogFont(composite);
+ return composite;
+ }
+
+ public String[] getValue() {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/SecureRemoteAccess.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/SecureRemoteAccess.java
new file mode 100644
index 00000000000..862d7e3f068
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/SecureRemoteAccess.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.service.control.wizards.launcher;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import com.jcraft.jsch.Channel;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
+import com.jcraft.jsch.UIKeyboardInteractive;
+import com.jcraft.jsch.UserInfo;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SecureRemoteAccess {
+ private Session session;
+
+ private SecureRemoteAccess(String host, String user) throws Exception {
+ JSch.setLogger(new LogForwarding());
+ try {
+ JSch jsch = new JSch();
+ jsch.setKnownHosts(host);
+ session = jsch.getSession(user, host);
+ session.setUserInfo(new PromptUserInfo());
+ session.connect(30000);
+ } catch (JSchException ex) {
+ throw new Exception("Error connecting to server.", ex);
+ }
+ }
+
+ public String executeCommandList(String[] commands) throws Exception {
+ Channel channel = null;
+ CharBackedInputStream inputStream = new CharBackedInputStream();
+ OutputStream outputStream = new ByteArrayOutputStream();
+ try {
+ channel = session.openChannel("shell");
+ channel.setInputStream(inputStream);
+ channel.setOutputStream(outputStream);
+
+ for (String cmd : commands) {
+ inputStream.append(cmd);
+ inputStream.append("\n");
+ }
+
+ channel.connect();
+ Thread.sleep(5000);
+
+ } catch (JSchException ex) {
+ throw new Exception("Error executing commands on server.", ex);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ if (channel != null) {
+ channel.disconnect();
+ }
+ }
+ return outputStream.toString();
+ }
+
+ public ChannelSftp getScpConnection() throws Exception {
+ Channel channel = session.openChannel("sftp");
+ channel.connect();
+ return (ChannelSftp) channel;
+ }
+
+ public static SecureRemoteAccess getRemoteAccessAuthenticateWithPassword(String host, String username) throws Exception {
+ return new SecureRemoteAccess(host, username);
+ }
+
+ private static class LogForwarding implements com.jcraft.jsch.Logger {
+ private static Map<Integer, Level> levelMap = new HashMap<Integer, Level>();
+ static {
+ levelMap.put(com.jcraft.jsch.Logger.INFO, Level.INFO);
+ levelMap.put(com.jcraft.jsch.Logger.WARN, Level.WARNING);
+ levelMap.put(com.jcraft.jsch.Logger.FATAL, Level.SEVERE);
+ levelMap.put(com.jcraft.jsch.Logger.DEBUG, Level.FINE);
+ levelMap.put(com.jcraft.jsch.Logger.ERROR, Level.SEVERE);
+ }
+
+ public boolean isEnabled(int level) {
+ return true;
+ }
+
+ public void log(int level, String message) {
+ Level logLevel = levelMap.get(level);
+ if (logLevel == null) {
+ logLevel = Level.SEVERE;
+ }
+ OseeLog.log(ControlPlugin.class, logLevel, message);
+ }
+ }
+
+ private final class PromptUserInfo implements UserInfo, UIKeyboardInteractive {
+ private String password;
+
+ public String getPassword() {
+ return password;
+ }
+
+ public boolean promptYesNo(String message) {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MessageDialog dialog =
+ new MessageDialog(shell, "Warning", null, message, MessageDialog.WARNING, new String[] {
+ IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 0);
+ return dialog.open() == 0;
+ }
+
+ public String getPassphrase() {
+ return null;
+ }
+
+ public boolean promptPassphrase(String message) {
+ return true;
+ }
+
+ public boolean promptPassword(String message) {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MultiTextDialog inputDialog =
+ new MultiTextDialog(shell, "Password", "Enter password: ", new String[] {"password:"},
+ new boolean[] {false});
+ inputDialog.setBlockOnOpen(true);
+ int result = inputDialog.getReturnCode();
+ if (result == Window.OK) {
+ String[] inputs = inputDialog.getValue();
+ if (inputs != null && inputs.length == 1) {
+ password = inputs[0];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void showMessage(String message) {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MessageDialog.openInformation(shell, "Log-in Message", message);
+ }
+
+ public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo) {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MultiTextDialog inputDialog =
+ new MultiTextDialog(shell, destination + ": " + name, "Enter Password: ", prompt, echo);
+ inputDialog.setBlockOnOpen(true);
+ int result = inputDialog.open();
+ if (result == Window.OK) {
+ return inputDialog.getValue();
+ }
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchDataPersist.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchDataPersist.java
new file mode 100644
index 00000000000..2b1fc342256
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchDataPersist.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.framework.ui.service.control.wizards.launcher;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ServiceLaunchDataPersist {
+
+ private static ServiceLaunchDataPersist instance = null;
+ private static final String ROOT_ELEMENT = "ServiceLaunchData";
+ private static final String HOST_ELEMENT = "Host";
+ private static final String LAST_SERVICE_ELEMENT = "LastSelectedService";
+
+ private List<String> hosts;
+ private String lastServiceLaunched;
+
+ private ServiceLaunchDataPersist() {
+ hosts = new ArrayList<String>();
+ lastServiceLaunched = "";
+ parseFile(read());
+ }
+
+ public static ServiceLaunchDataPersist getInstance() {
+ if (instance == null) {
+ instance = new ServiceLaunchDataPersist();
+ }
+ return instance;
+ }
+
+ private File getFile() {
+ Location user = Platform.getUserLocation();
+ String path = user.getURL().getPath();
+ File file = new File(path + File.separator + this.getClass().getCanonicalName() + ".xml");
+ file.getParentFile().mkdirs();
+ return file;
+ }
+
+ public List<String> getHosts() {
+ return hosts;
+ }
+
+ private void parseFile(Document document) {
+ hosts.clear();
+ lastServiceLaunched = "";
+ if (document != null) {
+ NodeList viewList = document.getElementsByTagName(HOST_ELEMENT);
+ for (int i = 0; i < viewList.getLength(); i++) {
+ Node node = viewList.item(i);
+ String value = node.getTextContent();
+ if (value != null && !value.equals("")) {
+ hosts.add(value);
+ }
+ }
+ NodeList lastService = document.getElementsByTagName(LAST_SERVICE_ELEMENT);
+ if (lastService.getLength() == 1) {
+ Node node = lastService.item(0);
+ String value = node.getTextContent();
+ if (value != null && !value.equals("")) {
+ lastServiceLaunched = value;
+ }
+ }
+ }
+ }
+
+ private Document read() {
+ Document document = null;
+ File file = getFile();
+ try {
+ if (file.exists()) {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ document = builder.parse(file);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(ControlPlugin.class, Level.SEVERE, "Error reading File [" + file.getAbsolutePath() + "] ", ex);
+ }
+ return document;
+ }
+
+ public void saveHostName(String addhost) {
+ if (addhost != null && !addhost.equals("") && !hosts.contains(addhost)) {
+ hosts.add(addhost);
+ }
+ saveFile();
+ }
+
+ private void write(Element root, File fileString) {
+ OutputFormat outputFormat;
+ OutputStreamWriter out = null;
+ try {
+ OutputStream bout = new BufferedOutputStream(new FileOutputStream(fileString));
+ out = new OutputStreamWriter(bout);
+
+ outputFormat = new OutputFormat("XML", "UTF-8", true);
+ XMLSerializer xmlSerializer = new XMLSerializer(out, outputFormat);
+ xmlSerializer.serialize(root);
+ out.flush();
+ } catch (FileNotFoundException ex) {
+ OseeLog.log(ControlPlugin.class, Level.SEVERE, "File error [" + fileString + "] ", ex);
+ } catch (IOException ex) {
+ OseeLog.log(ControlPlugin.class, Level.SEVERE, "Error writing to File [" + fileString + "] ", ex);
+ } finally {
+ try {
+ out.close();
+ } catch (IOException ex) {
+ OseeLog.log(ControlPlugin.class, Level.SEVERE, "Error closing stream [" + fileString + "] ", ex);
+ }
+ }
+ }
+
+ public String getLastServiceLaunched() {
+ return lastServiceLaunched;
+ }
+
+ public void saveLastServiceLaunched(String lastServiceLaunched) {
+ this.lastServiceLaunched = lastServiceLaunched;
+ saveFile();
+ }
+
+ private void saveFile() {
+ if (hosts.size() > 0 || (lastServiceLaunched != null && !lastServiceLaunched.equals(""))) {
+
+ Document xmlDoc;
+ try {
+ xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ Element rootElement = xmlDoc.createElement(ROOT_ELEMENT);
+ xmlDoc.appendChild(rootElement);
+
+ Element hostElement = null;
+ for (String host : hosts) {
+ hostElement = xmlDoc.createElement(HOST_ELEMENT);
+ hostElement.setTextContent(host);
+ rootElement.appendChild(hostElement);
+ }
+
+ if (lastServiceLaunched != null && !lastServiceLaunched.equals("")) {
+ Element lastServiceElement = xmlDoc.createElement(LAST_SERVICE_ELEMENT);
+ lastServiceElement.setTextContent(this.lastServiceLaunched.trim());
+ rootElement.appendChild(lastServiceElement);
+ }
+ write(rootElement, getFile());
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(ControlPlugin.class, Level.SEVERE, "Error saving File [" + getFile() + "] ", ex);
+ }
+
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchWizard.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchWizard.java
new file mode 100644
index 00000000000..0241e9624dc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchWizard.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.framework.ui.service.control.wizards.launcher;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.osee.framework.jdk.core.util.io.IZipEntryCompleteCallback;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.pages.LocalRemotePage;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.pages.ServicePage;
+import org.eclipse.osee.framework.ui.swt.DynamicWizard;
+
+public class ServiceLaunchWizard extends DynamicWizard implements IZipEntryCompleteCallback {
+
+ private ServiceLaunchingInformation serviceInfo;
+
+ public ServiceLaunchWizard() {
+ serviceInfo = new ServiceLaunchingInformation();
+ }
+
+ @Override
+ public boolean canFinish() {
+ return serviceInfo.canFinish();
+ }
+
+ @Override
+ public boolean performCancel() {
+ return super.performCancel();
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (!canFinish()) return false;
+ boolean returnVal = true;
+ ServiceLaunchDataPersist data = ServiceLaunchDataPersist.getInstance();
+ data.saveHostName(serviceInfo.getSelectedHost());
+ data.saveLastServiceLaunched(serviceInfo.getServiceItem().getName());
+ return returnVal;
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ this.setWindowTitle("Service Launching");
+
+ String servicePageTitle = "Service Page";
+ String localRemoteTitle = "Location Selection";
+
+ IWizardPage startingPage = new LocalRemotePage(localRemoteTitle, null, servicePageTitle, serviceInfo, this);
+ this.addPage(startingPage);
+ this.addPage(new ServicePage(servicePageTitle, localRemoteTitle, null, serviceInfo));
+ this.setStartingPage(startingPage);
+ }
+
+ public void setValue(int i) {
+ }
+
+ public void setMinimum(int i) {
+ }
+
+ public void setMaximum(int i) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchingInformation.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchingInformation.java
new file mode 100644
index 00000000000..b23c118ead1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceLaunchingInformation.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.framework.ui.service.control.wizards.launcher;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceItem;
+
+public class ServiceLaunchingInformation {
+
+ private List<String> availableHosts;
+
+ private SecureRemoteAccess sshConnection;
+
+ private String selectedHost;
+ private String user;
+ private String[] execCmds;
+ private boolean upload;
+ private boolean isLocal;
+ private String unzipLocation;
+
+ private ServiceItem selectedServiceItem;
+
+ private ServiceLaunchDataPersist serviceLaunchData;
+
+ public ServiceLaunchingInformation() {
+ serviceLaunchData = ServiceLaunchDataPersist.getInstance();
+ availableHosts = serviceLaunchData.getHosts();
+ unzipLocation = "";
+ }
+
+ public List<String> getAvailableHosts() {
+ return availableHosts;
+ }
+
+ public void setAvailableHosts(List<String> availableHosts) {
+ this.availableHosts = availableHosts;
+ }
+
+ public String[] getExecCmds() {
+ return execCmds;
+ }
+
+ public void setExecCmds(String[] execCmds) {
+ this.execCmds = execCmds;
+ }
+
+ public String getSelectedHost() {
+ return selectedHost;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public boolean isUpload() {
+ return upload;
+ }
+
+ public void setUpload(boolean upload) {
+ this.upload = upload;
+ }
+
+ public boolean canFinish() {
+ return (selectedHost != null && user != null && execCmds != null || isLocal());
+ }
+
+ public ServiceItem getServiceItem() {
+ return selectedServiceItem;
+ }
+
+ public void setServiceItem(ServiceItem serviceItem) {
+ this.selectedServiceItem = serviceItem;
+ }
+
+ public void setSelectedHost(String selectedHost) {
+ this.selectedHost = selectedHost;
+ }
+
+ public void connectToRemoteHost() throws Exception {
+ sshConnection = SecureRemoteAccess.getRemoteAccessAuthenticateWithPassword(selectedHost, user);
+ }
+
+ public SecureRemoteAccess getSSHConnection() {
+ return sshConnection;
+ }
+
+ public void setIsLocal(boolean isLocal) {
+ this.isLocal = isLocal;
+ }
+
+ public boolean isLocal() {
+ return isLocal;
+ }
+
+ public String getUnzipLocation() {
+ return unzipLocation;
+ }
+
+ public void setUnzipLocation(String unzipLocation) {
+ this.unzipLocation = unzipLocation;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceWizardDialog.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceWizardDialog.java
new file mode 100644
index 00000000000..a8307070167
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/ServiceWizardDialog.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.framework.ui.service.control.wizards.launcher;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+import org.eclipse.swt.widgets.Shell;
+
+public class ServiceWizardDialog extends WizardDialog {
+
+ public ServiceWizardDialog(Shell parentShell, IWizard newWizard) {
+ super(parentShell, newWizard);
+ }
+
+ @Override
+ protected void nextPressed() {
+ if (((DynamicWizardPage) this.getCurrentPage()).onNextPressed()) {
+ super.nextPressed();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/TextAreaDialog.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/TextAreaDialog.java
new file mode 100644
index 00000000000..5dcf634c15d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/TextAreaDialog.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.framework.ui.service.control.wizards.launcher;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Image;
+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;
+import org.eclipse.swt.widgets.Shell;
+
+public class TextAreaDialog extends MessageDialog {
+
+ private StyledText cmdText;
+ private String groupTitle;
+ private String content;
+
+ public TextAreaDialog(String groupTitle, String content, Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.groupTitle = groupTitle;
+ this.content = content;
+ }
+
+ public static void open(String groupTitle, String content, Shell parent, String title, String message) {
+ TextAreaDialog dialog = new TextAreaDialog(groupTitle, content, parent, title, null, // accept
+ // the
+ // default
+ // window
+ // icon
+ message, INFORMATION, new String[] {IDialogConstants.OK_LABEL}, 0);
+ // ok is the default
+ dialog.open();
+ return;
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ Group userinfo = new Group(parent, SWT.NONE);
+ userinfo.setText(groupTitle);
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ userinfo.setLayout(gridLayout);
+
+ GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gridData.horizontalSpan = 1;
+ gridData.grabExcessHorizontalSpace = true;
+ userinfo.setLayoutData(gridData);
+
+ cmdText = new StyledText(userinfo, SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
+ cmdText.setEditable(false);
+ GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = true;
+ gd.horizontalAlignment = GridData.FILL;
+ gd.horizontalSpan = 2;
+ gd.heightHint = 150;
+ cmdText.setLayoutData(gd);
+ cmdText.setText(content);
+
+ return super.createCustomArea(parent);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/EclipseApplicationFormatter.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/EclipseApplicationFormatter.java
new file mode 100644
index 00000000000..d3828e12e28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/EclipseApplicationFormatter.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.framework.ui.service.control.wizards.launcher.data;
+
+import java.io.File;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EclipseApplicationFormatter extends ExecutionCommandFormatter {
+ // private final String baseExecString = StringFormat.separateWith(new String[] {"#JAVA#",
+ // "#JVM_ARGS#", "-cp",
+ // "#ECLIPSE_INSTALL_HOME#" + (Lib.isWindows() ? "\\eclipse.exe" : "/eclipse"),
+ // "org.eclipse.core.launcher.Main", "-application", "#APPLICATION_NAME#", "#APPLICATION_ARGS#"},
+ // EXEC_SEPARATOR);
+ private final String baseExecString =
+ StringFormat.separateWith(new String[] {"#ECLIPSE_INSTALL_HOME#", "-nosplash", "-application",
+ "#APPLICATION_NAME#", "#APPLICATION_ARGS#", "-vmargs", "#JVM_ARGS#"}, ServiceItem.EXEC_SEPARATOR);
+
+ private String applicationName;
+
+ public EclipseApplicationFormatter(String applicationName) {
+ this.applicationName = applicationName;
+ }
+
+ protected String buildExecString() {
+ String toReturn = baseExecString;
+ toReturn = toReturn.replaceAll("#JAVA#", "java");
+ String localLocation = null;
+ if (Platform.isRunning()) {
+ localLocation = (new File(Platform.getInstallLocation().getURL().getFile())).getAbsolutePath();
+ } else {
+ throw new IllegalStateException("Platform needs to be running");
+ }
+ if (Lib.isWindows()) {
+ localLocation = "\"" + localLocation + "\\eclipse.exe" + "\"";
+ } else {
+ localLocation += "/eclipse";
+ }
+ toReturn = toReturn.replace("#ECLIPSE_INSTALL_HOME#", localLocation);
+ toReturn = toReturn.replace("#APPLICATION_NAME#", applicationName);
+ toReturn = toReturn.replace("#JVM_ARGS#", this.getJvmArgsString());
+ toReturn = toReturn.replace("#APPLICATION_ARGS#", this.getApplicationArgsString());
+ return toReturn;
+ }
+
+ @Override
+ public void setServiceExecutionString(ServiceItem item) {
+ item.setEclipseAppExecution(buildExecString());
+ }
+
+ @Override
+ public void setRemoteAllowed(ServiceItem item) {
+ item.setRemoteExecution(buildExecString());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ExecutionCommandFormatter.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ExecutionCommandFormatter.java
new file mode 100644
index 00000000000..eecdf86840c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ExecutionCommandFormatter.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.framework.ui.service.control.wizards.launcher.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+
+/**
+ * @author Roberto E. Escobar
+ */
+abstract class ExecutionCommandFormatter {
+ protected List<String> jvmArgs;
+ protected List<String> applicationArgs;
+
+ public ExecutionCommandFormatter() {
+ jvmArgs = new ArrayList<String>();
+ applicationArgs = new ArrayList<String>();
+ }
+
+ public void addJvmArg(String value) {
+ jvmArgs.add(value);
+ }
+
+ public void addApplicationArgs(String value) {
+ applicationArgs.add(value);
+ }
+
+ public String getApplicationArgsString() {
+ String applicationArgsString = "";
+ if (applicationArgs.size() > 0) {
+ applicationArgsString =
+ ServiceItem.EXEC_SEPARATOR + StringFormat.listToValueSeparatedString(applicationArgs,
+ ServiceItem.EXEC_SEPARATOR);
+ }
+ return applicationArgsString;
+ }
+
+ public String getJvmArgsString() {
+ String jvmArgsString = "";
+ if (jvmArgs.size() > 0) {
+ jvmArgsString =
+ ServiceItem.EXEC_SEPARATOR + StringFormat.listToValueSeparatedString(jvmArgs, ServiceItem.EXEC_SEPARATOR);
+ }
+ return jvmArgsString;
+ }
+
+ protected abstract String buildExecString();
+
+ public abstract void setServiceExecutionString(ServiceItem item);
+
+ public abstract void setRemoteAllowed(ServiceItem item);
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/JiniGroupSelector.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/JiniGroupSelector.java
new file mode 100644
index 00000000000..b670601edc9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/JiniGroupSelector.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.framework.ui.service.control.wizards.launcher.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import net.jini.core.lookup.ServiceRegistrar;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jini.discovery.EclipseJiniClassloader;
+import org.eclipse.osee.framework.jini.discovery.IRegistrarListener;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+import org.eclipse.osee.framework.ui.service.control.managers.ReggieCache;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class JiniGroupSelector implements IRegistrarListener {
+
+ private Set<String> availableGroups;
+ private String[] jiniGroup;
+ private ComboViewer comboViewer;
+ private ReggieCache reggieCache;
+
+ public JiniGroupSelector() {
+ this.comboViewer = null;
+ this.availableGroups = new TreeSet<String>();
+ this.jiniGroup = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+ if (jiniGroup == null || jiniGroup.length < 1) {
+ jiniGroup = new String[1];
+ }
+ this.reggieCache = ReggieCache.getEclipseInstance(EclipseJiniClassloader.getInstance());
+ }
+
+ public void createJiniGroupWidget(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("Register Service with the following Jini Group: ");
+
+ comboViewer = new ComboViewer(group, SWT.BORDER | SWT.SINGLE);
+ comboViewer.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ comboViewer.getCombo().addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ jiniGroup[0] = comboViewer.getCombo().getText();
+ }
+ });
+
+ comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) comboViewer.getSelection();
+ Object obj = selection.getFirstElement();
+ if (null != obj) {
+ String value = (String) obj;
+ jiniGroup[0] = value;
+ }
+ }
+ });
+ this.reggieCache.addListener(this);
+ }
+
+ private void populateGroups() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ availableGroups.clear();
+ availableGroups.addAll(reggieCache.getAvailableJiniGroups());
+ if (comboViewer != null && true != comboViewer.getCombo().isDisposed()) {
+ List<String> list = new ArrayList<String>(availableGroups);
+
+ String temp = jiniGroup[0];
+ comboViewer.getCombo().removeAll();
+ comboViewer.add(list.toArray());
+
+ jiniGroup[0] = temp;
+ if (true != Strings.isValid(jiniGroup[0])) {
+ jiniGroup = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+
+ int result = list.indexOf(jiniGroup[0]);
+ if (result < 0) {
+ for (int index = 0; index < list.size(); index++) {
+ String value = list.get(index);
+ if (false != value.contains(jiniGroup[0])) {
+ jiniGroup[0] = value;
+ break;
+ }
+ }
+ }
+ }
+
+ comboViewer.getCombo().select(list.indexOf(jiniGroup[0]));
+ }
+ }
+ });
+ }
+
+ public String getJiniGroupVmArg() {
+ return StringFormat.commaSeparate(jiniGroup);
+ }
+
+ public void dispose() {
+ if (comboViewer != null && false != comboViewer.getCombo().isDisposed()) {
+ comboViewer.getCombo().dispose();
+ }
+ this.reggieCache.removeListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.discovery.IRegistrarListener#reggieAdded(java.util.List)
+ */
+ public void reggieAdded(List<ServiceRegistrar> serviceRegistrars) {
+ populateGroups();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.discovery.IRegistrarListener#reggieChanged(java.util.List)
+ */
+ public void reggieChanged(List<ServiceRegistrar> serviceRegistrars) {
+ populateGroups();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jini.discovery.IRegistrarListener#reggieRemoved(java.util.List)
+ */
+ public void reggieRemoved(List<ServiceRegistrar> serviceRegistrars) {
+ populateGroups();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceItem.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceItem.java
new file mode 100644
index 00000000000..6d4aea5f1ef
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceItem.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.data;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+public class ServiceItem implements Comparable<ServiceItem> {
+ public static final String EXEC_SEPARATOR = "@";
+ public static final String JINI_GROUP_FIELD = "$JINI_GROUP";
+ private ArrayList<String> hosts;
+ private String standAloneExecution;
+ private String eclipseAppExecution;
+ private String remoteExecution;
+ private boolean isEclipseAppAllowed;
+ private boolean isStandAloneAllowed;
+ private boolean isRemoteAllowed;
+ private boolean isLocalAllowed;
+ private String serviceName;
+ private String zipFileName;
+ private String unzipLocation;
+ private String pluginId;
+ private String jiniGroup;
+ private boolean isJiniGroupRequired;
+
+ public ServiceItem(String serviceName) {
+ this.serviceName = serviceName;
+ this.isStandAloneAllowed = false;
+ this.isEclipseAppAllowed = false;
+ this.isRemoteAllowed = false;
+ this.isLocalAllowed = false;
+ this.standAloneExecution = "";
+ this.eclipseAppExecution = "";
+ this.remoteExecution = "";
+ this.zipFileName = "";
+ this.unzipLocation = "";
+ this.pluginId = "";
+ this.isJiniGroupRequired = false;
+ this.jiniGroup = "";
+ this.hosts = new ArrayList<String>();
+ }
+
+ public String getLocalExecution() {
+ return updateForJiniGroup(eclipseAppExecution);
+ }
+
+ public String getStandAloneExecution() {
+ return updateForJiniGroup(standAloneExecution);
+ }
+
+ public String getRemoteExecution() {
+ return updateForJiniGroup(remoteExecution);
+ }
+
+ private String updateForJiniGroup(String source) {
+ String jiniVmArg = "";
+ if (false != isJiniGroupRequired()) {
+ jiniVmArg =
+ String.format("-D%s=\"%s\"", OseeProperties.getOseeJiniServiceGroups(),
+ Strings.isValid(getJiniGroup()) ? getJiniGroup() : JINI_GROUP_FIELD);
+ }
+ return source.replace(JINI_GROUP_FIELD, jiniVmArg);
+ }
+
+ public boolean isRemoteAllowed() {
+ return isRemoteAllowed;
+ }
+
+ public boolean isStandAloneAllowed() {
+ return isStandAloneAllowed;
+ }
+
+ public boolean isEclipseAppAllowed() {
+ return isEclipseAppAllowed;
+ }
+
+ public boolean isLocalAllowed() {
+ return isLocalAllowed;
+ }
+
+ public ArrayList<String> getHosts() {
+ return hosts;
+ }
+
+ public String toString() {
+ String hostList = "\n";
+ for (String temp : hosts) {
+ hostList += " Host: " + temp + "\n";
+ }
+
+ String localExecution = "\n Local Allowed: " + isLocalAllowed + "\n";
+ if (isLocalAllowed()) {
+ localExecution += "\t" + "EclipseAppAllowed: " + isEclipseAppAllowed() + "\n";
+ if (isEclipseAppAllowed()) {
+ localExecution += "\t" + "EclipseAppExecute: " + this.getLocalExecution() + "\n";
+ }
+
+ localExecution += "\t" + "StandAloneExecution: " + isStandAloneAllowed() + "\n";
+ if (isStandAloneAllowed()) {
+ localExecution += "\t" + "StandAloneExecution: " + this.getStandAloneExecution() + "\n";
+ }
+ }
+
+ String remoteExecution = " Remote Allowed: " + isRemoteAllowed() + "\n";
+ if (isRemoteAllowed()) {
+ remoteExecution += "\t" + "RemoteExecution: " + this.getRemoteExecution() + "\n";
+ }
+
+ return String.format(
+ "[ Class: %s\n Name: %s %s %s Destination: %s\n Zip Name: %s\n Plugin Directory: %s %s" + "\n JiniGroup: %s]\n",
+ this.getClass().getSimpleName(), getName(), localExecution, remoteExecution, getUnzipLocation(),
+ getZipName(), getPlugin(), hostList, isJiniGroupRequired() ? jiniGroup : "NOT REQUIRED");
+ }
+
+ public int compareTo(ServiceItem other) {
+ if (other != null) {
+ String name1 = this.getName();
+ String name2 = other.getName();
+ name1 = (name1 != null ? name1 : "");
+ name2 = (name2 != null ? name2 : "");
+ return name1.compareTo(name2);
+ }
+ return 0;
+ }
+
+ public String getName() {
+ return serviceName;
+ }
+
+ public String getZipName() {
+ return zipFileName;
+ }
+
+ public String getPlugin() {
+ return pluginId;
+ }
+
+ public String getUnzipLocation() {
+ return unzipLocation;
+ }
+
+ protected void setUnzipLocation(String unzipLocation) {
+ this.unzipLocation = unzipLocation;
+ }
+
+ protected void setPlugin(String pluginId) {
+ this.pluginId = pluginId;
+ }
+
+ protected void setZipName(String zipFileName) {
+ this.zipFileName = zipFileName;
+ }
+
+ protected void setLocalAllowed(boolean isLocalAllowed) {
+ this.isLocalAllowed = isLocalAllowed;
+ }
+
+ protected void setStandAloneExecution(String value) {
+ this.standAloneExecution = value;
+ this.isStandAloneAllowed = true;
+ }
+
+ protected void setEclipseAppExecution(String value) {
+ this.eclipseAppExecution = value;
+ this.isEclipseAppAllowed = true;
+ }
+
+ protected void setRemoteExecution(String value) {
+ this.remoteExecution = value;
+ this.isRemoteAllowed = true;
+ }
+
+ public void setJiniGroupRequired(boolean booleanValue) {
+ this.isJiniGroupRequired = booleanValue;
+ }
+
+ public boolean isJiniGroupRequired() {
+ return isJiniGroupRequired;
+ }
+
+ public void setJiniGroup(String jiniGroup) {
+ this.jiniGroup = jiniGroup;
+ }
+
+ public String getJiniGroup() {
+ return jiniGroup;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceLaunchConfig.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceLaunchConfig.java
new file mode 100644
index 00000000000..ff163ec92e4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/ServiceLaunchConfig.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.data;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ServiceLaunchConfig {
+ private final String EXTENSION_POINT_NAME = "org.eclipse.osee.framework.ui.service.control.ServiceLaunch";
+ private final String APPLICATION_ELEMENT = "Application";
+
+ private enum ExecutionTypesEnum {
+ EclipseApplication("EclipseApplicationName"), StandAloneApplication("ExecutionCommand");
+
+ String entryTag;
+
+ ExecutionTypesEnum(String tag) {
+ this.entryTag = tag;
+ }
+
+ String getEntryTag() {
+ return entryTag;
+ }
+ }
+
+ private enum ArgumentTypesEnum {
+ VmArgs, AppArgs;
+ }
+
+ private Collection<ServiceItem> localServiceItems;
+ private Collection<ServiceItem> remoteServiceItems;
+ private Collection<ServiceItem> combinedServiceItems;
+ private static final ServiceLaunchConfig instance = new ServiceLaunchConfig();
+
+ public static ServiceLaunchConfig getInstance() {
+ return instance;
+ }
+
+ private ServiceLaunchConfig() {
+ super();
+ readServiceItems();
+ }
+
+ public Collection<ServiceItem> getRemoteServiceItems() {
+ return remoteServiceItems;
+ }
+
+ public Collection<ServiceItem> getLocalServiceItems() {
+ return localServiceItems;
+ }
+
+ public Collection<ServiceItem> getServiceItems() {
+ return combinedServiceItems;
+ }
+
+ private void readServiceItems() {
+ remoteServiceItems = new ArrayList<ServiceItem>();
+ localServiceItems = new ArrayList<ServiceItem>();
+ combinedServiceItems = new ArrayList<ServiceItem>();
+
+ List<ServiceItem> serviceItems = getServicesToLaunch();
+ for (ServiceItem item : serviceItems) {
+ if (item.isLocalAllowed()) {
+ localServiceItems.add(item);
+ }
+ if (item.isRemoteAllowed()) {
+ remoteServiceItems.add(item);
+ }
+ combinedServiceItems.add(item);
+ }
+ }
+
+ private List<ServiceItem> getServicesToLaunch() {
+ List<ServiceItem> toReturn = new ArrayList<ServiceItem>();
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements(EXTENSION_POINT_NAME, APPLICATION_ELEMENT);
+ for (IConfigurationElement element : elements) {
+ String serviceName = element.getAttribute("ServiceName");
+ if (false != Strings.isValid(serviceName)) {
+ try {
+
+ ServiceItem serviceItem = new ServiceItem(serviceName);
+ serviceItem.setJiniGroupRequired(getBooleanValue("RequiresJiniGroup", element));
+ getPluginId(element, serviceItem);
+ getApplicationConfig(ExecutionTypesEnum.EclipseApplication, element, serviceItem);
+ getApplicationConfig(ExecutionTypesEnum.StandAloneApplication, element, serviceItem);
+ toReturn.add(serviceItem);
+ } catch (Throwable ex) {
+ OseeLog.log(ControlPlugin.class, Level.WARNING, String.format("Error while loading service launch extension for: [%s]",
+ serviceName), ex);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private void getPluginId(IConfigurationElement parent, ServiceItem serviceItem) {
+ String plugin = parent.getContributor().getName();
+ IConfigurationElement[] elements = parent.getChildren("NotLocalToPlugin");
+ if (elements != null && elements.length > 0) {
+ String temp = elements[0].getAttribute("PluginId");
+ if (false != Strings.isValid(temp)) {
+ plugin = temp;
+ }
+ }
+ serviceItem.setPlugin(plugin);
+ }
+
+ private void getApplicationConfig(ExecutionTypesEnum configElement, IConfigurationElement element, ServiceItem serviceItem) {
+ IConfigurationElement[] elements = element.getChildren(configElement.name());
+ if (elements != null && elements.length > 0) {
+ for (IConfigurationElement theElement : elements) {
+ ExecutionCommandFormatter commandFormatter = getExecutionCommandInstance(configElement, theElement);
+ if (null != commandFormatter) {
+ serviceItem.setLocalAllowed(getBooleanValue("IsLocalAllowed", theElement));
+
+ getExecutionArguments(ArgumentTypesEnum.VmArgs, theElement, commandFormatter);
+ getExecutionArguments(ArgumentTypesEnum.AppArgs, theElement, commandFormatter);
+
+ if (false != serviceItem.isJiniGroupRequired()) {
+ commandFormatter.addJvmArg(ServiceItem.JINI_GROUP_FIELD);
+ }
+
+ if (false != getBooleanValue("IsRemoteAllowed", theElement)) {
+ commandFormatter.setRemoteAllowed(serviceItem);
+ getHosts(theElement, serviceItem);
+ }
+ getApplicationBundle(theElement, serviceItem);
+ commandFormatter.setServiceExecutionString(serviceItem);
+ }
+ }
+ }
+ }
+
+ private void getApplicationBundle(IConfigurationElement parent, ServiceItem serviceItem) {
+ IConfigurationElement[] elements = parent.getChildren("ApplicationBundle");
+ for (IConfigurationElement element : elements) {
+ String fileName = element.getAttribute("ZipFileName");
+ if (false != Strings.isValid(fileName)) {
+ serviceItem.setZipName(fileName.trim());
+ }
+
+ String unzipLocation = element.getAttribute("UnzipLocation");
+ if (false != Strings.isValid(unzipLocation)) {
+ serviceItem.setUnzipLocation(unzipLocation.trim());
+ }
+ }
+ }
+
+ private void getHosts(IConfigurationElement parent, ServiceItem serviceItem) {
+ IConfigurationElement[] elements = parent.getChildren("Host");
+ for (IConfigurationElement element : elements) {
+ String host = element.getAttribute("Name");
+ if (false != Strings.isValid(host)) {
+ serviceItem.getHosts().add(host.trim());
+ }
+ }
+ }
+
+ private boolean getBooleanValue(String tagName, IConfigurationElement element) {
+ String value = element.getAttribute(tagName);
+ return false != Strings.isValid(value) && false != value.equalsIgnoreCase("true");
+ }
+
+ private void getExecutionArguments(ArgumentTypesEnum argType, IConfigurationElement element, ExecutionCommandFormatter commandFormatter) {
+ String rawArgs = element.getAttribute(argType.name());
+ if (false != Strings.isValid(rawArgs)) {
+ String[] args = rawArgs.split(" ");
+ for (String arg : args) {
+ switch (argType) {
+ case VmArgs:
+ commandFormatter.addJvmArg(arg);
+ break;
+ case AppArgs:
+ commandFormatter.addApplicationArgs(arg);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ private ExecutionCommandFormatter getExecutionCommandInstance(ExecutionTypesEnum configElement, IConfigurationElement config) {
+ ExecutionCommandFormatter toReturn = null;
+ String name = config.getAttribute(configElement.getEntryTag());
+ if (false != Strings.isValid(name)) {
+ name = name.trim();
+ switch (configElement) {
+ case EclipseApplication:
+ toReturn = new EclipseApplicationFormatter(name);
+ break;
+ case StandAloneApplication:
+ toReturn = new StandAloneApplicationFormatter(name);
+ break;
+ default:
+ break;
+ }
+ }
+ return toReturn;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/StandAloneApplicationFormatter.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/StandAloneApplicationFormatter.java
new file mode 100644
index 00000000000..ac0974486d7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/data/StandAloneApplicationFormatter.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.framework.ui.service.control.wizards.launcher.data;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StandAloneApplicationFormatter extends ExecutionCommandFormatter {
+ private final String baseExecString = "nohup" + ServiceItem.EXEC_SEPARATOR + "#JAVA#";
+ private String executionString;
+
+ public StandAloneApplicationFormatter(String executionString) {
+ this.executionString = executionString;
+ }
+
+ @Override
+ protected String buildExecString() {
+ String toReturn = baseExecString.replace("#JAVA#", "java");
+ toReturn +=
+ this.getJvmArgsString() + ServiceItem.EXEC_SEPARATOR + executionString + this.getApplicationArgsString();
+ return toReturn;
+ }
+
+ @Override
+ public void setServiceExecutionString(ServiceItem item) {
+ item.setStandAloneExecution(buildExecString());
+ }
+
+ @Override
+ public void setRemoteAllowed(ServiceItem item) {
+ item.setRemoteExecution(buildExecString());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ExecutePage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ExecutePage.java
new file mode 100644
index 00000000000..bc27f666ee7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ExecutePage.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.pages;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.JiniGroupSelector;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceItem;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+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.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+public class ExecutePage extends DynamicWizardPage {
+
+ private static final String TEMPORARY_JINI_GROUP = "<USE COMBO BOX FROM ABOVE>";
+ private enum LabelEnum {
+ Service, User, Host;
+ }
+
+ private Map<LabelEnum, Text> dataMap;
+ private FormattedText cmdText;
+ private FormattedText updateText;
+ private ServiceLaunchingInformation serviceInfo;
+ private JiniGroupSelector jiniGroupSelector;
+
+ public ExecutePage(String pageName, String previous, String next, ServiceLaunchingInformation serviceInfo) {
+ super(pageName, previous, next);
+ this.serviceInfo = serviceInfo;
+ this.dataMap = new HashMap<LabelEnum, Text>();
+ setTitle("Launch Service");
+ setDescription("Through ssh the remote host is accessed and a list of commands are run that launch the selected service.");
+ setPageComplete(true);
+ }
+
+ public void createControl(Composite parent) {
+ Group composite = new Group(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Upload Info");
+
+ createLabelArea(composite);
+ if (false != serviceInfo.getServiceItem().isJiniGroupRequired()) {
+ jiniGroupSelector = new JiniGroupSelector();
+ jiniGroupSelector.createJiniGroupWidget(composite);
+ }
+ createExecuteInfoGroup(composite);
+ createButtonArea(composite);
+
+ setControl(composite);
+ }
+
+ private void createLabelArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ dataMap.clear();
+ for (LabelEnum labelEnum : LabelEnum.values()) {
+ new Label(composite, SWT.NONE).setText(labelEnum.toString() + ":");
+
+ Text updateable = new Text(composite, SWT.SINGLE);
+ updateable.setEditable(false);
+ updateable.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ dataMap.put(labelEnum, updateable);
+ }
+ }
+
+ private void createExecuteInfoGroup(Composite parent) {
+ 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;
+
+ Group group = new Group(sashForm, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Enter Commands To Execute:");
+
+ cmdText = new FormattedText(group, SWT.NONE, 50, 100, true);
+ cmdText.getStyledText().setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+ cmdText.getStyledText().addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ String cmds = cmdText.getStyledText().getText();
+ String[] cmdList = cmds.split("\r\n");
+ for (int i = 0; i < cmdList.length; i++) {
+ cmdList[i] = cmdList[i].trim();
+ }
+ serviceInfo.setExecCmds(cmdList);
+
+ }
+
+ });
+
+ updateText = new FormattedText(sashForm, SWT.BORDER, 200, 300, false);
+ sashForm.setWeights(new int[] {3, 7});
+ }
+
+ public void createButtonArea(Composite parent) {
+ Composite buttonComposite = new Composite(parent, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout(2, true));
+ buttonComposite.setLayoutData(new GridData(SWT.END, SWT.END, false, false));
+
+ Button clearText = new Button(buttonComposite, SWT.PUSH);
+ clearText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ clearText.setText("Clear");
+ clearText.setToolTipText("Clear the execution status window");
+ clearText.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateText.clearTextArea();
+ }
+
+ });
+
+ final Button execute = new Button(buttonComposite, SWT.PUSH);
+ execute.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ execute.setText("Execute");
+ execute.setToolTipText("Executes commands speficied int the command window on the remote host");
+ execute.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ execute.setEnabled(false);
+ try {
+ String[] execCommands = serviceInfo.getExecCmds();
+ if (null != jiniGroupSelector) {
+ serviceInfo.getServiceItem().setJiniGroup(jiniGroupSelector.getJiniGroupVmArg());
+
+ for (int index = 0; index < execCommands.length; index++) {
+ String temp = execCommands[index];
+ if (temp.contains(TEMPORARY_JINI_GROUP)) {
+ execCommands[index] =
+ temp.replace(TEMPORARY_JINI_GROUP, serviceInfo.getServiceItem().getJiniGroup());
+ }
+ }
+ }
+ String output = serviceInfo.getSSHConnection().executeCommandList(execCommands);
+ updateText.addText(output);
+ } catch (Exception ex) {
+ updateText.addText("\n" + ControlPlugin.getStackMessages(ex) + "\n", SWT.NORMAL, SWT.COLOR_RED);
+ }
+ execute.setEnabled(true);
+ }
+ });
+ }
+ });
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ this.cmdText.clearTextArea();
+ this.dataMap.get(LabelEnum.Service).setText(serviceInfo.getServiceItem().getName());
+ this.dataMap.get(LabelEnum.User).setText(serviceInfo.getUser());
+ this.dataMap.get(LabelEnum.Host).setText(serviceInfo.getSelectedHost());
+
+ if (null != jiniGroupSelector) {
+ serviceInfo.getServiceItem().setJiniGroup(TEMPORARY_JINI_GROUP);
+ }
+
+ String execute =
+ "cd " + serviceInfo.getUnzipLocation() + "\n" + serviceInfo.getServiceItem().getRemoteExecution().replaceAll(
+ ServiceItem.EXEC_SEPARATOR, " ");
+
+ this.cmdText.addText(execute);
+
+ super.setVisible(visible);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/HostInfoPage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/HostInfoPage.java
new file mode 100644
index 00000000000..91dd0c3b520
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/HostInfoPage.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.pages;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchDataPersist;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+import org.eclipse.swt.SWT;
+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.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+public class HostInfoPage extends DynamicWizardPage {
+ private Combo hostName;
+ private Text userName;
+ private ServiceLaunchingInformation serviceInfo;
+ private List<String> hosts;
+
+ public HostInfoPage(String pageName, String previous, String next, ServiceLaunchingInformation serviceInfo) {
+ super(pageName, previous, next);
+ this.serviceInfo = serviceInfo;
+ this.hosts = new ArrayList<String>();
+ setTitle("Host Information");
+ setDescription("Please select a remote host to connect to and input a valid username.");
+ setPageComplete(false);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ composite.setLayout(gridLayout);
+ GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gridData.horizontalSpan = 1;
+ gridData.grabExcessHorizontalSpace = true;
+ composite.setLayoutData(gridData);
+ createHostInfoGroup(composite);
+ createUserInfoGroup(composite);
+ setControl(composite);
+ }
+
+ private void createHostInfoGroup(Composite parent) {
+ Group hostinfo = new Group(parent, SWT.NONE);
+ hostinfo.setText("Host: ");
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ hostinfo.setLayout(gridLayout);
+
+ GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gridData.horizontalSpan = 1;
+ gridData.grabExcessHorizontalSpace = true;
+ hostinfo.setLayoutData(gridData);
+
+ hostName = new Combo(hostinfo, SWT.SINGLE | SWT.BORDER);
+ hostName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ serviceInfo.setAvailableHosts(serviceInfo.getServiceItem().getHosts());
+ hosts = serviceInfo.getAvailableHosts();
+ for (String name : hosts) {
+ if (name != null && !name.equals("")) {
+ hostName.add(name);
+ }
+ }
+
+ hostName.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ tryToGoToNext();
+ }
+ });
+ hostName.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ tryToGoToNext();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+ }
+
+ private void createUserInfoGroup(Composite parent) {
+ Group userinfo = new Group(parent, SWT.NONE);
+ userinfo.setText("User Name: ");
+
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ userinfo.setLayout(gridLayout);
+
+ GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gridData.horizontalSpan = 1;
+ userinfo.setLayoutData(gridData);
+
+ userName = new Text(userinfo, SWT.SINGLE | SWT.BORDER);
+ userName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ String name;
+ try {
+ name = UserManager.getUser().getName();
+ } catch (Exception ex) {
+ name = System.getProperty("user.name");
+ }
+ userName.setText(name);
+ userName.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ tryToGoToNext();
+ }
+ });
+ }
+
+ private void tryToGoToNext() {
+ if (Strings.isValid(userName.getText()) && Strings.isValid(this.hostName.getText())) {
+ setPageComplete(true);
+ }
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ serviceInfo.setAvailableHosts(serviceInfo.getServiceItem().getHosts());
+ hosts = serviceInfo.getAvailableHosts();
+ if (hostName != null && !hostName.isDisposed()) {
+ hostName.removeAll();
+ for (String name : hosts) {
+ if (name != null && !name.equals("")) {
+ hostName.add(name);
+ }
+ }
+ hostName.select(0);
+ }
+
+ super.setVisible(visible);
+ }
+
+ public Combo getHostNameCombo() {
+ return hostName;
+ }
+
+ @Override
+ public boolean onNextPressed() {
+ serviceInfo.setUser(userName.getText());
+ serviceInfo.setSelectedHost(hostName.getText());
+ serviceInfo.setUnzipLocation(serviceInfo.getServiceItem().getUnzipLocation() + "/" + serviceInfo.getServiceItem().getPlugin());
+
+ ServiceLaunchDataPersist data = ServiceLaunchDataPersist.getInstance();
+ data.saveHostName(hostName.getText());
+ data.saveLastServiceLaunched(serviceInfo.getServiceItem().getName());
+
+ try {
+ serviceInfo.connectToRemoteHost();
+ } catch (Exception ex) {
+ StringWriter error = new StringWriter();
+ ex.printStackTrace(new PrintWriter(error));
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Unable to connect to the remote host", ControlPlugin.getStackMessages(ex));
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalLaunchPage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalLaunchPage.java
new file mode 100644
index 00000000000..bbce2040b3e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalLaunchPage.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.framework.ui.service.control.wizards.launcher.pages;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchWizard;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.widgets.EclipseApplicationLaunchWidget;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.widgets.ILaunchWidget;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.widgets.StandAloneApplicationLaunchWidget;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+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.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LocalLaunchPage extends DynamicWizardPage {
+
+ private ServiceLaunchingInformation serviceInfo;
+
+ private Button eclipseApplicationButton;
+ private Button standAloneButton;
+ private StackLayout stackLayout;
+ private Composite stackedComposite;
+ private Map<Button, ILaunchWidget> widgets;
+
+ public LocalLaunchPage(String pageName, String previous, String next, ServiceLaunchingInformation serviceInfo) {
+ super(pageName, previous, next);
+ this.serviceInfo = serviceInfo;
+ setTitle("Local Launch");
+ setDescription("Select a local launch method to execute service.");
+ setPageComplete(true);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createLaunchTypeButtonArea(composite);
+
+ stackedComposite = new Composite(composite, SWT.NONE);
+ stackedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ stackLayout = new StackLayout();
+ stackedComposite.setLayout(stackLayout);
+
+ ServiceLaunchWizard wizard = (ServiceLaunchWizard) this.getWizard();
+
+ widgets = new HashMap<Button, ILaunchWidget>();
+ widgets.put(eclipseApplicationButton, new EclipseApplicationLaunchWidget(serviceInfo));
+ widgets.put(standAloneButton, new StandAloneApplicationLaunchWidget(serviceInfo, wizard));
+
+ Set<Button> keys = widgets.keySet();
+ for (Button key : keys) {
+ ILaunchWidget widget = widgets.get(key);
+ widget.create(stackedComposite);
+ }
+ determineDefaultSelection();
+ registerListeners();
+
+ setPageComplete(true);
+ setControl(composite);
+ }
+
+ private void determineDefaultSelection() {
+ Button key = null;
+ if (serviceInfo.getServiceItem().isStandAloneAllowed()) {
+ standAloneButton.setEnabled(true);
+ standAloneButton.setSelection(true);
+ key = standAloneButton;
+ }
+
+ if (serviceInfo.getServiceItem().isEclipseAppAllowed()) {
+ eclipseApplicationButton.setEnabled(true);
+ eclipseApplicationButton.setSelection(true);
+ key = eclipseApplicationButton;
+ }
+
+ if (standAloneButton.getSelection() && eclipseApplicationButton.getSelection()) {
+ standAloneButton.setSelection(false);
+ }
+
+ if (key != null) {
+ stackLayout.topControl = widgets.get(key).getControl();
+ stackedComposite.layout();
+ }
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ for (Button button : widgets.keySet()) {
+ widgets.get(button).refresh();
+ button.setEnabled(false);
+ button.setSelection(false);
+ }
+ determineDefaultSelection();
+ super.setVisible(visible);
+ }
+
+ private void createLaunchTypeButtonArea(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("Select how to launch the application locally");
+
+ eclipseApplicationButton = new Button(group, SWT.RADIO);
+ eclipseApplicationButton.setEnabled(false);
+ eclipseApplicationButton.setText("As an Eclipse Application");
+ eclipseApplicationButton.setToolTipText("This option launches the selected service\n" + "as an Eclipse application. The executable will be selected from \n" + "the latest plugin folder under the eclipse installation location.\n" + "The Eclipse framework will be used to execute the application.");
+
+ standAloneButton = new Button(group, SWT.RADIO);
+ standAloneButton.setEnabled(false);
+ standAloneButton.setText("As a Standalone Application");
+ standAloneButton.setToolTipText("This option launches the selected service\n" + "as a standalone application under the specified directory.");
+ }
+
+ private void registerListeners() {
+ eclipseApplicationButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ stackLayout.topControl = widgets.get(eclipseApplicationButton).getControl();
+ stackedComposite.layout();
+
+ }
+ });
+
+ standAloneButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ stackLayout.topControl = widgets.get(standAloneButton).getControl();
+ stackedComposite.layout();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ if (widgets != null) {
+ super.dispose();
+ Set<Button> keys = widgets.keySet();
+ for (Button key : keys) {
+ ILaunchWidget widget = widgets.get(key);
+ widget.dispose();
+ }
+ }
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalRemotePage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalRemotePage.java
new file mode 100644
index 00000000000..f88918762c4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/LocalRemotePage.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.pages;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchWizard;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceLaunchConfig;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+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;
+import org.eclipse.swt.widgets.Group;
+
+public class LocalRemotePage extends DynamicWizardPage {
+
+ private ServiceLaunchingInformation serviceInfo;
+ private Button local;
+ private Button remote;
+ private ServiceLaunchWizard wizard;
+ private Composite composite;
+
+ public LocalRemotePage(String pageName, String previous, String next, ServiceLaunchingInformation serviceInfo, ServiceLaunchWizard wizard) {
+ super(pageName, previous, next);
+ this.serviceInfo = serviceInfo;
+ setTitle("Local/Remote Launch");
+ setDescription("Please select local or remote for the launching of the selected service.");
+ setPageComplete(true);
+ this.wizard = wizard;
+ }
+
+ public void createControl(Composite parent) {
+ composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createHostInfoGroup(composite);
+ setControl(composite);
+ }
+
+ private void createHostInfoGroup(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText("Launch Location");
+
+ local = new Button(group, SWT.RADIO);
+ local.setText("Local");
+ local.setSelection(true);
+ local.setEnabled(false);
+
+ remote = new Button(group, SWT.RADIO);
+ remote.setText("Remote");
+ remote.setEnabled(false);
+
+ if (ServiceLaunchConfig.getInstance().getLocalServiceItems().size() > 0) {
+ local.setEnabled(true);
+ } else {
+ remote.setSelection(true);
+ }
+
+ if (ServiceLaunchConfig.getInstance().getRemoteServiceItems().size() > 0) {
+ remote.setEnabled(true);
+ } else {
+ local.setSelection(true);
+ }
+
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return true;
+ }
+
+ @Override
+ public boolean onNextPressed() {
+ ServicePage servicePage = ((ServicePage) this.getNextPage());
+ servicePage.setIsLocal(local.getSelection());
+ serviceInfo.setIsLocal(local.getSelection());
+
+ if (local.getSelection()) {
+ String unzipLocationTitle = "Execute Local Service";
+ servicePage.setNextPage(unzipLocationTitle);
+ wizard.addPage(new LocalLaunchPage(unzipLocationTitle, servicePage.getName(), "", serviceInfo));
+ } else {
+ String hostInformationTitle = "Host Information";
+ String uploadServiceTitle = "Upload service";
+ String executeServiceTitle = "Execute Remote Service";
+
+ servicePage.setNextPage(hostInformationTitle);
+ IWizardPage[] pagesToAdd =
+ new IWizardPage[] {
+ new HostInfoPage(hostInformationTitle, servicePage.getName(), uploadServiceTitle, serviceInfo),
+ new UploadPage(uploadServiceTitle, hostInformationTitle, executeServiceTitle, serviceInfo),
+ new ExecutePage(executeServiceTitle, uploadServiceTitle, "", serviceInfo)};
+ for (IWizardPage page : pagesToAdd) {
+ wizard.addPage(page);
+ }
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ServicePage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ServicePage.java
new file mode 100644
index 00000000000..5e5847e8369
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/ServicePage.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.service.control.wizards.launcher.pages;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceItem;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceLaunchConfig;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+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 ServicePage extends DynamicWizardPage {
+
+ private ListViewer listViewer;
+ private ServiceLaunchingInformation serviceInfo;
+ private Collection<ServiceItem> localList;
+ private Collection<ServiceItem> remoteList;
+ private Group group;
+ private boolean isLocal;
+
+ public ServicePage(String pageName, String previous, String next, ServiceLaunchingInformation serviceInfo) {
+ super(pageName, previous, next);
+ this.serviceInfo = serviceInfo;
+ this.isLocal = true;
+ setTitle("Service Selection");
+ setDescription("Please select the service you would like to launch.");
+ setPageComplete(false);
+ }
+
+ public void setIsLocal(boolean isLocal) {
+ this.isLocal = isLocal;
+ manageInputList();
+ }
+
+ public void createControl(Composite parent) {
+ group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText("Service Selection");
+
+ listViewer = new ListViewer(group, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ GridData d = new GridData(SWT.FILL, SWT.FILL, true, true);
+ listViewer.getControl().setLayoutData(d);
+ listViewer.setContentProvider(new ListContentProvider());
+ listViewer.setLabelProvider(new ListLabelProvider());
+ listViewer.setSorter(new ListSorter());
+
+ listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ if (selection != null && !selection.isEmpty()) {
+ ServiceItem item = (ServiceItem) selection.getFirstElement();
+ serviceInfo.setServiceItem(item);
+ serviceInfo.setAvailableHosts(item.getHosts());
+ setPageComplete(true);
+ } else {
+ setPageComplete(false);
+ }
+ }
+ });
+
+ localList = ServiceLaunchConfig.getInstance().getLocalServiceItems();
+ remoteList = ServiceLaunchConfig.getInstance().getRemoteServiceItems();
+ manageInputList();
+ setControl(group);
+ }
+
+ private void manageInputList() {
+ Collection<ServiceItem> listToSet = this.localList;
+ if (!isLocal) {
+ listToSet = this.remoteList;
+ }
+ if (listViewer != null && !listViewer.getControl().isDisposed()) {
+ listViewer.setInput(listToSet);
+ serviceInfo.setServiceItem(null);
+ }
+ }
+
+ private class ListLabelProvider extends LabelProvider {
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ return ((ServiceItem) element).getName();
+ }
+ }
+
+ private class ListContentProvider implements IStructuredContentProvider {
+ public Object[] getElements(Object inputElement) {
+ Collection<?> collection = (Collection<?>) inputElement;
+ return collection.toArray();
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ public class ListSorter extends ViewerSorter {
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ ServiceItem item1 = (ServiceItem) e1;
+ ServiceItem item2 = (ServiceItem) e2;
+ return item1.compareTo(item2);
+ }
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (listViewer != null) {
+ listViewer.getList().dispose();
+ }
+ }
+
+ @Override
+ public boolean onNextPressed() {
+ boolean toReturn = false;
+ IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection();
+ if (selection != null && !selection.isEmpty()) {
+ ServiceItem item = (ServiceItem) selection.getFirstElement();
+ serviceInfo.setServiceItem(item);
+ serviceInfo.setAvailableHosts(item.getHosts());
+ toReturn = true;
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/UploadPage.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/UploadPage.java
new file mode 100644
index 00000000000..b27beb640f2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/pages/UploadPage.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.pages;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.jobs.TextDisplayHelper;
+import org.eclipse.osee.framework.ui.service.control.jobs.UploadRemoteFileJob;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.swt.DynamicWizardPage;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+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.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+public class UploadPage extends DynamicWizardPage {
+
+ public enum LabelEnum {
+ Service, User, Host, Host_Upload_Location;
+
+ public String toString() {
+ return this.name().replaceAll("_", " ");
+ }
+ }
+
+ private Map<LabelEnum, Text> dataMap;
+
+ private ServiceLaunchingInformation serviceInfo;
+ private FormattedText cmdText;
+ private ProgressBar progress;
+
+ private static final Image HELP_IMAGE = ControlPlugin.getInstance().getImage("help.gif");
+
+ public UploadPage(String pageName, String previous, String next, ServiceLaunchingInformation serviceInfo) {
+ super(pageName, previous, next);
+ this.serviceInfo = serviceInfo;
+ this.dataMap = new HashMap<LabelEnum, Text>();
+ setTitle("Upload Service Selection");
+ setDescription("An scp client will upload the files required by the service to the host machine at the given location.");
+ setPageComplete(true);
+ }
+
+ public void createControl(Composite parent) {
+ Group composite = new Group(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Upload Info");
+
+ createLabelArea(composite);
+
+ cmdText = new FormattedText(composite, SWT.NONE, 200, 300);
+ cmdText.getStyledText().setEditable(false);
+
+ createUploadBarArea(composite);
+
+ setControl(composite);
+ }
+
+ private void createLabelArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ dataMap.clear();
+ for (LabelEnum labelEnum : LabelEnum.values()) {
+ new Label(composite, SWT.NONE).setText(labelEnum.toString() + ":");
+
+ Text updateable;
+ if (labelEnum.equals(LabelEnum.Host_Upload_Location)) {
+ updateable = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ updateable.setEditable(true);
+ } else {
+ updateable = new Text(composite, SWT.SINGLE);
+ updateable.setEditable(false);
+ }
+ updateable.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ dataMap.put(labelEnum, updateable);
+ }
+ }
+
+ public void createUploadBarArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ progress = new ProgressBar(composite, SWT.HORIZONTAL);
+ progress.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ progress.setEnabled(true);
+ progress.setMinimum(0);
+ progress.setMaximum(20);
+ progress.setSelection(0);
+
+ Composite buttonComposite = new Composite(composite, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout(3, true));
+ buttonComposite.setLayoutData(new GridData(SWT.END, SWT.END, false, false));
+
+ Button clearText = new Button(buttonComposite, SWT.PUSH);
+ clearText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ clearText.setText("Clear");
+ clearText.setToolTipText("Clear the execution status window");
+ clearText.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ progress.setSelection(0);
+ cmdText.clearTextArea();
+ }
+
+ });
+
+ Button upload = new Button(buttonComposite, SWT.NONE);
+ upload.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ upload.setText("Upload");
+ upload.setToolTipText("Uploads files to the remote host");
+ upload.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ Job job =
+ new UploadRemoteFileJob("Uploading Files", serviceInfo, new TextDisplayHelper(cmdText),
+ progress, dataMap);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ });
+ }
+ });
+
+ final Label help = new Label(buttonComposite, SWT.NONE);
+ help.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+ help.setImage(HELP_IMAGE);
+ help.setToolTipText("Double-Click to open help dialog.");
+ help.addMouseListener(new MouseListener() {
+
+ public void mouseDoubleClick(MouseEvent e) {
+ MessageDialog.openInformation(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Upload Help",
+ "Upload Hints: \n\n" + "1. If the service binds to a static port, ensure that the \n" + "service to be launched is not running on the target machine.\n\n" + "2. If the remote directory used to upload files to exists previously, \n" + "make sure that the user login has write/execute permissions for that folder.\n");
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ });
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ this.dataMap.get(LabelEnum.Service).setText(serviceInfo.getServiceItem().getName());
+ this.dataMap.get(LabelEnum.User).setText(serviceInfo.getUser());
+ this.dataMap.get(LabelEnum.Host).setText(serviceInfo.getSelectedHost());
+
+ String unzipLocation = serviceInfo.getUnzipLocation();
+ if (unzipLocation == null || unzipLocation.equals("")) {
+ serviceInfo.setUnzipLocation(serviceInfo.getServiceItem().getUnzipLocation() + "/" + serviceInfo.getServiceItem().getPlugin());
+ }
+ this.dataMap.get(LabelEnum.Host_Upload_Location).setText(serviceInfo.getUnzipLocation());
+ super.setVisible(visible);
+ }
+
+ @Override
+ public boolean onNextPressed() {
+ serviceInfo.setUnzipLocation(dataMap.get(LabelEnum.Host_Upload_Location).getText());
+ return super.onNextPressed();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/EclipseApplicationLaunchWidget.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/EclipseApplicationLaunchWidget.java
new file mode 100644
index 00000000000..5f45c6cef8d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/EclipseApplicationLaunchWidget.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.widgets;
+
+import java.io.File;
+import java.net.URL;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.jobs.EclipseApplicationLaunchJob;
+import org.eclipse.osee.framework.ui.service.control.jobs.TextDisplayHelper;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.JiniGroupSelector;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.ServiceItem;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+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.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;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EclipseApplicationLaunchWidget implements ILaunchWidget {
+
+ private Control control;
+ private ServiceLaunchingInformation serviceInfo;
+ private FormattedText serviceInfoText;
+ private FormattedText executionResultText;
+ private StyledText javaCompilerText;
+ private File latestPlugin;
+ private File localLocation;
+ private String javaCompiler;
+ private Shell shell;
+ private JiniGroupSelector groupSelector;
+ private TextDisplayHelper displayHelper;
+
+ public EclipseApplicationLaunchWidget(ServiceLaunchingInformation serviceInfo) {
+ this.serviceInfo = serviceInfo;
+ }
+
+ public void create(Composite parent) {
+ shell = parent.getShell();
+
+ SashForm composite = new SashForm(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.SASH_WIDTH = 3;
+ composite.setOrientation(SWT.VERTICAL);
+
+ Composite infoComposite = new Composite(composite, SWT.NONE);
+ infoComposite.setLayout(new GridLayout());
+ infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createControlsArea(infoComposite);
+ createJavaCompilerArea(infoComposite);
+
+ createExecutionArea(composite);
+
+ int[] weights = null;
+ if (false != serviceInfo.getServiceItem().isJiniGroupRequired()) {
+ groupSelector = new JiniGroupSelector();
+ groupSelector.createJiniGroupWidget(infoComposite);
+ weights = new int[] {4, 6};
+ } else {
+ weights = new int[] {4, 6};
+ }
+
+ composite.setWeights(weights);
+ control = composite;
+ displayHelper = new TextDisplayHelper(executionResultText);
+ }
+
+ private void createControlsArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText("Service Details");
+
+ serviceInfoText = new FormattedText(group, SWT.NONE, 100, 400, false);
+ refresh();
+ }
+
+ private void createExecutionArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText("Execution Log");
+
+ executionResultText = new FormattedText(group, SWT.NONE, 200, 400);
+ executionResultText.setTextAreaBackground(SWT.COLOR_WHITE);
+ executionResultText.getStyledText().setEditable(false);
+
+ Composite composite = new Composite(group, SWT.NONE);
+ composite.setLayout(new GridLayout(2, true));
+ composite.setLayoutData(new GridData(SWT.END, SWT.END, true, false));
+
+ Button clear = new Button(composite, SWT.NONE);
+ clear.setLayoutData(new GridData(SWT.END, SWT.END, false, false));
+ clear.setText("Clear");
+ clear.setToolTipText("Clear the execution status window");
+ clear.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ executionResultText.clearTextArea();
+ }
+
+ });
+
+ Button execute = new Button(composite, SWT.NONE);
+ execute.setLayoutData(new GridData(SWT.END, SWT.END, false, false));
+ execute.setText("Execute");
+ execute.setToolTipText("Executes service as an Eclipse Application");
+ execute.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ getEclipseInformation();
+ javaCompiler = javaCompilerText.getText();
+ if (null != groupSelector) {
+ serviceInfo.getServiceItem().setJiniGroup(groupSelector.getJiniGroupVmArg());
+ }
+ Job job =
+ new EclipseApplicationLaunchJob("Eclipse Application Launch", javaCompiler, latestPlugin,
+ serviceInfo, displayHelper);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ });
+ }
+
+ private void createJavaCompilerArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Select a java runtime location");
+
+ final String javaHome = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
+ javaCompiler = javaHome;
+
+ javaCompilerText = new StyledText(group, SWT.BORDER);
+ javaCompilerText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ javaCompilerText.setText(javaHome);
+
+ javaCompilerText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ javaCompiler = javaCompilerText.getText();
+ }
+ });
+
+ Button fileDialog = new Button(group, SWT.NONE);
+ fileDialog.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+ fileDialog.setImage(ControlPlugin.getInstance().getImage("file.gif"));
+ fileDialog.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog dialog = new FileDialog(shell, SWT.OPEN);
+
+ String defaultDir = javaCompilerText.getText();
+ File dir = new File(defaultDir);
+ if (dir.isFile() || dir.isDirectory())
+ dialog.setFilterPath(defaultDir);
+ else {
+ dialog.setFilterPath(javaHome);
+ }
+
+ dialog.setFilterExtensions(new String[] {"java"});
+
+ dialog.setFilterNames(new String[] {"java"});
+
+ String result = dialog.open();
+ if (result != null && !result.equals("")) {
+ javaCompilerText.setText(result);
+ javaCompiler = result;
+ }
+ }
+ });
+ }
+
+ private void getEclipseInformation() {
+ latestPlugin = null;
+ try {
+ Bundle bundle = Platform.getBundle(serviceInfo.getServiceItem().getPlugin());
+ URL url = bundle.getEntry("/");
+ URL resolvedURL = FileLocator.resolve(url);
+ latestPlugin = new File(resolvedURL.getFile());
+ } catch (Exception ex) {
+ if (executionResultText != null && !executionResultText.isDisposed()) {
+ executionResultText.addText(ControlPlugin.getStackMessages(ex) + "\n\n", SWT.NORMAL, SWT.COLOR_RED);
+ }
+ }
+
+ localLocation = new File(Platform.getInstallLocation().getURL().getFile());
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ public void dispose() {
+ if (control != null && !control.isDisposed()) {
+ control.dispose();
+ }
+ if (groupSelector != null) {
+ groupSelector.dispose();
+ }
+ displayHelper.disposeProcessHandling();
+ }
+
+ public void refresh() {
+ getEclipseInformation();
+ serviceInfoText.clearTextArea();
+
+ serviceInfoText.addText("\tService Name:\t", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ serviceInfoText.addText(serviceInfo.getServiceItem().getName() + "\n");
+ serviceInfoText.addText("\tPlugin:\t", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ serviceInfoText.addText((latestPlugin != null ? latestPlugin.toString() : "<Plugin Not Available>") + "\n");
+ serviceInfoText.addText("\tEclipse Install Location:\t", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+ serviceInfoText.addText(localLocation.toString() + "\n");
+ serviceInfoText.addText("\tExecution String:\t", SWT.BOLD, SWT.COLOR_DARK_BLUE, true);
+
+ String execString = serviceInfo.getServiceItem().getLocalExecution().replaceAll(ServiceItem.EXEC_SEPARATOR, " ");
+ execString = execString.replace("java", "<JAVA_COMPILER>");
+
+ serviceInfoText.addText(execString + "\n");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/ILaunchWidget.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/ILaunchWidget.java
new file mode 100644
index 00000000000..36103a3c029
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/ILaunchWidget.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.framework.ui.service.control.wizards.launcher.widgets;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ILaunchWidget {
+
+ void create(Composite parent);
+
+ void refresh();
+
+ Control getControl();
+
+ void dispose();
+}
diff --git a/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/StandAloneApplicationLaunchWidget.java b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/StandAloneApplicationLaunchWidget.java
new file mode 100644
index 00000000000..a699613ea82
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.service.control/src/org/eclipse/osee/framework/ui/service/control/wizards/launcher/widgets/StandAloneApplicationLaunchWidget.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.service.control.wizards.launcher.widgets;
+
+import java.io.File;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.ui.service.control.ControlPlugin;
+import org.eclipse.osee.framework.ui.service.control.jobs.StandAloneApplicationLaunchJob;
+import org.eclipse.osee.framework.ui.service.control.jobs.TextDisplayHelper;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchWizard;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.ServiceLaunchingInformation;
+import org.eclipse.osee.framework.ui.service.control.wizards.launcher.data.JiniGroupSelector;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+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.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.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StandAloneApplicationLaunchWidget implements ILaunchWidget {
+
+ private Control control;
+ private StyledText scriptOutputText;
+ private StyledText javaCompilerText;
+ private ServiceLaunchingInformation serviceInfo;
+ // private ServiceLaunchWizard wizard;
+ private Shell shell;
+ private FormattedText cmdText;
+ private String localUnzipLocation;
+ private String javaCompiler;
+ private ProgressBar progress;
+ private JiniGroupSelector groupSelector;
+ private TextDisplayHelper displayHelper;
+
+ public StandAloneApplicationLaunchWidget(ServiceLaunchingInformation serviceInfo, ServiceLaunchWizard wizard) {
+ this.serviceInfo = serviceInfo;
+ // this.wizard = wizard;
+ this.localUnzipLocation = "";
+ this.javaCompiler = "";
+ }
+
+ public void create(Composite parent) {
+ shell = parent.getShell();
+ SashForm composite = new SashForm(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.SASH_WIDTH = 3;
+ composite.setOrientation(SWT.VERTICAL);
+
+ Composite infoComposite = new Composite(composite, SWT.NONE);
+ infoComposite.setLayout(new GridLayout());
+ infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createStandaloneComponents(infoComposite);
+ createJavaCompilerArea(infoComposite);
+
+ createExecutionArea(composite);
+
+ int[] weights = null;
+ if (false != serviceInfo.getServiceItem().isJiniGroupRequired()) {
+ groupSelector = new JiniGroupSelector();
+ groupSelector.createJiniGroupWidget(infoComposite);
+ weights = new int[] {4, 6};
+ } else {
+ weights = new int[] {3, 7};
+ }
+ composite.setWeights(weights);
+
+ control = composite;
+ displayHelper = new TextDisplayHelper(cmdText);
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ private void createExecutionArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText("Execution Log");
+
+ cmdText = new FormattedText(group, SWT.NONE, 200, 400);
+ cmdText.setTextAreaBackground(SWT.COLOR_WHITE);
+ cmdText.getStyledText().setEditable(false);
+
+ Composite composite = new Composite(group, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ progress = new ProgressBar(composite, SWT.HORIZONTAL);
+ progress.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ progress.setEnabled(true);
+ progress.setMinimum(0);
+ progress.setMaximum(20);
+ progress.setSelection(0);
+
+ Composite buttonComposite = new Composite(composite, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout(2, true));
+ buttonComposite.setLayoutData(new GridData(SWT.END, SWT.END, false, false));
+
+ Button clear = new Button(buttonComposite, SWT.NONE);
+ clear.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ clear.setText("Clear");
+ clear.setToolTipText("Clear the execution status window");
+ clear.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ cmdText.clearTextArea();
+ progress.setSelection(0);
+ }
+ });
+
+ Button execute = new Button(buttonComposite, SWT.NONE);
+ execute.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ execute.setText("Execute");
+ execute.setToolTipText("Execute the application");
+ execute.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ File localLocation =
+ new File(
+ localUnzipLocation + File.separator + serviceInfo.getServiceItem().getPlugin() + File.separator);
+ javaCompiler = javaCompilerText.getText();
+ if (null != groupSelector) {
+ serviceInfo.getServiceItem().setJiniGroup(groupSelector.getJiniGroupVmArg());
+ }
+ Job job =
+ new StandAloneApplicationLaunchJob("Launch Stand Alone Application", javaCompiler,
+ localLocation, serviceInfo, displayHelper, progress);
+ job.setUser(true);
+ job.setPriority(Job.LONG);
+ job.schedule();
+ }
+ });
+ }
+ });
+ }
+
+ private void createStandaloneComponents(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Select a location in the local file system to launch the Application");
+
+ final String homedir = System.getProperty("user.home") + File.separator + "oseeservices";
+ localUnzipLocation = homedir;
+
+ scriptOutputText = new StyledText(group, SWT.BORDER);
+ scriptOutputText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ scriptOutputText.setText(homedir);
+
+ scriptOutputText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ localUnzipLocation = scriptOutputText.getText();
+ }
+ });
+
+ Button fileDialog = new Button(group, SWT.NONE);
+ fileDialog.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+ fileDialog.setImage(ControlPlugin.getInstance().getImage("file.gif"));
+ fileDialog.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dialog = new DirectoryDialog(shell, SWT.OPEN);
+ String defaultDir = scriptOutputText.getText();
+ File dir = new File(defaultDir);
+ if (dir.isFile() || dir.isDirectory())
+ dialog.setFilterPath(defaultDir);
+ else {
+ dialog.setFilterPath(homedir);
+ }
+
+ String result = dialog.open();
+ if (result != null && !result.equals("")) {
+ scriptOutputText.setText(result);
+ localUnzipLocation = result;
+ }
+ }
+ });
+ }
+
+ private void createJavaCompilerArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Select a java compiler location");
+
+ final String javaHome = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
+ javaCompiler = javaHome;
+
+ javaCompilerText = new StyledText(group, SWT.BORDER);
+ javaCompilerText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ javaCompilerText.setText(javaHome);
+
+ javaCompilerText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ javaCompiler = javaCompilerText.getText();
+ }
+ });
+
+ Button fileDialog = new Button(group, SWT.NONE);
+ fileDialog.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+ fileDialog.setImage(ControlPlugin.getInstance().getImage("file.gif"));
+ fileDialog.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog dialog = new FileDialog(shell, SWT.OPEN);
+
+ String defaultDir = javaCompilerText.getText();
+ File dir = new File(defaultDir);
+ if (dir.isFile() || dir.isDirectory())
+ dialog.setFilterPath(defaultDir);
+ else {
+ dialog.setFilterPath(javaHome);
+ }
+
+ dialog.setFilterExtensions(new String[] {"java"});
+
+ dialog.setFilterNames(new String[] {"java"});
+
+ String result = dialog.open();
+ if (result != null && !result.equals("")) {
+ javaCompilerText.setText(result);
+ javaCompiler = result;
+ }
+ }
+ });
+ }
+
+ public void dispose() {
+ if (scriptOutputText != null && !scriptOutputText.isDisposed()) {
+ scriptOutputText.dispose();
+ }
+ if (control != null && !control.isDisposed()) {
+ control.dispose();
+ }
+ if (groupSelector != null) {
+ groupSelector.dispose();
+ }
+ displayHelper.disposeProcessHandling();
+ }
+
+ public void refresh() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/.classpath b/org.eclipse.osee.framework.ui.skynet.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.skynet.test/.options b/org.eclipse.osee.framework.ui.skynet.test/.options
new file mode 100644
index 00000000000..baf238d1c28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/.options
@@ -0,0 +1,3 @@
+org.eclipse.osee.framework.ui.skynet.test/debug = false
+
+org.eclipse.osee.framework.ui.skynet.test/debug/Junit = false \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet.test/.project b/org.eclipse.osee.framework.ui.skynet.test/.project
new file mode 100644
index 00000000000..149ad88299b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.skynet.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.skynet.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.skynet.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..0b84035eb4d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Aug 25 08:58:52 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.skynet.test/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.skynet.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..fb008793224
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Fragment
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.skynet.test;singleton:=true
+Bundle-Version: 1.0.0
+Fragment-Host: org.eclipse.osee.framework.ui.skynet
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.osee.framework.ui.skynet.test,
+ org.eclipse.osee.framework.ui.skynet.test.cases
+Require-Bundle: org.eclipse.osee.support.test.util;bundle-version="1.0.0"
diff --git a/org.eclipse.osee.framework.ui.skynet.test/build.properties b/org.eclipse.osee.framework.ui.skynet.test/build.properties
new file mode 100644
index 00000000000..aed1551c5ed
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ src/
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/.options b/org.eclipse.osee.framework.ui.skynet.test/src/.options
new file mode 100644
index 00000000000..f7546de6525
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/.options
@@ -0,0 +1,3 @@
+org.eclipse.osee.framework.ui.skynet.test/debug = false
+
+org.eclipse.osee.framework.ui.skynet.test/debug/Junit = false
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Demo_Suite.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Demo_Suite.java
new file mode 100644
index 00000000000..36c61d01a3b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Demo_Suite.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.framework.ui.skynet.test;
+
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.ui.skynet.test.cases.InterArtifactDropTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.PreviewAndMultiPreviewTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.ViewWordChangeAndDiffTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.WordEditTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.WordTrackedChangesTest;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {InterArtifactDropTest.class, WordEditTest.class, WordTrackedChangesTest.class,
+ PreviewAndMultiPreviewTest.class, ViewWordChangeAndDiffTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkUi_Demo_Suite {
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertTrue("Demo Application Server must be running.",
+ ClientSessionManager.getAuthenticationProtocols().contains("demo"));
+ assertTrue("Client must authenticate using demo protocol",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Production_Suite.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Production_Suite.java
new file mode 100644
index 00000000000..161e2ec6903
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_Production_Suite.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.framework.ui.skynet.test;
+
+import org.eclipse.osee.framework.ui.skynet.test.cases.DatabaseIntegrityTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.FrameworkImageTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {FrameworkImageTest.class, DatabaseIntegrityTest.class})
+//Suite.SuiteClasses( {ImageManagerTest.class, DatabaseIntegrityTest.class, OseeEmailTest.class})
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkUi_Production_Suite {
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_TestDb_Suite.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_TestDb_Suite.java
new file mode 100644
index 00000000000..29974dd3a2d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/FrameworkUi_TestDb_Suite.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.framework.ui.skynet.test;
+
+import org.eclipse.osee.framework.ui.skynet.test.cases.PreviewAndMultiPreviewTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.ViewWordChangeAndDiffTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.WordEditTest;
+import org.eclipse.osee.framework.ui.skynet.test.cases.WordTrackedChangesTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {WordEditTest.class, WordTrackedChangesTest.class, PreviewAndMultiPreviewTest.class,
+ ViewWordChangeAndDiffTest.class})
+/**
+ * @author Megumi Telles
+ */
+public class FrameworkUi_TestDb_Suite {
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/DatabaseIntegrityTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/DatabaseIntegrityTest.java
new file mode 100644
index 00000000000..96d1eab8e61
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/DatabaseIntegrityTest.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.framework.ui.skynet.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation;
+import org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOpsExtensionManager;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * @author Roberto E. Escobar
+ */
+@RunWith(Parameterized.class)
+public class DatabaseIntegrityTest {
+
+ private final String operationId;
+
+ public DatabaseIntegrityTest(String operationId) {
+ this.operationId = operationId;
+ }
+
+ @Test(timeout = 3000)
+ public void testDatabaseIntegrity() {
+ DatabaseHealthOperation operation = DatabaseHealthOpsExtensionManager.getVerifyOperationByName(operationId);
+
+ assertNotNull(operation);
+
+ operation.setShowDetailsEnabled(false);
+ operation.setFixOperationEnabled(false);
+ Operations.executeWork(operation, new NullProgressMonitor(), -1);
+ assertEquals(String.format("Error [%s]: [%s]", operation.getName(), operation.getStatus().getMessage()),
+ IStatus.OK, operation.getStatus().getSeverity());
+
+ int totalItemsToFix = operation.getItemsToFixCount();
+ assertEquals(String.format("Error [%s]: found [%s] items", operation.getName(), totalItemsToFix), 0,
+ totalItemsToFix);
+
+ }
+
+ @Parameters
+ public static Collection<Object[]> data() {
+ Collection<Object[]> data = new ArrayList<Object[]>();
+
+ for (String verifyOpId : DatabaseHealthOpsExtensionManager.getVerifyOperationNames()) {
+ if (Strings.isValid(verifyOpId)) {
+ data.add(new Object[] {verifyOpId});
+ }
+ }
+ return data;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/FrameworkImageTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/FrameworkImageTest.java
new file mode 100644
index 00000000000..181f7412102
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/FrameworkImageTest.java
@@ -0,0 +1,23 @@
+/*
+ * Created on Jun 15, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.test.cases;
+
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkImageTest extends ImageManagerTest {
+
+ /**
+ * @param imageClassName
+ * @param oseeImages
+ */
+ public FrameworkImageTest() {
+ super("FrameworkImage", FrameworkImage.values());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ImageManagerTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ImageManagerTest.java
new file mode 100644
index 00000000000..abb79c4773f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ImageManagerTest.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.test.cases;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.support.test.util.TestUtil;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class ImageManagerTest {
+
+ private final OseeImage[] oseeImages;
+ private final String imageClassName;
+
+ public ImageManagerTest(String imageClassName, OseeImage[] oseeImages) {
+ this.imageClassName = imageClassName;
+ this.oseeImages = oseeImages;
+ }
+
+ /**
+ * Test that image that is not found, returns MISSING image
+ *
+ * @throws Exception
+ */
+ @org.junit.Test
+ public void testFrameworkImageMissing() throws Exception {
+ assertEquals(ImageManager.getImage(MissingImage.ACCEPT), ImageManager.getImage(FrameworkImage.MISSING));
+ }
+
+ /**
+ * Test that all image enums have associated immage files. (Non return missing image)
+ *
+ * @throws Exception
+ */
+ @org.junit.Test
+ public void testFrameworkImageEnums() throws Exception {
+ StringBuffer sb = new StringBuffer();
+ for (OseeImage oseeImage : oseeImages) {
+ if (oseeImage == FrameworkImage.MISSING) continue;
+ assertNotNull(String.format("[%s] Image not defined for [%s]", imageClassName, oseeImage),
+ ImageManager.getImage(oseeImage));
+ if (ImageManager.getImage(oseeImage).equals(ImageManager.getImage(FrameworkImage.MISSING))) {
+ sb.append(String.format("\n[%s] Image not defined for [%s]", imageClassName, oseeImage));
+ }
+ }
+ assertEquals("", sb.toString());
+ }
+
+ @org.junit.Test
+ public void testGetImageByType() throws Exception {
+ assertTrue("Image returned not a folder image.",
+ ImageManager.getImage(ArtifactTypeManager.getType("Folder")).equals(
+ ImageManager.getImage(FrameworkImage.FOLDER)));
+
+ }
+
+ @org.junit.Test
+ public void testGetImageByArtifact() throws Exception {
+ Artifact folder =
+ ArtifactQuery.getArtifactFromTypeAndName("Folder", "User Groups", BranchManager.getCommonBranch());
+ assertTrue("Image returned not a folder image.", ImageManager.getImage(folder).equals(
+ ImageManager.getImage(FrameworkImage.FOLDER)));
+ }
+
+ @org.junit.Test
+ public void testSetArtifactTypeImageInDb() throws Exception {
+
+ Artifact folder =
+ ArtifactQuery.getArtifactFromTypeAndName("Folder", "User Groups", BranchManager.getCommonBranch());
+
+ // Check folder image
+ assertTrue("Image returned not a \"Folder\" image.", ImageManager.getImage(folder).equals(
+ ImageManager.getImage(FrameworkImage.FOLDER)));
+
+ // Set different image for folder
+ ImageManager.setArtifactTypeImageInDb(ArtifactTypeManager.getType("Folder"),
+ getByteArrayInputStream("heading.gif"));
+
+ // Test that different image overrides folder image
+ assertFalse("Image returned should be \"Heading\" image.", ImageManager.getImage(folder).equals(
+ ImageManager.getImage(FrameworkImage.FOLDER)));
+
+ // Clear db image
+ ImageManager.setArtifactTypeImageInDb(ArtifactTypeManager.getType("Folder"), null);
+
+ // Reload cache
+ ImageManager.loadCache();
+ TestUtil.sleep(2000);
+
+ // Test that folder image is back
+ assertTrue("Image returned not a \"Folder\" image.", ImageManager.getImage(folder).equals(
+ ImageManager.getImage(FrameworkImage.FOLDER)));
+ }
+
+ public static ByteArrayInputStream getByteArrayInputStream(String imageFilename) throws Exception {
+ File imageFile = SkynetGuiPlugin.getInstance().getPluginFile("images/" + imageFilename);
+ if (!imageFile.exists()) {
+ throw new OseeArgumentException("Invalid image filename.");
+ }
+ return new ByteArrayInputStream(Lib.inputStreamToBytes(new FileInputStream(imageFile)));
+ }
+
+ public enum MissingImage implements OseeImage {
+ ACCEPT("nothere.gif");
+
+ private final String fileName;
+
+ private MissingImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(SkynetGuiPlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageKey()
+ */
+ @Override
+ public String getImageKey() {
+ return SkynetGuiPlugin.PLUGIN_ID + "." + fileName;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/InterArtifactDropTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/InterArtifactDropTest.java
new file mode 100644
index 00000000000..dde7a19c58e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/InterArtifactDropTest.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.framework.ui.skynet.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.update.InterArtifactExplorerDropHandler;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * Tests cross branch drag and drop.
+ *
+ * @author Jeff C. Phillips
+ */
+public class InterArtifactDropTest {
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet.test/debug/Junit"));
+ private static Artifact sourceArtifact;
+ private Branch sourceBranch;
+ private Branch destinationBranch;
+
+ @After
+ public void tearDown() throws Exception {
+ BranchManager.purgeBranch(sourceBranch);
+ BranchManager.purgeBranch(destinationBranch);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ assertFalse("This test can not be run on Production", ClientSessionManager.isProductionDataStore());
+
+ String sourceBranchName = "Source Branch" + GUID.generateGuidStr();
+ String destinationBranchName = "Destination Branch" + GUID.generateGuidStr();
+
+ sourceBranch =
+ BranchManager.createWorkingBranch(BranchManager.getSystemRootBranch(), sourceBranchName,
+ UserManager.getUser(SystemUser.OseeSystem));
+ sleep(5000);
+
+ sourceArtifact = ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, sourceBranch);
+ sourceArtifact.persistAttributes();
+
+ destinationBranch =
+ BranchManager.createWorkingBranch(BranchManager.getSystemRootBranch(), destinationBranchName,
+ UserManager.getUser(SystemUser.OseeSystem));
+
+ sleep(5000);
+ }
+
+ @org.junit.Test
+ public void testIntroduceCrossBranch() throws Exception {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+
+ InterArtifactExplorerDropHandler dropHandler = new InterArtifactExplorerDropHandler();
+ dropHandler.dropArtifactIntoDifferentBranch(
+ ArtifactQuery.getDefaultHierarchyRootArtifact(destinationBranch, true), new Artifact[] {sourceArtifact},
+ false);
+
+ sleep(5000);
+ //Acquire the introduced artifact
+ Artifact destArtifact = ArtifactQuery.getArtifactFromId(sourceArtifact.getArtId(), destinationBranch);
+
+ assertTrue(sourceArtifact.getDescriptiveName().equals(destArtifact.getDescriptiveName()));
+ }
+
+ public static void sleep(long milliseconds) throws Exception {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, "Sleeping " + milliseconds);
+ Thread.sleep(milliseconds);
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, "Awake");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/OseeEmailTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/OseeEmailTest.java
new file mode 100644
index 00000000000..5fe011058eb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/OseeEmailTest.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.framework.ui.skynet.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.util.Date;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.windows.OutlookCalendarEvent;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail.BodyType;
+import org.junit.Before;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeEmailTest {
+
+ public static String emailAddress = null;
+ public static final StringBuffer results = new StringBuffer();
+ private static String infoStr =
+ "\n\nOseeEmailTest: This test will send 3 emails. If you do not receive 3, the test failed.";
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ if (emailAddress == null) {
+ ArtifactEditor.editArtifact(UserManager.getUser());
+ emailAddress = UserManager.getUser().getEmail();
+ assertFalse("Invalid email address " + emailAddress + " for user " + UserManager.getUser(),
+ emailAddress.contains("\\@"));
+ }
+ }
+
+ @org.junit.Test
+ public void testTextEmail() throws Exception {
+ final String TEST_NAME = "Email Test 1/3 - Text Body";
+ OseeEmail emailMessage =
+ new OseeEmail(emailAddress, TEST_NAME, "Hello World - this is text only" + infoStr, BodyType.Text);
+ emailMessage.send();
+ System.out.println(TEST_NAME + " sent to \"" + emailAddress + "\"");
+ }
+
+ @org.junit.Test
+ public void testHtmlEmail() throws Exception {
+ final String TEST_NAME = "Email Test 2/3 - Html Body";
+ OseeEmail emailMessage =
+ new OseeEmail(emailAddress, TEST_NAME,
+ AHTML.simplePage(AHTML.bold("Hello World - this should be bold" + infoStr)), BodyType.Html);
+ emailMessage.send();
+ System.out.println(TEST_NAME + " sent to \"" + emailAddress + "\"");
+ }
+
+ @org.junit.Test
+ public void testAttachementEmail() throws Exception {
+ final String TEST_NAME = "Email Test 3/3 - with Outlook Attachment";
+ OseeEmail emailMessage = new OseeEmail(emailAddress, TEST_NAME, TEST_NAME + "\n\nTesting the attachment\n" +
+ //
+ "1) Double-click open attachment opens calendar event dialog\n" +
+ //
+ "2) Verify Time 8am - 1pm\n" +
+ //
+ "3) Verify date (today)\n" +
+ //
+ "4) Verify location: Conference Room\n" +
+ //
+ "5) Verify subject is name of this test" + infoStr, BodyType.Text);
+ String context = new OutlookCalendarEvent("Conference Room", TEST_NAME, new Date(), "0800", "1300").getEvent();
+ emailMessage.addAttachment(context, "schedule class.vcs");
+ emailMessage.send();
+ System.out.println(TEST_NAME + " sent to \"" + emailAddress + "\"");
+ }
+
+ /**
+ * This test only exists to report the results of the email tests above
+ *
+ * @throws Exception
+ */
+ @org.junit.Test
+ public void testReportResults() throws Exception {
+ if (!results.toString().equals("")) {
+ System.err.println(results.toString());
+ assertTrue(false);
+ } else {
+ assertTrue(true);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/PreviewAndMultiPreviewTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/PreviewAndMultiPreviewTest.java
new file mode 100644
index 00000000000..7a3890f7b1e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/PreviewAndMultiPreviewTest.java
@@ -0,0 +1,333 @@
+/*
+ * Created on Jun 5, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.test.util.FrameworkTestUtil;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.PreviewWithChildWordHandler;
+import org.eclipse.osee.framework.ui.skynet.render.FileRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.ITemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WholeDocumentRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author Megumi Telles
+ */
+public class PreviewAndMultiPreviewTest {
+ private static List<Artifact> artifacts = new ArrayList<Artifact>();
+ private static Artifact newArt;
+ private static SevereLoggingMonitor monitorLog = null;
+ private static Branch branch;
+ private static boolean isWordRunning = false;
+
+ @Before
+ public void setUp() throws Exception {
+ assertFalse("Not to be run on production datbase.", TestUtil.isProductionDb());
+ isWordRunning = FrameworkTestUtil.areWinWordsRunning();
+ assertTrue(
+ "This test kills all Word Documents. Cannot continue due to existing open Word Documents." + " Please save and close existing Word Documents before running this test.",
+ isWordRunning == false);
+ init();
+ }
+
+ private void init() throws Exception {
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ PreviewAndMultiPreviewTest.class.getSimpleName());
+ FileRenderer.setWorkbenchSavePopUpDisabled(true);
+ branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name());
+ // create a new requirement artifact
+ newArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ PreviewAndMultiPreviewTest.class.getSimpleName());
+ newArt.persistAttributesAndRelations();
+ artifacts = Arrays.asList(newArt);
+ }
+
+ /*
+ * Preview Requirements Artifact (includes a child artifact == general document but should not invoke a
+ * warning since only previewing (no recurse)).
+ */
+ @org.junit.Test
+ public void testPreview() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ Artifact childArt =
+ ArtifactTypeManager.addArtifact("General Document", branch, getClass().getSimpleName() + "1");
+ newArt.addChild(childArt);
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.setOptions(null);
+ renderer.preview(artifacts);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ @org.junit.Test
+ public void testPreviewUsingRendererManager() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ Artifact childArt =
+ ArtifactTypeManager.addArtifact("General Document", branch, getClass().getSimpleName() + "1");
+ newArt.addChild(childArt);
+ RendererManager.previewInJob(artifacts);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ /*
+ * Preview Requirements Artifact with valid children.
+ */
+ @org.junit.Test
+ public void testPreviewWithChildren() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ Artifact childArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "1");
+ newArt.addChild(childArt);
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.setOptions(new VariableMap(ITemplateRenderer.PREVIEW_WITH_RECURSE_OPTION_PAIR));
+ renderer.preview(artifacts);
+ // should get one warning since the child is a general document
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ @org.junit.Test
+ public void testPreviewWithChildrenUsingRendererManager() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ Artifact childArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "1");
+ newArt.addChild(childArt);
+ RendererManager.previewInJob(artifacts);
+ // should get one warning since the child is a general document
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ @org.junit.Test
+ public void testPreviewWithChildrenFault() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ Artifact childArt =
+ ArtifactTypeManager.addArtifact("General Document", branch, getClass().getSimpleName() + "1");
+ newArt.addChild(childArt);
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.setOptions(new VariableMap(ITemplateRenderer.PREVIEW_WITH_RECURSE_OPTION_PAIR));
+ renderer.preview(artifacts);
+ // should get one warning since the child is a general document
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 1);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).get(0).getMessage().contains(
+ "You chose to preview/edit artifacts that could not be handled"));
+ assertTrue(TestUtil.getNumberOfLogsAtLevel(monitorLog, Level.SEVERE) == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ /*
+ * No warning expected in this fault case because the Renderer Manager resolves which
+ * render to use to preview.
+ */
+ @org.junit.Test
+ public void testPreviewWithChildrenUsingRendererManagerFault() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ Artifact childArt =
+ ArtifactTypeManager.addArtifact("General Document", branch, getClass().getSimpleName() + "1");
+ newArt.addChild(childArt);
+ RendererManager.previewInJob(artifacts);
+ // should get one warning since the child is a general document
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ /*
+ * Preview multiple Requirement Artifacts
+ */
+ @org.junit.Test
+ public void testMultiPreview() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ List<Artifact> newMultiArts = new ArrayList<Artifact>();
+ Artifact multiArt1 =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "3");
+ Artifact multiArt2 =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "2");
+ Artifact multiArt3 =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "1");
+ newMultiArts = Arrays.asList(multiArt1, multiArt2, multiArt3);
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.setOptions(null);
+ renderer.preview(newMultiArts);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ @org.junit.Test
+ public void testMultiPreviewUsingRendererManager() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ List<Artifact> newMultiArts = new ArrayList<Artifact>();
+ Artifact multiArt1 =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "3");
+ Artifact multiArt2 =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "2");
+ Artifact multiArt3 =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch,
+ getClass().getSimpleName() + "1");
+ newMultiArts = Arrays.asList(multiArt1, multiArt2, multiArt3);
+ RendererManager.previewInJob(artifacts);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Preview with children test failed.");
+ }
+ } else {
+ fail("Preview with children test failed. There were no artifacts to preview.");
+ }
+ }
+
+ /*
+ * Preview a whole word doc
+ */
+ @org.junit.Test
+ public void testWholeWordPreview() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ List<Artifact> arts = new ArrayList<Artifact>();
+ Artifact art =
+ ArtifactTypeManager.addArtifact("Test Procedure WML", branch, getClass().getSimpleName() + "4");
+ arts = Arrays.asList(art);
+ WholeDocumentRenderer renderer = new WholeDocumentRenderer();
+ renderer.setOptions(null);
+ renderer.preview(arts);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Whole Word Preview test failed.");
+ }
+ } else {
+ fail("Whoile Word Test failed.");
+ }
+ }
+
+ @org.junit.Test
+ public void testWholeWordPreviewUsingRendererManager() throws Exception {
+ if (!artifacts.isEmpty()) {
+ try {
+ monitorLog = TestUtil.severeLoggingStart();
+ List<Artifact> arts = new ArrayList<Artifact>();
+ Artifact art =
+ ArtifactTypeManager.addArtifact("Test Procedure WML", branch, getClass().getSimpleName() + "4");
+ arts = Arrays.asList(art);
+ RendererManager.previewInJob(artifacts);
+ assertTrue(monitorLog.getLogsAtLevel(Level.WARNING).size() == 0);
+ assertTrue(monitorLog.getLogsAtLevel(Level.SEVERE).size() == 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ fail("Whole Word Preview test failed.");
+ }
+ } else {
+ fail("Whoile Word Test failed.");
+ }
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (!isWordRunning) {
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ PreviewAndMultiPreviewTest.class.getSimpleName());
+ TestUtil.severeLoggingEnd(monitorLog);
+ Thread.sleep(7000);
+ FrameworkTestUtil.killAllOpenWinword();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ViewWordChangeAndDiffTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ViewWordChangeAndDiffTest.java
new file mode 100644
index 00000000000..ebe1ae5ce39
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/ViewWordChangeAndDiffTest.java
@@ -0,0 +1,211 @@
+/*
+ * Created on Jun 9, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.test.cases;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import static org.eclipse.osee.framework.core.enums.ModificationType.NEW;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.status.EmptyMonitor;
+import org.eclipse.osee.framework.skynet.core.test.util.FrameworkTestUtil;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author Megumi Telles
+ */
+public class ViewWordChangeAndDiffTest {
+ private boolean isWordRunning = false;
+ private Collection<Change> artifactChanges = new ArrayList<Change>();
+ private ArrayList<Artifact> baseArtifacts = new ArrayList<Artifact>();
+ private ArrayList<Artifact> newerArtifacts = new ArrayList<Artifact>();
+ private ArrayList<Artifact> artifacts = new ArrayList<Artifact>();
+ private Artifact baseArtifact = null;
+ private Artifact newerArtifact = null;
+ private VariableMap variableMap = new VariableMap();
+ private Artifact instanceOfArtifact = null;
+ private String fileName = null;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ assertFalse("Not to be run on production database.", TestUtil.isProductionDb());
+ isWordRunning = false;
+ isWordRunning = FrameworkTestUtil.areWinWordsRunning();
+ assertTrue(
+ "This test kills all Word Documents. Cannot continue due to existing open Word Documents." + " Please save and close existing Word Documents before running this test.",
+ isWordRunning == false);
+ }
+
+ @org.junit.Test
+ public void testViewWordChangeReport() throws Exception {
+ Branch theBranch;
+ // get the changes on the specified branch
+ if (BranchManager.branchExists(DemoSawBuilds.SAW_Bld_2.name())) {
+ theBranch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_2.name());
+ } else {
+ theBranch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name());
+ }
+ artifactChanges = ChangeManager.getChangesPerBranch(theBranch, new EmptyMonitor());
+ // get the artifacts from the changed list
+ artifacts = getArtifacts();
+ // make sure permissions are right
+ assertTrue("Valid object permissions", (AccessControlManager.getInstance().checkObjectListPermission(artifacts,
+ PermissionEnum.READ)));
+ // initialize the lists for the test
+ initializeViewChangeReportBaseAndNewArtifacts();
+ Artifact bArtifact = baseArtifacts.iterator().next();
+ Artifact nArtifact = newerArtifacts.iterator().next();
+ instanceOfArtifact = bArtifact != null ? bArtifact : nArtifact;
+ // set up renderer and compare
+ viewWordChangeCompareArtifacts();
+ // if we get here there were no exceptions on the compare considered successful
+ assertTrue("View Word Change Report test passed", true);
+ }
+
+ @org.junit.Test
+ public void testSingleNativeDiff() throws Exception {
+ artifactChanges =
+ ChangeManager.getChangesPerBranch(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ new EmptyMonitor());
+ // get the artifacts from the changed list
+ artifacts = getArtifacts();
+ // make sure permissions are right
+ assertTrue("Valid object permissions", (AccessControlManager.checkObjectPermission(
+ artifactChanges.iterator().next().getArtifact(), PermissionEnum.READ)));
+ initializeBaseAndNewArtifact(artifactChanges.iterator().next());
+ singleNativeDiff(baseArtifact, newerArtifact);
+ // if we get here there were no exceptions on the diff considered successful
+ assertTrue("Single Native Diff test passed", true);
+ }
+
+ @org.junit.Test
+ public void testCompareTwoArtifacts() throws Exception {
+ try {
+ artifactChanges =
+ ChangeManager.getChangesPerBranch(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ new EmptyMonitor());
+ // get the artifacts from the changed list
+ artifacts = getArtifacts();
+ newerArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(artifacts.get(0).getArtId(),
+ artifacts.get(0).getTransactionId());
+ baseArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(artifacts.get(1).getArtId(),
+ artifacts.get(1).getTransactionId());
+ RendererManager.diffInJob(baseArtifact, newerArtifact);
+ // if we get here there were no exceptions on the diff considered successful
+ assertTrue("Compare Two Artifacts test passed", true);
+ } catch (Exception ex) {
+ fail("Compare Two Artifacts test failed");
+ throw ex;
+ }
+
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ if (!isWordRunning) {
+ Thread.sleep(7000);
+ FrameworkTestUtil.killAllOpenWinword();
+ }
+ }
+
+ private ArrayList<Artifact> getArtifacts() throws ArtifactDoesNotExist {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ for (Change artifactChange : artifactChanges) {
+ arts.add(artifactChange.getArtifact());
+ }
+ return arts;
+ }
+
+ private void initializeViewChangeReportBaseAndNewArtifacts() {
+ for (Change artifactChange : artifactChanges) {
+ try {
+ initializeBaseAndNewArtifact(artifactChange);
+ } catch (OseeCoreException ex1) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex1);
+ fail("Initialization of base and new artifacts failed");
+ }
+ }
+ }
+
+ private void initializeBaseAndNewArtifact(Change artifactChange) throws ArtifactDoesNotExist, OseeCoreException {
+ baseArtifact =
+ (artifactChange.getModificationType() == NEW || artifactChange.getModificationType() == ModificationType.INTRODUCED) ? null : ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getFromTransactionId());
+
+ newerArtifact =
+ artifactChange.getModificationType() == DELETED ? null : (artifactChange.isHistorical() ? ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getToTransactionId()) : artifactChange.getArtifact());
+
+ baseArtifacts.add(baseArtifact);
+ newerArtifacts.add(newerArtifact);
+
+ if (fileName == null) {
+ if (artifactChanges.size() == 1) {
+ fileName = baseArtifact != null ? baseArtifact.getSafeName() : newerArtifact.getSafeName();
+ } else {
+ fileName =
+ baseArtifact != null ? baseArtifact.getBranch().getBranchShortName() : newerArtifact.getBranch().getBranchShortName();
+ }
+ variableMap.setValue("fileName", fileName + "_" + (new Date()).toString().replaceAll(":", ";") + ".xml");
+ }
+ }
+
+ private void viewWordChangeCompareArtifacts() {
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ try {
+ renderer.setOptions(variableMap);
+ renderer.compareArtifacts(baseArtifacts, newerArtifacts, new NullProgressMonitor(),
+ instanceOfArtifact.getBranch(), PresentationType.DIFF);
+ } catch (OseeCoreException e) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, e);
+ fail("View Word Change Report test failed");
+ }
+ }
+
+ private void singleNativeDiff(Artifact baseArtifact, Artifact newerArtifact) {
+ try {
+ RendererManager.diff(baseArtifact, newerArtifact, true);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ fail("Single Native Diff test failed.");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordEditTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordEditTest.java
new file mode 100644
index 00000000000..f70431506f3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordEditTest.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.test.util.FrameworkTestUtil;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.render.FileRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author Paul K. Waldfogel
+ * @author Megumi Telles
+ */
+public class WordEditTest {
+
+ private static final String TEST_PATH_NAME =
+ "../org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/";
+ private static final String TEST_WORD_EDIT_FILE_NAME = TEST_PATH_NAME + "WordEditTest.xml";
+ private static InputStream inputStream;
+ private boolean isWordRunning = false;
+
+ /**
+ * This test Word Edit's are being saved.
+ */
+ @Before
+ public void setUp() throws Exception {
+ assertFalse("Not to be run on production datbase.", TestUtil.isProductionDb());
+ isWordRunning = false;
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ getClass().getSimpleName());
+ isWordRunning = FrameworkTestUtil.areWinWordsRunning();
+ assertTrue(
+ "This test kills all Word Documents. Cannot continue due to existing open Word Documents." + " Please save and close existing Word Documents before running this test.",
+ isWordRunning == false);
+ }
+
+ @org.junit.Test
+ public void testEditUsingWord() throws Exception {
+ // use word template renderer
+ probeWordEditingCapability(false, getClass().getSimpleName());
+ // use renderer manager
+ probeWordEditingCapability(true, getClass().getSimpleName());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (!isWordRunning) {
+ WordAttribute.setDisplayTrackedChangesErrorMessage("");
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ getClass().getSimpleName());
+ FrameworkTestUtil.killAllOpenWinword();
+ }
+ }
+
+ public static String convertStreamToString(InputStream is) {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ StringBuilder sb = new StringBuilder();
+ String line = null;
+ try {
+ while ((line = reader.readLine()) != null) {
+ sb.append(line + "\n");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return sb.toString();
+ }
+
+ public static List<Artifact> getArtifactsToChange(Branch branch) throws OseeCoreException {
+ List<Artifact> arts = new ArrayList<Artifact>();
+ Collection<Change> changes = ChangeManager.getChangesPerBranch(branch, null);
+ for (Change change : changes) {
+ Artifact art = change.getArtifact();
+ if (art.isOfType(Requirements.ABSTRACT_SOFTWARE_REQUIREMENT)) {
+ arts.add(art);
+ }
+ }
+ return arts;
+ }
+
+ public static WordTemplateRenderer openArtifacts(List<Artifact> artifacts) throws OseeCoreException {
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.open(artifacts);
+ return renderer;
+ }
+
+ public static IFile makeChangesToArtifact(FileRenderer renderer, List<Artifact> artifacts) throws IOException, InterruptedException {
+ IFile renderedFile = null;
+ try {
+ renderedFile = renderer.getRenderedFile(artifacts, PresentationType.SPECIALIZED_EDIT);
+ inputStream = new FileInputStream(TEST_WORD_EDIT_FILE_NAME);
+ renderedFile.setContents(inputStream, IResource.FORCE, new NullProgressMonitor());
+ } catch (Exception ex) {
+ System.out.println(ex.toString());
+ }
+ return renderedFile;
+ }
+
+ public static void probeWordEditingCapability(boolean useRendererManager, String className) throws IOException, InterruptedException {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ Branch branch = null;
+ IFile renderedFile = null;
+ InputStream preStream = null;
+ InputStream istream = null;
+ WordTemplateRenderer postRenderer = null;
+ FileRenderer preRenderer = null;
+ String postStreamStr = "";
+ try {
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+ FileRenderer.setWorkbenchSavePopUpDisabled(true);
+ branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name());
+ Artifact newArt = ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch, className);
+ newArt.persistAttributesAndRelations();
+ // open the artifacts; testing one artifact for now
+ artifacts = Arrays.asList(newArt);
+ if (useRendererManager) {
+ RendererManager.openInJob(artifacts, PresentationType.SPECIALIZED_EDIT);
+ preRenderer = RendererManager.getBestFileRenderer(PresentationType.SPECIALIZED_EDIT, newArt);
+ } else {
+ preRenderer = new WordTemplateRenderer();
+ preRenderer = openArtifacts(artifacts);
+ }
+ renderedFile = makeChangesToArtifact(preRenderer, artifacts);
+ preStream = renderedFile.getContents();
+ // simulate the saving of the changes:
+ // osee creates an event that creates a listener that takes care of the save
+ // open the saved artifact
+ postRenderer = openArtifacts(artifacts);
+ renderedFile = postRenderer.getRenderedFile(artifacts, PresentationType.SPECIALIZED_EDIT);
+ // verify the contents have changed
+ istream = renderedFile.getContents();
+ postStreamStr = convertStreamToString(istream);
+ istream.close();
+ assertTrue(!preStream.equals(postStreamStr));
+ inputStream.close();
+ TestUtil.severeLoggingEnd(monitorLog);
+ } catch (Exception ex) {
+ System.out.println(ex.toString());
+ } finally {
+ FrameworkTestUtil.killAllOpenWinword();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordTrackedChangesTest.java b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordTrackedChangesTest.java
new file mode 100644
index 00000000000..3e5853608f8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/WordTrackedChangesTest.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.framework.ui.skynet.test.cases;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.test.util.FrameworkTestUtil;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.render.FileRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.support.test.util.DemoSawBuilds;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author Megumi Telles
+ */
+public class WordTrackedChangesTest {
+ private static final String TEST_PATH_NAME =
+ "../org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/";
+ private static final String TEST_WORD_EDIT_FILE_NAME = TEST_PATH_NAME + "WordTrackedChangesTest.xml";
+ private static final String TEST_GEN_WORD_EDIT_FILE_NAME = TEST_PATH_NAME + "GeneralWordTrackedChangesTest.doc";
+ private static boolean isWordRunning = false;
+
+ /**
+ * This test Word Edit's are being saved.
+ */
+ @Before
+ public void setUp() throws Exception {
+ assertFalse("Not to be run on production datbase.", TestUtil.isProductionDb());
+ isWordRunning = false;
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ WordTrackedChangesTest.class.getSimpleName());
+ WordAttribute.setDisplayTrackedChangesErrorMessage("");
+ isWordRunning = FrameworkTestUtil.areWinWordsRunning();
+ assertTrue(
+ "This test kills all Word Documents. Cannot continue due to existing open Word Documents." + " Please save and close existing Word Documents before running this test.",
+ isWordRunning == false);
+ }
+
+ /*
+ * Verifies that the document does not save when it has tracked changes on
+ */
+
+ @org.junit.Test
+ public void testWordSaveWithTrackChanges() throws Exception {
+
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+ FileRenderer.setWorkbenchSavePopUpDisabled(true);
+ Branch branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name());
+ // create a new requirement artifact
+ Artifact newArt =
+ ArtifactTypeManager.addArtifact(Requirements.SOFTWARE_REQUIREMENT, branch, getClass().getSimpleName());
+ newArt.persistAttributesAndRelations();
+ artifacts = Arrays.asList(newArt);
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer = WordEditTest.openArtifacts(artifacts);
+ makeChangesToArtifact(renderer, TEST_WORD_EDIT_FILE_NAME, artifacts);
+ Thread.sleep(5000);
+ assertTrue("Detected Tracked Changes Succcessfully",
+ WordAttribute.getDisplayTrackedChangesErrorMessage().contains(
+ "Cannot save - Detected tracked changes on this artifact. ") == true);
+ TestUtil.severeLoggingEnd(monitorLog);
+ }
+
+ /*
+ * Verifies that on a general document the save was success with tracked changes
+ */
+ @org.junit.Test
+ public void testGeneralWordSaveWithTrackChanges() throws Exception {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+ FileRenderer.setWorkbenchSavePopUpDisabled(true);
+ Branch branch = BranchManager.getCommonBranch();
+ // create a new general document artifact
+ Artifact newArt = ArtifactTypeManager.addArtifact("General Document", branch, getClass().getSimpleName());
+ newArt.persistAttributesAndRelations();
+ artifacts = Arrays.asList(newArt);
+ RendererManager.openInJob(artifacts, PresentationType.SPECIALIZED_EDIT);
+ FileRenderer renderer = RendererManager.getBestFileRenderer(PresentationType.SPECIALIZED_EDIT, newArt);
+ makeChangesToArtifact(renderer, TEST_GEN_WORD_EDIT_FILE_NAME, artifacts);
+ Thread.sleep(5000);
+ assertTrue("Did not Detect Tracked Changes",
+ WordAttribute.getDisplayTrackedChangesErrorMessage().equals("") == true);
+ TestUtil.severeLoggingEnd(monitorLog);
+ }
+
+ /*
+ * Verifies that a whole word document cannot save with tracked changes on
+ */
+ @org.junit.Test
+ public void testWholeWordSaveWithTrackChanges() throws Exception {
+
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ SevereLoggingMonitor monitorLog = TestUtil.severeLoggingStart();
+ FileRenderer.setWorkbenchSavePopUpDisabled(true);
+ Branch branch = BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name());
+ // create a new requirement artifact
+ Artifact newArt = ArtifactTypeManager.addArtifact("Test Procedure WML", branch, getClass().getSimpleName());
+ newArt.persistAttributesAndRelations();
+ artifacts = Arrays.asList(newArt);
+ RendererManager.openInJob(artifacts, PresentationType.SPECIALIZED_EDIT);
+ FileRenderer renderer = RendererManager.getBestFileRenderer(PresentationType.SPECIALIZED_EDIT, newArt);
+ makeChangesToArtifact(renderer, TEST_WORD_EDIT_FILE_NAME, artifacts);
+ Thread.sleep(5000);
+ assertTrue("Detected Tracked Changes Succcessfully",
+ WordAttribute.getDisplayTrackedChangesErrorMessage().contains(
+ "Cannot save - Detected tracked changes on this artifact. ") == true);
+ TestUtil.severeLoggingEnd(monitorLog);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (!isWordRunning) {
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getKeyedBranch(DemoSawBuilds.SAW_Bld_1.name()),
+ WordTrackedChangesTest.class.getSimpleName());
+ FrameworkTestUtil.cleanupSimpleTest(BranchManager.getCommonBranch(),
+ WordTrackedChangesTest.class.getSimpleName());
+ Thread.sleep(7000);
+ FrameworkTestUtil.killAllOpenWinword();
+ }
+ }
+
+ public static IFile makeChangesToArtifact(FileRenderer renderer, String file, List<Artifact> artifacts) throws IOException, InterruptedException {
+ IFile renderedFile = null;
+ try {
+ WordAttribute.setNoPopUps(true);
+ renderedFile = renderer.getRenderedFile(artifacts, PresentationType.SPECIALIZED_EDIT);
+ InputStream inputStream = new FileInputStream(file);
+ final IFile rFile = renderedFile;
+ rFile.setContents(inputStream, IResource.FORCE, new NullProgressMonitor());
+ inputStream.close();
+ } catch (Exception ex) {
+ System.out.println(ex.toString());
+ } finally {
+ FrameworkTestUtil.killAllOpenWinword();
+ }
+ return renderedFile;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/GeneralWordTrackedChangesTest.doc b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/GeneralWordTrackedChangesTest.doc
new file mode 100644
index 00000000000..359a6d50a19
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/GeneralWordTrackedChangesTest.doc
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordEditTest.xml b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordEditTest.xml
new file mode 100644
index 00000000000..70045c953ee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordEditTest.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http:/ " xmlns:ns1="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://eclipse.org/artifact.xsd" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>SRS</o:Title><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>B1375980</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>12</o:TotalTime><o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted><o:Created>2009-05-29T14:15:00Z</o:Created><o:LastSaved>2009-05-29T14:15:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>18</o:Words><o:Characters>108</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>125</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Courier"><w:panose-1 w:val="02070409020205020404"/><w:charset w:val="00"/><w:family w:val="Modern"/><w:notTrueType/><w:pitch w:val="fixed"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font><w:font w:name="APODLF+TimesNewRoman"><w:altName w:val="Times New Roman"/><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="default"/><w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="003A6350"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F89E6E26"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="APPENDIX1"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="APPENDIX2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="APPENDIX3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="APPENDIX4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="APPENDIX5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="APPENDIX6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="APPENDIX7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="APPENDIX8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="APPENDIX9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="016D5431"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="98C65BCE"/><w:lvl w:ilvl="0" w:tplc="94D2C566"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="0C4D206D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="4B543E40"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="0DE40F2C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="10AF29E5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="7520DAAE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="15EB1725"/><w:plt w:val="Multilevel"/><w:tmpl w:val="D902A83E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="1C970BBA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EB82E3A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="1D6C5FCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E710F038"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="APPENDIX %1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="720" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1440" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="1EC51BCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="256F5D56"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="290A1130"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="299E4F07"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="46E2B8B2"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="29C240FD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FCA4DC08"/><w:lvl w:ilvl="0" w:tplc="B5146A3E"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl2"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1224"/></w:tabs><w:ind w:left="1224" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="29CA5728"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D00252C6"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="2A5411A0"/><w:plt w:val="Multilevel"/><w:tmpl w:val="2660867C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="2"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="2B1C06F5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3B98963A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="2B477730"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="33801DC4"/><w:lvl w:ilvl="0" w:tplc="2D8A4B4C"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl3"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3024"/></w:tabs><w:ind w:left="3024" w:hanging="2016"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2448"/></w:tabs><w:ind w:left="2448" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3168"/></w:tabs><w:ind w:left="3168" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3888"/></w:tabs><w:ind w:left="3888" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4608"/></w:tabs><w:ind w:left="4608" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5328"/></w:tabs><w:ind w:left="5328" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6048"/></w:tabs><w:ind w:left="6048" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6768"/></w:tabs><w:ind w:left="6768" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7488"/></w:tabs><w:ind w:left="7488" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2B5B6B3C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5CC8E874"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:first-line="763"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="2D6545A6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3F227848"/><w:name w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:caps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:vanish w:val="off"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:vertAlign w:val="baseline"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="listlvl2"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="-31680"/></w:tabs><w:ind w:left="1656" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl3"/><w:lvlText w:val="(%3)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2016"/></w:tabs><w:ind w:left="2016" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="listlvl4"/><w:lvlText w:val="(%4)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2376"/></w:tabs><w:ind w:left="2376" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl5"/><w:lvlText w:val="%5)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2736"/></w:tabs><w:ind w:left="2736" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="listlvl6"/><w:lvlText w:val="%6)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3096"/></w:tabs><w:ind w:left="3096" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl7"/><w:lvlText w:val="[%7]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3456"/></w:tabs><w:ind w:left="3456" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="[%8]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="308239DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="31A252E6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="A9D83578"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="3B97448F"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3C165F4A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79A06FE6"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="42BB3748"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DBE464B0"/><w:lvl w:ilvl="0" w:tplc="26BAF6B0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl1"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="648"/></w:tabs><w:ind w:left="648" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="47E309C3"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="5A401749"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CD8E61CE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="5A802BC9"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="5C3B1B76"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="5E371EBB"/><w:plt w:val="Multilevel"/><w:tmpl w:val="DA56D440"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="60B71688"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EA20814"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="6389497B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="AC5A6410"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="listlvl10"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="360" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1080" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1800" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2520" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3240" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3960" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="4680" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5400" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6120" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="6469691A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E5D02024"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="69A642CA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="74BA49AE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart"/><w:styleLink w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="751E50EA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79E6FEDC"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="7D9D3B47"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="7F0F313D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F8FC63EE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="7F633FB7"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5F5A52E8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="23"/></w:list><w:list w:ilfo="2"><w:ilst w:val="12"/></w:list><w:list w:ilfo="3"><w:ilst w:val="18"/></w:list><w:list w:ilfo="4"><w:ilst w:val="14"/></w:list><w:list w:ilfo="5"><w:ilst w:val="6"/></w:list><w:list w:ilfo="6"><w:ilst w:val="26"/></w:list><w:list w:ilfo="7"><w:ilst w:val="5"/></w:list><w:list w:ilfo="8"><w:ilst w:val="13"/></w:list><w:list w:ilfo="9"><w:ilst w:val="30"/></w:list><w:list w:ilfo="10"><w:ilst w:val="7"/></w:list><w:list w:ilfo="11"><w:ilst w:val="18"/></w:list><w:list w:ilfo="12"><w:ilst w:val="27"/></w:list><w:list w:ilfo="13"><w:ilst w:val="36"/></w:list><w:list w:ilfo="14"><w:ilst w:val="2"/></w:list><w:list w:ilfo="15"><w:ilst w:val="28"/></w:list><w:list w:ilfo="16"><w:ilst w:val="17"/></w:list><w:list w:ilfo="17"><w:ilst w:val="31"/></w:list><w:list w:ilfo="18"><w:ilst w:val="4"/></w:list><w:list w:ilfo="19"><w:ilst w:val="20"/></w:list><w:list w:ilfo="20"><w:ilst w:val="15"/></w:list><w:list w:ilfo="21"><w:ilst w:val="37"/></w:list><w:list w:ilfo="22"><w:ilst w:val="22"/></w:list><w:list w:ilfo="23"><w:ilst w:val="25"/></w:list><w:list w:ilfo="24"><w:ilst w:val="34"/></w:list><w:list w:ilfo="25"><w:ilst w:val="0"/></w:list><w:list w:ilfo="26"><w:ilst w:val="33"/></w:list><w:list w:ilfo="27"><w:ilst w:val="21"/></w:list><w:list w:ilfo="28"><w:ilst w:val="16"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="18"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="1"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="2"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="3"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="4"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="5"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="6"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="7"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="8"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="31"><w:ilst w:val="11"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/></w:list><w:list w:ilfo="33"><w:ilst w:val="35"/></w:list><w:list w:ilfo="34"><w:ilst w:val="8"/></w:list><w:list w:ilfo="35"><w:ilst w:val="29"/></w:list><w:list w:ilfo="36"><w:ilst w:val="14"/></w:list><w:list w:ilfo="37"><w:ilst w:val="10"/></w:list><w:list w:ilfo="38"><w:ilst w:val="9"/></w:list><w:list w:ilfo="39"><w:ilst w:val="3"/></w:list><w:list w:ilfo="40"><w:ilst w:val="24"/></w:list><w:list w:ilfo="41"><w:ilst w:val="32"/></w:list><w:ilfoMacAtCleanup w:val="5"/></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:keepLines/><w:pageBreakBefore/><w:listPr><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:kern w:val="28"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="900"/></w:tabs><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading5"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading6"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1620"/></w:tabs><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading9"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="paranormal"><w:name w:val="para:normal"/><w:link w:val="paranormalChar"/><w:rsid w:val="009E6B3D"/><w:pPr><w:pStyle w:val="paranormal"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="64" w:after="80" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl3"><w:name w:val="list:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl3"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="2088"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang1"><w:name w:val="req lang:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A134C3"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:spacing w:before="20" w:after="0" w:line="180" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="proprietarycontd"><w:name w:val="proprietary:cont'd"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="proprietarycontd"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="200" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="16"/><w:sz-cs w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paracentered"><w:name w:val="para:centered"/><w:autoRedefine/><w:rsid w:val="00B43482"/><w:pPr><w:pStyle w:val="paracentered"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="80" w:after="80" w:line="240" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent2"><w:name w:val="para:indent2"/><w:autoRedefine/><w:rsid w:val="004417BE"/><w:pPr><w:pStyle w:val="paraindent2"/><w:tabs><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent3"><w:name w:val="para:indent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent3"/><w:tabs><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/><w:tab w:val="left" w:pos="9720"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="0085234B"/><w:pPr><w:pStyle w:val="Caption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9720"/><w:tab w:val="left" w:pos="10800"/><w:tab w:val="left" w:pos="11880"/><w:tab w:val="left" w:pos="12960"/><w:tab w:val="left" w:pos="14040"/><w:tab w:val="left" w:pos="15120"/><w:tab w:val="left" w:pos="16200"/><w:tab w:val="left" w:pos="17280"/><w:tab w:val="left" w:pos="18360"/><w:tab w:val="left" w:pos="19440"/><w:tab w:val="left" w:pos="20520"/><w:tab w:val="left" w:pos="21600"/><w:tab w:val="left" w:pos="22680"/><w:tab w:val="left" w:pos="23760"/><w:tab w:val="left" w:pos="24840"/><w:tab w:val="left" w:pos="25920"/><w:tab w:val="left" w:pos="27000"/><w:tab w:val="left" w:pos="28080"/><w:tab w:val="left" w:pos="29160"/><w:tab w:val="left" w:pos="30240"/><w:tab w:val="left" w:pos="31320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent1"><w:name w:val="para:indent1"/><w:autoRedefine/><w:rsid w:val="007D424E"/><w:pPr><w:pStyle w:val="paraindent1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl4"><w:name w:val="list:lvl 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl4"/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="11"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead"><w:name w:val="RowHead"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="100" w:after="100"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11"><w:name w:val="TableText11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOAHeading"/><w:spacing w:before="240" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHeadL"><w:name w:val="RowHeadL"/><w:basedOn w:val="RowHead"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHeadL"/><w:spacing w:before="60" w:after="60"/><w:jc w:val="left"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11B"><w:name w:val="TableText11B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText11B"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofAuthorities"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="8640"/></w:tabs><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofFigures"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00721F21"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D90577"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:dstrike w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/><w:vertAlign w:val="baseline"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead11"><w:name w:val="RowHead11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead11"/><w:listPr><w:ilvl w:val="12"/></w:listPr><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11C"><w:name w:val="TableText11C"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11C"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl1"><w:name w:val="list:lvl 1"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl1"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl5"><w:name w:val="list:lvl 5"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="left" w:pos="3384"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl2"><w:name w:val="list:lvl 2"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="AppendixTitle"><w:name w:val="Appendix Title"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="AppendixTitle"/><w:pageBreakBefore/><w:spacing w:before="120" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead10"><w:name w:val="RowHead10"/><w:basedOn w:val="RowHead11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC1"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="540"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="240"/><w:ind w:left="547" w:hanging="547"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:noProof/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC2"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="900"/><w:tab w:val="right" w:leader="dot" w:pos="9360"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="907" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC3"><w:name w:val="toc 3"/><wx:uiName wx:val="TOC 3"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC3"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1260"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1260" w:hanging="900"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC4"><w:name w:val="toc 4"/><wx:uiName wx:val="TOC 4"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC4"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1620"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1620" w:hanging="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC5"><w:name w:val="toc 5"/><wx:uiName wx:val="TOC 5"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC5"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1980"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1980" w:hanging="1260"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC6"><w:name w:val="toc 6"/><wx:uiName wx:val="TOC 6"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC6"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2340"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2340" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC7"><w:name w:val="toc 7"/><wx:uiName wx:val="TOC 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC7"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2700"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="0" w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="2700" w:hanging="1620"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC8"><w:name w:val="toc 8"/><wx:uiName wx:val="TOC 8"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC8"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2970"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2970" w:hanging="1710"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC9"><w:name w:val="toc 9"/><wx:uiName wx:val="TOC 9"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC9"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="3330"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="3330" w:hanging="1890"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeadingUnnumbered"><w:name w:val="Heading Unnumbered"/><w:next w:val="paranormal"/><w:autoRedefine/><w:rsid w:val="00107AA6"/><w:pPr><w:pStyle w:val="HeadingUnnumbered"/><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="24"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10"><w:name w:val="TableText10"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableTextBCentered"><w:name w:val="TableTextB Centered"/><w:basedOn w:val="Normal"/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableTextBCentered"/><w:spacing w:line="220" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10C"><w:name w:val="TableText10C"/><w:basedOn w:val="TableText11C"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10C"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10B"><w:name w:val="TableText10B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText10B"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="acronym"><w:name w:val="acronym"/><w:autoRedefine/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="acronym"/><w:tabs><w:tab w:val="left" w:pos="2160"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="40"/><w:ind w:left="2160" w:hanging="2160"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl6"><w:name w:val="list:lvl 6"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="clear" w:pos="4320"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr1L"><w:name w:val="hdr1L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr1L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr2L"><w:name w:val="hdr2L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr2L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="0" w:line="180" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl1"><w:name w:val="bullet:lvl 1"/><w:basedOn w:val="Normal"/><w:link w:val="bulletlvl1CharChar"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl2"><w:name w:val="bullet:lvl 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilfo w:val="2"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1224"/><w:tab w:val="left" w:pos="648"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1728" w:hanging="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent4"><w:name w:val="para:indent4"/><w:basedOn w:val="paraindent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent4"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl7"><w:name w:val="list:lvl 7"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="left" w:pos="3024"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCfiguretitle"><w:name w:val="TOC:figure title"/><w:basedOn w:val="Caption"/><w:autoRedefine/><w:rsid w:val="00894991"/><w:pPr><w:pStyle w:val="TOCfiguretitle"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note"><w:name w:val="note"/><w:basedOn w:val="Normal"/><w:rsid w:val="006E0AB6"/><w:pPr><w:pStyle w:val="note"/><w:spacing w:before="80" w:after="80"/><w:ind w:left="1656" w:right="720" w:hanging="936"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang2"><w:name w:val="req lang:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang2"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang3"><w:name w:val="req lang:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang4"><w:name w:val="req lang:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang4"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang5"><w:name w:val="req lang:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang5"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1800"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang6"><w:name w:val="req lang:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang6"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="2160"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="statedef"><w:name w:val="state def"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DE6BA0"/><w:pPr><w:pStyle w:val="statedef"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="80" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:caps/><w:color w:val="408040"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="intentblank"><w:name w:val="intent:blank"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="000B79E8"/><w:pPr><w:pStyle w:val="intentblank"/><w:spacing w:before="6480" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="code"><w:name w:val="code"/><w:basedOn w:val="Normal"/><w:rsid w:val="006D4514"/><w:pPr><w:pStyle w:val="code"/><w:spacing w:before="80" w:after="80" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="parapage"><w:name w:val="para:page"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00DD22A9"/><w:pPr><w:pStyle w:val="parapage"/><w:pageBreakBefore/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCtabletitle"><w:name w:val="TOC:table title"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00B869CD"/><w:pPr><w:pStyle w:val="TOCtabletitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRitem"><w:name w:val="RCR:item"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="007A1F4F"/><w:pPr><w:pStyle w:val="RCRitem"/><w:tabs><w:tab w:val="left" w:pos="1800"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="1800" w:right="720" w:hanging="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRheader"><w:name w:val="RCR:header"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006D781E"/><w:pPr><w:pStyle w:val="RCRheader"/><w:tabs><w:tab w:val="left" w:pos="792"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="right" w:leader="underscore" w:pos="8640"/></w:tabs><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="line"><w:name w:val="line"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006B63C2"/><w:pPr><w:pStyle w:val="line"/><w:spacing w:before="0" w:line="40" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="12"/><w:sz-cs w:val="12"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang7"><w:name w:val="req lang: 7"/><w:basedOn w:val="reqlang6"/><w:rsid w:val="00C0337E"/><w:pPr><w:pStyle w:val="reqlang7"/><w:ind w:left="2520"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang70"><w:name w:val="req lang:7"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang70"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang8"><w:name w:val="req lang:8"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang8"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang9"><w:name w:val="req lang:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="007534C9"/><w:pPr><w:pStyle w:val="reqlang9"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="3240"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AF20CB"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment1"><w:name w:val="comment:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment1"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment2"><w:name w:val="comment:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment2"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="720"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment3"><w:name w:val="comment:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1080"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment4"><w:name w:val="comment:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment4"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1440"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment5"><w:name w:val="comment:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment5"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment6"><w:name w:val="comment:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment6"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment7"><w:name w:val="comment:7"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment7"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2520"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment8"><w:name w:val="comment:8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment8"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2880"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment9"><w:name w:val="comment:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment9"/><w:spacing w:after="80"/><w:ind w:left="3240"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlheader"><w:name w:val="dl:header"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlheader"/><w:spacing w:before="240" w:after="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier" w:h-ansi="Courier"/><wx:font wx:val="Courier"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlbody"><w:name w:val="dl:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlbody"/><w:spacing w:before="0"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocheader"><w:name w:val="dl_proc:header"/><w:basedOn w:val="dlbody"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocheader"/><w:spacing w:before="240"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocbody"><w:name w:val="dl_proc:body"/><w:basedOn w:val="dlprocheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocbody"/><w:spacing w:before="0"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dldescription"><w:name w:val="dl:description"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dldescription"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapheader"><w:name w:val="bitmap:header"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapheader"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapbody"><w:name w:val="bitmap:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapbody"/><w:spacing w:before="0"/></w:pPr><w:rPr><wx:font wx:val="Courier"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX1"><w:name w:val="APPENDIX 1"/><w:basedOn w:val="Normal"/><w:next w:val="paranormal"/><w:rsid w:val="004978C4"/><w:pPr><w:pStyle w:val="APPENDIX1"/><w:listPr><w:ilfo w:val="25"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="152" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX2"><w:name w:val="APPENDIX 2"/><w:basedOn w:val="APPENDIX1"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX2"/><w:listPr><w:ilvl w:val="1"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX3"><w:name w:val="APPENDIX 3"/><w:basedOn w:val="APPENDIX2"/><w:next w:val="paranormal"/><w:rsid w:val="00E904D2"/><w:pPr><w:pStyle w:val="APPENDIX3"/><w:listPr><w:ilvl w:val="2"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage18pt"><w:name w:val="Title Page 18pt"/><w:basedOn w:val="Normal"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage18pt"/><w:spacing w:before="0" w:after="60" w:line="240" w:line-rule="auto"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz w:val="36"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage16pt"><w:name w:val="Title Page 16pt"/><w:basedOn w:val="TitlePage18pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage16pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage14pt"><w:name w:val="Title Page 14pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage14pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10pt"><w:name w:val="para 10pt"/><w:basedOn w:val="Normal"/><w:link w:val="para10ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para10pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10ptnospacing"><w:name w:val="para 10pt no spacing"/><w:basedOn w:val="para10pt"/><w:rsid w:val="004A1CCA"/><w:pPr><w:pStyle w:val="para10ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10nospacing"><w:name w:val="TableText10 no spacing"/><w:basedOn w:val="TableText10"/><w:rsid w:val="00D72507"/><w:pPr><w:pStyle w:val="TableText10nospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8pt"><w:name w:val="para 8pt"/><w:basedOn w:val="Normal"/><w:link w:val="para8ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para8pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paranormalChar"><w:name w:val="para:normal Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="paranormal"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="bulletlvl1CharChar"><w:name w:val="bullet:lvl 1 Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="bulletlvl1"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:before="0" w:after="120" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl10"><w:name w:val="list lvl 1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl10"/><w:listPr><w:ilfo w:val="9"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/></w:tabs><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX4"><w:name w:val="APPENDIX 4"/><w:basedOn w:val="APPENDIX3"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX4"/><w:listPr><w:ilvl w:val="3"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX5"><w:name w:val="APPENDIX 5"/><w:basedOn w:val="APPENDIX4"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX5"/><w:listPr><w:ilvl w:val="4"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX6"><w:name w:val="APPENDIX 6"/><w:basedOn w:val="APPENDIX5"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX6"/><w:listPr><w:ilvl w:val="5"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX7"><w:name w:val="APPENDIX 7"/><w:basedOn w:val="APPENDIX6"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX7"/><w:listPr><w:ilvl w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX8"><w:name w:val="APPENDIX 8"/><w:basedOn w:val="APPENDIX7"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX8"/><w:listPr><w:ilvl w:val="7"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX9"><w:name w:val="APPENDIX 9"/><w:basedOn w:val="APPENDIX8"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX9"/><w:listPr><w:ilvl w:val="8"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00B47E5D"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="list" w:styleId="listreset"><w:name w:val="listreset"/><w:basedOn w:val="NoList"/><w:rsid w:val="00D25E39"/><w:pPr><w:listPr><w:ilfo w:val="26"/></w:listPr></w:pPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl3"><w:name w:val="bullet:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00EF5226"/><w:pPr><w:pStyle w:val="bulletlvl3"/><w:listPr><w:ilfo w:val="28"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="3024"/><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1368" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage22pt"><w:name w:val="Title Page 22pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="005F35C4"/><w:pPr><w:pStyle w:val="TitlePage22pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="44"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para"><w:name w:val="para"/><w:basedOn w:val="Normal"/><w:link w:val="paraChar"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="para"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paraChar"><w:name w:val="para Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="para"/><w:rsid w:val="0057061B"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl20"><w:name w:val="list lvl 2"/><w:basedOn w:val="ListNumber3"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="listlvl20"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="008B1AB7"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="character" w:styleId="para8ptChar"><w:name w:val="para 8pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para8pt"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptunderline"><w:name w:val="para 8pt underline"/><w:basedOn w:val="para8pt"/><w:link w:val="para8ptunderlineChar"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptunderline"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="para8ptunderlineChar"><w:name w:val="para 8pt underline Char"/><w:basedOn w:val="para8ptChar"/><w:link w:val="para8ptunderline"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptnospacing"><w:name w:val="para 8pt no spacing"/><w:basedOn w:val="para8pt"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl0"><w:name w:val="list lvl 0"/><w:basedOn w:val="ListNumber"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="listlvl0"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="ListNumber"/><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="para10ptChar"><w:name w:val="para 10pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para10pt"/><w:rsid w:val="0015054E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00B8047C"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart8"><w:name w:val="micro:art8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart8"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart9"><w:name w:val="micro:art9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart9"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart10"><w:name w:val="micro:art10"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart10"/><w:spacing w:before="120" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="39938"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:attachedTemplate w:val=""/><w:stylePaneFormatFilter w:val="1F08"/><w:documentProtection w:formatting="on" w:enforcement="off"/><w:defaultTabStop w:val="720"/><w:doNotHyphenateCaps/><w:drawingGridHorizontalSpacing w:val="120"/><w:drawingGridVerticalSpacing w:val="120"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="3"/><w:useMarginsForDrawingGridOrigin/><w:doNotShadeFormData/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="39938"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/><w:p wsp:rsidR="00EF0632" wsp:rsidRDefault="00EF0632"/></w:endnote></w:endnotePr><w:compat><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00244327"/><wsp:rsid wsp:val="001766F7"/><wsp:rsid wsp:val="00244327"/><wsp:rsid wsp:val="00436451"/><wsp:rsid wsp:val="005501C9"/><wsp:rsid wsp:val="005C6782"/><wsp:rsid wsp:val="00787401"/><wsp:rsid wsp:val="007F3E1C"/><wsp:rsid wsp:val="00801B1F"/><wsp:rsid wsp:val="00B17C0D"/><wsp:rsid wsp:val="00BE00FC"/><wsp:rsid wsp:val="00CC2F3E"/><wsp:rsid wsp:val="00DD246B"/><wsp:rsid wsp:val="00EF0632"/></wsp:rsids></w:docPr><w:body><wx:sect><ns2:Word_Template_Content ns2:guid="AAABIYhKiB0BaJQFZJcOaw" ns2:attrId="41"><w:p wsp:rsidR="006A3C0C" wsp:rsidRDefault="00CC2F3E" wsp:rsidP="00E54E52"><w:pPr><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>T</w:t></w:r><w:r wsp:rsidR="00EF0632"><w:rPr><w:rFonts w:ascii="APODLF+TimesNewRoman" w:h-ansi="APODLF+TimesNewRoman" w:cs="APODLF+TimesNewRoman"/><wx:font wx:val="APODLF+TimesNewRoman"/></w:rPr><w:t>he read-only research interface (older V4.x interface mentioned in Reference 2.1.2). </w:t></w:r></w:p></ns2:Word_Template_Content><w:p wsp:rsidR="00BE00FC" wsp:rsidRDefault="00BE00FC"/><w:p wsp:rsidR="00BE00FC" wsp:rsidRDefault="00BE00FC"><w:pPr><w:rPr><w:vanish/></w:rPr></w:pPr><w:r><w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r wsp:rsidR="00EF0632"><w:rPr><w:vanish/></w:rPr><w:instrText> LISTNUM "listreset" \l 1 \s 0 </w:instrText></w:r><w:r><w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType="end"/><wx:t wx:val=" ."/></w:r></w:p><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"/><w:sectPr wsp:rsidR="007F3E1C" wsp:rsidSect="007F3E1C"><w:hdr w:type="odd"><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="432" w:footer="432" w:gutter="0"/><w:pgNumType w:start="1"/><w:cols w:space="475"/><w:noEndnote/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordTrackedChangesTest.xml b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordTrackedChangesTest.xml
new file mode 100644
index 00000000000..a109fc013e4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/cases/support/WordTrackedChangesTest.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http:/ " xmlns:ns1="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://eclipse.org/artifact.xsd" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>SRS</o:Title><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>B1375980</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>1</o:TotalTime><o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted><o:Created>2009-06-03T19:14:00Z</o:Created><o:LastSaved>2009-06-03T19:14:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>53</o:Words><o:Characters>307</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>2</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>359</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Courier"><w:panose-1 w:val="02070409020205020404"/><w:charset w:val="00"/><w:family w:val="Modern"/><w:notTrueType/><w:pitch w:val="fixed"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="003A6350"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F89E6E26"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="APPENDIX1"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="APPENDIX2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="APPENDIX3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="APPENDIX4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="APPENDIX5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="APPENDIX6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="APPENDIX7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="APPENDIX8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="APPENDIX9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="016D5431"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="98C65BCE"/><w:lvl w:ilvl="0" w:tplc="94D2C566"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="0C4D206D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="4B543E40"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="0DE40F2C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="10AF29E5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="7520DAAE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="15EB1725"/><w:plt w:val="Multilevel"/><w:tmpl w:val="D902A83E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="1C970BBA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EB82E3A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="1D6C5FCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E710F038"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="APPENDIX %1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="720" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1440" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="1EC51BCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="256F5D56"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="290A1130"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="299E4F07"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="46E2B8B2"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="29C240FD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FCA4DC08"/><w:lvl w:ilvl="0" w:tplc="B5146A3E"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl2"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1224"/></w:tabs><w:ind w:left="1224" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="29CA5728"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D00252C6"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="2A5411A0"/><w:plt w:val="Multilevel"/><w:tmpl w:val="2660867C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="6"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="2B1C06F5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3B98963A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="2B477730"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="33801DC4"/><w:lvl w:ilvl="0" w:tplc="2D8A4B4C"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl3"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3024"/></w:tabs><w:ind w:left="3024" w:hanging="2016"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2448"/></w:tabs><w:ind w:left="2448" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3168"/></w:tabs><w:ind w:left="3168" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3888"/></w:tabs><w:ind w:left="3888" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4608"/></w:tabs><w:ind w:left="4608" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5328"/></w:tabs><w:ind w:left="5328" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6048"/></w:tabs><w:ind w:left="6048" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6768"/></w:tabs><w:ind w:left="6768" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7488"/></w:tabs><w:ind w:left="7488" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2B5B6B3C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5CC8E874"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:first-line="763"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="2D6545A6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3F227848"/><w:name w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:caps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:vanish w:val="off"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:vertAlign w:val="baseline"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="listlvl2"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="-31680"/></w:tabs><w:ind w:left="1656" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl3"/><w:lvlText w:val="(%3)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2016"/></w:tabs><w:ind w:left="2016" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="listlvl4"/><w:lvlText w:val="(%4)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2376"/></w:tabs><w:ind w:left="2376" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl5"/><w:lvlText w:val="%5)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2736"/></w:tabs><w:ind w:left="2736" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="listlvl6"/><w:lvlText w:val="%6)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3096"/></w:tabs><w:ind w:left="3096" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl7"/><w:lvlText w:val="[%7]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3456"/></w:tabs><w:ind w:left="3456" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="[%8]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="308239DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="31A252E6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="A9D83578"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="3B97448F"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3C165F4A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79A06FE6"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="42BB3748"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DBE464B0"/><w:lvl w:ilvl="0" w:tplc="26BAF6B0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl1"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="648"/></w:tabs><w:ind w:left="648" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="47E309C3"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="5A401749"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CD8E61CE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="5A802BC9"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="5C3B1B76"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="5E371EBB"/><w:plt w:val="Multilevel"/><w:tmpl w:val="DA56D440"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="60B71688"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EA20814"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="6389497B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="AC5A6410"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="listlvl10"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="360" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1080" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1800" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2520" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3240" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3960" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="4680" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5400" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6120" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="6469691A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E5D02024"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="69A642CA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="74BA49AE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart"/><w:styleLink w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="751E50EA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79E6FEDC"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="7D9D3B47"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="7F0F313D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F8FC63EE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="7F633FB7"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5F5A52E8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="23"/></w:list><w:list w:ilfo="2"><w:ilst w:val="12"/></w:list><w:list w:ilfo="3"><w:ilst w:val="18"/></w:list><w:list w:ilfo="4"><w:ilst w:val="14"/></w:list><w:list w:ilfo="5"><w:ilst w:val="6"/></w:list><w:list w:ilfo="6"><w:ilst w:val="26"/></w:list><w:list w:ilfo="7"><w:ilst w:val="5"/></w:list><w:list w:ilfo="8"><w:ilst w:val="13"/></w:list><w:list w:ilfo="9"><w:ilst w:val="30"/></w:list><w:list w:ilfo="10"><w:ilst w:val="7"/></w:list><w:list w:ilfo="11"><w:ilst w:val="18"/></w:list><w:list w:ilfo="12"><w:ilst w:val="27"/></w:list><w:list w:ilfo="13"><w:ilst w:val="36"/></w:list><w:list w:ilfo="14"><w:ilst w:val="2"/></w:list><w:list w:ilfo="15"><w:ilst w:val="28"/></w:list><w:list w:ilfo="16"><w:ilst w:val="17"/></w:list><w:list w:ilfo="17"><w:ilst w:val="31"/></w:list><w:list w:ilfo="18"><w:ilst w:val="4"/></w:list><w:list w:ilfo="19"><w:ilst w:val="20"/></w:list><w:list w:ilfo="20"><w:ilst w:val="15"/></w:list><w:list w:ilfo="21"><w:ilst w:val="37"/></w:list><w:list w:ilfo="22"><w:ilst w:val="22"/></w:list><w:list w:ilfo="23"><w:ilst w:val="25"/></w:list><w:list w:ilfo="24"><w:ilst w:val="34"/></w:list><w:list w:ilfo="25"><w:ilst w:val="0"/></w:list><w:list w:ilfo="26"><w:ilst w:val="33"/></w:list><w:list w:ilfo="27"><w:ilst w:val="21"/></w:list><w:list w:ilfo="28"><w:ilst w:val="16"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="18"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="1"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="2"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="3"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="4"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="5"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="6"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="7"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="8"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="31"><w:ilst w:val="11"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/></w:list><w:list w:ilfo="33"><w:ilst w:val="35"/></w:list><w:list w:ilfo="34"><w:ilst w:val="8"/></w:list><w:list w:ilfo="35"><w:ilst w:val="29"/></w:list><w:list w:ilfo="36"><w:ilst w:val="14"/></w:list><w:list w:ilfo="37"><w:ilst w:val="10"/></w:list><w:list w:ilfo="38"><w:ilst w:val="9"/></w:list><w:list w:ilfo="39"><w:ilst w:val="3"/></w:list><w:list w:ilfo="40"><w:ilst w:val="24"/></w:list><w:list w:ilfo="41"><w:ilst w:val="32"/></w:list><w:ilfoMacAtCleanup w:val="5"/></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:keepLines/><w:pageBreakBefore/><w:listPr><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:kern w:val="28"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="900"/></w:tabs><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading5"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading6"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1620"/></w:tabs><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading9"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="paranormal"><w:name w:val="para:normal"/><w:link w:val="paranormalChar"/><w:rsid w:val="009E6B3D"/><w:pPr><w:pStyle w:val="paranormal"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="64" w:after="80" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl3"><w:name w:val="list:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl3"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="2088"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang1"><w:name w:val="req lang:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A134C3"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:spacing w:before="20" w:after="0" w:line="180" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="proprietarycontd"><w:name w:val="proprietary:cont'd"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="proprietarycontd"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="200" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="16"/><w:sz-cs w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paracentered"><w:name w:val="para:centered"/><w:autoRedefine/><w:rsid w:val="00B43482"/><w:pPr><w:pStyle w:val="paracentered"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="80" w:after="80" w:line="240" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent2"><w:name w:val="para:indent2"/><w:autoRedefine/><w:rsid w:val="004417BE"/><w:pPr><w:pStyle w:val="paraindent2"/><w:tabs><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent3"><w:name w:val="para:indent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent3"/><w:tabs><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/><w:tab w:val="left" w:pos="9720"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="0085234B"/><w:pPr><w:pStyle w:val="Caption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9720"/><w:tab w:val="left" w:pos="10800"/><w:tab w:val="left" w:pos="11880"/><w:tab w:val="left" w:pos="12960"/><w:tab w:val="left" w:pos="14040"/><w:tab w:val="left" w:pos="15120"/><w:tab w:val="left" w:pos="16200"/><w:tab w:val="left" w:pos="17280"/><w:tab w:val="left" w:pos="18360"/><w:tab w:val="left" w:pos="19440"/><w:tab w:val="left" w:pos="20520"/><w:tab w:val="left" w:pos="21600"/><w:tab w:val="left" w:pos="22680"/><w:tab w:val="left" w:pos="23760"/><w:tab w:val="left" w:pos="24840"/><w:tab w:val="left" w:pos="25920"/><w:tab w:val="left" w:pos="27000"/><w:tab w:val="left" w:pos="28080"/><w:tab w:val="left" w:pos="29160"/><w:tab w:val="left" w:pos="30240"/><w:tab w:val="left" w:pos="31320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent1"><w:name w:val="para:indent1"/><w:autoRedefine/><w:rsid w:val="007D424E"/><w:pPr><w:pStyle w:val="paraindent1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl4"><w:name w:val="list:lvl 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl4"/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="11"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead"><w:name w:val="RowHead"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="100" w:after="100"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11"><w:name w:val="TableText11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOAHeading"/><w:spacing w:before="240" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHeadL"><w:name w:val="RowHeadL"/><w:basedOn w:val="RowHead"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHeadL"/><w:spacing w:before="60" w:after="60"/><w:jc w:val="left"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11B"><w:name w:val="TableText11B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText11B"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofAuthorities"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="8640"/></w:tabs><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofFigures"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00721F21"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D90577"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:dstrike w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/><w:vertAlign w:val="baseline"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead11"><w:name w:val="RowHead11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead11"/><w:listPr><w:ilvl w:val="12"/></w:listPr><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11C"><w:name w:val="TableText11C"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11C"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl1"><w:name w:val="list:lvl 1"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl1"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl5"><w:name w:val="list:lvl 5"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="left" w:pos="3384"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl2"><w:name w:val="list:lvl 2"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="AppendixTitle"><w:name w:val="Appendix Title"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="AppendixTitle"/><w:pageBreakBefore/><w:spacing w:before="120" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead10"><w:name w:val="RowHead10"/><w:basedOn w:val="RowHead11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC1"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="540"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="240"/><w:ind w:left="547" w:hanging="547"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:noProof/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC2"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="900"/><w:tab w:val="right" w:leader="dot" w:pos="9360"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="907" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC3"><w:name w:val="toc 3"/><wx:uiName wx:val="TOC 3"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC3"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1260"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1260" w:hanging="900"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC4"><w:name w:val="toc 4"/><wx:uiName wx:val="TOC 4"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC4"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1620"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1620" w:hanging="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC5"><w:name w:val="toc 5"/><wx:uiName wx:val="TOC 5"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC5"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1980"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1980" w:hanging="1260"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC6"><w:name w:val="toc 6"/><wx:uiName wx:val="TOC 6"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC6"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2340"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2340" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC7"><w:name w:val="toc 7"/><wx:uiName wx:val="TOC 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC7"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2700"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="0" w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="2700" w:hanging="1620"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC8"><w:name w:val="toc 8"/><wx:uiName wx:val="TOC 8"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC8"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2970"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2970" w:hanging="1710"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC9"><w:name w:val="toc 9"/><wx:uiName wx:val="TOC 9"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC9"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="3330"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="3330" w:hanging="1890"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeadingUnnumbered"><w:name w:val="Heading Unnumbered"/><w:next w:val="paranormal"/><w:autoRedefine/><w:rsid w:val="00107AA6"/><w:pPr><w:pStyle w:val="HeadingUnnumbered"/><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="24"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10"><w:name w:val="TableText10"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableTextBCentered"><w:name w:val="TableTextB Centered"/><w:basedOn w:val="Normal"/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableTextBCentered"/><w:spacing w:line="220" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10C"><w:name w:val="TableText10C"/><w:basedOn w:val="TableText11C"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10C"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10B"><w:name w:val="TableText10B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText10B"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="acronym"><w:name w:val="acronym"/><w:autoRedefine/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="acronym"/><w:tabs><w:tab w:val="left" w:pos="2160"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="40"/><w:ind w:left="2160" w:hanging="2160"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl6"><w:name w:val="list:lvl 6"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="clear" w:pos="4320"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr1L"><w:name w:val="hdr1L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr1L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr2L"><w:name w:val="hdr2L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr2L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="0" w:line="180" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl1"><w:name w:val="bullet:lvl 1"/><w:basedOn w:val="Normal"/><w:link w:val="bulletlvl1CharChar"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl2"><w:name w:val="bullet:lvl 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilfo w:val="2"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1224"/><w:tab w:val="left" w:pos="648"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1728" w:hanging="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent4"><w:name w:val="para:indent4"/><w:basedOn w:val="paraindent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent4"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl7"><w:name w:val="list:lvl 7"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="left" w:pos="3024"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCfiguretitle"><w:name w:val="TOC:figure title"/><w:basedOn w:val="Caption"/><w:autoRedefine/><w:rsid w:val="00894991"/><w:pPr><w:pStyle w:val="TOCfiguretitle"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note"><w:name w:val="note"/><w:basedOn w:val="Normal"/><w:rsid w:val="006E0AB6"/><w:pPr><w:pStyle w:val="note"/><w:spacing w:before="80" w:after="80"/><w:ind w:left="1656" w:right="720" w:hanging="936"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang2"><w:name w:val="req lang:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang2"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang3"><w:name w:val="req lang:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang4"><w:name w:val="req lang:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang4"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang5"><w:name w:val="req lang:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang5"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1800"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang6"><w:name w:val="req lang:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang6"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="2160"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="statedef"><w:name w:val="state def"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DE6BA0"/><w:pPr><w:pStyle w:val="statedef"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="80" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:caps/><w:color w:val="408040"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="intentblank"><w:name w:val="intent:blank"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="000B79E8"/><w:pPr><w:pStyle w:val="intentblank"/><w:spacing w:before="6480" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="code"><w:name w:val="code"/><w:basedOn w:val="Normal"/><w:rsid w:val="006D4514"/><w:pPr><w:pStyle w:val="code"/><w:spacing w:before="80" w:after="80" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="parapage"><w:name w:val="para:page"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00DD22A9"/><w:pPr><w:pStyle w:val="parapage"/><w:pageBreakBefore/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCtabletitle"><w:name w:val="TOC:table title"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00B869CD"/><w:pPr><w:pStyle w:val="TOCtabletitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRitem"><w:name w:val="RCR:item"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="007A1F4F"/><w:pPr><w:pStyle w:val="RCRitem"/><w:tabs><w:tab w:val="left" w:pos="1800"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="1800" w:right="720" w:hanging="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRheader"><w:name w:val="RCR:header"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006D781E"/><w:pPr><w:pStyle w:val="RCRheader"/><w:tabs><w:tab w:val="left" w:pos="792"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="right" w:leader="underscore" w:pos="8640"/></w:tabs><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="line"><w:name w:val="line"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006B63C2"/><w:pPr><w:pStyle w:val="line"/><w:spacing w:before="0" w:line="40" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="12"/><w:sz-cs w:val="12"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang7"><w:name w:val="req lang: 7"/><w:basedOn w:val="reqlang6"/><w:rsid w:val="00C0337E"/><w:pPr><w:pStyle w:val="reqlang7"/><w:ind w:left="2520"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang70"><w:name w:val="req lang:7"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang70"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang8"><w:name w:val="req lang:8"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang8"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang9"><w:name w:val="req lang:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="007534C9"/><w:pPr><w:pStyle w:val="reqlang9"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="3240"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AF20CB"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment1"><w:name w:val="comment:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment1"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment2"><w:name w:val="comment:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment2"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="720"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment3"><w:name w:val="comment:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1080"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment4"><w:name w:val="comment:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment4"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1440"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment5"><w:name w:val="comment:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment5"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment6"><w:name w:val="comment:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment6"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment7"><w:name w:val="comment:7"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment7"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2520"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment8"><w:name w:val="comment:8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment8"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2880"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment9"><w:name w:val="comment:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment9"/><w:spacing w:after="80"/><w:ind w:left="3240"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlheader"><w:name w:val="dl:header"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlheader"/><w:spacing w:before="240" w:after="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier" w:h-ansi="Courier"/><wx:font wx:val="Courier"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlbody"><w:name w:val="dl:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlbody"/><w:spacing w:before="0"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocheader"><w:name w:val="dl_proc:header"/><w:basedOn w:val="dlbody"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocheader"/><w:spacing w:before="240"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocbody"><w:name w:val="dl_proc:body"/><w:basedOn w:val="dlprocheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocbody"/><w:spacing w:before="0"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dldescription"><w:name w:val="dl:description"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dldescription"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapheader"><w:name w:val="bitmap:header"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapheader"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapbody"><w:name w:val="bitmap:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapbody"/><w:spacing w:before="0"/></w:pPr><w:rPr><wx:font wx:val="Courier"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX1"><w:name w:val="APPENDIX 1"/><w:basedOn w:val="Normal"/><w:next w:val="paranormal"/><w:rsid w:val="004978C4"/><w:pPr><w:pStyle w:val="APPENDIX1"/><w:listPr><w:ilfo w:val="25"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="152" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX2"><w:name w:val="APPENDIX 2"/><w:basedOn w:val="APPENDIX1"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX2"/><w:listPr><w:ilvl w:val="1"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX3"><w:name w:val="APPENDIX 3"/><w:basedOn w:val="APPENDIX2"/><w:next w:val="paranormal"/><w:rsid w:val="00E904D2"/><w:pPr><w:pStyle w:val="APPENDIX3"/><w:listPr><w:ilvl w:val="2"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage18pt"><w:name w:val="Title Page 18pt"/><w:basedOn w:val="Normal"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage18pt"/><w:spacing w:before="0" w:after="60" w:line="240" w:line-rule="auto"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz w:val="36"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage16pt"><w:name w:val="Title Page 16pt"/><w:basedOn w:val="TitlePage18pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage16pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage14pt"><w:name w:val="Title Page 14pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage14pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10pt"><w:name w:val="para 10pt"/><w:basedOn w:val="Normal"/><w:link w:val="para10ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para10pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10ptnospacing"><w:name w:val="para 10pt no spacing"/><w:basedOn w:val="para10pt"/><w:rsid w:val="004A1CCA"/><w:pPr><w:pStyle w:val="para10ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10nospacing"><w:name w:val="TableText10 no spacing"/><w:basedOn w:val="TableText10"/><w:rsid w:val="00D72507"/><w:pPr><w:pStyle w:val="TableText10nospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8pt"><w:name w:val="para 8pt"/><w:basedOn w:val="Normal"/><w:link w:val="para8ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para8pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paranormalChar"><w:name w:val="para:normal Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="paranormal"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="bulletlvl1CharChar"><w:name w:val="bullet:lvl 1 Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="bulletlvl1"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:before="0" w:after="120" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl10"><w:name w:val="list lvl 1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl10"/><w:listPr><w:ilfo w:val="9"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/></w:tabs><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX4"><w:name w:val="APPENDIX 4"/><w:basedOn w:val="APPENDIX3"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX4"/><w:listPr><w:ilvl w:val="3"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX5"><w:name w:val="APPENDIX 5"/><w:basedOn w:val="APPENDIX4"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX5"/><w:listPr><w:ilvl w:val="4"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX6"><w:name w:val="APPENDIX 6"/><w:basedOn w:val="APPENDIX5"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX6"/><w:listPr><w:ilvl w:val="5"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX7"><w:name w:val="APPENDIX 7"/><w:basedOn w:val="APPENDIX6"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX7"/><w:listPr><w:ilvl w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX8"><w:name w:val="APPENDIX 8"/><w:basedOn w:val="APPENDIX7"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX8"/><w:listPr><w:ilvl w:val="7"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX9"><w:name w:val="APPENDIX 9"/><w:basedOn w:val="APPENDIX8"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX9"/><w:listPr><w:ilvl w:val="8"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00B47E5D"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="list" w:styleId="listreset"><w:name w:val="listreset"/><w:basedOn w:val="NoList"/><w:rsid w:val="00D25E39"/><w:pPr><w:listPr><w:ilfo w:val="26"/></w:listPr></w:pPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl3"><w:name w:val="bullet:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00EF5226"/><w:pPr><w:pStyle w:val="bulletlvl3"/><w:listPr><w:ilfo w:val="28"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="3024"/><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1368" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage22pt"><w:name w:val="Title Page 22pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="005F35C4"/><w:pPr><w:pStyle w:val="TitlePage22pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="44"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para"><w:name w:val="para"/><w:basedOn w:val="Normal"/><w:link w:val="paraChar"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="para"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paraChar"><w:name w:val="para Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="para"/><w:rsid w:val="0057061B"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl20"><w:name w:val="list lvl 2"/><w:basedOn w:val="ListNumber3"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="listlvl20"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="008B1AB7"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="character" w:styleId="para8ptChar"><w:name w:val="para 8pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para8pt"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptunderline"><w:name w:val="para 8pt underline"/><w:basedOn w:val="para8pt"/><w:link w:val="para8ptunderlineChar"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptunderline"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="para8ptunderlineChar"><w:name w:val="para 8pt underline Char"/><w:basedOn w:val="para8ptChar"/><w:link w:val="para8ptunderline"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptnospacing"><w:name w:val="para 8pt no spacing"/><w:basedOn w:val="para8pt"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl0"><w:name w:val="list lvl 0"/><w:basedOn w:val="ListNumber"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="listlvl0"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="ListNumber"/><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="para10ptChar"><w:name w:val="para 10pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para10pt"/><w:rsid w:val="0015054E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00B8047C"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart8"><w:name w:val="micro:art8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart8"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart9"><w:name w:val="micro:art9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart9"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart10"><w:name w:val="micro:art10"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart10"/><w:spacing w:before="120" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="39938"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:attachedTemplate w:val=""/><w:stylePaneFormatFilter w:val="1F08"/><w:trackRevisions/><w:documentProtection w:formatting="on" w:enforcement="off"/><w:defaultTabStop w:val="720"/><w:doNotHyphenateCaps/><w:drawingGridHorizontalSpacing w:val="120"/><w:drawingGridVerticalSpacing w:val="120"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="3"/><w:useMarginsForDrawingGridOrigin/><w:doNotShadeFormData/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="39938"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/><w:p wsp:rsidR="00A31B9B" wsp:rsidRDefault="00A31B9B"/></w:endnote></w:endnotePr><w:compat><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00244327"/><wsp:rsid wsp:val="001766F7"/><wsp:rsid wsp:val="00244327"/><wsp:rsid wsp:val="00436451"/><wsp:rsid wsp:val="005501C9"/><wsp:rsid wsp:val="005C6782"/><wsp:rsid wsp:val="00787401"/><wsp:rsid wsp:val="007F3E1C"/><wsp:rsid wsp:val="00801B1F"/><wsp:rsid wsp:val="00A31B9B"/><wsp:rsid wsp:val="00B17C0D"/><wsp:rsid wsp:val="00DA2221"/><wsp:rsid wsp:val="00DD246B"/><wsp:rsid wsp:val="00F37900"/></wsp:rsids></w:docPr><w:body><wx:sect><ns2:Word_Template_Content ns2:guid="AAABIad6r+oB6_HrOv0A_w" ns2:attrId="41"><w:p wsp:rsidR="00F37900" wsp:rsidRDefault="00A31B9B" wsp:rsidP="00E54E52"><w:pPr><w:rPr><aml:annotation aml:id="0" aml:author="B1375980" aml:createdate="2009-06-03T12:13:00Z" w:type="Word.Insertion"/></w:rPr></w:pPr><w:r wsp:rsidRPr="00EB2959"><w:t>The methods of the individual and collaborative robot objects shall be documented in an external database/document, which shall become the functional specification for the robot API. This database shall contain the following information:</w:t></w:r></w:p><w:p wsp:rsidR="006A3C0C" wsp:rsidRPr="00EB2959" wsp:rsidRDefault="00F37900" wsp:rsidP="00E54E52"><w:pPr><w:listPr><aml:annotation aml:id="1" aml:author="B1375980" aml:createdate="2009-06-03T12:13:00Z" w:type="Word.Insertion"/></w:listPr></w:pPr><aml:annotation aml:id="2" aml:author="B1375980" aml:createdate="2009-06-03T12:13:00Z" w:type="Word.Insertion"><aml:content><w:r><w:t>This is for testing against tracked changes. These changes should not be allowed.</w:t></w:r></aml:content></aml:annotation><w:r wsp:rsidR="00A31B9B" wsp:rsidRPr="00EB2959"><w:t> </w:t></w:r></w:p></ns2:Word_Template_Content><w:p wsp:rsidR="00DA2221" wsp:rsidRDefault="00DA2221"/><w:p wsp:rsidR="00DA2221" wsp:rsidRDefault="00DA2221"><w:pPr><w:rPr><w:vanish/></w:rPr></w:pPr><w:r><w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r wsp:rsidR="00A31B9B"><w:rPr><w:vanish/></w:rPr><w:instrText> LISTNUM "list</w:instrText></w:r><w:r wsp:rsidR="00A31B9B"><w:rPr><w:vanish/></w:rPr><w:instrText>reset" \l 1 \s 0 </w:instrText></w:r><w:r><w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType="end"><aml:annotation aml:id="3" aml:author="B1375980" aml:createdate="2009-06-03T12:13:00Z" w:type="Word.Numbering" w:original=" ."/></w:fldChar><wx:t wx:val=" ."/></w:r></w:p><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"/><w:sectPr wsp:rsidR="007F3E1C" wsp:rsidSect="007F3E1C"><w:hdr w:type="odd"><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="432" w:footer="432" w:gutter="0"/><w:pgNumType w:start="1"/><w:cols w:space="475"/><w:noEndnote/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/.classpath b/org.eclipse.osee.framework.ui.skynet/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/.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.framework.ui.skynet/.options b/org.eclipse.osee.framework.ui.skynet/.options
new file mode 100644
index 00000000000..6eb9af675bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/.options
@@ -0,0 +1,11 @@
+org.eclipse.osee.framework.ui.skynet/debug = false
+
+org.eclipse.osee.framework.ui.skynet/debug/Merge = false
+
+org.eclipse.osee.framework.ui.skynet/debug/Change = false
+
+org.eclipse.osee.framework.ui.skynet/debug/Blam = false
+
+org.eclipse.osee.framework.ui.skynet/debug/Renderer = false
+
+org.eclipse.osee.framework.ui.skynet/debug/Word = false
diff --git a/org.eclipse.osee.framework.ui.skynet/.project b/org.eclipse.osee.framework.ui.skynet/.project
new file mode 100644
index 00000000000..3b9dc63340b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.skynet</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.skynet/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.osee.framework.ui.skynet/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..7532ba45e03
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,8 @@
+#Tue Apr 22 08:04:29 MST 2008
+eclipse.preferences.version=1
+formatter_settings_version=11
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/org.eclipse.osee.framework.ui.skynet/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.skynet/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..70052cd46a7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/META-INF/MANIFEST.MF
@@ -0,0 +1,115 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Gui Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.skynet;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Eclipse-ExtensibleAPI: true
+Bundle-Activator: org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.search,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.update.core,
+ org.eclipse.ui.forms,
+ org.eclipse.osee.framework.database,
+ org.eclipse.ui.ide,
+ org.junit4,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.debug.ui,
+ org.eclipse.osee.framework.messaging.event.skynet,
+ org.eclipse.core.expressions,
+ org.eclipse.zest.layouts,
+ org.eclipse.compare,
+ javax.mail.glassfish,
+ org.eclipse.help,
+ org.eclipse.nebula.widgets.xviewer,
+ org.eclipse.birt.chart.engine,
+ org.eclipse.jface.text,
+ org.eclipse.zest.core,
+ org.eclipse.ui.views
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Import-Package: org.eclipse.nebula.widgets.calendarcombo,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.client.server,
+ 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.db.connection,
+ org.eclipse.osee.framework.db.connection.core,
+ org.eclipse.osee.framework.db.connection.core.query,
+ org.eclipse.osee.framework.db.connection.core.schema,
+ org.eclipse.osee.framework.db.connection.core.transaction,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.db.connection.info,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.skynet.core.conflict
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.ui.skynet.Import,
+ org.eclipse.osee.framework.ui.skynet.access,
+ org.eclipse.osee.framework.ui.skynet.artifact,
+ org.eclipse.osee.framework.ui.skynet.artifact.annotation,
+ org.eclipse.osee.framework.ui.skynet.artifact.editor,
+ org.eclipse.osee.framework.ui.skynet.artifact.editor.pages,
+ org.eclipse.osee.framework.ui.skynet.artifact.editor.parts,
+ org.eclipse.osee.framework.ui.skynet.artifact.editor.sections,
+ org.eclipse.osee.framework.ui.skynet.artifact.massEditor,
+ org.eclipse.osee.framework.ui.skynet.ats,
+ org.eclipse.osee.framework.ui.skynet.blam,
+ org.eclipse.osee.framework.ui.skynet.blam.operation,
+ org.eclipse.osee.framework.ui.skynet.branch,
+ org.eclipse.osee.framework.ui.skynet.commandHandlers,
+ org.eclipse.osee.framework.ui.skynet.commandHandlers.branch,
+ org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit,
+ org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers,
+ org.eclipse.osee.framework.ui.skynet.dbinit,
+ org.eclipse.osee.framework.ui.skynet.dialogs,
+ org.eclipse.osee.framework.ui.skynet.export,
+ org.eclipse.osee.framework.ui.skynet.group,
+ org.eclipse.osee.framework.ui.skynet.handler,
+ org.eclipse.osee.framework.ui.skynet.menu,
+ org.eclipse.osee.framework.ui.skynet.mergeWizard,
+ org.eclipse.osee.framework.ui.skynet.notify,
+ org.eclipse.osee.framework.ui.skynet.panels,
+ org.eclipse.osee.framework.ui.skynet.preferences,
+ org.eclipse.osee.framework.ui.skynet.queryLog,
+ org.eclipse.osee.framework.ui.skynet.relation.explorer,
+ org.eclipse.osee.framework.ui.skynet.render,
+ org.eclipse.osee.framework.ui.skynet.render.word,
+ org.eclipse.osee.framework.ui.skynet.render.word.template,
+ org.eclipse.osee.framework.ui.skynet.results,
+ org.eclipse.osee.framework.ui.skynet.results.chart,
+ org.eclipse.osee.framework.ui.skynet.results.example,
+ org.eclipse.osee.framework.ui.skynet.results.html,
+ org.eclipse.osee.framework.ui.skynet.results.table,
+ org.eclipse.osee.framework.ui.skynet.search,
+ org.eclipse.osee.framework.ui.skynet.search.filter,
+ org.eclipse.osee.framework.ui.skynet.search.ui,
+ org.eclipse.osee.framework.ui.skynet.skywalker,
+ org.eclipse.osee.framework.ui.skynet.status,
+ org.eclipse.osee.framework.ui.skynet.templates,
+ org.eclipse.osee.framework.ui.skynet.update,
+ org.eclipse.osee.framework.ui.skynet.util,
+ org.eclipse.osee.framework.ui.skynet.util.backup,
+ org.eclipse.osee.framework.ui.skynet.util.email,
+ org.eclipse.osee.framework.ui.skynet.util.filteredTree,
+ org.eclipse.osee.framework.ui.skynet.util.matrix,
+ org.eclipse.osee.framework.ui.skynet.widgets,
+ org.eclipse.osee.framework.ui.skynet.widgets.cellEditor,
+ org.eclipse.osee.framework.ui.skynet.widgets.dialog,
+ org.eclipse.osee.framework.ui.skynet.widgets.hex,
+ org.eclipse.osee.framework.ui.skynet.widgets.workflow,
+ org.eclipse.osee.framework.ui.skynet.widgets.xBranch,
+ org.eclipse.osee.framework.ui.skynet.widgets.xHistory,
+ org.eclipse.osee.framework.ui.skynet.widgets.xbargraph,
+ org.eclipse.osee.framework.ui.skynet.widgets.xchange,
+ org.eclipse.osee.framework.ui.skynet.widgets.xmerge,
+ org.eclipse.osee.framework.ui.skynet.widgets.xnavigate,
+ org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet,
+ org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column
diff --git a/org.eclipse.osee.framework.ui.skynet/build.properties b/org.eclipse.osee.framework.ui.skynet/build.properties
new file mode 100644
index 00000000000..3bb90d38e3b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/build.properties
@@ -0,0 +1,12 @@
+bin.includes = META-INF/,\
+ plugin.xml,\
+ images/,\
+ src/,\
+ support/,\
+ schema/,\
+ reference/,\
+ contexts/,\
+ .
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/artifactExplorerContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/artifactExplorerContexts.xml
new file mode 100644
index 00000000000..dc2132125c0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/artifactExplorerContexts.xml
@@ -0,0 +1,9 @@
+<contexts>
+ <context id="artifact_explorer_tree_viewer" title="Artifact Explorer">
+ <description>Displays artifacts in a relational hierarchy for navigation.</description>
+ <topic href="reference/creating_new_artifact.html" label="Creating a new artifact"/>
+ <topic href="reference/deleting_artifacts.html" label="Deleting artifacts"/>
+ <topic href="reference/go_into.html" label="Rooting on an artifact"/>
+ <topic label="Report a bug" href="../org.eclipse.osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/artifactSearchContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/artifactSearchContexts.xml
new file mode 100644
index 00000000000..421751998cd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/artifactSearchContexts.xml
@@ -0,0 +1,8 @@
+<contexts>
+ <context id="artifact_search" title="Artifact Search">
+ <description>Used to search for artifacts that are on the default branch.</description>
+ <topic label="Artifact Search Page" href="reference/artifact_search_page.html"/>
+ <topic label="Index Based Search" href="reference/index_base_search.html"/>
+ <topic label="Default Branch" href="reference/default_branch.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/branchManagerContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/branchManagerContexts.xml
new file mode 100644
index 00000000000..fff5be9fe91
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/branchManagerContexts.xml
@@ -0,0 +1,30 @@
+<contexts>
+ <context id="branch_manager_default_branch_menu" title="Set Default Branch">
+ <description>Sets the selected branch as the default branch.</description>
+ <topic label="Default Branch" href="reference/default_branch.html"/>
+ </context>
+ <context id="branch_manager_favorite_branch_menu" title="Mark/Unmark Favorite Branch">
+ <description>Toggles a branch as being favorite.</description>
+ <topic label="Favorite Branch" href="reference/favorite_branch.html"/>
+ </context>
+ <context id="branch_manager_show_change_report_menu" title="Show Change Report">
+ <description>Shows the Change Report for a branch or range of transactions.</description>
+ <topic label="Show Change Report" href="reference/show_change_report.html"/>
+ </context>
+
+ <context id="branch_manager_filtering" title="Branch Manager">
+ <description>Displays branches that are available in Skynet.</description>
+ <topic label="Branch Manager" href="reference/branch_manager_view.html"/>
+ <topic label="Branch Filtering" href="reference/branch_filtering.html"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+ <context id="BranchView" title="Branch Manager">
+ <description>Displays branches that are available in Skynet.</description>
+ <topic label="Branch Manager" href="reference/branch_manager_view.html"/>
+ <topic label="Branch Filtering" href="reference/branch_filtering.html"/>
+ <topic label="Default Branch" href="reference/default_branch.html"/>
+ <topic label="Favorite Branch" href="reference/favorite_branch.html"/>
+ <topic label="Show Change Report" href="reference/show_change_report.html"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/changeReportContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/changeReportContexts.xml
new file mode 100644
index 00000000000..66568fcc60c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/changeReportContexts.xml
@@ -0,0 +1,9 @@
+<contexts>
+ <context id="change_report_table" title="Change Report">
+ <description>Shows changes made on a branch, or between two transactions.</description>
+ <topic label="Reading a Change Report" href="reference/change_table.html"/>
+ <topic label="Refresh a Change Report" href="reference/refresh_change_report.html"/>
+ <topic label="Show a Change Report" href="reference/show_change_report.html"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/contexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/contexts.xml
new file mode 100644
index 00000000000..d10a655a31d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/contexts.xml
@@ -0,0 +1,17 @@
+<contexts>
+ <context id="artifact_editor" title="Artifact Editor">
+ <description>Artifact Editor</description>
+ <topic href="reference/creating_new_links.html" label="Creating a new Link"/>
+ <topic href="reference/reorder_links.html" label="Reordering links"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+ <context id="artifact_explorer_tree" title="Artifact Explorer">
+ <description>Displays artifacts in a relational hierarchy for navigation.</description>
+ <topic href="reference/artifact_explorer_tree.html" label="Drag and Drop"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+ <context id="xResultView" title="Result View">
+ <description>Show reports, errors, metrics and other data in a multi-paged view with print, email and exporting capabilities.</description>
+ <topic href="reference/result_view.html" label="Result View"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/mergeMangerContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/mergeMangerContexts.xml
new file mode 100644
index 00000000000..04ab604fa5b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/mergeMangerContexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="Merge_Manager_View" title="Merge Manager">
+ <description>Shows conflicts and allows resolution of conflicts found between a working branch and baseline branch.</description>
+ <topic href="reference/Merge_Manager.html" label="Using the Merge Manager"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/relationPageContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/relationPageContexts.xml
new file mode 100644
index 00000000000..206eaa31833
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/relationPageContexts.xml
@@ -0,0 +1,9 @@
+<contexts>
+ <context id="relation_page_tree_viewer" title="Relation Page">
+ <description>An editor to support relation link creation, modification and deletion.</description>
+ <topic href="reference/creating_new_links.html" label="Creating a new Link"/>
+ <topic href="reference/deleting_link.html" label="Deleting a Link"/>
+ <topic href="reference/reorder_links.html" label="Reordering links"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/contexts/revisionHistoryContexts.xml b/org.eclipse.osee.framework.ui.skynet/contexts/revisionHistoryContexts.xml
new file mode 100644
index 00000000000..e43a056c849
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/contexts/revisionHistoryContexts.xml
@@ -0,0 +1,8 @@
+<contexts>
+ <context id="HistoryView" title="Revision History">
+ <description>Displays the history on an artifact.</description>
+ <topic href="reference/revision_history_view.html" label="Resource History"/>
+ <topic href="reference/compare_two_artifacts.html" label="Compare two Artifacts"/>
+ <topic label="Report a bug" href="../org.eclipse.osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.framework.ui.skynet/images/A.gif b/org.eclipse.osee.framework.ui.skynet/images/A.gif
new file mode 100644
index 00000000000..6a18beda16c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/A.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted.gif b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted.gif
new file mode 100644
index 00000000000..069370a5c21
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted_small.gif b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted_small.gif
new file mode 100644
index 00000000000..88cf73632b0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Deleted_small.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified.gif b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified.gif
new file mode 100644
index 00000000000..c3dac96e06c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified_small.gif b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified_small.gif
new file mode 100644
index 00000000000..bb1727184a2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_Modified_small.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_New.gif b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_New.gif
new file mode 100644
index 00000000000..f9dc2dcf882
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/CONFLICTING_New.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/DBicon.GIF b/org.eclipse.osee.framework.ui.skynet/images/DBicon.GIF
new file mode 100644
index 00000000000..695a31c688a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/DBicon.GIF
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/DBicon2.GIF b/org.eclipse.osee.framework.ui.skynet/images/DBicon2.GIF
new file mode 100644
index 00000000000..ed8926657bf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/DBicon2.GIF
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/DBiconBlue.GIF b/org.eclipse.osee.framework.ui.skynet/images/DBiconBlue.GIF
new file mode 100644
index 00000000000..cf6f15dd415
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/DBiconBlue.GIF
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/DBiconBlueEdit.GIF b/org.eclipse.osee.framework.ui.skynet/images/DBiconBlueEdit.GIF
new file mode 100644
index 00000000000..250d10fdcbd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/DBiconBlueEdit.GIF
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/INCOMING_Deleted.gif b/org.eclipse.osee.framework.ui.skynet/images/INCOMING_Deleted.gif
new file mode 100644
index 00000000000..7b5e26e6876
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/INCOMING_Deleted.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/INCOMING_Modified.gif b/org.eclipse.osee.framework.ui.skynet/images/INCOMING_Modified.gif
new file mode 100644
index 00000000000..5951d0f74fd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/INCOMING_Modified.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/INCOMING_New.gif b/org.eclipse.osee.framework.ui.skynet/images/INCOMING_New.gif
new file mode 100644
index 00000000000..7ed06a54405
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/INCOMING_New.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Deleted.gif b/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Deleted.gif
new file mode 100644
index 00000000000..b8112ca5702
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Deleted.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Modified.gif b/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Modified.gif
new file mode 100644
index 00000000000..46e47252700
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_Modified.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_New.gif b/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_New.gif
new file mode 100644
index 00000000000..4527b465de2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/OUTGOING_New.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/WordMlImport.bmp b/org.eclipse.osee.framework.ui.skynet/images/WordMlImport.bmp
new file mode 100644
index 00000000000..7b9bfb83400
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/WordMlImport.bmp
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/accept.gif b/org.eclipse.osee.framework.ui.skynet/images/accept.gif
new file mode 100644
index 00000000000..9cacb96dca9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/accept.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/action.gif b/org.eclipse.osee.framework.ui.skynet/images/action.gif
new file mode 100644
index 00000000000..6a18beda16c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/action.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/add.gif b/org.eclipse.osee.framework.ui.skynet/images/add.gif
new file mode 100644
index 00000000000..252d7ebcb8c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/add.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/admin.gif b/org.eclipse.osee.framework.ui.skynet/images/admin.gif
new file mode 100644
index 00000000000..272eec37d74
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/admin.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/alert_8_8.gif b/org.eclipse.osee.framework.ui.skynet/images/alert_8_8.gif
new file mode 100644
index 00000000000..ee2dac4a90a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/alert_8_8.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/appserver.gif b/org.eclipse.osee.framework.ui.skynet/images/appserver.gif
new file mode 100644
index 00000000000..939ec849e73
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/appserver.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/archive.gif b/org.eclipse.osee.framework.ui.skynet/images/archive.gif
new file mode 100644
index 00000000000..728e07e2cc3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/archive.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact.gif b/org.eclipse.osee.framework.ui.skynet/images/artifact.gif
new file mode 100644
index 00000000000..a29e9d58613
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact.xcf b/org.eclipse.osee.framework.ui.skynet/images/artifact.xcf
new file mode 100644
index 00000000000..6dcb4509c3c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact_editor.gif b/org.eclipse.osee.framework.ui.skynet/images/artifact_editor.gif
new file mode 100644
index 00000000000..a88fcbf1940
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact_editor.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.gif b/org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.gif
new file mode 100644
index 00000000000..23b46a83e46
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.xcf b/org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.xcf
new file mode 100644
index 00000000000..48e981efdda
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact_explorer.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact_search.gif b/org.eclipse.osee.framework.ui.skynet/images/artifact_search.gif
new file mode 100644
index 00000000000..799d3d5686c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact_search.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/artifact_version.gif b/org.eclipse.osee.framework.ui.skynet/images/artifact_version.gif
new file mode 100644
index 00000000000..c10c0def441
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/artifact_version.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/aspect.gif b/org.eclipse.osee.framework.ui.skynet/images/aspect.gif
new file mode 100644
index 00000000000..11d750ac0f2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/aspect.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/attribute.gif b/org.eclipse.osee.framework.ui.skynet/images/attribute.gif
new file mode 100644
index 00000000000..8a92e51188a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/attribute.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/authenticated.gif b/org.eclipse.osee.framework.ui.skynet/images/authenticated.gif
new file mode 100644
index 00000000000..c9170d9ca9c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/authenticated.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/back.gif b/org.eclipse.osee.framework.ui.skynet/images/back.gif
new file mode 100644
index 00000000000..4fb41501036
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/back.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/baseline.gif b/org.eclipse.osee.framework.ui.skynet/images/baseline.gif
new file mode 100644
index 00000000000..7ae2daf2c34
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/baseline.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/black_check.gif b/org.eclipse.osee.framework.ui.skynet/images/black_check.gif
new file mode 100644
index 00000000000..bbb54c95ab9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/black_check.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/blam.gif b/org.eclipse.osee.framework.ui.skynet/images/blam.gif
new file mode 100644
index 00000000000..7134210d0a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/blam.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/blue_d.gif b/org.eclipse.osee.framework.ui.skynet/images/blue_d.gif
new file mode 100644
index 00000000000..1cdc000633e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/blue_d.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch.gif b/org.eclipse.osee.framework.ui.skynet/images/branch.gif
new file mode 100644
index 00000000000..9c4a6755758
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branchSynch.gif b/org.eclipse.osee.framework.ui.skynet/images/branchSynch.gif
new file mode 100644
index 00000000000..2b3290466de
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branchSynch.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branchYellow.gif b/org.eclipse.osee.framework.ui.skynet/images/branchYellow.gif
new file mode 100644
index 00000000000..f73553e7398
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branchYellow.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_baseline.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_baseline.gif
new file mode 100644
index 00000000000..7ae2daf2c34
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_baseline.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_change.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_change.gif
new file mode 100644
index 00000000000..9fec358955b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_change.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_change.xcf b/org.eclipse.osee.framework.ui.skynet/images/branch_change.xcf
new file mode 100644
index 00000000000..02566fca3e1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_change.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.gif
new file mode 100644
index 00000000000..57b60f5ef41
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.xcf b/org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.xcf
new file mode 100644
index 00000000000..8a5532a94ca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_change_source.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_change_source.gif
new file mode 100644
index 00000000000..6510726e9da
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_change_source.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_change_source.xcf b/org.eclipse.osee.framework.ui.skynet/images/branch_change_source.xcf
new file mode 100644
index 00000000000..7751a80f87e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_change_source.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_merge.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_merge.gif
new file mode 100644
index 00000000000..4aba624dd12
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_merge.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_top.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_top.gif
new file mode 100644
index 00000000000..44cd62f68af
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_top.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/branch_working.gif b/org.eclipse.osee.framework.ui.skynet/images/branch_working.gif
new file mode 100644
index 00000000000..e324766bd4d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/branch_working.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/bug.gif b/org.eclipse.osee.framework.ui.skynet/images/bug.gif
new file mode 100644
index 00000000000..9a738e55054
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/bug.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/change_managed_branch.gif b/org.eclipse.osee.framework.ui.skynet/images/change_managed_branch.gif
new file mode 100644
index 00000000000..5211f45e5fd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/change_managed_branch.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif b/org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif
new file mode 100644
index 00000000000..7aa131aedb6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled.gif b/org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled.gif
new file mode 100644
index 00000000000..9cacb96dca9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gif b/org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gif
new file mode 100644
index 00000000000..a2f384caec9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/chkbox_red.gif b/org.eclipse.osee.framework.ui.skynet/images/chkbox_red.gif
new file mode 100644
index 00000000000..db62a0aceb5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/chkbox_red.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/chkbox_redslash.gif b/org.eclipse.osee.framework.ui.skynet/images/chkbox_redslash.gif
new file mode 100644
index 00000000000..ef157d2a19a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/chkbox_redslash.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/clear.gif b/org.eclipse.osee.framework.ui.skynet/images/clear.gif
new file mode 100644
index 00000000000..af30a42f83d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/clear.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/clock.gif b/org.eclipse.osee.framework.ui.skynet/images/clock.gif
new file mode 100644
index 00000000000..c984fba7039
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/clock.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/collapseAll.gif b/org.eclipse.osee.framework.ui.skynet/images/collapseAll.gif
new file mode 100644
index 00000000000..a2d80a9044f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/collapseAll.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/commit.gif b/org.eclipse.osee.framework.ui.skynet/images/commit.gif
new file mode 100644
index 00000000000..7561e36e239
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/commit.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/commitBranch.gif b/org.eclipse.osee.framework.ui.skynet/images/commitBranch.gif
new file mode 100644
index 00000000000..2186735e656
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/commitBranch.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/conflict.gif b/org.eclipse.osee.framework.ui.skynet/images/conflict.gif
new file mode 100644
index 00000000000..433652430f6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/conflict.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/copyToClipboard.gif b/org.eclipse.osee.framework.ui.skynet/images/copyToClipboard.gif
new file mode 100644
index 00000000000..540860fb103
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/copyToClipboard.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/customize.gif b/org.eclipse.osee.framework.ui.skynet/images/customize.gif
new file mode 100644
index 00000000000..e9540ff77dd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/customize.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/customizeD.gif b/org.eclipse.osee.framework.ui.skynet/images/customizeD.gif
new file mode 100644
index 00000000000..f0ce638b800
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/customizeD.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/customizeG.gif b/org.eclipse.osee.framework.ui.skynet/images/customizeG.gif
new file mode 100644
index 00000000000..7447efda55d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/customizeG.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/customizeP.gif b/org.eclipse.osee.framework.ui.skynet/images/customizeP.gif
new file mode 100644
index 00000000000..3e88710663b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/customizeP.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/customizePersonal.gif b/org.eclipse.osee.framework.ui.skynet/images/customizePersonal.gif
new file mode 100644
index 00000000000..b6d9161b68f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/customizePersonal.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/delete.gif b/org.eclipse.osee.framework.ui.skynet/images/delete.gif
new file mode 100644
index 00000000000..b6922ac11cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/delete.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/delete_edit.gif b/org.eclipse.osee.framework.ui.skynet/images/delete_edit.gif
new file mode 100644
index 00000000000..b6922ac11cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/delete_edit.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/dirty.gif b/org.eclipse.osee.framework.ui.skynet/images/dirty.gif
new file mode 100644
index 00000000000..2532de21e31
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/dirty.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/disabled_attribute.gif b/org.eclipse.osee.framework.ui.skynet/images/disabled_attribute.gif
new file mode 100644
index 00000000000..86a2be29460
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/disabled_attribute.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/docOrder.gif b/org.eclipse.osee.framework.ui.skynet/images/docOrder.gif
new file mode 100644
index 00000000000..a86cda7edd8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/docOrder.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/down.gif b/org.eclipse.osee.framework.ui.skynet/images/down.gif
new file mode 100644
index 00000000000..072b1844572
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/down.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/duplicate.gif b/org.eclipse.osee.framework.ui.skynet/images/duplicate.gif
new file mode 100644
index 00000000000..dc549bce841
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/duplicate.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/edit.gif b/org.eclipse.osee.framework.ui.skynet/images/edit.gif
new file mode 100644
index 00000000000..95b8e17c761
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/edit.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/edit2.gif b/org.eclipse.osee.framework.ui.skynet/images/edit2.gif
new file mode 100644
index 00000000000..94eedf6f929
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/edit2.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/edit_artifact.gif b/org.eclipse.osee.framework.ui.skynet/images/edit_artifact.gif
new file mode 100644
index 00000000000..571844ca4b1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/edit_artifact.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/email.gif b/org.eclipse.osee.framework.ui.skynet/images/email.gif
new file mode 100644
index 00000000000..2cb69621de8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/email.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/error.gif b/org.eclipse.osee.framework.ui.skynet/images/error.gif
new file mode 100644
index 00000000000..c112416d5ac
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/error.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/errorRound.gif b/org.eclipse.osee.framework.ui.skynet/images/errorRound.gif
new file mode 100644
index 00000000000..0bc60689c6d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/errorRound.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/expandAll.gif b/org.eclipse.osee.framework.ui.skynet/images/expandAll.gif
new file mode 100644
index 00000000000..0205b29176d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/expandAll.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/export_data.gif b/org.eclipse.osee.framework.ui.skynet/images/export_data.gif
new file mode 100644
index 00000000000..e32b79455ff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/export_data.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/export_table.gif b/org.eclipse.osee.framework.ui.skynet/images/export_table.gif
new file mode 100644
index 00000000000..d11c996e570
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/export_table.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/file.gif b/org.eclipse.osee.framework.ui.skynet/images/file.gif
new file mode 100644
index 00000000000..d05c905d2da
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/file.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/filter.gif b/org.eclipse.osee.framework.ui.skynet/images/filter.gif
new file mode 100644
index 00000000000..3d061d77cbe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/filter.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/flashlight.gif b/org.eclipse.osee.framework.ui.skynet/images/flashlight.gif
new file mode 100644
index 00000000000..d540a01f4d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/flashlight.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/flat_layout.gif b/org.eclipse.osee.framework.ui.skynet/images/flat_layout.gif
new file mode 100644
index 00000000000..1ef74cf98f4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/flat_layout.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/folder.gif b/org.eclipse.osee.framework.ui.skynet/images/folder.gif
new file mode 100644
index 00000000000..b6858690c89
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/folder.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/gear.gif b/org.eclipse.osee.framework.ui.skynet/images/gear.gif
new file mode 100644
index 00000000000..272eec37d74
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/gear.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/gears.gif b/org.eclipse.osee.framework.ui.skynet/images/gears.gif
new file mode 100644
index 00000000000..86683b8bd64
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/gears.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/greenBug.gif b/org.eclipse.osee.framework.ui.skynet/images/greenBug.gif
new file mode 100644
index 00000000000..b0dfd3ba982
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/greenBug.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/greenPlus.gif b/org.eclipse.osee.framework.ui.skynet/images/greenPlus.gif
new file mode 100644
index 00000000000..252d7ebcb8c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/greenPlus.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/green_light.gif b/org.eclipse.osee.framework.ui.skynet/images/green_light.gif
new file mode 100644
index 00000000000..d5d9bdf15a7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/green_light.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/green_lock.gif b/org.eclipse.osee.framework.ui.skynet/images/green_lock.gif
new file mode 100644
index 00000000000..6cacf2e802a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/green_lock.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/green_s.gif b/org.eclipse.osee.framework.ui.skynet/images/green_s.gif
new file mode 100644
index 00000000000..970bd19ffc5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/green_s.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/group.gif b/org.eclipse.osee.framework.ui.skynet/images/group.gif
new file mode 100644
index 00000000000..5ba5b91c5bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/group.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/heading.gif b/org.eclipse.osee.framework.ui.skynet/images/heading.gif
new file mode 100644
index 00000000000..243d853859b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/heading.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/help.gif b/org.eclipse.osee.framework.ui.skynet/images/help.gif
new file mode 100644
index 00000000000..9d70301dae3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/help.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/icon_success.gif b/org.eclipse.osee.framework.ui.skynet/images/icon_success.gif
new file mode 100644
index 00000000000..52e85a430af
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/icon_success.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/icon_warning.gif b/org.eclipse.osee.framework.ui.skynet/images/icon_warning.gif
new file mode 100644
index 00000000000..e1675172b65
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/icon_warning.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/import.gif b/org.eclipse.osee.framework.ui.skynet/images/import.gif
new file mode 100644
index 00000000000..27506f6d7e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/import.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/info_lg.gif b/org.eclipse.osee.framework.ui.skynet/images/info_lg.gif
new file mode 100644
index 00000000000..2da001e3e98
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/info_lg.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/info_sm.gif b/org.eclipse.osee.framework.ui.skynet/images/info_sm.gif
new file mode 100644
index 00000000000..33cc76e9dc5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/info_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/issue.gif b/org.eclipse.osee.framework.ui.skynet/images/issue.gif
new file mode 100644
index 00000000000..2da001e3e98
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/issue.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/laser_16_16.gif b/org.eclipse.osee.framework.ui.skynet/images/laser_16_16.gif
new file mode 100644
index 00000000000..b29b25ee454
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/laser_16_16.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/laser_8_8.gif b/org.eclipse.osee.framework.ui.skynet/images/laser_8_8.gif
new file mode 100644
index 00000000000..c7c1b6c15f7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/laser_8_8.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/line_match.gif b/org.eclipse.osee.framework.ui.skynet/images/line_match.gif
new file mode 100644
index 00000000000..8db66e96cba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/line_match.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/load.gif b/org.eclipse.osee.framework.ui.skynet/images/load.gif
new file mode 100644
index 00000000000..51e703b1b9c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/load.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/lockkey.gif b/org.eclipse.osee.framework.ui.skynet/images/lockkey.gif
new file mode 100644
index 00000000000..fca03252afd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/lockkey.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/magnify.gif b/org.eclipse.osee.framework.ui.skynet/images/magnify.gif
new file mode 100644
index 00000000000..f7b8f99ec59
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/magnify.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/major.gif b/org.eclipse.osee.framework.ui.skynet/images/major.gif
new file mode 100644
index 00000000000..609dbb7269c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/major.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/merge.gif b/org.eclipse.osee.framework.ui.skynet/images/merge.gif
new file mode 100644
index 00000000000..7aba2723f54
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/merge.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/minor.gif b/org.eclipse.osee.framework.ui.skynet/images/minor.gif
new file mode 100644
index 00000000000..cd83b96c201
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/minor.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/molecule.gif b/org.eclipse.osee.framework.ui.skynet/images/molecule.gif
new file mode 100644
index 00000000000..59f394e3cab
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/molecule.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/narrative.gif b/org.eclipse.osee.framework.ui.skynet/images/narrative.gif
new file mode 100644
index 00000000000..33be7d827dc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/narrative.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/nav_backward.gif b/org.eclipse.osee.framework.ui.skynet/images/nav_backward.gif
new file mode 100644
index 00000000000..740e8cae8da
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/nav_backward.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/nav_forward.gif b/org.eclipse.osee.framework.ui.skynet/images/nav_forward.gif
new file mode 100644
index 00000000000..19567890aa8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/nav_forward.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/newTask.gif b/org.eclipse.osee.framework.ui.skynet/images/newTask.gif
new file mode 100644
index 00000000000..9d8a4ffb997
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/newTask.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/not_equal.gif b/org.eclipse.osee.framework.ui.skynet/images/not_equal.gif
new file mode 100644
index 00000000000..e512465d3ea
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/not_equal.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/not_equal.xcf b/org.eclipse.osee.framework.ui.skynet/images/not_equal.xcf
new file mode 100644
index 00000000000..13f3d002e37
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/not_equal.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/old.gif b/org.eclipse.osee.framework.ui.skynet/images/old.gif
new file mode 100644
index 00000000000..d5ba9d48faa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/old.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/old.xcf b/org.eclipse.osee.framework.ui.skynet/images/old.xcf
new file mode 100644
index 00000000000..3905f8c792b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/old.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/open.gif b/org.eclipse.osee.framework.ui.skynet/images/open.gif
new file mode 100644
index 00000000000..6d2db3f2668
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/open.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/outline_co.gif b/org.eclipse.osee.framework.ui.skynet/images/outline_co.gif
new file mode 100644
index 00000000000..0dc862cbd7d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/outline_co.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/page.gif b/org.eclipse.osee.framework.ui.skynet/images/page.gif
new file mode 100644
index 00000000000..c1a19e19379
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/page.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/preview_artifact.gif b/org.eclipse.osee.framework.ui.skynet/images/preview_artifact.gif
new file mode 100644
index 00000000000..b9c7ff9918c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/preview_artifact.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/print.gif b/org.eclipse.osee.framework.ui.skynet/images/print.gif
new file mode 100644
index 00000000000..045de755326
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/print.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/product.gif b/org.eclipse.osee.framework.ui.skynet/images/product.gif
new file mode 100644
index 00000000000..346a94d0201
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/product.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/purge.gif b/org.eclipse.osee.framework.ui.skynet/images/purge.gif
new file mode 100644
index 00000000000..f2f36bdc7b2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/purge.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/purple.gif b/org.eclipse.osee.framework.ui.skynet/images/purple.gif
new file mode 100644
index 00000000000..c0787df92b2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/purple.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/query_log.gif b/org.eclipse.osee.framework.ui.skynet/images/query_log.gif
new file mode 100644
index 00000000000..e32b79455ff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/query_log.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/query_log.xcf b/org.eclipse.osee.framework.ui.skynet/images/query_log.xcf
new file mode 100644
index 00000000000..29d9cc37f1c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/query_log.xcf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/rectangle16.gif b/org.eclipse.osee.framework.ui.skynet/images/rectangle16.gif
new file mode 100644
index 00000000000..d441c8d0e36
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/rectangle16.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/rectangle24.gif b/org.eclipse.osee.framework.ui.skynet/images/rectangle24.gif
new file mode 100644
index 00000000000..a87c8819f71
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/rectangle24.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/redExclaim.gif b/org.eclipse.osee.framework.ui.skynet/images/redExclaim.gif
new file mode 100644
index 00000000000..3f43a29d901
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/redExclaim.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/redRemove.gif b/org.eclipse.osee.framework.ui.skynet/images/redRemove.gif
new file mode 100644
index 00000000000..6f647666d32
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/redRemove.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/red_light.gif b/org.eclipse.osee.framework.ui.skynet/images/red_light.gif
new file mode 100644
index 00000000000..b0a53c5dfd1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/red_light.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/red_lock.gif b/org.eclipse.osee.framework.ui.skynet/images/red_lock.gif
new file mode 100644
index 00000000000..e1c28823a6a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/red_lock.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/red_slash.gif b/org.eclipse.osee.framework.ui.skynet/images/red_slash.gif
new file mode 100644
index 00000000000..3c355e2708a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/red_slash.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/red_user_sm.gif b/org.eclipse.osee.framework.ui.skynet/images/red_user_sm.gif
new file mode 100644
index 00000000000..f91ca279748
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/red_user_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/refresh.gif b/org.eclipse.osee.framework.ui.skynet/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/reject.gif b/org.eclipse.osee.framework.ui.skynet/images/reject.gif
new file mode 100644
index 00000000000..c1751c3ff4f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/reject.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/relate.gif b/org.eclipse.osee.framework.ui.skynet/images/relate.gif
new file mode 100644
index 00000000000..870934b6934
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/relate.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/remove.gif b/org.eclipse.osee.framework.ui.skynet/images/remove.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/remove.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/removeAll.gif b/org.eclipse.osee.framework.ui.skynet/images/removeAll.gif
new file mode 100644
index 00000000000..28a3785aaca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/removeAll.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/repository.gif b/org.eclipse.osee.framework.ui.skynet/images/repository.gif
new file mode 100644
index 00000000000..0470e1588d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/repository.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/results.gif b/org.eclipse.osee.framework.ui.skynet/images/results.gif
new file mode 100644
index 00000000000..4c882068b69
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/results.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/rule.gif b/org.eclipse.osee.framework.ui.skynet/images/rule.gif
new file mode 100644
index 00000000000..1717976c07a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/rule.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/run_exc.gif b/org.eclipse.osee.framework.ui.skynet/images/run_exc.gif
new file mode 100644
index 00000000000..57f410224cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/run_exc.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/save.gif b/org.eclipse.osee.framework.ui.skynet/images/save.gif
new file mode 100644
index 00000000000..499dd0ca602
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/save.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/saved.gif b/org.eclipse.osee.framework.ui.skynet/images/saved.gif
new file mode 100644
index 00000000000..ad505a9c23f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/saved.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/skywalker.gif b/org.eclipse.osee.framework.ui.skynet/images/skywalker.gif
new file mode 100644
index 00000000000..695e5a5cfa5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/skywalker.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/snapshotSave.gif b/org.eclipse.osee.framework.ui.skynet/images/snapshotSave.gif
new file mode 100644
index 00000000000..46e9bfa6684
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/snapshotSave.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/sort.gif b/org.eclipse.osee.framework.ui.skynet/images/sort.gif
new file mode 100644
index 00000000000..2029de0e30e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/sort.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/star.gif b/org.eclipse.osee.framework.ui.skynet/images/star.gif
new file mode 100644
index 00000000000..f1c09d57db8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/star.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/star_9_9.gif b/org.eclipse.osee.framework.ui.skynet/images/star_9_9.gif
new file mode 100644
index 00000000000..e96e43ea722
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/star_9_9.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/switched.gif b/org.eclipse.osee.framework.ui.skynet/images/switched.gif
new file mode 100644
index 00000000000..650a7938b89
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/switched.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/task.gif b/org.eclipse.osee.framework.ui.skynet/images/task.gif
new file mode 100644
index 00000000000..36fc007591a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/task.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/test_procedure.gif b/org.eclipse.osee.framework.ui.skynet/images/test_procedure.gif
new file mode 100644
index 00000000000..af2fd7e42a2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/test_procedure.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/top.gif b/org.eclipse.osee.framework.ui.skynet/images/top.gif
new file mode 100644
index 00000000000..44cd62f68af
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/top.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/transaction.gif b/org.eclipse.osee.framework.ui.skynet/images/transaction.gif
new file mode 100644
index 00000000000..0bf73dc5ca0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/transaction.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/transaction_detail.gif b/org.eclipse.osee.framework.ui.skynet/images/transaction_detail.gif
new file mode 100644
index 00000000000..8564bb7760d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/transaction_detail.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/trash.gif b/org.eclipse.osee.framework.ui.skynet/images/trash.gif
new file mode 100644
index 00000000000..e00f14e0a84
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/trash.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/trash_can.gif b/org.eclipse.osee.framework.ui.skynet/images/trash_can.gif
new file mode 100644
index 00000000000..07061721d7f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/trash_can.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/tree_layout.gif b/org.eclipse.osee.framework.ui.skynet/images/tree_layout.gif
new file mode 100644
index 00000000000..234486172ca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/tree_layout.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/unarchive.gif b/org.eclipse.osee.framework.ui.skynet/images/unarchive.gif
new file mode 100644
index 00000000000..169f7b8d123
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/unarchive.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/undo.gif b/org.eclipse.osee.framework.ui.skynet/images/undo.gif
new file mode 100644
index 00000000000..eae118ad168
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/undo.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/up.gif b/org.eclipse.osee.framework.ui.skynet/images/up.gif
new file mode 100644
index 00000000000..07164754e5c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/up.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/userAdd.gif b/org.eclipse.osee.framework.ui.skynet/images/userAdd.gif
new file mode 100644
index 00000000000..3fdf0738e4c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/userAdd.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/userGrey.gif b/org.eclipse.osee.framework.ui.skynet/images/userGrey.gif
new file mode 100644
index 00000000000..b455f7388f1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/userGrey.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/userPurple.gif b/org.eclipse.osee.framework.ui.skynet/images/userPurple.gif
new file mode 100644
index 00000000000..de2e9c12e1c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/userPurple.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/userRed.gif b/org.eclipse.osee.framework.ui.skynet/images/userRed.gif
new file mode 100644
index 00000000000..f91ca279748
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/userRed.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/userYellow.gif b/org.eclipse.osee.framework.ui.skynet/images/userYellow.gif
new file mode 100644
index 00000000000..cd59cca184b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/userYellow.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/users2.gif b/org.eclipse.osee.framework.ui.skynet/images/users2.gif
new file mode 100644
index 00000000000..d28c326dea2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/users2.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/version.gif b/org.eclipse.osee.framework.ui.skynet/images/version.gif
new file mode 100644
index 00000000000..91868db39c4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/version.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/warn.gif b/org.eclipse.osee.framework.ui.skynet/images/warn.gif
new file mode 100644
index 00000000000..14009e9974d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/warn.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/widget.gif b/org.eclipse.osee.framework.ui.skynet/images/widget.gif
new file mode 100644
index 00000000000..c1e4ee3a59d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/widget.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/workflow.gif b/org.eclipse.osee.framework.ui.skynet/images/workflow.gif
new file mode 100644
index 00000000000..d4f14922643
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/workflow.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/working.gif b/org.eclipse.osee.framework.ui.skynet/images/working.gif
new file mode 100644
index 00000000000..e324766bd4d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/working.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/yellow_light.gif b/org.eclipse.osee.framework.ui.skynet/images/yellow_light.gif
new file mode 100644
index 00000000000..2d84c38a31c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/yellow_light.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/images/yellow_m.gif b/org.eclipse.osee.framework.ui.skynet/images/yellow_m.gif
new file mode 100644
index 00000000000..5fc23f9f04f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/images/yellow_m.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/plugin.xml b/org.eclipse.osee.framework.ui.skynet/plugin.xml
new file mode 100644
index 00000000000..bf50424d185
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/plugin.xml
@@ -0,0 +1,1786 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2005 rel. 3 U (http://www.altova.com) by Boeing (BOEING SHARED SERVICES GROUP) -->
+<?eclipse version="3.0"?>
+<plugin
+>
+ <extension-point id="ArtifactRenderer" name="ArtifactRenderer" schema="schema/ArtifactRenderer.exsd"/>
+ <extension-point id="BlamOperation" name="BlamOperation" schema="schema/BlamOperation.exsd"/>
+ <extension-point id="WordMlProducer" name="WordMlProducer" schema="schema/WordMlProducer.exsd"/>
+ <extension-point id="WordOutlineContentHandler" name="WordOutlineContentHandler" schema="schema/WordOutlineContentHandler.exsd"/>
+ <extension-point id="ArtifactRendererTemplate" name="ArtifactRendererTemplate" schema="schema/ArtifactRendererTemplate.exsd"/>
+ <extension-point id="OseeDictionary" name="OseeDictionary" schema="schema/OseeDictionary.exsd"/>
+ <extension-point id="XWidgetProvider" name="XWidgetProvider" schema="schema/XWidgetProvider.exsd"/>
+ <extension-point id="IgnorePublishAttribute" name="IgnorePublishAttribute" schema="schema/IgnorePublishAttribute.exsd"/>
+ <extension-point id="TemplateProvider" name="TemplateProvider" schema="schema/TemplateProvider.exsd"/>
+ <extension-point id="SimpleTemplateProviderTemplate" name="SimpleTemplateProviderTemplate" schema="schema/SimpleTemplateProviderTemplate.exsd"/>
+ <extension-point id="AttributeXWidgetProvider" name="AttributeXWidgetProvider" schema="schema/AttributeXWidgetProvider.exsd"/>
+ <extension-point id="WorkDefinitionProvider" name="WorkDefinitionProvider" schema="schema/WorkDefinitionProvider.exsd"/>
+ <extension-point id="ArtifactExtractor" name="ArtifactExtractor" schema="schema/ArtifactExtractor.exsd"/>
+ <extension-point id="DatabaseHealthOperation" name="DatabaseHealthOperation" schema="schema/DatabaseHealthOperation.exsd"/>
+ <extension-point id="ArtifactImageProvider" name="ArtifactImageProvider" schema="schema/ArtifactImageProvider.exsd"/>
+
+
+<extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="true"
+ id="osee.database.projectContribution"
+ objectClass="org.eclipse.core.resources.IResource">
+ <action
+ class="org.eclipse.osee.framework.ui.skynet.GenerateTypeEnumAction"
+ id="osee.define.popup.open.artifact"
+ label="Generate Type Classes"
+ menubarPath="osee.define.menu.main/main"/>
+ </objectContribution>
+
+</extension>
+ <extension point="org.eclipse.ui.importWizards">
+ <wizard category="org.eclipse.osee.define.import.category" class="org.eclipse.osee.framework.ui.skynet.Import.ArtifactImportWizard" icon="images/WordMlImport.bmp" id="org.eclipse.osee.framework.ui.skynet.artifact.Import.ImportWizard" name="OSEE Artifacts">
+ <description>
+ Import WordML documents into an existing Define project.
+ </description>
+ </wizard>
+ <wizard category="org.eclipse.osee.define.import.category" class="org.eclipse.osee.framework.ui.skynet.Import.ImportMetaWizard" icon="images/gears.gif" id="osee.define.artifact.Import.ImportMetaWizard" name="OSEE Types">
+ <description>
+ Import Skynet configuration information.
+ </description>
+ </wizard>
+ <category id="org.eclipse.osee.define.import.category" name="OSEE">
+ </category>
+ </extension>
+ <extension
+ point="org.eclipse.ui.exportWizards">
+ <wizard
+ category="org.eclipse.osee.framework.ui.skynet.export"
+ class="org.eclipse.osee.framework.ui.skynet.export.ArtifactExportWizard"
+ icon="images/query_log.gif"
+ id="org.eclipse.osee.framework.ui.skynet.artifactExport"
+ name="OSEE Artifact Export">
+ </wizard>
+ <category
+ id="org.eclipse.osee.framework.ui.skynet.export"
+ name="OSEE">
+ </category>
+ </extension>
+ <extension point="org.eclipse.ui.editors">
+ <editor class="org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor" contributorClass="org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditorContributor" default="false" icon="images/artifact_editor.gif" id="org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor" name="Artifact Editor"/>
+ <editor class="org.eclipse.osee.framework.ui.skynet.blam.BlamEditor" default="false" icon="images/blam.gif" id="org.eclipse.osee.framework.ui.skynet.blam.BlamEditor" name="Blam Editor"/>
+ <editor class="org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor" default="false" icon="images/artifact_editor.gif" id="org.eclipse.osee.framework.ui.skynet.massEditor.MassArtifactEditor" name="Mass Artifact Editor"/>
+ <editor
+ class="org.eclipse.osee.framework.ui.skynet.results.ResultsEditor"
+ default="false"
+ icon="images/results.gif"
+ id="org.eclipse.osee.framework.ui.skynet.results.ResultsEditor"
+ name="Results Editor">
+ </editor>
+ </extension>
+ <extension point="org.eclipse.ui.preferencePages">
+ <page class="org.eclipse.osee.framework.ui.skynet.OseePreferencePage" name="OSEE" id="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+ class="org.eclipse.osee.framework.ui.skynet.preferences.ConfigurationDetails"
+ id="org.eclipse.osee.framework.ui.skynet.preferences.HttpServerPreferences"
+ name="Configuration Details">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+ class="org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage"
+ id="org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage"
+ name="Editors">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+ class="org.eclipse.osee.framework.ui.skynet.preferences.ArbitrationServerPage"
+ id="org.eclipse.osee.framework.ui.skynet.preferences.ArbitrationServerPreferences"
+ name="Arbitration Server">
+ </page>
+ </extension>
+
+ <extension point="org.eclipse.help.contexts">
+ <contexts file="contexts/artifactExplorerContexts.xml"/>
+ <contexts file="contexts/artifactSearchContexts.xml"/>
+ <contexts file="contexts/branchManagerContexts.xml"/>
+ <contexts file="contexts/changeReportContexts.xml"/>
+ <contexts file="contexts/contexts.xml"/>
+ <contexts file="contexts/relationPageContexts.xml"/>
+ <contexts file="contexts/revisionHistoryContexts.xml"/>
+ <contexts file="reference/queryLog/contexts.xml"/>
+ <contexts file="reference/quickSearch/contexts.xml"/>
+ <contexts file="reference/contexts.xml"/>
+ <contexts file="contexts/mergeMangerContexts.xml">
+ </contexts>
+ </extension>
+ <extension point="org.eclipse.help.toc">
+ <toc file="reference/toc.xml" primary="true"/>
+ <toc file="reference/skynet_toc.xml" primary="false"/>
+ </extension>
+ <extension id="org.eclipse.osee.framework.ui.skynet" name="OSEE" point="org.eclipse.ui.views">
+ <view allowMultiple="true" category="osee.jdk.core.category" class="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer" icon="images/artifact_explorer.gif" id="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer" name="Artifact Explorer"/>
+ <view allowMultiple="true" category="osee.jdk.core.category" class="org.eclipse.osee.framework.ui.skynet.group.GroupExplorer" icon="images/group.gif" id="org.eclipse.osee.framework.ui.skynet.group.GroupExplorer" name="OSEE Group Explorer"/>
+ <category id="osee.jdk.core.category" name="OSEE"/>
+ <view allowMultiple="false" category="osee.jdk.core.category" class="org.eclipse.osee.framework.ui.skynet.queryLog.QueryLogView" icon="images/query_log.gif" id="org.eclipse.osee.framework.ui.skynet.QueryLogView" name="Query Log"/>
+ <view allowMultiple="false" category="osee.jdk.core.category" class="org.eclipse.osee.framework.ui.skynet.search.QuickSearchView" icon="images/artifact_search.gif" id="org.eclipse.osee.framework.ui.skynet.QuickSearchView" name="Quick Search"/>
+ <view allowMultiple="true" category="osee.jdk.core.category" class="org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView" icon="images/skywalker.gif" id="org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView" name="Sky Walker"/>
+ <view
+ allowMultiple="true"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView"
+ icon="images/branch_merge.gif"
+ id="org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView"
+ name="Merge View">
+ </view>
+ <view
+ allowMultiple="true"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView"
+ icon="images/branch_change.gif"
+ id="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView"
+ name="Change Report">
+ </view>
+ <view
+ allowMultiple="true"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView"
+ icon="images/DBiconBlueEdit.GIF"
+ id="org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView"
+ name="History">
+ </view>
+ <view
+ allowMultiple="true"
+ category="osee.jdk.core.category"
+ class="org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView"
+ icon="images/branch.gif"
+ id="org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView"
+ name="Branch Manager">
+ </view>
+ </extension>
+ <extension point="org.eclipse.search.searchPages">
+ <page canSearchEnclosingProjects="true" class="org.eclipse.osee.framework.ui.skynet.search.ArtifactSearchPage" enabled="true" extensions="&quot;*:1&quot;" icon="images/artifact_search.gif" id="org.eclipse.osee.framework.ui.skynet.search.ArtifactSearchPage" label="Artifact Search" showScopeSection="false" sizeHint="&quot;250,250&quot;" tabPosition="1"/>
+ </extension>
+ <extension point="org.eclipse.search.searchResultViewPages">
+ <viewPage class="org.eclipse.osee.framework.ui.skynet.search.page.ArtifactSearchPage" id="org.eclipse.osee.framework.ui.skynet.ArtifactSearchViewPage" searchResultClass="org.eclipse.osee.framework.ui.skynet.search.ArtifactSearchResult"/>
+ </extension>
+ <extension point="org.eclipse.ui.newWizards">
+ <wizard class="org.eclipse.osee.framework.ui.skynet.branch.RootBranchWizard" icon="images/branch.gif" id="org.eclipse.osee.framework.ui.skynet.rootBranchWizard" name="Root Branch">
+ </wizard>
+ </extension>
+ <extension point="org.eclipse.osee.framework.skynet.core.ArtifactFactory">
+ <ArtifactFactory classname="org.eclipse.osee.framework.ui.skynet.artifact.SkynetGuiArtifactFactory"/>
+ </extension>
+ <extension id="PruneWorkspace" name="PruneWorkspace" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.PruneWorkspace"/>
+ </extension>
+ <extension id="DuplicateRelationOpertions" name="DuplicateRelationOpertions" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.DuplicateRelationOpertions"/>
+ </extension>
+ <extension id="UniqueNumberOfCurrentOseeUsers" name="Unique Number Of Current Osee Users" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.UniqueNumberOfCurrentOseeUsers"/>
+ </extension>
+ <extension id="PurgeTransaction" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.PurgeTransaction"/>
+ </extension>
+
+ <extension id="SortRelationsByBranch" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.SortRelationsByBranch"/>
+ </extension>
+
+ <extension id="LoadAllArtifactsOnBranch" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.LoadAllArtifactsOnBranch"/>
+ </extension>
+
+ <extension id="FindInvalidUTF8Chars" point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation className="org.eclipse.osee.framework.ui.skynet.blam.operation.FindInvalidUTF8Chars"/>
+ </extension>
+ <extension
+ id="CopyTransactionDataToBaseline"
+ name="Copy Transaction Data To Baseline"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.CopyTransactionDataToBaseline">
+ </Operation>
+ </extension>
+ <extension
+ id="FindArtifactsWithMinAttributeContraintProblems"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.FindArtifactsWithMinAttributeContraintProblems">
+ </Operation>
+ </extension>
+ <extension id="native" point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.framework.ui.skynet.render.NativeRenderer"/>
+ </extension>
+ <extension id="word" point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer"/>
+ </extension>
+ <extension id="tis" point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.framework.ui.skynet.render.TisRenderer"/>
+ </extension>
+ <extension id="url" point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.framework.ui.skynet.render.UrlRenderer"/>
+ </extension>
+ <extension id="default" point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer"/>
+ </extension>
+ <extension id="Whole document" point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer classname="org.eclipse.osee.framework.ui.skynet.render.WholeDocumentRenderer"/>
+ </extension>
+ <extension
+ id="openOfficeWriter"
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactRenderer">
+ <Renderer
+ classname="org.eclipse.osee.framework.ui.skynet.render.OpenOfficeWriterRenderer">
+ </Renderer>
+ </extension>
+ <extension point="org.eclipse.osee.framework.ui.skynet.ArtifactRendererTemplate">
+ <Template presentationType="ALL" templateFile="support/templates/PREVIEW_ALL.xml" templateName="PREVIEW_ALL"/>
+ <Template presentationType="ALL" templateFile="support/templates/Word Edit Template.xml" templateName="Word Edit Template"/>
+ <Template presentationType="ALL" templateFile="support/templates/PREVIEW Software Requirement with Recursion.xml" templateName="PREVIEW Software Requirement with Recursion"/>
+ <Template
+ presentationType="org.eclipse.osee.framework.ui.skynet.Template1"
+ templateFile="support/templates/PREVIEW_ALL_RECURSE.xml"
+ templateName="Preview Recurse">
+ </Template>
+ </extension>
+ <extension point="org.eclipse.osee.framework.ui.skynet.WordOutlineContentHandler">
+ <Handler class="org.eclipse.osee.framework.ui.skynet.handler.GeneralWordOutlineHandler" id="org.eclipse.osee.framework.ui.skynet.GeneralWordOutlineHandler" name="General Outline Documents"/>
+ </extension>
+ <extension point="org.eclipse.osee.framework.ui.skynet.OseeDictionary">
+ <OseeDictionary classname="org.eclipse.osee.framework.ui.skynet.widgets.SkynetSpellModifyDictionary"/>
+ <OseeDictionary classname="org.eclipse.osee.framework.ui.skynet.util.OseeMainDictionary"/>
+ </extension>
+ <extension point="org.eclipse.osee.framework.skynet.core.ArtifactAnnotation">
+ <ArtifactAnnotation classname="org.eclipse.osee.framework.ui.skynet.artifact.annotation.AttributeAnnotationHandler">
+ </ArtifactAnnotation>
+ </extension>
+ <extension id="AddCommonBranch" name="AddCommonBranch" point="org.eclipse.osee.framework.database.IDbInitializationTask">
+ <DatabaseTask classname="org.eclipse.osee.framework.ui.skynet.dbinit.AddCommonBranch">
+ </DatabaseTask>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.TemplateProvider">
+ <TemplateProvider
+ classname="org.eclipse.osee.framework.ui.skynet.templates.ArtifactTemplateProvider">
+ </TemplateProvider>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.XWidgetProvider">
+ <XWidgetProvider
+ classname="org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidgetProvider">
+ </XWidgetProvider>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.database.IDbInitializationTask"
+ id="SimpleTemplateProviderTask"
+ name="SimpleTemplateProviderTask">
+ <DatabaseTask
+ classname="org.eclipse.osee.framework.ui.skynet.templates.SimpleTemplateProviderDbTask">
+ </DatabaseTask>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.SimpleTemplateProviderTemplate">
+ <Template
+ File="support/templates/PREVIEW_ALL.xml">
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer PREVIEW PREVIEW_ARTIFACT">
+ </MatchCriteria>
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer PREVIEW">
+ </MatchCriteria>
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer DIFF">
+ </MatchCriteria>
+ </Template>
+ <Template
+ File="support/templates/PREVIEW_ALL_RECURSE.xml">
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer PREVIEW PREVIEW_WITH_RECURSE">
+ </MatchCriteria>
+ </Template>
+ <Template
+ File="support/templates/Word Edit Template.xml">
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer SPECIALIZED_EDIT">
+ </MatchCriteria>
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.TisRenderer SPECIALIZED_EDIT">
+ </MatchCriteria>
+ </Template>
+ <Template
+ File="support/templates/Word Edit Template.xml">
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer MERGE">
+ </MatchCriteria>
+ <MatchCriteria
+ match="org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer MERGE_EDIT">
+ </MatchCriteria>
+ </Template>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.CreateNewUser">
+ </Operation>
+ </extension>
+ <extension name="The menus for the SearchResultsView." point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:org.eclipse.search.ui.views.SearchView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.open.command">
+ </command>
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.OpenWithContributionItem"
+ id="org.eclipse.osee.framework.ui.open.with">
+ </dynamic>
+ <separator
+ name="artifactSearchViewopenwithSeparator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.ui.edit.delete">
+ </command>
+ <separator
+ name="artifactSearchViewDeleteSeparator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.revealArtifactInExplorer.command"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.resource.command"
+ style="push">
+ </command>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.separator2"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.OpenMassEditcommand">
+ </command>
+ <command commandId="org.eclipse.osee.framework.ui.skynet.skywalker.command">
+ </command>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.separator3"
+ visible="true">
+ </separator>
+ <command commandId="org.eclipse.ui.edit.copy">
+ </command>
+ <separator
+ name="artifactSearchViewPurgeSeparator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.purge.command">
+ </command>
+ <separator
+ name="artifactSearchViewPurgeEndSeparator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.ui.file.export"
+ style="push">
+ </command>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.resource.history.separator"
+ visible="true">
+ </separator>
+ </menuContribution>
+ </extension>
+ <extension
+ name="The new change view"
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="menu:org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.change.ChangeView.showDocOrder"
+ style="toggle">
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.open.command">
+ </command>
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.OpenWithContributionItem"
+ id="org.eclipse.osee.framework.ui.open.with">
+ </dynamic>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.ChangeView.wordChangesMadeTo.seperatro"
+ visible="true">
+ </separator>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.changeReportView.publishArtifactRecurse.separator"
+ visible="true">
+ </separator>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.changeView.publishArtifactRecurse.separator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.revealArtifactInExplorer.command">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.resource.command">
+ </command>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.changeView.wordChangeReport.separator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.singleNativeDiff.command"
+ style="push">
+ </command>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.changeView.singleNativeDiff.separator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.viewWordChangeReport.command">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.viewerReport">
+ </command>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.ChangeView.viewerReport.separator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.ui.edit.copy">
+ </command>
+ <separator
+ name="org.eclipse.ui.edit.ChangeView.copy.seperator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.revertArtifact.command">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.revertAttribute.command">
+ </command>
+ <separator
+ name="org.eclipse.ui.edit.ChangeView.revert.seperator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeTransaction"
+ style="push">
+ </command>
+ <separator
+ name="org.eclipse.ui.edit.ChangeView.seperator1"
+ visible="true">
+ </separator>
+ </menuContribution>
+ </extension>
+<extension
+ name="Menus for the new branch view"
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="menu:org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ <menu
+ label="Branch Presentation">
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.branchView.flatPresentation.command"
+ icon="images/flat_layout.gif"
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.flatCommand"
+ style="radio"
+ tooltip="Show branches as a flat listing">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.branchView.hierarchicalPresentation.command"
+ icon="images/tree_layout.gif"
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.hierarchicalCommand"
+ style="radio"
+ tooltip="Show branches as a hierarchical listing">
+ </command>
+ </menu>
+ <separator
+ name="org.eclipse.osee.framework.ui.skynet.separator1"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showArchivedBranches"
+ style="toggle">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showMergeBranches"
+ icon="images/branch_merge.gif"
+ style="toggle">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showTransactions"
+ icon="images/DBicon2.GIF"
+ style="toggle">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.ShowFavoriteBranchesFirst"
+ icon="images/star_9_9.gif"
+ style="toggle">
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.OpenArtifactExplorerCommand"
+ style="push">
+ </command>
+ <separator
+ name="separator.xBranch.BranchView0"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeReport"
+ style="push">
+ </command>
+ <menu
+ label="Merge Manager">
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.merge.MergeCompoundContributionItem"
+ id="org.eclipse.osee.framework.ui.skynet.dynamicMergeCommands">
+ </dynamic>
+ </menu>
+ <separator
+ name="separator.xBranch.BranchView1"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.branchCreator"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.updateBranch"
+ style="push">
+ </command>
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit.CommitIntoParentCompoundContributionItem"
+ id="org.eclipse.osee.framework.ui.skynet.dynamic.commitIntoParent">
+ </dynamic>
+ <menu
+ label="Commit Into">
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit.CommitIntoCompoundContributionItem"
+ id="org.eclipse.osee.framework.ui.skynet.dynamic.commitInto">
+ </dynamic>
+ </menu>
+ <separator
+ name="separator.xBranch.BranchView2"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.deleteBranch"
+ style="push">
+ </command>
+ <separator
+ name="separator.xBranch.BranchView3"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeBranch"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeTransaction"
+ style="push">
+ </command>
+ <separator
+ name="separator.xBranch.BranchView4"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.openAssociatedArtifact"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.setAssociatedArtifact"
+ style="push">
+ </command>
+ <separator
+ name="separator.xBranch.BranchView5"
+ visible="true">
+ </separator>
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ArchiveBranchCompoundContributionItem"
+ id="org.eclipse.osee.framework.ui.skynet.dynamic.archive">
+ </dynamic>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.accessControl">
+ </command>
+ <separator
+ name="separator.xBranch.BranchView6"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.rename"
+ style="push">
+ </command>
+ <separator
+ name="separator.xBranch.BranchView3"
+ visible="true">
+ </separator>
+ <dynamic
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ToggleFavoriteBranchContributionItem"
+ id="org.eclipse.osee.framework.ui.skynet.dynamicToggleFavorite">
+ </dynamic>
+ <separator
+ name="separator.xBranch.BranchView8"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.ui.edit.copy"
+ style="push">
+ </command>
+ </menuContribution>
+</extension>
+ <extension
+ name="The merge view"
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.osee.framework.ui.skynetd.widgets.xmerge.MergeView">
+ <separator
+ name="org.eclipse.ui.edit.ChangeView.revert.seperator"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.revertAttribute.command"
+ label="Revert Source Attribute...">
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ name="OSEE Core Handlers"
+ point="org.eclipse.ui.handlers">
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.CopyHandler" commandId="org.eclipse.ui.edit.copy">
+ <activeWhen>
+ <or>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ </equals>
+ </with>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.search.ui.views.SearchView">
+ </equals>
+ </with>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView">
+ </equals>
+ </with>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer">
+ </equals>
+ </with>
+ </or>
+ </activeWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.OpenMassArtifactEditorHandler" commandId="org.eclipse.osee.framework.ui.skynet.OpenMassEditcommand">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.OpenArtifactExplorerHandler" commandId="org.eclipse.osee.framework.ui.skynet.OpenArtifactExplorerCommand">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="1">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.OpenSkywalkerEditorHandler" commandId="org.eclipse.osee.framework.ui.skynet.skywalker.command">
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.ViewWordChangeReportHandler" commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.viewWordChangeReport.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.CompressWordAttributesHandler" commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.compressWordAttributes.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.ShowArtifactInResourceHandler" commandId="org.eclipse.osee.framework.ui.skynet.resource.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.WordChangesToParentHandler" commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.wordChangesToParent.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.WordChangesBetweenCurrentAndParentHandler" commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.wordChangesBetweenCurrentAndParent.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.WordChangesMadeToHandler" commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.wordChangesMadeTo.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler class="org.eclipse.osee.framework.ui.skynet.commandHandlers.RevertArtifactHandler" commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.revertArtifact.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.RevealInArtifactExplorer"
+ commandId="org.eclipse.osee.framework.ui.skynet.revealArtifactInExplorer.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.ViewerReportHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.viewerReport">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.DeleteArtifactHandler"
+ commandId="org.eclipse.ui.edit.delete">
+ <activeWhen>
+ <or>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.search.ui.views.SearchView">
+ </equals>
+ </with>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer">
+ </equals>
+ </with>
+ </or>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.PurgeArtifactHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.purge.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.RevertAttributeHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.revertAttribute.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.ExpandTreeHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.expandTree.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ <activeWhen>
+ <or>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer">
+ </equals>
+ </with>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ </equals>
+ </with>
+ </or>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.PasteHandler"
+ commandId="org.eclipse.ui.edit.paste">
+ <activeWhen>
+ <or>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer">
+ </equals>
+ </with>
+ </or>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.CollapseTreeHandler"
+ commandId="org.eclipse.gef.zoom_out">
+ <activeWhen>
+ <or>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.ArtifactExplorer">
+ </equals>
+ </with>
+ <with
+ variable="activePartId">
+ <equals
+ value="org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView">
+ </equals>
+ </with>
+ </or>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.ChangeReportHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeReport">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.AccessControlHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.accessControl">
+ </handler>
+ </extension>
+<extension
+ id="Open With Handlers"
+ name="Open With Handlers"
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.ArtifactEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.artifacteditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.OpenHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.open.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.WordEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.wordeditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.NativeEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.nativeeditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.OtherEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.othereditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.WholeDocumentEditorHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.wholedocumenteditor.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.PreviewWordHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.wordpreview.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.PreviewWithChildWordHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.wordpreviewChildren.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.PreviewTisHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.tispreview.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.PreviewWholeWordHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.wholewordpreview.command">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <count
+ value="+">
+ </count>
+ </with>
+ </enabledWhen>
+ </handler>
+</extension>
+ <extension
+ name="Branch View Handlers"
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.FlatPresentationHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.branchView.flatPresentation.command">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.HierarchicalPresentationHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.branchView.hierarchicalPresentation.command">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowTransactionPresentationHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showTransactions">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowMergeBranchPresentationHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showMergeBranches">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.merge.MergeManagerHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.mergeManager">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.BranchCreationHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.branchCreator">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.DeleteBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.deleteBranch">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.PurgeBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeBranch">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.PurgeTransactionHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeTransaction">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit.UpdateBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.updateBranch">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit.CommitIntoParentHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitIntoParent">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.commit.CommitIntoHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitInto">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.RenameBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.rename">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.OpenAssociatedArtifactHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.openAssociatedArtifact">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowArchivedBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showArchivedBranches">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ArchiveBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.archiveBranch">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.SetAssociatedBranchArtifactHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.setAssociatedArtifact">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowFavoriteBranchesFirstHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.ShowFavoriteBranchesFirst">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ToggleFavoriteBranchHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ToggleFavoriteBranchHandler">
+ </handler>
+ </extension>
+ <extension
+ id="Change View"
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.change.ToggleChangeViewDocOrderHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.change.ChangeView.showDocOrder">
+ </handler>
+ <handler
+ class="org.eclipse.osee.framework.ui.skynet.commandHandlers.change.SingleNativeDiffHandler"
+ commandId="org.eclipse.osee.framework.ui.skynet.changeReportView.singleNativeDiff.command">
+ </handler>
+ </extension>
+ <extension point="org.eclipse.ui.commandImages">
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.revealArtifactInExplorer.command"
+ icon="images/magnify.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.resource.command"
+ icon="images/DBiconBlueEdit.GIF">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.artifacteditor.command"
+ icon="images/laser_16_16.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.new.artifacteditor.command"
+ icon="images/laser_16_16.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeReport"
+ icon="images/branch_change.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.mergeManager"
+ icon="images/branch_merge.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.branchCreator"
+ icon="images/branch.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.deleteBranch"
+ icon="images/delete.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeBranch"
+ icon="images/purge.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeTransaction"
+ icon="images/purge.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.accessControl"
+ icon="images/authenticated.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ToggleFavoriteBranchHandler"
+ icon="images/star_9_9.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitInto"
+ icon="images/commit.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitIntoParent"
+ icon="images/commit.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.updateBranch"
+ icon="images/branchSynch.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.change.ChangeView.showDocOrder"
+ icon="images/docOrder.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showArchivedBranches"
+ icon="images/archive.gif">
+ </image>
+ <image
+ commandId="org.eclipse.osee.framework.ui.skynet.OpenArtifactExplorerCommand"
+ icon="images/artifact_explorer.gif">
+ </image>
+ </extension>
+ <extension
+ id="DeleteArchivedBranches"
+ name="Delete Archived Branches"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.DeleteArchivedBranches">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateArtifactTypeImage">
+ </Operation>
+ </extension>
+ <extension
+ id="ValidateArtifactsToDelete"
+ name="ValidateArtifactsToDelete"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ValidateArtifactsToDelete">
+ </Operation>
+ </extension>
+ <extension
+ id="SwitchParentBranch"
+ name="Switch Parent Branch"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.SwitchParentBranch">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.XWidgetPopulateExample">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn">
+ </Operation>
+ </extension>
+ <extension
+ id="SetRequirementCategory"
+ name="SetRequirementCategory"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.SetRequirementCategory">
+ </Operation>
+ </extension>
+ <extension
+ id="ExportArtifacts"
+ name="ExportArtifacts"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ExportArtifacts">
+ </Operation>
+ </extension>
+ <extension
+ id="Database Health"
+ name="Database Health"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.DatabaseHealth">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.RelationOrderAnalysisOnBranch">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateWordFormattedContentAttributes">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ReportAttributeTypesUsageBlam">
+ </Operation>
+ </extension>
+ <extension
+ id="ParseWindowsDirectoryListing"
+ name="ParseWindowsDirectoryListing"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ParseWindowsDirectoryListing">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.FixTemplateContentArtifacts">
+ </Operation>
+ </extension>
+<extension
+ id="Open With Commands"
+ point="org.eclipse.ui.commands">
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.open.command"
+ name="Open">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.artifacteditor.command"
+ name="Artifact Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.new.artifacteditor.command"
+ name="New Artifact Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.wordeditor.command"
+ name="MS Word Edit">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.wholedocumenteditor.command"
+ name="MS Word Edit">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.nativeeditor.command"
+ name="Native Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.othereditor.command"
+ name="Other Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.wordpreview.command"
+ name="MS Word Preview">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.wholewordpreview.command"
+ name="MS Word Preview">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.wordpreviewChildren.command"
+ name="MS Word Preview with children">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.tispreview.command"
+ name="MS Word TIS Preview">
+ </command>
+</extension>
+ <extension
+ id="Osee Core commands"
+ point="org.eclipse.ui.commands">
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.OpenMassEditcommand"
+ name="Mass Edit">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.skywalker.command"
+ name="SKy Walker">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.revealArtifactInExplorer.command"
+ name="Reveal Artifact in Explorer">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.resource.command"
+ name="Resource History">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.publishArtifact.command"
+ name="Artifact">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.viewerReport"
+ name="View Viewer Report">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.purge.command"
+ name="Purge">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.atseditor.command"
+ name="ATS Editor">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeReport"
+ name="Change Report">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.accessControl"
+ name="Access Control">
+ </command>
+ </extension>
+ <extension name="Commands of BranchView" point="org.eclipse.ui.commands">
+ <command description="Show the branches in a flat listing" id="org.eclipse.osee.framework.ui.skynet.branch.branchView.flatPresentation.command" name="Flat">
+ </command>
+ <command description="Show the branches in a hierarchical listing" id="org.eclipse.osee.framework.ui.skynet.branch.branchView.hierarchicalPresentation.command" name="Hierarchical">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showTransactions"
+ name="Show Transactions">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showMergeBranches"
+ name="Show Merge Branches">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.mergeManager"
+ name="Merge">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.OpenArtifactExplorerCommand"
+ name="Explore">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.branchCreator"
+ name="Branch">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.deleteBranch"
+ name="Delete Branch">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeBranch"
+ name="Purge Branch">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.purgeTransaction"
+ name="Purge Transaction">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.updateBranch"
+ name="Update Branch">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitIntoParent"
+ name="Commit Into Parent">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitInto"
+ name="Commit Into">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.rename"
+ name="Rename">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.openAssociatedArtifact"
+ name="Open Associated Artifact">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.showArchivedBranches"
+ name="Show Archived Branches">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.archiveBranch"
+ name="Archive/unarchive">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.setAssociatedArtifact"
+ name="Set Associated Artifact">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.branch.BranchView.ShowFavoriteBranchesFirst"
+ name="Show Favorites First">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ToggleFavoriteBranchHandler"
+ name="Toggle Favorite">
+ </command>
+ </extension>
+ <extension name="Commands of ChangeReportView" point="org.eclipse.ui.commands">
+ <command id="org.eclipse.osee.framework.ui.skynet.changeReportView.wordChangesMadeTo.command" name="Word changes on this working branch">
+ </command>
+ <command id="org.eclipse.osee.framework.ui.skynet.changeReportView.wordChangesBetweenCurrentAndParent.command" name="Word differences between current/parent branches">
+ </command>
+ <command id="org.eclipse.osee.framework.ui.skynet.changeReportView.wordChangesToParent.command" name="Word changes made to parent branch since creating current branch">
+ </command>
+ <command id="org.eclipse.osee.framework.ui.skynet.changeReportView.revertArtifact.command" name="Revert Artifact...">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.changeReportView.revertAttribute.command"
+ name="Revert Attribute...">
+ </command>
+ <command id="org.eclipse.osee.framework.ui.skynet.changeReportView.viewWordChangeReport.command" name="View Word Change Report">
+ </command>
+ <command id="org.eclipse.osee.framework.ui.skynet.changeReportView.compressWordAttributes.command" name="Compress Word Attributes">
+ </command>
+ <command
+ description="Expand a Tree Selection"
+ id="org.eclipse.osee.framework.ui.skynet.expandTree.command"
+ name="TreeExpansion">
+ </command>
+ <command
+ description="Collapse a Tree Viewer"
+ id="org.eclipse.osee.framework.ui.skynet.collapseTree.command"
+ name="TreeCollapse">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.change.ChangeView.showDocOrder"
+ name="Show Document Order">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.changeReportView.singleNativeDiff.command"
+ name="Single Native Diff">
+ </command>
+ </extension>
+ <extension name="Put commands of ATSWorldView here (for now)" point="org.eclipse.ui.commands">
+ <command id="org.eclipse.osee.ats.worldXView.editChangeType.command" name="Edit Change Type">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.editPriority.command" name="Edit Priority">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.editTargetedVersion.command" name="Edit Targeted Version">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.editActionableItems.command" name="Edit Actionable Items">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.convertToActionableItemTeam.command" name="Convert to Actionable Item/Team">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.openInATSEditor.command" name="Open in ATS Editor">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.openInArtifactEditor.command" name="Open in Artifact Editor">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.deletePurgeATSObject.command" name="Delete/Purge ATS Object">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.addAsFavorite.command" name="Add as Favorite">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.subscribeForNotifications.command" name="Subscribe for Notifications">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.email.command" name="Email">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.resetActionOffChildren.command" name="Reset Action off Children">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.clearAllSorting.command" name="Clear All Sorting">
+ </command>
+ <command id="org.eclipse.osee.ats.worldXView.tableCustomization.command" name="Table Customization">
+ </command>
+ <command
+ id="org.eclipse.osee.framework.ui.skynet.openartifacteditor.command"
+ name="Open Artifact Editor">
+ </command>
+ </extension>
+ <extension
+ id="org.eclipse.osee.framework.ui.skynet.expandtree.binding"
+ name="Expand Tree"
+ point="org.eclipse.ui.bindings">
+ <key
+ commandId="org.eclipse.osee.framework.ui.skynet.expandTree.command"
+ contextId="org.eclipse.ui.contexts.window"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1++">
+ </key>
+ </extension>
+ <extension
+ id="Resource Manipulation"
+ name="Modify a Resource"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ResourceManipulation">
+ </Operation>
+ </extension>
+ <extension
+ id="DatastoreStatistics"
+ name="DatastoreStatistics"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.DatastoreStatistics">
+ </Operation>
+ </extension>
+ <extension
+ id="DeleteUnneededUnspecifiedAttributes"
+ name="DeleteUnneededUnspecifiedAttributes"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.DeleteUnneededUnspecifiedAttributes">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+ class="org.eclipse.osee.framework.ui.skynet.preferences.DiffPreferencePage"
+ id="org.eclipse.osee.framework.ui.skynet.preferences.DiffPreferencePage"
+ name="Word Diffing">
+ </page>
+ </extension>
+ <extension
+ id="PurgeArtifactType"
+ name="PurgeArtifactType"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.PurgeArtifactType">
+ </Operation>
+ </extension>
+ <extension
+ id="ShowRevertTransactions"
+ name="ShowRevertTransactions"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ShowRevertTransactions">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.ClientLoopbackCmd">
+ <ClientLoopbackCmd
+ className="org.eclipse.osee.framework.ui.skynet.artifact.OpenArtifactEditorLoopbackCmd">
+ </ClientLoopbackCmd>
+ </extension>
+ <extension
+ id="CheckDefaulHierarchy"
+ name="CheckDefaulHierarchy"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.CheckDefaulHierarchy">
+ </Operation>
+ </extension>
+ <extension
+ id="ImageCapture"
+ name="ImageCapture"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.ImageCaptureBlam">
+ </Operation>
+ </extension>
+ <extension
+ id="PurgeAttributeType"
+ name="PurgeAttributeType"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.PurgeAttributeType">
+ </Operation>
+ </extension>
+ <extension
+ id="PurgeDeletedAttributes"
+ name="Purge Deleted Attributes"
+ point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
+ <Operation
+ className="org.eclipse.osee.framework.ui.skynet.blam.operation.PurgeDeletedAttributes">
+ </Operation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactExtractor">
+ <ArtifactExtractor
+ class="org.eclipse.osee.framework.ui.skynet.Import.ExcelArtifactExtractor">
+ </ArtifactExtractor>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactExtractor">
+ <ArtifactExtractor
+ class="org.eclipse.osee.framework.ui.skynet.Import.NativeDocumentExtractor">
+ </ArtifactExtractor>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactExtractor">
+ <ArtifactExtractor
+ class="org.eclipse.osee.framework.ui.skynet.Import.WholeWordDocumentExtractor">
+ </ArtifactExtractor>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactExtractor">
+ <ArtifactExtractor
+ class="org.eclipse.osee.framework.ui.skynet.Import.WordOutlineExtractor">
+ </ArtifactExtractor>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactExtractor">
+ <ArtifactExtractor
+ class="org.eclipse.osee.framework.ui.skynet.Import.XmlDataExtractor">
+ </ArtifactExtractor>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.CommitTransactions">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.ArtifactTxCurrent">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.AttributeTxCurrent">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.RelLinkTxCurrent">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.DuplicateAttributes">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.CleanUpAddressingData">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.CleanUpAddressingData">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.RelationDatabaseIntegrityCheck">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.CleanUpBackingData">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.CommitedNewAndDeleted">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.RemoveAttributesWithoutArtifacts">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.CleanUpAttrFromDeletedArt">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.DuplicateRelationCheck">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.DuplicateHRID">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.WordAttributeTrackChangeHealthOperation">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.BranchStateHealthCheck">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.DatabaseHealthOperation">
+ <DatabaseHealthOperation
+ className="org.eclipse.osee.framework.ui.skynet.dbHealth.ArtifactIdWithoutVersionsCheck">
+ </DatabaseHealthOperation>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider">
+ <ArtifactImageProvider
+ class="org.eclipse.osee.framework.ui.skynet.FrameworkArtifactImageProvider">
+ </ArtifactImageProvider>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/Merge_1.gif b/org.eclipse.osee.framework.ui.skynet/reference/Merge_1.gif
new file mode 100644
index 00000000000..a80dbf5e409
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/Merge_1.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/Merge_3.gif b/org.eclipse.osee.framework.ui.skynet/reference/Merge_3.gif
new file mode 100644
index 00000000000..4ad0f15515c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/Merge_3.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/Merge_4.gif b/org.eclipse.osee.framework.ui.skynet/reference/Merge_4.gif
new file mode 100644
index 00000000000..b052610b2f9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/Merge_4.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/Merge_5.gif b/org.eclipse.osee.framework.ui.skynet/reference/Merge_5.gif
new file mode 100644
index 00000000000..92f41da4873
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/Merge_5.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/Merge_Manager.html b/org.eclipse.osee.framework.ui.skynet/reference/Merge_Manager.html
new file mode 100644
index 00000000000..b2676a1740e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/Merge_Manager.html
@@ -0,0 +1,481 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Merge Manager View</title>
+</head>
+
+<body>
+
+<h1>Merge Manager View</h1>
+<img border="0" src="Merge_1.gif"><br>
+&nbsp;<h2>Purpose</h2>
+<p>The Merge Manager is used to resolve conflicts that arise when doing
+development on parallel branches.&nbsp; The Merge Manager makes conflicts that
+arise easily identifiable and then provides the means for resolving the
+conflicts, so that the working branch can be committed.</p>
+<h2>Icons</h2>
+<ul>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif" width="16" height="16">&nbsp;
+ Resolution has been started for the conflict</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">&nbsp;
+ Conflict has been resolved and is ready to be committed, In the Merge column
+ it means that the Source and Destination Branches have the same value even
+ though they were both changed. </li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gif" width="16" height="16">&nbsp;
+ After a conflict has been marked as resolved the value changed on the source
+ or destination branch</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/issue.gif" width="16" height="16">&nbsp;
+ A conflict that provides the user special information but does not need to
+ be resolved</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/red_light.gif" width="16" height="16">&nbsp;
+ A conflict that can not be resolved except by reverting the Artifact or
+ Attribute, because it was deleted on the Destination Branch</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">&nbsp;
+ Shows that the item defined by the column it is in has the Destination
+ Branches value</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">&nbsp;
+ Shows that the item defined by the column it is in has the Source Branches
+ value</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/yellow_m.gif" width="16" height="16">&nbsp;
+ Shows that the item defined by the column it is in has a new value that is
+ neither the Source Branch nor Destination Branch value.</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/conflict.gif" width="16" height="16">&nbsp;
+ Shows that the conflict has not been given an initial value </li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/user.gif" width="16" height="16">&nbsp;
+ Opens the Associated Artifact for the merge</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/branch_change_source.gif" width="16" height="16">&nbsp;
+ Opens up the Change Report for the Source Branch</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/branch_change_dest.gif" width="16" height="16">&nbsp;
+ Opens up the Change Report for the Destination Branch</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/refresh.gif" width="16" height="16">&nbsp;
+ Refreshes the Merge Manger view to find new conflicts</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/customize.gif" width="16" height="16">&nbsp;
+ Allows the user to customize the Merge Manager tables</li>
+ <li>
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/bug.gif" width="16" height="16">&nbsp;
+ Report a bug with the Merge Manager</li>
+</ul>
+<h2>Overview</h2>
+<p>The Merge Manager is in place to find conflicts and help users resolve these
+conflicts.&nbsp; A conflict exists if the value of an attribute/artifact has
+changed on both the Destination and Source Branches.&nbsp; For reference the
+Source Branch is the users working branch.&nbsp; It is the branch that the user
+has been making changes to and would like to then add back into the Destination
+Branch or Baseline Branch.&nbsp; Both branches are identified by name in the
+header of the Merge Manager.&nbsp; </p>
+<p>Depending upon the conflict found, the user may have several choices for
+resolution.&nbsp; These include </p>
+<ul>
+ <li>Accept the value on the Source Branch and overwrite the value on the
+ Destination Branch</li>
+ <li>Accept the value on the Destination Branch and do not add any of the
+ Source Branch changes, (These will still show up as merged on
+ <a href="change_table.html">Change Reports</a>)</li>
+ <li>Create a solution that is a combination of the two changes </li>
+ <li>Revert the changes on the Source Branch&nbsp; (This is the only
+ available solution when the Artifact/Attribute was deleted on the
+ Destination Branch, will show up as no change on the
+ <a href="change_table.html">Change Report</a>)</li>
+ <li>Do nothing (only possible for informational conflicts)</li>
+</ul>
+<p>Committing of Branches is blocked until all conflicts are resolved.</p>
+<h2>The GUI</h2>
+<p>The GUI is organized to provide the user with an ability to quickly identify
+conflicts.</p>
+<ul>
+ <li><b>The Heading</b> - The Heading contains text to help identify what is
+ being merged. It identifies the Source Branch, and the Destination Branch.&nbsp;
+ It also provides the user with information about how many conflicts there
+ are and if they have been resolved.&nbsp; The Heading also contains easy
+ launch icons for additional tools in connection with the Merge Manager.</li>
+ <li><b>The Conflict Resolution Column</b> - This column provides the user
+ information about the state of the conflict.&nbsp; A blank entry in the
+ column means that the conflict is new and has not had any actions performed
+ on it. A
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif" width="16" height="16">
+ indicates that conflict is in the modified state.&nbsp; This means the user
+ has begun merging the conflict but has not marked it as resolved.&nbsp; The
+ user may transition it into the resolved state by left clicking on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif" width="16" height="16">
+ icon. The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">
+ icon indicates the user has marked the conflict as resolved.&nbsp; This
+ means they have selected a value for it and have verified the value going in
+ is what they want.&nbsp; No additional changes are allowed on a conflict
+ once it is in the resolved state.&nbsp; It can be placed back into the
+ modified state by left clicking on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">
+ icon. The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gif" width="16" height="16">
+ means that a conflict was in the resolved state but a new change has
+ occurred on either the Source or Destination Branch.&nbsp; It serves to
+ notify the user that the conflict was not in the finalized state when they
+ resolved the conflict.&nbsp; The user can return to resolved state by left
+ clicking on the&nbsp;
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_enabled_conflicted.gif" width="16" height="16">
+ icon.&nbsp; The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/red_light.gif" width="16" height="16">
+ icon indicates that an Artifact or Attribute must be reverted on the Source
+ Branch.&nbsp; This indicates that the Artifact/Attribute was deleted on the
+ Destination Branch and can not have a change committed onto it.&nbsp; The
+ user must abandon any change to that artifact attribute by using the revert
+ command.&nbsp; Once the Artifact/Attribute has been reverted the Merge
+ Manager will be refreshed and the conflict will be removed. The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/issue.gif" width="16" height="16">icon
+ indicates an informational conflict.&nbsp; The user does not have to take
+ any action to resolve these conflicts.&nbsp; It just provides the
+ information that the Source Branch deleted the Artifact/Attribute but the
+ Destination Branch has been modified.&nbsp; The user is free to act as
+ desired based on the provided information.</li>
+ <li><b>The Artifact Name Column</b> - This column tells which artifact the
+ conflict occurred on.&nbsp; If the name is different between the Source and
+ Destination Branches, (this will show up as a conflict) it will at first
+ showing use the Source Branch value and then use whatever the name is
+ resolved to be after that has occurred.</li>
+ <li><b>The Artifact Type Column</b> - Simply lists what type of Artifact is
+ conflicted</li>
+ <li><b>The Conflicting Item Column</b> - In the case of an attribute
+ conflict it states what attribute type is conflicting.&nbsp; In the case of
+ an artifact conflict it will always say &quot;Artifact State&quot;</li>
+ <li><b>The Source Value Column</b> - When possible this column tells what
+ value the Source Branch has for the conflict.&nbsp; It will always have a
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">
+ icon. If the conflicting item is Word Formatted Content the words &quot;Stream
+ data&quot; will be shown.&nbsp; For artifact conflicts it will either show
+ &quot;Modified&quot; or &quot;Deleted&quot;.&nbsp; Left clicking on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">
+ icon will populate the Merge Branch with value found on the Source Branch.</li>
+ <li><b>The Destination Value Column</b> - When possible this column tells
+ what value the Destination Branch has for the conflict.&nbsp; It will always
+ have a
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">
+ icon. If the conflicting item is Word Formatted Content the words &quot;Stream
+ data&quot; will be shown.&nbsp; For artifact conflicts it will either show
+ &quot;Modified&quot; or &quot;Deleted&quot;.&nbsp; Left clicking on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">
+ icon will populate the Merge Branch with value found on the Destination
+ Branch.</li>
+ <li><b>The Merge Value Column</b> - The Merged Value column serves to show
+ the user the value that has been selected for use when the Branch is
+ committed.&nbsp; The Merge value is actually kept on a new &quot;Merge Branch&quot;
+ and so any changes made to it will not affect the value seen on the Source
+ or Destination Branches.&nbsp; When the Merge Value column is blank with no
+ icon, the conflict is informational and no actions are provided.&nbsp; When
+ the Merge Value column contains a&nbsp;
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/conflict.gif" width="16" height="16">icon
+ the value has not been set.&nbsp; This is the icon that should be shown for all
+ conflicts (Except informational conflicts, or same value conflicts) the
+ first time the user brings up the merge manager.&nbsp; The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">
+ icon indicates that the Source Value was selected as the final value.&nbsp;
+ The actual Source Value text will also be shown in this column if possible.
+ The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">
+ icon indicates that the Destination Value was selected as the final value.&nbsp;
+ The Destination Value text will also be shown in this column if possible.
+ The
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/yellow_m.gif" width="16" height="16">
+ icon will be shown when a new value has been selected for the final value.&nbsp;
+ This indicates that the user has modified the final value so that it is no
+ longer a copy of the Source or Destination, but some variation thereof.&nbsp;
+ A
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">
+ icon indicates that although both the Source Branch Value and Destination
+ Branch Value have changed they were both changed to the same value and so
+ there is not really a conflict. Left clicking on the icon in the Merge Value
+ column will bring up the Merge Wizard or in the case of un-resolvable
+ conflicts a dialog offering the ability to revert the conflicting item.</li>
+ <li><b><a name="The_Right_Click_Menu">The Right Click Menu</a></b> - Right clicking on any row will display a
+ menu with options for dealing with conflicts.&nbsp;
+<ul>
+ <li>&quot;Set Source as Default Branch&quot; - This selection is a quick way to set
+ the Source Branch as the default branch.&nbsp; If the Source Branch is
+ already set as the Default Branch, the menu item will be grayed out and
+ there will be a check mark next to the option.</li>
+ <li>&quot;Set Destination as Default Branch&quot; - This selection is a quick way to
+ set the Destination Branch as the default branch.&nbsp; If the Destination
+ Branch is already set as the Default Branch, the menu item will be grayed
+ out and there will be a check mark next to the option.</li>
+ <li>&quot;Edit Merge Artifact&quot; - This option is only enabled for Word Formatted
+ Content conflicts and will bring up the Merge Artifact in Word.&nbsp; The
+ Merge Artifact is a separate version of the artifact that will preserve the
+ details of the Merge, and will be reviewable in the Merge Manager after an
+ artifact is committed.&nbsp; IMPORTANT: If the user makes the changes to
+ their Source Branch instead of on the Merge Artifact the Merge Manager will
+ incorrectly represent the merge in future reviews.</li>
+ <li>&quot;Generate Three Way Merge&quot; - Will generate a <a href="#Three_Way_Merge">
+ Three Way Merge</a> for the Word Formatted Content.</li>
+ <li>&quot;Preview&quot; -&gt; &quot;Preview Source Artifact&quot;, &quot;Preview Destination Artifact&quot;,
+ &quot;Preview Merge Artifact&quot; will show a preview in Word of the Artifact based
+ on the version selected.</li>
+ <li>&quot;Differences&quot; -&gt; &quot;Show Source Branch Differences&quot;, &quot;Show Destination
+ Branch Differences&quot;, &quot;Show Source/Destination Differences&quot;, &quot;Show
+ Source/Merge Differences&quot;, &quot;Show Destination/Merge Differences&quot;&nbsp; will
+ generate differences based upon which option is selected.&nbsp; Allows the
+ user to see how different versions of the artifact differ.</li>
+ <li>&quot;Reveal Artifact in Explorer&quot; - This option is only available when
+ either the Source or Destination Branch is set as the default branch.&nbsp;
+ When such is the case this will reveal the artifact in the Artifact Explorer
+ for the Branch that is the default branch.</li>
+ <li>&quot;Resource History&quot; - This option is only available when either the
+ Source or Destination Branch is set as the default branch.&nbsp; When such
+ is the case this will reveal the resource history of the artifact on the
+ Branch that is the default branch.</li>
+</ul></li>
+</ul>
+<p>&nbsp;</p>
+<h2>Resolution Of Conflicts</h2>
+<p>For <a href="#Word_Formatted_Content">Word Formatted Content</a> conflicts see the section below.&nbsp; This
+section addresses all other conflicts.</p>
+<ul>
+ <li><b>Informational Conflicts</b><p>Informational conflicts are identified by
+ the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/issue.gif" width="16" height="16">
+ icon in the conflict resolution column in the GUI.&nbsp; Informational
+ conflicts require no action by the user, and no actions are provided in the
+ GUI other than the ability to use the <a href="#The_Right_Click_Menu">right
+ click menu</a> to examine the artifact using the tools provided there.&nbsp;
+ An informational conflict is generated when the Source branch deletes an
+ Artifact or an Attribute and that same Artifact or Attribute was modified on
+ the Destination Branch.&nbsp; This is to allow the user the opportunity to
+ review a change that was made on the Destination Branch that&nbsp; might
+ make them want to take some action in regards to their deletion.</p>
+ <p>&nbsp;</li>
+ <li><b>Un-resolvable Conflicts</b><p>Un-resolvable Conflicts are identified
+ by the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/red_light.gif" width="16" height="16">
+ icon in the conflict resolution column of the GUI. This conflicts require
+ the user to revert the Artifact or Attribute that caused the conflict on the
+ Source Branch.&nbsp; An Un-resolvable conflict is caused when the
+ Destination Branch deletes an Artifact or Attribute while the Source Branch
+ modifies that same Artifact, Attribute.&nbsp; The reason the user must
+ revert their changes is that committing in their changes would essentially
+ undo that deletion and bring that item back into existence. If the deletion
+ should not have happened the user needs to talk with the committer of the
+ deletion to resolve the issue.</p>
+ <p>&nbsp;</li>
+ <li><b>Attribute Conflicts</b><p>Attribute Conflicts occur when both the
+ Destination and Source branch modify an attribute.&nbsp; This section will
+ cover all attributes except <a href="#Word_Formatted_Content">Word Formatted
+ Content</a> Attributes.&nbsp; The resolution of these Attribute values
+ provide three options.&nbsp; Use the Source attribute value, use the
+ destination attribute value,&nbsp; use a modified value that is some
+ combination of the source and destination values. In order to use the Source
+ Value the user may left click on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">
+ icon in the Source Value column.&nbsp; This will copy the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">
+ icon and the value displayed in the Source Value column into the Merged
+ Value Column.&nbsp; In order to use the Destination Value the user may left
+ click on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">
+ icon in the Destination Value column.&nbsp; This will copy the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">
+ icon and the value displayed in the Source Value column into the Merged
+ Value Column.&nbsp; Both of these options are also available from the
+ <a href="#Wizard">Merge
+ Wizard</a> (Left click on the icon in the Merge Value column) with the &quot;Load
+ Source Data&quot; and &quot;Load Destination Value&quot; buttons.&nbsp; In order to modify
+ the value to some combination the user must bring up the Merge Wizard which
+ has an embedded editor specific to the attribute that needs to be modified.&nbsp;
+ Once the value is accurately entered in the editor the user may than select
+ &quot;Finish&quot;&nbsp; This will place a
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/yellow_m.gif" width="16" height="16">
+ icon in the Merged Value column along with the new value. The user then right clicks on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif" width="16" height="16">
+ in the Conflict Status Column so that the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">
+ icon is displayed.&nbsp; The conflict is resolved and will allow the
+ Source Branch to be committed.</p>
+ <p align="center">
+ <a name="Wizard">
+ <img border="0" src="Merge_4.gif"></a> </p>
+ <p align="center">
+ <font size="4">The Merge Wizard</font></p>
+ </li>
+</ul>
+<h2>Resolution Of Conflicts (<a name="Word_Formatted_Content">Word Formatted Content</a>)</h2>
+<p>Resolution of conflicts is provided in two different ways.&nbsp; They can
+either copy and paste the changes into their Merge Artifact document or they can
+generate a Three Way Merge and accept the changes that show up in the generated
+document.&nbsp; Both approaches have their advantages and disadvantages and are
+best suited for different situations.&nbsp; They can also be combined where the
+situation warrants it, however the three way merge must always be done first if
+this is the case.</p>
+<ul>
+ <li>
+ <h3><b>Manual Merging</b></h3>
+ <ul>
+ <li><b>Usage</b><ul>
+ <li>When one version of the artifact has many changes and the other
+ version has very few changes</li>
+ <li>When both files have formatting changes</li>
+ <li>When three way merging generates a complex document</li>
+ <li>When both versions edit the same text in multiple places</li>
+ </ul>
+ <p>Manual Merging is the process of combining the Source Branch changes
+ and the destination branch changes manually by copying and pasting them
+ into the Merge Artifact document.&nbsp; The Merge Artifact is a separate
+ version of the artifact that will preserve the details of the Merge, and
+ will be reviewable in the Merge Manager after an artifact is committed.&nbsp;
+ IMPORTANT: If the user makes the changes to their Source Branch instead
+ of on the Merge Artifact the Merge Manager will incorrectly represent
+ the merge in future reviews.</p>
+ The following procedure illustrates the functionality available
+ to facilitate a manual merge.</p>
+ <p>The user will first either launch the <a href="#WFC Wizard">Merge Wizard</a> by left clicking
+ on the icon in the Merge Value column of the GUI or they may select the
+ functionality from the <a href="#The_Right_Click_Menu">right click menu</a> for the conflict in question.&nbsp;
+ The first thing to do is to bring up a word document comparison of both
+ the Source Branch Version and the Destination Branch Version.&nbsp;
+ These documents will show all of the changes that have been made to
+ these two artifacts since the Source Branch was created.&nbsp; To launch
+ these difference's the user either select &quot;Show Source Diff&quot; and &quot;Show
+ Destination Diff&quot; from the wizard or &quot;Differences&quot;-&gt;&quot;Show Source Branch
+ Differences&quot; and &quot;Differences&quot;-&gt;&quot;Show Destination Branch Differences&quot;
+ from the right click menu</a>.&nbsp; These will bring up the two
+ difference's in different Word instances with window labels to allow the
+ user to differentiate the files.&nbsp; The intention of bringing up
+ these difference's is twofold.&nbsp; Firstly, it allows the user to
+ identify the file that has the most changes.&nbsp; Secondly, it will
+ come in use later when the user copy's and paste's changes into the
+ Merge document.</p>
+ <p>Upon identifying the branch that has the most changes the user should
+ then set the Merge Artifact to contain that branches value.&nbsp; This
+ is done by either selecting &quot;Populate with Source Data&quot; or &quot;Populate
+ with Destination Data&quot; from the Merge Wizard or left clicking on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/green_s.gif" width="16" height="16">
+ icon or the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/blue_d.gif" width="16" height="16">
+ icon in the Source and Destination Value columns in the Merge Manager
+ GUI.&nbsp; The user can then bring up the Merge Artifact for editing by
+ clicking on &quot;Edit Merge Artifact&quot; in the Merge Wizard or in the right
+ click menu.&nbsp; The Document that comes up contains the Merge Artifact
+ and any changes made to it will be reflected when the Source Branch is
+ committed.&nbsp; The user can than begin to copy the changes from the
+ diff report that showed the fewest changes (opposite of the one chosen
+ as the baseline).&nbsp; After all changes have been migrated into the
+ Merge Artifact document the user than saves the document, which will
+ preserve the Merge Artifact value.&nbsp; The user should be aware that
+ any changes they do not wish to preserve from either the Source or
+ Destination version of the Artifact need to be omitted on the Merge
+ Artifact. </p>
+ <p>The user then right clicks on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif" width="16" height="16">
+ in the Conflict Status Column so that the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">
+ icon is displayed.&nbsp; The conflict is resolved and will allow the
+ Source Branch to be committed.</p>
+ <p>&nbsp;</p></li>
+ </ul>
+ </li>
+ <li>
+ <h3 align="left"><b><a name="Three_Way_Merge">Three Way Merge</a></b></h3>
+ <ul>
+ <li>
+ <p align="left"><b>Usage</b><ul>
+ <li>
+ <p align="left">When both versions have many changes or both versions have few
+ changes.</li>
+ <li>
+ <p align="left">When only one file has formatting changes (Must be combined with
+ Manual Merging in this case)</li>
+ <li>
+ <p align="left">When three way merging generates an understandable document</li>
+ </ul>
+ <p align="left">Three Way Merging leverages Microsoft Words ability to merge
+ documents.&nbsp; At the beginning of any Word Formatted Content merge it
+ is recommended that user generate a Three Way Merge and check the
+ complexity of the document.&nbsp; In most cases Three Way Merging is a
+ quicker way to merge two documents, however in some cases the Three Way
+ Merge will generate a document that is difficult to use and understand.&nbsp;
+ This usually arises when the Source and Destination branches have edited
+ the same text or if one of the branches has touched a large percentage
+ of the file.&nbsp; As it runs fairly quickly it is always a good idea to
+ run it at the beginning of a Merge to check if it is useful.&nbsp; Three
+ Way Merging only allows the user to maintain format changes from one of
+ the documents.&nbsp; If format changes are made on both documents the
+ Three Way Merge will prompt the user as to which format changes they
+ would like to maintain, the user will then need to copy the format
+ changes from the other document into the Merge Artifact document
+ manually.</p>
+ <p align="left">A Three Way Merge is generated by selecting Generate Three Way Merge
+ from either the <a href="#WFC Wizard">Merge Wizard</a> or the <a href="#The_Right_Click_Menu">right click menu</a>.&nbsp; IMPORTANT:
+ Generating a Three Way Merge will discard any changes made to the Merge
+ Artifact, therefore a prompt will make sure this is the intended
+ operation.&nbsp; If a user had started a Three Way Merge previously but
+ had not completed the Merge the user is also given the option of
+ continuing the previous Merge in the prompt (Selecting Edit Merge
+ Artifact will also have this effect). The following is an example of a
+ Three Way Merge in Word.<p align="center"><img border="0" src="Merge_3.gif">
+ </p>
+ <p align="center"><font size="4">A Three Way Merge</font></p><p>
+ The changes made by the Source Branch and Destination Branch are shown
+ in different colors in the Word Document.&nbsp; In this particular case
+ the changes made in Red were done by the Source Branch and the changes
+ made in Blue were done on the Destination Branch.&nbsp; The color scheme
+ is not consistent and the user needs to verify which color equates to
+ which changes by hovering there mouse over one of the changes.&nbsp; A
+ popup will be shown which will identify the author.&nbsp; The following
+ <a href="http://office.microsoft.com/en-us/word/HA010983881033.aspx">
+ Guide</a> will explain how to resolve the changes in the document.
+ IMPORTANT: All changes must be either accepted or rejected before the
+ conflict can be marked as resolved.&nbsp; After the user has resolved
+ all the changes it is a good idea to do generate a difference document
+ between the Source Artifact and the Merge Artifact, and the Destination
+ Artifact and the Merge Artifact by selecting &quot;Show Source/Merge Diff&quot;
+ and &quot;Show Destination/Merge Diff&quot; from the merge Wizard or
+ &quot;Differences&quot;-&gt;&quot;Show Source/Merge Differences&quot; and &quot;Differences&quot;-&gt;&quot;Show
+ Destination/Merge Differences&quot; from the
+ <a href="#The_Right_Click_Menu">right click menu</a>.&nbsp; These
+ views will show the differences between the branch artifact and the
+ merge artifact.&nbsp; For the Source/Merge difference this will show
+ everything that is different between the source document and the Merge
+ document.&nbsp; In the case where the user accepts all changes from the
+ source and destination branches this diff will highlight all of the
+ changes that occurred on the destination branch. In the
+ Destination/Merge diff it will highlight all of the changes that
+ happened on the source branch.&nbsp; It is always possible to use Manual
+ Merging techniques in conjunction with Three Way Merging.</p>
+ <p>The user then right clicks on the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/chkbox_disabled.gif" width="16" height="16">
+ in the Conflict Status Column so that the
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/accept.gif" width="16" height="16">
+ icon is displayed.&nbsp; The conflict is resolved and will allow the
+ Source Branch to be committed.</p>
+ <p align="center"><a name="WFC Wizard">
+ <img border="0" src="Merge_5.gif"></a></p>
+ <p align="center"><font size="4">Word Formatted Content Merge Wizard</font></p>
+ </li>
+ </ul>
+</li>
+</ul>
+<h2>Additional Features</h2>
+<p>The Merge Wizard contains a &quot;Clear the Merge Artifact&quot; that is not available
+from the right click menu and only available for Word Formatted Content.&nbsp; This will empty out the Merge artifact and
+allow the user to start with an empty document for editing.&nbsp; It will also
+place a
+ <img border="0" src="../../org.eclipse.osee.framework.ui.skynet/images/conflict.gif" width="16" height="16">icon
+in the merge value column for that conflict.</p>
+<p>&nbsp;</p>
+<p>&nbsp;</p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram README.txt b/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram README.txt
new file mode 100644
index 00000000000..45b4a3d68c6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram README.txt
@@ -0,0 +1,2 @@
+OSEE Branch Diagram.pdf and OSEE Branch Differences.pdf come from
+the osee.doc/approach/demos/OSEE Branch Diagram.ppt \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram.pdf b/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram.pdf
new file mode 100644
index 00000000000..5f224cc8041
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Diagram.pdf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Differences.pdf b/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Differences.pdf
new file mode 100644
index 00000000000..123f195f609
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/OSEE Branch Differences.pdf
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/artifact_explorer_tree.html b/org.eclipse.osee.framework.ui.skynet/reference/artifact_explorer_tree.html
new file mode 100644
index 00000000000..fa7fb0cba02
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/artifact_explorer_tree.html
@@ -0,0 +1,34 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Drag and Drop</h1>
+ <h2>Purpose</h2>
+ <p>Artifacts dragged from the explorer produce different results depending on the application they are dropped onto. While artifacts dropped onto the explorer produce a new Default Hierarchal Relationship with the target artifact as the parent and the source as the child.</p>
+
+ <h2>Dragging An Artifact From The Artifact Explorer</h2>
+ <ul>
+ <li>If an artifact is dragged from the explorer into a Word document a hyper link will be created with the artifact name in text and when selected it will open the artifact in the Artifact Editor.</li>
+ <li>If an artifact is dragged into a Text File the name of the artifact will be written inside the document.</li>
+ <li>If an artifact is dragged into a relation in the Relational View of the Artifact Editor a new relation will be created with the source artifact and the target artifact in the editor.</li>
+ <li>If an artifact is dragged within the Artifact Explorer the original Default Hierarchal Relation will be deleted and a new one be created whith the target artifact.</li>
+ </ul>
+
+ <h2>Dropping Onto The Artifact Explorer</h2>
+ <ul>
+ <li>If a file is dropped onto the Artifact Explorer a new artifact will be created with the contents of the source file and a new Default Hierarchal Relationship.</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.gif b/org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.gif
new file mode 100644
index 00000000000..3b4ddb4eee6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.html b/org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.html
new file mode 100644
index 00000000000..835508dd4c1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/artifact_search_page.html
@@ -0,0 +1,39 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Artifact Search</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Artifact Search</h1>
+ <br/>
+ <img src="artifact_search_page.gif"/>
+ <h2>What it is</h2>
+ The search page in the Eclipse Search window for finding artifacts on the default branch.
+ <h2>How to use it</h2>
+ <p>The Artifact Search page works by building a list of filters which that
+ describe the desired artifacts. Filter types are selected from the drop down at the top
+ of the page. After completing the options for the filter, pressing the <i>Add Filter</i>
+ button will add the filter to the list of filters. If the <i>Not Equal</i> option is checked,
+ then it will be added with the <img src="../images/not_equal.gif"/> image signifying that the
+ complement of the filter will be used.</p>
+ <p>Filters can be removed from the list at anytime by selecting the <img src="../../osee.core/images/remove.gif"/>
+ next to the filter.</p>
+ <p>The radio buttons in the <i>Artifacts that match</i> frame are used to control whether artifacts are returned
+ that match every filter listed or at least one filter listed.</p>
+ <p>Once all of the options have been filled out, the Search button can be pressed to start the search against the
+ default branch. For convenience the default branch is stated at the top of the search page. If
+ a large number of artifacts will be returned then a confirmation will be displayed with a count of the
+ artifacts that are about to be loaded.</p>
+ <p>The Search button will not be enabled until there is at least one filter in the list.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/branch_filtering.html b/org.eclipse.osee.framework.ui.skynet/reference/branch_filtering.html
new file mode 100644
index 00000000000..384b9d11ab1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/branch_filtering.html
@@ -0,0 +1,26 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Branch Filtering</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Branch Filtering</h1>
+ <h2>What it is</h2>
+ A quick way to limit which branches are displayed in the Branch Manager view.
+ <h2>How to do it</h2>
+ Type text in to the box labeled <i>Filter:</i>. As characters are typed, the Branch Manager
+ will update to only display branches whose name contains the text, ignoring the case.<br/>
+ <br/>
+ If no text is entered then all branches will be displayed.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/branch_manager_view.html b/org.eclipse.osee.framework.ui.skynet/reference/branch_manager_view.html
new file mode 100644
index 00000000000..1a9e415e2d7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/branch_manager_view.html
@@ -0,0 +1,39 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Branch Manager View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Branch Manager View</h1>
+ <br/>
+ <img src="branch_view.gif"/>
+ <h2>Purpose</h2>
+ <p>The Branch Manager View is used to display all of the branches in Skynet, as well as details for the transactions on each branch.</p>
+ <p>Branches and transactions can be sorted by clicking on the column heading for the column to sort by. Initially, the data will be sorted in
+ ascending order. Clicking the same column multiple times will toggle the sorting between ascending and descending.</p>
+ <p>Locating branches can also be aided by <a href="branch_filtering.html"/>filtering</a> or using <a href="favorite_branch.html">favorites</a>.</p>
+ <h2>Icons</h2>
+ <ul>
+ <li><img src="../images/branch.gif"/> Base image for branches</li>
+ <li><img src="../images/change_managed_branch.gif"/> Base image for branches that are under change managment</li>
+ <li><img src="../images/black_check.gif"/> Overlay to mark branch as the default</li>
+ <li><img src="../images/star_9_9.gif"/> Overlay to mark branch as a favorite</li>
+ <li><img src="../images/transaction.gif"/> Image for transactions</li>
+ <li><img src="../images/relate.gif"/> Base image for relation links</li>
+ <li><img src="../../osee.skynet/images/molecule.gif"/> Base image for attributes</li>
+ <li><img src="../../osee.skynet/images/out_new.gif"/> Overlay to mark item as new</li>
+ <li><img src="../../osee.skynet/images/out_change.gif"/> Overlay to mark item as modified</li>
+ <li><img src="../../osee.skynet/images/out_delete.gif"/> Overlay to mark item as deleted</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/branch_view.gif b/org.eclipse.osee.framework.ui.skynet/reference/branch_view.gif
new file mode 100644
index 00000000000..023e2ef8f91
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/branch_view.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/change_report_view.gif b/org.eclipse.osee.framework.ui.skynet/reference/change_report_view.gif
new file mode 100644
index 00000000000..5f1abc3bb16
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/change_report_view.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/change_table.html b/org.eclipse.osee.framework.ui.skynet/reference/change_table.html
new file mode 100644
index 00000000000..95ea978242c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/change_table.html
@@ -0,0 +1,51 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Change Report View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Change Report View</h1>
+ <br/>
+ <img src="change_report_view.gif"/>
+ <h2>Purpose</h2>
+ <p>The Change Report View is used to summarize the changes that have been made on a branch or series of transactions.</p>
+ <h2>Icons</h2>
+ <ul>
+ <li><img src="../images/relate.gif"/> Base image for relation links</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/molecule.gif"/> Base image for attributes</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/inc_new.gif"/> Overlay to mark item as an incoming new item</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/inc_change.gif"/> Overlay to mark item as an incoming modification</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/inc_delete.gif"/> Overlay to mark item as an incoming delete</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/out_new.gif"/> Overlay to mark item as an outgoing new item</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/out_change.gif"/> Overlay to mark item as an outgoing modification</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/out_delete.gif"/> Overlay to mark item as an outgoing delete</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/con_new.gif"/> Overlay to mark an item as being new but having incoming changes</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/con_change.gif"/> Overlay to mark an item as having incoming and outgoing changes</li>
+ <li><img src="../../org.eclipse.osee.framework.skynet.core/images/con_delete.gif"/> Overlay to mark an item as being deleted but having incoming changes</li>
+ </ul>
+ <h2>Branch Change Report</h2>
+ <p>A Change Report can be performed for a branch two ways. The first way is by selecting right-clicking a branch
+ from the Branch Manager then choosing the "Show Change Report" menu item. The second way is to select
+ "Show Change Report" from the Aspect view of an ATS Action that is still in work; this will do a Change
+ Report for the working branch of the Aspect.</p>
+ <p>This type of Change Report will display all of the artifacts on the branch that have had an attribute
+ or relation link modified. It will also do conflict detection on these artifacts against the parent branch.
+ All changes done on the current artifact will appear with a grey right arrow<img src="../../org.eclipse.osee.framework.skynet.core/images/out_change.gif"/>, while all changes from the
+ parent branch will be shown with a blue left arrow<img src="../../org.eclipse.osee.framework.skynet.core/images/inc_change.gif"/>. Attributes and relation links with multiple changes will
+ provide a summarized node that shows the final effect of the changes and can be expanded to view all of the
+ minor changes that were made. If an attribute or relation link was modified on both
+ branches then the summary will show a red conflict mark<img src="../../org.eclipse.osee.framework.skynet.core/images/con_change.gif"/> to signify that a commit will cause an override
+ to occur.
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/compare_two_artifacts.html b/org.eclipse.osee.framework.ui.skynet/reference/compare_two_artifacts.html
new file mode 100644
index 00000000000..e0d10d4e913
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/compare_two_artifacts.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>compare tow artifacts</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Compare two artifacts</h1>
+ <h2>What it is</h2>
+ <p> It compares two artifact's word contents to each other.</p>
+
+ <h2>How to do it</h2>
+ <p>Select two artifacts and right click and select “Compare two Artifacts”. A word document will be displayed showing the differences between each of the artifact’s word content.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/contexts.xml b/org.eclipse.osee.framework.ui.skynet/reference/contexts.xml
new file mode 100644
index 00000000000..841eba6ee12
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/contexts.xml
@@ -0,0 +1,11 @@
+<contexts>
+ <context id="table_customization" title="Table Customization">
+ <description>Allows the table to be customized, saved and loaded.</description>
+ <topic label="Table Customization" href="reference/table_customization.html"/>
+ </context>
+ <context id="mass_artifact_editor" title="Mass Artifact Editor">
+ <description>Allows viewing and editing of attributes from multiple artifacts.</description>
+ <topic label="Mass Artifact Editor" href="reference/mass_artifact_editor.html"/>
+ <topic label="Table Customization" href="reference/table_customization.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/create_branch.html b/org.eclipse.osee.framework.ui.skynet/reference/create_branch.html
new file mode 100644
index 00000000000..091d282812f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/create_branch.html
@@ -0,0 +1,40 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Default Branch</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Default Branch</h1>
+ <h2>What it is</h2>
+ The branch which is returned to any program that asks for the current default branch. For instance,
+ the Artifact Explorer will use the default branch to determine what artifacts to show, and artifact
+ searches are performed against the default branch.
+ <h2>How to tell what the default branch is</h2>
+ The Branch Manager view shows all of the branches with the <img src="../images/branch.gif"/> icon.<br/>
+ <br/>
+ The default branch will have a <img src="../images/black_check.gif"/> at the top right of the normal branch icon.<br/>
+ <br/>
+ Most views and editors that are working with artifacts will show the branch in the status bar next to the branch icon.
+ <h2>How to set it</h2>
+ The default branch is set from the Branch Manager view. Use sorting or filtering in the table to find the
+ desired branch. Right-click on the branch and then select <i>Set Default Branch</i> from the popup menu.<br/>
+ <br/>
+ The <i>Set Default Branch</i> option will be disabled if any of the following cases are true:
+ <ul>
+ <li>The branch selected is already the default</li>
+ <li>The item selected is not a branch</li>
+ <li>More than one item is selected</li>
+ </ul>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/creating_new_artifact.html b/org.eclipse.osee.framework.ui.skynet/reference/creating_new_artifact.html
new file mode 100644
index 00000000000..c4044bb2d7b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/creating_new_artifact.html
@@ -0,0 +1,27 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Creating a new artifact</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Creating a new Artifact</h1>
+ <h2>What it is</h2>
+ <p>New artifacts can be created from the Artifact Explorer.</p>
+
+ <h2>How to do it</h2>
+ <ul>
+ <li>A new artifact may be created from the right click menu by selecting the "New Child" menu item, then next the artifact type.</li>
+ <li>A new artifact may be created from a file by selecting the file and dragging it into the Artifact Explorer</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/creating_new_links.html b/org.eclipse.osee.framework.ui.skynet/reference/creating_new_links.html
new file mode 100644
index 00000000000..1a7212b0ccd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/creating_new_links.html
@@ -0,0 +1,28 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Creating a new Link</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Creating a new Link</h1>
+ <h2>What it is</h2>
+ <p>Linking artifacts to each other.</p>
+
+ <h2>How to do it</h2>
+ <p>New relation links can be created one of two ways.</p>
+ <ul>
+ <li>If the relation link group desired exists on the artifact a new link may be created by dragging another artifact onto the relation link group. </li>
+ <li>If the relation group does not already exist a new relation group may be created by right clicking in the relation page then select “New Relation” and selecting the desired relation group. Only valid relation groups for the specific artifact will be enabling in the menu list. Menus where either artifact can be valid for either side will contain “…” after the text. When selected a dialog box will be displayed where the relation side of the source artifact will be placed.</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/default_branch.html b/org.eclipse.osee.framework.ui.skynet/reference/default_branch.html
new file mode 100644
index 00000000000..6aa4ee847c1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/default_branch.html
@@ -0,0 +1,40 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Default Branch</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Default Branch</h1>
+ <h2>What it is</h2>
+ The branch which is returned to any program that asks for the current default branch. For instance,
+ the Artifact Explorer will use the default branch to determine what artifacts to show, and artifact
+ searches are performed against the default branch.
+ <h2>How to tell what the default branch is</h2>
+ The Branch Manager view shows all of the branches with the <img src="../images/branch.gif"/> icon.<br/>
+ <br/>
+ The default branch will have a <img src="../images/black_check.gif"/> at the top right of the normal branch icon.<br/>
+ <br/>
+ Most views and editors that are working with artifacts will show the branch in the status bar next to the branch icon.
+ <h2>How to set it</h2>
+ The default branch is set from the Branch Manager view. Use sorting or <a href="branch_filtering.html"/>filtering</a> in the table to find the
+ desired branch. Right-click on the branch and then select <i>Set Default Branch</i> from the popup menu.<br/>
+ <br/>
+ The <i>Set Default Branch</i> option will be disabled if any of the following cases are true:
+ <ul>
+ <li>The branch selected is already the default</li>
+ <li>The item selected is not a branch</li>
+ <li>More than one item is selected</li>
+ </ul>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/deleting_artifacts.html b/org.eclipse.osee.framework.ui.skynet/reference/deleting_artifacts.html
new file mode 100644
index 00000000000..1c6b1ab2813
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/deleting_artifacts.html
@@ -0,0 +1,29 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Deleting Artifacts</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Deleting Artifacts</h1>
+ <h2>What it is</h2>
+ <p>Artifacts may be deleted from the Artifact Explorer.
+ <br>
+ <b>Caution</b> should be taken in performing this task because along with the artifact all of its default hierarchy children will also be deleted.</p>
+
+ <h2>How to do it</h2>
+ <p>To delete an artifact and its children select the desired artifact and the right click, next select the “Delete Artifact” menu item. A dialog will be displayed asking for deletion confirmation.</p>
+ <br>
+ <h2>Note:</h2>
+ <p>An artifact may also be deleted by selecting an artifact and pressing the delete key.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/deleting_link.html b/org.eclipse.osee.framework.ui.skynet/reference/deleting_link.html
new file mode 100644
index 00000000000..3bca9d0a247
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/deleting_link.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Deleting a Link</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Deleting a Link</h1>
+ <h2>What it is</h2>
+ <p>Removing a link between two artifacts.</p>
+
+ <h2>How to do it</h2>
+ <p>A link can de deleted by selecting the desired link to be removed then right clicking and selecting the “Delete” menu item. A dialog will be displayed for confirmation.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/favorite_branch.html b/org.eclipse.osee.framework.ui.skynet/reference/favorite_branch.html
new file mode 100644
index 00000000000..bc959644be3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/favorite_branch.html
@@ -0,0 +1,32 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Favorite Branch</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Favorite Branch</h1>
+ <h2>What it is</h2>
+ A branch that the user has marked as a favorite. Any number of branches can be marked as favorite. This is
+ used in conjunction with the <img src="../images/filter.gif"/>Show Favorites First filter to quickly locate
+ branches of interest.
+ <h2>How to tell which branches are favorites</h2>
+ The Branch Manager view shows all of the branches with the <img src="../images/branch.gif"/> icon.<br/>
+ <br/>
+ A favorite branch will have a <img src="../images/star_9_9.gif"/> at the bottom left of the normal branch icon.
+ <h2>How to set/unset it</h2>
+ A favorite branch is set from the Branch Manager view. Use sorting or filtering in the table to find the
+ desired branch. Right-click on the branch and then select <i>Mark As Favorite</i>
+ or <i>Unmark As Favorite</i> from the popup menu.<br/>
+ <br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/go_into.html b/org.eclipse.osee.framework.ui.skynet/reference/go_into.html
new file mode 100644
index 00000000000..c0a84494335
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/go_into.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Rooting on an artifact</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Rooting on an artifact</h1>
+ <h2>What it is</h2>
+ <p>It changes the root artifact in the Artifact Explorer to the selected artifact.</p>
+
+ <h2>How to do it</h2>
+ <p>Select the desired artifact from the Artifact Explorer right click and select the “Go Into” menu item.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/mass_artifact_editor.html b/org.eclipse.osee.framework.ui.skynet/reference/mass_artifact_editor.html
new file mode 100644
index 00000000000..e1128ea9c81
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/mass_artifact_editor.html
@@ -0,0 +1,30 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Mass Artifact Editor</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Mass Artifact Editor</h1>
+ <h2>Purpose</h2>
+ <p>The Mass Artifact Editor allows the easy view of multiple artifact along with their attributes.
+ This editor can be viewed from right-click off Artifact Explorer, Search Results page, or via
+ ATS action. Single cells can be edited via Alt-Left-Mouse-Click. After editing any number of
+ artifacts shown, the save button persists this data.</p>
+ <p>Note: This editor will close upon switch of default branch unless the editor is tied to
+ the common branch.</p>
+ <h2>Actions</h2>
+ Select <img src="../images/refresh.gif"/> to refresh the contents.<br/>
+ Select <img src="../images/customize.gif"/> to <A href="table_customization.html"/>Customize Table</A>.<br/>
+ Select <img src="../images/bug.gif"/> to <A href="../../osee.ats/reference/report_a_bug.html"/>Report a Bug</A>.<br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/osee_branching.html b/org.eclipse.osee.framework.ui.skynet/reference/osee_branching.html
new file mode 100644
index 00000000000..09c856e02ff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/osee_branching.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+<head>
+<title>OSEE Branching and Differences Diagrams</title>
+<LINK rel="stylesheet" type="text/css"
+ href="../../osee.help/html/style.css">
+</head>
+
+<body>
+<h1>OSEE Branching and Differences Diagrams</h1>
+<a href="OSEE Branch Diagram.pdf">OSEE Branching Diagram</a>
+<br />
+<a href="OSEE Branch Differences.pdf">OSEE Differeces Diagram</a>
+<br />
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/queryLog/contexts.xml b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/contexts.xml
new file mode 100644
index 00000000000..0134f0df1d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/contexts.xml
@@ -0,0 +1,9 @@
+<contexts>
+ <context id="query_log_table" title="Query Log">
+ <description>Displays queries that have been run, along with their run time, bind variables, and the time when they were ran. If a SQLException occurred during execution then it will also be shown.</description>
+ <topic label="Query Log" href="reference/queryLog/query_log_view.html"/>
+ <topic label="Refreshing the log" href="reference/queryLog/refresh_log.html"/>
+ <topic label="Deleting the log" href="reference/queryLog/delete_log.html"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/queryLog/delete_log.html b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/delete_log.html
new file mode 100644
index 00000000000..7b21c3c40e0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/delete_log.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Delete Query Log</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Delete Query Log</h1>
+ <h2>Purpose</h2>
+ Deletes all of the recorded queries from the log then refreshes the view. The log has a max capacity and once it is met
+ no more entries will be added, so deleting the log will be necessary to see any new queries that are being performed.
+ <h2>How to do it</h2>
+ Select the delete button (<img src="../../images/delete_edit.gif"/>) from the toolbar on the top portion of the Query Log view.<br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.gif b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.gif
new file mode 100644
index 00000000000..d341f477a53
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.html b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.html
new file mode 100644
index 00000000000..cd0f0327126
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/query_log_view.html
@@ -0,0 +1,39 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Query Log View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Query Log View</h1>
+ <br/>
+ <img src="query_log_view.gif"/>
+ <h2>Purpose</h2>
+ <p>The Query Log view is used to review queries that have been run for the purpose of debugging. Details about the query
+ such as how long it took to run, if any bind variables were passed, or if an SQL Exception was thrown while attempting to
+ execute the query are all available. Run time is only reported for queries that executed successfully.</p>
+ <p>Queries can be sorted by clicking on the column heading for the column to sort by. Initially, the data will be sorted in
+ ascending order. Clicking the same column multiple times will toggle the sorting between ascending and descending. The table
+ can be sorted on multiple columns by holding the CTRL key and selecting columns in the order which they should be sorted.</p>
+ <h2>Shortcuts</h2>
+ <ul>
+ <li><b>CTRL+A</b> - Select all items displayed</li>
+ <li><b>CTRL+C</b> - Copy the current selected item to the clipboard.
+ <ul>
+ <li>SQL Item - Copies the full SQL Text</li>
+ <li>Bind Variable - Copies the bind variable value, not including the type. Binary data not supported</li>
+ <li>Exception - Copies the exception and stack trace</li>
+ </ul></li>
+ <li><b>CTRL+X</b> - Fully expand selected items</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/queryLog/refresh_log.html b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/refresh_log.html
new file mode 100644
index 00000000000..2f66f1dc2df
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/queryLog/refresh_log.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Refresh Query Log</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Refresh Query Log</h1>
+ <h2>Purpose</h2>
+ Repopulates the view with the latest information from the query log. The log has a max capacity and once it is met
+ no more entries will be added. This can be taken care of by <a href="delete_log.html">deleting the log contents</a>.
+ <h2>How to do it</h2>
+ Select the refresh button (<img src="../../images/refresh.gif"/>) from the toolbar on the top portion of the Query Log view.<br/>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/all_match_locations_option.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/all_match_locations_option.html
new file mode 100644
index 00000000000..340c1c1f654
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/all_match_locations_option.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search Word Order Match Search Option</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+ <body>
+ <h1>All Match Locations Search Option</h1>
+
+ <h2>What it is</h2>
+ <p>An option to return match location information for the quick search query. Match location information is found during the <i>Match Word Order</i> operation.
+ Therefore, match location information will only be returned when the <i>Match Word Order</i> option is selected.
+ When the <i>All Match Locations</i> option is not selected (default case), search results will only contain the first location
+ where the quick search query matched the item. By selecting <i>All Match Locations</i> option, all locations where matches were found will be returned.
+ <b>NOTE: Selecting to return all match locations can potentially slow down search performance.</b>
+ </p>
+ <h2>How to do it</h2>
+ <p>Type in the desired words. Make sure the <i>Match Word Order</i> option is selected
+ under <i>Options</i>, select <i>All Match Locations</i> then press the <i>Search</i> button.</p>
+
+ <h2>Shortcuts</h2>
+ <p>Pressing enter in the text entry box is equivalent to pressing the <i>Search</i> button.</p>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="quick_search_view.html">Quick Search View</a>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/artifact_search.gif b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/artifact_search.gif
new file mode 100644
index 00000000000..799d3d5686c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/artifact_search.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_tagging.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_tagging.html
new file mode 100644
index 00000000000..b4866de65a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_tagging.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Attribute Tagging for Quick Search</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+
+</head>
+
+<body>
+
+ <h1>Attribute Tagging for Quick Search</h1>
+
+ <p>When an artifact is saved, each attribute contained in the artifact is analyzed to produce a list of
+ tags that are then associated with the artifact. Quick search is a form of <i>keyword</i> based searching
+ which uses tags to perform contextual artifact searches.</p>
+
+ <p>For an attribute to be tagged by the system, it must meet the following criteria:</p>
+ <ol>
+ <li>The attribute's type must specify an <b>Attribute Tagger</b> to be used by the tagging system.</li>
+ <li>The attribute must contain valid data.</li>
+ <li>The attribute revision must be saved in the database before sending to tagging system.</li>
+ </ol>
+
+ <p>To produce tags, modified attributes are sent to the OSEE application server where the tagging system
+ processes each attribute using an <b>Attribute Tagger</b> specified by the attribute's type. The <b>Attribute Tagger</b>
+ knows how to interpret the attribute's data and how to extract words from the content. At this point, a word is defined
+ as a sequential set of alphanumeric characters delimited by one or more spaces. As words are parsed, they are sent
+ to the tagging system's word encoder where the following processing takes place:
+ </p>
+ <ol>
+ <li>The characters in the original word are converted to lower case.</li>
+ <li>The lower cased version of the word is encoded and stored in the tagging system.</li>
+ <li>The lower cased version of the word is split using punctuation characters such as (<b><code>' '</code>,
+ <code>!</code>, <code>"</code>, <code>#</code>, <code>$</code>,
+ <code>%</code>, <code>(</code>, <code>)</code>, <code>*</code>, <code>+</code>,
+ <code>,</code>, <code>-</code>, <code>.</code>, <code>/</code>, <code>:</code>,
+ <code>;</code>, <code>&lt;</code>, <code>&gt;</code>, <code>?</code>, <code>@</code>,
+ <code>[</code>, <code>\</code>, <code>]</code>, <code>^</code>, <code>{</code>,
+ <code>|</code>, <code>}</code>, <code>~</code>, <code>_</code></b>) as delimiters.</li>
+ <li>Possessive words <i>(ending in 's)</i> are converted into regular form.</li>
+ <li>Each word is converted from plural to singular form.</li>
+ <li>Each word is encoded and stored in the tag system.</li>
+ </ol>
+
+ <p> When encoding words into tags, the tag encoder uses an algorithm which transforms the word's characters
+ into a bit-packed tag that will fit in a 64-bit integer. The tag will represent up to 12 characters
+ (all that can fit into 64-bits). Longer words will be turned into consecutive tags.</p>
+
+ <h3>Tag Encoding Examples</h3>
+ <table style="width:50%;" border="1">
+ <tr style="background:lightgrey">
+ <th>Original</th>
+ <th>Keywords</th>
+ <th>Encoding</th>
+ </tr>
+ <tr>
+ <td>appendeces</td>
+ <td>appendix</td>
+ <td>-220858502</td>
+ </tr>
+ <tr>
+ <td>battery(ies)</td>
+ <td>battery</td>
+ <td>529513131</td>
+ </tr>
+ <tr>
+ <td>alternate/backup</td>
+ <td>
+ <table>
+ <tr><td>alternate</td></tr>
+ <tr><td>backup</td></tr>
+ </table>
+ </td>
+ <td>
+ <table>
+ <tr><td>-1420231874</td></tr>
+ <tr><td>24902827</td></tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="quick_search_view.html">Quick Search View</a>
+ </p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_type_filter_option.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_type_filter_option.html
new file mode 100644
index 00000000000..c0f9bd8d989
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/attribute_type_filter_option.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search Attribute Type Filter Search Option</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+ <body>
+ <h1>Quick Search Attribute Type Filter Search Option</h1>
+
+ <h2>What it is</h2>
+ <p>An option to search in a specific set of attribute types for artifacts on the default branch.</p>
+
+ <h2>How to do it</h2>
+ <p>Type in the desired words to search for. Make sure the <i>Attribute Type Filter</i> option is selected
+ under <i>Options</i>. By default, the filter is set to filter by attributes of type <i>Name</i>.
+ If you wish to change the filter, select the button to the right of the configuration text area. When this is performed,
+ a dialog displaying all the different tagged attribute types will be displayed. Check the items to include in the filter and select <i>Ok</i>.
+ Press the <i>Search</i> button to execute the search.</p>
+ <p><b>Note: When <i>Attribute Type Filter</i> option is selected, <i>By Id</i> option is not allowed. Therefore, selecting <i>Attribute Type Filter</i> option disables the <i>By Id</i> option by setting its state to not selected.</b></p>
+
+ <h2>Shortcuts</h2>
+ <p>Pressing enter in the text entry box is equivalent to pressing the <i>Search</i> button.</p>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="quick_search_view.html">Quick Search View</a>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/by_id_option.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/by_id_option.html
new file mode 100644
index 00000000000..764837f80a2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/by_id_option.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search By Id Search Option</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+ <body>
+ <h1>Quick Search By Id Search Option</h1>
+
+ <h2>What it is</h2>
+ <p>An option to search for artifacts with a particular GUID or HRID on the default branch.</p>
+ <h2>How to do it</h2>
+ <p>Type in the desired GUID(s) or HRID(s) separated by commas or spaces. Make sure the <i>By Id</i> option is selected
+ under <i>Options</i>, then press the <i>Search</i> button.
+ </p>
+ <p><b>Note: When <i>By Id</i> option is selected, <i>Attribute Type Filter</i> option is not allowed. Therefore, selecting <i>By Id</i> option disables the <i>Attribute Type Filter</i> option by setting its state to not selected.</b></p>
+
+ <h2>Shortcuts</h2>
+ <p>Pressing enter in the text entry box is equivalent to pressing the <i>Search</i> button.</p>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="quick_search_view.html">Quick Search View</a>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/contexts.xml b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/contexts.xml
new file mode 100644
index 00000000000..cb1b7cfe0df
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/contexts.xml
@@ -0,0 +1,37 @@
+<contexts>
+ <context id="quick_search_text" title="Quick Search">
+ <description>Provides quick access to search for artifacts</description>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html"/>
+ <topic label="Attribute Type Filter Search Option" href="reference/quickSearch/attribute_type_filter_option.html"/>
+ <topic label="By Id Search Option" href="reference/quickSearch/by_id_option.html"/>
+ <topic label="Include Deleted Search Option" href="reference/quickSearch/include_deleted_option.html"/>
+ <topic label="Match Word Order Search Option" href="reference/quickSearch/word_order_match_option.html"/>
+ <topic label="All Match Locations Option" href="reference/quickSearch/all_match_locations_option.html"/>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+ <context id="quick_search_by_id_option" title="Quick Search">
+ <description>Provides quick access to search for artifacts</description>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html"/>
+ <topic label="By Id Search Option" href="reference/quickSearch/by_id_option.html"/>
+ </context>
+ <context id="quick_search_deleted_option" title="Quick Search">
+ <description>Provides quick access to search for artifacts</description>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html"/>
+ <topic label="Include Deleted Search Option" href="reference/quickSearch/include_deleted_option.html"/>
+ </context>
+ <context id="quick_search_attribute_type_filter" title="Quick Search">
+ <description>Provides quick access to search for artifacts</description>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html"/>
+ <topic label="Attribute Type Filter Search Option" href="reference/quickSearch/attribute_type_filter_option.html"/>
+ </context>
+ <context id="quick_search_word_order_option" title="Quick Search">
+ <description>Provides quick access to search for artifacts</description>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html"/>
+ <topic label="Word Order Match Search Option" href="reference/quickSearch/word_order_match_option.html"/>
+ </context>
+ <context id="quick_search_all_match_locations_option" title="Quick Search">
+ <description>Provides quick access to search for artifacts</description>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html"/>
+ <topic label="All Match Locations Option" href="reference/quickSearch/all_match_locations_option.html"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/include_deleted_option.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/include_deleted_option.html
new file mode 100644
index 00000000000..844d3010551
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/include_deleted_option.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search Include Deleted Search Option</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+ <body>
+ <h1>Quick Search Include Deleted Search Option</h1>
+
+ <h2>What it is</h2>
+ <p>An option to include artifacts that have been deleted as part of a quick search on the default branch.
+ </p>
+ <h2>How to do it</h2>
+ <p>Type in the desired words. Make sure the <i>Include Deleted</i> option is selected
+ under <i>Options</i>, then press the <i>Search</i> button.</p>
+
+ <h2>Shortcuts</h2>
+ <p>Pressing enter in the text entry box is equivalent to pressing the <i>Search</i> button.</p>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="quick_search_view.html">Quick Search View</a>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelc.png b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelc.png
new file mode 100644
index 00000000000..161e3aa313b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelc.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelr.png b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelr.png
new file mode 100644
index 00000000000..4726f8c43aa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/ngrelr.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quickSearchView.png b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quickSearchView.png
new file mode 100644
index 00000000000..d9203f2543f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quickSearchView.png
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quick_search_view.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quick_search_view.html
new file mode 100644
index 00000000000..6335b899933
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/quick_search_view.html
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search View</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+<body>
+ <h1>Quick Search View</h1>
+
+ <p>The Quick Search view allows users to perform searches for information
+ that is contained <i>inside</i> artifacts in a selected branch.
+ </p>
+
+ <img src="quickSearchView.png" alt="quick search view"/>
+
+ <p>To find all artifacts that contain a particular set of keywords:</p>
+ <ol>
+ <li>Select <a class="command-link" href='javascript:executeCommand("org.eclipse.ui.views.showView(org.eclipse.ui.views.showView.viewId=org.eclipse.osee.framework.ui.skynet.QuickSearchView)")'>
+ <img src="artifact_search.gif" alt="search icon" border="0" />
+ <b>Window &gt; Show View &gt; Other... &gt; OSEE &gt; Quick Search</b></a>, to open the view.
+ </li>
+ <li><p>Type your search string in the <b>Enter Search String</b> combo box, or use the
+ pull-down list to select a previously entered search expression. <br/> Special characters such as (<b><code>' '</code>,
+ <code>!</code>, <code>"</code>, <code>#</code>, <code>$</code>,
+ <code>%</code>, <code>(</code>, <code>)</code>, <code>*</code>, <code>+</code>,
+ <code>,</code>, <code>-</code>, <code>.</code>, <code>/</code>, <code>:</code>,
+ <code>;</code>, <code>&lt;</code>, <code>&gt;</code>, <code>?</code>, <code>@</code>,
+ <code>[</code>, <code>\</code>, <code>]</code>, <code>^</code>, <code>{</code>,
+ <code>|</code>, <code>}</code>, <code>~</code>, <code>_</code></b>) are assumed to be word separators unless <i>By Id</i> option is selected.
+ When <i>By Id</i> option is selected, (<b><code>,</code> and <code>' '</code></b>) are treated as separators.</p>
+ <p>For example:
+ <ul>
+ <li>When <i>By Id</i> is not selected, <b><code>hello.world</code></b> will be translated to <b><code>hello</code></b> and <b><code>world</code></b>. The search will match attributes with <b><code>hello</code></b> and <b><code>world</code></b> keywords.</li>
+ <li>When <i>By Id</i> is selected, (<b><code>A+ABG7jFm+0BKaVZIxfqOQ,AFABG7jFm+0BKaVZIxfqOQ PX1FH</code></b>) will be interpreted as 2 GUID(s) and 1 HRID. The search will match artifacts containing <b><code>A+ABG7jFm+0BKaVZIxfqOQ</code></b> and <b><code>AFABG7jFm+0BKaVZIxfqOQ</code></b> as its GUID or <b><code>PX1FH</code></b> as its HRID.</li>
+ </ul>
+ </p>
+ </li>
+ <li>Finish entering your search options, (for example, to scope
+ the search to include deleted artifacts, check the include deleted option),
+ and click <b>Search</b> or press <b>Enter</b> from the combo box to execute the search.
+ </li>
+ <li>The Search view displays the results of your search. Right-click on any item in
+ the Search view to open a pop-up menu that allows you perform various operations
+ on the artifacts such as copy search results to the clipboard or reveal a
+ selected artifact in Artifact Explorer. To open one of the listed artifacts,
+ double-click it or select <b>Open</b> from its pop-up menu.
+ </li>
+ </ol>
+
+ <p><img border="0" src="ngrelc.png" alt="Related concepts" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="attribute_tagging.html">Attribute Tagging</a>
+ </p>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="attribute_type_filter_option.html">Attribute Type Filter Search Option</a><br/>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="by_id_option.html">By Id Search Option</a><br/>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="include_deleted_option.html">Include Deleted Search Option</a><br/>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="word_order_match_option.html">Word Order Match Search Option</a><br/>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="all_match_locations_option.html">All Match Locations Search Option</a><br/>
+ </p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/word_order_match_option.html b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/word_order_match_option.html
new file mode 100644
index 00000000000..cd82ffb8018
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/quickSearch/word_order_match_option.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2007 Boeing. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Boeing - initial API and implementation" >
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="STYLESHEET" href="../book.css" charset="ISO-8859-1" type="text/css">
+<title>Quick Search Word Order Match Search Option</title>
+<script language="JavaScript" src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/org.eclipse.help.webapp/advanced/breadcrumbs.css" charset="ISO-8859-1" type="text/css"></link>
+<script type="text/javascript" src="../content/PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/narrow_book.css" type="text/css"></link>
+<link rel="stylesheet" href="../content/PLUGINS_ROOT/PRODUCT_PLUGIN/win32_narrow_book.css" type="text/css"></link>
+<script type="text/javascript">
+<!--
+if (parent.ContentToolbarFrame && parent.ContentToolbarFrame.setButtonState) parent.ContentToolbarFrame.setButtonState("toggle_highlight","hidden");
+-->
+</script>
+</head>
+ <body>
+ <h1>Quick Search Word Order Match Search Option</h1>
+
+ <h2>What it is</h2>
+ <p>An option to match a phrase against artifacts during a quick search operation on the default branch.
+ </p>
+ <h2>How to do it</h2>
+ <p>Type in the desired words. Make sure the <i>Match Word Order</i> option is selected
+ under <i>Options</i>, then press the <i>Search</i> button.</p>
+
+ <h2>Shortcuts</h2>
+ <p>Pressing enter in the text entry box is equivalent to pressing the <i>Search</i> button.</p>
+
+ <p><img border="0" src="ngrelr.png" alt="Related reference" /><br>
+ &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<a href="quick_search_view.html">Quick Search View</a>
+ </p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/refresh_change_report.html b/org.eclipse.osee.framework.ui.skynet/reference/refresh_change_report.html
new file mode 100644
index 00000000000..878148fb7f9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/refresh_change_report.html
@@ -0,0 +1,26 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Refresh Change Report</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Refresh Change Report</h1>
+ <h2>Purpose</h2>
+ Forces the Change Report to be recomputed. This is typically used when the Change Report snapshot has become out of date,
+ noted by a <img src="../images/old.gif"/> next to the snapshot description on the first line of the Change Report.
+ <h2>How to do it</h2>
+ Select the refresh button (<img src="../images/refresh.gif"/>) from the toolbar on the top portion of the Change Report view.<br/>
+ <br/>
+ If the Change Report view is empty then the refresh button will do nothing.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/reorder_links.html b/org.eclipse.osee.framework.ui.skynet/reference/reorder_links.html
new file mode 100644
index 00000000000..ec2d9af382d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/reorder_links.html
@@ -0,0 +1,24 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Reordering Links</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Reordering Links</h1>
+ <h2>What it is</h2>
+ <p>A way to change the link ordering of a relation group. The results from link reordering will be reflected in the Relation Page and the Artifact Explorer.</p>
+
+ <h2>How to do it</h2>
+ <p>Relation links may be reordered within the same relation link group by selecting the link and dropping it into the desired location. Since the target indicator is displayed after the selected artifact pressing the ctrl key will shift the indicator to before the artifact, therefore allowing artifacts to be moved to the bottom of the link group.</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/resource_history_view.GIF b/org.eclipse.osee.framework.ui.skynet/reference/resource_history_view.GIF
new file mode 100644
index 00000000000..39e5a3fd205
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/resource_history_view.GIF
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/result_view.html b/org.eclipse.osee.framework.ui.skynet/reference/result_view.html
new file mode 100644
index 00000000000..243d6fb9d89
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/result_view.html
@@ -0,0 +1,32 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>ATS Result View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Result View</h1>
+ <br/>
+ <img src="result_view.jpg"/>
+ <h2>Purpose</h2>
+ Show reports, errors, metrics and other data in a multi-paged view with print, email and exporting capabilities.
+ <h2>How to do it</h2>
+ This view pops up automatically when OSEE needs to report larger amounts of data to the user.
+ <h2>Actions</h2>
+ Select <img src="../images/print.gif"/> to print the current window.<br/>
+ Select <img src="../images/email.gif"/> to email the current results view to an OSEE user.<br/>
+ Select <img src="../images/export.gif"/> to export the current table into a comma seperated value file.<br/>
+ <h2>Mulit-page</h2>
+ Selecting the down arrow will show a list of all pages that have been displayed during the current instance
+ of OSEE running. Selecting from this list will display the previous page.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/result_view.jpg b/org.eclipse.osee.framework.ui.skynet/reference/result_view.jpg
new file mode 100644
index 00000000000..b71a732fbf4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/result_view.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/revision_history_view.html b/org.eclipse.osee.framework.ui.skynet/reference/revision_history_view.html
new file mode 100644
index 00000000000..16a5322d454
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/revision_history_view.html
@@ -0,0 +1,27 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Resource History View</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Resource History View</h1>
+ <br/>
+ <img src="resource_history_view.gif"/>
+ <h2>Purpose</h2>
+ <p>The Revision History is a view that displays the change history of an artifact.</p>
+ <h2>Icons</h2>
+ <ul>
+ <li><img src="../images/transaction.gif"/> Image for transactions</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/show_change_report.html b/org.eclipse.osee.framework.ui.skynet/reference/show_change_report.html
new file mode 100644
index 00000000000..c70f8597e26
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/show_change_report.html
@@ -0,0 +1,36 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Show Change Report</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Show Change Report</h1>
+ <h2>What it is</h2>
+ A view that shows all of the changes made on a branch, or between two transactions on the same branch.
+ <h2>How to do it</h2>
+ <h3>For a branch</h3>
+ Use <a href="branch_filtering.html">filtering</a> or sorting to locate the branch of interest. Right-click
+ the branch and select <i>Show Change Report</i>. The change report will show all changes made on the branch
+ since its baseline.<br/>
+ <br/>
+ If anything is selected in addition to the one branch, then the <i>Show Change Report</i> menu item will be disabled.
+ <h3>For a range of transactions</h3>
+ Use <a href="branch_filtering.html">filtering</a> or sorting to locate the branch with the transactions. Then locate the
+ starting and ending transactions. Select both of the transactions by ctrl-clicking each transaction, then right-click
+ and select <i>Show Change Report</i>. The change report will show all changes after the earlier transaction, up to and
+ including the later transaction.<br/>
+ <br/>
+ If anything is selected in addition to the two transactions, or the two transactions are on seperate branches,
+ the <i>Show Change Report</i> menu item will be disabled.
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/skynet_toc.xml b/org.eclipse.osee.framework.ui.skynet/reference/skynet_toc.xml
new file mode 100644
index 00000000000..9f8821a790b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/skynet_toc.xml
@@ -0,0 +1,32 @@
+<toc label="OSEE Application Framework">
+ <topic label="Views and Editors">
+ <topic label="Branch Manager" href="reference/branch_manager_view.html">
+ <topic label="Default Branch" href="reference/default_branch.html" />
+ <topic label="Favorite Branch" href="reference/favorite_branch.html" />
+ <topic label="Filtering" href="reference/branch_filtering.html" />
+ <topic label="Show Change Report" href="reference/show_change_report.html" />
+ </topic>
+ <topic label="Change Report" href="reference/change_table.html">
+ <topic label="Refresh" href="reference/refresh_change_report.html" />
+ </topic>
+ <topic label="Quick Search" href="reference/quickSearch/quick_search_view.html" >
+ <topic label="Attribute Tagging for Quick Search" href="reference/quickSearch/attribute_tagging.html" />
+ <topic label="Attribute Type Filter Search Option" href="reference/quickSearch/attribute_type_filter_option.html" />
+ <topic label="By Id Search Option" href="reference/quickSearch/by_id_option.html" />
+ <topic label="Include Deleted Search Option" href="reference/quickSearch/include_deleted_option.html" />
+ <topic label="Word Order Match Search Option" href="reference/quickSearch/word_order_match_option.html" />
+ <topic label="All Match Locations Search Option" href="reference/quickSearch/all_match_locations_option.html" />
+ </topic>
+ </topic>
+ <topic href="reference/mass_artifact_editor.html" label="Mass Editor" />
+ <topic href="reference/Merge_Manager.html" label="Merge Manager" />
+ <topic label="Table Customization">
+ <topic label="Table Customization" href="reference/table_customization.html" />
+ </topic>
+ <topic label="Spell Checking">
+ <topic label="Spell Checking" href="reference/spell_check.html" />
+ </topic>
+ <topic label="OSEE Branching and Differences Diagrams">
+ <topic label="OSEE Branching and Differences Diagrams" href="reference/osee_branching.html" />
+ </topic>
+</toc>
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/spell_check.gif b/org.eclipse.osee.framework.ui.skynet/reference/spell_check.gif
new file mode 100644
index 00000000000..51299b49c03
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/spell_check.gif
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/spell_check.html b/org.eclipse.osee.framework.ui.skynet/reference/spell_check.html
new file mode 100644
index 00000000000..c3f73125701
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/spell_check.html
@@ -0,0 +1,40 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>OSEE Spell Checking</title>
+ </head>
+
+ <body>
+ <h1>OSEE Spell Checking</h1>
+ <br/>
+ <img src="spell_check.jpg"/>
+ <h2>Purpose</h2>
+ Enable data entered in OSEE to be spell checked.
+ <h2>How to do it</h2>
+ As data is entered into OSEE spell-checked fields, a blue line will be displayed if the word is not recognized.
+ Only lower-case words or words with only first character uppercase will be spell checked. Acronyms, words with
+ special characters, numbers and single letter words will be ignored.
+ <h2>Main Dictionary</h2>
+ OSEE has a main dictionary included in it's release. See below for it's source, copyrights and credits.
+ <h2>Additional Released Dictionaries</h2>
+ Additionally dictionaries can be added to OSEE via extension points. These can only be
+ modified by hand and thus included in normal release cycle.
+ <h2>Run-time Global Dictionary</h2>
+ Each OSEE user is able to add words to a Global dictionary stored in the database by right-clicking on the word
+ underlined in blue and selecting to save global. These words are stored in the "Global Preferences" artifact
+ and will then be shown as a valid word in all users's spell checking.
+ <h2>Run-time Personal Dictionary</h2>
+ Each OSEE user is able to add words to their Personal dictionary stored in the database by right-clicking on the word
+ underlined in blue and selecting to save personal. These words are stored in the user's "User" artifact
+ and will then be shown as a valid word only for that user.
+ <br>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/spell_check.jpg b/org.eclipse.osee.framework.ui.skynet/reference/spell_check.jpg
new file mode 100644
index 00000000000..45ca168e383
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/spell_check.jpg
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/table_customization.html b/org.eclipse.osee.framework.ui.skynet/reference/table_customization.html
new file mode 100644
index 00000000000..984444f7779
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/table_customization.html
@@ -0,0 +1,61 @@
+<html>
+<!--
+ Copyright (c) 2004, 2007 Boeing.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+ Contributors:
+ Boeing - initial API and implementation
+-->
+ <head>
+ <title>Table Customization</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Table Customization</h1>
+ <h2>Purpose</h2>
+ <p>Customize the table to show desired columns, widths with specified sorting and filters. Enables loading of
+ both personal and global customizations and provides the ability to select a customization as the
+ default customization to be loaded upon startup.</p>
+ <h2>Select Customization</h2>
+ <p>Lists current personal and global customizations to be selected from. Double-click to automatically
+ load selected customizationa and close dialog.</p>
+ <ul>
+ <li>"-- Table Default --" - Show the default customization for this table.</li>
+ <li>"-- Current --" - Show the current customization as set from table alterations.</li>
+ <li>"Other" - Shows a stored customization available for loading.</li>
+ </ul>
+ <h2>Select Customization - Icons / Overlays</h2>
+ <ul>
+ <li><img src="../images/customize.gif"/> Customization.</li>
+ <li><img src="../images/customizeD.gif"/> Default customization loaded up restart.</li>
+ <li><img src="../images/customizeG.gif"/> Global customization available to all users.</li>
+ </ul>
+ <h2>Select Customization - Buttons</h2>
+ <ul>
+ <li>Load - Loads the currently selected customization.</li>
+ <li>Load+Close - Loads the selected customization and closes the dialog.</li>
+ <li>Set as Default - Sets the currently selected customization as the default to load upon restart.</li>
+ <li>Delete - Deletes the currently selected customization.</li>
+ </ul>
+ <h2>Configure Customization</h2>
+ <p>Allows for the selected customization to be configured, loaded and saved.</p>
+ <ul>
+ <li>Hidden Columns - Shows the columns that are available to be displays but configured as hidden.</li>
+ <li>Visible Columns - Show the columns that are configured to be displayed for this customization.</li>
+ <li>(x) - shows the currently configured width of the column</li>
+ <li>Sorter - xml representation of the column order to sort by</li>
+ <li>Text Filter - shows the configured text filter to be applied for this customization. Enter as string.</li>
+ <li></li>
+ </ul>
+ <h2>Configure Customization - Buttons</h2>
+ <ul>
+ <li>Load - Loads the configured customization.</li>
+ <li>Load+Close - Loads the configured customization and closes the dialog.</li>
+ <li>Rename - Allows the user to define an alternate name for the column.</li>
+ <li>Save - Saves the configured customization as personal or global (if permissions allow).</li>
+ </ul>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/reference/toc.xml b/org.eclipse.osee.framework.ui.skynet/reference/toc.xml
new file mode 100644
index 00000000000..2b535214797
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/reference/toc.xml
@@ -0,0 +1,3 @@
+<toc label="OSEE Application Framework">
+ <link toc="reference/skynet_toc.xml"/>
+</toc>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/ArtifactExtractor.exsd b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactExtractor.exsd
new file mode 100644
index 00000000000..0d8a13e0585
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactExtractor.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="ArtifactExtractor" name="ArtifactExtractor"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="ArtifactExtractor"/>
+ </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="ArtifactExtractor">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor"/>
+ </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.framework.ui.skynet/schema/ArtifactImageProvider.exsd b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactImageProvider.exsd
new file mode 100644
index 00000000000..dc50fba5301
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactImageProvider.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="ArtifactImageProvider" name="ArtifactImageProvider"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="ArtifactImageProvider"/>
+ </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="ArtifactImageProvider">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider:"/>
+ </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.framework.ui.skynet/schema/ArtifactRenderer.exsd b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactRenderer.exsd
new file mode 100644
index 00000000000..742b08199f5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactRenderer.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="ArtifactRenderer" name="ArtifactRenderer"/>
+ </appinfo>
+ <documentation>
+ Renderers are responsible for controlling the previewing, editing, and printing of artifacts for certain artifact types. If no ApplicableArtifactType&apos;s are specified then, the renderer implicitly applies to all artifact types.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="Renderer" minOccurs="1" maxOccurs="unbounded"/>
+ </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="Renderer">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn="osee.skynet.gui.render.IRenderer"/>
+ </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.framework.ui.skynet/schema/ArtifactRendererTemplate.exsd b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactRendererTemplate.exsd
new file mode 100644
index 00000000000..055f7d0ba6d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/ArtifactRendererTemplate.exsd
@@ -0,0 +1,119 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="ArtifactRendererTemplate" name="ArtifactRendererTemplate"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="Template" minOccurs="1" maxOccurs="unbounded"/>
+ </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="Template">
+ <complexType>
+ <attribute name="presentationType" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="templateFile" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="templateName" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/AttributeXWidgetProvider.exsd b/org.eclipse.osee.framework.ui.skynet/schema/AttributeXWidgetProvider.exsd
new file mode 100644
index 00000000000..953ae40cc4d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/AttributeXWidgetProvider.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="AttributeXWidgetProvider" name="AttributeXWidgetProvider"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="AttributeXWidgetProvider"/>
+ </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="AttributeXWidgetProvider">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.ui.skynet.widgets.workflow.IAttributeXWidgetProvider"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/BlamOperation.exsd b/org.eclipse.osee.framework.ui.skynet/schema/BlamOperation.exsd
new file mode 100644
index 00000000000..7ac6051f663
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/BlamOperation.exsd
@@ -0,0 +1,112 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="BlamOperation" name="BlamOperation"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="Operation"/>
+ </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="Operation">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="osee.skynet.gui.blam.BlamOperation"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="usageHtmlFile" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/DatabaseHealthOperation.exsd b/org.eclipse.osee.framework.ui.skynet/schema/DatabaseHealthOperation.exsd
new file mode 100644
index 00000000000..1f746b6c4c2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/DatabaseHealthOperation.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="DatabaseHealthOperation" name="DatabaseHealthOperation"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="DatabaseHealthOperation"/>
+ </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="DatabaseHealthOperation">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation:"/>
+ </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.framework.ui.skynet/schema/IgnorePublishAttribute.exsd b/org.eclipse.osee.framework.ui.skynet/schema/IgnorePublishAttribute.exsd
new file mode 100644
index 00000000000..72cd84a8c62
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/IgnorePublishAttribute.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="IgnorePublishAttribute" name="IgnorePublishAttribute"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="attribute"/>
+ </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="attribute">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/OseeDictionary.exsd b/org.eclipse.osee.framework.ui.skynet/schema/OseeDictionary.exsd
new file mode 100644
index 00000000000..1bfb361e781
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/OseeDictionary.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="OseeDictionary" name="OseeDictionary"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="OseeDictionary" minOccurs="1" maxOccurs="unbounded"/>
+ </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="OseeDictionary">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="osee.skynet.gui.util.IOseeDictionary"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/SimpleTemplateProviderTemplate.exsd b/org.eclipse.osee.framework.ui.skynet/schema/SimpleTemplateProviderTemplate.exsd
new file mode 100644
index 00000000000..bdccba34134
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/SimpleTemplateProviderTemplate.exsd
@@ -0,0 +1,120 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="SimpleTemplateProviderTemplate" name="SimpleTemplateProviderTemplate"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="Template"/>
+ </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="Template">
+ <complexType>
+ <sequence>
+ <element ref="MatchCriteria" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="File" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="MatchCriteria">
+ <complexType>
+ <attribute name="match" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/TemplateProvider.exsd b/org.eclipse.osee.framework.ui.skynet/schema/TemplateProvider.exsd
new file mode 100644
index 00000000000..1a2c46c1dcc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/TemplateProvider.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.skynet.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.skynet.core" id="TemplateProvider" name="TemplateProvider"/>
+ </appInfo>
+ <documentation>
+ Contributions to this extension point must implement ITemplateProvider.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="TemplateProvider"/>
+ </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="TemplateProvider">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.skynet.core.word.ITemplateProvider"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/WordMlProducer.exsd b/org.eclipse.osee.framework.ui.skynet/schema/WordMlProducer.exsd
new file mode 100644
index 00000000000..c567ccdbc4c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/WordMlProducer.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="WordMlProducer" name="WordMlProducer"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="producer"/>
+ </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="producer">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="osee.skynet.gui.render.word.IWordMlProducer"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/WordOutlineContentHandler.exsd b/org.eclipse.osee.framework.ui.skynet/schema/WordOutlineContentHandler.exsd
new file mode 100644
index 00000000000..852fb30bc43
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/WordOutlineContentHandler.exsd
@@ -0,0 +1,119 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="WordOutlineContentHandler" name="WordOutlineContentHandler"/>
+ </appInfo>
+ <documentation>
+ Allows plugins to contribute a handler for use when parsing WordML as an outline. This way implementation specific actions can be taken to handle what content comes in as seperate artifacts, and how the content is split among attributes. All extension points available are presented to the user to select from upon import.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="Handler"/>
+ </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="Handler">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="osee.skynet.gui.Import.IWordOutlineContentHandler"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/WorkDefinitionProvider.exsd b/org.eclipse.osee.framework.ui.skynet/schema/WorkDefinitionProvider.exsd
new file mode 100644
index 00000000000..eaa7f4567eb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/WorkDefinitionProvider.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="WorkDefinitionProvider" name="WorkDefinitionProvider"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="WorkDefinitionProvider"/>
+ </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="WorkDefinitionProvider">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.ui.skynet.widgets.workflow.IWorkDefinitionProvider"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/schema/XWidgetProvider.exsd b/org.eclipse.osee.framework.ui.skynet/schema/XWidgetProvider.exsd
new file mode 100644
index 00000000000..6f9c88a6b51
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/schema/XWidgetProvider.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.ui.skynet">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.ui.skynet" id="XWidgetProvider" name="XWidgetProvider"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="XWidgetProvider"/>
+ </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="XWidgetProvider">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AdminContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AdminContributionItem.java
new file mode 100644
index 00000000000..a6dbddf7df6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AdminContributionItem.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.framework.ui.skynet;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AdminContributionItem extends OseeContributionItem {
+
+ private static final String ID = "ats.admin";
+
+ private static String ENABLED_TOOLTIP = "AtsAdmin";
+ private static String DISABLED_TOOLTIP = "";
+
+ private AdminContributionItem() {
+ super(ID);
+ init();
+ }
+
+ private void init() {
+ updateStatus(true);
+ }
+
+ public static void addTo(IStatusLineManager manager) {
+ boolean wasFound = false;
+ for (IContributionItem item : manager.getItems()) {
+ if (item instanceof AdminContributionItem) {
+ wasFound = true;
+ break;
+ }
+ }
+ if (!wasFound) {
+ manager.add(new AdminContributionItem());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledImage()
+ */
+ @Override
+ protected Image getDisabledImage() {
+ return ImageManager.getImage(FrameworkImage.EXCLAIM_RED);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledToolTip()
+ */
+ @Override
+ protected String getDisabledToolTip() {
+ return DISABLED_TOOLTIP;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledImage()
+ */
+ @Override
+ protected Image getEnabledImage() {
+ return ImageManager.getImage(FrameworkImage.EXCLAIM_RED);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledToolTip()
+ */
+ @Override
+ protected String getEnabledToolTip() {
+ return ENABLED_TOOLTIP;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AlphabeticalRelationComparator.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AlphabeticalRelationComparator.java
new file mode 100644
index 00000000000..2e7969c3248
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AlphabeticalRelationComparator.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.skynet;
+
+import java.util.Comparator;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AlphabeticalRelationComparator implements Comparator<RelationLink> {
+ private final RelationSide relationSide;
+
+ /**
+ * @param relationSide
+ */
+ public AlphabeticalRelationComparator(RelationSide relationSide) {
+ super();
+ this.relationSide = relationSide;
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public int compare(RelationLink relationLink1, RelationLink relationLink2) {
+ try {
+ return relationLink1.getArtifact(relationSide).compareTo(relationLink2.getArtifact(relationSide));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return 0;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactContentProvider.java
new file mode 100644
index 00000000000..d6370f82e06
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactContentProvider.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.framework.ui.skynet;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactChangeListener;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+
+/**
+ * The basis for the comments in this class can be found at
+ * http://www.eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
+ *
+ * @author Ryan D. Brooks
+ */
+public class ArtifactContentProvider implements ITreeContentProvider, ArtifactChangeListener {
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ protected TreeViewer viewer;
+
+ /*
+ * @see IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /**
+ * Notifies this content provider that the given viewer's input has been switched to a different element.
+ * <p>
+ * A typical use for this method is registering the content provider as a listener to changes on the new input (using
+ * model-specific means), and deregistering the viewer from the old input. In response to these change notifications,
+ * the content provider propagates the changes to the viewer.
+ * </p>
+ *
+ * @param viewer the viewer
+ * @param oldInput the old input element, or <code>null</code> if the viewer did not previously have an input
+ * @param newInput the new input element, or <code>null</code> if the viewer does not have an input
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * The tree viewer calls its content provider&#8217;s getChildren method when it needs to create or display the child
+ * elements of the domain object, <b>parent </b>. This method should answer an array of domain objects that represent
+ * the unfiltered children of <b>parent </b>
+ *
+ * @see ITreeContentProvider#getChildren(Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Artifact) {
+ Artifact parentItem = (Artifact) parentElement;
+
+ try {
+ if (AccessControlManager.checkObjectPermission(parentItem, PermissionEnum.READ)) {
+ Collection<Artifact> children = parentItem.getChildren();
+ if (children != null) {
+ return children.toArray();
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+
+ return EMPTY_ARRAY;
+ }
+
+ /*
+ * @see ITreeContentProvider#getParent(Object)
+ */
+ public Object getParent(Object element) {
+ if (element instanceof Artifact) {
+ try {
+ return ((Artifact) element).getParent();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * The tree viewer asks its content provider if the domain object represented by <b>element </b> has any children.
+ * This method is used by the tree viewer to determine whether or not a plus or minus should appear on the tree
+ * widget.
+ *
+ * @see ITreeContentProvider#hasChildren(Object)
+ */
+ public boolean hasChildren(Object element) {
+ /*
+ * If the item is an artifact, then use it's optimized check. If it is not an artifact, then
+ * resort to asking the general children
+ */
+ if (element instanceof Artifact) {
+ Artifact artifact = (Artifact) element;
+ try {
+ if (AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ if (artifact.isDeleted()) return false;
+ return artifact.getRelatedArtifactsCount(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD) > 0;
+ } else {
+ return false;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ // Assume it has children if an error happens
+ return true;
+ }
+ } else {
+ return getChildren(element).length > 0;
+ }
+ }
+
+ /**
+ * This is the method invoked by calling the <b>setInput </b> method on the tree viewer. In fact, the <b>getElements
+ * </b> method is called only in response to the tree viewer's <b>setInput </b> method and should answer with the
+ * appropriate domain objects of the inputElement. The <b>getElements </b> and <b>getChildren </b> methods operate in
+ * a similar way. Depending on your domain objects, you may have the <b>getElements </b> simply return the result of
+ * calling <b>getChildren </b>. The two methods are kept distinct because it provides a clean way to differentiate
+ * between the root domain object and all other domain objects.
+ *
+ * @see IStructuredContentProvider#getElements(Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDecorator.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDecorator.java
new file mode 100644
index 00000000000..23510b4d765
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDecorator.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.framework.ui.skynet;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.IBranchProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ShowAttributeAction;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactDecorator {
+
+ private Action showArtIds;
+ private Action showArtType;
+ private Action showArtVersion;
+ private ShowAttributeAction attributesAction;
+ private StructuredViewer viewer;
+ private final String preferenceKey;
+
+ public ArtifactDecorator(StructuredViewer viewer, String preferenceKey) {
+ this.viewer = viewer;
+ this.preferenceKey = preferenceKey;
+ }
+
+ public ArtifactDecorator(String preferenceKey) {
+ this.viewer = null;
+ this.preferenceKey = preferenceKey;
+ }
+
+ public void setViewer(StructuredViewer viewer) {
+ this.viewer = viewer;
+ if (attributesAction != null) {
+ attributesAction.setViewer(viewer);
+ }
+ }
+
+ private void checkActionsCreated(IBranchProvider branchProvider) {
+ if (showArtType == null) {
+ showArtType = new Action("Show Artifact Type") {
+ @Override
+ public void run() {
+ setChecked(!isChecked());
+ updateShowArtTypeText();
+ viewer.refresh();
+ }
+ };
+ showArtType.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.FILTERS));
+ }
+ if (showArtVersion == null) {
+ showArtVersion = new Action("Show Artifact Version") {
+ @Override
+ public void run() {
+ setChecked(!isChecked());
+ updateShowArtVersionText();
+ viewer.refresh();
+ }
+ };
+ showArtVersion.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.FILTERS));
+ }
+
+ if (attributesAction == null) {
+ attributesAction = new ShowAttributeAction(branchProvider, viewer, preferenceKey);
+ }
+
+ if (showArtIds == null && isAdmin()) {
+ showArtIds = new Action("Show Artifact Ids") {
+ @Override
+ public void run() {
+ setChecked(!isChecked());
+ updateShowArtIdText();
+ viewer.refresh();
+ }
+ };
+ showArtIds.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.FILTERS));
+ }
+ }
+
+ private boolean isAdmin() {
+ boolean result = false;
+ try {
+ if (AccessControlManager.isOseeAdmin()) {
+ result = true;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ result = false;
+ }
+ return result;
+ }
+
+ public void addActions(IMenuManager manager, IBranchProvider provider) {
+ checkActionsCreated(provider);
+
+ manager.add(showArtVersion);
+ manager.add(showArtType);
+ updateShowArtTypeText();
+ updateShowArtVersionText();
+
+ if (showArtIds != null && isAdmin()) {
+ manager.add(showArtIds);
+ updateShowArtIdText();
+ }
+ manager.add(attributesAction);
+ }
+
+ private void updateShowArtIdText() {
+ showArtIds.setText((showArtIds.isChecked() ? "Hide" : "Show") + " Artifact Ids");
+ }
+
+ private void updateShowArtTypeText() {
+ showArtType.setText((showArtType.isChecked() ? "Hide" : "Show") + " Artifact Type");
+ }
+
+ private void updateShowArtVersionText() {
+ showArtVersion.setText((showArtVersion.isChecked() ? "Hide" : "Show") + " Artifact Version");
+ }
+
+ public String getSelectedAttributeData(Artifact artifact) throws Exception {
+ return attributesAction != null ? attributesAction.getSelectedAttributeData(artifact) : "";
+ }
+
+ public boolean showArtIds() {
+ return showArtIds != null && showArtIds.isChecked();
+ }
+
+ public boolean showArtType() {
+ return showArtType != null && showArtType.isChecked();
+ }
+
+ public boolean showArtVersion() {
+ return showArtVersion != null && showArtVersion.isChecked();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDescriptorDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDescriptorDialog.java
new file mode 100644
index 00000000000..84334a12dd9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDescriptorDialog.java
@@ -0,0 +1,358 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.Collection;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IconAndMessageDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.ui.plugin.util.ObjectList;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+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;
+
+public class ArtifactDescriptorDialog extends IconAndMessageDialog {
+ public final static int NONE = 0;
+ public final static int ERROR = 1;
+ public final static int INFORMATION = 2;
+ public final static int QUESTION = 3;
+ public final static int WARNING = 4;
+ private String[] buttonLabels;
+ private Button[] buttons;
+ private int defaultButtonIndex;
+ private String title;
+ private Image titleImage;
+ private Image image = null;
+ private Label errorLabel;
+ private Composite composite;
+ private Collection<ArtifactType> descriptors;
+ private ObjectList<ArtifactType> descriptorsList;
+ private ArtifactType entry = null;
+ String textField = "";
+ String validationRegularExpression = null;
+ String validationErrorString = "";
+
+ /**
+ * The custom dialog area.
+ */
+ private Control customArea;
+
+ /**
+ * Create a message dialog. Note that the dialog will have no visual representation (no widgets) until it is told to
+ * open.
+ * <p>
+ * The labels of the buttons to appear in the button bar are supplied in this constructor as an array. The
+ * <code>open</code> method will return the index of the label in this array corresponding to the button that was
+ * pressed to close the dialog. If the dialog was dismissed without pressing a button (ESC, etc.) then -1 is
+ * returned. Note that the <code>open</code> method blocks.
+ * </p>
+ *
+ * @param parentShell the parent shell
+ * @param dialogTitle the dialog title, or <code>null</code> if none
+ * @param dialogTitleImage the dialog title image, or <code>null</code> if none
+ * @param dialogMessage the dialog message
+ * @param dialogImageType one of the following values:
+ * <ul>
+ * <li><code>MessageDialog.NONE</code> for a dialog with no image</li>
+ * <li><code>MessageDialog.ERROR</code> for a dialog with an error image</li>
+ * <li><code>MessageDialog.INFORMATION</code> for a dialog with an information image</li>
+ * <li><code>MessageDialog.QUESTION </code> for a dialog with a question image</li>
+ * <li><code>MessageDialog.WARNING</code> for a dialog with a warning image</li>
+ * </ul>
+ * @param dialogButtonLabels an array of labels for the buttons in the button bar
+ * @param defaultIndex the index in the button label array of the default button
+ */
+ public ArtifactDescriptorDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex, Collection<ArtifactType> descriptors) {
+ super(parentShell);
+ this.title = dialogTitle;
+ this.titleImage = dialogTitleImage;
+ this.message = dialogMessage;
+ switch (dialogImageType) {
+ case ERROR: {
+ this.image = parentShell.getDisplay().getSystemImage(SWT.ICON_ERROR);
+ break;
+ }
+ case INFORMATION: {
+ this.image = parentShell.getDisplay().getSystemImage(SWT.ICON_INFORMATION);
+ break;
+ }
+ case QUESTION: {
+ this.image = parentShell.getDisplay().getSystemImage(SWT.ICON_QUESTION);
+ break;
+ }
+ case WARNING: {
+ this.image = parentShell.getDisplay().getSystemImage(SWT.ICON_WARNING);
+ break;
+ }
+ }
+ this.buttonLabels = dialogButtonLabels;
+ this.defaultButtonIndex = defaultIndex;
+ this.descriptors = descriptors;
+ }
+
+ public void setSelectionListener(SelectionListener listener) {
+ for (int i = 0; i < buttons.length; i++) {
+ Button button = buttons[i];
+ button.addSelectionListener(listener);
+ }
+ }
+
+ /**
+ * Calling will enable dialog to loose focus
+ */
+ public void setModeless() {
+ setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS);
+ setBlockOnOpen(false);
+ }
+
+ /**
+ * override this method to make own checks on entry this will be called with every keystroke
+ *
+ * @return true if entry is valid
+ */
+ public boolean isEntryValid() {
+ if (validationRegularExpression == null) {
+ return true;
+ }
+ return true;
+ }
+
+ public void setValidationRegularExpression(String regExp) {
+ validationRegularExpression = regExp;
+ }
+
+ public void setValidationErrorString(String errorText) {
+ validationErrorString = errorText;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Dialog.
+ */
+ protected void buttonPressed(int buttonId) {
+ setReturnCode(buttonId);
+ close();
+ }
+
+ /*
+ * (non-Javadoc) Method declared in Window.
+ */
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ if (title != null) shell.setText(title);
+ if (titleImage != null) shell.setImage(titleImage);
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Dialog.
+ */
+ protected void createButtonsForButtonBar(Composite parent) {
+ buttons = new Button[buttonLabels.length];
+ for (int i = 0; i < buttonLabels.length; i++) {
+ String label = buttonLabels[i];
+ Button button = createButton(parent, i, label, defaultButtonIndex == i);
+ buttons[i] = button;
+ }
+ updateButtons();
+ }
+
+ /**
+ * Creates and returns the contents of an area of the dialog which appears below the message and above the button
+ * bar.
+ * <p>
+ * The default implementation of this framework method returns <code>null</code>. Subclasses may override.
+ * </p>
+ *
+ * @param parent parent composite to contain the custom area
+ * @return Control custom area control, or <code>null</code>
+ */
+ protected Control createCustomArea(Composite parent) {
+ return null;
+ }
+
+ /**
+ * This implementation of the <code>Dialog</code> framework method creates and lays out a composite and calls
+ * <code>createMessageArea</code> and <code>createCustomArea</code> to populate it. Subclasses should override
+ * <code>createCustomArea</code> to add contents below the message.
+ */
+ protected Control createDialogArea(Composite parent) {
+
+ // create message area
+ createMessageArea(parent);
+
+ // create the top level composite for the dialog area
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ composite.setLayout(layout);
+
+ // Create error label
+ errorLabel = new Label(composite, SWT.NONE);
+ errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ errorLabel.setText("");
+
+ new Label(composite, SWT.NULL).setText("Select artifact descriptor:");
+ descriptorsList = new ObjectList<ArtifactType>(composite, SWT.BORDER | SWT.READ_ONLY | SWT.SCROLL_PAGE);
+ descriptorsList.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, true));
+
+ if (descriptors != null) {
+ for (ArtifactType descriptor : descriptors) {
+ descriptorsList.add(descriptor, descriptor.getName());
+ }
+ descriptorsList.select(0);
+ }
+
+ descriptorsList.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ updateButtons();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+ descriptorsList.setFocus();
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.horizontalSpan = 2;
+
+ composite.setLayoutData(data);
+ composite.setFont(parent.getFont());
+
+ // allow subclasses to add custom controls
+ customArea = createCustomArea(composite);
+
+ // If it is null create a dummy label for spacing purposes
+ if (customArea == null) customArea = new Label(composite, SWT.NULL);
+ return composite;
+ }
+
+ private void updateButtons() {
+ if (descriptorsList != null) {
+ entry = descriptorsList.getSelectedItem();
+
+ if (entry == null || !isEntryValid()) {
+ buttons[defaultButtonIndex].setEnabled(false);
+ errorLabel.setText(validationErrorString);
+ errorLabel.update();
+ composite.layout();
+ } else {
+ buttons[defaultButtonIndex].setEnabled(true);
+ errorLabel.setText("");
+ errorLabel.update();
+ composite.layout();
+ }
+ }
+ }
+
+ /**
+ * Gets a button in this dialog's button bar.
+ *
+ * @param index the index of the button in the dialog's button bar
+ * @return a button in the dialog's button bar
+ */
+ protected Button getButton(int index) {
+ return buttons[index];
+ }
+
+ /**
+ * Returns the minimum message area width in pixels This determines the minimum width of the dialog.
+ * <p>
+ * Subclasses may override.
+ * </p>
+ *
+ * @return the minimum message area width (in pixels)
+ */
+ protected int getMinimumMessageWidth() {
+ return convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Dialog. Sets a return code of -1 since none of the dialog
+ * buttons were pressed to close the dialog.
+ */
+ protected void handleShellCloseEvent() {
+ super.handleShellCloseEvent();
+ setReturnCode(-1);
+ }
+
+ /**
+ * Convenience method to open a simple confirm (OK/Cancel) dialog.
+ *
+ * @param parent the parent shell of the dialog, or <code>null</code> if none
+ * @param title the dialog's title, or <code>null</code> if none
+ * @param message the message
+ * @return <code>true</code> if the user presses the OK button, <code>false</code> otherwise
+ */
+ public static boolean openTextEntry(Shell parent, String title, String message) {
+ MessageDialog dialog = new MessageDialog(parent, title, null,
+ // accept the default window icon
+ message, QUESTION, new String[] {IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL}, 0);
+ // OK is the default
+ return dialog.open() == 0;
+ }
+
+ public ArtifactType getEntry() {
+ return entry;
+ }
+
+ public String getTextField() {
+ return textField;
+ }
+
+ public void setEntry(String entry) {
+ // text.setText(entry);
+ }
+
+ /*
+ * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int,
+ * java.lang.String, boolean)
+ */
+ protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
+
+ Button button = super.createButton(parent, id, label, defaultButton);
+ // Be sure to set the focus if the custom area cannot so as not
+ // to lose the defaultButton.
+ if (defaultButton && !customShouldTakeFocus()) button.setFocus();
+ return button;
+ }
+
+ /**
+ * Return whether or not we should apply the workaround where we take focus for the default button or if that should
+ * be determined by the dialog. By default only return true if the custom area is a label or CLabel that cannot take
+ * focus.
+ *
+ * @return boolean
+ */
+ protected boolean customShouldTakeFocus() {
+ if (customArea instanceof Label) return false;
+
+ if (customArea instanceof CLabel) return (customArea.getStyle() & SWT.NO_FOCUS) > 0;
+
+ return true;
+ }
+
+ /*
+ * @see IconAndMessageDialog#getImage()
+ */
+ public Image getImage() {
+ return image;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDoubleClick.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDoubleClick.java
new file mode 100644
index 00000000000..3b6838334cc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDoubleClick.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.framework.ui.skynet;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactDoubleClick implements IDoubleClickListener {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+ */
+ public void doubleClick(DoubleClickEvent event) {
+ openArtifact(event.getSelection());
+ }
+
+ public static void openArtifact(ISelection selection) {
+ IStructuredSelection structSel = (IStructuredSelection) selection;
+ Object object = structSel.getFirstElement();
+ Artifact artifact = null;
+ if (object instanceof Artifact) {
+ artifact = (Artifact) structSel.getFirstElement();
+ } else if (object instanceof Match) {
+ Match match = (Match) object;
+
+ if (match.getElement() instanceof Artifact) {
+ artifact = (Artifact) match.getElement();
+ }
+ }
+
+ if (artifact == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, "The artifact associated with the double-click was null");
+ } else {
+ try {
+ if (AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(1);
+ artifacts.add(artifact);
+
+ if (StaticIdManager.hasValue(UserManager.getUser(),
+ EditorsPreferencePage.PreviewOnDoubleClickForWordArtifacts)) {
+ RendererManager.previewInJob(artifact);
+ } else {
+ RendererManager.openInJob(artifact, PresentationType.GENERALIZED_EDIT);
+ }
+
+ } else {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "The user " + UserManager.getUser() + " does not have read access to " + artifact);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDragDropSupport.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDragDropSupport.java
new file mode 100644
index 00000000000..9e33c48f821
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactDragDropSupport.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.WorkspaceURL;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeSide;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.relation.explorer.RelationExplorerWindow;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public class ArtifactDragDropSupport {
+
+ public static void performDragDrop(DropTargetEvent e, RelationExplorerWindow window, Shell shell) {
+ performDragDrop(e, null, window, shell);
+ }
+
+ public static void performDragDrop(DropTargetEvent e, Artifact[] artifacts, RelationExplorerWindow window, Shell shell) {
+
+ if (ArtifactTransfer.getInstance().isSupportedType(e.currentDataType)) {
+
+ if (artifacts != null)
+ addArtifacts(artifacts, window);
+ else {
+ ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(e.currentDataType);
+ addArtifacts(artData.getArtifacts(), window);
+ }
+ } else if (e.data instanceof String[]) {
+ addFiles((String[]) e.data, window, shell);
+
+ } else if (e.data instanceof String) {
+ addURL((String) e.data, window, shell);
+ }
+ }
+
+ private static void ensureLinkValidity(RelationTypeSide group, Artifact artifact) throws OseeArgumentException {
+ RelationType relationType = group.getRelationType();
+ Artifact otherArtifact = group.getArtifact();
+
+ Artifact artifactA = group.getSide() == RelationSide.SIDE_A ? artifact : otherArtifact;
+ Artifact artifactB = group.getSide() == RelationSide.SIDE_A ? otherArtifact : artifact;
+ RelationManager.ensureRelationCanBeAdded(relationType, artifactA, artifactB);
+ }
+
+ private static void addArtifacts(Artifact[] artifacts, RelationExplorerWindow window) {
+ RelationTypeSide group = window.getRelationGroup();
+ RelationSide relationSide = group.getSide();
+ RelationType relationType = group.getRelationType();
+
+ try {
+ for (Artifact artifact : artifacts) {
+ try {
+ Artifact artA = null;
+ Artifact artB = null;
+ if (relationSide == RelationSide.SIDE_A) {
+ artA = artifact;
+ artB = group.getArtifact();
+ } else {
+ artA = group.getArtifact();
+ artB = artifact;
+ }
+ RelationManager.ensureRelationCanBeAdded(relationType, artA, artB);
+
+ window.addValid(artifact);
+ } catch (IllegalArgumentException ex) {
+ window.addInvalidArtifact(artifact, ex.getMessage());
+ }
+ }
+ } catch (OseeArgumentException ex) {
+ window.addInvalid("All", ex.getMessage());
+ }
+ }
+
+ private static void addFiles(String[] fileNames, RelationExplorerWindow window, Shell shell) {
+ RelationTypeSide group = window.getRelationGroup();
+ IFile iFile;
+ Artifact artifact;
+
+ for (int i = 0; i < fileNames.length; i++) {
+ iFile = AWorkspace.getIFile(fileNames[i]);
+ String location;
+
+ if (iFile == null) {
+ try {
+ location = new File(fileNames[i]).toURL().toString();
+ } catch (MalformedURLException e) {
+ window.addInvalid(fileNames[i], "Malformed URL exception: " + e.getMessage());
+ continue;
+ }
+ } else {
+ location = WorkspaceURL.getURL(iFile);
+ }
+
+ try {
+ artifact = getArtifactFromWorkspaceFile(location, shell);
+ } catch (Exception ex) {
+ window.addInvalid(location, "Runtime exception: " + ex.getMessage());
+ continue;
+ }
+
+ if (artifact == null) {
+ window.addInvalid(location, "Artifact has been cancelled");
+ } else {
+ try {
+ ensureLinkValidity(group, artifact);
+ window.addValid(artifact);
+ } catch (OseeArgumentException ex) {
+ window.addInvalid(artifact.getDescriptiveName(), ex.getMessage());
+ }
+
+ }
+ }
+ }
+
+ private static void addURL(String url, RelationExplorerWindow window, Shell shell) {
+ RelationTypeSide group = window.getRelationGroup();
+ Artifact artifact;
+ String location;
+
+ try {
+ location = new URL(url).toString();
+ } catch (MalformedURLException e) {
+ window.addInvalid(url, "Malformed Exception : " + e.getMessage());
+ return;
+ }
+
+ try {
+ artifact = getArtifactFromWorkspaceFile(location, shell);
+ } catch (Exception ex) {
+ window.addInvalid(location, "Runtime exception: " + ex.getMessage());
+ return;
+ }
+
+ if (artifact == null) {
+ window.addInvalid(location, "Artifact has been cancelled");
+ }
+ try {
+ ensureLinkValidity(group, artifact);
+ window.addValid(artifact);
+ } catch (OseeArgumentException ex) {
+ window.addInvalid(artifact.getDescriptiveName(), ex.getMessage());
+ }
+ }
+
+ public static Artifact getArtifactFromWorkspaceFile(String location, Shell shell) throws OseeCoreException {
+ Artifact artifact = null;
+ int descriptorSelected = -1;
+ ArtifactType descriptor = null;
+ ArtifactDescriptorDialog dialog = null;
+ Branch branch = BranchSelectionDialog.getBranchFromUser();
+ try {
+ artifact = ArtifactQuery.getArtifactFromAttribute("Content URL", location, branch);
+ } catch (ArtifactDoesNotExist ex) {
+ Collection<ArtifactType> descriptors =
+ TypeValidityManager.getArtifactTypesFromAttributeType("Content URL", branch);
+ dialog =
+ new ArtifactDescriptorDialog(
+ shell,
+ "Artifact Descriptor",
+ null,
+ "No Artifact could be found for this file. To create a new artifact please" + " select an artfact descriptor.",
+ MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0, descriptors);
+ descriptorSelected = dialog.open();
+ if (descriptorSelected == 0) {
+ descriptor = dialog.getEntry();
+ artifact = descriptor.makeNewArtifact(branch);
+ artifact.setSoleAttributeValue("Content URL", location);
+ artifact.setSoleAttributeValue("Name", new File(location).getName());
+ artifact.persistAttributes();
+ }
+ }
+
+ return artifact;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorer.java
new file mode 100644
index 00000000000..5774f633c49
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorer.java
@@ -0,0 +1,1503 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.IBranchProvider;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.event.AccessControlEventType;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IAccessControlEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData.ChangeType;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.SelectionCountChangeListener;
+import org.eclipse.osee.framework.ui.skynet.access.PolicyDialog;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener;
+import org.eclipse.osee.framework.ui.skynet.menu.ArtifactTreeViewerGlobalMenuHelper;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenu;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenuPermissions;
+import org.eclipse.osee.framework.ui.skynet.menu.IGlobalMenuHelper;
+import org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.search.QuickSearchView;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactClipboard;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetViews;
+import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ArtifactTypeFilteredTreeDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView;
+import org.eclipse.osee.framework.ui.swt.MenuItems;
+import org.eclipse.osee.framework.ui.swt.TreeViewerUtility;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.custom.TreeEditor;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ExportResourcesAction;
+import org.eclipse.ui.actions.ImportResourcesAction;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactExplorer extends ViewPart implements IRebuildMenuListener, IAccessControlEventListener, IRelationModifiedEventListener, IArtifactModifiedEventListener, IFrameworkTransactionEventListener, IBranchEventListener, IArtifactsPurgedEventListener, IArtifactsChangeTypeEventListener, IActionable, ISelectionProvider, IBranchProvider {
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.ArtifactExplorer";
+ private static final String ROOT_GUID = "artifact.explorer.last.root_guid";
+ private static final String ROOT_BRANCH = "artifact.explorer.last.root_branch";
+ private static final ArtifactClipboard artifactClipboard = new ArtifactClipboard(VIEW_ID);
+ private static final LinkedList<Tree> trees = new LinkedList<Tree>();
+
+ private TreeViewer treeViewer;
+ private Action upAction;
+ private Artifact exploreRoot;
+ private MenuItem openMenuItem;
+ private MenuItem massEditMenuItem;
+ private MenuItem skywalkerMenuItem;
+ private MenuItem createMenuItem;
+ private MenuItem openWithMenuItem;
+ private MenuItem accessControlMenuItem;
+ private MenuItem lockMenuItem;
+ private MenuItem goIntoMenuItem;
+ private MenuItem copyMenuItem;
+ private MenuItem pasteMenuItem;
+ private MenuItem renameArtifactMenuItem;
+ private MenuItem findOnAnotherBranch;
+ private NeedArtifactMenuListener needArtifactListener;
+ private NeedProjectMenuListener needProjectListener;
+ private Tree myTree;
+ private TreeEditor myTreeEditor;
+ private Text myTextBeingRenamed;
+ private Action newArtifactExplorer;
+ private Action collapseAllAction;
+ private Action showChangeReport;
+ private XBranchSelectWidget branchSelect;
+ private Branch branch;
+ IGlobalMenuHelper globalMenuHelper;
+
+ private Composite stackComposite;
+ private Control branchUnreadableWarning;
+ private StackLayout stackLayout;
+
+ public ArtifactExplorer() {
+ }
+
+ public static void explore(Collection<Artifact> artifacts) {
+ explore(artifacts, AWorkbench.getActivePage());
+ }
+
+ public static void explore(Collection<Artifact> artifacts, IWorkbenchPage page) {
+ Artifact sampleArtifact = null;
+ Branch inputBranch = null;
+ if (artifacts != null && !artifacts.isEmpty()) {
+ sampleArtifact = artifacts.iterator().next();
+ inputBranch = sampleArtifact.getBranch();
+ }
+ ArtifactExplorer artifactExplorer = findView(inputBranch, page);
+
+ artifactExplorer.setPartName("Artifacts");
+ artifactExplorer.setContentDescription("These artifacts could not be handled");
+ artifactExplorer.treeViewer.setInput(artifacts);
+ artifactExplorer.initializeSelectionBox();
+ }
+
+ private static ArtifactExplorer findView(Branch inputBranch, IWorkbenchPage page) {
+ for (IViewReference view : page.getViewReferences()) {
+ if (view.getId().equals(ArtifactExplorer.VIEW_ID)) {
+ if (view.getView(false) != null && inputBranch.equals(((ArtifactExplorer) view.getView(false)).branch)) {
+ try {
+ return (ArtifactExplorer) page.showView(view.getId(), view.getSecondaryId(),
+ IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ }
+ }
+ try {
+ ArtifactExplorer explorer =
+ (ArtifactExplorer) page.showView(ArtifactExplorer.VIEW_ID, new GUID().toString(),
+ IWorkbenchPage.VIEW_ACTIVATE);
+ explorer.explore(ArtifactQuery.getDefaultHierarchyRootArtifact(inputBranch));
+ return explorer;
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private Control createDefaultWarning(Composite parent) {
+ Composite composite = new Composite(parent, SWT.BORDER);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ Label image = new Label(composite, SWT.NONE);
+ image.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
+ image.setImage(ImageManager.getImage(FrameworkImage.LOCKED_NO_ACCESS));
+ image.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ Label label = new Label(composite, SWT.NONE);
+ Font font = new Font(PlatformUI.getWorkbench().getDisplay(), "Courier New", 10, SWT.BOLD);
+ label.setFont(font);
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED));
+ label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
+ label.setText("Branch Read Access Denied.\nContact your administrator.");
+ label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ return composite;
+ }
+
+ private void checkBranchReadable() throws OseeCoreException {
+ if (treeViewer == null) {
+ return;
+ }
+ Control control = branchUnreadableWarning;
+ if (branch == null || new GlobalMenuPermissions(globalMenuHelper).isBranchReadable(branch)) {
+ control = treeViewer.getTree();
+ }
+ stackLayout.topControl = control;
+ stackComposite.layout();
+ stackComposite.getParent().layout();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+
+ @Override
+ public void createPartControl(Composite parent) {
+ try {
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(parent)) return;
+
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 1000;
+ gridData.widthHint = 1000;
+
+ parent.setLayout(new GridLayout(1, false));
+ parent.setLayoutData(gridData);
+
+ branchSelect = new XBranchSelectWidget("");
+ branchSelect.setDisplayLabel(false);
+ branchSelect.setBranch(branch);
+ branchSelect.createWidgets(parent, 1);
+
+ branchSelect.addListener(new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ Branch selectedBranch = branchSelect.getData();
+ if (selectedBranch != null) {
+ branch = selectedBranch;
+ explore(ArtifactQuery.getDefaultHierarchyRootArtifact(branch));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+ });
+
+ stackComposite = new Composite(parent, SWT.NONE);
+ stackLayout = new StackLayout();
+ stackComposite.setLayout(stackLayout);
+ stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ branchUnreadableWarning = createDefaultWarning(stackComposite);
+
+ treeViewer = new TreeViewer(stackComposite);
+ myTree = treeViewer.getTree();
+ Tree tree = treeViewer.getTree();
+ treeViewer.setContentProvider(new ArtifactContentProvider());
+
+ ArtifactDecorator artifactDecorator =
+ new ArtifactDecorator(treeViewer, SkynetGuiPlugin.ARTIFACT_EXPLORER_ATTRIBUTES_PREF);
+ treeViewer.setLabelProvider(new ArtifactLabelProvider(artifactDecorator));
+ treeViewer.addDoubleClickListener(new ArtifactDoubleClick());
+ treeViewer.getControl().setLayoutData(gridData);
+
+ // We can not use the hash lookup because an artifact may not have a
+ // good equals.
+ // This can be added back once the content provider is converted over to
+ // use job node.
+ treeViewer.setUseHashlookup(false);
+
+ treeViewer.addSelectionChangedListener(new SelectionCountChangeListener(getViewSite()));
+ globalMenuHelper = new ArtifactTreeViewerGlobalMenuHelper(treeViewer);
+
+ createCollapseAllAction();
+ createUpAction();
+ createNewArtifactExplorerAction();
+ createShowChangeReportAction();
+ addOpenQuickSearchAction();
+
+ artifactDecorator.addActions(getViewSite().getActionBars().getMenuManager(), this);
+
+ getSite().setSelectionProvider(treeViewer);
+ addExploreSelection();
+
+ setupPopupMenu();
+
+ myTreeEditor = new TreeEditor(myTree);
+ myTreeEditor.horizontalAlignment = SWT.LEFT;
+ myTreeEditor.grabHorizontal = true;
+ myTreeEditor.minimumWidth = 50;
+
+ new ArtifactExplorerDragAndDrop(treeViewer, VIEW_ID, this);
+ parent.layout();
+
+ OseeAts.addBugToViewToolbar(this, this, SkynetGuiPlugin.getInstance(), VIEW_ID, "Artifact Explorer");
+
+ OseeContributionItem.addTo(this, false);
+ getViewSite().getActionBars().updateActionBars();
+
+ updateEnablementsEtAl();
+ trees.add(tree);
+ setHelpContexts();
+
+ checkBranchReadable();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ OseeEventManager.addListener(this);
+ }
+
+ /**
+ * Reveal an artifact in the viewer and select it.
+ *
+ * @param artifact TODO
+ */
+ public static void revealArtifact(Artifact artifact) {
+ try {
+ if (artifact.isDeleted()) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "The artifact " + artifact.getDescriptiveName() + " has been deleted.");
+ } else {
+ if (artifact.isHistorical()) {
+ artifact = ArtifactQuery.getArtifactFromId(artifact.getArtId(), artifact.getBranch(), false);
+ }
+ if (artifact.isOrphan()) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "The artifact " + artifact.getDescriptiveName() + " does not have a parent (orphan).");
+ } else {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ ArtifactExplorer artifactExplorer = findView(artifact.getBranch(), page);
+ artifactExplorer.treeViewer.setSelection(new StructuredSelection(artifact), true);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /**
+ * Reveal an artifact in the viewer and select it.
+ *
+ * @param artifact TODO
+ */
+ public static void exploreBranch(Branch branch) {
+ if (branch != null) {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ findView(branch, page);
+ }
+ }
+
+ public void setupPopupMenu() {
+
+ Menu popupMenu = new Menu(treeViewer.getTree().getParent());
+ needArtifactListener = new NeedArtifactMenuListener();
+ needProjectListener = new NeedProjectMenuListener();
+ popupMenu.addMenuListener(needArtifactListener);
+ popupMenu.addMenuListener(needProjectListener);
+
+ createOpenMenuItem(popupMenu);
+ createOpenWithMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createFindOnDifferentBranchItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createNewItemMenuItem(popupMenu);
+ createGoIntoMenuItem(popupMenu);
+ createMassEditMenuItem(popupMenu);
+ createSkywalkerMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ new GlobalMenu(popupMenu, globalMenuHelper);
+ createRenameArtifactMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createHistoryMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createImportExportMenuItems(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createLockMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createCopyMenuItem(popupMenu);
+ createPasteMenuItem(popupMenu);
+ createExpandAllMenuItem(popupMenu);
+ createSelectAllMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createAccessControlMenuItem(popupMenu);
+ treeViewer.getTree().setMenu(popupMenu);
+ }
+
+ private void addOpenQuickSearchAction() {
+ Action openQuickSearch =
+ new Action("Quick Search", ImageManager.getImageDescriptor(FrameworkImage.ARTIFACT_SEARCH)) {
+ @Override
+ public void run() {
+ try {
+ IViewPart viewPart =
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+ QuickSearchView.VIEW_ID);
+ if (viewPart != null) {
+ Branch branch = getBranch();
+ if (branch != null) {
+ ((QuickSearchView) viewPart).setBranch(branch);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+ openQuickSearch.setToolTipText("Opens Quick Search View");
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(openQuickSearch);
+ }
+
+ protected void createUpAction() {
+ upAction = new Action("View Parent") {
+ @Override
+ public void run() {
+ try {
+ Artifact parent = exploreRoot.getParent();
+
+ if (parent == null) return;
+
+ Object[] expanded = treeViewer.getExpandedElements();
+ Object[] expandedPlus = new Object[expanded.length + 1];
+ for (int i = 0; i < expanded.length; i++)
+ expandedPlus[i] = expanded[i];
+ expandedPlus[expandedPlus.length - 1] = exploreRoot;
+
+ explore(parent);
+
+ treeViewer.setExpandedElements(expandedPlus);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ upAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.ARROW_UP_YELLOW));
+ upAction.setToolTipText("View Parent");
+ updateEnablementsEtAl();
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(upAction);
+ }
+
+ private void createNewArtifactExplorerAction() {
+
+ newArtifactExplorer = new Action("New Artifact Explorer") {
+ @Override
+ public void run() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ ArtifactExplorer artifactExplorer;
+ try {
+ artifactExplorer =
+ (ArtifactExplorer) page.showView(ArtifactExplorer.VIEW_ID, GUID.generateGuidStr(),
+ IWorkbenchPage.VIEW_ACTIVATE);
+ artifactExplorer.explore(ArtifactQuery.getDefaultHierarchyRootArtifact(branch));
+ artifactExplorer.setExpandedArtifacts(treeViewer.getExpandedElements());
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ };
+
+ newArtifactExplorer.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.ARTIFACT_EXPLORER));
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(newArtifactExplorer);
+ }
+
+ private void createShowChangeReportAction() {
+ showChangeReport = new Action("Show Change Report") {
+ @Override
+ public void run() {
+ try {
+ ChangeView.open(branch);
+ } catch (OseeArgumentException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ }
+ };
+
+ showChangeReport.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BRANCH_CHANGE));
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(showChangeReport);
+ }
+
+ private void createCollapseAllAction() {
+
+ collapseAllAction = new Action("Collapse All") {
+ @Override
+ public void run() {
+ if (treeViewer != null) {
+ treeViewer.collapseAll();
+ }
+ }
+ };
+
+ collapseAllAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.COLLAPSE_ALL));
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(collapseAllAction);
+ }
+
+ private void createOpenWithMenuItem(Menu parentMenu) {
+ openWithMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ openWithMenuItem.setText("&Open With");
+ final Menu submenu = new Menu(openWithMenuItem);
+ openWithMenuItem.setMenu(submenu);
+ parentMenu.addMenuListener(new OpenWithMenuListener(submenu, treeViewer, this));
+ }
+
+ private void createNewItemMenuItem(Menu parentMenu) {
+ createMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ needProjectListener.add(createMenuItem);
+ createMenuItem.setText("&New Child");
+ createMenuItem.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ try {
+ Collection<ArtifactType> data = TypeValidityManager.getValidArtifactTypes(branchSelect.getData());
+ List<ArtifactType> descriptors = new ArrayList<ArtifactType>();
+ for (ArtifactType descriptor : new ArrayList<ArtifactType>(data)) {
+ if (!descriptor.getName().equals("Root Artifact")) {
+ descriptors.add(descriptor);
+ }
+ }
+ ArtifactTypeFilteredTreeDialog dialog =
+ new ArtifactTypeFilteredTreeDialog("New Child", "Select Artifact to Create", descriptors);
+
+ if (dialog.open() == 0) {
+
+ ArtifactType descriptor = dialog.getSelection();
+ EntryDialog ed =
+ new EntryDialog("New \"" + descriptor.getName() + "\" Artifact",
+ "Enter name for \"" + descriptor.getName() + "\" Artifact");
+ if (ed.open() != 0) return;
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> itemsIter = selection.iterator();
+ // If nothing was selected, then the child belongs at the root
+ if (!itemsIter.hasNext()) {
+ exploreRoot.addNewChild(descriptor, ed.getEntry()).persistAttributesAndRelations();
+ ;
+ } else {
+ while (itemsIter.hasNext()) {
+ ((Artifact) itemsIter.next()).addNewChild(descriptor, ed.getEntry()).persistAttributesAndRelations();
+ ;
+ }
+ }
+ treeViewer.refresh();
+ treeViewer.refresh(false);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ private void createGoIntoMenuItem(Menu parentMenu) {
+ goIntoMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ goIntoMenuItem.setText("&Go Into");
+ needArtifactListener.add(goIntoMenuItem);
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ goIntoMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> itemsIter = selection.iterator();
+ if (itemsIter.hasNext()) {
+ try {
+ Object[] expanded = treeViewer.getExpandedElements();
+ explore((Artifact) itemsIter.next());
+ treeViewer.setExpandedElements(expanded);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ });
+ }
+
+ private void createOpenMenuItem(Menu parentMenu) {
+ openMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ openMenuItem.setText("&Open");
+ needArtifactListener.add(openMenuItem);
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ openMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ LinkedList<Artifact> selectedItems = new LinkedList<Artifact>();
+ TreeViewerUtility.getPreorderSelection(treeViewer, selectedItems);
+ try {
+ if (StaticIdManager.hasValue(UserManager.getUser(),
+ EditorsPreferencePage.PreviewOnDoubleClickForWordArtifacts)) {
+ RendererManager.previewInJob(selectedItems);
+ } else {
+ RendererManager.openInJob(selectedItems, PresentationType.GENERALIZED_EDIT);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ private void createFindOnDifferentBranchItem(Menu parentMenu) {
+ findOnAnotherBranch = new MenuItem(parentMenu, SWT.PUSH);
+ findOnAnotherBranch.setText("Reveal On Another Branch");
+ needArtifactListener.add(findOnAnotherBranch);
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ findOnAnotherBranch.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ LinkedList<Artifact> selectedItems = new LinkedList<Artifact>();
+ TreeViewerUtility.getPreorderSelection(treeViewer, selectedItems);
+ Branch branch = BranchSelectionDialog.getBranchFromUser();
+ if (branch != null) {
+ for (Artifact artifact : selectedItems) {
+ try {
+ ArtifactExplorer.revealArtifact(ArtifactQuery.getArtifactFromId(artifact.getArtId(), branch));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, String.format(
+ "Could not find Artifact \'%s\' on Branch \'%s\'", artifact.getDescriptiveName(),
+ branch.getBranchName()));
+ }
+ }
+
+ }
+ }
+ });
+ }
+
+ private void createMassEditMenuItem(Menu parentMenu) {
+ massEditMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ massEditMenuItem.setText("Mass Edit");
+ needArtifactListener.add(massEditMenuItem);
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ massEditMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ LinkedList<Artifact> selectedItems = new LinkedList<Artifact>();
+ TreeViewerUtility.getPreorderSelection(treeViewer, selectedItems);
+ MassArtifactEditor.editArtifacts("", selectedItems);
+ }
+ });
+ }
+
+ private void createRenameArtifactMenuItem(Menu parentMenu) {
+ renameArtifactMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ renameArtifactMenuItem.setText("Rename Artifact");
+ needArtifactListener.add(renameArtifactMenuItem);
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ renameArtifactMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent mySelectionEvent) {
+ handleRenameArtifactSelectionEvent(mySelectionEvent);
+ }
+ });
+ }
+
+ private void handleRenameArtifactSelectionEvent(SelectionEvent mySelectionEvent) {
+ // Clean up any previous editor control
+ Control oldEditor = myTreeEditor.getEditor();
+
+ if (oldEditor != null) {
+ oldEditor.dispose();
+ }
+
+ // Identify the selected row, only allow input if there is a single
+ // selected row
+ TreeItem[] selection = myTree.getSelection();
+
+ if (selection.length != 1) {
+ return;
+ }
+
+ final TreeItem myTreeItem = selection[0];
+
+ if (myTreeItem == null) {
+ return;
+ }
+ myTextBeingRenamed = new Text(myTree, SWT.BORDER);
+ Object myTreeItemObject = myTreeItem.getData();
+ myTextBeingRenamed.setText(((Artifact) myTreeItemObject).getDescriptiveName());
+ myTextBeingRenamed.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ updateText(myTextBeingRenamed.getText(), myTreeItem);
+ myTextBeingRenamed.dispose();
+
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ }
+ });
+
+ myTextBeingRenamed.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if ((e.character == SWT.CR)) {
+ updateText(myTextBeingRenamed.getText(), myTreeItem);
+ myTextBeingRenamed.dispose();
+ } else if (e.keyCode == SWT.ESC) {
+ myTextBeingRenamed.dispose();
+ }
+ }
+ });
+ myTextBeingRenamed.selectAll();
+ myTextBeingRenamed.setFocus();
+ myTreeEditor.setEditor(myTextBeingRenamed, myTreeItem);
+ }
+
+ private void updateText(String newLabel, TreeItem item) {
+ myTreeEditor.getItem().setText(newLabel);
+ Object myTreeItemObject = item.getData();
+ if (myTreeItemObject instanceof Artifact) {
+ Artifact myArtifact = (Artifact) myTreeItemObject;
+ try {
+ myArtifact.setSoleAttributeValue("Name", newLabel);
+ myArtifact.persistAttributes();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ treeViewer.refresh();
+ }
+
+ private void createSkywalkerMenuItem(Menu parentMenu) {
+ skywalkerMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ skywalkerMenuItem.setText("Sky Walker");
+ needArtifactListener.add(skywalkerMenuItem);
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ skywalkerMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ LinkedList<Artifact> selectedItems = new LinkedList<Artifact>();
+ TreeViewerUtility.getPreorderSelection(treeViewer, selectedItems);
+ SkyWalkerView.exploreArtifact(selectedItems.getFirst());
+ }
+ });
+ }
+
+ private void createSelectAllMenuItem(Menu parentMenu) {
+ MenuItem menuItem = new MenuItem(parentMenu, SWT.PUSH);
+ menuItem.setText("&Select All\tCtrl+A");
+ menuItem.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ treeViewer.getTree().selectAll();
+ }
+ });
+ }
+
+ private void createHistoryMenuItem(Menu parentMenu) {
+ MenuItem revisionMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ revisionMenuItem.setText("&Show Resource History ");
+ revisionMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Artifact selectedArtifact = (Artifact) selection.getFirstElement();
+
+ try {
+ HistoryView.open(selectedArtifact);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ private void createImportExportMenuItems(Menu parentMenu) {
+ MenuItems.createMenuItem(parentMenu, SWT.PUSH, new ImportResourcesAction(getViewSite().getWorkbenchWindow()));
+ MenuItems.createMenuItem(parentMenu, SWT.PUSH, new ExportResourcesAction(getViewSite().getWorkbenchWindow()));
+ }
+
+ private void createAccessControlMenuItem(Menu parentMenu) {
+ accessControlMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ accessControlMenuItem.setText("&Access Control ");
+ // accessControlMenuItem.setEnabled(false);
+ accessControlMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Artifact selectedArtifact = (Artifact) selection.getFirstElement();
+ try {
+ if (selectedArtifact != null) {
+ PolicyDialog pd = new PolicyDialog(Display.getCurrent().getActiveShell(), selectedArtifact);
+ pd.open();
+ checkBranchReadable();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ private void createLockMenuItem(Menu parentMenu) {
+ lockMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ lockMenuItem.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> iterator = selection.iterator();
+
+ while (iterator.hasNext()) {
+ try {
+ Artifact object = (Artifact) iterator.next();
+ if ((new GlobalMenuPermissions(object)).isLocked()) {
+ AccessControlManager.getInstance().unLockObject(object, UserManager.getUser());
+ } else {
+ AccessControlManager.getInstance().lockObject(object, UserManager.getUser());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+ }
+
+ private void createCopyMenuItem(Menu parentMenu) {
+ copyMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ copyMenuItem.setText("Copy \tCtrl+C");
+ copyMenuItem.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ performCopy();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+ }
+
+ private void performCopy() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ ArrayList<Artifact> artifactTransferData = new ArrayList<Artifact>();
+ ArrayList<String> textTransferData = new ArrayList<String>();
+ Artifact artifact;
+
+ if (selection != null && !selection.isEmpty()) {
+ for (Object object : selection.toArray()) {
+ if (object instanceof Artifact) {
+ artifact = (Artifact) object;
+
+ artifactTransferData.add(artifact);
+ textTransferData.add(artifact.getDescriptiveName());
+ }
+ }
+ artifactClipboard.setArtifactsToClipboard(artifactTransferData, textTransferData);
+ }
+ }
+
+ private void createPasteMenuItem(Menu parentMenu) {
+ pasteMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ pasteMenuItem.setText("Paste \tCtrl+V");
+ pasteMenuItem.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ performPaste();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ });
+ }
+
+ /**
+ * This method must be called from the display thread
+ */
+ private void performPaste() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+
+ if (selection != null && !selection.isEmpty()) {
+ Object object = selection.getFirstElement();
+
+ if (object instanceof Artifact) {
+ try {
+ artifactClipboard.pasteArtifactsFromClipboard((Artifact) object);
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+
+ private void createExpandAllMenuItem(Menu parentMenu) {
+ MenuItem menuItem = new MenuItem(parentMenu, SWT.PUSH);
+ menuItem.setText("Expand All\tCtrl++");
+ menuItem.addSelectionListener(new ExpandListener());
+ }
+
+ public class ExpandListener extends SelectionAdapter {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ expandAll((IStructuredSelection) treeViewer.getSelection());
+ }
+ }
+
+ private void expandAll(IStructuredSelection selection) {
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ treeViewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPart#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ if (treeViewer != null) treeViewer.getControl().setFocus();
+ }
+
+ public void explore(Artifact artifact) throws CoreException, IllegalArgumentException {
+ setPartName("Artifact Explorer: " + artifact.getBranch().getBranchShortName());
+ if (artifact == null) {
+ throw new IllegalArgumentException("Can not explore a null artifact.");
+ }
+
+ if (branch != null && branch != artifact.getBranch()) {
+ explore(Arrays.asList(artifact));
+ return;
+ }
+ try {
+ checkBranchReadable();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ exploreRoot = artifact;
+ branch = artifact.getBranch();
+
+ initializeSelectionBox();
+
+ if (treeViewer != null) {
+ Object objects[] = treeViewer.getExpandedElements();
+ treeViewer.setInput(exploreRoot);
+ setupPopupMenu();
+ updateEnablementsEtAl();
+ // Attempt to re-expand what was expanded
+ treeViewer.setExpandedElements(objects);
+ }
+ }
+
+ public void setExpandedArtifacts(Object... artifacts) {
+ if (treeViewer != null) {
+ treeViewer.setExpandedElements(artifacts);
+ }
+ }
+
+ private void updateEnablementsEtAl() {
+ // The upAction may be null if this viewpart has not been layed out yet
+ if (upAction != null) {
+ try {
+ upAction.setEnabled(exploreRoot != null && exploreRoot.hasParent());
+ } catch (OseeCoreException ex) {
+ upAction.setEnabled(false);
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private class NeedArtifactMenuListener implements MenuListener {
+ private final HashCollection<Class<? extends Artifact>, MenuItem> menuItemMap;
+
+ public NeedArtifactMenuListener() {
+ this.menuItemMap = new HashCollection<Class<? extends Artifact>, MenuItem>();
+ }
+
+ public void add(MenuItem item) {
+ menuItemMap.put(Artifact.class, item);
+ }
+
+ public void add(MenuItem item, Class<? extends Artifact> artifactClass) {
+ menuItemMap.put(artifactClass, item);
+ }
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+
+ Object obj = selection.getFirstElement();
+ if (obj != null) {
+ Class<? extends Artifact> selectedClass = obj.getClass().asSubclass(Artifact.class);
+
+ for (Class<? extends Artifact> artifactClass : menuItemMap.keySet()) {
+ boolean valid = artifactClass.isAssignableFrom(selectedClass);
+
+ for (MenuItem item : menuItemMap.getValues(artifactClass)) {
+ if (!(item.getData() instanceof Exception)) {
+ // Only modify enabling if no error is associated
+ item.setEnabled(valid);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private class NeedProjectMenuListener implements MenuListener {
+ Collection<MenuItem> items;
+
+ public NeedProjectMenuListener() {
+ this.items = new LinkedList<MenuItem>();
+ }
+
+ public void add(MenuItem item) {
+ items.add(item);
+ }
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ boolean valid = treeViewer.getInput() != null;
+ for (MenuItem item : items) {
+ if (!(item.getData() instanceof Exception)) {
+ // Only modify
+ // enabling if no
+ // error is
+ // associated
+ item.setEnabled(valid);
+ }
+ }
+ }
+ }
+
+ /**
+ * Add the selection from the define explorer
+ */
+ private void addExploreSelection() {
+ if (exploreRoot != null) {
+ try {
+ treeViewer.setInput(exploreRoot);
+ initializeSelectionBox();
+ } catch (IllegalArgumentException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /**
+ * @author Jeff C. Phillips
+ */
+ public class ArtifactMenuListener implements MenuListener {
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ // Use this menu listener until all menu items can be moved to
+ // GlobaMenu
+ try {
+ GlobalMenuPermissions permiss = new GlobalMenuPermissions(globalMenuHelper);
+
+ lockMenuItem.setText((permiss.isLocked() ? "Unlock: (" + permiss.getSubjectFromLockedObjectName() + ")" : "Lock"));
+
+ lockMenuItem.setEnabled(permiss.isWritePermission() && (!permiss.isLocked() || permiss.isAccessToRemoveLock()));
+ openMenuItem.setEnabled(permiss.isReadPermission());
+ createMenuItem.setEnabled(permiss.isWritePermission());
+ openWithMenuItem.setEnabled(permiss.isReadPermission());
+ goIntoMenuItem.setEnabled(permiss.isReadPermission());
+ copyMenuItem.setEnabled(permiss.isReadPermission());
+ pasteMenuItem.setEnabled(permiss.isWritePermission());
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+
+ if (SkynetGuiPlugin.areOSEEServicesAvailable().isFalse()) return;
+
+ try {
+ if (memento != null && memento.getString(ROOT_GUID) != null && memento.getString(ROOT_BRANCH) != null) {
+ Branch branch = BranchManager.getBranch(Integer.parseInt(memento.getString(ROOT_BRANCH)));
+
+ if (!branch.isArchived() || AccessControlManager.isOseeAdmin()) {
+ Artifact previousArtifact = ArtifactQuery.checkArtifactFromId(memento.getString(ROOT_GUID), branch);
+ if (previousArtifact != null) {
+ explore(previousArtifact);
+ } else {
+ /*
+ * simply means that the previous artifact that was used as the root for the artiactExplorer does not exist
+ * because it was deleted or this workspace was last used with a different branch or database, so let the logic
+ * below get the default hierarchy root artifact
+ */
+ }
+ return;
+ }
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ if (exploreRoot != null) {
+ memento.putString(ROOT_GUID, exploreRoot.getGuid());
+ memento.putString(ROOT_BRANCH, String.valueOf(exploreRoot.getBranch().getBranchId()));
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ if (treeViewer != null) {
+ trees.remove(treeViewer.getTree());
+ }
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ treeViewer.addSelectionChangedListener(listener);
+ }
+
+ public ISelection getSelection() {
+ return treeViewer.getSelection();
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ treeViewer.removeSelectionChangedListener(listener);
+ }
+
+ public void setSelection(ISelection selection) {
+ treeViewer.setSelection(selection);
+ }
+
+ private void setHelpContexts() {
+ SkynetGuiPlugin.getInstance().setHelp(treeViewer.getControl(), "artifact_explorer_tree_viewer");
+ }
+ public class MenuEnablingListener implements MenuListener {
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ TreeItem[] myTreeItems = myTree.getSelection();
+ if (myTreeItems.length != 1) {
+ renameArtifactMenuItem.setEnabled(false);
+ return;
+ }
+ Object myTreeItemObject = myTreeItems[0].getData();
+ if (myTreeItemObject instanceof Artifact) {
+ Artifact mySelectedArtifact = (Artifact) myTreeItemObject;
+ boolean writePermission;
+ try {
+ writePermission = AccessControlManager.checkObjectPermission(mySelectedArtifact, PermissionEnum.WRITE);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ writePermission = false;
+ }
+
+ renameArtifactMenuItem.setEnabled(writePermission);
+ }
+ }
+ }
+
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.isNotForBranch(branch)) {
+ return;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ treeViewer.refresh();
+ }
+ });
+ }
+
+ @Override
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, final LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.isNotForBranch(branch)) {
+ return;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ Set<Artifact> parents = new HashSet<Artifact>();
+ for (Artifact art : loadedArtifacts.getLoadedArtifacts()) {
+ if (art.getParent() != null) {
+ parents.add(art.getParent());
+ }
+ }
+ for (Artifact art : parents) {
+ treeViewer.refresh(art);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ if (branch == null || transData.branchId != branch.getBranchId()) {
+ return;
+ }
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (treeViewer != null && Widgets.isAccessible(treeViewer.getTree())) {
+ for (Artifact art : transData.cacheDeletedArtifacts) {
+ treeViewer.remove(art);
+ }
+ try {
+ treeViewer.update(transData.getArtifactsInRelations(ChangeType.Changed,
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD.getRelationType()).toArray(), null);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ try {
+ Set<Artifact> parents = new HashSet<Artifact>();
+ for (Artifact art : transData.getArtifactsInRelations(ChangeType.Added,
+ CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD.getRelationType())) {
+ if (!art.isDeleted() && art.getParent() != null) {
+ parents.add(art.getParent());
+ }
+ }
+ treeViewer.refresh(parents);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IRelationModifiedEventListener#handleRelationModifiedEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.relation.RelationModifiedEvent.RelationModType, org.eclipse.osee.framework.skynet.core.relation.RelationLink, org.eclipse.osee.framework.skynet.core.artifact.Branch, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void handleRelationModifiedEvent(Sender sender, RelationModType relationModType, final RelationLink link, Branch branch, String relationType) {
+ try {
+ if (this.branch == null || !this.branch.equals(branch)) return;
+ if (link.getRelationType().equals(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD.getRelationType())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ // Since this is always a local event, artifact will always be in cache
+ Artifact aArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_A);
+ if (aArtifact != null) {
+ treeViewer.refresh(aArtifact);
+ }
+ Artifact bArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_B);
+ if (bArtifact != null) {
+ treeViewer.refresh(bArtifact);
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ });
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IArtifactModifiedEventListener#handleArtifactModifiedEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.ArtifactModifiedEvent.ArtifactModType, org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public void handleArtifactModifiedEvent(Sender sender, final ArtifactModType artifactModType, final Artifact artifact) {
+ try {
+ if (branch == null || !artifact.getBranch().equals(branch)) {
+ return;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ if (artifactModType == ArtifactModType.Deleted) {
+ treeViewer.remove(artifact);
+ } else if (artifactModType == ArtifactModType.Added) {
+ if (artifact.getParent() != null) {
+ treeViewer.refresh(artifact.getParent());
+ }
+ } else if (artifactModType == ArtifactModType.Changed) {
+ treeViewer.update(artifact, null);
+ } else if (artifactModType == ArtifactModType.Reverted) {
+ if (artifact.getParent() != null) {
+ treeViewer.refresh(artifact.getParent());
+ }
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, org.eclipse.osee.framework.skynet.core.artifact.Branch, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, final int branchId) {
+ if (branchModType == BranchEventType.Committed && branch != null && branch.getBranchId() == branchId) {
+ SkynetViews.closeView(VIEW_ID, getViewSite().getSecondaryId());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IAccessControlEventListener#handleAccessControlArtifactsEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.eventx.AccessControlModType, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleAccessControlArtifactsEvent(Sender sender, AccessControlEventType accessControlEventType, LoadedArtifacts loadedArtifacts) {
+ try {
+ if (loadedArtifacts.isNotForBranch(branch)) {
+ return;
+ }
+ if (accessControlEventType == AccessControlEventType.UserAuthenticated || accessControlEventType == AccessControlEventType.ArtifactsUnlocked || accessControlEventType == AccessControlEventType.ArtifactsLocked) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ treeViewer.refresh();
+ }
+ });
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener#rebuild()
+ */
+ @Override
+ public void rebuildMenu() {
+ setupPopupMenu();
+ }
+
+ public void setBranch(Branch branch) {
+ this.branch = branch;
+ }
+
+ public void initializeSelectionBox() {
+ if (branch != null && branchSelect != null && !branch.equals(branchSelect.getData())) {
+ branchSelect.setSelection(branch);
+ try {
+ checkBranchReadable();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ }
+ }
+
+ public void refreshWidgets() {
+
+ }
+
+ public Branch getBranch() {
+ return branch;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorerDragAndDrop.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorerDragAndDrop.java
new file mode 100644
index 00000000000..f5aa23b26fe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactExplorerDragAndDrop.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.io.File;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Wizards;
+import org.eclipse.osee.framework.ui.skynet.Import.ArtifactImportWizard;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.update.InterArtifactExplorerDropHandler;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactExplorerDragAndDrop extends SkynetDragAndDrop {
+ private final TreeViewer treeViewer;
+ private final String viewId;
+ private final IViewPart viewPart;
+ private final InterArtifactExplorerDropHandler interArtifactExplorerHandler;
+
+ public ArtifactExplorerDragAndDrop(TreeViewer treeViewer, String viewId, IViewPart viewPart) {
+ super(treeViewer.getTree(), treeViewer.getTree(), viewId);
+
+ this.treeViewer = treeViewer;
+ this.viewId = viewId;
+ this.viewPart = viewPart;
+ this.interArtifactExplorerHandler = new InterArtifactExplorerDropHandler();
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Object[] objects = selection.toArray();
+ Artifact[] artifacts = new Artifact[objects.length];
+
+ for (int index = 0; index < objects.length; index++)
+ artifacts[index] = (Artifact) objects[index];
+
+ return artifacts;
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
+
+ if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ event.detail = DND.DROP_COPY;
+ } else if (isValidForArtifactDrop(event)) {
+ event.detail = DND.DROP_MOVE;
+ } else {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+
+ private boolean isValidForArtifactDrop(DropTargetEvent event) {
+ if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType);
+
+ if (artData != null) {
+
+ Artifact parentArtifact = getSelectedArtifact(event);
+ if (parentArtifact != null && artData.getSource().equals(viewId)) {
+ Artifact[] artifactsToBeRelated = artData.getArtifacts();
+
+ for (Artifact artifact : artifactsToBeRelated) {
+ if (parentArtifact.equals(artifact)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ } else {
+ // only occurs during the drag on some platforms
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private Artifact getSelectedArtifact(DropTargetEvent event) {
+ TreeItem selected = treeViewer.getTree().getItem(treeViewer.getTree().toControl(event.x, event.y));
+
+ if (selected != null && selected.getData() instanceof Artifact) {
+ return (Artifact) selected.getData();
+ }
+ return null;
+ }
+
+ @Override
+ public void performDrop(final DropTargetEvent event) {
+ final Artifact parentArtifact = getSelectedArtifact(event);
+
+ if (parentArtifact != null) {
+ if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType);
+ final Artifact[] artifactsToBeRelated = artData.getArtifacts();
+ if (artifactsToBeRelated != null && artifactsToBeRelated.length > 0 && !artifactsToBeRelated[0].getBranch().equals(
+ parentArtifact.getBranch())) {
+ try {
+ interArtifactExplorerHandler.dropArtifactIntoDifferentBranch(parentArtifact, artifactsToBeRelated,
+ true);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (isValidForArtifactDrop(event) && MessageDialog.openQuestion(
+ viewPart.getViewSite().getShell(),
+ "Confirm Move",
+ "Are you sure you want to make each of the selected artifacts a child of " + parentArtifact.getDescriptiveName() + "?")) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(parentArtifact.getBranch());
+ // Replace all of the parent relations
+ for (Artifact artifact : artifactsToBeRelated) {
+ artifact.setSoleRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__PARENT, parentArtifact);
+ artifact.persistAttributesAndRelations(transaction);
+ }
+ transaction.execute();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ } else if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ Object object = FileTransfer.getInstance().nativeToJava(event.currentDataType);
+ if (object instanceof String[]) {
+ String filename = ((String[]) object)[0];
+
+ ArtifactImportWizard wizard = new ArtifactImportWizard();
+ wizard.setImportResourceAndArtifactDestination(new File(filename), parentArtifact);
+
+ Wizards.initAndOpen(wizard, viewPart);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactImageProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactImageProvider.java
new file mode 100644
index 00000000000..cc7d3e6a036
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactImageProvider.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.skynet;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+
+/**
+ * This class allows plugins to provide the base images for artifact types by registering via ImageManger.registerImage.
+ * It also provides the ability for programatic override of image creation by
+ * ImageManager.registerImageOverrideProvider. Registering to be override provider will cause the appropriate setupImage
+ * calls to be executed when the image is needed. All overlays and base images are then provided out of this provider.
+ *
+ * @author Ryan D. Brooks
+ */
+public abstract class ArtifactImageProvider {
+ /**
+ * Providers can return null which will cause null to be returned from the associated getImage or getImageDescriptor
+ * call. Alternatively, providers that wish to defer to the basic implementation should call return
+ * super.setupImage()
+ *
+ * @param artifact
+ * @throws OseeCoreException
+ */
+ public String setupImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.setupImageNoProviders(artifact);
+ }
+
+ public String setupImage(ArtifactType artifactType) throws OseeCoreException {
+ return ImageManager.setupImage(BaseImage.getBaseImageEnum(artifactType));
+ }
+
+ /**
+ * Provide image artifact type registration by ImageManager.register.* calls
+ *
+ * @throws OseeCoreException
+ */
+ public abstract void init() throws OseeCoreException;
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactLabelProvider.java
new file mode 100644
index 00000000000..da227306173
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactLabelProvider.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.framework.ui.skynet;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.graphics.Image;
+
+public class ArtifactLabelProvider extends LabelProvider { //StyledCellLabelProvider {
+// /* (non-Javadoc)
+// * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
+// */
+// @Override
+// public void update(ViewerCell cell) {
+// Object element = cell.getElement();
+// if (element instanceof Match) {
+// element = ((Match) element).getElement();
+// }
+//
+// if (element instanceof Artifact) {
+// Artifact artifact = (Artifact) element;
+//
+// String name = artifact.getDescriptiveName();
+// if (artifact.isDeleted()) {
+// name += " <Deleted>";
+// }
+// if (artifactExplorer != null) {
+// if (artifactExplorer.showArtVersion()) {
+// name += " -" + artifact.getGammaId() + "- ";
+// }
+//
+// if (artifactExplorer.showArtIds()) {
+// name += " (" + artifact.getArtId() + ") ";
+// }
+// try {
+// if (artifactExplorer.showArtType()) {
+// name += " <" + artifact.getArtifactTypeName() + "> ";
+// }
+//
+// name += artifactExplorer.getSelectedAttributeData(artifact);
+// } catch (Exception ex) {
+// OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+// name += ex.getLocalizedMessage();
+// }
+// }
+// cell.setText(name);
+// } else {
+// cell.setText(element.toString());
+// }
+// }
+
+ private static final OseeUiActivator plugin = SkynetGuiPlugin.getInstance();
+ private final ArtifactDecorator artifactDecorator;
+
+ public ArtifactLabelProvider(ArtifactDecorator artifactDecorator) {
+ super();
+ this.artifactDecorator = artifactDecorator;
+ }
+
+ public ArtifactLabelProvider() {
+ this(null);
+ }
+
+ /*
+ * @see ILabelProvider#getImage(Object)
+ */
+ public Image getImage(Object element) {
+ if (element instanceof Artifact) {
+ return ImageManager.getImage((Artifact) element);
+ } else if (element instanceof Match && ((Match) element).getElement() instanceof Artifact) {
+ return ImageManager.getImage((Artifact) ((Match) element).getElement());
+ }
+ return ImageManager.getImage(FrameworkImage.MISSING);
+ }
+
+ /*
+ * @see ILabelProvider#getText(Object)
+ */
+ public String getText(Object element) {
+ if (element instanceof Match) {
+ element = ((Match) element).getElement();
+ }
+
+ if (element instanceof Artifact) {
+ Artifact artifact = (Artifact) element;
+
+ String name = artifact.getDescriptiveName();
+ if (artifact.isDeleted()) {
+ name += " <Deleted>";
+ }
+ if (artifactDecorator != null) {
+ if (artifactDecorator.showArtVersion()) {
+ name += " -" + artifact.getGammaId() + "- ";
+ }
+
+ if (artifactDecorator.showArtIds()) {
+ name += " (" + artifact.getArtId() + ") ";
+ }
+ try {
+ if (artifactDecorator.showArtType()) {
+ name += " <" + artifact.getArtifactTypeName() + "> ";
+ }
+
+ name += artifactDecorator.getSelectedAttributeData(artifact);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ name += ex.getLocalizedMessage();
+ }
+ }
+ return name;
+ } else {
+ return element.toString();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactValidationCheckOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactValidationCheckOperation.java
new file mode 100644
index 00000000000..6f708d51200
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactValidationCheckOperation.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.framework.ui.skynet;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactValidationCheckOperation extends AbstractOperation {
+ private final List<Artifact> itemsToCheck;
+ private final boolean stopOnFirstError;
+
+ public ArtifactValidationCheckOperation(final Collection<Artifact> itemsToCheck, boolean stopOnFirstError) {
+ super("Validate Artifact(s)", SkynetGuiPlugin.PLUGIN_ID);
+ this.stopOnFirstError = stopOnFirstError;
+ this.itemsToCheck = new ArrayList<Artifact>(itemsToCheck);
+ if (itemsToCheck != null) {
+ this.itemsToCheck.addAll(itemsToCheck);
+ }
+ }
+
+ public boolean isStopOnFirstError() {
+ return stopOnFirstError;
+ }
+
+ private void handleStatus(Artifact itemChecked, IStatus status) throws Exception {
+ if (!status.isOK()) {
+ String link =
+ XResultData.getHyperlink(String.format("%s:[%s]", itemChecked.getArtifactTypeName(),
+ itemChecked.getDescriptiveName()), itemChecked.getHumanReadableId(),
+ itemChecked.getBranch().getBranchId());
+ String message = String.format("%s: %s", link, status.getMessage());
+ status =
+ new Status(status.getSeverity(), status.getPlugin(), status.getCode(), message, status.getException());
+ setStatus(status);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ monitor.setTaskName(getName());
+ if (!itemsToCheck.isEmpty()) {
+ int totalArts = itemsToCheck.size();
+ double workAmountPercentage = 1 / itemsToCheck.size();
+ int workAmount = calculateWork(workAmountPercentage);
+ for (int index = 0; index < totalArts; index++) {
+ monitor.setTaskName(String.format("Validating Artifact(s): [%s of %s]", index + 1, totalArts));
+ Artifact itemChecked = itemsToCheck.get(index);
+ IStatus status = OseeValidator.getInstance().validate(IOseeValidator.LONG, itemChecked);
+ handleStatus(itemChecked, status);
+ monitor.worked(workAmount);
+ if (isStopOnFirstError()) {
+ checkForErrorsOrCanceled(monitor);
+ } else {
+ checkForCancelledStatus(monitor);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactViewerSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactViewerSorter.java
new file mode 100644
index 00000000000..ec2b2261f44
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ArtifactViewerSorter.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.framework.ui.skynet;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+public class ArtifactViewerSorter extends ViewerSorter {
+
+ private final boolean reverse;
+
+ public ArtifactViewerSorter() {
+ this(false);
+ }
+
+ public ArtifactViewerSorter(boolean reverse) {
+ super();
+ this.reverse = reverse;
+ }
+
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ if (reverse)
+ return getComparator().compare(((Artifact) o2).getDescriptiveName(), ((Artifact) o1).getDescriptiveName());
+ else
+ return getComparator().compare(((Artifact) o1).getDescriptiveName(), ((Artifact) o2).getDescriptiveName());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeCellModifier.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeCellModifier.java
new file mode 100644
index 00000000000..c2253f5c4b5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeCellModifier.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.BinaryAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.DateValue;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.EnumeratedValue;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.StringValue;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.widgets.Item;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeCellModifier implements ICellModifier {
+ private final TableViewer tableViewer;
+ private final DateValue dateValue;
+ private final EnumeratedValue enumeratedValue;
+ private final StringValue stringValue;
+ private final IDirtiableEditor editor;
+
+ private final AttributesComposite attrComp;
+
+ public AttributeCellModifier(IDirtiableEditor editor, TableViewer tableViewer, AttributesComposite attrComp) {
+ super();
+ this.tableViewer = tableViewer;
+ this.attrComp = attrComp;
+ this.dateValue = new DateValue();
+ this.enumeratedValue = new EnumeratedValue();
+ this.stringValue = new StringValue();
+ this.editor = editor;
+
+ // this.pList = new PermissionList();
+ // pList.addPermission(Permission.PermissionEnum.EDITREQUIREMENT);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+ */
+ public boolean canModify(Object element, String property) {
+ attrComp.updateLabel("");
+ if (element != null) {
+ if (element instanceof Item) {
+ element = ((Item) element).getData();
+ }
+ try {
+ Attribute<?> attribute = (Attribute<?>) element;
+
+ if (attribute instanceof WordAttribute) {
+ return false;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return property.equals("value");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+ */
+ public Object getValue(Object element, String property) {
+ try {
+ Attribute<?> attribute = (Attribute<?>) element;
+ Object object = attribute.getValue();
+ if (attribute instanceof EnumeratedAttribute) {
+ enumeratedValue.setValue(attribute.getDisplayableString());
+
+ String[] choices =
+ AttributeTypeManager.getEnumerationValues(attribute.getAttributeType()).toArray(
+ new String[0]);
+ enumeratedValue.setChoices(choices);
+ return enumeratedValue;
+ } else if (attribute instanceof BooleanAttribute) {
+ enumeratedValue.setValue(attribute.getDisplayableString());
+ enumeratedValue.setChoices(BooleanAttribute.booleanChoices);
+ return enumeratedValue;
+ } else if (attribute instanceof DateAttribute) {
+ dateValue.setValue((Date) object);
+ return dateValue;
+ } else {
+ stringValue.setValue(attribute.getDisplayableString() != null ? attribute.getDisplayableString() : "");
+ return stringValue;
+ }
+ } catch (OseeCoreException ex) {
+ return Lib.exceptionToString(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String,
+ * java.lang.Object)
+ */
+ public void modify(Object element, String property, Object value) {
+ if (element != null) {
+ // Note that it is possible for an SWT Item to be passed instead of the model element.
+ if (element instanceof Item) {
+ element = ((Item) element).getData();
+ }
+ try {
+ Attribute<?> attribute = (Attribute<?>) element;
+
+ if (attribute instanceof DateAttribute) {
+ if (value instanceof GregorianCalendar) {
+ ((DateAttribute) attribute).setValue(new Date(((GregorianCalendar) value).getTimeInMillis()));
+ } else {
+ ((DateAttribute) attribute).setValue((Date) value);
+ }
+ } else if (!(attribute instanceof BinaryAttribute)) {
+ //binary attributes should not be changed.
+ attribute.setFromString((String) value);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ tableViewer.update(element, null);
+ editor.onDirtied();
+ attrComp.notifyModifyAttribuesListeners();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeContentProvider.java
new file mode 100644
index 00000000000..d37fb208a2e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeContentProvider.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.framework.ui.skynet;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeContentProvider implements IStructuredContentProvider {
+ private Object[] dummyArray = new Object[0];
+
+ /**
+ *
+ */
+ public AttributeContentProvider() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Artifact) {
+ try {
+ return ((Artifact) inputElement).getAttributes(false).toArray();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return dummyArray;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeLabelProvider.java
new file mode 100644
index 00000000000..3dd5c8a972f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeLabelProvider.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.framework.ui.skynet;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeLabelProvider implements ITableLabelProvider {
+
+ /**
+ *
+ */
+ public AttributeLabelProvider() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ Attribute<?> attribute = (Attribute<?>) element;
+ if (columnIndex == 0) {
+ return attribute.getAttributeType().getName();
+ }
+ try {
+ return attribute.getDisplayableString();
+ } catch (OseeCoreException ex) {
+ return Lib.exceptionToString(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+ * java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeMenuSelectionListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeMenuSelectionListener.java
new file mode 100644
index 00000000000..65e0c6f9d93
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributeMenuSelectionListener.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.framework.ui.skynet;
+
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeMenuSelectionListener extends SelectionAdapter {
+ private AttributesComposite attrsComp;
+ private TableViewer tableViewer;
+ private IDirtiableEditor editor;
+
+ public AttributeMenuSelectionListener(AttributesComposite attrsComp, TableViewer tableViewer, IDirtiableEditor editor) {
+ this.attrsComp = attrsComp;
+ this.tableViewer = tableViewer;
+ this.editor = editor;
+ }
+
+ /*
+ * (non-Javadoc) @@see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclips
+ * e.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ AttributeType attributeType = (AttributeType) ((MenuItem) ev.getSource()).getData();
+ attrsComp.getArtifact().createAttribute(attributeType, true);
+
+ tableViewer.refresh();
+ attrsComp.layout();
+ attrsComp.getParent().layout();
+ editor.onDirtied();
+ attrsComp.notifyModifyAttribuesListeners();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributesComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributesComposite.java
new file mode 100644
index 00000000000..83a2d2958b6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/AttributesComposite.java
@@ -0,0 +1,336 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnViewerEditor;
+import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerEditor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.skynet.widgets.cellEditor.UniversalCellEditor;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ArmEvent;
+import org.eclipse.swt.events.ArmListener;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+
+public class AttributesComposite extends Composite {
+ private TableViewer tableViewer;
+ private Table table;
+ private Text helpText;
+ private static final String[] columnNames = new String[] {"name", "value"};
+ private static final Integer[] columnWidths = new Integer[] {200, 600};
+ private Artifact artifact;
+ private final IDirtiableEditor editor;
+ private Label warningLabel;
+ private final boolean displayNameAttribute = true;
+ private final ArrayList<ModifyAttributesListener> modifyAttrListeners = new ArrayList<ModifyAttributesListener>();
+ private MenuItem deleteItem;
+ private final ToolBar toolBar;
+
+ public static final int NAME_COLUMN_INDEX = 0;
+ public static final int VALUE_COLUMN_INDEX = 1;
+
+ public AttributesComposite(IDirtiableEditor editor, Composite parent, int style, Artifact artifact) {
+ this(editor, parent, style, artifact, null);
+ }
+
+ public AttributesComposite(IDirtiableEditor editor, Composite parent, int style, Artifact artifact, ToolBar toolBar) {
+ super(parent, style);
+ this.artifact = artifact;
+ this.editor = editor;
+
+ create(this);
+ Menu popupMenu = new Menu(parent);
+ createAddMenuItem(popupMenu);
+ createDeleteMenuItem(popupMenu);
+ popupMenu.addMenuListener(new AttributeMenuListener());
+ tableViewer.getTable().setMenu(popupMenu);
+
+ this.toolBar = toolBar;
+ }
+
+ public void updateLabel(String msg) {
+ warningLabel.setText(msg);
+ layout();
+ }
+
+ private void create(Composite parent) {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ SashForm mainSash = new SashForm(this, SWT.NONE);
+ mainSash.setLayout(new GridLayout());
+ mainSash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainSash.setOrientation(SWT.VERTICAL);
+
+ createTableArea(mainSash);
+
+ SashForm sashForm = new SashForm(mainSash, SWT.NONE);
+ sashForm.setLayout(new GridLayout());
+ sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ sashForm.setOrientation(SWT.HORIZONTAL);
+
+ createWarningArea(sashForm);
+ createHelpArea(sashForm);
+
+ mainSash.setWeights(new int[] {8, 2});
+ sashForm.setWeights(new int[] {5, 5});
+
+ setHelpContexts();
+ }
+
+ private void createTableArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+ composite.setText("Attributes");
+
+ createTable(composite);
+ createColumns();
+ createTableViewer(composite);
+
+ tableViewer.refresh();
+ attachTableListeners();
+ }
+
+ private void createTable(Composite parent) {
+ table =
+ new Table(parent,
+ SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
+ table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+ }
+
+ private void attachTableListeners() {
+ tableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ Object selected = selection.getFirstElement();
+
+ if (selected instanceof Attribute) {
+ Attribute<?> attribute = (Attribute<?>) selected;
+ String tipText = attribute.getAttributeType().getTipText();
+ if (tipText != null && !tipText.equals("null"))
+ helpText.setText(tipText);
+ else
+ helpText.setText("");
+ }
+ }
+ });
+ }
+
+ private void createTableViewer(Composite parent) {
+ tableViewer = new TableViewer(table);
+
+ TableViewerEditor.create(
+ tableViewer,
+ new ColumnViewerEditorActivationStrategy(tableViewer),
+ ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setColumnProperties(columnNames);
+
+ if (!artifact.isReadOnly()) {
+ CellEditor[] editors = new CellEditor[columnNames.length];
+ editors[VALUE_COLUMN_INDEX] = new UniversalCellEditor(table, SWT.NONE);
+
+ tableViewer.setCellEditors(editors);
+ tableViewer.setCellModifier(new AttributeCellModifier(editor, tableViewer, this));
+ }
+ tableViewer.setContentProvider(new AttributeContentProvider());
+ tableViewer.setLabelProvider(new AttributeLabelProvider());
+ tableViewer.setInput(artifact);
+ }
+
+ private void createColumns() {
+ for (int index = 0; index < columnNames.length; index++) {
+ TableColumn column = new TableColumn(table, SWT.LEFT, index);
+ column.setText(columnNames[index]);
+ column.setWidth(columnWidths[index]);
+ }
+ }
+
+ private void createHelpArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Tips");
+
+ helpText = new Text(composite, SWT.WRAP | SWT.READ_ONLY);
+ helpText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ }
+
+ private void createWarningArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Warnings");
+
+ warningLabel = new Label(composite, SWT.NONE);
+ warningLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ warningLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ updateLabel("");
+ }
+
+ private void createAddMenuItem(Menu parentMenu) {
+ MenuItem addItem = new MenuItem(parentMenu, SWT.CASCADE);
+ addItem.setText("Add");
+ addItem.setEnabled(true && !artifact.isReadOnly());
+
+ // Update the enabled values for the popup menu each time it comes up
+ addItem.addArmListener(new ArmListener() {
+
+ public void widgetArmed(ArmEvent e) {
+ MenuItem addItem = (MenuItem) e.getSource();
+ for (MenuItem attrItem : addItem.getMenu().getItems()) {
+ try {
+ attrItem.setEnabled(artifact.getRemainingAttributeCount((AttributeType) attrItem.getData()) > 0);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ });
+
+ Menu attributesMenu = new Menu(parentMenu);
+
+ try {
+ SelectionAdapter listener = new AttributeMenuSelectionListener(this, tableViewer, editor);
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ MenuItem item = new MenuItem(attributesMenu, SWT.CASCADE);
+ item.setText(attributeType.getName() + " Attribute");
+ item.setData(attributeType);
+ item.addSelectionListener(listener);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ addItem.setMenu(attributesMenu);
+ }
+
+ private void createDeleteMenuItem(Menu parentMenu) {
+ deleteItem = new MenuItem(parentMenu, SWT.PUSH);
+ deleteItem.setImage(null);
+ deleteItem.setText("Delete");
+ deleteItem.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ Attribute<?> attribute = getSelectedAttribute();
+ attribute.delete();
+ editor.onDirtied();
+ notifyModifyAttribuesListeners();
+ tableViewer.refresh();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+ }
+
+ private Attribute<?> getSelectedAttribute() {
+ TableItem[] items = tableViewer.getTable().getSelection();
+ if (items.length > 0)
+ return (Attribute<?>) (tableViewer.getTable().getSelection()[0]).getData();
+ else
+ return null;
+ }
+
+ public class AttributeMenuListener implements MenuListener {
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ Attribute<?> attribute = getSelectedAttribute();
+
+ if (attribute == null) {
+ deleteItem.setText("Delete - No Attribute Selected");
+ deleteItem.setEnabled(false);
+ } else if (!attribute.canDelete()) {
+ deleteItem.setText("Delete - Lower Limit Met");
+ deleteItem.setEnabled(false);
+ } else {
+ deleteItem.setText("Delete");
+ deleteItem.setEnabled(!artifact.isReadOnly());
+ }
+ }
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ public void refreshArtifact(Artifact artifact) {
+ this.artifact = artifact;
+
+ if (tableViewer.getContentProvider() != null) {
+ tableViewer.setInput(artifact);
+ tableViewer.refresh();
+ }
+ }
+
+ public boolean isDisplayNameAttribute() {
+ return displayNameAttribute;
+ }
+
+ public void addModifyAttributesListener(ModifyAttributesListener listener) {
+ if (!modifyAttrListeners.contains(listener)) modifyAttrListeners.add(listener);
+ }
+
+ public void removeModifyAttributesListener(ModifyAttributesListener listener) {
+ modifyAttrListeners.remove(listener);
+ }
+
+ public void notifyModifyAttribuesListeners() {
+ for (ModifyAttributesListener listener : modifyAttrListeners)
+ listener.handleEvent();
+ }
+
+ private void setHelpContexts() {
+ SkynetGuiPlugin.getInstance().setHelp(tableViewer.getControl(), "artifact_editor");
+ }
+
+ /**
+ * @return the toolBar
+ */
+ public ToolBar getToolBar() {
+ return toolBar;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/BaseImage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/BaseImage.java
new file mode 100644
index 00000000000..b4ca3cbd6f1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/BaseImage.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * 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.skynet;
+
+import java.io.ByteArrayInputStream;
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.swt.graphics.ImageData;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BaseImage implements OseeImage {
+ private final ArtifactType artifactType;
+ private final byte[] imageData;
+
+ private BaseImage(ArtifactType artifactType, byte[] imageData) {
+ this.artifactType = artifactType;
+ this.imageData = imageData;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#createImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageDescriptor.createFromImageData(new ImageData(new ByteArrayInputStream(imageData)));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageKey()
+ */
+ @Override
+ public String getImageKey() {
+ return SkynetGuiPlugin.PLUGIN_ID + ".artifact_type." + artifactType.getName();
+ }
+
+ public static OseeImage getBaseImageEnum(ArtifactType artifactType, byte[] imageData) {
+ if (ImageManager.getOverrideImageEnum() != null) {
+ return ImageManager.getOverrideImageEnum();
+ }
+ return new BaseImage(artifactType, imageData);
+ }
+
+ public static OseeImage getBaseImageEnum(ArtifactType artifactType) {
+ if (ImageManager.getOverrideImageEnum() != null) {
+ return ImageManager.getOverrideImageEnum();
+ }
+ // Check extensions
+ OseeImage oseeImage = ImageManager.getArtifactTypeImage(artifactType.getName());
+ if (oseeImage != null) return oseeImage;
+
+ return FrameworkImage.LASER;
+ }
+
+ public static OseeImage getBaseImageEnum(Artifact artifact) {
+ if (ImageManager.getOverrideImageEnum() != null) {
+ return ImageManager.getOverrideImageEnum();
+ }
+ if (artifact instanceof NativeArtifact) {
+ try {
+ String extension = ((NativeArtifact) artifact).getFileExtension();
+ return new ProgramImage(extension);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return getBaseImageEnum(artifact.getArtifactType());
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/DialogPopupLoggerListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/DialogPopupLoggerListener.java
new file mode 100644
index 00000000000..f3e0b35e742
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/DialogPopupLoggerListener.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.framework.ui.skynet;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class DialogPopupLoggerListener implements ILoggerListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.logging.ILoggerListener#log(java.lang.String, java.lang.String, java.util.logging.Level, java.lang.String, java.lang.Throwable)
+ */
+ @Override
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ if (level == OseeLevel.SEVERE_POPUP) {
+ String title = "OSEE Error";
+ String messageText = message;
+ String reasonMessage = "";
+ if (th != null) {
+ reasonMessage = th.getMessage();
+ }
+ final IStatus status;
+ if (th != null) {
+ List<IStatus> exc = new ArrayList<IStatus>();
+ exceptionToString(true, loggerName, th, exc);
+ status = new MultiStatus(loggerName, Status.ERROR, exc.toArray(new IStatus[exc.size()]), reasonMessage, th);
+ } else {
+ status = new Status(Status.ERROR, loggerName, -20, reasonMessage, th);
+ }
+ final String realTitle = title;
+ final String realMessageText = messageText;
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ ErrorDialog.openError(Display.getDefault().getActiveShell(), realTitle, realMessageText, status);
+ }
+ });
+ }
+ }
+
+ private static void exceptionToString(boolean firstTime, String loggerName, Throwable ex, List<IStatus> exc) {
+ if (ex == null) {
+ return;
+ }
+ if (!firstTime) {
+ exc.add(new Status(Status.ERROR, loggerName, ex.getMessage()));
+ }
+ StackTraceElement st[] = ex.getStackTrace();
+ for (int i = 0; i < st.length; i++) {
+ StackTraceElement ste = st[i];
+ exc.add(new Status(Status.ERROR, loggerName, ste.toString()));
+ }
+ Throwable cause = ex.getCause();
+ if (cause != null) {
+ exc.add(new Status(Status.ERROR, loggerName, " caused by "));
+ exceptionToString(false, loggerName, cause, exc);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkArtifactImageProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkArtifactImageProvider.java
new file mode 100644
index 00000000000..6432adddf0d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkArtifactImageProvider.java
@@ -0,0 +1,58 @@
+/*
+ * Created on Jun 8, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class FrameworkArtifactImageProvider extends ArtifactImageProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider#init()
+ */
+ @Override
+ public void init() throws OseeCoreException {
+ ImageManager.registerBaseImage("Heading", FrameworkImage.HEADING);
+ ImageManager.registerBaseImage("Narrative", FrameworkImage.NARRITIVE);
+ ImageManager.registerBaseImage("Blam Workflow", FrameworkImage.BLAM);
+ ImageManager.registerBaseImage("Folder", FrameworkImage.FOLDER);
+ ImageManager.registerBaseImage("User", FrameworkImage.USER);
+ ImageManager.registerBaseImage("Global Preferences", FrameworkImage.GEAR);
+ ImageManager.registerBaseImage("User Group", FrameworkImage.USERS);
+ ImageManager.registerBaseImage("Work Flow Definition", FrameworkImage.WORKFLOW);
+ ImageManager.registerBaseImage("Work Page Definition", FrameworkImage.PAGE);
+ ImageManager.registerBaseImage("Work Rule Definition", FrameworkImage.RULE);
+ ImageManager.registerBaseImage("Work Widget Definition", FrameworkImage.WIDGET);
+ ImageManager.registerBaseImage("Universal Group", FrameworkImage.GROUP);
+
+ ImageManager.registerOverrideImageProvider(this, ArtifactTypeManager.getType("User"));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider#getImage(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public String setupImage(Artifact artifact) throws OseeCoreException {
+ if (artifact.isDeleted()) {
+ return null;
+ } else if (((User) artifact).isSystemUser()) {
+ return ImageManager.setupImage(FrameworkImage.USER_GREY);
+ } else if (!((User) artifact).isActive()) {
+ return ImageManager.setupImage(FrameworkImage.USER_YELLOW);
+ } else if (((User) artifact).equals(UserManager.getUser())) {
+ return ImageManager.setupImage(FrameworkImage.USER_RED);
+ }
+
+ return super.setupImage(artifact);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkImage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkImage.java
new file mode 100644
index 00000000000..274e68f22c7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/FrameworkImage.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * 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.skynet;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum FrameworkImage implements OseeImage {
+ ACCEPT("accept.gif"),
+ ADMIN("admin.gif"),
+ ADD_GREEN("add.gif"),
+ ARCHIVE("archive.gif"),
+ ARTIFACT_EDITOR("artifact_editor.gif"),
+ ARTIFACT_EXPLORER("artifact_explorer.gif"),
+ ARTIFACT_SEARCH("artifact_search.gif"),
+ ARTIFACT_VERSION("artifact_version.gif"),
+ ARROW_RIGHT_YELLOW("nav_forward.gif"),
+ ARROW_UP_YELLOW("up.gif"),
+ ARROW_DOWN_YELLOW("down.gif"),
+ ATTRIBUTE_MOLECULE("molecule.gif"),
+ ATTRIBUTE_SUB_A("attribute.gif"),
+ ATTRIBUTE_DISABLED("disabled_attribute.gif"),
+ APPLICATION_SERVER("appserver.gif"),
+ AUTHENTICATED("authenticated.gif"),
+ BLAM("blam.gif"),
+ BRANCH_CHANGE("branch_change.gif"),
+ BRANCH("branch.gif"),
+ BRANCH_TOP("top.gif"),
+ BRANCH_SYSTEM_ROOT("branchYellow.gif"),
+ BRANCH_BASELINE("baseline.gif"),
+ BRANCH_MERGE("merge.gif"),
+ BRANCH_WORKING("working.gif"),
+ BRANCH_FAVORITE_OVERLAY("star_9_9.gif"),
+ BRANCH_CHANGE_MANAGED("change_managed_branch.gif"),
+ BRANCH_COMMIT("commitBranch.gif"),
+ BUG("bug.gif"),
+ CHECKBOX_ENABLED("chkbox_enabled.gif"),
+ CHECKBOX_DISABLED("chkbox_disabled.gif"),
+ CLOCK("clock.gif"),
+ COLLAPSE_ALL("collapseAll.gif"),
+ CONFLICTING_Deleted("CONFLICTING_Deleted.gif"),
+ CONFLICTING_Modified("CONFLICTING_Modified.gif"),
+ CONFLICTING_New("CONFLICTING_New.gif"),
+ COPYTOCLIPBOARD("copyToClipboard.gif"),
+ CUSTOMIZE("customize.gif"),
+ DB_ICON_BLUE("DBiconBlue.GIF"),
+ DELETE("delete.gif"),
+ DIRTY("dirty.gif"),
+ DOT_RED("red_light.gif"),
+ DOT_YELLOW("yellow_light.gif"),
+ DOT_GREEN("green_light.gif"),
+ DUPLICATE("duplicate.gif"),
+ EDIT("edit.gif"),
+ EDIT_BLUE("DBiconBlueEdit.GIF"),
+ EDIT_ARTIFACT("edit_artifact.gif"),
+ EMAIL("email.gif"),
+ ERROR("errorRound.gif"),
+ ERROR_OVERLAY("error.gif"),
+ EXPAND_ALL("expandAll.gif"),
+ EXPORT_DATA("export_data.gif"),
+ EXPORT_TABLE("export_table.gif"),
+ EXCLAIM_RED("redExclaim.gif"),
+ FLASHLIGHT("flashlight.gif"),
+ FILTERS("filter.gif"),
+ FOLDER("folder.gif"),
+ GEAR("gear.gif"),
+ GREEN_PLUS("greenPlus.gif"),
+ GROUP("group.gif"),
+ HEADING("heading.gif"),
+ HELP("help.gif"),
+ IMPORT("import.gif"),
+ INCOMING_ARTIFACT_DELETED("INCOMING_Deleted.gif"),
+ INCOMING_DELETED("INCOMING_Deleted.gif"),
+ INCOMING_INTRODUCED("INCOMING_New.gif"),
+ INCOMING_MODIFIED("INCOMING_Modified.gif"),
+ INCOMING_NEW("INCOMING_New.gif"),
+ INFO_SM("info_sm.gif"),
+ INFO_LG("info_lg.gif"),
+ LASER("laser_16_16.gif"),
+ LASER_OVERLAY("laser_8_8.gif"),
+ LINE_MATCH("line_match.gif"),
+ LOCKED_KEY("lockkey.gif"),
+ LOCKED_NO_ACCESS("red_lock.gif"),
+ LOCKED_WITH_ACCESS("green_lock.gif"),
+ NOT_EQUAL("not_equal.gif"),
+ MAGNIFY("magnify.gif"),
+ MISSING("missing"),
+ MERGE("merge.gif"),
+ MERGE_SOURCE("green_s.gif"),
+ MERGE_DEST("blue_d.gif"),
+ MERGE_YELLOW_M("yellow_m.gif"),
+ MERGE_START("conflict.gif"),
+ MERGE_INFO("issue.gif"),
+ MERGE_MARKED("chkbox_enabled.gif"),
+ MERGE_EDITED("chkbox_disabled.gif"),
+ MERGE_OUT_OF_DATE("chkbox_red.gif"),
+ MERGE_OUT_OF_DATE_COMMITTED("chkbox_enabled_conflicted.gif"),
+ MERGE_NO_CONFLICT("accept.gif"),
+ MERGE_NOT_RESOLVEABLE("red_light.gif"),
+ MERGE_SUCCESS("icon_success.gif"),
+ MERGE_CAUTION("icon_warning.gif"),
+ NARRITIVE("narrative.gif"),
+ OUTGOING_ARTIFACT_DELETED("OUTGOING_Deleted.gif"),
+ OUTGOING_DELETED("OUTGOING_Deleted.gif"),
+ OUTGOING_INTRODUCED("OUTGOING_New.gif"),
+ OUTGOING_MERGED("branch_merge.gif"),
+ OUTGOING_MODIFIED("OUTGOING_Modified.gif"),
+ OUTGOING_NEW("OUTGOING_New.gif"),
+ OPEN("open.gif"),
+ PROBLEM("greenBug.gif"),
+ PRINT("print.gif"),
+ PURPLE("purple.gif"),
+ RECTANGLE_16("rectangle16.gif"),
+ RECTANGLE_24("rectangle24.gif"),
+ REFRESH("refresh.gif"),
+ RELATION("relate.gif"),
+ REMOVE("remove.gif"),
+ REJECT("reject.gif"),
+ RUN_EXC("run_exc.gif"),
+ PAGE("page.gif"),
+ RULE("rule.gif"),
+ SAVE_NEEDED("save.gif"),
+ SAVED("saved.gif"),
+ SAVE("save.gif"),
+ SEVERITY_MAJOR("major.gif"),
+ SEVERITY_MINOR("minor.gif"),
+ SEVERITY_ISSUE("issue.gif"),
+ SLASH_RED_OVERLAY("red_slash.gif"),
+ TRASH("trash.gif"),
+ SKYWALKER("skywalker.gif"),
+ SUPPORT("users2.gif"),
+ USER("userPurple.gif"),
+ USER_PURPLE("userPurple.gif"),
+ USER_RED("userRed.gif"),
+ USER_GREY("userGrey.gif"),
+ USER_YELLOW("userYellow.gif"),
+ USER_ADD("userAdd.gif"),
+ USERS("users2.gif"),
+ UN_ARCHIVE("unarchive.gif"),
+ VERSION("version.gif"),
+ WORKFLOW("workflow.gif"),
+ WIDGET("widget.gif"),
+ WARNING("warn.gif"),
+ WARNING_OVERLAY("alert_8_8.gif"),
+ X_RED("redRemove.gif");
+
+ private final String fileName;
+
+ private FrameworkImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ if (this == MISSING) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ return ImageManager.createImageDescriptor(SkynetGuiPlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageKey()
+ */
+ @Override
+ public String getImageKey() {
+ return SkynetGuiPlugin.PLUGIN_ID + "." + fileName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/GenerateTypeEnumAction.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/GenerateTypeEnumAction.java
new file mode 100644
index 00000000000..7a9e8966057
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/GenerateTypeEnumAction.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.framework.ui.skynet;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.database.SkynetTypesEnumGenerator;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+public class GenerateTypeEnumAction implements IActionDelegate {
+
+ public GenerateTypeEnumAction() {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void run(IAction action) {
+ try {
+ StructuredSelection sel = AWorkspace.getSelection();
+ Iterator i = sel.iterator();
+ File selection = null;
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+ if (resource != null) {
+ selection = resource.getLocation().toFile();
+ if (selection != null) {
+
+ Object destinationObj = getFolderToStoreAutoGenFilesIn(resource);
+ if (destinationObj instanceof IContainer) {
+ IContainer destinationFolder = (IContainer) destinationObj;
+ File storeAt = destinationFolder.getLocation().toFile();
+ SkynetTypesEnumGenerator gen = new SkynetTypesEnumGenerator();
+ gen.extractTypesFromSheet(selection, storeAt);
+ gen.finish();
+
+ destinationFolder.refreshLocal(IResource.DEPTH_INFINITE, null);
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private Object getFolderToStoreAutoGenFilesIn(IResource resource) {
+ CheckedTreeSelectionDialog resourceDialog =
+ new ResourceSelectionTree(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ new WorkbenchLabelProvider(), new WorkbenchContentProvider());
+
+ resourceDialog.setInput(resource.getWorkspace().getRoot());
+ resourceDialog.addFilter(new ViewerFilter() {
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ IResource resource = null;
+ if (element instanceof IContainer) {
+ IContainer container = (IContainer) element;
+ String name = container.getName();
+ if (name.startsWith(".") == false && name.equals("bin") == false) {
+ resource = container;
+ }
+ }
+ if (resource != null) {
+ return true;
+ }
+ return false;
+ }
+ });
+ resourceDialog.setMessage("Select where Auto-Generated classes should be stored.");
+ resourceDialog.setTitle("Select Destination");
+ resourceDialog.setEmptyListMessage("No Projects Available");
+ IContainer container = resource.getParent();
+ resourceDialog.setInitialSelection(container);
+ List<Object> expand = new ArrayList<Object>();
+ expand.add(container);
+ if (container.getParent() != null) {
+ expand.add(container.getParent());
+ }
+ resourceDialog.setExpandedElements(expand.toArray(new Object[expand.size()]));
+ int result = resourceDialog.open();
+ return result != Window.CANCEL ? resourceDialog.getFirstResult() : null;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ private final class ResourceSelectionTree extends CheckedTreeSelectionDialog {
+
+ public ResourceSelectionTree(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
+ super(parent, labelProvider, contentProvider);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ applyDialogFont(composite);
+
+ Label messageLabel = createMessageArea(composite);
+ CheckboxTreeViewer treeViewer = createTreeViewer(composite);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.widthHint = convertWidthInCharsToPixels(80);
+ data.heightHint = convertHeightInCharsToPixels(16);
+ Tree treeWidget = treeViewer.getTree();
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ boolean wasChecked = event.getChecked();
+ getTreeViewer().setAllChecked(false);
+ event.getCheckable().setChecked(event.getElement(), wasChecked);
+ }
+
+ });
+ treeWidget.setLayoutData(data);
+ treeWidget.setFont(parent.getFont());
+ messageLabel.setEnabled(true);
+ treeWidget.setEnabled(true);
+ return composite;
+ }
+ };
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/HTMLTransferFormatter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/HTMLTransferFormatter.java
new file mode 100644
index 00000000000..7be850217a2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/HTMLTransferFormatter.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.framework.ui.skynet;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactURL;
+import org.eclipse.osee.framework.skynet.core.preferences.PreferenceConstants;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class HTMLTransferFormatter {
+ private static final String START = "<A href=\"";
+ private static final String END = "</A>";
+ private static IPreferenceStore prefStore = SkynetGuiPlugin.getInstance().getPreferenceStore();
+
+ public static String getHtml(Artifact... artifacts) {
+ boolean applyWordTagWrap =
+ prefStore.getString(PreferenceConstants.WORDWRAP_KEY) != null && prefStore.getString(
+ PreferenceConstants.WORDWRAP_KEY).equals(IPreferenceStore.TRUE);
+
+ if (artifacts != null) {
+ StringBuilder sb = new StringBuilder();
+
+ if (applyWordTagWrap) {
+ sb.append("Version:1.0\r\nStartHTML:2\r\nEndHTML:170\r\nStartFragment:140\r\nEndFragment:160\r\n" + "StartSelection:140\r\nEndSelection:160\r\n<HTML><HEAD><TITLE> The HTML Clipboard</TITLE></HEAD><BODY>\r\n" + "<!--StartFragment -->\r\n");
+ }
+
+ List<String> urls = new ArrayList<String>(artifacts.length);
+ for (Artifact artifact : artifacts) {
+ String link = null;
+ try {
+ link = ArtifactURL.getOpenInOseeLink(artifact).toString();
+ } catch (OseeCoreException ex) {
+ link =
+ String.format("guid:[%s] branch:[%s] gammaId:[%s]", artifact.getGuid(),
+ artifact.getBranch().getBranchId(), artifact.getGammaId());
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, String.format("Error creating link for: [%s]",
+ artifact), ex);
+ }
+ urls.add(link + "\">" + artifact.getDescriptiveName());
+ }
+
+ sb.append(Collections.toString(urls, START, END + ", " + START, END));
+
+ if (applyWordTagWrap) {
+ sb.append("\r\n<!--EndFragment --></BODY></HTML>");
+ }
+
+ return sb.toString();
+ } else {
+ throw new IllegalArgumentException("The artifact can not be null");
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/IHelpContextIds.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/IHelpContextIds.java
new file mode 100644
index 00000000000..3b0ab8d09cd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/IHelpContextIds.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.framework.ui.skynet;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface IHelpContextIds {
+ public static final String PREFIX = "org.eclipse.osee.framework.ui.skynet.";
+ public static final String MAIN_WORKFLOW_PAGE = PREFIX + "main_workflow_page";
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ImageManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ImageManager.java
new file mode 100644
index 00000000000..6ef198b485f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ImageManager.java
@@ -0,0 +1,366 @@
+/*******************************************************************************
+ * 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.skynet;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.NEW;
+import static org.eclipse.osee.framework.skynet.core.change.ChangeType.CONFLICTING;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.info.SQL3DataType;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.ArtifactAnnotation;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+import org.eclipse.osee.framework.skynet.core.conflict.ArtifactConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.skynet.core.revision.AttributeChange;
+import org.eclipse.osee.framework.skynet.core.revision.RelationLinkChange;
+import org.eclipse.osee.framework.skynet.core.revision.RevisionChange;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage.Location;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ImageManager {
+ private static final String EXTENSION_ELEMENT = "ArtifactImageProvider";
+ private static final String EXTENSION_ID = SkynetGuiPlugin.PLUGIN_ID + "." + EXTENSION_ELEMENT;
+ private static OseeImage overrideImageEnum;
+
+ private static final String SELECT_ARTIFACT_TYPES_IMAGE_QUERY =
+ "SELECT art_type_id, image FROM osee_artifact_type where image is not null";
+ private static final ImageManager instance = new ImageManager();
+ private final Map<ArtifactType, ArtifactImageProvider> providersOverrideImageMap =
+ Collections.synchronizedMap(new HashMap<ArtifactType, ArtifactImageProvider>());
+ private final Map<String, OseeImage> artifactTypeImageMap =
+ Collections.synchronizedMap(new HashMap<String, OseeImage>());
+ private final ImageRegistry imageRegistry = SkynetGuiPlugin.getInstance().getImageRegistry();
+
+ static {
+ loadCache();
+ }
+
+ public static void loadCache() {
+ instance.providersOverrideImageMap.clear();
+ instance.artifactTypeImageMap.clear();
+ List<ArtifactImageProvider> providers =
+ new ExtensionDefinedObjects<ArtifactImageProvider>(EXTENSION_ID, EXTENSION_ELEMENT, "class").getObjects();
+
+ // Load all image providers first
+ for (ArtifactImageProvider imageProvider : providers) {
+ try {
+ imageProvider.init();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ // Load base images from database (which can override the ImageManager.registerImage() calls provided
+ // through the ArtifactImageProviders
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_ARTIFACT_TYPES_IMAGE_QUERY);
+
+ while (chStmt.next()) {
+ try {
+ ArtifactType artifactType = ArtifactTypeManager.getType(chStmt.getInt("art_type_id"));
+ instance.artifactTypeImageMap.put(artifactType.getName(), BaseImage.getBaseImageEnum(artifactType,
+ Lib.inputStreamToBytes(chStmt.getBinaryStream("image"))));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private ImageManager() {
+ }
+
+ public static Image getConflictImage(Conflict conflict) throws OseeCoreException {
+ if (conflict instanceof AttributeConflict) {
+ return getImage(FrameworkImage.ATTRIBUTE_MOLECULE);
+ }
+ if (conflict instanceof ArtifactConflict) {
+ return getImage(conflict.getArtifact());
+ }
+ throw new OseeArgumentException("Conflict not of supported type");
+ }
+
+ private static Image getChangeTypeImageInternal(OseeImage baseImage, ChangeType changeType, ModificationType modType) {
+ if (changeType == CONFLICTING && modType == NEW) {
+ modType = ModificationType.MODIFIED;
+ }
+ OseeImage overlay = FrameworkImage.valueOf(changeType + "_" + modType.toString());
+ return instance.imageRegistry.get(setupImageWithOverlay(baseImage, overlay, Location.TOP_LEFT));
+ }
+
+ public static Image getChangeTypeImage(Change change) throws OseeArgumentException, OseeDataStoreException, OseeTypeDoesNotExist {
+ if (change.getItemKind().equals("Attribute")) {
+ return getAttributeChangeImage(change.getChangeType(), change.getModificationType());
+ }
+ if (change.getItemKind().equals("Artifact")) {
+ return getArtifactChangeImage(change.getArtifactType(), change.getChangeType(), change.getModificationType());
+ }
+ if (change.getItemKind().equals("Relation")) {
+ return getRelationChangeImage(change.getChangeType(), change.getModificationType());
+ }
+ throw new OseeArgumentException("Change not of supported type");
+ }
+
+ public static Image getChangeKindImage(Change change) throws OseeArgumentException, OseeDataStoreException, OseeTypeDoesNotExist {
+ if (change.getItemKind().equals("Attribute")) {
+ return getArtifactChangeImage(change.getArtifactType(), change.getChangeType(), change.getModificationType());
+ }
+ return getChangeTypeImage(change);
+ }
+
+ public static Image getChangeImage(RevisionChange change) throws OseeArgumentException, OseeDataStoreException, OseeTypeDoesNotExist {
+ if (change instanceof AttributeChange) {
+ return getAttributeChangeImage(change.getChangeType(), change.getModificationType());
+ }
+ if (change instanceof ArtifactChange) {
+
+ return getArtifactChangeImage(((ArtifactChange) change).getArtifact().getArtifactType(),
+ change.getChangeType(), change.getModificationType());
+ }
+ if (change instanceof RelationLinkChange) {
+ return getRelationChangeImage(change.getChangeType(), change.getModificationType());
+ }
+ throw new OseeArgumentException("Change not of supported type");
+ }
+
+ private static Image getArtifactChangeImage(ArtifactType artifactType, ChangeType changeType, ModificationType modType) {
+ return getChangeTypeImageInternal(BaseImage.getBaseImageEnum(artifactType), changeType, modType);
+ }
+
+ private static Image getAttributeChangeImage(ChangeType changeType, ModificationType modType) {
+ return getChangeTypeImageInternal(FrameworkImage.ATTRIBUTE_MOLECULE, changeType, modType);
+ }
+
+ private static Image getRelationChangeImage(ChangeType changeType, ModificationType modType) {
+ return getChangeTypeImageInternal(FrameworkImage.RELATION, changeType, modType);
+ }
+
+ public static Image getImage(ArtifactType artifactType) {
+ try {
+ if (overrideImageEnum != null) {
+ return ImageManager.getImage(overrideImageEnum);
+ }
+
+ // Check if image provider provides override for this image
+ ArtifactImageProvider imageProvider = instance.providersOverrideImageMap.get(artifactType);
+ if (imageProvider != null) {
+ String imageKey = imageProvider.setupImage(artifactType);
+ if (imageKey != null) {
+ return instance.imageRegistry.get(imageKey);
+ }
+ }
+
+ // Return image for the base image
+ return getImage(BaseImage.getBaseImageEnum(artifactType));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return getImage(FrameworkImage.MISSING);
+ }
+
+ public static Image getImage(Artifact artifact, OseeImage overlay, Location location) {
+ return instance.imageRegistry.get(setupImageWithOverlay(BaseImage.getBaseImageEnum(artifact), overlay, location));
+ }
+
+ public static String setupImage(Artifact artifact, OseeImage overlay, Location location) {
+ return setupImageWithOverlay(BaseImage.getBaseImageEnum(artifact), overlay, location);
+ }
+
+ public static void registerOverrideImageProvider(ArtifactImageProvider imageProvider, ArtifactType artifactType) {
+ instance.providersOverrideImageMap.put(artifactType, imageProvider);
+ }
+
+ public static void registerBaseImage(String artifactTypeName, OseeImage oseeImage) {
+ if (instance.artifactTypeImageMap.containsKey(artifactTypeName)) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE,
+ "Two ArtifactImageProviders specify image for same artifact type [" + artifactTypeName + "]");
+ }
+ instance.artifactTypeImageMap.put(artifactTypeName, oseeImage);
+ }
+
+ public static Image getAnnotationImage(ArtifactAnnotation.Type annotationType) {
+ if (annotationType == ArtifactAnnotation.Type.Warning) {
+ return getImage(FrameworkImage.WARNING);
+ } else if (annotationType == ArtifactAnnotation.Type.Error) {
+ return getImage(FrameworkImage.ERROR);
+ }
+ return getImage(FrameworkImage.INFO_LG);
+ }
+
+ public static synchronized Image getImage(Artifact artifact) {
+ return instance.imageRegistry.get(instance.setupImage(artifact));
+ }
+
+ public static synchronized ImageDescriptor getImageDescriptor(Artifact artifact) {
+ return instance.imageRegistry.getDescriptor(instance.setupImage(artifact));
+ }
+
+ public static synchronized Image getProgramImage(String extension) {
+ return getImage(new ProgramImage(extension));
+ }
+
+ public static synchronized ImageDescriptor getProgramImageDescriptor(String extension) {
+ return getImageDescriptor(new ProgramImage(extension));
+ }
+
+ public static synchronized Image getImage(OseeImage imageEnum) {
+ return instance.imageRegistry.get(setupImage(imageEnum));
+ }
+
+ public static synchronized ImageDescriptor getImageDescriptor(OseeImage imageEnum) {
+ return instance.imageRegistry.getDescriptor(setupImage(imageEnum));
+ }
+
+ public static ImageDescriptor createImageDescriptor(String symbolicBundleName, String imagePath, String imageFileName) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(symbolicBundleName, imagePath + File.separator + imageFileName);
+ }
+
+ private synchronized String setupImage(Artifact artifact) {
+ try {
+ ArtifactImageProvider imageProvider = instance.providersOverrideImageMap.get(artifact.getArtifactType());
+ if (imageProvider != null) {
+ return imageProvider.setupImage(artifact);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return setupImageNoProviders(artifact);
+ }
+
+ protected static synchronized String setupImageNoProviders(Artifact artifact) {
+ OseeImage baseImageEnum = BaseImage.getBaseImageEnum(artifact);
+
+ if (AccessControlManager.hasLock(artifact)) {
+ OseeImage overlay =
+ AccessControlManager.getInstance().hasLockAccess(artifact) ? FrameworkImage.LOCKED_WITH_ACCESS : FrameworkImage.LOCKED_NO_ACCESS;
+ return setupImageWithOverlay(baseImageEnum, overlay, Location.TOP_LEFT);
+ }
+
+ try {
+ if (artifact.getMainAnnotationType() == ArtifactAnnotation.Type.Error) {
+ return setupImageWithOverlay(baseImageEnum, FrameworkImage.ERROR_OVERLAY, Location.BOT_LEFT);
+ } else if (artifact.getMainAnnotationType() == ArtifactAnnotation.Type.Warning) {
+ return setupImageWithOverlay(baseImageEnum, FrameworkImage.WARNING_OVERLAY, Location.BOT_LEFT);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return setupImage(baseImageEnum);
+ }
+
+ /**
+ * @param baseImageName must refer to an image that is already mapped to this key in the imageregistry
+ * @param overlay
+ * @param location
+ * @return the image registry key to the resulting image descriptor
+ * @throws OseeArgumentException
+ */
+ public static synchronized String setupImageWithOverlay(OseeImage baseImageEnum, OseeImage overlay, Location location) {
+ String baseImageName = setupImage(baseImageEnum);
+ String imageName = baseImageName + "_" + overlay.getImageKey();
+ if (instance.imageRegistry.getDescriptor(imageName) == null) {
+ Image baseImage = instance.imageRegistry.get(baseImageName);
+ ImageDescriptor overlayDescriptor = instance.imageRegistry.getDescriptor(setupImage(overlay));
+ instance.imageRegistry.put(imageName, new OverlayImage(baseImage, overlayDescriptor, location));
+ }
+ return imageName;
+ }
+
+ public static String setupImage(OseeImage imageEnum) {
+ return instance.setupImage(imageEnum.getImageKey(), imageEnum);
+ }
+
+ private synchronized String setupImage(String imageKey, OseeImage imageEnum) {
+ if (imageRegistry.getDescriptor(imageKey) == null) {
+ ImageDescriptor imageDescriptor = imageEnum.createImageDescriptor();
+ if (imageDescriptor == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format("Unable to load the image for [%s]",
+ imageEnum.toString()));
+ return setupImage(FrameworkImage.MISSING);
+ }
+ imageRegistry.put(imageKey, imageDescriptor);
+ }
+ return imageKey;
+ }
+
+ public static void setArtifactTypeImageInDb(ArtifactType artifactType, ByteArrayInputStream byteInput) throws OseeDataStoreException, IOException {
+ if (byteInput != null) {
+ ConnectionHandler.runPreparedUpdate("UPDATE osee_artifact_type SET image = ? where art_type_id = ?",
+ byteInput, artifactType.getArtTypeId());
+ } else {
+ ConnectionHandler.runPreparedUpdate("UPDATE osee_artifact_type SET image = ? where art_type_id = ?",
+ SQL3DataType.NULL, artifactType.getArtTypeId());
+ }
+ loadCache();
+ // TODO Need remote event kick to tell other clients of artifact type image changes
+ }
+
+ /**
+ * Loop through extensions to determine default artifact type image.
+ *
+ * @param artifactTypeName
+ * @throws OseeCoreException
+ */
+ public static OseeImage getArtifactTypeImage(String artifactTypeName) {
+ return instance.artifactTypeImageMap.get(artifactTypeName);
+ }
+
+ /**
+ * @param overrideImageEnum the overrideImageEnum to set
+ */
+ public static void setOverrideImageEnum(OseeImage overrideImageEnum) {
+ ImageManager.overrideImageEnum = overrideImageEnum;
+ }
+
+ /**
+ * @return the overrideImageEnum
+ */
+ public static OseeImage getOverrideImageEnum() {
+ return overrideImageEnum;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AbstractArtifactExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AbstractArtifactExtractor.java
new file mode 100644
index 00000000000..d14a503e15d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AbstractArtifactExtractor.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.framework.ui.skynet.Import;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class AbstractArtifactExtractor implements ArtifactExtractor {
+ private final ArrayList<RoughArtifact> roughArtifacts = new ArrayList<RoughArtifact>();
+ private final ArrayList<RoughRelation> roughRelations = new ArrayList<RoughRelation>();
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.ArtifactExtractor#getRoughArtifacts()
+ */
+ public List<RoughArtifact> getRoughArtifacts() {
+ return roughArtifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.ArtifactExtractor#getRoughRelations(osee.define.artifact.Import.RoughArtifact)
+ */
+ public List<RoughRelation> getRoughRelations(RoughArtifact parent) throws OseeCoreException {
+ determineParentChildRelations();
+
+ if (parent != null) {
+ for (RoughArtifact roughArtifact : roughArtifacts) {
+ if (!roughArtifact.hasParent()) {
+ parent.addChild(roughArtifact);
+ }
+ }
+ }
+ return roughRelations;
+ }
+
+ private void determineParentChildRelations() {
+ for (RoughArtifact roughArtifact : roughArtifacts) {
+ if (roughArtifact.hasHierarchicalRelation()) {
+ determineParentChildRelationsFor(roughArtifact);
+ }
+ }
+ }
+
+ private void determineParentChildRelationsFor(RoughArtifact roughReq) {
+ // find all children and then save then by their order
+ for (RoughArtifact otherRoughReq : roughArtifacts) {
+ if (roughReq != otherRoughReq) { // don't compare to self
+ if (roughReq.isChild(otherRoughReq)) {
+ roughReq.addChild(otherRoughReq);
+ }
+ }
+ }
+ }
+
+ public void addRoughArtifact(RoughArtifact roughArtifact) {
+ roughArtifacts.add(roughArtifact);
+ }
+
+ public void addRoughRelation(RoughRelation roughRelation) {
+ roughRelations.add(roughRelation);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactExtractor.java
new file mode 100644
index 00000000000..6a460c06d9c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactExtractor.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+public interface ArtifactExtractor {
+ /**
+ * called before getRoughArtifacts and getRoughRelations to discover the data that they will return
+ *
+ * @param artifactsFile file from which to extract artifact data
+ * @param branch
+ * @throws Exception
+ */
+ public abstract void discoverArtifactAndRelationData(File artifactsFile, Branch branch) throws Exception;
+
+ public abstract List<RoughArtifact> getRoughArtifacts() throws OseeCoreException;
+
+ public abstract List<RoughRelation> getRoughRelations(RoughArtifact potentialParent) throws OseeCoreException;
+
+ public abstract FileFilter getFileFilter();
+
+ public abstract String getName();
+
+ public abstract String getDescription();
+
+ public abstract boolean usesTypeList();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportOperation.java
new file mode 100644
index 00000000000..aa9f4a3ca73
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportOperation.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.Import;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.IOperation;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.ArtifactValidationCheckOperation;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class ArtifactImportOperation extends AbstractOperation {
+ private final File file;
+ private final IArtifactImportResolver artifactResolver;
+ private final ArtifactExtractor extractor;
+ private final ArrayList<RoughArtifact> roughArtifacts;
+ private final ArrayList<RoughRelation> roughRelations;
+ private final Branch branch;
+ private final Artifact importRoot;
+ private final RoughArtifact rootRoughArtifact;
+ private final boolean stopOnError = false;
+
+ public ArtifactImportOperation(File file, Artifact importRoot, ArtifactExtractor extractor, Branch branch, IArtifactImportResolver artifactResolver) throws OseeCoreException {
+ super("Importing Artifacts", SkynetGuiPlugin.PLUGIN_ID);
+ this.file = file;
+ this.extractor = extractor;
+ this.artifactResolver = artifactResolver;
+ this.roughArtifacts = new ArrayList<RoughArtifact>();
+ this.roughRelations = new ArrayList<RoughRelation>();
+ this.branch = branch;
+ this.importRoot = importRoot;
+ this.rootRoughArtifact = new RoughArtifact(importRoot);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ IOperation subOperation = new FindRoughArtifactsOperation("Convert File(s) to Rough Artifact");
+ doSubWork(subOperation, monitor, 0.10);
+
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+
+ subOperation = new ConvertToRealArtifacts("Rough to Real Artifact(s)", transaction);
+ doSubWork(subOperation, monitor, 0.50);
+
+ subOperation = new ArtifactValidationCheckOperation(importRoot.getDescendants(), stopOnError);
+ doSubWork(subOperation, monitor, 0.20);
+
+ importRoot.persistAttributesAndRelations(transaction);
+ monitor.subTask("Committing Transaction");
+ transaction.execute();
+ monitor.worked(calculateWork(0.20));
+ }
+
+ private final class ConvertToRealArtifacts extends AbstractOperation {
+ private final SkynetTransaction transaction;
+
+ public ConvertToRealArtifacts(String operationName, SkynetTransaction transaction) {
+ super(operationName, SkynetGuiPlugin.PLUGIN_ID);
+ this.transaction = transaction;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ monitor.setTaskName("Creating Artifacts");
+ int totalItems = roughArtifacts.size() + roughRelations.size();
+ int unitOfWork = calculateWork(totalItems / getTotalWorkUnits());
+
+ for (RoughArtifact roughArtifact : rootRoughArtifact.getChildren()) {
+ // the getReal call will recursively call get real on all descendants of roughArtifact
+ Artifact child = roughArtifact.getReal(transaction, monitor, artifactResolver);
+ if (child != null) {
+ importRoot.addChild(child);
+ }
+ monitor.worked(unitOfWork);
+ }
+
+ monitor.setTaskName("Creating Relations");
+ for (RoughRelation roughRelation : roughRelations) {
+ roughRelation.makeReal(transaction, monitor);
+ monitor.worked(unitOfWork);
+ }
+ }
+ }
+
+ private final class FindRoughArtifactsOperation extends AbstractOperation {
+
+ public FindRoughArtifactsOperation(String operationName) {
+ super(operationName, SkynetGuiPlugin.PLUGIN_ID);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ File[] files = file.isDirectory() ? file.listFiles(extractor.getFileFilter()) : new File[] {file};
+ extractArtifacts(files, rootRoughArtifact);
+ }
+
+ /**
+ * used recursively when originally passed a directory, thus an array of files is accepted
+ *
+ * @param files
+ * @param parentArtifact
+ * @throws Exception
+ */
+ private void extractArtifacts(File[] files, RoughArtifact parentArtifact) throws OseeCoreException {
+ for (File file : files) {
+ if (file.isFile()) {
+ try {
+ extractor.discoverArtifactAndRelationData(file, branch);
+ } catch (OseeCoreException ex) {
+ throw ex;
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ List<RoughArtifact> tempArtifacts = extractor.getRoughArtifacts();
+ roughArtifacts.addAll(tempArtifacts);
+ roughRelations.addAll(extractor.getRoughRelations(parentArtifact));
+
+ for (RoughArtifact roughArtifact : tempArtifacts) {
+ if (roughArtifact.getRoughParent() == null) {
+ parentArtifact.addChild(roughArtifact);
+ }
+ }
+ } else if (file.isDirectory()) {
+ RoughArtifact directoryArtifact = new RoughArtifact(RoughArtifactKind.CONTAINER, branch, file.getName());
+ roughArtifacts.add(directoryArtifact);
+ parentArtifact.addChild(directoryArtifact);
+
+ extractArtifacts(file.listFiles(extractor.getFileFilter()), directoryArtifact);
+ } else {
+ throw new OseeStateException(file + " is not a file or directory");
+ }
+ }
+ }
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportPage.java
new file mode 100644
index 00000000000..560d998ac77
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportPage.java
@@ -0,0 +1,459 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.Import;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.plugin.util.DirectoryOrFileSelector;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+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;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactImportPage extends WizardDataTransferPage {
+ public enum ImportMethod {
+ EXCEL, GENERAL, WHOLE_WORD, WORD_OUTLINE
+ };
+
+ public static final String PAGE_NAME = "osee.define.wizardPage.artifactImportPage";
+ private final Artifact destinationArtifact;
+ private List typeList;
+ private BranchSelectComposite branchSelectComposite;
+
+ private Button chkReuseArtifacts;
+ private Button radImportUnderDhRoot;
+ private Button radImportUnderNamedRootFolder;
+ private Button radImportUnderSelection;
+ private Text txtImportUnderFolderName;
+
+ private DirectoryOrFileSelector directoryFileSelector;
+ private final java.util.List<ObjectPair<ArtifactExtractor, Button>> extractors =
+ new ArrayList<ObjectPair<ArtifactExtractor, Button>>();
+ private File importResource;
+ private boolean built = false;
+
+ /**
+ * Constructor used by the Skynet drag-n-drop
+ */
+ public ArtifactImportPage(File importResource, Artifact reuseRootArtifact) {
+ super(PAGE_NAME);
+ Assert.isNotNull(importResource, "importResource can not be null");
+ Assert.isNotNull(reuseRootArtifact, "reuseRootArtifact can not be null");
+
+ this.importResource = importResource;
+ this.destinationArtifact = reuseRootArtifact;
+ }
+
+ /**
+ * Constructor that is used by the Eclipse framework
+ *
+ * @param pageName
+ * @param selection
+ */
+ public ArtifactImportPage(IStructuredSelection selection) {
+ super(PAGE_NAME);
+
+ this.importResource = null;
+ Artifact selectedArtifact = null;
+ if (selection != null && selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ Object resource = ((IAdaptable) firstElement).getAdapter(IResource.class);
+ if (resource instanceof IResource) {
+ importResource = ((IResource) resource).getLocation().toFile();
+ }
+ } else if (firstElement instanceof Artifact) {
+ selectedArtifact = (Artifact) firstElement;
+ }
+ }
+
+ this.destinationArtifact = selectedArtifact;
+ this.built = false;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ createSourceGroup(composite);
+
+ createOptionsGroup(composite);
+
+ built = true;
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ setDefaultBranch();
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+
+ updateWidgetEnablements();
+ }
+
+ private void createSourceGroup(Composite parent) {
+ createImportSource(parent);
+ createImportMethodSelection(parent);
+ setPageComplete(determinePageCompletion());
+ }
+
+ /**
+ * For DND the branch selected should be set from destination artifact.
+ */
+ private void setDefaultBranch() {
+ if (destinationArtifact != null) {
+ Branch branch = destinationArtifact.getBranch();
+ branchSelectComposite.setSelected(branch);
+ }
+ }
+
+ private void createImportSource(Composite parent) {
+
+ directoryFileSelector = new DirectoryOrFileSelector(parent, SWT.NONE, "Import Source", this);
+
+ if (importResource == null) {
+ // Select directory as the default
+ directoryFileSelector.setDirectorySelected(true);
+ } else {
+ directoryFileSelector.setDirectorySelected(!importResource.isFile());
+ directoryFileSelector.setText(importResource.getAbsolutePath());
+ }
+
+ Group composite = new Group(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ radImportUnderDhRoot = new Button(composite, SWT.RADIO);
+ radImportUnderDhRoot.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false, 2, 1));
+ radImportUnderDhRoot.setText("Add to Default Hierarchy Root");
+ radImportUnderDhRoot.setToolTipText("All the top level artifacts that are imported " + "will become root level children.");
+ radImportUnderDhRoot.addListener(SWT.Selection, this);
+
+ radImportUnderNamedRootFolder = new Button(composite, SWT.RADIO);
+ radImportUnderNamedRootFolder.setText("Add to Root Level Folder:");
+ radImportUnderNamedRootFolder.setToolTipText("All the top level artifacts that are imported " + "will become children of the named folder at the root level.");
+ radImportUnderNamedRootFolder.addListener(SWT.Selection, this);
+ txtImportUnderFolderName = new Text(composite, SWT.BORDER);
+ txtImportUnderFolderName.setText("Recent Imports");
+ txtImportUnderFolderName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ radImportUnderSelection = new Button(composite, SWT.RADIO);
+ radImportUnderSelection.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false, 2, 1));
+ radImportUnderSelection.setText("Add to Selected Artifact:" + destinationArtifact);
+ radImportUnderSelection.setToolTipText("All the top level artifacts that are imported " + "will become children of the selected artifact.");
+ radImportUnderSelection.addListener(SWT.Selection, this);
+ radImportUnderSelection.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (radImportUnderSelection.getSelection()) {
+ Branch branch = destinationArtifact.getBranch();
+ branchSelectComposite.setSelected(branch);
+ populateTypeList(branch);
+ }
+ }
+ });
+
+ chkReuseArtifacts = new Button(composite, SWT.CHECK);
+ chkReuseArtifacts.addListener(SWT.Selection, this);
+ chkReuseArtifacts.setText("Re-use Artifacts");
+ chkReuseArtifacts.setEnabled(true);
+ chkReuseArtifacts.setToolTipText("All imported artifacts will be checked against the root\n" + "import artifact and the content will be placed on the artifact\n" + "that has the same identifying attributes and level from the root");
+
+ chkReuseArtifacts.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));
+
+ // Setup initial selections
+ chkReuseArtifacts.setSelection(false);
+ if (destinationArtifact == null) {
+ radImportUnderDhRoot.setSelection(true);
+ } else {
+ radImportUnderSelection.setSelection(true);
+ }
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ return directoryFileSelector.validate(this);
+ }
+
+ @Override
+ protected void createOptionsGroup(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Options");
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout(2, false));
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setText("Branch:");
+ label.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+
+ label = new Label(composite, SWT.NONE);
+ label.setText("Artifact Type:");
+ label.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+
+ branchSelectComposite = new BranchSelectComposite(composite, SWT.BORDER, false);
+
+ typeList = new List(composite, SWT.BORDER | SWT.V_SCROLL);
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 300;
+ typeList.setLayoutData(gridData);
+
+ populateTypeList(destinationArtifact != null ? destinationArtifact.getBranch() : null);
+ // Start out with an item selected
+ typeList.setSelection(0);
+
+ final ArtifactImportPage page = this;
+ branchSelectComposite.addListener(new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ populateTypeList(branchSelectComposite.getSelectedBranch());
+ page.handleEvent(event);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
+ */
+ @Override
+ public boolean canFlipToNextPage() {
+ return super.canFlipToNextPage() && branchSelectComposite.getSelectedBranch() != null;
+ }
+
+ private void populateTypeList(Branch branch) {
+ if (branch == null) {
+ typeList.removeAll();
+ typeList.add("Select a Branch to Populate List");
+ return;
+ }
+ try {
+ String[] selection = typeList.getSelection();
+ typeList.removeAll();
+ ArrayList<ArtifactType> validArtifactTypes =
+ new ArrayList<ArtifactType>(TypeValidityManager.getValidArtifactTypes(branch));
+ Collections.sort(validArtifactTypes);
+ for (ArtifactType descriptor : validArtifactTypes) {
+ typeList.add(descriptor.getName());
+ typeList.setData(descriptor.getName(), descriptor);
+ }
+ typeList.setSelection(selection);
+ // If the item wasn't available in the new list
+ if (typeList.getSelectionCount() == 0) {
+ typeList.select(0);
+ }
+ typeList.showSelection();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ typeList.add("error loading artifact types");
+ }
+ }
+
+ private void createImportMethodSelection(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Import Method");
+ composite.setToolTipText("Select the method to be used for importing the selected file or directory");
+ GridLayout layout = new GridLayout(2, true);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ ExtensionDefinedObjects<ArtifactExtractor> definedObjects =
+ new ExtensionDefinedObjects<ArtifactExtractor>("org.eclipse.osee.framework.ui.skynet.ArtifactExtractor",
+ "ArtifactExtractor", "class");
+ java.util.List<ArtifactExtractor> artifactExtractors = definedObjects.getObjects();
+ for (ArtifactExtractor artifactExtractor : artifactExtractors) {
+ Button extractorButton = new Button(composite, SWT.RADIO);
+ extractorButton.setText(artifactExtractor.getName());
+ extractorButton.setToolTipText(artifactExtractor.getDescription());
+ extractorButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 1, 1));
+ extractorButton.addListener(SWT.Selection, this);
+ if (artifactExtractor.getName().equals("Word Outline")) {
+ extractorButton.setSelection(true);
+ }
+ extractors.add(new ObjectPair<ArtifactExtractor, Button>(artifactExtractor, extractorButton));
+ }
+
+ /* radWordOutlineExtractor = new Button(composite, SWT.RADIO);
+ radWordOutlineExtractor.setText("Word Outline");
+ radWordOutlineExtractor.setToolTipText(WordOutlineExtractor.getDescription());
+ radWordOutlineExtractor.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 1, 1));
+ radWordOutlineExtractor.addListener(SWT.Selection, this);
+
+ radWholeWordExtractor = new Button(composite, SWT.RADIO);
+ radWholeWordExtractor.setText("Whole Word Document");
+ radWholeWordExtractor.setToolTipText(WholeWordDocumentExtractor.getDescription());
+ radWholeWordExtractor.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 1, 1));
+ radWholeWordExtractor.addListener(SWT.Selection, this);
+
+ radExcelExtractor = new Button(composite, SWT.RADIO);
+ radExcelExtractor.setText("Excel XML Artifacts");
+ radExcelExtractor.setToolTipText(ExcelArtifactExtractor.getDescription());
+ radExcelExtractor.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 1, 1));
+ radExcelExtractor.addListener(SWT.Selection, this);
+
+ radGeneralExtractor = new Button(composite, SWT.RADIO);
+ radGeneralExtractor.setText("General Documents (Any Format)");
+ radGeneralExtractor.setToolTipText(NativeDocumentExtractor.getDescription());
+ radGeneralExtractor.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 1, 1));
+ radGeneralExtractor.addListener(SWT.Selection, this);
+
+ radWordOutlineExtractor.setSelection(true);*/
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return true;
+ }
+
+ public File getImportFile() {
+ return directoryFileSelector.getFile();
+ }
+
+ public ArtifactType getSelectedType() {
+ String itemName = typeList.getItem(typeList.getSelectionIndex());
+ return (ArtifactType) typeList.getData(itemName);
+ }
+
+ public Branch getSelectedBranch() {
+ if (chkReuseArtifacts.getSelection()) {
+ return destinationArtifact.getBranch();
+ } else {
+ return branchSelectComposite.getSelectedBranch();
+ }
+ }
+
+ public Artifact getImportRoot() throws OseeCoreException {
+ Artifact importRoot;
+
+ if (radImportUnderDhRoot.getSelection()) {
+ importRoot = ArtifactQuery.getDefaultHierarchyRootArtifact(getSelectedBranch());
+ } else if (radImportUnderNamedRootFolder.getSelection()) {
+ importRoot =
+ ArtifactQuery.getDefaultHierarchyRootArtifact(getSelectedBranch()).getChild(
+ txtImportUnderFolderName.getText());
+ } else if (radImportUnderSelection.getSelection()) {
+ importRoot = destinationArtifact;
+ } else {
+ throw new IllegalStateException("One of the 3 radio buttons should be selected.");
+ }
+
+ return importRoot;
+ }
+
+ public Artifact getReuseArtifactRoot() {
+ if (chkReuseArtifacts.getSelection()) {
+ return destinationArtifact;
+ }
+ return null;
+ }
+
+ /*
+ * The page may not be init'd here
+ */
+ @Override
+ protected void updateWidgetEnablements() {
+ super.updateWidgetEnablements();
+
+ if (built) {
+ branchSelectComposite.setEnabled(!radImportUnderSelection.getSelection());
+
+ txtImportUnderFolderName.setEnabled(false);// TODO future development
+ radImportUnderSelection.setEnabled(destinationArtifact != null);
+
+ for (ObjectPair<ArtifactExtractor, Button> extractor : extractors) {
+ if (extractor.object2.getSelection()) {
+ typeList.setEnabled(extractor.object1.usesTypeList());
+ }
+ }
+ }
+ }
+
+ public ArtifactExtractor getExtractor() throws OseeStateException {
+ for (ObjectPair<ArtifactExtractor, Button> extractor : extractors) {
+ if (extractor.object2.getSelection()) {
+ return extractor.object1;
+ }
+ }
+ throw new OseeStateException("No artifact extractor has been selected");
+ }
+
+ public boolean needsSecondaryPage() throws OseeStateException {
+ return getExtractor().getName().equals("Word Outline");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportWizard.java
new file mode 100644
index 00000000000..a0612e0e5b8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ArtifactImportWizard.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactImportWizard extends Wizard implements IImportWizard {
+ private static final String TITLE = "Import artifacts into OSEE";
+ private ArtifactImportPage mainPage;
+ private AttributeTypePage attributeTypePage;
+ private OutlineContentHandlerPage handlerPage;
+ private File importFile;
+ private Artifact reuseRootArtifact;
+
+ public ArtifactImportWizard() {
+ super();
+ setDialogSettings(SkynetGuiPlugin.getInstance().getDialogSettings());
+ setWindowTitle("Artifact Import Wizard");
+ }
+
+ public void setImportResourceAndArtifactDestination(File importFile, Artifact reuseRootArtifact) {
+ Assert.isNotNull(importFile);
+ Assert.isNotNull(reuseRootArtifact);
+
+ this.importFile = importFile;
+ this.reuseRootArtifact = reuseRootArtifact;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ File file = mainPage.getImportFile();
+ Branch branch = mainPage.getSelectedBranch();
+ IArtifactImportResolver artifactResolver = null;
+
+ try {
+ Artifact reuseArtifactRoot = mainPage.getReuseArtifactRoot();
+ ArtifactExtractor extractor = mainPage.getExtractor();
+ ArtifactType primaryArtifactType = extractor.usesTypeList() ? mainPage.getSelectedType() : null;
+ ArtifactType secondaryArtifactType = ArtifactTypeManager.getType("Heading");
+
+ if (reuseArtifactRoot == null) {
+ artifactResolver = new NewArtifactImportResolver(primaryArtifactType, secondaryArtifactType);
+ } else { // only non-null when reuse artifacts is checked
+ Collection<AttributeType> identifyingAttributes = attributeTypePage.getSelectedAttributeDescriptors();
+ artifactResolver =
+ new RootAndAttributeBasedArtifactResolver(primaryArtifactType, secondaryArtifactType,
+ identifyingAttributes, false);
+ }
+
+ Artifact importRoot = mainPage.getImportRoot();
+ Jobs.runInJob(new ArtifactImportOperation(file, importRoot, extractor, branch, artifactResolver), true);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, "Exception occured during artifact import", ex);
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ if (importFile != null && reuseRootArtifact != null) {
+ this.mainPage = new ArtifactImportPage(importFile, reuseRootArtifact);
+ } else {
+ this.mainPage = new ArtifactImportPage(selection);
+ }
+ this.attributeTypePage = new AttributeTypePage();
+ this.handlerPage = new OutlineContentHandlerPage();
+
+ mainPage.setTitle(TITLE);
+ mainPage.setDescription("Import artifacts into Define");
+ attributeTypePage.setTitle(TITLE);
+ handlerPage.setTitle(TITLE);
+ handlerPage.setDescription("Handler to use for getting Artifacts from the outline");
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ public void addPages() {
+ addPage(mainPage);
+ addPage(attributeTypePage);
+ addPage(handlerPage);
+ }
+
+ @Override
+ public IWizardPage getNextPage(IWizardPage page) {
+ try {
+ if (page == mainPage && mainPage.getReuseArtifactRoot() != null) {
+
+ ArtifactType rootDescriptor = mainPage.getReuseArtifactRoot().getArtifactType();
+ ArtifactType importDescriptor = mainPage.getSelectedType();
+
+ HashSet<AttributeType> rootAttributes =
+ new HashSet<AttributeType>(TypeValidityManager.getAttributeTypesFromArtifactType(rootDescriptor,
+ mainPage.getSelectedBranch()));
+
+ if (rootDescriptor == importDescriptor) {
+ attributeTypePage.setDescription("Identifying attributes for " + rootDescriptor.getName() + " artifacts");
+ attributeTypePage.setDescriptors(rootAttributes);
+ } else {
+ HashSet<AttributeType> importAttributes =
+ new HashSet<AttributeType>(TypeValidityManager.getAttributeTypesFromArtifactType(importDescriptor,
+ mainPage.getSelectedBranch()));
+
+ attributeTypePage.setDescription("Identifying attributes common to " + rootDescriptor.getName() + " and " + importDescriptor.getName() + " artifacts");
+
+ importAttributes.addAll(rootAttributes);
+ attributeTypePage.setDescriptors(importAttributes);
+ }
+
+ return attributeTypePage;
+ } else if (mainPage.needsSecondaryPage() && page != handlerPage) {
+ return handlerPage;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ if (page == attributeTypePage || (page == handlerPage && mainPage.getReuseArtifactRoot() == null)) {
+ return mainPage;
+ } else if (page == handlerPage) {
+ return attributeTypePage;
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean canFinish() {
+ try {
+ return mainPage.isPageComplete() && (mainPage.getReuseArtifactRoot() == null || attributeTypePage.isPageComplete()) && (!mainPage.needsSecondaryPage() || handlerPage.isPageComplete());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AttributeTypePage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AttributeTypePage.java
new file mode 100644
index 00000000000..c61583b645f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/AttributeTypePage.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.skynet.Import;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class AttributeTypePage extends WizardDataTransferPage implements Listener {
+ public static final String PAGE_NAME = "osee.define.wizardPage.attributeTypePage";
+ private List typeList;
+ private boolean hasDescriptors;
+
+ /**
+ * @param descriptors Available descriptors to select from
+ */
+ public AttributeTypePage() {
+ super(PAGE_NAME);
+
+ hasDescriptors = false;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ createOptionsGroup(composite);
+
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all
+ * events and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+
+ updateWidgetEnablements();
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ protected void createOptionsGroup(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Attribute Types");
+ composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout(1, true));
+
+ typeList = new List(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
+ typeList.addListener(SWT.Selection, this);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 300;
+ typeList.setLayoutData(gridData);
+
+ }
+
+ /**
+ * @param descriptors the descriptors to set
+ */
+ public void setDescriptors(Collection<AttributeType> descriptors) {
+ java.util.List<AttributeType> sortedDescriptors =
+ new ArrayList<AttributeType>(descriptors);
+ Collections.sort(sortedDescriptors, new Comparator<AttributeType>() {
+ public int compare(AttributeType o1, AttributeType o2) {
+ return o1.getName().compareToIgnoreCase(o2.getName());
+ }
+ });
+
+ String[] selection = typeList.getSelection();
+ typeList.removeAll();
+
+ hasDescriptors = !sortedDescriptors.isEmpty();
+ if (hasDescriptors) {
+ for (AttributeType descriptor : sortedDescriptors) {
+ typeList.add(descriptor.getName());
+ typeList.setData(descriptor.getName(), descriptor);
+ }
+ } else {
+ typeList.add("<No Attribute Types>");
+ }
+
+ // Restore any prior selections
+ typeList.setSelection(selection);
+ typeList.getParent().pack(true);
+ }
+
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+
+ public Collection<AttributeType> getSelectedAttributeDescriptors() {
+ Collection<AttributeType> selectedAttributeDescriptors =
+ new ArrayList<AttributeType>(typeList.getSelectionCount());
+
+ if (hasDescriptors) {
+ for (String attributeName : typeList.getSelection()) {
+ selectedAttributeDescriptors.add((AttributeType) typeList.getData(attributeName));
+ }
+ }
+
+ return selectedAttributeDescriptors;
+ }
+
+ @Override
+ protected boolean validateOptionsGroup() {
+ return hasDescriptors && typeList.getSelectionCount() > 0;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/BranchImportPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/BranchImportPage.java
new file mode 100644
index 00000000000..1ddccc45fff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/BranchImportPage.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.Import;
+
+import java.io.File;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.FileSelector;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BranchImportPage extends WizardDataTransferPage {
+ public enum ImportMethod {
+ EXCEL, GENERAL, POWER_POINT, WHOLE_WORD, WORD_OUTLINE, VISIO
+ };
+
+ public static final String PAGE_NAME = "osee.define.wizardPage.artifactImportPage";
+
+ private Button chkIncludeMainLevelBranch;
+ private Button chkIncludeDescendantBranches;
+ private FileSelector fileSelector;
+ private List branchList;
+
+ private File importResource;
+ private final Branch destinationBranch;
+
+ /**
+ * Constructor used by the Skynet drag-n-drop
+ */
+ public BranchImportPage(File importResource, Branch destinationBranch) {
+ super(PAGE_NAME);
+ if (importResource == null) throw new IllegalArgumentException("importResource can not be null");
+ if (destinationBranch == null) throw new IllegalArgumentException("destinationBranch can not be null");
+
+ // Assert.isNotNull(importResource, "importResource");
+ // Assert.isNotNull(reuseRootArtifact, "reuseRootArtifact");
+
+ this.importResource = importResource;
+ this.destinationBranch = destinationBranch;
+ }
+
+ /**
+ * Constructor that is used by the Eclipse framework
+ *
+ * @param pageName
+ * @param selection
+ */
+ public BranchImportPage(IStructuredSelection selection) {
+ super(PAGE_NAME);
+
+ this.importResource = null;
+ Branch selectedBranch = null;
+ if (selection != null && selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) firstElement;
+ Object adapter = adaptable.getAdapter(IResource.class);
+ if (adapter instanceof IResource) {
+ importResource = ((IResource) adapter).getLocation().toFile();
+ }
+ adapter = adaptable.getAdapter(Branch.class);
+ if (adapter instanceof Branch) {
+ selectedBranch = (Branch) adapter;
+ }
+ }
+ }
+ this.destinationBranch = selectedBranch;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ createSourceGroup(composite);
+
+ createOptionsGroup(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+
+ updateWidgetEnablements();
+ }
+
+ private void createSourceGroup(Composite parent) {
+ createImportSource(parent);
+ setPageComplete(determinePageCompletion());
+ }
+
+ private void createImportSource(Composite parent) {
+
+ fileSelector = new FileSelector(parent, SWT.NONE, "Import Source", this);
+
+ Group composite = new Group(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ chkIncludeMainLevelBranch = new Button(composite, SWT.CHECK);
+ chkIncludeMainLevelBranch.addListener(SWT.Selection, this);
+ chkIncludeMainLevelBranch.setText("Main Level Branch");
+ chkIncludeMainLevelBranch.setToolTipText("Import the main level branch from the import file");
+ chkIncludeMainLevelBranch.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false));
+
+ chkIncludeDescendantBranches = new Button(composite, SWT.CHECK);
+ chkIncludeDescendantBranches.addListener(SWT.Selection, this);
+ chkIncludeDescendantBranches.setText("Descendant Branches");
+ chkIncludeDescendantBranches.setToolTipText("Import the desendant branches from the import file");
+ chkIncludeDescendantBranches.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false));
+
+ // Setup initial selections
+ chkIncludeMainLevelBranch.setSelection(true);
+ chkIncludeDescendantBranches.setSelection(true);
+
+ if (importResource != null) {
+ fileSelector.setText(importResource.getAbsolutePath());
+ }
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ return fileSelector.validate(this) && (chkIncludeDescendantBranches.getSelection() || chkIncludeMainLevelBranch.getSelection());
+ }
+
+ protected void createOptionsGroup(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Destination");
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout(1, true));
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setText("Branch:");
+ label.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+
+ branchList = new List(composite, SWT.BORDER | SWT.V_SCROLL);
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 300;
+ branchList.setLayoutData(gridData);
+
+ if (destinationBranch != null) {
+
+ try {
+ int defaultBranchIndex = 0;
+ for (Branch branch : BranchManager.getNormalBranches()) {
+ branchList.add(branch.getBranchName());
+ branchList.setData(branch.getBranchName(), branch);
+ if (branch.equals(destinationBranch)) {
+ branchList.select(defaultBranchIndex);
+ } else {
+ defaultBranchIndex++;
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return true;
+ }
+
+ public File getImportFile() {
+ return fileSelector.getFile();
+ }
+
+ /**
+ * @return returns the selectedBranch
+ */
+ public Branch getSelectedBranch() {
+ String itemName = branchList.getItem(branchList.getSelectionIndex());
+ return (Branch) branchList.getData(itemName);
+ }
+
+ /**
+ * @return returns the includeMainLevelBranch
+ */
+ public boolean isIncludeMainLevelBranch() {
+ return chkIncludeMainLevelBranch.getSelection();
+ }
+
+ /**
+ * @return returns the includeDescendantBranches
+ */
+ public boolean isIncludeDescendantBranches() {
+ return chkIncludeDescendantBranches.getSelection();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ExcelArtifactExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ExcelArtifactExtractor.java
new file mode 100644
index 00000000000..1413eb2747a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ExcelArtifactExtractor.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.DoubleKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExcelArtifactExtractor extends AbstractArtifactExtractor implements RowProcessor {
+ private String[] headerRow;
+ private ArtifactType primaryDescriptor;
+ private boolean importingRelations;
+ private int rowCount;
+ private DoubleKeyHashMap<String, Integer, RoughArtifact> relationHelper =
+ new DoubleKeyHashMap<String, Integer, RoughArtifact>();
+ private static final Pattern guidPattern = Pattern.compile("(\\d*);(.*)");
+ private final Matcher guidMatcher = guidPattern.matcher("");
+ private Branch branch;
+
+ public String getDescription() {
+ return "Extract each row as an artifact - header <section #, atrribute1, atrribute2 ...>";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] headerRow) {
+ rowCount++;
+ this.headerRow = headerRow.clone();
+ for (int i = 0; i < this.headerRow.length; i++) {
+ if (headerRow[i] != null && headerRow[i].trim().length() == 0) {
+ this.headerRow[i] = null;
+ }
+ }
+ }
+
+ /**
+ * import Artifacts
+ *
+ * @param row
+ */
+ public void processRow(String[] row) {
+ rowCount++;
+ if (importingRelations) {
+ String guida = null;
+ String guidb = null;
+ try {
+ guida = getGuid(row[1]);
+ guidb = getGuid(row[2]);
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+
+ if (guida == null || guidb == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "we failed to add a relation because at least on of its guids are null");
+ }
+ addRoughRelation(new RoughRelation(row[0], guida, guidb, row[5], Integer.parseInt(row[3]),
+ Integer.parseInt(row[4])));
+ } else {
+ RoughArtifact roughArtifact = new RoughArtifact(RoughArtifactKind.PRIMARY, branch);
+ for (int i = 0; i < row.length; i++) {
+ if (headerRow[i] == null) continue;
+ if (headerRow[i].equalsIgnoreCase("Outline Number")) {
+ if (row[i] == null) {
+ throw new IllegalArgumentException("Outline Number must not be blank");
+ }
+ roughArtifact.setSectionNumber(row[i]);
+ } else if (headerRow[i].equalsIgnoreCase("GUID")) {
+ roughArtifact.setGuid(row[i]);
+ } else if (headerRow[i].equalsIgnoreCase("Human Readable Id")) {
+ roughArtifact.setHumandReadableId(row[i]);
+ } else {
+ roughArtifact.addAttribute(headerRow[i], row[i]);
+ }
+ }
+ addRoughArtifact(roughArtifact);
+
+ relationHelper.put(primaryDescriptor.getName(), new Integer(rowCount), roughArtifact);
+ }
+ }
+
+ /**
+ * @param string
+ * @throws Exception
+ */
+ private String getGuid(String string) {
+ if (GUID.isValid(string)) {//it may be real guid
+ return string;
+ }
+ guidMatcher.reset(string);
+ if (guidMatcher.matches()) {
+ Integer row = Integer.parseInt(guidMatcher.group(1));
+ String sheet = guidMatcher.group(2);
+ RoughArtifact artifact = relationHelper.get(sheet, row);
+ return artifact.getGuid();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.ArtifactExtractor#discoverArtifactAndRelationData(java.io.File)
+ */
+ public void discoverArtifactAndRelationData(File artifactsFile, Branch branch) throws Exception {
+ this.branch = branch;
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(new ExcelSaxHandler(this, true));
+ xmlReader.parse(new InputSource(new InputStreamReader(new FileInputStream(artifactsFile), "UTF-8")));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processEmptyRow()
+ */
+ public void processEmptyRow() {
+ rowCount++;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ rowCount++;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.Import.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.RowProcessor#detectedTotalRowCount(int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ rowCount = 0;
+ try {
+ if (sheetName.equals("relations")) {
+ importingRelations = true;
+ return;
+ }
+ primaryDescriptor = ArtifactTypeManager.getType(sheetName);
+ if (primaryDescriptor == null) {
+ throw new OseeArgumentException("The sheet name: " + sheetName + " is not a valid artifact type name.");
+ }
+ } catch (OseeCoreException ex) {
+ throw new IllegalArgumentException("The sheet name: " + sheetName + " is not a valid artifact type name: ", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ public FileFilter getFileFilter() {
+ return new FileFilter() {
+ public boolean accept(File file) {
+ return file.isDirectory() || (file.isFile() && file.getName().endsWith(".xml"));
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "Excel XML Artifacts";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IArtifactImportResolver.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IArtifactImportResolver.java
new file mode 100644
index 00000000000..0746a85550f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IArtifactImportResolver.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.framework.ui.skynet.Import;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * Used during imports that ask for artifact re-use to resolve the Artifact to be used for a particular RoughArtifact
+ *
+ * @author Robert A. Fisher
+ */
+public interface IArtifactImportResolver {
+
+ public Artifact resolve(RoughArtifact roughArtifact) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IWordOutlineContentHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IWordOutlineContentHandler.java
new file mode 100644
index 00000000000..77bf272c4d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/IWordOutlineContentHandler.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.framework.ui.skynet.Import;
+
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IWordOutlineContentHandler extends IExecutableExtension {
+
+ /**
+ * Opportunity to setup state data prior to an outline being processed. This method may be called many times on the
+ * same object.
+ *
+ * @param extractor The extractor where RoughArtifacts that are created can be added to
+ */
+ public void init(WordOutlineExtractor extractor);
+
+ /**
+ * Opportunity to release resources. This method may be called many times on the same object.
+ */
+ public void dispose();
+
+ /**
+ * Provides a name that can be displayed in the UI for the user to make a decision on which extension point should be
+ * used.
+ */
+ public String getName();
+
+ /**
+ * Called as content is parsed out of a WordML source. A typical action to take would be to create a RoughArtifact
+ * and initialize it with data from the content, or to append the content to the last, or a prior created
+ * RoughArtifact.
+ *
+ * @param forceBody
+ * @param forcePrimaryType
+ * @param headerNumber
+ * @param listIdentifier
+ * @param paragraphStyle
+ * @param content
+ * @param isParagraph
+ * @param branch TODO
+ */
+ public void processContent(boolean forceBody, boolean forcePrimaryType, String headerNumber, String listIdentifier, String paragraphStyle, String content, boolean isParagraph, Branch branch);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaJob.java
new file mode 100644
index 00000000000..273fd1e6cdc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaJob.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import java.io.FileInputStream;
+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.io.ExtensionFilter;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.importing.DbOseeDataTypeProcessor;
+import org.eclipse.osee.framework.skynet.core.importing.ExcelOseeTypeDataParser;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Robert A. Fisher
+ * @author Jeff C. Phillips
+ */
+public class ImportMetaJob extends Job {
+ private final Branch branch;
+ private final File file;
+
+ public ImportMetaJob(File file, Branch branch) {
+ super("Importing OSEE Types");
+ this.branch = branch;
+ this.file = file;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ ExcelOseeTypeDataParser importer = new ExcelOseeTypeDataParser(new DbOseeDataTypeProcessor());
+ if (file.isFile()) {
+ monitor.beginTask("Importing " + file.getName(), 2);
+ importer.extractTypesFromSheet(new FileInputStream(file));
+ monitor.worked(1);
+ } else if (file.isDirectory()) {
+ File[] children = file.listFiles(new ExtensionFilter(".xml"));
+ monitor.beginTask("Importing files", children.length + 1);
+ for (File childFile : children) {
+ if (monitor.isCanceled()) {
+ monitor.done();
+ return Status.CANCEL_STATUS;
+ }
+
+ monitor.subTask(childFile.getName());
+ importer.extractTypesFromSheet(new FileInputStream(childFile));
+ monitor.worked(1);
+ }
+ }
+ if (monitor.isCanceled()) {
+ monitor.done();
+ return Status.CANCEL_STATUS;
+ }
+
+ monitor.subTask("Finalizing");
+ importer.finish();
+ monitor.done();
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaPage.java
new file mode 100644
index 00000000000..ad3af9bdd4e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaPage.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.DirectoryOrFileSelector;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Robert A. Fisher
+ * @author Jeff C. Phillips
+ */
+public class ImportMetaPage extends WizardDataTransferPage {
+ public static final String PAGE_NAME = "osee.define.wizardPage.importMetaPage";
+
+ private DirectoryOrFileSelector directoryFileSelector;
+ private BranchSelectComposite branchSelectComposite;
+
+ private IResource currentResourceSelection;
+
+ /**
+ * @param name
+ * @param selection
+ */
+ public ImportMetaPage(IStructuredSelection selection) {
+ super(PAGE_NAME);
+
+ if (selection != null && selection.size() == 1) {
+ Object firstElement = selection.getFirstElement();
+ if (firstElement instanceof IAdaptable) {
+ currentResourceSelection = (IResource) ((IAdaptable) firstElement).getAdapter(IResource.class);
+ }
+ }
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ composite.setFont(parent.getFont());
+
+ createSourceGroup(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+ }
+
+ protected void createSourceGroup(Composite parent) {
+ directoryFileSelector = new DirectoryOrFileSelector(parent, SWT.NONE, "Import Source", this);
+
+ if (currentResourceSelection == null) {
+ // Select directory as the default
+ directoryFileSelector.setDirectorySelected(true);
+ } else {
+ directoryFileSelector.setDirectorySelected(currentResourceSelection.getType() != IResource.FILE);
+ directoryFileSelector.setText(currentResourceSelection.getLocation().toString());
+ }
+
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Destination Branch");
+ GridLayout gd = new GridLayout();
+ composite.setLayout(gd);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ branchSelectComposite = new BranchSelectComposite(composite, SWT.BORDER, false);
+
+ setPageComplete(determinePageCompletion());
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ return directoryFileSelector.validate(this);
+ }
+
+ public File getImportFile() {
+ return directoryFileSelector.getFile();
+ }
+
+ public Branch getSelectedBranch() {
+ return branchSelectComposite.getSelectedBranch();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaWizard.java
new file mode 100644
index 00000000000..8af70989c83
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ImportMetaWizard.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Robert A. Fisher
+ * @author Jeff C. Phillips
+ */
+public class ImportMetaWizard extends Wizard implements IImportWizard {
+ private ImportMetaPage mainPage;
+ private IStructuredSelection selection;
+
+ /**
+ *
+ */
+ public ImportMetaWizard() {
+ super();
+ setWindowTitle("OSEE Types Import Wizard");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ Branch branch = mainPage.getSelectedBranch();
+ File file = mainPage.getImportFile();
+ Jobs.startJob(new ImportMetaJob(file, branch));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "OSEE Import Error", ex);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ @Override
+ public void addPages() {
+ mainPage = new ImportMetaPage(selection);
+ mainPage.setTitle("Import OSEE Types");
+ mainPage.setDescription("Import OSEE Types");
+
+ addPage(mainPage);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NativeDocumentExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NativeDocumentExtractor.java
new file mode 100644
index 00000000000..0f1a4707859
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NativeDocumentExtractor.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+
+public class NativeDocumentExtractor extends AbstractArtifactExtractor {
+
+ public String getDescription() {
+ return "Extract the content of each native document as one artifact";
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.ArtifactExtractor#discoverArtifactAndRelationData(java.io.File)
+ */
+ public void discoverArtifactAndRelationData(File importFile, Branch branch) throws Exception {
+ RoughArtifact roughArtifact =
+ new RoughArtifact(RoughArtifactKind.PRIMARY, branch, Lib.removeExtension(importFile.getName()));
+ addRoughArtifact(roughArtifact);
+ roughArtifact.addAttribute("Extension", Lib.getExtension(importFile.getName()));
+ roughArtifact.addFileAttribute(NativeArtifact.CONTENT_NAME, importFile);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ public FileFilter getFileFilter() {
+ return new FileFilter() {
+ public boolean accept(File file) {
+ return true;
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "General Documents (Any Format)";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NewArtifactImportResolver.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NewArtifactImportResolver.java
new file mode 100644
index 00000000000..15ec719dc90
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/NewArtifactImportResolver.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.framework.ui.skynet.Import;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactProcessor;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class NewArtifactImportResolver implements IArtifactImportResolver {
+ private ArtifactType primaryArtifactType;
+ private ArtifactType secondaryArtifactType;
+
+ public NewArtifactImportResolver(ArtifactType primaryArtifactType, ArtifactType secondaryArtifactType) {
+ this.primaryArtifactType = primaryArtifactType;
+ this.secondaryArtifactType = secondaryArtifactType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.IArtifactImportResolver#resolve(org.eclipse.osee.framework.ui.skynet.Import.RoughArtifact)
+ */
+ public Artifact resolve(final RoughArtifact roughArtifact) throws OseeCoreException {
+ ArtifactType artifactType = null;
+ if (roughArtifact.getRoughArtifactKind() == RoughArtifactKind.PRIMARY) {
+ artifactType = primaryArtifactType;
+ } else if (roughArtifact.getRoughArtifactKind() == RoughArtifactKind.SECONDARY) {
+ artifactType = secondaryArtifactType;
+ } else if (roughArtifact.getRoughArtifactKind() == RoughArtifactKind.CONTAINER) {
+ artifactType = ArtifactTypeManager.getType("Folder");
+ }
+
+ Artifact realArtifact =
+ artifactType.getFactory().makeNewArtifact(roughArtifact.getBranch(), artifactType, roughArtifact.getGuid(),
+ roughArtifact.getHumandReadableId(), new ArtifactProcessor() {
+ @Override
+ public void run(Artifact artifact) throws OseeCoreException {
+ roughArtifact.conferAttributesUpon(artifact);
+ }
+ });
+
+ return realArtifact;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/OutlineContentHandlerPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/OutlineContentHandlerPage.java
new file mode 100644
index 00000000000..8372c5327fc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/OutlineContentHandlerPage.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.Import;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+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.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class OutlineContentHandlerPage extends WizardDataTransferPage implements Listener {
+ public static final String PAGE_NAME = "osee.define.wizardPage.outlineContentHandlerPage";
+ private List handlerList;
+ private boolean hasHandlers;
+
+ /**
+ * @param descriptors Available descriptors to select from
+ */
+ public OutlineContentHandlerPage() {
+ super(PAGE_NAME);
+
+ hasHandlers = false;
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ createOptionsGroup(composite);
+
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+
+ updateWidgetEnablements();
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ protected void createOptionsGroup(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setText("Outline Handlers");
+ composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout(1, true));
+
+ handlerList = new List(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE);
+ handlerList.addListener(SWT.Selection, this);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 300;
+ handlerList.setLayoutData(gridData);
+
+ initList();
+ }
+
+ private void initList() {
+ java.util.List<IWordOutlineContentHandler> extensionPointHandlers = new LinkedList<IWordOutlineContentHandler>();
+
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint(
+ "org.eclipse.osee.framework.ui.skynet.WordOutlineContentHandler");
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals("Handler")) {
+ try {
+ extensionPointHandlers.add((IWordOutlineContentHandler) element.createExecutableExtension("class"));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+
+ hasHandlers = !extensionPointHandlers.isEmpty();
+ if (hasHandlers) {
+ Collections.sort(extensionPointHandlers, new Comparator<IWordOutlineContentHandler>() {
+
+ public int compare(IWordOutlineContentHandler o1, IWordOutlineContentHandler o2) {
+ return o1.getName().compareToIgnoreCase(o2.getName());
+ }
+ });
+
+ for (IWordOutlineContentHandler handler : extensionPointHandlers) {
+ handlerList.add(handler.getName());
+ handlerList.setData(handler.getName(), handler);
+ }
+ } else {
+ handlerList.add("<No Handlers Installed>");
+ }
+
+ handlerList.getParent().pack(true);
+ }
+
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+
+ public IWordOutlineContentHandler getSelectedOutlineContentHandler() {
+ if (handlerList.getSelectionCount() == 1) {
+ return (IWordOutlineContentHandler) handlerList.getData(handlerList.getSelection()[0]);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected boolean validateOptionsGroup() {
+ return hasHandlers && handlerList.getSelectionCount() == 1;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ReqNumbering.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ReqNumbering.java
new file mode 100644
index 00000000000..f2fb10ba524
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/ReqNumbering.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.framework.ui.skynet.Import;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ReqNumbering {
+ private String number;
+ private String[] values;
+
+ public ReqNumbering(String number) {
+ this.number = number;
+ values = tokenize();
+ }
+
+ public String getNumberString() {
+ return number;
+ }
+
+ /**
+ * @param numbering
+ * @return returns whether the numbering argument is a child of this number
+ */
+ public boolean isChild(ReqNumbering numbering) {
+ String[] numberVals = numbering.values;
+ if ((values.length + 1) != numberVals.length) {
+ return false;
+ }
+
+ for (int i = 0; i < values.length; i++) {
+ if (!values[i].equals(numberVals[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private String[] tokenize() {
+ String[] returnVal = number.split("\\.");
+
+ // If the very last token is a 0, then chop it off
+ if (returnVal[returnVal.length - 1].equals("0")) {
+ String[] temp = new String[returnVal.length - 1];
+ System.arraycopy(returnVal, 0, temp, 0, temp.length);
+ returnVal = temp;
+ }
+ return returnVal;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RootAndAttributeBasedArtifactResolver.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RootAndAttributeBasedArtifactResolver.java
new file mode 100644
index 00000000000..020ac2c624f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RootAndAttributeBasedArtifactResolver.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.framework.ui.skynet.Import;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RootAndAttributeBasedArtifactResolver extends NewArtifactImportResolver {
+ private final LinkedList<AttributeType> identifyingAttributeDescriptors;
+ private final Collection<String> EMPTY = new ArrayList<String>(0);
+ private final boolean createNewIfNotExist;
+
+ /**
+ * @param identifyingAttributeDescriptors
+ */
+ public RootAndAttributeBasedArtifactResolver(ArtifactType primaryArtifactType, ArtifactType secondaryArtifactType, Collection<AttributeType> identifyingAttributeDescriptors, boolean createNewIfNotExist) {
+ super(primaryArtifactType, secondaryArtifactType);
+ if (identifyingAttributeDescriptors == null) throw new IllegalArgumentException(
+ "identifyingAttributeDescriptors can not be null");
+ if (identifyingAttributeDescriptors.isEmpty()) throw new IllegalArgumentException(
+ "identifyingAttributeDescriptors can not be empty");
+
+ this.identifyingAttributeDescriptors = new LinkedList<AttributeType>(identifyingAttributeDescriptors);
+ this.createNewIfNotExist = createNewIfNotExist;
+ }
+
+ private boolean attributeValuesMatch(RoughArtifact roughArtifact, Artifact artifact) throws OseeCoreException {
+
+ Collection<ObjectPair<String, String>> roughAttributeCollection = roughArtifact.getAttributes();
+ HashCollection<String, String> roughAttributeMap = new HashCollection<String, String>();
+ for (ObjectPair<String, String> roughAttribute : roughAttributeCollection) {
+ roughAttributeMap.put(roughAttribute.object1, roughAttribute.object2);
+ }
+
+ for (AttributeType attributeType : identifyingAttributeDescriptors) {
+ Collection<String> attributeValues = artifact.getAttributesToStringList(attributeType.getName());
+ Collection<String> roughAttributes = roughAttributeMap.getValues(attributeType.getName());
+
+ if (roughAttributes == null) {
+ roughAttributes = EMPTY;
+ }
+
+ if (attributeValues.size() == roughAttributes.size()) {
+ for (String attributeValue : attributeValues) {
+ boolean attributeEqual = false;
+ Iterator<String> iter = roughAttributes.iterator();
+
+ String normalizedAttributeValue = normalizeAttributeValue(attributeValue);
+ while (iter.hasNext()) {
+ String otherAttribute = iter.next();
+
+ if (normalizedAttributeValue.equals(normalizeAttributeValue(otherAttribute))) {
+ // Make sure we don't count this attribute more than once for equality
+ iter.remove();
+ attributeEqual = true;
+ break;
+ }
+ }
+
+ if (!attributeEqual) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ private String normalizeAttributeValue(String value) {
+ return value.trim().replaceAll("\\.$", "").toLowerCase();
+ }
+
+ public Artifact resolve(RoughArtifact roughArtifact) throws OseeCoreException {
+ try {
+ Artifact realArtifact = null;
+ RoughArtifact roughParent = roughArtifact.getRoughParent();
+
+ if (roughParent != null) {
+ List<Artifact> siblings = roughParent.getAssociatedArtifact().getChildren();
+ Collection<Artifact> candidates = new LinkedList<Artifact>();
+
+ for (Artifact artifact : siblings) {
+ if (attributeValuesMatch(roughArtifact, artifact)) {
+ candidates.add(artifact);
+ }
+ }
+
+ if (candidates.size() == 1) {
+ realArtifact = candidates.iterator().next();
+ roughArtifact.updateValues(realArtifact);
+ } else {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO,
+ "Found " + candidates.size() + " candidates during reuse import for " + roughArtifact.getName());
+ if (createNewIfNotExist) {
+ realArtifact = super.resolve(roughArtifact);
+ }
+ }
+ }
+
+ return realArtifact;
+ } catch (FileNotFoundException ex) {
+ throw new WrappedException(ex);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifact.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifact.java
new file mode 100644
index 00000000000..b8964d5babf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifact.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.Import;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map.Entry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.ObjectPair;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class RoughArtifact {
+ private Artifact realArtifact;
+ private RoughArtifact roughParent;
+ private ReqNumbering number;
+ private String guid;
+ private String humandReadableId;
+ private HashMap<String, File> fileAttributes;
+ private final Branch branch;
+ private RoughArtifactKind roughArtifactKind;
+ private final List<ObjectPair<String, String>> attributes = new ArrayList<ObjectPair<String, String>>();
+ private final Collection<RoughArtifact> children = new ArrayList<RoughArtifact>();
+ private ArtifactType primaryArtifactType;
+
+ public RoughArtifact(RoughArtifactKind roughArtifactKind, Branch branch) {
+ this.branch = branch;
+ this.roughArtifactKind = roughArtifactKind;
+ }
+
+ public RoughArtifact(Artifact associatedArtifact) {
+ this(RoughArtifactKind.PRIMARY, associatedArtifact.getBranch());
+ realArtifact = associatedArtifact;
+ }
+
+ public RoughArtifact(RoughArtifactKind roughArtifactKind, Branch branch, String name) {
+ this(roughArtifactKind, branch);
+ addAttribute("Name", name);
+ }
+
+ public boolean hasHierarchicalRelation() {
+ return number != null;
+ }
+
+ public void addChild(RoughArtifact child) {
+ child.roughParent = this;
+ children.add(child);
+ }
+
+ public boolean hasParent() {
+ return roughParent != null;
+ }
+
+ /**
+ * @return the roughParent
+ */
+ public RoughArtifact getRoughParent() {
+ return roughParent;
+ }
+
+ public Artifact getAssociatedArtifact() {
+ return realArtifact;
+ }
+
+ public void addFileAttribute(String name, File file) {
+ if (fileAttributes == null) {
+ fileAttributes = new HashMap<String, File>(2, 1);
+ }
+ fileAttributes.put(name, file);
+ }
+
+ public void addAttribute(String name, String value) {
+ attributes.add(new ObjectPair<String, String>(name, value));
+ }
+
+ public boolean isChild(RoughArtifact otherArtifact) {
+ return number.isChild(otherArtifact.number);
+ }
+
+ public void conferAttributesUpon(Artifact artifact) throws OseeCoreException {
+ for (ObjectPair<String, String> roughtAttribute : attributes) {
+ if (roughtAttribute.object2 != null) {
+ artifact.addAttributeFromString(roughtAttribute.object1, roughtAttribute.object2);
+ }
+ }
+ setFileAttributes(artifact);
+ }
+
+ private void setFileAttributes(Artifact artifact) throws OseeCoreException {
+ if (fileAttributes != null) {
+ for (Entry<String, File> entry : fileAttributes.entrySet()) {
+ try {
+ artifact.setSoleAttributeFromStream(entry.getKey(), new FileInputStream(entry.getValue()));
+ } catch (FileNotFoundException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ }
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+ /**
+ * @param number The number to set.
+ */
+ public void setSectionNumber(String number) {
+ this.number = new ReqNumbering(number);
+ }
+
+ public Collection<ObjectPair<String, String>> getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * @return Returns the children.
+ */
+ public Collection<RoughArtifact> getChildren() {
+ return children;
+ }
+
+ public Artifact getReal(SkynetTransaction transaction, IProgressMonitor monitor, IArtifactImportResolver artifactResolver) throws OseeCoreException {
+ if (realArtifact != null) {
+ return realArtifact;
+ }
+
+ realArtifact = artifactResolver.resolve(this);
+
+ if (monitor != null) {
+ monitor.subTask(getName());
+ monitor.worked(1);
+ }
+
+ for (RoughArtifact roughArtifact : children) {
+ Artifact tempArtifact = roughArtifact.getReal(transaction, monitor, artifactResolver);
+ if (realArtifact != null && tempArtifact != null) {
+ if (!tempArtifact.hasParent()) {
+ realArtifact.addChild(tempArtifact);
+ } else if (tempArtifact.getParent() != realArtifact) {
+ throw new IllegalStateException(
+ "Artifact already has a parent that is not inline with the import parent");
+ }
+ }
+ }
+
+ if (realArtifact != null) {
+ realArtifact.persistAttributesAndRelations(transaction);
+ }
+ return realArtifact;
+ }
+
+ public void updateValues(Artifact artifact) throws OseeCoreException, FileNotFoundException {
+ for (ObjectPair<String, String> roughtAttribute : attributes) {
+ artifact.setSoleAttributeFromString(roughtAttribute.object1, roughtAttribute.object2);
+ }
+
+ setFileAttributes(artifact);
+ }
+
+ /**
+ * @param guid The guid to set.
+ */
+ public void setGuid(String guid) {
+ this.guid = guid;
+ }
+
+ /**
+ * @return Returns the guid.
+ */
+ public String getGuid() {
+ return guid;
+ }
+
+ /**
+ * @param humandReadableId The humandReadableId to set.
+ */
+ public void setHumandReadableId(String humandReadableId) {
+ this.humandReadableId = humandReadableId;
+ }
+
+ public String getHumandReadableId() {
+ return humandReadableId;
+ }
+
+ /**
+ * @return the roughArtifactKind
+ */
+ public RoughArtifactKind getRoughArtifactKind() {
+ return roughArtifactKind;
+ }
+
+ /**
+ * @param roughArtifactKind the roughArtifactKind to set
+ */
+ public void setRoughArtifactKind(RoughArtifactKind roughArtifactKind) {
+ this.roughArtifactKind = roughArtifactKind;
+ }
+
+ public String getName() {
+ if (realArtifact != null) {
+ return realArtifact.getDescriptiveName();
+ }
+ for (ObjectPair<String, String> roughtAttribute : attributes) {
+ if (roughtAttribute.object1.equals("Name")) {
+ return roughtAttribute.object2;
+ }
+ }
+ return "";
+ }
+
+ public String getRoughAttribute(String attributeName) {
+ for (ObjectPair<String, String> roughtAttribute : attributes) {
+ if (roughtAttribute.object1.equalsIgnoreCase(attributeName)) {
+ return roughtAttribute.object2;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return the branch
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /**
+ * @return the primaryArtifactType
+ */
+ public ArtifactType getPrimaryArtifactType() {
+ return primaryArtifactType;
+ }
+
+ /**
+ * @param primaryArtifactType the primaryArtifactType to set
+ */
+ public void setPrimaryArtifactType(ArtifactType primaryArtifactType) {
+ this.primaryArtifactType = primaryArtifactType;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifactKind.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifactKind.java
new file mode 100644
index 00000000000..93c5c59345f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughArtifactKind.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.framework.ui.skynet.Import;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public enum RoughArtifactKind {
+ PRIMARY, SECONDARY, CONTAINER
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughRelation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughRelation.java
new file mode 100644
index 00000000000..3ca2596acf5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/RoughRelation.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.framework.ui.skynet.Import;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RoughRelation {
+ private String relTypeName;
+ private String aGuid;
+ private String bGuid;
+ private String rationale;
+ private int aOrderValue;
+ private int bOrderValue;
+
+ public RoughRelation(String relTypeName, String aGuid, String bGuid, String rationale, int aOrderValue, int bOrderValue) {
+ this.relTypeName = relTypeName;
+ this.aGuid = aGuid;
+ this.bGuid = bGuid;
+ this.rationale = rationale;
+ this.aOrderValue = aOrderValue;
+ this.bOrderValue = bOrderValue;
+ }
+
+ public void makeReal(SkynetTransaction transaction, IProgressMonitor monitor) throws OseeCoreException {
+ RelationType relationType = RelationTypeManager.getType(relTypeName);
+ Artifact aArt = ArtifactQuery.getArtifactFromId(aGuid, transaction.getBranch());
+ Artifact bArt = ArtifactQuery.getArtifactFromId(bGuid, transaction.getBranch());
+
+ if (aArt == null || bArt == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "The relation of type " + relTypeName + " could not be created.");
+ if (aArt == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "The artifact with guid: " + aGuid + " does not exist.");
+ }
+ if (bArt == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "The artifact with guid: " + bGuid + " does not exist.");
+ }
+ } else {
+ try {
+ monitor.subTask(aArt.getDescriptiveName() + " <--> " + bArt.getDescriptiveName());
+ monitor.worked(1);
+ RelationManager.addRelation(relationType, aArt, bArt, rationale);
+ aArt.persistRelations(transaction);
+ } catch (IllegalArgumentException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, ex.getLocalizedMessage());
+ }
+ }
+ }
+
+ /**
+ * @return Returns the relTypeName.
+ */
+ public String getRelTypeName() {
+ return relTypeName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WholeWordDocumentExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WholeWordDocumentExtractor.java
new file mode 100644
index 00000000000..f2a0d19ea0c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WholeWordDocumentExtractor.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+
+public class WholeWordDocumentExtractor extends WordExtractor {
+ public String getDescription() {
+ return "Extract all the content of each Word XML document as one artifact";
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.Import.ArtifactExtractor#discoverArtifactAndRelationData(java.io.File)
+ */
+ public void discoverArtifactAndRelationData(File importFile, Branch branch) throws Exception {
+ if (importFile == null) throw new IllegalArgumentException("importFile can not be null");
+ RoughArtifact roughArtifact =
+ new RoughArtifact(RoughArtifactKind.PRIMARY, branch, Lib.removeExtension(importFile.getName()));
+ addRoughArtifact(roughArtifact);
+ roughArtifact.addFileAttribute(WordAttribute.WHOLE_WORD_CONTENT, importFile);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ public FileFilter getFileFilter() {
+ return new FileFilter() {
+ public boolean accept(File file) {
+ return file.isDirectory() || (file.isFile() && file.getName().endsWith(".xml"));
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "Whole Word Document";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordExtractor.java
new file mode 100644
index 00000000000..48c49221f9a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordExtractor.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.framework.ui.skynet.Import;
+
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class WordExtractor extends AbstractArtifactExtractor {
+ protected static final String BODY_START = "<w:body>";
+ protected static final String BODY_END = "</w:body>";
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineContentHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineContentHandler.java
new file mode 100644
index 00000000000..46ef27bbaaa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineContentHandler.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.framework.ui.skynet.Import;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * @author Robert A. Fisher
+ */
+public abstract class WordOutlineContentHandler implements IWordOutlineContentHandler {
+ protected WordOutlineExtractor extractor;
+ private String name;
+
+ public WordOutlineContentHandler() {
+ this.extractor = null;
+ this.name = null;
+ }
+
+ /**
+ * Returns the name that was in the extension point. Clients may re-implement this method.
+ */
+ public String getName() {
+ if (name == null) {
+ throw new IllegalStateException("Not yet initialized");
+ }
+ return name;
+ }
+
+ /**
+ * Setup the name from the extension point.
+ */
+ public final void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+ name = config.getAttribute("name");
+ if (name == null || name.equals("")) {
+ name = "<no name>";
+ }
+ }
+
+ /**
+ * Get rid of references setup in init. Subclasses should extend this method if any other resources should be
+ * released.
+ */
+ public void dispose() {
+ extractor = null;
+ }
+
+ /**
+ * Save off references. Subclasses should extend this method if anyother resources need to be setup.
+ */
+ public void init(WordOutlineExtractor extractor) {
+ this.extractor = extractor;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineExtractor.java
new file mode 100644
index 00000000000..acc1ce9217a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/WordOutlineExtractor.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * 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.skynet.Import;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Readers;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.handler.GeneralWordOutlineHandler;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Robert A. Fisher
+ */
+public class WordOutlineExtractor extends WordExtractor {
+ private static final String PARAGRAPH_TAG_WITH_ATTRS = "<w:p ";
+ private static final String PARAGRAPH_TAG_EMPTY = "<w:p/>";
+ private static final String PARAGRAPH_TAG = "<w:p>";
+ private static final String TABLE_TAG_WITH_ATTRS = "<w:tbl ";
+ private static final String TABLE_TAG_EMPTY = "<w:tbl/>";
+ private static final String TABLE_TAG = "<w:tbl>";
+ private static final CharSequence[] BODY_TAGS =
+ new CharSequence[] {PARAGRAPH_TAG, PARAGRAPH_TAG_EMPTY, PARAGRAPH_TAG_WITH_ATTRS, TABLE_TAG, TABLE_TAG_EMPTY,
+ TABLE_TAG_WITH_ATTRS, BODY_END};
+
+ // A regex for reading xml elements. Assumes that an element never has a descendant with the same name as itself
+ private static final Pattern internalAttributeElementsPattern =
+ Pattern.compile("<((\\w+:)?(\\w+))(\\s+.*?)((/>)|(>(.*?)</\\1>))",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern proofErrTagKiller = Pattern.compile("</?w:proofErr.*?/?>");
+ private static final int NAMESPACE_GROUP = 2;
+ private static final int ELEMENT_NAME_GROUP = 3;
+ private static final int ATTRIBUTE_BLOCK_GROUP = 4;
+ private static final int CONTENT_GROUP = 8;
+
+ private Matcher reqNumberMatcher;
+ private Matcher reqListMatcher;
+ private Stack<String> currentListStack;
+ private Stack<String> clonedCurrentListStack;
+ private int lastDepthNumber;
+ private String headerNumber;
+ private String listIdentifier;
+ private final int maxExtractionDepth;
+ private boolean forceBody;
+ private boolean forcePrimaryType;
+ private String paragraphStyle;
+
+ private final IWordOutlineContentHandler handler;
+
+ public WordOutlineExtractor() throws OseeCoreException {
+ this(0, new GeneralWordOutlineHandler());
+ }
+
+ public WordOutlineExtractor(int maxExtractionDepth, IWordOutlineContentHandler handler) throws OseeCoreException {
+ if (handler == null) throw new IllegalArgumentException("handler can not be null");
+
+ this.handler = handler;
+ this.headerNumber = "";
+ this.listIdentifier = "";
+ this.reqNumberMatcher = Pattern.compile("(\\d+\\.)*(\\d+\\.?)\\s*").matcher("");
+ this.reqListMatcher = Pattern.compile("\\w+\\)", Pattern.CASE_INSENSITIVE).matcher("");
+ this.currentListStack = new Stack<String>();
+ this.clonedCurrentListStack = new Stack<String>();
+ this.maxExtractionDepth = maxExtractionDepth;
+ }
+
+ public String getDescription() {
+ return "Extract data from a Word XML file with an outline, making an artifact for each outline numbered section";
+ }
+
+ public void discoverArtifactAndRelationData(File importFile, Branch branch) throws Exception {
+
+ Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(importFile), "UTF-8"));
+
+ if (Readers.forward(reader, BODY_START) == null) {
+ throwFileFormatError(importFile, "no start of body tag");
+ }
+
+ handler.init(this);
+
+ try {
+ CharSequence element;
+ StringBuilder content = new StringBuilder(2000);
+
+ // Process the next available body tag
+ while ((element = Readers.forward(reader, BODY_TAGS)) != null) {
+
+ if (element == BODY_END) {
+ return;
+ } else {
+ // Get the next parsable chunk from the stream. This will throttle the amount of the file read in to
+ // memory at one time to the smallest area that will provide all the necessary context.
+ content.setLength(0);
+ content.append(element);
+
+ boolean emptyTagWithAttrs = false;
+ // If the tag had attributes, check that it isn't empty
+ if (element == PARAGRAPH_TAG_WITH_ATTRS || element == TABLE_TAG_WITH_ATTRS) {
+ if (Readers.forward(reader, (Appendable) content, ">") == null) {
+ throwFileFormatError(importFile, "did not find expected end of tag");
+ }
+ emptyTagWithAttrs = content.toString().endsWith("/>");
+ }
+
+ if (element == PARAGRAPH_TAG || (!emptyTagWithAttrs && element == PARAGRAPH_TAG_WITH_ATTRS)) {
+ Readers.xmlForward(reader, (Appendable) content, "w:p");
+ } else if (element == TABLE_TAG || (!emptyTagWithAttrs && element == TABLE_TAG_WITH_ATTRS)) {
+ Readers.xmlForward(reader, (Appendable) content, "w:tbl");
+ } else if (element != PARAGRAPH_TAG_WITH_ATTRS && element != TABLE_TAG_WITH_ATTRS && element != PARAGRAPH_TAG_EMPTY && element != TABLE_TAG_EMPTY) {
+ throw new IllegalStateException("Unexpected element returned");
+ }
+
+ // Word places proofErr tags in manners discontigous with the standard XML tree so only some
+ // of them get picked up causing a misbalance from what Word expects, and effectively corrupting
+ // the content as far as Word is concerned, so just remove all of them and let word recompute
+ // them if it is really that concerned about our grammar
+ content = new StringBuilder(proofErrTagKiller.matcher(content).replaceAll(""));
+
+ // forceBody doesn't reset per paragraph
+ forcePrimaryType = false;
+ headerNumber = "";
+ listIdentifier = "";
+ paragraphStyle = null;
+ parseContentDetails(content, new Stack<String>());
+ handler.processContent(forceBody, forcePrimaryType, headerNumber, listIdentifier, paragraphStyle,
+ content.toString(), element == PARAGRAPH_TAG, branch);
+ }
+ }
+ } finally {
+ handler.dispose();
+ }
+
+ throwFileFormatError(importFile, "did not find expected end of body tag");
+ }
+
+ private void parseContentDetails(CharSequence content, Stack<String> parentElementNames) {
+
+ Matcher matcher = internalAttributeElementsPattern.matcher(content);
+
+ String elementNamespace;
+ String elementName;
+ String elementAttributes;
+ String elementContent;
+ while (matcher.find()) {
+ elementName = matcher.group(ELEMENT_NAME_GROUP);
+ elementNamespace = matcher.group(NAMESPACE_GROUP);
+ elementAttributes = matcher.group(ATTRIBUTE_BLOCK_GROUP) == null ? "" : matcher.group(ATTRIBUTE_BLOCK_GROUP);
+ elementContent = matcher.group(CONTENT_GROUP) == null ? "" : matcher.group(CONTENT_GROUP);
+
+ if (elementName.equals("forceBodyOn")) {
+ forceBody = true;
+ } else if (elementName.equals("forceBodyOff")) {
+ forceBody = false;
+ } else if (elementName.equals("pStyle")) {
+ paragraphStyle = getAttributeValue("w:val", elementAttributes);
+ } else if (elementName.equals("forcePrimaryType")) {
+ forcePrimaryType = true;
+ } else if (elementNamespace.startsWith("w") && elementName.equals("t")) {
+ String numberCandidate = getAttributeValue("wx:val", elementAttributes);
+
+ reqNumberMatcher.reset(numberCandidate);
+ reqListMatcher.reset(numberCandidate);
+
+ if (reqNumberMatcher.matches()) {
+ if (WordUtil.isHeadingStyle(paragraphStyle)) {
+ headerNumber = numberCandidate;
+ if (headerNumber.endsWith(".0")) {
+ headerNumber = headerNumber.substring(0, headerNumber.length() - 2);
+ }
+ }
+ } else if (reqListMatcher.matches()) {
+ if (isListStyle(parentElementNames)) {
+ listIdentifier =
+ processListId(Integer.parseInt(getAttributeValue("w:val", elementAttributes)), numberCandidate);
+ }
+ }
+ }
+
+ parentElementNames.push(elementName);
+ parseContentDetails(elementContent, parentElementNames);
+ parentElementNames.pop();
+ }
+ }
+
+ private static final String getAttributeValue(String attributeName, String attributeStorage) {
+
+ attributeName += "=\"";
+
+ int index = attributeStorage.indexOf(attributeName);
+ if (index == -1) {
+ return "";
+ } else {
+ int startIndex = index + attributeName.length();
+ return attributeStorage.substring(startIndex, attributeStorage.indexOf('"', startIndex + 1)).trim();
+ }
+ }
+
+ private static final void throwFileFormatError(File file, String msg) {
+ throw new IllegalArgumentException("File " + file.getName() + " not of expected format: " + msg);
+ }
+
+ private boolean isListStyle(Stack<String> parentElementNames) {
+ Iterator<String> iter = parentElementNames.iterator();
+
+ return iter.hasNext() && iter.next().equals("ilvl") && iter.hasNext() && iter.next().equals("listPr");
+ }
+
+ @SuppressWarnings("unchecked")
+ private String processListId(int currentDepthNumber, String numberCandidate) throws IllegalArgumentException {
+ String id = "";
+
+ if (currentDepthNumber == 0) {
+ currentListStack.clear();
+
+ currentListStack.push(numberCandidate);
+ clonedCurrentListStack = (Stack) currentListStack.clone();
+ lastDepthNumber = currentDepthNumber;
+ } else {
+
+ for (int i = currentDepthNumber; i <= lastDepthNumber; i++) {
+ currentListStack.pop();
+ }
+
+ lastDepthNumber = currentDepthNumber;
+ currentListStack.push(numberCandidate);
+ clonedCurrentListStack = (Stack) currentListStack.clone();
+ }
+ while (!clonedCurrentListStack.empty()) {
+ id = clonedCurrentListStack.pop() + id;
+ }
+
+ if (currentDepthNumber > maxExtractionDepth) {
+ return null;
+ }
+ return id.replaceAll("\\)", ".");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ public FileFilter getFileFilter() {
+ return new FileFilter() {
+ public boolean accept(File file) {
+ return file.isDirectory() || (file.isFile() && file.getName().endsWith(".xml"));
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "Word Outline";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataExtractor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataExtractor.java
new file mode 100644
index 00000000000..608f478ce69
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataExtractor.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.framework.ui.skynet.Import;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XmlDataExtractor extends AbstractArtifactExtractor {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#discoverArtifactAndRelationData(java.io.File)
+ */
+ @Override
+ public void discoverArtifactAndRelationData(File artifactsFile, Branch branch) throws Exception {
+ ArtifactType primaryArtifactType = ArtifactTypeManager.getType(Lib.removeExtension(artifactsFile));
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(new XmlDataSaxHandler(this, branch, primaryArtifactType));
+ xmlReader.parse(new InputSource(new InputStreamReader(new FileInputStream(artifactsFile), "UTF-8")));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getFileFilter()
+ */
+ @Override
+ public FileFilter getFileFilter() {
+ return new FileFilter() {
+ public boolean accept(File file) {
+ return file.isDirectory() || (file.isFile() && file.getName().endsWith(".xml"));
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getName()
+ */
+ @Override
+ public String getName() {
+ return "Excel XML Data";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#getDescription()
+ */
+ @Override
+ public String getDescription() {
+ return "Extract Data from xml of the form <row><cell></cell>*</row>* like that created by Excel data export";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.Import.ArtifactExtractor#usesTypeList()
+ */
+ @Override
+ public boolean usesTypeList() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataSaxHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataSaxHandler.java
new file mode 100644
index 00000000000..68a36e459af
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/Import/XmlDataSaxHandler.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.framework.ui.skynet.Import;
+
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XmlDataSaxHandler extends AbstractSaxHandler {
+ private int level = 0;
+ private RoughArtifact roughArtifact;
+ private final Branch branch;
+ private final AbstractArtifactExtractor extractor;
+ private final ArtifactType primaryArtifactType;
+
+ /**
+ * @param branch
+ */
+ public XmlDataSaxHandler(AbstractArtifactExtractor extractor, Branch branch, ArtifactType primaryArtifactType) {
+ super();
+ this.branch = branch;
+ this.extractor = extractor;
+ this.primaryArtifactType = primaryArtifactType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ if (level == 3) {
+ roughArtifact.addAttribute(localName, getContents());
+ }
+ level--;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ level++;
+
+ if (level == 2) {
+ roughArtifact = new RoughArtifact(RoughArtifactKind.PRIMARY, branch);
+ roughArtifact.setPrimaryArtifactType(primaryArtifactType);
+ extractor.addRoughArtifact(roughArtifact);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/LabelSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/LabelSorter.java
new file mode 100644
index 00000000000..76de3d46948
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/LabelSorter.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.framework.ui.skynet;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import org.eclipse.jface.viewers.ContentViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+public class LabelSorter extends ViewerSorter {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
+ */
+ @Override
+ public int category(Object element) {
+ return super.category(element);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+
+ Artifact art1 = null;
+ Artifact art2 = null;
+
+ if (e1 instanceof Artifact) art1 = (Artifact) e1;
+ if (e2 instanceof Artifact) art2 = (Artifact) e2;
+
+ boolean e1IsHeading = (art1 != null && art1.getArtifactTypeName().equals("Heading"));
+ boolean e2IsHeading = (art2 != null && art2.getArtifactTypeName().equals("Heading"));
+ boolean e1IsNarrative =
+ (art1 != null && !e1IsHeading && art1.getArtifactTypeName().equals("Narrative"));
+ boolean e2IsNarrative =
+ (art2 != null && !e2IsHeading && art2.getArtifactTypeName().equals("Narrative"));
+
+ if (e1IsHeading ^ e2IsHeading) return (e1IsHeading ? -1 : 1);
+
+ if (e1IsNarrative ^ e2IsNarrative) return (e1IsNarrative ? -1 : 1);
+
+ int cat1 = category(e1);
+ int cat2 = category(e2);
+
+ if (cat1 != cat2) return cat1 - cat2;
+
+ String name1;
+ String name2;
+
+ if (viewer == null || !(viewer instanceof ContentViewer)) {
+ name1 = e1.toString();
+ name2 = e2.toString();
+ } else {
+ IBaseLabelProvider prov = ((ContentViewer) viewer).getLabelProvider();
+ if (prov instanceof ILabelProvider) {
+ ILabelProvider lprov = (ILabelProvider) prov;
+ name1 = lprov.getText(e1);
+ name2 = lprov.getText(e2);
+ } else {
+ name1 = e1.toString();
+ name2 = e2.toString();
+ }
+ }
+ if (name1 == null) name1 = "";
+ if (name2 == null) name2 = "";
+ return getComparator().compare(name1, name2);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerSorter#isSorterProperty(java.lang.Object, java.lang.String)
+ */
+ @Override
+ public boolean isSorterProperty(Object element, String property) {
+ return super.isSorterProperty(element, property);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerSorter#sort(org.eclipse.jface.viewers.Viewer, java.lang.Object[])
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void sort(final Viewer viewer, Object[] elements) {
+ Arrays.sort(elements, new Comparator() {
+ public int compare(Object a, Object b) {
+ return LabelSorter.this.compare(viewer, a, b);
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ModifyAttributesListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ModifyAttributesListener.java
new file mode 100644
index 00000000000..42660e459f9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ModifyAttributesListener.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.framework.ui.skynet;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class ModifyAttributesListener {
+
+ public abstract void handleEvent();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithContributionItem.java
new file mode 100644
index 00000000000..d39afbe44a4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithContributionItem.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.Command;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.render.IRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.NativeRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WordRenderer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+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;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ * Dynamically provides the open with CommandContributionItem for menu items based off of calling applicable renderers
+ * getCommandId(presenationType).
+ *
+ * @author Jeff C. Phillips
+ */
+public class OpenWithContributionItem extends CompoundContributionItem {
+ private ICommandService commandService;
+
+ public OpenWithContributionItem() {
+ this.commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+
+ public OpenWithContributionItem(String id) {
+ super(id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+ */
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(40);
+ List<Artifact> artifacts = getSelectedArtifacts();
+ if (artifacts != null && !artifacts.isEmpty()) {
+ try {
+ contributionItems.addAll(getCommonContributionItems(artifacts, PresentationType.PREVIEW));
+ //add separator between preview and edit commands
+ if (!contributionItems.isEmpty()) {
+ contributionItems.add(new Separator());
+ }
+ contributionItems.addAll(getCommonContributionItems(artifacts, PresentationType.SPECIALIZED_EDIT));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ return contributionItems.toArray(new IContributionItem[0]);
+ }
+
+ private ArrayList<IContributionItem> getCommonContributionItems(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(25);
+ List<IRenderer> commonRenders = RendererManager.getCommonRenderers(artifacts, presentationType);
+ Artifact firstArtifact = artifacts.iterator().next();
+ for (IRenderer render : commonRenders) {
+ if (render instanceof WordRenderer) {
+ contributionItems.addAll(loadCommands(render, presentationType, WordRenderer.getImageDescriptor()));
+ } else {
+ contributionItems.addAll(loadCommands(
+ render,
+ presentationType,
+ render instanceof NativeRenderer && firstArtifact instanceof NativeArtifact ? ImageManager.getProgramImageDescriptor(((NativeArtifact) firstArtifact).getFileExtension()) : null));
+ }
+ }
+ return contributionItems;
+ }
+
+ private ArrayList<IContributionItem> loadCommands(IRenderer renderer, PresentationType presentationType, ImageDescriptor imageDescriptor) {
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(25);
+ CommandContributionItem contributionItem = null;
+
+ for (String commandId : renderer.getCommandId(presentationType)) {
+ contributionItem =
+ new CommandContributionItem(new CommandContributionItemParameter(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow(), commandId, commandId,
+ Collections.emptyMap(), imageDescriptor, null, null, null, null, null, SWT.NONE, null, false));
+
+ Command command = commandService.getCommand(contributionItem.getId());
+ if (command != null && command.isEnabled()) {
+ contributionItems.add(contributionItem);
+ }
+ }
+
+ return contributionItems;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar, int)
+ */
+ @Override
+ public void fill(final ToolBar parent, int index) {
+ final ToolItem toolItem = new ToolItem(parent, SWT.DROP_DOWN);
+ toolItem.setImage(ImageManager.getImage(FrameworkImage.OPEN));
+ toolItem.setToolTipText("Open the Artifact");
+
+ OpenWithToolItemListener listener = new OpenWithToolItemListener(parent.getShell());
+ toolItem.addListener(SWT.Selection, listener);
+ toolItem.setEnabled(listener.isPreviewMenuEnabled());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#fill(org.eclipse.swt.widgets.Menu, int)
+ */
+ @Override
+ public void fill(Menu parent, int index) {
+ final MenuItem item = new MenuItem(parent, SWT.CASCADE);
+ item.setText("Open With");
+
+ Menu subMenu = new Menu(parent);
+ item.setMenu(subMenu);
+ createDropDownMenu(parent.getShell(), subMenu);
+ item.setEnabled(isMenuEnabled(subMenu));
+ }
+
+ private List<Artifact> getSelectedArtifacts() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ if (page != null) {
+ IWorkbenchPart part = page.getActivePart();
+ if (part != null) {
+ IWorkbenchPartSite site = part.getSite();
+ if (site != null) {
+ ISelectionProvider selectionProvider = site.getSelectionProvider();
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ return Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+ }
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ private void createDropDownMenu(Shell shell, Menu previewMenu) {
+ List<Artifact> artifacts = getSelectedArtifacts();
+ boolean previewable = false;
+ try {
+ if (artifacts != null && !artifacts.isEmpty()) {
+ Artifact artifact = artifacts.iterator().next();
+
+ if (RendererManager.getApplicableRenderers(PresentationType.PREVIEW, artifact, null).size() > 1) {
+ previewable = true;
+ }
+
+ if (previewable) {
+ if (OpenWithMenuListener.loadMenuItems(previewMenu, PresentationType.PREVIEW, artifacts)) {
+ new MenuItem(previewMenu, SWT.SEPARATOR);
+ }
+ }
+ OpenWithMenuListener.loadMenuItems(previewMenu, PresentationType.SPECIALIZED_EDIT, artifacts);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public boolean isMenuEnabled(Menu menu) {
+ boolean itemzEnabled = false;
+ for (MenuItem menuItems : menu.getItems()) {
+ if (menuItems.isEnabled()) {
+ itemzEnabled = true;
+ }
+ }
+ return itemzEnabled;
+ }
+
+ private final class OpenWithToolItemListener implements Listener {
+ private final Menu previewMenu;
+ private final boolean isPreviewEnabled;
+
+ public OpenWithToolItemListener(Shell shell) {
+ previewMenu = new Menu(shell, SWT.POP_UP);
+ createDropDownMenu(shell, previewMenu);
+ isPreviewEnabled = isPreviewMenuEnabled();
+ }
+
+ public boolean isPreviewMenuEnabled() {
+ return isMenuEnabled(previewMenu);
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ Widget widget = event.widget;
+ if (widget instanceof ToolItem) {
+ ToolItem toolItem = (ToolItem) widget;
+ ToolBar toolBar = toolItem.getParent();
+
+ if (event.detail == SWT.ARROW) {
+ Rectangle rect = toolItem.getBounds();
+ Point pt = new Point(rect.x, rect.y + rect.height);
+ pt = toolBar.toDisplay(pt);
+ previewMenu.setLocation(pt.x, pt.y);
+ previewMenu.setVisible(true);
+ }
+
+ if (event.detail == 0) {
+ try {
+ List<Artifact> artifacts = getSelectedArtifacts();
+ if (artifacts != null && !artifacts.isEmpty()) {
+ Artifact artifact = artifacts.iterator().next();
+ if (isPreviewEnabled && artifact != null) {
+ if (true) {
+ RendererManager.previewInJob(artifact);
+ } else {
+ RendererManager.openInJob(artifact, PresentationType.SPECIALIZED_EDIT);
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(ArtifactEditor.class, Level.SEVERE, ex.getMessage());
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithMenuListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithMenuListener.java
new file mode 100644
index 00000000000..1e0e75e7bcd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithMenuListener.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener;
+import org.eclipse.osee.framework.ui.skynet.render.IRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Jeff C. Phillips
+ */
+
+public class OpenWithMenuListener implements MenuListener {
+ private Menu parentMenu;
+ private Viewer viewer;
+ private IRebuildMenuListener rebuildMenuListener;
+ private static ICommandService commandService =
+ (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+
+ public OpenWithMenuListener(Menu parentMenu, final Viewer viewer, IRebuildMenuListener rebuildMenuListener) {
+ super();
+ this.parentMenu = parentMenu;
+ this.viewer = viewer;
+ this.rebuildMenuListener = rebuildMenuListener;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.MenuListener#menuHidden(org.eclipse.swt.events.MenuEvent)
+ */
+ @Override
+ public void menuHidden(MenuEvent e) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.MenuListener#menuShown(org.eclipse.swt.events.MenuEvent)
+ */
+ @Override
+ public void menuShown(MenuEvent e) {
+ try {
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+
+ if (selection.isEmpty()) {
+ return;
+ }
+
+ rebuildMenuListener.rebuildMenu();
+
+ Iterator<?> iterator = selection.iterator();
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(selection.size());
+
+ //load artifacts in the list
+ Artifact artifact = null;
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+ if (object instanceof IAdaptable) {
+ artifact = (Artifact) ((IAdaptable) object).getAdapter(Artifact.class);
+ } else if (object instanceof Match) {
+ artifact = (Artifact) ((Match) object).getElement();
+ } else if (object instanceof RelationLink) {
+ RelationLink link = (RelationLink) object;
+ try {
+ List<Artifact> edittedArtifacts =
+ Handlers.getArtifactsFromStructuredSelection((IStructuredSelection) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection());
+ artifact = link.getArtifactOnOtherSide(edittedArtifacts.iterator().next());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ artifacts.add(artifact);
+ }
+
+ if (loadMenuItems(parentMenu, PresentationType.PREVIEW, artifacts)) {
+ new MenuItem(parentMenu, SWT.SEPARATOR);
+ }
+ loadMenuItems(parentMenu, PresentationType.SPECIALIZED_EDIT, artifacts);
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static boolean loadMenuItems(Menu parentMenu, PresentationType presentationType, List<Artifact> artifacts) throws OseeCoreException, NotDefinedException {
+ List<IRenderer> commonRenders = RendererManager.getCommonRenderers(artifacts, presentationType);
+ Artifact artifact = artifacts.iterator().next();
+ boolean hasMenus = false;
+ for (IRenderer renderer : commonRenders) {
+ for (String commandId : renderer.getCommandId(presentationType)) {
+ Command command = commandService.getCommand(commandId);
+ if (command != null && command.isEnabled()) {
+ hasMenus = true;
+ MenuItem menuItem = new MenuItem(parentMenu, SWT.PUSH);
+ menuItem.setText(command.getName());
+ menuItem.setImage(renderer.getImage(artifact));
+ menuItem.addSelectionListener(new OpenWithSelectionListener(command));
+ }
+ }
+ }
+ return hasMenus;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithSelectionListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithSelectionListener.java
new file mode 100644
index 00000000000..77c2022e8b4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OpenWithSelectionListener.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.skynet;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.Command;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Jeff C. Phillips
+ */
+public class OpenWithSelectionListener extends SelectionAdapter {
+ private final Command command;
+ private final IHandlerService handlerService;
+
+ public OpenWithSelectionListener(Command command) {
+ super();
+ this.command = command;
+ this.handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ handlerService.executeCommand(command.getId(), null);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeContributionItem.java
new file mode 100644
index 00000000000..d06482adb4f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeContributionItem.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.framework.ui.skynet;
+
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.texteditor.StatusLineContributionItem;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class OseeContributionItem extends StatusLineContributionItem {
+
+ protected OseeContributionItem(String id) {
+ this(id, 4);
+ }
+
+ protected OseeContributionItem(String id, int width) {
+ super(id, true, width);
+ }
+
+ protected abstract String getEnabledToolTip();
+
+ protected abstract String getDisabledToolTip();
+
+ protected abstract Image getEnabledImage();
+
+ protected abstract Image getDisabledImage();
+
+ protected void updateStatus(final boolean isActive) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ Image image = isActive ? getEnabledImage() : getDisabledImage();
+ String toolTip = isActive ? getEnabledToolTip() : getDisabledToolTip();
+
+ if (image != null) {
+ setImage(image);
+ }
+ if (toolTip != null) {
+ setToolTipText(toolTip);
+ }
+ }
+ });
+ }
+
+ public static void addTo(IStatusLineManager manager) {
+ if (OseeAts.isAtsAdmin()) {
+ AdminContributionItem.addTo(manager);
+ }
+ SkynetServiceContributionItem.addTo(manager);
+ OseeServicesStatusContributionItem.addTo(manager);
+ SessionContributionItem.addTo(manager);
+ }
+
+ public static void addTo(IPageSite pageSite, boolean update) {
+ addTo(pageSite.getActionBars().getStatusLineManager());
+
+ if (update) {
+ pageSite.getActionBars().updateActionBars();
+ }
+ }
+
+ public static void addTo(ViewPart view, boolean update) {
+ addTo(view.getViewSite().getActionBars().getStatusLineManager());
+
+ if (update) {
+ view.getViewSite().getActionBars().updateActionBars();
+ }
+ }
+
+ public static void addTo(MultiPageEditorPart editorPart, boolean update) {
+ addTo(editorPart.getEditorSite().getActionBars().getStatusLineManager());
+ if (update) {
+ editorPart.getEditorSite().getActionBars().updateActionBars();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeImage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeImage.java
new file mode 100644
index 00000000000..91e7e97c2cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeImage.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.skynet;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface OseeImage {
+ public abstract ImageDescriptor createImageDescriptor();
+
+ public abstract String getImageKey();
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseePreferencePage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseePreferencePage.java
new file mode 100644
index 00000000000..418d698df35
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseePreferencePage.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.framework.ui.skynet;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.framework.core.client.CoreClientActivator;
+import org.eclipse.osee.framework.core.client.CorePreferences;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.preferences.PreferenceConstants;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * This class represents a preference page that is contributed to the Preferences dialog. By subclassing
+ * <samp>FieldEditorPreferencePage</samp>, we can use the field support built into JFace that allows us to create a page
+ * that is small and knows how to save, restore and apply itself.
+ * <p>
+ * This page is used to modify preferences only. They are stored in the preference store that belongs to the main
+ * plug-in class. That way, preferences can be accessed directly via the preference store.
+ */
+
+public class OseePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+ private HashMap<InetAddress, Button> networkButtons;
+ private Button wordWrapChkBox;
+
+ private void createNetworkAdapterArea(Composite parent) {
+ addDialogControls(parent);
+ setupWordWrapChkButton();
+ }
+
+ private void addDialogControls(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout(2, false));
+
+ GridData gd = new GridData();
+ gd.verticalAlignment = GridData.FILL;
+ gd.horizontalAlignment = GridData.FILL;
+ gd.grabExcessHorizontalSpace = true;
+ group.setLayoutData(gd);
+
+ wordWrapChkBox = new Button(group, SWT.CHECK);
+ wordWrapChkBox.setText("Use alternate hyperlink drag method");
+
+ // setup the default network selection
+ Group networkAdapter = new Group(parent, SWT.NONE);
+ networkAdapter.setLayout(new GridLayout());
+ networkAdapter.setText("Select a Default Network Adaptor");
+
+ gd = new GridData();
+ gd.verticalAlignment = GridData.FILL;
+ gd.horizontalAlignment = GridData.FILL;
+ gd.grabExcessHorizontalSpace = true;
+ networkAdapter.setLayoutData(gd);
+
+ setupInetAddressButtons(networkAdapter);
+ }
+
+ private void setupInetAddressButtons(Group group) {
+ InetAddress[] addrs = null;
+ try {
+ addrs = Network.getLocalNetworkAdapters();
+ } catch (UnknownHostException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ networkButtons = new HashMap<InetAddress, Button>();
+
+ Button defaultButton = new Button(group, SWT.RADIO);
+ defaultButton.setText("Default");
+ for (int i = 0; addrs != null && i < addrs.length; i++) {
+ Button button = new Button(group, SWT.RADIO);
+ button.setText(addrs[i].getHostAddress() + " " + addrs[i].getHostName());
+ networkButtons.put(addrs[i], button);
+ }
+
+ Preferences prefStore = CoreClientActivator.getInstance().getPluginPreferences();
+ String inetaddress = prefStore.getString(CorePreferences.INETADDRESS_KEY);
+
+ boolean addressSelected = false;
+ if (inetaddress != null && !inetaddress.equals("")) {
+ for (InetAddress address : networkButtons.keySet()) {
+ if (address.getHostAddress().equals(inetaddress)) {
+ networkButtons.get(address).setSelection(true);
+ addressSelected = true;
+ }
+ }
+ }
+
+ if (!addressSelected) {
+ defaultButton.setSelection(true);
+ }
+ }
+
+ private void setupWordWrapChkButton() {
+ IPreferenceStore prefStore = SkynetGuiPlugin.getInstance().getPreferenceStore();
+ wordWrapChkBox.setSelection(prefStore.getString(PreferenceConstants.WORDWRAP_KEY) != null && prefStore.getString(
+ PreferenceConstants.WORDWRAP_KEY).equals(IPreferenceStore.TRUE));
+ }
+
+ private void 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);
+ }
+
+ protected Control createContents(Composite parent) {
+ createNetworkAdapterArea(parent);
+ createBlankArea(parent, 300, true);
+
+ return parent;
+ }
+
+ /**
+ * initialize the preference store to use with the workbench
+ */
+ public void init(IWorkbench workbench) {
+ // Initialize the preference store we wish to use
+ setPreferenceStore(SkynetGuiPlugin.getInstance().getPreferenceStore());
+ }
+
+ protected void performDefaults() {
+ }
+
+ protected void performApply() {
+ performOk();
+ }
+
+ public boolean performOk() {
+ Preferences prefStore = CoreClientActivator.getInstance().getPluginPreferences();
+ prefStore.setValue(CorePreferences.INETADDRESS_KEY, "");
+ for (InetAddress address : networkButtons.keySet()) {
+ if (networkButtons.get(address).getSelection()) {
+ prefStore.setValue(CorePreferences.INETADDRESS_KEY, address.getHostAddress());
+ break;
+ }
+ }
+
+ SkynetGuiPlugin.getInstance().getPreferenceStore().putValue(PreferenceConstants.WORDWRAP_KEY,
+ wordWrapChkBox.getSelection() ? IPreferenceStore.TRUE : IPreferenceStore.FALSE);
+
+ return super.performOk();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeServicesStatusContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeServicesStatusContributionItem.java
new file mode 100644
index 00000000000..c18dacf3a7c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/OseeServicesStatusContributionItem.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.framework.ui.skynet;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.IStatusListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OseeServicesStatusContributionItem extends OseeContributionItem implements IStatusListener {
+ private static final String ID = "osee.service.status";
+ private static final Image DISABLED_IMAGE =
+ new OverlayImage(ImageManager.getImage(FrameworkImage.APPLICATION_SERVER),
+ ImageManager.getImageDescriptor(FrameworkImage.SLASH_RED_OVERLAY)).createImage();
+
+ private static String errorMessage;
+ private static String okMessage;
+
+ private OseeServicesStatusContributionItem() {
+ super(ID);
+ errorMessage = null;
+ okMessage = null;
+ updateStatus(true);
+ OseeLog.register(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.ContributionItem#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeLog.deregister(this);
+ super.dispose();
+ }
+
+ public static void addTo(IStatusLineManager manager) {
+ boolean wasFound = false;
+ for (IContributionItem item : manager.getItems()) {
+ if (item instanceof OseeServicesStatusContributionItem) {
+ wasFound = true;
+ break;
+ }
+ }
+ if (!wasFound) {
+ manager.add(new OseeServicesStatusContributionItem());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledImage()
+ */
+ @Override
+ protected Image getDisabledImage() {
+ return DISABLED_IMAGE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledToolTip()
+ */
+ @Override
+ protected String getDisabledToolTip() {
+ return errorMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledImage()
+ */
+ @Override
+ protected Image getEnabledImage() {
+ return ImageManager.getImage(FrameworkImage.APPLICATION_SERVER);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledToolTip()
+ */
+ @Override
+ protected String getEnabledToolTip() {
+ return okMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.logging.IStatusListener#onStatus(org.eclipse.osee.framework.logging.IHealthStatus)
+ */
+ @Override
+ public void onStatus(final IHealthStatus status) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ if (status.isOk()) {
+ okMessage = status.getMessage();
+ } else {
+ Throwable error = status.getException();
+ errorMessage = error != null ? error.getLocalizedMessage() : "Undefined Error";
+ }
+ updateStatus(status.isOk());
+ }
+ });
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ProgramImage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ProgramImage.java
new file mode 100644
index 00000000000..20b2efa80b2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ProgramImage.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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.skynet;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ProgramImage implements OseeImage {
+ private final String extension;
+
+ /**
+ * @param extension
+ */
+ public ProgramImage(String extension) {
+ this.extension = extension;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#createImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ Program program = Program.findProgram(extension);
+ if (program == null || program.getImageData() == null) {
+ return null;
+ }
+ return ImageDescriptor.createFromImageData(program.getImageData());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeImage#getImageKey()
+ */
+ @Override
+ public String getImageKey() {
+ return SkynetGuiPlugin.PLUGIN_ID + ".program." + extension;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationCellModifier.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationCellModifier.java
new file mode 100644
index 00000000000..b2f085e2897
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationCellModifier.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.framework.ui.skynet;
+
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeSide;
+import org.eclipse.swt.widgets.Item;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RelationCellModifier implements ICellModifier {
+ private TreeViewer treeViewer;
+
+ /**
+ *
+ */
+ public RelationCellModifier(TreeViewer treeViewer) {
+ super();
+ this.treeViewer = treeViewer;
+ // pList.addPermission(Permission.PermPermissionEnum.EDITREQUIREMENT);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+ */
+ public boolean canModify(Object element, String property) {
+ boolean isModifiable = true;
+
+ if(element instanceof RelationTypeSide){
+ isModifiable = !((RelationTypeSide)element).getArtifact().isReadOnly();
+ }
+ return isModifiable;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+ */
+ public Object getValue(Object element, String property) {
+ RelationLink relLink = (RelationLink) element;
+ return relLink.getRationale();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String,
+ * java.lang.Object)
+ */
+ public void modify(Object element, String property, Object value) {
+ // Note that it is possible for an SWT Item to be passed instead of the model element.
+ if (element instanceof Item) {
+ element = ((Item) element).getData();
+ }
+ RelationLink relLink = (RelationLink) element;
+ relLink.setRationale((String) value, true);
+ treeViewer.update(element, null);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationContentProvider.java
new file mode 100644
index 00000000000..07b7fd9d1d0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationContentProvider.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.framework.ui.skynet;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeSide;
+
+/**
+ * The basis for the comments in this class can be found at
+ * http://www.eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
+ *
+ * @author Ryan D. Brooks
+ */
+public class RelationContentProvider implements ITreeContentProvider {
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ private Artifact artifact;
+
+ /*
+ * @see IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /**
+ * Notifies this content provider that the given viewer's input has been switched to a different element.
+ * <p>
+ * A typical use for this method is registering the content provider as a listener to changes on the new input (using
+ * model-specific means), and deregistering the viewer from the old input. In response to these change notifications,
+ * the content provider propagates the changes to the viewer.
+ * </p>
+ *
+ * @param viewer the viewer
+ * @param oldInput the old input element, or <code>null</code> if the viewer did not previously have an input
+ * @param newInput the new input element, or <code>null</code> if the viewer does not have an input
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.artifact = (Artifact) newInput;
+ }
+
+ /**
+ * The tree viewer calls its content provider&#8217;s getChildren method when it needs to create or display the child
+ * elements of the domain object, <b>parent </b>. This method should answer an array of domain objects that represent
+ * the unfiltered children of <b>parent </b>
+ *
+ * @see ITreeContentProvider#getChildren(Object)
+ */
+ public Object[] getChildren(Object parentElement) {
+ try {
+ if (parentElement instanceof Artifact) {
+ Artifact artifact = (Artifact) parentElement;
+ List<RelationType> relationTypes =
+ RelationTypeManager.getValidTypes(artifact.getArtifactType(), artifact.getBranch());
+ return relationTypes.toArray();
+ } else if (parentElement instanceof RelationType) {
+ RelationType relationType = (RelationType) parentElement;
+ int sideAMax =
+ RelationTypeManager.getRelationSideMax(relationType, artifact.getArtifactType(), RelationSide.SIDE_A);
+ int sideBMax =
+ RelationTypeManager.getRelationSideMax(relationType, artifact.getArtifactType(), RelationSide.SIDE_B);
+ RelationTypeSide sideA = new RelationTypeSide(relationType, RelationSide.SIDE_A, artifact);
+ RelationTypeSide sideB = new RelationTypeSide(relationType, RelationSide.SIDE_B, artifact);
+ boolean onSideA = sideBMax > 0;
+ boolean onSideB = sideAMax > 0;
+ if (onSideA && onSideB) {
+ return new Object[] {sideA, sideB};
+ } else if (onSideA) {
+ return new Object[] {sideA};
+ } else if (onSideB) {
+ return new Object[] {sideB};
+ }
+ } else if (parentElement instanceof RelationTypeSide) {
+ RelationTypeSide relationTypeSide = (RelationTypeSide) parentElement;
+ artifact.getRelatedArtifacts(relationTypeSide); // ensure the artifacts are bulk loaded; otherwise the sort will be slower
+ List<RelationLink> relations = artifact.getRelations(relationTypeSide);
+ if (!relationTypeSide.getRelationType().isOrdered()) {
+ Collections.sort(relations, new AlphabeticalRelationComparator(relationTypeSide.getSide()));
+ }
+ return relations.toArray();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return EMPTY_ARRAY;
+ }
+
+ /*
+ * @see ITreeContentProvider#getParent(Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /**
+ * The tree viewer asks its content provider if the domain object represented by <b>element </b> has any children.
+ * This method is used by the tree viewer to determine whether or not a plus or minus should appear on the tree
+ * widget.
+ *
+ * @see ITreeContentProvider#hasChildren(Object)
+ */
+ public boolean hasChildren(Object element) {
+ if (element instanceof RelationTypeSide) {
+ try {
+ return artifact.getRelatedArtifactsCount((RelationTypeSide) element) > 0;
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return false;
+ }
+ }
+ return getChildren(element).length > 0;
+ }
+
+ /**
+ * This is the method invoked by calling the <b>setInput </b> method on the tree viewer. In fact, the <b>getElements
+ * </b> method is called only in response to the tree viewer's <b>setInput </b> method and should answer with the
+ * appropriate domain objects of the inputElement. The <b>getElements </b> and <b>getChildren </b> methods operate in
+ * a similar way. Depending on your domain objects, you may have the <b>getElements </b> simply return the result of
+ * calling <b>getChildren </b>. The two methods are kept distinct because it provides a clean way to differentiate
+ * between the root domain object and all other domain objects.
+ *
+ * @see IStructuredContentProvider#getElements(Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationLabelProvider.java
new file mode 100644
index 00000000000..0aef5febf21
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationLabelProvider.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeSide;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RelationLabelProvider implements ITableLabelProvider, ILabelProvider {
+ private Artifact artifact;
+
+ public RelationLabelProvider(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (element instanceof RelationType && columnIndex == 0) {
+ return ImageManager.getImage(FrameworkImage.RELATION);
+ } else if (element instanceof RelationLink && columnIndex == 0) {
+ RelationLink relation = (RelationLink) element;
+ try {
+ return ImageManager.getImage(relation.getArtifactOnOtherSide(artifact));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof RelationTypeSide && columnIndex == 0) {
+ RelationTypeSide side = (RelationTypeSide) element;
+ return side.getSideName() + " \"" + (side.isSideA() ? side.getRelationType().getAToBPhrasing() : side.getRelationType().getBToAPhrasing()) + "\" " + (side.isSideA() ? side.getRelationType().getSideBName() : side.getRelationType().getSideAName()) + " \"" + artifact.getDescriptiveName() + "\"";
+ } else if (element instanceof RelationType) {
+ if (columnIndex == 0) {
+ return ((RelationType) element).getTypeName();
+ }
+ } else if (element instanceof RelationLink) {
+ RelationLink link = (RelationLink) element;
+ if (columnIndex == 0) {
+ try {
+ return link.getArtifactOnOtherSide(artifact).getDescriptiveName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (columnIndex == 1) {
+ return link.getRationale();
+ }
+ }
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+ * java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public Image getImage(Object element) {
+ return getColumnImage(element, 0);
+ }
+
+ public String getText(Object element) {
+ return getColumnText(element, 0);
+ }
+
+ /**
+ * @param artifact The artifact to set.
+ */
+ public void setArtifact(Artifact artifact) {
+ this.artifact = artifact;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationsComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationsComposite.java
new file mode 100644
index 00000000000..bec27475aaa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/RelationsComposite.java
@@ -0,0 +1,925 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeSide;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener;
+import org.eclipse.osee.framework.ui.skynet.relation.explorer.RelationExplorerWindow;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+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.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RelationsComposite extends Composite implements IRelationModifiedEventListener, IFrameworkTransactionEventListener {
+ private TreeViewer treeViewer;
+ private Tree tree;
+ private NeedSelectedArtifactListener needSelectedArtifactListener;
+ private final IDirtiableEditor editor;
+ public static final String VIEW_ID = "osee.define.relation.RelationExplorer";
+ public static final String[] columnNames = new String[] {" ", "Rationale"};
+ // the index of column order
+ private static int COLUMN_ORDER = 1;
+
+ private MenuItem openMenuItem;
+ private MenuItem openWithMenuItem;
+ private MenuItem editMenuItem;
+ private MenuItem viewRelationTreeItem;
+ private MenuItem orderRelationMenuItem;
+ private MenuItem deleteRelationMenuItem;
+ private MenuItem deleteArtifactMenuItem;
+ private MenuItem massEditMenuItem;
+
+ private final Artifact artifact;
+ private final RelationLabelProvider relationLabelProvider;
+ private final ToolBar toolBar;
+
+ private final Map<Integer, RelationLink> artifactToLinkMap;
+
+ public RelationsComposite(IDirtiableEditor editor, Composite parent, int style, Artifact artifact) {
+ this(editor, parent, style, artifact, null);
+ }
+
+ public RelationsComposite(IDirtiableEditor editor, Composite parent, int style, Artifact artifact, ToolBar toolBar) {
+ super(parent, style);
+
+ if (artifact == null) {
+ throw new IllegalArgumentException("Can not edit a null artifact");
+ }
+
+ this.artifact = artifact;
+ this.editor = editor;
+ this.relationLabelProvider = new RelationLabelProvider(artifact);
+ this.artifactToLinkMap = new HashMap<Integer, RelationLink>();
+
+ createPartControl();
+ OseeEventManager.addListener(this);
+ this.toolBar = toolBar;
+ }
+
+ public TreeViewer getTreeViewer() {
+ return treeViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createPartControl() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createTreeArea(this);
+ createColumns();
+ packColumnData();
+
+ needSelectedArtifactListener = new NeedSelectedArtifactListener();
+ createPopupMenu();
+ setHelpContexts();
+ }
+
+ private void createTreeArea(Composite parent) {
+ treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION | SWT.MULTI);
+ tree = treeViewer.getTree();
+ tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ tree.setHeaderVisible(true);
+
+ CellEditor[] editors = new CellEditor[columnNames.length];
+ editors[1] = new TextCellEditor(tree);
+ treeViewer.setCellEditors(editors);
+ treeViewer.setCellModifier(new RelationCellModifier(treeViewer));
+ treeViewer.setColumnProperties(columnNames);
+ treeViewer.setContentProvider(new RelationContentProvider());
+ treeViewer.setLabelProvider(relationLabelProvider);
+ treeViewer.setSorter(new LabelSorter() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof RelationLink && e2 instanceof RelationLink) {
+ return 0;
+ }
+ return super.compare(viewer, e1, e2);
+ }
+ });
+ treeViewer.setUseHashlookup(true);
+ treeViewer.setInput(artifact);
+
+ treeViewer.addDoubleClickListener(new DoubleClickListener());
+ tree.addKeyListener(new keySelectedListener());
+ treeViewer.addTreeListener(new ITreeViewerListener() {
+
+ public void treeCollapsed(TreeExpansionEvent event) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ packColumnData();
+ }
+ });
+
+ }
+
+ public void treeExpanded(TreeExpansionEvent event) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ packColumnData();
+ }
+ });
+ }
+
+ });
+
+ tree.addMouseMoveListener(new MouseMoveListener() {
+
+ public void mouseMove(MouseEvent e) {
+ }
+ });
+
+ expandItemsThatHaveChildren();
+ new RelationSkynetDragAndDrop(tree, VIEW_ID);
+ }
+
+ private void expandItemsThatHaveChildren() {
+ //expand items that have children
+ Object[] types = ((ITreeContentProvider) treeViewer.getContentProvider()).getChildren(treeViewer.getInput());
+ for (Object obj : types) {
+ if (obj instanceof RelationType) {
+ RelationType type = (RelationType) obj;
+ if (RelationManager.getRelatedArtifactsCount(artifact, type, null) > 0) {
+ treeViewer.expandToLevel(obj, 1);
+ }
+ }
+ }
+ }
+
+ private void createColumns() {
+ for (int index = 0; index < columnNames.length; index++) {
+ TreeColumn column = new TreeColumn(tree, SWT.LEFT, index);
+ column.setText(columnNames[index]);
+ }
+ }
+
+ private void packColumnData() {
+ TreeColumn[] columns = treeViewer.getTree().getColumns();
+ for (TreeColumn column : columns) {
+ column.pack();
+ }
+ }
+
+ public void createPopupMenu() {
+ Menu popupMenu = new Menu(treeViewer.getTree().getParent());
+ popupMenu.addMenuListener(needSelectedArtifactListener);
+
+ createOpenMenuItem(popupMenu);
+ // createOpenWithMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createEditMenuItem(popupMenu);
+ createMassEditMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createViewRelationTreeMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createOrderRelationTreeMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createDeleteRelationMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+
+ createExpandAllMenuItem(popupMenu);
+ createSelectAllMenuItem(popupMenu);
+
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ createDeleteArtifactMenuItem(popupMenu);
+
+ tree.setMenu(popupMenu);
+ }
+
+ public class DoubleClickListener implements IDoubleClickListener {
+ public void doubleClick(DoubleClickEvent event) {
+ openViewer((IStructuredSelection) event.getSelection());
+ }
+ }
+
+ private void createOrderRelationTreeMenuItem(final Menu parentMenu) {
+ orderRelationMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ orderRelationMenuItem.setText("&Order Relation");
+ needSelectedArtifactListener.add(orderRelationMenuItem);
+ orderRelationMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ performOrderRelation();
+ }
+ });
+ parentMenu.addListener(SWT.Show, new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ String errorMessage = checkSelectionForOrderRelation();
+ orderRelationMenuItem.setEnabled(!Strings.isValid(errorMessage));
+ if (errorMessage.length() > 0) {
+ errorMessage = ": " + errorMessage;
+ }
+ orderRelationMenuItem.setText(String.format("&Order Relation%s", errorMessage));
+ }
+
+ });
+ orderRelationMenuItem.setEnabled(true);
+ }
+
+ private Set<RelationLink> getSelectionForOrderRelation() {
+ Set<RelationLink> selectedItems = new HashSet<RelationLink>();
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ Object object = iter.next();
+ if (object instanceof RelationLink) {
+ selectedItems.add((RelationLink) object);
+ }
+ }
+ return selectedItems;
+ }
+
+ private String checkSelectionForOrderRelation() {
+ String errorMessage = "";
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ if (selection.isEmpty()) {
+ errorMessage = "None Selected";
+ } else {
+ Set<RelationLink> selectedItems = getSelectionForOrderRelation();
+ if (selectedItems.isEmpty()) {
+ errorMessage = "No Artifacts Selected";
+ } else if (selectedItems.size() == 1) {
+ RelationLink link = selectedItems.iterator().next();
+ errorMessage = String.format("Select more than 1 artifact for [%s]", link.getRelationType().getTypeName());
+ } else {
+ Artifact aArtifact = null;
+ for (RelationLink link : selectedItems) {
+ RelationType type = link.getRelationType();
+ if (!type.isOrdered()) {
+ errorMessage = String.format("Item with static order selected [%s]", type.getTypeName());
+ break;
+ }
+ try {
+ Artifact aSide = link.getArtifactA();
+ if (aArtifact == null) {
+ aArtifact = aSide;
+ } else {
+ if (!aSide.equals(aArtifact)) {
+ errorMessage =
+ String.format("Item from different link sides selected [%s]", aSide.getDescriptiveName());
+ break;
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return errorMessage;
+ }
+
+ private void createDeleteRelationMenuItem(final Menu parentMenu) {
+ deleteRelationMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ deleteRelationMenuItem.setText("&Delete Relation");
+ needSelectedArtifactListener.add(deleteRelationMenuItem);
+ deleteRelationMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+
+ try {
+ performDeleteRelation(selection);
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ deleteRelationMenuItem.setEnabled(true);
+ }
+
+ private void createDeleteArtifactMenuItem(final Menu parentMenu) {
+ deleteArtifactMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ deleteArtifactMenuItem.setText("&Delete Artifact");
+ needSelectedArtifactListener.add(deleteArtifactMenuItem);
+ deleteArtifactMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+
+ performDeleteArtifact(selection);
+ }
+ });
+
+ deleteArtifactMenuItem.setEnabled(true);
+ }
+
+ private void createMassEditMenuItem(final Menu parentMenu) {
+ massEditMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ massEditMenuItem.setText("&Mass Edit");
+ needSelectedArtifactListener.add(massEditMenuItem);
+ massEditMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+
+ performMassEdit(selection);
+ }
+ });
+
+ massEditMenuItem.setEnabled(true);
+ }
+
+ private void createViewRelationTreeMenuItem(Menu menu) {
+ viewRelationTreeItem = new MenuItem(menu, SWT.PUSH);
+ viewRelationTreeItem.setText("&View Relation Table Report");
+ viewRelationTreeItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ TreeViewerReport report =
+ new TreeViewerReport("Relation View Report for " + artifact.getDescriptiveName(), treeViewer);
+ ArrayList<Integer> ignoreCols = new ArrayList<Integer>();
+ ignoreCols.add(COLUMN_ORDER);
+ report.setIgnoreColumns(ignoreCols);
+ report.open();
+ }
+ });
+ }
+
+ private void createOpenMenuItem(Menu parentMenu) {
+ openMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ openMenuItem.setText("Open");
+ needSelectedArtifactListener.addArtifactEnabled(openMenuItem);
+ openMenuItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ openViewer((IStructuredSelection) treeViewer.getSelection());
+ }
+ });
+ }
+
+ private void createOpenWithMenuItem(Menu parentMenu) {
+ openWithMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ openWithMenuItem.setText("&Open With");
+ final Menu submenu = new Menu(openWithMenuItem);
+ openWithMenuItem.setMenu(submenu);
+ needSelectedArtifactListener.addArtifactEnabled(openWithMenuItem);
+ parentMenu.addMenuListener(new OpenWithMenuListener(submenu, treeViewer, new IRebuildMenuListener() {
+
+ @Override
+ public void rebuildMenu() {
+ createPopupMenu();
+ }
+
+ }));
+ }
+
+ private void openViewer(IStructuredSelection selection) {
+ Object object = selection.getFirstElement();
+ Artifact selectedArtifact = null;
+
+ if (object instanceof RelationLink) {
+ RelationLink link = (RelationLink) object;
+ try {
+ selectedArtifact = link.getArtifactOnOtherSide(artifact);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ ArtifactEditor.editArtifact(selectedArtifact);
+ }
+ }
+
+ private void performOrderRelation() {
+ try {
+ Set<RelationLink> selectedItems = getSelectionForOrderRelation();
+ List<RelationLink> items = new ArrayList<RelationLink>(selectedItems);
+
+ RelationLink link = items.iterator().next();
+ RelationSide side = link.getSide(link.getArtifactB());
+ java.util.Collections.sort(items, new AlphabeticalRelationComparator(side));
+ System.out.println(items);
+ AWorkbench.popup("This feature is not yet supported");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private void performMassEdit(IStructuredSelection selection) {
+ Set<Artifact> selectedArtifacts = new HashSet<Artifact>();
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ Object object = iter.next();
+ if (object instanceof RelationLink) {
+ RelationLink link = (RelationLink) object;
+ try {
+ selectedArtifacts.add(link.getArtifactB());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ MassArtifactEditor.editArtifacts("Mass Edit", selectedArtifacts);
+ }
+
+ private void createEditMenuItem(Menu parentMenu) {
+ editMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ editMenuItem.setText("&Edit");
+
+ needSelectedArtifactListener.add(editMenuItem);
+ editMenuItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Object object = selection.getFirstElement();
+
+ if (object instanceof Artifact) {
+ RendererManager.openInJob((Artifact) object, PresentationType.SPECIALIZED_EDIT);
+ }
+ }
+ });
+ }
+
+ private void createExpandAllMenuItem(Menu parentMenu) {
+ MenuItem menuItem = new MenuItem(parentMenu, SWT.PUSH);
+ menuItem.setText("Expand All\tCtrl+X");
+ menuItem.addSelectionListener(new ExpandListener());
+ }
+
+ public class ExpandListener extends SelectionAdapter {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ treeViewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ packColumnData();
+ }
+ }
+
+ public class NeedSelectedArtifactListener implements MenuListener {
+ Collection<MenuItem> accessControlitems;
+ Collection<MenuItem> artEnabledOnlyitems;
+
+ public NeedSelectedArtifactListener() {
+ this.accessControlitems = new LinkedList<MenuItem>();
+ this.artEnabledOnlyitems = new LinkedList<MenuItem>();
+ }
+
+ public void addArtifactEnabled(MenuItem item) {
+ artEnabledOnlyitems.add(item);
+
+ }
+
+ public void add(MenuItem item) {
+ accessControlitems.add(item);
+ }
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ boolean valid = selection.getFirstElement() instanceof RelationLink;
+
+ for (MenuItem item : accessControlitems) {
+ item.setEnabled(valid && !artifact.isReadOnly());
+ }
+
+ for (MenuItem item : artEnabledOnlyitems) {
+ item.setEnabled(valid);
+ }
+ }
+ }
+
+ private void createSelectAllMenuItem(Menu parentMenu) {
+ MenuItem menuItem = new MenuItem(parentMenu, SWT.PUSH);
+ menuItem.setText("&Select All\tCtrl+A");
+ menuItem.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ treeViewer.getTree().selectAll();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ private void expandAll(IStructuredSelection selection) {
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ treeViewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ this.packColumnData();
+ }
+
+ /**
+ * Performs the deletion functionality
+ *
+ * @param selection
+ */
+ private void performDeleteArtifact(IStructuredSelection selection) {
+ ArrayList<Artifact> artifactsToBeDeleted = new ArrayList<Artifact>(selection.size());
+
+ try {
+ //Add all of the artifacts to a list first
+ for (Object object : selection.toList()) {
+ if (object instanceof RelationLink) {
+ RelationLink relLink = (RelationLink) object;
+ if (relLink.getArtifactA() == artifact) {
+ artifactsToBeDeleted.add(relLink.getArtifactB());
+ } else {
+ artifactsToBeDeleted.add(relLink.getArtifactA());
+ }
+ }
+ }
+
+ //Ask if they are sure they want all artifacts to be deleted
+ if (!artifactsToBeDeleted.isEmpty()) {
+ if (MessageDialog.openConfirm(
+ Display.getCurrent().getActiveShell(),
+ "Delete Artifact (s)",
+ "Delete Artifact (s)?\n\n\"" + Collections.toString(",", artifactsToBeDeleted) + "\"\n\nNOTE: This will delete the artifact from the system. Use \"Delete Relation\" to remove this artifact from the relation.")) {
+
+ for (Artifact artifact : artifactsToBeDeleted) {
+ artifact.deleteAndPersist();
+ }
+ }
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ refresh();
+ }
+
+ /**
+ * Performs the deletion functionality
+ *
+ * @param selection
+ * @throws ArtifactDoesNotExist
+ */
+ private void performDeleteRelation(IStructuredSelection selection) throws ArtifactDoesNotExist {
+ if (artifact.isReadOnly()) {
+ MessageDialog.openError(
+ Display.getCurrent().getActiveShell(),
+ "Delete Relation Error",
+ "Access control has restricted this action. The current user does not have sufficient permission to delete objects on this artifact.");
+ return;
+ }
+
+ Object[] objects = selection.toArray();
+ for (Object object : objects) {
+ if (object instanceof RelationLink) {
+ ((RelationLink) object).delete(true);
+
+ RelationType relationType = ((RelationLink) object).getRelationType();
+ int sideAMax =
+ RelationTypeManager.getRelationSideMax(relationType, artifact.getArtifactType(), RelationSide.SIDE_A);
+ int sideBMax =
+ RelationTypeManager.getRelationSideMax(relationType, artifact.getArtifactType(), RelationSide.SIDE_B);
+ RelationTypeSide sideA = new RelationTypeSide(relationType, RelationSide.SIDE_A, artifact);
+ RelationTypeSide sideB = new RelationTypeSide(relationType, RelationSide.SIDE_B, artifact);
+ boolean onSideA = sideBMax > 0;
+ boolean onSideB = sideAMax > 0;
+ if (onSideA && onSideB) {
+ treeViewer.refresh(sideA);
+ } else if (onSideA) {
+ treeViewer.refresh(sideA);
+ treeViewer.refresh(sideB);
+ } else if (onSideB) {
+ treeViewer.refresh(sideB);
+ }
+ } else if (object instanceof RelationType) {
+ RelationType relationType = (RelationType) object;
+ RelationManager.deleteRelations(artifact, relationType, null);
+ treeViewer.refresh(relationType);
+ } else if (object instanceof RelationTypeSide) {
+ RelationTypeSide group = (RelationTypeSide) object;
+ RelationManager.deleteRelations(artifact, group.getRelationType(), group.getSide());
+ treeViewer.refresh(group);
+ }
+ }
+ }
+
+ public void refresh() {
+ if (!treeViewer.getTree().isDisposed()) {
+ treeViewer.refresh();
+ packColumnData();
+ }
+ }
+
+ private class keySelectedListener implements KeyListener {
+ public void keyPressed(KeyEvent e) {
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.keyCode == SWT.DEL) {
+ try {
+ performDeleteRelation((IStructuredSelection) treeViewer.getSelection());
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ if (e.keyCode == 'a' && e.stateMask == SWT.CONTROL) {
+ treeViewer.getTree().selectAll();
+ }
+ if (e.keyCode == 'x' && e.stateMask == SWT.CONTROL) {
+ expandAll((IStructuredSelection) treeViewer.getSelection());
+ }
+ }
+ }
+
+ /**
+ * @return Returns the artifact.
+ */
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ public void refreshArtifact(Artifact newArtifact) {
+ relationLabelProvider.setArtifact(newArtifact);
+ treeViewer.setInput(newArtifact);
+ expandItemsThatHaveChildren();
+ refresh();
+ }
+
+ private class RelationSkynetDragAndDrop extends SkynetDragAndDrop {
+ boolean isFeedbackAfter = false;
+
+ public RelationSkynetDragAndDrop(Tree tree, String viewId) {
+ super(tree, viewId);
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Object[] objects = selection.toArray();
+ Artifact[] artifacts = null;
+
+ if (objects.length > 0 && objects[0] instanceof RelationLink) {
+ artifacts = new Artifact[objects.length];
+
+ for (int index = 0; index < objects.length; index++) {
+ RelationLink link = (RelationLink) objects[index];
+ Artifact selectedArtifact = null;
+ try {
+ selectedArtifact = link.getArtifactOnOtherSide(artifact);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ artifacts[index] = selectedArtifact;
+ artifactToLinkMap.put(selectedArtifact.getArtId(), link);
+ }
+ }
+ return artifacts;
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ Tree tree = treeViewer.getTree();
+ TreeItem selected = tree.getItem(treeViewer.getTree().toControl(event.x, event.y));
+
+ event.feedback = DND.FEEDBACK_EXPAND;
+ event.detail = DND.DROP_NONE;
+
+ if (selected != null && selected.getData() instanceof RelationTypeSide) {
+ if (artifact.isReadOnly()) {
+ event.detail = DND.DROP_NONE;
+
+ MessageDialog.openError(
+ Display.getCurrent().getActiveShell(),
+ "Create Relation Error",
+ "Access control has restricted this action. The current user does not have sufficient permission to create relations on this artifact.");
+ return;
+ } else {
+ event.detail = DND.DROP_COPY;
+ tree.setInsertMark(null, false);
+ }
+ } else if (selected != null && selected.getData() instanceof RelationLink) {
+ RelationLink targetLink = (RelationLink) selected.getData();
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Object obj = selection.getFirstElement();
+ if (obj instanceof RelationLink) {
+ RelationLink dropTarget = (RelationLink) obj;
+
+ if (artifact.isReadOnly()) {
+ event.detail = DND.DROP_NONE;
+
+ MessageDialog.openError(
+ Display.getCurrent().getActiveShell(),
+ "Create Relation Error",
+ "Access control has restricted this action. The current user does not have sufficient permission to create relations on this artifact.");
+ return;
+ }
+ // the links must be in the same group
+
+ if (targetLink.getSide(artifact).equals(dropTarget.getSide(artifact)) && targetLink.getRelationType().equals(
+ dropTarget.getRelationType())) {
+ if (isFeedbackAfter) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ } else {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.detail = DND.DROP_MOVE;
+ }
+ }
+ } else {
+ tree.setInsertMark(null, false);
+ }
+ }
+
+ @Override
+ public void operationChanged(DropTargetEvent event) {
+ if (!isCtrlPressed(event)) {
+ isFeedbackAfter = false;
+ }
+ }
+
+ private boolean isCtrlPressed(DropTargetEvent event) {
+ boolean ctrPressed = event.detail == 1;
+
+ if (ctrPressed) {
+ isFeedbackAfter = true;
+ }
+ return ctrPressed;
+ }
+
+ @Override
+ public void performDrop(DropTargetEvent event) {
+ TreeItem selected = treeViewer.getTree().getItem(treeViewer.getTree().toControl(event.x, event.y));
+ Object object = selected.getData();
+ try {
+
+ System.out.println(event.getSource());
+
+ if (object instanceof RelationLink) {//used for ordering
+ RelationLink targetLink = (RelationLink) object;
+ // RelationManager.addRelationAndModifyOrder(artifact, targetLink.getArtifactOnOtherSide(artifact),
+ // ((ArtifactData) event.data).getArtifacts(), targetLink.getRelationType(), true);
+
+ Artifact target = targetLink.getArtifactOnOtherSide(artifact);
+ for (Artifact art : ((ArtifactData) event.data).getArtifacts()) {
+ artifact.setRelationOrder(target, isFeedbackAfter, new RelationTypeSide(targetLink.getRelationType(),
+ targetLink.getSide(artifact).oppositeSide(), artifact), art);
+ target = art;
+ }
+ treeViewer.refresh();
+ editor.onDirtied();
+ } else if (object instanceof RelationTypeSide) {
+ RelationTypeSide group = (RelationTypeSide) object;
+
+ RelationExplorerWindow window = new RelationExplorerWindow(treeViewer, group);
+
+ ArtifactDragDropSupport.performDragDrop(event, window,
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ window.createArtifactInformationBox();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ isFeedbackAfter = false;
+ }
+ }
+
+ private void setHelpContexts() {
+ SkynetGuiPlugin.getInstance().setHelp(treeViewer.getControl(), "relation_page_tree_viewer");
+ }
+
+ /**
+ * @return the toolBar
+ */
+ public ToolBar getToolBar() {
+ return toolBar;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IRelationModifiedEventListener#handleRelationModifiedEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.relation.RelationModifiedEvent.RelationModType, org.eclipse.osee.framework.skynet.core.relation.RelationLink, org.eclipse.osee.framework.skynet.core.artifact.Branch, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void handleRelationModifiedEvent(Sender sender, RelationModType relationModType, RelationLink link, Branch branch, String relationType) {
+ try {
+ if (link.getArtifactA().equals(this.artifact) || link.getArtifactB().equals(this.artifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (!treeViewer.getControl().isDisposed()) {
+ treeViewer.refresh();
+ }
+ }
+ });
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (transData.isRelAddedChangedDeleted(this.artifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (!treeViewer.getControl().isDisposed()) {
+ treeViewer.refresh();
+ }
+ }
+ });
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SessionContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SessionContributionItem.java
new file mode 100644
index 00000000000..3be824c76fe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SessionContributionItem.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.event.AccessControlEventType;
+import org.eclipse.osee.framework.skynet.core.event.IAccessControlEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage;
+import org.eclipse.osee.framework.ui.skynet.dialogs.AuthenticationDialog;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SessionContributionItem extends OseeContributionItem implements IAccessControlEventListener {
+
+ private static final String ID = "session.contribution.item";
+
+ private static final Image DISABLED_IMAGE =
+ new OverlayImage(ImageManager.getImage(FrameworkImage.USER),
+ ImageManager.getImageDescriptor(FrameworkImage.SLASH_RED_OVERLAY)).createImage();
+
+ private static String ENABLED_TOOLTIP = "Authenticated as: %s (%s) - session(%s)\nDouble-Click to Log Off.";
+ private static String DISABLED_TOOLTIP = "Not Authenticated.\nDouble-Click to Log On.";
+
+ private SessionContributionItem() {
+ super(ID);
+ init();
+ updateStatus(true);
+ OseeEventManager.addListener(this);
+ }
+
+ private void init() {
+ setActionHandler(new Action() {
+
+ @Override
+ public void run() {
+ try {
+ if (ClientSessionManager.isSessionValid()) {
+ boolean result =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ "Log Off...", "Are you sure you want to log off and exit OSEE?");
+ if (result) {
+ ClientSessionManager.releaseSession();
+
+ PlatformUI.getWorkbench().close();
+ }
+ } else {
+ // if (oseeAuthentication.isLoginAllowed()) {
+ AuthenticationDialog.openDialog();
+ // } else {
+ // oseeAuthentication.authenticate("", "", "", false);
+ // }
+ if (ClientSessionManager.isSessionValid()) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ OseeEventManager.kickAccessControlArtifactsEvent(this,
+ AccessControlEventType.UserAuthenticated, LoadedArtifacts.EmptyLoadedArtifacts());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ }
+
+ public static void addTo(IStatusLineManager manager) {
+ boolean wasFound = false;
+ for (IContributionItem item : manager.getItems()) {
+ if (item instanceof SessionContributionItem) {
+ wasFound = true;
+ break;
+ }
+ }
+ if (!wasFound) {
+ manager.add(new SessionContributionItem());
+ }
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IAccessControlEventListener#handleAccessControlArtifactsEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.eventx.AccessControlModType, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleAccessControlArtifactsEvent(Sender sender, AccessControlEventType accessControlEventType, LoadedArtifacts loadedArtifactss) {
+ if (accessControlEventType == AccessControlEventType.UserAuthenticated) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ updateStatus(ClientSessionManager.isSessionValid());
+ }
+ });
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledImage()
+ */
+ @Override
+ protected Image getDisabledImage() {
+ return DISABLED_IMAGE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledToolTip()
+ */
+ @Override
+ protected String getDisabledToolTip() {
+ return DISABLED_TOOLTIP;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledImage()
+ */
+ @Override
+ protected Image getEnabledImage() {
+ return ImageManager.getImage(FrameworkImage.USER);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledToolTip()
+ */
+ @Override
+ protected String getEnabledToolTip() {
+ if (ClientSessionManager.isSessionValid()) {
+ String skynetName = "Unknown";
+ String userId = "-";
+ String sessionId = "-";
+ try {
+ skynetName = UserManager.getUser().getName();
+ userId = UserManager.getUser().getUserId();
+ sessionId = ClientSessionManager.getSessionId();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return String.format(ENABLED_TOOLTIP, skynetName, userId, sessionId);
+ }
+ return DISABLED_TOOLTIP;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetGuiPlugin.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetGuiPlugin.java
new file mode 100644
index 00000000000..083146ed583
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetGuiPlugin.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationRequiredException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.event.BroadcastEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBroadcastEventListneer;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.OseeFormActivator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class SkynetGuiPlugin extends OseeFormActivator implements IBroadcastEventListneer {
+ private static SkynetGuiPlugin pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "org.eclipse.osee.framework.ui.skynet";
+ public static final String CHANGE_REPORT_ATTRIBUTES_PREF =
+ "org.eclipse.osee.framework.ui.skynet.changeReportAttributes";
+ public static final String ARTIFACT_EXPLORER_ATTRIBUTES_PREF =
+ "org.eclipse.osee.framework.ui.skynet.artifactExplorerAttributes";
+
+ public static final String ARTIFACT_SEARCH_RESULTS_ATTRIBUTES_PREF =
+ "org.eclipse.osee.framework.ui.skynet.artifactSearchResultsAttributes";
+ private ServiceTracker packageAdminTracker;
+
+ public SkynetGuiPlugin() {
+ super();
+ pluginInstance = this;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.OseeFormActivator#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ packageAdminTracker.close();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.OseeUiActivator#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ packageAdminTracker = new ServiceTracker(context, PackageAdmin.class.getName(), null);
+ packageAdminTracker.open();
+ OseeEventManager.addListener(this);
+ OseeLog.registerLoggerListener(new DialogPopupLoggerListener());
+
+ if (PlatformUI.isWorkbenchRunning()) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.addWorkbenchListener(new IWorkbenchListener() {
+
+ @Override
+ public void postShutdown(IWorkbench workbench) {
+ }
+
+ @Override
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ try {
+ UserManager.getUser().saveSettings();
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ return true;
+ }
+ });
+ }
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static SkynetGuiPlugin getInstance() {
+ return pluginInstance;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.plugin.core.util.plugin.OseePlugin#getPluginName()
+ */
+ @Override
+ protected String getPluginName() {
+ return PLUGIN_ID;
+ }
+
+ /**
+ * @return PackageAdmin
+ */
+ public PackageAdmin getPackageAdmin() {
+ return (PackageAdmin) this.packageAdminTracker.getService();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBroadcastEventListneer#handleBroadcastEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, java.lang.String)
+ */
+ @Override
+ public void handleBroadcastEvent(Sender sender, BroadcastEventType broadcastEventType, String[] userIds, final String message) {
+ boolean isShutdownAllowed = false;
+
+ // Determine whether this is a shutdown event
+ // Prevent shutting down users without a valid message
+ if (broadcastEventType == BroadcastEventType.Force_Shutdown) {
+ if (message == null || message.length() == 0) return;
+ try {
+ User user = UserManager.getUser();
+ if (user != null) {
+ String userId = user.getUserId();
+ for (String temp : userIds) {
+ if (temp.equals(userId)) {
+ isShutdownAllowed = true;
+ break;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, "Error processing shutdown", ex);
+ }
+ final boolean isShutdownRequest = isShutdownAllowed;
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (isShutdownRequest) {
+ MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Shutdown Requested", message);
+ // Shutdown the bench when this event is received
+ PlatformUI.getWorkbench().close();
+ }
+ }
+ });
+ } else if (broadcastEventType == BroadcastEventType.Message) {
+ if (message == null || message.length() == 0) return;
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Remote Message", message);
+ }
+ });
+ } else if (broadcastEventType == BroadcastEventType.Ping) {
+ // Another client ping'd this client for session information; Pong back with
+ // original client's session id so it can be identified as the correct pong
+ try {
+ OseeEventManager.kickBroadcastEvent(this, BroadcastEventType.Pong, new String[] {},
+ sender.getOseeSession().toString());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (broadcastEventType == BroadcastEventType.Pong) {
+ // Got pong from another client; If message == this client's sessionId, then it's
+ // the response from this client's ping
+ try {
+ if (message != null && message.equals(ClientSessionManager.getSession().toString())) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, "Pong: " + sender.toString());
+ }
+ } catch (OseeAuthenticationRequiredException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, "Pong: " + sender.toString(), ex);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetServiceContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetServiceContributionItem.java
new file mode 100644
index 00000000000..8c58ecb8305
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/SkynetServiceContributionItem.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.framework.ui.skynet;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.osee.framework.skynet.core.event.IRemoteEventManagerEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.RemoteEventManager;
+import org.eclipse.osee.framework.skynet.core.event.RemoteEventServiceEventType;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class SkynetServiceContributionItem extends OseeContributionItem implements IRemoteEventManagerEventListener {
+
+ public static final String ID = "skynet.service";
+ private static final Image ENABLED_IMAGE =
+ new OverlayImage(ImageManager.getImage(FrameworkImage.GEAR),
+ ImageManager.getImageDescriptor(FrameworkImage.LASER_OVERLAY)).createImage();
+ private static final Image DISABLED_IMAGE =
+ new OverlayImage(ENABLED_IMAGE, ImageManager.getImageDescriptor(FrameworkImage.SLASH_RED_OVERLAY)).createImage();
+ private static final String ENABLED_TOOLTIP = "Remote event service is connected.";
+ private static final String DISABLED_TOOLTIP = "Remote event service is disconnected.";
+
+ public SkynetServiceContributionItem() {
+ super(ID);
+ updateStatus(RemoteEventManager.isConnected());
+ OseeEventManager.addListener(this);
+ }
+
+ public static void addTo(IStatusLineManager manager) {
+ boolean wasFound = false;
+ for (IContributionItem item : manager.getItems()) {
+ if (item instanceof SkynetServiceContributionItem) {
+ wasFound = true;
+ break;
+ }
+ }
+ if (!wasFound) {
+ manager.add(new SkynetServiceContributionItem());
+ }
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IRemoteEventManagerEventListener#handleRemoteEventManagerEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.eventx.RemoteEventModType)
+ */
+ @Override
+ public void handleRemoteEventManagerEvent(Sender sender, final RemoteEventServiceEventType remoteEventServiceEventType) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ updateStatus(remoteEventServiceEventType == RemoteEventServiceEventType.Connected);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledImage()
+ */
+ @Override
+ protected Image getDisabledImage() {
+ return DISABLED_IMAGE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getDisabledToolTip()
+ */
+ @Override
+ protected String getDisabledToolTip() {
+ return DISABLED_TOOLTIP;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledImage()
+ */
+ @Override
+ protected Image getEnabledImage() {
+ return ENABLED_IMAGE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.OseeContributionItem#getEnabledToolTip()
+ */
+ @Override
+ protected String getEnabledToolTip() {
+ return ENABLED_TOOLTIP;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TableViewerReport.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TableViewerReport.java
new file mode 100644
index 00000000000..4959eb08b7c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TableViewerReport.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+public class TableViewerReport {
+
+ private final TableViewer tableViewer;
+ private final String title;
+
+ public TableViewerReport(String title, TableViewer tableViewer) {
+ this.title = title;
+ this.tableViewer = tableViewer;
+ }
+
+ public TableViewerReport(TableViewer tableViewer) {
+ this("Table View Report", tableViewer);
+ }
+
+ public void open() {
+ open(tableViewer.getTable().getItems());
+ }
+
+ public void open(TableItem items[]) {
+ String html = getHtml(items);
+ XResultData xResultData = new XResultData();
+ xResultData.addRaw(html);
+ try {
+ xResultData.report(title, Manipulations.RAW_HTML);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public String getHtml(TableItem items[]) {
+ String html = "<html><body>";
+ html += AHTML.beginMultiColumnTable(100, 1);
+ TableColumn cols[] = tableViewer.getTable().getColumns();
+ Integer width[] = new Integer[cols.length + 1];
+ String colNames[] = new String[cols.length + 1];
+ for (int x = 0; x < cols.length + 1; x++) {
+ if (x < cols.length) {
+ TableColumn col = cols[x];
+ width[x] = col.getWidth();
+ colNames[x] = col.getText();
+ } else {
+ width[x] = 20;
+ colNames[x] = "ID";
+ }
+ }
+ html += AHTML.addHeaderRowMultiColumnTable(colNames, width);
+ // Get column widths and column name and setup the columns
+ IBaseLabelProvider labelProvider = tableViewer.getLabelProvider();
+ ArrayList<String[]> list = new ArrayList<String[]>();
+ for (TableItem item : items) {
+ addRow(item, list, labelProvider, cols.length > 0 ? cols.length : 1, 1);
+ }
+ for (String[] strs : list) {
+ html += AHTML.addRowMultiColumnTable(strs);
+ }
+ html += AHTML.endMultiColumnTable();
+ html += "</body></html>";
+ return html;
+ }
+
+ public void addRow(TableItem item, ArrayList<String[]> list, IBaseLabelProvider labelProvider, int numCols, int level) {
+ String str[] = new String[numCols + 1];
+ for (int x = 0; x < numCols; x++) {
+ str[x] = "";
+ if (x == 0) {
+ for (int y = 0; y < level; y++)
+ str[x] += "&nbsp;&nbsp;&nbsp;&nbsp;";
+ }
+
+ if (labelProvider instanceof LabelProvider) {
+ str[x] += ((LabelProvider) labelProvider).getText(item.getData());
+ } else if (labelProvider instanceof ITableLabelProvider) {
+ str[x] += ((ITableLabelProvider) labelProvider).getColumnText(item.getData(), x);
+ }
+ // str[numCols] = GUID.toHumanId(((BaseModel)item.getData()).guid.get());
+ }
+ list.add(str);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ToStringViewerSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ToStringViewerSorter.java
new file mode 100644
index 00000000000..eee05c72480
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ToStringViewerSorter.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.framework.ui.skynet;
+
+import java.text.Collator;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ToStringViewerSorter extends ViewerSorter {
+
+ /**
+ *
+ */
+ public ToStringViewerSorter() {
+ }
+
+ /**
+ * @param collator
+ */
+ public ToStringViewerSorter(Collator collator) {
+ super(collator);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(e1.toString(), e2.toString());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TreeViewerReport.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TreeViewerReport.java
new file mode 100644
index 00000000000..12c1edce5cc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/TreeViewerReport.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+public class TreeViewerReport {
+
+ private final TreeViewer treeViewer;
+ private ArrayList<Integer> ignoreCols = new ArrayList<Integer>();
+ private final String title;
+
+ public TreeViewerReport(String title, TreeViewer treeViewer) {
+ this.title = title;
+ this.treeViewer = treeViewer;
+ }
+
+ public TreeViewerReport(TreeViewer treeViewer) {
+ this("Table View Report", treeViewer);
+ }
+
+ public void open() {
+ open(treeViewer.getTree().getItems());
+ }
+
+ public void setIgnoreColumns(ArrayList<Integer> ignoreCols) {
+ this.ignoreCols = ignoreCols;
+ }
+
+ public void open(TreeItem items[]) {
+ String html = getHtml(items);
+ XResultData xResultData = new XResultData();
+ xResultData.addRaw(html);
+ try {
+ xResultData.report(title, Manipulations.RAW_HTML);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public String getHtml(TreeItem items[]) {
+ String html = "<html><body>";
+ if (!title.equals("WebDialog")) {
+ html += AHTML.heading(3, title);
+ }
+ html += AHTML.beginMultiColumnTable(100, 1);
+ TreeColumn cols[] = treeViewer.getTree().getColumns();
+ Integer width[] = new Integer[cols.length - ignoreCols.size()];
+ String colNames[] = new String[cols.length - ignoreCols.size()];
+ int colNum = 0;
+ for (int x = 0; x < cols.length; x++) {
+ if (!ignoreCols.contains(x)) {
+ TreeColumn col = cols[x];
+ width[colNum] = col.getWidth();
+ colNames[colNum++] = col.getText();
+ }
+ }
+ html += AHTML.addHeaderRowMultiColumnTable(colNames, width);
+ // Get column widths and column name and setup the columns
+ ITableLabelProvider labelProv = (ITableLabelProvider) treeViewer.getLabelProvider();
+ ArrayList<String[]> list = new ArrayList<String[]>();
+ for (TreeItem item : items) {
+ addRow(item, list, labelProv, cols.length, 1);
+ }
+ for (String[] strs : list) {
+ html += AHTML.addRowMultiColumnTable(strs);
+ }
+ html += AHTML.endMultiColumnTable();
+ html += "</body></html>";
+ return html;
+ }
+
+ public void addRow(TreeItem item, ArrayList<String[]> list, ITableLabelProvider labelProv, int numCols, int level) {
+ String str[] = new String[numCols - ignoreCols.size()];
+ int colNum = 0;
+ for (int x = 0; x < numCols; x++) {
+ if (!ignoreCols.contains(x)) {
+ str[colNum] = "";
+ if (x == 0) {
+ for (int y = 0; y < level; y++)
+ str[colNum] += "&nbsp;&nbsp;&nbsp;&nbsp;";
+ }
+ str[colNum++] += labelProv.getColumnText(item.getData(), x);
+ }
+ }
+ list.add(str);
+ if (item.getExpanded()) {
+ for (TreeItem i : item.getItems()) {
+ addRow(i, list, labelProv, numCols, level + 1);
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XFormToolkit.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XFormToolkit.java
new file mode 100644
index 00000000000..beb68d8e327
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XFormToolkit.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.framework.ui.skynet;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XFormToolkit extends FormToolkit {
+
+ /**
+ * @param display
+ */
+ public XFormToolkit(Display display) {
+ super(display);
+ }
+
+ /**
+ * @param colors
+ */
+ public XFormToolkit(FormColors colors) {
+ super(colors);
+ }
+
+ public Combo createCombo(Composite parent, int style) {
+ Combo combo = new Combo(parent, style | SWT.FLAT);
+ adapt(combo, true, true);
+ return combo;
+ }
+
+ public Composite createClientContainer(Section section, int span) {
+ Composite container = createContainer(section, span);
+ section.setClient(container);
+ return container;
+ }
+
+ public Composite createContainer(Composite parent, int span) {
+ Composite container = createComposite(parent);
+ GridLayout layout = new GridLayout(span, false);
+ layout.marginWidth = layout.marginHeight = 2;
+ container.setLayout(layout);
+ paintBordersFor(container);
+ return container;
+ }
+
+ public void addHelpLinkToSection(final Section section, final String helpPath) {
+ addHelpLinkToSection(this, section, helpPath);
+ }
+
+ public static void addHelpLinkToSection(final FormToolkit toolkit, final Section section, final String helpPath) {
+ Control control = section.getTextClient();
+ Composite parent = section;
+ if (control != null) {
+ parent = (Composite) control; // assumes that if this link is being added with existing controls they are contained in a composite
+ }
+ ImageHyperlink helpLink = new ImageHyperlink(parent, SWT.NULL);
+ toolkit.adapt(helpLink, true, true);
+ helpLink.setImage(ImageManager.getImage(FrameworkImage.HELP));
+ helpLink.setBackground(section.getTitleBarGradientBackground());
+ helpLink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(helpPath);
+ }
+ });
+ if (control == null) {
+ section.setTextClient(helpLink);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XWidgetParser.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XWidgetParser.java
new file mode 100644
index 00000000000..dc4b77ccb76
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/XWidgetParser.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XWidgetParser {
+
+ public static List<DynamicXWidgetLayoutData> extractWorkAttributes(DynamicXWidgetLayout dynamicXWidgetLayout, String xml) throws ParserConfigurationException, SAXException, IOException {
+ Document document = Jaxp.readXmlDocument(xml);
+ Element rootElement = document.getDocumentElement();
+
+ return extractlayoutDatas(dynamicXWidgetLayout, rootElement);
+ }
+
+ public static DynamicXWidgetLayoutData extractlayoutData(DynamicXWidgetLayout dynamicXWidgetLayout, String xml) throws ParserConfigurationException, SAXException, IOException {
+ Document document = Jaxp.readXmlDocument(xml);
+ Element rootElement = document.getDocumentElement();
+ return extractWorkAttribute(dynamicXWidgetLayout, rootElement);
+ }
+
+ public static List<DynamicXWidgetLayoutData> extractlayoutDatas(DynamicXWidgetLayout dynamicXWidgetLayout, Element xWidgets) throws ParserConfigurationException, SAXException, IOException {
+ NodeList widgets = xWidgets.getElementsByTagName(DynamicXWidgetLayout.XWIDGET);
+ List<DynamicXWidgetLayoutData> layoutDatas = new ArrayList<DynamicXWidgetLayoutData>(widgets.getLength());
+
+ for (int i = 0; i < widgets.getLength(); i++) {
+ layoutDatas.add(extractWorkAttribute(dynamicXWidgetLayout, (Element) widgets.item(i)));
+ }
+ return layoutDatas;
+ }
+
+ public static String toXml(DynamicXWidgetLayoutData data) throws OseeCoreException, ParserConfigurationException, TransformerException {
+ Document doc = Jaxp.newDocument();
+ Element element = doc.createElement(DynamicXWidgetLayout.XWIDGET);
+ element.setAttribute("displayName", data.getName());
+ element.setAttribute("storageName", data.getStorageName());
+ element.setAttribute("toolTip", data.getToolTip());
+ element.setAttribute("id", data.getId());
+ element.setAttribute("xwidgetType", data.getXWidgetName());
+ element.setAttribute("defaultValue", data.getDefaultValue());
+ for (XOption xOption : data.getXOptionHandler().getXOptions()) {
+ if (xOption == XOption.ALIGN_CENTER)
+ element.setAttribute("align", "Center");
+ else if (xOption == XOption.ALIGN_LEFT)
+ element.setAttribute("align", "Left");
+ else if (xOption == XOption.ALIGN_RIGHT)
+ element.setAttribute("align", "Right");
+ else if (xOption == XOption.EDITABLE)
+ element.setAttribute("editable", "true");
+ else if (xOption == XOption.BEGIN_COMPOSITE_4)
+ element.setAttribute("beginComposite", "4");
+ else if (xOption == XOption.BEGIN_COMPOSITE_6)
+ element.setAttribute("beginComposite", "6");
+ else if (xOption == XOption.BEGIN_COMPOSITE_8)
+ element.setAttribute("beginComposite", "8");
+ else if (xOption == XOption.BEGIN_COMPOSITE_10)
+ element.setAttribute("beginComposite", "10");
+ else if (xOption == XOption.END_COMPOSITE)
+ element.setAttribute("endComposite", "true");
+ else if (xOption == XOption.NOT_EDITABLE)
+ element.setAttribute("editable", "false");
+ else if (xOption == XOption.ENABLED)
+ element.setAttribute("enabled", "true");
+ else if (xOption == XOption.NOT_ENABLED)
+ element.setAttribute("enabled", "false");
+ else if (xOption == XOption.REQUIRED)
+ element.setAttribute("required", "true");
+ else if (xOption == XOption.NOT_REQUIRED)
+ element.setAttribute("required", "false");
+ else if (xOption == XOption.FILL_HORIZONTALLY)
+ element.setAttribute("fill", "Horizontally");
+ else if (xOption == XOption.FILL_VERTICALLY)
+ element.setAttribute("fill", "Vertically");
+ else if (xOption == XOption.HORIZONTAL_LABEL)
+ element.setAttribute("horizontalLabel", "true");
+ else if (xOption == XOption.VERTICAL_LABEL)
+ element.setAttribute("horizontalLabel", "false");
+ else if (xOption == XOption.LABEL_AFTER)
+ element.setAttribute("labelAfter", "true");
+ else if (xOption == XOption.LABEL_BEFORE)
+ element.setAttribute("labelAfter", "false");
+ else if (xOption == XOption.MULTI_SELECT)
+ element.setAttribute("multiSelect", "true");
+ else if (xOption == XOption.NONE)
+ // do nothing
+ ;
+ else
+ throw new OseeArgumentException("Unhandled xOption \"" + xOption + "\"");
+ }
+ doc.appendChild(element);
+ return Jaxp.getDocumentXml(doc);
+ }
+
+ private static DynamicXWidgetLayoutData extractWorkAttribute(DynamicXWidgetLayout dynamicXWidgetLayout, Element widget) {
+ DynamicXWidgetLayoutData dynamicXWidgetLayoutData = new DynamicXWidgetLayoutData(dynamicXWidgetLayout);
+
+ // Loop through attributes to ensure all are valid and processed
+ NamedNodeMap attributes = widget.getAttributes();
+ for (int x = 0; x < attributes.getLength(); x++) {
+ Node node = attributes.item(x);
+ String nodeName = node.getNodeName();
+ if (nodeName.equals("displayName")) {
+ dynamicXWidgetLayoutData.setName(node.getNodeValue());
+ if (dynamicXWidgetLayoutData.getStorageName().equals("")) dynamicXWidgetLayoutData.setStorageName(node.getNodeValue());
+ } else if (nodeName.equals("storageName")) {
+ dynamicXWidgetLayoutData.setStorageName(node.getNodeValue());
+ if (dynamicXWidgetLayoutData.getName().equals("")) dynamicXWidgetLayoutData.setName(node.getNodeValue());
+ } else if (nodeName.equals("toolTip"))
+ dynamicXWidgetLayoutData.setToolTip(node.getNodeValue());
+ else if (nodeName.equals("id"))
+ dynamicXWidgetLayoutData.setId(node.getNodeValue());
+ else if (nodeName.equals("horizontalLabel"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(
+ Boolean.parseBoolean((node.getNodeValue())) ? XOption.HORIZONTAL_LABEL : XOption.NONE);
+ else if (nodeName.equals("labelAfter"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(
+ Boolean.parseBoolean((node.getNodeValue())) ? XOption.LABEL_AFTER : XOption.NONE);
+ else if (nodeName.equals("required"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(
+ Boolean.parseBoolean(node.getNodeValue()) ? XOption.REQUIRED : XOption.NONE);
+ else if (nodeName.equals("beginComposite"))
+ dynamicXWidgetLayoutData.setBeginComposite(Integer.parseInt(node.getNodeValue()));
+ else if (nodeName.equals("endComposite"))
+ dynamicXWidgetLayoutData.setEndComposite(Boolean.parseBoolean((node.getNodeValue())));
+ else if (nodeName.equals("editable"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(
+ Boolean.parseBoolean(node.getNodeValue()) ? XOption.EDITABLE : XOption.NONE);
+ else if (nodeName.equals("xwidgetType")) {
+ dynamicXWidgetLayoutData.setXWidgetName(node.getNodeValue());
+ } else if (nodeName.equals("multiSelect")) {
+ dynamicXWidgetLayoutData.getXOptionHandler().add(
+ Boolean.parseBoolean(node.getNodeValue()) ? XOption.MULTI_SELECT : XOption.NONE);
+ } else if (nodeName.equals("fill")) {
+ String value = node.getNodeValue();
+ if (value.equalsIgnoreCase("Horizontally"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(XOption.FILL_HORIZONTALLY);
+ else if (value.equalsIgnoreCase("Vertically"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(XOption.FILL_VERTICALLY);
+ else
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, new IllegalArgumentException(
+ "Unknown Fill Value \"" + value + "\""));
+ } else if (nodeName.equals("height"))
+ dynamicXWidgetLayoutData.setHeight(Integer.parseInt(node.getNodeValue()));
+ else if (nodeName.equals("align")) {
+ String value = node.getNodeValue();
+ if (value.equalsIgnoreCase("Left"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(XOption.ALIGN_LEFT);
+ else if (value.equalsIgnoreCase("Right"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(XOption.ALIGN_RIGHT);
+ else if (value.equalsIgnoreCase("Center"))
+ dynamicXWidgetLayoutData.getXOptionHandler().add(XOption.ALIGN_CENTER);
+ else
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, new IllegalArgumentException(
+ "Unknown Align Value \"" + value + "\""));
+ } else if (nodeName.equals("defaultValue"))
+ dynamicXWidgetLayoutData.setDefaultValue(node.getNodeValue());
+ else if (nodeName.equals("keyedBranch"))
+ dynamicXWidgetLayoutData.setKeyedBranchName(node.getNodeValue());
+ else {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, new OseeArgumentException(
+ "Unsupported XWidget attribute \"" + nodeName + "\""));
+ }
+ }
+
+ return dynamicXWidgetLayoutData;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyDialog.java
new file mode 100644
index 00000000000..331edf51afe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyDialog.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.access;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlData;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+
+/**
+ * GUI that is used to maintain an <Code>Artifact</Code> access contol list.
+ *
+ * @author Jeff C. Phillips
+ */
+public class PolicyDialog extends Dialog {
+ private PolicyTableViewer policyTableViewer;
+ private Button radEnabled;
+ private Button radDisabled;
+ private Button btnAdd;
+ private Button chkChildrenPermission;
+ private Combo cmbUsers;
+ private Combo cmbPermissionLevel;
+ private final Object object;
+ private Label accessLabel;
+
+ public PolicyDialog(Shell parentShell, Object object) {
+ super(parentShell);
+
+ this.object = object;
+ setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | getDefaultOrientation() | SWT.RESIZE);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText("Access Control List: " + getHeadertName(object));
+ Composite mainComposite = new Composite(parent, SWT.NONE);
+ mainComposite.setFont(parent.getFont());
+ mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainComposite.setLayout(new GridLayout(1, false));
+
+ addDialogContols(mainComposite);
+ try {
+ setInputs();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ addListeners();
+ checkEnabled();
+
+ return mainComposite;
+ }
+
+ private void setInputs() throws OseeCoreException {
+ cmbUsers.setText("-Select Person-");
+ cmbPermissionLevel.setText("-Select Permission-");
+ ArrayList<Artifact> subjectList = new ArrayList<Artifact>();
+ subjectList.addAll(UserManager.getUsersSortedByName());
+ subjectList.addAll(ArtifactQuery.getArtifactsFromType("User Group", BranchManager.getCommonBranch()));
+ Collections.sort(subjectList, new userComparator<Artifact>());
+ for (Artifact subject : subjectList) {
+ String name = subject.getDescriptiveName();
+ cmbUsers.add(name);
+ cmbUsers.setData(name, subject);
+ }
+
+ PermissionEnum[] permissions = PermissionEnum.values();
+ Arrays.sort(permissions, new Comparator<PermissionEnum>() {
+
+ public int compare(PermissionEnum o1, PermissionEnum o2) {
+ return o1.getName().compareToIgnoreCase(o2.getName());
+ }
+ });
+
+ for (PermissionEnum permission : permissions) {
+ if (!permission.equals(PermissionEnum.LOCK)) {
+ cmbPermissionLevel.add(permission.getName() + " - Rank = " + permission.getRank() + "");
+ cmbPermissionLevel.setData(permission.getName(), permission);
+ }
+ }
+ }
+ private class userComparator<T> implements Comparator<T> {
+
+ /* (non-Javadoc)
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public int compare(T o1, T o2) {
+ if (o1 instanceof Artifact && o2 instanceof Artifact) {
+ return ((Artifact) o1).getDescriptiveName().compareToIgnoreCase(((Artifact) o2).getDescriptiveName());
+ }
+ return 0;
+ }
+
+ }
+
+ private void addListeners() {
+ radDisabled.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ checkEnabled();
+ }
+ });
+
+ radEnabled.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ checkEnabled();
+ }
+ });
+
+ btnAdd.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Artifact subject = (Artifact) cmbUsers.getData(cmbUsers.getText().replaceAll(" - Rank.*", ""));
+ PermissionEnum permission =
+ (PermissionEnum) cmbPermissionLevel.getData(cmbPermissionLevel.getText().replaceAll(" - Rank.*", ""));
+
+ if (subject != null && permission != null) {
+ policyTableViewer.addItem(subject, object, permission);
+ }
+ }
+ });
+ }
+
+ private void addDialogContols(Composite mainComposite) {
+
+ accessLabel = new Label(mainComposite, SWT.NONE);
+
+ radDisabled = new Button(mainComposite, SWT.RADIO);
+ radDisabled.setText("Disabled");
+ radDisabled.setEnabled(false);
+
+ radEnabled = new Button(mainComposite, SWT.RADIO);
+ radEnabled.setText("Enabled");
+
+ Group group = new Group(mainComposite, SWT.NULL);
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setLayout(new GridLayout(1, false));
+
+ Table table = new Table(group, SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
+ policyTableViewer = new PolicyTableViewer(table, object);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 100;
+ gridData.widthHint = 500;
+ table.setLayoutData(gridData);
+
+ Composite composite = new Composite(group, SWT.NONE);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+ composite.setLayout(new GridLayout(3, false));
+
+ cmbUsers = new Combo(composite, SWT.NONE);
+ cmbPermissionLevel = new Combo(composite, SWT.NONE);
+ btnAdd = new Button(composite, SWT.PUSH);
+ btnAdd.setText("Add");
+
+ (new Label(group, SWT.NONE)).setText(" NOTE: Higher permission rank overrides lower rank.");
+
+ chkChildrenPermission = new Button(mainComposite, SWT.CHECK);
+ chkChildrenPermission.setText("Set permission for artifact's default hierarchy descendents.");
+ }
+
+ private void checkEnabled() {
+ // get information from db
+ boolean accessEnabled;
+ try {
+ accessEnabled = AccessControlManager.checkObjectPermission(object, PermissionEnum.WRITE);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ accessEnabled = false;
+ }
+
+ accessLabel.setText(accessEnabled ? "" : "You do not have permissions to modify access.");
+ radEnabled.setSelection(true);
+
+ boolean enable = radEnabled.getSelection() && accessEnabled;
+ boolean isArtifact = object instanceof Artifact;
+
+ cmbUsers.setEnabled(enable);
+ cmbPermissionLevel.setEnabled(enable);
+ btnAdd.setEnabled(enable);
+ policyTableViewer.setEnabled(enable);
+
+ chkChildrenPermission.setEnabled(isArtifact);
+ }
+
+ @Override
+ protected void okPressed() {
+ for (AccessControlData data : policyTableViewer.getAccessControlList().values()) {
+ if (data.isDirty()) data.persist(chkChildrenPermission.getSelection());
+ }
+ super.okPressed();
+ }
+
+ private String getHeadertName(Object object) {
+ String name = "";
+ if (object instanceof Artifact) {
+ name = ((Artifact) object).getDescriptiveName();
+ } else if (object instanceof Branch) {
+ name = ((Branch) object).getBranchName();
+ }
+ return name;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyLabelProvider.java
new file mode 100644
index 00000000000..6e17b4cf880
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyLabelProvider.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.framework.ui.skynet.access;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlData;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.access.PolicyTableViewer.Columns;
+import org.eclipse.swt.graphics.Image;
+
+public class PolicyLabelProvider implements ITableLabelProvider {
+
+ public PolicyLabelProvider() {
+ super();
+ };
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ try {
+ if (element instanceof AccessControlData) {
+ AccessControlData data = (AccessControlData) element;
+ if (columnIndex == Columns.Person.ordinal()) {
+ return data.getSubject().getDescriptiveName();
+ } else if (columnIndex == Columns.Branch.ordinal()) {
+ PermissionEnum permissionEnum = data.getBranchPermission();
+ if (permissionEnum != null) return permissionEnum.getName();
+ } else if (columnIndex == Columns.Artifact.ordinal()) {
+ PermissionEnum permissionEnum = data.getArtifactPermission();
+ if (permissionEnum != null) return permissionEnum.getName();
+ } else if (columnIndex == Columns.Artifact_Type.ordinal()) {
+ PermissionEnum permissionEnum = data.getArtifactTypePermission();
+ if (permissionEnum != null) return permissionEnum.getName();
+ } else if (columnIndex == Columns.Total.ordinal()) {
+ PermissionEnum permissionEnum = data.getPermission();
+ if (permissionEnum != null) return permissionEnum.getName();
+ }
+ }
+ } catch (Exception ex) {
+ return "Error: " + ex.getLocalizedMessage();
+ }
+ return "";
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == Columns.Delete.ordinal()) return ImageManager.getImage(FrameworkImage.REMOVE);
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+ * java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableCellModifier.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableCellModifier.java
new file mode 100644
index 00000000000..9502f64dc7f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableCellModifier.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.framework.ui.skynet.access;
+
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlData;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.ui.skynet.access.PolicyTableViewer.Columns;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PolicyTableCellModifier implements ICellModifier {
+
+ private PolicyTableViewer policyTableViewer;
+ private boolean enabled = true;
+
+ public PolicyTableCellModifier(PolicyTableViewer policyTableViewer) {
+ super();
+ this.policyTableViewer = policyTableViewer;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+ */
+ public boolean canModify(Object element, String property) {
+ // Find the index of the column
+ int columnIndex = Columns.valueOf(property).ordinal();
+ if (columnIndex == Columns.Delete.ordinal() && isEnabled()) return true;
+ return false;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+ */
+ public Object getValue(Object element, String property) {
+ // Find the index of the column
+ int columnIndex = Columns.valueOf(property).ordinal();
+ if (columnIndex == Columns.Delete.ordinal()) {
+ return new Boolean(false);
+ } else if (columnIndex == Columns.Artifact.ordinal()) {
+ return ((AccessControlData) element).getPermission().ordinal();
+ }
+ return "";
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public void modify(Object element, String property, Object value) {
+
+ // Find the index of the column
+ int columnIndex = Columns.valueOf(property).ordinal();
+
+ TableItem item = (TableItem) element;
+ AccessControlData data = (AccessControlData) item.getData();
+
+ if (columnIndex == Columns.Delete.ordinal()) {
+ policyTableViewer.removeData(data);
+ } else if (columnIndex == Columns.Delete.ordinal()) {
+ int index = (Integer) value;
+ if (index != -1) policyTableViewer.modifyPermissionLevel(data, PermissionEnum.values()[index]);
+ }
+ policyTableViewer.refresh();
+ }
+
+ /**
+ * @return the enabled
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * Don't disable entire viewer, just delete button
+ *
+ * @param enabled the enabled to set
+ */
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableViewer.java
new file mode 100644
index 00000000000..3240cefd4e8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/access/PolicyTableViewer.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.access;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlData;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessObject;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+/**
+ * Displays an <Code>Artifact</Code> access control list, used by the <Code>PolicyDialog</Code>.
+ *
+ * @author Jeff C. Phillips
+ */
+public class PolicyTableViewer {
+
+ private static final AccessControlManager accessManager = AccessControlManager.getInstance();
+ private Table table;
+ private TableViewer tableViewer;
+ private Map<String, AccessControlData> accessControlList;
+ private Object object;
+ public static enum Columns {
+ Delete, Person, Total, Branch, Artifact_Type, Artifact
+ };
+ private final static int[] columnWidths = new int[] {25, 125, 75, 75, 75, 75};
+ private String[] columnNames;
+
+ /**
+ * @param table -
+ */
+ public PolicyTableViewer(Table table, Object object) {
+ this.table = table;
+ this.createControl();
+ this.accessControlList = new HashMap<String, AccessControlData>();
+ this.object = object;
+
+ tableViewer.setContentProvider(new PolicyContentProvider());
+ tableViewer.setLabelProvider(new PolicyLabelProvider());
+ tableViewer.setInput(accessControlList.values());
+ }
+
+ /**
+ * Disables the cell modifiers, not the entire table so user can still scroll
+ *
+ * @param enabled
+ */
+ public void setEnabled(boolean enabled) {
+ ((PolicyTableCellModifier) tableViewer.getCellModifier()).setEnabled(enabled);
+ }
+
+ public void addItem(Artifact subject, Object object, PermissionEnum permission) {
+ AccessObject accessObject = accessManager.getAccessObject(object);
+ AccessControlData data = new AccessControlData(subject, accessObject, permission, true);
+ accessControlList.put(data.getSubject().getGuid(), data);
+ tableViewer.refresh();
+ }
+
+ private void createControl() {
+ createColumns();
+ createTableViewer();
+ }
+
+ /**
+ * Create the TableViewer
+ */
+ private void createTableViewer() {
+
+ tableViewer = new TableViewer(table);
+ tableViewer.setUseHashlookup(true);
+ columnNames = new String[Columns.values().length];
+ for (Columns col : Columns.values())
+ columnNames[col.ordinal()] = col.name();
+ tableViewer.setColumnProperties(columnNames);
+
+ CellEditor[] validEditors = new CellEditor[Columns.values().length];
+ validEditors[Columns.Delete.ordinal()] = new CheckboxCellEditor(table, SWT.NONE);
+ validEditors[Columns.Artifact.ordinal()] =
+ new ComboBoxCellEditor(table, PermissionEnum.getPermissionNames(), SWT.READ_ONLY);
+
+ // Assign the cell editors to the viewer
+ tableViewer.setCellEditors(validEditors);
+ // Assign the cell modifier to the viewer
+ tableViewer.setCellModifier(new PolicyTableCellModifier(this));
+ }
+
+ /**
+ * Create the Columns
+ */
+ private void createColumns() {
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ for (Columns col : Columns.values()) {
+ TableColumn column = new TableColumn(table, SWT.LEFT, col.ordinal());
+ column.setText(col.name());
+ column.setWidth(columnWidths[col.ordinal()]);
+ }
+
+ }
+
+ public Map<String, AccessControlData> getAccessControlList() {
+ return this.accessControlList;
+ }
+
+ public void refresh() {
+ tableViewer.refresh();
+ }
+
+ /**
+ * @return Returns the table.
+ */
+ public Table getTable() {
+ return table;
+ }
+
+ public void removeData(AccessControlData data) {
+ try {
+ accessManager.removeAccessControlData(data, true);
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ accessControlList.remove(data.getSubject().getGuid());
+ }
+
+ public void modifyPermissionLevel(AccessControlData data, PermissionEnum permission) {
+ data.setPermission(permission);
+ }
+
+ public int getCount() {
+ return accessControlList.size();
+ }
+ /**
+ * InnerClass that acts as a proxy for the FilterModelList providing content for the Table. It implements the
+ * IFilterListViewer interface since it must register changeListeners with the FilterModelList
+ */
+ class PolicyContentProvider implements IStructuredContentProvider {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object object) {
+ populateSubjectsFromDb();
+ Object[] accessControlListArray = accessControlList.values().toArray();
+ Arrays.sort(accessControlListArray);
+ return accessControlListArray;
+ }
+
+ private void populateSubjectsFromDb() {
+ Collection<AccessControlData> datas = accessManager.getAccessControlList(object);
+
+ for (AccessControlData data : datas) {
+ if (!accessControlList.containsKey(data.getSubject().getGuid()) && data.getPermission() != PermissionEnum.LOCK) accessControlList.put(
+ data.getSubject().getGuid(), data);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IFilterListViewer#addFilter(FilterModel)
+ */
+ public void addFilter(AccessControlData data) {
+ tableViewer.add(data);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IFilterListViewer#removeFilter(FilterModel)
+ */
+ public void removeFilter(AccessControlData data) {
+ tableViewer.remove(data);
+ }
+ }
+
+ /**
+ * @return the columnNames
+ */
+ public String[] getColumnNames() {
+ return columnNames;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactPromptChange.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactPromptChange.java
new file mode 100644
index 00000000000..a117591fd92
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactPromptChange.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.StringAttribute;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.EnumSelectionDialog.Selection;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.DateSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactPromptChange {
+
+ private final static String VALID_FLOAT_REG_EX = "^[0-9\\.]+$";
+ private final static String VALID_INTEGER_REG_EX = "^[0-9]+$";
+ private final static String VALID_PERCENT_REG_EX =
+ "^(0*100{1,1}\\.?((?<=\\.)0*)?%?$)|(^0*\\d{0,2}\\.?((?<=\\.)\\d*)?%?)$";
+
+ public static boolean promptChangeAttribute(String attributeName, String displayName, final Collection<? extends Artifact> artifacts, boolean persist) {
+ try {
+ Class<? extends Attribute<?>> attributeBaseType =
+ AttributeTypeManager.getType(attributeName).getBaseAttributeClass();
+ if (attributeBaseType.equals(DateAttribute.class)) {
+ return ArtifactPromptChange.promptChangeDate(attributeName, displayName, artifacts, persist);
+ } else if (attributeBaseType.equals(FloatingPointAttribute.class)) {
+ return ArtifactPromptChange.promptChangeFloatAttribute(attributeName, displayName, artifacts, persist);
+ } else if (attributeBaseType.equals(IntegerAttribute.class)) {
+ return ArtifactPromptChange.promptChangeIntegerAttribute(attributeName, displayName, artifacts, persist);
+ } else if (attributeBaseType.equals(BooleanAttribute.class)) {
+ return ArtifactPromptChange.promptChangeBoolean(attributeName, displayName, artifacts, null, persist);
+ } else if (attributeBaseType.equals(EnumeratedAttribute.class)) {
+ return ArtifactPromptChange.promptChangeEnumeratedAttribute(attributeName, displayName, artifacts, persist);
+ } else if (attributeBaseType.equals(StringAttribute.class)) {
+ return ArtifactPromptChange.promptChangeStringAttribute(attributeName, displayName, artifacts, persist,
+ true);
+ } else
+ AWorkbench.popup("ERROR", "Unhandled attribute type. Can't edit through this view");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ public static boolean promptChangeIntegerAttribute(String attributeName, String displayName, final Collection<? extends Artifact> artifacts, boolean persist) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, VALID_INTEGER_REG_EX, artifacts, persist, false);
+ }
+
+ public static boolean promptChangeIntegerAttribute(String attributeName, String displayName, final Artifact artifact, boolean persist) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, VALID_INTEGER_REG_EX, Arrays.asList(artifact),
+ persist, false);
+ }
+
+ public static boolean promptChangePercentAttribute(String attributeName, String displayName, final Artifact artifact, boolean persist) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, VALID_PERCENT_REG_EX, Arrays.asList(artifact),
+ persist, false);
+ }
+
+ public static boolean promptChangePercentAttribute(String attributeName, String displayName, final Collection<? extends Artifact> artifacts, boolean persist) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, VALID_PERCENT_REG_EX, artifacts, persist, false);
+ }
+
+ public static boolean promptChangeFloatAttribute(String attributeName, String displayName, final Artifact artifact, boolean persist) throws Exception {
+ return promptChangeFloatAttribute(attributeName, displayName, Arrays.asList(artifact), persist);
+ }
+
+ public static boolean promptChangeFloatAttribute(String attributeName, String displayName, final Collection<? extends Artifact> smas, boolean persist) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, VALID_FLOAT_REG_EX, smas, persist, false);
+ }
+
+ public static boolean promptChangeStringAttribute(String attributeName, String displayName, final Artifact artifact, boolean persist, boolean multiLine) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, null, Arrays.asList(artifact), persist, multiLine);
+ }
+
+ public static boolean promptChangeStringAttribute(String attributeName, String displayName, final Collection<? extends Artifact> smas, boolean persist, boolean multiLine) throws Exception {
+ return promptChangeStringAttribute(attributeName, displayName, null, smas, persist, multiLine);
+ }
+
+ public static boolean promptChangeDate(String attributeName, String displayName, Artifact artifact, boolean persist) throws Exception {
+ return promptChangeDate(attributeName, displayName, Arrays.asList(artifact), persist);
+ }
+
+ public static boolean promptChangeDate(String attributeName, String displayName, final Collection<? extends Artifact> artifacts, boolean persist) throws Exception {
+ // prompt that current release is (get from attribute); want to change
+ DateSelectionDialog diag =
+ new DateSelectionDialog("Select " + displayName, "Select " + displayName,
+ artifacts.size() == 1 ? artifacts.iterator().next().getSoleAttributeValue(attributeName, null,
+ Date.class) : null);
+ if (diag.open() == 0) {
+ if (artifacts.size() > 0) {
+ SkynetTransaction transaction =
+ !persist ? null : new SkynetTransaction(artifacts.iterator().next().getBranch());
+ for (Artifact artifact : artifacts) {
+ if (diag.isNoneSelected())
+ artifact.deleteSoleAttribute(attributeName);
+ else
+ artifact.setSoleAttributeValue(attributeName, diag.getSelectedDate());
+ if (persist) artifact.persistAttributes(transaction);
+ }
+ if (persist) transaction.execute();
+ }
+ }
+ return true;
+ }
+
+ public static boolean promptChangeEnumeratedAttribute(String attributeName, String displayName, Artifact artifact, boolean persist) throws Exception {
+ return promptChangeEnumeratedAttribute(attributeName, displayName, Arrays.asList(artifact), persist);
+ }
+
+ public static boolean promptChangeEnumeratedAttribute(String attributeName, String displayName, final Collection<? extends Artifact> artifacts, boolean persist) throws Exception {
+ String type = artifacts.iterator().next().getArtifactTypeName();
+ for (Artifact art : artifacts) {
+ if (!type.equals(art.getArtifactTypeName())) {
+ AWorkbench.popup("ERROR", "Artifact types must all match to change enumerated type.");
+ return false;
+ }
+ }
+ EnumSelectionDialog diag = new EnumSelectionDialog(attributeName, artifacts);
+ if (diag.open() == 0) {
+ Set<String> selected = new HashSet<String>();
+ for (Object obj : diag.getResult())
+ selected.add((String) obj);
+ if (artifacts.size() > 0) {
+ SkynetTransaction transaction =
+ !persist ? null : new SkynetTransaction(artifacts.iterator().next().getBranch());
+ for (Artifact artifact : artifacts) {
+ List<String> current = artifact.getAttributesToStringList(attributeName);
+ if (diag.getSelected() == Selection.AddSelection) {
+ current.addAll(selected);
+ artifact.setAttributeValues(attributeName, current);
+ } else if (diag.getSelected() == Selection.DeleteSelected) {
+ current.removeAll(selected);
+ artifact.setAttributeValues(attributeName, current);
+ } else if (diag.getSelected() == Selection.ReplaceAll) {
+ artifact.setAttributeValues(attributeName, selected);
+ } else {
+ AWorkbench.popup("ERROR", "Unhandled selection type => " + diag.getSelected().name());
+ return false;
+ }
+ if (persist) artifact.persistAttributes(transaction);
+ }
+ if (persist) transaction.execute();
+ }
+ }
+ return true;
+ }
+
+ public static boolean promptChangeStringAttribute(String attributeName, String displayName, String validationRegEx, final Collection<? extends Artifact> smas, boolean persist, boolean multiLine) throws OseeCoreException {
+ EntryDialog ed = new EntryDialog("Enter " + displayName, "Enter " + displayName);
+ ed.setFillVertically(multiLine);
+ if (smas.size() == 1) {
+ Object obj = smas.iterator().next().getSoleAttributeValueAsString(attributeName, null);
+ if (obj != null) {
+ ed.setEntry(String.valueOf(obj));
+ }
+ }
+ if (validationRegEx != null) ed.setValidationRegularExpression(validationRegEx);
+ int result = ed.open();
+ if (result == 0) {
+ SkynetTransaction transaction = !persist ? null : new SkynetTransaction(smas.iterator().next().getBranch());
+ for (Artifact sma : smas) {
+ String value = ed.getEntry();
+ if (result == 0) {
+ sma.setSoleAttributeFromString(attributeName, value);
+ } else {
+ if (attributeName.equals("Name")) {
+ throw new OseeArgumentException("Can not delete Name attribute");
+ }
+ sma.deleteSoleAttribute(attributeName);
+ }
+ if (persist) sma.persistAttributes(transaction);
+ }
+ if (persist) transaction.execute();
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean promptChangeBoolean(String attributeName, String displayName, final Artifact artifact, String toggleMessage, boolean persist) throws OseeCoreException {
+ return promptChangeBoolean(attributeName, displayName, Arrays.asList(artifact), toggleMessage, persist);
+ }
+
+ public static boolean promptChangeBoolean(String attributeName, String displayName, final Collection<? extends Artifact> smas, String toggleMessage, boolean persist) throws OseeCoreException {
+ boolean set = false;
+ if (smas.size() == 1) set = smas.iterator().next().getSoleAttributeValue(attributeName, false);
+ MessageDialogWithToggle md =
+ new MessageDialogWithToggle(Display.getCurrent().getActiveShell(), displayName, null, displayName,
+ MessageDialog.QUESTION, new String[] {"Ok", "Cancel"}, MessageDialog.OK,
+ toggleMessage != null ? toggleMessage : displayName, set);
+
+ int result = md.open();
+ if (result == 256) {
+ if (smas.size() > 0) {
+ SkynetTransaction transaction = !persist ? null : new SkynetTransaction(smas.iterator().next().getBranch());
+ for (Artifact sma : smas) {
+ sma.setSoleAttributeValue(attributeName, md.getToggleState());
+ if (persist) sma.persistAttributes();
+ }
+ if (persist) transaction.execute();
+ }
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactTransfer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactTransfer.java
new file mode 100644
index 00000000000..a75cd2e1aec
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/ArtifactTransfer.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.dnd.ByteArrayTransfer;
+import org.eclipse.swt.dnd.TransferData;
+
+/**
+ * The <code>ArtifactTransfer</code> class is used to transfer an array of <code>Artifact</code>s from one part to
+ * another in a drag and drop operation or a cut, copy, paste action.
+ * <p>
+ * In every drag and drop operation there is a <code>DragSource</code> and a <code>DropTarget</code>. When a drag occurs
+ * a <code>Transfer</code> is used to marshall the drag data from the source into a byte array. If a drop occurs another
+ * <code>Transfer</code> is used to marshall the byte array into drop data for the target.
+ * </p>
+ * <p>
+ * When a <code>CutAction</code> or a <code>CopyAction</code> is performed, this transfer is used to place references to
+ * the selected resources on the <code>Clipboard</code>. When a <code>PasteAction</code> is performed, the references on
+ * the clipboard are used to move or copy the resources to the selected destination.
+ * </p>
+ * <p>
+ * This class can be used for a <code>Viewer<code> or an SWT component directly.
+ * A singleton is provided which may be serially reused (see <code>getInstance</code>). It is not intended to be
+ * subclassed.
+ * </p>
+ *
+ * @see org.eclipse.jface.viewers.StructuredViewer
+ * @see org.eclipse.swt.dnd.DropTarget
+ * @see org.eclipse.swt.dnd.DragSource
+ * @author Robert A. Fisher
+ */
+
+public class ArtifactTransfer extends ByteArrayTransfer {
+
+ /**
+ * Singleton instance.
+ */
+ private static final ArtifactTransfer instance = new ArtifactTransfer();
+
+ // Create a unique ID to make sure that different Eclipse
+ // applications use different "types" of <code>ResourceTransfer</code>
+ private static final String TYPE_NAME =
+ "artifact-transfer-format:" + System.currentTimeMillis() + ":" + instance.hashCode(); //$NON-NLS-2$//$NON-NLS-1$
+
+ private static final int TYPEID = registerType(TYPE_NAME);
+
+ /**
+ * Creates a new transfer object.
+ */
+ private ArtifactTransfer() {
+ }
+
+ /**
+ * Returns the singleton instance.
+ *
+ * @return the singleton instance
+ */
+ public static ArtifactTransfer getInstance() {
+ return instance;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Transfer.
+ */
+ protected int[] getTypeIds() {
+ return new int[] {TYPEID};
+ }
+
+ /*
+ * (non-Javadoc) Returns the type names. @return the list of type names
+ */
+ protected String[] getTypeNames() {
+ return new String[] {TYPE_NAME};
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Transfer.
+ */
+ protected void javaToNative(Object data, TransferData transferData) {
+ if (!(data instanceof ArtifactData)) {
+ return;
+ }
+
+ ArtifactData artData = (ArtifactData) data;
+ /**
+ * The resource serialization format is: (int) number of artifacts Then, the following for each resource: (int)
+ * artID (int) tagID Then the following (int) urlLength (int) sourceLength (chars) url (chars) source
+ */
+
+ try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ DataOutputStream dataOut = new DataOutputStream(out);
+
+ // write the number of resources
+ dataOut.writeInt(artData.getArtifacts().length);
+
+ for (Artifact artifact : artData.getArtifacts()) {
+ writeArtifact(dataOut, artifact);
+ }
+ dataOut.writeInt(artData.getUrl().length());
+ dataOut.writeInt(artData.getSource().length());
+ dataOut.writeChars(artData.getUrl());
+ dataOut.writeChars(artData.getSource());
+
+ // cleanup
+ dataOut.close();
+ out.close();
+ byte[] bytes = out.toByteArray();
+ super.javaToNative(bytes, transferData);
+ } catch (IOException e) {
+ // it's best to send nothing if there were problems
+ }
+ }
+
+ /*
+ * (non-Javadoc) Method declared on Transfer.
+ */
+ public ArtifactData nativeToJava(TransferData transferData) {
+ /**
+ * The resource serialization format is: (int) number of artifacts Then, the following for each resource: (int)
+ * artID (int) tagID
+ */
+
+ byte[] bytes = (byte[]) super.nativeToJava(transferData);
+ if (bytes == null) return null;
+ DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
+ try {
+ int count = in.readInt();
+ Artifact[] artifacts = new Artifact[count];
+ for (int i = 0; i < count; i++)
+ artifacts[i] = readArtifact(in);
+ int urlLength = in.readInt();
+ int sourceLength = in.readInt();
+ String url = "";
+ for (int x = 0; x < urlLength; x++)
+ url += in.readChar();
+ String source = "";
+ for (int x = 0; x < sourceLength; x++)
+ source += in.readChar();
+ return new ArtifactData(artifacts, url, source);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return null;
+ }
+ }
+
+ /**
+ * Reads a resource from the given stream.
+ *
+ * @param dataIn the input stream
+ * @return the resource
+ * @throws IllegalArgumentException
+ * @throws MultipleArtifactsExist
+ * @throws ArtifactDoesNotExist
+ * @throws IOException
+ * @throws BranchDoesNotExist
+ */
+ private Artifact readArtifact(DataInputStream dataIn) throws OseeCoreException, IOException {
+ int artID = dataIn.readInt();
+ int branchId = dataIn.readInt();
+ return ArtifactQuery.getArtifactFromId(artID, BranchManager.getBranch(branchId));
+ }
+
+ /**
+ * Writes the given resource to the given stream.
+ *
+ * @param dataOut the output stream
+ * @param artifact the artifact
+ * @throws IOException if there is a problem writing to the stream
+ */
+ private void writeArtifact(DataOutputStream dataOut, Artifact artifact) throws IOException {
+ dataOut.writeInt(artifact.getArtId());
+ dataOut.writeInt(artifact.getBranch().getBranchId());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSelectionDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSelectionDialog.java
new file mode 100644
index 00000000000..523d5cbbe01
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSelectionDialog.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.framework.ui.skynet.artifact;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.plugin.util.StringLabelProvider;
+import org.eclipse.osee.framework.ui.plugin.util.StringViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButton;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EnumSelectionDialog extends CheckedTreeSelectionDialog {
+
+ private XRadioButton addSelectedRadioButton =
+ new XRadioButton("Add selected item(s) to existing if not already chosen.");
+ private XRadioButton replaceAllRadioButton = new XRadioButton("Replace all existing with selected item(s)");
+ private XRadioButton deleteSelectedRadioButton = new XRadioButton("Remove selected item(s) if already chosen.");
+ public static enum Selection {
+ AddSelection, ReplaceAll, DeleteSelected
+ };
+ private Selection selected = Selection.AddSelection;
+
+ /**
+ * @param parent
+ * @param artifacts
+ */
+ public EnumSelectionDialog(String attributeName, Collection<? extends Artifact> artifacts) {
+ super(Display.getCurrent().getActiveShell(), new StringLabelProvider(), new ArrayTreeContentProvider());
+ setTitle("Select Options");
+ setMessage("Select option(s) to add, delete or replace.");
+ Set<String> options;
+ try {
+ options =
+ AttributeTypeManager.getEnumerationValues(attributeName);
+ } catch (OseeCoreException ex) {
+ options = new HashSet<String>();
+ options.add(ex.getLocalizedMessage());
+ }
+ setInput(options);
+ setComparator(new StringViewerSorter());
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+
+ addSelectedRadioButton.createWidgets(comp, 2);
+ addSelectedRadioButton.setSelected(true);
+ addSelectedRadioButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (addSelectedRadioButton.isSelected()) selected = Selection.AddSelection;
+ }
+ });
+
+ replaceAllRadioButton.createWidgets(comp, 2);
+ replaceAllRadioButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (replaceAllRadioButton.isSelected()) selected = Selection.ReplaceAll;
+ }
+ });
+
+ deleteSelectedRadioButton.createWidgets(comp, 2);
+ deleteSelectedRadioButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (deleteSelectedRadioButton.isSelected()) selected = Selection.DeleteSelected;
+ }
+ });
+ return c;
+ }
+
+ public Selection getSelected() {
+ return selected;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactAction.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactAction.java
new file mode 100644
index 00000000000..bc293073f69
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactAction.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.framework.ui.skynet.artifact;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.WorkspaceURL;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.framework.ui.skynet.ArtifactDragDropSupport;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OpenArtifactAction implements IObjectActionDelegate {
+ private IWorkbenchPart targetPart;
+ private Shell shell;
+
+ public OpenArtifactAction() {
+ super();
+ }
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ this.targetPart = targetPart;
+ shell = targetPart.getSite().getShell();
+ }
+
+ public void run(IAction action) {
+ Object object = (Object) AWorkspace.getSelection(targetPart).getFirstElement();
+ Artifact artifact = null;
+ IFile iFile = null;
+
+ if (object instanceof IFile) {
+ iFile = (IFile) object;
+ try {
+ artifact = ArtifactDragDropSupport.getArtifactFromWorkspaceFile(WorkspaceURL.getURL(iFile), shell);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ if (artifact != null) {
+ ArtifactEditor.editArtifact(artifact);
+ }
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactEditorLoopbackCmd.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactEditorLoopbackCmd.java
new file mode 100644
index 00000000000..945cd3cfa81
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/OpenArtifactEditorLoopbackCmd.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact;
+
+import java.net.HttpURLConnection;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.httpRequests.BaseArtifactLoopbackCmd;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditorInput;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenArtifactEditorLoopbackCmd extends BaseArtifactLoopbackCmd {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.httpRequests.BaseArtifactLoopbackCmd#isApplicable(java.lang.String)
+ */
+ @Override
+ public boolean isApplicable(String cmd) {
+ return cmd != null && cmd.equalsIgnoreCase("open.artifact");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.httpRequests.BaseArtifactLoopbackCmd#process(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.util.Map, org.eclipse.osee.framework.core.client.server.HttpResponse)
+ */
+ @Override
+ public void process(final Artifact artifact, final Map<String, String> parameters, final HttpResponse httpResponse) {
+ if (artifact != null) {
+ try {
+ boolean hasPermissionToRead = false;
+ try {
+ hasPermissionToRead = AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ if (!hasPermissionToRead) {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_UNAUTHORIZED, String.format(
+ "Access denied - User does not have read access to [%s]", artifact));
+ } else {
+ final MutableBoolean isDone = new MutableBoolean(false);
+
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ IEditorPart part =
+ AWorkbench.getActivePage().openEditor(new ArtifactEditorInput(artifact),
+ ArtifactEditor.EDITOR_ID, true);
+ if (part != null) {
+ String html =
+ AHTML.simplePage(artifact.getDescriptiveName() + " has been opened in OSEE on branch " + artifact.getBranch() + "<br><br>" + "<form><input type=button onClick='window.opener=self;window.close()' value='Close'></form>");
+ httpResponse.getPrintStream().println(html);
+ } else {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_INTERNAL_ERROR, String.format(
+ "Unable to open: [%s]", artifact.getDescriptiveName()));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_INTERNAL_ERROR, String.format(
+ "Unable to open: [%s]", artifact.getDescriptiveName()), ex);
+ } finally {
+ isDone.setValue(true);
+ }
+ }
+ });
+
+ int count = 1;
+ while (!isDone.getValue() && count < 30) {
+ try {
+ Thread.sleep(350);
+ } catch (InterruptedException ex) {
+ }
+ count++;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_INTERNAL_ERROR, String.format(
+ "Unable to open: [%s]", artifact.getDescriptiveName()), ex);
+ }
+ } else {
+ httpResponse.outputStandardError(HttpURLConnection.HTTP_BAD_REQUEST, "Unable to open null artifact");
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/SkynetGuiArtifactFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/SkynetGuiArtifactFactory.java
new file mode 100644
index 00000000000..8813dfaa2ba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/SkynetGuiArtifactFactory.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.framework.ui.skynet.artifact;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.GlobalPreferences;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamWorkflow;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPageDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkRuleDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkWidgetDefinition;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.XViewerCustomizationArtifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SkynetGuiArtifactFactory extends ArtifactFactory {
+
+ public static Collection<String> BASIC_ARTIFACTS =
+ Arrays.asList(WorkFlowDefinition.ARTIFACT_NAME, WorkPageDefinition.ARTIFACT_NAME,
+ WorkWidgetDefinition.ARTIFACT_NAME, WorkRuleDefinition.ARTIFACT_NAME);
+
+ public static Collection<String> OTHER_ARTIFACTS =
+ Arrays.asList(BlamWorkflow.ARTIFACT_NAME, GlobalPreferences.ARTIFACT_NAME,
+ XViewerCustomizationArtifact.ARTIFACT_TYPE_NAME);
+
+ @SuppressWarnings("unchecked")
+ public SkynetGuiArtifactFactory() {
+ super(Collections.setUnion(BASIC_ARTIFACTS, OTHER_ARTIFACTS));
+ }
+
+ public @Override
+ Artifact getArtifactInstance(String guid, String humandReadableId, Branch branch, ArtifactType artifactType) throws OseeCoreException {
+ if (artifactType.getName().equals(XViewerCustomizationArtifact.ARTIFACT_TYPE_NAME)) {
+ return new XViewerCustomizationArtifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (artifactType.getName().equals(BlamWorkflow.ARTIFACT_NAME)) {
+ return new BlamWorkflow(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (artifactType.getName().equals(GlobalPreferences.ARTIFACT_NAME)) {
+ return new GlobalPreferences(this, guid, humandReadableId, branch, artifactType);
+ }
+ if (BASIC_ARTIFACTS.contains(artifactType.getName())) {
+ return new Artifact(this, guid, humandReadableId, branch, artifactType);
+ }
+ throw new OseeArgumentException("did not recognize the artifact type: " + artifactType.getName());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AnnotationComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AnnotationComposite.java
new file mode 100644
index 00000000000..54ffbb507bd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AnnotationComposite.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.framework.ui.skynet.artifact.annotation;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.ArtifactAnnotation;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AnnotationComposite extends Composite {
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public AnnotationComposite(Composite parent, int style, Artifact artifact) {
+ this(null, parent, style, artifact);
+ }
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public AnnotationComposite(FormToolkit toolkit, Composite parent, int style, Artifact artifact) {
+ super(parent, style);
+
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 4;
+ setLayoutData(gd);
+ setLayout(ALayout.getZeroMarginLayout(2, false));
+
+ for (ArtifactAnnotation.Type type : ArtifactAnnotation.Type.getOrderedTypes()) {
+ try {
+ for (ArtifactAnnotation notify : artifact.getAnnotations()) {
+ if (notify.getType() != type) continue;
+ if (notify.getType() == ArtifactAnnotation.Type.None) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, new IllegalStateException(
+ "None is an invalid annotation type - " + artifact.getHumanReadableId()));
+ continue;
+ }
+ Label iconLabel = toolkit != null ? toolkit.createLabel(this, "") : new Label(this, SWT.NONE);
+ iconLabel.setImage(ImageManager.getAnnotationImage(notify.getType()));
+
+ Label alertLabel = toolkit != null ? toolkit.createLabel(this, "") : new Label(this, SWT.NONE);
+ alertLabel.setText(notify.getType().name() + ": " + notify.getContent());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ if (toolkit != null) toolkit.adapt(this);
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AttributeAnnotationHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AttributeAnnotationHandler.java
new file mode 100644
index 00000000000..5f4be7e521b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/annotation/AttributeAnnotationHandler.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.framework.ui.skynet.artifact.annotation;
+
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.ArtifactAnnotation;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.AttributeAnnotationManager;
+import org.eclipse.osee.framework.skynet.core.artifact.annotation.IArtifactAnnotation;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AttributeAnnotationHandler implements IArtifactAnnotation {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.annotation.IArtifactAnnotation#getAnnotations(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ public void getAnnotations(Artifact artifact, Set<ArtifactAnnotation> annotations) {
+ try {
+ if (artifact.isAttributeTypeValid(AttributeAnnotationManager.ANNOTATION_ATTRIBUTE)) {
+ AttributeAnnotationManager mgr = new AttributeAnnotationManager(artifact);
+ annotations.addAll(mgr.getAnnotations());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractArtifactEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractArtifactEditor.java
new file mode 100644
index 00000000000..eff511c35ff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractArtifactEditor.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.editor.FormEditor;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class AbstractArtifactEditor extends FormEditor implements IDirtiableEditor {
+
+ private final static Object[] EMPTY_ARRAY = new Object[0];
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#createToolkit(org.eclipse.swt.widgets.Display)
+ */
+ @Override
+ protected XFormToolkit createToolkit(Display display) {
+ // Create a toolkit that shares colors between editors.
+ // the toolkit will be disposed by the super class (FormEditor)
+ return new XFormToolkit(SkynetGuiPlugin.getInstance().getSharedFormColors(display));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.EditorPart#doSaveAs()
+ */
+ @Override
+ public void doSaveAs() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
+ */
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.swt.IDirtiableEditor#onDirtied()
+ */
+ public void onDirtied() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#getToolkit()
+ */
+ @Override
+ public XFormToolkit getToolkit() {
+ return (XFormToolkit) super.getToolkit();
+ }
+
+ protected Artifact getArtifactFromEditorInput() {
+ return (Artifact) getEditorInput().getAdapter(Artifact.class);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
+ */
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ super.init(site, input);
+ ISelectionProvider provider = new ArtifactEditorSelectionProvider();
+ Artifact artifact = getArtifactFromEditorInput();
+ Object[] selected = artifact != null ? new Object[] {artifact} : EMPTY_ARRAY;
+ provider.setSelection(new StructuredSelection(selected));
+ getSite().setSelectionProvider(provider);
+ }
+
+ private final class ArtifactEditorSelectionProvider implements ISelectionProvider {
+ private ISelection selection;
+
+ @Override
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ }
+
+ @Override
+ public ISelection getSelection() {
+ return selection;
+ }
+
+ @Override
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ }
+
+ @Override
+ public void setSelection(ISelection selection) {
+ this.selection = selection;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractEventArtifactEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractEventArtifactEditor.java
new file mode 100644
index 00000000000..e82c2eb5d7b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/AbstractEventArtifactEditor.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.AccessControlEventType;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IAccessControlEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class AbstractEventArtifactEditor extends AbstractArtifactEditor {
+
+ private final InternalEventHandler internalEventHandler;
+
+ public AbstractEventArtifactEditor() {
+ super();
+ internalEventHandler = new InternalEventHandler();
+ OseeEventManager.addListener(internalEventHandler);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+ // TODO Auto-generated method stub
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ boolean wasDirty = false;
+ Artifact artifact = getArtifactFromEditorInput();
+ if (artifact != null) {
+ if (!artifact.isDeleted() && !artifact.isReadOnly()) {
+ wasDirty = super.isDirty() || artifact.isDirty(true);
+ }
+ }
+ return wasDirty;
+ }
+
+ protected abstract void checkEnabledTooltems();
+
+ protected abstract void refreshDirtyArtifact();
+
+ protected abstract void closeEditor();
+
+ protected abstract void refreshRelations();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ OseeEventManager.removeListener(internalEventHandler);
+ }
+
+ private final class InternalEventHandler implements IArtifactsPurgedEventListener, IBranchEventListener, IAccessControlEventListener, IArtifactModifiedEventListener, IArtifactsChangeTypeEventListener, IRelationModifiedEventListener, IFrameworkTransactionEventListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactModifiedEventListener#handleArtifactModifiedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.ArtifactModType, org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public void handleArtifactModifiedEvent(Sender sender, final ArtifactModType artifactModType, final Artifact artifact) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (getArtifactFromEditorInput() == null || !getArtifactFromEditorInput().equals(artifact)) return;
+ if (artifactModType == ArtifactModType.Added || artifactModType == ArtifactModType.Changed || artifactModType == ArtifactModType.Reverted) {
+ refreshDirtyArtifact();
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener#handleArtifactsChangeTypeEvent(org.eclipse.osee.framework.skynet.core.event.Sender, int, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, final LoadedArtifacts loadedArtifacts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ Artifact localArtifact = getArtifactFromEditorInput();
+ if (loadedArtifacts.getLoadedArtifacts().contains(localArtifact)) {
+ closeEditor();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener#handleRelationModifiedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.relation.RelationModType, org.eclipse.osee.framework.skynet.core.relation.RelationLink, org.eclipse.osee.framework.skynet.core.artifact.Branch, java.lang.String)
+ */
+ @Override
+ public void handleRelationModifiedEvent(Sender sender, RelationModType relationModType, final RelationLink link, Branch branch, String relationType) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ Artifact localArtifact = getArtifactFromEditorInput();
+ if (link.getArtifactA().equals(localArtifact) || link.getArtifactB().equals(localArtifact)) {
+ refreshRelations();
+ onDirtied();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ Artifact localArtifact = getArtifactFromEditorInput();
+ if (!transData.isHasEvent(localArtifact)) {
+ return;
+ }
+ if (transData.isDeleted(localArtifact)) {
+ closeEditor();
+ }
+ if (transData.isRelAddedChangedDeleted(localArtifact)) {
+ refreshRelations();
+ }
+ if (transData.isChanged(localArtifact)) {
+ refreshDirtyArtifact();
+ }
+ onDirtied();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, final LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ if (loadedArtifacts.getLoadedArtifacts().contains(getArtifactFromEditorInput())) {
+ closeEditor();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.BranchEventType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, final BranchEventType branchModType, final int branchId) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (branchModType == BranchEventType.Committed) {
+ if (getArtifactFromEditorInput().getBranch().getBranchId() == branchId) {
+ closeEditor();
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.skynet.core.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ // TODO Auto-generated method stub
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IAccessControlEventListener#handleAccessControlArtifactsEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.AccessControlEventType, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleAccessControlArtifactsEvent(Sender sender, AccessControlEventType accessControlEventType, LoadedArtifacts loadedArtifacts) {
+ try {
+ if (accessControlEventType == AccessControlEventType.ArtifactsLocked || accessControlEventType == AccessControlEventType.ArtifactsUnlocked) {
+ if (loadedArtifacts.getLoadedArtifacts().contains(getArtifactFromEditorInput())) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ setTitleImage(ImageManager.getImage(getArtifactFromEditorInput()));
+ }
+ });
+ }
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditor.java
new file mode 100644
index 00000000000..fc4b2679160
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditor.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.framework.ui.skynet.artifact.editor;
+
+import java.util.Collection;
+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.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.RelationsComposite;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.pages.ArtifactEditorOutlinePage;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.pages.ArtifactFormPage;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactEditor extends AbstractEventArtifactEditor {
+ public static final String EDITOR_ID = "org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor";
+
+ private IActionContributor actionBarContributor;
+ private ArtifactFormPage formPage;
+ private ArtifactEditorOutlinePage outlinePage;
+
+ public ArtifactEditor() {
+ super();
+ }
+
+ public IActionContributor getActionBarContributor() {
+ if (actionBarContributor == null) {
+ actionBarContributor = new ArtifactEditorActionBarContributor(this);
+ }
+ return actionBarContributor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#getEditorInput()
+ */
+ @Override
+ public BaseArtifactEditorInput getEditorInput() {
+ return (BaseArtifactEditorInput) super.getEditorInput();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractEventArtifactEditor#onDirtied()
+ */
+ @Override
+ public void onDirtied() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ firePropertyChange(PROP_DIRTY);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
+ */
+ @Override
+ public void showBusy(boolean busy) {
+ super.showBusy(busy);
+ ArtifactFormPage page = getFormPage();
+ if (page != null) {
+ page.showBusy(busy);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ try {
+ getFormPage().doSave(monitor);
+ Artifact artifact = getEditorInput().getArtifact();
+ artifact.persistAttributesAndRelations();
+ firePropertyChange(PROP_DIRTY);
+ } catch (OseeCoreException ex) {
+ onDirtied();
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractEventArtifactEditor#dispose()
+ */
+ @Override
+ public void dispose() {
+ try {
+ // If the artifact is dirty when the editor get's disposed, then it needs to be reverted
+ Artifact artifact = getEditorInput().getArtifact();
+ if (!artifact.isDeleted() && artifact.isDirty(true)) {
+ try {
+ artifact.reloadAttributesAndRelations();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ } finally {
+ super.dispose();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractEventArtifactEditor#checkEnabledTooltems()
+ */
+ @Override
+ protected void checkEnabledTooltems() {
+ // if (!attributeComposite.isDisposed()) {
+ // Display.getDefault().asyncExec(new Runnable() {
+ // public void run() {
+ // boolean isEditAllowed = artifact.isReadOnly() != true;
+ //
+ // if (attributeComposite.getToolBar() == null || attributeComposite.getToolBar().isDisposed()) {
+ // return;
+ // }
+ // attributeComposite.getToolBar().getItem(REVEAL_ARTIFACT_INDEX).setEnabled(true);
+ // attributeComposite.getToolBar().getItem(EDIT_ARTIFACT_INDEX).setEnabled(isEditAllowed);
+ // attributeComposite.getToolBar().update();
+ //
+ // relationsComposite.getToolBar().getItem(REVEAL_ARTIFACT_INDEX).setEnabled(true);
+ // relationsComposite.getToolBar().getItem(EDIT_ARTIFACT_INDEX).setEnabled(isEditAllowed);
+ // relationsComposite.getToolBar().update();
+ // }
+ // });
+ // }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractEventArtifactEditor#closeEditor()
+ */
+ @Override
+ protected void closeEditor() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ AWorkbench.getActivePage().closeEditor(ArtifactEditor.this, false);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractEventArtifactEditor#refreshDirtyArtifact()
+ */
+ @Override
+ protected void refreshDirtyArtifact() {
+ Jobs.startJob(new RefreshDirtyArtifactJob());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractEventArtifactEditor#refreshRelationsComposite()
+ */
+ @Override
+ protected void refreshRelations() {
+ Jobs.startJob(new RefreshRelations());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+ OseeContributionItem.addTo(this, true);
+ setPartName(getEditorInput().getName());
+ setTitleImage(getEditorInput().getImage());
+
+ formPage = new ArtifactFormPage(this, "ArtifactFormPage", null);
+ try {
+ addPage(formPage);
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private ArtifactFormPage getFormPage() {
+ return formPage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.MultiPageEditorPart#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == IActionable.class) {
+ return new IActionable() {
+ @Override
+ public String getActionDescription() {
+ return "";
+ }
+ };
+ } else if (adapter == IContentOutlinePage.class) {
+ ArtifactEditorOutlinePage page = getOutlinePage();
+ page.setInput(this);
+ return page;
+ } else if (adapter == RelationsComposite.class) {
+ return getFormPage().getRelationsComposite();
+ }
+ return super.getAdapter(adapter);
+ }
+
+ protected ArtifactEditorOutlinePage getOutlinePage() {
+ if (outlinePage == null) {
+ outlinePage = new ArtifactEditorOutlinePage();
+ }
+ return outlinePage;
+ }
+
+ private final class RefreshRelations extends UIJob {
+ public RefreshRelations() {
+ super("Refresh Relations");
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ ArtifactFormPage page = getFormPage();
+ if (page != null) {
+ page.showBusy(true);
+ RelationsComposite relationsComposite = page.getRelationsComposite();
+ if (relationsComposite != null && !relationsComposite.isDisposed()) {
+ relationsComposite.refresh();
+ onDirtied();
+ }
+ page.showBusy(false);
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ private final class RefreshDirtyArtifactJob extends UIJob {
+
+ public RefreshDirtyArtifactJob() {
+ super("Refresh Dirty Artifact");
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ try {
+ setPartName(getEditorInput().getName());
+ setTitleImage(getEditorInput().getImage());
+ ArtifactEditorOutlinePage outlinePage = getOutlinePage();
+ if (outlinePage != null) {
+ outlinePage.refresh();
+ }
+ ArtifactFormPage page = getFormPage();
+ if (page != null && Widgets.isAccessible(page.getPartControl())) {
+ page.refresh();
+ }
+ onDirtied();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ public static void editArtifacts(final Collection<Artifact> artifacts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ for (Artifact artifact : artifacts) {
+ if (!AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "The user " + UserManager.getUser() + " does not have read access to " + artifact);
+ } else {
+ AWorkbench.getActivePage().openEditor(new ArtifactEditorInput(artifact), EDITOR_ID);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ public static void editArtifact(final Artifact artifact) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ if (!AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "The user " + UserManager.getUser() + " does not have read access to " + artifact);
+ } else if (artifact != null) {
+ AWorkbench.getActivePage().openEditor(new ArtifactEditorInput(artifact), EDITOR_ID);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorActionBarContributor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorActionBarContributor.java
new file mode 100644
index 00000000000..5a8230562c6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorActionBarContributor.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor;
+
+import java.net.URL;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactURL;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OpenWithContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.access.PolicyDialog;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactEditorActionBarContributor implements IActionContributor {
+
+ private final AbstractArtifactEditor editor;
+
+ public ArtifactEditorActionBarContributor(AbstractArtifactEditor editor) {
+ this.editor = editor;
+ }
+
+ public void contributeToToolBar(IToolBarManager manager) {
+ manager.add(createAtsBugAction());
+ manager.add(new Separator());
+ addOpenWithContributionItem(manager);
+ manager.add(new DeleteArtifactAction());
+ manager.add(new Separator());
+ manager.add(new OpenOutlineAction());
+ manager.add(new OpenHistoryAction());
+ manager.add(new RevealInExplorerAction());
+ manager.add(new RevealBranchAction());
+ manager.add(new Separator());
+ manager.add(new AccessControlAction());
+ manager.add(new Separator());
+ manager.add(new CopyArtifactURLAction());
+ }
+
+ private Artifact getSelectedArtifact() {
+ Artifact toReturn = null;
+
+ ISelectionProvider provider = editor.getSite().getSelectionProvider();
+ ISelection selection = provider.getSelection();
+ if (!selection.isEmpty()) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ Object selectedObject = structuredSelection.getFirstElement();
+ if (selectedObject instanceof Artifact) {
+ toReturn = (Artifact) selectedObject;
+ }
+ }
+ return toReturn;
+ }
+
+ private void addOpenWithContributionItem(IToolBarManager manager) {
+ OpenWithContributionItem contributionItem = new OpenWithContributionItem();
+ contributionItem.setVisible(true);
+ manager.add(contributionItem);
+ }
+
+ private final Action createAtsBugAction() {
+ IEditorSite site = editor.getEditorSite();
+ return OseeAts.createBugAction(SkynetGuiPlugin.getInstance(), editor, site.getId(), site.getRegisteredName());
+ }
+
+ private final class RevealBranchAction extends Action {
+ public RevealBranchAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BRANCH));
+ setToolTipText("Reveal the branch this artifact is on in the Branch Manager");
+ }
+
+ @Override
+ public void run() {
+ try {
+ BranchView.revealBranch(getSelectedArtifact().getBranch());
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ }
+
+ private final class DeleteArtifactAction extends Action {
+
+ public DeleteArtifactAction() {
+ super("&Delete Artifact\tDelete", Action.AS_PUSH_BUTTON);
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.DELETE));
+ }
+
+ @Override
+ public void run() {
+ try {
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Confirm Artifact Deletion", null,
+ " Are you sure you want to delete this artifact and all of the default hierarchy children?",
+ MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1);
+ if (dialog.open() == Window.OK) {
+ getSelectedArtifact().deleteAndPersist();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final class OpenHistoryAction extends Action {
+
+ public OpenHistoryAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.DB_ICON_BLUE));
+ setToolTipText("Show this artifact in the Resource History");
+ }
+
+ @Override
+ public void run() {
+ try {
+ HistoryView.open(getSelectedArtifact());
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final class RevealInExplorerAction extends Action {
+ public RevealInExplorerAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.MAGNIFY));
+ setToolTipText("Reveal this artifact in the Artifact Explorer");
+ }
+
+ @Override
+ public void run() {
+ try {
+ ArtifactExplorer.revealArtifact(getSelectedArtifact());
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final class AccessControlAction extends Action {
+ public AccessControlAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.AUTHENTICATED));
+ setToolTipText("Access Control");
+ }
+
+ @Override
+ public void run() {
+ try {
+ PolicyDialog pd = new PolicyDialog(Display.getCurrent().getActiveShell(), getSelectedArtifact());
+ pd.open();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final class CopyArtifactURLAction extends Action {
+ public CopyArtifactURLAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.COPYTOCLIPBOARD));
+ setToolTipText("Copy artifact url link to clipboard. NOTE: This is a link pointing to the latest version of the artifact.");
+ }
+
+ @Override
+ public void run() {
+ if (getSelectedArtifact() != null) {
+ Clipboard clipboard = null;
+ try {
+ URL url = ArtifactURL.getExternalArtifactLink(getSelectedArtifact());
+ clipboard = new Clipboard(null);
+ clipboard.setContents(new Object[] {url.toString()}, new Transfer[] {TextTransfer.getInstance()});
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format(
+ "Error obtaining url for - guid: [%s] branch:[%s]", getSelectedArtifact().getGuid(),
+ getSelectedArtifact().getBranch()), ex);
+ } finally {
+ if (clipboard != null && !clipboard.isDisposed()) {
+ clipboard.dispose();
+ clipboard = null;
+ }
+ }
+ }
+ }
+ }
+
+ private final class OpenOutlineAction extends Action {
+ public OpenOutlineAction() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("outline_co.gif"));
+ setToolTipText("Open Outline");
+ }
+
+ @Override
+ public void run() {
+ try {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+ "org.eclipse.ui.views.ContentOutline");
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Unable to open outline", ex);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorContributor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorContributor.java
new file mode 100644
index 00000000000..587f605b518
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorContributor.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.framework.ui.skynet.artifact.editor;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ICoolBarManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.SelectionCountChangeListener;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.RelationsComposite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.StatusLineContributionItem;
+
+/**
+ * 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 ArtifactEditorContributor extends MultiPageEditorActionBarContributor {
+
+ private StatusLineContributionItem typeStatusItem;
+ private ShowInExplorerAction showInExplorerAction;
+
+ /**
+ * Creates a multi-page contributor.
+ */
+ public ArtifactEditorContributor() {
+ super();
+
+ createActions();
+ }
+
+ @Override
+ public void setActiveEditor(IEditorPart part) {
+ super.setActiveEditor(part);
+ Artifact artifact = (Artifact) part.getAdapter(Artifact.class);
+ if (artifact != null) {
+ typeStatusItem.setText(artifact.getArtifactType().getName());
+ typeStatusItem.setImage(ImageManager.getImage(artifact));
+ showInExplorerAction.setArtifact(artifact);
+
+ RelationsComposite composite = (RelationsComposite) part.getAdapter(RelationsComposite.class);
+ if (composite != null) {
+ composite.getTreeViewer().addSelectionChangedListener(
+ new SelectionCountChangeListener(this.getActionBars().getStatusLineManager()));
+ }
+ }
+ }
+
+ @Override
+ public void setActivePage(IEditorPart part) {
+ }
+
+ private void createActions() {
+ typeStatusItem = new StatusLineContributionItem("skynet.artifactType", true, 25);
+ typeStatusItem.setToolTipText("The type of the artifact being edited.");
+
+ showInExplorerAction = new ShowInExplorerAction();
+ }
+
+ @Override
+ public void contributeToStatusLine(IStatusLineManager statusLineManager) {
+ statusLineManager.add(typeStatusItem);
+ OseeContributionItem.addTo(statusLineManager);
+ }
+
+ @Override
+ public void contributeToCoolBar(ICoolBarManager coolBarManager) {
+ coolBarManager.add(showInExplorerAction);
+ }
+
+ private static class ShowInExplorerAction extends Action {
+ private Artifact artifact;
+
+ public ShowInExplorerAction() {
+ setText("Show in Artifact Explorer");
+ setToolTipText("Show the Artifact being edited in the Artifact Explorer");
+ }
+
+ public void setArtifact(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ @Override
+ public void run() {
+ ArtifactExplorer.revealArtifact(artifact);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorInput.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorInput.java
new file mode 100644
index 00000000000..7d801e0d950
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/ArtifactEditorInput.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.framework.ui.skynet.artifact.editor;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactEditorInput extends BaseArtifactEditorInput {
+
+ public ArtifactEditorInput(Artifact artifact) {
+ super(artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditorInput#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ArtifactEditorInput) {
+ return super.equals(obj);
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/BaseArtifactEditorInput.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/BaseArtifactEditorInput.java
new file mode 100644
index 00000000000..8ba1779f350
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/BaseArtifactEditorInput.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.framework.ui.skynet.artifact.editor;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseArtifactEditorInput implements IEditorInput {
+ private final Artifact artifact;
+
+ public BaseArtifactEditorInput(Artifact artifact) {
+ this.artifact = artifact;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ boolean equals = false;
+ if (obj instanceof BaseArtifactEditorInput) {
+ BaseArtifactEditorInput otherEdInput = (BaseArtifactEditorInput) obj;
+ equals = artifact == otherEdInput.artifact;
+ }
+ return equals;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return ImageManager.getImageDescriptor(artifact);
+ }
+
+ public Image getImage() {
+ return ImageManager.getImage(artifact);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ public String getName() {
+ if (artifact == null) {
+ return "No Artifact Input Provided";
+ }
+ return String.format("%s%s", artifact.getVersionedName(), artifact.isReadOnly() ? " (Read-Only)" : "");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (Artifact.class.equals(adapter)) {
+ return getArtifact();
+ }
+ return null;
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ public boolean isReadOnly() {
+ return artifact == null || artifact.isReadOnly();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/IActionContributor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/IActionContributor.java
new file mode 100644
index 00000000000..22ba53958c1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/IActionContributor.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.framework.ui.skynet.artifact.editor;
+
+import org.eclipse.jface.action.IToolBarManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IActionContributor {
+
+ public void contributeToToolBar(IToolBarManager manager);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactEditorOutlinePage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactEditorOutlinePage.java
new file mode 100644
index 00000000000..c725fb320aa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactEditorOutlinePage.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor.pages;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.sections.AttributeTypeUtil;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactEditorOutlinePage extends ContentOutlinePage {
+
+ private ArtifactEditor editor;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.Page#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+
+ Tree tree = getTreeViewer().getTree();
+ tree.setLayout(new FillLayout(SWT.VERTICAL));
+ getTreeViewer().setContentProvider(new InternalContentProvider());
+ getTreeViewer().setLabelProvider(new InternalLabelProvider());
+ setInput(editor != null ? editor : "No Input Available");
+
+ getSite().getActionBars().getToolBarManager().add(
+ new Action("Refresh", ImageManager.getImageDescriptor(FrameworkImage.REFRESH)) {
+ @Override
+ public void run() {
+ refresh();
+ }
+ });
+ getSite().getActionBars().getToolBarManager().update(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection sSelection = (IStructuredSelection) selection;
+ if (!sSelection.isEmpty()) {
+ System.out.println("Outline Selection");
+ }
+ }
+ }
+
+ public void setInput(Object input) {
+ if (input instanceof ArtifactEditor) {
+ this.editor = (ArtifactEditor) input;
+ if (getTreeViewer() != null) {
+ getTreeViewer().setInput(editor != null ? editor : "No Input Available");
+ }
+ }
+ }
+
+ public void refresh() {
+ TreeViewer viewer = getTreeViewer();
+ if (viewer != null && Widgets.isAccessible(viewer.getTree())) {
+ viewer.refresh();
+ }
+ }
+
+ private final class InternalLabelProvider extends LabelProvider {
+
+ private final List<AttributeTypeContainer> containers;
+
+ public InternalLabelProvider() {
+ this.containers = new ArrayList<AttributeTypeContainer>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ if (element instanceof BaseArtifactEditorInput) {
+ return ((BaseArtifactEditorInput) element).getName();
+ } else if (element instanceof AttributeTypeContainer) {
+ return ((AttributeTypeContainer) element).getName();
+ }
+ return String.valueOf(element);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof BaseArtifactEditorInput) {
+ containers.clear();
+ return ((BaseArtifactEditorInput) element).getImage();
+ } else if (element instanceof AttributeTypeContainer) {
+ AttributeTypeContainer container = ((AttributeTypeContainer) element);
+ containers.add(container);
+ return container.isEditable() ? ImageManager.getImage(FrameworkImage.EDIT_ARTIFACT) : ImageManager.getImage(FrameworkImage.ADD_GREEN);
+ } else if (element instanceof AttributeType) {
+ AttributeType type = (AttributeType) element;
+ for (AttributeTypeContainer container : containers) {
+ if (container.contains(type)) {
+ return container.isEditable() ? ImageManager.getImage(FrameworkImage.ATTRIBUTE_SUB_A) : ImageManager.getImage(FrameworkImage.ATTRIBUTE_DISABLED);
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ private final class InternalContentProvider implements ITreeContentProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Object[] getChildren(Object element) {
+ List<Object> items = new ArrayList<Object>();
+
+ if (element instanceof ArtifactEditor) {
+ BaseArtifactEditorInput editorInput = ((ArtifactEditor) element).getEditorInput();
+ items.add(editorInput);
+ } else if (element instanceof BaseArtifactEditorInput) {
+ try {
+ Artifact artifact = ((BaseArtifactEditorInput) element).getArtifact();
+ boolean isEditable = !artifact.isReadOnly();
+ items.add(new AttributeTypeContainer(isEditable ? "Editable" : "Readable", true,
+ AttributeTypeUtil.getTypesWithData(artifact)));
+ items.add(new AttributeTypeContainer(isEditable ? "Add to form before editing" : "Empty Types", false,
+ AttributeTypeUtil.getEmptyTypes(artifact)));
+ } catch (OseeCoreException ex) {
+ items.add(Lib.exceptionToString(ex));
+ }
+ } else if (element instanceof AttributeTypeContainer) {
+ return ((AttributeTypeContainer) element).getTypes().toArray();
+ } else if (element instanceof String) {
+ items.add(element);
+ }
+ return items.toArray(new Object[items.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ if (element instanceof BaseArtifactEditorInput) {
+ return editor;
+ } else if (element instanceof String) {
+ return editor;
+ } else if (element instanceof AttributeType) {
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ @Override
+ public boolean hasChildren(Object element) {
+ if (element instanceof String) {
+ return false;
+ } else if (element instanceof BaseArtifactEditorInput) {
+ return ((BaseArtifactEditorInput) element).getArtifact() != null;
+ } else if (element instanceof AttributeTypeContainer) {
+ return !((AttributeTypeContainer) element).getTypes().isEmpty();
+ } else if (element instanceof Artifact) {
+ try {
+ Artifact artifact = (Artifact) element;
+ return !artifact.getAttributeTypes().isEmpty();
+ } catch (OseeCoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+ }
+
+ private final static class AttributeTypeContainer {
+ private List<AttributeType> types;
+ private final String name;
+ private final boolean editable;
+
+ public AttributeTypeContainer(String name, boolean editable, AttributeType... data) {
+ this.name = name;
+ this.editable = editable;
+ if (data == null) {
+ this.types = Collections.emptyList();
+ } else {
+ this.types = Arrays.asList(data);
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List<AttributeType> getTypes() {
+ return types;
+ }
+
+ public boolean isEditable() {
+ return editable;
+ }
+
+ public boolean contains(AttributeType type) {
+ return getTypes().contains(type);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactFormPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactFormPage.java
new file mode 100644
index 00000000000..4708709e538
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/pages/ArtifactFormPage.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.framework.ui.skynet.artifact.editor.pages;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.RelationsComposite;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.parts.MessageSummaryNote;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.sections.AttributesFormSection;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.sections.DetailsFormSection;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.sections.RelationsFormSection;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessage;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+public class ArtifactFormPage extends FormPage {
+
+ private enum SectionEnum {
+ Attributes, Relations, Details;
+ }
+
+ private final Map<SectionEnum, SectionPart> sectionParts;
+ private FormText infoText;
+
+ public ArtifactFormPage(FormEditor editor, String id, String title) {
+ super(editor, id, title);
+ this.sectionParts = new LinkedHashMap<SectionEnum, SectionPart>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+ sectionParts.clear();
+
+ final ScrolledForm form = managedForm.getForm();
+ final FormToolkit toolkit = managedForm.getToolkit();
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.marginHeight = 10;
+ layout.marginWidth = 6;
+ layout.horizontalSpacing = 20;
+ form.getBody().setLayout(layout);
+ form.getBody().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
+
+ updateTitle(form);
+ updateImage(form);
+ updateArtifactInfoArea(toolkit, form, true);
+ addToolBar(toolkit, form, true);
+ addHeadingGradient(toolkit, form, true);
+ addMessageDecoration(form);
+
+ int sectionStyle = Section.TITLE_BAR | Section.TWISTIE;
+
+ sectionParts.put(SectionEnum.Attributes, new AttributesFormSection(getEditor(), form.getBody(), toolkit,
+ sectionStyle | Section.EXPANDED));
+ sectionParts.put(SectionEnum.Relations, new RelationsFormSection(getEditor(), form.getBody(), toolkit,
+ sectionStyle));
+ sectionParts.put(SectionEnum.Details, new DetailsFormSection(getEditor(), form.getBody(), toolkit, sectionStyle));
+
+ for (SectionPart part : sectionParts.values()) {
+ managedForm.addPart(part);
+ Section section = part.getSection();
+ section.marginWidth = 0;
+ section.marginHeight = 2;
+ }
+ form.layout();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormPage#getEditor()
+ */
+ @Override
+ public ArtifactEditor getEditor() {
+ return (ArtifactEditor) super.getEditor();
+ }
+
+ private void addMessageDecoration(ScrolledForm form) {
+ form.getForm().addMessageHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ String title = e.getLabel();
+ Object href = e.getHref();
+ if (href instanceof IMessage[]) {
+ Point noteLocation = ((Control) e.widget).toDisplay(0, 0);
+ noteLocation.x += 10;
+ noteLocation.y += 10;
+
+ MessageSummaryNote note = new MessageSummaryNote(getManagedForm(), title, (IMessage[]) href);
+ note.setLocation(noteLocation);
+ note.open();
+ }
+ }
+
+ });
+ }
+
+ private void addToolBar(FormToolkit toolkit, ScrolledForm form, boolean add) {
+ IToolBarManager manager = form.getToolBarManager();
+ if (add) {
+ manager.add(new RefreshAction());
+ manager.add(new Separator());
+ (getEditor()).getActionBarContributor().contributeToToolBar(manager);
+ manager.update(true);
+ } else {
+ manager.removeAll();
+ }
+ form.reflow(true);
+ }
+
+ private void updateTitle(ScrolledForm form) {
+ form.setText(getEditorInput().getName());
+ }
+
+ private void updateImage(ScrolledForm form) {
+ form.setImage(getEditor().getEditorInput().getImage());
+ }
+
+ private String getArtifactShortInfo() {
+ Artifact artifact = getEditor().getEditorInput().getArtifact();
+ String description =
+ String.format("<form><p><b>Branch:</b> %s <b>Type:</b> %s <b>HRID:</b> %s</p></form>",
+ artifact.getBranch().getBranchShortName(), artifact.getArtifactTypeName(),
+ artifact.getHumanReadableId());
+ return description;
+ }
+
+ private void updateArtifactInfoArea(FormToolkit toolkit, ScrolledForm form, boolean add) {
+ if (add) {
+ Composite infoArea = toolkit.createComposite(form.getForm().getBody(), SWT.WRAP);
+ infoArea.setLayout(ALayout.getZeroMarginLayout(2, false));
+ infoArea.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false));
+
+ Label label = toolkit.createLabel(infoArea, "", SWT.WRAP);
+ label.setImage(MessageDialog.getImage(MessageDialog.DLG_IMG_MESSAGE_INFO));
+
+ infoText = toolkit.createFormText(infoArea, false);
+ infoText.setText(getArtifactShortInfo(), true, false);
+ infoText.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY));
+ infoText.setToolTipText("The human readable id and database id for this artifact");
+ } else {
+ infoText.setText(getArtifactShortInfo(), true, false);
+ }
+ }
+
+ private void addHeadingGradient(FormToolkit toolkit, ScrolledForm form, boolean add) {
+ FormColors colors = toolkit.getColors();
+ Color top = colors.getColor(IFormColors.H_GRADIENT_END);
+ Color bot = colors.getColor(IFormColors.H_GRADIENT_START);
+ if (add)
+ form.getForm().setTextBackground(new Color[] {top, bot}, new int[] {100}, true);
+ else {
+ form.getForm().setTextBackground(null, null, false);
+ form.getForm().setBackground(colors.getBackground());
+ }
+ form.getForm().setHeadColor(IFormColors.H_BOTTOM_KEYLINE1,
+ add ? colors.getColor(IFormColors.H_BOTTOM_KEYLINE1) : null);
+ form.getForm().setHeadColor(IFormColors.H_BOTTOM_KEYLINE2,
+ add ? colors.getColor(IFormColors.H_BOTTOM_KEYLINE2) : null);
+ form.getForm().setHeadColor(IFormColors.H_HOVER_LIGHT, add ? colors.getColor(IFormColors.H_HOVER_LIGHT) : null);
+ form.getForm().setHeadColor(IFormColors.H_HOVER_FULL, add ? colors.getColor(IFormColors.H_HOVER_FULL) : null);
+ form.getForm().setHeadColor(IFormColors.TB_TOGGLE, add ? colors.getColor(IFormColors.TB_TOGGLE) : null);
+ form.getForm().setHeadColor(IFormColors.TB_TOGGLE_HOVER,
+ add ? colors.getColor(IFormColors.TB_TOGGLE_HOVER) : null);
+ form.getForm().setSeparatorVisible(add);
+ form.reflow(true);
+ form.redraw();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormPage#dispose()
+ */
+ @Override
+ public void dispose() {
+ for (SectionPart part : sectionParts.values()) {
+ part.dispose();
+ }
+ super.dispose();
+ }
+
+ public RelationsComposite getRelationsComposite() {
+ SectionPart section = sectionParts.get(SectionEnum.Relations);
+ if (section instanceof RelationsFormSection) {
+ return ((RelationsFormSection) section).getRelationComposite();
+ }
+ return null;
+ }
+
+ public void refresh() {
+ final ScrolledForm sForm = getManagedForm().getForm();
+ updateTitle(sForm);
+ updateImage(sForm);
+ updateArtifactInfoArea(getManagedForm().getToolkit(), sForm, false);
+ for (SectionPart part : sectionParts.values()) {
+ part.refresh();
+ }
+ sForm.getBody().layout(true);
+ sForm.reflow(true);
+ getManagedForm().refresh();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
+ */
+ @Override
+ public void showBusy(boolean busy) {
+ super.showBusy(busy);
+ if (Widgets.isAccessible(getManagedForm().getForm())) {
+ getManagedForm().getForm().getForm().setBusy(busy);
+ }
+ }
+
+ private final class RefreshAction extends Action {
+
+ public RefreshAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ setToolTipText("Refresh Editor");
+ }
+
+ @Override
+ public void run() {
+ refresh();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/AttributeFormPart.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/AttributeFormPart.java
new file mode 100644
index 00000000000..fcbca1f5dc4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/AttributeFormPart.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor.parts;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.sections.AttributeTypeUtil;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidgetUtility;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.AttributeXWidgetManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DefaultXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IAttributeXWidgetProvider;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+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.ui.forms.AbstractFormPart;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.IExpansionListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeFormPart extends AbstractFormPart {
+
+ private final ArtifactEditor editor;
+ private Font defaultLabelFont;
+ private Composite composite;
+
+ public AttributeFormPart(ArtifactEditor editor) {
+ this.editor = editor;
+ }
+
+ public void createContents(Composite parent) {
+ final FormToolkit toolkit = getManagedForm().getToolkit();
+ composite = toolkit.createComposite(parent, SWT.WRAP);
+ composite.setLayout(ALayout.getZeroMarginLayout(1, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ composite.setVisible(false);
+
+ try {
+ Artifact artifact = editor.getEditorInput().getArtifact();
+ boolean isEditable = !artifact.isReadOnly();
+ List<AttributeType> types = Arrays.asList(AttributeTypeUtil.getTypesWithData(artifact));
+ boolean willHaveASection = hasWordAttribute(types);
+ for (AttributeType attributeType : types) {
+ if (attributeType.getBaseAttributeClass().equals(WordAttribute.class)) {
+ createAttributeTypeControlsInSection(parent, toolkit, attributeType, willHaveASection, false);
+ } else {
+ createAttributeTypeControls(composite, toolkit, artifact, attributeType, willHaveASection, isEditable,
+ false);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Unable to access attribute types", ex);
+ }
+ setLabelFonts(composite, getBoldLabelFont());
+ layoutControls(composite);
+
+ for (XWidget xWidget : XWidgetUtility.findXWidgetsInControl(composite)) {
+ xWidget.addXModifiedListener(new XWidgetValidationListener());
+ }
+ composite.setVisible(true);
+ }
+
+ private boolean hasWordAttribute(List<AttributeType> types) {
+ for (AttributeType attributeType : types) {
+ if (attributeType.getBaseAttributeClass().equals(WordAttribute.class)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ Widgets.disposeWidget(composite);
+ super.dispose();
+ }
+
+ private Font getBoldLabelFont() {
+ if (defaultLabelFont == null) {
+ Font baseFont = JFaceResources.getDefaultFont();
+ FontData[] fontDatas = baseFont.getFontData();
+ FontData fontData = fontDatas.length > 0 ? fontDatas[0] : new FontData("arial", 12, SWT.BOLD);
+ defaultLabelFont = new Font(baseFont.getDevice(), fontData.getName(), fontData.getHeight(), SWT.BOLD);
+ }
+ return defaultLabelFont;
+ }
+
+ private void setLabelFonts(Control parent, Font font) {
+ if (parent instanceof Label) {
+ Label label = ((Label) parent);
+ label.setFont(font);
+ }
+ if (parent instanceof Composite) {
+ Composite container = (Composite) parent;
+ for (Control child : container.getChildren()) {
+ setLabelFonts(child, font);
+ }
+ container.layout();
+ }
+ }
+
+ private void layoutControls(Control control) {
+ if (control instanceof Label || control instanceof Button) {
+ control.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ }
+
+ if (control instanceof Composite) {
+ Composite container = (Composite) control;
+ for (Control child : container.getChildren()) {
+ layoutControls(child);
+ }
+ }
+ }
+
+ private Composite createAttributeTypeControls(Composite parent, FormToolkit toolkit, Artifact artifact, AttributeType attributeType, boolean willHaveASection, boolean isEditable, boolean isExpandable) {
+ Composite internalComposite = toolkit.createComposite(parent, SWT.WRAP);
+ GridLayout layout = ALayout.getZeroMarginLayout(1, false);
+ if (willHaveASection) {
+ layout.marginLeft = 18;
+ }
+ internalComposite.setLayout(layout);
+
+ internalComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ IAttributeXWidgetProvider xWidgetProvider = AttributeXWidgetManager.getAttributeXWidgetProvider(attributeType);
+ List<DynamicXWidgetLayoutData> concreteWidgets = xWidgetProvider.getDynamicXWidgetLayoutData(attributeType);
+ try {
+ if (isExpandable) {
+ for (DynamicXWidgetLayoutData data : concreteWidgets) {
+ data.getXOptionHandler().add(XOption.NO_LABEL);
+ }
+ }
+ WorkPage workPage = new WorkPage(concreteWidgets, new DefaultXWidgetOptionResolver());
+ workPage.createBody(getManagedForm(), internalComposite, artifact, null, isEditable);
+ } catch (OseeCoreException ex) {
+ toolkit.createLabel(parent, String.format("Error creating controls for: [%s]", attributeType.getName()));
+ }
+ return internalComposite;
+ }
+
+ private void createAttributeTypeControlsInSection(Composite parent, FormToolkit toolkit, AttributeType attributeType, boolean willHaveASection, boolean isEditable) {
+ int style = ExpandableComposite.COMPACT | ExpandableComposite.TREE_NODE;
+
+ Composite internalComposite = toolkit.createComposite(parent, SWT.WRAP);
+ internalComposite.setLayout(new GridLayout());
+ internalComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+ ExpandableComposite expandable = toolkit.createExpandableComposite(internalComposite, style);
+ expandable.setText(attributeType.getName());
+ expandable.setLayout(new GridLayout());
+ expandable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Artifact artifact = editor.getEditorInput().getArtifact();
+
+ Composite composite =
+ createAttributeTypeControls(expandable, toolkit, artifact, attributeType, willHaveASection, isEditable,
+ true);
+ expandable.setClient(composite);
+
+ expandable.addExpansionListener(new IExpansionListener() {
+
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ getManagedForm().getForm().reflow(true);
+ }
+
+ @Override
+ public void expansionStateChanging(ExpansionEvent e) {
+ getManagedForm().getForm().reflow(false);
+ }
+
+ });
+ toolkit.paintBordersFor(expandable);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#commit(boolean)
+ */
+ @Override
+ public void commit(boolean onSave) {
+ int saveCount = 0;
+ List<XWidget> widgets = XWidgetUtility.findXWidgetsInControl(composite);
+ for (XWidget xWidget : widgets) {
+ if (xWidget.isEditable()) {
+ if (xWidget instanceof IArtifactWidget) {
+ IArtifactWidget aWidget = ((IArtifactWidget) xWidget);
+ try {
+ if (aWidget.isDirty().isTrue()) {
+ aWidget.saveToArtifact();
+ xWidget.removeControlCausedMessage("attribute.dirty");
+ saveCount++;
+ } else {
+ saveCount++;
+ }
+ } catch (OseeCoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+ } else {
+ saveCount++;
+ }
+ }
+
+ // Ensure all changes saved
+ if (saveCount == widgets.size()) {
+ super.commit(onSave);
+ }
+ }
+
+ private final class XWidgetValidationListener implements XModifiedListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener#widgetModified(org.eclipse.osee.framework.ui.skynet.widgets.XWidget)
+ */
+ @Override
+ public void widgetModified(XWidget xWidget) {
+ if (xWidget != null && xWidget instanceof IArtifactWidget) {
+ IArtifactWidget aWidget = (IArtifactWidget) xWidget;
+ try {
+ Result result = aWidget.isDirty();
+ if (result.isTrue()) {
+ xWidget.setControlCausedMessage("attribute.dirty", "Dirty", IMessageProvider.WARNING);
+ if (!isDirty()) {
+ markDirty();
+ }
+ } else {
+ xWidget.removeControlCausedMessage("attribute.dirty");
+ }
+ } catch (Exception ex) {
+ xWidget.setControlCausedMessage("attribute.dirty", "Unable to compute isDirty", IMessageProvider.ERROR);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/MessageSummaryNote.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/MessageSummaryNote.java
new file mode 100644
index 00000000000..761e0d356e7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/parts/MessageSummaryNote.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor.parts;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MessageSummaryNote {
+ private Shell shell;
+
+ public MessageSummaryNote(IManagedForm managedForm, String title, IMessage[] messages) {
+ final ScrolledForm form = managedForm.getForm();
+ final FormToolkit toolkit = managedForm.getToolkit();
+
+ shell = new Shell(form.getShell(), SWT.ON_TOP | SWT.TOOL);
+ shell.setImage(getImage(form.getMessageType()));
+ shell.setText(title);
+ shell.setLayout(new FillLayout());
+
+ Composite composite = toolkit.createComposite(shell, toolkit.getBorderStyle());
+ composite.setLayout(new GridLayout());
+
+ FormText text = toolkit.createFormText(composite, true);
+ configureFormText(form.getForm(), text);
+ text.setText(getMessageSummary(messages), true, false);
+
+ text.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ shell.close();
+ }
+ });
+ shell.setLocation(0, 0);
+ }
+
+ public void setLocation(Point point) {
+ shell.setLocation(point);
+ }
+
+ public void open() {
+ shell.pack();
+ shell.open();
+ }
+
+ private void configureFormText(final Form form, FormText text) {
+ text.addHyperlinkListener(new HyperlinkAdapter() {
+ public void linkActivated(HyperlinkEvent e) {
+ String is = (String) e.getHref();
+ try {
+ int index = Integer.parseInt(is);
+ IMessage[] messages = form.getChildrenMessages();
+ IMessage message = messages[index];
+ Control c = message.getControl();
+ ((FormText) e.widget).getShell().dispose();
+ if (c != null) {
+ c.setFocus();
+ }
+ } catch (NumberFormatException ex) {
+ }
+ }
+ });
+ text.setImage("error", getImage(IMessageProvider.ERROR));
+ text.setImage("warning", getImage(IMessageProvider.WARNING));
+ text.setImage("info", getImage(IMessageProvider.INFORMATION));
+ }
+
+ private Image getImage(int type) {
+ switch (type) {
+ case IMessageProvider.ERROR:
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+ case IMessageProvider.WARNING:
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
+ case IMessageProvider.INFORMATION:
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK);
+ }
+ return null;
+ }
+
+ private String getMessageSummary(IMessage[] messages) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ pw.println("<form>");
+ for (int i = 0; i < messages.length; i++) {
+ IMessage message = messages[i];
+ pw.print("<li vspace=\"false\" style=\"image\" indent=\"16\" value=\"");
+ switch (message.getMessageType()) {
+ case IMessageProvider.ERROR:
+ pw.print("error");
+ break;
+ case IMessageProvider.WARNING:
+ pw.print("warning");
+ break;
+ case IMessageProvider.INFORMATION:
+ pw.print("info");
+ break;
+ }
+ pw.print("\"> <a href=\"");
+ pw.print(i + "");
+ pw.print("\">");
+ if (message.getPrefix() != null) pw.print(message.getPrefix());
+ pw.print(message.getMessage());
+ pw.println("</a></li>");
+ }
+ pw.println("</form>");
+ pw.flush();
+ return sw.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/ArtifactEditorFormSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/ArtifactEditorFormSection.java
new file mode 100644
index 00000000000..e797e7fb00f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/ArtifactEditorFormSection.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.framework.ui.skynet.artifact.editor.sections;
+
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class ArtifactEditorFormSection extends SectionPart {
+
+ private final ArtifactEditor editor;
+
+ /**
+ * @param parent
+ * @param toolkit
+ * @param style
+ */
+ public ArtifactEditorFormSection(ArtifactEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(parent, toolkit, style);
+ this.editor = editor;
+ }
+
+ public ArtifactEditor getEditor() {
+ return editor;
+ }
+
+ public BaseArtifactEditorInput getEditorInput() {
+ return editor.getEditorInput();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeActionContribution.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeActionContribution.java
new file mode 100644
index 00000000000..da299f2570d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeActionContribution.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.framework.ui.skynet.artifact.editor.sections;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.IActionContributor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeActionContribution implements IActionContributor {
+
+ private final ArtifactEditor editor;
+
+ public AttributeActionContribution(ArtifactEditor editor) {
+ this.editor = editor;
+ }
+
+ public void contributeToToolBar(IToolBarManager manager) {
+ manager.add(new OpenAddAttributeTypeDialogAction());
+ manager.add(new OpenDeleteAttributeTypeDialogAction());
+ }
+
+ private CheckedTreeSelectionDialog createDialog(String title, Image image, String message) {
+ CheckedTreeSelectionDialog dialog =
+ new CheckedTreeSelectionDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ new LabelProvider(), new ArrayTreeContentProvider());
+ dialog.setTitle(title);
+ dialog.setImage(image);
+ dialog.setMessage(message);
+ dialog.setValidator(new ISelectionStatusValidator() {
+
+ @Override
+ public IStatus validate(Object[] selection) {
+ if (selection.length == 0) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ "Select at least one item or click cancel to exit.");
+ }
+ return Status.OK_STATUS;
+ }
+ });
+ return dialog;
+ }
+
+ private void handleAttributeTypeEdits(Artifact artifact, boolean isAdd, String title, Image image) throws OseeCoreException {
+ String operation = isAdd ? "add" : "delete";
+ AttributeType[] types =
+ isAdd ? AttributeTypeUtil.getEmptyTypes(artifact) : AttributeTypeUtil.getTypesWithData(artifact);
+ List<AttributeType> input = new ArrayList<AttributeType>(Arrays.asList(types));
+ if (!isAdd) {
+ for (AttributeType type : types) {
+ if (type.getMinOccurrences() > 0 && artifact.getAttributeTypes().contains(type)) {
+ input.remove(type);
+ }
+ }
+ }
+ if (input.isEmpty()) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getDisplay().getActiveShell(), title, String.format(
+ "No attribute types available to %s.", operation));
+ } else {
+ CheckedTreeSelectionDialog dialog =
+ createDialog(title, image, String.format("Select items to %s.", operation));
+ dialog.setInput(input);
+ int result = dialog.open();
+ if (result == Window.OK) {
+ Object[] objects = dialog.getResult();
+ if (objects.length > 0) {
+ for (Object object : objects) {
+ String attributeTypeName = ((AttributeType) object).getName();
+ if (isAdd) {
+ artifact.addAttributeFromString(attributeTypeName, "");
+ } else {
+ artifact.deleteAttributes(attributeTypeName);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private final class OpenAddAttributeTypeDialogAction extends Action {
+ public OpenAddAttributeTypeDialogAction() {
+ super();
+ ImageDescriptor addImage = ImageManager.getImageDescriptor(FrameworkImage.ADD_GREEN);
+ setImageDescriptor(addImage);
+ setToolTipText("Opens a dialog to select which attribute type instances to create on the artifact");
+ }
+
+ @Override
+ public void run() {
+ try {
+ Artifact artifact = editor.getEditorInput().getArtifact();
+ handleAttributeTypeEdits(artifact, true, "Add Attribute Types",
+ ImageManager.getImage(FrameworkImage.ADD_GREEN));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final class OpenDeleteAttributeTypeDialogAction extends Action {
+ public OpenDeleteAttributeTypeDialogAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.DELETE));
+ setToolTipText("Opens a dialog to select which attribute type instances to remove from the artifact");
+ }
+
+ @Override
+ public void run() {
+ try {
+ Artifact artifact = editor.getEditorInput().getArtifact();
+ handleAttributeTypeEdits(artifact, false, "Delete Attribute Types",
+ ImageManager.getImage(FrameworkImage.DELETE));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeTypeUtil.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeTypeUtil.java
new file mode 100644
index 00000000000..63f346d3553
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributeTypeUtil.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.framework.ui.skynet.artifact.editor.sections;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeTypeUtil {
+
+ private AttributeTypeUtil() {
+ }
+
+ public static AttributeType[] getEmptyTypes(Artifact artifact) throws OseeCoreException {
+ List<AttributeType> items = new ArrayList<AttributeType>();
+ for (AttributeType type : artifact.getAttributeTypes()) {
+ if (!type.getName().equals("Name") && artifact.getAttributes(type.getName()).isEmpty()) {
+ items.add(type);
+ }
+ }
+ Collections.sort(items);
+ return items.toArray(new AttributeType[items.size()]);
+ }
+
+ public static AttributeType[] getTypesWithData(Artifact artifact) throws OseeCoreException {
+ List<AttributeType> items = new ArrayList<AttributeType>();
+ AttributeType nameType = null;
+ AttributeType annotations = null;
+
+ Set<AttributeType> typesInExistence = new HashSet<AttributeType>();
+ List<Attribute<?>> attributeInstances = artifact.getAttributes(false);
+ for (Attribute<?> attribute : attributeInstances) {
+ typesInExistence.add(attribute.getAttributeType());
+ }
+ typesInExistence.addAll(artifact.getAttributeTypes());
+ for (AttributeType type : typesInExistence) {
+ if (type.getName().equals("Name")) {
+ nameType = type;
+ } else {
+ if (!artifact.getAttributes(type.getName()).isEmpty()) {
+ if (type.getName().equals("Annotation")) {
+ annotations = type;
+ } else {
+ items.add(type);
+ }
+ }
+ }
+ }
+ Collections.sort(items);
+ if (nameType != null) {
+ items.add(0, nameType);
+ }
+ if (annotations != null) {
+ items.add(annotations);
+ }
+ return items.toArray(new AttributeType[items.size()]);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributesFormSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributesFormSection.java
new file mode 100644
index 00000000000..35369d729b4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/AttributesFormSection.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor.sections;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.IActionContributor;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.parts.AttributeFormPart;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+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.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributesFormSection extends ArtifactEditorFormSection {
+
+ private IActionContributor actionContributor;
+ private AttributeFormPart formPart;
+ private IToolBarManager toolBarManager;
+
+ public AttributesFormSection(ArtifactEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(editor, parent, toolkit, style);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(IManagedForm form) {
+ super.initialize(form);
+ Section section = getSection();
+ section.setText("Attributes");
+ section.setLayout(new GridLayout(1, false));
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+ addToolBar(form);
+ updateDataPart();
+ updateToolBarVisibility();
+ }
+
+ private IToolBarManager getToolBarManager() {
+ if (toolBarManager == null) {
+ toolBarManager = new ToolBarManager(SWT.FLAT);
+ }
+ return toolBarManager;
+ }
+
+ private void addToolBar(IManagedForm form) {
+ final FormToolkit toolkit = form.getToolkit();
+ Composite composite = toolkit.createComposite(getSection());
+ composite.setLayout(ALayout.getZeroMarginLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ composite.setBackground(getSection().getBackground());
+
+ IToolBarManager manager = getToolBarManager();
+ ((ToolBarManager) manager).createControl(composite);
+ getActionContributor().contributeToToolBar(manager);
+ manager.update(true);
+
+ getSection().setTextClient(composite);
+ }
+
+ private IActionContributor getActionContributor() {
+ if (actionContributor == null) {
+ actionContributor = new AttributeActionContribution(getEditor());
+ }
+ return actionContributor;
+ }
+
+ private void updateDataPart() {
+ final IManagedForm form = getManagedForm();
+ final FormToolkit toolkit = form.getToolkit();
+ final Section section = getSection();
+
+ if (formPart != null) {
+ form.removePart(formPart);
+ formPart.dispose();
+ Control control = section.getClient();
+ if (control != null && !control.isDisposed()) {
+ control.dispose();
+ }
+ }
+ Composite sectionBody = toolkit.createComposite(section, toolkit.getBorderStyle());
+ sectionBody.setLayout(ALayout.getZeroMarginLayout());
+ sectionBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ formPart = new AttributeFormPart(getEditor());
+ form.addPart(formPart);
+ formPart.createContents(sectionBody);
+ section.setClient(sectionBody);
+ toolkit.paintBordersFor(section);
+
+ section.layout(true);
+ form.getForm().getBody().layout(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ updateDataPart();
+ updateToolBarVisibility();
+ }
+
+ private void updateToolBarVisibility() {
+ boolean isReadOnly = !getEditorInput().isReadOnly();
+ getSection().getTextClient().setVisible(isReadOnly);
+ for (IContributionItem item : getToolBarManager().getItems()) {
+ item.setVisible(isReadOnly);
+ }
+ getToolBarManager().update(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ formPart.dispose();
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/DetailsFormSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/DetailsFormSection.java
new file mode 100644
index 00000000000..d76973f7c0b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/DetailsFormSection.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.framework.ui.skynet.artifact.editor.sections;
+
+import java.util.Date;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DetailsFormSection extends ArtifactEditorFormSection {
+
+ private FormText formText;
+
+ public DetailsFormSection(ArtifactEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(editor, parent, toolkit, style);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(IManagedForm form) {
+ super.initialize(form);
+ Section section = getSection();
+ section.setText("Details");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ updateText(true);
+ }
+
+ private void updateText(boolean isCreate) {
+ if (isCreate) {
+ final FormToolkit toolkit = getManagedForm().getToolkit();
+ Composite composite = toolkit.createComposite(getSection(), toolkit.getBorderStyle() | SWT.WRAP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ formText = toolkit.createFormText(composite, false);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.widthHint = 200;
+ formText.setLayoutData(gd);
+
+ getSection().setClient(composite);
+ toolkit.paintBordersFor(composite);
+ }
+
+ if (Widgets.isAccessible(formText)) {
+ try {
+ formText.setText(getDetailsText(getEditorInput().getArtifact()), true, true);
+ } catch (Exception ex) {
+ formText.setText(Lib.exceptionToString(ex), false, false);
+ }
+ getManagedForm().reflow(true);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (formText != null && !formText.isDisposed()) {
+ formText.dispose();
+ }
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ updateText(false);
+ }
+
+ private String getDetailsText(Artifact artifact) {
+ String template = "<p><b>%s:</b> %s</p>";
+ StringBuilder sb = new StringBuilder();
+ sb.append("<form>");
+
+ if (artifact != null) {
+ sb.append(String.format(template, "GUID", Xml.escape(artifact.getGuid())));
+ sb.append(String.format(template, "HRID", Xml.escape(artifact.getHumanReadableId())));
+ sb.append(String.format(template, "Branch", Xml.escape(artifact.getBranch().toString())));
+ sb.append(String.format(template, "Branch Id", artifact.getBranch().getBranchId()));
+ sb.append(String.format(template, "Artifact Id", artifact.getArtId()));
+ sb.append(String.format(template, "Artifact Type Name", Xml.escape(artifact.getArtifactTypeName())));
+ sb.append(String.format(template, "Artifact Type Id", artifact.getArtTypeId()));
+ sb.append(String.format(template, "Gamma Id", artifact.getGammaId()));
+ sb.append(String.format(template, "Historical", artifact.isHistorical()));
+ sb.append(String.format(template, "Deleted", artifact.isDeleted()));
+ sb.append(String.format(template, "Revision", artifact.getTransactionNumber()));
+ sb.append(String.format(template, "Read Only", artifact.isReadOnly()));
+ Date lastModified = null;
+ try {
+ lastModified = artifact.getLastModified();
+ } catch (Exception ex) {
+
+ }
+ sb.append(String.format(template, "Last Modified",
+ lastModified != null ? String.valueOf(lastModified) : "Error - unknown"));
+ User lastAuthor = null;
+ try {
+ lastAuthor = artifact.getLastModifiedBy();
+ } catch (Exception ex) {
+
+ }
+ sb.append(String.format(template, "Last Modified By", lastAuthor != null ? lastAuthor : "Error - unknown"));
+ } else {
+ sb.append(String.format(template, "Artifact", "null"));
+ }
+ sb.append("</form>");
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/RelationsFormSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/RelationsFormSection.java
new file mode 100644
index 00000000000..661c4d7c817
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/editor/sections/RelationsFormSection.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.artifact.editor.sections;
+
+import org.eclipse.osee.framework.ui.skynet.RelationsComposite;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.TreeEvent;
+import org.eclipse.swt.events.TreeListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RelationsFormSection extends ArtifactEditorFormSection {
+
+ private RelationsComposite relationComposite;
+
+ public RelationsFormSection(ArtifactEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(editor, parent, toolkit, style);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(IManagedForm form) {
+ super.initialize(form);
+ final FormToolkit toolkit = form.getToolkit();
+
+ Section section = getSection();
+ section.setText("Relations");
+
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Composite sectionBody = toolkit.createComposite(section, toolkit.getBorderStyle());
+ sectionBody.setLayout(ALayout.getZeroMarginLayout());
+ sectionBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ relationComposite =
+ new RelationsComposite(getEditor(), sectionBody, SWT.NONE, getEditor().getEditorInput().getArtifact());
+ relationComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ section.setClient(sectionBody);
+ toolkit.paintBordersFor(section);
+
+ relationComposite.getTreeViewer().getTree().addTreeListener(new TreeListener() {
+
+ @Override
+ public void treeCollapsed(TreeEvent e) {
+ getManagedForm().getForm().getBody().layout();
+ }
+
+ @Override
+ public void treeExpanded(TreeEvent e) {
+ getManagedForm().getForm().getBody().layout();
+ }
+ });
+ }
+
+ public RelationsComposite getRelationComposite() {
+ return relationComposite;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (relationComposite != null && !relationComposite.isDisposed()) {
+ relationComposite.refresh();
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (relationComposite != null && !relationComposite.isDisposed()) {
+ relationComposite.dispose();
+ }
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditor.java
new file mode 100644
index 00000000000..a3c9415b414
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditor.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.framework.ui.skynet.artifact.massEditor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+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.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MassArtifactEditor extends AbstractArtifactEditor implements IDirtiableEditor, IActionable {
+ public static final String EDITOR_ID = "org.eclipse.osee.framework.ui.skynet.massEditor.MassArtifactEditor";
+ private int artifactsPageIndex;
+ private Collection<? extends Artifact> artifacts = new HashSet<Artifact>();
+ private MassXViewer xViewer;
+ private Label branchLabel;
+
+ /**
+ * @return the xViewer
+ */
+ public MassXViewer getXViewer() {
+ return xViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ try {
+ Artifacts.persistInTransaction(artifacts);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ onDirtied();
+ }
+
+ public static void editArtifacts(final String name, final Collection<? extends Artifact> artifacts, TableLoadOption... tableLoadOptions) {
+ Set<TableLoadOption> options = new HashSet<TableLoadOption>();
+ options.addAll(Arrays.asList(tableLoadOptions));
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ boolean accessControlFilteredResults = false;
+ try {
+ Set<Artifact> accessibleArts = new HashSet<Artifact>();
+ for (Artifact artifact : artifacts) {
+ if (!AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO,
+ "The user " + UserManager.getUser() + " does not have read access to " + artifact);
+ accessControlFilteredResults = true;
+ } else
+ accessibleArts.add(artifact);
+ }
+ if (accessibleArts.size() == 0)
+ AWorkbench.popup("ERROR", "No Artifacts to edit");
+ else
+
+ AWorkbench.getActivePage().openEditor(
+ new MassArtifactEditorInput(name, accessibleArts, new MassXViewerFactory(accessibleArts)),
+ EDITOR_ID);
+ if (accessControlFilteredResults) AWorkbench.popup("ERROR",
+ "Some Artifacts not loaded due to access control limitations.");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }, options.contains(TableLoadOption.ForcePend));
+ }
+
+ public static void editArtifact(final Artifact artifact, TableLoadOption... tableLoadOptions) {
+ editArtifacts("", Arrays.asList(artifact));
+ }
+
+ public void createTaskActionBar(Composite parent) {
+
+ // Button composite for state transitions, etc
+ Composite bComp = new Composite(parent, SWT.NONE);
+ // bComp.setBackground(mainSComp.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ bComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite leftComp = new Composite(bComp, SWT.NONE);
+ leftComp.setLayout(new GridLayout());
+ leftComp.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
+
+ branchLabel = new Label(leftComp, SWT.NONE);
+ branchLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite rightComp = new Composite(bComp, SWT.NONE);
+ rightComp.setLayout(new GridLayout());
+ rightComp.setLayoutData(new GridData(GridData.END));
+
+ ToolBar toolBar = new ToolBar(rightComp, SWT.FLAT | SWT.RIGHT);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ toolBar.setLayoutData(gd);
+ ToolItem item = null;
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.refresh();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ OseeAts.addButtonToEditorToolBar(this, SkynetGuiPlugin.getInstance(), toolBar, EDITOR_ID, "Mass Artifact Editor");
+ }
+
+ public static void editArtifacts(final MassArtifactEditorInput input) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ page.openEditor(input, EDITOR_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ }
+
+ @Override
+ public boolean isSaveOnCloseNeeded() {
+ return isDirty();
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ for (Artifact taskArt : artifacts)
+ try {
+ if (taskArt != null && !taskArt.isDeleted() && taskArt.isDirty()) taskArt.reloadAttributesAndRelations();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public ArrayList<Artifact> getLoadedArtifacts() {
+ return xViewer.getLoadedArtifacts();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ for (Artifact taskArt : artifacts) {
+ if (!taskArt.isDeleted() && taskArt.isDirty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "MassArtifactEditor";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+
+ IEditorInput editorInput = getEditorInput();
+ if (editorInput instanceof MassArtifactEditorInput) {
+ MassArtifactEditorInput aei = (MassArtifactEditorInput) editorInput;
+ artifacts = (aei).getArtifacts();
+ } else
+ throw new IllegalArgumentException("Editor Input not TaskEditorInput");
+
+ if (((MassArtifactEditorInput) editorInput).getName().equals(""))
+ setPartName("Mass Artifact Editor");
+ else
+ setPartName(((MassArtifactEditorInput) editorInput).getName());
+
+ SkynetGuiPlugin.getInstance().setHelp(getContainer(), "mass_artifact_editor");
+
+ Composite comp = new Composite(getContainer(), SWT.NONE);
+ comp.setLayout(new GridLayout(1, true));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ createTaskActionBar(comp);
+
+ xViewer = new MassXViewer(comp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ xViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ xViewer.setContentProvider(new org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassContentProvider(
+ xViewer));
+ xViewer.setLabelProvider(new org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassLabelProvider(xViewer));
+ branchLabel.setText("Branch: " + (getBranch() == null ? "No Artifacts Returned" : getBranch().getBranchShortName()));
+ artifactsPageIndex = addPage(comp);
+ setPageText(artifactsPageIndex, "Artifacts");
+
+ Tree tree = xViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL | GridData.GRAB_HORIZONTAL);
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ setActivePage(artifactsPageIndex);
+ try {
+ xViewer.set(((MassArtifactEditorInput) editorInput).getArtifacts());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Branch getBranch() {
+ if (((MassArtifactEditorInput) getEditorInput()).getArtifacts().size() == 0) return null;
+ return ((MassArtifactEditorInput) getEditorInput()).getArtifacts().iterator().next().getBranch();
+ }
+
+ @Override
+ public void onDirtied() {
+ Displays.ensureInDisplayThread(new Runnable() {
+
+ public void run() {
+ firePropertyChange(PROP_DIRTY);
+ }
+ });
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.util.widgets.task.IXTaskViewer#getCurrentStateName()
+ */
+ public String getCurrentStateName() {
+ return "";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.util.widgets.task.IXTaskViewer#getEditor()
+ */
+ public IDirtiableEditor getEditor() {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.ats.util.widgets.task.IXTaskViewer#isTasksEditable()
+ */
+ public boolean isArtifactsEditable() {
+ return true;
+ }
+
+ /**
+ * @return the artifacts
+ */
+ public Collection<? extends Artifact> getArtifacts() {
+ return artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ public String getActionDescription() {
+ return "";
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditorInput.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditorInput.java
new file mode 100644
index 00000000000..fe7f7564949
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassArtifactEditorInput.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.framework.ui.skynet.artifact.massEditor;
+
+import java.util.Collection;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MassArtifactEditorInput implements IEditorInput {
+
+ private final Collection<? extends Artifact> artifacts;
+ private final String name;
+ private final SkynetXViewerFactory skynetXViewerFactory;
+
+ /**
+ * @return the skynetXViewerFactory
+ */
+ public SkynetXViewerFactory getXViewerFactory() {
+ return skynetXViewerFactory;
+ }
+
+ /**
+ * @param artifact
+ */
+ public MassArtifactEditorInput(String name, Collection<? extends Artifact> artifacts, SkynetXViewerFactory skynetXViewerFactory) {
+ this.name = name;
+ this.artifacts = artifacts;
+ this.skynetXViewerFactory = skynetXViewerFactory;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditorInput#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ return false;
+ }
+
+ /**
+ * @return the taskArts
+ */
+ public Collection<? extends Artifact> getArtifacts() {
+ return artifacts;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassContentProvider.java
new file mode 100644
index 00000000000..bfbfb7cb9eb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassContentProvider.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.framework.ui.skynet.artifact.massEditor;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+
+public class MassContentProvider implements ITreeContentProvider {
+ protected Collection<Artifact> rootSet = new HashSet<Artifact>();
+ private final MassXViewer xViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public MassContentProvider(MassXViewer xViewer) {
+ super();
+ this.xViewer = xViewer;
+ }
+
+ public void add(final Artifact item) {
+ add(Arrays.asList(item));
+ }
+
+ public void add(final Collection<? extends Artifact> items) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.addAll(items);
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void set(final Collection<? extends Artifact> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ clear();
+ add(arts);
+ };
+ });
+ }
+
+ public void updateAll(final Collection<? extends Object> arts) {
+ if (arts.size() == 0) return;
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ for (Object art : arts) {
+ xViewer.update(art, null);
+ }
+ };
+ });
+ }
+
+ public void remove(final Artifact art) {
+ removeAll(Arrays.asList(art));
+ }
+
+ public void removeAll(final Collection<? extends Artifact> arts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.remove(arts);
+ xViewer.refresh();
+ };
+ });
+ }
+
+ public void clear() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (xViewer.getInput() == null) xViewer.setInput(rootSet);
+ rootSet.clear();
+ xViewer.refresh();
+ };
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof Collection) return true;
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassLabelProvider.java
new file mode 100644
index 00000000000..a0e8218dd7b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassLabelProvider.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.framework.ui.skynet.artifact.massEditor;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+public class MassLabelProvider extends XViewerLabelProvider {
+
+ private final MassXViewer xViewer;
+
+ public MassLabelProvider(MassXViewer xViewer) {
+ super(xViewer);
+ this.xViewer = xViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn col, int columnIndex) throws XViewerException {
+ if (col == null) return null;
+ if (columnIndex != 0 && col instanceof XViewerValueColumn) {
+ return ((XViewerValueColumn) col).getColumnImage(element, col, columnIndex);
+ }
+ Artifact artifact = (Artifact) element;
+ if (artifact == null || artifact.isDeleted()) return null;
+ if (columnIndex == 0) return ImageManager.getImage(artifact);
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn col, int columnIndex) throws XViewerException {
+ try {
+ if (col == null) return "";
+ if (col instanceof XViewerValueColumn) {
+ return ((XViewerValueColumn) col).getColumnText(element, col, columnIndex);
+ }
+ if (element instanceof String) {
+ if (columnIndex == 1)
+ return (String) element;
+ else
+ return "";
+ }
+ Artifact artifact = (Artifact) element;
+ if (artifact == null || artifact.isDeleted()) return "";
+ // Handle case where columns haven't been loaded yet
+ if (columnIndex > (getTreeViewer().getTree().getColumns().length - 1)) {
+ return "";
+ }
+
+ String colName = col.getName();
+ if (!artifact.isAttributeTypeValid(colName)) {
+ return "";
+ }
+ if (AttributeTypeManager.getType(colName).getBaseAttributeClass().equals(DateAttribute.class)) {
+ try {
+ return DateAttribute.MMDDYYHHMM.format(artifact.getSoleAttributeValue(colName));
+ } catch (OseeCoreException ex) {
+ return "";
+ }
+ }
+
+ return artifact.getAttributesToString(colName);
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public MassXViewer getTreeViewer() {
+ return xViewer;
+ }
+
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewer.java
new file mode 100644
index 00000000000..5c475578896
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewer.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.framework.ui.skynet.artifact.massEditor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsChangeTypeEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MassXViewer extends XViewer implements IFrameworkTransactionEventListener, IArtifactsPurgedEventListener, IArtifactsChangeTypeEventListener {
+
+ private String title;
+ private final Set<Artifact> artifacts = new HashSet<Artifact>(50);
+ private final IDirtiableEditor editor;
+ private final List<String> EXTRA_COLUMNS = Arrays.asList(new String[] {"GUID", "HRID", "Artifact Type"});
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public MassXViewer(Composite parent, int style, MassArtifactEditor editor) {
+ super(parent, style, ((MassArtifactEditorInput) editor.getEditorInput()).getXViewerFactory());
+ this.editor = editor;
+ OseeEventManager.addListener(this);
+ }
+
+ @Override
+ public void handleColumnMultiEdit(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ String colName = treeColumn.getText();
+ Set<Artifact> useArts = new HashSet<Artifact>();
+ for (TreeItem item : treeItems) {
+ useArts.add((Artifact) item.getData());
+ }
+ if (ArtifactPromptChange.promptChangeAttribute(colName, colName, useArts, false)) {
+ refresh();
+ editor.onDirtied();
+ }
+ }
+
+ @Override
+ public boolean isColumnMultiEditable(TreeColumn treeColumn, Collection<TreeItem> treeItems) {
+ if (EXTRA_COLUMNS.contains(treeColumn.getText())) return false;
+ return super.isColumnMultiEditable(treeColumn, treeItems);
+ }
+
+ @Override
+ public boolean isColumnMultiEditEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ return handleAltLeftClick(treeColumn, treeItem, false);
+ }
+
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem, boolean persist) {
+ super.handleAltLeftClick(treeColumn, treeItem);
+ // System.out.println("Column " + treeColumn.getText() + " item " +
+ // treeItem);
+ String colName = treeColumn.getText();
+ if (EXTRA_COLUMNS.contains(colName)) {
+ AWorkbench.popup("ERROR", "Can't change the field " + colName);
+ }
+ Artifact useArt = ((Artifact) treeItem.getData());
+ if (ArtifactPromptChange.promptChangeAttribute(colName, colName, Arrays.asList(useArt), persist)) {
+ refresh();
+ editor.onDirtied();
+ return true;
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#createSupportWidgets(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ setupDragAndDropSupport();
+ }
+
+ private void setupDragAndDropSupport() {
+
+ // Do not allow drag if artifacts in this table are not on same branch as default branch
+ DragSource source = new DragSource(getTree(), DND.DROP_COPY);
+ source.setTransfer(new Transfer[] {ArtifactTransfer.getInstance()});
+ source.addDragListener(new DragSourceListener() {
+
+ public void dragFinished(DragSourceEvent event) {
+ refresh();
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ Collection<Artifact> arts = getSelectedArtifacts();
+ if (arts.size() > 0) {
+// Artifact artifact = arts.iterator().next();
+// if (artifact.getBranch() == BranchManager.getDefaultBranch())
+ event.data = new ArtifactData(arts.toArray(new Artifact[arts.size()]), "", MassArtifactEditor.EDITOR_ID);
+
+ }
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ event.doit = false;
+ Collection<Artifact> arts = getSelectedArtifacts();
+ if (arts.size() > 0) {
+// Artifact artifact = arts.iterator().next();
+// if (artifact.getBranch() == BranchManager.getDefaultBranch())
+ event.doit = true;
+ }
+ }
+ });
+
+ // Do not allow drop if default branch is not same as artifacts that reside in this table
+ DropTarget target = new DropTarget(getTree(), DND.DROP_COPY);
+ target.setTransfer(new Transfer[] {FileTransfer.getInstance(), TextTransfer.getInstance(),
+ ArtifactTransfer.getInstance()});
+ target.addDropListener(new DropTargetAdapter() {
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ performDrop(event);
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ // if ((event.data instanceof ArtifactData) && ((ArtifactData)
+ // event.data).getArtifacts().length > 0)
+ event.detail = DND.DROP_COPY;
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ }
+ });
+ }
+
+ private void performDrop(DropTargetEvent e) {
+ try {
+ if (e.data instanceof ArtifactData) {
+ Artifact[] artsToAdd = ((ArtifactData) e.data).getArtifacts();
+ Set<Artifact> arts = new HashSet<Artifact>();
+ arts.addAll(artifacts);
+ for (Artifact art : artsToAdd)
+ arts.add(art);
+ set(arts);
+ }
+ refresh();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ @Override
+ public void handleDoubleClick() {
+ if (getSelectedArtifacts().size() == 0) return;
+ Artifact art = getSelectedArtifacts().iterator().next();
+ RendererManager.openInJob(art, PresentationType.GENERALIZED_EDIT);
+ }
+
+ public ArrayList<Artifact> getLoadedArtifacts() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ TreeItem items[] = getTree().getItems();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((Artifact) item.getData());
+ return arts;
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ // Tell the label provider to release its resources
+ getLabelProvider().dispose();
+ }
+
+ public ArrayList<Artifact> getSelectedArtifacts() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((Artifact) item.getData());
+ return arts;
+ }
+
+ /**
+ * @return Returns the title.
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ public void add(Collection<? extends Artifact> artifacts) {
+ if (xViewerFactory instanceof MassXViewerFactory) {
+ ((MassXViewerFactory) xViewerFactory).registerAllAttributeColumnsForArtifacts(artifacts, true);
+ }
+ for (Artifact art : artifacts) {
+ this.artifacts.add(art);
+ }
+ ((MassContentProvider) getContentProvider()).add(artifacts);
+ }
+
+ public void set(Collection<? extends Artifact> artifacts) {
+ if (xViewerFactory instanceof MassXViewerFactory) {
+ ((MassXViewerFactory) xViewerFactory).registerAllAttributeColumnsForArtifacts(artifacts, true);
+ }
+ this.artifacts.clear();
+ for (Artifact art : artifacts) {
+ this.artifacts.add(art);
+ }
+ ((MassContentProvider) getContentProvider()).set(artifacts);
+ }
+
+ /**
+ * @return the artifacts
+ */
+ public Collection<? extends Artifact> getArtifacts() {
+ return artifacts;
+ }
+
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (getTree() == null || getTree().isDisposed()) {
+ dispose();
+ return;
+ }
+ if (transData.cacheDeletedArtifacts.size() > 0) {
+ ((MassContentProvider) getContentProvider()).removeAll(transData.cacheDeletedArtifacts);
+ }
+ if (transData.cacheChangedArtifacts.size() > 0) {
+ ((MassContentProvider) getContentProvider()).updateAll(transData.cacheChangedArtifacts);
+ }
+ refresh(transData.cacheRelationAddedArtifacts);
+ refresh(transData.cacheRelationChangedArtifacts);
+ refresh(transData.cacheRelationDeletedArtifacts);
+ }
+ });
+ }
+
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, final LoadedArtifacts loadedArtifacts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ if (getTree() != null && !getTree().isDisposed()) {
+ remove(loadedArtifacts.getLoadedArtifacts().toArray());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void handleArtifactsChangeTypeEvent(Sender sender, int toArtifactTypeId, final LoadedArtifacts loadedArtifacts) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ remove(loadedArtifacts.getLoadedArtifacts().toArray());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewerFactory.java
new file mode 100644
index 00000000000..bb7cd909f74
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/massEditor/MassXViewerFactory.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.framework.ui.skynet.artifact.massEditor;
+
+import java.util.Collection;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactNameColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactTypeColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerGuidColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerHridColumn;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MassXViewerFactory extends SkynetXViewerFactory {
+
+ private static String NAMESPACE = "org.eclipse.osee.framework.ui.skynet.massEditor.ArtifactXViewer";
+ private static XViewerArtifactNameColumn nameCol = new XViewerArtifactNameColumn("Name");
+
+ public MassXViewerFactory(Collection<? extends Artifact> artifacts) {
+ super(NAMESPACE);
+ registerColumn(nameCol);
+ registerAllAttributeColumnsForArtifacts(artifacts, true);
+ registerColumn(new XViewerHridColumn("ID"));
+ registerColumn(new XViewerGuidColumn("GUID"));
+ registerColumn(new XViewerArtifactTypeColumn("Artifact Type"));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerFactory#getDefaultTableCustomizeData()
+ */
+ @Override
+ public CustomizeData getDefaultTableCustomizeData() {
+ CustomizeData custData = new CustomizeData();
+ custData.getSortingData().setSortingNames(nameCol.getId());
+ custData.getColumnData().setColumns(getColumns());
+ custData.setNameSpace(getNamespace());
+ custData.setName("Artifacts");
+ return custData;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/AtsOpenOption.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/AtsOpenOption.java
new file mode 100644
index 00000000000..57d34647dc2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/AtsOpenOption.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.framework.ui.skynet.ats;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum AtsOpenOption {
+ OpenAll, // Open all teams
+ OpenOneOrPopupSelect, // Popup selection dialog if more than one team
+ AtsWorld
+ // populate
+
+};
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IActionable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IActionable.java
new file mode 100644
index 00000000000..4f47a366844
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IActionable.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.framework.ui.skynet.ats;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IActionable {
+
+ /**
+ * Provide description over and above the viewpart name and version to be used by ATS
+ *
+ * @return description
+ */
+ public String getActionDescription();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IAtsLib.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IAtsLib.java
new file mode 100644
index 00000000000..7a7cf36c72d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/IAtsLib.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.framework.ui.skynet.ats;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAtsLib {
+
+ public void openATSAction(final Artifact art, final AtsOpenOption option);
+
+ public void createATSAction(String initialDescription, String actionableItem);
+
+ public void openArtifact(String guid, OseeAts.OpenView view);
+
+ public void openArtifact(String guidOrHrid, Integer branchId, OseeAts.OpenView view);
+
+ public void openInAtsWorldEditor(String name, Collection<Artifact> artifacts) throws OseeCoreException;
+
+ public void openInAtsTaskEditor(String name, Collection<Artifact> artifacts) throws OseeCoreException;
+
+ public boolean isAtsAdmin();
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/NoteType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/NoteType.java
new file mode 100644
index 00000000000..9066cc428de
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/NoteType.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.framework.ui.skynet.ats;
+
+import java.util.ArrayList;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum NoteType {
+ Comment, Question, Error, Other;
+
+ public static NoteType getType(String type) {
+ for (NoteType e : NoteType.values()) {
+ if (e.name().equals(type)) {
+ return e;
+ }
+ }
+ throw new IllegalArgumentException("Unhandled NoteType");
+ }
+
+ public static ArrayList<String> getNames() {
+ ArrayList<String> names = new ArrayList<String>();
+ for (NoteType e : NoteType.values()) {
+ names.add(e.name());
+ }
+ return names;
+ }
+
+};
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/OseeAts.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/OseeAts.java
new file mode 100644
index 00000000000..d51cae06da8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/ats/OseeAts.java
@@ -0,0 +1,293 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.ats;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.ViewPart;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+public class OseeAts {
+ public static enum OpenView {
+ ActionEditor, ArtifactEditor, ArtifactHyperViewer
+ };
+ private static IAtsLib atsLib;
+ private static String BUG_TITLE = "Generate Action Against This Tool";
+
+ public OseeAts() {
+ super();
+ }
+
+ public static boolean isAtsAdmin() {
+ try {
+ if (getAtsLib() != null) {
+ return getAtsLib().isAtsAdmin();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return false;
+ }
+
+ public static void addButtonToEditorToolBar(final MultiPageEditorPart editorPart, IActionable actionableObject, final OseeUiActivator oseePlugin, IToolBarManager toolBar, final String editorId, final String actionableItem) {
+
+ Action bugAction = new Action(BUG_TITLE, Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ String version = (String) oseePlugin.getBundle().getHeaders().get("Bundle-Version");
+ String desc = String.format("Found in \"%s\" version %s.", editorId, version);
+ if (editorPart instanceof IActionable) {
+ String moreDesc = ((IActionable) editorPart).getActionDescription();
+ if (moreDesc != null && !moreDesc.equals("")) {
+ desc += "\n" + moreDesc;
+ }
+ }
+ createActionViaBug(desc, actionableItem);
+ }
+ };
+ bugAction.setToolTipText(BUG_TITLE);
+ bugAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BUG));
+ toolBar.add(bugAction);
+ }
+
+ public static void addButtonToEditorToolBar(IActionable actionableObject, final OseeUiActivator oseePlugin, ToolBar toolBar, final String editorId, String actionableItem) {
+ addButtonToEditorToolBar(actionableObject, oseePlugin, toolBar, null, editorId, actionableItem);
+ }
+
+ public static void addButtonToEditorToolBar(IActionable actionableObject, final OseeUiActivator oseePlugin, Composite comp, final String editorId, String actionableItem) {
+ addButtonToEditorToolBar(actionableObject, oseePlugin, null, comp, editorId, actionableItem);
+ }
+
+ private static void addButtonToEditorToolBar(final IActionable actionableObject, final OseeUiActivator oseePlugin, ToolBar toolBar, Composite comp, final String editorId, final String aspect) {
+ if (actionableObject == null) {
+ throw new IllegalArgumentException(String.format("actionableObject can not be null"));
+ }
+ if (editorId == null || editorId.equals("")) {
+ throw new IllegalArgumentException(String.format("editorId can not be null or empty"));
+ }
+ if (aspect == null) {
+ throw new IllegalArgumentException(String.format("aspect can not be null"));
+ }
+
+ if (toolBar != null) {
+ ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.BUG));
+ item.setToolTipText(BUG_TITLE);
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String version = (String) oseePlugin.getBundle().getHeaders().get("Bundle-Version");
+ String desc = String.format("\n\nItem: %s\nVersion: %s", editorId, version);
+ if (actionableObject != null) {
+ String moreDesc = actionableObject.getActionDescription();
+ if (moreDesc != null && !moreDesc.equals("")) {
+ desc += "\n" + moreDesc;
+ }
+ }
+ createActionViaBug(desc, aspect);
+ }
+ });
+ } else if (comp != null) {
+ Button bugButton = new Button(comp, SWT.PUSH);
+ bugButton.setToolTipText(BUG_TITLE);
+ bugButton.setImage(ImageManager.getImage(FrameworkImage.BUG));
+ bugButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ String version = (String) oseePlugin.getBundle().getHeaders().get("Bundle-Version");
+ String desc = String.format("\n\nItem: %s\nVersion: %s", editorId, version);
+ if (actionableObject != null) {
+ String moreDesc = actionableObject.getActionDescription();
+ if (moreDesc != null && !moreDesc.equals("")) {
+ desc += "\n" + moreDesc;
+ }
+ }
+ createActionViaBug(desc, aspect);
+ }
+
+ });
+ } else {
+ throw new IllegalArgumentException("Can't determine bug target.");
+ }
+ }
+
+ /**
+ * Uses the ActionJob extension point to kickoff ATS code to create and open the action
+ *
+ * @param version
+ * @param desc
+ */
+ private static void createActionViaBug(String desc, String actionableItem) {
+ try {
+ getAtsLib().createATSAction(desc, actionableItem);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * @param viewPart
+ * @param actionableObject
+ * @param oseePlugin
+ * @param viewId
+ * @param actionableItem match the name of one of the configured Actionable Items in ATS
+ */
+ public static void addBugToViewToolbar(final ViewPart viewPart, final IActionable actionableObject, final OseeUiActivator oseePlugin, final String viewId, final String actionableItem) {
+ if (viewId == null || viewId.equals("")) {
+ throw new IllegalArgumentException(String.format("viewId can not be null or empty"));
+ }
+ if (actionableItem == null) {
+ throw new IllegalArgumentException("Aspect can not be null.");
+ }
+ Action bugAction = new Action("Generate Action Against This View") {
+ @Override
+ public void run() {
+ String version = (String) oseePlugin.getBundle().getHeaders().get("Bundle-Version");
+ String desc = String.format("\n\nItem: %s\nVersion: %s", viewId, version);
+ String moreDesc = actionableObject.getActionDescription();
+ if (!moreDesc.equals("")) {
+ desc += "\n" + moreDesc;
+ }
+ createActionViaBug(desc, actionableItem);
+ }
+ };
+ bugAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BUG));
+ bugAction.setToolTipText("Generate Action Against This View");
+
+ IToolBarManager toolbarManager = viewPart.getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(bugAction);
+ }
+
+ public static void openATSArtifact(String guid) {
+ try {
+ Artifact art = ArtifactQuery.getArtifactFromId(guid, BranchManager.getCommonBranch());
+ if (art.getArtifactTypeName().equals("Action")) {
+ atsLib.openATSAction(art, AtsOpenOption.OpenOneOrPopupSelect);
+ } else {
+ AWorkbench.popup("ERROR", "Trying to open " + art.getArtifactTypeName() + " with SMAEditor");
+ }
+ } catch (Exception ex) {
+ AWorkbench.popup("ERROR", ex.getLocalizedMessage());
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static void openATSArtifact(Artifact art) {
+ if (art instanceof IATSArtifact) {
+ try {
+ getAtsLib().openATSAction(art, AtsOpenOption.OpenOneOrPopupSelect);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ AWorkbench.popup("ERROR", ex.getLocalizedMessage());
+ }
+ } else {
+ AWorkbench.popup("ERROR", "Trying to open " + art.getArtifactTypeName() + " with SMAEditor");
+ }
+ }
+
+ public static IAtsLib getAtsLib() throws OseeWrappedException {
+ try {
+ if (Platform.getExtensionRegistry() == null) {
+ return null;
+ }
+ if (atsLib == null) {
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.skynet.core.AtsLib");
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("AtsLib")) {
+ String className = el.getAttribute("classname");
+ String bundleName = el.getContributor().getName();
+ if (className != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> interfaceClass = bundle.loadClass(className);
+ atsLib = (IAtsLib) interfaceClass.getConstructor().newInstance();
+ }
+ }
+ }
+ }
+ }
+ return atsLib;
+ } catch (Exception e) {
+ throw new OseeWrappedException(e);
+ }
+ }
+
+ public static Action createBugAction(OseeUiActivator oseePlugin, IAdaptable target, String itemId, String actionableItem) {
+ return new BugAction(oseePlugin, target, itemId, actionableItem);
+ }
+
+ private static final class BugAction extends Action {
+ private static String BUG_TITLE = "Generate Action Against This Tool";
+ private final OseeUiActivator oseePlugin;
+ private final String itemId;
+ private final IAdaptable target;
+ private final String actionableItem;
+
+ public BugAction(OseeUiActivator oseePlugin, IAdaptable target, String itemId, String actionableItem) {
+ super(BUG_TITLE, Action.AS_PUSH_BUTTON);
+ this.oseePlugin = oseePlugin;
+ this.itemId = itemId;
+ this.target = target;
+ this.actionableItem = actionableItem;
+ setToolTipText(BUG_TITLE);
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.BUG));
+ }
+
+ @Override
+ public void run() {
+ Version version =
+ new Version(
+ (String) oseePlugin.getBundle().getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION));
+ String desc = String.format("Found in \"%s\" version %s.", itemId, version);
+ IActionable actionable = (IActionable) target.getAdapter(IActionable.class);
+ if (actionable != null) {
+ String moreDesc = actionable.getActionDescription();
+ if (moreDesc != null && !moreDesc.equals("")) {
+ desc += "\n" + moreDesc;
+ }
+ }
+ createActionViaBug(desc, actionableItem);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamContributionManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamContributionManager.java
new file mode 100644
index 00000000000..7a35de5c5df
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamContributionManager.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.framework.ui.skynet.blam;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemBlam;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class BlamContributionManager {
+
+ private BlamContributionManager() {
+ }
+
+ public static Collection<BlamOperation> getBlamOperationsNameSort() {
+ ArrayList<BlamOperation> blamsSortedByName = new ArrayList<BlamOperation>();
+ Map<String, BlamOperation> blamMap = new HashMap<String, BlamOperation>();
+ for (BlamOperation blam : getBlamOperations()) {
+ blamMap.put(blam.getName(), blam);
+ }
+ String names[] = blamMap.keySet().toArray(new String[blamMap.keySet().size()]);
+ Arrays.sort(names);
+ for (String name : names) {
+ blamsSortedByName.add(blamMap.get(name));
+ }
+ return blamsSortedByName;
+ }
+
+ public static Collection<BlamOperation> getBlamOperations() {
+ ExtensionDefinedObjects<BlamOperation> definedObjects =
+ new ExtensionDefinedObjects<BlamOperation>("org.eclipse.osee.framework.ui.skynet.BlamOperation",
+ "Operation", "className");
+ return definedObjects.getObjects();
+ }
+
+ public static void addBlamOperationsToNavigator(List<XNavigateItem> items) throws OseeCoreException {
+ Map<String, XNavigateItem> nameToParent = new HashMap<String, XNavigateItem>();
+ XNavigateItem blamOperationItems = new XNavigateItem(null, "Blam Operations", FrameworkImage.BLAM);
+ for (BlamOperation blamOperation : BlamContributionManager.getBlamOperationsNameSort()) {
+
+ // Create categories first (so can have them up top)
+ for (String category : blamOperation.getCategories()) {
+ if (AccessControlManager.isOseeAdmin() || !category.contains("Admin") || category.contains("Admin") && AccessControlManager.isOseeAdmin()) {
+ createCategories(category.split("\\."), 0, blamOperationItems, nameToParent);
+ }
+ }
+ }
+ // Add blams to categories
+ for (BlamOperation blamOperation : BlamContributionManager.getBlamOperationsNameSort()) {
+ // If categories not specified, add to top level
+ if (blamOperation.getCategories().size() == 0) {
+ new XNavigateItemBlam(blamOperationItems, blamOperation);
+ }
+ for (String category : blamOperation.getCategories()) {
+ // Category will be null if admin category and not admin
+ if (nameToParent.get(category) != null) {
+ new XNavigateItemBlam(nameToParent.get(category), blamOperation);
+ }
+ }
+ }
+ items.add(blamOperationItems);
+ }
+
+ private static void createCategories(String[] categoryElements, int index, XNavigateItem parentItem, Map<String, XNavigateItem> nameToParent) throws OseeCoreException {
+ String firstElement = categoryElements[index];
+ XNavigateItem thisCategoryItem = null;
+ for (XNavigateItem childItem : parentItem.getChildren()) {
+ if (childItem.getName().equals(firstElement)) {
+ thisCategoryItem = childItem;
+ break;
+ }
+ }
+ // Create new folder category
+ if (thisCategoryItem == null) {
+ // Add to parentItem
+ thisCategoryItem = new XNavigateItem(parentItem, firstElement, FrameworkImage.FOLDER);
+ String catName = "";
+ for (int x = 0; x <= index; x++) {
+ if (!catName.equals("")) {
+ catName += ".";
+ }
+ catName += categoryElements[x];
+ }
+ // Add to lookup map
+ nameToParent.put(catName, thisCategoryItem);
+ }
+ // Process children categories
+ if (categoryElements.length > index + 1) {
+ createCategories(categoryElements, index + 1, thisCategoryItem, nameToParent);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditor.java
new file mode 100644
index 00000000000..cbb65345420
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditor.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.skynet.blam;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.osee.framework.core.operation.IOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BlamEditor extends AbstractArtifactEditor {
+ public static final String EDITOR_ID = "org.eclipse.osee.framework.ui.skynet.blam.BlamEditor";
+
+ private BlamEditorActionBarContributor actionBarContributor;
+ private BlamOverviewPage overviewPage;
+
+ public BlamEditor() {
+ super();
+ }
+
+ public BlamEditorActionBarContributor getActionBarContributor() {
+ if (actionBarContributor == null) {
+ actionBarContributor = new BlamEditorActionBarContributor(this);
+ }
+ return actionBarContributor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#getEditorInput()
+ */
+ @Override
+ public BlamEditorInput getEditorInput() {
+ return (BlamEditorInput) super.getEditorInput();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
+ */
+ @Override
+ public void showBusy(boolean busy) {
+ super.showBusy(busy);
+ if (overviewPage != null) {
+ overviewPage.showBusy(busy);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+ OseeContributionItem.addTo(this, true);
+ setPartName(getEditorInput().getName());
+ setTitleImage(getEditorInput().getImage());
+ try {
+ overviewPage = new BlamOverviewPage(this);
+ addPage(overviewPage);
+ addPage(new WorkflowDataPage(this, overviewPage));
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.MultiPageEditorPart#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == IActionable.class) {
+ return new IActionable() {
+ @Override
+ public String getActionDescription() {
+ return "";
+ }
+ };
+ }
+ return super.getAdapter(adapter);
+ }
+
+ private VariableMap getBlamVariableMap() {
+ return overviewPage.getInput();
+ }
+
+ public void executeBlam() {
+ try {
+ final List<BlamOperation> operations = new ArrayList<BlamOperation>();
+ operations.addAll(getEditorInput().getArtifact().getOperations());
+ IOperation blamOperation =
+ new ExecuteBlamOperation(getPartName(), overviewPage.getOutput(), getBlamVariableMap(), operations);
+ Operations.executeAsJob(blamOperation, true, Job.LONG, new BlamEditorExecutionAdapter());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public static void edit(BlamWorkflow blamWorkflow) {
+ BlamEditor.edit(new BlamEditorInput(blamWorkflow));
+ }
+
+ public static void edit(final BlamEditorInput blamEditorInput) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ AWorkbench.getActivePage().openEditor(blamEditorInput, EDITOR_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ public static void edit(BlamOperation blamOperation) throws OseeCoreException {
+ BlamEditor.edit(new BlamEditorInput(blamOperation));
+ }
+
+ private final class BlamEditorExecutionAdapter extends JobChangeAdapter {
+ private long startTime = 0;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+ */
+ @Override
+ public void scheduled(IJobChangeEvent event) {
+ super.scheduled(event);
+ getActionBarContributor().getExecuteBlamAction().setEnabled(false);
+ showBusy(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+ */
+ @Override
+ public void aboutToRun(IJobChangeEvent event) {
+ super.aboutToRun(event);
+ startTime = System.currentTimeMillis();
+ overviewPage.setOuputText(String.format("Starting BLAM at [%s]\n", Lib.getElapseString(startTime)));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+ */
+ @Override
+ public void done(IJobChangeEvent event) {
+ super.done(event);
+ overviewPage.appendOutput(String.format("BLAM completed in [%s]\n", Lib.getElapseString(startTime)));
+ showBusy(false);
+ getActionBarContributor().getExecuteBlamAction().setEnabled(true);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorActionBarContributor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorActionBarContributor.java
new file mode 100644
index 00000000000..e709bf2fe40
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorActionBarContributor.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.framework.ui.skynet.blam;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.IActionContributor;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.ui.IEditorSite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BlamEditorActionBarContributor implements IActionContributor {
+
+ private final BlamEditor editor;
+ private Action executeBlamAction;
+ private Action bugAction;
+
+ public BlamEditorActionBarContributor(BlamEditor editor) {
+ this.editor = editor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.IActionContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
+ */
+ @Override
+ public void contributeToToolBar(IToolBarManager manager) {
+ manager.add(getExecuteBlamAction());
+ manager.add(getAtsBugAction());
+ }
+
+ // OseeAts.addButtonToEditorToolBar(editor, this, SkynetGuiPlugin.getInstance(), form.getToolBarManager(),
+ // BlamEditor.EDITOR_ID, "BLAM Editor");
+ public final Action getAtsBugAction() {
+ if (bugAction == null) {
+ IEditorSite site = editor.getEditorSite();
+ bugAction =
+ OseeAts.createBugAction(SkynetGuiPlugin.getInstance(), editor, site.getId(), site.getRegisteredName());
+ }
+ return bugAction;
+ }
+
+ public final Action getExecuteBlamAction() {
+ if (executeBlamAction == null) {
+ executeBlamAction = new ExecuteBlamAction();
+ }
+ return executeBlamAction;
+ }
+
+ private final class ExecuteBlamAction extends Action {
+ public ExecuteBlamAction() {
+ super("Run BLAM in Job", Action.AS_PUSH_BUTTON);
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.RUN_EXC));
+ setToolTipText("Executes the BLAM Operation");
+ }
+
+ @Override
+ public void run() {
+ try {
+ editor.executeBlam();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorInput.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorInput.java
new file mode 100644
index 00000000000..9359e513aa1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamEditorInput.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.framework.ui.skynet.blam;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class BlamEditorInput extends BaseArtifactEditorInput {
+
+ public BlamEditorInput(BlamOperation blamOperation) throws OseeCoreException {
+ this(BlamWorkflow.getOrCreateBlamWorkflow(blamOperation));
+ }
+
+ public BlamEditorInput(Artifact artifact) {
+ super(artifact);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof BlamEditorInput) {
+ return super.equals(obj);
+ }
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ if (getArtifact() == null) {
+ return "No Artifact Input Provided";
+ }
+ return getArtifact().getDescriptiveName() + " BLAM";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput#getImage()
+ */
+ @Override
+ public Image getImage() {
+ return ImageManager.getImage(FrameworkImage.BLAM);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput#getImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor getImageDescriptor() {
+ return ImageManager.getImageDescriptor(FrameworkImage.BLAM);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (Artifact.class.equals(adapter) || BlamWorkflow.class.equals(adapter)) {
+ return getArtifact();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.BaseArtifactEditorInput#getArtifact()
+ */
+ @Override
+ public BlamWorkflow getArtifact() {
+ return (BlamWorkflow) super.getArtifact();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamOverviewPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamOverviewPage.java
new file mode 100644
index 00000000000..0528e1f826a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamOverviewPage.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.framework.ui.skynet.blam;
+
+import java.util.Collection;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.osee.framework.ui.skynet.IHelpContextIds;
+import org.eclipse.osee.framework.ui.skynet.blam.sections.BlamInputSection;
+import org.eclipse.osee.framework.ui.skynet.blam.sections.BlamOutputSection;
+import org.eclipse.osee.framework.ui.skynet.blam.sections.BlamUsageSection;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BlamOverviewPage extends FormPage {
+
+ private BlamOutputSection outputSection;
+ private BlamInputSection inputSection;
+
+ public BlamOverviewPage(BlamEditor editor) {
+ super(editor, "overview", "BLAM Workflow");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
+ */
+ @Override
+ public void showBusy(boolean busy) {
+ super.showBusy(busy);
+ if (Widgets.isAccessible(getManagedForm().getForm())) {
+ getManagedForm().getForm().getForm().setBusy(busy);
+ }
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+
+ final ScrolledForm form = managedForm.getForm();
+ final FormToolkit toolkit = managedForm.getToolkit();
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.marginHeight = 10;
+ layout.marginWidth = 6;
+ layout.horizontalSpacing = 20;
+ form.getBody().setLayout(layout);
+ form.getBody().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
+
+ updateTitle(form);
+ updateImage(form);
+ addToolBar(toolkit, form, true);
+ managedForm.getMessageManager().setAutoUpdate(false);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(form.getBody(), IHelpContextIds.MAIN_WORKFLOW_PAGE);
+
+ int sectionStyle = Section.TITLE_BAR | Section.EXPANDED | Section.TWISTIE;
+
+ managedForm.addPart(new BlamUsageSection(getEditor(), form.getBody(), managedForm.getToolkit(), sectionStyle));
+ inputSection = new BlamInputSection(getEditor(), form.getBody(), managedForm.getToolkit(), sectionStyle);
+ outputSection = new BlamOutputSection(getEditor(), form.getBody(), managedForm.getToolkit(), sectionStyle);
+
+ managedForm.addPart(inputSection);
+ managedForm.addPart(outputSection);
+
+ managedForm.refresh();
+ form.layout();
+ }
+
+ private void updateTitle(ScrolledForm form) {
+ form.setText(getEditorInput().getName());
+ }
+
+ private void updateImage(ScrolledForm form) {
+ form.setImage(getEditor().getEditorInput().getImage());
+ }
+
+ private void addToolBar(FormToolkit toolkit, ScrolledForm form, boolean add) {
+ IToolBarManager manager = form.getToolBarManager();
+ if (add) {
+ getEditor().getActionBarContributor().contributeToToolBar(manager);
+ manager.update(true);
+ } else {
+ manager.removeAll();
+ }
+ form.reflow(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.editor.FormPage#getEditor()
+ */
+ @Override
+ public BlamEditor getEditor() {
+ return (BlamEditor) super.getEditor();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.EditorPart#getEditorInput()
+ */
+ @Override
+ public BlamEditorInput getEditorInput() {
+ return (BlamEditorInput) super.getEditorInput();
+ }
+
+ public void refresh() {
+ final ScrolledForm sForm = getManagedForm().getForm();
+ for (IFormPart part : getManagedForm().getParts()) {
+ part.refresh();
+ }
+ sForm.getBody().layout(true);
+ sForm.reflow(true);
+ getManagedForm().refresh();
+ }
+
+ public void appendOutput(final String additionalOutput) {
+ outputSection.appendText(additionalOutput);
+ }
+
+ public void setOuputText(final String text) {
+ outputSection.setText(text);
+ }
+
+ public Appendable getOutput() {
+ return outputSection.getOutput();
+ }
+
+ public VariableMap getInput() {
+ return inputSection.getData();
+ }
+
+ public void setDynamicXWidgetLayouts(Collection<DynamicXWidgetLayout> layouts) {
+ inputSection.setDynamicXWidgetLayouts(layouts);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamParameter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamParameter.java
new file mode 100644
index 00000000000..d0ae9e8849f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamParameter.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.framework.ui.skynet.blam;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BlamParameter {
+ @SuppressWarnings("unused")
+ private final String name;
+ @SuppressWarnings("unused")
+ private final Class<?> clazz;
+ @SuppressWarnings("unused")
+ private String binding;
+
+ /**
+ * @param name
+ * @param clazz
+ * @param binding
+ */
+ public BlamParameter(String name, Class<?> clazz, String binding) {
+ super();
+ this.name = name;
+ this.clazz = clazz;
+ this.binding = binding;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamWorkflow.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamWorkflow.java
new file mode 100644
index 00000000000..be0750d526a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/BlamWorkflow.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.core.runtime.CoreException;
+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.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XWidgetParser;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BlamWorkflow extends Artifact {
+ public static final String ARTIFACT_NAME = "Blam Workflow";
+ private final List<BlamOperation> operations;
+ private List<DynamicXWidgetLayoutData> layoutDatas;
+ private final DynamicXWidgetLayout dynamicXWidgetLayout;
+ private BlamOperation soleOperation;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public BlamWorkflow(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+
+ this.operations = new ArrayList<BlamOperation>();
+ this.dynamicXWidgetLayout = new DynamicXWidgetLayout();
+ this.layoutDatas = new LinkedList<DynamicXWidgetLayoutData>();
+ }
+
+ public static BlamWorkflow getOrCreateBlamWorkflow(BlamOperation soleOperation) throws OseeCoreException {
+ BlamWorkflow blamWorkflow =
+ (BlamWorkflow) ArtifactTypeManager.addArtifact(ARTIFACT_NAME, BranchManager.getCommonBranch());
+ blamWorkflow.setDescriptiveName(soleOperation.getName());
+ blamWorkflow.setSoleOperation(soleOperation);
+ return blamWorkflow;
+ }
+
+ public List<DynamicXWidgetLayoutData> getLayoutDatas() throws IllegalArgumentException, OseeCoreException, ParserConfigurationException, SAXException, IOException, CoreException {
+ if (layoutDatas.isEmpty()) {
+ getOperations();
+ }
+ return layoutDatas;
+ }
+
+ public List<BlamOperation> getOperations() throws IllegalArgumentException, OseeCoreException, ParserConfigurationException, SAXException, IOException, CoreException {
+ operations.clear();
+
+ if (soleOperation == null) {
+ loadFromXml();
+ } else {
+ operations.add(soleOperation);
+ layoutDatas = XWidgetParser.extractWorkAttributes(dynamicXWidgetLayout, soleOperation.getXWidgetsXml());
+ }
+
+ return operations;
+ }
+
+ private void loadFromXml() throws ParserConfigurationException, OseeCoreException, CoreException, SAXException, IOException {
+ String blamXml = getSoleAttributeValue("Workflow Definition", "");
+ Document document = Jaxp.readXmlDocument(blamXml);
+ Element rootElement = document.getDocumentElement();
+
+ NodeList operations = rootElement.getElementsByTagName("Operation");
+ for (int i = 0; i < operations.getLength(); i++) {
+ loadBlamOperationFromXml((Element) operations.item(i));
+ }
+
+ NodeList xwidgets = rootElement.getElementsByTagName("Widgets");
+ for (int i = 0; i < xwidgets.getLength(); i++) {
+ setLayoutData((Element) xwidgets.item(i));
+ }
+ }
+
+ private void setLayoutData(Element element) throws ParserConfigurationException, SAXException, IOException {
+ layoutDatas = XWidgetParser.extractlayoutDatas(dynamicXWidgetLayout, element);
+ }
+
+ private void loadBlamOperationFromXml(Element operation) throws CoreException, IllegalArgumentException {
+ String operationName = operation.getAttribute("name");
+ if (operationName.equals("")) {
+ throw new IllegalArgumentException("The operation name must be specified");
+ }
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtension extension = registry.getExtension("org.eclipse.osee.framework.ui.skynet.BlamOperation", operationName);
+
+ if (extension == null) {
+ throw new IllegalArgumentException(
+ "No extension for org.eclipse.osee.framework.ui.skynet.BlamOperation with the name " + operationName + " was found.\n\n" + getOperationsListing(registry));
+ }
+
+ IConfigurationElement[] configElements = null;
+ configElements = extension.getConfigurationElements();
+ for (int j = 0; j < configElements.length; j++) {
+ BlamOperation blamOperation = (BlamOperation) configElements[j].createExecutableExtension("className");
+ operations.add(blamOperation);
+ }
+ }
+
+ private String getOperationsListing(IExtensionRegistry registry) {
+ StringBuilder strB = new StringBuilder(1000);
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.ui.skynet.BlamOperation");
+ IExtension[] extensions = point.getExtensions();
+
+ for (IExtension extension : extensions) {
+ strB.append("Ext Point Id: ");
+ strB.append(extension.getUniqueIdentifier());
+ strB.append('\n');
+ }
+ return strB.toString();
+ }
+
+ public String getDescriptionUsage() {
+ try {
+ if (getOperations().size() == 1) {
+ return operations.get(0).getDescriptionUsage();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return "Select parameters below and click the play button at the top right.";
+ }
+
+ public void saveLayoutData(String xml) throws OseeCoreException {
+ try {
+ String blamXml = getSoleAttributeValue("Workflow Definition", "");
+ Document document = Jaxp.readXmlDocument(blamXml);
+ Element rootElement = document.getDocumentElement();
+
+ NodeList oldXwidgets = rootElement.getElementsByTagName("Widgets");
+
+ // delete all old Xwidgets
+ for (int i = 0; i < oldXwidgets.getLength(); i++) {
+ rootElement.removeChild(oldXwidgets.item(i));
+ }
+
+ String doc = Jaxp.getDocumentXml(document);
+ doc = doc.replace("<Workflow>", "<Workflow>" + xml);
+
+ setSoleAttributeValue("Workflow Definition", doc);
+ persistAttributes();
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ } catch (TransformerException ex) {
+ throw new OseeCoreException(ex);
+ } catch (ParserConfigurationException ex) {
+ throw new OseeCoreException(ex);
+ } catch (SAXException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /**
+ * @param soleOperation the soleOperation to set
+ */
+ public void setSoleOperation(BlamOperation soleOperation) {
+ this.soleOperation = soleOperation;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/DynamicBlamOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/DynamicBlamOperation.java
new file mode 100644
index 00000000000..f3228f30f05
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/DynamicBlamOperation.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.framework.ui.skynet.blam;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.rmi.activation.ActivationException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.update.core.IFeature;
+import org.eclipse.update.core.ISite;
+import org.eclipse.update.core.ISiteFeatureReference;
+import org.eclipse.update.core.SiteManager;
+import org.eclipse.update.operations.IOperationFactory;
+import org.eclipse.update.operations.OperationsManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class DynamicBlamOperation {
+ private Method mainMethod;
+ private BlamParameter[] parameters;
+
+ public void installAssociatedPlugin() throws MalformedURLException, CoreException {
+ IOperationFactory operationFactory = OperationsManager.getOperationFactory();
+ ISite site = SiteManager.getSite(new URL("http://www.eclipse.org/osee/"), null);
+ ISiteFeatureReference[] refs = site.getFeatureReferences();
+ IFeature feature = refs[0].getFeature(null);
+ operationFactory.createInstallOperation(site.getCurrentConfiguredSite(), feature, null, null, null);
+ }
+
+ public void init() throws ActivationException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+ mainMethod = findMainMethod(getMainMethodName());
+
+ String[] parameterNames = getParameterNames();
+ Class<?>[] parameterTypes = mainMethod.getParameterTypes();
+ if (parameterNames.length != parameterTypes.length) {
+ throw new ActivationException(
+ "The method " + getMainMethodName() + " has " + parameterTypes.length + " parameters, but " + parameterNames.length + " parameter names.");
+ }
+
+ parameters = new BlamParameter[parameterTypes.length];
+ for (int i = 0; i < parameterTypes.length; i++) {
+ parameters[i] = new BlamParameter(parameterNames[i], parameterTypes[i], null);
+ }
+
+ }
+
+ public void executeOperation(Object[] actualParameters) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
+ mainMethod.invoke(this, actualParameters);
+ }
+
+ private Method findMainMethod(String mainMethodName) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+ Class<? extends DynamicBlamOperation> classRep = getClass();
+ Method[] methods = classRep.getDeclaredMethods(); // get only the methods declared directly in the given class
+
+ for (Method method : methods) {
+ if (method.getName().equals(mainMethodName)) {
+ return method;
+ }
+ }
+ throw new NoSuchMethodException(mainMethodName);
+ }
+
+ /**
+ * should return user oriented names for input values in the same order that they should be passed to the operation's
+ * configured execution method
+ *
+ * @return array of parameter names
+ */
+ public abstract String[] getParameterNames();
+
+ public abstract String getMainMethodName();
+
+ public BlamParameter[] getParameters() {
+ return parameters;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/ExecuteBlamOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/ExecuteBlamOperation.java
new file mode 100644
index 00000000000..7fae4c14ff0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/ExecuteBlamOperation.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.framework.ui.skynet.blam;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExecuteBlamOperation extends AbstractOperation {
+ private final List<BlamOperation> operations;
+ private final VariableMap variableMap;
+ private final Appendable output;
+
+ public ExecuteBlamOperation(String name, Appendable output, VariableMap variableMap, List<BlamOperation> operations) {
+ super(name, SkynetGuiPlugin.PLUGIN_ID);
+ this.variableMap = variableMap;
+ this.operations = operations;
+ this.output = output;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ if (operations.isEmpty()) {
+ throw new OseeStateException("No operations were found for this workflow");
+ }
+ double workPercentage = 1 / operations.size();
+ for (BlamOperation operation : operations) {
+ operation.setOutput(output);
+ doSubWork(new InternalOperationAdapter(operation), monitor, workPercentage);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#createErrorStatus(java.lang.Throwable)
+ */
+ @Override
+ protected IStatus createErrorStatus(Throwable error) {
+ IStatus status = super.createErrorStatus(error);
+ try {
+ if (error != null) {
+ output.append(Lib.exceptionToString(error));
+ } else {
+ output.append(status.getMessage());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return status;
+ }
+
+ private final class InternalOperationAdapter extends AbstractOperation {
+ private final BlamOperation operation;
+
+ public InternalOperationAdapter(BlamOperation operation) {
+ super(operation.getName(), SkynetGuiPlugin.PLUGIN_ID);
+ this.operation = operation;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ operation.runOperation(variableMap, monitor);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/OperationsPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/OperationsPage.java
new file mode 100644
index 00000000000..96968e59388
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/OperationsPage.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.framework.ui.skynet.blam;
+
+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.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OperationsPage {
+ public void findAllOperations() {
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.ui.skynet.BlamOperation");
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ extension.getUniqueIdentifier();
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("Renderer")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ }
+ }
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> renderClass = bundle.loadClass(classname);
+ renderClass.newInstance();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ } catch (NoClassDefFoundError er) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "Failed to find a class definition for " + classname + ", registered from bundle " + bundleName,
+ er);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/VariableMap.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/VariableMap.java
new file mode 100644
index 00000000000..b83c60dcc2a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/VariableMap.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.framework.ui.skynet.blam;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class VariableMap {
+ private final HashMap<String, Object> variableMap = new HashMap<String, Object>();
+
+ public VariableMap() {
+ }
+
+ /**
+ * @throws OseeArgumentException
+ */
+ public VariableMap(Object... optionArgs) throws OseeArgumentException {
+ for (int i = 0; i < optionArgs.length; i += 2) {
+ if (optionArgs[i] instanceof String) {
+ variableMap.put((String) optionArgs[i], optionArgs[i + 1]);
+ } else if (optionArgs[i] == null) {
+ throw new OseeArgumentException(String.format("The %dth option must not be null", i));
+ } else {
+ throw new OseeArgumentException(String.format("The %dth option must be of type string but is of type %s",
+ i, optionArgs[i].getClass().getName()));
+ }
+ }
+ }
+
+ public void setValue(String variableName, Object value) {
+ variableMap.put(variableName, value);
+ }
+
+ public ArtifactType getArtifactType(String parameterName) throws OseeArgumentException {
+ return getSingleCollectionValue(ArtifactType.class, parameterName);
+ }
+
+ public AttributeType getAttributeType(String parameterName) throws OseeArgumentException {
+ return getSingleCollectionValue(AttributeType.class, parameterName);
+ }
+
+ public String getString(String parameterName) throws OseeArgumentException {
+ return getValue(String.class, parameterName);
+ }
+
+ public Branch getBranch(String parameterName) throws OseeArgumentException {
+ return getValue(Branch.class, parameterName);
+ }
+
+ public Boolean getBoolean(String parameterName) throws OseeArgumentException {
+ return getValue(Boolean.class, parameterName);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> Collection<T> getCollection(Class<T> clazz, String parameterName) throws OseeArgumentException {
+ return getValue(Collection.class, parameterName);
+ }
+
+ public User getUser(String parameterName) throws OseeArgumentException {
+ return getValue(User.class, parameterName);
+ }
+
+ public List<Artifact> getArtifacts(String parameterName) throws OseeArgumentException {
+ Collection<Artifact> artiafcts = getCollection(Artifact.class, parameterName);
+ if (artiafcts == null) {
+ return new ArrayList<Artifact>();
+ }
+ return new ArrayList<Artifact>(artiafcts);
+ }
+
+ private <T> T getSingleCollectionValue(Class<T> clazz, String parameterName) throws OseeArgumentException {
+ Collection<T> objects = getCollection(clazz, parameterName);
+ if (objects.size() != 1) {
+ throw new OseeArgumentException("Require a collection of size 1 not " + objects.size());
+ }
+ return objects.iterator().next();
+ }
+
+ private <T> T getValue(Class<T> clazz, String variableName) throws OseeArgumentException {
+ Object value = variableMap.get(variableName);
+
+ if (value != null && !clazz.isInstance(value)) {
+ throw new OseeArgumentException(
+ "Expecting object of type " + clazz.getName() + " not " + value.getClass().getName());
+ }
+ return clazz.cast(value);
+ }
+
+ public Object getValue(String variableName) throws OseeArgumentException {
+ return variableMap.get(variableName);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowDataPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowDataPage.java
new file mode 100644
index 00000000000..db8ea2218ad
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowDataPage.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.IHelpContextIds;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.XWidgetParser;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+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.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WorkflowDataPage extends FormPage {
+ private final BlamWorkflow workflow;
+ private final XFormToolkit toolkit;
+ private final List<Text> parameters;
+ private final List<Text> localVariables;
+ private final BlamOverviewPage overviewPage;
+ private final DynamicXWidgetLayout dynamicXWidgetLayout;
+
+ public WorkflowDataPage(BlamEditor editor, BlamOverviewPage overviewPage) {
+ super(editor, "overview", "Workflow Data");
+
+ this.workflow = editor.getEditorInput().getArtifact();
+ this.toolkit = editor.getToolkit();
+ this.parameters = new LinkedList<Text>();
+ this.localVariables = new LinkedList<Text>();
+ this.overviewPage = overviewPage;
+ this.dynamicXWidgetLayout = new DynamicXWidgetLayout();
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ ScrolledForm form = managedForm.getForm();
+ form.setText("Workflow Data");
+ createToolBarActions(form);
+ form.updateToolBar();
+ fillBody(managedForm);
+ managedForm.refresh();
+ }
+
+ private void createToolBarActions(final ScrolledForm form) {
+ Action runAction = new Action("Generate Workflow Overview Page", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ StringBuilder strB = new StringBuilder(parameters.size() * 140);
+ strB.append("<Widgets>");
+ for (Text variableText : parameters) {
+ strB.append(variableText.getText());
+ }
+ strB.append("</Widgets>");
+ // XWidgetParser widgetParser = new XWidgetParser();
+
+ String widgetXml = strB.toString();
+
+ try {
+ dynamicXWidgetLayout.addWorkLayoutDatas(XWidgetParser.extractWorkAttributes(dynamicXWidgetLayout,
+ widgetXml));
+ overviewPage.setDynamicXWidgetLayouts(Arrays.asList(dynamicXWidgetLayout));
+
+ workflow.saveLayoutData(widgetXml);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ MessageDialog.openError(form.getShell(), "Error", ex.getLocalizedMessage());
+ }
+ }
+ };
+ runAction.setToolTipText("Generates or regenerates the workflow overview page based on the widgets defined here");
+ runAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.GEAR));
+ form.getToolBarManager().add(runAction);
+ }
+
+ private void fillBody(IManagedForm managedForm) {
+ Composite body = managedForm.getForm().getBody();
+ GridLayout gridLayout = new GridLayout(1, true);
+ body.setLayout(gridLayout);
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(body, IHelpContextIds.MAIN_WORKFLOW_PAGE);
+
+ createParametersSection(body);
+ createLocalVariablesSection(body);
+ }
+
+ private void createLocalVariablesSection(Composite body) {
+ Section section = toolkit.createSection(body, Section.TWISTIE | Section.TITLE_BAR);
+ section.setText("Local Variables");
+ section.setExpanded(true);
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ toolkit.addHelpLinkToSection(section, "/org.eclipse.pde.doc.user/guide/pde_running.htm");
+
+ Composite variablesComposite = toolkit.createClientContainer(section, 2);
+ addNewVariableLinkToSection(section, variablesComposite, localVariables);
+ }
+
+ private void createParametersSection(Composite body) {
+ Section section = toolkit.createSection(body, Section.TWISTIE | Section.TITLE_BAR);
+ section.setText("Workflow Parameters");
+ section.setExpanded(true);
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Composite variablesComposite = toolkit.createClientContainer(section, 2);
+ addNewVariableLinkToSection(section, variablesComposite, parameters);
+ }
+
+ private void addNewVariableLinkToSection(final Section section, Composite variablesComposite, List<Text> variableTexts) {
+ ImageHyperlink addLink = new ImageHyperlink(section, SWT.NULL);
+ toolkit.adapt(addLink, true, true);
+ addLink.setImage(ImageManager.getImage(FrameworkImage.ADD_GREEN));
+ addLink.setBackground(section.getTitleBarGradientBackground());
+ addLink.addHyperlinkListener(new AddListener(variablesComposite, variableTexts));
+ section.setTextClient(addLink);
+ }
+
+ private class AddListener extends HyperlinkAdapter {
+ private final Composite variablesComposite;
+ private final List<Text> variableTexts;
+ private final RemoveListener removeListener;
+
+ public AddListener(Composite variablesComposite, List<Text> variableTexts) {
+ this.variablesComposite = variablesComposite;
+ this.variableTexts = variableTexts;
+ removeListener = new RemoveListener(variableTexts);
+ }
+
+ @Override
+ public void linkActivated(HyperlinkEvent ev) {
+ ImageHyperlink removeLink = new ImageHyperlink(variablesComposite, SWT.NULL);
+ toolkit.adapt(removeLink, true, true);
+ removeLink.setImage(ImageManager.getImage(FrameworkImage.REMOVE));
+ removeLink.addHyperlinkListener(removeListener);
+
+ Text variableWidget =
+ toolkit.createText(variablesComposite,
+ "<XWidget xwidgetType=\"XListDropViewer\" displayName=\"Get This\" />");
+ removeLink.setData(variableWidget);
+ variableTexts.add(variableWidget);
+ variableWidget.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ variablesComposite.getParent().getParent().layout();
+ }
+ }
+
+ private class RemoveListener extends HyperlinkAdapter {
+ private final List<Text> variableTexts;
+
+ public RemoveListener(List<Text> variableTexts) {
+ this.variableTexts = variableTexts;
+ }
+
+ @Override
+ public void linkActivated(HyperlinkEvent ev) {
+ ImageHyperlink removeLink = (ImageHyperlink) ev.widget;
+ Text variableWidget = (Text) removeLink.getData();
+
+ GridData gridData = (GridData) variableWidget.getLayoutData();
+ gridData.exclude = true;
+ variableWidget.setVisible(false);
+ variableTexts.remove(variableWidget);
+
+ gridData = (GridData) removeLink.getLayoutData();
+ gridData.exclude = true;
+ removeLink.setVisible(false);
+ removeLink.getParent().getParent().getParent().layout();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowJob.java
new file mode 100644
index 00000000000..2f2844e3b03
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/WorkflowJob.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.skynet.blam;
+
+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.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WorkflowJob extends Job {
+
+ /**
+ * @param name
+ */
+ public WorkflowJob(String name) {
+ super(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, Status.OK, ex.getMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/AbstractBlam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/AbstractBlam.java
new file mode 100644
index 00000000000..687114fba4c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/AbstractBlam.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class AbstractBlam implements BlamOperation, IDynamicWidgetLayoutListener {
+
+ private Appendable output;
+
+ public AbstractBlam() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetsXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return branchXWidgetXml;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Select parameters below and click the play button at the top right.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getName()
+ */
+ @Override
+ public abstract String getName();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#setOutput(java.lang.Appendable)
+ */
+ @Override
+ public void setOutput(Appendable output) {
+ this.output = output;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#print(java.lang.String)
+ */
+ @Override
+ public void print(String value) {
+ if (this.output != null && value != null) {
+ try {
+ this.output.append(value);
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#println(java.lang.String)
+ */
+ @Override
+ public void println(String value) {
+ if (Strings.isValid(value)) {
+ print(value + "\n");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#createXWidgetLayoutData(org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData, org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData layoutData, XWidget xWidget, FormToolkit toolkit, Artifact art, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#widgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/BlamOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/BlamOperation.java
new file mode 100644
index 00000000000..d001ccb5a71
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/BlamOperation.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.skynet.blam.operation;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface BlamOperation {
+ public static final String emptyXWidgetsXml = "<xWidgets/>";
+ public static final String branchXWidgetXml =
+ "<xWidgets><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" /></xWidgets>";
+
+ public abstract void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception;
+
+ public abstract String getXWidgetsXml();
+
+ public abstract String getDescriptionUsage();
+
+ public abstract String getName();
+
+ public abstract void setOutput(Appendable output);
+
+ public abstract void print(String value);
+
+ public abstract void println(String value);
+
+ /**
+ * Return collection of categories that blam belongs to eg: ATS, ATS.Admin, ATS.Report. These will be used to create
+ * categories that blams are put into in UI navigators. BLAM can belong in multiple categories.
+ *
+ * @return categories
+ */
+ public abstract Collection<String> getCategories();
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ChangeArtifactTypeBlam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ChangeArtifactTypeBlam.java
new file mode 100644
index 00000000000..8b380906e57
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ChangeArtifactTypeBlam.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.ChangeArtifactType;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * Changes the descriptor type of an artifact to the provided descriptor.
+ *
+ * @author Jeff C. Phillips
+ */
+public class ChangeArtifactTypeBlam extends AbstractBlam {
+ private List<Attribute<?>> attributesToPurge;
+ private List<RelationLink> relationsToDelete;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Change Artifact Type";
+ }
+
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ ChangeArtifactType.changeArtifactType(variableMap.getArtifacts("artifacts"),
+ variableMap.getArtifactType("New Artifact Type"));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XListDropViewer\" displayName=\"artifacts\" />" +
+ //
+ "<XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"New Artifact Type\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Define");
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CheckDefaulHierarchy.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CheckDefaulHierarchy.java
new file mode 100644
index 00000000000..9efa5456c6b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CheckDefaulHierarchy.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CheckDefaulHierarchy extends AbstractBlam {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Check Default Hierarchy";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("Branch");
+ ArtifactType artifactType = variableMap.getArtifactType("Artifact Type");
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromType(artifactType, branch, false);
+ for (Artifact artifact : artifacts) {
+ try {
+ if (!artifact.hasParent()) {
+ print("\n" + artifact.getHumanReadableId() + " has no parent\n");
+ }
+ } catch (MultipleArtifactsExist ex) {
+ print("\n" + ex.getLocalizedMessage() + "\n");
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getXWidgetsXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" />" +
+ //
+ "<XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"Artifact Type\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CopyTransactionDataToBaseline.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CopyTransactionDataToBaseline.java
new file mode 100644
index 00000000000..3a70bab8502
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CopyTransactionDataToBaseline.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CopyTransactionDataToBaseline extends AbstractBlam {
+ private static final String COPY_TX_DATA =
+ "INSERT INTO osee_txs (transaction_id, gamma_id, mod_type, tx_current) SELECT ?, gamma_id, mod_type, tx_current FROM osee_txs WHERE transaction_id = ?";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Copy TransactionData To Baseline";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("Branch");
+ int txNumber = Integer.parseInt(variableMap.getString("From Transaction Number"));
+ TransactionId fromTransactionId = TransactionIdManager.getTransactionId(txNumber);
+ TransactionId baseLineTransaction = TransactionIdManager.getStartEndPoint(branch).getValue();
+
+ ConnectionHandler.runPreparedUpdate(COPY_TX_DATA, baseLineTransaction, fromTransactionId);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"From Transaction Number\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Copy tx data from the From Transaction to the baseline transaction of the branch";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CreateNewUser.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CreateNewUser.java
new file mode 100644
index 00000000000..6896b1006bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/CreateNewUser.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.UserNotInDatabase;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.util.EmailGroupsAndUserGroups;
+import org.eclipse.osee.framework.ui.skynet.util.EmailGroupsAndUserGroups.GroupType;
+import org.eclipse.osee.framework.ui.skynet.widgets.XList.XListItem;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class CreateNewUser extends AbstractBlam {
+
+ private final static List<String> attrNames =
+ Arrays.asList("Company", "Company Title", "Street", "City", "State", "Zip", "Phone", "Mobile Phone",
+ "Fax Phone", "Website", "Notes");
+ private Set<Artifact> groupArts;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Create New User";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ monitor.beginTask("Create New User", IProgressMonitor.UNKNOWN);
+
+ User user = (User) ArtifactTypeManager.addArtifact(User.ARTIFACT_NAME, BranchManager.getCommonBranch());
+
+ String name = variableMap.getString("Name (Last, First)");
+ if (name.equals("")) {
+ AWorkbench.popup("ERROR", "Must Enter Name");
+ monitor.done();
+ return;
+ }
+ user.setDescriptiveName(name);
+
+ String userId = variableMap.getString("UserId (unique)");
+ if (userId.equals("")) {
+ AWorkbench.popup("ERROR", "Must Enter UserId");
+ monitor.done();
+ return;
+ }
+ try {
+ User existingUser = UserManager.getUserByUserId(userId);
+ if (existingUser != null) {
+ AWorkbench.popup("ERROR", "User with userId \"" + userId + "\" already exists.");
+ monitor.done();
+ return;
+ }
+ } catch (UserNotInDatabase ex) {
+ // good that is why we are creating it
+ }
+ user.setSoleAttributeValue("User Id", userId);
+
+ boolean active = variableMap.getBoolean("Active");
+ user.setSoleAttributeValue("Active", active);
+
+ String email = variableMap.getString("Email");
+ if (email.equals("")) {
+ AWorkbench.popup("ERROR", "Must Enter Email");
+ monitor.done();
+ return;
+ }
+ user.setSoleAttributeValue("Email", email);
+
+ // Process string attribute names
+ for (String attrName : attrNames) {
+ String value = variableMap.getString(attrName);
+ if (!value.equals("")) {
+ user.setSoleAttributeValue(attrName, value);
+ }
+ }
+ // Add user to selected User Group and Universal Group
+ for (XListItem groupNameListItem : variableMap.getCollection(XListItem.class, "Groups")) {
+ for (Artifact groupArt : groupArts) {
+ if (groupNameListItem.getName().equals(groupArt.getDescriptiveName())) {
+ if (groupArt.getArtifactTypeName().equals("Universal Group")) {
+ groupArt.addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, user);
+ } else if (groupArt.getArtifactTypeName().equals("User Group")) {
+ groupArt.addRelation(CoreRelationEnumeration.Users_User, user);
+ }
+ }
+ }
+ }
+
+ user.persistAttributesAndRelations();
+ ArtifactEditor.editArtifact(user);
+ monitor.done();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ String widgetXml = "<xWidgets>" +
+ //
+ "<XWidget xwidgetType=\"XText\" displayName=\"Name (Last, First)\" required=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XText\" displayName=\"UserId (unique)\" required=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XText\" displayName=\"Email\" required=\"true\"/>" +
+ //
+ "<XWidget xwidgetType=\"XCheckBox\" displayName=\"Active\" required=\"true\" defaultValue=\"true\"/>";
+
+ // Add all rest of attributes to fill
+ for (String attrName : attrNames) {
+ widgetXml += "<XWidget xwidgetType=\"XText\" displayName=\"" + attrName + "\"/>";
+ }
+ // Add groups to belong to
+ try {
+ groupArts = EmailGroupsAndUserGroups.getEmailGroupsAndUserGroups(UserManager.getUser(), GroupType.Both);
+ String groupStr = "";
+ for (Artifact art : groupArts) {
+ groupStr += art.getDescriptiveName() + ",";
+ }
+ groupStr = groupStr.replaceFirst(",$", "");
+ widgetXml +=
+ "<XWidget xwidgetType=\"XList(" + groupStr + ")\" displayName=\"Groups\" defaultValue=\"Everyone\"/>";
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ //
+ widgetXml += "</xWidgets>";
+ return widgetXml;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatabaseHealth.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatabaseHealth.java
new file mode 100644
index 00000000000..03dc3bc995a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatabaseHealth.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.db.connection.exception.OseeAccessDeniedException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation;
+import org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOpsExtensionManager;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class DatabaseHealth extends AbstractBlam {
+ private static final String SHOW_DETAILS_PROMPT = "Show Details of Operations";
+ private static final String CLEAN_ALL_PROMPT = "Run all the Cleanup Operations";
+ private static final String SHOW_ALL_PROMPT = "Run all the Verification Operations";;
+
+ public DatabaseHealth() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Database Health";
+ }
+
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ boolean isShowDetailsEnabled = variableMap.getBoolean(SHOW_DETAILS_PROMPT);
+ boolean fixAll = variableMap.getBoolean(CLEAN_ALL_PROMPT);
+ boolean verifyAll = variableMap.getBoolean(SHOW_ALL_PROMPT);
+
+ MasterDbHealthOperation dbHealthOperation = new MasterDbHealthOperation(getName());
+ dbHealthOperation.setShowDetails(isShowDetailsEnabled);
+
+ for (String taskName : DatabaseHealthOpsExtensionManager.getFixOperationNames()) {
+ if (fixAll || variableMap.getBoolean(taskName)) {
+ dbHealthOperation.addOperation(DatabaseHealthOpsExtensionManager.getFixOperationByName(taskName), true);
+ }
+ }
+ for (String taskName : DatabaseHealthOpsExtensionManager.getVerifyOperationNames()) {
+ if (verifyAll || variableMap.getBoolean(taskName)) {
+ dbHealthOperation.addOperation(DatabaseHealthOpsExtensionManager.getVerifyOperationByName(taskName), false);
+ }
+ }
+ Operations.executeWork(dbHealthOperation, monitor, -1);
+ Operations.checkForErrorStatus(dbHealthOperation.getStatus());
+ println(dbHealthOperation.getStatus().getMessage());
+ }
+
+ @Override
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"" + SHOW_DETAILS_PROMPT + "\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"" + CLEAN_ALL_PROMPT + "\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"" + SHOW_ALL_PROMPT + "\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\" \"/>");
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select Verification Operations to Run:\"/>");
+ for (String taskName : DatabaseHealthOpsExtensionManager.getVerifyOperationNames()) {
+ builder.append(getOperationsCheckBoxes(taskName));
+ }
+
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\" \"/>");
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select Clean Up Operations to Run:\"/>");
+ for (String taskName : DatabaseHealthOpsExtensionManager.getFixOperationNames()) {
+ builder.append(getOperationsCheckBoxes(taskName));
+ }
+
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private String getOperationsCheckBoxes(String checkboxName) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"");
+ builder.append(checkboxName);
+ builder.append("\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ return builder.toString();
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+
+ private final class MasterDbHealthOperation extends AbstractOperation {
+
+ private boolean isShowDetailsEnabled;
+ private final Set<DatabaseHealthOperation> fixOperations = new HashSet<DatabaseHealthOperation>();
+ private final Set<DatabaseHealthOperation> verifyOperations = new HashSet<DatabaseHealthOperation>();
+
+ public MasterDbHealthOperation(String operationName) {
+ super(operationName, SkynetGuiPlugin.PLUGIN_ID);
+ this.isShowDetailsEnabled = false;
+ }
+
+ public void setShowDetails(boolean isShowDetailsEnabled) {
+ this.isShowDetailsEnabled = isShowDetailsEnabled;
+ }
+
+ public void addOperation(DatabaseHealthOperation operation, boolean isFixOperation) {
+ if (operation != null) {
+ if (isFixOperation) {
+ fixOperations.add(operation);
+ } else {
+ verifyOperations.add(operation);
+ }
+ }
+ }
+
+ private void executeOperation(IProgressMonitor monitor, DatabaseHealthOperation operation, Appendable appendable, double workPercentage, boolean isFix) throws Exception {
+ checkForCancelledStatus(monitor);
+ if (operation != null) {
+ operation.setFixOperationEnabled(isFix);
+ operation.setShowDetailsEnabled(isShowDetailsEnabled);
+ operation.setSummary(appendable);
+ doSubWork(operation, monitor, workPercentage);
+ setStatus(operation.getStatus());
+
+ if (operation.isShowDetailsEnabled()) {
+ String detailedReport = operation.getDetailedReport().toString();
+ if (Strings.isValid(detailedReport)) {
+ XResultData result = new XResultData();
+ result.addRaw(detailedReport.toString());
+ result.report(operation.getName(), Manipulations.RAW_HTML);
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ int totalTasks = fixOperations.size() + verifyOperations.size();
+ double workPercentage = totalTasks / getTotalWorkUnits();
+ if (!AccessControlManager.isOseeAdmin()) {
+ throw new OseeAccessDeniedException("Must be a Developer to run this BLAM");
+ } else {
+ StringBuilder builder = new StringBuilder();
+ for (DatabaseHealthOperation operation : fixOperations) {
+ executeOperation(monitor, operation, builder, workPercentage, true);
+ }
+ for (DatabaseHealthOperation operation : verifyOperations) {
+ executeOperation(monitor, operation, builder, workPercentage, false);
+
+ }
+
+ setStatusMessage(builder.toString());
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatastoreStatistics.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatastoreStatistics.java
new file mode 100644
index 00000000000..5d7ed829f75
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DatastoreStatistics.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DatastoreStatistics extends AbstractBlam {
+ private static final String SELECT_ARTIFACT_COUNTS =
+ "select count(1) as total, name FROM osee_artifact_type ary, osee_artifact art where ary.art_type_id = art.art_type_id group by name order by total desc";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Datastore Statistics";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+
+ try {
+ chStmt.runPreparedQuery(1000, SELECT_ARTIFACT_COUNTS);
+ while (chStmt.next()) {
+ print(chStmt.getString("name"));
+ print(": ");
+ print(String.valueOf(chStmt.getInt("total")));
+ print("\n");
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Reports statistics about the datastore including artifact counts by type.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteArchivedBranches.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteArchivedBranches.java
new file mode 100644
index 00000000000..caf35a843cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteArchivedBranches.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DeleteArchivedBranches extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Delete Archived Branches";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ BranchManager.purgeArchivedBranches();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Permantly purges all branches that are archived";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteUnneededUnspecifiedAttributes.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteUnneededUnspecifiedAttributes.java
new file mode 100644
index 00000000000..ad331b1f22a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DeleteUnneededUnspecifiedAttributes.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DeleteUnneededUnspecifiedAttributes extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Delete Unneeded Unspecified Attributes";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("Branch");
+ AttributeType attributeType = variableMap.getAttributeType("Attribute Type");
+ List<Artifact> artifacts =
+ ArtifactQuery.getArtifactsFromAttribute(attributeType, EnumeratedAttribute.UNSPECIFIED_VALUE, branch);
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+
+ for (Artifact artifact : artifacts) {
+ Collection<Attribute<String>> attributes = artifact.getAttributes(attributeType.getName());
+ for (Attribute<String> attribute1 : attributes) {
+ if (!attribute1.getValue().equals(EnumeratedAttribute.UNSPECIFIED_VALUE)) {
+ for (Attribute<String> attribute : attributes) {
+ if (attribute.getValue().equals(EnumeratedAttribute.UNSPECIFIED_VALUE)) {
+ attribute.delete();
+ }
+ }
+ artifact.persistAttributes(transaction);
+ break;
+ }
+ }
+ }
+ transaction.execute();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XAttributeTypeListViewer\" displayName=\"Attribute Type\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DuplicateRelationOpertions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DuplicateRelationOpertions.java
new file mode 100644
index 00000000000..b5652b24526
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/DuplicateRelationOpertions.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyQuadHashMap;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyTripleHashMap;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Roberto E. Escobar
+ */
+public class DuplicateRelationOpertions extends AbstractBlam {
+
+ private static final String checkGammaCase =
+ "select rel1.rel_link_type_id, rel1.b_art_id, txd1.branch_id, rel1.a_order, txs1.gamma_id, rel1.a_art_id, rel1.b_order_value, rel1.REL_LINK_ID, txd1.tx_type as real_tx_type, txs1.* from osee_tx_details txd1, osee_relation_link rel1, osee_txs txs1 where txd1.transaction_id = txs1.transaction_id and txs1.gamma_id = rel1.gamma_id and txs1.tx_current = 1 and rel1.b_art_id = ? and rel1.a_art_id = ? and rel1.rel_link_type_id = ? and txd1.TX_TYPE = 0 order by txd1.branch_id, rel1.rel_link_type_id, rel1.b_art_id, rel1.b_order_value";
+
+ private static final String update_txs =
+ "update osee_txs set tx_current = ?, mod_type = ? where gamma_id = ? and transaction_id = ?";
+ private static final String update_version = "update osee_relation_link set modification_id = ? where gamma_id = ?";
+ private static final String SELECT_DUPLICATE_RELATIONS =
+ "select rel1.a_art_id, rel1.b_art_id, rel1.rel_link_type_id, txd1.branch_id, rel1.REL_LINK_ID, rel1.gamma_id, txd1.transaction_id from osee_relation_link rel1, osee_txs txs1, osee_tx_details txd1 , (select rel2.*, txd2.branch_id, txd2.transaction_id from osee_relation_link rel2, osee_txs txs2, osee_tx_details txd2 where txs2.transaction_id = txd2.transaction_id and txs2.tx_current = 1 and txs2.gamma_id = rel2.gamma_id) other_rel_link where txs1.transaction_id = txd1.transaction_id and txs1.tx_current = 1 and txs1.gamma_id = rel1.gamma_id and txd1.branch_id = other_rel_link.branch_id and rel1.a_art_id = other_rel_link.a_art_id and rel1.b_art_id = other_rel_link.b_art_id and rel1.REL_LINK_TYPE_ID = other_rel_link.rel_link_type_id and rel1.REL_LINK_ID <> other_rel_link.rel_link_id order by txd1.branch_id, rel1.rel_link_type_id, rel1.a_art_id, rel1.b_art_id, rel1.rel_link_id";
+ private final CompositeKeyQuadHashMap<Integer, Integer, Integer, Integer, RelationInfo> relationInfo =
+ new CompositeKeyQuadHashMap<Integer, Integer, Integer, Integer, RelationInfo>(1000);
+
+ int[] gammaIds =
+ new int[] {852176, 1806465, 1806464, 1806466, 1806468, 852190, 852191, 1543816, 1807037, 1806492, 1806481,
+ 1806485, 1713318, 177456, 1806507, 177457, 177458, 177459, 177460, 177461, 177462, 177463, 1806499,
+ 1806498, 1806497, 1806502, 1806501, 1806500, 1806522, 173862, 852192, 852199, 1611799, 1498880, 177449,
+ 1495752, 177451, 1611800, 1806513, 177453, 177455, 1806516, 177454, 1575261, 223175, 1807087, 1807086,
+ 1807085, 1807084, 1800592, 1164028, 1807088, 1807089, 3249936, 1575289, 1575288, 1575284, 1575281,
+ 1575276, 1508988, 2848359, 1575272, 2848358, 2848361, 1508983, 2848360, 2848363, 1575268, 2848362,
+ 1508979, 1575265, 1137539, 898640, 173020, 1806903, 174666, 1806908, 1806364, 1806904, 1806863, 1806650,
+ 839426, 1812929, 1806391, 1806389, 1589156, 1806393, 264571, 1806392, 1589154, 1589155, 1806400, 264757,
+ 1806412, 1806413, 1806414, 3198866, 1806411, 1812923, 1812922, 467177, 1806422, 1806417, 1812925,
+ 1812924, 1806418, 1311395, 1482583, 1311387, 1806438, 1806244, 1806439, 1806245, 1806914, 1806246,
+ 1806436, 1806247, 1806437, 2078493, 2078494, 1806243, 1806446, 1806252, 1806447, 1806444, 2092598,
+ 1806445, 1806442, 1806443, 1806249, 1806440, 1806441, 1806251, 1806454, 1806453, 1806452, 1806451,
+ 1953629, 1806450, 2080927, 1806449, 1806448, 1806463, 1806462, 1806461, 1806460, 1806459, 261366,
+ 1806458, 1806457, 1806456, 261365};
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Duplicate Relation Opertions";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_DUPLICATE_RELATIONS);
+ while (chStmt.next()) {
+ addRelationEntry(chStmt.getInt("a_art_id"), chStmt.getInt("b_art_id"), chStmt.getInt("rel_link_type_id"),
+ chStmt.getInt("branch_id"), chStmt.getInt("rel_link_id"), chStmt.getLong("gamma_id"),
+ chStmt.getInt("transaction_id"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ Collection<RelationInfo> values = relationInfo.values();
+ this.print(String.format("Found [%d] potential conflicts.", values.size()));
+
+ int oddCases = 0;
+ int goodCases = 0;
+ int interestingCases = 0;
+ int casesWithDuplicateItemsInSameTransaction = 0;
+ for (RelationInfo info : values) {
+
+ for (int i = 0; i < info.relLinksToGammas.size(); i++) {
+ for (int j = i + 1; j < info.relLinksToGammas.size(); j++) {
+ if (info.relLinksToGammas.get(i).getValue().intValue() == info.relLinksToGammas.get(j).getValue().intValue()) {
+ casesWithDuplicateItemsInSameTransaction++;
+ }
+ }
+ }
+ if (info.art_a == 81891 && info.art_b == 107083) {
+ System.out.println("look at me");
+
+ }
+ if (info.relLinksToGammas.size() < 2) {
+ oddCases++;
+ } else if (info.relLinksToGammas.size() > 2) {
+ OseeLog.log(DuplicateRelationOpertions.class, Level.INFO, String.format("aArt[%d], bArt[%d]", info.art_a,
+ info.art_b));
+ interestingCases++;
+ } else {
+ goodCases++;
+ }
+ }
+
+ // List<Object[]> batchedTxsUpdates = new ArrayList<Object[]>();
+ // List<Object[]> batchedVersionUpdates = new ArrayList<Object[]>();
+ HashSet<Long> gammas = new HashSet<Long>();
+ CompositeKeyTripleHashMap<Integer, Integer, Integer, String> messages =
+ new CompositeKeyTripleHashMap<Integer, Integer, Integer, String>();
+ //ModificationType.DELETED;/
+ // TxChange.DELETED;
+ // FileOutputStream fos = new FileOutputStream(new File("DuplicateRelationRecovery.txt"));
+ for (RelationInfo info : values) {
+ int count = 0;
+ int modCount = 0;
+ long gammaId = 0;
+ try {
+ chStmt.runPreparedQuery(checkGammaCase, info.art_b, info.art_a, info.rel_link_type);
+ while (chStmt.next()) {
+ if (chStmt.getInt("mod_type") == 2) {
+ modCount++;
+ gammaId = chStmt.getLong("gamma_id");
+ }
+ count++;
+ }
+ } catch (OseeCoreException ex) {
+ ex.printStackTrace();
+ } finally {
+ chStmt.close();
+ }
+ boolean added = false;
+ if (modCount == 1 && count == 2) {
+ for (int id : gammaIds) {
+ if (gammaId == id) {
+ gammas.add(gammaId);
+ added = true;
+ break;
+ }
+ }
+ if (!added) {
+ System.out.println("Other Odd Case");
+ }
+ } else {
+ if (!messages.containsKey(info.art_a, info.art_b, info.rel_link_type)) {
+ messages.put(info.art_a, info.art_b, info.rel_link_type, String.format(
+ "modCount[%d] count[%d] aArt[%d] bArt[%d] linkType[%d]", modCount, count, info.art_a, info.art_b,
+ info.rel_link_type));
+ }
+ }
+
+ // for (int i = 0; i < info.relLinksToGammas.size(); i++) {
+ // if (info.art_a == 81891 && info.art_b == 107083) {
+ // System.out.println("look at me");
+ // }
+ // gammas.add(info.relLinksToGammas.get(i).getKey());
+ // fos.write(String.format("%d, %d\n", info.relLinksToGammas.get(i).getKey(),
+ // info.relLinksToGammas.get(i).getValue()).getBytes());
+ // batchedTxsUpdates.add(new Object[] { TxChange.DELETED.getValue(),
+ // ModificationType.DELETED.getValue(),
+ // info.relLinksToGammas.get(i).getKey(), info.relLinksToGammas.get(i).getValue()});
+ // batchedVersionUpdates.add(new Object[] { ModificationType.DELETED.getValue(),
+ // info.relLinksToGammas.get(i).getKey()});
+ // }
+ }
+ // fos.close();
+ // System.out.println("here we go.");
+ // System.out.println("wait here");
+
+ System.out.println(String.format("%d gamma id's that should be modified.", gammas.size()));
+ System.out.println(Arrays.deepToString(gammas.toArray()));
+ for (String str : messages.values()) {
+ System.out.println(str);
+ }
+
+ // ConnectionHandler.runPreparedUpdateBatch(this.update_txs, batchedTxsUpdates);
+ // ConnectionHandler.runPreparedUpdateBatch(this.update_version, batchedVersionUpdates);
+
+ // System.out.println(values.size());
+ //*/
+ }
+
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Branch List\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Parent Branch\" /></xWidgets>";
+ }
+
+ /**
+ * @param int1
+ * @param long1
+ * @param int2
+ * @param long2
+ * @param int3
+ * @param int4
+ * @param int5
+ * @param int6
+ */
+ private void addRelationEntry(int a_art_id, int b_art_id, int relLinkTypeId, int branchId, int relLinkId, long gammaId, int transactionId) {
+ RelationInfo info = relationInfo.get(a_art_id, b_art_id, relLinkTypeId, branchId);
+ if (info == null) {
+ info = new RelationInfo(a_art_id, b_art_id, relLinkTypeId, branchId);
+ relationInfo.put(a_art_id, b_art_id, relLinkTypeId, branchId, info);
+ }
+ info.add(gammaId, transactionId);
+ }
+
+ private class RelationInfo {
+ private final int rel_link_type;
+ private final int art_a;
+ private final int art_b;
+ private final List<Pair<Long, Integer>> relLinksToGammas;
+
+ RelationInfo(int a_art_id, int b_art_id, int relLinkTypeId, int branchId) {
+ this.rel_link_type = relLinkTypeId;
+ this.art_a = a_art_id;
+ this.art_b = b_art_id;
+ relLinksToGammas = new ArrayList<Pair<Long, Integer>>();
+ }
+
+ public void add(long gammaId, int transactionId) {
+ for (int i = 0; i < relLinksToGammas.size(); i++) {
+ if (relLinksToGammas.get(i).getKey().longValue() == gammaId && relLinksToGammas.get(i).getValue().intValue() == transactionId) {
+ return;
+ }
+ }
+ for (int i = 0; i < relLinksToGammas.size(); i++) {
+ if (transactionId > relLinksToGammas.get(i).getValue().intValue()) {
+ relLinksToGammas.add(i, new Pair<Long, Integer>(gammaId, transactionId));
+ return;
+ }
+ }
+ relLinksToGammas.add(new Pair<Long, Integer>(gammaId, transactionId));
+ }
+ }
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExportArtifacts.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExportArtifacts.java
new file mode 100644
index 00000000000..6933cc1b6e3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExportArtifacts.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.framework.ui.skynet.blam.operation;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExportArtifacts extends AbstractBlam {
+ private CharBackedInputStream charBak;
+ private ISheetWriter excelWriter;
+ private AttributeType[] attributeColumns;
+ private AttributeType nameAttributeType;
+ private static final int NUM_FIXED_COLUMNS = 4;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Export Artifacts";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ init();
+
+ List<Artifact> parentArtifacts = variableMap.getArtifacts("artifacts");
+ List<Artifact> artifacts;
+
+ if (variableMap.getBoolean("Include Children")) {
+ artifacts = new ArrayList<Artifact>(400);
+ for (Artifact artifact : parentArtifacts) {
+ artifacts.add(artifact);
+ artifacts.addAll(artifact.getDescendants());
+ }
+ } else {
+ artifacts = parentArtifacts;
+ }
+
+ mapAttributeTypeToColumn(artifacts);
+
+ String[] row = new String[attributeColumns.length + NUM_FIXED_COLUMNS];
+ excelWriter.startSheet("Artifacts", row.length);
+ excelWriter.writeCell("GUID");
+ excelWriter.writeCell("HRID");
+ excelWriter.writeCell("Artifact Type");
+ excelWriter.writeCell("Name");
+ for (AttributeType attributeType : attributeColumns) {
+ excelWriter.writeCell(attributeType.getName());
+ }
+ excelWriter.endRow();
+
+ for (Artifact artifact : artifacts) {
+ Arrays.fill(row, null);
+ row[0] = artifact.getGuid();
+ row[1] = artifact.getHumanReadableId();
+ row[2] = artifact.getArtifactTypeName();
+ row[3] = artifact.getDescriptiveName();
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ if (!attributeType.equals(nameAttributeType)) {
+ String value = artifact.getAttributesToString(attributeType.getName());
+ if (!value.equals("")) {
+ row[NUM_FIXED_COLUMNS + Arrays.binarySearch(attributeColumns, attributeType)] = value;
+ }
+ }
+ }
+ excelWriter.writeRow(row);
+ }
+
+ excelWriter.endSheet();
+ excelWriter.endWorkbook();
+ IFile iFile = OseeData.getIFile("artifacts" + Lib.getDateTimeString() + ".xml");
+ AIFile.writeToFile(iFile, charBak);
+ Program.launch(iFile.getLocation().toOSString());
+ }
+
+ private void mapAttributeTypeToColumn(List<Artifact> artifacts) throws OseeCoreException {
+ HashSet<AttributeType> attributeTypes = new HashSet<AttributeType>();
+
+ for (Artifact artifact : artifacts) {
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ attributeTypes.add(attributeType);
+ }
+ }
+
+ attributeTypes.remove(nameAttributeType);
+ attributeColumns = attributeTypes.toArray(new AttributeType[attributeTypes.size()]);
+ Arrays.sort(attributeColumns);
+ }
+
+ private void init() throws IOException, OseeDataStoreException, OseeTypeDoesNotExist {
+ nameAttributeType = AttributeTypeManager.getType("Name");
+ charBak = new CharBackedInputStream();
+ excelWriter = new ExcelXmlWriter(charBak.getWriter());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Include Children\" /><XWidget xwidgetType=\"XListDropViewer\" displayName=\"artifacts\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Select parameters below and click the play button at the top right.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Util");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExtractReqPriority.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExtractReqPriority.java
new file mode 100644
index 00000000000..a8cc28fe682
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ExtractReqPriority.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.framework.ui.skynet.blam.operation;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelSaxHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExtractReqPriority implements RowProcessor {
+ private HashMap<String, String> reqPriorities;
+
+ public ExtractReqPriority(String excelMlPath) throws UnsupportedEncodingException, FileNotFoundException, IOException, SAXException {
+ this.reqPriorities = new HashMap<String, String>();
+
+ File file = new File(excelMlPath);
+
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(new ExcelSaxHandler(this, true));
+ xmlReader.parse(new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8")));
+ }
+
+ public HashMap<String, String> getReqPriorities() {
+ return reqPriorities;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#detectedRowAndColumnCounts(int, int)
+ */
+ public void detectedRowAndColumnCounts(int rowCount, int columnCount) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#foundStartOfWorksheet(java.lang.String)
+ */
+ public void foundStartOfWorksheet(String sheetName) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#processCommentRow(java.lang.String[])
+ */
+ public void processCommentRow(String[] row) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#processEmptyRow()
+ */
+ public void processEmptyRow() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#processHeaderRow(java.lang.String[])
+ */
+ public void processHeaderRow(String[] row) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#processRow(java.lang.String[])
+ */
+ public void processRow(String[] row) {
+ // pick the highest priority specified in the workbook (in case there are multiple priorities for the same item)
+ if (row[1] != null) {
+ String priority = reqPriorities.get(row[1]);
+ if (priority != null) {
+ if (priority.compareTo(row[0]) > 0) {
+ return;
+ }
+ }
+ reqPriorities.put(row[1], row[0]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.RowProcessor#reachedEndOfWorksheet()
+ */
+ public void reachedEndOfWorksheet() {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindArtifactsWithMinAttributeContraintProblems.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindArtifactsWithMinAttributeContraintProblems.java
new file mode 100644
index 00000000000..808626b1605
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindArtifactsWithMinAttributeContraintProblems.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class FindArtifactsWithMinAttributeContraintProblems extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Find Artifacts With MinAttribute Contraint Problems";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("Parent Branch");
+ ArtifactQuery.getArtifactsFromBranch(branch, false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Branch List\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Parent Branch\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindInvalidUTF8Chars.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindInvalidUTF8Chars.java
new file mode 100644
index 00000000000..2f89973f843
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FindInvalidUTF8Chars.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.framework.ui.skynet.blam.operation;
+
+import static org.eclipse.osee.framework.db.connection.core.schema.SkynetDatabase.ATTRIBUTE_VERSION_TABLE;
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FindInvalidUTF8Chars extends AbstractBlam {
+ private static final String READ_ATTRIBUTE_VALUES = "SELECT art_id, value FROM " + ATTRIBUTE_VERSION_TABLE;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Find Invalid UTF8 Chars";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+
+ int count = 0;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(1000, READ_ATTRIBUTE_VALUES);
+ while (chStmt.next()) {
+ String value = chStmt.getString("value");
+ if (value != null) {
+ count++;
+ int length = value.length();
+ for (int i = 0; i < length; i++) {
+ char c = value.charAt(i);
+ // based on http://www.w3.org/TR/2006/REC-xml-20060816/#charsets
+ if ((c < 0x20 && c != 0x9 && c != 0xA && c != 0xD) || (c > 0xD7FF && c < 0xE000) || (c > 0xFFFD && c < 0x10000) || c > 0x10FFFF) {
+ System.out.println("artifact id: " + chStmt.getInt("art_id") + " char: " + (int) c);
+ }
+ }
+ }
+ }
+ } finally {
+ chStmt.close();
+ System.out.println("count: " + count);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FixTemplateContentArtifacts.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FixTemplateContentArtifacts.java
new file mode 100644
index 00000000000..ae4645401de
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/FixTemplateContentArtifacts.java
@@ -0,0 +1,379 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class FixTemplateContentArtifacts extends AbstractBlam {
+ private static final boolean DEBUG =
+ Boolean.parseBoolean(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Blam"));
+
+ private static final String GET_ATTRS =
+ "SELECT * FROM osee_attribute t1, osee_artifact t3 WHERE t1.attr_type_id = ? AND t1.art_id = t3.art_id AND t1.uri is not null";
+ private final Collection<String> badData = new LinkedList<String>();
+ private static final String[] columnHeaders = new String[] {"Corrupted Data"};
+
+ private static File createTempFolder() {
+ File rootDirectory = OseeData.getFile("FixTemplate_" + Lib.getDateTimeString() + File.separator);
+ rootDirectory.mkdirs();
+ return rootDirectory;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Fix Template Content Artifacts";
+ }
+
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ if (true) {
+ System.err.println("Only to be run by developer");
+ return;
+ }
+ File backupFolder = createTempFolder();
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format("Backup Folder location: [%s]",
+ backupFolder.getAbsolutePath()));
+
+ ArrayList<AttrData> attrDatas = loadAttrData();
+ int totalAttrs = attrDatas.size();
+
+ monitor.beginTask("Fix word template content", totalAttrs);
+
+ for (int index = 0; index < attrDatas.size(); index++) {
+ AttrData attrData = attrDatas.get(index);
+ monitor.subTask(String.format("[%s of %s] - hrid[%s]", index, totalAttrs, attrData.getHrid()));
+ Resource resource = getResource(attrData.getUri());
+
+ Element rootElement = null;
+ if (DEBUG) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format("Before Fix: %s", resource.data));
+ }
+
+ final Collection<Element> elements = new LinkedList<Element>();
+ final Collection<Element> sectPr = new LinkedList<Element>();
+ boolean fixedAttribute = false;
+ try {
+ Document doc = Jaxp.readXmlDocument("<ForFix>" + resource.data + "</ForFix>");
+ rootElement = doc.getDocumentElement();
+
+ NodeList nodeList = rootElement.getElementsByTagName("*");
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ Element element = (Element) nodeList.item(i);
+ if (element.getNodeName().endsWith("w:p")) {
+ elements.add(element);
+ }
+ if (element.getNodeName().endsWith("w:sectPr")) {
+ sectPr.add(element);
+ }
+ }
+ for (Element paragraph : elements) {
+ boolean badParagraph = isBadParagraph(paragraph);
+ if (badParagraph) {
+ paragraph.getParentNode().removeChild(paragraph);
+ }
+ fixedAttribute = fixedAttribute || badParagraph;
+ }
+ for (Element sect : sectPr) {
+ sect.getParentNode().removeChild(sect);
+ fixedAttribute = true;
+ }
+ } catch (Exception ex) {
+ badData.add(attrData.gammaId);
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format("Skiping File %s because of exception %s",
+ attrData.getHrid(), ex));
+ }
+
+ if (fixedAttribute) {
+ try {
+ // Backup File
+ backupResourceLocally(backupFolder, resource);
+
+ // Perform Fix
+ resource.data = new String(WordTemplateRenderer.getFormattedContent(rootElement), "UTF-8");
+ resource.encoding = "UTF-8";
+
+ // UploadResource
+ uploadResource(attrData.getGammaId(), resource);
+
+ if (DEBUG) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format(" After Fix : %s", resource.data));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format(
+ "Skiping File %s because of exception %s", attrData.getHrid(), ex));
+ }
+ }
+ monitor.worked(1);
+ }
+
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ for (String string : badData) {
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {string}));
+ }
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report("Fix bad data", Manipulations.RAW_HTML);
+
+ }
+
+ private ArrayList<AttrData> loadAttrData() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ArrayList<AttrData> attrData = new ArrayList<AttrData>();
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ATTRS,
+ AttributeTypeManager.getType(WordAttribute.WORD_TEMPLATE_CONTENT).getAttrTypeId());
+ while (chStmt.next()) {
+ attrData.add(new AttrData(chStmt.getString("gamma_Id"), chStmt.getString("human_readable_id"),
+ chStmt.getString("uri")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return attrData;
+ }
+
+ private static void uploadResource(String gammaId, Resource resource) throws Exception {
+ String fileName = resource.resourceName;
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("is.overwrite.allowed", String.valueOf(true));
+ parameterMap.put("protocol", "attr");
+ parameterMap.put("seed", gammaId);
+
+ String extension = Lib.getExtension(fileName);
+ if (Strings.isValid(extension)) {
+ parameterMap.put("extension", extension);
+ int charToRemove = extension.length() + 1;
+ fileName = fileName.substring(0, fileName.length() - charToRemove);
+ }
+ parameterMap.put("name", fileName);
+
+ byte[] toUpload = resource.data.getBytes(resource.encoding);
+ if (resource.wasZipped) {
+ toUpload = Lib.compressStream(new ByteArrayInputStream(toUpload), resource.entryName);
+ }
+
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+ HttpProcessor.put(new URL(urlString), new ByteArrayInputStream(toUpload), resource.result.getContentType(),
+ resource.result.getEncoding());
+ }
+
+ private Resource getResource(String resourcePath) throws OseeCoreException {
+ Resource toReturn = null;
+ ByteArrayOutputStream sourceOutputStream = new ByteArrayOutputStream();
+ try {
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("uri", resourcePath);
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+
+ AcquireResult result = HttpProcessor.acquire(new URL(urlString), sourceOutputStream);
+ if (result.getCode() == HttpURLConnection.HTTP_OK) {
+ toReturn = new Resource(resourcePath, result, sourceOutputStream.toByteArray());
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ try {
+ sourceOutputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ return toReturn;
+ }
+
+ private final class Resource {
+ private final String entryName;
+ private final String resourceName;
+ private final AcquireResult result;
+ private final byte[] rawBytes;
+ private final boolean wasZipped;
+ private final String sourcePath;
+
+ private String data;
+ private String encoding;
+
+ private Resource(String sourcePath, AcquireResult result, byte[] rawBytes) throws IOException {
+ this.rawBytes = rawBytes;
+ this.result = result;
+ int index = sourcePath.lastIndexOf('/');
+ this.sourcePath = sourcePath;
+ this.resourceName = sourcePath.substring(index + 1, sourcePath.length());
+ this.wasZipped = result.getContentType().contains("zip");
+ if (wasZipped) {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ this.entryName = decompressStream(new ByteArrayInputStream(rawBytes), outputStream);
+ this.encoding = "UTF-8";
+ this.data = new String(outputStream.toByteArray(), encoding);
+ } else {
+ this.data = new String(rawBytes, result.getEncoding());
+ this.entryName = null;
+ this.encoding = result.getEncoding();
+ }
+ }
+ }
+
+ private static void backupResourceLocally(File backupFolder, Resource resource) throws IOException {
+ InputStream inputStream = null;
+ OutputStream outputStream = null;
+ try {
+ String path = resource.sourcePath;
+ path = path.replaceAll("attr://", "");
+ path = path.replaceAll("/", Lib.isWindows() ? "\\\\" : "/");
+ File file = new File(backupFolder, path);
+ File parent = file.getParentFile();
+ if (parent != null) {
+ parent.mkdirs();
+ }
+ outputStream = new FileOutputStream(file);
+
+ inputStream = new ByteArrayInputStream(resource.rawBytes);
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+
+ private static String decompressStream(InputStream inputStream, OutputStream outputStream) throws IOException {
+ String zipEntryName = null;
+ ZipInputStream zipInputStream = null;
+ try {
+ zipInputStream = new ZipInputStream(inputStream);
+ ZipEntry entry = zipInputStream.getNextEntry();
+ zipEntryName = entry.getName();
+ // Transfer bytes from the ZIP file to the output file
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = zipInputStream.read(buf)) > 0) {
+ outputStream.write(buf, 0, len);
+ }
+ } finally {
+ if (zipInputStream != null) {
+ zipInputStream.close();
+ }
+ }
+ return zipEntryName;
+ }
+
+ //To handle the case of sub-sections
+ private boolean isBadParagraph(Element paragraph) throws OseeCoreException {
+ boolean badParagraph = false;
+ String content = paragraph.getTextContent();
+ if (content != null && content.contains("LISTNUM \"listreset\"")) {
+ badParagraph = true;
+ }
+
+ return badParagraph;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ class AttrData {
+ private final String gammaId;
+ private final String hrid;
+ private final String uri;
+
+ public AttrData(String gammaId, String hrid, String uri) {
+ super();
+ this.gammaId = gammaId;
+ this.hrid = hrid;
+ this.uri = uri;
+ }
+
+ public String getGammaId() {
+ return gammaId;
+ }
+
+ public String getHrid() {
+ return hrid;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ImageCaptureBlam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ImageCaptureBlam.java
new file mode 100644
index 00000000000..f5241d226d7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ImageCaptureBlam.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ImageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * Capture an image within the bounds of OSEE workbench.
+ *
+ * @author Donald G. Dunne
+ */
+public class ImageCaptureBlam extends AbstractBlam {
+
+ public Point topLeftPoint;
+ public Point botRightPoint;
+ public boolean listenerAdded = false;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Image Capture";
+ }
+
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ System.out.println("Starting Image Capture...");
+ topLeftPoint = null;
+ botRightPoint = null;
+ Display.getDefault().addFilter(SWT.MouseUp, displayKeysListener);
+ }
+ });
+ }
+ Listener displayKeysListener = new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ if (event.type == SWT.MouseUp) {
+ if (topLeftPoint == null) {
+ topLeftPoint = event.display.getCursorLocation();
+ print("\nFirst Mouse Event " + topLeftPoint + "\n");
+ } else {
+ botRightPoint = event.display.getCursorLocation();
+ print("Second Mouse Event " + botRightPoint + "\n");
+ GC gc = new GC(Display.getCurrent());
+ Image image =
+ new Image(Display.getCurrent(), botRightPoint.x - topLeftPoint.x, botRightPoint.y - topLeftPoint.y);
+ gc.copyArea(image, topLeftPoint.x, topLeftPoint.y);
+ gc.dispose();
+ Display.getDefault().removeFilter(SWT.MouseUp, displayKeysListener);
+ ImageDialog diag = new ImageDialog(image, Display.getCurrent().getActiveShell());
+ diag.open();
+ }
+ }
+ }
+ };
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Mouse Down on top left location, Mouse Up on bottom right. Only works within bounds of workbench window.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Util");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/LoadAllArtifactsOnBranch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/LoadAllArtifactsOnBranch.java
new file mode 100644
index 00000000000..9dfb7bccca6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/LoadAllArtifactsOnBranch.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class LoadAllArtifactsOnBranch extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Load All Artifacts On Branch";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("Parent Branch");
+ ArtifactQuery.getArtifactsFromBranch(branch, false);
+ }
+
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Branch List\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Parent Branch\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin.Health");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ParseWindowsDirectoryListing.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ParseWindowsDirectoryListing.java
new file mode 100644
index 00000000000..84aec75ff18
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ParseWindowsDirectoryListing.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.framework.ui.skynet.blam.operation;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ParseWindowsDirectoryListing extends AbstractBlam {
+ private static final String DIRECTORY_PREFIX = " Directory of Y:\\";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Parse Windows Directory Listing";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ String listingFile = variableMap.getString("Directory Listing File");
+ Matcher matcher = Pattern.compile("(\\d+/\\d+/\\d+).*<DIR>.*?SW\\\\(\\S+)\\s+(.*)").matcher("");
+ BufferedWriter writer = new BufferedWriter(new FileWriter(Lib.removeExtension(listingFile) + ".csv"));
+
+ String path = null;
+ for (String line : Lib.readListFromFile(listingFile)) {
+ if (line.startsWith(DIRECTORY_PREFIX)) {
+ path = line.substring(DIRECTORY_PREFIX.length());
+ } else {
+ matcher.reset(line);
+ if (matcher.find()) {
+ String summary = matcher.group(1) + "|" + matcher.group(2) + "|" + path + "\\" + matcher.group(3);
+ if (!summary.endsWith(".")) {
+ writer.write(summary);
+ writer.write(Lib.lineSeparator);
+ }
+ }
+ }
+ }
+ writer.close();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Directory Listing File\" defaultValue=\"c:\\UserData\\cte.txt\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Util");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PruneWorkspace.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PruneWorkspace.java
new file mode 100644
index 00000000000..db7d325963f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PruneWorkspace.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.framework.ui.skynet.blam.operation;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PruneWorkspace extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Prune Workspace";
+ }
+
+ /**
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap,
+ * org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ File keeperFile = new File(variableMap.getString("Preserve List File"));
+ File workspacePath = new File(variableMap.getString("Workspace Path"));
+ String filePathPattern = variableMap.getString("File Path Pattern");
+
+ ArrayList<String> preserveList = Lib.readListFromFile(keeperFile, true);
+ HashSet<String> preserveSet = new HashSet<String>(preserveList);
+
+ List<File> files = Lib.recursivelyListFiles(workspacePath, Pattern.compile(filePathPattern));
+ for (File file : files) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ if (!preserveSet.contains(file.getName())) {
+ file.delete();
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Preserve List File\" /><XWidget xwidgetType=\"XText\" displayName=\"Workspace Path\" /><XWidget xwidgetType=\"XText\" displayName=\"File Path Pattern\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("OTE");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeArtifactType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeArtifactType.java
new file mode 100644
index 00000000000..3c6b15f5848
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeArtifactType.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PurgeArtifactType extends AbstractBlam {
+ private boolean convertArtifacts;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Purge Artifact Type";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Collection<ArtifactType> purgeArtifactTypes =
+ variableMap.getCollection(ArtifactType.class, "Artifact Type(s) to purge");
+ convertArtifacts = variableMap.getBoolean("Convert Artifacts");
+ ArtifactType newArtifactType = convertArtifacts ? variableMap.getArtifactType("New Artifact Type") : null;
+
+ ArtifactTypeManager.purgeArtifactTypesWithCheck(purgeArtifactTypes, newArtifactType);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"Artifact Type(s) to purge\" /><XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Convert Artifacts\" /><XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"New Artifact Type\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Purge an artifact type. Will find artifacts (if any) of this type on all branches and switch their type to the specified type. Then purge the artifact type ";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeAttributeType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeAttributeType.java
new file mode 100644
index 00000000000..2d6782911a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeAttributeType.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PurgeAttributeType extends AbstractBlam {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Purge Attribute Type";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Collection<AttributeType> purgeAttributeTypes =
+ variableMap.getCollection(AttributeType.class, "Attribute Type(s) to purge");
+
+ for (AttributeType attributeType : purgeAttributeTypes) {
+ AttributeTypeManager.purgeAttributeType(attributeType);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XAttributeTypeListViewer\" displayName=\"Attribute Type(s) to purge\" multiSelect=\"true\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Purge an attribute type.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeDeletedAttributes.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeDeletedAttributes.java
new file mode 100644
index 00000000000..b2890c4787c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeDeletedAttributes.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PurgeDeletedAttributes extends AbstractBlam {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Purge Deleted Attributes";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("Branch");
+ Collection<AttributeType> purgeAttributeTypes =
+ variableMap.getCollection(AttributeType.class, "Attribute Type(s) to purge");
+
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromBranch(branch, ArtifactLoad.ALL_CURRENT, true);
+
+ StringBuilder strB = new StringBuilder();
+
+ for (Artifact artifact : artifacts) {
+ for (AttributeType attributeType : purgeAttributeTypes) {
+ for (Attribute<?> attribute : artifact.getAttributesIncludeDeleted(attributeType.getName())) {
+
+ strB.append(attribute.getAttributeType());
+ strB.append(";");
+ strB.append(artifact.getArtId());
+ strB.append(";");
+ strB.append(attribute.getDisplayableString());
+ strB.append("\n");
+ attribute.purge();
+
+ }
+ }
+ }
+
+ IFile iFile = OseeData.getIFile("PurgeDeletedAttributes" + Lib.getDateTimeString() + ".txt");
+ AIFile.writeToFile(iFile, strB.toString());
+ Program.launch(iFile.getLocation().toOSString());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XBranchSelectWidget\" defaultValue=\"Common\" displayName=\"Branch\" /><XWidget xwidgetType=\"XAttributeTypeListViewer\" displayName=\"Attribute Type(s) to purge\" multiSelect=\"true\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Purge all deleted attributes of specified type(s).";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeTransaction.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeTransaction.java
new file mode 100644
index 00000000000..058891666b8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/PurgeTransaction.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.PurgeTransactionJob;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class PurgeTransaction extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Delete Transaction";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ List<Integer> txs = Lib.stringToIntegerList(variableMap.getString("Transaction List"));
+ boolean force = variableMap.getBoolean("Force Delete");
+ int[] txIds = new int[txs.size()];
+ for (int index = 0; index < txs.size(); index++) {
+ txIds[index] = txs.get(index);
+ }
+ Job job = new PurgeTransactionJob(force, txIds);
+ Jobs.startJob(job);
+ job.join();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XText\" displayName=\"Transaction List\" />");
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"Force Delete\" />");
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/RelationOrderAnalysisOnBranch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/RelationOrderAnalysisOnBranch.java
new file mode 100644
index 00000000000..2478cc18b0f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/RelationOrderAnalysisOnBranch.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+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 java.util.regex.Matcher;
+import java.util.regex.Pattern;
+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.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactCache;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RelationOrderAnalysisOnBranch extends AbstractBlam {
+ private static Matcher getIds = Pattern.compile(".*?artId\\[(\\d+?)\\].*?relTypeId\\[(\\d+?)\\].*").matcher("");
+ final List<String> messages = new ArrayList<String>();
+ private final Map<Branch, Map<Integer, ArtifactOrder>> branchToArtifactsToSort =
+ new HashMap<Branch, Map<Integer, ArtifactOrder>>();
+ private Branch currentBranch;
+
+ private class ArtifactOrder {
+ Set<Integer> unsortedRelTypeIds = new HashSet<Integer>();
+ }
+
+ private final ILoggerListener listener = new ILoggerListener() {
+
+ @Override
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ if (loggerName.equals(RelationManager.class.getName())) {
+ messages.add(message);
+ getIds.reset(message);
+ if (getIds.matches()) {
+ int artId = Integer.parseInt(getIds.group(1));
+ int relTypeId = Integer.parseInt(getIds.group(2));
+ ArtifactOrder artOrder = branchToArtifactsToSort.get(currentBranch).get(artId);
+ if (artOrder == null) {
+ artOrder = new ArtifactOrder();
+ branchToArtifactsToSort.get(currentBranch).put(artId, artOrder);
+ }
+ artOrder.unsortedRelTypeIds.add(relTypeId);
+ }
+ }
+ }
+
+ };
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Relation Order Analysis On Branch";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#
+ * runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap,
+ * org.eclipse.osee.framework.skynet.core.artifact.Branch,
+ * org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ print("\nCurrent Status:\n\n");
+ for (Branch branch : branchToArtifactsToSort.keySet()) {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ print(String.format("We have %d artifacts that have unsorted relations on branch %s.",
+ branchToArtifactsToSort.get(branch).size(), branch.getBranchName()));
+
+ Map<Integer, ArtifactOrder> artifactOrder = branchToArtifactsToSort.get(branch);
+ for (Integer artId : artifactOrder.keySet()) {
+ ArtifactOrder relTypes = artifactOrder.get(artId);
+ Artifact art = ArtifactCache.getActive(artId, branch);
+ if (art != null) {
+ for (Integer relTypeId : relTypes.unsortedRelTypeIds) {
+ List<RelationLink> relations = art.getRelations(RelationTypeManager.getType(relTypeId));
+ int lastArtId = -1;
+ for (RelationLink link : relations) {
+ if (!link.isDeleted()) {
+ System.out.println(link.getOrder(link.getSide(art).oppositeSide()));
+ if (link.getOrder(link.getSide(art).oppositeSide()) != lastArtId) {
+ link.setOrder(link.getSide(art).oppositeSide(), lastArtId);
+ }
+ lastArtId = link.getArtifactId(link.getSide(art).oppositeSide());
+ }
+ }
+ }
+ art.persistRelations(transaction);
+ }
+ }
+ System.out.println("stop");
+ transaction.execute();
+ }
+ }
+
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Branch List\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" /></xWidgets>";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#
+ * getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "This will analyze the selected branch for unsorted artifacts and save that report to .osee.data/relationOrder_<branch_name>.txt. It also allows you to save all of the relations that are unsorted based on their current order in memory.";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#
+ * widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * org.eclipse.osee
+ * .framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout,
+ * org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreated(XWidget widget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreated(widget, toolkit, art, dynamicXWidgetLayout, modListener, isEditable);
+ if (widget.getLabel().equals("Branch")) {
+ final XBranchSelectWidget branchSelection = (XBranchSelectWidget) widget;
+
+ branchSelection.addListener(new Listener() {
+
+ @Override
+ public void handleEvent(Event event) {
+ final Branch branch = branchSelection.getData();
+ currentBranch = branch;
+ branchToArtifactsToSort.clear();//do this so we can only do one branch - it makes the txs easier
+ Map<Integer, ArtifactOrder> artifactsToSort = branchToArtifactsToSort.get(currentBranch);
+ if (artifactsToSort == null) {
+ artifactsToSort = new HashMap<Integer, ArtifactOrder>();
+ branchToArtifactsToSort.put(currentBranch, artifactsToSort);
+ } else {
+ artifactsToSort.clear();
+ }
+
+ Jobs.startJob(new Job(String.format("Analyizing %s for unsorted relations.", branch.getBranchName())) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+
+ OseeLog.registerLoggerListener(listener);
+ ArtifactQuery.reloadArtifactsFromBranch(branch, false);
+ OseeLog.unregisterLoggerListener(listener);
+
+ File branchReport =
+ OseeData.getFile(String.format("relationOrder_%s.txt", branch.getBranchShortName()));
+ FileOutputStream fos = new FileOutputStream(branchReport);
+ for (String msg : messages) {
+ fos.write(msg.getBytes());
+ fos.write("\n".getBytes());
+ }
+ fos.close();
+ messages.clear();
+ } catch (Throwable th) {
+ OseeLog.log(RelationOrderAnalysisOnBranch.class, Level.SEVERE, th);
+ return Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
+ }
+ });
+ }
+ });
+ }
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ReportAttributeTypesUsageBlam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ReportAttributeTypesUsageBlam.java
new file mode 100644
index 00000000000..ce5478828d5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ReportAttributeTypesUsageBlam.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ReportAttributeTypesUsageBlam extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Report Attribute Types Usage";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ monitor.beginTask("Report Usage of AttributeTypes on Branch", IProgressMonitor.UNKNOWN);
+
+ XResultData xResultData = new XResultData();
+ Branch branch = variableMap.getBranch("Branch");
+ xResultData.log(getName() + " " + branch.getBranchName());
+ xResultData.addRaw(AHTML.beginMultiColumnTable(100, 1));
+ xResultData.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"AttributeType", "Occurances"}));
+ for (AttributeType attributeType : AttributeTypeManager.getAllTypes()) {
+ Collection<Artifact> arts = ArtifactQuery.getArtifactsFromAttributeType(attributeType.getName(), branch);
+ xResultData.addRaw(AHTML.addRowMultiColumnTable(attributeType.getName(), String.valueOf(arts.size())));
+ }
+ xResultData.addRaw(AHTML.endMultiColumnTable());
+ xResultData.report(getName() + " " + branch.getBranchName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Performs ArtifactQuery search on all attribyte types for a selected branch and reports usage by \"current\" artifacts.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ResourceManipulation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ResourceManipulation.java
new file mode 100644
index 00000000000..d095e4fa61b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ResourceManipulation.java
@@ -0,0 +1,471 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class ResourceManipulation extends AbstractBlam {
+ private static final boolean DEBUG =
+ Boolean.parseBoolean(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Blam"));
+
+ //"SELECT DISTINCT uri, human_readable_id, txs.gamma_id FROM osee_txs txs, osee_attribute t1, osee_artifact t3 WHERE t1.attr_type_id = ? AND t1.art_id = t3.art_id AND t1.uri is not null AND t1.gamma_id = txs.gamma_id and txs.tx_current = 1 AND txs.gamma_id > 4211835";
+ // private static final String GET_ATTRS =
+ // "SELECT DISTINCT uri, human_readable_id, txs.gamma_id FROM osee_tx_details det, osee_branch brn, osee_txs txs, osee_attribute t1, osee_artifact t3 WHERE t1.attr_type_id = ? AND t1.art_id = t3.art_id AND t1.uri is not null AND t1.gamma_id = txs.gamma_id and txs.transaction_id = det.transaction_id AND det.branch_id = brn.branch_id AND branch_type in (1,2) AND txs.gamma_id > 4211835";
+
+ private static final String GET_ATTRS =
+ "SELECT * FROM osee_attribute t1, osee_artifact t3 WHERE t1.attr_type_id = ? AND t1.art_id = t3.art_id AND t1.uri is not null";
+ private static final String GET_ATTRS_TEST = GET_ATTRS + " AND t1.gamma_id = 4259157";
+
+ private final Collection<String> badData = new LinkedList<String>();
+ private static final String[] columnHeaders = new String[] {"Corrupted Data"};
+
+ private static File createTempFolder() {
+ File rootDirectory = OseeData.getFile("FixTemplate_" + Lib.getDateTimeString() + File.separator);
+ rootDirectory.mkdirs();
+ return rootDirectory;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Resource Manipulation";
+ }
+
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ File backupFolder = createTempFolder();
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format("Backup Folder location: [%s]",
+ backupFolder.getAbsolutePath()));
+
+ if (true) {
+ System.out.println("An admin must enable this operation");
+ return;
+ }
+ ArrayList<AttrData> attrDatas = loadAttrData();
+ monitor.beginTask("Fix word template content", attrDatas.size());
+ for (AttrData attrData : attrDatas) {
+ monitor.subTask(attrData.getHrid());
+ Resource resource = getResource(attrData.getUri());
+ byte[] originalData = resource.data;
+ byte[] finalVersion = new byte[0];
+ int count = 0;
+ int countlast = 0;
+ System.out.println(" " + attrData.getUri() + " " + attrData.getGammaId());
+ List<Byte> badByteBuffer = new LinkedList<Byte>();
+ int byteCount = 0;
+ int initialByte = 0;
+ int startByte = 0;
+ for (byte byt : originalData) {
+ if (byt < 0) {
+ if (count == 0) {
+ initialByte = byteCount;
+ badByteBuffer.clear();
+ }
+ badByteBuffer.add(new Byte(byt).byteValue());
+ String value = UnicodeConverter.getValue(badByteBuffer);
+ if (value != null) {
+ if (value.contains("GOOD")) {
+ System.out.println(String.format(" Found the Clean Value %s", value));
+ System.out.print(" ");
+ for (byte byter : badByteBuffer) {
+ System.out.print(byter + ", ");
+ }
+ System.out.println();
+ } else {
+ byte[] goodBytes = UnicodeConverter.getGoodBytes(value);
+ System.out.println(String.format(" Found the Value %s", value));
+ System.out.print(" ");
+ finalVersion = fixBytes(startByte, initialByte, goodBytes, finalVersion, originalData);
+ startByte = finalVersion.length + 1;
+ for (byte byter : badByteBuffer) {
+ System.out.print(byter + ", ");
+ }
+ System.out.println();
+ System.out.print(" ");
+ for (byte byter : goodBytes) {
+ System.out.print(byter + ", ");
+ }
+ System.out.println();
+ startByte = byteCount + 1;
+ }
+ count = 0;
+ } else {
+ count++;
+ }
+ } else {
+ if (count > 0) {
+ System.out.println("Couldn't Find the Value for");
+ for (byte byter : badByteBuffer) {
+ System.out.print(byter + ", ");
+ }
+ System.out.println("");
+ }
+ count = 0;
+ badByteBuffer.clear();
+ }
+ byteCount++;
+
+ //Need to add on the tail if needs be
+ }
+
+ finalVersion = addTail(startByte, finalVersion, originalData);
+ count = 0;
+ countlast = 0;
+ System.out.println("ORIGINAL");
+ for (byte byt : originalData) {
+ count++;
+ if (byt < 0) {
+ if (countlast + 1 != count) {
+ System.out.println("");
+ }
+ System.out.println(count + " " + byt + " " + new String(
+ new byte[] {originalData[count - 8], originalData[count - 7], originalData[count - 6],
+ originalData[count - 5], originalData[count - 4], originalData[count - 3],
+ originalData[count - 2], originalData[count - 1], originalData[count],
+ originalData[count + 1], originalData[count + 2], originalData[count + 3],
+ originalData[count + 4], originalData[count + 5], originalData[count + 6]}, "UTF-8"));
+ countlast = count;
+ }
+ }
+
+ System.out.println("FIXED");
+ count = 0;
+ countlast = 0;
+ for (byte byt : finalVersion) {
+ count++;
+ if (byt < 0) {
+ if (countlast + 1 != count) {
+ System.out.println("");
+ }
+ System.out.println(count + " " + byt + " " + new String(new byte[] {finalVersion[count - 9],
+ finalVersion[count - 8], finalVersion[count - 7], finalVersion[count - 6],
+ finalVersion[count - 5], finalVersion[count - 4], finalVersion[count - 3],
+ finalVersion[count - 2], finalVersion[count - 1], finalVersion[count], finalVersion[count + 1],
+ finalVersion[count + 2], finalVersion[count + 3], finalVersion[count + 4],
+ finalVersion[count + 5], finalVersion[count + 6]}, "UTF-8"));
+ countlast = count;
+ }
+ }
+
+ try {
+ // Backup File
+ backupResourceLocally(backupFolder, resource);
+
+ // Perform Fix
+
+ resource.data = finalVersion;
+ // = new String(WordTemplateRenderer.getFormattedContent(rootElement), "UTF-8");
+ // resource.encoding = "UTF-8";
+ //
+
+ // UploadResource
+ uploadResource(attrData.getGammaId(), resource);
+
+ if (DEBUG) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format(" After Fix : %s", resource.data));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format("Skiping File %s because of exception %s",
+ attrData.getHrid(), ex));
+ }
+ monitor.worked(1);
+ }
+
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ for (String string : badData) {
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {string}));
+ }
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report("Fix bad data", Manipulations.RAW_HTML);
+ }
+
+ /**
+ * @param startByte
+ * @param initialByte
+ * @param goodBytes
+ * @param finalVersion
+ * @return
+ */
+ private byte[] fixBytes(int startByte, int initialByte, byte[] goodBytes, byte[] finalVersion, byte[] originalData) {
+ byte[] fixed = new byte[(initialByte - startByte) + goodBytes.length + finalVersion.length];
+ int count = 0;
+ for (byte byt : finalVersion) {
+ fixed[count] = byt;
+ count++;
+ }
+ for (int x = startByte; x < initialByte; x++) {
+ fixed[count] = originalData[x];
+ count++;
+ }
+ for (byte byt : goodBytes) {
+ fixed[count] = byt;
+ count++;
+ }
+ return fixed;
+ }
+
+ /**
+ * @param startByte
+ * @param initialByte
+ * @param goodBytes
+ * @param finalVersion
+ * @return
+ */
+ private byte[] addTail(int startByte, byte[] finalVersion, byte[] originalData) {
+ byte[] fixed = new byte[(originalData.length - startByte) + finalVersion.length];
+ int count = 0;
+ for (byte byt : finalVersion) {
+ fixed[count] = byt;
+ count++;
+ }
+ for (int x = startByte; x < originalData.length; x++) {
+ fixed[count] = originalData[x];
+ count++;
+ }
+ return fixed;
+ }
+
+ private ArrayList<AttrData> loadAttrData() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ ArrayList<AttrData> attrData = new ArrayList<AttrData>();
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ATTRS_TEST,
+ AttributeTypeManager.getType(WordAttribute.WORD_TEMPLATE_CONTENT).getAttrTypeId());
+ while (chStmt.next()) {
+ attrData.add(new AttrData(chStmt.getString("gamma_Id"), chStmt.getString("human_readable_id"),
+ chStmt.getString("uri")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return attrData;
+ }
+
+ private static void uploadResource(String gammaId, Resource resource) throws Exception {
+ String fileName = resource.resourceName;
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("is.overwrite.allowed", String.valueOf(true));
+ parameterMap.put("protocol", "attr");
+ parameterMap.put("seed", gammaId);
+
+ String extension = Lib.getExtension(fileName);
+ if (Strings.isValid(extension)) {
+ parameterMap.put("extension", extension);
+ int charToRemove = extension.length() + 1;
+ fileName = fileName.substring(0, fileName.length() - charToRemove);
+ }
+ parameterMap.put("name", fileName);
+
+ byte[] toUpload = resource.data;
+ if (resource.wasZipped) {
+ toUpload = Lib.compressStream(new ByteArrayInputStream(toUpload), resource.entryName);
+ }
+
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+ HttpProcessor.put(new URL(urlString), new ByteArrayInputStream(toUpload), resource.result.getContentType(),
+ resource.result.getEncoding());
+ }
+
+ private Resource getResource(String resourcePath) throws OseeCoreException {
+ Resource toReturn = null;
+ ByteArrayOutputStream sourceOutputStream = new ByteArrayOutputStream();
+ try {
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("uri", resourcePath);
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+
+ AcquireResult result = HttpProcessor.acquire(new URL(urlString), sourceOutputStream);
+ if (result.getCode() == HttpURLConnection.HTTP_OK) {
+ toReturn = new Resource(resourcePath, result, sourceOutputStream.toByteArray());
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ try {
+ sourceOutputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ return toReturn;
+ }
+
+ private final class Resource {
+ private final String entryName;
+ private final String resourceName;
+ private final AcquireResult result;
+ private final byte[] rawBytes;
+ private final boolean wasZipped;
+ private final String sourcePath;
+
+ private byte[] data;
+ private String encoding;
+
+ private Resource(String sourcePath, AcquireResult result, byte[] rawBytes) throws IOException {
+ this.rawBytes = rawBytes;
+ this.result = result;
+ int index = sourcePath.lastIndexOf('/');
+ this.sourcePath = sourcePath;
+ this.resourceName = sourcePath.substring(index + 1, sourcePath.length());
+ this.wasZipped = result.getContentType().contains("zip");
+ if (wasZipped) {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ this.entryName = decompressStream(new ByteArrayInputStream(rawBytes), outputStream);
+ this.encoding = "UTF-8";
+ this.data = outputStream.toByteArray();
+ } else {
+ this.data = rawBytes;
+ this.entryName = null;
+ this.encoding = result.getEncoding();
+ }
+ }
+ }
+
+ private static void backupResourceLocally(File backupFolder, Resource resource) throws IOException {
+ InputStream inputStream = null;
+ OutputStream outputStream = null;
+ try {
+ String path = resource.sourcePath.replace("attr://", "");
+ //path = path.replaceAll("/", File.separator);
+
+ File file = new File(backupFolder, path);
+ file.getParentFile().mkdirs();
+
+ outputStream = new FileOutputStream(file);
+
+ inputStream = new ByteArrayInputStream(resource.rawBytes);
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+
+ private static String decompressStream(InputStream inputStream, OutputStream outputStream) throws IOException {
+ String zipEntryName = null;
+ ZipInputStream zipInputStream = null;
+ try {
+ zipInputStream = new ZipInputStream(inputStream);
+ ZipEntry entry = zipInputStream.getNextEntry();
+ zipEntryName = entry.getName();
+ // Transfer bytes from the ZIP file to the output file
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = zipInputStream.read(buf)) > 0) {
+ outputStream.write(buf, 0, len);
+ }
+ } finally {
+ if (zipInputStream != null) {
+ zipInputStream.close();
+ }
+ }
+ return zipEntryName;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ class AttrData {
+ private final String gammaId;
+ private final String hrid;
+ private final String uri;
+
+ public AttrData(String gammaId, String hrid, String uri) {
+ super();
+ this.gammaId = gammaId;
+ this.hrid = hrid;
+ this.uri = uri;
+ }
+
+ public String getGammaId() {
+ return gammaId;
+ }
+
+ public String getHrid() {
+ return hrid;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SetRequirementCategory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SetRequirementCategory.java
new file mode 100644
index 00000000000..88e81e6f3d5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SetRequirementCategory.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SetRequirementCategory extends AbstractBlam {
+ private HashMap<String, String> reqPriorities;
+ private final HashMap<String, Artifact> reqs = new HashMap<String, Artifact>();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Set Requirement Category";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ monitor.beginTask("Generating Reports", 100);
+
+ Branch branch = variableMap.getBranch("Branch");
+ String excelMlPath = variableMap.getString("ExcelML Priority File");
+ boolean bulkLoad = variableMap.getBoolean("Bulk Load");
+
+ ExtractReqPriority extractor = new ExtractReqPriority(excelMlPath);
+ reqPriorities = extractor.getReqPriorities();
+
+ if (bulkLoad) {
+ for (Artifact req : ArtifactQuery.getArtifactsFromType(Requirements.SOFTWARE_REQUIREMENT, branch)) {
+ reqs.put(req.getDescriptiveName().trim(), req);
+ }
+ }
+
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ for (String requirementName : reqPriorities.keySet()) {
+ updateCategory(transaction, bulkLoad, branch, requirementName.trim());
+ }
+ transaction.execute();
+ }
+
+ private void updateCategory(SkynetTransaction transaction, boolean bulkLoad, Branch branch, String requirementName) throws OseeCoreException {
+ try {
+ Artifact requirement;
+ if (bulkLoad) {
+ requirement = reqs.get(requirementName);
+ if (requirement == null) {
+ throw new ArtifactDoesNotExist("cant' find " + requirementName);
+ }
+ } else {
+ requirement =
+ ArtifactQuery.getArtifactFromTypeAndName(Requirements.SOFTWARE_REQUIREMENT, requirementName, branch);
+ }
+
+ if (requirement.isOrphan()) {
+ throw new MultipleArtifactsExist(requirement.getDescriptiveName());
+ } else {
+ requirement.setSoleAttributeValue("Category", reqPriorities.get(requirementName));
+ requirement.persistAttributes(transaction);
+ }
+ } catch (MultipleArtifactsExist ex) {
+ List<Artifact> artiafcts =
+ ArtifactQuery.getArtifactsFromTypeAndName(Requirements.SOFTWARE_REQUIREMENT, requirementName, branch);
+ for (Artifact requirement : artiafcts) {
+ if (requirement.isOrphan()) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, requirement + " is an orphan");
+ } else {
+ requirement.setSoleAttributeValue("Category", reqPriorities.get(requirementName));
+ requirement.persistAttributes(transaction);
+ }
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XCheckBox\" horizontalLabel=\"true\" labelAfter=\"true\" displayName=\"Bulk Load\" /><XWidget xwidgetType=\"XText\" displayName=\"ExcelML Priority File\" defaultValue=\"C:/UserData/RequirementCategories.xml\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"Branch\" defaultValue=\"Block III - FTB2\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Sets the Category attribute on software requirements.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ShowRevertTransactions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ShowRevertTransactions.java
new file mode 100644
index 00000000000..bedc53be1da
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ShowRevertTransactions.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Theron Virgin
+ */
+public class ShowRevertTransactions extends AbstractBlam {
+ private static final String GET_REVERT_TRANSACTIONS =
+ "Select DISTINCT Branch_id, Value, txs.transaction_id, Time FROM osee_removed_txs txs, osee_tx_details det, osee_attribute attr, osee_txs txs1 WHERE txs.transaction_id = det.transaction_id AND det.author = attr.art_id AND attr.attr_type_id = 30 AND attr.gamma_id = txs1.gamma_id AND txs1.tx_current = 1 ORDER BY time";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Show Revert Transactions";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Branch ID", "User", "Transaction_ID", "Date"}));
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ chStmt.runPreparedQuery(GET_REVERT_TRANSACTIONS);
+ while (chStmt.next()) {
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {String.valueOf(chStmt.getInt("branch_id")),
+ chStmt.getString("value"), String.valueOf(chStmt.getInt("transaction_id")),
+ chStmt.getDate("time").toString()}));
+ }
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report("Revert Transactions", Manipulations.RAW_HTML);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SortRelationsByBranch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SortRelationsByBranch.java
new file mode 100644
index 00000000000..be7ac5b42a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SortRelationsByBranch.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.skynet.blam.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Roberto E. Escobar
+ */
+public class SortRelationsByBranch extends AbstractBlam {
+ private static final String UPDATE_B_ORDER = "update osee_relation_link set b_order = ? where gamma_id = ?";
+ private static final String SELECT_B_RELATION_ORDER =
+ "select rel1.rel_link_type_id, rel1.a_art_id as art_id1, txd1.branch_id, rel1.b_order as order1, txs1.gamma_id, rel1.b_art_id as art_id2, rel1.a_order_value as order2 from osee_tx_details txd1, osee_relation_link rel1, osee_txs txs1 where txd1.branch_id = ? and txd1.transaction_id = txs1.transaction_id and txs1.gamma_id = rel1.gamma_id and txs1.tx_current = 1 order by txd1.branch_id, rel1.rel_link_type_id, rel1.a_art_id, rel1.a_order_value";
+ private static final String SELECT_A_RELATION_ORDER =
+ "select rel1.rel_link_type_id, rel1.b_art_id as art_id1, txd1.branch_id, rel1.a_order as order1, txs1.gamma_id, rel1.a_art_id as art_id2, rel1.b_order_value as order2 from osee_tx_details txd1, osee_relation_link rel1, osee_txs txs1 where txd1.branch_id = ? and txd1.transaction_id = txs1.transaction_id and txs1.gamma_id = rel1.gamma_id and txs1.tx_current = 1 order by txd1.branch_id, rel1.rel_link_type_id, rel1.b_art_id, rel1.b_order_value";
+ private static final String UPDATE_A_ORDER = "update osee_relation_link set a_order = ? where gamma_id = ?";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Sort Relations By Branch";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ int totalWork = 0;
+ monitor.beginTask(getName(), totalWork);
+
+ List<Branch> branchesToSort = BranchManager.getTopLevelBranches();
+
+ for (Branch branch : branchesToSort) {
+ IOperation op = new UpdateRelationsSortOrder(branch);
+ monitor.setTaskName("Executing: [UpdateRelationsSortOrder] " + branch.getBranchName());
+ op.execute(monitor, 0);
+ monitor.setTaskName("");
+ }
+ }
+ private interface IOperation {
+ int getTotalWork();
+
+ void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception;
+ }
+
+ private final class UpdateRelationsSortOrder implements IOperation {
+ int totalModCount = 0;
+
+ Branch branchToSort;
+
+ /**
+ * @param branch
+ */
+ public UpdateRelationsSortOrder(Branch branch) {
+ branchToSort = branch;
+ }
+
+ @Override
+ public void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception {
+ IProgressMonitor subMonitor = new SubProgressMonitor(monitor, getTotalWork());
+ totalModCount = 0;
+ subMonitor.beginTask("Update Relation Sort Order", getTotalWork());
+ updateRelationsSortOrder(subMonitor, "B side", SELECT_B_RELATION_ORDER, UPDATE_B_ORDER);
+ updateRelationsSortOrder(subMonitor, "A side", SELECT_A_RELATION_ORDER, UPDATE_A_ORDER);
+ subMonitor.done();
+ }
+
+ private void updateRelationsSortOrder(final IProgressMonitor monitor, String name, String query, final String update) throws OseeDataStoreException {
+ final List<Object[]> batchArgs = new ArrayList<Object[]>();
+ final RelationOrderTracker relationOrderTracker = new RelationOrderTracker();
+ monitor.subTask(String.format("Updating [%s] sort order", name));
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(5000, query, branchToSort.getBranchId());
+ while (chStmt.next()) {
+ relationOrderTracker.processRow(chStmt);
+ if (relationOrderTracker.isUpdateRequired()) {
+ if (monitor.isCanceled() != true && batchArgs.size() >= 100000) {
+ writeToDb(monitor, update, batchArgs);
+ batchArgs.clear();
+ }
+ batchArgs.add(relationOrderTracker.getUpdateData());
+ }
+
+ if (monitor.isCanceled()) {
+ break;
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ if (monitor.isCanceled() != true) {
+ writeToDb(monitor, update, batchArgs);
+ }
+ print(String.format("Updated [%d] relation [%s] orders.\n", totalModCount, name));
+ monitor.worked(1);
+ }
+
+ private void writeToDb(IProgressMonitor monitor, String update, List<Object[]> data) throws OseeDataStoreException {
+ int count = ConnectionHandler.runBatchUpdate(update, data);
+ totalModCount += count;
+ monitor.subTask(String.format("Updated [%d of %d] relation orders - overall [%d]", count, data.size(),
+ totalModCount));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn.IOperation#getTotalWork()
+ */
+ @Override
+ public int getTotalWork() {
+ return 2;
+ }
+ }
+
+ private final class RelationOrderTracker {
+ int rel_link_type, art_id, branch_id, order;
+ int rel_link_type_old = -1, art_id_old = -1, branch_id_old = -1;
+ int new_order;
+ int other_side_art_id = -1;
+ long gammaId = -1;
+
+ void processRow(ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ rel_link_type = chStmt.getInt("rel_link_type_id");
+ art_id = chStmt.getInt("art_id1");
+ branch_id = chStmt.getInt("branch_id");
+ order = chStmt.getInt("order1");
+ gammaId = chStmt.getLong("gamma_id");
+ if ((rel_link_type != rel_link_type_old || art_id != art_id_old || branch_id != branch_id_old)) {//then it's a new start of ordering
+ new_order = -1;
+ } else {
+ new_order = other_side_art_id;
+ }
+
+ rel_link_type_old = rel_link_type;
+ art_id_old = art_id;
+ branch_id_old = branch_id;
+ other_side_art_id = chStmt.getInt("art_id2");
+ }
+
+ boolean isUpdateRequired() {
+ return order == 0;
+ }
+
+ Object[] getUpdateData() {
+ return new Object[] {new_order, gammaId};
+ }
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SwitchParentBranch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SwitchParentBranch.java
new file mode 100644
index 00000000000..f594350c7cc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/SwitchParentBranch.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SwitchParentBranch extends AbstractBlam {
+ private static final String UPDATE_PARENT_BRANCHES =
+ "UPDATE osee_branch SET parent_branch_id = ? where branch_id in (";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Switch Parent Branch";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ Branch branch = variableMap.getBranch("New Parent Branch");
+ ConnectionHandler.runPreparedUpdate(UPDATE_PARENT_BRANCHES + variableMap.getString("Branch List") + ")",
+ branch.getBranchId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XText\" displayName=\"Branch List\" /><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"New Parent Branch\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UnicodeConverter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UnicodeConverter.java
new file mode 100644
index 00000000000..cfc779f0882
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UnicodeConverter.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author fw314c
+ */
+public class UnicodeConverter {
+
+ private static final byte[] tickyQuoteBack =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -59, (byte) -109};
+ private static final String tickyQuoteBackString = "“";
+ private static final byte[] tickyQuoteBackGood = new byte[] {(byte) -30, (byte) -128, (byte) -100};
+
+ // private static final byte[] degree =
+ // new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -59, (byte) -109};
+ private static final String degreeString = "°";
+ private static final byte[] degreeGood = new byte[] {(byte) -62, (byte) -80};
+
+ private static final byte[] tickyQuoteForward =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -17, (byte) -65, (byte) -67};
+ private static final String tickyQuoteForwardString = "”";
+ private static final byte[] tickyQuoteForwardGood = new byte[] {(byte) -30, (byte) -128, (byte) -99};
+
+ private static final byte[] notEquals =
+ new byte[] {(byte) -61, (byte) -81, (byte) -30, (byte) -128, (byte) -102, (byte) -62, (byte) -71};
+ private static final byte[] notEqualsGood = new byte[] {(byte) -17, (byte) -126, (byte) -71};
+ private static final String notEqualsString = " ";
+
+ //Renders as a ? in Java however appears as equal slash in Word
+ private static final byte[] notEqualsForward =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -128, (byte) -80, (byte) -62, (byte) -96};
+ private static final String notEqualsForwardString = "Not Equals Forward";
+ private static final byte[] notEqualsForwardGood = new byte[] {(byte) -30, (byte) -119, (byte) -96};
+
+ private static final byte[] greaterThanEquals =
+ new byte[] {(byte) -61, (byte) -81, (byte) -30, (byte) -128, (byte) -102, (byte) -62, (byte) -77};
+ private static final String greaterThanEqualsString = " ";
+ private static final byte[] greaterThanEqualsGood = new byte[] {(byte) -17, (byte) -126, (byte) -77};
+
+ private static final byte[] lessThanEquals =
+ new byte[] {(byte) -61, (byte) -81, (byte) -30, (byte) -128, (byte) -102, (byte) -62, (byte) -93};
+ private static final String lessThanEqualsString = " Less Than Equals";
+ private static final byte[] lessThanEqualsGood = new byte[] {(byte) -17, (byte) -126, (byte) -93};
+
+ // private static final byte[] plusEquals =
+ // new byte[] {(byte) -61, (byte) -81, (byte) -30, (byte) -128, (byte) -102, (byte) -62, (byte) -93};
+ private static final byte[] plusEqualsGood = new byte[] {(byte) -50, (byte) -79};
+
+ private static final byte[] blankCharacter = new byte[] {(byte) -61, (byte) -126, (byte) -62, (byte) -96};
+ private static final byte[] blankCharacterGood = new byte[] {(byte) -62, (byte) -96};
+
+ // private static final byte[] microCharacter =
+ // new byte[] {(byte) -61, (byte) -81, (byte) -30, (byte) -128, (byte) -102, (byte) -62, (byte) -93};
+ private static final byte[] microCharacterGood = new byte[] {(byte) -62, (byte) -75};
+
+ private static final byte[] forwardTick =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -30, (byte) -124, (byte) -94};
+ private static final String forwardTickString = "’";
+ private static final byte[] forwardTickGood = new byte[] {(byte) -30, (byte) -128, (byte) -103};
+
+ private static final byte[] dash =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -30, (byte) -128, (byte) -100};
+ private static final byte[] dashGood = new byte[] {(byte) -30, (byte) -128, (byte) -109};
+
+ private static final byte[] dotGood = new byte[] {(byte) -62, (byte) -73};
+ private static final byte[] plusMinusGood = new byte[] {(byte) -62, (byte) -79};
+ private static final byte[] miniOneGood = new byte[] {(byte) -62, (byte) -71};
+
+ private static final byte[] whatisit =
+ new byte[] {(byte) -61, (byte) -81, (byte) -30, (byte) -126, (byte) -84, (byte) -62, (byte) -67};
+ private static final byte[] whatisitGood = new byte[] {(byte) -17, (byte) -128, (byte) -67};
+
+ private static final byte[] WHATISIT2 = new byte[] {(byte) -17, (byte) -126, (byte) -80};
+ private static final byte[] WHATISIT3 = new byte[] {(byte) -30, (byte) -119, (byte) -91};
+ private static final byte[] WHATISIT4 = new byte[] {(byte) -49, (byte) -128};
+ private static final byte[] WHATISIT5 = new byte[] {(byte) -30, (byte) -119, (byte) -92};
+
+ private static final byte[] upsideDownTick =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -53, (byte) -100};
+ private static final byte[] upsideDownTickGood = new byte[] {(byte) -30, (byte) -128, (byte) -104};
+
+ private static final byte[] dotdotdot =
+ new byte[] {(byte) -61, (byte) -94, (byte) -30, (byte) -126, (byte) -84, (byte) -62, (byte) -90};
+ private static final byte[] dotdotdotGood = new byte[] {(byte) -30, (byte) -128, (byte) -90};
+
+ private static final byte[] lambdaGood = new byte[] {(byte) -62, (byte) -93};
+ private static final byte[] oneHalfGood = new byte[] {(byte) -62, (byte) -67};
+ private static final byte[] degree2Good = new byte[] {(byte) -62, (byte) -70};
+ private static final byte[] whatisit2Good = new byte[] {(byte) -17, (byte) -126, (byte) -79};
+ private static final byte[] whatisit3Good = new byte[] {(byte) -17, (byte) -127, (byte) -84};
+ private static final String percent = "percent";
+ private static final byte[] percentGood = new byte[] {(byte) -30, (byte) -128, (byte) -80};
+
+ private static Map<byte[], byte[]> goodBytes = new HashMap<byte[], byte[]>();
+ private static Map<String, byte[]> values = new HashMap<String, byte[]>();
+
+ public static String getValue(List<Byte> bytes) throws UnsupportedEncodingException {
+ if (values.isEmpty()) {
+ values.put(tickyQuoteBackString, tickyQuoteBack);
+ values.put(tickyQuoteForwardString, tickyQuoteForward);
+ values.put(new String(notEqualsGood, "UTF-8"), notEquals);
+ values.put(new String(greaterThanEqualsGood, "UTF-8"), greaterThanEquals);
+ values.put(new String(forwardTickGood, "UTF-8"), forwardTick);
+ values.put(new String(notEqualsForwardGood, "UTF-8"), notEqualsForward);
+ values.put(new String(lessThanEqualsGood, "UTF-8"), lessThanEquals);
+ values.put(new String(blankCharacterGood, "UTF-8"), blankCharacter);
+ values.put(new String(dashGood, "UTF-8"), dash);
+ values.put(new String(dotdotdotGood, "UTF-8"), dotdotdot);
+ values.put(new String(upsideDownTickGood, "UTF-8"), upsideDownTick);
+ values.put(new String(whatisitGood, "UTF-8"), whatisit);
+ values.put(percent, percentGood);
+ values.put("GOOD TICKY QUOTE FORWARD" + new String(tickyQuoteForwardGood, "UTF-8"), tickyQuoteForwardGood);
+ values.put("GOOD TICKY QUOTE BACKWARD" + new String(tickyQuoteBackGood, "UTF-8"), tickyQuoteBackGood);
+ values.put("GOOD NOT EQUALS" + new String(notEqualsGood, "UTF-8"), notEqualsGood);
+ values.put("GOOD GREATER THAN EQUALS " + new String(greaterThanEqualsGood, "UTF-8"), greaterThanEqualsGood);
+ values.put("GOOD FORWARD TICK " + new String(forwardTickGood, "UTF-8"), forwardTickGood);
+ values.put("GOOD NOT EQUALS FORWARD " + new String(notEqualsForwardGood, "UTF-8"), notEqualsForwardGood);
+ values.put("GOOD LESS THAN EQUALS " + new String(lessThanEqualsGood, "UTF-8"), lessThanEqualsGood);
+ values.put("GOOD DEGREE MARK " + new String(degreeGood, "UTF-8"), degreeGood);
+ values.put("GOOD BLANK CHARACTER " + new String(blankCharacterGood, "UTF-8"), blankCharacterGood);
+ values.put("GOOD MICRO CHARACTER " + new String(microCharacterGood, "UTF-8"), microCharacterGood);
+ values.put("GOOD PLUS EQUALS CHARACTER " + new String(plusEqualsGood, "UTF-8"), plusEqualsGood);
+ values.put("GOOD DASH CHARACTER " + new String(dashGood, "UTF-8"), dashGood);
+ values.put("GOOD DOT CHARACTER " + new String(dotGood, "UTF-8"), dotGood);
+ values.put("GOOD DOT DOT DOT CHARACTER " + new String(dotdotdotGood, "UTF-8"), dotdotdotGood);
+ values.put(" GOOD WHATISIT " + new String(whatisitGood, "UTF-8"), whatisitGood);
+ values.put(" GOOD WHATISIT2 " + new String(WHATISIT2, "UTF-8"), WHATISIT2);
+ values.put(" GOOD WHATISIT3 " + new String(WHATISIT3, "UTF-8"), WHATISIT3);
+ values.put(" GOOD WHATISIT4 " + new String(WHATISIT4, "UTF-8"), WHATISIT4);
+ values.put(" GOOD WHATISIT5 " + new String(WHATISIT5, "UTF-8"), WHATISIT5);
+ values.put("GOOD UPSIDE DOWN TICK " + new String(upsideDownTickGood, "UTF-8"), upsideDownTickGood);
+ values.put("GOOD PLUS MINUS " + new String(plusMinusGood, "UTF-8"), plusMinusGood);
+ values.put("GOOD MINI ONE " + new String(miniOneGood, "UTF-8"), miniOneGood);
+
+ values.put("GOOD LAMBDA " + new String(lambdaGood, "UTF-8"), lambdaGood);
+ values.put("GOOD ONE HALF " + new String(oneHalfGood, "UTF-8"), oneHalfGood);
+ values.put("GOOD DEGREE 2 " + new String(degree2Good, "UTF-8"), degree2Good);
+ values.put("GOOD WHATISIT 2 " + new String(whatisit2Good, "UTF-8"), whatisit2Good);
+ values.put("GOOD WHATISIT 3 " + new String(whatisit3Good, "UTF-8"), whatisit3Good);
+ //values.put("GOOD PERCENT " + new String(percentGood, "UTF-8"), percentGood);
+
+ }
+ for (String string : values.keySet()) {
+ if (bytes.size() == values.get(string).length) {
+ boolean equals = true;
+ for (int x = 0; x < bytes.size(); x++) {
+ if (bytes.get(x).byteValue() != values.get(string)[x]) {
+ equals = false;
+ break;
+ }
+ }
+ if (equals) {
+ return string;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static byte[] getGoodBytes(String string) throws UnsupportedEncodingException {
+ if (goodBytes.isEmpty()) {
+ goodBytes.put(tickyQuoteBack, tickyQuoteBackGood);
+ goodBytes.put(tickyQuoteForward, tickyQuoteForwardGood);
+ goodBytes.put(notEquals, notEqualsGood);
+ goodBytes.put(greaterThanEquals, greaterThanEqualsGood);
+ goodBytes.put(forwardTick, forwardTickGood);
+ goodBytes.put(notEqualsForward, notEqualsForwardGood);
+ goodBytes.put(lessThanEquals, lessThanEqualsGood);
+ goodBytes.put(blankCharacter, blankCharacterGood);
+ goodBytes.put(dash, dashGood);
+ goodBytes.put(dotdotdot, dotdotdotGood);
+ goodBytes.put(upsideDownTick, upsideDownTickGood);
+ goodBytes.put(whatisit, whatisitGood);
+ goodBytes.put(percentGood, new byte[] {});
+ }
+ return goodBytes.get(values.get(string));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UniqueNumberOfCurrentOseeUsers.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UniqueNumberOfCurrentOseeUsers.java
new file mode 100644
index 00000000000..9e8a8acb5bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UniqueNumberOfCurrentOseeUsers.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class UniqueNumberOfCurrentOseeUsers extends AbstractBlam {
+ private static final String SELECT_USER_COUNT =
+ "select count(*) from v$session t1 where t1.username='OSEE_CLIENT' and not exists (select null from v$session t2 where t1.machine=t2.machine and t2.sid < t1.sid)";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Unique Number Of Current Osee Users";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+
+ /**
+ * must be connected using a admin schema
+ */
+ // removeColonFromActionNames
+ monitor.beginTask("Counting Users", IProgressMonitor.UNKNOWN);
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_USER_COUNT);
+ if (chStmt.next()) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, "active user count: " + chStmt.getInt("user_count"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ monitor.done();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return emptyXWidgetsXml;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Util");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateArtifactTypeImage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateArtifactTypeImage.java
new file mode 100644
index 00000000000..b238303958c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateArtifactTypeImage.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.framework.ui.skynet.blam.operation;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class UpdateArtifactTypeImage extends AbstractBlam {
+
+ public static String ARTIFACT_TYPE_NAME = "Select Artifact Type";
+ public static String SELECT_IMAGE = "Select Image GIF";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Update ArtifactType Image";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ String filename = variableMap.getString(SELECT_IMAGE);
+ final ArtifactType artifactSubtypeDescriptor = variableMap.getArtifactType("Select Artifact Type");
+ if (Strings.isValid(filename)) {
+ File imageFile = new File(filename);
+ if (!imageFile.exists()) {
+ throw new OseeArgumentException("Invalid image filename.");
+ }
+ ImageManager.setArtifactTypeImageInDb(artifactSubtypeDescriptor, new ByteArrayInputStream(
+ Lib.inputStreamToBytes(new FileInputStream(imageFile))));
+ } else {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ if (MessageDialog.openConfirm(Display.getDefault().getActiveShell(), "Clear Database Image?",
+ "No Image File Selected.\n\nSelect \"Ok\" to clear image from database (default image will be used).")) {
+ ImageManager.setArtifactTypeImageInDb(artifactSubtypeDescriptor, null);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "This BLAM will import the selected 16x16 pixel gif image as the image for the selected artifact type. Existing image will be overwritten.\nLeaving image filename blank will clear the image from the database. Programatic default will be used instead.\n\nNOTE: Change default branch for other Artifact Types.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuffer buffer = new StringBuffer("<xWidgets>");
+ buffer.append("<XWidget xwidgetType=\"XFileSelectionDialog\" displayName=\"" + SELECT_IMAGE + "\" />");
+ buffer.append("<XWidget xwidgetType=\"XArtifactTypeListViewer\" displayName=\"" + ARTIFACT_TYPE_NAME + "\" />");
+ buffer.append("</xWidgets>");
+ return buffer.toString();
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateCurrentColumn.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateCurrentColumn.java
new file mode 100644
index 00000000000..f415853f860
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateCurrentColumn.java
@@ -0,0 +1,536 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.type.MutableInteger;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Roberto E. Escobar
+ */
+public class UpdateCurrentColumn extends AbstractBlam {
+
+ private enum Operations {
+ Update_Tx_Mod_Type, Update_Tx_Current, Run_Tx_Current_Verification, Run_Tx_Mod_Type_Verification;
+
+ public String asLabel() {
+ return this.name().replaceAll("_", " ");
+ }
+ }
+
+ private enum TypesEnum {
+ artifacts, attributes, relations;
+ }
+
+ private static final String SELECT_ATTRIBUTES_TO_UPDATE =
+ "SELECT branch_id, maxt, txs2.gamma_id, data_id, txs2.mod_type FROM osee_attribute att2, osee_txs txs2, (SELECT MAX(txs1.transaction_id) AS maxt, att1.attr_id AS data_id, txd1.branch_id FROM osee_attribute att1, osee_txs txs1, osee_tx_details txd1 WHERE att1.gamma_id = txs1.gamma_id and txs1.transaction_id > ? and txd1.tx_type = 0 AND txs1.transaction_id = txd1.transaction_id GROUP BY att1.attr_id, txd1.branch_id) new_stuff WHERE data_id = att2.attr_id AND att2.gamma_id = txs2.gamma_id and txs2.transaction_id > ? AND txs2.transaction_id = maxt";
+ private static final String SELECT_ARTIFACTS_TO_UPDATE =
+ "SELECT branch_id, maxt, txs1.gamma_id, art_id as data_id, txs1.mod_type FROM osee_artifact_version arv2, osee_txs txs1, (SELECT MAX(txs2.transaction_id) AS maxt, arv1.art_id AS art, txd1.branch_id FROM osee_artifact_version arv1, osee_txs txs2, osee_tx_details txd1 WHERE arv1.gamma_id = txs2.gamma_id and txs2.transaction_id > ? and txd1.tx_type = 0 AND txs2.transaction_id = txd1.transaction_id GROUP BY arv1.art_id, txd1.branch_id) new_stuff WHERE art = arv2.art_id AND arv2.gamma_id = txs1.gamma_id AND txs1.transaction_id = maxt and txs1.transaction_id > ?";
+ private static final String SELECT_RELATIONS_TO_UPDATE =
+ "SELECT branch_id, maxt, txs1.gamma_id, data_id, txs1.mod_type FROM osee_relation_link rel2, osee_txs txs1, (SELECT MAX(txs2.transaction_id) AS maxt, rel1.rel_link_id AS data_id, txd1.branch_id FROM osee_relation_link rel1, osee_txs txs2, osee_tx_details txd1 WHERE rel1.gamma_id = txs2.gamma_id and txs2.transaction_id > ? and txd1.tx_type = 0 AND txs2.transaction_id = txd1.transaction_id GROUP BY rel1.rel_link_id, txd1.branch_id) new_stuff WHERE data_id = rel2.rel_link_id AND rel2.gamma_id = txs1.gamma_id AND txs1.transaction_id = maxt and txs1.transaction_id > ?";
+
+ private static final String SELECT_STALE_ATTRIBUTES =
+ "SELECT txsouter.gamma_id, txsouter.transaction_id FROM osee_txs txsouter, (SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, osee_tx_details txd1, osee_attribute attr1 where txd1.branch_id = ? and attr1.attr_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = attr1.gamma_id) resulttable WHERE txsouter.transaction_id = resulttable.transaction_id AND resulttable.gamma_id = txsouter.gamma_id";
+ private static final String SELECT_STALE_ARTIFACTS =
+ "SELECT txsouter.gamma_id, txsouter.transaction_id FROM osee_txs txsouter, (SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, osee_tx_details txd1, osee_artifact_version art1 WHERE txd1.branch_id = ? AND art1.art_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = art1.gamma_id) resulttable WHERE txsouter.transaction_id = resulttable.transaction_id AND resulttable.gamma_id = txsouter.gamma_id";
+ private static final String SELECT_STALE_RELATIONS =
+ "SELECT txsouter.gamma_id, txsouter.transaction_id FROM osee_txs txsouter, (SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, osee_tx_details txd1, osee_relation_link link1 where txd1.branch_id = ? and link1.rel_link_id = ? AND txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = link1.gamma_id) resulttable WHERE txsouter.transaction_id = resulttable.transaction_id AND resulttable.gamma_id = txsouter.gamma_id";
+
+ private static final String UPDATE_TXS_CURRENT_TO_0 =
+ "update osee_txs set tx_current = 0 where gamma_id = ? and transaction_id = ?";
+ private static final String UPDATE_TXS_CURRENT =
+ "update osee_txs set tx_current = ? where gamma_id = ? and transaction_id = ?";
+ private static final String UPDATE_TXS_CURRENT_FROM_NULL =
+ "UPDATE osee_txs txs1 SET tx_current = 0 WHERE tx_current IS null";
+
+ private static final String SELECT_BASELINED_TRANSACTIONS =
+ "SELECT txs1.gamma_id, txs1.transaction_id, txs1.mod_type from osee_txs txs1, osee_tx_details txd1 where txd1.tx_type = 1 and txd1.transaction_id > ? and txd1.transaction_id = txs1.transaction_id";
+
+ private static final String UPDATE_TX_DETAILS_NON_BASELINE_TRANSACTIONS_TO_0 =
+ "UPDATE osee_tx_details SET tx_type = 0 WHERE tx_type IS NULL"; // Changed tx_type <> 1 to account for null case
+ private static final String UPDATE_TX_DETAILS_BASELINE_TRANSACTIONS_TO_1 =
+ "UPDATE osee_tx_details SET tx_type = 1 WHERE osee_comment LIKE '%New Branch%'";
+
+ private static final String VERIFY_ARTIFACT_MOD_TYPE =
+ "select count(1) as total from osee_txs txs1, osee_artifact_version artv1 WHERE txs1.gamma_id = artv1.gamma_id AND txs1.mod_type IS NULL";
+ private static final String VERIFY_ATTRIBUTE_MOD_TYPE =
+ "select count(1) as total from osee_txs txs1, osee_attribute attr1 WHERE txs1.gamma_id = attr1.gamma_id AND txs1.mod_type IS NULL";
+ private static final String VERIFY_RELATION_MOD_TYPE =
+ "select count(1) as total from osee_txs txs1, osee_relation_link rel1 WHERE txs1.gamma_id = rel1.gamma_id AND txs1.mod_type IS NULL";
+
+ private static final String INNER_SELECT_ARTIFACT_MOD_TYPE =
+ "select artv1.modification_id from osee_txs txs1, osee_artifact_version artv1 where txs1.gamma_id = artv1.gamma_id";
+ private static final String INNER_SELECT_ATTRIBUTE_MOD_TYPE =
+ "select attr1.modification_id from osee_txs txs1, osee_attribute attr1 where txs1.gamma_id = attr1.gamma_id";
+ private static final String INNER_SELECT_RELATION_MOD_TYPE =
+ "select rel1.modification_id from osee_txs txs1, osee_relation_link rel1 where txs1.gamma_id = rel1.gamma_id";
+
+ private static final String UPDATE_TXS_MOD_TYPE_SINGLE_CALL =
+ "update osee_txs txsOuter set mod_type = (%s and txsOuter.transaction_id = txs1.transaction_id and txsOuter.gamma_id = txs1.gamma_id) WHERE txsouter.transaction_id > ? AND txsouter.mod_type IS NULL";
+
+ private static final String VERIFY_TX_CURRENT =
+ "SELECT COUNT(resulttable.branch_id) AS numoccurrences FROM (SELECT txd1.branch_id, txd1.TIME, txd1.tx_type, txs1.*, artv1.art_id, txs1.mod_type, art1.art_type_id FROM osee_tx_details txd1, osee_txs txs1, osee_artifact art1, osee_artifact_version artv1 WHERE txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = artv1.gamma_id AND artv1.art_id = art1.art_id AND txs1.tx_current = 1) resulttable GROUP BY resulttable.branch_id, resulttable.art_id HAVING(COUNT(resulttable.branch_id) > 1)";
+
+ private final class UpdateHelper {
+ TypesEnum type;
+ int id;
+ int branch_id;
+ int transaction_id;
+ long gamma_id;
+ int modification_id;
+
+ UpdateHelper(TypesEnum type, ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ this.type = type;
+ this.branch_id = chStmt.getInt("branch_id");
+ this.transaction_id = chStmt.getInt("maxt");
+ this.gamma_id = chStmt.getLong("gamma_id");
+ this.id = chStmt.getInt("data_id");
+ this.modification_id = chStmt.getInt("mod_type");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Update Current Column";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<xWidgets>");
+ builder.append("<XWidget xwidgetType=\"XText\" displayName=\"From Transaction Number\" />");
+ builder.append("<XWidget xwidgetType=\"XLabel\" displayName=\"Select Operations to Run:\"/>");
+ for (Operations operationType : Operations.values()) {
+ builder.append(getOperationsCheckBoxes(operationType));
+ }
+ builder.append("</xWidgets>");
+ return builder.toString();
+ }
+
+ private String getOperationsCheckBoxes(Operations ops) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<XWidget xwidgetType=\"XCheckBox\" displayName=\"");
+ builder.append(ops.asLabel());
+ builder.append("\" labelAfter=\"true\" horizontalLabel=\"true\"/>");
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ int startAtTxNumber = 0;
+ try {
+ startAtTxNumber = Integer.parseInt(variableMap.getString("From Transaction Number"));
+ } catch (NumberFormatException ex) {
+ print(String.format("Failed to parse string [%s], specify an integer",
+ variableMap.getString("From Transaction Number")));
+ return;
+ }
+ print(String.format("Processing from transaction id [%d].\n", startAtTxNumber));
+ int totalWork = 0;
+ for (Operations operationType : Operations.values()) {
+ if (variableMap.getBoolean(operationType.asLabel())) {
+ IOperation op = getOperation(operationType);
+ totalWork += op.getTotalWork();
+ }
+ }
+
+ monitor.beginTask(getName(), totalWork);
+ for (Operations operationType : Operations.values()) {
+ if (variableMap.getBoolean(operationType.asLabel())) {
+ IOperation op = getOperation(operationType);
+ monitor.setTaskName(String.format("Executing: [%s]", operationType.asLabel()));
+ op.execute(monitor, startAtTxNumber);
+ monitor.setTaskName("");
+ if (monitor.isCanceled()) {
+ break;
+ }
+ }
+ }
+ }
+
+ private IOperation getOperation(Operations type) {
+ IOperation toReturn = null;
+ switch (type) {
+ case Update_Tx_Current:
+ toReturn = new UpdateTxCurrentOperation();
+ break;
+ case Update_Tx_Mod_Type:
+ toReturn = new UpdateTxModTypeSingleCallOperation();
+ break;
+ case Run_Tx_Current_Verification:
+ toReturn = new VerifyTxCurrentOperation();
+ break;
+ case Run_Tx_Mod_Type_Verification:
+ toReturn = new VerifyTxModTypeOperation();
+ break;
+ default:
+ break;
+ }
+ return toReturn;
+ }
+ private interface IOperation {
+ int getTotalWork();
+
+ void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception;
+ }
+
+ private final class UpdateTxCurrentOperation implements IOperation {
+
+ private final Map<TypesEnum, Pair<String, String>> typesQueryMap;
+ private int totalCount;
+
+ public UpdateTxCurrentOperation() {
+ totalCount = 0;
+ typesQueryMap = new HashMap<TypesEnum, Pair<String, String>>();
+ typesQueryMap.put(TypesEnum.artifacts, new Pair<String, String>(SELECT_ARTIFACTS_TO_UPDATE,
+ SELECT_STALE_ARTIFACTS));
+ typesQueryMap.put(TypesEnum.attributes, new Pair<String, String>(SELECT_ATTRIBUTES_TO_UPDATE,
+ SELECT_STALE_ATTRIBUTES));
+ typesQueryMap.put(TypesEnum.relations, new Pair<String, String>(SELECT_RELATIONS_TO_UPDATE,
+ SELECT_STALE_RELATIONS));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn.IOperation#execute()
+ */
+ @Override
+ public void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception {
+ totalCount = 0;
+ final IProgressMonitor subMonitor = new SubProgressMonitor(monitor, getTotalWork());
+ subMonitor.beginTask("Update Tx Current", getTotalWork());
+
+ List<UpdateHelper> updates = new ArrayList<UpdateHelper>();
+
+ int txTypeNumber = updateBaselineTransactions(subMonitor);
+ print(String.format("Updated [%d] transactions to baseline transactions.\n", txTypeNumber));
+
+ updateBaselinedTransactionsToCurrent(subMonitor, startAtTxNumber);
+ getUpdates(subMonitor, updates, startAtTxNumber);
+ print(String.format("Total items identified as latest: [%d] \n", updates.size()));
+
+ long time = System.currentTimeMillis();
+ int rowsUpdated = updateTxCurrentToZeroForStaleItems(subMonitor, updates);
+ print(String.format("Took [%d]ms to update [%d] rows.\n", (System.currentTimeMillis() - time),
+ rowsUpdated));
+
+ time = System.currentTimeMillis();
+ print(String.format("Going to update [%d] items to tx_current value of 1 or 2.\n", updates.size()));
+ rowsUpdated = updateTxCurrentForLatestItems(subMonitor, updates);
+ print(String.format("Took [%d]ms to update [%d] rows.\n", (System.currentTimeMillis() - time),
+ rowsUpdated));
+
+ subMonitor.done();
+ }
+
+ private int updateBaselineTransactions(IProgressMonitor monitor) throws OseeDataStoreException {
+ int txTypeNumber = 0;
+ monitor.subTask("Update Baseline Txs - Tx Details Table");
+ if (monitor.isCanceled() != true) {
+ txTypeNumber += ConnectionHandler.runPreparedUpdate(UPDATE_TX_DETAILS_NON_BASELINE_TRANSACTIONS_TO_0);
+ txTypeNumber += ConnectionHandler.runPreparedUpdate(UPDATE_TX_DETAILS_BASELINE_TRANSACTIONS_TO_1);
+ }
+ monitor.worked(1);
+ return txTypeNumber;
+ }
+
+ private void updateBaselinedTransactionsToCurrent(final IProgressMonitor monitor, final int txNumber) throws Exception {
+ totalCount = 0;
+ monitor.subTask("Mark tx current in txs table from data in txd table");
+ final int batchSize = 100000;
+ final List<Object[]> batchArgs = new ArrayList<Object[]>(batchSize);
+ executeQuery(monitor, new IRowProcessor() {
+ public void processRow(ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ int modType = chStmt.getInt("mod_type");
+ int tx_current_value = TxChange.CURRENT.getValue();
+ if (modType == ModificationType.DELETED.getValue()) {
+ tx_current_value = TxChange.DELETED.getValue();
+ }
+ batchArgs.add(new Object[] {tx_current_value, chStmt.getLong("gamma_id"),
+ chStmt.getInt("transaction_id")});
+
+ if (monitor.isCanceled() != true && batchArgs.size() >= batchSize) {
+ writeToDb(monitor, UPDATE_TXS_CURRENT, "baselined txs", batchArgs);
+ batchArgs.clear();
+ }
+ }
+ }, 0, SELECT_BASELINED_TRANSACTIONS, txNumber);
+
+ if (monitor.isCanceled() != true && batchArgs.size() > 0) {
+ writeToDb(monitor, UPDATE_TXS_CURRENT, "baselined txs", batchArgs);
+ }
+ monitor.worked(1);
+ }
+
+ private void writeToDb(IProgressMonitor monitor, String sql, String name, List<Object[]> data) throws OseeDataStoreException {
+ int count = ConnectionHandler.runBatchUpdate(sql, data);
+ totalCount += count;
+ monitor.subTask(String.format("Updated [%d of %d] %s - overall [%d]\n", count, data.size(), name, totalCount));
+ }
+
+ private void getUpdates(IProgressMonitor monitor, final List<UpdateHelper> updates, int txNumber) throws Exception {
+ for (final TypesEnum type : typesQueryMap.keySet()) {
+ monitor.subTask(String.format("Select Latest For [%s]", type.name()));
+
+ String query = typesQueryMap.get(type).getKey();
+ int totalRows = executeQuery(monitor, new IRowProcessor() {
+ public void processRow(ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ updates.add(new UpdateHelper(type, chStmt));
+ }
+ }, 0, query, txNumber, txNumber);
+ print(String.format("%d updates for [%s]\n", totalRows, type));
+
+ if (monitor.isCanceled()) {
+ break;
+ }
+ monitor.worked(1);
+ }
+ }
+
+ private int updateTxCurrentToZeroForStaleItems(IProgressMonitor monitor, List<UpdateHelper> updates) throws Exception {
+ monitor.subTask("Setting Stale Items to 0");
+ final List<Object[]> setToUpdate = new ArrayList<Object[]>();
+ IRowProcessor processor = new IRowProcessor() {
+ public void processRow(ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ setToUpdate.add(new Object[] {chStmt.getLong("gamma_id"), chStmt.getInt("transaction_id")});
+ }
+ };
+ // Set Stale Items to 0
+ for (UpdateHelper data : updates) {
+ String query = typesQueryMap.get(data.type).getValue();
+ if (query != null && monitor.isCanceled() != true) {
+ executeQuery(monitor, processor, 0, query, data.branch_id, data.id);
+ }
+ }
+
+ int updated = 0;
+ if (monitor.isCanceled() != true) {
+ print(String.format("%d updates for [updateTxCurrentToZero]\n", setToUpdate.size()));
+ updated = ConnectionHandler.runBatchUpdate(UPDATE_TXS_CURRENT_TO_0, setToUpdate);
+ }
+ monitor.worked(1);
+ return updated;
+ }
+
+ private int updateTxCurrentForLatestItems(IProgressMonitor monitor, List<UpdateHelper> updates) throws OseeDataStoreException {
+ monitor.subTask("Setting Tx Current for current items");
+ List<Object[]> batchArgs = new ArrayList<Object[]>();
+ for (UpdateHelper data : updates) {
+ TxChange txCurrentValue =
+ data.modification_id == ModificationType.DELETED.getValue() ? TxChange.DELETED : TxChange.CURRENT; // Set to Current or Current was Deleted
+ batchArgs.add(new Object[] {txCurrentValue.getValue(), data.gamma_id, data.transaction_id});
+ if (monitor.isCanceled()) {
+ break;
+ }
+ }
+
+ int update = 0;
+ if (monitor.isCanceled() != true) {
+ update = ConnectionHandler.runBatchUpdate(UPDATE_TXS_CURRENT, batchArgs);
+ }
+ ConnectionHandler.runPreparedUpdate(UPDATE_TXS_CURRENT_FROM_NULL);
+
+ monitor.worked(1);
+ return update;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn.IOperation#getTotalWork()
+ */
+ @Override
+ public int getTotalWork() {
+ return 4 + typesQueryMap.size();
+ }
+ }
+
+ private final class UpdateTxModTypeSingleCallOperation implements IOperation {
+
+ private final Map<TypesEnum, String> modTypeInnerSelectMap;
+
+ public UpdateTxModTypeSingleCallOperation() {
+ modTypeInnerSelectMap = new HashMap<TypesEnum, String>();
+ modTypeInnerSelectMap.put(TypesEnum.artifacts, INNER_SELECT_ARTIFACT_MOD_TYPE);
+ modTypeInnerSelectMap.put(TypesEnum.attributes, INNER_SELECT_ATTRIBUTE_MOD_TYPE);
+ modTypeInnerSelectMap.put(TypesEnum.relations, INNER_SELECT_RELATION_MOD_TYPE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn.IOperation#getTotalWork()
+ */
+ @Override
+ public int getTotalWork() {
+ return modTypeInnerSelectMap.size();
+ }
+
+ @Override
+ public void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception {
+ final IProgressMonitor subMonitor = new SubProgressMonitor(monitor, getTotalWork());
+ subMonitor.beginTask("Update Mod Type", getTotalWork());
+
+ int totalModified = 0;
+ for (TypesEnum type : modTypeInnerSelectMap.keySet()) {
+ subMonitor.subTask(String.format("Processing [%s] Mod Types", type.name()));
+ String innerSelect = modTypeInnerSelectMap.get(type);
+ if (Strings.isValid(innerSelect)) {
+ String updateSql = String.format(UPDATE_TXS_MOD_TYPE_SINGLE_CALL, innerSelect);
+
+ long time = System.currentTimeMillis();
+ int count = ConnectionHandler.runPreparedUpdate(updateSql, startAtTxNumber);
+ print(String.format("Updated [%s] rows for [%s] in [%d]ms\n", count, type.name(),
+ (System.currentTimeMillis() - time)));
+ totalModified += count;
+ }
+ subMonitor.worked(1);
+ if (subMonitor.isCanceled()) {
+ break;
+ }
+ }
+ print(String.format("Updated [%d]txs mod types\n", totalModified));
+ subMonitor.done();
+ }
+ }
+
+ private final class VerifyTxCurrentOperation implements IOperation {
+
+ @Override
+ public void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception {
+ final IProgressMonitor subMonitor = new SubProgressMonitor(monitor, getTotalWork());
+ subMonitor.beginTask("Verifying Tx Current", getTotalWork());
+
+ int totalRowCount = ConnectionHandler.runPreparedQueryFetchInt(-1, VERIFY_TX_CURRENT);
+
+ String msg = null;
+ boolean result = totalRowCount == 0;
+ if (monitor.isCanceled()) {
+ msg = "Cancelled";
+ } else if (result) {
+ msg = "Passed";
+ } else {
+ msg = "Failed";
+ }
+ print(String.format("Tx Current Verification [ %s ]\n", msg));
+ subMonitor.worked(1);
+ subMonitor.done();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn.IOperation#getTotalWork()
+ */
+ @Override
+ public int getTotalWork() {
+ return 1;
+ }
+ }
+
+ private final class VerifyTxModTypeOperation implements IOperation {
+
+ private final Map<TypesEnum, String> modTypeVerificationMap;
+
+ public VerifyTxModTypeOperation() {
+ modTypeVerificationMap = new HashMap<TypesEnum, String>();
+ modTypeVerificationMap.put(TypesEnum.artifacts, VERIFY_ARTIFACT_MOD_TYPE);
+ modTypeVerificationMap.put(TypesEnum.attributes, VERIFY_ATTRIBUTE_MOD_TYPE);
+ modTypeVerificationMap.put(TypesEnum.relations, VERIFY_RELATION_MOD_TYPE);
+ }
+
+ @Override
+ public void execute(IProgressMonitor monitor, int startAtTxNumber) throws Exception {
+ final IProgressMonitor subMonitor = new SubProgressMonitor(monitor, getTotalWork());
+ subMonitor.beginTask("Verifying Tx Mod Types", getTotalWork());
+ final Map<TypesEnum, Integer> results = new HashMap<TypesEnum, Integer>();
+ final MutableInteger totalRowCount = new MutableInteger(0);
+ for (final TypesEnum type : modTypeVerificationMap.keySet()) {
+ monitor.subTask(String.format("Verifying: [%s]", type.name()));
+ String sql = modTypeVerificationMap.get(type);
+ if (Strings.isValid(sql)) {
+ executeQuery(monitor, new IRowProcessor() {
+ @Override
+ public void processRow(ConnectionHandlerStatement chStmt) throws OseeDataStoreException {
+ int total = chStmt.getInt("total");
+ totalRowCount.getValueAndInc(total);
+ results.put(type, total);
+ }
+ }, 0, sql);
+ }
+ monitor.worked(1);
+ }
+ String msg = null;
+ boolean result = totalRowCount.getValue() == 0;
+ if (monitor.isCanceled()) {
+ msg = "Cancelled";
+ } else if (result) {
+ msg = "Passed";
+ } else {
+ msg = "Failed";
+ print(String.format("Tx Mod Type Verification Results [ %s ]\n", results));
+ }
+ print(String.format("Tx Mod Type Verification [ %s ]\n", msg));
+ subMonitor.done();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.UpdateCurrentColumn.IOperation#getTotalWork()
+ */
+ @Override
+ public int getTotalWork() {
+ return modTypeVerificationMap.size();
+ }
+ }
+
+ private interface IRowProcessor {
+ void processRow(ConnectionHandlerStatement chStmt) throws OseeDataStoreException;
+ }
+
+ private int executeQuery(IProgressMonitor monitor, IRowProcessor processor, int fetchSize, String sql, Object... data) throws Exception {
+ int totalRowCount = 0;
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(fetchSize, sql, data);
+ while (chStmt.next()) {
+ totalRowCount++;
+ processor.processRow(chStmt);
+ if (monitor.isCanceled()) {
+ break;
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ return totalRowCount;
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateWordFormattedContentAttributes.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateWordFormattedContentAttributes.java
new file mode 100644
index 00000000000..3ebd9eb6aea
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/UpdateWordFormattedContentAttributes.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class UpdateWordFormattedContentAttributes extends AbstractBlam {
+ private static final String UPDATE_ATTRIBUTE_TYPE_WHOLE_WORD =
+ "update osee_attribute set attr_type_id = 963 where gamma_id in (select t2.gamma_id from osee_artifact t1, osee_attribute t2 where t1.art_id = t2.art_id and t2.attr_type_id = 19 and t1.art_type_id in (select art_type_id from osee_artifact_type where name in ('Checklist (WordML)', 'Guideline', 'How To', 'Renderer Template', 'Roadmap','Template (WordML)', 'Test Procedure WML', 'Work Instruction', 'Work Sheet (WordML)')))";
+ private static final String UPDATE_ATTRIBUTE_TYPE_WORD_TEMPLATE =
+ "update osee_attribute set attr_type_id = 962 where attr_type_id = 19";
+ private static final String UPDATE_ATTR_VAL_WHOLE_WORD =
+ "update osee_valid_attributes set attr_type_id = 963 where attr_type_id = 19 and art_type_id in (select art_type_id from osee_artifact_type where name in ('Checklist (WordML)', 'Guideline', 'How To', 'Renderer Template', 'Roadmap','Template (WordML)', 'Test Procedure WML', 'Work Instruction', 'Work Sheet (WordML)'))";
+ private static final String UPDATE_ATTR_VAL_WORD_TEMP =
+ "update osee_valid_attributes set attr_type_id = 962 where attr_type_id = 19";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Update WordFormattedContent Attributes";
+ }
+
+ @Override
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ monitor.beginTask("Update Word Fromatted Content attributes", 4);
+ monitor.setTaskName("UPDATE_ATTRIBUTE_TYPE_WHOLE_WORD");
+ ConnectionHandler.runPreparedUpdate(UPDATE_ATTRIBUTE_TYPE_WHOLE_WORD);
+ monitor.worked(1);
+ monitor.setTaskName("UPDATE_ATTRIBUTE_TYPE_WORD_TEMPLATE");
+ ConnectionHandler.runPreparedUpdate(UPDATE_ATTRIBUTE_TYPE_WORD_TEMPLATE);
+ monitor.worked(1);
+ monitor.setTaskName("UPDATE_ATTR_VAL_WHOLE_WORD");
+ ConnectionHandler.runPreparedUpdate(UPDATE_ATTR_VAL_WHOLE_WORD);
+ monitor.worked(1);
+ monitor.setTaskName("UPDATE_ATTR_VAL_WORD_TEMP");
+ ConnectionHandler.runPreparedUpdate(UPDATE_ATTR_VAL_WORD_TEMP);
+ monitor.done();
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ValidateArtifactsToDelete.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ValidateArtifactsToDelete.java
new file mode 100644
index 00000000000..d5082cafc7c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/ValidateArtifactsToDelete.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactChecks;
+import org.eclipse.osee.framework.skynet.core.artifact.IArtifactCheck;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * Calls extensions to determine if artifacts are valid to delete.
+ *
+ * @author Don G. Dunne
+ */
+public class ValidateArtifactsToDelete extends AbstractBlam {
+
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ processChange(variableMap.getArtifacts("artifact"));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "Validate Artifacts To Delete";
+ }
+
+ /**
+ * Changes the descriptor of the artifacts to the provided artifact descriptor
+ *
+ * @param artifacts
+ * @param descriptor
+ */
+ private void processChange(List<Artifact> artifacts) {
+ if (artifacts.isEmpty()) {
+ throw new IllegalArgumentException("The artifact list can not be empty");
+ }
+
+ XResultData rd = new XResultData();
+ rd.log("Validation Artifacts: " + Artifacts.toString("; ", artifacts));
+ // Confirm artifacts are fit to delete
+ try {
+ for (IArtifactCheck check : ArtifactChecks.getArtifactChecks()) {
+ try {
+ IStatus result = check.isDeleteable(artifacts);
+ if (!result.isOK()) {
+ rd.logError(result.getMessage());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ rd.log("Exception occurred...see error log" + ex.getLocalizedMessage());
+ }
+ }
+ rd.log("\n");
+ rd.log("Validation Complete - Any errors will be displayed.");
+ rd.report("Validate Artifacts to Delete");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "Drag in Artifacts and press Play button on top right. Artifacts will be validated for deletion by framework. NOTE: Artifacts will NOT be deleted, only validated for deletion.";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XListDropViewer\" displayName=\"artifact\" /></xWidgets>";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Admin");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/XWidgetPopulateExample.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/XWidgetPopulateExample.java
new file mode 100644
index 00000000000..57aa79c572d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/operation/XWidgetPopulateExample.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.framework.ui.skynet.blam.operation;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XWidgetPopulateExample extends AbstractBlam {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getName()
+ */
+ @Override
+ public String getName() {
+ return "XWidget Populate Example";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#runOperation(org.eclipse.osee.framework.ui.skynet.blam.VariableMap, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
+ // AWorkbench.popup("Execute", "Blam is an example only. Nothing done.");
+ print("Test Output Line\n");
+ print("Test Output Line\n");
+ print("Test Output Line\n");
+ print("Test Output Line\n");
+ print("Test Output Line\n");
+ print("Test Output Line\n");
+ monitor.done();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation#getXWidgetXml()
+ */
+ @Override
+ public String getXWidgetsXml() {
+ return "<xWidgets><XWidget xwidgetType=\"XCombo(1,2,3)\" displayName=\"Select an Option\" /></xWidgets>";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#widgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget, org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout, org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ @Override
+ public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener modListener, boolean isEditable) throws OseeCoreException {
+ super.widgetCreating(xWidget, toolkit, art, dynamicXWidgetLayout, modListener, isEditable);
+ if (xWidget.getLabel().equals("Select an Option")) {
+ XCombo combo = (XCombo) xWidget;
+ combo.setDataStrings(new String[] {"A", "B", "C"});
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.blam.operation.AbstractBlam#getDescriptionUsage()
+ */
+ @Override
+ public String getDescriptionUsage() {
+ return "This blam is an example to show how an XWidget can populate it's values ( or perform other"
+ //
+ + " operations on the XWidget ) during it's creation. This is used when the options or default" +
+ //
+ " selected value may come from another dynamic source such as a database query.";
+ }
+
+ public Collection<String> getCategories() {
+ return Arrays.asList("Util");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BaseBlamSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BaseBlamSection.java
new file mode 100644
index 00000000000..1c5ac189b4a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BaseBlamSection.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.framework.ui.skynet.blam.sections;
+
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditorInput;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BaseBlamSection extends SectionPart {
+
+ private final BlamEditor editor;
+
+ /**
+ * @param parent
+ * @param toolkit
+ * @param style
+ */
+ public BaseBlamSection(BlamEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(parent, toolkit, style);
+ this.editor = editor;
+ }
+
+ public BlamEditor getEditor() {
+ return editor;
+ }
+
+ public BlamEditorInput getEditorInput() {
+ return editor.getEditorInput();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamInputSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamInputSection.java
new file mode 100644
index 00000000000..6cd0a149ac0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamInputSection.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.framework.ui.skynet.blam.sections;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidgetUtility;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DefaultXWidgetOptionResolver;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkPage;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BlamInputSection extends BaseBlamSection {
+
+ private final Collection<DynamicXWidgetLayoutData> dynamicInputLayouts;
+
+ /**
+ * @param editor
+ * @param parent
+ * @param toolkit
+ * @param style
+ */
+ public BlamInputSection(BlamEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(editor, parent, toolkit, style);
+ this.dynamicInputLayouts = new ArrayList<DynamicXWidgetLayoutData>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(IManagedForm form) {
+ super.initialize(form);
+ Section section = getSection();
+ section.setText("Parameters");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ updateDataPart();
+ }
+
+ public VariableMap getData() {
+ VariableMap blamVariableMap = new VariableMap();
+ List<XWidget> xWidgets = XWidgetUtility.findXWidgetsInControl(getSection());
+ for (XWidget xWidget : xWidgets) {
+ blamVariableMap.setValue(xWidget.getLabel(), xWidget.getData());
+ }
+ return blamVariableMap;
+ }
+
+ private void updateDataPart() {
+ final IManagedForm form = getManagedForm();
+ final FormToolkit toolkit = form.getToolkit();
+ final Section section = getSection();
+
+ Control control = section.getClient();
+ if (Widgets.isAccessible(control)) {
+ control.dispose();
+ }
+ Composite sectionBody = toolkit.createComposite(section, toolkit.getBorderStyle());
+ sectionBody.setLayout(new GridLayout());
+ sectionBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createWidgets(sectionBody);
+
+ section.setClient(sectionBody);
+ toolkit.paintBordersFor(section);
+
+ section.layout(true);
+ form.getForm().getBody().layout(true);
+
+ }
+
+ private void createWidgets(Composite parent) {
+ try {
+ List<DynamicXWidgetLayoutData> layoutDatas = getDynamicXWidgetLayouts();
+ WorkPage workPage = new WorkPage(layoutDatas, new DefaultXWidgetOptionResolver());
+ workPage.createBody(getManagedForm(), parent, null, new XModifiedListener() {
+
+ @Override
+ public void widgetModified(XWidget widget) {
+ getManagedForm().reflow(true);
+ }
+
+ }, true);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private List<DynamicXWidgetLayoutData> getDynamicXWidgetLayouts() throws Exception {
+ List<DynamicXWidgetLayoutData> itemsToReturn = new ArrayList<DynamicXWidgetLayoutData>();
+ itemsToReturn.addAll(getEditorInput().getArtifact().getLayoutDatas());
+ itemsToReturn.addAll(dynamicInputLayouts);
+ return itemsToReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ updateDataPart();
+ }
+
+ public void setDynamicXWidgetLayouts(Collection<DynamicXWidgetLayout> layouts) {
+ if (layouts != null) {
+ this.dynamicInputLayouts.clear();
+ for (DynamicXWidgetLayout layout : layouts) {
+ this.dynamicInputLayouts.addAll(layout.getLayoutDatas());
+ }
+ refresh();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamOutputSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamOutputSection.java
new file mode 100644
index 00000000000..88ce95971a2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamOutputSection.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.sections;
+
+import java.io.IOException;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.Text;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BlamOutputSection extends BaseBlamSection {
+
+ private Text formText;
+ private Appendable appendableOutput;
+
+ /**
+ * @param editor
+ * @param parent
+ * @param toolkit
+ * @param style
+ */
+ public BlamOutputSection(BlamEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(editor, parent, toolkit, style);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(IManagedForm form) {
+ super.initialize(form);
+ Section section = getSection();
+ section.setText("Execute");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ final FormToolkit toolkit = getManagedForm().getToolkit();
+ Composite composite = toolkit.createComposite(getSection(), toolkit.getBorderStyle() | SWT.WRAP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ final Action action = getEditor().getActionBarContributor().getExecuteBlamAction();
+ ActionContributionItem contributionItem = new ActionContributionItem(action);
+ contributionItem.setMode(ActionContributionItem.MODE_FORCE_TEXT);
+ contributionItem.fill(composite);
+
+ formText = toolkit.createText(composite, "BLAM has not yet run\n", SWT.WRAP);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.heightHint = 500;
+ gd.widthHint = 200;
+ formText.setLayoutData(gd);
+
+ getSection().setClient(composite);
+ toolkit.paintBordersFor(composite);
+ }
+
+ public void appendText(final String text) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (Widgets.isAccessible(formText)) {
+ formText.append(text);
+ getManagedForm().reflow(true);
+ }
+ }
+ });
+ }
+
+ public void setText(final String text) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (Widgets.isAccessible(formText)) {
+ formText.setText(text);
+ getManagedForm().reflow(true);
+ }
+ }
+ });
+ }
+
+ public Appendable getOutput() {
+ if (appendableOutput == null) {
+ appendableOutput = new InternalAppendable();
+ }
+ return appendableOutput;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (Widgets.isAccessible(formText)) {
+ formText.dispose();
+ }
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ }
+
+ private final class InternalAppendable implements Appendable {
+
+ private void write(final String text) {
+ appendText(text);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Appendable#append(java.lang.CharSequence)
+ */
+ @Override
+ public Appendable append(CharSequence csq) throws IOException {
+ if (csq == null) {
+ write("null");
+ } else {
+ write(csq.toString());
+ }
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Appendable#append(char)
+ */
+ @Override
+ public Appendable append(char c) throws IOException {
+ write(new String(new char[] {c}));
+ return this;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Appendable#append(java.lang.CharSequence, int, int)
+ */
+ @Override
+ public Appendable append(CharSequence csq, int start, int end) throws IOException {
+ CharSequence cs = csq == null ? "null" : csq;
+ write(cs.subSequence(start, end).toString());
+ return this;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamUsageSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamUsageSection.java
new file mode 100644
index 00000000000..ba5db531b8a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/blam/sections/BlamUsageSection.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.blam.sections;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BlamUsageSection extends BaseBlamSection {
+
+ private FormText formText;
+
+ /**
+ * @param editor
+ * @param parent
+ * @param toolkit
+ * @param style
+ */
+ public BlamUsageSection(BlamEditor editor, Composite parent, FormToolkit toolkit, int style) {
+ super(editor, parent, toolkit, style);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
+ */
+ @Override
+ public void initialize(IManagedForm form) {
+ super.initialize(form);
+ Section section = getSection();
+ section.setText("Description and Usage");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ XFormToolkit.addHelpLinkToSection(form.getToolkit(), section, "/org.eclipse.pde.doc.user/guide/pde_running.htm");
+ updateText(true);
+ }
+
+ private void updateText(boolean isCreate) {
+ if (isCreate) {
+ final FormToolkit toolkit = getManagedForm().getToolkit();
+ Composite composite = toolkit.createComposite(getSection(), toolkit.getBorderStyle() | SWT.WRAP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ formText = toolkit.createFormText(composite, false);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.widthHint = 200;
+ formText.setLayoutData(gd);
+
+ getSection().setClient(composite);
+ toolkit.paintBordersFor(composite);
+ }
+
+ if (Widgets.isAccessible(formText)) {
+ try {
+ formText.setText(getUsageDescription(), true, true);
+ } catch (Exception ex) {
+ formText.setText(Lib.exceptionToString(ex), false, false);
+ }
+ getManagedForm().reflow(true);
+ }
+ }
+
+ private String getUsageDescription() throws Exception {
+ StringBuilder builder = new StringBuilder();
+ String data = getEditorInput().getArtifact().getDescriptionUsage();
+ if (!data.startsWith("<form>")) {
+ builder.append("<form>");
+ }
+ builder.append(data.replaceAll("\n", "<br/>"));
+ if (!data.endsWith("</form>")) {
+ builder.append("</form>");
+ }
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (Widgets.isAccessible(formText)) {
+ formText.dispose();
+ }
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.forms.AbstractFormPart#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ updateText(false);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectComposite.java
new file mode 100644
index 00000000000..9979d2deb5b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectComposite.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.branch;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchSelectComposite extends Composite implements Listener {
+ protected static final int SIZING_TEXT_FIELD_WIDTH = 250;
+
+ private Button branchSelectButton;
+ private Text branchSelectTextWidget;
+ private Branch selectedBranch;
+ private final Set<Listener> listeners;
+ private final boolean allowOnlyWorkingBranches;
+
+ public BranchSelectComposite(Composite parent, int style, boolean allowOnlyWorkingBranches) {
+ super(parent, style);
+ this.allowOnlyWorkingBranches = allowOnlyWorkingBranches;
+ this.listeners = Collections.synchronizedSet(new HashSet<Listener>());
+ createControl(this);
+ }
+
+ public static BranchSelectComposite createWorkingBranchSelectComposite(Composite parent, int style) {
+ return new BranchSelectComposite(parent, style, true);
+ }
+
+ public static BranchSelectComposite createBranchSelectComposite(Composite parent, int style) {
+ return new BranchSelectComposite(parent, style, false);
+ }
+
+ private void createControl(Composite parent) {
+ parent.setLayout(new GridLayout(2, false));
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ branchSelectTextWidget = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
+ data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+ branchSelectTextWidget.setLayoutData(data);
+ branchSelectTextWidget.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ branchSelectTextWidget.setText(" -- Select A Branch -- ");
+
+ branchSelectButton = new Button(parent, SWT.PUSH);
+ branchSelectButton.setText("Select Branch...");
+ branchSelectButton.addListener(SWT.Selection, this);
+ branchSelectButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ branchSelectButton.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ if (event.button == 3) {
+ try {
+ setSelected(BranchManager.getCommonBranch());
+ notifyListener(event);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ }
+
+ public Branch getSelectedBranch() {
+ return selectedBranch;
+ }
+
+ private boolean areOnlyWorkingBranchesAllowed() {
+ return allowOnlyWorkingBranches;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ if (event.widget == branchSelectButton) {
+ if (areOnlyWorkingBranchesAllowed()) {
+ Branch newBranch = BranchSelectionDialog.getWorkingBranchFromUser();
+ if (newBranch != null) {
+ setSelected(newBranch);
+ }
+ } else {
+ Branch newBranch = BranchSelectionDialog.getBranchFromUser();
+ if (newBranch != null) {
+ setSelected(newBranch);
+ }
+ }
+ }
+ notifyListener(event);
+ }
+
+ public void setSelected(Branch branch) {
+ if (branch != null) {
+ selectedBranch = branch;
+ branchSelectTextWidget.setText(selectedBranch.getBranchName());
+ } else {
+ branchSelectTextWidget.setText(" -- Select A Branch -- ");
+ }
+ }
+
+ private void notifyListener(Event event) {
+ synchronized (listeners) {
+ for (Listener listener : listeners) {
+ listener.handleEvent(event);
+ }
+ }
+ }
+
+ public void addListener(Listener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(Listener listener) {
+ synchronized (listeners) {
+ listeners.remove(listener);
+ }
+ }
+
+ /**
+ * @param defaultSelectedBranch the defaultSelectedBranch to set
+ */
+ public void setDefaultSelectedBranch(Branch defaultSelectedBranch) {
+ setSelected(defaultSelectedBranch);
+ }
+
+ /**
+ * @return the branchSelectLabel
+ */
+ public Text getBranchSelectText() {
+ return branchSelectTextWidget;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectionDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectionDialog.java
new file mode 100644
index 00000000000..14725214829
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/BranchSelectionDialog.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.framework.ui.skynet.branch;
+
+import java.util.List;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchOptions;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.XBranchWidget;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class BranchSelectionDialog extends MessageDialog {
+
+ Branch selected = null;
+ XBranchWidget branchWidget;
+ private final boolean allowOnlyWorkingBranches;
+
+ public BranchSelectionDialog(String title, boolean allowOnlyWorkingBranches) {
+ super(Display.getCurrent().getActiveShell(), title, null, null, MessageDialog.NONE,
+ new String[] {"Ok", "Cancel"}, 0);
+ this.allowOnlyWorkingBranches = allowOnlyWorkingBranches;
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ public Branch getSelection() {
+ return selected;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ branchWidget = new XBranchWidget(true, true);
+ branchWidget.setDisplayLabel(false);
+ branchWidget.createWidgets(container, 1);
+ branchWidget.setBranchOptions(BranchOptions.FAVORITES_FIRST, BranchOptions.FLAT);
+ branchWidget.setShowWorkingBranchesOnly(allowOnlyWorkingBranches);
+ branchWidget.loadData();
+
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 500;
+ gd.widthHint = 800;
+ branchWidget.getXViewer().getTree().setLayoutData(gd);
+ branchWidget.getXViewer().getTree().addListener(SWT.MouseDoubleClick, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ handleDoubleClick();
+ }
+ });
+ branchWidget.getXViewer().getTree().addSelectionListener(new SelectionListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ storeSelectedBranch();
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+ return branchWidget.getControl();
+ }
+
+ public Branch getSelected() {
+ return selected;
+ }
+
+ private void storeSelectedBranch() {
+ List<Branch> branches = branchWidget.getSelectedBranches();
+
+ if (!branches.isEmpty()) {
+ selected = branches.iterator().next();
+ BranchManager.setLastBranch(selected);
+ }
+ }
+
+ private void handleDoubleClick() {
+ storeSelectedBranch();
+ okPressed();
+ }
+
+ private static Branch createDialog(boolean allowOnlyWorkingBranches) {
+ Branch toReturn = null;
+ BranchSelectionDialog branchSelection = new BranchSelectionDialog("Select Branch", allowOnlyWorkingBranches);
+ int result = branchSelection.open();
+ if (result == Window.OK) {
+ toReturn = branchSelection.getSelection();
+ }
+ return toReturn;
+ }
+
+ public static Branch getBranchFromUser() {
+ return createDialog(false);
+ }
+
+ public static Branch getWorkingBranchFromUser() {
+ return createDialog(true);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/RootBranchWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/RootBranchWizard.java
new file mode 100644
index 00000000000..3791ca5334e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/branch/RootBranchWizard.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.framework.ui.skynet.branch;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class RootBranchWizard extends Wizard implements INewWizard {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AbstractSelectionChangedHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AbstractSelectionChangedHandler.java
new file mode 100644
index 00000000000..f2b0f35c8ce
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AbstractSelectionChangedHandler.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.framework.ui.skynet.commandHandlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.HandlerEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ * @author Jeff C. Phillips
+ */
+public abstract class AbstractSelectionChangedHandler extends AbstractHandler {
+ private final HandlerEvent enabledChangedEvent = new HandlerEvent(this, true, false);
+ private ViewerMenuDetectListener viewerMenuDetectListener;
+
+ public AbstractSelectionChangedHandler() {
+ addlistener();
+ }
+ private class ViewerMenuDetectListener implements MenuDetectListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.MenuDetectListener#menuDetected(org.eclipse.swt.events.MenuDetectEvent)
+ */
+ public void menuDetected(MenuDetectEvent e) {
+ fireHandlerChanged(enabledChangedEvent);
+ }
+ }
+
+ private void addlistener() {
+ if (!PlatformUI.getWorkbench().isClosing()) {
+ viewerMenuDetectListener = new ViewerMenuDetectListener();
+ IWorkbenchPart workbenchPart = AWorkbench.getActivePage()
+ .getActivePart();
+ Object object = workbenchPart.getSite().getSelectionProvider();
+
+ if (object instanceof Viewer) {
+ ((Viewer) object).getControl().addMenuDetectListener(
+ viewerMenuDetectListener);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AccessControlHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AccessControlHandler.java
new file mode 100644
index 00000000000..f174d770741
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/AccessControlHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.access.PolicyDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AccessControlHandler extends CommandHandler {
+ private Object object;
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ try {
+ PolicyDialog pd = new PolicyDialog(Display.getCurrent().getActiveShell(), object);
+ pd.open();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ boolean enabled = false;
+
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ List<Artifact> artifacts = Handlers.getArtifactsFromStructuredSelection(selection);
+
+ boolean hasArtifacts = artifacts.size() == 1;
+ enabled = hasArtifacts || (branches.size() == 1);
+
+ if (enabled) {
+ object = hasArtifacts ? artifacts.iterator().next() : branches.iterator().next();
+ enabled &=
+ (AccessControlManager.isOseeAdmin() || AccessControlManager.checkObjectPermission(object,
+ PermissionEnum.FULLACCESS));
+ }
+
+ return enabled;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ChangeReportHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ChangeReportHandler.java
new file mode 100644
index 00000000000..f624d78ad50
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ChangeReportHandler.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.framework.ui.skynet.commandHandlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ChangeReportHandler extends AbstractHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection = (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ if (!selection.isEmpty()) {
+ Object selectedObject = selection.getFirstElement();
+ try {
+ if (selectedObject instanceof TransactionId) {
+ ChangeView.open((TransactionId) selectedObject);
+ } else if (selectedObject instanceof Branch) {
+ ChangeView.open((Branch) selectedObject);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean enabled = false;
+
+ IStructuredSelection selection = (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ if (!selection.isEmpty()) {
+ Object selectedObject = selection.getFirstElement();
+
+ if (selectedObject instanceof TransactionId) {
+ enabled = ((TransactionId) selectedObject).getTxType() != TransactionDetailsType.Baselined;
+ } else if(selectedObject instanceof Branch){
+ enabled = true;
+ }
+ }
+
+ return enabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CollapseTreeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CollapseTreeHandler.java
new file mode 100644
index 00000000000..5102c8db777
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CollapseTreeHandler.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.framework.ui.skynet.commandHandlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Theron Virgin
+ */
+public class CollapseTreeHandler extends AbstractHandler {
+ private TreeViewer treeViewer;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ treeViewer.collapseAll();
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ treeViewer = selectionProvider instanceof TreeViewer ? (TreeViewer) selectionProvider : null;
+
+ return treeViewer != null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CompressWordAttributesHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CompressWordAttributesHandler.java
new file mode 100644
index 00000000000..f6492caef4e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CompressWordAttributesHandler.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+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.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ */
+public class CompressWordAttributesHandler extends AbstractHandler {
+ private List<Artifact> artifacts;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ Jobs.startJob(new Job("Compress Word Attributes") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ int count = 0;
+ final int total = artifacts.size();
+
+ monitor.beginTask("Analyzing attributes", total);
+
+ for (Artifact artifact : artifacts) {
+ if (WordUtil.revertNonusefulWordChanges(artifact.getArtId(), artifact.getBranch(),
+ "osee_compression_gammas")) count++;
+ monitor.worked(1);
+ if (monitor.isCanceled()) {
+ monitor.done();
+ return Status.CANCEL_STATUS;
+ }
+ }
+
+ final int finalCount = count;
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Compression Data", finalCount + " of the " + total + " artifacts need compression");
+ }
+ });
+
+ monitor.done();
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, Status.OK, ex.getLocalizedMessage(), ex);
+ }
+ }
+
+ });
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ boolean enabled = false;
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ try {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ if (!artifacts.isEmpty()) {
+ boolean writePermission =
+ AccessControlManager.checkObjectPermission(artifacts.get(0), PermissionEnum.WRITE);
+ enabled = writePermission && AccessControlManager.isOseeAdmin();
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ enabled = false;
+ }
+ return enabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CopyHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CopyHandler.java
new file mode 100644
index 00000000000..9c0ba62df13
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/CopyHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactClipboard;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class CopyHandler extends AbstractHandler {
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (HandlerUtil.getActivePartChecked(event) instanceof ViewPart) {
+ ViewPart view = (ViewPart) HandlerUtil.getActivePartChecked(event);
+ IWorkbenchPartSite myIWorkbenchPartSite = view.getSite();
+ ISelectionProvider selectionProvider = myIWorkbenchPartSite.getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) selectionProvider.getSelection();
+
+ List<String> names = new LinkedList<String>();
+ List<Artifact> artifacts = new LinkedList<Artifact>();
+ ArtifactClipboard clipboard = new ArtifactClipboard(view.getSite().getId());
+ Iterator<?> iterator = selection.iterator();
+ Object selectionObject = null;
+
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+
+ if (object instanceof IAdaptable) {
+ selectionObject = ((IAdaptable) object).getAdapter(Branch.class);
+
+ if (selectionObject == null) {
+ selectionObject = ((IAdaptable) object).getAdapter(Artifact.class);
+ }
+ } else if (object instanceof Match) {
+ selectionObject = ((Match) object).getElement();
+ }
+
+ if (selectionObject instanceof Branch) {
+ names.add(((Branch) selectionObject).getBranchName());
+ } else if (selectionObject instanceof Artifact) {
+ Artifact artifact = (Artifact) selectionObject;
+ names.add(artifact.getDescriptiveName());
+ artifacts.add(artifact);
+ }
+ }
+
+ if (!names.isEmpty() && artifacts.isEmpty()) {
+ clipboard.setTextToClipboard(names);
+ } else if (!names.isEmpty() && !artifacts.isEmpty()) {
+ clipboard.setArtifactsToClipboard(artifacts, names);
+ }
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isHandled()
+ */
+ @Override
+ public boolean isHandled() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/DeleteArtifactHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/DeleteArtifactHandler.java
new file mode 100644
index 00000000000..744cb0976a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/DeleteArtifactHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class DeleteArtifactHandler extends CommandHandler {
+ private List<Artifact> artifacts;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Confirm Artifact Deletion", null,
+ " Are you sure you want to delete this artifact and all of the default hierarchy children?",
+ MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1);
+ if (dialog.open() == 0) {
+ Artifact[] artifactsArray = artifacts.toArray(new Artifact[artifacts.size()]);
+ SkynetTransaction transaction = new SkynetTransaction(artifactsArray[0].getBranch());
+ ArtifactPersistenceManager.deleteArtifact(transaction, false, artifactsArray);
+ transaction.execute();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+ isEnabled = AccessControlManager.getInstance().checkObjectListPermission(artifacts, PermissionEnum.WRITE);
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ExpandTreeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ExpandTreeHandler.java
new file mode 100644
index 00000000000..6907950c1b1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ExpandTreeHandler.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.framework.ui.skynet.commandHandlers;
+
+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.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Theron Virgin
+ */
+public class ExpandTreeHandler extends AbstractHandler {
+ private TreeViewer treeViewer;
+ private IStructuredSelection structuredSelection;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ Iterator<?> iter = structuredSelection.iterator();
+ while (iter.hasNext()) {
+ treeViewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ structuredSelection = null;
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ treeViewer = selectionProvider instanceof TreeViewer ? (TreeViewer) selectionProvider : null;
+
+ if (treeViewer != null && treeViewer.getSelection() instanceof IStructuredSelection) {
+ structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ }
+ return treeViewer != null && structuredSelection != null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/Handlers.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/Handlers.java
new file mode 100644
index 00000000000..b9b4ff64572
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/Handlers.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.framework.ui.skynet.commandHandlers;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * This is a utility class for OSEE handlers
+ *
+ * @author Jeff C. Phillips
+ */
+public class Handlers {
+
+ /**
+ * Populates a list of ArtifactChange from a IStructuredSelection. Returns an empty list if no ArtifactChange were
+ * found.
+ *
+ * @param selection
+ */
+ public static List<ArtifactChange> getArtifactChangesFromStructuredSelection(IStructuredSelection structuredSelection) {
+ return processSelectionObjects(ArtifactChange.class, structuredSelection);
+ }
+
+ /**
+ * Populates a list of TransactionIds from a IStructuredSelection. Returns an empty list if no TransactionIds were
+ * found.
+ *
+ * @param selection
+ */
+ public static List<TransactionId> getTransactionsFromStructuredSelection(IStructuredSelection structuredSelection) {
+ return processSelectionObjects(TransactionId.class, structuredSelection);
+ }
+
+ /**
+ * Populates a list of branches from a IStructuredSelection. Returns an empty list if no branches were found.
+ *
+ * @param selection
+ */
+ public static List<Branch> getBranchesFromStructuredSelection(IStructuredSelection structuredSelection) {
+ return processSelectionObjects(Branch.class, structuredSelection);
+ }
+
+ /**
+ * Populates a list of artifacts from a IStructuredSelection. Returns an empty list if no artifacts were found.
+ *
+ * @param selection
+ */
+ public static List<Artifact> getArtifactsFromStructuredSelection(IStructuredSelection structuredSelection) {
+ return processSelectionObjects(Artifact.class, structuredSelection);
+ }
+
+ /**
+ * @param clazz
+ * @param structuredSelection
+ * @return Returns a list of objects from the sturctruedSelection that are an instance of the Class
+ */
+ public static <E> List<E> processSelectionObjects(Class<E> clazz, IStructuredSelection structuredSelection) {
+ List<E> objects = new LinkedList<E>();
+ Iterator<?> iterator = structuredSelection.iterator();
+
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+ Object targetObject = null;
+
+ if (object instanceof IAdaptable) {
+ targetObject = ((IAdaptable) object).getAdapter(clazz);
+ } else if (object instanceof Match) {
+ targetObject = ((Match) object).getElement();
+ }
+
+ if (clazz.isInstance(targetObject)) {
+ objects.add(clazz.cast(targetObject));
+ }
+ }
+ return objects;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenArtifactExplorerHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenArtifactExplorerHandler.java
new file mode 100644
index 00000000000..f0d6637cea4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenArtifactExplorerHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenArtifactExplorerHandler extends AbstractHandler {
+
+ private List<Branch> getSelectedBranches() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ return Handlers.getBranchesFromStructuredSelection(structuredSelection);
+ }
+ return Collections.emptyList();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ List<Branch> branches = getSelectedBranches();
+ if (!branches.isEmpty()) {
+ ArtifactExplorer.exploreBranch(branches.iterator().next());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return !getSelectedBranches().isEmpty();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenMassArtifactEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenMassArtifactEditorHandler.java
new file mode 100644
index 00000000000..5dd99e68fe0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenMassArtifactEditorHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassArtifactEditor;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OpenMassArtifactEditorHandler extends CommandHandler {
+ private static final AccessControlManager accessControlManager = AccessControlManager.getInstance();
+ private List<Artifact> artifacts;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ MassArtifactEditor.editArtifacts("", artifacts);
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ isEnabled = accessControlManager.checkObjectListPermission(artifacts, PermissionEnum.WRITE);
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenSkywalkerEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenSkywalkerEditorHandler.java
new file mode 100644
index 00000000000..5c7c7a1596b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/OpenSkywalkerEditorHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OpenSkywalkerEditorHandler extends AbstractHandler {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Artifact> artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ if (!artifacts.isEmpty()) {
+ SkyWalkerView.exploreArtifact(artifacts.iterator().next());
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PasteHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PasteHandler.java
new file mode 100644
index 00000000000..909066ed443
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PasteHandler.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.framework.ui.skynet.commandHandlers;
+
+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.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactClipboard;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Theron Virgin
+ */
+public class PasteHandler extends AbstractHandler {
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (HandlerUtil.getActivePartChecked(event) instanceof ViewPart) {
+ ViewPart view = (ViewPart) HandlerUtil.getActivePartChecked(event);
+ IWorkbenchPartSite myIWorkbenchPartSite = view.getSite();
+ ISelectionProvider selectionProvider = myIWorkbenchPartSite.getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) selectionProvider.getSelection();
+
+ ArtifactClipboard clipboard = new ArtifactClipboard(view.getSite().getId());
+ Iterator<?> iterator = selection.iterator();
+ Object selectionObject = null;
+
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+
+ if (object instanceof IAdaptable) {
+ selectionObject = ((IAdaptable) object).getAdapter(Branch.class);
+
+ if (selectionObject == null) {
+ selectionObject = ((IAdaptable) object).getAdapter(Artifact.class);
+ }
+ } else if (object instanceof Match) {
+ selectionObject = ((Match) object).getElement();
+ }
+
+ if (selectionObject instanceof Artifact) {
+ try {
+ clipboard.pasteArtifactsFromClipboard((Artifact) selectionObject);
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isHandled()
+ */
+ @Override
+ public boolean isHandled() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PurgeArtifactHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PurgeArtifactHandler.java
new file mode 100644
index 00000000000..9311c4cc005
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/PurgeArtifactHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+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.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PurgeArtifactHandler extends CommandHandler {
+ private List<Artifact> artifacts;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (MessageDialog.openConfirm(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Confirm Artifact Purge ",
+ " Are you sure you want to purge this artifact, all of " + "its children and all history associated with these artifacts from the database ?")) {
+ Job job = new Job("Purge artifact") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ monitor.beginTask("Purge artifact", artifacts.size());
+ try {
+ new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ for (Artifact artifactToPurge : artifacts) {
+ monitor.setTaskName("Purge: " + artifactToPurge.getDescriptiveName());
+ artifactToPurge.purgeFromBranch(connection);
+ monitor.worked(1);
+ }
+ }
+ }.execute();
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ toReturn = new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return toReturn;
+ }
+ };
+ Jobs.startJob(job);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+ isEnabled =
+ AccessControlManager.isOseeAdmin() && AccessControlManager.getInstance().checkObjectListPermission(
+ artifacts, PermissionEnum.WRITE);
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevealInArtifactExplorer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevealInArtifactExplorer.java
new file mode 100644
index 00000000000..0b0d2380b76
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevealInArtifactExplorer.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class RevealInArtifactExplorer extends AbstractHandler {
+ private Artifact artifact;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ ArtifactExplorer.revealArtifact(artifact);
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ boolean isEnabled = false;
+
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Artifact> artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ if (artifacts.isEmpty()) {
+ return false;
+ }
+
+ artifact = artifacts.iterator().next();
+ isEnabled = true;
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertArtifactHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertArtifactHandler.java
new file mode 100644
index 00000000000..f0bc3a4d130
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertArtifactHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.revert.RevertWizard;
+import org.eclipse.osee.framework.ui.swt.NonmodalWizardDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ * @author Jeff C. Phillips
+ */
+public class RevertArtifactHandler extends AbstractHandler {
+ private List<ArtifactChange> artifactChanges;
+
+ public RevertArtifactHandler() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // This is serious stuff, make sure the user understands the impact.
+
+ List<List<Artifact>> artifacts = new LinkedList<List<Artifact>>();
+ Set<Artifact> duplicateCheck = new HashSet<Artifact>();
+
+ for (ArtifactChange artifactChange : artifactChanges) {
+ List<Artifact> artifactList = new LinkedList<Artifact>();
+ if (!duplicateCheck.contains(artifactChange.getArtifact())) {
+ artifactList.add(artifactChange.getArtifact());
+ artifacts.add(artifactList);
+ duplicateCheck.add(artifactChange.getArtifact());
+ }
+ }
+ RevertWizard wizard = new RevertWizard(artifacts);
+ NonmodalWizardDialog dialog = new NonmodalWizardDialog(Display.getCurrent().getActiveShell(), wizard);
+ dialog.create();
+ dialog.open();
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ boolean isEnabled = false;
+ try {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<ArtifactChange> artifactChanges =
+ Handlers.getArtifactChangesFromStructuredSelection(structuredSelection);
+
+ if (artifactChanges.isEmpty()) {
+ return false;
+ }
+
+ this.artifactChanges = artifactChanges;
+
+ for (ArtifactChange artifactChange : artifactChanges) {
+ isEnabled =
+ AccessControlManager.checkObjectPermission(artifactChange.getArtifact(), PermissionEnum.WRITE);
+ if (!isEnabled) {
+ break;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ return false;
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertAttributeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertAttributeHandler.java
new file mode 100644
index 00000000000..1ebd316e897
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertAttributeHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+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.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class RevertAttributeHandler extends AbstractHandler {
+ private List<Attribute> attributes;
+
+ public RevertAttributeHandler() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // This is serious stuff, make sure the user understands the impact.
+ if (MessageDialog.openConfirm(
+ Display.getCurrent().getActiveShell(),
+ "Confirm Revert of " + attributes.size() + " attributes.",
+ "All attribute changes selected will be reverted." + "\n\nTHIS IS IRREVERSIBLE" + "\n\nOSEE must be restarted after all reverting is finished to see the results")) {
+
+ Jobs.startJob(new RevertJob());
+ }
+ return null;
+ }
+ private class RevertJob extends Job {
+
+ public RevertJob() {
+ super("Reverting " + attributes.size() + " attributes.");
+ }
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn;
+ try {
+ monitor.beginTask("Reverting ...", attributes.size());
+
+ DbTransaction dbTransaction = new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ for (Attribute<?> attribute : attributes) {
+ monitor.setTaskName(attribute.getArtifact().getInternalDescriptiveName() + " : " + attribute.getDisplayableString());
+ ArtifactPersistenceManager.revertAttribute(connection, attribute);
+ monitor.worked(1);
+ }
+ }
+ };
+ dbTransaction.execute();
+
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ toReturn = new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return toReturn;
+ }
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ boolean isEnabled = false;
+ try {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Attribute> changes = Handlers.processSelectionObjects(Attribute.class, structuredSelection);
+
+ if (changes.isEmpty()) {
+ return false;
+ }
+
+ this.attributes = changes;
+
+ for (Attribute<?> attribute : attributes) {
+ if (attributes == null) {
+
+ }
+ isEnabled = AccessControlManager.checkObjectPermission(attribute.getArtifact(), PermissionEnum.WRITE);
+ if (!isEnabled) {
+ break;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertJob.java
new file mode 100644
index 00000000000..311a8d1de60
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/RevertJob.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+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.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class RevertJob extends Job {
+ private List<Artifact> artifacts;
+
+ public RevertJob(List<Artifact> artifacts) {
+ super("Reverting " + artifacts.size() + " artifacts.");
+ this.artifacts = artifacts;
+ }
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn;
+ try {
+ monitor.beginTask("Reverting ...", artifacts.size());
+
+ DbTransaction dbTransaction = new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ for (Artifact artifact : artifacts) {
+ monitor.setTaskName(artifact.getInternalDescriptiveName());
+ ArtifactPersistenceManager.revertArtifact(connection, artifact);
+ monitor.worked(1);
+ }
+ }
+ };
+ dbTransaction.execute();
+
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ toReturn = new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowArtifactInResourceHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowArtifactInResourceHandler.java
new file mode 100644
index 00000000000..7183a8b45c2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowArtifactInResourceHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ShowArtifactInResourceHandler extends CommandHandler {
+ private List<Artifact> artifacts;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ for (Artifact artifact : artifacts) {
+ try {
+ HistoryView.open(artifact);
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ if (artifacts.isEmpty()) {
+ return false;
+ }
+
+ boolean readPermission = true;
+ for (Artifact artifact : artifacts) {
+ readPermission &= AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ);
+ }
+ isEnabled = readPermission;
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowPreviewHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowPreviewHandler.java
new file mode 100644
index 00000000000..13d7b7ff3ca
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ShowPreviewHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+
+/**
+ * @author Paul K. Waldfogel
+ */
+public class ShowPreviewHandler extends AbstractHandler {
+ public ShowPreviewHandler() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+
+ List<ArtifactChange> mySelectedArtifactChangeList =
+ Handlers.getArtifactChangesFromStructuredSelection(structuredSelection);
+ for (ArtifactChange mySelectedArtifactChange : mySelectedArtifactChangeList) {
+ Artifact selectedArtifact;
+ try {
+ selectedArtifact = mySelectedArtifactChange.getArtifact();
+ ArtifactEditor.editArtifact(selectedArtifact);
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewWordChangeReportHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewWordChangeReportHandler.java
new file mode 100644
index 00000000000..6217555efd4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewWordChangeReportHandler.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.commandHandlers;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import static org.eclipse.osee.framework.core.enums.ModificationType.NEW;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ * @author Jeff C. Phillips
+ */
+public class ViewWordChangeReportHandler extends AbstractHandler {
+ private Set<ArtifactChange> artifactChanges;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) {
+ ArrayList<Artifact> baseArtifacts = new ArrayList<Artifact>(artifactChanges.size());
+ ArrayList<Artifact> newerArtifacts = new ArrayList<Artifact>(artifactChanges.size());
+ VariableMap variableMap = new VariableMap();
+ String fileName = null;
+
+ for (ArtifactChange artifactChange : artifactChanges) {
+ try {
+ Artifact baseArtifact =
+ (artifactChange.getModificationType() == NEW || artifactChange.getModificationType() == ModificationType.INTRODUCED) ? null : ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getBaselineTransactionId());
+
+ Artifact newerArtifact =
+ artifactChange.getModificationType() == DELETED ? null : (artifactChange.isHistorical() ? ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getToTransactionId()) : artifactChange.getArtifact());
+
+ baseArtifacts.add(baseArtifact);
+ newerArtifacts.add(newerArtifact);
+
+ if (fileName == null) {
+ if (artifactChanges.size() == 1) {
+ fileName = baseArtifact != null ? baseArtifact.getSafeName() : newerArtifact.getSafeName();
+ } else {
+ fileName =
+ baseArtifact != null ? baseArtifact.getBranch().getBranchShortName() : newerArtifact.getBranch().getBranchShortName();
+ }
+ variableMap.setValue("fileName", fileName + "_" + (new Date()).toString().replaceAll(":", ";") + ".xml");
+ }
+
+ } catch (OseeCoreException ex1) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex1);
+ }
+ }
+
+ if (newerArtifacts.size() == 0 || (baseArtifacts.size() != newerArtifacts.size())) {
+ throw new IllegalArgumentException(
+ "base artifacts size: " + baseArtifacts.size() + " must match newer artifacts size: " + newerArtifacts.size() + ".");
+ }
+
+ Artifact bArtifact = baseArtifacts.iterator().next();
+ Artifact nArtifact = newerArtifacts.iterator().next();
+
+ Artifact instanceOfArtifact = bArtifact != null ? bArtifact : nArtifact;
+
+ //All other artifacts types can be rendered by the wordRenderer so the are displayed in the word change report.
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ try {
+ renderer.setOptions(variableMap);
+ renderer.compareArtifacts(baseArtifacts, newerArtifacts, new NullProgressMonitor(),
+ instanceOfArtifact.getBranch(), PresentationType.DIFF);
+ } catch (OseeCoreException e) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, e);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ List<Artifact> artifacts = new LinkedList<Artifact>();
+ boolean isEnabled = false;
+
+ try {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+
+ artifactChanges = new LinkedHashSet<ArtifactChange>(Handlers.getArtifactChangesFromStructuredSelection(structuredSelection));
+
+ for (ArtifactChange artifactChange : artifactChanges) {
+ artifacts.add(artifactChange.getArtifact());
+ }
+ isEnabled = AccessControlManager.getInstance().checkObjectListPermission(artifacts, PermissionEnum.READ);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return isEnabled;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewerReportHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewerReportHandler.java
new file mode 100644
index 00000000000..2633ad3352a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/ViewerReportHandler.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.framework.ui.skynet.commandHandlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerTreeReport;
+import org.eclipse.osee.framework.ui.skynet.TableViewerReport;
+import org.eclipse.osee.framework.ui.skynet.TreeViewerReport;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ViewerReportHandler extends AbstractHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (HandlerUtil.getActivePartChecked(event) instanceof ViewPart) {
+ ViewPart view = (ViewPart) HandlerUtil.getActivePartChecked(event);
+ IWorkbenchPartSite myIWorkbenchPartSite = view.getSite();
+ Object selectionProvider = myIWorkbenchPartSite.getSelectionProvider();
+
+ if (selectionProvider instanceof XViewer) {
+ (new XViewerTreeReport((XViewer) selectionProvider)).open();
+ } else if (selectionProvider instanceof TableViewer) {
+ (new TableViewerReport((TableViewer) selectionProvider)).open();
+ } else if (selectionProvider instanceof TreeViewer) {
+ (new TreeViewerReport((TreeViewer) selectionProvider)).open();
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesBetweenCurrentAndParentHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesBetweenCurrentAndParentHandler.java
new file mode 100644
index 00000000000..4f7e78bd4e2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesBetweenCurrentAndParentHandler.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.framework.ui.skynet.commandHandlers;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.change.ChangeType;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ * @author Jeff C. Phillips
+ */
+public class WordChangesBetweenCurrentAndParentHandler extends AbstractHandler {
+ private ArtifactChange artifactChange;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ try {
+ Artifact secondArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(artifactChange.getArtifact().getArtId(),
+ artifactChange.getToTransactionId());
+ RendererManager.diffInJob(artifactChange.getConflictingModArtifact(), secondArtifact);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ boolean isEnabled = false;
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<ArtifactChange> artifactChanges = Handlers.getArtifactChangesFromStructuredSelection(structuredSelection);
+
+ if (artifactChanges.size() == 0) {
+ return false;
+ }
+
+ artifactChange = artifactChanges.get(0);
+ try {
+ Artifact artifact = artifactChange.getArtifact();
+
+ boolean readPermission = AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ);
+ boolean wordArtifactSelected = artifact.isOfType(WordArtifact.ARTIFACT_NAME);
+ boolean modifiedWordArtifactSelected =
+ wordArtifactSelected && artifactChange.getModificationType() == ModificationType.MODIFIED;
+ boolean conflictedWordArtifactSelected =
+ modifiedWordArtifactSelected && artifactChange.getChangeType() == ChangeType.CONFLICTING;
+ isEnabled = readPermission && conflictedWordArtifactSelected;
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesMadeToHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesMadeToHandler.java
new file mode 100644
index 00000000000..c3a24c0b829
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesMadeToHandler.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.framework.ui.skynet.commandHandlers;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import static org.eclipse.osee.framework.core.enums.ModificationType.NEW;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ */
+public class WordChangesMadeToHandler extends AbstractHandler {
+ private List<ArtifactChange> mySelectedArtifactChangeList;
+
+ public WordChangesMadeToHandler() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ArtifactChange selectedArtifactChange = mySelectedArtifactChangeList.get(0);
+ try {
+ execute(selectedArtifactChange);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return null;
+ }
+
+ public void execute(ArtifactChange artifactChange) throws Exception {
+ Artifact firstArtifact =
+ artifactChange.getModificationType() == NEW ? null : ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getBaselineTransactionId());
+ Artifact secondArtifact =
+ artifactChange.getModificationType() == DELETED ? null : ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getToTransactionId());
+
+ RendererManager.diffInJob(firstArtifact, secondArtifact);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ boolean isEnabled = false;
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ mySelectedArtifactChangeList = Handlers.getArtifactChangesFromStructuredSelection(structuredSelection);
+
+ if (mySelectedArtifactChangeList.size() == 0) {
+ return false;
+ }
+ ArtifactChange mySelectedArtifactChange = mySelectedArtifactChangeList.get(0);
+
+ try {
+ Artifact changedArtifact = mySelectedArtifactChange.getArtifact();
+ boolean readPermission = AccessControlManager.checkObjectPermission(changedArtifact, PermissionEnum.READ);
+ boolean wordArtifactSelected = changedArtifact.isOfType(WordArtifact.ARTIFACT_NAME);
+ isEnabled = readPermission && wordArtifactSelected;
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesToParentHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesToParentHandler.java
new file mode 100644
index 00000000000..d809804b553
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/WordChangesToParentHandler.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.commandHandlers;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.MODIFIED;
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import static org.eclipse.osee.framework.core.enums.ModificationType.NEW;
+import java.util.List;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Paul K. Waldfogel
+ */
+public class WordChangesToParentHandler extends AbstractHandler {
+ private List<ArtifactChange> mySelectedArtifactChangeList;
+
+ public WordChangesToParentHandler() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (mySelectedArtifactChangeList.size() > 0) {
+ ArtifactChange selectedArtifactChange = mySelectedArtifactChangeList.get(0);
+ try {
+ Artifact firstArtifact =
+ selectedArtifactChange.getModificationType() == NEW ? null : ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ selectedArtifactChange.getArtifact().getArtId(),
+ selectedArtifactChange.getBaselineTransactionId());
+
+ Artifact secondArtifact = null;
+ Branch parentBranch = firstArtifact.getBranch().getParentBranch();
+
+ secondArtifact =
+ selectedArtifactChange.getModificationType() == DELETED ? null : ArtifactQuery.getArtifactFromId(
+ selectedArtifactChange.getArtifact().getArtId(), parentBranch);
+
+ RendererManager.diffInJob(firstArtifact, secondArtifact);
+
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ boolean isEnabled = false;
+
+ try {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ mySelectedArtifactChangeList = Handlers.getArtifactChangesFromStructuredSelection(structuredSelection);
+
+ if (mySelectedArtifactChangeList.size() == 0) {
+ return (false);
+ }
+ ArtifactChange mySelectedArtifactChange = mySelectedArtifactChangeList.get(0);
+
+ if (mySelectedArtifactChange.getModificationType() == NEW || mySelectedArtifactChange.getModificationType() == DELETED) {
+ return (false);
+ }
+
+ Artifact changedArtifact = mySelectedArtifactChange.getArtifact();
+ Branch reportBranch = changedArtifact.getBranch();
+ boolean wordArtifactSelected = changedArtifact.isOfType(WordArtifact.ARTIFACT_NAME);
+ boolean validDiffParent = wordArtifactSelected && reportBranch.hasParentBranch();
+
+ boolean readPermission = AccessControlManager.checkObjectPermission(changedArtifact, PermissionEnum.READ);
+ boolean modifiedWordArtifactSelected =
+ wordArtifactSelected && mySelectedArtifactChange.getModificationType() == MODIFIED;
+ isEnabled = validDiffParent && modifiedWordArtifactSelected && readPermission;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ return isEnabled;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchCompoundContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchCompoundContributionItem.java
new file mode 100644
index 00000000000..46da4f5ff8d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchCompoundContributionItem.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.Command;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArchiveBranchCompoundContributionItem extends CompoundContributionItem {
+ private ICommandService commandService;
+
+ public ArchiveBranchCompoundContributionItem() {
+ this.commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+
+ public ArchiveBranchCompoundContributionItem(String id) {
+ super(id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+ */
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(40);
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(structuredSelection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ if (selectedBranch != null) {
+ try {
+ String commandId = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.archiveBranch";
+ Command command = commandService.getCommand(commandId);
+ CommandContributionItem contributionItem = null;
+ String label = selectedBranch.isArchived() ? "Unarchive" : "Archive";
+ ImageDescriptor descriptor =
+ selectedBranch.isArchived() ? ImageManager.getImageDescriptor(FrameworkImage.UN_ARCHIVE) : ImageManager.getImageDescriptor(FrameworkImage.ARCHIVE);
+ contributionItem = createCommand(label, selectedBranch, commandId, descriptor);
+
+ if (command != null && command.isEnabled()) {
+ contributionItems.add(contributionItem);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return contributionItems.toArray(new IContributionItem[0]);
+ }
+
+ private CommandContributionItem createCommand(String label, Branch branch, String commandId, ImageDescriptor descriptor) throws OseeCoreException {
+ CommandContributionItem contributionItem;
+
+ contributionItem =
+ new CommandContributionItem(new CommandContributionItemParameter(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow(), label, commandId, Collections.EMPTY_MAP,
+ descriptor, null, null, label, null, null, SWT.NONE, null, false));
+
+ return contributionItem;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchHandler.java
new file mode 100644
index 00000000000..2d317e1ce9d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ArchiveBranchHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArchiveBranchHandler extends CommandHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.CommandHandler#isEnabledWithException()
+ */
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ return !branches.isEmpty() && AccessControlManager.isOseeAdmin();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ Branch branch = branches.iterator().next();
+
+ try {
+ if (branch.isArchived()) {
+ BranchManager.unArchive(branch);
+ } else {
+ BranchManager.archive(branch);
+ }
+
+ OseeEventManager.kickBranchEvent(this, BranchEventType.Committed, branch.getBranchId());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/BranchCreationHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/BranchCreationHandler.java
new file mode 100644
index 00000000000..c4431c6ce45
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/BranchCreationHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public class BranchCreationHandler extends CommandHandler {
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ Object backingData = selection.getFirstElement();
+
+ final TransactionId parentTransactionId;
+ try {
+ if (backingData instanceof Branch) {
+ Branch branch = (Branch) backingData;
+ parentTransactionId = TransactionIdManager.getlatestTransactionForBranch(branch);
+ } else if (backingData instanceof TransactionId) {
+
+ parentTransactionId = ((TransactionId) backingData);
+
+ } else {
+ throw new OseeStateException(
+ "Backing data for the jobbed node in the branchview was not of the expected type");
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return null;
+ }
+ final EntryDialog dialog =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Branch", null, "Enter the name of the new Branch",
+ MessageDialog.INFORMATION, new String[] {"OK", "Cancel"}, 0);
+ int result = dialog.open();
+
+ if (result == 0 && dialog.getEntry() != null) {
+
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ Branch branch = parentTransactionId.getBranch();
+ if (branch != null && branch.isSystemRootBranch()) {
+ BranchManager.createTopLevelBranch(dialog.getEntry(), dialog.getEntry(), true);
+ } else {
+ BranchManager.createWorkingBranch(parentTransactionId, dialog.getEntry(), null);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.runInJob("Create Branch", runnable, SkynetGuiPlugin.class, SkynetGuiPlugin.PLUGIN_ID);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ boolean enabled;
+ if (selection.size() != 1) {
+ return false;
+ }
+
+ Object object = selection.getFirstElement();
+ Branch branch = null;
+
+ if (object instanceof Branch) {
+ branch = (Branch) object;
+ } else if (object instanceof TransactionId) {
+ branch = ((TransactionId) object).getBranch();
+ }
+
+ if (branch == null) {
+ return false;
+ }
+
+ enabled = AccessControlManager.checkObjectPermission(branch, PermissionEnum.READ);
+ return enabled;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/DeleteBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/DeleteBranchHandler.java
new file mode 100644
index 00000000000..340c7151d1a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/DeleteBranchHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DeleteBranchHandler extends CommandHandler {
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ Branch selectedBranch = Handlers.getBranchesFromStructuredSelection(selection).iterator().next();
+
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Delete Branch", null,
+ "Are you sure you want to delete the branch: " + selectedBranch.getBranchName(),
+ MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1);
+
+ if (dialog.open() == 0) {
+ BranchManager.deleteBranch(selectedBranch);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ return branches.size() == 1 && AccessControlManager.isOseeAdmin();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/FlatPresentationHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/FlatPresentationHandler.java
new file mode 100644
index 00000000000..76975c76fc5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/FlatPresentationHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Robert A. Fisher
+ */
+public class FlatPresentationHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.flatCommand";
+ private ICommandService service;
+
+ public FlatPresentationHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((BranchView) HandlerUtil.getActivePartChecked(event)).changeBranchPresentation(true);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ element.setChecked(Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID).getBoolean(BranchViewPresentationPreferences.FLAT_KEY, true));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ service.refreshElements(COMMAND_ID, null);
+
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/HierarchicalPresentationHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/HierarchicalPresentationHandler.java
new file mode 100644
index 00000000000..a323d3634e4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/HierarchicalPresentationHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Robert A. Fisher
+ */
+public class HierarchicalPresentationHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.branch.branchView.hierarchicalPresentation.command";
+ private ICommandService service;
+
+ public HierarchicalPresentationHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((BranchView) HandlerUtil.getActivePartChecked(event)).changeBranchPresentation(false);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ element.setChecked(!Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID).getBoolean(BranchViewPresentationPreferences.FLAT_KEY, true));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ service.refreshElements(COMMAND_ID, null);
+
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/OpenAssociatedArtifactHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/OpenAssociatedArtifactHandler.java
new file mode 100644
index 00000000000..d5e651cd362
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/OpenAssociatedArtifactHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OpenAssociatedArtifactHandler extends CommandHandler {
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ Branch selectedBranch = Handlers.getBranchesFromStructuredSelection(selection).iterator().next();
+
+ try {
+ if (selectedBranch.getAssociatedArtifact() == null) {
+ AWorkbench.popup("Open Associated Artifact", "No artifact associated with branch " + selectedBranch);
+ return null;
+ }
+ if (AccessControlManager.checkObjectPermission(selectedBranch.getAssociatedArtifact(), PermissionEnum.READ)) {
+ if (selectedBranch.getAssociatedArtifact() instanceof IATSArtifact)
+ OseeAts.openATSArtifact(selectedBranch.getAssociatedArtifact());
+ else
+ ArtifactEditor.editArtifact(selectedBranch.getAssociatedArtifact());
+ } else {
+ OseeLog.log(
+ SkynetGuiPlugin.class,
+ OseeLevel.SEVERE_POPUP,
+ "The user " + UserManager.getUser() + " does not have read access to " + selectedBranch.getAssociatedArtifact());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ return branches.size() == 1;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeBranchHandler.java
new file mode 100644
index 00000000000..55eb27dbdad
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeBranchHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PurgeBranchHandler extends CommandHandler {
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ Branch selectedBranch = Handlers.getBranchesFromStructuredSelection(selection).iterator().next();
+
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Purge Branch", null,
+ "Are you sure you want to purge the branch: " + selectedBranch.getBranchName(),
+ MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1);
+
+ if (dialog.open() == 0) {
+ BranchManager.purgeBranchInJob(selectedBranch);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ return branches.size() == 1 && AccessControlManager.isOseeAdmin();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeTransactionHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeTransactionHandler.java
new file mode 100644
index 00000000000..1e97fb3b9e4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/PurgeTransactionHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PurgeTransactionHandler extends CommandHandler {
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<TransactionId> transactions = Handlers.getTransactionsFromStructuredSelection(selection);
+ TransactionId selectedTransaction = transactions.iterator().next();
+
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Purge Transaction",
+ "Are you sure you want to purge the transaction: " + selectedTransaction.getTransactionNumber())) {
+ BranchManager.purgeTransactions(new JobChangeAdapter() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+ */
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (event.getResult().getSeverity() == IStatus.OK) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ BranchManager.refreshBranches();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ }
+
+ }, selectedTransaction.getTransactionNumber());
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<TransactionId> transactions = Handlers.getTransactionsFromStructuredSelection(selection);
+ return transactions.size() == 1 && AccessControlManager.isOseeAdmin();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/RenameBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/RenameBranchHandler.java
new file mode 100644
index 00000000000..b1935a08205
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/RenameBranchHandler.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchXViewerFactory;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TreeEditor;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Paul Waldfogel
+ */
+public class RenameBranchHandler extends CommandHandler {
+
+ private int findColumnIndex(TreeViewer treeViewer, String columnName) {
+ if (treeViewer != null && Widgets.isAccessible(treeViewer.getTree())) {
+ TreeColumn[] columns = treeViewer.getTree().getColumns();
+ for (int index = 0; index < columns.length; index++) {
+ TreeColumn column = columns[index];
+ if (columnName.equalsIgnoreCase(column.getText())) {
+ return index;
+ }
+ }
+ }
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider instanceof TreeViewer) {
+ final TreeViewer treeViewer = (TreeViewer) selectionProvider;
+ Tree tree = treeViewer.getTree();
+ IStructuredSelection selection = (IStructuredSelection) selectionProvider.getSelection();
+
+ final Branch selectedBranch = Handlers.getBranchesFromStructuredSelection(selection).iterator().next();
+ TreeItem[] myTreeItemsSelected = tree.getSelection();
+
+ if (myTreeItemsSelected.length != 1) {
+ return null;
+ }
+ TreeEditor myTreeEditor = new TreeEditor(tree);
+ myTreeEditor.horizontalAlignment = SWT.LEFT;
+ myTreeEditor.grabHorizontal = true;
+ myTreeEditor.minimumWidth = 50;
+ myTreeEditor.setColumn(findColumnIndex(treeViewer, BranchXViewerFactory.branch_name.getName()));
+
+ final TreeItem myTreeItem = myTreeItemsSelected[0];
+
+ Control oldEditor = myTreeEditor.getEditor();
+ if (oldEditor != null) {
+ oldEditor.dispose();
+ }
+ final Text textBeingRenamed = new Text(tree, SWT.BORDER);
+ textBeingRenamed.setText(selectedBranch.getBranchName());
+
+ textBeingRenamed.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ updateText(textBeingRenamed.getText(), selectedBranch);
+ treeViewer.refresh();
+ textBeingRenamed.dispose();
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ }
+ });
+ textBeingRenamed.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if ((e.character == SWT.CR)) {
+ updateText(textBeingRenamed.getText(), selectedBranch);
+ treeViewer.refresh();
+ textBeingRenamed.dispose();
+ } else if (e.keyCode == SWT.ESC) {
+ textBeingRenamed.dispose();
+ }
+ }
+ });
+ textBeingRenamed.selectAll();
+ textBeingRenamed.setFocus();
+ myTreeEditor.setEditor(textBeingRenamed, myTreeItem);
+ }
+ return null;
+ }
+
+ private void updateText(String newLabel, Branch selectedBranch) {
+ selectedBranch.setBranchName(newLabel);
+ try {
+ selectedBranch.rename(newLabel);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.CommandHandler#isEnabledWithException()
+ */
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+
+ return branches.size() == 1 && (AccessControlManager.isOseeAdmin() || branches.get(0).isWorkingBranch());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/SetAssociatedBranchArtifactHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/SetAssociatedBranchArtifactHandler.java
new file mode 100644
index 00000000000..a965335d517
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/SetAssociatedBranchArtifactHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class SetAssociatedBranchArtifactHandler extends CommandHandler {
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ Branch selectedBranch = Handlers.getBranchesFromStructuredSelection(selection).iterator().next();
+
+ try {
+ EntryDialog ed =
+ new EntryDialog(
+ "Set Associated Artifact",
+ "Set Associated Artifact for Branch\n\n\"" + selectedBranch.getBranchName() + "\"" + (selectedBranch.getAssociatedArtifact() != null ? "\n\nCurrently: " + selectedBranch.getAssociatedArtifact() : ""));
+ if (selectedBranch.getAssociatedArtifact() != null) ed.setEntry(String.valueOf(selectedBranch.getAssociatedArtifactId()));
+ if (ed.open() == 0) {
+ String artId = ed.getEntry();
+ Artifact associatedArtifact =
+ ArtifactQuery.getArtifactFromId(Integer.parseInt(artId), BranchManager.getCommonBranch());
+ if (MessageDialog.openConfirm(
+ Display.getCurrent().getActiveShell(),
+ "Set Associated Artifact",
+ "Set Associated Artifact for Branch\n\n\"" + selectedBranch.getBranchName() + "\"\nto\nArtifact: " + associatedArtifact)) {
+ selectedBranch.setAssociatedArtifact(associatedArtifact);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ return branches.size() == 1 && AccessControlManager.isOseeAdmin();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowArchivedBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowArchivedBranchHandler.java
new file mode 100644
index 00000000000..5ed43cb9202
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowArchivedBranchHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ShowArchivedBranchHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.showArchivedBranches";
+ boolean itemChk;
+ private ICommandService service;
+
+ public ShowArchivedBranchHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((BranchView) HandlerUtil.getActivePartChecked(event)).changeArchivedBranchPresentation(!itemChk);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ itemChk = Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID).getBoolean(BranchViewPresentationPreferences.SHOW_ARCHIVED_BRANCHES, false);
+ element.setChecked(itemChk);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ boolean isValid = false;
+ service.refreshElements(COMMAND_ID, null);
+
+ try {
+ isValid = AccessControlManager.isOseeAdmin();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return isValid;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowFavoriteBranchesFirstHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowFavoriteBranchesFirstHandler.java
new file mode 100644
index 00000000000..7b4743587f6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowFavoriteBranchesFirstHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ShowFavoriteBranchesFirstHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.ShowFavoriteBranchesFirst";
+ boolean itemChk;
+ private ICommandService service;
+
+ public ShowFavoriteBranchesFirstHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((BranchView) HandlerUtil.getActivePartChecked(event)).changeFavoritesFirstPresentation(!itemChk);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ itemChk = Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID).getBoolean(BranchViewPresentationPreferences.FAVORITE_KEY, false);
+ element.setChecked(itemChk);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ service.refreshElements(COMMAND_ID, null);
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowMergeBranchPresentationHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowMergeBranchPresentationHandler.java
new file mode 100644
index 00000000000..810ab323c81
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowMergeBranchPresentationHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ShowMergeBranchPresentationHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.showMergeBranches";
+ boolean itemChk;
+ private ICommandService service;
+
+ public ShowMergeBranchPresentationHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((BranchView) HandlerUtil.getActivePartChecked(event)).changeMergeBranchPresentation(!itemChk);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ itemChk = Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID).getBoolean(BranchViewPresentationPreferences.SHOW_MERGE_BRANCHES, false);
+ element.setChecked(itemChk);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ boolean isValid = false;
+ service.refreshElements(COMMAND_ID, null);
+
+ try {
+ isValid = AccessControlManager.isOseeAdmin();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return isValid;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowTransactionPresentationHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowTransactionPresentationHandler.java
new file mode 100644
index 00000000000..dac1235f8b4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ShowTransactionPresentationHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ShowTransactionPresentationHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.showTransactions";
+ boolean itemChk;
+ private ICommandService service;
+
+ public ShowTransactionPresentationHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((BranchView) HandlerUtil.getActivePartChecked(event)).changeTransactionPresentation(!itemChk);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ itemChk = Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID).getBoolean(BranchViewPresentationPreferences.SHOW_TRANSACTIONS, true);
+ element.setChecked(itemChk);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ service.refreshElements(COMMAND_ID, null);
+
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchContributionItem.java
new file mode 100644
index 00000000000..b272e7aa9b5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchContributionItem.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.Command;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class ToggleFavoriteBranchContributionItem extends CompoundContributionItem{
+ private ICommandService commandService;
+
+ public ToggleFavoriteBranchContributionItem() {
+ this.commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+ */
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(40);
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(structuredSelection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ if (selectedBranch != null) {
+ try {
+ String commandId = ToggleFavoriteBranchHandler.COMMAND_ID;
+ Command command = commandService.getCommand(commandId);
+ CommandContributionItem contributionItem = null;
+ String label = UserManager.getUser().isFavoriteBranch(selectedBranch) ? "Unmark as Favorite" : "Mark as Favorite";
+ contributionItem = createCommand(label, selectedBranch, commandId);
+
+ if (command != null && command.isEnabled()) {
+ contributionItems.add(contributionItem);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return contributionItems.toArray(new IContributionItem[0]);
+}
+
+private CommandContributionItem createCommand(String label, Branch branch, String commandId) throws OseeCoreException {
+ CommandContributionItem contributionItem;
+
+ contributionItem =
+ new CommandContributionItem(new CommandContributionItemParameter(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow(), label, commandId, Collections.EMPTY_MAP, null,
+ null, null, label, null, null, SWT.NONE, null, false));
+
+ return contributionItem;
+}
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchHandler.java
new file mode 100644
index 00000000000..d60639b14dc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/ToggleFavoriteBranchHandler.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.framework.ui.skynet.commandHandlers.branch;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ToggleFavoriteBranchHandler extends CommandHandler {
+ public static String COMMAND_ID =
+ "org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ToggleFavoriteBranchHandler";
+
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+ Branch selectedBranch = Handlers.getBranchesFromStructuredSelection(selection).iterator().next();
+
+ try {
+ UserManager.getUser().toggleFavoriteBranch(selectedBranch);
+ OseeEventManager.kickBranchEvent(this, BranchEventType.Added, selectedBranch.getBranchId());
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (AWorkbench.getActivePage() == null) return false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ return branches.size() == 1;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitBranchParameter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitBranchParameter.java
new file mode 100644
index 00000000000..273740387e0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitBranchParameter.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.IParameterValues;
+import org.eclipse.core.commands.ParameterValuesException;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class CommitBranchParameter implements IParameter {
+ public static String ARCHIVE_PARENT_BRANCH = "archive_parent_branch";
+ public String getId() {
+ return ARCHIVE_PARENT_BRANCH;
+ }
+
+ public String getName() {
+ return "Branch Commit parameter";
+ }
+
+ public IParameterValues getValues() throws ParameterValuesException {
+ throw new ParameterValuesException("Branch Commit has no parameters", null);
+ }
+
+ public boolean isOptional() {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitHandler.java
new file mode 100644
index 00000000000..035ce74e0be
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitHandler.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+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.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.MutableInteger;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewPresentationPreferences;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ */
+public abstract class CommitHandler extends CommandHandler {
+ protected final boolean useParentBranch;
+
+ public CommitHandler(boolean useParentBranch) {
+ this.useParentBranch = useParentBranch;
+ }
+
+ public static boolean commitBranch(final ConflictManagerExternal conflictManager, boolean archiveSourceBranch) throws OseeCoreException {
+ final Branch sourceBranch = conflictManager.getSourceBranch();
+ final Branch destinationBranch = conflictManager.getDestinationBranch();
+ final TransactionId transactionId = TransactionIdManager.getStartEndPoint(sourceBranch).getKey();
+ boolean branchCommitted = false;
+
+ if (conflictManager.getRemainingConflicts().size() > 0) {
+ String message =
+ "Commit stopped due to unresolved conflicts\n\nPossible Resolutions:\n Cancel commit and resolve at a later time\n Launch the Merge Manager to resolve conflicts";
+ final String fMessage;
+ final String[] choices;
+ if (AccessControlManager.isOseeAdmin()) {
+ fMessage = message + "\n Force the commit";
+ choices = new String[] {"Cancel", "Launch Merge Manager", "Force Commit (Admin Only)"};
+ } else {
+ fMessage = message;
+ choices = new String[] {"Cancel", "Launch Merge Manager"};
+ }
+
+ final MutableInteger dialogResult = new MutableInteger(0);
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Unresolved Conflicts", null, fMessage,
+ MessageDialog.QUESTION, choices, 0);
+ dialogResult.setValue(dialog.open());
+ if (dialogResult.getValue() == 1) {
+ MergeView.openView(sourceBranch, destinationBranch, transactionId);
+ }
+ }
+ });
+
+ if (dialogResult.getValue() == 2) {
+ BranchManager.commitBranch(conflictManager, archiveSourceBranch, true);
+ branchCommitted = true;
+ }
+ } else {
+ final StringBuilder message =
+ new StringBuilder(
+ "Commit branch\n\n\"" + sourceBranch + "\"\n\n onto destination branch\n\n\"" + destinationBranch + "\"\n");
+ int numOriginalConflicts = conflictManager.getOriginalConflicts().size();
+ if (numOriginalConflicts > 0) {
+ message.append("\nwith " + numOriginalConflicts + " conflicts resolved.\n");
+ } else {
+ message.append("\n(no conflicts found)\n");
+ }
+ message.append("\nCommit?");
+
+ final MutableInteger dialogResult = new MutableInteger(0);
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ try {
+ if (conflictManager.getOriginalConflicts().size() == 0) {
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Commit Branch", null,
+ message.toString(), MessageDialog.QUESTION, new String[] {"Ok", "Cancel"}, 0);
+ dialogResult.setValue(dialog.open());
+ } else {
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Commit Branch", null,
+ message.toString(), MessageDialog.QUESTION, new String[] {"Ok",
+ "Launch Merge Manager", "Cancel"}, 0);
+ dialogResult.setValue(dialog.open());
+ if (dialogResult.getValue() == 1) {
+ MergeView.openView(sourceBranch, destinationBranch, transactionId);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+
+ if (dialogResult.getValue() == 0) {
+ BranchManager.commitBranch(conflictManager, archiveSourceBranch, false);
+ branchCommitted = true;
+ }
+ }
+ return branchCommitted;
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ Branch sourceBranch = branches.iterator().next();
+
+ try {
+ Branch destinationBranch = null;
+ if (useParentBranch) {
+ destinationBranch = sourceBranch.getParentBranch();
+ } else {
+ destinationBranch =
+ BranchManager.getBranch(Integer.parseInt(event.getParameter(BranchViewPresentationPreferences.BRANCH_ID)));
+ }
+ Jobs.startJob(new CommitJob(sourceBranch, destinationBranch,
+ Boolean.parseBoolean(event.getParameter(CommitBranchParameter.ARCHIVE_PARENT_BRANCH))));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ boolean enabled = false;
+ if (AWorkbench.getActivePage() == null) return enabled;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+
+ if (branches.size() == 1) {
+ Branch branch = branches.iterator().next();
+ enabled = useParentBranchValid(branch) || (!useParentBranch && AccessControlManager.isOseeAdmin());
+ }
+ return enabled;
+ }
+
+ protected boolean useParentBranchValid(Branch branch) throws OseeCoreException {
+ return branch.hasParentBranch() && useParentBranch && !branch.isChangeManaged() && !branch.isArchived();
+ }
+
+ private class CommitJob extends Job {
+ private final Branch sourceBranch;
+ private final Branch destinationBranch;
+ private final boolean archiveSourceBranch;
+
+ /**
+ * @param name
+ * @param destinationBranch
+ * @param sourceBranch
+ */
+ public CommitJob(Branch sourceBranch, Branch destinationBranch, boolean archiveSourceBranch) {
+ super("Commit Branch");
+ this.destinationBranch = destinationBranch;
+ this.sourceBranch = sourceBranch;
+ this.archiveSourceBranch = archiveSourceBranch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ commitBranch(new ConflictManagerExternal(destinationBranch, sourceBranch), archiveSourceBranch);
+ } catch (OseeCoreException ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, ex.getLocalizedMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoCompoundContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoCompoundContributionItem.java
new file mode 100644
index 00000000000..edfee5c8493
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoCompoundContributionItem.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+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.commands.Command;
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.merge.BranchIdParameter;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class CommitIntoCompoundContributionItem extends CompoundContributionItem {
+ private static final IParameter[] BRANCH_COMMIT_PARAMETER_DEF =
+ new IParameter[] {new BranchIdParameter(), new CommitBranchParameter()};
+
+ private ICommandService commandService;
+
+ public CommitIntoCompoundContributionItem() {
+ this.commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+
+ public CommitIntoCompoundContributionItem(String id) {
+ super(id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+ */
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(40);
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(structuredSelection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ if (selectedBranch != null) {
+ try {
+ String commandId = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitInto";
+ Command command = configCommandParameter(commandId);
+ CommandContributionItem contributionItem = null;
+
+ for (Branch branch : BranchManager.getNormalBranches()) {
+
+ if (!branch.equals(selectedBranch)) {
+ contributionItem = createCommand(branch, commandId);
+ if (command != null && command.isEnabled()) {
+ contributionItems.add(contributionItem);
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return contributionItems.toArray(new IContributionItem[0]);
+ }
+
+ private CommandContributionItem createCommand(Branch branch, String commandId) throws OseeCoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put(BranchView.BRANCH_ID, String.valueOf(branch.getBranchId()));
+ parameters.put(CommitBranchParameter.ARCHIVE_PARENT_BRANCH, "false");
+ CommandContributionItem contributionItem;
+ String label = branch.getBranchName();
+
+ contributionItem =
+ new CommandContributionItem(new CommandContributionItemParameter(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow(), label, commandId, parameters, null, null, null,
+ label, null, null, SWT.NONE, null, false));
+
+ return contributionItem;
+ }
+
+ private Command configCommandParameter(String commandId) {
+ Command command = commandService.getCommand(commandId);
+
+ try {
+ command.define(command.getName(), "", commandService.getCategory("org.eclipse.debug.ui.category.run"),
+ BRANCH_COMMIT_PARAMETER_DEF);
+ } catch (NotDefinedException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return command;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoHandler.java
new file mode 100644
index 00000000000..e1effa0273b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoHandler.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class CommitIntoHandler extends CommitHandler{
+
+ private static boolean USE_PARENT_BRANCH = false;
+
+ public CommitIntoHandler() {
+ super(USE_PARENT_BRANCH);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentCompoundContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentCompoundContributionItem.java
new file mode 100644
index 00000000000..9e6d042bd23
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentCompoundContributionItem.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+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.commands.Command;
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.merge.BranchIdParameter;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ *
+ *
+ * @author Jeff C. Phillips
+ */
+public class CommitIntoParentCompoundContributionItem extends CompoundContributionItem {
+ private static final IParameter[] BRANCH_COMMIT_PARAMETER_DEF =
+ new IParameter[] {new BranchIdParameter(), new CommitBranchParameter()};
+
+ private ICommandService commandService;
+
+ public CommitIntoParentCompoundContributionItem() {
+ this.commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+
+ public CommitIntoParentCompoundContributionItem(String id) {
+ super(id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+ */
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(40);
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(structuredSelection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ if (selectedBranch != null) {
+ try {
+ String commandId = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.commitIntoParent";
+ Command command = configCommandParameter(commandId);
+ CommandContributionItem contributionItem = null;
+
+ contributionItem = createCommand(selectedBranch, commandId);
+
+ if (command != null && command.isEnabled()) {
+ contributionItems.add(contributionItem);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return contributionItems.toArray(new IContributionItem[0]);
+ }
+
+ private CommandContributionItem createCommand(Branch branch, String commandId) throws OseeCoreException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put(BranchView.BRANCH_ID, Integer.toString(branch.getBranchId()));
+ parameters.put(CommitBranchParameter.ARCHIVE_PARENT_BRANCH, "true");
+ CommandContributionItem contributionItem;
+ String label = "Commit into Parent Branch: " + branch.getParentBranch().getBranchName();
+
+ contributionItem =
+ new CommandContributionItem(new CommandContributionItemParameter(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow(), label, commandId, parameters, null, null, null,
+ label, null, null, SWT.NONE, null, false));
+
+ return contributionItem;
+ }
+
+ private Command configCommandParameter(String commandId) {
+ Command command = commandService.getCommand(commandId);
+
+ try {
+ command.define(command.getName(), "", commandService.getCategory("org.eclipse.debug.ui.category.run"),
+ BRANCH_COMMIT_PARAMETER_DEF);
+ } catch (NotDefinedException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return command;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentHandler.java
new file mode 100644
index 00000000000..8e74aa33fc3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/CommitIntoParentHandler.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class CommitIntoParentHandler extends CommitHandler{
+
+ private static boolean USE_PARENT_BRANCH = true;
+
+ public CommitIntoParentHandler() {
+ super(USE_PARENT_BRANCH);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/UpdateBranchHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/UpdateBranchHandler.java
new file mode 100644
index 00000000000..68e7d18c891
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/branch/commit/UpdateBranchHandler.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.framework.ui.skynet.commandHandlers.branch.commit;
+
+import java.util.List;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+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.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.update.ConflictResolverOperation;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UpdateBranchHandler extends CommandHandler {
+
+ protected boolean isValid(Branch branch) throws OseeCoreException {
+ boolean result = false;
+ if (branch.hasParentBranch()) {
+ try {
+ result = !branch.getParentBranch().equals(BranchManager.getSystemRootBranch());
+ result &= branch.isEditable() && branch.isWorkingBranch();
+ result &= branch.getChildBranches().isEmpty();
+ } catch (Exception ex) {
+ result = false;
+ }
+ }
+ return result;
+ }
+
+ private Branch getSelectedBranch() {
+ Branch branch = null;
+ if (AWorkbench.getActivePage() == null) {
+ return null;
+ }
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+ if (branches.size() == 1) {
+ branch = branches.iterator().next();
+ }
+ return branch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.CommandHandler#isEnabledWithException()
+ */
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ boolean enabled = false;
+ Branch branch = getSelectedBranch();
+ if (branch != null) {
+ enabled = isValid(branch);
+ }
+ return enabled;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ Branch branchToUpdate = getSelectedBranch();
+ if (branchToUpdate != null) {
+ boolean isUpdateAllowed =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Update Branch", String.format("Are you sure you want to update [%s] branch",
+ branchToUpdate.getBranchName()));
+ if (isUpdateAllowed) {
+ BranchManager.updateBranch(branchToUpdate, new UserConflictResolver());
+ }
+ }
+ return null;
+ }
+
+ private final class UserConflictResolver extends ConflictResolverOperation {
+
+ public UserConflictResolver() {
+ super("Launch Merge Manager", SkynetGuiPlugin.PLUGIN_ID);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ ConflictManagerExternal conflictManager = getConflictManager();
+ Job job = createMergeViewJob(conflictManager.getSourceBranch(), conflictManager.getDestinationBranch());
+ Jobs.startJob(job);
+ }
+
+ private Job createMergeViewJob(final Branch sourceBranch, final Branch destinationBranch) {
+ Job job = new UIJob("Launch Merge Manager") {
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ IStatus status = Status.OK_STATUS;
+ try {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ IViewPart viewPart =
+ page.showView(MergeView.VIEW_ID,
+ String.valueOf(sourceBranch.getBranchId() * 100000 + destinationBranch.getBranchId()),
+ IWorkbenchPage.VIEW_ACTIVATE);
+ if (viewPart instanceof MergeView) {
+ MergeView mergeView = (MergeView) viewPart;
+ mergeView.explore(sourceBranch, destinationBranch, null, null, true);
+ }
+ } catch (PartInitException ex) {
+ status = new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Error launching merge view", ex);
+ }
+ return status;
+ }
+ };
+ return job;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/SingleNativeDiffHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/SingleNativeDiffHandler.java
new file mode 100644
index 00000000000..4088d134ce0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/SingleNativeDiffHandler.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.framework.ui.skynet.commandHandlers.change;
+
+import static org.eclipse.osee.framework.core.enums.ModificationType.DELETED;
+import static org.eclipse.osee.framework.core.enums.ModificationType.NEW;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.skynet.core.word.WordAnnotationHandler;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.preferences.DiffPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.util.WordUiUtil;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class SingleNativeDiffHandler extends CommandHandler {
+ private ArrayList<ArtifactChange> artifactChanges;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.plugin.util.CommandHandler#isEnabledWithException()
+ */
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ boolean enabled = false;
+
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ try {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+
+ artifactChanges =
+ new ArrayList<ArtifactChange>(Handlers.getArtifactChangesFromStructuredSelection(structuredSelection));
+
+ enabled =
+ artifactChanges.size() == 1 && AccessControlManager.checkObjectPermission(
+ artifactChanges.get(0).getArtifact(), PermissionEnum.READ);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ return enabled;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ArtifactChange artifactChange = artifactChanges.iterator().next();
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ try {
+ Artifact baseArtifact =
+ (artifactChange.getModificationType() == NEW || artifactChange.getModificationType() == ModificationType.INTRODUCED) ? null : ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getBaselineTransactionId());
+ artifacts.addAll(checkForTrackedChangesOn(baseArtifact));
+ Artifact newerArtifact =
+ artifactChange.getModificationType() == DELETED ? null : (artifactChange.isHistorical() ? ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ artifactChange.getArtifact().getArtId(), artifactChange.getToTransactionId()) : artifactChange.getArtifact());
+ artifacts.addAll(checkForTrackedChangesOn(newerArtifact));
+ if (artifacts.isEmpty()) {
+ VariableMap variableMap = new VariableMap();
+ String fileName = baseArtifact != null ? baseArtifact.getSafeName() : newerArtifact.getSafeName();
+ variableMap.setValue("fileName", fileName + "_" + (new Date()).toString().replaceAll(":", ";") + ".xml");
+
+ RendererManager.diff(baseArtifact, newerArtifact, true);
+ } else {
+ WordUiUtil.displayWarningMessageDialog("Diff Artifacts Warning",
+ "Detected tracked changes for some artifacts. Please refer to the results HTML report.");
+ WordUiUtil.displayTrackedChangesOnArtifacts(artifacts);
+ }
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ private Set<Artifact> checkForTrackedChangesOn(Artifact artifact) throws OseeCoreException {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ if (!StaticIdManager.hasValue(UserManager.getUser(), DiffPreferencePage.REMOVE_TRACKED_CHANGES)) {
+ Attribute attribute;
+ if (artifact != null) {
+ attribute = artifact.getSoleAttribute(WordAttribute.WORD_TEMPLATE_CONTENT);
+ if (attribute != null) {
+ String value = attribute.getValue().toString();
+ // check for track changes
+ if (WordAnnotationHandler.containsWordAnnotations(value)) {
+ // capture those artifacts that have tracked changes on
+ artifacts.add(artifact);
+ }
+ }
+ }
+ }
+ return artifacts;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/ToggleChangeViewDocOrderHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/ToggleChangeViewDocOrderHandler.java
new file mode 100644
index 00000000000..d14c3c66319
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/change/ToggleChangeViewDocOrderHandler.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.framework.ui.skynet.commandHandlers.change;
+
+import java.util.Map;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeViewPresentationPreferences;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ToggleChangeViewDocOrderHandler extends AbstractHandler implements IElementUpdater {
+ public static String COMMAND_ID = "org.eclipse.osee.framework.ui.skynet.change.ChangeView.showDocOrder";
+ boolean itemChk;
+ private ICommandService service;
+
+ public ToggleChangeViewDocOrderHandler(){
+ this.service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((ChangeView) HandlerUtil.getActivePartChecked(event)).changeShowDocumentOrder(!itemChk);
+ return null;
+ }
+
+ @Override
+ public void updateElement(UIElement element, Map parameters) {
+ itemChk = Platform.getPreferencesService().getRootNode().node(InstanceScope.SCOPE).node(ChangeView.VIEW_ID).getBoolean(ChangeViewPresentationPreferences.SHOW_DOC_ORDER, false);
+ element.setChecked(itemChk);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ service.refreshElements(COMMAND_ID, null);
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/BranchIdParameter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/BranchIdParameter.java
new file mode 100644
index 00000000000..a01fb064f48
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/BranchIdParameter.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.framework.ui.skynet.commandHandlers.merge;
+
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.IParameterValues;
+import org.eclipse.core.commands.ParameterValuesException;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class BranchIdParameter implements IParameter {
+ public String getId() {
+ return BranchView.BRANCH_ID;
+ }
+
+ public String getName() {
+ return "Branch Id";
+ }
+
+ public IParameterValues getValues() throws ParameterValuesException {
+ throw new ParameterValuesException("Branch View has no parameters", null);
+ }
+
+ public boolean isOptional() {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeCompoundContributionItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeCompoundContributionItem.java
new file mode 100644
index 00000000000..cfd4314e16d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeCompoundContributionItem.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.framework.ui.skynet.commandHandlers.merge;
+
+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.core.commands.Command;
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.menus.CommandContributionItemParameter;
+
+/**
+ * Dynamically provides a list of merge branches based on a selected branch
+ *
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class MergeCompoundContributionItem extends CompoundContributionItem {
+ private static final IParameter[] BRANCH_PARAMETER_DEF = new IParameter[] {new BranchIdParameter()};
+ private ICommandService commandService;
+
+ public MergeCompoundContributionItem() {
+ this.commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ }
+
+ public MergeCompoundContributionItem(String id) {
+ super(id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
+ */
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+ ArrayList<IContributionItem> contributionItems = new ArrayList<IContributionItem>(40);
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(structuredSelection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ if (selectedBranch != null) {
+ try {
+ Collection<Integer> destBranches =
+ ConflictManagerInternal.getDestinationBranchesMerged(selectedBranch.getBranchId());
+ try {
+ if (selectedBranch.getParentBranch() != null && !destBranches.contains(selectedBranch.getParentBranch().getBranchId())) {
+ destBranches.add(selectedBranch.getParentBranch().getBranchId());
+ }
+ } catch (BranchDoesNotExist ex) {
+ destBranches.add(0);
+ }
+
+ String commandId = "org.eclipse.osee.framework.ui.skynet.branch.BranchView.mergeManager";
+ Command command = configCommandParameter(commandId);
+ CommandContributionItem contributionItem = null;
+
+ for (Integer branchId : destBranches) {
+ contributionItem = createCommand(branchId, commandId);
+
+ if (command != null && command.isEnabled()) {
+ contributionItems.add(contributionItem);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return contributionItems.toArray(new IContributionItem[0]);
+ }
+
+ private CommandContributionItem createCommand(Integer branchId, String commandId) throws OseeDataStoreException, BranchDoesNotExist{
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put(BranchView.BRANCH_ID, Integer.toString(branchId));
+ CommandContributionItem contributionItem;
+ String label =
+ branchId == 0 ? "Can't Merge a Root Branch" : BranchManager.getBranch(branchId).getBranchName();
+
+ contributionItem =
+ new CommandContributionItem(new CommandContributionItemParameter(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow(), label, commandId, parameters,
+ null, null, null, label, null, null, SWT.NONE, null, false));
+
+ return contributionItem;
+ }
+
+ private Command configCommandParameter(String commandId) {
+ Command command = commandService.getCommand(commandId);
+
+ try {
+ command.define(command.getName(), "", commandService.getCategory("org.eclipse.debug.ui.category.run"),
+ BRANCH_PARAMETER_DEF);
+ } catch (NotDefinedException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return command;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeManagerHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeManagerHandler.java
new file mode 100644
index 00000000000..d0458afb4a3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/merge/MergeManagerHandler.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.framework.ui.skynet.commandHandlers.merge;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Theron Virgin
+ */
+public class MergeManagerHandler extends CommandHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent arg0) throws ExecutionException {
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ if (!selection.isEmpty()) {
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ try {
+ Branch toBranch = BranchManager.getBranch(Integer.parseInt(arg0.getParameter(BranchView.BRANCH_ID)));
+ if (selectedBranch != null && toBranch != null) {
+ MergeView.openView(selectedBranch, toBranch,
+ TransactionIdManager.getStartEndPoint(selectedBranch).getKey());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+
+ boolean enabled = false;
+ IStructuredSelection selection =
+ (IStructuredSelection) AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider().getSelection();
+
+ if (!selection.isEmpty()) {
+ List<Branch> branches = Handlers.getBranchesFromStructuredSelection(selection);
+
+ if (!branches.isEmpty()) {
+ Branch selectedBranch = branches.iterator().next();
+ try {
+ if (selectedBranch != null && !ConflictManagerInternal.getDestinationBranchesMerged(
+ selectedBranch.getBranchId()).isEmpty()) {
+ enabled = true;
+ }else{
+ enabled =
+ (selectedBranch != null && (!(selectedBranch.getAssociatedArtifact() instanceof IATSArtifact)) && selectedBranch.hasParentBranch());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ return enabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/AbstractEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/AbstractEditorHandler.java
new file mode 100644
index 00000000000..697fee38791
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/AbstractEditorHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.List;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.CommandHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This abstract class provides the basic functionality for opening renderer editors.
+ *
+ * @author Jeff C. Phillips
+ */
+public abstract class AbstractEditorHandler extends CommandHandler {
+ private static final AccessControlManager accessControlManager = AccessControlManager.getInstance();
+ protected List<Artifact> artifacts;
+ ISelectionProvider selectionProvider;
+
+ protected PermissionEnum getPermissionLevel() {
+ return PermissionEnum.READ;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ selectionProvider = AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ isEnabled =
+ !artifacts.isEmpty() && accessControlManager.checkObjectListPermission(artifacts, getPermissionLevel());
+ }
+ return isEnabled;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/ArtifactEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/ArtifactEditorHandler.java
new file mode 100644
index 00000000000..521b6f8b966
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/ArtifactEditorHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+
+/**
+ * Opens an artifact editor as long as the user has Read permission
+ *
+ * @author Jeff C. Phillips
+ */
+public class ArtifactEditorHandler extends AbstractEditorHandler {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent myExecutionEvent) throws ExecutionException {
+ ArtifactEditor.editArtifacts(artifacts);
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/NativeEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/NativeEditorHandler.java
new file mode 100644
index 00000000000..2539101b718
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/NativeEditorHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.render.NativeRenderer;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class NativeEditorHandler extends AbstractEditorHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ NativeRenderer renderer = new NativeRenderer();
+ renderer.open(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(WordEditorHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OpenHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OpenHandler.java
new file mode 100644
index 00000000000..8570e8bc8c7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OpenHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OpenHandler extends AbstractEditorHandler {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ if (StaticIdManager.hasValue(UserManager.getUser(),
+ EditorsPreferencePage.PreviewOnDoubleClickForWordArtifacts)) {
+ RendererManager.previewInJob(artifacts);
+ } else {
+ RendererManager.openInJob(artifacts, PresentationType.GENERALIZED_EDIT);
+ }
+
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler#isEnabledWithException()
+ */
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ // TODO Auto-generated method stub
+ return super.isEnabledWithException();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OtherEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OtherEditorHandler.java
new file mode 100644
index 00000000000..a927eb1b43e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/OtherEditorHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.NativeRenderer;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.EditorSelectionDialog;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.internal.WorkbenchPage;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OtherEditorHandler extends AbstractEditorHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ EditorSelectionDialog dialog =
+ new EditorSelectionDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+ dialog.setMessage(String.format("Choose the editor for opening %s", artifacts));
+
+ NativeRenderer renderer = new NativeRenderer();
+
+ // String dummyName = renderer.getAssociatedExtension(artifacts.iterator().next());
+ // IEditorDescriptor[] editorDescriptors = getEditorDescriptorFilters(dummyName);
+ // if (editorDescriptors != null) {
+ // // dialog.setEditorsToFilter(editorDescriptors);
+ // }
+ if (dialog.open() == Window.OK) {
+ IEditorDescriptor editor = dialog.getSelectedEditor();
+ if (editor != null) {
+ IFile file = renderer.getRenderedFileForOpen(artifacts);
+ openEditor(editor, file, editor.isOpenExternal());
+ }
+ }
+ dispose();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(WordEditorHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ // private IEditorDescriptor[] getEditorDescriptorFilters(String name) {
+ // IEditorDescriptor[] toReturn;
+ // IEditorDescriptor[] editorDescriptors = PlatformUI.getWorkbench().getEditorRegistry().getEditors(name);
+ // if (editorDescriptors != null) {
+ // Set<IEditorDescriptor> allEditors = new HashSet<IEditorDescriptor>();
+ // EditorRegistry registry = (EditorRegistry) PlatformUI.getWorkbench().getEditorRegistry();
+ // allEditors.addAll(Arrays.asList(registry.getSortedEditorsFromPlugins()));
+ // allEditors.addAll(Arrays.asList(registry.getSortedEditorsFromOS()));
+ // List<IEditorDescriptor> filter = Collections.setComplement(allEditors, Arrays.asList(editorDescriptors));
+ // toReturn = filter.toArray(new IEditorDescriptor[filter.size()]);
+ // } else {
+ // toReturn = new IEditorDescriptor[0];
+ // }
+ // return toReturn;
+ // }
+
+ private void openEditor(IEditorDescriptor editor, IFile file, boolean openUsingDescriptor) {
+ if (file == null) {
+ return;
+ }
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ if (openUsingDescriptor) {
+ ((WorkbenchPage) page).openEditorFromDescriptor(new FileEditorInput(file), editor, true, null);
+ } else {
+ String editorId = editor == null ? IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID : editor.getId();
+
+ page.openEditor(new FileEditorInput(file), editorId, true,
+ IWorkbenchPage.MATCH_INPUT | IWorkbenchPage.MATCH_ID);
+ // only remember the default editor if the open succeeds
+ IDE.setDefaultEditor(file, editorId);
+ }
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Open Editor Error", ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewTisHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewTisHandler.java
new file mode 100644
index 00000000000..af2f3ba2d57
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewTisHandler.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.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.render.TisRenderer;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PreviewTisHandler extends AbstractEditorHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ TisRenderer renderer = new TisRenderer();
+ renderer.preview(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewTisHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWholeWordHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWholeWordHandler.java
new file mode 100644
index 00000000000..5716aa2122c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWholeWordHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.WholeDocumentRenderer;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PreviewWholeWordHandler extends AbstractEditorHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ WholeDocumentRenderer renderer = new WholeDocumentRenderer();
+ renderer.preview(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWholeWordHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * A subclass may override this method if they would like options to be set on the renderer
+ *
+ * @return
+ */
+ protected VariableMap getOptions() throws OseeArgumentException {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWithChildWordHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWithChildWordHandler.java
new file mode 100644
index 00000000000..6af37f7457b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWithChildWordHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.ITemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PreviewWithChildWordHandler extends PreviewWordHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.setOptions(getOptions());
+ renderer.preview(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWithChildWordHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * A subclass may override this method if they would like options to be set on the renderer
+ *
+ * @return
+ * @throws OseeArgumentException
+ */
+ protected VariableMap getOptions() throws OseeArgumentException {
+ return new VariableMap(ITemplateRenderer.PREVIEW_WITH_RECURSE_OPTION_PAIR);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWordHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWordHandler.java
new file mode 100644
index 00000000000..fa630fc661d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/PreviewWordHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class PreviewWordHandler extends AbstractEditorHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.setOptions(getOptions());
+ renderer.preview(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(PreviewWordHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * A subclass may override this method if they would like options to be set on the renderer
+ *
+ * @return
+ */
+ protected VariableMap getOptions() throws OseeArgumentException {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WholeDocumentEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WholeDocumentEditorHandler.java
new file mode 100644
index 00000000000..62cb7009a30
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WholeDocumentEditorHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.render.WholeDocumentRenderer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WholeDocumentEditorHandler extends AbstractEditorHandler {
+ private static final AccessControlManager accessControlManager = AccessControlManager.getInstance();
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ WholeDocumentRenderer renderer = new WholeDocumentRenderer();
+ renderer.open(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(WholeDocumentEditorHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler#getPermissionLevel()
+ */
+ @Override
+ protected PermissionEnum getPermissionLevel() {
+ return PermissionEnum.WRITE;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ isEnabled = accessControlManager.checkObjectListPermission(artifacts, getPermissionLevel());
+ }
+
+ for (Artifact artifact : artifacts) {
+ isEnabled &= !artifact.isReadOnly();
+ }
+
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WordEditorHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WordEditorHandler.java
new file mode 100644
index 00000000000..0190f936460
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/commandHandlers/renderer/handlers/WordEditorHandler.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.framework.ui.skynet.commandHandlers.renderer.handlers;
+
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.Handlers;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WordEditorHandler extends AbstractEditorHandler {
+ private static final AccessControlManager accessControlManager = AccessControlManager.getInstance();
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ WordTemplateRenderer renderer = new WordTemplateRenderer();
+ renderer.open(artifacts);
+ dispose();
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(WordEditorHandler.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.commandHandlers.renderer.handlers.AbstractEditorHandler#getPermissionLevel()
+ */
+ @Override
+ protected PermissionEnum getPermissionLevel() {
+ return PermissionEnum.WRITE;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return false;
+ }
+ boolean isEnabled = false;
+
+ ISelectionProvider selectionProvider =
+ AWorkbench.getActivePage().getActivePart().getSite().getSelectionProvider();
+
+ if (selectionProvider != null && selectionProvider.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selectionProvider.getSelection();
+ artifacts = Handlers.getArtifactsFromStructuredSelection(structuredSelection);
+
+ isEnabled = accessControlManager.checkObjectListPermission(artifacts, getPermissionLevel());
+ }
+
+ for (Artifact artifact : artifacts) {
+ isEnabled &= !artifact.isReadOnly();
+ }
+
+ return isEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareInput.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareInput.java
new file mode 100644
index 00000000000..8636d0a276e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareInput.java
@@ -0,0 +1,143 @@
+/*
+ * Created on Jun 3, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.compare;
+
+import java.lang.reflect.Field;
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.CompareEditorInput;
+import org.eclipse.compare.CompareViewerSwitchingPane;
+import org.eclipse.compare.structuremergeviewer.DiffNode;
+import org.eclipse.compare.structuremergeviewer.Differencer;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author b1565043
+ */
+public class CompareInput extends CompareEditorInput {
+ private static final String CONFIRM_SAVE_PROPERTY = "org.eclipse.compare.internal.CONFIRM_SAVE_PROPERTY";
+ private Object differences;
+ private CompareItem left;
+ private CompareItem right;
+
+ /*
+ *
+ *
+ *
+ *
+ CompareConfiguration compareConfiguration = new CompareConfiguration();
+ compareConfiguration.setLeftEditable(true);
+ compareConfiguration.setRightEditable(false);
+ CompareUI.openCompareEditor(new CompareInput(compareConfiguration));
+
+
+
+ */
+ public CompareInput(CompareConfiguration compareConfiguration) {
+ super(compareConfiguration);
+
+ getCompareConfiguration().setProperty(CONFIRM_SAVE_PROPERTY, Boolean.FALSE);
+ }
+
+ protected Object prepareInput(IProgressMonitor pm) {
+ initTitle();
+
+ CompareItem ancestor = new CompareItem("Common", "contents", System.currentTimeMillis());
+ left = new CompareItem("Left", "new contents 23\nhi\nbye", System.currentTimeMillis());
+ right = new CompareItem("Right", "old contents 21\nhi\ntry", System.currentTimeMillis());
+ Differencer differencer = new Differencer();
+ differences = differencer.findDifferences(true, pm, null, ancestor, left, right);
+ // MergeNode mergeNode = new MergeNode(null, Differencer.CONFLICTING,
+ // ancestor, left, right);
+ return differences;
+ }
+
+ private void initTitle() {
+ CompareConfiguration cc = getCompareConfiguration();
+ String nameLeft = "Left Object";
+ String nameRight = "Right Object";
+ if (nameLeft.equals(nameRight)) {
+ nameLeft = "Left object";
+ nameRight = "Right Object";
+ }
+
+ cc.setLeftLabel(nameLeft);
+// cc.setLeftImage(Artifact.getOverrideImage());
+
+ cc.setRightLabel(nameRight);
+// cc.setRightImage(Artifact.getOverrideImage());
+
+// cc.setLeftEditable(true);
+// cc.setRightEditable(true);
+ setTitle("Compare (" + nameLeft + " - " + nameRight + ")");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.CompareEditorInput#isEditionSelectionDialog()
+ */
+ @Override
+ public boolean isEditionSelectionDialog() {
+ return super.isEditionSelectionDialog();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.CompareEditorInput#isSaveNeeded()
+ */
+ @Override
+ public boolean isSaveNeeded() {
+ return super.isSaveNeeded();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.CompareEditorInput#saveChanges(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void saveChanges(IProgressMonitor monitor) throws CoreException {
+ super.saveChanges(monitor);
+ if (differences instanceof DiffNode) {
+ try {
+ // boolean result = commit(monitor, (DiffNode) differences);
+ // let the UI re-compare here on changed inputs
+ if (true) {
+ }
+ } finally {
+ setDirty(false);
+ }
+ }
+ }
+
+
+
+ public CompareViewerSwitchingPane getInputPane() {
+ try {
+ Field field = CompareEditorInput.class.getDeclaredField("fContentInputPane");
+ field.setAccessible(true);
+ Object object = field.get(this);
+ if (object instanceof CompareViewerSwitchingPane) {
+ return (CompareViewerSwitchingPane) object;
+ }
+ } catch (Throwable e) {
+ // ignore
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.CompareEditorInput#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ return super.isDirty();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.CompareEditorInput#save(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void save(IProgressMonitor pm) {
+ super.save(pm);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareItem.java
new file mode 100644
index 00000000000..991372e6edc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/compare/CompareItem.java
@@ -0,0 +1,90 @@
+/*
+ * Created on Jun 3, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.compare;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import org.eclipse.compare.IEditableContent;
+import org.eclipse.compare.IModificationDate;
+import org.eclipse.compare.IStreamContentAccessor;
+import org.eclipse.compare.ITypedElement;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISaveablesSource;
+import org.eclipse.ui.Saveable;
+
+/**
+ * @author b1565043
+ */
+public class CompareItem implements IStreamContentAccessor, ITypedElement, IModificationDate, ISaveablesSource , IEditableContent{
+ private String contents, name;
+ private long time;
+
+ CompareItem(String name, String contents, long time) {
+ this.name = name;
+ this.contents = contents;
+ this.time = time;
+ }
+
+ public InputStream getContents() throws CoreException {
+ return new ByteArrayInputStream(contents.getBytes());
+ }
+
+ public Image getImage() {
+ return null;
+ }
+
+ public boolean isEditable() {
+ return true;
+ }
+
+ public long getModificationDate() {
+ return time;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getString() {
+ return contents;
+ }
+
+ public String getType() {
+ return ITypedElement.TEXT_TYPE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablesSource#getActiveSaveables()
+ */
+ @Override
+ public Saveable[] getActiveSaveables() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.ISaveablesSource#getSaveables()
+ */
+ @Override
+ public Saveable[] getSaveables() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.IEditableContent#replace(org.eclipse.compare.ITypedElement, org.eclipse.compare.ITypedElement)
+ */
+ @Override
+ public ITypedElement replace(ITypedElement dest, ITypedElement src) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.compare.IEditableContent#setContent(byte[])
+ */
+ @Override
+ public void setContent(byte[] newContent) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactIdWithoutVersionsCheck.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactIdWithoutVersionsCheck.java
new file mode 100644
index 00000000000..076425c1e9d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactIdWithoutVersionsCheck.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.framework.ui.skynet.dbHealth;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactIdWithoutVersionsCheck extends DatabaseHealthOperation {
+
+ private static final String GET_INVALID_A_ART_IDS =
+ "select item.a_art_id as artId, item.rel_link_id as itemId from osee_relation_link item where NOT EXISTS (select oav.art_id from osee_artifact_version oav where oav.art_id = item.a_art_id)";
+
+ private static final String GET_INVALID_B_ART_IDS =
+ "select item.b_art_id as artId, item.rel_link_id as itemId from osee_relation_link item where NOT EXISTS (select oav.art_id from osee_artifact_version oav where oav.art_id = item.b_art_id)";
+
+ private static final String GET_INVALID_ATTR_IDS_ART_IDS =
+ "select item.art_id as artId, item.attr_id as itemId from osee_attribute item where NOT EXISTS (select oav.art_id from osee_artifact_version oav where oav.art_id = item.art_id)";
+
+ private static final String GET_INVALID_ART_IDS =
+ "select item.art_id as artId from osee_artifact item where NOT EXISTS (select oav.art_id from osee_artifact_version oav where oav.art_id = item.art_id)";
+
+ /**
+ * @param operationName
+ */
+ public ArtifactIdWithoutVersionsCheck() {
+ super("Artifact Id Without Version Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ Set<Integer> allInvalidArtIds = new HashSet<Integer>();
+ List<ItemEntry> itemsToDelete = new ArrayList<ItemEntry>();
+
+ itemsToDelete.add(new ItemEntry("osee_relation_link", "rel_link_id", "a_art_id", //
+ getInvalidEntries(monitor, allInvalidArtIds, GET_INVALID_A_ART_IDS, true)));
+
+ itemsToDelete.add(new ItemEntry("osee_relation_link", "rel_link_id", "b_art_id", //
+ getInvalidEntries(monitor, allInvalidArtIds, GET_INVALID_B_ART_IDS, true)));
+
+ itemsToDelete.add(new ItemEntry("osee_attribute", "attr_id", "art_id", //
+ getInvalidEntries(monitor, allInvalidArtIds, GET_INVALID_ATTR_IDS_ART_IDS, true)));
+
+ int beforeArtifactCheck = allInvalidArtIds.size();
+ itemsToDelete.add(new ItemEntry("osee_artifact", "art_id", "art_id", //
+ getInvalidEntries(monitor, allInvalidArtIds, GET_INVALID_ART_IDS, false)));
+
+ setItemsToFix(allInvalidArtIds.size());
+ if (isShowDetailsEnabled()) {
+ createReport(monitor, beforeArtifactCheck, getItemsToFixCount(), itemsToDelete);
+ } else {
+ monitor.worked(calculateWork(0.10));
+ }
+
+ if (false && isFixOperationEnabled() && getItemsToFixCount() > 0) {
+ for (ItemEntry entry : itemsToDelete) {
+ if (!entry.invalids.isEmpty()) {
+ String deleteSql = String.format("delete from %s where %s = ?", entry.table, entry.itemIdName);
+ List<Object[]> dataList = new ArrayList<Object[]>();
+ for (Integer item : entry.invalids) {
+ dataList.add(new Object[] {item});
+ }
+ ConnectionHandler.runBatchUpdate(deleteSql, dataList);
+ }
+ }
+ }
+ getSummary().append(String.format("Found [%s] invalid artIds referencedBy", getItemsToFixCount()));
+ monitor.worked(calculateWork(0.50));
+ }
+
+ private void createReport(IProgressMonitor monitor, int totalBeforeCheck, int totalArtIds, List<ItemEntry> itemsToDelete) throws IOException {
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(new String[] {"TABLE", "REFERENCED_BY", "TOTAL INVALIDS"}));
+ for (ItemEntry entry : itemsToDelete) {
+ appendToDetails(AHTML.addRowMultiColumnTable(new String[] {entry.table, entry.invalidField,
+ String.valueOf(entry.invalids.size())}));
+ }
+ appendToDetails(AHTML.endMultiColumnTable());
+ monitor.worked(calculateWork(0.10));
+ checkForCancelledStatus(monitor);
+ }
+
+ private Set<Integer> getInvalidEntries(IProgressMonitor monitor, Set<Integer> allInvalidArtIds, String query, boolean hasItemId) throws OseeDataStoreException {
+ Set<Integer> toReturn = new HashSet<Integer>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(query);
+ while (chStmt.next()) {
+ if (hasItemId) {
+ toReturn.add(chStmt.getInt("itemId"));
+ }
+ allInvalidArtIds.add(chStmt.getInt("artId"));
+ }
+ } finally {
+ chStmt.close();
+ }
+ monitor.worked(calculateWork(0.10));
+ checkForCancelledStatus(monitor);
+ return hasItemId ? toReturn : allInvalidArtIds;
+ }
+
+ private final class ItemEntry {
+ private final String table;
+ private final String itemIdName;
+ private final String invalidField;
+ private final Set<Integer> invalids;
+
+ public ItemEntry(String table, String itemIdName, String invalidField, Set<Integer> invalids) {
+ super();
+ this.table = table;
+ this.itemIdName = itemIdName;
+ this.invalidField = invalidField;
+ this.invalids = invalids;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactTxCurrent.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactTxCurrent.java
new file mode 100644
index 00000000000..677ef5f2ca7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/ArtifactTxCurrent.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.framework.ui.skynet.dbHealth;
+
+import java.util.HashSet;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * @author Theron Virgin
+ */
+public class ArtifactTxCurrent extends DatabaseHealthOperation {
+ private HashSet<LocalTxData> multipleSet = null;
+ private HashSet<Pair<Integer, Integer>> noneSet = null;
+
+ public ArtifactTxCurrent() {
+ super("Tx_Current Artifact Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ String[] columnHeaders = new String[] {"Count", "Art id", "Branch id"};
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ appendToDetails(AHTML.addRowSpanMultiColumnTable("Artifacts with no tx_current set", columnHeaders.length));
+ }
+ monitor.worked(calculateWork(0.10));
+
+ if (!isFixOperationEnabled() || noneSet == null) {
+ noneSet = HealthHelper.getNoTxCurrentSet("art_id", "osee_artifact_version", getSummary(), " Artifacts");
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (isShowDetailsEnabled()) {
+ HealthHelper.dumpDataNone(getDetailedReport(), noneSet);
+ columnHeaders = new String[] {"Count", "Art id", "Branch id", "Num TX_Currents"};
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ appendToDetails(AHTML.addRowSpanMultiColumnTable("Artifacts with multiple tx_currents set",
+ columnHeaders.length));
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (!isFixOperationEnabled() || multipleSet == null) {
+ //Multiple TX Currents Set
+ multipleSet =
+ HealthHelper.getMultipleTxCurrentSet("art_id", "osee_artifact_version", getSummary(), " Artifacts");
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (isShowDetailsEnabled()) {
+ HealthHelper.dumpDataMultiple(getDetailedReport(), multipleSet);
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ int multipleTxCurrentCount = multipleSet != null ? multipleSet.size() : 0;
+ int noTxCurrentCount = noneSet != null ? noneSet.size() : 0;
+ setItemsToFix(noTxCurrentCount + multipleTxCurrentCount);
+
+ if (isFixOperationEnabled()) {
+ /** Duplicate TX_current Cleanup **/
+ monitor.subTask("Cleaning up multiple Tx_currents");
+ HealthHelper.cleanMultipleTxCurrent("art_id", "osee_artifact_version", getSummary(), multipleSet);
+ monitor.worked(calculateWork(0.25));
+ monitor.subTask("Cleaning up no Tx_currents");
+ HealthHelper.cleanNoTxCurrent("art_id", "osee_artifact_version", getSummary(), noneSet);
+ multipleSet = null;
+ noneSet = null;
+ } else {
+ monitor.worked(calculateWork(0.25));
+ }
+ monitor.worked(calculateWork(0.20));
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.endMultiColumnTable());
+ }
+ monitor.worked(calculateWork(0.05));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/AttributeTxCurrent.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/AttributeTxCurrent.java
new file mode 100644
index 00000000000..71b993934d8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/AttributeTxCurrent.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.framework.ui.skynet.dbHealth;
+
+import java.util.HashSet;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * @author Theron Virgin
+ */
+public class AttributeTxCurrent extends DatabaseHealthOperation {
+
+ private HashSet<LocalTxData> multipleSet = null;
+ private HashSet<Pair<Integer, Integer>> noneSet = null;
+
+ public AttributeTxCurrent() {
+ super("TX_Current Attribute Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ String[] columnHeaders = new String[] {"Count", "Attr id", "Branch id"};
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ appendToDetails(AHTML.addRowSpanMultiColumnTable("Attributes with no tx_current set", columnHeaders.length));
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (!isFixOperationEnabled() || noneSet == null) {
+ noneSet = HealthHelper.getNoTxCurrentSet("attr_id", "osee_attribute", getSummary(), " Attributes");
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (isShowDetailsEnabled()) {
+ HealthHelper.dumpDataNone(getDetailedReport(), noneSet);
+ columnHeaders = new String[] {"Count", "Attr id", "Branch id", "Num TX_Currents"};
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ appendToDetails(AHTML.addRowSpanMultiColumnTable("Attributes with multiple tx_currents set",
+ columnHeaders.length));
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (!isFixOperationEnabled() || multipleSet == null) {
+ //Multiple TX Currents Set
+ multipleSet = HealthHelper.getMultipleTxCurrentSet("attr_id", "osee_attribute", getSummary(), " Attributes");
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (isShowDetailsEnabled()) {
+ HealthHelper.dumpDataMultiple(getDetailedReport(), multipleSet);
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ int multipleTxCurrentCount = multipleSet != null ? multipleSet.size() : 0;
+ int noTxCurrentCount = noneSet != null ? noneSet.size() : 0;
+ setItemsToFix(noTxCurrentCount + multipleTxCurrentCount);
+
+ if (isFixOperationEnabled()) {
+ /** Duplicate TX_current Cleanup **/
+ monitor.subTask("Cleaning up multiple Tx_currents");
+ HealthHelper.cleanMultipleTxCurrent("attr_id", "osee_attribute", getSummary(), multipleSet);
+ monitor.worked(calculateWork(0.25));
+
+ monitor.subTask("Cleaning up multiple Tx_currents");
+ HealthHelper.cleanNoTxCurrent("attr_id", "osee_attribute", getSummary(), noneSet);
+ multipleSet = null;
+ noneSet = null;
+ } else {
+ monitor.worked(calculateWork(0.25));
+ }
+ monitor.worked(calculateWork(0.20));
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.endMultiColumnTable());
+ }
+ monitor.worked(calculateWork(0.05));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/BranchStateHealthCheck.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/BranchStateHealthCheck.java
new file mode 100644
index 00000000000..0d8445f09f0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/BranchStateHealthCheck.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.framework.ui.skynet.dbHealth;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.enums.BranchState;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchStateHealthCheck extends DatabaseHealthOperation {
+
+ public BranchStateHealthCheck() {
+ super("Branch State Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ monitor.setTaskName("Loading Branch information");
+ List<BranchData> itemsToFix = new ArrayList<BranchData>();
+
+ Collection<BranchData> branchDatas = getAllBranchData();
+ monitor.worked(calculateWork(0.25));
+ checkForCancelledStatus(monitor);
+
+ monitor.setTaskName("Checking Branch State Data");
+ for (BranchData branchData : branchDatas) {
+ check(branchData);
+ if (branchData.hasBranchStateChanged()) {
+ itemsToFix.add(branchData);
+ }
+ }
+ monitor.worked(calculateWork(0.25));
+ checkForCancelledStatus(monitor);
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(new String[] {"Reason", "Was State", "Fixed State",
+ "BranchType", "Archived", "Txs", "Commit Tx", "BranchId", "Branch Name"}));
+ Collections.sort(itemsToFix, new Comparator<BranchData>() {
+
+ @Override
+ public int compare(BranchData o1, BranchData o2) {
+ int result = 0;
+ if (o1 != null && o2 != null) {
+ result = o1.getBranchType().compareTo(o2.getBranchType());
+ if (result == 0) {
+ result = ((Boolean) o1.isArchived()).compareTo(o2.isArchived());
+ }
+ if (result == 0) {
+ result = o1.getNumberOfTxs() - o2.getNumberOfTxs();
+ }
+ }
+ return result;
+ }
+
+ });
+ for (BranchData data : itemsToFix) {
+ appendToDetails(AHTML.addRowMultiColumnTable(new String[] {data.getReason(),
+ String.valueOf(data.getOriginalBranchState()), String.valueOf(data.getBranchState()),
+ String.valueOf(data.getBranchType()), String.valueOf(data.isArchived()),
+ String.valueOf(data.getNumberOfTxs()), String.valueOf(data.hasCommitTransactionId()),
+ String.valueOf(data.getBranchId()), data.getBranchName()}));
+ }
+ appendToDetails(AHTML.endMultiColumnTable());
+ }
+ monitor.worked(calculateWork(0.25));
+ checkForCancelledStatus(monitor);
+
+ setItemsToFix(itemsToFix.size());
+ if (isFixOperationEnabled() && getItemsToFixCount() > 0) {
+ monitor.setTaskName("Fixing Branch State data");
+ List<Object[]> data = new ArrayList<Object[]>();
+ for (BranchData branchData : itemsToFix) {
+ data.add(new Object[] {branchData.getBranchState().getValue(), branchData.getBranchId()});
+ }
+ ConnectionHandler.runBatchUpdate("update osee_branch set branch_state = ? where branch_id = ?", data);
+ }
+
+ getSummary().append(String.format("Found [%s] branches with invalid branchState\n", getItemsToFixCount()));
+ monitor.worked(calculateWork(0.25));
+ }
+
+ private boolean isRebaselined(BranchData branchData) {
+ String name = branchData.getBranchName();
+ return name.contains("- moved by update on -") || name.contains("- for update -");
+ }
+
+ private boolean hasBeenCommitted(BranchData branchData) {
+ boolean result = false;
+ if (BranchType.MERGE.equals(branchData.getBranchType())) {
+ result = branchData.hasCommitTransactionId();
+ } else {
+ result = branchData.isArchived();
+ }
+ return result;
+ }
+
+ private void check(BranchData branchData) {
+ BranchState state = branchData.getBranchState();
+ BranchType type = branchData.getBranchType();
+
+ if (BranchType.SYSTEM_ROOT.equals(type)) {
+ if (!BranchState.CREATED.equals(state)) {
+ branchData.setBranchState(BranchState.CREATED);
+ branchData.setReason("System Root should always be set to created");
+ }
+ } else if (state != BranchState.DELETED && state != BranchState.COMMIT_IN_PROGRESS && state != BranchState.REBASELINE_IN_PROGRESS) {
+ if (BranchType.WORKING.equals(type)) {
+ if (isRebaselined(branchData)) {
+ branchData.setBranchState(BranchState.REBASELINED);
+ branchData.setReason("Rebaselined case - detected from name");
+ } else if (hasBeenCommitted(branchData)) {
+ branchData.setBranchState(BranchState.COMMITTED);
+ branchData.setReason("Committed case - detected");
+ } else if (branchData.getNumberOfTxs() > 1) {
+ branchData.setBranchState(BranchState.MODIFIED);
+ branchData.setReason("Modified case - detected");
+ } else {
+ branchData.setBranchState(BranchState.CREATED);
+ branchData.setReason("Was Created case - detected");
+ }
+ } else if (BranchType.MERGE.equals(type)) {
+ if (hasBeenCommitted(branchData)) {
+ branchData.setBranchState(BranchState.COMMITTED);
+ branchData.setReason("Committed case - detected");
+ } else if (branchData.getNumberOfTxs() > 1) {
+ branchData.setBranchState(BranchState.MODIFIED);
+ branchData.setReason("Modified case - detected");
+ } else {
+ branchData.setBranchState(BranchState.CREATED);
+ branchData.setReason("Was Created case - detected");
+ }
+ }
+ }
+ }
+
+ private Collection<BranchData> getAllBranchData() throws OseeDataStoreException {
+ Map<Integer, BranchData> data = new HashMap<Integer, BranchData>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery("select * from osee_branch");
+ while (chStmt.next()) {
+ int branchId = chStmt.getInt("branch_id");
+ int branchType = chStmt.getInt("branch_type");
+ int branchState = chStmt.getInt("branch_state");
+ boolean isArchived = chStmt.getInt("archived") == 1 ? true : false;
+ int numberOfTxs =
+ ConnectionHandler.runPreparedQueryFetchInt(0,
+ "select count(1) from osee_tx_details where branch_id = ?", branchId);
+ data.put(branchId, new BranchData(branchId, chStmt.getString("branch_name"),
+ BranchType.getBranchType(branchType), BranchState.getBranchState(branchState), isArchived,
+ numberOfTxs));
+ }
+ } finally {
+ chStmt.close();
+ }
+ chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery("select * from osee_merge");
+ while (chStmt.next()) {
+ Integer branchId = chStmt.getInt("merge_branch_id");
+ BranchData branchData = data.get(branchId);
+ branchData.setHasCommitTransactionId(chStmt.getInt("commit_transaction_id") != -1);
+ }
+ } finally {
+ chStmt.close();
+ }
+ return data.values();
+ }
+ private final class BranchData {
+ private final int branchId;
+ private final String branchName;
+ private final BranchType branchType;
+ private final BranchState originalBranchState;
+ private BranchState branchState;
+ private final boolean isArchived;
+ private final int numberOfTxs;
+ private String reasonForChange;
+ private boolean hasCommitTransactionId;
+
+ private BranchData(int branchId, String branchName, BranchType branchType, BranchState branchState, boolean isArchived, int numberOfTxs) {
+ super();
+ this.branchId = branchId;
+ this.branchName = branchName;
+ this.branchType = branchType;
+ this.branchState = branchState;
+ this.originalBranchState = branchState;
+ this.isArchived = isArchived;
+ this.numberOfTxs = numberOfTxs;
+ this.reasonForChange = Strings.emptyString();
+ this.hasCommitTransactionId = false;
+ }
+
+ public int getBranchId() {
+ return branchId;
+ }
+
+ public String getBranchName() {
+ return branchName;
+ }
+
+ public BranchType getBranchType() {
+ return branchType;
+ }
+
+ public void setBranchState(BranchState branchState) {
+ this.branchState = branchState;
+ }
+
+ public BranchState getBranchState() {
+ return branchState;
+ }
+
+ public BranchState getOriginalBranchState() {
+ return originalBranchState;
+ }
+
+ public boolean isArchived() {
+ return isArchived;
+ }
+
+ public int getNumberOfTxs() {
+ return numberOfTxs;
+ }
+
+ public boolean hasBranchStateChanged() {
+ return branchState != originalBranchState;
+ }
+
+ public void setReason(String reasonForChange) {
+ this.reasonForChange = reasonForChange;
+ }
+
+ public String getReason() {
+ return reasonForChange;
+ }
+
+ public void setHasCommitTransactionId(boolean hasCommitTransactionId) {
+ this.hasCommitTransactionId = hasCommitTransactionId;
+ }
+
+ public boolean hasCommitTransactionId() {
+ return hasCommitTransactionId;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAddressingData.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAddressingData.java
new file mode 100644
index 00000000000..63b44ad8cb1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAddressingData.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.framework.ui.skynet.dbHealth;
+
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * Identifies and removes addressing from the transaction table that no longer addresses other tables.
+ *
+ * @author Theron Virgin
+ */
+public class CleanUpAddressingData extends DatabaseHealthOperation {
+
+ private static final String NOT_BACKED_GAMMAS =
+ "SELECT gamma_id from osee_txs Union Select rem_gamma_id as gamma_id FROM osee_removed_txs %s " + HealthHelper.ALL_BACKING_GAMMAS;
+ private static final String NOT_BACKED_TRANSACTIONS =
+ "SELECT transaction_id from osee_txs UNION SELECT rem_transaction_id as transaction_id FROM osee_removed_txs UNION SELECT DISTINCT transaction_id FROM osee_removed_txs %s SELECT transaction_id from osee_tx_details";
+ private static final String REMOVE_NOT_ADDRESSED_GAMMAS = "DELETE FROM osee_txs WHERE gamma_id = ?";
+ private static final String REMOVE_NOT_ADDRESSED_TRANSACTIONS = "DELETE FROM osee_txs WHERE transaction_id = ?";
+
+ private List<Object[]> gammas = null;
+ private List<Object[]> transactions = null;
+
+ public CleanUpAddressingData() {
+ super("TXS Entries with no Backing Data");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ boolean fix = isFixOperationEnabled();
+ boolean verify = !fix;
+ if (verify || gammas == null) {
+ gammas =
+ HealthHelper.runSingleResultQuery(
+ String.format(NOT_BACKED_GAMMAS, SupportedDatabase.getComplementSql()), "gamma_id");
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.25));
+
+ if (verify || transactions == null) {
+ transactions =
+ HealthHelper.runSingleResultQuery(String.format(NOT_BACKED_TRANSACTIONS,
+ SupportedDatabase.getComplementSql()), "transaction_id");
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.25));
+
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ HealthHelper.displayForCleanUp("Gamma Id", getDetailedReport(), getSummary(), verify, gammas,
+ "'s with no backing data\n");
+ HealthHelper.displayForCleanUp("Transaction Id", getDetailedReport(), getSummary(), verify, transactions,
+ "'s with no backing data\n");
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.25));
+
+ int gammaCount = gammas != null ? gammas.size() : 0;
+ int txCount = transactions != null ? transactions.size() : 0;
+ setItemsToFix(txCount + gammaCount);
+
+ if (fix) {
+ if (gammas.size() > 0) {
+ ConnectionHandler.runBatchUpdate(REMOVE_NOT_ADDRESSED_GAMMAS, gammas);
+ }
+ monitor.worked(calculateWork(0.10));
+ if (transactions.size() > 0) {
+ ConnectionHandler.runBatchUpdate(REMOVE_NOT_ADDRESSED_TRANSACTIONS, transactions);
+ }
+ monitor.worked(calculateWork(0.10));
+ gammas = null;
+ transactions = null;
+ } else {
+ monitor.worked(calculateWork(0.20));
+ }
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.endMultiColumnTable());
+ }
+ monitor.worked(calculateWork(0.05));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAttrFromDeletedArt.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAttrFromDeletedArt.java
new file mode 100644
index 00000000000..a472815cdb9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpAttrFromDeletedArt.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.framework.ui.skynet.dbHealth;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+public class CleanUpAttrFromDeletedArt extends DatabaseHealthOperation {
+ private static final String INSERT_ATTRS_TO_ART_COMMIT_TRANSACTION =
+ "insert into osee_txs (tx_current, mod_type, transaction_id, gamma_id) select 3, 5, tx1.transaction_id, att1.gamma_id from osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_artifact_version av1, osee_attribute att1 where td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = av1.gamma_id and tx1.tx_current = 2 and tx1.mod_type = 3 and td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = att1.gamma_id and av1.art_id = att1.art_id and tx2.tx_current = 1 and td1.transaction_id <> td2.transaction_id";
+ private static final String UPDATE_OLD_ATTRS_NOT_SAME_TRANSACTION =
+ "update osee_txs set tx_current = 0 where (transaction_id, gamma_id) in (select tx2.transaction_id, tx2.gamma_id from osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_artifact_version av1, osee_attribute att1 where td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = av1.gamma_id and tx1.tx_current = 2 and tx1.mod_type = 3 and td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = att1.gamma_id and av1.art_id = att1.art_id and tx2.tx_current = 1 and td1.transaction_id <> td2.transaction_id)";
+ private static final String UPDATE_OLD_ATTRS_SAME_TRANSACTION =
+ "update osee_txs set tx_current = 3, mod_type = 5 where (transaction_id, gamma_id) in (select tx2.transaction_id, tx2.gamma_id from osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_artifact_version av1, osee_attribute att1 where td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = av1.gamma_id and tx1.tx_current = 2 and tx1.mod_type = 3 and td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = att1.gamma_id and av1.art_id = att1.art_id and tx2.tx_current = 1 and td1.transaction_id = td2.transaction_id)";
+
+ public CleanUpAttrFromDeletedArt() {
+ super("attributes from deleted artifacts");
+ }
+
+ @Override
+ public String getVerifyTaskName() {
+ return Strings.emptyString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ if (isFixOperationEnabled()) {
+ checkForCancelledStatus(monitor);
+ monitor.setTaskName("INSERT_ATTRS_TO_ART_COMMIT_TRANSACTION");
+ ConnectionHandler.runPreparedUpdate(INSERT_ATTRS_TO_ART_COMMIT_TRANSACTION);
+ monitor.worked(calculateWork(0.45));
+ monitor.setTaskName("UPDATE_OLD_ATTRS_NOT_SAME_TRANSACTION");
+ ConnectionHandler.runPreparedUpdate(UPDATE_OLD_ATTRS_NOT_SAME_TRANSACTION);
+ monitor.worked(calculateWork(0.45));
+ monitor.setTaskName("UPDATE_OLD_ATTRS_SAME_TRANSACTION");
+ ConnectionHandler.runPreparedUpdate(UPDATE_OLD_ATTRS_SAME_TRANSACTION);
+ } else {
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.90));
+ }
+ monitor.worked(calculateWork(0.10));
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpBackingData.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpBackingData.java
new file mode 100644
index 00000000000..0c524740e1b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CleanUpBackingData.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.framework.ui.skynet.dbHealth;
+
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * Identifies and removes addressing from the transaction table that no longer addresses other tables.
+ *
+ * @author Theron Virgin
+ */
+public class CleanUpBackingData extends DatabaseHealthOperation {
+
+ private static final String NOT_ADDRESSESED_GAMMAS =
+ HealthHelper.ALL_BACKING_GAMMAS + " %s (SELECT gamma_id FROM osee_txs Union Select rem_gamma_id as gamma_id FROM osee_removed_txs)";
+ private static final String NOT_ADDRESSESED_TRANSACTIONS =
+ "SELECT transaction_id FROM osee_tx_details WHERE tx_type != 1 %s (SELECT transaction_id FROM osee_txs UNION SELECT rem_transaction_id as transaction_id FROM osee_removed_txs UNION SELECT DISTINCT transaction_id FROM osee_removed_txs)";
+ private static final String REMOVE_GAMMAS_ARTIFACT = "DELETE FROM osee_artifact_version WHERE gamma_id = ?";
+ private static final String REMOVE_GAMMAS_ATTRIBUTE = "DELETE FROM osee_attribute WHERE gamma_id = ?";
+ private static final String REMOVE_GAMMAS_RELATIONS = "DELETE FROM osee_relation_link WHERE gamma_id = ?";
+ private static final String REMOVE_NOT_ADDRESSED_TRANSACTIONS =
+ "DELETE FROM osee_tx_details WHERE transaction_id = ?";
+
+ private List<Object[]> gammas = null;
+ private List<Object[]> transactions = null;
+
+ public CleanUpBackingData() {
+ super("Data with no TXS Addressing");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ boolean fix = isFixOperationEnabled();
+ boolean verify = !fix;
+
+ if (verify || gammas == null) {
+ gammas =
+ HealthHelper.runSingleResultQuery(String.format(NOT_ADDRESSESED_GAMMAS,
+ SupportedDatabase.getComplementSql()), "gamma_id");
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (verify || transactions == null) {
+ transactions =
+ HealthHelper.runSingleResultQuery(String.format(NOT_ADDRESSESED_TRANSACTIONS,
+ SupportedDatabase.getComplementSql()), "transaction_id");
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ HealthHelper.displayForCleanUp("Gamma Id", getDetailedReport(), getSummary(), verify, gammas,
+ "'s with no TXS addressing\n");
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ HealthHelper.displayForCleanUp("Transaction Id", getDetailedReport(), getSummary(), verify, transactions,
+ "'s with no TXS addressing\n");
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ int gammaCount = gammas != null ? gammas.size() : 0;
+ int txCount = transactions != null ? transactions.size() : 0;
+ setItemsToFix(txCount + gammaCount);
+
+ if (fix) {
+ ConnectionHandler.runBatchUpdate(REMOVE_GAMMAS_ARTIFACT, gammas);
+ monitor.worked(calculateWork(0.10));
+ ConnectionHandler.runBatchUpdate(REMOVE_GAMMAS_ATTRIBUTE, gammas);
+ monitor.worked(calculateWork(0.10));
+ ConnectionHandler.runBatchUpdate(REMOVE_GAMMAS_RELATIONS, gammas);
+ monitor.worked(calculateWork(0.10));
+ ConnectionHandler.runBatchUpdate(REMOVE_NOT_ADDRESSED_TRANSACTIONS, transactions);
+ monitor.worked(calculateWork(0.10));
+ gammas = null;
+ transactions = null;
+ } else {
+ monitor.worked(calculateWork(0.40));
+ }
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.endMultiColumnTable());
+ }
+ monitor.worked(calculateWork(0.20));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitTransactions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitTransactions.java
new file mode 100644
index 00000000000..b2a2266e3a7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitTransactions.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.framework.ui.skynet.dbHealth;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * Updates commit transactions so new and then modified objects will be committed with a mod type of new. This BLAM
+ * operation also removes attribute from deleted artifacts from committed transactions.
+ *
+ * @author Jeff C. Phillips
+ */
+public class CommitTransactions extends DatabaseHealthOperation {
+ private static final String GET_COMMIT_TRANSACTIONS =
+ "select transaction_id from osee_tx_details where osee_comment like '%Commit%'";
+ private static final String UPDATE_NEW_TRANSACTIONS_TO_CURRENT =
+ "update osee_txs set mod_type = 1 where transaction_id = ? AND mod_type <> 1 AND gamma_id in( select tx1.gamma_id from osee_tx_details td1, osee_txs tx1, osee_artifact_version av1 where td1.transaction_id = ? AND td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = av1.gamma_id AND av1.art_id NOT IN (SELECT av2.art_id FROM osee_tx_details td2, osee_txs tx2, osee_artifact_version av2 where td2.osee_comment like '%Commit%' AND td2.transaction_id < td1.transaction_id AND td2.transaction_id = tx2.transaction_id AND tx2.gamma_id = av2.gamma_id) AND av1.art_id NOT IN (SELECT av3.art_id FROM osee_txs tx3, osee_tx_details td3, osee_artifact_version av3 WHERE td3.branch_id = td1.branch_id AND td3.transaction_id < td1.transaction_id AND td3.transaction_id = tx3.transaction_id AND tx3.mod_type = 1 AND tx3.gamma_id = av3.gamma_id))";
+ private static final String DELETE_ORPHAN_ATTRIBUTES =
+ "delete FROM osee_attribute where gamma_id in (select t3.gamma_id from osee_txs t2, osee_attribute t3 where t2.transaction_id = ? AND t2.gamma_id = t3.gamma_id AND t3.art_id NOT in(SELECT art_id from osee_txs t4, osee_artifact_version t5 WHERE t4.transaction_id = t2.transaction_id AND t4.gamma_id = t5.gamma_id))";
+
+ public CommitTransactions() {
+ super(
+ "commit transactions by deleting orphan attributes and setting new artifacts that have been modified to a mod type of 1");
+ }
+
+ @Override
+ public String getVerifyTaskName() {
+ return Strings.emptyString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ if (isFixOperationEnabled()) {
+ checkForCancelledStatus(monitor);
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_COMMIT_TRANSACTIONS, new Object[0]);
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.50));
+
+ while (chStmt.next()) {
+ int transactionNumber = chStmt.getInt("transaction_id");
+ int updateCount =
+ ConnectionHandler.runPreparedUpdate(UPDATE_NEW_TRANSACTIONS_TO_CURRENT, transactionNumber,
+ transactionNumber);
+ int deleteAttrCount = ConnectionHandler.runPreparedUpdate(DELETE_ORPHAN_ATTRIBUTES, transactionNumber);
+
+ getSummary().append(
+ "For transaction: " + transactionNumber + " Number of update modTypes to 1:" + updateCount + " Number of deleted attrs: " + deleteAttrCount);
+ }
+ } finally {
+ chStmt.close();
+ }
+ } else {
+ monitor.worked(calculateWork(0.50));
+ }
+ monitor.worked(calculateWork(0.50));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitedNewAndDeleted.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitedNewAndDeleted.java
new file mode 100644
index 00000000000..77b2b72f3ba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/CommitedNewAndDeleted.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.dbHealth;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * Identifies and removes addressing from the transaction table that no longer addresses other tables.
+ *
+ * @author Theron Virgin
+ */
+public class CommitedNewAndDeleted extends DatabaseHealthOperation {
+ private class LocalValues {
+ public int relLinkId;
+ public int artId;
+ public int attributeId;
+ public int gammaId;
+ public int transactionId;
+ public int branchId;
+
+ public LocalValues(int artId, int attributeId, int branchId, int gammaId, int relLinkId, int transactionId) {
+ super();
+ this.artId = artId;
+ this.attributeId = attributeId;
+ this.branchId = branchId;
+ this.gammaId = gammaId;
+ this.relLinkId = relLinkId;
+ this.transactionId = transactionId;
+ }
+ }
+ private static final String COMMITTED_NEW_AND_DELETED_ARTIFACTS =
+ "SELECT txs1.gamma_id, txs1.transaction_id, det1.branch_id, art1.art_id, 0 as attr_id, 0 as rel_link_id FROM osee_tx_details det1, osee_txs txs1, osee_artifact_version art1 WHERE txs1.tx_current = " + TxChange.DELETED.getValue() + " AND det1.transaction_id = txs1.transaction_id AND txs1.gamma_id = art1.gamma_id AND NOT EXISTS (SELECT ('x') FROM osee_tx_details det2, osee_txs txs2, osee_artifact_version art2 WHERE txs2.mod_type != " + ModificationType.DELETED.getValue() + " AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = art2.gamma_id AND art2.art_id = art1.art_id)";
+ private static final String COMMITTED_NEW_AND_DELETED_ATTRIBUTES =
+ "SELECT txs1.gamma_id, txs1.transaction_id, det1.branch_id, 0 as art_id, att1.attr_id, 0 as rel_link_id FROM osee_tx_details det1, osee_txs txs1, osee_attribute att1, osee_branch brn WHERE txs1.tx_current = " + TxChange.DELETED.getValue() + " AND det1.transaction_id = txs1.transaction_id AND txs1.gamma_id = att1.gamma_id AND det1.branch_id = brn.branch_id AND brn.branch_type != " + BranchType.MERGE.getValue() + " AND NOT EXISTS (SELECT ('x') FROM osee_tx_details det2, osee_txs txs2, osee_attribute att2 WHERE txs2.mod_type != " + ModificationType.DELETED.getValue() + " AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = att2.gamma_id AND att2.attr_id = att1.attr_id)";
+ private static final String COMMITTED_NEW_AND_DELETED_RELATIONS =
+ "SELECT txs1.gamma_id, txs1.transaction_id, det1.branch_id, 0 as art_id, 0 as attr_id, rel1.rel_link_id FROM osee_tx_details det1, osee_txs txs1, osee_relation_link rel1 WHERE txs1.tx_current = " + TxChange.DELETED.getValue() + " AND det1.transaction_id = txs1.transaction_id AND txs1.gamma_id = rel1.gamma_id AND NOT EXISTS (SELECT ('x') FROM osee_tx_details det2, osee_txs txs2, osee_relation_link rel2 WHERE txs2.mod_type != " + ModificationType.DELETED.getValue() + " AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = rel2.gamma_id AND rel2.rel_link_id = rel1.rel_link_id)";
+ private static final String REMOVE_NOT_ADDRESSED_GAMMAS =
+ "DELETE FROM osee_txs WHERE gamma_id = ? AND transaction_id = ?";
+
+ private static final String[] COLUMN_HEADER =
+ {"Gamma Id", "Transaction Id", "Branch Id", "Art id", "Attribute Id", "Rel Link Id"};
+
+ private Set<LocalValues> addressing = null;
+
+ public CommitedNewAndDeleted() {
+ super("Artifacts, Relation, Attributes that were Introduced on a Branch as Deleted");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ boolean fix = isFixOperationEnabled();
+ boolean verify = !fix;
+
+ if (verify || addressing == null) {
+ addressing = new HashSet<LocalValues>();
+ monitor.subTask("Loading Artifacts that were Introduced as Deleted");
+ loadData(COMMITTED_NEW_AND_DELETED_ARTIFACTS);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+
+ monitor.subTask("Loading Attributes that were Introduced as Deleted");
+ loadData(COMMITTED_NEW_AND_DELETED_ATTRIBUTES);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+
+ monitor.subTask("Loading Relation Links that were Introduced as Deleted");
+ loadData(COMMITTED_NEW_AND_DELETED_RELATIONS);
+ } else {
+ monitor.worked(calculateWork(0.40));
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addRowMultiColumnTable(COLUMN_HEADER));
+ displayData(sbFull, getSummary(), verify);
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ setItemsToFix(addressing != null ? addressing.size() : 0);
+
+ if (fix) {
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (LocalValues value : addressing) {
+ insertParameters.add(new Object[] {value.gammaId, value.transactionId});
+ }
+ if (insertParameters.size() > 0) {
+ ConnectionHandler.runBatchUpdate(REMOVE_NOT_ADDRESSED_GAMMAS, insertParameters);
+ }
+ monitor.worked(calculateWork(0.30));
+ addressing = null;
+ } else {
+ monitor.worked(calculateWork(0.30));
+ }
+
+ if (isShowDetailsEnabled()) {
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report(getVerifyTaskName(), Manipulations.RAW_HTML);
+ }
+ monitor.worked(calculateWork(0.10));
+ }
+
+ private void displayData(StringBuffer sbFull, Appendable builder, boolean verify) throws IOException {
+ int attributeCount = 0, artifactCount = 0, relLinkCount = 0;
+ for (LocalValues value : addressing) {
+ if (value.artId != 0) {
+ artifactCount++;
+ }
+ if (value.attributeId != 0) {
+ attributeCount++;
+ }
+ if (value.relLinkId != 0) {
+ relLinkCount++;
+ }
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {String.valueOf(value.gammaId),
+ String.valueOf(value.transactionId), String.valueOf(value.branchId), String.valueOf(value.artId),
+ String.valueOf(value.attributeId), String.valueOf(value.relLinkId)}));
+ }
+ builder.append(verify ? "Found " : "Fixed ");
+ builder.append(String.valueOf(artifactCount));
+ builder.append(" Artifacts that were Introduced as Deleted\n");
+ builder.append(verify ? "Found " : "Fixed ");
+ builder.append(String.valueOf(attributeCount));
+ builder.append(" Attributes that were Introduced as Deleted\n");
+ builder.append(verify ? "Found " : "Fixed ");
+ builder.append(String.valueOf(relLinkCount));
+ builder.append(" Relation Links that were Introduced as Deleted\n");
+ }
+
+ //LocalValues(int artId, int attributeId, int branchId, int gammaId, int relLinkId, int transactionId)
+ private void loadData(String sql) throws OseeCoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(sql);
+ while (chStmt.next()) {
+ addressing.add(new LocalValues(chStmt.getInt("art_id"), chStmt.getInt("attr_id"),
+ chStmt.getInt("branch_id"), chStmt.getInt("gamma_id"), chStmt.getInt("rel_link_id"),
+ chStmt.getInt("transaction_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOperation.java
new file mode 100644
index 00000000000..0a8a4c29b0e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOperation.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.framework.ui.skynet.dbHealth;
+
+import java.io.IOException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ * @author Jeff C. Phillips
+ */
+public abstract class DatabaseHealthOperation extends AbstractOperation {
+
+ private boolean isFixOperationEnabled;
+ private boolean isShowDetailsEnabled;
+ private int itemToFixCount;
+
+ private Appendable appendableBuffer;
+ private final Appendable detailedReport;
+
+ public DatabaseHealthOperation(String operationName) {
+ super(operationName, SkynetGuiPlugin.PLUGIN_ID);
+ this.isFixOperationEnabled = false;
+ this.isShowDetailsEnabled = false;
+ this.appendableBuffer = new StringBuilder();
+ this.detailedReport = new StringBuilder();
+ this.itemToFixCount = 0;
+ }
+
+ @Override
+ public String getName() {
+ return isFixOperationEnabled() ? getFixTaskName() : getVerifyTaskName();
+ }
+
+ public String getVerifyTaskName() {
+ return String.format("Check for %s", super.getName());
+ }
+
+ public String getFixTaskName() {
+ return String.format("Fix %s", super.getName());
+ }
+
+ public void setFixOperationEnabled(boolean isFixOperationEnabled) {
+ this.isFixOperationEnabled = isFixOperationEnabled;
+ }
+
+ public boolean isFixOperationEnabled() {
+ return isFixOperationEnabled;
+ }
+
+ public void setShowDetailsEnabled(boolean isShowDetailsEnabled) {
+ this.isShowDetailsEnabled = isShowDetailsEnabled;
+ }
+
+ public boolean isShowDetailsEnabled() {
+ return isShowDetailsEnabled;
+ }
+
+ public void setSummary(Appendable appendableBuffer) {
+ this.appendableBuffer = appendableBuffer;
+ }
+
+ public Appendable getSummary() {
+ return appendableBuffer;
+ }
+
+ public void appendToDetails(String value) throws IOException {
+ getDetailedReport().append(value);
+ }
+
+ public Appendable getDetailedReport() {
+ return detailedReport;
+ }
+
+ protected void setItemsToFix(int value) {
+ this.itemToFixCount = value;
+ }
+
+ public boolean hadItemsToFix() {
+ return getItemsToFixCount() > 0;
+ }
+
+ public int getItemsToFixCount() {
+ return itemToFixCount;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected final void doWork(IProgressMonitor monitor) throws Exception {
+ setItemsToFix(0);
+ // monitor.beginTask(isFixOperationEnabled() ? getFixTaskName() : getVerifyTaskName(), getTotalWorkUnits());
+ // try {
+ doHealthCheck(monitor);
+ // } finally {
+ // monitor.done();
+ // }
+ }
+
+ protected abstract void doHealthCheck(IProgressMonitor monitor) throws Exception;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOpsExtensionManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOpsExtensionManager.java
new file mode 100644
index 00000000000..4d28619f189
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DatabaseHealthOpsExtensionManager.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.framework.ui.skynet.dbHealth;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DatabaseHealthOpsExtensionManager {
+ private static final String EXTENSION_ELEMENT = "DatabaseHealthOperation";
+ private static final String CLASS_ATTRIBUTE_NAME = "className";
+ private static final String EXTENSION_POINT = SkynetGuiPlugin.PLUGIN_ID + "." + EXTENSION_ELEMENT;
+
+ private static final Map<String, DatabaseHealthOperation> fixOps = new TreeMap<String, DatabaseHealthOperation>();
+ private static final Map<String, DatabaseHealthOperation> verifyOps = new TreeMap<String, DatabaseHealthOperation>();
+
+ private DatabaseHealthOpsExtensionManager() {
+ }
+
+ public static Set<String> getFixOperationNames() {
+ return getOperationNames(true);
+ }
+
+ public static Set<String> getVerifyOperationNames() {
+ return getOperationNames(false);
+ }
+
+ private static Set<String> getOperationNames(boolean isFix) {
+ checkExtensionsLoaded();
+ return isFix ? fixOps.keySet() : verifyOps.keySet();
+ }
+
+ public static DatabaseHealthOperation getFixOperationByName(String name) {
+ return getOperationByName(name, true);
+ }
+
+ public static DatabaseHealthOperation getVerifyOperationByName(String name) {
+ return getOperationByName(name, false);
+ }
+
+ private static DatabaseHealthOperation getOperationByName(String name, boolean isFix) {
+ checkExtensionsLoaded();
+ return isFix ? fixOps.get(name) : verifyOps.get(name);
+ }
+
+ private static void checkExtensionsLoaded() {
+ ExtensionDefinedObjects<DatabaseHealthOperation> extensionDefinedObjects =
+ new ExtensionDefinedObjects<DatabaseHealthOperation>(EXTENSION_POINT, EXTENSION_ELEMENT,
+ CLASS_ATTRIBUTE_NAME);
+ for (DatabaseHealthOperation operation : extensionDefinedObjects.getObjects()) {
+ if (Strings.isValid(operation.getVerifyTaskName())) {
+ verifyOps.put(operation.getVerifyTaskName(), operation);
+ }
+ if (Strings.isValid(operation.getFixTaskName())) {
+ fixOps.put(operation.getFixTaskName(), operation);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateAttributes.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateAttributes.java
new file mode 100644
index 00000000000..06a7babff52
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateAttributes.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.framework.ui.skynet.dbHealth;
+
+import java.util.LinkedList;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Theron Virgin
+ */
+public class DuplicateAttributes extends DatabaseHealthOperation {
+ private class DuplicateAttribute {
+ protected int artId;
+ protected int attrId1;
+ protected int attrId2;
+ protected String name;
+ protected String value1;
+ protected String value2;
+ protected String uri1;
+ protected String uri2;
+ protected int gamma1;
+ protected int gamma2;
+ protected int attrIDToDelete = 0;
+ protected LinkedList<Integer> branches1 = new LinkedList<Integer>();
+ protected LinkedList<Integer> branches2 = new LinkedList<Integer>();
+ }
+
+ private static final String GET_DUPLICATE_ATTRIBUTES =
+ "SELECT attr1.art_id, aty1.NAME, attr1.attr_id as attr_id_1, attr2.attr_id as attr_id_2, attr1.value as value_1, attr2.value as value_2, attr1.uri as uri_1, attr2.uri as uri_2, attr1.gamma_id as gamma_id_1, attr2.gamma_id as gamma_id_2 FROM osee_attribute attr1, osee_attribute attr2, osee_attribute_type aty1 WHERE attr1.art_id = attr2.art_id AND attr1.attr_id < attr2.attr_id AND attr1.attr_type_id = attr2.attr_type_id AND attr1.attr_type_id = aty1.attr_type_id AND aty1.max_occurence = 1 AND EXISTS (SELECT 'x' FROM osee_txs txs1 WHERE txs1.gamma_id = attr1.gamma_id AND tx_current = 1) AND EXISTS (SELECT 'x' FROM osee_txs txs2 WHERE txs2.gamma_id = attr2.gamma_id and tx_current = 1) order by aty1.NAME, attr1.art_id";
+
+ private static final String BRANCHES_WITH_ONLY_ATTR =
+ "SELECT DISTINCT branch_id FROM osee_tx_details det WHERE EXISTS (SELECT 'x' FROM osee_txs txs, osee_attribute att WHERE det.transaction_id = txs.transaction_id AND txs.gamma_id = att.gamma_id AND att.attr_id = ?) %s (SELECT DISTINCT branch_id FROM osee_tx_details det WHERE EXISTS (SELECT 'x' FROM osee_txs txs, osee_attribute att WHERE det.transaction_id = txs.transaction_id AND txs.gamma_id = att.gamma_id AND att.attr_id = ?))";
+
+ private static final String DELETE_ATTR = "DELETE FROM osee_attribute WHERE attr_id = ?";
+
+ private static final String FILTER_DELTED =
+ "SELECT * FROM osee_txs txs, osee_attribute atr WHERE txs.tx_current = 1 AND txs.gamma_id = atr.gamma_id AND atr.attr_id = ?";
+
+ boolean fixErrors = false;
+ boolean processTxCurrent = true;
+
+ public DuplicateAttributes() {
+ super("Duplicate Attribute Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ LinkedList<DuplicateAttribute> sameValues = new LinkedList<DuplicateAttribute>();
+ LinkedList<DuplicateAttribute> diffValues = new LinkedList<DuplicateAttribute>();
+
+ ConnectionHandlerStatement chStmt1 = new ConnectionHandlerStatement();
+ fixErrors = isFixOperationEnabled();
+ //--- Test's for two attributes that are on the same artifact but have different attr_ids, when ---//
+ //--- the attribute type has a maximum of 1 allowable attributes. ---------------------------------//
+
+ monitor.subTask("Querying for Duplicate Attributes");
+ checkForCancelledStatus(monitor);
+ try {
+ chStmt1.runPreparedQuery(GET_DUPLICATE_ATTRIBUTES);
+ monitor.worked(6);
+ monitor.subTask("Processing Results");
+ checkForCancelledStatus(monitor);
+ while (chStmt1.next()) {
+ ConnectionHandlerStatement chStmt2 = new ConnectionHandlerStatement();
+ try {
+ if (ConnectionHandler.runPreparedQueryFetchInt(-1, FILTER_DELTED, chStmt1.getInt("attr_id_1")) != -1) {
+ chStmt2.runPreparedQuery(FILTER_DELTED, chStmt1.getInt("attr_id_2"));
+ if (chStmt2.next()) {
+ DuplicateAttribute duplicateAttribute;
+ duplicateAttribute = new DuplicateAttribute();
+ duplicateAttribute.artId = chStmt1.getInt("art_id");
+ duplicateAttribute.attrId1 = chStmt1.getInt("attr_id_1");
+ duplicateAttribute.attrId2 = chStmt1.getInt("attr_id_2");
+ duplicateAttribute.name = chStmt1.getString("name");
+ duplicateAttribute.value1 = chStmt1.getString("value_1");
+ duplicateAttribute.value2 = chStmt1.getString("value_2");
+ duplicateAttribute.uri1 = chStmt1.getString("uri_1");
+ duplicateAttribute.uri2 = chStmt1.getString("uri_2");
+ duplicateAttribute.gamma1 = chStmt1.getInt("gamma_id_1");
+ duplicateAttribute.gamma2 = chStmt1.getInt("gamma_id_2");
+
+ if (duplicateAttribute.value1 != null && duplicateAttribute.value2 != null && duplicateAttribute.value1.equals(duplicateAttribute.value2) || duplicateAttribute.uri1 != null && duplicateAttribute.uri2 != null && duplicateAttribute.uri1.equals(duplicateAttribute.uri2) || duplicateAttribute.value1 == null && duplicateAttribute.value2 == null && duplicateAttribute.uri1 == null && duplicateAttribute.uri2 == null) {
+ sameValues.add(duplicateAttribute);
+ } else {
+ diffValues.add(duplicateAttribute);
+ }
+ }
+ }
+ } finally {
+ chStmt2.close();
+ }
+ }
+ } finally {
+ chStmt1.close();
+ }
+
+ monitor.worked(2);
+ monitor.subTask("Cleaning Up Attrinbutes");
+ checkForCancelledStatus(monitor);
+ if (sameValues.isEmpty() && diffValues.isEmpty()) {
+ getSummary().append("No Duplicate Attributes Found\n");
+ } else {
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ try {
+ String[] columnHeaders =
+ new String[] {"Art Id", "Attr id 1", "Attr id 2", "Name", "Value 1", "Value 2", "URI 1", "URI 2",
+ "Gamma ID 1", "Gamma Id 2", "ID to Delete"};
+ sbFull.append(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ sbFull.append(AHTML.addRowSpanMultiColumnTable("Attributes with the same values", columnHeaders.length));
+ int count = showAttributeCleanUpDecisions(sameValues, fixErrors, sbFull, isShowDetailsEnabled());
+ sbFull.append(AHTML.addRowSpanMultiColumnTable("Attributes with different values", columnHeaders.length));
+ count += showAttributeCleanUpDecisions(diffValues, false, sbFull, isShowDetailsEnabled());
+ getSummary().append(String.format("Found %d duplicate attributes\n", count));
+ } finally {
+ if (isShowDetailsEnabled()) {
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report(getVerifyTaskName(), Manipulations.RAW_HTML);
+ }
+
+ }
+ }
+
+ }
+
+ protected void showText(DuplicateAttribute duplicate, int x, boolean removeAttribute, StringBuffer builder) {
+ String str =
+ AHTML.addRowMultiColumnTable(new String[] {String.valueOf(duplicate.artId),
+ String.valueOf(duplicate.attrId1), String.valueOf(duplicate.attrId2), duplicate.name,
+ duplicate.value1, duplicate.value2, duplicate.uri1, duplicate.uri2, String.valueOf(duplicate.gamma1),
+ String.valueOf(duplicate.gamma2),
+ removeAttribute ? String.valueOf(duplicate.attrIDToDelete) : "Requires Hand Analysis"});
+ builder.append(str);
+ }
+
+ private int showAttributeCleanUpDecisions(LinkedList<DuplicateAttribute> values, boolean removeAttribute, StringBuffer builder, boolean showDetails) throws OseeDataStoreException {
+ int x = 0;
+ if (showDetails) {
+
+ }
+
+ for (DuplicateAttribute loopDuplicate : values) {
+ findProminentAttribute(loopDuplicate.attrId1, loopDuplicate.attrId2, loopDuplicate.branches1);
+ findProminentAttribute(loopDuplicate.attrId2, loopDuplicate.attrId1, loopDuplicate.branches2);
+
+ if (loopDuplicate.branches1.size() == 0) {
+ loopDuplicate.attrIDToDelete = loopDuplicate.attrId1;
+ } else if (loopDuplicate.branches2.size() == 0) {
+ loopDuplicate.attrIDToDelete = loopDuplicate.attrId2;
+ }
+
+ if (loopDuplicate.attrIDToDelete != 0 && removeAttribute) {
+ ConnectionHandler.runPreparedUpdate(DELETE_ATTR, loopDuplicate.attrIDToDelete);
+ }
+ if (showDetails) {
+ showText(loopDuplicate, x++, removeAttribute, builder);
+ }
+ }
+ return x;
+ }
+
+ //--- Find out if there is an attribute that is on every branch that has either one of the attributes ---//
+ private void findProminentAttribute(int attrId1, int attrId2, LinkedList<Integer> branches) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(String.format(BRANCHES_WITH_ONLY_ATTR, SupportedDatabase.getComplementSql()), attrId1,
+ attrId2);
+ while (chStmt.next()) {
+ branches.add(new Integer(chStmt.getInt("branch_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateHRID.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateHRID.java
new file mode 100644
index 00000000000..e2aec6c3784
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateHRID.java
@@ -0,0 +1,154 @@
+/*
+ * Created on Jun 8, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.dbHealth;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+
+/**
+ * @author Megumi Telles
+ */
+public class DuplicateHRID extends DatabaseHealthOperation {
+
+ private class ArtifactData {
+ protected String guid;
+ protected String hrid;
+ protected String artTypeName;
+ }
+
+ private class DuplicateHridSorter implements Comparator<ArtifactData> {
+ public DuplicateHridSorter() {
+ super();
+ }
+
+ @Override
+ public int compare(ArtifactData o1, ArtifactData o2) {
+ if (o1 == null || o2 == null) {
+ return 0;
+ }
+ String str1 = o1.hrid;
+ String str2 = o2.hrid;
+ if (str1 == null || str2 == null) {
+ return 0;
+ }
+ return str1.compareTo(str2);
+ }
+ }
+
+ private static final String GET_DUPLICATE_HRIDS =
+ "SELECT t1.guid, t1.human_readable_id, t3.name FROM osee_artifact t1, osee_artifact_type t3 WHERE t1.human_readable_id IN (SELECT t2.human_readable_id FROM osee_artifact t2 GROUP BY t2.human_readable_id HAVING COUNT(t2.human_readable_id) > 1) AND t3.art_type_id = t1.art_type_id ORDER BY t1.human_readable_id";
+
+ private static final String COUNT_ATTRIBUTE_VALUES_CONTAINING =
+ "SELECT count(1) from osee_attribute where value like ?";
+ private static final String COUNT_COMMENTS_CONTAINING =
+ "SELECT count(1) from osee_tx_details where osee_comment like ?";
+ private static final String COUNT_BRANCH_NAMES_CONTAINING =
+ "SELECT count(1) from osee_branch where branch_name like ?";
+
+ // private static final String FIX_HRID = "UPDATE osee_artifact set human_readable_id=? where guid=?";
+
+ public DuplicateHRID() {
+ super("Duplicate HRID Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#getFixTaskName()
+ */
+ @Override
+ public String getFixTaskName() {
+ return Strings.emptyString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ monitor.subTask("Querying for Duplicate Human Readable Ids");
+ List<ArtifactData> diffValues = getDuplicateHRIDArtifacts(monitor);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+
+ if (isShowDetailsEnabled()) {
+ displayReport(monitor, diffValues, 0.20);
+ } else {
+ monitor.worked(calculateWork(0.20));
+ }
+
+ checkForCancelledStatus(monitor);
+ if (isFixOperationEnabled()) {
+ // monitor.worked(calculateWork(0.50));
+ } else {
+ monitor.worked(calculateWork(0.50));
+ }
+
+ getSummary().append(String.format("[%s] Duplicate Human Readable Ids found\n", diffValues.size()));
+ monitor.worked(calculateWork(0.10));
+ }
+
+ private void displayReport(IProgressMonitor monitor, List<ArtifactData> duplicateHrids, double percentage) throws OseeCoreException {
+ XResultData rd = new XResultData();
+ try {
+ String[] columnHeaders =
+ new String[] {"GUID", "HRID", "Artifact Type", "Attribute Hits", "Branch Hits", "Comment Hits"};
+ rd.addRaw(AHTML.beginMultiColumnTable(100, 1));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+
+ int totalAmount = calculateWork(percentage);
+ if (!duplicateHrids.isEmpty()) {
+ int stepAmount = totalAmount / duplicateHrids.size();
+ for (ArtifactData dup : duplicateHrids) {
+ checkForCancelledStatus(monitor);
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {dup.guid, dup.hrid, dup.artTypeName,
+ String.valueOf(getAdditionalCounts(COUNT_ATTRIBUTE_VALUES_CONTAINING, dup.hrid)),
+ String.valueOf(getAdditionalCounts(COUNT_COMMENTS_CONTAINING, dup.hrid)),
+ String.valueOf(getAdditionalCounts(COUNT_BRANCH_NAMES_CONTAINING, dup.hrid))}));
+ monitor.worked(stepAmount);
+ }
+ } else {
+ monitor.worked(totalAmount);
+ }
+ rd.addRaw(AHTML.endMultiColumnTable());
+
+ } finally {
+ rd.report(getName());
+ }
+ }
+
+ private List<ArtifactData> getDuplicateHRIDArtifacts(IProgressMonitor monitor) throws OseeDataStoreException {
+ List<ArtifactData> duplicateItems = new LinkedList<ArtifactData>();
+ ConnectionHandlerStatement chStmt1 = new ConnectionHandlerStatement();
+ try {
+ chStmt1.runPreparedQuery(GET_DUPLICATE_HRIDS);
+ while (chStmt1.next()) {
+ checkForCancelledStatus(monitor);
+ ArtifactData duplicateHrid = new ArtifactData();
+ duplicateHrid.guid = chStmt1.getString("guid");
+ duplicateHrid.hrid = chStmt1.getString("human_readable_id");
+ duplicateHrid.artTypeName = chStmt1.getString("name");
+ duplicateItems.add(duplicateHrid);
+ }
+ Collections.sort(duplicateItems, new DuplicateHridSorter());
+ } finally {
+ chStmt1.close();
+ }
+ return duplicateItems;
+ }
+
+ private String getAdditionalCounts(String query, String hrid) throws OseeDataStoreException {
+ return String.valueOf(ConnectionHandler.runPreparedQueryFetchInt(-1, query, new Object[] {"%" + hrid + "%"}));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateRelationCheck.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateRelationCheck.java
new file mode 100644
index 00000000000..3ea350a1a4a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/DuplicateRelationCheck.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.framework.ui.skynet.dbHealth;
+
+import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Theron Virgin
+ */
+public class DuplicateRelationCheck extends DatabaseHealthOperation {
+ private class LocalRelationLink {
+ public int relLinkId1;
+ public int relLinkId2;
+ public int transactionId1;
+ public int transactionId2;
+ public int gammaId1;
+ public int gammaId2;
+ public int branchId;
+ public String branch;
+ public int parentArtId1;
+ public int parentArtId2;
+ public int childArtId;
+ public String parentArt1;
+ public String parentArt2;
+ public String childArt;
+ public Timestamp time1;
+ public Timestamp time2;
+ public int archived;
+ public boolean deleteByTimeStamp;
+ public String author1;
+ public String author2;
+
+ public LocalRelationLink(int branchId, int childArtId, int gammaId1, int gammaId2, int parentArtId1, int parentArtId2, int relLinkId1, int relLinkId2, Timestamp time1, Timestamp time2, int transactionId1, int transactionId2, int archived) {
+ super();
+ this.branchId = branchId;
+ this.childArtId = childArtId;
+ this.gammaId1 = gammaId1;
+ this.gammaId2 = gammaId2;
+ this.parentArtId1 = parentArtId1;
+ this.parentArtId2 = parentArtId2;
+ this.relLinkId1 = relLinkId1;
+ this.relLinkId2 = relLinkId2;
+ this.time1 = time1;
+ this.time2 = time2;
+ this.transactionId1 = transactionId1;
+ this.transactionId2 = transactionId2;
+ this.archived = archived;
+ this.deleteByTimeStamp = true;
+ author1 = "";
+ author2 = "";
+ }
+ }
+
+ private static final String GET_DUPLICATE_DEFAULT_HIER_LINKS =
+ "SELECT rel1.rel_link_id as Link_ID_1, rel2.rel_link_id as Link_ID_2, rel1.a_art_id As Parent_Id_1, rel2.a_art_id As Parent_Id_2, rel2.b_art_id As Child_ID, det1.branch_id, det1.time as Time_1 , det2.time as Time_2, bra.archived, txs1.gamma_id as Gamma1, txs2.gamma_id as Gamma2, txs1.transaction_id as transaction_1, txs2.transaction_id as transaction_2 FROM osee_branch bra, osee_relation_link rel1, osee_relation_link rel2, osee_txs txs1, osee_txs txs2, osee_tx_details det1, osee_tx_details det2, osee_relation_link_type typ where typ.type_name = 'Default Hierarchical' AND rel1.rel_link_type_id = typ.rel_link_type_id AND rel2.rel_link_type_id = typ.rel_link_type_id AND rel1.a_art_id < rel2.a_art_id AND rel1.b_art_id = rel2.b_art_id AND rel1.gamma_id = txs1.gamma_id AND txs1.tx_current = 1 AND txs2.tx_current = 1 AND txs1.transaction_id = det1.transaction_id AND det1.branch_id = det2.branch_id AND det2.transaction_id = txs2.transaction_id AND txs2.gamma_id = rel2.gamma_id AND bra.branch_id = det1.branch_id order by rel1.b_art_id, txs1.transaction_id";
+
+ // private static final String DELETE_LINKS =
+ // "UPDATE osee_txs set tx_current = 2, mod_type = 3 WHERE transaction_id = ? AND gamma_id = ?";
+
+ private static final String GET_AUTHOR =
+ "Select attr.Value FROM osee_attribute attr, osee_tx_details det, osee_attribute_type typ, osee_txs txs WHERE det.transaction_id = ? AND det.author = attr.art_id AND attr.attr_type_id = typ.attr_type_id AND typ.name = 'Name' AND attr.gamma_id = txs.gamma_id and txs.tx_current = 1";
+
+ private static final String GET_ARTIFACT_NAME =
+ "Select attr.Value FROM osee_attribute attr, osee_attribute_type typ, osee_txs txs WHERE attr.art_id = ? AND attr.attr_type_id = typ.attr_type_id AND typ.name = 'Name' AND attr.gamma_id = txs.gamma_id and txs.tx_current = 1";
+
+ private static final String GET_BRANCH_NAME = "Select branch_name from osee_branch where branch_id = ?";
+
+ private static final String[] columnHeaders =
+ new String[] {"Rel Link ID 1", "Rel Link ID 2", "Parent Art ID 1", "P1 Art Name", "Parent Art ID 2",
+ "P2 Art Name", "Child Art ID", "Child Art Name", "Branch Ids", "Branch Name", "Archived", "Author 1",
+ "Author 2"};
+
+ private static final String HEADER = "Artifacts that have multiple Parents";
+
+ private List<LocalRelationLink> relations = null;
+
+ public DuplicateRelationCheck() {
+ super("Multiple Parent Errors");
+ }
+
+ @Override
+ public String getFixTaskName() {
+ return Strings.emptyString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ if (relations == null) {
+ relations = new LinkedList<LocalRelationLink>();
+ monitor.subTask("Finding Artifacts with Multiple Parents");
+ loadData();
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+
+ Map<Integer, List<Integer>> branches = new HashMap<Integer, List<Integer>>();
+ if (isShowDetailsEnabled()) {
+ createAndDisplayReport(monitor, !isFixOperationEnabled(), branches);
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+
+ setItemsToFix(relations != null ? relations.size() : 0);
+
+ int numberDeleted = 0;
+ if (isFixOperationEnabled()) {
+ // List<Integer> linksToDelete = new LinkedList<Integer>();
+ // for (LocalRelationLink link : relations) {
+ // if (!link.time1.equals(link.time2)) {
+ // boolean deleteFirst = link.time1.before(link.time2);
+ // numberDeleted +=
+ // ConnectionHandler.runPreparedUpdate(DELETE_LINKS,
+ // deleteFirst ? link.transactionId1 : link.transactionId2,
+ // deleteFirst ? link.gammaId1 : link.gammaId2);
+ // linksToDelete.add(deleteFirst ? link.relLinkId1 : link.relLinkId2);
+ // }
+ // }
+ // monitor.worked(calculateWork(0.25));
+ // for (LocalRelationLink link : relations) {
+ // if (link.time1.equals(link.time2)) {
+ // int toDelete = 0;
+ // for (Integer integer : linksToDelete) {
+ // if (integer.intValue() == link.relLinkId1) {
+ // toDelete = 1;
+ // } else if (integer.intValue() == link.relLinkId2) {
+ // toDelete = 2;
+ // }
+ // }
+ // if (toDelete == 0) {
+ // link.deleteByTimeStamp = false;
+ // toDelete = link.gammaId1 < link.gammaId2 ? 1 : 2;
+ // }
+ // boolean deleteFirst = toDelete == 1;
+ // numberDeleted +=
+ // ConnectionHandler.runPreparedUpdate(DELETE_LINKS,
+ // deleteFirst ? link.transactionId1 : link.transactionId2,
+ // deleteFirst ? link.gammaId1 : link.gammaId2);
+ // }
+ // }
+ // relations = null;
+ // monitor.worked(calculateWork(0.25));
+ } else {
+ monitor.worked(calculateWork(0.50));
+ }
+
+ getSummary().append(
+ String.format("%s %d Artifacts with multiple Parents on %d total branches : Updated %d txs Entries\n",
+ isFixOperationEnabled() ? "Fixed" : "Found", branches.size(), relations.size(), numberDeleted));
+ monitor.worked(calculateWork(0.10));
+ }
+
+ private void createAndDisplayReport(IProgressMonitor monitor, boolean isVerify, Map<Integer, List<Integer>> branches) throws OseeCoreException {
+ List<Integer> linksfound = new LinkedList<Integer>();
+ monitor.subTask("Finding Authors");
+ for (LocalRelationLink link : relations) {
+ List<Integer> branchs = branches.get(link.relLinkId1);
+ if (branchs == null) {
+ branchs = new LinkedList<Integer>();
+ branches.put(link.relLinkId1, branchs);
+ }
+ branchs.add(link.branchId);
+ if (!link.time1.equals(link.time2)) {
+ linksfound.add(link.relLinkId1);
+ linksfound.add(link.relLinkId2);
+ setAuthors(link);
+ setData(link);
+ }
+ }
+ for (LocalRelationLink link : relations) {
+ if (link.time1.equals(link.time2)) {
+ if (!(linksfound.contains(link.relLinkId1) && linksfound.contains(link.relLinkId2))) {
+ link.author1 = "baseline not found";
+ link.author2 = "baseline not found";
+ setData(link);
+ linksfound.add(link.relLinkId1);
+ linksfound.add(link.relLinkId2);
+ }
+
+ }
+ }
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ displayData(sbFull, getSummary(), isVerify, false, branches);
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report(getVerifyTaskName(), Manipulations.RAW_HTML);
+
+ sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ displayData(sbFull, getSummary(), isVerify, true, branches);
+ sbFull.append(AHTML.endMultiColumnTable());
+ rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report(getVerifyTaskName() + " Verbose", Manipulations.RAW_HTML);
+ }
+
+ //{"Rel Link ID 1", "Rel Link ID 2", "Parent Art ID 1", "Parent Art ID 2", "Child Art ID",
+ // "Branch_id", "Archived"};
+ private void displayData(StringBuffer sbFull, Appendable builder, boolean verify, boolean displayAll, Map<Integer, List<Integer>> branches) {
+ int count = 0;
+ sbFull.append(AHTML.addRowSpanMultiColumnTable(HEADER, columnHeaders.length));
+ for (LocalRelationLink relLink : relations) {
+ if (!relLink.author1.equals("")) {
+ count++;
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {Integer.toString(relLink.relLinkId1),
+ Integer.toString(relLink.relLinkId2), Integer.toString(relLink.parentArtId1), relLink.parentArt1,
+ Integer.toString(relLink.parentArtId2), relLink.parentArt2, Integer.toString(relLink.childArtId),
+ relLink.childArt,
+ displayAll ? branches.get(relLink.relLinkId1).toString() : Integer.toString(relLink.branchId),
+ relLink.branch, Integer.toString(relLink.archived), relLink.author1, relLink.author2}));
+ }
+ }
+ }
+
+ //public LocalRelationLink(int branchId, int childArtId, int gammaId1, int gammaId2, int parentArtId1, int parentArtId2,
+ //int relLinkId1, int relLinkId2, Timestamp time1, Timestamp time2, int transactionId1, int transactionId2) {
+
+ private void loadData() throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_DUPLICATE_DEFAULT_HIER_LINKS);
+ while (chStmt.next()) {
+ relations.add(new LocalRelationLink(chStmt.getInt("branch_id"), chStmt.getInt("child_id"),
+ chStmt.getInt("gamma1"), chStmt.getInt("gamma2"), chStmt.getInt("parent_id_1"),
+ chStmt.getInt("parent_id_2"), chStmt.getInt("link_id_1"), chStmt.getInt("link_id_2"),
+ chStmt.getTimestamp("time_1"), chStmt.getTimestamp("time_2"), chStmt.getInt("transaction_1"),
+ chStmt.getInt("transaction_2"), chStmt.getInt("archived")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void setAuthors(LocalRelationLink link) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_AUTHOR, link.transactionId1);
+ if (chStmt.next()) {
+ link.author1 = chStmt.getString("value");
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(GET_AUTHOR, link.transactionId2);
+ if (chStmt.next()) {
+ link.author2 = chStmt.getString("value");
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+ private void setData(LocalRelationLink link) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ARTIFACT_NAME, link.parentArtId1);
+ if (chStmt.next()) {
+ link.parentArt1 = chStmt.getString("value");
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(GET_ARTIFACT_NAME, link.parentArtId2);
+ if (chStmt.next()) {
+ link.parentArt2 = chStmt.getString("value");
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(GET_ARTIFACT_NAME, link.childArtId);
+ if (chStmt.next()) {
+ link.childArt = chStmt.getString("value");
+ }
+ } finally {
+ chStmt.close();
+ }
+ try {
+ chStmt.runPreparedQuery(GET_BRANCH_NAME, link.branchId);
+ if (chStmt.next()) {
+ link.branch = chStmt.getString("branch_name");
+ }
+
+ } finally {
+ chStmt.close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/HealthHelper.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/HealthHelper.java
new file mode 100644
index 00000000000..c078231c3b4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/HealthHelper.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.dbHealth;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.info.SupportedDatabase;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+
+/**
+ * @author Theron Virgin
+ */
+public class HealthHelper {
+ public static final String ALL_BACKING_GAMMAS =
+ "(SELECT gamma_id FROM osee_artifact_version UNION SELECT gamma_id FROM osee_attribute UNION SELECT gamma_id FROM osee_relation_link)";
+
+ private static final String[] NO_TX_CURRENT_SET =
+ {
+ "SELECT distinct t1.",
+ ", det.branch_id FROM osee_tx_details det, osee_txs txs, ",
+ " t1 WHERE det.transaction_id = txs.transaction_id AND txs.gamma_id = t1.gamma_id AND txs.tx_current = 0 %s SELECT distinct t2.",
+ ", det.branch_id FROM osee_tx_details det, osee_txs txs, ",
+ " t2 WHERE det.transaction_id = txs.transaction_id AND txs.gamma_id = t2.gamma_id AND txs.tx_current != 0"};
+
+ private static final String[] MULTIPLE_TX_CURRENT_SET =
+ {
+ "SELECT resulttable.branch_id, resulttable.",
+ ", COUNT(resulttable.branch_id) AS numoccurrences FROM (SELECT txd1.branch_id, t1.",
+ " FROM osee_tx_details txd1, osee_txs txs1, ",
+ " t1 WHERE txd1.transaction_id = txs1.transaction_id AND txs1.gamma_id = t1.gamma_id AND txs1.tx_current != 0) resulttable GROUP BY resulttable.branch_id, resulttable.",
+ " HAVING(COUNT(resulttable.branch_id) > 1) order by branch_id"};
+
+ private static final String[] NO_TX_CURRENT_CLEANUP =
+ {
+ "UPDATE osee_txs set tx_current = CASE WHEN mod_type = 3 THEN 2 WHEN mod_type = 5 THEN 3 ELSE 1 END WHERE (gamma_id, transaction_id) = (SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, ",
+ " t1 WHERE t1.",
+ " = ? AND t1.gamma_id = txs1.gamma_id AND txs1.transaction_id = (SELECT max(txs.transaction_id) FROM osee_tx_details det, osee_txs txs, ",
+ " t2 WHERE det.branch_id = ? AND det.transaction_id = txs.transaction_id AND txs.gamma_id = t2.gamma_id AND t2.",
+ " = ?))"};
+
+ private static final String[] DUPLICATE_TX_CURRENT_CLEANUP =
+ {
+ "UPDATE osee_txs set tx_current = 0 WHERE (gamma_id, transaction_id) in (SELECT txs1.gamma_id, txs1.transaction_id FROM osee_txs txs1, ",
+ " t1 WHERE t1.",
+ " = ? AND t1.gamma_id = txs1.gamma_id AND txs1.transaction_id != (SELECT max(txs.transaction_id) FROM osee_tx_details det, osee_txs txs, ",
+ " t2 WHERE det.branch_id = ? AND txs.tx_current != 0 AND det.transaction_id = txs.transaction_id AND txs.gamma_id = t2.gamma_id AND t2.",
+ " = ?)AND txs1.transaction_id in (Select transaction_id FROM osee_tx_details WHERE branch_id = ?))"};
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Blam"));
+
+ public static void displayForCleanUp(String header, Appendable detailedReport, Appendable summary, boolean verify, List<Object[]> set, String toPrint) throws IOException {
+ int count = 0;
+ detailedReport.append(AHTML.addHeaderRowMultiColumnTable(new String[] {header}));
+ detailedReport.append(AHTML.addRowSpanMultiColumnTable(header + toPrint, 1));
+ for (Object[] value : set) {
+ count++;
+ detailedReport.append(AHTML.addRowMultiColumnTable(new String[] {value[0].toString()}));
+ }
+ summary.append(verify ? "Found " : "Fixed ");
+ summary.append(String.valueOf(count));
+ summary.append(" ");
+ summary.append(header);
+ summary.append(toPrint);
+ }
+
+ public static List<Object[]> runSingleResultQuery(String sql, String dbColumn) throws OseeCoreException {
+ List<Object[]> foundItems = new LinkedList<Object[]>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(sql);
+ while (chStmt.next()) {
+ foundItems.add(new Object[] {chStmt.getInt(dbColumn)});
+ }
+ } finally {
+ chStmt.close();
+ }
+ return foundItems;
+ }
+
+ public static HashSet<Pair<Integer, Integer>> getNoTxCurrentSet(String dataId, String dataTable, Appendable builder, String data) throws Exception {
+ String sql =
+ NO_TX_CURRENT_SET[0] + dataId + NO_TX_CURRENT_SET[1] + dataTable + String.format(NO_TX_CURRENT_SET[2],
+ SupportedDatabase.getComplementSql()) + dataId + NO_TX_CURRENT_SET[3] + dataTable + NO_TX_CURRENT_SET[4];
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ HashSet<Pair<Integer, Integer>> noneSet = new HashSet<Pair<Integer, Integer>>();
+
+ long time = System.currentTimeMillis();
+ try {
+ chStmt.runPreparedQuery(sql);
+ while (chStmt.next()) {
+ noneSet.add(new Pair<Integer, Integer>(chStmt.getInt(dataId), chStmt.getInt("branch_id")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ builder.append("Found ");
+ builder.append(String.valueOf(noneSet.size()));
+ builder.append(data);
+ builder.append(" that have no tx_current value set\n");
+ if (DEBUG) {
+ System.out.println(String.format("%sTxCurrent: The get No TX Set Query took %s", data,
+ Lib.getElapseString(time)));
+ }
+ return noneSet;
+ }
+
+ public static HashSet<LocalTxData> getMultipleTxCurrentSet(String dataId, String dataTable, Appendable builder, String data) throws Exception {
+ String sql =
+ MULTIPLE_TX_CURRENT_SET[0] + dataId + MULTIPLE_TX_CURRENT_SET[1] + dataId + MULTIPLE_TX_CURRENT_SET[2] + dataTable + MULTIPLE_TX_CURRENT_SET[3] + dataId + MULTIPLE_TX_CURRENT_SET[4];
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ HashSet<LocalTxData> multipleSet = new HashSet<LocalTxData>();
+
+ long time = System.currentTimeMillis();
+ try {
+ chStmt.runPreparedQuery(sql);
+ while (chStmt.next()) {
+ multipleSet.add(new LocalTxData(chStmt.getInt(dataId), chStmt.getInt("branch_id"),
+ chStmt.getInt("numoccurrences")));
+ }
+ builder.append("Found ");
+ builder.append(String.valueOf(multipleSet.size()));
+ builder.append(data);
+ builder.append(" that have multiple tx_current values set\n");
+
+ } finally {
+ chStmt.close();
+ }
+ if (DEBUG) {
+ System.out.println(String.format("%sTxCurrent: The get%s Query took %s", data, data, Lib.getElapseString(time)));
+ }
+ return multipleSet;
+ }
+
+ public static void cleanMultipleTxCurrent(String dataId, String dataTable, Appendable builder, HashSet<LocalTxData> multipleSet) throws Exception {
+ String sql =
+ DUPLICATE_TX_CURRENT_CLEANUP[0] + dataTable + DUPLICATE_TX_CURRENT_CLEANUP[1] + dataId + DUPLICATE_TX_CURRENT_CLEANUP[2] + dataTable + DUPLICATE_TX_CURRENT_CLEANUP[3] + dataId + DUPLICATE_TX_CURRENT_CLEANUP[4];
+
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+
+ for (LocalTxData link : multipleSet) {
+ insertParameters.add(new Object[] {link.dataId, link.branchId, link.dataId, link.branchId});
+ }
+ int total = 0;
+ if (insertParameters.size() > 0) {
+ total = ConnectionHandler.runBatchUpdate(sql, insertParameters);
+ }
+ builder.append("Fixed " + total + " Tx_Current duplication errors\n");
+ }
+
+ public static void cleanNoTxCurrent(String dataId, String dataTable, Appendable builder, HashSet<Pair<Integer, Integer>> noneSet) throws Exception {
+ String sql =
+ NO_TX_CURRENT_CLEANUP[0] + dataTable + NO_TX_CURRENT_CLEANUP[1] + dataId + NO_TX_CURRENT_CLEANUP[2] + dataTable + NO_TX_CURRENT_CLEANUP[3] + dataId + NO_TX_CURRENT_CLEANUP[4];
+
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+
+ for (Pair<Integer, Integer> pair : noneSet) {
+ insertParameters.add(new Object[] {pair.getKey(), pair.getValue(), pair.getKey()});
+ }
+ int total = 0;
+ if (insertParameters.size() > 0) {
+ total = ConnectionHandler.runBatchUpdate(sql, insertParameters);
+ }
+ builder.append("Fixed " + total + " Tx_Current not set errors\n");
+ }
+
+ public static void dumpDataNone(Appendable sbFull, HashSet<Pair<Integer, Integer>> noneSet) throws IOException {
+ int counter = 0;
+ for (Pair<Integer, Integer> pairs : noneSet) {
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {String.valueOf(counter++),
+ String.valueOf(pairs.getKey()), String.valueOf(pairs.getValue())}));
+ }
+ }
+
+ public static void dumpDataMultiple(Appendable sbFull, HashSet<LocalTxData> multipleSet) throws IOException {
+ int counter = 0;
+ for (LocalTxData link : multipleSet) {
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {String.valueOf(counter++),
+ String.valueOf(link.dataId), String.valueOf(link.branchId), String.valueOf(link.number)}));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/LocalTxData.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/LocalTxData.java
new file mode 100644
index 00000000000..94b195c0c77
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/LocalTxData.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.framework.ui.skynet.dbHealth;
+
+/**
+ * @author Theron Virgin
+ */
+public class LocalTxData {
+ public int dataId;
+ public int branchId;
+ public int number;
+
+ public LocalTxData(int dataId, int branchId, int number) {
+ super();
+ this.branchId = branchId;
+ this.dataId = dataId;
+ this.number = number;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelLinkTxCurrent.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelLinkTxCurrent.java
new file mode 100644
index 00000000000..63242e49f00
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelLinkTxCurrent.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.framework.ui.skynet.dbHealth;
+
+import java.util.HashSet;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * @author Theron Virgin
+ */
+public class RelLinkTxCurrent extends DatabaseHealthOperation {
+
+ private HashSet<LocalTxData> multipleSet = null;
+ private HashSet<Pair<Integer, Integer>> noneSet = null;
+
+ public RelLinkTxCurrent() {
+ super("TX_Current Relation Link Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ String[] columnHeaders = new String[] {"Count", "Rel Link Id", "Branch id"};
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ appendToDetails(AHTML.addRowSpanMultiColumnTable("Relation Links with no tx_current set", columnHeaders.length));
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (!isFixOperationEnabled() || noneSet == null) {
+ noneSet = HealthHelper.getNoTxCurrentSet("rel_link_id", "osee_relation_link", getSummary(), " Relation Links");
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (isShowDetailsEnabled()) {
+ HealthHelper.dumpDataNone(getDetailedReport(), noneSet);
+ columnHeaders = new String[] {"Count", "Relation Link id", "Branch id", "Num TX_Currents"};
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ appendToDetails(AHTML.addRowSpanMultiColumnTable("Relation Links with multiple tx_currents set",
+ columnHeaders.length));
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (!isFixOperationEnabled() || multipleSet == null) {
+ //Multiple TX Currents Set
+ multipleSet =
+ HealthHelper.getMultipleTxCurrentSet("rel_link_id", "osee_relation_link", getSummary(),
+ " Relation Links");
+ }
+
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ if (isShowDetailsEnabled()) {
+ HealthHelper.dumpDataMultiple(getDetailedReport(), multipleSet);
+ }
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ int multipleTxCurrentCount = multipleSet != null ? multipleSet.size() : 0;
+ int noTxCurrentCount = noneSet != null ? noneSet.size() : 0;
+ setItemsToFix(noTxCurrentCount + multipleTxCurrentCount);
+
+ if (isFixOperationEnabled()) {
+ /** Duplicate TX_current Cleanup **/
+ monitor.subTask("Cleaning up multiple Tx_currents");
+ HealthHelper.cleanMultipleTxCurrent("rel_link_id", "osee_relation_link", getSummary(), multipleSet);
+ monitor.worked(calculateWork(0.25));
+
+ monitor.subTask("Cleaning up multiple Tx_currents");
+ HealthHelper.cleanNoTxCurrent("rel_link_id", "osee_relation_link", getSummary(), noneSet);
+ multipleSet = null;
+ noneSet = null;
+ } else {
+ monitor.worked(calculateWork(0.25));
+ }
+ monitor.worked(calculateWork(0.20));
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.endMultiColumnTable());
+ }
+ monitor.worked(calculateWork(0.05));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelationDatabaseIntegrityCheck.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelationDatabaseIntegrityCheck.java
new file mode 100644
index 00000000000..87258697dbf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RelationDatabaseIntegrityCheck.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.dbHealth;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.enums.ModificationType;
+import org.eclipse.osee.framework.core.enums.TxChange;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.type.DoubleKeyHashMap;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Theron Virgin
+ */
+public class RelationDatabaseIntegrityCheck extends DatabaseHealthOperation {
+ private class LocalRelationLink {
+ public int relLinkId;
+ public int gammaId;
+ public int transactionId;
+ public int branchId;
+ public int aArtId;
+ public int bArtId;
+ public int transIdForArtifactDeletion;
+
+ public LocalRelationLink(int relLinkId, int gammaId, int transactionId, int branchId, int aArtId, int bArtId, int transIdForArtifactDeletion) {
+ super();
+ this.aArtId = aArtId;
+ this.bArtId = bArtId;
+ this.branchId = branchId;
+ this.gammaId = gammaId;
+ this.relLinkId = relLinkId;
+ this.transactionId = transactionId;
+ this.transIdForArtifactDeletion = transIdForArtifactDeletion;
+ }
+ }
+
+ private static final String NO_ADDRESSING_ARTIFACTS_A =
+ "SELECT tx1.gamma_id, tx1.transaction_id, rel1.rel_link_id, td1.branch_id, rel1.a_art_id, rel1.b_art_id, 0 as deleted_tran FROM osee_txs tx1, osee_tx_details td1, osee_relation_link rel1 WHERE td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = rel1.gamma_id AND not exists (select 'x' from osee_txs tx2, osee_tx_details td2, osee_artifact_version av1 where td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = av1.gamma_id and av1.art_id = rel1.a_art_id)";
+
+ private static final String NO_ADDRESSING_ARTIFACTS_B =
+ "SELECT tx1.gamma_id, tx1.transaction_id, rel1.rel_link_id, td1.branch_id, rel1.a_art_id, rel1.b_art_id, 0 as deleted_tran from osee_txs tx1, osee_tx_details td1, osee_relation_link rel1 where td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = rel1.gamma_id AND not exists (select 'x' from osee_txs tx2, osee_tx_details td2, osee_artifact_version av1 where td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = av1.gamma_id and av1.art_id = rel1.b_art_id)";
+
+ private static final String DELETED_A_ARTIFACTS =
+ "SELECT tx1.gamma_id, tx1.transaction_id, rel1.rel_link_id, td1.branch_id, rel1.a_art_id, rel1.b_art_id, tx2.transaction_id as deleted_tran from osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_relation_link rel1, osee_artifact_version av1 WHERE tx1.transaction_id = td1.transaction_id and tx1.gamma_id = rel1.gamma_id and tx1.tx_current = 1 and td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = av1.gamma_id and tx2.tx_current = 2 and av1.art_id = rel1.a_art_id";
+
+ private static final String DELETED_B_ARTIFACTS =
+ "SELECT tx1.gamma_id, tx1.transaction_id, rel1.rel_link_id, td1.branch_id, rel1.a_art_id, rel1.b_art_id, tx2.transaction_id as deleted_tran from osee_txs tx1, osee_txs tx2, osee_tx_details td1, osee_tx_details td2, osee_relation_link rel1, osee_artifact_version av1 WHERE tx1.transaction_id = td1.transaction_id and tx1.gamma_id = rel1.gamma_id and tx1.tx_current = 1 and td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = av1.gamma_id and tx2.tx_current = 2 and av1.art_id = rel1.b_art_id";
+
+ private static final String DELETE_FROM_TXS = "DELETE FROM osee_txs where gamma_id = ? AND transaction_id = ?";
+
+ private static final String UPDATE_TXS =
+ "UPDATE osee_txs SET tx_current = 0 WHERE gamma_id = ? AND transaction_id = ?";
+
+ private static final String UPDATE_TXS_SAME =
+ "UPDATE osee_txs SET tx_current = " + TxChange.ARTIFACT_DELETED.getValue() + ", mod_type = " + ModificationType.ARTIFACT_DELETED.getValue() + " WHERE gamma_id = ? AND transaction_id = ?";
+
+ private static final String INSERT_TXS =
+ "INSERT INTO osee_txs (gamma_id, transaction_id, tx_current, mod_type) VALUES (?, ?, " + TxChange.ARTIFACT_DELETED.getValue() + ", " + ModificationType.ARTIFACT_DELETED.getValue() + ")";
+
+ private static final String[] columnHeaders =
+ new String[] {"Rel Link ID", "Gamma Id", "Transaction Id", "Branch_id", "A Art Id", "B Art Id",
+ "Transaction ID of Deleted Artifact"};
+
+ private static final String[] DESCRIPTION =
+ {" Relation Links with non existant Artifacts on the Branch\n",
+ " Relation Links with deleted Artifacts on the Branch\n"};
+
+ private static final String[] HEADER =
+ {"Relation Links that have artifacts that don't exist on the branch",
+ "Relation Links that have artifacts that are deleted on the branch"};
+
+ private DoubleKeyHashMap<Integer, Integer, LocalRelationLink> deleteMap = null;
+ private DoubleKeyHashMap<Integer, Integer, LocalRelationLink> updateMap = null;
+
+ public RelationDatabaseIntegrityCheck() {
+ super("Relation Integrity Errors");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ boolean fix = isFixOperationEnabled();
+ boolean verify = !fix;
+
+ if (verify || deleteMap == null) {
+ deleteMap = new DoubleKeyHashMap<Integer, Integer, LocalRelationLink>();
+ monitor.subTask("Loading Relations with non existant artifacts on the A side");
+ loadData(NO_ADDRESSING_ARTIFACTS_A, true);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ monitor.subTask("Loading Relations with non existant artifacts on the B side");
+ loadData(NO_ADDRESSING_ARTIFACTS_B, true);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+ } else {
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+ }
+
+ if (verify || updateMap == null) {
+ updateMap = new DoubleKeyHashMap<Integer, Integer, LocalRelationLink>();
+ monitor.subTask("Loading Relations with Deleted artifacts on the A side");
+ loadData(DELETED_A_ARTIFACTS, false);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+
+ monitor.subTask("Loading Relations with Deleted artifacts on the B side");
+ loadData(DELETED_B_ARTIFACTS, false);
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.10));
+ } else {
+ checkForCancelledStatus(monitor);
+ monitor.worked(calculateWork(0.20));
+ }
+
+ sbFull.append(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ displayData(0, sbFull, getSummary(), verify, deleteMap);
+ displayData(1, sbFull, getSummary(), verify, updateMap);
+
+ monitor.worked(calculateWork(0.10));
+ checkForCancelledStatus(monitor);
+
+ int updateItemCount = updateMap != null ? updateMap.size() : 0;
+ int deleteItemCount = deleteMap != null ? deleteMap.size() : 0;
+ setItemsToFix(updateItemCount + deleteItemCount);
+
+ if (fix) {
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (LocalRelationLink relLink : deleteMap.allValues()) {
+ insertParameters.add(new Object[] {relLink.gammaId, relLink.transactionId});
+ }
+
+ monitor.subTask("Deleting Relation Addressing with non existant Artifacts");
+ if (insertParameters.size() != 0) {
+ ConnectionHandler.runBatchUpdate(DELETE_FROM_TXS, insertParameters);
+ }
+ deleteMap = null;
+
+ monitor.worked(calculateWork(0.10));
+
+ insertParameters.clear();
+ List<Object[]> insertParametersInsert = new LinkedList<Object[]>();
+ List<Object[]> insertParametersTransaction = new LinkedList<Object[]>();
+ for (LocalRelationLink relLink : updateMap.allValues()) {
+ insertParameters.add(new Object[] {relLink.gammaId, relLink.transactionId});
+ if (relLink.transactionId == relLink.transIdForArtifactDeletion) {
+ insertParametersTransaction.add(new Object[] {relLink.gammaId, relLink.transIdForArtifactDeletion});
+ } else if (relLink.transactionId > relLink.transIdForArtifactDeletion) {
+ insertParametersTransaction.add(new Object[] {relLink.gammaId, relLink.transactionId});
+ } else {
+ insertParametersInsert.add(new Object[] {relLink.gammaId, relLink.transIdForArtifactDeletion});
+ }
+ }
+ monitor.worked(calculateWork(0.10));
+
+ monitor.subTask("Inserting Addressing for Deleted Artifacts");
+ if (insertParametersInsert.size() != 0) {
+ ConnectionHandler.runBatchUpdate(INSERT_TXS, insertParametersInsert);
+ }
+ monitor.worked(calculateWork(0.10));
+
+ monitor.subTask("Updating Addressing for Deleted Artifacts");
+ if (insertParameters.size() != 0) {
+ ConnectionHandler.runBatchUpdate(UPDATE_TXS, insertParameters);
+ }
+ if (insertParametersTransaction.size() != 0) {
+ ConnectionHandler.runBatchUpdate(UPDATE_TXS_SAME, insertParametersTransaction);
+ }
+ monitor.worked(calculateWork(0.10));
+ updateMap = null;
+ } else {
+ monitor.worked(calculateWork(0.40));
+ }
+
+ if (isShowDetailsEnabled()) {
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report(getVerifyTaskName(), Manipulations.RAW_HTML);
+ }
+ monitor.worked(calculateWork(0.10));
+ }
+
+ private void displayData(int x, StringBuffer sbFull, Appendable builder, boolean verify, DoubleKeyHashMap<Integer, Integer, LocalRelationLink> map) throws IOException {
+ int count = 0;
+ sbFull.append(AHTML.addRowSpanMultiColumnTable(HEADER[x], columnHeaders.length));
+ for (LocalRelationLink relLink : map.allValues()) {
+ count++;
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {Integer.toString(relLink.relLinkId),
+ Integer.toString(relLink.gammaId), Integer.toString(relLink.transactionId),
+ Integer.toString(relLink.branchId), Integer.toString(relLink.aArtId), Integer.toString(relLink.bArtId),
+ Integer.toString(relLink.transIdForArtifactDeletion)}));
+ }
+
+ builder.append(verify ? "Found " : "Fixed ");
+ builder.append(String.valueOf(count));
+ builder.append(" ");
+ builder.append(DESCRIPTION[x]);
+ }
+
+ private void loadData(String sql, boolean forDelete) throws OseeDataStoreException {
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ DoubleKeyHashMap<Integer, Integer, LocalRelationLink> map = forDelete ? deleteMap : updateMap;
+ try {
+ chStmt.runPreparedQuery(sql);
+ while (chStmt.next()) {
+ if (!map.containsKey(chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")) && (forDelete || !deleteMap.containsKey(
+ chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id")))) {
+ map.put(chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id"), new LocalRelationLink(
+ chStmt.getInt("rel_link_id"), chStmt.getInt("gamma_id"), chStmt.getInt("transaction_id"),
+ chStmt.getInt("branch_id"), chStmt.getInt("a_art_id"), chStmt.getInt("b_art_id"),
+ chStmt.getInt("deleted_tran")));
+ }
+ }
+ } finally {
+ chStmt.close();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RemoveAttributesWithoutArtifacts.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RemoveAttributesWithoutArtifacts.java
new file mode 100644
index 00000000000..3737f08c0b5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/RemoveAttributesWithoutArtifacts.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.dbHealth;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class RemoveAttributesWithoutArtifacts extends DatabaseHealthOperation {
+
+ private static final String SELECT_ATTRIBUTES_WITH_NO_ARTIFACTS =
+ "select tx1.transaction_id, tx1.gamma_id, td1.branch_id, att1.art_id, att1.attr_id from osee_txs tx1, osee_tx_Details td1, osee_attribute att1 where td1.transaction_id = tx1.transaction_id AND tx1.gamma_id = att1.gamma_id AND not exists (select 'x' from osee_txs tx2, osee_tx_details td2, osee_artifact_version av1 where td1.branch_id = td2.branch_id and td2.transaction_id = tx2.transaction_id and tx2.gamma_id = av1.gamma_id AND av1.art_id = att1.art_id) ";
+ private static final String DELETE_ATTRIBUTES = "delete from osee_txs where transaction_id = ? and gamma_id = ?";
+ private static final String[] columnHeaders =
+ new String[] {"Transaction id", "Gamma Id", "Branch_id", "Art Id", "Attribute Id"};
+ private static ArrayList<Integer[]> datas = new ArrayList<Integer[]>();
+ private static final String DESCRIPTION = "Attributes the do not have artifacts on the branch where they exist.";
+
+ public RemoveAttributesWithoutArtifacts() {
+ super("Attributes with no Artifacts");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ StringBuffer sbFull = new StringBuffer(AHTML.beginMultiColumnTable(100, 1));
+ sbFull.append(AHTML.addHeaderRowMultiColumnTable(columnHeaders));
+ boolean fix = isFixOperationEnabled();
+ boolean verify = !fix;
+
+ try {
+ if (verify) {
+ loadData();
+ displayData(sbFull, getSummary(), verify);
+ }
+
+ if (fix) {
+ if (datas.isEmpty()) {
+ loadData();
+ }
+ fixAttributes();
+ displayData(sbFull, getSummary(), verify);
+ }
+ } finally {
+ if (isShowDetailsEnabled()) {
+ sbFull.append(AHTML.endMultiColumnTable());
+ XResultData rd = new XResultData();
+ rd.addRaw(sbFull.toString());
+ rd.report(getVerifyTaskName(), Manipulations.RAW_HTML);
+ }
+ }
+ }
+
+ private void loadData() throws OseeDataStoreException {
+ datas.clear();
+
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(SELECT_ATTRIBUTES_WITH_NO_ARTIFACTS);
+ int transactionNumber;
+ int gammaIdNumber;
+
+ while (chStmt.next()) {
+ transactionNumber = chStmt.getInt("transaction_id");
+ gammaIdNumber = chStmt.getInt("gamma_id");
+ datas.add(new Integer[] {transactionNumber, gammaIdNumber, chStmt.getInt("branch_id"),
+ chStmt.getInt("art_id"), chStmt.getInt("attr_id")});
+ }
+ } finally {
+ chStmt.close();
+ }
+
+ }
+
+ private void displayData(StringBuffer sbFull, Appendable builder, boolean verify) throws IOException {
+ sbFull.append(AHTML.addRowSpanMultiColumnTable(DESCRIPTION, columnHeaders.length));
+ for (Integer[] data : datas) {
+ sbFull.append(AHTML.addRowMultiColumnTable(new String[] {String.valueOf(data[0]), String.valueOf(data[1]),
+ String.valueOf(data[2]), String.valueOf(data[3]), String.valueOf(data[4])}));
+ }
+ builder.append(verify ? "Found " : "Fixed ");
+ builder.append(String.valueOf(datas.size()));
+ builder.append(" Attributes that have no Artifacts\n");
+ }
+
+ private void fixAttributes() throws OseeDataStoreException {
+ List<Object[]> insertParameters = new LinkedList<Object[]>();
+ for (Integer[] data : datas) {
+ insertParameters.add(new Object[] {data[0], data[1]});
+ }
+ ConnectionHandler.runBatchUpdate(DELETE_ATTRIBUTES, insertParameters);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/WordAttributeTrackChangeHealthOperation.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/WordAttributeTrackChangeHealthOperation.java
new file mode 100644
index 00000000000..4a46fe6034a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbHealth/WordAttributeTrackChangeHealthOperation.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.framework.ui.skynet.dbHealth;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeServerContext;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.IOperation;
+import org.eclipse.osee.framework.db.connection.ConnectionHandlerStatement;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.word.WordAnnotationHandler;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class WordAttributeTrackChangeHealthOperation extends DatabaseHealthOperation {
+
+ public WordAttributeTrackChangeHealthOperation() {
+ super("Word Attribute Track Change Enabled");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#getFixTaskName()
+ */
+ @Override
+ public String getFixTaskName() {
+ return Strings.emptyString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.dbHealth.DatabaseHealthOperation#doHealthCheck(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doHealthCheck(IProgressMonitor monitor) throws Exception {
+ List<AttrData> attributesWithErrors = new ArrayList<AttrData>();
+
+ IOperation operation =
+ new FindAllTrackChangeWordAttributes("Find all Word Attributes with track changes enabled",
+ getStatus().getPlugin(), attributesWithErrors);
+ doSubWork(operation, monitor, 0.90);
+
+ setItemsToFix(attributesWithErrors.size());
+
+ if (isShowDetailsEnabled()) {
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.beginMultiColumnTable(100, 1));
+ appendToDetails(AHTML.addHeaderRowMultiColumnTable(new String[] {"HRID", "GAMMA ID", "URI"}));
+ for (AttrData attrData : attributesWithErrors) {
+ appendToDetails(AHTML.addRowMultiColumnTable(new String[] {attrData.getHrid(), attrData.getGammaId(),
+ attrData.getUri()}));
+ }
+ appendToDetails(AHTML.endMultiColumnTable());
+ monitor.worked(calculateWork(0.10));
+ }
+ getSummary().append(String.format("[%s] Word Attributes with Track Changes Enabled", attributesWithErrors.size()));
+
+ monitor.worked(calculateWork(0.10));
+ }
+
+ private final static class FindAllTrackChangeWordAttributes extends AbstractOperation {
+ private static final String GET_ATTRS =
+ "SELECT * FROM osee_attribute t1, osee_artifact t3 WHERE t1.attr_type_id = ? AND t1.art_id = t3.art_id AND t1.uri is not null";
+ private final List<AttrData> attributesWithErrors;
+
+ public FindAllTrackChangeWordAttributes(String operationName, String pluginId, List<AttrData> attributesWithErrors) {
+ super(operationName, pluginId);
+ this.attributesWithErrors = attributesWithErrors;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.operation.AbstractOperation#doWork(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ String[] attributeTypeNames =
+ new String[] {WordAttribute.WORD_TEMPLATE_CONTENT, WordAttribute.WHOLE_WORD_CONTENT};
+
+ monitor.subTask("Load Attribute Data");
+ List<AttrData> attrDatas = new ArrayList<AttrData>();
+ for (String attributeTypeName : attributeTypeNames) {
+ AttributeType attributeType = AttributeTypeManager.getType(attributeTypeName);
+ attrDatas.addAll(loadAttributeData(monitor, attributeType));
+ }
+ monitor.worked(calculateWork(0.20));
+
+ if (!attrDatas.isEmpty()) {
+ int totalAttrs = attrDatas.size();
+ int work = calculateWork(0.80) / totalAttrs;
+ for (int index = 0; index < attrDatas.size(); index++) {
+ checkForCancelledStatus(monitor);
+ AttrData attrData = attrDatas.get(index);
+ monitor.subTask(String.format("[%s of %s] - hrid[%s]", index, totalAttrs, attrData.getHrid()));
+ Resource resource = ResourceUtil.getResource(attrData.getUri());
+ if (WordAnnotationHandler.containsWordAnnotations(resource.data)) {
+ // Collect Info or Try to fix not sure what to do yet
+ attributesWithErrors.add(attrData);
+ }
+ monitor.worked(work);
+ }
+ } else {
+ monitor.worked(calculateWork(0.80));
+ }
+ }
+
+ private List<AttrData> loadAttributeData(IProgressMonitor monitor, AttributeType attributeType) throws OseeDataStoreException, OseeTypeDoesNotExist {
+ List<AttrData> attrData = new ArrayList<AttrData>();
+ ConnectionHandlerStatement chStmt = new ConnectionHandlerStatement();
+ try {
+ chStmt.runPreparedQuery(GET_ATTRS, attributeType.getAttrTypeId());
+ while (chStmt.next()) {
+ checkForCancelledStatus(monitor);
+ attrData.add(new AttrData(chStmt.getString("gamma_Id"), chStmt.getString("human_readable_id"),
+ chStmt.getString("uri")));
+ }
+ } finally {
+ chStmt.close();
+ }
+ return attrData;
+ }
+ }
+
+ private final static class ResourceUtil {
+ private ResourceUtil() {
+ }
+
+ public static Resource getResource(String resourcePath) throws OseeCoreException {
+ Resource toReturn = null;
+ ByteArrayOutputStream sourceOutputStream = new ByteArrayOutputStream();
+ try {
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("uri", resourcePath);
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT,
+ parameterMap);
+
+ AcquireResult result = HttpProcessor.acquire(new URL(urlString), sourceOutputStream);
+ if (result.getCode() == HttpURLConnection.HTTP_OK) {
+ toReturn = new Resource(resourcePath, result, sourceOutputStream.toByteArray());
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ try {
+ sourceOutputStream.close();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+ return toReturn;
+ }
+
+ public static void uploadResource(String gammaId, Resource resource) throws Exception {
+ String fileName = resource.resourceName;
+ Map<String, String> parameterMap = new HashMap<String, String>();
+ parameterMap.put("sessionId", ClientSessionManager.getSessionId());
+ parameterMap.put("is.overwrite.allowed", String.valueOf(true));
+ parameterMap.put("protocol", "attr");
+ parameterMap.put("seed", gammaId);
+
+ String extension = Lib.getExtension(fileName);
+ if (Strings.isValid(extension)) {
+ parameterMap.put("extension", extension);
+ int charToRemove = extension.length() + 1;
+ fileName = fileName.substring(0, fileName.length() - charToRemove);
+ }
+ parameterMap.put("name", fileName);
+
+ byte[] toUpload = resource.data.getBytes(resource.encoding);
+ if (resource.wasZipped) {
+ toUpload = Lib.compressStream(new ByteArrayInputStream(toUpload), resource.entryName);
+ }
+
+ String urlString =
+ HttpUrlBuilder.getInstance().getOsgiServletServiceUrl(OseeServerContext.RESOURCE_CONTEXT, parameterMap);
+ HttpProcessor.put(new URL(urlString), new ByteArrayInputStream(toUpload), resource.result.getContentType(),
+ resource.result.getEncoding());
+ }
+
+ public static void backupResourceLocally(File backupFolder, Resource resource) throws IOException {
+ InputStream inputStream = null;
+ OutputStream outputStream = null;
+ try {
+ String path = resource.sourcePath;
+ path = path.replaceAll("attr://", "");
+ path = path.replaceAll("/", Lib.isWindows() ? "\\\\" : "/");
+ File file = new File(backupFolder, path);
+ File parent = file.getParentFile();
+ if (parent != null) {
+ parent.mkdirs();
+ }
+ outputStream = new FileOutputStream(file);
+
+ inputStream = new ByteArrayInputStream(resource.rawBytes);
+ Lib.inputStreamToOutputStream(inputStream, outputStream);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ }
+ }
+ }
+
+ private final static class Resource {
+ private final String entryName;
+ private final String resourceName;
+ private final AcquireResult result;
+ private final byte[] rawBytes;
+ private final boolean wasZipped;
+ private final String sourcePath;
+
+ private String data;
+ private String encoding;
+
+ private Resource(String sourcePath, AcquireResult result, byte[] rawBytes) throws IOException {
+ this.rawBytes = rawBytes;
+ this.result = result;
+ int index = sourcePath.lastIndexOf('/');
+ this.sourcePath = sourcePath;
+ this.resourceName = sourcePath.substring(index + 1, sourcePath.length());
+ this.wasZipped = result.getContentType().contains("zip");
+ if (wasZipped) {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ this.entryName = Lib.decompressStream(new ByteArrayInputStream(rawBytes), outputStream);
+ this.encoding = "UTF-8";
+ this.data = new String(outputStream.toByteArray(), encoding);
+ } else {
+ this.data = new String(rawBytes, result.getEncoding());
+ this.entryName = null;
+ this.encoding = result.getEncoding();
+ }
+ }
+ }
+
+ private final static class AttrData {
+ private final String gammaId;
+ private final String hrid;
+ private final String uri;
+
+ public AttrData(String gammaId, String hrid, String uri) {
+ super();
+ this.gammaId = gammaId;
+ this.hrid = hrid;
+ this.uri = uri;
+ }
+
+ public String getGammaId() {
+ return gammaId;
+ }
+
+ public String getHrid() {
+ return hrid;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbinit/AddCommonBranch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbinit/AddCommonBranch.java
new file mode 100644
index 00000000000..70e06ccf780
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dbinit/AddCommonBranch.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.framework.ui.skynet.dbinit;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+
+/**
+ * This class creates the common branch and imports the appropriate skynet types. Class should be extended for plugins
+ * that require extra skynet types to be added to common.
+ *
+ * @author Donald G. Dunne
+ */
+public class AddCommonBranch implements IDbInitializationTask {
+ private final boolean initializeArtifacts;
+
+ public AddCommonBranch() {
+ this(true);
+ }
+
+ public AddCommonBranch(boolean initializeArtifacts) {
+ this.initializeArtifacts = initializeArtifacts;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#run(java.sql.Connection)
+ */
+ public void run() throws OseeCoreException {
+ BranchManager.createSystemRootBranch();
+
+ // Create branch, import OSEE types and initialize
+ BranchManager.createTopLevelBranch(Branch.COMMON_BRANCH_CONFIG_ID, Branch.COMMON_BRANCH_CONFIG_ID,
+ getSkynetDbTypeExtensionIds(), initializeArtifacts);
+ }
+
+ public List<String> getSkynetDbTypeExtensionIds() {
+ return Arrays.asList("org.eclipse.osee.framework.skynet.core.OseeTypes_CommonBranch",
+ "org.eclipse.osee.framework.skynet.core.OseeTypes_ProgramAndCommon", "org.eclipse.osee.ats.OseeTypes_ATS");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#canRun()
+ */
+ public boolean canRun() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/AuthenticationDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/AuthenticationDialog.java
new file mode 100644
index 00000000000..a8a37001dcf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/AuthenticationDialog.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.dialogs;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException;
+import org.eclipse.osee.framework.core.exception.OseeAuthenticationException.AuthenticationErrorCode;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.panels.AuthenticationComposite;
+import org.eclipse.osee.framework.ui.swt.OseeMessageDialog;
+import org.eclipse.swt.SWT;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AuthenticationDialog extends OseeMessageDialog {
+
+ private Button okButton;
+ private Button cancelButton;
+ protected AuthenticationComposite authenticationComposite;
+ private boolean selectionOk;
+ private static final int MAX_RETRIES = 3;
+
+ public AuthenticationDialog(Shell parentShell) {
+ super(parentShell, "OSEE Authenticate", null, "Enter your user id (email address), password, and domain.",
+ ImageManager.getImage(FrameworkImage.LOCKED_KEY), new String[] {"Enter", "Cancel"}, 0);
+
+ selectionOk = false;
+ authenticationComposite = new AuthenticationComposite(parentShell, SWT.NONE, false);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ authenticationComposite.setParent(parent);
+ return authenticationComposite;
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ cancelButton = getButton(1);
+
+ okButton.setEnabled(false);
+ okButton.addSelectionListener(authenticationComposite.getAuthenticateListener());
+ okButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = true;
+ }
+ });
+ authenticationComposite.getShell().setDefaultButton(okButton);
+
+ cancelButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = false;
+ }
+ });
+ return c;
+ }
+
+ public boolean isValid() {
+ return selectionOk;
+ }
+
+ private void setUserName(String user) {
+ authenticationComposite.setUserName(user);
+ }
+
+ private void setPassword(String password) {
+ authenticationComposite.setPassword(password);
+ }
+
+ private void setDomain(String domain) {
+ authenticationComposite.setDomain(domain);
+ }
+
+ private void setStorageAllowed(boolean isStorageAllowed) {
+ authenticationComposite.setStorageAllowed(isStorageAllowed);
+ }
+
+ private void setGuestLogin(boolean isGuestLogin) {
+ authenticationComposite.setGuestLogin(isGuestLogin);
+ }
+
+ private void setProtocol(String protocol) {
+ authenticationComposite.setProtocol(protocol);
+ }
+
+ private String getUserName() {
+ return authenticationComposite.getUserName();
+ }
+
+ private String getDomain() {
+ return authenticationComposite.getDomain();
+ }
+
+ private String getProtocol() {
+ return authenticationComposite.getProtocol();
+ }
+
+ private boolean isStorageAllowed() {
+ return authenticationComposite.isStorageAllowed();
+ }
+
+ private boolean isGuestLogin() {
+ return authenticationComposite.isGuestLogin();
+ }
+
+ public static void openDialog() {
+ Display.getDefault().syncExec(new Runnable() {
+
+ private String getErrorMessage(AuthenticationErrorCode status) {
+ String toReturn = "";
+ if (status == null) {
+ status = AuthenticationErrorCode.Unknown;
+ }
+ switch (status) {
+ case UserNotFound:
+ toReturn = "User Id not found.\n" + "Enter your user id.";
+ break;
+ case InvalidPassword:
+ toReturn =
+ "Invalid Password.\n" + "Make sure <CAPS LOCK> is not enabled.\n" + "Enter a valid password.";
+ break;
+ case NoResponse:
+ toReturn = "Please enter a valid user id and password.";
+ break;
+ default:
+ toReturn = "Unknown authentication error";
+ break;
+ }
+ return toReturn;
+ }
+
+ public void run() {
+ String dialogTitle = "Authentication Failed";
+ String endMsg = "Shutting down the workbench.";
+ String user = "";
+ String domain = "";
+ String message = "";
+ String protocol = "";
+ boolean isStorageAllowed = false;
+ boolean isGuestLogin = false;
+ boolean shutdown = false;
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+
+ for (int numberOfTries = 0; numberOfTries < MAX_RETRIES; numberOfTries++) {
+ AuthenticationDialog dialog = new AuthenticationDialog(shell);
+ if (numberOfTries != 0) {
+ dialog.setUserName(user);
+ dialog.setPassword("");
+ dialog.setDomain(domain);
+ dialog.setProtocol(protocol);
+ dialog.setStorageAllowed(isStorageAllowed);
+ dialog.setGuestLogin(isGuestLogin);
+ }
+ int result = dialog.open();
+
+ user = dialog.getUserName();
+ protocol = dialog.getProtocol();
+ domain = dialog.getDomain();
+ isStorageAllowed = dialog.isStorageAllowed();
+ isGuestLogin = dialog.isGuestLogin();
+
+ if (result == Window.CANCEL) {
+ // TODO This was added because ATS requires a user to be logged in
+ // Non-Authentication is not an option --
+ if (numberOfTries > MAX_RETRIES) {
+ message = "Maximum number of Retries reached.\n" + endMsg;
+ shutdown = true;
+ } else {
+ message =
+ "Please log in as Guest or with your credentials.\n" + "A Log-in account is required to continue.";
+ }
+
+ MessageDialog.openError(shell, "Authentication Cancelled", message);
+ }
+ // else if (result != Window.OK ) {
+ // numberOfTries = MAX_RETRIES;
+ // }
+ else {
+ if (dialog.isValid()) {
+ if (ClientSessionManager.isSessionValid()) {
+ numberOfTries = MAX_RETRIES;
+ String userText;
+ try {
+ userText = UserManager.getUser().toString();
+ } catch (OseeCoreException ex) {
+ userText = ex.getLocalizedMessage();
+ }
+ MessageDialog.openInformation(shell, "Authenticated", "Logged in as: " + userText);
+ } else {
+ if (numberOfTries >= MAX_RETRIES - 1) {
+ message = "Maximum number of Retries reached.\n" + endMsg;
+ shutdown = true;
+ } else {
+ IHealthStatus status = OseeLog.getStatusByName(ClientSessionManager.getStatusId());
+ if (status != null && status.getException() != null) {
+ Throwable ex = status.getException();
+ if (ex instanceof OseeAuthenticationException) {
+ message = getErrorMessage(((OseeAuthenticationException) ex).getCode());
+ }
+ message = ex.getLocalizedMessage();
+ } else {
+ message = "Authentication error";
+ }
+ }
+ MessageDialog.openError(shell, dialogTitle, message);
+ }
+ }
+ }
+ }
+
+ if (shutdown) {
+ PlatformUI.getWorkbench().close();
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/ListDialogSortable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/ListDialogSortable.java
new file mode 100644
index 00000000000..b1797f49c3d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/dialogs/ListDialogSortable.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.framework.ui.skynet.dialogs;
+
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumnSorter;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ListDialogSortable extends ListDialog {
+
+ private ViewerSorter viewerSorter;
+
+ /**
+ * @param parent
+ */
+ public ListDialogSortable(Shell parent) {
+ super(parent);
+ }
+
+ /**
+ * @param parent
+ */
+ public ListDialogSortable(ViewerSorter viewerSorter, Shell parent) {
+ super(parent);
+ this.viewerSorter = viewerSorter;
+ }
+
+ public void setSorter(ViewerSorter viewerSorter) {
+ this.viewerSorter = viewerSorter;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.ListDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control control = super.createDialogArea(container);
+ if (viewerSorter != null) {
+ getTableViewer().setSorter(new XViewerColumnSorter());
+ }
+ return control;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizard.java
new file mode 100644
index 00000000000..66de2366145
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizard.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.framework.ui.skynet.diffWizard;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.ui.skynet.mergeWizard.EditWFCAttributeWizardPage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.XMergeLabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Theron Virgin
+ */
+public class DiffWizard extends Wizard {
+ public static final String TITLE = "How would you like to resolve this conflict?";
+ public static final String INDENT = " ";
+ public static final String SOURCE_TITLE = "Source Value:";
+ public static final String DEST_TITLE = "Destination value:";
+ public static final String ART_TEXT = "Artifact: ";
+ public static final String TYPE_TEXT = "Attribute type: ";
+
+ private DiffWizardPage diffWizardPage;
+ private final Conflict conflict;
+
+ public DiffWizard(Conflict conflict) {
+ this.conflict = conflict;
+ }
+
+ @Override
+ public void addPages() {
+ diffWizardPage = new DiffWizardPage(conflict);
+ addPage(diffWizardPage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ return diffWizardPage.closingPage();
+ }
+
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ public boolean getResolved() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#getStartingPage()
+ */
+ @Override
+ public IWizardPage getStartingPage() {
+ return getPage(DiffWizardPage.TITLE);
+ }
+
+ @Override
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performCancel()
+ */
+ @Override
+ public boolean performCancel() {
+ return super.performCancel();
+ }
+
+ public void setResolution() throws OseeCoreException {
+ if (getContainer() != null) {
+ IWizardPage page = getContainer().getCurrentPage();
+ Image image = XMergeLabelProvider.getMergeImage(conflict);
+ if (page instanceof DiffWizardPage) {
+ ((DiffWizardPage) page).setResolution(image);
+ } else if (page instanceof EditWFCAttributeWizardPage) {
+ ((EditWFCAttributeWizardPage) page).setResolution(image);
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizardPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizardPage.java
new file mode 100644
index 00000000000..38bf4d3c963
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/diffWizard/DiffWizardPage.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.diffWizard;
+
+import java.util.Date;
+import java.util.logging.Level;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.ui.skynet.mergeWizard.ConflictResolutionWizard;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.XMergeLabelProvider;
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Theron Virgin
+ */
+public class DiffWizardPage extends WizardPage {
+
+ public static final String TITLE = "WFC Editor Page";
+ private Conflict conflict;
+ private String changeType = "";
+ private Button editButton;
+ private Button mergeButton;
+ private Button clearButton;
+ private Button sourceButton;
+ private Button destButton;
+ private Button sourceDiffButton;
+ private Button destDiffButton;
+ private Button sourceDestDiffButton;
+ private Button sourceMergeDiffButton;
+ private Button destMergeDiffButton;
+ private Label imageLabel;
+ private static final String SOURCE_VALUE = "Current Source(%s) Artifact";
+ private static final String DESTINATION_VALUE = "Current Destination(%s) Artifact";
+ private static final String BASELINE_VALUE = "Common Artifact Version (Baseline)";
+ private static final String MERGE_VALUE = "Current Merge Artifact";
+ private static final String EDIT_TEXT = "Edit Merge Artifact";
+ private static final String EDIT_TOOLTIP = "Make additional changes using the Document/Merge Editor";
+ private static final String MERGE_TEXT = "Generate Three Way Merge (Developmental)";
+ private static final String MERGE_TOOLTIP = "Use the new inline merging";
+ private static final String CLEAR_TEXT = "Clear the Merge Artifact";
+ private static final String CLEAR_TOOLTIP = "Reinitializes the merge for this Document";
+ private static final String SOURCE_TEXT = "Populate with Source Data";
+ private static final String SOURCE_TOOLTIP = "Initialize the Document with Source Values";
+ private static final String DEST_TEXT = "Populate with Destination Data";
+ private static final String DEST_TOOLTIP = "Initialize the Document with Destination Values";
+ private static final String SDIFF_TEXT = "Show Source Diff";
+ private static final String SDIFF_TOOLTIP =
+ "Show the differences between the current Source" + " artifact and the artifact at the time the Source Branch was created";
+ private static final String DDIFF_TEXT = "Show Destination Diff";
+ private static final String DDIFF_TOOLTIP =
+ "Show the differences between the current Destination" + " artifact and the artifact at the time the Source Branch was created";
+ private static final String SDDIFF_TEXT = "Show Source/Destination Diff";
+ private static final String SDDIFF_TOOLTIP =
+ "Show the differences between the current Source" + " artifact and the current Merge artifact";
+ private static final String SMDIFF_TEXT = "Show Source/Merge Diff";
+ private static final String SMDIFF_TOOLTIP =
+ "Show the differences between the current Destination" + " artifact and the current Merge artifact";
+ private static final String DMDIFF_TEXT = "Show Destination/Merge Diff";
+ private static final String DMDIFF_TOOLTIP =
+ "Show the differences between the current Destination" + " artifact and the current Source artifact";
+ private static final int NUM_COLUMNS = 2;
+
+ private final Listener listener = new Listener() {
+ public void handleEvent(Event event) {
+ // ...
+
+ try {
+ if (event.widget == editButton) {
+ RendererManager.openInJob(conflict.getArtifact(), PresentationType.SPECIALIZED_EDIT);
+ // conflict.markStatusToReflectEdit();
+ } else if (event.widget == clearButton) {
+ MergeUtility.clearValue(conflict, getShell(), true);
+ } else if (event.widget == sourceButton) {
+ MergeUtility.setToSource(conflict, getShell(), true);
+ } else if (event.widget == destButton) {
+ MergeUtility.setToDest(conflict, getShell(), true);
+ } else if (event.widget == sourceDiffButton) {
+ MergeUtility.showCompareFile(MergeUtility.getStartArtifact(conflict), conflict.getSourceArtifact(),
+ "Source_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == destDiffButton) {
+ MergeUtility.showCompareFile(
+ MergeUtility.getStartArtifact(conflict),
+ conflict.getDestArtifact(),
+ "Destination_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == sourceDestDiffButton) {
+ MergeUtility.showCompareFile(
+ conflict.getSourceArtifact(),
+ conflict.getDestArtifact(),
+ "Source_Destination_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == sourceMergeDiffButton) {
+ // if (conflict.wordMarkupPresent()) {
+ // throw new OseeCoreException(AttributeConflict.DIFF_MERGE_MARKUP);
+ // }
+ MergeUtility.showCompareFile(
+ conflict.getSourceArtifact(),
+ conflict.getArtifact(),
+ "Source_Merge_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == destMergeDiffButton) {
+ // if (conflict.wordMarkupPresent()) {
+ // throw new OseeCoreException(AttributeConflict.DIFF_MERGE_MARKUP);
+ // }
+ MergeUtility.showCompareFile(
+ conflict.getDestArtifact(),
+ conflict.getArtifact(),
+ "Destination_Merge_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == mergeButton) {
+ // MergeUtility.launchMerge(conflict, getShell());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(DiffWizardPage.class, Level.WARNING, ex);
+ }
+ getWizard().getContainer().updateButtons();
+ }
+ };
+
+ /**
+ * @param pageName
+ */
+
+ public DiffWizardPage(Conflict conflict) {
+ super(TITLE);
+ this.conflict = conflict;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ setTitle("Select a Difference Report to Generate");
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gl = new GridLayout();
+ gl.numColumns = NUM_COLUMNS;
+ composite.setLayout(gl);
+ GridData gd = new GridData(SWT.BEGINNING);
+ composite.setLayoutData(gd);
+ gd.horizontalSpan = NUM_COLUMNS;
+
+ imageLabel = new Label(composite, SWT.NONE);
+ imageLabel.setImage(null);
+
+ try {
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.ART_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + conflict.getArtifactName());
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.TYPE_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + changeType);
+ } catch (Exception ex) {
+ OseeLog.log(DiffWizardPage.class, Level.WARNING, ex);
+ }
+
+ new Label(composite, SWT.NONE);
+
+ editButton = createButton(EDIT_TEXT, EDIT_TOOLTIP, composite);
+ mergeButton = createButton(MERGE_TEXT, MERGE_TOOLTIP, composite);
+ new Label(composite, SWT.NONE);
+ sourceButton = createButton(SOURCE_TEXT, SOURCE_TOOLTIP, composite);
+ destButton = createButton(DEST_TEXT, DEST_TOOLTIP, composite);
+ clearButton = createButton(CLEAR_TEXT, CLEAR_TOOLTIP, composite);
+ new Label(composite, SWT.NONE);
+
+ Composite buttonComp = new Composite(composite, SWT.NONE);
+ GridLayout glay = new GridLayout();
+ glay.numColumns = 3;
+ buttonComp.setLayout(glay);
+ GridData gdata = new GridData(SWT.FILL);
+ buttonComp.setLayoutData(gdata);
+ gdata.horizontalSpan = 1;
+
+ sourceDiffButton = createButton(SDIFF_TEXT, SDIFF_TOOLTIP, buttonComp);
+ destDiffButton = createButton(DDIFF_TEXT, DDIFF_TOOLTIP, buttonComp);
+ sourceDestDiffButton = createButton(SDDIFF_TEXT, SDDIFF_TOOLTIP, buttonComp);
+ sourceMergeDiffButton = createButton(SMDIFF_TEXT, SMDIFF_TOOLTIP, buttonComp);
+ destMergeDiffButton = createButton(DMDIFF_TEXT, DMDIFF_TOOLTIP, buttonComp);
+ if (MergeUtility.getStartArtifact(conflict) == null) {
+ sourceDiffButton.setEnabled(false);
+ destDiffButton.setEnabled(false);
+ }
+
+ try {
+ setResolution(XMergeLabelProvider.getMergeImage(conflict));
+ } catch (Exception ex) {
+ OseeLog.log(DiffWizardPage.class, Level.WARNING, ex);
+ }
+
+ setControl(composite);
+ }
+
+ private Button createButton(String text, String tooltip, Composite composite) {
+ Button button = new Button(composite, SWT.PUSH);
+ button.addListener(SWT.Selection, listener);
+ button.setText(text);
+ button.setToolTipText(tooltip);
+ return button;
+ }
+
+ public boolean canFinish() {
+ return true;
+ }
+
+ public boolean closingPage() {
+ //generate the diff report
+ return true;
+ }
+
+ public void setResolution(Image image) {
+ imageLabel.setImage(image);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportJob.java
new file mode 100644
index 00000000000..e1974d1d5cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportJob.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.framework.ui.skynet.export;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collection;
+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.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.FileRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactExportJob extends Job {
+ private final File rootExportPath;
+ private final Collection<Artifact> exportArtifacts;
+
+ /**
+ * @param name
+ */
+ public ArtifactExportJob(File exportPath, Collection<Artifact> exportArtifacts) {
+ super("Artifact Export");
+ this.rootExportPath = exportPath;
+ this.exportArtifacts = exportArtifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn;
+ try {
+ monitor.beginTask("Exporting Artifacts", countDescendents());
+
+ for (Artifact artifact : exportArtifacts) {
+ if (monitor.isCanceled()) {
+ return new Status(Status.CANCEL, SkynetGuiPlugin.PLUGIN_ID, "User Cancled the operation.");
+ }
+ writeArtifactPreview(rootExportPath, monitor, artifact, PresentationType.PREVIEW);
+ }
+
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ toReturn = new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+ return toReturn;
+ }
+
+ private int countDescendents() throws OseeCoreException {
+ int total = 0;
+ for (Artifact artifact : exportArtifacts) {
+ total += artifact.getDescendants().size() + 1;
+ }
+ return total;
+ }
+
+ private void writeArtifactPreview(File exportPath, IProgressMonitor monitor, Artifact artifact, PresentationType presentationType) throws Exception {
+ if (artifact.getArtifactTypeName().equals("Folder")) {
+ File folder = new File(exportPath, artifact.getDescriptiveName());
+ folder.mkdir();
+ for (Artifact child : artifact.getChildren()) {
+ writeArtifactPreview(folder, monitor, child, presentationType);
+ }
+ } else {
+ try {
+ FileRenderer fileRenderer = RendererManager.getBestFileRenderer(presentationType, artifact, null);
+ String fileName = artifact.getSafeName() + "." + fileRenderer.getAssociatedExtension(artifact);
+ InputStream inputStream = fileRenderer.getRenderInputStream(artifact, presentationType);
+ Lib.inputStreamToFile(inputStream, new File(exportPath, fileName));
+ } catch (OseeArgumentException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Artifact requires a FileRenderer");
+ }
+ }
+ monitor.worked(1);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportPage.java
new file mode 100644
index 00000000000..b29f684fcdb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportPage.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.export;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.search.ui.text.Match;
+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.Event;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactExportPage extends WizardDataTransferPage {
+ private final File exportPath;
+ private final Collection<Artifact> selectedArtifacts;
+
+ /**
+ * @param pageName
+ */
+ public ArtifactExportPage(IStructuredSelection selection) {
+ super("Main");
+
+ this.exportPath = OseeData.getPath().toFile();
+ selectedArtifacts = new ArrayList<Artifact>();
+ if (selection != null) {
+ Iterator<?> selectionIterator = selection.iterator();
+ while (selectionIterator.hasNext()) {
+ Object selectedObject = selectionIterator.next();
+
+ if (selectedObject instanceof Match) {
+ selectedObject = ((Match) selectedObject).getElement();
+ } else if (selectedObject instanceof IAdaptable) {
+ selectedObject = ((IAdaptable) selectedObject).getAdapter(Artifact.class);
+ }
+
+ if (selectedObject instanceof Artifact) {
+ selectedArtifacts.add((Artifact) selectedObject);
+ } else {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Expected selection to be of type Artifact");
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.WizardDataTransferPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setFont(parent.getFont());
+
+ //createSourceGroup(composite);
+
+ createOptionsGroup(composite);
+
+ setPageComplete(determinePageCompletion());
+ setControl(composite);
+ }
+
+ /**
+ * @return
+ */
+ public Collection<Artifact> getExportArtifacts() {
+ return selectedArtifacts;
+ }
+
+ /**
+ * @return
+ */
+ public File getExportPath() {
+ return exportPath;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportWizard.java
new file mode 100644
index 00000000000..bc4b4613ebe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ArtifactExportWizard.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.framework.ui.skynet.export;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactExportWizard extends Wizard implements IExportWizard {
+ private ArtifactExportPage mainPage;
+
+ public ArtifactExportWizard() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ Jobs.startJob(new ArtifactExportJob(mainPage.getExportPath(), mainPage.getExportArtifacts()));
+ } catch (Exception ex) {
+ ErrorDialog.openError(getShell(), "Define Export Error", ex.getLocalizedMessage(), new Status(IStatus.ERROR,
+ "org.eclipse.osee.framework.jdk.core", IStatus.ERROR, ex.getLocalizedMessage(), ex));
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ mainPage = new ArtifactExportPage(selection);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#addPages()
+ */
+ @Override
+ public void addPages() {
+ addPage(mainPage);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchPage.java
new file mode 100644
index 00000000000..8454fd78951
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchPage.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.framework.ui.skynet.export;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.DirectoryOrFileSelector;
+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.Event;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ExportBranchPage extends WizardDataTransferPage {
+ private DirectoryOrFileSelector directoryFileSelector;
+
+ @SuppressWarnings("unused")
+ private final Branch branch;
+
+ /**
+ * @param name
+ * @param selection
+ */
+ public ExportBranchPage(String name, Branch branch) {
+ super(name);
+ this.branch = branch;
+
+ setTitle("Import OSEE Types");
+ setDescription("Import OSEE Types");
+ }
+
+ /**
+ * (non-Javadoc) Method declared on IDialogPage.
+ */
+ public void createControl(Composite parent) {
+
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ composite.setFont(parent.getFont());
+
+ createSourceGroup(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setPageComplete(determinePageCompletion());
+
+ setControl(composite);
+ }
+
+ /**
+ * The <code>WizardResourceImportPage</code> implementation of this <code>Listener</code> method handles all events
+ * and enablements for controls on this page. Subclasses may extend.
+ *
+ * @param event Event
+ */
+ public void handleEvent(Event event) {
+ setPageComplete(determinePageCompletion());
+ }
+
+ protected void createSourceGroup(Composite parent) {
+ directoryFileSelector = new DirectoryOrFileSelector(parent, SWT.NONE, "Export Destination", this);
+
+ // if (currentResourceSelection == null) {
+ // Select directory as the default
+ directoryFileSelector.setDirectorySelected(true);
+ // }
+ // else {
+ // directoryFileSelector.setDirectorySelected(currentResourceSelection.getType() != IResource.FILE);
+ // directoryFileSelector.setText(currentResourceSelection.getLocation().toString());
+ // }
+
+ setPageComplete(determinePageCompletion());
+ }
+
+ /*
+ * @see WizardPage#becomesVisible
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ // policy: wizards are not allowed to come up with an error message
+ if (visible) {
+ setErrorMessage(null);
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ return directoryFileSelector.validate(this);
+ }
+
+ public boolean finish() {
+ try {
+ // getSpecifiedContainer().getProject();
+
+ // File file = directoryFileSelector.getFile();
+ // Job job = new ImportMetaJob(file);
+ // job.setUser(true);
+ // job.setPriority(Job.LONG);
+ // job.schedule();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ ErrorDialog.openError(getShell(), "OSEE Import Error", "An error has occured while importing a document.",
+ new Status(IStatus.ERROR, "org.eclipse.osee.framework.jdk.core", IStatus.ERROR,
+ "Unknown exception occurred in the import", ex));
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchWizard.java
new file mode 100644
index 00000000000..1bb04ab8181
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/export/ExportBranchWizard.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.framework.ui.skynet.export;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ExportBranchWizard extends Wizard implements IExportWizard {
+ private ExportBranchPage mainPage;
+ private Branch defaultBranch;
+
+ public ExportBranchWizard() {
+ this(null);
+ }
+
+ public ExportBranchWizard(Branch defaultBranch) {
+ super();
+ this.defaultBranch = defaultBranch;
+
+ setWindowTitle("Skynet Branch Export Wizard");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ return mainPage.finish();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ /**
+ * (non-Javadoc) Method declared on Wizard.
+ */
+ public void addPages() {
+ mainPage = new ExportBranchPage("Export Branch", defaultBranch);
+ addPage(mainPage);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupContentProvider.java
new file mode 100644
index 00000000000..a514b4882c5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupContentProvider.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.framework.ui.skynet.group;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactChangeListener;
+
+/**
+ * The basis for the comments in this class can be found at
+ * http://www.eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
+ *
+ * @author Donald G. Dunne
+ */
+public class GroupContentProvider implements ITreeContentProvider, ArtifactChangeListener {
+ protected TreeViewer viewer;
+
+ public GroupContentProvider(GroupExplorer groupExplorer) {
+ }
+
+ public void dispose() {
+ }
+
+ /**
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = (TreeViewer) viewer;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof GroupExplorerItem) return ((GroupExplorerItem) parentElement).getGroupItems().toArray();
+ return new Object[] {};
+ }
+
+ /*
+ * @see ITreeContentProvider#getParent(Object)
+ */
+ public Object getParent(Object element) {
+ if (element instanceof GroupExplorerItem) return ((GroupExplorerItem) element).getParentItem();
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorer.java
new file mode 100644
index 00000000000..8d80d95ca74
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorer.java
@@ -0,0 +1,546 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.group;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OpenWithMenuListener;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener;
+import org.eclipse.osee.framework.ui.skynet.menu.ArtifactTreeViewerGlobalMenuHelper;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenuPermissions;
+import org.eclipse.osee.framework.ui.skynet.menu.IGlobalMenuHelper;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+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.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GroupExplorer extends ViewPart implements IFrameworkTransactionEventListener, IActionable, IRebuildMenuListener {
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.group.GroupExplorer";
+ private GroupTreeViewer treeViewer;
+ private Artifact rootArt;
+ private GroupExplorerItem rootItem;
+ private Collection<GroupExplorerItem> selected;
+ private Object[] expanded = new Object[] {};
+ private XBranchSelectWidget branchSelect;
+ private Branch branch;
+ private GroupExplorerDragAndDrop groupExpDnd;
+
+ private NeedProjectMenuListener needProjectListener;
+ private MenuItem openWithMenuItem;
+ private MenuItem openMenuItem;
+ IGlobalMenuHelper globalMenuHelper;
+
+ public GroupExplorer() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(parent)) return;
+
+ GridData gridData = new GridData();
+ gridData.verticalAlignment = GridData.FILL;
+ gridData.horizontalAlignment = GridData.FILL;
+ gridData.grabExcessVerticalSpace = true;
+ gridData.grabExcessHorizontalSpace = true;
+
+ GridLayout gridLayout = new GridLayout(1, false);
+ gridData.heightHint = 1000;
+ gridData.widthHint = 1000;
+
+ parent.setLayout(gridLayout);
+ parent.setLayoutData(gridData);
+
+ branchSelect = new XBranchSelectWidget("");
+ branchSelect.setDisplayLabel(false);
+ branch = BranchManager.getLastBranch();
+ branchSelect.setBranch(branch);
+ branchSelect.createWidgets(parent, 1);
+
+ branchSelect.addListener(new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ branch = branchSelect.getData();
+ refresh();
+ groupExpDnd.setBranch(branch);
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+ });
+
+ treeViewer = new GroupTreeViewer(this, parent);
+ treeViewer.setContentProvider(new GroupContentProvider(this));
+ treeViewer.setLabelProvider(new GroupLabelProvider());
+ treeViewer.setUseHashlookup(true);
+ treeViewer.getTree().addListener(SWT.MouseDoubleClick, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ handleDoubleClick();
+ }
+ });
+ treeViewer.getControl().setLayoutData(gridData);
+
+ globalMenuHelper = new ArtifactTreeViewerGlobalMenuHelper(treeViewer);
+ OseeContributionItem.addTo(this, true);
+
+ OseeEventManager.addListener(this);
+
+ groupExpDnd = new GroupExplorerDragAndDrop(treeViewer, VIEW_ID, branch);
+
+ getSite().setSelectionProvider(treeViewer);
+ parent.layout();
+ createActions();
+ setupPopupMenu();
+ refresh();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener#rebuild()
+ */
+ @Override
+ public void rebuildMenu() {
+ setupPopupMenu();
+ }
+
+ public void setupPopupMenu() {
+
+ Menu popupMenu = new Menu(treeViewer.getTree().getParent());
+ needProjectListener = new NeedProjectMenuListener();
+ popupMenu.addMenuListener(needProjectListener);
+
+ createOpenMenuItem(popupMenu);
+ createOpenWithMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+
+ MenuItem item = new MenuItem(popupMenu, SWT.PUSH);
+ item.setText("&Remove from Group");
+ item.setEnabled(isOnlyGroupItemsSelected());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleRemoveFromGroup();
+ }
+ });
+
+ item = new MenuItem(popupMenu, SWT.PUSH);
+ item.setText("&Delete Group");
+ item.setEnabled(isOnlyGroupsSelected());
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleDeleteGroup();
+ }
+ });
+
+ item = new MenuItem(popupMenu, SWT.PUSH);
+ item.setText("&New Group");
+ item.setEnabled(true);
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleNewGroup();
+ }
+ });
+
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+
+ item = new MenuItem(popupMenu, SWT.PUSH);
+ item.setText("&Select All\tCtrl+A");
+ item.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ treeViewer.getTree().selectAll();
+ }
+ });
+
+ item = new MenuItem(popupMenu, SWT.PUSH);
+ item.setText("Expand All\tCtrl+X");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ expandAll((IStructuredSelection) treeViewer.getSelection());
+ }
+ });
+
+ treeViewer.getTree().setMenu(popupMenu);
+ }
+
+ private void createOpenMenuItem(Menu parentMenu) {
+ openMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ openMenuItem.setText("&Open");
+
+ ArtifactMenuListener listener = new ArtifactMenuListener();
+ parentMenu.addMenuListener(listener);
+ openMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ for (Artifact art : getSelectedArtifacts()) {
+ RendererManager.openInJob(art, PresentationType.GENERALIZED_EDIT);
+ }
+ }
+ });
+ }
+
+ private void createOpenWithMenuItem(Menu parentMenu) {
+ openWithMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ openWithMenuItem.setText("&Open With");
+ final Menu submenu = new Menu(openWithMenuItem);
+ openWithMenuItem.setMenu(submenu);
+ parentMenu.addMenuListener(new OpenWithMenuListener(submenu, treeViewer, this));
+ }
+ /**
+ * @author Jeff C. Phillips
+ */
+ public class ArtifactMenuListener implements MenuListener {
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ // Use this menu listener until all menu items can be moved to
+ // GlobaMenu
+ try {
+ GlobalMenuPermissions permiss = new GlobalMenuPermissions(globalMenuHelper);
+ openMenuItem.setEnabled(permiss.isReadPermission());
+ openWithMenuItem.setEnabled(permiss.isReadPermission());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+ }
+
+ private void handleDoubleClick() {
+ GroupExplorerItem item = getSelectedItem();
+ if (item != null) {
+ RendererManager.openInJob(item.getArtifact(), PresentationType.GENERALIZED_EDIT);
+ }
+ }
+
+ protected void createActions() {
+ Action refreshAction = new Action("Refresh", Action.AS_PUSH_BUTTON) {
+
+ @Override
+ public void run() {
+ refresh();
+ }
+ };
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ refreshAction.setToolTipText("Refresh");
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(refreshAction);
+
+ // IMenuManager manager = getViewSite().getActionBars().getMenuManager();
+
+ OseeAts.addBugToViewToolbar(this, this, SkynetGuiPlugin.getInstance(), VIEW_ID, "Group Explorer");
+ }
+
+ private void handleNewGroup() {
+ EntryDialog ed =
+ new EntryDialog(Display.getCurrent().getActiveShell(), "Create New Group", null, "Enter Group Name",
+ MessageDialog.QUESTION, new String[] {"OK", "Cancel"}, 0);
+ if (ed.open() == 0) {
+ try {
+ UniversalGroup.addGroup(ed.getEntry(), branch);
+ treeViewer.refresh();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private void handleRemoveFromGroup() {
+ final List<GroupExplorerItem> items = getSelectedItems();
+ if (items.size() == 0) {
+ AWorkbench.popup("ERROR", "No Items Selected");
+ return;
+ }
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Remove From Group",
+ "Remove From Group - (Artifacts will not be deleted)\n\nAre you sure?")) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ for (GroupExplorerItem item : items) {
+ item.getArtifact().deleteRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__GROUP,
+ item.getParentItem().getArtifact());
+ item.getArtifact().persistRelations(transaction);
+ }
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private void handleDeleteGroup() {
+ final ArrayList<GroupExplorerItem> items = getSelectedUniversalGroupItems();
+ if (items.size() == 0) {
+ AWorkbench.popup("ERROR", "No Groups Selected");
+ return;
+ }
+ String names = "";
+ for (GroupExplorerItem item : items)
+ if (item.isUniversalGroup()) names += String.format("%s\n", item.getArtifact().getDescriptiveName());
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Delete Groups",
+ "Delete Groups - (Contained Artifacts will not be deleted)\n\n" + names + "\nAre you sure?")) {
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ for (GroupExplorerItem item : items) {
+ item.getArtifact().deleteAndPersist(transaction);
+ }
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public void storeExpandedAndSelection() {
+ // System.out.println("GE: storeExpandedAndSelection");
+ // Store selected so can re-select after event re-draw
+ selected = getSelectedItems();
+ if (treeViewer != null && !treeViewer.getTree().isDisposed()) {
+ expanded = treeViewer.getExpandedElements();
+ }
+ }
+
+ public void restoreExpandedAndSelection() {
+ // System.out.println("GE: restoreExpandedAndSelection");
+ if (expanded != null && expanded.length > 0 && rootArt != null) {
+ treeViewer.setExpandedElements(expanded);
+ }
+ if (selected != null && selected.size() > 0 && rootArt != null) {
+ treeViewer.setSelection(new StructuredSelection(selected.toArray(new Object[selected.size()])));
+ }
+ }
+
+ public GroupExplorerItem getSelectedItem() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> itemsIter = selection.iterator();
+ if (itemsIter.hasNext()) return (GroupExplorerItem) itemsIter.next();
+ return null;
+ }
+
+ private Collection<Artifact> getSelectedArtifacts() {
+ Set<Artifact> arts = new HashSet<Artifact>();
+ for (GroupExplorerItem item : getSelectedItems()) {
+ arts.add(item.getArtifact());
+ }
+ return arts;
+ }
+
+ private ArrayList<GroupExplorerItem> getSelectedItems() {
+ ArrayList<GroupExplorerItem> arts = new ArrayList<GroupExplorerItem>();
+ Iterator<?> i = ((IStructuredSelection) treeViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof GroupExplorerItem) {
+ arts.add((GroupExplorerItem) obj);
+ }
+ }
+ return arts;
+ }
+
+ private ArrayList<GroupExplorerItem> getSelectedUniversalGroupItems() {
+ ArrayList<GroupExplorerItem> arts = new ArrayList<GroupExplorerItem>();
+ Iterator<?> i = ((IStructuredSelection) treeViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof GroupExplorerItem && ((GroupExplorerItem) obj).isUniversalGroup()) {
+ arts.add((GroupExplorerItem) obj);
+ }
+ }
+ return arts;
+ }
+
+ private boolean isOnlyGroupsSelected() {
+ if (getSelectedItems().size() == 0) return false;
+ for (GroupExplorerItem item : getSelectedItems()) {
+ if (!item.isUniversalGroup()) return false;
+ }
+ return true;
+ }
+
+ private boolean isOnlyGroupItemsSelected() {
+ if (getSelectedItems().size() == 0) return false;
+ for (GroupExplorerItem item : getSelectedItems()) {
+ if (item.isUniversalGroup()) return false;
+ }
+ return true;
+ }
+
+ private void expandAll(IStructuredSelection selection) {
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ treeViewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPart#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ }
+
+ public void refresh() {
+ // System.out.println("GE: refresh");
+ if (rootItem != null) {
+ rootItem.dispose();
+ }
+
+ Artifact topArt = null;
+ try {
+ topArt = UniversalGroup.getTopUniversalGroupArtifact(branch);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ if (topArt == null) {
+ rootArt = null;
+ rootItem = null;
+ } else {
+ rootArt = topArt;
+ rootItem = new GroupExplorerItem(treeViewer, rootArt, null, this);
+ rootItem.getGroupItems();
+ }
+
+ if (treeViewer != null) treeViewer.setInput(rootItem);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (rootArt != null && transData.branchId != rootArt.getBranch().getBranchId()) return;
+ try {
+ Artifact topArt = UniversalGroup.getTopUniversalGroupArtifact(branch);
+ if (topArt != null) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ storeExpandedAndSelection();
+ refresh();
+ restoreExpandedAndSelection();
+ }
+ });
+ return;
+ }
+ } catch (Exception ex) {
+ // do nothing
+ }
+ }
+ private class NeedProjectMenuListener implements MenuListener {
+ Collection<MenuItem> items;
+
+ public NeedProjectMenuListener() {
+ this.items = new LinkedList<MenuItem>();
+ }
+
+ public void add(MenuItem item) {
+ items.add(item);
+ }
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ boolean valid = treeViewer.getInput() != null;
+ for (MenuItem item : items) {
+ if (!(item.getData() instanceof Exception)) {
+ // Only modify
+ // enabling if no
+ // error is
+ // associated
+ item.setEnabled(valid);
+ }
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerDragAndDrop.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerDragAndDrop.java
new file mode 100644
index 00000000000..b09388fffcb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerDragAndDrop.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.group;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GroupExplorerDragAndDrop extends SkynetDragAndDrop {
+
+ boolean isFeedbackAfter = false;
+ private final TreeViewer treeViewer;
+ private final String viewId;
+ private boolean isCtrlPressed = false;
+ private Branch branch;
+
+ public GroupExplorerDragAndDrop(TreeViewer treeViewer, String viewId, Branch branch) {
+ super(treeViewer.getTree(), viewId);
+ this.treeViewer = treeViewer;
+ this.viewId = viewId;
+ this.branch = branch;
+ treeViewer.getTree().addKeyListener(new keySelectedListener());
+ }
+ private class keySelectedListener implements KeyListener {
+ public void keyPressed(KeyEvent e) {
+ isCtrlPressed = (e.keyCode == SWT.CONTROL);
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.keyCode == 'a' && e.stateMask == SWT.CONTROL) {
+ treeViewer.getTree().selectAll();
+ }
+ if (e.keyCode == 'x' && e.stateMask == SWT.CONTROL) {
+ expandAll((IStructuredSelection) treeViewer.getSelection());
+ }
+ isCtrlPressed = !(e.keyCode == SWT.CONTROL);
+ }
+ }
+
+ private void expandAll(IStructuredSelection selection) {
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ treeViewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> i = selection.iterator();
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ while (i.hasNext()) {
+ Object object = i.next();
+ if (object instanceof GroupExplorerItem) {
+ artifacts.add(((GroupExplorerItem) object).getArtifact());
+ }
+ }
+ return artifacts.toArray(new Artifact[artifacts.size()]);
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ if (!ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+ final ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType);
+ if (artData == null) {
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+ for (Artifact art : artData.getArtifacts()) {
+ if (art.getArtifactTypeName().equals(UniversalGroup.ARTIFACT_TYPE_NAME)) {
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+ }
+ Tree tree = treeViewer.getTree();
+ TreeItem dragOverTreeItem = tree.getItem(treeViewer.getTree().toControl(event.x, event.y));
+
+ event.feedback = DND.FEEDBACK_EXPAND;
+ event.detail = DND.DROP_NONE;
+
+ // Set as COPY if drag item over group (copy versus move will be determined on drop
+ if (dragOverTreeItem != null && ((GroupExplorerItem) dragOverTreeItem.getData()).isUniversalGroup()) {
+ event.detail = DND.DROP_COPY;
+ tree.setInsertMark(null, false);
+ }
+ // Handle re-ordering within same group
+ else if (dragOverTreeItem != null && !((GroupExplorerItem) dragOverTreeItem.getData()).isUniversalGroup()) {
+ GroupExplorerItem dragOverGroupItem = (GroupExplorerItem) dragOverTreeItem.getData();
+ IStructuredSelection selectedItem = (IStructuredSelection) treeViewer.getSelection();
+ Object obj = selectedItem.getFirstElement();
+ if (obj instanceof GroupExplorerItem) {
+ GroupExplorerItem droppingGroupItem = (GroupExplorerItem) obj;
+
+ // the group to move must belong to the same group as the member to insert before/after
+ if ((dragOverGroupItem.getParentItem()).equals(droppingGroupItem.getParentItem())) {
+ if (isFeedbackAfter) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ } else {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.detail = DND.DROP_MOVE;
+ }
+ } else {
+ if (isFeedbackAfter) {
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ } else {
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ event.detail = DND.DROP_COPY;
+ }
+ } else {
+ tree.setInsertMark(null, false);
+ }
+ }
+
+ @Override
+ public void operationChanged(DropTargetEvent event) {
+ if (!isCtrlPressed(event)) {
+ isFeedbackAfter = false;
+ }
+ }
+
+ private boolean isCtrlPressed(DropTargetEvent event) {
+ boolean ctrPressed = (event.detail == 1);
+
+ if (ctrPressed) {
+ isFeedbackAfter = true;
+ }
+ return ctrPressed;
+ }
+
+ @Override
+ public void performDrop(DropTargetEvent event) {
+ try {
+ TreeItem dragOverTreeITem = treeViewer.getTree().getItem(treeViewer.getTree().toControl(event.x, event.y));
+
+ // This should always be true as all items are Group Explorer Items
+ if (dragOverTreeITem.getData() instanceof GroupExplorerItem) {
+ final GroupExplorerItem dragOverExplorerItem = (GroupExplorerItem) dragOverTreeITem.getData();
+
+ // Drag item dropped ON universal group item
+ if (dragOverExplorerItem.isUniversalGroup()) {
+
+ // Drag item came from inside Group Explorer
+ if (event.data instanceof ArtifactData) {
+ // If event originated outside, it's a copy event;
+ // OR if event is inside and ctrl is down, this is a copy; add items to group
+ if (!((ArtifactData) event.data).getSource().equals(viewId) || (((ArtifactData) event.data).getSource().equals(
+ viewId) && isCtrlPressed)) {
+ copyArtifactsToGroup(event, dragOverExplorerItem);
+ }
+ // Else this is a move
+ else {
+ IStructuredSelection selectedItem = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> iterator = selectedItem.iterator();
+ final Set<Artifact> insertArts = new HashSet<Artifact>();
+ while (iterator.hasNext()) {
+ Object obj = iterator.next();
+ if (obj instanceof GroupExplorerItem) {
+ insertArts.add(((GroupExplorerItem) obj).getArtifact());
+ }
+ }
+ GroupExplorerItem parentUnivGroupItem =
+ ((GroupExplorerItem) selectedItem.getFirstElement()).getParentItem();
+ final Artifact parentArtifact = parentUnivGroupItem.getArtifact();
+ final Artifact targetArtifact = dragOverExplorerItem.getArtifact();
+
+ for (Artifact artifact : insertArts) {
+ // Remove item from old group
+ parentArtifact.deleteRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, artifact);
+ // Add items to new group
+ targetArtifact.addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, artifact);
+ }
+ Artifacts.persistInTransaction(parentArtifact, targetArtifact);
+ }
+ }
+ }
+ // Drag item dropped before or after group member
+ else if (!dragOverExplorerItem.isUniversalGroup()) {
+
+ if (event.data instanceof ArtifactData) {
+
+ GroupExplorerItem parentUnivGroupItem = null;
+ // Drag item came from inside Group Explorer
+ if (((ArtifactData) event.data).getSource().equals(viewId)) {
+ IStructuredSelection selectedItem = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> iterator = selectedItem.iterator();
+ Set<Artifact> insertArts = new HashSet<Artifact>();
+ while (iterator.hasNext()) {
+ Object obj = iterator.next();
+ if (obj instanceof GroupExplorerItem) {
+ insertArts.add(((GroupExplorerItem) obj).getArtifact());
+ }
+ }
+ parentUnivGroupItem = ((GroupExplorerItem) selectedItem.getFirstElement()).getParentItem();
+ insertArts.toArray(new Artifact[insertArts.size()]);
+
+ Artifact parentArtifact = parentUnivGroupItem.getArtifact();
+ Artifact targetArtifact = dragOverExplorerItem.getArtifact();
+
+ for (Artifact art : insertArts) {
+ parentArtifact.setRelationOrder(targetArtifact, isFeedbackAfter,
+ CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, art);
+ targetArtifact = art;
+ }
+ parentArtifact.persistRelations();
+ }
+ // Drag item came from outside Group Explorer
+ else {
+ List<Artifact> insertArts = Arrays.asList(((ArtifactData) event.data).getArtifacts());
+ parentUnivGroupItem = dragOverExplorerItem.getParentItem();
+ insertArts.toArray(new Artifact[insertArts.size()]);
+
+ Artifact parentArtifact = parentUnivGroupItem.getArtifact();
+ Artifact targetArtifact = dragOverExplorerItem.getArtifact();
+
+ for (Artifact art : insertArts) {
+ parentArtifact.addRelation(targetArtifact, isFeedbackAfter,
+ CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, art, "");
+ targetArtifact = art;
+ }
+ parentArtifact.persistRelations();
+ }
+ }
+ }
+ treeViewer.refresh(dragOverExplorerItem);
+ }
+
+ isFeedbackAfter = false;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void copyArtifactsToGroup(DropTargetEvent event, final GroupExplorerItem dragOverExplorerItem) {
+ // Items dropped on Group; simply add items to group
+ final Artifact[] artsToRelate = ((ArtifactData) event.data).getArtifacts();
+ boolean alreadyRelated = true;
+ for (Artifact artifact : artsToRelate) {
+ if (!dragOverExplorerItem.contains(artifact)) {
+ alreadyRelated = false;
+ break;
+ }
+ }
+ if (alreadyRelated) {
+ AWorkbench.popup("ERROR", "Artifact(s) already related.");
+ return;
+ }
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+
+ for (Artifact art : artsToRelate) {
+ if (!dragOverExplorerItem.contains(art)) {
+ dragOverExplorerItem.getArtifact().addRelation(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS, art);
+ }
+ }
+ dragOverExplorerItem.getArtifact().persistRelations(transaction);
+
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void setBranch(Branch branch) {
+ this.branch = branch;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerItem.java
new file mode 100644
index 00000000000..b32e12bf9b8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupExplorerItem.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.group;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GroupExplorerItem implements IAdaptable {
+
+ private final Artifact artifact;
+ private final TreeViewer treeViewer;
+ private final GroupExplorerItem parentItem;
+ private List<GroupExplorerItem> groupItems;
+ private final GroupExplorer groupExplorer;
+
+ public GroupExplorerItem(TreeViewer treeViewer, Artifact artifact, GroupExplorerItem parentItem, GroupExplorer groupExplorer) {
+ this.treeViewer = treeViewer;
+ this.artifact = artifact;
+ this.parentItem = parentItem;
+ this.groupExplorer = groupExplorer;
+ }
+
+ @Override
+ public String toString() {
+ return "\"" + artifact.getDescriptiveName() + "\" - " + groupItems.size();
+ }
+
+ public boolean contains(Artifact artifact) {
+ for (GroupExplorerItem item : getGroupItems()) {
+ if (item.getArtifact() != null && item.getArtifact().equals(artifact)) return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param artifact to match with
+ * @return UGI that contains artifact
+ */
+ public GroupExplorerItem getItem(Artifact artifact) {
+ if (this.artifact != null && this.artifact.equals(artifact)) return this;
+ for (GroupExplorerItem item : getGroupItems()) {
+ GroupExplorerItem ugi = item.getItem(artifact);
+ if (ugi != null) return ugi;
+ }
+ return null;
+ }
+
+ public void dispose() {
+ if (groupItems != null) for (GroupExplorerItem item : groupItems)
+ item.dispose();
+ }
+
+ public boolean isUniversalGroup() {
+ if (artifact == null || artifact.isDeleted()) return false;
+ return artifact.getArtifactTypeName().equals("Universal Group");
+ }
+
+ public String getTableArtifactType() {
+ return artifact.getArtifactTypeName();
+ }
+
+ public String getTableArtifactName() {
+ return artifact.getDescriptiveName();
+ }
+
+ public String getTableArtifactDescription() {
+ return null;
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ public List<GroupExplorerItem> getGroupItems() {
+ // Light loading; load the first time getChildren is called
+ if (groupItems == null) {
+ groupItems = new ArrayList<GroupExplorerItem>();
+ populateUpdateCategory();
+ }
+ List<GroupExplorerItem> items = new ArrayList<GroupExplorerItem>();
+ if (groupItems != null) items.addAll(groupItems);
+ return items;
+ }
+
+ /**
+ * Populate/Update this category with it's necessary children items
+ */
+ public void populateUpdateCategory() {
+ try {
+ for (GroupExplorerItem item : getGroupItems()) {
+ removeGroupItem(item);
+ }
+ for (Artifact art : artifact.getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS)) {
+ addGroupItem(new GroupExplorerItem(treeViewer, art, this, groupExplorer));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void addGroupItem(GroupExplorerItem item) {
+ if (!groupItems.contains(item)) {
+ groupItems.add(item);
+ }
+ }
+
+ public void removeGroupItem(GroupExplorerItem item) {
+ item.dispose();
+ groupItems.remove(item);
+ }
+
+ public GroupExplorerItem getParentItem() {
+ return parentItem;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof GroupExplorerItem) {
+ if (!artifact.getGuid().equals(((GroupExplorerItem) obj).getArtifact().getGuid())) {
+ return false;
+ }
+ if (((GroupExplorerItem) obj).getParentItem() == null && getParentItem() == null) {
+ return true;
+ }
+ if (((GroupExplorerItem) obj).getParentItem() != null && getParentItem() != null) {
+ return ((GroupExplorerItem) obj).getParentItem().equals(getParentItem());
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return artifact.getGuid().hashCode() + (getParentItem() != null ? getParentItem().getArtifact().getGuid().hashCode() : 0);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == null) throw new IllegalArgumentException("adapter can not be null");
+
+ if (adapter == Artifact.class) {
+ return getArtifact();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupLabelProvider.java
new file mode 100644
index 00000000000..14f442381ce
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupLabelProvider.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.framework.ui.skynet.group;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Image;
+
+public class GroupLabelProvider extends LabelProvider {
+ private static final OseeUiActivator plugin = SkynetGuiPlugin.getInstance();
+
+ public GroupLabelProvider() {
+ super();
+ }
+
+ /*
+ * @see ILabelProvider#getImage(Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof GroupExplorerItem) {
+ GroupExplorerItem item = (GroupExplorerItem) element;
+ return ImageManager.getImage(item.getArtifact());
+ }
+ return ImageManager.getImage(FrameworkImage.MISSING);
+ }
+
+ /*
+ * @see ILabelProvider#getText(Object)
+ */
+ @Override
+ public String getText(Object element) {
+ if (element instanceof GroupExplorerItem) {
+ GroupExplorerItem item = (GroupExplorerItem) element;
+ Artifact artifact = item.getArtifact();
+ if (artifact.isDeleted()) throw new IllegalArgumentException("Can not display a deleted artifact");
+
+ try {
+ if (artifact instanceof IGroupExplorerProvider) {
+ return ((IGroupExplorerProvider) artifact).getGroupExplorerName();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE, ex);
+ }
+ String name = artifact.getDescriptiveName();
+ if (name == null) {
+ return "";
+ }
+ return name;
+ }
+ throw new IllegalArgumentException("wrong type: " + element.getClass().getName());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupTreeViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupTreeViewer.java
new file mode 100644
index 00000000000..bcd023ecf48
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/GroupTreeViewer.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.framework.ui.skynet.group;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GroupTreeViewer extends TreeViewer {
+
+ private final GroupExplorer groupExplorer;
+
+ /**
+ * @param parent
+ */
+ public GroupTreeViewer(GroupExplorer groupExplorer, Composite parent) {
+ super(parent);
+ this.groupExplorer = groupExplorer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.StructuredViewer#refresh()
+ */
+ @Override
+ public void refresh() {
+ super.refresh();
+ // System.out.println("TreeViewer: refresh");
+ groupExplorer.restoreExpandedAndSelection();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.StructuredViewer#refresh(boolean)
+ */
+ @Override
+ public void refresh(boolean updateLabels) {
+ super.refresh(updateLabels);
+ // System.out.println("TreeViewer: refresh(updateLabels)");
+ groupExplorer.restoreExpandedAndSelection();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/IGroupExplorerProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/IGroupExplorerProvider.java
new file mode 100644
index 00000000000..5d7306f41d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/group/IGroupExplorerProvider.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.framework.ui.skynet.group;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IGroupExplorerProvider {
+
+ public String getGroupExplorerName() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/ArtifactChangeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/ArtifactChangeHandler.java
new file mode 100644
index 00000000000..bb4049745c0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/ArtifactChangeHandler.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.skynet.handler;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactChangeHandler implements IStatusHandler {
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
+ */
+ @Override
+ public Object handleStatus(IStatus status, Object source) throws CoreException {
+ return MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Confirm Artifact Type Change ", (String) source);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/GeneralWordOutlineHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/GeneralWordOutlineHandler.java
new file mode 100644
index 00000000000..2130f53e9eb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/GeneralWordOutlineHandler.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.handler;
+
+import java.util.HashMap;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.Import.RoughArtifact;
+import org.eclipse.osee.framework.ui.skynet.Import.RoughArtifactKind;
+import org.eclipse.osee.framework.ui.skynet.Import.WordOutlineContentHandler;
+import org.eclipse.osee.framework.ui.skynet.Import.WordOutlineExtractor;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class GeneralWordOutlineHandler extends WordOutlineContentHandler {
+ private static final Pattern listPrKiller =
+ Pattern.compile("<((\\w+:)?listPr)(\\s+.*?)((/>)|(>(.*?)</\\1>))",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private HashMap<String, RoughArtifact> duplicateCatcher;
+
+ private RoughArtifact previousNamedArtifact;
+ private RoughArtifact roughArtifact;
+ private StringBuilder wordFormattedContent;
+ private String lastHeaderNumber;
+
+ /**
+ * Subclasses may extend this method to allocate resources
+ */
+ @Override
+ public void init(WordOutlineExtractor extractor) {
+ super.init(extractor);
+
+ duplicateCatcher = new HashMap<String, RoughArtifact>();
+ lastHeaderNumber = null;
+ previousNamedArtifact = null;
+ roughArtifact = null;
+ wordFormattedContent = new StringBuilder();
+ }
+
+ /**
+ * Sublcasses may extend this method to dispose resources.
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ duplicateCatcher = null;
+ lastHeaderNumber = null;
+ previousNamedArtifact = null;
+ roughArtifact = null;
+ }
+
+ public final void processContent(boolean forceBody, boolean forcePrimaryType, String headerNumber, String listIdentifier, String paragraphStyle, String content, boolean isParagraph, Branch branch) {
+ if (!headerNumber.equals("")) {
+ lastHeaderNumber = headerNumber;
+ }
+
+ if (!headerNumber.equals("") && WordUtil.isHeadingStyle(paragraphStyle) && !WordUtil.textOnly(content).equals("")) {
+ setContent();
+ roughArtifact = setUpNewArtifact(headerNumber, branch);
+ previousNamedArtifact = roughArtifact;
+
+ processHeadingText(roughArtifact, WordUtil.textOnly(content));
+ } else if (!listIdentifier.equals("") && !forceBody) {
+ String proNumber = lastHeaderNumber + "." + listIdentifier;
+
+ content = listPrKiller.matcher(content).replaceAll("");
+ roughArtifact.addAttribute("Name", proNumber);
+ } else if (roughArtifact != null) {
+ wordFormattedContent.append(content);
+ }
+ }
+
+ public void setContent() {
+ if (roughArtifact != null) {
+ roughArtifact.addAttribute(WordAttribute.WORD_TEMPLATE_CONTENT, wordFormattedContent.toString());
+ wordFormattedContent.setLength(0);
+ }
+ }
+
+ /**
+ * Subclasses can override this method to handle how heading text is applied to the roughArtifact
+ *
+ * @param artifact
+ * @param headingText
+ */
+ public void processHeadingText(RoughArtifact roughArtifact, String headingText) {
+ roughArtifact.addAttribute("Name", headingText.trim());
+ }
+
+ private RoughArtifact setUpNewArtifact(String parNumber, Branch branch) {
+ RoughArtifact duplicateArtifact = duplicateCatcher.get(parNumber);
+ if (duplicateArtifact == null) {
+ RoughArtifact roughArtifact = new RoughArtifact(RoughArtifactKind.PRIMARY, branch);
+ duplicateCatcher.put(parNumber, roughArtifact);
+
+ extractor.addRoughArtifact(roughArtifact);
+ roughArtifact.setSectionNumber(parNumber);
+
+ roughArtifact.addAttribute("Imported Paragraph Number", parNumber);
+
+ return roughArtifact;
+ } else {
+ throw new IllegalStateException(String.format(
+ "Paragraph %s found more than once following \"%s\" which is a duplicate of %s", parNumber,
+ previousNamedArtifact.getName(), duplicateArtifact.getName()));
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/SoftwareRequirementHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/SoftwareRequirementHandler.java
new file mode 100644
index 00000000000..5d3cca15be7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/handler/SoftwareRequirementHandler.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.framework.ui.skynet.handler;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.ui.skynet.Import.RoughArtifact;
+import org.eclipse.osee.framework.ui.skynet.Import.RoughArtifactKind;
+
+/**
+ * @author Robert A. Fisher
+ */
+public abstract class SoftwareRequirementHandler extends GeneralWordOutlineHandler {
+ private static final Pattern partitionPattern = Pattern.compile("\\[([\\w\\(|\\)]+)\\]");
+
+ private final String attributeName;
+
+ public SoftwareRequirementHandler(String attributeName) {
+ this.attributeName = attributeName;
+ }
+
+ @Override
+ public void processHeadingText(RoughArtifact roughArtifact, String headingText) {
+ StringBuilder text = new StringBuilder(headingText);
+ Matcher matcher = partitionPattern.matcher(text);
+ boolean isRequirement = false;
+
+ while (matcher.find()) {
+ isRequirement = true;
+
+ roughArtifact.addAttribute(attributeName, matcher.group(1).trim());
+ text.delete(matcher.start(), matcher.end());
+ matcher.reset(text);
+ }
+
+ if (!isRequirement) {
+ roughArtifact.setRoughArtifactKind(RoughArtifactKind.SECONDARY);
+ }
+
+ roughArtifact.addAttribute("Name", text.toString().trim());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/listener/IRebuildMenuListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/listener/IRebuildMenuListener.java
new file mode 100644
index 00000000000..872ed856d65
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/listener/IRebuildMenuListener.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.framework.ui.skynet.listener;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public interface IRebuildMenuListener {
+
+ public void rebuildMenu();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactDiffMenu.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactDiffMenu.java
new file mode 100644
index 00000000000..1e78eba6ac5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactDiffMenu.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.menu;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.revision.HistoryTransactionItem;
+import org.eclipse.osee.framework.skynet.core.revision.TransactionData;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactDiffMenu {
+
+ public enum DiffTypes {
+ CONFLICT, PARENT
+ }
+
+ private static final String DIFF_ARTIFACT = "DIFF_ARTIFACT";
+ private static boolean validSelection;
+ private static Object firstSelection;
+ private static Object secondSelection;
+
+ public static void createDiffMenuItem(Menu parentMenu, final Viewer viewer, String subMenuText, final DiffTypes diffType) {
+ final MenuItem diffMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ diffMenuItem.setText(subMenuText);
+ diffMenuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent ev) {
+ try {
+ processSelectedArtifacts(DIFF_ARTIFACT, viewer, diffType);
+ } catch (Exception ex) {
+ }
+ }
+ });
+
+ parentMenu.addMenuListener(new MenuListener() {
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ validSelection = false;
+
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+
+ if (!selection.isEmpty()) {
+ if (selection.size() == 2) {
+ validSelection = validateTransactionData(viewer, selection);
+ }
+ }
+ diffMenuItem.setEnabled(validSelection);
+ }
+ });
+ }
+
+ private static boolean validateTransactionData(Viewer viewer, IStructuredSelection selection) {
+ boolean valid = false;
+ Object[] selections = selection.toArray();
+
+ if (selections[1] instanceof HistoryTransactionItem && selections[0] instanceof HistoryTransactionItem) {
+ try {
+ valid = (RendererManager.getBestFileRenderer(PresentationType.DIFF, ((HistoryTransactionItem)selections[0]).getTransactionData().getArtifact()).supportsCompare());
+ } catch (OseeCoreException ex) {
+ }
+ }
+ return valid;
+ }
+
+ private static void processSelectedArtifacts(String option, Viewer viewer, DiffTypes type) throws Exception {
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+ Artifact newerArtifact = null;
+ Artifact baselineArtifact = null;
+
+ if (selection.size() == 2) {
+ Object[] selections = selection.toArray();
+ firstSelection = selections[0];
+ secondSelection = selections[1];
+
+ if (firstSelection instanceof HistoryTransactionItem && secondSelection instanceof HistoryTransactionItem) {
+
+ TransactionData firstTransactionData = ((HistoryTransactionItem) firstSelection).getTransactionData();
+ TransactionData secondTransactionData = ((HistoryTransactionItem) secondSelection).getTransactionData();
+
+ if (firstTransactionData.getTransactionId().getTransactionNumber() < secondTransactionData.getTransactionId().getTransactionNumber()) {
+ firstTransactionData = ((HistoryTransactionItem) secondSelection).getTransactionData();
+ secondTransactionData = ((HistoryTransactionItem) firstSelection).getTransactionData();
+ }
+ newerArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(firstTransactionData.getAssociatedArtId(),
+ firstTransactionData.getTransactionId());
+ baselineArtifact =
+ ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ secondTransactionData.getAssociatedArtId(), secondTransactionData.getTransactionId());
+ }
+ }
+ RendererManager.diffInJob(baselineArtifact, newerArtifact);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTableViewerGlobalMenuHelper.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTableViewerGlobalMenuHelper.java
new file mode 100644
index 00000000000..730c7df9d09
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTableViewerGlobalMenuHelper.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.framework.ui.skynet.menu;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenu.GlobalMenuItem;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactTableViewerGlobalMenuHelper implements IGlobalMenuHelper {
+
+ private final org.eclipse.jface.viewers.TableViewer tableViewer;
+
+ public ArtifactTableViewerGlobalMenuHelper(TableViewer tableViewer) {
+ this.tableViewer = tableViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.menu.IGlobalMenuHelper#getSelectedArtifacts()
+ */
+ public Collection<Artifact> getArtifacts() {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ if (tableViewer == null || tableViewer.getTable().isDisposed()) return artifacts;
+ IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
+ Iterator<?> iterator = selection.iterator();
+ while (iterator.hasNext()) {
+ Object obj = iterator.next();
+ if (obj instanceof Artifact)
+ artifacts.add((Artifact) obj);
+ else if ((obj instanceof Match) && (((Match) obj).getElement() instanceof Artifact)) artifacts.add((Artifact) ((Match) obj).getElement());
+ }
+ return artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.menu.IGlobalMenuHelper#getValidMenuItems()
+ */
+ public Collection<GlobalMenuItem> getValidMenuItems() {
+ return GlobalMenuItem.ALL;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTreeViewerGlobalMenuHelper.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTreeViewerGlobalMenuHelper.java
new file mode 100644
index 00000000000..6dc4a18789f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactTreeViewerGlobalMenuHelper.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.framework.ui.skynet.menu;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenu.GlobalMenuItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactTreeViewerGlobalMenuHelper implements IGlobalMenuHelper {
+
+ private final TreeViewer treeViewer;
+
+ public ArtifactTreeViewerGlobalMenuHelper(TreeViewer treeViewer) {
+ this.treeViewer = treeViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.menu.IGlobalMenuHelper#getSelectedArtifacts()
+ */
+ public Collection<Artifact> getArtifacts() {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ if (treeViewer == null || treeViewer.getTree().isDisposed()) return artifacts;
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Iterator<?> iterator = selection.iterator();
+ while (iterator.hasNext()) {
+ Object obj = iterator.next();
+ if (obj instanceof Artifact) artifacts.add((Artifact) obj);
+ }
+ return artifacts;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.menu.IGlobalMenuHelper#getValidMenuItems()
+ */
+ public Collection<GlobalMenuItem> getValidMenuItems() {
+ return GlobalMenuItem.ALL;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactsUi.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactsUi.java
new file mode 100644
index 00000000000..a3dfc8ac67a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/ArtifactsUi.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.framework.ui.skynet.menu;
+
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.revision.ArtifactChange;
+import org.eclipse.osee.framework.skynet.core.revision.TransactionData;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.ITreeNode;
+import org.eclipse.osee.framework.ui.swt.TreeViewerUtility;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * Provides convenience methods for displaying artifacts
+ *
+ * @author Jeff C. Phillips
+ */
+public class ArtifactsUi {
+ public static List<Artifact> getSelectedArtifacts(Viewer viewer) {
+ LinkedList<Artifact> selectedItems = new LinkedList<Artifact>();
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+
+ if (!selection.isEmpty()) {
+ // preOrder can only done for TreeViewers
+ if (viewer instanceof TreeViewer) {
+ Object firstElement = selection.getFirstElement();
+
+ try {
+ // This to support the changeReportView
+ if (firstElement instanceof ITreeNode && ((ITreeNode) firstElement).getBackingData() instanceof ArtifactChange) {
+ ArtifactChange artifactChange = (ArtifactChange) ((ITreeNode) firstElement).getBackingData();
+ selectedItems.add(artifactChange.getArtifact());
+ }
+ // Resource History
+ else if (firstElement instanceof TransactionData) {
+ TransactionData firstTransactionData = (TransactionData) firstElement;
+
+ selectedItems.add(ArtifactPersistenceManager.getInstance().getArtifactFromId(
+ firstTransactionData.getAssociatedArtId(), firstTransactionData.getTransactionId()));
+ } else {
+ TreeViewerUtility.getPreorderSelection((TreeViewer) viewer, selectedItems);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else {
+ for (Object object : selection.toArray()) {
+ if (object instanceof Artifact) {
+ selectedItems.add((Artifact) object);
+ } else if (object instanceof Match) {
+ selectedItems.add((Artifact) ((Match) object).getElement());
+ }
+ }
+ }
+ }
+ return selectedItems;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenu.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenu.java
new file mode 100644
index 00000000000..d848d1e3c37
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenu.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.menu;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+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.action.Action;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.DbTransaction;
+import org.eclipse.osee.framework.db.connection.OseeConnection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Provided so all OSEE context menus (and programatic manipulations) can share the same menu items, dialogs,
+ * permissions checks and code.
+ *
+ * @author Donald G. Dunne
+ */
+public class GlobalMenu {
+
+ private final IGlobalMenuHelper globalMenuHelper;
+
+ private MenuItem deleteMenuItem;
+ private MenuItem purgeMenuItem;
+ private MenuItem tagMenuItem;
+ public static enum GlobalMenuItem {
+ DeleteArtifacts, PurgeArtifacts;
+
+ public static List<GlobalMenuItem> ALL = Arrays.asList(GlobalMenuItem.values());
+ };
+ private ArrayList<GlobalMenuListener> listeners = new ArrayList<GlobalMenuListener>();
+
+ public GlobalMenu(Menu parentMenu, IGlobalMenuHelper globalMenuHelper) {
+ this.globalMenuHelper = globalMenuHelper;
+ if (parentMenu != null) {
+ parentMenu.addMenuListener(new EnablementMenuListener());
+ if (globalMenuHelper.getValidMenuItems().contains(GlobalMenuItem.DeleteArtifacts)) createDeleteMenuItem(parentMenu);
+ if (globalMenuHelper.getValidMenuItems().contains(GlobalMenuItem.PurgeArtifacts)) createPurgeMenuItem(parentMenu);
+ }
+ }
+
+ public GlobalMenu(IGlobalMenuHelper globalMenuHelper) {
+ this(null, globalMenuHelper);
+ }
+
+ public void addGlobalMenuListener(GlobalMenuListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeGlobalMenuListener(GlobalMenuListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * @author Donald G. Dunne
+ */
+ public class EnablementMenuListener implements MenuListener {
+
+ public void menuHidden(MenuEvent e) {
+ }
+
+ public void menuShown(MenuEvent e) {
+ try {
+ GlobalMenuPermissions permiss = new GlobalMenuPermissions(globalMenuHelper);
+ if (deleteMenuItem != null) deleteMenuItem.setEnabled(permiss.isFullAccess());
+ if (purgeMenuItem != null) purgeMenuItem.setEnabled(permiss.isHasArtifacts() && AccessControlManager.isOseeAdmin());
+ if (tagMenuItem != null) tagMenuItem.setEnabled(permiss.isHasArtifacts() && permiss.isFullAccess());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ // Provided for addition to Menus
+ private void createDeleteMenuItem(Menu parentMenu) {
+ deleteMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ deleteMenuItem.setText(deleteArtifactAction.getText());
+ deleteMenuItem.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ deleteArtifactAction.run();
+ };
+ });
+ }
+
+ private Action deleteArtifactAction = new Action("&Delete Artifact\tDelete", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ final Collection<Artifact> artifactsToBeDeleted = globalMenuHelper.getArtifacts();
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell(), "Confirm Artifact Deletion", null,
+ " Are you sure you want to delete this artifact and all of the default hierarchy children?",
+ MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1);
+ if (dialog.open() == 0) {
+ try {
+ for (GlobalMenuListener listener : listeners) {
+ Result result = listener.actioning(GlobalMenuItem.DeleteArtifacts, artifactsToBeDeleted);
+ if (result.isFalse()) {
+ result.popup();
+ return;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ Artifact[] artifactsArray = artifactsToBeDeleted.toArray(new Artifact[artifactsToBeDeleted.size()]);
+ SkynetTransaction transaction = new SkynetTransaction(artifactsArray[0].getBranch());
+ ArtifactPersistenceManager.deleteArtifact(transaction, false, artifactsArray);
+ transaction.execute();
+
+ try {
+ for (GlobalMenuListener listener : listeners) {
+ listener.actioned(GlobalMenuItem.DeleteArtifacts, artifactsToBeDeleted);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ private Action purgeArtifactAction = new Action("&Purge Artifact(s)", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ final Collection<Artifact> artifactsToBePurged = globalMenuHelper.getArtifacts();
+
+ if (MessageDialog.openConfirm(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Confirm Artifact Purge ",
+ " Are you sure you want to purge this artifact, all of " + "its children and all history associated with these artifacts from the database ?")) {
+ Job job = new Job("Purge artifact") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+
+ // Notify and confirm that menus should be actioned
+ try {
+ for (GlobalMenuListener listener : listeners) {
+ Result result = listener.actioning(GlobalMenuItem.PurgeArtifacts, artifactsToBePurged);
+ if (result.isFalse()) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, Status.OK, result.getText(), null);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ monitor.beginTask("Purge artifact", artifactsToBePurged.size());
+
+ try {
+ new DbTransaction() {
+ @Override
+ protected void handleTxWork(OseeConnection connection) throws OseeCoreException {
+ for (Artifact artifactToPurge : artifactsToBePurged) {
+ if (!artifactToPurge.isDeleted()) {
+ monitor.setTaskName("Purge: " + artifactToPurge.getDescriptiveName());
+ artifactToPurge.purgeFromBranch(connection);
+ }
+ monitor.worked(1);
+ }
+ }
+ }.execute();
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ toReturn = new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.done();
+ }
+
+ // Notify Listeners that menu was actioned
+ try {
+ for (GlobalMenuListener listener : listeners) {
+ listener.actioned(GlobalMenuItem.PurgeArtifacts, artifactsToBePurged);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return toReturn;
+ }
+ };
+
+ Jobs.startJob(job);
+ }
+ }
+ };
+
+ private void createPurgeMenuItem(Menu parentMenu) {
+ purgeMenuItem = new MenuItem(parentMenu, SWT.PUSH);
+ purgeMenuItem.setText(purgeArtifactAction.getText());
+ purgeMenuItem.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ purgeArtifactAction.run();
+ };
+ });
+ }
+
+ /**
+ * This method is provided for programatic access to delete artifact. No permissions are checked. Preferred use is by
+ * adding item as menu item.
+ *
+ * @return the deleteArtifactAction
+ */
+ public Action getDeleteArtifactAction() {
+ return deleteArtifactAction;
+ }
+
+ /**
+ * @return the listeners
+ */
+ public ArrayList<GlobalMenuListener> getGlobalMenuListeners() {
+ return listeners;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuListener.java
new file mode 100644
index 00000000000..ac6c437d838
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuListener.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.framework.ui.skynet.menu;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenu.GlobalMenuItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface GlobalMenuListener {
+
+ /**
+ * Called prior to performing the menu event. May or may not be called in display thread.
+ *
+ * @param item
+ * @param artifacts
+ * @return Result.False if action should NOT be performed Result.getText will be displayed as a popup to the user
+ */
+ public Result actioning(GlobalMenuItem item, Collection<Artifact> artifacts);
+
+ /**
+ * Called after performing the menu event.
+ *
+ * @param item
+ * @param artifacts
+ */
+ public void actioned(GlobalMenuItem item, Collection<Artifact> artifacts);
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuPermissions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuPermissions.java
new file mode 100644
index 00000000000..43941fb843f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/GlobalMenuPermissions.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.framework.ui.skynet.menu;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GlobalMenuPermissions {
+ private boolean isLocked;
+ private boolean accessToRemoveLock;
+ private boolean writePermission;
+ private boolean readPermission;
+ private boolean fullAccess;
+ private String subjectFromLockedObjectName;
+ private boolean hasArtifacts;
+
+ /**
+ * Return permission set. This is a one-shot deal at the time of instantiation. Permissions are not kept up to date
+ * with changes to getSelectedArtifacts in given globalMenuHelper. Must be called again to get refreshed permissions.
+ *
+ * @param globalMenuHelper
+ */
+ public GlobalMenuPermissions(IGlobalMenuHelper globalMenuHelper) throws OseeCoreException {
+ this(globalMenuHelper.getArtifacts());
+ }
+
+ /**
+ * Return permission set for given artifact.
+ *
+ * @param artifact
+ */
+ public GlobalMenuPermissions(Artifact artifact) throws OseeCoreException {
+ this(Arrays.asList(artifact));
+ }
+
+ /**
+ * Return permission set for given artifacts.
+ *
+ * @param artifacts
+ */
+ public GlobalMenuPermissions(Collection<Artifact> artifacts) throws OseeCoreException {
+ hasArtifacts = artifacts.size() > 0;
+ writePermission = true;
+ readPermission = true;
+ fullAccess = true;
+ isLocked = false;
+ accessToRemoveLock = true;
+ Artifact combinationSubject = null;
+
+ for (Artifact objectArtifact : artifacts) {
+
+ writePermission &=
+ AccessControlManager.checkObjectPermission(objectArtifact, PermissionEnum.WRITE) && objectArtifact.getBranch().isEditable();
+ readPermission &= AccessControlManager.checkObjectPermission(objectArtifact, PermissionEnum.READ);
+ fullAccess &= AccessControlManager.checkObjectPermission(objectArtifact, PermissionEnum.FULLACCESS);
+ isLocked |= AccessControlManager.hasLock(objectArtifact);
+ accessToRemoveLock &= AccessControlManager.canUnlockObject(objectArtifact, UserManager.getUser());
+
+ // acquire the name of the subject that has the lock
+ Artifact subject = AccessControlManager.getSubjectFromLockedObject(objectArtifact);
+
+ if (isLocked && subject != null) {
+ if (combinationSubject == null) {
+ combinationSubject = subject;
+ subjectFromLockedObjectName = combinationSubject.getDescriptiveName();
+ } else if (!combinationSubject.equals(subject)) {
+ subjectFromLockedObjectName = "Mixed names";
+ }
+ }
+ }
+ }
+
+ /**
+ * @return the isLocked
+ */
+ public boolean isLocked() {
+ return isLocked;
+ }
+
+ /**
+ * @return the accessToRemoveLock
+ */
+ public boolean isAccessToRemoveLock() {
+ return accessToRemoveLock;
+ }
+
+ /**
+ * @return the writePermission
+ */
+ public boolean isWritePermission() {
+ return writePermission;
+ }
+
+ /**
+ * @return the readPermission
+ */
+ public boolean isReadPermission() {
+ return readPermission;
+ }
+
+ /**
+ * @return the fullAccess
+ */
+ public boolean isFullAccess() {
+ return fullAccess;
+ }
+
+ /**
+ * @return the subjectFromLockedObjectName
+ */
+ public String getSubjectFromLockedObjectName() {
+ return subjectFromLockedObjectName;
+ }
+
+ /**
+ * @return the branchReadable
+ */
+ public boolean isBranchReadable(Branch branch) throws OseeCoreException {
+ return AccessControlManager.checkObjectPermission(branch, PermissionEnum.READ);
+ }
+
+ /**
+ * @return the hasArtifacts
+ */
+ public boolean isHasArtifacts() {
+ return hasArtifacts;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/IGlobalMenuHelper.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/IGlobalMenuHelper.java
new file mode 100644
index 00000000000..aa6481f28e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/menu/IGlobalMenuHelper.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.framework.ui.skynet.menu;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.menu.GlobalMenu.GlobalMenuItem;
+
+/**
+ * Method is provided so different widget types can provide the artifacts for the GobalMenu to operate on.
+ *
+ * @author Donald G. Dunne
+ */
+public interface IGlobalMenuHelper {
+
+ public Collection<Artifact> getArtifacts();
+
+ public Collection<GlobalMenuItem> getValidMenuItems();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/ConflictResolutionWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/ConflictResolutionWizard.java
new file mode 100644
index 00000000000..d2c7c975001
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/ConflictResolutionWizard.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.mergeWizard;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.XMergeLabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Theron Virgin
+ */
+public class ConflictResolutionWizard extends Wizard {
+ public static final String TITLE = "How would you like to resolve this conflict?";
+ public static final String INDENT = " ";
+ public static final String SOURCE_TITLE = "Source Value:";
+ public static final String DEST_TITLE = "Destination value:";
+ public static final String ART_TEXT = "Artifact: ";
+ public static final String TYPE_TEXT = "Attribute type: ";
+
+ private WizardPage editWizardPage;
+ private final AttributeConflict conflict;
+
+ public ConflictResolutionWizard(Conflict conflict) {
+ if (conflict instanceof AttributeConflict)
+ this.conflict = (AttributeConflict) conflict;
+ else
+ this.conflict = null;
+
+ }
+
+ @Override
+ public void addPages() {
+ if (conflict.isWordAttribute()) {
+ editWizardPage = new EditWFCAttributeWizardPage(conflict);
+ } else {
+ editWizardPage = new EditAttributeWizardPage(conflict);
+ }
+ addPage(editWizardPage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ IWizardPage page = getContainer().getCurrentPage();
+ if (page instanceof EditAttributeWizardPage) {
+ return ((EditAttributeWizardPage) page).closingPage();
+ } else if (page instanceof EditWFCAttributeWizardPage) {
+ return ((EditWFCAttributeWizardPage) page).closingPage();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ public boolean getResolved() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#getStartingPage()
+ */
+ @Override
+ public IWizardPage getStartingPage() {
+ if (conflict.isWordAttribute())
+ return getPage(EditWFCAttributeWizardPage.TITLE);
+ else
+ return getPage(EditAttributeWizardPage.TITLE);
+
+ }
+
+ @Override
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performCancel()
+ */
+ @Override
+ public boolean performCancel() {
+ return super.performCancel();
+ }
+
+ public void setResolution() throws OseeCoreException {
+ if (getContainer() != null) {
+ IWizardPage page = getContainer().getCurrentPage();
+ Image image = XMergeLabelProvider.getMergeImage(conflict);
+ if (page instanceof EditAttributeWizardPage) {
+ ((EditAttributeWizardPage) page).setResolution(image);
+ } else if (page instanceof EditWFCAttributeWizardPage) {
+ ((EditWFCAttributeWizardPage) page).setResolution(image);
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditAttributeWizardPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditAttributeWizardPage.java
new file mode 100644
index 00000000000..1e2ad4f013c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditAttributeWizardPage.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.framework.ui.skynet.mergeWizard;
+
+import java.util.Arrays;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Theron Virgin
+ */
+public class EditAttributeWizardPage extends WizardPage {
+
+ public static final String TITLE = "Editor Page";
+ private AttributeConflict conflict;
+ private String changeType = "";
+ private Button sourceButton;
+ private Button destButton;
+ private Button clearButton;
+ private Label imageLabel;
+ private static final String SOURCE_BUTTON_TEXT = "Load Source Data";
+ private static final String SOURCE_TEXT = ConflictResolutionWizard.SOURCE_TITLE;
+ private static final String SOURCE_TOOLTIP = "Load the Editor with the Source Branch Attribute Value";
+ private static final String DEST_BUTTON_TEXT = "Load Destination Data";
+ private static final String DEST_TEXT = ConflictResolutionWizard.DEST_TITLE;
+ private static final String DEST_TOOLTIP = "Load the Editor with the Destination Branch Attribute Value";
+ private static final String CLEAR_BUTTON_TEXT = "Clear the Editor Value";
+ private static final String CLEAR_TOOLTIP = "Clear the Editor Value";
+ private static final int NUM_COLUMNS = 1;
+ private IEmbeddedAttributeEditor editor;
+
+ private final Listener listener = new Listener() {
+ public void handleEvent(Event event) {
+ // ...
+ try {
+ if (conflict.okToOverwriteMerge()) {
+ if (event.widget == sourceButton) {
+ if (conflict.getSourceObject() != null) {
+ editor.update(conflict.getSourceObject());
+ }
+ }
+ if (event.widget == destButton) {
+ if (conflict.getDestObject() != null) {
+ editor.update(conflict.getDestObject());
+ }
+ }
+ if (event.widget == clearButton) {
+ editor.update("");
+ }
+ } else {
+ MessageDialog.openInformation(getShell(), "Attention", MergeUtility.COMMITED_PROMPT);
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ getWizard().getContainer().updateButtons();
+ }
+ };
+
+ /**
+ * @param pageName
+ */
+
+ public EditAttributeWizardPage(AttributeConflict conflict) {
+ super(TITLE);
+ try {
+ if (conflict != null) {
+ this.conflict = conflict;
+ changeType = conflict.getAttributeType().getName();
+ }
+ if (!conflict.isWordAttribute()) {
+ editor =
+ EmbededAttributeEditorFactory.getEmbeddedEditor(changeType, conflict.getSourceDisplayData(),
+ Arrays.asList(conflict), true);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ setTitle("Edit the attribute ");
+ Composite composite = new Composite(parent, SWT.NONE);
+
+ if (editor == null) {
+ setControl(composite);
+ return;
+ }
+
+ GridLayout gl = new GridLayout();
+ gl.numColumns = NUM_COLUMNS;
+ composite.setLayout(gl);
+ GridData gd = new GridData(SWT.BEGINNING);
+ composite.setLayoutData(gd);
+ gd.horizontalSpan = NUM_COLUMNS;
+
+ imageLabel = new Label(composite, SWT.NONE);
+ imageLabel.setText("hello there");
+ imageLabel.setImage(null);
+
+ try {
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.ART_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + conflict.getArtifactName());
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.TYPE_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + changeType);
+
+ new Label(composite, SWT.NONE).setText("");
+
+ new Label(composite, SWT.NONE).setText(SOURCE_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + conflict.getSourceDisplayData());
+ // sourceButton =
+ // createButton(conflict.getSourceDisplayData(),SOURCE_TOOLTIP,composite,gd);
+ new Label(composite, SWT.NONE).setText(DEST_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + conflict.getDestDisplayData());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ Composite buttonComp = new Composite(composite, SWT.NONE);
+ GridLayout glay = new GridLayout();
+ glay.numColumns = 3;
+ buttonComp.setLayout(glay);
+ GridData gdata = new GridData(SWT.FILL);
+ buttonComp.setLayoutData(gdata);
+ gdata.horizontalSpan = 1;
+
+ sourceButton = createButton(SOURCE_BUTTON_TEXT, SOURCE_TOOLTIP, buttonComp);
+ destButton = createButton(DEST_BUTTON_TEXT, DEST_TOOLTIP, buttonComp);
+ // clearButton = createButton(CLEAR_BUTTON_TEXT, CLEAR_TOOLTIP,
+ // buttonComp, gdata);
+
+ editor.create(composite, gd);
+
+ setControl(composite);
+ }
+
+ private Button createButton(String text, String tooltip, Composite composite) {
+ Button button = new Button(composite, SWT.PUSH);
+ button.addListener(SWT.Selection, listener);
+ button.setText(text);
+ button.setToolTipText(tooltip);
+ return button;
+ }
+
+ public boolean canFinish() {
+ return editor.canFinish();
+ }
+
+ public boolean closingPage() {
+ return editor.commit();
+ }
+
+ public void setResolution(Image image) {
+ imageLabel.setImage(image);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditWFCAttributeWizardPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditWFCAttributeWizardPage.java
new file mode 100644
index 00000000000..b74e0b4db28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EditWFCAttributeWizardPage.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.mergeWizard;
+
+import java.util.Date;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.XMergeLabelProvider;
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Theron Virgin
+ */
+public class EditWFCAttributeWizardPage extends WizardPage {
+
+ public static final String TITLE = "WFC Editor Page";
+ private AttributeConflict conflict;
+ private String changeType = "";
+ private Button editButton;
+ private Button mergeButton;
+ private Button clearButton;
+ private Button sourceButton;
+ private Button destButton;
+ private Button sourceDiffButton;
+ private Button destDiffButton;
+ private Button sourceDestDiffButton;
+ private Button sourceMergeDiffButton;
+ private Button destMergeDiffButton;
+ private Label imageLabel;
+ private static final String EDIT_TEXT = "Edit Merge Artifact";
+ private static final String EDIT_TOOLTIP = "Make additional changes using the Document/Merge Editor";
+ private static final String MERGE_TEXT = "Generate Three Way Merge (Developmental)";
+ private static final String MERGE_TOOLTIP = "Use the new inline merging";
+ private static final String CLEAR_TEXT = "Clear the Merge Artifact";
+ private static final String CLEAR_TOOLTIP = "Reinitializes the merge for this Document";
+ private static final String SOURCE_TEXT = "Populate with Source Data";
+ private static final String SOURCE_TOOLTIP = "Initialize the Document with Source Values";
+ private static final String DEST_TEXT = "Populate with Destination Data";
+ private static final String DEST_TOOLTIP = "Initialize the Document with Destination Values";
+ private static final String SDIFF_TEXT = "Show Source Diff";
+ private static final String SDIFF_TOOLTIP =
+ "Show the differences between the current Source" + " artifact and the artifact at the time the Source Branch was created";
+ private static final String DDIFF_TEXT = "Show Destination Diff";
+ private static final String DDIFF_TOOLTIP =
+ "Show the differences between the current Destination" + " artifact and the artifact at the time the Source Branch was created";
+ private static final String SDDIFF_TEXT = "Show Source/Destination Diff";
+ private static final String SDDIFF_TOOLTIP =
+ "Show the differences between the current Source" + " artifact and the current Merge artifact";
+ private static final String SMDIFF_TEXT = "Show Source/Merge Diff";
+ private static final String SMDIFF_TOOLTIP =
+ "Show the differences between the current Destination" + " artifact and the current Merge artifact";
+ private static final String DMDIFF_TEXT = "Show Destination/Merge Diff";
+ private static final String DMDIFF_TOOLTIP =
+ "Show the differences between the current Destination" + " artifact and the current Source artifact";
+ private static final int NUM_COLUMNS = 1;
+
+ private final Listener listener = new Listener() {
+ public void handleEvent(Event event) {
+ // ...
+
+ try {
+ if (event.widget == editButton) {
+ RendererManager.openInJob(conflict.getArtifact(), PresentationType.SPECIALIZED_EDIT);
+ conflict.markStatusToReflectEdit();
+ } else if (event.widget == clearButton) {
+ MergeUtility.clearValue(conflict, getShell(), true);
+ } else if (event.widget == sourceButton) {
+ MergeUtility.setToSource(conflict, getShell(), true);
+ } else if (event.widget == destButton) {
+ MergeUtility.setToDest(conflict, getShell(), true);
+ } else if (event.widget == sourceDiffButton) {
+ MergeUtility.showCompareFile(MergeUtility.getStartArtifact(conflict), conflict.getSourceArtifact(),
+ "Source_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == destDiffButton) {
+ MergeUtility.showCompareFile(
+ MergeUtility.getStartArtifact(conflict),
+ conflict.getDestArtifact(),
+ "Destination_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == sourceDestDiffButton) {
+ MergeUtility.showCompareFile(
+ conflict.getSourceArtifact(),
+ conflict.getDestArtifact(),
+ "Source_Destination_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == sourceMergeDiffButton) {
+ if (conflict.wordMarkupPresent()) {
+ throw new OseeCoreException(AttributeConflict.DIFF_MERGE_MARKUP);
+ }
+ MergeUtility.showCompareFile(
+ conflict.getSourceArtifact(),
+ conflict.getArtifact(),
+ "Source_Merge_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == destMergeDiffButton) {
+ if (conflict.wordMarkupPresent()) {
+ throw new OseeCoreException(AttributeConflict.DIFF_MERGE_MARKUP);
+ }
+ MergeUtility.showCompareFile(
+ conflict.getDestArtifact(),
+ conflict.getArtifact(),
+ "Destination_Merge_Diff_For_" + conflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ } else if (event.widget == mergeButton) {
+ MergeUtility.launchMerge(conflict, getShell());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ getWizard().getContainer().updateButtons();
+ }
+ };
+
+ /**
+ * @param pageName
+ */
+
+ public EditWFCAttributeWizardPage(AttributeConflict conflict) {
+ super(TITLE);
+ try {
+ if (conflict != null) {
+ this.conflict = conflict;
+ changeType = conflict.getAttributeType().getName();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ setTitle("Edit the attribute ");
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gl = new GridLayout();
+ gl.numColumns = NUM_COLUMNS;
+ composite.setLayout(gl);
+ GridData gd = new GridData(SWT.BEGINNING);
+ composite.setLayoutData(gd);
+ gd.horizontalSpan = NUM_COLUMNS;
+
+ imageLabel = new Label(composite, SWT.NONE);
+ imageLabel.setImage(null);
+
+ try {
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.ART_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + conflict.getArtifactName());
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.TYPE_TEXT);
+ new Label(composite, SWT.NONE).setText(ConflictResolutionWizard.INDENT + changeType);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ new Label(composite, SWT.NONE);
+
+ editButton = createButton(EDIT_TEXT, EDIT_TOOLTIP, composite);
+ mergeButton = createButton(MERGE_TEXT, MERGE_TOOLTIP, composite);
+ new Label(composite, SWT.NONE);
+ sourceButton = createButton(SOURCE_TEXT, SOURCE_TOOLTIP, composite);
+ destButton = createButton(DEST_TEXT, DEST_TOOLTIP, composite);
+ clearButton = createButton(CLEAR_TEXT, CLEAR_TOOLTIP, composite);
+ new Label(composite, SWT.NONE);
+
+ Composite buttonComp = new Composite(composite, SWT.NONE);
+ GridLayout glay = new GridLayout();
+ glay.numColumns = 3;
+ buttonComp.setLayout(glay);
+ GridData gdata = new GridData(SWT.FILL);
+ buttonComp.setLayoutData(gdata);
+ gdata.horizontalSpan = 1;
+
+ sourceDiffButton = createButton(SDIFF_TEXT, SDIFF_TOOLTIP, buttonComp);
+ destDiffButton = createButton(DDIFF_TEXT, DDIFF_TOOLTIP, buttonComp);
+ sourceDestDiffButton = createButton(SDDIFF_TEXT, SDDIFF_TOOLTIP, buttonComp);
+ sourceMergeDiffButton = createButton(SMDIFF_TEXT, SMDIFF_TOOLTIP, buttonComp);
+ destMergeDiffButton = createButton(DMDIFF_TEXT, DMDIFF_TOOLTIP, buttonComp);
+ if (MergeUtility.getStartArtifact(conflict) == null) {
+ sourceDiffButton.setEnabled(false);
+ destDiffButton.setEnabled(false);
+ }
+
+ try {
+ setResolution(XMergeLabelProvider.getMergeImage(conflict));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ setControl(composite);
+ }
+
+ private Button createButton(String text, String tooltip, Composite composite) {
+ Button button = new Button(composite, SWT.PUSH);
+ button.addListener(SWT.Selection, listener);
+ button.setText(text);
+ button.setToolTipText(tooltip);
+ return button;
+ }
+
+ public boolean canFinish() {
+ return true;
+ }
+
+ public boolean closingPage() {
+ return true;
+ }
+
+ public void setResolution(Image image) {
+ imageLabel.setImage(image);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanAttributeEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanAttributeEditor.java
new file mode 100644
index 00000000000..9efc91381f5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanAttributeEditor.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.mergeWizard;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Theron Virgin
+ */
+/*
+ * All of the instance of checks are needed to support both artifacts and
+ * conflicts. The reason to support both is I created the classes for
+ * artifacts so all of the work was already done for them. I then realized
+ * that I needed to control the setting of values for conflicts and thus had to call
+ * the conflict specific methods instead of simply setting the values.
+ */
+public class EmbeddedBooleanAttributeEditor implements IEmbeddedAttributeEditor {
+
+ protected String attributeName;
+ protected String displayName;
+ protected Collection<?> attributeHolder;
+ protected boolean persist;
+ protected EmbeddedBooleanEditor editor;
+
+ public EmbeddedBooleanAttributeEditor(String prompt, Collection<?> attributeHolder, String displayName, String attributeName, boolean persist) {
+ this.attributeName = attributeName;
+ this.displayName = displayName;
+ this.attributeHolder = attributeHolder;
+ this.persist = persist;
+ }
+
+ public boolean create(Composite composite, GridData gd) {
+ if (attributeHolder == null) return false;
+ if (attributeHolder.size() < 1) return false;
+ Object obj = attributeHolder.iterator().next();
+ if (obj instanceof Artifact) {
+ String type = ((Artifact) obj).getArtifactTypeName();
+ for (Object object : attributeHolder) {
+ if (object instanceof Artifact) {
+ if (!type.equals(((Artifact) object).getArtifactTypeName())) {
+ AWorkbench.popup("ERROR",
+ "All artifacts must be of the same type when " + "edited in a boolean editor.");
+ return false;
+ }
+ } else
+ return false;
+ }
+ }
+ editor = new EmbeddedBooleanEditor("Select a value for the " + attributeName);
+ editor.createEditor(composite, gd);
+
+ try {
+ if (obj instanceof Artifact) {
+ try {
+ Object object = ((Artifact) obj).getSoleAttributeValue(attributeName);
+ if (object instanceof Boolean)
+ editor.setEntry(((Boolean) object).booleanValue());
+ else {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, new Exception(
+ "Boolean editor did not receive a boolean value"));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ if (obj instanceof AttributeConflict) {
+ Object object = ((AttributeConflict) obj).getMergeObject();
+ if (object instanceof Boolean) {
+ editor.setEntry(((Boolean) object).booleanValue());
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+ }
+
+ public void update(Object value) {
+ if (editor != null) editor.setEntry(((Boolean) value).booleanValue());
+ }
+
+ public boolean commit() {
+ if (editor != null) {
+ boolean value = editor.getEntry();
+ try {
+ for (Object obj : attributeHolder) {
+ if (obj instanceof Artifact) {
+ ((Artifact) obj).setSoleAttributeValue(attributeName, new Boolean(value));
+ if (persist) ((Artifact) obj).persistAttributes();
+ }
+ if (obj instanceof AttributeConflict) {
+ if (!((AttributeConflict) obj).setAttributeValue(new Boolean(value))) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ }
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ AWorkbench.popup("ERROR", "Could not store the attribute");
+ return false;
+ }
+
+ public boolean canClear() {
+ return false;
+ }
+
+ public boolean canFinish() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanEditor.java
new file mode 100644
index 00000000000..b4073808d86
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedBooleanEditor.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.framework.ui.skynet.mergeWizard;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Theron Virgin
+ */
+
+public class EmbeddedBooleanEditor {
+ Button booleanValue;
+ String dialogMessage;
+
+ public EmbeddedBooleanEditor(String dialogMessage) {
+ this.dialogMessage = dialogMessage;
+ }
+
+ public void createEditor(Composite composite, GridData gd) {
+
+ new Label(composite, SWT.NONE).setText(dialogMessage);
+ booleanValue = new Button(composite, SWT.CHECK);
+ booleanValue.setText("");
+ composite.layout();
+ }
+
+ public boolean getEntry() {
+ return booleanValue.getSelection();
+ }
+
+ public void setEntry(boolean entry) {
+ booleanValue.setSelection(entry);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateAttributeEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateAttributeEditor.java
new file mode 100644
index 00000000000..d878b2406a7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateAttributeEditor.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.framework.ui.skynet.mergeWizard;
+
+import java.util.Collection;
+import java.util.Date;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Theron Virgin
+ */
+
+/*
+ * All of the instance of checks are needed to support both artifacts and
+ * conflicts. The reason to support both is I created the classes for
+ * artifacts so all of the work was already done for them. I then realized
+ * that I needed to control the setting of values for conflicts and thus had to call
+ * the conflict specific methods instead of simply setting the values.
+ */
+public class EmbeddedDateAttributeEditor implements IEmbeddedAttributeEditor {
+
+ protected String attributeName;
+ protected String displayName;
+ protected Collection<?> attributeHolder;
+ protected boolean persist;
+ protected EmbeddedDateEditor editor;
+
+ public EmbeddedDateAttributeEditor(String notUsed, Collection<?> attributeHolder, String displayName, String attributeName, boolean persist) {
+ this.attributeName = attributeName;
+ this.displayName = displayName;
+ this.attributeHolder = attributeHolder;
+ this.persist = persist;
+ }
+
+ public boolean create(Composite composite, GridData gd) {
+ if (attributeHolder == null) return false;
+ if (attributeHolder.size() < 1) return false;
+ Object obj = attributeHolder.iterator().next();
+ if (obj instanceof Artifact) {
+ String type = ((Artifact) obj).getArtifactTypeName();
+ for (Object object : attributeHolder) {
+ if (object instanceof Artifact) {
+ if (!type.equals(((Artifact) object).getArtifactTypeName())) {
+ AWorkbench.popup("ERROR",
+ "All artifacts must be of the same " + "type when edited in an date editor.");
+ return false;
+ }
+ } else
+ return false;
+ }
+ }
+ Date date = new Date();
+ if (obj instanceof Artifact) {
+ try {
+ Object object = ((Artifact) obj).getSoleAttributeValue(attributeName);
+ if (object instanceof Date) date = (Date) object;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ if (obj instanceof AttributeConflict) try {
+ Object object = ((AttributeConflict) obj).getMergeObject();
+ if (object instanceof Date) {
+ date = (Date) object;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ editor = new EmbeddedDateEditor("Edit " + displayName, date);
+ editor.createEditor(composite);
+ return true;
+ }
+
+ public void update(Object value) {
+ editor.setSelectedDate((Date) value);
+ }
+
+ public boolean commit() {
+ Date selected = editor.getSelectedDate();
+ try {
+ for (Object object : attributeHolder) {
+ if (object instanceof Artifact) {
+ if (selected == null)
+ ((Artifact) object).setSoleAttributeValue(attributeName, "");
+ else
+ ((Artifact) object).setSoleAttributeValue(attributeName, selected.getTime() + "");
+ if (persist) ((Artifact) object).persistAttributes();
+ }
+ if (object instanceof AttributeConflict) {
+ if (selected == null) {
+ if (!((AttributeConflict) object).clearValue()) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ } else {
+ if (!((AttributeConflict) object).setAttributeValue(selected)) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ }
+ }
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ AWorkbench.popup("ERROR", "Could not store the attribute");
+ return false;
+ }
+
+ public boolean canClear() {
+ return false;
+ }
+
+ public boolean canFinish() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateEditor.java
new file mode 100644
index 00000000000..d3788526e2f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedDateEditor.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.framework.ui.skynet.mergeWizard;
+
+import java.util.Calendar;
+import java.util.Date;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarListenerAdapter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class EmbeddedDateEditor {
+
+ private Date selectedDate;
+
+ private final String dialogMessage;
+ private CalendarCombo dp;
+ private boolean noneSelected = false;
+
+ public EmbeddedDateEditor(String dialogMessage, Date selectedDate) {
+ this.selectedDate = selectedDate;
+ this.dialogMessage = dialogMessage;
+ }
+
+ public void createEditor(Composite container) {
+ (new Label(container, SWT.None)).setText(dialogMessage);
+
+ dp = new CalendarCombo(container, SWT.SINGLE | SWT.FLAT);
+ if (selectedDate != null) dp.setDate(selectedDate);
+ dp.addCalendarListener(new CalendarListenerAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.nebula.widgets.datechooser.DateChooser.ClearListener#handleClearEvent()
+ */
+ public void dateChanged(Calendar date) {
+ if (date == null) {
+ noneSelected = true;
+ } else {
+ noneSelected = false;
+ selectedDate = dp.getDate().getTime();
+ }
+ }
+ });
+ }
+
+ public void setSelectedDate(Date selectedDate) {
+ this.selectedDate = selectedDate;
+ if (selectedDate != null){
+ dp.setDate(this.selectedDate);
+ }
+ }
+
+ public Date getSelectedDate() {
+ if (noneSelected) return null;
+ return selectedDate == null ? null : (Date)selectedDate.clone();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumAttributeEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumAttributeEditor.java
new file mode 100644
index 00000000000..e00ecaad679
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumAttributeEditor.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.mergeWizard;
+
+import java.util.Collection;
+import java.util.TreeSet;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Theron Virgin
+ */
+
+/*
+ * All of the instance of checks are needed to support both artifacts and
+ * conflicts. The reason to support both is I created the classes for
+ * artifacts so all of the work was already done for them. I then realized
+ * that I needed to control the setting of values for conflicts and thus had to call
+ * the conflict specific methods instead of simply setting the values.
+ */
+
+public class EmbeddedEnumAttributeEditor implements IEmbeddedAttributeEditor {
+ private static final String PROMPT = "Please select a value from the combo box";
+ private static final String ERROR_PROMPT =
+ "All artifacts must be of the same type when edited in an enumeration editor.";
+ protected String attributeName;
+ protected String displayName;
+ protected Collection<?> attributeHolder;
+ protected boolean persist;
+ protected EmbeddedEnumEditor editor;
+
+ public EmbeddedEnumAttributeEditor(String arg, Collection<?> attributeHolder, String displayName, String attributeName, boolean persist) {
+ this.attributeName = attributeName;
+ this.displayName = displayName;
+ this.attributeHolder = attributeHolder;
+ this.persist = persist;
+ }
+
+ public boolean create(Composite composite, GridData gd) {
+ if (attributeHolder == null) return false;
+ if (attributeHolder.size() < 1) return false;
+ Object obj = attributeHolder.iterator().next();
+ if (obj instanceof Artifact) {
+ String type = ((Artifact) obj).getArtifactTypeName();
+ for (Object object : attributeHolder) {
+ if (object instanceof Artifact) {
+ if (!type.equals(((Artifact) object).getArtifactTypeName())) {
+ AWorkbench.popup("ERROR", ERROR_PROMPT);
+ return false;
+ }
+ } else
+ return false;
+ }
+ }
+ editor = new EmbeddedEnumEditor(PROMPT);
+ editor.createEditor(composite);
+ TreeSet<String> options = new TreeSet<String>();
+ try {
+ if (obj instanceof Artifact) {
+ options =
+ new TreeSet<String>(AttributeTypeManager.getEnumerationValues(attributeName));
+ }
+ if (obj instanceof AttributeConflict) {
+ options = ((AttributeConflict) obj).getEnumerationAttributeValues();
+ }
+ for (String string : options) {
+ editor.addSelectionChoice(string);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ if (obj instanceof Artifact) {
+ try {
+ editor.setSelected(((Artifact) obj).getSoleAttributeValue(attributeName).toString());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (obj instanceof AttributeConflict) {
+ try {
+ if (((AttributeConflict) obj).getMergeObject() != null) {
+ editor.setSelected(((AttributeConflict) obj).getMergeObject().toString());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return true;
+ }
+
+ public void update(Object value) {
+ editor.setSelected(value.toString());
+ }
+
+ public boolean commit() {
+ String selection = editor.getSelected();
+ try {
+ for (Object object : attributeHolder) {
+ if (object instanceof Artifact) {
+ ((Artifact) object).setSoleAttributeFromString(attributeName, selection);
+ if (persist) ((Artifact) object).persistAttributes();
+ }
+ if (object instanceof AttributeConflict) {
+ if (selection.equals("")) {
+ if (!((AttributeConflict) object).clearValue()) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ } else {
+ if (!((AttributeConflict) object).setStringAttributeValue(selection)) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ }
+ }
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return true;
+ }
+
+ public boolean canClear() {
+ return false;
+ }
+
+ public boolean canFinish() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumEditor.java
new file mode 100644
index 00000000000..0e797b2da9c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedEnumEditor.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.framework.ui.skynet.mergeWizard;
+
+
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Theron Virgin
+ */
+public class EmbeddedEnumEditor {
+
+ private String dialogMessage;
+ private Combo comboBox;
+ public final static String NO_SELECTION = "";
+
+ public EmbeddedEnumEditor(String dialogMessage) {
+ this.dialogMessage = dialogMessage;
+ }
+
+ public boolean createEditor(Composite composite) {
+ new Label(composite, SWT.NONE).setText(dialogMessage);
+
+ comboBox = new Combo(composite, SWT.READ_ONLY);
+ comboBox.setBounds(50, 50, 650, 65);
+
+ comboBox.add(NO_SELECTION);
+
+ return true;
+ }
+
+ public void addSelectionChoice(String choice){
+ if (choice != null)
+ comboBox.add(choice);
+ }
+
+ public String getSelected() {
+ int index = comboBox.getSelectionIndex();
+ if (index == -1)
+ return NO_SELECTION;
+ else
+ return comboBox.getItem(index);
+ }
+
+ public void setSelected(String selection){
+ int index = comboBox.indexOf(selection);
+ if (index == -1)
+ AWorkbench.popup("ERROR","Attempting to set Enumeration to invalid value " + selection);
+ comboBox.select(index);
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringAttributeEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringAttributeEditor.java
new file mode 100644
index 00000000000..6286cfe68a9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringAttributeEditor.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.mergeWizard;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeUtility;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Theron Virgin
+ */
+
+/*
+ * All of the instance of checks are needed to support both artifacts and
+ * conflicts. The reason to support both is I created the classes for
+ * artifacts so all of the work was already done for them. I then realized
+ * that I needed to control the setting of values for conflicts and thus had to call
+ * the conflict specific methods instead of simply setting the values.
+ */
+
+public class EmbeddedStringAttributeEditor implements IEmbeddedAttributeEditor {
+ private static final String PROMPT = "Set the Attribute Value";
+ private static final String VALIDATION_ERROR =
+ "ERROR: You have entered an invalid value." + " This value can not be saved.";
+ private static final String TYPE_ERROR = "All the artifacts being edited are not of the same type.";
+ private static final String SAVE_ERROR = "Could not store the string attribute";
+
+ protected String attributeName;
+ protected String displayName;
+ protected Collection<?> attributeHolders;
+ protected boolean persist;
+ protected EmbeddedStringEditor editor;
+ protected String regExp;
+
+ public EmbeddedStringAttributeEditor(String regExp, Collection<?> attributeHolders, String displayName, String attributeName, boolean persist) {
+ this.regExp = regExp;
+ this.attributeName = attributeName;
+ this.displayName = displayName;
+ this.attributeHolders = attributeHolders;
+ this.persist = persist;
+ }
+
+ public boolean create(Composite composite, GridData gd) {
+ if (attributeHolders == null) return false;
+ if (attributeHolders.size() < 1) return false;
+ Object obj = attributeHolders.iterator().next();
+ if (obj instanceof Artifact) {
+ String type = ((Artifact) obj).getArtifactTypeName();
+ for (Object object : attributeHolders) {
+ if (object instanceof Artifact) {
+ if (!type.equals(((Artifact) object).getArtifactTypeName())) {
+ AWorkbench.popup("ERROR", TYPE_ERROR);
+ return false;
+ }
+ } else
+ return false;
+ }
+ }
+ editor = new EmbeddedStringEditor(PROMPT);
+ editor.setValidationErrorString(VALIDATION_ERROR);
+ editor.createEditor(composite);
+ if (obj instanceof Artifact) {
+ try {
+ editor.setEntry(((Artifact) obj).getSoleAttributeValue(attributeName).toString());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (obj instanceof AttributeConflict) {
+ try {
+ if (((AttributeConflict) obj).getMergeObject() != null) {
+ editor.setEntry(((AttributeConflict) obj).getMergeObject().toString());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ if (regExp != null) editor.setValidationRegularExpression(regExp);
+ return true;
+ }
+
+ public void update(Object value) {
+ if (value != null) {
+ editor.setEntry(value.toString());
+ }
+ }
+
+ public boolean commit() {
+ if (editor != null) {
+ try {
+ for (Object object : attributeHolders) {
+ if (object instanceof Artifact) {
+ ((Artifact) object).setSoleAttributeFromString(attributeName, editor.getEntry());
+ if (persist) ((Artifact) object).persistAttributes();
+ }
+ if (object instanceof AttributeConflict) {
+ if (!editor.getEntry().equals("")) {
+ try {
+ if (!((AttributeConflict) object).setStringAttributeValue(editor.getEntry())) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else {
+ if (!((AttributeConflict) object).clearValue()) {
+ AWorkbench.popup("Attention", MergeUtility.COMMITED_PROMPT);
+ }
+ }
+ }
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return false;
+
+ }
+
+ public boolean canClear() {
+ return true;
+ }
+
+ public boolean canFinish() {
+ if (editor == null) return false;
+ return (editor.handleModified() || editor.getEntry().equals(""));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringEditor.java
new file mode 100644
index 00000000000..3164c560834
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbeddedStringEditor.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.framework.ui.skynet.mergeWizard;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class EmbeddedStringEditor{
+
+ XText text;
+ String entryText = "";
+ String validationRegularExpression = null;
+ String validationErrorString = "";
+ Button ok;
+ Label errorLabel;
+ String dialogMessage;
+ private Composite composite;
+ boolean fillVertically = false;
+
+
+ public EmbeddedStringEditor(String dialogMessage) {
+ this.dialogMessage = dialogMessage;
+ }
+
+
+ public void createEditor(Composite composite) {
+ this.composite = composite;
+
+ // Create error label
+ errorLabel = new Label(composite, SWT.NONE);
+ errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ errorLabel.setForeground(new Color(null,255,0,0));
+ errorLabel.setText("");
+
+ new Label(composite, SWT.NONE).setText(dialogMessage);
+ text = new XText();
+ text.setFillHorizontally(true);
+ text.setFocus();
+ text.setDisplayLabel(false);
+ if (!entryText.equals("")) text.set(entryText);
+ if (fillVertically) {
+ text.setFillVertically(true);
+ text.setHeight(200);
+ }
+ text.createWidgets(composite, 2);
+
+ text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ handleModified();
+ }
+ });
+
+ composite.layout();
+ }
+
+ public boolean handleModified() {
+ if (text != null) {
+ if (!isEntryValid()) {
+ errorLabel.setText(validationErrorString);
+ errorLabel.update();
+ composite.layout();
+ return false;
+ } else {
+ errorLabel.setText("");
+ errorLabel.update();
+ composite.layout();
+ return true;
+ }
+ }
+ return true;
+ }
+
+ public String getEntry() {
+ return text.get();
+ }
+
+ public void setEntry(String entry) {
+ if (text != null) text.set(entry);
+ this.entryText = entry;
+ }
+
+ /**
+ * override this method to make own checks on entry this will be called with every keystroke
+ *
+ * @return true if entry is valid
+ */
+ public boolean isEntryValid() {
+ if (validationRegularExpression == null) {
+ return true;
+ }
+ // verify title is alpha-numeric with spaces and dashes
+ Matcher m = Pattern.compile(validationRegularExpression).matcher(text.get());
+ return m.find();
+ }
+
+ public void setValidationRegularExpression(String regExp) {
+ validationRegularExpression = regExp;
+ }
+
+ public void setValidationErrorString(String errorText) {
+ validationErrorString = errorText;
+ }
+
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbededAttributeEditorFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbededAttributeEditorFactory.java
new file mode 100644
index 00000000000..cb0c49d0908
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/EmbededAttributeEditorFactory.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.framework.ui.skynet.mergeWizard;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.StringAttribute;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Theron Virgin
+ */
+public class EmbededAttributeEditorFactory {
+
+ private final static String VALID_FLOAT_REG_EX = "^[0-9\\.]+$";
+ private final static String VALID_INTEGER_REG_EX = "^[0-9]+$";
+ private final static String VALID_PERCENT_REG_EX =
+ "^(0*100{1,1}\\.?((?<=\\.)0*)?%?$)|(^0*\\d{0,2}\\.?((?<=\\.)\\d*)?%?)$";
+
+ public static IEmbeddedAttributeEditor getEmbeddedEditor(String attributeName, String displayName, final Collection<?> attributeHolder, boolean persist) {
+ try {
+ Class<? extends Attribute> attClass;
+ attClass = AttributeTypeManager.getType(attributeName).getBaseAttributeClass();
+
+ if (attClass.equals(DateAttribute.class)) {
+ return new EmbeddedDateAttributeEditor(null, attributeHolder, displayName, attributeName, persist);
+ } else if (attClass.equals(FloatingPointAttribute.class)) {
+ return new EmbeddedStringAttributeEditor(VALID_FLOAT_REG_EX, attributeHolder, displayName, attributeName,
+ persist);
+ } else if (attClass.equals(IntegerAttribute.class)) {
+ return new EmbeddedStringAttributeEditor(VALID_INTEGER_REG_EX, attributeHolder, displayName, attributeName,
+ persist);
+ } else if (attClass.equals(BooleanAttribute.class)) {
+ return new EmbeddedBooleanAttributeEditor(null, attributeHolder, displayName, attributeName, persist);
+ } else if (attClass.equals(EnumeratedAttribute.class)) {
+ return new EmbeddedEnumAttributeEditor(null, attributeHolder, displayName, attributeName, persist);
+ } else if (attClass.equals(StringAttribute.class)) {
+ return new EmbeddedStringAttributeEditor(null, attributeHolder, displayName, attributeName, persist);
+ } else
+ AWorkbench.popup("ERROR", "Unhandled attribute type. No editor defined for this type");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/IEmbeddedAttributeEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/IEmbeddedAttributeEditor.java
new file mode 100644
index 00000000000..7c896d52ee5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/mergeWizard/IEmbeddedAttributeEditor.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.framework.ui.skynet.mergeWizard;
+
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Theron Virgin
+ */
+public interface IEmbeddedAttributeEditor {
+
+ public void update(Object value);
+
+ public boolean create(Composite composite, GridData gd);
+
+ public boolean commit();
+
+ public boolean canClear();
+
+ public boolean canFinish();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationEvent.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationEvent.java
new file mode 100644
index 00000000000..c3393cac221
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationEvent.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.framework.ui.skynet.notify;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.skynet.core.User;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeNotificationEvent {
+
+ private final Collection<User> users;
+ private final String id;
+ private final String type;
+ private final String description;
+
+ public OseeNotificationEvent(Collection<User> users, String id, String type, String description) {
+ this.users = users;
+ this.id = id;
+ this.type = type;
+ this.description = description;
+ }
+
+ public String toString() {
+ return type + " - " + id + " - " + users + " - " + description;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public Collection<User> getUsers() {
+ return users;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationManager.java
new file mode 100644
index 00000000000..1d092823611
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotificationManager.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.framework.ui.skynet.notify;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * Stores notification events generated by the framework or applications. Currently, send happens upon call to
+ * sendNotifications(). Eventually, a timer will kick the send event at certain intervals. This mechanism allows for
+ * notifications to be collected for a certain period of time and rolled into a single notification. This will
+ * eventually also support other types of notifications such as popups and allow the user to configure which events are
+ * sent and how.
+ *
+ * @author Donald G. Dunne
+ */
+public class OseeNotificationManager {
+
+ private static boolean emailEnabled = true;
+
+ private static List<OseeNotificationEvent> notificationEvents = new ArrayList<OseeNotificationEvent>();
+
+ public static void addNotificationEvent(OseeNotificationEvent notificationEvent) {
+ notificationEvents.add(notificationEvent);
+ }
+
+ public static void clear() {
+ notificationEvents.clear();
+ }
+
+ public static void sendNotifications() throws OseeCoreException {
+ if (!emailEnabled) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, "Osee Notification Disabled");
+ return;
+ }
+ List<OseeNotificationEvent> sendEvents = new ArrayList<OseeNotificationEvent>();
+ sendEvents.addAll(notificationEvents);
+ notificationEvents.clear();
+ OseeNotifyUsersJob job = new OseeNotifyUsersJob(sendEvents);
+ job.setPriority(Job.SHORT);
+ job.schedule();
+ }
+
+ public static boolean isEmailEnabled() {
+ return emailEnabled;
+ }
+
+ public static void setEmailEnabled(boolean emailEnabled) {
+ OseeNotificationManager.emailEnabled = emailEnabled;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotifyUsersJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotifyUsersJob.java
new file mode 100644
index 00000000000..a6546ca88c5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/notify/OseeNotifyUsersJob.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.framework.ui.skynet.notify;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import javax.mail.MessagingException;
+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.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail.BodyType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeNotifyUsersJob extends Job {
+ private final boolean testing = false; // Email goes to current user
+ private final Collection<? extends OseeNotificationEvent> notificationEvents;
+
+ public OseeNotifyUsersJob(Collection<? extends OseeNotificationEvent> notificationEvents) throws OseeCoreException {
+ super("Notifying Users");
+ this.notificationEvents = notificationEvents;
+ if (testing) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE,
+ "OseeNotifyUsersJob: testing is enabled....turn off for production.");
+ }
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ Set<User> users = new HashSet<User>();
+ for (OseeNotificationEvent notificationEvent : notificationEvents) {
+ users.addAll(notificationEvent.getUsers());
+ }
+ XResultData resultData = new XResultData();
+ if (testing) {
+ resultData.log("Testing Results Report for Osee Notification; Email to current user.<br>");
+ users.clear();
+ users.addAll(Arrays.asList(UserManager.getUser()));
+ }
+ for (User user : users) {
+ List<OseeNotificationEvent> notifyEvents = new ArrayList<OseeNotificationEvent>();
+ for (OseeNotificationEvent notificationEvent : notificationEvents) {
+ if (testing || notificationEvent.getUsers().contains(user)) {
+ notifyEvents.add(notificationEvent);
+ }
+ }
+ notifyUser(user, notifyEvents, resultData);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ }
+
+ private String notificationEventsToHtml(List<OseeNotificationEvent> notificationEvents) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AHTML.beginMultiColumnTable(100, 1));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Reason", "Description", "Id"}));
+ for (OseeNotificationEvent notificationEvent : notificationEvents) {
+ sb.append(AHTML.addRowMultiColumnTable(new String[] {notificationEvent.getType(),
+ notificationEvent.getDescription(), notificationEvent.getId()}));
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ return sb.toString().replaceAll("\n", "");
+ }
+
+ private void notifyUser(User user, List<OseeNotificationEvent> notificationEvents, XResultData resultData) throws MessagingException, OseeCoreException {
+ if (user == UserManager.getUser(SystemUser.OseeSystem) || user == UserManager.getUser(SystemUser.UnAssigned) || user == UserManager.getUser(SystemUser.Guest)) {
+ // do nothing
+ return;
+ }
+ String html = notificationEventsToHtml(notificationEvents);
+ if (user.getEmail() == null || user.getEmail().equals("")) {
+ // do nothing
+ return;
+ } else {
+ OseeEmail emailMessage =
+ new OseeEmail(Arrays.asList(user.getEmail()), UserManager.getUser().getEmail(),
+ UserManager.getUser().getEmail(), getNotificationEmailSubject(notificationEvents), html,
+ BodyType.Html);
+ emailMessage.send();
+ }
+ }
+
+ private String getNotificationEmailSubject(List<OseeNotificationEvent> notificationEvents) {
+ if (notificationEvents.size() == 1) {
+ OseeNotificationEvent event = notificationEvents.iterator().next();
+ return Strings.truncate("OSEE Notification" + " - " + event.getType() + " - " + event.getDescription(), 128);
+ }
+ return "OSEE Notification";
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/AuthenticationComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/AuthenticationComposite.java
new file mode 100644
index 00000000000..d400ee5d5d4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/AuthenticationComposite.java
@@ -0,0 +1,432 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.panels;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.BaseCredentialProvider;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeCredential;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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.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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AuthenticationComposite extends Composite {
+
+ private static final String LABEL_KEY = "label";
+ private static final String WARNING_MESSAGE =
+ "Saved passwords are stored in your computer in a file that is difficult, but not impossible, for an intruder to read.";
+ private static final Image errorImage =
+ PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+
+ private enum LabelEnum {
+ UserId("Enter user name"),
+ Password(true, "Enter a valid password"),
+ Domain("Enter a valid domain [sw, nw, etc...]"),
+ Protocol("Select authentication protocol"),
+ Remember_My_Password(WARNING_MESSAGE);
+
+ boolean isHidden;
+ String toolTipText;
+
+ LabelEnum(boolean isHidden, String toolTipText) {
+ this.isHidden = isHidden;
+ this.toolTipText = toolTipText;
+ }
+
+ LabelEnum(String toolTipText) {
+ this(false, toolTipText);
+ }
+
+ public String getToolTipText() {
+ return toolTipText;
+ }
+
+ public boolean isHidden() {
+ return isHidden;
+ }
+ }
+
+ private final Map<LabelEnum, Control> fieldMap;
+ private final Map<LabelEnum, String> dataMap;
+ private final Map<LabelEnum, Label> statusMap;
+ private final boolean buildSubmitButton;
+ private SelectionListener listener;
+ private boolean allValid;
+ private Button memoButton;
+ private Button guestButton;
+ private Button userButton;
+ private Composite mainComposite;
+ private boolean isGuestLogin;
+
+ public AuthenticationComposite(Composite parent, int style, boolean buildSubmitButton) {
+ super(parent, style);
+ this.buildSubmitButton = buildSubmitButton;
+ fieldMap = new HashMap<LabelEnum, Control>();
+ dataMap = new HashMap<LabelEnum, String>();
+ statusMap = new HashMap<LabelEnum, Label>();
+ createControl();
+ }
+
+ public AuthenticationComposite(Composite parent, int style) {
+ this(parent, style, true);
+ }
+
+ private void createControl() {
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ this.setLayout(layout);
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createLoginSelection(this);
+
+ mainComposite = new Group(this, SWT.NONE);
+ GridLayout layout1 = new GridLayout();
+ layout1.marginWidth = 0;
+ layout1.marginHeight = 0;
+ mainComposite.setLayout(layout1);
+ mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createFieldArea(mainComposite);
+ handleLoginTypeSelection();
+ }
+
+ private void createLoginSelection(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ guestButton = new Button(composite, SWT.RADIO);
+ guestButton.setText("Guest");
+ guestButton.setSelection(isGuestLogin);
+ guestButton.setToolTipText("Allows users to log into the system with guest priviledges.\n");
+ guestButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleLoginTypeSelection();
+ updateDefaultButtonStatus();
+ }
+
+ });
+
+ userButton = new Button(composite, SWT.RADIO);
+ userButton.setSelection(!isGuestLogin);
+ userButton.setText("User Login");
+ userButton.setToolTipText("Enables User to login");
+ userButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleLoginTypeSelection();
+ updateDefaultButtonStatus();
+ }
+ });
+
+ }
+
+ private void handleLoginTypeSelection() {
+ boolean allowUserLogin = false;
+ if (isWidgetAccessible(guestButton)) {
+ if (guestButton.getSelection()) {
+ allowUserLogin = false;
+ }
+ }
+
+ if (isWidgetAccessible(userButton)) {
+ if (userButton.getSelection()) {
+ allowUserLogin = true;
+ }
+ }
+
+ isGuestLogin = !allowUserLogin;
+ if (isWidgetAccessible(mainComposite)) {
+ setEnabledHelper(mainComposite, allowUserLogin);
+ }
+ }
+
+ private void setEnabledHelper(Composite tempComposite, boolean setEnabled) {
+ for (Control control : tempComposite.getChildren()) {
+ if (control instanceof Composite) {
+ setEnabledHelper((Composite) control, setEnabled);
+ } else {
+ control.setEnabled(setEnabled);
+ }
+ }
+ tempComposite.setEnabled(setEnabled);
+ }
+
+ private void createFieldArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(3, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ for (LabelEnum labelEnum : LabelEnum.values()) {
+ if (labelEnum.equals(LabelEnum.Remember_My_Password)) {
+ createMementoButton(parent);
+ if (isWidgetAccessible(memoButton)) {
+ dataMap.put(labelEnum, Boolean.toString(memoButton.getSelection()));
+ }
+ } else {
+ Label label = new Label(composite, SWT.NONE);
+ label.setText(labelEnum.name() + ": ");
+
+ int style = SWT.BORDER | SWT.SINGLE;
+ Control control = null;
+ if (labelEnum.equals(LabelEnum.Protocol)) {
+ Combo combo = new Combo(composite, style);
+ control = combo;
+ List<String> protocols = ClientSessionManager.getAuthenticationProtocols();
+ combo.setItems(protocols.toArray(new String[protocols.size()]));
+ dataMap.put(labelEnum, combo.getText());
+ } else {
+ Text field = new Text(composite, (labelEnum.isHidden() ? style |= SWT.PASSWORD : style));
+ field.setData(LABEL_KEY, labelEnum);
+ control = field;
+ dataMap.put(labelEnum, field.getText());
+ field.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ Object object = e.getSource();
+ if (object instanceof Text) {
+ Text field = (Text) object;
+ LabelEnum labelKey = (LabelEnum) field.getData(LABEL_KEY);
+
+ dataMap.put(labelKey, field.getText());
+ updateFieldStatus(labelKey, field);
+ updateDefaultButtonStatus();
+ }
+ }
+ });
+ }
+ control.setToolTipText(labelEnum.getToolTipText());
+ control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Label statusLabel = new Label(composite, SWT.NONE);
+ statusLabel.setImage(errorImage);
+ statusLabel.setVisible(true);
+
+ fieldMap.put(labelEnum, control);
+ statusMap.put(labelEnum, statusLabel);
+
+ }
+ }
+
+ if (buildSubmitButton) {
+ Composite buttonComposite = new Composite(parent, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout());
+ buttonComposite.setLayoutData(new GridData(SWT.END, SWT.END, true, false));
+
+ Button authenticate = new Button(buttonComposite, SWT.PUSH);
+ authenticate.setText("Submit");
+ authenticate.setLayoutData(new GridData(SWT.END, SWT.END, false, false));
+ authenticate.addSelectionListener(listener);
+ authenticate.setEnabled(allValid);
+ getShell().setDefaultButton(authenticate);
+ }
+
+ listener = new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ if (isGuestLogin()) {
+ ClientSessionManager.authenticateAsGuest();
+ } else {
+ ClientSessionManager.authenticate(new BaseCredentialProvider() {
+ @Override
+ public OseeCredential getCredential() throws OseeCoreException {
+ OseeCredential credential = super.getCredential();
+ credential.setUserName(dataMap.get(LabelEnum.UserId));
+ credential.setPassword(dataMap.get(LabelEnum.Password));
+ credential.setDomain(dataMap.get(LabelEnum.Domain));
+ credential.setAuthenticationProtocol(dataMap.get(LabelEnum.Protocol));
+ return credential;
+ }
+ });
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ if (ClientSessionManager.isSessionValid()) {
+ boolean isSaveAllowed = Boolean.valueOf(dataMap.get(LabelEnum.Remember_My_Password));
+ if (isSaveAllowed) {
+ //TODO: Store Password into KeyRing dataMap.get(LabelEnum.Password)
+ }
+ }
+ }
+ };
+
+ }
+
+ private void createMementoButton(Composite parent) {
+ Composite tempComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ tempComposite.setLayout(layout);
+ tempComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ memoButton = new Button(tempComposite, SWT.CHECK);
+ memoButton.setText("Remember my password");
+ memoButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
+ memoButton.setToolTipText(WARNING_MESSAGE);
+ memoButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ dataMap.put(LabelEnum.Remember_My_Password, Boolean.toString(memoButton.getSelection()));
+ }
+ });
+ }
+
+ public SelectionListener getAuthenticateListener() {
+ return listener;
+ }
+
+ public void setUserName(String user) {
+ setAndStoreField(LabelEnum.UserId, user);
+ }
+
+ public void setPassword(String password) {
+ setAndStoreField(LabelEnum.Password, password);
+ }
+
+ public void setDomain(String domain) {
+ setAndStoreField(LabelEnum.Domain, domain);
+ }
+
+ public void setStorageAllowed(boolean isStorageAllowed) {
+ setAndStoreField(LabelEnum.Remember_My_Password, Boolean.toString(isStorageAllowed));
+ }
+
+ public void setProtocol(String protocol) {
+ setAndStoreField(LabelEnum.Protocol, protocol);
+ }
+
+ private void setAndStoreField(LabelEnum fieldKey, String value) {
+ if (fieldKey.equals(LabelEnum.Remember_My_Password)) {
+ if (isWidgetAccessible(memoButton)) {
+ memoButton.setSelection(Boolean.valueOf(value));
+ }
+ } else {
+ Widget object = fieldMap.get(fieldKey);
+ if (isWidgetAccessible(object)) {
+ if (object instanceof Text) {
+ Text textField = (Text) object;
+ textField.setText(value);
+ }
+ if (object instanceof Combo) {
+ Combo combo = (Combo) object;
+ combo.setText(value);
+ }
+ updateFieldStatus(fieldKey, object);
+ updateDefaultButtonStatus();
+ }
+ }
+ dataMap.put(fieldKey, value);
+ }
+
+ private boolean isWidgetAccessible(Widget widget) {
+ return widget != null && !widget.isDisposed();
+ }
+
+ public String getUserName() {
+ return dataMap.get(LabelEnum.UserId);
+ }
+
+ public String getPassword() {
+ return dataMap.get(LabelEnum.Password);
+ }
+
+ public String getDomain() {
+ return dataMap.get(LabelEnum.Domain);
+ }
+
+ public boolean isGuestLogin() {
+ return isGuestLogin;
+ }
+
+ public void setGuestLogin(boolean isGuestLogin) {
+ this.isGuestLogin = isGuestLogin;
+ }
+
+ public boolean isStorageAllowed() {
+ String value = dataMap.get(LabelEnum.Remember_My_Password);
+ return (value != null ? Boolean.parseBoolean(value) : false);
+ }
+
+ public String getProtocol() {
+ return dataMap.get(LabelEnum.Protocol);
+ }
+
+ public boolean isValid() {
+ return allValid;
+ }
+
+ private void updateFieldStatus(LabelEnum labelKey, Widget field) {
+ switch (labelKey) {
+ case Protocol:
+ String temp = ((Combo) field).getText();
+ statusMap.get(labelKey).setVisible(!Strings.isValid(temp));
+ break;
+ case Remember_My_Password:
+ break;
+ default:
+ temp = ((Text) field).getText();
+ statusMap.get(labelKey).setVisible(!Strings.isValid(temp));
+ break;
+ }
+ }
+
+ private void updateDefaultButtonStatus() {
+ allValid = true;
+
+ if (!isGuestLogin) {
+ for (LabelEnum key : LabelEnum.values()) {
+ Label label = statusMap.get(key);
+ if (isWidgetAccessible(label)) {
+ allValid &= !label.isVisible();
+ }
+ }
+ }
+ Button defaultButton = AuthenticationComposite.this.getShell().getDefaultButton();
+ if (defaultButton != null) {
+ defaultButton.setEnabled(allValid);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BranchSelectSimpleComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BranchSelectSimpleComposite.java
new file mode 100644
index 00000000000..2c70dcae9f3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BranchSelectSimpleComposite.java
@@ -0,0 +1,278 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.panels;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectionDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+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.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchSelectSimpleComposite extends Composite implements Listener {
+ protected static final int SIZING_TEXT_FIELD_WIDTH = 250;
+
+ private Button branchSelectButton;
+ private Combo branchSelectCombo;
+ private boolean entryChanged;
+ private Branch currentBranch;
+ private final Set<Listener> listeners;
+ private final boolean allowOnlyWorkingBranches;
+
+ private BranchSelectSimpleComposite(Composite parent, int style, boolean allowOnlyWorkingBranches) {
+ super(parent, style);
+ this.allowOnlyWorkingBranches = allowOnlyWorkingBranches;
+ this.entryChanged = false;
+ this.listeners = Collections.synchronizedSet(new HashSet<Listener>());
+ this.currentBranch = null;
+ createControl(this);
+ }
+
+ public static BranchSelectSimpleComposite createWorkingBranchSelectComposite(Composite parent, int style) {
+ return new BranchSelectSimpleComposite(parent, style, true);
+ }
+
+ public static BranchSelectSimpleComposite createBranchSelectComposite(Composite parent, int style) {
+ return new BranchSelectSimpleComposite(parent, style, false);
+ }
+
+ private void createControl(Composite parent) {
+ parent.setLayout(new GridLayout(2, false));
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ branchSelectCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
+ data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+ branchSelectCombo.setLayoutData(data);
+ branchSelectCombo.setFont(parent.getFont());
+ branchSelectCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateFromSourceField();
+ }
+ });
+
+ branchSelectCombo.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // If there has been a key pressed then mark as dirty
+ entryChanged = true;
+ }
+ });
+
+ branchSelectCombo.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ // Clear the flag to prevent constant update
+ if (entryChanged) {
+ entryChanged = false;
+ updateFromSourceField();
+ }
+ }
+ });
+
+ branchSelectButton = new Button(parent, SWT.PUSH);
+ branchSelectButton.setText("Select Branch...");
+ branchSelectButton.addListener(SWT.Selection, this);
+ branchSelectButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ branchSelectButton.setFont(parent.getFont());
+ }
+
+ public Branch getSelectedBranch() {
+ Branch toReturn = null;
+ if (branchSelectCombo != null && branchSelectCombo.isDisposed() != true) {
+ String branchName = branchSelectCombo.getText();
+ if (Strings.isValid(branchName)) {
+ toReturn = (Branch) branchSelectCombo.getData(branchName);
+ if (toReturn == null) {
+ try {
+ toReturn = BranchManager.getBranch(branchName);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ currentBranch = toReturn;
+ }
+ return currentBranch;
+ }
+
+ private boolean areOnlyWorkingBranchesAllowed() {
+ return allowOnlyWorkingBranches;
+ }
+
+ private void updateFromSourceField() {
+ setBranchName(getSelectedBranch());
+ notifyListener(new Event());
+ }
+
+ private Branch getCurrentBranch() {
+ return currentBranch;
+ }
+
+ private void setBranchName(Branch branch) {
+ if (branch != null) {
+ String branchName = branch.getBranchName();
+ String[] currentItems = this.branchSelectCombo.getItems();
+ int selectionIndex = -1;
+ for (int i = 0; i < currentItems.length; i++) {
+ if (currentItems[i].equals(branchName)) {
+ selectionIndex = i;
+ }
+ }
+ if (selectionIndex < 0) {
+ int oldLength = currentItems.length;
+ String[] newItems = new String[oldLength + 1];
+ System.arraycopy(currentItems, 0, newItems, 0, oldLength);
+ newItems[oldLength] = branchName;
+ this.branchSelectCombo.setItems(newItems);
+ selectionIndex = oldLength;
+ branchSelectCombo.setData(branch.getBranchName(), branch);
+ branchSelectCombo.setData(String.valueOf(branch.getBranchId()), branch);
+ }
+ this.branchSelectCombo.select(selectionIndex);
+ }
+ }
+
+ public void restoreWidgetValues(String[] branchIds, String lastSelected) {
+ Branch currentBranch = getCurrentBranch();
+
+ // Add stored directories into selector
+ if (Strings.isValid(lastSelected) == false && currentBranch != null) {
+ lastSelected = Integer.toString(currentBranch.getBranchId());
+ }
+
+ if (branchIds == null) {
+ if (Strings.isValid(lastSelected)) {
+ branchIds = new String[] {lastSelected};
+ } else {
+ branchIds = new String[0];
+ }
+ }
+
+ List<String> branchIdsToUse = new ArrayList<String>();
+ for (String id : branchIds) {
+ try {
+ Branch branch = BranchManager.getBranch(Integer.parseInt(id));
+ if (branch != null) {
+ branchIdsToUse.add(id);
+ }
+ } catch (Exception ex) {
+ // Do nothing
+ }
+ }
+
+ setCombo(branchIdsToUse.toArray(new String[branchIdsToUse.size()]), lastSelected);
+ }
+
+ private void setCombo(String[] values, String lastSelected) {
+ int toSelect = 0;
+ for (int i = 0; i < values.length; i++) {
+ String toStore = values[i];
+ if (Strings.isValid(toStore)) {
+ try {
+ Branch branch = BranchManager.getBranch(Integer.parseInt(toStore));
+
+ if (isBranchAllowed(branch) != false) {
+ String branchName = branch.getBranchName();
+ branchSelectCombo.add(branchName);
+ branchSelectCombo.setData(String.valueOf(branch.getBranchId()), branch);
+ branchSelectCombo.setData(branchName, branch);
+ if (toStore.equals(lastSelected)) {
+ toSelect = i;
+ branchSelectCombo.select(toSelect);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format(
+ "Unable to add invalid branch id [%s] to selection list.", toStore));
+ }
+ }
+ }
+ }
+
+ private boolean isBranchAllowed(Branch branch) throws Exception {
+ if (areOnlyWorkingBranchesAllowed() && !branch.hasParentBranch()) {
+ return false;
+ }
+ return true;
+ }
+
+ public String[] getBranchIds() {
+ String[] items = branchSelectCombo.getItems();
+ List<String> toReturn = new ArrayList<String>();
+ for (String item : items) {
+ Branch branch = (Branch) branchSelectCombo.getData(item);
+ if (branch != null) {
+ toReturn.add(String.valueOf(branch.getBranchId()));
+ }
+ }
+ return toReturn.toArray(new String[toReturn.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ if (event.widget == branchSelectButton) {
+ if (areOnlyWorkingBranchesAllowed() != false) {
+ setBranchName(BranchSelectionDialog.getWorkingBranchFromUser());
+ } else {
+ setBranchName(BranchSelectionDialog.getBranchFromUser());
+ }
+ }
+ notifyListener(event);
+ }
+
+ private void notifyListener(Event event) {
+ synchronized (listeners) {
+ for (Listener listener : listeners) {
+ listener.handleEvent(event);
+ }
+ }
+ }
+
+ public void addListener(Listener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(Listener listener) {
+ synchronized (listeners) {
+ listeners.remove(listener);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BrowserComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BrowserComposite.java
new file mode 100644
index 00000000000..fdcecbaa784
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/BrowserComposite.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.framework.ui.skynet.panels;
+
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.ProgressListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class BrowserComposite extends Composite {
+ private Browser previewBrowser;
+ private ToolBar toolBar;
+
+ public BrowserComposite(Composite parent, int style) {
+ this(parent, style, null);
+ }
+
+ public BrowserComposite(Composite parent, int style, ToolBar toolBar) {
+ super(parent, style);
+ setLayout(ALayout.getZeroMarginLayout());
+ GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+ setLayoutData(gridData);
+
+ previewBrowser = new Browser(this, SWT.NONE);
+ gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+ previewBrowser.setLayoutData(gridData);
+
+ this.toolBar = toolBar;
+ }
+
+ public void setHtml(String html) throws SWTException, IllegalArgumentException {
+ previewBrowser.setText(html);
+ }
+
+ public void setUrl(String url) throws SWTException, IllegalArgumentException {
+ previewBrowser.setUrl(url);
+ }
+
+ public void refresh() {
+ previewBrowser.refresh();
+ }
+
+ public boolean back() {
+ if (previewBrowser == null) return false;
+ return previewBrowser.back();
+ }
+
+ public boolean forward() {
+ if (previewBrowser == null) return false;
+ return previewBrowser.forward();
+ }
+
+ public boolean isBackEnabled() {
+ if (previewBrowser == null) return false;
+ return previewBrowser.isBackEnabled();
+ }
+
+ public boolean isForwardEnabled() {
+ if (previewBrowser == null) return false;
+ return previewBrowser.isForwardEnabled();
+ }
+
+ public void addProgressListener(ProgressListener listener) {
+ previewBrowser.addProgressListener(listener);
+ }
+
+ /**
+ * @return the toolBar
+ */
+ protected ToolBar getToolBar() {
+ return toolBar;
+ }
+
+ protected String getUrl() {
+ return previewBrowser.getUrl();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/DetailsBrowserComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/DetailsBrowserComposite.java
new file mode 100644
index 00000000000..e1cca8b72f4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/DetailsBrowserComposite.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.framework.ui.skynet.panels;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DetailsBrowserComposite extends BrowserComposite {
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public DetailsBrowserComposite(Artifact artifact, Composite parent, int style, ToolBar toolBar) {
+ super(parent, style, toolBar);
+ StringBuffer sb =
+ new StringBuffer(AHTML.getLabelValueStr("Name", artifact.getDescriptiveName()) + AHTML.newline());
+ try {
+ sb.append(AHTML.getLabelValueStr("GUID", artifact.getGuid()) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("HRID", artifact.getHumanReadableId()) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Branch", artifact.getBranch().toString()) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Branch Id", String.valueOf(artifact.getBranch().getBranchId())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Artifact Id", String.valueOf(artifact.getArtId())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Artifact Type Name", artifact.getArtifactTypeName()) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Artifact Type Id", String.valueOf(artifact.getArtTypeId())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Gamma Id", String.valueOf(artifact.getGammaId())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Historical", String.valueOf(artifact.isHistorical())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Deleted", String.valueOf(artifact.isDeleted())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Revision", String.valueOf(artifact.getTransactionNumber())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Last Modified", String.valueOf(artifact.getLastModified())) + AHTML.newline());
+ sb.append(AHTML.getLabelValueStr("Last Modified By", String.valueOf(artifact.getLastModifiedBy())) + AHTML.newline());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ sb.append(AHTML.getLabelStr("Exception in rendering details: ", ex.getLocalizedMessage()));
+ }
+ setHtml(AHTML.simplePage(sb.toString()));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/SearchComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/SearchComposite.java
new file mode 100644
index 00000000000..600496a5918
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/panels/SearchComposite.java
@@ -0,0 +1,297 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.panels;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+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.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SearchComposite extends Composite implements Listener {
+ private static final String CLEAR_HISTORY_TOOLTIP = "Clears search history";
+ private static final String SEARCH_BUTTON_TOOLTIP = "Executes search";
+ private static final String SEARCH_COMBO_TOOLTIP =
+ "Enter word(s) to search for or select historical value from pull-down on the right.";
+
+ private final Set<Listener> listeners;
+ private Combo searchArea;
+ private Button executeSearch;
+ private Button clear;
+ private boolean entryChanged;
+
+ public SearchComposite(Composite parent, int style) {
+ super(parent, style);
+ this.listeners = new HashSet<Listener>();
+ this.entryChanged = false;
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ GridLayout gL = new GridLayout();
+ gL.marginHeight = 0;
+ gL.marginWidth = 0;
+ parent.setLayout(gL);
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createSearchInputArea(parent);
+ }
+
+ private void createSearchInputArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Enter Search String");
+
+ this.searchArea = new Combo(group, SWT.BORDER);
+ this.searchArea.setFont(getFont());
+ this.searchArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ this.searchArea.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent event) {
+ // If there has been a key pressed then mark as dirty
+ entryChanged = true;
+
+ if (event.character == '\r') {
+ if (executeSearch.getEnabled()) {
+ if (entryChanged) {
+ entryChanged = false;
+ updateFromSourceField();
+ }
+
+ Event sendEvent = new Event();
+ sendEvent.widget = event.widget;
+ sendEvent.character = event.character;
+ sendEvent.type = SWT.KeyUp;
+ notifyListener(sendEvent);
+ }
+ }
+ }
+ });
+
+ this.searchArea.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ updateWidgetEnablements();
+ }
+ });
+
+ this.searchArea.setToolTipText(SEARCH_COMBO_TOOLTIP);
+ createButtonBar(group);
+ }
+
+ private void createButtonBar(Composite parent) {
+ this.clear = new Button(parent, SWT.NONE);
+ this.clear.setText("Clear History");
+ this.clear.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (searchArea.getItemCount() > 0) {
+ searchArea.removeAll();
+ }
+ }
+ });
+ this.clear.addListener(SWT.Selection, this);
+ this.clear.setEnabled(false);
+ this.clear.setFont(getFont());
+ this.clear.setToolTipText(CLEAR_HISTORY_TOOLTIP);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gL = new GridLayout();
+ gL.marginWidth = 0;
+ gL.marginHeight = 0;
+ composite.setLayout(gL);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ this.executeSearch = new Button(composite, SWT.NONE);
+ this.executeSearch.setText("Search");
+ this.executeSearch.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (entryChanged) {
+ entryChanged = false;
+ updateFromSourceField();
+ }
+ }
+ });
+ this.executeSearch.addListener(SWT.Selection, this);
+ this.executeSearch.setEnabled(false);
+ this.executeSearch.setFont(getFont());
+ this.executeSearch.setToolTipText(SEARCH_BUTTON_TOOLTIP);
+ }
+
+ private void updateFromSourceField() {
+ setSearchQuery(getQuery());
+ updateWidgetEnablements();
+ }
+
+ private void setSearchQuery(String query) {
+ if (Strings.isValid(query)) {
+ String[] currentItems = this.searchArea.getItems();
+ int selectionIndex = -1;
+ for (int i = 0; i < currentItems.length; i++) {
+ if (currentItems[i].equals(query)) {
+ selectionIndex = i;
+ }
+ }
+ if (selectionIndex < 0) {
+ int oldLength = currentItems.length;
+ String[] newItems = new String[oldLength + 1];
+ System.arraycopy(currentItems, 0, newItems, 0, oldLength);
+ newItems[oldLength] = query;
+ this.searchArea.setItems(newItems);
+ selectionIndex = oldLength;
+ }
+ this.searchArea.select(selectionIndex);
+ }
+ }
+
+ public String getQuery() {
+ String toReturn = "";
+ if (Widgets.isAccessible(this.searchArea)) {
+ String query = this.searchArea.getText();
+ if (Strings.isValid(query)) {
+ toReturn = query;
+ }
+ }
+ return toReturn;
+ }
+
+ private void updateWidgetEnablements() {
+ if (Widgets.isAccessible(this.searchArea)) {
+ String value = this.searchArea.getText();
+ if (value != null) {
+ value = value.trim();
+ }
+ if (Widgets.isAccessible(this.executeSearch)) {
+ this.executeSearch.setEnabled(Strings.isValid(value));
+ }
+ if (Widgets.isAccessible(this.clear)) {
+ this.clear.setEnabled(this.searchArea.getItemCount() > 0);
+ }
+ }
+ }
+
+ public void handleEvent(Event event) {
+ updateWidgetEnablements();
+ notifyListener(event);
+ }
+
+ public void addListener(Listener listener) {
+ synchronized (listeners) {
+ this.listeners.add(listener);
+ }
+ }
+
+ public void removeListener(Listener listener) {
+ synchronized (listeners) {
+ this.listeners.remove(listener);
+ }
+ }
+
+ private void notifyListener(Event event) {
+ synchronized (listeners) {
+ for (Listener listener : listeners) {
+ listener.handleEvent(event);
+ }
+ }
+ }
+
+ public String[] getQueryHistory() {
+ return Widgets.isAccessible(this.searchArea) ? this.searchArea.getItems() : new String[0];
+ }
+
+ private void setCombo(List<String> values, String lastSelected) {
+ int toSelect = 0;
+ for (int i = 0; i < values.size(); i++) {
+ String toStore = values.get(i);
+ if (Strings.isValid(toStore)) {
+ this.searchArea.add(toStore);
+ if (toStore.equals(lastSelected)) {
+ toSelect = i;
+ this.searchArea.select(toSelect);
+ }
+ }
+ }
+ }
+
+ public void restoreWidgetValues(List<String> querySearches, String lastSelected, Map<String, Boolean> options, Map<String, String[]> configs) {
+ String currentSearch = getQuery();
+
+ // Add stored directories into selector
+ if (Strings.isValid(lastSelected) == false && currentSearch != null) {
+ lastSelected = currentSearch;
+ }
+
+ if (querySearches == null || querySearches.isEmpty()) {
+ if (Strings.isValid(lastSelected)) {
+ querySearches = new ArrayList<String>();
+ querySearches.add(lastSelected);
+ } else {
+ querySearches = Collections.emptyList();
+ }
+ }
+ setCombo(querySearches, lastSelected);
+ }
+
+ public boolean isExecuteSearchEvent(Event event) {
+ boolean toReturn = false;
+ Widget widget = event.widget;
+ if (widget != null) {
+ if (widget.equals(this.executeSearch)) {
+ toReturn = true;
+ } else if (widget.equals(this.searchArea) && event.type == SWT.KeyUp && event.character == '\r') {
+ toReturn = true;
+ }
+ }
+ return toReturn;
+ }
+
+ public void setToolTipForSearchCombo(String toolTip) {
+ if (Widgets.isAccessible(this.searchArea)) {
+ this.searchArea.setToolTipText(toolTip);
+ }
+ }
+
+ public void setHelpContext(String helpContext) {
+ if (Widgets.isAccessible(this.searchArea) && Widgets.isAccessible(this.executeSearch) && Widgets.isAccessible(this.clear)) {
+ SkynetGuiPlugin.getInstance().setHelp(searchArea, helpContext);
+ SkynetGuiPlugin.getInstance().setHelp(executeSearch, helpContext);
+ SkynetGuiPlugin.getInstance().setHelp(clear, helpContext);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ArbitrationServerPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ArbitrationServerPage.java
new file mode 100644
index 00000000000..aaa5f3a48a5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ArbitrationServerPage.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.framework.core.client.OseeClientProperties;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+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.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArbitrationServerPage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public ArbitrationServerPage() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite content = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ content.setLayout(layout);
+ content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Group resourceGroup = new Group(content, SWT.NONE);
+ resourceGroup.setLayout(new GridLayout());
+ resourceGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ resourceGroup.setText("OSEE Arbitration");
+
+ Composite resourceComposite = new Composite(resourceGroup, SWT.NONE);
+ resourceComposite.setLayout(new GridLayout(2, false));
+ resourceComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ boolean wasArbitrationOverriden = Strings.isValid(OseeClientProperties.getOseeApplicationServer());
+ String defaultArbitrationServer = null;
+ if (!wasArbitrationOverriden) {
+ try {
+ defaultArbitrationServer = HttpUrlBuilder.getInstance().getArbitrationServerPrefix();
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+
+ String defaultApplicationServer = null;
+ try {
+ defaultApplicationServer = HttpUrlBuilder.getInstance().getApplicationServerPrefix();
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex.toString(), ex);
+ }
+
+ List<Data> entries = new ArrayList<Data>();
+
+ if (wasArbitrationOverriden) {
+ entries.add(new Data("Arbitration", "Disabled", Display.getDefault().getSystemColor(SWT.COLOR_RED)));
+ entries.add(new Data("Application Server: ", defaultApplicationServer != null ? defaultApplicationServer : ""));
+ } else {
+ entries.add(new Data("Arbitration Server: ", defaultArbitrationServer != null ? defaultArbitrationServer : ""));
+ entries.add(new Data("Version To Match: ", OseeCodeVersion.getVersion()));
+ entries.add(new Data("Resolved To Server: ", defaultApplicationServer != null ? defaultApplicationServer : ""));
+ }
+ for (Data entry : entries) {
+ Label label1 = new Label(resourceComposite, SWT.NONE);
+ label1.setForeground(entry.getLabelColor());
+ label1.setText(entry.getLabelText());
+
+ Label label2 = new Label(resourceComposite, SWT.NONE);
+ label2.setForeground(entry.getDataColor());
+ label2.setText(entry.getDataText());
+ }
+ return content;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+ */
+ public void init(IWorkbench workbench) {
+ setPreferenceStore(SkynetGuiPlugin.getInstance().getPreferenceStore());
+ setDescription("See default Arbitration Server below.");
+ }
+
+ private final class Data {
+ private String label;
+ private Color labelColor;
+ private String value;
+ private Color valueColor;
+
+ public Data(String label, Color labelColor, String value, Color valueColor) {
+ super();
+ this.label = label;
+ this.labelColor = labelColor;
+ this.value = value;
+ this.valueColor = valueColor;
+ }
+
+ public Data(String label, Color labelColor, String value) {
+ this(label, labelColor, value, Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
+ }
+
+ public Data(String label, String value, Color valueColor) {
+ this(label, Display.getDefault().getSystemColor(SWT.COLOR_BLUE), value, valueColor);
+ }
+
+ public Data(String label, String value) {
+ this(label, Display.getDefault().getSystemColor(SWT.COLOR_BLUE), value, Display.getDefault().getSystemColor(
+ SWT.COLOR_BLACK));
+ }
+
+ public String getLabelText() {
+ return label;
+ }
+
+ public Color getLabelColor() {
+ return labelColor;
+ }
+
+ public String getDataText() {
+ return value;
+ }
+
+ public Color getDataColor() {
+ return valueColor;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ConfigurationDetails.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ConfigurationDetails.java
new file mode 100644
index 00000000000..554066acebc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/ConfigurationDetails.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.framework.ui.skynet.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.framework.core.data.OseeCodeVersion;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.event.RemoteEventManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.layout.FillLayout;
+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.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConfigurationDetails extends PreferencePage implements IWorkbenchPreferencePage {
+ private static final String HTML_HEADER =
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html14/loose.dtd\">\n";
+
+ private static final String CSS_SHEET =
+ "<style type=\"text/css\"> table.oseeTable { font: 0.7em \"arial\", serif; border-width: 1px 1px 1px 1px; border-spacing: 2px; border-style: solid solid solid solid; border-color: blue blue blue blue; border-collapse: separate; background-color: rgb(255, 250, 250); } " + " table.oseeTable th { border-width: 1px 1px 1px 1px; padding: 4px 4px 4px 4px; border-style: solid solid solid solid; border-color: black black black black; background-color: white; -moz-border-radius: 0px 0px 0px 0px; } " + " table.oseeTable td { border-width: 1px 1px 1px 1px; padding: 4px 4px 4px 4px; border-style: solid solid solid solid; border-color: black black black black; background-color: white; -moz-border-radius: 0px 0px 0px 0px; } </style>\n";
+
+ private static final String PAGE_TEMPLATE =
+ HTML_HEADER + "<html>\n<head>\n" + CSS_SHEET + "</head>\n<body>\n%s</body>\n</html>";
+
+ private Browser browser;
+
+ public ConfigurationDetails() {
+ super();
+ this.browser = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+ */
+ public void init(IWorkbench workbench) {
+ setPreferenceStore(SkynetGuiPlugin.getInstance().getPreferenceStore());
+ setDescription("See below for OSEE configuration details.");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite content = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ content.setLayout(layout);
+ content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Group composite = new Group(content, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Connections");
+
+ browser = new Browser(composite, SWT.READ_ONLY | SWT.BORDER);
+ browser.setLayout(new FillLayout());
+ browser.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ generatePage();
+ }
+ });
+ return content;
+ }
+
+ private void generatePage() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<table class=\"oseeTable\" width=\"100%\">");
+ builder.append(AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "Info", "Status"}));
+
+ builder.append(AHTML.addRowMultiColumnTable(new String[] {"<b>OSEE Client Version</b>",
+ OseeCodeVersion.getVersion(), "<font color=\"green\"><b>Ok</b></font>"}));
+ for (IHealthStatus status : OseeLog.getStatus()) {
+ builder.append(AHTML.addRowMultiColumnTable(new String[] {
+ "<b>" + status.getSourceName() + "</b>",
+ status.getMessage().replaceAll("]", "]<br/>"),
+ status.isOk() ? "<font color=\"green\"><b>Ok</b></font>" : "<font color=\"red\"><b>Unavailable</b></font>"}));
+ }
+ builder.append(AHTML.addRowMultiColumnTable(new String[] {
+ "<b>Remote Event Service</b>",
+ "",
+ RemoteEventManager.isConnected() ? "<font color=\"green\"><b>Ok</b></font>" : "<font color=\"red\"><b>Unavailable</b></font>"}));
+
+ builder.append(AHTML.endMultiColumnTable());
+ browser.setText(String.format(PAGE_TEMPLATE, builder.toString()));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DefaultWithStringAndIntegerFields.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DefaultWithStringAndIntegerFields.java
new file mode 100644
index 00000000000..0efe6c58bdf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DefaultWithStringAndIntegerFields.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.preferences;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DefaultWithStringAndIntegerFields extends FieldEditor {
+ private static final String CUSTOM_BUTTON_KEY = ".custom";
+ private static final String STRING_FIELD_KEY = ".stringField";
+ private static final String INTEGER_FIELD_KEY = ".integerField";
+
+ private Button defaultButton;
+ private Button userButton;
+ private Label defaultLabel;
+ private Text text1;
+ private Text text2;
+ private String defaultValue;
+ private String labelText1;
+ private String labelText2;
+ private Composite textComposite;
+
+ public DefaultWithStringAndIntegerFields(String name, String defaultValue, String labelText1, String labelText2, Composite parent) {
+ super();
+ Assert.isNotNull(defaultValue);
+ this.defaultValue = defaultValue;
+ this.labelText1 = labelText1;
+ this.labelText2 = labelText2;
+
+ init(name, "");
+ createControl(parent);
+ }
+
+ @Override
+ protected void adjustForNumColumns(int numColumns) {
+ }
+
+ @Override
+ protected void doFillIntoGrid(Composite parent, int numColumns) {
+ }
+
+ @Override
+ protected void createControl(Composite parent) {
+ Composite baseComposite = new Composite(parent, SWT.NONE);
+ baseComposite.setLayout(new GridLayout());
+ baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Composite buttonComposite = new Composite(baseComposite, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout(2, false));
+ buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ defaultButton = new Button(buttonComposite, SWT.RADIO);
+ defaultButton.setText("Default: ");
+
+ defaultLabel = new Label(buttonComposite, SWT.NONE);
+ defaultLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true, false));
+ defaultLabel.setText(defaultValue);
+
+ userButton = new Button(buttonComposite, SWT.RADIO);
+ userButton.setText("User Defined: ");
+
+ createCustomArea(baseComposite);
+ attachListeners();
+ }
+
+ private void createCustomArea(Composite parent) {
+ textComposite = new Composite(parent, SWT.BORDER);
+ GridLayout gridLayout = new GridLayout(2, false);
+ textComposite.setLayout(gridLayout);
+ textComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Label text1Label = new Label(textComposite, SWT.NONE);
+ text1Label.setText(labelText1);
+
+ text1 = new Text(textComposite, SWT.BORDER | SWT.SINGLE);
+ text1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Label text2Label = new Label(textComposite, SWT.NONE);
+ text2Label.setText(labelText2);
+
+ text2 = new Text(textComposite, SWT.BORDER | SWT.SINGLE);
+ text2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ }
+
+ @Override
+ protected void doLoad() {
+ performLoad();
+ }
+
+ @Override
+ protected void doLoadDefault() {
+ performLoad();
+ }
+
+ @Override
+ protected void doStore() {
+ IPreferenceStore store = getPreferenceStore();
+ if (userButton.getSelection()) {
+ String textField = text1.getText();
+ String integerField = text2.getText();
+ if (areValuesValid(textField, integerField)) {
+ store.setValue(getPreferenceName() + CUSTOM_BUTTON_KEY, true);
+ store.setValue(getPreferenceName() + STRING_FIELD_KEY, textField);
+ store.setValue(getPreferenceName() + INTEGER_FIELD_KEY, integerField);
+ store.setValue(getPreferenceName(), textField + ":" + integerField);
+ }
+ } else {
+ store.setValue(getPreferenceName() + CUSTOM_BUTTON_KEY, false);
+ store.setValue(getPreferenceName(), defaultValue);
+ }
+ }
+
+ public String getSelected() {
+ String toReturn = defaultValue;
+ if (userButton.getSelection()) {
+ String textField = text1.getText();
+ String integerField = text2.getText();
+ if (areValuesValid(textField, integerField)) {
+ toReturn = String.format("http://%s:%s", textField, integerField);
+ }
+ }
+ return toReturn;
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 2;
+ }
+
+ private boolean areValuesValid(String textField, String integerField) {
+ boolean toReturn = false;
+ if (Strings.isValid(textField)) {
+ try {
+ Integer integer = new Integer(integerField);
+ if (integer != null) {
+ toReturn = true;
+ }
+ } catch (NumberFormatException ex) {
+ }
+ }
+ return toReturn;
+ }
+
+ private void performLoad() {
+ IPreferenceStore store = getPreferenceStore();
+ boolean wasCustomSelected = store.getBoolean(getPreferenceName() + CUSTOM_BUTTON_KEY);
+ String stringField = store.getString(getPreferenceName() + STRING_FIELD_KEY);
+ String integerField = store.getString(getPreferenceName() + INTEGER_FIELD_KEY);
+ if (wasCustomSelected && areValuesValid(stringField, integerField)) {
+ selectDefaultButton(false);
+ text1.setText(stringField);
+ text2.setText(integerField);
+ } else {
+ selectDefaultButton(true);
+ }
+ }
+
+ private void attachListeners() {
+ defaultButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectDefaultButton(defaultButton.getSelection());
+ }
+ });
+ }
+
+ private void selectDefaultButton(boolean isSelected) {
+ defaultButton.setSelection(isSelected);
+ defaultLabel.setEnabled(isSelected);
+ userButton.setSelection(!isSelected);
+ textComposite.setEnabled(!isSelected);
+ for (Control child : textComposite.getChildren()) {
+ child.setEnabled(!isSelected);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DiffPreferencePage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DiffPreferencePage.java
new file mode 100644
index 00000000000..19e4bed32e1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/DiffPreferencePage.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.framework.ui.skynet.preferences;
+
+import java.util.logging.Level;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Theron Virgin
+ */
+public class DiffPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+ public static final String IDENTFY_IMAGE_CHANGES = "IdentifyImageChangesInWordDiff";
+ public static final String REMOVE_TRACKED_CHANGES = "RemoveTrackedChangesInWordDiff";
+ private Button identifyImageChangesInWord;
+ private Button removeTrackedChangesInWord;
+
+ @Override
+ protected Control createContents(Composite parent) {
+ noDefaultAndApplyButton();
+ // TODO Temporary until editor opening can be configured by users
+ identifyImageChangesInWord = new Button(parent, SWT.CHECK);
+ identifyImageChangesInWord.setText("Do Not Display OSEE Detected Image Change Indication in Differences");
+ try {
+ identifyImageChangesInWord.setSelection(StaticIdManager.hasValue(UserManager.getUser(), IDENTFY_IMAGE_CHANGES));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ // TODO Temporary until editor opening can be configured by users
+ removeTrackedChangesInWord = new Button(parent, SWT.CHECK);
+ removeTrackedChangesInWord.setText("Do Not Remove Word Tracked Changes prior to Diffing");
+ try {
+ removeTrackedChangesInWord.setSelection(StaticIdManager.hasValue(UserManager.getUser(), IDENTFY_IMAGE_CHANGES));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return parent;
+ }
+
+ /**
+ * initialize the preference store to use with the workbench
+ */
+ public void init(IWorkbench workbench) {
+ }
+
+ @Override
+ protected void performDefaults() {
+ }
+
+ @Override
+ protected void performApply() {
+ performOk();
+ }
+
+ @Override
+ public boolean performOk() {
+ try {
+ if (identifyImageChangesInWord.getSelection()) {
+ StaticIdManager.setSingletonAttributeValue(UserManager.getUser(), IDENTFY_IMAGE_CHANGES);
+ } else {
+ UserManager.getUser().deleteAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, IDENTFY_IMAGE_CHANGES);
+ }
+ UserManager.getUser().persistAttributes();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ try {
+ if (removeTrackedChangesInWord.getSelection()) {
+ StaticIdManager.setSingletonAttributeValue(UserManager.getUser(), REMOVE_TRACKED_CHANGES);
+ } else {
+ UserManager.getUser().deleteAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE, REMOVE_TRACKED_CHANGES);
+ }
+ UserManager.getUser().persistAttributes();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return super.performOk();
+ }
+
+ /**
+ * Creates composite control and sets the default layout data.
+ *
+ * @param parent the parent of the new composite
+ * @param numColumns the number of columns for the new composite
+ * @return the newly-created composite
+ */
+ private Composite createComposite(Composite parent, int numColumns) {
+ Composite composite = new Composite(parent, SWT.NULL);
+
+ //GridLayout
+ GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ composite.setLayout(layout);
+
+ //GridData
+ GridData data = new GridData();
+ data.verticalAlignment = GridData.FILL;
+ data.horizontalAlignment = GridData.FILL;
+ composite.setLayoutData(data);
+ return composite;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/EditorsPreferencePage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/EditorsPreferencePage.java
new file mode 100644
index 00000000000..7390cd132ee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/preferences/EditorsPreferencePage.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.framework.ui.skynet.preferences;
+
+import java.util.logging.Level;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+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;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+public class EditorsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public static String PreviewOnDoubleClickForWordArtifacts = "PreviewOnDoubleClickForWordArtifacts";
+ private Button previewOnDoubleClickForWordArtifacts;
+
+ @Override
+ protected Control createContents(Composite parent) {
+
+ //Page Composite
+ Composite composite = createComposite(parent, 3);
+
+ // TODO Temporary until editor opening can be configured by users
+ previewOnDoubleClickForWordArtifacts = new Button(composite, SWT.CHECK);
+ previewOnDoubleClickForWordArtifacts.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
+ previewOnDoubleClickForWordArtifacts.setText("Open MS Word preview on double-click of MS Word Artifact");
+ try {
+ previewOnDoubleClickForWordArtifacts.setSelection(StaticIdManager.hasValue(UserManager.getUser(),
+ PreviewOnDoubleClickForWordArtifacts));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return composite;
+ }
+
+ /**
+ * initialize the preference store to use with the workbench
+ */
+ public void init(IWorkbench workbench) {
+ }
+
+ @Override
+ protected void performDefaults() {
+ }
+
+ @Override
+ protected void performApply() {
+ performOk();
+ }
+
+ @Override
+ public boolean performOk() {
+ try {
+ if (previewOnDoubleClickForWordArtifacts.getSelection()) {
+ StaticIdManager.setSingletonAttributeValue(UserManager.getUser(), PreviewOnDoubleClickForWordArtifacts);
+ } else {
+ UserManager.getUser().deleteAttribute(StaticIdManager.STATIC_ID_ATTRIBUTE,
+ PreviewOnDoubleClickForWordArtifacts);
+ }
+ UserManager.getUser().persistAttributes();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return super.performOk();
+ }
+
+ /**
+ * Creates composite control and sets the default layout data.
+ *
+ * @param parent the parent of the new composite
+ * @param numColumns the number of columns for the new composite
+ * @return the newly-created composite
+ */
+ private Composite createComposite(Composite parent, int numColumns) {
+ Composite composite = new Composite(parent, SWT.NULL);
+
+ //GridLayout
+ GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ composite.setLayout(layout);
+
+ //GridData
+ GridData data = new GridData();
+ data.verticalAlignment = GridData.FILL;
+ data.horizontalAlignment = GridData.FILL;
+ composite.setLayoutData(data);
+ return composite;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogContentProvider.java
new file mode 100644
index 00000000000..58d54a2652e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogContentProvider.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.framework.ui.skynet.queryLog;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.core.query.QueryLog;
+import org.eclipse.osee.framework.db.connection.core.query.QueryRecord;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class QueryLogContentProvider implements ITreeContentProvider {
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof QueryLog) {
+ return ((QueryLog) parentElement).getRecords().toArray();
+ } else if (parentElement instanceof QueryRecord) {
+ QueryRecord record = (QueryRecord) parentElement;
+
+ if (record.getSqlException() != null) {
+ return new Object[] {record.getSqlException()};
+ }
+ return record.getBindVariables();
+ } else if (parentElement instanceof Exception) {
+ return ((Exception) parentElement).getStackTrace();
+ }
+ return null;
+ }
+
+ // Only needed to support the reveal() method, not implementing yet
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof QueryLog) {
+ return ((QueryLog) element).getRecords().size() > 0;
+ } else if (element instanceof QueryRecord) {
+ QueryRecord record = (QueryRecord) element;
+ return record.getBindVariables().length > 0 || record.getSqlException() != null;
+ } else if (element instanceof Exception) {
+ return ((Exception) element).getStackTrace().length > 0;
+ }
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof QueryLog) {
+ return getChildren(inputElement);
+ }
+ throw new IllegalArgumentException("Expect a " + QueryLog.class.getCanonicalName() + " object");
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogLabelProvider.java
new file mode 100644
index 00000000000..e0bc4639ffe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogLabelProvider.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.framework.ui.skynet.queryLog;
+
+import static org.eclipse.osee.framework.ui.skynet.queryLog.QueryLogView.DURATION;
+import static org.eclipse.osee.framework.ui.skynet.queryLog.QueryLogView.ITEM;
+import static org.eclipse.osee.framework.ui.skynet.queryLog.QueryLogView.TIME;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.db.connection.core.query.QueryRecord;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class QueryLogLabelProvider extends XViewerLabelProvider {
+ private static final DateFormat TIME_FORMAT = new SimpleDateFormat("hh:mm:ss.SSS a");
+ private final ISharedImages sharedImages;
+
+ /**
+ * @param viewer
+ */
+ public QueryLogLabelProvider(XViewer viewer) {
+ super(viewer);
+ sharedImages = PlatformUI.getWorkbench().getSharedImages();
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (element instanceof QueryRecord) {
+ if (((QueryRecord) element).getSqlException() != null) {
+ return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
+ }
+ } else if (element instanceof Exception) {
+ return sharedImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+ } else if (element instanceof String) {
+ return sharedImages.getImage(ISharedImages.IMG_OBJ_ELEMENT);
+ }
+ return null;
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerLabelProvider#getColumnImage(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) {
+ // Since getColumnimage is overridden, this method will not be called
+ return null;
+ }
+
+ public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) {
+ String columnName = xCol.getName();
+
+ if (element instanceof QueryRecord) {
+ QueryRecord record = (QueryRecord) element;
+
+ if (columnName.equals(ITEM)) {
+ return record.getSql();
+ } else if (columnName.equals(TIME)) {
+ return TIME_FORMAT.format(record.getDate());
+ } else if (columnName.equals(DURATION)) {
+ if (record.getRunDurationMs() != null) {
+ return record.getRunDurationMs().toString();
+ }
+ }
+ } else if (columnName.equals(ITEM)) {
+ return element.toString();
+ }
+ return null;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogView.java
new file mode 100644
index 00000000000..6d1bbe41211
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogView.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.queryLog;
+
+import java.util.Iterator;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.db.connection.core.query.QueryLog;
+import org.eclipse.osee.framework.db.connection.core.query.QueryRecord;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.ui.plugin.util.SelectionCountChangeListener;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+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.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class QueryLogView extends ViewPart implements IActionable {
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.QueryLogView";
+ public static final String ITEM = "Item";
+ public static final String TIME = "Time";
+ public static final String DURATION = "Run ms";
+
+ private XViewer viewer;
+ private Clipboard clipboard;
+
+ @Override
+ public void createPartControl(Composite parent) {
+
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(parent)) return;
+
+ clipboard = new Clipboard(null);
+
+ parent.setLayout(new GridLayout(1, false));
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ viewer =
+ new XViewer(parent, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION, new QueryLogXViewerFactory(), false, false);
+ viewer.setContentProvider(new QueryLogContentProvider());
+ viewer.setLabelProvider(new QueryLogLabelProvider(viewer));
+ viewer.setInput(QueryLog.getInstance());
+ viewer.addSelectionChangedListener(new SelectionCountChangeListener(getViewSite()));
+
+ Tree tree = viewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL | GridData.GRAB_HORIZONTAL);
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ tree.addKeyListener(new KeySelectedListener());
+
+ createActions();
+ setHelpContexts();
+ }
+
+ private void createActions() {
+
+ Action refreshAction = new Action("Refresh") {
+
+ @Override
+ public void run() {
+ viewer.refresh();
+ }
+ };
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ refreshAction.setToolTipText("Refresh");
+
+ Action clearLogAction = new Action("Delete Log") {
+
+ @Override
+ public void run() {
+ ((QueryLog) viewer.getInput()).clear();
+ viewer.refresh();
+ }
+ };
+ clearLogAction.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("delete_edit.gif"));
+ clearLogAction.setToolTipText("Delete Log");
+
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(refreshAction);
+ toolbarManager.add(clearLogAction);
+ viewer.addCustomizeToViewToolbar(this);
+ OseeAts.addBugToViewToolbar(this, this, SkynetGuiPlugin.getInstance(), VIEW_ID, "Query Log");
+ }
+
+ private void setHelpContexts() {
+ SkynetGuiPlugin.getInstance().setHelp(viewer.getControl(), "query_log_table");
+ }
+
+ @Override
+ public void setFocus() {
+ if (viewer != null) viewer.getControl().setFocus();
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ private void performCopy() {
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+ if (selection.isEmpty()) {
+ return;
+ }
+ Object selected = selection.getFirstElement();
+
+ String text = null;
+
+ if (selected instanceof QueryRecord) {
+ text = ((QueryRecord) selected).getSql();
+ } else if (selected instanceof String) {
+ text = ((String) selected).replaceAll(".*:", "");
+ } else if (selected instanceof Exception) {
+ text = Lib.exceptionToString((Exception) selected);
+ } else {
+ text = selected.toString();
+ }
+ clipboard.setContents(new Object[] {text}, new Transfer[] {TextTransfer.getInstance()});
+ }
+
+ private class KeySelectedListener implements KeyListener {
+ public void keyPressed(KeyEvent e) {
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.keyCode == 'a' && e.stateMask == SWT.CONTROL) {
+ viewer.getTree().selectAll();
+ } else if (e.keyCode == 'x' && e.stateMask == SWT.CONTROL) {
+ expandAll((IStructuredSelection) viewer.getSelection());
+ } else if (e.keyCode == 'c' && e.stateMask == SWT.CONTROL) {
+ performCopy();
+ }
+ }
+ }
+
+ private void expandAll(IStructuredSelection selection) {
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ viewer.expandToLevel(iter.next(), TreeViewer.ALL_LEVELS);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogXViewerFactory.java
new file mode 100644
index 00000000000..aac42e25c4e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/queryLog/QueryLogXViewerFactory.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.framework.ui.skynet.queryLog;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class QueryLogXViewerFactory extends SkynetXViewerFactory {
+
+ public QueryLogXViewerFactory() {
+ super("org.eclipse.osee.framework.ui.skynet.QueryLogView");
+ }
+
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new XViewerSorter(xViewer);
+ }
+
+ public CustomizeData getDefaultTableCustomizeData() {
+ CustomizeData custData = new CustomizeData();
+ List<XViewerColumn> defaultColumns = new ArrayList<XViewerColumn>();
+ defaultColumns.add(new XViewerColumn("queryLog." + QueryLogView.ITEM, QueryLogView.ITEM, 400, SWT.LEFT, true,
+ SortDataType.String, false, null));
+ defaultColumns.add(new XViewerColumn("queryLog." + QueryLogView.TIME, QueryLogView.TIME, 100, SWT.CENTER, true,
+ SortDataType.String, false, null));
+ defaultColumns.add(new XViewerColumn("queryLog." + QueryLogView.DURATION, QueryLogView.DURATION, 100, SWT.CENTER,
+ true, SortDataType.Float, false, null));
+ custData.getColumnData().setColumns(defaultColumns);
+ return custData;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#getDefaultXViewerColumn()
+ */
+ @Override
+ public XViewerColumn getDefaultXViewerColumn(String id) {
+ for (XViewerColumn xCol : getDefaultTableCustomizeData().getColumnData().getColumns()) {
+ if (xCol.getId().equals(id)) {
+ return xCol;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModel.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModel.java
new file mode 100644
index 00000000000..642447d3433
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModel.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.framework.ui.skynet.relation.explorer;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+
+public class ArtifactModel {
+
+ private boolean add;
+ private boolean artifactFound;
+ private Artifact artifact;
+ private String name;
+ private ArtifactType descriptor;
+ private String rationale;
+
+ public ArtifactModel(String name, ArtifactType descriptor) {
+ this(false, null, name, descriptor, "");
+ }
+
+ public ArtifactModel(Artifact artifact) {
+ this(true, artifact, artifact.getDescriptiveName(), artifact.getArtifactType(), "");
+ }
+
+ private ArtifactModel(boolean artifactFound, Artifact artifact, String name, ArtifactType descriptor, String rationale) {
+ this.add = true;
+ this.artifactFound = artifactFound;
+ this.artifact = artifact;
+ this.name = name;
+ this.descriptor = descriptor;
+ this.rationale = rationale;
+ }
+
+ /**
+ * @return Returns the artifact.
+ */
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ /**
+ * @return Returns the add.
+ */
+ public boolean isAdd() {
+ return add;
+ }
+
+ /**
+ * @param add The add to set.
+ */
+ public void setAdd(boolean add) {
+ this.add = add;
+ }
+
+ /**
+ * @return Returns the artifact.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name - The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return Returns the descriptor.
+ */
+ public ArtifactType getDescriptor() {
+ return descriptor;
+ }
+
+ /**
+ * @param descriptor The descriptor to set.
+ */
+ public void setDescriptor(ArtifactType descriptor) {
+ this.descriptor = descriptor;
+ }
+
+ /**
+ * @return Returns the rationale.
+ */
+ public String getRationale() {
+ return rationale;
+ }
+
+ /**
+ * @param rationale The rationale to set.
+ */
+ public void setRationale(String rationale) {
+ this.rationale = rationale;
+ }
+
+ /**
+ * @return Returns the artifactFound.
+ */
+ public boolean isArtifactFound() {
+ return artifactFound;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelLabelProvider.java
new file mode 100644
index 00000000000..a6c03eb5e6b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelLabelProvider.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.framework.ui.skynet.relation.explorer;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Image;
+
+public class ArtifactModelLabelProvider implements ITableLabelProvider {
+
+ public static final OseeUiActivator plugin = SkynetGuiPlugin.getInstance();
+
+ public ArtifactModelLabelProvider() {
+ super();
+ };
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ String result = "";
+ ArtifactModel model = (ArtifactModel) element;
+
+ switch (columnIndex) {
+ case RelationTableViewer.ADD_NUM:
+ // This only has an image
+ break;
+ case RelationTableViewer.ARTIFACT_NAME_NUM:
+ result = model.getName();
+ break;
+ case RelationTableViewer.ARTIFACT_TYPE_NUM:
+ result = model.getDescriptor().getName();
+ break;
+ case RelationTableViewer.RATIONALE_NUM:
+ result = model.getRationale();
+ break;
+ default:
+ break;
+ }
+ return result;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ ArtifactModel model = (ArtifactModel) element;
+ switch (columnIndex) {
+ case RelationTableViewer.ADD_NUM:
+ if (model.isAdd())
+ return ImageManager.getImage(FrameworkImage.CHECKBOX_ENABLED);
+ else
+ return ImageManager.getImage(FrameworkImage.CHECKBOX_DISABLED);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+ * java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelList.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelList.java
new file mode 100644
index 00000000000..1b56e68e039
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/ArtifactModelList.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.framework.ui.skynet.relation.explorer;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class ArtifactModelList {
+
+ private ArrayList<ArtifactModel> artifacts = new ArrayList<ArtifactModel>();
+ private Set<IArtifactListViewer> changeListeners = new HashSet<IArtifactListViewer>();
+
+ /**
+ * Constructor
+ */
+ public ArtifactModelList() {
+ super();
+ artifacts = new ArrayList<ArtifactModel>();
+ changeListeners = new HashSet<IArtifactListViewer>();
+ }
+
+ /**
+ * Return the collection of ItemTask
+ */
+ public ArrayList<ArtifactModel> getArtifacts() {
+ return artifacts;
+ }
+
+ /**
+ * Add a new task to the collection of tasks
+ */
+ public void addArtifact(ArtifactModel artifact, boolean top) {
+ if (top)
+ artifacts.add(0, artifact);
+ else
+ artifacts.add(artifacts.size(), artifact);
+ Iterator<IArtifactListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ iterator.next().addArtifact(artifact);
+ }
+
+ /**
+ * @param artifact -
+ */
+ public void removeArtifact(ArtifactModel artifact) {
+ artifacts.remove(artifact);
+ Iterator<IArtifactListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ iterator.next().removeArtifact(artifact);
+ }
+
+ public String toString() {
+ String str = "";
+ for (int i = 0; i < artifacts.size(); i++) {
+ String name = artifacts.get(i).getName();
+ str += "\nTask " + name;
+ }
+ return str + "\n\n";
+ }
+
+ /**
+ * @param artifact -
+ */
+ public void artifactChanged(ArtifactModel artifact) {
+ Iterator<IArtifactListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ iterator.next().updateArtifact(artifact);
+ }
+
+ /**
+ * @param viewer
+ */
+ public void removeChangeListener(IArtifactListViewer viewer) {
+ changeListeners.remove(viewer);
+ }
+
+ /**
+ * @param viewer
+ */
+ public void addChangeListener(IArtifactListViewer viewer) {
+ changeListeners.add(viewer);
+ }
+
+ public ArrayList<ArtifactModel> getArtifactModel() {
+ return artifacts;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/IArtifactListViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/IArtifactListViewer.java
new file mode 100644
index 00000000000..d4da7414be7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/IArtifactListViewer.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.framework.ui.skynet.relation.explorer;
+
+public interface IArtifactListViewer {
+
+ /**
+ * Update the view to reflect the fact that a ArtifactModel was added to the ArtifactModel list
+ *
+ * @param artifact -
+ */
+ public void addArtifact(ArtifactModel artifact);
+
+ /**
+ * Update the view to reflect the fact that a ArtifactModel was removed from the ArtifactModel list
+ *
+ * @param artifact -
+ */
+ public void removeArtifact(ArtifactModel artifact);
+
+ /**
+ * Update the view to reflect the fact that one of the ArtifactModels was modified
+ *
+ * @param artifact -
+ */
+ public void updateArtifact(ArtifactModel artifact);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/OnCloseListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/OnCloseListener.java
new file mode 100644
index 00000000000..e83abb9451c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/OnCloseListener.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.framework.ui.skynet.relation.explorer;
+
+public interface OnCloseListener {
+
+ public void onClose(boolean cancelled);
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationExplorerWindow.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationExplorerWindow.java
new file mode 100644
index 00000000000..484917e583d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationExplorerWindow.java
@@ -0,0 +1,354 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.relation.explorer;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeSide;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public class RelationExplorerWindow {
+
+ private RelationTableViewer relationTableViewer;
+ private final RelationTypeSide relationGroup;
+ private final boolean persistOnOk;
+ private boolean cancelled = false;
+
+ // Private arrays for valid drops
+ private final ArrayList<Artifact> validArtifacts;
+ private final ArrayList<String> urls;
+ private final ArrayList<String> names;
+ private Branch branch;
+
+ // Private arrays for invalid drops
+ private final ArrayList<String> invalidName;
+ private final ArrayList<String> invalidReason;
+ private final ArrayList<Artifact> invalidArtifacts;
+
+ private boolean needWindow;
+
+ private Shell shell;
+
+ private ArtifactType descriptor = null;
+
+ private final StructuredViewer viewer;
+
+ public static final int ADD_NUM = 0;
+ public static final int ARTIFACT_NAME_NUM = 1;
+ public static final int ARTIFACT_TYPE_NUM = 2;
+ public static final int RATIONALE_NUM = 3;
+
+ public static final int NAME_NUM = 0;
+ public static final int REASON_NUM = 1;
+
+ public RelationExplorerWindow(StructuredViewer viewer, RelationTypeSide group, boolean persistOnOk) {
+ this.validArtifacts = new ArrayList<Artifact>();
+ this.invalidArtifacts = new ArrayList<Artifact>();
+
+ this.urls = new ArrayList<String>();
+ this.names = new ArrayList<String>();
+
+ this.invalidName = new ArrayList<String>();
+ this.invalidReason = new ArrayList<String>();
+
+ this.viewer = viewer;
+ this.relationGroup = group;
+ this.persistOnOk = persistOnOk;
+ this.needWindow = false;
+
+ }
+
+ public RelationExplorerWindow(StructuredViewer viewer, RelationTypeSide group) {
+ this(viewer, group, false);
+ }
+
+ public void addValid(Artifact artifact) {
+ if (artifact == null) {
+ needWindow = true;
+ } else {
+ this.branch = artifact.getBranch();
+ this.validArtifacts.add(artifact);
+ this.names.add(artifact.getDescriptiveName());
+ }
+ }
+
+ public void addInvalid(String name, String reason) {
+ invalidName.add(name);
+ invalidReason.add(reason);
+ needWindow = true;
+ }
+
+ public void createArtifactInformationBox() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ drawWindow();
+ }
+
+ private void drawWindow() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ shell = new Shell(SWT.ON_TOP | SWT.APPLICATION_MODAL | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.RESIZE);
+
+ // Setup Title
+ shell.setText("Artifact Information");
+
+ // Setup Icon
+ Image image = ImageManager.getImage(ArtifactTypeManager.getType("Artifact"));
+ shell.setImage(image);
+
+ // Setup Form Layout
+ FormLayout layout = new FormLayout();
+ layout.marginHeight = 5;
+ layout.marginWidth = 5;
+ shell.setLayout(layout);
+
+ SashForm sashForm = new SashForm(shell, SWT.VERTICAL);
+
+ // Create valid artifact fields
+ FormLayout validLayout = new FormLayout();
+ validLayout.spacing = 5;
+
+ Composite validComposite = new Composite(sashForm, SWT.NONE);
+ validComposite.setLayout(validLayout);
+
+ Label validLabel = new Label(validComposite, SWT.LEFT);
+ validLabel.setText("Valid artifacts - will be added");
+
+ Table validTable =
+ new Table(validComposite,
+ SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
+ validTable.setLinesVisible(true);
+ validTable.setHeaderVisible(true);
+
+ // Create invalid artifacts fields
+ FormLayout invalidLayout = new FormLayout();
+ invalidLayout.spacing = 5;
+
+ Composite invalidComposite = new Composite(sashForm, SWT.NONE);
+ invalidComposite.setLayout(invalidLayout);
+
+ Label invalidLabel = new Label(invalidComposite, SWT.LEFT);
+ invalidLabel.setText("Invalid artifacts - will not be added");
+
+ Table invalidTable =
+ new Table(invalidComposite,
+ SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
+ invalidTable.setLinesVisible(true);
+ invalidTable.setHeaderVisible(true);
+
+ // Create the Buttons
+ Button okButton = new Button(invalidComposite, SWT.PUSH);
+ okButton.setText("OK");
+
+ Button cancelButton = new Button(invalidComposite, SWT.PUSH);
+ cancelButton.setText("Cancel");
+
+ // Attach validLabel to top-left corner
+ FormData data = new FormData();
+ data.top = new FormAttachment(0);
+ data.left = new FormAttachment(0);
+ validLabel.setLayoutData(data);
+
+ // Attach validTable to bottom of validLabel
+ data = new FormData();
+ data.top = new FormAttachment(validLabel);
+ data.bottom = new FormAttachment(100);
+ data.left = new FormAttachment(0);
+ data.right = new FormAttachment(100);
+ data.height = validTable.getItemHeight() * 10;
+ validTable.setLayoutData(data);
+
+ // Attach invalidLabel to top-left corner
+ data = new FormData();
+ data.top = new FormAttachment(0);
+ data.left = new FormAttachment(0);
+ invalidLabel.setLayoutData(data);
+
+ // Attach invalidTable to bottom of invalidLabel
+ data = new FormData();
+ data.top = new FormAttachment(invalidLabel);
+ data.bottom = new FormAttachment(okButton);
+ data.left = new FormAttachment(0);
+ data.right = new FormAttachment(100);
+ data.height = validTable.getItemHeight() * 10;
+ invalidTable.setLayoutData(data);
+
+ // Attach sashForm to top-left corner of shell
+ data = new FormData();
+ data.top = new FormAttachment(0);
+ data.bottom = new FormAttachment(100);
+ data.left = new FormAttachment(0);
+ data.right = new FormAttachment(100);
+ sashForm.setLayoutData(data);
+
+ // Attach buttons to bottom of sashForm
+ data = new FormData();
+ data.bottom = new FormAttachment(100);
+ data.right = new FormAttachment(100);
+ cancelButton.setLayoutData(data);
+
+ data = new FormData();
+ data.bottom = new FormAttachment(100);
+ data.right = new FormAttachment(cancelButton);
+ okButton.setLayoutData(data);
+
+ // Populate Tables
+ relationTableViewer = new RelationTableViewer(validTable, invalidTable, branch);
+ for (int i = 0; i < validArtifacts.size(); i++)
+ relationTableViewer.addValidItem(validArtifacts.get(i));
+ for (int i = 0; i < invalidName.size(); i++)
+ relationTableViewer.addInvalidItem(invalidName.get(i), invalidReason.get(i));
+
+ // Add Listeners to buttons
+ okButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ okSelected();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ cancelSelected();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ // Add shell resize listener
+ shell.addControlListener(new ControlListener() {
+
+ public void controlMoved(ControlEvent e) {
+ }
+
+ public void controlResized(ControlEvent e) {
+ relationTableViewer.resizeTable(((Shell) e.widget).getClientArea().width);
+ shell.layout();
+ }
+ });
+
+ if (needWindow) {
+ shell.pack();
+ shell.open();
+ } else {
+ okSelected();
+ }
+ }
+
+ /**
+ * Create the TableViewer
+ */
+
+ private void okSelected() {
+ ArrayList<ArtifactModel> artifactList = relationTableViewer.getArtifactList().getArtifactModel();
+
+ for (int i = 0; i < artifactList.size(); i++) {
+ ArtifactModel model = artifactList.get(i);
+
+ if (model.isAdd()) {
+ Artifact artifact = model.getArtifact();
+ descriptor = model.getDescriptor();
+ if (artifact == null) {
+ if (descriptor != null) {
+ try {
+ artifact = descriptor.makeNewArtifact(branch);
+ artifact.setSoleAttributeValue("Name", model.getName());
+ artifact.setSoleAttributeValue("Content URL", urls.get(names.indexOf(model.getName())));
+ artifact.persistAttributes();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ } else
+ artifact = model.getArtifact();
+
+ if (artifact != null) {
+ try {
+ relationGroup.getArtifact().addRelation(relationGroup, artifact);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+ if (persistOnOk) {
+ try {
+ relationGroup.getArtifact().persistRelations();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ shell.dispose();
+ viewer.refresh();
+
+ }
+
+ private void cancelSelected() {
+ cancelled = true;
+ shell.dispose();
+ }
+
+ /**
+ * @return Returns the relationGroup.
+ */
+ public RelationTypeSide getRelationGroup() {
+ return relationGroup;
+ }
+
+ /**
+ * @return Returns the cancelled.
+ */
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ /**
+ * @return Returns the invalidArtifacts.
+ */
+ public ArrayList<Artifact> getInvalidArtifacts() {
+ return invalidArtifacts;
+ }
+
+ /**
+ * @param invalidArtifact The invalidArtifact to set.
+ */
+ public void addInvalidArtifact(Artifact invalidArtifact, String errorMessage) {
+ invalidArtifacts.add(invalidArtifact);
+ addInvalid(invalidArtifact.getDescriptiveName(), errorMessage);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableCellModifier.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableCellModifier.java
new file mode 100644
index 00000000000..741f34a54cc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableCellModifier.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.framework.ui.skynet.relation.explorer;
+
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.swt.widgets.TableItem;
+
+public class RelationTableCellModifier implements ICellModifier {
+ private RelationTableViewer relationTableViewer;
+
+ public RelationTableCellModifier(RelationTableViewer relationTableViewer) {
+ super();
+ this.relationTableViewer = relationTableViewer;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+ */
+ public boolean canModify(Object element, String property) {
+ // Find the index of the column
+ int columnIndex = relationTableViewer.getColumnNames().indexOf(property);
+
+ ArtifactModel model = (ArtifactModel) element;
+ switch (columnIndex) {
+ case RelationTableViewer.ARTIFACT_NAME_NUM:
+ if (model.isArtifactFound()) return false;
+ break;
+ case RelationTableViewer.ARTIFACT_TYPE_NUM:
+ if (model.isArtifactFound()) return false;
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+ */
+ public Object getValue(Object element, String property) {
+
+ // Find the index of the column
+ int columnIndex = relationTableViewer.getColumnNames().indexOf(property);
+
+ Object result = null;
+ ArtifactModel model = (ArtifactModel) element;
+
+ switch (columnIndex) {
+ case RelationTableViewer.ADD_NUM:
+ result = new Boolean(model.isAdd());
+ break;
+ case RelationTableViewer.ARTIFACT_NAME_NUM:
+ result = new String(model.getName());
+ break;
+ case RelationTableViewer.ARTIFACT_TYPE_NUM:
+ result = model.getDescriptor();
+ break;
+ case RelationTableViewer.RATIONALE_NUM:
+ result = new String(model.getRationale());
+ break;
+ default:
+ result = "";
+ }
+ return result;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public void modify(Object element, String property, Object value) {
+
+ // Find the index of the column
+ int columnIndex = relationTableViewer.getColumnNames().indexOf(property);
+
+ TableItem item = (TableItem) element;
+ ArtifactModel model = (ArtifactModel) item.getData();
+
+ switch (columnIndex) {
+ case RelationTableViewer.ADD_NUM:
+ model.setAdd(((Boolean) value).booleanValue());
+ break;
+ case RelationTableViewer.ARTIFACT_NAME_NUM:
+ if (!model.isArtifactFound()) model.setName((String) value);
+ break;
+ case RelationTableViewer.ARTIFACT_TYPE_NUM:
+ if (!model.isArtifactFound()) {
+ model.setDescriptor((ArtifactType) value);
+ }
+ break;
+ case RelationTableViewer.RATIONALE_NUM:
+ model.setRationale((String) value);
+ break;
+ default:
+ }
+ relationTableViewer.getArtifactList().artifactChanged(model);
+ relationTableViewer.refresh();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableSorter.java
new file mode 100644
index 00000000000..e9b8b776069
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableSorter.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.framework.ui.skynet.relation.explorer;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public class RelationTableSorter extends ViewerSorter {
+
+ /**
+ * Constructor argument values that indicate to sort items by name or type.
+ */
+ public final static int ARTIFACT_NAME = 1;
+ public final static int ARTIFACT_TYPE = 2;
+
+ // Criteria that the instance uses
+ private int criteria;
+
+ /**
+ * Creates a resource sorter that will use the given sort criteria.
+ *
+ * @param criteria the sort criterion to use: one of <code>NAME</code> or <code>TYPE</code>
+ */
+ public RelationTableSorter(int criteria) {
+ super();
+ this.criteria = criteria;
+ }
+
+ /* (non-Javadoc)
+ * Method declared on ViewerSorter.
+ */
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ ArtifactModel model1 = (ArtifactModel) o1;
+ ArtifactModel model2 = (ArtifactModel) o2;
+
+ switch (criteria) {
+ case ARTIFACT_NAME:
+ return compareNames(model1, model2);
+ case ARTIFACT_TYPE:
+ return compareTypes(model1, model2);
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Returns a number reflecting the collation order of the given names based on the description.
+ *
+ * @param model1 the first task element to be ordered
+ * @param model2 the second task element to be ordered
+ * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
+ * first element is equal to the second element; and a positive number if the first element is greater than
+ * the second element
+ */
+ @SuppressWarnings("unchecked")
+ protected int compareNames(ArtifactModel model1, ArtifactModel model2) {
+ return getComparator().compare(model1.getName(), model1.getName());
+ }
+
+ /**
+ * Returns a number reflecting the collation order of the given tasks based on their owner.
+ *
+ * @param model1 the first resource element to be ordered
+ * @param model2 the second resource element to be ordered
+ * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
+ * first element is equal to the second element; and a positive number if the first element is greater than
+ * the second element
+ */
+ @SuppressWarnings("unchecked")
+ protected int compareTypes(ArtifactModel model1, ArtifactModel model2) {
+ return getComparator().compare(model1.getDescriptor().getName(), model2.getDescriptor().getName());
+ }
+
+ /**
+ * Returns the sort criteria of this this sorter.
+ *
+ * @return the sort criterion
+ */
+ public int getCriteria() {
+ return criteria;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableViewer.java
new file mode 100644
index 00000000000..29e823a4a36
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/relation/explorer/RelationTableViewer.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.framework.ui.skynet.relation.explorer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+public class RelationTableViewer {
+ private final Table validTable;
+ private TableViewer tableViewer;
+
+ private final Table invalidTable;
+
+ private ArtifactModelList artifactList;
+
+ private String[] validColumnNames;
+ private static int[] validColumnWidths;
+
+ private String[] invalidColumnNames;
+ private static int[] invalidColumnWidths;
+
+ public static final int ADD_NUM = 0;
+ public static final int ARTIFACT_NAME_NUM = 1;
+ public static final int ARTIFACT_TYPE_NUM = 2;
+ public static final int RATIONALE_NUM = 3;
+ public static final int INVALID_NAME_NUM = 0;
+ public static final int INVALID_REASON_NUM = 1;
+
+ public ArrayList<ArtifactType> fullDescriptorList;
+ private ArtifactType defaultArtifactType;
+
+ /**
+ * @param validTable -
+ * @param invalidTable -
+ */
+ public RelationTableViewer(Table validTable, Table invalidTable, Branch branch) {
+ try {
+ fullDescriptorList =
+ new ArrayList<ArtifactType>(
+ TypeValidityManager.getValidArtifactTypes(branch));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ this.validTable = validTable;
+ this.invalidTable = invalidTable;
+
+ this.createControl();
+
+ tableViewer.setContentProvider(new RelationContentProvider());
+ tableViewer.setLabelProvider(new ArtifactModelLabelProvider());
+ tableViewer.setInput(artifactList);
+ }
+
+ public void addValidItem(Artifact artifact) {
+ ArtifactModel model = new ArtifactModel(artifact);
+ artifactList.addArtifact(model, true);
+ }
+
+ public void addInvalidItem(String name, String reason) {
+ String[] itemText = new String[] {name, reason};
+ TableItem item = new TableItem(invalidTable, SWT.NONE);
+ item.setText(itemText);
+ }
+
+ private void createControl() {
+ artifactList = new ArtifactModelList();
+ createColumns();
+ createTableViewer();
+ }
+
+ /**
+ * Create the TableViewer
+ */
+ private void createTableViewer() {
+
+ tableViewer = new TableViewer(validTable);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setColumnProperties(validColumnNames);
+
+ CellEditor[] validEditors = new CellEditor[validColumnNames.length];
+ validEditors[ADD_NUM] = new CheckboxCellEditor(validTable, SWT.CENTER);
+ validEditors[ARTIFACT_NAME_NUM] = new TextCellEditor(validTable) {
+ };
+
+ String[] items = new String[fullDescriptorList.size()];
+ for (int i = 0; i < items.length; i++) {
+ items[i] = fullDescriptorList.get(i).getName();
+ }
+
+ validEditors[ARTIFACT_TYPE_NUM] = new ComboBoxCellEditor(validTable, items);
+ validEditors[RATIONALE_NUM] = new TextCellEditor(validTable);
+
+ // Assign the cell editors to the viewer
+ tableViewer.setCellEditors(validEditors);
+ // Assign the cell modifier to the viewer
+ tableViewer.setCellModifier(new RelationTableCellModifier(this));
+ }
+
+ /**
+ * Create the Columns
+ */
+ private void createColumns() {
+ validColumnNames = new String[] {"Add", "Artifact Name", "Artifact Type", "Rationale"};
+ validColumnWidths = new int[] {40, 200, 100, 500};
+
+ invalidColumnNames = new String[] {"Name", "Reason"};
+ invalidColumnWidths = new int[] {200, 640};
+
+ TableColumn column = new TableColumn(validTable, SWT.LEFT, ADD_NUM);
+ column.setText(validColumnNames[ADD_NUM]);
+ column.setWidth(validColumnWidths[ADD_NUM]);
+
+ column = new TableColumn(validTable, SWT.LEFT, ARTIFACT_NAME_NUM);
+ column.setText(validColumnNames[ARTIFACT_NAME_NUM]);
+ column.setWidth(validColumnWidths[ARTIFACT_NAME_NUM]);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new RelationTableSorter(RelationTableSorter.ARTIFACT_NAME));
+ }
+ });
+
+ column = new TableColumn(validTable, SWT.LEFT, ARTIFACT_TYPE_NUM);
+ column.setText(validColumnNames[ARTIFACT_TYPE_NUM]);
+ column.setWidth(validColumnWidths[ARTIFACT_TYPE_NUM]);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new RelationTableSorter(RelationTableSorter.ARTIFACT_TYPE));
+ }
+ });
+
+ column = new TableColumn(validTable, SWT.LEFT, RATIONALE_NUM);
+ column.setText(validColumnNames[RATIONALE_NUM]);
+ column.setWidth(validColumnWidths[RATIONALE_NUM]);
+
+ column = new TableColumn(invalidTable, SWT.LEFT, INVALID_NAME_NUM);
+ column.setText(invalidColumnNames[INVALID_NAME_NUM]);
+ column.setWidth(invalidColumnWidths[INVALID_NAME_NUM]);
+
+ column = new TableColumn(invalidTable, SWT.LEFT, INVALID_REASON_NUM);
+ column.setText(invalidColumnNames[INVALID_REASON_NUM]);
+ column.setWidth(invalidColumnWidths[INVALID_REASON_NUM]);
+ }
+
+ public List<String> getColumnNames() {
+ return Arrays.asList(validColumnNames);
+ }
+
+ public ArtifactModelList getArtifactList() {
+ return this.artifactList;
+ }
+
+ public void refresh() {
+ tableViewer.refresh();
+ }
+
+ /**
+ * @return Returns the invalidTable.
+ */
+ public Table getInvalidTable() {
+ return invalidTable;
+ }
+
+ /**
+ * @return Returns the validTable.
+ */
+ public Table getValidTable() {
+ return validTable;
+ }
+
+ public void resizeTable(int windowWidth) {
+ int otherColumns = 15;
+ for (int i = 0; i < validColumnWidths.length - 1; i++)
+ otherColumns += validColumnWidths[i];
+
+ validColumnWidths[RATIONALE_NUM] = windowWidth - otherColumns;
+ validTable.getColumns()[RATIONALE_NUM].setWidth(validColumnWidths[RATIONALE_NUM]);
+
+ otherColumns = 15;
+ for (int i = 0; i < invalidColumnWidths.length - 1; i++)
+ otherColumns += invalidColumnWidths[i];
+
+ invalidColumnWidths[INVALID_REASON_NUM] = windowWidth - otherColumns;
+ invalidTable.getColumns()[INVALID_REASON_NUM].setWidth(invalidColumnWidths[INVALID_REASON_NUM]);
+ }
+
+ /**
+ * InnerClass that acts as a proxy for the ArtifactModelList providing content for the Table. It implements the
+ * IArtifactListViewer interface since it must register changeListeners with the ArtifactModelList
+ */
+ class RelationContentProvider implements IStructuredContentProvider, IArtifactListViewer {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ if (newInput != null) artifactList.addChangeListener(this);
+ if (oldInput != null) artifactList.removeChangeListener(this);
+ }
+
+ public void dispose() {
+ artifactList.removeChangeListener(this);
+ }
+
+ // Return the tasks as an array of Objects
+ public Object[] getElements(Object parent) {
+ return artifactList.getArtifactModel().toArray();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IArtifactListViewer#addArtifact(ArtifactModel)
+ */
+ public void addArtifact(ArtifactModel artifact) {
+ tableViewer.add(artifact);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IArtifactListViewer#removeArtifact(ArtifactModel)
+ */
+ public void removeArtifact(ArtifactModel artifact) {
+ tableViewer.remove(artifact);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IArtifactListViewer#updateArtifact(ArtifactModel)
+ */
+ public void updateArtifact(ArtifactModel artifact) {
+ tableViewer.update(artifact, null);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactEditFileWatcher.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactEditFileWatcher.java
new file mode 100644
index 00000000000..e7b0cd5b667
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactEditFileWatcher.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.framework.ui.skynet.render;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.utility.FileChangeEvent;
+import org.eclipse.osee.framework.skynet.core.utility.IFileWatcherListener;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactEditFileWatcher implements IFileWatcherListener {
+ UpdateArtifactJob updateJob;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.IFileWatcherListener#filesModified(java.util.Collection)
+ */
+ @Override
+ public void filesModified(Collection<FileChangeEvent> fileChangeEvents) {
+ for (FileChangeEvent event : fileChangeEvents) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO,
+ event.getChangeType().name() + ": " + event.getFile().getAbsolutePath());
+
+ File file = event.getFile();
+ if (file.exists()) {
+ updateJob = new UpdateArtifactJob();
+ updateJob.setWorkingFile(file);
+ Jobs.startJob(updateJob);
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactGuis.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactGuis.java
new file mode 100644
index 00000000000..ac398ad6db7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ArtifactGuis.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.BranchDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.revision.RevisionManager;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.ui.PlatformUI;
+
+public class ArtifactGuis {
+ public ArtifactGuis() {
+ super();
+ }
+
+ public static boolean checkOtherEdit(List<Artifact> artifacts) throws OseeDataStoreException, BranchDoesNotExist {
+ if (artifacts.size() == 0) throw new IllegalArgumentException("you must pass at least one artifact");
+
+ boolean goAhead = true;
+
+ Set<Branch> otherBranches = new HashSet<Branch>();
+ for (Artifact artifact : artifacts) {
+ otherBranches.addAll(RevisionManager.getOtherEdittedBranches(artifact));
+ }
+
+ if (!otherBranches.isEmpty()) {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("The artifact");
+ if (artifacts.size() > 1) sb.append('s');
+ sb.append(" about to be editted ");
+ if (artifacts.size() > 1)
+ sb.append("have");
+ else
+ sb.append("has");
+ sb.append(" already been modified on the following branches:");
+ for (Branch branch : otherBranches)
+ sb.append("\n\t" + branch.getBranchName());
+ sb.append("\n\nDo you still want to proceed?");
+
+ synchronized (sb) {
+
+ AskQuestion question = new AskQuestion(sb, "Confirm Edit", sb.toString());
+ Displays.ensureInDisplayThread(question);
+ try {
+ while (!question.done)
+ sb.wait();
+ } catch (InterruptedException e) {
+ }
+ goAhead = question.isYes();
+ }
+ }
+
+ return goAhead;
+ }
+
+ private static class AskQuestion implements Runnable {
+
+ private Object notifee;
+ private String title;
+ private String question;
+ private boolean yes;
+ private boolean done;
+
+ /**
+ * @param notifee
+ * @param question
+ */
+ public AskQuestion(Object notifee, String title, String question) {
+ super();
+ this.notifee = notifee;
+ this.title = title;
+ this.question = question;
+ this.yes = false;
+ this.done = false;
+ }
+
+ public void run() {
+ synchronized (notifee) {
+ yes =
+ MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title,
+ question);
+ done = true;
+ notifee.notifyAll();
+ }
+ }
+
+ /**
+ * @return Returns the yes.
+ */
+ public boolean isYes() {
+ return yes;
+ }
+
+ /**
+ * @return Returns the done.
+ */
+ public boolean isDone() {
+ return done;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/DefaultArtifactRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/DefaultArtifactRenderer.java
new file mode 100644
index 00000000000..bcdd95964d9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/DefaultArtifactRenderer.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.word.AttributeElement;
+import org.eclipse.osee.framework.ui.skynet.render.word.Producer;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Jeff C. Philips
+ */
+public class DefaultArtifactRenderer implements IRenderer {
+ private VariableMap options;
+
+ /**
+ * @param rendererId
+ */
+ public DefaultArtifactRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#getName()
+ */
+ public String getName() {
+ return "Artifact Editor";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#print(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void print(Artifact artifact, IProgressMonitor monitor) throws OseeCoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#print(java.util.List, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void print(List<Artifact> artifacts, IProgressMonitor monitor) throws OseeCoreException {
+ for (Artifact artifact : artifacts) {
+ print(artifact, monitor);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#compare(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public String compare(Artifact baseVersion, Artifact newerVersion, IProgressMonitor monitor, PresentationType presentationType, boolean show) throws OseeCoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String compare(Artifact baseVersion, Artifact newerVersion, IFile baseFile, IFile newerFile, PresentationType presentationType, boolean show) throws OseeCoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#compareArtifacts(java.util.List, java.util.List, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.osee.framework.ui.skynet.render.PresentationType)
+ */
+ @Override
+ public void compareArtifacts(List<Artifact> baseArtifacts, List<Artifact> newerArtifacts, IProgressMonitor monitor, Branch branch, PresentationType presentationType) throws OseeCoreException {
+ for (int i = 0; i < baseArtifacts.size(); i++) {
+ compare(baseArtifacts.get(i), newerArtifacts.get(i), monitor, presentationType, true);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#supportsCompare()
+ */
+ public boolean supportsCompare() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#setRendererOptions(java.lang.String[])
+ */
+ @Override
+ public void setOptions(VariableMap options) throws OseeArgumentException {
+ this.options = options;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#getOptions()
+ */
+ @Override
+ public VariableMap getOptions() {
+ return options;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#getStringOption(java.lang.String)
+ */
+ @Override
+ public String getStringOption(String key) throws OseeArgumentException {
+ return options == null ? null : options.getString(key);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#getBooleanOption(java.lang.String)
+ */
+ @Override
+ public boolean getBooleanOption(String key) throws OseeArgumentException {
+ if (options != null) {
+ Boolean option = options.getBoolean(key);
+ if (option != null) {
+ return option;
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public DefaultArtifactRenderer newInstance() throws OseeCoreException {
+ return new DefaultArtifactRenderer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#isValidFor(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) throws OseeCoreException {
+ if (presentationType == PresentationType.GENERALIZED_EDIT) {
+ return PRESENTATION_TYPE;
+ }
+
+ return DEFAULT_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#preview(java.util.List)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ open(artifacts);
+ }
+
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ ArtifactEditor.editArtifacts(artifacts);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#renderAttribute(java.lang.String)
+ */
+ @Override
+ public void renderAttribute(String attributeTypeName, Artifact artifact, PresentationType presentationType, Producer producer, VariableMap map, AttributeElement attributeElement) throws OseeCoreException {
+ WordMLProducer wordMl = (WordMLProducer) producer;
+ String format = attributeElement.getFormat();
+ boolean allAttrs = map.getBoolean("allAttrs");
+
+ wordMl.startParagraph();
+ // assumption: the label is of the form <w:r><w:t> text </w:t></w:r>
+ if (allAttrs) {
+ wordMl.addWordMl("<w:r><w:t> " + attributeTypeName + ": </w:t></w:r>");
+ } else {
+ wordMl.addWordMl(attributeElement.getLabel());
+ }
+
+ String valueList = Collections.toString(", ", artifact.getAttributes(attributeTypeName));
+
+ if (attributeElement.getFormat().contains(">x<")) {
+ wordMl.addWordMl(format.replace(">x<", ">" + valueList + "<"));
+ } else {
+ wordMl.addTextInsideParagraph(valueList);
+ }
+ wordMl.endParagraph();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#getImage()
+ */
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getImage(artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#rendererId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(2);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.artifacteditor.command");
+ }
+
+ return commandIds;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileRenderer.java
new file mode 100644
index 00000000000..c688c0ba125
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileRenderer.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.ResourceAttributes;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.FileWatcher;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Jeff C. Phillips
+ */
+public abstract class FileRenderer extends FileSystemRenderer {
+ private static final ResourceAttributes readonlyfileAttributes = new ResourceAttributes();
+ private static Random generator = new Random();
+
+ protected static final FileWatcher watcher = new ArtifactEditFileWatcher(3, TimeUnit.SECONDS);
+ private static boolean firstTime = true;
+ private static boolean workbenchSavePopUpDisabled = false;
+
+ static {
+ readonlyfileAttributes.setReadOnly(true);
+ watcher.start();
+ }
+
+ /**
+ * @param rendererId
+ */
+ public FileRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer#renderToFileSystem(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.resources.IFolder, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer.PresentationType)
+ */
+ @Override
+ public IFile renderToFileSystem(IFolder baseFolder, Artifact artifact, Branch branch, PresentationType presentationType) throws OseeCoreException {
+ return renderToFile(baseFolder, getFilenameFromArtifact(artifact, presentationType), branch,
+ getRenderInputStream(artifact, presentationType), presentationType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer#renderToFileSystem(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.resources.IFolder, java.util.List, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer.PresentationType)
+ */
+ @Override
+ public IFile renderToFileSystem(IFolder baseFolder, List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ Branch initialBranch = null;
+ for (Artifact artifact : artifacts) {
+ if (initialBranch == null) {
+ initialBranch = artifact.getBranch();
+ } else {
+ if (artifact.getBranch() != initialBranch) {
+ throw new IllegalArgumentException("All of the artifacts must be on the same branch to be mass edited");
+ }
+ }
+ }
+
+ if (artifacts.size() == 1) {
+ return renderToFile(baseFolder, getFilenameFromArtifact(artifacts.iterator().next(), presentationType),
+ initialBranch, getRenderInputStream(artifacts, presentationType), presentationType);
+ } else {
+ return renderToFile(baseFolder, getFilenameFromArtifact(null, presentationType), initialBranch,
+ getRenderInputStream(artifacts, presentationType), presentationType);
+ }
+ }
+
+ protected IFile renderToFile(IFolder baseFolder, String fileName, Branch branch, InputStream renderInputStream, PresentationType presentationType) throws OseeCoreException {
+ try {
+ IFile workingFile = baseFolder.getFile(fileName);
+ AIFile.writeToFile(workingFile, renderInputStream);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ monitorFile(workingFile.getLocation().toFile());
+ } else if (presentationType == PresentationType.PREVIEW) {
+ workingFile.setResourceAttributes(readonlyfileAttributes);
+ }
+
+ return workingFile;
+ } catch (CoreException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ protected void addFileToWatcher(IFolder baseFolder, String fileName) {
+ IFile workingFile = baseFolder.getFile(fileName);
+ monitorFile(workingFile.getLocation().toFile());
+ }
+
+ protected String getFilenameFromArtifact(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ StringBuilder name = new StringBuilder(100);
+
+ if (artifact != null) {
+
+ name.append(artifact.getSafeName());
+ name.append("(");
+ name.append(artifact.getGuid());
+ name.append(")");
+
+ if (artifact.isHistorical() || presentationType == PresentationType.DIFF) {
+ name.append("(");
+ name.append(artifact.getTransactionNumber());
+ name.append(")");
+ }
+
+ name.append(" ");
+ name.append((new Date()).toString().replaceAll(":", ";"));
+ name.append("-");
+ name.append(generator.nextInt(99) + 1);
+ name.append(".");
+ name.append(getAssociatedExtension(artifact));
+ } else {
+ name.append(GUID.generateGuidStr());
+ name.append(".xml");
+ }
+ return name.toString();
+ }
+
+ public abstract InputStream getRenderInputStream(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException;
+
+ public abstract InputStream getRenderInputStream(Artifact artifact, PresentationType presentationType) throws OseeCoreException;
+
+ private static void monitorFile(File file) {
+ watcher.addFile(file);
+ if (firstTime && !workbenchSavePopUpDisabled) {
+ firstTime = false;
+ PlatformUI.getWorkbench().addWorkbenchListener(new IWorkbenchListener() {
+
+ @Override
+ public void postShutdown(IWorkbench workbench) {
+ }
+
+ @Override
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ boolean wasConfirmed =
+ MessageDialog.openConfirm(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "OSEE Edit",
+ "OSEE artifacts were opened for edit. Please save all external work before continuing. Click OK to continue shutdown process or Cancel to abort.");
+ return forced || wasConfirmed;
+ }
+ });
+ }
+ }
+
+ /**
+ * @return the workbenchSavePopUpDisabled
+ */
+ public static boolean isWorkbenchSavePopUpDisabled() {
+ return workbenchSavePopUpDisabled;
+ }
+
+ /**
+ * @param workbenchSavePopUpDisabled the workbenchSavePopUpDisabled to set
+ */
+ public static void setWorkbenchSavePopUpDisabled(boolean workbenchSavePopUpDisabled) {
+ FileRenderer.workbenchSavePopUpDisabled = workbenchSavePopUpDisabled;
+ }
+
+ private static final class ArtifactEditFileWatcher extends FileWatcher {
+
+ public ArtifactEditFileWatcher(long time, TimeUnit unit) {
+ super(time, unit);
+ }
+
+ private synchronized void setLastModified(File file, Long value) {
+ if (filesToWatch.containsKey(file)) {
+ filesToWatch.put(file, value);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.utility.FileWatcher#run()
+ */
+ @Override
+ public synchronized void run() {
+ try {
+ for (Map.Entry<File, Long> entry : filesToWatch.entrySet()) {
+ final File file = entry.getKey();
+ final Long storedLastModified = entry.getValue();
+
+ Long latestLastModified = file.lastModified();
+ boolean requiresUpdate = false;
+ if (!storedLastModified.equals(latestLastModified)) {
+ entry.setValue(latestLastModified);
+ if (file.exists()) {
+ requiresUpdate = true;
+ }
+ }
+
+ if (requiresUpdate) {
+ UpdateArtifactJob updateJob = new UpdateArtifactJob();
+ updateJob.setWorkingFile(file);
+ updateJob.addJobChangeListener(new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (event.getResult().isOK()) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO,
+ "Updated artifact linked to: " + file.getAbsolutePath());
+ } else {
+ // There was an error during saving set last modified back so next time we try again
+ setLastModified(file, storedLastModified);
+ }
+ }
+ });
+ Jobs.startJob(updateJob);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileSystemRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileSystemRenderer.java
new file mode 100644
index 00000000000..e7c862389f3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/FileSystemRenderer.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.skynet.render;
+
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.swt.program.Program;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class FileSystemRenderer extends DefaultArtifactRenderer {
+ /**
+ * @param rendererId
+ */
+ public FileSystemRenderer() {
+ super();
+ }
+
+ private static IFolder workingFolder;
+ private static IFolder diffFolder;
+ private static IFolder previewFolder;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#open(java.util.List)
+ */
+ @Override
+ public void open(List<Artifact> artifacts) throws OseeCoreException {
+ internalOpen(artifacts, PresentationType.SPECIALIZED_EDIT);
+ }
+
+ public IFolder getRenderFolder(Branch branch, PresentationType presentationType) throws OseeCoreException {
+ try {
+ IFolder baseFolder = ensureRenderFolderExists(presentationType);
+ IFolder renderFolder = baseFolder.getFolder(branch.asFolderName());
+ if (!renderFolder.exists()) {
+ renderFolder.create(true, true, null);
+ }
+ return renderFolder;
+ } catch (CoreException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#preview(java.util.List, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void preview(List<Artifact> artifacts) throws OseeCoreException {
+ internalOpen(artifacts, PresentationType.PREVIEW);
+ }
+
+ private void internalOpen(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ if ((presentationType != PresentationType.SPECIALIZED_EDIT) || ArtifactGuis.checkOtherEdit(artifacts)) {
+ IFile file = getRenderedFile(artifacts, presentationType);
+ if (file != null) {
+ String dummyName = file.getName();
+ if (!artifacts.isEmpty()) {
+ Artifact firstArtifact = artifacts.iterator().next();
+ try {
+ Program program = getAssociatedProgram(firstArtifact);
+ program.execute(file.getLocation().toFile().getAbsolutePath());
+ } catch (Exception ex) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ IEditorDescriptor editorDescriptor = workbench.getEditorRegistry().getDefaultEditor(dummyName);
+ if (editorDescriptor != null) {
+ try {
+ IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
+ page.openEditor(new FileEditorInput(file), editorDescriptor.getId());
+ } catch (PartInitException ex1) {
+ throw new OseeArgumentException(
+ "No program associated with the extension " + file.getFileExtension() + " found on your local machine.");
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public IFile getRenderedFileForOpen(List<Artifact> artifacts) throws OseeCoreException {
+ return getRenderedFile(artifacts, PresentationType.SPECIALIZED_EDIT);
+ }
+
+ public IFile getRenderedFile(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ IFile toReturn = null;
+ if (!artifacts.isEmpty()) {
+ Artifact firstArtifact = artifacts.iterator().next();
+ IFolder baseFolder = getRenderFolder(firstArtifact.getBranch(), presentationType);
+ toReturn = renderToFileSystem(baseFolder, artifacts, presentationType);
+ }
+ return toReturn;
+ }
+
+ public static IFolder ensureRenderFolderExists(PresentationType presentationType) throws OseeCoreException {
+ switch (presentationType) {
+ case DIFF:
+ if (diffFolder == null || !diffFolder.exists()) {
+ diffFolder = OseeData.getFolder(".diff");
+ }
+ return diffFolder;
+
+ case SPECIALIZED_EDIT:
+ if (workingFolder == null || !workingFolder.exists()) {
+ workingFolder = OseeData.getFolder(".working");
+ }
+ return workingFolder;
+
+ case PREVIEW:
+ if (previewFolder == null || !previewFolder.exists()) {
+ previewFolder = OseeData.getFolder(".preview");
+ }
+ return previewFolder;
+
+ default:
+ throw new OseeArgumentException("Unexpected presentation type");
+ }
+ }
+
+ public IFile renderForDiff(IProgressMonitor monitor, Branch branch) throws OseeCoreException {
+ IFolder baseFolder = getRenderFolder(branch, PresentationType.DIFF);
+ return renderToFileSystem(baseFolder, null, branch, PresentationType.DIFF);
+ }
+
+ public IFile renderForDiff(IProgressMonitor monitor, Artifact artifact) throws OseeCoreException {
+ if (artifact == null) {
+ throw new OseeArgumentException("Artifact can not be null.");
+ }
+
+ IFolder baseFolder = getRenderFolder(artifact.getBranch(), PresentationType.DIFF);
+ return renderToFileSystem(baseFolder, artifact, artifact.getBranch(), PresentationType.DIFF);
+ }
+
+ public IFile renderForMerge(IProgressMonitor monitor, Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ if (artifact == null) {
+ throw new IllegalArgumentException("Artifact can not be null.");
+ }
+ IFolder baseFolder;
+ if (presentationType == PresentationType.MERGE_EDIT) {
+ baseFolder = getRenderFolder(artifact.getBranch(), PresentationType.GENERALIZED_EDIT);
+ } else {
+ baseFolder = getRenderFolder(artifact.getBranch(), PresentationType.DIFF);
+ }
+ return renderToFileSystem(baseFolder, artifact, artifact.getBranch(), presentationType);
+ }
+
+ public abstract IFile renderToFileSystem(IFolder baseFolder, Artifact artifact, Branch branch, PresentationType presentationType) throws OseeCoreException;
+
+ public abstract IFile renderToFileSystem(IFolder baseFolder, List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException;
+
+ public abstract Program getAssociatedProgram(Artifact artifact) throws OseeCoreException;
+
+ public abstract String getAssociatedExtension(Artifact artifact) throws OseeCoreException;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IRenderer.java
new file mode 100644
index 00000000000..db72fd96cc1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IRenderer.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.framework.ui.skynet.render;
+
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.word.AttributeElement;
+import org.eclipse.osee.framework.ui.skynet.render.word.Producer;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public interface IRenderer {
+
+ public static final int WORD_PUBLICATION = 60;
+ public static final int PRESENTATION_SUBTYPE_MATCH = 50;
+ public static final int PRESENTATION_TYPE = 40;
+ public static final int SUBTYPE_TYPE_MATCH = 30;
+ public static final int ARTIFACT_TYPE_MATCH = 20;
+ public static final int DEFAULT_MATCH = 10;
+ public static final int NO_MATCH = -1;
+
+ public abstract List<String> getCommandId(PresentationType presentationType);
+
+ public Image getImage(Artifact artifact) throws OseeCoreException;
+
+ public abstract void renderAttribute(String attributeTypeName, Artifact artifact, PresentationType presentationType, Producer producer, VariableMap map, AttributeElement attributeElement) throws OseeCoreException;
+
+ public abstract int minimumRanking() throws OseeCoreException;
+
+ public abstract void open(List<Artifact> artifacts) throws OseeCoreException;
+
+ public abstract void preview(List<Artifact> artifacts) throws OseeCoreException;
+
+ public abstract void print(Artifact artifact, IProgressMonitor monitor) throws OseeCoreException;
+
+ public abstract void print(List<Artifact> artifacts, IProgressMonitor monitor) throws OseeCoreException;
+
+ public String compare(Artifact baseVersion, Artifact newerVersion, IProgressMonitor monitor, PresentationType presentationType, boolean show) throws OseeCoreException;
+
+ public String compare(Artifact baseVersion, Artifact newerVersion, IFile baseFile, IFile newerFile, PresentationType presentationType, boolean show) throws OseeCoreException;
+
+ public void compareArtifacts(List<Artifact> baseArtifacts, List<Artifact> newerArtifact, IProgressMonitor monitor, Branch branch, PresentationType presentationType) throws OseeCoreException;
+
+ public abstract int getApplicabilityRating(PresentationType presentationType, Artifact artifact) throws OseeCoreException;
+
+ public abstract String getName();
+
+ public abstract void setOptions(VariableMap options) throws OseeArgumentException;
+
+ public abstract String getStringOption(String key) throws OseeArgumentException;
+
+ public abstract boolean getBooleanOption(String key) throws OseeArgumentException;
+
+ public abstract VariableMap getOptions();
+
+ public abstract IRenderer newInstance() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ITemplateRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ITemplateRenderer.java
new file mode 100644
index 00000000000..74d5255b70a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/ITemplateRenderer.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.framework.ui.skynet.render;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface ITemplateRenderer extends IRenderer {
+ public static final String TEMPLATE_OPTION = "template";
+ public static final String TRANSACTION_OPTION = "skynetTransaction";
+ public static final String PREVIEW_WITH_RECURSE_VALUE = "PREVIEW_WITH_RECURSE";
+ public static final String PREVIEW_WITH_RECURSE_NO_ATTRIBUTES_VALUE = "PREVIEW_WITH_RECURSE_NO_ATTRIBUTES";
+ public static final String DIFF_VALUE = "DIFF";
+ public static final String DIFF_NO_ATTRIBUTES_VALUE = "DIFF_NO_ATTRIBUTES";
+ public static final Object[] PREVIEW_WITH_RECURSE_OPTION_PAIR =
+ new String[] {TEMPLATE_OPTION, PREVIEW_WITH_RECURSE_VALUE};
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IVbaDiffGenerator.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IVbaDiffGenerator.java
new file mode 100644
index 00000000000..3eb937ce8bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/IVbaDiffGenerator.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.framework.ui.skynet.render;
+
+import java.io.File;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Theron Virgin
+ */
+public interface IVbaDiffGenerator {
+ public boolean initialize(boolean visible, boolean detectFormatChanges);
+
+ public boolean addComparison(IFile baseFile, IFile newerFile, String diffPath, boolean merge);
+
+ public void finish(String vbaScriptPath, boolean show) throws OseeCoreException;
+
+ public File getFile(String path) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/NativeRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/NativeRenderer.java
new file mode 100644
index 00000000000..ed488fc415b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/NativeRenderer.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.framework.ui.skynet.render;
+
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.io.Streams;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordWholeDocumentAttribute;
+import org.eclipse.swt.program.Program;
+
+/**
+ * Renders native content.
+ *
+ * @author Ryan D. Brooks
+ */
+public class NativeRenderer extends FileRenderer {
+ public static final String EXTENSION_ID = "org.eclipse.osee.framework.ui.skynet.render.NativeRenderer";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getCommandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.nativeeditor.command");
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.othereditor.command");
+ }
+
+ return commandIds;
+ }
+
+ /**
+ * @param rendererId
+ */
+ public NativeRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "Native Editor";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public NativeRenderer newInstance() throws OseeCoreException {
+ return new NativeRenderer();
+ }
+
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if ((artifact.isOfType("Native") || artifact.isOfType("General Data")) && presentationType == PresentationType.SPECIALIZED_EDIT) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getAssociatedExtension()
+ */
+ @Override
+ public String getAssociatedExtension(Artifact artifact) throws OseeCoreException {
+ return artifact.getSoleAttributeValue(NativeArtifact.EXTENSION, "xml");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getAssociatedProgram()
+ */
+ @Override
+ public Program getAssociatedProgram(Artifact artifact) throws OseeCoreException {
+ String extension = getAssociatedExtension(artifact);
+ Program program = Program.findProgram(extension);
+ if (program == null) {
+ throw new OseeArgumentException(
+ "No program associated with the extension " + extension + " found on your local machine.");
+ }
+ return program;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor, java.util.List, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ return getRenderInputStream(artifacts.iterator().next(), presentationType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ Attribute<?> attribute = artifact.getSoleAttribute(NativeArtifact.CONTENT_NAME);
+ //If the native artifact has been created without content create empty XML content.
+ if (attribute == null) {
+ attribute = artifact.createAttribute(AttributeTypeManager.getType(NativeArtifact.CONTENT_NAME), true);
+ try {
+ attribute.setValueFromInputStream(Streams.convertStringToInputStream(
+ WordWholeDocumentAttribute.getEmptyDocumentContent(), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ throw new OseeCoreException(e);
+ }
+ }
+ return artifact.getSoleAttributeValue(NativeArtifact.CONTENT_NAME);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ return NO_MATCH;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/OpenOfficeWriterRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/OpenOfficeWriterRenderer.java
new file mode 100644
index 00000000000..ed79f5038a1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/OpenOfficeWriterRenderer.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.framework.ui.skynet.render;
+
+import java.io.InputStream;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.ui.skynet.templates.TemplateManager;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class OpenOfficeWriterRenderer extends FileRenderer implements ITemplateRenderer {
+
+ /**
+ * @param rendererId
+ */
+ public OpenOfficeWriterRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public OpenOfficeWriterRenderer newInstance() throws OseeCoreException {
+ return new OpenOfficeWriterRenderer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getAssociatedExtension(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public String getAssociatedExtension(Artifact artifact) {
+ return "odt";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor, java.util.List, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer#getAssociatedProgram(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public Program getAssociatedProgram(Artifact artifact) throws OseeCoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#getApplicabilityRating(org.eclipse.osee.framework.ui.skynet.render.PresentationType, org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ return NO_MATCH;
+ }
+
+ private String getTemplate(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ return TemplateManager.getTemplate(this, artifact, presentationType.name(), getStringOption(TEMPLATE_OPTION)).getSoleAttributeValue(
+ NativeArtifact.CONTENT_NAME);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ return NO_MATCH;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/PresentationType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/PresentationType.java
new file mode 100644
index 00000000000..48a18c2beaa
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/PresentationType.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.framework.ui.skynet.render;
+
+public enum PresentationType {
+ GENERALIZED_EDIT, SPECIALIZED_EDIT, DIFF, PREVIEW, PREVIEW_IN_COMPOSITE, MERGE, MERGE_EDIT
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RendererManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RendererManager.java
new file mode 100644
index 00000000000..3cf26a7cc33
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RendererManager.java
@@ -0,0 +1,311 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.word.AttributeElement;
+import org.eclipse.osee.framework.ui.skynet.render.word.Producer;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RendererManager {
+ private static final RendererManager instance = new RendererManager();
+ private final HashMap<String, IRenderer> renderers = new HashMap<String, IRenderer>(40);
+
+ private RendererManager() {
+ registerRendersFromExtensionPoints();
+ }
+
+ /**
+ * @param artifacts
+ * @param presentationType TODO
+ * @return Returns the intersection of renderers applicable for all of the artifacts
+ * @throws OseeCoreException
+ */
+ public static List<IRenderer> getCommonRenderers(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ List<IRenderer> commonRenders = getApplicableRenderers(presentationType, artifacts.get(0), null);
+
+ for (Artifact artifact : artifacts) {
+ List<IRenderer> applicableRenders = getApplicableRenderers(presentationType, artifact, null);
+
+ Iterator<?> commIterator = commonRenders.iterator();
+
+ while (commIterator.hasNext()) {
+ IRenderer commRenderer = (IRenderer) commIterator.next();
+ boolean found = false;
+ for (IRenderer appRenderer : applicableRenders) {
+ if (appRenderer.getName().equals(commRenderer.getName())) {
+ found = true;
+ continue;
+ }
+ }
+
+ if (!found) {
+ commIterator.remove();
+ }
+ }
+ }
+ return commonRenders;
+ }
+
+ /**
+ * Maps all renderers in the system to their applicable artifact types
+ */
+ @SuppressWarnings("unchecked")
+ private void registerRendersFromExtensionPoints() {
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements(SkynetGuiPlugin.getInstance(), "ArtifactRenderer", "Renderer");
+
+ for (IConfigurationElement element : elements) {
+ String classname = element.getAttribute("classname");
+ String bundleName = element.getContributor().getName();
+ try {
+ Class<IRenderer> clazz = (Class<IRenderer>) Platform.getBundle(bundleName).loadClass(classname);
+ Constructor<IRenderer> constructor = clazz.getConstructor();
+ IRenderer renderer = constructor.newInstance();
+ renderers.put(renderer.getClass().getCanonicalName(), renderer);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ } catch (NoClassDefFoundError er) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "Failed to find a class definition for " + classname + ", registered from bundle " + bundleName, er);
+ }
+ }
+ }
+
+ public static FileRenderer getBestFileRenderer(PresentationType presentationType, Artifact artifact) throws OseeCoreException {
+ return getBestFileRenderer(presentationType, artifact, null);
+ }
+
+ public static FileRenderer getBestFileRenderer(PresentationType presentationType, Artifact artifact, VariableMap options) throws OseeCoreException {
+ IRenderer bestRenderer = getBestRenderer(presentationType, artifact, options);
+ if (bestRenderer instanceof FileRenderer) {
+ return (FileRenderer) bestRenderer;
+ }
+ throw new OseeArgumentException("No FileRenderer found for " + artifact);
+ }
+
+ private static IRenderer getBestRenderer(PresentationType presentationType, Artifact artifact, VariableMap options) throws OseeCoreException {
+ IRenderer bestRenderer = getBestRendererPrototype(presentationType, artifact).newInstance();
+ bestRenderer.setOptions(options);
+ return bestRenderer;
+ }
+
+ private static IRenderer getBestRendererPrototype(PresentationType presentationType, Artifact artifact) throws OseeCoreException {
+ IRenderer bestRendererPrototype = null;
+ int bestRating = IRenderer.NO_MATCH;
+ for (IRenderer renderer : instance.renderers.values()) {
+ int rating = renderer.getApplicabilityRating(presentationType, artifact);
+ if (rating > bestRating) {
+ bestRendererPrototype = renderer;
+ bestRating = rating;
+ }
+ }
+ if (bestRendererPrototype == null) {
+ throw new OseeStateException("At least the DefaultArtifactRenderer should have been found.");
+ }
+ return bestRendererPrototype;
+ }
+
+ public static void renderAttribute(String attrType, PresentationType presentationType, Artifact artifact, VariableMap options, Producer producer, AttributeElement attributeElement) throws OseeCoreException {
+ getBestRenderer(PresentationType.SPECIALIZED_EDIT, artifact, options).renderAttribute(attrType, artifact,
+ presentationType, producer, options, attributeElement);
+ }
+
+ public static List<IRenderer> getApplicableRenderers(PresentationType presentationType, Artifact artifact, VariableMap options) throws OseeCoreException {
+ ArrayList<IRenderer> renderers = new ArrayList<IRenderer>();
+
+ for (IRenderer prototypeRenderer : instance.renderers.values()) {
+ int rating = prototypeRenderer.getApplicabilityRating(presentationType, artifact);
+ if (rating > getBestRenderer(presentationType, artifact, options).minimumRanking()) {
+ IRenderer renderer = prototypeRenderer.newInstance();
+ renderer.setOptions(options);
+ renderers.add(renderer);
+ }
+ }
+ return renderers;
+ }
+
+ private static HashCollection<IRenderer, Artifact> createRenderMap(PresentationType presentationType, List<Artifact> artifacts, VariableMap options) throws OseeCoreException {
+ HashCollection<IRenderer, Artifact> prototypeRendererArtifactMap =
+ new HashCollection<IRenderer, Artifact>(false, LinkedList.class);
+ for (Artifact artifact : artifacts) {
+ prototypeRendererArtifactMap.put(getBestRendererPrototype(presentationType, artifact), artifact);
+ }
+
+ // now that the artifacts are grouped based on best renderer type, create instances of those renderer with the supplied options
+ HashCollection<IRenderer, Artifact> rendererArtifactMap =
+ new HashCollection<IRenderer, Artifact>(false, LinkedList.class);
+ for (IRenderer prototypeRenderer : prototypeRendererArtifactMap.keySet()) {
+ IRenderer renderer = prototypeRenderer.newInstance();
+ renderer.setOptions(options);
+ rendererArtifactMap.put(renderer, prototypeRendererArtifactMap.getValues(prototypeRenderer));
+ }
+ return rendererArtifactMap;
+ }
+
+ public static void openInJob(Artifact artifact, PresentationType presentationType) {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(1);
+ artifacts.add(artifact);
+
+ openInJob(artifacts, null, presentationType);
+ }
+
+ public static void openInJob(final List<Artifact> artifacts, PresentationType presentationType) {
+ openInJob(artifacts, null, presentationType);
+ }
+
+ public static void openInJob(final List<Artifact> artifacts, final VariableMap options, final PresentationType presentationType) {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+
+ if ((presentationType != PresentationType.SPECIALIZED_EDIT) || ArtifactGuis.checkOtherEdit(artifacts)) {
+ HashCollection<IRenderer, Artifact> rendererArtifactMap =
+ createRenderMap(presentationType, artifacts, options);
+
+ for (IRenderer renderer : rendererArtifactMap.keySet()) {
+ renderer.open((LinkedList<Artifact>) rendererArtifactMap.getValues(renderer));
+ }
+ }
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.runInJob("Open ", runnable, SkynetGuiPlugin.class, SkynetGuiPlugin.PLUGIN_ID);
+ }
+
+ public static void previewInJob(final Artifact artifact) throws OseeCoreException {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(1);
+ artifacts.add(artifact);
+
+ previewInJob(artifacts, null);
+ }
+
+ public static void previewInJob(final List<Artifact> artifacts) throws OseeCoreException {
+ previewInJob(artifacts, null);
+ }
+
+ public static void previewInJob(final List<Artifact> artifacts, final VariableMap options) throws OseeCoreException {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ preview(artifacts, new NullProgressMonitor(), options);
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.runInJob("Preview " + artifacts.size() + " artifacts", runnable, SkynetGuiPlugin.class,
+ SkynetGuiPlugin.PLUGIN_ID, false);
+ }
+
+ public static void preview(final List<Artifact> artifacts, IProgressMonitor monitor, final VariableMap options) throws OseeCoreException {
+ HashCollection<IRenderer, Artifact> rendererArtifactMap =
+ createRenderMap(PresentationType.PREVIEW, artifacts, options);
+
+ for (IRenderer renderer : rendererArtifactMap.keySet()) {
+ renderer.preview((LinkedList<Artifact>) rendererArtifactMap.getValues(renderer));
+ }
+ }
+
+ public static String merge(Artifact baseVersion, Artifact newerVersion, String fileName, boolean show) throws OseeStateException, OseeCoreException {
+ return merge(baseVersion, newerVersion, null, fileName, show);
+ }
+
+ public static String merge(Artifact baseVersion, Artifact newerVersion, IProgressMonitor monitor, String fileName, boolean show) throws OseeStateException, OseeCoreException {
+ return getBestRenderer(PresentationType.MERGE, baseVersion, new VariableMap("fileName", fileName)).compare(
+ baseVersion, newerVersion, monitor, PresentationType.MERGE, show);
+ }
+
+ public static String merge(Artifact baseVersion, Artifact newerVersion, IFile baseFile, IFile newerFile, String fileName, boolean show) throws OseeCoreException {
+ return getBestRenderer(PresentationType.MERGE_EDIT, baseVersion, new VariableMap("fileName", fileName)).compare(
+ baseVersion, newerVersion, baseFile, newerFile, PresentationType.MERGE_EDIT, show);
+ }
+
+ public static void diffInJob(final Artifact baseVersion, final Artifact newerVersion) {
+ diffInJob(baseVersion, newerVersion, null);
+ }
+
+ public static void diffInJob(final Artifact baseVersion, final Artifact newerVersion, final VariableMap options) {
+
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+ public IStatus run(IProgressMonitor monitor) throws OseeCoreException {
+ diff(baseVersion, newerVersion, true, options);
+ return Status.OK_STATUS;
+ }
+ };
+
+ String jobName =
+ "Compare " + (baseVersion == null ? " new " : baseVersion.getDescriptiveName()) + " to " + (newerVersion == null ? " delete " : newerVersion.getDescriptiveName());
+ Jobs.runInJob(jobName, runnable, SkynetGuiPlugin.class, SkynetGuiPlugin.PLUGIN_ID);
+
+ }
+
+ public static String diff(final Artifact baseVersion, final Artifact newerVersion, IProgressMonitor monitor, boolean show) throws OseeCoreException {
+ return diff(baseVersion, newerVersion, monitor, show, null);
+ }
+
+ public static String diff(final Artifact baseVersion, final Artifact newerVersion, IProgressMonitor monitor, boolean show, final VariableMap options) throws OseeCoreException {
+ // To handle comparisons with new or deleted artifacts
+ Artifact artifactToSelectRender = baseVersion == null ? newerVersion : baseVersion;
+ IRenderer renderer = getBestRenderer(PresentationType.DIFF, artifactToSelectRender, options);
+ return renderer.compare(baseVersion, newerVersion, new NullProgressMonitor(), PresentationType.DIFF, show);
+ }
+
+ public static String diff(final Artifact baseVersion, final Artifact newerVersion, boolean show) throws OseeCoreException {
+ return diff(baseVersion, newerVersion, show, null);
+ }
+
+ public static String diff(final Artifact baseVersion, final Artifact newerVersion, boolean show, final VariableMap options) throws OseeCoreException {
+ return diff(baseVersion, newerVersion, new NullProgressMonitor(), show, options);
+ }
+
+ public static void diffInJob(final List<Artifact> baseArtifacts, final List<Artifact> newerArtifacts) {
+ diffInJob(baseArtifacts, newerArtifacts, null);
+ }
+
+ public static void diffInJob(final List<Artifact> baseArtifacts, final List<Artifact> newerArtifacts, final VariableMap options) {
+ IExceptionableRunnable runnable = new IExceptionableRunnable() {
+ public IStatus run(IProgressMonitor monitor) throws OseeCoreException {
+ Artifact sampleArtifact = baseArtifacts.get(0) == null ? newerArtifacts.get(0) : baseArtifacts.get(0);
+ IRenderer renderer = getBestRenderer(PresentationType.DIFF, sampleArtifact, options);
+ renderer.compareArtifacts(baseArtifacts, newerArtifacts, monitor, sampleArtifact.getBranch(),
+ PresentationType.DIFF);
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.runInJob("Combined Diff", runnable, SkynetGuiPlugin.class, SkynetGuiPlugin.PLUGIN_ID);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/TisRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/TisRenderer.java
new file mode 100644
index 00000000000..693f78a2c91
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/TisRenderer.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.InputStream;
+import java.nio.charset.CharacterCodingException;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+import org.eclipse.osee.framework.ui.skynet.render.word.template.BasicTemplateAttributeHandler;
+import org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler;
+import org.eclipse.osee.framework.ui.skynet.render.word.template.SRSSpecialPublishingAttributeHandler;
+import org.eclipse.osee.framework.ui.skynet.render.word.template.TISAttributeHandler;
+import org.eclipse.osee.framework.ui.skynet.render.word.template.WordAttributeTypeAttributeHandler;
+import org.eclipse.osee.framework.ui.skynet.render.word.template.WordTemplateManager;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TisRenderer extends WordTemplateRenderer {
+
+ /**
+ * @param rendererId
+ */
+ public TisRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public TisRenderer newInstance() throws OseeCoreException {
+ return new TisRenderer();
+ }
+
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if ("Test Information Sheet".equals(artifact.getArtifactTypeName()) && presentationType == PresentationType.PREVIEW) {
+ return SUBTYPE_TYPE_MATCH;
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer#getCommandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.PREVIEW) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.tispreview.command");
+ }
+
+ return commandIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.WordRenderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "MS Word TIS Preview";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String,
+ * org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ if (PresentationType.GENERALIZED_EDIT == presentationType) {
+ return super.getRenderInputStream(artifacts, presentationType);
+ }
+ final VariableMap variableMap = new VariableMap();
+ String template;
+
+ if (artifacts.isEmpty()) {
+ // Still need to get a default template with a null artifact list
+ template = getTemplate(null, presentationType);
+ } else {
+ Artifact firstArtifact = artifacts.iterator().next();
+ template = getTemplate(firstArtifact, presentationType);
+ }
+
+ variableMap.setValue(DEFAULT_SET_NAME, artifacts);
+
+ List<ITemplateAttributeHandler> handlers = new ArrayList<ITemplateAttributeHandler>();
+ handlers.add(new SRSSpecialPublishingAttributeHandler());
+ handlers.add(new TISAttributeHandler());
+ handlers.add(new WordAttributeTypeAttributeHandler());
+ handlers.add(new BasicTemplateAttributeHandler());
+ WordTemplateManager wtm = new WordTemplateManager(template, handlers);
+ try {
+ CharBackedInputStream charBak = new CharBackedInputStream();
+ WordMLProducer wordMl = new WordMLProducer(charBak);
+ wtm.processArtifacts(wordMl, variableMap.getArtifacts(wtm.getArtifactSet()));
+ return charBak;
+ } catch (CharacterCodingException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateArtifactJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateArtifactJob.java
new file mode 100644
index 00000000000..20def63c5b3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateArtifactJob.java
@@ -0,0 +1,356 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.NativeArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.linking.LinkType;
+import org.eclipse.osee.framework.skynet.core.linking.WordMlLinkHandler;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordTemplateProcessor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class UpdateArtifactJob extends UpdateJob {
+ private static final Pattern guidPattern = Pattern.compile(".*\\(([^)]+)\\)[^()]*");
+ private static final Pattern multiPattern = Pattern.compile(".*[^()]*");
+ private Element oleDataElement;
+ private String singleGuid = null;
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Renderer"));
+
+ public UpdateArtifactJob() {
+ super("Update Artifact");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ processUpdate();
+ } catch (Exception ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, Status.OK, ex.getLocalizedMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+
+ private void processUpdate() throws Exception {
+ int branchId = Branch.getBranchIdFromBranchFolderName(workingFile.getParentFile().getName());
+ Branch branch = BranchManager.getBranch(branchId);
+ if (branch.isEditable()) {
+ FileInputStream myFileInputStream = new FileInputStream(workingFile);
+
+ String guid = WordUtil.getGUIDFromFileInputStream(myFileInputStream);
+ if (guid == null) {
+ processNonWholeDocumentUpdates(branch);
+ } else {
+ Artifact myArtifact = ArtifactQuery.getArtifactFromId(guid, branch);
+ updateWholeDocumentArtifact(myArtifact);
+ }
+ }
+ }
+
+ private void processNonWholeDocumentUpdates(Branch branch) throws OseeCoreException, ParserConfigurationException, SAXException, IOException {
+ Artifact artifact;
+
+ Matcher singleEditMatcher = guidPattern.matcher(workingFile.getName());
+ Matcher multiEditMatcher = multiPattern.matcher(workingFile.getName());
+
+ if (singleEditMatcher.matches()) {
+ singleGuid = singleEditMatcher.group(1);
+ artifact = ArtifactQuery.getArtifactFromId(singleGuid, branch);
+
+ if (artifact.isOfType(WordArtifact.ARTIFACT_NAME)) {
+ wordArtifactUpdate(getArtifacts(workingFile, true), branch);
+ } else if (artifact.isOfType("Native")) {
+ updateNativeArtifact((NativeArtifact) artifact);
+ } else {
+ throw new OseeArgumentException("Artifact must be of type WordArtifact or NativeArtifact.");
+ }
+ } else if (multiEditMatcher.matches()) {
+ wordArtifactUpdate(getArtifacts(workingFile, false), branch);
+ } else {
+ throw new OseeArgumentException("File name did not contain the artifact guid");
+ }
+ }
+
+ private void logUpdateSkip(Artifact artifact) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format("Skipping update - artifact [%s] is read-only",
+ artifact.toString()));
+ }
+
+ private void updateNativeArtifact(NativeArtifact artifact) throws OseeCoreException, FileNotFoundException {
+ if (!artifact.isReadOnly()) {
+ artifact.setNativeContent(workingFile);
+ artifact.persistAttributes();
+ } else {
+ logUpdateSkip(artifact);
+ }
+ }
+
+ private void wordArtifactUpdate(Collection<Element> artElements, Branch branch) throws OseeCoreException {
+ List<String> deletedGuids = new LinkedList<String>();
+ try {
+ boolean singleArtifact = artElements.size() == 1;
+ boolean containsOleData = false;
+ for (Element artElement : artElements) {
+ String guid = getGuid(artElement);
+ Artifact artifact = ArtifactQuery.getArtifactFromId(guid, branch);
+
+ if (artifact == null) {
+ deletedGuids.add(guid);
+ } else {
+ if (artifact.isReadOnly()) {
+ logUpdateSkip(artifact);
+ continue;
+ }
+ containsOleData = !artifact.getSoleAttributeValue(WordAttribute.OLE_DATA_NAME, "").equals("");
+
+ if (oleDataElement == null && containsOleData) {
+ artifact.setSoleAttributeValue(WordAttribute.OLE_DATA_NAME, "");
+ } else if (oleDataElement != null && singleArtifact) {
+ artifact.setSoleAttributeFromStream(WordAttribute.OLE_DATA_NAME, new ByteArrayInputStream(
+ WordTemplateRenderer.getFormattedContent(oleDataElement)));
+ }
+
+ String content;
+ try {
+ content =
+ Lib.inputStreamToString(new ByteArrayInputStream(
+ WordTemplateRenderer.getFormattedContent(artElement)));
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+
+ StringBuilder stringBuffer = new StringBuilder();
+
+ // Decided not to support multi edit of artifacts that
+ // contain equations.
+ if (false && containsOleData && !singleArtifact) {
+ int startIndex = 0, endIndex = 0, tagCursorStart = 0, tagCursorEnd = 0;
+ String equationTag;
+
+ content = content.replaceAll("MyObject", "OLEObject").replaceAll("number", "ObjectID");
+
+ while (endIndex < content.length()) {
+ tagCursorStart = content.indexOf(":OLEObject ", startIndex);
+
+ if (tagCursorStart != -1) {
+ tagCursorStart = content.lastIndexOf('<', tagCursorStart);
+
+ tagCursorEnd = content.indexOf(">", tagCursorStart) + 1;
+ equationTag = content.substring(tagCursorStart, tagCursorEnd);
+
+ tagCursorEnd = content.indexOf("OLEObject>", tagCursorStart) + "OLEObject>".length();
+ content = content.replace(content.subSequence(tagCursorStart, tagCursorEnd), "");
+
+ endIndex = content.indexOf("</w:pict>", startIndex);
+ stringBuffer.append(content.substring(startIndex, endIndex));
+
+ equationTag = equationTag.replaceFirst("ns\\d+", "o").replace(">", "/>");
+ stringBuffer.append(equationTag + "</w:pict>");
+ startIndex = endIndex + "</w:pict>".length();
+ } else {
+ endIndex = content.length();
+ stringBuffer.append(content.substring(startIndex, endIndex));
+ }
+ }
+ content = stringBuffer.toString();
+ }
+ // Only update if editing a single artifact or if in
+ // multi-edit mode only update if
+ // the artifact has at least on textual change.
+ if (singleArtifact || !WordUtil.textOnly(
+ artifact.getSoleAttributeValue(WordAttribute.WORD_TEMPLATE_CONTENT).toString()).equals(
+ WordUtil.textOnly(content))) {
+ //TODO
+ if (DEBUG) {
+ System.err.println("Initial: " + content);
+ }
+ if (artElement.getNodeName().endsWith("body")) {
+ //This code pulls out all of the stuff after the inserted listnum reordering stuff. This needs to be
+ //here so that we remove unwanted template information from single editing
+ content = content.replace(WordMLProducer.LISTNUM_FIELD_HEAD, "");
+ if (DEBUG) {
+ System.err.println("AFTER: " + content);
+ }
+ }
+ LinkType linkType = LinkType.OSEE_SERVER_LINK;
+ content = WordMlLinkHandler.unlink(linkType, artifact, content);
+ artifact.setSoleAttributeValue(WordAttribute.WORD_TEMPLATE_CONTENT, content);
+ }
+ artifact.persistAttributes();
+ }
+ }
+ } finally {
+ if (!deletedGuids.isEmpty()) {
+ throw new OseeStateException("The following deleted artifacts could not be saved: " + Collections.toString(
+ ",", deletedGuids));
+ }
+ }
+ }
+
+ private void updateWholeDocumentArtifact(Artifact artifact) throws FileNotFoundException, OseeCoreException {
+ InputStream inputStream = null;
+ try {
+ if (!artifact.isReadOnly()) {
+ inputStream = new FileInputStream(workingFile);
+ String content = Lib.inputStreamToString(inputStream);
+ LinkType linkType = LinkType.OSEE_SERVER_LINK;
+ content = WordMlLinkHandler.unlink(linkType, artifact, content);
+ artifact.setSoleAttributeFromString(WordAttribute.WHOLE_WORD_CONTENT, content);
+ artifact.persistAttributes();
+ } else {
+ logUpdateSkip(artifact);
+ }
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+
+ private Collection<Element> getArtifacts(File wordFile, boolean single) throws ParserConfigurationException, SAXException, IOException, OseeCoreException {
+ final Collection<Element> artifacts = new LinkedList<Element>();
+ final String elementNameForWordAttribute =
+ WordTemplateProcessor.elementNameFor(WordAttribute.WORD_TEMPLATE_CONTENT);
+
+ Document doc = Jaxp.readXmlDocument(wordFile);
+ Element paragraphRoot = null;
+ Element rootElement = doc.getDocumentElement();
+ Element body = null;
+ boolean containsTag = false;
+ oleDataElement = null;
+
+ NodeList nodeList = rootElement.getElementsByTagName("*");
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ Element element = (Element) nodeList.item(i);
+ if (element.getNodeName().endsWith(elementNameForWordAttribute)) {
+ artifacts.add(element);
+ containsTag = true;
+ }
+ if (element.getNodeName().endsWith("wx:sect")) {
+ paragraphRoot = element;
+ }
+ if (element.getNodeName().endsWith("body") && single) {
+ artifacts.add(element);
+ body = element;
+ } else if (oleDataElement == null && element.getNodeName().endsWith("docOleData")) {
+ oleDataElement = element;
+ }
+ }
+ //When creating a three way merge the tags are not added as they create conflicts. Therefore
+ //we remove template information using the listnum fldChar tag. The following code checks for the
+ //attribute tags and if they are not there removes all the paragraphs following the one that contains the
+ //fldChar
+ if (containsTag) {
+ artifacts.remove(body);
+ } else if (paragraphRoot != null) {
+ //Lets try and remove everything after the listnum tag
+ if (!cleanUpParagraph(paragraphRoot)) {
+ throw new OseeCoreException("This document does not contain the approporate tags to be correctly saved.");
+ }
+ }
+
+ return artifacts;
+ }
+
+ //To handle the case of sub-sections
+ private boolean cleanUpParagraph(Node rootNode) throws OseeCoreException {
+ boolean worked = false;
+ boolean delete = false;
+ Node node = rootNode.getFirstChild();
+ while (node != null) {
+ Node nextNode = node.getNextSibling();
+ if (node.getNodeName().endsWith("sub-section")) {
+ worked = cleanUpParagraph(node);
+ } else {
+ String content = node.getTextContent();
+ if (DEBUG) {
+ System.out.println(" " + node.getNodeName());
+ System.out.println(" " + content);
+ }
+ if (content != null && content.contains("LISTNUM\"listreset\"")) {
+ delete = true;
+ }
+ if (delete) {
+ rootNode.removeChild(node);
+ }
+ }
+ node = nextNode;
+ }
+ return worked || delete;
+ }
+
+ private String getGuid(Element artifactElement) throws OseeArgumentException {
+ if (singleGuid != null) return singleGuid;
+ NamedNodeMap attributes = artifactElement.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++) {
+ // MS Word has a nasty habit of changing the namespace say from
+ // ns0 to ns1, so we must
+ // ignore the namespace by using endsWith()
+ if (attributes.item(i).getNodeName().endsWith("guid")) {
+ return attributes.item(i).getNodeValue();
+ }
+ }
+ throw new OseeArgumentException("didn't find the guid attribure in element: " + artifactElement);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateJob.java
new file mode 100644
index 00000000000..08c0a33abd6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UpdateJob.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.framework.ui.skynet.render;
+
+import java.io.File;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class UpdateJob extends Job {
+ protected File workingFile;
+
+ /**
+ * @param name
+ */
+ public UpdateJob(String name) {
+ super(name);
+ }
+
+ /**
+ * @param workingFile The workingFile to set.
+ */
+ public void setWorkingFile(File workingFile) {
+ this.workingFile = workingFile;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UrlRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UrlRenderer.java
new file mode 100644
index 00000000000..6dc4cfc2e54
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/UrlRenderer.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.framework.ui.skynet.render;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class UrlRenderer extends DefaultArtifactRenderer {
+ private final AttributeType contentUrlType;
+
+ /**
+ * @param applicableArtifactTypes
+ * @throws OseeTypeDoesNotExist
+ * @throws OseeDataStoreException
+ */
+ public UrlRenderer() throws OseeDataStoreException, OseeTypeDoesNotExist {
+ super();
+ contentUrlType = AttributeTypeManager.getType("Content URL");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public UrlRenderer newInstance() throws OseeCoreException {
+ return new UrlRenderer();
+ }
+
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) throws OseeCoreException {
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ if (attributeType.equals(contentUrlType)) {
+ return SUBTYPE_TYPE_MATCH;
+ }
+ }
+ return NO_MATCH;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/VbaWordDiffGenerator.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/VbaWordDiffGenerator.java
new file mode 100644
index 00000000000..b854843bf2c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/VbaWordDiffGenerator.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.io.streams.StreamCatcher;
+
+/**
+ * @author Theron Virgin
+ */
+public class VbaWordDiffGenerator implements IVbaDiffGenerator {
+ private final static String header =
+ "Option Explicit\n\nDim oWord\nDim baseDoc\nDim compareDoc\nDim authorName\nDim detectFormatChanges\nDim ver1\nDim ver2\nDim diffPath\nDim wdCompareTargetSelectedDiff\nDim wdCompareTargetSelectedMerge\nDim wdFormattingFromCurrent\nDim wdFormatXML\nDim wdDoNotSaveChanges\nDim visible\nDim mainDoc\n\nPublic Sub main()\n wdCompareTargetSelectedDiff = 0\n wdCompareTargetSelectedMerge = 1\n wdDoNotSaveChanges = 0\n wdFormattingFromCurrent = 3\n wdFormatXML = 11\n\n authorName = \"OSEE Doc compare\"\n\n detectFormatChanges = True\n\n set oWord = WScript.CreateObject(\"Word.Application\")\n oWord.Visible = False\n\n";
+
+ private final static String comparisonCommand =
+ " baseDoc.Compare ver2, authorName, wdCompareTargetSelectedDiff, detectFormatChanges, False, False\n set compareDoc = oWord.ActiveDocument\n\n";
+ private final static String comparisonCommandFirst =
+ " set mainDoc = compareDoc\n baseDoc.close\n set baseDoc = Nothing\n";
+
+ private final static String comparisonCommandOthers =
+ " mainDoc.Range(mainDoc.Range.End-1, mainDoc.Range.End-1).FormattedText = compareDoc.Range.FormattedText\n\n baseDoc.close wdDoNotSaveChanges\n set baseDoc = Nothing\n\n compareDoc.close wdDoNotSaveChanges\n set compareDoc = Nothing\n\n";
+
+ private final static String mergeCommand =
+ " baseDoc.Merge ver2, wdCompareTargetSelectedMerge, detectFormatChanges, wdFormattingFromCurrent, False\n oWord.ActiveDocument.SaveAs diffPath, wdFormatXML, , , False\n\n";
+
+ private final static String tail = " If visible Then\n oWord.Visible = True\n Else\n";
+ private final static String tail2 =
+ " oWord.Quit()\n set oWord = Nothing\n End If\n\nEnd Sub\n\nmain";
+
+ private StringBuilder builder;
+ private boolean finalized;
+ private boolean initialized;
+ private boolean first;
+ private String diffPath = null;
+ private boolean merge = false;
+
+ public VbaWordDiffGenerator() {
+ initialized = false;
+ finalized = false;
+ first = true;
+ }
+
+ public boolean initialize(boolean visible, boolean detectFormatChanges) {
+ if (initialized) {
+ return false;
+ }
+ initialized = true;
+ builder = new StringBuilder();
+ builder.append(header);
+ if (visible) {
+ builder.append(" visible = True\n\n");
+ } else {
+ builder.append(" visible = False\n\n");
+ }
+ if (detectFormatChanges) {
+ builder.append(" detectFormatChanges = True\n\n");
+ } else {
+ builder.append(" detectFormatChanges = False\n\n");
+ }
+ return true;
+ }
+
+ public boolean addComparison(IFile baseFile, IFile newerFile, String diffPath, boolean merge) {
+ if (finalized) {
+ return false;
+ }
+ this.merge = merge;
+ builder.append(" oWord.Visible = False\n");
+ builder.append(" ver1 = \"");
+ builder.append(baseFile.getLocation().toOSString());
+ builder.append("\"\n");
+
+ builder.append(" ver2 = \"");
+ builder.append(newerFile.getLocation().toOSString());
+ builder.append("\"\n");
+
+ builder.append(" diffPath = \"");
+ builder.append(diffPath);
+ builder.append("\"\n\n");
+
+ builder.append(" set baseDoc = oWord.Documents.Open (ver1)\n");
+
+ if (merge) {
+ builder.append(mergeCommand);
+ } else {
+ builder.append(comparisonCommand);
+ if (first) {
+ builder.append(comparisonCommandFirst);
+ first = false;
+ } else {
+ builder.append(comparisonCommandOthers);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void finish(String vbScriptPath, boolean show) throws OseeWrappedException {
+ finalized = true;
+ if (show) {
+ builder.append(" visible = True\n");
+ builder.append(" mainDoc.SaveAs diffPath, wdFormatXML, , , False\n\n");
+ }
+ builder.append(tail);
+ if (!show && !merge) {
+ builder.append(" mainDoc.SaveAs diffPath, wdFormatXML, , , False\n\n");
+ }
+ builder.append(tail2);
+ compare(getFile(vbScriptPath));
+ }
+
+ @Override
+ public File getFile(String path) throws OseeWrappedException {
+ if (!finalized) {
+ return null;
+ }
+ try {
+ FileOutputStream out = new FileOutputStream(path != null ? path : "c:\\UserData\\compareDocs.vbs");
+ out.write(builder.toString().getBytes(), 0, builder.toString().getBytes().length);
+ out.close();
+ return new File(path != null ? path : "c:\\UserData\\compareDocs.vbs");
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ private void compare(File vbDiffScript) throws OseeWrappedException {
+ try {
+ String cmd[] = {"cmd", "/s /c", "\"" + vbDiffScript.getPath() + "\""};
+
+ Process proc = Runtime.getRuntime().exec(cmd);
+
+ StreamCatcher errorCatcher = new StreamCatcher(proc.getErrorStream(), "ERROR");
+ StreamCatcher outputCatcher = new StreamCatcher(proc.getInputStream(), "OUTPUT");
+
+ errorCatcher.start();
+ outputCatcher.start();
+ proc.waitFor();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ } catch (InterruptedException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WholeDocumentRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WholeDocumentRenderer.java
new file mode 100644
index 00000000000..e8d8f279728
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WholeDocumentRenderer.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.io.Streams;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.WordWholeDocumentAttribute;
+import org.eclipse.osee.framework.skynet.core.linking.LinkType;
+import org.eclipse.osee.framework.skynet.core.linking.WordMlLinkHandler;
+import org.eclipse.osee.framework.skynet.core.word.WordAnnotationHandler;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.preferences.DiffPreferencePage;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class WholeDocumentRenderer extends WordRenderer {
+
+ /**
+ * @param rendererId
+ */
+ public WholeDocumentRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public WholeDocumentRenderer newInstance() throws OseeCoreException {
+ return new WholeDocumentRenderer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#commandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(1);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.wholedocumenteditor.command");
+ } else if (presentationType == PresentationType.PREVIEW) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.wholewordpreview.command");
+ }
+
+ return commandIds;
+ }
+
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if (artifact.isOfType(WordArtifact.WHOLE_WORD)) {
+ if (presentationType == PresentationType.DIFF) {
+ return WORD_PUBLICATION;
+ } else {
+ return SUBTYPE_TYPE_MATCH;
+ }
+ }
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor, java.util.List, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ return getRenderInputStream(artifacts.iterator().next(), presentationType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, org.eclipse.osee.framework.ui.skynet.render.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ if (artifact != null) {
+ Attribute<?> attribute = artifact.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT);
+ if (attribute == null) {
+ attribute = artifact.createAttribute(AttributeTypeManager.getType(WordAttribute.WHOLE_WORD_CONTENT), true);
+ }
+ if (presentationType == PresentationType.DIFF && attribute != null && ((WordAttribute) attribute).containsWordAnnotations()) {
+ throw new OseeCoreException(
+ "Trying to diff the " + artifact.getDescriptiveName() + " artifact on the " + artifact.getBranch().getBranchShortName() + " branch, which has tracked changes turned on. All tracked changes must be removed before the artifacts can be compared.");
+ }
+ }
+
+ try {
+ InputStream stream =
+ Streams.convertStringToInputStream(WordWholeDocumentAttribute.getEmptyDocumentContent(), "UTF-8");
+
+ if (artifact != null) {
+ String content = artifact.getSoleAttributeValue(WordAttribute.WHOLE_WORD_CONTENT);
+ String myGuid = artifact.getGuid();
+ content = WordUtil.addGUIDToDocument(myGuid, content);
+
+ LinkType linkType = LinkType.OSEE_SERVER_LINK;
+ content = WordMlLinkHandler.link(linkType, artifact, content);
+ stream = Streams.convertStringToInputStream(content, "UTF-8");
+ }
+ return stream;
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ @Override
+ public String compare(Artifact baseVersion, Artifact newerVersion, IProgressMonitor monitor, PresentationType presentationType, boolean show) throws OseeCoreException {
+ if (baseVersion == null && newerVersion == null) throw new IllegalArgumentException(
+ "baseVersion and newerVersion can't both be null.");
+
+ Branch branch = (baseVersion != null ? baseVersion.getBranch() : newerVersion.getBranch());
+ IFile baseFile;
+ IFile newerFile;
+ Pair<String, Boolean> originalValue = null;
+ Pair<String, Boolean> newAnnotationValue = null;
+ Pair<String, Boolean> oldAnnotationValue = null;
+ if (!StaticIdManager.hasValue(UserManager.getUser(), DiffPreferencePage.REMOVE_TRACKED_CHANGES)) {
+
+ if (baseVersion != null) {
+ Attribute<?> baseAttribute = baseVersion.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT);
+ if (baseAttribute != null) {
+ String value = baseAttribute.getValue().toString();
+ if (WordAnnotationHandler.containsWordAnnotations(value)) {
+ oldAnnotationValue = new Pair<String, Boolean>(value, baseAttribute.isDirty());
+ baseAttribute.setFromString(WordAnnotationHandler.removeAnnotations(value));
+ }
+ }
+ }
+
+ if (newerVersion != null) {
+ Attribute<?> newerAttribute = newerVersion.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT);
+ if (newerAttribute != null) {
+ String value = newerAttribute.getValue().toString();
+ if (WordAnnotationHandler.containsWordAnnotations(value)) {
+ newAnnotationValue = new Pair<String, Boolean>(value, newerAttribute.isDirty());
+ newerAttribute.setFromString(WordAnnotationHandler.removeAnnotations(value));
+ }
+ }
+ }
+ }
+ if (!StaticIdManager.hasValue(UserManager.getUser(), DiffPreferencePage.IDENTFY_IMAGE_CHANGES)) {
+ originalValue =
+ WordImageChecker.checkForImageDiffs(
+ baseVersion != null ? baseVersion.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT) : null,
+ newerVersion != null ? newerVersion.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT) : null);
+ }
+ if (baseVersion != null) {
+ if (presentationType == PresentationType.MERGE || presentationType == PresentationType.MERGE_EDIT) {
+ baseFile = renderForMerge(monitor, baseVersion, presentationType);
+ } else {
+ baseFile = renderForDiff(monitor, baseVersion);
+ }
+ } else {
+ baseFile = renderForDiff(monitor, branch);
+ }
+
+ if (newerVersion != null) {
+ if (presentationType == PresentationType.MERGE || presentationType == PresentationType.MERGE_EDIT) {
+ newerFile = renderForMerge(monitor, newerVersion, presentationType);
+ } else {
+ newerFile = renderForDiff(monitor, newerVersion);
+ }
+ } else {
+ newerFile = renderForDiff(monitor, branch);
+ }
+ WordImageChecker.restoreOriginalValue(
+ baseVersion != null ? baseVersion.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT) : null,
+ oldAnnotationValue != null ? oldAnnotationValue : originalValue);
+ WordImageChecker.restoreOriginalValue(
+ newerVersion != null ? newerVersion.getSoleAttribute(WordAttribute.WHOLE_WORD_CONTENT) : null,
+ newAnnotationValue);
+ return compare(baseVersion, newerVersion, baseFile, newerFile, presentationType, show);
+ }
+
+ @Override
+ public String compare(Artifact baseVersion, Artifact newerVersion, IFile baseFile, IFile newerFile, PresentationType presentationType, boolean show) throws OseeCoreException {
+ String diffPath;
+ String fileName = getStringOption("fileName");
+ if (fileName == null || fileName.equals("")) {
+ if (baseVersion != null) {
+ String baseFileStr = baseFile.getLocation().toOSString();
+ diffPath =
+ baseFileStr.substring(0, baseFileStr.lastIndexOf(')') + 1) + " to " + (newerVersion != null ? newerVersion.getTransactionNumber() : " deleted") + baseFileStr.substring(baseFileStr.lastIndexOf(')') + 1);
+ } else {
+ String baseFileStr = newerFile.getLocation().toOSString();
+ diffPath =
+ baseFileStr.substring(0, baseFileStr.lastIndexOf('(') + 1) + "new " + baseFileStr.substring(baseFileStr.lastIndexOf('(') + 1);
+ }
+ } else {
+ diffPath =
+ getRenderFolder(baseVersion.getBranch(), PresentationType.SPECIALIZED_EDIT).getLocation().toOSString() + '\\' + fileName;
+ }
+
+ VbaWordDiffGenerator diffGenerator = new VbaWordDiffGenerator();
+ diffGenerator.initialize(presentationType == PresentationType.DIFF,
+ presentationType == PresentationType.MERGE_EDIT);
+ if (presentationType == PresentationType.MERGE_EDIT && baseVersion != null) {
+ addFileToWatcher(getRenderFolder(baseVersion.getBranch(), PresentationType.SPECIALIZED_EDIT),
+ diffPath.substring(diffPath.lastIndexOf('\\') + 1));
+ diffGenerator.addComparison(baseFile, newerFile, diffPath, true);
+ diffGenerator.finish(diffPath.substring(0, diffPath.lastIndexOf('\\')) + "mergeDocs.vbs", show);
+ } else {
+ diffGenerator.addComparison(baseFile, newerFile, diffPath, false);
+ diffGenerator.finish(diffPath.substring(0, diffPath.lastIndexOf('\\')) + "/compareDocs.vbs", show);
+ }
+
+ return diffPath;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordCompareTest.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordCompareTest.java
new file mode 100644
index 00000000000..41d84669946
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordCompareTest.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+import org.eclipse.osee.framework.jdk.core.util.io.streams.StreamCatcher;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WordCompareTest {
+
+ static public File getFile(String description) {
+ File toReturn = new File("");
+
+ JFileChooser chooser = new JFileChooser();
+ chooser.setSelectedFile(toReturn);
+ chooser.setFileFilter(new FileFilter() {
+
+ @Override
+ public String getDescription() {
+ return "Select an Xml File";
+ }
+
+ public boolean accept(File file) {
+ return file.isDirectory() || (file.isFile() && file.getName().endsWith(".xml"));
+ }
+ });
+
+ int returnVal = chooser.showDialog(null, description);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ toReturn = chooser.getSelectedFile();
+ }
+
+ return toReturn;
+ }
+
+ private static URL getClassLocation(final Class<?> classToFind) {
+ URL result = null;
+ if (classToFind == null) {
+ throw new IllegalArgumentException("Class is null");
+ }
+ final String classAsResource = classToFind.getName().replace('.', '/').concat(".class");
+ final ProtectionDomain pd = classToFind.getProtectionDomain();
+ if (pd != null) {
+ final CodeSource cs = pd.getCodeSource();
+ if (cs != null) {
+ result = cs.getLocation();
+ }
+ if (result != null) {
+ // Convert a code source location into a full class file location
+ if (result.getProtocol().equals("file")) {
+ try {
+ if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip"))
+ result = new URL("jar:".concat(result.toExternalForm()).concat("!/").concat(classAsResource));
+ else if (new File(result.getFile()).isDirectory()) result = new URL(result, classAsResource);
+ } catch (MalformedURLException ignore) {
+ }
+ }
+ }
+ }
+ if (result == null) {
+ // Try to find class definition as a resource
+ final ClassLoader classLoader = classToFind.getClassLoader();
+ result =
+ classLoader != null ? classLoader.getResource(classAsResource) : ClassLoader.getSystemResource(classAsResource);
+ }
+ return result;
+ }
+
+ public static File getFileSystemPath(String entry) {
+ File toReturn = null;
+ URL url = getClassLocation(WordCompareTest.class);
+ if (url != null) {
+ File temp = new File(url.getFile());
+ int cnt = 12;
+ while (!temp.getName().equals("bin") && cnt >= 0) {
+ temp = temp.getParentFile();
+ cnt--;
+ }
+ temp = temp.getParentFile();
+ toReturn = new File(temp.getAbsolutePath() + File.separator + entry);
+ }
+ return toReturn;
+ }
+
+ public static void main(String[] args) {
+
+ try {
+ String diffPath = System.getProperty("user.home") + File.separator + "DiffResults";
+ File baseFile = getFile("Select Base Xml File To Compare");
+ if (!baseFile.exists()) {
+ throw new IllegalStateException("baseFile doesn't exist => " + baseFile);
+ }
+
+ File newerFile = getFile("Select Newer Xml File To Compare");
+ if (!newerFile.exists()) {
+ throw new IllegalStateException("newerFile doesn't exist => " + newerFile);
+ }
+
+ File vbDiffScript = getFileSystemPath("support" + File.separator + "compareDocs.vbs");
+ if (!vbDiffScript.exists()) {
+ throw new IllegalStateException("vbDiffScript doesn't exist => " + vbDiffScript);
+ }
+
+ // quotes are neccessary because of Runtime.exec wraps the last element in quotes...crazy
+ String cmd[] =
+ {
+ "cmd",
+ "/s /c",
+ "\"" + vbDiffScript.getPath() + "\"",
+ "/author:CoolOseeUser\" /diffPath:\"" + diffPath + "\" /detectFormatChanges:true /ver1:\"" + baseFile.getAbsolutePath() + "\" /ver2:\"" + newerFile.getAbsolutePath()};
+
+ Process proc = Runtime.getRuntime().exec(cmd);
+
+ StreamCatcher errorCatcher = new StreamCatcher(proc.getErrorStream(), "ERROR");
+ StreamCatcher outputCatcher = new StreamCatcher(proc.getInputStream(), "OUTPUT");
+
+ errorCatcher.start();
+ outputCatcher.start();
+ proc.waitFor();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordImageChecker.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordImageChecker.java
new file mode 100644
index 00000000000..136ffb43824
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordImageChecker.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.framework.ui.skynet.render;
+
+import java.io.UnsupportedEncodingException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Theron Virgin
+ */
+public class WordImageChecker {
+
+ public static void restoreOriginalValue(Attribute attr, Pair<String, Boolean> originalValue) throws OseeCoreException {
+ if (attr != null && originalValue != null) {
+ attr.setValue(originalValue.getKey());
+ if (!originalValue.getValue()) {
+ attr.setNotDirty();
+ }
+ }
+ }
+
+ public static Pair<String, Boolean> checkForImageDiffs(Attribute oldAttr, Attribute newAttr) throws OseeCoreException {
+ String downArrow = "";
+ try {
+ downArrow = new String(new byte[] {(byte) 0xE2, (byte) 0x86, (byte) 0x93}, "UTF-8");
+ } catch (UnsupportedEncodingException ex) {
+ }
+ String MODIFIED_STRING =
+ "<w:t>" + downArrow + " OSEE Detected Image Modification " + downArrow + "</w:t></w:r></w:p><w:p><w:r></w:r></w:p><w:p><w:r>";
+ if (oldAttr != null && newAttr != null) {
+ String oldValue = (String) oldAttr.getValue();
+ String newValue = (String) newAttr.getValue();
+ boolean attrDirty = newAttr.isDirty();
+ String originalValue = new String(oldValue);
+ List<WordmlPicture> oldPictures = createPictureList(oldValue, oldAttr);
+ List<WordmlPicture> newPictures = createPictureList(newValue, newAttr);
+ boolean modified = false;
+ int count = 0;
+ for (int y = 0; y < oldPictures.size(); y++) {
+ if (y < newPictures.size() && oldPictures.get(y).getBinaryData() != null && newPictures.get(y).getBinaryData() != null) {
+ if (!oldPictures.get(y).getBinaryData().equals(newPictures.get(y).getBinaryData())) {
+ int index = oldPictures.get(y).getStartIndex() + (MODIFIED_STRING.length() * count);
+ oldValue = oldValue.substring(0, index) + MODIFIED_STRING + oldValue.substring(index);
+ modified = true;
+ count++;
+ oldAttr.setValue(oldValue);
+ }
+ }
+ }
+ if (modified) {
+ return new Pair<String, Boolean>(originalValue, attrDirty);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param oldValue
+ * @return
+ */
+ private static List<WordmlPicture> createPictureList(String wordml, Attribute attribute) {
+ int startIndex = 0;
+ List<WordmlPicture> pictures = new LinkedList<WordmlPicture>();
+ while (wordml.indexOf("<w:pict>", startIndex) > 0) {
+ int currentStartIndex = wordml.indexOf("<w:pict>", startIndex);
+ int currentEndIndex = wordml.indexOf("</w:pict", currentStartIndex);
+ if (currentEndIndex > 0) {
+ try {
+ pictures.add(new WordmlPicture(currentStartIndex, wordml.substring(currentStartIndex, currentEndIndex),
+ wordml, attribute));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(WordImageChecker.class, Level.WARNING, ex);
+ }
+ }
+ startIndex = currentEndIndex;
+ }
+ return pictures;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordRenderer.java
new file mode 100644
index 00000000000..1eb554bb5bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordRenderer.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.framework.ui.skynet.render;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class WordRenderer extends FileRenderer {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#getImage(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+
+ // We need MS Word, so look for the program that is for .doc files
+ private static final Program wordApp = Program.findProgram("doc");
+
+ /**
+ * @param rendererId
+ */
+ public WordRenderer() {
+ super();
+ }
+
+ @Override
+ public Image getImage(Artifact artifact) throws OseeCoreException {
+ return ImageManager.getProgramImage("doc");
+ }
+
+ public static ImageDescriptor getImageDescriptor() throws OseeArgumentException {
+ return ImageManager.getProgramImageDescriptor("doc");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#minimumRanking()
+ */
+ @Override
+ public int minimumRanking() throws OseeCoreException {
+ return NO_MATCH;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.Renderer#getName()
+ */
+ @Override
+ public String getName() {
+ return "MS Word Edit";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getAssociatedExtension(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public String getAssociatedExtension(Artifact artifact) throws OseeCoreException {
+ return "xml";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer#getAssociatedProgram(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public Program getAssociatedProgram(Artifact artifact) throws OseeCoreException {
+ if (wordApp == null) {
+ throw new OseeStateException("No program associated with the extension .doc");
+ }
+ return wordApp;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#supportsCompare()
+ */
+ @Override
+ public boolean supportsCompare() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordTemplateRenderer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordTemplateRenderer.java
new file mode 100644
index 00000000000..91b46b29ee8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordTemplateRenderer.java
@@ -0,0 +1,544 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+import javax.xml.namespace.QName;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+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.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.linking.LinkType;
+import org.eclipse.osee.framework.skynet.core.linking.WordMlLinkHandler;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.skynet.core.word.WordAnnotationHandler;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.preferences.DiffPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.word.AttributeElement;
+import org.eclipse.osee.framework.ui.skynet.render.word.Producer;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordTemplateProcessor;
+import org.eclipse.osee.framework.ui.skynet.templates.TemplateManager;
+import org.eclipse.osee.framework.ui.skynet.util.WordUiUtil;
+import org.w3c.dom.Element;
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
+
+/**
+ * Renders WordML content.
+ *
+ * @author Jeff C. Phillips
+ */
+public class WordTemplateRenderer extends WordRenderer implements ITemplateRenderer {
+
+ private static final Pattern pattern =
+ Pattern.compile("<v:imagedata[^>]*src=\"wordml://(\\d+\\.\\w+)\"[^>]*>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ public static final String RENDERER_EXTENSION = "org.eclipse.osee.framework.ui.skynet.word";
+ public static final String DEFAULT_SET_NAME = "Default";
+ public static final String ARTIFACT_NAME = "Word Renderer";
+ public static final String TEMPLATE_ATTRIBUTE = "Word Template";
+ public static final String ARTIFACT_SCHEMA = "http://eclipse.org/artifact.xsd";
+ private static final String EMBEDDED_OBJECT_NO = "w:embeddedObjPresent=\"no\"";
+ private static final String EMBEDDED_OBJECT_YES = "w:embeddedObjPresent=\"yes\"";
+ private static final String STYLES_END = "</w:styles>";
+ private static final String OLE_START = "<w:docOleData>";
+ private static final String OLE_END = "</w:docOleData>";
+ private static final QName fo = new QName("ns0", "unused_localname", ARTIFACT_SCHEMA);
+ public static final String UPDATE_PARAGRAPH_NUMBER_OPTION = "updateParagraphNumber";
+ private static boolean noPopups = false;
+ private Set<Artifact> artifacts = new HashSet<Artifact>();
+
+ private final WordTemplateProcessor templateProcessor = new WordTemplateProcessor(this);
+
+ /**
+ * @param rendererId
+ */
+ public WordTemplateRenderer() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.DefaultArtifactRenderer#commandId()
+ */
+ @Override
+ public List<String> getCommandId(PresentationType presentationType) {
+ ArrayList<String> commandIds = new ArrayList<String>(2);
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.wordeditor.command");
+ } else if (presentationType == PresentationType.PREVIEW) {
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.wordpreview.command");
+ commandIds.add("org.eclipse.osee.framework.ui.skynet.wordpreviewChildren.command");
+ }
+
+ return commandIds;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#newInstance()
+ */
+ @Override
+ public WordTemplateRenderer newInstance() throws OseeCoreException {
+ return new WordTemplateRenderer();
+ }
+
+ public void publish(VariableMap variableMap, Artifact masterTemplateArtifact, Artifact slaveTemplateArtifact, List<Artifact> artifacts) throws OseeCoreException {
+ templateProcessor.publishWithExtensionTemplates(variableMap, masterTemplateArtifact, slaveTemplateArtifact,
+ artifacts);
+ }
+
+ /**
+ * Creates a difference report for each artifact between baseArtifact and newerArtifact. Then produces a single
+ * report by combining each of the difference reports together for a single report.
+ */
+ @Override
+ public void compareArtifacts(final List<Artifact> baseArtifacts, final List<Artifact> newerArtifact, IProgressMonitor monitor, final Branch branch, PresentationType presentationType) throws OseeCoreException {
+ if (branch == null) {
+ throw new OseeArgumentException("Branch can not be null");
+ }
+
+ if (baseArtifacts.size() != newerArtifact.size()) {
+ throw new OseeArgumentException(
+ "base artifacts size: " + baseArtifacts.size() + " must match newer artifacts size: " + newerArtifact.size() + ".");
+ }
+
+ Jobs.startJob(new Job("Word Change Report") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ String fileName = getStringOption("fileName");
+
+ //if the file name is null we will give it a GUID
+ if (fileName == null) {
+ fileName = GUID.generateGuidStr() + ".xml";
+ }
+
+ monitor.beginTask("Word Change Report ", newerArtifact.size() * 2);
+ ArrayList<String> fileNames = new ArrayList<String>(newerArtifact.size());
+ IFolder baseFolder = getRenderFolder(branch, PresentationType.DIFF);
+ IFolder changeReportFolder = OseeData.getFolder(".diff/" + GUID.generateGuidStr());
+ String baseFileStr = "c:/UserData";
+ String localFileName = null;
+
+ VbaWordDiffGenerator generator = new VbaWordDiffGenerator();
+ generator.initialize(false, false);
+ for (int i = 0; i < newerArtifact.size(); i++) {
+ try {
+ //Remove tracked changes and display image diffs
+ Pair<String, Boolean> originalValue = null;
+ Pair<String, Boolean> newAnnotationValue = null;
+ Pair<String, Boolean> oldAnnotationValue = null;
+
+ //Check for tracked changes
+ artifacts.clear();
+ artifacts.addAll(checkForTrackedChangesOn(baseArtifacts.get(i)));
+ artifacts.addAll(checkForTrackedChangesOn(newerArtifact.get(i)));
+ if (!artifacts.isEmpty()) {
+ continue;
+ }
+
+ if (!StaticIdManager.hasValue(UserManager.getUser(), DiffPreferencePage.IDENTFY_IMAGE_CHANGES)) {
+ originalValue =
+ WordImageChecker.checkForImageDiffs(
+ baseArtifacts.get(i) != null ? baseArtifacts.get(i).getSoleAttribute(
+ WordAttribute.WORD_TEMPLATE_CONTENT) : null,
+ newerArtifact.get(i) != null ? newerArtifact.get(i).getSoleAttribute(
+ WordAttribute.WORD_TEMPLATE_CONTENT) : null);
+ }
+ IFile baseFile =
+ renderToFile(baseFolder, getFilenameFromArtifact(null, PresentationType.DIFF), branch,
+ getRenderInputStream(baseArtifacts.get(i), PresentationType.DIFF),
+ PresentationType.DIFF);
+ IFile newerFile =
+ renderToFile(baseFolder, getFilenameFromArtifact(null, PresentationType.DIFF), branch,
+ getRenderInputStream(newerArtifact.get(i), PresentationType.DIFF),
+ PresentationType.DIFF);
+ WordImageChecker.restoreOriginalValue(
+ baseArtifacts.get(i) != null ? baseArtifacts.get(i).getSoleAttribute(
+ WordAttribute.WORD_TEMPLATE_CONTENT) : null,
+ oldAnnotationValue != null ? oldAnnotationValue : originalValue);
+ WordImageChecker.restoreOriginalValue(
+ newerArtifact.get(i) != null ? newerArtifact.get(i).getSoleAttribute(
+ WordAttribute.WORD_TEMPLATE_CONTENT) : null, newAnnotationValue);
+ baseFileStr = changeReportFolder.getLocation().toOSString();
+ localFileName = baseFileStr + "/" + GUID.generateGuidStr() + ".xml";
+ fileNames.add(localFileName);
+
+ monitor.setTaskName("Adding to Diff Script: " + (newerArtifact.get(i) == null ? "Unnamed Artifact" : newerArtifact.get(
+ i).getDescriptiveName()));
+ monitor.worked(1);
+
+ if (monitor.isCanceled()) {
+ monitor.done();
+ return Status.CANCEL_STATUS;
+ }
+ generator.addComparison(baseFile, newerFile, localFileName, false);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+ monitor.setTaskName("Running Diff Script");
+ if (!baseFileStr.equals("c:/UserData")) {
+ generator.finish(baseFileStr + "/compareDocs.vbs", true);
+ }
+ // Let the user know that these artifacts had tracked changes on and we are not handling them
+ // Also, list these artifacts in an artifact explorer
+ if (!artifacts.isEmpty() && !noPopups) {
+ WordUiUtil.displayWarningMessageDialog("Diff Artifacts Warning",
+ "Detected tracked changes for some artifacts. Please refer to the results HTML report.");
+ WordUiUtil.displayTrackedChangesOnArtifacts(artifacts);
+ }
+ } catch (OseeCoreException ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, Status.OK, ex.getLocalizedMessage(), ex);
+ }
+ return Status.OK_STATUS;
+ }
+ });
+ }
+
+ @Override
+ public String compare(Artifact baseVersion, Artifact newerVersion, IProgressMonitor monitor, PresentationType presentationType, boolean show) throws OseeCoreException {
+ if (baseVersion == null && newerVersion == null) throw new OseeArgumentException(
+ "baseVersion and newerVersion can't both be null.");
+
+ Branch branch = (baseVersion != null ? baseVersion.getBranch() : newerVersion.getBranch());
+ IFile baseFile;
+ IFile newerFile;
+ Pair<String, Boolean> originalValue = null;
+ Pair<String, Boolean> newAnnotationValue = null;
+ Pair<String, Boolean> oldAnnotationValue = null;
+
+ //Check for tracked changes
+ artifacts.clear();
+ artifacts.addAll(checkForTrackedChangesOn(baseVersion));
+ artifacts.addAll(checkForTrackedChangesOn(newerVersion));
+
+ if (artifacts.isEmpty()) {
+ if (!StaticIdManager.hasValue(UserManager.getUser(), DiffPreferencePage.IDENTFY_IMAGE_CHANGES)) {
+ originalValue =
+ WordImageChecker.checkForImageDiffs(
+ baseVersion != null ? baseVersion.getSoleAttribute(WordAttribute.WORD_TEMPLATE_CONTENT) : null,
+ newerVersion != null ? newerVersion.getSoleAttribute(WordAttribute.WORD_TEMPLATE_CONTENT) : null);
+ }
+ if (baseVersion != null) {
+ if (presentationType == PresentationType.MERGE || presentationType == PresentationType.MERGE_EDIT) {
+ baseFile = renderForMerge(monitor, baseVersion, presentationType);
+ } else {
+ baseFile = renderForDiff(monitor, baseVersion);
+ }
+ } else {
+ baseFile = renderForDiff(monitor, branch);
+ }
+
+ if (newerVersion != null) {
+ if (presentationType == PresentationType.MERGE || presentationType == PresentationType.MERGE_EDIT) {
+ newerFile = renderForMerge(monitor, newerVersion, presentationType);
+ } else {
+ newerFile = renderForDiff(monitor, newerVersion);
+ }
+ } else {
+ newerFile = renderForDiff(monitor, branch);
+ }
+ WordImageChecker.restoreOriginalValue(
+ baseVersion != null ? baseVersion.getSoleAttribute(WordAttribute.WORD_TEMPLATE_CONTENT) : null,
+ oldAnnotationValue != null ? oldAnnotationValue : originalValue);
+ WordImageChecker.restoreOriginalValue(
+ newerVersion != null ? newerVersion.getSoleAttribute(WordAttribute.WORD_TEMPLATE_CONTENT) : null,
+ newAnnotationValue);
+ return compare(baseVersion, newerVersion, baseFile, newerFile, presentationType, show);
+ } else {
+ if (!noPopups) {
+ WordUiUtil.displayWarningMessageDialog("Diff Artifacts Warning",
+ "Detected tracked changes for some artifacts. Please refer to the results HTML report.");
+ WordUiUtil.displayTrackedChangesOnArtifacts(artifacts);
+ }
+ }
+ return "";
+ }
+
+ @Override
+ public String compare(Artifact baseVersion, Artifact newerVersion, IFile baseFile, IFile newerFile, PresentationType presentationType, boolean show) throws OseeCoreException {
+ String diffPath;
+
+ String fileName = getStringOption("fileName");
+ if (fileName == null || fileName.equals("")) {
+ if (baseVersion != null) {
+ String baseFileStr = baseFile.getLocation().toOSString();
+ diffPath =
+ baseFileStr.substring(0, baseFileStr.lastIndexOf(')') + 1) + " to " + (newerVersion != null ? newerVersion.getTransactionNumber() : " deleted") + baseFileStr.substring(baseFileStr.lastIndexOf(')') + 1);
+ } else {
+ String baseFileStr = newerFile.getLocation().toOSString();
+ diffPath =
+ baseFileStr.substring(0, baseFileStr.lastIndexOf('(') + 1) + "new " + baseFileStr.substring(baseFileStr.lastIndexOf('(') + 1);
+ }
+ } else {
+ diffPath =
+ getRenderFolder(baseVersion.getBranch(), PresentationType.SPECIALIZED_EDIT).getLocation().toOSString() + '\\' + fileName;
+ }
+
+ VbaWordDiffGenerator diffGenerator = new VbaWordDiffGenerator();
+ diffGenerator.initialize(presentationType == PresentationType.DIFF,
+ presentationType == PresentationType.MERGE_EDIT);
+
+ if (presentationType == PresentationType.MERGE_EDIT && baseVersion != null) {
+ addFileToWatcher(getRenderFolder(baseVersion.getBranch(), PresentationType.SPECIALIZED_EDIT),
+ diffPath.substring(diffPath.lastIndexOf('\\') + 1));
+ diffGenerator.addComparison(baseFile, newerFile, diffPath, true);
+ diffGenerator.finish(diffPath.substring(0, diffPath.lastIndexOf('\\')) + "mergeDocs.vbs", show);
+ } else {
+ diffGenerator.addComparison(baseFile, newerFile, diffPath, false);
+ diffGenerator.finish(diffPath.substring(0, diffPath.lastIndexOf('\\')) + "/compareDocs.vbs", show);
+ }
+
+ return diffPath;
+ }
+
+ /**
+ * Displays a list of artifacts in the Artifact Explorer that could not be multi edited because they contained
+ * artifacts that had an OLEData attribute.
+ *
+ * @param artifacts
+ */
+ private void displayNotMultiEditArtifacts(final Collection<Artifact> artifacts) {
+ if (!artifacts.isEmpty()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+
+ public void run() {
+ WordUiUtil.displayUnhandledArtifacts(artifacts);
+ }
+ });
+ }
+ }
+
+ public static QName getFoNamespace() {
+ return fo;
+ }
+
+ public static byte[] getFormattedContent(Element formattedItemElement) {
+ ByteArrayOutputStream data = new ByteArrayOutputStream((int) Math.pow(2, 10));
+ OutputFormat format = Jaxp.getCompactFormat(formattedItemElement.getOwnerDocument());
+ format.setOmitDocumentType(true);
+ format.setOmitXMLDeclaration(true);
+ XMLSerializer serializer = new XMLSerializer(data, format);
+
+ try {
+ for (Element e : Jaxp.getChildDirects(formattedItemElement))
+ serializer.serialize(e);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+
+ return data.toByteArray();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.render.IRenderer#isValidFor(org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public int getApplicabilityRating(PresentationType presentationType, Artifact artifact) {
+ if (!artifact.isOfType(WordArtifact.WHOLE_WORD) && !artifact.isOfType("Native")) {
+ if (presentationType == PresentationType.DIFF || presentationType == PresentationType.PREVIEW) {
+ return WORD_PUBLICATION;
+ }
+ }
+
+ if (artifact.isOfType(WordArtifact.WORD_TEMPLATE)) {
+ if (presentationType != PresentationType.GENERALIZED_EDIT) {
+ return PRESENTATION_SUBTYPE_MATCH;
+ }
+ }
+ return NO_MATCH;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String,
+ * org.eclipse.osee.framework.ui.skynet.render.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(1);
+ if (artifact != null) {
+ artifacts.add(artifact);
+ }
+ return getRenderInputStream(artifacts, presentationType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.WordRenderer#renderAttribute(java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Artifact)
+ */
+ @Override
+ public void renderAttribute(String attributeTypeName, Artifact artifact, PresentationType presentationType, Producer producer, VariableMap map, AttributeElement attributeElement) throws OseeCoreException {
+ String value = "";
+ WordMLProducer wordMl = (WordMLProducer) producer;
+
+ if (attributeTypeName.equals(WordAttribute.WORD_TEMPLATE_CONTENT)) {
+ Attribute<?> wordTempConAttr = artifact.getSoleAttribute(attributeTypeName);
+ String data = (String) wordTempConAttr.getValue();
+
+ if (attributeElement.getLabel().length() > 0) {
+ wordMl.addParagraph(attributeElement.getLabel());
+ }
+
+ if (data != null) {
+ value = WordUtil.stripSpellCheck(data);//TODO what is the best way to get at unknown attribute types? (because this isn't it)
+ //Change the BinData Id so images do not get overridden by the other images
+ value = WordUtil.reassignBinDataID(value);
+
+ LinkType linkType = (LinkType) map.getValue("linkType");
+ value = WordMlLinkHandler.link(linkType, artifact, value);
+ }
+
+ if (presentationType == PresentationType.SPECIALIZED_EDIT) {
+ WordTemplateProcessor.writeXMLMetaDataWrapper(wordMl,
+ WordTemplateProcessor.elementNameFor(attributeTypeName), "ns0:guid=\"" + artifact.getGuid() + "\"",
+ "ns0:attrId=\"" + wordTempConAttr.getAttributeType().getAttrTypeId() + "\"", value);
+ } else {
+ wordMl.addWordMl(value);
+ }
+ wordMl.resetListValue();
+
+ } else {
+ super.renderAttribute(attributeTypeName, artifact, PresentationType.SPECIALIZED_EDIT, wordMl, map,
+ attributeElement);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.render.FileRenderer#getRenderInputStream(org.eclipse.core.runtime.IProgressMonitor,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String,
+ * org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer.PresentationType)
+ */
+ @Override
+ public InputStream getRenderInputStream(List<Artifact> artifacts, PresentationType presentationType) throws OseeCoreException {
+ final List<Artifact> notMultiEditableArtifacts = new LinkedList<Artifact>();
+ String template;
+
+ if (artifacts.isEmpty()) {
+ // Still need to get a default template with a null artifact list
+ template = getTemplate(null, presentationType);
+ } else {
+ Artifact firstArtifact = artifacts.iterator().next();
+ template = getTemplate(firstArtifact, presentationType);
+ if (presentationType == PresentationType.SPECIALIZED_EDIT && artifacts.size() > 1) {
+ // currently we can't support the editing of multiple artifacts with OLE data
+ for (Artifact artifact : artifacts) {
+ if (!artifact.getSoleAttributeValue(WordAttribute.OLE_DATA_NAME, "").equals("") && presentationType == PresentationType.GENERALIZED_EDIT) {
+ notMultiEditableArtifacts.add(artifact);
+ }
+ }
+ displayNotMultiEditArtifacts(notMultiEditableArtifacts);
+ artifacts.removeAll(notMultiEditableArtifacts);
+ } else { // support OLE data when appropriate
+ if (!firstArtifact.getSoleAttributeValue(WordAttribute.OLE_DATA_NAME, "").equals("")) {
+ template = template.replaceAll(EMBEDDED_OBJECT_NO, EMBEDDED_OBJECT_YES);
+ template =
+ template.replaceAll(STYLES_END, STYLES_END + OLE_START + firstArtifact.getSoleAttributeValue(
+ WordAttribute.OLE_DATA_NAME, "") + OLE_END);
+ }
+ }
+ }
+
+ template = WordUtil.removeGUIDFromTemplate(template);
+ return templateProcessor.applyTemplate(getOptions(), artifacts, template, null, null, null, presentationType);
+ }
+
+ protected String getTemplate(Artifact artifact, PresentationType presentationType) throws OseeCoreException {
+ return TemplateManager.getTemplate(this, artifact, presentationType.name(), getStringOption(TEMPLATE_OPTION)).getSoleAttributeValue(
+ WordAttribute.WHOLE_WORD_CONTENT);
+ }
+
+ private Set<Artifact> checkForTrackedChangesOn(Artifact artifact) throws OseeCoreException {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ if (!StaticIdManager.hasValue(UserManager.getUser(), DiffPreferencePage.REMOVE_TRACKED_CHANGES)) {
+ Attribute attribute;
+ if (artifact != null) {
+ attribute = artifact.getSoleAttribute(WordAttribute.WORD_TEMPLATE_CONTENT);
+ if (attribute != null) {
+ String value = attribute.getValue().toString();
+ // check for track changes
+ if (WordAnnotationHandler.containsWordAnnotations(value)) {
+ // capture those artifacts that have tracked changes on
+ artifacts.add(artifact);
+ }
+ }
+ }
+ }
+ return artifacts;
+ }
+
+ /**
+ * @return the noPopups
+ */
+ public static boolean isNoPopups() {
+ return noPopups;
+ }
+
+ /**
+ * @param noPopups the noPopups to set
+ */
+ public static void setNoPopups(boolean noPopups) {
+ WordTemplateRenderer.noPopups = noPopups;
+ }
+
+ /**
+ * @return the artifacts
+ */
+ public Set<Artifact> getArtifacts() {
+ return artifacts;
+ }
+
+ /**
+ * @param artifacts the artifacts to set
+ */
+ public void setArtifacts(Set<Artifact> artifacts) {
+ this.artifacts = artifacts;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordmlPicture.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordmlPicture.java
new file mode 100644
index 00000000000..3704d07d619
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/WordmlPicture.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.framework.ui.skynet.render;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Theron Virgin
+ */
+public class WordmlPicture {
+ private int pictureStartIndex;
+ private String binaryData;
+ private String pictureDefinition;
+ private Attribute attribute;
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Word"));
+
+ public WordmlPicture() {
+
+ }
+
+ public WordmlPicture(int pictureStartIndex, String pictureDefinition, String document, Attribute attribute) throws OseeCoreException {
+ this.pictureStartIndex = pictureStartIndex;
+ this.pictureDefinition = pictureDefinition;
+ this.attribute = attribute;
+ findBinaryData(document);
+ }
+
+ private void findBinaryData(String document) throws OseeCoreException {
+ if (pictureDefinition.contains("<v:textbox ") || pictureDefinition.contains("<v:rect ") || pictureDefinition.contains("<v:line ")) {
+ //ignore this case
+ } else if (pictureDefinition.contains("<w:binData")) {
+ int index = pictureDefinition.indexOf(">", pictureDefinition.indexOf("<w:binData")) + 1;
+ binaryData = pictureDefinition.substring(index, pictureDefinition.indexOf("<", index));
+ } else if (pictureDefinition.contains("<v:imagedata")) {
+ int index = pictureDefinition.indexOf("src=\"", pictureDefinition.indexOf("<v:imagedata")) + 5;
+ String pictureId = pictureDefinition.substring(index, pictureDefinition.indexOf("\"", index));
+ int dataIndex = document.indexOf("<w:binData w:name=\"" + pictureId + "\"");
+ if (dataIndex < 0) {
+ if (DEBUG) {
+ System.out.println(pictureDefinition);
+ }
+ throw new OseeCoreException(
+ "This document is missing Image Data. The Image can not be checked for modifications Artifact =>" + attribute.getArtifact().getSafeName() + " " + attribute.getArtifact().getArtId());
+ }
+ binaryData =
+ document.substring(document.indexOf(">", dataIndex) + 1, document.indexOf("<", document.indexOf(">",
+ dataIndex) + 1));
+ } else {
+ if (!(pictureDefinition.contains("<v:formulas>") || pictureDefinition.contains("<v:path ") || pictureDefinition.contains("<v:textbox ") || pictureDefinition.contains("<v:rect ") || pictureDefinition.contains("<v:line "))) {
+ if (DEBUG) {
+ System.out.println(pictureDefinition);
+ }
+ throw new OseeCoreException(
+ "This document contains undefined picture data. Please report details to OSEE development team. Artifact=> " + attribute.getArtifact().getSafeName() + " " + attribute.getArtifact().getArtId());
+ }
+ }
+ }
+
+ public int getStartIndex() {
+ return pictureStartIndex;
+ }
+
+ public String getBinaryData() {
+ return binaryData;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/AttributeElement.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/AttributeElement.java
new file mode 100644
index 00000000000..9b64a881de9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/AttributeElement.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.framework.ui.skynet.render.word;
+
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AttributeElement {
+ private static final Pattern internalAttributeElementsPattern =
+ Pattern.compile("<((\\w+:)?(Label|Outline|Name|Format|Editable))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private String outlineNumber;
+ private String label;
+ private String attributeName;
+ private String format;
+
+ public AttributeElement(String element) {
+ Matcher matcher = internalAttributeElementsPattern.matcher(element);
+
+ this.outlineNumber = "";
+ this.label = "";
+ this.attributeName = "";
+ this.format = "";
+
+ while (matcher.find()) {
+ String elementType = matcher.group(3);
+ String value = matcher.group(4).trim();
+ if (elementType.equals("Outline")) {
+ value = WordUtil.textOnly(value);
+ if (value.length() > 0) {
+ outlineNumber = value;
+ } else {
+ outlineNumber = "1.0";
+ }
+ } else if (elementType.equals("Label")) {
+ label = value;
+ } else if (elementType.equals("Name")) {
+ attributeName = WordUtil.textOnly(value);
+ } else if (elementType.equals("Format")) {
+ format = value;
+ } else {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Unexpected element read in Attribute:" + elementType);
+ }
+ }
+ }
+
+ public String getAttributeName() {
+ return attributeName;
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getOutlineNumber() {
+ return outlineNumber;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/IWordMlProducer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/IWordMlProducer.java
new file mode 100644
index 00000000000..adc517476fd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/IWordMlProducer.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.framework.ui.skynet.render.word;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public interface IWordMlProducer {
+
+ public VariableMap process(VariableMap variableMap) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/Producer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/Producer.java
new file mode 100644
index 00000000000..351d8f01bb6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/Producer.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.framework.ui.skynet.render.word;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class Producer {
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordMLProducer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordMLProducer.java
new file mode 100644
index 00000000000..1079b917d8c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordMLProducer.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.framework.ui.skynet.render.word;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WordMLProducer extends Producer {
+ public static final String RGB_RED = "FF0000";
+ public static final String RGB_GREEN = "00FF00";
+ public static final String RGB_BLUE = "0000FF";
+
+ private static final String FILE_NAME = "fileName";
+
+ public static final String LISTNUM_FIELD_HEAD = "<w:pPr><w:rPr><w:vanish/></w:rPr></w:pPr>";
+ public static final String LISTNUM_FIELD_TAIL =
+ "<w:r><w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r><w:rPr><w:vanish/></w:rPr><w:instrText>LISTNUM\"listreset\"\\l1\\s0</w:instrText></w:r><w:r><w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType=\"end\"/><wx:t wx:val=\"1.\"/></w:r>";
+
+ //This regular expression pulls out all of the stuff after the inserted listnum reordering stuff. This needs to be
+ //here so that we remove unwanted template information from single editing
+ public static final String LISTNUM_FIELD_TAIL_REG_EXP =
+ "<w:r(>| .*?>)<w:rPr><w:vanish/></w:rPr><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r(>| .*?>)<w:rPr><w:vanish/></w:rPr><w:instrText> LISTNUM \"listreset\"";
+ public static final String LISTNUM_FIELD = LISTNUM_FIELD_HEAD + LISTNUM_FIELD_TAIL;
+ private static final String SUB_DOC =
+ "<wx:sect><w:p><w:pPr><w:sectPr><w:pgSz w:w=\"12240\" w:h=\"15840\"/><w:pgMar w:top=\"1440\" w:right=\"1800\" w:bottom=\"1440\" w:left=\"1800\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/><w:cols w:space=\"720\"/><w:docGrid w:line-pitch=\"360\"/></w:sectPr></w:pPr></w:p><w:subDoc w:link=\"" + FILE_NAME + "\"/></wx:sect><wx:sect><wx:sub-section><w:p><w:pPr><w:pStyle w:val=\"Heading1\"/></w:pPr></w:p><w:sectPr><w:type w:val=\"continuous\"/><w:pgSz w:w=\"12240\" w:h=\"15840\"/><w:pgMar w:top=\"1440\" w:right=\"1800\" w:bottom=\"1440\" w:left=\"1800\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/><w:cols w:space=\"720\"/><w:docGrid w:line-pitch=\"360\"/></w:sectPr></wx:sub-section></wx:sect>";
+ private static final String HYPER_LINK_DOC =
+ "<w:p><w:hlink w:dest=\"fileName\"><w:r wsp:rsidRPr=\"00CE6681\"><w:rPr><w:rStyle w:val=\"Hyperlink\"/></w:rPr><w:t>fileName</w:t></w:r></w:hlink></w:p>";
+ private Appendable strB;
+ private final int[] outlineNumber;
+ private int outlineLevel;
+ private int flattenedLevelCount;
+ private boolean previousPageLandsacpe;
+ private Map<String, Integer> alphabetMap;
+
+ public WordMLProducer(Appendable strB) {
+ this.strB = strB;
+ this.outlineNumber = new int[10]; // word supports 9 levels of outlining; index this array from 1 to 9
+ this.outlineLevel = 0;
+ this.flattenedLevelCount = 0;
+
+ this.alphabetMap = new HashMap<String, Integer>();
+
+ alphabetMap.put("A.0", 1);
+ alphabetMap.put("B.0", 2);
+ alphabetMap.put("C.0", 3);
+ }
+
+ public CharSequence startOutlineSubSection(CharSequence font, CharSequence headingText, String outlineType) throws OseeWrappedException {
+ if (okToStartSubsection()) {
+ outlineNumber[++outlineLevel]++;
+ CharSequence paragraphNumber = getOutlineNumber();
+ startOutlineSubSection((outlineType != null ? outlineType : "Heading") + outlineLevel, paragraphNumber, font,
+ headingText);
+
+ return paragraphNumber;
+ } else {
+ flattenedLevelCount++;
+ endOutlineSubSection(true);
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Outline level flattened, outline can only go 9 levels deep");
+ if (false) {
+ startParagraph();
+ addTextInsideParagraph("OUTLINE LEVEL FLATTENED: " + headingText, RGB_RED);
+ endParagraph();
+ }
+ return startOutlineSubSection(font, headingText, outlineType);
+ }
+ };
+
+ private void append(CharSequence value) throws OseeWrappedException {
+ try {
+ strB.append(value);
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ public void startOutlineSubSection(CharSequence style, CharSequence outlineNumber, CharSequence font, CharSequence headingText) throws OseeWrappedException {
+ append("<wx:sub-section>");
+ append("<w:p><w:pPr><w:pStyle w:val=\"");
+ append(style);
+ append("\"/><w:listPr><wx:t wx:val=\"");
+ append(outlineNumber);
+ append("\" wx:wTabBefore=\"540\" wx:wTabAfter=\"90\"/><wx:font wx:val=\"");
+ append(font);
+ append("\"/></w:listPr></w:pPr><w:r><w:t>");
+ append(Xml.escape(headingText));
+ append("</w:t></w:r></w:p>");
+ }
+
+ public String setHeadingNumbers(String outlineNumber, String template, String outlineType) {
+ boolean appendixOutlineType = outlineType != null && outlineType.equalsIgnoreCase("APPENDIX");
+ if (outlineNumber == null) {
+ return template;
+ }
+
+ if (appendixOutlineType) {
+ // Example of appendix number: A.0
+ char[] chars = outlineNumber.toCharArray();
+ template = setAppendixStartLetter(chars[0], template);
+ } else {
+ int index = 1;
+ String[] numbers = outlineNumber.split("\\.");
+
+ for (String number : numbers) {
+ Matcher matcher =
+ Pattern.compile(String.format("<w:start w:val=\"(\\d*?)\"/><w:pStyle w:val=\"Heading%d\"/>", index)).matcher(
+ "");
+ matcher.reset(template);
+ template =
+ matcher.replaceAll(String.format("<w:start w:val=\"%s\"/><w:pStyle w:val=\"Heading%d\"/>", number,
+ index));
+ index++;
+ }
+ }
+ if (!appendixOutlineType) {
+ setNextParagraphNumberTo(outlineNumber);
+ }
+ return template;
+ }
+
+ public String setAppendixStartLetter(char chr, String template) {
+ template =
+ template.replace(
+ "<w:start w:val=\"1\"/><w:nfc w:val=\"3\"/><w:pStyle w:val=\"APPENDIX1\"/>",
+ "<w:start w:val=\"" + (Character.toLowerCase(chr) - 'a' + 1) + "\"/><w:nfc w:val=\"3\"/><w:pStyle w:val=\"APPENDIX1\"/>");
+ return template;
+ }
+
+ public void endOutlineSubSection() throws OseeWrappedException {
+ endOutlineSubSection(false);
+ }
+
+ private void endOutlineSubSection(boolean force) throws OseeWrappedException {
+ if (!force && flattenedLevelCount > 0) {
+ flattenedLevelCount--;
+ } else {
+ append("</wx:sub-section>");
+ if (outlineLevel + 1 < outlineNumber.length) outlineNumber[outlineLevel + 1] = 0;
+ outlineLevel--;
+ }
+ }
+
+ public void addWordMl(CharSequence wordMl) throws OseeWrappedException {
+ append(wordMl);
+ }
+
+ public void startParagraph() throws OseeWrappedException {
+ append("<w:p>");
+ }
+
+ public void createSubDoc(String fileName) throws OseeWrappedException {
+ if (fileName == null || fileName.length() == 0) {
+ throw new IllegalArgumentException("The file name can not be null or empty.");
+ }
+
+ append(SUB_DOC.replace(FILE_NAME, fileName));
+ }
+
+ public void createHyperLinkDoc(String fileName) throws OseeWrappedException {
+ if (fileName == null || fileName.length() == 0) {
+ throw new IllegalArgumentException("The file name can not be null or empty.");
+ }
+
+ append(HYPER_LINK_DOC.replace(FILE_NAME, fileName));
+ }
+
+ public void resetListValue() throws OseeWrappedException {
+ // extra paragraph needed to support WORD's bug to add in a trailing zero when using field codes
+ startParagraph();
+ endParagraph();
+ startParagraph();
+ //The listnum also acts a template delimiter to know when to remove unwanted content.
+ addWordMl(LISTNUM_FIELD);
+ endParagraph();
+ }
+
+ public void endParagraph() throws OseeWrappedException {
+ append("</w:p>");
+ }
+
+ public void addParagraph(CharSequence text) throws OseeWrappedException {
+ append("<w:p><w:r><w:t>");
+ append(Xml.escape(text));
+ append("</w:t></w:r></w:p>");
+ }
+
+ public void addParagraphBold(CharSequence text) throws OseeWrappedException {
+ append("<w:p><w:r><w:rPr><w:b/></w:rPr><w:t>");
+ append(Xml.escape(text));
+ append("</w:t><w:rPr><w:b/></w:rPr></w:r></w:p>");
+ }
+
+ public void addTextInsideParagraph(CharSequence text) throws OseeWrappedException {
+ append("<w:r><w:t>");
+ append(Xml.escape(text));
+ append("</w:t></w:r>");
+ }
+
+ public void addTextInsideParagraph(CharSequence text, String rgbHexColor) throws OseeWrappedException {
+ if (rgbHexColor == null) throw new IllegalArgumentException("rgbHexColor can not be null");
+ if (rgbHexColor.length() != 6) throw new IllegalArgumentException(
+ "rgbHexColor should be a hex string 6 characters long");
+
+ append("<w:r><w:rPr><w:color w:val=\"");
+ append(rgbHexColor);
+ append("\"/></w:rPr>");
+ append("<w:t>");
+ append(Xml.escape(text));
+ append("</w:t></w:r>");
+ }
+
+ public void addOleData(CharSequence oleData) throws OseeWrappedException {
+ append("<w:docOleData>");
+ append(oleData);
+ append("</w:docOleData>");
+ }
+
+ private CharSequence getOutlineNumber() throws OseeWrappedException {
+ StringBuilder strB = new StringBuilder();
+ for (int i = 1; i < outlineLevel; i++) {
+ strB.append(String.valueOf(outlineNumber[i]));
+ strB.append(".");
+ }
+ strB.append(String.valueOf(outlineNumber[outlineLevel]));
+ return strB;
+ }
+
+ public boolean okToStartSubsection() {
+ return outlineLevel < 9;
+ }
+
+ /**
+ * @param nextOutlineNumber
+ */
+ public void setNextParagraphNumberTo(String nextOutlineNumber) {
+ String[] nextOutlineNumbers = nextOutlineNumber.split("\\.");
+ Arrays.fill(outlineNumber, 0);
+
+ for (int i = 0; i < nextOutlineNumbers.length; i++) {
+
+ outlineNumber[i + 1] = Integer.parseInt(nextOutlineNumbers[i]);
+ }
+ outlineNumber[nextOutlineNumbers.length]--;
+ outlineLevel = nextOutlineNumbers.length - 1;
+ }
+
+ /**
+ * Sets the page layout to either portrait/landscape depending on the artifacts pageType attribute value. Note: This
+ * call should be done after processing each artifact so if a previous artifact was landscaped the following artifact
+ * would be set back to portrait.
+ *
+ * @throws OseeCoreException
+ */
+ public void setPageLayout(Artifact artifact) throws OseeCoreException {
+ String pageTypeValue = null;
+ if (artifact.isAttributeTypeValid("Page Type")) {
+ pageTypeValue = artifact.getSoleAttributeValue("Page Type", "Portrait");
+ }
+
+ boolean landscape = (pageTypeValue != null && pageTypeValue.equals("Landscape"));
+
+ if (landscape || previousPageLandsacpe) {
+ append("<w:p>");
+ append("<w:pPr>");
+ append("<w:sectPr>");
+ append(landscape ? "<w:pgSz w:w=\"15840\" w:h=\"12240\" w:orient=\"landscape\" w:code=\"1\" />" : "<w:pgSz w:w=\"12240\" w:h=\"15840\" w:code=\"1\" />");
+ append("</w:sectPr>");
+ append("</w:pPr>");
+ append("</w:p>");
+
+ previousPageLandsacpe = landscape;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordTemplateProcessor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordTemplateProcessor.java
new file mode 100644
index 00000000000..bc75ee62d4e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/WordTemplateProcessor.java
@@ -0,0 +1,566 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render.word;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.CharacterCodingException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.CoreException;
+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.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.WordArtifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.linking.LinkType;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.FileSystemRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.IRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.ITemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.WordTemplateRenderer;
+import org.eclipse.osee.framework.ui.skynet.util.WordUiUtil;
+
+/**
+ * @author Robert A. Fisher
+ * @author Jeff C. Phillips
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class WordTemplateProcessor {
+ private static final String ARTIFACT = "Artifact";
+ private static final String EXTENSION_PROCESSOR = "Extension_Processor";
+ private static final String KEY = "Key";
+
+ private static final Pattern namePattern =
+ Pattern.compile("<((\\w+:)?(Name))>(.*?)</\\1>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern outlineTypePattern =
+ Pattern.compile("<((\\w+:)?(OutlineType))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern outlineNumberPattern =
+ Pattern.compile("<((\\w+:)?(Number))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern argumentElementsPattern =
+ Pattern.compile("<((\\w+:)?(Argument))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern keyValueElementsPattern =
+ Pattern.compile("<((\\w+:)?(Key|Value))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern subDocElementsPattern =
+ Pattern.compile("<((\\w+:)?(SubDoc))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+
+ private static final Pattern setNamePattern =
+ Pattern.compile("<(\\w+:)?Set_Name>(.*?)</(\\w+:)?Set_Name>", Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern headElementsPattern =
+ Pattern.compile("<((\\w+:)?(" + ARTIFACT + "|" + EXTENSION_PROCESSOR + "))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern attributeElementsPattern =
+ Pattern.compile("<((\\w+:)?(Attribute))>(.*?)</\\3>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+
+ private static final Pattern outlineElementsPattern =
+ Pattern.compile("<((\\w+:)?(Outline))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern internalOutlineElementsPattern =
+ Pattern.compile("<((\\w+:)?(HeadingAttribute|RecurseChildren|Number))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+
+ private static final String[] NUMBER =
+ new String[] {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
+
+ private String slaveTemplate;
+ private boolean outlining;
+ private boolean recurseChildren;
+ private String outlineNumber;
+ private String headingAttributeName;
+ private List<AttributeElement> attributeElements = new LinkedList<AttributeElement>();
+ final List<Artifact> nonTemplateArtifacts = new LinkedList<Artifact>();
+ private Set<String> ignoreAttributeExtensions = new HashSet<String>();
+ private Set<Artifact> processedArtifacts = new HashSet<Artifact>();
+ private IRenderer renderer;
+
+ public WordTemplateProcessor(IRenderer renderer) {
+ this.renderer = renderer;
+ loadIgnoreAttributeExtensions();
+ }
+
+ /**
+ * Parse through template to find xml defining artifact sets and replace it with the result of publishing those
+ * artifacts Only used by Publish SRS
+ *
+ * @throws IOException
+ */
+ public void publishWithExtensionTemplates(VariableMap variableMap, Artifact masterTemplateArtifact, Artifact slaveTemplateArtifact, List<Artifact> artifacts) throws OseeCoreException {
+ String masterTemplate = masterTemplateArtifact.getSoleAttributeValue(WordAttribute.WHOLE_WORD_CONTENT, "");
+ slaveTemplate =
+ slaveTemplateArtifact != null ? slaveTemplateArtifact.getSoleAttributeValue(
+ WordAttribute.WHOLE_WORD_CONTENT, "") : "";
+
+ IFolder folder = FileSystemRenderer.ensureRenderFolderExists(PresentationType.PREVIEW);
+ String fileName = String.format("%s_%s.xml", masterTemplateArtifact.getSafeName(), Lib.getDateTimeString());
+ AIFile.writeToFile(folder.getFile(fileName), applyTemplate(variableMap, artifacts, masterTemplate, folder, null,
+ null, PresentationType.PREVIEW));
+ }
+
+ /**
+ * Parse through template to find xml defining artifact sets and replace it with the result of publishing those
+ * artifacts. Only used by Publish SRS
+ *
+ * @param variableMap = will be filled with artifacts when specified in the template
+ * @param artifacts = null if the template defines the artifacts to be used in the publishing
+ * @param template
+ * @param folder = null when not using an extension template
+ * @param outlineNumber if null will find based on first artifact
+ * @param outlineType
+ * @return InputStream
+ * @throws OseeCoreException
+ */
+ public InputStream applyTemplate(VariableMap variableMap, List<Artifact> artifacts, String template, IFolder folder, String outlineNumber, String outlineType, PresentationType presentationType) throws OseeCoreException {
+ WordMLProducer wordMl;
+ CharBackedInputStream charBak;
+ try {
+ charBak = new CharBackedInputStream();
+ wordMl = new WordMLProducer(charBak);
+ } catch (CharacterCodingException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ // previousTemplateCopyIndex = 0;
+
+ if (outlineNumber == null) {
+ outlineNumber = peekAtFirstArtifactToGetParagraphNumber(template, null, artifacts);
+ this.outlineNumber = outlineNumber;
+ }
+
+ template = wordMl.setHeadingNumbers(outlineNumber, template, outlineType);
+
+ template = WordUtil.stripSpellCheck(template);
+
+ Matcher matcher = headElementsPattern.matcher(template);
+
+ int lastEndIndex = 0;
+ while (matcher.find()) {
+ // Write the part of the template between the elements
+ wordMl.addWordMl(template.substring(lastEndIndex, matcher.start()));
+
+ lastEndIndex = matcher.end();
+ String elementType = matcher.group(3);
+ String elementValue = matcher.group(4);
+
+ if (elementType.equals(ARTIFACT)) {
+ extractOutliningOptions(elementValue);
+ if (artifacts == null) { //This handles the case where artifacts selected in the template
+ Matcher setNameMatcher = setNamePattern.matcher(elementValue);
+ setNameMatcher.find();
+ artifacts = variableMap.getArtifacts(WordUtil.textOnly(setNameMatcher.group(2)));
+ }
+ if (presentationType == PresentationType.SPECIALIZED_EDIT && artifacts.size() == 1) {
+ // for single edit override outlining options
+ outlining = false;
+ }
+ processArtifactSet(variableMap, elementValue, artifacts, wordMl, outlineType, presentationType);
+ } else if (elementType.equals(EXTENSION_PROCESSOR)) {
+ try {
+ processExtensionTemplate(elementValue, variableMap, folder, wordMl, presentationType, template);
+ } catch (CoreException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ } else {
+ throw new OseeArgumentException("Invalid input: " + elementType);
+ }
+ }
+ // Write out the last of the template
+ wordMl.addWordMl(template.substring(lastEndIndex));
+ displayNonTemplateArtifacts(nonTemplateArtifacts);
+ return charBak;
+ }
+
+ protected String peekAtFirstArtifactToGetParagraphNumber(String template, String nextParagraphNumber, List<Artifact> artifacts) throws OseeCoreException {
+ String startParagraphNumber = "1";
+ if (artifacts != null) {
+ Matcher matcher = headElementsPattern.matcher(template);
+
+ if (matcher.find()) {
+ String elementType = matcher.group(3);
+
+ if (elementType.equals(ARTIFACT)) {
+ if (!artifacts.isEmpty()) {
+ Artifact artifact = artifacts.iterator().next();
+ if (artifact.isAttributeTypeValid("Imported Paragraph Number")) {
+ String paragraphNum = artifact.getSoleAttributeValue("Imported Paragraph Number", "");
+ if (paragraphNum != null && !paragraphNum.equals("")) {
+ startParagraphNumber = paragraphNum;
+ }
+ }
+ }
+ }
+ }
+ }
+ return startParagraphNumber;
+ }
+
+ private void processArtifactSet(VariableMap variableMap, final String artifactElement, final List<Artifact> artifacts, final WordMLProducer wordMl, final String outlineType, PresentationType presentationType) throws OseeCoreException {
+ nonTemplateArtifacts.clear();
+ if (outlineNumber != null) {
+ wordMl.setNextParagraphNumberTo(outlineNumber);
+ }
+
+ extractSkynetAttributeReferences(getArtifactSetXml(artifactElement));
+
+ for (Artifact artifact : artifacts) {
+ processObjectArtifact(variableMap, artifact, wordMl, outlineType, presentationType, artifacts.size() > 1);
+ }
+ //maintain a list of artifacts that have been processed so we do not have duplicates.
+ processedArtifacts.clear();
+ }
+
+ /**
+ * @throws CoreException
+ */
+ private void processExtensionTemplate(String elementValue, VariableMap variableMap, IFolder folder, WordMLProducer wordMl, PresentationType presentationType, String template) throws OseeCoreException, CoreException {
+ String subdocumentName = null;
+ boolean doSubDocuments = false;
+ String nextParagraphNumber = null;
+ String outlineType = null;
+
+ Matcher matcher = outlineNumberPattern.matcher(elementValue);
+ if (matcher.find()) {
+ nextParagraphNumber = WordUtil.textOnly(matcher.group(4));
+ }
+
+ matcher = outlineTypePattern.matcher(elementValue);
+ if (matcher.find()) {
+ outlineType = WordUtil.textOnly(matcher.group(4));
+ }
+
+ matcher = subDocElementsPattern.matcher(elementValue);
+
+ if (matcher.find()) {
+ subdocumentName = WordUtil.textOnly(matcher.group(4));
+ doSubDocuments = true;
+ }
+
+ matcher = argumentElementsPattern.matcher(elementValue);
+
+ VariableMap newVariableMap = doSubDocuments ? new VariableMap() : null;
+
+ while (matcher.find()) {
+ matcher = keyValueElementsPattern.matcher(matcher.group(4));
+
+ String key = null;
+ while (matcher.find()) {
+ String type = WordUtil.textOnly(matcher.group(3));
+
+ if (type.equalsIgnoreCase(KEY)) {
+ key = WordUtil.textOnly(matcher.group(4));
+ } else {
+ String value = WordUtil.textOnly(matcher.group(4));
+
+ if (doSubDocuments) {
+ newVariableMap.setValue(key, value);
+ } else {
+ variableMap.setValue(key, value);
+ }
+ }
+ }
+ }
+
+ if (doSubDocuments) {
+ newVariableMap.setValue("Branch", variableMap.getBranch("Branch"));
+ String subDocFileName = subdocumentName + ".xml";
+ populateVariableMap(newVariableMap);
+ AIFile.writeToFile(folder.getFile(subDocFileName), applyTemplate(newVariableMap, null, slaveTemplate, folder,
+ nextParagraphNumber, outlineType, presentationType));
+
+ wordMl.createHyperLinkDoc(subDocFileName);
+ // wordMl.createSubDoc(subDocFileName);
+ } else {
+ populateVariableMap(variableMap);
+ }
+ }
+
+ public void populateVariableMap(VariableMap variableMap) throws OseeCoreException {
+ if (variableMap == null) throw new IllegalArgumentException("variableMap must not be null");
+
+ String name = variableMap.getString("Name");
+ Branch branch = variableMap.getBranch("Branch");
+
+ List<Artifact> artifacts = ArtifactQuery.getArtifactsFromName(name, branch, false);
+
+ variableMap.setValue("srsProducer.objects", artifacts);
+ }
+
+ private void extractOutliningOptions(String artifactElement) {
+ Matcher matcher = outlineElementsPattern.matcher(artifactElement);
+
+ if (matcher.find()) {
+ matcher = internalOutlineElementsPattern.matcher(matcher.group(4));
+ outlining = true;
+
+ // Default values for optional/unspecified parameters
+ recurseChildren = false;
+
+ while (matcher.find()) {
+ String elementType = matcher.group(3);
+ String value = WordUtil.textOnly(matcher.group(4));
+
+ if (elementType.equals("HeadingAttribute")) {
+ headingAttributeName = value;
+ } else if (elementType.equals("RecurseChildren")) {
+ recurseChildren = Boolean.parseBoolean(value);
+ } else if (elementType.equals("Number")) {
+ outlineNumber = value;
+ }
+ }
+ } else {
+ outlining = false;
+ recurseChildren = false;
+ headingAttributeName = null;
+ }
+ }
+
+ private void processObjectArtifact(VariableMap variableMap, Artifact artifact, WordMLProducer wordMl, String outlineType, PresentationType presentationType, boolean multipleArtifacts) throws OseeCoreException {
+ if (!artifact.isOfType(WordArtifact.WHOLE_WORD) && !artifact.isOfType("Native")) {
+ //If the artifact has not been processed
+ if (!processedArtifacts.contains(artifact)) {
+ if (outlining) {
+ String headingText = artifact.getSoleAttributeValue(headingAttributeName, "");
+ CharSequence paragraphNumber =
+ wordMl.startOutlineSubSection("Times New Roman", headingText, outlineType);
+
+ VariableMap options = renderer.getOptions();
+ if (renderer.getBooleanOption(WordTemplateRenderer.UPDATE_PARAGRAPH_NUMBER_OPTION)) {
+ if (artifact.isAttributeTypeValid("Imported Paragraph Number")) {
+ artifact.setSoleAttributeValue("Imported Paragraph Number", paragraphNumber.toString());
+ artifact.persistAttributes((SkynetTransaction) options.getValue(ITemplateRenderer.TRANSACTION_OPTION));
+ }
+ }
+ }
+ processAttributes(variableMap, artifact, wordMl, presentationType, multipleArtifacts);
+ if (recurseChildren) {
+ for (Artifact childArtifact : artifact.getChildren()) {
+ processObjectArtifact(variableMap, childArtifact, wordMl, outlineType, presentationType,
+ multipleArtifacts);
+ }
+ }
+ if (outlining) {
+ wordMl.endOutlineSubSection();
+ }
+ processedArtifacts.add(artifact);
+ }
+ } else {
+ nonTemplateArtifacts.add(artifact);
+ }
+ }
+
+ private void processAttributes(VariableMap variableMap, Artifact artifact, WordMLProducer wordMl, PresentationType presentationType, boolean multipleArtifacts) throws OseeCoreException {
+ for (AttributeElement attributeElement : attributeElements) {
+ String attributeName = attributeElement.getAttributeName();
+
+ if (attributeElement.getAttributeName().equals("*")) {
+ for (String attributeTypeName : orderAttributeNames(artifact.getAttributeTypes())) {
+ if (!outlining || !attributeTypeName.equals(headingAttributeName)) {
+ processAttribute(variableMap, artifact, wordMl, attributeElement, attributeTypeName, true,
+ presentationType, multipleArtifacts);
+ }
+ }
+ } else {
+ if (artifact.isAttributeTypeValid(attributeName)) {
+ processAttribute(variableMap, artifact, wordMl, attributeElement, attributeName, false,
+ presentationType, multipleArtifacts);
+ }
+ }
+ }
+
+ wordMl.setPageLayout(artifact);
+ }
+
+ private void processAttribute(VariableMap variableMap, Artifact artifact, WordMLProducer wordMl, AttributeElement attributeElement, String attributeTypeName, boolean allAttrs, PresentationType presentationType, boolean multipleArtifacts) throws OseeCoreException {
+ // This is for SRS Publishing. Do not publish unspecified attributes
+ if (!allAttrs && (attributeTypeName.equals(Requirements.PARTITION) || attributeTypeName.equals("Safety Criticality"))) {
+ if (artifact.isAttributeTypeValid(Requirements.PARTITION)) {
+ for (Attribute<?> partition : artifact.getAttributes(Requirements.PARTITION)) {
+ if (partition == null || partition.getValue() == null || partition.getValue().equals("Unspecified")) {
+ return;
+ }
+ }
+ }
+ }
+
+ if (attributeTypeName.equals("TIS Traceability")) {
+ for (Artifact requirement : artifact.getRelatedArtifacts(CoreRelationEnumeration.Verification__Requirement)) {
+ wordMl.addParagraph(requirement.getSoleAttributeValue("Imported Paragraph Number") + "\t" + requirement.getDescriptiveName());
+ }
+ return;
+ }
+
+ attributeTypeName = AttributeTypeManager.getType(attributeTypeName).getName();
+
+ //create wordTemplateContent for new guys
+ if (attributeTypeName.equals(WordAttribute.WORD_TEMPLATE_CONTENT)) {
+ Attribute<?> attribute = artifact.getSoleAttribute(attributeTypeName);
+ if (attribute == null) {
+ artifact.createAttribute(AttributeTypeManager.getType(attributeTypeName), true);
+ }
+ }
+
+ Collection<Attribute<Object>> attributes = artifact.getAttributes(attributeTypeName);
+
+ if (!attributes.isEmpty()) {
+ Attribute<Object> attribute = attributes.iterator().next();
+ AttributeType attributeType = attribute.getAttributeType();
+
+ // check if the attribute descriptor name is in the ignore list.
+ if (ignoreAttributeExtensions.contains(attributeType.getName())) {
+ return;
+ }
+
+ variableMap = ensureMapIsSetForDocLinks(variableMap, allAttrs);
+ RendererManager.renderAttribute(attributeTypeName, presentationType, artifact, variableMap, wordMl,
+ attributeElement);
+ }
+ }
+
+ private VariableMap ensureMapIsSetForDocLinks(VariableMap variableMap, boolean allAttrs) throws OseeArgumentException {
+ //Do not try to use a null map
+ if (variableMap == null) {
+ variableMap = new VariableMap();
+ }
+ //If someone else set the link leave it set else set it to OSEE server link
+ if (variableMap.getValue("linkType") == null) {
+ variableMap.setValue("linkType", LinkType.OSEE_SERVER_LINK);
+ }
+ //set all attrs
+ variableMap.setValue("allAttrs", allAttrs);
+
+ return variableMap;
+ }
+
+ public static String elementNameFor(String artifactName) {
+ // Since artifact names are free text it is important to reformat the name
+ // to ensure it is suitable as an element name
+ // NOTE: The current program.launch has a tokenizing bug that causes an error if consecutive
+ // spaces are in the name
+ String elementName = artifactName.trim().replaceAll("[^A-Za-z0-9]", "_");
+
+ // Ensure the name did not end up empty
+ if (elementName.equals("")) elementName = "nameless";
+
+ // Fix the first character if it is a number by replacing it with its name
+ char firstChar = elementName.charAt(0);
+ if (firstChar >= '0' && firstChar <= '9') {
+ elementName = NUMBER[firstChar - '0'] + elementName.substring(1);
+ }
+
+ return elementName;
+ }
+
+ public static void writeXMLMetaDataWrapper(WordMLProducer wordMl, String name, String guid, String attributeId, String contentString) throws OseeWrappedException {
+ wordMl.addWordMl("<ns0:" + name + " xmlns:ns0=\"" + WordTemplateRenderer.ARTIFACT_SCHEMA + "\" " + guid + " " + attributeId + ">");
+ wordMl.addWordMl(contentString);
+ wordMl.addWordMl("</ns0:" + name + "><w:p/>");
+ }
+
+ private String getArtifactSetXml(String artifactElement) {
+ artifactElement = artifactElement.replaceAll("<(\\w+:)?Artifact/?>", "");
+ artifactElement = artifactElement.replaceAll("<(\\w+:)?Set_Name>.*?</(\\w+:)?Set_Name>", "");
+
+ return artifactElement;
+ }
+
+ private void extractSkynetAttributeReferences(String artifactElementTemplate) {
+ attributeElements.clear();
+ Matcher matcher = attributeElementsPattern.matcher(artifactElementTemplate);
+
+ while (matcher.find()) {
+ attributeElements.add(new AttributeElement(matcher.group(4)));
+ }
+ }
+
+ private void loadIgnoreAttributeExtensions() {
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ if (extensionRegistry != null) {
+ IExtensionPoint point =
+ extensionRegistry.getExtensionPoint("org.eclipse.osee.framework.ui.skynet.IgnorePublishAttribute");
+ if (point != null) {
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ ignoreAttributeExtensions.add(element.getAttribute("name"));
+ }
+ }
+ }
+ }
+ }
+
+ private Collection<String> orderAttributeNames(Collection<AttributeType> attributeTypes) {
+ ArrayList<String> orderedNames = new ArrayList<String>(attributeTypes.size());
+ String contentName = null;
+
+ for (AttributeType attributeType : attributeTypes) {
+ if (attributeType.getName().equals(WordAttribute.WHOLE_WORD_CONTENT) || attributeType.getName().equals(
+ WordAttribute.WORD_TEMPLATE_CONTENT)) {
+ contentName = attributeType.getName();
+ } else {
+ orderedNames.add(attributeType.getName());
+ }
+ }
+ Arrays.sort(orderedNames.toArray(new String[0]));
+ if (contentName != null) {
+ orderedNames.add(contentName);
+ }
+ return orderedNames;
+ }
+
+ private void displayNonTemplateArtifacts(final Collection<Artifact> artifacts) {
+ if (!artifacts.isEmpty()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+
+ public void run() {
+ ArrayList<Artifact> nonTempArtifacts = new ArrayList<Artifact>(artifacts.size());
+ nonTempArtifacts.addAll(artifacts);
+ WordUiUtil.displayUnhandledArtifacts(artifacts);
+ }
+ });
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/AddTemplateText.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/AddTemplateText.java
new file mode 100644
index 00000000000..6e66538dbb6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/AddTemplateText.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.framework.ui.skynet.render.word.template;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class AddTemplateText implements ITemplateTask {
+
+ private String template;
+ private int begin;
+ private int end;
+
+ /**
+ * @param last
+ * @param start
+ * @param template
+ */
+ public AddTemplateText(int begin, int end, String template) {
+ this.template = template;
+ this.end = end;
+ this.begin = begin;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateTask#process(java.lang.StringBuilder, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.util.List)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, List<ITemplateAttributeHandler> handlers) throws OseeWrappedException {
+ wordMl.addWordMl(template.subSequence(begin, end));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateTask#isTypeNameWildcard()
+ */
+ @Override
+ public boolean isTypeNameWildcard() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ArtifactProcessing.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ArtifactProcessing.java
new file mode 100644
index 00000000000..30ce0d174c4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ArtifactProcessing.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render.word.template;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ArtifactProcessing implements ITemplateTask {
+
+ private List<ITemplateTask> innerTasks;
+ private boolean outlining;
+ private boolean recurseChildren;
+ private CoreRelationEnumeration outlineRelation;
+ private String headingAttributeName;
+ private String outlineNumber;
+ private String cleanedText;
+ private String artifactSetName;
+
+ private static final Matcher outlineElementsMatcher =
+ Pattern.compile("<((\\w+:)?(Outline))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher internalOutlineElementsMatcher =
+ Pattern.compile("<((\\w+:)?(HeadingAttribute|RecurseChildren|Number))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+
+ /**
+ * @param innerTasks
+ * @param artifactSection
+ * @param elementType
+ */
+ public ArtifactProcessing(List<ITemplateTask> innerTasks, String artifactSection, String elementType) {
+ this.innerTasks = innerTasks;
+ extractInformation(artifactSection, elementType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateTask#isTypeNameWildcard()
+ */
+ @Override
+ public boolean isTypeNameWildcard() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateTask#process(org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.util.List)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, List<ITemplateAttributeHandler> handlers) {
+
+ }
+ private static final Matcher setNameMatcher =
+ Pattern.compile("<(\\w+:)?Set_Name>(.*?)</(\\w+:)?Set_Name>", Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+
+ public List<ITemplateTask> getTasks() {
+ return innerTasks;
+ }
+
+ private void extractInformation(String artifactElement, String type) {
+ if (type.equals("Artifact")) {
+ setNameMatcher.reset(artifactElement);
+ setNameMatcher.find();
+ artifactSetName = WordUtil.textOnly(setNameMatcher.group(2));
+ artifactElement = setNameMatcher.replaceAll("");
+ }
+ outlineElementsMatcher.reset(artifactElement);
+
+ if (outlineElementsMatcher.find()) {
+ internalOutlineElementsMatcher.reset(outlineElementsMatcher.group(4));
+ outlining = true;
+ recurseChildren = false;
+ outlineRelation = CoreRelationEnumeration.DEFAULT_HIERARCHICAL__CHILD;
+
+ while (internalOutlineElementsMatcher.find()) {
+ String elementType = internalOutlineElementsMatcher.group(3);
+ String value = WordUtil.textOnly(internalOutlineElementsMatcher.group(4));
+
+ if (elementType.equals("HeadingAttribute")) {
+ headingAttributeName = value;
+ } else if (elementType.equals("RecurseChildren")) {
+ recurseChildren = Boolean.parseBoolean(value);
+ } else if (elementType.equals("Number")) {
+ outlineNumber = value;
+ }
+ }
+ } else {
+ outlining = false;
+ recurseChildren = false;
+ outlineRelation = null;
+ headingAttributeName = null;
+ }
+ cleanedText = outlineElementsMatcher.replaceAll("");
+ }
+
+ /**
+ * @return the innerTasks
+ */
+ public List<ITemplateTask> getInnerTasks() {
+ return innerTasks;
+ }
+
+ /**
+ * @return the outlining
+ */
+ public boolean isOutlining() {
+ return outlining;
+ }
+
+ /**
+ * @return the recurseChildren
+ */
+ public boolean isRecurseChildren() {
+ return recurseChildren;
+ }
+
+ /**
+ * @return the outlineRelation
+ */
+ public CoreRelationEnumeration getOutlineRelation() {
+ return outlineRelation;
+ }
+
+ /**
+ * @return the headingAttributeName
+ */
+ public String getHeadingAttributeName() {
+ return headingAttributeName;
+ }
+
+ /**
+ * @return the outlineNumber
+ */
+ public String getOutlineNumber() {
+ return outlineNumber;
+ }
+
+ public String getText() {
+ return this.cleanedText;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/BasicTemplateAttributeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/BasicTemplateAttributeHandler.java
new file mode 100644
index 00000000000..18f6ca19860
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/BasicTemplateAttributeHandler.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.framework.ui.skynet.render.word.template;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public final class BasicTemplateAttributeHandler implements ITemplateAttributeHandler {
+
+ private final Set<String> ignoreAttributeExtensions;
+
+ public BasicTemplateAttributeHandler() {
+ this.ignoreAttributeExtensions = new HashSet<String>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler#process(org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, TemplateAttribute templateAttribute) throws OseeCoreException {
+ AttributeType attributeType = AttributeTypeManager.getType(templateAttribute.getName());
+ Collection<Attribute<Object>> attributes = artifact.getAttributes(attributeType.getName());
+ if (!attributes.isEmpty()) {
+ Attribute<Object> attribute = attributes.iterator().next();
+ attributeType = attribute.getAttributeType();
+
+ // check if the attribute descriptor name is in the ignore list.
+ if (ignoreAttributeExtensions.contains(attributeType.getName())) {
+ return;
+ }
+
+ if (templateAttribute.isParagrapthWrap()) {
+ wordMl.startParagraph();
+ }
+ // assumption: the label is of the form <w:r><w:t> text </w:t></w:r>
+ // if (allAttrs) {
+ if (templateAttribute.hasLabel()) {
+ wordMl.addWordMl("<w:r><w:t> " + templateAttribute.getName() + ": </w:t></w:r>");
+ }
+ // } else {
+ // if (templateAttribute.hasLabel()) {
+ // wordMl.addParagraph(templateAttribute.getLabel());
+ // }
+ //
+ String valueList;
+ if (attributeType.getName().equals(WordAttribute.WORD_TEMPLATE_CONTENT)) {
+ wordMl.addWordMl((String) attribute.getValue());
+ } else {
+ valueList = Collections.toString(", ", artifact.getAttributes(templateAttribute.getName()));
+ if (templateAttribute.hasFormatting()) {
+ if (templateAttribute.getFormat().contains(">x<")) {
+ wordMl.addWordMl(templateAttribute.getFormat().replace(">x<", ">" + valueList + "<"));
+ }
+ } else {
+ wordMl.addTextInsideParagraph(valueList);
+ }
+ }
+ if (templateAttribute.isParagrapthWrap()) {
+ wordMl.endParagraph();
+ }
+
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeNameHandler#canHandle(org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public boolean canHandle(Artifact artifact, TemplateAttribute attribute) throws OseeCoreException {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateAttributeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateAttributeHandler.java
new file mode 100644
index 00000000000..3fd3d0090ec
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateAttributeHandler.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.framework.ui.skynet.render.word.template;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITemplateAttributeHandler {
+
+ void process(WordMLProducer wordMl, Artifact artifact, TemplateAttribute attribute) throws OseeCoreException;
+
+ boolean canHandle(Artifact artifact, TemplateAttribute attribute) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateTask.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateTask.java
new file mode 100644
index 00000000000..9bf95f2b502
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/ITemplateTask.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.framework.ui.skynet.render.word.template;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITemplateTask {
+
+ void process(WordMLProducer wordMl, Artifact artifact, List<ITemplateAttributeHandler> handlers) throws OseeCoreException;
+
+ boolean isTypeNameWildcard();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/SRSSpecialPublishingAttributeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/SRSSpecialPublishingAttributeHandler.java
new file mode 100644
index 00000000000..2f3c0acca22
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/SRSSpecialPublishingAttributeHandler.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.framework.ui.skynet.render.word.template;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SRSSpecialPublishingAttributeHandler implements ITemplateAttributeHandler {
+
+ public SRSSpecialPublishingAttributeHandler() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler#process(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, TemplateAttribute attribute) {
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler#canHandle(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public boolean canHandle(Artifact artifact, TemplateAttribute attribute) throws OseeCoreException {
+ // This is for SRS Publishing. Do not publish unspecified attributes
+ if ((attribute.getName().equals(Requirements.PARTITION) || attribute.getName().equals("Safety Criticality"))) {
+ for (Attribute<?> partition : artifact.getAttributes(Requirements.PARTITION)) {
+ if (partition.getValue().equals("Unspecified")) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TISAttributeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TISAttributeHandler.java
new file mode 100644
index 00000000000..934860aabb4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TISAttributeHandler.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.framework.ui.skynet.render.word.template;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TISAttributeHandler implements ITemplateAttributeHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler#process(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, TemplateAttribute attribute) throws OseeCoreException {
+ for (Artifact requirement : artifact.getRelatedArtifacts(CoreRelationEnumeration.Verification__Requirement)) {
+ wordMl.addParagraphBold(requirement.getSoleAttributeValue("Imported Paragraph Number", "") + "\t" + requirement.getDescriptiveName());
+ String str = requirement.getSoleAttributeValue(WordAttribute.WORD_TEMPLATE_CONTENT);
+ wordMl.addWordMl(str);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler#canHandle(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public boolean canHandle(Artifact artifact, TemplateAttribute attribute) throws OseeCoreException {
+ return attribute.getName().equals("TIS Traceability");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TemplateAttribute.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TemplateAttribute.java
new file mode 100644
index 00000000000..a0151b50f7b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/TemplateAttribute.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render.word.template;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TemplateAttribute implements ITemplateTask {
+
+ private static Matcher trimTags = Pattern.compile("(<.*?>)").matcher("");
+
+ private String name;
+ private String label;
+ private String editable;
+ private String format;
+ private String outline;
+ private boolean paragraphWrap = true;
+
+ public TemplateAttribute() {
+
+ }
+
+ public TemplateAttribute(TemplateAttribute copyMe, String name) {
+ this.editable = copyMe.editable;
+ this.format = copyMe.format;
+ this.label = copyMe.label;
+ this.outline = copyMe.outline;
+ this.name = name;
+ this.paragraphWrap = copyMe.paragraphWrap;
+ }
+
+ /**
+ * @param group
+ */
+ public void addName(String name) {
+ trimTags.reset(name);
+ this.name = trimTags.replaceAll("");
+ }
+
+ /**
+ * @param group
+ */
+ public void addLabel(String label) {
+ this.label = label;
+ }
+
+ /**
+ * @param group
+ */
+ public void addEditable(String editable) {
+ this.editable = editable;
+ }
+
+ /**
+ * @param group
+ */
+ public void addFormat(String format) {
+ this.format = format;
+ }
+
+ /**
+ * @param group
+ */
+ public void addNOutline(String outline) {
+ this.outline = outline;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateTask#process(java.lang.StringBuilder, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.util.List)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, List<ITemplateAttributeHandler> handlers) throws OseeCoreException {
+ for (ITemplateAttributeHandler handler : handlers) {
+ if (handler.canHandle(artifact, this)) {
+ handler.process(wordMl, artifact, this);
+ return;
+ }
+ }
+ // throw new Exception(String.format("There was not a valid handler for Artifact[%s] and TemplateAttribute[%s].",
+ // artifact.toString(), this.toString()));
+ System.out.println(String.format("There was not a valid handler for Artifact[%s] and TemplateAttribute[%s].",
+ artifact.toString(), this.toString()));
+ }
+
+ public String getLabel() {
+ return this.label;
+ }
+
+ public String getFormat() {
+ return this.format;
+ }
+
+ public boolean hasFormatting() {
+ return this.format != null && this.format.length() > 0;
+ }
+
+ public boolean hasLabel() {
+ return this.label != null && this.label.length() > 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateTask#isTypeNameWildcard()
+ */
+ @Override
+ public boolean isTypeNameWildcard() {
+ return getName().equals("*");
+ }
+
+ /**
+ * @param group
+ */
+ public void addParagraphWrap(String group) {
+ trimTags.reset(group);
+ String value = trimTags.replaceAll("");
+ this.paragraphWrap = Boolean.parseBoolean(value);
+ }
+
+ public boolean isParagrapthWrap() {
+ return this.paragraphWrap;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordAttributeTypeAttributeHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordAttributeTypeAttributeHandler.java
new file mode 100644
index 00000000000..30402988c04
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordAttributeTypeAttributeHandler.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.framework.ui.skynet.render.word.template;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Xml;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordTemplateProcessor;
+
+/**
+ * @author Finkbeiner M. Andrew
+ */
+public final class WordAttributeTypeAttributeHandler implements ITemplateAttributeHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeHandler#process(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public void process(WordMLProducer wordMl, Artifact artifact, TemplateAttribute templateAttribute) throws OseeCoreException {
+ Collection<Attribute<Object>> attributes = artifact.getAttributes(templateAttribute.getName());
+
+ if (!attributes.isEmpty()) {
+ Attribute<Object> attribute = attributes.iterator().next();
+ AttributeType attributeType = attribute.getAttributeType();
+
+ if (templateAttribute.hasLabel()) {
+ wordMl.addParagraph(templateAttribute.getLabel());
+ }
+
+ if (false) {
+ WordTemplateProcessor.writeXMLMetaDataWrapper(wordMl,
+ WordTemplateProcessor.elementNameFor(attributeType.getName()),
+ "ns0:guid=\"" + artifact.getGuid() + "\"", "ns0:attrId=\"" + attributeType.getAttrTypeId() + "\"",
+ attribute.toString());
+ } else {
+ wordMl.addWordMl(Xml.escape(attribute.toString()));
+ }
+ wordMl.resetListValue();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.render.word.template.ITemplateAttributeNameHandler#canHandle(org.eclipse.osee.framework.skynet.core.artifact.Artifact, org.eclipse.osee.framework.ui.skynet.render.word.template.TemplateAttribute)
+ */
+ @Override
+ public boolean canHandle(Artifact artifact, TemplateAttribute attribute) throws OseeCoreException {
+ boolean goodAttributeType = attribute.getName().equals(WordAttribute.WORD_TEMPLATE_CONTENT);
+ boolean goodArtifact = artifact.isAttributeTypeValid(WordAttribute.WORD_TEMPLATE_CONTENT);
+ return goodAttributeType && goodArtifact;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordTemplateManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordTemplateManager.java
new file mode 100644
index 00000000000..5ff23e3ae9d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/word/template/WordTemplateManager.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.render.word.template;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.word.WordUtil;
+import org.eclipse.osee.framework.ui.skynet.render.word.WordMLProducer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class WordTemplateManager {
+
+ // private static final Matcher setNameMatcher =
+ // Pattern.compile("<(\\w+:)?Set_Name>(.*?)</(\\w+:)?Set_Name>", Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ // private static final Matcher headElementsMatcher =
+ // Pattern.compile("<((\\w+:)(Artifact|Extension_Processor))>(.*?)</\\1>",
+ // Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ //
+ // private static final Matcher artifactMatcher = Pattern.compile(
+ // "<\\w+?:Artifact>(.*?)</\\w+?:Artifact>",
+ // Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE)
+ // .matcher("");
+ //
+ // private static final Matcher internalMatcher = Pattern.compile(
+ // "<\\w*?(Label|Outline|Name|Format|Editable)>(.*?)</\\1>",
+ // Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE)
+ // .matcher("");
+ // private static final Matcher attributeMatcher = Pattern.compile(
+ // "<((\\w+:)?(Attribute))>(.*?)</\\3>",
+ // Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE)
+ // .matcher("");
+
+ private static final Matcher nameMatcher =
+ Pattern.compile("<((\\w+:)?(Name))>(.*?)</\\1>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher(
+ "");
+ private static final Matcher outlineTypeMatcher =
+ Pattern.compile("<((\\w+:)?(OutlineType))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher outlineNumberMatcher =
+ Pattern.compile("<((\\w+:)?(Number))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher argumentElementsMatcher =
+ Pattern.compile("<((\\w+:)?(Argument))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher keyValueElementsMatcher =
+ Pattern.compile("<((\\w+:)?(Key|Value))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher subDocElementsMatcher =
+ Pattern.compile("<((\\w+:)?(SubDoc))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+
+ private static final Matcher setNameMatcher =
+ Pattern.compile("<(\\w+:)?Set_Name>(.*?)</(\\w+:)?Set_Name>", Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher headElementsMatcher =
+ Pattern.compile("<((\\w+:)?(Artifact|Extension_Processor))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher attributeElementsMatcher =
+ Pattern.compile("<((\\w+:)?(Attribute))>(.*?)</\\3>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+ private static final Matcher internalAttributeElementsMatcher =
+ Pattern.compile("<((\\w+:)?(Label|Outline|Name|Format|Editable|ParagraphWrap))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher("");
+
+ enum XmlAttributeType {
+ Label, Outline, Name, Format, Editable, ParagraphWrap
+ }
+
+ private String template;
+ private final String artifactSetName;
+ private List<ITemplateTask> tasks = new ArrayList<ITemplateTask>();
+ private final List<ITemplateAttributeHandler> attributeHandlers;
+
+ public WordTemplateManager(String template, List<ITemplateAttributeHandler> attributeHandlers) {
+ // this.template = sanatize(template);
+ this.template = template;
+ this.attributeHandlers = attributeHandlers;
+ this.artifactSetName = getArtifactSetName();
+ // preProcessTemplatePositions();
+
+ }
+
+ private String getArtifactSetName() {
+ String artifactSetName = "";
+ headElementsMatcher.reset(template);
+
+ if (headElementsMatcher.find()) {
+ String elementType = headElementsMatcher.group(3);
+ String elementValue = headElementsMatcher.group(4);
+
+ if (elementType.equals("Artifact")) {
+ setNameMatcher.reset(elementValue);
+ setNameMatcher.find();
+ artifactSetName = WordUtil.textOnly(setNameMatcher.group(2));
+ }
+ }
+ return artifactSetName;
+ }
+
+ private void preProcessTemplateInsideArtifactTag(String text, List<ITemplateTask> innerTasks) {
+ String newtext = text;//trimUnwantedText(text);
+ attributeElementsMatcher.reset(newtext);
+ int last = 0;
+ while (attributeElementsMatcher.find()) {
+ int start = attributeElementsMatcher.start();
+ innerTasks.add(new AddTemplateText(last, start, newtext));
+ int end = attributeElementsMatcher.end();
+ last = end;
+ TemplateAttribute processAttribute = new TemplateAttribute();
+ innerTasks.add(processAttribute);
+ String internal = attributeElementsMatcher.group(4);
+ internalAttributeElementsMatcher.reset(internal);
+ while (internalAttributeElementsMatcher.find()) {
+ String type = internalAttributeElementsMatcher.group(3);
+ switch (XmlAttributeType.valueOf(type)) {
+ case Label:
+ processAttribute.addLabel(internalAttributeElementsMatcher.group(4));
+ break;
+ case Editable:
+ processAttribute.addEditable(internalAttributeElementsMatcher.group(4));
+ break;
+ case Format:
+ processAttribute.addFormat(internalAttributeElementsMatcher.group(4));
+ break;
+ case Name:
+ processAttribute.addName(internalAttributeElementsMatcher.group(4));
+ break;
+ case Outline:
+ processAttribute.addNOutline(internalAttributeElementsMatcher.group(4));
+ break;
+ case ParagraphWrap:
+ processAttribute.addParagraphWrap(internalAttributeElementsMatcher.group(4));
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ innerTasks.add(new AddTemplateText(last, newtext.length(), newtext));
+ }
+
+ private String sanatize(String template) {
+ Matcher matcher = Pattern.compile("<w:proofErr w:type=\".*?\"/>").matcher("");
+ matcher.reset(template);
+ while (matcher.find()) {
+ System.out.println("sanatize " + matcher.group(0));
+ }
+ template = matcher.replaceAll("");
+ return template;
+ }
+
+ private void preProcessTemplatePositions() {
+ headElementsMatcher.reset(template);
+ int last = 0;
+ while (headElementsMatcher.find()) {
+ int start = headElementsMatcher.start();
+ tasks.add(new AddTemplateText(last, start, template));
+ int end = headElementsMatcher.end();
+ last = end;
+ List<ITemplateTask> innerTasks = new ArrayList<ITemplateTask>();
+ String artifactSection = headElementsMatcher.group(4);
+ String elementType = headElementsMatcher.group(3);
+
+ ArtifactProcessing artifactProcessing = new ArtifactProcessing(innerTasks, artifactSection, elementType);
+ tasks.add(artifactProcessing);
+ preProcessTemplateInsideArtifactTag(artifactProcessing.getText(), innerTasks);
+
+ }
+ tasks.add(new AddTemplateText(last, template.length(), template));
+ }
+
+ public String getArtifactSet() {
+ return this.artifactSetName;
+ }
+
+ /**
+ * @param artifacts
+ * @throws Exception
+ */
+ public void processArtifacts(WordMLProducer wordMl, List<Artifact> artifacts) throws OseeCoreException {
+ String outlineNumber = peekAtFirstArtifactToGetParagraphNumber(template, artifacts);
+ template = wordMl.setHeadingNumbers(outlineNumber, template, null);
+ preProcessTemplatePositions();
+
+ for (ITemplateTask task : tasks) {
+ if (task instanceof ArtifactProcessing) {
+ ArtifactProcessing artifactProcessingTask = (ArtifactProcessing) task;
+
+ if (artifactProcessingTask.isRecurseChildren()) {
+ artifacts = recurseArtifactChildren(artifacts);
+ }
+ List<ITemplateTask> artifactAttributeTasks = ((ArtifactProcessing) task).getTasks();
+ for (Artifact artifact : artifacts) {
+
+ boolean performedOutLining = false;
+
+ if (artifactProcessingTask.isOutlining()) {
+ performedOutLining = true;
+
+ String headingText =
+ artifact.getSoleAttributeValue(artifactProcessingTask.getHeadingAttributeName(), "");
+ CharSequence paragraphNumber = wordMl.startOutlineSubSection("Times New Roman", headingText, null);
+ }
+
+ List<ITemplateTask> actualTasks = preProcessTemplateTasks(artifactAttributeTasks, artifact);
+ for (ITemplateTask inner : actualTasks) {
+ inner.process(wordMl, artifact, attributeHandlers);
+ }
+
+ if (performedOutLining) wordMl.endOutlineSubSection();
+
+ wordMl.setPageLayout(artifact);
+ }
+ } else {
+ task.process(wordMl, null, attributeHandlers);
+ }
+ }
+ }
+
+ /**
+ * @param artifacts
+ * @return
+ * @throws OseeCoreException
+ */
+ private List<Artifact> recurseArtifactChildren(List<Artifact> artifacts) throws OseeCoreException {
+ List<Artifact> arts = new ArrayList<Artifact>();
+ for (Artifact art : artifacts) {
+ recursiveChildResolver(art, arts);
+ }
+ return arts;
+ }
+
+ private void recursiveChildResolver(Artifact artifact, List<Artifact> arts) throws OseeCoreException {
+ arts.add(artifact);
+ for (Artifact child : artifact.getChildren()) {
+ recursiveChildResolver(child, arts);
+ }
+ }
+
+ /**
+ * This method expands wildcard(*) attribute names into all of the attribute types of a particular artifact.
+ *
+ * @param tasks2
+ * @param artifact
+ * @return
+ * @throws OseeCoreException
+ */
+ private List<ITemplateTask> preProcessTemplateTasks(List<ITemplateTask> tasks, Artifact artifact) throws OseeCoreException {
+ List<ITemplateTask> newTasks = new ArrayList<ITemplateTask>();
+ for (ITemplateTask task : tasks) {
+ if (task instanceof TemplateAttribute && ((TemplateAttribute) task).isTypeNameWildcard()) {
+ TemplateAttribute attributeTask = (TemplateAttribute) task;
+ Collection<AttributeType> attributeTypes = artifact.getAttributeTypes();
+ for (AttributeType attributeType : attributeTypes) {
+ newTasks.add(new TemplateAttribute(attributeTask, attributeType.getName()));
+ }
+ } else {
+ newTasks.add(task);
+ }
+ }
+ return newTasks;
+ }
+
+ private String peekAtFirstArtifactToGetParagraphNumber(String template, List<Artifact> artifacts) throws OseeCoreException {
+ Pattern headElementsPattern =
+ Pattern.compile("<((\\w+:)?(Artifact|Extension_Processor))>(.*?)</\\1>",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ String startParagraphNumber = "1";
+ Matcher matcher = headElementsPattern.matcher(template);
+
+ if (matcher.find()) {
+ String elementType = matcher.group(3);
+ String elementValue = matcher.group(4);
+
+ if (elementType.equals("Artifact")) {
+ // Matcher setNameMatcher = setNamePattern.matcher(elementValue);
+ setNameMatcher.reset(elementValue);
+ setNameMatcher.find();
+
+ if (!artifacts.isEmpty()) {
+ Artifact artifact = artifacts.iterator().next();
+ if (artifact.isAttributeTypeValid("Imported Paragraph Number")) {
+ if (!artifact.getSoleAttributeValue("Imported Paragraph Number", "").equals("")) {
+ startParagraphNumber = artifact.getSoleAttributeValue("Imported Paragraph Number", "");
+ }
+ }
+ }
+ }
+ }
+ return startParagraphNumber;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorProvider.java
new file mode 100644
index 00000000000..52593a9547d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorProvider.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.framework.ui.skynet.results;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IResultsEditorProvider {
+
+ public String getEditorName() throws OseeCoreException;
+
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorTab.java
new file mode 100644
index 00000000000..c254874c698
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/IResultsEditorTab.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.framework.ui.skynet.results;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IResultsEditorTab {
+
+ public String getTabName();
+
+ public Composite createTab(Composite parent, ResultsEditor resultsEditor) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditor.java
new file mode 100644
index 00000000000..862547ff098
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditor.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.results;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.results.html.ResultsEditorHtmlTab;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsEditor extends AbstractArtifactEditor implements IDirtiableEditor, IActionable {
+ public static final String EDITOR_ID = "org.eclipse.osee.framework.ui.skynet.results.ResultsEditor";
+ private Integer startPage = null;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+ */
+ @Override
+ protected void addPages() {
+
+ try {
+ OseeContributionItem.addTo(this, true);
+
+ IResultsEditorProvider provider = getResultsEditorProvider();
+
+ List<IResultsEditorTab> tabs = provider.getResultsEditorTabs();
+ if (tabs.isEmpty()) {
+ tabs.add(new ResultsEditorHtmlTab("Error", "Error",
+ AHTML.simplePage("Error: Pages creation error for \"" + provider.getEditorName() + "\"")));
+ }
+
+ for (IResultsEditorTab tab : provider.getResultsEditorTabs()) {
+ addResultsTab(tab);
+ }
+
+ if (startPage == null) {
+ addResultsTab(new ResultsEditorHtmlTab(
+ "Error",
+ "Error",
+ AHTML.simplePage("Error: Pages creation error for \"" + provider.getEditorName() + "\"; StartPage == null")));
+ }
+ setPartName(provider.getEditorName());
+ setActivePage(startPage);
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void addResultsTab(IResultsEditorTab tab) throws OseeCoreException {
+ Composite comp = tab.createTab(getContainer(), this);
+ int pageIndex = addPage(comp);
+ if (startPage == null) {
+ startPage = pageIndex;
+ }
+ setPageText(pageIndex, tab.getTabName());
+ }
+
+ public ToolBar createToolBar(Composite parent) {
+ ToolBar toolBar = ALayout.createCommonToolBar(parent);
+
+ OseeAts.addButtonToEditorToolBar(this, SkynetGuiPlugin.getInstance(), toolBar, EDITOR_ID, "Result View");
+
+ return toolBar;
+ }
+
+ public void setEditorTitle(final String str) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ setPartName(str);
+ firePropertyChange(IWorkbenchPart.PROP_TITLE);
+ }
+ });
+ }
+
+ public IResultsEditorProvider getResultsEditorProvider() {
+ IEditorInput editorInput = getEditorInput();
+ if (!(editorInput instanceof ResultsEditorInput)) {
+ throw new IllegalArgumentException("Editor Input not WorldEditorInput");
+ }
+ ResultsEditorInput worldEditorInput = (ResultsEditorInput) editorInput;
+ return worldEditorInput.getIWorldEditorProvider();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.artifact.editor.AbstractArtifactEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ @Override
+ public boolean isSaveOnCloseNeeded() {
+ return isDirty();
+ }
+
+ public void refreshTitle() {
+ firePropertyChange(IWorkbenchPart.PROP_TITLE);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
+ */
+ @Override
+ public boolean isDirty() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ return null;
+ }
+
+ public static void open(final String tabName, final String title, final String html) throws OseeCoreException {
+ ResultsEditor.open(new IResultsEditorProvider() {
+
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return title;
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ List<IResultsEditorTab> tabs = new ArrayList<IResultsEditorTab>();
+ tabs.add(new ResultsEditorHtmlTab(title, tabName, html));
+ return tabs;
+ }
+ });
+ }
+
+ public static void open(final XResultPage xResultPage) throws OseeCoreException {
+ ResultsEditor.open(new IResultsEditorProvider() {
+
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return xResultPage.getTitle();
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ List<IResultsEditorTab> tabs = new ArrayList<IResultsEditorTab>();
+ tabs.add(new ResultsEditorHtmlTab(xResultPage));
+ return tabs;
+ }
+ });
+ }
+
+ public static void open(final IResultsEditorProvider provider) throws OseeCoreException {
+ open(provider, false);
+ }
+
+ public static void open(final IResultsEditorProvider provider, boolean forcePend) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ try {
+ page.openEditor(new ResultsEditorInput(provider), EDITOR_ID);
+ } catch (PartInitException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }, forcePend);
+ }
+
+ public void closeEditor() {
+ final MultiPageEditorPart editor = this;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ AWorkbench.getActivePage().closeEditor(editor, false);
+ }
+ });
+ }
+
+ public static Collection<ResultsEditor> getEditors() {
+ final List<ResultsEditor> editors = new ArrayList<ResultsEditor>();
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (IEditorReference editor : AWorkbench.getEditors(EDITOR_ID)) {
+ editors.add((ResultsEditor) editor.getEditor(false));
+ }
+ }
+ }, true);
+ return editors;
+ }
+
+ public static void closeAll() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ for (IEditorReference editor : AWorkbench.getEditors(EDITOR_ID)) {
+ AWorkbench.getActivePage().closeEditor((editor.getEditor(false)), false);
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditorInput.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditorInput.java
new file mode 100644
index 00000000000..fe219ff33b2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/ResultsEditorInput.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.framework.ui.skynet.results;
+
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsEditorInput implements IEditorInput {
+
+ IResultsEditorProvider iresultsEditorProvider;
+
+ /**
+ * @return the iWorldEditorProvider
+ */
+ public IResultsEditorProvider getIWorldEditorProvider() {
+ return iresultsEditorProvider;
+ }
+
+ public ResultsEditorInput(IResultsEditorProvider iresultsEditorProvider) {
+ this.iresultsEditorProvider = iresultsEditorProvider;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ @Override
+ public String getName() {
+ try {
+ return iresultsEditorProvider.getEditorName();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return "Exception getting name: " + ex.getLocalizedMessage();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/SkynetTransactionJobTemplate.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/SkynetTransactionJobTemplate.java
new file mode 100644
index 00000000000..cc072b04b14
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/SkynetTransactionJobTemplate.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.framework.ui.skynet.results;
+
+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.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * This abstract class provides a uniform way of executing transactions within an Eclipse Job. It handles exceptions
+ * ensuring that transactions are processed in the correct order and roll-backs are performed whenever errors are
+ * detected.
+ *
+ * @author Donald G. Dunne
+ */
+public abstract class SkynetTransactionJobTemplate extends Job {
+ private final Branch branch;
+ protected IProgressMonitor monitor;
+
+ /**
+ * @param name
+ */
+ public SkynetTransactionJobTemplate(String name, Branch branch) {
+ super(name);
+ this.branch = branch;
+ }
+
+ /**
+ * @param user true if Job initiated by user
+ * @param priority Job.LONG, Job.SHORT
+ */
+ public void run(boolean user, int priority) {
+ setUser(user);
+ setPriority(priority);
+ schedule();
+ }
+
+ /**
+ * Perform whatever preprocessing or UI required. NOTE: It is the applications job to run in Display thread if
+ * necessary
+ *
+ * @return TrueResult if ok to continue; FalseResult will terminate Job with getText() error
+ */
+ public Result performPreprocess() {
+ return Result.TrueResult;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ Result result = performPreprocess();
+ if (result.isFalse()) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, result.getText(), null);
+ }
+ try {
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ handleTxWork(transaction);
+ transaction.execute();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ try {
+ handleTxFinally();
+ } catch (OseeCoreException ex) {
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * Provides the transaction's work implementation.
+ *
+ * @param transaction
+ * @throws Exception
+ */
+ protected abstract void handleTxWork(SkynetTransaction transaction) throws OseeCoreException;
+
+ /**
+ * This convenience method is provided in case child classes have a portion of code that needs to execute always at
+ * the end of the transaction, regardless of exceptions. <br/>
+ * <b>Override to add additional code to finally block</b>
+ *
+ * @throws Exception
+ */
+ protected void handleTxFinally() throws OseeCoreException {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/XResultData.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/XResultData.java
new file mode 100644
index 00000000000..b810e7b30f6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/XResultData.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.results;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultBrowserHyperCmd;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * Used to log Info, Warning and Errors to multiple locations (logger, stderr/out and XResultView). Upon completion, a
+ * call to report(title) will open results in the ResultsView
+ *
+ * @author Donald G. Dunne
+ */
+public class XResultData {
+
+ StringBuffer sb = new StringBuffer();
+ private static enum Type {
+ Severe, Warning, Info;
+ }
+
+ public static void runExample() {
+ runExample("This is my report title");
+ }
+
+ public static void runExample(String title) {
+ try {
+ XResultData rd = new XResultData();
+ rd.log("This is just a normal log message");
+ rd.logWarning("This is a warning");
+ rd.logError("This is an error");
+
+ rd.log("\n\nExample of hyperlinked hrid: " + XResultData.getHyperlink(UserManager.getUser()));
+
+ rd.log("Example of hyperlinked artifact different hyperlink string: " + XResultData.getHyperlink(
+ "Different string", UserManager.getUser()));
+
+ rd.log("Example of hyperlinked hrid on another branch: " + getHyperlink(
+ UserManager.getUser().getHumanReadableId(), UserManager.getUser().getHumanReadableId(),
+ BranchManager.getCommonBranch().getBranchId()));
+
+ rd.log("\n\nHere is a nice table");
+ rd.addRaw(AHTML.beginMultiColumnTable(95, 1));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"Type", "Title", "Status"}));
+ for (int x = 0; x < 3; x++)
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {"Type " + x, "Title " + x, x + ""}));
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {"Error / Warning in table ", "Error: this is error",
+ "Warning: this is warning"}));
+ rd.addRaw(AHTML.endMultiColumnTable());
+ rd.report("This is my report title");
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void addRaw(String str) {
+ sb.append(str);
+ }
+
+ public void reportSevereLoggingMonitor(SevereLoggingMonitor monitorLog) {
+ List<IHealthStatus> stats = monitorLog.getAllLogs();
+ for (IHealthStatus stat : new CopyOnWriteArrayList<IHealthStatus>(stats)) {
+ if (stat.getException() != null) {
+ logError("Exception: " + Lib.exceptionToString(stat.getException()));
+ }
+ }
+ }
+
+ public void log(IProgressMonitor monitor, String str) {
+ log(str);
+ if (monitor != null) monitor.setTaskName(str);
+ }
+
+ public void log(String str) {
+ logStr(Type.Info, str + "\n", null);
+ }
+
+ public void log(String str, IProgressMonitor monitor) {
+ logStr(Type.Info, str + "\n", monitor);
+ }
+
+ public void logError(String str) {
+ logStr(Type.Severe, str + "\n", null);
+ }
+
+ public void logWarning(String str) {
+ logStr(Type.Warning, str + "\n", null);
+ }
+
+ public boolean isEmpty() {
+ return toString().equals("");
+ }
+
+ public void logStr(Type type, final String str, final IProgressMonitor monitor) {
+ String resultStr = "";
+ if (type == Type.Warning)
+ resultStr = "Warning: " + str;
+ else if (type == Type.Severe)
+ resultStr = "Error: " + str;
+ else
+ resultStr = str;
+ sb.append(resultStr);
+ OseeLog.log(SkynetGuiPlugin.class, Level.parse(type.name().toUpperCase()), resultStr);
+ if (monitor != null) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ monitor.subTask(str);
+ }
+ });
+ }
+ }
+
+ @Override
+ public String toString() {
+ return sb.toString();
+ }
+
+ public void report(final String title) throws OseeCoreException {
+ report(title, Manipulations.ALL);
+ }
+
+ public void report(final String title, final Manipulations... manipulations) throws OseeCoreException {
+ final String html = getReport(title, manipulations).getManipulatedHtml();
+ try {
+ ResultsEditor.open("Results", title, html);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public XResultPage getReport(final String title) {
+ return getReport(title, Manipulations.ALL);
+ }
+
+ public XResultPage getReport(final String title, Manipulations... manipulations) {
+ return new XResultPage(title + " - " + XDate.getDateNow(XDate.MMDDYYHHMM),
+ (sb.toString().equals("") ? "Nothing Logged" : sb.toString()), manipulations);
+ }
+
+ /*
+ * Creates hyperlink using hrid as name. Default editor will open.
+ */
+ public static String getHyperlink(Artifact art) {
+ return getHyperlink(art.getHumanReadableId(), art.getHumanReadableId(), art.getBranch().getBranchId());
+ }
+
+ /*
+ * Creates hyperlink using name. Default editor will open.
+ */
+ public static String getHyperlink(String name, Artifact art) {
+ return getHyperlink(name, art.getHumanReadableId(), art.getBranch().getBranchId());
+ }
+
+ /*
+ * Creates hyperlink using name. Default editor will open hrid for branchId given
+ */
+ public static String getHyperlink(String name, String hrid, int branchId) {
+ return AHTML.getHyperlink(XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openArtifctBranch,
+ hrid + "(" + branchId + ")"), name);
+ }
+
+ public static String getHyperlinkForArtifactEditor(String name, String hrid) {
+ return AHTML.getHyperlink(XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openArtifactEditor, hrid),
+ name);
+ }
+
+ public static String getHyperlinkForAction(String name, String hrid) {
+ return AHTML.getHyperlink(XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openAction, hrid), name);
+ }
+
+ public static String getHyperlinkForAction(Artifact artifact) {
+ return getHyperlinkForAction(artifact.getHumanReadableId(), artifact);
+ }
+
+ public static String getHyperlinkForAction(String name, Artifact art) {
+ return AHTML.getHyperlink(
+ XResultBrowserHyperCmd.getHyperCmdStr(XResultBrowserHyperCmd.openAction, art.getGuid()), name);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ChartViewerSWT.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ChartViewerSWT.java
new file mode 100644
index 00000000000..75defe30050
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ChartViewerSWT.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.framework.ui.skynet.results.chart;
+
+import java.util.logging.Level;
+import org.eclipse.birt.chart.device.IDeviceRenderer;
+import org.eclipse.birt.chart.exception.ChartException;
+import org.eclipse.birt.chart.factory.Generator;
+import org.eclipse.birt.chart.model.Chart;
+import org.eclipse.birt.chart.model.attribute.Bounds;
+import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl;
+import org.eclipse.birt.chart.util.PluginSettings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+
+public class ChartViewerSWT implements PaintListener
+
+{
+
+ private IDeviceRenderer idr = null;
+ private final Chart chart;
+
+ public ChartViewerSWT(Chart chart) {
+ this.chart = chart;
+ // INITIALIZE THE SWT RENDERING DEVICE
+ final PluginSettings ps = PluginSettings.instance();
+ try {
+ idr = ps.getDevice("dv.SWT");
+ } catch (ChartException pex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, pex);
+ }
+ }
+
+ /**
+ * The SWT paint callback
+ */
+
+ public void paintControl(PaintEvent pe) {
+
+ idr.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, pe.gc);
+ Composite co = (Composite) pe.getSource();
+ Rectangle re = co.getClientArea();
+ Bounds bo = BoundsImpl.create(re.x, re.y, re.width, re.height);
+ bo.scale(72d / idr.getDisplayServer().getDpiResolution()); // BOUNDS MUST BE SPECIFIED IN POINTS
+ // BUILD AND RENDER THE CHART
+
+ Generator gr = Generator.instance();
+ try {
+ gr.render(idr, gr.build(idr.getDisplayServer(), chart, null, bo, null));
+ } catch (ChartException gex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, gex);
+ }
+
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/IResultsEditorChartTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/IResultsEditorChartTab.java
new file mode 100644
index 00000000000..442452f5e2c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/IResultsEditorChartTab.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.framework.ui.skynet.results.chart;
+
+import org.eclipse.birt.chart.model.Chart;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IResultsEditorChartTab extends IResultsEditorTab {
+
+ public Chart getChart() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ResultsEditorChartTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ResultsEditorChartTab.java
new file mode 100644
index 00000000000..2bfda2b0670
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/chart/ResultsEditorChartTab.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.framework.ui.skynet.results.chart;
+
+import org.eclipse.birt.chart.model.Chart;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.util.ImageCapture;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+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.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsEditorChartTab implements IResultsEditorChartTab {
+
+ private final Chart chart;
+ private final String tabName;
+ private Composite chartComposite;
+ private Canvas chartCanvas;
+
+ public ResultsEditorChartTab(String tabName, Chart chart) {
+ this.tabName = tabName;
+ this.chart = chart;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorChartTab#getChart()
+ */
+ @Override
+ public Chart getChart() throws OseeCoreException {
+ return chart;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab#getTabName()
+ */
+ @Override
+ public String getTabName() {
+ return tabName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab#createTab(org.eclipse.swt.widgets.Composite, org.eclipse.osee.framework.ui.skynet.results.ResultsEditor)
+ */
+ @Override
+ public Composite createTab(Composite parent, ResultsEditor resultsEditor) throws OseeCoreException {
+ Chart chart = getChart();
+ chartComposite = ALayout.createCommonPageComposite(parent);
+ ToolBar toolBar = resultsEditor.createToolBar(chartComposite);
+ createToolbar(toolBar);
+
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ if (chart == null) {
+ Label label = new Label(chartComposite, SWT.BORDER);
+ label.setText("\n No Chart Provided");
+ } else {
+ chartCanvas = new Canvas(chartComposite, SWT.NONE);
+ chartCanvas.setLayoutData(gd);
+ chartCanvas.addPaintListener(new ChartViewerSWT(chart));
+ }
+
+ return chartComposite;
+ }
+
+ private void createToolbar(ToolBar toolBar) {
+ ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.PRINT));
+ item.setToolTipText("Print this tab");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ ImageCapture iCapture = new ImageCapture(chartCanvas);
+ iCapture.popupDialog();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.SEPARATOR);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/ResultsEditorExample.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/ResultsEditorExample.java
new file mode 100644
index 00000000000..c1d3eac190a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/ResultsEditorExample.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.framework.ui.skynet.results.example;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.birt.chart.model.Chart;
+import org.eclipse.birt.chart.model.ChartWithAxes;
+import org.eclipse.birt.chart.model.attribute.AxisType;
+import org.eclipse.birt.chart.model.attribute.IntersectionType;
+import org.eclipse.birt.chart.model.attribute.LegendItemType;
+import org.eclipse.birt.chart.model.attribute.Marker;
+import org.eclipse.birt.chart.model.attribute.MarkerType;
+import org.eclipse.birt.chart.model.attribute.TickStyle;
+import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl;
+import org.eclipse.birt.chart.model.component.Axis;
+import org.eclipse.birt.chart.model.component.Series;
+import org.eclipse.birt.chart.model.component.impl.SeriesImpl;
+import org.eclipse.birt.chart.model.data.BaseSampleData;
+import org.eclipse.birt.chart.model.data.DataFactory;
+import org.eclipse.birt.chart.model.data.NumberDataSet;
+import org.eclipse.birt.chart.model.data.OrthogonalSampleData;
+import org.eclipse.birt.chart.model.data.SampleData;
+import org.eclipse.birt.chart.model.data.SeriesDefinition;
+import org.eclipse.birt.chart.model.data.TextDataSet;
+import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl;
+import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;
+import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl;
+import org.eclipse.birt.chart.model.impl.ChartWithAxesImpl;
+import org.eclipse.birt.chart.model.layout.Legend;
+import org.eclipse.birt.chart.model.layout.Plot;
+import org.eclipse.birt.chart.model.type.LineSeries;
+import org.eclipse.birt.chart.model.type.impl.LineSeriesImpl;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorProvider;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.chart.ResultsEditorChartTab;
+import org.eclipse.osee.framework.ui.skynet.results.html.ResultsEditorHtmlTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.IResultsXViewerRow;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsEditorTableTab;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsXViewerRow;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsEditorExample extends XNavigateItemAction {
+
+ public static String TITLE = "Results Editor Example";
+ private static enum Columns {
+ Date, Priority_123_Open_Bugs, Goal;
+ };
+ List<String> chartDateStrs =
+ Arrays.asList("09/07/2008", "09/21/2008", "10/05/2008", "10/19/2008", "11/02/2008", "11/16/2008",
+ "11/30/2008", "12/14/2008", "12/28/2008", "01/11/2009", "01/25/2009", "02/08/2009", "02/22/2009",
+ "03/08/2009", "03/22/2009", "04/05/2009", "04/19/2009");
+ List<Double> chartValueStrs =
+ Arrays.asList(177.0, 174.0, 167.0, 161.0, 167.0, 167.0, 163.0, 165.0, 171.0, 179.0, 178.0, 177.0, 164.0,
+ 159.0, 159.0, 157.0, 157.0);
+ List<Double> chartValueStrsGoal =
+ Arrays.asList(177.0, 174.0, 167.0, 161.0, 167.0, 167.0, 163.0, 165.0, 171.0, 179.0, 177.0, 175.0, 173.0,
+ 171.0, 169.0, 167.0, 165.0);
+
+ /**
+ * @param parent
+ */
+ public ResultsEditorExample(XNavigateItem parent) {
+ super(parent, TITLE, FrameworkImage.ADMIN);
+ }
+
+ public String getStatusReport() {
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.heading(3, TITLE));
+ sb.append(AHTML.beginMultiColumnTable(100, 1));
+ sb.append(AHTML.addHeaderRowMultiColumnTable(new String[] {Columns.Date.name(),
+ Columns.Priority_123_Open_Bugs.name(), Columns.Goal.name()}));
+ for (int x = 0; x < chartDateStrs.size(); x++) {
+ sb.append(AHTML.addRowMultiColumnTable(chartDateStrs.get(x), "" + chartValueStrs.get(x),
+ "" + chartValueStrsGoal.get(x)));
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ return sb.toString();
+ }
+
+ public Chart createChart() {
+ ChartWithAxes cwaLine = ChartWithAxesImpl.create();
+ cwaLine.setType("Line Chart"); //$NON-NLS-1$
+ cwaLine.setSubType("Overlay"); //$NON-NLS-1$
+
+ // Plot
+ cwaLine.getBlock().setBackground(ColorDefinitionImpl.WHITE());
+ Plot p = cwaLine.getPlot();
+ p.getClientArea().setBackground(ColorDefinitionImpl.create(255, 255, 225));
+
+ // Title
+ cwaLine.getTitle().getLabel().getCaption().setValue(
+ "Action Item Backlog - Priority 1-3 Bugs\nGoal: 50% Reduction - Baseline: YE 2008");//$NON-NLS-1$
+
+ // Legend
+ Legend lg = cwaLine.getLegend();
+ lg.setItemType(LegendItemType.SERIES_LITERAL);
+
+ // X-Axis
+ Axis xAxisPrimary = cwaLine.getPrimaryBaseAxes()[0];
+ xAxisPrimary.setType(AxisType.TEXT_LITERAL);
+ xAxisPrimary.getMajorGrid().setTickStyle(TickStyle.BELOW_LITERAL);
+ xAxisPrimary.getOrigin().setType(IntersectionType.MIN_LITERAL);
+
+ // Y-Axis
+ Axis yAxisPrimary = cwaLine.getPrimaryOrthogonalAxis(xAxisPrimary);
+ yAxisPrimary.getMajorGrid().setTickStyle(TickStyle.LEFT_LITERAL);
+
+ // Data Set
+ TextDataSet categoryValues = TextDataSetImpl.create(chartDateStrs.toArray(new String[chartDateStrs.size()]));
+ NumberDataSet orthoValues1 = NumberDataSetImpl.create(chartValueStrs.toArray(new Double[chartValueStrs.size()]));
+ NumberDataSet orthoValuesGoal =
+ NumberDataSetImpl.create(chartValueStrsGoal.toArray(new Double[chartValueStrsGoal.size()]));
+
+ SampleData sd = DataFactory.eINSTANCE.createSampleData();
+ BaseSampleData sdBase = DataFactory.eINSTANCE.createBaseSampleData();
+ sdBase.setDataSetRepresentation("");//$NON-NLS-1$
+ sd.getBaseSampleData().add(sdBase);
+
+ OrthogonalSampleData sdOrthogonal1 = DataFactory.eINSTANCE.createOrthogonalSampleData();
+ sdOrthogonal1.setDataSetRepresentation("");//$NON-NLS-1$
+ sdOrthogonal1.setSeriesDefinitionIndex(0);
+ sd.getOrthogonalSampleData().add(sdOrthogonal1);
+
+ OrthogonalSampleData sdOrthogonal2 = DataFactory.eINSTANCE.createOrthogonalSampleData();
+ sdOrthogonal2.setDataSetRepresentation("");//$NON-NLS-1$
+ sdOrthogonal2.setSeriesDefinitionIndex(1);
+ sd.getOrthogonalSampleData().add(sdOrthogonal2);
+
+ cwaLine.setSampleData(sd);
+
+ // X-Series
+ Series seCategory = SeriesImpl.create();
+ seCategory.setDataSet(categoryValues);
+ SeriesDefinition sdX = SeriesDefinitionImpl.create();
+
+ xAxisPrimary.getSeriesDefinitions().add(sdX);
+ sdX.getSeries().add(seCategory);
+
+ // Y-Series
+ LineSeries ls1 = (LineSeries) LineSeriesImpl.create();
+ ls1.setDataSet(orthoValues1);
+ ls1.setSeriesIdentifier("Count");
+ ls1.getLineAttributes().setColor(ColorDefinitionImpl.BLUE());
+ for (int i = 0; i < ls1.getMarkers().size(); i++) {
+ ((Marker) ls1.getMarkers().get(i)).setType(MarkerType.TRIANGLE_LITERAL);
+ }
+ ls1.getLabel().setVisible(true);
+
+ LineSeries ls2 = (LineSeries) LineSeriesImpl.create();
+ ls2.setDataSet(orthoValuesGoal);
+ ls2.setSeriesIdentifier("Goal (100)");
+ ls2.getLineAttributes().setColor(ColorDefinitionImpl.GREEN());
+ for (int i = 0; i < ls2.getMarkers().size(); i++) {
+ ((Marker) ls2.getMarkers().get(i)).setType(MarkerType.TRIANGLE_LITERAL);
+ }
+ ls2.getLabel().setVisible(true);
+
+ SeriesDefinition sdY = SeriesDefinitionImpl.create();
+ sdY.getSeriesPalette().shift(-2);
+ yAxisPrimary.getSeriesDefinitions().add(sdY);
+ sdY.getSeries().add(ls2);
+ sdY.getSeries().add(ls1);
+
+ return cwaLine;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction#run(org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption[])
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ final String html = AHTML.simplePage(getStatusReport());
+ ResultsEditor.open(new IResultsEditorProvider() {
+
+ @Override
+ public String getEditorName() throws OseeCoreException {
+ return TITLE;
+ }
+
+ @Override
+ public List<IResultsEditorTab> getResultsEditorTabs() throws OseeCoreException {
+ List<IResultsXViewerRow> rows = new ArrayList<IResultsXViewerRow>();
+ for (int x = 0; x < chartDateStrs.size(); x++) {
+ rows.add(new ResultsXViewerRow(new String[] {chartDateStrs.get(x),
+ String.valueOf(chartValueStrs.get(x)), String.valueOf(chartValueStrsGoal.get(x))}));
+ }
+ List<XViewerColumn> columns =
+ Arrays.asList(new XViewerColumn(Columns.Date.name(), Columns.Date.name(), 80, SWT.LEFT, true,
+ SortDataType.Date, false, ""), new XViewerColumn(Columns.Priority_123_Open_Bugs.name(),
+ Columns.Priority_123_Open_Bugs.name(), 80, SWT.LEFT, true, SortDataType.Integer, false, ""),
+ new XViewerColumn(Columns.Goal.name(), Columns.Goal.name(), 80, SWT.LEFT, true,
+ SortDataType.Integer, false, ""));
+
+ return Arrays.asList(new ResultsEditorChartTab("Chart", createChart()), new ResultsEditorTableTab("Data",
+ columns, rows), new ResultsEditorHtmlTab(TITLE, "Report", html));
+ }
+
+ });
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/XResultDataExample.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/XResultDataExample.java
new file mode 100644
index 00000000000..feb942d4e1a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/example/XResultDataExample.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.framework.ui.skynet.results.example;
+
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XResultDataExample extends XNavigateItemAction {
+
+ public static String TITLE = "XResultData Example";
+
+ /**
+ * @param parent
+ */
+ public XResultDataExample(XNavigateItem parent) {
+ super(parent, TITLE, FrameworkImage.ADMIN);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction#run(org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption[])
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ XResultData.runExample();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/IResultsEditorHtmlTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/IResultsEditorHtmlTab.java
new file mode 100644
index 00000000000..35c56522948
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/IResultsEditorHtmlTab.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.framework.ui.skynet.results.html;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IResultsEditorHtmlTab extends IResultsEditorTab {
+
+ public String getReportHtml() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/ResultsEditorHtmlTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/ResultsEditorHtmlTab.java
new file mode 100644
index 00000000000..925b90c0bc4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/ResultsEditorHtmlTab.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.framework.ui.skynet.results.html;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.Dialogs;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+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.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsEditorHtmlTab implements IResultsEditorHtmlTab {
+
+ private final String tabName;
+ private XResultsComposite xResultsComposite;
+ private static String HELP_CONTEXT_ID = "xResultView";
+ private ResultsEditor resultsEditor;
+ private final XResultPage xResultPage;
+
+ public ResultsEditorHtmlTab(XResultPage xResultPage) {
+ this.xResultPage = xResultPage;
+ tabName = "Results";
+ }
+
+ public ResultsEditorHtmlTab(String title, String tabName, String html) {
+ this.tabName = tabName;
+ xResultPage = new XResultPage(title, html, Manipulations.NONE);
+ org.eclipse.core.runtime.Assert.isNotNull(tabName);
+ org.eclipse.core.runtime.Assert.isNotNull(html);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorHtmlTab#getReportHtml()
+ */
+ @Override
+ public String getReportHtml() throws OseeCoreException {
+ return xResultPage.getManipulatedHtml();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab#getTabName()
+ */
+ @Override
+ public String getTabName() {
+ return tabName;
+ }
+
+ public Composite createTab(Composite parent, ResultsEditor resultsEditor) throws OseeCoreException {
+ this.resultsEditor = resultsEditor;
+
+ Composite comp = ALayout.createCommonPageComposite(parent);
+ ToolBar toolBar = resultsEditor.createToolBar(comp);
+ createToolbar(toolBar);
+
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ xResultsComposite = new XResultsComposite(comp, SWT.BORDER);
+ xResultsComposite.setLayoutData(gd);
+ xResultsComposite.setHtmlText(xResultPage.getManipulatedHtml(Arrays.asList(Manipulations.NONE)));
+
+ SkynetGuiPlugin.getInstance().setHelp(xResultsComposite, HELP_CONTEXT_ID);
+ SkynetGuiPlugin.getInstance().setHelp(xResultsComposite.getBrowser(), HELP_CONTEXT_ID);
+ return comp;
+ }
+
+ private void createToolbar(ToolBar toolBar) {
+ ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.PRINT));
+ item.setToolTipText("Print this tab");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ xResultsComposite.getBrowser().setUrl("javascript:print()");
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.EMAIL));
+ item.setToolTipText("Email");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ Set<Manipulations> manipulations = new HashSet<Manipulations>();
+ manipulations.add(Manipulations.NONE);
+ Dialogs.emailDialog(resultsEditor.getTitle(), xResultPage.getManipulatedHtml(manipulations));
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.EXPORT_TABLE));
+ item.setToolTipText("Export Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ xResultPage.handleExport();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.SAVED));
+ item.setToolTipText("Save Report");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ xResultPage.saveToFile();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.FOLDER));
+ item.setToolTipText("Import Saved Results Report");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ try {
+ final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.OPEN);
+ dialog.setFilterExtensions(new String[] {"*.html"});
+ String filename = dialog.open();
+ if (filename == null || filename.equals("")) return;
+ String html = AFile.readFile(filename);
+ if (html == null) throw new IllegalStateException("Can't load file");
+ if (html.equals("")) throw new IllegalStateException("Empty file");
+ resultsEditor.addResultsTab(new ResultsEditorHtmlTab(new XResultPage(filename, html,
+ Manipulations.RAW_HTML)));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserHyperCmd.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserHyperCmd.java
new file mode 100644
index 00000000000..0d5b34ffa08
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserHyperCmd.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.skynet.results.html;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum XResultBrowserHyperCmd {
+ openAction, openArtifctBranch, openArtifactEditor, openBranch, openChangeReport, openPriorityHelp;
+
+ public static String getHyperCmdStr(XResultBrowserHyperCmd xResultBrowserHyperCmd, String value) {
+ return String.format("%s=%s", xResultBrowserHyperCmd.name(), value);
+ }
+
+ public static XResultBrowserHyperCmd getCmdStrHyperCmd(String hyperCmdStr) {
+ Matcher m = Pattern.compile("(.*?)=(.*)").matcher(hyperCmdStr);
+ if (m.find()) return XResultBrowserHyperCmd.getHyperCmd(m.group(1));
+ return null;
+ }
+
+ public static String getCmdStrValue(String hyperCmdStr) {
+ Matcher m = Pattern.compile("(.*?)=(.*)").matcher(hyperCmdStr);
+ if (m.find()) return m.group(2);
+ return "";
+ }
+
+ public static XResultBrowserHyperCmd getHyperCmd(String str) {
+ for (XResultBrowserHyperCmd xResultBrowserHyperCmd : XResultBrowserHyperCmd.values()) {
+ if (xResultBrowserHyperCmd.toString().equals(str)) return xResultBrowserHyperCmd;
+ }
+ throw new IllegalArgumentException("Invalid XResultBrowserHyperCmd Name");
+ }
+};
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserListener.java
new file mode 100644
index 00000000000..bf0622c7cc7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultBrowserListener.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.framework.ui.skynet.results.html;
+
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.browser.LocationListener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XResultBrowserListener implements LocationListener {
+
+ public XResultBrowserListener() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.browser.LocationListener#changing(org.eclipse.swt.browser.LocationEvent)
+ */
+ public void changing(LocationEvent event) {
+ try {
+ String location = event.location;
+ if (location.contains("javascript:print")) return;
+ String cmdStr = location.replaceFirst("about:blank", "");
+ cmdStr = cmdStr.replaceFirst("blank", "");
+ XResultBrowserHyperCmd xResultBrowserHyperCmd = XResultBrowserHyperCmd.getCmdStrHyperCmd(cmdStr);
+ String value = XResultBrowserHyperCmd.getCmdStrValue(cmdStr);
+ if (xResultBrowserHyperCmd == XResultBrowserHyperCmd.openAction) {
+ event.doit = false;
+ OseeAts.getAtsLib().openArtifact(value, OseeAts.OpenView.ActionEditor);
+ } else if (xResultBrowserHyperCmd == XResultBrowserHyperCmd.openArtifctBranch) {
+ event.doit = false;
+ try {
+ java.util.regex.Matcher m = Pattern.compile("^(.*?)\\((.*?)\\)$").matcher(value);
+ if (m.find()) {
+ String hrid = m.group(1);
+ Integer branchId = Integer.parseInt(m.group(2));
+ Artifact artifact = ArtifactQuery.getArtifactFromId(hrid, BranchManager.getBranch(branchId));
+ RendererManager.openInJob(artifact, PresentationType.GENERALIZED_EDIT);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (xResultBrowserHyperCmd == XResultBrowserHyperCmd.openArtifactEditor) {
+ event.doit = false;
+ OseeAts.getAtsLib().openArtifact(value, OseeAts.OpenView.ArtifactEditor);
+ } else if (xResultBrowserHyperCmd == XResultBrowserHyperCmd.openBranch) {
+ event.doit = false;
+ int branchId = new Integer(value);
+ Branch branch = BranchManager.getBranch(branchId);
+ BranchView.revealBranch(branch);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Can't process hyperlink.", ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.browser.LocationListener#changed(org.eclipse.swt.browser.LocationEvent)
+ */
+ public void changed(LocationEvent event) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultPage.java
new file mode 100644
index 00000000000..57e57f71b03
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultPage.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.results.html;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.Dialogs;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XResultPage {
+
+ private String title;
+ private String html;
+ private final String id; // Used to add and remove to menu item
+ private String manipulatedHtml;
+ private Set<Manipulations> manipulations = new HashSet<Manipulations>();
+ private int numWarnings = Integer.MAX_VALUE;
+ private int numErrors = Integer.MAX_VALUE;
+ public static enum Manipulations {
+ NONE, //
+ HRID_CMD_HYPER,
+ // Replace all HRID strings with hyperlinks; ATS=<hrid> opens Action editor
+ // ART=<hrid> opens Artifact editor, BOTH=<hrid> allows either
+ ERROR_RED, // Make all "Error" strings red
+ WARNING_YELLOW, // Make all "Warning" strings yellow
+ CONVERT_NEWLINES, // Convert all \n to <br>
+ HTML_MANIPULATIONS, // Do all except converting newlines
+ RAW_HTML, // Just display in simple html page
+ ERROR_WARNING_HEADER, // Shows Errors: 4 Warnings: 23 count at top of page
+ ALL
+ };
+ public enum HyperType {
+ ATS, ART, BOTH
+ };
+
+ /**
+ * Create and display result page with all Manipulations available
+ */
+ public XResultPage(String title, String text) {
+ this(title, text, Manipulations.ALL);
+ }
+
+ /**
+ * Create and display result page with given Manipulations
+ *
+ * @param title title of the page (include date/time due or something unique due to multi-page view of results)
+ * @param html html to display (minus manipulations). this html MUST already handle new lines (eg
+ * text.replaceAll("\n",AHTML.newLine())) or use the CONVERT_NEWLINES manipultion
+ * @param manipulations manipulations desired for the input HTML
+ */
+ public XResultPage(String title, String html, Manipulations... manipulations) {
+ super();
+ this.title = title;
+ this.html = html;
+ id = GUID.generateGuidStr();
+ for (Manipulations man : manipulations) {
+ if (man == Manipulations.ALL) {
+ this.manipulations.add(Manipulations.HRID_CMD_HYPER);
+ this.manipulations.add(Manipulations.ERROR_RED);
+ this.manipulations.add(Manipulations.CONVERT_NEWLINES);
+ this.manipulations.add(Manipulations.WARNING_YELLOW);
+ } else if (man == Manipulations.HTML_MANIPULATIONS) {
+ this.manipulations.add(Manipulations.HRID_CMD_HYPER);
+ this.manipulations.add(Manipulations.ERROR_RED);
+ this.manipulations.add(Manipulations.WARNING_YELLOW);
+ } else
+ this.manipulations.add(man);
+ }
+ }
+
+ public int getNumWarnings() {
+ if (numWarnings != Integer.MAX_VALUE) return numWarnings;
+ if (manipulations.contains(Manipulations.WARNING_YELLOW)) numWarnings = Lib.numOccurances(html, "Warning:");
+ if (numWarnings == Integer.MAX_VALUE) return 0;
+ return numWarnings;
+ }
+
+ public int getNumErrors() {
+ if (numErrors != Integer.MAX_VALUE) return numErrors;
+ if (manipulations.contains(Manipulations.ERROR_RED)) numErrors = Lib.numOccurances(html, "Error:");
+ if (numErrors == Integer.MAX_VALUE) return 0;
+ return numErrors;
+ }
+
+ public static String getCmdValue(HyperType type, String hrid) {
+ return String.format("%s=%s", type.name(), hrid);
+ }
+
+ /**
+ * @param type
+ * @param name that will show hyperlinked
+ * @param hrid value that will be returned upon selection of hyperlink
+ * @return cmd value to put in HTML for processing by result page
+ */
+ public static String getCmdValue(HyperType type, String name, String hrid) {
+ return String.format("%s=%s:%s", type.name(), name, hrid);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getErrorWarningHtml() {
+ return String.format("<b>Errors</b>: %d <b>Warnings</b>: %d<br><br>", getNumErrors(), getNumWarnings());
+ }
+
+ public String getManipulatedHtml() {
+ return getManipulatedHtml(manipulations);
+ }
+
+ public String getManipulatedHtml(Collection<Manipulations> manipulations) {
+ if (manipulatedHtml == null) {
+ String str =
+ (manipulations.contains(Manipulations.ERROR_WARNING_HEADER) ? getErrorWarningHtml() : "") + getText();
+ if (manipulations.contains(Manipulations.RAW_HTML)) {
+ str = AHTML.simplePage(str);
+ } else {
+ if (manipulations.contains(Manipulations.CONVERT_NEWLINES)) {
+ str = str.replaceAll("\n", AHTML.newline());
+ }
+ if (manipulations.contains(Manipulations.HRID_CMD_HYPER)) {
+ // System.err.println("match " + line);
+ // Match getText so it doesn't mess up replace
+ // Retireve all ATS=WPN_PAGE:HSRID matches
+ Matcher m = Pattern.compile("([A-Z]{3,4})=(.*?):([A-Z0-9]{5})").matcher(str);
+ Set<String> cmdNameHrids = new HashSet<String>();
+ while (m.find())
+ cmdNameHrids.add(m.group());
+ // Retrieve all ATS=Name:HRSID matches and replace with hyperlinking
+ for (String cmdNameHrid : cmdNameHrids) {
+ String value = cmdNameHrid;
+ value = value.replaceAll("^.*?=", "");
+ String name = value;
+ name = name.replaceAll(":.*$", "");
+ String hrid = value;
+ hrid = hrid.replaceAll("^.*:", "");
+ if (cmdNameHrid.startsWith(HyperType.BOTH.name())) {
+ String replaceStr = hrid + " (" + XResultData.getHyperlinkForAction("ATS-" + name, hrid);
+ replaceStr += " " + XResultData.getHyperlinkForArtifactEditor("AE-" + name, hrid);
+ replaceStr += ")";
+ str = str.replaceAll(cmdNameHrid, replaceStr);
+ } else if (cmdNameHrid.startsWith(HyperType.ATS.name())) {
+ str = str.replaceAll(cmdNameHrid, XResultData.getHyperlinkForAction(name, hrid));
+ } else if (cmdNameHrid.startsWith(HyperType.ART.name())) {
+ str = str.replaceAll(cmdNameHrid, XResultData.getHyperlinkForArtifactEditor(name, hrid));
+ }
+ }
+ // Retrieve all ATS=HRSID matches and replace with hyperlinking
+ m = Pattern.compile("([A-Z]{3,4})=([A-Z0-9]{5})").matcher(str);
+ Set<String> cmdHrids = new HashSet<String>();
+ while (m.find())
+ cmdHrids.add(m.group());
+ for (String cmdHrid : cmdHrids) {
+ String hrid = cmdHrid;
+ hrid = hrid.replaceAll("^.*?=", "");
+ if (cmdHrid.startsWith(HyperType.BOTH.name())) {
+ String replaceStr = hrid + " (" + XResultData.getHyperlinkForAction("ATS", hrid);
+ replaceStr += " " + XResultData.getHyperlinkForArtifactEditor("AE", hrid);
+ replaceStr += ")";
+ str = str.replaceAll(cmdHrid, replaceStr);
+ } else if (cmdHrid.startsWith(HyperType.ATS.name())) {
+ str = str.replaceAll(cmdHrid, XResultData.getHyperlinkForAction(hrid, hrid));
+ } else if (cmdHrid.startsWith(HyperType.ART.name())) {
+ str = str.replaceAll(cmdHrid, XResultData.getHyperlinkForArtifactEditor(hrid, hrid));
+ }
+ }
+ }
+ if (manipulations.contains(Manipulations.ERROR_RED)) {
+ str = str.replaceAll("Error:", AHTML.color("red", "Error:"));
+ }
+ if (manipulations.contains(Manipulations.WARNING_YELLOW)) {
+ str = str.replaceAll("Warning:", AHTML.color("orange", "Warning:"));
+ }
+ }
+ manipulatedHtml = str;
+ }
+ return manipulatedHtml;
+ }
+
+ public String getText() {
+ return html;
+ }
+
+ public void setHtml(String html) {
+ this.html = html;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public Set<Manipulations> getManipulations() {
+ return manipulations;
+ }
+
+ public void setManipulations(Set<Manipulations> manipulations) {
+ this.manipulations = manipulations;
+ }
+
+ public void handleExport() {
+ Dialogs.exportHtmlTableDialog(title, html, true);
+ }
+
+ public void saveToFile() {
+ saveToFile(null);
+ }
+
+ public void saveToFile(String filename) {
+ if (manipulatedHtml == null) {
+ getManipulatedHtml();
+ }
+ if (filename == null) {
+ Dialogs.saveHtmlDialog(manipulatedHtml, true);
+ } else {
+ try {
+ Lib.writeStringToFile(manipulatedHtml, new File(filename));
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ Program.launch(filename);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultsComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultsComposite.java
new file mode 100644
index 00000000000..a8ea64756be
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/html/XResultsComposite.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.framework.ui.skynet.results.html;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+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.program.Program;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XResultsComposite extends Composite {
+
+ protected Browser browser;
+ private String htmlText;
+ private String title = "";
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public XResultsComposite(Composite parent, int style) {
+ super(parent, style);
+
+ setLayout(new GridLayout(1, false));
+ setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ browser = new Browser(this, SWT.BORDER);
+ browser.addLocationListener(new XResultBrowserListener());
+ browser.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+ browser.setMenu(getPopup(parent));
+
+ }
+
+ public Menu getPopup(Composite comp) {
+ Menu menu = new Menu(comp);
+
+ MenuItem item = new MenuItem(menu, SWT.NONE);
+ item.setText("View Source");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (htmlText == null || htmlText.equals("")) {
+ AWorkbench.popup("ERROR", "Nothing to view");
+ return;
+ }
+ String fileName = System.getProperty("user.home") + File.separator + "out.html";
+ try {
+ Lib.writeStringToFile(htmlText, new File(fileName));
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ Program.launch(fileName);
+ }
+ });
+
+ item = new MenuItem(menu, SWT.NONE);
+ item.setText("Print");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (htmlText == null || htmlText.equals("")) {
+ AWorkbench.popup("ERROR", "Nothing to print");
+ return;
+ }
+ browser.setUrl("javascript:print()");
+ }
+ });
+
+ item = new MenuItem(menu, SWT.NONE);
+ item.setText("Email");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (htmlText == null || htmlText.equals("")) {
+ AWorkbench.popup("ERROR", "Nothing to email");
+ return;
+ }
+ Set<Manipulations> manipulations = new HashSet<Manipulations>();
+ manipulations.add(Manipulations.ALL);
+ manipulations.add(Manipulations.ERROR_WARNING_HEADER);
+ Dialogs.emailDialog(title, htmlText);
+ }
+ });
+ item = new MenuItem(menu, SWT.NONE);
+ item.setText("Export Table");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Dialogs.exportHtmlTableDialog(title, htmlText, true);
+ }
+ });
+ item = new MenuItem(menu, SWT.NONE);
+ item.setText("Save to File");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Dialogs.saveHtmlDialog(htmlText, true);
+ }
+ });
+ return menu;
+ }
+
+ /**
+ * @return the browser
+ */
+ public Browser getBrowser() {
+ return browser;
+ }
+
+ /**
+ * @return the htmlText
+ */
+ public String getHtmlText() {
+ return htmlText;
+ }
+
+ /**
+ * @param htmlText the htmlText to set
+ */
+ public void setHtmlText(String htmlText) {
+ setHtmlText(htmlText, title);
+ }
+
+ /**
+ * @param title
+ * @param htmlText
+ */
+ public void setHtmlText(String htmlText, String title) {
+ this.htmlText = htmlText;
+ this.title = title;
+ if (browser != null && !browser.isDisposed()) {
+ browser.setText(htmlText);
+ }
+ }
+
+ /**
+ * @return the title
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * @param title the title to set
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsEditorTableTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsEditorTableTab.java
new file mode 100644
index 00000000000..5d604e9013d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsEditorTableTab.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.framework.ui.skynet.results.table;
+
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IResultsEditorTableTab extends IResultsEditorTab {
+
+ public List<XViewerColumn> getTableColumns() throws OseeCoreException;
+
+ public Collection<IResultsXViewerRow> getTableRows() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsXViewerRow.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsXViewerRow.java
new file mode 100644
index 00000000000..212f2509bf1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/IResultsXViewerRow.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.framework.ui.skynet.results.table;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IResultsXViewerRow {
+
+ public String getValue(int col);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsEditorTableTab.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsEditorTableTab.java
new file mode 100644
index 00000000000..46e7c34b2c9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsEditorTableTab.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.framework.ui.skynet.results.table;
+
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerTreeReport;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.results.ResultsEditor;
+import org.eclipse.osee.framework.ui.skynet.results.table.xresults.ResultsXViewer;
+import org.eclipse.osee.framework.ui.skynet.results.table.xresults.ResultsXViewerContentProvider;
+import org.eclipse.osee.framework.ui.skynet.results.table.xresults.ResultsXViewerLabelProvider;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+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.widgets.Composite;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsEditorTableTab implements IResultsEditorTableTab {
+
+ private final String tabName;
+ private final List<XViewerColumn> columns;
+ private final Collection<IResultsXViewerRow> rows;
+ private ResultsXViewer resultsXViewer;
+
+ public ResultsEditorTableTab(String tabName, List<XViewerColumn> columns, Collection<IResultsXViewerRow> rows) {
+ this.tabName = tabName;
+ this.columns = columns;
+ this.rows = rows;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTableTab#getTableColumns()
+ */
+ @Override
+ public List<XViewerColumn> getTableColumns() throws OseeCoreException {
+ return columns;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTableTab#getTableRows()
+ */
+ @Override
+ public Collection<IResultsXViewerRow> getTableRows() throws OseeCoreException {
+ return rows;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab#getTabName()
+ */
+ @Override
+ public String getTabName() {
+ return tabName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.IResultsEditorTab#createTab(org.eclipse.swt.widgets.Composite, org.eclipse.osee.framework.ui.skynet.results.ResultsEditor)
+ */
+ @Override
+ public Composite createTab(Composite parent, ResultsEditor resultsEditor) throws OseeCoreException {
+ Composite comp = ALayout.createCommonPageComposite(parent);
+ ToolBar toolBar = resultsEditor.createToolBar(comp);
+ addToolBarItems(toolBar);
+
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ resultsXViewer = new ResultsXViewer(comp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, getTableColumns());
+ resultsXViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ resultsXViewer.setContentProvider(new ResultsXViewerContentProvider());
+ resultsXViewer.setLabelProvider(new ResultsXViewerLabelProvider(resultsXViewer));
+ resultsXViewer.setInput(getTableRows());
+ resultsXViewer.getTree().setLayoutData(gd);
+ return comp;
+ }
+
+ private void addToolBarItems(ToolBar toolBar) {
+ ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.EXPORT_TABLE));
+ item.setToolTipText("Export Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ XViewerTreeReport report = resultsXViewer.getXViewerFactory().getXViewerTreeReport(resultsXViewer);
+ if (report != null) {
+ report.open();
+ } else {
+ new XViewerTreeReport(resultsXViewer).open();
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsXViewerRow.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsXViewerRow.java
new file mode 100644
index 00000000000..41267ca7986
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/ResultsXViewerRow.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.framework.ui.skynet.results.table;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsXViewerRow implements IResultsXViewerRow {
+
+ private final List<String> values;
+ private final Artifact doubleClickOpenArtifact;
+
+ public ResultsXViewerRow(List<String> values, Artifact doubleClickOpenArtifact) {
+ this.doubleClickOpenArtifact = doubleClickOpenArtifact;
+ this.values = values;
+ }
+
+ public ResultsXViewerRow(List<String> values) {
+ this(values, null);
+ }
+
+ public ResultsXViewerRow(String[] values, Artifact doubleClickOpenArtifact) {
+ this(Arrays.asList(values), doubleClickOpenArtifact);
+ }
+
+ public ResultsXViewerRow(String[] values) {
+ this(Arrays.asList(values), null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.results.xresults.IXViewerTestTask#getValue(int)
+ */
+ @Override
+ public String getValue(int col) {
+ return values.get(col);
+ }
+
+ /**
+ * @return the doubleClickOpenArtifact
+ */
+ public Artifact getDoubleClickOpenArtifact() {
+ return doubleClickOpenArtifact;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewer.java
new file mode 100644
index 00000000000..b99562d42fb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewer.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.framework.ui.skynet.results.table.xresults;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.results.table.ResultsXViewerRow;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsXViewer extends XViewer {
+
+ /**
+ * @param parent
+ * @param style
+ * @param namespace
+ * @param viewerFactory
+ */
+ public ResultsXViewer(Composite parent, int style, List<XViewerColumn> xColumns) {
+ super(parent, style, new ResultsXViewerFactory(xColumns));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewer#handleDoubleClick()
+ */
+ @Override
+ public void handleDoubleClick() {
+ if (getSelectedRows().size() > 0) {
+ Artifact art = getSelectedRows().iterator().next().getDoubleClickOpenArtifact();
+ if (art != null) {
+ RendererManager.openInJob(art, PresentationType.GENERALIZED_EDIT);
+ }
+ }
+ }
+
+ public ArrayList<ResultsXViewerRow> getSelectedRows() {
+ ArrayList<ResultsXViewerRow> arts = new ArrayList<ResultsXViewerRow>();
+ TreeItem items[] = getTree().getSelection();
+ for (TreeItem item : items)
+ arts.add((ResultsXViewerRow) item.getData());
+ return arts;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerContentProvider.java
new file mode 100644
index 00000000000..46468539705
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerContentProvider.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.framework.ui.skynet.results.table.xresults;
+
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.ui.skynet.results.table.IResultsXViewerRow;
+
+public class ResultsXViewerContentProvider implements ITreeContentProvider {
+
+ protected Collection<IResultsXViewerRow> rootSet = new HashSet<IResultsXViewerRow>();
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public ResultsXViewerContentProvider() {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) {
+ return (Object[]) parentElement;
+ }
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the rootSet
+ */
+ public Collection<IResultsXViewerRow> getRootSet() {
+ return rootSet;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerFactory.java
new file mode 100644
index 00000000000..a1f287e2ac8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerFactory.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.framework.ui.skynet.results.table.xresults;
+
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomizations;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ResultsXViewerFactory extends XViewerFactory {
+
+ private static String COLUMN_NAMESPACE = "org.eclipse.osee.table";
+ private final List<XViewerColumn> columns;
+
+ public ResultsXViewerFactory(List<XViewerColumn> columns) {
+ super("xviewer.test");
+ this.columns = columns;
+ for (XViewerColumn xCol : columns) {
+ registerColumn(xCol);
+ }
+ }
+
+ @Override
+ public IXViewerCustomizations getXViewerCustomizations() {
+ return new XViewerCustomizations();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.IXViewerFactory#isAdmin()
+ */
+ @Override
+ public boolean isAdmin() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerLabelProvider.java
new file mode 100644
index 00000000000..23ed017cd1e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/results/table/xresults/ResultsXViewerLabelProvider.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.framework.ui.skynet.results.table.xresults;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.results.table.IResultsXViewerRow;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+public class ResultsXViewerLabelProvider extends XViewerLabelProvider {
+ Font font = null;
+ private final ResultsXViewer resultsXViewer;
+
+ public ResultsXViewerLabelProvider(ResultsXViewer resultsXViewer) {
+ super(resultsXViewer);
+ this.resultsXViewer = resultsXViewer;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn xCol, int columnIndex) {
+ if (element instanceof String) {
+ if (columnIndex == 1)
+ return (String) element;
+ else
+ return "";
+ }
+ IResultsXViewerRow task = ((IResultsXViewerRow) element);
+ if (task == null) return "";
+ return task.getValue(columnIndex);
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerLabelProvider#getColumnImage(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int)
+ */
+ @Override
+ public Color getBackground(Object element, int columnIndex) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertContentProvider.java
new file mode 100644
index 00000000000..a198344cfdf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertContentProvider.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.framework.ui.skynet.revert;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ArtifactContentProvider;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Combo;
+
+/**
+ * @author Theron Virgin
+ */
+public class RevertContentProvider extends ArtifactContentProvider {
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactContentProvider#getChildren(java.lang.Object)
+ */
+ private Combo artifactSelectionBox = null;
+ private List<List<Artifact>> artifacts = null;
+
+ public RevertContentProvider(Combo artifactSelectionBox, List<List<Artifact>> artifacts) {
+ super();
+ this.artifactSelectionBox = artifactSelectionBox;
+ this.artifacts = artifacts;
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Artifact) {
+ Artifact parentItem = (Artifact) parentElement;
+ if (!RevertDeletionCheck.isRootArtifact(parentItem, artifactSelectionBox, artifacts)) {
+ return EMPTY_ARRAY;
+ }
+ try {
+ if (AccessControlManager.checkObjectPermission(parentItem, PermissionEnum.READ)) {
+ Collection<Artifact> children = parentItem.getChildren();
+ if (children != null) {
+ List<Artifact> childs = new ArrayList<Artifact>();
+ for (Artifact artifact : children) {
+ if (RevertDeletionCheck.relationWillBeReverted(artifact)) {
+ childs.add(artifact);
+ }
+ }
+ return childs.toArray();
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (parentElement instanceof Collection) {
+ return ((Collection<?>) parentElement).toArray();
+ }
+
+ return EMPTY_ARRAY;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactContentProvider#hasChildren(java.lang.Object)
+ */
+ @Override
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertDeletionCheck.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertDeletionCheck.java
new file mode 100644
index 00000000000..5e4bcf9d65d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertDeletionCheck.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.framework.ui.skynet.revert;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.swt.widgets.Combo;
+
+/**
+ * @author Theron Virgin
+ */
+public class RevertDeletionCheck {
+
+ public static boolean relationWillBeReverted(Artifact artifact) throws OseeCoreException {
+ RelationLink link;
+ boolean linkToDelete = false;
+ List<RelationLink> childLinks = artifact.getRelations(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__PARENT);
+ if (childLinks != null && !childLinks.isEmpty()) {
+ link = childLinks.get(0);
+ linkToDelete = ArtifactPersistenceManager.isRelationNewOnBranch(link, artifact.getBranch());
+ }
+ return linkToDelete;
+ }
+
+ public static boolean isRootArtifact(Artifact artifact, Combo selBox, List<List<Artifact>> artifacts) {
+ int index = selBox.getSelectionIndex() == -1 ? 0 : selBox.getSelectionIndex();
+ Artifact HeadArtifact = artifacts.get(index).get(0);
+ boolean rootArtifact = false;
+ if (artifact.equals(HeadArtifact)) {
+ rootArtifact = true;
+ }
+ return rootArtifact;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertLabelProvider.java
new file mode 100644
index 00000000000..77bbbe63b52
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertLabelProvider.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.framework.ui.skynet.revert;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Combo;
+
+public class RevertLabelProvider extends LabelProvider { //StyledCellLabelProvider {
+ private static final OseeUiActivator plugin = SkynetGuiPlugin.getInstance();
+ private Combo artifactSelectionBox = null;
+ private List<List<Artifact>> artifacts = null;
+
+ public RevertLabelProvider(Combo artifactSelectionBox, List<List<Artifact>> artifacts) {
+ super();
+ this.artifactSelectionBox = artifactSelectionBox;
+ this.artifacts = artifacts;
+ }
+
+ /*
+ * @see ILabelProvider#getImage(Object)
+ */
+ public Image getImage(Object element) {
+ if (element instanceof Artifact) {
+ return ImageManager.getImage((Artifact) element);
+ } else if (element instanceof Match && ((Match) element).getElement() instanceof Artifact) {
+ return ImageManager.getImage((Artifact) ((Match) element).getElement());
+ }
+ return super.getImage(element);
+ }
+
+ /*
+ * @see ILabelProvider#getText(Object)
+ */
+ public String getText(Object element) {
+ if (element instanceof Match) {
+ element = ((Match) element).getElement();
+ }
+
+ if (element instanceof Artifact) {
+ Artifact artifact = (Artifact) element;
+
+ String name = artifact.getDescriptiveName();
+ boolean toDelete = false;
+ boolean linkToDelete = false;
+ boolean rootArtifact = RevertDeletionCheck.isRootArtifact(artifact, artifactSelectionBox, artifacts);
+ try {
+ linkToDelete = RevertDeletionCheck.relationWillBeReverted(artifact);
+ toDelete = ArtifactPersistenceManager.isArtifactNewOnBranch(artifact);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ if (rootArtifact) {
+ if (toDelete) {
+ name += " --<Will be Deleted>--";
+ } else {
+ if (artifact.isDeleted()) {
+ name += " --<Will be Undeleted>--";
+ } else {
+ name += " --<Will Revert to Begining Value>--";
+ }
+ }
+ }
+ if (!rootArtifact) {
+ if (linkToDelete && !rootArtifact) {
+ name += " --<Will be Orphaned>--";
+ } else {
+ }
+ }
+ return name;
+ } else {
+ return element.toString();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizard.java
new file mode 100644
index 00000000000..ab2c032fb14
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizard.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.framework.ui.skynet.revert;
+
+import java.util.List;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author fw314c
+ */
+public class RevertWizard extends Wizard {
+ private List<List<Artifact>> artifacts;
+ private RevertWizardPage revertWizardPage;
+
+ public RevertWizard(List<List<Artifact>> artifacts) {
+ this.artifacts = artifacts;
+ }
+
+ @Override
+ public void addPages() {
+ revertWizardPage = new RevertWizardPage(artifacts);
+ addPage(revertWizardPage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ return revertWizardPage.closingPage();
+ }
+
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ public boolean getResolved() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#getStartingPage()
+ */
+ @Override
+ public IWizardPage getStartingPage() {
+ return getPage(revertWizardPage.TITLE);
+ }
+
+ @Override
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performCancel()
+ */
+ @Override
+ public boolean performCancel() {
+ return super.performCancel();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizardPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizardPage.java
new file mode 100644
index 00000000000..6268de4b97c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/revert/RevertWizardPage.java
@@ -0,0 +1,260 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.revert;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationModType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.ui.skynet.ArtifactDoubleClick;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.RevertJob;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.custom.TreeEditor;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Theron Virgin
+ */
+public class RevertWizardPage extends WizardPage implements IRelationModifiedEventListener {
+
+ private List<List<Artifact>> artifacts;
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.revert.RevertWizardPage";
+ public static final String TITLE = "Revert Artifacts Page";
+ private TreeViewer treeViewer;
+ private Button revertSelectedButton;
+ private Button revertAllButton;
+ private Combo artifactSelectionBox;
+ private final Listener listener = new Listener() {
+ public void handleEvent(Event event) {
+ try {
+ if (event.widget == revertAllButton) {
+ List<Artifact> revertList = new LinkedList<Artifact>();
+ for (List<Artifact> artList : artifacts) {
+ if (!artList.isEmpty()) {
+ revertList.add(artList.get(0));
+ }
+ }
+ Jobs.startJob(new RevertJob(revertList));
+ artifactSelectionBox.setItems(new String[] {});
+ treeViewer.setInput(null);
+ }
+ if (event.widget == revertSelectedButton) {
+ int index = artifactSelectionBox.getSelectionIndex();
+ Jobs.startJob(new RevertJob(artifacts.get(index)));
+ artifacts.remove(index);
+ artifactSelectionBox.remove(index);
+ if (artifacts.isEmpty()) {
+ treeViewer.setInput(null);
+ } else {
+ treeViewer.setInput(artifacts.get(0));
+ artifactSelectionBox.select(0);
+ }
+ }
+ if (event.widget == revertAllButton || event.widget == revertSelectedButton) {
+ }
+ if (event.widget == artifactSelectionBox) {
+ treeViewer.setInput(artifacts.get(artifactSelectionBox.getSelectionIndex()));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(RevertWizardPage.class, Level.WARNING, ex);
+ }
+ getWizard().getContainer().updateButtons();
+ }
+ };
+
+ /**
+ * @param pageName
+ */
+
+ public RevertWizardPage(List<List<Artifact>> artifacts) {
+ super(TITLE);
+ this.artifacts = artifacts;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ setTitle("The Revert Wizard");
+ // Composite composite = new Composite(parent, SWT.NONE);
+
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 300;
+ gridData.widthHint = 100;
+
+ parent.setLayout(new GridLayout(1, false));
+ parent.setLayoutData(gridData);
+
+ new Label(parent, SWT.LEFT).setText("Artifact to Revert");
+ gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 200;
+ gridData.widthHint = 75;
+
+ artifactSelectionBox = new Combo(parent, SWT.READ_ONLY);
+ List<String> comboValues = new ArrayList<String>();
+ for (List<Artifact> artList : artifacts) {
+ comboValues.add(artList.get(0).getDescriptiveName());
+ }
+ artifactSelectionBox.setItems(comboValues.toArray(new String[comboValues.size()]));
+ artifactSelectionBox.addListener(SWT.Selection, listener);
+
+ new Label(parent, SWT.LEFT).setText("Revert Effects");
+
+ Composite stackComposite = new Composite(parent, SWT.NONE);
+ StackLayout stackLayout = new StackLayout();
+ stackComposite.setLayout(stackLayout);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ data.minimumHeight = 100;
+ stackComposite.setLayoutData(data);
+
+ treeViewer = new TreeViewer(stackComposite);
+ Tree tree = treeViewer.getTree();
+ treeViewer.setContentProvider(new RevertContentProvider(artifactSelectionBox, artifacts));
+ treeViewer.setLabelProvider(new RevertLabelProvider(artifactSelectionBox, artifacts));
+ treeViewer.addDoubleClickListener(new ArtifactDoubleClick());
+ treeViewer.getControl().setLayoutData(gridData);
+
+ treeViewer.setUseHashlookup(false);
+ treeViewer.setInput(artifacts != null ? artifacts.get(0) : null);
+
+ TreeEditor myTreeEditor = new TreeEditor(tree);
+ myTreeEditor.horizontalAlignment = SWT.LEFT;
+ myTreeEditor.grabHorizontal = true;
+ myTreeEditor.minimumWidth = 50;
+ stackLayout.topControl = treeViewer.getTree();
+ stackComposite.layout();
+ stackComposite.getParent().layout();
+
+ new RevertDragAndDrop(tree, ArtifactExplorer.VIEW_ID);
+
+ gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 200;
+ gridData.widthHint = 75;
+ Composite buttonComposite = new Composite(parent, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout(2, false));
+
+ revertSelectedButton = createButton("Revert Selected Artifact", "Show Previous Revert Artifact", buttonComposite);
+ revertAllButton = createButton("Revert All Artifacts", "Show Next Revert Artifact", buttonComposite);
+
+ new Label(parent, SWT.LEFT).setText("Cycle through the artifacts and expand the tree to see any unintended \nconsequences of reverting. \n\nYou must restart OSEE to see the results of the revert.");
+ artifactSelectionBox.select(0);
+ setControl(parent);
+
+ OseeEventManager.addListener(this);
+ }
+
+ private Button createButton(String text, String tooltip, Composite composite) {
+ Button button = new Button(composite, SWT.PUSH);
+ button.addListener(SWT.Selection, listener);
+ button.setText(text);
+ button.setToolTipText(tooltip);
+ return button;
+ }
+
+ public boolean canFinish() {
+ return true;
+ }
+
+ public boolean closingPage() {
+ OseeEventManager.removeListener(this);
+ return true;
+ }
+
+ private class RevertDragAndDrop extends SkynetDragAndDrop {
+
+ public RevertDragAndDrop(Tree tree, String viewId) {
+ super(tree, tree, viewId);
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection();
+ Object[] objects = selection.toArray();
+ Artifact[] artifacts = new Artifact[objects.length];
+
+ for (int index = 0; index < objects.length; index++)
+ artifacts[index] = (Artifact) objects[index];
+
+ return artifacts;
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
+
+ if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ event.detail = DND.DROP_COPY;
+ } else if (isValidForArtifactDrop(event)) {
+ event.detail = DND.DROP_MOVE;
+ } else {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+
+ private boolean isValidForArtifactDrop(DropTargetEvent event) {
+ return false;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IRelationModifiedEventListener#handleRelationModifiedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.relation.RelationModType, org.eclipse.osee.framework.skynet.core.relation.RelationLink, org.eclipse.osee.framework.skynet.core.artifact.Branch, java.lang.String)
+ */
+ @Override
+ public void handleRelationModifiedEvent(Sender sender, RelationModType relationModType, RelationLink link, Branch branch, String relationType) {
+ // Since this is always a local event, artifact will always be in cache
+ try {
+ Artifact aArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_A);
+ if (aArtifact != null) {
+ treeViewer.refresh(aArtifact);
+ }
+ } catch (Exception ex) {
+ //Ignore and hide
+ }
+ try {
+ Artifact bArtifact = link.getArtifactIfLoaded(RelationSide.SIDE_B);
+ if (bArtifact != null) {
+ treeViewer.refresh(bArtifact);
+ }
+ } catch (Exception ex) {
+ //Ignore and hide
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchQuery.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchQuery.java
new file mode 100644
index 00000000000..41bd81b2264
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchQuery.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.framework.ui.skynet.search;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+
+public abstract class AbstractArtifactSearchQuery implements ISearchQuery {
+ protected ArtifactSearchResult aResult;
+ private boolean doneRunning;
+
+ public boolean canRunInBackground() {
+ return true;
+ }
+
+ public String getLabel() {
+ return "Artifact Search";
+ }
+
+ protected void setIsDoneRunning(boolean isDoneRunning) {
+ this.doneRunning = isDoneRunning;
+ }
+
+ public abstract IStatus run(final IProgressMonitor pm);
+
+ public String getResultLabel() {
+ String branch = "";
+ if (aResult.getArtifactResults() != null && !aResult.getArtifactResults().isEmpty()) {
+ branch = " on Branch: \"" + aResult.getArtifactResults().get(0).getBranch().getBranchShortName() + "\"";
+ }
+ return getCriteriaLabel() + " - " + (doneRunning ? (aResult.getMatchCount() + " matches" + branch) : "busy");
+ }
+
+ public abstract String getCriteriaLabel();
+
+ public boolean canRerun() {
+ return true;
+ }
+
+ public ISearchResult getSearchResult() {
+ if (aResult == null) {
+ aResult = new ArtifactSearchResult(this);
+ }
+ return aResult;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchResult.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchResult.java
new file mode 100644
index 00000000000..7c509870a51
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractArtifactSearchResult.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.framework.ui.skynet.search;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditorInput;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.IEditorMatchAdapter;
+import org.eclipse.search.ui.text.IFileMatchAdapter;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public abstract class AbstractArtifactSearchResult extends AbstractTextSearchResult implements IEditorMatchAdapter {
+ private final Match[] EMPTY_ARR = new Match[0];
+
+ /**
+ * Constructs a new <code>AbstractTextSearchResult</code>
+ */
+ protected AbstractArtifactSearchResult() {
+ super();
+ }
+
+ public List<Artifact> getArtifactResults() {
+ List<Artifact> toReturn = new ArrayList<Artifact>();
+ for (Object element : getElements()) {
+ if (element instanceof Artifact) {
+ toReturn.add((Artifact) element);
+ }
+ }
+ return toReturn;
+ }
+
+ // /**
+ // * Removes the children artifacts from the search
+ // *
+ // * @param children
+ // */
+ // public void removeArtifacts(Collection<Artifact> children) {
+ // for (Artifact artifact : children) {
+ // Match match = artifacts.get(artifact);
+ // removeMatch(match);
+ // artifacts.remove(artifact);
+ //
+ // try {
+ // // remove all of its children
+ // removeArtifacts(artifact.getChildren());
+ // } catch (OseeCoreException ex) {
+ // OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ // }
+ // }
+ // }
+
+ public boolean hasAttributeMatches() {
+ return true; //!attributes.isEmpty();
+ }
+
+ public IEditorMatchAdapter getEditorMatchAdapter() {
+ return this;
+ }
+
+ public boolean isShownInEditor(Match match, IEditorPart editor) {
+ IEditorInput ei = editor.getEditorInput();
+ if (ei instanceof ArtifactEditorInput) {
+ ArtifactEditorInput fi = (ArtifactEditorInput) ei;
+ return match.getElement().equals(fi.getArtifact());
+ }
+ return false;
+ }
+
+ public Match[] computeContainedMatches(AbstractTextSearchResult result, IEditorPart editor) {
+ IEditorInput ei = editor.getEditorInput();
+ if (ei instanceof ArtifactEditorInput) {
+ ArtifactEditorInput fi = (ArtifactEditorInput) ei;
+ return getMatches(fi.getArtifact());
+ }
+ return EMPTY_ARR;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.search.ui.text.AbstractTextSearchResult#getFileMatchAdapter()
+ */
+ @Override
+ public IFileMatchAdapter getFileMatchAdapter() {
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractLegacyArtifactSearchQuery.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractLegacyArtifactSearchQuery.java
new file mode 100644
index 00000000000..467d8eeef25
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AbstractLegacyArtifactSearchQuery.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.framework.ui.skynet.search;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractLegacyArtifactSearchQuery extends AbstractArtifactSearchQuery {
+
+ protected abstract Collection<Artifact> getArtifacts() throws Exception;
+
+ public IStatus run(final IProgressMonitor pm) {
+ setIsDoneRunning(false);
+ aResult.removeAll();
+ try {
+ for (Artifact artifact : getArtifacts()) {
+ Match match = new Match(artifact, 1, 2);
+ aResult.addMatch(match);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ setIsDoneRunning(true);
+ return new MultiStatus(NewSearchUI.PLUGIN_ID, IStatus.OK, "OK", null);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchPage.java
new file mode 100644
index 00000000000..366cfe184e9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchPage.java
@@ -0,0 +1,598 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterModel;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterModelList;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.osee.framework.ui.skynet.search.page.AbstractArtifactSearchViewPage;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.HyperLinkLabel;
+import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
+import org.eclipse.search.ui.IReplacePage;
+import org.eclipse.search.ui.ISearchPage;
+import org.eclipse.search.ui.ISearchPageContainer;
+import org.eclipse.search.ui.ISearchResultPage;
+import org.eclipse.search.ui.ISearchResultViewPart;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+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.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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public class ArtifactSearchPage extends DialogPage implements ISearchPage, IReplacePage {
+ private static final Pattern storageStringPattern = Pattern.compile("(.*?);(.*?);(.*?);(.*)");
+ private static final Pattern notSearchPrimitivePattern = Pattern.compile("Not \\[(.*)\\]");
+ private static final String FILTERS_STORAGE_KEY = ".filters";
+
+ private static ISearchPageContainer aContainer;
+
+ private Button addButton;
+ private Button allButton;
+ private Button atLeastOneButton;
+ private ComboViewer searchTypeList;
+ private Button notButton;
+
+ private StackLayout selectionLayout;
+ private static FilterTableViewer filterviewer;
+ private Composite artifactTypeControls;
+ private ListViewer artifactTypeList;
+
+ private XBranchSelectWidget branchSelect;
+
+ private SearchFilter HRID_VALUE_FILTER;
+ private SearchFilter ATTRIBUTE_VALUE_FILTER;
+ private static int lastSearchTypeListSelected = 2; // Attribute
+ private static int lastAttributeTypeListSelected = 0; // Name
+
+ private final Matcher storageStringMatcher = storageStringPattern.matcher("");
+ private final Matcher notSearchPrimitiveMatcher = notSearchPrimitivePattern.matcher("");
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+ boolean isConnectionOk = DbConnectionExceptionComposite.dbConnectionIsOk(parent);
+ if (isConnectionOk != false) {
+ Composite mainComposite = new Composite(parent, SWT.NONE);
+ mainComposite.setFont(parent.getFont());
+ mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainComposite.setLayout(new GridLayout());
+
+ branchSelect = new XBranchSelectWidget("Branch To Search");
+ branchSelect.setDisplayLabel(false);
+ branchSelect.setBranch(BranchManager.getLastBranch());
+ branchSelect.createWidgets(mainComposite, 2);
+
+ addFilterControls(mainComposite);
+ addTableControls(mainComposite);
+ addSearchScope(mainComposite);
+ addFilterListeners();
+
+ setControl(parent);
+ aContainer.setPerformActionEnabled(false);
+
+ SkynetGuiPlugin.getInstance().setHelp(mainComposite, "artifact_search");
+
+ updateWidgets();
+
+ loadState();
+ } else {
+ setControl(parent);
+ }
+ }
+
+ private Branch getSelectedBranch() {
+ return branchSelect.getData();
+ }
+
+ /**
+ * Controls to allow the user to select wether all the filters are combined using AND or OR
+ */
+ private void addSearchScope(Composite composite) {
+ Group allSelectionGroup = new Group(composite, SWT.NONE);
+ allSelectionGroup.setText("Artifacts that match");
+ allSelectionGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ allSelectionGroup.setLayout(new GridLayout(2, false));
+
+ allButton = new Button(allSelectionGroup, SWT.RADIO);
+ allButton.setText("All filters (AND)");
+ allButton.setSelection(true);
+
+ atLeastOneButton = new Button(allSelectionGroup, SWT.RADIO);
+ atLeastOneButton.setText("At least one filter (OR)");
+ }
+
+ private void createArtifactTypeSearchControls(Composite optionsComposite) {
+ artifactTypeControls = new Composite(optionsComposite, SWT.NONE);
+ artifactTypeControls.setLayout(new GridLayout(1, true));
+
+ artifactTypeList = new ListViewer(artifactTypeControls);
+ GridData gd = new GridData();
+ gd.heightHint = 100;
+ artifactTypeList.getList().setLayoutData(gd);
+ artifactTypeList.setContentProvider(new SearchContentProvider());
+ artifactTypeList.setLabelProvider(new SearchLabelProvider());
+ artifactTypeList.setSorter(new SearchSorter());
+
+ try {
+ for (ArtifactType descriptor : TypeValidityManager.getValidArtifactTypes(getSelectedBranch())) {
+ artifactTypeList.add(descriptor.getName());
+ artifactTypeList.setData(descriptor.getName(), descriptor);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Error encountered while getting list of artifact types", ex);
+ }
+ addToSearchTypeList(new ArtifactTypeFilter(artifactTypeControls, artifactTypeList));
+ }
+
+ private void createOrphanSearchControls(Composite optionsComposite) {
+ //uses the artifactTypeList from Artifact_type_filter
+ artifactTypeList.getList().select(0);
+ addToSearchTypeList(new OrphanSearchFilter("Orphan Search", artifactTypeControls, artifactTypeList));
+ }
+
+ private void addToSearchTypeList(SearchFilter filter) {
+ searchTypeList.add(filter.getFilterName());
+ searchTypeList.setData(filter.getFilterName(), filter);
+ }
+
+ private void createRelationSearchControls(Composite optionsComposite) {
+ Composite relationControls = new Composite(optionsComposite, SWT.NONE);
+ relationControls.setLayout(new GridLayout(2, true));
+
+ final ComboViewer relationTypeList = new ComboViewer(relationControls, SWT.DROP_DOWN | SWT.READ_ONLY);
+ relationTypeList.setContentProvider(new SearchContentProvider());
+ relationTypeList.setLabelProvider(new SearchLabelProvider());
+ relationTypeList.setSorter(new SearchSorter());
+ final ComboViewer relationSideList = new ComboViewer(relationControls, SWT.DROP_DOWN | SWT.READ_ONLY);
+ relationSideList.setContentProvider(new SearchContentProvider());
+ relationSideList.setLabelProvider(new SearchLabelProvider());
+ relationSideList.setSorter(new SearchSorter());
+
+ try {
+ for (RelationType linkDescriptor : RelationTypeManager.getValidTypes(getSelectedBranch())) {
+ relationTypeList.add(linkDescriptor.getTypeName());
+ relationTypeList.setData(linkDescriptor.getTypeName(), linkDescriptor);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ relationTypeList.getCombo().addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ relationSideList.getCombo().removeAll();
+ RelationType linkDescriptor =
+ (RelationType) relationTypeList.getData(relationTypeList.getCombo().getText());
+ relationSideList.add(linkDescriptor.getSideAName());
+ relationSideList.add(linkDescriptor.getSideBName());
+ relationSideList.getCombo().select(0);
+ }
+ });
+ relationTypeList.getCombo().setVisibleItemCount(Math.min(relationTypeList.getCombo().getItemCount(), 15));
+
+ if (relationTypeList.getCombo().getItemCount() > 0) { // ensure we don't get a null pointer
+ // exception when there are no relation types in the db
+ relationTypeList.getCombo().select(0);
+ RelationType linkDescriptor = (RelationType) relationTypeList.getData(relationTypeList.getCombo().getText());
+ relationSideList.add(linkDescriptor.getSideAName());
+ relationSideList.add(linkDescriptor.getSideBName());
+ relationSideList.getCombo().select(0);
+ }
+
+ addToSearchTypeList(new InRelationFilter(relationControls, relationTypeList, relationSideList));
+ }
+
+ private void createHridSearchControls(Composite optionsComposite) {
+ Composite hridControls = new Composite(optionsComposite, SWT.NONE);
+ hridControls.setLayout(new GridLayout(2, false));
+
+ Label typeLabel = new Label(hridControls, SWT.HORIZONTAL);
+ typeLabel.setText("Human Readable ID:");
+ Text hridValue = new Text(hridControls, SWT.BORDER);
+ hridValue.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ hridValue.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ addButton.setEnabled(HRID_VALUE_FILTER.isValid());
+ }
+ });
+
+ new Label(hridControls, SWT.NONE);
+
+ Label wildLabel = new Label(hridControls, SWT.NONE);
+ wildLabel.setText("(* = any string, \\* = literal *)");
+
+ HRID_VALUE_FILTER = new HridValueFilter(hridControls, hridValue);
+ addToSearchTypeList(HRID_VALUE_FILTER);
+ }
+
+ private void createAttributeSearchControls(Composite optionsComposite) {
+ Composite attributeControls = new Composite(optionsComposite, SWT.NONE);
+ attributeControls.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ attributeControls.setLayout(new GridLayout(2, false));
+
+ Label typeLabel = new Label(attributeControls, SWT.HORIZONTAL);
+ typeLabel.setText("Attribute Type:");
+
+ final ComboViewer attributeTypeList = new ComboViewer(attributeControls, SWT.DROP_DOWN | SWT.READ_ONLY);
+ attributeTypeList.setContentProvider(new SearchContentProvider());
+ attributeTypeList.setLabelProvider(new SearchLabelProvider());
+ attributeTypeList.setSorter(new SearchSorter());
+
+ Label valueLabel = new Label(attributeControls, SWT.HORIZONTAL);
+ valueLabel.setText("Attribute Value:");
+
+ Text attributeValue = new Text(attributeControls, SWT.BORDER);
+ attributeValue.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ try {
+ for (AttributeType type : TypeValidityManager.getValidAttributeTypes(getSelectedBranch())) {
+ attributeTypeList.add(type.getName());
+ attributeTypeList.setData(type.getName(), type);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Error encountered while getting list of attribute types", ex);
+ }
+ attributeTypeList.getCombo().setVisibleItemCount(Math.min(attributeTypeList.getCombo().getItemCount(), 15));
+ attributeTypeList.getCombo().select(lastAttributeTypeListSelected);
+ attributeTypeList.addSelectionChangedListener(new ISelectionChangedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ lastAttributeTypeListSelected = attributeTypeList.getCombo().getSelectionIndex();
+ }
+ });
+
+ attributeValue.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ addButton.setEnabled(ATTRIBUTE_VALUE_FILTER.isValid());
+ }
+ });
+
+ new Label(attributeControls, SWT.NONE); // spacerLabelSoTheNextOneWillBeInColumnTwo
+
+ Label wildLabel = new Label(attributeControls, SWT.NONE);
+ wildLabel.setText("(* = any string, \\* = literal *)");
+
+ ATTRIBUTE_VALUE_FILTER = new AttributeValueFilter(attributeControls, attributeTypeList, attributeValue);
+ addToSearchTypeList(ATTRIBUTE_VALUE_FILTER);
+ }
+
+ private void addFilterControls(Composite mainComposite) {
+ Group filterGroup = new Group(mainComposite, SWT.NONE);
+ filterGroup.setText("Create a Filter");
+ filterGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ filterGroup.setLayout(new GridLayout());
+
+ Composite composite = new Composite(filterGroup, SWT.BORDER);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ composite.setLayout(new GridLayout(2, false));
+
+ searchTypeList = new ComboViewer(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
+ searchTypeList.setContentProvider(new SearchContentProvider());
+ searchTypeList.setLabelProvider(new SearchLabelProvider());
+ searchTypeList.setSorter(new SearchSorter());
+
+ notButton = new Button(composite, SWT.CHECK);
+ notButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false));
+ notButton.setText("Not Equal");
+
+ selectionLayout = new StackLayout();
+
+ Composite optionsComposite = new Composite(filterGroup, SWT.BORDER);
+ optionsComposite.setLayout(new GridLayout());
+ optionsComposite.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
+
+ optionsComposite.setLayout(selectionLayout);
+ createAttributeSearchControls(optionsComposite);
+ createArtifactTypeSearchControls(optionsComposite);
+ createOrphanSearchControls(optionsComposite);
+ createRelationSearchControls(optionsComposite);
+ createHridSearchControls(optionsComposite);
+
+ searchTypeList.getCombo().setVisibleItemCount(7);
+ searchTypeList.getCombo().select(lastSearchTypeListSelected);
+ searchTypeList.addSelectionChangedListener(new ISelectionChangedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ lastSearchTypeListSelected = searchTypeList.getCombo().getSelectionIndex();
+ }
+ });
+ addButton = new Button(filterGroup, SWT.PUSH);
+ addButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false));
+ addButton.setText("Add Filter");
+ }
+
+ private void addFilterListeners() {
+ addButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ SearchFilter searchFilter = (SearchFilter) searchTypeList.getData(searchTypeList.getCombo().getText());
+ searchFilter.setNot(notButton.getSelection());
+ searchFilter.addFilterTo(filterviewer);
+ updateOKStatus();
+ }
+ });
+
+ searchTypeList.getCombo().addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateWidgets();
+ }
+ });
+ }
+
+ private void updateWidgets() {
+ SearchFilter searchFilter = (SearchFilter) searchTypeList.getData(searchTypeList.getCombo().getText());
+ addButton.setEnabled(searchFilter.isValid());
+ selectionLayout.topControl = searchFilter.optionsControl;
+ selectionLayout.topControl.getParent().layout();
+ }
+
+ private void addTableControls(Composite composite) {
+ Composite filterComposite = new Composite(composite, SWT.NONE);
+ filterComposite.setFont(composite.getFont());
+ filterComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ filterComposite.setLayout(new GridLayout(2, false));
+
+ Label tableLabel = new Label(filterComposite, SWT.FILL);
+ tableLabel.setText("Filters ");
+
+ HyperLinkLabel clearAllLabel = new HyperLinkLabel(filterComposite, SWT.NONE);
+ clearAllLabel.setText("clear all");
+ clearAllLabel.addListener(SWT.MouseUp, new Listener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ for (FilterModel filterModel : new CopyOnWriteArrayList<FilterModel>(
+ filterviewer.getFilterList().getFilters())) {
+ filterviewer.removeFilter(filterModel);
+ }
+ filterviewer.refresh();
+ }
+ });
+
+ Table table = new Table(composite, SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION);
+ filterviewer = new FilterTableViewer(table);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.heightHint = 100;
+ gridData.widthHint = 500;
+ table.setLayoutData(gridData);
+ }
+
+ public void setContainer(ISearchPageContainer container) {
+ ArtifactSearchPage.aContainer = container;
+ }
+
+ /**
+ * @return Returns the aContainer.
+ */
+ public static ISearchPageContainer getContainer() {
+ return aContainer;
+ }
+
+ public boolean performAction() {
+ NewSearchUI.activateSearchResultView();
+ filterviewer.getFilterList().setAllSelected(allButton.getSelection());
+ AbstractArtifactSearchQuery searchQuery =
+ new FilterArtifactSearchQuery(filterviewer.getFilterList(), getSelectedBranch());
+ NewSearchUI.runQueryInBackground(searchQuery);
+ saveState();
+ return true;
+ }
+
+ public boolean performReplace() {
+ filterviewer.getFilterList().setAllSelected(allButton.getSelection());
+ AbstractArtifactSearchQuery searchQuery =
+ new FilterArtifactSearchQuery(filterviewer.getFilterList(), getSelectedBranch());
+
+ IStatus status = NewSearchUI.runQueryInForeground(getContainer().getRunnableContext(), searchQuery);
+ if (status.matches(IStatus.CANCEL)) {
+ return false;
+ }
+
+ ISearchResultViewPart view = NewSearchUI.activateSearchResultView();
+ if (view != null) {
+ final ISearchResultPage page = view.getActivePage();
+ if (page instanceof AbstractArtifactSearchViewPage) {
+ runAttributeFindReplaceDialog(page);
+ }
+ }
+ return true;
+ }
+
+ private void runAttributeFindReplaceDialog(final ISearchResultPage page) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ if (page instanceof AbstractArtifactSearchViewPage) {
+ AbstractArtifactSearchViewPage artifactPage = (AbstractArtifactSearchViewPage) page;
+ List<Artifact> artifacts = artifactPage.getInput().getArtifactResults();
+ new AttributeFindReplaceDialog(page.getSite().getShell(), artifacts).open();
+ }
+ }
+ });
+ }
+
+ /*
+ * Implements method from IDialogPage
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ updateOKStatus();
+ super.setVisible(visible);
+ }
+
+ public static void updateOKStatus() {
+ if (filterviewer == null || filterviewer.getFilterList().getFilters().isEmpty()) {
+ getContainer().setPerformActionEnabled(false);
+ } else {
+ getContainer().setPerformActionEnabled(true);
+ }
+ }
+
+ private String asString(FilterModel model) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(model.getSearch());
+ builder.append(";");
+ builder.append(model.getType());
+ builder.append(";");
+ builder.append(model.getValue());
+ builder.append(";");
+ builder.append(model.getSearchPrimitive().getStorageString());
+ return builder.toString();
+ }
+
+ private void processStoredFilter(String entry) {
+ storageStringMatcher.reset(entry);
+ if (storageStringMatcher.find()) {
+ String searchPrimitive = storageStringMatcher.group(1);
+ String type = storageStringMatcher.group(2);
+ String value = storageStringMatcher.group(3);
+ String storageString = storageStringMatcher.group(4);
+ boolean isNotEnabled = false;
+ notSearchPrimitiveMatcher.reset(storageString);
+ if (notSearchPrimitiveMatcher.find()) {
+ isNotEnabled = true;
+ storageString = notSearchPrimitiveMatcher.group(1);
+ }
+ SearchFilter searchFilter = (SearchFilter) searchTypeList.getData(searchPrimitive);
+ searchFilter.loadFromStorageString(filterviewer, type, value, storageString, isNotEnabled);
+ searchFilter.getFilterName();
+ }
+ }
+
+ protected void saveState() {
+ IDialogSettings dialogSettings = SkynetGuiPlugin.getInstance().getDialogSettings();
+ if (dialogSettings != null) {
+
+ List<String> filterString = new ArrayList<String>();
+ FilterModelList filterList = filterviewer.getFilterList();
+ for (FilterModel model : filterList.getFilters()) {
+ filterString.add(asString(model));
+ }
+ dialogSettings.put(SkynetGuiPlugin.PLUGIN_ID + FILTERS_STORAGE_KEY,
+ filterString.toArray(new String[filterString.size()]));
+ }
+ }
+
+ protected void loadState() {
+ IDialogSettings dialogSettings = SkynetGuiPlugin.getInstance().getDialogSettings();
+ if (dialogSettings != null) {
+ String[] filters = dialogSettings.getArray(SkynetGuiPlugin.PLUGIN_ID + FILTERS_STORAGE_KEY);
+ if (filters != null) {
+ for (String entry : filters) {
+ processStoredFilter(entry);
+ }
+ }
+ }
+ }
+
+ public class SearchLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ return (String) arg0;
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+ }
+
+ public class SearchContentProvider implements IStructuredContentProvider {
+ @SuppressWarnings("unchecked")
+ public Object[] getElements(Object arg0) {
+ return ((ArrayList) arg0).toArray();
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
+ }
+ }
+
+ public class SearchSorter extends ViewerSorter {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(e1, e2);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchResult.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchResult.java
new file mode 100644
index 00000000000..c0fc75b95a1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactSearchResult.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.framework.ui.skynet.search;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+public class ArtifactSearchResult extends AbstractArtifactSearchResult {
+ private AbstractArtifactSearchQuery aQuery;
+
+ public ArtifactSearchResult(AbstractArtifactSearchQuery job) {
+ aQuery = job;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getLabel() {
+ return aQuery.getResultLabel();
+ }
+
+ public String getTooltip() {
+ return getLabel();
+ }
+
+ public AbstractArtifactSearchQuery getQuery() {
+ return aQuery;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactTypeFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactTypeFilter.java
new file mode 100644
index 00000000000..c03c6c55086
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ArtifactTypeFilter.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.framework.ui.skynet.search;
+
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.EQUAL;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactTypeSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.NotSearch;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ArtifactTypeFilter extends SearchFilter {
+ private ListViewer searchTypeList;
+
+ public ArtifactTypeFilter(Control optionsControl, ListViewer searchTypeList) {
+ super("Artifact Type", optionsControl);
+ this.searchTypeList = searchTypeList;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.search.SearchFilter#addFilterTo(osee.define.artifact.search.filter.FilterTableViewer)
+ */
+ @Override
+ public void addFilterTo(FilterTableViewer filterViewer) {
+ for (String type : searchTypeList.getList().getSelection()) {
+ ISearchPrimitive primitive = new ArtifactTypeSearch(type, EQUAL);
+ if (not) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), type, "");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.search.SearchFilter#isValid()
+ */
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.SearchFilter#loadFromStorageString(org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer, java.lang.String, java.lang.String, java.lang.String, boolean)
+ */
+ @Override
+ public void loadFromStorageString(FilterTableViewer filterViewer, String type, String value, String storageString, boolean isNotEnabled) {
+ ISearchPrimitive primitive = ArtifactTypeSearch.getPrimitive(storageString);
+ if (isNotEnabled) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), type, value);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeFindReplaceDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeFindReplaceDialog.java
new file mode 100644
index 00000000000..33435341d37
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeFindReplaceDialog.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+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.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Image;
+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.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog for performing find/replace of attribute values on a set of <code>Artifact</code>'s.
+ *
+ * @see org.eclipse.osee.framework.skynet.core.artifact.Artifact
+ * @see org.eclipse.osee.framework.skynet.core.attribute.Attribute
+ * @author Robert A. Fisher
+ */
+public class AttributeFindReplaceDialog extends Dialog {
+ private ComboViewer cmbAttributeDescriptors;
+ private Text txtFindRegEx;
+ private Text txtReplaceStr;
+ private Branch branch;
+
+ private List<Artifact> artifacts;
+
+ public AttributeFindReplaceDialog(Shell parentShell, List<Artifact> artifacts) {
+ super(parentShell);
+
+ this.artifacts = artifacts;
+ if (artifacts != null && !artifacts.isEmpty()) {
+ this.branch = artifacts.get(0).getBranch();
+ }
+ setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | getDefaultOrientation() | SWT.RESIZE);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText("Find/Replace Attribute Value");
+
+ Composite mainComposite = new Composite(parent, SWT.NONE);
+ mainComposite.setFont(parent.getFont());
+ mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainComposite.setLayout(new GridLayout(1, false));
+
+ addDialogControls(mainComposite);
+ addListeners();
+ setInputs();
+
+ return mainComposite;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ super.createButtonsForButtonBar(parent);
+ checkEnabled();
+ }
+
+ private void setInputs() {
+ try {
+ cmbAttributeDescriptors.setInput(TypeValidityManager.getValidAttributeTypes(branch).toArray(
+ AttributeType.EMPTY_ARRAY));
+ cmbAttributeDescriptors.getCombo().select(0);
+ } catch (OseeCoreException ex) {
+ cmbAttributeDescriptors.setInput(new Object[] {ex});
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void addListeners() {
+ txtFindRegEx.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ checkEnabled();
+ }
+ });
+ }
+
+ private void addDialogControls(Composite mainComposite) {
+ Label label;
+ label = new Label(mainComposite, SWT.LEFT);
+ label.setText("Attribute Type");
+ label.setToolTipText("The attribute to perform the find/replace logic against");
+
+ cmbAttributeDescriptors = new ComboViewer(mainComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
+ cmbAttributeDescriptors.setContentProvider(new ArrayContentProvider());
+ cmbAttributeDescriptors.setLabelProvider(new ArtifactTypeLabelProvider());
+ cmbAttributeDescriptors.setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((AttributeType) e1).getName(), ((AttributeType) e2).getName());
+ }
+ });
+
+ label = new Label(mainComposite, SWT.LEFT);
+ label.setText("Find (regex):");
+ label.setToolTipText("The regular expression to perform matching with against the attribute value");
+ txtFindRegEx = new Text(mainComposite, SWT.BORDER);
+
+ label = new Label(mainComposite, SWT.LEFT);
+ label.setText("Replace With:");
+ label.setToolTipText("The value to put in place of the value matched by the Find regular expression");
+ txtReplaceStr = new Text(mainComposite, SWT.BORDER);
+
+ }
+
+ private void checkEnabled() {
+ boolean enable =
+ (cmbAttributeDescriptors.getInput() instanceof AttributeType[]) && (txtFindRegEx.getText().length() > 0) && (!artifacts.isEmpty());
+
+ getButton(IDialogConstants.OK_ID).setEnabled(enable);
+ }
+
+ @Override
+ protected void okPressed() {
+ final Pattern pattern = Pattern.compile(txtFindRegEx.getText());
+ final String replaceText = txtReplaceStr.getText();
+ final String attributeName =
+ ((AttributeType) ((IStructuredSelection) cmbAttributeDescriptors.getSelection()).getFirstElement()).getName();
+
+ Job job = new Job("Find/Replace") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ Branch branch = artifacts.get(0).getBranch();
+ try {
+ monitor.beginTask("Find/Replace " + attributeName + " Attribute Value", artifacts.size());
+
+ SkynetTransaction transaction = new SkynetTransaction(branch);
+ for (Artifact artifact : artifacts) {
+ monitor.subTask("Modifying " + artifact.getDescriptiveName());
+ for (Attribute<?> attribute : artifact.getAttributes(attributeName)) {
+ Matcher matcher = pattern.matcher(attribute.toString());
+ attribute.setFromString(matcher.replaceAll(replaceText));
+ }
+ artifact.persistAttributes(transaction);
+ monitor.worked(1);
+ if (monitor.isCanceled()) {
+ throw new IllegalStateException("USER_PURPLE CANCELLED");
+ }
+ }
+
+ transaction.execute();
+ toReturn = Status.OK_STATUS;
+ } catch (Exception ex) {
+ if (ex.getMessage().equals("USER_PURPLE CANCELLED")) {
+ toReturn = Status.CANCEL_STATUS;
+ } else {
+ toReturn = new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, Status.OK, ex.getMessage(), ex);
+ }
+ } finally {
+ monitor.done();
+ }
+
+ return toReturn;
+ }
+ };
+ Jobs.startJob(job);
+ super.okPressed();
+ }
+ private static class ArtifactTypeLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object element) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ if (element instanceof AttributeType)
+ return ((AttributeType) element).getName();
+ else
+ return element.toString();
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return true;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeValueFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeValueFilter.java
new file mode 100644
index 00000000000..15d32d1dbb8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/AttributeValueFilter.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.framework.ui.skynet.search;
+
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.search.AttributeValueSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.NotSearch;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class AttributeValueFilter extends SearchFilter {
+ private ComboViewer attributeTypeList;
+ private Text attributeValue;
+
+ public AttributeValueFilter(Control optionsControl, ComboViewer attributeTypeList, Text attributeValue) {
+ super("Attribute Value", optionsControl);
+ this.attributeTypeList = attributeTypeList;
+ this.attributeValue = attributeValue;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.search.SearchFilter#addFilterTo(osee.define.artifact.search.filter.FilterTableViewer)
+ */
+ @Override
+ public void addFilterTo(FilterTableViewer filterViewer) {
+ String type = attributeTypeList.getCombo().getText();
+ String value = attributeValue.getText();
+
+ OperatorAndValue result = handleWildCard(value);
+ ISearchPrimitive primitive = new AttributeValueSearch(type, result.value, result.operator);
+ if (not) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), type, result.value);
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.search.SearchFilter#isValid()
+ */
+ @Override
+ public boolean isValid() {
+ return !attributeValue.getText().equals("");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.SearchFilter#loadFromStorageString(org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer, java.lang.String, java.lang.String, java.lang.String, boolean)
+ */
+ @Override
+ public void loadFromStorageString(FilterTableViewer filterViewer, String type, String value, String storageString, boolean isNotEnabled) {
+ ISearchPrimitive primitive = AttributeValueSearch.getPrimitive(storageString);
+ if (isNotEnabled) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), type, value);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/FilterArtifactSearchQuery.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/FilterArtifactSearchQuery.java
new file mode 100644
index 00000000000..504e4f23342
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/FilterArtifactSearchQuery.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.framework.ui.skynet.search;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterModel;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterModelList;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class FilterArtifactSearchQuery extends AbstractLegacyArtifactSearchQuery {
+ private final FilterModelList filterList;
+ private final Branch branch;
+ private String criteriaLabel = "";
+
+ /**
+ * @param filterList
+ * @param branch
+ */
+ public FilterArtifactSearchQuery(FilterModelList filterList, Branch branch) {
+ this.filterList = filterList;
+ this.branch = branch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchQuery#getArtifacts()
+ */
+ @Override
+ public Collection<Artifact> getArtifacts() throws OseeCoreException {
+ boolean firstTime = true;
+ List<ISearchPrimitive> criteria = new LinkedList<ISearchPrimitive>();
+
+ for (FilterModel model : filterList.getFilters()) {
+ criteria.add(model.getSearchPrimitive());
+
+ if (!firstTime) {
+ if (filterList.isAllSelected())
+ criteriaLabel += " and ";
+ else
+ criteriaLabel += " or ";
+ }
+
+ criteriaLabel += model;
+ firstTime = false;
+ }
+
+ MaxMatchCountConfirmer confirmer = new MaxMatchCountConfirmer();
+ Collection<Artifact> artifacts =
+ ArtifactPersistenceManager.getInstance().getArtifacts(criteria, filterList.isAllSelected(), branch,
+ confirmer);
+ if (confirmer.isConfirmed()) {
+ return artifacts;
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String getCriteriaLabel() {
+ return criteriaLabel;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HistoricalArtifactSearchQuery.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HistoricalArtifactSearchQuery.java
new file mode 100644
index 00000000000..05d97e7b836
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HistoricalArtifactSearchQuery.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.framework.ui.skynet.search;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class HistoricalArtifactSearchQuery extends AbstractLegacyArtifactSearchQuery {
+ private String attributePattern;
+ private final Branch branch;
+
+ public HistoricalArtifactSearchQuery(String attributePattern, Branch branch) {
+ this.attributePattern = attributePattern;
+ this.branch = branch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchQuery#getArtifacts()
+ */
+ @Override
+ public Collection<Artifact> getArtifacts() throws OseeCoreException {
+ return ArtifactQuery.getArtifactsFromHistoricalAttributeValue(attributePattern, branch);
+ }
+
+ public String getCriteriaLabel() {
+ return attributePattern;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HridValueFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HridValueFilter.java
new file mode 100644
index 00000000000..83a9b21f083
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/HridValueFilter.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.framework.ui.skynet.search;
+
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactHridSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.NotSearch;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class HridValueFilter extends SearchFilter {
+ private Text hridValue;
+
+ public HridValueFilter(Control optionsControl, Text hridValue) {
+ super("Human Readable ID", optionsControl);
+ this.hridValue = hridValue;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.search.SearchFilter#addFilterTo(osee.define.artifact.search.filter.FilterTableViewer)
+ */
+ @Override
+ public void addFilterTo(FilterTableViewer filterViewer) {
+ OperatorAndValue result = handleWildCard(hridValue.getText());
+ ISearchPrimitive primitive = new ArtifactHridSearch(result.value, result.operator);
+ if (not) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), "huid", result.value);
+ }
+
+ /* (non-Javadoc)
+ * @see osee.define.artifact.search.SearchFilter#isValid()
+ */
+ @Override
+ public boolean isValid() {
+ return !hridValue.getText().equals("");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.SearchFilter#loadFromStorageString(org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer, java.lang.String, java.lang.String, java.lang.String, boolean)
+ */
+ @Override
+ public void loadFromStorageString(FilterTableViewer filterViewer, String type, String value, String storageString, boolean isNotEnabled) {
+ ISearchPrimitive primitive = ArtifactHridSearch.getPrimitive(storageString);
+ if (isNotEnabled) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), type, value);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/IdArtifactSearch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/IdArtifactSearch.java
new file mode 100644
index 00000000000..dbbeb561eff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/IdArtifactSearch.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.framework.ui.skynet.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class IdArtifactSearch extends AbstractLegacyArtifactSearchQuery {
+ private List<String> idsToSearch;
+ private Branch branchToSearch;
+ private boolean allowDeleted;
+
+ IdArtifactSearch(String searchString, Branch branchToSearch, boolean allowDeleted) {
+ super();
+ this.idsToSearch = new ArrayList<String>();
+ this.branchToSearch = branchToSearch;
+ this.allowDeleted = allowDeleted;
+
+ this.idsToSearch.addAll(Arrays.asList(searchString.split("[\\s,]+")));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchQuery#getArtifacts()
+ */
+ @Override
+ public Collection<Artifact> getArtifacts() throws Exception {
+ return ArtifactQuery.getArtifactsFromIds(idsToSearch, branchToSearch, allowDeleted);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchQuery#getCriteriaLabel()
+ */
+ @Override
+ public String getCriteriaLabel() {
+ return String.format("%s%s", idsToSearch.toString(), allowDeleted ? " - Options:[Include Deleted]" : "");
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/InRelationFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/InRelationFilter.java
new file mode 100644
index 00000000000..0642b5100a1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/InRelationFilter.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.framework.ui.skynet.search;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.InRelationSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.NotSearch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class InRelationFilter extends SearchFilter {
+ private ComboViewer relationTypeList;
+ private ComboViewer relationSideList;
+
+ public InRelationFilter(Control optionsControl, ComboViewer relationTypeList, ComboViewer relationSideList) {
+ super("Artifact in Relation", optionsControl);
+ this.relationTypeList = relationTypeList;
+ this.relationSideList = relationSideList;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.search.SearchFilter#addFilterTo(osee.define.artifact.search.filter.FilterTableViewer)
+ */
+ @Override
+ public void addFilterTo(FilterTableViewer filterViewer) {
+ String type = relationTypeList.getCombo().getText();
+ String sideName = relationSideList.getCombo().getText();
+
+ RelationType linkDescriptor = (RelationType) relationTypeList.getData(relationTypeList.getCombo().getText());
+ try {
+ ISearchPrimitive primitive = new InRelationSearch(type, linkDescriptor.isSideAName(sideName));
+ if (not) primitive = new NotSearch(primitive);
+
+ filterViewer.addItem(primitive, getFilterName(), type, sideName);
+ } catch (OseeArgumentException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.search.SearchFilter#isValid()
+ */
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.SearchFilter#loadFromStorageString(org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer, java.lang.String, java.lang.String, java.lang.String, boolean)
+ */
+ @Override
+ public void loadFromStorageString(FilterTableViewer filterViewer, String type, String value, String storageString, boolean isNotEnabled) {
+ ISearchPrimitive primitive = InRelationSearch.getPrimitive(storageString);
+ if (isNotEnabled) primitive = new NotSearch(primitive);
+ filterViewer.addItem(primitive, getFilterName(), type, value);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/MaxMatchCountConfirmer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/MaxMatchCountConfirmer.java
new file mode 100644
index 00000000000..648c91fe14c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/MaxMatchCountConfirmer.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.framework.ui.skynet.search;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.skynet.core.artifact.ISearchConfirmer;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class MaxMatchCountConfirmer implements ISearchConfirmer {
+ private static final int MAX_RESULTS = 2000;
+ final MutableBoolean result = new MutableBoolean(false);
+
+ public boolean canProceed(final int count) {
+ if (count < MAX_RESULTS) {
+ result.setValue(true);
+ } else {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ result.setValue(MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Confirm Search",
+ "The search returned " + count + " results and may take a long time to load, continue?"));
+ }
+ }, true);
+ }
+ return result.getValue();
+ }
+
+ public boolean isConfirmed() {
+ return result.getValue();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/OrphanSearchFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/OrphanSearchFilter.java
new file mode 100644
index 00000000000..4a8a8b7228f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/OrphanSearchFilter.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.framework.ui.skynet.search;
+
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.NotSearch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.OrphanArtifactSearch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class OrphanSearchFilter extends SearchFilter {
+ private ListViewer searchTypeList;
+
+ public OrphanSearchFilter(String filterName, Control optionsControl, ListViewer searchTypeList) {
+ super(filterName, optionsControl);
+ this.searchTypeList = searchTypeList;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.search.SearchFilter#addFilterTo(osee.define.artifact.search.filter.FilterTableViewer)
+ */
+ @Override
+ public void addFilterTo(FilterTableViewer filterViewer) {
+ try {
+ for (String typeName : searchTypeList.getList().getSelection()) {
+
+ ArtifactType artifactType = ArtifactTypeManager.getType(typeName);
+
+ ISearchPrimitive primitive = new OrphanArtifactSearch(artifactType);
+ if (not) {
+ primitive = new NotSearch(primitive);
+ }
+ filterViewer.addItem(primitive, getFilterName(), typeName, "");
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.define.artifact.search.SearchFilter#isValid()
+ */
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.SearchFilter#loadFromStorageString(org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer, java.lang.String, java.lang.String, java.lang.String, boolean)
+ */
+ @Override
+ public void loadFromStorageString(FilterTableViewer filterViewer, String type, String value, String storageString, boolean isNotEnabled) {
+ ISearchPrimitive primitive = OrphanArtifactSearch.getPrimitive(storageString);
+ if (isNotEnabled) {
+ primitive = new NotSearch(primitive);
+ }
+ filterViewer.addItem(primitive, getFilterName(), type, value);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchOptionComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchOptionComposite.java
new file mode 100644
index 00000000000..f09c1593185
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchOptionComposite.java
@@ -0,0 +1,554 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search;
+
+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.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.AttributeTypeCheckTreeDialog;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.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;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IMemento;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class QuickSearchOptionComposite extends Composite {
+ private static final String CONFIG_BUTTON_TOOLTIP = "Select to configure option.";
+
+ private static final String OPTIONS_KEY_ID = "searchOption";
+ private static final String OPTION_CONFIGS_KEY_ID = "optionConfigs";
+ private static final String ENTRY_SEPARATOR = "##";
+
+ private Group optionGroup;
+ private final Map<String, Button> optionsButtons;
+ private final Map<String, Text> textAreas;
+ private final Map<String, Boolean> optionsMap;
+
+ private final Set<String> mutuallyExclusiveOptionSet;
+ private final Map<String, IOptionConfigurationHandler> configurableOptionSet;
+ private Composite wordOrderComposite;
+
+ public QuickSearchOptionComposite(Composite parent, int style) {
+ super(parent, style);
+ this.optionsButtons = new LinkedHashMap<String, Button>();
+ this.textAreas = new HashMap<String, Text>();
+ this.optionsMap = new LinkedHashMap<String, Boolean>();
+ this.mutuallyExclusiveOptionSet = new HashSet<String>();
+ this.configurableOptionSet = new HashMap<String, IOptionConfigurationHandler>();
+
+ for (String option : SearchOption.asLabels()) {
+ this.optionsMap.put(option, false);
+ }
+ for (String option : SearchOption.getMutuallyExclusiveOptions()) {
+ this.optionsMap.put(option, false);
+ this.mutuallyExclusiveOptionSet.add(option);
+ }
+ for (String option : SearchOption.getConfigurableOptions().keySet()) {
+ this.optionsMap.put(option, false);
+ this.configurableOptionSet.put(option, SearchOption.getConfigurableOptions().get(option));
+ }
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ this.optionGroup = new Group(parent, SWT.NONE);
+ this.optionGroup.setLayout(new GridLayout());
+ this.optionGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ this.optionGroup.setText("Options");
+
+ initializeOptions(optionsMap);
+
+ for (SearchOption option : SearchOption.values()) {
+ setHelpContextForOption(option.asLabel(), option.getHelpContext());
+ setToolTipForOption(option.asLabel(), option.getToolTip());
+ }
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(ALayout.getZeroMarginLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ }
+
+ private void updateTextArea(Text text, String[] data) {
+ text.setText(StringFormat.separateWith(data, ", "));
+ }
+
+ public Map<String, Boolean> getOptions() {
+ return optionsMap;
+ }
+
+ public Map<String, String[]> getConfigurations() {
+ Map<String, String[]> toReturn = new HashMap<String, String[]>();
+ for (String key : configurableOptionSet.keySet()) {
+ toReturn.put(key, configurableOptionSet.get(key).getConfiguration());
+ }
+ return toReturn;
+ }
+
+ public boolean isOptionSelected(String key) {
+ Boolean value = optionsMap.get(key);
+ return value != null ? value.booleanValue() : false;
+ }
+
+ public String[] getConfiguration(String key) {
+ IOptionConfigurationHandler handler = this.configurableOptionSet.get(key);
+ if (handler != null) {
+ return handler.getConfiguration();
+ } else {
+ return new String[0];
+ }
+ }
+
+ private void initializeOptions(Map<String, Boolean> options) {
+ for (String option : options.keySet()) {
+ Boolean isSelected = options.get(option);
+ Button button = getOrCreateOptionsButton(option);
+ button.setSelection(isSelected);
+ this.optionsMap.put(option, isSelected);
+ }
+ updateMatchWordOrderOptions();
+ }
+
+ private void updateMatchWordOrderOptions() {
+ boolean setEnabled = isMatchWordOrderEnabled();
+ if (Widgets.isAccessible(wordOrderComposite)) {
+ wordOrderComposite.setVisible(setEnabled);
+ wordOrderComposite.setEnabled(setEnabled);
+ if (!setEnabled) {
+ optionsMap.put(SearchOption.Case_Sensitive.asLabel(), setEnabled);
+ optionsMap.put(SearchOption.All_Match_Locations.asLabel(), setEnabled);
+ } else {
+ optionsMap.put(SearchOption.Case_Sensitive.asLabel(), optionsButtons.get(
+ SearchOption.Case_Sensitive.asLabel()).getSelection());
+ optionsMap.put(SearchOption.All_Match_Locations.asLabel(), optionsButtons.get(
+ SearchOption.All_Match_Locations.asLabel()).getSelection());
+ }
+ optionGroup.getParent().layout();
+ }
+ }
+
+ private Button getOrCreateOptionsButton(String option) {
+ Button toReturn = this.optionsButtons.get(option);
+ if (toReturn == null) {
+ toReturn = createButton(this.optionGroup, option);
+ this.optionsButtons.put(option, toReturn);
+ }
+ return toReturn;
+ }
+
+ private Button createButton(Composite parent, String option) {
+ final IOptionConfigurationHandler configHandler = configurableOptionSet.get(option);
+ Composite mainComposite = parent;
+ if (configHandler != null) {
+ mainComposite = new Composite(parent, SWT.NONE);
+ mainComposite.setLayout(ALayout.getZeroMarginLayout(4, false));
+ mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ } else if (option.equals(SearchOption.All_Match_Locations.asLabel()) || option.equals(SearchOption.Case_Sensitive.asLabel())) {
+ if (wordOrderComposite == null) {
+ wordOrderComposite = new InvisibleComposite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginLeft = 15;
+ wordOrderComposite.setLayout(layout);
+ wordOrderComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ }
+ mainComposite = wordOrderComposite;
+ }
+
+ Button toReturn = new Button(mainComposite, SWT.CHECK);
+ toReturn.setData(option);
+ toReturn.setFont(getFont());
+ toReturn.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object object = e.getSource();
+ if (object instanceof Button) {
+ Button button = (Button) object;
+ if (mutuallyExclusiveOptionSet.contains(button.getData())) {
+ if (button.getSelection()) {
+ for (String entry : mutuallyExclusiveOptionSet) {
+ Button other = optionsButtons.get(entry);
+ if (!other.equals(button)) {
+ other.setSelection(false);
+ }
+ optionsMap.put((String) other.getData(), other.getSelection());
+ }
+ }
+ }
+ optionsMap.put((String) button.getData(), button.getSelection());
+
+ Object data = button.getData();
+ boolean selection = optionsMap.get(SearchOption.By_Id.asLabel()).booleanValue();
+ if (data.equals(SearchOption.By_Id.asLabel()) && selection) {
+ optionsMap.put(SearchOption.Match_Word_Order.asLabel(), false);
+ optionsButtons.get(SearchOption.Match_Word_Order.asLabel()).setSelection(false);
+ } else if (data.equals(SearchOption.Match_Word_Order.asLabel()) && selection) {
+ optionsMap.put(SearchOption.By_Id.asLabel(), false);
+ optionsButtons.get(SearchOption.By_Id.asLabel()).setSelection(false);
+ }
+ updateMatchWordOrderOptions();
+ }
+ }
+ });
+
+ if (configHandler != null) {
+ Label label = new Label(mainComposite, SWT.NONE);
+ label.setText(option + ":");
+
+ final Text text = new Text(mainComposite, SWT.READ_ONLY | SWT.BORDER);
+ text.setText(StringFormat.separateWith(configHandler.getConfiguration(), ", "));
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
+ data.minimumWidth = 100;
+ text.setLayoutData(data);
+ textAreas.put(option, text);
+
+ Button filterConfig = new Button(mainComposite, SWT.PUSH);
+ String configToolTip = configHandler.getConfigToolTip();
+ filterConfig.setToolTipText(Strings.isValid(configToolTip) ? configToolTip : CONFIG_BUTTON_TOOLTIP);
+ filterConfig.setImage(ImageManager.getImage(FrameworkImage.GEAR));
+ filterConfig.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (configHandler != null) {
+ configHandler.configure();
+ updateTextArea(text, configHandler.getConfiguration());
+ }
+ }
+ });
+ } else {
+ toReturn.setText(option);
+ }
+ return toReturn;
+ }
+
+ public boolean isSearchByIdEnabled() {
+ return isOptionSelected(SearchOption.By_Id.asLabel());
+ }
+
+ public boolean isIncludeDeletedEnabled() {
+ return isOptionSelected(SearchOption.Include_Deleted.asLabel());
+ }
+
+ public boolean isMatchWordOrderEnabled() {
+ return isOptionSelected(SearchOption.Match_Word_Order.asLabel());
+ }
+
+ public boolean isMatchAllLocationsEnabled() {
+ return isOptionSelected(SearchOption.All_Match_Locations.asLabel());
+ }
+
+ public boolean isCaseSensitiveEnabled() {
+ return isOptionSelected(SearchOption.Case_Sensitive.asLabel());
+ }
+
+ public boolean isAttributeTypeFilterEnabled() {
+ return isOptionSelected(SearchOption.Attribute_Type_Filter.asLabel());
+ }
+
+ public String[] getAttributeTypeFilter() {
+ return isAttributeTypeFilterEnabled() ? getConfiguration(SearchOption.Attribute_Type_Filter.asLabel()) : null;
+ }
+
+ public void saveState(IMemento memento) {
+ for (String option : optionsMap.keySet()) {
+ memento.putString(OPTIONS_KEY_ID + option.replaceAll(" ", "_"), optionsMap.get(option).toString());
+ }
+ Map<String, String[]> data = getConfigurations();
+ for (String key : data.keySet()) {
+ String[] config = data.get(key);
+ if (config != null && config.length > 0) {
+ memento.putString(OPTION_CONFIGS_KEY_ID + key.replaceAll(" ", "_"), StringFormat.separateWith(config,
+ ENTRY_SEPARATOR));
+ }
+ }
+ }
+
+ public void loadState(IMemento memento) {
+ Map<String, String[]> configs = new HashMap<String, String[]>();
+ Map<String, Boolean> options = new HashMap<String, Boolean>();
+
+ for (SearchOption option : SearchOption.values()) {
+ options.put(option.asLabel(), new Boolean(memento.getString(OPTIONS_KEY_ID + option.name())));
+
+ if (option.isConfigurable()) {
+ String configuration = memento.getString(OPTION_CONFIGS_KEY_ID + option.name());
+ if (Strings.isValid(configuration)) {
+ String[] values = configuration.split(ENTRY_SEPARATOR);
+ configs.put(option.asLabel(), values);
+ }
+ }
+ }
+ initializeOptions(options);
+ initializeConfigurations(configs);
+ }
+
+ private void initializeConfigurations(Map<String, String[]> items) {
+ for (String key : items.keySet()) {
+ IOptionConfigurationHandler handler = configurableOptionSet.get(key);
+ if (handler != null) {
+ handler.setConfiguration(items.get(key));
+ Text text = textAreas.get(key);
+ if (text != null) {
+ updateTextArea(text, handler.getConfiguration());
+ }
+ }
+ }
+ }
+
+ private void setHelpContextForOption(String optionId, String helpContext) {
+ Control control = getOrCreateOptionsButton(optionId);
+ if (Widgets.isAccessible(control)) {
+ SkynetGuiPlugin.getInstance().setHelp(control, helpContext);
+ }
+ }
+
+ private void setToolTipForOption(String optionId, String toolTip) {
+ Control control = getOrCreateOptionsButton(optionId);
+ if (Widgets.isAccessible(control)) {
+ control.setToolTipText(toolTip);
+ }
+ }
+
+ private interface IOptionConfigurationHandler {
+
+ public void setConfiguration(String[] strings);
+
+ public void configure();
+
+ public String[] getConfiguration();
+
+ public String getConfigToolTip();
+
+ }
+
+ private enum SearchOption {
+ Attribute_Type_Filter("quick_search_attribute_type_filter", "When selected, searches only through the artifact's containing the selected attribute types.", true, new AttributeTypeFilterConfigHandler()),
+ By_Id("quick_search_by_id_option", "When selected, searches by GUID(s) or HRID(s). Accepts comma or space separated ids.", true),
+ Include_Deleted("quick_search_deleted_option", "When selected, does not filter out deleted artifacts from search results.", false),
+ Match_Word_Order("quick_search_word_order_option", "When selected, search will match query word order.", false),
+ All_Match_Locations("quick_search_all_match_locations_option", "When selected, returns all match locations. NOTE: If the search matches many artifacts, performance may be slow.", false),
+ Case_Sensitive("quick_search_case_sensitive_option", "When selected, performs a case sensitive search. NOTE: This is only applicable if match word order is also selected.", false);
+
+ private static String[] labels = null;
+ private static String[] mutuallyExclusive = null;
+ private static Map<String, IOptionConfigurationHandler> configurable = null;
+ private final String helpContext;
+ private final String toolTip;
+ private final boolean isRadio;
+ private final IOptionConfigurationHandler configHandler;
+
+ SearchOption(String helpContext, String toolTip, boolean isRadio) {
+ this(helpContext, toolTip, isRadio, null);
+ }
+
+ SearchOption(String helpContext, String toolTip, boolean isRadio, IOptionConfigurationHandler configHandler) {
+ this.helpContext = "";
+ this.toolTip = toolTip;
+ this.isRadio = isRadio;
+ this.configHandler = configHandler;
+ }
+
+ public String asLabel() {
+ return name().replaceAll("_", " ");
+ }
+
+ public String getHelpContext() {
+ return helpContext;
+ }
+
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ public boolean isConfigurable() {
+ return configHandler != null;
+ }
+
+ public IOptionConfigurationHandler getConfigHandler() {
+ return configHandler;
+ }
+
+ public static String[] getMutuallyExclusiveOptions() {
+ if (mutuallyExclusive == null) {
+ List<String> exclusiveOptions = new ArrayList<String>();
+ for (SearchOption option : SearchOption.values()) {
+ if (option.isRadio) {
+ exclusiveOptions.add(option.asLabel());
+ }
+ }
+ mutuallyExclusive = exclusiveOptions.toArray(new String[exclusiveOptions.size()]);
+ }
+ return mutuallyExclusive;
+ }
+
+ public static Map<String, IOptionConfigurationHandler> getConfigurableOptions() {
+ if (configurable == null) {
+ configurable = new HashMap<String, IOptionConfigurationHandler>();
+ for (SearchOption option : SearchOption.values()) {
+ if (option.isConfigurable()) {
+ configurable.put(option.asLabel(), option.getConfigHandler());
+ }
+ }
+ }
+ return configurable;
+ }
+
+ public static String[] asLabels() {
+ if (labels == null) {
+ SearchOption[] options = SearchOption.values();
+ labels = new String[options.length];
+ for (int index = 0; index < options.length; index++) {
+ labels[index] = options[index].asLabel();
+ }
+ }
+ return labels;
+ }
+ }
+
+ private final static class AttributeTypeFilterConfigHandler implements IOptionConfigurationHandler {
+ private final List<String> configuration;
+
+ public AttributeTypeFilterConfigHandler() {
+ this.configuration = new ArrayList<String>();
+ this.configuration.add(getDefault());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.panels.SearchComposite.IOptionConfigurationHandler#configure()
+ */
+ @Override
+ public void configure() {
+ try {
+ Collection<AttributeType> taggableItems = AttributeTypeManager.getTaggableTypes();
+ AttributeTypeCheckTreeDialog dialog = new AttributeTypeCheckTreeDialog(taggableItems);
+ dialog.setTitle("Attribute Type Filter Selection");
+ dialog.setMessage("Select attribute types to search in.");
+
+ List<AttributeType> selectedElements = new ArrayList<AttributeType>();
+ if (configuration.contains("All")) {
+ selectedElements.addAll(taggableItems);
+ } else {
+ for (AttributeType type : taggableItems) {
+ if (configuration.contains(type.getName())) {
+ selectedElements.add(type);
+ }
+ }
+ }
+ dialog.setInitialElementSelections(selectedElements);
+
+ int result = dialog.open();
+ if (result == Window.OK) {
+ configuration.clear();
+ Collection<AttributeType> results = dialog.getSelection();
+ if (org.eclipse.osee.framework.jdk.core.util.Collections.setComplement(taggableItems, results).isEmpty()) {
+ // All were selected
+ configuration.add("All");
+ } else {
+ for (AttributeType selected : results) {
+ configuration.add(selected.getName());
+ }
+ if (configuration.isEmpty()) {
+ configuration.add(getDefault());
+ }
+ }
+ }
+ Collections.sort(configuration);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.panels.SearchComposite.IOptionConfigurationHandler#getConfigToolTip()
+ */
+ @Override
+ public String getConfigToolTip() {
+ return "Select to configure attribute type filter.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.panels.SearchComposite.IOptionConfigurationHandler#getConfiguration()
+ */
+ @Override
+ public String[] getConfiguration() {
+ if (configuration.isEmpty()) {
+ configuration.add(getDefault());
+ }
+ return configuration.toArray(new String[configuration.size()]);
+ }
+
+ public String getDefault() {
+ return "Name";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.panels.SearchComposite.IOptionConfigurationHandler#setConfiguration(java.lang.String[])
+ */
+ @Override
+ public void setConfiguration(String[] items) {
+ if (items != null) {
+ configuration.clear();
+ for (String entry : items) {
+ configuration.add(entry);
+ }
+ }
+ if (configuration.isEmpty()) {
+ configuration.add(getDefault());
+ }
+ }
+ }
+
+ private final class InvisibleComposite extends Composite {
+
+ public InvisibleComposite(Composite parent, int style) {
+ super(parent, style);
+ }
+
+ @Override
+ public Point computeSize(int wHint, int hHint, boolean changed) {
+ if (!isVisible()) {
+ return new Point(0, 0);
+ } else {
+ return super.computeSize(wHint, hHint, changed);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchView.java
new file mode 100644
index 00000000000..ed8243fecbb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/QuickSearchView.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.framework.ui.skynet.search;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.panels.SearchComposite;
+import org.eclipse.osee.framework.ui.skynet.util.DbConnectionExceptionComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.search.ui.NewSearchUI;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class QuickSearchView extends ViewPart implements IActionable, Listener {
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.QuickSearchView";
+
+ private static final String ENTRY_SEPARATOR = "##";
+ private static final String LAST_QUERY_KEY_ID = "lastQuery";
+ private static final String QUERY_HISTORY_KEY_ID = "queryHistory";
+
+ private static final String MAIN_HELP_CONTEXT = "quick_search_text";
+
+ private Label branchLabel;
+ private XBranchSelectWidget branchSelect;
+ private SearchComposite searchComposite;
+ private QuickSearchOptionComposite optionsComposite;
+ private IMemento memento;
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ if (memento != null) {
+ this.memento = memento;
+ }
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ if (memento != null) {
+ if (Widgets.isAccessible(searchComposite)) {
+ memento.putString(LAST_QUERY_KEY_ID, searchComposite.getQuery());
+ StringBuilder builder = new StringBuilder();
+ String[] queries = searchComposite.getQueryHistory();
+ for (int index = 0; index < queries.length; index++) {
+ try {
+ builder.append(URLEncoder.encode(queries[index], "UTF-8"));
+ if (index + 1 < queries.length) {
+ builder.append(ENTRY_SEPARATOR);
+ }
+ } catch (UnsupportedEncodingException ex) {
+ // DO NOTHING
+ }
+ }
+ memento.putString(QUERY_HISTORY_KEY_ID, builder.toString());
+ }
+ if (Widgets.isAccessible(optionsComposite)) {
+ optionsComposite.saveState(memento);
+ }
+ }
+ }
+
+ private void loadState() {
+ if (memento != null) {
+ if (Widgets.isAccessible(searchComposite)) {
+ String lastQuery = memento.getString(LAST_QUERY_KEY_ID);
+ List<String> queries = new ArrayList<String>();
+ String rawHistory = memento.getString(QUERY_HISTORY_KEY_ID);
+ if (rawHistory != null) {
+ String[] values = rawHistory.split(ENTRY_SEPARATOR);
+ for (String value : values) {
+ try {
+ queries.add(URLDecoder.decode(value, "UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ // DO NOTHING
+ }
+ }
+ }
+ searchComposite.restoreWidgetValues(queries, lastQuery, null, null);
+ }
+ if (Widgets.isAccessible(optionsComposite)) {
+ optionsComposite.loadState(memento);
+ }
+ }
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ if (!DbConnectionExceptionComposite.dbConnectionIsOk(parent)) {
+ return;
+ }
+
+ parent.setLayout(new GridLayout());
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ branchSelect = new XBranchSelectWidget("");
+ branchSelect.setDisplayLabel(false);
+ branchSelect.createWidgets(parent, 2);
+
+ OseeContributionItem.addTo(this, true);
+
+ createActions();
+
+ Composite panel = new Composite(parent, SWT.NONE);
+ GridLayout gL = new GridLayout();
+ gL.marginHeight = 0;
+ gL.marginWidth = 0;
+ panel.setLayout(gL);
+ panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ searchComposite = new SearchComposite(panel, SWT.NONE);
+ searchComposite.addListener(this);
+
+ optionsComposite = new QuickSearchOptionComposite(panel, SWT.NONE);
+ optionsComposite.setLayout(ALayout.getZeroMarginLayout());
+ optionsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ loadState();
+
+ searchComposite.setHelpContext(MAIN_HELP_CONTEXT);
+
+ branchLabel = new Label(parent, SWT.NONE);
+ branchLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ branchLabel.setText("");
+
+ }
+
+ private void createActions() {
+ OseeAts.addBugToViewToolbar(this, this, SkynetGuiPlugin.getInstance(), VIEW_ID, "Quick Search");
+ }
+
+ @Override
+ public void setFocus() {
+ if (searchComposite != null) {
+ searchComposite.setFocus();
+ }
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ public void setBranch(Branch branch) {
+ if (branchSelect != null) {
+ branchSelect.setSelection(branch);
+ }
+ }
+
+ public void handleEvent(Event event) {
+ if (Widgets.isAccessible(branchLabel) && branchSelect != null) {
+ branchLabel.setText("");
+ final Branch branch = branchSelect.getData();
+ if (branch == null) {
+ branchLabel.setText("Error: Must Select a Branch");
+ } else if (Widgets.isAccessible(searchComposite) && searchComposite.isExecuteSearchEvent(event) && Widgets.isAccessible(optionsComposite)) {
+ NewSearchUI.activateSearchResultView();
+ if (optionsComposite.isSearchByIdEnabled()) {
+ NewSearchUI.runQueryInBackground(new IdArtifactSearch(searchComposite.getQuery(), branch,
+ optionsComposite.isIncludeDeletedEnabled()));
+ } else {
+ NewSearchUI.runQueryInBackground(new RemoteArtifactSearch(searchComposite.getQuery(), branch,
+ optionsComposite.isIncludeDeletedEnabled(), optionsComposite.isMatchWordOrderEnabled(),
+ optionsComposite.isMatchAllLocationsEnabled(), optionsComposite.isCaseSensitiveEnabled(),
+ optionsComposite.getAttributeTypeFilter()));
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/RemoteArtifactSearch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/RemoteArtifactSearch.java
new file mode 100644
index 00000000000..93ecabf1f55
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/RemoteArtifactSearch.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+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.MultiStatus;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.XmlTextInputStream;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactMatch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactXmlQueryResultParser.MatchLocation;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.search.page.AttributeLineElement;
+import org.eclipse.osee.framework.ui.skynet.search.page.AttributeMatch;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class RemoteArtifactSearch extends AbstractArtifactSearchQuery {
+ private final String queryString;
+ private final String[] attributeTypeNames;
+ private final boolean includeDeleted;
+ private final boolean matchWordOrder;
+ private final Branch branch;
+ private final boolean findAllMatchLocations;
+ private final boolean isCaseSensitive;
+
+ RemoteArtifactSearch(String queryString, Branch branch, boolean includeDeleted, boolean matchWordOrder, boolean findAllMatchLocations, boolean isCaseSensitive, String... attributeTypeNames) {
+ this.branch = branch;
+ this.includeDeleted = includeDeleted;
+ this.attributeTypeNames = attributeTypeNames;
+ this.queryString = queryString;
+ this.matchWordOrder = matchWordOrder;
+ this.findAllMatchLocations = findAllMatchLocations;
+ this.isCaseSensitive = isCaseSensitive;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchQuery#getCriteriaLabel()
+ */
+ @Override
+ public String getCriteriaLabel() {
+ List<String> optionsList = new ArrayList<String>();
+ if (includeDeleted) {
+ optionsList.add("Include Deleted");
+ }
+
+ if (matchWordOrder) {
+ optionsList.add("Match Word Order");
+ if (findAllMatchLocations) {
+ optionsList.add("All Matches");
+ } else {
+ optionsList.add("1st Match Only");
+ }
+ }
+
+ if (isCaseSensitive) {
+ optionsList.add("Case Sensitive");
+ }
+
+ if (attributeTypeNames != null && attributeTypeNames.length > 0) {
+ optionsList.add(String.format("Attribute Type Filter:%s", Arrays.deepToString(attributeTypeNames)));
+ }
+
+ String options = String.format(" - Options:[%s]", StringFormat.listToValueSeparatedString(optionsList, ", "));
+ return String.format("%s%s", queryString, optionsList.size() > 0 ? options : "");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchQuery#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor pm) {
+ setIsDoneRunning(false);
+ aResult.removeAll();
+ long startTime = System.currentTimeMillis();
+ int artifactCount = 0;
+ long startCollectTime = startTime;
+ long endOfloadTime = startTime;
+ int lineMatches = 0;
+ try {
+ List<ArtifactMatch> matches =
+ ArtifactQuery.getArtifactMatchesFromAttributeWithKeywords(branch, queryString, matchWordOrder,
+ includeDeleted, findAllMatchLocations, isCaseSensitive, attributeTypeNames);
+
+ endOfloadTime = System.currentTimeMillis();
+
+ startCollectTime = System.currentTimeMillis();
+ ResultCollector resultCollector = new ResultCollector(aResult);
+
+ for (ArtifactMatch artifactMatch : matches) {
+ resultCollector.beginReporting();
+ if (artifactMatch.hasMatchData()) {
+ try {
+ Artifact artifact = artifactMatch.getArtifact();
+ HashCollection<Attribute<?>, MatchLocation> matchData = artifactMatch.getMatchData();
+ for (Attribute<?> attribute : matchData.keySet()) {
+ for (MatchLocation matchLocation : matchData.getValues(attribute)) {
+ resultCollector.acceptMatchData(artifact, attribute, matchLocation);
+ lineMatches++;
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, String.format(
+ "Error processing attribute line matches for [%s]", artifactMatch.getArtifact()), ex);
+ resultCollector.acceptArtifactMatch(artifactMatch);
+ }
+ } else {
+ resultCollector.acceptArtifactMatch(artifactMatch);
+ }
+ resultCollector.endReporting();
+ artifactCount++;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), OseeLevel.SEVERE_POPUP, ex);
+ } finally {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, String.format(
+ "Quick Search: [%s] artifacts with [%s] location matches loaded in [%s secs] collected in [%s]",
+ artifactCount, lineMatches, (endOfloadTime - startTime) / 1000.0, Lib.getElapseString(startCollectTime)));
+ }
+ setIsDoneRunning(true);
+ return new MultiStatus(NewSearchUI.PLUGIN_ID, IStatus.OK, "OK", null);
+ }
+
+ private final class ResultCollector {
+
+ private final AbstractTextSearchResult fResult;
+ private ArrayList<Match> fCachedMatches;
+
+ private ResultCollector(AbstractTextSearchResult result) {
+ fResult = result;
+ }
+
+ public boolean acceptArtifactMatch(ArtifactMatch artifactMatch) {
+ fResult.addMatch(new Match(artifactMatch.getArtifact(), 1, 2));
+ flushMatches();
+ return true;
+ }
+
+ public boolean acceptMatchData(Artifact artifact, Attribute<?> attribute, MatchLocation matchLocation) {
+ int matchOffset = matchLocation.getStartPosition() - 1;
+ if (matchOffset < 0) {
+ matchOffset = 0;
+ }
+ int matchEnd = matchLocation.getEndPosition();
+ int matchLength = matchEnd - matchOffset;
+
+ AttributeLineElement lineElement = getLineElement(matchOffset, matchEnd, artifact, attribute);
+ if (lineElement != null) {
+ AttributeMatch match = new AttributeMatch(artifact, matchOffset, matchLength, lineElement);
+ fCachedMatches.add(match);
+ }
+ return true;
+ }
+
+ private AttributeLineElement getLineElement(int offset, int matchEnd, Artifact artifact, Attribute<?> attribute) {
+ int lineNumber = 1;
+ int lineStart = 0;
+ if (!fCachedMatches.isEmpty()) {
+ AttributeMatch last = (AttributeMatch) fCachedMatches.get(fCachedMatches.size() - 1);
+ AttributeLineElement lineElement = last.getLineElement();
+ if (lineElement.contains(offset) && lineElement.getAttribute().equals(attribute)) {
+ return lineElement;
+ }
+ lineStart = lineElement.getOffset() + lineElement.getLength();
+ lineNumber = lineElement.getLine() + 1;
+ }
+ if (offset < lineStart) {
+ return null; // offset before the last line
+ }
+
+ int i = lineStart;
+ String content = getContentFromAttribute(attribute);
+ int contentLength = content.length();
+ int charCount = 0;
+ while (i < contentLength) {
+ char ch = content.charAt(i++);
+ charCount++;
+ if (charCount >= 40 && Character.isWhitespace(ch) && matchEnd < i) {
+ ch = '\n';
+ charCount = 0;
+ }
+ if (ch == '\n' || ch == '\r') {
+ if (ch == '\r' && i < contentLength && content.charAt(i) == '\n') {
+ i++;
+ }
+ if (offset < i) {
+ String lineContent = getContents(content, lineStart, i); // include line delimiter
+ return new AttributeLineElement(artifact, attribute, lineNumber, lineStart, lineContent);
+ }
+ lineNumber++;
+ lineStart = i;
+ }
+ }
+ if (offset < i) {
+ String lineContent = getContents(attribute, lineStart, i);
+ return new AttributeLineElement(artifact, attribute, lineNumber, lineStart, lineContent);
+ }
+ return null; // offset outside of range
+ }
+
+ public String getContents(Attribute<?> attribute, int start, int end) {
+ String contents = getContentFromAttribute(attribute);
+ if (Strings.isValid(contents)) {
+ contents = getContents(contents, start, end);
+ }
+ return contents;
+ }
+
+ private String getContentFromAttribute(Attribute<?> attribute) {
+ try {
+ Object value = attribute.getValue();
+ if (!attribute.getAttributeType().getTaggerId().contains("Default")) {
+ return Lib.inputStreamToString(new XmlTextInputStream((String) value));
+ } else if (value instanceof String) {
+ return (String) value;
+ } else {
+ return attribute.getDisplayableString();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return "";
+ }
+
+ private String getContents(String content, int start, int end) {
+ StringBuffer buf = new StringBuffer();
+ for (int i = start; i < end; i++) {
+ char ch = content.charAt(i);
+ if (Character.isWhitespace(ch) || Character.isISOControl(ch)) {
+ buf.append(' ');
+ } else {
+ buf.append(ch);
+ }
+ }
+ return buf.toString();
+ }
+
+ public void beginReporting() {
+ fCachedMatches = new ArrayList<Match>();
+ }
+
+ public void endReporting() {
+ flushMatches();
+ fCachedMatches = null;
+ }
+
+ private void flushMatches() {
+ if (fCachedMatches != null && !fCachedMatches.isEmpty()) {
+ fResult.addMatches(fCachedMatches.toArray(new Match[fCachedMatches.size()]));
+ fCachedMatches.clear();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/SearchFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/SearchFilter.java
new file mode 100644
index 00000000000..21dd6efb75c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/SearchFilter.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.framework.ui.skynet.search;
+
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.EQUAL;
+import static org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator.LIKE;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.skynet.core.artifact.search.DepricatedOperator;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterTableViewer;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class SearchFilter {
+ private static final Pattern wildCardPattern = Pattern.compile("(?<!\\\\)\\*");
+ private String filterName;
+ protected Control optionsControl;
+ protected boolean not;
+
+ public SearchFilter(String filterName, Control optionsControl) {
+ this.filterName = filterName;
+ this.optionsControl = optionsControl;
+ this.not = false;
+ }
+
+ public abstract void addFilterTo(FilterTableViewer filterViewer);
+
+ public boolean isValid() {
+ return false;
+ }
+
+ protected class OperatorAndValue {
+ DepricatedOperator operator;
+ String value;
+ }
+
+ public OperatorAndValue handleWildCard(String value) {
+ OperatorAndValue result = new OperatorAndValue();
+ Matcher wildCardMatcher = wildCardPattern.matcher(value);
+ if (wildCardMatcher.find()) {
+ wildCardMatcher.reset();
+ value = wildCardMatcher.replaceAll("%");
+ result.operator = LIKE;
+ } else {
+ result.operator = EQUAL;
+ }
+ result.value = value.replaceAll("\\\\\\*", "*");
+ return result;
+ }
+
+ /**
+ * @return Returns the not.
+ */
+ public boolean isNot() {
+ return not;
+ }
+
+ /**
+ * @param not The not to set.
+ */
+ public void setNot(boolean not) {
+ this.not = not;
+ }
+
+ protected String getFilterName() {
+ return filterName;
+ }
+
+ public abstract void loadFromStorageString(FilterTableViewer filterViewer, String type, String value, String storageString, boolean isNotEnabled);
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModel.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModel.java
new file mode 100644
index 00000000000..1ddab801b4b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModel.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.framework.ui.skynet.search.filter;
+
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.skynet.core.artifact.search.InRelationSearch;
+
+public class FilterModel {
+
+ private String searchType;
+ private String type;
+ private String value;
+ private ISearchPrimitive searchPrimitive;
+
+ public FilterModel(ISearchPrimitive searchPrimitive, String search, String type, String value) {
+ this.searchPrimitive = searchPrimitive;
+ this.searchType = search;
+ this.type = type;
+ this.value = value;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @param type - The type to set.
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * @return Returns the function.
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * @param function The function to set.
+ */
+ public void setvalue(String function) {
+ this.value = function;
+ }
+
+ /**
+ * @return Returns the searchType.
+ */
+ public ISearchPrimitive getSearchPrimitive() {
+ return searchPrimitive;
+ }
+
+ /**
+ * @return Returns the searchType.
+ */
+ public String getSearch() {
+ return searchType;
+ }
+
+ /**
+ * @param searchType The searchType to set.
+ */
+ public void setSearch(String searchType) {
+ this.searchType = searchType;
+ }
+
+ public void setSearchPrimitive(ISearchPrimitive searchPrimitive) {
+ this.searchPrimitive = searchPrimitive;
+ }
+
+ @Override
+ public String toString() {
+ String toReturn = searchPrimitive.toString();
+ if (searchPrimitive instanceof InRelationSearch) {
+ toReturn += " " + value;
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelLabelProvider.java
new file mode 100644
index 00000000000..9d559b8b645
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelLabelProvider.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.framework.ui.skynet.search.filter;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.osee.framework.skynet.core.artifact.search.NotSearch;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+public class FilterModelLabelProvider implements ITableLabelProvider {
+
+ public FilterModelLabelProvider() {
+ super();
+ };
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ String result = "";
+ FilterModel model = (FilterModel) element;
+
+ switch (columnIndex) {
+ case FilterTableViewer.DELETE_NUM:
+ // This only has an image
+ break;
+ case FilterTableViewer.SEARCH_NUM:
+ result = model.getSearch();
+ break;
+ case FilterTableViewer.TYPE_NUM:
+ result = model.getType();
+ break;
+ case FilterTableViewer.VALUE_NUM:
+ result = model.getValue();
+ break;
+ default:
+ break;
+ }
+ return result;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ switch (columnIndex) {
+ case FilterTableViewer.DELETE_NUM:
+ return ImageManager.getImage(FrameworkImage.REMOVE);
+ case FilterTableViewer.SEARCH_NUM:
+ if (((FilterModel) element).getSearchPrimitive() instanceof NotSearch) {
+ return ImageManager.getImage(FrameworkImage.NOT_EQUAL);
+ }
+ break;
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+ * java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelList.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelList.java
new file mode 100644
index 00000000000..fd6491b6768
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterModelList.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.framework.ui.skynet.search.filter;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.ui.skynet.search.ui.IFilterListViewer;
+
+public class FilterModelList {
+
+ private ArrayList<FilterModel> filters = new ArrayList<FilterModel>();
+ private Set<IFilterListViewer> changeListeners = new HashSet<IFilterListViewer>();
+ private boolean isAllSelected;
+
+ /**
+ * Constructor
+ */
+ public FilterModelList() {
+ super();
+ filters = new ArrayList<FilterModel>();
+ changeListeners = new HashSet<IFilterListViewer>();
+ }
+
+ /**
+ * Return the collection of ItemTask
+ */
+ public ArrayList<FilterModel> getFilters() {
+ return filters;
+ }
+
+ /**
+ * Add a new task to the collection of tasks
+ */
+ public void addFilter(FilterModel filter, boolean top) {
+ if (top)
+ filters.add(0, filter);
+ else
+ filters.add(filter);
+ for (IFilterListViewer flv : changeListeners)
+ flv.addFilter(filter);
+ }
+
+ /**
+ * @param filter -
+ */
+ public void removeFilter(FilterModel filter) {
+ filters.remove(filter);
+ for (IFilterListViewer flv : changeListeners)
+ flv.removeFilter(filter);
+ }
+
+ public String toString() {
+ String str = "";
+ for (int i = 0; i < filters.size(); i++) {
+ String name = filters.toString();
+ str += "\nTask " + name;
+ }
+ return str + "\n\n";
+ }
+
+ /**
+ * @param filter
+ */
+ public void filterChanged(FilterModel filter) {
+ for (IFilterListViewer flv : changeListeners)
+ flv.updateFilter(filter);
+ }
+
+ /**
+ * @param viewer
+ */
+ public void removeChangeListener(IFilterListViewer viewer) {
+ changeListeners.remove(viewer);
+ }
+
+ /**
+ * @param viewer
+ */
+ public void addChangeListener(IFilterListViewer viewer) {
+ changeListeners.add(viewer);
+ }
+
+ public boolean isAllSelected() {
+ return isAllSelected;
+ }
+
+ public void setAllSelected(boolean isAllSelected) {
+ this.isAllSelected = isAllSelected;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableCellModifier.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableCellModifier.java
new file mode 100644
index 00000000000..17dcfd24fe5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableCellModifier.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.framework.ui.skynet.search.filter;
+
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.swt.widgets.TableItem;
+
+public class FilterTableCellModifier implements ICellModifier {
+
+ private FilterTableViewer filterTableViewer;
+
+ public FilterTableCellModifier(FilterTableViewer filterTableViewer) {
+ super();
+ this.filterTableViewer = filterTableViewer;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+ */
+ public boolean canModify(Object element, String property) {
+ // Find the index of the column
+ int columnIndex = filterTableViewer.getColumnNames().indexOf(property);
+
+ switch (columnIndex) {
+ case FilterTableViewer.DELETE_NUM:
+ return true;
+ }
+ return true;
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+ */
+ public Object getValue(Object element, String property) {
+ // Find the index of the column
+ int columnIndex = filterTableViewer.getColumnNames().indexOf(property);
+
+ switch (columnIndex) {
+ case FilterTableViewer.DELETE_NUM:
+ return new Boolean(false);
+ }
+ return "";
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public void modify(Object element, String property, Object value) {
+
+ // Find the index of the column
+ int columnIndex = filterTableViewer.getColumnNames().indexOf(property);
+
+ TableItem item = (TableItem) element;
+ FilterModel model = (FilterModel) item.getData();
+
+ switch (columnIndex) {
+ case FilterTableViewer.DELETE_NUM:
+ filterTableViewer.removeFilter(model);
+ break;
+ default:
+ }
+ filterTableViewer.getFilterList().filterChanged(model);
+ filterTableViewer.refresh();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableViewer.java
new file mode 100644
index 00000000000..89a4331576b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/filter/FilterTableViewer.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search.filter;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ISearchPrimitive;
+import org.eclipse.osee.framework.ui.skynet.search.ArtifactSearchPage;
+import org.eclipse.osee.framework.ui.skynet.search.ui.IFilterListViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+public class FilterTableViewer {
+
+ private Table table;
+ private TableViewer tableViewer;
+
+ private FilterModelList filterList;
+
+ private String[] columnNames = new String[] {"Remove", "Filter", "Type", "Value"};
+ private static int[] columnWidths = new int[] {75, 100, 100, 100, 200};
+
+ public static final int DELETE_NUM = 0;
+ public static final int SEARCH_NUM = 1;
+ public static final int TYPE_NUM = 2;
+ public static final int VALUE_NUM = 3;
+
+ /**
+ * @param table -
+ */
+ public FilterTableViewer(Table table) {
+ this.table = table;
+
+ this.createControl();
+
+ tableViewer.setContentProvider(new FilterContentProvider());
+ tableViewer.setLabelProvider(new FilterModelLabelProvider());
+ tableViewer.setInput(filterList);
+ }
+
+ public void addItem(ISearchPrimitive searchPrimitive, String search, String type, String value) {
+ FilterModel model = new FilterModel(searchPrimitive, search, type, value);
+ filterList.addFilter(model, true);
+ }
+
+ private void createControl() {
+ filterList = new FilterModelList();
+ createColumns();
+ createTableViewer();
+ }
+
+ /**
+ * Create the TableViewer
+ */
+ private void createTableViewer() {
+
+ tableViewer = new TableViewer(table);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setColumnProperties(columnNames);
+
+ CellEditor[] validEditors = new CellEditor[columnNames.length];
+ validEditors[DELETE_NUM] = new CheckboxCellEditor(table, SWT.NONE);
+
+ // Assign the cell editors to the viewer
+ tableViewer.setCellEditors(validEditors);
+ // Assign the cell modifier to the viewer
+ tableViewer.setCellModifier(new FilterTableCellModifier(this));
+ }
+
+ /**
+ * Create the Columns
+ */
+ private void createColumns() {
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ TableColumn column = new TableColumn(table, SWT.LEFT, DELETE_NUM);
+ column.setText(columnNames[DELETE_NUM]);
+ column.setWidth(columnWidths[DELETE_NUM]);
+
+ column = new TableColumn(table, SWT.LEFT, SEARCH_NUM);
+ column.setText(columnNames[SEARCH_NUM]);
+ column.setWidth(columnWidths[SEARCH_NUM]);
+
+ column = new TableColumn(table, SWT.LEFT, TYPE_NUM);
+ column.setText(columnNames[TYPE_NUM]);
+ column.setWidth(columnWidths[TYPE_NUM]);
+
+ column = new TableColumn(table, SWT.LEFT, VALUE_NUM);
+ column.setText(columnNames[VALUE_NUM]);
+ column.setWidth(columnWidths[VALUE_NUM]);
+ }
+
+ public List<String> getColumnNames() {
+ return Arrays.asList(columnNames);
+ }
+
+ public FilterModelList getFilterList() {
+ return this.filterList;
+ }
+
+ public void refresh() {
+ tableViewer.refresh();
+ ArtifactSearchPage.updateOKStatus();
+ }
+
+ /**
+ * @return Returns the table.
+ */
+ public Table getTable() {
+ return table;
+ }
+
+ public void removeFilter(FilterModel filter) {
+ filterList.removeFilter(filter);
+ }
+
+ public int getCount() {
+ return filterList.getFilters().size();
+ }
+ /**
+ * InnerClass that acts as a proxy for the FilterModelList providing content for the Table. It implements the
+ * IFilterListViewer interface since it must register changeListeners with the FilterModelList
+ */
+ class FilterContentProvider implements IStructuredContentProvider, IFilterListViewer {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ if (newInput != null) filterList.addChangeListener(this);
+ if (oldInput != null) filterList.removeChangeListener(this);
+ }
+
+ public void dispose() {
+ filterList.removeChangeListener(this);
+ }
+
+ // Return the tasks as an array of Objects
+ public Object[] getElements(Object parent) {
+ return filterList.getFilters().toArray();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IFilterListViewer#addFilter(FilterModel)
+ */
+ public void addFilter(FilterModel filter) {
+ tableViewer.add(filter);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IFilterListViewer#removeFilter(FilterModel)
+ */
+ public void removeFilter(FilterModel filter) {
+ tableViewer.remove(filter);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see IFilterListViewer#updateFilter(FilterModel)
+ */
+ public void updateFilter(FilterModel filter) {
+ tableViewer.update(filter, null);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AbstractArtifactSearchViewPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AbstractArtifactSearchViewPage.java
new file mode 100644
index 00000000000..232d8b4f154
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AbstractArtifactSearchViewPage.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.framework.ui.skynet.search.page;
+
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractArtifactSearchViewPage extends AbstractTextSearchViewPage {
+
+ public AbstractArtifactSearchResult getInput() {
+ return (AbstractArtifactSearchResult) super.getInput();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchLabelProvider.java
new file mode 100644
index 00000000000..2cd22c177d2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchLabelProvider.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search.page;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ArtifactDecorator;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactSearchLabelProvider extends LabelProvider implements IStyledLabelProvider {
+ private static final String HIGHLIGHT_BG_COLOR_NAME = "org.eclipse.jdt.ui.ColoredLabels.match_highlight"; //$NON-NLS-1$
+
+ private static final Styler HIGHLIGHT_STYLE = StyledString.createColorRegistryStyler(null, HIGHLIGHT_BG_COLOR_NAME);
+ private static final Styler DELETED_ARTIFACT_STYLE = StyledString.createColorRegistryStyler("red", null);
+
+ private static final String fgEllipses = " ... "; //$NON-NLS-1$
+
+ private final AbstractArtifactSearchViewPage fPage;
+ private final Comparator fMatchComparator;
+ private final ArtifactDecorator artifactDecorator;
+
+ private final Map<Image, Image> disabledImageMap;
+
+ public ArtifactSearchLabelProvider(AbstractArtifactSearchViewPage page, ArtifactDecorator artifactDecorator) {
+ this.artifactDecorator = artifactDecorator;
+ this.disabledImageMap = new HashMap<Image, Image>();
+ fPage = page;
+ fMatchComparator = new Comparator() {
+ public int compare(Object o1, Object o2) {
+ return ((AttributeMatch) o1).getOriginalOffset() - ((AttributeMatch) o2).getOriginalOffset();
+ }
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object object) {
+ return getStyledText(object).getString();
+ }
+
+ public StyledString getStyledText(Object element) {
+ if (element instanceof AttributeLineElement) {
+ return getLineElementLabel((AttributeLineElement) element);
+ }
+
+ if (!(element instanceof Artifact)) return new StyledString(String.format("Undefined: %s %s", element.getClass(),
+ element));
+
+ Artifact artifact = (Artifact) element;
+ String name = artifact.getDescriptiveName();
+ int matchCount = getMatchCount(artifact);
+ if (matchCount > 0) {
+ StyledString artifactString = getColoredLabelWithCounts(artifact, matchCount, new StyledString(name));
+ return getArtifactText(artifact, artifactString);
+ } else {
+ return new StyledString(name, StyledString.DECORATIONS_STYLER);
+ }
+ }
+
+ private int getMatchCount(Object element) {
+ AbstractArtifactSearchResult result = fPage.getInput();
+ if (result == null) {
+ return -1;
+ }
+ return result.getMatchCount(element);
+ }
+
+ private StyledString getArtifactText(Artifact artifact, StyledString coloredName) {
+ if (artifact.isDeleted()) {
+ coloredName.append(' ').append("<Deleted>", DELETED_ARTIFACT_STYLE);
+ }
+ if (artifactDecorator != null) {
+ if (artifactDecorator.showArtVersion()) {
+ coloredName.append(' ').append("-" + artifact.getGammaId() + "-", StyledString.DECORATIONS_STYLER);
+ }
+
+ if (artifactDecorator.showArtIds()) {
+ coloredName.append(' ').append("(" + artifact.getArtId() + ")", StyledString.DECORATIONS_STYLER);
+ }
+ try {
+ if (artifactDecorator.showArtType()) {
+ coloredName.append(' ').append("<" + artifact.getArtifactTypeName() + ">",
+ StyledString.DECORATIONS_STYLER);
+ }
+
+ String selectedAttributes = artifactDecorator.getSelectedAttributeData(artifact);
+ if (Strings.isValid(selectedAttributes)) {
+ coloredName.append(' ').append(selectedAttributes, StyledString.DECORATIONS_STYLER);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return coloredName;
+ }
+
+ @SuppressWarnings("unchecked")
+ private StyledString getLineElementLabel(AttributeLineElement lineElement) {
+ String lineNumberString = String.format("%s, %s ", lineElement.getLine(), lineElement.getOffset());
+ StyledString str = new StyledString(lineNumberString, StyledString.QUALIFIER_STYLER);
+
+ Match[] matches = lineElement.getMatches(fPage.getInput());
+ Arrays.sort(matches, fMatchComparator);
+
+ String content = lineElement.getContents();
+
+ int pos = evaluateLineStart(matches, content, lineElement.getOffset());
+
+ int length = content.length();
+
+ int charsToCut = getCharsToCut(length, matches); // number of characters to leave away if the line is too long
+ for (int i = 0; i < matches.length; i++) {
+ AttributeMatch match = (AttributeMatch) matches[i];
+ int start = Math.max(match.getOriginalOffset() - lineElement.getOffset(), 0);
+ // append gap between last match and the new one
+ if (pos < start) {
+ if (charsToCut > 0) {
+ charsToCut = appendShortenedGap(content, pos, start, charsToCut, i == 0, str);
+ } else {
+ str.append(content.substring(pos, start));
+ }
+ }
+ // append match
+ int end =
+ Math.min(match.getOriginalOffset() + match.getOriginalLength() - lineElement.getOffset(),
+ lineElement.getLength());
+ str.append(content.substring(start, end), HIGHLIGHT_STYLE);
+ pos = end;
+ }
+ // append rest of the line
+ if (charsToCut > 0) {
+ appendShortenedGap(content, pos, length, charsToCut, false, str);
+ } else {
+ str.append(content.substring(pos));
+ }
+ return str;
+ }
+
+ private static final int MIN_MATCH_CONTEXT = 10; // minimal number of characters shown after and before a match
+
+ private int appendShortenedGap(String content, int start, int end, int charsToCut, boolean isFirst, StyledString str) {
+ int gapLength = end - start;
+ if (!isFirst) {
+ gapLength -= MIN_MATCH_CONTEXT;
+ }
+ if (end < content.length()) {
+ gapLength -= MIN_MATCH_CONTEXT;
+ }
+ if (gapLength < MIN_MATCH_CONTEXT) { // don't cut, gap is too small
+ str.append(content.substring(start, end));
+ return charsToCut;
+ }
+
+ int context = MIN_MATCH_CONTEXT;
+ if (gapLength > charsToCut) {
+ context += gapLength - charsToCut;
+ }
+
+ if (!isFirst) {
+ str.append(content.substring(start, start + context)); // give all extra context to the right side of a match
+ context = MIN_MATCH_CONTEXT;
+ }
+
+ str.append(fgEllipses, StyledString.QUALIFIER_STYLER);
+
+ if (end < content.length()) {
+ str.append(content.substring(end - context, end));
+ }
+ return charsToCut - gapLength + fgEllipses.length();
+ }
+
+ private int getCharsToCut(int contentLength, Match[] matches) {
+ if (contentLength <= 256 || !"win32".equals(SWT.getPlatform()) || matches.length == 0) { //$NON-NLS-1$
+ return 0; // no shortening required
+ }
+ // XXX: workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=38519
+ return contentLength - 256 + Math.max(matches.length * fgEllipses.length(), 100);
+ }
+
+ private int evaluateLineStart(Match[] matches, String lineContent, int lineOffset) {
+ int max = lineContent.length();
+ if (matches.length > 0) {
+ AttributeMatch match = (AttributeMatch) matches[0];
+ max = match.getOriginalOffset() - lineOffset;
+ if (max < 0) {
+ return 0;
+ }
+ }
+ for (int i = 0; i < max; i++) {
+ char ch = lineContent.charAt(i);
+ if (!Character.isWhitespace(ch) || ch == '\n' || ch == '\r') {
+ return i;
+ }
+ }
+ return max;
+ }
+
+ private StyledString getColoredLabelWithCounts(Object element, int matchCount, StyledString coloredName) {
+ String countInfo = String.format("(%s match%s)", matchCount, matchCount > 1 ? "es" : "");
+ coloredName.append(' ').append(countInfo, StyledString.COUNTER_STYLER);
+ return coloredName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ Image toReturn = null;
+ if (element instanceof AttributeLineElement) {
+ toReturn = ImageManager.getImage(FrameworkImage.LINE_MATCH);
+ } else if (element instanceof Artifact) {
+ Image artImage = ImageManager.getImage((Artifact) element);
+ int matchCount = getMatchCount(element);
+ if (matchCount > 0) {
+ toReturn = artImage;
+ } else {
+ Image disabledImage = disabledImageMap.get(artImage);
+ if (disabledImage == null) {
+ disabledImage = new Image(artImage.getDevice(), artImage, SWT.IMAGE_DISABLE);
+ disabledImageMap.put(artImage, disabledImage);
+ }
+ toReturn = disabledImage;
+ }
+ }
+ return toReturn;
+ }
+
+ private static StyledString decorateColoredString(StyledString string, String decorated, Styler color) {
+ String label = string.getString();
+ int originalStart = decorated.indexOf(label);
+ if (originalStart == -1) {
+ return new StyledString(decorated); // the decorator did something wild
+ }
+ if (originalStart > 0) {
+ StyledString newString = new StyledString(decorated.substring(0, originalStart), color);
+ newString.append(string);
+ string = newString;
+ }
+ if (decorated.length() > originalStart + label.length()) { // decorator appended something
+ return string.append(decorated.substring(originalStart + label.length()), color);
+ }
+ return string; // no change
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchPage.java
new file mode 100644
index 00000000000..92b4212fc8a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactSearchPage.java
@@ -0,0 +1,553 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search.page;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.IBranchProvider;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ArtifactDecorator;
+import org.eclipse.osee.framework.ui.skynet.ArtifactDoubleClick;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener;
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.search.ui.IContextMenuConstants;
+import org.eclipse.search.ui.ISearchResultViewPart;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.part.IPageSite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactSearchPage extends AbstractArtifactSearchViewPage implements IAdaptable, IRebuildMenuListener, IFrameworkTransactionEventListener, IArtifactsPurgedEventListener, IBranchProvider {
+ private static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.ArtifactSearchView";
+
+ protected static final Match[] EMPTY_MATCH_ARRAY = new Match[0];
+ public static class DecoratorIgnoringViewerSorter extends ViewerComparator {
+ private final ILabelProvider fLabelProvider;
+
+ public DecoratorIgnoringViewerSorter(ILabelProvider labelProvider) {
+ fLabelProvider = labelProvider;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object)
+ */
+ public int category(Object element) {
+ if (element instanceof Artifact) {
+ return 4;
+ } else if (element instanceof AttributeLineElement) {
+ return 3;
+ } else if (element instanceof AttributeMatch) {
+ return 2;
+ }
+ return 1;
+ }
+
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ int cat1 = category(e1);
+ int cat2 = category(e2);
+
+ if (cat1 != cat2) {
+ return cat1 - cat2;
+ }
+
+ if (e1 instanceof AttributeLineElement && e2 instanceof AttributeLineElement) {
+ AttributeLineElement m1 = (AttributeLineElement) e1;
+ AttributeLineElement m2 = (AttributeLineElement) e2;
+ return m1.getOffset() - m2.getOffset();
+ }
+
+ String name1 = fLabelProvider.getText(e1);
+ String name2 = fLabelProvider.getText(e2);
+ if (name1 == null) name1 = "";//$NON-NLS-1$
+ if (name2 == null) name2 = "";//$NON-NLS-1$
+ return getComparator().compare(name1, name2);
+ }
+ }
+
+ private static final String KEY_LIMIT = "org.eclipse.search.resultpage.limit"; //$NON-NLS-1$
+ private static final int DEFAULT_ELEMENT_LIMIT = 1000;
+
+ private IArtifactSearchContentProvider fContentProvider;
+ private ArtifactDecorator artifactDecorator;
+ private ISelectionProvider selectionProvider;
+
+ public ArtifactSearchPage() {
+ setElementLimit(new Integer(DEFAULT_ELEMENT_LIMIT));
+ }
+
+ public void setElementLimit(Integer elementLimit) {
+ super.setElementLimit(elementLimit);
+ int limit = elementLimit.intValue();
+ getSettings().put(KEY_LIMIT, limit);
+ }
+
+ public StructuredViewer getViewer() {
+ return super.getViewer();
+ }
+
+ private void addDragAdapters(StructuredViewer viewer) {
+ new SearchDragAndDrop(viewer.getControl(), VIEW_ID);
+ }
+
+ private ArtifactDecorator getArtifactDecorator() {
+ if (artifactDecorator == null) {
+ artifactDecorator = new ArtifactDecorator(SkynetGuiPlugin.ARTIFACT_SEARCH_RESULTS_ATTRIBUTES_PREF);
+ artifactDecorator.addActions(getSite().getActionBars().getMenuManager(), this);
+ }
+ return artifactDecorator;
+ }
+
+ private ISelectionProvider getSearchSelectionProvider() {
+ if (selectionProvider == null) {
+ selectionProvider = new SearchSelectionProvider();
+ }
+ return selectionProvider;
+ }
+
+ protected void configureTableViewer(TableViewer viewer) {
+ viewer.setUseHashlookup(true);
+ ArtifactDecorator decorator = getArtifactDecorator();
+ decorator.setViewer(viewer);
+ ArtifactSearchLabelProvider innerLabelProvider = new ArtifactSearchLabelProvider(this, decorator);
+ viewer.setLabelProvider(new DecoratingArtifactSearchLabelProvider(innerLabelProvider));
+ viewer.setContentProvider(new ArtifactTableContentProvider(this));
+ viewer.setComparator(new DecoratorIgnoringViewerSorter(innerLabelProvider));
+ fContentProvider = (IArtifactSearchContentProvider) viewer.getContentProvider();
+ addDragAdapters(viewer);
+ }
+
+ protected void configureTreeViewer(TreeViewer viewer) {
+ viewer.setUseHashlookup(true);
+ ArtifactDecorator decorator = getArtifactDecorator();
+ decorator.setViewer(viewer);
+ ArtifactSearchLabelProvider innerLabelProvider = new ArtifactSearchLabelProvider(this, decorator);
+ viewer.setLabelProvider(new DecoratingArtifactSearchLabelProvider(innerLabelProvider));
+ viewer.setContentProvider(new ArtifactTreeContentProvider(this, viewer));
+ viewer.setComparator(new DecoratorIgnoringViewerSorter(innerLabelProvider));
+ fContentProvider = (IArtifactSearchContentProvider) viewer.getContentProvider();
+ addDragAdapters(viewer);
+ }
+
+ protected void fillContextMenu(IMenuManager mgr) {
+ mgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ getSite().setSelectionProvider(getSearchSelectionProvider());
+
+ mgr.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, new Action("Open Search Preferences") {
+ public void run() {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ PreferencesUtil.createPreferenceDialogOn(shell, "org.eclipse.search.preferences.SearchPreferencePage",
+ null, null).open();
+ }
+ });
+ }
+
+ public void setViewPart(ISearchResultViewPart part) {
+ super.setViewPart(part);
+ }
+
+ public void init(IPageSite site) {
+ super.init(site);
+ setID(VIEW_ID);
+ OseeContributionItem.addTo(getSite(), false);
+ getSite().getActionBars().updateActionBars();
+ OseeEventManager.addListener(this);
+ }
+
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ protected void elementsChanged(Object[] objects) {
+ if (fContentProvider != null) {
+ fContentProvider.elementsChanged(objects);
+ }
+ }
+
+ protected void clear() {
+ if (fContentProvider != null) {
+ fContentProvider.clear();
+ }
+ }
+
+ public void restoreState(IMemento memento) {
+ super.restoreState(memento);
+
+ int elementLimit = DEFAULT_ELEMENT_LIMIT;
+ try {
+ elementLimit = getSettings().getInt(KEY_LIMIT);
+ } catch (NumberFormatException e) {
+ }
+ if (memento != null) {
+ Integer value = memento.getInteger(KEY_LIMIT);
+ if (value != null) elementLimit = value.intValue();
+ }
+ setElementLimit(new Integer(elementLimit));
+ }
+
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ memento.putInteger(KEY_LIMIT, getElementLimit().intValue());
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public String getLabel() {
+ String label = super.getLabel();
+ StructuredViewer viewer = getViewer();
+ if (viewer instanceof TableViewer) {
+ TableViewer tv = (TableViewer) viewer;
+
+ AbstractArtifactSearchResult result = getInput();
+ if (result != null) {
+ int itemCount = ((IStructuredContentProvider) tv.getContentProvider()).getElements(getInput()).length;
+ if (showLineMatches()) {
+ int matchCount = getInput().getMatchCount();
+ if (itemCount < matchCount) {
+ return String.format("%s (showing %s of %s matches)", label, itemCount, matchCount);
+ }
+ } else {
+ int fileCount = getInput().getElements().length;
+ if (itemCount < fileCount) {
+ return String.format("%s (showing %s of %s files)", label, itemCount, fileCount);
+ }
+ }
+ }
+ }
+ return label;
+ }
+
+ public int getDisplayedMatchCount(Object element) {
+ if (showLineMatches()) {
+ if (element instanceof AttributeLineElement) {
+ AttributeLineElement lineEntry = (AttributeLineElement) element;
+ return lineEntry.getNumberOfMatches(getInput());
+ }
+ return 0;
+ }
+ return super.getDisplayedMatchCount(element);
+ }
+
+ public Match[] getDisplayedMatches(Object element) {
+ if (showLineMatches()) {
+ if (element instanceof AttributeLineElement) {
+ AttributeLineElement lineEntry = (AttributeLineElement) element;
+ return lineEntry.getMatches(getInput());
+ }
+ return new Match[0];
+ }
+ return getInternalDisplayedMatches(element);
+ }
+
+ public Match[] getInternalDisplayedMatches(Object element) {
+ AbstractArtifactSearchResult result = getInput();
+ if (result == null) return EMPTY_MATCH_ARRAY;
+ Match[] matches = result.getMatches(element);
+ if (result.getActiveMatchFilters() == null) return matches;
+
+ int count = 0;
+ for (int i = 0; i < matches.length; i++) {
+ if (matches[i].isFiltered())
+ matches[i] = null;
+ else
+ count++;
+ }
+ if (count == matches.length) return matches;
+
+ Match[] filteredMatches = new Match[count];
+ for (int i = 0, k = 0; i < matches.length; i++) {
+ if (matches[i] != null) filteredMatches[k++] = matches[i];
+ }
+ return filteredMatches;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void evaluateChangedElements(Match[] matches, Set changedElements) {
+ if (showLineMatches()) {
+ for (int i = 0; i < matches.length; i++) {
+ if (matches[i] instanceof AttributeMatch) {
+ changedElements.add(((AttributeMatch) matches[i]).getLineElement());
+ } else {
+ changedElements.add(matches[i].getElement());
+ }
+ }
+ } else {
+ evaluateInternalChangedElements(matches, changedElements);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ protected void evaluateInternalChangedElements(Match[] matches, Set changedElements) {
+ for (int i = 0; i < matches.length; i++) {
+ changedElements.add(matches[i].getElement());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#handleOpen(org.eclipse.jface.viewers.OpenEvent)
+ */
+ @Override
+ protected void handleOpen(OpenEvent event) {
+ ArtifactDoubleClick.openArtifact(getSearchSelectionProvider().getSelection());
+ }
+
+ private boolean showLineMatches() {
+ AbstractArtifactSearchResult input = getInput();
+ return getLayout() == FLAG_LAYOUT_TREE && input != null && input.hasAttributeMatches();
+ }
+
+ private Collection<Artifact> getSelectedArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) getViewer().getSelection();
+
+ Object[] objects = selection.toArray();
+ if (objects.length == 0) {
+ return Collections.emptyList();
+ }
+
+ AbstractArtifactSearchResult resultInput = getInput();
+ if (resultInput == null) {
+ return Collections.emptyList();
+ }
+
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+ for (Object object : objects) {
+ Artifact toAdd = null;
+ if (object instanceof AttributeLineElement) {
+ toAdd = (Artifact) ((IAdaptable) object).getAdapter(Artifact.class);
+ artifacts.add(toAdd);
+ } else if (object instanceof IAdaptable) {
+ toAdd = (Artifact) ((IAdaptable) object).getAdapter(Artifact.class);
+ } else if (object instanceof Match) {
+ toAdd = (Artifact) ((Match) object).getElement();
+ }
+ if (toAdd != null) {
+ artifacts.add(toAdd);
+ }
+ }
+ return artifacts;
+ }
+ private class SearchDragAndDrop extends SkynetDragAndDrop {
+
+ public SearchDragAndDrop(Control control, String viewId) {
+ super(control, viewId);
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ Collection<Artifact> artifacts = getSelectedArtifacts();
+ return artifacts.toArray(new Artifact[artifacts.size()]);
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener#rebuildMenu()
+ */
+ @Override
+ public void rebuildMenu() {
+ // Do Nothing
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(final Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (getViewer() != null) {
+ AbstractArtifactSearchResult results = getInput();
+ if (results != null) {
+ for (Artifact artifact : transData.cacheDeletedArtifacts) {
+ for (Match match : results.getMatches(artifact)) {
+ results.removeMatch(match);
+ }
+ }
+ getViewer().refresh();
+ }
+ }
+ }
+ });
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.IArtifactsPurgedEventListener#handleArtifactsPurgedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleArtifactsPurgedEvent(Sender sender, final LoadedArtifacts loadedArtifacts) throws OseeCoreException {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ if (getViewer() != null) {
+ AbstractArtifactSearchResult results = getInput();
+ if (results != null) {
+ for (Artifact artifact : loadedArtifacts.getLoadedArtifacts()) {
+ for (Match match : results.getMatches(artifact)) {
+ results.removeMatch(match);
+ }
+ }
+ getViewer().refresh();
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ }
+
+ private class SearchSelectionProvider implements ISelectionProvider {
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+
+ }
+
+ public ISelection getSelection() {
+ return new ArtifactSelection(getSelectedArtifacts());
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+
+ }
+
+ public void setSelection(ISelection selection) {
+
+ }
+ }
+
+ public Branch getBranch() {
+ if (getInput() != null && getInput().getArtifactResults() != null && !getInput().getArtifactResults().isEmpty()) {
+ return getInput().getArtifactResults().get(0).getBranch();
+ }
+ return null;
+ }
+
+ private final class ArtifactSelection implements IStructuredSelection {
+ private final Collection<Artifact> collection;
+
+ private ArtifactSelection(Collection<Artifact> collection) {
+ this.collection = collection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelection#isEmpty()
+ */
+ @Override
+ public boolean isEmpty() {
+ return collection.isEmpty();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredSelection#getFirstElement()
+ */
+ @Override
+ public Object getFirstElement() {
+ return collection.size() == 0 ? null : iterator().next();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredSelection#iterator()
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Iterator iterator() {
+ return collection.iterator();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredSelection#size()
+ */
+ @Override
+ public int size() {
+ // TODO Auto-generated method stub
+ return collection.size();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredSelection#toArray()
+ */
+ @Override
+ public Object[] toArray() {
+ // TODO Auto-generated method stub
+ return collection.toArray();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredSelection#toList()
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public List toList() {
+ return new ArrayList<Artifact>(collection);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTableContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTableContentProvider.java
new file mode 100644
index 00000000000..b4c9969181a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTableContentProvider.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.framework.ui.skynet.search.page;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactTableContentProvider implements IStructuredContentProvider, IArtifactSearchContentProvider {
+
+ private final Object[] EMPTY_ARR = new Object[0];
+
+ private ArtifactSearchPage fPage;
+ private AbstractArtifactSearchResult fResult;
+
+ public ArtifactTableContentProvider(ArtifactSearchPage page) {
+ fPage = page;
+ }
+
+ public void dispose() {
+ // nothing to do
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof AbstractArtifactSearchResult) {
+ int elementLimit = getElementLimit();
+ Object[] elements = ((AbstractArtifactSearchResult) inputElement).getElements();
+ if (elementLimit != -1 && elements.length > elementLimit) {
+ Object[] shownElements = new Object[elementLimit];
+ System.arraycopy(elements, 0, shownElements, 0, elementLimit);
+ return shownElements;
+ }
+ return elements;
+ }
+ return EMPTY_ARR;
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (newInput instanceof AbstractArtifactSearchResult) {
+ fResult = (AbstractArtifactSearchResult) newInput;
+ }
+ }
+
+ public void elementsChanged(Object[] updatedElements) {
+ TableViewer viewer = getViewer();
+ int elementLimit = getElementLimit();
+ boolean tableLimited = elementLimit != -1;
+ for (int i = 0; i < updatedElements.length; i++) {
+ if (fResult.getMatchCount(updatedElements[i]) > 0) {
+ if (viewer.testFindItem(updatedElements[i]) != null)
+ viewer.update(updatedElements[i], null);
+ else {
+ if (!tableLimited || viewer.getTable().getItemCount() < elementLimit) viewer.add(updatedElements[i]);
+ }
+ } else
+ viewer.remove(updatedElements[i]);
+ }
+ }
+
+ private int getElementLimit() {
+ return fPage.getElementLimit().intValue();
+ }
+
+ private TableViewer getViewer() {
+ return (TableViewer) fPage.getViewer();
+ }
+
+ public void clear() {
+ getViewer().refresh();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTreeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTreeContentProvider.java
new file mode 100644
index 00000000000..52c83271c40
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/ArtifactTreeContentProvider.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.search.page;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactTreeContentProvider implements ITreeContentProvider, IArtifactSearchContentProvider {
+
+ private final Object[] EMPTY_ARR = new Object[0];
+
+ private AbstractArtifactSearchResult fResult;
+ private ArtifactSearchPage fPage;
+ private AbstractTreeViewer fTreeViewer;
+ @SuppressWarnings("unchecked")
+ private Map fChildrenMap;
+
+ ArtifactTreeContentProvider(ArtifactSearchPage page, AbstractTreeViewer viewer) {
+ fPage = page;
+ fTreeViewer = viewer;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ Object[] children = getChildren(inputElement);
+ int elementLimit = getElementLimit();
+ if (elementLimit != -1 && elementLimit < children.length) {
+ Object[] limitedChildren = new Object[elementLimit];
+ System.arraycopy(children, 0, limitedChildren, 0, elementLimit);
+ return limitedChildren;
+ }
+ return children;
+ }
+
+ private int getElementLimit() {
+ return fPage.getElementLimit().intValue();
+ }
+
+ public void dispose() {
+ // nothing to do
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (newInput instanceof AbstractArtifactSearchResult) {
+ initialize((AbstractArtifactSearchResult) newInput);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private synchronized void initialize(AbstractArtifactSearchResult result) {
+ fResult = result;
+ fChildrenMap = new HashMap();
+ boolean showLineMatches = fResult.hasAttributeMatches();
+
+ if (result != null) {
+ Object[] elements = result.getElements();
+ for (int i = 0; i < elements.length; i++) {
+ if (showLineMatches) {
+ Match[] matches = result.getMatches(elements[i]);
+ for (int j = 0; j < matches.length; j++) {
+ Match match = matches[j];
+ if (match instanceof AttributeMatch) {
+ insert(((AttributeMatch) match).getLineElement(), false);
+ } else {
+ insert(match.getElement(), false);
+ }
+ }
+ } else {
+ insert(elements[i], false);
+ }
+ }
+ }
+ }
+
+ private void insert(Object child, boolean refreshViewer) {
+ Object parent = getParent(child);
+ while (parent != null) {
+ if (insertChild(parent, child)) {
+ if (refreshViewer) {
+ fTreeViewer.add(parent, child);
+ }
+ } else {
+ if (refreshViewer) {
+ fTreeViewer.refresh(parent);
+ }
+ return;
+ }
+ child = parent;
+ parent = getParent(child);
+ }
+ if (insertChild(fResult, child)) {
+ if (refreshViewer) {
+ fTreeViewer.add(fResult, child);
+ }
+ }
+ }
+
+ /**
+ * returns true if the child already was a child of parent.
+ *
+ * @param parent
+ * @param child
+ * @return Returns <code>true</code> if the child was added
+ */
+ @SuppressWarnings("unchecked")
+ private boolean insertChild(Object parent, Object child) {
+ Set children = (Set) fChildrenMap.get(parent);
+ if (children == null) {
+ children = new HashSet();
+ fChildrenMap.put(parent, children);
+ }
+ return children.add(child);
+ }
+
+ @SuppressWarnings("unchecked")
+ private boolean hasChild(Object parent, Object child) {
+ Set children = (Set) fChildrenMap.get(parent);
+ return children != null && children.contains(child);
+ }
+
+ private void remove(Object element, boolean refreshViewer) {
+ if (hasChildren(element)) {
+ if (refreshViewer) fTreeViewer.refresh(element);
+ } else {
+ if (!hasMatches(element)) {
+ fChildrenMap.remove(element);
+ Object parent = getParent(element);
+ if (parent != null) {
+ removeFromSiblings(element, parent);
+ remove(parent, refreshViewer);
+ } else {
+ removeFromSiblings(element, fResult);
+ if (refreshViewer) fTreeViewer.refresh();
+ }
+ } else {
+ if (refreshViewer) {
+ fTreeViewer.refresh(element);
+ }
+ }
+ }
+ }
+
+ private boolean hasMatches(Object element) {
+ if (element instanceof AttributeLineElement) {
+ AttributeLineElement lineElement = (AttributeLineElement) element;
+ return lineElement.getNumberOfMatches(fResult) > 0;
+ }
+ return fResult.getMatchCount(element) > 0;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void removeFromSiblings(Object element, Object parent) {
+ Set siblings = (Set) fChildrenMap.get(parent);
+ if (siblings != null) {
+ siblings.remove(element);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ Set children = (Set) fChildrenMap.get(parentElement);
+ if (children == null) return EMPTY_ARR;
+ return children.toArray();
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public synchronized void elementsChanged(Object[] updatedElements) {
+ for (int i = 0; i < updatedElements.length; i++) {
+ if (!(updatedElements[i] instanceof AttributeLineElement)) {
+ if (fResult.getMatchCount(updatedElements[i]) > 0) {
+ insert(updatedElements[i], true);
+ } else {
+ remove(updatedElements[i], true);
+ }
+ } else {
+ AttributeLineElement lineElement = (AttributeLineElement) updatedElements[i];
+ int nMatches = lineElement.getNumberOfMatches(fResult);
+ if (nMatches > 0) {
+ if (hasChild(lineElement.getParent(), lineElement)) {
+ fTreeViewer.update(new Object[] {lineElement, lineElement.getParent()}, null);
+ } else {
+ insert(lineElement, true);
+ }
+ } else {
+ remove(lineElement, true);
+ }
+ }
+ }
+ }
+
+ public void clear() {
+ initialize(fResult);
+ fTreeViewer.refresh();
+ }
+
+ public Object getParent(Object element) {
+ if (element instanceof AttributeLineElement) {
+ return ((AttributeLineElement) element).getParent();
+ }
+ if (element instanceof AttributeMatch) {
+ AttributeMatch match = (AttributeMatch) element;
+ return match.getArtifact();
+ }
+ if (element instanceof Artifact) {
+ Artifact resource = (Artifact) element;
+ try {
+ return resource.getParent();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeLineElement.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeLineElement.java
new file mode 100644
index 00000000000..d075f8ebf34
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeLineElement.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.framework.ui.skynet.search.page;
+
+import java.util.ArrayList;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeLineElement implements IAdaptable {
+
+ private final Attribute<?> attribute;
+ private final Artifact parent;
+ private final int lineNumber;
+ private final int lineStartOffset;
+ private final String lineContents;
+
+ public AttributeLineElement(Artifact parent, Attribute<?> attribute, int lineNumber, int lineStartOffset, String contents) {
+ this.parent = parent;
+ this.attribute = attribute;
+ this.lineContents = contents;
+ this.lineNumber = lineNumber;
+ this.lineStartOffset = lineStartOffset;
+ }
+
+ public Artifact getParent() {
+ return parent;
+ }
+
+ public int getLine() {
+ return lineNumber;
+ }
+
+ public String getContents() {
+ return lineContents;
+ }
+
+ public int getOffset() {
+ return lineStartOffset;
+ }
+
+ public boolean contains(int offset) {
+ return lineStartOffset <= offset && offset < lineStartOffset + lineContents.length();
+ }
+
+ public int getLength() {
+ return lineContents.length();
+ }
+
+ public AttributeMatch[] getMatches(AbstractArtifactSearchResult result) {
+ ArrayList<AttributeMatch> res = new ArrayList<AttributeMatch>();
+ Match[] matches = result.getMatches(parent);
+ for (int i = 0; i < matches.length; i++) {
+ AttributeMatch curr = (AttributeMatch) matches[i];
+ if (curr.getLineElement() == this) {
+ res.add(curr);
+ }
+ }
+ return res.toArray(new AttributeMatch[res.size()]);
+ }
+
+ public int getNumberOfMatches(AbstractArtifactSearchResult result) {
+ int count = 0;
+ Match[] matches = result.getMatches(parent);
+ for (int i = 0; i < matches.length; i++) {
+ AttributeMatch curr = (AttributeMatch) matches[i];
+ if (curr.getLineElement() == this) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ public Attribute<?> getAttribute() {
+ return attribute;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == Artifact.class) {
+ return getParent();
+ } else if (adapter == Attribute.class) {
+ return getAttribute();
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeMatch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeMatch.java
new file mode 100644
index 00000000000..58d86e943cb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/AttributeMatch.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.framework.ui.skynet.search.page;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.text.Region;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AttributeMatch extends Match implements IAdaptable {
+ private Region fOriginalLocation;
+ private AttributeLineElement fLineElement;
+
+ public AttributeMatch(Artifact element, int offset, int length, AttributeLineElement lineEntry) {
+ super(element, offset, length);
+ fLineElement = lineEntry;
+ }
+
+ public void setOffset(int offset) {
+ if (fOriginalLocation == null) {
+ fOriginalLocation = new Region(getOffset(), getLength());
+ }
+ super.setOffset(offset);
+ }
+
+ public void setLength(int length) {
+ if (fOriginalLocation == null) {
+ fOriginalLocation = new Region(getOffset(), getLength());
+ }
+ super.setLength(length);
+ }
+
+ public int getOriginalOffset() {
+ if (fOriginalLocation != null) {
+ return fOriginalLocation.getOffset();
+ }
+ return getOffset();
+ }
+
+ public int getOriginalLength() {
+ if (fOriginalLocation != null) {
+ return fOriginalLocation.getLength();
+ }
+ return getLength();
+ }
+
+ public Artifact getArtifact() {
+ return (Artifact) getElement();
+ }
+
+ public AttributeLineElement getLineElement() {
+ return fLineElement;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (Artifact.class.equals(adapter)) {
+ return this.getArtifact();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/DecoratingArtifactSearchLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/DecoratingArtifactSearchLabelProvider.java
new file mode 100644
index 00000000000..f3a77833057
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/DecoratingArtifactSearchLabelProvider.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.framework.ui.skynet.search.page;
+
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.ViewerColumn;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DecoratingArtifactSearchLabelProvider extends DecoratingStyledCellLabelProvider implements IPropertyChangeListener, ILabelProvider {
+
+ private static final String HIGHLIGHT_BG_COLOR_NAME = "org.eclipse.jdt.ui.ColoredLabels.match_highlight"; //$NON-NLS-1$
+
+ public static final Styler HIGHLIGHT_STYLE = StyledString.createColorRegistryStyler(null, HIGHLIGHT_BG_COLOR_NAME);
+
+ public DecoratingArtifactSearchLabelProvider(ArtifactSearchLabelProvider provider) {
+ super(provider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), null);
+ }
+
+ public void initialize(ColumnViewer viewer, ViewerColumn column) {
+ PlatformUI.getPreferenceStore().addPropertyChangeListener(this);
+ JFaceResources.getColorRegistry().addListener(this);
+
+ setOwnerDrawEnabled(showColoredLabels());
+
+ super.initialize(viewer, column);
+ }
+
+ public void dispose() {
+ super.dispose();
+ PlatformUI.getPreferenceStore().removePropertyChangeListener(this);
+ JFaceResources.getColorRegistry().removeListener(this);
+ }
+
+ private void refresh() {
+ ColumnViewer viewer = getViewer();
+
+ if (viewer == null) {
+ return;
+ }
+ boolean showColoredLabels = showColoredLabels();
+ if (showColoredLabels != isOwnerDrawEnabled()) {
+ setOwnerDrawEnabled(showColoredLabels);
+ viewer.refresh();
+ } else if (showColoredLabels) {
+ viewer.refresh();
+ }
+ }
+
+ protected StyleRange prepareStyleRange(StyleRange styleRange, boolean applyColors) {
+ if (!applyColors && styleRange.background != null) {
+ styleRange = super.prepareStyleRange(styleRange, applyColors);
+ styleRange.borderStyle = SWT.BORDER_DOT;
+ return styleRange;
+ }
+ return super.prepareStyleRange(styleRange, applyColors);
+ }
+
+ public static boolean showColoredLabels() {
+ return PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS);
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getProperty();
+ if (property.equals(JFacePreferences.QUALIFIER_COLOR) || property.equals(JFacePreferences.COUNTER_COLOR) || property.equals(JFacePreferences.DECORATIONS_COLOR) || property.equals(HIGHLIGHT_BG_COLOR_NAME) || property.equals(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+ }
+
+ public String getText(Object element) {
+ return getStyledText(element).getString();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/IArtifactSearchContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/IArtifactSearchContentProvider.java
new file mode 100644
index 00000000000..d44376f08bd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/page/IArtifactSearchContentProvider.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.framework.ui.skynet.search.page;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IArtifactSearchContentProvider {
+
+ public abstract void elementsChanged(Object[] updatedElements);
+
+ public abstract void clear();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/ArtifactSearchEngine.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/ArtifactSearchEngine.java
new file mode 100644
index 00000000000..2c09068ce79
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/ArtifactSearchEngine.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.framework.ui.skynet.search.ui;
+
+import java.text.MessageFormat;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterModelList;
+import org.eclipse.search.ui.NewSearchUI;
+
+public class ArtifactSearchEngine {
+
+ public IStatus search(IArtifactSearchResultCollector collector, FilterModelList list) {
+ Assert.isNotNull(collector);
+ Assert.isNotNull(list);
+
+ IProgressMonitor monitor = collector.getProgressMonitor();
+
+ String message = "Message 1";
+ MultiStatus status = new MultiStatus(NewSearchUI.PLUGIN_ID, IStatus.OK, message, null);
+
+ int amountOfWork = 100;
+ try {
+ monitor.beginTask("", amountOfWork); //$NON-NLS-1$
+ if (amountOfWork > 0) {
+ Integer[] args = new Integer[] {new Integer(1), new Integer(amountOfWork)};
+ monitor.setTaskName(MessageFormat.format("Scanning:", (Object[]) args));
+ }
+ collector.aboutToStart();
+ } catch (CoreException ex) {
+ status.add(ex.getStatus());
+ } finally {
+ monitor.done();
+ try {
+ collector.done();
+ } catch (CoreException ex) {
+ status.add(ex.getStatus());
+ }
+ }
+ return status;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactMatchAdapter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactMatchAdapter.java
new file mode 100644
index 00000000000..a07c082cd34
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactMatchAdapter.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.framework.ui.skynet.search.ui;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.search.AbstractArtifactSearchResult;
+import org.eclipse.search.ui.text.Match;
+
+public interface IArtifactMatchAdapter {
+ /**
+ * Returns an array with all matches contained in the given artifact in the given search result. If the matches are
+ * not contained within an <code>Artifact</code>, this method must return an empty array.
+ *
+ * @param result the search result to find matches in
+ * @param artifact the artifact to find matches in
+ * @return an array of matches (possibly empty)
+ */
+ public abstract Match computeContainedMatch(AbstractArtifactSearchResult result, Artifact artifact);
+
+ /**
+ * Returns the artifact associated with the given element (usually the artifact the element is contained in). If the
+ * element is not associated with a artifact, this method should return <code>null</code>.
+ *
+ * @param element an element associated with a match
+ * @return the artifact associated with the element or <code>null</code>
+ */
+ public abstract Artifact getArtifact(Object element);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchContentProvider.java
new file mode 100644
index 00000000000..20aa3a0bd29
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchContentProvider.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.framework.ui.skynet.search.ui;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public interface IArtifactSearchContentProvider {
+ public abstract void elementsChanged(Object[] updatedElements);
+
+ public abstract void clear();
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchResultCollector.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchResultCollector.java
new file mode 100644
index 00000000000..41556da637e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IArtifactSearchResultCollector.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.framework.ui.skynet.search.ui;
+
+import org.eclipse.core.resources.IResourceProxy;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Michael S. Rodgers
+ */
+public interface IArtifactSearchResultCollector {
+ /**
+ * Returns the progress monitor used to setup and report progress.
+ *
+ * @return The progress monitor
+ */
+ public IProgressMonitor getProgressMonitor();
+
+ /**
+ * Called before the actual search starts.
+ *
+ * @throws CoreException Throws when starting failed.
+ */
+ public void aboutToStart() throws CoreException;
+
+ /**
+ * Accepts the given search result.
+ *
+ * @param proxy proxy the resource proxy in which the match has been found.
+ * @param start position from the beginning of the file. Start position is zero based.
+ * @param length the length of the match.
+ * @throws CoreException Processing failed
+ */
+ public void accept(IResourceProxy proxy, int start, int length) throws CoreException;
+
+ /**
+ * Called when the search has ended.
+ *
+ * @throws CoreException Throws when finish failed.
+ */
+ public void done() throws CoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IFilterListViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IFilterListViewer.java
new file mode 100644
index 00000000000..d1c594ac872
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/search/ui/IFilterListViewer.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.framework.ui.skynet.search.ui;
+
+import org.eclipse.osee.framework.ui.skynet.search.filter.FilterModel;
+
+public interface IFilterListViewer {
+
+ /**
+ * Update the view to reflect the fact that a FilterModel was added to the FilterModel list
+ *
+ * @param filter
+ */
+ public void addFilter(FilterModel filter);
+
+ /**
+ * Update the view to reflect the fact that a FilterModel was removed from the FilterModel list
+ *
+ * @param filter
+ */
+ public void removeFilter(FilterModel filter);
+
+ /**
+ * Update the view to reflect the fact that one of the FilterModels was modified
+ *
+ * @param filter
+ */
+ public void updateFilter(FilterModel filter);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphContentProvider.java
new file mode 100644
index 00000000000..5778bfc5703
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphContentProvider.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.skywalker;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.skywalker.RelTypeContentProvider.RelationLinkDescriptorSide;
+import org.eclipse.zest.core.viewers.IGraphEntityContentProvider;
+
+/**
+ * @author Robert A. Fisher
+ * @author Donald G. Dunne
+ */
+public class ArtifactGraphContentProvider implements IGraphEntityContentProvider {
+ // private static final Collection<Artifact>EMPTY_LIST = new ArrayList<Artifact>(0);
+ private final SkyWalkerOptions options;
+
+ /**
+ * @param levels
+ */
+ public ArtifactGraphContentProvider(SkyWalkerOptions options) {
+ super();
+ this.options = options;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.mylar.zest.core.viewers.IGraphEntityContentProvider#getConnectedTo(java.lang.Object)
+ */
+ public Object[] getConnectedTo(Object entity) {
+ List<Artifact> otherItems = new LinkedList<Artifact>();
+
+ // Don't want to create any links to artifacts that are NOT in displayArtifacts
+ try {
+ Artifact artifact = (Artifact) entity;
+ // List<RelationType> validTypes =
+ // RelationTypeManager.getValidTypes(artifact.getArtifactType(), artifact.getBranch());
+ // for (RelationType relationType : validTypes) {
+ // if (options.isValidRelationType(relationType)) {
+ // for (Artifact art : artifact.getRelatedArtifacts(relationType)) {
+ // if (options.isValidArtifactType(art.getArtifactType()) && displayArtifacts.contains(art)) {
+ // otherItems.add(art);
+ // }
+ // }
+ // }
+ // }
+ for (Object obj : options.getSelectedRelTypes()) {
+ if (obj instanceof RelationType) {
+ RelationType relationType = (RelationType) obj;
+ if (options.isValidRelationType(relationType)) {
+ for (Artifact art : artifact.getRelatedArtifacts(relationType)) {
+ if (options.isValidArtifactType(art.getArtifactType()) && displayArtifacts.contains(art)) {
+ otherItems.add(art);
+ }
+ }
+ }
+ }
+ if (obj instanceof RelationLinkDescriptorSide) {
+ RelationLinkDescriptorSide side = (RelationLinkDescriptorSide) obj;
+ if (options.isValidRelationLinkDescriptorSide(side)) {
+ for (Artifact art : artifact.getRelatedArtifacts(side)) {
+ if (options.isValidArtifactType(art.getArtifactType()) && displayArtifacts.contains(art)) {
+ otherItems.add(art);
+ }
+ }
+ }
+ }
+ }
+
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return otherItems.toArray();
+ }
+ private final Set<Artifact> displayArtifacts = new HashSet<Artifact>();
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.mylar.zest.core.viewers.IGraphEntityContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ // Only perform this method for top level artifact
+ if (inputElement.equals(options.getArtifact())) {
+ displayArtifacts.clear();
+ displayArtifacts.add((Artifact) inputElement);
+ getDescendants(displayArtifacts, (Artifact) inputElement, options.getLevels());
+ return displayArtifacts.toArray();
+ }
+ return null;
+ }
+
+ private void getDescendants(Collection<Artifact> displayArtifacts, Artifact artifact, int level) {
+ // System.out.println("getDecendants level: " + level + " artifact => " + artifact);
+ if (level == 0) {
+ return;
+ } else {
+ try {
+ // List<RelationType> validTypes =
+ // RelationTypeManager.getValidTypes(artifact.getArtifactType(), artifact.getBranch());
+ // for (RelationType relationType : validTypes) {
+ // if (options.isValidRelationType(relationType)) {
+ // for (Artifact art : artifact.getRelatedArtifacts(relationType)) {
+ // if (options.isValidArtifactType(art.getArtifactType())) {
+ // displayArtifacts.add(art);
+ // getDescendants(displayArtifacts, art, level - 1);
+ // }
+ // }
+ // }
+ // }
+ for (Object obj : options.getSelectedRelTypes()) {
+ if (obj instanceof RelationType) {
+ RelationType relationType = (RelationType) obj;
+ if (options.isValidRelationType(relationType)) {
+ for (Artifact art : artifact.getRelatedArtifacts(relationType)) {
+ if (options.isValidArtifactType(art.getArtifactType())) {
+ displayArtifacts.add(art);
+ getDescendants(displayArtifacts, art, level - 1);
+ }
+ }
+ }
+ }
+ if (obj instanceof RelationLinkDescriptorSide) {
+ RelationLinkDescriptorSide side = (RelationLinkDescriptorSide) obj;
+ if (options.isValidRelationLinkDescriptorSide(side)) {
+ for (Artifact art : artifact.getRelatedArtifacts(side)) {
+ if (options.isValidArtifactType(art.getArtifactType())) {
+ displayArtifacts.add(art);
+ getDescendants(displayArtifacts, art, level - 1);
+ }
+ }
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.mylar.zest.core.viewers.IGraphEntityContentProvider#getWeight(java.lang.Object,
+ * java.lang.Object)
+ */
+ public double getWeight(Object entity1, Object entity2) {
+ return 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphLabelProvider.java
new file mode 100644
index 00000000000..976c42e0aa6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ArtifactGraphLabelProvider.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.skywalker;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptions.LinkName;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.zest.core.viewers.EntityConnectionData;
+
+/**
+ * @author Robert A. Fisher
+ * @author Donald G. Dunne
+ */
+public class ArtifactGraphLabelProvider implements ILabelProvider {
+ private final SkyWalkerOptions options;
+
+ public ArtifactGraphLabelProvider(SkyWalkerOptions options) {
+ this.options = options;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+ */
+ public Image getImage(Object element) {
+ if (element instanceof Artifact) {
+ return ImageManager.getImage((Artifact) element);
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+ */
+ public String getText(Object element) {
+ try {
+ if (element instanceof Artifact) {
+ return ((Artifact) element).getDescriptiveName() + options.getExtendedName((Artifact) element);
+ } else if (element instanceof EntityConnectionData) {
+ Object obj1 = ((EntityConnectionData) element).dest;
+ Object obj2 = ((EntityConnectionData) element).source;
+ if (obj1 instanceof Artifact && obj2 instanceof Artifact) {
+ Artifact dest = (Artifact) obj1;
+ Artifact source = (Artifact) obj2;
+
+ Collection<RelationLink> links = dest.getRelations(source);
+
+ Collection<String> linkNames = new ArrayList<String>(links.size());
+ for (RelationLink link : links) {
+ if (options.getLinkName() == LinkName.Phrasing_A_to_B) {
+ if (link.getArtifactA().equals(source)) {
+ linkNames.add(source + " (" + link.getSidePhrasingFor(source) + ") " + dest);
+ } else {
+ linkNames.add(dest + " (" + link.getSidePhrasingFor(dest) + ") " + source);
+ }
+ } else if (options.getLinkName() == LinkName.Phrasing_B_to_A) {
+ if (link.getArtifactA().equals(source)) {
+ linkNames.add(dest + " (" + link.getSidePhrasingFor(dest) + ") " + source);
+ } else {
+ linkNames.add(source + " (" + link.getSidePhrasingFor(source) + ") " + dest);
+ }
+ } else if (options.getLinkName() == LinkName.Link_Name)
+ linkNames.add(link.getRelationType().getTypeName());
+ else if (options.getLinkName() == LinkName.Full_Link_Name)
+ linkNames.add(link.getRelationType().toString());
+ else if (options.getLinkName() == LinkName.Other_Side_Name) {
+ if (link.getArtifactA().equals(source)) {
+
+ linkNames.add(source + " (" + link.getSideNameFor(source) + ")" + " <--> " + dest + " (" + link.getSideNameFor(dest) + ")");
+ } else {
+ linkNames.add(dest + " (" + link.getSideNameFor(dest) + ")" + " <--> " + source + " (" + link.getSideNameFor(source) + ")");
+ }
+ } else
+ linkNames.add("");
+ }
+ return Collections.toString("\n", linkNames);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return ex.getLocalizedMessage();
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
+ * java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ISkyWalkerOptionsChangeListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ISkyWalkerOptionsChangeListener.java
new file mode 100644
index 00000000000..f3c066dac3e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/ISkyWalkerOptionsChangeListener.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.framework.ui.skynet.skywalker;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface ISkyWalkerOptionsChangeListener {
+
+ public enum ModType {
+ Artifact, Level, ArtType, RelType, FilterEnabled, Layout, Link_Name, Show_Attribute
+ };
+
+ public void modified(ModType... modTypes);
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/RelTypeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/RelTypeContentProvider.java
new file mode 100644
index 00000000000..d9f71f185a6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/RelTypeContentProvider.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.skywalker;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class RelTypeContentProvider implements ITreeContentProvider {
+
+ /**
+ *
+ */
+ public RelTypeContentProvider() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) return ((Collection) parentElement).toArray();
+ if (parentElement instanceof RelationType) {
+ return new Object[] {new RelationLinkDescriptorSide((RelationType) parentElement, true),
+ new RelationLinkDescriptorSide((RelationType) parentElement, false)};
+ }
+ return new Object[] {};
+ }
+
+ public static class RelationLinkDescriptorSide implements IRelationEnumeration {
+ private final RelationType desc;
+ private final Boolean sideA;
+
+ public RelationLinkDescriptorSide(RelationType desc, boolean sideA) {
+ this.desc = desc;
+ this.sideA = sideA;
+ }
+
+ @Override
+ public String toString() {
+ return (sideA ? desc.getSideAName() : desc.getSideBName()) + " - " + desc.getTypeName();
+ }
+
+ /**
+ * @return the sideA
+ */
+ public boolean isSideA() {
+ return sideA;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof RelationLinkDescriptorSide) {
+ return (((RelationLinkDescriptorSide) obj).getDesc().equals(desc) && ((RelationLinkDescriptorSide) obj).isSideA() == sideA);
+ }
+ return super.equals(obj);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return desc.hashCode() + sideA.hashCode();
+ }
+
+ /**
+ * @return the desc
+ */
+ public RelationType getDesc() {
+ return desc;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getRelationType()
+ */
+ @Override
+ public RelationType getRelationType() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return desc;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSide()
+ */
+ @Override
+ public RelationSide getSide() {
+ return sideA ? RelationSide.SIDE_A : RelationSide.SIDE_B;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSideName()
+ */
+ @Override
+ public String getSideName() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return getRelationType().getSideName(getSide());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getTypeName()
+ */
+ @Override
+ public String getTypeName() {
+ try {
+ return getRelationType().getNamespace();
+ } catch (Exception ex) {
+ return ex.getLocalizedMessage();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#isThisType(org.eclipse.osee.framework.skynet.core.relation.RelationLink)
+ */
+ @Override
+ public boolean isThisType(RelationLink link) {
+ return link.getRelationType().getTypeName().equals(getTypeName());
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ public boolean hasChildren(Object element) {
+ return (element instanceof RelationType);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerArtTypeTabItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerArtTypeTabItem.java
new file mode 100644
index 00000000000..290a0ef790e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerArtTypeTabItem.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.skywalker;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+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.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TabItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerArtTypeTabItem {
+
+ private CheckboxTreeViewer treeViewer;
+ private Button selectAll;
+ private Button deSelectAll;
+ private final SkyWalkerOptions options;
+
+ public SkyWalkerArtTypeTabItem(org.eclipse.swt.widgets.TabFolder tabFolder, SkyWalkerOptions options) {
+
+ this.options = options;
+ TabItem item = new TabItem(tabFolder, SWT.NONE);
+ item.setText("Artifact Type");
+
+ Composite comp = new Composite(tabFolder, SWT.BORDER);
+ comp.setLayout(ALayout.getZeroMarginLayout());
+ comp.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+
+ treeViewer = new CheckboxTreeViewer(comp, SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new ArrayTreeContentProvider());
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ storeSelected();
+ }
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public Image getImage(Object obj) {
+ if (obj instanceof ArtifactType) {
+ return ImageManager.getImage((ArtifactType) obj);
+ }
+ return null;
+ }
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ });
+ treeViewer.setSorter(new ViewerSorter());
+
+ Composite buttonComp = new Composite(comp, SWT.BORDER);
+ buttonComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ buttonComp.setLayoutData(new GridData());
+
+ selectAll = new Button(buttonComp, SWT.PUSH);
+ selectAll.setText("Select All");
+ selectAll.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.setAllChecked(true);
+ storeSelected();
+ }
+ });
+
+ deSelectAll = new Button(buttonComp, SWT.PUSH);
+ deSelectAll.setText("De-Select All");
+ deSelectAll.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.setAllChecked(false);
+ storeSelected();
+ }
+ });
+ options.addSkyWalkerOptionsChangeListener(new ISkyWalkerOptionsChangeListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener#modified(org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType[])
+ */
+ public void modified(ModType... modTypes) {
+ handleOptionModified(modTypes);
+ }
+ });
+
+ // Set UI to defaults
+ handleOptionModified(ModType.FilterEnabled);
+ handleOptionModified(ModType.ArtType);
+ item.setControl(comp);
+ }
+
+ public void handleOptionModified(ModType... modTypes) {
+ List<ModType> modList = Arrays.asList(modTypes);
+ if (modList.contains(ModType.FilterEnabled)) {
+ if (selectAll != null) selectAll.setEnabled(options.isFilterEnabled());
+ if (deSelectAll != null) deSelectAll.setEnabled(options.isFilterEnabled());
+ }
+ if (modList.contains(ModType.ArtType)) {
+ if (treeViewer != null) {
+ treeViewer.setCheckedElements(options.getSelectedArtTypes().toArray());
+ }
+ }
+ if (modList.contains(ModType.Artifact)) {
+ if (treeViewer.getInput() == null && options.getAllArtTypes() != null && options.getAllArtTypes().size() > 0) {
+ treeViewer.setInput(options.getAllArtTypes());
+ treeViewer.setAllChecked(true);
+ }
+ }
+ }
+
+ public void storeSelected() {
+ Set<ArtifactType> selected = new HashSet<ArtifactType>();
+ for (Object obj : treeViewer.getCheckedElements()) {
+ if (obj instanceof ArtifactType) selected.add((ArtifactType) obj);
+ }
+ options.setSelectedArtTypes(selected);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerLayoutTabItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerLayoutTabItem.java
new file mode 100644
index 00000000000..6437f19018e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerLayoutTabItem.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.framework.ui.skynet.skywalker;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType;
+import org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptions.LinkName;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButtons;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.zest.layouts.algorithms.AbstractLayoutAlgorithm;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerLayoutTabItem {
+
+ private TreeViewer treeViewer;
+ private final Spinner levelSpinner;
+ private final SkyWalkerOptions options;
+ private final XRadioButtons radioButtons;
+
+ public SkyWalkerLayoutTabItem(org.eclipse.swt.widgets.TabFolder tabFolder, final SkyWalkerOptions options) {
+
+ this.options = options;
+ TabItem item = new TabItem(tabFolder, SWT.NONE);
+ item.setText("Layout");
+
+ Composite comp = new Composite(tabFolder, SWT.BORDER);
+ comp.setLayout(ALayout.getZeroMarginLayout());
+ comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Composite levelComp = new Composite(comp, SWT.BORDER);
+ levelComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ levelComp.setLayoutData(new GridData());
+
+ (new Label(levelComp, SWT.NONE)).setText("Level: ");
+ levelSpinner = new Spinner(levelComp, SWT.BORDER);
+ levelSpinner.setMinimum(0);
+ levelSpinner.setMaximum(4);
+ levelSpinner.setIncrement(1);
+ levelSpinner.setPageIncrement(1);
+ levelSpinner.pack();
+ levelSpinner.addModifyListener(new ModifyListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+ */
+ public void modifyText(ModifyEvent e) {
+ options.setLevels(levelSpinner.getSelection());
+ }
+ });
+
+ Composite treeComp = new Composite(comp, SWT.BORDER);
+ treeComp.setLayout(ALayout.getZeroMarginLayout());
+ treeComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ treeViewer = new TreeViewer(treeComp, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new ArrayTreeContentProvider());
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public Image getImage(Object obj) {
+ return null;
+ }
+
+ public String getText(Object obj) {
+ return options.getLayoutName((AbstractLayoutAlgorithm) obj);
+ }
+ });
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (treeViewer.getSelection().isEmpty()) return;
+ AbstractLayoutAlgorithm layout =
+ (AbstractLayoutAlgorithm) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ if (layout != null) options.setLayout(layout);
+ }
+ });
+ treeViewer.setInput(options.getLayouts());
+
+ radioButtons = new XRadioButtons("Link Naming", "");
+ radioButtons.setVertical(true, 1);
+ radioButtons.setVerticalLabel(true);
+ for (LinkName linkName : LinkName.values())
+ radioButtons.addButton(linkName.name());
+ radioButtons.createWidgets(comp, 1);
+ radioButtons.setSelected(options.getLinkName().name());
+ radioButtons.addXModifiedListener(new XModifiedListener() {
+ public void widgetModified(org.eclipse.osee.framework.ui.skynet.widgets.XWidget widget) {
+ if (radioButtons.getSelectedNames().size() > 0) if (!options.getLinkName().equals(
+ radioButtons.getSelectedNames().iterator().next())) options.setLinkName(LinkName.valueOf(radioButtons.getSelectedNames().iterator().next()));
+ };
+ });
+
+ options.addSkyWalkerOptionsChangeListener(new ISkyWalkerOptionsChangeListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptionsChangeListener#modified(org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptionsChangeListener.ModType)
+ */
+ public void modified(ModType... modTypes) {
+ handleOptionModified(modTypes);
+ }
+ });
+
+ // Set UI to defaults
+ handleOptionModified(ModType.FilterEnabled);
+ handleOptionModified(ModType.Level);
+ handleOptionModified(ModType.Layout);
+ handleOptionModified(ModType.Link_Name);
+ item.setControl(comp);
+ }
+
+ public AbstractLayoutAlgorithm getSelected() {
+ return (AbstractLayoutAlgorithm) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ }
+
+ public void handleOptionModified(ModType... modTypes) {
+ List<ModType> modList = Arrays.asList(modTypes);
+ if (modList.contains(ModType.Level)) {
+ if (levelSpinner != null) {
+ if (levelSpinner.getSelection() != options.getLevels()) levelSpinner.setSelection(options.getLevels());
+ }
+ }
+ if (modList.contains(ModType.Link_Name)) {
+ if (radioButtons != null) {
+ if (options.getLinkName().equals(radioButtons.getSelectedNames().iterator().next())) radioButtons.setSelected(options.getLinkName().name());
+ }
+ }
+ if (modList.contains(ModType.Layout)) {
+ if (treeViewer != null) {
+ if (treeViewer.getSelection() != options.getLayout()) treeViewer.setSelection(new StructuredSelection(
+ new Object[] {options.getLayout()}));
+ }
+ }
+ if (modList.contains(ModType.FilterEnabled)) {
+ if (levelSpinner != null) levelSpinner.setEnabled(options.isFilterEnabled());
+ if (treeViewer != null) treeViewer.getTree().setEnabled(options.isFilterEnabled());
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerOptions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerOptions.java
new file mode 100644
index 00000000000..15cea0506e0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerOptions.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.framework.ui.skynet.skywalker;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType;
+import org.eclipse.osee.framework.ui.skynet.skywalker.RelTypeContentProvider.RelationLinkDescriptorSide;
+import org.eclipse.zest.layouts.LayoutStyles;
+import org.eclipse.zest.layouts.algorithms.AbstractLayoutAlgorithm;
+import org.eclipse.zest.layouts.algorithms.GridLayoutAlgorithm;
+import org.eclipse.zest.layouts.algorithms.RadialLayoutAlgorithm;
+import org.eclipse.zest.layouts.algorithms.SpringLayoutAlgorithm;
+import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;
+import org.eclipse.zest.layouts.algorithms.VerticalLayoutAlgorithm;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerOptions {
+
+ private Artifact artifact;
+ private int levels = 1;
+ private static Map<AbstractLayoutAlgorithm, String> layouts;
+ private AbstractLayoutAlgorithm layout;
+ protected AbstractLayoutAlgorithm defaultLayout;
+ private Map<ArtifactType, Boolean> artTypes;
+ private Map<AttributeType, Boolean> showAttributes;
+ // RelationLinkDescriptor and RelationLinkDescriptorSide
+ private Map<Object, Boolean> relTypes;
+ private boolean filterEnabled = true;
+ private final Set<ISkyWalkerOptionsChangeListener> listeners = new HashSet<ISkyWalkerOptionsChangeListener>();
+ public static String RADIAL_DOWN_LAYOUT = "Radial - Down";
+ public static String SPRING_LAYOUT = "Spring";
+ public static enum LinkName {
+ None, Link_Name, Full_Link_Name, Phrasing_A_to_B, Phrasing_B_to_A, Other_Side_Name
+ };
+ private LinkName linkName = LinkName.Link_Name;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public SkyWalkerOptions() {
+ loadLayouts();
+ layout = defaultLayout;
+ }
+
+ public void addSkyWalkerOptionsChangeListener(ISkyWalkerOptionsChangeListener skyWalkerOptionsChangeListener) {
+ listeners.add(skyWalkerOptionsChangeListener);
+ }
+
+ public String getExtendedName(Artifact artifact) throws OseeCoreException {
+ if (getSelectedShowAttributeTypes().size() == 0)
+ return "";
+ else {
+ StringBuffer sb = new StringBuffer();
+ for (AttributeType attributeType : getSelectedShowAttributeTypes()) {
+ if (artifact.getAttributeCount(attributeType.getName()) > 0) {
+ sb.append("\n");
+ sb.append(artifact.getAttributesToString(attributeType.getName()));
+ }
+ }
+ return sb.toString();
+ }
+ }
+
+ private void loadArtTypes() {
+ if (artTypes == null) {
+ artTypes = new HashMap<ArtifactType, Boolean>();
+ try {
+ for (ArtifactType descriptor : TypeValidityManager.getValidArtifactTypes(artifact.getBranch())) {
+ artTypes.put(descriptor, true);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private void loadAttributeTypes() {
+ if (showAttributes == null) {
+ showAttributes = new HashMap<AttributeType, Boolean>();
+ try {
+ for (AttributeType descriptor : TypeValidityManager.getValidAttributeTypes(artifact.getBranch())) {
+ showAttributes.put(descriptor, false);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private void loadRelTypes() {
+ if (relTypes == null) {
+ relTypes = new HashMap<Object, Boolean>();
+ try {
+ for (RelationType descriptor : RelationTypeManager.getValidTypes(artifact.getBranch())) {
+ relTypes.put(descriptor, true);
+ relTypes.put(new RelTypeContentProvider.RelationLinkDescriptorSide(descriptor, true), true);
+ relTypes.put(new RelTypeContentProvider.RelationLinkDescriptorSide(descriptor, false), true);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public String toXml() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AXml.addTagData("guid", artifact.getGuid()));
+ sb.append(AXml.addTagData("branchId", artifact.getBranch().getBranchId() + ""));
+ sb.append(AXml.addTagData("artTypes", org.eclipse.osee.framework.jdk.core.util.Collections.toString(",",
+ getSelectedArtTypes())));
+ sb.append(AXml.addTagData("relTypes", org.eclipse.osee.framework.jdk.core.util.Collections.toString(",",
+ getSelectedRelTypes())));
+ sb.append(AXml.addTagData("showAttributes", org.eclipse.osee.framework.jdk.core.util.Collections.toString(",",
+ getSelectedShowAttributeTypes())));
+ sb.append(AXml.addTagData("layout", getLayoutName(getLayout())));
+ sb.append(AXml.addTagData("levels", getLevels() + ""));
+ sb.append(AXml.addTagData("linkName", getLinkName() + ""));
+ return sb.toString();
+ }
+
+ public void fromXml(String xml) {
+ try {
+ String guid = AXml.getTagData(xml, "guid");
+ if (guid != null && !guid.equals("")) {
+ String branchId = AXml.getTagData(xml, "branchId");
+ Branch branch = BranchManager.getBranch(Integer.parseInt(branchId));
+ Artifact art = ArtifactQuery.getArtifactFromId(guid, branch);
+ if (art != null) {
+ setArtifact(art);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "SkyWalker couldn't find stored artifact via guid", ex);
+ }
+ String artTypeStr = AXml.getTagData(xml, "artTypes");
+ if (artTypeStr != null && !artTypeStr.equals("")) {
+ for (Entry<ArtifactType, Boolean> desc : artTypes.entrySet()) {
+ desc.setValue(false);
+ }
+ for (String name : artTypeStr.split(",")) {
+ for (Entry<ArtifactType, Boolean> desc : artTypes.entrySet()) {
+ if (desc.getKey().getName().equals(name)) {
+ desc.setValue(true);
+ break;
+ }
+ }
+ }
+ }
+ String relTypeStr = AXml.getTagData(xml, "relTypes");
+ if (relTypeStr != null && !relTypeStr.equals("")) {
+ for (Entry<Object, Boolean> desc : relTypes.entrySet()) {
+ desc.setValue(false);
+ }
+ for (String name : relTypeStr.split(",")) {
+ for (Entry<Object, Boolean> desc : relTypes.entrySet()) {
+ if (desc.getKey().toString().equals(name)) {
+ desc.setValue(true);
+ break;
+ }
+ }
+ }
+ }
+ String showAttrString = AXml.getTagData(xml, "showAttributes");
+ if (showAttrString != null && !showAttrString.equals("")) {
+ for (Entry<AttributeType, Boolean> desc : showAttributes.entrySet()) {
+ desc.setValue(false);
+ }
+ for (String name : showAttrString.split(",")) {
+ for (Entry<AttributeType, Boolean> desc : showAttributes.entrySet()) {
+ if (desc.getKey().getName().equals(name)) {
+ desc.setValue(true);
+ break;
+ }
+ }
+ }
+ }
+ String layoutStr = AXml.getTagData(xml, "layout");
+ if (layoutStr != null && !layoutStr.equals("")) {
+ for (AbstractLayoutAlgorithm layout : getLayouts()) {
+ if (getLayoutName(layout).equals(layoutStr)) {
+ setLayout(layout);
+ break;
+ }
+ }
+ }
+ String levelStr = AXml.getTagData(xml, "levels");
+ if (levelStr != null && !levelStr.equals("")) {
+ setLevels(Integer.parseInt(levelStr));
+ }
+
+ String linkNameStr = AXml.getTagData(xml, "linkName");
+ if (linkNameStr != null && !linkNameStr.equals("")) {
+ setLinkName(LinkName.valueOf(linkNameStr));
+ }
+
+ notifyListeners(ModType.ArtType, ModType.RelType, ModType.Level, ModType.Layout, ModType.Link_Name,
+ ModType.Show_Attribute);
+ }
+
+ /**
+ * @return the artifact
+ */
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+ private Map<AbstractLayoutAlgorithm, String> loadLayouts() {
+ if (layouts == null) {
+ layouts = new HashMap<AbstractLayoutAlgorithm, String>();
+
+ RadialLayoutAlgorithm radLayout = new RadialLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
+ radLayout.setRangeToLayout((-90 * Math.PI) / 360, (90 * Math.PI) / 360);
+ defaultLayout = radLayout;
+ layouts.put(radLayout, "Radial - Right (default)");
+
+ radLayout = new RadialLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING);
+ radLayout.setRangeToLayout(0, (180 * Math.PI) / 360);
+ layouts.put(radLayout, RADIAL_DOWN_LAYOUT);
+
+ layouts.put(new RadialLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), "Radial - Full");
+ layouts.put(new SpringLayoutAlgorithm(), SPRING_LAYOUT);
+ layouts.put(new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), "Tree");
+ layouts.put(new VerticalLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), "Vertical");
+ layouts.put(new GridLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), "Grid");
+ }
+ return layouts;
+ }
+
+ /**
+ * @return the defaultLayout
+ */
+ public AbstractLayoutAlgorithm getLayout() {
+ return layout;
+ }
+
+ public AbstractLayoutAlgorithm getLayout(String layoutName) {
+ for (Entry<AbstractLayoutAlgorithm, String> entry : layouts.entrySet()) {
+ if (entry.getValue().equals(layoutName)) return entry.getKey();
+ }
+ return defaultLayout;
+ }
+
+ public Set<AbstractLayoutAlgorithm> getLayouts() {
+ return layouts.keySet();
+ }
+
+ public String getLayoutName(AbstractLayoutAlgorithm layout) {
+ return layouts.get(layout);
+ }
+
+ /**
+ * @param artifact the artifact to set
+ */
+ public void setArtifact(Artifact artifact) {
+ if (this.artifact == artifact) return;
+ this.artifact = artifact;
+ loadArtTypes();
+ loadRelTypes();
+ loadAttributeTypes();
+ notifyListeners(ModType.Artifact);
+ }
+
+ public boolean isValidArtifactType(ArtifactType type) {
+ if (!isFilterEnabled()) return true;
+ return getSelectedArtTypes().contains(type);
+ }
+
+ public boolean isValidRelationType(RelationType type) {
+ if (!isFilterEnabled()) return true;
+ return getSelectedRelTypes().contains(type);
+ }
+
+ public boolean isValidRelationLinkDescriptorSide(RelationLinkDescriptorSide side) {
+ if (!isFilterEnabled()) return true;
+ return getSelectedRelTypes().contains(side);
+ }
+
+ /**
+ * @return the levels
+ */
+ public int getLevels() {
+ return levels;
+ }
+
+ /**
+ * @param levels the levels to set
+ */
+ public void setLevels(int levels) {
+ if (this.levels == levels) return;
+ this.levels = levels;
+ notifyListeners(ModType.Level);
+ }
+
+ /**
+ * @return the filterByArtType
+ */
+ public boolean isFilterEnabled() {
+ return filterEnabled;
+ }
+
+ /**
+ * @param filterByArtType the filterByArtType to set
+ */
+ public void setFilterEnabled(boolean enable) {
+ if (this.filterEnabled == enable) return;
+ this.filterEnabled = enable;
+ notifyListeners(ModType.FilterEnabled);
+ }
+
+ private void notifyListeners(ModType... modType) {
+ for (ISkyWalkerOptionsChangeListener listener : listeners)
+ listener.modified(modType);
+ }
+
+ public void setSelectedRelTypes(Object[] selected) {
+ List<Object> selList = new ArrayList<Object>();
+ for (Object obj : selected)
+ selList.add(obj);
+ for (Entry<Object, Boolean> entry : relTypes.entrySet()) {
+ entry.setValue(selList.contains(entry.getKey()));
+ }
+ notifyListeners(ModType.RelType);
+ }
+
+ public void setSelectedShowAttributes(Object[] selected) {
+ List<Object> selList = new ArrayList<Object>();
+ for (Object obj : selected)
+ selList.add(obj);
+ for (Entry<AttributeType, Boolean> entry : showAttributes.entrySet()) {
+ entry.setValue(selList.contains(entry.getKey()));
+ }
+ notifyListeners(ModType.Show_Attribute);
+ }
+
+ public void setSelectedArtTypes(Collection<ArtifactType> selected) {
+ for (Entry<ArtifactType, Boolean> entry : artTypes.entrySet()) {
+ entry.setValue(selected.contains(entry.getKey()));
+ }
+ notifyListeners(ModType.ArtType);
+ }
+
+ public Set<ArtifactType> getSelectedArtTypes() {
+ Set<ArtifactType> selected = new HashSet<ArtifactType>();
+ if (artTypes == null) return selected;
+ for (ArtifactType desc : artTypes.keySet())
+ if (artTypes.get(desc)) selected.add(desc);
+ return selected;
+ }
+
+ public Set<Object> getSelectedRelTypes() {
+ Set<Object> selected = new HashSet<Object>();
+ if (relTypes == null) return selected;
+ for (Object desc : relTypes.keySet())
+ if (relTypes.get(desc)) selected.add(desc);
+ return selected;
+ }
+
+ public Set<AttributeType> getSelectedShowAttributeTypes() {
+ Set<AttributeType> selected = new HashSet<AttributeType>();
+ if (showAttributes == null) return selected;
+ for (AttributeType desc : showAttributes.keySet())
+ if (showAttributes.get(desc)) selected.add(desc);
+ return selected;
+ }
+
+ public Set<ArtifactType> getAllArtTypes() {
+ if (artTypes == null) return new HashSet<ArtifactType>();
+ return artTypes.keySet();
+ }
+
+ public Set<Object> getAllRelTypes() {
+ if (relTypes == null) return new HashSet<Object>();
+ return relTypes.keySet();
+ }
+
+ public Set<AttributeType> getAllShowAttributes() {
+ if (showAttributes == null) return new HashSet<AttributeType>();
+ return showAttributes.keySet();
+ }
+
+ public Set<RelationType> getAllRelationLinkDescriptorTypes() {
+ if (relTypes == null) return new HashSet<RelationType>();
+ Set<RelationType> descs = new HashSet<RelationType>();
+ for (Object obj : relTypes.keySet()) {
+ if (obj instanceof RelationType) descs.add((RelationType) obj);
+ }
+ return descs;
+ }
+
+ /**
+ * @param layout the layout to set
+ */
+ public void setLayout(AbstractLayoutAlgorithm layout) {
+ if (this.layout == layout) return;
+ this.layout = layout;
+ notifyListeners(ModType.Layout);
+ }
+
+ /**
+ * @return the linkName
+ */
+ public LinkName getLinkName() {
+ return linkName;
+ }
+
+ /**
+ * @param linkName the linkName to set
+ */
+ public void setLinkName(LinkName linkName) {
+ if (this.linkName == linkName) return;
+ this.linkName = linkName;
+ notifyListeners(ModType.Link_Name);
+ }
+
+ /**
+ * @return the defaultLayout
+ */
+ public AbstractLayoutAlgorithm getDefaultLayout() {
+ return defaultLayout;
+ }
+
+ /**
+ * @param defaultLayout the defaultLayout to set
+ */
+ public void setDefaultLayout(AbstractLayoutAlgorithm defaultLayout) {
+ this.defaultLayout = defaultLayout;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerRelTypeTabItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerRelTypeTabItem.java
new file mode 100644
index 00000000000..31880bdf448
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerRelTypeTabItem.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.framework.ui.skynet.skywalker;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+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.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TabItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerRelTypeTabItem {
+
+ private CheckboxTreeViewer treeViewer;
+ private Button selectAll;
+ private Button deSelectAll;
+ private final SkyWalkerOptions options;
+
+ public SkyWalkerRelTypeTabItem(org.eclipse.swt.widgets.TabFolder tabFolder, SkyWalkerOptions options) {
+
+ this.options = options;
+ TabItem item = new TabItem(tabFolder, SWT.NONE);
+ item.setText("Relation Type");
+
+ Composite comp = new Composite(tabFolder, SWT.BORDER);
+ comp.setLayout(ALayout.getZeroMarginLayout());
+ comp.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+
+ treeViewer = new CheckboxTreeViewer(comp, SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new RelTypeContentProvider());
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ storeSelected();
+ }
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public Image getImage(Object obj) {
+ return null;
+ }
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ });
+ treeViewer.setSorter(new ViewerSorter());
+
+ Composite buttonComp = new Composite(comp, SWT.BORDER);
+ buttonComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ buttonComp.setLayoutData(new GridData());
+
+ selectAll = new Button(buttonComp, SWT.PUSH);
+ selectAll.setText("Select All");
+ selectAll.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.setAllChecked(true);
+ storeSelected();
+ }
+ });
+
+ deSelectAll = new Button(buttonComp, SWT.PUSH);
+ deSelectAll.setText("De-Select All");
+ deSelectAll.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.setAllChecked(false);
+ storeSelected();
+ }
+ });
+
+ options.addSkyWalkerOptionsChangeListener(new ISkyWalkerOptionsChangeListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener#modified(org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType[])
+ */
+ public void modified(ModType... modTypes) {
+ handleOptionModified(modTypes);
+ }
+ });
+ // Set UI to defaults
+ handleOptionModified(ModType.FilterEnabled);
+ handleOptionModified(ModType.RelType);
+ item.setControl(comp);
+ }
+
+ public void storeSelected() {
+ options.setSelectedRelTypes(treeViewer.getCheckedElements());
+ }
+
+ public void handleOptionModified(ModType... modTypes) {
+ List<ModType> modList = Arrays.asList(modTypes);
+ if (modList.contains(ModType.FilterEnabled)) {
+ if (selectAll != null) selectAll.setEnabled(options.isFilterEnabled());
+ if (deSelectAll != null) deSelectAll.setEnabled(options.isFilterEnabled());
+ }
+ if (modList.contains(ModType.RelType)) {
+ if (treeViewer != null) {
+ treeViewer.setCheckedElements(options.getSelectedRelTypes().toArray());
+ }
+ }
+ if (modList.contains(ModType.Artifact)) {
+ if (treeViewer.getInput() == null && options.getAllRelTypes() != null && options.getAllRelTypes().size() > 0) {
+ treeViewer.setInput(options.getAllRelationLinkDescriptorTypes());
+ treeViewer.setAllChecked(true);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerShowAttributeTabItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerShowAttributeTabItem.java
new file mode 100644
index 00000000000..84c8473bf40
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerShowAttributeTabItem.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.framework.ui.skynet.skywalker;
+
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TabItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerShowAttributeTabItem {
+
+ private CheckboxTreeViewer treeViewer;
+ private final SkyWalkerOptions options;
+
+ public SkyWalkerShowAttributeTabItem(org.eclipse.swt.widgets.TabFolder tabFolder, SkyWalkerOptions options) {
+
+ this.options = options;
+ TabItem item = new TabItem(tabFolder, SWT.NONE);
+ item.setText("Show Attribute");
+
+ Composite comp = new Composite(tabFolder, SWT.BORDER);
+ comp.setLayout(ALayout.getZeroMarginLayout());
+ comp.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+
+ treeViewer = new CheckboxTreeViewer(comp, SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new ArrayTreeContentProvider());
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ storeSelected();
+ }
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public Image getImage(Object obj) {
+ return null;
+ }
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ });
+ treeViewer.setSorter(new ViewerSorter());
+
+ options.addSkyWalkerOptionsChangeListener(new ISkyWalkerOptionsChangeListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener#modified(org.eclipse.osee.framework.ui.skynet.skywalker.ISkyWalkerOptionsChangeListener.ModType[])
+ */
+ public void modified(ModType... modTypes) {
+ handleOptionModified(modTypes);
+ }
+ });
+ // Set UI to defaults
+ handleOptionModified(ModType.FilterEnabled);
+ handleOptionModified(ModType.Show_Attribute);
+ item.setControl(comp);
+ }
+
+ public void storeSelected() {
+ options.setSelectedShowAttributes(treeViewer.getCheckedElements());
+ }
+
+ public void handleOptionModified(ModType... modTypes) {
+ List<ModType> modList = Arrays.asList(modTypes);
+ if (modList.contains(ModType.Show_Attribute)) {
+ if (treeViewer != null) {
+ treeViewer.setCheckedElements(options.getSelectedShowAttributeTypes().toArray());
+ }
+ }
+ if (modList.contains(ModType.Artifact)) {
+ if (treeViewer.getInput() == null && options.getAllShowAttributes() != null && options.getAllShowAttributes().size() > 0) {
+ treeViewer.setInput(options.getAllShowAttributes());
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerTabOptions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerTabOptions.java
new file mode 100644
index 00000000000..9794c4285e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerTabOptions.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.framework.ui.skynet.skywalker;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TabFolder;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerTabOptions {
+
+ private TabFolder tabFolder;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public SkyWalkerTabOptions(Composite parent, int style, SkyWalkerOptions options) {
+ tabFolder = new TabFolder(parent, SWT.BORDER);
+
+ new SkyWalkerLayoutTabItem(tabFolder, options);
+ new SkyWalkerArtTypeTabItem(tabFolder, options);
+ new SkyWalkerRelTypeTabItem(tabFolder, options);
+ new SkyWalkerShowAttributeTabItem(tabFolder, options);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerView.java
new file mode 100644
index 00000000000..dc73a8014ae
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/skywalker/SkyWalkerView.java
@@ -0,0 +1,384 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.skywalker;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.ArtifactDoubleClick;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.ImageCapture;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.zest.core.viewers.GraphViewer;
+import org.eclipse.zest.core.widgets.GraphItem;
+import org.eclipse.zest.core.widgets.GraphNode;
+import org.eclipse.zest.core.widgets.ZestStyles;
+
+/**
+ * @author Robert A. Fisher
+ * @author Donald G. Dunne
+ */
+public class SkyWalkerView extends ViewPart {
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerView";
+ protected GraphViewer viewer;
+ private static final String INPUT = "input";
+ private static final String GUID = "guid";
+ private static final String BRANCHID = "branchId";
+ private String storedGuid;
+ private String storedBrandId;
+ private final SkyWalkerOptions options = new SkyWalkerOptions();
+ private final List<Artifact> history = new LinkedList<Artifact>();
+ private Action filterAction;
+ private Composite viewerComp;
+ protected SashForm sashForm;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+
+ sashForm = new SashForm(parent, SWT.HORIZONTAL);
+ sashForm.setLayout(new FillLayout());
+
+ viewerComp = new Composite(sashForm, SWT.NONE);
+ viewerComp.setLayout(new FillLayout());
+
+ viewer = new GraphViewer(viewerComp, ZestStyles.NONE);
+ viewer.setContentProvider(new ArtifactGraphContentProvider(options));
+ viewer.setLabelProvider(new ArtifactGraphLabelProvider(options));
+ viewer.setConnectionStyle(ZestStyles.CONNECTIONS_SOLID);
+ viewer.setNodeStyle(ZestStyles.NODES_NO_LAYOUT_RESIZE);
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+
+ public void doubleClick(DoubleClickEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ Iterator<?> itemsIter = selection.iterator();
+ while (itemsIter.hasNext()) {
+ Object obj = itemsIter.next();
+ if (!(obj instanceof Artifact)) continue;
+ Artifact artifact = (Artifact) obj;
+ explore(artifact);
+ }
+ }
+
+ });
+
+ Composite child1 = new Composite(sashForm, SWT.BORDER);
+ child1.setLayout(new FillLayout());
+ new SkyWalkerTabOptions(child1, SWT.NONE, options);
+
+ options.addSkyWalkerOptionsChangeListener(new ISkyWalkerOptionsChangeListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptionsChangeListener#modified(org.eclipse.osee.framework.ui.skynet.skywalker.SkyWalkerOptionsChangeListener.ModType)
+ */
+ public void modified(ModType... modTypes) {
+ List<ModType> modList = Arrays.asList(modTypes);
+ // Don't redraw if artifact has been changed; else get in infinite loop
+ if (modList.contains(ModType.Artifact)) return;
+ if (modList.contains(ModType.Layout))
+ viewer.setLayoutAlgorithm(options.getLayout(), true);
+ else if (modList.contains(ModType.Show_Attribute)) {
+ try {
+ // exploring another artifact and then the original forces a redraw of all the
+ // objects
+ // which is necessary for a node size change
+ Artifact art = (Artifact) viewer.getInput();
+ explore(UserManager.getUser(SystemUser.UnAssigned));
+ if (art != null) explore(art);
+ } catch (Exception ex) {
+ // DO Nothing
+ }
+ } else
+ redraw();
+ }
+ });
+
+ sashForm.setWeights(new int[] {75, 25});
+
+ createActions();
+ viewer.setLayoutAlgorithm(options.getLayout());
+ // Restore current artifact if stored upon shutdown
+ try {
+ if (storedGuid != null) {
+ Artifact art =
+ ArtifactQuery.getArtifactFromId(storedGuid, BranchManager.getBranch(Integer.parseInt(storedBrandId)));
+ if (art != null) explore(art);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ protected void createActions() {
+
+ IActionBars bars = getViewSite().getActionBars();
+ // IMenuManager mm = bars.getMenuManager();
+ IToolBarManager tbm = bars.getToolBarManager();
+
+ filterAction = new Action("Enable Filters", Action.AS_CHECK_BOX) {
+ @Override
+ public void run() {
+ options.setFilterEnabled(filterAction.isChecked());
+ redraw();
+ }
+ };
+ filterAction.setChecked(options.isFilterEnabled());
+ filterAction.setToolTipText("Enable Filters");
+ filterAction.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("filter.gif"));
+ tbm.add(filterAction);
+
+ Action action = new Action() {
+ @Override
+ public void run() {
+ ArtifactDoubleClick.openArtifact(viewer.getSelection());
+ }
+ };
+ action.setText("Open Selected");
+ action.setToolTipText("Open Selected");
+ action.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("edit2.gif"));
+ tbm.add(action);
+
+ action = new Action() {
+ @Override
+ public void run() {
+ if (history.size() > 0) {
+ Artifact art = history.get(history.size() - 1);
+ history.remove(history.size() - 1);
+ explore(art, true);
+ }
+ }
+ };
+ action.setText("Back");
+ action.setToolTipText("Back");
+ action.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("back.gif"));
+ tbm.add(action);
+
+ action = new Action() {
+ @Override
+ public void run() {
+ ImageCapture imgCapture = new ImageCapture(viewerComp);
+ imgCapture.popupDialog();
+ }
+ };
+ action.setText("Print");
+ action.setToolTipText("Print");
+ action.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("print.gif"));
+ tbm.add(action);
+
+ action = new Action() {
+ @Override
+ public void run() {
+ handleSaveOptions();
+ }
+ };
+ action.setText("Save Options");
+ action.setToolTipText("Save Options");
+ action.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("save.gif"));
+ tbm.add(action);
+
+ action = new Action() {
+ @Override
+ public void run() {
+ handleLoadOptions();
+ }
+ };
+ action.setText("Load Options");
+ action.setToolTipText("Load Options");
+ action.setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("load.gif"));
+ tbm.add(action);
+
+ action = new Action() {
+ @Override
+ public void run() {
+ redraw();
+ }
+ };
+ action.setText("Refresh");
+ action.setToolTipText("Refresh");
+ action.setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ tbm.add(action);
+ }
+
+ public void handleSaveOptions() {
+ final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.SAVE);
+ dialog.setFilterExtensions(new String[] {"*.sky"});
+ String filename = dialog.open();
+ if (filename != null) {
+ try {
+ Lib.writeStringToFile(options.toXml(), new File(filename));
+ AWorkbench.popup("Saved", "Save Successful");
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public void handleLoadOptions() {
+ final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.OPEN);
+ dialog.setFilterExtensions(new String[] {"*.sky"});
+ String filename = dialog.open();
+ if (filename != null) {
+ String xml = AFile.readFile(filename);
+ options.fromXml(xml);
+ explore(options.getArtifact());
+ }
+ }
+
+ public void redraw() {
+ if (viewer.getInput() != null) explore((Artifact) viewer.getInput());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.ats.IActionable#getActionDescription()
+ */
+ public String getActionDescription() {
+ return "";
+ }
+
+ public void explore(Artifact artifact) {
+ explore(artifact, false);
+ }
+
+ private boolean inExplore = false;
+
+ private void explore(Artifact artifact, boolean fromHistory) {
+ // If already in explore method, don't respond to events trying to redraw
+ if (inExplore) return;
+ inExplore = true;
+ options.setArtifact(artifact);
+
+ // Add current artifact to history only if explore wasn't caused by going back in history
+ if (!fromHistory && viewer.getInput() != null) {
+ Artifact currArt = (Artifact) viewer.getInput();
+ if (history.size() == 0)
+ history.add(currArt);
+ else if (history.size() > 0 && !history.get(history.size() - 1).equals(currArt)) history.add(currArt);
+ }
+ viewer.setInput(options.getArtifact());
+ // Highlight center object
+ GraphItem item = viewer.findGraphItem(options.getArtifact());
+ if (item != null && (item instanceof GraphNode)) {
+ GraphNode node = (GraphNode) item;
+ node.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_CYAN));
+ viewer.update(node, null);
+ }
+ setPartName("Sky Walker (" + artifact.getDescriptiveName() + ")");
+ inExplore = false;
+ }
+
+ public static void exploreArtifact(Artifact artifact) {
+ exploreArtifact(artifact.getDescriptiveName(), artifact);
+ }
+
+ public static void exploreArtifact(String name, Artifact artifact) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ SkyWalkerView view;
+ try {
+ view =
+ (SkyWalkerView) page.showView(SkyWalkerView.VIEW_ID, new GUID().toString(), IWorkbenchPage.VIEW_ACTIVATE);
+ view.explore(artifact);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
+ */
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+
+ if (viewer.getInput() == null) return;
+ Artifact artifact = (Artifact) viewer.getInput();
+ memento = memento.createChild(INPUT);
+ memento.putString(GUID, artifact.getGuid());
+ memento.putString(BRANCHID, String.valueOf(artifact.getBranch().getBranchId()));
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ try {
+ if (memento != null) {
+ memento = memento.getChild(INPUT);
+ if (memento != null) {
+ storedGuid = memento.getString(GUID);
+ storedBrandId = memento.getString(BRANCHID);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Sky Walker error on init: ", ex);
+ }
+ }
+
+ /**
+ * @return the options
+ */
+ public SkyWalkerOptions getOptions() {
+ return options;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/status/SwtStatusMonitor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/status/SwtStatusMonitor.java
new file mode 100644
index 00000000000..1d1145a7935
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/status/SwtStatusMonitor.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.framework.ui.skynet.status;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.skynet.core.status.IStatusMonitor;
+
+/**
+ * @author Theron Virgin
+ */
+public class SwtStatusMonitor implements IStatusMonitor {
+ final IProgressMonitor monitor;
+
+ public SwtStatusMonitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#startJob(java.lang.String, int)
+ */
+ @Override
+ public void startJob(String name, int totalWork) {
+ monitor.beginTask(name, totalWork);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#updateWork(int)
+ */
+ @Override
+ public void updateWork(int workCompleted) {
+ monitor.worked(workCompleted);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#updateWork(int)
+ */
+ @Override
+ public void done() {
+ monitor.done();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.status.IStatusMonitor#setSubtaskName()
+ */
+ @Override
+ public void setSubtaskName(String name) {
+ monitor.subTask(name);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ArtifactTemplateProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ArtifactTemplateProvider.java
new file mode 100644
index 00000000000..c43e293f910
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ArtifactTemplateProvider.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.framework.ui.skynet.templates;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.render.IRenderer;
+
+/**
+ * This provider gets all of its templates from the common branch based on a name created from concatenating the
+ * getTemplate parameters together in the various possible combinations
+ *
+ * @author Ryan D. Brooks
+ */
+public class ArtifactTemplateProvider implements ITemplateProvider {
+ private HashMap<String, Artifact> templateMap;
+
+ private List<Artifact> templates;
+
+ public ArtifactTemplateProvider() {
+
+ }
+
+ private synchronized void ensureTemplateCachePopulated() throws OseeCoreException {
+ if (templateMap == null) {
+ templateMap = new HashMap<String, Artifact>();
+ templates = ArtifactQuery.getArtifactsFromType("Renderer Template", BranchManager.getCommonBranch());
+ for (Artifact art : templates) {
+ Collection<Attribute<String>> attrs = art.getAttributes("Template Match Criteria");
+ for (Attribute<String> attr : attrs) {
+ String matchCriteria = attr.getValue();
+ Artifact cachedArt = templateMap.get(matchCriteria);
+ if (cachedArt == null) {
+ templateMap.put(matchCriteria, art);
+ } else { //use the artifact with the higher name value and warn the user that there are duplicate match criteria
+ int value = cachedArt.getDescriptiveName().compareTo(art.getDescriptiveName());
+ if (value < 0) {
+ templateMap.put(matchCriteria, art);
+ }
+ OseeLog.log(
+ SkynetGuiPlugin.class,
+ Level.SEVERE,
+ String.format(
+ "ArtifactTemplateProvider has detected a conflict with 'Template Match Criteria' [%s]. Artifact [%s] will supply the template for all requests with this match criteria.",
+ matchCriteria, templateMap.get(matchCriteria).getDescriptiveName()));
+
+ }
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.template.ITemplateProvider#getTemplate(java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Branch, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, java.lang.String)
+ */
+ @Override
+ public Artifact getTemplate(IRenderer renderer, Artifact artifact, String presentationType, String option) throws OseeCoreException {
+ ensureTemplateCachePopulated();
+ List<String> possibleTemplateNames =
+ getPossibleTemplateNamesOrderedBySpecialization(renderer, artifact, presentationType, option);
+
+ for (String name : possibleTemplateNames) {
+ Artifact template = templateMap.get(name);
+ if (template != null) {
+ return template;
+ }
+ }
+ throw new OseeArgumentException(String.format("Unable to find a valid template match for [%s, %s, %s, %s].",
+ renderer.toString(), artifact.toString(), presentationType, option));
+ }
+
+ private List<String> getPossibleTemplateNamesOrderedBySpecialization(IRenderer renderer, Artifact artifact, String presentationType, String option) throws OseeArgumentException {
+ if (renderer == null || presentationType == null) {
+ throw new OseeArgumentException(String.format("Invalid renderer[%s] or presentationType[%s]",
+ renderer.toString(), presentationType.toString()));
+ }
+ List<String> list = new ArrayList<String>();
+
+ String rendererId = renderer.getClass().getCanonicalName();
+ if (artifact != null && option != null) {
+ list.add(rendererId + " " + artifact.getArtifactTypeName() + " " + presentationType + " " + option);
+ }
+ if (artifact != null) {
+ list.add(rendererId + " " + artifact.getArtifactTypeName() + " " + presentationType);
+ }
+ if (option != null) {
+ list.add(rendererId + " " + presentationType + " " + option);
+ }
+
+ list.add(rendererId + " " + presentationType);
+ return list;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.template.ITemplateProvider#getApplicabilityRating(java.lang.String, org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String, java.lang.String)
+ */
+ public int getApplicabilityRating(IRenderer rendererId, Artifact artifact, String presentationType, String option) {
+ return ITemplateProvider.DEFAULT_MATCH;
+ }
+
+ public List<Artifact> getAllTemplates() throws OseeCoreException {
+ if (templates == null) {
+ templates = ArtifactQuery.getArtifactsFromType("Renderer Template", BranchManager.getCommonBranch());
+ }
+ return templates;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ITemplateProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ITemplateProvider.java
new file mode 100644
index 00000000000..97c81b2dfa1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/ITemplateProvider.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.framework.ui.skynet.templates;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.IRenderer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITemplateProvider {
+
+ public static final int SUBTYPE_TYPE_MATCH = 30;
+ public static final int ARTIFACT_TYPE_MATCH = 20;
+ public static final int DEFAULT_MATCH = 10;
+ public static final int NO_MATCH = -1;
+
+ public Artifact getTemplate(IRenderer renderer, Artifact artifact, String presentationType, String option) throws OseeCoreException;
+
+ public abstract int getApplicabilityRating(IRenderer renderer, Artifact artifact, String presentationType, String option);
+
+ public List<Artifact> getAllTemplates() throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/SimpleTemplateProviderDbTask.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/SimpleTemplateProviderDbTask.java
new file mode 100644
index 00000000000..32ba064aecd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/SimpleTemplateProviderDbTask.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.framework.ui.skynet.templates;
+
+import java.io.IOException;
+import java.net.URL;
+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.Platform;
+import org.eclipse.osee.framework.database.IDbInitializationTask;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+
+public class SimpleTemplateProviderDbTask implements IDbInitializationTask {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.database.initialize.tasks.IDbInitializationTask#run(java.sql.Connection)
+ */
+ public void run() throws OseeCoreException {
+ try {
+ processTemplatesForDBInit();
+ } catch (IOException ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ private void processTemplatesForDBInit() throws IOException, OseeCoreException {
+
+ Artifact templateFolder = getTemplateFolder();
+ IExtensionPoint ep =
+ Platform.getExtensionRegistry().getExtensionPoint(
+ "org.eclipse.osee.framework.ui.skynet.SimpleTemplateProviderTemplate");
+ for (IExtension extension : ep.getExtensions()) {
+ for (IConfigurationElement el : extension.getConfigurationElements()) {
+ Artifact templateArtifact =
+ ArtifactTypeManager.addArtifact("Renderer Template", BranchManager.getCommonBranch());
+ String filePath = el.getAttribute("File");
+ String name = filePath.substring(filePath.lastIndexOf('/') + 1);
+ name = name.substring(0, name.lastIndexOf('.'));
+ URL url = Platform.getBundle(el.getContributor().getName()).getEntry(filePath);
+
+ if (url != null) {
+ templateArtifact.setSoleAttributeValue("Name", name);
+ templateArtifact.setSoleAttributeFromStream(WordAttribute.WHOLE_WORD_CONTENT, url.openStream());
+ for (IConfigurationElement matchCriteriaEl : el.getChildren()) {
+ String match = matchCriteriaEl.getAttribute("match");
+ templateArtifact.addAttribute("Template Match Criteria", match);
+ }
+ templateArtifact.persistAttributes();
+ templateFolder.addChild(templateArtifact);
+ } else {
+ OseeLog.log(SimpleTemplateProviderDbTask.class, Level.SEVERE, String.format("Problem loading file %s",
+ filePath));
+ }
+ }
+ }
+ templateFolder.persistAttributesAndRelations();
+ }
+
+ private Artifact getTemplateFolder() throws OseeCoreException {
+ Artifact templateFolder =
+ ArtifactQuery.checkArtifactFromTypeAndName("Folder", "Document Templates", BranchManager.getCommonBranch());
+ if (templateFolder == null) {
+ Artifact rootArt = ArtifactQuery.getDefaultHierarchyRootArtifact(BranchManager.getCommonBranch());
+
+ templateFolder =
+ ArtifactTypeManager.addArtifact("Folder", BranchManager.getCommonBranch(), "Document Templates");
+ rootArt.addChild(templateFolder);
+ templateFolder.persistAttributesAndRelations();
+ }
+ return templateFolder;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/TemplateManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/TemplateManager.java
new file mode 100644
index 00000000000..f3f71fe3013
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/templates/TemplateManager.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.framework.ui.skynet.templates;
+
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.render.IRenderer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TemplateManager {
+ private static final String EXTENSION_ID = "org.eclipse.osee.framework.ui.skynet.TemplateProvider";
+ private static final String EXTENSION_ELEMENT = "TemplateProvider";
+ private static final String EXTENSION_CLASSNAME = "classname";
+ private final List<ITemplateProvider> templateProviders;
+ private static final TemplateManager instance = new TemplateManager();
+
+ private TemplateManager() {
+ ExtensionDefinedObjects<ITemplateProvider> extensionDefinedObjects =
+ new ExtensionDefinedObjects<ITemplateProvider>(EXTENSION_ID, EXTENSION_ELEMENT, EXTENSION_CLASSNAME);
+ templateProviders = extensionDefinedObjects.getObjects();
+ }
+
+ public static Artifact getTemplate(IRenderer renderer, Artifact artifact, String presentationType, String option) throws OseeCoreException {
+ ITemplateProvider bestTemplateProvider = null;
+ int highestRating = 0;
+ for (ITemplateProvider templateProvider : instance.templateProviders) {
+ int rating = templateProvider.getApplicabilityRating(renderer, artifact, presentationType, option);
+ if (rating > highestRating) {
+ bestTemplateProvider = templateProvider;
+ highestRating = rating;
+ }
+ }
+ return bestTemplateProvider.getTemplate(renderer, artifact, presentationType, option);
+ }
+
+ public static List<ITemplateProvider> getTemplateProviders() {
+ return instance.templateProviders;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/InterArtifactExplorerDropHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/InterArtifactExplorerDropHandler.java
new file mode 100644
index 00000000000..a3656a5bb5a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/InterArtifactExplorerDropHandler.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.framework.ui.skynet.update;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.db.connection.ConnectionHandler;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoad;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactLoader;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class InterArtifactExplorerDropHandler {
+ private static final String IS_ARTIFACT_ON_BRANCH =
+ "select count(1) from osee_artifact_version av1, osee_txs txs1, osee_tx_details txd1 where av1.art_id = ? and av1.gamma_id = txs1.gamma_id and txs1.transaction_id = txd1.transaction_id and txd1.branch_id = ?";
+ private static final String ACCESS_ERROR_MSG_TITLE = "Drag and Drop Error";
+ private static final String UPDATE_FROM_PARENT_ERROR_MSG =
+ "Attempting to update child branch from parent branch. Use 'Update Branch' instead.";
+ private static final String ACCESS_ERROR_MSG =
+ "Access control has restricted this action. The current user does not have sufficient permission to drag and drop artifacts on this branch from the selected source branch.";
+
+ public boolean isUpdateFromParent(Branch sourceBranch, Branch destinationBranch) throws OseeCoreException {
+ boolean result = false;
+ if (destinationBranch.hasParentBranch()) {
+ try {
+ result = destinationBranch.getParentBranch().equals(sourceBranch);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return result;
+ }
+
+ public boolean isAccessAllowed(Branch sourceBranch, Branch destinationBranch) throws OseeCoreException {
+ return AccessControlManager.checkObjectPermission(destinationBranch, PermissionEnum.WRITE) && AccessControlManager.checkObjectPermission(
+ sourceBranch, PermissionEnum.READ);
+ }
+
+ public void dropArtifactIntoDifferentBranch(Artifact destinationParentArtifact, Artifact[] sourceArtifacts, boolean prompt) throws OseeCoreException {
+ if (destinationParentArtifact == null || sourceArtifacts == null || sourceArtifacts.length < 1) {
+ throw new OseeArgumentException("");
+ }
+
+ Branch sourceBranch = sourceArtifacts[0].getBranch();
+ Branch destinationBranch = destinationParentArtifact.getBranch();
+
+ if (isUpdateFromParent(sourceBranch, destinationBranch)) {
+ MessageDialog.openError(Display.getCurrent().getActiveShell(), ACCESS_ERROR_MSG_TITLE,
+ UPDATE_FROM_PARENT_ERROR_MSG);
+ } else if (isAccessAllowed(sourceBranch, destinationBranch)) {
+ List<Integer> artifactIds = new ArrayList<Integer>();
+ artifactIds.add(destinationParentArtifact.getArtId());
+
+ for (Artifact artifact : destinationParentArtifact.getDescendants()) {
+ artifactIds.add(artifact.getArtId());
+ }
+
+ List<TransferObject> transferObjects = new LinkedList<TransferObject>();
+
+ for (Artifact sourceArtifact : sourceArtifacts) {
+ TransferStatus transferStatus = null;
+
+ if (artifactOnBranch(destinationParentArtifact.getBranch(), sourceArtifact)) {
+ transferStatus = TransferStatus.UPDATE;
+ } else {
+ transferStatus = TransferStatus.INTRODUCE;
+ }
+ transferObjects.add(new TransferObject(sourceArtifact, transferStatus));
+
+ }
+ if (prompt) {
+ boolean userConfirmed =
+ confirmUsersRequestAndProcess(destinationParentArtifact, sourceBranch, transferObjects);
+ if (!userConfirmed) return;
+ }
+ addArtifactsToNewTransaction(destinationParentArtifact, transferObjects, sourceBranch);
+ } else {
+ MessageDialog.openError(Display.getCurrent().getActiveShell(), ACCESS_ERROR_MSG_TITLE, ACCESS_ERROR_MSG);
+ }
+
+ }
+
+ private boolean confirmUsersRequestAndProcess(Artifact destinationArtifact, Branch sourceBranch, List<TransferObject> transferObjects) throws OseeCoreException {
+ ReflectArtifactStatusDialog updateArtifactStatusDialog = new ReflectArtifactStatusDialog(transferObjects);
+ return (updateArtifactStatusDialog.open() == Window.OK);
+ }
+
+ private void addArtifactsToNewTransaction(Artifact destinationArtifact, List<TransferObject> transferObjects, Branch sourceBranch) throws OseeCoreException {
+ SkynetTransaction transaction = new SkynetTransaction(destinationArtifact.getBranch());
+ ArrayList<Artifact> reloadArtifacts = new ArrayList<Artifact>();
+
+ ArrayList<Integer> sourceArtIds = new ArrayList<Integer>(transferObjects.size());
+ for (TransferObject transferObject : transferObjects) {
+ sourceArtIds.add(transferObject.getArtifact().getArtId());
+ }
+
+ ArtifactLoader.loadArtifacts(sourceArtIds, sourceBranch, ArtifactLoad.ALL_CURRENT, true);
+
+ for (TransferObject transferObject : transferObjects) {
+ TransferStatus status = transferObject.getStatus();
+ Artifact sourceArtifact = transferObject.getArtifact();
+
+ if (status == TransferStatus.INTRODUCE || status == TransferStatus.UPDATE) {
+ Artifact parentArtifact = getParent(sourceArtifact, destinationArtifact, status);
+
+ Artifact reflectedArtifact;
+ if (status == TransferStatus.INTRODUCE) {
+ reflectedArtifact = sourceArtifact.reflect(destinationArtifact.getBranch());
+ reflectedArtifact.setSoleRelation(CoreRelationEnumeration.DEFAULT_HIERARCHICAL__PARENT, parentArtifact);
+ } else {
+ reflectedArtifact = sourceArtifact.reflect(destinationArtifact.getBranch());
+ reloadArtifacts.add(reflectedArtifact);
+ }
+ reflectedArtifact.persistAttributesAndRelations(transaction);
+ }
+ }
+ transaction.execute();
+
+ for (Artifact reloadArtifact : reloadArtifacts) {
+ reloadArtifact.reloadAttributesAndRelations();
+ }
+ }
+
+ private Artifact getParent(Artifact sourceArtifact, Artifact destinationArtifact, TransferStatus status) throws OseeCoreException {
+ Artifact reflectedArtifact =
+ ArtifactQuery.checkArtifactFromId(sourceArtifact.getArtId(), destinationArtifact.getBranch(), true);
+ Artifact newDestinationArtifact = destinationArtifact;
+
+ if (reflectedArtifact != null) {
+ newDestinationArtifact = reflectedArtifact.getParent();
+ // Causes transaction errors so we can only introduce the same artifact once.
+ // if (status == TransferStatus.INTRODUCE) {
+ // reflectedArtifact.revert();
+ // ArtifactPersistenceManager.revertArtifact(null, reflectedArtifact);
+ // }
+ //
+ // if (!reflectedArtifact.equals(newDestinationArtifact)) {
+ // newDestinationArtifact.reloadAttributesAndRelations();
+ // }
+ }
+ return newDestinationArtifact;
+ }
+
+ // private void addArtifactsToBaseline(List<TransferObject> transferObjects, Branch destinationBranch, Branch sourceBranch) throws OseeCoreException {
+ // List<Artifact> artifacts = new LinkedList<Artifact>();
+ //
+ // for (TransferObject transferObject : transferObjects) {
+ // TransferStatus status = transferObject.getStatus();
+ // if (status == TransferStatus.REBASELINE || status == TransferStatus.REBASELINE_SOMEWHERE_ON_BRANCH || status == TransferStatus.ADD_TO_BASELINE) {
+ // artifacts.add(transferObject.getArtifact());
+ // }
+ // }
+ //
+ // if (artifacts.isEmpty()) {
+ // return;
+ // }
+ //
+ // RebaselineDbTransaction artifactDbTransaction =
+ // new RebaselineDbTransaction(destinationBranch, sourceBranch, artifacts);
+ // artifactDbTransaction.execute();
+ // }
+
+ private boolean artifactOnBranch(Branch sourceBranch, Artifact sourceArtifact) throws OseeDataStoreException {
+ return ConnectionHandler.runPreparedQueryFetchInt(0, IS_ARTIFACT_ON_BRANCH, sourceArtifact.getArtId(),
+ sourceBranch.getBranchId()) > 0;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectArtifactStatusDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectArtifactStatusDialog.java
new file mode 100644
index 00000000000..63a6c5f8e29
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectArtifactStatusDialog.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.framework.ui.skynet.update;
+
+import java.util.List;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class ReflectArtifactStatusDialog extends MessageDialog{
+ private static final String TITLE = "Confirm Inter Artifact Explorer Drop";
+ private static final String OK = "Ok";
+ private static final String CANCEL = "Cancel";
+ private List<TransferObject> transferObjects;
+
+ public ReflectArtifactStatusDialog(List<TransferObject> transferObjects) {
+ super(Display.getCurrent().getActiveShell(), TITLE, null, null, MessageDialog.NONE,
+ new String[] {OK, CANCEL}, 0);
+ this.transferObjects = transferObjects;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ TreeViewer listViewer = new TreeViewer(container);
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 270;
+ gridData.widthHint = 500;
+ listViewer.getControl().setLayoutData(gridData);
+ listViewer.setContentProvider(new ReflectContentProvider());
+ listViewer.setLabelProvider(new ReflectDecoratingLabelProvider(new RevertLabelProvider()));
+ listViewer.setInput(transferObjects);
+
+ return listViewer.getControl();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectContentProvider.java
new file mode 100644
index 00000000000..b7c4c9bbad0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectContentProvider.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.framework.ui.skynet.update;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public class ReflectContentProvider implements ITreeContentProvider{
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ @Override
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ @Override
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Object[]) {
+ return (Object[]) inputElement;
+ }
+ if (inputElement instanceof Collection) {
+ return ((Collection<?>) inputElement).toArray();
+ }
+ return new Object[0];
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectDecoratingLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectDecoratingLabelProvider.java
new file mode 100644
index 00000000000..afb7f1bcaa3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/ReflectDecoratingLabelProvider.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.framework.ui.skynet.update;
+
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ReflectDecoratingLabelProvider extends DecoratingStyledCellLabelProvider implements ILabelProvider {
+
+ public ReflectDecoratingLabelProvider(RevertLabelProvider labelProvider) {
+ super(labelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), null);
+ }
+
+ public void initialize(ColumnViewer viewer, ViewerColumn column) {
+ setOwnerDrawEnabled(true);
+
+ super.initialize(viewer, column);
+ }
+
+ protected StyleRange prepareStyleRange(StyleRange styleRange, boolean applyColors) {
+ if (!applyColors && styleRange.background != null) {
+ styleRange = super.prepareStyleRange(styleRange, applyColors);
+ styleRange.borderStyle = SWT.BORDER_DASH;
+ return styleRange;
+ }
+ return super.prepareStyleRange(styleRange, applyColors);
+ }
+
+ public String getText(Object element) {
+ return getStyledText(element).getString();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/RevertLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/RevertLabelProvider.java
new file mode 100644
index 00000000000..481c49b9a63
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/RevertLabelProvider.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.framework.ui.skynet.update;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class RevertLabelProvider extends LabelProvider implements IStyledLabelProvider {
+ private static final String HIGHLIGHT_WRITE_BG_COLOR_NAME = "org.eclipse.jdt.ui.ColoredLabels.writeaccess_highlight"; //$NON-NLS-1$
+ private static final Styler HIGHLIGHT_STYLE =
+ StyledString.createColorRegistryStyler(null, HIGHLIGHT_WRITE_BG_COLOR_NAME);
+ private static final String DASH = " - ";
+ private final Map<Image, Image> disabledMap;
+
+ public RevertLabelProvider() {
+ super();
+
+ this.disabledMap = new HashMap<Image, Image>();
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ Image imageToReturn = null;
+
+ if (element instanceof TransferObject) {
+ TransferObject transferObject = (TransferObject) element;
+ Image artImage = ImageManager.getImage(transferObject.getArtifact());
+
+ if (transferObject.getStatus().equals(TransferStatus.ERROR)) {
+ imageToReturn = disabledMap.get(artImage);
+
+ if (imageToReturn == null) {
+ imageToReturn = new Image(artImage.getDevice(), artImage, SWT.IMAGE_DISABLE);
+ disabledMap.put(artImage, imageToReturn);
+ }
+ } else {
+ imageToReturn = artImage;
+ }
+ }
+ return imageToReturn;
+ }
+
+ @Override
+ public StyledString getStyledText(Object element) {
+ StyledString styledString = new StyledString();
+
+ if (element instanceof TransferObject) {
+ TransferObject transferObject = (TransferObject) element;
+ TransferStatus status = transferObject.getStatus();
+
+ if (status == TransferStatus.ERROR) {
+ styledString.append(transferObject.getArtifact().getDescriptiveName(), StyledString.DECORATIONS_STYLER);
+ styledString.append(DASH);
+ styledString.append(status.getMessage(), HIGHLIGHT_STYLE);
+ } else {
+ styledString.append(transferObject.getArtifact().getDescriptiveName());
+ styledString.append(DASH);
+ styledString.append(status.getMessage(), StyledString.COUNTER_STYLER);
+ }
+ }
+ return styledString;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferObject.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferObject.java
new file mode 100644
index 00000000000..caedae85156
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferObject.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.framework.ui.skynet.update;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class TransferObject {
+ private TransferStatus status;
+ private Artifact artifact;
+
+ public TransferObject(Artifact artifact, TransferStatus status) {
+ super();
+ this.status = status;
+ this.artifact = artifact;
+ }
+
+ /**
+ * @return the status
+ */
+ public TransferStatus getStatus() {
+ return status;
+ }
+
+ /**
+ * @return the artifact
+ */
+ public Artifact getArtifact() {
+ return artifact;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferStatus.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferStatus.java
new file mode 100644
index 00000000000..377a8322f43
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/update/TransferStatus.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.framework.ui.skynet.update;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public enum TransferStatus {
+
+ REBASELINE("Replace artifact in baseline with new version"),
+ REBASELINE_SOMEWHERE_ON_BRANCH("Artifact exist on branch - Revert artifact and update"),
+ ADD_TO_BASELINE("Add artifact to baseline transaction"),
+ INTRODUCE("Introduce this artifact to this branch in a new transaction"),
+ UPDATE("Update this artifact in a new transaction"),
+ ERROR("This artifact will not be updated");
+
+ private String message;
+
+ private TransferStatus(String message) {
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactClipboard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactClipboard.java
new file mode 100644
index 00000000000..3c0e080bc7d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactClipboard.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.framework.ui.skynet.util;
+
+import java.util.Collection;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.ui.skynet.HTMLTransferFormatter;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.swt.NonBlankValidator;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.HTMLTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactClipboard {
+ private static final String STATUS = "work";
+ private Clipboard clipboard;
+ private String viewId;
+
+ public ArtifactClipboard(String viewId) {
+ this.clipboard = new Clipboard(null);
+ this.viewId = viewId;
+ }
+
+ public void setArtifactsToClipboard(Collection<Artifact> artifactTransferData, Collection<String> textTransferData) {
+ if (artifactTransferData == null) {
+ throw new IllegalArgumentException("Artifacts can not be null for artifact copy.");
+ }
+ if (artifactTransferData.isEmpty()) {
+ throw new IllegalArgumentException("Artifacts can not be empty.");
+ }
+
+ Artifact[] artifacts = artifactTransferData.toArray(new Artifact[artifactTransferData.size()]);
+
+ clipboard.setContents(new Object[] {new ArtifactData(artifacts, STATUS, viewId),
+ HTMLTransferFormatter.getHtml(artifacts), Collections.toString(textTransferData, null, ", ", null)},
+ new Transfer[] {ArtifactTransfer.getInstance(), HTMLTransfer.getInstance(), TextTransfer.getInstance()});
+ }
+
+ public void setTextToClipboard(Collection<String> textTransferData) {
+ if (textTransferData == null) {
+ throw new IllegalArgumentException("Artifacts can not be null for artifact copy.");
+ }
+ if (textTransferData.isEmpty()) {
+ throw new IllegalArgumentException("Artifacts can not be empty.");
+ }
+
+ clipboard.setContents(new Object[] {Collections.toString(textTransferData, null, ", ", null)},
+ new Transfer[] {TextTransfer.getInstance()});
+ }
+
+ private static IInputValidator inputValidator = new NonBlankValidator("The new name must not be blank");
+
+ /**
+ * This method must be called from the display thread
+ *
+ * @throws Exception
+ */
+ public void pasteArtifactsFromClipboard(Artifact parent) throws Exception {
+ if (parent == null) throw new IllegalArgumentException("Parent can not be null.");
+
+ Object object = clipboard.getContents(ArtifactTransfer.getInstance());
+
+ if (object instanceof ArtifactData) {
+ Artifact[] clipboardArtifacts = ((ArtifactData) object).getArtifacts();
+
+ if (clipboardArtifacts.length == 1) {
+ Artifact clipboardArtifact = clipboardArtifacts[0];
+ if (clipboardArtifact instanceof User) {
+ return;
+ }
+
+ InputDialog dialog =
+ new InputDialog(Display.getCurrent().getActiveShell(), "Name Artifact", "Enter artifact name",
+ clipboardArtifacts[0].getDescriptiveName(), inputValidator);
+
+ if (dialog.open() == Window.CANCEL) {
+ return;
+ } else {
+ Artifact newArtifact = null;
+ newArtifact = clipboardArtifact.duplicate(parent.getBranch());
+ newArtifact.setDescriptiveName(dialog.getValue());
+ parent.addChild(newArtifact);
+ }
+ } else {
+ for (Artifact clipboardArtifact : clipboardArtifacts) {
+ // We do not support duplicating user artifacts.
+ if (clipboardArtifact instanceof User) {
+ continue;
+ }
+
+ Artifact newArtifact = null;
+ newArtifact = clipboardArtifact.duplicate(parent.getBranch());
+ parent.addChild(newArtifact);
+ }
+ }
+
+ parent.persistAttributesAndRelations();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactDescriptiveLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactDescriptiveLabelProvider.java
new file mode 100644
index 00000000000..8c6f13cc8f9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactDescriptiveLabelProvider.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.skynet.util;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Artifact Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactDescriptiveLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ return ((Artifact) arg0).getDescriptiveName();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameReverseSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameReverseSorter.java
new file mode 100644
index 00000000000..6faa65a61b4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameReverseSorter.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.framework.ui.skynet.util;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * Default sorter for artifacts. Sorts on descriptive name
+ */
+public class ArtifactNameReverseSorter extends ViewerSorter {
+
+ /**
+ * Default sorter for artifacts. Sorts on descriptive name
+ */
+ public ArtifactNameReverseSorter() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc) Method declared on ViewerSorter.
+ */
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ return getComparator().compare(((Artifact) o2).getDescriptiveName(), ((Artifact) o1).getDescriptiveName());
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameSorter.java
new file mode 100644
index 00000000000..b6d651d772a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactNameSorter.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.framework.ui.skynet.util;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * Default sorter for artifacts. Sorts on descriptive name
+ */
+public class ArtifactNameSorter extends ViewerSorter {
+
+ /**
+ * Default sorter for artifacts. Sorts on descriptive name
+ */
+ public ArtifactNameSorter() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc) Method declared on ViewerSorter.
+ */
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ return getComparator().compare(((Artifact) o1).getDescriptiveName(), ((Artifact) o2).getDescriptiveName());
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeAndDescriptiveLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeAndDescriptiveLabelProvider.java
new file mode 100644
index 00000000000..dc306b0dfd2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeAndDescriptiveLabelProvider.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.framework.ui.skynet.util;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Artifact Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactTypeAndDescriptiveLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return ImageManager.getImage((Artifact) arg0);
+ }
+
+ public String getText(Object arg0) {
+ return "[" + ((Artifact) arg0).getArtifactTypeName() + "][" + ((Artifact) arg0).getDescriptiveName() + "]";
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeLabelProvider.java
new file mode 100644
index 00000000000..f56c8ea101e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeLabelProvider.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.framework.ui.skynet.util;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Artifact Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactTypeLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return ImageManager.getImage(((ArtifactType) arg0));
+ }
+
+ public String getText(Object arg0) {
+ return ((ArtifactType) arg0).getName();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeNameSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeNameSorter.java
new file mode 100644
index 00000000000..c15e683a67b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ArtifactTypeNameSorter.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.framework.ui.skynet.util;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+
+/**
+ * Default sorter for artifacts. Sorts on descriptive name
+ */
+public class ArtifactTypeNameSorter extends ViewerSorter {
+
+ /**
+ * Default sorter for artifacts. Sorts on descriptive name
+ */
+ public ArtifactTypeNameSorter() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc) Method declared on ViewerSorter.
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ return getComparator().compare(((ArtifactType) o1).getName(), ((ArtifactType) o2).getName());
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/AttributeCheckListDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/AttributeCheckListDialog.java
new file mode 100644
index 00000000000..11ec45d1e97
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/AttributeCheckListDialog.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.framework.ui.skynet.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ArtifactTreeContentProvider;
+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.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AttributeCheckListDialog extends SelectionDialog {
+ private CheckboxTreeViewer treeViewer;
+ private final ArrayList<AttributeType> selectedAttributes;
+ private String preferenceKey;
+ private Branch branch;
+
+ public AttributeCheckListDialog(Shell parent, String preferenceKey, Branch branch) {
+ this(parent, null, preferenceKey, branch);
+ }
+
+ public AttributeCheckListDialog(Shell parent, Collection<AttributeType> attrTypes, String preferenceKey, Branch branch) {
+ super(parent);
+ setTitle("Select Attributes");
+ setMessage("Select Attributes");
+ this.selectedAttributes = new ArrayList<AttributeType>();
+ this.preferenceKey = preferenceKey;
+ this.branch = branch;
+
+ if (attrTypes != null && !attrTypes.isEmpty()) {
+ selectedAttributes.addAll(attrTypes);
+ }
+ }
+
+ public String getSelectedAttributeData(Artifact artifact) throws Exception {
+ if (artifact == null) {
+ throw new IllegalArgumentException(" - ERROR: Null Artifact");
+ }
+
+ StringBuilder result = new StringBuilder();
+ for (AttributeType attributeType : artifact.getAttributeTypes()) {
+ if (selectedAttributes.contains(attributeType)) {
+ result.append(" - ");
+ result.append(artifact.getAttributesToString(attributeType.getName()));
+ }
+ }
+ return result.toString();
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ treeViewer =
+ new CheckboxTreeViewer(comp,
+ SWT.MULTI | SWT.CHECK | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.setContentProvider(new ArtifactTreeContentProvider());
+ treeViewer.setSorter(new AttributeViewerSorter());
+ ArrayList<Object> objs = new ArrayList<Object>();
+ for (Object obj : selectedAttributes)
+ objs.add(obj);
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ selectedAttributes.clear();
+ for (Object obj : treeViewer.getCheckedElements())
+ selectedAttributes.add((AttributeType) obj);
+ };
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ });
+ try {
+ if (branch != null){
+ treeViewer.setInput(TypeValidityManager.getValidAttributeTypes(branch));
+ } else {
+ treeViewer.setInput(selectedAttributes);
+ }
+ treeViewer.setCheckedElements(objs.toArray(new Object[objs.size()]));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return container;
+ }
+
+ public class AttributeViewerSorter extends ViewerSorter {
+ public AttributeViewerSorter() {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ return getComparator().compare(((AttributeType) o1).getName(), ((AttributeType) o2).getName());
+ }
+ }
+
+ public boolean noneSelected() {
+ return selectedAttributes.isEmpty();
+ }
+
+ /**
+ * @return the selectedAttributes
+ */
+ public Collection<AttributeType> getSelectedAttributes() {
+ return selectedAttributes;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ @Override
+ protected void okPressed() {
+ super.okPressed();
+
+ IPreferenceStore prefStore = SkynetGuiPlugin.getInstance().getPreferenceStore();
+ prefStore.setValue(preferenceKey, Collections.toString(getSelectedAttributes(), "", "|", ""));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ChangeType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ChangeType.java
new file mode 100644
index 00000000000..9af6bfa0c4d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ChangeType.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.framework.ui.skynet.util;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum ChangeType {
+
+ None, Support, Problem, Improvement;
+
+ public static String[] getChangeTypes() {
+ ArrayList<String> types = new ArrayList<String>();
+ for (ChangeType type : values())
+ if (type != None) types.add(type.name());
+ return types.toArray(new String[types.size()]);
+ }
+
+ public static ChangeType getChangeType(String name) {
+ for (ChangeType type : values()) {
+ if (type.name().equals(name)) return type;
+ }
+ return None;
+ }
+
+ public Image getImage() {
+ if (this == ChangeType.Problem) {
+ return ImageManager.getImage(FrameworkImage.PROBLEM);
+ } else if (this == ChangeType.Improvement) {
+ return ImageManager.getImage(FrameworkImage.GREEN_PLUS);
+ } else if (this == ChangeType.Support) {
+ return ImageManager.getImage(FrameworkImage.SUPPORT);
+ }
+ return null;
+ }
+ public static class ChangeTypeLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return ((ChangeType) arg0).getImage();
+ }
+
+ public String getText(Object arg0) {
+ return ((ChangeType) arg0).name();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/DbConnectionExceptionComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/DbConnectionExceptionComposite.java
new file mode 100644
index 00000000000..8223ed6e3ff
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/DbConnectionExceptionComposite.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.framework.ui.skynet.util;
+
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.ExceptionComposite;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DbConnectionExceptionComposite extends ExceptionComposite {
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public DbConnectionExceptionComposite(Composite parent, Exception ex) {
+ super(parent, ex);
+ }
+
+ /**
+ * Tests the DB Connection and returns true if ok. If exceptions and parent != null, the
+ * DbConnectionExceptionComposite will be displayed in parent giving exception information.
+ *
+ * @param parent
+ * @return
+ */
+ public static boolean dbConnectionIsOk(Composite parent) {
+ // try {
+ // ConnectionHandler.getConnection();
+ // } catch (Exception ex) {
+ // if (parent != null) new DbConnectionExceptionComposite(parent, ex);
+ // }
+ Result result = SkynetGuiPlugin.areOSEEServicesAvailable();
+ if (result.isFalse()) {
+ new DbConnectionExceptionComposite(parent, new IllegalStateException(
+ "OSEE Service(s) Unavailable:\n\t" + result.getText().replaceAll("\n", "\n\t")));
+ }
+ return result.isTrue();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailGroupsAndUserGroups.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailGroupsAndUserGroups.java
new file mode 100644
index 00000000000..398c11b8112
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailGroupsAndUserGroups.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.framework.ui.skynet.util;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserGroupsCheckTreeDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.program.Program;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailGroupsAndUserGroups extends XNavigateItemAction {
+
+ private final GroupType[] groupType;
+ public static enum GroupType {
+ Groups, UserGroups, Both
+ };
+
+ /**
+ * @param parent
+ * @param teamDefHoldingVersions Team Definition Artifact that is related to versions or null for popup selection
+ */
+ public EmailGroupsAndUserGroups(XNavigateItem parent, GroupType... groupType) {
+ super(parent,
+ "Email " + (Arrays.asList(groupType).contains(GroupType.Both) ? "Groups / User Groups" : (Arrays.asList(
+ groupType).contains(GroupType.Groups) ? "Groups" : "User Groups")), FrameworkImage.EMAIL);
+ this.groupType = groupType;
+ }
+
+ public static Set<Artifact> getEmailGroupsAndUserGroups(User user, GroupType... groupType) throws OseeCoreException {
+ List<GroupType> groupTypes = Arrays.asList(groupType);
+ Set<Artifact> groupOptions = new HashSet<Artifact>();
+ if (groupTypes.contains(GroupType.Both) || groupTypes.contains(GroupType.Groups)) {
+ for (Artifact art : UniversalGroup.getGroups(BranchManager.getCommonBranch())) {
+ // Only add group if have read permissions
+ if (!art.getDescriptiveName().equals("Root Artifact") && AccessControlManager.checkObjectPermission(art,
+ PermissionEnum.READ)) groupOptions.add(art);
+ }
+ }
+ if (groupTypes.contains(GroupType.Both) || groupTypes.contains(GroupType.UserGroups)) {
+ for (Artifact art : ArtifactQuery.getArtifactsFromType("User Group", BranchManager.getCommonBranch())) {
+ // Only add group if have read permissions
+ if (!art.getDescriptiveName().equals("Root Artifact") && AccessControlManager.checkObjectPermission(art,
+ PermissionEnum.READ)) groupOptions.add(art);
+ }
+ }
+ return groupOptions;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ Set<Artifact> groupOptions = getEmailGroupsAndUserGroups(UserManager.getUser(), groupType);
+ UserGroupsCheckTreeDialog dialog = new UserGroupsCheckTreeDialog(groupOptions);
+ dialog.setTitle("Select Groups to Email");
+ if (dialog.open() == 0) {
+
+ Set<String> emails = new HashSet<String>();
+ for (Artifact artifact : dialog.getSelection()) {
+ if (artifact.getArtifactTypeName().equals("Universal Group")) {
+ for (Artifact userArt : artifact.getRelatedArtifacts(CoreRelationEnumeration.UNIVERSAL_GROUPING__MEMBERS)) {
+ if (userArt instanceof User) {
+ emails.add(((User) userArt).getEmail());
+ }
+ }
+ } else if (artifact.getArtifactTypeName().equals("User Group")) {
+ for (User user : artifact.getRelatedArtifacts(CoreRelationEnumeration.Users_User, User.class)) {
+ emails.add(user.getEmail());
+ }
+ }
+ }
+ if (emails.size() == 0) {
+ AWorkbench.popup("Error", "No emails configured.");
+ return;
+ }
+ Program.launch("mailto:" + org.eclipse.osee.framework.jdk.core.util.Collections.toString(";", emails));
+ AWorkbench.popup("Complete", "Configured emails openened in local email client.");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailableJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailableJob.java
new file mode 100644
index 00000000000..67c09174f7d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/EmailableJob.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.framework.ui.skynet.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail.BodyType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailableJob extends Job {
+
+ private Collection<User> notifyUsers = new HashSet<User>();
+ private Collection<String> emailAddresses = new ArrayList<String>();
+
+ /**
+ * @param name
+ */
+ public EmailableJob(String name) {
+ super(name);
+ }
+
+ /**
+ * Called by the extending job that the job is complete
+ *
+ * @param htmlBody
+ */
+ protected void notifyOfCompletion(String subject, String htmlBody) {
+ if (notifyUsers.size() > 0) {
+ try {
+ Set<String> emails = new HashSet<String>();
+ for (User user : notifyUsers)
+ emails.add(user.getEmail());
+ emails.addAll(emailAddresses);
+ OseeEmail emailMessage =
+ new OseeEmail(emails, UserManager.getUser().getEmail(), UserManager.getUser().getEmail(), subject,
+ htmlBody, BodyType.Html);
+ emailMessage.send();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Your Email Message could not be sent.", ex);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ return null;
+ }
+
+ public Collection<User> getNotifyUsers() {
+ return notifyUsers;
+ }
+
+ public void setNotifyUsers(Collection<User> notifyUsers) {
+ this.notifyUsers = notifyUsers;
+ }
+
+ public void setNotifyEmail(Collection<String> emailAddresses) {
+ this.emailAddresses = emailAddresses;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HierarchicalReportDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HierarchicalReportDialog.java
new file mode 100644
index 00000000000..30de65e34bf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HierarchicalReportDialog.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.framework.ui.skynet.util;
+
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class HierarchicalReportDialog extends SelectionDialog {
+
+ XCheckBox showAttributesCheck = new XCheckBox("Include Attributes");
+ XCheckBox recurseChildrenCheck = new XCheckBox("Recurse Children");
+ boolean recurseChildren = true;
+
+ public HierarchicalReportDialog(Shell parent) {
+ super(parent);
+ setTitle("Heirarchical Report");
+ setMessage(String.format("Select Reporting Options"));
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Composite comp = new Composite(container, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ recurseChildrenCheck.createWidgets(comp, 2);
+ recurseChildrenCheck.set(recurseChildren);
+ recurseChildrenCheck.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ recurseChildren = recurseChildrenCheck.isSelected();
+ };
+ });
+
+ return container;
+ }
+
+ public boolean isRecurseChildren() {
+ return recurseChildren;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HtmlExportTable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HtmlExportTable.java
new file mode 100644
index 00000000000..cd630d1f46b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/HtmlExportTable.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class HtmlExportTable {
+
+ private static String elementTags[] = new String[] {"th", "td"};
+ private final String title;
+ private final String html;
+ private final boolean openInSystem;
+ private final boolean popupConfirm;
+
+ /**
+ * Given html and title, export embedded table into csv file and open in system editor
+ *
+ * @param shell used to request where to save file
+ * @param title for the top of the exported file
+ * @param html html that contains table - only first table will be exported
+ * @param openInSystem true if desire to open resulting file in operating system editor upon completion
+ */
+ public HtmlExportTable(String title, String html, boolean openInSystem) {
+ this(title, html, openInSystem, true);
+ }
+
+ public HtmlExportTable(String title, String html, boolean openInSystem, boolean popupConfirm) {
+ super();
+ this.title = title;
+ this.html = html;
+ this.openInSystem = openInSystem;
+ this.popupConfirm = popupConfirm;
+ }
+
+ public Result export() {
+ if (!popupConfirm || (popupConfirm && MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
+ "Export Table", "Export Table to CSV?"))) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(title + "\n");
+ String htmlStr = AHTML.htmlToText(html);
+ Matcher m =
+ Pattern.compile("<table.*?</table>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher(
+ htmlStr);
+ if (m.find()) {
+ String csv = m.group();
+ Matcher rowM =
+ Pattern.compile("<tr.*?>(.*?)</tr>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher(
+ csv);
+ while (rowM.find()) {
+ String row = rowM.group(1);
+ row = row.replaceAll("[\n\r]*", "");
+ // Handle all the headers
+ for (String tag : elementTags) {
+ Matcher thM =
+ Pattern.compile("<" + tag + ".*?>(.*?)</" + tag + ">",
+ Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher(row);
+ String csvRow = "";
+ while (thM.find()) {
+ csvRow += "\"" + removeLeadTrailSpaces(thM.group(1)) + "\",";
+ }
+ if (!csvRow.equals("")) {
+ csvRow = csvRow.replaceFirst(",$", "\n");
+ sb.append(csvRow);
+ }
+ }
+ }
+ String path = "";
+ if (popupConfirm) {
+ FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.SAVE | SWT.SINGLE);
+ dialog.setFilterExtensions(new String[] {"*.csv"});
+ dialog.setFilterPath(System.getProperty("user.home"));
+ dialog.setFileName("table.csv");
+ path = dialog.open();
+ } else
+ path = System.getProperty("user.home") + File.separator + "table.csv";
+
+ if (path != null) {
+ try {
+ File file = new File(path);
+ Lib.writeStringToFile(sb.toString(), file);
+ if (openInSystem) Program.launch(file.getAbsolutePath());
+ return Result.TrueResult;
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ } else {
+ AWorkbench.popup("ERROR", "Can't find table in results.\n\nNothing to export");
+ }
+ }
+ return Result.FalseResult;
+ }
+
+ private String removeLeadTrailSpaces(String inStr) {
+ String str = inStr;
+ str = str.replaceAll("^ *", "");
+ str = str.replaceAll(" *$", "");
+ str = str.replaceAll("\"", "'");
+ str = str.replaceAll("\n", " ");
+ return str;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IDefineNavigateItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IDefineNavigateItem.java
new file mode 100644
index 00000000000..3c4e8360574
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IDefineNavigateItem.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.framework.ui.skynet.util;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IDefineNavigateItem {
+
+ public List<XNavigateItem> getNavigateItems();
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IOseeDictionary.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IOseeDictionary.java
new file mode 100644
index 00000000000..79bac9728a1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/IOseeDictionary.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.framework.ui.skynet.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IOseeDictionary {
+
+ public boolean isWord(String word);
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ImageCapture.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ImageCapture.java
new file mode 100644
index 00000000000..65faefb9bc4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ImageCapture.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.framework.ui.skynet.util;
+
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.ImageDialog;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ImageCapture {
+
+ final Image image;
+
+ public ImageCapture(Control control) {
+ GC gc = new GC(control.getDisplay());
+ Rectangle bounds = control.getBounds();
+ Point topLeft = control.toDisplay(0, 0);
+ image = new Image(Display.getCurrent(), bounds.width, bounds.height);
+ gc.copyArea(image, topLeft.x, topLeft.y);
+ gc.dispose();
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ public void popupDialog() {
+ ImageDialog diag = new ImageDialog(image, Display.getCurrent().getActiveShell());
+ diag.open();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/KeyEventExample.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/KeyEventExample.java
new file mode 100644
index 00000000000..4f56cfb3db9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/KeyEventExample.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.util;
+
+/**
+ * @author Donald G. Dunne
+ *
+ */
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+/*
+ * Control example snippet: print key state, code and character
+ *
+ * For a list of all SWT example snippets see
+ * http://www.eclipse.org/swt/snippets/
+ *
+ * @since 3.0
+ */
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+public class KeyEventExample {
+
+ static String stateMask(int stateMask) {
+ String string = "";
+ if ((stateMask & SWT.CTRL) != 0) string += " CTRL";
+ if ((stateMask & SWT.ALT) != 0) string += " ALT";
+ if ((stateMask & SWT.SHIFT) != 0) string += " SHIFT";
+ if ((stateMask & SWT.COMMAND) != 0) string += " COMMAND";
+ return string;
+ }
+
+ static String character(char character) {
+ switch (character) {
+ case 0:
+ return "'\\0'";
+ case SWT.BS:
+ return "'\\b'";
+ case SWT.CR:
+ return "'\\r'";
+ case SWT.DEL:
+ return "DEL";
+ case SWT.ESC:
+ return "ESC";
+ case SWT.LF:
+ return "'\\n'";
+ case SWT.TAB:
+ return "'\\t'";
+ }
+ return "'" + character + "'";
+ }
+
+ static String keyCode(int keyCode) {
+ switch (keyCode) {
+
+ /* Keyboard and Mouse Masks */
+ case SWT.ALT:
+ return "ALT";
+ case SWT.SHIFT:
+ return "SHIFT";
+ case SWT.CONTROL:
+ return "CONTROL";
+ case SWT.COMMAND:
+ return "COMMAND";
+
+ /* Non-Numeric Keypad Keys */
+ case SWT.ARROW_UP:
+ return "ARROW_UP";
+ case SWT.ARROW_DOWN:
+ return "ARROW_DOWN";
+ case SWT.ARROW_LEFT:
+ return "ARROW_LEFT";
+ case SWT.ARROW_RIGHT:
+ return "ARROW_RIGHT";
+ case SWT.PAGE_UP:
+ return "PAGE_UP";
+ case SWT.PAGE_DOWN:
+ return "PAGE_DOWN";
+ case SWT.HOME:
+ return "HOME";
+ case SWT.END:
+ return "END";
+ case SWT.INSERT:
+ return "INSERT";
+
+ /* Virtual and Ascii Keys */
+ case SWT.BS:
+ return "BS";
+ case SWT.CR:
+ return "CR";
+ case SWT.DEL:
+ return "DEL";
+ case SWT.ESC:
+ return "ESC";
+ case SWT.LF:
+ return "LF";
+ case SWT.TAB:
+ return "TAB";
+
+ /* Functions Keys */
+ case SWT.F1:
+ return "F1";
+ case SWT.F2:
+ return "F2";
+ case SWT.F3:
+ return "F3";
+ case SWT.F4:
+ return "F4";
+ case SWT.F5:
+ return "F5";
+ case SWT.F6:
+ return "F6";
+ case SWT.F7:
+ return "F7";
+ case SWT.F8:
+ return "F8";
+ case SWT.F9:
+ return "F9";
+ case SWT.F10:
+ return "F10";
+ case SWT.F11:
+ return "F11";
+ case SWT.F12:
+ return "F12";
+ case SWT.F13:
+ return "F13";
+ case SWT.F14:
+ return "F14";
+ case SWT.F15:
+ return "F15";
+
+ /* Numeric Keypad Keys */
+ case SWT.KEYPAD_ADD:
+ return "KEYPAD_ADD";
+ case SWT.KEYPAD_SUBTRACT:
+ return "KEYPAD_SUBTRACT";
+ case SWT.KEYPAD_MULTIPLY:
+ return "KEYPAD_MULTIPLY";
+ case SWT.KEYPAD_DIVIDE:
+ return "KEYPAD_DIVIDE";
+ case SWT.KEYPAD_DECIMAL:
+ return "KEYPAD_DECIMAL";
+ case SWT.KEYPAD_CR:
+ return "KEYPAD_CR";
+ case SWT.KEYPAD_0:
+ return "KEYPAD_0";
+ case SWT.KEYPAD_1:
+ return "KEYPAD_1";
+ case SWT.KEYPAD_2:
+ return "KEYPAD_2";
+ case SWT.KEYPAD_3:
+ return "KEYPAD_3";
+ case SWT.KEYPAD_4:
+ return "KEYPAD_4";
+ case SWT.KEYPAD_5:
+ return "KEYPAD_5";
+ case SWT.KEYPAD_6:
+ return "KEYPAD_6";
+ case SWT.KEYPAD_7:
+ return "KEYPAD_7";
+ case SWT.KEYPAD_8:
+ return "KEYPAD_8";
+ case SWT.KEYPAD_9:
+ return "KEYPAD_9";
+ case SWT.KEYPAD_EQUAL:
+ return "KEYPAD_EQUAL";
+
+ /* Other keys */
+ case SWT.CAPS_LOCK:
+ return "CAPS_LOCK";
+ case SWT.NUM_LOCK:
+ return "NUM_LOCK";
+ case SWT.SCROLL_LOCK:
+ return "SCROLL_LOCK";
+ case SWT.PAUSE:
+ return "PAUSE";
+ case SWT.BREAK:
+ return "BREAK";
+ case SWT.PRINT_SCREEN:
+ return "PRINT_SCREEN";
+ case SWT.HELP:
+ return "HELP";
+ }
+ return character((char) keyCode);
+ }
+
+ public static void printEvent(Event e) {
+ String string = e.type == SWT.KeyDown ? "DOWN:" : "UP :";
+ string += " stateMask=0x" + Integer.toHexString(e.stateMask) + stateMask(e.stateMask) + ",";
+ string += " keyCode=0x" + Integer.toHexString(e.keyCode) + " " + keyCode(e.keyCode) + ",";
+ string += " character=0x" + Integer.toHexString(e.character) + " " + character(e.character);
+ System.out.println(string);
+ }
+
+ public static void printEvent(String prefix, KeyEvent e) {
+ String string = prefix;
+ string += " stateMask=0x" + Integer.toHexString(e.stateMask) + stateMask(e.stateMask) + ",";
+ string += " keyCode=0x" + Integer.toHexString(e.keyCode) + " " + keyCode(e.keyCode) + ",";
+ string += " character=0x" + Integer.toHexString(e.character) + " " + character(e.character);
+ System.out.println(string);
+ }
+
+ public static void main(String[] args) {
+ Display display = new Display();
+ Shell shell = new Shell(display);
+ Listener listener = new Listener() {
+ public void handleEvent(Event e) {
+ printEvent(e);
+ }
+ };
+ shell.addListener(SWT.KeyDown, listener);
+ shell.addListener(SWT.KeyUp, listener);
+ shell.setSize(200, 200);
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+ display.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeDictionary.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeDictionary.java
new file mode 100644
index 00000000000..7a1d30a3f6a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeDictionary.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.framework.ui.skynet.util;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.styledText.IDictionary;
+import org.osgi.framework.Bundle;
+
+/**
+ * Dictionary provided by OSEE that includes all dictionarys through the OseeDictionary extension point.
+ *
+ * @author Donald G. Dunne
+ */
+public class OseeDictionary implements IDictionary {
+
+ private static Set<IOseeDictionary> dictionaries;
+ private static OseeDictionary instance = new OseeDictionary();
+
+ public static OseeDictionary getInstance() {
+ return instance;
+ }
+
+ private OseeDictionary() {
+ }
+
+ public boolean isWord(String word) {
+ // System.out.println("Lookup => \""+word+"\"");
+ if (dictionaries == null) {
+ getIDictionaries();
+ }
+ String cleanWord = getCleanWord(word);
+ if (cleanWord.equals("") || cleanWord.length() == 1) return true;
+ for (IOseeDictionary dict : dictionaries) {
+ if (dict.isWord(cleanWord)) return true;
+ }
+ return false;
+ }
+
+ // Remove any junky characters and check for acronyms and other known
+ // non-word type stuff. Return valid word to check in dictionary OR
+ // "" if there is no word in this string
+ // eg now) = now
+ // a..b = ""
+ // SQA = ""
+ // NEon = ""
+ private static Pattern pattern = Pattern.compile("^[a-zA-Z]{1}[a-z]+$");
+
+ private String getCleanWord(String w) {
+ // Single character is a valid word
+ if (w.length() == 1) return w;
+
+ // First, remove any non-word characters before and after string
+ // eg. end. (now) it!
+ w = w.replaceAll("^\\W+", "");
+ w = w.replaceAll("\\W+$", "");
+ w = w.replaceAll("'s$", ""); // Get rid of 's at end of word
+
+ // If any non-alphabetic characters still in string, not a word
+ // If string not either all lowercase or first letter capitalized, not a
+ // word
+ Matcher m = pattern.matcher(w);
+ if (!m.find()) return "";
+ return w.toLowerCase();
+ }
+
+ private static void getIDictionaries() {
+ dictionaries = new HashSet<IOseeDictionary>();
+ if (!Platform.isRunning()) return;
+ IExtensionPoint point = null;
+ try {
+ point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.ui.skynet.OseeDictionary");
+ } catch (NullPointerException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, "Can't access OseeDictionary extension point", ex);
+ return;
+ }
+ if (point == null) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access OseeDictionary extension point");
+ return;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("OseeDictionary")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ dictionaries.add((IOseeDictionary) obj);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Error loading OseeDictionary extension", ex);
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeEmail.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeEmail.java
new file mode 100644
index 00000000000..76805fff459
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeEmail.java
@@ -0,0 +1,383 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.util;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Properties;
+import java.util.logging.Level;
+import javax.activation.CommandMap;
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.activation.MailcapCommandMap;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+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.Platform;
+import org.eclipse.osee.framework.jdk.core.util.StringDataSource;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Michael A. Winston
+ * @author Donald G. Dunne
+ */
+public class OseeEmail extends MimeMessage {
+ protected static final String emailType = "mail.smtp.host";
+ protected static final String HTMLHead = "<html><body>\n";
+ protected static final String HTMLEnd = "</body></html>\n";
+
+ public static final String plainText = "text/plain";
+ public static final String HTMLText = "text/html";
+
+ private String body = null;
+ private String bodyType = null;
+ private final Multipart mainMessage;
+ public static enum BodyType {
+ Html, Text
+ };
+
+ /**
+ * Default constructor
+ */
+ public OseeEmail() {
+ super(getSession());
+ mainMessage = new MimeMultipart();
+ }
+
+ /**
+ * Constructs an AEmail with the given arguments
+ *
+ * @param toAddresses - a list of valid addresses to send the message TO
+ * @param fromAddress - the sender of the message
+ * @param replyToAddress - a valid address of who the message should reply to
+ * @param subject - the subject of the message
+ * @param textBody - the plain text of the body
+ */
+ public OseeEmail(Collection<String> toAddresses, String fromAddress, String replyToAddress, String subject, String body, BodyType bodyType) {
+ this();
+ try {
+ setRecipients(toAddresses.toArray(new String[toAddresses.size()]));
+ setFrom(fromAddress);
+ setSubject(subject);
+ setReplyTo(replyToAddress);
+
+ if (bodyType == BodyType.Text) {
+ setBody(body);
+ } else if (bodyType == BodyType.Html) {
+ setHTMLBody(body);
+ } else
+ throw new IllegalArgumentException("Unhandled body type " + bodyType);
+
+ } catch (MessagingException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * Constructs an AEmail with the given arguments
+ *
+ * @param fromToReplyEmail - recipient email, from email and replyTo email address
+ * @param subject - the subject of the message
+ * @param body - the text/html of the body
+ * @param bodyType - Html or Text
+ */
+ public OseeEmail(String fromToReplyEmail, String subject, String body, BodyType bodyType) {
+ this(Arrays.asList(fromToReplyEmail), fromToReplyEmail, fromToReplyEmail, subject, body, bodyType);
+ }
+
+ /**
+ * Adds a single address to the recipient list
+ *
+ * @param addresses - a valid address to send the message TO
+ * @throws MessagingException
+ */
+ public void addRecipients(String addresses) throws MessagingException {
+ addRecipients(Message.RecipientType.TO, addresses);
+ }
+
+ /**
+ * Adds a list of addresses to the recipient list
+ *
+ * @param addresses - a list of valid addresses to send the message TO
+ * @throws MessagingException
+ */
+ public void addRecipients(String[] addresses) throws MessagingException {
+ addRecipients(Message.RecipientType.TO, addresses);
+ }
+
+ /**
+ * Adds a list of addresses to the corresponding recipient list
+ *
+ * @param type - specifies which field the address should be put in
+ * @param addresses - a list of valid addresses to send the message
+ * @throws MessagingException
+ */
+ public void addRecipients(Message.RecipientType type, String[] addresses) throws MessagingException {
+ if (addresses != null) {
+
+ InternetAddress newAddresses[] = new InternetAddress[addresses.length];
+
+ for (int i = 0; i < addresses.length; i++) {
+ newAddresses[i] = new InternetAddress(addresses[i]);
+ }
+
+ addRecipients(type, newAddresses);
+ }
+ }
+
+ /**
+ * Sets the recipient TO field
+ *
+ * @param addresses - a valid address to send the message TO
+ * @throws MessagingException
+ */
+ public void setRecipients(String addresses) throws MessagingException {
+ setRecipients(Message.RecipientType.TO, addresses);
+ }
+
+ /**
+ * Sets a list of addresses to the recipient list
+ *
+ * @param addresses - a list of valid addresses to send the message TO
+ * @throws MessagingException
+ */
+ public void setRecipients(String[] addresses) throws MessagingException {
+ setRecipients(Message.RecipientType.TO, addresses);
+ }
+
+ /**
+ * Sets a list of addresses to the corresponding recipient list
+ *
+ * @param type - specifies which field the address should be put in
+ * @param addresses - a list of valid addresses to send the message
+ * @throws MessagingException
+ */
+ public void setRecipients(Message.RecipientType type, String[] addresses) throws MessagingException {
+ if (addresses != null) {
+
+ InternetAddress newAddresses[] = new InternetAddress[addresses.length];
+
+ for (int i = 0; i < addresses.length; i++) {
+ newAddresses[i] = new InternetAddress(addresses[i]);
+ }
+
+ setRecipients(type, newAddresses);
+ }
+ }
+
+ /**
+ * Sets the from address
+ *
+ * @param address - the user name the message is from
+ * @throws AddressException
+ * @throws MessagingException
+ */
+ // Set all the From Values
+ public void setFrom(String address) throws AddressException, MessagingException {
+ setFrom(new InternetAddress(address));
+ }
+
+ /**
+ * Sets the address to reply to (if different than the from addresss)
+ *
+ * @param address - a valid address to reply to
+ * @throws MessagingException
+ */
+ public void setReplyTo(String address) throws MessagingException {
+ InternetAddress replyAddresses[] = new InternetAddress[1];
+ replyAddresses[0] = new InternetAddress(address);
+ setReplyTo(replyAddresses);
+ }
+
+ /**
+ * Gets the current Body Type of the message. NULL if one is not selected yet.
+ *
+ * @return A String representation of the current Body Type
+ */
+ // Set the Body
+ public String getBodyType() {
+ return bodyType;
+ }
+
+ /**
+ * Sets the text in the body of the message.
+ *
+ * @param text - the text to for the body of the message
+ */
+ public void setBody(String text) {
+ body = text;
+ bodyType = plainText;
+ }
+
+ /**
+ * Adds text to the body if the Body Type is "plain". If the body doesn't exist yet, then calls setBody.
+ *
+ * @param text - the text to add to the body
+ */
+ public void addBody(String text) {
+ if (bodyType == null)
+ setBody(text);
+ else if (bodyType.equals(plainText)) body += text;
+ }
+
+ /**
+ * Sets the text in the body of the HTML message. This will already add the &lthtml&gt&ltbody&gt and
+ * &lt/body&gt&lt/html&gt tags.
+ *
+ * @param htmlText - the text for the body of the HTML message
+ */
+ public void setHTMLBody(String htmlText) {
+ bodyType = HTMLText;
+ body = HTMLHead + htmlText;
+ }
+
+ /**
+ * Adds text to the HTML body if the Body Type is "html". If the body doesn't exist yet, then calls setHTMLBody.
+ *
+ * @param htmlText - the text to add to the HTML body
+ */
+ public void addHTMLBody(String htmlText) {
+ if (bodyType == null)
+ setHTMLBody(htmlText);
+ else if (bodyType.equals(HTMLText)) body += htmlText;
+
+ }
+
+ /**
+ * Sends the message.
+ */
+ public void send() {
+ SendThread sendThread = new SendThread(this);
+ sendThread.start();
+ }
+
+ private class SendThread extends Thread {
+
+ private final OseeEmail email;
+
+ public SendThread(OseeEmail email) {
+ this.email = email;
+ }
+
+ @Override
+ public void run() {
+ super.run();
+ email.sendLocalThread();
+ }
+ }
+
+ public void sendLocalThread() {
+ MimeBodyPart messageBodyPart = new MimeBodyPart();
+ ClassLoader original = Thread.currentThread().getContextClassLoader();
+ try {
+
+ MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
+ mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
+ mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
+ mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
+ mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
+ mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
+ CommandMap.setDefaultCommandMap(mc);
+
+ // Set class loader so can find the mail handlers
+ Thread.currentThread().setContextClassLoader(
+ new ExportClassLoader(SkynetGuiPlugin.getInstance().getPackageAdmin()));
+ if (bodyType == null) {
+ bodyType = plainText;
+ body = "";
+ } else if (bodyType.equals(HTMLText)) {
+ body += HTMLEnd;
+ }
+ messageBodyPart.setContent(body, bodyType);
+ mainMessage.addBodyPart(messageBodyPart, 0);
+ setContent(mainMessage);
+ Transport.send(this);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ } finally {
+ Thread.currentThread().setContextClassLoader(original);
+ }
+ }
+
+ private static String getMailServer() {
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+
+ if (extensionRegistry == null) {
+ throw new IllegalStateException("The extension registry is unavailable");
+ }
+
+ String extensionPointId = "org.eclipse.osee.framework.jdk.core.DefaultMailServer";
+ IExtensionPoint point = extensionRegistry.getExtensionPoint(extensionPointId);
+ if (point == null) {
+ throw new IllegalArgumentException("The extension point " + extensionPointId + " does not exist");
+ }
+
+ for (IExtension extension : point.getExtensions()) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+
+ for (IConfigurationElement element : elements) {
+ return element.getAttribute("serverAddress");
+ }
+ }
+ throw new IllegalStateException(
+ "No mail server defined. Use the extension point " + extensionPointId + " to define one.");
+ }
+
+ /**
+ * Gets the current session
+ *
+ * @return the Current SMTP Session
+ */
+ private static Session getSession() {
+ Properties props = System.getProperties();
+ props.put(emailType, getMailServer());
+
+ return Session.getDefaultInstance(props, null);
+ }
+
+ /**
+ * Adds an attachment to an email
+ *
+ * @param source
+ * @param attachmentName
+ * @throws MessagingException
+ */
+ public void addAttachment(DataSource source, String attachmentName) throws MessagingException {
+ MimeBodyPart messageBodyPart = new MimeBodyPart();
+ messageBodyPart.setDataHandler(new DataHandler(source));
+ messageBodyPart.setFileName(attachmentName);
+ mainMessage.addBodyPart(messageBodyPart);
+ }
+
+ public void addAttachment(File file) throws MessagingException {
+ addAttachment(new FileDataSource(file), file.getName());
+ }
+
+ public void addAttachment(String contents, String attachmentName) throws MessagingException {
+ addAttachment(new StringDataSource(contents, attachmentName), attachmentName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeMainDictionary.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeMainDictionary.java
new file mode 100644
index 00000000000..867ccea6adc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/OseeMainDictionary.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.framework.ui.skynet.util;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OseeMainDictionary implements IOseeDictionary {
+ Set<String> dict;
+ private ArrayList<String> sortedDict;
+
+ /**
+ * @return the dict
+ */
+ public List<String> getSortedDict() {
+ return sortedDict;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.util.IOseeDictionary#isWord(java.lang.String)
+ */
+ public boolean isWord(String word) {
+ if (dict == null) loadDictionary();
+ boolean contains = dict.contains(word);
+ return contains;
+ }
+
+ private void loadDictionary() {
+ dict = new HashSet<String>();
+ String line;
+ InputStream is = null;
+ BufferedReader br = null;
+
+ // open OSEE english dictionary
+ try {
+ is = SkynetGuiPlugin.getInstance().getBundle().getEntry("support/spellCheck/AllWords.txt").openStream();
+ br = new BufferedReader(new InputStreamReader(is));
+ while ((line = br.readLine()) != null) {
+ line.replaceAll("[\t\r\n ]+$", "");
+ dict.add(line);
+ }
+ is.close();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ sortedDict = new ArrayList<String>(dict.size());
+ sortedDict.addAll(dict);
+ Collections.sort(sortedDict);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ShowAttributeAction.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ShowAttributeAction.java
new file mode 100644
index 00000000000..efbc1402f7d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/ShowAttributeAction.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.util;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.IBranchProvider;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ShowAttributeAction extends Action {
+ private AttributeCheckListDialog attributeDialog;
+ private StructuredViewer viewer;
+ private final String preferenceKey;
+ private final IBranchProvider branchProvider;
+
+ public ShowAttributeAction(IBranchProvider branchProvider, StructuredViewer viewer, String preferenceKey) {
+ super("Show Attributes", SkynetGuiPlugin.getInstance().getImageDescriptor("filter.gif"));
+ setToolTipText("Show Attributes");
+ this.viewer = viewer;
+ this.preferenceKey = preferenceKey;
+ this.branchProvider = branchProvider;
+ }
+
+ public void setViewer(StructuredViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ if (branchProvider != null && branchProvider.getBranch() != null) {
+ try {
+ attributeDialog =
+ new AttributeCheckListDialog(Display.getCurrent().getActiveShell(),
+ SkynetViews.loadAttrTypesFromPreferenceStore(preferenceKey, branchProvider.getBranch()),
+ preferenceKey, branchProvider.getBranch());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ if (attributeDialog != null) {
+ int result = attributeDialog.open();
+ if (result == 0) {
+ viewer.refresh(true);
+ }
+ }
+ }
+
+ public String getSelectedAttributeData(Artifact artifact) throws Exception {
+ return attributeDialog != null ? attributeDialog.getSelectedAttributeData(artifact) : "";
+ }
+
+ public boolean noneSelected() {
+ return attributeDialog != null ? attributeDialog.noneSelected() : false;
+ }
+
+ public Collection<AttributeType> getSelectedAttributes() {
+ return attributeDialog != null ? attributeDialog.getSelectedAttributes() : null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetDragAndDrop.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetDragAndDrop.java
new file mode 100644
index 00000000000..fd53f7327d0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetDragAndDrop.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.ui.skynet.HTMLTransferFormatter;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.HTMLTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class SkynetDragAndDrop {
+ private String viewId;
+ private DragSource source;
+ private DropTarget target;
+
+ public SkynetDragAndDrop(Control dragAndDropControl, String viewId) {
+ this(dragAndDropControl, dragAndDropControl, viewId);
+ }
+
+ /**
+ * Caller may optionally pass null for either the dragSource or dropTarget when both are not needed
+ *
+ * @param dragSource
+ * @param dropTarget
+ * @param viewId
+ */
+ public SkynetDragAndDrop(Control dragSource, Control dropTarget, String viewId) {
+ this.viewId = viewId;
+ if (dragSource != null) {
+ source = new DragSource(dragSource, DND.DROP_MOVE | DND.DROP_COPY);
+ setupDragSupport();
+ }
+ if (dropTarget != null) {
+ target = new DropTarget(dropTarget, DND.DROP_MOVE | DND.DROP_COPY);
+ setupDropSupport();
+ }
+ }
+
+ private void setupDragSupport() {
+ source.setTransfer(new Transfer[] {HTMLTransfer.getInstance(), ArtifactTransfer.getInstance(),
+ TextTransfer.getInstance()});
+ source.addDragListener(new DragSourceListener() {
+
+ public void dragFinished(DragSourceEvent event) {
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ performDataTransafer(event);
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ }
+ });
+ }
+
+ private void performDataTransafer(DragSourceEvent event) {
+ if (HTMLTransfer.getInstance().isSupportedType(event.dataType)) {
+ htmlTransferDragSetData(event);
+ } else if (ArtifactTransfer.getInstance().isSupportedType(event.dataType)) {
+ artifactTransferDragSetData(event);
+ } else if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ textTransferDragSetData(event);
+ }
+ }
+
+ private void setupDropSupport() {
+ target.setTransfer(new Transfer[] {FileTransfer.getInstance(), TextTransfer.getInstance(),
+ ArtifactTransfer.getInstance()});
+ target.addDropListener(new DropTargetAdapter() {
+
+ public void dragOperationChanged(DropTargetEvent event) {
+ operationChanged(event);
+ }
+
+ public void drop(DropTargetEvent event) {
+ performDrop(event);
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ performDragOver(event);
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ }
+ });
+ }
+
+ public void performDragOver(DropTargetEvent event) {
+ }
+
+ public void artifactTransferDragSetData(DragSourceEvent event) {
+ try {
+ if (getArtifacts() != null && getArtifacts().length > 0) {
+ event.data = new ArtifactData(getArtifacts(), "work", viewId);
+ }
+ } catch (Exception ex) {
+// OSEELog.logException(ChangeReportView.class, ex, true);
+ }
+ }
+
+ public void htmlTransferDragSetData(DragSourceEvent event) {
+ try {
+ if (getArtifacts() != null && getArtifacts().length > 0) {
+ event.data = HTMLTransferFormatter.getHtml(getArtifacts());
+ }
+ } catch (Exception ex) {
+// OSEELog.logException(ChangeReportView.class, ex, true);
+ }
+ }
+
+ public void textTransferDragSetData(DragSourceEvent event) {
+ try {
+ if (getArtifacts() != null && getArtifacts().length > 0) {
+ Artifact[] artifacts = getArtifacts();
+ Collection<String> names = new ArrayList<String>(artifacts.length);
+
+ for (Artifact artifact : artifacts)
+ names.add(artifact.getDescriptiveName());
+
+ event.data = Collections.toString(names, null, ", ", null);
+ }
+ } catch (Exception ex) {
+// OSEELog.logException(ChangeReportView.class, ex, true);
+ }
+ }
+
+ /**
+ * Override this method to supply the base class with artifacts to be used for drag and drop.
+ */
+ public abstract Artifact[] getArtifacts() throws Exception;
+
+ /**
+ * Override this method to implement the drop operation.
+ */
+ public void performDrop(DropTargetEvent event) {
+ if (event.data instanceof ArtifactData) {
+ performArtifactDrop(((ArtifactData) event.data).getArtifacts());
+ } else if (event.data instanceof String[]) {
+ performFileDrop((String[]) event.data);
+ } else if (event.data instanceof String) {
+ performTextDrop((String) event.data);
+ }
+ }
+
+ public void operationChanged(DropTargetEvent event) {
+ }
+
+ /**
+ * override this method and its cousins rather than performDrop in order to have the drop data preprocessed and
+ * passed in the desired form
+ *
+ * @param text
+ */
+ public void performTextDrop(String text) {
+
+ }
+
+ /**
+ * override this method and its cousins rather than performDrop in order to have the drop data preprocessed and
+ * passed in the desired form
+ *
+ * @param dropArtifacts
+ */
+ public void performArtifactDrop(Artifact[] dropArtifacts) {
+
+ }
+
+ /**
+ * override this method and its cousins rather than performDrop in order to have the drop data preprocessed and
+ * passed in the desired form
+ *
+ * @param fileNames
+ */
+ public void performFileDrop(String[] fileNames) {
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetGuiDebug.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetGuiDebug.java
new file mode 100644
index 00000000000..b1ba61f9bd4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetGuiDebug.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.framework.ui.skynet.util;
+
+import org.eclipse.osee.framework.ui.plugin.util.Debug;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkynetGuiDebug extends Debug {
+
+ protected String getPluginName() {
+ return "SkynetGui";
+ }
+
+ /**
+ * @param debugOn
+ * @param timeStampOn
+ * @param nameSpace
+ */
+ public SkynetGuiDebug(boolean debugOn, boolean timeStampOn, String nameSpace) {
+ super(debugOn, timeStampOn, nameSpace);
+ }
+
+ /**
+ * @param debugOn
+ * @param nameSpace
+ */
+ public SkynetGuiDebug(boolean debugOn, String nameSpace) {
+ super(debugOn, nameSpace);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetSelections.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetSelections.java
new file mode 100644
index 00000000000..8b6545d18e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetSelections.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.framework.ui.skynet.util;
+
+import java.util.Iterator;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.revision.TransactionData;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.swt.ITreeNode;
+
+/**
+ * @author Robert A. Fisher
+ */
+public final class SkynetSelections {
+
+ /*
+ * This is a utility class and should not be instantiated
+ */
+ private SkynetSelections() {
+ }
+
+ public static boolean oneBranchSelected(IStructuredSelection selection) {
+ return selection.size() == 1 && boilDownObject(selection.getFirstElement()) instanceof Branch;
+ }
+
+ public static boolean oneDescendantBranchSelected(IStructuredSelection selection) throws OseeCoreException {
+ Object object = boilDownObject(selection.getFirstElement());
+ return selection.size() == 1 && object instanceof Branch && ((Branch) object).hasParentBranch();
+ }
+
+ public static boolean oneTransactionSelected(IStructuredSelection selection) {
+ return selection.size() == 1 && boilDownObject(selection.getFirstElement()) instanceof TransactionId;
+ }
+
+ public static boolean transactionsSelected(IStructuredSelection selection) {
+ if (!selection.isEmpty()) {
+ Iterator<?> iter = selection.iterator();
+ while (iter.hasNext()) {
+ Object object = iter.next();
+ if (!(boilDownObject(object) instanceof TransactionData)) {
+ return false;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean twoTransactionsSelectedOnSameBranch(IStructuredSelection selection) throws OseeCoreException {
+ if (selection.size() == 2) {
+ Iterator<?> iter = selection.iterator();
+ Object obj1 = boilDownObject(iter.next());
+ Object obj2 = boilDownObject(iter.next());
+
+ return obj1 instanceof TransactionData && obj2 instanceof TransactionData && ((TransactionData) obj1).getTransactionId().getBranch() == ((TransactionData) obj2).getTransactionId().getBranch();
+ }
+
+ return false;
+ }
+
+ public static Object boilDownObject(Object object) {
+ while (object instanceof ITreeNode) {
+ object = ((ITreeNode) object).getBackingData();
+ }
+
+ return object;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetViews.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetViews.java
new file mode 100644
index 00000000000..8d693d1901c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/SkynetViews.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.framework.ui.skynet.util;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class SkynetViews {
+
+ private static final String MEMENTO_SOURCE_GUID = "sourceDbGuid";
+
+ public static boolean isSourceValid(IMemento memento) {
+ boolean result = false;
+ if (memento != null) {
+ String dbId = memento.getString(MEMENTO_SOURCE_GUID);
+ if (Strings.isValid(dbId)) {
+ String currentDbId = null;
+ try {
+ currentDbId = OseeInfo.getValue("osee.db.guid");
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Unable to set memento source db guid");
+ }
+ if (dbId.equals(currentDbId)) {
+ result = true;
+ }
+ }
+ }
+ return result;
+ }
+
+ public static void addDatabaseSourceId(IMemento memento) {
+ if (memento != null) {
+ try {
+ memento.putString(MEMENTO_SOURCE_GUID, OseeInfo.getValue("osee.db.guid"));
+ } catch (OseeDataStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Unable to set memento source db guid");
+ }
+ }
+ }
+
+ public static void closeView(final String viewId, final String secondaryId) {
+ if (Strings.isValid(viewId)) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null) {
+ IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+ if (workbenchWindow != null) {
+ IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+ if (workbenchPage != null) {
+ workbenchPage.hideView(workbenchPage.findViewReference(viewId, secondaryId));
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * @param memento
+ * @return Returns a collection of <code>DynamicAttributeDescriptor</code> stored in a memento.
+ * @throws OseeDataStoreException
+ */
+ public static List<AttributeType> loadAttrTypesFromPreferenceStore(String preferenceKey, Branch branch) throws OseeCoreException {
+ List<AttributeType> attributeDescriptors = new LinkedList<AttributeType>();
+ Collection<AttributeType> descriptors = TypeValidityManager.getValidAttributeTypes(branch);
+
+ IPreferenceStore preferenceStore = SkynetGuiPlugin.getInstance().getPreferenceStore();
+ for (String attributeType : preferenceStore.getString(preferenceKey).split("\\|")) {
+ for (AttributeType descriptor : descriptors) {
+ if (attributeType.equals(descriptor.getName())) {
+ attributeDescriptors.add(descriptor);
+ break;
+ }
+ }
+ }
+
+ return attributeDescriptors;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/TransactionIdLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/TransactionIdLabelProvider.java
new file mode 100644
index 00000000000..bfbb62c6c45
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/TransactionIdLabelProvider.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.framework.ui.skynet.util;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TransactionIdLabelProvider extends LabelProvider {
+
+ public TransactionIdLabelProvider() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ return ((TransactionId) element).toString() + " - " + ((TransactionId) element).getComment();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/WordUiUtil.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/WordUiUtil.java
new file mode 100644
index 00000000000..96103323b09
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/WordUiUtil.java
@@ -0,0 +1,82 @@
+/*
+ * Created on Jun 5, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.framework.ui.skynet.util;
+
+import java.util.Collection;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Megumi Telles
+ */
+public class WordUiUtil {
+
+ public static void displayWarningMessageDialog(final String title, final String message) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ MessageDialog.openWarning(Display.getCurrent().getActiveShell(), title, message);
+ }
+ }, true);
+ }
+
+ public static void displayTrackedChangesOnArtifacts(final Collection<Artifact> artifacts) {
+ if (!artifacts.isEmpty()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ XResultData rd = new XResultData();
+ rd.logWarning("\nYou chose to diff changes and the following Artifacts were detected to have tracked changes on.");
+ rd.log("Please make sure to accept/reject all tracked changes and comment references.\n");
+ rd.addRaw(AHTML.beginMultiColumnTable(60, 1));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"Artifact Name", "HRID"}));
+ for (Artifact artifact : artifacts)
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {artifact.toString(),
+ XResultData.getHyperlink(artifact)}));
+ rd.addRaw(AHTML.endMultiColumnTable());
+ try {
+ rd.report("Artifacts With Tracked Changes");
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ }
+
+ public static void displayUnhandledArtifacts(final Collection<Artifact> artifacts) {
+ if (!artifacts.isEmpty()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ XResultData rd = new XResultData();
+ rd.logWarning("\nYou chose to preview/edit artifacts that could not be handled\n");
+ rd.addRaw(AHTML.beginMultiColumnTable(60, 1));
+ rd.addRaw(AHTML.addHeaderRowMultiColumnTable(new String[] {"Artifact Name", "HRID"}));
+ for (Artifact artifact : artifacts)
+ rd.addRaw(AHTML.addRowMultiColumnTable(new String[] {artifact.toString(),
+ XResultData.getHyperlink(artifact)}));
+ rd.addRaw(AHTML.endMultiColumnTable());
+ try {
+ rd.report("Unhandled Artifacts");
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/backup/BackupBranchesJob.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/backup/BackupBranchesJob.java
new file mode 100644
index 00000000000..3a39bc96b5c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/backup/BackupBranchesJob.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.framework.ui.skynet.util.backup;
+
+import java.io.File;
+import java.util.Collection;
+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.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.jdk.core.util.io.Zip;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage;
+import org.eclipse.osee.framework.ui.skynet.util.EmailableJob;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class BackupBranchesJob extends EmailableJob {
+
+ public static String JOB_NAME = "Backup OSEE Database";
+ XResultData rd;
+ private final String path;
+ private final Collection<Branch> branches;
+
+ /**
+ * @param name
+ */
+ public BackupBranchesJob(Collection<Branch> branches, String path, XResultData rd) {
+ super(JOB_NAME);
+ this.branches = branches;
+ this.path = path;
+ if (rd != null)
+ this.rd = rd;
+ else
+ this.rd = new XResultData();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ backup(branches);
+ if (rd.toString().equals("")) rd.log("No Problems Found");
+ rd.report(getName());
+ XResultPage page = rd.getReport(getName());
+
+ notifyOfCompletion(JOB_NAME, page.getManipulatedHtml());
+ monitor.done();
+ return Status.OK_STATUS;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return new Status(Status.ERROR, SkynetGuiPlugin.PLUGIN_ID, -1, "Failed", ex);
+ }
+ }
+
+ public void backup(Collection<Branch> branches) {
+ XResultData rd = new XResultData();
+ try {
+ rd = new XResultData();
+ rd.log(getName());
+ rd.log("Starting OSEE DB Backup - " + XDate.getDateNow());
+ for (Branch branch : branches) {
+ rd.log("Backing up \"" + branch.getBranchShortName() + "\" - " + XDate.getDateNow());
+ String backupName = StringFormat.truncate(branch.getBranchName(), 25);
+ backupName = backupName.replaceAll("\\W+", "_");
+ File xmlFile =
+ new File(
+ path + "/OSEE_Branch_Backup__" + XDate.getDateNow("yyyy_MM_dd_HH_MM__") + backupName + ".xml");
+ if (xmlFile != null) {
+ throw new UnsupportedOperationException("Export from client is not supported");
+ // Job job = new ExportBranchJob(xmlFile, branch, false);
+ // job.setUser(true);
+ // job.setPriority(Job.LONG);
+ // job.schedule();
+ // try {
+ // job.join();
+ // } catch (InterruptedException ex) {
+ // OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ // rd.logError(ex.getLocalizedMessage());
+ // }
+ }
+ rd.log("Zipping up \"" + branch.getBranchShortName() + "\" - " + XDate.getDateNow());
+ Zip.zip(new String[] {xmlFile.getAbsolutePath()}, xmlFile.getAbsolutePath().replaceFirst(".xml", ".zip"));
+ // Delete backup file
+ xmlFile.delete();
+ rd.log("Finished with \"" + branch.getBranchShortName() + "\" - " + XDate.getDateNow());
+ }
+ rd.log("Completed - " + XDate.getDateNow());
+ rd.report(getName());
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ rd.logError(ex.getLocalizedMessage());
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailGroup.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailGroup.java
new file mode 100644
index 00000000000..b72c88d32a4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailGroup.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.framework.ui.skynet.util.email;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailGroup {
+
+ private final String groupName;
+ private ArrayList<String> emails = new ArrayList<String>();
+
+ public EmailGroup(String groupName, Collection<String> emails) {
+ this.groupName = groupName;
+ for (String s : emails)
+ this.emails.add(s);
+ }
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+ public String toString() {
+ return groupName;
+ }
+
+ public ArrayList<String> getEmails() {
+ return emails;
+ }
+
+ public void setEmails(ArrayList<String> emails) {
+ this.emails = emails;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizard.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizard.java
new file mode 100644
index 00000000000..285d711ecb1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizard.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.framework.ui.skynet.util.email;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import javax.mail.Message;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail;
+import org.eclipse.osee.framework.ui.skynet.util.OseeEmail.BodyType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailWizard extends Wizard {
+ private EmailWizardPage wizardPage;
+ private String htmlMessage = null;
+ private String subject = null;
+ private ArrayList<EmailGroup> emailableGroups;
+ private ArrayList<Object> initialAddress = null;
+
+ public EmailWizard() {
+ super();
+ }
+
+ /**
+ * @param htmlMessage
+ * @param subject
+ * @param emailableFields
+ * @param initialAddress - User, AtsEmailGroup or String
+ */
+ public EmailWizard(String htmlMessage, String subject, ArrayList<EmailGroup> emailableFields, ArrayList<Object> initialAddress) {
+ this.htmlMessage = htmlMessage;
+ this.subject = subject;
+ this.emailableGroups = emailableFields;
+ this.initialAddress = initialAddress;
+ }
+
+ @Override
+ public void addPages() {
+ wizardPage = new EmailWizardPage("Page1", emailableGroups, initialAddress);
+ addPage(wizardPage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ try {
+ OseeEmail emailMessage =
+ new OseeEmail(Arrays.asList(wizardPage.getToAddresses()), UserManager.getUser().getEmail(),
+ UserManager.getUser().getEmail(), subject, "", BodyType.Html);
+ emailMessage.setRecipients(Message.RecipientType.CC, wizardPage.getCcAddresses());
+ emailMessage.setRecipients(Message.RecipientType.BCC, wizardPage.getBccAddresses());
+ String otherText = wizardPage.getText();
+ if (!otherText.equals("")) emailMessage.setHTMLBody("<p>" + AHTML.textToHtml(wizardPage.getText()) + "</p><p>--------------------------------------------------------</p>");
+ // Remove hyperlinks cause they won't work in email.
+ emailMessage.addHTMLBody(htmlMessage);
+ emailMessage.send();
+ } catch (Exception e) {
+ MessageDialog.openInformation(null, "Message Could Not Be Sent",
+ "Your Email Message could not be sent.\n\n" + e.getLocalizedMessage());
+
+ // e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+
+ public void setEmailableGroups(ArrayList<EmailGroup> emailableGroups) {
+ this.emailableGroups = emailableGroups;
+ }
+
+ public void setHtmlMessage(String htmlMessage) {
+ this.htmlMessage = htmlMessage;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public ArrayList<Object> getInitialAddress() {
+ return initialAddress;
+ }
+
+ public void setInitialAddress(ArrayList<Object> initialAddress) {
+ this.initialAddress = initialAddress;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizardPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizardPage.java
new file mode 100644
index 00000000000..c78dd4642d7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/email/EmailWizardPage.java
@@ -0,0 +1,314 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.util.email;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEEFilteredTree;
+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.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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EmailWizardPage extends WizardPage {
+ private Text text;
+ private final ArrayList<Object> initialAddress;
+ private OSEEFilteredTree namesList;
+ private ListViewer toList;
+ private ListViewer ccList;
+ private ListViewer bccList;
+
+ private final static String separator = "===============";
+ private final ArrayList<EmailGroup> groups;
+
+ /**
+ * @param pageName
+ * @param groups
+ * @param initialAddress User, EmailGroup or String
+ */
+ protected EmailWizardPage(String pageName, ArrayList<EmailGroup> groups, ArrayList<Object> initialAddress) {
+ super(pageName);
+ this.groups = groups;
+ this.initialAddress = initialAddress;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void createControl(Composite parent) {
+ setTitle("Email Action");
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gl = new GridLayout();
+ gl.numColumns = 2;
+ composite.setLayout(gl);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ composite.setLayoutData(gd);
+
+ Composite namesComp = new Composite(composite, SWT.NONE);
+ namesComp.setLayout(new GridLayout());
+ gd = new GridData(GridData.FILL_VERTICAL);
+ namesComp.setLayoutData(gd);
+
+ // Fill names array
+ ArrayList<Object> names = new ArrayList<Object>();
+ if (groups != null) {
+ names.addAll(groups);
+ if (groups.size() > 0) names.add(separator);
+ }
+
+ try {
+ names.addAll(UserManager.getUsers());
+ names.remove(UserManager.getUser(SystemUser.UnAssigned));
+ names.remove(UserManager.getUser(SystemUser.OseeSystem));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ names.add(ex.getLocalizedMessage());
+ }
+
+ namesList = new OSEEFilteredTree(namesComp);
+ namesList.getViewer().setContentProvider(new ArrayTreeContentProvider());
+ namesList.getViewer().setLabelProvider(new NamesLabelProvider());
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 75;
+ namesList.getViewer().getTree().setLayoutData(gd);
+ namesList.getViewer().getTree().setLinesVisible(false);
+ namesList.getViewer().setInput(names);
+ namesList.getViewer().getTree().addListener(SWT.MouseDoubleClick, new Listener() {
+ public void handleEvent(Event event) {
+ if (event.button == 1) {
+ IStructuredSelection sel = (IStructuredSelection) namesList.getViewer().getSelection();
+ Object obj = sel.getFirstElement();
+ if ((obj instanceof String) && ((String) obj).equals(separator)) return;
+ toList.add(sel.getFirstElement());
+ }
+ }
+ });
+ namesList.getViewer().setSorter(new ViewerSorter() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof EmailGroup && !(e2 instanceof EmailGroup)) {
+ return -1;
+ } else if (e2 instanceof EmailGroup && !(e1 instanceof EmailGroup)) {
+ return 1;
+ }
+ return getComparator().compare(e1.toString(), e2.toString());
+ }
+ });
+ Composite toComp = new Composite(composite, SWT.NONE);
+ gl = new GridLayout();
+ gl.numColumns = 2;
+ toComp.setLayout(gl);
+ gd = new GridData(GridData.FILL_BOTH);
+ toComp.setLayoutData(gd);
+
+ // Empty label to take up left column
+ Label label = new Label(toComp, SWT.NONE);
+ label = new Label(toComp, SWT.NONE);
+ label.setText("(select and right-click to delete)");
+
+ Button b = new Button(toComp, SWT.NONE);
+ b.setText("To-> ");
+ b.setSize(1000, 5);
+ b.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ widgetDefaultSelected(e);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ IStructuredSelection sel = (IStructuredSelection) namesList.getViewer().getSelection();
+ for (Object obj : sel.toList())
+ toList.add(obj);
+ }
+ });
+
+ toList = new ListViewer(toComp);
+ toList.setContentProvider(new ArrayContentProvider());
+ toList.setLabelProvider(new NamesLabelProvider());
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 50;
+ toList.getList().setLayoutData(gd);
+ if (initialAddress != null) toList.setInput(initialAddress);
+ toList.getList().setMenu(getDeletePopup(toList));
+
+ b = new Button(toComp, SWT.NONE);
+ b.setText(" Cc-> ");
+ b.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ widgetDefaultSelected(e);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ IStructuredSelection sel = (IStructuredSelection) namesList.getViewer().getSelection();
+ for (Object obj : sel.toList())
+ ccList.add(obj);
+ }
+ });
+
+ ccList = new ListViewer(toComp);
+ ccList.setContentProvider(new ArrayContentProvider());
+ ccList.setLabelProvider(new NamesLabelProvider());
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 20;
+ ccList.getList().setLayoutData(gd);
+ ccList.getList().setMenu(getDeletePopup(ccList));
+
+ b = new Button(toComp, SWT.NONE);
+ b.setText(" Bcc-> ");
+ b.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ widgetDefaultSelected(e);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ IStructuredSelection sel = (IStructuredSelection) namesList.getViewer().getSelection();
+ for (Object obj : sel.toList())
+ bccList.add(obj);
+ }
+ });
+
+ bccList = new ListViewer(toComp);
+ bccList.setContentProvider(new ArrayContentProvider());
+ bccList.setLabelProvider(new NamesLabelProvider());
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 20;
+ bccList.getList().setLayoutData(gd);
+ bccList.getList().setMenu(getDeletePopup(bccList));
+ try {
+ bccList.setInput(new Object[] {UserManager.getUser().getEmail()});
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ // Additional Text
+ Label l = new Label(composite, SWT.NONE);
+ l.setText("Additional Text:");
+ gd = new GridData();
+ gd.horizontalSpan = 2;
+ l.setLayoutData(gd);
+
+ text = new Text(composite, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 2;
+ gd.heightHint = 75;
+ text.setLayoutData(gd);
+
+ setControl(composite);
+ }
+
+ private Menu getDeletePopup(ListViewer listView) {
+ Menu previewMenu = new Menu(listView.getControl());
+ MenuItem item = new MenuItem(previewMenu, SWT.CASCADE);
+ item.setText("Delete");
+ final ListViewer fListView = listView;
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection sel = (IStructuredSelection) fListView.getSelection();
+ for (Object obj : sel.toList())
+ fListView.remove(obj);
+ }
+ });
+
+ return previewMenu;
+ }
+
+ public String[] getToAddresses() throws OseeCoreException {
+ return getEmails(toList);
+ }
+
+ public String[] getCcAddresses() throws OseeCoreException {
+ return getEmails(ccList);
+ }
+
+ public String[] getBccAddresses() throws OseeCoreException {
+ return getEmails(bccList);
+ }
+
+ public String[] getEmails(ListViewer list) throws OseeCoreException {
+
+ ArrayList<String> emails = new ArrayList<String>();
+ for (int x = 0; x < list.getList().getItemCount(); x++) {
+ Object obj = list.getElementAt(x);
+ if (obj instanceof User)
+ emails.add(((User) obj).getEmail());
+ else if (obj instanceof String)
+ emails.add(((String) obj));
+ else if (obj instanceof EmailGroup) emails.addAll(((EmailGroup) obj).getEmails());
+ }
+ return emails.toArray(new String[emails.size()]);
+ }
+
+ public String getText() {
+ return text.getText();
+ }
+
+ public class NamesLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object element) {
+ if (element instanceof User)
+ return ((User) element).getName();
+ else if (element instanceof EmailGroup)
+ return ((EmailGroup) element).toString();
+ else if (element instanceof String) return ((String) element).toString();
+ return "";
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTree.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTree.java
new file mode 100644
index 00000000000..817ffb29ae5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTree.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.framework.ui.skynet.util.filteredTree;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OSEECheckedFilteredTree extends OSEEFilteredTree {
+
+ private final Set<Object> checked = new HashSet<Object>();
+
+ /**
+ * @param parent
+ * @param treeStyle
+ * @param filter
+ */
+ public OSEECheckedFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.FilteredTree#createTreeControl(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected Control createTreeControl(Composite parent, int style) {
+ Control control = super.createTreeControl(parent, style);
+ getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ storeResults(treeViewer.getTree().getItems());
+ }
+ });
+ getFilterControl().addModifyListener(new ModifyListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
+ */
+ @Override
+ public void modifyText(ModifyEvent e) {
+ restoreChecked(treeViewer.getTree().getItems());
+ }
+ });
+ getViewer().getTree().addPaintListener(new PaintListener() {
+
+ @Override
+ public void paintControl(PaintEvent e) {
+ restoreChecked(treeViewer.getTree().getItems());
+ }
+ });
+ return control;
+ }
+
+ public void setInitalChecked(Collection<? extends Object> checked) {
+ this.checked.addAll(checked);
+ restoreChecked(treeViewer.getTree().getItems());
+ for (Object obj : checked) {
+ treeViewer.reveal(obj);
+ }
+ }
+
+ public void clearChecked() {
+ this.checked.clear();
+ restoreChecked(treeViewer.getTree().getItems());
+ }
+
+ private void restoreChecked(TreeItem treeItems[]) {
+ for (TreeItem treeItem : treeItems) {
+ if (treeItem.getChecked() && !checked.contains(treeItem.getData())) {
+ // System.out.println("Unchecked " + treeItem.getData());
+ treeItem.setChecked(false);
+ } else if (!treeItem.getChecked() && checked.contains(treeItem.getData())) {
+ // System.out.println("Checked " + treeItem.getData());
+ treeItem.setChecked(true);
+ }
+ restoreChecked(treeItem.getItems());
+ }
+ }
+
+ private void storeResults(TreeItem treeItems[]) {
+ for (TreeItem treeItem : treeItems) {
+ if (treeItem.getChecked() && !checked.contains(treeItem.getData())) {
+ // System.out.println("Added " + treeItem.getData());
+ checked.add(treeItem.getData());
+ } else if (!treeItem.getChecked() && checked.contains(treeItem.getData())) {
+ // System.out.println("Removed " + treeItem.getData());
+ checked.remove(treeItem.getData());
+ }
+ storeResults(treeItem.getItems());
+ }
+ }
+
+ /**
+ * @return the selected
+ */
+ public Set<Object> getChecked() {
+ return checked;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTreeDialog.java
new file mode 100644
index 00000000000..4ce74a51cee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEECheckedFilteredTreeDialog.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.framework.ui.skynet.util.filteredTree;
+
+import java.util.Collection;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactNameSorter;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+public abstract class OSEECheckedFilteredTreeDialog extends MessageDialog {
+
+ protected Label statusLabel;
+ private Button okButton;
+ private OSEECheckedFilteredTree treeViewer;
+ private final PatternFilter patternFilter;
+ private Object input;
+ private final IContentProvider contentProvider;
+ private final IBaseLabelProvider labelProvider;
+ private Collection<? extends Object> initialSelections;
+
+ public OSEECheckedFilteredTreeDialog(String dialogTitle, String dialogMessage, PatternFilter patternFilter, IContentProvider contentProvider, IBaseLabelProvider labelProvider) {
+ super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.NONE, new String[] {
+ "OK", "Cancel"}, 0);
+ this.contentProvider = contentProvider;
+ this.labelProvider = labelProvider;
+ this.patternFilter = patternFilter;
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ protected void createPreCustomArea(Composite parent) {
+ }
+
+ /**
+ * Sets the input. Convenience method.
+ *
+ * @param object the input.
+ */
+ public final void setInput(Object input) {
+ this.input = input;
+ if (treeViewer != null) treeViewer.getViewer().setInput(input);
+ }
+
+ /**
+ * Sets the initial selection. Convenience method.
+ *
+ * @param object the initial selection.
+ */
+ public void setInitialSelections(Collection<? extends Object> initialSelections) {
+ this.initialSelections = initialSelections;
+ if (treeViewer != null) {
+ treeViewer.setInitalChecked(initialSelections);
+ }
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ statusLabel = new Label(parent, SWT.NONE);
+ statusLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ updateStatusLabel();
+
+ createPreCustomArea(parent);
+
+ Composite aiComp = new Composite(parent, SWT.NONE);
+ aiComp.setLayout(ALayout.getZeroMarginLayout());
+ aiComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ treeViewer =
+ new OSEECheckedFilteredTree(aiComp,
+ SWT.MULTI | SWT.CHECK | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter);
+ treeViewer.getViewer().getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.getViewer().setContentProvider(contentProvider);
+ treeViewer.getViewer().setLabelProvider(labelProvider);
+ treeViewer.getViewer().setSorter(new ArtifactNameSorter());
+ treeViewer.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateStatusLabel();
+ }
+ });
+ if (input != null) treeViewer.getViewer().setInput(input);
+ if (initialSelections != null) treeViewer.setInitalChecked(initialSelections);
+ return parent;
+ }
+
+ protected void updateStatusLabel() {
+ Result result = isComplete();
+ if (result.isFalse())
+ statusLabel.setText(result.getText());
+ else
+ statusLabel.setText("");
+ statusLabel.getParent().layout();
+ updateButtons();
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ okButton.setEnabled(false);
+ return c;
+ }
+
+ protected Result isComplete() {
+ return Result.TrueResult;
+ }
+
+ private void updateButtons() {
+ if (okButton != null) okButton.setEnabled(isComplete().isTrue());
+ }
+
+ /**
+ * @return the treeViewer
+ */
+ public OSEECheckedFilteredTree getTreeViewer() {
+ return treeViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTree.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTree.java
new file mode 100644
index 00000000000..eafe15a5607
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTree.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.framework.ui.skynet.util.filteredTree;
+
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+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.swt.widgets.Label;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OSEEFilteredTree extends FilteredTree {
+
+ public OSEEFilteredTree(Composite parent) {
+ this(parent, SWT.BORDER | SWT.MULTI, new PatternFilter());
+ }
+
+ /**
+ * @param parent
+ * @param treeStyle
+ * @param filter
+ */
+ public OSEEFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+ setInitialText("");
+ }
+
+ @Override
+ protected Composite createFilterControls(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(ALayout.getZeroMarginLayout(3, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ (new Label(comp, SWT.NONE)).setText("Filter: ");
+ super.createFilterControls(comp);
+
+ return comp;
+ }
+
+ @Override
+ protected void createFilterText(Composite parent) {
+ super.createFilterText(parent);
+ filterText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ filterText.setFocus();
+ }
+
+ public void keyReleased(KeyEvent e) {
+ filterText.setFocus();
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTreeDialog.java
new file mode 100644
index 00000000000..6a0be187bd8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/filteredTree/OSEEFilteredTreeDialog.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.framework.ui.skynet.util.filteredTree;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+public abstract class OSEEFilteredTreeDialog extends MessageDialog {
+
+ protected Label statusLabel;
+ private Button okButton;
+ private OSEEFilteredTree treeViewer;
+ private final PatternFilter patternFilter;
+ private boolean checkTree = true;
+ private boolean multiSelect = true;
+
+ public OSEEFilteredTreeDialog(String dialogTitle, String dialogMessage, PatternFilter patternFilter) {
+ super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.NONE, new String[] {
+ "OK", "Cancel"}, 0);
+ this.patternFilter = patternFilter;
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ protected void createPreCustomArea(Composite parent) {
+ }
+
+ /**
+ * Sets the input. Convenience method.
+ *
+ * @param object the input.
+ */
+ public final void setInput(Object input) throws Exception {
+ getTreeViewer().getViewer().setInput(input);
+ }
+
+ /**
+ * Sets the initial selection. Convenience method.
+ *
+ * @param object the initial selection.
+ */
+ public void setInitialSelections(Object object) {
+ getTreeViewer().getViewer().setSelection(new StructuredSelection(object), true);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ statusLabel = new Label(parent, SWT.NONE);
+ statusLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ updateStatusLabel();
+
+ createPreCustomArea(parent);
+
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(ALayout.getZeroMarginLayout());
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ treeViewer =
+ new OSEECheckedFilteredTree(
+ comp,
+ (multiSelect ? SWT.MULTI : SWT.SINGLE) | (isCheckTree() ? SWT.CHECK : SWT.NONE) | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER,
+ patternFilter);
+ treeViewer.getViewer().getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ treeViewer.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateStatusLabel();
+ }
+ });
+ return parent;
+ }
+
+ protected void updateStatusLabel() {
+ Result result = isComplete();
+ if (result.isFalse())
+ statusLabel.setText(result.getText());
+ else
+ statusLabel.setText("");
+ statusLabel.getParent().layout();
+ updateButtons();
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ okButton.setEnabled(false);
+ return c;
+ }
+
+ protected Result isComplete() {
+ return Result.TrueResult;
+ }
+
+ private void updateButtons() {
+ if (okButton != null) okButton.setEnabled(isComplete().isTrue());
+ }
+
+ /**
+ * @return the treeViewer
+ */
+ public OSEEFilteredTree getTreeViewer() {
+ return treeViewer;
+ }
+
+ /**
+ * @return the isCheckTree
+ */
+ public boolean isCheckTree() {
+ return checkTree;
+ }
+
+ /**
+ * @param isCheckTree the isCheckTree to set
+ */
+ public void setCheckTree(boolean checkTree) {
+ this.checkTree = checkTree;
+ }
+
+ /**
+ * @return the isMultiSelect
+ */
+ public boolean isMultiSelect() {
+ return multiSelect;
+ }
+
+ /**
+ * @param isMultiSelect the isMultiSelect to set
+ */
+ public void setMultiSelect(boolean multiSelect) {
+ this.multiSelect = multiSelect;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/Matrix.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/Matrix.java
new file mode 100644
index 00000000000..154e318bb8e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/Matrix.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.framework.ui.skynet.util.matrix;
+
+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 org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+
+/**
+ * Creates HTML matrix
+ *
+ * @author Donald G. Dunne
+ */
+public class Matrix {
+ private String title;
+ private final ArrayList<MatrixItem> items;
+ private Map<String, MatrixItem> nameToItem = new HashMap<String, MatrixItem>();
+ private Set<String> values = new HashSet<String>();
+ private Map<String, Set<String>> nameToValues = new HashMap<String, Set<String>>();
+ // Names with no values will be listed at the bottom of the report so they don't take up space
+ private Set<String> noValueNames = new HashSet<String>();
+ private boolean useNameAsMark = false;
+ private IProgressMonitor monitor;
+
+ public Matrix(String title, ArrayList<MatrixItem> items) {
+ this.title = title;
+ this.items = items;
+ }
+
+ public String getMatrix() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.heading(3, title));
+ sb.append(getMatrixBody());
+ return sb.toString();
+ }
+
+ private void processData() {
+ for (MatrixItem item : items) {
+ nameToItem.put(item.getName(), item);
+ values.addAll(item.getValues());
+ if (nameToValues.containsKey(item.getName())) {
+ Set<String> vals = nameToValues.get(item.getName());
+ vals.addAll(item.getValues());
+ nameToValues.remove(item.getName());
+ nameToValues.put(item.getName(), vals);
+ } else
+ nameToValues.put(item.getName(), item.getValues());
+ }
+ }
+
+ private String getMatrixBody() {
+ processData();
+ StringBuilder sb = new StringBuilder();
+ sb.append(AHTML.beginMultiColumnTable(100, 1));
+ // Determine all the names to deal with
+ Set<String> names = new HashSet<String>();
+ // Don't want to take up valuable table space with names that have no values; keep track
+ // of them and print them at the end of the report
+ for (String name : nameToItem.keySet()) {
+ System.out.println("nameToValues.get(name) *" + nameToValues.get(name) + "*");
+ if (nameToValues.get(name) == null || nameToValues.get(name).size() == 0)
+ noValueNames.add(name);
+ else
+ names.add(name);
+ }
+ // Create sortedNames for use in looping through
+ String[] sortedNames = names.toArray(new String[names.size()]);
+ Arrays.sort(sortedNames);
+ // Create headerNames with one more field due to value name column
+ names.add(" ");
+ String[] headerNames = names.toArray(new String[names.size()]);
+ Arrays.sort(headerNames);
+ // Add header names to table
+ sb.append(AHTML.addHeaderRowMultiColumnTable(headerNames));
+ int x = 1;
+ // Create sorted list of values
+ String[] sortedValues = values.toArray(new String[values.size()]);
+ Arrays.sort(sortedValues);
+ for (String value : sortedValues) {
+ String str = String.format("Processing %s/%s \"%s\"", x++ + "", values.size(), value);
+ System.out.println(str);
+ if (monitor != null) monitor.subTask(str);
+ List<String> marks = new ArrayList<String>();
+ marks.add(value);
+ for (String name : sortedNames) {
+ if (nameToValues.get(name) != null && nameToValues.get(name).contains(value))
+ marks.add(useNameAsMark ? name : "X");
+ else
+ marks.add(".");
+ }
+ String[] colOptions = new String[marks.size()];
+ int i = 0;
+ colOptions[i] = "";
+ for (i = 1; i < marks.size(); i++)
+ colOptions[i] = " align=center";
+ sb.append(AHTML.addRowMultiColumnTable(marks.toArray(new String[marks.size()]), colOptions));
+ }
+ sb.append(AHTML.endMultiColumnTable());
+ if (noValueNames.size() > 0) {
+ sb.append(AHTML.newline(2) + AHTML.bold("Items with no values: "));
+ String[] sortedItems = noValueNames.toArray(new String[noValueNames.size()]);
+ Arrays.sort(sortedItems);
+ for (String str : sortedItems)
+ sb.append(AHTML.newline() + str);
+ sb.append(AHTML.newline());
+ }
+ return sb.toString();
+ }
+
+ /**
+ * @return Returns the useNameAsMark.
+ */
+ public boolean isUseNameAsMark() {
+ return useNameAsMark;
+ }
+
+ /**
+ * @param useNameAsMark The useNameAsMark to set.
+ */
+ public void setUseNameAsMark(boolean useNameAsMark) {
+ this.useNameAsMark = useNameAsMark;
+ }
+
+ public IProgressMonitor getMonitor() {
+ return monitor;
+ }
+
+ public void setMonitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/MatrixItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/MatrixItem.java
new file mode 100644
index 00000000000..176004a4e54
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/util/matrix/MatrixItem.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.framework.ui.skynet.util.matrix;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MatrixItem {
+
+ private String name;
+ private Set<String> values = new HashSet<String>();
+
+ public MatrixItem() {
+ this("Unset", null);
+ }
+
+ public MatrixItem(String name) {
+ this(name, null);
+ }
+
+ public void addValues(Collection<String> values) {
+ this.values.addAll(values);
+ }
+
+ public void addValue(String value) {
+ this.values.add(value);
+ }
+
+ public MatrixItem(String name, String[] values) {
+ this.name = name;
+ if (values != null) for (String value : values)
+ this.values.add(value);
+ }
+
+ public Set<String> getValues() {
+ return values;
+ }
+
+ public void setValues(Set<String> values) {
+ this.values = values;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactTypeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactTypeContentProvider.java
new file mode 100644
index 00000000000..1b6df49da19
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactTypeContentProvider.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.framework.ui.skynet.widgets;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ArtifactTypeContentProvider implements ITreeContentProvider {
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Branch) {
+ try {
+ return TypeValidityManager.getValidArtifactTypes((Branch) parentElement).toArray();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeContentProvider.java
new file mode 100644
index 00000000000..e8c8a49e5c2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeContentProvider.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.framework.ui.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.TypeValidityManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class AttributeContentProvider implements ITreeContentProvider {
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Branch) {
+ ArrayList<Object> descriptors = new ArrayList<Object>();
+
+ try {
+ for (AttributeType descriptor : TypeValidityManager.getValidAttributeTypes((Branch) parentElement)) {
+ descriptors.add((Object) descriptor);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return descriptors.toArray();
+
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/DefaultBranchContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/DefaultBranchContentProvider.java
new file mode 100644
index 00000000000..33859b0a9e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/DefaultBranchContentProvider.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.framework.ui.skynet.widgets;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class DefaultBranchContentProvider implements ITreeContentProvider, IBranchEventListener {
+ private final ITreeContentProvider provider;
+ private Viewer viewer;
+ private final Branch branch;
+
+ /**
+ * @param provider
+ */
+ public DefaultBranchContentProvider(final ITreeContentProvider provider, Branch branch) {
+ if (provider == null) throw new IllegalArgumentException("provider can not be null");
+
+ this.branch = branch;
+ this.provider = provider;
+ this.viewer = null;
+
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = viewer;
+ }
+
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ return provider.getChildren(parentElement);
+ }
+
+ public Object getParent(Object element) {
+ return provider.getParent(element);
+ }
+
+ public boolean hasChildren(Object element) {
+ return provider.hasChildren(element);
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return provider.getElements(branch);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, final int branchId) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/HyperLinkLabel.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/HyperLinkLabel.java
new file mode 100644
index 00000000000..1661e33e7e2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/HyperLinkLabel.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.framework.ui.skynet.widgets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Creates a hyperlink label that when enabled, shows as blue and changes cursor when hover over and when disabled,
+ * shows in black with no cursor change. To add listener, use: link.addListener(SWT.MouseUp, new Listener() { public
+ * void handleEvent(org.eclipse.swt.widgets.Event event) { System.out.println("Link Selected"); } });
+ *
+ * @author Donald G. Dunne
+ */
+
+public class HyperLinkLabel extends Label {
+
+ private boolean hyperEnabled = true;
+ /**
+ * Amount of the margin width around the hyperlink (default is 1).
+ */
+ protected int marginWidth = 1;
+
+ /**
+ * Amount of the margin height around the hyperlink (default is 1).
+ */
+ protected int marginHeight = 1;
+
+ public HyperLinkLabel(Composite parent, int style) {
+ this(null, parent, style, null);
+ }
+
+ public HyperLinkLabel(FormToolkit toolkit, Composite parent, int style) {
+ this(toolkit, parent, style, null);
+ }
+
+ public HyperLinkLabel(FormToolkit toolkit, Composite parent, int style, String text) {
+ super(parent, style);
+ if (text != null) setText(text);
+ if (toolkit != null) toolkit.adapt(this, true, true);
+ refresh();
+ }
+
+ public static void adapt(final Label label) {
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ label.addMouseTrackListener(new MouseTrackListener() {
+
+ public void mouseEnter(MouseEvent e) {
+ label.setCursor(new Cursor(null, SWT.CURSOR_HAND));
+ }
+
+ public void mouseExit(MouseEvent e) {
+ label.setCursor(null);
+ };
+
+ public void mouseHover(MouseEvent e) {
+ }
+ });
+ }
+
+ MouseTrackListener listener = new MouseTrackListener() {
+
+ public void mouseEnter(MouseEvent e) {
+ setCursor(new Cursor(null, SWT.CURSOR_HAND));
+ }
+
+ public void mouseExit(MouseEvent e) {
+ setCursor(null);
+ };
+
+ public void mouseHover(MouseEvent e) {
+ }
+ };
+
+ public void refresh() {
+ if (hyperEnabled) {
+ setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ removeMouseTrackListener(listener);
+ addMouseTrackListener(listener);
+ } else {
+ setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+ removeMouseTrackListener(listener);
+ }
+ }
+
+ public boolean isHyperEnabled() {
+ return hyperEnabled;
+ }
+
+ public void setHyperEnabled(boolean hyperEnabled) {
+ this.hyperEnabled = hyperEnabled;
+ refresh();
+ }
+
+ @Override
+ protected void checkSubclass() {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IArtifactWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IArtifactWidget.java
new file mode 100644
index 00000000000..9ec20e83074
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IArtifactWidget.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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * Used by XWidgets that perform external data storage
+ *
+ * @author Donald G. Dunne
+ */
+public interface IArtifactWidget {
+
+ /**
+ * Set artifact used as storage for this widget
+ *
+ * @throws Exception TODO
+ */
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException;
+
+ /**
+ * Save data changes to artifact
+ *
+ * @throws Exception TODO
+ */
+ public void saveToArtifact() throws OseeCoreException;
+
+ /**
+ * Revert changes to widget data back to what was in artifact
+ *
+ * @throws Exception TODO
+ */
+ public void revert() throws OseeCoreException;
+
+ /**
+ * Return true if storage data different than widget data
+ *
+ * @return
+ * @throws Exception TODO
+ */
+ public Result isDirty() throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IBranchArtifact.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IBranchArtifact.java
new file mode 100644
index 00000000000..7cd599d6bd4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/IBranchArtifact.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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IBranchArtifact {
+ public Branch getWorkingBranch() throws OseeCoreException;
+
+ public Artifact getArtifact();
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationTypeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationTypeContentProvider.java
new file mode 100644
index 00000000000..4febbaaa320
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationTypeContentProvider.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.framework.ui.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class RelationTypeContentProvider implements ITreeContentProvider {
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Branch) {
+ ArrayList<Object> descriptors = new ArrayList<Object>();
+ try {
+ for (RelationType descriptor : RelationTypeManager.getValidTypes((Branch) parentElement)) {
+ descriptors.add((Object) descriptor);
+ }
+ return descriptors.toArray();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/SkynetSpellModifyDictionary.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/SkynetSpellModifyDictionary.java
new file mode 100644
index 00000000000..5226504658e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/SkynetSpellModifyDictionary.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.framework.ui.skynet.widgets;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.GlobalPreferences;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.IOseeDictionary;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkynetSpellModifyDictionary implements XTextSpellModifyDictionary, IOseeDictionary {
+
+ private static String ATTRIBUTE_NAME = "Dictionary";
+ private static Set<String> dictionary;
+ private final boolean debug = false;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XTextSpellModifyDictionary#addToGlobalDictionary(java.lang.String)
+ */
+ public boolean addToGlobalDictionary(String word) {
+ try {
+ return updateArtifact("Global", word, GlobalPreferences.get());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XTextSpellModifyDictionary#addToLocalDictionary(java.lang.String)
+ */
+ public boolean addToLocalDictionary(String word) {
+ try {
+ return updateArtifact("Local", word, UserManager.getUser());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return false;
+ }
+ }
+
+ private boolean updateArtifact(String type, String word, Artifact art) {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Add to " + type + " Dictionary",
+ "Add \"" + word + "\" to " + type + " Dictionary")) {
+ try {
+ Set<String> words = new HashSet<String>();
+ for (String str : art.getSoleAttributeValue(ATTRIBUTE_NAME, "").split(";"))
+ words.add(str);
+ words.add(word);
+ art.setSoleAttributeValue(ATTRIBUTE_NAME, Collections.toString(";", words));
+ art.persistAttributes();
+ loadDictionary(true);
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.util.IOseeDictionary#isWord(java.lang.String)
+ */
+ public boolean isWord(String word) {
+ loadDictionary(false);
+ boolean contains = dictionary.contains(word);
+ if (debug) System.out.println("Checking OSEESpell => \"" + word + "\" " + contains);
+ if (debug) System.out.println("OSEESpellDict => " + Collections.toString(",", dictionary));
+ return contains;
+ }
+
+ public void loadDictionary(boolean force) {
+ if (!force && dictionary != null) return;
+ try {
+ dictionary = new HashSet<String>();
+ User user = UserManager.getUser();
+ if (user != null) {
+ String value = user.getSoleAttributeValue(ATTRIBUTE_NAME, "");
+ if (value != null) {
+ String[] entries = value.split(";");
+ for (String str : entries) {
+ if (debug) System.out.println("Adding Local => \"" + str + "\"");
+ if (str != null && !str.equals("")) dictionary.add(str);
+ }
+ if (GlobalPreferences.get() != null) {
+ for (String str : GlobalPreferences.get().getSoleAttributeValue(ATTRIBUTE_NAME, "").split(";")) {
+ if (debug) System.out.println("Adding Global => \"" + str + "\"");
+ if (str != null && !str.equals("")) dictionary.add(str);
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactList.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactList.java
new file mode 100644
index 00000000000..7db7527f26a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactList.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.framework.ui.skynet.widgets;
+
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+
+/**
+ * Set a Artifact list
+ *
+ * @author Donald G. Dunne
+ */
+public class XArtifactList extends XListViewer {
+
+ public XArtifactList() throws OseeCoreException {
+ this("ArtList", "", "");
+ }
+
+ public XArtifactList(String displayLabel) {
+ this(displayLabel, "", "");
+ }
+
+ public XArtifactList(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ super.setLabelProvider(new ArtifactLabelProvider());
+ super.setContentProvider(new ArrayContentProvider());
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactTypeListViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactTypeListViewer.java
new file mode 100644
index 00000000000..140067c1aec
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XArtifactTypeListViewer.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.skynet.widgets;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XArtifactTypeListViewer extends XTypeListViewer {
+ private static final String NAME = "XArtifactTypeListViewer";
+
+ public XArtifactTypeListViewer(String keyedBranchName, String defaultValue) {
+ super(NAME);
+
+ setContentProvider(new DefaultBranchContentProvider(new ArtifactTypeContentProvider(), resolveBranch(keyedBranchName)));
+ ArrayList<Object> input = new ArrayList<Object>(1);
+ input.add(resolveBranch(keyedBranchName));
+
+ setInput(input);
+
+ if (defaultValue != null) {
+ try {
+ ArtifactType artifactType = ArtifactTypeManager.getType(defaultValue);
+ setDefaultSelected(artifactType);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XAttributeTypeListViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XAttributeTypeListViewer.java
new file mode 100644
index 00000000000..a041658e5d5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XAttributeTypeListViewer.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.framework.ui.skynet.widgets;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XAttributeTypeListViewer extends XTypeListViewer {
+ private static final String NAME = "XAttributeTypeListViewer";
+
+ /**
+ * @param name
+ */
+ public XAttributeTypeListViewer(String keyedBranchName, String defaultValue) {
+ super(NAME);
+
+ setContentProvider(new DefaultBranchContentProvider(new AttributeContentProvider(), resolveBranch(keyedBranchName)));
+ ArrayList<Object> input = new ArrayList<Object>(1);
+ input.add(resolveBranch(keyedBranchName));
+
+ setInput(input);
+
+ if (defaultValue != null) {
+ try {
+ AttributeType attributeType = AttributeTypeManager.getType(defaultValue);
+ setDefaultSelected(attributeType);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectComboWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectComboWidget.java
new file mode 100644
index 00000000000..3749966e2b9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectComboWidget.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.panels.BranchSelectSimpleComposite;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XBranchSelectComboWidget extends XWidget implements Listener {
+ public static final String WIDGET_ID = XBranchSelectWidget.class.getSimpleName();
+
+ private BranchSelectSimpleComposite selectComposite;
+ private Composite composite;
+ private int defaultBranch;
+
+ private final List<Listener> listeners = new ArrayList<Listener>();
+
+ public XBranchSelectComboWidget(String label) {
+ super(label);
+ this.defaultBranch = -1;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ composite = null;
+
+ if (!verticalLabel && (horizontalSpan < 2)) {
+ horizontalSpan = 2;
+ } else if (verticalLabel) {
+ horizontalSpan = 1;
+ }
+
+ if (isDisplayLabel() && verticalLabel) {
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout gL = new GridLayout();
+ gL.marginWidth = 0;
+ gL.marginHeight = 0;
+ composite.setLayout(gL);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ } else {
+ composite = parent;
+ }
+
+ // Create List Widgets
+ if (isDisplayLabel()) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ }
+ selectComposite = BranchSelectSimpleComposite.createBranchSelectComposite(composite, SWT.NONE);
+ if (defaultBranch != -1) {
+ selectComposite.restoreWidgetValues(null, Integer.toString(defaultBranch));
+ }
+ selectComposite.addListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (selectComposite != null) {
+ selectComposite.removeListener(this);
+ selectComposite.dispose();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return composite;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Branch getData() {
+ return selectComposite.getSelectedBranch();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ Branch branch = selectComposite.getSelectedBranch();
+ return branch != null ? branch.getBranchName() : "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ System.out.println("Get XML Data Called: ");
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ if (selectComposite.getSelectedBranch() == null) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Must select a Branch");
+ }
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ selectComposite.setFocus();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ System.out.println("Set XML Data Called: " + str);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ System.out.println("Set to Html Called: " + labelFont);
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setDisplayLabel(java.lang.String)
+ */
+ @Override
+ public void setDisplayLabel(final String displayLabel) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ XBranchSelectComboWidget.super.setDisplayLabel(displayLabel);
+ getLabelWidget().setText(displayLabel);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setToolTip(java.lang.String)
+ */
+ @Override
+ public void setToolTip(final String toolTip) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ if (Strings.isValid(toolTip) != false) {
+ XBranchSelectComboWidget.super.setToolTip(toolTip);
+ if (selectComposite != null && selectComposite.isDisposed() != true) {
+ selectComposite.setToolTipText(toolTip);
+ for (Control control : selectComposite.getChildren()) {
+ control.setToolTipText(toolTip);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ super.validate();
+ notifyListeners(event);
+ }
+
+ public void addListener(Listener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(Listener listener) {
+ listeners.remove(listener);
+ }
+
+ private void notifyListeners(Event event) {
+ for (Listener listener : listeners) {
+ listener.handleEvent(event);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidget.java
new file mode 100644
index 00000000000..806c0542523
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidget.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Roberto E. Escobar
+ * @author Donald G. Dunne
+ */
+public class XBranchSelectWidget extends XWidget implements Listener {
+ public static final String WIDGET_ID = XBranchSelectWidget.class.getSimpleName();
+
+ private BranchSelectComposite selectComposite;
+ private Composite composite;
+ private Branch defaultBranch;
+
+ private final List<Listener> listeners = new ArrayList<Listener>();
+
+ public XBranchSelectWidget(String label) {
+ super(label);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ composite = null;
+
+ if (!verticalLabel && (horizontalSpan < 2)) {
+ horizontalSpan = 2;
+ } else if (verticalLabel) {
+ horizontalSpan = 1;
+ }
+
+ if (isDisplayLabel() && verticalLabel) {
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout gL = new GridLayout();
+ gL.marginWidth = 0;
+ gL.marginHeight = 0;
+ composite.setLayout(gL);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ } else {
+ composite = parent;
+ }
+
+ // Create List Widgets
+ if (isDisplayLabel()) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ }
+ selectComposite = BranchSelectComposite.createBranchSelectComposite(composite, SWT.NONE);
+ if (defaultBranch != null) {
+ selectComposite.setDefaultSelectedBranch(defaultBranch);
+ }
+ selectComposite.addListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (selectComposite != null) {
+ selectComposite.removeListener(this);
+ selectComposite.dispose();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return selectComposite.getBranchSelectText();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Branch getData() {
+ return selectComposite.getSelectedBranch();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ Branch branch = selectComposite.getSelectedBranch();
+ return branch != null ? branch.getBranchName() : "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ System.out.println("Get XML Data Called: ");
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ if (selectComposite.getSelectedBranch() == null) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Must select a Branch");
+ }
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ selectComposite.setFocus();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ System.out.println("Set XML Data Called: " + str);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ System.out.println("Set to Html Called: " + labelFont);
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setDisplayLabel(java.lang.String)
+ */
+ @Override
+ public void setDisplayLabel(final String displayLabel) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ XBranchSelectWidget.super.setDisplayLabel(displayLabel);
+ getLabelWidget().setText(displayLabel);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setToolTip(java.lang.String)
+ */
+ @Override
+ public void setToolTip(final String toolTip) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ if (Strings.isValid(toolTip) != false) {
+ XBranchSelectWidget.super.setToolTip(toolTip);
+ if (selectComposite != null && selectComposite.isDisposed() != true) {
+ selectComposite.setToolTipText(toolTip);
+ for (Control control : selectComposite.getChildren()) {
+ control.setToolTipText(toolTip);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ super.validate();
+ notifyListeners(event);
+ }
+
+ public void setBranch(Branch branch) {
+ defaultBranch = branch;
+ }
+
+ public void addListener(Listener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(Listener listener) {
+ listeners.remove(listener);
+ }
+
+ private void notifyListeners(Event event) {
+ for (Listener listener : listeners) {
+ listener.handleEvent(event);
+ }
+ }
+
+ public void setSelection(Branch branch) {
+ defaultBranch = branch;
+ selectComposite.setSelected(branch);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidgetProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidgetProvider.java
new file mode 100644
index 00000000000..21dfddaedeb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XBranchSelectWidgetProvider.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.framework.ui.skynet.widgets;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XBranchSelectWidgetProvider implements IXWidgetProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IXWidgetProvider#createXWidget(java.lang.String, java.lang.String, boolean, org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayoutData)
+ */
+ @Override
+ public XWidget createXWidget(String widgetName, String name, DynamicXWidgetLayoutData widgetLayoutData) {
+ XWidget toReturn = null;
+ if (widgetName.equals(XBranchSelectWidget.WIDGET_ID)) {
+ XBranchSelectWidget widget = new XBranchSelectWidget(name);
+ widget.setToolTip(widgetLayoutData.getToolTip());
+ try {
+ String branchName = widgetLayoutData.getDefaultValue();
+ if (branchName != null) {
+ widget.setBranch(BranchManager.getBranch(branchName));
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ toReturn = widget;
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XButton.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XButton.java
new file mode 100644
index 00000000000..ec402280cea
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XButton.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XButton extends XWidget {
+
+ protected Label button;
+ private Composite parent;
+ private Composite bComp;
+ protected boolean selected = false;
+ private boolean labelAfter = true;
+ private Image image;
+
+ public XButton(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public XButton(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ public XButton(String displayLabel, Image image) {
+ this(displayLabel, "");
+ this.image = image;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return button;
+ }
+
+ /**
+ * Create Check Widgets. Widgets Created: Label: "text entry" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2
+ */
+ protected void createControls(Composite parent, int horizontalSpan) {
+ if (horizontalSpan < 2) {
+ horizontalSpan = 2;
+ }
+ this.parent = parent;
+
+ bComp = new Composite(parent, SWT.NONE);
+ bComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ if (toolkit != null) toolkit.adapt(bComp);
+
+ // Create Text Widgets
+ if (!labelAfter) {
+ labelWidget = new Label(bComp, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ }
+
+ if (toolkit != null)
+ button = toolkit.createLabel(bComp, "");
+ else
+ button = new Label(bComp, SWT.PUSH);
+ GridData gd2 = new GridData(GridData.BEGINNING);
+ button.setLayoutData(gd2);
+ button.addListener(SWT.MouseUp, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ validate();
+ notifyXModifiedListeners();
+ }
+ });
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan = horizontalSpan - 1;
+
+ if (labelAfter) {
+ labelWidget = new Label(bComp, SWT.NONE);
+ labelWidget.setText(getLabel());
+ }
+ if (getToolTip() != null) {
+ button.setToolTipText(getToolTip());
+ }
+ button.setLayoutData(gd);
+ updateCheckWidget();
+ button.setEnabled(isEditable());
+ if (image != null) button.setImage(image);
+ button.setCursor(new Cursor(null, SWT.CURSOR_HAND));
+
+ }
+
+ @Override
+ public void dispose() {
+ labelWidget.dispose();
+ button.dispose();
+ bComp.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ public void setFocus() {
+ return;
+ }
+
+ public String getXmlData() {
+ return "";
+ }
+
+ public String getReportData() {
+ return getXmlData();
+ }
+
+ public void setXmlData(String set) {
+ if (set.equals("true"))
+ set(true);
+ else
+ set(false);
+ }
+
+ private void updateCheckWidget() {
+ validate();
+ }
+
+ public void set(boolean selected) {
+ this.selected = selected;
+ updateCheckWidget();
+ }
+
+ public void refresh() {
+ updateCheckWidget();
+ }
+
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + selected;
+ }
+
+ /**
+ * If set, label will be displayed after the button NOTE: Has to be set before call to createWidgets
+ *
+ * @param labelAfter The labelAfter to set.
+ */
+ public void setLabelAfter(boolean labelAfter) {
+ this.labelAfter = labelAfter;
+ }
+
+ public Label getbutton() {
+ return button;
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return Boolean.valueOf(isSelected());
+ }
+
+ public void setImage(Image image) {
+ this.image = image;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBox.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBox.java
new file mode 100644
index 00000000000..df743e125dd
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBox.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+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.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XCheckBox extends XWidget {
+
+ protected Button checkButton;
+ private Composite parent;
+ protected boolean selected = false;
+ private boolean labelAfter = true;
+
+ public XCheckBox(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public XCheckBox(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return checkButton;
+ }
+
+ /**
+ * Create Check Widgets. Widgets Created: Label: "text entry" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2
+ */
+ protected void createControls(Composite parent, int horizontalSpan) {
+ if (horizontalSpan < 2) {
+ horizontalSpan = 2;
+ }
+ this.parent = parent;
+
+ // Create Text Widgets
+ if (!labelAfter) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ }
+
+ checkButton = new Button(parent, SWT.CHECK);
+ GridData gd2 = new GridData(GridData.BEGINNING);
+ checkButton.setLayoutData(gd2);
+ checkButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ selected = checkButton.getSelection();
+ validate();
+ notifyXModifiedListeners();
+ }
+ });
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ gd.horizontalSpan = horizontalSpan - 1;
+
+ if (labelAfter) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel());
+ }
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ checkButton.setLayoutData(gd);
+ updateCheckWidget();
+ checkButton.setEnabled(isEditable());
+ }
+
+ @Override
+ public void dispose() {
+ labelWidget.dispose();
+ checkButton.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ public void setFocus() {
+ return;
+ }
+
+ public String getXmlData() {
+ if (get())
+ return "true";
+ else
+ return "false";
+ }
+
+ public String getReportData() {
+ return getXmlData();
+ }
+
+ public void setXmlData(String set) {
+ if (set.equals("true"))
+ set(true);
+ else
+ set(false);
+ }
+
+ public void addSelectionListener(SelectionListener selectionListener) {
+ checkButton.addSelectionListener(selectionListener);
+ }
+
+ public boolean get() {
+ if (checkButton == null || checkButton.isDisposed()) {
+ return selected;
+ } else {
+ return checkButton.getSelection();
+ }
+ }
+
+ private void updateCheckWidget() {
+ if (checkButton != null && !checkButton.isDisposed()) checkButton.setSelection(selected);
+ validate();
+ }
+
+ public void set(boolean selected) {
+ this.selected = selected;
+ updateCheckWidget();
+ }
+
+ public void refresh() {
+ updateCheckWidget();
+ }
+
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + selected;
+ }
+
+ /**
+ * If set, label will be displayed after the check box NOTE: Has to be set before call to createWidgets
+ *
+ * @param labelAfter The labelAfter to set.
+ */
+ public void setLabelAfter(boolean labelAfter) {
+ this.labelAfter = labelAfter;
+ }
+
+ public Button getCheckButton() {
+ return checkButton;
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return Boolean.valueOf(isSelected());
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBoxDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBoxDam.java
new file mode 100644
index 00000000000..aad25ca4fa7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCheckBoxDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XCheckBoxDam extends XCheckBox implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XCheckBoxDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ super.set(artifact.getSoleAttributeValue(attributeTypeName, Boolean.FALSE));
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ artifact.setSoleAttributeValue(attributeTypeName, checkButton.getSelection());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ if (checkButton != null && !checkButton.isDisposed()) {
+ Boolean enteredValue = checkButton.getSelection();
+ Boolean storedValue = artifact.getSoleAttributeValue(attributeTypeName, false);
+ if (enteredValue.booleanValue() != storedValue.booleanValue()) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ IStatus status = super.isValid();
+ if (status.isOK()) {
+ status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, artifact, attributeTypeName, get());
+ }
+ return status;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCombo.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCombo.java
new file mode 100644
index 00000000000..0cbe3bbb1a3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XCombo.java
@@ -0,0 +1,383 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XCombo extends XWidget {
+
+ private Combo dataCombo;
+ private Composite parent;
+ protected String data = "";
+ protected String[] inDataStrings; // Strings sent in for display
+ //
+ private final Map<String, Integer> displayDataStrings = new HashMap<String, Integer>();
+ protected Map<String, String> dataStringToXmlString;
+ private String displayArray[];
+ private boolean isDefaultSelectionAllowed;
+
+ public XCombo(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ isDefaultSelectionAllowed = true;
+ }
+
+ public XCombo(String displayLabel, String xmlRoot) {
+ this(displayLabel, xmlRoot, "");
+ }
+
+ public XCombo(String displayLabel) {
+ this(displayLabel, "", "");
+ }
+
+ public void setDefaultSelectionAllowed(boolean isAllowed) {
+ this.isDefaultSelectionAllowed = isAllowed;
+ }
+
+ public boolean isDefaultSelectionAllowed() {
+ return isDefaultSelectionAllowed;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return dataCombo;
+ }
+
+ public void setEnabled(boolean enabled) {
+ dataCombo.setEnabled(enabled);
+ }
+
+ public void createWidgets(Composite composite, int horizontalSpan, String inDataStrings[]) {
+ this.inDataStrings = inDataStrings;
+ createWidgets(composite, horizontalSpan);
+ }
+
+ /**
+ * Create Data Widgets. Widgets Created: Data: "--select--" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2 the string "--select--" will be added to the sent in dataStrings array
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ GridData gd;
+ this.parent = parent;
+
+ if (inDataStrings == null) {
+ inDataStrings = new String[] {"DATA NOT FOUND"};
+ }
+ setDisplayDataStrings();
+
+ if (horizontalSpan < 2) {
+ horizontalSpan = 2;
+ }
+
+ // Create Data Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ dataCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+ dataCombo.setItems(displayArray);
+ if (displayArray.length < 15) {
+ dataCombo.setVisibleItemCount(displayArray.length);
+ } else {
+ dataCombo.setVisibleItemCount(25);
+ }
+ gd = new GridData();
+ if (fillHorizontally) gd.grabExcessHorizontalSpace = true;
+ if (fillVertically) gd.grabExcessVerticalSpace = true;
+ gd.horizontalSpan = horizontalSpan - 1;
+ dataCombo.setLayoutData(gd);
+ ModifyListener dataComboListener = new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ data = dataCombo.getText();
+ if (data.compareTo("--select--") == 0) {
+ data = "";
+ }
+ validate();
+ notifyXModifiedListeners();
+ }
+ };
+ dataCombo.addModifyListener(dataComboListener);
+
+ refresh();
+ dataCombo.setEnabled(isEditable());
+ }
+
+ public int getDisplayPosition(String str) {
+ for (int i = 0; i < displayArray.length; i++) {
+ if (str.equals(displayArray[i])) return i;
+ }
+ return 0;
+ }
+
+ public int getDisplayPosition() {
+ for (int i = 0; i < displayArray.length; i++) {
+ if (data.equals(displayArray[i])) return i;
+ }
+ return 0;
+ }
+
+ public void setDataStrings(String[] inDataStrings) {
+ this.inDataStrings = inDataStrings;
+ setDisplayDataStrings();
+ if (dataCombo != null && !dataCombo.isDisposed()) {
+ dataCombo.setItems(displayArray);
+ if (displayArray.length < 15) dataCombo.setVisibleItemCount(displayArray.length);
+ }
+ updateComboWidget();
+ }
+
+ /**
+ * Given the inDataStrings, create the mapping of all data strings including "--select--" and map them to their index
+ * in the combo list.
+ */
+ private void setDisplayDataStrings() {
+ displayDataStrings.clear();
+
+ if (isDefaultSelectionAllowed()) {
+ displayDataStrings.put("--select--", 0);
+ displayArray = new String[inDataStrings.length + 1];
+ displayArray[0] = "--select--";
+ for (int i = 0; i < inDataStrings.length; i++) {
+ displayDataStrings.put(inDataStrings[i], (i + 1));
+ displayArray[i + 1] = inDataStrings[i];
+ }
+ } else {
+ displayArray = new String[inDataStrings.length];
+ for (int i = 0; i < inDataStrings.length; i++) {
+ displayDataStrings.put(inDataStrings[i], i);
+ displayArray[i] = inDataStrings[i];
+ }
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ if (dataCombo != null) dataCombo.setFocus();
+ }
+
+ public void setDataStringToXmlTranslations(Map<String, String> dataStringToXmlString) {
+ this.dataStringToXmlString = dataStringToXmlString;
+ }
+
+ @Override
+ public void setFromXml(String xml) throws IllegalStateException {
+ Matcher m;
+ if (getXmlSubRoot().equals("")) {
+ m =
+ Pattern.compile("<" + getXmlRoot() + ">(.*?)</" + getXmlRoot() + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xml);
+ } else {
+ m =
+ Pattern.compile(
+ "<" + getXmlRoot() + "><" + getXmlSubRoot() + ">(.*?)</" + getXmlSubRoot() + "></" + getXmlRoot() + ">",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(xml);
+ }
+ while (m.find()) {
+ String str = m.group(1);
+ String transStr = null;
+ // If translation given, translate back to display string
+ // ie. bems number => full name
+ if (dataStringToXmlString != null) {
+ if (dataStringToXmlString.containsValue(str)) {
+ for (Iterator iter = dataStringToXmlString.entrySet().iterator(); iter.hasNext();) {
+ Map.Entry<String, String> entry = (Map.Entry<String, String>) iter.next();
+ if (str.equals(entry.getValue())) {
+ transStr = entry.getKey();
+ break;
+ }
+ }
+ }
+ }
+ if (transStr != null) {
+ set(transStr);
+ } else {
+ set(str);
+ }
+ break;
+ }
+ refresh();
+ }
+
+ @Override
+ public void refresh() {
+ updateComboWidget();
+ }
+
+ public void addModifyListener(ModifyListener modifyListener) {
+ if (dataCombo != null) dataCombo.addModifyListener(modifyListener);
+ }
+
+ public Combo getComboBox() {
+ return dataCombo;
+ }
+
+ /**
+ * @return selected display value (eg. Donald Dunne)
+ */
+ public String get() {
+ return data;
+ }
+
+ /**
+ * @return returns translated xml value (eg. 727536)
+ */
+ public String getXml() {
+ String s = "";
+ if (dataStringToXmlString == null) {
+ s = data;
+ } else {
+ s = dataStringToXmlString.get(data);
+ if (s == null) {
+ s = data;
+ }
+ }
+ return s;
+ }
+
+ @Override
+ public String getReportData() {
+ return data;
+ }
+
+ @Override
+ public String getXmlData() {
+ return getReportData();
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ private void updateComboWidget() {
+ if (dataCombo != null && !dataCombo.isDisposed()) {
+ if (displayDataStrings.containsKey(data)) {
+ if (data.compareTo("") == 0) {
+ dataCombo.select(0);
+ } else {
+ Integer pos = displayDataStrings.get(data);
+ dataCombo.select(pos.intValue());
+ }
+ } else if (data.compareTo("") != 0) {
+ // if not found, add it and select it
+ displayDataStrings.put(data, displayDataStrings.size());
+ dataCombo.add(data);
+ dataCombo.select(displayDataStrings.size() - 1);
+ } else {
+ dataCombo.select(0);
+ }
+ if (displayDataStrings.size() < 15) dataCombo.setVisibleItemCount(displayDataStrings.size());
+ }
+ validate();
+ }
+
+ public void set(String data) {
+ this.data = data;
+ updateComboWidget();
+ }
+
+ public void set(int pos) {
+ if (displayArray.length > pos) {
+ this.data = displayArray[pos];
+ updateComboWidget();
+ }
+ }
+
+ public void remove(String data) {
+ displayDataStrings.remove(data);
+ if (dataCombo.indexOf(data) >= 0) dataCombo.remove(data);
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (isRequiredEntry() && data.equals("")) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, getLabel() + " must be selected.");
+ }
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ protected String toXml() {
+ return toXml(getXmlRoot());
+ }
+
+ @Override
+ protected String toXml(String xmlRoot) {
+ String s;
+ String dataStr = getXml();
+ if (getXmlSubRoot() == null || getXmlSubRoot().equals("")) {
+ s = "<" + xmlRoot + ">" + dataStr + "</" + xmlRoot + ">\n";
+ } else {
+ s = "<" + xmlRoot + "><" + getXmlSubRoot() + ">" + dataStr + "</" + getXmlSubRoot() + "></" + xmlRoot + ">\n";
+ }
+ return s;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + data;
+ }
+
+ public static void copy(XCombo from, XCombo to) throws IllegalStateException {
+ to.set(from.get());
+ }
+
+ @Override
+ public void dispose() {
+ if (labelWidget != null) labelWidget.dispose();
+ if (dataCombo != null) dataCombo.dispose();
+ if (labelWidget != null) labelWidget.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ super.dispose();
+ }
+
+ public String[] getDisplayArray() {
+ return displayArray;
+ }
+
+ public String[] getInDataStrings() {
+ return inDataStrings;
+ }
+
+ @Override
+ public Object getData() {
+ return dataCombo.getText();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboBooleanDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboBooleanDam.java
new file mode 100644
index 00000000000..8de8d541111
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboBooleanDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class XComboBooleanDam extends XCombo implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XComboBooleanDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ Boolean result = artifact.getSoleAttributeValue(attrName, null);
+ if (result == null)
+ super.set("");
+ else
+ super.set(result ? "yes" : "no");
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ try {
+ if (data == null || data.equals("")) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else {
+ String enteredValue = get();
+ artifact.setSoleAttributeValue(attributeTypeName, (enteredValue != null && enteredValue.equals("yes")));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ String enteredValue = get();
+ boolean storedValue = artifact.getSoleAttributeValue(attributeTypeName);
+ if (enteredValue.equals("yes") != storedValue) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (AttributeDoesNotExist ex) {
+ if (!get().equals("")) return new Result(true, attributeTypeName + " is dirty");
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ IStatus status = super.isValid();
+ if (status.isOK()) {
+ status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, artifact, attributeTypeName, get());
+ }
+ return status;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java
new file mode 100644
index 00000000000..e5dcdd26f28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class XComboDam extends XCombo implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XComboDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ try {
+ String value = artifact.getSoleAttributeValue(attributeTypeName);
+ super.set(value.toString());
+ } catch (AttributeDoesNotExist ex) {
+ super.set("");
+ }
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ try {
+ if (!Strings.isValid(data)) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else {
+ String enteredValue = get();
+ artifact.setSoleAttributeValue(attributeTypeName, enteredValue);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ String enteredValue = get();
+ String storedValue = artifact.getSoleAttributeValue(attributeTypeName);
+ if (!enteredValue.equals(storedValue)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (AttributeDoesNotExist ex) {
+ if (!get().equals("")) return new Result(true, attributeTypeName + " is dirty");
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ IStatus status = super.isValid();
+ if (status.isOK()) {
+ status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, artifact, attributeTypeName, get());
+ }
+ return status;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboViewer.java
new file mode 100644
index 00000000000..0bc77d25452
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboViewer.java
@@ -0,0 +1,305 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XComboViewer extends XWidget {
+
+ private ComboViewer comboViewer;
+ private Composite parent;
+ private Composite composite;
+ private boolean grabHorizontal = false;
+
+ protected SelectionListener listListener = new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ handleSelection();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ };
+ private Collection<Object> input;
+ private IContentProvider contentProvider;
+ private ILabelProvider labelProvider;
+ private ViewerSorter sorter;
+ private int widthHint;
+ private int heightHint;
+
+ public XComboViewer(String displayLabel) {
+ this(displayLabel, "list", "");
+ }
+
+ public XComboViewer() {
+ this("List", "list", "");
+ }
+
+ public XComboViewer(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ contentProvider = new ArrayContentProvider();
+ labelProvider = new ArtifactLabelProvider();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return comboViewer.getControl();
+ }
+
+ public void setContentProvider(IContentProvider contentProvider) {
+ this.contentProvider = contentProvider;
+ }
+
+ public void setLabelProvider(ILabelProvider labelProvider) {
+ this.labelProvider = labelProvider;
+ }
+
+ public void setSorter(ViewerSorter sorter) {
+ this.sorter = sorter;
+ }
+
+ public void setInput(Collection<Object> input) {
+ this.input = input;
+ if (comboViewer != null) comboViewer.setInput(input);
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ comboViewer.addSelectionChangedListener(listener);
+ }
+
+ public void setHints(int widthHint, int heightHint) {
+ this.widthHint = widthHint;
+ this.heightHint = heightHint;
+ }
+
+ /**
+ * Create List Widgets. Widgets Created: List: horizonatalSpan takes up 2 columns; horizontalSpan must be >=2
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ this.parent = parent;
+ composite = null;
+
+ if (!verticalLabel && (horizontalSpan < 2)) {
+ horizontalSpan = 2;
+ } else if (verticalLabel) {
+ horizontalSpan = 1;
+ }
+
+ if (isDisplayLabel() && verticalLabel) {
+ composite = new Composite(parent, SWT.NONE);
+ int numColumns = 1;
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = numColumns;
+ composite.setLayout(gridLayout);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = horizontalSpan;
+ composite.setLayoutData(gd);
+ } else {
+ composite = parent;
+ }
+
+ // Create List Widgets
+ if (isDisplayLabel()) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ comboViewer = new ComboViewer(composite, SWT.NONE);
+ comboViewer.setContentProvider(contentProvider);
+ comboViewer.setLabelProvider(labelProvider);
+ if (sorter != null) comboViewer.setSorter(sorter);
+ comboViewer.setInput(input);
+ comboViewer.getCombo().addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ handleSelection();
+ }
+ });
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ if (grabHorizontal) gd.grabExcessHorizontalSpace = true;
+ if (widthHint > 0) gd.widthHint = widthHint;
+ if (heightHint > 0) gd.heightHint = heightHint;
+ comboViewer.getCombo().setLayoutData(gd);
+ comboViewer.getCombo().addSelectionListener(listListener);
+ updateListWidget();
+ }
+
+ @Override
+ public void dispose() {
+ labelWidget.dispose();
+ comboViewer.getCombo().dispose();
+ if (composite != null && !composite.isDisposed()) composite.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /**
+ * Don't need this since overriding toReport and toXml
+ */
+ @Override
+ public String getXmlData() {
+ return "";
+ }
+
+ /**
+ * Don't need this since overriding setFromXml
+ */
+ @Override
+ public void setXmlData(String str) {
+ return;
+ }
+
+ private void handleSelection() {
+ validate();
+ notifyXModifiedListeners();
+ }
+
+ @Override
+ public void refresh() {
+ updateListWidget();
+ }
+
+ public void addSelectionListener(SelectionListener selectionListener) {
+ comboViewer.getCombo().addSelectionListener(selectionListener);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getSelected() {
+ IStructuredSelection selection = (IStructuredSelection) comboViewer.getSelection();
+ Iterator iter = selection.iterator();
+ if (iter.hasNext()) return iter.next();
+ return null;
+ }
+
+ @Override
+ public void setFromXml(String xml) {
+ }
+
+ public Combo getCombo() {
+ return comboViewer.getCombo();
+ }
+
+ protected void updateListWidget() {
+ comboViewer.refresh();
+ validate();
+ }
+
+ public void add(Object obj) {
+ input.add(obj);
+ }
+
+ public void add(Object[] names) {
+ for (Object name : names) {
+ add(name);
+ }
+ }
+
+ public void setSelected(ArrayList<Object> selected) {
+ comboViewer.setSelection(new StructuredSelection(selected.toArray(new Object[selected.size()])));
+ updateListWidget();
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (!isRequiredEntry()) return Status.OK_STATUS;
+ Object selected = getSelected();
+ if (selected == null && isRequiredEntry()) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Must select " + getLabel());
+ }
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public String getReportData() {
+ String s = "\n";
+ Object obj = getSelected();
+ s = s + " - " + obj + "\n";
+ s = s.replaceAll("\n+$", "");
+ return s;
+ }
+
+ @Override
+ public String toXml() {
+ return toXml(getXmlRoot(), getXmlSubRoot());
+ }
+
+ @Override
+ public String toXml(String xmlRoot, String xmlSubRoot) {
+ return "";
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ String s = "<dl><dt>" + AHTML.getLabelStr(labelFont, getLabel() + ": ") + "<dt><ul type=\"disc\">";
+ Object xItem = getSelected();
+ s += "<li>" + xItem;
+ return s + "</ul></dl>";
+ }
+
+ /**
+ * @param grabHorizontal The grabHorizontal to set.
+ */
+ public void setGrabHorizontal(boolean grabHorizontal) {
+ this.grabHorizontal = grabHorizontal;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return getSelected();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDate.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDate.java
new file mode 100644
index 00000000000..1903c1a21b8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDate.java
@@ -0,0 +1,359 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarListenerAdapter;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XDate extends XWidget {
+
+ private CalendarCombo dateCombo;
+ private Composite parent;
+ protected Date date;
+ public static String MMDDYY = "MM/dd/yyyy";
+ public static String YYYYMMDD = "yyyy/MM/dd";
+ public static String MMDDYYHHMM = "MM/dd/yyyy hh:mm a";
+ public static String HHMMSS = "hh:mm:ss";
+ public static String HHMMSSSS = "hh:mm:ss:SS";
+ public static String HHMM = "hh:mm";
+ private String defaultFormat = MMDDYYHHMM;
+ private final ArrayList<ModifyListener> listeners = new ArrayList<ModifyListener>();
+ private boolean requireFutureDate = false;
+
+ public static final long MILLISECONDS_IN_A_WEEK = 604800000;
+ public static final long MILLISECONDS_IN_A_DAY = 86400000;
+
+ public XDate() {
+ this("", "");
+ }
+
+ public XDate(Date date) {
+ this("", "");
+ this.date = date;
+ }
+
+ public XDate(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ public XDate(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ date = null;
+ }
+
+ public String getHHMM() {
+ return get(HHMM);
+ }
+
+ public String getHHMMSS() {
+ return get(HHMMSS);
+ }
+
+ public String getMMDDYY() {
+ return get(MMDDYY);
+ }
+
+ public String getMMDDYYHHMM() {
+ return get(MMDDYYHHMM);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return dateCombo;
+ }
+
+ /**
+ * Set the default format for the date ADate.MMMDDDYY or ADate MMMDDDYYYHHHMM or use java.util.date format string
+ *
+ * @param format
+ */
+ public void setFormat(String format) {
+ defaultFormat = format;
+ }
+
+ public void clearData() {
+ date = null;
+ }
+
+ public static String getDateStr(Date date, String format) {
+ if (date == null) return "";
+ return (new SimpleDateFormat(format)).format(date);
+ }
+
+ public static String getDateNow() {
+ return getDateNow(MMDDYY);
+ }
+
+ public static String getTimeStamp() {
+ return getDateNow(HHMMSSSS);
+ }
+
+ public static String getDateNow(String format) {
+ XDate d = new XDate();
+ d.setDateToNow();
+ return d.get(format);
+ }
+
+ /**
+ * Create Date Widgets Label/DatePickerCombo
+ *
+ * @param parent
+ * @param horizontalSpan - horizontalSpan takes up 4 columns, therefore horizontalSpan must be >=4
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ // composite = new Composite(parent, parent.getStyle());
+ this.parent = parent;
+
+ if (horizontalSpan < 2) horizontalSpan = 2;
+
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ": ");
+ dateCombo = new CalendarCombo(parent, SWT.BORDER);
+ dateCombo.setEnabled(isEditable());
+ GridData gd = new GridData();
+ gd.widthHint = 100;
+ if (date != null) dateCombo.setDate(date);
+ dateCombo.addCalendarListener(new CalendarListenerAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.calendarcombo.CalendarListenerAdapter#dateChanged(java.util.Calendar)
+ */
+ @Override
+ public void dateChanged(Calendar newDate) {
+ super.dateChanged(newDate);
+ if (newDate == null)
+ date = null;
+ else
+ date = newDate.getTime();
+ validate();
+ notifyXModifiedListeners();
+ dateCombo.getParent().layout();
+ }
+ });
+
+ }
+
+ @Override
+ public void dispose() {
+ labelWidget.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ @Override
+ public void setFromXml(String xml) {
+ Matcher m =
+ Pattern.compile("<" + getXmlRoot() + ">(\\d+)</" + getXmlRoot() + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xml);
+ if (m.find()) {
+ try {
+ Long l = new Long(m.group(1));
+ date = new Date(l.longValue());
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ refresh();
+ }
+
+ public void addModifyListener(ModifyListener listener) {
+ listeners.add(listener);
+ updateListeners();
+ }
+
+ public void updateListeners() {
+ for (ModifyListener listener : listeners) {
+ if (dateCombo != null) {
+ dateCombo.removeModifyListener(listener);
+ dateCombo.addModifyListener(listener);
+ }
+ }
+ }
+
+ public void clear() {
+ date = new Date();
+ refresh();
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDateToNow() {
+ setDate(new java.util.Date());
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ if (dateCombo != null && !dateCombo.isDisposed()) {
+ if (dateCombo != null)
+ dateCombo.setDate(date);
+ else
+ dateCombo.setDate((Date) null);
+ }
+ }
+
+ @Override
+ public void refresh() {
+ validate();
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (isRequireFutureDate()) {
+ if (getDate().before(new Date())) return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ getLabel() + " must be in future.");
+ }
+ if (isRequiredEntry()) {
+ if (get().equals("")) return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ getLabel() + " must be selected.");
+ }
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public String getReportData() {
+ return get();
+ }
+
+ public String get() {
+ if (date == null) return "";
+ return date.toString();
+ }
+
+ public String get(String pattern) {
+ return get(new SimpleDateFormat(pattern));
+ }
+
+ public String get(DateFormat dateFormat) {
+ if (date == null) return "";
+ String result = dateFormat.format(date);
+ return result;
+ }
+
+ @Override
+ public void setFocus() {
+ if (dateCombo != null) dateCombo.setFocus();
+ }
+
+ /**
+ * Don't need this since overriding toReport and toXml
+ */
+ @Override
+ public String getXmlData() {
+ String dateStr = "";
+ if (date != null) dateStr = date.getTime() + "";
+ return dateStr;
+ }
+
+ /**
+ * Don't need this since overriding setFromXml
+ */
+ @Override
+ public void setXmlData(String str) {
+ if (str.equals(""))
+ date = null;
+ else {
+ try {
+ Long l = new Long(str);
+ date = new Date(l.longValue());
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ date = null;
+ }
+ }
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + get(defaultFormat);
+ }
+
+ public String toHTML(String labelFont, String pattern) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + get(pattern);
+ }
+
+ public boolean isRequireFutureDate() {
+ return requireFutureDate;
+ }
+
+ public void setRequireFutureDate(boolean requireFutureDate) {
+ this.requireFutureDate = requireFutureDate;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return getDate();
+ }
+
+ public int getDifference(Date date) {
+ return calculateDifference(getDate(), date);
+ }
+
+ public static int calculateDifference(Date a, Date b) {
+ int tempDifference = 0;
+ int difference = 0;
+ Calendar earlier = Calendar.getInstance();
+ Calendar later = Calendar.getInstance();
+
+ if (a.compareTo(b) < 0) {
+ earlier.setTime(a);
+ later.setTime(b);
+ } else {
+ earlier.setTime(b);
+ later.setTime(a);
+ }
+
+ while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR)) {
+ tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
+ difference += tempDifference;
+
+ earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
+ }
+
+ if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR)) {
+ tempDifference = later.get(Calendar.DAY_OF_YEAR) - earlier.get(Calendar.DAY_OF_YEAR);
+ difference += tempDifference;
+
+ earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
+ }
+
+ return difference;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDateDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDateDam.java
new file mode 100644
index 00000000000..655489cbfdb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDateDam.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.framework.ui.skynet.widgets;
+
+import java.util.Date;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class XDateDam extends XDate implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XDateDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ Date value = artifact.getSoleAttributeValue(attributeTypeName, null);
+ if (value != null) {
+ super.setDate(value);
+ }
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ try {
+ if (date == null || date.equals("")) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else {
+ Date enteredValue = getDate();
+ artifact.setSoleAttributeValue(attributeTypeName, enteredValue);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ Date enteredValue = getDate();
+ Date storedValue = artifact.getSoleAttributeValue(attributeTypeName, null);
+ if (enteredValue == null && storedValue == null) return Result.FalseResult;
+ if (enteredValue == null && storedValue != null) return new Result(true, attributeTypeName + " is dirty");
+ if (enteredValue != null && storedValue == null) return new Result(true, attributeTypeName + " is dirty");
+ if (enteredValue.getTime() != storedValue.getTime()) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ IStatus status = super.isValid();
+ if (status.isOK()) {
+ status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, artifact, attributeTypeName, get());
+ }
+ return status;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDragAndDrop.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDragAndDrop.java
new file mode 100644
index 00000000000..46dfc1e6d37
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XDragAndDrop.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.skynet.widgets;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XDragAndDrop extends SkynetDragAndDrop {
+
+ /**
+ * @param control
+ * @param viewId
+ */
+ public XDragAndDrop(Control control, String viewId) {
+ super(control, viewId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop#getArtifacts()
+ */
+ @Override
+ public Artifact[] getArtifacts() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop#performArtifactDrop(org.eclipse.osee.framework.skynet.core.artifact.Artifact[])
+ */
+ @Override
+ public void performArtifactDrop(Artifact[] dropArtifacts) {
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFileTextWithSelectionDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFileTextWithSelectionDialog.java
new file mode 100644
index 00000000000..a2934d1030c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFileTextWithSelectionDialog.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.framework.ui.skynet.widgets;
+
+import java.io.File;
+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.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XFileTextWithSelectionDialog extends XText {
+
+ private String defaultFileSelection;
+ private final Type type;
+ public static enum Type {
+ File, Directory
+ };
+
+ public XFileTextWithSelectionDialog(String displayLabel, Type type) {
+ super(displayLabel);
+ this.type = type;
+ }
+
+ public XFileTextWithSelectionDialog() {
+ this("", Type.File);
+ }
+
+ /**
+ * @param displayLabel
+ */
+ public XFileTextWithSelectionDialog(String displayLabel) {
+ this(displayLabel, Type.File);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#createWidgets(org.eclipse.swt.widgets.Composite, int, boolean)
+ */
+ @Override
+ public void createControls(final Composite parent, int horizontalSpan, boolean fillText) {
+ super.createControls(parent, horizontalSpan, fillText);
+
+ Button fileDialog = new Button(getStyledText().getParent(), SWT.NONE);
+ fileDialog.setText("Select " + type.name());
+ fileDialog.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ if (type == Type.File) {
+ FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.OPEN);
+ dialog.setFilterExtensions(new String[] {"*.*"});
+ String defaultDir = getDefaultFileSelection();
+ File dir = new File(defaultDir != null ? defaultDir : "");
+ if (dir.isFile() || dir.isDirectory())
+ dialog.setFilterPath(defaultDir);
+ else
+ dialog.setFilterPath("c:\\");
+
+ String result = dialog.open();
+ if (result != null && !result.equals("")) {
+ setText(dialog.getFilterPath() + File.separatorChar + dialog.getFileName());
+ }
+ } else if (type == Type.Directory) {
+ DirectoryDialog dialog = new DirectoryDialog(Display.getCurrent().getActiveShell(), SWT.OPEN);
+ String defaultDir = getDefaultFileSelection();
+ File dir = new File(defaultDir != null ? defaultDir : "");
+ if (dir.isFile() || dir.isDirectory())
+ dialog.setFilterPath(defaultDir);
+ else
+ dialog.setFilterPath("c:\\");
+
+ String result = dialog.open();
+ if (result != null && !result.equals("")) {
+ setText(result);
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * @return the defaultFileSelection
+ */
+ public String getDefaultFileSelection() {
+ return defaultFileSelection;
+ }
+
+ /**
+ * @param defaultFileSelection the defaultFileSelection to set
+ */
+ public void setDefaultFileSelection(String defaultFileSelection) {
+ this.defaultFileSelection = defaultFileSelection;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloat.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloat.java
new file mode 100644
index 00000000000..d0fbb3e1022
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloat.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XFloat extends XText {
+ private double minValue = 0;
+ private boolean minValueSet = false;
+ private double maxValue = 0;
+ private boolean maxValueSet = false;
+
+ public XFloat(String displayLabel) {
+ super(displayLabel, "float");
+ }
+
+ public XFloat(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public void setMinValue(double minValue) {
+ minValueSet = true;
+ this.minValue = minValue;
+ }
+
+ public void setMaxValue(double maxValue) {
+ maxValueSet = false;
+ this.maxValue = maxValue;
+ }
+
+ @Override
+ public double getFloat() {
+ if (get().equals("")) return 0.0;
+ try {
+ return new Double(get());
+ } catch (NumberFormatException ex) {
+ return 0.0;
+ }
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (isRequiredEntry() || (super.get().compareTo("") != 0)) {
+ String name = getLabel();
+ if (name.equals("")) name = "Value";
+ IStatus result = super.isValid();
+ if (!result.isOK()) {
+ return result;
+ } else if (!this.isFloat()) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, name + " must be a Float");
+ } else if (minValueSet && (this.getFloat() < minValue)) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, name + " must be >= " + minValue);
+ } else if (maxValueSet && (this.getFloat() > maxValue)) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, name + " must be <= " + maxValue);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloatDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloatDam.java
new file mode 100644
index 00000000000..58afa841882
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XFloatDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XFloatDam extends XFloat implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ /**
+ * @param displayLabel
+ */
+ public XFloatDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ /**
+ * @param displayLabel
+ * @param xmlRoot
+ */
+ public XFloatDam(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ Double value = artifact.getSoleAttributeValue(attributeTypeName, null);
+ super.set(value == null ? "" : value.toString());
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ try {
+ if (text == null || text.equals("")) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else {
+ Double enteredValue = getFloat();
+ artifact.setSoleAttributeValue(attributeTypeName, enteredValue);
+ }
+ } catch (NumberFormatException ex) {
+ // do nothing
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ Double enteredValue = getFloat();
+ Double storedValue = artifact.getSoleAttributeValue(attributeTypeName, 0.0);
+ if (enteredValue.doubleValue() != storedValue.doubleValue()) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelGroupSelection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelGroupSelection.java
new file mode 100644
index 00000000000..90aecafaa63
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelGroupSelection.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.framework.ui.skynet.widgets;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.GroupListDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XHyperlabelGroupSelection extends XHyperlinkLabelSelection {
+
+ public static final String WIDGET_ID = XHyperlabelGroupSelection.class.getSimpleName();
+ Set<Artifact> selectedGroups = new HashSet<Artifact>();
+
+ /**
+ * @param label
+ */
+ public XHyperlabelGroupSelection(String label) {
+ super(label, true);
+ }
+
+ public Set<Artifact> getSelectedGroups() {
+ return selectedGroups;
+ }
+
+ @Override
+ public String getCurrentValue() {
+ return Artifacts.commaArts(selectedGroups);
+ }
+
+ public void setSelectedGroups(Set<Artifact> selectedUsers) {
+ this.selectedGroups = selectedUsers;
+ refresh();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelSelection#handleClear()
+ */
+ @Override
+ public boolean handleClear() {
+ selectedGroups.clear();
+ notifyXModifiedListeners();
+ return true;
+ }
+
+ @Override
+ public boolean handleSelection() {
+ try {
+ GroupListDialog dialog = new GroupListDialog(Display.getCurrent().getActiveShell());
+ int result = dialog.open();
+ if (result == 0) {
+ selectedGroups.clear();
+ for (Object obj : dialog.getResult()) {
+ selectedGroups.add((Artifact) obj);
+ }
+ notifyXModifiedListeners();
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelDam.java
new file mode 100644
index 00000000000..7b85fcbe637
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelDam.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.framework.ui.skynet.widgets;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class XHyperlabelMemberSelDam extends XHyperlabelMemberSelection implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XHyperlabelMemberSelDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+
+ super.setSelectedUsers(getUsers());
+ }
+
+ public Set<User> getUsers() {
+ Set<User> users = new HashSet<User>();
+ try {
+ Matcher m =
+ Pattern.compile("<userId>(.*?)</userId>").matcher(artifact.getSoleAttributeValue(attributeTypeName, ""));
+ while (m.find()) {
+ users.add(UserManager.getUserByUserId(m.group(1)));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ return users;
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ try {
+ String selectedStrValue = getSelectedStringValue();
+ if (selectedStrValue == null || selectedStrValue.equals("")) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else {
+ artifact.setSoleAttributeValue(attributeTypeName, selectedStrValue);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public String getSelectedStringValue() throws OseeCoreException {
+ StringBuffer sb = new StringBuffer();
+ for (User user : getSelectedUsers()) {
+ sb.append(AXml.addTagData("userId", user.getUserId()));
+ }
+ return sb.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ String enteredValue = getSelectedStringValue();
+ String storedValue = artifact.getSoleAttributeValue(attributeTypeName);
+ if (!enteredValue.equals(storedValue)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (AttributeDoesNotExist ex) {
+ if (!artifact.getSoleAttributeValue(attributeTypeName, "").equals("")) return new Result(true,
+ attributeTypeName + " is dirty");
+ } catch (NumberFormatException ex) {
+ // do nothing
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelection.java
new file mode 100644
index 00000000000..ecede3f2162
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlabelMemberSelection.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.framework.ui.skynet.widgets;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.dialog.UserCheckTreeDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XHyperlabelMemberSelection extends XHyperlinkLabelSelection {
+
+ Set<User> selectedUsers = new HashSet<User>();
+
+ /**
+ * @param label
+ */
+ public XHyperlabelMemberSelection(String label) {
+ super(label);
+ }
+
+ public Set<User> getSelectedUsers() {
+ return selectedUsers;
+ }
+
+ @Override
+ public String getCurrentValue() {
+ StringBuffer sb = new StringBuffer();
+ for (User user : selectedUsers)
+ sb.append(user.getName() + ", ");
+ return sb.toString().replaceFirst(", $", "");
+ }
+
+ public void setSelectedUsers(Set<User> selectedUsers) {
+ this.selectedUsers = selectedUsers;
+ refresh();
+ }
+
+ @Override
+ public boolean handleSelection() {
+ try {
+ UserCheckTreeDialog uld = new UserCheckTreeDialog(Display.getCurrent().getActiveShell());
+ uld.setMessage("Select to assign.\nDeSelect to un-assign.");
+ uld.setInitialSelections(selectedUsers);
+ if (uld.open() != 0) return false;
+ selectedUsers.clear();
+ for (Artifact art : uld.getSelection()) {
+ selectedUsers.add((User) art);
+ }
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelSelection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelSelection.java
new file mode 100644
index 00000000000..028868031bc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelSelection.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XHyperlinkLabelSelection extends XWidget {
+
+ Label valueLabel;
+ HyperLinkLabel selectHyperLinkLabel, clearHyperLinkLabel;
+ private final boolean supportClear;
+
+ /**
+ * @param label
+ */
+ public XHyperlinkLabelSelection(String label) {
+ this(label, false);
+ }
+
+ public XHyperlinkLabelSelection(String label, boolean supportClear) {
+ super(label);
+ this.supportClear = supportClear;
+ }
+
+ public String getCurrentValue() {
+ return "";
+ }
+
+ public String getHyperlinkLabelString() {
+ return " (select)";
+ }
+
+ public String getClearHyperlinkLabelString() {
+ return "(clear) ";
+ }
+
+ public boolean handleSelection() {
+ return false;
+ }
+
+ public boolean handleClear() {
+ return false;
+ }
+
+ /**
+ * @return the supportClear
+ */
+ public boolean isSupportClear() {
+ return supportClear;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(ALayout.getZeroMarginLayout(5, false));
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(comp, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ selectHyperLinkLabel = new HyperLinkLabel(comp, SWT.NONE);
+ selectHyperLinkLabel.setToolTipText("Select to Modify");
+ selectHyperLinkLabel.addListener(SWT.MouseUp, new Listener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ if (handleSelection()) {
+ refresh();
+ notifyXModifiedListeners();
+ }
+ }
+ });
+ if (supportClear) {
+ clearHyperLinkLabel = new HyperLinkLabel(comp, SWT.NONE);
+ clearHyperLinkLabel.setToolTipText("Select to Clear");
+ clearHyperLinkLabel.addListener(SWT.MouseUp, new Listener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ if (handleClear()) {
+ refresh();
+ notifyXModifiedListeners();
+ }
+ }
+ });
+ }
+ valueLabel = new Label(comp, SWT.NONE);
+ valueLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ valueLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+
+ refresh();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ selectHyperLinkLabel.refresh();
+ selectHyperLinkLabel.setText(getHyperlinkLabelString());
+ if (supportClear) {
+ clearHyperLinkLabel.refresh();
+ clearHyperLinkLabel.setText(getClearHyperlinkLabelString());
+ }
+ valueLabel.setText(getCurrentValue());
+ valueLabel.getParent().layout();
+ validate();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return valueLabel;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#adaptControls(org.eclipse.ui.forms.widgets.FormToolkit)
+ */
+ @Override
+ public void adaptControls(FormToolkit toolkit) {
+ super.adaptControls(toolkit);
+ toolkit.adapt(selectHyperLinkLabel, true, true);
+ selectHyperLinkLabel.refresh();
+ if (supportClear) {
+ toolkit.adapt(clearHyperLinkLabel, true, true);
+ clearHyperLinkLabel.refresh();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelValueStr(AHTML.LABEL_FONT, getHyperlinkLabelString(), getCurrentValue());
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XInteger.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XInteger.java
new file mode 100644
index 00000000000..864f5c08702
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XInteger.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XInteger extends XText {
+ private int minValue = 0;
+ private boolean minValueSet = false;
+ private int maxValue = 0;
+ private boolean maxValueSet = false;
+
+ public XInteger(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ public XInteger(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public void setMinValue(int minValue) {
+ minValueSet = true;
+ this.minValue = minValue;
+ }
+
+ public void setMaxValue(int maxValue) {
+ maxValueSet = false;
+ this.maxValue = maxValue;
+ }
+
+ public IStatus isValid() {
+ if (isRequiredEntry() || (super.get().compareTo("") != 0)) {
+ IStatus result = super.isValid();
+ if (!result.isOK()) {
+ return result;
+ } else if (!this.isInteger()) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Must be an Integer");
+ } else if (minValueSet && (this.getInteger() < minValue)) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Must be >= " + minValue);
+ } else if (maxValueSet && (this.getInteger() > maxValue)) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Must be <= " + maxValue);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java
new file mode 100644
index 00000000000..7b279fce23f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class XIntegerDam extends XInteger implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XIntegerDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ try {
+ Integer value = artifact.getSoleAttributeValue(attributeTypeName);
+ super.set(value.toString());
+ } catch (AttributeDoesNotExist ex) {
+ super.set("");
+ }
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ try {
+ if (text == null || text.equals("")) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else {
+ Integer enteredValue = getInteger();
+ artifact.setSoleAttributeValue(attributeTypeName, enteredValue);
+ }
+ } catch (NumberFormatException ex) {
+ // do nothing
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ Integer enteredValue = getInteger();
+ Integer storedValue = artifact.getSoleAttributeValue(attributeTypeName);
+ if (enteredValue.doubleValue() != storedValue.doubleValue()) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (AttributeDoesNotExist ex) {
+ if (!get().equals("")) return new Result(true, attributeTypeName + " is dirty");
+ } catch (NumberFormatException ex) {
+ // do nothing
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabel.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabel.java
new file mode 100644
index 00000000000..897026004b4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabel.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Simply shows the label name and nothing else. No storage or value associated with this widget.
+ *
+ * @author Donald G. Dunne
+ */
+public class XLabel extends XWidget {
+
+ private final String showString;
+
+ public XLabel(String displayLabel) {
+ this(displayLabel, displayLabel);
+ }
+
+ public XLabel(String displayLabel, String showString) {
+ super(displayLabel, "");
+ this.showString = showString;
+ }
+
+ /**
+ * Create Data Widgets. Widgets Created: Data: "--select--" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2 the string "--select--" will be added to the sent in dataStrings array
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ if (horizontalSpan < 2) horizontalSpan = 2;
+ // Create Data Widgets
+ if (!getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ labelWidget.setText(showString);
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return labelWidget;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ return "";
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabelDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabelDam.java
new file mode 100644
index 00000000000..8fa4f6c8969
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XLabelDam.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.framework.ui.skynet.widgets;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Provided to show the contents of an attribute without any ability to edit
+ *
+ * @author Donald G. Dunne
+ */
+public class XLabelDam extends XWidget implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+ private Text valueTextWidget;
+ private Composite parent;
+
+ public XLabelDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ @Override
+ public Control getControl() {
+ return valueTextWidget;
+ }
+
+ protected void createControls(Composite parent, int horizontalSpan) {
+ this.parent = parent;
+ if (horizontalSpan < 2) horizontalSpan = 2;
+ // Create Data Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+ valueTextWidget = new Text(parent, SWT.NONE);
+ valueTextWidget.setEditable(false);
+ refresh();
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+
+ refresh();
+ }
+
+ @Override
+ public void saveToArtifact() {
+ // Do nothing cause labelDam is read-only
+ }
+
+ @Override
+ public Result isDirty() {
+ return Result.FalseResult;
+ }
+
+ public void refresh() {
+ if (artifact != null && valueTextWidget != null && !valueTextWidget.isDisposed()) {
+ try {
+ valueTextWidget.setText(artifact.getAttributesToString(attributeTypeName));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public void dispose() {
+ if (labelWidget != null) labelWidget.dispose();
+ if (valueTextWidget != null) valueTextWidget.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return valueTextWidget.getText();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() {
+ // Do nothing cause labelDam is read-only
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java
new file mode 100644
index 00000000000..7c0e9097c25
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java
@@ -0,0 +1,488 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Rectangle;
+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.swt.widgets.List;
+import org.eclipse.swt.widgets.Menu;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XList extends XWidget {
+
+ public class XListItem {
+ private String name = "";
+ private String xmlValue = null;
+ private Object data = null;
+ private boolean selected = false;
+
+ public XListItem(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ public void setSelected(boolean selected) {
+ this.selected = selected;
+ }
+
+ public String getXmlValue() {
+ return xmlValue;
+ }
+
+ public void setXmlValue(String xmlValue) {
+ this.xmlValue = xmlValue;
+ }
+ }
+
+ private List listList;
+ private Menu listMenu;
+ private Composite parent;
+ private Composite composite;
+ private final Map<String, XListItem> items = new HashMap<String, XListItem>();
+ private int requiredMinSelected = 0;
+ private int requiredMaxSelected = 0;
+ private boolean grabHorizontal = false;
+
+ protected SelectionListener listListener = new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ handleSelection();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ };
+
+ public XList(String displayLabel) {
+ this(displayLabel, "list", "");
+ }
+
+ public XList() {
+ this("List", "list", "");
+ }
+
+ public XList(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ listMenu = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return listList;
+ }
+
+ /**
+ * @param listMenu The listMenu to set.
+ */
+ public void setListMenu(Menu listMenu) {
+ this.listMenu = listMenu;
+ }
+
+ /**
+ * Create List Widgets. Widgets Created: List: horizonatalSpan takes up 2 columns; horizontalSpan must be >=2
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ this.parent = parent;
+ composite = null;
+
+ if (!verticalLabel && (horizontalSpan < 2)) {
+ horizontalSpan = 2;
+ } else if (verticalLabel) {
+ horizontalSpan = 1;
+ }
+
+ if (isDisplayLabel() && verticalLabel) {
+ composite = new Composite(parent, SWT.NONE);
+ int numColumns = 1;
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = numColumns;
+ composite.setLayout(gridLayout);
+ GridData gd =
+ new GridData(
+ GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+ gd.horizontalSpan = horizontalSpan;
+ composite.setLayoutData(gd);
+ } else {
+ composite = parent;
+ }
+
+ // Create List Widgets
+ if (isDisplayLabel()) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ listList = new List(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
+ String array[] = items.keySet().toArray(new String[items.size()]);
+ java.util.Arrays.sort(array);
+ listList.setMenu(listMenu);
+ listList.setItems(array);
+ GridData gridData5 = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
+ gridData5.verticalSpan = 10;
+ if (grabHorizontal) {
+ gridData5.grabExcessHorizontalSpace = true;
+ }
+ int listHeight = listList.getItemHeight() * 6;
+ Rectangle trim = listList.computeTrim(0, 0, 0, listHeight);
+ gridData5.heightHint = trim.height;
+ gridData5.grabExcessVerticalSpace = true;
+ listList.setLayoutData(gridData5);
+ listList.addSelectionListener(listListener);
+ updateListWidget();
+ listList.setEnabled(isEditable());
+
+ }
+
+ @Override
+ public void dispose() {
+ labelWidget.dispose();
+ listList.dispose();
+ if (composite != parent) composite.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /**
+ * Don't need this since overriding toReport and toXml
+ */
+ @Override
+ public String getXmlData() {
+ return "";
+ }
+
+ /**
+ * Don't need this since overriding setFromXml
+ */
+ @Override
+ public void setXmlData(String str) {
+ return;
+ }
+
+ private void handleSelection() {
+ String sels[] = listList.getSelection();
+ for (XListItem xItem : items.values())
+ xItem.setSelected(false);
+ for (String sel : sels) {
+ XListItem xItem = items.get(sel);
+ if (xItem != null) xItem.setSelected(true);
+ }
+ validate();
+
+ notifyXModifiedListeners();
+ }
+
+ @Override
+ public void refresh() {
+ updateListWidget();
+ }
+
+ public void addSelectionListener(SelectionListener selectionListener) {
+ listList.addSelectionListener(selectionListener);
+ }
+
+ public Set<XListItem> getSelected() {
+ Set<XListItem> sel = new HashSet<XListItem>();
+ for (XListItem xItem : items.values()) {
+ if (xItem.isSelected()) sel.add(xItem);
+ }
+ return sel;
+ }
+
+ @Override
+ public void setFromXml(String xml) {
+ Matcher inner, outter;
+ String outterXml;
+ items.clear();
+ outter =
+ Pattern.compile("<" + getXmlRoot() + ">(.*?)</" + getXmlRoot() + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xml);
+ while (outter.find()) {
+ outterXml = outter.group(1);
+ inner = Pattern.compile("<" + getXmlSubRoot() + ">(.*?)</" + getXmlSubRoot() + ">").matcher(outterXml);
+ while (inner.find()) {
+ String str = inner.group(1);
+ XListItem xItem = getByXmlName(str);
+ if (xItem != null)
+ xItem.setSelected(true);
+ else {
+ xItem = add(str);
+ xItem.setSelected(true);
+ }
+ }
+ }
+ refresh();
+ }
+
+ public List getList() {
+ return listList;
+ }
+
+ public XListItem get(String name) {
+ return items.get(name);
+ }
+
+ public String getSelectedStr() {
+ StringBuffer sb = new StringBuffer();
+ for (XListItem item : getSelected())
+ sb.append(item.getName() + ", ");
+ return sb.toString().replaceFirst(", $", "");
+ }
+
+ public Collection<String> getSelectedStrs() {
+ Set<String> selected = new HashSet<String>();
+ for (XListItem item : getSelected()) {
+ selected.add(item.getName());
+ }
+ return selected;
+ }
+
+ public XListItem getByXmlName(String xmlName) {
+ for (XListItem xItem : items.values()) {
+ if (xItem.xmlValue.equals(xmlName)) return xItem;
+ }
+ return null;
+ }
+
+ protected void updateListWidget() {
+ if (listList == null || listList.isDisposed()) return;
+ String listItems[] = listList.getItems();
+ Set<String> listItemsSet = new HashSet<String>();
+ Set<String> selected = new HashSet<String>();
+ for (String listItem : listItems)
+ listItemsSet.add(listItem);
+ if (listList != null) {
+ listList.deselectAll();
+ for (XListItem xItem : items.values()) {
+ if (!listItemsSet.contains(xItem.getName())) {
+ listList.add(xItem.getName());
+ if (xItem.isSelected()) selected.add(xItem.getName());
+ } else if (xItem.isSelected()) selected.add(xItem.getName());
+ }
+ listList.setSelection(selected.toArray(new String[selected.size()]));
+ validate();
+ }
+ }
+
+ public XListItem add(String name) {
+ XListItem xItem = new XListItem(name);
+ items.put(name, xItem);
+ return xItem;
+ }
+
+ public void add(String[] names) {
+ for (String name : names) {
+ add(name);
+ }
+ }
+
+ public void add(Collection<String> names) {
+ for (String name : names) {
+ add(name);
+ }
+ }
+
+ public void addSelected(String name) {
+ XListItem xItem = get(name);
+ if (xItem != null)
+ xItem.setSelected(true);
+ else {
+ xItem = add(name);
+ xItem.setSelected(true);
+ }
+ updateListWidget();
+ }
+
+ public void setSelected(String name) {
+ setSelected(Arrays.asList(name));
+ updateListWidget();
+ }
+
+ public void setSelected(Collection<String> names) {
+ ArrayList<String> handledNames = new ArrayList<String>();
+ for (Entry<String, XListItem> entry : items.entrySet()) {
+ if (names.contains(entry.getKey())) {
+ entry.getValue().selected = true;
+ handledNames.add(entry.getKey());
+ } else
+ entry.getValue().selected = false;
+ }
+ for (String name : names) {
+ if (!handledNames.contains(name)) {
+ XListItem item = new XListItem(name);
+ item.selected = true;
+ items.put(name, item);
+ }
+ }
+ updateListWidget();
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (!isRequiredEntry()) return Status.OK_STATUS;
+ int size = getSelected().size();
+ if (requiredMaxSelected != 0) {
+ if ((size >= requiredMinSelected) && (size <= requiredMaxSelected)) {
+ return Status.OK_STATUS;
+ } else if (size < requiredMinSelected)
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ getLabel() + " must have at least " + requiredMinSelected + " selected.");
+ else if (size < requiredMaxSelected)
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ getLabel() + " should only have " + requiredMaxSelected + " selected.");
+ else
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, getLabel());
+ }
+ if (size == 0) return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, getLabel() + " must be selected.");
+ return Status.OK_STATUS;
+ }
+
+ /**
+ * Minimum number of selected items that makes this widget valid
+ *
+ * @param minSelected -
+ * @param maxSelected -
+ */
+ public void setRequiredSelected(int minSelected, int maxSelected) {
+ this.requiredMinSelected = minSelected;
+ this.requiredMaxSelected = maxSelected;
+ setRequiredEntry(true);
+ }
+
+ @Override
+ public void setRequiredEntry(boolean requiredEntry) {
+ super.setRequiredEntry(requiredEntry);
+ if (!requiredEntry) {
+ this.requiredMinSelected = 1;
+ this.requiredMaxSelected = 1;
+ }
+ }
+
+ @Override
+ public String getReportData() {
+ String s = "\n";
+ for (XListItem xItem : getSelected()) {
+ s = s + " - " + xItem + "\n";
+ }
+ s = s.replaceAll("\n+$", "");
+ return s;
+ }
+
+ @Override
+ public String toXml() {
+ return toXml(getXmlRoot(), getXmlSubRoot());
+ }
+
+ @Override
+ public String toXml(String xmlRoot, String xmlSubRoot) {
+ String s = "<" + xmlRoot + ">\n";
+ for (XListItem xItem : getSelected()) {
+ String dataStr;
+ if (xItem.getXmlValue() != null) {
+ dataStr = xItem.getXmlValue();
+ } else {
+ dataStr = xItem.getName();
+ }
+ s = s + " <" + xmlSubRoot + ">" + dataStr + "</" + xmlSubRoot + ">\n";
+ }
+ s = s + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ String s = "<dl><dt>" + AHTML.getLabelStr(labelFont, getLabel() + ": ") + "<dt><ul type=\"disc\">";
+ for (XListItem xItem : getSelected()) {
+ s += "<li>" + xItem;
+ }
+
+ return s + "</ul></dl>";
+ }
+
+ /**
+ * @param grabHorizontal The grabHorizontal to set.
+ */
+ public void setGrabHorizontal(boolean grabHorizontal) {
+ this.grabHorizontal = grabHorizontal;
+ }
+
+ protected void clearAll() {
+ if (listList != null) listList.removeAll();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return getSelected();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDam.java
new file mode 100644
index 00000000000..1ec6999fa22
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDam.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.framework.ui.skynet.widgets;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XListDam extends XList implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ /**
+ * @param displayLabel
+ */
+ public XListDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attrName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attrName;
+ super.setSelected(getStoredStrs());
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ artifact.setAttributeValues(attributeTypeName, getSelectedStrs());
+ }
+
+ public Collection<String> getStoredStrs() throws OseeCoreException {
+ return artifact.getAttributesToStringList(attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ Collection<String> enteredValues = getSelectedStrs();
+ Collection<String> storedValues = getStoredStrs();
+ if (!Collections.isEqual(enteredValues, storedValues)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (NumberFormatException ex) {
+ // do nothing
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDropViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDropViewer.java
new file mode 100644
index 00000000000..049fc800849
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListDropViewer.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class XListDropViewer extends XListViewer {
+ private MenuItem removeFromMenuItem;
+ private TableViewer myTableViewer;
+ private ArrayContentProvider myArrayContentProvider = null;
+ private ArtifactLabelProvider myArtifactLabelProvider = null;
+
+ /**
+ * @param displayLabel
+ */
+ public XListDropViewer(String displayLabel) {
+ super(displayLabel);
+ this.myArrayContentProvider = new ArrayContentProvider();
+ setContentProvider(this.myArrayContentProvider);
+ this.myArtifactLabelProvider = new ArtifactLabelProvider();
+ setLabelProvider(this.myArtifactLabelProvider);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XListViewer#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ Menu popupMenu = new Menu(parent);
+ setMultiSelect(true);
+ super.setListMenu(popupMenu);
+ super.createControls(parent, horizontalSpan);
+ new XDragAndDrop();
+ this.myTableViewer = super.getTableViewer();
+ // popupMenu.addMenuListener(new MenuEnablingListener());
+ createRemoveFromMenuItem(popupMenu);
+ myTableViewer.getTable().setMenu(popupMenu);
+ }
+
+ private void createRemoveFromMenuItem(Menu popupMenu) {
+ removeFromMenuItem = new MenuItem(popupMenu, SWT.PUSH);
+ removeFromMenuItem.setText("Remove From This Blam's Parameters ");
+ removeFromMenuItem.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent event) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) myTableViewer.getSelection();
+ Iterator<?> iterator = structuredSelection.iterator();
+
+ Object orginalInput = getInput();
+ Collection<Object> modList = getCollectionInput();
+
+ while (iterator.hasNext()) {
+ modList.remove(iterator.next());
+ }
+
+ myArrayContentProvider.inputChanged(myTableViewer, orginalInput, modList);
+ refresh();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent ev) {
+ }
+ });
+ }
+
+ /**
+ * Adds artifacts to the viewer's input.
+ *
+ * @param artifacts
+ */
+ public void addToInput(Artifact... artifacts) {
+ ArrayList<Object> objects = new ArrayList<Object>();
+
+ for (Artifact artifact : artifacts) {
+ objects.add((Object) artifact);
+ }
+
+ if (getInput() == null) {
+ setInput(objects);
+ } else {
+ add(objects);
+ updateListWidget();
+ }
+ notifyXModifiedListeners();
+ }
+
+ @Override
+ public Object getData() {
+ return getInput();
+ }
+
+ private class XDragAndDrop extends SkynetDragAndDrop {
+ public XDragAndDrop() {
+ super(null, getControl(), "viewId");
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ event.detail = DND.DROP_COPY;
+ }
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ return null;
+ }
+
+ @Override
+ public void performArtifactDrop(Artifact[] dropArtifacts) {
+ addToInput(dropArtifacts);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListViewer.java
new file mode 100644
index 00000000000..1e49a1f8787
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListViewer.java
@@ -0,0 +1,406 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XListViewer extends XWidget {
+
+ // XListViewer uses a table so images can be used. SWT doesn't support images in ListViewer
+ private TableViewer listViewer;
+ private Menu listMenu;
+ private Composite parent;
+ private Composite composite;
+ private int requiredMinSelected = 0;
+ private int requiredMaxSelected = 0;
+ private boolean grabHorizontal = false;
+ private boolean multiSelect = false;
+ private Object defaultSelectedObject;
+
+ protected SelectionListener listListener = new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ handleSelection();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ };
+ private Collection<Object> input;
+ private IContentProvider contentProvider;
+ private ILabelProvider labelProvider;
+ private ViewerSorter sorter;
+ private int widthHint;
+ private int heightHint;
+
+ public XListViewer(String displayLabel) {
+ this(displayLabel, "list", "");
+ }
+
+ public XListViewer() {
+ this("List", "list", "");
+ }
+
+ public XListViewer(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ listMenu = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return listViewer.getControl();
+ }
+
+ /**
+ * @param listMenu The listMenu to set.
+ */
+ public void setListMenu(Menu listMenu) {
+ this.listMenu = listMenu;
+ }
+
+ public void setContentProvider(IContentProvider contentProvider) {
+ this.contentProvider = contentProvider;
+ }
+
+ public void setLabelProvider(ILabelProvider labelProvider) {
+ this.labelProvider = labelProvider;
+ if (listViewer != null) listViewer.setLabelProvider(labelProvider);
+ }
+
+ public void setSorter(ViewerSorter sorter) {
+ this.sorter = sorter;
+ }
+
+ public void setInput(Collection<Object> input) {
+ this.input = input;
+ if (listViewer != null) listViewer.setInput(input);
+ }
+
+ /**
+ * @param input
+ */
+ public void setInput(Object input) {
+ if (listViewer != null) listViewer.setInput(input);
+ }
+
+ public Object getInput() {
+ return listViewer.getInput();
+ }
+
+ public Collection<Object> getCollectionInput() {
+ return input;
+ }
+
+ public void setInputArtifacts(Collection<? extends Artifact> arts) {
+ ArrayList<Object> objs = new ArrayList<Object>();
+ objs.addAll(arts);
+ setInput(objs);
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ listViewer.addSelectionChangedListener(listener);
+ }
+
+ public void setHints(int widthHint, int heightHint) {
+ this.widthHint = widthHint;
+ this.heightHint = heightHint;
+ }
+
+ /**
+ * Create List Widgets. Widgets Created: List: horizonatalSpan takes up 2 columns; horizontalSpan must be >=2
+ */
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ this.parent = parent;
+ composite = null;
+
+ if (!verticalLabel && (horizontalSpan < 2))
+ horizontalSpan = 2;
+ else if (verticalLabel) horizontalSpan = 1;
+
+ if (isDisplayLabel() && verticalLabel) {
+ composite = new Composite(parent, SWT.NONE);
+ // composite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_CYAN));
+ composite.setLayout(new GridLayout(1, false));
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 2;
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = true;
+ composite.setLayoutData(gd);
+ } else {
+ composite = parent;
+ }
+
+ // Create List Widgets
+ if (isDisplayLabel()) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ listViewer =
+ new TableViewer(composite,
+ (multiSelect ? SWT.MULTI : SWT.SINGLE) | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+ listViewer.setContentProvider(contentProvider);
+ listViewer.setLabelProvider(labelProvider);
+ if (sorter != null) listViewer.setSorter(sorter);
+ listViewer.setInput(input);
+ listViewer.getTable().setMenu(listMenu);
+ listViewer.getTable().addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ handleSelection();
+ }
+ });
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.verticalSpan = 10;
+ if (grabHorizontal) {
+ gd.grabExcessHorizontalSpace = true;
+ }
+ if (widthHint > 0) gd.widthHint = widthHint;
+ if (heightHint > 0) gd.heightHint = heightHint;
+ gd.grabExcessVerticalSpace = true;
+ listViewer.getTable().setLayoutData(gd);
+ listViewer.getTable().addSelectionListener(listListener);
+
+ if (defaultSelectedObject != null) {
+ setSelected(defaultSelectedObject);
+ }
+ updateListWidget();
+ }
+
+ @Override
+ public void dispose() {
+ labelWidget.dispose();
+ listViewer.getTable().dispose();
+ if (composite != null && !composite.isDisposed()) composite.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ public void setFocus() {
+ }
+
+ /**
+ * Don't need this since overriding toReport and toXml
+ */
+ public String getXmlData() {
+ return "";
+ }
+
+ /**
+ * Don't need this since overriding setFromXml
+ */
+ public void setXmlData(String str) {
+ return;
+ }
+
+ private void handleSelection() {
+ validate();
+ notifyXModifiedListeners();
+ }
+
+ public void refresh() {
+ updateListWidget();
+ }
+
+ public void addSelectionListener(SelectionListener selectionListener) {
+ listViewer.getTable().addSelectionListener(selectionListener);
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<Object> getSelected() {
+ ArrayList<Object> selected = new ArrayList<Object>();
+ IStructuredSelection selection = (IStructuredSelection) listViewer.getSelection();
+ Iterator i = selection.iterator();
+ while (i.hasNext()) {
+ selected.add(i.next());
+ }
+ return selected;
+ }
+
+ public void setFromXml(String xml) {
+ }
+
+ public Table getTable() {
+ return listViewer.getTable();
+ }
+
+ public TableViewer getTableViewer() {
+ return listViewer;
+ }
+
+ protected void updateListWidget() {
+ listViewer.refresh();
+ validate();
+ }
+
+ public void add(Object object) {
+ if (!input.contains(object)) {
+ input.add(object);
+ }
+ }
+
+ public void add(Object[] objects) {
+ for (Object object : objects) {
+ add(object);
+ }
+ }
+
+ public void add(Collection<Object> objects) {
+ // to ensure no duplicates
+ input.removeAll(objects);
+
+ if (!input.containsAll(objects)) {
+ input.addAll(objects);
+ }
+ }
+
+ public void setSelected(ArrayList<Object> selected) {
+ setSelected(new StructuredSelection(selected.toArray(new Object[selected.size()])));
+ }
+
+ public void setSelected(Object selected) {
+ setSelected(new StructuredSelection(selected));
+ }
+
+ private void setSelected(StructuredSelection selection) {
+ listViewer.setSelection(selection);
+ updateListWidget();
+ }
+
+ public IStatus isValid() {
+ if (!isRequiredEntry()) return Status.OK_STATUS;
+ int size = getSelected().size();
+ if (requiredMaxSelected != 0) {
+ if ((size >= requiredMinSelected) && (size <= requiredMaxSelected)) {
+ return Status.OK_STATUS;
+ } else if (size < requiredMinSelected)
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ getLabel() + " must have at least " + requiredMinSelected + " selected.");
+ else if (size < requiredMaxSelected)
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ getLabel() + " should only have " + requiredMaxSelected + " selected.");
+ else
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, getLabel());
+ }
+ if (size == 0) return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, getLabel() + " must be selected.");
+ return Status.OK_STATUS;
+
+ }
+
+ /**
+ * Minimum number of selected items that makes this widget valid
+ *
+ * @param minSelected -
+ * @param maxSelected =
+ */
+ public void setRequiredSelected(int minSelected, int maxSelected) {
+ this.requiredMinSelected = minSelected;
+ this.requiredMaxSelected = maxSelected;
+ setRequiredEntry(true);
+ }
+
+ @Override
+ public void setRequiredEntry(boolean requiredEntry) {
+ super.setRequiredEntry(requiredEntry);
+ if (!requiredEntry) {
+ this.requiredMinSelected = 1;
+ this.requiredMaxSelected = 1;
+ }
+ }
+
+ public String getReportData() {
+ String s = "\n";
+ for (Object obj : getSelected()) {
+ s = s + " - " + obj + "\n";
+ }
+ s = s.replaceAll("\n+$", "");
+ return s;
+ }
+
+ public String toXml() {
+ return toXml(getXmlRoot(), getXmlSubRoot());
+ }
+
+ public String toXml(String xmlRoot, String xmlSubRoot) {
+ return "";
+ }
+
+ public String toHTML(String labelFont) {
+ String s = "<dl><dt>" + AHTML.getLabelStr(labelFont, getLabel() + ": ") + "<dt><ul type=\"disc\">";
+ for (Object xItem : getSelected()) {
+ s += "<li>" + xItem;
+ }
+
+ return s + "</ul></dl>";
+ }
+
+ /**
+ * @param grabHorizontal The grabHorizontal to set.
+ */
+ public void setGrabHorizontal(boolean grabHorizontal) {
+ this.grabHorizontal = grabHorizontal;
+ }
+
+ public boolean isMultiSelect() {
+ return multiSelect;
+ }
+
+ public void setMultiSelect(boolean multiSelect) {
+ this.multiSelect = multiSelect;
+ }
+
+ @Override
+ public Object getData() {
+ return getSelected();
+ }
+
+ public void setDefaultSelected(Object defaultSelectedObject) {
+ this.defaultSelectedObject = defaultSelectedObject;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersCombo.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersCombo.java
new file mode 100644
index 00000000000..c1c296c669f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersCombo.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.framework.ui.skynet.widgets;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.Search;
+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.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XMembersCombo extends XWidget {
+ private static final String DEFAULT_SELECTION = "--select--";
+ private Combo dataCombo;
+ private Composite composite;
+ private User selectedUser;
+ private Search searchControl;
+
+ public XMembersCombo(String displayLabel) {
+ this(displayLabel, "", "");
+ }
+
+ public XMembersCombo(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ }
+
+ public XMembersCombo(String displayLabel, Collection<User> members) {
+ super(displayLabel, displayLabel, "user");
+ }
+
+ public XMembersCombo(String displayLabel, String xmlRoot) {
+ this(displayLabel, xmlRoot, "");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return dataCombo;
+ }
+
+ public boolean equals(User user) {
+ return user.equals(selectedUser);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof XMembersCombo)
+ return ((XMembersCombo) obj).selectedUser.equals(selectedUser);
+ else
+ return super.equals(obj);
+ }
+
+ public void set(User user) {
+ selectedUser = user;
+ updateComboWidget();
+ }
+
+ @Override
+ public String toString() {
+ return getLabel() + ": *" + get() + "*";
+ }
+
+ /**
+ * Create Data Widgets. Widgets Created: Data: DEFAULT_SELECTION horizonatalSpan takes up 2 columns; horizontalSpan
+ * must be >=2 the string DEFAULT_SELECTION will be added to the sent in dataStrings array
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ composite = parent;
+
+ if (horizontalSpan < 2) horizontalSpan = 2;
+
+ // Create Data Widgets
+ if (!getLabel().equals("")) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ dataCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
+ dataCombo.add(DEFAULT_SELECTION);
+ dataCombo.setData(DEFAULT_SELECTION, null);
+ try {
+ for (User user : UserManager.getUsersSortedByName()) {
+ dataCombo.add(user.getName());
+ dataCombo.setData(user.getName(), user);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ searchControl = new Search(dataCombo.getItems());
+
+ GridData gridData = new GridData();
+ if (fillHorizontally) gridData.grabExcessHorizontalSpace = true;
+ if (fillVertically) gridData.grabExcessVerticalSpace = true;
+ gridData.horizontalSpan = horizontalSpan - 1;
+ dataCombo.setLayoutData(gridData);
+
+ if (dataCombo.getItemCount() > 20) dataCombo.setVisibleItemCount(20);
+
+ dataCombo.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ String selectedUserName = dataCombo.getText();
+ selectedUser = (User) dataCombo.getData(selectedUserName);
+ validate();
+ notifyXModifiedListeners();
+ }
+ });
+
+ dataCombo.addFocusListener(new FocusListener() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ resetSelectionList();
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ }
+ });
+
+ dataCombo.addKeyListener(new KeyAdapter() {
+ // hook key pressed - see PR 14201
+ @Override
+ public void keyPressed(KeyEvent e) {
+ keyReleaseOccured(e);
+ }
+ });
+
+ refresh();
+ dataCombo.setEnabled(isEditable());
+ }
+
+ private void resetSelectionList() {
+ searchControl.reset();
+ dataCombo.setItems(searchControl.getItems());
+ refresh();
+ }
+
+ @Override
+ public void dispose() {
+ if (composite != null && !composite.isDisposed()) composite.dispose();
+ }
+
+ public User getUser() {
+ return selectedUser;
+ }
+
+ public boolean isAssigned() {
+ return selectedUser != null;
+ }
+
+ public boolean isAssigned(User user) {
+ return selectedUser != null && selectedUser.equals(user);
+ }
+
+ @Override
+ public void setEditable(boolean editable) {
+ super.setEditable(editable);
+ if (dataCombo != null && !dataCombo.isDisposed()) dataCombo.setEnabled(editable);
+ }
+
+ @Override
+ public void setFocus() {
+ if (dataCombo != null) dataCombo.setFocus();
+ }
+
+ @Override
+ public void setFromXml(String xml) {
+ Matcher matcher;
+ if (getXmlSubRoot().equals("")) {
+ matcher =
+ Pattern.compile("<" + getXmlRoot() + ">(.*?)</" + getXmlRoot() + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xml);
+ } else {
+ matcher =
+ Pattern.compile(
+ "<" + getXmlRoot() + "><" + getXmlSubRoot() + ">(.*?)</" + getXmlSubRoot() + "></" + getXmlRoot() + ">",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(xml);
+ }
+ while (matcher.find()) {
+ String userId = matcher.group(1);
+ User user = null;
+ try {
+ user = UserManager.getUserByUserId(userId);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ set(user);
+ }
+ refresh();
+ }
+
+ @Override
+ public void refresh() {
+ updateComboWidget();
+ }
+
+ public void addModifyListener(ModifyListener modifyListener) {
+ dataCombo.addModifyListener(modifyListener);
+ }
+
+ public Combo getComboBox() {
+ return dataCombo;
+ }
+
+ /**
+ * @return selected display value (eg. Dunne, Donald G)
+ */
+ public String get() {
+ return selectedUser == null ? "" : selectedUser.getName();
+ }
+
+ @Override
+ public String getReportData() {
+ return get();
+ }
+
+ @Override
+ public String getXmlData() {
+ return get();
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ private void updateComboWidget() {
+ if (dataCombo != null) {
+ int index = 0;
+
+ if (selectedUser != null) {
+ index = dataCombo.indexOf(selectedUser.getName());
+ if (index == -1) {
+ index = 0;
+ }
+ }
+ dataCombo.select(index);
+ }
+ validate();
+ }
+
+ public void clear() {
+ selectedUser = null;
+ updateComboWidget();
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (isRequiredEntry() && !isAssigned()) return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID,
+ "Must select " + getLabel());
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ protected String toXml() throws Exception {
+ return toXml(getXmlRoot());
+ }
+
+ @Override
+ protected String toXml(String xmlRoot) throws Exception {
+ String s;
+ String dataStr = selectedUser.getUserId();
+ if (getXmlSubRoot() == null || getXmlSubRoot().equals("")) {
+ s = "<" + xmlRoot + ">" + dataStr + "</" + xmlRoot + ">\n";
+ } else {
+ s = "<" + xmlRoot + "><" + getXmlSubRoot() + ">" + dataStr + "</" + getXmlSubRoot() + "></" + xmlRoot + ">\n";
+ }
+ return s;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + get();
+ }
+
+ protected void keyReleaseOccured(KeyEvent keyEvent) {
+ if (keyEvent.character != 0x00 && keyEvent.character != SWT.CR) {
+ searchControl.progressiveSearch(keyEvent);
+ if (searchControl.getDirty()) {
+ dataCombo.setItems(searchControl.getItems());
+ searchControl.setDirty(false);
+ refresh();
+ }
+ }
+ // If delete key pressed, reset
+ if (keyEvent.character == SWT.DEL || keyEvent.character == SWT.BS || keyEvent.character == SWT.ESC) {
+ resetSelectionList();
+ }
+ }
+
+ @Override
+ public Object getData() {
+ return selectedUser;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersList.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersList.java
new file mode 100644
index 00000000000..b4d883dd5b8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMembersList.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.framework.ui.skynet.widgets;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.skynet.ArtifactLabelProvider;
+
+/**
+ * Set a AList with the members as the selections
+ *
+ * @author Donald G. Dunne
+ */
+public class XMembersList extends XListViewer {
+
+ public XMembersList() throws OseeCoreException {
+ this("MList", "", "");
+ }
+
+ public XMembersList(String displayLabel) throws OseeCoreException {
+ this(displayLabel, "", "");
+ }
+
+ public XMembersList(String displayLabel, String xmlRoot, String xmlSubRoot) throws OseeCoreException {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ super.setLabelProvider(new ArtifactLabelProvider());
+ super.setContentProvider(new ArrayContentProvider());
+ super.setInputArtifacts(UserManager.getUsersSortedByName());
+ }
+
+ public String[] getEmails() throws OseeCoreException {
+ ArrayList<String> v = new ArrayList<String>();
+ for (Object obj : this.getSelected()) {
+ User u = (User) obj;
+ String name = u.getName();
+ String email = u.getEmail();
+ if (!email.equals(""))
+ v.add(email);
+ else
+ v.add(name);
+ }
+ return (v.toArray(new String[0]));
+ }
+
+ public ArrayList<User> getUsers() {
+ ArrayList<User> v = new ArrayList<User>();
+
+ for (Object obj : this.getSelected()) {
+ v.add((User) obj);
+ }
+ return v;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XModifiedListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XModifiedListener.java
new file mode 100644
index 00000000000..8bd01a76947
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XModifiedListener.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.framework.ui.skynet.widgets;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface XModifiedListener {
+
+ public void widgetModified(XWidget widget);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidget.java
new file mode 100644
index 00000000000..f879ba44b6c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidget.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+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;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XMultiXWidget extends XWidget {
+
+ protected List<XWidget> xWidgets = new ArrayList<XWidget>();
+ protected XMultiXWidgetFactory xMultiXWidgetFactory;
+ protected Group group;
+ protected int horizontalSpan;
+
+ /**
+ * @param label
+ */
+ public XMultiXWidget(String label, XMultiXWidgetFactory xMultiXWidgetFactory) {
+ super(label);
+ this.xMultiXWidgetFactory = xMultiXWidgetFactory;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ this.horizontalSpan = horizontalSpan;
+ // parent.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ group = new Group(parent, SWT.NONE);
+ if (toolkit != null) toolkit.adapt(group);
+ // group.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
+ group.setLayout(new GridLayout(2, false));
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ gridData.horizontalSpan = horizontalSpan;
+ group.setLayoutData(gridData);
+ if (isDisplayLabel()) group.setText(getLabel() + "(s): ");
+
+ // Create add label / icon
+ Label addLabel = new Label(group, SWT.NONE);
+ if (toolkit != null) toolkit.adapt(addLabel, true, true);
+ Image image = SkynetGuiPlugin.getInstance() != null ? ImageManager.getImage(FrameworkImage.ADD_GREEN) : null;
+ if (image != null)
+ addLabel.setImage(image);
+ else
+ addLabel.setText("add");
+ addLabel.setToolTipText("Add New \"" + getLabel() + "\"");
+ addLabel.addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ handleAddXWidget();
+ };
+ });
+
+ // Create xWidget lines
+ for (final XWidget xWidget : xWidgets) {
+ createWidgetControlComposite(xWidget, group, 2);
+ }
+ }
+
+ protected void handleAddXWidget() {
+ System.out.println("Add widget ");
+ XWidget xWidget = xMultiXWidgetFactory.addXWidget();
+ createWidgetControlComposite(xWidget, group, 2);
+ if (!xWidgets.contains(xWidget)) xWidgets.add(xWidget);
+ xWidget.addXModifiedListener(xModifiedListener);
+ group.layout();
+ group.getParent().layout();
+ notifyXModifiedListeners();
+ }
+
+ XModifiedListener xModifiedListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ notifyXModifiedListeners();
+ };
+ };
+
+ private void createWidgetControlComposite(final XWidget xWidget, final Composite parent, int horizontalSpan) {
+ final Composite controlComp = new Composite(parent, SWT.NONE);
+ controlComp.setLayout(ALayout.getZeroMarginLayout(4, false));
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ gridData.horizontalSpan = 2;
+ controlComp.setLayoutData(gridData);
+ if (toolkit != null) toolkit.adapt(controlComp);
+
+ // Add delete label / icon
+ Label deleteLabel = new Label(controlComp, SWT.NONE);
+ if (toolkit != null) toolkit.adapt(deleteLabel, true, true);
+ Image image = SkynetGuiPlugin.getInstance() != null ? SkynetGuiPlugin.getInstance().getImage("delete.gif") : null;
+ if (image != null)
+ deleteLabel.setImage(image);
+ else
+ deleteLabel.setText("delete");
+ deleteLabel.setToolTipText("Delete \"" + getLabel() + "\"");
+ deleteLabel.addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event event) {
+ System.out.println("Delete widget " + xWidget);
+ xWidgets.remove(xWidget);
+ xWidget.dispose();
+ controlComp.dispose();
+ parent.layout();
+ group.layout();
+ group.getParent().layout();
+ notifyXModifiedListeners();
+ };
+ });
+
+ // Add Widget
+ xWidget.setFillHorizontally(true);
+ xWidget.createWidgets(controlComp, 1);
+
+ }
+
+ public void addXWidget(XWidget xWidget) {
+ xWidgets.add(xWidget);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ for (XWidget xWidget : xWidgets) {
+ xWidget.dispose();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ for (XWidget xWidget : xWidgets) {
+ IStatus status = xWidget.isValid();
+ if (!status.isOK()) {
+ return status;
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ for (XWidget xWidget : xWidgets) {
+ xWidget.refresh();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ if (xWidgets.size() > 0) xWidgets.iterator().next().setFocus();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ return null;
+ }
+
+ /**
+ * @return the xWidgets
+ */
+ public List<XWidget> getXWidgets() throws Exception {
+ return xWidgets;
+ }
+
+ /**
+ * @param widgets the xWidgets to set
+ */
+ public void setXWidgets(List<XWidget> widgets) {
+ xWidgets = widgets;
+ }
+
+ /**
+ * @param multiXWidgetFactory the xMultiXWidgetFactory to set
+ */
+ public void setXMultiXWidgetFactory(XMultiXWidgetFactory multiXWidgetFactory) {
+ xMultiXWidgetFactory = multiXWidgetFactory;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetDam.java
new file mode 100644
index 00000000000..437cfed1fbb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class XMultiXWidgetDam extends XMultiXWidget implements IArtifactWidget {
+
+ protected Artifact artifact;
+ protected String attributeTypeName;
+
+ public XMultiXWidgetDam(String label) {
+ super(label, null);
+ super.setXMultiXWidgetFactory(xMultiXWidgetFactory);
+ }
+
+ XMultiXWidgetFactory xMultiXWidgetFactory = new XMultiXWidgetFactory() {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetFactory#addXWidget()
+ */
+ @Override
+ public XWidget addXWidget() {
+ return addXWidgetDam();
+ }
+ };
+
+ public void setArtifact(Artifact artifact, String attributeTypeName) {
+ this.artifact = artifact;
+ this.attributeTypeName = attributeTypeName;
+ }
+
+ public abstract void saveToArtifact() throws OseeCoreException;
+
+ public abstract Result isDirty() throws OseeCoreException;
+
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ try {
+ createXWidgets();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ super.createControls(parent, horizontalSpan);
+ }
+
+ /**
+ * Creates the xWidgets widgets off artifact's set attributes that will be used in createWidgets
+ */
+ public abstract void createXWidgets() throws Exception;
+
+ /**
+ * Create new XWidget with default value in response to new attribute request
+ *
+ * @param artifact
+ * @return XWidget
+ */
+ public abstract XWidget addXWidgetDam();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetFactory.java
new file mode 100644
index 00000000000..5fbb71aae7b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetFactory.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.framework.ui.skynet.widgets;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class XMultiXWidgetFactory {
+
+ public abstract XWidget addXWidget();
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetTextDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetTextDam.java
new file mode 100644
index 00000000000..05fc04da676
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetTextDam.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.framework.ui.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XMultiXWidgetTextDam extends XMultiXWidgetDam {
+
+ /**
+ * @param label
+ */
+ public XMultiXWidgetTextDam(String label) {
+ super(label);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetDam#addXWidgetDam()
+ */
+ @Override
+ public XWidget addXWidgetDam() {
+ return addXWidget("", null);
+ }
+
+ public XWidget addXWidget(String label, String defaultValue) {
+ XText xTextWidget = new XText(label);
+ xTextWidget.addXTextSpellModifyDictionary(new SkynetSpellModifyDictionary());
+ if (Strings.isValid(defaultValue)) {
+ xTextWidget.setText(defaultValue);
+ }
+ xTextWidget.setFillHorizontally(true);
+ if (!xWidgets.contains(xTextWidget)) {
+ xWidgets.add(xTextWidget);
+ }
+ xTextWidget.addXModifiedListener(xModifiedListener);
+ return xTextWidget;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetDam#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ List<String> enteredValues = getEnteredValues();
+ List<String> storedValues = artifact.getAttributesToStringList(attributeTypeName);
+ if (!Collections.isEqual(enteredValues, storedValues)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ return Result.FalseResult;
+ }
+
+ public List<String> getEnteredValues() {
+ List<String> values = new ArrayList<String>();
+ for (XWidget xWidget : xWidgets) {
+ values.add(((XText) xWidget).get());
+ }
+ return values;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetDam#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ artifact.setAttributeValues(attributeTypeName, getEnteredValues());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetDam#createXWidgets()
+ */
+ @Override
+ public void createXWidgets() throws Exception {
+ xWidgets.clear();
+ for (String value : artifact.getAttributesToStringList(attributeTypeName)) {
+ addXWidget("", value);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetXTextTest.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetXTextTest.java
new file mode 100644
index 00000000000..0a862f23922
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XMultiXWidgetXTextTest.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.framework.ui.skynet.widgets;
+
+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.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class XMultiXWidgetXTextTest extends Composite {
+
+ public XMultiXWidgetXTextTest(Composite parent, int style) {
+ super(parent, style);
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(1, true));
+ composite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ final XMultiXWidget multiWidget = new XMultiXWidget("Multiple Text Entries", new XMultiXWidgetFactory() {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetFactory#addXWidget()
+ */
+ @Override
+ public XWidget addXWidget() {
+ return createXTextWidget("New", "");
+ }
+ });
+
+ for (String str : new String[] {"first", "second", "third"}) {
+ multiWidget.addXWidget(createXTextWidget("XText " + str, "Value " + str));
+ }
+
+ multiWidget.createWidgets(composite, 1);
+ multiWidget.addXModifiedListener(new XModifiedListener() {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener#widgetModified(org.eclipse.osee.framework.ui.skynet.widgets.XWidget)
+ */
+ @Override
+ public void widgetModified(XWidget widget) {
+ System.out.println("Widget Modified");
+ }
+ });
+ }
+
+ public XText createXTextWidget(String name, String value) {
+ XText firstText = new XText(name);
+ firstText.addXTextSpellModifyDictionary(new SkynetSpellModifyDictionary());
+ firstText.setText(value);
+ firstText.setFillHorizontally(true);
+ return firstText;
+ }
+
+ public static void main(String[] args) {
+ Display Display_1 = Display.getDefault();
+ Shell Shell_1 = new Shell(Display_1, SWT.SHELL_TRIM);
+ Shell_1.setBounds(0, 0, 300, 300);
+ Shell_1.setLayout(new GridLayout());
+ Shell_1.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ new XMultiXWidgetXTextTest(Shell_1, SWT.NONE);
+
+ Shell_1.open();
+ while (!Shell_1.isDisposed()) {
+ if (!Display_1.readAndDispatch()) {
+ Display_1.sleep();
+ }
+ }
+
+ Display_1.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java
new file mode 100644
index 00000000000..5e929a324c4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.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.framework.ui.skynet.widgets;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum XOption {
+ NONE,
+
+ REQUIRED,
+ NOT_REQUIRED,
+ ENABLED,
+ NOT_ENABLED,
+ EDITABLE,
+ NOT_EDITABLE,
+ MULTI_SELECT,
+ HORIZONTAL_LABEL,
+ VERTICAL_LABEL,
+ LABEL_AFTER,
+ LABEL_BEFORE,
+ NO_LABEL,
+ ADD_DEFAULT_VALUE,
+ NO_DEFAULT_VALUE,
+ BEGIN_COMPOSITE_4,
+ BEGIN_COMPOSITE_6,
+ BEGIN_COMPOSITE_8,
+ BEGIN_COMPOSITE_10,
+ END_COMPOSITE,
+
+ // Fill Options
+ FILL_NONE,
+ FILL_HORIZONTALLY,
+ FILL_VERTICALLY,
+
+ // Align Options
+ ALIGN_LEFT,
+ ALIGN_RIGHT,
+ ALIGN_CENTER;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java
new file mode 100644
index 00000000000..5a84b110012
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.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.framework.ui.skynet.widgets;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XOptionHandler {
+
+ private Set<XOption> xOptions = new HashSet<XOption>();
+
+ public XOptionHandler(XOption... xOption) {
+ set(xOption);
+ }
+
+ public static Collection<XOption> getCollection(XOption... ats) {
+ Set<XOption> items = new HashSet<XOption>();
+ for (XOption item : ats) {
+ items.add(item);
+ }
+ return items;
+ }
+
+ public void add(XOption xOption) {
+ if (xOption.name().startsWith("ALIGN_")) {
+ xOptions.remove(XOption.ALIGN_CENTER);
+ xOptions.remove(XOption.ALIGN_LEFT);
+ xOptions.remove(XOption.ALIGN_RIGHT);
+ } else if (xOption == XOption.HORIZONTAL_LABEL) {
+ xOptions.remove(XOption.VERTICAL_LABEL);
+ } else if (xOption == XOption.EDITABLE) {
+ xOptions.remove(XOption.NOT_EDITABLE);
+ } else if (xOption == XOption.NOT_EDITABLE) {
+ xOptions.remove(XOption.EDITABLE);
+ } else if (xOption == XOption.NOT_REQUIRED) {
+ xOptions.remove(XOption.REQUIRED);
+ } else if (xOption == XOption.REQUIRED) {
+ xOptions.remove(XOption.NOT_REQUIRED);
+ } else if (xOption == XOption.NOT_ENABLED) {
+ xOptions.remove(XOption.ENABLED);
+ } else if (xOption == XOption.ENABLED) {
+ xOptions.remove(XOption.NOT_ENABLED);
+ } else if (xOption == XOption.FILL_NONE) {
+ xOptions.remove(XOption.FILL_HORIZONTALLY);
+ xOptions.remove(XOption.FILL_VERTICALLY);
+ } else if (xOption == XOption.VERTICAL_LABEL) {
+ xOptions.remove(XOption.HORIZONTAL_LABEL);
+ }
+ xOptions.add(xOption);
+ }
+
+ public void add(XOption... xOption) {
+ for (XOption xOpt : xOption) {
+ add(xOpt);
+ }
+ }
+
+ public void add(Collection<XOption> xOption) {
+ for (XOption xOpt : xOption) {
+ add(xOpt);
+ }
+ }
+
+ public boolean contains(XOption xOption) {
+ return xOptions.contains(xOption);
+ }
+
+ /**
+ * @return the xOptions
+ */
+ public Set<XOption> getXOptions() {
+ return xOptions;
+ }
+
+ /**
+ * @param options the xOptions to set
+ */
+ public void set(Set<XOption> options) {
+ this.xOptions.clear();
+ // Must go through the add method to ensure values set properly
+ for (XOption xOption : options) {
+ add(xOption);
+ }
+ }
+
+ /**
+ * @param options the xOptions to set
+ */
+ public void set(XOption options[]) {
+ this.xOptions.clear();
+ // Must go through the add method to ensure values set properly
+ for (XOption xOption : options) {
+ add(xOption);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercent.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercent.java
new file mode 100644
index 00000000000..c9d5feca6f1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercent.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XPercent extends XText {
+
+ public XPercent(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public void set(int percent) {
+ super.set(percent + "");
+ }
+
+ public IStatus isValid() {
+ if (isRequiredEntry()) {
+ IStatus result = super.isValid();
+ if (!result.isOK()) {
+ return result;
+ } else if (!this.isInteger()) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Percent must be an Integer");
+ } else if (this.getInteger() < 0 || this.getInteger() > 100) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Percent must be between 0 and 100");
+ }
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercentDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercentDam.java
new file mode 100644
index 00000000000..4f1c5914f33
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XPercentDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+public class XPercentDam extends XIntegerDam {
+
+ public XPercentDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XInteger#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ if (isRequiredEntry()) {
+ IStatus result = super.isValid();
+ if (!result.isOK()) {
+ return result;
+ } else if (!this.isInteger()) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Percent must be an Integer");
+ } else if (this.getInteger() < 0 || this.getInteger() > 100) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, "Percent must be between 0 and 100");
+ }
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButton.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButton.java
new file mode 100644
index 00000000000..7299deba399
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButton.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+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.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Generic label and radiobutton field object for use by single entry artifact attributes
+ *
+ * @author Donald G. Dunne
+ */
+public class XRadioButton extends XWidget {
+
+ private Composite parent;
+ private boolean selected = false;
+ private final String xmlRoot;
+ private Button button;
+ public static enum ButtonType {
+ Check, Radio
+ };
+ private ButtonType buttonType = ButtonType.Radio;
+ private boolean labelAfter;
+
+ public XRadioButton(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ public XRadioButton(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ this.xmlRoot = xmlRoot;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return button;
+ }
+
+ public void setSelected(boolean selected) {
+ this.selected = selected;
+ if (button != null) button.setSelection(selected);
+ }
+
+ public String toString() {
+ return getLabel() + ": " + selected;
+ }
+
+ public void setFromXml(String xml) {
+ Matcher m;
+ m = Pattern.compile("<" + xmlRoot + ">(.*?)</" + xmlRoot + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(xml);
+ if (m.find()) {
+ String str = m.group(1);
+ if (str.equals("true"))
+ setSelected(true);
+ else if (str.equals("false"))
+ setSelected(false);
+ else
+ System.err.println("Unexpected radiobutton value " + str);
+ }
+ refresh();
+ }
+
+ public String getXmlData() {
+ return "" + selected;
+ }
+
+ public String getDisplayStr() {
+ return getXmlData();
+ }
+
+ /**
+ * Don't need this since overriding setFromXml
+ */
+ public void setXmlData(String str) {
+ }
+
+ /**
+ * Create radio Widgets. Widgets Created: Label: "text entry" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2
+ */
+ protected void createControls(Composite parent, int horizontalSpan) {
+ this.parent = parent;
+ // Create Text Widgets
+ if (!isLabelAfter() && isDisplayLabel()) createLabel(parent);
+
+ button = new Button(parent, (buttonType == ButtonType.Check) ? SWT.CHECK : SWT.RADIO);
+ if (getToolTip() != null && !getToolTip().equals("")) button.setToolTipText(getToolTip());
+ if (getToolTip() != null && !getToolTip().equals("")) button.setToolTipText(getToolTip());
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ button.setLayoutData(gd);
+ button.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ Button b = (Button) event.getSource();
+ setSelected(b.getSelection());
+ notifyXModifiedListeners();
+ }
+ });
+ if (isLabelAfter()) createLabel(parent);
+ refresh();
+ }
+
+ public void createLabel(Composite parent) {
+ labelWidget = new Label(parent, SWT.NONE);
+ String str = getLabel();
+ if (!isLabelAfter()) str += ":";
+ labelWidget.setText(str);
+ if (getToolTip() != null && !getToolTip().equals("")) labelWidget.setToolTipText(getToolTip());
+ }
+
+ public void dispose() {
+ button.dispose();
+ if (labelWidget != null) labelWidget.dispose();
+ if (parent != null && !parent.isDisposed()) parent.layout();
+ }
+
+ public void addSelectionListener(SelectionListener selectionListener) {
+ if (button != null) button.addSelectionListener(selectionListener);
+ }
+
+ public void removeSelectionListener(SelectionListener selectionListener) {
+ button.removeSelectionListener(selectionListener);
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ public void refresh() {
+ if (button != null) {
+ button.setSelection(selected);
+ }
+ validate();
+ }
+
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ public String getReportData() {
+ return getXmlData();
+ }
+
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + getDisplayStr();
+ }
+
+ public boolean isLabelAfter() {
+ return labelAfter;
+ }
+
+ /**
+ * @return the buttonType
+ */
+ public ButtonType getButtonType() {
+ return buttonType;
+ }
+
+ /**
+ * @param buttonType the buttonType to set
+ */
+ public void setButtonType(ButtonType buttonType) {
+ this.buttonType = buttonType;
+ }
+
+ /**
+ * @param labelAfter the labelAfter to set
+ */
+ public void setLabelAfter(boolean labelAfter) {
+ this.labelAfter = labelAfter;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return selected;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ button.setFocus();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtonTest.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtonTest.java
new file mode 100644
index 00000000000..7404f34842c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtonTest.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButton.ButtonType;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class XRadioButtonTest extends Composite {
+
+ public XRadioButtonTest(Composite parent, int style) {
+ super(parent, style);
+ Composite c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(2, false));
+ c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ final XRadioButton rb = new XRadioButton("Single Button", "singleButton");
+ rb.createWidgets(c, 2);
+ rb.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb.isSelected() + "*");
+ System.out.println("toXml *" + rb.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(2, false));
+ c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ final XRadioButton rb2 = new XRadioButton("Label After", "labelAfter");
+ rb2.setLabelAfter(true);
+ rb2.createWidgets(c, 2);
+ rb2.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb2.isSelected() + "*");
+ System.out.println("toXml *" + rb2.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(2, false));
+ c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ final XRadioButton rb3 = new XRadioButton("Check Box", "checkBox");
+ rb3.setButtonType(ButtonType.Check);
+ rb3.setLabelAfter(true);
+ rb3.createWidgets(c, 2);
+
+ rb3.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb3.isSelected() + "*");
+ System.out.println("toXml *" + rb3.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(1, false));
+ c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ final XRadioButtons rb4 = new XRadioButtons("Radios", "radios");
+ rb4.addButton("aaaaaa", "First tool tip");
+ rb4.addButton("ccccc", "2nd tool tip");
+ rb4.addButton("bbbbb", "3rd tool tip");
+ rb4.createWidgets(c, 1);
+ rb4.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb4.getXmlData() + "*");
+ System.out.println("toXml *" + rb4.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(2, false));
+
+ rb4.setLabel("Sorted Radios");
+ rb4.setSortNames(true);
+ rb4.createWidgets(c, 7);
+ rb4.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb4.getXmlData() + "*");
+ System.out.println("toXml *" + rb4.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(1, false));
+ final XRadioButtons rb5 = new XRadioButtons("Multi Select", "multiSelect");
+ rb5.addButton("aaaaaa", "First tool tip");
+ rb5.addButton("ddddd", "2nd tool tip");
+ rb5.addButton("fffff", "3rd tool tip");
+ rb5.addButton("bbbb", "3rd tool tip");
+ rb5.addButton("ccccc", "3rd tool tip");
+ rb5.setMultiSelect(true);
+ rb5.createWidgets(c, 11);
+ rb5.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb5.getXmlData() + "*");
+ System.out.println("toXml *" + rb5.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(1, false));
+
+ rb5.setLabel("Sorted Multi Select");
+ rb5.setSortNames(true);
+ rb5.createWidgets(c, 11);
+ rb5.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("isSelected *" + rb5.getXmlData() + "*");
+ System.out.println("toXml *" + rb5.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(1, false));
+ final XRadioButtons rb6 = new XRadioButtons("Multi Select", "multiSelect");
+ rb6.addButtons(new String[] {"a", "k", "b", "c", "l", "d", "e", "m", "f", "g", "h", "i", "j"});
+ rb6.setVertical(true, 7);
+ rb6.setSortNames(true);
+ rb6.setMultiSelect(true);
+ rb6.createWidgets(c, 11);
+ rb6.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
+ };
+
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ try {
+ System.out.println("selected *" + rb6.getXmlData() + "*");
+ System.out.println("toXml *" + rb6.toXml() + "*");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ };
+ });
+
+ }
+
+ public static void main(String[] args) {
+ Display Display_1 = Display.getDefault();
+ Shell Shell_1 = new Shell(Display_1, SWT.SHELL_TRIM);
+ Shell_1.setBounds(0, 0, 500, 500);
+ Shell_1.setLayout(new GridLayout());
+ Shell_1.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ new XRadioButtonTest(Shell_1, SWT.NONE);
+
+ Shell_1.open();
+ while (!Shell_1.isDisposed()) {
+ if (!Display_1.readAndDispatch()) {
+ Display_1.sleep();
+ }
+ }
+
+ Display_1.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtons.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtons.java
new file mode 100644
index 00000000000..e0aa06e26ec
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XRadioButtons.java
@@ -0,0 +1,328 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButton.ButtonType;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+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;
+
+/**
+ * Generic label and radiobutton field object for use by single entry artifact attributes
+ *
+ * @author Donald G. Dunne
+ */
+public class XRadioButtons extends XWidget {
+
+ private Composite comp;
+ private ArrayList<XRadioButton> xButtons = new ArrayList<XRadioButton>();
+ private boolean multiSelect;
+ private boolean vertical;
+ private int verticalColumns;
+ private boolean sortNames;
+
+ public XRadioButtons(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ }
+
+ public void setFocus() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return null;
+ }
+
+ public void addButtons(String items[]) {
+ xButtons.clear();
+ for (String item : items) {
+ xButtons.add(new XRadioButton(item, item));
+ }
+ }
+
+ public void addButton(String item, String toolTip) {
+ XRadioButton rb = new XRadioButton(item, item);
+ rb.setToolTip(toolTip);
+ xButtons.add(rb);
+ // System.out.println("added " + item);
+ }
+
+ public void addButton(String item) {
+ XRadioButton rb = new XRadioButton(item, item);
+ xButtons.add(rb);
+ // System.out.println("added " + item);
+ }
+
+ public void selectAll(boolean selected) {
+ for (XRadioButton rb : xButtons)
+ rb.setSelected(selected);
+ refresh();
+ }
+
+ public XRadioButton getButton(String name) {
+ for (XRadioButton button : xButtons)
+ if (button.getLabel().equals(name)) return button;
+ return null;
+ }
+
+ public void setSelected(String selected[]) {
+ // First, clear out all previous selections
+ selectAll(false);
+ // Set, selected items sent in
+ for (String name : selected) {
+ XRadioButton rb = getButton(name);
+ if (rb != null) rb.setSelected(true);
+ }
+ refresh();
+ }
+
+ public void setSelected(Collection<String> selected) {
+ if (selected != null) setSelected((String[]) selected.toArray(new String[selected.size()]));
+ }
+
+ public void setFromXml(String xml) throws IllegalStateException {
+ selectAll(false);
+ if (!multiSelect)
+ super.setFromXml(xml);
+ else {
+ Matcher m;
+ m =
+ Pattern.compile("<" + getXmlRoot() + ">(.*?)</" + getXmlRoot() + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xml);
+ if (m.find()) {
+ String str = m.group(1);
+ String strs[] = str.split(",");
+ setSelected(strs);
+ }
+ }
+ refresh();
+ }
+
+ public String getXmlData() {
+ String sel = "";
+ for (String str : getSelectedNames())
+ sel += str + ",";
+ sel = sel.replaceFirst(",$", "");
+ return sel;
+ }
+
+ public String getDisplayStr() {
+ return getXmlData();
+ }
+
+ public String toString() {
+ return getLabel() + ": " + Collections.toString(",", getSelectedNames());
+ }
+
+ public void setXmlData(String str) {
+ setSelected(str);
+ }
+
+ /**
+ * Create radio Widgets. Widgets Created: Label: "text entry" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2
+ */
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ Map<String, XRadioButton> nameToButton = new HashMap<String, XRadioButton>();
+ String names[] = new String[xButtons.size()];
+ int x = 0;
+ for (XRadioButton rb : xButtons) {
+ nameToButton.put(rb.getLabel().toLowerCase(), rb);
+ names[x++] = rb.getLabel().toLowerCase();
+ }
+
+ int numColumns = (names.length * 2) + (isDisplayLabel() ? 1 : 0);
+ if (vertical && horizontalSpan == 1)
+ numColumns = 1;
+ else if (vertical) numColumns = (isDisplayLabel() ? 1 : 0) + 1; // only need label an composite
+ // System.out.println("numColumns *" + numColumns + "*");
+ comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(numColumns, false));
+ GridData gd = new GridData();
+ gd.horizontalSpan = horizontalSpan;
+ comp.setLayoutData(gd);
+ // comp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));
+
+ // Create Text Widgets
+ if (isDisplayLabel()) {
+ labelWidget = new Label(comp, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ }
+ if (getToolTip() != null && isDisplayLabel()) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+
+ if (sortNames) Arrays.sort(names);
+
+ int numRows = 1;
+ if (vertical && xButtons.size() > verticalColumns) {
+ numRows = (int) (xButtons.size() / verticalColumns);
+ if ((xButtons.size() / verticalColumns) > 0) numRows++;
+ // System.out.println("numRows *" + numRows + "*");
+ }
+
+ Composite c = comp;
+ if (vertical) {
+ // System.out.println("verticalColumns *" + verticalColumns + "*");
+ c = new Composite(comp, SWT.NONE);
+ c.setLayout(ALayout.getZeroMarginLayout(verticalColumns, false));
+ // c.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ }
+
+ Composite inComp = null;
+ if (!vertical) inComp = c;
+ for (int i = 0; i < names.length; i++) {
+ if (vertical && i % numRows == 0) {
+ inComp = new Composite(c, SWT.NONE);
+ inComp.setLayout(new GridLayout(2, false));
+ inComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ // inComp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_CYAN+i));
+ }
+ XRadioButton button = nameToButton.get(names[i]);
+ if (multiSelect) button.setButtonType(ButtonType.Check);
+ button.setLabelAfter(true);
+ button.createWidgets(inComp, 2);
+ // Since each button has it's own listeners, pass the notification on to anyone listening
+ // to XRadioButtons:w
+ button.addXModifiedListener(new XModifiedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener#widgetModified(org.eclipse.osee.framework.ui.skynet.widgets.XWidget)
+ */
+ public void widgetModified(XWidget widget) {
+ notifyXModifiedListeners();
+ }
+ });
+ }
+ refresh();
+ }
+
+ @Override
+ public void dispose() {
+ for (XRadioButton rb : xButtons)
+ rb.dispose();
+ if (labelWidget != null) labelWidget.dispose();
+ if (comp != null && !comp.isDisposed()) comp.dispose();
+ }
+
+ public void addSelectionListener(SelectionListener selectionListener) {
+ for (XRadioButton rb : xButtons) {
+ rb.addSelectionListener(selectionListener);
+ }
+ }
+
+ public void removeSelectionListener(SelectionListener selectionListener) {
+ for (XRadioButton rb : xButtons) {
+ rb.removeSelectionListener(selectionListener);
+ }
+ }
+
+ public Set<String> getSelectedNames() {
+ Set<String> names = new HashSet<String>();
+ for (XRadioButton rb : xButtons) {
+ if (rb.isSelected()) names.add(rb.getLabel());
+ }
+ return names;
+ }
+
+ public boolean isSelected(String name) {
+ XRadioButton rb = getButton(name);
+ if (rb != null) return rb.isSelected();
+ return false;
+ }
+
+ public boolean isSelected() {
+ for (XRadioButton rb : xButtons) {
+ if (rb.isSelected()) return true;
+ }
+ return false;
+ }
+
+ public void setSelected(String name) {
+ setSelected(new String[] {name});
+ }
+
+ public void refresh() {
+ validate();
+ }
+
+ public IStatus isValid() {
+ if (isRequiredEntry() && getSelectedNames().size() == 0) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, getLabel() + " must have at least one selection.");
+ }
+ return Status.OK_STATUS;
+ }
+
+ public String getReportData() {
+ return getXmlData();
+ }
+
+ public String toHTML(String labelFont) {
+ return AHTML.getLabelStr(labelFont, getLabel() + ": ") + getDisplayStr();
+ }
+
+ public boolean isMultiSelect() {
+ return multiSelect;
+ }
+
+ public void setMultiSelect(boolean multiSelect) {
+ this.multiSelect = multiSelect;
+ }
+
+ public boolean isVertical() {
+ return vertical;
+ }
+
+ public void setVertical(boolean vertical, int columns) {
+ this.vertical = vertical;
+ this.verticalColumns = columns;
+ }
+
+ public boolean isSortNames() {
+ return sortNames;
+ }
+
+ public void setSortNames(boolean sortNames) {
+ this.sortNames = sortNames;
+ }
+
+ @Override
+ public Object getData() {
+ return getSelectedNames();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromDialog.java
new file mode 100644
index 00000000000..e5d71297400
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromDialog.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+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.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+import org.eclipse.ui.dialogs.ISelectionStatusValidator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class XSelectFromDialog<T> extends XText {
+
+ private final List<T> selected;
+ private final List<T> input;
+ private int minSelectionRequired, maxSelectionRequired = 1;
+ private Button selectionButton;
+
+ public XSelectFromDialog(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ this.selected = new ArrayList<T>();
+ this.input = new ArrayList<T>();
+ setToolTip("Click the button on the left to change the current selection.");
+ }
+
+ public XSelectFromDialog(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ public void setRequiredSelection(int minSelectionRequired, int maxSelectionRequired) throws OseeArgumentException {
+ if (minSelectionRequired < 0) {
+ throw new OseeArgumentException("Min Number of Selection must be greater than or equal to 0");
+ }
+ if (maxSelectionRequired < 1) {
+ throw new OseeArgumentException("Max Number of Selection must be at least 1");
+ }
+
+ if (maxSelectionRequired < minSelectionRequired) {
+ throw new OseeArgumentException(String.format("Invalid required number of selections [%s] < [%s]",
+ maxSelectionRequired, minSelectionRequired));
+ }
+ this.minSelectionRequired = minSelectionRequired;
+ this.maxSelectionRequired = maxSelectionRequired;
+ }
+
+ @Override
+ protected int getTextStyle() {
+ return SWT.READ_ONLY | SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setToolTip(java.lang.String)
+ */
+ @Override
+ public void setToolTip(String toolTip) {
+ if (Strings.isValid(toolTip)) {
+ super.setToolTip(toolTip);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#getData()
+ */
+ @Override
+ public Object getData() {
+ return getSelected();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#setEditable(boolean)
+ */
+ @Override
+ public void setEditable(boolean editable) {
+ super.setEditable(editable);
+ if (Widgets.isAccessible(selectionButton)) {
+ selectionButton.setEnabled(editable);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#createWidgets(org.eclipse.swt.widgets.Composite, int, boolean)
+ */
+ @Override
+ public void createControls(final Composite parent, int horizontalSpan, boolean fillText) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(ALayout.getZeroMarginLayout(3, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
+
+ Label label = getLabelWidget();
+ if (label != null) {
+ label.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ }
+ setVerticalLabel(true);
+ super.createControls(composite, horizontalSpan, fillText);
+
+ getStyledText().setEditable(false);
+ getStyledText().setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+ selectionButton = new Button(composite, SWT.PUSH);
+ selectionButton.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ selectionButton.setText("Set...");
+ selectionButton.setEnabled(isEditable());
+ selectionButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (openSelectionDialog()) {
+ notifyXModifiedListeners();
+ }
+ }
+ });
+ addToolTip(composite, getToolTip());
+ getStyledText().setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
+ refresh();
+ }
+
+ private void addToolTip(Control control, String toolTipText) {
+ if (Strings.isValid(toolTipText)) {
+ control.setToolTipText(toolTipText);
+ if (control instanceof Composite) {
+ for (Control child : ((Composite) control).getChildren()) {
+ child.setToolTipText(toolTipText);
+ }
+ }
+ }
+ }
+
+ public void setSelectableItems(Collection<T> input) {
+ this.input.clear();
+ this.input.addAll(input);
+ }
+
+ public List<T> getSelectableItems() {
+ return new ArrayList<T>(input);
+ }
+
+ public void setSelected(Collection<T> input) {
+ this.selected.clear();
+ this.selected.addAll(input);
+ setText(Collections.toString("\n", selected));
+ }
+
+ public List<T> getSelected() {
+ return new ArrayList<T>(selected);
+ }
+
+ public abstract CheckedTreeSelectionDialog createDialog();
+
+ @SuppressWarnings("unchecked")
+ protected boolean openSelectionDialog() {
+ boolean selectedChanged = false;
+ if (getSelectableItems().isEmpty()) {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), getLabel(),
+ "Could not find items available to select from.");
+ } else {
+ try {
+ CheckedTreeSelectionDialog dialog = createDialog();
+ dialog.setInitialElementSelections(getSelected());
+ dialog.setInput(getSelectableItems());
+ dialog.setValidator(new ISelectionStatusValidator() {
+
+ @Override
+ public IStatus validate(Object[] selection) {
+ IStatus status = null;
+ int numberSelected = selection.length;
+ if (minSelectionRequired <= numberSelected && maxSelectionRequired >= numberSelected) {
+ status = Status.OK_STATUS;
+ } else {
+ List<String> message = new ArrayList<String>();
+ if (numberSelected < minSelectionRequired) {
+ message.add(String.format("Must select at least [%s]", minSelectionRequired));
+ }
+ if (numberSelected > maxSelectionRequired) {
+ message.add(String.format("Can't select more than [%s]", maxSelectionRequired));
+ }
+ status =
+ new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, Collections.toString(" &&", message));
+ }
+ return status;
+ }
+
+ });
+ int result = dialog.open();
+ if (result == 0) {
+ List<T> dialogSelections = new ArrayList<T>();
+ for (Object obj : dialog.getResult()) {
+ dialogSelections.add((T) obj);
+ }
+
+ // boolean wasDifference = !Collections.setComplement(selected, dialogSelections).isEmpty();
+ // wasDifference &= !Collections.setComplement(dialogSelections, selected).isEmpty();
+ // if (wasDifference) {
+ setSelected(dialogSelections);
+ selectedChanged = true;
+ // }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return selectedChanged;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceBranch.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceBranch.java
new file mode 100644
index 00000000000..6df49805603
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceBranch.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.framework.ui.skynet.widgets;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchViewImageHandler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XSelectFromMultiChoiceBranch extends XSelectFromDialog<Branch> {
+
+ public XSelectFromMultiChoiceBranch(String displayLabel) {
+ super(displayLabel);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromDialog#createControls(org.eclipse.swt.widgets.Composite, int, boolean)
+ */
+ @Override
+ public void createControls(Composite parent, int horizontalSpan, boolean fillText) {
+ super.createControls(parent, horizontalSpan, fillText);
+ getStyledText().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromDialog#createDialog()
+ */
+ @Override
+ public CheckedTreeSelectionDialog createDialog() {
+ CheckedTreeSelectionDialog dialog =
+ new CheckedTreeSelectionDialog(Display.getCurrent().getActiveShell(), new BranchLabelProvider(),
+ new ArrayTreeContentProvider());
+ dialog.setTitle(getLabel());
+ dialog.setImage(SkynetGuiPlugin.getInstance().getImage("branch.gif"));
+ dialog.setMessage("Select from the items below");
+ return dialog;
+ }
+
+ private final class BranchLabelProvider extends LabelProvider {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof Branch) {
+ return BranchViewImageHandler.getImage(element, 0);
+ }
+ return null;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceDam.java
new file mode 100644
index 00000000000..41b7f318568
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XSelectFromMultiChoiceDam.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.framework.ui.skynet.widgets;
+
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XSelectFromMultiChoiceDam extends XSelectFromDialog<String> implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XSelectFromMultiChoiceDam(String displayLabel) {
+ super(displayLabel);
+ this.artifact = null;
+ }
+
+ public void setArtifact(Artifact artifact, String attributeTypeName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attributeTypeName;
+ AttributeType attributeType = AttributeTypeManager.getType(attributeTypeName);
+ int minOccurrence = attributeType.getMinOccurrences();
+ int maxOccurrence = attributeType.getMaxOccurrences();
+
+ setRequiredSelection(minOccurrence, maxOccurrence);
+ setSelected(getStored());
+ setRequiredEntry(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromDialog#createDialog()
+ */
+ @Override
+ public CheckedTreeSelectionDialog createDialog() {
+ CheckedTreeSelectionDialog dialog =
+ new CheckedTreeSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider(),
+ new ArrayTreeContentProvider());
+ dialog.setTitle(getLabel());
+ dialog.setImage(ImageManager.getImage(artifact));
+ dialog.setMessage("Select from the items below");
+ return dialog;
+ }
+
+ public Collection<String> getStored() throws OseeCoreException {
+ return artifact.getAttributesToStringList(attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ Collection<String> enteredValues = getSelected();
+ Collection<String> storedValues = getStored();
+ if (!Collections.isEqual(enteredValues, storedValues)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (NumberFormatException ex) {
+ // do nothing
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ artifact.setAttributeValues(attributeTypeName, getSelected());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ IStatus status = super.isValid();
+ if (status.isOK()) {
+ List<String> items = getSelected();
+ for (String item : items) {
+ status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, artifact, attributeTypeName, item);
+ if (!status.isOK()) {
+ break;
+ }
+ }
+ }
+ return status;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedDam.java
new file mode 100644
index 00000000000..6cc531cf1de
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedDam.java
@@ -0,0 +1,332 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+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.resource.JFaceResources;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.CompressedContentAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.JavaObjectAttribute;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.progress.UIJob;
+
+public class XStackedDam extends XStackedWidget<String> implements IArtifactWidget {
+ private Font defaultLabelFont;
+ private Artifact artifact;
+ private String attributeTypeName;
+ private final Map<String, XWidget> xWidgets;
+ private final XModifiedListener xModifiedListener;
+
+ public XStackedDam(String displayLabel) {
+ super(displayLabel);
+ this.xWidgets = new LinkedHashMap<String, XWidget>();
+ this.artifact = null;
+ this.xModifiedListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ notifyXModifiedListeners();
+ };
+ };
+ }
+
+ public void setArtifact(Artifact artifact, String attributeTypeName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attributeTypeName;
+ AttributeType attributeType = AttributeTypeManager.getType(attributeTypeName);
+
+ int minOccurrence = attributeType.getMinOccurrences();
+ int maxOccurrence = attributeType.getMaxOccurrences();
+
+ if (minOccurrence == 0) {
+ minOccurrence = 1;
+ }
+ setPageRange(minOccurrence, maxOccurrence);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XStackedWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ super.createControls(parent, horizontalSpan);
+ final Collection<String> values = new ArrayList<String>();
+ try {
+ values.addAll(getStored());
+ for (int index = 0; index < values.size(); index++) {
+ addPage("");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex.getLocalizedMessage(), ex);
+ }
+ Job job = new UIJob("Update Stacked XText") {
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ setNotificationsAllowed(false);
+ Iterator<String> dataIterator = values.iterator();
+ Iterator<XWidget> widgetIterator = xWidgets.values().iterator();
+ while (dataIterator.hasNext() && widgetIterator.hasNext()) {
+ XWidget widget = widgetIterator.next();
+ if (widget instanceof XText) {
+ ((XText) widget).set(dataIterator.next());
+ } else if (widget instanceof XDate) {
+ ((XDate) widget).setDate(toDate(dataIterator.next()));
+ }
+ }
+ values.clear();
+ setNotificationsAllowed(true);
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job);
+ }
+
+ public List<String> getInput() {
+ List<String> data = new ArrayList<String>();
+ for (XWidget widget : xWidgets.values()) {
+ if (widget instanceof XText) {
+ data.add(((XText) widget).get());
+ } else if (widget instanceof XDate) {
+ Date date = ((XDate) widget).getDate();
+ if (date != null) {
+ data.add(String.valueOf(date.getTime()));
+ }
+ }
+ }
+ return data;
+ }
+
+ public Collection<String> getStored() throws OseeCoreException {
+ return artifact.getAttributesToStringList(attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#isDirty()
+ */
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ try {
+ Collection<String> enteredValues = new ArrayList<String>();//getSelected();
+ Collection<String> storedValues = getStored();
+ if (!Collections.isEqual(enteredValues, storedValues)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ } catch (NumberFormatException ex) {
+ // do nothing
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#saveToArtifact()
+ */
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ artifact.setAttributeValues(attributeTypeName, getInput());
+ }
+
+ private Font getBoldLabelFont() {
+ if (defaultLabelFont == null) {
+ Font baseFont = JFaceResources.getDefaultFont();
+ FontData[] fontDatas = baseFont.getFontData();
+ FontData fontData = fontDatas.length > 0 ? fontDatas[0] : new FontData("arial", 12, SWT.BOLD);
+ defaultLabelFont = new Font(baseFont.getDevice(), fontData.getName(), fontData.getHeight(), SWT.BOLD);
+ }
+ return defaultLabelFont;
+ }
+
+ @Override
+ protected void createPage(String id, Composite parent, String initialInput) {
+ if (!xWidgets.containsKey(id)) {
+ Label label = new Label(parent, SWT.NONE);
+ label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ label.setFont(getBoldLabelFont());
+ label.setText(String.format("Page: %s", id));
+
+ XWidget xWidget = getWidget(attributeTypeName, parent, initialInput);
+ xWidget.setEditable(isEditable());
+ label.setBackground(xWidget.getControl().getBackground());
+ parent.setBackground(label.getBackground());
+ xWidgets.put(id, xWidget);
+
+ xWidget.addXModifiedListener(xModifiedListener);
+ parent.layout();
+ }
+ }
+
+ @Override
+ protected void onRemovePage(String id) {
+ xWidgets.remove(id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ for (XWidget widget : xWidgets.values()) {
+ IStatus status = widget.isValid();
+ if (!status.isOK()) {
+ return status;
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#validate()
+ */
+ @Override
+ public void validate() {
+ String id = getCurrentPageId();
+ if (Strings.isValid(id)) {
+ XWidget widget = xWidgets.get(id);
+ widget.validate();
+ }
+ }
+
+ private Date toDate(String value) {
+ try {
+ return new Date(Long.parseLong(value));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return new Date();
+ }
+
+ private XWidget getWidget(String attributeType, Composite parent, String initialInput) {
+ XWidget xWidget = null;
+ AttributeType type = null;
+ try {
+ type = AttributeTypeManager.getType(attributeType);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ if (type != null) {
+ if (type.getBaseAttributeClass().equals(IntegerAttribute.class)) {
+ XInteger xInteger = new XInteger("");
+ xInteger.setFillHorizontally(true);
+ xInteger.createWidgets(getManagedForm(), parent, 2);
+ if (Strings.isValid(initialInput)) {
+ xInteger.setText(initialInput);
+ }
+ xWidget = xInteger;
+ } else if (type.getBaseAttributeClass().equals(DateAttribute.class)) {
+ XDate xDate = new XDate("");
+ xDate.setFillHorizontally(true);
+ xDate.createWidgets(getManagedForm(), parent, 2);
+ if (Strings.isValid(initialInput)) {
+ xDate.setDate(toDate(initialInput));
+ }
+ xWidget = xDate;
+ } else if (type.getBaseAttributeClass().equals(FloatingPointAttribute.class)) {
+ XFloat xFloat = new XFloat("");
+ xFloat.setFillHorizontally(true);
+ xFloat.createWidgets(getManagedForm(), parent, 2);
+ if (Strings.isValid(initialInput)) {
+ xFloat.setText(initialInput);
+ }
+ xWidget = xFloat;
+ } else if (type.getBaseAttributeClass().equals(CompressedContentAttribute.class) || type.getBaseAttributeClass().equals(
+ JavaObjectAttribute.class)) {
+ XLabel xLabel = new XLabel("");
+ xLabel.setFillHorizontally(true);
+ xLabel.createWidgets(getManagedForm(), parent, 2);
+ if (Strings.isValid(initialInput)) {
+ xLabel.setLabel(initialInput);
+ }
+ xWidget = xLabel;
+ }
+ }
+
+ if (xWidget == null) {
+ XText xTextWidget = new XTextInternalWidget("");
+ if (Strings.isValid(initialInput)) {
+ xTextWidget.setText(initialInput);
+ }
+ xTextWidget.addXTextSpellModifyDictionary(new SkynetSpellModifyDictionary());
+ xTextWidget.setFillHorizontally(false);
+ xTextWidget.setFillVertically(true);
+ xTextWidget.createWidgets(getManagedForm(), parent, 2);
+ xWidget = xTextWidget;
+ }
+ return xWidget;
+ }
+
+ private final class XTextInternalWidget extends XText {
+
+ public XTextInternalWidget(String label) {
+ super(label);
+ }
+
+ protected int getTextStyle() {
+ int styleBase = SWT.NONE;
+ if (isEditable()) {
+ styleBase |= SWT.READ_ONLY;
+ }
+ return styleBase | (fillVertically ? SWT.WRAP | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL : SWT.SINGLE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#createWidgets(org.eclipse.swt.widgets.Composite, int, boolean)
+ */
+ @Override
+ public void createControls(Composite parent, int horizontalSpan, boolean fillText) {
+ super.createControls(parent, horizontalSpan, fillText);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.widthHint = 200;
+ gd.heightHint = 200;
+ sText.setLayoutData(gd);
+ sText.setWordWrap(true);
+ sText.setEditable(isEditable());
+ if (!isEditable()) {
+ sText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedWidget.java
new file mode 100644
index 00000000000..b817cfb0994
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XStackedWidget.java
@@ -0,0 +1,480 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.StackedViewer;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Image;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+public abstract class XStackedWidget<T> extends XLabel {
+
+ private StackedControl stackedControl;
+ private StyledText currentPageLabel;
+ private Composite container;
+ private Label messageLabel;
+ private Label messageIcon;
+ private int minPage;
+ private int maxPage;
+
+ public XStackedWidget(String displayLabel, String xmlRoot) {
+ super(displayLabel, xmlRoot);
+ setToolTip("Navigate pages by clicking forward and backward buttons.");
+ minPage = 0;
+ maxPage = 0;
+ }
+
+ public void dispose() {
+ stackedControl.dispose();
+ super.dispose();
+ }
+
+ public XStackedWidget(String displayLabel) {
+ this(displayLabel, "");
+ }
+
+ protected void setPageRange(int minPage, int maxPage) throws OseeArgumentException {
+ if (minPage < 0) throw new OseeArgumentException("Min Number of Pages must be greater than 0");
+ if (maxPage < 1) throw new OseeArgumentException("Max Number of Pages must be at least 1");
+
+ if (maxPage < minPage) {
+ throw new OseeArgumentException(
+ String.format("Invalid required number of pages [%s] < [%s]", maxPage, minPage));
+ }
+ this.minPage = minPage;
+ this.maxPage = maxPage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XLabel#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return stackedControl.stackedViewer;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setToolTip(java.lang.String)
+ */
+ @Override
+ public void setToolTip(String toolTip) {
+ if (Strings.isValid(toolTip)) {
+ super.setToolTip(toolTip);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.skynet.gui.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ updateCurrentPageLabel();
+ stackedControl.refresh();
+ }
+
+ @Override
+ protected void createControls(final Composite parent, int horizontalSpan) {
+ container = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(isDisplayLabel() ? 2 : 1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginRight = 0;
+ container.setLayout(layout);
+ container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ if (isDisplayLabel() && Strings.isValid(getLabel())) {
+ labelWidget = new Label(container, SWT.NONE);
+ labelWidget.setText(String.format("%s:", getLabel()));
+ labelWidget.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite composite = new Composite(container, SWT.NONE);
+ GridLayout layout1 = new GridLayout(1, false);
+ layout1.marginHeight = 0;
+ layout1.marginWidth = 0;
+ layout1.verticalSpacing = 0;
+ layout1.horizontalSpacing = 0;
+ composite.setLayout(layout1);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ createToolBar(composite);
+ stackedControl = new StackedControl();
+ stackedControl.createControl(composite);
+ createMessageArea(composite);
+
+ addToolTip(container, getToolTip());
+ stackedControl.next();
+ refresh();
+ }
+
+ private void createMessageArea(Composite parent) {
+ Composite messageArea = new Composite(parent, SWT.BORDER);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.marginLeft = 5;
+ layout.horizontalSpacing = 0;
+ layout.verticalSpacing = 0;
+ layout.marginBottom = 5;
+
+ messageArea.setLayout(layout);
+ messageArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ messageArea.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ messageIcon = new Label(messageArea, SWT.NONE);
+ messageIcon.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
+
+ messageLabel = new Label(messageArea, SWT.NONE);
+ messageLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+ }
+
+ private void createToolBar(Composite parent) {
+ Composite composite = new Composite(parent, SWT.BORDER);
+ GridLayout layout = new GridLayout(3, false);
+ layout.marginHeight = 0;
+ layout.marginLeft = 5;
+ layout.marginWidth = 2;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ currentPageLabel = new StyledText(composite, SWT.READ_ONLY | SWT.SINGLE | SWT.WRAP);
+ currentPageLabel.setAlignment(SWT.RIGHT);
+ currentPageLabel.setFont(JFaceResources.getBannerFont());
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+ gd.minimumWidth = 10;
+ currentPageLabel.setLayoutData(gd);
+ currentPageLabel.setText("0 of 0");
+
+ Composite filler = new Composite(composite, SWT.NONE);
+ GridLayout layout1 = new GridLayout(1, false);
+ filler.setLayout(layout1);
+ filler.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ ToolBar toolbar = new ToolBar(composite, SWT.FLAT | SWT.HORIZONTAL);
+ toolbar.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false));
+ ToolBarManager manager = new ToolBarManager(toolbar);
+ manager.add(new Separator());
+ manager.add(new Back());
+ manager.add(new Forward());
+ manager.add(new Separator());
+ manager.add(new AddPage());
+ manager.add(new RemovePage());
+ manager.update(true);
+ }
+
+ private void addToolTip(Control control, String toolTipText) {
+ if (Strings.isValid(toolTipText)) {
+ control.setToolTipText(toolTipText);
+ if (control instanceof Composite) {
+ for (Control child : ((Composite) control).getChildren()) {
+ child.setToolTipText(toolTipText);
+ }
+ }
+ }
+ }
+
+ private void updateCurrentPageLabel() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (Widgets.isAccessible(currentPageLabel)) {
+ int totalPages = stackedControl.getTotalPages();
+ int currentPage = stackedControl.getCurrentPageIndex() + 1;
+ if (currentPage > totalPages) {
+ currentPage = totalPages;
+ }
+ currentPageLabel.setText(String.format("%s of %s", currentPage, totalPages));
+ }
+ }
+ });
+ }
+
+ public void addPage(T value) {
+ stackedControl.addPage(value);
+ }
+
+ protected String getCurrentPageId() {
+ return stackedControl.getCurrentPageId();
+ }
+
+ private void setMessage(final int severity, final String message) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (Widgets.isAccessible(messageLabel)) {
+ Composite parent = messageLabel.getParent();
+
+ String text = message;
+ boolean isVisible = Strings.isValid(text);
+
+ String imageName = null;
+ switch (severity) {
+ case IStatus.INFO:
+ imageName = ISharedImages.IMG_OBJS_INFO_TSK;
+ break;
+ case IStatus.ERROR:
+ imageName = ISharedImages.IMG_OBJS_ERROR_TSK;
+ break;
+ case IStatus.WARNING:
+ imageName = ISharedImages.IMG_OBJS_WARN_TSK;
+ break;
+ default:
+ imageName = null;
+ break;
+ }
+ Image image =
+ Strings.isValid(imageName) ? PlatformUI.getWorkbench().getSharedImages().getImage(imageName) : null;
+ messageIcon.setImage(image);
+ messageLabel.setText(isVisible ? " " + text : text);
+
+ messageIcon.setVisible(isVisible);
+ messageLabel.setVisible(isVisible);
+ parent.setVisible(isVisible);
+ parent.layout();
+ }
+ }
+ });
+ }
+
+ protected abstract void createPage(String id, Composite parent, T value);
+
+ protected abstract void onRemovePage(String id);
+
+ private final class Back extends Action {
+ public Back() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("nav_backward.gif"));
+ setToolTipText("Back to previous page");
+ }
+
+ public void run() {
+ stackedControl.previous();
+ }
+ }
+
+ private final class Forward extends Action {
+ public Forward() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("nav_forward.gif"));
+ setToolTipText("Forward to next page");
+ }
+
+ public void run() {
+ stackedControl.next();
+ }
+ }
+
+ private final class AddPage extends Action {
+ public AddPage() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("add.gif"));
+ setToolTipText("Adds a page");
+ }
+
+ public void run() {
+ stackedControl.addPage((T) null);
+ }
+ }
+
+ private final class RemovePage extends Action {
+ public RemovePage() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("remove.gif"));
+ setToolTipText("Removes a page");
+ }
+
+ public void run() {
+ stackedControl.removePage();
+ }
+ }
+
+ private final class StackedControl {
+ private StackedViewer stackedViewer;
+ private int currentPage;
+ private final List<String> pageIds;
+
+ public StackedControl() {
+ this.stackedViewer = null;
+ this.currentPage = -1;
+ this.pageIds = new ArrayList<String>();
+ }
+
+ private void createControl(Composite parent) {
+ pageIds.clear();
+ stackedViewer = new StackedViewer(parent, SWT.BORDER);
+ stackedViewer.setLayout(ALayout.getZeroMarginLayout());
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
+ gd.minimumHeight = 60;
+ gd.minimumWidth = 60;
+ stackedViewer.setLayoutData(gd);
+ stackedViewer.setCurrentControl(StackedViewer.DEFAULT_CONTROL);
+ stackedViewer.layout();
+ }
+
+ public void dispose() {
+ pageIds.clear();
+ Widgets.disposeWidget(stackedViewer);
+ }
+
+ public void refresh() {
+ stackedViewer.getStackComposite().layout();
+ stackedViewer.getStackComposite().getParent().layout();
+ }
+
+ private int getTotalPages() {
+ return Widgets.isAccessible(stackedViewer) ? stackedViewer.getControlCount() : 0;
+ }
+
+ private int getCurrentPageIndex() {
+ return currentPage;
+ }
+
+ private String getCurrentPageId() {
+ String toReturn = null;
+ int index = getCurrentPageIndex();
+ if (index >= 0 && index < pageIds.size()) {
+ toReturn = pageIds.get(index);
+ }
+ return toReturn;
+ }
+
+ private void next() {
+ int next = getCurrentPageIndex();
+ if (next + 1 < getTotalPages()) {
+ next++;
+ } else {
+ next = 0;
+ }
+ setCurrentPage(next);
+ }
+
+ private void previous() {
+ int previous = getCurrentPageIndex();
+ if (previous - 1 >= 0) {
+ previous--;
+ } else {
+ previous = getTotalPages() - 1;
+ }
+ setCurrentPage(previous);
+ }
+
+ public void setCurrentPage(int index) {
+ String pageId = null;
+ setMessage(IStatus.OK, "");
+ if (index >= 0 && index < pageIds.size()) {
+ pageId = pageIds.get(index);
+ if (pageId == null) {
+ setMessage(IStatus.ERROR, String.format("Page [%s] not found.", index));
+ }
+ } else {
+ setMessage(IStatus.ERROR, String.format("Page [%s] out of bounds.", index));
+ }
+
+ if (pageId == null) {
+ index = 0;
+ pageId = StackedViewer.DEFAULT_CONTROL;
+ }
+ this.currentPage = index;
+ stackedViewer.setCurrentControl(pageId);
+ updateCurrentPageLabel();
+ }
+
+ private void addPage(T value) {
+ int numberOfPages = getTotalPages();
+ IStatus status = validate(numberOfPages + 1);
+ if (status.isOK()) {
+ setMessage(IStatus.OK, "");
+ String id = GUID.generateGuidStr();
+ if (pageIds.add(id)) {
+ Composite composite = new Composite(stackedViewer.getStackComposite(), SWT.WRAP);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
+
+ createPage(id, composite, value);
+ stackedViewer.addControl(id, composite);
+ setCurrentPage(numberOfPages);
+ notifyXModifiedListeners();
+ } else {
+ setMessage(IStatus.WARNING, String.format("Add page error - page at index [%s] already exists",
+ getCurrentPageIndex()));
+ }
+ } else {
+ setMessage(IStatus.ERROR, status.getMessage());
+ }
+ }
+
+ private void removePage() {
+ int numberOfPages = getTotalPages();
+ IStatus status = validate(numberOfPages - 1);
+ if (status.isOK()) {
+ setMessage(IStatus.OK, "");
+ System.out.println("Delete Page");
+
+ String pageId = pageIds.remove(getCurrentPageIndex());
+ if (pageId != null) {
+ onRemovePage(pageId);
+ Control control = stackedViewer.removeControl(pageId);
+ Widgets.disposeWidget(control);
+ previous();
+ notifyXModifiedListeners();
+ } else {
+ setMessage(IStatus.WARNING, String.format("Remove page error - page at index [%s] does not exist",
+ getCurrentPageIndex()));
+ }
+ } else {
+ setMessage(IStatus.ERROR, status.getMessage());
+ }
+ }
+
+ private IStatus validate(int numberOfPages) {
+ IStatus status = null;
+ if (minPage <= numberOfPages && maxPage >= numberOfPages) {
+ status = Status.OK_STATUS;
+ } else {
+ List<String> message = new ArrayList<String>();
+ if (numberOfPages < minPage) {
+ message.add(String.format("Must have at least [%s] page%s", minPage, minPage == 1 ? "" : "s"));
+ }
+ if (numberOfPages > maxPage) {
+ message.add(String.format("Can't add more than [%s] page%s", maxPage, maxPage == 1 ? "" : "s"));
+ }
+ status = new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, Collections.toString(" &", message));
+ }
+ return status;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XText.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XText.java
new file mode 100644
index 00000000000..41e96224b3e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XText.java
@@ -0,0 +1,618 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.OseeDictionary;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+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.graphics.Font;
+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.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * Generic label and text field object for use by single entry artifact attributes
+ *
+ * @author Donald G. Dunne
+ */
+public class XText extends XWidget {
+
+ protected StyledText sText; // Contains visable representation of text
+ private Composite parent;
+ protected String text = ""; // Where actual text with xml tags is stored
+ private int maxTextChars = 0;
+
+ private boolean dragableArtifact = false;
+ private boolean spellCheck = true;
+ private final boolean debug = false;
+ private int width = 0;
+ private int height = 0;
+ private XTextSpellCheckPaintListener spellPaintListener;
+ private XTextSpellModifyDictionary modDict;
+ private Font font;
+
+ public XText() {
+ super("AText", "text");
+ }
+
+ public XText(String displayLabel) {
+ this(displayLabel, "text");
+ }
+
+ public XText(String displayLabel, String xmlRoot) {
+ this(displayLabel, xmlRoot, "");
+ }
+
+ public XText(String displayLabel, String xmlRoot, String xmlSubRoot) {
+ super(displayLabel, xmlRoot, xmlSubRoot);
+ }
+
+ public void setEnabled(boolean enabled) {
+ sText.setEnabled(enabled);
+ }
+
+ public void setSize(int width, int height) {
+ this.width = width;
+ this.height = height;
+ if (sText != null && !sText.isDisposed()) {
+ sText.setSize(width, height);
+ }
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ if (sText != null && !sText.isDisposed()) {
+ sText.setSize(sText.getSize().x, height);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getLabel() + ": *" + text + "*";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return sText;
+ }
+
+ /**
+ * Create Text Widgets. Widgets Created: Label: "text entry" horizonatalSpan takes up 2 columns; horizontalSpan must
+ * be >=2
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ createControls(parent, horizontalSpan, true);
+ }
+
+ protected void createControls(Composite parent, int horizontalSpan, boolean fillText) {
+ setNotificationsAllowed(false);
+ try {
+ if (!verticalLabel && horizontalSpan < 2) {
+ horizontalSpan = 2;
+ }
+
+ this.parent = parent;
+ Composite composite = null;
+
+ ModifyListener textListener = new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ if (sText != null) {
+ debug("modifyText");
+ text = sText.getText();
+ validate();
+ notifyXModifiedListeners();
+ }
+ }
+ };
+
+ if (fillVertically) {
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = ALayout.getZeroMarginLayout(1, false);
+ layout.verticalSpacing = 4;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ } else {
+ composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = ALayout.getZeroMarginLayout(2, false);
+ layout.verticalSpacing = 4;
+ composite.setLayout(layout);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = horizontalSpan;
+ composite.setLayoutData(gd);
+ }
+ // composite = parent;
+
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(composite, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ sText = new StyledText(composite, getTextStyle());
+
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ if (verticalLabel) {
+ gd.horizontalSpan = horizontalSpan;
+ } else {
+ gd.horizontalSpan = horizontalSpan - 1;
+ }
+ gd.grabExcessHorizontalSpace = true;
+ gd.horizontalAlignment = GridData.FILL;
+ if (fillVertically) {
+ gd.grabExcessVerticalSpace = true;
+ gd.verticalAlignment = GridData.FILL;
+ }
+ if (fillVertically) {
+ if (height > 0) {
+ gd.heightHint = height;
+ }
+ }
+ // gd.widthHint = 200;
+ sText.setLayoutData(gd);
+ sText.setMenu(getDefaultMenu());
+ sText.addModifyListener(textListener);
+ if (text != null) {
+ sText.setText(text);
+ }
+ if (spellCheck) {
+ spellPaintListener = new XTextSpellCheckPaintListener(this, OseeDictionary.getInstance());
+ sText.addPaintListener(spellPaintListener);
+ if (modDict != null) {
+ spellPaintListener.addXTextSpellModifyDictionary(modDict);
+ }
+ }
+ if (width != 0 && height != 0) {
+ sText.setSize(width, height);
+ }
+
+ if (maxTextChars > 0) {
+ sText.setTextLimit(maxTextChars);
+ }
+ if (fillText) {
+ updateTextWidget();
+ }
+ validate();
+ sText.setEditable(isEditable());
+ if (font != null) {
+ sText.setFont(font);
+ }
+ parent.layout();
+ } finally {
+ setNotificationsAllowed(true);
+ }
+ }
+
+ protected int getTextStyle() {
+ int styleBase = SWT.BORDER;
+ if (isEditable()) {
+ styleBase |= SWT.READ_ONLY;
+ }
+ return styleBase | (fillVertically ? SWT.MULTI | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL : SWT.SINGLE);
+ }
+
+ public void addXTextSpellModifyDictionary(XTextSpellModifyDictionary modDict) {
+ this.modDict = modDict;
+ if (spellPaintListener != null) {
+ spellPaintListener.addXTextSpellModifyDictionary(modDict);
+ }
+ }
+
+ /**
+ * @return text including xml tags replaced for references
+ */
+ public String getText() {
+ String text = sText.getText();
+ return text;
+ }
+
+ /**
+ * @param text
+ */
+ public void setText(String text) {
+ this.text = text;
+ if (sText != null) {
+ sText.setText(text);
+ }
+ }
+
+ public Menu getDefaultMenu() {
+ Menu menu = new Menu(sText.getShell());
+ MenuItem cut = new MenuItem(menu, SWT.NONE);
+ cut.setText("Cut");
+ cut.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sText.cut();
+ sText.redraw();
+ }
+ });
+ MenuItem copy = new MenuItem(menu, SWT.NONE);
+ copy.setText("Copy");
+ copy.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sText.copy();
+ }
+ });
+ MenuItem paste = new MenuItem(menu, SWT.NONE);
+ paste.setText("Paste");
+ paste.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ sText.paste();
+ sText.redraw();
+ }
+ });
+ return menu;
+ }
+
+ @Override
+ public void dispose() {
+ if (labelWidget != null) {
+ labelWidget.dispose();
+ }
+ if (sText != null) {
+ if (spellPaintListener != null && !sText.isDisposed()) {
+ sText.removePaintListener(spellPaintListener);
+ }
+ sText.dispose();
+ sText = null;
+ }
+ if (parent != null && !parent.isDisposed()) {
+ parent.layout();
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ if (sText != null) {
+ sText.setFocus();
+ }
+ }
+
+ public void setSpellChecking(boolean spellCheck) {
+ if (sText != null) {
+ if (spellCheck) {
+ sText.addPaintListener(spellPaintListener);
+ } else if (spellPaintListener != null) {
+ sText.removePaintListener(spellPaintListener);
+ }
+ }
+ this.spellCheck = spellCheck;
+ }
+
+ @Override
+ public void setEditable(boolean editable) {
+ super.setEditable(editable);
+ if (Widgets.isAccessible(sText)) {
+ sText.setEditable(editable);
+ }
+ }
+
+ /**
+ * Set max character limit on text field
+ *
+ * @param limit - if 0, then limit is 999, else sets to limit
+ */
+ public void setMaxTextLimit(int limit) {
+ this.maxTextChars = limit;
+ if (sText != null) {
+ if (limit == 0) {
+ sText.setTextLimit(999);
+ } else {
+ sText.setTextLimit(limit);
+ }
+ }
+ }
+
+ public void forceFocus() {
+ if (sText != null) {
+ sText.forceFocus();
+ }
+ }
+
+ @Override
+ public void setFillVertically(boolean fillVertically) {
+ super.setFillVertically(fillVertically);
+ }
+
+ public boolean isInteger() {
+ try {
+ new Integer(text);
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean isFloat() {
+ try {
+ new Float(text);
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+
+ public int getInteger() {
+ Integer num;
+ try {
+ num = new Integer(text);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ return num.intValue();
+ }
+
+ public double getFloat() {
+ Double num;
+ try {
+ num = new Double(text);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ return num.doubleValue();
+ }
+
+ @Override
+ public void setRequiredEntry(boolean requiredEntry) {
+ super.setRequiredEntry(requiredEntry);
+ validate();
+ }
+
+ public void addModifyListener(ModifyListener modifyListener) {
+ if (sText != null) {
+ sText.addModifyListener(modifyListener);
+ }
+ }
+
+ public String get() {
+ if (debug) {
+ System.err.println("text set *" + text + "*");
+ }
+ return text;
+ }
+
+ @Override
+ public String getXmlData() {
+ if (sText == null || sText.isDisposed()) {
+ return AXml.textToXml(text);
+ } else {
+ try {
+ return AXml.textToXml(sText.getText());
+ } catch (SWTException e) {
+ return AXml.textToXml(text);
+ }
+ }
+ }
+
+ @Override
+ protected String toXml() {
+ if (getXmlSubRoot().equals("")) {
+ return toXml(getXmlRoot());
+ } else {
+ return toXml(getXmlRoot(), getXmlSubRoot());
+ }
+ }
+
+ @Override
+ public String toXml(String xmlRoot) {
+ String s = "<" + xmlRoot + ">" + getXmlData() + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ @Override
+ public String toXml(String xmlRoot, String xmlSubRoot) {
+ String s =
+ "<" + xmlRoot + ">" + "<" + xmlSubRoot + ">" + getXmlData() + "</" + xmlSubRoot + ">" + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ set(str);
+ if (debug) {
+ System.err.println("setFromXml *" + str + "*");
+ }
+ }
+
+ @Override
+ public void setFromXml(String xml) {
+ Matcher m;
+ m =
+ Pattern.compile("<" + getXmlRoot() + ">(.*?)</" + getXmlRoot() + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(
+ xml);
+
+ if (m.find()) {
+ String xmlStr = m.group(1);
+ if (debug) {
+ System.err.println("xmlStr *" + xmlStr + "*");
+ }
+ String str = AXml.xmlToText(xmlStr);
+ if (debug) {
+ System.err.println("str *" + str + "*");
+ }
+ setXmlData(str);
+ }
+ }
+
+ public int getInt() {
+ Integer percent = new Integer(0);
+ try {
+ percent = new Integer(text);
+ } catch (NumberFormatException e) {
+ }
+ return percent.intValue();
+ }
+
+ protected void updateTextWidget() {
+ if (Widgets.isAccessible(sText)) {
+ if (!text.equals(sText.getText())) {
+ // Disable Listeners so not to fill Undo List
+ sText.setText(text);
+ // Reenable Listeners
+ validate();
+ }
+ }
+ }
+
+ public void set(String text) {
+ if (text == null) {
+ this.text = "";
+ } else {
+ this.text = text;
+ }
+ if (debug) {
+ System.err.println("set *" + text + "*");
+ }
+ updateTextWidget();
+ }
+
+ public void set(XText text) {
+ set(text.get());
+ }
+
+ public void append(String text) {
+ this.text = this.text + text;
+ updateTextWidget();
+ }
+
+ @Override
+ public void refresh() {
+ updateTextWidget();
+ }
+
+ @Override
+ public String getReportData() {
+ String s = "";
+ String textStr = new String(text);
+ if (fillVertically) {
+ s = s + "\n";
+ textStr = textStr.replaceAll("\n", "\n" + " ");
+ textStr = " " + textStr;
+ }
+ s = s + textStr;
+ s = s.replaceAll("\n$", "");
+ return s;
+ }
+
+ public String toHTML(String labelFont, boolean newLineText) {
+ String s = AHTML.getLabelStr(labelFont, getLabel() + ": ");
+ if (newLineText) {
+ s = "<dl><dt>" + s + "<dd>";
+ }
+ s += text;
+ if (newLineText) {
+ s += "</dl>";
+ }
+ return s;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return toHTML(labelFont, false);
+ }
+
+ /**
+ * @return Returns the dragableArtifact.
+ */
+ public boolean isDragableArtifact() {
+ return dragableArtifact;
+ }
+
+ /**
+ * @param dragableArtifact The dragableArtifact to set.
+ */
+ public void setDragableArtifact(boolean dragableArtifact) {
+ this.dragableArtifact = dragableArtifact;
+ }
+
+ public void debug(String str) {
+ if (debug) {
+ System.err.println("AText :" + str);
+ }
+ }
+
+ @Override
+ public IStatus isValid() {
+ if (isRequiredEntry() && !Strings.isValid(get())) {
+ return new Status(IStatus.ERROR, SkynetGuiPlugin.PLUGIN_ID, String.format("Must enter \"%s\"", getLabel()));
+ }
+ return Status.OK_STATUS;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return sText.getText();
+ }
+
+ /**
+ * @return the sText
+ */
+ public StyledText getStyledText() {
+ return sText;
+ }
+
+ /**
+ * @return the font
+ */
+ public Font getFont() {
+ return font;
+ }
+
+ /**
+ * @param font the font to set
+ */
+ public void setFont(Font font) {
+ this.font = font;
+ if (sText != null) {
+ sText.setFont(font);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDam.java
new file mode 100644
index 00000000000..1c150cefade
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDam.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+
+public class XTextDam extends XText implements IArtifactWidget {
+
+ private Artifact artifact;
+ private String attributeTypeName;
+
+ public XTextDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact, String attributeTypeName) throws OseeCoreException {
+ this.artifact = artifact;
+ this.attributeTypeName = attributeTypeName;
+ super.set(artifact.getSoleAttributeValue(attributeTypeName, ""));
+ }
+
+ @Override
+ public void saveToArtifact() throws OseeCoreException {
+ String value = get();
+ if (value == null || value.equals("")) {
+ artifact.deleteSoleAttribute(attributeTypeName);
+ } else if (!value.equals(artifact.getSoleAttributeValue(attributeTypeName, ""))) {
+ artifact.setSoleAttributeValue(attributeTypeName, value);
+ }
+ }
+
+ @Override
+ public Result isDirty() throws OseeCoreException {
+ String enteredValue = get();
+ String storedValue = artifact.getSoleAttributeValue(attributeTypeName, "");
+ if (!enteredValue.equals(storedValue)) {
+ return new Result(true, attributeTypeName + " is dirty");
+ }
+ return Result.FalseResult;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XText#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ IStatus status = super.isValid();
+ if (status.isOK()) {
+ status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, artifact, attributeTypeName, get());
+ }
+ return status;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget#revert()
+ */
+ @Override
+ public void revert() throws OseeCoreException {
+ setArtifact(artifact, attributeTypeName);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDescriptiveName.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDescriptiveName.java
new file mode 100644
index 00000000000..356b7f00b02
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextDescriptiveName.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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+public class XTextDescriptiveName extends XTextDam implements IArtifactWidget {
+
+ public Artifact artifact;
+
+ public XTextDescriptiveName(String displayLabel) {
+ super(displayLabel);
+ }
+
+ public void setArtifact(Artifact artifact) throws Exception {
+ this.artifact = artifact;
+ super.setArtifact(artifact, "Name");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextResourceDropDam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextResourceDropDam.java
new file mode 100644
index 00000000000..f26b0797581
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextResourceDropDam.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.osee.framework.ui.plugin.util.AJavaProject;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+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.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ResourceTransfer;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XTextResourceDropDam extends XTextDam {
+
+ /**
+ * @param displayLabel
+ */
+ public XTextResourceDropDam(String displayLabel) {
+ super(displayLabel);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XTextDam#createControls(org.eclipse.swt.widgets.Composite,
+ * int, boolean)
+ */
+ @Override
+ public void createControls(Composite parent, int horizontalSpan, boolean fillText) {
+ super.createControls(parent, horizontalSpan, fillText);
+ setupDragAndDropSupport();
+ }
+
+ private void setupDragAndDropSupport() {
+
+ // Do not allow drop if default branch is not same as artifacts that reside in this table
+ DropTarget target = new DropTarget(getStyledText(), DND.DROP_COPY);
+ target.setTransfer(new Transfer[] {ResourceTransfer.getInstance(), FileTransfer.getInstance(),
+ TextTransfer.getInstance(), ArtifactTransfer.getInstance()});
+ target.addDropListener(new DropTargetAdapter() {
+
+ public void drop(DropTargetEvent event) {
+ performDrop(event);
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ event.detail = DND.DROP_COPY;
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ }
+ });
+ }
+
+ private void performDrop(DropTargetEvent e) {
+ Set<String> strs = new HashSet<String>();
+ if (e.data instanceof String) {
+ strs.add((String) e.data);
+ } else if (e.data instanceof String[]) {
+ for (String str : (String[]) e.data)
+ strs.add(str);
+ } else if (e.data instanceof IResource[]) {
+ IResource res[] = (IResource[]) e.data;
+ for (Object obj : res) {
+ StringBuffer sb = new StringBuffer();
+ if (obj instanceof IFile) {
+ IFile iFile = (IFile) obj;
+ if (iFile != null) {
+ File file = AWorkspace.iFileToFile(iFile);
+ try {
+ String javaPkg = AJavaProject.getJavaPackage(file);
+ if (javaPkg != null && !javaPkg.equals("")) sb.append(javaPkg + " - ");
+ } catch (Exception ex) {
+ // do nothing
+ }
+ sb.append(iFile.getName());
+ String ver = "unknown";//TODO properly abstract out version control (team providers?) so that we can get the version - VersionControl.getInstance().getRepositoryEntry(file).getVersion();
+ if (ver != null) {
+ if (ver.equals("unknown")) ver = "enter version here";
+ sb.append(" (" + ver + ")");
+ }
+ }
+ }
+ if (!sb.toString().equals("")) strs.add(sb.toString());
+ }
+ }
+ for (String str : strs) {
+ append(str + "\n");
+ }
+ refresh();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellCheckPaintListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellCheckPaintListener.java
new file mode 100644
index 00000000000..6612d1b4050
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellCheckPaintListener.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+import org.eclipse.osee.framework.ui.swt.styledText.ASpellWord;
+import org.eclipse.osee.framework.ui.swt.styledText.IDictionary;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * PaintListener that will underline all misspelled words in a StyledText widget. This class must be extended to provide
+ * for getting the dictionary and activating/deactivating certain functionality.
+ *
+ * @author Donald G. Dunne
+ */
+public class XTextSpellCheckPaintListener implements PaintListener {
+
+ private final IDictionary dict;
+ private final XText xText;
+ private Set<ASpellWord> errors = new HashSet<ASpellWord>();
+ private XTextSpellModifyDictionary modDict;
+
+ public XTextSpellCheckPaintListener(final XText xText, IDictionary dict) {
+ this.xText = xText;
+ this.dict = dict;
+ if (modDict != null) {
+ addXTextSpellModifyDictionary(modDict);
+ }
+ }
+
+ public void addXTextSpellModifyDictionary(XTextSpellModifyDictionary modDict) {
+ if (xText == null || xText.getStyledText() == null || xText.getStyledText().isDisposed()) return;
+ this.modDict = modDict;
+ xText.getStyledText().addMouseListener(mouseListener);
+ xText.getStyledText().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (xText == null || xText.getStyledText() == null || xText.getStyledText().isDisposed()) return;
+ xText.getStyledText().removeMouseListener(mouseListener);
+ }
+ });
+ }
+
+ public void paintControl(PaintEvent e) {
+ if (xText == null || xText.getStyledText() == null || xText.getStyledText().isDisposed()) return;
+ GC gc = e.gc;
+ gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+ if (xText != null) {
+ String text = xText.getStyledText().getText();
+
+ // Get spelling errors
+ getErrors(text);
+ for (ASpellWord sw : errors)
+ drawError(sw.start, sw.word.length(), xText.getStyledText(), gc);
+ }
+ }
+
+ private MouseListener mouseListener = new MouseListener() {
+ public void mouseUp(org.eclipse.swt.events.MouseEvent e) {
+ StyledText styledText = (StyledText) e.widget;
+ int offset = 0;
+ try {
+ offset = styledText.getOffsetAtLocation(new Point(e.x, e.y));
+ } catch (IllegalArgumentException ex) {
+ // Illegal arguement exception happens when selected point is outside
+ // the range of the rectangle. Since it does it's own calculation, just
+ // throw this exception away.
+ return;
+ }
+ for (ASpellWord sw : errors) {
+ if (sw.start < offset && (sw.start + sw.word.length()) > offset) {
+ // System.out.println("Found error word " + sw.word);
+ handleErrorSelected(sw);
+ break;
+ }
+ }
+ };
+
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+ };
+
+ private void handleErrorSelected(final ASpellWord sw) {
+ Menu menu = xText.getStyledText().getMenu();
+
+ new MenuItem(menu, SWT.SEPARATOR);
+
+ MenuItem addLocal = new MenuItem(menu, SWT.NONE);
+ addLocal.setText("Add \"" + sw.word + "\" to Personal dictionary.");
+ addLocal.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ if (modDict.addToLocalDictionary(sw.word)) {
+ xText.getStyledText().redraw();
+ }
+ }
+ });
+
+ MenuItem addGlobal = new MenuItem(menu, SWT.NONE);
+ addGlobal.setText("Add \"" + sw.word + "\" to Global dictionary.");
+ addGlobal.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ if (modDict.addToGlobalDictionary(sw.word)) {
+ xText.getStyledText().redraw();
+ }
+ }
+ });
+ menu.addMenuListener(new MenuListener() {
+ public void menuHidden(MenuEvent e) {
+ xText.getStyledText().setMenu(xText.getDefaultMenu());
+ }
+
+ public void menuShown(MenuEvent e) {
+ };
+ });
+ }
+
+ /**
+ * Draws a single spelling error squiggly line
+ *
+ * @param offset - offset of bad word
+ * @param len - length of bad word
+ */
+ private void drawError(int offset, int len, StyledText sText, GC gc) {
+ if (sText.isDisposed()) return;
+ // Convert to coordinates
+ try {
+ Point off1 = sText.getLocationAtOffset(offset);
+ off1.y--;
+ Point off2 = sText.getLocationAtOffset(offset + len);
+ off2.y--;
+ int h = sText.getLineHeight();
+ int[] polyline = computePolyline(off1, off2, h);
+ gc.drawPolyline(polyline);
+ } catch (RuntimeException e) {
+ }
+ }
+
+ /**
+ */
+ private void getErrors(String str) {
+ errors.clear();
+ StringTokenizer st = new StringTokenizer(str, "[\t\r\n ]", true);
+ int loc = 0;
+ while (st.hasMoreTokens()) {
+ String string = st.nextToken();
+ // if not a whitespace character
+ if (!string.matches("^\\s*$")) {
+ // System.out.println("isWord: orig *" + string + "* => *" + word + "*");
+ if (!dict.isWord(string)) {
+ ASpellWord sw = new ASpellWord(string, loc);
+ // System.out.println("word " + word + " is error");
+ errors.add(sw);
+ }
+ }
+ loc += string.length();
+ }
+ }
+
+ /**
+ * Computes the squiggly line.
+ *
+ * @param left the left end point
+ * @param right the right end point
+ * @param height the height of the squiggly line
+ * @return the polyline array
+ */
+ private int[] computePolyline(Point left, Point right, int height) {
+
+ final int WIDTH = 3;
+ final int HEIGHT = 0;
+
+ int w2 = 2 * WIDTH;
+ int peeks = (right.x - left.x) / w2;
+
+ int leftX = left.x;
+
+ // compute (number of points) * 2
+ int length = 4 * peeks + 2;
+ if (length <= 0) return new int[0];
+
+ int[] coordinates = new int[length];
+
+ // compute top and bottom of peeks
+ int bottom = left.y + height;
+ int top = bottom - HEIGHT;
+
+ // populate array with peek coordinates
+ int index = 0;
+ for (int i = 0; i < peeks; i++) {
+ coordinates[index++] = leftX + (w2 * i);
+ coordinates[index++] = bottom;
+ coordinates[index++] = coordinates[index - 3] + WIDTH;
+ coordinates[index++] = top;
+ }
+ // add the last down flank
+ coordinates[length - 2] = left.x + (w2 * peeks);
+ coordinates[length - 1] = bottom;
+ return coordinates;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellModifyDictionary.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellModifyDictionary.java
new file mode 100644
index 00000000000..96c23555d63
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTextSpellModifyDictionary.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.framework.ui.skynet.widgets;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface XTextSpellModifyDictionary {
+
+ public boolean addToLocalDictionary(String word);
+
+ public boolean addToGlobalDictionary(String word);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTypeListViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTypeListViewer.java
new file mode 100644
index 00000000000..cda1b8d4844
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XTypeListViewer.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.framework.ui.skynet.widgets;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public abstract class XTypeListViewer extends XListViewer {
+
+ public XTypeListViewer(String name) {
+ super(name);
+ setLabelProvider(new LabelProvider());
+ setSorter(new ViewerSorter());
+ }
+
+ public Branch resolveBranch(String keyedBranchName) {
+ try {
+ if (keyedBranchName != null) {
+ return BranchManager.getKeyedBranch(keyedBranchName);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return BranchManager.getLastBranch();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java
new file mode 100644
index 00000000000..da065ca874e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java
@@ -0,0 +1,509 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.Vector;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessageManager;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Abstract class for all widgets used in Wizards and Editors
+ */
+public abstract class XWidget {
+ public final static String XWIDGET_DATA_KEY = "xWidget";
+
+ private IManagedForm managedForm;
+
+ protected Label labelWidget = null;
+ private String label = "";
+ private String xmlRoot = "";
+ private String xmlSubRoot = "";
+ private String toolTip = null;
+ private boolean requiredEntry = false;
+ private boolean editable = true;
+ private final MutableBoolean isNotificationAllowed = new MutableBoolean(true);
+
+ protected boolean verticalLabel = false;
+ protected boolean fillVertically = false;
+ protected boolean fillHorizontally = false;
+
+ /**
+ * @return the fillHorizontally
+ */
+ public boolean isFillHorizontally() {
+ return fillHorizontally;
+ }
+
+ private boolean displayLabel = true;
+ private final Set<XModifiedListener> modifiedListeners = new LinkedHashSet<XModifiedListener>();
+ private MouseListener mouseLabelListener;
+ protected FormToolkit toolkit;
+
+ public XWidget(String label) {
+ this.label = label;
+ }
+
+ public XWidget(String label, String xmlRoot) {
+ this.label = label;
+ this.xmlRoot = xmlRoot;
+ }
+
+ public XWidget(String label, String xmlRoot, String xmlSubRoot) {
+ this.label = label;
+ this.xmlRoot = xmlRoot;
+ this.xmlSubRoot = xmlSubRoot;
+ }
+
+ public void setToolTip(String toolTip) {
+ this.toolTip = toolTip;
+ if (this.labelWidget != null && !labelWidget.isDisposed()) this.labelWidget.setToolTipText(toolTip);
+ }
+
+ public void addXModifiedListener(XModifiedListener listener) {
+ modifiedListeners.add(listener);
+ }
+
+ public void notifyXModifiedListeners() {
+ if (areNotificationsAllowed()) {
+ for (XModifiedListener listener : modifiedListeners) {
+ listener.widgetModified(this);
+ }
+ }
+ }
+
+ public boolean areNotificationsAllowed() {
+ return isNotificationAllowed.getValue();
+ }
+
+ protected IManagedForm getManagedForm() {
+ return managedForm;
+ }
+
+ public boolean isInForm() {
+ return getManagedForm() != null;
+ }
+
+ protected IMessageManager getMessageManager() {
+ return getManagedForm() != null ? managedForm.getMessageManager() : null;
+ }
+
+ public void setMessage(String messageId, String messageText, int type) {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.addMessage(messageId, messageText, null, type);
+ }
+ }
+
+ public boolean isFormReady() {
+ // Set to true if outside of a form;
+ boolean result = managedForm == null;
+ if (managedForm != null) {
+ result = !managedForm.getForm().isDisposed();
+ }
+ return result;
+ }
+
+ public void setControlCausedMessage(String messageId, String messageText, int type) {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.addMessage(messageId, messageText, null, type, getErrorMessageControl());
+ }
+ }
+
+ public void setControlCausedMessageByObject(String messageText, int type) {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.addMessage(this, messageText, null, type, getErrorMessageControl());
+ }
+ }
+
+ public void removeControlCausedMessageByObject() {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.removeMessage(this, getErrorMessageControl());
+ }
+ }
+
+ public void removeControlCausedMessage(String messageId) {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.removeMessage(messageId, getErrorMessageControl());
+ }
+ }
+
+ public void removeControlCausedMessages() {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.removeMessage(getErrorMessageControl());
+ }
+ }
+
+ public void removeMessage(String messageId) {
+ IMessageManager messageManager = getMessageManager();
+ if (messageManager != null && isFormReady()) {
+ messageManager.removeMessage(messageId);
+ }
+ }
+
+ public void validate() {
+ if (isEditable() && Widgets.isAccessible(getControl()) && isFormReady() && areNotificationsAllowed()) {
+ IStatus status = isValid();
+ if (isInForm()) {
+ XWidgetValidateUtility.setStatus(status, this);
+ } else {
+ if (Widgets.isAccessible(labelWidget)) {
+ labelWidget.setForeground(status.isOK() ? null : Display.getCurrent().getSystemColor(SWT.COLOR_RED));
+ if (mouseLabelListener == null) {
+ mouseLabelListener = new MouseListener() {
+ public void mouseDoubleClick(MouseEvent e) {
+ openHelp();
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseUp(MouseEvent e) {
+ }
+ };
+ labelWidget.addMouseListener(mouseLabelListener);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the control that the error message is to be placed. By default the getControl() will be used. Override to
+ * change.
+ *
+ * @return control
+ */
+ public Control getErrorMessageControl() {
+ return getControl();
+ }
+
+ public abstract Control getControl();
+
+ public void openHelp() {
+ try {
+ if (toolTip != null && label != null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ label + " Tool Tip", toolTip);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ protected void setNotificationsAllowed(boolean areAllowed) {
+ this.isNotificationAllowed.setValue(areAllowed);
+ }
+
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ }
+
+ public final void createWidgets(Composite parent, int horizontalSpan) {
+ setNotificationsAllowed(false);
+ try {
+ createControls(parent, horizontalSpan);
+ } finally {
+ setNotificationsAllowed(true);
+ }
+ }
+
+ public final void createWidgets(IManagedForm managedForm, Composite parent, int horizontalSpan) {
+ if (managedForm != null) {
+ this.toolkit = managedForm.getToolkit();
+ this.managedForm = managedForm;
+ }
+ createWidgets(parent, horizontalSpan);
+ adaptControls(toolkit);
+
+ // Added to be able to operate on XWidget who create the control
+ Control internalControl = getControl();
+ if (internalControl != null) {
+ internalControl.setData(XWIDGET_DATA_KEY, this);
+ }
+ }
+
+ public void adaptControls(FormToolkit toolkit) {
+ if (toolkit != null) {
+ if (getControl() != null) {
+ toolkit.adapt(getControl(), true, false);
+ }
+ if (labelWidget != null) {
+ toolkit.adapt(labelWidget, true, true);
+ toolkit.adapt(labelWidget.getParent(), true, true);
+ }
+ }
+ }
+
+ /**
+ * Create Widgets used to display label and entry for wizards and editors
+ */
+ public void dispose() {
+ if (Widgets.isAccessible(managedForm.getForm())) {
+ removeControlCausedMessageByObject();
+ }
+ }
+
+ /**
+ * Set focus to the entry widget
+ */
+ public abstract void setFocus();
+
+ /**
+ * Refresh the entry widget
+ */
+ public abstract void refresh();
+
+ /**
+ * Return true if entry is valid
+ *
+ * @return Return boolean validity indication.
+ */
+ public abstract IStatus isValid();
+
+ /**
+ * Called with string found between xml tags Used by setFromXml() String will be sent through AXml.xmlToText() before
+ * being sent to setXmlData implementation. Used by: setFromXml
+ *
+ * @param str - value to set
+ */
+ public abstract void setXmlData(String str);
+
+ /**
+ * Return string to save off between xml tags Used by call to toXml() String returned will be sent through
+ * AXml.textToXml() before being saved Used by: toXml
+ *
+ * @return Return Xml data string.
+ */
+ protected abstract String getXmlData();
+
+ public abstract String toHTML(String labelFont);
+
+ protected String toXml() throws Exception {
+ if (xmlSubRoot.equals("")) {
+ return toXml(xmlRoot);
+ } else {
+ return toXml(xmlRoot, xmlSubRoot);
+ }
+ }
+
+ protected String toXml(String xmlRoot) throws Exception {
+ String s = "<" + xmlRoot + ">" + AXml.textToXml(getXmlData()) + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ public String toXml(String xmlRoot, String xmlSubRoot) throws Exception {
+ String s =
+ "<" + xmlRoot + ">" + "<" + xmlSubRoot + ">" + AXml.textToXml(getXmlData()) + "</" + xmlSubRoot + ">" + "</" + xmlRoot + ">\n";
+ return s;
+ }
+
+ public void setFromXml(String xml) throws IllegalStateException {
+ Matcher m;
+ m = Pattern.compile("<" + xmlRoot + ">(.*?)</" + xmlRoot + ">", Pattern.MULTILINE | Pattern.DOTALL).matcher(xml);
+ if (m.find()) setXmlData(AXml.xmlToText(m.group(1)));
+ }
+
+ /**
+ * @return Returns vector of Strings.
+ */
+ public Vector<String> getDisplayLabels() {
+ Vector<String> l = new Vector<String>();
+ l.add(label);
+ return l;
+ }
+
+ /**
+ * @param displayLabel The displayLabel to set.
+ */
+ public void setDisplayLabel(String displayLabel) {
+ this.label = displayLabel;
+ }
+
+ /**
+ * @return Returns the editable.
+ */
+ public boolean isEditable() {
+ return editable;
+ }
+
+ /**
+ * @param editable The editable to set.
+ */
+ public void setEditable(boolean editable) {
+ this.editable = editable;
+ }
+
+ /**
+ * @return Returns the verticalLabel.
+ */
+ public boolean isVerticalLabel() {
+ return verticalLabel;
+ }
+
+ /**
+ * @param verticalLabel The verticalLabel to set.
+ */
+ public void setVerticalLabel(boolean verticalLabel) {
+ this.verticalLabel = verticalLabel;
+ }
+
+ /**
+ * @return Returns the xmlRoot.
+ */
+ public String getXmlRoot() {
+ return xmlRoot;
+ }
+
+ /**
+ * @param xmlRoot The xmlRoot to set.
+ */
+ public void setXmlRoot(String xmlRoot) {
+ this.xmlRoot = xmlRoot;
+ }
+
+ /**
+ * @return Returns the xmlSubRoot.
+ */
+ public String getXmlSubRoot() {
+ return xmlSubRoot;
+ }
+
+ /**
+ * @param xmlSubRoot The xmlSubRoot to set.
+ */
+ public void setXmlSubRoot(String xmlSubRoot) {
+ this.xmlSubRoot = xmlSubRoot;
+ }
+
+ /**
+ * @return Returns the toolTip.
+ */
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ /**
+ * @return Returns the fillVertically.
+ */
+ public boolean isFillVertically() {
+ return fillVertically;
+ }
+
+ /**
+ * @param fillVertically The fillVertically to set.
+ */
+ public void setFillVertically(boolean fillVertically) {
+ this.fillVertically = fillVertically;
+ }
+
+ /**
+ * @return Returns the label.
+ */
+ public String getLabel() {
+ return label;
+ }
+
+ /**
+ * @param label The label to set.
+ */
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ /**
+ * @return Returns the labelWidget.
+ */
+ public Label getLabelWidget() {
+ return labelWidget;
+ }
+
+ /**
+ * @param labelWidget The labelWidget to set.
+ */
+ protected void setLabelWidget(Label labelWidget) {
+ this.labelWidget = labelWidget;
+ }
+
+ /**
+ * @return Returns the requiredEntry.
+ */
+ public boolean isRequiredEntry() {
+ return requiredEntry;
+ }
+
+ /**
+ * @param requiredEntry The requiredEntry to set.
+ */
+ public void setRequiredEntry(boolean requiredEntry) {
+ this.requiredEntry = requiredEntry;
+ }
+
+ /**
+ * Return data for display in Report (without label) NOTE: There should be no newlines at end of String
+ *
+ * @return Return string.
+ */
+ protected abstract String getReportData();
+
+ @Override
+ public String toString() {
+ return String.format("%s: %s\n\n", getLabel(), getReportData());
+ }
+
+ /**
+ * If set, label will be displayed with entry widget.
+ *
+ * @param displayLabel The displayLabel to set.
+ */
+ public void setDisplayLabel(boolean displayLabel) {
+ this.displayLabel = displayLabel;
+ }
+
+ public void setFillHorizontally(boolean fillHorizontally) {
+ this.fillHorizontally = fillHorizontally;
+ }
+
+ public abstract Object getData();
+
+ /**
+ * @return the displayLabel
+ */
+ public boolean isDisplayLabel() {
+ return displayLabel;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetUtility.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetUtility.java
new file mode 100644
index 00000000000..2b90d14c6a8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetUtility.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.framework.ui.skynet.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XWidgetUtility {
+
+ private XWidgetUtility() {
+ }
+
+ public static boolean isWidgetAccesible(Widget widget) {
+ return widget != null && !widget.isDisposed();
+ }
+
+ public static List<XWidget> findXWidgetsInControl(Widget parent) {
+ List<XWidget> xWidgets = new ArrayList<XWidget>();
+ XWidget xWidget = asXWidget(parent);
+ if (xWidget != null) {
+ xWidgets.add(xWidget);
+ }
+ if (parent instanceof Composite) {
+ Composite container = (Composite) parent;
+ for (Control child : container.getChildren()) {
+ xWidgets.addAll(findXWidgetsInControl(child));
+ }
+ }
+ return xWidgets;
+ }
+
+ public static XWidget asXWidget(Widget widget) {
+ XWidget toReturn = null;
+ if (widget != null) {
+ Object object = widget.getData(XWidget.XWIDGET_DATA_KEY);
+ toReturn = object instanceof XWidget ? (XWidget) object : null;
+ }
+ return toReturn;
+ }
+
+ public static boolean hasXWidget(Widget widget) {
+ boolean result = false;
+ if (widget != null) {
+ Object object = widget.getData(XWidget.XWIDGET_DATA_KEY);
+ result = object instanceof XWidget;
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetValidateUtility.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetValidateUtility.java
new file mode 100644
index 00000000000..9bc9206d58f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidgetValidateUtility.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.framework.ui.skynet.widgets;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XWidgetValidateUtility {
+
+ private XWidgetValidateUtility() {
+ }
+
+ public static void validate(int requiredQualityOfService, XWidget xWidget, Artifact artifact, String attributeTypeName, Object proposedValue) {
+ IStatus status =
+ OseeValidator.getInstance().validate(requiredQualityOfService, artifact, attributeTypeName, proposedValue);
+ setStatus(status, xWidget);
+ }
+
+ public static void setStatus(IStatus status, XWidget xWidget) {
+ if (status.isMultiStatus()) {
+ for (IStatus item : status.getChildren()) {
+ if (item.isOK()) {
+ xWidget.removeControlCausedMessage(item.getPlugin());
+ } else {
+ xWidget.setControlCausedMessage(item.getPlugin(), item.getMessage(),
+ toMessageProviderLevel(item.getSeverity()));
+ }
+ }
+ } else {
+ if (!status.isOK()) {
+ xWidget.setControlCausedMessageByObject(status.getMessage(), toMessageProviderLevel(status.getSeverity()));
+ } else {
+ xWidget.removeControlCausedMessageByObject();
+ }
+ }
+ }
+
+ public static boolean isValueInRange(int value, int min, int max) {
+ return min <= value && value < max;
+ }
+
+ public static int toMessageProviderLevel(int level) {
+ int toReturn = IMessageProvider.NONE;
+ if (level == IStatus.INFO) {
+ toReturn = IMessageProvider.INFORMATION;
+ } else if (level == IStatus.WARNING) {
+ toReturn = IMessageProvider.WARNING;
+ } else if (level == IStatus.ERROR) {
+ toReturn = IMessageProvider.ERROR;
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/DateValue.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/DateValue.java
new file mode 100644
index 00000000000..1b18674f35f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/DateValue.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.framework.ui.skynet.widgets.cellEditor;
+
+import java.util.Date;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class DateValue extends UniversalCellEditorValue {
+ private Date date;
+
+ /**
+ *
+ */
+ public DateValue() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.swt.universalCellEditor.UniversalCellEditorValue#selectControl(org.eclipse.swt.widgets.Control[])
+ */
+ @Override
+ public Control prepareControl(UniversalCellEditor universalEditor) {
+ CalendarCombo datePicker = universalEditor.getDateControl();
+ datePicker.setDate(date);
+ return datePicker;
+ }
+
+ public void setValue(Date date) {
+ this.date = date;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/EnumeratedValue.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/EnumeratedValue.java
new file mode 100644
index 00000000000..84cdbf79ab3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/EnumeratedValue.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.framework.ui.skynet.widgets.cellEditor;
+
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class EnumeratedValue extends UniversalCellEditorValue {
+ private String value;
+ private String[] choices;
+
+ /**
+ *
+ */
+ public EnumeratedValue() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.swt.universalCellEditor.UniversalCellEditorValue#selectControl(org.eclipse.swt.widgets.Control[])
+ */
+ @Override
+ public Control prepareControl(UniversalCellEditor universalEditor) {
+ Combo comboBox = universalEditor.getEnumeratedControl();
+ comboBox.setItems(choices);
+ if (value != null) comboBox.setText(value);
+
+ comboBox.setVisibleItemCount(15);
+ return comboBox;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public void setChoices(String[] choices) {
+ this.choices = choices;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/StringValue.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/StringValue.java
new file mode 100644
index 00000000000..b2f6db564f9
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/StringValue.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.skynet.widgets.cellEditor;
+
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class StringValue extends UniversalCellEditorValue {
+ private String value;
+
+ /**
+ *
+ */
+ public StringValue() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.jdk.core.swt.universalCellEditor.UniversalCellEditorValue#selectControl(org.eclipse.swt.widgets.Control[])
+ */
+ @Override
+ public Control prepareControl(UniversalCellEditor universalEditor) {
+ Text textBox = universalEditor.getStringControl();
+ if (value != null) textBox.setText(value);
+ return textBox;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditor.java
new file mode 100644
index 00000000000..9f1b99f749f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditor.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.cellEditor;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class UniversalCellEditor extends CellEditor {
+ private final Combo comboBox;
+ private final Text textBox;
+ private final CalendarCombo datePicker;
+ private Control control;
+ private boolean personCombo = false;
+
+ /**
+ * @param parent
+ */
+ public UniversalCellEditor(Composite parent) {
+ this(parent, SWT.NONE);
+ }
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public UniversalCellEditor(Composite parent, int style) {
+ super(parent, style);
+ this.comboBox = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
+ this.textBox = new Text(parent, SWT.SINGLE);
+ this.datePicker = new CalendarCombo(parent, SWT.BORDER);
+
+ setValueValid(true);
+ }
+
+ public Text getStringControl() {
+ return textBox;
+ }
+
+ public Combo getEnumeratedControl() {
+ return comboBox;
+ }
+
+ public Combo getPersonComboControl() {
+ personCombo = true;
+ return comboBox;
+ }
+
+ public CalendarCombo getDateControl() {
+ return datePicker;
+ }
+
+ /**
+ * Since UniveralCellEditor is managing its own controls and the CellEditor's mechanisms for managing the control
+ * have been completly overridden, return null back to CellEditor when it calls this method
+ */
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createControl(Composite parent) {
+ return null;
+ }
+
+ /**
+ * Returns whether this cell editor is activated.
+ *
+ * @return <code>true</code> if this cell editor's control is currently visible, and <code>false</code> if not
+ * visible
+ */
+ @Override
+ public boolean isActivated() {
+ return control != null && control.isVisible();
+ }
+
+ /**
+ * Returns the control used to implement this cell editor.
+ *
+ * @return the control, or <code>null</code> if this cell editor has no control
+ */
+ @Override
+ public Control getControl() {
+ return control;
+ }
+
+ /**
+ * Hides this cell editor's control. Does nothing if this cell editor is not visible.
+ */
+ @Override
+ public void deactivate() {
+ if (control != null && !control.isDisposed()) {
+ control.setVisible(false);
+ }
+ }
+
+ /**
+ * Disposes of this cell editor and frees any associated SWT resources.
+ */
+ @Override
+ public void dispose() {
+ if (control != null && !control.isDisposed()) {
+ control.dispose();
+ }
+ control = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#doGetValue()
+ */
+ @Override
+ protected Object doGetValue() {
+ if ((control instanceof Combo) && personCombo) {
+ return comboBox.getText();
+ }
+ if (control instanceof Combo) {
+ return comboBox.getText();
+ }
+ if (control instanceof Text) {
+ return textBox.getText();
+ }
+ if (control instanceof CalendarCombo) {
+ return datePicker.getDate().getTime();
+ }
+ throw new IllegalArgumentException("Control was of an unexpected type: " + control.getClass().getName());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
+ */
+ @Override
+ protected void doSetFocus() {
+ control.setFocus();
+ }
+
+ /**
+ * called just before a cell is to be edited
+ */
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#doSetValue(java.lang.Object)
+ */
+ @Override
+ protected void doSetValue(Object value) {
+ if (value instanceof UniversalCellEditorValue) {
+ UniversalCellEditorValue editorValue = (UniversalCellEditorValue) value;
+ control = editorValue.prepareControl(this);
+ } else {
+ throw new IllegalArgumentException("value of unexpected type: " + value.getClass().getName());
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditorValue.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditorValue.java
new file mode 100644
index 00000000000..1a4f703b453
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/cellEditor/UniversalCellEditorValue.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.framework.ui.skynet.widgets.cellEditor;
+
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public abstract class UniversalCellEditorValue {
+ /**
+ *
+ */
+ protected UniversalCellEditorValue() {
+ super();
+ }
+
+ public abstract Control prepareControl(UniversalCellEditor universalEditor);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactCheckTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactCheckTreeDialog.java
new file mode 100644
index 00000000000..1b11ed772a4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactCheckTreeDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactCheckTreeDialog extends CheckedTreeSelectionDialog {
+
+ public ArtifactCheckTreeDialog(Collection<? extends Artifact> artifacts) {
+ this(artifacts, new ArtifactDescriptiveLabelProvider());
+ }
+
+ public ArtifactCheckTreeDialog(Collection<? extends Artifact> artifacts, ILabelProvider iLabelProvider) {
+ super(Display.getCurrent().getActiveShell(), iLabelProvider, new ArtifactTreeContentProvider());
+ if (artifacts != null) setInput(artifacts);
+ }
+
+ public ArtifactCheckTreeDialog() {
+ this(null);
+ }
+
+ public Collection<Artifact> getSelection() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ for (Object obj : getResult())
+ arts.add((Artifact) obj);
+ return arts;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTreeViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((Artifact) e1).getDescriptiveName(), ((Artifact) e2).getDescriptiveName());
+ }
+ });
+ return c;
+ }
+
+ public void setArtifacts(Collection<? extends Artifact> artifacts) {
+ setInput(artifacts);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactListDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactListDialog.java
new file mode 100644
index 00000000000..ed353a54011
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactListDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactDescriptiveLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactListDialog extends ListDialog {
+
+ boolean requireSelection = true;
+
+ /**
+ * @return the requireSelection
+ */
+ public boolean isRequireSelection() {
+ return requireSelection;
+ }
+
+ /**
+ * @param requireSelection the requireSelection to set
+ */
+ public void setRequireSelection(boolean requireSelection) {
+ this.requireSelection = requireSelection;
+ }
+
+ public ArtifactListDialog(Shell parent) {
+ this(parent, null);
+ }
+
+ public ArtifactListDialog(Shell parent, Collection<? extends Artifact> artifacts) {
+ super(parent);
+ setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new ArtifactDescriptiveLabelProvider());
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ public Artifact getSelection() {
+ return (Artifact) getResult()[0];
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTableViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((Artifact) e1).getDescriptiveName(), ((Artifact) e2).getDescriptiveName());
+ }
+ });
+ return c;
+ }
+
+ public void setArtifacts(Collection<? extends Artifact> artifacts) {
+ setInput(artifacts);
+ }
+
+ public void updateArtifacts(Collection<? extends Artifact> artifacts) {
+ getTableViewer().setInput(artifacts);
+ getTableViewer().refresh();
+ }
+
+ @Override
+ protected void okPressed() {
+ if (requireSelection && getTableViewer().getSelection().isEmpty()) {
+ AWorkbench.popup("ERROR", "Must make selection.");
+ return;
+ }
+ super.okPressed();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeChildrenContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeChildrenContentProvider.java
new file mode 100644
index 00000000000..5aa87afac3c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeChildrenContentProvider.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.dialog;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * Shows artifacts and children of given class
+ *
+ * @author Donald G. Dunne
+ */
+public class ArtifactTreeChildrenContentProvider implements ITreeContentProvider {
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ protected TreeViewer viewer;
+ private final Class<? extends Artifact> clazz;
+
+ public ArtifactTreeChildrenContentProvider(Class<? extends Artifact> clazz) {
+ this.clazz = clazz;
+ }
+
+ /*
+ * @see IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /**
+ * Notifies this content provider that the given viewer's input has been switched to a different element.
+ * <p>
+ * A typical use for this method is registering the content provider as a listener to changes on the new input (using
+ * model-specific means), and deregistering the viewer from the old input. In response to these change notifications,
+ * the content provider propagates the changes to the viewer.
+ * </p>
+ *
+ * @param viewer the viewer
+ * @param oldInput the old input element, or <code>null</code> if the viewer did not previously have an input
+ * @param newInput the new input element, or <code>null</code> if the viewer does not have an input
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = (TreeViewer) viewer;
+ }
+
+ /**
+ * The tree viewer calls its content provider&#8217;s getChildren method when it needs to create or display the child
+ * elements of the domain object, <b>parent </b>. This method should answer an array of domain objects that represent
+ * the unfiltered children of <b>parent </b>
+ *
+ * @see ITreeContentProvider#getChildren(Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ if (parentElement.getClass().equals(clazz)) {
+ try {
+ return Artifacts.getChildrenOfTypeSet((Artifact) parentElement, clazz, true).toArray();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return EMPTY_ARRAY;
+ }
+
+ /*
+ * @see ITreeContentProvider#getParent(Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /**
+ * The tree viewer asks its content provider if the domain object represented by <b>element </b> has any children.
+ * This method is used by the tree viewer to determine whether or not a plus or minus should appear on the tree
+ * widget.
+ *
+ * @see ITreeContentProvider#hasChildren(Object)
+ */
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ /**
+ * This is the method invoked by calling the <b>setInput </b> method on the tree viewer. In fact, the <b>getElements
+ * </b> method is called only in response to the tree viewer's <b>setInput </b> method and should answer with the
+ * appropriate domain objects of the inputElement. The <b>getElements </b> and <b>getChildren </b> methods operate in
+ * a similar way. Depending on your domain objects, you may have the <b>getElements </b> simply return the result of
+ * calling <b>getChildren </b>. The two methods are kept distinct because it provides a clean way to differentiate
+ * between the root domain object and all other domain objects.
+ *
+ * @see IStructuredContentProvider#getElements(Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeContentProvider.java
new file mode 100644
index 00000000000..344dd326a27
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTreeContentProvider.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * The basis for the comments in this class can be found at
+ * http://www.eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
+ *
+ * @author Ryan D. Brooks
+ */
+public class ArtifactTreeContentProvider implements ITreeContentProvider {
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ protected TreeViewer viewer;
+
+ public ArtifactTreeContentProvider() {
+ }
+
+ /*
+ * @see IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /**
+ * Notifies this content provider that the given viewer's input has been switched to a different element.
+ * <p>
+ * A typical use for this method is registering the content provider as a listener to changes on the new input (using
+ * model-specific means), and deregistering the viewer from the old input. In response to these change notifications,
+ * the content provider propagates the changes to the viewer.
+ * </p>
+ *
+ * @param viewer the viewer
+ * @param oldInput the old input element, or <code>null</code> if the viewer did not previously have an input
+ * @param newInput the new input element, or <code>null</code> if the viewer does not have an input
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = (TreeViewer) viewer;
+ // if (oldInput != null) {
+ // ((Artifact) oldInput).removeListenerRecursively(this);
+ // }
+ // if (newInput != null) { // TODO: must handle fact that only root item has a listener added
+ // ((Artifact) newInput).addListener(this);
+ // }
+ }
+
+ /**
+ * The tree viewer calls its content provider&#8217;s getChildren method when it needs to create or display the child
+ * elements of the domain object, <b>parent </b>. This method should answer an array of domain objects that represent
+ * the unfiltered children of <b>parent </b>
+ *
+ * @see ITreeContentProvider#getChildren(Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ /*
+ * @see ITreeContentProvider#getParent(Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /**
+ * The tree viewer asks its content provider if the domain object represented by <b>element </b> has any children.
+ * This method is used by the tree viewer to determine whether or not a plus or minus should appear on the tree
+ * widget.
+ *
+ * @see ITreeContentProvider#hasChildren(Object)
+ */
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ /**
+ * This is the method invoked by calling the <b>setInput </b> method on the tree viewer. In fact, the <b>getElements
+ * </b> method is called only in response to the tree viewer's <b>setInput </b> method and should answer with the
+ * appropriate domain objects of the inputElement. The <b>getElements </b> and <b>getChildren </b> methods operate in
+ * a similar way. Depending on your domain objects, you may have the <b>getElements </b> simply return the result of
+ * calling <b>getChildren </b>. The two methods are kept distinct because it provides a clean way to differentiate
+ * between the root domain object and all other domain objects.
+ *
+ * @see IStructuredContentProvider#getElements(Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTypeFilteredTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTypeFilteredTreeDialog.java
new file mode 100644
index 00000000000..aa3f104f913
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ArtifactTypeFilteredTreeDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactTypeLabelProvider;
+import org.eclipse.osee.framework.ui.skynet.util.ArtifactTypeNameSorter;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEEFilteredTreeDialog;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ArtifactTypeFilteredTreeDialog extends OSEEFilteredTreeDialog {
+
+ private final Collection<ArtifactType> artifactTypes;
+ private ArtifactType selection;
+
+ public ArtifactTypeFilteredTreeDialog(String title, String message, Collection<ArtifactType> artifactTypes) {
+ super(title, message, new PatternFilter());
+ this.artifactTypes = artifactTypes;
+ setCheckTree(false);
+ setMultiSelect(false);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control comp = super.createDialogArea(container);
+ try {
+ getTreeViewer().getViewer().setContentProvider(new ArrayTreeContentProvider());
+ getTreeViewer().getViewer().setLabelProvider(new ArtifactTypeLabelProvider());
+ getTreeViewer().getViewer().setSorter(new ArtifactTypeNameSorter());
+ getTreeViewer().getViewer().setInput(artifactTypes);
+ getTreeViewer().getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection sel = ((IStructuredSelection) getTreeViewer().getViewer().getSelection());
+ if (sel.isEmpty()) {
+ selection = null;
+ } else {
+ selection =
+ (ArtifactType) ((IStructuredSelection) getTreeViewer().getViewer().getSelection()).getFirstElement();
+ }
+ }
+ });
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 500;
+ getTreeViewer().getViewer().getTree().setLayoutData(gd);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return comp;
+ }
+
+ @Override
+ protected Result isComplete() {
+ try {
+ if (selection != null) {
+ return Result.TrueResult;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return super.isComplete();
+ }
+
+ /**
+ * @return the selection
+ */
+ public ArtifactType getSelection() {
+ return selection;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeCheckTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeCheckTreeDialog.java
new file mode 100644
index 00000000000..0b014fd80fe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeCheckTreeDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.plugin.util.ArrayTreeContentProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AttributeTypeCheckTreeDialog extends CheckedTreeSelectionDialog {
+
+ public AttributeTypeCheckTreeDialog(Collection<? extends AttributeType> attributeTypes) {
+ this(attributeTypes, new AttributeTypeLabelProvider());
+ }
+
+ public AttributeTypeCheckTreeDialog(Collection<? extends AttributeType> attributeTypes, ILabelProvider iLabelProvider) {
+ super(Display.getCurrent().getActiveShell(), iLabelProvider, new ArrayTreeContentProvider());
+ if (attributeTypes != null) setInput(attributeTypes);
+ }
+
+ public AttributeTypeCheckTreeDialog() {
+ this(null);
+ }
+
+ public Collection<AttributeType> getSelection() {
+ ArrayList<AttributeType> arts = new ArrayList<AttributeType>();
+ for (Object obj : getResult())
+ arts.add((AttributeType) obj);
+ return arts;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTreeViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ AttributeType type1 = (AttributeType) e1;
+ AttributeType type2 = (AttributeType) e2;
+ return getComparator().compare(type1.getName(), type2.getName());
+ }
+ });
+ return c;
+ }
+
+ public void setAttributeType(Collection<? extends AttributeType> attributeTypes) {
+ setInput(attributeTypes);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeLabelProvider.java
new file mode 100644
index 00000000000..78bb201c467
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/AttributeTypeLabelProvider.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.framework.ui.skynet.widgets.dialog;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Generic Artifact Label Provider showing Descriptive Name as text
+ *
+ * @author Donald G. Dunne
+ */
+public class AttributeTypeLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ if (arg0 instanceof AttributeType) {
+ return ((AttributeType) arg0).getName();
+ }
+ return null;
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ChangeTypeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ChangeTypeDialog.java
new file mode 100644
index 00000000000..ed3e546d147
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ChangeTypeDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.util.ChangeType;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+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.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ChangeTypeDialog extends ListDialog {
+
+ ChangeType selected = null;
+
+ public ChangeTypeDialog(Shell parent) {
+ super(parent);
+ setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new ChangeLabelProvider());
+ setInput(ChangeType.values());
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ setTitle("Select Changet Type");
+ }
+
+ public ChangeType getSelection() {
+ return (ChangeType) getResult()[0];
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ (new Label(container, SWT.NONE)).setText(" Select Change Type:");
+
+ Control c = super.createDialogArea(container);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = 80;
+ gd.widthHint = 300;
+ getTableViewer().getTable().setLayoutData(gd);
+ GridLayout layout = ALayout.getZeroMarginLayout();
+ layout.marginWidth = 20;
+ getTableViewer().getTable().getParent().setLayout(layout);
+ if (selected != null) {
+ ArrayList<Object> sel = new ArrayList<Object>();
+ sel.add(selected);
+ getTableViewer().setSelection(new StructuredSelection(sel.toArray(new Object[sel.size()])));
+ getTableViewer().getTable().setFocus();
+ }
+ return c;
+ }
+
+ @Override
+ protected void okPressed() {
+ if (getTableViewer().getSelection().isEmpty()) {
+ AWorkbench.popup("ERROR", "Must make selection.");
+ return;
+ }
+ super.okPressed();
+ }
+
+ public class ChangeLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ ChangeType type = (ChangeType) arg0;
+ return type.getImage();
+ }
+
+ public String getText(Object arg0) {
+ ChangeType type = (ChangeType) arg0;
+ return type.name();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+ }
+
+ public void setSelected(ChangeType selected) {
+ this.selected = selected;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/CheckBoxDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/CheckBoxDialog.java
new file mode 100644
index 00000000000..4807179d8ef
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/CheckBoxDialog.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.framework.ui.skynet.widgets.dialog;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class CheckBoxDialog extends MessageDialog {
+
+ private Button checkButton;
+ boolean fillVertically = false;
+ private final String checkBoxMessage;
+
+ //Have to save off the value so it is available after the dialog is closed since checkButton will get disposed.
+ private boolean checked = false;
+
+ public CheckBoxDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, String checkBoxMessage, int dialogImageType, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, new String[] {"OK", "Cancel"},
+ defaultIndex);
+ this.checkBoxMessage = checkBoxMessage;
+ setBlockOnOpen(true);
+ }
+
+ public CheckBoxDialog(String dialogTitle, String dialogMessage, String checkBoxMessage) {
+ this(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, checkBoxMessage,
+ MessageDialog.QUESTION, 0);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+ checkButton = new Button(composite, SWT.CHECK);
+ checkButton.setText(checkBoxMessage);
+ checkButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ checked = checkButton.getSelection();
+ }
+ });
+
+ return composite;
+ }
+
+ public boolean isChecked() {
+ return checked;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/DateSelectionDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/DateSelectionDialog.java
new file mode 100644
index 00000000000..586332a4e4c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/DateSelectionDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.Calendar;
+import java.util.Date;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarCombo;
+import org.eclipse.nebula.widgets.calendarcombo.CalendarListenerAdapter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class DateSelectionDialog extends MessageDialog {
+
+ private Date selectedDate;
+
+ private final String dialogMessage;
+ private boolean noneSelected = false;
+
+ public DateSelectionDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex, Date selectedDate) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.selectedDate = selectedDate;
+ this.dialogMessage = dialogMessage;
+ }
+
+ public DateSelectionDialog(String dialogTitle, String dialogMessage, Date selectedDate) {
+ this(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.NONE, new String[] {
+ "Ok", "Cancel"}, 0, selectedDate);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+
+ Composite filterComp = new Composite(container, SWT.NONE);
+
+ filterComp.setLayout(new GridLayout(1, false));
+ filterComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ (new Label(filterComp, SWT.None)).setText(dialogMessage);
+
+ final CalendarCombo dp = new CalendarCombo(filterComp, SWT.SINGLE | SWT.FLAT);
+ if (selectedDate != null) dp.setDate(selectedDate);
+ dp.addCalendarListener(new CalendarListenerAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.calendarcombo.ICalendarListener#dateChanged(java.util.Calendar)
+ */
+ public void dateChanged(Calendar date) {
+ if (date == null) {
+ noneSelected = true;
+ } else {
+ noneSelected = false;
+ selectedDate = dp.getDate().getTime();
+ }
+ }
+ });
+
+ // set selected date if != null
+ return filterComp;
+ }
+
+ /**
+ * @return the selectedDate
+ */
+ public Date getSelectedDate() {
+ return selectedDate;
+ }
+
+ /**
+ * @param selectedDate the selectedDate to set
+ */
+ public void setSelectedDate(Date selectedDate) {
+ this.selectedDate = selectedDate;
+ }
+
+ /**
+ * @return the noneSelected
+ */
+ public boolean isNoneSelected() {
+ return noneSelected;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/Dialogs.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/Dialogs.java
new file mode 100644
index 00000000000..c09daab9227
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/Dialogs.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.framework.ui.skynet.widgets.dialog;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.HtmlExportTable;
+import org.eclipse.osee.framework.ui.skynet.util.email.EmailWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Dialogs {
+
+ /**
+ * Allows user to save html from a file selection dialog
+ *
+ * @param htmlText
+ * @param openInSystem true if desire to open resulting file in system browser after saving
+ * @return Result
+ */
+ public static Result saveHtmlDialog(String htmlText, boolean openInSystem) {
+ if (htmlText == null || htmlText.equals("")) {
+ AWorkbench.popup("ERROR", "Save data is empty. Nothing to save.");
+ return Result.FalseResult;
+ }
+ final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.SAVE);
+ dialog.setFilterExtensions(new String[] {"*.html"});
+ String filename = dialog.open();
+ if (filename == null || filename.equals("")) {
+ return Result.FalseResult;
+ }
+ try {
+ Lib.writeStringToFile(htmlText, new File(filename));
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return Result.FalseResult;
+ }
+ if (openInSystem) Program.launch(filename);
+ return Result.TrueResult;
+ }
+
+ public static Result emailDialog(String title, String text) {
+ if (text == null || text.equals("")) {
+ AWorkbench.popup("ERROR", "Save data is empty. Nothing to email.");
+ return Result.FalseResult;
+ }
+ EmailWizard ew = new EmailWizard(text, title, null, null);
+ WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), ew);
+ dialog.create();
+ if (dialog.open() == 0) {
+ return Result.TrueResult;
+ }
+ return Result.FalseResult;
+ }
+
+ public static Result exportHtmlTableDialog(String title, String htmlText, boolean openInSystem) {
+ if (htmlText == null || htmlText.equals("")) {
+ AWorkbench.popup("ERROR", "Save data is empty. Nothing to export.");
+ return Result.FalseResult;
+ }
+ return (new HtmlExportTable((title.equals("") ? "Exported Text" : title), htmlText, openInSystem)).export();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryCheckDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryCheckDialog.java
new file mode 100644
index 00000000000..f5924eefbb8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryCheckDialog.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.framework.ui.skynet.widgets.dialog;
+
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class EntryCheckDialog extends EntryDialog {
+
+ private final String checkBoxMessage;
+ private boolean checked = false;
+
+ /**
+ * @param dialogTitle
+ * @param dialogMessage
+ */
+ public EntryCheckDialog(String dialogTitle, String dialogMessage, String checkBoxMessage) {
+ super(dialogTitle, dialogMessage);
+ this.checkBoxMessage = checkBoxMessage;
+ }
+
+ /**
+ * @param parentShell
+ * @param dialogTitle
+ * @param dialogTitleImage
+ * @param dialogMessage
+ * @param dialogImageType
+ * @param dialogButtonLabels
+ * @param defaultIndex
+ */
+ public EntryCheckDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, String checkBoxMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.checkBoxMessage = checkBoxMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.dialog.EntryDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected void createExtendedArea(Composite parent) {
+
+ final XCheckBox text = new XCheckBox(checkBoxMessage);
+ text.setFillHorizontally(true);
+ text.setFocus();
+ text.setDisplayLabel(false);
+ text.set(checked);
+ text.createWidgets(parent, 2);
+
+ SelectionListener selectionListener = new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleModified();
+ checked = text.isSelected();
+ }
+ };
+ text.addSelectionListener(selectionListener);
+
+ }
+
+ /**
+ * @return the checked
+ */
+ public boolean isChecked() {
+ return checked;
+ }
+
+ /**
+ * @param checked the checked to set
+ */
+ public void setChecked(boolean checked) {
+ this.checked = checked;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialog.java
new file mode 100644
index 00000000000..112d257f956
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialog.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.ui.plugin.util.IShellCloseEvent;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class EntryDialog extends MessageDialog {
+
+ XText text;
+ Composite comp;
+ String entryText = "";
+ String validationRegularExpression = null;
+ String validationErrorString = "";
+ Button ok;
+ MouseMoveListener listener;
+ Label errorLabel;
+ boolean fillVertically = false;
+ private static Font font = null;
+ private Button fontButton;
+
+ private final List<IShellCloseEvent> closeEventListeners = new ArrayList<IShellCloseEvent>();
+
+ public EntryDialog(String dialogTitle, String dialogMessage) {
+ super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.QUESTION,
+ new String[] {"OK", "Cancel"}, 0);
+ }
+
+ public EntryDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(new GridLayout(2, false));
+ comp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+ listener = new MouseMoveListener() {
+
+ public void mouseMove(MouseEvent e) {
+ setInitialButtonState();
+ }
+ };
+ comp.addMouseMoveListener(listener);
+
+ Composite headerComp = new Composite(comp, SWT.NONE);
+ headerComp.setLayout(new GridLayout(3, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 2;
+ headerComp.setLayoutData(gd);
+
+ if (fillVertically) {
+ // Create error label
+ Button button = new Button(headerComp, SWT.PUSH);
+ button.setText("Clear");
+ button.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ text.setText("");
+ }
+ });
+ // Create error label
+ fontButton = new Button(headerComp, SWT.CHECK);
+ fontButton.setText("Fixed Font");
+ fontButton.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ super.widgetSelected(e);
+ if (fontButton.getSelection()) {
+ if (font == null) {
+ font = new Font(Display.getCurrent(), "Courier New", 8, SWT.NORMAL);
+ }
+ text.setFont(font);
+ } else
+ text.setFont(null);
+ }
+ });
+ }
+
+ // Create error label
+ errorLabel = new Label(headerComp, SWT.NONE);
+ errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ errorLabel.setText("");
+ if (!fillVertically) {
+ gd = new GridData();
+ gd.horizontalSpan = 3;
+ errorLabel.setLayoutData(gd);
+ }
+
+ text = new XText();
+ text.setFillHorizontally(true);
+ text.setFocus();
+ text.setDisplayLabel(false);
+ if (fillVertically) {
+ text.setFillVertically(true);
+ text.setHeight(200);
+
+ text.setFont(font);
+ }
+ text.createWidgets(comp, 2);
+ text.setFocus();
+ if (!entryText.equals("")) text.set(entryText);
+
+ ModifyListener modifyListener = new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ handleModified();
+ }
+ };
+ text.addModifyListener(modifyListener);
+ createExtendedArea(comp);
+ comp.layout();
+ parent.layout();
+ return comp;
+ }
+
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ /**
+ * Override to provide other widgets
+ *
+ * @param parent
+ */
+ protected void createExtendedArea(Composite parent) {
+ }
+
+ public void setInitialButtonState() {
+ if (ok == null) {
+ ok = getButton(0);
+ handleModified();
+ }
+ comp.removeMouseMoveListener(listener);
+ }
+
+ public void handleModified() {
+ if (text != null) {
+ entryText = text.get();
+ if (!isEntryValid()) {
+ getButton(getDefaultButtonIndex()).setEnabled(false);
+ errorLabel.setText(validationErrorString);
+ errorLabel.update();
+ comp.layout();
+ } else {
+ getButton(getDefaultButtonIndex()).setEnabled(true);
+ errorLabel.setText("");
+ errorLabel.update();
+ comp.layout();
+ }
+ }
+ }
+
+ public String getEntry() {
+ return entryText;
+ }
+
+ public void setEntry(String entry) {
+ if (text != null) text.set(entry);
+ this.entryText = entry;
+ }
+
+ /**
+ * override this method to make own checks on entry this will be called with every keystroke
+ *
+ * @return true if entry is valid
+ */
+ public boolean isEntryValid() {
+ if (validationRegularExpression == null) {
+ return true;
+ }
+ // verify title is alpha-numeric with spaces and dashes
+ Matcher m = Pattern.compile(validationRegularExpression).matcher(text.get());
+ return m.find();
+ }
+
+ public void setValidationRegularExpression(String regExp) {
+ validationRegularExpression = regExp;
+ }
+
+ public void setValidationErrorString(String errorText) {
+ validationErrorString = errorText;
+ }
+
+ /**
+ * Calling will enable dialog to loose focus
+ */
+ public void setModeless() {
+ setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS);
+ setBlockOnOpen(false);
+ }
+
+ public void setSelectionListener(SelectionListener listener) {
+ for (int i = 0; i < getButtonLabels().length; i++) {
+ Button button = getButton(i);
+ button.addSelectionListener(listener);
+ }
+ }
+
+ public boolean isFillVertically() {
+ return fillVertically;
+ }
+
+ public void setFillVertically(boolean fillVertically) {
+ this.fillVertically = fillVertically;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.MessageDialog#handleShellCloseEvent()
+ */
+ @Override
+ protected void handleShellCloseEvent() {
+ super.handleShellCloseEvent();
+ for (IShellCloseEvent event : closeEventListeners) {
+ event.onClose();
+ }
+ }
+
+ public void addShellCloseEventListeners(IShellCloseEvent event) {
+ closeEventListeners.add(event);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialogWithBranchSelect.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialogWithBranchSelect.java
new file mode 100644
index 00000000000..e72d7ebf0a7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/EntryDialogWithBranchSelect.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.IShellCloseEvent;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class EntryDialogWithBranchSelect extends MessageDialog {
+
+ XText text;
+ Composite c;
+ String entryText = "";
+ String validationRegularExpression = null;
+ String validationErrorString = "";
+ Button ok;
+ MouseMoveListener listener;
+ Label errorLabel;
+ BranchSelectComposite branchSelect;
+ boolean fillVertically = false;
+
+ private final List<IShellCloseEvent> closeEventListeners = new ArrayList<IShellCloseEvent>();
+
+ public EntryDialogWithBranchSelect(String dialogTitle, String dialogMessage) {
+ super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.QUESTION,
+ new String[] {"OK", "Cancel"}, 0);
+ }
+
+ public EntryDialogWithBranchSelect(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+
+ c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(2, false));
+ c.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+ listener = new MouseMoveListener() {
+
+ public void mouseMove(MouseEvent e) {
+ setInitialButtonState();
+ }
+ };
+ c.addMouseMoveListener(listener);
+
+ // Create error label
+ errorLabel = new Label(c, SWT.NONE);
+ errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ errorLabel.setText("");
+
+ text = new XText();
+ text.setFillHorizontally(true);
+ text.setFocus();
+ text.setDisplayLabel(false);
+ if (!entryText.equals("")) text.set(entryText);
+ if (fillVertically) {
+ text.setFillVertically(true);
+ text.setHeight(200);
+ }
+ text.createWidgets(c, 2);
+
+ ModifyListener modifyListener = new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ handleModified();
+ }
+ };
+ text.addModifyListener(modifyListener);
+
+ branchSelect = new BranchSelectComposite(c, SWT.NONE, false);
+ branchSelect.setDefaultSelectedBranch(BranchManager.getLastBranch());
+ createExtendedArea(c);
+ c.layout();
+ parent.layout();
+ return c;
+ }
+
+ /**
+ * Override to provide other widgets
+ *
+ * @param parent
+ */
+ protected void createExtendedArea(Composite parent) {
+ }
+
+ public void setInitialButtonState() {
+ if (ok == null) {
+ ok = getButton(0);
+ handleModified();
+ }
+ c.removeMouseMoveListener(listener);
+ }
+
+ public void handleModified() {
+ if (text != null) {
+ entryText = text.get();
+ if (text.get().equals("") || !isEntryValid() || branchSelect.getSelectedBranch() == null) {
+ getButton(getDefaultButtonIndex()).setEnabled(false);
+ errorLabel.setText(validationErrorString);
+ errorLabel.update();
+ c.layout();
+ } else {
+ getButton(getDefaultButtonIndex()).setEnabled(true);
+ errorLabel.setText("");
+ errorLabel.update();
+ c.layout();
+ }
+ }
+ }
+
+ public String getEntry() {
+ return entryText;
+ }
+
+ public void setEntry(String entry) {
+ if (text != null) text.set(entry);
+ this.entryText = entry;
+ }
+
+ public Branch getBranch(){
+ return branchSelect.getSelectedBranch();
+ }
+
+ /**
+ * override this method to make own checks on entry this will be called with every keystroke
+ *
+ * @return true if entry is valid
+ */
+ public boolean isEntryValid() {
+ if (validationRegularExpression == null) {
+ return true;
+ }
+ // verify title is alpha-numeric with spaces and dashes
+ Matcher m = Pattern.compile(validationRegularExpression).matcher(text.get());
+ return m.find();
+ }
+
+ public void setValidationRegularExpression(String regExp) {
+ validationRegularExpression = regExp;
+ }
+
+ public void setValidationErrorString(String errorText) {
+ validationErrorString = errorText;
+ }
+
+ /**
+ * Calling will enable dialog to loose focus
+ */
+ public void setModeless() {
+ setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS);
+ setBlockOnOpen(false);
+ }
+
+ public void setSelectionListener(SelectionListener listener) {
+ for (int i = 0; i < getButtonLabels().length; i++) {
+ Button button = getButton(i);
+ button.addSelectionListener(listener);
+ }
+ }
+
+ public boolean isFillVertically() {
+ return fillVertically;
+ }
+
+ public void setFillVertically(boolean fillVertically) {
+ this.fillVertically = fillVertically;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.MessageDialog#handleShellCloseEvent()
+ */
+ @Override
+ protected void handleShellCloseEvent() {
+ super.handleShellCloseEvent();
+ for (IShellCloseEvent event : closeEventListeners) {
+ event.onClose();
+ }
+ }
+
+ public void addShellCloseEventListeners(IShellCloseEvent event) {
+ closeEventListeners.add(event);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/GroupListDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/GroupListDialog.java
new file mode 100644
index 00000000000..7ec6ad73127
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/GroupListDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.UniversalGroup;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.branch.BranchSelectComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class GroupListDialog extends ArtifactListDialog {
+ BranchSelectComposite branchSelect;
+
+ public GroupListDialog(Shell parent) {
+ super(parent, null);
+ setTitle("Select group");
+ setMessage("Select group");
+ setLabelProvider(new GroupsDescriptiveLabelProvider());
+
+ setGroupsForSelection();
+ }
+
+ private void setGroupsForSelection() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ try {
+ for (Artifact art : UniversalGroup.getGroups(BranchManager.getCommonBranch())) {
+ if (!art.getDescriptiveName().equals(ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME)) {
+ arts.add(art);
+ }
+ }
+ if (branchSelect != null && branchSelect.getSelectedBranch() != null && !branchSelect.getSelectedBranch().equals(
+ BranchManager.getCommonBranch())) {
+ for (Artifact art : UniversalGroup.getGroups(branchSelect.getSelectedBranch())) {
+ if (!art.getDescriptiveName().equals(ArtifactQuery.ROOT_ARTIFACT_TYPE_NAME)) {
+ arts.add(art);
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ if (getTableViewer() == null) {
+ setArtifacts(arts);
+ } else {
+ updateArtifacts(arts);
+ }
+
+ }
+
+ public class GroupsDescriptiveLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object obj) {
+ if (obj instanceof Artifact) {
+ Artifact art = (Artifact) obj;
+ if (art.getArtifactTypeName().equals(UniversalGroup.ARTIFACT_TYPE_NAME)) {
+ return art.toString() + " (" + art.getBranch().getBranchShortName() + ")";
+ }
+ art.toString();
+ }
+ return "";
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ branchSelect = new BranchSelectComposite(container, SWT.NONE, false);
+ branchSelect.setDefaultSelectedBranch(BranchManager.getLastBranch());
+ branchSelect.addListener(new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ setGroupsForSelection();
+ }
+ });
+ return c;
+ }
+
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/HtmlDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/HtmlDialog.java
new file mode 100644
index 00000000000..3aed4131e91
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/HtmlDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+public class HtmlDialog extends MessageDialog {
+ protected Browser b;
+ private LocationListener listener;
+ private final String html;
+
+ public HtmlDialog(String title, String message, String html) {
+ super(Display.getCurrent().getActiveShell(), title, null, message, SWT.NONE, new String[] {"OK", "Cancel"}, 0);
+ this.html = html;
+ }
+
+ /**
+ * Add listener to browser widget.
+ *
+ * @param listener
+ */
+ public void addLocationListener(LocationListener listener) {
+ this.listener = listener;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#isResizable()
+ */
+ @Override
+ protected boolean isResizable() {
+ return true;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite c = (Composite) super.createDialogArea(parent);
+ b = new Browser(c, SWT.BORDER);
+ GridData gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+ b.setLayoutData(gd);
+ b.setText(html);
+ b.setSize(500, 500);
+ if (listener != null) b.addLocationListener(listener);
+ b.setMenu(pageOverviewGetPopup());
+ return c;
+ }
+
+ public Menu pageOverviewGetPopup() {
+ Menu menu = new Menu(b.getShell());
+ MenuItem item = new MenuItem(menu, SWT.NONE);
+ item.setText("View Source");
+ item.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String file = System.getProperty("user.home") + File.separator + "out.html";
+ try {
+ Lib.writeStringToFile(html, new File(file));
+ } catch (IOException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ Program.launch(file);
+ }
+ });
+ return menu;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ImageDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ImageDialog.java
new file mode 100644
index 00000000000..58c6ce121b2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/ImageDialog.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.dialog;
+
+import java.io.File;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class ImageDialog extends MessageDialog {
+ private String title = "Image Viewer";
+ private static String buttons[] = new String[] {"Export as JPG", "Export as PNG", "Close"};
+ private final Image image;
+
+ public ImageDialog(Image image, Shell parentShell) {
+ this(image, parentShell, buttons, 3);
+ }
+
+ public ImageDialog(Image image, Shell parentShell, String[] buttons, int defaultButton) {
+ super(parentShell, "", null, "", MessageDialog.NONE, buttons, defaultButton);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ this.image = image;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText(title);
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setLayout(ALayout.getZeroMarginLayout());
+ comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ comp.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
+
+ ScrolledComposite sc = new ScrolledComposite(comp, SWT.V_SCROLL | SWT.H_SCROLL);
+ Canvas canvas = new Canvas(sc, SWT.BORDER);
+ sc.setContent(canvas);
+ canvas.setBounds(image.getBounds());
+ canvas.addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent e) {
+ e.gc.drawImage(image, 0, 0);
+ }
+ });
+ comp.layout();
+ return comp;
+ }
+
+ private enum ImageType {
+ JPG, PNG
+ };
+
+ protected void handleSave(ImageType imageType) {
+ ImageLoader loader = new ImageLoader();
+ ImageData imgData = image.getImageData();
+ loader.data = new ImageData[] {imgData};
+ int format = 0;
+ if (imageType == ImageType.JPG)
+ format = SWT.IMAGE_JPEG;
+ else if (imageType == ImageType.PNG) format = SWT.IMAGE_PNG;
+ File file = OseeData.getFile(GUID.generateGuidStr() + "." + imageType.name());
+ loader.save(file.getAbsolutePath(), format);
+ Program.launch(file.getAbsolutePath());
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == 0)
+ handleSave(ImageType.JPG);
+ else if (buttonId == 1)
+ handleSave(ImageType.PNG);
+ else
+ close();
+ setReturnCode(buttonId);
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserCheckTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserCheckTreeDialog.java
new file mode 100644
index 00000000000..2f3e36559d0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserCheckTreeDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserCheckTreeDialog extends ArtifactCheckTreeDialog {
+
+ private Collection<User> initialSel;
+
+ /**
+ * @param parent
+ * @param artifacts
+ */
+ public UserCheckTreeDialog(Shell parent, Collection<User> artifacts) {
+ super(artifacts);
+ }
+
+ public UserCheckTreeDialog(Shell parent) throws OseeCoreException {
+ this(parent, UserManager.getUsers());
+ }
+
+ public void setInitialSelections(Collection<User> initialSel) {
+ this.initialSel = initialSel;
+ ArrayList<Object> objs = new ArrayList<Object>();
+ for (Artifact sel : initialSel)
+ objs.add(sel);
+ super.setInitialSelections((Object[]) objs.toArray(new Object[objs.size()]));
+ }
+
+ public Collection<User> getUsersSelected() {
+ Set<User> selected = new HashSet<User>();
+ for (Artifact art : getSelection())
+ selected.add((User) art);
+ return selected;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ getTreeViewer().setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ User user1 = ((User) e1);
+ User user2 = ((User) e2);
+ try {
+ if (UserManager.getUser().equals(user1)) {
+ return -1;
+ }
+ if (UserManager.getUser().equals(user2)) {
+ return 1;
+ }
+ if (initialSel != null) {
+ if (initialSel.contains(user1) && initialSel.contains(user2)) {
+ return getComparator().compare(user1.getName(), user2.getName());
+ }
+ if (initialSel.contains(user1)) {
+ return -1;
+ }
+ if (initialSel.contains(user2)) {
+ return 1;
+ }
+ }
+ return getComparator().compare(user1.getName(), user2.getName());
+ } catch (OseeCoreException ex) {
+ return -1;
+ }
+ }
+ });
+ return c;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserGroupsCheckTreeDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserGroupsCheckTreeDialog.java
new file mode 100644
index 00000000000..be62675a59f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserGroupsCheckTreeDialog.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.framework.ui.skynet.widgets.dialog;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserGroupsCheckTreeDialog extends ArtifactCheckTreeDialog {
+
+ /**
+ * @param parent
+ * @param artifacts
+ */
+ public UserGroupsCheckTreeDialog(Collection<Artifact> artifacts) {
+ super(artifacts);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite container) {
+ Control c = super.createDialogArea(container);
+ super.getTreeViewer().setLabelProvider(new ArtifactLabelProvider());
+ return c;
+ }
+
+ public class ArtifactLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return ImageManager.getImage((Artifact) arg0);
+ }
+
+ public String getText(Object arg0) {
+ return ((Artifact) arg0).getDescriptiveName() + " - (" + ((Artifact) arg0).getArtifactTypeName() + ")";
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserListDialog.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserListDialog.java
new file mode 100644
index 00000000000..3c6f8f0891b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/UserListDialog.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.framework.ui.skynet.widgets.dialog;
+
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserListDialog extends ListDialog {
+
+ public UserListDialog(Shell parent) throws OseeCoreException {
+ this(parent, "Select User");
+ }
+
+ public UserListDialog(Shell parent, String title) throws OseeCoreException {
+ super(parent);
+ setTitle(title);
+ setMessage(title);
+ setContentProvider(new ArrayContentProvider());
+ setLabelProvider(new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof User) {
+ return ((User) element).getName();
+ }
+ return "Unknown Object";
+ }
+ });
+ setInput(UserManager.getUsersSortedByName());
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ }
+
+ public User getSelection() {
+ return (User) getResult()[0];
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/AsciiColumnLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/AsciiColumnLabelProvider.java
new file mode 100644
index 00000000000..59642a5ca99
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/AsciiColumnLabelProvider.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+
+public class AsciiColumnLabelProvider extends ColumnLabelProvider {
+
+ private final int associatedColumn;
+
+ private final static Font font = new Font(Display.getDefault(), new FontData("Courier New", 8, SWT.NONE));
+
+ public AsciiColumnLabelProvider(int column) {
+ super();
+ this.associatedColumn = column;
+ }
+
+ public String getToolTipText(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ if (associatedColumn < row.length) {
+ return row.getToolTip(associatedColumn);
+ }
+ return null;
+ }
+
+ public Point getToolTipShift(Object object) {
+ return new Point(12, 12);
+ }
+
+ public int getToolTipDisplayDelayTime(Object object) {
+ return 125;
+ }
+
+ public int getToolTipTimeDisplayed(Object object) {
+ return 5000;
+ }
+
+ @Override
+ public Color getBackground(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ if (associatedColumn < row.length) {
+ return row.getBackgroundColor(associatedColumn);
+ }
+ return null;
+ }
+
+ @Override
+ public String getText(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ if (associatedColumn < row.length) {
+ return row.getAscii(associatedColumn);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ColumnLabelProvider#getFont(java.lang.Object)
+ */
+ @Override
+ public Font getFont(Object element) {
+ return font;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/BasicHexTable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/BasicHexTable.java
new file mode 100644
index 00000000000..e153e25e0de
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/BasicHexTable.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnPixelData;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author author Ken J. Aguilar
+ *
+ */
+public class BasicHexTable extends HexTable{
+
+ /**
+ * @param shell
+ * @param array
+ * @param bytesPerRow
+ */
+ public BasicHexTable(Composite parent, byte[] array, int bytesPerRow) {
+ super(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, array, bytesPerRow);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.hex.HexTable#createAndConfigureColumns(org.eclipse.jface.viewers.TableViewer)
+ */
+ @Override
+ protected void createAndConfigureColumns(TableViewer v, TableColumnLayout layout, int bytesPerRow) {
+ ColumnViewerToolTipSupport.enableFor(v, ToolTip.NO_RECREATE);
+ TableViewerColumn column = new TableViewerColumn(v, SWT.RIGHT);
+
+ column.setLabelProvider(new OffsetColumnLabelProvider());
+ column.getColumn().setText("Offset");
+ column.getColumn().setResizable(false);
+ column.getColumn().setMoveable(false);
+ layout.setColumnData(column.getColumn(), new ColumnPixelData(50));
+ for (int i = 0; i < bytesPerRow; i++) {
+ TableViewerColumn c = new TableViewerColumn(v, SWT.LEFT);
+ c.setLabelProvider(createByteColumnLabelProvider(i));
+ c.getColumn().setText(Integer.toHexString(i));
+ c.getColumn().setResizable(false);
+ c.getColumn().setMoveable(false);
+ c.setEditingSupport(createHexEditingSupport(i));
+ layout.setColumnData(c.getColumn(), new ColumnPixelData(26));
+ }
+
+ TableViewerColumn divider = new TableViewerColumn(v, SWT.LEFT);
+ divider.getColumn().setResizable(false);
+ divider.setLabelProvider(new DividerLabel());
+ layout.setColumnData(divider.getColumn(), new ColumnPixelData(1));
+ for (int i = 0; i < bytesPerRow; i++) {
+ TableViewerColumn c = new TableViewerColumn(v, SWT.LEFT);
+
+ c.setLabelProvider(new AsciiColumnLabelProvider(i));
+ c.getColumn().setResizable(false);
+ c.getColumn().setMoveable(false);
+ layout.setColumnData(c.getColumn(), new ColumnPixelData(20));
+ }
+ }
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ Display display = new Display();
+ Shell shell = new Shell(display);
+ shell.setSize(500, 400);
+ shell.setLayout(new FillLayout());
+ byte[] array = new byte[702];
+ for (int i = 0; i < array.length; i++) {
+ array[i] = (byte) i;
+ }
+ int index = 50;
+ String str = "this is a test";
+ array[48] = 3;
+ array[49] = 3;
+ for (byte b : str.getBytes()) {
+ array[index] = b;
+ index++;
+ }
+ array[index] = 3;
+ array[index + 1] = 3;
+ BasicHexTable t = new BasicHexTable(shell, array, 16);
+ shell.open();
+ IHexTblHighlighter yellowHL = t.createHighlighter(30, 3, Display.getDefault().getSystemColor(SWT.COLOR_YELLOW));
+ IHexTblHighlighter blueHL =
+ t.createHighlighter(50, str.length(), Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+ yellowHL.highlight();
+ blueHL.highlight();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+
+ display.dispose();
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/ByteColumnLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/ByteColumnLabelProvider.java
new file mode 100644
index 00000000000..49280064ca6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/ByteColumnLabelProvider.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+
+public class ByteColumnLabelProvider extends ColumnLabelProvider {
+
+ private final int column;
+ private final Font font;
+
+ public ByteColumnLabelProvider(Font font, int column) {
+ super();
+ this.font = font;
+ this.column = column;
+ }
+
+ @Override
+ public String getToolTipText(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ if (column < row.length) {
+ return row.getToolTip(column);
+ }
+ return null;
+ }
+
+ public Point getToolTipShift(Object object) {
+ return new Point(12, 12);
+ }
+
+ public int getToolTipDisplayDelayTime(Object object) {
+ return 125;
+ }
+
+ public int getToolTipTimeDisplayed(Object object) {
+ return 5000;
+ }
+
+ @Override
+ public Color getBackground(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ if (column < row.length) {
+ return row.getBackgroundColor(column);
+ }
+ return null;
+ }
+
+ @Override
+ public String getText(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ if (column < row.length) {
+ return row.getText(column);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ColumnLabelProvider#getFont(java.lang.Object)
+ */
+ @Override
+ public Font getFont(Object element) {
+ return font;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/CustomTextCellEditor.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/CustomTextCellEditor.java
new file mode 100644
index 00000000000..703926b7385
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/CustomTextCellEditor.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author author Ken J. Aguilar
+ *
+ */
+public class CustomTextCellEditor extends TextCellEditor{
+
+ /**
+ *
+ */
+ public CustomTextCellEditor() {
+ super();
+ }
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public CustomTextCellEditor(Composite parent, int style) {
+ super(parent, style);
+ }
+
+ /**
+ * @param parent
+ */
+ public CustomTextCellEditor(Composite parent) {
+ super(parent);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.TextCellEditor#getLayoutData()
+ */
+ @Override
+ public LayoutData getLayoutData() {
+ LayoutData data = super.getLayoutData();
+ data.minimumWidth = 20;
+ return data;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/DividerLabel.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/DividerLabel.java
new file mode 100644
index 00000000000..ec6c6b58fc5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/DividerLabel.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+
+public class DividerLabel extends ColumnLabelProvider {
+
+ public DividerLabel() {
+ super();
+ }
+
+ public String getToolTipText(Object element) {
+
+ return null;
+ }
+
+ public Point getToolTipShift(Object object) {
+ return new Point(12, 12);
+ }
+
+ public int getToolTipDisplayDelayTime(Object object) {
+ return 125;
+ }
+
+ public int getToolTipTimeDisplayed(Object object) {
+ return 5000;
+ }
+
+ @Override
+ public Color getBackground(Object element) {
+ return Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
+ }
+
+ @Override
+ public String getText(Object element) {
+
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexEditingSupport.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexEditingSupport.java
new file mode 100644
index 00000000000..4f60a0643e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexEditingSupport.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Text;
+
+public class HexEditingSupport extends EditingSupport {
+ private final TextCellEditor textEditor;
+ private final int column;
+ private final TableViewer viewer;
+ private final Font font;
+
+ public HexEditingSupport(Font font, TableViewer viewer, int column) {
+ super(viewer);
+ this.font = font;
+ this.viewer = viewer;
+ textEditor = new CustomTextCellEditor(viewer.getTable(), SWT.SINGLE);
+ ((Text) textEditor.getControl()).setTextLimit(2);
+ textEditor.getControl().setFont(font);
+ this.column = column;
+
+ }
+
+ protected boolean canEdit(Object element) {
+ return ((HexTableRow) element).length > column;
+ }
+
+ protected CellEditor getCellEditor(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ int index = row.offset / row.length;
+ Rectangle rect = viewer.getTable().getItem(index).getBounds(column);
+ rect.width = 20;
+ textEditor.getControl().setBounds(rect);
+ return textEditor;
+ }
+
+ protected Object getValue(Object element) {
+ HexTableRow row = (HexTableRow) element;
+ return String.format("%02X", row.array[row.offset + column] & 0xFF);
+ }
+
+ protected void setValue(Object element, Object value) {
+ HexTableRow row = (HexTableRow) element;
+ String strValue = value.toString();
+ int val;
+ try {
+ val = Integer.parseInt(strValue, 16);
+ if (val >= 0 && val <= 255) {
+ row.array[row.offset + column] = (byte) val;
+ getViewer().update(row, null);
+ } else {
+ throw new NumberFormatException("value out of range. Must be between 00 and FF");
+ }
+ } catch (NumberFormatException e) {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Numeric Entry Error", e.getMessage());
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTable.java
new file mode 100644
index 00000000000..8855f57c9e6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTable.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnViewerEditor;
+import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
+import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
+import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerEditor;
+import org.eclipse.jface.viewers.TableViewerFocusCellManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A simple TableViewer to demonstrate usage of an ILazyContentProvider. You can compare this snippet to the
+ * Snippet029VirtualTableViewer to see the small but needed difference.
+ *
+ * @author Tom Schindl <tom.schindl@bestsolution.at>
+ */
+public abstract class HexTable extends Composite{
+
+ private final TableViewer v;
+ private final int bytesPerRow;
+ private final Font font;
+
+ public HexTable(Composite parent, int style, byte[] array, int bytesPerRow) {
+ super(parent, SWT.NONE);
+ font = new Font(Display.getDefault(), new FontData("Courier New", 8, SWT.NONE));
+ this.bytesPerRow = bytesPerRow;
+ v = new TableViewer(this, SWT.VIRTUAL | SWT.FULL_SELECTION | style);
+ v.setContentProvider(new HexTableContentProvider(v, bytesPerRow));
+ v.setUseHashlookup(true);
+ TableColumnLayout layout = new TableColumnLayout();
+ setLayout(layout);
+ createAndConfigureColumns(v, layout, bytesPerRow);
+ TableViewerFocusCellManager focusCellManager =
+ new TableViewerFocusCellManager(v, new FocusCellOwnerDrawHighlighter(v));
+ ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
+ protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
+ return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
+ }
+ };
+
+ TableViewerEditor.create(
+ v,
+ focusCellManager,
+ actSupport,
+ ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
+
+ v.setInput(array);
+ v.setItemCount((array.length + bytesPerRow - 1) / bytesPerRow);
+ // v.getTable().setLinesVisible(true);
+ v.getTable().setHeaderVisible(false);
+
+ }
+
+ protected ByteColumnLabelProvider createByteColumnLabelProvider(int column) {
+ return new ByteColumnLabelProvider(font, column);
+ }
+
+ protected HexEditingSupport createHexEditingSupport(int column) {
+ return new HexEditingSupport(font, v, column);
+ }
+ public int getBytesPerRow() {
+ return bytesPerRow;
+ }
+
+ abstract protected void createAndConfigureColumns(TableViewer viewer, TableColumnLayout layout, int bytesPerRow);
+
+ public IHexTblHighlighter createHighlighter(final int index, final int length, Color color) {
+ return new Highlighter((HexTableContentProvider)v.getContentProvider(), index, length, color);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Widget#dispose()
+ */
+ @Override
+ public void dispose() {
+ font.dispose();
+ super.dispose();
+ }
+
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableContentProvider.java
new file mode 100644
index 00000000000..0100a2ae950
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableContentProvider.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.viewers.ILazyContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+class HexTableContentProvider implements ILazyContentProvider {
+ private TableViewer viewer;
+ private byte[] array;
+ private int bytesPerRow;
+ private HexTableRow[] elements;
+
+ HexTableContentProvider(TableViewer viewer, int bytesPerRow) {
+ this.viewer = viewer;
+ this.bytesPerRow = bytesPerRow;
+ }
+
+ HexTableRow[] getElements() {
+ return elements;
+ }
+
+ int getBytesPerRow() {
+ return bytesPerRow;
+ }
+
+ public void dispose() {
+
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (oldInput != null && newInput != null) {
+ byte[] oldArray = (byte[]) oldInput;
+ byte[] newArray = (byte[]) newInput;
+ if (oldArray.length == newArray.length) {
+ // same array length so we are done
+ this.array = newArray;
+ return;
+ }
+ }
+ if (newInput != null) {
+ this.array = (byte[]) newInput;
+ int rowCOunt = (array.length + bytesPerRow - 1) / bytesPerRow;
+ elements = new HexTableRow[rowCOunt];
+ int offset = 0;
+ int bytesLeft = array.length;
+ for (int i = 0; i < rowCOunt; i++) {
+ elements[i] = new HexTableRow(offset, bytesLeft >= bytesPerRow ? bytesPerRow : bytesLeft, array);
+ offset += bytesPerRow;
+ bytesLeft -= bytesPerRow;
+ }
+ }
+ }
+
+ /**
+ * @return the viewer
+ */
+ TableViewer getViewer() {
+ return viewer;
+ }
+
+ public void updateElement(int index) {
+ viewer.replace(elements[index], index);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableRow.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableRow.java
new file mode 100644
index 00000000000..8ba9ccb89b8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/HexTableRow.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.swt.graphics.Color;
+
+public class HexTableRow {
+ public final int offset;
+ public int length;
+ public byte[] array;
+ private Color[] backgroundColor;
+ private boolean[] displayAsAscii;
+
+ private static final String[] hexTbl = new String[256];
+ static {
+ for (int i = 0; i < 256; i++) {
+ hexTbl[i] = String.format("%02X", i);
+ }
+ }
+
+ public HexTableRow(int offset, int length, byte[] array) {
+ this.offset = offset;
+ this.array = array;
+ this.length = length;
+ backgroundColor = new Color[length];
+ displayAsAscii = new boolean[length];
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ public byte[] getArray() {
+ return array;
+ }
+
+ public void setArray(byte[] array) {
+ this.array = array;
+ }
+
+ public String getHex(int column) {
+ byte b = array[offset + column];
+ return hexTbl[b & 0xFF];
+ }
+
+ public String getAscii(int column) {
+ byte b = array[offset + column];
+ if (b >= 32 && b < 127) {
+ return new String(new byte[] {b});
+ } else {
+ return ".";
+ }
+ }
+
+ public String getText(int column) {
+ if (displayAsAscii[column]) {
+ return getAscii(column);
+ } else {
+ return getHex(column);
+ }
+ }
+
+ public String getBinary(int column) {
+ byte b = array[offset + column];
+ return Integer.toBinaryString(b & 0xFF);
+ }
+
+ public String getToolTip(int column) {
+ return getBinary(column);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString();
+ }
+
+ public Color getBackgroundColor(int column) {
+ return backgroundColor[column];
+ }
+
+ public void setBackgroundColor(int columnm, Color backgroundColor) {
+ this.backgroundColor[columnm] = backgroundColor;
+ }
+
+ /**
+ * @param asAscii the asAscii to set
+ */
+ public void setDisplayAsAscii(int column, boolean displayAsAscii) {
+ this.displayAsAscii[column] = displayAsAscii;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/Highlighter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/Highlighter.java
new file mode 100644
index 00000000000..b897516187b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/Highlighter.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.framework.ui.skynet.widgets.hex;
+
+import java.util.Arrays;
+
+import org.eclipse.swt.graphics.Color;
+
+class Highlighter implements IHexTblHighlighter {
+ private int index;
+ private int length;
+ private Color color;
+ private final HexTableContentProvider provider;
+ private boolean displayAsAscii = false;
+
+ /**
+ * @param row
+ * @param endRow
+ * @param col
+ */
+ Highlighter(HexTableContentProvider provider, int index, int length, Color color) {
+ this.index = index;
+ this.length = length;
+ this.color = color;
+ this.provider = provider;
+ }
+
+ @Override
+ public void highlight() {
+ highlight(color, displayAsAscii);
+ }
+
+ private void highlight(Color highlightColor, boolean ascii) {
+ int row = index / provider.getBytesPerRow();
+ int endRow = row;
+ int col = index - (row * provider.getBytesPerRow());
+ HexTableRow[] elements = provider.getElements();
+ for (int i = 0; i < length; i++) {
+ HexTableRow e = elements[endRow];
+ e.setBackgroundColor(col, highlightColor);
+ e.setDisplayAsAscii(col, ascii);
+ col++;
+ if (col >= e.length) {
+ endRow++;
+ col = 0;
+ }
+ }
+ provider.getViewer().update(Arrays.copyOfRange(elements, row, endRow + 1), null);
+ }
+
+ @Override
+ public void setColor(Color color) {
+ this.color = color;
+ highlight();
+ }
+
+ @Override
+ public void setRange(int start, int length) {
+ this.index = start;
+ this.length = length;
+ highlight(provider.getViewer().getTable().getBackground(), false);
+ highlight();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.message.internal.util.IHexTblHighlighter#setDisplayAsAscii(boolean)
+ */
+ @Override
+ public void setDisplayAsAscii(boolean displayAsAscii) {
+ this.displayAsAscii = displayAsAscii;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/IHexTblHighlighter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/IHexTblHighlighter.java
new file mode 100644
index 00000000000..f7281fc3ef5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/IHexTblHighlighter.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IHexTblHighlighter {
+ void setRange(int start, int length);
+
+ void setColor(Color color);
+
+ void highlight();
+
+ void setDisplayAsAscii(boolean displayAsAscii);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/OffsetColumnLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/OffsetColumnLabelProvider.java
new file mode 100644
index 00000000000..fb915da006d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/hex/OffsetColumnLabelProvider.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.framework.ui.skynet.widgets.hex;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Display;
+
+public class OffsetColumnLabelProvider extends ColumnLabelProvider {
+ private final Font font = new Font(Display.getDefault(), new FontData("Courier New", 8, SWT.NONE));
+
+ public OffsetColumnLabelProvider() {
+ super();
+ }
+
+ @Override
+ public String getText(Object element) {
+ return Integer.toString(((HexTableRow) element).getOffset());
+ }
+
+ @Override
+ public Color getBackground(Object element) {
+ return Display.getDefault().getSystemColor(SWT.COLOR_YELLOW);
+ }
+
+ @Override
+ public Color getForeground(Object element) {
+ return Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ColumnLabelProvider#getFont(java.lang.Object)
+ */
+ @Override
+ public Font getFont(Object element) {
+ return font;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ font.dispose();
+ super.dispose();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/AttributeXWidgetManager.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/AttributeXWidgetManager.java
new file mode 100644
index 00000000000..b026691e4a0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/AttributeXWidgetManager.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.List;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AttributeXWidgetManager {
+ private static final String EXTENSION_NAME = "AttributeXWidgetProvider";
+ private static final String EXTENSION_POINT = SkynetGuiPlugin.PLUGIN_ID + "." + EXTENSION_NAME;
+ private static final String CLASS_NAME_ATTRIBUTE = "classname";
+
+ private final static AttributeXWidgetManager instance = new AttributeXWidgetManager();
+
+ private final ExtensionDefinedObjects<IAttributeXWidgetProvider> extensionObjects;
+
+ private AttributeXWidgetManager() {
+ this.extensionObjects =
+ new ExtensionDefinedObjects<IAttributeXWidgetProvider>(EXTENSION_POINT, EXTENSION_NAME,
+ CLASS_NAME_ATTRIBUTE);
+ }
+
+ private List<IAttributeXWidgetProvider> getProviders() {
+ return extensionObjects.getObjects();
+ }
+
+ public static IAttributeXWidgetProvider getAttributeXWidgetProvider(AttributeType attributeType) {
+ for (IAttributeXWidgetProvider provider : instance.getProviders()) {
+ List<DynamicXWidgetLayoutData> datas = provider.getDynamicXWidgetLayoutData(attributeType);
+ if (!datas.isEmpty()) {
+ return provider;
+ }
+ }
+ return new DefaultAttributeXWidgetProvider();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultAttributeXWidgetProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultAttributeXWidgetProvider.java
new file mode 100644
index 00000000000..5a439ff1fb4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultAttributeXWidgetProvider.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.CompressedContentAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.EnumeratedAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.JavaObjectAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefaultAttributeXWidgetProvider implements IAttributeXWidgetProvider {
+
+ private DynamicXWidgetLayoutData createDynamicXWidgetLayout(AttributeType attributeType) {
+ DynamicXWidgetLayoutData defaultData = new DynamicXWidgetLayoutData(null);
+ defaultData.setName(attributeType.getName());
+ defaultData.setStorageName(attributeType.getName());
+ defaultData.setToolTip(attributeType.getTipText());
+ if (attributeType.getMinOccurrences() > 0) {
+ defaultData.getXOptionHandler().add(XOption.REQUIRED);
+ }
+ defaultData.getXOptionHandler().add(XOption.HORIZONTAL_LABEL);
+ return defaultData;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IAttributeXWidgetProvider#getDynamicXWidgetLayoutData(org.eclipse.osee.framework.skynet.core.attribute.Attribute)
+ */
+ @Override
+ public List<DynamicXWidgetLayoutData> getDynamicXWidgetLayoutData(AttributeType attributeType) {
+ int minOccurrence = attributeType.getMinOccurrences();
+ int maxOccurrence = attributeType.getMaxOccurrences();
+
+ List<DynamicXWidgetLayoutData> xWidgetLayoutData = new ArrayList<DynamicXWidgetLayoutData>();
+
+ DynamicXWidgetLayoutData defaultData = createDynamicXWidgetLayout(attributeType);
+ xWidgetLayoutData.add(defaultData);
+
+ if (attributeType.getBaseAttributeClass().equals(EnumeratedAttribute.class)) {
+ if (maxOccurrence == 1) {
+ defaultData.setXWidgetName("XComboDam(" + Collections.toString(",",
+ AttributeTypeManager.getEnumerationValues(attributeType)) + ")");
+ } else {
+ defaultData.setXWidgetName("XSelectFromMultiChoiceDam(" + Collections.toString(",",
+ AttributeTypeManager.getEnumerationValues(attributeType)) + ")");
+ }
+ } else if (attributeType.getBaseAttributeClass().equals(BooleanAttribute.class)) {
+ if (minOccurrence == 1) {
+ defaultData.setXWidgetName("XCheckBoxDam");
+ } else {
+ defaultData.setXWidgetName("XComboBooleanDam");
+ }
+ } else if (attributeType.getBaseAttributeClass().equals(WordAttribute.class)) {
+ defaultData.setXWidgetName("XStackedDam");
+ defaultData.getXOptionHandler().add(XOption.NOT_EDITABLE);
+ } else {
+ String xWidgetName = "";
+ if (maxOccurrence == 1) {
+ xWidgetName = getXWidgetName(attributeType);
+ } else {
+ xWidgetName = "XStackedDam";
+ }
+ defaultData.setXWidgetName(xWidgetName);
+ }
+ defaultData.getXOptionHandler().add(XOption.FILL_HORIZONTALLY);
+ defaultData.getXOptionHandler().add(XOption.NO_DEFAULT_VALUE);
+ return xWidgetLayoutData;
+ }
+
+ private String getXWidgetName(AttributeType attributeType) {
+ String toReturn = "";
+ if (attributeType.getBaseAttributeClass().equals(DateAttribute.class)) {
+ toReturn = "XDateDam";
+ } else if (attributeType.getBaseAttributeClass().equals(IntegerAttribute.class)) {
+ toReturn = "XIntegerDam";
+ } else if (attributeType.getBaseAttributeClass().equals(FloatingPointAttribute.class)) {
+ toReturn = "XFloatDam";
+ } else if (attributeType.getBaseAttributeClass().equals(CompressedContentAttribute.class) || attributeType.getBaseAttributeClass().equals(
+ JavaObjectAttribute.class)) {
+ toReturn = "XLabelDam";
+ } else {
+ toReturn = "XTextDam";
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultXWidgetOptionResolver.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultXWidgetOptionResolver.java
new file mode 100644
index 00000000000..fbd7d72c669
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DefaultXWidgetOptionResolver.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DefaultXWidgetOptionResolver implements IXWidgetOptionResolver {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IWidgetOptionResolver#getWidgetOptions(java.lang.String)
+ */
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData xWidgetData) {
+ Matcher m = Pattern.compile("\\((.*?)\\)").matcher(xWidgetData.getXWidgetName());
+ if (m.find()) {
+ String data = m.group(1);
+ return data.split(",");
+ }
+ return new String[] {};
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayout.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayout.java
new file mode 100644
index 00000000000..d49cbef3fee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayout.java
@@ -0,0 +1,398 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XWidgetParser;
+import org.eclipse.osee.framework.ui.skynet.widgets.IArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class DynamicXWidgetLayout {
+
+ private final Set<DynamicXWidgetLayoutData> datas = new LinkedHashSet<DynamicXWidgetLayoutData>();
+ private final Map<String, DynamicXWidgetLayoutData> nameToLayoutData =
+ new HashMap<String, DynamicXWidgetLayoutData>();
+ private final ArrayList<ArrayList<String>> orRequired = new ArrayList<ArrayList<String>>();
+ private final ArrayList<ArrayList<String>> xorRequired = new ArrayList<ArrayList<String>>();
+ public static String OR_REQUIRED = "OrRequired";
+ public static String XOR_REQUIRED = "XOrRequired";
+ public static String XWIDGET = "XWidget";
+ public static String XWIDGETS_LIST = "xWidgets";
+ private final IDynamicWidgetLayoutListener dynamicWidgetLayoutListener;
+ private final IXWidgetOptionResolver optionResolver;
+ private final List<XWidget> xWidgets = new ArrayList<XWidget>();
+
+ public DynamicXWidgetLayout() {
+ this(null, new DefaultXWidgetOptionResolver());
+ }
+
+ public DynamicXWidgetLayout(IDynamicWidgetLayoutListener dynamicWidgetLayoutListener, IXWidgetOptionResolver optionResolver) {
+ this.dynamicWidgetLayoutListener = dynamicWidgetLayoutListener;
+ this.optionResolver = optionResolver;
+ }
+
+ public void dispose() {
+ for (DynamicXWidgetLayoutData layoutData : getLayoutDatas()) {
+ layoutData.getXWidget().dispose();
+ }
+ }
+
+ private Composite createComposite(Composite parent, FormToolkit toolkit) {
+ return toolkit != null ? toolkit.createComposite(parent, SWT.WRAP) : new Composite(parent, SWT.NONE);
+ }
+
+ public void createBody(IManagedForm managedForm, Composite parent, Artifact artifact, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ Composite attrComp = null;
+
+ final FormToolkit toolkit = managedForm != null ? managedForm.getToolkit() : null;
+
+ attrComp = createComposite(parent, toolkit);
+
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginWidth = 2;
+ layout.marginHeight = 2;
+ attrComp.setLayout(layout);
+ attrComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ if (toolkit != null) {
+ toolkit.adapt(attrComp);
+ }
+
+ boolean inChildComposite = false;
+ Composite childComp = null;
+ // Create Attributes
+ for (DynamicXWidgetLayoutData xWidgetLayoutData : getLayoutDatas()) {
+ Composite useComp = attrComp;
+
+ if (xWidgetLayoutData.getBeginComposite() > 0) {
+ childComp = createComposite(attrComp, toolkit);
+ childComp.setLayout(ALayout.getZeroMarginLayout(xWidgetLayoutData.getBeginComposite(), false));
+ childComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ if (toolkit != null) {
+ toolkit.adapt(childComp);
+ }
+ inChildComposite = true;
+ }
+ if (inChildComposite) {
+ useComp = childComp;
+ if (xWidgetLayoutData.isEndComposite()) {
+ inChildComposite = false;
+ }
+ } else if (xWidgetLayoutData.getXOptionHandler().contains(XOption.HORIZONTAL_LABEL)) {
+ useComp = createComposite(attrComp, toolkit);
+ useComp.setLayout(ALayout.getZeroMarginLayout(2, false));
+ useComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ if (toolkit != null) {
+ toolkit.adapt(useComp);
+ }
+ }
+
+ XWidget xWidget = xWidgetLayoutData.getXWidget();
+ xWidgets.add(xWidget);
+
+ if (Strings.isValid(xWidgetLayoutData.getName())) {
+ xWidget.setLabel(xWidgetLayoutData.getName().replaceFirst("^.*?\\.", ""));
+ }
+
+ if (Strings.isValid(xWidgetLayoutData.getToolTip())) {
+ xWidget.setToolTip(xWidgetLayoutData.getToolTip());
+ }
+
+ xWidget.setRequiredEntry(xWidgetLayoutData.isRequired());
+ xWidget.setEditable(xWidgetLayoutData.getXOptionHandler().contains(XOption.EDITABLE) && isEditable);
+
+ if (dynamicWidgetLayoutListener != null) {
+ dynamicWidgetLayoutListener.widgetCreating(xWidget, toolkit, artifact, this, xModListener, isEditable);
+ }
+
+ if (artifact != null && (xWidget instanceof IArtifactWidget)) {
+ try {
+ ((IArtifactWidget) xWidget).setArtifact(artifact, xWidgetLayoutData.getStorageName());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ if (xWidget instanceof XText) {
+ XText xText = (XText) xWidget;
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.FILL_HORIZONTALLY)) {
+ xText.setFillHorizontally(true);
+ }
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.FILL_VERTICALLY)) {
+ xText.setFillVertically(true);
+ }
+ }
+
+ xWidget.createWidgets(managedForm, useComp, 2);
+
+ if (xWidget instanceof XText) {
+ XText xText = (XText) xWidget;
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.FILL_HORIZONTALLY) && xWidgetLayoutData.getXOptionHandler().contains(
+ XOption.FILL_VERTICALLY)) {
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.minimumWidth = 60;
+ gd.minimumHeight = 60;
+ useComp.setLayoutData(gd);
+
+ gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.minimumWidth = 60;
+ gd.minimumHeight = 60;
+ xText.getStyledText().setLayoutData(gd);
+ } else if (xWidgetLayoutData.getXOptionHandler().contains(XOption.FILL_HORIZONTALLY)) {
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+ gd.minimumWidth = 60;
+ useComp.setLayoutData(gd);
+
+ gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+ gd.minimumWidth = 60;
+ xText.getStyledText().setLayoutData(gd);
+ } else if (xWidgetLayoutData.getXOptionHandler().contains(XOption.FILL_VERTICALLY)) {
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.minimumHeight = 60;
+ useComp.setLayoutData(gd);
+
+ gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.minimumHeight = 60;
+ xText.getStyledText().setLayoutData(gd);
+ }
+
+ if (xWidgetLayoutData.isHeightSet()) {
+ xText.setHeight(xWidgetLayoutData.getHeight());
+ }
+ }
+ useComp.layout();
+
+ if (xModListener != null) {
+ xWidget.addXModifiedListener(xModListener);
+ }
+
+ xWidget.addXModifiedListener(refreshRequiredModListener);
+
+ if (dynamicWidgetLayoutListener != null) {
+ dynamicWidgetLayoutListener.widgetCreated(xWidget, toolkit, artifact, this, xModListener, isEditable);
+ dynamicWidgetLayoutListener.createXWidgetLayoutData(xWidgetLayoutData, xWidget, toolkit, artifact,
+ xModListener, isEditable);
+ }
+ }
+
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ for (DynamicXWidgetLayoutData xWidgetLayoutData : getLayoutDatas()) {
+ xWidgetLayoutData.getXWidget().validate();
+ }
+ refreshOrAndXOrRequiredFlags();
+ }
+ });
+ }
+ private final XModifiedListener refreshRequiredModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ refreshOrAndXOrRequiredFlags();
+ }
+ };
+
+ /**
+ * Required flags are set per XWidget and the labels change from Red to Black when the widget has been edited
+ * successfully. When a page is made up of two or more widgets that need to work together, these required flags need
+ * to be set/unset whenever a widget from the group gets modified.
+ */
+ private void refreshOrAndXOrRequiredFlags() {
+ // Handle orRequired
+ for (ArrayList<String> orReq : orRequired) {
+ // If group is complete, change all to black, else all red
+ boolean isComplete = isOrGroupFromAttrNameComplete(orReq.iterator().next());
+ for (String aName : orReq) {
+ DynamicXWidgetLayoutData layoutData = getLayoutData(aName);
+ Label label = layoutData.getXWidget().getLabelWidget();
+ if (label != null && !label.isDisposed()) label.setForeground(isComplete ? null : Display.getCurrent().getSystemColor(
+ SWT.COLOR_RED));
+ }
+ }
+ // Handle xorRequired
+ for (ArrayList<String> xorReq : xorRequired) {
+ // If group is complete, change all to black, else all red
+ boolean isComplete = isXOrGroupFromAttrNameComplete(xorReq.iterator().next());
+ for (String aName : xorReq) {
+ DynamicXWidgetLayoutData layoutData = getLayoutData(aName);
+ Label label = layoutData.getXWidget().getLabelWidget();
+ if (label != null && !label.isDisposed()) label.setForeground(isComplete ? null : Display.getCurrent().getSystemColor(
+ SWT.COLOR_RED));
+ }
+ }
+ }
+
+ public IStatus isPageComplete() {
+ for (DynamicXWidgetLayoutData data : datas) {
+ IStatus valid = data.getXWidget().isValid();
+ if (!valid.isOK()) {
+ // Check to see if widget is part of a completed OR or XOR group
+ if (!isOrGroupFromAttrNameComplete(data.getStorageName()) && !isXOrGroupFromAttrNameComplete(data.getStorageName())) return valid;
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ public Set<DynamicXWidgetLayoutData> getLayoutDatas() {
+ return datas;
+ }
+
+ public void setLayoutDatas(List<DynamicXWidgetLayoutData> datas) {
+ this.datas.clear();
+ for (DynamicXWidgetLayoutData data : datas) {
+ data.setDynamicXWidgetLayout(this);
+ this.datas.add(data);
+ }
+ }
+
+ public void addWorkLayoutDatas(List<DynamicXWidgetLayoutData> datas) {
+ this.datas.addAll(datas);
+ }
+
+ public DynamicXWidgetLayoutData getLayoutData(String attrName) {
+ for (DynamicXWidgetLayoutData layoutData : datas)
+ if (layoutData.getStorageName().equals(attrName)) return layoutData;
+ return null;
+ }
+
+ public boolean isOrRequired(String attrName) {
+ return (getOrRequiredGroup(attrName)).size() > 0;
+ }
+
+ public boolean isXOrRequired(String attrName) {
+ return (getXOrRequiredGroup(attrName)).size() > 0;
+ }
+
+ public ArrayList<String> getOrRequiredGroup(String attrName) {
+ return getRequiredGroup(orRequired, attrName);
+ }
+
+ public ArrayList<String> getXOrRequiredGroup(String attrName) {
+ return getRequiredGroup(xorRequired, attrName);
+ }
+
+ private ArrayList<String> getRequiredGroup(ArrayList<ArrayList<String>> requiredList, String attrName) {
+ for (ArrayList<String> list : requiredList)
+ for (String aName : list)
+ if (aName.equals(attrName)) return list;
+ return new ArrayList<String>();
+ }
+
+ /**
+ * @param name
+ * @return true if ANY item in group is entered
+ */
+ public boolean isOrGroupFromAttrNameComplete(String name) {
+ for (String aName : getOrRequiredGroup(name)) {
+ DynamicXWidgetLayoutData layoutData = getLayoutData(aName);
+ if (layoutData.getXWidget() != null && layoutData.getXWidget().isValid().isOK()) return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param attrName
+ * @return true if only ONE item in group is entered
+ */
+ public boolean isXOrGroupFromAttrNameComplete(String attrName) {
+ boolean oneFound = false;
+ for (String aName : getXOrRequiredGroup(attrName)) {
+ DynamicXWidgetLayoutData layoutData = getLayoutData(aName);
+ if (layoutData.getXWidget() != null && layoutData.getXWidget().isValid().isOK())
+ // If already found one, return false
+ if (oneFound)
+ return false;
+ else
+ oneFound = true;
+ }
+ return oneFound;
+ }
+
+ protected void processOrRequired(String instr) {
+ ArrayList<String> names = new ArrayList<String>();
+ for (String attr : instr.split(";"))
+ if (!attr.contains("[ \\s]*")) names.add(attr);
+ orRequired.add(names);
+ }
+
+ protected void processXOrRequired(String instr) {
+ ArrayList<String> names = new ArrayList<String>();
+ for (String attr : instr.split(";"))
+ if (!attr.contains("[ \\s]*")) names.add(attr);
+ xorRequired.add(names);
+ }
+
+ protected void processlayoutDatas(String xWidgetXml) throws IOException, ParserConfigurationException, SAXException {
+ Document document = Jaxp.readXmlDocument(xWidgetXml);
+ Element rootElement = document.getDocumentElement();
+
+ List<DynamicXWidgetLayoutData> attrs = XWidgetParser.extractlayoutDatas(this, rootElement);
+ for (DynamicXWidgetLayoutData attr : attrs) {
+ nameToLayoutData.put(attr.getName(), attr);
+ datas.add(attr);
+ }
+ }
+
+ protected void processLayoutDatas(Element element) throws IOException, ParserConfigurationException, SAXException {
+ List<DynamicXWidgetLayoutData> layoutDatas = XWidgetParser.extractlayoutDatas(this, element);
+ for (DynamicXWidgetLayoutData layoutData : layoutDatas) {
+ nameToLayoutData.put(layoutData.getName(), layoutData);
+ datas.add(layoutData);
+ }
+ }
+
+ /**
+ * @return the optionResolver
+ */
+ public IXWidgetOptionResolver getOptionResolver() {
+ return optionResolver;
+ }
+
+ /**
+ * @return the xWidgets
+ */
+ public List<XWidget> getXWidgets() {
+ return xWidgets;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayoutData.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayoutData.java
new file mode 100644
index 00000000000..b636e6810fb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/DynamicXWidgetLayoutData.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOptionHandler;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class DynamicXWidgetLayoutData implements Cloneable {
+ private static final XWidgetFactory xWidgetFactory = XWidgetFactory.getInstance();
+ private static final int DEFAULT_HEIGHT = 9999;
+ private String name = "Unknown";
+ private String id = "";
+ private String storageName = "";
+ private String xWidgetName = UNKNOWN;
+ private static String UNKNOWN = "Unknown";
+ private XWidget xWidget;
+ private int beginComposite = 0; // If >0, indicates new child composite with columns == value
+ private boolean endComposite; // indicated end of child composite
+ private int height = DEFAULT_HEIGHT;
+ private String toolTip;
+ private DynamicXWidgetLayout dynamicXWidgetLayout;
+ private String defaultValue;
+ private String keyedBranchName;
+ private XOptionHandler xOptionHandler = new XOptionHandler();
+
+ public DynamicXWidgetLayoutData(DynamicXWidgetLayout dynamicXWidgetLayout, XOption... xOption) {
+ this.dynamicXWidgetLayout = dynamicXWidgetLayout;
+ xOptionHandler.add(XOption.EDITABLE);
+ xOptionHandler.add(XOption.ALIGN_LEFT);
+ xOptionHandler.add(xOption);
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+
+ public boolean isHeightSet() {
+ return height != DEFAULT_HEIGHT;
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+ public String getName() {
+ return name.replaceFirst("^.*?\\.", "");
+ }
+
+ /**
+ * @return Returns the storageName.
+ */
+ public String getStorageName() {
+ return storageName;
+ }
+
+ /**
+ * @param storageName The storageName to set.
+ */
+ public void setStorageName(String storageName) {
+ this.storageName = storageName;
+ }
+
+ /**
+ * @return Returns the required.
+ */
+ public boolean isRequired() {
+ return xOptionHandler.contains(XOption.REQUIRED) || dynamicXWidgetLayout.isOrRequired(storageName) || dynamicXWidgetLayout.isXOrRequired(storageName);
+ }
+
+ /**
+ * @return Returns the xWidget.
+ */
+ public String getXWidgetName() {
+ return xWidgetName;
+ }
+
+ /**
+ * @param widget The xWidget to set.
+ */
+ public void setXWidgetName(String widget) {
+ xWidgetName = widget;
+ }
+
+ /**
+ * @param name The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ // TODO This method will need to be removed
+ public XWidget getXWidget() {
+ if (xWidget == null) {
+ xWidget = xWidgetFactory.createXWidget(xWidgetName, name, this);
+ }
+ return xWidget;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ /**
+ * @return Returns the height.
+ */
+ public int getHeight() {
+ return height;
+ }
+
+ /**
+ * @param height The height to set.
+ */
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ /**
+ * @return Returns the beginComposite.
+ */
+ public int getBeginComposite() {
+ if (xOptionHandler.contains(XOption.BEGIN_COMPOSITE_10)) return 10;
+ if (xOptionHandler.contains(XOption.BEGIN_COMPOSITE_8)) return 8;
+ if (xOptionHandler.contains(XOption.BEGIN_COMPOSITE_6)) return 6;
+ if (xOptionHandler.contains(XOption.BEGIN_COMPOSITE_4)) return 4;
+ return beginComposite;
+ }
+
+ /**
+ * @param beginComposite The beginComposite to set.
+ */
+ public void setBeginComposite(int beginComposite) {
+ this.beginComposite = beginComposite;
+ }
+
+ /**
+ * @return Returns the endComposite.
+ */
+ public boolean isEndComposite() {
+ return endComposite;
+ }
+
+ /**
+ * @param endComposite The endComposite to set.
+ */
+ public void setEndComposite(boolean endComposite) {
+ this.endComposite = endComposite;
+ }
+
+ /**
+ * @return the toolTip
+ */
+ public String getToolTip() {
+ return toolTip;
+ }
+
+ /**
+ * @param toolTip the toolTip to set
+ */
+ public void setToolTip(String toolTip) {
+ this.toolTip = toolTip;
+ }
+
+ /**
+ * @return the dynamicXWidgetLayout
+ */
+ public DynamicXWidgetLayout getDynamicXWidgetLayout() {
+ return dynamicXWidgetLayout;
+ }
+
+ /**
+ * @return the defaultValue
+ */
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ /**
+ *
+ */
+ public void setKeyedBranchName(String keyedBranchName) {
+ this.keyedBranchName = keyedBranchName;
+ }
+
+ /**
+ * @return the keyedBranchName
+ */
+ public String getKeyedBranchName() {
+ return keyedBranchName;
+ }
+
+ /**
+ * @param dynamicXWidgetLayout the dynamicXWidgetLayout to set
+ */
+ public void setDynamicXWidgetLayout(DynamicXWidgetLayout dynamicXWidgetLayout) {
+ this.dynamicXWidgetLayout = dynamicXWidgetLayout;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the xOptionHandler
+ */
+ public XOptionHandler getXOptionHandler() {
+ return xOptionHandler;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IAttributeXWidgetProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IAttributeXWidgetProvider.java
new file mode 100644
index 00000000000..635fe71bc06
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IAttributeXWidgetProvider.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IAttributeXWidgetProvider {
+
+ public List<DynamicXWidgetLayoutData> getDynamicXWidgetLayoutData(AttributeType attributeType);
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IDynamicWidgetLayoutListener.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IDynamicWidgetLayoutListener.java
new file mode 100644
index 00000000000..5c11cbf43de
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IDynamicWidgetLayoutListener.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.framework.ui.skynet.widgets.workflow;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IDynamicWidgetLayoutListener {
+
+ public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException;
+
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException;
+
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData layoutData, XWidget xWidget, FormToolkit toolkit, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IWorkDefinitionProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IWorkDefinitionProvider.java
new file mode 100644
index 00000000000..ca8571dd96e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IWorkDefinitionProvider.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IWorkDefinitionProvider {
+
+ /**
+ * Return WorkItemDefinitions to be contributed programatically to the WorkDefinitionFactory. This includes Page and
+ * Workflow Definitions. This should only be used for development as all WorkItemDefinitions should be imported into
+ * the DB using ImportWorkItemDefinitions.
+ *
+ * @return
+ * @throws Exception TODO
+ */
+ public Collection<WorkItemDefinition> getProgramaticWorkItemDefinitions() throws OseeCoreException;
+
+ /**
+ * Return WorkFlowDefinition to use for the given state machine artifact.
+ *
+ * @param artifact
+ * @return
+ * @throws Exception TODO
+ */
+ public WorkFlowDefinition getWorkFlowDefinition(Artifact artifact) throws OseeCoreException;
+
+ /**
+ * Dynamic Work Item Definitions will be collected only when widgets are being drawn for the given workflow and
+ * workpage. This allows for dynamic widgets to be added conditionally and/or configured programatically.
+ *
+ * @param workFlowDefinition current workflow
+ * @param workPageDefinition current workpage
+ * @param data information provided to the extending plugins to determine if work item definitions should be added
+ * @return
+ * @throws Exception TODO
+ */
+ public Collection<WorkItemDefinition> getDynamicWorkItemDefinitionsForPage(WorkFlowDefinition workFlowDefinition, WorkPageDefinition workPageDefinition, Object data) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetOptionResolver.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetOptionResolver.java
new file mode 100644
index 00000000000..59947a001ab
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetOptionResolver.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.framework.ui.skynet.widgets.workflow;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IXWidgetOptionResolver {
+
+ public String[] getWidgetOptions(DynamicXWidgetLayoutData xWidgetData);
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetProvider.java
new file mode 100644
index 00000000000..20359e7b43f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/IXWidgetProvider.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.framework.ui.skynet.widgets.workflow;
+
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IXWidgetProvider {
+
+ public XWidget createXWidget(String xWidgetName, String name, DynamicXWidgetLayoutData xWidgetLayoutData);
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/UserCommunity.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/UserCommunity.java
new file mode 100644
index 00000000000..aeadf406533
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/UserCommunity.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class UserCommunity {
+ private static UserCommunity instance = new UserCommunity();
+
+ private UserCommunity() {
+ super();
+ }
+
+ public static UserCommunity getInstance() {
+ return instance;
+ }
+
+ public Set<String> getUserCommunityNames() {
+ Set<String> communities;
+ try {
+ communities =
+ AttributeTypeManager.getEnumerationValues("ats.User Community");
+ } catch (OseeCoreException ex) {
+ communities = new HashSet<String>();
+ communities.add(ex.getLocalizedMessage());
+ }
+ return communities;
+ }
+
+ public String getUserCommunityCommaDelim() {
+ StringBuffer sb = new StringBuffer();
+ for (String name : getUserCommunityNames())
+ sb.append(name + ",");
+ return sb.toString().replaceFirst(",$", "");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkDefinitionProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkDefinitionProvider.java
new file mode 100644
index 00000000000..133197aa849
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkDefinitionProvider.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkDefinitionProvider {
+
+ private static List<IWorkDefinitionProvider> workDefinitionProviders;
+
+ public static List<IWorkDefinitionProvider> getWorkDefinitionProviders() {
+ workDefinitionProviders = new ArrayList<IWorkDefinitionProvider>();
+ for (IConfigurationElement el : ExtensionPoints.getExtensionElements(
+ "org.eclipse.osee.framework.ui.skynet.WorkDefinitionProvider", "WorkDefinitionProvider")) {
+ String classname = null;
+ String bundleName = null;
+ if (el.getName().equals("WorkDefinitionProvider")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ workDefinitionProviders.add((IWorkDefinitionProvider) obj);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Error loading WorkDefinitionProvider extension", ex);
+ }
+ }
+
+ }
+ }
+ return workDefinitionProviders;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinition.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinition.java
new file mode 100644
index 00000000000..7fec4c37114
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinition.java
@@ -0,0 +1,472 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkFlowDefinition extends WorkItemWithChildrenDefinition {
+
+ public static String ARTIFACT_NAME = "Work Flow Definition";
+
+ public static enum TransitionType {
+ // Normal transition; will be provided as option in transition pulldown
+ ToPage,
+ // Allows the page to "return" to an earlier state; allows transition w/o page completion;
+ // will be provided as an option in transition pulldown (don't need to register as ToPage)
+ ToPageAsReturn,
+ // ToPage that will also be registered as the default selected transition state
+ ToPageAsDefault,
+ }
+ // fromPageId --- TransitionType ---> toPageIds
+ // Contains locally defined transitions
+ private final Map<String, Map<TransitionType, Set<String>>> pageIdToPageIdsViaTransitionType =
+ new HashMap<String, Map<TransitionType, Set<String>>>();
+ // Contains locally and inherited transitions
+ protected Map<String, Map<TransitionType, Set<String>>> inheritedPageIdToPageIdsViaTransitionType;
+ // Contains local and inherited pageNameToPageIds
+ protected Map<String, String> pageNameToPageId;
+ protected List<WorkPageDefinition> pages = new ArrayList<WorkPageDefinition>();
+ protected String startPageId;
+ protected String resolvedStartPageId;
+
+ public WorkFlowDefinition(String name, String id, String parentId) {
+ super(name, id, parentId);
+ }
+
+ public WorkFlowDefinition(Artifact artifact) throws OseeCoreException {
+ this(artifact.getDescriptiveName(), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_ID.getAttributeTypeName(), ""), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), (String) null));
+ setType(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_TYPE.getAttributeTypeName(), (String) null));
+ loadWorkDataKeyValueMap(artifact);
+
+ // Add local transitions from this artifact
+ addTransitionsFromArtifact(artifact, pageIdToPageIdsViaTransitionType, getId());
+
+ // Read in this workflow's start page
+ startPageId =
+ artifact.getSoleAttributeValue(WorkItemAttributes.START_PAGE.getAttributeTypeName(), null, String.class);
+ }
+
+ @Override
+ public Artifact toArtifact(WriteType writeType) throws OseeCoreException {
+ Artifact art = super.toArtifact(writeType);
+ // Make sure start page is defined in this or parent's definition
+ if (getResolvedStartPageId() == null) {
+ throw new IllegalStateException(
+ "For WorkFlowDefinition " + getId() + ". Start Page not defined. Must be in this or a parent's WorkFlowDefinition.");
+ }
+ // Only store start page if it's part of this definition
+ if (startPageId != null) {
+ art.setSoleAttributeFromString(WorkItemAttributes.START_PAGE.getAttributeTypeName(), startPageId);
+ }
+ // Store transition items declared as part of this definition
+ List<String> transitionItems = new ArrayList<String>();
+ for (Entry<String, Map<TransitionType, Set<String>>> pageToTransEntry : pageIdToPageIdsViaTransitionType.entrySet()) {
+ for (Entry<TransitionType, Set<String>> transToPageIdsEntry : pageIdToPageIdsViaTransitionType.get(
+ pageToTransEntry.getKey()).entrySet()) {
+ for (String toPage : transToPageIdsEntry.getValue()) {
+ transitionItems.add(pageToTransEntry.getKey() + ";" + transToPageIdsEntry.getKey().name() + ";" + toPage);
+ }
+ }
+ }
+ if (transitionItems.size() > 0) {
+ art.setAttributeValues(WorkItemAttributes.TRANSITION.getAttributeTypeName(), transitionItems);
+ }
+ return art;
+ }
+
+ public Collection<String> getPageNames() throws OseeCoreException {
+ loadPageData();
+ return pageNameToPageId.keySet();
+ }
+
+ public static void loadInheritedData(WorkFlowDefinition workFlowDefinition, String workflowId, Map<String, Map<TransitionType, Set<String>>> inheritedPageIdToPageIdsViaTransitionType) throws OseeCoreException {
+ addTransitionsFromArtifact(WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(workFlowDefinition.getId()),
+ inheritedPageIdToPageIdsViaTransitionType, workflowId);
+ if (workFlowDefinition.hasParent()) {
+ WorkFlowDefinition.loadInheritedData((WorkFlowDefinition) workFlowDefinition.getParent(), workflowId,
+ inheritedPageIdToPageIdsViaTransitionType);
+ }
+ }
+
+ /**
+ * If deCache, clears cache and reloads workflow data
+ *
+ * @param deCache
+ * @throws OseeCoreException
+ */
+ public void loadPageData(boolean deCache) throws OseeCoreException {
+ if (deCache) {
+ inheritedPageIdToPageIdsViaTransitionType = null;
+ pageNameToPageId = null;
+ }
+ loadPageData();
+ }
+
+ public synchronized void loadPageData() throws OseeCoreException {
+ if (inheritedPageIdToPageIdsViaTransitionType == null) {
+ inheritedPageIdToPageIdsViaTransitionType = new HashMap<String, Map<TransitionType, Set<String>>>();
+ WorkFlowDefinition.loadInheritedData(this, getId(), inheritedPageIdToPageIdsViaTransitionType);
+ }
+ resolvedStartPageId = getResolvedStartPageId(this, getId());
+ if (pageNameToPageId == null) {
+ pageNameToPageId = new HashMap<String, String>();
+ for (String pageNameOrId : inheritedPageIdToPageIdsViaTransitionType.keySet()) {
+ WorkPageDefinition workPageDefinition =
+ (WorkPageDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(getFullPageId(pageNameOrId));
+ pages.add(workPageDefinition);
+ pageNameToPageId.put(workPageDefinition.getPageName(), workPageDefinition.id);
+ for (Map<TransitionType, Set<String>> transTypeToPageIds : inheritedPageIdToPageIdsViaTransitionType.values()) {
+ for (TransitionType transType : transTypeToPageIds.keySet()) {
+ for (String pageId2 : transTypeToPageIds.get(transType)) {
+ workPageDefinition =
+ (WorkPageDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(getFullPageId(pageId2));
+ pageNameToPageId.put(workPageDefinition.getPageName(), workPageDefinition.id);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return the pages
+ */
+ public List<WorkPageDefinition> getPages() {
+ return pages;
+ }
+
+ /**
+ * Since transitions can be defined by full ids or just page name (eg "Endorse"), check if pageId has namespace
+ * characters and thus it's full name or add id to given pageId
+ *
+ * @param pageId
+ * @return
+ */
+ private String getFullPageId(String pageId) {
+ return (pageId.contains(".")) ? pageId : getId() + "." + pageId;
+ }
+
+ public WorkPageDefinition getWorkPageDefinitionByName(String name) throws OseeCoreException {
+ loadPageData();
+ return getWorkPageDefinitionById(pageNameToPageId.get(name));
+ }
+
+ public WorkPageDefinition getWorkPageDefinitionById(String id) throws OseeCoreException {
+ loadPageData();
+ return (WorkPageDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(id);
+ }
+
+ public Collection<WorkRuleDefinition> getWorkRulesStartsWith(String ruleId) throws OseeCoreException {
+ Set<WorkRuleDefinition> workRules = new HashSet<WorkRuleDefinition>();
+ if (ruleId == null || ruleId.equals("")) return workRules;
+ // Get work rules from team definition
+ for (WorkRuleDefinition workRuleDefinition : getWorkRules()) {
+ if (!workRuleDefinition.getId().equals("") && workRuleDefinition.getId().startsWith(ruleId)) {
+ workRules.add(workRuleDefinition);
+ }
+ }
+
+ return workRules;
+ }
+
+ public Collection<WorkRuleDefinition> getWorkRules() throws OseeCoreException {
+ Set<WorkRuleDefinition> workRules = new HashSet<WorkRuleDefinition>();
+ // Get work rules from team definition
+ for (Artifact art : WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(getId()).getRelatedArtifacts(
+ CoreRelationEnumeration.WorkItem__Child)) {
+ String id = art.getSoleAttributeValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), "");
+ if (id != null && !id.equals("")) {
+ workRules.add((WorkRuleDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(id));
+ }
+ }
+
+ return workRules;
+ }
+
+ /**
+ * @return Returns the defaultToPage.
+ */
+ public WorkPageDefinition getDefaultToPage(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ if (getPageDefinitions(workPageDefinition.getId(), TransitionType.ToPageAsDefault).size() > 0) return getPageDefinitions(
+ workPageDefinition.getId(), TransitionType.ToPageAsDefault).iterator().next();
+ return null;
+ }
+
+ /**
+ * This convenience method registers a transition forward and back. Useful for final/hold states like cancelled or
+ * completed that can be returned from<br>
+ * 1) fromPageId, toPageId, ToPage<br>
+ * 2) toPageId, fromPageId, ToPageAsReturn
+ *
+ * @param fromPageId
+ * @param toPageId
+ * @param transitionType
+ */
+ public void addPageTransitionToPageAndReturn(String fromPageId, String toPageId) {
+ addPageTransition(pageIdToPageIdsViaTransitionType, fromPageId, toPageId, TransitionType.ToPage);
+ addPageTransition(pageIdToPageIdsViaTransitionType, toPageId, fromPageId, TransitionType.ToPageAsReturn);
+ }
+
+ public static void addTransitionsFromArtifact(Artifact artifact, Map<String, Map<TransitionType, Set<String>>> pageIdToPageIdsViaTransitionType, String workflowId) throws OseeCoreException {
+ if (artifact == null) return;
+ // Read in this workflow's transition information
+ for (String transition : artifact.getAttributesToStringList(WorkItemAttributes.TRANSITION.getAttributeTypeName())) {
+ String[] strs = transition.split(";");
+ if (strs.length != 3) {
+ OseeLog.log(
+ SkynetGuiPlugin.class,
+ OseeLevel.SEVERE_POPUP,
+ new IllegalStateException(
+ "Transition attribute from artifact " + artifact.getHumanReadableId() + " is invalid. Must be <fromState>;<transitionType>;<toState>"));
+ continue;
+ }
+ TransitionType transType = TransitionType.valueOf(strs[1]);
+ // Since workflows can be defined by stateName or pageId, resolve any stateName to pageId so only dealing with one index
+ // eg (Endorse -> <workflow id>.Endorse -> osee.ats.Endorse AND osee.ats.Endorse -> osee.ats.Endorse)
+ String fromPage = strs[0].contains(".") ? strs[0] : workflowId + "." + strs[0];
+ String toPage = strs[2].contains(".") ? strs[2] : workflowId + "." + strs[2];
+ addPageTransition(pageIdToPageIdsViaTransitionType, fromPage, toPage, transType);
+ }
+
+ }
+
+ /**
+ * Register transition for from and to pages. The use of simple page names (eg "Endorse") allows for other workflows
+ * to inherit this workflow by just using the same state names. id will be prepended to name prior to retrieving the
+ * WorkPageDefinitions
+ *
+ * @param fromPageId either page Name "Endorse" or full namespace "osee.ats.Endorse"
+ * @param toPageId either page Name "Endorse" or full namespace "osee.ats.Endorse"
+ * @param transitionType
+ */
+ public void addPageTransition(String fromPageId, String toPageId, TransitionType... transitionType) {
+ WorkFlowDefinition.addPageTransition(pageIdToPageIdsViaTransitionType, fromPageId, toPageId, transitionType);
+ }
+
+ public void removePageTransition(String fromPageId, String toPageId, TransitionType... transitionType) {
+ WorkFlowDefinition.removePageTransition(pageIdToPageIdsViaTransitionType, fromPageId, toPageId, transitionType);
+ }
+
+ /**
+ * Register transition for from and to pages. The use of simple page names (eg "Endorse") allows for other workflows
+ * to inherit this workflow by just using the same state names. id will be prepended to name prior to retrieving the
+ * WorkPageDefinitions
+ *
+ * @param fromPageId either page Name "Endorse" or full namespace "osee.ats.Endorse"
+ * @param toPageId either page Name "Endorse" or full namespace "osee.ats.Endorse"
+ * @param transitionType
+ */
+ public static void addPageTransition(Map<String, Map<TransitionType, Set<String>>> pageIdToPageIdsViaTransitionType, String fromPageId, String toPageId, TransitionType... transitionType) {
+ List<Object> transTypes = Collections.getAggregate((Object[]) transitionType);
+ Map<TransitionType, Set<String>> transitionTypeToPageIds = pageIdToPageIdsViaTransitionType.get(fromPageId);
+ if (transitionTypeToPageIds == null) {
+ transitionTypeToPageIds = new HashMap<TransitionType, Set<String>>();
+ }
+ for (TransitionType transType : transitionType) {
+ Set<String> toPageIds = transitionTypeToPageIds.get(transType);
+ if (toPageIds == null) {
+ toPageIds = new HashSet<String>();
+ }
+ if (transTypes.contains(TransitionType.ToPageAsDefault) && toPageIds.size() > 0) {
+ throw new IllegalArgumentException("Only allowed ONE DefaultToPage from " + fromPageId);
+ }
+ toPageIds.add(toPageId);
+
+ transitionTypeToPageIds.put(transType, toPageIds);
+ pageIdToPageIdsViaTransitionType.put(fromPageId, transitionTypeToPageIds);
+ }
+ }
+
+ public static void removePageTransition(Map<String, Map<TransitionType, Set<String>>> pageIdToPageIdsViaTransitionType, String fromPageId, String toPageId, TransitionType... transitionType) {
+ Map<TransitionType, Set<String>> transitionTypeToPageIds = pageIdToPageIdsViaTransitionType.get(fromPageId);
+ if (transitionTypeToPageIds == null) {
+ return;
+ }
+ for (TransitionType transType : transitionType) {
+ Set<String> toPageIds = transitionTypeToPageIds.get(transType);
+ if (toPageIds == null) {
+ return;
+ }
+ toPageIds.remove(toPageId);
+ transitionTypeToPageIds.put(transType, toPageIds);
+ pageIdToPageIdsViaTransitionType.put(fromPageId, transitionTypeToPageIds);
+ }
+ }
+
+ /**
+ * Return all registered page definitions including those inherited from parent(s)
+ *
+ * @param fromPageId
+ * @param transitionType
+ * @return definitions
+ * @throws Exception
+ */
+ public List<WorkPageDefinition> getPageDefinitions(String fromPageId, TransitionType... transitionType) throws OseeCoreException {
+ return getPageDefinitions(this, fromPageId, true, transitionType);
+ }
+
+ public void clearTransitions() {
+ pageIdToPageIdsViaTransitionType.clear();
+ }
+
+ public Map<TransitionType, Set<String>> getTransitionTypeToPageIds(String fromPageId) throws OseeCoreException {
+ loadPageData();
+ return pageIdToPageIdsViaTransitionType.get(fromPageId);
+ }
+
+ public Map<TransitionType, Set<String>> getInheritedTransitionTypeToPageIds(String fromPageId) throws OseeCoreException {
+ loadPageData();
+ return inheritedPageIdToPageIdsViaTransitionType.get(fromPageId);
+ }
+
+ public static List<WorkPageDefinition> getPageDefinitions(WorkFlowDefinition workFlowDefinition, String fromPageId, boolean includeInherited, TransitionType... transitionType) throws OseeCoreException {
+ Map<TransitionType, Set<String>> transitionTypeToPageIds = null;
+ if (includeInherited) {
+ transitionTypeToPageIds = workFlowDefinition.getInheritedTransitionTypeToPageIds(fromPageId);
+ } else {
+ transitionTypeToPageIds = workFlowDefinition.getTransitionTypeToPageIds(fromPageId);
+ }
+ List<WorkPageDefinition> workPageDefs = new ArrayList<WorkPageDefinition>();
+ if (transitionTypeToPageIds != null) {
+ for (TransitionType transType : transitionType) {
+ Set<String> toPageIds = transitionTypeToPageIds.get(transType);
+ if (toPageIds == null) {
+ continue;
+ }
+ for (WorkItemDefinition def : WorkItemDefinitionFactory.getWorkItemDefinitions(toPageIds)) {
+ workPageDefs.add((WorkPageDefinition) def);
+ }
+ }
+ }
+ return workPageDefs;
+ }
+
+ public List<WorkPageDefinition> getPagesOrdered() throws OseeCoreException {
+ WorkPageDefinition startWorkPageDefinition = getStartPage();
+ if (startWorkPageDefinition == null) throw new IllegalArgumentException(
+ "Can't locate Start WorkPageDefinition for workflow " + getName());
+
+ // Get ordered pages starting with start page
+ List<WorkPageDefinition> orderedPages = new ArrayList<WorkPageDefinition>();
+ getOrderedPages(startWorkPageDefinition, orderedPages);
+
+ // Move completed to the end if it exists
+ WorkPageDefinition completedPage = null;
+ for (WorkPageDefinition workPageDefinition : orderedPages)
+ if (workPageDefinition.isCompletePage()) completedPage = workPageDefinition;
+ if (completedPage != null) {
+ orderedPages.remove(completedPage);
+ orderedPages.add(completedPage);
+ }
+ // for (WorkPage wPage : orderedPages)
+ // System.out.println("Ordered Page: - " + wPage);
+ return orderedPages;
+ }
+
+ private void getOrderedPages(WorkPageDefinition workPageDefinition, List<WorkPageDefinition> pages) throws OseeCoreException {
+ // Add this page first
+ if (!pages.contains(workPageDefinition)) pages.add(workPageDefinition);
+ // Add default page
+ if (getDefaultToPage(workPageDefinition) != null) getOrderedPages(getDefaultToPage(workPageDefinition), pages);
+ // Add remaining pages
+ for (WorkPageDefinition wPage : getToPages(workPageDefinition))
+ if (!pages.contains(wPage)) getOrderedPages(wPage, pages);
+ }
+
+ /**
+ * @return Returns the toPages for given workPageDefinition including default and return toPages.
+ */
+ public List<WorkPageDefinition> getToPages(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return getPageDefinitions(workPageDefinition.getId(), TransitionType.ToPage, TransitionType.ToPageAsDefault,
+ TransitionType.ToPageAsReturn);
+ }
+
+ /**
+ * @return Returns the returnPages for given workPageDefinition.
+ */
+ public List<WorkPageDefinition> getReturnPages(WorkPageDefinition workPageDefinition) throws OseeCoreException {
+ return getPageDefinitions(workPageDefinition.getId(), TransitionType.ToPageAsReturn);
+ }
+
+ public boolean isReturnPage(WorkPageDefinition fromWorkPageDefinition, WorkPageDefinition toWorkPageDefinition) throws OseeCoreException {
+ return getReturnPages(fromWorkPageDefinition).contains(toWorkPageDefinition);
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return id + " - " + name + (parentId != null ? " - Parent: " + parentId : "") + getPageNames().toString();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ return id + " - " + name;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition#getArtifactTypeName()
+ */
+ @Override
+ public String getArtifactTypeName() {
+ return ARTIFACT_NAME;
+ }
+
+ public WorkPageDefinition getStartPage() throws OseeCoreException {
+ loadPageData();
+ if (resolvedStartPageId != null) {
+ return (WorkPageDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(resolvedStartPageId);
+ }
+ return null;
+ }
+
+ public void setStartPageId(String startPageId) {
+ this.startPageId = startPageId;
+ }
+
+ public String getStartPageId() throws OseeCoreException {
+ loadPageData();
+ return startPageId;
+ }
+
+ public String getResolvedStartPageId() throws OseeCoreException {
+ loadPageData();
+ return resolvedStartPageId;
+ }
+
+ private static String getResolvedStartPageId(WorkFlowDefinition workFlowDefinition, String workflowId) throws OseeCoreException {
+ if (workFlowDefinition.startPageId != null) {
+ return workFlowDefinition.startPageId.contains(".") ? workFlowDefinition.startPageId : workflowId + "." + workFlowDefinition.startPageId;
+ }
+ if (workFlowDefinition.hasParent()) {
+ return getResolvedStartPageId((WorkFlowDefinition) workFlowDefinition.getParent(), workflowId);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinitionFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinitionFactory.java
new file mode 100644
index 00000000000..37453455e6d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkFlowDefinitionFactory.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.framework.ui.skynet.widgets.workflow;
+
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkFlowDefinitionFactory {
+
+ public static WorkFlowDefinition getWorkFlowDefinition(Artifact artifact) throws Exception {
+
+ // Check extensions for WorkFlowDefinition for given artifact
+ for (IWorkDefinitionProvider provider : WorkDefinitionProvider.getWorkDefinitionProviders()) {
+ WorkFlowDefinition workFlowDefinition = provider.getWorkFlowDefinition(artifact);
+ if (workFlowDefinition != null) return workFlowDefinition;
+ }
+ throw new IllegalArgumentException(
+ "No WorkFlowDefinition found for artifact " + artifact.getArtifactTypeName() + " - " + artifact.getHumanReadableId());
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemAttributes.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemAttributes.java
new file mode 100644
index 00000000000..d1c4a2d99d3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemAttributes.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.skynet.widgets.workflow;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkItemAttributes {
+
+ public static WorkItemAttributes WORK_ID = new WorkItemAttributes("Work Id");
+ public static WorkItemAttributes WORK_PARENT_ID = new WorkItemAttributes("Work Parent Id");
+ public static WorkItemAttributes WORK_DATA = new WorkItemAttributes("Work Data");
+ public static WorkItemAttributes WORK_DESCRIPTION = new WorkItemAttributes("Work Description");
+ public static WorkItemAttributes WORK_PAGE_NAME = new WorkItemAttributes("Work Page Name");
+ public static WorkItemAttributes WORK_TYPE = new WorkItemAttributes("Work Type");
+ public static WorkItemAttributes TRANSITION = new WorkItemAttributes("Transition");
+ public static WorkItemAttributes START_PAGE = new WorkItemAttributes("Start Page");
+
+ private final String attributeTypeName;
+
+ public WorkItemAttributes(String name, String attributeTypeName) {
+ this.attributeTypeName = attributeTypeName;
+ }
+
+ /**
+ * Creates attribute with displayName = "<name>" and storeName = "osee.wi.<name>"
+ *
+ * @param name
+ */
+ public WorkItemAttributes(String name) {
+ this(name, "osee.wi." + name);
+ }
+
+ public String getAttributeTypeName() {
+ return attributeTypeName;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinition.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinition.java
new file mode 100644
index 00000000000..62187bf2260
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinition.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * Definition of WorkItem. Once created, nothing in this class, or any subclasses, should be modified as these
+ * definitions are shared by all instantiations of pages, rules, workflows and widgets.
+ *
+ * @author Donald G. Dunne
+ */
+public abstract class WorkItemDefinition {
+
+ protected String id;
+ protected String name;
+ protected String parentId;
+ protected String description;
+ protected Map<String, String> workDataKeyValueMap = new HashMap<String, String>();
+ private final Pattern keyValuePattern = Pattern.compile("^(.*?)=(.*)$", Pattern.MULTILINE);
+ protected String type;
+ public static enum WriteType {
+ Update, New
+ };
+
+ /**
+ * @return the workDataKeyValueMap
+ */
+ public Map<String, String> getWorkDataKeyValueMap() {
+ return workDataKeyValueMap;
+ }
+
+ /**
+ * @param workDataKeyValueMap the workDataKeyValueMap to set
+ */
+ public void setWorkDataKeyValueMap(Map<String, String> workDataKeyValueMap) {
+ this.workDataKeyValueMap = workDataKeyValueMap;
+ }
+
+ /**
+ * @param description the description to set
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * @return the description
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ public WorkItemDefinition(String name, String id, String parentId) {
+ this(name, id, parentId, null);
+ }
+
+ public WorkItemDefinition(String name, String id, String parentId, String type) {
+ this(name, id, parentId, type, null);
+ }
+
+ public WorkItemDefinition(String name, String id, String parentId, String type, String description) {
+ this.name = name;
+ this.id = id;
+ this.type = type;
+ this.parentId = parentId;
+ this.description = description;
+ if (parentId != null && parentId.equals("")) throw new IllegalArgumentException(
+ "parentId must either be null or a valid parent Id. Invalid for WorkItemDefinition " + id);
+ if (type != null && type.equals("")) {
+ throw new IllegalArgumentException(
+ "type must either be null or a value, not empty string. Invalid for WorkItemDefinition " + id);
+ }
+ if (this.id == null || this.id.equals("")) {
+ throw new IllegalArgumentException("id must be unique and non-null");
+ }
+
+ }
+
+ /**
+ * Determine if this workItemDefinition is or has a parent definition of pageId. This will walk up the tree of
+ * definition inheritance to answer the question
+ *
+ * @param pageId
+ * @return boolean
+ * @throws OseeCoreException TODO
+ */
+ public boolean isInstanceOfPage(String pageId, String... visitedPageIds) throws OseeCoreException {
+ // Collect all ids already visited
+ Set<String> visitedIds = new HashSet<String>();
+ for (String visitedId : visitedPageIds)
+ visitedIds.add(visitedId);
+
+ // Check for circular dependency
+ if (visitedIds.contains(getId())) throw new IllegalStateException(
+ "Circular dependency detected. Id already visited: " + getId());
+
+ // Check for instanceof
+ if (getId().equals(pageId)) return true;
+
+ // If parentId exists, check if it isInstanceOfPage
+ if (getParentId() != null) {
+ visitedIds.add(getId());
+ WorkItemDefinition workItemDefinition = WorkItemDefinitionFactory.getWorkItemDefinition(getParentId());
+ return workItemDefinition.isInstanceOfPage(pageId, visitedIds.toArray(new String[visitedIds.size()]));
+ }
+ return false;
+ }
+
+ public boolean hasParent() {
+ return (getParentId() != null);
+ }
+
+ public WorkItemDefinition getParent() throws OseeCoreException {
+ if (!hasParent()) return null;
+ return WorkItemDefinitionFactory.getWorkItemDefinition(getParentId());
+ }
+
+ @Override
+ public String toString() {
+ return getArtifactTypeName() + ": Name: \"" + name +
+ //
+ "\" Id: \"" + id + "\" " +
+ //
+ (parentId != null ? " Parent: " + parentId : "");
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @return the parentId
+ */
+ public String getParentId() {
+ return parentId;
+ }
+
+ public Artifact toArtifact(WriteType writeType) throws OseeCoreException {
+ Artifact artifact = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(getId());
+ if (writeType == WriteType.New) {
+ // Double-check that doesn't already exist in db. If so, exception cause duplicates
+ if (ArtifactQuery.getArtifactsFromAttribute(WorkItemAttributes.WORK_ID.getAttributeTypeName(), getId(),
+ BranchManager.getCommonBranch()).size() > 0) {
+ throw new IllegalStateException(
+ "WorkItemDefinition artifact creation failed. \"" + getId() + "\" already exists.");
+ }
+ }
+ if (artifact == null) {
+ // Create new
+ artifact = ArtifactTypeManager.addArtifact(getArtifactTypeName(), BranchManager.getCommonBranch());
+ }
+ // if (!getId().equals("atsStatePercentCompleteWeight.DefaultWorkflow")) {
+ // System.err.println("Skipping all but atsStatePercentCompleteWeight.DefaultWorkflow - Remove This");
+ // return artifact;
+ // }
+ artifact.setDescriptiveName(getName());
+ if (getParentId() != null && !getParentId().equals("")) artifact.setSoleAttributeValue(
+ WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), getParentId());
+ if (getDescription() != null) artifact.setSoleAttributeValue(
+ WorkItemAttributes.WORK_DESCRIPTION.getAttributeTypeName(), getDescription());
+ artifact.setSoleAttributeValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), getId());
+ if (getType() != null) artifact.setSoleAttributeValue(WorkItemAttributes.WORK_TYPE.getAttributeTypeName(),
+ getType());
+ if (workDataKeyValueMap.size() > 0) {
+ Set<String> keyValues = new HashSet<String>();
+ for (Entry<String, String> entry : workDataKeyValueMap.entrySet()) {
+ keyValues.add(entry.getKey() + "=" + entry.getValue());
+ }
+ artifact.setAttributeValues(WorkItemAttributes.WORK_DATA.getAttributeTypeName(), keyValues);
+ }
+ WorkItemDefinitionFactory.cacheWorkItemDefinitionArtifact(writeType, this, artifact);
+ return artifact;
+ }
+
+ public abstract String getArtifactTypeName();
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public void loadWorkDataKeyValueMap(Artifact artifact) throws OseeCoreException {
+ for (String value : artifact.getAttributesToStringList(WorkItemAttributes.WORK_DATA.getAttributeTypeName())) {
+ Matcher m = keyValuePattern.matcher(value);
+ if (m.find()) {
+ addWorkDataKeyValue(m.group(1), m.group(2));
+ } else {
+ throw new OseeStateException("Illegal value for WorkData; must be key=value");
+ }
+ }
+ }
+
+ public String getWorkDataValue(String key) {
+ return workDataKeyValueMap.get(key);
+ }
+
+ public void addWorkDataKeyValue(String key, String value) {
+ workDataKeyValueMap.put(key, value);
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @param parentId the parentId to set
+ */
+ public void setParentId(String parentId) {
+ this.parentId = parentId;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinitionFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinitionFactory.java
new file mode 100644
index 00000000000..8b6d288069c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemDefinitionFactory.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition.WriteType;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkItemDefinitionFactory {
+
+ private static Map<String, WorkItemDefinition> itemIdToDefinition;
+ private static Map<String, Artifact> itemIdToWidArtifact;
+
+ public static void deCache(WorkItemDefinition workItemDefinition) {
+ deCache(workItemDefinition.getId());
+ }
+
+ public synchronized static void deCache(String workItemDefinitionId) {
+ itemIdToDefinition.remove(workItemDefinitionId);
+ itemIdToWidArtifact.remove(workItemDefinitionId);
+ }
+
+ public static void deCache(Artifact artifact) {
+ String itemId = null;
+ if (itemIdToWidArtifact.containsValue(artifact)) {
+ for (Entry<String, Artifact> entry : itemIdToWidArtifact.entrySet()) {
+ if (entry.getValue().equals(artifact)) {
+ deCache(entry.getKey());
+ return;
+ }
+ }
+ }
+ }
+
+ public synchronized static void loadDefinitions() throws OseeCoreException {
+ if (itemIdToDefinition == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.INFO, "Loading Work Item Definitions");
+ itemIdToDefinition = new HashMap<String, WorkItemDefinition>();
+ itemIdToWidArtifact = new HashMap<String, Artifact>();
+
+ // Add all work item definitions provided through extension points
+ for (IWorkDefinitionProvider provider : WorkDefinitionProvider.getWorkDefinitionProviders()) {
+ for (WorkItemDefinition def : provider.getProgramaticWorkItemDefinitions()) {
+ addItemDefinition(WriteType.New, def);
+ }
+ }
+
+ // This load is faster than loading each by artifact type
+ Collection<String> artifactTypeNames = new ArrayList<String>(4);
+ artifactTypeNames.add(WorkRuleDefinition.ARTIFACT_NAME);
+ artifactTypeNames.add(WorkPageDefinition.ARTIFACT_NAME);
+ artifactTypeNames.add(WorkFlowDefinition.ARTIFACT_NAME);
+ artifactTypeNames.add(WorkWidgetDefinition.ARTIFACT_NAME);
+ for (Artifact art : ArtifactQuery.getArtifactsFromTypes(artifactTypeNames, BranchManager.getCommonBranch(),
+ false)) {
+ if (art.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ addItemDefinition(WriteType.New, new WorkRuleDefinition(art), art);
+ } else if (art.getArtifactTypeName().equals(WorkWidgetDefinition.ARTIFACT_NAME)) {
+ addItemDefinition(WriteType.New, new WorkWidgetDefinition(art), art);
+ } else if (art.getArtifactTypeName().equals(WorkPageDefinition.ARTIFACT_NAME)) {
+ addItemDefinition(WriteType.New, new WorkPageDefinition(art), art);
+ } else if (art.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ addItemDefinition(WriteType.New, new WorkFlowDefinition(art), art);
+ }
+ }
+ }
+ }
+
+ /**
+ * This should only be called on database initialization or when new work item definitions are created during
+ * run-time.
+ *
+ * @param workItemDefinition
+ * @param artifact
+ */
+ public static void cacheWorkItemDefinitionArtifact(WriteType writeType, WorkItemDefinition workItemDefinition, Artifact artifact) {
+ addItemDefinition(writeType, workItemDefinition, artifact);
+ }
+
+ public static void relateWorkItemDefinitions(String parentWorkflowId, String childWorkflowId) throws OseeCoreException {
+ List<Artifact> parentArts =
+ ArtifactQuery.getArtifactsFromAttribute(WorkItemAttributes.WORK_ID.getAttributeTypeName(),
+ parentWorkflowId, BranchManager.getCommonBranch());
+ if (parentArts == null || parentArts.size() == 0) {
+ throw new IllegalArgumentException("Can't access parentWorkflowId " + parentWorkflowId);
+ }
+ Artifact parentArt = parentArts.iterator().next();
+ List<Artifact> childArts =
+ ArtifactQuery.getArtifactsFromAttribute(WorkItemAttributes.WORK_ID.getAttributeTypeName(), childWorkflowId,
+ BranchManager.getCommonBranch());
+ if (childArts == null || childArts.size() == 0) {
+ throw new IllegalArgumentException("Can't access childWorkflowId " + childWorkflowId);
+ }
+ Artifact childArt = childArts.iterator().next();
+ if (!parentArt.getRelatedArtifacts(CoreRelationEnumeration.WorkItem__Child, Artifact.class).contains(childArt)) {
+ parentArt.addRelation(CoreRelationEnumeration.WorkItem__Child, childArt);
+ parentArt.persistRelations();
+ }
+ }
+
+ private static void addItemDefinition(WriteType writeType, WorkItemDefinition workItemDefinition) {
+ if (workItemDefinition.getId() == null) throw new IllegalArgumentException("Item Id can't be null");
+ if (writeType == WriteType.New && itemIdToDefinition.containsKey(workItemDefinition.getId())) throw new IllegalArgumentException(
+ "Item Id must be unique. Already work item with id \"" + workItemDefinition.getId() + "\"");
+ itemIdToDefinition.put(workItemDefinition.getId(), workItemDefinition);
+ }
+
+ private static void addItemDefinition(WriteType writeType, WorkItemDefinition workItemDefinition, Artifact artifact) {
+ addItemDefinition(writeType, workItemDefinition);
+ itemIdToWidArtifact.put(workItemDefinition.id, artifact);
+ }
+
+ public static void loadDefinitions(Collection<Artifact> arts) throws OseeCoreException {
+ for (Artifact art : arts) {
+ if (art.getArtifactTypeName().equals(WorkRuleDefinition.ARTIFACT_NAME)) {
+ System.out.println("Updating WorkItemDefinition cache with " + art);
+ addItemDefinition(WriteType.New, new WorkRuleDefinition(art), art);
+ }
+ if (art.getArtifactTypeName().equals(WorkWidgetDefinition.ARTIFACT_NAME)) {
+ System.out.println("Updating WorkItemDefinition cache with " + art);
+ addItemDefinition(WriteType.New, new WorkWidgetDefinition(art), art);
+ }
+ if (art.getArtifactTypeName().equals(WorkPageDefinition.ARTIFACT_NAME)) {
+ System.out.println("Updating WorkItemDefinition cache with " + art);
+ addItemDefinition(WriteType.New, new WorkPageDefinition(art), art);
+ }
+ if (art.getArtifactTypeName().equals(WorkFlowDefinition.ARTIFACT_NAME)) {
+ System.out.println("Updating WorkItemDefinition cache with " + art);
+ addItemDefinition(WriteType.New, new WorkFlowDefinition(art), art);
+ }
+ }
+ }
+
+ public static WorkItemDefinition getWorkItemDefinition(String id) throws OseeCoreException {
+ if (id == null) throw new IllegalStateException("WorkItemDefinition id can't be null");
+ loadDefinitions();
+ WorkItemDefinition wid = itemIdToDefinition.get(id);
+ if (wid == null) {
+ // Attempt to get from DB
+ loadDefinitions(ArtifactQuery.getArtifactsFromAttribute(WorkItemAttributes.WORK_ID.getAttributeTypeName(), id,
+ BranchManager.getCommonBranch()));
+ }
+ return itemIdToDefinition.get(id);
+ }
+
+ public static Artifact getWorkItemDefinitionArtifact(String id) throws OseeCoreException {
+ if (id == null) throw new IllegalStateException("WorkItemDefinition id can't be null");
+ loadDefinitions();
+ Artifact art = itemIdToWidArtifact.get(id);
+ if (art == null) {
+ // Attempt to get from DB
+ loadDefinitions(ArtifactQuery.getArtifactsFromAttribute(WorkItemAttributes.WORK_ID.getAttributeTypeName(), id,
+ BranchManager.getCommonBranch()));
+ }
+ return itemIdToWidArtifact.get(id);
+ }
+
+ public static List<WorkItemDefinition> getWorkItemDefinition(java.util.Collection<String> ids) throws OseeCoreException {
+ loadDefinitions();
+ List<WorkItemDefinition> defs = new ArrayList<WorkItemDefinition>();
+ for (String id : ids) {
+ WorkItemDefinition def = getWorkItemDefinition(id);
+ if (def == null) throw new IllegalArgumentException("Work Item Id \"" + id + "\" is not a defined work item");
+ defs.add(def);
+ }
+ return defs;
+ }
+
+ public static List<WorkItemDefinition> getWorkItemDefinitionsStartsWithId(String id) throws OseeCoreException {
+ loadDefinitions();
+ List<WorkItemDefinition> defs = new ArrayList<WorkItemDefinition>();
+ for (Entry<String, WorkItemDefinition> entry : itemIdToDefinition.entrySet()) {
+ if (entry.getKey().startsWith(id)) {
+ defs.add(entry.getValue());
+ }
+ }
+ return defs;
+ }
+
+ /**
+ * Call to get dynamic definitions based on data specified. This is intended for extenders to be able to provide
+ * widgets that are either conditionally added or are configured dynamically based on dynamic circumstances
+ *
+ * @param data
+ * @return list of WorkItemDefinitions
+ */
+ public static List<WorkItemDefinition> getDynamicWorkItemDefintions(WorkFlowDefinition workFlowDefinition, WorkPageDefinition workPageDefinition, Object data) throws OseeCoreException {
+ List<WorkItemDefinition> dynamicDefinitions = new ArrayList<WorkItemDefinition>();
+ for (IWorkDefinitionProvider provider : WorkDefinitionProvider.getWorkDefinitionProviders()) {
+ dynamicDefinitions.addAll(provider.getDynamicWorkItemDefinitionsForPage(workFlowDefinition,
+ workPageDefinition, data));
+ }
+ return dynamicDefinitions;
+ }
+
+ public static List<WorkItemDefinition> getWorkItemDefinitions(Collection<String> pageids) throws OseeCoreException {
+ loadDefinitions();
+ List<WorkItemDefinition> defs = new ArrayList<WorkItemDefinition>();
+ for (String itemId : pageids) {
+ WorkItemDefinition def = getWorkItemDefinition(itemId);
+ if (def == null) throw new IllegalArgumentException("Item Id \"" + itemId + "\" is not a defined item");
+ defs.add(def);
+ }
+ return defs;
+ }
+
+ public static Collection<WorkItemDefinition> getWorkItemDefinitions() throws OseeCoreException {
+ loadDefinitions();
+ return itemIdToDefinition.values();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemWithChildrenDefinition.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemWithChildrenDefinition.java
new file mode 100644
index 00000000000..21b154bce8c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkItemWithChildrenDefinition.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+
+/**
+ * @author Donald G. Dunne
+ */
+public abstract class WorkItemWithChildrenDefinition extends WorkItemDefinition {
+
+ private final List<String> workItemIds = new ArrayList<String>();
+
+ public WorkItemWithChildrenDefinition(String itemName, String pageId, String parentId) {
+ super(itemName, pageId, parentId);
+ }
+
+ public WorkItemWithChildrenDefinition(Artifact artifact, String itemName, String pageName, String pageId, String parentId) throws OseeCoreException {
+ this(itemName, pageId, parentId);
+ for (Artifact art : artifact.getRelatedArtifacts(CoreRelationEnumeration.WorkItem__Child)) {
+ String widId = art.getSoleAttributeValue(WorkItemAttributes.WORK_ID.getAttributeTypeName(), (String) null);
+ workItemIds.add(widId);
+ }
+ }
+
+ public List<WorkItemDefinition> getWorkItems(boolean includeInherited) throws OseeCoreException {
+ List<WorkItemDefinition> wids = new ArrayList<WorkItemDefinition>();
+ getWorkItemsInherited(wids, includeInherited);
+ return wids;
+
+ }
+
+ @Override
+ public Artifact toArtifact(WriteType writeType) throws OseeCoreException {
+ Artifact art = super.toArtifact(writeType);
+ List<Artifact> children = new ArrayList<Artifact>();
+ for (WorkItemDefinition wid : getWorkItems(false)) {
+ Artifact widArt = WorkItemDefinitionFactory.getWorkItemDefinitionArtifact(wid.getId());
+ if (widArt == null) {
+ throw new IllegalStateException(
+ "While processing Work Item \"" + getId() + "\": No Artifact found for WorkItemDefinition \"" + wid.getId() + "\"");
+ }
+ children.add(widArt);
+ }
+ // This supports both relating new children and when WriteType.Overwrite of updating
+ art.setRelations(CoreRelationEnumeration.WorkItem__Child, children);
+ art.setRelationOrder(CoreRelationEnumeration.WorkItem__Child, children);
+ return art;
+ }
+
+ public void addWorkItem(String workItemDefintionId) {
+ workItemIds.add(workItemDefintionId);
+ }
+
+ public void removeWorkItem(String workItemDefintionId) {
+ workItemIds.remove(workItemDefintionId);
+ }
+
+ private void getWorkItemsInherited(List<WorkItemDefinition> workItemDefinitions, boolean includeInherited) throws OseeCoreException {
+ workItemDefinitions.addAll(WorkItemDefinitionFactory.getWorkItemDefinition(workItemIds));
+ if (includeInherited && getParentId() != null) {
+ WorkItemWithChildrenDefinition widParent =
+ (WorkPageDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(getParentId());
+ if (widParent != null) widParent.getWorkItemsInherited(workItemDefinitions, includeInherited);
+ }
+ }
+
+ public WorkItemDefinition getWorkItemDefinition(String id) throws OseeCoreException {
+ if (workItemIds.contains(id)) {
+ return WorkItemDefinitionFactory.getWorkItemDefinition(id);
+ }
+ return null;
+ }
+
+ /**
+ * @param workItems the workItems to set
+ */
+ public void setWorkItems(List<String> workItemDefintionIds) {
+ this.workItemIds.clear();
+ this.workItemIds.addAll(workItemDefintionIds);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPage.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPage.java
new file mode 100644
index 00000000000..44516e1d0da
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPage.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.framework.ui.skynet.widgets.workflow;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.plugin.util.Result;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkFlowDefinition.TransitionType;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * Instantiation of a workpagedefinition for a given workflow. This contains UI components that are specific to the
+ * instantiation.
+ *
+ * @author Donald G. Dunne
+ */
+public class WorkPage implements IDynamicWidgetLayoutListener {
+
+ protected DynamicXWidgetLayout dynamicXWidgetLayout;
+ protected final WorkPageDefinition workPageDefinition;
+ protected final WorkFlowDefinition workFlowDefinition;
+
+ /**
+ * @param instructionLines input lines of WorkAttribute declarations
+ */
+ public WorkPage(WorkFlowDefinition workFlowDefinition, WorkPageDefinition workPageDefinition, String xWidgetsXml, IXWidgetOptionResolver optionResolver) {
+ super();
+ this.workFlowDefinition = workFlowDefinition;
+ this.workPageDefinition = workPageDefinition;
+ dynamicXWidgetLayout = new DynamicXWidgetLayout(this, optionResolver);
+ try {
+ if (xWidgetsXml != null) processXmlLayoutDatas(xWidgetsXml);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, "Error processing attributes", ex);
+ }
+ }
+
+ public WorkPage(WorkFlowDefinition workFlowDefinition, WorkPageDefinition workPageDefinition, List<DynamicXWidgetLayoutData> datas, IXWidgetOptionResolver optionResolver) {
+ super();
+ this.workFlowDefinition = workFlowDefinition;
+ this.workPageDefinition = workPageDefinition;
+ dynamicXWidgetLayout = new DynamicXWidgetLayout(this, optionResolver);
+ dynamicXWidgetLayout.setLayoutDatas(datas);
+ }
+
+ public WorkPage(List<DynamicXWidgetLayoutData> datas, IXWidgetOptionResolver optionResolver) {
+ super();
+ this.workFlowDefinition = null;
+ this.workPageDefinition = null;
+ dynamicXWidgetLayout = new DynamicXWidgetLayout(this, optionResolver);
+ dynamicXWidgetLayout.setLayoutDatas(datas);
+ }
+
+ public WorkPage(String xWidgetsXml, IXWidgetOptionResolver optionResolver) {
+ this(null, null, xWidgetsXml, optionResolver);
+ }
+
+ public WorkPage(IXWidgetOptionResolver optionResolver) {
+ this(null, null, (String) null, optionResolver);
+ }
+
+ public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, WorkPage page, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, WorkPage page, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ public void createXWidgetLayoutData(DynamicXWidgetLayoutData workAttr, XWidget xWidget, FormToolkit toolkit, Artifact art, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#widgetCreated(org.eclipse.osee.framework.ui.skynet.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout,
+ * org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ public void widgetCreated(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ widgetCreated(xWidget, toolkit, art, this, xModListener, isEditable);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.IDynamicWidgetLayoutListener#widgetCreating(org.eclipse.osee.framework.ui.skynet.widgets.XWidget,
+ * org.eclipse.ui.forms.widgets.FormToolkit,
+ * org.eclipse.osee.framework.skynet.core.artifact.Artifact,
+ * org.eclipse.osee.framework.ui.skynet.widgets.workflow.DynamicXWidgetLayout,
+ * org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener, boolean)
+ */
+ public void widgetCreating(XWidget xWidget, FormToolkit toolkit, Artifact art, DynamicXWidgetLayout dynamicXWidgetLayout, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ widgetCreating(xWidget, toolkit, art, this, xModListener, isEditable);
+ }
+
+ public void dispose() {
+ for (DynamicXWidgetLayoutData layoutData : getlayoutDatas()) {
+ layoutData.getXWidget().dispose();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof WorkPage) return getId().equals(((WorkPage) obj).getId());
+ return false;
+ }
+
+ public DynamicXWidgetLayout createBody(IManagedForm managedForm, Composite parent, Artifact artifact, XModifiedListener xModListener, boolean isEditable) throws OseeCoreException {
+ dynamicXWidgetLayout.createBody(managedForm, parent, artifact, xModListener, isEditable);
+ return dynamicXWidgetLayout;
+ }
+
+ public Result isPageComplete() {
+ for (DynamicXWidgetLayoutData layoutData : dynamicXWidgetLayout.getLayoutDatas()) {
+ if (!layoutData.getXWidget().isValid().isOK()) {
+ // Check to see if widget is part of a completed OR or XOR group
+ if (!dynamicXWidgetLayout.isOrGroupFromAttrNameComplete(layoutData.getStorageName()) && !dynamicXWidgetLayout.isXOrGroupFromAttrNameComplete(layoutData.getStorageName())) {
+ return new Result(layoutData.getXWidget().isValid().getMessage());
+ }
+ }
+ }
+ return Result.TrueResult;
+ }
+
+ public String getHtml(String backgroundColor) {
+ return getHtml(backgroundColor, "", "");
+ }
+
+ public String getHtml(String backgroundColor, String preHtml, String postHtml) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(AHTML.startBorderTable(100, backgroundColor, getName()));
+ if (preHtml != null) {
+ sb.append(preHtml);
+ }
+ for (DynamicXWidgetLayoutData layoutData : dynamicXWidgetLayout.getLayoutDatas()) {
+ sb.append(layoutData.getXWidget().toHTML(AHTML.LABEL_FONT) + AHTML.newline());
+ }
+ if (postHtml != null) {
+ sb.append(postHtml);
+ }
+ sb.append(AHTML.endBorderTable());
+ return sb.toString();
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb =
+ new StringBuffer(
+ workPageDefinition.getPageName() + (workPageDefinition.getId() != null ? " (" + workPageDefinition.getId() + ") " : "") + "\n");
+ try {
+ for (WorkPageDefinition page : workFlowDefinition.getPageDefinitions(workPageDefinition.getId(),
+ TransitionType.ToPage)) {
+ sb.append("-> " + page.getPageName() + (workFlowDefinition.getPageDefinitions(workPageDefinition.getId(),
+ TransitionType.ToPageAsReturn).contains(
+ workFlowDefinition.getPageDefinitions(workPageDefinition.getId(), TransitionType.ToPage)) ? " (return)" : "") + "\n");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return sb.toString();
+ }
+
+ public Set<DynamicXWidgetLayoutData> getlayoutDatas() {
+ return dynamicXWidgetLayout.getLayoutDatas();
+ }
+
+ public void addLayoutDatas(List<DynamicXWidgetLayoutData> datas) {
+ dynamicXWidgetLayout.addWorkLayoutDatas(datas);
+ }
+
+ public DynamicXWidgetLayoutData getLayoutData(String layoutName) {
+ return dynamicXWidgetLayout.getLayoutData(layoutName);
+ }
+
+ public void processInstructions(Document doc) throws IOException, ParserConfigurationException, SAXException {
+ processLayoutDatas(doc.getDocumentElement());
+ }
+
+ protected void processXmlLayoutDatas(String xWidgetXml) throws IOException, ParserConfigurationException, SAXException {
+ dynamicXWidgetLayout.processlayoutDatas(xWidgetXml);
+ }
+
+ protected void processLayoutDatas(Element element) throws IOException, ParserConfigurationException, SAXException {
+ dynamicXWidgetLayout.processLayoutDatas(element);
+ }
+
+ public String getName() {
+ return workPageDefinition.getPageName();
+ }
+
+ public String getId() {
+ return workPageDefinition.id;
+ }
+
+ /**
+ * @return Returns the toPages.
+ */
+ public List<WorkPageDefinition> getToPages() throws OseeCoreException {
+ return workFlowDefinition.getToPages(workPageDefinition);
+ }
+
+ /**
+ * @return Returns the toPages.
+ */
+ public List<WorkPageDefinition> getReturnPages() throws OseeCoreException {
+ return workFlowDefinition.getReturnPages(workPageDefinition);
+ }
+
+ public boolean isReturnPage(WorkPageDefinition page) throws OseeCoreException {
+ return getReturnPages().contains(page);
+ }
+
+ /**
+ * @return Returns the defaultToPage.
+ */
+ public WorkPageDefinition getDefaultToPage() throws OseeCoreException {
+ return workFlowDefinition.getDefaultToPage(workPageDefinition);
+ }
+
+ /**
+ * @return the workPageDefinition
+ */
+ public WorkPageDefinition getWorkPageDefinition() {
+ return workPageDefinition;
+ }
+
+ /**
+ * @return the workFlowDefinition
+ */
+ public WorkFlowDefinition getWorkFlowDefinition() {
+ return workFlowDefinition;
+ }
+
+ /**
+ * @return the dynamicXWidgetLayout
+ */
+ public DynamicXWidgetLayout getDynamicXWidgetLayout() {
+ return dynamicXWidgetLayout;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageButton.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageButton.java
new file mode 100644
index 00000000000..a376512710a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageButton.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.framework.ui.skynet.widgets.workflow;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkPageButton {
+
+ private String name = "Unknown";
+ private String attrName = "";
+ private boolean required = false;
+ private String xWidget = "Unknown";
+
+ /**
+ * <Name[:Attribute Name]>,<(Required|Optional)>,<XWidget> eg: Title:Name,Required,XText eg:
+ * Description,Optional,XText
+ */
+ public WorkPageButton(String xml) {
+ super();
+ String values[] = xml.split(",");
+ name = values[0];
+ if (name.contains(":")) {
+ String names[] = name.split(":");
+ name = names[0];
+ attrName = names[1];
+ } else
+ attrName = name;
+ required = (values[1].equals("Required") ? true : false);
+ xWidget = values[2];
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the attrName.
+ */
+ public String getAttrName() {
+ return attrName;
+ }
+
+ /**
+ * @param attrName The attrName to set.
+ */
+ public void setAttrName(String attrName) {
+ this.attrName = attrName;
+ }
+
+ /**
+ * @return Returns the required.
+ */
+ public boolean isRequired() {
+ return required;
+ }
+
+ /**
+ * @param required The required to set.
+ */
+ public void setRequired(boolean required) {
+ this.required = required;
+ }
+
+ /**
+ * @return Returns the xWidget.
+ */
+ public String getXWidget() {
+ return xWidget;
+ }
+
+ /**
+ * @param widget The xWidget to set.
+ */
+ public void setXWidget(String widget) {
+ xWidget = widget;
+ }
+
+ /**
+ * @param name The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinition.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinition.java
new file mode 100644
index 00000000000..6d0cf15b753
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinition.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkPageDefinition extends WorkItemWithChildrenDefinition {
+
+ public static String ARTIFACT_NAME = "Work Page Definition";
+ private String pageName;
+
+ public WorkPageDefinition(String pageName, String pageId, String parentId) {
+ this(pageId, pageName, pageId, parentId);
+ }
+
+ public WorkPageDefinition(String itemName, String pageName, String pageId, String parentId) {
+ super(itemName, pageId, parentId);
+ this.pageName = pageName;
+ }
+
+ public WorkPageDefinition(Artifact artifact) throws OseeCoreException {
+ super(artifact, artifact.getDescriptiveName(), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(), (String) null), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_ID.getAttributeTypeName(), (String) null), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_PARENT_ID.getAttributeTypeName(), (String) null));
+ setType(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_TYPE.getAttributeTypeName(), (String) null));
+ loadWorkDataKeyValueMap(artifact);
+ setPageName(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(),
+ (String) null));
+
+ }
+
+ public boolean hasWorkRule(String ruleId) throws OseeCoreException {
+ return getWorkItemDefinition(ruleId) != null;
+ }
+
+ /**
+ * Returns work flow definition with the assumption that WorkFlowDefinition workId = pageWorkId minus pageName
+ *
+ * @return WorkFlowDefinition
+ * @throws OseeCoreException
+ */
+ public WorkFlowDefinition getWorkFlowDefinitionById() throws OseeCoreException {
+ String id = getId().replace("." + pageName, "");
+ WorkItemDefinition workItemDefinition = WorkItemDefinitionFactory.getWorkItemDefinition(id);
+ if (workItemDefinition instanceof WorkFlowDefinition) {
+ return (WorkFlowDefinition) WorkItemDefinitionFactory.getWorkItemDefinition(id);
+ }
+ return null;
+ }
+
+ @Override
+ public Artifact toArtifact(WriteType writeType) throws OseeCoreException {
+ Artifact art = super.toArtifact(writeType);
+ // Only store start page if it's part of this definition
+ if (pageName != null) {
+ art.setSoleAttributeFromString(WorkItemAttributes.WORK_PAGE_NAME.getAttributeTypeName(), pageName);
+ }
+ return art;
+ }
+
+ /**
+ * @return the workItems
+ * @throws OseeCoreException
+ */
+
+ public List<WorkItemDefinition> getWorkItemDefinitionsByType(String workType) throws OseeCoreException {
+ List<WorkItemDefinition> wids = new ArrayList<WorkItemDefinition>();
+ for (WorkItemDefinition workItemDefinition : getWorkItems(true)) {
+ if (workItemDefinition.getType() != null && workItemDefinition.getType().equals(workType)) {
+ wids.add(workItemDefinition);
+ }
+ }
+ return wids;
+ }
+
+ public boolean isCompletePage() {
+ return getPageName().equals("Completed");
+ }
+
+ public boolean isCancelledPage() {
+ return getPageName().equals("Cancelled");
+ }
+
+ public boolean isInstanceof(String workPageDefinitionId) throws OseeCoreException {
+ return isInstanceofRecurse(this, workPageDefinitionId);
+ }
+
+ private boolean isInstanceofRecurse(WorkPageDefinition workPageDefinition, String workPageDefinitionId) throws OseeCoreException {
+ if (workPageDefinition.getId().equals(workPageDefinitionId)) return true;
+ if (workPageDefinition.getParent() != null) {
+ return isInstanceofRecurse((WorkPageDefinition) workPageDefinition.getParent(), workPageDefinitionId);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition#getArtifactTypeName()
+ */
+ @Override
+ public String getArtifactTypeName() {
+ return ARTIFACT_NAME;
+ }
+
+ public String getPageName() {
+ return pageName;
+ }
+
+ public void setPageName(String pageName) {
+ this.pageName = pageName;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionLabelProvider.java
new file mode 100644
index 00000000000..8696f29259a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionLabelProvider.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.framework.ui.skynet.widgets.workflow;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkPageDefinitionLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object arg0) {
+ return null;
+ }
+
+ public String getText(Object arg0) {
+ return ((WorkPageDefinition) arg0).getPageName();
+ }
+
+ public void addListener(ILabelProviderListener arg0) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener arg0) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionViewSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionViewSorter.java
new file mode 100644
index 00000000000..b05d6751836
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageDefinitionViewSorter.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.skynet.widgets.workflow;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkPageDefinitionViewSorter extends ViewerSorter {
+
+ public WorkPageDefinitionViewSorter() {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return getComparator().compare(((WorkPageDefinition) e1).getPageName(), ((WorkPageDefinition) e2).getPageName());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageSection.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageSection.java
new file mode 100644
index 00000000000..97b0d47411a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkPageSection.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.framework.ui.skynet.widgets.workflow;
+
+import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
+import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkPageSection extends SectionPart {
+
+ public WorkPageSection(Composite parent, XFormToolkit toolkit, int style, WorkPage page) throws Exception {
+ super(parent, toolkit, style);
+ createPage(parent, page, toolkit);
+ }
+
+ private Section createPage(Composite comp, WorkPage page, XFormToolkit toolkit) throws Exception {
+ Section section = toolkit.createSection(comp, Section.TWISTIE | Section.TITLE_BAR);
+ section.setText(page.getName());
+ section.setExpanded(true);
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite mainComp = toolkit.createClientContainer(section, 1);
+ mainComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ createWorkArea(mainComp, page, toolkit);
+ return section;
+ }
+
+ private void createWorkArea(Composite comp, WorkPage page, XFormToolkit toolkit) throws Exception {
+ Composite workComp = toolkit.createContainer(comp, 1);
+ workComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ page.createBody(getManagedForm(), workComp, null, xModListener, true);
+ }
+
+ final XModifiedListener xModListener = new XModifiedListener() {
+ public void widgetModified(XWidget widget) {
+ System.out.println("Widget changed");
+ }
+ };
+
+ @Override
+ public void refresh() {
+ super.refresh();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkRuleDefinition.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkRuleDefinition.java
new file mode 100644
index 00000000000..26a7cfa2b4e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkRuleDefinition.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.framework.ui.skynet.widgets.workflow;
+
+import java.util.Map;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkRuleDefinition extends WorkItemDefinition {
+
+ public static String ARTIFACT_NAME = "Work Rule Definition";
+
+ /**
+ * Instantiate rule with no value where name and id are same.
+ *
+ * @param name
+ * @param id
+ */
+ public WorkRuleDefinition(String id) {
+ this(id, id, null, null);
+ }
+
+ /**
+ * Instantiate rule with no value. This is for self describing rules such as atsAllowCommit.
+ *
+ * @param name
+ * @param id
+ */
+ public WorkRuleDefinition(String name, String id) {
+ this(name, id, null, null);
+ }
+
+ public WorkRuleDefinition(String name, String id, Map<String, String> workDataKeyValueMap, String type) {
+ super(name, id, null, type);
+ if (workDataKeyValueMap != null) {
+ setWorkDataKeyValueMap(workDataKeyValueMap);
+ }
+ }
+
+ public WorkRuleDefinition(Artifact artifact) throws OseeCoreException {
+ this(artifact.getDescriptiveName(), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_ID.getAttributeTypeName(), ""), null, null);
+ setDescription(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_DESCRIPTION.getAttributeTypeName(), ""));
+ setType(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_TYPE.getAttributeTypeName(), (String) null));
+ loadWorkDataKeyValueMap(artifact);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition#toArtifact()
+ */
+ @Override
+ public Artifact toArtifact(WriteType writeType) throws OseeCoreException {
+ Artifact ruleArt = super.toArtifact(writeType);
+ return ruleArt;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition#getArtifactTypeName()
+ */
+ @Override
+ public String getArtifactTypeName() {
+ return ARTIFACT_NAME;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkWidgetDefinition.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkWidgetDefinition.java
new file mode 100644
index 00000000000..2afa729fa93
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/WorkWidgetDefinition.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.framework.ui.skynet.widgets.workflow;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.XWidgetParser;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class WorkWidgetDefinition extends WorkItemDefinition {
+
+ public static String ARTIFACT_NAME = "Work Widget Definition";
+ public static String tagName = DynamicXWidgetLayout.XWIDGET;
+ private DynamicXWidgetLayoutData widgetLayoutData;
+
+ public WorkWidgetDefinition(String name, String id) {
+ super(name, id, null);
+ }
+
+ public WorkWidgetDefinition(DynamicXWidgetLayoutData xWidgetLayoutData) {
+ super(xWidgetLayoutData.getName() + " - " + xWidgetLayoutData.getId(), xWidgetLayoutData.getId(), null);
+ setXWidgetLayoutData(xWidgetLayoutData);
+ }
+
+ public void setXWidgetLayoutData(DynamicXWidgetLayoutData xWidgetLayoutData) {
+ widgetLayoutData = xWidgetLayoutData;
+ }
+
+ public WorkWidgetDefinition(Artifact artifact) throws OseeCoreException {
+ this(artifact.getDescriptiveName(), artifact.getSoleAttributeValue(
+ WorkItemAttributes.WORK_ID.getAttributeTypeName(), artifact.getDescriptiveName()));
+ setType(artifact.getSoleAttributeValue(WorkItemAttributes.WORK_TYPE.getAttributeTypeName(), (String) null));
+ loadWorkDataKeyValueMap(artifact);
+
+ DynamicXWidgetLayoutData data = getFromXml(getWorkDataValue(tagName));
+ setXWidgetLayoutData(data);
+ }
+
+ @Override
+ public Artifact toArtifact(WriteType writeType) throws OseeCoreException {
+ Artifact art = super.toArtifact(writeType);
+ try {
+ art.setSoleAttributeFromString(WorkItemAttributes.WORK_DATA.getAttributeTypeName(),
+ tagName + "=" + XWidgetParser.toXml(get()));
+ } catch (ParserConfigurationException ex) {
+ throw new OseeCoreException(ex);
+ } catch (TransformerException ex) {
+ throw new OseeCoreException(ex);
+ }
+
+ return art;
+ }
+
+ public DynamicXWidgetLayoutData get() {
+ // Hand out an modifiable copy of the LayoutData to ensure widgets created off it aren't shared
+ try {
+ return (DynamicXWidgetLayoutData) widgetLayoutData.clone();
+ } catch (CloneNotSupportedException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ public void set(DynamicXWidgetLayoutData xWidgetLayoutData) {
+ setXWidgetLayoutData(xWidgetLayoutData);
+ }
+
+ public static boolean isWorkItemXWidget(String xml) {
+ return xml.contains(tagName);
+ }
+
+ public String toXml() {
+ throw new IllegalStateException("WorkItemXWidgetDefinition.toXml() Not implemented.");
+ }
+
+ /**
+ * Create WorkItemXWidgetDefinition from xml
+ *
+ * @param xml <XWidget displayName="Problem" storageName="ats.Problem" xwidgetType="XTextDam" fill="Vertically"/>
+ * @return WorkWidgetDefinition
+ * @throws Exception
+ */
+ public static WorkWidgetDefinition createFromXml(String xml) throws OseeCoreException {
+ DynamicXWidgetLayoutData data = getFromXml(xml);
+ return new WorkWidgetDefinition(data);
+ }
+
+ public static DynamicXWidgetLayoutData getFromXml(String xml) throws OseeCoreException {
+ try {
+ DynamicXWidgetLayoutData data = XWidgetParser.extractlayoutData(null, xml);
+ if (data == null) throw new IllegalArgumentException(
+ "Unable to create WorkItemXWidgetDefinition from xml\"" + xml + "\"");
+ return data;
+ } catch (ParserConfigurationException ex) {
+ throw new OseeCoreException(ex);
+ } catch (IOException ex) {
+ throw new OseeCoreException(ex);
+ } catch (SAXException ex) {
+ throw new OseeCoreException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.workflow.WorkItemDefinition#getArtifactTypeName()
+ */
+ @Override
+ public String getArtifactTypeName() {
+ return ARTIFACT_NAME;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/XWidgetFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/XWidgetFactory.java
new file mode 100644
index 00000000000..be73d96142b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/workflow/XWidgetFactory.java
@@ -0,0 +1,335 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.workflow;
+
+import java.util.Arrays;
+import java.util.HashSet;
+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.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.SkynetSpellModifyDictionary;
+import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactList;
+import org.eclipse.osee.framework.ui.skynet.widgets.XArtifactTypeListViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XAttributeTypeListViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XButton;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBoxDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboBooleanDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XComboViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDate;
+import org.eclipse.osee.framework.ui.skynet.widgets.XDateDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFileTextWithSelectionDialog;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFloat;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFloatDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlabelMemberSelDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XInteger;
+import org.eclipse.osee.framework.ui.skynet.widgets.XIntegerDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XLabel;
+import org.eclipse.osee.framework.ui.skynet.widgets.XLabelDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XList;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XMembersCombo;
+import org.eclipse.osee.framework.ui.skynet.widgets.XMembersList;
+import org.eclipse.osee.framework.ui.skynet.widgets.XMultiXWidgetTextDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromMultiChoiceBranch;
+import org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromMultiChoiceDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XStackedDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XText;
+import org.eclipse.osee.framework.ui.skynet.widgets.XTextDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XTextResourceDropDam;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XFileTextWithSelectionDialog.Type;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XWidgetFactory {
+
+ private static final XWidgetFactory reference = new XWidgetFactory();
+
+ private XWidgetFactory() {
+
+ }
+
+ public static XWidgetFactory getInstance() {
+ return reference;
+ }
+
+ public XWidget createXWidget(DynamicXWidgetLayoutData xWidgetLayoutData) {
+ return createXWidget(xWidgetLayoutData.getXWidgetName(), xWidgetLayoutData.getName(), xWidgetLayoutData);
+ }
+
+ public XWidget createXWidget(String xWidgetName, String name, DynamicXWidgetLayoutData xWidgetLayoutData) {
+ XWidget xWidget = null;
+
+ // Look for widget provider to create widget
+ for (IXWidgetProvider widgetProvider : getXWidgetProviders()) {
+ xWidget = widgetProvider.createXWidget(xWidgetName, name, xWidgetLayoutData);
+ if (xWidget != null) {
+ return xWidget;
+ }
+ }
+
+ // Otherwise, use default widget creation
+ if (xWidgetName.equals("XText")) {
+ xWidget = new XText(name);
+ if (xWidgetLayoutData.getDefaultValue() != null && !xWidgetLayoutData.getDefaultValue().equals("")) {
+ ((XText) xWidget).set(xWidgetLayoutData.getDefaultValue());
+ }
+ } else if (xWidgetName.equals("XMultiXWidgetTextDam")) {
+ xWidget = new XMultiXWidgetTextDam(name);
+ } else if (xWidgetName.equals("XSelectFromMultiChoiceBranch")) {
+ XSelectFromMultiChoiceBranch multiBranchSelect = new XSelectFromMultiChoiceBranch(name);
+ int maxSelectionRequired = 1;
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.MULTI_SELECT)) {
+ maxSelectionRequired = Integer.MAX_VALUE;
+ }
+ try {
+ multiBranchSelect.setSelectableItems(BranchManager.getNormalAllBranches());
+ multiBranchSelect.setRequiredSelection(1, maxSelectionRequired);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ multiBranchSelect.setRequiredEntry(true);
+ xWidget = multiBranchSelect;
+ } else if (xWidgetName.equals("XInteger")) {
+ xWidget = new XInteger(name);
+ } else if (xWidgetName.equals("XTextDam")) {
+ xWidget = new XTextDam(name);
+ } else if (xWidgetName.equals("XButton")) {
+ xWidget = new XButton(name);
+ } else if (xWidgetName.equals("XLabelDam")) {
+ xWidget = new XLabelDam(name);
+ } else if (xWidgetName.equals("XMembersList")) {
+ try {
+ xWidget = new XMembersList(name);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (xWidgetName.equals("XMembersCombo")) {
+ xWidget = new XMembersCombo(name);
+ } else if (xWidgetName.equals("XDate")) {
+ xWidget = new XDate(name);
+ } else if (xWidgetName.equals("XMultiXWidgetTextDam")) {
+ xWidget = new XMultiXWidgetTextDam(name);
+ } else if (xWidgetName.equals("XFileSelectionDialog")) {
+ xWidget = new XFileTextWithSelectionDialog(name);
+ } else if (xWidgetName.equals("XDirectorySelectionDialog")) {
+ xWidget = new XFileTextWithSelectionDialog(name, Type.Directory);
+ } else if (xWidgetName.equals("XDateDam")) {
+ xWidget = new XDateDam(name);
+ } else if (xWidgetName.equals("XTextResourceDropDam")) {
+ xWidget = new XTextResourceDropDam(name);
+ } else if (xWidgetName.equals("XFloat")) {
+ xWidget = new XFloat(name);
+ } else if (xWidgetName.equals("XFloatDam")) {
+ xWidget = new XFloatDam(name);
+ } else if (xWidgetName.equals("XIntegerDam")) {
+ xWidget = new XIntegerDam(name);
+ } else if (xWidgetName.equals("XFileTextWithSelectionDialog")) {
+ xWidget = new XFileTextWithSelectionDialog(name);
+ } else if (xWidgetName.equals("XLabel")) {
+ String defaultValue = xWidgetLayoutData.getDefaultValue();
+ if (Strings.isValid(defaultValue)) {
+ xWidget = new XLabel(name, xWidgetLayoutData.getDefaultValue());
+ } else {
+ xWidget = new XLabel(name);
+ }
+ } else if (xWidgetName.equals("XCheckBox")) {
+ XCheckBox checkBox = new XCheckBox(name);
+ checkBox.setLabelAfter(xWidgetLayoutData.getXOptionHandler().contains(XOption.LABEL_AFTER));
+ if (xWidgetLayoutData.getDefaultValue() != null && !xWidgetLayoutData.getDefaultValue().equals("")) checkBox.set(xWidgetLayoutData.getDefaultValue().equals(
+ "true"));
+ xWidget = checkBox;
+ } else if (xWidgetName.equals("XCheckBoxDam")) {
+ XCheckBoxDam checkBox = new XCheckBoxDam(name);
+ checkBox.setLabelAfter(xWidgetLayoutData.getXOptionHandler().contains(XOption.LABEL_AFTER));
+ xWidget = checkBox;
+ } else if (xWidgetName.startsWith("XComboDam")) {
+ if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
+ String values[] =
+ xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
+ if (values.length > 0) {
+ xWidget = new XComboDam(name);
+ XComboDam combo = new XComboDam(name);
+ combo.setDataStrings(values);
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_DEFAULT_VALUE)) {
+ combo.setDefaultSelectionAllowed(false);
+ }
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.ADD_DEFAULT_VALUE)) {
+ combo.setDefaultSelectionAllowed(true);
+ }
+ xWidget = combo;
+ } else
+ throw new IllegalArgumentException(
+ "Invalid XComboDam. " + "Must be \"XComboDam(option1,option2,option3)\"");
+ }
+ } else if (xWidgetName.startsWith("XSelectFromMultiChoiceDam")) {
+ if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
+ String values[] =
+ xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
+ if (values.length > 0) {
+ XSelectFromMultiChoiceDam widget = new XSelectFromMultiChoiceDam(name);
+ widget.setSelectableItems(Arrays.asList(values));
+ xWidget = widget;
+ } else {
+ throw new IllegalArgumentException(
+ "Invalid XSelectFromMultiChoiceDam. " + "Must be \"XSelectFromMultiChoiceDam(option1,option2,option3)\"");
+ }
+ }
+ } else if (xWidgetName.startsWith("XStackedDam")) {
+ xWidget = new XStackedDam(name);
+ } else if (xWidgetName.startsWith("XComboBooleanDam")) {
+ xWidget = new XComboBooleanDam(name);
+ XComboBooleanDam combo = new XComboBooleanDam(name);
+ combo.setDataStrings(BooleanAttribute.booleanChoices);
+ xWidget = combo;
+ if (xWidgetLayoutData.getDefaultValue() != null && !xWidgetLayoutData.getDefaultValue().equals("")) {
+ String value = xWidgetLayoutData.getDefaultValue();
+ if (value == null)
+ combo.set("");
+ else if (value.equals("true") || value.equals("yes"))
+ combo.set("yes");
+ else if (value.equals("false") || value.equals("no"))
+ combo.set("no");
+ else
+ combo.set("");
+ }
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_DEFAULT_VALUE)) {
+ combo.setDefaultSelectionAllowed(false);
+ }
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.ADD_DEFAULT_VALUE)) {
+ combo.setDefaultSelectionAllowed(true);
+ }
+ } else if (xWidgetName.startsWith("XComboViewer")) {
+ xWidget = new XComboViewer(name);
+ } else if (xWidgetName.startsWith("XCombo")) {
+ String values[] =
+ xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
+ if (values.length > 0) {
+ XCombo combo = new XCombo(name);
+ combo.setDataStrings(values);
+
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_DEFAULT_VALUE)) {
+ combo.setDefaultSelectionAllowed(false);
+ }
+ if (xWidgetLayoutData.getXOptionHandler().contains(XOption.ADD_DEFAULT_VALUE)) {
+ combo.setDefaultSelectionAllowed(true);
+ }
+ xWidget = combo;
+ } else
+ throw new IllegalArgumentException("Invalid XCombo. " + "Must be \"XCombo(option1,option2,option3)\"");
+ } else if (xWidgetName.startsWith("XListDam")) {
+ if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
+ String values[] =
+ xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
+ if (values.length > 0) {
+ XListDam list = new XListDam(name);
+ list.add(values);
+ xWidget = list;
+ } else
+ throw new IllegalArgumentException("Invalid XList. " + "Must be \"XList(option1,option2,option3)\"");
+ }
+ } else if (xWidgetName.equals("XHyperlabelMemberSelDam")) {
+ xWidget = new XHyperlabelMemberSelDam(name);
+ } else if (xWidgetName.startsWith("XListDropViewer")) {
+ xWidget = new XListDropViewer(name);
+ } else if (xWidgetName.equals("XArtifactTypeListViewer")) {
+ xWidget =
+ new XArtifactTypeListViewer(xWidgetLayoutData.getKeyedBranchName(), xWidgetLayoutData.getDefaultValue());
+ ((XArtifactTypeListViewer) xWidget).setMultiSelect(xWidgetLayoutData.getXOptionHandler().contains(
+ XOption.MULTI_SELECT));
+ } else if (xWidgetName.equals("XAttributeTypeListViewer")) {
+ xWidget =
+ new XAttributeTypeListViewer(xWidgetLayoutData.getKeyedBranchName(), xWidgetLayoutData.getDefaultValue());
+ ((XAttributeTypeListViewer) xWidget).setMultiSelect(xWidgetLayoutData.getXOptionHandler().contains(
+ XOption.MULTI_SELECT));
+
+ } else if (xWidgetName.startsWith("XList")) {
+ String values[] =
+ xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
+ if (values.length > 0) {
+ XList list = new XList(name);
+ list.add(values);
+ xWidget = list;
+ String defaultValue = xWidgetLayoutData.getDefaultValue();
+ if (Strings.isValid(defaultValue)) list.setSelected(Arrays.asList(defaultValue.split(",")));
+ } else
+ throw new IllegalArgumentException("Invalid XList. " + "Must be \"XList(option1,option2,option3)\"");
+ } else if (xWidgetName.startsWith("XArtifactList")) {
+ XArtifactList artifactList = new XArtifactList(name);
+ artifactList.setMultiSelect(xWidgetLayoutData.getXOptionHandler().contains(XOption.MULTI_SELECT));
+ xWidget = artifactList;
+ } else {
+ xWidget = new XLabel("Error: Unhandled XWidget \"" + xWidgetName + "\"");
+ }
+
+ if (xWidget instanceof XText) {
+ ((XText) xWidget).addXTextSpellModifyDictionary(new SkynetSpellModifyDictionary());
+ }
+
+ if (xWidget != null && xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_LABEL)) {
+ xWidget.setDisplayLabel(false);
+ }
+ return xWidget;
+ }
+ private static Set<IXWidgetProvider> widgetProviders;
+
+ private static Set<IXWidgetProvider> getXWidgetProviders() {
+ widgetProviders = new HashSet<IXWidgetProvider>();
+ IExtensionPoint point =
+ Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.osee.framework.ui.skynet.XWidgetProvider");
+ if (point == null) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, "Can't access XWidgetProvider extension point");
+ return null;
+ }
+ IExtension[] extensions = point.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ String classname = null;
+ String bundleName = null;
+ for (IConfigurationElement el : elements) {
+ if (el.getName().equals("XWidgetProvider")) {
+ classname = el.getAttribute("classname");
+ bundleName = el.getContributor().getName();
+ if (classname != null && bundleName != null) {
+ Bundle bundle = Platform.getBundle(bundleName);
+ try {
+ Class<?> taskClass = bundle.loadClass(classname);
+ Object obj = taskClass.newInstance();
+ widgetProviders.add((IXWidgetProvider) obj);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP,
+ "Error loading XWidgetProvider extension", ex);
+ }
+ }
+
+ }
+ }
+ }
+ return widgetProviders;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchOptions.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchOptions.java
new file mode 100644
index 00000000000..f757b88b8d2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchOptions.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.framework.ui.skynet.widgets.xBranch;
+
+/**
+ * @author Jeff C. Phillips
+ *
+ */
+public enum BranchOptions {
+ FLAT, FAVORITES_FIRST, SHOW_MERGE_BRANCHES, SHOW_TRANSACTIONS, SHOW_ARCHIVED, SHOW_WORKING_BRANCHES_ONLY
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchView.java
new file mode 100644
index 00000000000..c83ef9f896c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchView.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.framework.ui.skynet.widgets.xBranch;
+
+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.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Displays persisted changes made to an artifact.
+ *
+ * @author Jeff C. Phillips
+ */
+public class BranchView extends ViewPart implements IActionable, IBranchEventListener, ITransactionsDeletedEventListener {
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.widgets.xBranch.BranchView";
+ private BranchViewPresentationPreferences branchViewPresentationPreferences;
+ private static String HELP_CONTEXT_ID = "BranchView";
+ public static final String BRANCH_ID = "branchId";
+ private XBranchWidget xBranchWidget;
+
+ public BranchView() {
+ super();
+
+ OseeEventManager.addListener(this);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ branchViewPresentationPreferences.setDisposed(true);
+ OseeEventManager.removeListener(this);
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ setPartName("Branch Manager");
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ xBranchWidget = new XBranchWidget();
+ xBranchWidget.setDisplayLabel(false);
+ xBranchWidget.createWidgets(parent, 1);
+
+ branchViewPresentationPreferences = new BranchViewPresentationPreferences(this);
+ xBranchWidget.loadData();
+
+ MenuManager menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ MenuManager menuManager = (MenuManager) manager;
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ });
+
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ xBranchWidget.getXViewer().getTree().setMenu(menuManager.createContextMenu(xBranchWidget.getXViewer().getTree()));
+ getSite().registerContextMenu(VIEW_ID, menuManager, xBranchWidget.getXViewer());
+
+ getSite().setSelectionProvider(xBranchWidget.getXViewer());
+ SkynetGuiPlugin.getInstance().setHelp(parent, HELP_CONTEXT_ID);
+ OseeContributionItem.addTo(this, true);
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ /**
+ * Reveal a branch in the viewer and select it.
+ */
+ public static void revealBranch(Branch branch) {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ BranchView branchView;
+ try {
+ branchView = (BranchView) page.showView(VIEW_ID);
+ branchView.reveal(branch);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * @param branch
+ */
+ private void reveal(Branch branch) {
+ xBranchWidget.reveal(branch);
+ }
+
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, final int branchId) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ xBranchWidget.refresh();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener#handleTransactionsDeletedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, int[])
+ */
+ @Override
+ public void handleTransactionsDeletedEvent(Sender sender, int[] transactionIds) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ xBranchWidget.refresh();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ }
+
+ public void changeBranchPresentation(boolean flat) {
+ if (branchViewPresentationPreferences != null) {
+ branchViewPresentationPreferences.getViewPreference().putBoolean(BranchViewPresentationPreferences.FLAT_KEY,
+ flat);
+ }
+ }
+
+ public void changeTransactionPresentation(boolean showTransactions) {
+ if (branchViewPresentationPreferences != null) {
+ branchViewPresentationPreferences.getViewPreference().putBoolean(
+ BranchViewPresentationPreferences.SHOW_TRANSACTIONS, showTransactions);
+ }
+ }
+
+ public void changeMergeBranchPresentation(boolean showMergeBranches) {
+ if (branchViewPresentationPreferences != null) {
+ branchViewPresentationPreferences.getViewPreference().putBoolean(
+ BranchViewPresentationPreferences.SHOW_MERGE_BRANCHES, showMergeBranches);
+ }
+ }
+
+ public void changeArchivedBranchPresentation(boolean showArchivedBranches) {
+ if (branchViewPresentationPreferences != null) {
+ branchViewPresentationPreferences.getViewPreference().putBoolean(
+ BranchViewPresentationPreferences.SHOW_ARCHIVED_BRANCHES, showArchivedBranches);
+ }
+ }
+
+ public void changeFavoritesFirstPresentation(boolean showArchivedBranches) {
+ if (branchViewPresentationPreferences != null) {
+ branchViewPresentationPreferences.getViewPreference().putBoolean(
+ BranchViewPresentationPreferences.FAVORITE_KEY, showArchivedBranches);
+ }
+ }
+
+ /**
+ * This method is called by BranchViewPresentationPreferences to change the branch view data presentation. Not part
+ * of the regular API.
+ */
+ protected void setPresentation(boolean flat) {
+ xBranchWidget.setPresentation(flat);
+ }
+
+ /**
+ * This method is called by BranchViewPresentationPreferences to change the branch view data presentation. Not part
+ * of the regular API.
+ */
+ protected void setFavoritesFirst(boolean favoritesFirst) {
+ xBranchWidget.setFavoritesFirst(favoritesFirst);
+ }
+
+ /**
+ * This method is called by BranchViewPresentationPreferences to change the branch view data presentation. Not part
+ * of the regular API.
+ */
+ protected void setShowMergeBranches(boolean showMergeBranches) {
+ xBranchWidget.setShowMergeBranches(showMergeBranches);
+ }
+
+ /**
+ * This method is called by BranchViewPresentationPreferences to change the branch view data presentation. Not part
+ * of the regular API.
+ */
+ protected void setShowTransactions(boolean showTransactions) {
+ xBranchWidget.setShowTransactions(showTransactions);
+ }
+
+ /**
+ * This method is called by BranchViewPresentationPreferences to change the branch view data presentation. Not part
+ * of the regular API.
+ */
+ protected void setShowArchivedBranches(boolean showArchivedBranches) {
+ xBranchWidget.setShowArchivedBranches(showArchivedBranches);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewImageHandler.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewImageHandler.java
new file mode 100644
index 00000000000..67d1182572e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewImageHandler.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.framework.ui.skynet.widgets.xBranch;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class BranchViewImageHandler {
+ private static Image favoriteBranchImage = null;
+ private static Image favoriteChangeManagedBranchImage = null;
+ private static int X_LOCATION = 0;
+ private static int Y_LOCATION = 7;
+
+ public static Image getImage(Object element, int columnIndex) {
+ Image returnImage = null;
+
+ //lazy loading of images
+ checkImages();
+ // Seek down through aggregation lists to the lowest level to get an actual element
+ while (element instanceof List && !((List<?>) element).isEmpty()) {
+ element = ((List<?>) element).get(0);
+ }
+
+ if (element instanceof Branch && columnIndex == 0) {
+ try {
+ checkImages();
+ Branch branch = (Branch) element;
+ boolean favorite = UserManager.getUser().isFavoriteBranch(branch);
+ boolean isChangeManaged = branch.isChangeManaged();
+ boolean isSystemBranch = branch.isSystemRootBranch();
+
+ if (isSystemBranch) {
+ return ImageManager.getImage(FrameworkImage.BRANCH_SYSTEM_ROOT);
+ } else {
+ if (favorite && isChangeManaged) {
+ returnImage = favoriteChangeManagedBranchImage;
+ } else if (favorite) {
+ returnImage = favoriteBranchImage;
+ } else if (isChangeManaged) {
+ return ImageManager.getImage(FrameworkImage.BRANCH_CHANGE_MANAGED);
+ } else {
+ returnImage = ImageManager.getImage(FrameworkImage.BRANCH);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ } else if (element instanceof TransactionId && columnIndex == 0) {
+ returnImage = ImageManager.getImage(FrameworkImage.DB_ICON_BLUE);
+
+ }
+ return returnImage;
+ }
+
+ private static synchronized void checkImages() {
+ if (favoriteBranchImage == null) {
+ favoriteBranchImage =
+ new OverlayImage(ImageManager.getImage(FrameworkImage.BRANCH),
+ ImageManager.getImageDescriptor(FrameworkImage.BRANCH_FAVORITE_OVERLAY), X_LOCATION, Y_LOCATION).createImage();
+ favoriteChangeManagedBranchImage =
+ new OverlayImage(ImageManager.getImage(FrameworkImage.BRANCH_CHANGE_MANAGED),
+ ImageManager.getImageDescriptor(FrameworkImage.BRANCH_FAVORITE_OVERLAY), X_LOCATION, Y_LOCATION).createImage();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewPresentationPreferences.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewPresentationPreferences.java
new file mode 100644
index 00000000000..7a87fad27eb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchViewPresentationPreferences.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.framework.ui.skynet.widgets.xBranch;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.FlatPresentationHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.HierarchicalPresentationHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowArchivedBranchHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowFavoriteBranchesFirstHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowMergeBranchPresentationHandler;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.branch.ShowTransactionPresentationHandler;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class BranchViewPresentationPreferences {
+ public static final String FAVORITE_KEY = "favorites_first";
+ public static final String SHOW_TRANSACTIONS = "show_transactions";
+ public static final String SHOW_MERGE_BRANCHES = "show_merge_branches";
+ public static final String SHOW_ARCHIVED_BRANCHES = "show_archived_branches";
+ public static final String FLAT_KEY = "flat";
+ public static final String BRANCH_ID = "branchId";
+
+ private final IPreferencesService preferencesService;
+ private IPreferenceChangeListener preferenceChangeListener;
+ private BranchView branchView;
+ private boolean disposed;
+
+ public BranchViewPresentationPreferences(BranchView branchView) {
+ this.preferencesService = Platform.getPreferencesService();
+ this.preferenceChangeListener = null;
+ this.branchView = branchView;
+ this.disposed = false;
+
+ IEclipsePreferences instanceNode =
+ (IEclipsePreferences) preferencesService.getRootNode().node(InstanceScope.SCOPE);
+
+ try {
+ if (instanceNode.nodeExists(BranchView.VIEW_ID)) {
+ ((IEclipsePreferences) instanceNode.node(BranchView.VIEW_ID)).addPreferenceChangeListener(singletonPreferenceChangeListener());
+ }
+ } catch (BackingStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ instanceNode.addNodeChangeListener(new IEclipsePreferences.INodeChangeListener() {
+
+ public void added(NodeChangeEvent event) {
+ if (event.getChild().name().equals(BranchView.VIEW_ID)) {
+ ((IEclipsePreferences) event.getChild()).addPreferenceChangeListener(singletonPreferenceChangeListener());
+ }
+ }
+
+ public void removed(NodeChangeEvent event) {
+ if (event.getChild().name().equals(BranchView.VIEW_ID)) {
+ ((IEclipsePreferences) event.getChild()).removePreferenceChangeListener(singletonPreferenceChangeListener());
+ }
+ }
+ });
+
+ loadPreferences();
+ }
+
+ private synchronized IPreferenceChangeListener singletonPreferenceChangeListener() {
+ if (preferenceChangeListener == null) {
+ preferenceChangeListener = new IPreferenceChangeListener() {
+
+ public void preferenceChange(PreferenceChangeEvent event) {
+ if (disposed) {
+ ((IEclipsePreferences) event.getNode()).removePreferenceChangeListener(this);
+ } else {
+ String propertyName = event.getKey();
+
+ refreshCommands();
+
+ if (propertyName.equals(FLAT_KEY)) {
+ setPresentation(getViewPreference().getBoolean(FLAT_KEY, true));
+ }
+ if (propertyName.equals(SHOW_TRANSACTIONS)) {
+ setShowTransactions(getViewPreference().getBoolean(SHOW_TRANSACTIONS, true));
+ }
+ if (propertyName.equals(SHOW_MERGE_BRANCHES)) {
+ setShowMergeBranches(getViewPreference().getBoolean(SHOW_MERGE_BRANCHES, true));
+ }
+ if (propertyName.equals(SHOW_ARCHIVED_BRANCHES)) {
+ setShowArchivedBranches(getViewPreference().getBoolean(SHOW_ARCHIVED_BRANCHES, true));
+ }
+ if (propertyName.equals(FAVORITE_KEY)) {
+ setFavoritesFirst(getViewPreference().getBoolean(FAVORITE_KEY, false));
+ }
+ }
+ }
+ };
+ }
+
+ return preferenceChangeListener;
+ }
+
+ private void refreshCommands(){
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(HierarchicalPresentationHandler.COMMAND_ID, null);
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(FlatPresentationHandler.COMMAND_ID, null);
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(ShowTransactionPresentationHandler.COMMAND_ID, null);
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(ShowMergeBranchPresentationHandler.COMMAND_ID, null);
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(ShowArchivedBranchHandler.COMMAND_ID, null);
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(ShowFavoriteBranchesFirstHandler.COMMAND_ID, null);
+ }
+
+ private void loadPreferences() {
+ setPresentation(getViewPreference().getBoolean(FLAT_KEY, true));
+ setShowTransactions(getViewPreference().getBoolean(SHOW_TRANSACTIONS, true));
+ setShowMergeBranches(getViewPreference().getBoolean(SHOW_MERGE_BRANCHES, false));
+ setShowArchivedBranches(getViewPreference().getBoolean(SHOW_ARCHIVED_BRANCHES, false));
+ setFavoritesFirst(getViewPreference().getBoolean(FAVORITE_KEY, false));
+ }
+
+ private void setFavoritesFirst(boolean favoritesFirst) {
+ branchView.setFavoritesFirst(favoritesFirst);
+ }
+
+ private void setPresentation(boolean flat) {
+ branchView.setPresentation(flat);
+ }
+
+ private void setShowMergeBranches(boolean showMergeBranches) {
+ branchView.setShowMergeBranches(showMergeBranches);
+ }
+
+ private void setShowTransactions(boolean showTransactions) {
+ branchView.setShowTransactions(showTransactions);
+ }
+
+ private void setShowArchivedBranches(boolean showArchivedBranches) {
+ branchView.setShowArchivedBranches(showArchivedBranches);
+ }
+
+ /**
+ * @param disposed the disposed to set
+ */
+ public void setDisposed(boolean disposed) {
+ this.disposed = disposed;
+
+ try {
+ getViewPreference().flush();
+ } catch (BackingStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Preferences getViewPreference() {
+ return preferencesService.getRootNode().node(InstanceScope.SCOPE).node(BranchView.VIEW_ID);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewer.java
new file mode 100644
index 00000000000..c1f710baf55
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewer.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.framework.ui.skynet.widgets.xBranch;
+
+import java.util.ArrayList;
+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.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class BranchXViewer extends XViewer {
+ private final XBranchWidget xBranchViewer;
+
+ public BranchXViewer(Composite parent, int style, XBranchWidget xRoleViewer, boolean filterRealTime, boolean searchRealTime) {
+ super(parent, style, new BranchXViewerFactory(), filterRealTime, searchRealTime);
+ this.xBranchViewer = xRoleViewer;
+ }
+
+ @Override
+ public void handleDoubleClick() {
+ ArrayList<Branch> branches = xBranchViewer.getSelectedBranches();
+ if (branches != null && !branches.isEmpty()) {
+ for (Branch branch : branches) {
+ if (!branch.isSystemRootBranch()) {
+ ArtifactExplorer.exploreBranch(branch);
+ BranchManager.setLastBranch(branch);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ createMenuActions();
+ }
+
+ public void createMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ if(getLabelProvider() != null){
+ getLabelProvider().dispose();
+ }
+ }
+
+ /**
+ * @return the xHistoryViewer
+ */
+ public XBranchWidget getXBranchViewer() {
+ return xBranchViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewerFactory.java
new file mode 100644
index 00000000000..995d88646f6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/BranchXViewerFactory.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.framework.ui.skynet.widgets.xBranch;
+
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class BranchXViewerFactory extends SkynetXViewerFactory {
+ public static XViewerColumn branch_name =
+ new XViewerColumn("framework.branch.branchName", "Branch Name", 250, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn time_stamp =
+ new XViewerColumn("framework.branch.itemType", "Time Stamp", 150, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn author =
+ new XViewerColumn("framework.branch.author", "Author", 100, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn comment =
+ new XViewerColumn("framework.branch.comment", "Comment", 250, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn associatedArtifact =
+ new XViewerColumn("framework.branch.assocArt", "Associated Artifact", 100, SWT.LEFT, false,
+ SortDataType.String, false, null);
+ public static XViewerColumn branchState =
+ new XViewerColumn("framework.branch.state", "State", 100, SWT.LEFT, false, SortDataType.String, false, null);
+ public static XViewerColumn branchType =
+ new XViewerColumn("framework.branch.type", "Type", 100, SWT.LEFT, false, SortDataType.String, false, null);
+
+ public static String NAMESPACE = "osee.skynet.gui.BranchXViewer";
+
+ public BranchXViewerFactory() {
+ super(NAMESPACE);
+ registerColumn(branch_name, time_stamp, author, comment, associatedArtifact, branchState, branchType);
+ }
+
+ @Override
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new XViewerSorter(xViewer);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/FavoriteSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/FavoriteSorter.java
new file mode 100644
index 00000000000..27489cbcc80
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/FavoriteSorter.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.framework.ui.skynet.widgets.xBranch;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class FavoriteSorter extends XViewerSorter {
+ private boolean favoritesFirst;
+
+ /**
+ * @param labelProvider
+ */
+ public FavoriteSorter(XViewer viewer) {
+ super(viewer);
+// super(labelProvider);
+
+ this.favoritesFirst = false;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ if (favoritesFirst) {
+ if (o1 instanceof Branch && o2 instanceof Branch) {
+ try {
+ User user = UserManager.getUser();
+ boolean fav1 = user.isFavoriteBranch((Branch) o1);
+ boolean fav2 = user.isFavoriteBranch((Branch) o2);
+
+ if (fav1 ^ fav2) {
+ return fav1 ? -1 : 1;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (o1 instanceof Branch && !(o2 instanceof Branch)) {
+ return -1;
+ } else if (!(o1 instanceof Branch) && o2 instanceof Branch) {
+ return 1;
+ }
+ }
+ return super.compare(viewer, o1, o2);
+ }
+
+ /**
+ * @return Returns the favoritesFirst.
+ */
+ public boolean isFavoritesFirst() {
+ return favoritesFirst;
+ }
+
+ /**
+ * @param favoritesFirst The favoritesFirst to set.
+ */
+ public void setFavoritesFirst(boolean favoritesFirst) {
+ this.favoritesFirst = favoritesFirst;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchContentProvider.java
new file mode 100644
index 00000000000..544b2ed02f7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchContentProvider.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xBranch;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.core.enums.BranchType;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchArchivedState;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchControlled;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XBranchContentProvider implements ITreeContentProvider {
+
+ /**
+ * @param showOnlyWorkingBranches the showOnlyWorkingBranches to set
+ */
+ public void setShowOnlyWorkingBranches(boolean showOnlyWorkingBranches) {
+ this.showOnlyWorkingBranches = showOnlyWorkingBranches;
+ }
+
+ private final BranchXViewer changeXViewer;
+ private boolean showChildBranchesAtMainLevel;
+ private boolean showMergeBranches;
+ private boolean showArchivedBranches;
+ private boolean showTransactions;
+ private boolean showChildBranchesUnderParents;
+ private boolean showOnlyWorkingBranches;
+
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public XBranchContentProvider(BranchXViewer commitXViewer) {
+ super();
+
+ this.changeXViewer = commitXViewer;
+ this.showChildBranchesAtMainLevel = false;
+ this.showMergeBranches = false;
+ this.showTransactions = false;
+ this.showChildBranchesUnderParents = false;
+ this.showArchivedBranches = false;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof BranchManager) {
+ return getBranchManagerChildren((BranchManager) parentElement);
+
+ } else if (parentElement instanceof Branch) {
+ return getBranchChildren((Branch) parentElement);
+
+ } else if (parentElement instanceof Collection) {
+ return ((Collection<?>) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ private Object[] getBranchChildren(Branch branch) {
+ try {
+ if (showChildBranchesUnderParents) {
+ List<Object> items = new LinkedList<Object>();
+ Collection<Branch> childBrances =
+ showArchivedBranches ? branch.getDescendants() : branch.getChildBranches();
+
+ items.addAll(childBrances);
+ items.addAll(getTransactions(branch));
+
+ return items.toArray();
+ } else {
+ return getTransactions(branch).toArray();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(this.getClass(), Level.WARNING, ex);
+ }
+ return EMPTY_ARRAY;
+ }
+
+ private Object[] getBranchManagerChildren(BranchManager branchManager) {
+ BranchArchivedState branchState = BranchArchivedState.UNARCHIVED;
+ List<BranchType> branchTypes = new ArrayList<BranchType>(4);
+
+ try {
+ if (AccessControlManager.isOseeAdmin()) {
+ branchTypes.add(BranchType.SYSTEM_ROOT);
+ } else {
+ branchTypes.add(BranchType.TOP_LEVEL);
+ }
+
+ if (AccessControlManager.isOseeAdmin() && showMergeBranches) {
+ branchTypes.add(BranchType.MERGE);
+ }
+ if (AccessControlManager.isOseeAdmin() && showArchivedBranches) {
+ branchState = BranchArchivedState.ALL;
+ }
+ if (showChildBranchesAtMainLevel) {
+ branchTypes.add(BranchType.TOP_LEVEL);
+ branchTypes.add(BranchType.BASELINE);
+ branchTypes.add(BranchType.WORKING);
+ }
+
+ List<Branch> branchesToReturn = new ArrayList<Branch>();
+ if (showOnlyWorkingBranches) {
+ branchesToReturn.addAll(BranchManager.getBranches(BranchArchivedState.UNARCHIVED, BranchControlled.ALL,
+ BranchType.WORKING));
+ } else {
+ branchesToReturn.addAll(BranchManager.getBranches(branchState, BranchControlled.ALL,
+ branchTypes.toArray(new BranchType[branchTypes.size()])));
+ }
+ return branchesToReturn.toArray();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(this.getClass(), Level.WARNING, ex);
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ private Collection<Object> getTransactions(Branch branch) throws OseeCoreException {
+ if (!showTransactions) return Collections.emptyList();
+ List<TransactionId> transactions = TransactionIdManager.getTransactionsForBranch(branch);
+ Collections.sort(transactions, new Comparator<TransactionId>() {
+ public int compare(TransactionId o1, TransactionId o2) {
+ return o1.getTransactionNumber() - o2.getTransactionNumber();
+ }
+ });
+ if (transactions != null) {
+ return org.eclipse.osee.framework.jdk.core.util.Collections.getAggregateTree(new ArrayList<Object>(
+ transactions), 100);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof BranchManager) return true;
+ if (element instanceof Branch) {
+ boolean hasChildren = true;
+
+ if (!showTransactions) {
+ try {
+ if (!showChildBranchesAtMainLevel) {
+ hasChildren =
+ showArchivedBranches ? !((Branch) element).getDescendants().isEmpty() : !((Branch) element).getChildBranches().isEmpty();
+ } else {
+ hasChildren = false;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(this.getClass(), Level.WARNING, ex);
+ }
+ }
+ return hasChildren;
+ }
+ if (element instanceof Collection) return true;
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public Object[] getAllElements(Object inputElement) {
+ ArrayList<Object> objects = new ArrayList<Object>();
+
+ objects.addAll(recurseAllElements(inputElement));
+
+ for (Object object : recurseAllElements(inputElement)) {
+ objects.addAll(recurseAllElements(object));
+ }
+
+ return objects.toArray();
+ }
+
+ private ArrayList<Object> recurseAllElements(Object inputElement) {
+ ArrayList<Object> objects = new ArrayList<Object>();
+
+ for (Object object : getChildren(inputElement)) {
+ objects.add(object);
+ }
+
+ return objects;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the changeXViewer
+ */
+ public BranchXViewer getChangeXViewer() {
+ return changeXViewer;
+ }
+
+ /**
+ * @param flat
+ */
+ public void setPresentation(boolean flat) {
+ showChildBranchesAtMainLevel = flat;
+ showChildBranchesUnderParents = !flat;
+ }
+
+ /**
+ * @param showMergeBranches
+ */
+ public void setShowMergeBranches(boolean showMergeBranches) {
+ this.showMergeBranches = showMergeBranches;
+ }
+
+ /**
+ * @param showArchivedBranches
+ */
+ public void setShowArchivedBranches(boolean showArchivedBranches) {
+ this.showArchivedBranches = showArchivedBranches;
+ }
+
+ /**
+ * @param showTransactions2
+ */
+ public void setShowTransactions(boolean showTransactions) {
+ this.showTransactions = showTransactions;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchLabelProvider.java
new file mode 100644
index 00000000000..7f2937a029e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchLabelProvider.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xBranch;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XBranchLabelProvider extends XViewerLabelProvider {
+
+ private final BranchXViewer branchXViewer;
+
+ public XBranchLabelProvider(BranchXViewer branchXViewer) {
+ super(branchXViewer);
+ this.branchXViewer = branchXViewer;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn cCol, int columnIndex) throws OseeCoreException {
+ String columnText = "";
+ try {
+ if (element instanceof Branch) {
+ columnText = getBranchText((Branch) element, cCol, columnIndex);
+ } else if (element instanceof TransactionId) {
+ columnText = getTransactionText((TransactionId) element, cCol, columnIndex);
+ } else if (element instanceof Collection<?>) {
+ columnText = getAggrTransactionList((Collection<?>) element, columnIndex);
+ }
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ return columnText;
+ }
+
+ private String getAggrTransactionList(Collection<?> collection, int columnIndex) {
+ Object headCursor = collection;
+ Object tailCursor = collection;
+ String columnText = "";
+
+ while (headCursor instanceof List && !((List<?>) headCursor).isEmpty()) {
+ headCursor = ((List<?>) headCursor).get(0);
+ }
+ while (tailCursor instanceof List && !((List<?>) tailCursor).isEmpty()) {
+ List<?> list = (List<?>) tailCursor;
+ tailCursor = list.get(list.size() - 1);
+ }
+
+ if (headCursor instanceof TransactionId && tailCursor instanceof TransactionId) {
+ TransactionId headTransaction = (TransactionId) headCursor;
+ TransactionId tailTransaction = (TransactionId) tailCursor;
+
+ if (columnIndex == 0) {
+ columnText =
+ String.valueOf(headTransaction.getTransactionNumber() + "..." + tailTransaction.getTransactionNumber());
+ } else if (columnIndex == 1) {
+ columnText = String.valueOf(headTransaction.getTime());
+ }
+ } else {
+ columnText =
+ "Unexpected aggregation of " + headCursor.getClass().getSimpleName() + " and " + tailCursor.getClass().getSimpleName();
+ }
+ return columnText;
+ }
+
+ private String getBranchText(Branch branch, XViewerColumn cCol, int columnIndex) {
+ if (cCol.equals(BranchXViewerFactory.branch_name)) {
+ StringBuilder stringBuilder = new StringBuilder();
+ try {
+ if (AccessControlManager.isOseeAdmin()) {
+ stringBuilder.append("(" + branch.getBranchId() + ") " + branch.getBranchName());
+ } else {
+ stringBuilder.append(branch.getBranchName());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ if (branch.isArchived()) {
+ stringBuilder.insert(0, "[Archived] - ");
+ }
+ return stringBuilder.toString();
+ } else if (cCol.equals(BranchXViewerFactory.time_stamp)) {
+ return String.valueOf(branch.getCreationDate());
+ } else if (cCol.equals(BranchXViewerFactory.author)) {
+ return UserManager.getUserNameById(branch.getAuthorId());
+ } else if (cCol.equals(BranchXViewerFactory.comment)) {
+ return branch.getCreationComment();
+ } else if (cCol.equals(BranchXViewerFactory.associatedArtifact)) {
+ try {
+ if (branch.getAssociatedArtifact() != null) {
+ return branch.getAssociatedArtifact().getDescriptiveName();
+ }
+ } catch (OseeCoreException ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ } else if (cCol.equals(BranchXViewerFactory.branchState)) {
+ return branch.getBranchState().name();
+ } else if (cCol.equals(BranchXViewerFactory.branchType)) {
+ return branch.getBranchType().name();
+ }
+ return "";
+ }
+
+ private String getTransactionText(TransactionId transaction, XViewerColumn cCol, int columnIndex) {
+ String columnText = "";
+
+ if (cCol.equals(BranchXViewerFactory.branch_name)) {
+ columnText = String.valueOf(transaction.getTransactionNumber());
+ }
+ if (cCol.equals(BranchXViewerFactory.time_stamp)) {
+ columnText = String.valueOf(transaction.getTime());
+ } else if (cCol.equals(BranchXViewerFactory.author)) {
+ columnText = UserManager.getUserNameById(transaction.getAuthorArtId());
+ } else if (cCol.equals(BranchXViewerFactory.comment)) {
+ columnText = transaction.getComment();
+ } else if (cCol.equals(BranchXViewerFactory.associatedArtifact)) {
+ try {
+ if (transaction.getCommitArtId() == 0) return "";
+ Artifact art =
+ ArtifactQuery.getArtifactFromId(transaction.getCommitArtId(), BranchManager.getCommonBranch());
+ if (art != null) {
+ columnText = art.getDescriptiveName();
+ }
+ } catch (OseeCoreException ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ }
+ return columnText;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public BranchXViewer getTreeViewer() {
+ return branchXViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException {
+ if (xCol.equals(BranchXViewerFactory.associatedArtifact)) {
+ if (element instanceof Branch) {
+ try {
+ if (((Branch) element).getAssociatedArtifact() != null) {
+ return ImageManager.getImage(((Branch) element).getAssociatedArtifact());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (element instanceof TransactionId) {
+ try {
+ if (((TransactionId) element).getCommitArtId() == 0) return null;
+ Artifact artifact =
+ ArtifactQuery.getArtifactFromId(((TransactionId) element).getCommitArtId(),
+ BranchManager.getCommonBranch());
+ if (artifact != null) {
+ return ImageManager.getImage(artifact);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ Image returnImage = BranchViewImageHandler.getImage(element, columnIndex);
+ return returnImage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchWidget.java
new file mode 100644
index 00000000000..d182eb9d758
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xBranch/XBranchWidget.java
@@ -0,0 +1,392 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xBranch;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+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.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XBranchWidget extends XWidget implements IActionable {
+ private BranchXViewer branchXViewer;
+ public final static String normalColor = "#EEEEEE";
+ private static final String LOADING = "Loading ...";
+ protected Label extraInfoLabel;
+ private XBranchContentProvider branchContentProvider;
+ XBranchLabelProvider xBranchLabelProvider;
+ private FavoriteSorter sorter;
+ private static final String VIEW_ID = "BrachView";
+ private boolean filterRealTime;
+ private boolean searchRealTime;
+
+ public XBranchWidget(boolean filterRealTime, boolean searchRealTime) {
+ this();
+
+ this.filterRealTime = filterRealTime;
+ this.searchRealTime = searchRealTime;
+ }
+
+ /**
+ * @param label
+ */
+ public XBranchWidget() {
+ super(VIEW_ID);
+
+ this.filterRealTime = false;
+ this.searchRealTime = false;
+ }
+
+ public void setBranchOptions(BranchOptions... options) {
+ for (BranchOptions option : options) {
+
+ switch (option) {
+ case FAVORITES_FIRST:
+ setFavoritesFirst(true);
+ break;
+ case FLAT:
+ setPresentation(true);
+ break;
+ case SHOW_MERGE_BRANCHES:
+ setShowMergeBranches(true);
+ break;
+ case SHOW_TRANSACTIONS:
+ setShowMergeBranches(true);
+ break;
+ case SHOW_ARCHIVED:
+ setShowMergeBranches(true);
+ break;
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ mainComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+ if (toolkit != null) toolkit.paintBordersFor(mainComp);
+
+ try {
+ createTaskActionBar(mainComp);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ branchXViewer =
+ new BranchXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this, filterRealTime,
+ searchRealTime);
+ branchXViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ branchContentProvider = new XBranchContentProvider(branchXViewer);
+ branchXViewer.setContentProvider(branchContentProvider);
+ xBranchLabelProvider = new XBranchLabelProvider(branchXViewer);
+ branchXViewer.setLabelProvider(xBranchLabelProvider);
+ sorter = new FavoriteSorter(branchXViewer);
+ branchXViewer.setSorter(sorter);
+
+ if (toolkit != null) toolkit.adapt(branchXViewer.getStatusLabel(), false, false);
+
+ Tree tree = branchXViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 100;
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ }
+
+ public void createTaskActionBar(Composite parent) throws OseeCoreException {
+ // Button composite for state transitions, etc
+ Composite composite = new Composite(parent, SWT.NONE);
+ // composite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ GridLayout layout = ALayout.getZeroMarginLayout(2, false);
+ layout.marginLeft = 5;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(composite, SWT.NONE);
+ extraInfoLabel.setAlignment(SWT.LEFT);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("\n");
+
+ ToolBar toolBar = new ToolBar(composite, SWT.FLAT);
+ ToolItem item = null;
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ loadData();
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ branchXViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ OseeAts.addButtonToEditorToolBar(this, SkynetGuiPlugin.getInstance(), toolBar, BranchView.VIEW_ID, "Branch");
+ }
+
+ public void loadTable() {
+ refresh();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<Branch> getSelectedBranches() {
+ ArrayList<Branch> items = new ArrayList<Branch>();
+ if (branchXViewer == null) return items;
+ if (branchXViewer.getSelection().isEmpty()) return items;
+ Iterator i = ((IStructuredSelection) branchXViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+
+ if (obj instanceof Branch) {
+ items.add((Branch) obj);
+ }
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ return branchXViewer.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ branchXViewer.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ branchXViewer.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ branchXViewer.refresh();
+ validate();
+ }
+
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.simplePage("Unhandled");
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public BranchXViewer getXViewer() {
+ return branchXViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return branchXViewer.getInput();
+ }
+
+ public void loadData() {
+ if (extraInfoLabel != null && !extraInfoLabel.isDisposed()) {
+ extraInfoLabel.setText(LOADING);
+ }
+
+ Job job = new Job("Banch Manager") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (extraInfoLabel != null && !extraInfoLabel.isDisposed()) {
+ extraInfoLabel.setText("");
+ }
+ if (branchXViewer != null) {
+ branchXViewer.setInput(BranchManager.getInstance());
+ }
+ }
+ });
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ return null;
+ }
+
+ /**
+ * @param favoritesFirst
+ */
+ public void setFavoritesFirst(boolean favoritesFirst) {
+ if (branchContentProvider != null) {
+ sorter.setFavoritesFirst(favoritesFirst);
+ refresh();
+ }
+ }
+
+ /**
+ * @param flat
+ */
+ public void setPresentation(boolean flat) {
+ if (branchContentProvider != null) {
+ branchContentProvider.setPresentation(flat);
+ refresh();
+ }
+ }
+
+ /**
+ * @param showMergeBranches
+ */
+ public void setShowMergeBranches(boolean showMergeBranches) {
+ if (branchContentProvider != null) {
+ branchContentProvider.setShowMergeBranches(showMergeBranches);
+ refresh();
+ }
+ }
+
+ /**
+ * @param showArchivedBranches
+ */
+ public void setShowArchivedBranches(boolean showArchivedBranches) {
+ if (branchContentProvider != null) {
+ branchContentProvider.setShowArchivedBranches(showArchivedBranches);
+ refresh();
+ }
+ }
+
+ /**
+ * @param showTransactions
+ */
+ public void setShowTransactions(boolean showTransactions) {
+ if (branchContentProvider != null) {
+ branchContentProvider.setShowTransactions(showTransactions);
+ refresh();
+ }
+ }
+
+ /**
+ * @param showTransactions
+ */
+ public void setShowWorkingBranchesOnly(boolean allowOnlyWorkingBranches) {
+ if (branchContentProvider != null) {
+ branchContentProvider.setShowOnlyWorkingBranches(allowOnlyWorkingBranches);
+ refresh();
+ }
+ }
+
+ /**
+ * @param branch
+ */
+ public void reveal(Branch branch) {
+ for (Object obj : ((XBranchContentProvider) branchXViewer.getContentProvider()).getAllElements(BranchManager.getInstance())) {
+ if (obj instanceof Branch && (Branch) obj == branch) {
+ branchXViewer.reveal(obj);
+ branchXViewer.setSelection(new StructuredSelection(obj), true);
+ refresh();
+ return;
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryView.java
new file mode 100644
index 00000000000..8ce2619957a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryView.java
@@ -0,0 +1,340 @@
+/*******************************************************************************
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xHistory;
+
+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.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.IStructuredSelection;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomMenu;
+import org.eclipse.osee.framework.core.enums.TransactionDetailsType;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.revision.HistoryTransactionItem;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OpenWithMenuListener;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener;
+import org.eclipse.osee.framework.ui.skynet.menu.ArtifactDiffMenu;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetViews;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Displays persisted changes made to an artifact.
+ *
+ * @author Jeff C. Phillips
+ */
+public class HistoryView extends ViewPart implements IActionable, IBranchEventListener, IRebuildMenuListener {
+
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView";
+ private static String HELP_CONTEXT_ID = "HistoryView";
+ private XHistoryWidget xHistoryWidget;
+ private Artifact artifact;
+
+ public HistoryView() {
+ }
+
+ public static void open(Artifact artifact) throws OseeArgumentException {
+ if (artifact == null) throw new OseeArgumentException("Artifact can't be null");
+ HistoryView.openViewUpon(artifact, true);
+ }
+
+ private static void openViewUpon(final Artifact artifact, final Boolean loadHistory) {
+ Job job = new Job("Open History: " + artifact.getDescriptiveName()) {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ HistoryView historyView =
+ (HistoryView) page.showView(VIEW_ID,
+ artifact.getGuid() + artifact.getBranch().getBranchId(), IWorkbenchPage.VIEW_ACTIVATE);
+
+ historyView.explore(artifact, loadHistory);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.startJob(job);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ /*
+ * Create a grid layout object so the text and treeviewer are layed out the way I want.
+ */
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ xHistoryWidget = new XHistoryWidget();
+ xHistoryWidget.setDisplayLabel(false);
+ xHistoryWidget.createWidgets(parent, 1);
+
+ MenuManager menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ MenuManager menuManager = (MenuManager) manager;
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ });
+
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ xHistoryWidget.getXViewer().getTree().setMenu(
+ menuManager.createContextMenu(xHistoryWidget.getXViewer().getTree()));
+ getSite().registerContextMenu(VIEW_ID, menuManager, xHistoryWidget.getXViewer());
+
+ getSite().setSelectionProvider(xHistoryWidget.getXViewer());
+ SkynetGuiPlugin.getInstance().setHelp(parent, HELP_CONTEXT_ID);
+ OseeContributionItem.addTo(this, true);
+
+ setupMenus();
+ }
+
+ private void setupMenus() {
+ Menu popupMenu = new Menu(xHistoryWidget.getXViewer().getTree().getParent());
+ createOpenWithMenuItem(popupMenu);
+ createChangeReportMenuItem(popupMenu);
+ ArtifactDiffMenu.createDiffMenuItem(popupMenu, xHistoryWidget.getXViewer(), "Compare two Artifacts", null);
+
+ // Setup generic xviewer menu items
+ XViewerCustomMenu xMenu = new XViewerCustomMenu(xHistoryWidget.getXViewer());
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ xMenu.createTableCustomizationMenuItem(popupMenu);
+ xMenu.createViewTableReportMenuItem(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ xMenu.addCopyViewMenuBlock(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ xMenu.addFilterMenuBlock(popupMenu);
+ new MenuItem(popupMenu, SWT.SEPARATOR);
+ xHistoryWidget.getXViewer().getTree().setMenu(popupMenu);
+ }
+
+ /**
+ * @param popupMenu
+ */
+ private void createChangeReportMenuItem(Menu popupMenu) {
+ final MenuItem changeReportMenuItem = new MenuItem(popupMenu, SWT.CASCADE);
+ changeReportMenuItem.setText("&Change Report");
+ changeReportMenuItem.setImage(ImageManager.getImage(FrameworkImage.BRANCH_CHANGE));
+ popupMenu.addMenuListener(new MenuListener() {
+
+ @Override
+ public void menuHidden(MenuEvent e) {
+ }
+
+ @Override
+ public void menuShown(MenuEvent e) {
+ List<?> selections = ((IStructuredSelection) xHistoryWidget.getXViewer().getSelection()).toList();
+ try {
+ changeReportMenuItem.setEnabled(selections.size() == 1 && ((HistoryTransactionItem) selections.iterator().next()).getTransactionData().getTransactionId().getTxType() != TransactionDetailsType.Baselined);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ });
+
+ changeReportMenuItem.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ IStructuredSelection selection = (IStructuredSelection) xHistoryWidget.getXViewer().getSelection();
+ Object selectedObject = selection.getFirstElement();
+
+ if (selectedObject instanceof HistoryTransactionItem) {
+ try {
+ ChangeView.open(((HistoryTransactionItem) selectedObject).getTransactionData().getTransactionId());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ });
+ }
+
+ private void createOpenWithMenuItem(Menu parentMenu) {
+ MenuItem openWithMenuItem = new MenuItem(parentMenu, SWT.CASCADE);
+ openWithMenuItem.setText("&Open With");
+ final Menu submenu = new Menu(openWithMenuItem);
+ openWithMenuItem.setMenu(submenu);
+ parentMenu.addMenuListener(new OpenWithMenuListener(submenu, xHistoryWidget.getXViewer(), this));
+ }
+
+ private void explore(final Artifact artifact, boolean loadHistory) {
+ if (xHistoryWidget != null) {
+ this.artifact = artifact;
+
+ setPartName("History: " + artifact.getDescriptiveName());
+ xHistoryWidget.setInputData(artifact, loadHistory);
+ }
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ private static final String INPUT = "input";
+ private static final String ART_GUID = "artifactGuid";
+ private static final String BRANCH_ID = "branchId";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
+ */
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ memento = memento.createChild(INPUT);
+ if (artifact != null) {
+ memento.putString(ART_GUID, artifact.getGuid());
+ memento.putInteger(BRANCH_ID, artifact.getBranch().getBranchId());
+ SkynetViews.addDatabaseSourceId(memento);
+ }
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ try {
+ if (memento != null) {
+ memento = memento.getChild(INPUT);
+ if (memento != null) {
+ if (SkynetViews.isSourceValid(memento)) {
+ String guid = memento.getString(ART_GUID);
+ Integer branchId = memento.getInteger(BRANCH_ID);
+ Artifact artifact = ArtifactQuery.getArtifactFromId(guid, BranchManager.getBranch(branchId));
+ openViewUpon(artifact, false);
+ } else {
+ closeView();
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "History View error on init", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, final int branchId) {
+ if (branchModType == BranchEventType.Deleted) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ closeView();
+ }
+ });
+ return;
+ } else if (branchModType == BranchEventType.Committed) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ explore(artifact, true);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ // refresh view with new branch and transaction id
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ private void closeView() {
+ SkynetViews.closeView(VIEW_ID, getViewSite().getSecondaryId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.listener.IRebuildMenuListener#rebuildMenu()
+ */
+ @Override
+ public void rebuildMenu() {
+ setupMenus();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java
new file mode 100644
index 00000000000..ba80528951b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.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.framework.ui.skynet.widgets.xHistory;
+
+import java.util.ArrayList;
+import org.eclipse.core.runtime.IAdaptable;
+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.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class HistoryXViewer extends XViewer {
+ private final XHistoryWidget xHistoryViewer;
+
+ public HistoryXViewer(Composite parent, int style, XHistoryWidget xRoleViewer) {
+ super(parent, style, new HistoryXViewerFactory());
+ this.xHistoryViewer = xRoleViewer;
+ }
+
+ @Override
+ public void handleDoubleClick() {
+ try {
+ if (getSelectedChanges().size() == 0) return;
+
+ Artifact artifact = getSelectedChanges().iterator().next();
+
+ if (artifact != null) {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(1);
+ artifacts.add(artifact);
+
+ if (StaticIdManager.hasValue(UserManager.getUser(),
+ EditorsPreferencePage.PreviewOnDoubleClickForWordArtifacts)) {
+ RendererManager.previewInJob(artifacts);
+ } else {
+ RendererManager.openInJob(artifacts, PresentationType.GENERALIZED_EDIT);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public ArrayList<Artifact> getSelectedChanges() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ TreeItem items[] = getTree().getSelection();
+
+ if (items.length > 0) {
+ for (TreeItem item : items) {
+ Artifact artifact = null;
+ if(item.getData() instanceof IAdaptable){
+ artifact = (Artifact)((IAdaptable)item.getData()).getAdapter(Artifact.class);
+
+ if(artifact != null){
+ arts.add(artifact);
+ }
+ }
+ }
+ }
+ return arts;
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ createMenuActions();
+ }
+
+ public void createMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ getLabelProvider().dispose();
+ }
+
+ /**
+ * @return the xHistoryViewer
+ */
+ public XHistoryWidget getXHisotryViewer() {
+ return xHistoryViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java
new file mode 100644
index 00000000000..3beea1a2819
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.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.framework.ui.skynet.widgets.xHistory;
+
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class HistoryXViewerFactory extends SkynetXViewerFactory {
+ public static XViewerColumn transaction =
+ new XViewerColumn("framework.history.transaction", "Transaction", 100, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn gamma =
+ new XViewerColumn("framework.history.gamma", "Gamma", 70, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn itemType =
+ new XViewerColumn("framework.history.itemType", "Item Type", 150, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn was =
+ new XViewerColumn("framework.history.was", "Was", 250, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn is =
+ new XViewerColumn("framework.history.is", "Is", 250, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn timeStamp =
+ new XViewerColumn("framework.history.timeStamp", "Time Stamp", 110, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn author =
+ new XViewerColumn("framework.history.author", "Author", 100, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn comment =
+ new XViewerColumn("framework.history.comment", "Comment", 70, SWT.LEFT, true, SortDataType.String, false, null);
+
+ public static String NAMESPACE = "osee.skynet.gui.HisotryXViewer";
+
+ public HistoryXViewerFactory() {
+ super(NAMESPACE);
+ registerColumn(transaction, gamma, itemType, was, is, timeStamp, author, comment);
+ registerAllAttributeColumns();
+ }
+
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new XViewerSorter(xViewer);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryContentProvider.java
new file mode 100644
index 00000000000..08beacdd9fc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryContentProvider.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.framework.ui.skynet.widgets.xHistory;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XHistoryContentProvider implements ITreeContentProvider {
+
+ private final HistoryXViewer changeXViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public XHistoryContentProvider(HistoryXViewer commitXViewer) {
+ super();
+ this.changeXViewer = commitXViewer;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection<?>) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof Collection) return true;
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection) {
+ return ((Collection<?>) inputElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @return the changeXViewer
+ */
+ public HistoryXViewer getChangeXViewer() {
+ return changeXViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java
new file mode 100644
index 00000000000..2032365985b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.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.framework.ui.skynet.widgets.xHistory;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.revision.HistoryTransactionItem;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XHistoryLabelProvider extends XViewerLabelProvider {
+
+ Font font = null;
+ private final HistoryXViewer changeXViewer;
+
+ public XHistoryLabelProvider(HistoryXViewer changeXViewer) {
+ super(changeXViewer);
+ this.changeXViewer = changeXViewer;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn cCol, int columnIndex) throws OseeCoreException {
+ try {
+ if (!(element instanceof HistoryTransactionItem)) return "";
+ HistoryTransactionItem data = (HistoryTransactionItem) element;
+
+ if (cCol.equals(HistoryXViewerFactory.transaction)) {
+ return String.valueOf(data.getTransactionNumber());
+ } else if (cCol.equals(HistoryXViewerFactory.gamma)) {
+ return String.valueOf(data.getGamma());
+ } else if (cCol.equals(HistoryXViewerFactory.itemType)) {
+ return data.getChangeType();
+ } else if (cCol.equals(HistoryXViewerFactory.was)) {
+ return data.getWasValue();
+ } else if (cCol.equals(HistoryXViewerFactory.is)) {
+ return data.getIsValue();
+ } else if (cCol.equals(HistoryXViewerFactory.timeStamp)) {
+ return data.getTimeStamp();
+ } else if (cCol.equals(HistoryXViewerFactory.author)) {
+ return data.getAuthorName();
+ } else if (cCol.equals(HistoryXViewerFactory.comment)) {
+ return data.getComment();
+ }
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ return "unhandled column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public HistoryXViewer getTreeViewer() {
+ return changeXViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException {
+ try {
+ if (!(element instanceof HistoryTransactionItem)) return null;
+ HistoryTransactionItem change = (HistoryTransactionItem) element;
+ if (xCol.equals(HistoryXViewerFactory.transaction)) {
+ try {
+ return ImageManager.getImage(FrameworkImage.DB_ICON_BLUE);
+ } catch (IllegalArgumentException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (xCol.equals(HistoryXViewerFactory.itemType)) {
+ return ImageManager.getChangeImage(change.getRevisionChange());
+ }
+
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java
new file mode 100644
index 00000000000..4e699b4ecb1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java
@@ -0,0 +1,350 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xHistory;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+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.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.revision.HistoryTransactionItem;
+import org.eclipse.osee.framework.skynet.core.revision.RevisionChange;
+import org.eclipse.osee.framework.skynet.core.revision.RevisionManager;
+import org.eclipse.osee.framework.skynet.core.revision.TransactionData;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class XHistoryWidget extends XWidget implements IActionable {
+
+ private HistoryXViewer xHistoryViewer;
+ public final static String normalColor = "#EEEEEE";
+ private static final String LOADING = "Loading ...";
+ private static final String NO_HISTORY = "No History changes were found";
+ protected Label extraInfoLabel;
+ private Artifact artifact;
+
+ /**
+ * @param label
+ */
+ public XHistoryWidget() {
+ super("History");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ if (toolkit != null) toolkit.paintBordersFor(mainComp);
+
+ try {
+ createTaskActionBar(mainComp);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ xHistoryViewer = new HistoryXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ xHistoryViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ xHistoryViewer.setContentProvider(new XHistoryContentProvider(xHistoryViewer));
+ xHistoryViewer.setLabelProvider(new XHistoryLabelProvider(xHistoryViewer));
+
+ if (toolkit != null) toolkit.adapt(xHistoryViewer.getStatusLabel(), false, false);
+
+ Tree tree = xHistoryViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 100;
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ new HistoryDragAndDrop(tree, HistoryXViewerFactory.NAMESPACE);
+ }
+
+ public void createTaskActionBar(Composite parent) throws OseeCoreException {
+
+ // Button composite for state transitions, etc
+ Composite bComp = new Composite(parent, SWT.NONE);
+ // bComp.setBackground(mainSComp.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ bComp.setLayout(new GridLayout(2, false));
+ bComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite leftComp = new Composite(bComp, SWT.NONE);
+ leftComp.setLayout(new GridLayout());
+ leftComp.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(leftComp, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("\n");
+
+ Composite rightComp = new Composite(bComp, SWT.NONE);
+ rightComp.setLayout(new GridLayout());
+ rightComp.setLayoutData(new GridData(GridData.END));
+
+ ToolBar toolBar = new ToolBar(rightComp, SWT.FLAT | SWT.RIGHT);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ toolBar.setLayoutData(gd);
+ ToolItem item = null;
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ setInputData(artifact, true);
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xHistoryViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ OseeAts.addButtonToEditorToolBar(this, SkynetGuiPlugin.getInstance(), toolBar, HistoryView.VIEW_ID, "Hisotry");
+ }
+
+ public void loadTable() {
+ refresh();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<Branch> getSelectedBranches() {
+ ArrayList<Branch> items = new ArrayList<Branch>();
+ if (xHistoryViewer == null) return items;
+ if (xHistoryViewer.getSelection().isEmpty()) return items;
+ Iterator i = ((IStructuredSelection) xHistoryViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ items.add((Branch) obj);
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ return xHistoryViewer.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ xHistoryViewer.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ xHistoryViewer.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ xHistoryViewer.refresh();
+ validate();
+ }
+
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.simplePage("Unhandled");
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public HistoryXViewer getXViewer() {
+ return xHistoryViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return xHistoryViewer.getInput();
+ }
+
+ public void setInputData(final Artifact artifact, final boolean loadHistory) {
+ this.artifact = artifact;
+ extraInfoLabel.setText(LOADING);
+
+ Job job = new Job("History: " + artifact.getDescriptiveName()) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final Collection<HistoryTransactionItem> historyItems = new ArrayList<HistoryTransactionItem>();
+
+ try {
+ if (loadHistory) {
+ for (TransactionData transactionData : RevisionManager.getTransactionsPerArtifact(artifact, true)) {
+ for (RevisionChange revisionChange : RevisionManager.getTransactionChanges(transactionData)) {
+ historyItems.add(new HistoryTransactionItem(transactionData, revisionChange));
+ }
+ }
+ }
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (loadHistory) {
+ if (historyItems.size() == 0) {
+ extraInfoLabel.setText(NO_HISTORY);
+ xHistoryViewer.setInput(historyItems);
+ } else {
+ String infoLabel =
+ String.format("History: %s on branch: %s", artifact.getDescriptiveName(),
+ artifact.getBranch().getBranchShortName());
+ extraInfoLabel.setText(infoLabel);
+ xHistoryViewer.setInput(historyItems);
+ }
+ } else {
+ extraInfoLabel.setText("Cleared on shut down - press refresh to reload");
+ }
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+ public class HistoryDragAndDrop extends SkynetDragAndDrop {
+
+ public HistoryDragAndDrop(Tree tree, String viewId) {
+ super(tree, viewId);
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ event.detail = DND.DROP_NONE;
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) xHistoryViewer.getSelection();
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>();
+
+ if (selection != null && !selection.isEmpty()) {
+ for (Object object : selection.toArray()) {
+
+ if (object instanceof IAdaptable) {
+ Artifact artifact = (Artifact) ((IAdaptable) object).getAdapter(Artifact.class);
+
+ if (artifact != null) {
+ artifacts.add(artifact);
+ }
+ }
+ }
+ }
+ return artifacts.toArray(new Artifact[artifacts.size()]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ StringBuffer sb = new StringBuffer();
+ if (artifact != null) sb.append("\nHistory : " + artifact.getDescriptiveName());
+ return sb.toString();
+ }
+
+ public Artifact getArtifact() {
+ return artifact;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLine.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLine.java
new file mode 100644
index 00000000000..0ea01088605
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLine.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.framework.ui.skynet.widgets.xbargraph;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XBarGraphLine {
+ public static int DEFAULT_RED_FOREGROUND = SWT.COLOR_RED;
+ public static int DEFAULT_RED_BACKGROUND = SWT.COLOR_YELLOW;
+ public static int DEFAULT_GREEN_FOREGROUND = SWT.COLOR_GREEN;
+ public static int DEFAULT_GREEN_BACKGROUND = SWT.COLOR_YELLOW;
+ public static int DEFAULT_BLUE_FOREGROUND = SWT.COLOR_BLUE;
+ public static int DEFAULT_BLUE_BACKGROUND = SWT.COLOR_YELLOW;
+ public String name;
+ List<XBarGraphLineSegment> segments = new ArrayList<XBarGraphLineSegment>();
+
+ public XBarGraphLine(String name, int value) {
+ this(name, DEFAULT_GREEN_FOREGROUND, DEFAULT_GREEN_BACKGROUND, value);
+ }
+
+ public XBarGraphLine(String name, int value, String valueStr) {
+ this(name, DEFAULT_GREEN_FOREGROUND, DEFAULT_GREEN_BACKGROUND, value, valueStr);
+ }
+
+ public XBarGraphLine(String name, List<XBarGraphLineSegment> segments) {
+ this.name = name;
+ this.segments = segments;
+ }
+
+ public XBarGraphLine(String name, int foreground, int background, long value) {
+ this(name, foreground, background, value, String.valueOf(value));
+ }
+
+ public XBarGraphLine(String name, int foreground, int background, long value, String valueStr) {
+ this.name = name;
+ segments.add(new XBarGraphLineSegment(valueStr, foreground, background, value));
+ }
+
+ public XBarGraphLine(String name, int foreground, int background, int remainingForeground, int remainingBackground, int value, String valueStr) {
+ this(name, foreground, background, value, valueStr);
+ segments.add(new XBarGraphLineSegment("", 100 - value));
+ }
+
+ public XBarGraphLine(String name, int foreground, int background, int remainingForeground, int remainingBackground, int value, String valueStr, String remainingValueStr) {
+ this(name, foreground, background, value, valueStr);
+ segments.add(new XBarGraphLineSegment(remainingValueStr, remainingForeground, remainingBackground, 100 - value));
+ }
+
+ /**
+ * Shows as white until completed, then green
+ *
+ * @param name
+ * @param value
+ * @return XBarGraphLine
+ */
+ public static XBarGraphLine getPercentLine(String name, int value) {
+ if (value == 100.0) {
+ return new XBarGraphLine(name, DEFAULT_GREEN_FOREGROUND, DEFAULT_GREEN_BACKGROUND, value, value + "%");
+ } else {
+ return new XBarGraphLine(name, SWT.COLOR_WHITE, SWT.COLOR_WHITE, value, value + "%");
+ }
+ }
+
+ public static XBarGraphLine getPercentLineBlueGreen(String name, int value) {
+ if (value == 100.0) {
+ return new XBarGraphLine(name, DEFAULT_GREEN_FOREGROUND, DEFAULT_GREEN_BACKGROUND, value, value + "%");
+ } else {
+ return new XBarGraphLine(name, SWT.COLOR_YELLOW, SWT.COLOR_GREEN, value, value + "%");
+ }
+ }
+
+ public static XBarGraphLine getTextLine(String name, String value) {
+ return new XBarGraphLine(name, SWT.COLOR_WHITE, SWT.COLOR_WHITE, 0, value);
+ }
+
+ public static XBarGraphLine getTextLineRedIfTrue(String name, String value, boolean isRed) {
+ return new XBarGraphLine(name, isRed ? DEFAULT_RED_FOREGROUND : SWT.COLOR_WHITE,
+ isRed ? DEFAULT_RED_BACKGROUND : SWT.COLOR_WHITE, isRed ? 100 : 0, value);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLineSegment.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLineSegment.java
new file mode 100644
index 00000000000..83dcddd4030
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphLineSegment.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.framework.ui.skynet.widgets.xbargraph;
+
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XBarGraphLineSegment {
+ public static int DEFAULT_RED_FOREGROUND = SWT.COLOR_RED;
+ public static int DEFAULT_RED_BACKGROUND = SWT.COLOR_YELLOW;
+ public static int DEFAULT_GREEN_FOREGROUND = SWT.COLOR_GREEN;
+ public static int DEFAULT_GREEN_BACKGROUND = SWT.COLOR_YELLOW;
+ String name;
+ int foreground;
+ int background;
+ long value;
+
+ public XBarGraphLineSegment(String name, long value) {
+ this(name, DEFAULT_GREEN_FOREGROUND, DEFAULT_GREEN_BACKGROUND, value);
+ }
+
+ public XBarGraphLineSegment(String name, int color, long value) {
+ this(name, color, color, value);
+ }
+
+ public XBarGraphLineSegment(String name, int foreground, int background, long value) {
+ this.name = name;
+ this.foreground = foreground;
+ this.background = background;
+ this.value = value;
+ }
+
+ public static XBarGraphLineSegment getPercentSegment(String name, long value) {
+ return new XBarGraphLineSegment(value + "%", DEFAULT_GREEN_FOREGROUND, DEFAULT_GREEN_BACKGROUND, value);
+ }
+
+ public static XBarGraphLineSegment getPercentSegment(String name, int color, long value) {
+ return new XBarGraphLineSegment(value + "%", color, color, value);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java
new file mode 100644
index 00000000000..23b72da526a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xbargraph/XBarGraphTable.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xbargraph;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XBarGraphTable extends XWidget {
+
+ private final String itemHeader;
+ private final String percentHeader;
+ private Table table;
+ private final List<XBarGraphLine> lines;
+ private boolean isHeaderVisible = true;
+ private boolean isLinesVisible = true;
+
+ public XBarGraphTable(String label, String itemHeader, String percentHeader, List<XBarGraphLine> lines) {
+ super(label);
+ this.itemHeader = itemHeader;
+ this.percentHeader = percentHeader;
+ this.lines = lines;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ": ");
+
+ table = new Table(parent, SWT.BORDER);
+ table.setHeaderVisible(isHeaderVisible);
+ table.setLinesVisible(isLinesVisible);
+ if (isFillHorizontally()) {
+ table.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ }
+ TableColumn column1 = new TableColumn(table, SWT.NONE);
+ column1.setText(itemHeader);
+ column1.setWidth(300);
+ final TableColumn column2 = new TableColumn(table, SWT.NONE);
+ column2.setText(percentHeader);
+ column2.setWidth(500);
+ for (XBarGraphLine line : lines) {
+ TableItem item = new TableItem(table, SWT.NONE);
+ item.setText(line.name);
+ }
+
+ /*
+ * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
+ * Therefore, it is critical for performance that these methods be
+ * as efficient as possible.
+ */
+ table.addListener(SWT.PaintItem, new Listener() {
+ public void handleEvent(Event event) {
+ if (event.index == 1) {
+ GC gc = event.gc;
+ TableItem item = (TableItem) event.item;
+ int index = table.indexOf(item);
+ XBarGraphLine line = lines.get(index);
+ int cummulativeWidth = 0;
+ for (XBarGraphLineSegment seg : line.segments) {
+ Color foreground = gc.getForeground();
+ Color background = gc.getBackground();
+ gc.setForeground(Display.getCurrent().getSystemColor(seg.foreground));
+ gc.setBackground(Display.getCurrent().getSystemColor(seg.background));
+ int width = (column2.getWidth()) * (int) seg.value / 100;
+ gc.fillGradientRectangle(event.x + cummulativeWidth, event.y, width, event.height, true);
+ Rectangle rect2 = new Rectangle(event.x + cummulativeWidth, event.y, width - 1, event.height - 1);
+ gc.drawRectangle(rect2);
+ if (seg.name != null && !seg.name.equals("")) {
+ gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
+ Point size = event.gc.textExtent(seg.name);
+ int offset = Math.max(0, (event.height - size.y) / 2);
+ gc.drawText(seg.name, event.x + cummulativeWidth + 5, event.y + offset, true);
+ gc.setForeground(background);
+ gc.setBackground(foreground);
+ }
+ cummulativeWidth += width;
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getControl()
+ */
+ @Override
+ public Control getControl() {
+ return table;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#isValid()
+ */
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#refresh()
+ */
+ @Override
+ public void refresh() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#toHTML(java.lang.String)
+ */
+ @Override
+ public String toHTML(String labelFont) {
+ return null;
+ }
+
+ public static void main(String[] args) {
+ final Display display = new Display();
+ Shell shell = new Shell(display);
+ shell.setLayout(new GridLayout(1, false));
+ shell.setText("Show results as a bar chart in Table");
+
+ List<XBarGraphLine> lines = new ArrayList<XBarGraphLine>();
+ lines.add(XBarGraphLine.getPercentLine("Fix", 34));
+ lines.add(XBarGraphLine.getPercentLine("Improvement", 100));
+ lines.add(new XBarGraphLine("Support", SWT.COLOR_GREEN, SWT.COLOR_YELLOW, SWT.COLOR_RED, SWT.COLOR_YELLOW, 33,
+ "33%", "67%"));
+ List<XBarGraphLineSegment> segments = new ArrayList<XBarGraphLineSegment>();
+ segments.add(XBarGraphLineSegment.getPercentSegment("23%", SWT.COLOR_GREEN, 23));
+ segments.add(XBarGraphLineSegment.getPercentSegment("45%", SWT.COLOR_BLUE, 45));
+ segments.add(XBarGraphLineSegment.getPercentSegment("20%", SWT.COLOR_YELLOW, 20));
+ segments.add(XBarGraphLineSegment.getPercentSegment("12%", SWT.COLOR_MAGENTA, 12));
+ lines.add(new XBarGraphLine("Other", segments));
+ XBarGraphTable table = new XBarGraphTable("By Improvement", "", "Percent", lines);
+ table.createWidgets(shell, 1);
+
+ shell.pack();
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+ display.dispose();
+ }
+
+ /**
+ * @return the isHeaderVisible
+ */
+ public boolean isHeaderVisible() {
+ return isHeaderVisible;
+ }
+
+ /**
+ * @param isHeaderVisible the isHeaderVisible to set
+ */
+ public void setHeaderVisible(boolean isHeaderVisible) {
+ this.isHeaderVisible = isHeaderVisible;
+ }
+
+ /**
+ * @return the isLinesVisible
+ */
+ public boolean isLinesVisible() {
+ return isLinesVisible;
+ }
+
+ /**
+ * @param isLinesVisible the isLinesVisible to set
+ */
+ public void setLinesVisible(boolean isLinesVisible) {
+ this.isLinesVisible = isLinesVisible;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeView.java
new file mode 100644
index 00000000000..059caa217da
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeView.java
@@ -0,0 +1,308 @@
+/*******************************************************************************
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xchange;
+
+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.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetViews;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Jeff C. Phillips
+ * @author Donald G. Dunne
+ */
+public class ChangeView extends ViewPart implements IActionable, IBranchEventListener, ITransactionsDeletedEventListener {
+
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView";
+ private static String HELP_CONTEXT_ID = "ChangeView";
+ private XChangeWidget xChangeWidget;
+ private Branch branch;
+ private TransactionId transactionId;
+ private ChangeViewPresentationPreferences changeViewPresentationPreferences;
+
+ public ChangeView() {
+ OseeEventManager.addListener(this);
+ }
+
+ public static void open(Branch branch) throws OseeArgumentException {
+ if (branch == null) throw new OseeArgumentException("Branch can't be null");
+ ChangeView.openViewUpon(branch, null, true);
+ }
+
+ public static void open(TransactionId transactionId) throws OseeArgumentException {
+ if (transactionId == null) throw new OseeArgumentException("TransactionId can't be null");
+ ChangeView.openViewUpon(null, transactionId, true);
+ }
+
+ private static void openViewUpon(final Branch branch, final TransactionId transactionId, final Boolean loadChangeReport) {
+ Job job = new Job("Open Change View") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ ChangeView changeView =
+ (ChangeView) page.showView(
+ VIEW_ID,
+ String.valueOf(branch != null ? branch.getBranchId() : transactionId.getTransactionNumber()),
+ IWorkbenchPage.VIEW_ACTIVATE);
+
+ changeView.explore(branch, transactionId, loadChangeReport);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.startJob(job);
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ changeViewPresentationPreferences.setDisposed(true);
+ super.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ /*
+ * Create a grid layout object so the text and treeviewer are layed out the way I want.
+ */
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ xChangeWidget = new XChangeWidget();
+ xChangeWidget.setDisplayLabel(false);
+ xChangeWidget.createWidgets(parent, 1);
+
+ changeViewPresentationPreferences = new ChangeViewPresentationPreferences(this);
+
+ MenuManager menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ MenuManager menuManager = (MenuManager) manager;
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ });
+
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ xChangeWidget.getXViewer().getTree().setMenu(menuManager.createContextMenu(xChangeWidget.getXViewer().getTree()));
+ getSite().registerContextMenu(VIEW_ID, menuManager, xChangeWidget.getXViewer());
+
+ getSite().setSelectionProvider(xChangeWidget.getXViewer());
+ SkynetGuiPlugin.getInstance().setHelp(parent, HELP_CONTEXT_ID);
+ OseeContributionItem.addTo(this, true);
+ }
+
+ private void explore(final Branch branch, final TransactionId transactionId, boolean loadChangeReport) {
+ if (xChangeWidget != null) {
+ this.branch = branch;
+ this.transactionId = transactionId;
+
+ if (branch == null) {
+ String comment = transactionId.getComment() != null ? " - " + transactionId.getComment() : "";
+ setPartName("Change Report: " + transactionId.getBranch().getBranchShortName() + comment);
+ } else {
+ setPartName("Change Report: " + branch.getBranchShortName());
+ }
+
+ xChangeWidget.setInputData(branch, transactionId, loadChangeReport);
+ }
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ private static final String INPUT = "input";
+ private static final String BRANCH_ID = "branchId";
+ private static final String TRANSACTION_NUMBER = "transactionNumber";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
+ */
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ memento = memento.createChild(INPUT);
+ if (branch != null) {
+ memento.putInteger(BRANCH_ID, branch.getBranchId());
+ }
+ if (transactionId != null) {
+ memento.putInteger(TRANSACTION_NUMBER, transactionId.getTransactionNumber());
+ }
+ if (branch != null || transactionId != null) {
+ SkynetViews.addDatabaseSourceId(memento);
+ }
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ try {
+ Integer branchId = null;
+
+ if (memento != null) {
+ memento = memento.getChild(INPUT);
+ if (memento != null) {
+ if (SkynetViews.isSourceValid(memento)) {
+ branchId = memento.getInteger(BRANCH_ID);
+ if (branchId != null) {
+ openViewUpon(BranchManager.getBranch(branchId), null, false);
+ } else {
+ Integer transactionNumber = memento.getInteger(TRANSACTION_NUMBER);
+ if (transactionNumber != null && transactionNumber > -1) {
+ openViewUpon(null, TransactionIdManager.getTransactionId(transactionNumber), false);
+ }
+ }
+ } else {
+ closeView();
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Change report error on init", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, final int branchId) {
+ if (branch == null) return;
+ if (branchId != branch.getBranchId()) return;
+ if (branchModType == BranchEventType.Deleted) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ closeView();
+ }
+ });
+ return;
+ } else if (branchModType == BranchEventType.Committed) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ explore(branch, transactionId, true);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ // refresh view with new branch and transaction id
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ private void closeView() {
+ System.out.println("ID: " + getViewSite().getSecondaryId());
+ SkynetViews.closeView(VIEW_ID, getViewSite().getSecondaryId());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.event.ITransactionsDeletedEventListener#handleTransactionsDeletedEvent(org.eclipse.osee.framework.skynet.core.event.Sender, int[])
+ */
+ @Override
+ public void handleTransactionsDeletedEvent(Sender sender, int[] transactionIds) {
+ if (transactionId == null) {
+ return;
+ }
+
+ for (int transactionNumber : transactionIds) {
+ if (transactionNumber == transactionId.getTransactionNumber()) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ closeView();
+ }
+ });
+ return;
+ }
+ }
+ }
+
+ public void changeShowDocumentOrder(boolean showDocOrder) {
+ if (changeViewPresentationPreferences != null) {
+ changeViewPresentationPreferences.getViewPreference().putBoolean(
+ ChangeViewPresentationPreferences.SHOW_DOC_ORDER, showDocOrder);
+ }
+ }
+
+ /**
+ * @param showArchivedBranches
+ */
+ protected void setShowDocumentOrder(boolean showDocOrder) {
+ xChangeWidget.setShowDocumentOrder(showDocOrder);
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeViewPresentationPreferences.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeViewPresentationPreferences.java
new file mode 100644
index 00000000000..22c0864ee39
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeViewPresentationPreferences.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.framework.ui.skynet.widgets.xchange;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.commandHandlers.change.ToggleChangeViewDocOrderHandler;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class ChangeViewPresentationPreferences {
+ public static final String SHOW_DOC_ORDER = "show doc order";
+
+ private final IPreferencesService preferencesService;
+ private IPreferenceChangeListener preferenceChangeListener;
+ private ChangeView changeView;
+ private boolean disposed;
+
+ public ChangeViewPresentationPreferences(ChangeView changeView) {
+ this.preferencesService = Platform.getPreferencesService();
+ this.preferenceChangeListener = null;
+ this.changeView = changeView;
+ this.disposed = false;
+
+ IEclipsePreferences instanceNode =
+ (IEclipsePreferences) preferencesService.getRootNode().node(InstanceScope.SCOPE);
+
+ try {
+ if (instanceNode.nodeExists(ChangeView.VIEW_ID)) {
+ ((IEclipsePreferences) instanceNode.node(ChangeView.VIEW_ID)).addPreferenceChangeListener(singletonPreferenceChangeListener());
+ }
+ } catch (BackingStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ instanceNode.addNodeChangeListener(new IEclipsePreferences.INodeChangeListener() {
+
+ public void added(NodeChangeEvent event) {
+ if (event.getChild().name().equals(ChangeView.VIEW_ID)) {
+ ((IEclipsePreferences) event.getChild()).addPreferenceChangeListener(singletonPreferenceChangeListener());
+ }
+ }
+
+ public void removed(NodeChangeEvent event) {
+ if (event.getChild().name().equals(ChangeView.VIEW_ID)) {
+ ((IEclipsePreferences) event.getChild()).removePreferenceChangeListener(singletonPreferenceChangeListener());
+ }
+ }
+ });
+
+ loadPreferences();
+ }
+
+ private synchronized IPreferenceChangeListener singletonPreferenceChangeListener() {
+ if (preferenceChangeListener == null) {
+ preferenceChangeListener = new IPreferenceChangeListener() {
+
+ public void preferenceChange(PreferenceChangeEvent event) {
+ if (disposed) {
+ ((IEclipsePreferences) event.getNode()).removePreferenceChangeListener(this);
+ } else {
+ String propertyName = event.getKey();
+
+ refreshCommands();
+
+ if (propertyName.equals(SHOW_DOC_ORDER)) {
+ setShowDocumentOrder(getViewPreference().getBoolean(SHOW_DOC_ORDER, false));
+ }
+ }
+ }
+ };
+ }
+
+ return preferenceChangeListener;
+ }
+
+ private void refreshCommands(){
+ ((ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class)).refreshElements(ToggleChangeViewDocOrderHandler.COMMAND_ID, null);
+ }
+
+ private void loadPreferences() {
+ setShowDocumentOrder(getViewPreference().getBoolean(SHOW_DOC_ORDER, false));
+ }
+
+ private void setShowDocumentOrder(boolean showDocOrder) {
+ changeView.setShowDocumentOrder(showDocOrder);
+ }
+
+ /**
+ * @param disposed the disposed to set
+ */
+ public void setDisposed(boolean disposed) {
+ this.disposed = disposed;
+
+ try {
+ getViewPreference().flush();
+ } catch (BackingStoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Preferences getViewPreference() {
+ return preferencesService.getRootNode().node(InstanceScope.SCOPE).node(ChangeView.VIEW_ID);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewer.java
new file mode 100644
index 00000000000..b05fa559b28
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewer.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.framework.ui.skynet.widgets.xchange;
+
+import java.util.ArrayList;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+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.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.StaticIdManager;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.preferences.EditorsPreferencePage;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ * @author Jeff C. Phillips
+ */
+public class ChangeXViewer extends XViewer {
+ private static final boolean CHANGE_DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Change"));
+
+ private final XChangeWidget xChangeViewer;
+
+ public ChangeXViewer(Composite parent, int style, XChangeWidget xRoleViewer) {
+ super(parent, style, new ChangeXViewerFactory());
+ this.xChangeViewer = xRoleViewer;
+ }
+
+ @Override
+ public void handleDoubleClick() {
+ try {
+ if (getSelectedChanges().size() == 0) return;
+
+ Change change = getSelectedChanges().iterator().next();
+ if (CHANGE_DEBUG) {
+ System.out.println(String.format(
+ "Handling a Double Click in the Change Report Table for a %s Change on Artifact %s ",
+ change.getItemKind(), change.getArtId()));
+ }
+ Artifact artifact = (Artifact) ((IAdaptable) change).getAdapter(Artifact.class);
+
+ if (artifact != null) {
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>(1);
+ artifacts.add(artifact);
+
+ if (StaticIdManager.hasValue(UserManager.getUser(),
+ EditorsPreferencePage.PreviewOnDoubleClickForWordArtifacts)) {
+ RendererManager.previewInJob(artifacts);
+ } else {
+ RendererManager.openInJob(artifacts, PresentationType.GENERALIZED_EDIT);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public ArrayList<Change> getSelectedChanges() {
+ ArrayList<Change> arts = new ArrayList<Change>();
+ TreeItem items[] = getTree().getSelection();
+
+ if (items.length > 0) {
+ for (TreeItem item : items) {
+ arts.add((Change) item.getData());
+ }
+ }
+ return arts;
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ createMenuActions();
+ }
+
+ Action openMergeViewAction;
+
+ public void createMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+
+ openMergeViewAction = new Action("Open Merge View", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ AWorkbench.popup("ERROR", "Not implemented yet");
+ }
+ };
+ }
+
+ public void updateEditMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ // EDIT MENU BLOCK
+ mm.insertBefore(MENU_GROUP_PRE, openMergeViewAction);
+ openMergeViewAction.setEnabled(getSelectedBranches().size() == 1 && getSelectedBranches().iterator().next().isBaselineBranch());
+
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ updateEditMenuActions();
+
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ getLabelProvider().dispose();
+ }
+
+ public ArrayList<Branch> getSelectedBranches() {
+ ArrayList<Branch> arts = new ArrayList<Branch>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) for (TreeItem item : items)
+ arts.add((Branch) item.getData());
+ return arts;
+ }
+
+ /**
+ * @return the xChangeViewer
+ */
+ public XChangeWidget getXChangeViewer() {
+ return xChangeViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewerFactory.java
new file mode 100644
index 00000000000..29026f1264b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/ChangeXViewerFactory.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.framework.ui.skynet.widgets.xchange;
+
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ChangeXViewerFactory extends SkynetXViewerFactory {
+
+ public static XViewerColumn Name =
+ new XViewerColumn("framework.change.artifactNames", "Artifact name(s)", 250, SWT.LEFT, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn Item_Type =
+ new XViewerColumn("framework.change.itemType", "Item Type", 100, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn Item_Kind =
+ new XViewerColumn("framework.change.itemKind", "Item Kind", 70, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn Change_Type =
+ new XViewerColumn("framework.change.changeType", "Change Type", 50, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Is_Value =
+ new XViewerColumn("framework.change.isValue", "Is Value", 150, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn Was_Value =
+ new XViewerColumn("framework.change.wasValue", "Was Value", 150, SWT.LEFT, true, SortDataType.String, false,
+ null);
+ public static XViewerColumn Artifact_Type =
+ new XViewerColumn("framework.change.artifactType", "Artifact Type", 75, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Hrid =
+ new XViewerColumn("framework.change.hrid", "HRID", 50, SWT.LEFT, false, SortDataType.String, false, null);
+ public static XViewerColumn lastModDate =
+ new XViewerColumn("attribute.Last Modified Date", "Last Modified Date", 50, SWT.LEFT, false, SortDataType.String, false, null);
+ public static XViewerColumn paraNumber =
+ new XViewerColumn("attribute.Imported Paragraph Number", "Imported Paragraph Number", 50, SWT.LEFT, false, SortDataType.Paragraph_Number, false, null);
+
+ public static String NAMESPACE = "osee.skynet.gui.ChangeXViewer";
+
+ public ChangeXViewerFactory() {
+ super(NAMESPACE);
+ registerColumn(Name, Item_Type, Item_Kind, Change_Type, Is_Value, Was_Value, Artifact_Type, Hrid, paraNumber, lastModDate);
+ registerAllAttributeColumns();
+ }
+
+ public XViewerSorter createNewXSorter(XViewer xViewer) {
+ return new XViewerSorter(xViewer);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/DefaultHierSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/DefaultHierSorter.java
new file mode 100644
index 00000000000..bb4e8177050
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/DefaultHierSorter.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.framework.ui.skynet.widgets.xchange;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+
+/**
+ * @author Jeff C. Phillips
+ */
+public class DefaultHierSorter {
+ private Map<Artifact, Set<Artifact>> childrenMap;
+ private ArrayList<Artifact> orderedList;
+ private Set<Artifact> orginalList;
+
+ public List<Artifact> sort(Collection<Artifact> artifacts) throws OseeCoreException {
+ childrenMap = new HashMap<Artifact, Set<Artifact>>();
+ orderedList = new ArrayList<Artifact>();
+ orginalList = new HashSet<Artifact>();
+
+ if(artifacts.isEmpty()){
+ return orderedList;
+ }
+
+ for (Artifact artifact : artifacts) {
+ createAncestorTree(artifact);
+ orginalList.add(artifact);
+ }
+
+ orderChildren(ArtifactQuery.getDefaultHierarchyRootArtifact(artifacts.iterator().next().getBranch()));
+ addDeletedArtifacts();
+
+ if (artifacts.size() != orderedList.size()) {
+ throw new OseeCoreException("Error in sorting artifacts");
+ }
+
+ return orderedList;
+ }
+
+ private void addDeletedArtifacts() {
+ for (Artifact artifact : orderedList) {
+ if (orginalList.contains(artifact)) {
+ orginalList.remove(artifact);
+ }
+ }
+
+ orderedList.addAll(orginalList);
+ }
+
+ private void orderChildren(Artifact parent) throws OseeCoreException {
+ if (orginalList.contains(parent)) {
+ orderedList.add(parent);
+ }
+
+ if (childrenMap.get(parent) == null) {
+ return;
+ }
+
+ if (childrenMap.get(parent).size() > 1) {
+ for (Artifact child : parent.getChildren(true)) {
+ if (childrenMap.get(parent).contains(child)) {
+ orderChildren(child);
+ }
+ }
+ } else if ((childrenMap.get(parent).size() == 1)) {
+ orderChildren(childrenMap.get(parent).iterator().next());
+ }
+ }
+
+ private void createAncestorTree(Artifact child) throws OseeCoreException {
+ Artifact parent = child.getParent();
+
+ while (parent != null) {
+ if (!insertChild(parent, child)) {
+ return;
+ }
+
+ child = parent;
+ parent = child.getParent();
+
+ if (parent != null) {
+ createAncestorTree(parent);
+ }
+ }
+ }
+
+ private boolean insertChild(Artifact parent, Artifact child) {
+ Set<Artifact> children = childrenMap.get(parent);
+ if (children == null) {
+ children = new HashSet<Artifact>();
+ childrenMap.put(parent, children);
+ }
+ return children.add(child);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeContentProvider.java
new file mode 100644
index 00000000000..a58c77df38f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeContentProvider.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xchange;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.change.ArtifactChanged;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+
+public class XChangeContentProvider implements ITreeContentProvider {
+ private final ChangeXViewer changeXViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+ private Map<Artifact, ArtifactChanged> artifactToChangeMap;
+ private ArrayList<ArtifactChanged> docOrderedChnages;
+ private boolean showDocOrder;
+
+ public XChangeContentProvider(ChangeXViewer commitXViewer) {
+ super();
+ this.changeXViewer = commitXViewer;
+ this.showDocOrder = true;
+ this.artifactToChangeMap = new HashMap<Artifact, ArtifactChanged>();
+ this.docOrderedChnages = new ArrayList<ArtifactChanged>();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ if(showDocOrder){
+ try {
+ return getDocOrderedChanges((Collection<Change>) parentElement);
+ } catch (OseeCoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return ((Collection<?>) parentElement).toArray();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ private Object[] getDocOrderedChanges(Collection<Change> changes) throws OseeCoreException {
+ Set<Artifact> artifacts = new HashSet<Artifact>();
+
+ if (docOrderedChnages.size() < 1) {
+ for (Object object : changes) {
+ if (object instanceof ArtifactChanged) {
+ ArtifactChanged artifactChanged = (ArtifactChanged)object;
+ Artifact artifact = artifactChanged.getArtifact();
+ if (artifact != null) {
+ artifacts.add(artifact);
+ artifactToChangeMap.put(artifact, artifactChanged);
+ }
+ }
+ }
+
+ DefaultHierSorter sorter = new DefaultHierSorter();
+
+ for(Artifact artifact : sorter.sort(artifacts)){
+ docOrderedChnages.add(artifactToChangeMap.get(artifact));
+ }
+ }
+
+ return docOrderedChnages.toArray();
+ }
+
+ public void refeshDocOrder(){
+ if(docOrderedChnages.size() > 1){
+ docOrderedChnages.clear();
+ }
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof Collection) return true;
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /**
+ * @param showDocOrder the showDocOrder to set
+ */
+ public void setShowDocOrder(boolean showDocOrder) {
+ this.showDocOrder = showDocOrder;
+ }
+
+ /**
+ * @return the changeXViewer
+ */
+ public ChangeXViewer getChangeXViewer() {
+ return changeXViewer;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeLabelProvider.java
new file mode 100644
index 00000000000..63833f3b988
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeLabelProvider.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.framework.ui.skynet.widgets.xchange;
+
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerCells;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+public class XChangeLabelProvider extends XViewerLabelProvider {
+
+ Font font = null;
+ private final ChangeXViewer changeXViewer;
+
+ public XChangeLabelProvider(ChangeXViewer changeXViewer) {
+ super(changeXViewer);
+ this.changeXViewer = changeXViewer;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn cCol, int columnIndex) throws OseeCoreException {
+ try {
+ if (!(element instanceof Change)) return "";
+ Change change = (Change) element;
+ if (cCol.equals(ChangeXViewerFactory.Name)) {
+ return change.getName();
+ } else if (cCol.equals(ChangeXViewerFactory.Change_Type)) {
+ return change.getModificationType().getDisplayName();
+ } else if (cCol.equals(ChangeXViewerFactory.Item_Kind)) {
+ return change.getItemKind();
+ } else if (cCol.equals(ChangeXViewerFactory.Item_Type)) {
+ return change.getItemTypeName();
+ } else if (cCol.equals(ChangeXViewerFactory.Is_Value)) {
+ return change.getIsValue();
+ } else if (cCol.equals(ChangeXViewerFactory.Was_Value)) {
+ return change.getWasValue();
+ } else if (cCol.equals(ChangeXViewerFactory.Artifact_Type)) {
+ return change.getArtifact().getArtifactTypeName();
+ } else if (cCol.equals(ChangeXViewerFactory.Hrid)) {
+ return change.getArtifact().getHumanReadableId();
+ } else if (cCol.equals(ChangeXViewerFactory.lastModDate)) {
+ return String.valueOf(change.getArtifact().getLastModified());
+ } else if (cCol.equals(ChangeXViewerFactory.paraNumber)) {
+ String paragraphNum = "";
+
+ if (change.getArtifact().isAttributeTypeValid("Imported Paragraph Number")) {
+ paragraphNum = change.getArtifact().getSoleAttributeValue("Imported Paragraph Number", "");
+ }
+ return paragraphNum;
+ }
+ } catch (Exception ex) {
+ return XViewerCells.getCellExceptionString(ex);
+ }
+ return "unhandled column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public ChangeXViewer getTreeViewer() {
+ return changeXViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn xCol, int columnIndex) throws OseeCoreException {
+ try {
+ if (!(element instanceof Change)) return null;
+ Change change = (Change) element;
+ if (xCol.equals(ChangeXViewerFactory.Name)) {
+ try {
+ return ImageManager.getChangeKindImage(change);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else if (xCol.equals(ChangeXViewerFactory.Item_Type)) {
+ return ImageManager.getChangeTypeImage(change);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeWidget.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeWidget.java
new file mode 100644
index 00000000000..43abe49d40d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xchange/XChangeWidget.java
@@ -0,0 +1,437 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xchange;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+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.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.revision.ChangeManager;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.status.SwtStatusMonitor;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetDragAndDrop;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Donald G. Dunne
+ * @author Jeff C. Phillips
+ */
+public class XChangeWidget extends XWidget implements IActionable {
+
+ private ChangeXViewer xChangeViewer;
+ private XChangeContentProvider contentProvider;
+ public final static String normalColor = "#EEEEEE";
+ private static final String LOADING = "Loading ...";
+ private static final String NOT_CHANGES = "No changes were found";
+ protected Label extraInfoLabel;
+ private Branch branch;
+ private TransactionId transactionId;
+
+ /**
+ * @param label
+ */
+ public XChangeWidget() {
+ super("Change Report");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createWidgets(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ if (toolkit != null) toolkit.paintBordersFor(mainComp);
+
+ try {
+ createTaskActionBar(mainComp);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+
+ xChangeViewer = new ChangeXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ xChangeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ contentProvider = new XChangeContentProvider(xChangeViewer);
+ xChangeViewer.setContentProvider(contentProvider);
+ xChangeViewer.setLabelProvider(new XChangeLabelProvider(xChangeViewer));
+
+ if (toolkit != null) toolkit.adapt(xChangeViewer.getStatusLabel(), false, false);
+
+ Tree tree = xChangeViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 100;
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ new ChangeDragAndDrop(tree, ChangeXViewerFactory.NAMESPACE);
+ }
+
+ public void createTaskActionBar(Composite parent) throws OseeCoreException {
+
+ // Button composite for state transitions, etc
+ Composite composite = new Composite(parent, SWT.NONE);
+ // bComp.setBackground(mainSComp.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite leftComp = new Composite(composite, SWT.NONE);
+ leftComp.setLayout(new GridLayout());
+ leftComp.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(leftComp, SWT.NONE);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("\n");
+
+ Composite rightComp = new Composite(composite, SWT.NONE);
+ rightComp.setLayout(new GridLayout());
+ rightComp.setLayoutData(new GridData(GridData.END));
+
+ ToolBar toolBar = new ToolBar(rightComp, SWT.FLAT | SWT.RIGHT);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ toolBar.setLayoutData(gd);
+ ToolItem item = null;
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.REFRESH));
+ item.setToolTipText("Refresh");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ contentProvider.refeshDocOrder();
+ setInputData(branch, transactionId, true);
+ }
+ });
+
+ item = new ToolItem(toolBar, SWT.PUSH);
+ item.setImage(ImageManager.getImage(FrameworkImage.CUSTOMIZE));
+ item.setToolTipText("Customize Table");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ xChangeViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ });
+
+ associatedArtifactToolItem = new ToolItem(toolBar, SWT.PUSH);
+ associatedArtifactToolItem.setImage(ImageManager.getImage(FrameworkImage.EDIT));
+ associatedArtifactToolItem.setToolTipText("Open Associated Artifact");
+ associatedArtifactToolItem.setEnabled(false);
+ associatedArtifactToolItem.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ Artifact associatedArtifact = null;
+ if (branch != null) {
+ associatedArtifact = branch.getAssociatedArtifact();
+ } else if (transactionId != null) {
+ associatedArtifact =
+ ArtifactQuery.getArtifactFromId(transactionId.getCommitArtId(), BranchManager.getCommonBranch());
+ }
+ if (associatedArtifact == null) {
+ AWorkbench.popup("ERROR", "Can not access associated artifact.");
+ } else {
+ RendererManager.openInJob(associatedArtifact, PresentationType.GENERALIZED_EDIT);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ OseeAts.addButtonToEditorToolBar(this, SkynetGuiPlugin.getInstance(), toolBar, ChangeView.VIEW_ID,
+ "Change Report");
+ }
+
+ private ToolItem associatedArtifactToolItem;
+
+ private void refreshAssociatedArtifact() throws OseeCoreException {
+ try {
+ Artifact associatedArtifact = null;
+ if (branch != null) {
+ associatedArtifact = branch.getAssociatedArtifact();
+ } else if (transactionId != null && transactionId.getCommitArtId() != 0) {
+ associatedArtifact =
+ ArtifactQuery.getArtifactFromId(transactionId.getCommitArtId(), BranchManager.getCommonBranch());
+ }
+ if (associatedArtifact != null && !(associatedArtifact instanceof User)) {
+ associatedArtifactToolItem.setImage(ImageManager.getImage(associatedArtifact));
+ associatedArtifactToolItem.setEnabled(true);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void loadTable() {
+ refresh();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<Branch> getSelectedBranches() {
+ ArrayList<Branch> items = new ArrayList<Branch>();
+ if (xChangeViewer == null) return items;
+ if (xChangeViewer.getSelection().isEmpty()) return items;
+ Iterator i = ((IStructuredSelection) xChangeViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ items.add((Branch) obj);
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ return xChangeViewer.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ xChangeViewer.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ xChangeViewer.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ contentProvider.refeshDocOrder();
+ xChangeViewer.refresh();
+ validate();
+ }
+
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.simplePage("Unhandled");
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public ChangeXViewer getXViewer() {
+ return xChangeViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return xChangeViewer.getInput();
+ }
+
+ public void setInputData(final Branch branch, final TransactionId transactionId, final boolean loadChangeReport) {
+ this.branch = branch;
+ this.transactionId = transactionId;
+
+ extraInfoLabel.setText(LOADING);
+
+ Job job = new Job("Open Change View") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final boolean hasBranch = branch != null;
+ final Collection<Change> changes = new ArrayList<Change>();
+ SwtStatusMonitor swtMonitor = new SwtStatusMonitor(monitor);
+
+ try {
+ if (loadChangeReport) {
+ changes.addAll((hasBranch ? ChangeManager.getChangesPerBranch(branch, swtMonitor) : ChangeManager.getChangesPerTransaction(
+ transactionId, swtMonitor)));
+ }
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (loadChangeReport) {
+ if (changes.size() == 0) {
+ extraInfoLabel.setText(NOT_CHANGES);
+ xChangeViewer.setInput(changes);
+ } else {
+ String infoLabel =
+ String.format(
+ "Changes %s to branch: %s\n%s",
+ hasBranch || transactionId.getComment() == null ? "made" : "committed",
+ hasBranch ? branch : "(" + transactionId.getTransactionNumber() + ") " + transactionId.getBranch(),
+ hasBranch || transactionId.getComment() == null ? "" : "Comment: " + transactionId.getComment());
+ extraInfoLabel.setText(infoLabel);
+ xChangeViewer.setInput(changes);
+ }
+ try {
+ refreshAssociatedArtifact();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else {
+ extraInfoLabel.setText("Cleared on shut down - press refresh to reload");
+ }
+ }
+ });
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getReportData()
+ */
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#getXmlData()
+ */
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.XWidget#setXmlData(java.lang.String)
+ */
+ @Override
+ public void setXmlData(String str) {
+ }
+ public class ChangeDragAndDrop extends SkynetDragAndDrop {
+
+ public ChangeDragAndDrop(Tree tree, String viewId) {
+ super(tree, viewId);
+ }
+
+ @Override
+ public void performDragOver(DropTargetEvent event) {
+ event.detail = DND.DROP_NONE;
+ }
+
+ @Override
+ public Artifact[] getArtifacts() {
+ IStructuredSelection selection = (IStructuredSelection) xChangeViewer.getSelection();
+ ArrayList<Artifact> artifacts = new ArrayList<Artifact>();
+
+ if (selection != null && !selection.isEmpty()) {
+ for (Object object : selection.toArray()) {
+
+ if (object instanceof IAdaptable) {
+ Artifact artifact = (Artifact) ((IAdaptable) object).getAdapter(Artifact.class);
+
+ if (artifact != null) {
+ artifacts.add(artifact);
+ }
+ }
+ }
+ }
+ return artifacts.toArray(new Artifact[artifacts.size()]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ StringBuffer sb = new StringBuffer();
+ if (branch != null) sb.append("\nBranch: " + branch);
+ if (transactionId != null) sb.append("\nTransaction Id: " + transactionId.getTransactionNumber());
+ return sb.toString();
+ }
+
+ public TransactionId getTransactionId() throws OseeCoreException {
+ return transactionId;
+ }
+
+ /**
+ * @return the branch
+ */
+ public Branch getBranch() {
+ return branch;
+ }
+
+ /**
+ * @param showDocOrder
+ */
+ public void setShowDocumentOrder(boolean showDocOrder) {
+ if (contentProvider != null) {
+ contentProvider.setShowDocOrder(showDocOrder);
+ refresh();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeUtility.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeUtility.java
new file mode 100644
index 00000000000..f21786d6c42
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeUtility.java
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xmerge;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactPersistenceManager;
+import org.eclipse.osee.framework.skynet.core.attribute.WordAttribute;
+import org.eclipse.osee.framework.skynet.core.conflict.ArtifactConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.render.VbaWordDiffGenerator;
+import org.eclipse.osee.framework.ui.skynet.revert.RevertWizard;
+import org.eclipse.osee.framework.ui.swt.NonmodalWizardDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Theron Virgin
+ */
+public class MergeUtility {
+ /*
+ * This has all of the GUI prompts that help a user know what's going on
+ * when they set a merge.
+ */
+ public static final String CLEAR_PROMPT =
+ "This attribute has had Merge changes made are you sure you want to overwrite them? All changes will be lost.";
+ public static final String COMMITED_PROMPT =
+ "You can not change the value for a conflict that has been marked resolved or has already been commited. Change the conflict status if the source branch has not been commited and you wish to modify the value.";
+ public static final String ARTIFACT_DELETED_PROMPT =
+ "This Artifact has been changed on the source branch, but has been deleted on the destination branch. In order to commit this branch and resolve this conflict the Artifact will need to be reverted on the source branch. \n\nReverting the artifact is irreversible and you will need to restart OSEE after reverting to see changes.";
+ public static final String ATTRIBUTE_DELETED_PROMPT =
+ "This Attribute has been changed on the source branch, but has been deleted on the destination branch. In order to commit this branch and resolve this conflict the Attribute will need to be reverted on the source branch. \n\nReverting the attribute is irreversible and you will need to restart OSEE after reverting to see changes.";
+ public static final String INFORMATIONAL_CONFLICT =
+ "This Item has been deleted on the Source Branch, but has been changed on the destination branch. This conflict is informational only and will not prevent your from commiting, however when you commit it will delete the item on the destination branch.";
+ public static final String OPEN_MERGE_DIALOG =
+ "This will open a window that will allow in-document merging in Word. You will need to right click on every difference and either accept or reject the change. If you begin an in-document merge you will not be able to finalize the conflict until you resolve every change in the document.\n Computing a Merge will wipe out any merge changes you have made and start with a fresh diff of the two files. If you want to only view the changes use the difference options.\n Change that touch the entire file are better handled using copy and paste. \n\nWARNING: Word will occasionaly show incorrect changes especially when users have both modified the same block of text. Check your final version.";
+
+ private static final Pattern authorPattern =
+ Pattern.compile("aml:author=\".*?\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern rsidRootPattern =
+ Pattern.compile("\\</wsp:rsids\\>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern findSetRsids =
+ Pattern.compile("wsp:rsidR=\".*?\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern findSetRsidRPR =
+ Pattern.compile("wsp:rsidRPr=\".*?\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern findSetRsidP =
+ Pattern.compile("wsp:rsidP=\".*?\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern findSetRsidRDefault =
+ Pattern.compile("wsp:rsidRDefault=\".*?\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern amlTerminatingDefault =
+ Pattern.compile("aml:id[^\\>]*?/", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern annotationTag =
+ Pattern.compile("(<aml:annotation[^\\>]*?[^/]\\>)|(</aml:annotation\\>)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+
+ private static final Pattern rsidPattern = Pattern.compile("wsp:rsid(RPr|P|R)=\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Merge"));
+
+ public static void clearValue(Conflict conflict, Shell shell, boolean prompt) throws MultipleArtifactsExist, ArtifactDoesNotExist, Exception {
+ if (conflict == null) return;
+ if (okToOverwriteEditedValue(conflict, shell, prompt)) {
+ conflict.clearValue();
+ }
+ }
+
+ public static void setToDest(Conflict conflict, Shell shell, boolean prompt) throws MultipleArtifactsExist, ArtifactDoesNotExist, Exception {
+ if (conflict == null) return;
+ if (okToOverwriteEditedValue(conflict, shell, prompt)) {
+ conflict.setToDest();
+ }
+ }
+
+ public static void setToSource(Conflict conflict, Shell shell, boolean prompt) throws MultipleArtifactsExist, ArtifactDoesNotExist, Exception {
+ if (conflict == null) return;
+ if (okToOverwriteEditedValue(conflict, shell, prompt)) {
+ conflict.setToSource();
+ }
+ }
+
+ public static boolean okToOverwriteEditedValue(Conflict conflict, Shell shell, boolean prompt) throws MultipleArtifactsExist, ArtifactDoesNotExist, Exception {
+ boolean proceed = true;
+ if (!conflict.statusEditable()) {
+ MessageDialog.openInformation(shell, "Attention", COMMITED_PROMPT);
+ return false;
+ }
+ if (!(conflict.mergeEqualsDestination() || conflict.mergeEqualsSource() || conflict.statusUntouched()) && prompt) {
+ proceed = MessageDialog.openConfirm(shell, "Confirm", CLEAR_PROMPT);
+ }
+ return proceed;
+ }
+
+ /*
+ * This is not in the AttributeConflict because it relies on the renderer
+ * that is in not in the skynet core package.
+ */
+ public static String showCompareFile(Artifact art1, Artifact art2, String fileName) throws Exception {
+ if (art1 == null || art2 == null) return " ";
+ return RendererManager.diff(art1, art2, true, new VariableMap("fileName", fileName));
+ }
+
+ /*
+ * This is not in the AttributeConflict because it relies on the renderer
+ * that is in not in the skynet core package.
+ */
+ public static String CreateMergeDiffFile(Artifact art1, Artifact art2, String fileName) throws Exception {
+ if (art1 == null || art2 == null) return " ";
+ return RendererManager.merge(art1, art2, fileName, false);
+ }
+
+ /*
+ * This is not in the AttributeConflict because it relies on the renderer
+ * that is in not in the skynet core package.
+ */
+ public static void mergeEditableDiffFiles(Artifact art1, String art1FileName, String art2FileName, String fileName, boolean show, boolean editable) throws Exception {
+ if (art1 == null) return;
+ RendererManager.merge(art1, null, AIFile.constructIFile(art1FileName), AIFile.constructIFile(art2FileName),
+ fileName.substring(fileName.lastIndexOf('\\') + 1), show);
+ }
+
+ public static Artifact getStartArtifact(Conflict conflict) {
+ try {
+ if (conflict.getSourceBranch() == null) return null;
+ TransactionId id = TransactionIdManager.getStartEndPoint(conflict.getSourceBranch()).getKey();
+ return ArtifactPersistenceManager.getInstance().getArtifact(conflict.getArtifact().getGuid(), id);
+
+ } catch (Exception ex) {
+ OseeLog.log(MergeUtility.class, Level.SEVERE, ex);
+ }
+ return null;
+ }
+
+ /**
+ * @param conflict
+ */
+ public static boolean showDeletedConflict(Conflict conflict, Shell shell) {
+ if (conflict.getConflictType().equals(ConflictType.ARTIFACT)) {
+ return showArtifactDeletedConflict(conflict, shell);
+ } else if (conflict.getConflictType().equals(ConflictType.ATTRIBUTE)) {
+ return showAttributeDeletedConflict(conflict, shell);
+ }
+ return false;
+ }
+
+ /**
+ * @param conflict
+ */
+ public static boolean showArtifactDeletedConflict(Conflict conflict, Shell shell) {
+ if (conflict.getConflictType().equals(ConflictType.ARTIFACT)) {
+ MessageDialog dialog =
+ new MessageDialog(shell, "Unresovable Conflict", null, ARTIFACT_DELETED_PROMPT, 1, new String[] {
+ "Revert Source Artifact", "Handle Later"}, 1);
+ if (dialog.open() == 0) {
+ try {
+ List<List<Artifact>> artifacts = new LinkedList<List<Artifact>>();
+
+ List<Artifact> artifactList = new LinkedList<Artifact>();
+ artifactList.add(((ArtifactConflict) conflict).getSourceArtifact());
+ artifacts.add(artifactList);
+ RevertWizard wizard = new RevertWizard(artifacts);
+ NonmodalWizardDialog dialog2 = new NonmodalWizardDialog(Display.getCurrent().getActiveShell(), wizard);
+ dialog2.create();
+ dialog2.open();
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(MergeUtility.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param conflict
+ */
+ public static boolean showAttributeDeletedConflict(Conflict conflict, Shell shell) {
+ if (conflict.getConflictType().equals(ConflictType.ATTRIBUTE)) {
+ MessageDialog dialog =
+ new MessageDialog(shell, "Unresovable Conflict", null, ATTRIBUTE_DELETED_PROMPT, 1, new String[] {
+ "Revert Source Attribute", "Handle Later"}, 1);
+ if (dialog.open() == 0) {
+ try {
+ ((AttributeConflict) conflict).revertSourceAttribute();
+ return true;
+ } catch (Exception ex) {
+ OseeLog.log(MergeUtility.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return false;
+ }
+
+ public static boolean showInformationalConflict(Shell shell) {
+ MessageDialog dialog =
+ new MessageDialog(shell, "Informational Conflict", null, INFORMATIONAL_CONFLICT, 2, new String[] {"OK"}, 1);
+ dialog.open();
+ return false;
+ }
+
+ public static void launchMerge(final AttributeConflict attributeConflict, Shell shell) {
+
+ try {
+ if (attributeConflict.getAttribute() instanceof WordAttribute) {
+ if (!attributeConflict.statusEditable()) {
+ MessageDialog.openInformation(shell, "Attention", COMMITED_PROMPT);
+ return;
+ }
+ String[] buttons;
+ if (attributeConflict.mergeEqualsSource() || attributeConflict.mergeEqualsDestination() || attributeConflict.statusUntouched()) {
+ buttons = new String[] {"Begin New Merge", "Show Help", "Cancel"};
+ } else {
+ buttons = new String[] {"Continue with last Merge", "Begin New Merge", "Show Help", "Cancel"};
+ }
+
+ MessageDialog dialog =
+ new MessageDialog(Display.getCurrent().getActiveShell().getShell(), "Merge Word Artifacts", null,
+ OPEN_MERGE_DIALOG, 4, buttons, 2);
+ int response = dialog.open();
+ if (buttons.length == 3) {
+ response++;
+ }
+ if (response == 2) {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(
+ "/org.eclipse.osee.framework.ui.skynet/reference/Merge_Manager.html");
+ } else if (response == 1) {
+
+ Job job = new Job("Generate 3 Way Merge") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ try {
+ int gamma = attributeConflict.getAttribute().getGammaId();
+ monitor.beginTask("Generate 3 Way Merge", 100);
+ VbaWordDiffGenerator generator = new VbaWordDiffGenerator();
+ generator.initialize(false, false);
+ monitor.worked(5);
+ String sourceChangeFile =
+ MergeUtility.CreateMergeDiffFile(getStartArtifact(attributeConflict),
+ attributeConflict.getSourceArtifact(), null);
+ monitor.worked(15);
+ String destChangeFile =
+ MergeUtility.CreateMergeDiffFile(getStartArtifact(attributeConflict),
+ attributeConflict.getDestArtifact(), null);
+ monitor.worked(15);
+ changeAuthorinWord("Source", sourceChangeFile, 2, "12345678", "55555555");
+ changeAuthorinWord("Destination", destChangeFile, 2, "56781234", "55555555");
+ monitor.worked(15);
+ MergeUtility.mergeEditableDiffFiles(
+ attributeConflict.getArtifact(),
+ sourceChangeFile,
+ destChangeFile,
+ "Source_Dest_Merge_" + attributeConflict.getArtifact().getSafeName() + "(" + attributeConflict.getArtifact().getGuid() + ")" + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml", false, true);
+
+ monitor.worked(40);
+ attributeConflict.markStatusToReflectEdit();
+
+ int maxCount = 5;
+ int counter = 0;
+ while (gamma == attributeConflict.getAttribute().getGammaId() && counter++ != maxCount) {
+ Thread.sleep(500);
+ }
+ monitor.done();
+ RendererManager.openInJob(attributeConflict.getArtifact(), PresentationType.SPECIALIZED_EDIT);
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.startJob(job);
+
+ } else if (response == 0) {
+ RendererManager.openInJob(attributeConflict.getArtifact(), PresentationType.SPECIALIZED_EDIT);
+ attributeConflict.markStatusToReflectEdit();
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ protected static void changeAuthorinWord(String newAuthor, String fileName, int revisionNumber, String rsidNumber, String baselineRsid) throws Exception {
+ String fileValue = AFile.readFile(fileName);
+
+ Matcher m = authorPattern.matcher(fileValue);
+ while (m.find()) {
+ String name = m.group();
+ fileValue = fileValue.replace(name, "aml:author=\"" + newAuthor + "\"");
+ }
+
+ m = findSetRsids.matcher(fileValue);
+ while (m.find()) {
+ String rev = m.group();
+ fileValue = fileValue.replace(rev, "wsp:rsidR=\"" + baselineRsid + "\"");
+ }
+ m = findSetRsidRPR.matcher(fileValue);
+ while (m.find()) {
+ String rev = m.group();
+ fileValue = fileValue.replace(rev, "wsp:rsidRPr=\"" + baselineRsid + "\"");
+ }
+ m = findSetRsidP.matcher(fileValue);
+ while (m.find()) {
+ String rev = m.group();
+ fileValue = fileValue.replace(rev, "wsp:rsidP=\"" + baselineRsid + "\"");
+ }
+ m = findSetRsidRDefault.matcher(fileValue);
+ while (m.find()) {
+ String rev = m.group();
+ fileValue = fileValue.replace(rev, "wsp:rsidRDefault=\"" + baselineRsid + "\"");
+ }
+
+ resetRsidIds(fileValue, rsidNumber, baselineRsid, fileName);
+ }
+
+ private static void resetRsidIds(String fileValue, String rsidNumber, String baselineRsid, String fileName) throws IOException{
+ ChangeSet changeSet = new ChangeSet(fileValue);
+ Matcher matcher = annotationTag.matcher(fileValue);
+
+ while (matcher.find()) {
+ int startIndex = matcher.start();
+ int level = 1;
+
+ do {
+ matcher.find();
+
+ if (matcher.group().startsWith("<aml:annotation")) {
+ level++;
+ } else {
+ level--;
+ }
+ } while (level != 0);
+
+ Matcher rsidMatcher = rsidPattern.matcher(fileValue);
+
+ while (rsidMatcher.find(startIndex) && rsidMatcher.end() <= matcher.end()) {
+ changeSet.replace(rsidMatcher.start(2), rsidMatcher.end(2) -1, rsidNumber);
+ startIndex = rsidMatcher.end();
+ }
+ }
+
+ Matcher m = rsidRootPattern.matcher(fileValue);
+ while (m.find()) {
+ changeSet.replace(m.start(), m.end() - 1, "<wsp:rsid wsp:val=\"" + baselineRsid + "\"/></wsp:rsids>");
+ }
+
+ changeSet.applyChanges(new File(fileName));
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeView.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeView.java
new file mode 100644
index 00000000000..5a766a9bf89
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeView.java
@@ -0,0 +1,1019 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xmerge;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+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.dialogs.MessageDialog;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.conflict.ArtifactConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.AttributeConflict;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.event.BranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IBranchEventListener;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionIdManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.AbstractSelectionEnabledHandler;
+import org.eclipse.osee.framework.ui.plugin.util.Commands;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ArtifactExplorer;
+import org.eclipse.osee.framework.ui.skynet.OseeContributionItem;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
+import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
+import org.eclipse.osee.framework.ui.skynet.util.SkynetViews;
+import org.eclipse.osee.framework.ui.skynet.widgets.xHistory.HistoryView;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.menus.CommandContributionItem;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @see ViewPart
+ * @author Donald G. Dunne
+ */
+public class MergeView extends ViewPart implements IActionable, IBranchEventListener, IFrameworkTransactionEventListener {
+ private static final AccessControlManager accessControlManager = AccessControlManager.getInstance();
+ public static final String VIEW_ID = "org.eclipse.osee.framework.ui.skynet.widgets.xmerge.MergeView";
+ public static String HELP_CONTEXT_ID = "Merge_Manager_View";
+ private XMergeViewer xMergeViewer;
+ private Conflict[] conflicts;
+ private static final boolean DEBUG =
+ "TRUE".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.osee.framework.ui.skynet/debug/Merge"));
+ private IHandlerService handlerService;
+ private Branch sourceBranch;
+ private Branch destBranch;
+ private TransactionId transactionId;
+ private TransactionId commitTrans;
+ private boolean showConflicts;
+
+ // private CompleteCommitAction commitAction;
+
+ public static void openView(final Branch sourceBranch, final Branch destBranch, final TransactionId tranId) {
+ if (sourceBranch == null && destBranch == null && tranId == null) throw new IllegalArgumentException(
+ "Branch's and Transaction ID can't be null");
+ if (DEBUG && sourceBranch != null && destBranch != null) {
+ System.out.println(String.format("Openeing Merge View with Source Branch: %s and Destination Branch: %s",
+ sourceBranch.getBranchName(), destBranch.getBranchName()));
+ }
+ openViewUpon(sourceBranch, destBranch, tranId, null, true);
+ }
+
+ public static void openView(final TransactionId commitTrans) {
+ if (commitTrans == null) throw new IllegalArgumentException("Commit Transaction ID can't be null");
+ if (DEBUG) {
+ System.out.println(String.format("Openeing Merge View with Transaction ID: %d ",
+ commitTrans.getTransactionNumber()));
+ }
+ openViewUpon(null, null, null, commitTrans, true);
+ }
+
+ private static void openViewUpon(final Branch sourceBranch, final Branch destBranch, final TransactionId tranId, final TransactionId commitTrans, final boolean showConflicts) {
+ Job job = new Job("Open Merge View") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ try {
+ IWorkbenchPage page = AWorkbench.getActivePage();
+ IViewPart viewPart =
+ page.showView(
+ MergeView.VIEW_ID,
+ String.valueOf(sourceBranch != null ? sourceBranch.getBranchId() * 100000 + destBranch.getBranchId() : commitTrans.getTransactionNumber()),
+ IWorkbenchPage.VIEW_ACTIVATE);
+ if (viewPart instanceof MergeView) {
+ MergeView mergeView = (MergeView) viewPart;
+ mergeView.showConflicts = showConflicts;
+ mergeView.explore(sourceBranch, destBranch, tranId, commitTrans, showConflicts);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.startJob(job);
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ if (xMergeViewer != null) {
+ xMergeViewer.setFocus();
+ }
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ /*
+ * Create a grid layout object so the text and treeviewer are layed out the way I want.
+ */
+
+ PlatformUI.getWorkbench().getService(IHandlerService.class);
+ handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+ xMergeViewer = new XMergeViewer();
+ xMergeViewer.setDisplayLabel(false);
+ xMergeViewer.createWidgets(parent, 1);
+
+ if (conflicts != null) xMergeViewer.setConflicts(conflicts);
+ MenuManager menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ MenuManager menuManager = (MenuManager) manager;
+ fillPopupMenu(menuManager);
+ }
+
+ private void fillPopupMenu(MenuManager menuManager) {
+ addEditArtifactMenuItem(menuManager);
+ addMergeMenuItem(menuManager);
+ menuManager.add(new Separator());
+ addPreviewMenuItem(menuManager);
+ addDiffMenuItem(menuManager);
+ menuManager.add(new Separator());
+ addSourceResourceHistoryMenuItem(menuManager);
+ addSourceRevealMenuItem(menuManager);
+ menuManager.add(new Separator());
+ addDestResourceHistoryMenuItem(menuManager);
+ addDestRevealMenuItem(menuManager);
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+ });
+
+ xMergeViewer.getXViewer().getTree().setMenu(menuManager.createContextMenu(xMergeViewer.getXViewer().getTree()));
+
+ createEditArtifactMenuItem(menuManager);
+ createMergeMenuItem(menuManager);
+ menuManager.add(new Separator());
+ createPreviewMenuItem(menuManager);
+ createDiffMenuItem(menuManager);
+ menuManager.add(new Separator());
+ createSourceResourceHistoryMenuItem(menuManager);
+ createSourceRevealMenuItem(menuManager);
+ menuManager.add(new Separator());
+ createDestinationResourceHistoryMenuItem(menuManager);
+ createDestinationRevealMenuItem(menuManager);
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+
+ OseeContributionItem.addTo(this, true);
+ getSite().registerContextMenu("org.eclipse.osee.framework.ui.skynetd.widgets.xmerge.MergeView", menuManager,
+ xMergeViewer.getXViewer());
+
+ getSite().setSelectionProvider(xMergeViewer.getXViewer());
+ SkynetGuiPlugin.getInstance().setHelp(parent, HELP_CONTEXT_ID);
+
+ OseeEventManager.addListener(this);
+ }
+
+ /**
+ * @param menuManager
+ */
+ private void addPreviewMenuItem(MenuManager menuManager) {
+ MenuManager subMenuManager = new MenuManager("Preview", "previewTransaction");
+ menuManager.add(subMenuManager);
+ addPreviewItems(subMenuManager, "Preview Source Artifact");
+ addPreviewItems(subMenuManager, "Preview Destination Artifact");
+ addPreviewItems(subMenuManager, "Preview Merge Artifact");
+ }
+
+ /**
+ * @param menuManager
+ */
+ private void createPreviewMenuItem(MenuManager menuManager) {
+ MenuManager subMenuManager = new MenuManager("Preview", "previewTransaction");
+ menuManager.add(subMenuManager);
+ createPreviewItems(subMenuManager, new PreviewHandler(menuManager, 1), "Preview Source Artifact");
+ createPreviewItems(subMenuManager, new PreviewHandler(menuManager, 2), "Preview Destination Artifact");
+ createPreviewItems(subMenuManager, new PreviewHandler(menuManager, 3), "Preview Merge Artifact");
+ }
+
+ /**
+ * @param subMenuManager
+ */
+ private String addPreviewItems(MenuManager subMenuManager, String command) {
+ CommandContributionItem previewCommand =
+ Commands.getLocalCommandContribution(getSite(), subMenuManager.getId() + command, command, null, null,
+ SkynetGuiPlugin.getInstance().getImageDescriptor("preview_artifact.gif"), null, null, null);
+ subMenuManager.add(previewCommand);
+ return previewCommand.getId();
+ }
+
+ /**
+ * @param subMenuManager
+ */
+ private void createPreviewItems(MenuManager subMenuManager, PreviewHandler handler, String command) {
+ handlerService.activateHandler(addPreviewItems(subMenuManager, command), handler);
+ }
+
+ /**
+ * @param menuManager
+ */
+ private void addDiffMenuItem(MenuManager menuManager) {
+ MenuManager subMenuManager = new MenuManager("Differences", "diffTransaction");
+ menuManager.add(subMenuManager);
+ addDiffItems(subMenuManager, "Show Source Branch Differences");
+ addDiffItems(subMenuManager, "Show Destination Branch Differences");
+ addDiffItems(subMenuManager, "Show Source/Destination Differences");
+ addDiffItems(subMenuManager, "Show Source/Merge Differences");
+ addDiffItems(subMenuManager, "Show Destination/Merge Differences");
+ }
+
+ /**
+ * @param menuManager
+ */
+ private void createDiffMenuItem(MenuManager menuManager) {
+ MenuManager subMenuManager = new MenuManager("Differences", "diffTransaction");
+ menuManager.add(subMenuManager);
+ createDiffItems(subMenuManager, new DiffHandler(menuManager, 1), "Show Source Branch Differences");
+ createDiffItems(subMenuManager, new DiffHandler(menuManager, 2), "Show Destination Branch Differences");
+ createDiffItems(subMenuManager, new DiffHandler(menuManager, 3), "Show Source/Destination Differences");
+ createDiffItems(subMenuManager, new DiffHandler(menuManager, 4), "Show Source/Merge Differences");
+ createDiffItems(subMenuManager, new DiffHandler(menuManager, 5), "Show Destination/Merge Differences");
+ }
+
+ /**
+ * @param subMenuManager
+ */
+ private String addDiffItems(MenuManager subMenuManager, String command) {
+ CommandContributionItem diffCommand =
+ Commands.getLocalCommandContribution(getSite(), subMenuManager.getId() + command, command, null, null,
+ null, null, null, null);
+ subMenuManager.add(diffCommand);
+ return diffCommand.getId();
+ }
+
+ /**
+ * @param subMenuManager
+ */
+ private void createDiffItems(MenuManager subMenuManager, DiffHandler handler, String command) {
+ handlerService.activateHandler(addDiffItems(subMenuManager, command), handler);
+ }
+
+ /**
+ * @param menuManager
+ */
+ private String addEditArtifactMenuItem(MenuManager menuManager) {
+ CommandContributionItem editArtifactCommand;
+ //RendererManager.getBestFileRenderer(PresentationType.SPECIALIZED_EDIT, attributeConflict.getArtifact()).getImage(attributeConflict.getArtifact());
+ editArtifactCommand =
+ Commands.getLocalCommandContribution(getSite(), "editArtifactCommand", "Edit Merge Artifact", null, null,
+ null, "E", null, "edit_Merge_Artifact");
+ menuManager.add(editArtifactCommand);
+ return editArtifactCommand.getId();
+ }
+
+ private String addSourceResourceHistoryMenuItem(MenuManager menuManager) {
+ CommandContributionItem sourecResourceCommand;
+ sourecResourceCommand =
+ Commands.getLocalCommandContribution(getSite(), "sourceResourceHistory",
+ "Show Source Artifact Resource History", null, null,
+ SkynetGuiPlugin.getInstance().getImageDescriptor("DBiconBlueEdit.gif"), null, null,
+ "source_Resource_History");
+ menuManager.add(sourecResourceCommand);
+ return sourecResourceCommand.getId();
+ }
+
+ private String addDestResourceHistoryMenuItem(MenuManager menuManager) {
+ CommandContributionItem sourecResourceCommand;
+ sourecResourceCommand =
+ Commands.getLocalCommandContribution(getSite(), "destResourceHistory",
+ "Show Dest Artifact Resource History", null, null, SkynetGuiPlugin.getInstance().getImageDescriptor(
+ "DBiconBlueEdit.gif"), null, null, "dest_Resource_History");
+ menuManager.add(sourecResourceCommand);
+ return sourecResourceCommand.getId();
+ }
+
+ private String addSourceRevealMenuItem(MenuManager menuManager) {
+ CommandContributionItem sourceReveal;
+ sourceReveal =
+ Commands.getLocalCommandContribution(getSite(), "sourceRevealArtifactExplorer",
+ "Reveal Source Artifact in Artifact Explorer", null, null,
+ SkynetGuiPlugin.getInstance().getImageDescriptor("magnify.gif"), null, null, "source_Reveal");
+ menuManager.add(sourceReveal);
+ return sourceReveal.getId();
+ }
+
+ private String addDestRevealMenuItem(MenuManager menuManager) {
+ CommandContributionItem destReveal;
+ destReveal =
+ Commands.getLocalCommandContribution(getSite(), "destRevealArtifactExplorer",
+ "Reveal Dest Artifact in Artifact Explorer", null, null,
+ SkynetGuiPlugin.getInstance().getImageDescriptor("magnify.gif"), null, null, "dest_Reveal");
+ menuManager.add(destReveal);
+ return destReveal.getId();
+ }
+
+ /**
+ * @param menuManager
+ */
+ private void createEditArtifactMenuItem(MenuManager menuManager) {
+
+ handlerService.activateHandler(addEditArtifactMenuItem(menuManager),
+
+ new AbstractSelectionEnabledHandler(menuManager) {
+ private AttributeConflict attributeConflict;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (attributeConflict != null) {
+ try {
+ if (MergeUtility.okToOverwriteEditedValue(attributeConflict,
+ Display.getCurrent().getActiveShell().getShell(), false)) {
+ RendererManager.openInJob(attributeConflict.getArtifact(), PresentationType.SPECIALIZED_EDIT);
+
+ attributeConflict.markStatusToReflectEdit();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ attributeConflict = null;
+ if (conflicts == null || conflicts.size() != 1 || !(conflicts.get(0) instanceof AttributeConflict) || !conflicts.get(
+ 0).statusEditable()) return false;
+ attributeConflict = ((AttributeConflict) conflicts.get(0));
+ return true;
+ }
+ });
+ }
+
+ private void createSourceResourceHistoryMenuItem(MenuManager menuManager) {
+
+ handlerService.activateHandler(addSourceResourceHistoryMenuItem(menuManager),
+
+ new AbstractSelectionEnabledHandler(menuManager) {
+ private AttributeConflict attributeConflict;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (attributeConflict != null) {
+ try {
+ HistoryView.open(attributeConflict.getSourceArtifact());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ attributeConflict = null;
+ if (conflicts == null || conflicts.size() != 1) {
+ return false;
+ }
+ attributeConflict = ((AttributeConflict) conflicts.get(0));
+ return true;
+ }
+ });
+ }
+
+ private void createDestinationResourceHistoryMenuItem(MenuManager menuManager) {
+
+ handlerService.activateHandler(addDestResourceHistoryMenuItem(menuManager),
+
+ new AbstractSelectionEnabledHandler(menuManager) {
+ private AttributeConflict attributeConflict;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (attributeConflict != null) {
+ try {
+ HistoryView.open(attributeConflict.getDestArtifact());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ attributeConflict = null;
+ if (conflicts == null || conflicts.size() != 1) {
+ return false;
+ }
+ attributeConflict = ((AttributeConflict) conflicts.get(0));
+ return true;
+ }
+ });
+ }
+
+ private void createSourceRevealMenuItem(MenuManager menuManager) {
+
+ handlerService.activateHandler(addSourceRevealMenuItem(menuManager),
+
+ new AbstractSelectionEnabledHandler(menuManager) {
+ private AttributeConflict attributeConflict;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (attributeConflict != null) {
+ try {
+ ArtifactExplorer.revealArtifact(attributeConflict.getSourceArtifact());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ attributeConflict = null;
+ if (conflicts == null || conflicts.size() != 1) {
+ return false;
+ }
+ attributeConflict = ((AttributeConflict) conflicts.get(0));
+ return true;
+ }
+ });
+ }
+
+ private void createDestinationRevealMenuItem(MenuManager menuManager) {
+
+ handlerService.activateHandler(addDestRevealMenuItem(menuManager),
+
+ new AbstractSelectionEnabledHandler(menuManager) {
+ private AttributeConflict attributeConflict;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (attributeConflict != null) {
+ try {
+ ArtifactExplorer.revealArtifact(attributeConflict.getDestArtifact());
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ attributeConflict = null;
+ if (conflicts == null || conflicts.size() != 1) {
+ return false;
+ }
+ attributeConflict = ((AttributeConflict) conflicts.get(0));
+ return true;
+ }
+ });
+ }
+
+ /**
+ * @param menuManager
+ */
+ private String addMergeMenuItem(MenuManager menuManager) {
+ CommandContributionItem mergeArtifactCommand;
+ mergeArtifactCommand =
+ Commands.getLocalCommandContribution(getSite(), "mergeArtifactCommand",
+ "Generate Three Way Merge (Developmental)", null, null, null, "E", null,
+ "Merge_Source_Destination_Artifact");
+ menuManager.add(mergeArtifactCommand);
+ return mergeArtifactCommand.getId();
+ }
+
+ /**
+ * @param menuManager
+ */
+ private void createMergeMenuItem(MenuManager menuManager) {
+
+ handlerService.activateHandler(addMergeMenuItem(menuManager),
+
+ new AbstractSelectionEnabledHandler(menuManager) {
+ private AttributeConflict attributeConflict;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (attributeConflict != null) {
+ MergeUtility.launchMerge(attributeConflict, Display.getCurrent().getActiveShell().getShell());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ attributeConflict = null;
+ if (conflicts == null || conflicts.size() != 1 || !(conflicts.get(0) instanceof AttributeConflict) || !conflicts.get(
+ 0).statusEditable()) return false;
+ attributeConflict = ((AttributeConflict) conflicts.get(0));
+ return attributeConflict.isWordAttribute();
+ }
+ });
+ }
+
+ public void explore(final Branch sourceBranch, final Branch destBranch, final TransactionId transactionId, final TransactionId commitTrans, boolean showConflicts) {
+ this.sourceBranch = sourceBranch;
+ this.destBranch = destBranch;
+ this.transactionId = transactionId;
+ this.commitTrans = commitTrans;
+ try {
+ xMergeViewer.setInputData(sourceBranch, destBranch, transactionId, this, commitTrans, showConflicts);
+ if (sourceBranch != null) {
+ setPartName("Merge Manager: " + sourceBranch.getBranchShortName() + " <=> " + destBranch.getBranchShortName());
+ } else if (commitTrans != null) {
+ setPartName("Merge Manager: " + commitTrans.getTransactionNumber());
+ } else {
+ setPartName("Merge Manager");
+ }
+
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public void setConflicts(Conflict[] conflicts) {
+ this.conflicts = conflicts;
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site, memento);
+ try {
+ Integer sourceBranchId = null;
+ Integer destBranchId = null;
+
+ if (memento != null) {
+ memento = memento.getChild(INPUT);
+ if (memento != null) {
+ if (SkynetViews.isSourceValid(memento)) {
+
+ Integer commitTransaction = memento.getInteger(COMMIT_NUMBER);
+ if (commitTransaction != null) {
+ openViewUpon(null, null, null, TransactionIdManager.getTransactionId(commitTransaction), false);
+ return;
+ }
+ sourceBranchId = memento.getInteger(SOURCE_BRANCH_ID);
+ final Branch sourceBranch = BranchManager.getBranch(sourceBranchId);
+ if (sourceBranch == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "Merge View can't init due to invalid source branch id " + sourceBranchId);
+ xMergeViewer.setLabel("Could not restore this Merge View");
+ return;
+ }
+ destBranchId = memento.getInteger(DEST_BRANCH_ID);
+ final Branch destBranch = BranchManager.getBranch(destBranchId);
+ if (destBranch == null) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "Merge View can't init due to invalid destination branch id " + sourceBranchId);
+ xMergeViewer.setLabel("Could not restore this Merge View");
+ return;
+ }
+ try {
+ TransactionId transactionId =
+ TransactionIdManager.getTransactionId(memento.getInteger(TRANSACTION_NUMBER));
+ openViewUpon(sourceBranch, destBranch, transactionId, null, false);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING,
+ "Merge View can't init due to invalid transaction id " + transactionId);
+ xMergeViewer.setLabel("Could not restore this Merge View due to invalid transaction id " + transactionId);
+ return;
+ }
+ } else {
+ SkynetViews.closeView(VIEW_ID, getViewSite().getSecondaryId());
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.WARNING, "Merge View error on init", ex);
+ }
+ }
+
+ private static final String INPUT = "input";
+ private static final String SOURCE_BRANCH_ID = "sourceBranchId";
+ private static final String DEST_BRANCH_ID = "destBranchId";
+ private static final String TRANSACTION_NUMBER = "transactionNumber";
+ private static final String COMMIT_NUMBER = "commitTransactionNumber";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
+ */
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ memento = memento.createChild(INPUT);
+ if (sourceBranch != null) {
+ memento.putInteger(SOURCE_BRANCH_ID, sourceBranch.getBranchId());
+ memento.putInteger(DEST_BRANCH_ID, destBranch.getBranchId());
+ memento.putInteger(TRANSACTION_NUMBER, transactionId.getTransactionNumber());
+ } else if (commitTrans != null) {
+ memento.putInteger(COMMIT_NUMBER, commitTrans.getTransactionNumber());
+ }
+
+ if (sourceBranch != null || commitTrans != null) {
+ SkynetViews.addDatabaseSourceId(memento);
+ }
+ }
+
+ private class PreviewHandler extends AbstractSelectionEnabledHandler {
+ private final int partToPreview;
+ private List<Artifact> artifacts;
+
+ public PreviewHandler(MenuManager menuManager, int partToPreview) {
+ super(menuManager);
+ this.partToPreview = partToPreview;
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ if (!artifacts.isEmpty()) {
+ try {
+ RendererManager.previewInJob(artifacts);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ artifacts = new LinkedList<Artifact>();
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ for (Conflict conflict : conflicts) {
+ try {
+ switch (partToPreview) {
+ case 1:
+ if (conflict.getSourceArtifact() != null) {
+ artifacts.add(conflict.getSourceArtifact());
+ }
+ break;
+ case 2:
+ if (conflict.getDestArtifact() != null) {
+ artifacts.add(conflict.getDestArtifact());
+ }
+ break;
+ case 3:
+ if (conflict.statusNotResolvable() || conflict.statusInformational()) return false;
+ if (conflict.getArtifact() != null) {
+ artifacts.add(conflict.getArtifact());
+ }
+ break;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ return accessControlManager.checkObjectListPermission(artifacts, PermissionEnum.READ);
+ }
+ }
+
+ private class DiffHandler extends AbstractSelectionEnabledHandler {
+ private final int diffToShow;
+ private AttributeConflict attributeConflict;
+ private ArtifactConflict artifactConflict;
+ private List<Artifact> artifacts;
+
+ public DiffHandler(MenuManager menuManager, int diffToShow) {
+ super(menuManager);
+ this.diffToShow = diffToShow;
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ try {
+ if (attributeConflict != null) {
+ switch (diffToShow) {
+ case 1:
+ MergeUtility.showCompareFile(
+ MergeUtility.getStartArtifact(attributeConflict),
+ attributeConflict.getSourceArtifact(),
+ "Source_Diff_For_" + attributeConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ break;
+ case 2:
+ MergeUtility.showCompareFile(
+ MergeUtility.getStartArtifact(attributeConflict),
+ attributeConflict.getDestArtifact(),
+ "Destination_Diff_For_" + attributeConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ break;
+ case 3:
+ MergeUtility.showCompareFile(
+ attributeConflict.getSourceArtifact(),
+ attributeConflict.getDestArtifact(),
+ "Source_Destination_Diff_For_" + attributeConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ break;
+ case 4:
+ if (attributeConflict.wordMarkupPresent()) {
+ throw new OseeCoreException(AttributeConflict.DIFF_MERGE_MARKUP);
+ }
+ MergeUtility.showCompareFile(
+ attributeConflict.getSourceArtifact(),
+ attributeConflict.getArtifact(),
+ "Source_Merge_Diff_For_" + attributeConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ break;
+ case 5:
+ if (attributeConflict.wordMarkupPresent()) {
+ throw new OseeCoreException(AttributeConflict.DIFF_MERGE_MARKUP);
+ }
+ MergeUtility.showCompareFile(
+ attributeConflict.getDestArtifact(),
+ attributeConflict.getArtifact(),
+ "Destination_Merge_Diff_For_" + attributeConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ break;
+ }
+ } else if (artifactConflict != null) {
+ if (diffToShow == 1) {
+ MergeUtility.showCompareFile(
+ artifactConflict.getSourceArtifact(),
+ MergeUtility.getStartArtifact(artifactConflict),
+ "Source_Diff_For_" + artifactConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ }
+ if (diffToShow == 2) {
+ MergeUtility.showCompareFile(
+ artifactConflict.getDestArtifact(),
+ MergeUtility.getStartArtifact(artifactConflict),
+ "Destination_Diff_For_" + artifactConflict.getArtifact().getSafeName() + (new Date()).toString().replaceAll(
+ ":", ";") + ".xml");
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabledWithException() throws OseeCoreException {
+ artifacts = new LinkedList<Artifact>();
+ List<Conflict> conflicts = xMergeViewer.getSelectedConflicts();
+ if (conflicts.size() != 1) return false;
+ if (conflicts.get(0) instanceof AttributeConflict) {
+ attributeConflict = (AttributeConflict) conflicts.get(0);
+ artifactConflict = null;
+ try {
+ switch (diffToShow) {
+ case 1:
+ if (attributeConflict.getSourceArtifact() != null && MergeUtility.getStartArtifact(attributeConflict) != null) {
+ artifacts.add(attributeConflict.getSourceArtifact());
+ artifacts.add(MergeUtility.getStartArtifact(attributeConflict));
+ } else
+ return false;
+ break;
+ case 2:
+ if (attributeConflict.getDestArtifact() != null && MergeUtility.getStartArtifact(attributeConflict) != null) {
+ artifacts.add(attributeConflict.getDestArtifact());
+ artifacts.add(MergeUtility.getStartArtifact(attributeConflict));
+ } else
+ return false;
+ break;
+ case 3:
+ if (attributeConflict.getDestArtifact() != null && attributeConflict.getSourceArtifact() != null) {
+ artifacts.add(attributeConflict.getSourceArtifact());
+ artifacts.add(attributeConflict.getDestArtifact());
+ } else
+ return false;
+ break;
+ case 4:
+ if (attributeConflict.getSourceArtifact() != null && attributeConflict.getArtifact() != null) {
+ artifacts.add(attributeConflict.getSourceArtifact());
+ artifacts.add(attributeConflict.getArtifact());
+ } else
+ return false;
+ break;
+ case 5:
+ if (attributeConflict.getDestArtifact() != null && attributeConflict.getArtifact() != null) {
+ artifacts.add(attributeConflict.getDestArtifact());
+ artifacts.add(attributeConflict.getArtifact());
+ } else
+ return false;
+ break;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ } else if (conflicts.get(0) instanceof ArtifactConflict) {
+ attributeConflict = null;
+ artifactConflict = (ArtifactConflict) conflicts.get(0);
+ try {
+ switch (diffToShow) {
+ case 1:
+ if (artifactConflict.getSourceArtifact() != null && conflicts.get(0).statusNotResolvable() && MergeUtility.getStartArtifact(artifactConflict) != null) {
+ artifacts.add(artifactConflict.getSourceArtifact());
+ artifacts.add(MergeUtility.getStartArtifact(artifactConflict));
+ } else
+ return false;
+ break;
+ case 2:
+ if (artifactConflict.getDestArtifact() != null && conflicts.get(0).statusInformational() && MergeUtility.getStartArtifact(artifactConflict) != null) {
+ artifacts.add(artifactConflict.getDestArtifact());
+ artifacts.add(MergeUtility.getStartArtifact(artifactConflict));
+ } else
+ return false;
+ break;
+ case 3:
+ return false;
+ case 4:
+ return false;
+ case 5:
+ return false;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ }
+ return accessControlManager.checkObjectListPermission(artifacts, PermissionEnum.READ);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleBranchEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.artifact.BranchModType, int)
+ */
+ @Override
+ public void handleBranchEvent(Sender sender, BranchEventType branchModType, int branchId) {
+ if (sourceBranch != null && destBranch != null && (sourceBranch.getBranchId() == branchId || destBranch.getBranchId() == branchId)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (xMergeViewer != null && xMergeViewer.getXViewer().getTree().isDisposed() != true) {
+ xMergeViewer.refresh();
+ }
+ }
+ });
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IBranchEventListener#handleLocalBranchToArtifactCacheUpdateEvent(org.eclipse.osee.framework.ui.plugin.event.Sender)
+ */
+ @Override
+ public void handleLocalBranchToArtifactCacheUpdateEvent(Sender sender) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(final Sender sender, final FrameworkTransactionData transData) throws OseeCoreException {
+ try {
+ if (sourceBranch == null || destBranch == null || (sourceBranch.getBranchId() != transData.getBranchId() && destBranch.getBranchId() != transData.getBranchId() && ConflictManagerInternal.getMergeBranchId(
+ sourceBranch.getBranchId(), destBranch.getBranchId()) != transData.getBranchId())) {
+ return;
+ }
+ } catch (OseeCoreException ex) {
+ //ignore the exception for an event don't want them poping up on people for no reason
+ }
+ final MergeView mergeView = this;
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (xMergeViewer.getXViewer() == null || xMergeViewer.getXViewer().getTree() == null || xMergeViewer.getXViewer().getTree().isDisposed()) return;
+ for (Artifact artifact : transData.cacheChangedArtifacts) {
+ try {
+ Branch branch = artifact.getBranch();
+ if (showConflicts) {
+ for (Conflict conflict : conflicts) {
+ if ((artifact.equals(conflict.getSourceArtifact()) && branch.equals(conflict.getSourceBranch())) || (artifact.equals(conflict.getDestArtifact()) && branch.equals(conflict.getDestBranch()))) {
+ xMergeViewer.setInputData(sourceBranch, destBranch, transactionId, mergeView, commitTrans,
+ "Source Artifact Changed", showConflicts);
+ if (artifact.equals(conflict.getSourceArtifact()) && sender.isLocal()) {
+ new MessageDialog(
+ Display.getDefault().getActiveShell().getShell(),
+ "Modifying Source artifact while merging",
+ null,
+ "Typically changes done while merging should be done on the merge branch. You should not normally merge on the source branch.",
+ 2, new String[] {"OK"}, 1).open();
+ }
+ return;
+ } else if (artifact.equals(conflict.getArtifact())) {
+ conflict.computeEqualsValues();
+ xMergeViewer.refresh();
+ }
+ }
+ if (conflicts.length > 0 && (branch.equals(conflicts[0].getSourceBranch()) || branch.equals(conflicts[0].getDestBranch()))) {
+ xMergeViewer.setInputData(
+ sourceBranch,
+ destBranch,
+ transactionId,
+ mergeView,
+ commitTrans,
+ branch.equals(conflicts[0].getSourceBranch()) ? "Source Branch Changed" : "Destination Branch Changed",
+ showConflicts);
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ if (!transData.cacheDeletedArtifacts.isEmpty()) {
+ Branch branch = transData.cacheDeletedArtifacts.iterator().next().getBranch();
+ if (conflicts.length > 0 && (branch.equals(conflicts[0].getSourceBranch()) || branch.equals(conflicts[0].getDestBranch()))) {
+ xMergeViewer.setInputData(
+ sourceBranch,
+ destBranch,
+ transactionId,
+ mergeView,
+ commitTrans,
+ branch.equals(conflicts[0].getSourceBranch()) ? "Source Branch Changed" : "Destination Branch Changed",
+ showConflicts);
+ }
+ }
+ }
+ });
+
+ }
+
+ protected void showConflicts(boolean show) {
+ showConflicts = show;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewer.java
new file mode 100644
index 00000000000..9ad347e77c4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewer.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xmerge;
+
+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.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.core.enums.ConflictType;
+import org.eclipse.osee.framework.db.connection.exception.MergeChangesInArtifactException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.HttpBranchCreation;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.event.MergeBranchEventType;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.mergeWizard.ConflictResolutionWizard;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Donald G. Dunne
+ * @author Theron Virgin
+ */
+public class MergeXViewer extends XViewer {
+
+ private final XMergeViewer xMergeViewer;
+ private Conflict[] conflicts;
+ private ConflictResolutionWizard conWizard;
+ private XMergeLabelProvider labelProvider;
+ private Action openMergeViewAction;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public MergeXViewer(Composite parent, int style, XMergeViewer xMergeViewer) {
+ super(parent, style, new MergeXViewerFactory());
+ this.xMergeViewer = xMergeViewer;
+ }
+
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ createMenuActions();
+ }
+
+ public void createMenuActions() {
+ MenuManager mm = getMenuManager();
+ mm.createContextMenu(getControl());
+ mm.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ updateMenuActions();
+ }
+ });
+
+ openMergeViewAction = new Action("Open Merge View", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ AWorkbench.popup("ERROR", "Not implemented yet");
+ }
+ };
+ }
+
+ public void updateEditMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ // EDIT MENU BLOCK
+ mm.insertBefore(MENU_GROUP_PRE, openMergeViewAction);
+ openMergeViewAction.setEnabled(true);
+
+ }
+
+ @Override
+ public boolean isColumnMultiEditEnabled() {
+ return true;
+ }
+
+ public void updateMenuActions() {
+ MenuManager mm = getMenuManager();
+
+ updateEditMenuActions();
+
+ mm.insertBefore(MENU_GROUP_PRE, new Separator());
+ }
+
+ public void setConflicts(Conflict[] conflicts) {
+ this.conflicts = conflicts;
+ setInput(conflicts);
+ }
+
+ /**
+ * Release resources
+ */
+ @Override
+ public void dispose() {
+ getLabelProvider().dispose();
+ }
+
+ /**
+ * @return the xUserRoleViewer
+ */
+ public XMergeViewer getXUserRoleViewer() {
+ return xMergeViewer;
+ }
+
+ @Override
+ public void resetDefaultSorter() {
+ setSorter(new MergeXViewerSorter(this, labelProvider));
+ }
+
+ /**
+ * @return the transactionArtifactChanges
+ */
+ public Conflict[] getTransactionArtifactChanges() {
+ return conflicts;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#handleLeftClickInIconArea(org.eclipse.swt.widgets.TreeColumn,
+ * org.eclipse.swt.widgets.TreeItem)
+ */
+ @Override
+ public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+ Conflict conflict = (Conflict) treeItem.getData();
+ Shell shell = Display.getCurrent().getActiveShell().getShell();
+ if (conflict.statusCommitted()) {
+ return super.handleLeftClickInIconArea(treeColumn, treeItem);
+ }
+ try {
+ if (treeColumn.getText().equals(MergeXViewerFactory.Source.getName())) {
+ if (conflict.statusNotResolvable()) {
+ MergeUtility.showDeletedConflict(conflict, shell);
+ } else if (conflict.statusInformational()) {
+ MergeUtility.showInformationalConflict(shell);
+ } else {
+ MergeUtility.setToSource(conflict, shell, true);
+ }
+ } else if (treeColumn.getText().equals(MergeXViewerFactory.Destination.getName())) {
+ if (conflict.statusNotResolvable()) {
+ MergeUtility.showDeletedConflict(conflict, shell);
+ } else if (conflict.statusInformational()) {
+ MergeUtility.showInformationalConflict(shell);
+ } else {
+ MergeUtility.setToDest(conflict, shell, true);
+ }
+ } else if (treeColumn.getText().equals(MergeXViewerFactory.Merged.getName())) {
+ if (conflict.statusNotResolvable()) {
+ MergeUtility.showDeletedConflict(conflict, shell);
+ } else if (!(conflict.getConflictType().equals(ConflictType.ARTIFACT))) {
+ conWizard = new ConflictResolutionWizard(conflict);
+ WizardDialog dialog = new WizardDialog(shell, conWizard);
+ dialog.create();
+ if (dialog.open() == 0) {
+ conWizard.getResolved();
+ }
+ }
+ } else if (treeColumn.getText().equals(MergeXViewerFactory.Conflict_Resolved.getName())) {
+ if (conflict.statusNotResolvable()) {
+ if (MergeUtility.showDeletedConflict(conflict, shell)) {
+ xMergeViewer.refreshTable();
+ }
+ } else if (conflict.statusInformational()) {
+ MergeUtility.showInformationalConflict(shell);
+ } else {
+ conflict.handleResolvedSelection();
+ OseeEventManager.kickMergeBranchEvent(HttpBranchCreation.class, MergeBranchEventType.ConflictResolved,
+ conflict.getMergeBranchID());
+ }
+ }
+
+ } catch (MergeChangesInArtifactException ex) {
+ MessageDialog.openError(shell, "Error", ex.getMessage());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ xMergeViewer.loadTable();
+ return super.handleLeftClickInIconArea(treeColumn, treeItem);
+ }
+
+ /* (non-Javadoc) Method declared on StructuredViewer. */
+ @Override
+ protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
+ super.doUpdateItem(widget, element, fullMap);
+ if (conWizard != null) {
+ try {
+ conWizard.setResolution();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public void addLabelProvider(XMergeLabelProvider labelProvider) {
+ this.labelProvider = labelProvider;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerFactory.java
new file mode 100644
index 00000000000..eabf68e8de6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerFactory.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.framework.ui.skynet.widgets.xmerge;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class MergeXViewerFactory extends SkynetXViewerFactory {
+
+ public static XViewerColumn Conflict_Resolved =
+ new XViewerColumn("framework.merge.conflictResolved", "Conflict Resolution", 43, SWT.LEFT, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn Artifact_Name =
+ new XViewerColumn("framework.merge.artifactName", "Artifact Name", 200, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Type =
+ new XViewerColumn("framework.merge.artifactType", "Artifact Type", 150, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Change_Item =
+ new XViewerColumn("framework.merge.conflictingItem", "Conflicting Item", 150, SWT.LEFT, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn Source =
+ new XViewerColumn("framework.merge.sourceValue", "Source Value", 100, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Destination =
+ new XViewerColumn("framework.merge.destinationValue", "Destination Value", 100, SWT.LEFT, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn Merged =
+ new XViewerColumn("framework.merge.mergedValue", "Merged Value", 100, SWT.LEFT, true, SortDataType.String,
+ false, null);
+ public static XViewerColumn Art_Id =
+ new XViewerColumn("framework.merge.artId", "Artifact Id", 75, SWT.LEFT, true, SortDataType.String, false, null);
+
+ public MergeXViewerFactory() {
+ super("osee.skynet.gui.MergeXViewer");
+ registerColumn(Conflict_Resolved, Artifact_Name, Type, Change_Item, Source, Destination, Merged, Art_Id);
+ registerAllAttributeColumns();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerSorter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerSorter.java
new file mode 100644
index 00000000000..cf290504375
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/MergeXViewerSorter.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.framework.ui.skynet.widgets.xmerge;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerSorter;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.ui.skynet.widgets.xmerge.XMergeLabelProvider.ConflictState;
+
+/**
+ * @author Theron Virgin
+ */
+public class MergeXViewerSorter extends XViewerSorter {
+
+ protected final XViewer xViewer;
+ protected final XMergeLabelProvider labelProvider;
+
+ /**
+ * @param xViewer
+ */
+ public MergeXViewerSorter(XViewer xViewer, XMergeLabelProvider labelProvider) {
+ super(xViewer);
+ this.xViewer = xViewer;
+ this.labelProvider = labelProvider;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerSorter#compare(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object, int)
+ */
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2, int sortXColIndex) {
+ try {
+ if (xViewer == null || !xViewer.getCustomizeMgr().isSorting()) return 0;
+ XViewerColumn sortXCol = xViewer.getCustomizeMgr().getSortXCols().get(sortXColIndex);
+ String value1 = labelProvider.getColumnText(o1, sortXCol, sortXColIndex);
+ String value2 = labelProvider.getColumnText(o2, sortXCol, sortXColIndex);
+
+ if (o1 instanceof Conflict && o2 instanceof Conflict) {
+ if (sortXCol.equals(MergeXViewerFactory.Conflict_Resolved)) {
+ int compareInt =
+ new Integer(ConflictState.getValue(value1)).compareTo(new Integer(ConflictState.getValue(value2)));
+ return getCompareBasedOnDirection(sortXCol, compareInt, viewer, o1, o2, sortXColIndex);
+ }
+ }
+
+ return super.compare(viewer, o1, o2, sortXColIndex);
+ } catch (Exception ex) {
+ // do nothing
+ }
+ return 1;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeContentProvider.java
new file mode 100644
index 00000000000..86d28cc9626
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeContentProvider.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.framework.ui.skynet.widgets.xmerge;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public class XMergeContentProvider implements ITreeContentProvider {
+
+ private final MergeXViewer mergeXViewer;
+ private static Object[] EMPTY_ARRAY = new Object[0];
+
+ public XMergeContentProvider(MergeXViewer commitXViewer) {
+ super();
+ this.mergeXViewer = commitXViewer;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) {
+ return (Object[]) parentElement;
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeLabelProvider.java
new file mode 100644
index 00000000000..55ff9fcdca7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeLabelProvider.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.framework.ui.skynet.widgets.xmerge;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+public class XMergeLabelProvider extends XViewerLabelProvider {
+ public static enum ConflictState {
+ UNTOUCHED(2, " "),
+ REVERT(1, "Must Be Reverted"),
+ MODIFIED(3, "Modified"),
+ CHANGED(4, "Artifact Changed After Resolution"),
+ RESOLVED(5, "Resolved"),
+ INFORMATIONAL(6, "Informational"),
+ COMMITTED(7, "Committed"),
+ CHANGED_EDIT(8, "Artifact Changed"),
+ MERGE_SUCCESS(9, "Previous Merge Applied Successfully"),
+ MERGE_CAUTION(10, "Previous Merge applied with destination differences");
+
+ private final int value;
+ private final String text;
+
+ ConflictState(int value, String text) {
+ this.value = value;
+ this.text = text;
+ }
+
+ public static final int getValue(String text) {
+ for (ConflictState state : values()) {
+ if (state.text.equals(text)) {
+ return state.value;
+ }
+ }
+ return 0;
+ }
+
+ public final String getText() {
+ return text;
+ }
+
+ };
+ Font font = null;
+
+ private final MergeXViewer mergeXViewer;
+
+ public XMergeLabelProvider(MergeXViewer mergeXViewer) {
+ super(mergeXViewer);
+ this.mergeXViewer = mergeXViewer;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn aCol, int columnIndex) throws OseeCoreException {
+ if (element instanceof Conflict) {
+ Conflict conflict = (Conflict) element;
+ if (aCol.equals(MergeXViewerFactory.Conflict_Resolved)) {
+ if (conflict.statusResolved()) return ConflictState.RESOLVED.getText();
+ if (conflict.statusEdited()) return ConflictState.MODIFIED.getText();
+ if (conflict.statusOutOfDate()) return ConflictState.CHANGED_EDIT.getText();
+ if (conflict.statusOutOfDateCommitted()) return ConflictState.CHANGED.getText();
+ if (conflict.statusUntouched()) return ConflictState.UNTOUCHED.getText();
+ if (conflict.statusNotResolvable()) return ConflictState.REVERT.getText();
+ if (conflict.statusInformational()) return ConflictState.INFORMATIONAL.getText();
+ if (conflict.statusCommitted()) return ConflictState.COMMITTED.getText();
+ if (conflict.statusPreviousMergeAppliedSuccess()) return ConflictState.MERGE_SUCCESS.getText();
+ if (conflict.statusPreviousMergeAppliedCaution()) return ConflictState.MERGE_CAUTION.getText();
+ } else if (aCol.equals(MergeXViewerFactory.Artifact_Name)) {
+ return conflict.getArtifactName();
+ } else if (aCol.equals(MergeXViewerFactory.Change_Item)) {
+ return conflict.getChangeItem();
+ } else if (aCol.equals(MergeXViewerFactory.Source)) {
+ return conflict.getSourceDisplayData();
+ } else if (aCol.equals(MergeXViewerFactory.Destination)) {
+ return conflict.getDestDisplayData();
+ } else if (aCol.equals(MergeXViewerFactory.Merged)) {
+ return conflict.getMergeDisplayData();
+ } else if (aCol.equals(MergeXViewerFactory.Type)) {
+ return conflict.getArtifact().getArtifactTypeName();
+ } else if (aCol.equals(MergeXViewerFactory.Art_Id)) {
+ return String.valueOf(conflict.getArtifact().getArtId());
+ }
+ }
+ return "unhandled column";
+ }
+
+ public void dispose() {
+ if (font != null) font.dispose();
+ font = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public MergeXViewer getTreeViewer() {
+ return mergeXViewer;
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn dCol, int columnIndex) throws OseeCoreException {
+ if (element instanceof Conflict) {
+ try {
+ Conflict conflict = (Conflict) element;
+ if (dCol.equals(MergeXViewerFactory.Artifact_Name)) {
+ return ImageManager.getImage(conflict.getArtifact());
+ } else if (dCol.equals(MergeXViewerFactory.Type)) {
+ return ImageManager.getImage(conflict.getArtifact());
+ } else if (dCol.equals(MergeXViewerFactory.Change_Item)) {
+ return ImageManager.getConflictImage(conflict);
+ } else if (dCol.equals(MergeXViewerFactory.Source)) {
+ return ImageManager.getImage(FrameworkImage.MERGE_SOURCE);
+ } else if (dCol.equals(MergeXViewerFactory.Destination)) {
+ return ImageManager.getImage(FrameworkImage.MERGE_DEST);
+ } else if (dCol.equals(MergeXViewerFactory.Merged)) {
+ return getMergeImage(conflict);
+ } else if (dCol.equals(MergeXViewerFactory.Conflict_Resolved)) {
+ if (conflict.statusUntouched()) return null;
+ if (conflict.statusEdited()) return ImageManager.getImage(FrameworkImage.MERGE_EDITED);
+ if (conflict.statusResolved() || conflict.statusCommitted()) return ImageManager.getImage(FrameworkImage.MERGE_MARKED);
+ if (conflict.statusOutOfDate()) return ImageManager.getImage(FrameworkImage.MERGE_OUT_OF_DATE);
+ if (conflict.statusOutOfDateCommitted()) return ImageManager.getImage(FrameworkImage.MERGE_OUT_OF_DATE_COMMITTED);
+ if (conflict.statusPreviousMergeAppliedSuccess()) return ImageManager.getImage(FrameworkImage.MERGE_SUCCESS);
+ if (conflict.statusPreviousMergeAppliedCaution()) return ImageManager.getImage(FrameworkImage.MERGE_CAUTION);
+ if (conflict.statusNotResolvable()) return ImageManager.getImage(FrameworkImage.MERGE_NOT_RESOLVEABLE);
+ if (conflict.statusInformational()) return ImageManager.getImage(FrameworkImage.MERGE_INFO);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ return null;
+ }
+
+ public static Image getMergeImage(Conflict conflict) throws OseeCoreException {
+ if (conflict.statusInformational()) return null;
+ if (conflict.statusNotResolvable()) return ImageManager.getImage(FrameworkImage.MERGE_START);
+ if ((conflict.sourceEqualsDestination()) && (conflict.mergeEqualsSource())) return ImageManager.getImage(FrameworkImage.MERGE_NO_CONFLICT);
+ if (conflict.statusUntouched()) return ImageManager.getImage(FrameworkImage.MERGE_START);
+ if (conflict.mergeEqualsDestination()) return ImageManager.getImage(FrameworkImage.MERGE_DEST);
+ if (conflict.mergeEqualsSource())
+ return ImageManager.getImage(FrameworkImage.MERGE_SOURCE);
+ else
+ return ImageManager.getImage(FrameworkImage.MERGE_YELLOW_M);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeViewer.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeViewer.java
new file mode 100644
index 00000000000..040b52b138b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/XMergeViewer.java
@@ -0,0 +1,731 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xmerge;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.osee.framework.core.data.SystemUser;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AHTML;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.IATSArtifact;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal;
+import org.eclipse.osee.framework.skynet.core.revision.ConflictManagerInternal;
+import org.eclipse.osee.framework.skynet.core.transaction.TransactionId;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.ListSelectionDialogNoSave;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.status.SwtStatusMonitor;
+import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.xchange.ChangeView;
+import org.eclipse.osee.framework.ui.swt.ALayout;
+import org.eclipse.osee.framework.ui.swt.IDirtiableEditor;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Donald G. Dunne
+ * @author Theron Virgin
+ */
+public class XMergeViewer extends XWidget implements IAdaptable {
+ private static final String COMPLETE_COMMIT_ACTION_ID = "complete.commit.action.id";
+ private static final String REFRESH_ACTION_ID = "refresh.action.id";
+ private MergeXViewer mergeXViewer;
+ private IDirtiableEditor editor;
+ public final static String normalColor = "#EEEEEE";
+ private static final String LOADING = "Loading ...";
+ private static final String NO_CONFLICTS = "No conflicts were found";
+ private static final String CONFLICTS_NOT_LOADED = "Cleared on shutdown. Refresh to Reload.";
+ private Label extraInfoLabel;
+ private Conflict[] conflicts;
+ private String displayLabelText;
+ private Action openAssociatedArtifactAction;
+ private Action completeCommitAction;
+ private Branch sourceBranch;
+ private Branch destBranch;
+ private TransactionId commitTrans;
+ private TransactionId tranId;
+ private MergeView mergeView;
+ private IToolBarManager toolBarManager;
+ private final static String CONFLICTS_RESOLVED = "\nAll Conflicts Are Resolved";
+
+ /**
+ * @param label
+ */
+ public XMergeViewer() {
+ super("Merge Manager");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#createControls(org.eclipse.swt.widgets.Composite, int)
+ */
+ @Override
+ protected void createControls(Composite parent, int horizontalSpan) {
+
+ // Create Text Widgets
+ if (isDisplayLabel() && !getLabel().equals("")) {
+ labelWidget = new Label(parent, SWT.NONE);
+ labelWidget.setText(getLabel() + ":");
+ if (getToolTip() != null) {
+ labelWidget.setToolTipText(getToolTip());
+ }
+ }
+
+ Composite mainComp = new Composite(parent, SWT.BORDER);
+ mainComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ mainComp.setLayout(ALayout.getZeroMarginLayout());
+ if (toolkit != null) {
+ toolkit.paintBordersFor(mainComp);
+ }
+
+ createTaskActionBar(mainComp);
+
+ mergeXViewer = new MergeXViewer(mainComp, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION, this);
+ mergeXViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ XMergeLabelProvider labelProvider = new XMergeLabelProvider(mergeXViewer);
+ mergeXViewer.addLabelProvider(labelProvider);
+ mergeXViewer.setSorter(new MergeXViewerSorter(mergeXViewer, labelProvider));
+ mergeXViewer.setContentProvider(new XMergeContentProvider(mergeXViewer));
+ mergeXViewer.setLabelProvider(new XMergeLabelProvider(mergeXViewer));
+ mergeXViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ refreshActionEnablement();
+ }
+ });
+
+ if (toolkit != null) {
+ toolkit.adapt(mergeXViewer.getStatusLabel(), false, false);
+ }
+
+ Tree tree = mergeXViewer.getTree();
+ GridData gridData = new GridData(GridData.FILL_BOTH);
+ gridData.heightHint = 100;
+ tree.setLayout(ALayout.getZeroMarginLayout());
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ }
+
+ public void createTaskActionBar(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = ALayout.getZeroMarginLayout(2, false);
+ layout.marginLeft = 5;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ extraInfoLabel = new Label(composite, SWT.NONE);
+ extraInfoLabel.setAlignment(SWT.LEFT);
+ extraInfoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ extraInfoLabel.setText("\n");
+
+ IToolBarManager manager = getToolBarManager();
+ ((ToolBarManager) manager).createControl(composite);
+ manager.add(new RefreshAction());
+ manager.add(new Separator());
+ openAssociatedArtifactAction = new OpenAssociatedArtifactAction();
+ manager.add(openAssociatedArtifactAction);
+ manager.add(new Separator());
+ manager.add(new ApplyPriorMergeResultsAction());
+ manager.add(new Separator());
+ manager.add(new ShowSourceBranchChangeReportAction());
+ manager.add(new ShowDestinationBranchChangeReportAction());
+ manager.add(new Separator());
+ manager.add(new CustomizeTableAction());
+ manager.add(OseeAts.createBugAction(SkynetGuiPlugin.getInstance(), this, MergeView.VIEW_ID, "Merge Manager"));
+ manager.update(true);
+ }
+
+ private IToolBarManager getToolBarManager() {
+ if (toolBarManager == null) {
+ toolBarManager = new ToolBarManager(SWT.FLAT);
+ }
+ return toolBarManager;
+ }
+
+ private void applyPreviousMerge(final int destBranchId) {
+ Job job = new Job("Apply Previous Merge") {
+
+ @Override
+ protected IStatus run(final IProgressMonitor monitor) {
+ monitor.beginTask("ApplyingPreviousMerge", conflicts.length);
+ for (Conflict conflict : conflicts) {
+ try {
+ conflict.applyPreviousMerge(ConflictManagerInternal.getMergeBranchId(
+ conflict.getSourceBranch().getBranchId(), destBranchId), destBranchId);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ } finally {
+ monitor.worked(1);
+ }
+ }
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+
+ Jobs.startJob(job, new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ loadTable();
+ }
+ });
+ }
+
+ public void refreshTable() throws InterruptedException {
+ Job job = new Job("Loading Merge Manager") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ if (!(conflicts.length == 0)) {
+ Conflict[] artifactChanges = new Conflict[0];
+ if (conflicts[0].getToTransactionId() != null) {
+ setConflicts(ConflictManagerInternal.getConflictsPerBranch(conflicts[0].getSourceBranch(),
+ conflicts[0].getDestBranch(), conflicts[0].getToTransactionId(),
+ new SwtStatusMonitor(monitor)).toArray(artifactChanges));
+ } else {
+ setConflicts(ConflictManagerInternal.getConflictsPerBranch(conflicts[0].getCommitTransactionId(),
+ new SwtStatusMonitor(monitor)).toArray(artifactChanges));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job, new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ loadTable();
+ }
+ });
+ }
+
+ public void refreshActionEnablement() {
+
+ }
+
+ public void loadTable() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public ArrayList<Conflict> getSelectedConflicts() {
+ ArrayList<Conflict> items = new ArrayList<Conflict>();
+ if (mergeXViewer == null) {
+ return items;
+ }
+ if (mergeXViewer.getSelection().isEmpty()) {
+ return items;
+ }
+ Iterator i = ((IStructuredSelection) mergeXViewer.getSelection()).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ items.add((Conflict) obj);
+ }
+ return items;
+ }
+
+ @Override
+ public Control getControl() {
+ return mergeXViewer.getTree();
+ }
+
+ @Override
+ public void dispose() {
+ mergeXViewer.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ mergeXViewer.getTree().setFocus();
+ }
+
+ @Override
+ public void refresh() {
+ mergeXViewer.refresh();
+ validate();
+ refreshActionEnablement();
+ mergeView.showConflicts(true);
+ int resolved = 0;
+ int informational = 0;
+ if (conflicts != null && conflicts.length != 0) {
+ for (Conflict conflict : conflicts) {
+ if (conflict.statusResolved() || conflict.statusCommitted()) {
+ resolved++;
+ }
+ if (conflict.statusInformational()) {
+ informational++;
+ }
+ }
+ if (resolved == conflicts.length) {
+ extraInfoLabel.setText(displayLabelText + CONFLICTS_RESOLVED);
+ } else {
+ extraInfoLabel.setText(displayLabelText + "\nConflicts : " + (conflicts.length - informational) + " <=> Resolved : " + resolved + (informational == 0 ? " " : "\nInformational Conflicts : " + informational));
+ }
+ }
+ checkForCompleteCommit();
+ }
+
+ private boolean areAllConflictsResolved() {
+ int resolved = 0;
+ for (Conflict conflict : conflicts) {
+ if (conflict.statusResolved() || conflict.statusCommitted()) {
+ resolved++;
+ }
+ }
+ return resolved == conflicts.length;
+ }
+
+ @Override
+ public IStatus isValid() {
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public void setXmlData(String str) {
+ }
+
+ @Override
+ public String getXmlData() {
+ return null;
+ }
+
+ @Override
+ public String toHTML(String labelFont) {
+ return AHTML.simplePage("Unhandled");
+ }
+
+ @Override
+ public String getReportData() {
+ return null;
+ }
+
+ /**
+ * @return Returns the xViewer.
+ */
+ public MergeXViewer getXViewer() {
+ return mergeXViewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.skynet.gui.widgets.XWidget#getData()
+ */
+ @Override
+ public Object getData() {
+ return mergeXViewer.getInput();
+ }
+
+ public IDirtiableEditor getEditor() {
+ return editor;
+ }
+
+ public void setEditor(IDirtiableEditor editor) {
+ this.editor = editor;
+ }
+
+ public void setInputData(final Branch sourceBranch, final Branch destBranch, final TransactionId tranId, final MergeView mergeView, final TransactionId commitTrans, boolean showConflicts) {
+ setInputData(sourceBranch, destBranch, tranId, mergeView, commitTrans, "", showConflicts);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.IDamWidget#setArtifact(org.eclipse.osee.framework.skynet.core.artifact.Artifact, java.lang.String)
+ */
+ public void setInputData(final Branch sourceBranch, final Branch destBranch, final TransactionId tranId, final MergeView mergeView, final TransactionId commitTrans, String loadingText, final boolean showConflicts) {
+ this.sourceBranch = sourceBranch;
+ this.destBranch = destBranch;
+ this.tranId = tranId;
+ this.mergeView = mergeView;
+ this.commitTrans = commitTrans;
+ extraInfoLabel.setText(LOADING + loadingText);
+ Job job = new Job("Loading Merge Manager") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ SwtStatusMonitor swtMonitor = new SwtStatusMonitor(monitor);
+ try {
+ if (showConflicts) {
+ if (commitTrans == null) {
+ conflicts =
+ ConflictManagerInternal.getConflictsPerBranch(sourceBranch, destBranch, tranId, swtMonitor).toArray(
+ new Conflict[0]);
+ } else {
+ conflicts =
+ ConflictManagerInternal.getConflictsPerBranch(commitTrans, swtMonitor).toArray(
+ new Conflict[0]);
+ }
+ }
+
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ if (showConflicts) {
+ if (conflicts.length == 0) {
+ extraInfoLabel.setText(NO_CONFLICTS);
+ } else {
+ setConflicts(conflicts);
+ mergeView.setConflicts(conflicts);
+ refresh();
+ }
+ } else {
+ extraInfoLabel.setText(CONFLICTS_NOT_LOADED);
+ }
+ checkForCompleteCommit();
+ }
+ });
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ Jobs.startJob(job);
+ if (sourceBranch != null) {
+ refreshAssociatedArtifactItem(sourceBranch);
+ }
+ }
+
+ private void refreshAssociatedArtifactItem(Branch sourceBranch) {
+ try {
+ Artifact branchAssociatedArtifact = sourceBranch.getAssociatedArtifact();
+ if (branchAssociatedArtifact != null) {
+ openAssociatedArtifactAction.setImageDescriptor(ImageManager.getImageDescriptor(branchAssociatedArtifact));
+ openAssociatedArtifactAction.setEnabled(true);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void setConflicts(Conflict[] conflicts) throws IllegalStateException {
+ this.conflicts = conflicts;
+ loadTable();
+ int resolved = 0;
+ int informational = 0;
+ for (Conflict conflict : conflicts) {
+ if (conflict.statusResolved() || conflict.statusCommitted()) {
+ resolved++;
+ }
+ if (conflict.statusInformational()) {
+ informational++;
+ }
+ }
+ mergeXViewer.setConflicts(conflicts);
+ if (conflicts != null && conflicts.length != 0) {
+ if (sourceBranch != null) {
+ displayLabelText =
+ "Source Branch : " + sourceBranch.getBranchName() + "\nDestination Branch : " + destBranch.getBranchName();
+ } else {
+ displayLabelText = "Commit Transaction ID : " + commitTrans + " " + commitTrans.getComment();
+ }
+ if (resolved == conflicts.length - informational) {
+ extraInfoLabel.setText(displayLabelText + CONFLICTS_RESOLVED);
+ } else {
+ extraInfoLabel.setText(displayLabelText + "\nConflicts : " + (conflicts.length - informational) + " <=> Resolved : " + resolved + (informational == 0 ? " " : "\nInformational Conflicts : " + informational));
+ }
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (IActionable.class.equals(adapter)) {
+ return new MergeViewerActionable();
+ }
+ return null;
+ }
+
+ private Action getCompleteCommitAction() {
+ if (completeCommitAction == null) {
+ completeCommitAction = new CompleteCommitAction();
+ }
+ return completeCommitAction;
+ }
+
+ private Branch getMergeBranch() {
+ if (conflicts != null && conflicts.length != 0) {
+ return conflicts[0].getMergeBranch();
+ }
+ return null;
+ }
+
+ private boolean hasMergeBranchBeenCommitted() {
+ final Branch mergeBranch = getMergeBranch();
+ return mergeBranch != null && !mergeBranch.isEditable();
+ }
+
+ private void checkForCompleteCommit() {
+ boolean isVisible = false;
+ if (conflicts != null && conflicts.length != 0) {
+ isVisible = !hasMergeBranchBeenCommitted() && areAllConflictsResolved();
+ isVisible &= sourceBranch != null && sourceBranch.isRebaselined();
+ }
+ setCompleteCommitItemVisible(isVisible);
+ }
+
+ private void setCompleteCommitItemVisible(boolean isVisible) {
+ IToolBarManager manager = getToolBarManager();
+ boolean wasFound = manager.find(COMPLETE_COMMIT_ACTION_ID) != null;
+ if (isVisible) {
+ if (!wasFound) {
+ manager.insertBefore(REFRESH_ACTION_ID, getCompleteCommitAction());
+ }
+ } else if (wasFound) {
+ manager.remove(COMPLETE_COMMIT_ACTION_ID);
+ }
+ manager.update(true);
+ }
+
+ private final class MergeViewerActionable implements IActionable {
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ @Override
+ public String getActionDescription() {
+ StringBuilder sb = new StringBuilder();
+ if (sourceBranch != null) {
+ sb.append("\nSource Branch: " + sourceBranch);
+ }
+ if (destBranch != null) {
+ sb.append("\nDestination Branch: " + destBranch);
+ }
+ if (tranId != null) {
+ sb.append("\nTransactionId: " + tranId);
+ }
+ if (commitTrans != null) {
+ sb.append("\nCommit TransactionId: " + commitTrans);
+ }
+ return sb.toString();
+ }
+ }
+
+ private final class CompleteCommitAction extends Action {
+ public CompleteCommitAction() {
+ super();
+ setImageDescriptor(FrameworkImage.BRANCH_COMMIT.createImageDescriptor());
+ setToolTipText("Commit changes into destination branch");
+ setId(COMPLETE_COMMIT_ACTION_ID);
+ }
+
+ @Override
+ public void run() {
+ if (sourceBranch.isRebaselineInProgress()) {
+ ConflictManagerExternal conflictManager = new ConflictManagerExternal(destBranch, sourceBranch);
+ BranchManager.completeUpdateBranch(conflictManager, true, false);
+ }
+ }
+ }
+
+ private final class OpenAssociatedArtifactAction extends Action {
+
+ public OpenAssociatedArtifactAction() {
+ super();
+ setToolTipText("Open Associated Artifact");
+ setEnabled(false);
+ }
+
+ @Override
+ public void run() {
+ try {
+ Branch sourceBranch = conflicts[0].getSourceBranch();
+ Artifact branchAssociatedArtifact = sourceBranch.getAssociatedArtifact();
+ if (branchAssociatedArtifact instanceof IATSArtifact) {
+ OseeAts.openATSArtifact(branchAssociatedArtifact);
+ return;
+ } else if (!branchAssociatedArtifact.equals(UserManager.getUser(SystemUser.OseeSystem))) {
+ ArtifactEditor.editArtifact(branchAssociatedArtifact);
+ return;
+ }
+ AWorkbench.popup("ERROR", "Unknown branch association");
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ private final class ShowSourceBranchChangeReportAction extends Action {
+
+ public ShowSourceBranchChangeReportAction() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("branch_change_source.gif"));
+ setToolTipText("Show Source Branch Change Report");
+ }
+
+ @Override
+ public void run() {
+ if (conflicts.length != 0) {
+ if (conflicts[0].getSourceBranch() != null) {
+ try {
+ ChangeView.open(conflicts[0].getSourceBranch());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ } else {
+ try {
+ ChangeView.open(conflicts[0].getCommitTransactionId());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+ }
+
+ private final class ShowDestinationBranchChangeReportAction extends Action {
+
+ public ShowDestinationBranchChangeReportAction() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("branch_change_dest.gif"));
+ setToolTipText("Show Destination Branch Change Report");
+ }
+
+ @Override
+ public void run() {
+ if (conflicts.length != 0) {
+ try {
+ ChangeView.open(conflicts[0].getDestBranch());
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+
+ private final class RefreshAction extends Action {
+
+ public RefreshAction() {
+ super();
+ setImageDescriptor(ImageManager.getImageDescriptor(FrameworkImage.REFRESH));
+ setToolTipText("Refresh");
+ setId(REFRESH_ACTION_ID);
+ }
+
+ @Override
+ public void run() {
+ setInputData(sourceBranch, destBranch, tranId, mergeView, commitTrans, true);
+ }
+ }
+
+ private final class CustomizeTableAction extends Action {
+ public CustomizeTableAction() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("customize.gif"));
+ setToolTipText("Customize Table");
+ }
+
+ @Override
+ public void run() {
+ mergeXViewer.getCustomizeMgr().handleTableCustomization();
+ }
+ }
+
+ private final class ApplyPriorMergeResultsAction extends Action {
+ public ApplyPriorMergeResultsAction() {
+ super();
+ setImageDescriptor(SkynetGuiPlugin.getInstance().getImageDescriptor("branch_merge.gif"));
+ setToolTipText("Apply Merge Results From Prior Merge");
+ }
+
+ @Override
+ public void run() {
+ if (conflicts.length != 0) {
+ if (conflicts[0].getSourceBranch() != null) {
+ //(Object[] choose, Shell parentShell, String dialogTitle, Image dialogTitleImage,
+ //String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex)
+ ArrayList<String> selections = new ArrayList<String>();
+ ArrayList<Integer> branchIds = new ArrayList<Integer>();
+ try {
+ Collection<Integer> destBranches =
+ ConflictManagerInternal.getDestinationBranchesMerged(sourceBranch.getBranchId());
+ for (Integer integer : destBranches) {
+ if (integer.intValue() != destBranch.getBranchId()) {
+ selections.add(BranchManager.getBranch(integer).getBranchName());
+ branchIds.add(integer);
+ }
+ }
+ if (selections.size() > 0) {
+ ListSelectionDialogNoSave dialog =
+ new ListSelectionDialogNoSave(selections.toArray(),
+ Display.getCurrent().getActiveShell().getShell(), "Apply Prior Merge Resolution",
+ null, "Select the destination branch that the previous commit was appplied to", 2,
+ new String[] {"Apply", "Cancel"}, 1);
+ if (dialog.open() == 0) {
+ System.out.print("Applying the merge found for Branch " + branchIds.toArray()[dialog.getSelection()]);
+ applyPreviousMerge(branchIds.get(dialog.getSelection()));
+ }
+ }
+ if (selections.size() == 0) {
+ new MessageDialog(Display.getCurrent().getActiveShell().getShell(),
+ "Apply Prior Merge Resolution", null, "This Source Branch has had No Prior Merges", 2,
+ new String[] {"OK"}, 1).open();
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/test/Merge Manager Manual GUI testing.doc b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/test/Merge Manager Manual GUI testing.doc
new file mode 100644
index 00000000000..1f143fd9f0f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xmerge/test/Merge Manager Manual GUI testing.doc
Binary files differ
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateComposite.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateComposite.java
new file mode 100644
index 00000000000..298d02e2f22
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateComposite.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xnavigate;
+
+import java.util.List;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.util.filteredTree.OSEEFilteredTree;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateComposite extends Composite {
+
+ protected Browser browser;
+ protected OSEEFilteredTree filteredTree;
+ private static PatternFilter patternFilter = new PatternFilter();
+ protected final XNavigateViewItems navigateViewItems;
+ private List<XNavigateItem> items;
+ public static enum TableLoadOption {
+ None,
+ // Wait for table to be loaded before returning; for test only
+ ForcePend,
+ //
+ ClearLastSearchItem,
+ // Don't perform UI check, just search
+ NoUI,
+ // Don't create fresh copy of search item; for test only
+ DontCopySearchItem
+ };
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public XNavigateComposite(XNavigateViewItems navigateViewItems, Composite parent, int style) {
+ super(parent, style);
+ this.navigateViewItems = navigateViewItems;
+
+ setLayout(new GridLayout(1, false));
+ setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ /*
+ * Create a grid layout object so the text and treeviewer are layed out the way I want.
+ */
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+ // parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
+
+ // if (!ConnectionHandler.isConnected()) {
+ // (new Label(parent, SWT.NONE)).setText("DB Connection Unavailable");
+ // return;
+ // }
+
+ filteredTree = new OSEEFilteredTree(this, SWT.SINGLE | SWT.BORDER, patternFilter);
+ filteredTree.getViewer().setContentProvider(new XNavigateContentProvider());
+ filteredTree.setInitialText("");
+ filteredTree.getViewer().setLabelProvider(new XNavigateLabelProvider());
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ filteredTree.getViewer().getTree().setLayoutData(gd);
+ filteredTree.getViewer().addDoubleClickListener(new IDoubleClickListener(){
+ @Override
+ public void doubleClick(DoubleClickEvent event) {
+ try {
+ handleDoubleClick();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ });
+ filteredTree.getViewer().getTree().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
+ try {
+ handleDoubleClick();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+ });
+ // Disable native tree tooltip
+ filteredTree.getViewer().getTree().setToolTipText("");
+ filteredTree.getViewer().getTree().addListener(SWT.Dispose, tableListener);
+ filteredTree.getViewer().getTree().addListener(SWT.KeyDown, tableListener);
+ filteredTree.getViewer().getTree().addListener(SWT.MouseMove, tableListener);
+ filteredTree.getViewer().getTree().addListener(SWT.MouseHover, tableListener);
+
+ }
+
+ // Implement a "fake" tooltip
+ final Listener labelListener = new Listener() {
+ public void handleEvent(Event event) {
+ Label label = (Label) event.widget;
+ Shell shell = label.getShell();
+ switch (event.type) {
+ case SWT.MouseDown:
+ Event e = new Event();
+ e.item = (TableItem) label.getData("_TABLEITEM");
+ // Assuming table is single select, set the selection as if
+ // the mouse down event went through to the table
+ // filteredTree.getViewer().getTree().setSelection(new TableItem[] {(TableItem) e.item});
+ filteredTree.getViewer().getTree().notifyListeners(SWT.Selection, e);
+ shell.dispose();
+ filteredTree.getViewer().getTree().setFocus();
+ break;
+ case SWT.MouseExit:
+ shell.dispose();
+ break;
+ }
+ }
+ };
+
+ Shell tip = null;
+ Label label = null;
+
+ private void disposeTooltip() {
+ if (tip == null) return;
+ tip.dispose();
+ tip = null;
+ label = null;
+ }
+ Listener tableListener = new Listener() {
+
+ public void handleEvent(Event event) {
+ switch (event.type) {
+ case SWT.Dispose:
+ case SWT.KeyDown:
+ case SWT.MouseMove: {
+ if (tip == null) break;
+ disposeTooltip();
+ break;
+ }
+ case SWT.MouseHover: {
+ TreeItem item = filteredTree.getViewer().getTree().getItem(new Point(event.x, event.y));
+ if (item != null && (item.getData() instanceof XNavigateItem) && ((XNavigateItem) item.getData()).getDescription() != null && !((XNavigateItem) item.getData()).getDescription().equals(
+ "")) {
+ if (tip != null && !tip.isDisposed()) tip.dispose();
+ tip = new Shell(Display.getCurrent().getActiveShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
+ tip.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ FillLayout layout = new FillLayout();
+ layout.marginWidth = 2;
+ tip.setLayout(layout);
+ label = new Label(tip, SWT.NONE);
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ label.setData("_TABLEITEM", item);
+ label.setText(item.getText() + "\n\n" + ((XNavigateItem) item.getData()).getDescription());
+ label.addListener(SWT.MouseExit, labelListener);
+ label.addListener(SWT.MouseDown, labelListener);
+ Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ Rectangle rect = item.getBounds(0);
+ Point pt = filteredTree.getViewer().getTree().toDisplay(rect.x, rect.y);
+ tip.setBounds(pt.x, pt.y + 15, size.x, size.y);
+ tip.setVisible(true);
+ }
+ }
+ }
+ }
+ };
+
+ protected void handleDoubleClick() throws OseeCoreException {
+ IStructuredSelection sel = (IStructuredSelection) filteredTree.getViewer().getSelection();
+ if (!sel.iterator().hasNext()) return;
+ XNavigateItem item = (XNavigateItem) sel.iterator().next();
+ handleDoubleClick(item);
+ }
+
+ protected void handleDoubleClick(XNavigateItem item, TableLoadOption... tableLoadOptions) throws OseeCoreException {
+ disposeTooltip();
+
+ if (item.getChildren().size() > 0) {
+ filteredTree.getViewer().setExpandedState(item, true);
+ } else {
+ try {
+ item.run(tableLoadOptions);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+
+ public void refresh() {
+ items = navigateViewItems.getSearchNavigateItems();
+ Display.getDefault().asyncExec(new Runnable(){
+ public void run(){
+ filteredTree.getViewer().setInput(items);
+ }
+ });
+ }
+ /**
+ * @return the listViewer
+ */
+ public FilteredTree getFilteredTree() {
+ return filteredTree;
+ }
+
+ /**
+ * @return the patternFilter
+ */
+ public PatternFilter getPatternFilter() {
+ return patternFilter;
+ }
+
+ /**
+ * @return the items
+ */
+ public List<XNavigateItem> getItems() {
+ return items;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateContentProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateContentProvider.java
new file mode 100644
index 00000000000..f8dc4dcbfd5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateContentProvider.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.framework.ui.skynet.widgets.xnavigate;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateContentProvider implements ITreeContentProvider {
+
+ /**
+ *
+ */
+ public XNavigateContentProvider() {
+ super();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Object[]) return (Object[]) parentElement;
+ if (parentElement instanceof Collection) return ((Collection) parentElement).toArray();
+ if (parentElement instanceof XNavigateItem) return ((XNavigateItem) parentElement).getChildren().toArray(
+ new Object[((XNavigateItem) parentElement).getChildren().size()]);
+ return new Object[0];
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ public Object getParent(Object element) {
+ if (element instanceof XNavigateItem) return ((XNavigateItem) element).getParent();
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+ * java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItem.java
new file mode 100644
index 00000000000..55c24f0581d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItem.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.framework.ui.skynet.widgets.xnavigate;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateItem {
+
+ private final List<XNavigateItem> children = new ArrayList<XNavigateItem>();
+ private String name;
+ private XNavigateItem parent;
+ private final Image image;
+
+ public XNavigateItem(XNavigateItem parent, String name, OseeImage oseeImage) {
+ this.parent = parent;
+ this.name = name;
+ this.image = oseeImage == null ? null : ImageManager.getImage(oseeImage);
+ if (parent != null) parent.addChild(this);
+ }
+
+ public XNavigateItem(XNavigateItem parent, String name, Image oseeImage) {
+ this.parent = parent;
+ this.name = name;
+ this.image = oseeImage;
+ if (parent != null) parent.addChild(this);
+ }
+
+ public void addChild(XNavigateItem item) {
+ children.add(item);
+ }
+
+ public void removeChild(XNavigateItem item) {
+ children.remove(item);
+ }
+
+ public List<XNavigateItem> getChildren() {
+ return children;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public XNavigateItem getParent() {
+ return parent;
+ }
+
+ public String getDescription() {
+ return "";
+ }
+
+ /**
+ * @return the image
+ */
+ public Image getImage() {
+ return image;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ }
+
+ /**
+ * @param parent the parent to set
+ */
+ public void setParent(XNavigateItem parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemAction.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemAction.java
new file mode 100644
index 00000000000..bb1d341d919
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemAction.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.framework.ui.skynet.widgets.xnavigate;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Used to perform a specific java action
+ *
+ * @author Donald G. Dunne
+ */
+public class XNavigateItemAction extends XNavigateItem {
+
+ private final Action action;
+ private boolean promptFirst = false;
+
+ public XNavigateItemAction(XNavigateItem parent, String name) {
+ this(parent, name, null);
+ }
+
+ public XNavigateItemAction(XNavigateItem parent, String name, OseeImage oseeImage) {
+ this(parent, name, false, oseeImage);
+ }
+
+ public XNavigateItemAction(XNavigateItem parent, String name, boolean promptFirst, OseeImage oseeImage) {
+ super(parent, name, oseeImage);
+ this.action = null;
+ this.promptFirst = promptFirst;
+ }
+
+ public XNavigateItemAction(XNavigateItem parent, Action action, OseeImage oseeImage) {
+ this(parent, action, oseeImage, false);
+ }
+
+ public XNavigateItemAction(XNavigateItem parent, Action action, OseeImage oseeImage, boolean promptFirst) {
+ super(parent, action.getText(), oseeImage);
+ this.action = action;
+ this.promptFirst = promptFirst;
+ }
+
+ @Deprecated
+ public XNavigateItemAction(XNavigateItem parent, Action action, Image oseeImage, boolean promptFirst) {
+ super(parent, action.getText(), oseeImage);
+ this.action = action;
+ this.promptFirst = promptFirst;
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ if (action != null) {
+ if (promptFirst) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), getName(), getName())) {
+ action.run();
+ }
+ }
+ });
+ } else if (action.getStyle() == Action.AS_CHECK_BOX) {
+ action.setChecked(!action.isChecked());
+ if (action.isChecked()) {
+ action.run();
+ }
+ } else {
+ action.run();
+ }
+ }
+ }
+
+ public boolean isPromptFirst() {
+ return promptFirst;
+ }
+
+ public void setPromptFirst(boolean promptFirst) {
+ this.promptFirst = promptFirst;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemBlam.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemBlam.java
new file mode 100644
index 00000000000..cdd65f23317
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemBlam.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.framework.ui.skynet.widgets.xnavigate;
+
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.blam.BlamEditor;
+import org.eclipse.osee.framework.ui.skynet.blam.operation.BlamOperation;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateItemBlam extends XNavigateItem {
+ private final BlamOperation blamOperation;
+
+ /**
+ * @param parent
+ * @param name
+ */
+ public XNavigateItemBlam(XNavigateItem parent, BlamOperation blamOperation) {
+ super(parent, blamOperation.getName(), FrameworkImage.BLAM);
+ this.blamOperation = blamOperation;
+ }
+
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) throws Exception {
+ // Need a new copy of the BLAM operation so widgets don't collide
+ BlamEditor.edit(blamOperation);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemFolder.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemFolder.java
new file mode 100644
index 00000000000..b78a18c86e1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateItemFolder.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.framework.ui.skynet.widgets.xnavigate;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateItemFolder extends XNavigateItem {
+
+ /**
+ * @param parent
+ * @param name
+ * @throws OseeArgumentException
+ */
+ public XNavigateItemFolder(XNavigateItem parent, String name) throws OseeArgumentException {
+ super(parent, name, name.contains("Admin") ? FrameworkImage.ADMIN : FrameworkImage.FOLDER);
+ }
+
+ /**
+ * @param parent
+ * @param name
+ * @param image
+ * @throws OseeArgumentException
+ */
+ public XNavigateItemFolder(XNavigateItem parent, String name, OseeImage oseeImage) throws OseeArgumentException {
+ super(parent, name, oseeImage);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateLabelProvider.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateLabelProvider.java
new file mode 100644
index 00000000000..30714aeffc7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateLabelProvider.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.framework.ui.skynet.widgets.xnavigate;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+public class XNavigateLabelProvider implements ILabelProvider {
+
+ /**
+ * ListViewers don't support images
+ *
+ * @param arg0 the element
+ * @return Image
+ */
+ public Image getImage(Object arg0) {
+ return ((XNavigateItem) arg0).getImage();
+ }
+
+ /**
+ * Gets the text for an element
+ *
+ * @param arg0 the element
+ * @return String
+ */
+ public String getText(Object arg0) {
+ if (arg0 == null) return "";
+ return ((XNavigateItem) arg0).getName();
+ }
+
+ /**
+ * Adds a listener
+ *
+ * @param arg0 the listener
+ */
+ public void addListener(ILabelProviderListener arg0) {
+ // Throw it away
+ }
+
+ /**
+ * Disposes any resources
+ */
+ public void dispose() {
+ // Nothing to dispose
+ }
+
+ /**
+ * Returns whether changing the specified property for the specified element affect the label
+ *
+ * @param arg0 the element
+ * @param arg1 the property
+ * @return boolean
+ */
+ public boolean isLabelProperty(Object arg0, String arg1) {
+ return false;
+ }
+
+ /**
+ * Removes a listener
+ *
+ * @param arg0 the listener
+ */
+ public void removeListener(ILabelProviderListener arg0) {
+ // Ignore
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateUrlItem.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateUrlItem.java
new file mode 100644
index 00000000000..f2d8daf9a76
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateUrlItem.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.framework.ui.skynet.widgets.xnavigate;
+
+import java.net.URL;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.swt.program.Program;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateUrlItem extends XNavigateItemAction {
+
+ private final String url;
+ private final boolean external;
+
+ /**
+ * Creates a navigation item that will open the given url either internal or external to Eclipse.
+ *
+ * @param parent
+ * @param name to use as display name
+ * @param url to open
+ * @param external true to open in system browser; false to open inside Eclipse
+ * @throws OseeArgumentException
+ */
+ public XNavigateUrlItem(XNavigateItem parent, String name, String url, boolean external) throws OseeArgumentException {
+ this(parent, name, url, external, null);
+ }
+
+ public XNavigateUrlItem(XNavigateItem parent, String name, String url, boolean external, OseeImage oseeImage) throws OseeArgumentException {
+ super(parent, name, oseeImage);
+ this.url = url;
+ this.external = external;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ats.navigate.ActionNavigateItem#run()
+ */
+ @Override
+ public void run(TableLoadOption... tableLoadOptions) {
+ if (external)
+ Program.launch(url);
+ else {
+ IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+ try {
+ IWebBrowser browser = browserSupport.createBrowser("osee.ats.navigator.browser");
+ browser.openURL(new URL(url));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewFilter.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewFilter.java
new file mode 100644
index 00000000000..feb9dc9326b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewFilter.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.framework.ui.skynet.widgets.xnavigate;
+
+import java.util.regex.Pattern;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class XNavigateViewFilter extends ViewerFilter {
+
+ private boolean enabled = false;
+ private String text;
+
+ public XNavigateViewFilter(TreeViewer treeViewer) {
+ }
+
+ public void setFilterText(String text) {
+ this.text = text;
+
+ }
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (!enabled) return true;
+ XNavigateItem item = (XNavigateItem) element;
+ return Pattern.compile(text).matcher(item.getName()).find();
+ }
+
+ /**
+ * @return the enabled
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * @param enabled the enabled to set
+ */
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewItems.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewItems.java
new file mode 100644
index 00000000000..d6837c7ef95
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xnavigate/XNavigateViewItems.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.framework.ui.skynet.widgets.xnavigate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XNavigateViewItems {
+ private static XNavigateViewItems navigateSearches = new XNavigateViewItems();
+
+ protected XNavigateViewItems() {
+ super();
+ }
+
+ public static XNavigateViewItems getInstance() {
+ return navigateSearches;
+ }
+
+ public List<XNavigateItem> getSearchNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+ return items;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/OseeXViewerTreeReport.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/OseeXViewerTreeReport.java
new file mode 100644
index 00000000000..1f6bbbd417e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/OseeXViewerTreeReport.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.framework.ui.skynet.widgets.xviewer;
+
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerTreeReport;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.results.XResultData;
+import org.eclipse.osee.framework.ui.skynet.results.html.XResultPage.Manipulations;
+import org.eclipse.swt.widgets.TreeItem;
+
+public class OseeXViewerTreeReport extends XViewerTreeReport {
+
+ public OseeXViewerTreeReport(String title, XViewer treeViewer) {
+ super(title, treeViewer);
+ }
+
+ public OseeXViewerTreeReport(XViewer xViewer) {
+ super("Table View Report", xViewer);
+ }
+
+ @Override
+ public void open(TreeItem items[]) {
+ try {
+ String html = getHtml(items);
+ XResultData xResultData = new XResultData();
+ xResultData.addRaw(html);
+ xResultData.report(title, Manipulations.RAW_HTML);
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/AttributeSortDataType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/AttributeSortDataType.java
new file mode 100644
index 00000000000..9f98ec54023
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/AttributeSortDataType.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.framework.ui.skynet.widgets.xviewer.skynet;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AttributeSortDataType {
+
+ public static SortDataType getSortDataType(AttributeType attributeType) {
+ SortDataType sortType = SortDataType.String;
+ if (attributeType.getBaseAttributeClass().equals(DateAttribute.class))
+ sortType = SortDataType.Date;
+ else if (attributeType.getBaseAttributeClass().equals(FloatingPointAttribute.class))
+ sortType = SortDataType.Float;
+ else if (attributeType.getBaseAttributeClass().equals(IntegerAttribute.class))
+ sortType = SortDataType.Integer;
+ else if (attributeType.getBaseAttributeClass().equals(BooleanAttribute.class)) sortType = SortDataType.Boolean;
+ return sortType;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetCustomizations.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetCustomizations.java
new file mode 100644
index 00000000000..303efd7cdee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetCustomizations.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.skynet.widgets.xviewer.skynet;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkynetCustomizations implements IXViewerCustomizations {
+
+ // Artifact that stores shared/global customizations
+ private Artifact globalCustomizationsArtifact;
+ // Collection of all customizations both from local and global storage
+ private final List<CustomizeData> custDatas = new ArrayList<CustomizeData>();
+ // Storage mechanism (user's User Artifact) for storage of selected default customizations guids for each XViewer namespace
+ private final SkynetUserArtifactCustomizeDefaults userArtifactDefaults;
+ // Attribute name for storing customizations both locally and globally
+ private static String CUSTOMIZATION_ATTRIBUTE_NAME = "XViewer Customization";
+ private final SkynetXViewerFactory skynetXViewerFactory;
+
+ public SkynetCustomizations(SkynetXViewerFactory skynetXViewerFactory) throws OseeCoreException {
+ this.skynetXViewerFactory = skynetXViewerFactory;
+ this.userArtifactDefaults = new SkynetUserArtifactCustomizeDefaults(UserManager.getUser());
+ globalCustomizationsArtifact = XViewerCustomizationArtifact.getAtsCustArtifact();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#getCustDatas()
+ */
+ public List<CustomizeData> getSavedCustDatas() throws OseeCoreException {
+ loadCustomizationData();
+ return custDatas;
+ }
+
+ private static void saveCustomization(CustomizeData custData, Artifact saveArt) throws OseeCoreException {
+ boolean found = false;
+ Collection<Attribute<String>> attributes = saveArt.getAttributes(CUSTOMIZATION_ATTRIBUTE_NAME);
+ for (Attribute<String> attribute : attributes) {
+ if (attribute.getDisplayableString().contains("namespace=\"" + custData.getNameSpace() + "\"") && attribute.getDisplayableString().contains(
+ "name=\"" + custData.getName() + "\"")) {
+ attribute.setValue(custData.getXml(true));
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ saveArt.addAttribute(CUSTOMIZATION_ATTRIBUTE_NAME, custData.getXml(true));
+ }
+ saveArt.persistAttributes();
+ }
+
+ public void saveCustomization(CustomizeData custData) throws OseeCoreException {
+ if (custData.isPersonal())
+ saveCustomization(custData, UserManager.getUser());
+ else
+ saveCustomization(custData, globalCustomizationsArtifact);
+ }
+
+ public void loadCustomizationData() throws OseeCoreException {
+ custDatas.clear();
+ User user = UserManager.getUser();
+ if (user != null) custDatas.addAll(getArtifactCustomizations(user));
+ for (CustomizeData custData : custDatas)
+ custData.setPersonal(true);
+ custDatas.addAll(getArtifactCustomizations(getGlobalCustomizationsArtifact()));
+ }
+
+ /**
+ * @return Returns the defaultCustomizationsArtifact.
+ */
+ public Artifact getGlobalCustomizationsArtifact() {
+ return globalCustomizationsArtifact;
+ }
+
+ /**
+ * Artifact that holds default customizations for this XTreeViewer. These will be selectable to everyone, but only
+ * writable to Developer/AtsAdmin. Users will be able to save their own customizations separately. If no defaults are
+ * necessary, don't set this artifact upon creation.
+ *
+ * @param defaultCustomizationsArtifact The defaultCustomizationsArtifact to set.
+ */
+ public void setGlobalCustomizationsArtifact(Artifact defaultCustomizationsArtifact) {
+ this.globalCustomizationsArtifact = defaultCustomizationsArtifact;
+ }
+
+ public void deleteCustomization(CustomizeData custData) throws OseeCoreException {
+ Artifact deleteArt = null;
+ if (custData.isPersonal())
+ deleteArt = UserManager.getUser();
+ else
+ deleteArt = getGlobalCustomizationsArtifact();
+ deleteCustomization(custData, deleteArt);
+ // Remove item as default if set
+ if (userArtifactDefaults.isDefaultCustomization(custData)) {
+ userArtifactDefaults.removeDefaultCustomization(custData);
+ userArtifactDefaults.save();
+ }
+
+ }
+
+ public void deleteCustomization(CustomizeData custData, Artifact deleteArt) throws OseeCoreException {
+ Pattern pattern = Pattern.compile("name=\"(.*?)\".*?namespace=\"" + custData.getNameSpace() + "\"");
+ for (Attribute<?> attribute : deleteArt.getAttributes(CUSTOMIZATION_ATTRIBUTE_NAME)) {
+ String str = attribute.getDisplayableString();
+ Matcher m = pattern.matcher(str);
+ if (m.find() && m.group(1).equals(custData.getName())) {
+ attribute.delete();
+ deleteArt.persistAttributes();
+ break;
+ }
+ }
+ }
+
+ public CustomizeData getUserDefaultCustData() throws XViewerException {
+ try {
+ for (CustomizeData custData : getSavedCustDatas()) {
+ if (userArtifactDefaults.isDefaultCustomization(custData)) {
+ return custData;
+ }
+ }
+ return null;
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+
+ public boolean isCustomizationUserDefault(CustomizeData custData) {
+ try {
+ return (getUserDefaultCustData() != null && getUserDefaultCustData().getGuid().equals(custData.getGuid()));
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
+ public void setUserDefaultCustData(CustomizeData newCustData, boolean set) throws Exception {
+ // Remove old defaults
+ for (CustomizeData custData : getSavedCustDatas()) {
+ if (userArtifactDefaults.isDefaultCustomization(custData)) {
+ userArtifactDefaults.removeDefaultCustomization(custData);
+ }
+ }
+ // Add new default
+ if (set) userArtifactDefaults.setDefaultCustomization(newCustData);
+ // persist
+ userArtifactDefaults.save();
+ }
+
+ private List<CustomizeData> getArtifactCustomizations(Artifact customizationArtifact) throws OseeCoreException {
+ List<CustomizeData> custDatas = new ArrayList<CustomizeData>();
+ if (customizationArtifact != null) {
+
+ Collection<Attribute<String>> attributes = customizationArtifact.getAttributes(CUSTOMIZATION_ATTRIBUTE_NAME);
+ for (Attribute<String> attr : attributes) {
+ String str = attr.getValue();
+ Matcher m =
+ Pattern.compile("name=\"(.*?)\".*?namespace=\"" + skynetXViewerFactory.getNamespace() + "\"").matcher(
+ str);
+ if (m.find()) {
+ CustomizeData custData = new CustomizeData(str);
+ custDatas.add(custData);
+ }
+ }
+ }
+ return custDatas;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizations#isCustomizationPersistAvailable()
+ */
+ public boolean isCustomizationPersistAvailable() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetUserArtifactCustomizeDefaults.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetUserArtifactCustomizeDefaults.java
new file mode 100644
index 00000000000..03c4290dca8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetUserArtifactCustomizeDefaults.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.framework.ui.skynet.widgets.xviewer.skynet;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * This class provides the functionality necessary to store the user's defaults in their User Artifact
+ *
+ * @author Donald G. Dunne
+ */
+public class SkynetUserArtifactCustomizeDefaults {
+
+ // XViewer.getViewerNamespace, CustomizeData.getName
+ Set<String> defaultGuids = new HashSet<String>();
+ private static String XVIEWER_DEFAULT_ATTRIBUTE = "XViewer Defaults";
+ private static String DEFAULT_CUST_GUID_TAG = "defaultCustGuid";
+ private final User user;
+
+ public SkynetUserArtifactCustomizeDefaults(User user) {
+ this.user = user;
+ loadCustomizeDefaults();
+ }
+
+ public int size() {
+ return defaultGuids.size();
+ }
+
+ private void setDefaultCustomizationsFromXml(String xml) {
+ defaultGuids.clear();
+ Matcher m = Pattern.compile("<" + DEFAULT_CUST_GUID_TAG + ">(.*?)</" + DEFAULT_CUST_GUID_TAG + ">").matcher(xml);
+ while (m.find()) {
+ defaultGuids.add(m.group(1));
+ }
+ }
+
+ public void setDefaultCustomization(CustomizeData custData) {
+ defaultGuids.add(custData.getGuid());
+ }
+
+ public void removeDefaultCustomization(CustomizeData custData) {
+ defaultGuids.remove(custData.getGuid());
+ }
+
+ public boolean isDefaultCustomization(CustomizeData custData) {
+ return defaultGuids.contains(custData.getGuid());
+ }
+
+ private void loadCustomizeDefaults() {
+ String xml = "";
+ if (user != null) {
+ try {
+ xml = user.getSoleAttributeValue(XVIEWER_DEFAULT_ATTRIBUTE, "");
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ xml = "";
+ }
+ }
+ setDefaultCustomizationsFromXml(xml);
+ }
+
+ public void save() {
+ try {
+ if (defaultGuids.size() == 0) {
+ user.deleteSoleAttribute(XVIEWER_DEFAULT_ATTRIBUTE);
+ } else {
+ user.setSoleAttributeValue(XVIEWER_DEFAULT_ATTRIBUTE, getDefaultCustomizationXml());
+ }
+ user.persistAttributes();
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ public Set<String> getGuids() {
+ return defaultGuids;
+ }
+
+ public void setGuids(Collection<String> defaultGuids) {
+ this.defaultGuids.clear();
+ this.defaultGuids.addAll(defaultGuids);
+ }
+
+ private String getDefaultCustomizationXml() {
+ StringBuffer sb = new StringBuffer();
+ for (String guid : defaultGuids)
+ sb.append(AXml.addTagData(DEFAULT_CUST_GUID_TAG, guid));
+ return sb.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.customize.IXViewerCustomizeDefaults#isSaveDefaultsEnabled()
+ */
+ public boolean isSaveDefaultsEnabled() {
+ return user != null;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetXViewerFactory.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetXViewerFactory.java
new file mode 100644
index 00000000000..99e8e53a92a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/SkynetXViewerFactory.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.framework.ui.skynet.widgets.xviewer.skynet;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.XViewerTreeReport;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.XViewerCustomizations;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.OseeXViewerTreeReport;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactNameColumn;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerAttributeColumn;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class SkynetXViewerFactory extends XViewerFactory {
+
+ /**
+ * @param namespace
+ */
+ public SkynetXViewerFactory(String namespace) {
+ super(namespace);
+ }
+
+ private IXViewerCustomizations xViewerCustomizations;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.IXViewerFactory#getXViewerCustomizations()
+ */
+ @Override
+ public IXViewerCustomizations getXViewerCustomizations() {
+ try {
+ if (SkynetGuiPlugin.areOSEEServicesAvailable().isTrue()) {
+ if (xViewerCustomizations == null) {
+ xViewerCustomizations = new SkynetCustomizations(this);
+ }
+ return xViewerCustomizations;
+ }
+ } catch (Throwable ex) {
+ OseeLog.log(SkynetXViewerFactory.class, Level.SEVERE,
+ "Failed to retrieve XViewer customizations from the persistence layer.", ex);
+ }
+ return new XViewerCustomizations();
+ }
+
+ public void registerAllAttributeColumns() {
+ try {
+ registerColumn(getAllAttributeColumns().toArray(new XViewerColumn[AttributeTypeManager.getAllTypes().size()]));
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void registerAllAttributeColumnsForArtifacts(Collection<? extends Artifact> artifacts, boolean show) {
+ try {
+ for (XViewerColumn xCol : SkynetXViewerFactory.getAllAttributeColumnsForArtifacts(artifacts)) {
+ xCol.setShow(show);
+ registerColumn(xCol);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public static List<XViewerColumn> getAllAttributeColumns() throws OseeDataStoreException {
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>();
+ for (AttributeType attributeType : AttributeTypeManager.getAllTypes()) {
+ columns.add(getAttributeColumn(attributeType));
+ }
+ return columns;
+ }
+
+ public static XViewerColumn getAttributeColumn(AttributeType attributeType) {
+ return new XViewerAttributeColumn("attribute." + attributeType.getName(), attributeType.getName(),
+ attributeType.getName(), 75, SWT.LEFT, false, XViewerAttributeSortDataType.get(attributeType), false, null);
+ }
+
+ /**
+ * @param artifacts
+ * @return columns for attributes valid for at least on of the given artifacts
+ */
+ public static List<XViewerColumn> getAllAttributeColumnsForArtifacts(Collection<? extends Artifact> artifacts) {
+ List<XViewerColumn> columns = new ArrayList<XViewerColumn>();
+ Set<AttributeType> attributeTypes = new HashSet<AttributeType>();
+ try {
+ for (Artifact art : artifacts) {
+ attributeTypes.addAll(art.getAttributeTypes());
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ Set<String> attrNames = new HashSet<String>();
+ // Add Name first
+ columns.add(new XViewerArtifactNameColumn("Name"));
+ attrNames.add("Name");
+ for (AttributeType attributeType : attributeTypes) {
+ if (!attrNames.contains(attributeType.getName())) {
+ columns.add(getAttributeColumn(attributeType));
+ attrNames.add(attributeType.getName());
+ }
+ }
+ return columns;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.IXViewerFactory#isAdmin()
+ */
+ @Override
+ public boolean isAdmin() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewerFactory#getXViewerTreeReport(org.eclipse.nebula.widgets.xviewer.XViewer)
+ */
+ @Override
+ public XViewerTreeReport getXViewerTreeReport(XViewer viewer) {
+ return new OseeXViewerTreeReport(viewer);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerAttributeSortDataType.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerAttributeSortDataType.java
new file mode 100644
index 00000000000..520ee44822a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerAttributeSortDataType.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.framework.ui.skynet.widgets.xviewer.skynet;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.BooleanAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.FloatingPointAttribute;
+import org.eclipse.osee.framework.skynet.core.attribute.IntegerAttribute;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerAttributeSortDataType {
+
+ public static SortDataType get(AttributeType attributeType) {
+ SortDataType sortType = SortDataType.String;
+ if (attributeType.getBaseAttributeClass().equals(DateAttribute.class))
+ sortType = SortDataType.Date;
+ else if (attributeType.getBaseAttributeClass().equals(FloatingPointAttribute.class))
+ sortType = SortDataType.Float;
+ else if (attributeType.getBaseAttributeClass().equals(IntegerAttribute.class))
+ sortType = SortDataType.Integer;
+ else if (attributeType.getBaseAttributeClass().equals(BooleanAttribute.class)) sortType = SortDataType.Boolean;
+ return sortType;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerCustomizationArtifact.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerCustomizationArtifact.java
new file mode 100644
index 00000000000..45cc1549340
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/XViewerCustomizationArtifact.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.framework.ui.skynet.widgets.xviewer.skynet;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactType;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
+import org.eclipse.osee.framework.ui.skynet.SkynetGuiPlugin;
+
+/**
+ * This singleton artifact stores the default customizations for ATS XViewers
+ *
+ * @author Donald G. Dunne
+ */
+public class XViewerCustomizationArtifact extends Artifact {
+
+ public static String ARTIFACT_TYPE_NAME = "XViewer Global Customization";
+ public static XViewerCustomizationArtifact xViewerCustomizationArtifact;
+
+ /**
+ * @param parentFactory
+ * @param guid
+ * @param humanReadableId
+ * @param branch
+ */
+ public XViewerCustomizationArtifact(ArtifactFactory parentFactory, String guid, String humanReadableId, Branch branch, ArtifactType artifactType) {
+ super(parentFactory, guid, humanReadableId, branch, artifactType);
+ }
+
+ public static XViewerCustomizationArtifact getAtsCustArtifact() {
+ return getAtsCustArtifactOrCreate(false, null);
+ }
+
+ public static XViewerCustomizationArtifact getAtsCustArtifactOrCreate(boolean create, SkynetTransaction transaction) {
+ if (xViewerCustomizationArtifact == null) {
+ try {
+ Collection<Artifact> arts =
+ ArtifactQuery.getArtifactsFromTypeAndName(ARTIFACT_TYPE_NAME, ARTIFACT_TYPE_NAME,
+ BranchManager.getCommonBranch());
+ if (arts.size() == 1) {
+ xViewerCustomizationArtifact = (XViewerCustomizationArtifact) arts.iterator().next();
+ } else if (arts.size() == 0 && create) {
+ xViewerCustomizationArtifact =
+ (XViewerCustomizationArtifact) ArtifactTypeManager.addArtifact(ARTIFACT_TYPE_NAME,
+ BranchManager.getCommonBranch(), ARTIFACT_TYPE_NAME);
+ xViewerCustomizationArtifact.persistAttributes(transaction);
+ } else if (arts.size() != 1) throw new IllegalArgumentException(
+ "Should only be one " + ARTIFACT_TYPE_NAME + ". Found " + arts.size() + ". ATS not configured in OSEE?.");
+ } catch (OseeCoreException ex) {
+ OseeLog.log(SkynetGuiPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ return xViewerCustomizationArtifact;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactNameColumn.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactNameColumn.java
new file mode 100644
index 00000000000..9ba12a2915c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactNameColumn.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.framework.ui.skynet.widgets.xviewer.skynet.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerArtifactNameColumn extends XViewerValueColumn {
+
+ public XViewerArtifactNameColumn(String name) {
+ this("framework.artifact.name." + name, name, 150, SWT.LEFT, true, SortDataType.String, false, null);
+ }
+
+ public XViewerArtifactNameColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn MUST extend this constructor so the correct sub-class is created
+ *
+ * @param col
+ */
+ @Override
+ public XViewerArtifactNameColumn copy() {
+ return new XViewerArtifactNameColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ if (element instanceof Artifact) {
+ return ((Artifact) element).getDescriptiveName();
+ }
+ return super.getColumnText(element, column, columnIndex);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactTypeColumn.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactTypeColumn.java
new file mode 100644
index 00000000000..850d0e54cc7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerArtifactTypeColumn.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.framework.ui.skynet.widgets.xviewer.skynet.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerArtifactTypeColumn extends XViewerValueColumn {
+
+ public XViewerArtifactTypeColumn(String name) {
+ this("framework.artifact.type." + name, name, 150, SWT.LEFT, true, SortDataType.String, false, "Artifact Type");
+ }
+
+ public XViewerArtifactTypeColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn MUST extend this constructor so the correct sub-class is created
+ *
+ * @param col
+ */
+ @Override
+ public XViewerArtifactTypeColumn copy() {
+ return new XViewerArtifactTypeColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ if (element instanceof Artifact) {
+ return ((Artifact) element).getArtifactTypeName();
+ }
+ return super.getColumnText(element, column, columnIndex);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnImage(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ if (element instanceof Artifact) {
+ return ImageManager.getImage((Artifact) element);
+ }
+ return super.getColumnImage(element, column, columnIndex);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerAttributeColumn.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerAttributeColumn.java
new file mode 100644
index 00000000000..e7b50d4a82b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerAttributeColumn.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.framework.ui.skynet.widgets.xviewer.skynet.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.change.Change;
+import org.eclipse.osee.framework.skynet.core.conflict.Conflict;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerAttributeColumn extends XViewerValueColumn {
+
+ private final String attributeTypeName;
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn need to extend this constructor to copy extra stored fields
+ *
+ * @param col
+ */
+ @Override
+ public XViewerAttributeColumn copy() {
+ return new XViewerAttributeColumn(getId(), getName(), getAttributeTypeName(), getWidth(), getAlign(), isShow(),
+ getSortDataType(), isMultiColumnEditable(), getDescription());
+ }
+
+ public XViewerAttributeColumn(String id, String name, String attributeTypeName, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ this.attributeTypeName = attributeTypeName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ try {
+ if (element instanceof Artifact) {
+ return ((Artifact) element).getAttributesToString(attributeTypeName);
+ }
+ if (element instanceof Change) {
+ return ((Change) element).getArtifact().getAttributesToString(attributeTypeName);
+ }
+ if (element instanceof Conflict) {
+ return ((Conflict) element).getArtifact().getAttributesToString(attributeTypeName);
+ }
+ return "";
+ } catch (OseeCoreException ex) {
+ throw new XViewerException(ex);
+ }
+ }
+
+ public String getAttributeTypeName() {
+ return attributeTypeName;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerGuidColumn.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerGuidColumn.java
new file mode 100644
index 00000000000..354abc19c47
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerGuidColumn.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.framework.ui.skynet.widgets.xviewer.skynet.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerGuidColumn extends XViewerValueColumn {
+
+ public XViewerGuidColumn(String name) {
+ this("framework.guid." + name, name, 75, SWT.LEFT, true, SortDataType.String, false, "Globally Unique Identifier");
+ }
+
+ public XViewerGuidColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn MUST extend this constructor so the correct sub-class is created
+ *
+ * @param col
+ */
+ @Override
+ public XViewerGuidColumn copy() {
+ return new XViewerGuidColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ if (element instanceof Artifact) {
+ return ((Artifact) element).getGuid();
+ }
+ return "";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerHridColumn.java b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerHridColumn.java
new file mode 100644
index 00000000000..9cca01c76fe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xviewer/skynet/column/XViewerHridColumn.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.framework.ui.skynet.widgets.xviewer.skynet.column;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerValueColumn;
+import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XViewerHridColumn extends XViewerValueColumn {
+
+ public XViewerHridColumn(String name) {
+ this("framework.hrid." + name, name, 75, SWT.LEFT, true, SortDataType.String, false, "Human Readable ID");
+ }
+
+ public XViewerHridColumn(String id, String name, int width, int align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
+ super(id, name, width, align, show, sortDataType, multiColumnEditable, description);
+ }
+
+ /**
+ * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
+ * XViewerValueColumn MUST extend this constructor so the correct sub-class is created
+ *
+ * @param col
+ */
+ @Override
+ public XViewerHridColumn copy() {
+ return new XViewerHridColumn(getId(), getName(), getWidth(), getAlign(), isShow(), getSortDataType(),
+ isMultiColumnEditable(), getDescription());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerValueColumn#getColumnText(java.lang.Object, org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerColumn)
+ */
+ @Override
+ public String getColumnText(Object element, XViewerColumn column, int columnIndex) throws XViewerException {
+ if (element instanceof Artifact) {
+ return ((Artifact) element).getHumanReadableId();
+ }
+ return "";
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/AllWords.txt b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/AllWords.txt
new file mode 100644
index 00000000000..87b4062c121
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/AllWords.txt
@@ -0,0 +1,134689 @@
+AAA
+AAAS
+Aachen
+Aalborg
+Aalesund
+aardvark
+aardvark's
+aardvarks
+aardwolf
+Aargau
+Aarhus
+Aaron
+Aaronic
+AAU
+ab
+abac
+abaca
+aback
+abacterial
+abactinal
+abacus
+abacuses
+abadan
+abaddon
+abaft
+abakan
+abalone
+abalone's
+abalones
+abamp
+abampere
+abandon
+abandoned
+abandonee
+abandoner
+abandoning
+abandonment
+abandonments
+abandons
+abase
+abased
+abasement
+abasements
+abaser
+abases
+abash
+abashed
+abashes
+abashing
+abashment
+abasing
+abate
+abated
+abatement
+abatements
+abater
+abates
+abating
+abatis
+abatises
+abator
+abattoir
+abaxial
+Abba
+abbacy
+Abbado
+abbas
+abbasid
+abbatial
+abbe
+abberations
+abbess
+Abbevillian
+abbey
+abbey's
+Abbeydale
+abbeys
+abbot
+abbot's
+abbots
+Abbott
+Abbott's
+abbreviate
+abbreviated
+abbreviates
+abbreviating
+abbreviation
+abbreviations
+abbreviator
+abcoulomb
+abdias
+abdicable
+abdicate
+abdicated
+abdicates
+abdicating
+abdication
+abdicator
+abdomen
+abdomen's
+abdomens
+abdominal
+abdominally
+abdominous
+abduce
+abduced
+abducens
+abducent
+abducentes
+abducing
+abduct
+abducted
+abducting
+abduction
+abduction's
+abductions
+abductor
+abductor's
+abductors
+abducts
+Abe
+Abe's
+abeam
+abecedarian
+abed
+abednego
+Abel
+Abelard
+Abele
+Abelian
+Abelmosk
+Abelson
+Abelson's
+abeokuta
+aberdare
+Aberdeen
+Aberdeen's
+Abernathy
+Abernathy's
+Abernethy
+aberrance
+aberrancy
+aberrant
+aberrantly
+aberrated
+aberration
+aberrational
+aberrations
+Aberystwyth
+abet
+abetment
+abets
+abetted
+abetter
+abetting
+abettor
+abeyance
+abeyant
+abfarad
+abhenry
+abhor
+abhorred
+abhorrence
+abhorrent
+abhorrently
+abhorrer
+abhorring
+abhors
+abib
+abidance
+abide
+abided
+abider
+abides
+abiding
+abidingly
+Abidjan
+abietic
+Abigail
+Abigail's
+Abilene
+abilene
+Abilene's
+abilities
+ability
+ability's
+abingdon
+abiogenesis
+abiogenetic
+abiogenetical
+abiogenetically
+abiogenist
+abiological
+abiologically
+abiotic
+abiotically
+abirritant
+abirritate
+abject
+abjection
+abjections
+abjectly
+abjectness
+abjuration
+abjure
+abjured
+abjurer
+abjures
+abjuring
+abkhaz
+ablactation
+ablate
+ablated
+ablates
+ablating
+ablation
+ablative
+ablatively
+ablator
+ablaut
+ablaze
+able
+abler
+ablest
+abloom
+abluted
+ablution
+ablutionary
+ablutions
+ably
+abnegate
+abnegates
+abnegation
+abnegator
+Abner
+Abner's
+abnormal
+abnormalities
+abnormality
+abnormalize
+abnormalizes
+abnormally
+aboard
+abode
+abode's
+abodes
+abohm
+aboideau
+aboil
+abolish
+abolishable
+abolished
+abolisher
+abolishers
+abolishes
+abolishing
+abolishment
+abolishment's
+abolishments
+abolition
+abolitionary
+abolitionism
+abolitionist
+abolitionists
+abolitionize
+abolitionizes
+abomasal
+abominable
+abominably
+abominate
+abominated
+abominates
+abominating
+abomination
+abominations
+abominator
+abominators
+aboral
+aborally
+aboriginal
+aboriginally
+aborigine
+aborigine's
+aborigines
+aborning
+abort
+aborted
+aborter
+aborticide
+abortifacient
+aborting
+abortion
+abortion's
+abortionist
+abortionists
+abortions
+abortive
+abortively
+abortiveness
+aborts
+Abos
+aboukir
+aboulia
+abound
+abounded
+abounding
+abounds
+about
+above
+aboveboard
+aboveground
+abovementioned
+abracadabra
+abradable
+abradant
+abrade
+abraded
+abrader
+abrades
+abrading
+Abraham
+Abram
+Abram's
+Abrams
+Abramson
+abranchiate
+abrasion
+abrasion's
+abrasions
+abrasive
+abrasively
+abrasiveness
+abrasives
+Abravanel
+Abraxas
+abreact
+abreaction
+abreaction's
+abreactions
+abreast
+abri
+abridge
+abridged
+abridgement
+abridger
+abridges
+abridging
+abridgment
+abrin
+abroach
+abroad
+abrogate
+abrogated
+abrogates
+abrogating
+abrogation
+abrupt
+abruption
+abruptly
+abruptness
+abruzzi
+Absalom
+abscess
+abscessed
+abscesses
+abscise
+abscised
+abscisin
+abscising
+abscissa
+abscissa's
+abscissae
+abscissas
+abscission
+abscond
+absconded
+absconder
+absconding
+absconds
+abseil
+absence
+absence's
+absences
+absent
+absented
+absentee
+absentee's
+absenteeism
+absentees
+absentia
+absenting
+absently
+absentminded
+absentmindedly
+absentmindedness
+absents
+absinth
+absinthe
+absinthism
+absolute
+absolutely
+absoluteness
+absolutes
+absolution
+absolutism
+absolutist
+absolutistic
+absolutization
+absolutization's
+absolutizations
+absolutize
+absolutizes
+absolve
+absolved
+absolver
+absolves
+absolving
+absonant
+absorb
+absorbability
+absorbable
+absorbance
+absorbancy
+absorbant
+absorbed
+absorbefacient
+absorbency
+absorbent
+absorbent's
+absorbents
+absorber
+absorbing
+absorbingly
+absorbs
+absorbtions
+absorptance
+absorption
+absorption's
+absorptional
+absorptions
+absorptive
+absorptivity
+absquatulate
+abstain
+abstained
+abstainer
+abstaining
+abstains
+abstemious
+abstemiously
+abstention
+abstentions
+abstentious
+abstergent
+abstinence
+abstinent
+abstinently
+abstract
+abstractable
+abstracted
+abstractedly
+abstractedness
+abstracter
+abstracting
+abstraction
+abstraction's
+abstractional
+abstractionism
+abstractionist
+abstractionists
+abstractions
+abstractive
+abstractly
+abstractness
+abstractor
+abstractor's
+abstractors
+abstracts
+abstrict
+abstriction
+abstrictions
+abstruse
+abstrusely
+abstruseness
+abstrusenesses
+abstrusity
+absurd
+absurdism
+absurdist
+absurdities
+absurdity
+absurdity's
+absurdly
+absurdness
+absurdum
+Abu
+abubble
+abuilding
+abukir
+abulia
+abundance
+abundances
+abundant
+abundantly
+abusable
+abuse
+abused
+abuser
+abusers
+abuses
+abusing
+abusive
+abusively
+abusiveness
+abut
+abutilon
+abutment
+abutments
+abuts
+abuttals
+abutted
+abutter
+abutter's
+abutters
+abutting
+abuzz
+abvolt
+abwatt
+aby
+abydos
+abysm
+abysmal
+abysmally
+abyss
+abyss's
+abyssal
+abysses
+Abyssinia
+Abyssinian
+Abyssinians
+AC
+acacia
+academe
+academia
+academic
+academical
+academically
+academician
+academicianship
+academicism
+academics
+academies
+academism
+academy
+academy's
+Acadia
+acajou
+acanthaceous
+acanthine
+acanthocephalan
+acanthoid
+acanthopterygian
+acanthous
+acanthus
+acanthuses
+Acapulco
+acariasis
+acarid
+acaroid
+acarology
+acarpellous
+acarpelous
+acarpous
+Acarus
+acas
+acatalectic
+acaudal
+acaulescence
+acaulescent
+accad
+accede
+acceded
+accedes
+acceding
+accelerando
+accelerate
+accelerated
+accelerates
+accelerating
+acceleratingly
+acceleration
+accelerations
+accelerative
+accelerator
+accelerators
+accelerometer
+accelerometer's
+accelerometers
+accent
+accented
+accenting
+accentless
+accentor
+accents
+accentual
+accentually
+accentuate
+accentuated
+accentuates
+accentuating
+accentuation
+accept
+acceptability
+acceptable
+acceptableness
+acceptably
+acceptance
+acceptance's
+acceptances
+acceptant
+acceptation
+accepted
+acceptedly
+accepter
+accepters
+accepting
+acceptingly
+acceptingness
+acceptive
+acceptor
+acceptor's
+acceptors
+accepts
+access
+accessary
+accessed
+accesses
+accessibility
+accessible
+accessibleness
+accessibly
+accessing
+accession
+accession's
+accessional
+accessions
+accessorial
+accessories
+accessorize
+accessors
+accessory
+accessory's
+acciaccatura
+accidence
+accident
+accident's
+accidental
+accidentalism
+accidentalist
+accidentally
+accidentalness
+accidently
+accidents
+accidie
+accipiter
+accipitrine
+acclaim
+acclaimed
+acclaimer
+acclaiming
+acclaims
+acclamation
+acclimate
+acclimated
+acclimates
+acclimating
+acclimation
+acclimatizable
+acclimatizable's
+acclimatizables
+acclimatization
+acclimatization's
+acclimatizations
+acclimatize
+acclimatized
+acclimatizer
+acclimatizers
+acclimatizes
+acclimatizing
+acclivity
+accolade
+accolades
+accommodate
+accommodated
+accommodates
+accommodating
+accommodatingly
+accommodation
+accommodational
+accommodations
+accommodative
+accommodativeness
+accommodator
+accommodators
+accommodatory
+accompanied
+accompanier
+accompanies
+accompaniment
+accompaniment's
+accompaniments
+accompanist
+accompanist's
+accompanists
+accompany
+accompanying
+accompanyist
+accompanyists
+accomplice
+accomplices
+accomplish
+accomplishable
+accomplished
+accomplisher
+accomplishers
+accomplishes
+accomplishing
+accomplishment
+accomplishment's
+accomplishments
+accord
+accordance
+accordances
+accordant
+accordantly
+accorded
+accorder
+accorders
+according
+accordingly
+accordion
+accordion's
+accordionist
+accordionists
+accordions
+accords
+accost
+accostable
+accosted
+accosting
+accosts
+account
+accountabilities
+accountability
+accountable
+accountableness
+accountably
+accountancy
+accountant
+accountant's
+accountants
+accountantship
+accounted
+accounting
+accountings
+accounts
+accouplement
+accouter
+accoutered
+accoutering
+accouterment
+accouterment's
+accouterments
+accouters
+Accra
+accredit
+accreditable
+accreditation
+accreditations
+accredited
+accrescent
+accrete
+accreted
+accreting
+accretion
+accretion's
+accretionary
+accretions
+accretive
+Accrington
+accruable
+accrual
+accruals
+accrue
+accrued
+accruement
+accrues
+accruing
+acculturate
+acculturated
+acculturates
+acculturating
+acculturation
+acculturational
+acculturationist
+acculturative
+acculturize
+accumbency
+accumbent
+accumulable
+accumulate
+accumulated
+accumulates
+accumulating
+accumulation
+accumulations
+accumulative
+accumulatively
+accumulativeness
+accumulator
+accumulator's
+accumulators
+accuracies
+accuracy
+accurate
+accurately
+accurateness
+accursed
+accursedly
+accursedness
+accurses
+accursing
+accurst
+accusal
+accusation
+accusation's
+accusations
+accusative
+accusatory
+accuse
+accused
+accuser
+accusers
+accuses
+accusing
+accusingly
+accusor
+accustom
+accustomation
+accustomed
+accustomedness
+accustoming
+accustoms
+accutron
+ace
+ace's
+aced
+acedia
+Aceldama
+acellular
+acentric
+acephalous
+acer
+acerate
+acerb
+acerbate
+acerbic
+acerbically
+acerbity
+acerose
+acervate
+acervately
+acervation
+aces
+acescent
+acetabulum
+acetal
+acetaldehyde
+acetamide
+acetaminophen
+acetanilide
+acetate
+acetic
+acetification
+acetifier
+acetify
+acetometer
+acetone
+acetonic
+acetonization
+acetonization's
+acetonizations
+acetonize
+acetonizes
+acetophenetidin
+acetous
+acetum
+acetyl
+acetylate
+acetylation
+acetylative
+acetylcholine
+acetylene
+acetylenic
+acetylide
+acetylsalicylic
+achaea
+Achaean
+Achaemenid
+Achates
+ache
+ached
+achelous
+achene
+Achernar
+acheron
+aches
+acheulian
+achier
+achiest
+achievable
+achieve
+achieved
+achievement
+achievement's
+achievements
+achiever
+achievers
+achieves
+achieving
+Achilles
+achiness
+aching
+achingly
+Achitophel
+achlamydeous
+achlorhydria
+achondrite
+achondroplasia
+achromat
+achromatic
+achromatically
+achromaticity
+achromatin
+achromatism
+achromatization
+achromatize
+achromatized
+achromatizes
+achromatizing
+achromatous
+achromic
+achy
+acicula
+aciculate
+aciculum
+acid
+acidhead
+acidic
+acidiferous
+acidifiable
+acidification
+acidifier
+acidify
+acidimeter
+acidimeter's
+acidimeters
+acidimetric
+acidimetry
+acidities
+acidity
+acidize
+acidizes
+acidly
+acidness
+acidometer
+acidophil
+acidophilus
+acidosis
+acids
+acidulant
+acidulate
+acidulation
+acidulent
+acidulous
+acierate
+acinaciform
+acing
+aciniform
+acinus
+Acis
+ackee
+Ackerman
+Ackley
+acknowledge
+acknowledgeable
+acknowledged
+acknowledgedly
+acknowledger
+acknowledgers
+acknowledges
+acknowledging
+acknowledgment
+acknowledgment's
+acknowledgments
+acl
+aclinic
+ACM
+acme
+acne
+acned
+acnode
+acock
+acol
+acold
+acolyte
+acolytes
+aconcagua
+aconite
+acorn
+acorn's
+acorns
+acotyledon
+acouchi
+acoustic
+acoustical
+acoustically
+acoustician
+acoustics
+acquaint
+acquaintance
+acquaintance's
+acquaintances
+acquaintanceship
+acquainted
+acquainting
+acquaints
+acquiesce
+acquiesced
+acquiescence
+acquiescent
+acquiescently
+acquiesces
+acquiescing
+acquirable
+acquire
+acquired
+acquirement
+acquires
+acquiring
+acquisition
+acquisition's
+acquisitional
+acquisitionist
+acquisitions
+acquisititious
+acquisitive
+acquisitively
+acquisitiveness
+acquit
+acquitment
+acquits
+acquittal
+acquittals
+acquittance
+acquitted
+acquitter
+acquitting
+acre
+acre's
+acreage
+acres
+acrid
+acridine
+acridity
+acridly
+acridness
+acriflavine
+acrilan
+acrimonious
+acrimoniously
+acrimony
+acrobacy
+acrobat
+acrobat's
+acrobatic
+acrobatically
+acrobatics
+acrobats
+acrocarpous
+acrocentric
+acrodont
+acrodrome
+acrogen
+acrolein
+acrolith
+acromegaly
+acromion
+acronym
+acronym's
+acronymic
+acronymically
+acronymize
+acronymizes
+acronyms
+acropetal
+acropetally
+acrophobia
+acrophobic
+acropolis
+acrospire
+across
+acrostic
+acrostical
+acrostically
+acroter
+acrylamide
+acrylate
+acrylic
+acrylonitrile
+acrylyl
+ACS
+act
+acta
+Acta
+actability
+actable
+Actaeon
+acted
+actin
+actinal
+acting
+Actinia
+actinic
+actinide
+actinidin
+actiniform
+actinium
+actinochemistry
+actinoid
+actinolite
+actinomere
+actinometer
+actinometer's
+actinometers
+actinomorphic
+actinomycete
+actinomycin
+actinomycosis
+actinon
+actinopod
+actinotherapy
+actinouranium
+actinozoan
+action
+action's
+actionable
+actionably
+actionize
+actionizes
+actionless
+actions
+Actium
+activate
+activated
+activates
+activating
+activation
+activations
+activator
+activator's
+activators
+active
+actively
+activeness
+activism
+activist
+activist's
+activistic
+activists
+activities
+activity
+activity's
+activize
+activizes
+actomyosin
+Acton
+Acton's
+actor
+actor's
+actorish
+actors
+actress
+actress's
+actresses
+acts
+actual
+actualities
+actuality
+actualization
+actualization's
+actualizations
+actualize
+actualized
+actualizes
+actualizing
+actually
+actuals
+actuarial
+actuarially
+actuaries
+actuary
+actuate
+actuated
+actuates
+actuating
+actuation
+actuator
+actuator's
+actuators
+acuity
+aculeate
+aculeus
+acumen
+acuminate
+acumination
+acupuncture
+acutance
+acute
+acutely
+acuteness
+acuter
+acutest
+acyclic
+acyclical
+acyclically
+acyl
+acylate
+acylated
+acylates
+ad
+Ada
+Ada's
+adactylous
+adage
+adages
+adagio
+adagios
+Adair
+Adair's
+Adam
+adamance
+adamancy
+adamant
+adamantine
+adamantly
+adamawa
+Adamite
+Adams
+adamsite
+Adamson
+adana
+adapt
+adaptability
+adaptable
+adaptably
+adaptaplex
+adaptation
+adaptation's
+adaptational
+adaptationally
+adaptations
+adapted
+adaptedness
+adapter
+adapters
+adapting
+adaption
+adaptitude
+adaptive
+adaptively
+adaptiveness
+adaptivity
+adaptor
+adaptors
+adapts
+Adar
+adaxial
+add
+addable
+Addams
+addax
+added
+addend
+addenda
+addendum
+adder
+adders
+addible
+addict
+addicted
+addicting
+addiction
+addiction's
+addictions
+addictive
+addicts
+adding
+Addington
+Addis
+Addison
+addition
+addition's
+additional
+additionally
+additions
+additive
+additive's
+additively
+additives
+additivity
+addle
+addled
+addlepated
+addles
+addling
+address
+addressability
+addressable
+addressed
+addressee
+addressee's
+addressees
+addresser
+addressers
+addresses
+addressing
+Addressograph
+addressor
+adds
+adduce
+adduced
+adducer
+adduces
+adducible
+adducing
+adduct
+adducted
+adducting
+adduction
+adductive
+adductor
+adducts
+Adelaide
+Adelaide's
+Adele
+Adele's
+Adelia
+Adelia's
+ademption
+Aden
+Aden's
+Adenauer
+adenectomy
+adenine
+adenitis
+adenocarcinoma
+adenohypophysis
+adenoid
+adenoidal
+adenoidectomy
+adenoids
+adenoma
+adenomatous
+adenosine
+adenovirus
+adept
+adeptly
+adeptness
+adepts
+adequacies
+adequacy
+adequate
+adequately
+adequateness
+adhere
+adhered
+adherence
+adherences
+adherend
+adherent
+adherent's
+adherently
+adherents
+adherer
+adherers
+adheres
+adhering
+adhesion
+adhesional
+adhesions
+adhesive
+adhesive's
+adhesively
+adhesiveness
+adhesives
+adhibit
+adiabatic
+adiabatically
+adiabaticlly
+adiaphorism
+adiaphorous
+adiathermancy
+adieu
+adieux
+Adige
+adios
+adipic
+adipocere
+adipose
+adiposity
+Adirondack
+Adirondacks
+adit
+adivasi
+adjacency
+adjacent
+adjacently
+adject
+adjectival
+adjectivally
+adjective
+adjective's
+adjectively
+adjectives
+adjoin
+adjoined
+adjoining
+adjoins
+adjoint
+adjourn
+adjourned
+adjourning
+adjournment
+adjourns
+adjudge
+adjudged
+adjudges
+adjudging
+adjudicate
+adjudicated
+adjudicates
+adjudicating
+adjudication
+adjudication's
+adjudications
+adjudicative
+adjudicator
+adjudicatory
+adjunct
+adjunct's
+adjunction
+adjunctive
+adjunctly
+adjuncts
+adjuration
+adjuratory
+adjure
+adjured
+adjures
+adjuring
+adjust
+adjustability
+adjustable
+adjustably
+adjusted
+adjuster
+adjusters
+adjusting
+adjustive
+adjustment
+adjustment's
+adjustmental
+adjustments
+adjustor
+adjustor's
+adjustors
+adjusts
+adjutancy
+adjutant
+adjutants
+adjuvant
+Adkins
+adle
+Adler
+Adler's
+Adlerian
+adman
+admass
+admeasure
+admeasurement
+admetus
+adminicle
+administer
+administered
+administering
+administerings
+administers
+administrable
+administrant
+administrate
+administrated
+administrates
+administrating
+administration
+administration's
+administrational
+administrationist
+administrations
+administrative
+administratively
+administrator
+administrator's
+administrators
+administratrix
+admirability
+admirable
+admirableness
+admirably
+admiral
+admiral's
+admirals
+admiralty
+admiration
+admirations
+admire
+admired
+admirer
+admirers
+admires
+admiring
+admiringly
+admissibility
+admissible
+admission
+admission's
+admissions
+admissive
+admit
+admits
+admittance
+admitted
+admittedly
+admitter
+admitters
+admitting
+admix
+admixed
+admixes
+admixture
+admonish
+admonished
+admonisher
+admonishes
+admonishing
+admonishingly
+admonishment
+admonishment's
+admonishments
+admonition
+admonition's
+admonitions
+admonitorily
+admonitory
+adnate
+adnominal
+adnoun
+ado
+adobe
+adolescence
+adolescent
+adolescent's
+adolescently
+adolescents
+Adolph
+Adolph's
+Adolphus
+Adonai
+Adonic
+Adonis
+adopt
+adoptability
+adoptable
+adopted
+adoptee
+adoptees
+adopter
+adopters
+adoptianism
+adoptianist
+adopting
+adoption
+adoption's
+adoptionism
+adoptionist
+adoptions
+adoptive
+adoptively
+adopts
+adorability
+adorable
+adorableness
+adorably
+adoration
+adore
+adored
+adorer
+adores
+adoring
+adorn
+adorned
+adorning
+adornment
+adornment's
+adornments
+adorns
+adowa
+adoze
+adposition
+adrastus
+adrenal
+adrenalin
+adrenaline
+adrenalize
+adrenalizes
+adrenally
+adrenergic
+adrenocortical
+Adrian
+Adrian's
+Adriatic
+Adrienne
+Adrienne's
+adrift
+adroit
+adroitly
+adroitness
+ads
+adscititious
+adscription
+adsorb
+adsorbability
+adsorbable
+adsorbate
+adsorbed
+adsorbent
+adsorbing
+adsorbs
+adsorbtion
+adsorption
+adsorptive
+adsorptively
+adsuki
+adularia
+adulate
+adulating
+adulation
+adulations
+adulator
+adulatory
+Adullamite
+adult
+adult's
+adulterant
+adulterate
+adulterated
+adulterates
+adulterating
+adulteration
+adulterator
+adulterer
+adulterer's
+adulterers
+adulteress
+adulteresses
+adulterine
+adulterize
+adulterizes
+adulterous
+adulterously
+adultery
+adulthood
+adultlike
+adultly
+adultness
+adults
+adumbral
+adumbrate
+adumbrated
+adumbrates
+adumbrating
+adumbration
+adumbrative
+adumbratively
+adust
+aduwa
+advance
+advanced
+advancement
+advancement's
+advancements
+advancer
+advancers
+advances
+advancing
+advantage
+advantaged
+advantageous
+advantageously
+advantageousness
+advantages
+advantaging
+advection
+advections
+advective
+advent
+adventist
+adventists
+adventitia
+adventitious
+adventitiously
+adventitiousness
+adventive
+adventively
+adventure
+adventured
+adventurer
+adventurers
+adventures
+adventuresome
+adventuresomeness
+adventuress
+adventuresses
+adventuring
+adventurism
+adventurist
+adventuristic
+adventurists
+adventurous
+adventurously
+adventurousness
+adverb
+adverb's
+adverbial
+adverbialize
+adverbializes
+adverbially
+adverbs
+adversarial
+adversaries
+adversary
+adversary's
+adversative
+adversatively
+adverse
+adversed
+adversely
+adverses
+adversing
+adversities
+adversity
+advert
+adverted
+advertence
+advertency
+advertent
+advertently
+adverting
+advertise
+advertised
+advertisement
+advertisement's
+advertisements
+advertiser
+advertisers
+advertises
+advertising
+adverts
+advice
+advisability
+advisable
+advisableness
+advisably
+advise
+advised
+advisedly
+advisee
+advisee's
+advisees
+advisement
+advisements
+adviser
+adviser's
+advisers
+advises
+advising
+advisor
+advisor's
+advisors
+advisory
+advocacy
+advocate
+advocated
+advocates
+advocating
+advocation
+advocative
+advocator
+Advowson
+adygei
+adynamia
+adynamic
+adytum
+adz
+adze
+adzhar
+adzuki
+aeciospore
+aecium
+Aedes
+aedile
+Aegean
+Aegeus
+Aegina
+aegis
+Aegisthus
+aegospotami
+aegrotat
+Aeneas
+Aeneid
+aeneous
+aeolian
+Aeolic
+Aeolipile
+Aeolis
+aeolotropic
+aeolotropy
+Aeolus
+aeonian
+aeonic
+Aepyornis
+aerate
+aerated
+aerates
+aerating
+aeration
+aerator
+aerators
+aerial
+aerial's
+aerialist
+aerially
+aerials
+aerie
+aerier
+aerily
+aero
+aeroacoustic
+Aerobacter
+aeroballistic
+aeroballistics
+aerobatic
+aerobatics
+aerobe
+aerobic
+aerobically
+aerobics
+aerobiological
+aerobiologically
+aerobiology
+aerobiosis
+aerobiotic
+aerobiotically
+aerodynamic
+aerodynamical
+aerodynamically
+aerodynamicist
+aerodynamics
+aerodyne
+aeroembolism
+aerogene
+aerogenes
+aerogram
+aerogram's
+aerograms
+aerographer
+aerography
+aerolite
+aerolith
+aerolitic
+aerological
+aerologist
+aerology
+aeromagnetic
+aeromechanics
+aeromedical
+aeromedicine
+aerometeorograph
+aerometer
+aerometer's
+aerometers
+aeronaut
+aeronautic
+aeronautical
+aeronautically
+aeronautics
+aeroneurosis
+aeronomer
+aeronomic
+aeronomical
+aeronomics
+aeronomist
+aeropause
+aerosol
+aerosolization
+aerosolize
+aerosolized
+aerosols
+aerospace
+aerosphere
+aerostat
+aerostatics
+aerothermodynamics
+aery
+Aeschines
+Aeschylus
+Aesculapian
+Aesculapius
+Aesir
+Aesop
+aesthesiometer
+aesthesiometer's
+aesthesiometers
+aestheticism
+aestheticize
+aestheticizes
+Aetolia
+afar
+afars
+afeard
+afeared
+afebrile
+affability
+affable
+affably
+affair
+affair's
+affaire
+affaires
+affairs
+affect
+affectability
+affectable
+affectate
+affectation
+affectation's
+affectations
+affected
+affectedly
+affectedness
+affecter
+affecting
+affectingly
+affection
+affection's
+affectional
+affectionally
+affectionate
+affectionately
+affectioned
+affectionless
+affections
+affective
+affectively
+affectivity
+affectless
+affectlessness
+affects
+Affenpinscher
+afferent
+afferently
+affettuoso
+affiance
+affianced
+affiant
+afficionado
+affidavit
+affidavit's
+affidavits
+affiliate
+affiliated
+affiliates
+affiliating
+affiliation
+affiliations
+affine
+affined
+affinely
+affinities
+affinity
+affinity's
+affirm
+affirmable
+affirmance
+affirmation
+affirmation's
+affirmations
+affirmative
+affirmatively
+affirmed
+affirming
+affirms
+affix
+affixable
+affixal
+affixation
+affixed
+affixes
+affixial
+affixing
+affixment
+afflatus
+afflict
+afflicted
+afflicting
+affliction
+affliction's
+afflictions
+afflictive
+afflictively
+afflicts
+affluence
+affluency
+affluent
+affluently
+afflux
+afford
+affordable
+afforded
+affording
+affords
+afforest
+afforestation
+affray
+affreightment
+affricate
+affricates
+affrication
+affricative
+affright
+affront
+affronted
+affronting
+affronts
+affusion
+afghan
+afghani
+Afghani
+Afghani's
+Afghanis
+Afghanistan
+Afghanistan's
+afghans
+aficionada
+aficionado
+aficionados
+afield
+afire
+aflame
+aflatoxin
+afloat
+aflutter
+afoot
+afore
+aforemention
+aforementioned
+aforesaid
+aforethought
+aforetime
+afoul
+afraid
+afreet
+afresh
+Africa
+Africa's
+African
+African's
+Africanism
+Africanist
+Africanization
+Africanization's
+Africanizations
+Africanize
+Africanized
+Africanizes
+Africanizing
+Africans
+afrika
+Afrikaans
+afrikaans
+Afrikander
+Afrikaner
+Afrikanerdom
+Afrikanerization
+Afrikanerize
+Afrikanerized
+Afrikanerizes
+Afrikanerizing
+afrit
+afro
+afrormosia
+aft
+after
+afterbirth
+afterbody
+afterbrain
+afterburner
+afterburners
+afterburning
+aftercare
+afterclap
+afterdamp
+afterdeck
+aftereffect
+aftereffects
+afterglow
+afterheat
+afterimage
+afterlife
+aftermath
+aftermost
+afternoon
+afternoon's
+afternoons
+afterpains
+afterpiece
+afters
+aftersensation
+aftershaft
+aftershave
+aftershock
+aftershock's
+aftershocks
+aftertaste
+aftertax
+afterthought
+afterthoughts
+aftertime
+afterward
+afterwards
+afterword
+afterworld
+aga
+agadir
+again
+against
+agalloch
+Agama
+Agamemnon
+agamete
+agamic
+agamically
+agamogenesis
+Agapanthus
+agape
+agapeic
+agapeically
+agar
+agaric
+agartala
+agate
+agates
+agateware
+Agatha
+agatize
+agatizes
+agave
+agaze
+age
+aged
+agedly
+agedness
+Agee
+Agee's
+agegroup
+ageing
+ageless
+agelessly
+agelessness
+agelong
+agencies
+agency
+agency's
+agenda
+agenda's
+agendaless
+agendas
+agendum
+agene
+agenesis
+agenize
+agent
+agent's
+agentive
+agentry
+agents
+ager
+Ageratum
+agers
+ages
+Aggie
+aggie
+aggies
+Aggies
+agglomerate
+agglomerated
+agglomerates
+agglomeration
+agglomerative
+agglutinability
+agglutinate
+agglutinated
+agglutinates
+agglutinating
+agglutination
+agglutinative
+agglutinin
+agglutinins
+agglutinogen
+agglutinogenic
+aggradation
+aggrade
+aggrandizable
+aggrandizable's
+aggrandizables
+aggrandization
+aggrandize
+aggrandized
+aggrandizement
+aggrandizement's
+aggrandizements
+aggrandizer
+aggrandizers
+aggrandizes
+aggrandizing
+aggravate
+aggravated
+aggravates
+aggravating
+aggravation
+aggravations
+aggregate
+aggregated
+aggregately
+aggregateness
+aggregates
+aggregating
+aggregation
+aggregational
+aggregations
+aggregative
+aggregatively
+aggress
+aggression
+aggression's
+aggressions
+aggressive
+aggressively
+aggressiveness
+aggressivity
+aggressor
+aggressors
+aggrieve
+aggrieved
+aggrievedly
+aggrieves
+aggrieving
+aggro
+agha
+aghast
+agile
+agilely
+agility
+Agincourt
+aging
+agio
+agios
+agiotage
+agist
+agitate
+agitated
+agitatedly
+agitates
+agitating
+agitation
+agitational
+agitations
+agitative
+agitato
+agitator
+agitator's
+agitators
+agitprop
+Aglaia
+aglare
+agleam
+aglet
+agley
+aglimmer
+aglitter
+aglow
+agma
+agminate
+agnail
+agnate
+agnatic
+agnatically
+agnation
+Agnes
+Agnew
+Agnew's
+agni
+agnize
+agnized
+agnizes
+agnizing
+agnomen
+agnostic
+agnostic's
+agnosticism
+agnostics
+agnus
+ago
+agog
+agon
+agone
+agonic
+agonies
+agonist
+agonistic
+agonistical
+agonistically
+agonists
+agonize
+agonized
+agonizedlies
+agonizedly
+agonizer
+agonizers
+agonizes
+agonizing
+agonizingly
+agony
+agora
+agoraphobia
+agoraphobic
+Agostini
+agouti
+Agra
+agraffe
+agram
+agranulocytosis
+Agrapha
+agraphia
+agrarian
+agrarianism
+agrarianize
+agrarianizes
+agree
+agreeability
+agreeable
+agreeableness
+agreeably
+agreed
+agreeing
+agreement
+agreement's
+agreements
+agreer
+agreers
+agrees
+agrestal
+agrestic
+agribusiness
+Agricola
+agricultural
+agriculturalist
+agriculturalists
+agriculturally
+agriculture
+agriculturist
+agrigento
+agrimony
+agriology
+Agrippa
+agrippina
+agrobiological
+agrobiologically
+agrobiology
+agrologic
+agrological
+agrologically
+agrologist
+agrology
+agronomic
+agronomical
+agronomically
+agronomics
+agronomist
+agronomy
+agrose
+agrostology
+aground
+agrypnotic
+Aguascalientes
+ague
+agueweed
+aguish
+aguishly
+agulhas
+Agway
+ah
+aha
+ahab
+Ahasuerus
+ahead
+ahem
+ahimsa
+ahistoric
+ahistorical
+ahithophel
+Ahmedabad
+Ahmednagar
+ahold
+ahoy
+Ahriman
+ahura
+Ahvenanmaa
+Ahwaz
+AI
+aid
+Aida
+Aida's
+Aidan
+aide
+aided
+aider
+aides
+Aidin
+aiding
+aidman
+aids
+aiglet
+aigrette
+aiguille
+aiguillette
+Aiken
+Aiken's
+aikido
+aikona
+ail
+ailanthus
+aile
+ailed
+Aileen
+aileron
+ailerons
+ailing
+ailment
+ailment's
+ailments
+ails
+ailurophile
+ailurophobe
+aim
+aimed
+aimer
+aimers
+aiming
+aimless
+aimlessly
+aimlessness
+aims
+ain
+ain't
+aintab
+Ainu
+air
+airbag
+airbag's
+airbags
+airboat
+airborne
+airbrick
+airbrush
+airburst
+airbus
+aircraft
+aircraftman
+aircrafts
+aircrew
+airdrie
+airdrome
+airdrop
+airdrops
+aire
+aired
+Airedale
+Airedale's
+airer
+airers
+Aires
+airfare
+airfield
+airfield's
+airfields
+airflow
+airfoil
+airfoils
+airforce
+airframe
+airframe's
+airframes
+airfreight
+airglow
+airgun
+airhead
+airier
+airiest
+airily
+airiness
+airing
+airings
+airless
+airlessness
+airlift
+airlift's
+airlifts
+airline
+airline's
+airliner
+airliner's
+airliners
+airlines
+airlock
+airlock's
+airlocks
+airmail
+airmails
+airman
+airmanship
+airmass
+airmen
+airmobile
+airpark
+airplane
+airplane's
+airplanes
+airplay
+airport
+airport's
+airports
+airpost
+airs
+airscrew
+airship
+airship's
+airships
+airsick
+airsickness
+airspace
+airspeed
+airspeeds
+airstream
+airstrip
+airstrip's
+airstrips
+airt
+airtight
+airtightness
+airwave
+airwaves
+airway
+airway's
+airways
+airworthiness
+airworthy
+airy
+aisha
+aisle
+aisles
+aisne
+ait
+aitch
+aitchbone
+Aitken
+Aitken's
+ajaccio
+ajar
+Ajax
+ajmer
+AK
+AKA
+Akan
+akbar
+akela
+akene
+Akers
+akhara
+akhenaten
+Akhmatova
+akihito
+akimbo
+akin
+Akkad
+Akkadian
+akkerman
+Akmolinsk
+Akron
+aksum
+Aktyubinsk
+akure
+akvavit
+Al
+AL
+Al's
+ala
+Alabama
+Alabama's
+Alabamans
+Alabamian
+Alabamian's
+alabaster
+alabastrine
+alack
+alacritous
+alacrity
+Aladdin
+alagez
+alagoas
+alai
+Alameda
+Alamein
+Alamo
+alamode
+alamogordo
+Alamos
+Alan
+Alan's
+alanbrooke
+alanine
+alannah
+alap
+alar
+Alaric
+alarm
+alarmed
+alarming
+alarmingly
+alarmism
+alarmist
+alarms
+alary
+alas
+Alaska
+Alaska's
+Alastair
+alate
+alated
+alation
+alb
+alba
+albacete
+albacore
+Albania
+Albania's
+Albanian
+Albanian's
+Albanians
+Albany
+albata
+albatross
+albedo
+albeit
+albemarle
+Alberich
+Albert
+Alberta
+alberti
+albertite
+Alberto
+albertus
+albescent
+Albi
+Albigenses
+albinic
+albinism
+albino
+Albinoni
+albinotic
+albinus
+Albion
+albite
+Alboin
+Albrecht
+Albrecht's
+Albright
+Albright's
+album
+albumen
+albumenization
+albumenize
+albumenized
+albumenizes
+albumenizing
+albumin
+albuminate
+albuminization
+albuminization's
+albuminizations
+albuminize
+albuminizes
+albuminoid
+albuminous
+albuminuria
+albumose
+albums
+Albuquerque
+alburnum
+Albury
+alcaeus
+alcahest
+alcaic
+alcaide
+alcalde
+alcan
+alcatraz
+alcazar
+Alcestis
+alchemic
+alchemical
+alchemically
+alchemist
+alchemistic
+alchemistical
+alchemize
+alchemy
+alcheringa
+Alcibiades
+alcidine
+Alcman
+Alcmena
+alcmene
+Alcoa
+Alcock
+alcohol
+alcohol's
+alcoholic
+alcoholic's
+alcoholically
+alcoholicity
+alcoholics
+alcoholism
+alcoholisms
+alcoholizable
+alcoholizable's
+alcoholizables
+alcoholization
+alcoholization's
+alcoholizations
+alcoholize
+alcoholizes
+alcoholometer
+alcoholometer's
+alcoholometers
+alcoholometry
+alcohols
+Alcoran
+Alcott
+Alcott's
+alcove
+alcove's
+alcoved
+alcoves
+alcuin
+Alcyone
+aldabra
+aldan
+Aldebaran
+aldehyde
+Alden
+Alden's
+alder
+alderman
+alderman's
+aldermanic
+Aldermaston
+aldermen
+Alderney
+aldershot
+Aldine
+aldis
+aldol
+aldosterone
+aldoxime
+Aldrich
+Aldrich's
+aldrin
+Aldus
+ale
+aleatoric
+aleatory
+Alec
+Aleck
+alecost
+alecto
+alee
+alegar
+alehouse
+alekhine
+Aleksandropol
+Aleksandrovsk
+Alemanni
+Alemannic
+alembic
+alembicated
+aleph
+Aleppo
+Aler
+alert
+alerted
+alertedly
+alerter
+alerters
+alerting
+alertly
+alertness
+alerts
+alessandria
+alethic
+aleurone
+Aleut
+Aleutian
+alevin
+alewife
+Alex
+Alexander
+Alexanders
+Alexandra
+Alexandre
+alexandretta
+Alexandria
+Alexandrian
+alexandrine
+alexandrite
+Alexei
+Alexei's
+alexia
+alexipharmic
+Alexis
+Alexius
+Alfa
+alfa
+alfalfa
+alfieri
+alfilaria
+Alfonso
+Alfonso's
+alforja
+Alfred
+Alfred's
+Alfredo
+Alfredo's
+alfresco
+alga
+algae
+algaecide
+algal
+algarroba
+algebra
+algebra's
+algebraic
+algebraical
+algebraically
+algebraist
+algebraization
+algebraization's
+algebraizations
+algebraize
+algebraizes
+algebras
+algeciras
+Algenib
+Alger
+Alger's
+Algeria
+Algeria's
+Algerian
+Algerian's
+Algerine
+algicidal
+algicide
+algid
+algidity
+Algiers
+algin
+alginate
+alginates
+alginic
+algoid
+Algol
+Algol's
+algolagnia
+algology
+algometer
+Algonkian
+Algonquian
+Algonquin
+Algonquin's
+algophobia
+algor
+algorism
+algorithm
+algorithm's
+algorithmic
+algorithmically
+algorithms
+Alhambra
+Ali
+alia
+alias
+aliased
+aliases
+aliasing
+alibi
+alibi's
+alibis
+alible
+alicante
+Alice
+Alicia
+alicyclic
+alidade
+alien
+alien's
+alienability
+alienable
+alienage
+alienate
+alienated
+alienates
+alienating
+alienation
+alienator
+alienee
+alienism
+alienist
+alienize
+alienizes
+alienor
+aliens
+aliform
+aligarh
+alight
+alighted
+alighting
+alightment
+align
+aligned
+aligner
+aligning
+alignment
+alignments
+aligns
+alike
+alikeness
+aliment
+alimentary
+alimentation
+alimentative
+aliments
+alimony
+aline
+alinement
+aliped
+aliphatic
+aliquot
+aliquot's
+aliquots
+Alison
+Alison's
+Alistair
+alit
+aliunde
+alive
+aliveness
+alizarin
+alk
+alkahest
+alkahestic
+alkalescence
+alkalescent
+alkali
+alkali's
+alkalic
+alkalify
+alkalimeter
+alkalimeter's
+alkalimeters
+alkalimetry
+alkaline
+alkalinity
+alkalinization
+alkalinization's
+alkalinizations
+alkalinize
+alkalinizes
+alkalis
+alkalization
+alkalize
+alkalized
+alkalizes
+alkalizing
+alkaloid
+alkaloid's
+alkaloidal
+alkaloids
+alkalosis
+alkane
+alkene
+alkmaar
+Alkoran
+alky
+alkyd
+alkyl
+alkylation
+alkyne
+all
+alla
+Allah
+Allah's
+Allahabad
+Allan
+allan
+allanite
+allantoid
+allantois
+allargando
+allay
+allayed
+allaying
+allays
+allegate
+allegation
+allegation's
+allegations
+allege
+alleged
+allegedly
+alleges
+Alleghenies
+Allegheny
+allegiance
+allegiance's
+allegiances
+allegiant
+alleging
+allegoric
+allegorical
+allegorically
+allegoricalness
+allegories
+allegorist
+allegorization
+allegorize
+allegorized
+allegorizer
+allegorizes
+allegorizing
+allegory
+allegory's
+Allegra
+allegretto
+allegretto's
+allegrettos
+allegro
+allegro's
+allegros
+allele
+alleles
+allelic
+allelism
+allelomorph
+alleluia
+allemand
+allemande
+Allen
+Allenby
+Allendale
+Allende
+Allentown
+alleppey
+allergen
+allergenic
+allergic
+allergies
+allergist
+allergy
+allergy's
+allery
+allethrin
+alleviate
+alleviated
+alleviates
+alleviating
+alleviation
+alleviative
+alleviator
+alleviator's
+alleviators
+alleviatory
+alley
+alley's
+alleys
+alleyway
+alleyway's
+alleyways
+allhallows
+Allhallowtide
+allheal
+alliaceous
+alliance
+alliance's
+alliances
+allied
+allier
+allies
+alligator
+alligator's
+alligatored
+alligators
+Allis
+Allison
+alliterate
+alliterated
+alliterates
+alliterating
+alliteration
+alliteration's
+alliterations
+alliterative
+alliteratively
+allium
+alloa
+allocable
+allocatable
+allocate
+allocated
+allocates
+allocating
+allocation
+allocation's
+allocations
+allocative
+allocator
+allocator's
+allocators
+allocution
+allodial
+allodium
+allogamous
+allogamy
+allogeneic
+allograft
+allograph
+allographic
+allomerism
+allomerous
+allometric
+allometry
+allomorph
+allomorphic
+allomorphism
+allonge
+allons
+allonym
+allopath
+allopathic
+allopathically
+allopathy
+allopatric
+allopatrically
+allopatry
+allophane
+allophone
+allophones
+allophonic
+alloplasm
+allopurinol
+allosteric
+allosterically
+allot
+alloted
+allotee
+allotment
+allotment's
+allotments
+allotransplant
+allotransplantation
+allotrope
+allotropic
+allotropically
+allotropy
+allots
+allotted
+allottee
+allottees
+allotter
+allotting
+allotts
+allotype
+allotypic
+allotypically
+allotypy
+allover
+allow
+allowable
+allowableness
+allowably
+allowance
+allowance's
+allowanced
+allowances
+allowancing
+allowed
+allowedly
+allowing
+allows
+alloy
+alloy's
+alloyed
+alloying
+alloys
+allseed
+allspice
+Allstate
+allude
+alluded
+alludes
+alluding
+allure
+allured
+allurement
+allures
+alluring
+allusion
+allusion's
+allusions
+allusive
+allusively
+allusiveness
+alluvial
+alluvion
+alluvium
+ally
+allying
+allyl
+allylic
+Allyn
+Allyn's
+allyou
+alma
+almada
+Almaden
+Almaden's
+almagest
+almanac
+almanac's
+almanacs
+almandine
+almandite
+Almeida
+almelo
+almemar
+almightiness
+almighty
+Almohade
+almond
+almond's
+almonds
+almoner
+almonry
+Almoravide
+almost
+alms
+almsgiver
+almsgiving
+almshouse
+almshouses
+almsman
+almucantar
+almuce
+alnico
+alodium
+aloe
+aloes
+aloft
+alogical
+alogically
+aloha
+aloin
+alone
+aloneness
+along
+alongshore
+alongside
+aloof
+aloofly
+aloofness
+alopecia
+alost
+aloud
+alow
+alp
+alpaca
+alpenglow
+alpenhorn
+alpenstock
+Alpert
+Alpert's
+alpes
+alpestrine
+alpha
+alphabet
+alphabet's
+alphabetic
+alphabetical
+alphabetically
+alphabetics
+alphabetization
+alphabetization's
+alphabetizations
+alphabetize
+alphabetized
+alphabetizer
+alphabetizers
+alphabetizes
+alphabetizing
+alphabets
+alphameric
+alphamerical
+alphamerics
+alphanumeric
+alphanumerical
+alphanumerically
+alphanumerics
+alphatically
+Alpheratz
+alpheus
+Alphonse
+Alphonse's
+alphonsus
+alphorn
+alphosis
+alpine
+alpinism
+alpinist
+alps
+already
+alright
+alsace
+Alsatia
+Alsatian
+Alsatians
+alsike
+also
+Alsop
+Alsop's
+alt
+Altaic
+Altair
+Altair's
+Altamira
+altar
+altar's
+altarpiece
+altars
+altazimuth
+altdorf
+altdorfer
+alter
+alterability
+alterable
+alterably
+alterate
+alteration
+alteration's
+alterations
+alterative
+altercate
+altercation
+altercation's
+altercations
+altered
+alterer
+alterers
+altering
+alterman
+altern
+alternant
+alternate
+alternated
+alternately
+alternates
+alternating
+alternation
+alternations
+alternative
+alternatively
+alternativeness
+alternatives
+alternator
+alternator's
+alternators
+alternize
+alternizes
+alters
+althea
+althing
+altho
+althorn
+although
+altimeter
+altimeter's
+altimeters
+altimetry
+altiplano
+altissimo
+altitude
+altitudes
+altitudinal
+altitudinous
+alto
+alto's
+altocumulus
+altogether
+altogther
+Alton
+Alton's
+altona
+altos
+altostratus
+altricial
+Altrincham
+altruism
+altruist
+altruistic
+altruistically
+altruists
+ALU
+aludel
+alula
+alum
+alumina
+aluminate
+aluminiferous
+aluminization
+aluminize
+aluminized
+aluminizes
+aluminizing
+aluminosilicate
+aluminothermy
+aluminous
+aluminum
+aluminum's
+aluminums
+alumna
+alumna's
+alumnae
+alumni
+alumnus
+alumroot
+alundum
+alunite
+Alva
+Alva's
+Alvarez
+alveolar
+alveolarly
+alveolate
+alveolation
+alveoli
+alveolus
+alvey
+Alvin
+alvine
+alway
+always
+Alyssa
+Alyssa's
+alyssum
+alytical
+am
+AMA
+amadavat
+Amadeus
+amadou
+amagasaki
+amah
+amain
+amalekite
+amalgam
+amalgam's
+amalgamate
+amalgamated
+amalgamates
+amalgamating
+amalgamation
+amalgamations
+amalgamative
+amalgamatize
+amalgamatizes
+amalgamator
+amalgamization
+amalgamization's
+amalgamizations
+amalgamize
+amalgamizes
+amalgams
+amalthea
+Amanda
+Amanda's
+amanita
+amanuenses
+amanuensis
+amaranth
+amaranthaceous
+amaranthine
+amarelle
+Amarillo
+Amarillo's
+amaryllidaceous
+Amaryllis
+amass
+amassed
+amasser
+amasses
+amassing
+amassment
+amateur
+amateur's
+amateurish
+amateurishly
+amateurishness
+amateurism
+amateurs
+Amati
+amative
+amatively
+amativeness
+amatol
+amatory
+amaurosis
+amaurotic
+amaut
+amaze
+amazed
+amazedly
+amazement
+amazer
+amazers
+amazes
+amazing
+amazingly
+amazon
+amazon's
+amazonas
+amazonite
+amazons
+ambage
+ambages
+ambagious
+ambala
+ambary
+ambassador
+ambassador's
+ambassadorial
+ambassadors
+ambassadorship
+ambassadress
+amber
+ambergris
+amberjack
+amberoid
+ambiance
+ambiances
+ambidexterity
+ambidextrous
+ambidextrously
+ambience
+ambiences
+ambient
+ambiguities
+ambiguity
+ambiguity's
+ambiguous
+ambiguously
+ambiguousness
+ambit
+ambition
+ambition's
+ambitionless
+ambitions
+ambitious
+ambitiously
+ambitiousness
+ambivalence
+ambivalent
+ambivalently
+ambiversion
+ambiversive
+ambivert
+amble
+ambled
+ambler
+ambles
+ambling
+amblygonite
+amblyopia
+ambo
+amboceptor
+Amboina
+amboise
+amboyna
+ambroid
+ambrose
+ambrosia
+ambrosial
+ambrosially
+Ambrosian
+ambrotype
+ambry
+ambsace
+ambulacral
+ambulacrum
+ambulance
+ambulance's
+ambulances
+ambulant
+ambulate
+ambulation
+ambulatorily
+ambulatory
+ambuscade
+ambuscader
+ambush
+ambushed
+ambusher
+ambushes
+ambushment
+Amdahl
+amdahl
+Amdahl's
+ameba
+ameer
+Amelia
+Amelia's
+Ameling
+ameliorate
+ameliorated
+ameliorating
+amelioration
+ameliorative
+ameliorator
+amelioratory
+amen
+amenabilities
+amenability
+amenable
+amenably
+amend
+amendable
+amendatory
+amende
+amended
+amender
+amending
+amendment
+amendment's
+amendments
+amends
+amenhotep
+amenities
+amenity
+amenorrhea
+ament
+amentia
+Amerada
+amerce
+amercement
+amerciable
+amercing
+America
+America's
+American
+American's
+Americana
+Americanism
+Americanist
+Americanization
+Americanization's
+Americanizations
+Americanize
+americanized
+Americanizer
+Americanizers
+Americanizes
+Americanizing
+Americans
+Americas
+americium
+Amerigo
+Amerindian
+Amersfoort
+Ames
+amesace
+Ameslan
+amethyst
+amethystine
+ametropia
+ametropic
+Amfortas
+amhara
+amharic
+Amharic
+Amherst
+Amherst's
+ami
+amiability
+amiable
+amiableness
+amiabler
+amiablest
+amiably
+amianthus
+amicability
+amicable
+amicableness
+amicably
+amice
+amicus
+amid
+amide
+amidol
+amidship
+amidships
+amidst
+amiens
+amigo
+amin
+amine
+amino
+aminobenzoic
+aminophenol
+aminopyridine
+aminopyrine
+amir
+amis
+Amish
+amiss
+amitosis
+amitotic
+amitotically
+amitrole
+amity
+Amman
+ammendment
+ammendments
+Ammerman
+Ammerman's
+ammeter
+ammeter's
+ammeters
+ammine
+ammino
+ammo
+ammocoete
+ammon
+ammonal
+ammonate
+ammonia
+ammoniac
+ammoniacal
+ammonias
+ammoniate
+ammoniation
+ammonic
+ammonification
+ammonifier
+ammonify
+ammonite
+Ammonites
+ammonites
+ammonitic
+ammonium
+ammonoid
+ammunition
+ammunitions
+amnesia
+amnesiac
+amnesic
+amnestic
+amnesty
+amnia
+amniocentesis
+amnion
+amniote
+amniotic
+Amoco
+Amoco's
+amoeba
+amoeba's
+amoebae
+amoebaean
+amoeban
+amoebas
+amoebiasis
+amoebic
+amoebocyte
+amoeboid
+amok
+amon
+among
+amongst
+Amontillado
+amontillado
+amor
+amor's
+amoral
+amoralism
+amorality
+amoralize
+amoralizes
+amorally
+amoretto
+amorism
+amorism's
+amorisms
+amoristic
+amoristics
+amoroso
+amorous
+amorously
+amorousness
+amorphism
+amorphization
+amorphize
+amorphous
+amorphously
+amorphousness
+amors
+amort
+amortizable
+amortizable's
+amortizables
+amortization
+amortization's
+amortizations
+amortize
+amortized
+amortizement
+amortizement's
+amortizements
+amortizes
+amortizing
+Amos
+amount
+amounted
+amounter
+amounters
+amounting
+amounts
+amour
+amour's
+amours
+amowt
+Amoy
+amp
+Ampelopsis
+amperage
+amperages
+ampere
+amperes
+ampersand
+ampersand's
+ampersands
+Ampex
+Ampex's
+amphetamine
+amphetamines
+amphiarthrosis
+amphiaster
+amphibia
+amphibian
+amphibian's
+amphibians
+amphibiotic
+amphibious
+amphibiously
+amphibiousness
+amphiblastula
+amphibole
+amphibolite
+amphibolitic
+amphibology
+amphibrach
+amphichroic
+amphicoelous
+amphictyon
+amphictyony
+amphidiploid
+amphigory
+amphimacer
+amphimixis
+amphioxis
+amphioxus
+amphipathic
+amphiploid
+amphipod
+amphiprostyle
+amphiprotic
+amphisbaena
+amphistylar
+amphitheater
+amphitheater's
+amphitheaters
+amphitheatric
+amphitheatrical
+amphitheatrically
+amphithecium
+amphitricha
+Amphitrite
+amphitropous
+Amphitryon
+amphora
+amphoteric
+ample
+ampleness
+ampler
+amplest
+amplexicaul
+amplexus
+amplidyne
+amplification
+amplifications
+amplified
+amplifier
+amplifiers
+amplifies
+amplify
+amplifying
+amplitude
+amplitude's
+amplitudes
+amply
+ampoule
+ampoule's
+ampoules
+amps
+ampul
+ampule
+ampulla
+amputate
+amputated
+amputates
+amputating
+amputation
+amputator
+amputee
+amra
+amravati
+amrita
+Amritsar
+ams
+Amsterdam
+Amsterdam's
+amstrad
+Amtrak
+Amtrak's
+amuck
+amulet
+amulets
+Amundsen
+amur
+amuse
+amused
+amusedly
+amusement
+amusement's
+amusements
+amuser
+amusers
+amuses
+amusing
+amusingly
+amusingness
+amusive
+Amy
+Amy's
+amygdala
+amygdalate
+amygdale
+amygdalin
+amygdaline
+amygdaloid
+amygdaloidal
+amyl
+amylaceous
+amylase
+amylene
+amyloid
+amylolysis
+amylolytic
+amylopectin
+amylopsin
+amylose
+amyotonia
+Amytal
+an
+ana
+Anabaena
+anabantid
+anabaptism
+Anabaptist
+Anabaptist's
+Anabaptists
+Anabas
+anabasis
+anabatic
+Anabel
+Anabel's
+anabiosis
+anabiotic
+Anableps
+anabolic
+anabolism
+anabolite
+anabranch
+anacardiaceous
+anachorism
+anachronic
+anachronism
+anachronism's
+anachronisms
+anachronistic
+anachronistically
+anachronous
+anachronously
+anaclinal
+anaclitic
+anacoluthia
+anacoluthic
+anacoluthically
+anacoluthon
+anaconda
+anacondas
+anacoustic
+Anacreon
+Anacreontic
+anacrusis
+anaculture
+anadem
+anadex
+anadiplosis
+anadromous
+anadyr
+anaerobe
+anaerobic
+anaerobically
+anaerobiosis
+anaglyph
+anaglyphic
+anaglypta
+anagnorisis
+anagoge
+anagram
+anagram's
+anagrammatic
+anagrammatical
+anagrammatically
+anagrammatization
+anagrammatize
+anagrams
+Anaheim
+Anaheim's
+anak
+anal
+analcite
+Analects
+analects
+analemma
+analemma's
+analemmas
+analeptic
+analgesia
+analgesic
+analgetic
+analog
+analog's
+analogic
+analogical
+analogically
+analogies
+analogism
+analogism's
+analogisms
+analogist
+analogize
+analogizes
+analogous
+analogously
+analogousness
+analogs
+analogy
+analogy's
+analphabet
+analphabetic
+analphabetism
+analysand
+analysis
+analyst
+analyst's
+analysts
+analytic
+analytical
+analytically
+analyticities
+analyticity
+analytics
+analyzable
+analyzation
+analyze
+analyzed
+analyzer
+analyzers
+analyzes
+analyzing
+Anam
+anambra
+anamnesis
+anamorphic
+anamorphism
+anamorphoscope
+anamorphosis
+anandrous
+Ananias
+ananthous
+anapaest
+anaphase
+anaphasic
+anaphora
+anaphoric
+anaphorically
+anaphrodisiac
+anaphylaxis
+anaplasia
+anaplasmosis
+anaplastic
+anaplasty
+anaptyxis
+anapurna
+anarch
+anarchic
+anarchical
+anarchism
+anarchist
+anarchist's
+anarchistic
+anarchists
+anarchize
+anarchizes
+anarcho
+anarchy
+anarthria
+anarthrous
+anasarca
+anastasia
+anastigmat
+anastigmatic
+anastomose
+anastomoses
+anastomosis
+anastomotic
+anastrophe
+anatase
+anathema
+anathematization
+anathematize
+anathematized
+anathematizes
+anathematizing
+Anatole
+Anatole's
+anatolia
+Anatolian
+anatomic
+anatomical
+anatomically
+anatomicals
+anatomist
+anatomize
+anatomy
+anatoxin
+anatropous
+anatto
+anaxagoras
+anaximander
+anaximenes
+anbury
+ancestor
+ancestor's
+ancestors
+ancestral
+ancestrally
+ancestress
+ancestry
+Anchises
+anchor
+anchorage
+anchorage's
+anchorages
+anchored
+anchoress
+anchoret
+anchoring
+anchorite
+anchoritic
+anchoritically
+anchoritism
+anchorless
+anchorman
+anchors
+anchoveta
+anchovies
+anchovy
+anchylose
+ancient
+anciently
+ancientness
+ancientry
+ancients
+ancillaries
+ancillary
+ancipital
+ancohuma
+ancon
+Ancona
+ancy
+ancylostomiasis
+and
+andalusia
+Andalusia
+andalusite
+Andaman
+andante
+andantino
+Andean
+Andean's
+anded
+anderlecht
+anders
+Andersen
+Andersen's
+Anderson
+Anderson's
+Andes
+andesine
+andesite
+andesitic
+Andhra
+anding
+andiron
+andizhan
+Andorra
+Andorra's
+Andover
+Andover's
+andradite
+Andre
+Andre's
+Andrea
+Andrea's
+andreanof
+Andrei
+Andrei's
+andreotti
+Andrew
+Andrew's
+androcles
+androclinium
+androecium
+androgen
+androgenic
+androgenous
+androgyne
+androgynous
+androgyny
+android
+Andromache
+Andromeda
+andros
+androsphinx
+androsterone
+ands
+andvari
+Andy
+Andy's
+ane
+anear
+anecdotage
+anecdotal
+anecdotalist
+anecdotalists
+anecdotally
+anecdote
+anecdote's
+anecdotes
+anecdotic
+anecdotical
+anecdotically
+anecdotist
+anechoic
+anelace
+anele
+anemia
+anemia's
+anemias
+anemic
+anemically
+anemics
+anemochore
+anemograph
+anemographic
+anemography
+anemology
+anemometer
+anemometer's
+anemometers
+anemometric
+anemometrical
+anemometry
+anemone
+anemophilous
+anemoscope
+anent
+anergy
+aneroid
+anesthesia
+anesthesia's
+anesthesias
+anesthesiologist
+anesthesiology
+anesthetic
+anesthetic's
+anesthetically
+anesthetics
+anesthetist
+anesthetization
+anesthetization's
+anesthetizations
+anesthetize
+anesthetized
+anesthetizer
+anesthetizer's
+anesthetizers
+anesthetizes
+anesthetizing
+anestrus
+anethole
+aneto
+aneuploid
+aneurin
+aneurism
+aneurysm
+aneurysmal
+anew
+anfractuosity
+anfractuous
+Angara
+Angarsk
+angary
+angel
+angel's
+Angela
+Angeleno
+Angeleno's
+Angelenos
+Angeles
+angelfish
+angelic
+Angelica
+Angelica's
+angelical
+angelically
+angelicize
+angelicizes
+angelico
+Angelina
+Angeline
+angelize
+angelizes
+angell
+Angelo
+angelology
+angels
+Angelus
+anger
+angered
+angering
+angerless
+angers
+Angevin
+Angie
+angina
+anginal
+anginose
+angiocardiographic
+angiocardiography
+angiography
+angiology
+angioma
+angiosperm
+Angkor
+angle
+angled
+angler
+anglers
+angles
+Anglesey
+anglesite
+angleworm
+Anglia
+anglia
+Anglian
+Anglican
+Anglican's
+Anglicanism
+Anglicanism's
+Anglicanize
+Anglicanizes
+Anglicans
+anglice
+anglicism
+Anglicist
+anglicization
+anglicization's
+anglicizations
+anglicize
+anglicized
+anglicizes
+angling
+Anglo
+Anglomania
+Anglophile
+Anglophilia
+Anglophilia's
+Anglophiliac
+Anglophilic
+Anglophilism
+Anglophily
+Anglophobe
+Anglophobia
+Anglophobia's
+Anglophobic
+Anglophone
+Angola
+Angola's
+angora
+angostura
+angra
+angrier
+angriest
+angrily
+angriness
+angry
+angst
+angstrom
+angstroms
+Anguilla
+anguilliform
+anguine
+anguish
+anguished
+angular
+angularity
+angularization
+angularization's
+angularizations
+angularize
+angularizes
+angularly
+angulation
+Angus
+angwantibo
+anhalt
+Anheuser
+anhinga
+anhwei
+anhydride
+anhydridization
+anhydridization's
+anhydridizations
+anhydridize
+anhydridizes
+anhydrite
+anhydrous
+anhydrously
+ani
+aniakchak
+aniconic
+anil
+anile
+aniline
+anilingus
+anima
+animadversion
+animadvert
+animal
+animal's
+animalcular
+animalcule
+animalculum
+animalism
+animalist
+animalistic
+animality
+animalization
+animalization's
+animalizations
+animalize
+animalized
+animalizes
+animalizing
+animallike
+animally
+animalness
+animals
+animate
+animated
+animatedly
+animately
+animateness
+animates
+animating
+animation
+animations
+animatism
+animato
+animator
+animator's
+animators
+animism
+animist
+animistic
+animized
+animosity
+animus
+anion
+anion's
+anionic
+anionics
+anions
+anise
+aniseed
+aniseikonia
+aniseikonic
+anisette
+anisodactyl
+anisogamy
+anisole
+anisometric
+anisometropia
+anisotropic
+anisotropically
+anisotropies
+anisotropism
+anisotropy
+anisotropy's
+Anita
+Anjou
+Ankara
+ankerite
+ankh
+anking
+ankle
+ankle's
+anklebone
+anklebones
+ankles
+anklet
+ankus
+ankylosaur
+ankylose
+ankylosis
+ankylostomiasis
+anlace
+anlage
+Ann
+Anna
+annaba
+annabergite
+annal
+Annale
+Annalen
+annalen
+Annalist
+Annalistic
+annalize
+annalizes
+annals
+Annam
+Annamese
+Annapolis
+Annapurna
+annates
+annatto
+Anne
+Anne's
+anneal
+annealed
+annealer
+annealers
+annealing
+anneals
+annecy
+annelid
+Annette
+annex
+annexation
+annexational
+annexationist
+annexations
+annexe
+annexed
+annexes
+annexing
+annhilate
+Annie
+annihilate
+annihilated
+annihilates
+annihilating
+annihilation
+annihilative
+annihilator
+annihilatory
+anniversaries
+anniversary
+anniversary's
+anno
+annotate
+annotated
+annotates
+annotating
+annotation
+annotations
+annotative
+annotator
+annotators
+announce
+announced
+announcement
+announcement's
+announcements
+announcer
+announcers
+announces
+announcing
+annoy
+annoyance
+annoyance's
+annoyances
+annoyed
+annoyer
+annoyers
+annoying
+annoyingly
+annoys
+annual
+annualization
+annualize
+annualized
+annualizes
+annualizing
+annually
+annuals
+annuary
+annuitant
+annuities
+annuity
+annul
+annular
+annularity
+annularly
+annulate
+annulated
+annulately
+annulation
+annulet
+annuli
+annulled
+annulling
+annulment
+annulment's
+annulments
+annulose
+annuls
+annulus
+annum
+annunciate
+annunciated
+annunciates
+annunciating
+annunciation
+annunciator
+annunciators
+annunciatory
+annunicates
+anoa
+anodal
+anodally
+anode
+anode's
+anodes
+anodic
+anodically
+anodization
+anodize
+anodized
+anodizes
+anodizing
+anodyne
+anodynic
+anoestrus
+anoint
+anointed
+anointer
+anointing
+anointment
+anoints
+anole
+anomalies
+anomalistic
+anomalistical
+anomalous
+anomalously
+anomalousness
+anomaly
+anomaly's
+anomer
+anomeric
+anomic
+anomie
+anon
+anonym
+anonymity
+anonymous
+anonymously
+anonymousness
+Anopheles
+anorak
+anorectic
+anoretic
+anorexia
+anorexigenic
+anorthic
+anorthite
+anorthitic
+anorthosite
+anorthositic
+anosmia
+anosmic
+another
+another's
+Anouilh
+anovulant
+anovulatory
+anoxaemia
+anoxemia
+anoxemic
+anoxia
+anoxic
+ansate
+anschluss
+Anselm
+Anselm's
+Anselmo
+Anselmo's
+anserine
+Ansermet
+anshan
+ANSI
+ANSI's
+Anson
+answer
+answerable
+answered
+answerer
+answerers
+answering
+answers
+ant
+ant's
+antacid
+Antaeus
+antagonism
+antagonisms
+antagonist
+antagonist's
+antagonistic
+antagonistically
+antagonists
+antagonization
+antagonization's
+antagonizations
+antagonize
+antagonized
+antagonizer
+antagonizers
+antagonizes
+antagonizing
+antarctic
+Antarctic
+Antarctica
+Antarctica's
+Antares
+ante
+anteater
+anteater's
+anteaters
+antebellum
+antecede
+antecedence
+antecedent
+antecedent's
+antecedently
+antecedents
+antecessor
+antechamber
+antechambers
+antechoir
+anted
+antedate
+antedated
+antedates
+antedating
+antediluvian
+antefix
+antefixal
+anteing
+antelope
+antelope's
+antelopes
+antemeridian
+antemortem
+antenatal
+antenna
+antenna's
+antennae
+antennal
+antennas
+antennule
+antependium
+antepenultimate
+anterior
+anteriorly
+anteriors
+anteroom
+anterooms
+antetype
+anteversion
+antevert
+anthelion
+anthelmintic
+anthem
+anthem's
+anthemion
+anthems
+anther
+antheridium
+antherozoid
+anthesis
+anthill
+anthocyanin
+anthologies
+anthologist
+anthologization
+anthologize
+anthologized
+anthologizer
+anthologizes
+anthologizing
+anthology
+Anthony
+anthophore
+anthotaxy
+anthozoan
+anthracene
+anthracite
+anthracitic
+anthracitization
+anthracitization's
+anthracitizations
+anthracnose
+anthracoid
+anthraquinone
+anthrax
+anthrop
+anthropic
+anthropical
+anthropocentric
+anthropocentrically
+anthropocentricity
+anthropogenesis
+anthropogenetic
+anthropogenic
+anthropography
+anthropoid
+anthropological
+anthropologically
+anthropologist
+anthropologist's
+anthropologists
+anthropology
+anthropometric
+anthropometrical
+anthropometrically
+anthropometrics
+anthropometry
+anthropomorphic
+anthropomorphically
+anthropomorphism
+anthropomorphist
+anthropomorphization
+anthropomorphize
+anthropomorphized
+anthropomorphizes
+anthropomorphizing
+anthropomorphosis
+anthropomorphous
+anthropopathism
+anthropopathy
+anthropophagi
+anthropophagite
+anthropophagous
+anthropophagus
+anthropophagy
+anthroposophy
+Anthurium
+anti
+antiaircraft
+antianxiety
+antibacterial
+antibaryon
+antibes
+antibiosis
+antibiotic
+antibiotically
+antibiotics
+antiblack
+antiblackism
+antibodies
+antibody
+antic
+antic's
+antically
+anticancer
+anticancerous
+anticatalyst
+anticatalyzer
+anticatalyzer's
+anticatalyzers
+anticathode
+anticentralization
+anticentralization's
+anticentralizations
+antichlor
+anticholinergic
+anticholinesterase
+antichrist
+anticipant
+anticipants
+anticipatable
+anticipate
+anticipated
+anticipates
+anticipating
+anticipation
+anticipations
+anticipative
+anticipatively
+anticipator
+anticipatory
+anticize
+anticizes
+anticlastic
+anticlerical
+anticlericalism
+anticlimactic
+anticlimactical
+anticlimactically
+anticlimax
+anticlimaxes
+anticlinal
+anticline
+anticlinorium
+anticlockwise
+anticoagulant
+anticoagulate
+anticoagulation
+anticodon
+anticompetitive
+anticonvulsant
+anticonvulsive
+anticosti
+antics
+anticyclone
+anticyclones
+antidepressant
+antiderivative
+antidisestablishmentarianism
+antidiuretic
+antidotal
+antidotally
+antidote
+antidote's
+antidotes
+antidromic
+antiegalitarian
+antienzyme
+antiepicenter
+antiepicenter's
+antiepicenters
+antiestablishment
+Antietam
+antifebrile
+antifederalist
+antiferromagnetism
+antifertility
+antifertilizer
+antifertilizer's
+antifertilizers
+antifluoridation
+antiform
+antiformant
+antifouling
+antifreeze
+antifriction
+antifundamentalist
+antifungal
+antigen
+antigen's
+antigenic
+antigenically
+antigenicity
+antigens
+antiglobulin
+antigone
+Antigonus
+antigorite
+antigravity
+Antigua
+antihalation
+antihelices
+antihelix
+antihemophilic
+antihero
+antiheros
+antihistamine
+antihistaminic
+antihistorical
+antihypertensive
+antiknock
+antilabor
+antilabor's
+antilabors
+antilepton
+antileptons
+antileukemic
+antilitter
+Antilles
+antilog
+antilogarithm
+antilogarithms
+antilogism
+antilogs
+antilogy
+antimacassar
+antimacassars
+antimagnetic
+antimalarial
+antimalarials
+antimasque
+antimatter
+antimatter's
+antimedieval
+antimedieval's
+antimedievals
+antimere
+antimetabolite
+antimicrobial
+antimilitarist
+antimilitarists
+antimissile
+antimissiles
+antimitotic
+antimonial
+antimonic
+antimonious
+antimonous
+antimony
+antimonyl
+antineoplastic
+antineutrino
+antineutron
+anting
+antinodal
+antinode
+antinomian
+antinomy
+antinovel
+antinovelist
+antinucleon
+Antioch
+antiochus
+antioxidant
+antioxidizer
+antioxidizer's
+antioxidizers
+antioxidizing
+antioxidizing's
+antioxidizings
+antiparallel
+antiparasitic
+antiparticle
+antipasto
+antipater
+antipathetic
+antipathetically
+antipathize
+antipathizes
+antipathy
+antiperiodic
+antiperiplanar
+antiperistalsis
+antipersonnel
+antiperspirant
+antiphlogistic
+antiphon
+antiphonal
+antiphonally
+antiphonary
+antiphony
+antiphrasis
+antipodal
+antipode
+antipode's
+antipodean
+antipodes
+antipoetic
+antipollution
+antipope
+antiproton
+antipsychiatry
+antipyretic
+antipyrine
+antiquarian
+antiquarian's
+antiquarianism
+antiquarianize
+antiquarianizes
+antiquarians
+antiquary
+antiquate
+antiquated
+antiquation
+antique
+antique's
+antiques
+antiquities
+antiquity
+antirachitic
+antiredeposition
+antiremonstrant
+antiresonance
+antiresonator
+antirheumatic
+antirrhinum
+antirumor
+antirumor's
+antirumors
+antisana
+antiscorbutic
+antisemite
+antisemite's
+antisemites
+antisemitic
+antisemitism
+antisemitism's
+antisensitize
+antisensitizer
+antisensitizer's
+antisensitizers
+antisensitizes
+antisepsis
+antiseptic
+antiseptically
+antisepticize
+antisepticizes
+antiseptize
+antiseptizes
+antisera
+antiserum
+antisiphon
+antisiphon's
+antisiphons
+antislavery
+antisocial
+antispasmodic
+antistatic
+antisthenes
+antistrophe
+antistrophic
+antistrophically
+antisubmarine
+antisymmetric
+antisymmetry
+antitank
+antithesis
+antithesize
+antithesizes
+antithetic
+antithetical
+antithetically
+antithyroid
+antitoxic
+antitoxin
+antitoxin's
+antitoxins
+antitrades
+antitragus
+antitrust
+antitruster
+antitubercular
+antituberculous
+antitumor
+antitumoral
+antitussive
+antitype
+antivenin
+antiviral
+antivitamin
+antiworld
+antler
+antlered
+antlia
+antlion
+antofagasta
+Antoine
+Antoinette
+Anton
+Anton's
+antoninus
+Antonio
+Antonio's
+antonioni
+antonius
+antonomasia
+Antony
+antonym
+antonymic
+antonymous
+antonyms
+antonymy
+antre
+antrim
+antrorse
+antrorsely
+antrum
+ants
+antung
+Antwerp
+anu
+Anubis
+anuradhapura
+anuran
+anuresis
+anuria
+anurous
+anus
+anvers
+anvil
+anvil's
+anviled
+anviling
+anvils
+anxieties
+anxiety
+anxious
+anxiously
+anxiousness
+any
+anyang
+anybodies
+anybody
+anyhow
+anymore
+anyone
+anyone's
+anyones
+anyplace
+anything
+anythings
+anytime
+anyway
+anyways
+anywhere
+anywheres
+anywise
+Anzac
+anzio
+anzus
+aorangi
+aorta
+aortal
+aortic
+aortographic
+aortography
+aosta
+aoudad
+apace
+apache
+apaches
+apagoge
+apalachicola
+apanage
+aparri
+apart
+apartheid
+apartment
+apartment's
+apartmental
+apartments
+apartness
+apatetic
+apathetic
+apathetically
+apathy
+apatite
+ape
+apeak
+aped
+apeldoorn
+apelike
+apelles
+apeman
+apennines
+aper
+aperient
+aperiodic
+aperiodically
+aperiodicity
+aperitif
+aperture
+apertured
+apery
+apes
+apetalous
+Apetalous
+apex
+apexes
+aphaeresis
+aphaeretic
+aphagia
+aphanite
+aphanitic
+aphasia
+aphasiac
+aphasic
+aphelion
+apheliotropic
+aphesis
+aphetic
+aphetically
+aphid
+aphid's
+aphides
+aphids
+Aphis
+aphonia
+aphonic
+aphorism
+aphorism's
+aphorisms
+aphorist
+aphoristic
+aphoristically
+aphorize
+aphorized
+aphorizer
+aphorizers
+aphorizes
+aphorizing
+aphotic
+aphrodisiac
+aphrodisiacal
+Aphrodite
+Aphrodite's
+aphtha
+aphyllous
+aphylly
+apia
+apian
+apiarian
+apiaries
+apiarist
+apiary
+apical
+apically
+apices
+apiculate
+apicultural
+apiculture
+apiculturist
+apiece
+apiezon
+aping
+Apis
+apish
+apishly
+apishness
+apivorous
+aplacental
+aplanatic
+aplanospore
+aplasia
+aplastic
+aplenty
+aplite
+aplomb
+apnoea
+apo
+apocalypse
+apocalyptic
+apocalyptical
+apocalyptically
+apocalypticism
+apocalyptism
+apocalyptist
+apocarp
+apocarpous
+apocarpy
+apochromat
+apochromatic
+apocopate
+apocope
+apocrine
+apocrypha
+apocryphal
+apocryphally
+apocryphalness
+apocynaceous
+apocynthion
+apodal
+apodeictic
+apodictic
+apodictically
+apodosis
+apodous
+apoenzyme
+apogamic
+apogamous
+apogamy
+apogean
+apogee
+apogees
+apogeotropism
+apolar
+apolitical
+apolitically
+apollinaire
+Apollinaire
+apollinaris
+Apollo
+Apollo's
+Apollonian
+Apollyon
+apologetic
+apologetically
+apologetics
+apologia
+apologie
+apologies
+apologist
+apologist's
+apologists
+apologize
+apologized
+apologizer
+apologizers
+apologizes
+apologizing
+apologue
+apology
+apology's
+apolune
+apomict
+apomixis
+apomorphine
+aponeurosis
+aponeurotic
+apopemptic
+apophasis
+apophthegm
+apophyge
+apophyllite
+apophysis
+apoplectic
+apoplectically
+apoplexy
+apopolectic
+aport
+aposematic
+aposematically
+aposiopesis
+apospory
+apostasy
+apostate
+apostates
+apostatization
+apostatize
+apostatized
+apostatizes
+apostatizing
+apostil
+apostle
+apostle's
+apostles
+apostleship
+apostolate
+apostolic
+apostolicity
+apostrophe
+apostrophes
+apostrophic
+apostrophize
+apostrophized
+apostrophizes
+apostrophizing
+apothecary
+apothecial
+apothecium
+apothegm
+apothegmatic
+apothegmatical
+apothegmatically
+apothem
+apotheoses
+apotheosis
+apotheosize
+apotropaic
+apotropaically
+Appalachia
+Appalachia's
+Appalachian
+Appalachian's
+Appalachians
+appall
+appalled
+appalling
+appallingly
+appalls
+appaloosa
+Appaloosas
+appaloosas
+appanage
+apparatus
+apparatuses
+apparel
+appareled
+appareling
+apparels
+apparency
+apparent
+apparently
+apparentness
+apparition
+apparition's
+apparitional
+apparitions
+apparitor
+appassionato
+appeal
+appealability
+appealable
+appealed
+appealer
+appealers
+appealing
+appealingly
+appeals
+appear
+appearance
+appearances
+appeared
+appearer
+appearers
+appearing
+appears
+appeasable
+appease
+appeased
+appeasement
+appeaser
+appeases
+appeasing
+appel
+appellant
+appellant's
+appellants
+appellate
+appellation
+appellative
+appellatively
+appellee
+append
+appendage
+appendage's
+appendages
+appendant
+appendectomy
+appended
+appender
+appenders
+appendicectomy
+appendices
+appendicitis
+appendicle
+appendicular
+appending
+appendix
+appendix's
+appendixes
+appends
+appenzell
+apperceive
+apperception
+apperceptive
+appertain
+appertained
+appertaining
+appertains
+appestat
+appetence
+appetency
+appetent
+appetite
+appetite's
+appetites
+appetitive
+appetize
+appetized
+appetizement
+appetizement's
+appetizements
+appetizer
+appetizers
+appetizes
+appetizing
+appetizingly
+Appian
+applaud
+applaudable
+applaudably
+applauded
+applauder
+applauding
+applauds
+applause
+apple
+apple's
+Appleby
+Appleby's
+applecart
+applecarts
+applejack
+apples
+applesauce
+applesnits
+Appleton
+appliance
+appliance's
+appliances
+applicability
+applicable
+applicant
+applicant's
+applicants
+applicate
+application
+application's
+applications
+applicative
+applicatively
+applicator
+applicator's
+applicators
+applicatory
+applied
+applier
+appliers
+applies
+applique
+appliques
+apply
+applying
+appoint
+appointe
+appointed
+appointee
+appointee's
+appointees
+appointer
+appointers
+appointing
+appointive
+appointment
+appointment's
+appointments
+appointor
+appointors
+appoints
+appomattox
+Appomattox
+apport
+apportion
+apportioned
+apportioning
+apportionment
+apportionments
+apportions
+appose
+apposed
+apposing
+apposite
+appositely
+appositeness
+apposition
+appositional
+appositionally
+appositive
+appositively
+appraisal
+appraisal's
+appraisals
+appraise
+appraised
+appraisement
+appraiser
+appraisers
+appraises
+appraising
+appraisingly
+appreciable
+appreciably
+appreciate
+appreciated
+appreciates
+appreciating
+appreciation
+appreciations
+appreciative
+appreciatively
+appreciativeness
+appreciator
+appreciatory
+apprehend
+apprehended
+apprehender
+apprehending
+apprehends
+apprehensible
+apprehensibly
+apprehension
+apprehension's
+apprehensions
+apprehensive
+apprehensively
+apprehensiveness
+apprentice
+apprenticed
+apprentices
+apprenticeship
+apprenticeships
+appressed
+apprise
+apprised
+appriser
+apprisers
+apprises
+apprising
+apprisings
+apprize
+apprized
+apprizer
+apprizers
+apprizes
+apprizing
+apprizingly
+apprizings
+approach
+approachability
+approachable
+approached
+approacher
+approachers
+approaches
+approaching
+approbate
+approbation
+approbatory
+appropriable
+appropriate
+appropriated
+appropriately
+appropriateness
+appropriates
+appropriatest
+appropriating
+appropriation
+appropriations
+appropriative
+appropriator
+appropriator's
+appropriators
+approvable
+approvably
+approval
+approval's
+approvals
+approve
+approved
+approver
+approvers
+approves
+approving
+approvingly
+approx
+approximable
+approximal
+approximant
+approximate
+approximated
+approximately
+approximates
+approximating
+approximation
+approximations
+approximative
+approximatively
+approximator
+approximators
+appulse
+appurtenance
+appurtenances
+appurtenant
+Apr
+apractic
+apraxia
+apraxic
+apricot
+apricot's
+apricots
+April
+April's
+Aprils
+apriorism
+apriority
+apron
+apron's
+aprons
+apropos
+APS
+apse
+apses
+apsidal
+apsides
+apsis
+apt
+apteral
+apterous
+apterygial
+apteryx
+aptitude
+aptitudes
+aptitudinal
+aptitudinally
+aptly
+aptness
+apuleius
+apulia
+apure
+apurimac
+Apus
+apyrase
+apyretic
+aqaba
+aqua
+aquacade
+aquaculture
+aquafortis
+aqualung
+aqualunger
+aquamarine
+aquanaut
+aquaplane
+aquaplaner
+aquarelle
+aquarellist
+aquaria
+aquarist
+aquarium
+Aquarius
+aquas
+aquashow
+aquatic
+aquatically
+aquatics
+aquatint
+aquatinter
+aquatintist
+aquavit
+aqueduct
+aqueduct's
+aqueducts
+aqueous
+aqueously
+aquicultural
+aquiculture
+aquidneck
+aquifer
+aquiferous
+aquifers
+Aquila
+Aquila's
+aquilegia
+aquileia
+aquiline
+aquilinity
+Aquinas
+aquire
+aquit
+aquitaine
+aquittal
+aquiver
+AR
+ara
+Arab
+Arab's
+arabesque
+Arabia
+Arabia's
+Arabian
+Arabian's
+Arabianize
+Arabianizes
+Arabians
+Arabic
+Arabic's
+arabica
+Arabicize
+Arabicizes
+arability
+arabinose
+Arabist
+arabization
+arabize
+arabized
+arabizes
+arabizing
+arable
+Arabs
+Araby
+Arachne
+Arachne's
+arachnid
+arachnid's
+arachnids
+arachnoid
+arad
+Arafat
+arafura
+aragats
+aragon
+aragonite
+araguaia
+Araiza
+arak
+arakan
+araks
+araldite
+araliaceous
+aram
+Aramaic
+aran
+araneid
+arany
+Arapaho
+arapaima
+ararat
+araroba
+aras
+araucania
+Araucanian
+Araucaria
+Arawakan
+araxes
+arbalest
+Arbela
+arbil
+arbiter
+arbiter's
+arbiters
+arbitrable
+arbitrage
+arbitrager
+arbitrageur
+arbitral
+arbitrament
+arbitrarily
+arbitrariness
+arbitrary
+arbitrate
+arbitrated
+arbitrates
+arbitrating
+arbitration
+arbitrational
+arbitrative
+arbitrator
+arbitrator's
+arbitrators
+arbitress
+arbor
+arbor's
+arboraceous
+arboreal
+arboreally
+arbored
+arboreous
+arbores
+arborescence
+arborescent
+arborescently
+arboretum
+arboriculture
+arboriculturist
+arborist
+arborist's
+arborists
+arborization
+arborize
+arborized
+arborizes
+arborizing
+arbors
+arborvitae
+arbovirus
+arbritrary
+arbroath
+arbuthnot
+arbutus
+arc
+arcade
+arcade's
+arcaded
+arcades
+Arcadia
+Arcadian
+Arcadic
+arcading
+arcana
+arcane
+arcanum
+arcature
+arccos
+arccosine
+arced
+arch
+archae
+archaean
+archaeological
+archaeologically
+archaeologist
+archaeologist's
+archaeologists
+archaeology
+archaeomagnetism
+Archaeopteryx
+Archaeornis
+archaeozoic
+archaic
+archaically
+archaicness
+archaism
+archaist
+archaistic
+archaize
+archaized
+archaizer
+archaizers
+archaizes
+archaizing
+archangel
+archangel's
+archangelic
+archangels
+archbishop
+archbishopric
+archdeacon
+archdeaconate
+archdeaconry
+archdiocesan
+archdiocese
+archdioceses
+archducal
+archduchess
+archduchy
+archduke
+archdukedom
+Archean
+arched
+archegonial
+archegonium
+archenemy
+archenteron
+archer
+archerfish
+archers
+archery
+arches
+archespore
+archetypal
+archetypally
+archetype
+archetypes
+archetypical
+archetypically
+archfiend
+archfool
+Archibald
+archicarp
+archidiaconal
+archidiaconate
+Archie
+Archie's
+archiepiscopal
+archiepiscopate
+archil
+Archilochian
+archilochus
+archimage
+archimandrite
+Archimedes
+archine
+arching
+archipelagic
+archipelago
+archipelagoes
+archipenko
+archiphoneme
+archiplasm
+architect
+architect's
+architectonic
+architectonically
+architectonics
+architects
+architectural
+architecturally
+architecture
+architecture's
+architectures
+architrave
+archival
+archive
+archived
+archiver
+archivers
+archives
+archiving
+archivist
+archivists
+archivolt
+archly
+archness
+archon
+archoplasm
+archpriest
+archway
+arcing
+arclength
+arclike
+arco
+ARCO
+arcograph
+arcs
+arcsin
+arcsine
+arctan
+arctangent
+arctic
+Arctic
+arctically
+arcticize
+arcticizes
+Arctogaea
+Arcturus
+arcuate
+arcuately
+arcuation
+arcus
+ardeb
+Arden
+Arden's
+ardency
+ardennes
+ardent
+ardently
+ardor
+ardor's
+ardors
+arduous
+arduously
+arduousness
+are
+area
+area's
+areal
+areally
+areas
+areaway
+areawide
+Areca
+areg
+aren't
+arena
+arena's
+arenaceous
+arenas
+arenicolous
+arenite
+areography
+areola
+areolar
+areolate
+areolation
+areole
+Areopagus
+Arequipa
+Ares
+ares
+Arethusa
+aretino
+arezzo
+argal
+argali
+argand
+argent
+argenteuil
+argentic
+argentiferous
+Argentina
+Argentina's
+argentine
+Argentinian
+argentite
+argentous
+argentum
+arger
+Argerich
+argil
+argillaceous
+argilliferous
+argillite
+arginine
+Argive
+Argo
+Argo's
+argol
+argolis
+argon
+argonaut
+argonauts
+Argonne
+argonon
+Argos
+argos
+argosy
+argot
+argovie
+arguable
+arguably
+argue
+argued
+arguer
+arguers
+argues
+argufier
+argufy
+arguing
+argument
+argument's
+argumentation
+argumentative
+argumentatively
+arguments
+argumentum
+Argus
+argyle
+argyll
+Argyrol
+arhat
+aria
+Ariadne
+Arian
+Arianism
+Arianism's
+arianist
+Arianist
+Arianist's
+arianists
+Arianists
+arica
+arid
+aridity
+aridness
+Ariel
+Aries
+arietta
+aright
+aril
+arillode
+arimathea
+ariminum
+ariose
+arioso
+ariosto
+arise
+arisen
+ariser
+arises
+arising
+arisings
+arista
+aristaeus
+aristarchus
+Aristides
+Aristippus
+aristocracy
+aristocrat
+aristocrat's
+aristocratic
+aristocratically
+aristocrats
+aristophanes
+Aristotelean
+Aristotelian
+Aristotelian's
+Aristotle
+Aristotle's
+arithmetic
+arithmetical
+arithmetically
+arithmetician
+arithmetics
+arithmetization
+arithmetization's
+arithmetizations
+arithmetize
+arithmetized
+arithmetizes
+Arius
+Arizona
+Arizona's
+arjuna
+ark
+Arkansan
+Arkansas
+Arkansas's
+Arkhangelsk
+Arkhipova
+arkose
+arkwright
+Arlberg
+Arlen
+Arlene
+arles
+Arlington
+arlon
+arm
+arm's
+armada
+armadillo
+armadillos
+Armageddon
+Armageddon's
+armagh
+armagnac
+armament
+armament's
+armamentarium
+armaments
+Armata
+armature
+armatures
+armband
+armchair
+armchair's
+armchairs
+Armco
+armed
+Armenia
+Armenian
+Armenian's
+armentieres
+armer
+armers
+armes
+armet
+armful
+armfuls
+armhole
+armies
+armiger
+armillaria
+armillary
+arming
+Arminian
+arminius
+armipotent
+armistice
+armless
+armlet
+armlike
+armload
+armoire
+Armonk
+armor
+armor's
+armored
+armorer
+armorer's
+armorers
+armorial
+armorially
+armorica
+armoried
+armories
+armoring
+armorist
+armorist's
+armorists
+armorless
+armors
+armory
+armory's
+Armour
+Armour's
+armpit
+armpit's
+armpits
+armrest
+arms
+armsful
+Armstrong
+Armstrong's
+armure
+army
+army's
+arne
+arnhem
+arnica
+arnim
+arno
+Arnold
+Arnold's
+aroid
+aroint
+aroma
+aromas
+aromatic
+aromatically
+aromaticity
+aromaticness
+aromatization
+aromatize
+aromatized
+aromatizes
+aromatizing
+arose
+around
+arousal
+arouse
+aroused
+arouses
+arousing
+arp
+ARPA
+Arpanet
+arpanet
+arpeggio
+arpeggio's
+arpeggios
+arpent
+arquebus
+arrack
+Arragon
+arraign
+arraigned
+arraigning
+arraignment
+arraignment's
+arraignments
+arraigns
+arran
+arrange
+arrangeable
+arranged
+arrangement
+arrangement's
+arrangements
+arranger
+arrangers
+arranges
+arranging
+arrant
+arrantly
+arras
+Arrau
+array
+arrayed
+arrayer
+arraying
+arrays
+arrear
+arrearage
+arrears
+arrest
+arrestable
+arrestant
+arrested
+arrestee
+arrestee's
+arrestees
+arrester
+arresters
+arresting
+arrestingly
+arrestment
+arrestor
+arrestor's
+arrestors
+arrests
+arretium
+Arrhenius
+arrhythmia
+arrhythmic
+arrhythmical
+arrhythmically
+arris
+arrises
+arrival
+arrival's
+arrivals
+arrive
+arrived
+arriver
+arrives
+arriving
+arrivisme
+arriviste
+arroba
+arrogance
+arrogant
+arrogantly
+arrogate
+arrogated
+arrogates
+arrogating
+arrogation
+arrondissement
+arrow
+arrowed
+arrowhead
+arrowhead's
+arrowheads
+arrowing
+arrowroot
+arrows
+arrowwood
+arrowworm
+arrowy
+Arroyo
+arroyo
+arroyos
+arru
+arse
+arsenal
+arsenal's
+arsenals
+arsenate
+arsenic
+arsenical
+arsenicize
+arsenicizes
+arsenide
+arsenious
+arsenite
+arsenopyrite
+arsine
+arsines
+arsis
+arson
+arsonist
+arsonous
+arsphenamine
+art
+art's
+artaud
+artaxerxes
+arte
+artefact
+artefacts
+Artemia
+Artemis
+artemisia
+arterial
+arterialization
+arterialization's
+arterializations
+arterialize
+arterialized
+arterializes
+arterializing
+arterially
+arteries
+arteriogram
+arteriogram's
+arteriograms
+arteriographic
+arteriography
+arteriolar
+arteriole
+arteriole's
+arterioles
+arteriolosclerosis
+arteriosclerosis
+arteriovenous
+arteritis
+artery
+artery's
+artesian
+artful
+artfully
+artfulness
+arthralgia
+arthritic
+arthritically
+arthritis
+arthrogram
+arthrogram's
+arthrograms
+arthromere
+arthropathy
+arthropod
+arthropod's
+arthropods
+arthrosis
+arthrospore
+arthrosporic
+Arthur
+Arthurian
+artic
+artichoke
+artichoke's
+artichokes
+article
+article's
+articled
+articles
+articling
+articulable
+articular
+articulate
+articulated
+articulately
+articulateness
+articulates
+articulating
+articulation
+articulations
+articulative
+articulator
+articulators
+articulatory
+Artie
+Artie's
+artier
+artifact
+artifact's
+artifacts
+artifical
+artifically
+artifice
+artificer
+artifices
+artificial
+artificialities
+artificiality
+artificialize
+artificializes
+artificially
+artificialness
+artilleries
+artillerist
+artillery
+artilleryman
+artily
+artiness
+artiodactyl
+artisan
+artisan's
+artisans
+artist
+artist's
+artiste
+artistic
+artistical
+artistically
+artistry
+artists
+artless
+artlessly
+artmobile
+artois
+arts
+Arturo
+Arturo's
+artwork
+arty
+Aruba
+arum
+arunachal
+arundel
+arundinaceous
+aruspex
+aruwimi
+arvo
+Aryan
+Aryan's
+Aryanization
+Aryanize
+Aryanized
+Aryanizes
+Aryanizing
+Aryans
+aryl
+arytenoid
+as
+asafetida
+asantehene
+asap
+ASAP
+asarabacca
+Asarum
+asben
+asbestos
+asbestosis
+asbestus
+Ascanius
+ascariasis
+ascarid
+ascend
+ascendable
+ascendance
+ascendancy
+ascendant
+ascendantly
+ascended
+ascendence
+ascendency
+ascendent
+ascender
+ascenders
+ascendible
+ascending
+ascends
+ascension
+ascensional
+ascensions
+Ascensiontide
+ascensive
+ascent
+ascertain
+ascertainable
+ascertained
+ascertaining
+ascertainment
+ascertains
+ascesis
+ascetic
+ascetic's
+ascetical
+ascetically
+asceticism
+ascetics
+asch
+Aschaffenburg
+Ascham
+asci
+ascidian
+ascidium
+ASCII
+ascites
+ascitic
+asclepiadaceous
+Asclepiadean
+Asclepius
+ascocarp
+ascogonium
+ascoli
+ascomycete
+ascomycetes
+ascorbate
+ascorbic
+ascospore
+ascosporic
+ascosporous
+ascot
+ascribable
+ascribe
+ascribed
+ascribes
+ascribing
+ascription
+ascriptive
+ascus
+asdic
+aseity
+asepalous
+asepsis
+aseptic
+aseptically
+asepticize
+asepticizes
+asexual
+asexually
+asgard
+ash
+ashame
+ashamed
+ashamedly
+Ashanti
+ashcan
+ashcans
+ashcroft
+ashe
+ashen
+asher
+ashes
+ashet
+Asheville
+Ashford
+ashier
+Ashkenazi
+Ashkenazy
+ashkey
+Ashkhabad
+Ashland
+ashlar
+ashlared
+ashlaring
+ashlars
+ashless
+Ashley
+ashman
+ashmen
+Ashmolean
+Ashmore
+ashore
+ashplant
+ashram
+Ashton
+ashtoreth
+ashtray
+ashtray's
+ashtrays
+Ashur
+ashurbanipal
+ashy
+Asia
+Asia's
+Asian
+Asian's
+Asians
+Asiatic
+Asiatic's
+Asiaticization
+Asiaticization's
+Asiaticizations
+Asiaticize
+Asiaticizes
+Asiatics
+aside
+asides
+Asilomar
+Asilomar's
+Asimov
+asinine
+asininely
+asininity
+asir
+ask
+askance
+askant
+askari
+asked
+asker
+askers
+askesis
+askew
+askewness
+asking
+askja
+asks
+aslant
+asleep
+aslef
+aslope
+asmara
+asmodeus
+aso
+asocial
+asoka
+asp
+asparagine
+asparagus
+aspartate
+aspartic
+aspartokinase
+Aspasia
+aspect
+aspect's
+aspects
+aspectual
+aspen
+aspencade
+aspencades
+asper
+asperges
+aspergillosis
+aspergillus
+asperity
+asperse
+aspersed
+aspersing
+aspersion
+aspersion's
+aspersions
+asphalt
+asphalted
+asphaltic
+asphaltite
+asphaltum
+aspheric
+aspherical
+asphodel
+asphyxia
+asphyxiant
+asphyxiants
+asphyxiate
+asphyxiation
+asphyxiator
+aspiate
+aspic
+aspidistra
+aspinwall
+aspirant
+aspirant's
+aspirants
+aspirate
+aspirated
+aspirates
+aspirating
+aspiration
+aspiration's
+aspirations
+aspirator
+aspirators
+aspire
+aspired
+aspirer
+aspires
+aspirin
+aspiring
+aspirins
+asplenium
+asquint
+asquith
+ass
+ass's
+assad
+Assad
+assagai
+assai
+assail
+assailable
+assailant
+assailant's
+assailants
+assailed
+assailing
+assails
+Assam
+Assamese
+assassin
+assassin's
+assassinate
+assassinated
+assassinates
+assassinating
+assassination
+assassinations
+assassinator
+assassins
+assault
+assaulted
+assaulter
+assaulting
+assaultive
+assaultively
+assaultiveness
+assaults
+assay
+assayed
+assayer
+assayers
+assaying
+assegai
+assemblage
+assemblage's
+assemblages
+assemblagist
+assemble
+assembled
+assembler
+assemblers
+assembles
+assemblies
+assembling
+assembly
+assembly's
+assemblyman
+assemblywoman
+assen
+assent
+assentation
+assented
+assenter
+assentient
+assenting
+assentor
+assents
+assert
+asserted
+asserter
+asserters
+asserting
+assertion
+assertion's
+assertional
+assertions
+assertive
+assertively
+assertiveness
+asserts
+asses
+assess
+assessable
+assessed
+assesses
+assessing
+assessment
+assessment's
+assessments
+assessor
+assessor's
+assessors
+asset
+asset's
+assets
+asseverate
+asseveration
+asseverative
+asshole
+asshole's
+assholes
+asshur
+assibilate
+assiduity
+assiduous
+assiduously
+assiduousness
+assign
+assignability
+assignable
+assignat
+assignation
+assignational
+assignations
+assigned
+assignee
+assignee's
+assignees
+assigner
+assigners
+assigning
+assignment
+assignment's
+assignments
+assignor
+assigns
+assimilability
+assimilable
+assimilate
+assimilated
+assimilates
+assimilating
+assimilation
+assimilationism
+assimilationist
+assimilations
+assimilative
+assimilator
+assimilatory
+assiniboine
+Assisi
+assist
+assistance
+assistances
+assistant
+assistant's
+assistants
+assistantship
+assistantships
+assisted
+assistents
+assister
+assisting
+assists
+assiut
+assize
+assizer
+assizers
+assizes
+assn
+associable
+associate
+associated
+associates
+associateship
+associating
+association
+association's
+associational
+associationism
+associations
+associative
+associatively
+associativities
+associativity
+associator
+associator's
+associators
+assoil
+assoilment
+assonance
+assonant
+assort
+assortative
+assorted
+assorter
+assorting
+assortment
+assortment's
+assortments
+assorts
+assuage
+assuaged
+assuagement
+assuages
+assuaging
+assuan
+assuasive
+assumability
+assumable
+assumably
+assume
+assumed
+assumer
+assumes
+assuming
+assumpsit
+assumption
+assumption's
+assumptions
+assumptive
+assurance
+assurance's
+assurances
+assurbanipal
+assure
+assured
+assuredly
+assuredness
+assurer
+assurers
+assures
+assurgent
+assuring
+assuringly
+assuror
+Assyria
+Assyrian
+Assyrian's
+Assyrianize
+Assyrianizes
+Assyriology
+Assyriology's
+astable
+astaire
+Astaire
+astaires
+Astaires
+astarboard
+Astarte
+astatic
+astatically
+astaticism
+astatine
+aster
+aster's
+asteria
+asteriated
+asterisk
+asterisk's
+asteriskless
+asterisks
+asterism
+asterisms
+astern
+asternal
+asteroid
+asteroid's
+asteroidal
+asteroids
+asters
+asthenia
+asthenic
+asthenosphere
+asthma
+asthmatic
+asthmatically
+asti
+astigmat
+astigmatic
+astigmatically
+astigmatism
+astigmatizer
+astigmatizer's
+astigmatizers
+Astilbe
+astir
+ASTM
+astolat
+astomatous
+Aston
+Aston's
+astonied
+astonish
+astonished
+astonishes
+astonishing
+astonishingly
+astonishment
+Astor
+Astoria
+astound
+astounded
+astounding
+astoundingly
+astounds
+astrachan
+astraddle
+astragal
+astragalus
+astrakhan
+astral
+astrally
+astraphobia
+astray
+astrict
+astride
+astringency
+astringent
+astringently
+astrobiological
+astrobiologist
+astrobiology
+astrobotany
+astrocompass
+astrocyte
+astrocytic
+astrocytoma
+astrodome
+astrodynamics
+astrogeology
+astroid
+astrol
+astrolabe
+astrologer
+astrologer's
+astrologers
+astrological
+astrologically
+astrology
+astrometry
+astron
+astronaut
+astronaut's
+astronautic
+astronautical
+astronautically
+astronautics
+astronauts
+astronavigation
+astronomer
+astronomer's
+astronomers
+astronomic
+astronomical
+astronomically
+astronomy
+astrophotography
+astrophysical
+astrophysicist
+astrophysicist's
+astrophysicists
+astrophysics
+astrosphere
+asturias
+astute
+astutely
+astuteness
+astyanax
+Asuncion
+asunder
+asur
+aswan
+aswarm
+aswirl
+aswoon
+asyllabic
+asylum
+asylums
+asymmetric
+asymmetrical
+asymmetrically
+asymmetries
+asymmetry
+asymptomatic
+asymptomatically
+asymptote
+asymptote's
+asymptotes
+asymptotic
+asymptotical
+asymptotically
+asymptoticly
+asynapsis
+async
+asynchronism
+asynchronize
+asynchronized
+asynchronizes
+asynchronizing
+asynchronous
+asynchronously
+asynchrony
+asyndetic
+asyndetically
+asyndeton
+asyut
+at
+atacama
+atactic
+ataghan
+atahualpa
+ataman
+ataractic
+ataraxic
+Atari
+atari
+atavism
+atavist
+atavistic
+atavistically
+ataxia
+ataxic
+atbara
+Atchison
+Atchison's
+ate
+atelectasis
+atelier
+atemporal
+Aten
+Athabascan
+athabaska
+athamas
+Athanasian
+athanasius
+atheism
+atheist
+atheist's
+atheistic
+atheistical
+atheistically
+atheists
+athelstan
+athematic
+Athena
+Athena's
+athenaeum
+atheneum
+Athenian
+Athenian's
+Athenians
+Athens
+athermanous
+atheroma
+atherosclerosis
+Atherton
+athirst
+athlete
+athlete's
+athletes
+athletic
+athletically
+athleticism
+athletics
+athodyd
+athos
+athwart
+athwartship
+athwartships
+atilt
+atinate
+atingle
+Atkins
+Atkinson
+Atlanta
+Atlantean
+atlantes
+Atlantic
+Atlantic's
+Atlantica
+Atlantis
+Atlantov
+atlas
+atli
+ATM's
+atman
+atment
+atmolysis
+atmometer
+atmometer's
+atmometers
+atmosphere
+atmosphere's
+atmosphered
+atmospheres
+atmospheric
+atmospherically
+atmospherics
+atmospherium
+atoll
+atoll's
+atolls
+atom
+atom's
+atomic
+atomically
+atomicity
+atomics
+atomism
+atomist
+atomistic
+atomistically
+atomistics
+atomizability
+atomizable
+atomization
+atomization's
+atomizations
+atomize
+atomized
+atomizer
+atomizers
+atomizes
+atomizing
+atoms
+atomy
+atonal
+atonalism
+atonalist
+atonalistic
+atonality
+atonally
+atone
+atoned
+atonement
+atones
+atonic
+atonicity
+atoning
+atony
+atop
+atopic
+atopy
+atrabilious
+atremble
+atresia
+Atreus
+atrial
+atrioventricular
+atrip
+atrium
+atriums
+atrocious
+atrociously
+atrociousness
+atrocities
+atrocity
+atrocity's
+atrophic
+atrophied
+atrophies
+atrophy
+atrophying
+atropine
+Atropos
+attaboy
+attach
+attachable
+attache
+attached
+attacher
+attachers
+attaches
+attaching
+attachment
+attachment's
+attachments
+attack
+attackable
+attacked
+attacker
+attacker's
+attackers
+attacking
+attackman
+attacks
+attain
+attainability
+attainable
+attainableness
+attainably
+attainder
+attained
+attainer
+attainers
+attaining
+attainment
+attainment's
+attainments
+attains
+attaint
+attar
+attedance
+attemper
+attempt
+attemptable
+attempted
+attempter
+attempters
+attempting
+attempts
+Attenborough
+attend
+attendance
+attendance's
+attendances
+attendant
+attendant's
+attendants
+attended
+attendee
+attendee's
+attendees
+attender
+attenders
+attending
+attends
+attention
+attention's
+attentional
+attentionality
+attentions
+attentive
+attentively
+attentiveness
+attenuant
+attenuate
+attenuated
+attenuates
+attenuating
+attenuation
+attenuator
+attenuator's
+attenuators
+attercliffe
+attest
+attestation
+attested
+attester
+attesting
+attests
+attic
+attic's
+Attica
+atticism
+atticize
+atticizes
+attics
+Attila
+attire
+attired
+attires
+attiring
+attis
+attitude
+attitude's
+attitudes
+attitudinal
+attitudinally
+attitudinization
+attitudinize
+attitudinized
+attitudinizes
+attitudinizing
+Attlee
+attlee
+attorn
+attorney
+attorney's
+attorneys
+attorneyship
+attornment
+attract
+attractable
+attractant
+attracted
+attracting
+attraction
+attraction's
+attractions
+attractive
+attractively
+attractiveness
+attractivity
+attractor
+attractor's
+attractors
+attracts
+attributable
+attribute
+attributed
+attributer
+attributes
+attributing
+attribution
+attributional
+attributions
+attributive
+attributively
+attrited
+attrition
+attritional
+attu
+attune
+attuned
+attunement
+attunes
+attuning
+atune
+Atwater
+Atwater's
+atween
+atwitter
+Atwood
+Atwood's
+atypic
+atypical
+atypicality
+atypically
+aubade
+aube
+Auberge
+Auberge's
+Aubergine
+Aubervilliers
+Aubrey
+Aubrey's
+Aubrietia
+auburn
+Aubusson
+Auckland
+Auckland's
+auction
+auctioned
+auctioneer
+auctioneer's
+auctioneers
+auctioning
+auctorial
+aud
+audacious
+audaciously
+audaciousness
+audacity
+aude
+auden
+audibility
+audible
+audibly
+audience
+audience's
+audiences
+audient
+audile
+auding
+audio
+audiofrequencies
+audiofrequency
+audiogenic
+audiogram
+audiogram's
+audiograms
+audiological
+audiologist
+audiologist's
+audiologists
+audiology
+audiometer
+audiometer's
+audiometers
+audiometric
+audiometry
+audiophile
+audiotape
+audiotypist
+audiovisual
+audiovisuals
+audiphone
+audit
+auditable
+audited
+auditing
+audition
+audition's
+auditioned
+auditioning
+auditions
+auditive
+auditor
+auditor's
+auditorium
+auditoriums
+auditors
+auditory
+audits
+audivi
+Audrey
+Audrey's
+Audubon
+Audubon's
+auer
+Auerbach
+Auerbach's
+Aug
+Augean
+augend
+Auger
+auger
+auger's
+augers
+aught
+augite
+augitic
+augment
+augmentable
+augmentation
+augmentations
+augmentative
+augmented
+augmenter
+augmenting
+augmentor
+augments
+Augsburg
+augur
+augurs
+augury
+august
+Augusta
+Augusta's
+Augustan
+Augustine
+Augustinian
+augustly
+augustness
+Augusts
+Augustus
+auk
+auklet
+auld
+aulic
+aulis
+aunt
+aunt's
+aunthood
+auntie
+auntlike
+auntly
+aunts
+aura
+aura's
+aural
+aurally
+aurangzeb
+aurar
+auras
+aureate
+aurelian
+Aurelius
+aureola
+aureole
+aureomycin
+aureus
+auric
+auricle
+auricula
+auricular
+auriculate
+auriferous
+Auriga
+Aurignacian
+auriol
+aurist
+aurochs
+aurora
+aurorae
+auroral
+aurorean
+aurous
+aurum
+Auschwitz
+auscultate
+auscultated
+auscultates
+auscultating
+auscultation
+auscultations
+auscultatory
+ausforming
+auslander
+ausonius
+auspicate
+auspice
+auspices
+auspicious
+auspiciously
+auspiciousness
+Aussie
+austen
+austenite
+austenitic
+Auster
+austere
+austerely
+austereness
+austerity
+Austerlitz
+Austin
+Austin's
+austral
+Australasia
+Australia
+Australia's
+Australian
+Australian's
+Australiana
+Australianism
+Australianize
+Australianizes
+Australians
+Australis
+australite
+australites
+Australoid
+australopithecine
+Australorp
+Austrasia
+Austria
+Austria's
+Austrian
+Austrian's
+Austrianize
+Austrianizes
+Austronesia
+Austronesian
+autacoid
+autarchy
+autarky
+autecious
+autecology
+auteur
+authentic
+authentically
+authenticate
+authenticated
+authenticates
+authenticating
+authentication
+authentications
+authenticator
+authenticators
+authenticity
+author
+author's
+authored
+authoress
+authorial
+authoring
+authoritarian
+authoritarianism
+authoritative
+authoritatively
+authoritativeness
+authorities
+authority
+authority's
+authorization
+authorization's
+authorizations
+authorize
+authorized
+authorizer
+authorizers
+authorizes
+authorizing
+authors
+authorship
+autism
+autistic
+auto
+auto's
+autoantibody
+autobahn
+autobiographer
+autobiographic
+autobiographical
+autobiographically
+autobiographies
+autobiography
+autobiography's
+autobus
+autocade
+autocatalysis
+autocatalytic
+autocephalous
+autochanger
+autochthon
+autochthonous
+autoclave
+autoclaved
+autocode
+autocoder
+autocollimator
+autocorrelate
+autocorrelated
+autocorrelates
+autocorrelating
+autocorrelation
+autocorrelations
+autocracies
+autocracy
+autocrat
+autocrat's
+autocratic
+autocratical
+autocratically
+autocrats
+autocross
+autocue
+autocueing
+autocycle
+autodial
+autodialer
+autodidact
+autodidactic
+autodyne
+autoecious
+autoeciously
+autoecism
+autoerotic
+autoerotically
+autoeroticism
+autoerotism
+autofluorescence
+autogamous
+autogamy
+autogenesis
+autogenetic
+autogenetically
+autogenic
+autogenous
+autogenously
+autogiro
+autograft
+autograph
+autographed
+autographic
+autographically
+autographing
+autographs
+autography
+autogyro
+Autoharp
+autohypnosis
+autohypnotic
+autoicous
+autoimmune
+autoimmunity
+autoimmunization
+autoinfection
+autoinoculation
+autointoxication
+autoionization
+autokinetic
+autoload
+autoloaded
+autoloader
+autoloading
+autoloads
+autologous
+autolycus
+autolysate
+autolyse
+autolysin
+autolysis
+autolytic
+automaker
+automanipulation
+automanipulative
+automat
+automata
+automatable
+automate
+automated
+automates
+automatic
+automatically
+automaticity
+automatics
+automating
+automation
+automatism
+automatist
+automatization
+automatization's
+automatizations
+automatize
+automatizes
+automaton
+automatons
+automobil
+automobile
+automobile's
+automobiles
+automobilist
+automorphic
+automorphism
+automotive
+autonavigator
+autonavigator's
+autonavigators
+autonomic
+autonomically
+autonomist
+autonomous
+autonomously
+autonomy
+autoparagraph
+autophyte
+autophytic
+autophytically
+autopilot
+autopilot's
+autopilots
+autopista
+autoplastic
+autoplastically
+autoplasty
+autopsied
+autopsies
+autopsy
+autoput
+autoradiogram
+autoradiogram's
+autoradiograms
+autoradiograph
+autoradiographic
+autoradiographs
+autoradiography
+autoregressive
+autorepeat
+autorepeating
+autorepeats
+autorotate
+autorotation
+autorotational
+autoroute
+autos
+autosexing
+autosomal
+autosomally
+autosome
+autostability
+autostart
+autostrada
+autosuggest
+autosuggestibility
+autosuggestible
+autosuggestion
+autotable
+autotelic
+autotetraploid
+autotetraploidy
+autotimer
+autotomic
+autotomize
+autotomous
+autotomy
+autotoxaemia
+autotoxin
+autotransformer
+autotransplant
+autotransplantation
+autotroph
+autotrophic
+autotrophically
+autotrophy
+autotype
+autoxidation
+autumn
+autumn's
+autumnal
+autumnally
+autumns
+autunite
+auvergne
+aux
+auxanometer
+auxesis
+auxetic
+auxetically
+auxil
+auxiliaries
+auxiliary
+auxin
+auxinic
+auxinically
+auxochrome
+auxotroph
+auxotrophic
+auxotrophy
+avadavat
+avagadro
+avail
+availabilities
+availability
+available
+availableness
+availably
+availed
+availer
+availers
+availing
+avails
+avalanche
+avalanched
+avalanches
+avalanching
+avaliable
+avalon
+avant
+Avar
+avarice
+avaricious
+avariciously
+avariciousness
+avast
+avatar
+avaunt
+Ave
+avebury
+avec
+aveiro
+avellan
+avellane
+avellaneda
+avenge
+avenged
+avenger
+avenges
+avenging
+avens
+aventail
+aventine
+Aventine
+aventino
+Aventino
+aventurine
+avenue
+avenue's
+avenues
+aver
+average
+averaged
+averagely
+averageness
+averages
+averaging
+averment
+averno
+Avernus
+averred
+averrer
+averring
+Averroism
+avers
+averse
+aversely
+averseness
+aversion
+aversion's
+aversions
+aversive
+avert
+averted
+averting
+averts
+Avery
+Avery's
+avesta
+Avestan
+aveyron
+avian
+avianize
+aviaries
+aviarist
+aviary
+aviate
+aviation
+aviations
+aviator
+aviator's
+aviators
+aviatress
+aviatrix
+avicenna
+aviculture
+aviculturist
+avid
+avidin
+avidity
+avidly
+avidness
+aviemore
+avifauna
+avifaunal
+avifaunally
+avifaunistic
+avigation
+avignon
+Avignon
+avionic
+avionics
+avirulent
+Avis
+avitaminosis
+avitaminotic
+Aviv
+avizandum
+avlona
+avocado
+avocados
+avocate
+avocation
+avocation's
+avocational
+avocationally
+avocations
+avocet
+Avogadro
+avoid
+avoidable
+avoidably
+avoidance
+avoided
+avoider
+avoiders
+avoiding
+avoids
+avoirdupois
+Avon
+avouch
+avouchment
+avow
+avowal
+avowed
+avowedly
+avower
+avows
+avulse
+avulsing
+avulsion
+avuncular
+avunculate
+await
+awaited
+awaiting
+awaits
+awake
+awaked
+awaken
+awakened
+awakener
+awakening
+awakens
+awakes
+awaking
+award
+awardable
+awarded
+awardee
+awarder
+awarders
+awarding
+awards
+aware
+awareness
+awash
+away
+awayness
+awe
+aweary
+aweather
+awed
+aweigh
+aweless
+awesome
+awesomely
+awesomeness
+awestricken
+awestruck
+awful
+awfully
+awfulness
+awheel
+awhile
+awhiles
+awhirl
+awing
+awkward
+awkwardly
+awkwardness
+awl
+awl's
+awless
+awls
+awlwort
+awn
+awning
+awning's
+awninged
+awnings
+awnless
+awoke
+awoken
+awry
+ax
+axal
+axe
+axed
+axel
+axenic
+axenically
+axer
+axers
+axes
+axial
+axiality
+axially
+axil
+axile
+axilla
+axillar
+axillary
+axing
+axiological
+axiologically
+axiology
+axiom
+axiom's
+axiomatic
+axiomatically
+axiomatics
+axiomatization
+axiomatization's
+axiomatizations
+axiomatize
+axiomatized
+axiomatizes
+axiomatizing
+axioms
+axion
+axion's
+axions
+axis
+axisymmetric
+axisymmetrical
+axisymmetrically
+axisymmetry
+axle
+axle's
+axles
+axletree
+axman
+Axminster
+axolotl
+axolotl's
+axolotls
+axon
+axon's
+axons
+axseed
+axum
+ayacucho
+ayah
+ayahuasca
+aycliffe
+aydin
+aye
+ayer
+ayers
+ayes
+ayesha
+ayin
+Aylesbury
+Aymara
+ayr
+Ayrshire
+ayub
+ayurveda
+ayutthaya
+AZ
+azalea
+azalea's
+azaleas
+azan
+azathioprine
+azazel
+azbine
+azeotropic
+Azerbaijan
+Azerbaijan's
+Azerbaijani
+azide
+azido
+azikiwe
+Azilian
+azimuth
+azimuth's
+azimuthal
+azimuthally
+azimuths
+azine
+aznavour
+azo
+azobenzene
+azoic
+azole
+azonal
+Azores
+azote
+azotemia
+azoth
+azotic
+azotization
+azotize
+azotized
+azotizes
+azotizing
+Azotobacter
+Azov
+Azrael
+Aztec
+Aztecan
+azure
+azurite
+azusa
+baa
+Baal
+Baalbek
+baas
+Baaskap
+Bab
+baba
+babar
+babassu
+babbage
+babbitt
+babbitted
+babbitting
+babbitts
+babble
+babbled
+babblement
+babbler
+babbles
+babbling
+Babcock
+babe
+babe's
+Babel
+Babel's
+Babelize
+Babelizes
+babes
+babeuf
+Babi
+babiche
+babied
+babies
+babirusa
+Babism
+baboon
+baboonish
+babu
+babul
+babur
+babushka
+baby
+baby's
+babyhood
+babying
+babyish
+Babylon
+babylonia
+Babylonian
+Babylonians
+Babylonize
+Babylonizes
+babysat
+babysit
+babysits
+babysitter
+babysitters
+babysitting
+baccalaureate
+baccarat
+baccate
+Bacchae
+bacchanal
+bacchanalia
+bacchanalian
+bacchant
+bacchante
+bacchantes
+bacchantic
+bacchic
+bacchius
+Bacchus
+bacciferous
+bacciform
+baccivorous
+baccy
+Bach
+Bach's
+Bacharach
+bachelor
+bachelor's
+bachelorhood
+bachelorize
+bachelorizes
+bachelors
+baci
+bacillar
+bacillary
+bacilli
+bacillus
+bacitracin
+back
+backache
+backache's
+backaches
+backarrow
+backbench
+backbencher
+backbenchers
+backbite
+backbiter
+backblocks
+backboard
+backbone
+backbone's
+backbones
+backbreaker
+backbreaking
+backchaining
+backchat
+backcloth
+backcomb
+backcountry
+backcourt
+backcourtman
+backcross
+backdate
+backdated
+backdates
+backdating
+backdrop
+backdrop's
+backdrops
+backed
+backend
+backends
+backer
+backers
+backfield
+backfill
+backfilled
+backfilling
+backfills
+backfire
+backfired
+backfires
+backfiring
+backgammon
+backgammon's
+background
+background's
+backgrounds
+backhand
+backhanded
+backhandedly
+backhander
+backhaus
+backhoe
+backhouse
+backing
+backlash
+backlasher
+backless
+backlog
+backlog's
+backlogs
+backmost
+backorder
+backpack
+backpack's
+backpacker
+backpackers
+backpacks
+backpedal
+backplane
+backplane's
+backplanes
+backplate
+backplates
+backrest
+backs
+backsaw
+backscatter
+backscattered
+backscattering
+backscatters
+backscratcher
+backseat
+backset
+backsheesh
+backside
+backslap
+backslapper
+backslash
+backslashed
+backslashes
+backslashing
+backslide
+backslider
+backspace
+backspaced
+backspaces
+backspacing
+backspin
+backstabber
+backstabbing
+backstage
+backstairs
+backstay
+backstitch
+backstitched
+backstitches
+backstitching
+backstop
+backstreet
+backstretch
+backstroke
+backswept
+backswing
+backsword
+backtrack
+backtracked
+backtracker
+backtrackers
+backtracking
+backtracks
+backup
+backups
+backus
+backward
+backwardation
+backwardly
+backwardness
+backwards
+backwash
+backwater
+backwater's
+backwaters
+backwood
+backwoods
+backwoodsman
+backyard
+backyard's
+backyards
+baclava
+bacolod
+bacon
+baconer
+baconize
+baconizes
+Bacquier
+bacteraemia
+bacteria
+bacterial
+bacterially
+bactericidal
+bactericidally
+bactericide
+bacterin
+bacteriological
+bacteriology
+bacteriolysis
+bacteriophage
+bacteriostasis
+bacterium
+bacterize
+bacteroid
+bactria
+Bactrian
+baculiform
+baculum
+bad
+badajoz
+badalona
+badderlocks
+baddie
+bade
+baden
+Baden
+Baden's
+badge
+badged
+badger
+badger's
+badgered
+badgering
+badgers
+badges
+badging
+badinage
+badland
+badlands
+badly
+badman
+badmen
+badminton
+badness
+badoglio
+bads
+baeda
+Baedeker
+bael
+baeyer
+baez
+Baffin
+baffle
+baffled
+bafflement
+baffler
+bafflers
+baffles
+baffling
+bafflingly
+bag
+bag's
+Baganda
+bagasse
+bagatelle
+bagatelle's
+bagatelles
+Bagdad
+bagehot
+bagel
+bagel's
+bagels
+bagful
+baggage
+baggageman
+baggagemen
+bagged
+bagger
+bagger's
+baggers
+baggier
+baggies
+baggily
+bagginess
+bagging
+baggy
+bagh
+Baghdad
+baghlan
+bagie
+bagley
+bagman
+bagnio
+bagpipe
+bagpipe's
+bagpiper
+bagpipes
+Bagrodia
+Bagrodia's
+Bagrodias
+bags
+baguette
+baguio
+bagwash
+bagwig
+bagworm
+bah
+bahadur
+Bahai
+Bahaism
+Bahama
+Bahamas
+bahasa
+bahia
+Bahrain
+Bahrein
+Bahrein's
+baht
+bahuvrihi
+baikal
+bail
+bailable
+baile
+bailee
+baileefe
+bailer
+Bailey
+Baileys
+bailie
+bailiff
+bailiff's
+bailiffs
+bailiffship
+bailing
+bailiwick
+bailly
+bailment
+bailor
+bailsman
+baines
+bainite
+Bairam
+Baird
+Baird's
+bairn
+bairnsfather
+bait
+baited
+baiter
+baiting
+baits
+baize
+Baja
+baja
+bajan
+bake
+bakeapple
+baked
+bakehouse
+Bakelite
+Baker
+baker
+bakeries
+bakers
+Bakersfield
+bakery
+bakery's
+bakes
+bakeshop
+bakewell
+Bakhtiari
+baking
+bakings
+baklava
+bakra
+baksheesh
+bakst
+Baku
+bakunin
+Bala
+Balaam
+balaclava
+Balakirev
+Balaklava
+balalaika
+balalaika's
+balalaikas
+balance
+balanced
+balancedness
+balancer
+balancers
+balances
+balanchine
+balancing
+balas
+balata
+Balaton
+balbo
+Balboa
+balbriggan
+balconied
+balconies
+balcony
+balcony's
+bald
+balder
+balderdash
+baldhead
+baldheaded
+balding
+baldish
+baldly
+baldmoney
+baldness
+baldpate
+baldric
+Baldwin
+baldy
+bale
+Balearic
+baled
+baleen
+balefire
+baleful
+balefully
+balefulness
+balenciaga
+baler
+balers
+bales
+Balfour
+Bali
+balibuntal
+balikpapan
+Balinese
+baling
+baliol
+balk
+Balkan
+Balkan's
+balkanization
+Balkanization
+Balkanization's
+Balkanizations
+balkanize
+Balkanize
+balkanized
+Balkanizes
+balkanizing
+Balkans
+balked
+balker
+balkh
+balkhash
+balkier
+balkiness
+balking
+Balkis
+balkline
+balks
+balky
+ball
+ballad
+ballad's
+ballade
+balladeer
+balladic
+balladist
+balladize
+balladizes
+balladmonger
+balladry
+ballads
+ballance
+ballarat
+Ballard
+Ballards
+ballast
+ballast's
+ballasts
+ballcarrier
+balled
+baller
+ballerina
+ballerina's
+ballerinas
+ballers
+ballet
+ballet's
+balletic
+balletomane
+balletomania
+ballets
+ballfield
+ballfield's
+ballfields
+ballflower
+ballgown
+ballgown's
+balling
+balliol
+ballista
+ballistic
+ballistically
+ballistics
+ballocks
+ballonet
+balloon
+ballooned
+ballooner
+ballooners
+ballooning
+balloonist
+balloons
+ballot
+ballot's
+balloted
+balloter
+balloting
+ballots
+ballottement
+ballplayer
+ballplayer's
+ballplayers
+ballroom
+ballroom's
+ballrooms
+balls
+ballyhoo
+ballyhooey
+balm
+balm's
+Balmacaan
+balmain
+balmier
+balmily
+balminess
+Balmoral
+balms
+balmung
+balmy
+balneal
+balneology
+baloney
+balpa
+balsa
+balsam
+balsamic
+balsamiferous
+balsaminaceous
+balsamize
+balsamizes
+balsams
+Balt
+Balthazar
+Baltic
+Baltic's
+Baltimore
+Baltimorean
+Baltsa
+Baluchi
+Baluchistan
+baluster
+balustrade
+balustrade's
+balustrades
+Balzac
+bam
+Bamako
+Bambara
+Bamberg
+Bamberger
+Bambi
+bambino
+bamboo
+bamboos
+bamboozle
+bamboozled
+bamboozlement
+bamboozles
+bamboozling
+ban
+ban's
+Banach
+banal
+banality
+banally
+banana
+banana's
+bananas
+banaras
+banat
+banausic
+Banbury
+Banbury's
+banc
+Bancroft
+bancroft
+band
+Banda
+bandage
+bandaged
+bandager
+bandages
+bandaging
+bandaid
+bandana
+bandanna
+bandaranaike
+bandbox
+bandeau
+bandeaux
+banded
+bander
+banderilla
+banderillero
+bandgap
+bandh
+bandicoot
+bandied
+bandies
+banding
+bandit
+bandit's
+banditry
+bandits
+banditti
+bandjarmasin
+bandleader
+bandmaster
+bandobust
+bandoleer
+bandoleers
+bandolier
+bandoline
+bandore
+bandpass
+bands
+bandsaw
+bandsman
+bandspreading
+bandstand
+bandstand's
+bandstands
+bandstop
+bandung
+bandwagon
+bandwagon's
+bandwagons
+bandwidth
+bandwidths
+bandy
+bandying
+bane
+baneberry
+baneful
+banefully
+Banff
+bang
+bangalore
+banged
+banger
+banging
+bangish
+bangka
+bangkok
+Bangladesh
+Bangladesh's
+bangle
+bangle's
+bangles
+Bangor
+bangs
+bangtail
+Bangui
+bangweulu
+banian
+baning
+banish
+banished
+banisher
+banishes
+banishing
+banishment
+banister
+banister's
+banisters
+banja
+banjermasin
+banjo
+banjo's
+banjoes
+banjoist
+banjos
+banjul
+bank
+Bank
+banka
+bankable
+bankbook
+bankbooks
+banked
+banker
+bankers
+banket
+banking
+banknote
+banknotes
+bankroll
+bankroller
+bankrupt
+bankruptcies
+bankruptcy
+bankruptcy's
+bankrupted
+bankrupting
+bankrupts
+banks
+bankside
+banned
+banner
+banner's
+banneret
+bannerette
+bannerol
+banners
+banning
+bannister
+bannisters
+bannock
+Bannockburn
+banns
+banquet
+banqueted
+banqueter
+banqueting
+banquetings
+banquets
+banquette
+bans
+bansela
+banshee
+banshee's
+banshees
+banstead
+bant
+bantam
+bantamize
+bantamizes
+bantamweight
+banter
+bantered
+banterer
+bantering
+banteringly
+banters
+banting
+bantling
+Bantoid
+Bantu
+Bantu's
+Bantus
+Bantustan
+Banville
+banyan
+banzai
+baobab
+bap
+baptism
+baptism's
+baptismal
+baptismally
+baptisms
+baptist
+baptist's
+Baptiste
+baptistery
+baptistries
+baptistry
+baptistry's
+baptists
+baptizable
+baptizable's
+baptizables
+baptize
+baptized
+baptizement
+baptizement's
+baptizements
+baptizer
+baptizers
+baptizes
+baptizing
+bar
+bar's
+Barabbas
+baranof
+Barathea
+baraza
+barb
+Barbados
+Barbara
+barbarian
+barbarian's
+barbarianism
+barbarianize
+barbarianizes
+barbarians
+barbaric
+barbarically
+barbarism
+barbarities
+barbarity
+barbarization
+barbarize
+barbarized
+barbarizes
+barbarizing
+Barbarossa
+barbarous
+barbarously
+barbarousness
+Barbary
+barbate
+barbe
+barbecue
+barbecued
+barbecuer
+barbecues
+barbecuing
+barbed
+barbedness
+barbel
+barbell
+barbell's
+barbellate
+barbells
+barber
+Barber
+barbered
+barbering
+barberry
+barbers
+barbershop
+barbet
+barbette
+barbican
+barbicel
+Barbirolli
+barbital
+barbitone
+barbiturate
+barbiturates
+barbituric
+barbizon
+Barbour
+Barbour's
+barbs
+Barbuda
+barbudo
+barbudos
+barbule
+barbusse
+barbwire
+barca
+barcarole
+barce
+Barcelona
+barchart
+barcharts
+Barclay
+Barcoo
+bard
+bard's
+Bardolatry
+bardot
+bards
+bare
+bareback
+barebacked
+bared
+barefaced
+barefacedly
+barefacedness
+barefoot
+barefooted
+barehanded
+bareheaded
+bareheadedness
+bareilly
+bareknuckle
+bareknuckled
+barely
+Barenboim
+bareness
+barents
+barer
+bares
+baresark
+barest
+barflies
+barfly
+barfly's
+bargain
+bargained
+bargainer
+bargaining
+bargains
+barge
+bargeboard
+barged
+bargee
+bargeman
+bargepole
+barges
+barging
+Barhop
+Bari
+bariatrician
+bariatrics
+baric
+barilla
+baring
+barite
+baritonal
+baritone
+baritone's
+baritones
+barium
+bark
+barked
+barkeep
+barkeeper
+barkentine
+barker
+barkers
+barkhan
+barkier
+barking
+barkless
+barks
+barky
+barletta
+barley
+barleycorn
+Barlow
+Barlow's
+barm
+barmaid
+barman
+Barmecide
+barmier
+barmy
+barn
+barn's
+Barnabas
+barnacle
+barnacled
+Barnard
+barnardo
+barnaul
+Barnes
+Barnet
+Barnett
+Barnett's
+Barney
+barnful
+Barnhard
+Barnhard's
+barns
+barnsful
+barnsley
+barnstorm
+barnstormed
+barnstormer
+barnstorming
+barnstorms
+barnum
+Barnum
+barny
+barnyard
+barnyard's
+barnyards
+barocchio
+baroda
+barogram
+barogram's
+barograms
+barograph
+barographic
+baroja
+barometer
+barometer's
+barometers
+barometric
+barometrical
+barometrically
+barometry
+baron
+baron's
+baronage
+baroness
+baronet
+baronetage
+baronetcy
+barong
+baronial
+baronies
+baronize
+baronizes
+barons
+barony
+barony's
+baroque
+baroquely
+baroqueness
+baroscope
+barostat
+Barotse
+barouche
+barozzi
+barque
+barquentine
+barquisimeto
+Barr
+Barr's
+barrack
+barracker
+barracks
+barracoon
+barracouta
+barracuda
+barracuda's
+barracudas
+barrage
+barrage's
+barraged
+barrages
+barraging
+barramunda
+barramundi
+barranca
+barranco
+barranquilla
+barrater
+barrator
+barratry
+barrault
+barre
+barred
+barrel
+barrel's
+barreled
+barrelful
+barrelhouse
+barreling
+barrels
+barrelsful
+barren
+barrenness
+barrens
+barrenwort
+barret
+Barrett
+Barrett's
+barrette
+barrette's
+barrettes
+barricade
+barricade's
+barricades
+barrie
+barrier
+barrier's
+barriers
+barring
+barringer
+Barrington
+Barrington's
+barrio
+barrister
+barristers
+barron
+Barron
+barroom
+barrooms
+barros
+barrow
+barrows
+Barry
+Barry's
+Barrymore
+Barrymores
+bars
+Barsac
+barstool
+barstool's
+barstools
+Barstow
+Bart
+bartend
+bartender
+bartender's
+bartenders
+barter
+bartered
+barterer
+bartering
+barters
+Barth
+Bartholomew
+bartizan
+Bartlett
+Bartok
+Bartoletti
+bartolommeo
+Barton
+Barton's
+barware
+barycentre
+barycentric
+barye
+baryon
+baryon's
+baryonic
+baryons
+barysphere
+baryta
+barytes
+barytone
+bas
+basal
+basally
+basalt
+basaltic
+basaltware
+bascinet
+Bascom
+bascom
+bascule
+base
+baseball
+baseball's
+baseballs
+baseband
+baseboard
+baseboard's
+baseboards
+baseborn
+baseburner
+based
+Basel
+baseless
+baselevel
+baseline
+baseline's
+baselines
+basely
+baseman
+basemen
+basement
+basement's
+basementless
+basements
+baseness
+basenji
+baseplate
+basepoint
+baser
+baserunning
+bases
+basest
+bash
+bashan
+bashaw
+bashed
+basher
+bashes
+bashful
+bashfully
+bashfulness
+bashibazouk
+bashing
+Bashkir
+basic
+basically
+basicity
+basics
+basidial
+basidiomycete
+basidiomycetes
+basidiomycetous
+basidiospore
+basidiosporous
+basidium
+basie
+Basie
+basification
+basifixed
+basify
+basil
+basilan
+basilar
+basilary
+basildon
+basileis
+Basilian
+basilica
+basilican
+basilicata
+basilisk
+basin
+basin's
+basinal
+basined
+basinet
+basing
+Basingstoke
+basins
+basipetal
+basipetally
+basis
+bask
+basked
+Baskerville
+basket
+basket's
+basketball
+basketball's
+basketballs
+basketful
+basketlike
+basketry
+baskets
+basketwork
+basking
+basle
+basler
+baslot
+basophil
+basophile
+basophilia
+basophilic
+basotho
+Basque
+Basque's
+bass
+bass's
+Bassas
+bassein
+bassenthwaite
+basses
+basset
+basseterre
+Bassett
+bassi
+bassinet
+bassinet's
+bassinets
+bassis
+bassist
+basso
+bassoon
+bassoon's
+bassoonist
+bassoonist's
+bassoonists
+bassoons
+basswood
+bast
+bastard
+bastard's
+bastardization
+bastardization's
+bastardizations
+bastardize
+bastardized
+bastardizes
+bastardizing
+bastardly
+bastardry
+bastards
+bastardy
+baste
+basted
+baster
+bastes
+bastia
+Bastianini
+bastile
+bastille
+bastinado
+basting
+bastion
+bastion's
+bastioned
+bastions
+bastnaesite
+bastogne
+Basutoland
+bat
+bat's
+Bataan
+batangas
+batata
+Batavia
+batboy
+batch
+batched
+Batchelder
+Batchelder's
+batcher
+batches
+batching
+bate
+bateau
+bated
+bateleur
+Bateman
+Bateman's
+bater
+bates
+batesian
+batfish
+batfowl
+bath
+bathe
+bathed
+bather
+bathers
+bathes
+bathetic
+bathhouse
+bathhouses
+bathing
+batholith
+bathometer
+bathometer's
+bathometers
+Bathonian
+bathos
+bathrobe
+bathrobe's
+bathrobes
+bathroom
+bathroom's
+bathroomed
+bathrooms
+baths
+bathsheba
+bathtub
+bathtub's
+bathtubful
+bathtubs
+Bathurst
+Bathurst's
+bathwater
+bathyal
+bathymetry
+bathyscaph
+bathysphere
+batik
+bating
+batista
+Batista
+batiste
+batley
+batman
+baton
+baton's
+batons
+Bator
+batrachian
+batrachotoxin
+bats
+batsman
+batt
+battailous
+battalia
+battalion
+battalion's
+battalions
+batteau
+batted
+Battelle
+Battelle's
+battels
+battement
+batten
+Battenburg
+battened
+battening
+battens
+batter
+battered
+batteries
+battering
+batters
+battersea
+battery
+battery's
+battier
+battik
+battiness
+batting
+Battle
+battle
+battled
+battledore
+battlefield
+battlefield's
+battlefields
+battlefront
+battlefront's
+battlefronts
+battleground
+battleground's
+battlegrounds
+battlement
+battlement's
+battlemented
+battlements
+battlepiece
+battler
+battlers
+battles
+battleship
+battleship's
+battleships
+battlewagon
+battling
+battu
+battue
+batty
+batum
+batwing
+batwings
+batwoman
+baubee
+bauble
+bauble's
+baubles
+bauchi
+baucis
+baud
+Baudelaire
+Baudo
+baudouin
+baudrons
+bauds
+Bauer
+Bauhaus
+Bauhinia
+baulk
+baulked
+baulking
+baulks
+baum
+Bausch
+bautzen
+bauxite
+bauxitic
+Bavaria
+Bavarian
+bawbee
+bawcock
+bawd
+bawden
+bawdier
+bawdily
+bawdiness
+bawdry
+bawdy
+bawdyhouse
+bawdyhouses
+bawl
+bawled
+bawler
+bawling
+bawls
+Bax
+Baxter
+Baxter's
+bay
+bayadere
+bayaderka
+bayanihan
+Bayard
+bayberries
+bayberry
+Bayda
+bayed
+bayern
+Bayesian
+bayeux
+baying
+bayle
+Baylor
+bayly
+bayonet
+bayonet's
+bayoneted
+bayoneting
+bayonets
+Bayonne
+bayou
+bayou's
+bayous
+Bayport
+Bayport's
+Bayreuth
+bays
+baysian
+baywood
+bazaar
+bazaar's
+bazaars
+bazon
+bazoo
+bazooka
+bazookas
+BBC
+BCD
+BCPL
+bdellium
+be
+bea
+beach
+beachboy
+beachboys
+beachcomb
+beachcomber
+beachcombers
+beached
+beaches
+beachfront
+beachhead
+beachhead's
+beachheads
+beachie
+beaching
+beachside
+beachwear
+beachy
+beacon
+beacon's
+beaconed
+beaconing
+beacons
+Beaconsfield
+bead
+beaded
+beading
+beadle
+beadle's
+beadledom
+beadles
+beadroll
+beads
+beadsman
+beadwork
+beadworker
+beady
+beagle
+beagle's
+beagles
+beak
+beaked
+beaker
+beakers
+beaks
+beale
+beall
+beam
+beame
+beamed
+beamer
+beamers
+beaming
+beamish
+beamishly
+beams
+beamy
+bean
+beanbag
+beanbag's
+beanbags
+beanball
+beaned
+beaner
+beaners
+beanery
+beanfeast
+beanie
+beaning
+beano
+beanpole
+beans
+bear
+bearability
+bearable
+bearably
+bearbaiting
+bearberry
+beard
+bearded
+beardedness
+beardless
+beardown
+beards
+Beardsley
+Beardsley's
+bearer
+bearers
+bearing
+bearings
+bearish
+bearishly
+bearishness
+bears
+bearskin
+beast
+beastie
+beasties
+beastings
+beastlier
+beastliness
+beastly
+beasts
+beasty
+beat
+beatable
+beatably
+beaten
+beater
+beaters
+beatie
+beatific
+beatifically
+beatification
+beatify
+beating
+beatings
+beatitude
+beatitude's
+beatitudes
+beatles
+beatless
+beatnik
+beatnik's
+beatniks
+Beatrice
+beats
+beatty
+beau
+beau's
+beauchamps
+Beauchamps
+beauclerk
+Beaufort
+beauharnais
+Beaujolais
+beaumarchais
+Beaumont
+Beaune
+Beauregard
+beaus
+beaut
+beauteous
+beauteously
+beauteousness
+beautician
+beauticians
+beauties
+beautification
+beautifications
+beautified
+beautifier
+beautifiers
+beautifies
+beautiful
+beautifully
+beautifulness
+beautify
+beautifying
+beauty
+beauty's
+beauvais
+beauvoir
+beaux
+beaver
+beaver's
+beaverboard
+beaverbrook
+beaverize
+beaverizes
+beavers
+Beaverton
+beaverton
+bebeerine
+bebel
+Bebington
+bebop
+bebopper
+becalm
+becalmed
+becalming
+becalms
+became
+because
+beccafico
+bechance
+bechet
+Bechtel
+Bechuana
+Bechuanaland
+beck
+Beckenham
+becket
+beckett
+Beckford
+Beckman
+Beckman's
+Beckmann
+beckon
+beckoned
+beckoning
+beckons
+Becky
+beclamor
+beclamored
+beclamoring
+beclamors
+becloud
+become
+becomes
+becoming
+becomingly
+becquerel
+becudgeled
+becudgeling
+bed
+bed's
+bedabble
+bedaub
+bedaubing
+bedazzle
+bedazzled
+bedazzlement
+bedazzles
+bedazzling
+bedbug
+bedbug's
+bedbugs
+bedchamber
+bedclothes
+beddable
+bedded
+bedder
+bedder's
+bedders
+bedding
+bede
+bedeck
+bedesman
+bedevil
+bedeviled
+bedeviling
+bedevilment
+bedevils
+bedew
+bedfast
+bedfellow
+Bedford
+Bedfordshire
+bedight
+bedim
+bedimmed
+bedimming
+bedivere
+bedizen
+bedlam
+bedlamite
+bedlamize
+bedlamizes
+Bedlington
+bedmate
+bedmate's
+bedmates
+bedouin
+bedpan
+bedpan's
+bedpans
+bedplate
+bedpost
+bedpost's
+bedposts
+bedraggle
+bedraggled
+bedrail
+bedrid
+bedridden
+bedriveled
+bedriveling
+bedrock
+bedrock's
+bedroll
+bedroom
+bedroom's
+bedroomed
+bedrooms
+beds
+bedside
+bedsit
+bedsits
+bedsitter
+bedsore
+bedspaces
+bedspread
+bedspread's
+bedspreads
+bedspring
+bedspring's
+bedsprings
+bedstead
+bedstead's
+bedsteads
+bedstraw
+bedtime
+beduin
+beduins
+bedwarmer
+bedwetting
+bedworth
+bee
+beeb
+Beebe
+Beebe's
+beebread
+beech
+Beecham
+Beecham's
+beechen
+beecher
+beechnut
+beechwood
+beef
+beefburger
+beefcake
+beefeater
+beefed
+beefer
+beefers
+beefier
+beefing
+beefs
+beefsteak
+beefwood
+beefy
+beehive
+beehive's
+beehives
+beekeeper
+beekeeping
+beelike
+beeline
+Beelzebub
+Beelzebub's
+been
+beens
+beento
+beep
+beeped
+beeper
+beeping
+beeps
+beer
+beerbohm
+beerier
+beers
+beersheba
+beery
+bees
+beestings
+beeswax
+beeswing
+beet
+beet's
+beetfly
+Beethoven
+Beethoven's
+beetle
+beetle's
+beetled
+beetles
+beetling
+beetroot
+beetroots
+beets
+beeves
+beezer
+befall
+befallen
+befalling
+befalls
+befell
+befit
+befit's
+befits
+befitted
+befitting
+befittingly
+befog
+befogged
+befogging
+befogs
+befoh
+befool
+before
+beforehand
+beforehandedness
+beforeimage
+beforeimages
+beforetime
+befoul
+befouled
+befouling
+befouls
+befriend
+befriended
+befriending
+befriends
+befuddle
+befuddled
+befuddlement
+befuddles
+befuddling
+beg
+begad
+began
+begat
+beget
+begets
+begetter
+begetting
+beggar
+beggared
+beggaring
+beggarliness
+beggarly
+beggars
+beggarweed
+beggary
+begged
+begging
+Beghard
+begin
+beginner
+beginner's
+beginners
+beginning
+beginning's
+beginnings
+begins
+begird
+begone
+begonia
+begorra
+begot
+begotten
+begrime
+begrimed
+begriming
+begrudge
+begrudged
+begrudger
+begrudges
+begrudging
+begrudgingly
+begs
+beguile
+beguiled
+beguilement
+beguiler
+beguiles
+beguiling
+beguilingly
+Beguin
+beguine
+begum
+begun
+behalf
+behan
+behave
+behaved
+behaver
+behaves
+behaving
+behavior
+behavior's
+behavioral
+behaviorally
+behaviored
+behaviorism
+behaviorism's
+behaviorisms
+behaviorist
+behaviorist's
+behavioristic
+behavioristically
+behavioristics
+behaviorists
+behaviors
+behead
+beheading
+beheld
+behemoth
+behemothic
+behemoths
+behest
+behind
+behindhand
+behistun
+behold
+beholden
+beholder
+beholders
+beholding
+beholds
+behoof
+behoove
+behoove's
+behooved
+behooves
+behooving
+behooving's
+behoovingly
+behoovings
+Behrens
+beiderbecke
+beige
+beigel
+beigy
+Beijing
+being
+beings
+beira
+Beirut
+bejabers
+bejewel
+bejeweled
+bejeweling
+bel
+Bela
+Bela's
+belabor
+belabor's
+belabored
+belaboring
+belabors
+belah
+belate
+belated
+belatedly
+belatedness
+belaud
+belay
+belayed
+belaying
+belays
+belch
+belched
+belches
+belching
+beldam
+beldame
+beleaguer
+belemnite
+Belfast
+belfort
+belfries
+belfry
+belfry's
+belga
+Belgae
+belge
+Belgian
+Belgian's
+Belgians
+Belgium
+Belgium's
+Belgrade
+Belgravia
+Belial
+belie
+belied
+belief
+belief's
+beliefs
+belier
+belies
+believability
+believable
+believably
+believe
+believed
+believer
+believers
+believes
+believing
+belike
+Belisarius
+Belisha
+belittle
+belittled
+belittlement
+belittler
+belittles
+belittling
+belitung
+belive
+Belize
+bell
+bell's
+Bella
+belladonna
+Bellamy
+Bellamy's
+bellarmine
+Bellatrix
+bellay
+bellbird
+bellboy
+bellboy's
+bellboys
+belle
+belle's
+belleau
+Belleek
+Bellerophon
+belles
+belletrist
+Belleville
+bellflower
+bellhop
+bellhop's
+bellhops
+bellicose
+bellicosely
+bellicoseness
+bellicosity
+bellied
+bellies
+belligerence
+belligerency
+belligerent
+belligerent's
+belligerently
+belligerents
+Bellingham
+Bellingham's
+Bellingshausen
+Bellini
+Bellini's
+bellinzona
+bellman
+bellmen
+Bellmouth
+belloc
+Bellona
+Bellovin
+Bellovin's
+bellow
+bellowed
+bellowing
+bellows
+bellpull
+bells
+bellum
+bellwether
+bellwether's
+bellwethers
+Bellwood
+bellwood
+bellwort
+belly
+belly's
+bellyache
+bellyacher
+bellyaching
+bellyband
+bellybutton
+bellyful
+bellyfull
+bellying
+Belmondo
+Belmont
+belmopan
+Beloit
+belong
+belonged
+belonging
+belongingness
+belongings
+belongs
+Belorussia
+Belostok
+belove
+beloved
+belovo
+below
+belowground
+Belsen
+Belshazzar
+Belshazzar's
+belt
+Beltane
+belted
+belting
+beltless
+Belton
+belton
+belts
+Beltsville
+beltway
+beluga
+beluga's
+Belushi
+Belushi's
+belvedere
+bely
+belying
+BEMA
+bemadden
+bemaddening
+beman
+Bemba
+bemean
+bemedaled
+bemire
+bemoan
+bemoaned
+bemoaning
+bemoans
+bemock
+bemuse
+bemused
+bemusedly
+bemusement
+Ben
+Ben's
+Benackova
+benadryl
+Benares
+benares
+bench
+benched
+bencher
+benches
+benching
+benchmar
+benchmark
+benchmark's
+benchmarking
+benchmarks
+bend
+bendable
+benday
+bended
+bendel
+bender
+benders
+bendigo
+bending
+Bendix
+bends
+bendy
+beneath
+benedicite
+Benedict
+Benedict's
+Benedictine
+Benedictine's
+benediction
+benediction's
+benedictions
+benedictory
+Benedictus
+Benedikt
+benefaction
+benefactor
+benefactor's
+benefactors
+benefactress
+benefic
+benefice
+beneficence
+beneficences
+beneficent
+beneficently
+beneficial
+beneficially
+beneficialness
+beneficiaries
+beneficiary
+beneficiate
+beneficiation
+benefit
+benefited
+benefiter
+benefiters
+benefiting
+benefits
+benefitted
+benefitting
+Benelux
+Benelux's
+benempt
+benevento
+benevolence
+benevolent
+benevolently
+benevolentness
+benfleet
+Bengal
+Bengal's
+Bengali
+Bengali's
+bengaline
+benghazi
+benguela
+Beni
+benight
+benighted
+benightedly
+benightedness
+benign
+benignancy
+benignant
+benignantly
+benignity
+benignly
+Benin
+Benison
+Benjamin
+Benne
+Bennet
+Bennett
+Bennington
+Benny
+benoni
+Benson
+bent
+benthal
+Bentham
+benthic
+benthonic
+benthos
+bentinck
+Bentley
+Bentleys
+Benton
+Benton's
+bentonite
+bentonitic
+bents
+bentwood
+benue
+benumb
+Benz
+benzaldehyde
+Benzedrine
+Benzedrine's
+benzene
+benzidine
+benzine
+benzoate
+benzocaine
+benzofuran
+benzoic
+benzoin
+benzol
+benzophenone
+benzoquinone
+benzoyl
+benzyl
+Beograd
+Beowulf
+bepaint
+beplaster
+bequeath
+bequeathal
+bequeathed
+bequeathes
+bequeathing
+bequest
+bequest's
+bequests
+berar
+berate
+berated
+berates
+berating
+Berber
+berbera
+berberidaceous
+berberine
+Berberis
+berbice
+Berbie
+berceuse
+berceuses
+Berchtesgaden
+Berdichev
+Berdyayev
+Berea
+Berea's
+bereave
+bereaved
+bereavement
+bereavements
+bereaves
+bereaving
+bereft
+Berenices
+Berenson
+Beresford
+Beresford's
+beret
+beret's
+berets
+Berezina
+Berezniki
+Berg
+berg
+Bergama
+Bergamo
+bergamot
+Berganza
+bergdama
+Bergen
+bergen
+Bergen's
+Berger
+berger
+bergerac
+bergius
+Bergland
+Bergland's
+Berglund
+Berglund's
+Bergman
+Bergman's
+Bergonzi
+bergs
+Bergson
+Bergsonism
+Bergsten
+Bergsten's
+Bergstrom
+Bergstrom's
+beria
+beribbon
+beribboned
+beriberi
+bering
+Beringer
+beringer
+berio
+beriosova
+berk
+Berkeleian
+Berkeleianism
+Berkeley
+Berkeley's
+berkelium
+Berkowitz
+berks
+Berkshire
+Berkshires
+berley
+berlichingen
+Berlin
+Berlin's
+Berliner
+Berliners
+berlinguer
+Berlinize
+Berlinizes
+Berlioz
+Berlitz
+berm
+Berman
+Berman's
+bermejo
+bermondsey
+Bermuda
+Bermuda's
+Bern
+bernadette
+Bernadine
+bernadotte
+Bernard
+bernardine
+Bernardine
+Bernardino
+Bernardino's
+Bernardo
+Bernardo's
+berne
+Bernese
+Bernet
+Bernet's
+Bernhard
+bernhardt
+Bernice
+bernicle
+Bernie
+Berniece
+bernina
+Bernini
+Bernoulli
+Bernstein
+Berra
+berretta
+berried
+berries
+berry
+berry's
+berrying
+berrylike
+bersagliere
+berseem
+berserk
+berserker
+Bert
+berteros
+berth
+Bertha
+berthed
+berthing
+berthings
+berths
+Bertie
+bertillon
+berto
+bertolucci
+Bertram
+Bertram's
+Bertrand
+Berwick
+Berwick's
+beryl
+beryllium
+berzelius
+bes
+beseech
+beseeches
+beseeching
+beseechingly
+beseem
+beset
+besetment
+besets
+besetting
+beshrew
+beside
+besides
+besiege
+besieged
+besieger
+besiegers
+besieging
+besmear
+besmirch
+besmirched
+besmirches
+besmirching
+besom
+besot
+besotted
+besotter
+besotting
+besought
+bespangle
+bespatter
+bespeak
+bespeaks
+bespectacled
+bespoke
+bespoken
+bespread
+besprent
+besprinkle
+Bess
+Bessarabia
+Bessel
+Bessel's
+Bessemer
+Bessemerize
+Bessemerizes
+Bessie
+best
+bestead
+besteaded
+besteading
+bested
+bester
+bestial
+bestiality
+bestialize
+bestialized
+bestializes
+bestializing
+bestially
+bestiary
+besting
+bestir
+bestirring
+bestow
+bestowal
+bestowed
+bestrew
+bestride
+bestrides
+bestriding
+bestrode
+bests
+bestseller
+bestseller's
+bestsellerdom
+bestsellers
+bestselling
+bestubble
+bestubbled
+bet
+bet's
+beta
+betaine
+betake
+betas
+betatron
+betel
+Betelgeuse
+beth
+Bethany
+bethe
+bethel
+Bethesda
+bethink
+Bethlehem
+Bethmann
+bethought
+bethral
+bethralled
+bethralling
+bethrals
+bethsaida
+betide
+betimes
+betjeman
+betoken
+betokened
+betokening
+betony
+betook
+betray
+betrayal
+betrayed
+betrayer
+betraying
+betrays
+betroth
+betrothal
+betrothals
+betrothed
+bets
+Betsey
+Betsey's
+Betsy
+Betta
+Bette
+Bette's
+betted
+better
+bettered
+bettering
+betterment
+betterments
+betters
+betti
+Betties
+betting
+bettor
+Betty
+betulaceous
+between
+betweenbrain
+betweenness
+betweentimes
+betweenwhiles
+betwixt
+Beulah
+beuthen
+bevan
+bevanite
+bevanites
+bevatron
+bevel
+beveled
+beveler
+bevelers
+beveling
+bevelings
+bevels
+beverage
+beverage's
+beverages
+Beveridge
+Beverly
+Beverly's
+bevies
+bevin
+bevvy
+bevy
+bewail
+bewailed
+bewailing
+bewails
+beware
+bewhisker
+bewhiskered
+Bewick
+bewigged
+bewilder
+bewildered
+bewilderedly
+bewilderedness
+bewildering
+bewilderingly
+bewilderment
+bewilders
+bewitch
+bewitched
+bewitchery
+bewitches
+bewitching
+bewitchingly
+bewitchment
+bewray
+bexley
+bey
+beyond
+beyrouth
+bezel
+bezique
+bezoar
+bezonian
+bezwada
+bhagalpur
+Bhagavadgita
+bhai
+bhakti
+bhang
+bharal
+bharat
+bharatiya
+bhatpara
+bhavan
+bhavnagar
+bhindi
+bhishti
+bhopal
+bhubaneswar
+Bhutan
+bhutto
+biafra
+biak
+Bialystok
+biannual
+biannulate
+biarritz
+bias
+biased
+biases
+biasing
+biasness
+biassed
+biassin
+biassing
+biathlon
+biauriculate
+biaxial
+biaxially
+bib
+bib's
+bibb
+bibbed
+bibber
+bibbery
+bibbing
+bibcock
+bibelot
+bibelots
+bible
+bible's
+bibles
+bibless
+biblical
+biblically
+biblicism
+biblicist
+bibliographer
+bibliographic
+bibliographical
+bibliographically
+bibliographics
+bibliographies
+bibliography
+bibliography's
+bibliolater
+bibliolatrous
+bibliolatry
+bibliology
+bibliomancy
+bibliomania
+bibliomaniac
+bibliomaniacal
+bibliopegic
+bibliopegically
+bibliopegist
+bibliopegistic
+bibliopegy
+bibliophile
+bibliophiles
+bibliophilic
+bibliophilism
+bibliophilist
+bibliophily
+bibliopole
+bibliopolic
+bibliopolist
+bibliotheca
+bibliothecal
+bibliotic
+bibliotics
+bibliotist
+bibs
+bibulous
+bibulously
+bibulousness
+bicameral
+bicameralism
+bicapsular
+bicarb
+bicarbonate
+Bice
+bicentenary
+bicentennial
+bicentric
+bicentricity
+bicep
+bicephalous
+biceps
+bicester
+bichloride
+bichromate
+bichromated
+bichromatize
+bichromatizes
+bichrome
+bicipital
+bicker
+bickered
+bickerer
+bickering
+bickers
+bicollateral
+bicolor
+bicolored
+biconcave
+biconcavity
+biconditional
+biconnected
+biconvex
+biconvexity
+bicorn
+bicorne
+bicornuate
+bicultural
+biculturalism
+bicuspid
+bicuspidate
+bicycle
+bicycled
+bicycler
+bicyclers
+bicycles
+bicyclic
+bicycling
+bicyclist
+bid
+bid's
+bida
+bidarka
+biddability
+biddable
+biddably
+bidden
+bidder
+bidder's
+bidders
+biddies
+bidding
+biddle
+Biddle
+biddy
+bide
+bided
+bidentate
+bider
+bides
+bidet
+bidiagonal
+bidialectal
+bidialectalism
+biding
+bidirectional
+bidistill
+bidistilled
+bidistilling
+bidistills
+bids
+Biedermeier
+biel
+bield
+Bielefeld
+bienne
+biennial
+biennially
+biennium
+Bienville
+bier
+bierce
+Bierce
+bierkeller
+biestings
+bietnar
+bifacial
+bifarious
+biff
+biffin
+bifid
+bifidity
+bifidly
+bifilar
+bifilarly
+biflagellate
+bifocal
+bifocals
+bifoliate
+bifoliolate
+biforate
+biform
+bifrost
+bifurcate
+bifurcated
+bifurcately
+bifurcates
+bifurcating
+bifurcation
+bifurcations
+big
+bigamist
+bigamous
+bigamously
+bigamy
+bigarreau
+Bigelow
+bigeminal
+bigeminy
+bigener
+bigeneric
+bigeye
+bigger
+biggest
+biggety
+biggin
+bigging
+biggish
+biggity
+Biggs
+bighead
+bigheaded
+bighearted
+bigheartedly
+bigheartedness
+bighorn
+bighorn's
+bighorns
+bight
+bight's
+bights
+bigly
+bigmouth
+bigmouthed
+bigness
+bignonia
+bignoniaceous
+bigot
+bigot's
+bigoted
+bigotedly
+bigoting
+bigotry
+bigots
+biguanide
+bigwig
+bihar
+Bihari
+biharmonic
+Biisk
+bijapur
+bijection
+bijection's
+bijections
+bijective
+bijectively
+bijou
+bijouterie
+bijugate
+bikaner
+bike
+bike's
+biked
+biker
+biker's
+bikers
+bikes
+bikeway
+bikie
+bikila
+biking
+bikini
+bikini's
+bikinied
+bikinis
+bilabial
+bilabiate
+bilander
+bilateral
+bilateralism
+bilaterally
+bilateralness
+bilayer
+bilayers
+Bilbao
+bilbao
+bilberry
+bilbo
+Bilbo
+Bilbo's
+bilboa
+bilboes
+bile
+bilection
+bilestone
+bilge
+bilge's
+bilged
+bilges
+bilgier
+bilging
+bilgy
+Bilharzia
+bilharziasis
+biliary
+bilinear
+bilingual
+bilingualism
+bilingually
+bilinguals
+bilious
+biliously
+biliousness
+bilirubin
+biliverdin
+bilk
+bilked
+bilker
+bilking
+bilks
+bill
+billable
+billabong
+billboard
+billboard's
+billboards
+billed
+biller
+billers
+billet
+billeted
+billeting
+billets
+billfish
+billfold
+billfold's
+billfolds
+billhead
+billhook
+billiard
+billiards
+Billie
+billies
+Billiken
+Billikens
+billing
+Billingham
+billings
+Billingsgate
+billion
+billionaire
+billions
+billionth
+Billiton
+billon
+billow
+billowed
+billowing
+billows
+billowy
+billposter
+billposting
+bills
+billy
+billycock
+billyo
+bilobal
+bilobate
+bilobed
+bilocular
+biloculate
+Biltmore
+Biltmore's
+biltong
+Bim
+bimah
+bimanous
+bimanual
+bimanually
+bimbo
+bimester
+bimestrial
+bimetal
+bimetalist
+bimetalistic
+bimetallic
+bimetallism
+bimillenary
+bimillenial
+Bimini
+bimodal
+bimodality
+bimolecular
+bimolecularly
+bimonthlies
+bimonthly
+bimorph
+bimorphemic
+bin
+bin's
+binal
+binaries
+binary
+binate
+binational
+binaural
+binaurally
+bind
+binded
+binder
+binders
+bindery
+binding
+bindingly
+bindingness
+bindings
+bindle
+binds
+bindweed
+bine
+bing
+binge
+bingen
+binges
+bingey
+Bingham
+Binghamton
+binghi
+bingle
+bingo
+bingos
+binh
+Bini
+binnacle
+binned
+binning
+binocular
+binocularity
+binocularly
+binoculars
+binodal
+binomial
+binomially
+binominal
+bins
+bint
+binturong
+binuclear
+binucleate
+binucleated
+bio
+bioactive
+bioassay
+bioastronautical
+bioastronautics
+biocatalyst
+biocatalytic
+biocellate
+biocenology
+biocenosis
+biocenotic
+biochemic
+biochemical
+biochemically
+biochemist
+biochemistry
+biochemists
+Biochimica
+biochip
+biochips
+biocidal
+biocide
+bioclean
+bioclimatic
+bioclimatology
+biocoenosis
+biocoenotic
+biocycle
+biodegradability
+biodegradable
+biodegradation
+biodegrade
+biodynamics
+bioecological
+bioecologist
+bioecology
+bioelectric
+bioelectrical
+bioelectricity
+bioenergetics
+bioengineering
+bioenvironmental
+biofeedback
+bioflavonoid
+biog
+biogen
+biogenesis
+biogenetic
+biogenetically
+biogenic
+biogeochemical
+biogeochemistry
+biogeographic
+biogeographical
+biogeography
+biograph
+biographee
+biographer
+biographer's
+biographers
+biographic
+biographical
+biographically
+biographies
+biographize
+biographizes
+biography
+biography's
+bioherm
+bioinstrumentation
+biologic
+biological
+biologically
+biologicals
+biologism
+biologist
+biologist's
+biologistic
+biologists
+biologize
+biologizes
+biology
+bioluminescence
+bioluminescent
+biolysis
+biomacromolecule
+biomacromolecules
+biomass
+biomaterial
+biome
+biomedical
+biomedicine
+biometric
+biometrical
+biometrically
+biometrics
+Biometrika
+biometry
+biomolecular
+biomolecule
+biomolecules
+bionic
+bionics
+bionomic
+bionomical
+bionomically
+bionomics
+biophysic
+Biophysica
+biophysical
+biophysically
+biophysicist
+biophysicists
+biophysics
+bioplasm
+biopoiesis
+biopolymer
+biopolymers
+biopsies
+biopsy
+biosatellite
+bioscience
+biosciences
+bioscientific
+bioscientist
+bioscope
+bioscopy
+biosis
+biosphere
+biostatics
+biostatistic
+biostatistics
+biostrome
+biosynthesis
+biosynthesized
+biosynthetic
+biosynthetically
+biosystematic
+biosystematist
+biosystematy
+biota
+biotechnological
+biotechnology
+biotelemetric
+biotelemetry
+biotic
+biotin
+biotite
+biotitic
+biotope
+biotransformation
+biotron
+biotype
+biotypic
+biovular
+bipack
+biparental
+biparentally
+biparietal
+biparous
+bipartisan
+bipartisanism
+bipartisanship
+bipartite
+bipartitely
+bipartition
+biped
+bipedal
+bipeds
+bipetalous
+biphenyl
+bipinnate
+bipinnately
+biplane
+biplane's
+biplanes
+bipod
+bipolar
+bipolarity
+bipolarization
+bipolarize
+bipolarizes
+bipropellant
+bipyramidal
+biquadrate
+biquadratic
+biquarterly
+biracial
+biracialism
+biradial
+biramous
+birch
+birchbark
+birchen
+bircher
+birches
+bird
+bird's
+birdbath
+birdbath's
+birdbaths
+birdbrain
+birdbrained
+birdcage
+birdcage's
+birdcages
+birdcall
+birder
+birdhouse
+birdie
+birdieback
+birdied
+birdieing
+birdies
+birdlike
+birdlime
+birdman
+birds
+birdseed
+birdwatch
+birdyback
+birefringence
+birefringent
+bireme
+birendra
+biretta
+Birgit
+birgitta
+biriani
+birk
+Birkenhead
+birkhead
+birkie
+birl
+birler
+Birmingham
+Birminghamize
+Birminghamizes
+biro
+birobidzhan
+biros
+birr
+birse
+birth
+birth's
+birthday
+birthday's
+birthdays
+birthed
+birthmark
+birthplace
+birthplaces
+birthrate
+birthrate's
+birthrates
+birthright
+birthright's
+birthrights
+birthroot
+births
+birthstone
+birthweight
+birthweights
+birthwort
+birtwhistle
+BIS
+bis
+bisayas
+biscay
+biscayne
+Biscayne
+biscuit
+biscuit's
+biscuits
+bise
+bisect
+bisected
+bisecting
+bisection
+bisection's
+bisectional
+bisectionally
+bisections
+bisector
+bisector's
+bisectors
+bisectrix
+bisects
+biserial
+biserrate
+bisexual
+bisexual's
+bisexuality
+bisexually
+bisexuals
+bish
+bishop
+Bishop
+bishop's
+bishopbird
+bishopric
+bishops
+bisitun
+bisk
+biskra
+Bismarck
+Bismark
+Bismark's
+bismuth
+bismuthic
+bismuthinite
+bismuthous
+bison
+bison's
+bisons
+bisque
+bisques
+Bissau
+bissextile
+bist
+bistability
+bistable
+bistate
+bister
+bistered
+bistort
+bistro
+bistroic
+bistros
+bisulcate
+bisulfate
+bisulfide
+bisulfite
+bisulphate
+bisulphide
+bisulphite
+bisutun
+bisyllabic
+bisymmetric
+bit
+bit's
+bitartrate
+bitblt
+bitblts
+bitch
+bitch's
+bitchery
+bitches
+bitchier
+bitchily
+bitchiness
+bitchy
+bite
+biter
+biters
+bites
+bithynia
+biting
+bitingly
+bitmap
+bitmap's
+bitmaps
+BITNET
+bitolj
+bits
+bitser
+bitstock
+bitsy
+bitt
+bitted
+bitten
+bitter
+bitterer
+bitterest
+bitterish
+bitterling
+bitterly
+bittern
+bitterness
+bitternut
+bitterroot
+bitters
+bittersweet
+bittersweetly
+bittersweetness
+bitterweed
+bitterwood
+bitting
+bittock
+bitty
+bitumen
+bituminization
+bituminize
+bituminized
+bituminizes
+bituminizing
+bituminoid
+bituminous
+bitwise
+bivalent
+bivalve
+bivalve's
+bivalved
+bivalves
+bivariate
+bivouac
+bivouacs
+bivvy
+biweekly
+biyearly
+biz
+bizarre
+bizarrely
+bizarreness
+bizerte
+Bizet
+Bizet's
+blab
+blabbed
+blabber
+blabbered
+blabbering
+blabbermouth
+blabbermouths
+blabbing
+blabby
+blabs
+Blachut
+black
+blackamoor
+blackamoors
+blackball
+blackballed
+blackballing
+blackballs
+Blackbeard
+blackberries
+blackberry
+blackberry's
+blackbird
+blackbird's
+blackbirder
+blackbirds
+blackboard
+blackboard's
+blackboards
+blackbodies
+blackbody
+blackbuck
+Blackburn
+blackbutt
+blackcap
+blackcock
+blackcurrant
+blackdamp
+blacked
+blacken
+blackened
+blackener
+blackening
+blackens
+blacker
+blackest
+blackett
+blackface
+Blackfeet
+blackfin
+blackfish
+blackfly
+Blackfoot
+Blackfoot's
+Blackfoots
+blackguard
+blackguard's
+blackguardism
+blackguardly
+blackguards
+blackhander
+blackhead
+blackheart
+blacking
+blackish
+blackjack
+blackjack's
+blackjacks
+blackland
+blackleg
+blacklist
+blacklisted
+blacklister
+blacklisting
+blacklists
+blackly
+blackmail
+blackmailed
+blackmailer
+blackmailers
+blackmailing
+blackmails
+Blackman
+Blackmer
+blackmer
+blackmore
+blackness
+blackout
+blackout's
+blackouts
+blackpoll
+blackpool
+blacks
+blackshirt
+blacksmith
+blacksmith's
+blacksmithing
+blacksmiths
+blacksnake
+Blackstone
+blackstrap
+blacktail
+blackthorn
+blacktop
+blacktop's
+blacktops
+blackwall
+blackwash
+blackwater
+Blackwell
+Blackwells
+blackwood
+bladder
+bladder's
+bladderlike
+bladdernose
+bladdernut
+bladders
+bladderwort
+bladderwrack
+blade
+blade's
+bladed
+blades
+Blagoveshchensk
+blague
+blah
+blain
+Blaine
+Blaine's
+Blair
+Blake
+blakey
+Blakey
+blamable
+blamably
+blame
+blamed
+blameful
+blamefully
+blameless
+blamelessly
+blamelessness
+blamer
+blamers
+blames
+blameworthiness
+blameworthy
+blamey
+blaming
+blanc
+blanch
+Blanchard
+Blanchard's
+Blanche
+blanched
+blancher
+blanches
+blanching
+blancmange
+bland
+blandish
+blandisher
+blandishment
+blandishments
+blandly
+blandness
+blank
+blanked
+blanker
+blankest
+blanket
+blanketed
+blanketer
+blanketers
+blanketflower
+blanketing
+blanketlike
+blankets
+blanking
+blankly
+blankness
+blanks
+blanquette
+blanton
+Blanton
+Blanzat
+blare
+blared
+blares
+blaring
+blarney
+blasco
+blase
+blasingame
+blaspheme
+blasphemed
+blasphemer
+blasphemes
+blasphemies
+blaspheming
+blasphemous
+blasphemously
+blasphemousness
+blasphemy
+blast
+blasted
+blastema
+blastematic
+blastemic
+blaster
+blasters
+blastie
+blasting
+blastment
+blastocoel
+blastocyst
+blastoderm
+blastoff
+blastogenesis
+blastomere
+blastopore
+blasts
+blastula
+blastula's
+blastular
+blastulas
+blastulation
+blat
+blatancy
+blatant
+blatantly
+blatantness
+blate
+blather
+blathered
+blatherer
+blathering
+blatted
+blatter
+blatting
+Blatz
+blaubok
+Blavatsky
+blaydon
+blaze
+blazed
+blazer
+blazers
+blazes
+blazing
+blazingly
+blazon
+blazoned
+blazoner
+blazoning
+blazonry
+bldg
+bleach
+bleachable
+bleached
+bleacher
+bleachers
+bleaches
+bleaching
+bleak
+bleakish
+bleakly
+bleakness
+blear
+blearily
+bleariness
+bleary
+bleat
+bleater
+bleating
+bleats
+bleb
+Blech
+bled
+bleed
+bleeder
+bleeders
+bleeding
+bleedings
+bleeds
+Bleeker
+bleep
+bleeped
+bleeper
+bleeping
+bleeps
+Blegen
+blemish
+blemish's
+blemished
+blemishes
+blemishing
+blench
+blend
+blende
+blended
+blender
+blenders
+blending
+blends
+Blenheim
+blennioid
+blenny
+blent
+blepharitis
+bless
+blessed
+blessedly
+blessedness
+blesses
+blessing
+blessings
+blest
+blet
+blether
+blevins
+blew
+blewits
+Bley
+blida
+bligh
+blight
+blighted
+blighter
+blighty
+blimey
+blimp
+blimp's
+blimpishly
+blimpishness
+blimps
+blind
+blindage
+blinded
+blinder
+blinders
+blindfish
+blindfold
+blindfolded
+blindfolding
+blindfolds
+Blindheim
+blinding
+blindingly
+blindly
+blindness
+blinds
+blindside
+blindsided
+blindsides
+blindsiding
+blindstorey
+blindworm
+Blini
+blink
+blinked
+blinker
+blinkered
+blinkering
+blinkers
+blinking
+blinks
+Blinn
+Blinn's
+blintz
+blintze
+blip
+blip's
+blipping
+blips
+blique
+bliss
+Bliss
+blissful
+blissfully
+blissfulness
+blister
+blistered
+blistering
+blisteringly
+blisters
+blistery
+blithe
+blithely
+blither
+blithesome
+blithesomely
+blithest
+blitz
+blitz's
+blitzes
+blitzkrieg
+blizzard
+blizzard's
+blizzards
+blizzardy
+bloat
+bloated
+bloater
+bloaters
+bloating
+bloats
+blob
+blob's
+blobbing
+blobs
+bloc
+bloc's
+Bloch
+Bloch's
+block
+block's
+blockade
+blockaded
+blockader
+blockades
+blockading
+blockage
+blockage's
+blockages
+blockboard
+blockbuster
+blockbusters
+blockbusting
+blocked
+blocker
+blockers
+blockhead
+blockheads
+blockhouse
+blockhouses
+blockier
+blocking
+blockish
+blockishly
+blocks
+blocky
+blocs
+bloemfontein
+blois
+bloke
+bloke's
+blokes
+Blomberg
+Blomberg's
+Blomquist
+Blomquist's
+Blomstedt
+blond
+blond's
+blonde
+blonde's
+blondes
+blondish
+blonds
+blood
+bloodbath
+bloodbaths
+bloodcurdling
+bloodcurdlingly
+blooded
+bloodfin
+bloodguilt
+bloodguiltiness
+bloodguilty
+bloodhound
+bloodhound's
+bloodhounds
+bloodied
+bloodiest
+bloodily
+bloodiness
+bloodless
+bloodlessly
+bloodlessness
+bloodletting
+bloodline
+bloodline's
+bloodlines
+bloodmobile
+bloodred
+bloodroot
+bloods
+bloodshed
+bloodshot
+bloodsport
+bloodsports
+bloodstain
+bloodstain's
+bloodstained
+bloodstains
+bloodstock
+bloodstone
+bloodstream
+bloodsucker
+bloodsucking
+bloodthirstily
+bloodthirstiness
+bloodthirsty
+bloodworm
+bloodwort
+bloody
+bloodying
+bloom
+bloomed
+bloomer
+bloomers
+bloomery
+Bloomfield
+blooming
+Bloomington
+blooms
+Bloomsbury
+bloomy
+bloop
+blooper
+bloops
+blossom
+blossomed
+blossoms
+blossomy
+blot
+blot's
+blotch
+blotchily
+blotchy
+blots
+blotted
+blotter
+blotting
+blotto
+blotty
+blouse
+blouse's
+blouses
+blousing
+blouson
+blow
+blowback
+blowed
+blower
+blowers
+blowfish
+blowfly
+blowgun
+blowhard
+blowhole
+blowie
+blowing
+blowlamp
+blown
+blowout
+blowpipe
+blows
+blowsy
+blowtorch
+blowtube
+blowup
+blowy
+blowzy
+blub
+blubber
+blubbered
+blubbering
+blubbery
+blucher
+bludge
+bludgeon
+bludgeoned
+bludgeoning
+bludgeons
+blue
+blueback
+bluebeard
+bluebell
+blueberries
+blueberry
+blueberry's
+bluebill
+bluebird
+bluebird's
+bluebirds
+bluebonnet
+bluebonnet's
+bluebonnets
+bluebook
+bluebottle
+bluebush
+bluecoat
+blued
+bluefin
+bluefish
+bluegill
+bluegrass
+blueing
+bluejack
+bluejacket
+bluely
+blueness
+bluenose
+bluepoint
+blueprint
+blueprint's
+blueprinted
+blueprinting
+blueprints
+bluer
+blues
+bluesman
+bluest
+bluestem
+bluestocking
+bluestone
+bluesy
+bluet
+bluethroat
+bluetit
+bluetongue
+blueweed
+bluey
+bluff
+bluffed
+bluffer
+bluffing
+bluffly
+bluffness
+bluffs
+bluing
+bluish
+bluishness
+Blum
+blume
+Blumenthal
+Blumenthal's
+blundell
+blunder
+blunderbuss
+blundered
+blunderer
+blundering
+blunderingly
+blunderings
+blunders
+blunge
+blunger
+blunt
+blunted
+blunter
+bluntest
+blunting
+bluntly
+bluntness
+blunts
+blur
+blur's
+blurb
+blurred
+blurredly
+blurrier
+blurrily
+blurriness
+blurring
+blurringly
+blurry
+blurs
+blurt
+blurted
+blurter
+blurting
+blurts
+blush
+blushed
+blusher
+blushes
+blushful
+blushing
+blushingly
+bluster
+blustered
+blusterer
+blustering
+blusteringly
+blusterous
+blusters
+blustery
+blutwurst
+Blvd
+blyth
+Blythe
+Blythe's
+BMW
+BNF
+boa
+boabdil
+boadicea
+Boanerges
+boar
+board
+boarded
+boarder
+boarders
+boarding
+boardinghouse
+boardinghouse's
+boardinghouses
+boardlike
+boardman
+boardmanship
+boardroom
+boards
+boardsmanship
+boardwalk
+boarfish
+boarhound
+boarish
+Boarsh
+boart
+boas
+boast
+boasted
+boaster
+boasters
+boastful
+boastfully
+boastfulness
+boasting
+boastings
+boasts
+boat
+boatbill
+boated
+boatel
+boatels
+boater
+boaters
+boathook
+boathouse
+boathouse's
+boathouses
+boating
+boatload
+boatload's
+boatloads
+boatman
+boatmanship
+boatmen
+boats
+boatsmanship
+boatswain
+boatswain's
+boatswains
+Boatwright
+boatyard
+boatyard's
+boatyards
+boaz
+bob
+bob's
+bobbed
+bobber
+bobbery
+Bobbie
+bobbies
+bobbin
+bobbin's
+bobbinet
+bobbing
+bobbins
+bobble
+bobbled
+bobbles
+bobbling
+Bobbsey
+bobbsey
+bobby
+bobbysoxer
+bobcat
+bobeche
+bobfloat
+boblet
+bobol
+bobolink
+bobolink's
+bobolinks
+bobotie
+bobowler
+Bobrow
+bobrow
+bobs
+bobsled
+bobsledder
+bobsledding
+bobsleigh
+bobstay
+bobtail
+bobtailed
+bobwhite
+bobwhite's
+bobwhites
+Boca
+Boca's
+bocaccio
+bocage
+boccaccio
+boccherini
+bocci
+boccie
+boccioni
+Boche
+bochum
+bock
+bocklogged
+bockwurst
+bod
+bodacious
+bodaciously
+bode
+boded
+bodega
+bodement
+Bodenheim
+bodenheim
+bodensee
+bodes
+bodge
+bodger
+bodgie
+bodh
+bodhisattva
+bodice
+bodied
+bodies
+bodiless
+bodily
+boding
+bodkin
+Bodleian
+bodmin
+Bodoni
+body
+bodybuild
+bodybuilder
+bodybuilder's
+bodybuilders
+bodybuilding
+bodycheck
+bodyguard
+bodyguard's
+bodyguards
+bodying
+bodysurf
+bodysurfer
+bodyweight
+bodywork
+boehmer
+boehmite
+Boeing
+Boeotia
+Boeotian
+Boer
+boer
+boethius
+boeuf
+boff
+boffin
+boffo
+boffola
+boffos
+bofors
+bog
+bog's
+bogan
+bogarde
+bogart
+Bogart
+Bogartian
+bogartian
+Bogas
+bogbean
+bogey
+bogeyed
+bogeying
+bogeyman
+bogeyman's
+bogeymen
+bogeys
+bogged
+bogging
+boggle
+boggled
+boggles
+boggling
+boggs
+boggy
+bogie
+bogies
+bogle
+bognor
+bogong
+bogor
+Bogota
+bogs
+bogtrotter
+bogus
+bogwood
+bogy
+boh
+bohea
+Boheme
+boheme
+Bohemia
+Bohemian
+Bohemianism
+bohlen
+Bohm
+bohol
+Bohr
+bohunk
+boiardo
+boies
+boil
+Boildieu
+boileau
+boiled
+boiler
+boilermaker
+boilermaker's
+boilermakers
+boilerplate
+boilers
+boiling
+boilover
+boils
+Bois
+Boise
+boisterous
+boisterously
+boisterousness
+boite
+boites
+Boito
+bokassa
+Bokhara
+bokmakierie
+bola
+boland
+bolas
+bolases
+bold
+bolder
+boldest
+boldface
+boldfaced
+boldfaces
+boldfacing
+boldly
+boldness
+bole
+bolection
+bolero
+bolet
+boletus
+boleyn
+bolide
+bolingbroke
+boliou
+bolivar
+Bolivia
+Bolivia's
+boliviano
+boll
+bollard
+bollix
+bollocks
+bollworm
+bolo
+Bologna
+Bologna's
+bolometer
+bolometer's
+bolometers
+bolometric
+bolometrically
+boloney
+bolos
+Bolshevik
+Bolshevik's
+Bolsheviks
+Bolshevism
+Bolshevism's
+Bolshevist
+Bolshevistic
+bolshevize
+Bolshie
+Bolshoi
+Bolson
+bolster
+bolstered
+bolsterer
+bolstering
+bolsters
+bolt
+bolted
+bolter
+bolting
+Bolton
+Boltonia
+boltrope
+bolts
+Boltzmann
+bolus
+bolzano
+boma
+bomb
+bombacaceous
+bombard
+bombarded
+bombardier
+bombardiers
+bombarding
+bombardment
+bombardments
+bombardon
+bombards
+bombast
+bombaster
+bombastic
+bombastically
+Bombay
+Bombay's
+bombazine
+bombe
+bombed
+bomber
+bombers
+bombinate
+bombination
+bombing
+bombings
+bombora
+bombproof
+bombs
+bombshell
+bombsight
+bombus
+bombycid
+bomu
+bon
+bona
+bonaire
+bonanza
+bonanza's
+bonanzas
+Bonaparte
+Bonapartism
+bonaventura
+Bonaventure
+bonbon
+bonce
+bond
+bondable
+bondage
+bonded
+bonder
+bonderize
+bonders
+bondholder
+bonding
+bondmaid
+bondman
+bonds
+bondservant
+bondsman
+bondsmen
+bondstone
+bondwoman
+bone
+boneblack
+boned
+bonefish
+bonehead
+boneheaded
+boneless
+boner
+boners
+bones
+boneset
+bonesetter
+boneshaker
+boney
+boneyard
+bonfiglio
+bonfire
+bonfire's
+bonfires
+bong
+bongo
+bongoes
+bongoist
+Bonham
+bonham
+bonheur
+bonhoeffer
+bonhomie
+bonier
+Boniface
+bonin
+boning
+bonism
+bonito
+bonjour
+bonkers
+Bonn
+bonnard
+bonne
+bonner
+bonnet
+bonneted
+bonnets
+Bonneville
+Bonnie
+bonnier
+bonnily
+bonnor
+bonny
+bonsai
+bonsela
+bonspiel
+bontebok
+Bontempo
+bontempo
+bonus
+bonus's
+bonuses
+bony
+Bonynge
+bonze
+bonzer
+bonzes
+boo
+boob
+boobialla
+boobies
+boobify
+booboo
+boobook
+booby
+boodle
+booger
+boogerman
+boogeyman
+boogie
+boohoo
+book
+bookbind
+bookbinder
+bookbinders
+bookbindery
+bookbinding
+bookcase
+bookcase's
+bookcases
+booked
+bookeeper
+bookend
+bookends
+booker
+bookers
+bookful
+bookie
+bookie's
+bookies
+booking
+bookings
+bookish
+bookishly
+bookishness
+bookkeep
+bookkeeper
+bookkeeper's
+bookkeepers
+bookkeeping
+booklet
+booklet's
+booklets
+booklist
+booklouse
+bookmaker
+bookmakers
+bookmaking
+bookman
+bookmark
+bookmark's
+bookmarker
+bookmarkers
+bookmarks
+bookmobile
+bookmobiles
+bookplate
+bookplates
+books
+bookseller
+bookseller's
+booksellers
+bookselling
+bookshelf
+bookshelf's
+bookshelves
+bookstall
+bookstore
+bookstore's
+bookstores
+bookworm
+bookworm's
+bookworms
+booky
+boole
+boolean
+booleans
+boom
+boomed
+boomer
+boomerang
+boomerang's
+boomerangs
+boomier
+booming
+boomkin
+boomlet
+booms
+boomslang
+boomtown
+boomtowns
+boomy
+boon
+boondocks
+boondoggle
+boondoggler
+boondoggling
+Boone
+boong
+boonies
+Boonton
+boor
+boor's
+boorish
+boorishly
+boorishness
+boors
+boos
+boost
+boosted
+booster
+boosterism
+boosting
+boosts
+boot
+bootblack
+bootblacks
+booted
+bootee
+Bootes
+booth
+boothia
+boothroyd
+booths
+bootie
+booties
+booting
+bootjack
+bootlace
+Bootle
+bootle
+bootleg
+bootlegged
+bootlegger
+bootlegger's
+bootleggers
+bootlegging
+bootlegs
+bootless
+bootlessly
+bootlessness
+bootlick
+bootlicker
+bootloader
+bootprint
+boots
+bootstrap
+bootstrap's
+bootstrapped
+bootstrapping
+bootstraps
+booty
+booze
+boozer
+boozily
+boozing
+boozy
+bop
+bophuthatswana
+bopper
+bopping
+bora
+boracic
+boracite
+borage
+boraginaceous
+borak
+borane
+borate
+borated
+borates
+borax
+borazon
+borborygmus
+Bordeaux
+bordel
+Bordelaise
+bordello
+bordello's
+bordellos
+Borden
+border
+bordereau
+bordered
+borderer
+bordering
+borderings
+borderland
+borderland's
+borderlands
+borderline
+borders
+bordure
+bore
+boreal
+Borealis
+Boreas
+borecole
+bored
+boredom
+boree
+borehole
+boreholes
+borer
+borers
+bores
+boresight
+boresights
+Borg
+borgerhout
+borges
+Borghese
+borgholm
+borgia
+borglum
+boric
+boride
+boring
+boringly
+boringness
+Boris
+borize
+borizes
+borland
+born
+borne
+Borneo
+Borneo's
+borneol
+bornholm
+bornu
+Borodin
+borodino
+boron
+Boronia
+boronic
+borosilicate
+borough
+boroughs
+Borroughs
+borrow
+borrowable
+borrowed
+borrower
+borrowers
+borrowing
+borrowings
+borrows
+bors
+borstal
+bort
+borzoi
+Bosch
+boschbok
+boschvark
+Bose
+bosh
+bosk
+boskop
+Bosky
+Bosnia
+bosom
+bosom's
+bosoms
+bosomy
+boson
+bosonic
+bosphorus
+Bosporus
+bosque
+bosquet
+boss
+bossa
+bossboy
+bossdom
+bossed
+bosses
+bossier
+bossies
+bossiness
+bossism
+bossuet
+bossy
+bostitch
+Bostitch
+Boston
+Boston's
+Bostonian
+Bostonian's
+Bostonians
+bosun
+Boswell
+Boswellize
+Boswellizes
+bosworth
+bot
+botan
+botanic
+botanical
+botanically
+botanist
+botanist's
+botanists
+botanize
+botanized
+botanizes
+botanizing
+botany
+botargo
+botch
+botched
+botcher
+botchers
+botches
+botching
+botchwork
+botchy
+botel
+botfly
+both
+botha
+bother
+botheration
+bothered
+bothering
+bothers
+bothersome
+bothnia
+bothwell
+bothy
+botryoidal
+bots
+Botswana
+Botswana's
+bott
+botticelli
+bottle
+bottlebrush
+bottlecap
+bottlecap's
+bottlecaps
+bottled
+bottleful
+bottleneck
+bottleneck's
+bottlenecks
+bottlenose
+bottler
+bottlers
+bottles
+bottling
+bottom
+bottomed
+bottomer
+bottoming
+bottomland
+bottomless
+bottomlessly
+bottomlessness
+bottommost
+bottomost
+bottomry
+bottoms
+bottrop
+botulin
+botulinal
+botulinum
+botulinus
+botulism
+botvinnik
+Boucher
+boucicault
+boucle
+boudicca
+boudoir
+bouffant
+bouffe
+bougainvillaea
+Bougainville
+bougainvillea
+bough
+bough's
+boughed
+boughs
+bought
+boughten
+Boughton
+bougie
+bouillabaisse
+bouillon
+boulanger
+boulder
+boulder's
+bouldered
+boulders
+bouldery
+boule
+boulevard
+boulevard's
+boulevardier
+boulevardize
+boulevardizes
+boulevards
+bouleversement
+boulez
+Boulez
+boulle
+Boult
+bounce
+bounced
+bouncer
+bouncers
+bounces
+bouncier
+bouncily
+bouncing
+bouncingly
+bouncy
+bound
+boundaries
+boundary
+boundary's
+bounded
+bounden
+bounder
+bounderish
+bounderishly
+bounding
+boundless
+boundlessly
+boundlessness
+bounds
+bounteous
+bounteously
+bounteousness
+bountied
+bounties
+bountiful
+bountifully
+bountifulness
+bounty
+bounty's
+bouquet
+bouquet's
+bouquets
+Bourbaki
+bourbon
+bourbonism
+bourbonize
+bourbonizes
+bourbons
+bourdon
+bourg
+bourgeois
+bourgeoise
+bourgeoisie
+bourgeoisify
+bourgeon
+bourges
+bourgogne
+bourguiba
+bourn
+Bourne
+Bourne's
+Bournemouth
+bourse
+bouse
+bousing
+boustrophedon
+bout
+bout's
+boutique
+boutiques
+bouton
+boutonniere
+bouts
+bouvardier
+Bouvet
+Bouvier
+bouvier
+bouzouki
+bovid
+bovine
+bovinely
+bovines
+bovinity
+bovril
+bovver
+bow
+bowan
+bowden
+Bowditch
+Bowditch's
+bowdlerization
+bowdlerize
+bowdlerized
+bowdlerizer
+bowdlerizes
+bowdlerizing
+Bowdoin
+bowed
+bowel
+bowel's
+boweled
+boweling
+bowelless
+bowels
+bowen
+Bowen
+Bowen's
+bower
+bowerbird
+bowerbird's
+bowerbirds
+bowers
+bowery
+bowes
+Bowes
+bowfin
+bowfront
+bowhead
+bowie
+bowing
+bowknot
+bowl
+bowlder
+bowled
+bowleg
+bowlegged
+bowler
+bowlers
+bowlful
+bowline
+bowline's
+bowlines
+bowling
+bowls
+bowman
+bowmen
+bows
+bowsaw
+bowse
+bowser
+bowshot
+bowsprit
+bowstring
+bowstring's
+bowstrings
+bowwow
+bowyangs
+bowyer
+box
+boxboard
+boxcar
+boxcar's
+boxcars
+boxed
+boxer
+boxers
+boxes
+boxfish
+Boxford
+boxful
+boxhaul
+boxier
+boxiness
+boxing
+boxlike
+boxroom
+boxthorn
+boxwood
+boxy
+boy
+boy's
+boyar
+boyard
+boyars
+Boyce
+boycott
+boycotted
+boycotter
+boycotting
+boycotts
+Boyd
+Boyd's
+boyer
+boyfriend
+boyfriend's
+boyfriends
+boyhood
+boyish
+boyishly
+boyishness
+boyla
+Boyle
+Boyle's
+Boylston
+Boylston's
+boyne
+boyoma
+boys
+boysenberry
+boz
+Bozcaada
+bozen
+bozo
+bozos
+BP
+bpi
+bra
+bra's
+Braata
+brabant
+brabble
+brabbled
+brabbling
+brace
+braced
+bracelet
+bracelet's
+bracelets
+bracer
+braces
+brach
+brachia
+brachial
+brachiate
+brachiopod
+Brachiosaurus
+brachium
+brachycephalic
+brachydactylic
+brachylogy
+brachypterous
+brachyuran
+bracing
+bracken
+bracket
+bracketed
+bracketing
+brackets
+brackish
+brackishness
+bracknell
+bract
+bracteate
+bracteole
+brad
+bradawl
+Bradbury
+bradded
+bradding
+Bradford
+Bradley
+bradman
+Bradshaw
+Brady
+bradycardia
+bradykinin
+brae
+brae's
+braes
+brag
+braga
+Bragg
+braggadocio
+braggart
+bragged
+bragger
+braggest
+bragging
+braggy
+Bragi
+brags
+brahe
+brahma
+Brahman
+Brahmana
+Brahmani
+Brahmanism
+Brahmaputra
+Brahmin
+Brahms
+Brahmsian
+Brahui
+braid
+braided
+braider
+braiding
+braids
+brail
+braille
+Brailler
+Braillers
+braillewriter
+Braillewriters
+braillex
+braillink
+braillo
+brailtel
+brain
+Brainard
+Brainards
+braincase
+brainchild
+brainchild's
+brainchildren
+brained
+brainier
+braininess
+braining
+brainish
+brainless
+brainlessly
+brainlessness
+brainpan
+brainpower
+brains
+brainsick
+brainsickly
+brainstem
+brainstem's
+brainstems
+brainstorm
+brainstorm's
+brainstormer
+brainstorming
+brainstorms
+brainteaser
+brainwash
+brainwashed
+brainwasher
+brainwashes
+brainwashing
+brainy
+braise
+braised
+braiser
+braises
+braising
+brake
+braked
+brakeless
+brakeman
+brakemen
+brakemen's
+brakes
+brakesman
+braking
+brakpan
+braky
+bramante
+bramble
+bramble's
+brambles
+brambling
+brambly
+bramley
+bran
+branch
+branched
+branches
+branchia
+branchial
+branchiate
+branching
+branchings
+branchiopod
+branchless
+branchlet
+Branchville
+branchy
+brancusi
+brand
+branded
+Brandeis
+brandel
+Brandel
+Brandenburg
+brander
+brandied
+brandies
+brandin
+branding
+brandish
+brandishes
+brandishing
+brandling
+brando
+Brandon
+brands
+Brandt
+Brandt's
+brandy
+brandying
+brandywine
+Braniff
+brank
+branks
+branle
+Brannon
+brannon
+brant
+Brantford
+brants
+branum
+braque
+braques
+bras
+brasenose
+brash
+brashly
+brashness
+brashy
+brasier
+brasil
+brasilein
+Brasilia
+brasilin
+brass
+brassard
+brassbound
+brassed
+brasserie
+brasses
+brassica
+brassie
+brassier
+brassiere
+brassily
+brassiness
+Brasstown
+brassy
+brat
+brat's
+bratislava
+brats
+brattice
+brattiness
+brattish
+brattishing
+brattle
+brattled
+brattling
+bratty
+bratwurst
+Braun
+braunite
+braunschweig
+brava
+bravado
+bravais
+brave
+braved
+bravely
+braveness
+braver
+bravery
+braves
+bravest
+braving
+bravissimo
+bravo
+bravoed
+bravoes
+bravoing
+bravos
+bravura
+braw
+braweling
+brawl
+brawle
+brawled
+brawler
+brawlier
+brawling
+brawls
+brawly
+brawn
+brawnier
+brawnily
+brawniness
+brawny
+braxy
+bray
+brayed
+brayer
+braying
+brays
+braze
+brazed
+brazen
+brazened
+brazening
+brazenly
+brazenness
+brazer
+brazes
+brazier
+brazier's
+braziers
+Brazil
+Brazil's
+Brazilian
+Brazilian's
+brazils
+brazing
+brazos
+Brazzaville
+breach
+breached
+breacher
+breachers
+breaches
+breaching
+bread
+breadbasket
+breadbaskets
+breadboard
+breadboard's
+breadboards
+breaded
+breadfruit
+breadfruits
+breading
+breadline
+breadmaking
+breadnut
+breadnuts
+breadroot
+breads
+breadstuff
+breadth
+breadthways
+breadthwise
+breadwinner
+breadwinner's
+breadwinners
+breadwinning
+break
+breakable
+breakables
+breakage
+breakaway
+breakbone
+breakdown
+breakdown's
+breakdowns
+breaker
+breakers
+breakeven
+breakfast
+breakfasted
+breakfaster
+breakfasters
+breakfasting
+breakfasts
+breakfront
+breaking
+breakneck
+breakoff
+breakout
+breakpoint
+breakpoint's
+breakpointed
+breakpointing
+breakpoints
+breaks
+breakthrough
+breakthrough's
+breakthroughes
+breakthroughs
+breakup
+breakups
+breakwater
+breakwater's
+breakwaters
+bream
+breams
+breast
+breastbone
+breasted
+breastfed
+breastfeed
+breastfeeding
+breasting
+breastpin
+breastplate
+breasts
+breaststroke
+breaststroker
+breastwork
+breastwork's
+breastworks
+breath
+breathability
+breathable
+breathalyse
+breathalyzer
+breathe
+breathed
+breather
+breathers
+breathes
+breathier
+breathing
+breathless
+breathlessly
+breathlessness
+breaths
+breathtaking
+breathtakingly
+breathy
+breccia
+breccias
+brecciate
+brecciation
+brecht
+brecon
+Breconshire
+bred
+breda
+brede
+bree
+breech
+breech's
+breechblock
+breechcloth
+breechclout
+breeches
+breeching
+breechloader
+breed
+breeder
+breeding
+breeds
+breeks
+breenger
+breeze
+breeze's
+breezed
+breezeless
+breezes
+breezeway
+breezier
+breezily
+breeziness
+breezing
+breezy
+bregenz
+bregma
+bregmatic
+brekky
+Bremen
+Bremen's
+Bremerhaven
+bremsstrahlung
+Brenda
+Brendan
+Brendan's
+Brendel
+Brennan
+Brennan's
+Brenner
+Brenner's
+Brent
+Brentano
+Brentwood
+Brescia
+Bresenham
+Bresenham's
+Breslau
+Bresson
+Brest
+Brest's
+Bretagne
+brethren
+Breton
+Brett
+Brett's
+Bretton
+Breuer
+Breughel
+breve
+breves
+brevet
+breveted
+breveting
+brevets
+breviaries
+breviary
+brevier
+brevity
+brew
+brewage
+brewed
+brewer
+breweries
+brewers
+brewery
+brewery's
+brewing
+brewis
+brews
+Brewster
+Brewster's
+brey
+brezhnev
+Brian
+briand
+briar
+briar's
+briard
+Briareus
+briarroot
+briars
+bribable
+bribe
+bribed
+briber
+bribers
+bribery
+bribes
+bribing
+bricating
+Brice
+brick
+brickbat
+bricked
+bricker
+bricking
+bricklay
+bricklayer
+bricklayer's
+bricklayers
+bricklaying
+brickle
+brickmason
+brickmasons
+bricks
+bricktop
+brickwork
+brickyard
+bricole
+bridal
+bride
+bride's
+bridegroom
+brides
+bridesmaid
+bridesmaid's
+bridesmaids
+Bridewell
+bridewell
+bridge
+bridgeable
+bridgeboard
+bridged
+Bridgeford
+bridgehead
+bridgehead's
+bridgeheads
+bridgeless
+Bridgeman
+Bridgeport
+bridges
+Bridget
+Bridget's
+Bridgetown
+Bridgewater
+bridgework
+bridgework's
+bridging
+bridie
+bridle
+bridled
+bridles
+bridlewise
+bridling
+bridoon
+Brie
+brie
+brief
+briefcase
+briefcase's
+briefcases
+briefed
+briefer
+briefest
+briefing
+briefing's
+briefings
+briefless
+briefly
+briefness
+briefs
+Brien
+brien
+brier
+brierroot
+briery
+brig
+brig's
+brigade
+brigade's
+brigaded
+brigades
+brigadier
+brigadier's
+brigadiers
+brigading
+brigadoon
+Brigadoon
+brigalow
+brigand
+brigand's
+brigandage
+brigandine
+brigandism
+brigands
+brigantine
+Briggs
+Briggs's
+Brigham
+brighouse
+Bright
+bright
+brighten
+brightened
+brightener
+brighteners
+brightening
+brightens
+brighter
+brightest
+brighting
+brightly
+brightness
+brightnesses
+Brighton
+Brighton's
+brights
+brightside
+brightwork
+Brigid
+brigs
+brill
+brilliance
+brilliancy
+brilliant
+brilliantine
+brilliantly
+brilliantness
+Brillouin
+brim
+brimful
+brimless
+brimmed
+brimmer
+brimming
+brimstone
+brinded
+Brindisi
+brindle
+brindled
+brine
+brinell
+briner
+bring
+bringdown
+bringer
+bringers
+bringing
+brings
+brinier
+brininess
+brining
+brinjal
+brink
+Brinkley
+brinkley
+brinkmanship
+brinksmanship
+brinny
+briny
+brio
+brioche
+briolette
+briony
+briquet
+briquette
+brisance
+brisant
+Brisbane
+Brisbane's
+brisk
+brisker
+brisket
+briskly
+briskness
+brisling
+brist
+bristle
+bristlecone
+bristlecone's
+bristlecones
+bristled
+bristlelike
+bristles
+bristletail
+bristlier
+bristling
+bristly
+bristol
+bristols
+brit
+Britain
+Britain's
+Britannia
+Britannic
+Britannica
+britches
+Briticism
+British
+Britisher
+Britishism
+Britishly
+Briton
+Briton's
+Britons
+Brittany
+Britten
+Britten's
+brittle
+brittled
+brittlely
+brittleness
+brittler
+brittlest
+brittling
+brittonic
+britzka
+brix
+Brixton
+Brno
+broach
+broached
+broacher
+broaches
+broaching
+broad
+broadax
+broadband
+broadbill
+Broadbrim
+broadcast
+broadcasted
+broadcaster
+broadcasters
+broadcasting
+broadcastings
+broadcasts
+broadcloth
+broaden
+broadened
+broadener
+broadeners
+broadening
+broadenings
+broadens
+broader
+broadest
+broadleaf
+broadloom
+broadly
+broadminded
+broadmoor
+broadness
+broads
+broadsheet
+broadside
+broadsword
+broadtail
+Broadway
+broadwife
+broca
+brocade
+brocaded
+brocatelle
+broccoli
+broch
+brochette
+brochure
+brochure's
+brochures
+Brock
+brockage
+brocken
+brocket
+brockle
+brocoli
+broddle
+broderie
+broederbond
+brogan
+Broglie
+Broglie's
+brogue
+broider
+broidery
+broil
+broiled
+broiler
+broilers
+broiling
+broils
+broke
+broken
+brokenhearted
+brokenly
+brokenness
+broker
+brokerage
+brokers
+brolga
+brollies
+brolly
+bromal
+bromate
+bromated
+bromating
+Bromberg
+brome
+bromegrass
+bromeliad
+bromelin
+bromeosin
+Bromfield
+Bromfield's
+bromic
+bromide
+bromide's
+bromides
+bromidic
+brominate
+bromination
+bromine
+bromines
+brominize
+brominizes
+bromism
+Bromley
+Bromley's
+bromo
+bromoform
+bromos
+bromsgrove
+bronc
+bronchi
+bronchia
+bronchial
+bronchialy
+bronchiectasis
+bronchiolar
+bronchiole
+bronchiole's
+bronchioles
+bronchiolitis
+bronchitis
+bronchopneumonia
+bronchoscope
+bronchus
+bronco
+broncobuster
+broncos
+broncs
+brontosaur
+brontosaurus
+Bronx
+bronze
+bronzed
+bronzer
+bronzes
+bronzing
+bronzy
+brooch
+brooch's
+brooches
+brood
+brooder
+broodiness
+brooding
+broodingly
+broods
+broody
+brook
+Brookdale
+Brooke
+brooked
+Brookfield
+Brookhaven
+brookite
+brooklet
+brooklime
+Brookline
+Brookline's
+Brooklyn
+Brookmont
+brooks
+brookside
+brookweed
+broom
+broom's
+broomball
+broomballer
+broomcorn
+broome
+broomed
+broomgrove
+broomhill
+brooming
+broomrape
+brooms
+broomstick
+broomstick's
+broomsticks
+broonzy
+brose
+broth
+brothel
+brothel's
+brothels
+brother
+brother's
+brotherhood
+brotherliness
+brotherly
+brothers
+broths
+brougham
+broughams
+brought
+brouhaha
+broun
+brow
+brow's
+browband
+browbeat
+browbeaten
+browbeating
+browbeats
+brown
+Brown
+Browne
+browned
+Brownell
+browner
+brownest
+Brownian
+brownie
+brownie's
+brownies
+browning
+brownings
+brownish
+brownly
+brownness
+brownnose
+brownnoser
+brownout
+browns
+brownshirt
+brownstone
+brownstones
+browny
+brows
+browsability
+browse
+browsed
+browser
+browsers
+browses
+browsing
+broxodent
+broz
+brubeck
+Bruce
+brucellosis
+Bruch
+brucine
+Bruckner
+Bruckner's
+Bruegel
+Bruegel's
+bruges
+bruin
+bruise
+bruised
+bruiser
+bruisers
+bruises
+bruising
+bruit
+Brule
+brumal
+brumby
+brume
+Brumidi
+Brumidi's
+Brummagem
+brummell
+brummie
+brunch
+brunches
+brundisium
+Brunei
+brunel
+Brunelle
+brunelleschi
+brunet
+brunette
+brunettes
+brunhild
+Brunhilde
+Bruno
+Brunswick
+Brunswick's
+brunt
+brusa
+brush
+brushability
+brushback
+brushcut
+brushed
+brusher
+brushes
+brushfire
+brushfire's
+brushfires
+brushier
+brushing
+brushland
+brushless
+brushlike
+brushstroke
+brushstroke's
+brushstrokes
+brushup
+brushwood
+brushwork
+brushy
+brusk
+Bruson
+brusque
+brusquely
+brusqueness
+brusquerie
+Brussels
+brut
+brutal
+brutalities
+brutality
+brutalization
+brutalization's
+brutalizations
+brutalize
+brutalized
+brutalizes
+brutalizing
+brutally
+brute
+brute's
+brutes
+brutify
+brutish
+brutishly
+brutishness
+Brutus
+bruxelles
+Bruxelles
+bruxism
+Bryan
+Bryansk
+Bryant
+Bryce
+Bryn
+brynhild
+bryology
+bryony
+bryophyta
+bryophyte
+bryozoa
+bryozoan
+Brython
+Brythonic
+BS
+bs
+BSD
+btu
+BTW
+bub
+bubal
+bubaline
+bubble
+bubbled
+bubbler
+bubbles
+bubblier
+bubbling
+bubbly
+bubby
+buber
+Bubo
+bubonic
+bubonocele
+bucaramanga
+buccal
+buccaneer
+buccaneer's
+buccaneerish
+buccaneers
+buccinator
+bucentaur
+Bucephalus
+bucer
+buchan
+Buchanan
+Bucharest
+Buchenwald
+Buchenwald's
+Buchmanism
+buchner
+buchu
+Buchwald
+buck
+buckaroo
+buckaroos
+buckbean
+buckboard
+buckboard's
+buckboards
+bucked
+buckeen
+bucker
+buckeroo
+bucket
+bucket's
+bucketed
+bucketful
+bucketful's
+bucketfuls
+bucketing
+buckets
+bucketsful
+buckeye
+buckhead
+buckhorn
+buckhound
+bucking
+Buckingham
+Buckinghamshire
+buckish
+buckjumper
+buckle
+buckled
+buckler
+buckles
+Buckley
+Buckley's
+buckling
+buckman
+Bucknell
+Bucknell's
+bucko
+buckoes
+buckra
+buckram
+bucks
+bucksaw
+buckshee
+buckshot
+buckskin
+buckskins
+bucktail
+buckthorn
+bucktooth
+buckwheat
+bucky
+Bucky
+bucolic
+bucolically
+bucovina
+bud
+bud's
+Budapest
+Budd
+budded
+budder
+Buddha
+Buddhism
+Buddhist
+Buddhists
+buddies
+budding
+buddle
+Buddleia
+buddy
+buddy's
+budge
+budged
+budgerigar
+budges
+budget
+budgetary
+budgeted
+budgeteer
+budgeter
+budgeters
+budgeting
+budgets
+budgetted
+budgetting
+budgie
+budging
+budlong
+buds
+budweis
+Budweiser
+Budweisers
+Buehring
+Buehring's
+Buena
+Buenaventura
+Bueno
+Buenos
+buff
+buff's
+buffalo
+buffaloes
+buffer
+buffer's
+buffered
+bufferer
+bufferer's
+bufferers
+buffering
+bufferred
+buffers
+buffet
+buffeted
+buffeting
+buffetings
+buffets
+buffi
+buffing
+bufflehead
+buffo
+buffon
+buffoon
+buffoon's
+buffoonery
+buffoonish
+buffoons
+buffos
+buffs
+bug
+bug's
+bugaboo
+buganda
+Bugatti
+bugatti
+bugbane
+bugbear
+bugbears
+bugeye
+bugeyed
+bugged
+bugger
+bugger's
+buggered
+buggering
+buggers
+buggery
+buggies
+bugging
+buggy
+buggy's
+bughouse
+bugle
+bugled
+bugler
+bugles
+bugleweed
+bugling
+bugloss
+bugong
+bugs
+bugseed
+buhl
+buibui
+Buick
+build
+builded
+builder
+builders
+building
+building's
+buildings
+builds
+buildup
+buildup's
+buildups
+built
+builtin
+buitenzorg
+Bujumbura
+bukavu
+bukhara
+bukharin
+bukovina
+bul
+bulawayo
+bulb
+bulb's
+bulba
+Bulba
+bulbaceous
+bulbar
+bulbed
+bulbiferous
+bulbil
+bulblet
+bulbous
+bulbously
+bulbs
+bulbul
+bulganin
+Bulgar
+Bulgaria
+Bulgarian
+bulge
+bulged
+bulges
+bulginess
+bulging
+bulgur
+bulgy
+bulimia
+bulk
+bulked
+bulkhead
+bulkhead's
+bulkheaded
+bulkheads
+bulkier
+bulkily
+bulkiness
+bulks
+bulky
+bull
+bulla
+bullace
+bullae
+bullbaiting
+bullbat
+bulldog
+bulldog's
+bulldogger
+bulldogs
+bulldoze
+bulldozed
+bulldozer
+bulldozers
+bulldozes
+bulldozing
+bulle
+bulled
+bullet
+bullet's
+bulletin
+bulletin's
+bulletins
+bulletproof
+bulletproofed
+bulletproofing
+bulletproofs
+bullets
+bullfight
+bullfighter
+bullfighting
+bullfinch
+bullfrog
+bullhead
+bullheaded
+bullheadedly
+bullheadedness
+bullhide
+bullhorn
+bullied
+bullies
+bulling
+bullion
+bullish
+bullishly
+bullishness
+bullnecked
+bulloch
+bullock
+bullocky
+bullous
+bullpen
+bullpout
+bullring
+bullroarer
+bullrush
+bullrush's
+bullrushes
+bulls
+bullseye
+bullshit
+bullterrier
+bullwhack
+bullwhackers
+bullwhip
+bully
+bullyboy
+bullyboys
+bullying
+bullyrag
+bulnbuln
+bulrush
+bulwark
+bum
+bum's
+bumbailiff
+bumbershoot
+bumble
+bumblebee
+bumblebee's
+bumblebees
+bumbled
+Bumbledom
+bumbler
+bumblers
+bumbles
+bumbling
+bumblingly
+bumboat
+bumbry
+Bumbry
+bumf
+bumkin
+bummaree
+bummed
+bummer
+bummers
+bumming
+bump
+bumped
+bumper
+bumpers
+bumph
+bumpier
+bumpily
+bumpiness
+bumping
+bumpkin
+bumpkin's
+bumpkinish
+bumpkinly
+bumpkins
+bumps
+bumptious
+bumptiously
+bumptiousness
+bumpy
+bums
+bumsucking
+bun
+bun's
+Buna
+bunch
+bunche
+bunched
+bunches
+bunchily
+bunching
+bunchy
+bunco
+buncombe
+bund
+Bundaberg
+bundelkhand
+bundesrat
+Bundestag
+bundh
+bundist
+bundle
+bundled
+bundler
+bundles
+bundling
+bundobust
+Bundoora
+bundoora
+Bundu
+bundy
+Bundy
+bung
+bungalow
+bungalow's
+bungalows
+bunger
+bunghole
+bungle
+bungled
+bungler
+bunglers
+bungles
+bunglesome
+bungling
+bunglingly
+bunin
+bunion
+bunion's
+bunions
+bunk
+bunked
+bunker
+bunker's
+bunkered
+bunkering
+bunkers
+bunkhouse
+bunkhouse's
+bunkhouses
+bunking
+bunkmate
+bunkmate's
+bunkmates
+bunko
+bunkos
+bunks
+bunkum
+bunnies
+bunny
+bunny's
+bunraku
+buns
+Bunsen
+Bunsen's
+Bunsens
+bunt
+buntal
+bunted
+bunter
+bunters
+bunting
+buntline
+bunts
+Bunyan
+Bunyan's
+bunyip
+buonaparte
+buonarroti
+buoy
+buoyage
+buoyance
+buoyancy
+buoyant
+buoyantly
+buoyed
+buoying
+buoys
+buprestid
+bur
+buran
+buraydah
+burbage
+burbank
+Burbank
+Burbank's
+Burberry
+burble
+burbled
+burbler
+burbles
+burbling
+burbly
+burbot
+Burch
+burden
+burden's
+burdened
+burdening
+burdens
+burdensome
+burdensomely
+burdensomeness
+burdock
+bureau
+bureau's
+bureaucracies
+bureaucracy
+bureaucracy's
+bureaucrat
+bureaucrat's
+bureaucratic
+bureaucratically
+bureaucratization
+bureaucratization's
+bureaucratizations
+bureaucratize
+bureaucratized
+bureaucratizes
+bureaucrats
+bureaus
+bureaux
+buret
+burette
+burettes
+burg
+burgage
+burgas
+burgee
+burgeon
+burgeoned
+burgeoning
+burgeons
+burger
+burgers
+burgess
+burgess's
+burgesses
+burgher
+burgher's
+burghers
+burghley
+burglar
+burglar's
+burglaries
+burglarious
+burglariously
+burglarize
+burglarized
+burglarizes
+burglarizing
+burglarproof
+burglarproofed
+burglarproofing
+burglarproofs
+burglars
+burglary
+burglary's
+burgle
+burgled
+burgles
+burgling
+burgomaster
+burgomasters
+burgonet
+burgoo
+burgoos
+Burgos
+Burgoyne
+burgrave
+Burgundian
+Burgundies
+Burgundy
+burhel
+burial
+buried
+burier
+buries
+burin
+burk
+burka
+Burke
+Burkes
+Burkina
+burking
+burl
+burladero
+burlap
+burle
+burled
+burleigh
+burler
+burlesque
+burlesqued
+burlesquely
+burlesquer
+burlesques
+burlesquing
+burley
+burlier
+burlily
+burliness
+burlingame
+Burlingame
+Burlington
+Burlington's
+burly
+Burma
+Burmese
+burn
+burnable
+burne
+Burne
+burned
+burner
+burners
+burnes
+Burnes
+burnet
+Burnett
+burney
+Burnham
+burning
+burningly
+burnings
+burnish
+burnished
+burnisher
+burnishes
+burnishing
+burnley
+burnoose
+burnous
+burnout
+burns
+Burnside
+Burnsides
+burnt
+burntly
+burntness
+buroo
+burp
+burped
+burping
+burps
+burr
+burr's
+burrawang
+burred
+burrer
+burrier
+burro
+burro's
+burros
+Burroughs
+burrow
+burrowed
+burrower
+burrowing
+burrows
+burrs
+burrstone
+burry
+bursa
+bursae
+bursal
+bursar
+bursarial
+bursary
+bursas
+burse
+burseed
+Burseraceous
+bursiform
+bursitis
+burst
+bursted
+burster
+bursting
+burstone
+bursts
+bursty
+Burt
+burthen
+Burton
+Burtt
+Burtt's
+Burundi
+burweed
+bury
+buryat
+burying
+bus
+busbar
+busbies
+busboy
+busboy's
+busboys
+busby
+Busch
+bused
+busera
+buses
+bush
+bushbaby
+bushbuck
+bushbucks
+bushcraft
+bushed
+bushel
+bushel's
+bushelage
+busheled
+busheler
+bushelers
+busheling
+bushelings
+bushelman
+bushels
+bushes
+bushfire
+bushhammer
+bushido
+bushie
+bushier
+bushily
+bushiness
+bushing
+bushings
+Bushire
+bushland
+bushland's
+bushman
+bushmaster
+Bushnell
+bushpig
+bushranger
+bushtit
+bushveld
+bushwhack
+bushwhacked
+bushwhacker
+bushwhacking
+bushwhacks
+bushwheel
+bushy
+busied
+busier
+busies
+busiest
+busily
+business
+business's
+businesses
+businesslike
+businessman
+businessmen
+businesswoman
+businesswoman's
+businesswomen
+busing
+busk
+busker
+buskin
+busload
+busload's
+busloads
+busoni
+busra
+buss
+bussed
+busses
+bussing
+bust
+bustard
+bustard's
+bustards
+busted
+bustee
+buster
+busting
+bustle
+bustled
+bustling
+bustlingly
+busts
+busty
+busuuti
+busy
+busybody
+busying
+busyness
+busywork
+but
+butadiene
+butane
+butanol
+butanone
+butat
+butch
+butcher
+butcher's
+butcherbird
+butchered
+butcherer
+butchering
+butcherly
+butchers
+butchery
+Bute
+butene
+butenedioic
+buteo
+butler
+butler's
+butlers
+butskellism
+butskellite
+butt
+butt's
+butte
+butted
+butter
+butterball
+butterbur
+buttercup
+buttered
+butterer
+butterers
+butterfat
+Butterfield
+butterfingered
+butterfingers
+butterfish
+butterflies
+butterfly
+butterfly's
+butterflyer
+butterine
+buttering
+butterless
+Buttermere
+buttermilk
+butternut
+butters
+butterscotch
+butterweed
+butterwort
+Butterworth
+buttery
+buttes
+butties
+butting
+buttinski
+buttinsky
+buttock
+buttock's
+buttocks
+button
+buttonball
+buttonbush
+buttoned
+buttoner
+buttonhole
+buttonhole's
+buttonholer
+buttonholes
+buttonhook
+buttoning
+buttonless
+buttonmould
+buttons
+buttonweed
+buttonwood
+buttony
+buttress
+buttressed
+buttresses
+buttressing
+Buttrick
+butts
+buttstock
+butty
+butung
+butut
+butyl
+butylate
+butylation
+butylene
+butyraceous
+butyral
+butyraldehyde
+butyrate
+butyric
+butyrin
+buxom
+buxomly
+buxomness
+Buxtehude
+Buxtehude's
+Buxton
+buy
+buyer
+buyer's
+buyers
+buying
+buys
+buzz
+buzzard
+buzzard's
+buzzards
+buzzed
+buzzer
+buzzes
+buzzing
+buzzsaw
+buzzword
+buzzword's
+buzzwords
+buzzy
+bwana
+by
+Bydgoszcz
+bye
+byelaw
+byelaws
+Byelorussian
+Byelostok
+byelovo
+byers
+byes
+bygone
+bygones
+byinge
+bylaw
+bylaw's
+bylaws
+byline
+byline's
+byliner
+bylines
+bylot
+byname
+byng
+bypass
+bypassed
+bypasses
+bypassing
+bypast
+bypath
+byplay
+byproduct
+byproduct's
+byproducts
+Byrd
+byre
+Byrne
+byrnie
+byroad
+Byron
+Byron's
+Byronic
+Byronism
+Byronize
+Byronizes
+byssinosis
+byssus
+bystander
+bystander's
+bystanders
+bystreet
+byte
+byte's
+bytes
+bytom
+byway
+byways
+byword
+byword's
+bywords
+Byzantine
+Byzantinize
+Byzantinizes
+Byzantium
+CA
+cab
+cab's
+cabal
+cabala
+cabalism
+cabalist
+cabalistic
+Caballe
+caballed
+caballero
+caballing
+cabals
+cabana
+cabanas
+cabanatuan
+cabaret
+cabarets
+cabbage
+cabbage's
+cabbaged
+cabbages
+cabbageworm
+cabbaging
+cabbala
+cabbie
+cabbies
+cabby
+cabdriver
+cabdrivers
+caber
+cabezon
+cabimas
+cabin
+cabin's
+Cabinda
+cabinet
+cabinet's
+cabinetmaker
+cabinetmaker's
+cabinetmakers
+cabinetmaking
+cabinetry
+cabinets
+cabinetwork
+cabins
+cable
+cabled
+cablegram
+cablegram's
+cablegrams
+cables
+cablet
+cableway
+cabling
+cabman
+cabob
+cabochon
+caboodle
+caboose
+cabora
+Cabot
+Cabot's
+cabotage
+cabral
+cabretta
+cabrilla
+cabriole
+cabriolet
+cabs
+cabstand
+cacao
+cacciatore
+cachalot
+cache
+cache's
+cachectic
+cached
+cachepot
+cacher
+caches
+cachet
+cachexia
+caching
+cachinnate
+cachou
+cachucha
+cacique
+caciquism
+cackle
+cackled
+cackler
+cackles
+cackling
+cackly
+CACM
+cacodemon
+cacodemonic
+cacodyl
+cacoepy
+cacoethes
+cacogenesis
+cacogenic
+cacogenics
+cacographical
+cacography
+cacology
+cacomistle
+cacophonist
+cacophonous
+cacophonously
+cacophony
+cacti
+cactus
+cactuses
+cacuminal
+cad
+cadaster
+cadastral
+cadastrally
+cadastre
+cadaver
+cadaveric
+cadaverine
+cadaverize
+cadaverizes
+cadaverous
+cadaverously
+caddie
+caddies
+caddis
+caddish
+caddishly
+caddishness
+Caddoan
+caddy
+cade
+cadelle
+cadence
+cadenced
+cadences
+cadencing
+cadency
+cadent
+cadential
+cadenza
+cadet
+cadetship
+cadge
+cadged
+cadger
+cadges
+cadging
+cadi
+Cadillac
+Cadillacs
+Cadmean
+cadmium
+cadmiumize
+cadmiumizes
+Cadmus
+cadre
+caducean
+caduceus
+caducity
+caducous
+Cady
+caecilian
+caecum
+Caelian
+Caelum
+caen
+caenozoic
+caeoma
+caerleon
+caernarfon
+Caernarvonshire
+Caerphilly
+caesalpiniaceous
+Caesar
+caesaraugusta
+caesarea
+Caesarean
+Caesarian
+Caesarian's
+Caesarism
+Caesarize
+Caesarizes
+caesium
+caespitose
+caesura
+caetano
+cafard
+cafe
+cafe's
+cafes
+cafeteria
+cafeteria's
+cafeterias
+caff
+caffeine
+caffeine's
+caffeinic
+caftan
+cage
+caged
+cageling
+cager
+cagers
+cages
+cagey
+cageyness
+cagier
+cagily
+caginess
+caging
+cagliari
+cagliostro
+cagmag
+cagney
+cagoule
+cagoules
+cagy
+cahier
+Cahill
+Cahokia
+cahoot
+cahoots
+caiaphas
+Caicos
+caiman
+Cain
+Caine
+cainogenesis
+cainozoic
+caird
+cairn
+cairned
+cairngorm
+cairns
+Cairo
+caisson
+caithness
+caitiff
+caius
+cajeput
+cajole
+cajoled
+cajolement
+cajoler
+cajolery
+cajoles
+cajoling
+Cajun
+Cajun's
+Cajuns
+cajuput
+cake
+caked
+cakes
+cakewalk
+cakewalker
+caking
+Cal
+Calabar
+calabash
+calaboose
+calabria
+Caladium
+Calais
+calalu
+calamanco
+calamine
+calamint
+calamite
+calamities
+calamitous
+calamitously
+calamitousness
+calamity
+calamity's
+calamondin
+calamus
+calandria
+calash
+calathus
+calaverite
+calcaneal
+calcaneum
+calcaneus
+calcar
+calcareous
+calcareously
+calcareousness
+calcariferous
+calceiform
+calces
+calchas
+calcic
+calcicole
+calciferol
+Calciferous
+calcific
+calcification
+calcified
+calcifuge
+calcifugous
+calcify
+calcimine
+calcination
+calcine
+calcined
+calcining
+calcinosis
+calcite
+calcitic
+calcitonin
+calcium
+CalComp
+calcomp
+calcsinter
+calculability
+calculable
+calculableness
+calculably
+calculate
+calculated
+calculatedly
+calculatedness
+calculates
+calculating
+calculatingly
+calculation
+calculational
+calculations
+calculative
+calculator
+calculator's
+calculators
+calculi
+calculous
+calculus
+Calcutta
+Calcutta's
+caldarium
+Calder
+caldera
+caldron
+Caldwell
+Caldwell's
+Caleb
+Caleb's
+caleche
+Caledonia
+Caledonian
+calefacient
+calefactory
+calendar
+calendar's
+calendared
+calendaring
+calendars
+calender
+calenderer
+calendric
+calendrical
+calends
+calendula
+calenture
+calf
+calflike
+calfs
+calfskin
+Calgary
+Calhoun
+Calhoun's
+cali
+Caliban
+caliber
+calibers
+calibrate
+calibrated
+calibrater
+calibrates
+calibrating
+calibration
+calibrations
+calibrator
+calibrators
+calices
+caliche
+calicle
+calico
+Calicut
+calif
+Calif
+califate
+California
+California's
+Californian
+Californian's
+Californians
+californium
+caliginous
+Caligula
+caligula
+calimere
+calipash
+calipee
+caliper
+calipers
+caliph
+caliphal
+caliphate
+caliphs
+calisaya
+calisthenic
+calisthenics
+calix
+calk
+calker
+Calkins
+call
+calla
+callable
+Callaghan
+Callaghan's
+Callahan
+Callahan's
+callais
+Callan
+Callan's
+callant
+callao
+Callas
+callback
+callboy
+called
+callee
+callee's
+caller
+caller's
+callers
+callicrates
+calligraph
+calligrapher
+calligraphers
+calligraphic
+calligraphically
+calligraphist
+calligraphy
+callimachus
+calling
+calliope
+Calliopsis
+callipash
+callipygian
+callisthenics
+Callisto
+callose
+callosity
+callous
+calloused
+callously
+callousness
+callow
+callowness
+calls
+callus
+calluses
+calm
+calmative
+calmed
+calmer
+calmest
+calming
+calmingly
+calmly
+calmness
+calms
+calomel
+calor
+caloric
+calorically
+calorie
+calorie's
+calories
+calorific
+calorimeter
+calorimeter's
+calorimeters
+calorimetric
+calorimetrically
+calorimetry
+calory
+calotte
+caloyer
+calpe
+calque
+caltanissetta
+Caltech
+caltech
+calthrop
+caltrop
+caltrops
+Calumet
+calumniate
+calumniated
+calumniation
+calumniator
+calumnious
+calumniously
+calumny
+calutron
+Calvados
+calvaria
+calvary
+calve
+Calvert
+Calvert's
+calves
+Calvin
+Calvin's
+calving
+Calvinism
+Calvinist
+Calvinize
+Calvinizes
+calvities
+calx
+calyces
+calycine
+calycle
+Calydonian
+calypso
+calypsonian
+calyptra
+calyptrogen
+calyx
+cam
+camail
+camaraderie
+camarilla
+camass
+cambay
+camber
+cambered
+cambering
+camberwell
+cambial
+cambist
+cambium
+Cambodia
+camboose
+cambrai
+cambrel
+cambria
+Cambrian
+cambric
+Cambridge
+Cambridge's
+Cambridgeshire
+cambyses
+Camden
+Camden's
+came
+camel
+camel's
+camelback
+cameleer
+camelia
+camellia
+camellias
+camelopard
+Camelopardus
+Camelot
+camels
+Camembert
+Camenae
+cameo
+cameos
+camera
+camera's
+cameral
+cameralism
+cameralist
+cameraman
+cameramen
+cameras
+camerlengo
+Cameron
+Cameron's
+Cameroon
+Cameroun
+Cameroun's
+camiknickers
+Camilla
+Camille
+Camino
+camion
+camisado
+camise
+camisole
+caml
+camlet
+camomile
+camoodi
+camorra
+camorrista
+camouflage
+camouflageable
+camouflaged
+camouflages
+camouflagic
+camouflaging
+camp
+campagna
+campaign
+campaigned
+campaigner
+campaigners
+campaigning
+campaigns
+campania
+campanile
+campanologist
+campanology
+campanula
+campanulaceous
+campanulate
+Campbell
+Campbellsport
+campcraft
+campeche
+camped
+camper
+campers
+campership
+campesinos
+campestral
+campfire
+campground
+campgrounds
+camphene
+camphine
+camphor
+camphoraceous
+camphorate
+camphorated
+camphoric
+campily
+campina
+campinas
+campiness
+camping
+campion
+campo
+campobello
+camporee
+campos
+camps
+campsite
+campsites
+campstool
+campus
+campus's
+campuses
+campy
+cams
+camshaft
+camshafts
+camus
+camwood
+can
+can's
+can't
+Cana
+Canaan
+Canaan's
+Canaanite
+Canaanitic
+Canada
+Canada's
+Canadian
+Canadianism
+Canadianization
+Canadianization's
+Canadianizations
+Canadianize
+Canadianizes
+Canadians
+canaigre
+canakin
+canal
+canal's
+canalboat
+canaled
+canaler
+canalers
+canaletto
+canaliculate
+canaliculus
+canaling
+canalization
+canalization's
+canalizations
+canalize
+canalized
+canalizes
+canalizing
+canals
+canara
+canard
+canarese
+canaries
+canary
+canary's
+canasta
+canaster
+Canaveral
+Canberra
+cancan
+cancel
+cancelable
+cancelate
+cancelated
+canceled
+canceler
+canceling
+cancellation
+cancellation's
+cancellations
+cancelous
+cancels
+cancer
+cancer's
+cancerous
+cancerously
+cancers
+cancroid
+Candace
+candela
+candelabra
+candelabrum
+candent
+candescence
+candescent
+candia
+candid
+candida
+candidacy
+candidate
+candidate's
+candidates
+candidature
+Candide
+candidly
+candidness
+candied
+candies
+Candiot
+candle
+candleberry
+candled
+candlefish
+candleholder
+candlelight
+candlelighter
+candlelit
+Candlemas
+candlenut
+candlepin
+candlepins
+candlepower
+candlepowers
+candler
+candles
+candlesnuffer
+candlestick
+candlestick's
+candlesticks
+candlewick
+Candlewick
+candlewood
+candling
+candor
+candor's
+candors
+candy
+candyfloss
+candying
+candytuft
+cane
+canea
+canebrake
+caned
+canella
+caner
+canes
+canescent
+caneware
+Canfield
+Canfield's
+canful
+cangue
+Canicula
+canicular
+canikin
+canine
+canines
+caning
+Canis
+canister
+canisters
+canker
+cankered
+cankering
+cankerous
+cankerworm
+canna
+cannabin
+cannabis
+cannae
+canned
+cannel
+cannelloni
+cannelure
+canner
+canner's
+canneries
+canners
+cannery
+cannes
+cannibal
+cannibal's
+cannibalic
+cannibalism
+cannibalism's
+cannibalistic
+cannibalization
+cannibalization's
+cannibalizations
+cannibalize
+cannibalized
+cannibalizes
+cannibalizing
+cannibals
+cannier
+cannily
+canniness
+canning
+cannister
+cannister's
+cannisters
+cannock
+cannon
+cannon's
+cannonade
+cannonball
+cannoned
+cannoneer
+cannoning
+cannonry
+cannons
+cannot
+cannula
+cannulate
+canny
+canoe
+canoe's
+canoed
+canoeing
+canoeist
+canoeist's
+canoeists
+canoes
+canoewood
+Canoga
+canon
+canon's
+canoness
+canonic
+canonical
+canonicalization
+canonicalize
+canonicalized
+canonicalizes
+canonicalizing
+canonically
+canonicals
+canonicate
+canonicity
+canonist
+canonization
+canonization's
+canonizations
+canonize
+canonized
+canonizer
+canonizers
+canonizes
+canonizing
+canonry
+canons
+canoodle
+Canopic
+Canopus
+canopy
+canorous
+canorously
+canorousness
+Canossa
+canova
+cans
+canso
+canst
+cant
+cantabile
+Cantabrian
+Cantabrigian
+cantal
+cantala
+cantaloupe
+cantaloupe's
+cantaloupes
+cantankerous
+cantankerously
+cantankerousness
+cantata
+cantatas
+cantatrice
+canted
+canteen
+canteens
+canter
+Canterbury
+cantered
+canterelle
+cantharides
+canthi
+canthus
+canticle
+cantilena
+cantilever
+cantilevers
+cantillate
+cantillation
+cantina
+canting
+cantle
+cantles
+canto
+canton
+canton's
+cantonal
+Cantonese
+cantonment
+cantons
+cantor
+cantor's
+cantorial
+cantoris
+cantors
+cantos
+cantrip
+cantus
+canty
+Canuck
+canula
+Canute
+canute
+canvas
+canvas's
+canvasback
+canvaser
+canvases
+canvaslike
+canvass
+canvassed
+canvasser
+canvassers
+canvasses
+canvassing
+canyon
+canyon's
+canyons
+canzona
+canzone
+canzonet
+cap
+cap's
+capabilites
+capabilities
+capability
+capability's
+Capablanca
+capable
+capableness
+capably
+capacious
+capaciously
+capaciousness
+capacitance
+capacitances
+capacitate
+capacitative
+capacities
+capacitive
+capacitively
+capacitor
+capacitor's
+capacitors
+capacity
+caparison
+Cape
+cape
+capelet
+capelin
+capella
+caper
+capercaillie
+capered
+capering
+Capernaum
+capers
+capes
+capeskin
+capet
+Capet
+Capetian
+Capetown
+capework
+capful
+capias
+capillaceous
+capillarity
+capillary
+Capistrano
+capita
+capital
+capitalism
+capitalist
+capitalist's
+capitalistic
+capitalistically
+capitalists
+capitalizable
+capitalizable's
+capitalizables
+capitalization
+capitalization's
+capitalizations
+capitalize
+capitalized
+capitalizer
+capitalizers
+capitalizes
+capitalizing
+capitally
+capitals
+Capitan
+capitan
+capitate
+capitates
+capitation
+capitol
+capitol's
+Capitoline
+capitols
+capitular
+capitulary
+capitulate
+capitulated
+capitulates
+capitulation
+capitulum
+caplin
+capo
+capon
+Capone
+Caponization
+caponize
+caponized
+caponizes
+caponizing
+caporal
+caporetto
+capote
+cappadocia
+capparidaceous
+capped
+capper
+cappers
+cappie
+capping
+Cappuccilli
+cappuccino
+Cappy
+cappy
+capreolate
+Capri
+capric
+capriccio
+capriccioso
+caprice
+capricious
+capriciously
+capriciousness
+Capricorn
+Capricornus
+caprification
+caprifig
+caprifoliaceous
+caprine
+capriole
+caproic
+caps
+capsaicin
+Capsian
+capsid
+capsize
+capsized
+capsizes
+capsizing
+capstan
+capstans
+capstone
+capsular
+capsulate
+capsulated
+capsule
+capsuled
+capsules
+capsuling
+capsulization
+capsulize
+capsulized
+capsulizes
+capsulizing
+Capt
+capt
+captain
+captaincy
+captained
+captaining
+captains
+captainship
+captan
+caption
+caption's
+captioned
+captioner
+captioning
+captionless
+captions
+captious
+captiously
+captiousness
+captivate
+captivated
+captivates
+captivating
+captivation
+captivator
+captive
+captive's
+captives
+captivity
+captor
+captor's
+captors
+capture
+captured
+capturer
+capturers
+captures
+capturing
+capua
+capuche
+capuchin
+caput
+Caputo
+capybara
+car
+car's
+carabao
+carabid
+carabineer
+carabiner
+carabinero
+carabinier
+carabiniere
+caracal
+caracalla
+caracara
+Caracas
+caracole
+caracoled
+caracoling
+caracul
+carafe
+carageen
+caramba
+caramel
+caramelization
+caramelization's
+caramelizations
+caramelize
+caramelized
+caramelizes
+caramelizing
+carangid
+carapace
+carapace's
+carapaces
+carat
+caratacus
+Caravaggio
+caravan
+caravan's
+caravaner
+caravanner
+caravans
+caravansary
+caravanserai
+caravel
+caraway
+carbamate
+carbamic
+carbamidine
+carbanion
+carbarn
+carbaryl
+carbazole
+carbene
+carbide
+carbine
+carbineer
+carbines
+carbohydrate
+carbohydrate's
+carbohydrates
+carbolated
+carbolic
+carboline
+carbolization
+carbolize
+carbolized
+carbolizes
+carbolizing
+Carboloy
+carbon
+carbon's
+carbonaceous
+carbonade
+carbonado
+Carbonari
+carbonate
+carbonated
+carbonates
+carbonation
+carbonatization
+carbonatization's
+carbonatizations
+Carbondale
+Carbone
+Carbones
+carbonic
+carboniferous
+carbonium
+carbonizable
+carbonizable's
+carbonizables
+carbonization
+carbonization's
+carbonizations
+carbonize
+carbonized
+carbonizer
+carbonizers
+carbonizes
+carbonizing
+carbonless
+carbonous
+carbons
+carbonyl
+carbonylic
+carborundum
+carboxy
+carboxyl
+carboxylase
+carboxylate
+carboxylation
+carboxylic
+carboy
+carbuncle
+carbuncled
+carbuncular
+carburation
+carburet
+carburetion
+carburetor
+carburetors
+carburetted
+carburetter
+carburization
+carburize
+carburized
+carburizes
+carburizing
+carby
+carbylamine
+carcajou
+carcanet
+carcase
+carcass
+carcass's
+carcasses
+carcassonne
+carchemish
+carcinogen
+carcinogenesis
+carcinogenic
+carcinogenicity
+carcinogens
+carcinoid
+carcinoma
+carcinomatosis
+card
+card's
+cardamom
+cardboard
+cardboards
+carded
+carder
+cardiac
+cardialgia
+Cardiff
+Cardiff's
+cardigan
+cardigan's
+cardigans
+Cardiganshire
+cardin
+cardinal
+cardinalate
+cardinalities
+cardinality
+cardinality's
+cardinally
+cardinals
+cardinalship
+carding
+cardiod
+cardiogram
+cardiogram's
+cardiograms
+cardiograph
+cardiographer
+cardiographic
+cardiographs
+cardiography
+cardioid
+cardioid's
+cardioids
+cardiological
+cardiologist
+cardiology
+cardiomegaly
+cardiopathy
+cardiopulmonary
+cardiorespiratory
+cardiotonic
+cardiovascular
+cardiovasculatory
+carditis
+cardoon
+cardplayer
+cards
+cardsharp
+cardsharper
+carduaceous
+carducci
+care
+cared
+careen
+careened
+careening
+career
+career's
+careered
+careering
+careerism
+careerist
+careerists
+careers
+carefree
+careful
+carefuller
+carefullest
+carefully
+carefulness
+careless
+carelessly
+carelessness
+carer
+carers
+cares
+caress
+caressed
+caresser
+caresses
+caressing
+caressingly
+caressive
+caressively
+caret
+caretaker
+caretakers
+caretaking
+carets
+carew
+careworn
+Carey
+Carey's
+carfare
+carfax
+carfuffle
+carful
+Cargill
+Cargill's
+cargo
+cargoes
+cargos
+carhop
+caria
+Carib
+Caribbean
+Caribbee
+caribbees
+caribe
+cariboo
+caribou
+caribous
+caricatural
+caricature
+caricatured
+caricatures
+caricaturist
+caries
+carifta
+carillon
+carillonneur
+carina
+carinate
+caring
+carinthia
+carioca
+cariocan
+cariogenic
+cariole
+carious
+Carl
+Carl's
+Carla
+carle
+Carleton
+Carletonian
+Carlin
+Carlin's
+carline
+carling
+Carlisle
+Carlisle's
+Carlist
+Carlo
+carload
+carloading
+carloads
+Carlos
+carlota
+Carlovingian
+carlow
+Carlsbad
+carlsbad
+Carlsbad's
+Carlsbads
+Carlson
+Carlton
+Carlyle
+carmagnole
+carmaker
+Carman
+carmarthen
+Carmarthenshire
+Carmel
+Carmela
+Carmelite
+Carmen
+Carmen's
+Carmichael
+carminative
+carmine
+carnage
+carnal
+carnality
+carnalize
+carnalizes
+carnallite
+carnally
+carnarvon
+carnassial
+carnatic
+carnation
+carnations
+carnauba
+carne
+Carnegie
+carnelian
+carnet
+carney
+carnify
+carniola
+carnival
+carnival's
+carnivals
+carnivore
+carnivorous
+carnivorously
+carnivorousness
+carnot
+carnotite
+carny
+carob
+caroche
+carol
+carol's
+caroled
+caroler
+carolers
+Carolina
+Carolina's
+Carolinas
+Caroline
+Caroline's
+caroling
+Carolingian
+Carolinian
+Carolinians
+carols
+carolus
+Carolyn
+carom
+carotene
+carotenoid
+carotid
+carousal
+carouse
+caroused
+carousel
+carousel's
+carousels
+carouser
+carousing
+carp
+carpal
+Carpathia
+Carpathian
+Carpathians
+carped
+carpel
+carpellary
+carpentaria
+carpenter
+carpenter's
+carpentered
+carpentering
+carpenters
+carpentier
+carpentry
+carper
+carpet
+carpetbag
+carpetbag's
+carpetbagged
+carpetbagger
+carpetbagger's
+carpetbaggers
+carpetbaggery
+carpetbagging
+carpetbags
+carpeted
+carpeting
+carpets
+carpi
+carping
+carpingly
+carpogonium
+carpology
+carpometacarpus
+carpophagous
+carpophore
+carport
+carpospore
+carposporic
+carps
+carpus
+Carr
+Carr's
+carrack
+carrageen
+Carrara
+carrefour
+carrel
+carrels
+Carreras
+carriage
+carriage's
+carriages
+carriageway
+carriageways
+Carrick
+Carrie
+carried
+carrier
+carriers
+carries
+carriole
+carrion
+Carroll
+Carroll's
+carronade
+carrot
+carrot's
+carrots
+carroty
+carrousel
+Carruthers
+carry
+carryall
+carrycot
+carrying
+carryng
+carryon
+carryout
+carryover
+carryovers
+cars
+carse
+carsick
+Carson
+carstensz
+cart
+cartage
+cartagena
+carte
+carted
+cartel
+cartelization
+cartelization's
+cartelizations
+cartelize
+cartelizes
+cartels
+carter
+carteret
+Carteri
+carters
+Cartesian
+cartful
+Carthage
+Carthaginian
+carthorse
+Carthusian
+Cartier
+cartilage
+cartilaginous
+carting
+cartload
+cartloads
+cartogram
+cartogram's
+cartograms
+cartographer
+cartographers
+cartographic
+cartographical
+cartography
+cartomancy
+carton
+carton's
+cartons
+cartoon
+cartoon's
+cartoonist
+cartoonists
+cartoons
+cartop
+cartouche
+cartridge
+cartridge's
+cartridges
+carts
+cartulary
+cartwheel
+cartwheeler
+cartwheels
+cartwright
+Carty
+carty
+caruncle
+caruncular
+carunculate
+carunculated
+Caruso
+carve
+carved
+carvel
+carven
+carver
+carvers
+carves
+carving
+carvings
+cary
+caryatid
+caryophyllaceous
+caryopsis
+carzey
+casa
+casaba
+casaba's
+casabas
+casablanca
+casals
+Casanova
+Casanova's
+casaubon
+casbah
+cascabel
+cascade
+cascaded
+cascades
+cascading
+cascara
+cascarilla
+case
+casease
+caseate
+caseation
+casebearer
+casebook
+casebooks
+casebound
+cased
+casefy
+casein
+caseload
+caseloads
+casemate
+casement
+casement's
+casements
+caseose
+caseous
+casern
+caserne
+caserta
+cases
+casework
+caseworker
+caseworkers
+caseworm
+Casey
+cash
+cashable
+cashbook
+cashed
+casher
+cashers
+cashes
+cashew
+cashews
+cashier
+cashier's
+cashiers
+cashing
+cashless
+cashmere
+casimere
+casing
+casings
+casino
+casinos
+cask
+cask's
+casket
+casket's
+caskets
+casks
+Caslon
+Caspar
+Casparian
+Caspian
+casque
+cassaba
+Cassandra
+cassareep
+cassata
+cassation
+cassatt
+cassava
+Cassegrainian
+cassel
+casserole
+casserole's
+casseroles
+cassette
+cassettes
+Cassia
+cassimere
+cassini
+cassino
+cassiodorus
+Cassiopeia
+cassirer
+Cassite
+cassite
+cassiterite
+Cassius
+cassock
+cassocked
+cassoulet
+cassowary
+cast
+cast's
+Castalia
+castanet
+castanets
+castaway
+caste
+caste's
+casted
+casteism
+castellammare
+castellan
+castellany
+castellated
+caster
+casters
+castes
+casteth
+castigate
+castigated
+castigates
+castigation
+castigator
+castigators
+castiglione
+castile
+Castilian
+Castilla
+Castillo
+Castillo's
+casting
+castings
+castle
+castled
+Castleford
+Castlereagh
+castles
+castling
+castoff
+castoffs
+castor
+castorized
+castorized's
+castorizeds
+castrate
+castrated
+castrater
+castraters
+castrates
+castrating
+castration
+castrato
+castrator
+castrators
+castratory
+castries
+Castro
+Castroism
+casts
+casual
+casually
+casualness
+casuals
+casualties
+casualty
+casualty's
+Casuarina
+casuist
+casuistic
+casuistical
+casuistry
+cat
+cat's
+catabasis
+catabolic
+catabolically
+catabolism
+catabolite
+catabolize
+catacaustic
+catachresis
+catachresti
+catachrestic
+catachrestical
+cataclasis
+cataclinal
+cataclysm
+cataclysmal
+cataclysmic
+catacomb
+catacombic
+catadromous
+catafalque
+Catalan
+catalase
+catalatic
+catalectic
+catalepsy
+cataleptic
+cataleptically
+Catalina
+catalo
+catalog
+catalog's
+cataloged
+cataloger
+cataloging
+catalogs
+cataloguers
+cataloguize
+cataloguizes
+Catalonia
+catalonia
+catalpa
+catalysis
+catalyst
+catalyst's
+catalysts
+catalytic
+catalytically
+catalyze
+catalyzed
+catalyzer
+catalyzer's
+catalyzers
+catalyzes
+catamaran
+catamenia
+catamite
+catamount
+catania
+catanzaro
+cataphoresis
+cataphyll
+cataplasia
+cataplasm
+cataplastic
+cataplexy
+catapult
+catapulted
+catapulting
+catapults
+cataract
+cataractal
+cataracts
+catarrh
+catarrhal
+catarrhally
+catarrhine
+catastasis
+catastrophe
+catastrophe's
+catastrophes
+catastrophic
+catastrophically
+catastrophism
+catatonia
+catatonic
+catawba
+Catawba
+catbird
+catboat
+catcall
+catch
+catchable
+catchall
+catchee
+catcher
+catcher's
+catchers
+catches
+catchfly
+catchier
+catching
+catchment
+catchpenny
+catchpole
+catchpoll
+catchup
+catchweight
+catchword
+catchwords
+catchy
+cate
+catechesis
+catechetical
+catechin
+catechism
+catechismal
+catechist
+catechistic
+catechizable
+catechizable's
+catechizables
+catechization
+catechization's
+catechizations
+catechize
+catechized
+catechizer
+catechizers
+catechizes
+catechizing
+catechol
+catecholamine
+catecholamines
+catechu
+catechumen
+categoric
+categorical
+categorically
+categories
+categorization
+categorization's
+categorizations
+categorize
+categorized
+categorizer
+categorizers
+categorizes
+categorizing
+category
+category's
+catena
+catenane
+catenary
+catenate
+catenation
+catenoid
+catenulate
+cater
+cateran
+catercorner
+catered
+caterer
+cateress
+catering
+caterpillar
+caterpillar's
+caterpillars
+caters
+caterwaul
+cates
+catface
+catfacing
+catfall
+catfish
+catgut
+cathar
+catharses
+catharsis
+cathartic
+Cathay
+cathead
+cathect
+cathectic
+cathedra
+cathedral
+cathedral's
+cathedrals
+cathepsin
+Catherine
+Catherwood
+Catherwood's
+catheter
+catheterization
+catheterization's
+catheterizations
+catheterize
+catheterizes
+catheters
+catheti
+catheti's
+cathetis
+cathexes
+cathexis
+cathode
+cathode's
+cathodes
+cathodic
+cathodically
+catholic
+catholic's
+catholically
+catholicate
+catholicism
+catholicity
+Catholicization
+catholicize
+Catholicized
+catholicizer
+catholicizers
+catholicizes
+Catholicizing
+catholicon
+catholics
+cathouse
+Cathy
+catiline
+cation
+cationic
+cationically
+cations
+catkin
+catlike
+catling
+catmint
+catnap
+catnaps
+catnip
+cato
+catoptric
+catoptrically
+catoptrics
+cats
+Catskill
+Catskills
+catsup
+cattail
+cattalo
+catted
+cattegat
+cattermole
+cattery
+cattier
+catties
+cattily
+cattiness
+catting
+cattle
+cattleman
+cattlemen
+Cattleya
+catty
+catullus
+CATV
+catwalk
+catwalk's
+catwalks
+cauca
+caucasia
+Caucasian
+Caucasians
+Caucasoid
+Caucasus
+Cauchy
+caucus
+caucuses
+caucusing
+caudad
+caudal
+caudally
+caudate
+caudated
+caudation
+caudex
+caudillo
+caudine
+caudle
+caught
+caul
+cauldron
+cauldrons
+caulescent
+caulicle
+caulicles
+cauliflower
+cauliflowers
+cauline
+caulis
+caulk
+caulker
+caulks
+causal
+causalgia
+causality
+causally
+causate
+causation
+causation's
+causations
+causative
+causatively
+cause
+caused
+causeless
+causer
+causerie
+causes
+causeway
+causeway's
+causeways
+causey
+causeys
+causing
+caustic
+caustically
+causticity
+causticization
+causticization's
+causticizations
+causticize
+causticizer
+causticizers
+causticizes
+causticly
+caustics
+cauterant
+cauterization
+cauterization's
+cauterizations
+cauterize
+cauterized
+cauterizes
+cauterizing
+cautery
+caution
+cautionary
+cautioned
+cautioner
+cautioners
+cautioning
+cautionings
+cautions
+cautious
+cautiously
+cautiousness
+cauvery
+cavafy
+cavalcade
+cavalcades
+cavalier
+cavalierism
+cavalierly
+cavalierness
+cavalla
+cavalry
+cavalryman
+cavalrymen
+cavan
+cavatina
+cave
+caveat
+caveat's
+caveator
+caveats
+caved
+cavefish
+Cavell
+caveman
+cavemen
+Cavendish
+caver
+cavern
+cavern's
+cavernicolous
+cavernous
+cavernously
+caverns
+caves
+Cavesson
+Cavetto
+caviar
+caviare
+cavicorn
+cavie
+cavies
+cavil
+cavilation
+caviled
+caviler
+cavilers
+caviling
+cavilings
+Caviness
+caving
+cavitary
+cavitate
+cavitation
+cavite
+cavities
+cavity
+cavity's
+cavort
+cavorted
+cavorting
+Cavour
+cavy
+caw
+Cawdrey
+cawed
+cawing
+Cawley
+Cawnpore
+caws
+Caxton
+cay
+cayenne
+Cayes
+Cayley
+Cayley's
+Cayman
+cayman
+Cayuga
+Cayuga's
+Cayuse
+CB
+CBS
+cc
+CCNY
+CDC
+CDC's
+CDR
+CDT
+Ceanothus
+cease
+ceased
+ceasefire
+ceasefire's
+ceaseless
+ceaselessly
+ceaselessness
+ceases
+ceasing
+Cecil
+Cecilia
+cecity
+Cecropia
+Cecrops
+cecum
+cedar
+cedarn
+cedarwood
+cede
+ceded
+ceder
+cedi
+cedilla
+ceding
+Cedric
+ceefax
+Ceiba
+ceil
+ceilidh
+ceiling
+ceiling's
+ceilinged
+ceilings
+ceilometer
+ceilometer's
+ceilometers
+ceinture
+Celadon
+Celaeno
+celandine
+Celanese
+celaya
+Celebes
+celebrant
+celebrants
+celebrate
+celebrated
+celebratedness
+celebrates
+celebrating
+celebration
+celebrations
+celebrator
+celebrators
+celebratory
+celebrities
+celebrity
+celebrity's
+celeriac
+celerity
+celery
+celesta
+Celeste
+celestial
+celestialize
+celestializes
+celestially
+celestite
+Celia
+Celia's
+celiac
+celibacy
+celibate
+celibates
+cell
+cella
+cellar
+cellar's
+cellarage
+cellarages
+cellared
+cellarer
+cellaret
+cellarets
+cellarette
+cellarettes
+cellaring
+cellars
+celle
+celled
+cellini
+cellist
+cellist's
+cellists
+cello
+cellobiose
+celloidin
+cellophane
+cellos
+cells
+cellular
+cellularity
+cellularly
+cellulase
+cellule
+cellulitis
+celluloid
+celluloid's
+cellulose
+celluloses
+cellulosic
+cellulous
+celom
+Celsius
+Celt
+Celtiberian
+Celtic
+Celticize
+Celticizes
+cembalo
+cement
+cementation
+cemented
+cementer
+cementing
+cementite
+cementitious
+cements
+cementum
+cemeteries
+cemetery
+cemetery's
+cenacle
+cenesthesia
+cenis
+cenobite
+cenobitic
+cenobitical
+cenogenesis
+cenogenetic
+cenogenetically
+cenospecies
+cenotaph
+cenote
+Cenozoic
+cense
+censer
+censing
+censor
+censored
+censorial
+censoring
+censorious
+censoriously
+censoriousness
+censors
+censorship
+censurable
+censure
+censured
+censurer
+censures
+censuring
+census
+census's
+censuses
+cent
+cental
+centare
+centaur
+centaurea
+centaurs
+Centaurus
+centaury
+centavo
+centenarian
+centenary
+centennial
+centennially
+center
+center's
+centerable
+centerable's
+centerables
+centerboard
+centered
+centerer
+centerers
+centering
+centerings
+centerless
+centerline
+centerlines
+centerpiece
+centerpiece's
+centerpieces
+centers
+centesimal
+centesimo
+centiare
+centigrade
+centigrades
+centigram
+centigram's
+centigrams
+centiliter
+centillion
+centime
+centimeter
+centimeter's
+centimeters
+centimetric
+centimo
+centipede
+centipede's
+centipedes
+centipoise
+centisecond
+centiseconds
+centner
+cento
+centones
+centra
+central
+Central
+centrale
+Centralia
+centralism
+centralist
+centralistic
+centralists
+centrality
+centralization
+centralization's
+centralizations
+centralize
+centralized
+centralizer
+centralizers
+centralizes
+centralizing
+centrally
+centrals
+centrefold
+centreing
+Centrex
+centric
+centrically
+centricity
+centrifugal
+centrifugalization
+centrifugalization's
+centrifugalizations
+centrifugalize
+centrifugalizes
+centrifugally
+centrifugals
+centrifugate
+centrifugation
+centrifuge
+centrifuge's
+centrifuged
+centrifuges
+centrifuging
+centriole
+centripetal
+centripetally
+centrism
+centrist
+centrobaric
+centroclinal
+centroid
+centroidal
+centroids
+centromere
+centromeric
+centrosome
+centrosomic
+centrosphere
+centrosymmetric
+centrum
+cents
+centum
+centurial
+centuries
+centurion
+century
+century's
+CEO
+ceorl
+cep
+cephalad
+cephalalgia
+cephalic
+cephalically
+cephalin
+cephalization
+cephalochordate
+cephalometer
+cephalometric
+cephalometry
+cephalonia
+cephalopod
+cephalothorax
+Cepheid
+Cepheus
+cepstrum
+CEQ
+ceraceous
+ceram
+ceramal
+ceramic
+ceramicist
+ceramics
+ceramist
+ceramium
+cerargyrite
+cerastes
+cerate
+cerated
+Ceratodus
+ceratoid
+Cerberus
+cercaria
+Cercis
+cercopithecoid
+cercus
+cere
+cereal
+cereal's
+cereals
+cerebellar
+cerebellum
+cerebral
+cerebralization
+cerebralization's
+cerebralizations
+cerebralize
+cerebralizes
+cerebrally
+cerebrate
+cerebrated
+cerebrates
+cerebrating
+cerebration
+cerebrations
+cerebroside
+cerebrosides
+cerebrospinal
+cerebrovascular
+cerebrum
+cerecloth
+cerement
+ceremonial
+ceremonialism
+ceremonialist
+ceremonialists
+ceremonialize
+ceremonializes
+ceremonially
+ceremonialness
+ceremonies
+ceremonious
+ceremoniously
+ceremoniousness
+ceremony
+ceremony's
+Cerenkov
+ceres
+Ceres
+ceresin
+cereus
+ceria
+ceric
+cering
+cerise
+cerium
+cermet
+CERN
+cernuous
+cero
+cerography
+ceroplastic
+ceroplastics
+cerotic
+cerotype
+cerous
+cerro
+cert
+certain
+certainly
+certainties
+certainty
+certes
+certifiable
+certifiably
+certificate
+certificated
+certificates
+certificating
+certification
+certifications
+certificatory
+certified
+certifier
+certifiers
+certifies
+certify
+certifying
+certiorari
+certitude
+certitudes
+cerulean
+cerumen
+ceruminous
+ceruse
+cerussite
+Cervantes
+cervelat
+cervical
+cervices
+cervicitis
+cervid
+cervin
+cervine
+cervix
+cervixes
+Cesare
+Cesare's
+cesarean
+cesarian
+cesena
+cesium
+cespitose
+cess
+cessation
+cessation's
+cessations
+cesser
+cession
+cessionary
+Cessna
+cesspit
+cesspool
+cesta
+cesti
+cestode
+cestoid
+cestus
+cesura
+cetacean
+cetacean's
+cetaceans
+cetane
+cetatea
+Cete
+cetera
+ceteras
+ceteris
+cetinje
+cetology
+Cetus
+ceuta
+Ceylon
+Cezanne
+Cezannes
+cf
+CGS
+chabazite
+Chablis
+Chablises
+chabrol
+chacma
+Chaco
+chaconne
+Chad
+Chadderton
+chadic
+Chadwick
+Chadwick's
+chaeronea
+chaeta
+chaetognath
+chaetopod
+chafe
+chafer
+chaff
+chaffer
+chaffered
+chafferer
+chaffering
+Chaffey
+chaffey
+chaffinch
+chaffing
+chaffy
+chafing
+chagall
+chagres
+chagrin
+chagrined
+chagrining
+chagrins
+Chailly
+chain
+chained
+chaining
+chainlike
+chainman
+chainomatic
+chainplate
+chains
+chair
+chairborne
+chaired
+chairing
+chairlady
+chairman
+chairmanship
+chairmanships
+chairmen
+chairperson
+chairperson's
+chairpersons
+chairs
+chairwoman
+chairwomen
+chaise
+chalaza
+chalcanthite
+chalcedonic
+chalcedony
+chalcid
+chalcidice
+Chalcis
+chalcocite
+chalcography
+chalcolithic
+chalcopyrite
+chaldea
+Chaldean
+Chaldee
+chaldron
+chalet
+chaliapin
+chalice
+chalice's
+chaliced
+chalices
+chalicothere
+chalk
+chalkboard
+chalked
+chalking
+chalkline
+chalkpit
+chalks
+chalkstone
+chalky
+challah
+challenge
+challenged
+challenger
+challengers
+challenges
+challenging
+challengingly
+challis
+Chalmers
+chalone
+chalybeate
+Cham
+chamade
+Chamaeleon
+chamaephyte
+chamber
+chambered
+chamberer
+chamberers
+chambering
+chamberlain
+chamberlain's
+chamberlains
+chambermaid
+chambermaids
+chambers
+Chambertin
+chambord
+chambray
+chambrays
+chameleon
+chameleonic
+chameleonize
+chameleonizes
+chameleons
+chamfer
+chamfered
+chamfering
+chamfers
+chamfron
+chamfrons
+chammy
+chamois
+chamoix
+chamomile
+chamonix
+champ
+champac
+champagne
+champaign
+champak
+champers
+champertous
+champerty
+champignon
+champion
+championed
+championing
+championize
+championizes
+champions
+championship
+championship's
+championships
+Champlain
+champlainian
+champollion
+champs
+chance
+chanced
+chanceful
+chancel
+chancellery
+chancellor
+chancellors
+chancellorship
+chancellorships
+Chancellorsville
+chancellory
+chancels
+chanceries
+chancery
+chances
+chancier
+chanciness
+chancing
+chancre
+chancres
+chancroid
+chancroidal
+chancrous
+chancy
+chandelier
+chandelier's
+chandeliers
+chandelle
+chandernagore
+chandigarh
+Chandigarh
+chandler
+chandlery
+chandragupta
+Chandy
+Chandy's
+chanel
+Chang
+changan
+changchiakow
+changchow
+changchun
+change
+changeability
+changeable
+changeableness
+changeably
+changed
+changeful
+changefully
+changefulness
+changeless
+changelessly
+changelessness
+changeling
+changeover
+changeover's
+changeovers
+changer
+changers
+changes
+changing
+changsha
+changteh
+channel
+channeled
+channeler
+channeler's
+channelers
+channeling
+channelization
+channelization's
+channelizations
+channelize
+channelizes
+channels
+channing
+Channing
+chanson
+chant
+chanted
+chanter
+chanterelle
+chanteuse
+chanteuses
+chantey
+chanticleer
+chanticleer's
+chanticleers
+chantier
+chanties
+Chantilly
+chanting
+chantries
+chantry
+chants
+chanty
+chanukah
+Chao
+Chao's
+chaoan
+chaochow
+chaos
+chaotic
+chaotically
+chap
+chap's
+chaparejos
+chaparral
+chapati
+chapatti
+chapbook
+chape
+chapeau
+chapeaus
+chapeaux
+chapel
+chapel's
+chapelles
+chapels
+chaperon
+chaperonage
+chaperone
+chaperoned
+chaperones
+chapfallen
+chapiter
+chaplain
+chaplain's
+chaplaincies
+chaplaincy
+chaplains
+chaplet
+chapleted
+chaplets
+Chaplin
+chaplinesque
+Chapman
+chappal
+chappie
+chapping
+chaps
+chapstick
+chapter
+chapter's
+chaptered
+chapterhouse
+chaptering
+chapters
+char
+charabanc
+characin
+character
+character's
+charactered
+characterful
+charactering
+characteristic
+characteristic's
+characteristically
+characteristics
+characterizable
+characterizable's
+characterizables
+characterization
+characterization's
+characterizations
+characterize
+characterized
+characterizer
+characterizers
+characterizes
+characterizing
+characterless
+characterological
+characterologically
+characters
+charactery
+charade
+charades
+charas
+charcoal
+charcoaled
+charcoals
+charcot
+charcuterie
+chard
+chardin
+chare
+charente
+charge
+chargeable
+chargeableness
+charged
+charger
+chargers
+charges
+charging
+charier
+charily
+chariness
+charing
+chariot
+chariot's
+charioteer
+charioteers
+chariots
+charism
+charisma
+charismata
+charismatic
+charisms
+charitable
+charitableness
+charitably
+charities
+charity
+charity's
+charivari
+charkha
+charladies
+charlady
+charlatan
+charlatanism
+charlatanry
+charlatans
+Charlemagne
+Charlemagne's
+Charlemagnes
+charleroi
+Charles
+Charleston
+Charley
+Charlie
+charlock
+Charlotte
+Charlottenburg
+Charlottesville
+Charlottetown
+Charlton
+charm
+charmed
+charmer
+charmers
+Charmeuse
+charminar
+charming
+charmingly
+charmless
+charms
+charnel
+charnock
+charollais
+Charon
+Charon's
+Charpentier
+charpoy
+charqui
+charr
+charred
+charring
+chars
+chart
+Charta
+chartable
+charted
+charter
+charterage
+chartered
+charterer
+charterers
+charterhouse
+chartering
+charters
+charting
+chartings
+Chartism
+chartist
+chartists
+chartless
+chartography
+Chartres
+chartreuse
+chartroom
+chartrooms
+charts
+chartularies
+chartulary
+charwoman
+charwomen
+chary
+Charybdis
+chase
+chased
+chaser
+chasers
+chases
+Chasidim
+chasing
+chasm
+chasm's
+chasms
+chassepot
+chasseur
+chassis
+chaste
+chastely
+chasten
+chastened
+chastener
+chasteness
+chastening
+chaster
+chastest
+chastise
+chastised
+chastisement
+chastisements
+chastiser
+chastisers
+chastises
+chastising
+chastity
+chasuble
+chat
+chateau
+chateau's
+chateaubriand
+chateaus
+chateaux
+chatelain
+chatelaine
+chatelaines
+chatelains
+Chatham
+Chatham's
+chatoyance
+chatoyancy
+chatoyant
+chats
+Chatsworth
+Chatsworth's
+chattahoochee
+Chattahoochee
+Chattanooga
+chatted
+chattel
+chattelization
+chattelization's
+chattelizations
+chattelize
+chattelizes
+chattels
+chatter
+chatterbox
+chatterboxes
+chattered
+chatterer
+chatterers
+chattering
+chatterly
+chatters
+Chatterton
+chattier
+chattily
+chattiness
+chatting
+chatty
+Chaucer
+Chaucerian
+chauffer
+chauffers
+chauffeur
+chauffeured
+chauffeuring
+chauffeurs
+chaulmoogra
+Chauncey
+Chauncey's
+chaunt
+chausses
+chaussure
+chaussures
+Chautauqua
+chauvinism
+chauvinism's
+chauvinist
+chauvinist's
+chauvinistic
+chauvinistically
+chauvinists
+chavannes
+chaw
+chayote
+cheap
+cheapen
+cheapened
+cheapening
+cheapens
+cheaper
+cheapest
+cheapie
+cheapish
+cheapishly
+cheaply
+cheapness
+cheapskate
+cheapskates
+cheat
+cheated
+cheater
+cheaters
+cheating
+cheats
+cheb
+cheboksary
+Chechen
+check
+checkable
+checkbits
+checkbook
+checkbook's
+checkbooks
+checked
+checker
+checkerberry
+checkerbloom
+checkerboard
+checkerboards
+checkered
+checkering
+checkers
+checking
+checkless
+checklist
+checklists
+checkmark
+checkmarks
+checkmate
+checkmated
+checkmates
+checkmating
+checkoff
+checkout
+checkouts
+checkpoint
+checkpoint's
+checkpoints
+checkrein
+checkroom
+checkrooms
+checkrow
+checks
+checksum
+checksum's
+checksummed
+checksumming
+checksums
+checkup
+checkups
+checky
+cheddar
+cheddite
+cheek
+Cheek
+cheek's
+cheekbone
+cheekbones
+cheekful
+cheekier
+cheekily
+cheekiness
+cheekpiece
+cheeks
+cheeky
+cheep
+cheeps
+cheer
+cheered
+cheerer
+cheerers
+cheerful
+cheerfulize
+cheerfulizes
+cheerfully
+cheerfulness
+cheerier
+cheerily
+cheeriness
+cheering
+cheerio
+cheerlead
+cheerleader
+cheerleaders
+cheerless
+cheerlessly
+cheerlessness
+cheerly
+cheers
+cheery
+cheese
+cheese's
+cheeseboard
+cheeseburger
+cheeseburgers
+cheesecake
+cheesecake's
+cheesecakes
+cheesecloth
+cheesecloths
+cheesed
+cheesemaker
+cheesemakers
+cheesemaking
+cheesemonger
+cheeseparer
+cheeseparing
+cheeseparings
+cheeses
+cheesewood
+cheesier
+cheesiness
+cheesing
+cheesy
+cheetah
+cheetahs
+chef
+chef's
+chefdom
+chefoo
+chefs
+cheiron
+cheju
+Chekhov
+chekhov
+chekiang
+chela
+chelatable
+chelate
+chelated
+chelating
+chelation
+chelations
+chelicera
+chelicerate
+cheliform
+Chellean
+Chelmsford
+cheloid
+chelonian
+chelp
+Chelsea
+Chelsea's
+Cheltenham
+Chelyabinsk
+Chelyuskin
+chemic
+chemical
+chemicalization
+chemicalization's
+chemicalizations
+chemicalize
+chemicalizes
+chemically
+chemicals
+chemiluminescence
+chemiluminescent
+chemin
+chemische
+chemise
+chemises
+chemisette
+chemism
+chemisorb
+chemisorption
+chemist
+chemist's
+chemistries
+chemistry
+chemists
+chemmy
+chemnitz
+chemoautotrophic
+chemoautotrophically
+chemoautotrophy
+chemometrics
+chemoprophylaxis
+chemoreception
+chemoreceptive
+chemoreceptivity
+chemoreceptor
+chemoreceptors
+chemosmosis
+chemosphere
+chemostat
+chemosynthesis
+chemotaxis
+chemotherapy
+chemotherapy's
+chemotropism
+chempaduk
+chemulpo
+chemurgy
+Chen
+chenab
+Cheney
+Cheney's
+cheng
+Cheng
+Chengchow
+Chengteh
+Chengtu
+chenille
+chenopod
+Cheongsam
+Cheops
+Cherbourg
+Cheremiss
+Cheremkhovo
+Cherenkov
+cheribon
+cherish
+cherishable
+cherished
+cherisher
+cherishes
+cherishing
+Cheriton
+Cheriton's
+Chernovtsy
+Chernozem
+Cherokee
+Cherokees
+cheroot
+cherries
+cherry
+cherry's
+cherrylike
+cherrystone
+chersonese
+chert
+Chertsey
+cherub
+cherub's
+cherubic
+cherubically
+cherubim
+Cherubini
+cherublike
+cherubs
+chervil
+chervils
+chervonets
+Cheryl
+Cheryl's
+Chesapeake
+Cheshire
+cheshunt
+chess
+chessboard
+chessboards
+Chessel
+chessman
+chessmen
+chest
+chester
+Chesterfield
+Chesterfieldian
+Chesterton
+chestful
+chestier
+chestnut
+chestnut's
+chestnuts
+chests
+chesty
+chetah
+Chetnik
+Cheval
+chevalier
+cheveron
+chevet
+cheviot
+chevrette
+Chevrolet
+chevron
+chevroned
+chevrotain
+Chevy
+chew
+chewa
+chewable
+chewed
+chewer
+chewers
+chewie
+chewing
+chews
+chewy
+Cheyenne
+Cheyennes
+chi
+chiack
+Chian
+Chiang
+Chiang's
+chianti
+chiapas
+chiaroscurist
+chiaroscuro
+chiasma
+chiasmatic
+chiasmus
+chiastic
+chiastolite
+chiat
+chiaus
+chiba
+Chibchan
+chibouk
+chic
+Chicago
+Chicago's
+Chicagoan
+Chicagoans
+chicalote
+Chicana
+Chicana's
+Chicanas
+chicane
+chicanery
+chicaning
+Chicano
+Chicano's
+Chicanos
+chiccory
+chichagof
+chichen
+chichester
+chichewa
+chichi
+chichihaerh
+chick
+chickabiddy
+chickadee
+chickadee's
+chickadees
+Chickasaw
+chickasaws
+Chickasaws
+chicken
+chickened
+chickenhearted
+chickening
+chickenpox
+chickens
+chickpea
+chickpea's
+chickpeas
+chicks
+chickweed
+chickweeds
+chiclayo
+chicle
+chicly
+chicness
+chicory
+chicos
+chidden
+chide
+chided
+chides
+chiding
+chief
+chief's
+chiefdom
+chiefdoms
+chiefly
+chiefs
+chieftain
+chieftain's
+chieftaincies
+chieftaincy
+chieftains
+chieftainship
+chiffchaff
+chiffon
+chiffonier
+chifley
+chigetai
+chigger
+chiggers
+chignon
+chigwell
+chihli
+Chihuahua
+chilblain
+chilblains
+child
+child's
+childbear
+childbearing
+childbed
+childbirth
+childbirths
+childcare
+Childermas
+childhood
+childhoods
+childish
+childishly
+childishness
+childless
+childlessness
+childlike
+childlikeness
+childly
+childminder
+childminders
+childminding
+childrearing
+children
+children's
+Chile
+Chilean
+Chiles
+chili
+chiliad
+chiliasm
+chilies
+chilkoot
+chill
+chilled
+chiller
+chillers
+chilli
+chillier
+chillies
+chillily
+chilliness
+chilling
+chillingly
+chillness
+chillon
+chills
+chillum
+chilly
+chilopod
+chilpancingo
+Chiltern
+Chilton
+chilung
+chimaera
+chimb
+chimborazo
+chimbote
+chime
+chime's
+chimed
+chimer
+chimera
+chimere
+chimeric
+chimerical
+chimerically
+chimerism
+chimes
+chiming
+Chimique
+Chimiques
+chimkent
+chimney
+chimney's
+chimneyed
+chimneypiece
+chimneypot
+chimneys
+chimp
+chimpanzee
+chimpanzees
+chimps
+chin
+chin's
+China
+china
+chinaberry
+chinagraph
+Chinaman
+Chinamen
+chinan
+Chinatown
+Chinatown's
+chinaware
+chinbone
+chincapin
+chinch
+chincherinchee
+chinchilla
+chindit
+chindwin
+chine
+Chinee
+chines
+Chinese
+Chinese's
+Ching
+ching
+chinghai
+chingtao
+chink
+chinkapin
+chinked
+chinkiang
+chinks
+chinless
+chinned
+chinner
+chinners
+chinning
+chino
+chinoiserie
+Chinook
+Chinookan
+chinos
+chinquapin
+chins
+chintz
+chintzier
+chintzy
+chinwag
+Chionodoxa
+chios
+chip
+chip's
+chipboard
+chipmunk
+chipmunk's
+chipmunks
+chipolata
+chipped
+Chippendale
+chipper
+chippewa
+Chippewa
+chipping
+chippy
+chips
+chirac
+chirau
+chirico
+chirm
+chirographer
+chirographic
+chirographical
+chirography
+chiromancer
+chiromancy
+Chiron
+chiropodist
+chiropodists
+chiropody
+chiropractic
+chiropractor
+chiropractors
+chiropter
+chiropteran
+chirp
+chirped
+chirpily
+chirping
+chirps
+chirpy
+chirrup
+chirruped
+chirruping
+chirrups
+chirurgeon
+chisel
+chiseled
+chiseler
+chiselers
+chiseling
+chiselings
+chisels
+chishima
+Chisholm
+chisimaio
+chit
+Chita
+chital
+chitarrone
+chitchat
+chitin
+chitinous
+chitlings
+chiton
+chits
+chittagong
+chitter
+chittered
+chittering
+chitterlings
+chitters
+chiv
+chivalric
+chivalrous
+chivalrously
+chivalrousness
+chivalry
+chivaree
+chive
+chives
+chivied
+chivvied
+chivvy
+chivvying
+chivy
+chivying
+Chkalov
+chlamydate
+chlamydeous
+chlamydospore
+chlodwig
+Chloe
+chloracne
+chloral
+chlorambucil
+chloramine
+chloramphenicol
+chlorate
+chlordane
+Chlorella
+chlorenchyma
+chloric
+chloride
+chlorides
+chloridize
+chloridizes
+chlorinate
+chlorinated
+chlorinates
+chlorination
+chlorine
+chlorinity
+chlorinize
+chlorinizes
+chlorite
+chloritic
+chloroacetic
+chlorobenzene
+chloroform
+chloroformization
+chloroformization's
+chloroformizations
+chloroformize
+chloroformizes
+chlorohydrin
+Chloromycetin
+chlorophyll
+chlorophyllose
+chlorophyllous
+chloropicrin
+chloroplast
+chloroplast's
+chloroplasts
+chloroplatinate
+chloroprene
+chloroquine
+chlorosis
+chlorothiazide
+chlorotic
+chlorous
+chlorpromazine
+chlorpropamide
+chlortetracycline
+choanocyte
+Chocho
+chock
+chock's
+chockablock
+chocked
+chocker
+chocking
+chocks
+Choco
+chocolate
+chocolate's
+chocolates
+chocolaty
+Choctaw
+Choctaws
+chogyal
+choice
+choicely
+choiceness
+choicer
+choices
+choicest
+choir
+choir's
+choirboy
+choirmaster
+choirs
+choiseul
+choke
+chokeberry
+chokebore
+chokecherry
+choked
+chokedamp
+choker
+chokers
+chokes
+choking
+chokingly
+choko
+choky
+cholecalciferol
+cholecyst
+cholecystectomy
+choler
+cholera
+choleraic
+choleric
+cholesterol
+choli
+cholic
+choline
+cholinergic
+cholinesterase
+cholla
+chollers
+cholon
+cholula
+chomp
+Chomsky
+Chomsky's
+chon
+chondrify
+chondriosome
+chondrite
+chondroma
+chondrule
+choof
+chook
+choom
+choose
+chooser
+choosers
+chooses
+choosey
+choosier
+choosing
+choosy
+chop
+chopfallen
+chophouse
+Chopin
+chopine
+choplogic
+chopped
+chopper
+chopper's
+choppers
+choppier
+choppily
+choppiness
+chopping
+choppy
+chops
+chopstick
+chopsticks
+choragus
+choral
+chorale
+chorales
+chorally
+chord
+chord's
+chordal
+chordata
+chordate
+chorded
+chording
+chordophone
+chords
+chore
+chorea
+choreman
+choreodrama
+choreograph
+choreographed
+choreographer
+choreographers
+choreographic
+choreographically
+choreography
+chores
+choriamb
+choric
+chorically
+chorine
+chorines
+choring
+chorion
+chorister
+chorization
+chorization's
+chorizations
+chorizo
+chorley
+chorographic
+chorography
+choroid
+chorology
+chortle
+chortled
+chortles
+chortling
+chorus
+chorused
+choruses
+chorusmaster
+choryza
+chose
+chosen
+chota
+chott
+Chou
+Chou's
+chough
+choux
+chow
+chowder
+chowderhead
+chowderheaded
+chowders
+chowhound
+chowtime
+chrematistic
+chresard
+chrestomathy
+Chris
+chrism
+chrismatory
+chrisom
+chrissake
+Chrissie
+Christ
+Christadelphian
+Christchurch
+christen
+Christendom
+christened
+christening
+christens
+Christensen
+Christensen's
+Christenson
+Christhood
+Christian
+Christian's
+Christiana
+Christiana's
+Christianity
+Christianization
+Christianization's
+Christianizations
+Christianize
+Christianizer
+Christianizers
+Christianizes
+Christianizing
+Christians
+Christiansen
+Christianson
+Christianson's
+Christie
+Christina
+Christina's
+Christine
+Christlike
+Christmas
+Christmastide
+Christmastime
+Christoff
+Christoffel
+Christology
+Christoph
+Christoph's
+Christophe
+Christopher
+Christopher's
+christsake
+Christy
+chromate
+chromatic
+chromatically
+chromaticism
+chromaticity
+chromaticness
+chromatics
+chromatid
+chromatin
+chromatize
+chromatizes
+chromatogram
+chromatogram's
+chromatograms
+chromatograph
+chromatographic
+chromatographically
+chromatography
+chromatology
+chromatolysis
+chromatolytic
+chromatophore
+chrome
+chromed
+chromes
+chromic
+chromicize
+chromicizes
+chromide
+chrominance
+chroming
+chromite
+chromium
+chromize
+chromized
+chromizes
+chromizing
+chromo
+chromogen
+chromogenic
+chromolithograph
+chromolithography
+chromomere
+chromonema
+chromophore
+chromoplast
+chromoprotein
+chromosomal
+chromosome
+chromosome's
+chromosomes
+chromosomic
+chromosphere
+chromospheric
+chromous
+chromyl
+chronaxie
+chronic
+chronical
+chronically
+chronicity
+chronicle
+chronicled
+chronicler
+chroniclers
+chronicles
+chronobiology
+chronogram
+chronogram's
+chronogrammatic
+chronogrammatical
+chronograms
+chronograph
+chronographic
+chronographs
+chronography
+chronologer
+chronologers
+chronologic
+chronological
+chronologically
+chronologies
+chronologist
+chronologists
+chronologize
+chronologizes
+chronology
+chronology's
+chronometer
+chronometer's
+chronometers
+chronometric
+chronometrical
+chronometrically
+chronometry
+chronon
+chronoscope
+chronoscopes
+chrysalid
+chrysalis
+chrysanthemum
+chrysanthemum's
+chrysanthemums
+chrysarobin
+chryselephantine
+Chrysler
+chrysoberyl
+chrysolite
+chrysoprase
+chrysostom
+chrysotile
+chthonian
+chub
+chubb
+chubbier
+chubbiest
+chubbily
+chubbiness
+chubby
+chubbyness
+chubs
+chuck
+chuck's
+chucked
+chuckhole
+chucking
+chuckle
+chuckled
+chucklehead
+chuckleheaded
+chuckleheads
+chuckles
+chucklesome
+chuckling
+chucklingly
+chucks
+chuckwalla
+chudskoye
+chufa
+chuff
+chuffed
+chuffier
+chuffing
+chuffy
+chug
+chugalug
+chugger
+chugging
+chugs
+chukar
+Chukchi
+chukka
+chukker
+chum
+chummier
+chummily
+chumminess
+chumming
+chummy
+chump
+chump's
+chumping
+chumps
+chums
+chumship
+chunder
+chunderous
+Chung
+Chungking
+chunk
+chunk's
+chunkier
+chunkily
+chunks
+chunky
+chunnel
+chunter
+chupatti
+chupattis
+chuppah
+chur
+church
+churched
+churches
+churchgo
+churchgoer
+churchgoers
+churchgoing
+churchianity
+Churchill
+Churchillian
+churching
+churchless
+churchliness
+churchly
+churchman
+churchmanship
+churchmen
+churchwarden
+churchwardens
+churchwoman
+churchwomen
+churchy
+churchyard
+churchyard's
+churchyards
+churidars
+churinga
+churl
+churlish
+churlishly
+churlishness
+churls
+churn
+churned
+churner
+churners
+churning
+churns
+churr
+Churrigueresque
+chute
+chute's
+chuted
+chutes
+chuting
+chutist
+chutists
+chutney
+chutneys
+chuttie
+chutzpa
+chutzpah
+Chuvash
+chyack
+chyle
+chyme
+chymosin
+chymotrypsin
+chymotrypsinogen
+CIA
+ciao
+cibber
+ciborium
+cic
+cicada
+cicadas
+cicala
+cicatricle
+cicatrix
+Ciccolini
+Cicely
+Cicero
+cicerone
+Ciceronian
+Ciceronianize
+Ciceronianizes
+cichlid
+cichlids
+Cid
+cider
+ciders
+cienfuegos
+cig
+cigar
+cigar's
+cigarette
+cigarette's
+cigarettes
+cigarillo
+cigarillos
+cigars
+cii
+cil
+cilia
+ciliary
+ciliate
+ciliated
+ciliately
+ciliates
+cilice
+cilicia
+Cilician
+ciliolate
+cilium
+cimabue
+Cimbri
+cimex
+Cimmerian
+cimon
+cinch
+cinches
+Cinchona
+cinchonidine
+cinchonine
+cinchonism
+cinchonize
+Cincinnati
+Cincinnatus
+cincture
+cinder
+cinder's
+Cinderella
+cinders
+cindery
+Cindy
+Cindy's
+cine
+cineaste
+cinema
+cinemagoer
+cinemagoers
+cinemas
+Cinemascope
+cinematheque
+cinematic
+cinematically
+cinematize
+cinematograph
+cinematographer
+cinematographic
+cinematographical
+cinematographically
+cinematographs
+cinematography
+cineol
+Cinerama
+Cineraria
+cinerarium
+cinereous
+cinerin
+cingulum
+cinna
+cinnabar
+cinnamic
+cinnamon
+cinquain
+cinque
+cinquecento
+cinquefoil
+cinzano
+Cipango
+cipher
+cipher's
+ciphered
+ciphering
+ciphers
+ciphertext
+ciphony
+cipolin
+circa
+circadian
+circassia
+Circassian
+Circe
+circinate
+circinately
+Circinus
+circle
+circled
+circler
+circles
+circlet
+circling
+circlorama
+circuit
+circuit's
+circuital
+circuited
+circuiting
+circuitous
+circuitously
+circuitousness
+circuitry
+circuits
+circuity
+circulant
+circular
+circular's
+circularities
+circularity
+circularization
+circularization's
+circularizations
+circularize
+circularized
+circularizer
+circularizers
+circularizes
+circularizing
+circularly
+circularness
+circulars
+circulatable
+circulate
+circulated
+circulates
+circulating
+circulation
+circulations
+circulative
+circulator
+circulators
+circulatory
+circumambient
+circumambiently
+circumambulate
+circumambulates
+circumbendibus
+circumcircle
+circumcise
+circumcised
+circumciser
+circumcises
+circumcising
+circumcision
+circumcisions
+circumference
+circumferences
+circumferential
+circumferentially
+circumflex
+circumflexes
+circumfluent
+circumfluous
+circumfuse
+circumfused
+circumfuses
+circumfusing
+circumfusion
+circumfusions
+circumjacent
+circumlocution
+circumlocution's
+circumlocutions
+circumlocutory
+circumlunar
+circummartian
+circumnavigate
+circumnavigated
+circumnavigates
+circumnavigating
+circumnavigation
+circumnavigations
+circumnavigator
+circumnavigators
+circumnutate
+circumpolar
+circumscissile
+circumscribe
+circumscribed
+circumscribes
+circumscribing
+circumscription
+circumscriptions
+circumsolar
+circumspect
+circumspection
+circumspections
+circumspectly
+circumsphere
+circumstance
+circumstance's
+circumstanced
+circumstances
+circumstancing
+circumstantial
+circumstantiality
+circumstantially
+circumstantiate
+circumstantiated
+circumstantiates
+circumstantiating
+circumvallate
+circumvallated
+circumvallates
+circumvallating
+circumvallation
+circumvallations
+circumvent
+circumventable
+circumvented
+circumventing
+circumvention
+circumventions
+circumvents
+circumvolution
+circumvolutions
+circus
+circus's
+circuses
+circusy
+cirenaica
+cirencester
+cirque
+cirques
+cirrate
+cirrhoses
+cirrhosis
+cirrhotic
+cirri
+cirripede
+cirrocumulus
+cirrose
+cirrostratus
+cirrous
+cirrus
+cirsoid
+Cisalpine
+ciscaucasia
+cisco
+ciskei
+cislunar
+cispadane
+cissoid
+cist
+cistaceous
+Cistercian
+cistern
+cistern's
+cisterna
+cisterns
+cistron
+Cistus
+cit
+citable
+citadel
+citadel's
+citadels
+citation
+citation's
+citational
+citations
+cite
+cited
+cites
+cithara
+cither
+citied
+cities
+citified
+citify
+citing
+citizen
+citizen's
+citizeness
+citizenize
+citizenizes
+citizenly
+citizenry
+citizens
+citizenship
+citole
+citral
+citrate
+citrated
+citreous
+citric
+citriculture
+citrin
+citrine
+Citroen
+citron
+citronella
+citrulline
+citrus
+citruses
+cittern
+citterns
+City
+city
+city's
+cityscape
+cityscapes
+citywide
+ciudad
+civ
+civet
+civic
+civically
+civics
+civie
+civies
+civil
+civilian
+civilian's
+civilianization
+civilianizations
+civilianize
+civilianized
+civilianizes
+civilianizing
+civilians
+civilists
+civilities
+civility
+civilizable
+civilizable's
+civilizables
+civilization
+civilization's
+civilizational
+civilizational's
+civilizationals
+civilizations
+civilize
+civilized
+civilizedness
+civilizer
+civilizers
+civilizes
+civilizing
+civilly
+civism
+civvy
+clabber
+clachan
+clack
+clacker
+clackers
+clackmannan
+clacks
+Clacton
+clactonian
+clad
+cladded
+cladding
+cladoceran
+cladode
+cladophora
+cladophyll
+clads
+claim
+claimable
+claimant
+claimant's
+claimants
+claimed
+claimer
+claiming
+claims
+clairaudience
+Claire
+clairvoyance
+clairvoyant
+clairvoyantly
+clairvoyants
+clam
+clam's
+clamant
+clamantly
+clambake
+clambakes
+clamber
+clambered
+clamberer
+clambering
+clambers
+clammier
+clammily
+clamminess
+clamming
+clammy
+clamor
+clamored
+clamorer
+clamorer's
+clamorers
+clamoring
+clamorist
+clamorist's
+clamorists
+clamorous
+clamorously
+clamorousness
+clamors
+clamp
+clampdown
+clamped
+clamper
+clamping
+clamps
+clams
+clamshell
+clamshells
+clamworm
+clamworms
+clan
+clandestine
+clandestinely
+clandestineness
+clang
+clanged
+clanger
+clangers
+clanging
+clangor
+clangor's
+clangored
+clangoring
+clangorous
+clangorously
+clangors
+clangs
+clank
+clanked
+clanking
+clankingly
+clannish
+clannishly
+clannishness
+clans
+clansman
+clansmen
+clap
+clapboard
+clapboards
+Clapeyron
+Clapham
+clapped
+clapper
+clapperboard
+clapperboards
+clapperclaw
+clappers
+clapping
+claps
+Clapton
+claptrap
+claque
+claques
+Clara
+Clarabella
+Clare
+Claremont
+Clarence
+Clarenceux
+Clarendon
+Clarendon's
+claret
+clarets
+clarification
+clarifications
+clarified
+clarifier
+clarifies
+clarify
+clarifying
+clarinet
+clarinetist
+clarinets
+clarinettist
+clarino
+clarion
+clarity
+Clark
+Clarke
+Clarkia
+claro
+clarridge
+Clarridge
+clarts
+clary
+clash
+clashed
+clasher
+clashes
+clashing
+clasp
+clasped
+clasper
+clasping
+clasps
+class
+classed
+classer
+classes
+classic
+classical
+classicalism
+classicalist
+classicality
+classicalize
+classicalizes
+classically
+classicism
+classicist
+classicistic
+classicization
+classicize
+classicized
+classicizes
+classicizing
+classics
+classier
+classiest
+classifiable
+classification
+classifications
+classificatorily
+classificatory
+classified
+classifieds
+classifier
+classifiers
+classifies
+classify
+classifying
+classiness
+classing
+classis
+classless
+classlessness
+classmate
+classmate's
+classmates
+classroom
+classroom's
+classrooms
+classwork
+classy
+clastic
+clathrate
+clatter
+clattered
+clatterer
+clattering
+clatteringly
+clatters
+clattery
+Claude
+Claudel
+Claudia
+claudication
+Claudio
+Claudius
+Claus
+clausal
+clause
+clause's
+Clausen
+clauses
+Clausewitz
+Clausius
+claustral
+claustrophobia
+claustrophobic
+clavate
+clave
+claver
+clavicembalo
+clavichord
+clavichordist
+clavicle
+clavicle's
+clavicles
+clavicorn
+clavicular
+clavier
+clavierist
+clavieristic
+claviform
+clavius
+claw
+clawed
+clawer
+clawing
+claws
+clay
+clay's
+claybank
+clayed
+clayey
+claying
+clayish
+claymore
+claypan
+clays
+claystone
+Clayton
+Clayton's
+Claytonia
+clayware
+clean
+cleanable
+cleaned
+cleaner
+cleaner's
+cleaners
+cleanest
+cleanhanded
+cleaning
+cleanlier
+cleanliness
+cleanly
+cleanness
+cleans
+cleanse
+cleansed
+cleanser
+cleansers
+cleanses
+cleansing
+cleanskin
+cleanthes
+cleanup
+cleanup's
+cleanups
+clear
+clearable
+clearance
+clearance's
+clearances
+clearcole
+clearcut
+cleared
+clearer
+clearest
+clearheaded
+clearheadedly
+clearheadedness
+clearing
+clearing's
+clearinghouse
+clearings
+clearly
+clearness
+clears
+clearstory
+Clearwater
+clearway
+clearways
+clearwing
+cleat
+cleated
+cleating
+cleats
+cleavage
+cleavages
+cleave
+cleaved
+cleaver
+cleavers
+cleaves
+cleaving
+cleck
+cleek
+cleethorpes
+clef
+clef's
+clefs
+cleft
+cleft's
+clefts
+cleg
+cleidoic
+cleisthenes
+cleistogamy
+clem
+Clematis
+clemence
+clemenceau
+clemency
+clemens
+Clemens
+clement
+clemente
+Clemente
+Clementine
+clemently
+clements
+Clemmons
+Clemson
+clench
+clenched
+clenches
+clenching
+Cleome
+cleon
+Cleopatra
+clepe
+cleped
+clepes
+cleping
+clepsydra
+cleptomania
+clerestory
+clergy
+clergyman
+clergymen
+cleric
+clerical
+clericalism
+clericalist
+clericalize
+clericalizes
+clerically
+clericals
+clerics
+clerihew
+clerk
+clerk's
+clerked
+clerkess
+clerking
+clerkly
+clerks
+clerkship
+cleruchy
+Cleve
+cleveite
+Cleveland
+Clevenger
+clever
+cleverer
+cleverest
+cleverish
+cleverly
+cleverness
+clevis
+clianthus
+Cliburn
+cliche
+cliche's
+cliches
+clichy
+click
+clicked
+clicker
+clickers
+clicking
+clicks
+client
+client's
+clientage
+cliental
+clientele
+clients
+cliff
+cliff's
+cliffhang
+cliffhanger
+cliffhanging
+Clifford
+cliffs
+cliffy
+Clifton
+Clifton's
+clii
+climacteric
+climactic
+climactically
+climate
+climate's
+climates
+climatic
+climatically
+climatize
+climatizes
+climatological
+climatologically
+climatologist
+climatologists
+climatology
+climax
+climaxed
+climaxes
+climaxing
+climb
+climbable
+climbed
+climber
+climbers
+climbing
+climbs
+clime
+clime's
+climes
+clinandrium
+clinch
+clinched
+clincher
+clinches
+clinching
+clinchingly
+cline
+clines
+cling
+clingfish
+clinging
+clings
+clingy
+clinic
+clinic's
+clinical
+clinically
+clinician
+clinicians
+clinics
+clink
+clinked
+clinker
+clinkered
+clinkering
+clinkers
+clinkstone
+clinometer
+clinometer's
+clinometers
+clinometric
+clinometry
+clinostat
+clinquant
+Clint
+Clinton
+Clinton's
+Clintonia
+Clio
+clip
+clip's
+clipboard
+clipboards
+clipped
+clipper
+clipper's
+clippers
+Clipperton
+clippie
+clipping
+clipping's
+clippings
+clips
+clipsheet
+clique
+clique's
+cliques
+cliquey
+cliquish
+cliquishly
+cliquishness
+clishmaclaver
+clisthenes
+clitellum
+clitic
+clitoral
+clitoric
+clitoris
+cliv
+Clive
+clix
+cloaca
+cloacal
+cloak
+cloak's
+cloaked
+cloaking
+cloakroom
+cloakrooms
+cloaks
+clobber
+clobbered
+clobbering
+clobbers
+cloche
+clock
+clocked
+clocker
+clockers
+clocking
+clockings
+clocklike
+clockmaker
+clocks
+clockwatcher
+clockwise
+clockwork
+clod
+clod's
+cloddish
+cloddishness
+cloddy
+clodhopper
+clodhopper's
+clodhoppers
+clodhopping
+clods
+clog
+clog's
+clogged
+clogging
+clogs
+cloister
+cloister's
+cloistered
+cloistering
+cloisters
+cloistral
+cloistress
+clomb
+clomp
+clomped
+clomping
+clomps
+clonal
+clonally
+clone
+cloned
+cloner
+cloners
+clones
+clonic
+clonicity
+cloning
+clonk
+clonked
+clonking
+clonks
+clonus
+clop
+clopped
+clopping
+clops
+closable
+close
+closeable
+closed
+closedown
+closefisted
+closely
+closemouthed
+closeness
+closenesses
+closeout
+closer
+closers
+closes
+closest
+closet
+closeted
+closetful
+closets
+closeup
+closeups
+closing
+closings
+Clostridium
+closure
+closure's
+closured
+closures
+closuring
+clot
+cloth
+clothbound
+clothe
+clothed
+clothes
+clothesbrush
+clotheshorse
+clothesline
+clotheslines
+clothesman
+clothesmen
+clothespin
+clothespress
+clothier
+clothing
+Clotho
+cloths
+clotted
+clotting
+cloture
+clotured
+clotures
+cloturing
+cloud
+cloudberry
+cloudburst
+cloudbursts
+clouded
+cloudier
+cloudiest
+cloudily
+cloudiness
+clouding
+cloudland
+cloudless
+cloudlessly
+cloudlessness
+cloudlet
+cloudlets
+clouds
+cloudscape
+cloudy
+clouet
+clough
+clout
+clove
+cloven
+clover
+cloverleaf
+cloverleaves
+cloves
+clovis
+clown
+clownery
+clowning
+clownish
+clownishly
+clownishness
+clowns
+cloy
+cloying
+cloyingly
+club
+club's
+clubable
+clubbable
+clubbed
+clubber
+clubbier
+clubbiness
+clubbing
+clubby
+clubfoot
+clubfooted
+clubhaul
+clubhouse
+clubland
+clubman
+clubroom
+clubrooms
+clubs
+cluck
+clucked
+clucking
+clucks
+clucky
+clue
+clue's
+clueing
+clueless
+clues
+cluing
+Cluj
+clumber
+clump
+clumped
+clumping
+clumps
+clumpy
+clumsier
+clumsiest
+clumsily
+clumsiness
+clumsy
+clung
+clunk
+clunked
+clunker
+clunkiness
+clunking
+clunks
+clunky
+clunkyly
+cluny
+clupeid
+clupeoid
+clustan
+cluster
+clusterability
+clusterable
+clustered
+clustering
+clusterings
+clusters
+clustery
+clutch
+clutched
+clutches
+clutching
+clutchy
+clutter
+cluttered
+cluttering
+clutters
+Cluytens
+clvi
+clvii
+clwyd
+clxi
+clxii
+clxiv
+clxix
+clxvi
+clxvii
+Clyde
+clydebank
+Clydesdale
+clype
+clypeus
+clyster
+Clytemnestra
+cm
+CMOS
+cnidarian
+cnidoblast
+cnidus
+cnossus
+cnut
+Co
+CO
+coacervate
+coach
+coach's
+coached
+coacher
+coaches
+coaching
+coachman
+coachmen
+coachwood
+coachwork
+coact
+coaction
+coactive
+coadapted
+coadjutant
+coadjutor
+coadjutrices
+coadjutrix
+coadunate
+coadunated
+coadunates
+coadunating
+coadunation
+coagulability
+coagulable
+coagulant
+coagulants
+coagulase
+coagulate
+coagulated
+coagulates
+coagulating
+coagulation
+coagulum
+coahuila
+coal
+coaled
+coaler
+coalesce
+coalesced
+coalescence
+coalescent
+coalesces
+coalescing
+coalface
+coalfield
+coalfields
+coalfish
+coalification
+coalify
+coaling
+coalition
+coalitionist
+coalize
+coalizer
+coalizers
+coalizes
+coalmine
+coalmines
+coalport
+coals
+coaming
+coapt
+coaptation
+coaptation's
+coapted
+coapting
+coapts
+coarctate
+coarctation
+coarse
+coarsely
+coarsen
+coarsened
+coarseness
+coarsening
+coarser
+coarsest
+coarticulation
+coarticulatory
+coast
+Coast
+coastal
+coasted
+coaster
+coasters
+coastguard
+coastguardman
+coastguardsman
+coasting
+coastland
+coastline
+coasts
+coastward
+coastwards
+coastwise
+coat
+Coatbridge
+coated
+coatee
+coater
+coaters
+Coates
+coati
+coating
+coatings
+coatrack
+coatroom
+coats
+coattail
+coattails
+coauthor
+coax
+coaxed
+coaxer
+coaxes
+coaxial
+coaxially
+coaxing
+cob
+cob's
+cobalt
+cobaltic
+cobaltite
+cobaltous
+Cobb
+Cobb's
+cobber
+Cobbett
+cobble
+cobbled
+cobbler
+cobbler's
+cobblers
+cobbles
+cobblestone
+cobblestoned
+cobblestones
+cobbling
+cobby
+cobden
+cobelligerent
+Cobham
+cobia
+coble
+cobnut
+Cobol
+Cobol's
+cobra
+cobs
+coburg
+cobweb
+cobweb's
+cobwebbed
+cobwebby
+cobwebs
+coca
+cocaine
+cocainism
+cocainization
+cocainization's
+cocainizations
+cocainize
+cocainizes
+cocci
+coccid
+coccidioidomycosis
+coccidiosis
+cocciferous
+coccolith
+coccyx
+cochabamba
+cochairman
+cochairmen
+Cochin
+cochineal
+cochise
+Cochise
+cochlea
+cochleate
+Cochran
+Cochran's
+Cochrane
+Cochrane's
+cock
+cockade
+cockaded
+Cockaigne
+cockalorum
+cockamamie
+cockatiel
+cockatoo
+cockatrice
+cockayne
+cockboat
+cockchafer
+cockcroft
+cockcrow
+cocked
+cocker
+cockerel
+cockeye
+cockeyed
+cockeyedly
+cockeyedness
+cockfight
+cockfight's
+cockfighting
+cockfights
+cockhorse
+cockier
+cockily
+cockiness
+cocking
+cockle
+cockleboat
+cocklebur
+cockleshell
+cockloft
+cockney
+cockneyfy
+cockneyish
+cockneyism
+cockneys
+cockpit
+cockpits
+cockroach
+cockroaches
+cocks
+cockscomb
+cocksfoot
+cockshy
+cockspur
+cocksure
+cockswain
+cocktail
+cocktail's
+cocktails
+cockup
+cocky
+coco
+cocoa
+coconscious
+coconsciousness
+coconspirator
+coconspirators
+coconut
+coconut's
+coconuts
+cocoon
+cocoon's
+cocoons
+cocopan
+cocos
+Cocos
+cocotte
+cocoyam
+cocteau
+cocurricular
+cod
+coda
+codable
+codasyl
+codder
+Coddington
+Coddington's
+coddle
+coddled
+coddler
+coddles
+coddling
+code
+codebook
+codebooks
+codebreak
+codeclination
+coded
+codefendant
+codeine
+codeless
+codeposit
+coder
+coder's
+coders
+codes
+codetermination
+codetermine
+codetermines
+codeword
+codeword's
+codewords
+codex
+codfish
+codger
+codices
+codicil
+codicillary
+codicology
+codifiability
+codification
+codification's
+codifications
+codified
+codifier
+codifier's
+codifiers
+codifies
+codify
+codifying
+coding
+codings
+codling
+codomain
+codominant
+codominate
+codominated
+codominates
+codominating
+codon
+codpiece
+codpieces
+cods
+codswallop
+Cody
+Cody's
+coed
+coedit
+coedited
+coediting
+coeditor
+coeditor's
+coeditors
+coedits
+coeds
+coeducation
+coeducational
+coeducationalize
+coeducationalizes
+coeducationally
+coefficient
+coefficient's
+coefficiently
+coefficients
+coelacanth
+coelenterate
+coelenteron
+coeliac
+coelom
+coelostat
+coenacle
+coenamor
+coenamored
+coenamoring
+coenamors
+coenobite
+coenocyte
+coenurus
+coenzyme
+coequal
+coequality
+coequalize
+coequalizes
+coequally
+coerce
+coerced
+coerces
+coercibility
+coercible
+coercing
+coercion
+coercions
+coercive
+coercively
+coerciveness
+coercivity
+coessential
+coetaneous
+coeternal
+coeternally
+coeternity
+coeur
+coeval
+coevality
+coevolution
+coexecutor
+coexist
+coexisted
+coexistence
+coexistent
+coexisting
+coexists
+coextend
+coextensive
+coextensively
+cofactor
+cofactors
+cofeature
+coff
+coffee
+coffee's
+coffeecup
+coffeehouse
+coffeepot
+coffees
+coffer
+coffer's
+cofferdam
+coffers
+Coffey
+Coffey's
+coffin
+coffin's
+coffins
+coffle
+coffles
+Coffman
+cofunction
+cog
+cogency
+cogent
+cogently
+coggan
+cogged
+cogging
+cogitable
+cogitate
+cogitated
+cogitates
+cogitating
+cogitation
+cogitative
+cogito
+coglike
+cognac
+cognate
+cognately
+cognates
+cognation
+cognations
+cognition
+cognitional
+cognitions
+cognitive
+cognitively
+cognitives
+cognitivity
+cognizable
+cognizably
+cognizance
+cognizant
+cognize
+cognized
+cognizer
+cognizers
+cognizes
+cognizing
+cognomen
+cognoscenti
+cogon
+cogs
+cogwheel
+cogwheels
+cohabit
+cohabitant
+cohabitants
+cohabitation
+cohabitational
+cohabitations
+cohabited
+cohabitee
+cohabitees
+cohabiting
+cohabits
+coheir
+coheiress
+Cohen
+cohere
+cohered
+coherence
+coherency
+coherent
+coherently
+coherer
+coheres
+cohering
+cohesion
+cohesional
+cohesionless
+cohesive
+cohesively
+cohesiveness
+Cohn
+coho
+cohobate
+cohomology
+cohort
+cohort's
+cohorts
+cohosh
+cohune
+coidentity
+coif
+coiffeur
+coiffeuse
+coiffing
+coiffure
+coiffured
+coign
+coil
+coilability
+coiled
+coiling
+coils
+coimbatore
+coimbra
+coin
+coinage
+coincide
+coincided
+coincidence
+coincidence's
+coincidences
+coincident
+coincidental
+coincidentally
+coincidently
+coincides
+coinciding
+coined
+coiner
+coining
+coins
+coinsurance
+coinsure
+coinsurer
+Cointreau
+coir
+coire
+coit
+coital
+coitally
+coition
+coitional
+coitus
+coke
+cokes
+coking
+cokuloris
+col
+cola
+colander
+colanders
+colasanto
+colatitude
+colatitudes
+colbert
+Colby
+colcannon
+colchester
+colchicine
+Colchicum
+Colchis
+colcothar
+cold
+coldblood
+colder
+coldest
+coldhearted
+coldheartedly
+coldheartedness
+coldish
+coldly
+coldness
+colds
+Cole
+Cole's
+colectomy
+Coleman
+Coleman's
+colemanite
+coleopteran
+coleoptile
+coleorhiza
+Coleridge
+coles
+coleslaw
+colet
+Colette
+Colette's
+coleus
+colewort
+coley
+Colgate
+coli
+colic
+colicky
+colicroot
+colicweed
+coliform
+coligny
+Colima
+coliseum
+colitis
+coll
+collaborate
+collaborated
+collaborates
+collaborating
+collaboration
+collaborationism
+collaborationist
+collaborationists
+collaborations
+collaborative
+collaboratively
+collaborator
+collaborator's
+collaborators
+collage
+collagen
+collages
+collagist
+collagists
+collapsar
+collapse
+collapsed
+collapses
+collapsibility
+collapsible
+collapsing
+collar
+collarbone
+collard
+collared
+collarette
+collaring
+collarless
+collars
+collate
+collated
+collateral
+collaterality
+collateralize
+collaterally
+collates
+collating
+collation
+collations
+collative
+collator
+collators
+colleague
+colleague's
+colleagues
+colleagueship
+colleaguesmanship
+collect
+collectable
+collectanea
+collected
+collectedly
+collectedness
+collectible
+collecting
+collection
+collection's
+collections
+collective
+collectively
+collectives
+collectivism
+collectivist
+collectivistic
+collectivistically
+collectivists
+collectivities
+collectivity
+collectivization
+collectivization's
+collectivizations
+collectivize
+collectivized
+collectivizes
+collector
+collector's
+collectorate
+collectorates
+collectors
+collectorship
+collects
+Colleen
+college
+college's
+colleges
+collegial
+collegiality
+collegially
+collegian
+collegians
+collegiate
+collegiately
+collegium
+collembolan
+collenchyma
+collet
+collide
+collided
+collides
+colliding
+collie
+collied
+collier
+Collier
+collieries
+colliery
+collies
+colligate
+colligation
+colligative
+collimate
+collimated
+collimates
+collimating
+collimation
+collimator
+collinear
+collinearity
+Collins
+Collinsia
+collision
+collision's
+collisional
+collisionally
+collisionless
+collisions
+collocate
+collocates
+collocation
+collocational
+collocutor
+collodion
+collogue
+collogued
+colloguing
+colloid
+colloidal
+colloidally
+collop
+colloq
+Colloq
+colloquia
+colloquial
+colloquialism
+colloquialism's
+colloquialisms
+colloquiality
+colloquialize
+colloquializes
+colloquially
+colloquist
+colloquium
+colloquoy
+colloquy
+collotype
+collude
+colluded
+colludes
+colluding
+collusion
+collusions
+collusive
+collusively
+colluvial
+colluvium
+colly
+collywobbles
+colmar
+Colobus
+colocynth
+colog
+cologarithm
+Cologne
+cologne
+cologned
+colombes
+Colombia
+Colombian
+Colombians
+Colombo
+Colombo's
+colon
+colon's
+colonel
+colonel's
+colonelcy
+colonels
+colonial
+colonialism
+colonialist
+colonialistic
+colonialize
+colonializes
+colonially
+colonialness
+colonials
+colonic
+colonies
+colonist
+colonist's
+colonists
+colonitis
+colonizabilities
+colonizability
+colonizability's
+colonizable
+colonizable's
+colonizables
+colonization
+colonization's
+colonizationist
+colonizationist's
+colonizationists
+colonizations
+colonize
+colonized
+colonizer
+colonizers
+colonizes
+colonizing
+colonnade
+colonnaded
+colonnades
+colons
+colonsay
+colony
+colony's
+colophon
+colophony
+coloquintida
+color
+color's
+colorabilities
+colorability
+colorability's
+colorable
+colorable's
+colorableness
+colorables
+colorablies
+colorably
+Colorado
+Colorado's
+colorama
+colorant
+colorants
+colorate
+coloration
+coloratura
+colorcast
+colorcaster
+colorcasters
+colored
+coloreds
+colorer
+colorer's
+colorers
+colorfast
+colorfastness
+colorful
+colorfully
+colorfulness
+colorific
+colorimeter
+colorimeter's
+colorimeters
+colorimetric
+colorimetrically
+colorimetry
+coloring
+colorings
+colorism
+colorisms
+colorist
+colorist's
+coloristic
+coloristically
+coloristics
+colorists
+colorization
+colorization's
+colorizations
+colorize
+colorizes
+colorless
+colorlessly
+colorlessness
+colorman
+colormap
+colormap's
+colormaps
+colormen
+colors
+colossae
+colossal
+colossally
+Colosseum
+colossi
+Colossian
+colossians
+colossus
+colossuses
+colostomy
+colostral
+colostrum
+colotomy
+colpitis
+colporteur
+colquhoun
+colt
+colt's
+colter
+coltish
+coltishly
+coltishness
+Coltrane
+colts
+coltsfoot
+colubrid
+colubrine
+colugo
+colum
+Columba
+columbarium
+Columbia
+Columbian
+columbic
+columbine
+columbines
+columbite
+columbium
+columbous
+Columbus
+columella
+column
+column's
+columnar
+columned
+columniation
+columnist
+columnistic
+columnists
+columnization
+columnization's
+columnizations
+columnize
+columnized
+columnizes
+columnizing
+columns
+columnwise
+colure
+Colwyn
+coly
+colza
+com
+coma
+comae
+comaker
+Comanche
+Comanchean
+comaneci
+comas
+comate
+comatose
+comatulid
+comb
+combat
+combatant
+combatant's
+combatants
+combated
+combating
+combative
+combatively
+combativeness
+combats
+combatted
+combe
+combed
+comber
+combers
+combinability
+combinable
+combinate
+combination
+combination's
+combinational
+combinations
+combinative
+combinator
+combinator's
+combinatorial
+combinatorially
+combinatoric
+combinatorics
+combinators
+combinatory
+combine
+combined
+combiner
+combiners
+combines
+combing
+combings
+combining
+comblike
+combo
+combos
+combs
+combust
+combuster
+combustibility
+combustible
+combustibles
+combustibly
+combusting
+combustion
+combustions
+combustive
+combustor
+combustors
+Comdex
+Comdex's
+come
+comeback
+comecon
+comedian
+comedian's
+comedians
+comedic
+comedie
+comedienne
+comediennes
+comedies
+comedo
+comedown
+comedy
+comedy's
+comelier
+comeliness
+comely
+comenius
+comer
+comers
+comes
+comest
+comestible
+comestibles
+comet
+comet's
+cometary
+cometh
+cometic
+comets
+comeuppance
+comfier
+comfit
+comfits
+comfort
+comfortabilities
+comfortability
+comfortable
+comfortableness
+comfortably
+comforted
+comforter
+comforters
+comforting
+comfortingly
+comfortless
+comforts
+comfrey
+comfy
+comic
+comic's
+comical
+comicality
+comically
+comics
+comines
+Cominform
+coming
+comings
+Comintern
+comique
+comitia
+comity
+comma
+comma's
+Command
+command
+command's
+commandable
+commandant
+commandant's
+commandants
+commanded
+commandeer
+commandeered
+commandeering
+commandeers
+commander
+commanders
+commandership
+commandery
+commanding
+commandingly
+commandment
+commandment's
+commandments
+commando
+commandos
+commands
+commas
+commeasure
+commedia
+commemorate
+commemorated
+commemorates
+commemorating
+commemoration
+commemorations
+commemorative
+commemoratively
+commemoratives
+commemorator
+commemorators
+commence
+commenced
+commencement
+commencement's
+commencements
+commencer
+commences
+commencing
+commend
+commendable
+commendably
+commendam
+commendation
+commendation's
+commendations
+commendatory
+commended
+commender
+commending
+commends
+commensal
+commensalism
+commensally
+commensurability
+commensurable
+commensurably
+commensurate
+commensurately
+commensurates
+commensuration
+commensurations
+comment
+comment's
+commentaries
+commentary
+commentary's
+commentate
+commentates
+commentator
+commentator's
+commentators
+commented
+commenter
+commenting
+comments
+commerce
+commerced
+commercial
+commercialism
+commercialist
+commercialistic
+commercialization
+commercialization's
+commercializations
+commercialize
+commercialized
+commercializes
+commercializing
+commercially
+commercialness
+commercials
+commercing
+Commie
+commie
+commies
+commination
+comminatory
+commines
+commingle
+commingled
+comminute
+comminuted
+comminution
+commis
+commiserate
+commiserated
+commiserates
+commiserating
+commiseration
+commiserative
+commissar
+commissariat
+commissary
+commission
+commissionaire
+commissioned
+commissioner
+commissioners
+commissionership
+commissioning
+commissions
+commissural
+commissure
+commit
+commitment
+commitment's
+commitments
+commits
+committable
+committal
+committed
+committee
+committee's
+committeeman
+committeemen
+committees
+committeewoman
+committeewomen
+committing
+commix
+commixture
+commo
+commode
+commodes
+commodious
+commodiously
+commodiousness
+commodities
+commodity
+commodity's
+commodore
+commodore's
+commodores
+commodus
+common
+commonable
+commonage
+commonalities
+commonality
+commonalty
+commoner
+commoner's
+commoners
+commonest
+commonize
+commonizes
+commonly
+commonness
+commonplace
+commonplaceness
+commonplaces
+commons
+commonsense
+commonsensible
+commonsensibly
+commonsensical
+commonweal
+commonwealth
+commonwealths
+commotion
+commotions
+commove
+commoved
+commoves
+commoving
+communal
+communalism
+communalist
+communalists
+communalities
+communality
+communalization
+communalization's
+communalizations
+communalize
+communalized
+communalizer
+communalizers
+communalizes
+communalizing
+communally
+communard
+communards
+commune
+communed
+communes
+communese
+communicability
+communicable
+communicableness
+communicably
+communicant
+communicant's
+communicants
+communicate
+communicated
+communicatee
+communicates
+communicatie
+communicating
+communication
+communicational
+communications
+communicative
+communicatively
+communicativeness
+communicator
+communicator's
+communicators
+communicatory
+communing
+communion
+communique
+communiques
+communism
+communist
+communist's
+communistic
+communistically
+communists
+communitarian
+communitarianism
+communities
+community
+community's
+communization
+communization's
+communizations
+communize
+communized
+communizes
+communizing
+commutable
+commutate
+commutated
+commutates
+commutating
+commutation
+commutations
+commutative
+commutatively
+commutativity
+commutator
+commutators
+commute
+commuted
+commuter
+commuters
+commutes
+commuting
+comnenus
+como
+comorin
+comoro
+Comoros
+comoving
+comp
+compact
+compacted
+compacter
+compacters
+compactest
+compactible
+compactify
+compacting
+compaction
+compactly
+compactness
+compactor
+compactor's
+compactors
+compacts
+compadre
+Compagnie
+compander
+companders
+companies
+companion
+companion's
+companionable
+companionableness
+companionably
+companionate
+companionize
+companionizes
+companions
+companionship
+companionway
+companionways
+company
+company's
+comparability
+comparable
+comparableness
+comparably
+comparatist
+comparative
+comparatively
+comparativeness
+comparatives
+comparativist
+comparator
+comparator's
+comparators
+compare
+compared
+comparer
+compares
+comparing
+comparison
+comparison's
+comparisons
+compart
+compartment
+compartmental
+compartmentalization
+compartmentalization's
+compartmentalizations
+compartmentalize
+compartmentalized
+compartmentalizes
+compartmentalizing
+compartmentation
+compartmentations
+compartmented
+compartmenting
+compartmentize
+compartmentizes
+compartments
+compass
+compassable
+compassed
+compasses
+compassing
+compassion
+compassionate
+compassionately
+compassionateness
+compassionless
+compatability
+compatibilities
+compatibility
+compatibility's
+compatible
+compatibleness
+compatibles
+compatibly
+compatriot
+compatriotic
+compatriots
+compeer
+compel
+compellable
+compellation
+compelled
+compeller
+compelling
+compellingly
+compels
+compend
+compendia
+compendious
+compendiously
+compendiousness
+compendium
+compensability
+compensable
+compensate
+compensated
+compensates
+compensating
+compensation
+compensational
+compensations
+compensative
+compensator
+compensators
+compensatory
+compere
+compered
+compering
+compete
+competed
+competence
+competences
+competencies
+competency
+competent
+competently
+competes
+competing
+competition
+competition's
+competitions
+competitive
+competitively
+competitiveness
+competitor
+competitor's
+competitors
+competitory
+compilability
+compilable
+compilation
+compilation's
+compilations
+compile
+compiled
+compiler
+compiler's
+compilers
+compiles
+compiling
+complacence
+complacency
+complacent
+complain
+complainant
+complainants
+complained
+complainer
+complainers
+complaining
+complainingly
+complains
+complaint
+complaint's
+complaints
+complaisance
+complaisant
+complaisantly
+compleat
+complect
+complected
+complement
+complemental
+complementarily
+complementariness
+complementarity
+complementary
+complementation
+complemented
+complementer
+complementers
+complementing
+complementizer
+complements
+comples
+complete
+completed
+completely
+completeness
+completer
+completes
+completing
+completion
+completions
+completive
+complex
+complexation
+complexes
+complexion
+complexional
+complexioned
+complexities
+complexity
+complexly
+complexness
+complexometric
+complexometry
+compliance
+compliances
+compliancy
+compliant
+compliantly
+complicacy
+complicate
+complicated
+complicatedly
+complicatedness
+complicates
+complicating
+complication
+complications
+complicator
+complicator's
+complicators
+complice
+complicity
+complied
+complier
+compliers
+complies
+compliment
+complimentarily
+complimentary
+complimented
+complimenter
+complimenters
+complimenting
+compliments
+compline
+complot
+comply
+complying
+compo
+component
+component's
+componential
+componentry
+components
+compony
+comport
+comported
+comportment
+compos
+compose
+composed
+composedly
+composedness
+composer
+composer's
+composers
+composes
+composing
+Compositae
+composite
+compositely
+composites
+composition
+compositional
+compositionally
+compositions
+compositor
+compositors
+compossible
+compost
+compostela
+composure
+compotation
+compote
+compound
+compoundable
+compounded
+compounder
+compounding
+compounds
+comprador
+comprehend
+comprehended
+comprehendible
+comprehending
+comprehends
+comprehensibility
+comprehensible
+comprehensibleness
+comprehensibly
+comprehension
+comprehensive
+comprehensively
+comprehensiveness
+compress
+compressed
+compressedly
+compresses
+compressibility
+compressible
+compressing
+compression
+compressional
+compressions
+compressive
+compressively
+compressor
+compressors
+comprisable
+comprisal
+comprisals
+comprise
+comprised
+comprises
+comprising
+compromise
+compromised
+compromiser
+compromisers
+compromises
+compromising
+compromisingly
+Comptometer
+Compton
+Compton's
+comptroller
+comptroller's
+comptrollers
+comptrollership
+compulsion
+compulsion's
+compulsions
+compulsive
+compulsively
+compulsiveness
+compulsives
+compulsivity
+compulsorily
+compulsory
+compunction
+compunctions
+compunctious
+compurgation
+compurgations
+compurgator
+Compuserve
+Compuserve's
+computability
+computable
+computation
+computation's
+computational
+computationally
+computations
+compute
+computed
+computer
+computer's
+computerese
+computerite
+computerizable
+computerization
+computerize
+computerized
+computerizes
+computerizing
+computerlike
+computernik
+computers
+computes
+computing
+comrade
+comradeliness
+comradely
+comradery
+comrades
+comradeship
+comsat
+comstockery
+comsummatively
+comte
+Comus
+con
+Conakry
+conan
+Conant
+Conant's
+conation
+conative
+conatus
+concatenate
+concatenated
+concatenates
+concatenating
+concatenation
+concatenations
+concave
+concavity
+conceal
+concealable
+concealed
+concealer
+concealers
+concealing
+concealingly
+concealment
+conceals
+concede
+conceded
+concededly
+conceder
+concedes
+conceding
+conceit
+conceited
+conceitedly
+conceitedness
+conceits
+conceivability
+conceivable
+conceivableness
+conceivably
+conceive
+conceived
+conceiver
+conceives
+conceiving
+concelebrate
+concensus
+concent
+concenter
+concentrate
+concentrated
+concentrates
+concentrating
+concentration
+concentrations
+concentrative
+concentrator
+concentrators
+concentric
+concentrically
+concentricity
+concept
+concept's
+conceptacle
+conception
+conception's
+conceptional
+conceptions
+conceptive
+concepts
+conceptual
+conceptualism
+conceptualist
+conceptualistic
+conceptualistically
+conceptuality
+conceptualization
+conceptualization's
+conceptualizations
+conceptualize
+conceptualized
+conceptualizer
+conceptualizes
+conceptualizing
+conceptually
+conceptus
+concern
+concerned
+concernedly
+concerning
+concernment
+concerns
+concert
+concertante
+concerted
+concertedly
+concertedness
+concertgoer
+concerti
+concertina
+concertino
+concertize
+concertizer
+concertizers
+concertizes
+concertmaster
+concertmeister
+concerto
+concertos
+concerts
+concession
+concession's
+concessionaire
+concessionaires
+concessional
+concessionary
+concessioner
+concessions
+concessive
+concessively
+conch
+concha
+conches
+conchie
+conchiferous
+conchiolin
+conchobar
+conchoid
+conchoidal
+conchology
+concierge
+concierges
+conciliar
+conciliarly
+conciliate
+conciliated
+conciliates
+conciliation
+conciliations
+conciliative
+conciliator
+conciliatory
+concinnity
+concise
+concisely
+conciseness
+concision
+concisions
+conclave
+conclaves
+conclude
+concluded
+concluder
+concludes
+concluding
+conclusion
+conclusion's
+conclusions
+conclusive
+conclusively
+conclusiveness
+concoct
+concocted
+concocter
+concoction
+concoctive
+concocts
+concomitance
+concomitant
+concomitantly
+concomitants
+concord
+concordance
+concordant
+concordantly
+concordat
+Concorde
+concorde
+Concordia
+concourse
+concourses
+concrescence
+concrescences
+concrescent
+concrete
+concreted
+concretely
+concreteness
+concretes
+concreting
+concretion
+concretionary
+concretism
+concretist
+concretistic
+concretization
+concretizations
+concretize
+concretized
+concretizes
+concretizing
+concubinage
+concubine
+concubines
+concupiscence
+concupiscent
+concupiscible
+concur
+concurred
+concurrence
+concurrencies
+concurrency
+concurrent
+concurrently
+concurring
+concurs
+concuss
+concussed
+concusses
+concussing
+concussion
+concussions
+concussive
+concussively
+condemn
+condemnable
+condemnate
+condemnation
+condemnations
+condemnatory
+condemned
+condemner
+condemners
+condemning
+condemnor
+condemns
+condensable
+condensate
+condensates
+condensation
+condensational
+condensations
+condense
+condensed
+condenser
+condensers
+condenses
+condensible
+condensing
+condescend
+condescendence
+condescending
+condescendingly
+condescends
+condescension
+condign
+condignly
+condillac
+condiment
+condimental
+condiments
+condition
+conditionable
+conditional
+conditionality
+conditionalize
+conditionalizes
+conditionally
+conditionals
+conditioned
+conditioner
+conditioners
+conditioning
+conditions
+condo
+condo's
+condolatory
+condole
+condoled
+condolence
+condolences
+condoling
+condom
+condominial
+condominium
+condominium's
+condominiums
+condoms
+condonable
+condonation
+condone
+condoned
+condoner
+condones
+condoning
+condor
+condos
+condottiere
+conduce
+conduced
+conduces
+conducing
+conducive
+conduciveness
+conduct
+conductance
+conductances
+conducted
+conductibility
+conductible
+conductimetric
+conducting
+conduction
+conductive
+conductively
+conductivities
+conductivity
+conductometric
+conductor
+conductor's
+conductorial
+conductors
+conductress
+conducts
+conduit
+conduits
+conduplicate
+conduplication
+condyle
+condyloid
+condyloma
+cone
+cone's
+coned
+coneflower
+cones
+Conestoga
+coney
+confab
+confabbed
+confabbing
+confabulate
+confabulated
+confabulates
+confabulation
+confabulations
+confabulator
+confabulatory
+confect
+confection
+confectionary
+confectioner
+confectioners
+confectionery
+confections
+confects
+confederacy
+confederal
+confederalist
+confederalists
+confederate
+confederates
+confederation
+confederations
+confederative
+confederatize
+confederatizes
+confer
+conferee
+conferees
+conference
+conference's
+conferences
+conferencing
+conferential
+conferment
+conferments
+conferrable
+conferral
+conferrals
+conferred
+conferrer
+conferrer's
+conferrers
+conferring
+confers
+Conferva
+confess
+confessable
+confessant
+confessed
+confessedly
+confesses
+confessing
+confession
+confession's
+confessional
+confessionalism
+confessionalist
+confessionally
+confessionals
+confessions
+confessor
+confessor's
+confessors
+confetti
+confidant
+confidant's
+confidante
+confidantes
+confidants
+confide
+confided
+confidence
+confidences
+confident
+confidential
+confidentiality
+confidentially
+confidentialness
+confidently
+confider
+confides
+confiding
+confidingly
+confidingness
+configurable
+configural
+configurate
+configurated
+configurates
+configurating
+configuration
+configuration's
+configurational
+configurationally
+configurationism
+configurations
+configurative
+configure
+configured
+configures
+configuring
+confine
+confined
+confinement
+confinement's
+confinements
+confiner
+confines
+confining
+confirm
+confirmability
+confirmable
+confirmand
+confirmation
+confirmation's
+confirmational
+confirmations
+confirmatory
+confirmed
+confirmedly
+confirmedness
+confirming
+confirms
+confiscable
+confiscatable
+confiscate
+confiscated
+confiscates
+confiscating
+confiscation
+confiscations
+confiscator
+confiscators
+confiscatory
+confiteor
+confiture
+conflagrant
+conflagrate
+conflagrated
+conflagrates
+conflagration
+conflagrations
+conflagrator
+conflagrators
+conflagratory
+conflate
+conflated
+conflates
+conflating
+conflation
+conflations
+conflatrate
+conflatrating
+conflict
+conflicted
+conflictful
+conflicting
+conflictingly
+confliction
+conflictions
+conflictive
+conflictless
+conflicts
+conflictual
+confluence
+confluences
+confluent
+confluents
+conflux
+confluxes
+confocal
+conform
+conformability
+conformable
+conformably
+conformal
+conformance
+conformation
+conformation's
+conformational
+conformationally
+conformations
+conformed
+conformer
+conformers
+conforming
+conformism
+conformist
+conformists
+conformity
+conforms
+confound
+confounded
+confoundedly
+confounder
+confounding
+confounds
+confraternities
+confraternity
+confrere
+confreres
+confront
+confrontal
+confrontation
+confrontation's
+confrontational
+confrontationism
+confrontationist
+confrontations
+confronted
+confronter
+confronters
+confronting
+confronts
+Confucian
+Confucianism
+Confucius
+confuse
+confused
+confusedly
+confusedness
+confuser
+confusers
+confuses
+confusing
+confusingly
+confusion
+confusional
+confusions
+confutation
+confutations
+confutative
+confutator
+confutators
+confute
+confuted
+confuter
+confutes
+confuting
+cong
+conga
+congeal
+congealed
+congealing
+congealment
+congeals
+congelation
+congelations
+congener
+congeneric
+congenial
+congeniality
+congenialize
+congenializes
+congenially
+congenital
+congenitally
+conger
+congeries
+congest
+congested
+congesting
+congestion
+congestive
+congests
+congius
+conglobate
+conglomerate
+conglomerated
+conglomerates
+conglomeratic
+conglomeration
+conglomerations
+conglomerative
+conglomerator
+conglutinant
+conglutinate
+conglutinated
+conglutinates
+conglutinating
+conglutination
+Congo
+Congolese
+congou
+congrats
+congratulate
+congratulated
+congratulates
+congratulation
+congratulations
+congratulator
+congratulatory
+congregant
+congregate
+congregated
+congregates
+congregating
+congregation
+congregational
+congregationalism
+congregationalist
+congregationalists
+congregationalize
+congregationalizes
+congregations
+congregator
+congress
+congress's
+congressed
+congresses
+congressing
+congressional
+congressionally
+congressman
+congressmen
+congresswoman
+congresswomen
+congretants
+Congreve
+congruence
+congruency
+congruent
+congruential
+congruentially
+congruently
+congruity
+congruous
+congruously
+congruousness
+conic
+conical
+conically
+conicalness
+conicity
+conics
+conidiophore
+conidium
+conifer
+coniferous
+conifers
+coniine
+coning
+coniology
+Coniston
+Conium
+conjectural
+conjecturally
+conjecture
+conjectured
+conjecturer
+conjectures
+conjecturing
+conjoin
+conjoined
+conjoining
+conjoins
+conjoint
+conjointly
+conjuction
+conjugacy
+conjugal
+conjugality
+conjugally
+conjugant
+conjugants
+conjugate
+conjugated
+conjugately
+conjugateness
+conjugates
+conjugating
+conjugation
+conjugational
+conjugationally
+conjugations
+conjugative
+conjunct
+conjuncted
+conjunction
+conjunction's
+conjunctional
+conjunctionally
+conjunctions
+conjunctiva
+conjunctival
+conjunctive
+conjunctively
+conjunctivitis
+conjuncts
+conjuncture
+conjunctures
+conjuration
+conjurations
+conjure
+conjured
+conjurer
+conjurers
+conjures
+conjuring
+conjuror
+conk
+conked
+conker
+conkers
+conking
+Conklin
+Conklin's
+conks
+Conley
+Conley's
+conn
+connacht
+Connally
+Connally's
+connate
+connately
+connatural
+connaturality
+connaturally
+connaught
+connect
+connectable
+connected
+connectedly
+connectedness
+connecter
+connecters
+connectible
+Connecticut
+connecting
+connection
+connection's
+connectional
+connections
+connective
+connective's
+connectively
+connectives
+connectivities
+connectivity
+connector
+connector's
+connectors
+connects
+conned
+connelly
+Connelly
+connemara
+conner
+connexions
+Connie
+conning
+conniption
+connivance
+connive
+connived
+connivent
+conniver
+connivery
+connives
+conniving
+connoisseur
+connoisseur's
+connoisseurs
+connoisseurship
+Connors
+connotation
+connotational
+connotations
+connotative
+connotatively
+connote
+connoted
+connotes
+connoting
+connubial
+connubialism
+connubiality
+connubially
+conodont
+conoid
+conoscenti
+conquer
+conquerable
+conquered
+conquerer
+conquerers
+conquering
+conqueror
+conqueror's
+conquerors
+conquers
+conquest
+conquest's
+conquests
+conquian
+conquistador
+conquistadores
+conquistadors
+Conrad
+Conrad's
+Conrail
+Conrail's
+cons
+consanguine
+consanguineous
+consanguineously
+consanguinity
+conscience
+conscience's
+conscienceless
+consciences
+conscientious
+conscientiously
+conscientiousness
+conscionable
+conscionably
+conscious
+consciouses
+consciously
+consciousness
+conscribe
+conscribed
+conscribes
+conscribing
+conscript
+conscripted
+conscripting
+conscription
+conscriptions
+conscripts
+consecrate
+consecrated
+consecrates
+consecrating
+consecration
+consecrations
+consecrative
+consecrator
+consecratory
+consecution
+consecutive
+consecutively
+consecutiveness
+consensual
+consensually
+consensus
+consent
+consentaneous
+consentaneously
+consented
+consenter
+consenters
+consentient
+consenting
+consentingly
+consents
+consequence
+consequence's
+consequences
+consequent
+consequential
+consequentialities
+consequentiality
+consequentially
+consequentialness
+consequently
+consequentness
+consequents
+conservancy
+conservation
+conservation's
+conservational
+conservationist
+conservationist's
+conservationists
+conservations
+conservatism
+conservative
+conservatively
+conservativeness
+conservatives
+conservatize
+conservatized
+conservatizes
+conservatizing
+conservatoire
+conservator
+conservatorial
+conservatorium
+conservatory
+conserve
+conserved
+conserver
+conserves
+conserving
+consett
+consider
+considerable
+considerably
+considerate
+considerately
+considerateness
+consideration
+considerations
+considered
+considerer
+considering
+considers
+consign
+consignable
+consignation
+consigned
+consignee
+consigning
+consignment
+consignor
+consigns
+consist
+consisted
+consistence
+consistencies
+consistency
+consistent
+consistently
+consisting
+consistorial
+consistory
+consists
+consociate
+consociation
+consociational
+consocies
+consol
+consolable
+consolation
+consolation's
+consolations
+consolatory
+console
+consoled
+consoler
+consolers
+consoles
+consolette
+consolidate
+consolidated
+consolidates
+consolidating
+consolidation
+consolidations
+consolidator
+consolidators
+consoling
+consolingly
+consols
+consolute
+consonance
+consonancy
+consonant
+consonant's
+consonantal
+consonantize
+consonantizes
+consonantly
+consonants
+consort
+consorted
+consorting
+consortium
+consorts
+conspecific
+conspectus
+conspectuses
+conspicuity
+conspicuous
+conspicuously
+conspicuousness
+conspiracies
+conspiracy
+conspiracy's
+conspiration
+conspirational
+conspirations
+conspirator
+conspirator's
+conspiratorial
+conspiratorially
+conspirators
+conspire
+conspired
+conspires
+conspiring
+constable
+constable's
+constables
+constabulary
+constance
+constancy
+constant
+constantan
+Constantine
+Constantine's
+Constantinople
+constantly
+constants
+constatation
+constellate
+constellation
+constellation's
+constellations
+constellatory
+consternate
+consternated
+consternates
+consternating
+consternation
+constipate
+constipated
+constipates
+constipating
+constipation
+constituencies
+constituency
+constituency's
+constituent
+constituent's
+constituently
+constituents
+constitute
+constituted
+constitutes
+constituting
+constitution
+constitutional
+constitutionalism
+constitutionalist
+constitutionality
+constitutionalization
+constitutionalization's
+constitutionalizations
+constitutionalize
+constitutionalizes
+constitutionally
+constitutionless
+constitutions
+constitutive
+constitutively
+constrain
+constrained
+constrainedly
+constraining
+constrains
+constraint
+constraint's
+constraints
+constrict
+constricted
+constricting
+constriction
+constrictions
+constrictive
+constrictor
+constrictors
+constricts
+constringe
+constringed
+constringent
+constringes
+constringing
+construable
+construal
+construct
+constructed
+constructibility
+constructible
+constructing
+construction
+construction's
+constructional
+constructionally
+constructionist
+constructions
+constructive
+constructively
+constructiveness
+constructivism
+constructivist
+constructor
+constructor's
+constructors
+constructs
+construe
+construed
+construes
+construing
+consubstantial
+consubstantiate
+consubstantiation
+consuetude
+consuetudinary
+consul
+consul's
+consular
+consulate
+consulate's
+consulates
+consuls
+consulship
+consult
+consultancies
+consultancy
+consultant
+consultant's
+consultants
+consultantship
+consultation
+consultation's
+consultations
+consultative
+consulted
+consulter
+consulting
+consultive
+consultor
+consults
+consumable
+consumables
+consume
+consumed
+consumedly
+consumer
+consumer's
+consumerism
+consumerist
+consumers
+consumership
+consumes
+consuming
+consumingly
+consummate
+consummated
+consummately
+consummates
+consummating
+consummation
+consummations
+consummative
+consummator
+consummatory
+consumption
+consumption's
+consumptions
+consumptive
+consumptively
+cont'd
+contact
+contacted
+contacting
+contactor
+contacts
+contagion
+contagious
+contagiously
+contagiousness
+contagium
+contain
+containable
+contained
+container
+containerboard
+containerization
+containerize
+containerized
+containerizes
+containerizing
+containers
+containing
+containment
+containment's
+containments
+contains
+contaminant
+contaminants
+contaminate
+contaminated
+contaminates
+contaminating
+contamination
+contaminations
+contaminative
+contaminator
+contango
+contemn
+contemplate
+contemplated
+contemplates
+contemplating
+contemplation
+contemplations
+contemplative
+contemplatively
+contemplativeness
+contemplator
+contemporaneity
+contemporaneous
+contemporaneously
+contemporaneousness
+contemporaries
+contemporarily
+contemporariness
+contemporary
+contemporization
+contemporize
+contemporized
+contemporizes
+contemporizing
+contempt
+contemptible
+contemptibleness
+contemptibly
+contemptuous
+contemptuously
+contemptuousness
+contend
+contended
+contender
+contendere
+contenders
+contending
+contends
+content
+contented
+contentedly
+contentedness
+contenting
+contention
+contention's
+contentions
+contentious
+contentiously
+contentiousness
+contently
+contentment
+contents
+conterminous
+conterminously
+contest
+contestable
+contestant
+contestants
+contestation
+contested
+contester
+contesters
+contesting
+contests
+context
+context's
+contexts
+contextual
+contextually
+contexture
+contiguity
+contiguous
+contiguously
+contiguousness
+continence
+continent
+continent's
+continental
+Continentalize
+Continentalizes
+continentally
+continently
+continents
+contingence
+contingencies
+contingency
+contingency's
+contingent
+contingent's
+contingently
+contingents
+continously
+continua
+continual
+continually
+continuance
+continuance's
+continuances
+continuant
+continuate
+continuated
+continuates
+continuating
+continuation
+continuation's
+continuations
+continuative
+continuatively
+continuator
+continue
+continued
+continuer
+continues
+continuing
+continuities
+continuity
+continuo
+continuous
+continuously
+continuousness
+continuum
+conto
+contort
+contorted
+contorting
+contortion
+contortionist
+contortionistic
+contortionists
+contortions
+contortive
+contorts
+contour
+contour's
+contoured
+contouring
+contours
+contraband
+contrabandist
+contrabass
+contrabassist
+contrabassoon
+contraception
+contraceptive
+contraceptives
+contract
+contracted
+contractibility
+contractible
+contractile
+contractility
+contracting
+contraction
+contraction's
+contractional
+contractions
+contractive
+contractor
+contractor's
+contractors
+contracts
+contractual
+contractually
+contracture
+contradance
+contradict
+contradictable
+contradicted
+contradicting
+contradiction
+contradiction's
+contradictions
+contradictious
+contradictor
+contradictorily
+contradictoriness
+contradictory
+contradicts
+contradistinct
+contradistinction
+contradistinctions
+contradistinctive
+contradistinctively
+contradistinguish
+contrail
+contraindicate
+contraindicated
+contraindicates
+contraindicating
+contraindication
+contraindication's
+contraindications
+contraindicative
+contralateral
+contralto
+contraoctave
+contraposition
+contrapositive
+contrapositives
+contraption
+contraption's
+contraptions
+contrapuntal
+contrapuntally
+contrapuntist
+contrarieties
+contrariety
+contrarily
+contrariness
+contrarious
+contrariwise
+contrary
+contrast
+contrastable
+contrasted
+contraster
+contrasters
+contrasting
+contrastingly
+contrastive
+contrastively
+contrasts
+contrasty
+contrasuggestible
+contrate
+contravallation
+contravariant
+contravene
+contravened
+contravener
+contravenes
+contravening
+contravention
+contrayerva
+contredanse
+contretemps
+contribute
+contributed
+contributer
+contributers
+contributes
+contributing
+contribution
+contributions
+contributive
+contributively
+contributor
+contributor's
+contributorily
+contributors
+contributory
+contrite
+contritely
+contriteness
+contrition
+contrivance
+contrivance's
+contrivances
+contrive
+contrived
+contriver
+contrives
+contriving
+control
+control's
+controllability
+controllable
+controllably
+controlled
+controllee
+controllees
+controller
+controller's
+controllers
+controllership
+controllerships
+controlling
+controlment
+controlments
+controls
+controversial
+controversialism
+controversialist
+controversialists
+controversialize
+controversializes
+controversially
+controversies
+controversy
+controversy's
+controvert
+controverted
+controverter
+controvertible
+controverting
+controverts
+contumacious
+contumaciously
+contumacy
+contumelious
+contumeliously
+contumely
+contuse
+contused
+contuses
+contusing
+contusion
+contusions
+conundrum
+conundrum's
+conundrumize
+conundrumizes
+conundrums
+conurbation
+conurbations
+conure
+Convair
+Convair's
+convalesce
+convalescence
+convalescent
+convalescing
+convect
+convected
+convecting
+convection
+convectional
+convections
+convective
+convector
+convectors
+convects
+convene
+convened
+convener
+conveners
+convenes
+convenience
+convenience's
+conveniences
+conveniency
+convenient
+conveniently
+convening
+convent
+convent's
+conventicle
+conventicler
+convention
+convention's
+conventional
+conventionalism
+conventionalist
+conventionality
+conventionalization
+conventionalization's
+conventionalizations
+conventionalize
+conventionalized
+conventionalizes
+conventionalizing
+conventionally
+conventioneer
+conventionize
+conventionizes
+conventions
+convents
+conventual
+conventually
+converge
+converged
+convergence
+convergences
+convergency
+convergent
+converges
+converging
+conversable
+conversance
+conversancy
+conversant
+conversantly
+conversation
+conversation's
+conversational
+conversationalist
+conversationally
+conversationize
+conversationizes
+conversations
+converse
+conversed
+conversely
+converses
+conversing
+conversion
+conversional
+conversioning
+conversions
+convert
+converted
+converter
+converters
+convertibility
+convertible
+convertibleness
+convertibly
+converting
+convertiplane
+convertite
+convertor
+converts
+convex
+convexity
+convey
+conveyance
+conveyance's
+conveyanced
+conveyancer
+conveyancers
+conveyances
+conveyancing
+conveyed
+conveyer
+conveyers
+conveying
+conveyor
+conveyorize
+conveyorized
+conveyorizes
+conveyorizing
+conveyors
+conveys
+convict
+convicted
+convicting
+conviction
+conviction's
+convictions
+convictive
+convicts
+convince
+convinced
+convincer
+convincers
+convinces
+convincing
+convincingly
+convincingness
+convivial
+conviviality
+convivialize
+convivializes
+convivially
+convocate
+convocation
+convocational
+convocations
+convoke
+convoked
+convokes
+convoking
+convolute
+convoluted
+convolutely
+convolution
+convolutional
+convolutions
+convolve
+convolved
+convolves
+convolving
+convolvulaceous
+Convolvulus
+convoy
+convoyed
+convoying
+convoys
+convulsant
+convulse
+convulsed
+convulses
+convulsing
+convulsion
+convulsion's
+convulsionary
+convulsions
+convulsive
+convulsively
+convulsiveness
+Conway
+Conway's
+cony
+coo
+cooch
+cooee
+cooing
+Cook
+cook
+cook's
+cookbook
+cookbooks
+Cooke
+Cooke's
+cooked
+cooker
+cookers
+cookery
+cookhouse
+cookie
+cookie's
+cookies
+cooking
+cookout
+cookouts
+cooks
+cookshack
+cookshop
+cookware
+cooky
+cool
+coolabah
+coolant
+coolants
+cooled
+cooler
+cooler's
+coolers
+coolest
+Cooley
+Cooley's
+coolgardie
+coolheaded
+Coolidge
+coolie
+coolie's
+coolies
+cooling
+coolings
+coolish
+coolly
+coolness
+coolnesses
+cools
+coom
+coomb
+coombs
+coon
+coon's
+cooncan
+coons
+coonskin
+coontie
+coop
+cooped
+cooper
+cooperage
+cooperate
+cooperated
+cooperates
+cooperating
+cooperation
+cooperationist
+cooperations
+cooperative
+cooperatively
+cooperativeness
+cooperatives
+cooperativity
+cooperator
+cooperator's
+cooperators
+coopered
+coopering
+coopers
+coops
+coopt
+coordinal
+coordinate
+coordinated
+coordinately
+coordinateness
+coordinates
+coordinating
+coordination
+coordinations
+coordinative
+coordinator
+coordinator's
+coordinators
+Coors
+coot
+cootch
+cootie
+cop
+cop's
+copacetic
+copaiba
+copal
+copalm
+coparcenary
+coparcener
+copartner
+copartnership
+cope
+copeck
+coped
+Copeland
+copemate
+Copenhagen
+copepod
+coper
+Copernican
+Copernicus
+copes
+copesetic
+copesmate
+copestone
+copied
+copier
+copiers
+copies
+copilot
+coping
+copings
+copious
+copiously
+copiousness
+copita
+coplanar
+coplanarity
+Copland
+copley
+copliots
+copolymer
+copolymerization
+copolymerization's
+copolymerizations
+copolymerize
+copolymerized
+copolymerizes
+copolymerizing
+copolymers
+copper
+copper's
+copperas
+coppered
+Copperfield
+copperhead
+coppering
+copperization
+copperization's
+copperizations
+copperize
+copperizes
+copperplate
+coppers
+coppersmith
+coppersmiths
+coppery
+coppice
+copping
+copra
+coprinus
+coprocessor
+coprocessor's
+coprocessors
+coproduct
+coproduct's
+coproducts
+coprolalia
+coprolite
+coprolitic
+coprology
+coprophagous
+coprophilia
+coprophilous
+Coprosma
+cops
+copse
+copses
+Copt
+copter
+copters
+Coptic
+copula
+copulas
+copulate
+copulated
+copulates
+copulating
+copulation
+copulative
+copulatively
+copulatory
+copy
+copybook
+copybooks
+copyboy
+copycat
+copycats
+copycatted
+copycatting
+copydesk
+copygraph
+copyhold
+copyholder
+copying
+copyist
+copyread
+copyreader
+copyright
+copyright's
+copyrighted
+copyrighter
+copyrighters
+copyrighting
+copyrights
+copywriter
+coquelicot
+coquet
+coquetry
+coquette
+coquetted
+coquetting
+coquettish
+coquettishly
+coquettishness
+coquilla
+Coquille
+coquina
+coquito
+coraciiform
+coracle
+coracoid
+coral
+Coral
+coralberry
+coraled
+coralline
+corallite
+coralloid
+coralroot
+Corantijn
+coranto
+corban
+corbeil
+corbel
+corbeled
+corbeling
+corbelings
+Corbett
+Corbett's
+corbicula
+corbie
+corbusier
+corby
+Corcoran
+Corcoran's
+corcyra
+cord
+cordage
+cordate
+cordately
+corday
+corded
+Cordelier
+cordeliers
+corder
+cordial
+cordiality
+cordialize
+cordializes
+cordially
+cordialness
+cordierite
+cordiform
+cordillera
+cordilleras
+cording
+cordite
+cordless
+cordoba
+cordon
+cordova
+Cordovan
+cords
+corduroy
+corduroys
+cordwain
+cordwainer
+cordwainery
+cordwood
+core
+corecipient
+cored
+corelate
+corelation
+coreligionist
+corella
+corelli
+Coreopsis
+corequisite
+corer
+corers
+cores
+corespondent
+Corey
+Corey's
+corf
+corfam
+corfu
+corgi
+coriaceous
+coriander
+coring
+Corinth
+Corinthian
+Corinthianize
+Corinthianizes
+corinthians
+Corinthians
+Coriolanus
+coriolis
+corium
+cork
+corkage
+corkboard
+corkboards
+corked
+corker
+corkers
+corkier
+corking
+corks
+corkscrew
+corkscrews
+corkwood
+corky
+cormel
+cormophyte
+cormorant
+cormorants
+corn
+cornball
+cornbread
+corncob
+corncockle
+corncrake
+corncrib
+cornea
+corneal
+corned
+corneille
+cornel
+Cornelia
+Cornelia's
+cornelian
+Cornelian
+Cornelius
+Cornell
+Cornell's
+corneous
+corner
+cornered
+cornering
+cornerman
+corners
+cornerstone
+cornerstone's
+cornerstones
+cornerways
+cornerwise
+cornet
+cornetcy
+cornetist
+cornett
+cornettist
+cornfield
+cornfield's
+cornfields
+cornflakes
+cornflour
+cornflower
+cornhusk
+cornhusking
+cornice
+corniced
+cornices
+corniche
+cornicing
+corniculate
+cornier
+corniest
+cornification
+cornily
+corniness
+corning
+Cornish
+cornmeal
+cornmonger
+corno
+corns
+cornstalk
+cornstarch
+cornstone
+cornu
+cornucopia
+cornucopian
+cornute
+Cornwall
+cornwallis
+Cornwallis
+corny
+corody
+corolla
+corollaceous
+corollaries
+corollary
+corollary's
+corollate
+coromandel
+corona
+coronach
+Coronado
+coronagraph
+coronal
+coronaries
+coronary
+coronate
+coronation
+coroner
+coroners
+coronet
+coronet's
+coroneted
+coronets
+coronograph
+corot
+coroutine
+coroutine's
+coroutines
+corozo
+Corp
+corpocracies
+corpocracy
+corpora
+corporal
+corporal's
+corporality
+corporally
+corporals
+corporate
+corporately
+corporation
+corporation's
+corporations
+corporatism
+corporatist
+corporative
+corporativism
+corporator
+corporeal
+corporeality
+corporealization
+corporealization's
+corporealizations
+corporealize
+corporealizes
+corporeally
+corporealness
+corporeity
+corporis
+corposant
+corps
+corpse
+corpse's
+corpses
+corpsman
+corpsmen
+corpulence
+corpulences
+corpulencies
+corpulency
+corpulent
+corpulently
+corpulentness
+corpulentnesses
+corpus
+corpuscle
+corpuscle's
+corpuscles
+corpuscular
+corpusculated
+corpuscule
+corpuscules
+corrade
+corraded
+corrading
+corral
+corralled
+corralling
+corrals
+corrasion
+corrasions
+corrasive
+correct
+correctable
+corrected
+correcting
+correction
+correctional
+corrections
+correctitude
+corrective
+correctively
+correctiveness
+correctives
+correctly
+correctness
+corrector
+corrects
+correggio
+corregidor
+correlatable
+correlate
+correlated
+correlates
+correlating
+correlation
+correlational
+correlations
+correlative
+correlatively
+correlator
+correspond
+corresponded
+correspondence
+correspondence's
+correspondences
+correspondency
+correspondent
+correspondent's
+correspondents
+corresponding
+correspondingly
+corresponds
+corresponsive
+corrida
+corridor
+corridor's
+corridors
+Corriedale
+corrientes
+corrigenda
+corrigendum
+corrigibility
+corrigible
+corrigibly
+corrival
+corroborant
+corroborate
+corroborated
+corroborates
+corroborating
+corroboration
+corroborations
+corroborative
+corroboratively
+corroborator
+corroborators
+corroboratory
+corroboree
+corrode
+corroded
+corrodent
+corrodes
+corrodible
+corroding
+corrody
+corrosion
+corrosions
+corrosive
+corrosively
+corrosiveness
+corrosives
+corrugate
+corrugated
+corrugates
+corrugating
+corrugation
+corrugations
+corrugator
+corrupt
+corrupted
+corrupter
+corruptibility
+corruptible
+corruptibly
+corrupting
+corruption
+corruptionist
+corruptive
+corruptively
+corruptly
+corrupts
+corsac
+corsage
+corsages
+corsair
+corse
+corselet
+corset
+corsetry
+corsets
+corsica
+Corsica
+Corsica's
+Corsican
+corsican
+cortege
+corteges
+Cortes
+cortex
+cortexes
+Cortez
+cortical
+cortically
+corticate
+corticated
+cortices
+corticoid
+corticosteroid
+corticosteroids
+corticosterone
+corticotrophin
+cortisol
+cortisone
+Cortland
+cortot
+corundum
+corunna
+coruscate
+coruscated
+coruscates
+coruscating
+coruscation
+coruscations
+Corvallis
+corvallis
+corves
+corvette
+corvine
+Corvus
+Corybant
+Corydalis
+Corydon
+Corydoras
+corymb
+coryphaeus
+coryza
+cos
+cosa
+cosec
+cosecant
+cosech
+coseismal
+cosenza
+coset
+cosgrave
+Cosgrove
+Cosgrove's
+cosh
+cosher
+cosignatory
+cosigner
+cosily
+cosine
+cosines
+cosmetic
+cosmetician
+cosmeticians
+cosmetics
+cosmetologist
+cosmetologists
+cosmetology
+cosmic
+cosmical
+cosmically
+cosmine
+cosmo
+cosmochemical
+cosmochemistry
+cosmodrome
+cosmogenic
+cosmogonic
+cosmogonical
+cosmogonist
+cosmogony
+cosmographer
+cosmographic
+cosmographical
+cosmographically
+cosmography
+cosmoid
+cosmologic
+cosmological
+cosmologically
+cosmologist
+cosmologist's
+cosmologists
+cosmology
+cosmonaut
+cosmopolis
+cosmopolitan
+cosmopolitanism
+cosmopolitanization
+cosmopolitanization's
+cosmopolitanizations
+cosmopolitanize
+cosmopolitanizes
+cosmopolite
+cosmopolitism
+cosmos
+cosmoses
+cosmotron
+cospar
+cosponsor
+cosponsored
+cosponsors
+cosponsorship
+coss
+cossack
+cossacks
+cosset
+cosseted
+cosseting
+cossets
+cossie
+cost
+Costa
+costa
+costal
+costard
+costate
+costed
+Costello
+Costermansville
+costermonger
+costing
+costive
+costively
+costiveness
+costless
+costlessly
+costlier
+costliness
+costly
+costmary
+costotomy
+costrel
+costs
+costume
+costumed
+costumer
+costumers
+costumery
+costumes
+costumey
+costumier
+costuming
+cosy
+cot
+cot's
+cotan
+cotangent
+cote
+cotemporary
+cotenant
+coterie
+coteries
+coterminosity
+coterminous
+coterminously
+coth
+cothurnus
+cotidal
+cotillion
+cotillon
+Cotinga
+cotman
+cotoneaster
+cotonou
+cotopaxi
+cotquean
+Cotrubas
+cots
+cotswold
+cotswolds
+cotta
+cottage
+cottager
+cottagers
+cottages
+cottagey
+cottbus
+cotter
+cotters
+cottian
+cotton
+cottonade
+cottoned
+cottoning
+cottonization
+cottonization's
+cottonizations
+cottonize
+cottonizes
+cottonmouth
+cottons
+cottonseed
+cottontail
+cottontail's
+cottontails
+cottonweed
+cottonwood
+cottony
+Cottrell
+Cottrell's
+cotty
+cotyledon
+cotyledon's
+cotyledons
+cotyloid
+coucal
+couch
+couchant
+couched
+couches
+couchette
+couching
+cougar
+cougars
+cough
+coughed
+cougher
+coughing
+coughs
+could
+could've
+couldest
+couldn't
+couldst
+coulee
+coulibiaca
+couloir
+coulomb
+coulometer
+coulometers
+Coulter
+Coulter's
+coumarin
+coumarone
+council
+council's
+councillor
+councillor's
+councillors
+councilman
+councilmanic
+councilmen
+councilorship
+councils
+councilwoman
+councilwomen
+counsel
+counsel's
+counseled
+counselee
+counseling
+counselor
+counselor's
+counselors
+counselorship
+counsels
+count
+countability
+countable
+countably
+countdown
+countdown's
+countdowns
+counted
+countenance
+countenancer
+counter
+counteract
+counteracted
+counteracting
+counteraction
+counteractive
+counteracts
+counterargument
+counterarguments
+counterattack
+counterattacker
+counterattraction
+counterbalance
+counterbalanced
+counterbalances
+counterbalancing
+counterblast
+counterblow
+counterchallenge
+counterchange
+countercharge
+countercheck
+counterclaim
+counterclockwise
+counterculture
+countercurrent
+countercurrently
+countercyclical
+countered
+counterespionage
+counterexample
+counterexamples
+counterfactual
+counterfeit
+counterfeited
+counterfeiter
+counterfeiting
+counterfeits
+counterflow
+counterfoil
+counterforce
+counterglow
+countering
+counterinsurgency
+counterintelligence
+counterintuitive
+counterirritant
+counterman
+countermand
+countermanded
+countermanding
+countermands
+countermarch
+countermeasure
+countermeasure's
+countermeasures
+countermen
+countermove
+countermovement
+counteroffensive
+counteroffer
+counterpane
+counterpart
+counterpart's
+counterparts
+counterplan
+counterplea
+counterplot
+counterpoint
+counterpointing
+counterpoise
+counterpose
+counterposed
+counterposes
+counterposing
+counterposition
+counterproductive
+counterproof
+counterproposal
+counterpunch
+counterpuncher
+counterreformation
+counterrevolution
+counterrevolutionaries
+counterrevolutionary
+counterrevolutionary's
+counterrevolutionist
+counters
+countershade
+countershaded
+countershades
+countershading
+countershaft
+countershafts
+countersign
+countersignature
+countersink
+countersinking
+countersinks
+counterspy
+counterstatement
+countersubject
+countersunk
+countertenor
+countertenors
+counterterrorism
+counterterrorist
+counterthreat
+counterthreat's
+counterthreats
+countertrend
+countertype
+countervail
+countervailed
+countervailing
+countervails
+counterview
+counterweigh
+counterweight
+counterweight's
+counterweighted
+counterweighting
+counterweights
+counterword
+counterwork
+countess
+counties
+counting
+countless
+countlessly
+countries
+countrified
+countrify
+country
+country's
+countryfied
+countryish
+countryman
+countrymen
+countryseat
+countryside
+countrywide
+countrywoman
+counts
+county
+county's
+countywide
+coup
+coupal
+coupe
+Couperin
+couple
+couple's
+coupled
+couplement
+coupler
+couplers
+couples
+couplet
+couplet's
+couplets
+coupling
+couplings
+coupon
+coupon's
+coupons
+coups
+courage
+courageous
+courageously
+courageousness
+courante
+courantyne
+courbet
+courbevoie
+coureur
+courgette
+courier
+courier's
+couriers
+courlan
+Courland
+course
+coursed
+courser
+courses
+coursework
+coursing
+court
+courted
+courtelle
+courteous
+courteously
+courteousness
+courter
+courters
+courtesan
+courtesies
+courtesy
+courtesy's
+courthouse
+courthouse's
+courthouses
+courtier
+courtier's
+courtiers
+courting
+courtliness
+courtly
+courtmartial
+Courtney
+Courtney's
+courtrai
+courtroom
+courtroom's
+courtrooms
+courts
+courtship
+courtyard
+courtyard's
+courtyards
+couscous
+cousin
+cousin's
+cousinage
+cousinhood
+cousins
+cousinship
+Cousteau
+couth
+couthie
+couture
+couturier
+couturiere
+couvade
+covalence
+covalency
+covalent
+covalently
+covariance
+covariances
+covariant
+covariants
+covariate
+covariates
+covariation
+covary
+cove
+coven
+covenant
+covenant's
+covenantal
+covenanted
+covenantee
+covenanter
+covenanting
+covenantor
+covenants
+Covent
+covent
+coventry
+Coventry
+cover
+coverable
+coverage
+coverall
+coveralled
+coveralls
+coverdale
+covered
+coverer
+covering
+coverings
+coverless
+coverlet
+coverlet's
+coverlets
+coverley
+covers
+coversed
+covert
+covertly
+covertness
+coverture
+covertures
+coves
+covet
+covetable
+coveted
+coveter
+coveting
+covetingly
+covetous
+covetously
+covetousness
+covets
+covey
+coveys
+covin
+coving
+covington
+cow
+cowage
+Cowan
+Cowan's
+coward
+cowardice
+cowardliness
+cowardly
+cowards
+cowbane
+cowbell
+cowberry
+cowbind
+cowbird
+cowbirds
+cowboy
+cowboy's
+cowboys
+cowcatcher
+cowed
+cowedly
+Cowell
+cower
+cowered
+cowerer
+cowerers
+cowering
+coweringly
+cowers
+cowes
+cowfish
+cowgirl
+cowgirl's
+cowgirls
+cowhand
+cowhands
+cowherb
+cowherd
+cowhide
+cowhided
+cowhiding
+Cowichan
+cowing
+cowitch
+cowk
+cowl
+cowled
+cowley
+cowlick
+cowling
+cowls
+cowman
+cowmen
+coworker
+coworker's
+coworkers
+cowpat
+cowpea
+cowper
+cowpoke
+cowpony
+cowpox
+cowpunch
+cowpuncher
+cowry
+cows
+cowskin
+cowslip
+cowslip's
+cowslips
+cox
+coxa
+coxalgia
+coxcomb
+coxcombry
+coxcombs
+coxsackie
+coxswain
+coy
+coyly
+coyness
+coyote
+coyote's
+coyotes
+coyotillo
+coypu
+coz
+cozen
+cozier
+cozies
+cozily
+coziness
+cozy
+CPA
+CPR
+cpr
+CPU
+CPU's
+CPUs
+Craal
+crab
+crab's
+crabapple
+crabbe
+crabbed
+crabbedly
+crabbedness
+crabber
+crabbier
+crabbing
+crabby
+crabmeat
+crabs
+crabstick
+crabwise
+crack
+crackajack
+crackbrain
+crackbrained
+crackdown
+cracked
+cracker
+crackerjack
+crackers
+cracket
+cracking
+crackjaw
+crackle
+crackled
+crackles
+crackling
+crackly
+cracknel
+crackpot
+crackpots
+cracks
+cracksman
+cracow
+craddock
+cradle
+cradled
+cradler
+cradles
+cradlesong
+cradling
+craft
+crafted
+crafter
+craftier
+craftily
+craftiness
+crafting
+crafts
+craftsman
+craftsmanlike
+craftsmanship
+craftsmen
+craftspeople
+craftsperson
+craftswoman
+craftswomen
+crafty
+crag
+crag's
+cragged
+craggier
+craggily
+cragginess
+craggy
+crags
+cragsman
+Craig
+craigie
+craiova
+crake
+cram
+crambo
+Cramer
+crammed
+crammer
+cramming
+cramoisy
+cramp
+cramp's
+cramped
+cramper
+crampon
+crampon's
+crampons
+cramps
+crams
+cran
+cranach
+cranage
+cranberries
+cranberry
+cranberry's
+Crandall
+crane
+crane's
+craned
+cranelike
+craneman
+cranemen
+cranes
+cranesbill
+Cranfield
+Cranford
+crania
+cranial
+cranially
+craniate
+craning
+craniology
+craniometer
+craniometry
+craniotomy
+cranium
+crank
+crankcase
+cranked
+crankier
+crankiest
+crankily
+crankiness
+cranking
+cranko
+crankpin
+cranks
+crankshaft
+cranky
+cranmer
+crannied
+crannies
+crannog
+cranny
+Cranston
+cranwell
+crap
+crapaud
+crape
+craping
+crapper
+crappie
+crappier
+crapping
+crappy
+craps
+crapshooter
+crapulent
+crapulous
+craquelure
+crash
+crashable
+crashaw
+crashed
+crasher
+crashers
+crashes
+crashing
+crashworthiness
+crashworthy
+crasis
+crass
+crassest
+crassitude
+crassly
+crassness
+crassulaceous
+crassus
+cratch
+crate
+crater
+cratered
+craterlet
+craters
+crates
+crating
+craunch
+cravat
+cravat's
+cravats
+crave
+craved
+craven
+cravenly
+cravenness
+craver
+craves
+craving
+craw
+Crawford
+crawl
+crawled
+crawler
+crawlerize
+crawlerizes
+crawlers
+crawley
+crawling
+crawls
+crawlspace
+crawlway
+crawly
+Cray
+cray
+Cray's
+crayfish
+crayon
+crayonist
+crayons
+Crays
+craze
+crazed
+crazes
+crazier
+craziest
+crazily
+craziness
+crazing
+crazy
+creak
+creaked
+creakier
+creakily
+creaking
+creaks
+creaky
+cream
+creamcups
+creamed
+creamer
+creamers
+creamery
+creamily
+creaminess
+creaming
+creamlaid
+creams
+creamy
+crease
+creased
+creaseless
+creaser
+creases
+creasing
+create
+created
+creates
+creatine
+creating
+creatinine
+creation
+creationism
+creationism's
+creations
+creative
+creatively
+creativeness
+creativity
+creator
+creator's
+creators
+creatural
+creature
+creature's
+creaturehood
+creatureliness
+creaturely
+creatures
+creaturize
+creaturizes
+creche
+creches
+credence
+credendum
+credent
+credential
+credentials
+credenza
+credibility
+credible
+credibly
+credit
+creditability
+creditable
+creditableness
+creditably
+credited
+crediting
+creditor
+creditor's
+creditors
+credits
+credo
+credos
+credulity
+credulous
+credulously
+credulousness
+Cree
+cree
+creed
+creed's
+creedal
+creeds
+creek
+creek's
+creeks
+creekside
+creel
+creels
+creep
+creepage
+creeper
+creepers
+creepie
+creepier
+creepiness
+creeping
+creeps
+creepy
+creese
+Creighton
+creighton
+cremate
+cremated
+cremates
+cremating
+cremation
+cremations
+cremator
+crematorium
+crematory
+cremona
+crenate
+crenated
+crenately
+crenation
+crenel
+crenelate
+crenelated
+crenelates
+crenelation
+creneled
+creneling
+crenelle
+crenulate
+crenulated
+crenulation
+creodont
+Creole
+Creolization
+Creolize
+Creolized
+Creolizes
+Creolizing
+Creon
+creophagous
+creosol
+creosote
+crepe
+crepey
+crepitant
+crepitate
+crepitation
+crepitus
+crept
+crepuscle
+crepuscular
+crepuscule
+crepy
+crescendo
+crescent
+crescent's
+crescentic
+crescents
+crescive
+crescively
+cresol
+cress
+cresset
+Cressida
+cressy
+crest
+crestal
+crested
+crestfallen
+crestfallenly
+crestfallenness
+cresting
+crestless
+Creston
+crests
+Crestview
+cresylic
+Cretaceous
+Cretaceously
+Cretan
+Crete
+Cretic
+cretin
+cretinism
+cretinization
+cretinization's
+cretinizations
+cretinize
+cretinizes
+cretinous
+cretins
+cretonne
+creuse
+crevasse
+crevice
+crevice's
+crevices
+crew
+crewcut
+crewe
+crewed
+crewel
+crewelwork
+crewing
+crewless
+crewman
+crewmember
+crewmembers
+crewmen
+crews
+crib
+crib's
+cribbage
+cribbage's
+cribber
+cribbing
+cribellum
+cribriform
+cribs
+Crichton
+crick
+cricket
+cricket's
+cricketer
+cricketing
+crickets
+cricoid
+cried
+crier
+criers
+cries
+crikey
+crim
+crime
+crime's
+Crimea
+Crimean
+crimes
+criminal
+criminality
+criminalization
+criminalization's
+criminalize
+criminally
+criminals
+criminate
+criminating
+crimination
+criminological
+criminologically
+criminologist
+criminology
+criminous
+crimmer
+crimp
+crimped
+crimper
+crimpier
+crimping
+crimple
+crimplene
+crimps
+crimpy
+crimson
+crimsoning
+cringe
+cringed
+cringer
+cringes
+cringing
+cringle
+crinite
+crinkle
+crinkled
+crinkleroot
+crinkles
+crinkling
+crinkly
+crinoid
+crinoline
+Crinum
+criollo
+cripes
+crippen
+cripple
+crippled
+crippler
+cripples
+crippling
+cripps
+crises
+criseyde
+crisis
+crisp
+crispate
+crispation
+crispbread
+crisper
+crispi
+crispier
+Crispin
+Crispin's
+crispiness
+crisply
+crispness
+crisps
+crispy
+criss
+crisscross
+crisscrossed
+crisscrosses
+crissum
+crista
+cristate
+cristobalite
+criteria
+criterion
+critic
+critic's
+critical
+criticality
+critically
+criticalness
+criticaster
+criticism
+criticism's
+criticisms
+criticizable
+criticizable's
+criticizables
+criticize
+criticized
+criticizer
+criticizers
+criticizes
+criticizing
+criticizinglies
+criticizingly
+critics
+critique
+critiqued
+critiques
+critiquing
+critter
+critter's
+critters
+croak
+croaked
+croaker
+croakers
+croaking
+croaks
+croaky
+Croat
+Croatia
+croatian
+Croatian
+croce
+crocein
+crochet
+crocheted
+crocheter
+crocheting
+crochets
+crocidolite
+crock
+crocked
+crocker
+crockery
+crocket
+crocketed
+Crockett
+Crockford
+crocks
+crocodile
+crocodiles
+crocodilian
+crocoite
+crocus
+crocuses
+croesus
+croft
+crofter
+crofterization
+crofterization's
+crofterizations
+crofterize
+crofterizes
+crofters
+croissant
+croissants
+Croix
+crombec
+cromlech
+Crompton
+Cromwell
+Cromwellian
+crone
+crones
+cronies
+Cronin
+cronk
+cronus
+crony
+cronyism
+crook
+crookback
+crookbacked
+crooked
+crookedly
+crookedness
+Crookes
+Crookesmoor
+crooks
+croon
+crooned
+crooner
+crooners
+crooning
+croons
+crop
+crop's
+cropland
+cropland's
+croplands
+cropped
+cropper
+cropper's
+croppers
+cropping
+crops
+croquet
+croquette
+crore
+Crosby
+crosier
+cross
+crossability
+crossable
+crossarm
+crossbar
+crossbar's
+crossbars
+crossbeam
+crossbearer
+crossbill
+crossbones
+crossbow
+crossbowman
+crossbred
+crossbreed
+crosscheck
+crosscurrent
+crosscurrents
+crosscut
+crosse
+crossed
+crosser
+crossers
+crosses
+crossfire
+crosshatch
+crosshatched
+crosshatches
+crosshatching
+crosshead
+crossing
+crossings
+crossjack
+crosslet
+Crossley
+crosslink
+crosslink's
+crosslinks
+crossly
+crossopterygian
+crossover
+crossover's
+crossovers
+crosspatch
+crosspiece
+crosspoint
+crosspool
+crossproduct
+crossproducts
+crossroad
+crossroading
+crossroads
+crossruff
+crosstabulate
+crosstabulation
+crosstalk
+crosstie
+crossties
+crosstown
+crosstree
+crosswalk
+crossway
+crossways
+crosswind
+crosswise
+crossword
+crossword's
+crosswords
+crotch
+crotched
+crotches
+crotchet
+crotcheted
+crotchetiness
+crotcheting
+crotchets
+crotchety
+croton
+crotone
+crotonic
+crouch
+crouched
+crouches
+crouching
+croup
+croupier
+croupous
+croupy
+crouse
+croute
+crouton
+croutons
+crow
+crowbait
+crowbar
+crowbar's
+crowbars
+crowberry
+crowboot
+crowd
+crowded
+crowdedness
+crowder
+crowding
+crowds
+crowed
+crowfeet
+crowfoot
+crowfoots
+crowing
+crowkeeper
+Crowley
+crown
+crowned
+crowner
+crownet
+crowning
+Crownland
+crownpiece
+crowns
+crownwork
+crows
+Croydon
+Croydon's
+croze
+crozier
+CRT
+cru
+cruces
+crucial
+crucially
+crucian
+cruciate
+cruciately
+crucible
+crucifer
+cruciferous
+crucification
+crucified
+crucifies
+crucifix
+crucifixion
+cruciform
+cruciformly
+crucify
+crucifying
+cruck
+crud
+crudded
+crudding
+cruddy
+crude
+crudely
+crudeness
+cruder
+crudest
+crudities
+crudity
+cruel
+crueler
+cruelest
+cruelize
+cruelizes
+crueller
+cruellest
+cruelly
+cruelness
+cruelty
+cruet
+cruft
+crufty
+Cruickshank
+Cruickshank's
+cruise
+cruised
+cruiser
+cruisers
+cruiserweight
+cruises
+cruiseway
+cruising
+cruller
+crumb
+crumbier
+crumble
+crumbled
+crumbles
+crumblier
+crumbliness
+crumbling
+crumblings
+crumbly
+crumbs
+crumby
+crumhorn
+crummier
+crummies
+crummock
+crummy
+crump
+crumpet
+crumple
+crumpled
+crumples
+crumpling
+crunch
+crunched
+cruncher
+crunchers
+crunches
+crunchier
+crunchiest
+crunchiness
+crunching
+crunchy
+crunode
+crupper
+crura
+crural
+crus
+crusade
+crusaded
+crusader
+crusaders
+crusades
+crusading
+crusado
+cruse
+crush
+crushable
+crushed
+crusher
+crushers
+crushes
+crushing
+crushingly
+crushproof
+Crusoe
+crust
+crust's
+crustacea
+crustacean
+crustacean's
+crustaceans
+crustaceous
+crustal
+crusted
+crustier
+crustification
+crustily
+crustiness
+crusting
+crustose
+crusts
+crusty
+crutch
+crutch's
+crutched
+crutches
+crux
+crux's
+cruxes
+cruyff
+Cruz
+cruzado
+cruzeiro
+crwth
+cry
+crybaby
+cryer
+crying
+crymotherapy
+cryobiological
+cryobiologically
+cryobiologist
+cryobiologists
+cryobiology
+cryocable
+cryogen
+cryogenic
+cryogenically
+cryogenics
+cryogeny
+cryohydrate
+cryolite
+cryometer
+cryonic
+cryonics
+cryophilic
+cryophyte
+cryoplankton
+cryoscope
+cryoscopic
+cryoscopy
+cryostat
+cryosurgery
+cryotherapy
+cryotron
+crypt
+cryptaesthesia
+cryptal
+cryptanalysis
+cryptanalyst
+cryptanalytic
+cryptanalyze
+cryptic
+cryptical
+cryptically
+crypto
+cryptoclastic
+cryptocrystalline
+cryptogam
+cryptogenic
+cryptogram
+cryptogram's
+cryptogrammic
+cryptograms
+cryptograph
+cryptographer
+cryptographic
+cryptographically
+cryptography
+cryptologic
+cryptological
+cryptologist
+cryptology
+Cryptomeria
+cryptos
+cryptozoic
+cryptozoite
+crypts
+cryst
+crystal
+crystal's
+crystalline
+crystallite
+crystallites
+crystallizabilities
+crystallizability
+crystallizability's
+crystallizable
+crystallizable's
+crystallizables
+crystallization
+crystallization's
+crystallizations
+crystallize
+crystallized
+crystallizer
+crystallizers
+crystallizes
+crystallizing
+crystallographer
+crystallographers
+crystallographic
+crystallographica
+crystallography
+crystals
+CSNET
+CST
+CT
+ctenidium
+ctenoid
+ctenophore
+ctesiphon
+cub
+cub's
+Cuba
+cubage
+Cuban
+cubane
+Cubanize
+Cubanizes
+Cubans
+cubature
+cubbies
+cubby
+cubbyhole
+cube
+cubeb
+cubed
+cuber
+Cuberli
+cubes
+cubic
+cubical
+cubically
+cubicle
+cubicles
+cubicly
+cubics
+cubiculum
+cubiform
+cubing
+cubism
+cubist
+cubistic
+cubists
+cubit
+cubital
+cuboid
+cuboidal
+cubs
+cucking
+cuckold
+cuckoldry
+cuckoo
+cuckoo's
+cuckooflower
+cuckoopint
+cuckoos
+cuculiform
+cucullate
+cucullated
+cucullates
+cucumber
+cucumber's
+cucumbers
+cucurbit
+cud
+cudbear
+cuddle
+cuddleback
+cuddled
+cuddles
+cuddlesome
+cuddlier
+cuddling
+cuddly
+cuddy
+cudgel
+cudgel's
+cudgeled
+cudgeler
+cudgelers
+cudgeling
+cudgelings
+cudgels
+cudgerie
+cudweed
+cue
+cued
+cueing
+cuenca
+cuernavaca
+cues
+cuesta
+cuff
+cuff's
+cuffed
+cuffing
+cuffless
+cufflink
+cufflinks
+cuffs
+cufic
+cuing
+cuirass
+cuirassier
+cuisine
+cuisse
+cuke
+culation
+Culbertson
+Culbertson's
+culch
+culebra
+culet
+Culex
+culicid
+culinary
+cull
+culled
+cullender
+culler
+cullet
+culling
+cullis
+culloden
+culls
+cully
+culm
+culmiferous
+culminant
+culminate
+culminated
+culminates
+culminating
+culmination
+culotte
+culottes
+culpa
+culpability
+culpable
+culpableness
+culpably
+culpas
+culprit
+culprit's
+culprits
+cult
+cult's
+cultch
+cultic
+cultigen
+cultism
+cultist
+cultists
+cultivability
+cultivable
+cultivar
+cultivars
+cultivatable
+cultivate
+cultivated
+cultivates
+cultivating
+cultivation
+cultivations
+cultivator
+cultivator's
+cultivators
+cultrate
+cults
+cultural
+culturally
+culture
+cultured
+cultures
+culturing
+culturization
+culturization's
+culturizations
+culturize
+culturizes
+Culver
+culverin
+Culvers
+culvert
+cum
+cumae
+cumber
+Cumberland
+cumbernauld
+cumbersome
+cumbersomely
+cumbersomeness
+cumbria
+Cumbrian
+cumbrous
+cumbrously
+cumbrousness
+cumin
+cummerbund
+Cummings
+Cummins
+cumquat
+cumshaw
+cumulate
+cumulated
+cumulates
+cumulating
+cumulation
+cumulations
+cumulative
+cumulatively
+cumulet
+cumuliform
+cumulonimbus
+cumulostratus
+cumulous
+cumulus
+Cunard
+cunaxa
+cunctation
+cunctative
+Cundick
+cuneal
+cuneate
+cuneately
+cuneiform
+cuneo
+cunjevoi
+cunner
+cunnilinctus
+cunnilingus
+cunning
+Cunningham
+cunningly
+cunningness
+cunt
+CUNY
+cup
+cup's
+cupbearer
+cupboard
+cupboard's
+cupboards
+cupcake
+cupcakes
+cupel
+cupelation
+cupeled
+cupeler
+cupelers
+cupeling
+Cupertino
+Cupertino's
+cupful
+cupfuls
+Cupid
+cupidity
+cuplike
+cupola
+cuppa
+cupped
+cuppier
+cupping
+cuppy
+cupreous
+cupric
+cupriferous
+cuprite
+cuprous
+cuprum
+cups
+cupsful
+cupular
+cupulate
+cupule
+cur
+curability
+curable
+curableness
+curably
+curacy
+curare
+curarine
+curarize
+curarized
+curarizes
+curarizing
+curassow
+curate
+curative
+curatively
+curatize
+curatizes
+curator
+curatorial
+curators
+curatorship
+curb
+curbed
+curbing
+curbs
+curbside
+curbstone
+curch
+Curculio
+Curcuma
+curd
+curdle
+curdled
+curdles
+curdling
+curds
+cure
+cured
+cureless
+curer
+cures
+curet
+curettage
+curette
+curetted
+curettement
+curetting
+curfew
+curfew's
+curfews
+curia
+curiae
+curie
+curing
+curio
+curios
+curiosa
+curiosities
+curiosity
+curiosity's
+curious
+curiouser
+curiousest
+curiously
+curiousness
+curite
+curitiba
+curium
+curl
+curled
+curler
+curlers
+curlew
+curlicue
+curlier
+curliness
+curling
+curlpaper
+curls
+curly
+curmudgeon
+curmudgeonly
+currajong
+Curran
+Curran's
+currant
+currant's
+currants
+currawong
+currencies
+currency
+currency's
+current
+currently
+currentness
+currents
+curricle
+curricula
+curricular
+curricularization
+curricularization's
+curricularizations
+curricularize
+curricularizes
+curriculum
+curriculum's
+curriculums
+currie
+curried
+currier
+curriery
+curries
+currish
+currishly
+curry
+currycomb
+currying
+curs
+curse
+cursed
+cursedly
+cursedness
+curses
+cursing
+cursive
+cursively
+cursiveness
+cursor
+cursor's
+cursorial
+cursorily
+cursoriness
+cursors
+cursory
+curst
+curt
+curtail
+curtailed
+curtailer
+curtailing
+curtailment
+curtails
+curtain
+curtained
+curtaining
+curtains
+curtal
+Curtana
+curtesy
+curtilage
+curtin
+Curtis
+curtly
+curtness
+curtsey
+curtseyed
+curtseying
+curtseys
+curtsied
+curtsies
+curtsy
+curtsy's
+curtsying
+curule
+curvaceous
+curvaceously
+curvacious
+curvature
+curvatures
+curve
+curveball
+curved
+curves
+CURVET
+Curvet
+curvilineal
+curvilinear
+curvilinearity
+curvilinearly
+curving
+curvy
+curzon
+cusco
+Cuscus
+cusec
+cush
+cushat
+cushiest
+cushily
+Cushing
+Cushing's
+cushion
+cushioned
+cushioning
+cushionless
+cushions
+cushiony
+Cushitic
+Cushman
+cushy
+cusk
+cuso
+cusp
+cusp's
+cuspate
+cuspated
+cuspid
+cuspidate
+cuspidated
+cuspidation
+cuspidor
+cusps
+cuss
+cussed
+cussedly
+cussedness
+cusser
+cusses
+cussword
+cusswords
+custard
+Custer
+Custer's
+custodial
+custodian
+custodian's
+custodians
+custodianship
+custodianships
+custodies
+custody
+custom
+customable
+customarily
+customariness
+customary
+customer
+customer's
+customers
+customhouse
+customhouses
+customizable
+customization
+customization's
+customizations
+customize
+customized
+customizer
+customizers
+customizes
+customizing
+customs
+customshouse
+custos
+custumal
+cut
+cut's
+cutability
+cutaneous
+cutaneously
+cutaround
+cutaway
+cutback
+cutbacks
+cutch
+cutcherry
+cute
+cutely
+cuteness
+cuter
+cutes
+cutest
+cutesy
+cutey
+cuteys
+Cuthbert
+cuticle
+cuticles
+cuticula
+cuticular
+cutie
+cutin
+cutinize
+cutinized
+cutinizes
+cutinizing
+cutis
+cutization
+cutization's
+cutizations
+cutlass
+cutler
+cutlery
+cutlet
+cutlets
+cutline
+cutoff
+cutoffs
+cutout
+cutouts
+cutover
+cutpurse
+cuts
+cutset
+cuttable
+cuttack
+cutter
+cutter's
+cutters
+cutthroat
+cutting
+cuttingly
+cuttings
+cuttle
+cuttlebone
+cuttlebones
+cuttlefish
+cuttlefishes
+cutty
+cutup
+cutups
+cutwater
+cutwork
+cutworm
+cuvette
+Cuvier
+cuxhaven
+cuyp
+cuzco
+Cuzco
+cwmbran
+cyan
+Cyanamid
+cyanamide
+cyanate
+cyanic
+cyanide
+cyanine
+cyanite
+cyanocobalamin
+cyanogen
+cyanohydrin
+cyanosis
+cyanotype
+cybele
+cyber
+cybernate
+cybernated
+cybernation
+cybernetic
+cybernetical
+cybernetically
+cybernetician
+cyberneticist
+cybernetics
+cyborg
+cycad
+Cyclades
+cyclamate
+cyclamen
+cycle
+cycled
+cycler
+cycles
+cyclic
+cyclical
+cyclically
+cyclicity
+cyclicly
+cycling
+cyclist
+cyclists
+cyclitol
+cyclization
+cyclization's
+cyclizations
+cyclize
+cyclized
+cyclizes
+cyclizing
+cyclo
+cycloaddition
+cycloalkane
+cyclograph
+cycloheptatrienyl
+cyclohexane
+cyclohexanol
+cyclohexyl
+cycloid
+cycloid's
+cycloidal
+cycloids
+cyclometer
+cyclometer's
+cyclometers
+cyclone
+cyclone's
+cyclones
+cyclonic
+cyclonically
+cyclonite
+cycloparaffin
+cyclopean
+cyclopedia
+cyclopentadienyl
+cyclopentane
+cycloplegia
+cyclopropane
+cyclops
+cyclorama
+cyclos
+cyclosis
+cyclostome
+cyclostyle
+cyclothymia
+cyclotomic
+cyclotomy
+cyclotron
+cyder
+cydnus
+cygnet
+cygnet's
+cygnets
+Cygnus
+cylinder
+cylinder's
+cylindered
+cylindering
+cylinders
+cylindric
+cylindrical
+cylindrically
+cylindroid
+cylix
+cyma
+cymar
+cymatium
+cymbal
+cymbal's
+cymbalist
+cymbalists
+cymbalo
+cymbals
+cyme
+cymene
+cymogene
+cymograph
+cymoid
+cymophane
+cymose
+Cymric
+cymru
+cynghanedd
+cynic
+cynical
+cynically
+cynicism
+cynics
+cynosure
+Cynthia
+cyperaceous
+cypher
+cyphers
+cypress
+Cyprian
+cyprinid
+cyprinodont
+cyprinoid
+Cypriot
+Cypripedium
+Cyprus
+cypsela
+Cyrano
+Cyrenaic
+cyrenaica
+cyrene
+Cyril
+Cyrillic
+Cyrus
+cyst
+cystamine
+cystectomy
+cysteine
+cystic
+cysticercoid
+cystine
+cystitis
+cystocarp
+cystocele
+cystoid
+cystolith
+cystoscope
+cystotomy
+cysts
+cytaster
+cythera
+Cytherea
+cytidine
+cytochemical
+cytochemically
+cytochemistry
+cytochrome
+cytogenesis
+cytogenetics
+cytokinesis
+cytokinin
+cytologic
+cytological
+cytologically
+cytologist
+cytology
+cytolysin
+cytolysis
+cytolytic
+cyton
+cytopathogenicity
+cytophilic
+cytoplasm
+cytoplasmic
+cytoplasmically
+cytoplast
+cytosine
+cytostatic
+cytostatically
+cytotaxonomy
+cytotoxicity
+cytotoxin
+cytotropic
+cyzicus
+CZ
+czar
+czardas
+czarevitch
+czarevna
+czarina
+czarism
+czarist
+czarship
+Czech
+Czechization
+Czechization's
+Czechizations
+Czechoslovak
+Czechoslovakia
+Czechoslovakian
+Czerniak
+Czerniak's
+Czernowitz
+Czerny
+d'art
+d'etat
+d'etre
+d'oeuvre
+d's
+DA's
+dab
+dabbed
+dabber
+dabbers
+dabbing
+dabble
+dabbled
+dabbler
+dabblers
+dabbles
+dabbling
+dabchick
+dabs
+dabster
+Dacca
+Dacca's
+dace
+dacha
+dachau
+dachshund
+dachshunde
+dachsund
+dacia
+dacoit
+dacoity
+dacron
+Dacron
+dactyl
+dactylic
+dactylogram
+dactylography
+dactylology
+dactyls
+dactylus
+dad
+dad's
+Dada
+Dadaism
+Dadaist
+Dadaistic
+daddies
+daddy
+Dade
+dado
+dadra
+dads
+daedal
+Daedalus
+daemon
+daemon's
+daemons
+daff
+daffier
+daffodil
+daffodil's
+daffodils
+daffy
+daft
+dafter
+daftest
+daftly
+daftness
+DAG
+dagan
+Dagenham
+Dagestan
+dagga
+dagger
+daggerboard
+daggerman
+daggers
+Dago
+dagoba
+dagon
+daguerre
+daguerreotype
+daguerreotype's
+daguerreotypes
+daguerreotypic
+daguerreotypy
+Dahl
+Dahl's
+dahlia
+dahlias
+dahna
+Dahomey
+Dahomey's
+Dailey
+Dailey's
+dailies
+daily
+Daimler
+daimon
+daimones
+daimonic
+daimons
+daimyo
+daintier
+dainties
+daintily
+daintiness
+dainty
+daiquiri
+daiquiris
+dairen
+dairies
+dairy
+dairying
+dairyland
+Dairylea
+dairymaid
+dairyman
+dairymen
+dais
+daises
+daishiki
+daisies
+daisy
+daisy's
+daisycutter
+dak
+Dakar
+Dakota
+dal
+daladier
+dalai
+dalasi
+dale
+dale's
+dales
+dalesman
+daleth
+Daley
+Daley's
+Dalhousie
+dalhousie
+dali
+Dali
+dallapiccola
+Dallas
+dalliance
+dallied
+dallier
+dalloway
+dally
+dallyes
+dallying
+dalmatia
+dalmatian
+dalmatians
+dalmatic
+Dalton
+Daltonism
+Daly
+Dalzell
+Dalzell's
+dam
+dam's
+damage
+damaged
+damager
+damagers
+damages
+damaging
+damagingly
+Damara
+Damaraland
+Damascene
+Damascus
+damask
+dame
+damed
+Damien
+damietta
+dammed
+damming
+dammit
+damn
+damnable
+damnableness
+damnably
+damnation
+damnatory
+damndest
+damned
+damneder
+damnedest
+damnify
+damning
+damningly
+damns
+Damocles
+damodar
+Damon
+Damon's
+damp
+dampcourse
+damped
+dampen
+dampened
+dampener
+dampening
+dampens
+damper
+dampers
+dampier
+damping
+dampish
+damply
+dampness
+damps
+dams
+damsel
+damsel's
+damselfish
+damselflies
+damselfly
+damsels
+Damson
+Dan
+Dan's
+Dana
+Dana's
+Danaides
+Danbury
+dance
+danceability
+danceable
+danced
+dancelike
+dancer
+dancers
+dances
+dancing
+dandelion
+dandelion's
+dandelions
+dander
+dandiacal
+dandiacally
+dandie
+dandier
+dandies
+dandification
+dandify
+dandily
+dandiprat
+dandle
+dandled
+dandling
+dandruff
+dandruffy
+dandy
+dandyish
+dandyishly
+dandyism
+dandyize
+dandyizes
+dandys
+Dane
+Danegeld
+Danelaw
+Danes
+dang
+danged
+danger
+danger's
+dangerous
+dangerously
+dangerousness
+dangers
+dangle
+dangled
+dangler
+dangler's
+danglers
+dangles
+dangling
+danglingly
+Daniel
+Daniels
+Danielson
+Danio
+Danish
+Danization
+Danization's
+Danizations
+Danize
+Danizes
+dank
+dankly
+dankness
+Danny
+Danny's
+danseur
+Dante
+Danton
+Danube
+Danubian
+Danville
+Danzig
+Daphne
+daphnia
+Daphnis
+dapper
+dapperly
+dapperness
+dapple
+dappled
+dapples
+dappling
+Dapsang
+daraf
+darbies
+Darby
+Darcy
+Darcy's
+Dard
+Dardan
+dardanelles
+dardanus
+Dardic
+dare
+dared
+daredevil
+daredevilry
+daredevils
+daredeviltry
+dareful
+darer
+darers
+dares
+daresay
+daresbury
+darfur
+darg
+dargah
+daric
+Darien
+daring
+daringly
+daringness
+dario
+dariole
+Darius
+Darjeeling
+dark
+darken
+darkend
+darkened
+darkener
+darkeners
+darkening
+darker
+darkest
+darkish
+darkle
+darkly
+darkness
+darkroom
+darkrooms
+darks
+darksome
+darlan
+Darlene
+darling
+darling's
+darlingly
+darlingness
+darlings
+Darlington
+darlington
+darmstadt
+darn
+darned
+darnel
+darner
+darning
+darnley
+darns
+darogha
+DARPA
+DARPA's
+Darrell
+Darrow
+darrow
+Darry
+darry
+dart
+dartboard
+darted
+darter
+Dartford
+darting
+Dartmoor
+Dartmouth
+darts
+Darwin
+Darwinian
+Darwinism
+Darwinistic
+Darwinize
+Darwinizes
+Daryl
+Daryl's
+dash
+dashboard
+dashboards
+dashed
+dasheen
+dasher
+dashers
+dashes
+dashiki
+dashing
+dashingly
+dashpot
+dassie
+dastard
+dastardize
+dastardizes
+dastardliness
+dastardly
+dasyure
+data
+databank
+databanks
+database
+database's
+databases
+datable
+datafile
+datagram
+datagram's
+datagrams
+Datamation
+Datamedia
+datamedia
+datary
+dataset
+datasets
+dataswitch
+dataswitches
+datatype
+datcap
+datcha
+date
+dateable
+dated
+datedly
+datedness
+dateless
+dateline
+datelined
+datelines
+dater
+dates
+datetime
+dating
+dative
+dato
+datolite
+Datsun
+datuk
+datum
+datums
+datura
+daub
+daube
+daubed
+dauber
+daubery
+daubigny
+daubs
+daudet
+daugava
+daugavpils
+Daugherty
+Daugherty's
+daughter
+daughter's
+daughterless
+daughterly
+daughters
+daumier
+daunt
+daunted
+daunting
+dauntless
+dauntlessly
+dauntlessness
+daunts
+dauphin
+dauphine
+davao
+Dave
+Dave's
+davenport
+David
+David's
+Davidovich
+Davidson
+Davie
+Davies
+Davinich
+Davis
+Davison
+Davison's
+davit
+davits
+Davy
+daw
+dawdle
+dawdled
+dawdler
+dawdlers
+dawdles
+dawdling
+dawes
+dawn
+dawned
+dawning
+dawns
+Dawson
+day
+day's
+dayak
+dayan
+daybed
+daybook
+dayboy
+daybreak
+daybreaks
+daydream
+daydreamed
+daydreamer
+daydreamers
+daydreaming
+daydreamlike
+daydreams
+dayfile
+dayflower
+dayfly
+daylight
+daylight's
+daylights
+daylong
+daymare
+dayroom
+dayrooms
+days
+dayspring
+daystar
+daytime
+daytimes
+Dayton
+Daytona
+Daytona's
+daze
+dazed
+dazedness
+dazes
+dazing
+dazzle
+dazzled
+dazzler
+dazzlers
+dazzles
+dazzling
+dazzlingly
+db
+DB
+DC
+de
+deacidification
+deacidify
+deacon
+deacon's
+deaconess
+deaconize
+deaconizes
+deaconry
+deacons
+deactivate
+deactivated
+deactivates
+deactivating
+deactivation
+deactivator
+dead
+deadbeat
+deaden
+deadened
+deadener
+deadening
+deadeningly
+deadens
+deadeye
+deadfall
+deadhead
+deadheads
+deadlier
+deadliest
+deadlight
+deadline
+deadline's
+deadlines
+deadliness
+deadlock
+deadlocked
+deadlocking
+deadlocks
+deadly
+deadness
+deadpan
+deadpanner
+deadstarting
+deadweight
+deadwood
+deaerate
+deaerates
+deaeration
+deaf
+deafen
+deafened
+deafening
+deafeningly
+deafens
+deafer
+deafest
+deafly
+deafness
+deakin
+deal
+dealate
+dealated
+dealates
+dealation
+dealer
+dealers
+dealership
+dealerships
+dealfish
+dealing
+dealings
+deallocate
+deallocated
+deallocates
+deallocating
+deallocation
+deallocation's
+deallocations
+deallocator
+deals
+dealt
+deaminate
+deamination
+deaminize
+dean
+dean's
+Deane
+Deane's
+deanery
+Deanna
+Deanna's
+deans
+deanship
+dear
+Dearborn
+dearchive
+dearchived
+dearchives
+dearchiving
+dearer
+dearest
+dearie
+dearly
+dearness
+dears
+dearth
+dearths
+deary
+deassign
+deassignment
+deassigns
+death
+deathbed
+deathblow
+deathless
+deathlessly
+deathlessness
+deathly
+deaths
+deathsman
+deathtrap
+deathward
+deathwatch
+Deauville
+Deb
+debacle
+debacles
+debag
+debar
+debark
+debarkation
+debarks
+debarment
+debarred
+debarring
+debars
+debase
+debased
+debasement
+debaser
+debases
+debasing
+debatable
+debate
+debated
+debatement
+debater
+debaters
+debates
+debating
+debator
+debators
+debauch
+debauched
+debauchedly
+debauchedness
+debauchee
+debaucher
+debauchery
+debauches
+Debbie
+Debbie's
+Debby
+debe
+debenture
+debentures
+debilitate
+debilitated
+debilitates
+debilitating
+debilitation
+debility
+debit
+debited
+debiting
+debits
+debonair
+debonairly
+debonairness
+debone
+deboner
+debones
+deboning
+Deborah
+debouch
+debouchment
+debouchure
+Debra
+debrecen
+debrief
+debriefed
+debriefing
+debriefs
+debris
+debs
+debt
+debt's
+debtless
+debtor
+debtors
+debts
+debug
+debugged
+debugger
+debugger's
+debuggers
+debugging
+debugs
+debunk
+debunker
+debunking
+debunks
+debus
+Debussy
+debut
+debutant
+debutante
+debutante's
+debutantes
+debuting
+debuts
+debye
+Dec
+decade
+decade's
+decadence
+decadency
+decadent
+decadently
+decades
+decaffeinate
+decaffeinated
+decaffeinates
+decaffeinating
+decagon
+decagram
+decahedron
+decal
+decalcification
+decalcify
+decalcomania
+decalescence
+decaliter
+decaliters
+decalogue
+decalogues
+decameter
+decameter's
+decameters
+decametric
+decamp
+decampment
+decamps
+decanal
+decane
+decanedioic
+decani
+decanoic
+decanol
+decant
+decantation
+decanted
+decanter
+decanters
+decanting
+decants
+decapitate
+decapitated
+decapitates
+decapitating
+decapitation
+decapitator
+decapod
+decapod's
+decapods
+decapolis
+decarbonate
+decarbonated
+decarbonates
+decarbonating
+decarbonation
+decarbonator
+decarbonization
+decarbonize
+decarbonized
+decarbonizer
+decarbonizes
+decarbonizing
+decarboxylation
+decarburization
+decarburize
+decarburized
+decarburizes
+decarburizing
+decastyle
+decasualization
+decasyllabic
+decasyllable
+decathlon
+decathlons
+Decatur
+Decatur's
+decay
+decayed
+decayer
+decaying
+decays
+Decca
+deccan
+decease
+deceased
+deceases
+deceasing
+decedent
+deceit
+deceitful
+deceitfully
+deceitfulness
+deceivable
+deceivableness
+deceive
+deceived
+deceiver
+deceivers
+deceives
+deceiving
+deceivingly
+decelerate
+decelerated
+decelerates
+decelerating
+deceleration
+decelerations
+decelerator
+decelerometer
+December
+December's
+Decembers
+Decembrist
+decemvirate
+decenary
+decencies
+decency
+decency's
+decennial
+decennially
+decennium
+decent
+decently
+decentralist
+decentralization
+decentralization's
+decentralizationist
+decentralizations
+decentralize
+decentralized
+decentralizes
+decentralizing
+deception
+deception's
+deceptional
+deceptions
+deceptive
+deceptively
+deceptiveness
+decerebrate
+decerebrated
+decerebrates
+decerebrating
+decerebration
+decern
+decertification
+decertify
+dechlorinate
+dechlorinated
+dechlorinates
+dechlorination
+deciare
+decibel
+decibels
+decidability
+decidable
+decide
+decided
+decidedly
+decidedness
+decider
+decides
+deciding
+decidua
+decidual
+deciduate
+deciduous
+deciduously
+deciduousness
+decigram
+decigram's
+decigrams
+decile
+deciliter
+deciliters
+decillion
+decimal
+decimalization
+decimalization's
+decimalizations
+decimalize
+decimalized
+decimalizes
+decimalizing
+decimally
+decimals
+decimate
+decimated
+decimates
+decimating
+decimation
+decimeter
+decimeter's
+decimeters
+decimetric
+decipher
+decipherable
+deciphered
+decipherer
+decipherers
+deciphering
+decipherment
+deciphers
+decision
+decision's
+decisional
+decisionmaker
+decisions
+decisive
+decisively
+decisiveness
+decistere
+deck
+decked
+decker
+deckhand
+deckhouse
+decking
+deckings
+deckle
+decks
+declaim
+declaimed
+declaimer
+declaiming
+declaims
+declamation
+declamations
+declamatory
+declarable
+declarant
+declaration
+declaration's
+declarations
+declarative
+declaratively
+declaratives
+declarator
+declarators
+declaratory
+declare
+declared
+declarer
+declarers
+declares
+declaring
+declass
+declasse
+declassification
+declassifications
+declassify
+declension
+declensional
+declensionally
+declensions
+declinable
+declinate
+declination
+declination's
+declinational
+declinations
+decline
+declined
+decliner
+decliners
+declines
+declining
+declinometer
+declivitous
+declivity
+declog
+declogged
+declogging
+declogs
+decluster
+declustered
+declustering
+declusters
+declutch
+declutched
+declutches
+declutching
+DECNET
+decoct
+decocted
+decocting
+decoction
+decoctions
+decocts
+decode
+decoded
+decoder
+decoders
+decodes
+decoding
+decodings
+decoke
+decollate
+decollated
+decollates
+decollating
+decollation
+decollations
+decolletage
+decolletages
+decollimate
+decolonise
+decolonization
+decolonize
+decolonized
+decolonizes
+decolonizing
+decolor
+decolorant
+decolorants
+decolorate
+decolorated
+decolorates
+decolored
+decoloring
+decolorise
+decolorised
+decolorises
+decolorization
+decolorize
+decolorized
+decolorizer
+decolorizes
+decolors
+decommission
+decompensate
+decompensation
+decompensatory
+decompile
+decompiled
+decompiler
+decompilers
+decompiles
+decompiling
+decomposability
+decomposable
+decompose
+decomposed
+decomposer
+decomposes
+decomposing
+decomposition
+decomposition's
+decompositions
+decompound
+decompress
+decompressed
+decompresser
+decompresses
+decompressing
+decompression
+deconcentrate
+deconcentrator
+decondition
+decongest
+decongestant
+decongestion
+decongestive
+deconsecrate
+deconsecration
+deconstruct
+decontaminate
+decontaminated
+decontaminates
+decontaminating
+decontamination
+decontaminations
+decontrol
+decontrolled
+decontrolling
+deconvolution
+deconvolve
+decor
+decorate
+decorated
+decorates
+decorating
+decoration
+decorations
+decorative
+decoratively
+decorativeness
+decorator
+decorators
+decorous
+decorously
+decorousness
+decorticate
+decorticated
+decorticates
+decorticating
+decortication
+decorticator
+decorticators
+decorum
+decorums
+decoupage
+decoupages
+decouple
+decoupled
+decoupler
+decouples
+decoupling
+decoy
+decoy's
+decoys
+decrease
+decreased
+decreases
+decreasing
+decreasingly
+decree
+decreed
+decreeing
+decreer
+decrees
+decreet
+decrement
+decremental
+decremented
+decrementing
+decrements
+decrepid
+decrepit
+decrepitate
+decrepitation
+decrepitly
+decrepitude
+decrescendo
+decrescent
+decretal
+decretals
+decretive
+decretory
+decrial
+decrials
+decried
+decrier
+decries
+decriminalization
+decriminalization's
+decriminalize
+decry
+decrying
+decrypt
+decrypted
+decrypting
+decryption
+decryptograph
+decrypts
+DECsystem
+decsystem
+dectape
+DECtape
+decubitus
+decumbent
+decuple
+decurion
+decurrent
+decurved
+decury
+decussate
+decussately
+decussation
+decwriter
+dedal
+dedicate
+dedicated
+dedicatedly
+dedicates
+dedicating
+dedication
+dedications
+dedicative
+dedicator
+dedicatory
+dedifferentiate
+dedifferentiated
+dedifferentiation
+deduce
+deduced
+deducer
+deduces
+deducible
+deducing
+deduct
+deducted
+deductibility
+deductible
+deductibles
+deducting
+deduction
+deduction's
+deductions
+deductive
+deductively
+deducts
+Dee
+Dee's
+deed
+deeded
+deeding
+deedless
+deeds
+deejay
+deek
+deem
+deemed
+deeming
+deemphasis
+deemphasization
+deemphasization's
+deemphasize
+deemphasized
+deemphasizer
+deemphasizers
+deemphasizes
+deemphasizing
+deems
+deemster
+deenergize
+deenergized
+deenergizer
+deenergizes
+deenergizing
+deep
+deepen
+deepened
+deepening
+deepens
+deeper
+deepest
+Deepfreeze
+deeply
+deepness
+deeps
+deer
+Deere
+deergrass
+deerhound
+deers
+deerskin
+deerskins
+deerstalker
+deface
+defacement
+defacer
+defaces
+defacing
+defalcate
+defalcation
+defalcator
+defamation
+defamatory
+defame
+defamed
+defamer
+defames
+defaming
+defat
+default
+defaulted
+defaulter
+defaulting
+defaults
+defeasance
+defeasibility
+defeasible
+defeat
+defeated
+defeating
+defeatism
+defeatist
+defeatists
+defeats
+defeature
+defeatured
+defeatures
+defeaturing
+defecate
+defecated
+defecates
+defecating
+defecation
+defecations
+defect
+defected
+defecting
+defection
+defection's
+defections
+defective
+defectively
+defectiveness
+defectives
+defector
+defector's
+defectors
+defects
+defeminize
+defeminized
+defeminizes
+defeminizing
+defend
+defendable
+defendant
+defendant's
+defendants
+defended
+defender
+defenders
+defending
+defends
+defenestrate
+defenestrated
+defenestrates
+defenestrating
+defenestration
+defenestrations
+defense
+defense's
+defensed
+defenseless
+defenselessly
+defenselessness
+defenseman
+defenses
+defensibility
+defensible
+defensibly
+defensing
+defensive
+defensively
+defensiveness
+defer
+deferable
+deference
+deferent
+deferential
+deferentially
+deferents
+deferment
+deferment's
+deferments
+deferrable
+deferral
+deferred
+deferrer
+deferrer's
+deferrers
+deferring
+defers
+defervescence
+defervescences
+defervescent
+defial
+defiance
+defiances
+defiant
+defiantly
+defibrillation
+defibrillator
+deficiencies
+deficiency
+deficient
+deficiently
+deficit
+deficit's
+deficits
+defied
+defier
+defies
+defilade
+defile
+defiled
+defilement
+defiler
+defiles
+defiling
+definable
+definably
+define
+defined
+definement
+definer
+definers
+defines
+definiendum
+definiens
+defining
+definite
+definitely
+definiteness
+definition
+definition's
+definitional
+definitions
+definitive
+definitively
+definitiveness
+definitization
+definitization's
+definitizations
+definitize
+definitized
+definitizes
+definitizing
+definitude
+deflagrate
+deflagrated
+deflagrates
+deflagrating
+deflagration
+deflate
+deflated
+deflater
+deflates
+deflating
+deflation
+deflationary
+deflator
+deflect
+deflected
+deflecting
+deflection
+deflectionization
+deflectionization's
+deflectionizations
+deflectionize
+deflectionizes
+deflections
+deflective
+deflector
+deflects
+deflexed
+deflocculate
+defloration
+deflorations
+deflower
+defoamer
+defoamers
+defocus
+defocusing
+defoe
+Defoe
+defoliant
+defoliate
+defoliated
+defoliates
+defoliating
+defoliation
+defoliator
+deforce
+deforcement
+deforciant
+deforest
+deforestation
+deforester
+deform
+deformalize
+deformation
+deformation's
+deformational
+deformations
+deformative
+deformed
+deforming
+deformities
+deformity
+deformity's
+deforms
+defraud
+defraudation
+defrauded
+defrauder
+defrauding
+defrauds
+defray
+defrayable
+defrayal
+defrayals
+defrayed
+defraying
+defrays
+defrock
+defrost
+defrosted
+defroster
+defrosting
+defrosts
+deft
+defter
+deftest
+deftly
+deftness
+defunct
+defunctionalization
+defunctionalization's
+defunctionalizations
+defunctionalize
+defunctionalizes
+defuse
+defused
+defusing
+defy
+defyed
+defying
+defyingly
+defys
+degas
+degassed
+degasses
+degassing
+degauss
+degaussed
+degausses
+degaussing
+degeneracy
+degenerate
+degenerated
+degenerately
+degenerateness
+degenerates
+degenerating
+degeneration
+degenerative
+deglutinate
+deglutition
+deglycerolized
+degradable
+degradation
+degradation's
+degradations
+degrade
+degraded
+degradedly
+degradedness
+degrader
+degrades
+degrading
+degradingly
+degranulation
+degrease
+degree
+degree's
+degreed
+degrees
+degression
+degressive
+degressively
+degum
+degumming
+degust
+dehisce
+dehiscent
+dehorn
+dehra
+dehumanization
+dehumanization's
+dehumanizations
+dehumanize
+dehumanized
+dehumanizes
+dehumanizing
+dehumidification
+dehumidifications
+dehumidified
+dehumidifier
+dehumidify
+dehydrase
+dehydrate
+dehydrated
+dehydrates
+dehydrating
+dehydration
+dehydrator
+dehydrogenase
+dehydrogenate
+dehydroretinol
+dehypnotization
+dehypnotize
+dehypnotized
+dehypnotizes
+dehypnotizing
+deianira
+deicide
+deictic
+deific
+deification
+deiform
+deify
+deign
+deigned
+deigning
+deigns
+deil
+Deimos
+deindustrialization
+deindustrialize
+deionization
+deionize
+deionizes
+deipnosophist
+Deirdre
+Deirdre's
+Deirdres
+deism
+deist
+deistic
+deistical
+deistically
+deities
+deity
+deity's
+deixis
+deja
+deject
+dejecta
+dejected
+dejectedly
+dejectedness
+dejection
+dejeuner
+dejeuners
+dekagram
+dekagram's
+dekagrams
+DeKalb
+dekaliter
+dekameter
+dekameter's
+dekameters
+DeKastere
+dekker
+dekko
+Del
+delacroix
+delagoa
+delaine
+delaminate
+delamination
+Delaney
+Delaney's
+Delano
+Delano's
+delate
+delated
+delates
+delating
+delation
+delator
+delaunay
+Delaware
+Delaware's
+delay
+delayed
+delayer
+delayers
+delaying
+delays
+dele
+delectability
+delectable
+delectableness
+delectably
+delectate
+delectation
+deledda
+delegable
+delegacy
+delegate
+delegated
+delegates
+delegating
+delegation
+delegations
+delegatory
+delete
+deleted
+deleter
+deleterious
+deleteriously
+deleteriousness
+deletes
+deleting
+deletion
+deletions
+delft
+delgado
+Delhi
+Delhi's
+deli
+deli's
+Delia
+Delia's
+Delian
+deliberate
+deliberated
+deliberately
+deliberateness
+deliberates
+deliberating
+deliberation
+deliberations
+deliberative
+deliberatively
+deliberativeness
+deliberator
+deliberator's
+deliberators
+Delibes
+delicacies
+delicacy
+delicacy's
+delicate
+delicately
+delicateness
+delicates
+delicatessen
+delicious
+deliciouses
+deliciously
+deliciousness
+delict
+delicti
+delight
+delighted
+delightedly
+delightedness
+delighter
+delightful
+delightfully
+delightfulness
+delighting
+delights
+delightsome
+delightsomely
+Delilah
+delimeter
+delimeters
+delimit
+delimitate
+delimitation
+delimitative
+delimited
+delimiter
+delimiters
+delimiting
+delimitize
+delimitizes
+delimits
+delineament
+delineaments
+delineate
+delineated
+delineates
+delineating
+delineation
+delineations
+delineative
+delineator
+delinquency
+delinquent
+delinquent's
+delinquently
+delinquents
+deliquesce
+deliquescence
+deliquescent
+delirious
+deliriously
+deliriousness
+delirium
+deliriums
+delis
+delist
+delitescence
+Delius
+deliver
+deliverability
+deliverable
+deliverables
+deliverance
+delivered
+deliverer
+deliverers
+deliveries
+delivering
+delivers
+delivery
+delivery's
+deliveryman
+deliveryman's
+deliverymen
+deliverymen's
+dell
+dell's
+Della
+Della's
+Deller
+dells
+dellwood
+Dellwood
+Delmarva
+delocalization
+delocalize
+Delorme
+Delos
+delouse
+deloused
+delouses
+delousing
+Delphi
+Delphic
+Delphically
+delphine
+delphinium
+Delphinus
+Delsarte
+delta
+delta's
+deltaic
+deltas
+deltiology
+deltoid
+deltoids
+delude
+deluded
+deluder
+deludes
+deluding
+deludingly
+deluge
+deluged
+deluges
+deluging
+delusion
+delusion's
+delusional
+delusionary
+delusions
+delusive
+delusively
+delusiveness
+delusory
+deluster
+deluxe
+delve
+delved
+delver
+delves
+delving
+demagnetizable
+demagnetizable's
+demagnetizables
+demagnetization
+demagnetization's
+demagnetizations
+demagnetize
+demagnetized
+demagnetizer
+demagnetizers
+demagnetizes
+demagnetizing
+demagnification
+demagnify
+demagog
+demagogic
+demagogical
+demagogically
+demagogism
+demagogue
+demagoguery
+demagogues
+demagogy
+demand
+demandable
+demandant
+demanded
+demander
+demanding
+demandingly
+demands
+demantoid
+demarcate
+demarcated
+demarcates
+demarcating
+demarcation
+demark
+demarkation
+dematerialization
+dematerialize
+dematerialized
+dematerializes
+dematerializing
+demavend
+deme
+demean
+demeaned
+demeaning
+demeanor
+demeanor's
+demeanors
+demeans
+dement
+demented
+dementedly
+dementedness
+dementia
+demential
+demerara
+demerit
+demerits
+demesne
+demeter
+Demeter
+demi
+demibastion
+demicanton
+demigod
+demigoddess
+demijohn
+demilitarization
+demilitarize
+demilitarized
+demilitarizes
+demilitarizing
+demilune
+demimondaine
+demimonde
+demineralization
+demineralization's
+demineralizations
+demineralize
+demineralized
+demineralizer
+demineralizes
+demineralizing
+demirel
+demirelief
+demirep
+demiscible
+demise
+demised
+demisemiquaver
+demises
+demising
+demission
+demist
+demit
+demitasse
+demitted
+demitting
+demiurge
+demivierge
+demivolt
+demo
+demob
+demobilization
+demobilize
+demobilized
+demobilizes
+demobilizing
+democracies
+democracy
+democracy's
+democrat
+democrat's
+democratic
+democratically
+democratique
+democratization
+democratization's
+democratizations
+democratize
+democratized
+democratizer
+democratizes
+democratizing
+democrats
+democritus
+demodulate
+demodulated
+demodulates
+demodulating
+demodulation
+demodulation's
+demodulations
+demodulator
+demodulator's
+demodulators
+Demogorgon
+demographer
+demographer's
+demographers
+demographic
+demographical
+demographically
+demographics
+demographiques
+demography
+demoiselle
+demolish
+demolished
+demolisher
+demolishes
+demolishing
+demolishment
+demolition
+demolitionist
+demolitions
+demon
+demon's
+demoness
+demonetization
+demonetize
+demonetized
+demonetizes
+demonetizing
+demoniac
+demoniacal
+demoniacally
+demonian
+demonic
+demonical
+demonically
+demonism
+demonization
+demonize
+demonized
+demonizes
+demonizing
+demonolater
+demonolatry
+demonology
+demons
+demonstrability
+demonstrable
+demonstrableness
+demonstrably
+demonstrate
+demonstrated
+demonstrates
+demonstrating
+demonstration
+demonstrational
+demonstrationist
+demonstrations
+demonstrative
+demonstratively
+demonstrativeness
+demonstrator
+demonstrator's
+demonstrators
+demoralization
+demoralization's
+demoralizations
+demoralize
+demoralized
+demoralizer
+demoralizers
+demoralizes
+demoralizing
+demoralizingly
+DeMorgan
+DeMorgan's
+demos
+Demosthenes
+demote
+demoted
+demotes
+demotic
+demoting
+demotion
+demould
+demoulded
+demoulding
+demoulds
+demount
+demountable
+demounted
+demounting
+demounts
+Dempsey
+dempster
+demulcent
+demulsify
+demultiplex
+demur
+demure
+demurely
+demureness
+demurrage
+demurral
+demurred
+demurrer
+demurring
+demurs
+demy
+demystified
+demystifies
+demystify
+demystifying
+demythologization
+demythologize
+demythologized
+demythologizer
+demythologizes
+demythologizing
+den
+den's
+denarius
+denary
+denationalization
+denationalize
+denationalized
+denationalizes
+denationalizing
+denaturalization
+denaturalize
+denaturalized
+denaturalizes
+denaturalizing
+denaturant
+denaturation
+denaturational
+denature
+denatured
+denatures
+denaturing
+denaturization
+denaturization's
+denaturizations
+denaturize
+denaturizer
+denaturizers
+denaturizes
+denazification
+denazify
+Denbighshire
+dendral
+dendriform
+dendrite
+dendrite's
+dendrites
+dendritic
+dendrochronologist
+dendrochronologists
+dendrochronology
+dendrogram
+dendrograms
+dendroid
+dendrologic
+dendrological
+dendrologist
+dendrology
+Dene
+Deneb
+Deneb's
+Denebola
+deneen
+Deneen
+denegation
+denervate
+denervated
+denervates
+denervating
+denervation
+dengue
+deniable
+denial
+denial's
+denials
+denicotinize
+denied
+denier
+denies
+denigrate
+denigrated
+denigrates
+denigrating
+denigration
+denigrative
+denigrator
+denigratory
+denim
+denims
+Denis
+denitrate
+denitrification
+denitrify
+deniz
+denizen
+denizenize
+denizenizes
+denizens
+Denmark
+Denmark's
+denning
+Dennis
+Denny
+denominate
+denominated
+denomination
+denomination's
+denominational
+denominationalism
+denominationalist
+denominationalize
+denominationalizes
+denominationally
+denominations
+denominative
+denominator
+denominator's
+denominators
+denormalize
+denotable
+denotation
+denotation's
+denotational
+denotationally
+denotations
+denotative
+denote
+denoted
+denotement
+denotes
+denoting
+denouement
+denounce
+denounced
+denouncement
+denouncer
+denouncers
+denounces
+denouncing
+dens
+dense
+densely
+denseness
+denser
+densest
+densification
+densify
+densimeter
+densimeter's
+densimeters
+densimetric
+densities
+densitometer
+densitometer's
+densitometers
+densitometric
+densitometry
+density
+density's
+dent
+dental
+Dentalium
+dentalization
+dentalization's
+dentalizations
+dentalize
+dentalizes
+dentally
+dentals
+dentate
+dentated
+dentately
+dentation
+dented
+dentex
+denticle
+denticulate
+denticulated
+denticulately
+denticulation
+dentiform
+dentifrice
+dentigerous
+dentil
+dentilabial
+dentilingual
+dentin
+dentinal
+dentine
+denting
+dentist
+dentist's
+dentistry
+dentists
+dentition
+dentoid
+Denton
+Denton's
+dents
+dentulous
+denture
+dentures
+denuclearization
+denuclearize
+denuclearized
+denuclearizes
+denuclearizing
+denudate
+denudation
+denudational
+denude
+denuded
+denudement
+denuder
+denudes
+denuding
+denumerable
+denumerably
+denunciate
+denunciated
+denunciates
+denunciating
+denunciation
+denunciations
+denunciative
+denunciatory
+Denver
+deny
+denying
+denyingly
+denys
+deodand
+deodar
+deodorant
+deodorant's
+deodorants
+deodorize
+deodorized
+deodorizes
+deodorizing
+deontic
+deontological
+deontologist
+deontology
+deoxidation
+deoxidizer
+deoxycholate
+deoxygenate
+deoxygenation
+deoxyribonucleic
+deoxyribose
+depart
+departed
+departing
+department
+department's
+departmental
+departmentalism
+departmentalization
+departmentalization's
+departmentalizations
+departmentalize
+departmentalizes
+departmentally
+departmentization
+departmentization's
+departmentizations
+departmentize
+departmentizes
+departments
+departs
+departure
+departure's
+departures
+depasture
+depend
+dependability
+dependable
+dependableness
+dependably
+Dependance
+Dependant
+dependant
+dependants
+Dependants
+depended
+dependence
+dependences
+dependencies
+dependency
+dependent
+dependently
+dependents
+depending
+depends
+depersonalization
+depersonalization's
+depersonalizations
+depersonalize
+depersonalized
+depersonalizes
+depersonalizing
+depict
+depicted
+depicter
+depicting
+depiction
+depictions
+depicts
+depicture
+depigmentation
+depilate
+depilated
+depilates
+depilating
+depilation
+depilatory
+deplane
+deplaned
+deplanes
+deplaning
+depletable
+deplete
+depleted
+depletes
+depleting
+depletion
+depletions
+depletive
+deplorable
+deplorableness
+deplorably
+deplore
+deplored
+deplorer
+deplores
+deploring
+deploringly
+deploy
+deployable
+deployed
+deploying
+deployment
+deployment's
+deployments
+deploys
+deplume
+depolarization
+depolarization's
+depolarizations
+depolarize
+depolarized
+depolarizer
+depolarizers
+depolarizes
+depolarizing
+depoliticization
+depoliticize
+depoliticized
+depoliticizes
+depoliticizing
+depolymerization
+depolymerize
+depolymerized
+depolymerizes
+depolymerizing
+depone
+deponed
+deponent
+depones
+deponing
+depopulate
+depopulation
+depopulator
+deport
+deportable
+deportation
+deported
+deportee
+deportee's
+deportees
+deporting
+deportment
+deports
+depose
+deposed
+deposes
+deposing
+deposit
+depositary
+deposited
+depositing
+deposition
+deposition's
+depositional
+depositions
+depositor
+depositor's
+depositors
+depository
+deposits
+depot
+depot's
+depots
+depravation
+depravations
+deprave
+depraved
+depravedly
+depravedness
+depravement
+depraver
+depraves
+depraving
+depravities
+depravity
+Depraz
+deprecate
+deprecated
+deprecates
+deprecating
+deprecatingly
+deprecation
+deprecations
+deprecatorily
+deprecatory
+depreciable
+depreciate
+depreciated
+depreciates
+depreciating
+depreciatingly
+depreciation
+depreciations
+depreciative
+depreciatively
+depreciator
+depreciators
+depreciatory
+depredate
+depredated
+depredates
+depredating
+depredation
+depredations
+depredator
+depredators
+depredatory
+depress
+depressant
+depressants
+depressed
+depresses
+depressible
+depressily
+depressing
+depressingly
+depression
+depression's
+depressions
+depressive
+depressively
+depressomotor
+depressor
+depressors
+depressurization
+depressurize
+depressurized
+depressurizes
+depressurizing
+deprivation
+deprivation's
+deprivations
+deprive
+deprived
+deprives
+depriving
+depside
+Dept
+depth
+depthless
+depths
+depurative
+deputation
+deputationize
+deputationizes
+deputations
+depute
+deputed
+deputes
+deputies
+deputing
+deputization
+deputize
+deputized
+deputizes
+deputizing
+deputy
+deputy's
+dequeue
+dequeued
+dequeues
+dequeuing
+deraign
+derail
+derailed
+derailing
+derailleur
+derailment
+derails
+derain
+derange
+deranged
+derangement
+deranges
+deranging
+derate
+derating
+deration
+derationalization
+derationalization's
+derationalizations
+derationalize
+derationalizes
+deratization
+deratization's
+deratizations
+derbent
+derbies
+derby
+Derbyshire
+derealization
+dereference
+dereferenced
+dereferencer
+dereferencers
+dereferences
+dereferencing
+deregister
+deregulate
+deregulationize
+deregulationizes
+deregulatory
+Derek
+Derek's
+derelict
+dereliction
+derelicts
+derestrict
+deride
+derided
+derider
+derides
+deriding
+deridingly
+derisible
+derision
+derisive
+derisively
+derisiveness
+derisory
+derivable
+derivate
+derivation
+derivation's
+derivational
+derivations
+derivative
+derivative's
+derivatively
+derivativeness
+derivatives
+derive
+derived
+deriver
+derives
+deriving
+derma
+dermal
+dermatitis
+dermatogen
+dermatoglyphics
+dermatoid
+dermatologic
+dermatological
+dermatologist
+dermatology
+dermatome
+dermatophyte
+dermatophytosis
+dermatoplasty
+dermatosis
+dermis
+dermoid
+Dernesch
+dero
+derogate
+derogated
+derogates
+derogating
+derogation
+derogative
+derogatorily
+derogatory
+derrick
+derricked
+derricking
+derrickman
+derrickmen
+derricks
+derriere
+derringer
+Derris
+derry
+derv
+dervish
+dervishes
+derwent
+derwentwater
+desai
+desalinate
+desalination
+desalinization
+desalinize
+desalting
+descant
+Descartes
+descend
+descendant
+descendant's
+descendants
+descended
+descendent
+descendent's
+descendents
+descender
+descenders
+descendible
+descending
+descends
+descension
+descent
+descent's
+descents
+deschamps
+deschool
+descrating
+describable
+describe
+described
+describer
+describers
+describes
+describing
+descried
+description
+description's
+descriptional
+descriptions
+descriptive
+descriptively
+descriptiveness
+descriptives
+descriptivism
+descriptor
+descriptor's
+descriptors
+descry
+descrying
+desecrate
+desecrated
+desecrater
+desecrates
+desecration
+desecrator
+desegregate
+desegregated
+desegregates
+desegregating
+desegregation
+deselect
+deselected
+deselecting
+deselection
+deselections
+deselects
+desensitization
+desensitization's
+desensitizations
+desensitize
+desensitized
+desensitizer
+desensitizers
+desensitizes
+desensitizing
+desert
+deserted
+deserter
+deserters
+desertic
+deserting
+desertion
+desertions
+deserts
+deserve
+deserved
+deservedly
+deservedness
+deserver
+deserves
+deserving
+deservingly
+deservings
+desex
+desexualization
+desexualize
+desexualized
+desexualizes
+desexualizing
+deshabille
+desicate
+desiccant
+desiccate
+desiccated
+desiccates
+desiccation
+desiccative
+desiccator
+desiderata
+desiderate
+desideration
+desiderative
+desideratum
+design
+designate
+designated
+designates
+designating
+designation
+designational
+designations
+designative
+designator
+designator's
+designators
+designatory
+designed
+designedly
+designee
+designer
+designer's
+designers
+designing
+designment
+designs
+desinence
+desirability
+desirable
+desirableness
+desirably
+desire
+desired
+desirer
+desires
+desiring
+desirous
+desirously
+desirousness
+desist
+desistance
+desk
+desk's
+deskill
+deskilled
+deskilling
+deskman
+desks
+desktop
+desman
+desmid
+desmoid
+Desmond
+desmoulins
+desolate
+desolated
+desolately
+desolateness
+desolater
+desolates
+desolating
+desolatingly
+desolation
+desolations
+desolator
+desorb
+desorbable
+desorbed
+desorption
+despair
+despaired
+despairer
+despairing
+despairingly
+despairs
+despatch
+despatched
+despenser
+desperado
+desperadoes
+desperate
+desperately
+desperateness
+desperation
+despicable
+despicableness
+despicably
+despiritualization
+despiritualize
+despise
+despised
+despisement
+despiser
+despises
+despising
+despite
+despited
+despiteful
+despitefully
+despitefulness
+despiteous
+despiteously
+despoil
+despoilation
+despoiled
+despoiler
+despoilers
+despoiling
+despoilment
+despoils
+despoliation
+despond
+despondence
+despondences
+despondency
+despondent
+despondently
+despot
+despot's
+despotic
+despotically
+despotism
+despotize
+despotizes
+despots
+despumate
+desquamate
+dessalines
+dessau
+dessert
+dessert's
+desserts
+dessertspoon
+dessiatine
+dessicate
+dessicator
+dessicators
+destabilization
+destabilize
+destabilized
+destabilizes
+destabilizing
+destalinize
+destalinized
+destalinizes
+destalinizing
+desterilize
+destigmatization
+destinate
+destination
+destination's
+destinations
+destine
+destined
+destinies
+destining
+destiny
+destiny's
+destitute
+destituteness
+destitution
+destroy
+destroyed
+destroyer
+destroyer's
+destroyers
+destroying
+destroys
+destruct
+destructibility
+destructible
+destruction
+destruction's
+destructionist
+destructions
+destructive
+destructively
+destructiveness
+destructivity
+destructor
+destructs
+desuetude
+desulfurization
+desulfurize
+desulphurization
+desulphurize
+desulphurized
+desulphurizes
+desulphurizing
+desultorily
+desultoriness
+desultory
+desynchronization
+desynchronize
+desynchronized
+desynchronizes
+desynchronizing
+detab
+detach
+detachability
+detachable
+detachably
+detached
+detachedly
+detachedness
+detacher
+detaches
+detaching
+detachment
+detachment's
+detachments
+detail
+detailed
+detailedly
+detailedness
+detailer
+detailing
+details
+detain
+detained
+detainee
+detainer
+detaining
+detainment
+detains
+detect
+detectability
+detectable
+detectably
+detectaphone
+detected
+detecting
+detection
+detection's
+detections
+detective
+detectives
+detector
+detector's
+detectors
+detects
+detent
+detente
+detention
+detentions
+deter
+deterge
+detergency
+detergent
+detergents
+deteriorate
+deteriorated
+deteriorates
+deteriorating
+deterioration
+deteriorative
+determent
+determents
+determinability
+determinable
+determinableness
+determinably
+determinacy
+determinant
+determinant's
+determinantal
+determinants
+determinate
+determinately
+determinateness
+determination
+determinations
+determinative
+determinatively
+determinativeness
+determinator
+determine
+determined
+determinedly
+determinedness
+determiner
+determiners
+determines
+determining
+determinism
+determinist
+deterministic
+deterministically
+deterred
+deterrence
+deterrent
+deterrently
+deterrents
+deterrer
+deterring
+deters
+detersive
+detersives
+detest
+detestable
+detestableness
+detestably
+detestation
+detestations
+detested
+detesting
+detests
+dethrone
+dethronement
+detinue
+detmold
+detonabilities
+detonability
+detonable
+detonatable
+detonate
+detonated
+detonates
+detonating
+detonation
+detonational
+detonative
+detonator
+detonator's
+detonators
+detour
+detoured
+detouring
+detours
+detoxicant
+detoxicants
+detoxicate
+detoxicated
+detoxicates
+detoxicating
+detoxication
+detoxicator
+detoxification
+detoxified
+detoxifies
+detoxify
+detoxifying
+detract
+detracted
+detracting
+detraction
+detractions
+detractive
+detractively
+detractor
+detractor's
+detractors
+detracts
+detrain
+detrained
+detraining
+detrainment
+detrains
+detrend
+detrended
+detrending
+detrends
+detribalization
+detribalization's
+detribalizations
+detribalize
+detribalized
+detribalizes
+detribalizing
+detriment
+detrimental
+detrimentally
+detriments
+detrition
+detritus
+Detroit
+detrude
+detruncate
+detumescence
+detumescences
+detumescent
+detune
+detuned
+detunes
+detuning
+deuce
+deuced
+deucedly
+deuces
+deucing
+deurne
+deus
+deuteragonist
+deuteranope
+deuterate
+deuterated
+deuterates
+deuterating
+deuteration
+deuterations
+deuteride
+deuterium
+deuteriums
+deuterogamy
+deuteron
+deuteron's
+Deuteronomist
+Deuteronomistic
+Deuteronomy
+deutoplasm
+deutsch
+Deutsch
+Deutschland
+Deutzia
+deva
+devaluate
+devaluation
+devaluations
+devalue
+devalued
+devalues
+devaluing
+devanagari
+devastate
+devastated
+devastates
+devastating
+devastatingly
+devastation
+devastations
+devastative
+devastator
+devastators
+develed
+develing
+develop
+developable
+developed
+developer
+developer's
+developers
+developing
+development
+development's
+developmental
+developmentally
+developments
+develops
+deventer
+deverbative
+Devereux
+devest
+devi
+deviance
+deviances
+deviancies
+deviancy
+deviant
+deviant's
+deviantly
+deviants
+deviate
+deviated
+deviates
+deviating
+deviation
+deviationism
+deviationist
+deviations
+deviator
+deviators
+device
+device's
+devices
+devil
+devil's
+deviled
+devilfish
+deviling
+devilish
+devilishly
+devilishness
+devilize
+devilizes
+devilkin
+devilment
+devilments
+devilry
+devils
+deviltry
+devious
+deviously
+deviousness
+devisability
+devisable
+devisal
+devise
+devised
+devisee
+deviser
+devises
+devising
+devisings
+devision
+devisions
+devisor
+devitalization
+devitalize
+devitalized
+devitalizes
+devitalizing
+devitrification
+devitrify
+devocalize
+devoice
+devoiced
+devoices
+devoicing
+devoid
+devoir
+devoirs
+devolatilization
+devolatilize
+devolatilized
+devolatilizes
+devolatilizing
+devolution
+devolutionary
+devolutionist
+devolve
+devolved
+devolves
+devolving
+Devon
+Devonian
+Devonshire
+devote
+devoted
+devotedly
+devotee
+devotee's
+devotees
+devotement
+devotes
+devoting
+devotion
+devotional
+devotionally
+devotions
+devour
+devoured
+devourer
+devouring
+devours
+devout
+devoutly
+devoutness
+dew
+dewan
+dewar
+dewars
+dewater
+dewatered
+dewaterer
+dewatering
+dewaters
+dewberry
+dewclaw
+dewdrop
+dewdrop's
+dewdrops
+dewed
+Dewey
+dewier
+dewily
+dewiness
+dewing
+Dewitt
+deworm
+dews
+dewsbury
+dewy
+Dexedrine
+dexedrine
+dexter
+dexterity
+dexterous
+dexterously
+dexterousness
+dextral
+dextrality
+dextrally
+dextran
+dextrin
+dextrine
+dextro
+dextroamphetamine
+dextroglucose
+dextrogyrate
+dextrorotation
+dextrorse
+dextrose
+dextrose's
+dextrous
+dey
+dezhnev
+DFL
+Dhabi
+dhahran
+dhak
+dharma
+dharna
+dhaulagiri
+dhobi
+dhole
+dhoti
+dhow
+diabase
+diabetes
+diabetic
+diabetics
+diablerie
+Diablo
+diabolic
+diabolical
+diabolically
+diabolicalness
+diabolism
+diabolist
+diabolization
+diabolize
+diabolized
+diabolizes
+diabolizing
+diabolo
+diacaustic
+diacetylmorphine
+diachronic
+diachronically
+diachronicness
+diachrony
+diacid
+diacidic
+diaconal
+diaconate
+diacritic
+diacritic's
+diacritical
+diacritically
+diacriticals
+diacritics
+diactinic
+diadelphous
+diadem
+diadic
+diadromous
+diaeresis
+diagenesis
+diageotropism
+diaghilev
+diagnometer
+diagnometer's
+diagnometers
+diagnosable
+diagnose
+diagnoseable
+diagnosed
+diagnoses
+diagnosing
+diagnosis
+diagnostic
+diagnostic's
+diagnostical
+diagnostically
+diagnostician
+diagnosticians
+diagnostics
+diagonal
+diagonalizable
+diagonalization
+diagonalize
+diagonalizes
+diagonally
+diagonals
+diagram
+diagram's
+diagramed
+diagraming
+diagrammable
+diagrammatic
+diagrammatical
+diagrammaticality
+diagrammatically
+diagrammed
+diagrammer
+diagrammer's
+diagrammers
+diagramming
+diagrams
+diagraph
+diakinesis
+diakinetic
+dial
+dial's
+dialect
+dialect's
+dialectal
+dialectally
+dialectic
+dialectical
+dialectically
+dialectician
+dialecticians
+dialecticize
+dialecticizes
+dialectics
+dialectological
+dialectologically
+dialectologist
+dialectology
+dialects
+dialed
+dialer
+dialers
+dialing
+dialings
+dialist
+dialists
+diallage
+dialog
+dialog's
+dialogic
+dialogical
+dialogically
+dialogism
+dialogist
+dialogistic
+dialogs
+dialogue
+dialogue's
+dialogues
+dials
+dialup
+dialup's
+dialups
+dialysis
+dialytic
+dialyzabilities
+dialyzability
+dialyzability's
+dialyzable
+dialyzable's
+dialyzables
+dialyze
+dialyzed
+dialyzer
+dialyzer's
+dialyzers
+dialyzes
+diamagnet
+diamagnetic
+diamagnetism
+diamagnets
+diamantine
+diamegnetism
+diameter
+diameter's
+diameters
+diametral
+diametric
+diametrical
+diametrically
+diamine
+diamond
+Diamond
+diamond's
+diamondback
+diamondize
+diamondizes
+diamonds
+Diana
+diandrous
+Diane
+dianetics
+Dianne
+dianne
+dianoetic
+dianoia
+diapason
+diapause
+diapausing
+diapedesis
+diapente
+diaper
+diaper's
+diapered
+diapering
+diapers
+diaphaneity
+diaphanous
+diaphanously
+diaphanousness
+diaphone
+diaphoresis
+diaphoretic
+diaphototropism
+diaphragm
+diaphragm's
+diaphragmatic
+diaphragmatically
+diaphragmic
+diaphragms
+diaphysis
+diapir
+diapositive
+diarch
+diarchy
+diaries
+diarist
+diarrhea
+diarrhea's
+diarrheal
+diarrheas
+diarrheic
+diarrhetic
+diary
+diary's
+dias
+diascope
+diaspora
+diaspore
+diastalsis
+diastase
+diastasis
+diastema
+diastole
+diastolic
+diastrophic
+diastrophically
+diastrophism
+diastyle
+diatessaron
+diathermancy
+diathermic
+diathermy
+diathesis
+diathetic
+diation
+diatom
+diatomaceous
+diatomic
+diatomite
+diatoms
+diatonic
+diatonically
+diatribe
+diatribe's
+diatribes
+diatropic
+diatropism
+diatropisms
+diazine
+diazo
+diazole
+diazomethane
+diazonium
+dibasic
+dibble
+dibbuk
+dibranchiate
+dibromide
+dibs
+dicarbonyl
+dicarboxylic
+dicast
+dice
+dicephalous
+dicer
+dices
+dicey
+dichasium
+dichlamydeous
+dichloride
+dichloroethanol
+dichondra
+dichotic
+dichotically
+dichotomies
+dichotomist
+dichotomization
+dichotomize
+dichotomized
+dichotomizes
+dichotomizing
+dichotomous
+dichotomously
+dichotomousness
+dichotomy
+dichroic
+dichroism
+dichroitic
+dichromat
+dichromate
+dichromatic
+dichromaticism
+dichromatism
+dichromats
+dichromic
+dichroscope
+dicier
+dicing
+dick
+Dick's
+dickcissel
+dickens
+dicker
+dickered
+dickering
+dickers
+Dickerson
+Dickerson's
+dickey
+Dickinson
+dicks
+Dickson
+dicky
+diclinous
+dicotyledon
+dicta
+Dictaphone
+dictate
+dictated
+dictates
+dictating
+dictation
+dictations
+dictator
+dictator's
+dictatorial
+dictatorially
+dictatorialness
+dictators
+dictatorship
+dictatorships
+diction
+dictionally
+dictionaries
+dictionary
+dictionary's
+dictions
+Dictograph
+dictum
+dictum's
+dictums
+dicuss
+dicyclic
+dicynodont
+did
+Didache
+didact
+didactic
+didactical
+didactically
+didacticism
+didactics
+diddle
+diddled
+diddler
+diddling
+diderot
+didgeridoo
+didn't
+Dido
+Dido's
+didymium
+didymous
+didynamous
+die
+dieback
+Diebold
+Diebold's
+diecious
+died
+diefenbaker
+Diego
+diehard
+diehards
+dieing
+diel
+dieldrin
+dielectric
+dielectric's
+dielectrics
+diem
+dien
+diencephalon
+dieppe
+dieresis
+dies
+diesel
+dieselization
+dieselization's
+dieselizations
+dieselize
+dieselizes
+diesels
+diesis
+Dieskau
+diestock
+diestrus
+diet
+dietaries
+dietarily
+dietary
+dieter
+dieters
+dietetic
+dietetically
+dietetics
+diethylaminoethyl
+diethylstilbestrol
+dietician
+dieticians
+dietitian
+dietitian's
+dietitians
+Dietrich
+diets
+diety
+Dietz
+dieu
+dieux
+diffeomorphic
+diffeomorphism
+differ
+differed
+difference
+difference's
+differenced
+differences
+differencing
+different
+differentia
+differentiability
+differentiable
+differential
+differential's
+differentialize
+differentializes
+differentially
+differentials
+differentiate
+differentiated
+differentiates
+differentiating
+differentiation
+differentiations
+differentiator
+differentiators
+differently
+differentness
+differer
+differers
+differing
+differs
+difficile
+difficult
+difficulties
+difficultly
+difficulty
+difficulty's
+diffidence
+diffident
+diffidently
+diffract
+diffracted
+diffracting
+diffraction
+diffractions
+diffractometer
+diffractometer's
+diffractometers
+diffracts
+diffuse
+diffused
+diffusely
+diffuseness
+diffuser
+diffusers
+diffuses
+diffusible
+diffusing
+diffusion
+diffusional
+diffusions
+diffusive
+diffusively
+diffusiveness
+diffusivity
+difluoride
+dig
+digamma
+digamy
+digenesis
+digenetic
+digest
+digestant
+digested
+digester
+digestibility
+digestible
+digesting
+digestion
+digestions
+digestive
+digestively
+digestiveness
+digests
+digged
+digger
+digger's
+diggers
+digging
+diggings
+dight
+digit
+digit's
+digital
+digitalin
+digitalis
+digitalism
+digitalization
+digitalization's
+digitalizations
+digitalize
+digitalized
+digitalizes
+digitalizing
+digitally
+digitate
+digitated
+digitately
+digitation
+digitiform
+digitigrade
+digitization
+digitize
+digitized
+digitizer
+digitizer's
+digitizers
+digitizes
+digitizing
+digitonin
+digitoxin
+digitron
+digits
+dignified
+dignify
+dignitaries
+dignitary
+dignities
+dignity
+digram
+digress
+digressed
+digresses
+digressing
+digression
+digression's
+digressional
+digressionary
+digressions
+digressive
+digressively
+digressiveness
+digs
+dihedral
+dihybrid
+dihydric
+dihydrofolate
+dihydroxy
+Dijkstra
+Dijkstra's
+Dijon
+dijon
+dike
+dike's
+diker
+dikes
+diking
+dikkop
+diktat
+dilapidate
+dilapidated
+dilapidates
+dilapidating
+dilapidation
+dilapidator
+dilatability
+dilatable
+dilatancy
+dilatant
+dilatation
+dilatational
+dilate
+dilated
+dilatedly
+dilatedness
+dilates
+dilating
+dilation
+dilative
+dilatometer
+dilatometer's
+dilatometers
+dilatometric
+dilatometry
+dilator
+dilatorily
+dilatoriness
+dilatory
+dildo
+dildos
+dilemma
+dilemma's
+dilemmas
+dilemmatic
+dilemmatical
+dilettante
+dilettantes
+dilettanti
+dilettantish
+dilettantism
+dilettantist
+diligence
+diligences
+diligent
+diligently
+diligentness
+dilithium
+dill
+dillinger
+Dillon
+dilly
+dillydally
+dilogarithm
+diluent
+dilute
+diluted
+dilutely
+diluteness
+diluter
+dilutes
+diluting
+dilution
+dilutions
+dilutive
+dilutor
+diluvial
+dim
+dimaggio
+DiMaggio
+dimashq
+dime
+dime's
+dimenhydrinate
+dimension
+dimensional
+dimensionality
+dimensionalization
+dimensionalize
+dimensionalized
+dimensionalizes
+dimensionalizing
+dimensionally
+dimensioned
+dimensioning
+dimensionless
+dimensions
+dimer
+dimercaprol
+dimeric
+dimerism
+dimerization
+dimerization's
+dimerizations
+dimerize
+dimerized
+dimerizes
+dimerizing
+dimerous
+dimers
+dimes
+dimeter
+dimeter's
+dimeters
+dimethoxymethane
+dimethyl
+dimethylformamide
+dimethylglyoxime
+dimethylpropane
+dimethylsulphoxide
+dimetric
+diminish
+diminishable
+diminished
+diminishes
+diminishing
+diminishment
+diminuendo
+diminuendo's
+diminuendos
+diminution
+diminutional
+diminutive
+diminutively
+diminutiveness
+diminutivize
+diminutivizes
+dimissory
+Dimitrovo
+dimity
+dimly
+dimmable
+dimmed
+dimmer
+dimmer's
+dimmers
+dimmest
+dimming
+dimness
+dimorph
+dimorphic
+dimorphism
+dimorphous
+dimout
+dimple
+dimpled
+dimples
+dimpling
+dimply
+dims
+dimwit
+dimwits
+dimyristoyl
+din
+Dinah
+dinar
+Dinaric
+dine
+dined
+diner
+dineric
+diners
+dines
+Dinesen
+dinette
+ding
+Dingaan
+dingbat
+dingbats
+dingdong
+dinge
+dinghies
+dinghy
+dingier
+dingily
+dinginess
+dingle
+dingo
+dingy
+dining
+dinitrobenzene
+dinitrogen
+dink
+Dinka
+dinkey
+dinkum
+dinky
+dinner
+dinner's
+dinnerless
+dinners
+dinnertime
+dinnerware
+dinning
+Dinnington
+Dinoceras
+dinoflagellate
+dinosaur
+dinosaurian
+dinosauric
+dinosaurs
+dinothere
+dint
+dio
+diocesan
+diocese
+Diocletian
+diode
+diode's
+diodes
+diodorus
+dioestrus
+diogenes
+Diogenes
+diol
+diomede
+diomedes
+dion
+Dion
+Dione
+Dionysia
+Dionysiac
+Dionysian
+dionysius
+Dionysus
+Diophantine
+diophantus
+diopside
+dioptase
+diopter
+dioptometer
+dioptometer's
+dioptometers
+dioptometry
+dioptric
+dioptrics
+dior
+diorama
+dioramas
+dioramic
+diorite
+Dioscuri
+dioxalate
+dioxan
+dioxide
+dioxides
+dip
+dipeptide
+dipetalous
+diphase
+diphasic
+diphenyl
+diphenylamine
+diphenylhydantoin
+diphosgene
+diphtheria
+diphtherial
+diphtherian
+diphtheritic
+diphtheroid
+diphthong
+diphthongal
+diphthongization
+diphthongization's
+diphthongizations
+diphthongize
+diphthongizes
+diphthongs
+diphyletic
+diphyllous
+diphyodont
+diplegia
+diplex
+diploblastic
+diplocardiac
+diplococcus
+Diplodocus
+diploid
+diploid's
+diploids
+diploidy
+diploma
+diploma's
+diplomacy
+diplomas
+diplomat
+diplomat's
+diplomate
+diplomatic
+diplomatically
+diplomatics
+diplomatist
+diplomatize
+diplomatizes
+diplomats
+diplont
+diplopia
+diplopod
+diplosis
+diplostemonous
+dipnoan
+dipod
+dipodic
+dipody
+dipolar
+dipole
+dipole's
+dipoles
+dipped
+dipper
+dipper's
+dipperful
+dippers
+dipping
+dippings
+dippy
+dipropellant
+diprotodont
+dips
+dipsomania
+dipsomaniac
+dipsomaniacal
+dipstick
+dipteral
+dipteran
+dipterocarpaceous
+dipterous
+diptych
+Dirac
+dire
+direct
+directed
+directing
+direction
+direction's
+directional
+directionality
+directionally
+directionless
+directions
+directive
+directive's
+directives
+directivity
+directly
+directness
+director
+director's
+directorate
+directorial
+directories
+directors
+directorship
+directory
+directory's
+directrices
+directrix
+directs
+direful
+direfully
+direly
+direness
+direr
+direst
+dirge
+dirge's
+dirged
+dirges
+dirging
+Dirham
+Dirichlet
+dirigible
+dirigibles
+diriment
+dirk
+dirndl
+dirt
+dirt's
+dirtied
+dirtier
+dirties
+dirtiest
+dirtily
+dirtiness
+dirts
+dirty
+dirtying
+disabilities
+disability
+disability's
+disable
+disabled
+disablement
+disabler
+disablers
+disables
+disabling
+disabuse
+disaccharide
+disaccharides
+disaccord
+disaccredit
+disaccustom
+disadvantage
+disadvantage's
+disadvantaged
+disadvantagedness
+disadvantageous
+disadvantageously
+disadvantageousness
+disadvantages
+disadvantaging
+disaffect
+disaffected
+disaffectedly
+disaffectedness
+disaffection
+disaffiliate
+disaffiliated
+disaffiliates
+disaffiliating
+disaffiliation
+disaffirm
+disaffirmance
+disaffirmation
+disafforest
+disaggregate
+disaggregated
+disaggregating
+disaggregation
+disaggregative
+disagree
+disagreeability
+disagreeable
+disagreeableness
+disagreeably
+disagreed
+disagreeing
+disagreement
+disagreement's
+disagreements
+disagrees
+disallow
+disallowance
+disallowed
+disallowing
+disallows
+disambiguate
+disambiguated
+disambiguates
+disambiguating
+disambiguation
+disambiguations
+disangularize
+disangularizes
+disannul
+disappear
+disappearance
+disappearance's
+disappearances
+disappeared
+disappearing
+disappears
+disappoint
+disappointed
+disappointedly
+disappointing
+disappointingly
+disappointment
+disappointment's
+disappointments
+disappoints
+disapprobation
+disapproval
+disapprovative
+disapprove
+disapproved
+disapprover
+disapproves
+disapproving
+disapprovingly
+disarm
+disarmament
+disarmed
+disarmer
+disarmers
+disarming
+disarmingly
+disarms
+disarrange
+disarranged
+disarrangement
+disarranges
+disarray
+disarrays
+disarticulate
+disarticulated
+disarticulation
+disassemble
+disassembled
+disassembler
+disassembler's
+disassemblers
+disassembles
+disassembling
+disassembly
+disassociate
+disassociated
+disassociates
+disassociating
+disassociation
+disaster
+disaster's
+disasters
+disastrous
+disastrously
+disauthorize
+disauthorizes
+disavow
+disavowable
+disavowal
+disavowals
+disavowed
+disavowing
+disavows
+disband
+disbanded
+disbanding
+disbandment
+disbands
+disbar
+disbarment
+disbars
+disbelief
+disbelieve
+disbelieved
+disbeliever
+disbelievers
+disbelieves
+disbelieving
+disboweled
+disboweling
+disbranch
+disbud
+disburden
+disburdenment
+disburse
+disbursed
+disbursement
+disbursement's
+disbursements
+disburser
+disburses
+disbursing
+disc
+disc's
+discalced
+discanonization
+discanonization's
+discanonizations
+discanonize
+discanonizes
+discard
+discardable
+discarded
+discarder
+discarding
+discards
+discern
+discernable
+discerned
+discerner
+discernibility
+discernible
+discernibly
+discerning
+discerningly
+discernment
+discerns
+discharge
+dischargeable
+discharged
+dischargee
+discharger
+discharges
+discharging
+disciform
+disciple
+disciple's
+disciples
+discipleship
+disciplinable
+disciplinal
+disciplinant
+disciplinarian
+disciplinarianism
+disciplinarily
+disciplinarity
+disciplinary
+discipline
+disciplined
+discipliner
+disciplines
+disciplining
+disclaim
+disclaimed
+disclaimer
+disclaimers
+disclaiming
+disclaims
+disclamation
+disclimax
+disclose
+disclosed
+discloser
+discloses
+disclosing
+disclosure
+disclosure's
+disclosures
+disco
+disco's
+discobolus
+discographer
+discographic
+discographical
+discographically
+discography
+discoid
+discoidal
+discoidin
+discolor
+discolor's
+discoloration
+discolored
+discolored's
+discoloredness
+discoloreds
+discoloring
+discolorization
+discolorization's
+discolorizations
+discolorment
+discolorment's
+discolorments
+discolors
+discombobulate
+discomfit
+discomfited
+discomfiting
+discomfits
+discomfiture
+discomfitures
+discomfort
+discomfortable
+discomfortably
+discomforting
+discomfortingly
+discommend
+discommendable
+discommendation
+discommode
+discommodes
+discommoding
+discommodity
+discommon
+discompose
+discomposed
+discomposedly
+discomposure
+disconcert
+disconcerted
+disconcerting
+disconcertingly
+disconcerts
+disconfirm
+disconfirmation
+disconform
+disconformable
+disconformity
+disconnect
+disconnected
+disconnectedly
+disconnectedness
+disconnecter
+disconnecting
+disconnection
+disconnections
+disconnects
+disconsider
+disconsolate
+disconsolately
+disconsolateness
+disconsolation
+discontent
+discontented
+discontentedly
+discontentment
+discontinuance
+discontinuation
+discontinue
+discontinued
+discontinues
+discontinuing
+discontinuities
+discontinuity
+discontinuity's
+discontinuous
+discontinuously
+discophile
+discord
+discordance
+discordances
+discordancy
+discordant
+discordantly
+discords
+discorporate
+discorporated
+discos
+discotheque
+discount
+discounted
+discountenance
+discounter
+discounting
+discounts
+discourage
+discourageable
+discouraged
+discouragement
+discourager
+discourages
+discouraging
+discouragingly
+discourse
+discourse's
+discoursed
+discourser
+discourses
+discoursing
+discourteous
+discourteously
+discourteousness
+discourtesy
+discover
+discoverable
+discovered
+discoverer
+discoverers
+discoveries
+discovering
+discovers
+discovert
+discovery
+discovery's
+discredit
+discreditable
+discreditably
+discredited
+discrediting
+discredits
+discreet
+discreetly
+discreetness
+discrepancies
+discrepancy
+discrepancy's
+discrepant
+discrepantly
+discrete
+discretely
+discreteness
+discretion
+discretionary
+discretions
+discretization
+discretize
+discriminability
+discriminable
+discriminably
+discriminant
+discriminate
+discriminated
+discriminates
+discriminating
+discriminatingly
+discrimination
+discriminational
+discriminations
+discriminative
+discriminator
+discriminatorily
+discriminators
+discriminatory
+discs
+discursive
+discursively
+discursiveness
+discus
+discuses
+discuss
+discussable
+discussant
+discussants
+discussed
+discusser
+discusses
+discussible
+discussing
+discussion
+discussion's
+discussions
+disdain
+disdainful
+disdainfully
+disdainfulness
+disdaining
+disdains
+disdenominationalize
+disdenominationalizes
+disdiplomatize
+disdiplomatizes
+disease
+diseased
+diseases
+diseasing
+disembark
+disembarkation
+disembarrass
+disembodied
+disembodiment
+disembody
+disembogue
+disembowel
+disemboweled
+disemboweling
+disembowelment
+disembowels
+disembroil
+disenable
+disenamor
+disenamor's
+disenamors
+disenchant
+disenchanter
+disenchanting
+disenchantingly
+disenchantment
+disencumber
+disencumbrance
+disendow
+disendower
+disendowment
+disenfranchise
+disenfranchised
+disenfranchisement
+disenfranchisement's
+disenfranchisements
+disenfranchiser
+disenfranchises
+disenfranchising
+disengage
+disengaged
+disengagement
+disengages
+disengaging
+disentail
+disentangle
+disentangled
+disentanglement
+disentangler
+disentangles
+disentangling
+disenthrall
+disenthralled
+disenthralling
+disenthralls
+disentitle
+disentomb
+disentwine
+disepalous
+disequilibrate
+disequilibration
+disequilibrium
+disestablish
+disestablished
+disestablishment
+disestablishmentarian
+disesteem
+disestimation
+disfavor
+disfavored
+disfavorer
+disfavorer's
+disfavorers
+disfavoring
+disfavors
+disfeature
+disfeaturement
+disfigure
+disfigured
+disfigurement
+disfigurements
+disfigures
+disfiguring
+disforest
+disfranchise
+disfranchised
+disfranchisement
+disfranchises
+disfranchising
+disfrock
+disfunction
+disfurnish
+disfurnishment
+disgorge
+disgorgement
+disgorger
+disgrace
+disgraced
+disgraceful
+disgracefully
+disgracefulness
+disgracer
+disgraces
+disgracing
+disgruntle
+disgruntled
+disgruntlement
+disgruntles
+disgruntling
+disguise
+disguised
+disguisedly
+disguisement
+disguiser
+disguises
+disguising
+disgust
+disgusted
+disgustedly
+disgustful
+disgustfully
+disgusting
+disgustingly
+disgusts
+dish
+dishabille
+disharmonic
+disharmonious
+disharmonize
+disharmonizes
+disharmony
+dishcloth
+dishearten
+disheartening
+dishearteningly
+disheartenment
+disheartenments
+dished
+dishes
+dishevel
+disheveled
+disheveler
+disheveling
+dishevels
+dishing
+dishonest
+dishonestly
+dishonesty
+dishonor
+dishonorable
+dishonorable's
+dishonorableness
+dishonorables
+dishonorablies
+dishonorably
+dishonored
+dishonorer
+dishonorer's
+dishonorers
+dishonoring
+dishonors
+dishpan
+dishrack
+dishracks
+dishtowel
+dishumanize
+dishumanizes
+dishumor
+dishumored
+dishumors
+dishwasher
+dishwashers
+dishwater
+dishy
+disillusion
+disillusioned
+disillusioning
+disillusionize
+disillusionizer
+disillusionizers
+disillusionizes
+disillusionment
+disillusionment's
+disillusionments
+disincentive
+disincentives
+disinclination
+disincline
+disinclined
+disinclines
+disinclining
+disincorporated
+disindividualize
+disindividualizes
+disinfect
+disinfectant
+disinfectants
+disinfected
+disinfecting
+disinfection
+disinfects
+disinfest
+disinfestant
+disinfestation
+disinfested
+disinfesting
+disinfests
+disinflation
+disinflationary
+disingenuous
+disingenuously
+disingenuousness
+disinherit
+disinheritance
+disinherited
+disinheriting
+disinherits
+disinhibition
+disinhibitory
+disinsectization
+disintegrate
+disintegrated
+disintegrates
+disintegrating
+disintegration
+disintegrations
+disintegrative
+disintegrator
+disintegrators
+disinter
+disintered
+disinterest
+disinterested
+disinterestedly
+disinterestedness
+disintering
+disinterment
+disinterred
+disinters
+disintoxication
+disinvest
+disinvestment
+disject
+disjoin
+disjoint
+disjointed
+disjointedly
+disjointedness
+disjointly
+disjointness
+disjunct
+disjunction
+disjunctions
+disjunctive
+disjunctively
+disjunctor
+disjunctors
+disjuncts
+disjuncture
+disk
+disk's
+disked
+diskette
+diskettes
+disking
+disklike
+disks
+dislicense
+dislicensed
+dislicenser
+dislicenses
+dislicensing
+dislikable
+dislikably
+dislike
+dislikeable
+disliked
+disliker
+dislikes
+disliking
+dislimn
+dislocate
+dislocated
+dislocates
+dislocating
+dislocation
+dislocations
+dislodge
+dislodged
+dislodgement
+dislodges
+dislodging
+disloyal
+disloyally
+disloyalty
+dismal
+dismalize
+dismalizes
+dismally
+dismalness
+dismantle
+dismantled
+dismantlement
+dismantles
+dismantling
+dismast
+dismay
+dismayed
+dismaying
+dismayingly
+dismays
+dismember
+dismembered
+dismembering
+dismemberment
+dismiss
+dismissal
+dismissal's
+dismissals
+dismissed
+dismisser
+dismissers
+dismisses
+dismissing
+dismission
+dismissive
+dismount
+dismounted
+dismounting
+dismounts
+disnaturalization
+disnaturalization's
+disnaturalizations
+disnaturalize
+disnaturalizes
+Disney
+Disneyland
+disobedience
+disobedient
+disobediently
+disobey
+disobeyed
+disobeyer
+disobeying
+disobeys
+disoblige
+disobliger
+disoblingingly
+disoperation
+disorder
+disordered
+disorderedly
+disorderedness
+disorderliness
+disorderly
+disorders
+disorganization
+disorganization's
+disorganizations
+disorganize
+disorganized
+disorganizer
+disorganizers
+disorganizes
+disorganizing
+disorient
+disorientation
+disoriented
+disown
+disowned
+disowning
+disownment
+disowns
+disozonize
+disozonizes
+dispapalize
+dispapalizes
+disparage
+disparaged
+disparagement
+disparager
+disparages
+disparaging
+disparagingly
+disparate
+disparately
+disparateness
+disparities
+disparity
+disparity's
+dispart
+dispassion
+dispassionate
+dispassionately
+dispassionateness
+dispatch
+dispatched
+dispatcher
+dispatchers
+dispatches
+dispatching
+dispauperize
+dispauperizes
+dispel
+dispelled
+dispelling
+dispels
+dispend
+dispensability
+dispensable
+dispensary
+dispensate
+dispensation
+dispensational
+dispensatory
+dispense
+dispensed
+dispenser
+dispensers
+dispenses
+dispensing
+dispeople
+dispermous
+dispersability
+dispersable
+dispersal
+dispersant
+disperse
+dispersed
+dispersedly
+dispersement
+disperser
+disperses
+dispersible
+dispersing
+dispersion
+dispersions
+dispersity
+dispersive
+dispersively
+dispersiveness
+dispersoid
+dispersonalize
+dispersonalizes
+dispirit
+dispirited
+dispiritedly
+dispiritedness
+dispiriting
+dispirits
+dispiteous
+displace
+displaceable
+displaced
+displacement
+displacement's
+displacements
+displacer
+displaces
+displacing
+displant
+display
+displayable
+displayed
+displayer
+displaying
+displays
+displease
+displeased
+displeasedly
+displeases
+displeasing
+displeasure
+displode
+disploded
+displodes
+disploding
+displosion
+dispopularize
+dispopularizes
+disport
+disportment
+disporves
+disposability
+disposable
+disposal
+disposal's
+disposals
+dispose
+disposed
+disposer
+disposes
+disposing
+disposition
+disposition's
+dispositional
+dispositions
+dispositive
+dispossess
+dispossessed
+dispossesses
+dispossessing
+dispossession
+dispossessor
+disposure
+disposures
+dispraise
+dispraiser
+dispraisingly
+dispread
+disprize
+disproof
+disproportion
+disproportional
+disproportionate
+disproportionately
+disproportionation
+disprovable
+disprove
+disproved
+disproven
+disproves
+disproving
+disputable
+disputant
+disputation
+disputatious
+disputatiously
+disputatiousness
+dispute
+disputed
+disputer
+disputers
+disputes
+disputing
+disqualification
+disqualified
+disqualifies
+disqualify
+disqualifying
+disquantity
+disquiet
+disquieting
+disquietingly
+disquietly
+disquietude
+disquisition
+Disraeli
+disraeli
+disrate
+disrealize
+disrealizes
+disregard
+disregarded
+disregardful
+disregarding
+disregards
+disrelate
+disrelated
+disrelation
+disrelish
+disremember
+disremembrance
+disrepair
+disreputability
+disreputable
+disreputableness
+disreputably
+disrepute
+disrespect
+disrespectability
+disrespectable
+disrespectful
+disrespectfully
+disrespectfulness
+disrobe
+disrupt
+disrupted
+disrupter
+disrupting
+disruption
+disruption's
+disruptions
+disruptive
+disruptively
+disruptiveness
+disrupts
+dissappear
+dissatisfaction
+dissatisfaction's
+dissatisfactions
+dissatisfactory
+dissatisfied
+dissatisfies
+dissatisfy
+dissatisfying
+disscepter
+disscepter's
+disscepters
+dissect
+dissected
+dissecting
+dissection
+dissector
+dissects
+disseize
+disseized
+disseizes
+disseizin
+disseizing
+disseizins
+disseizor
+disseizors
+dissemble
+dissembled
+dissembler
+dissembling
+disseminate
+disseminated
+disseminates
+disseminating
+dissemination
+disseminator
+disseminators
+disseminule
+dissension
+dissension's
+dissensions
+dissensualize
+dissensualizes
+dissent
+dissented
+dissenter
+dissenters
+dissentient
+dissenting
+dissention
+dissentious
+dissents
+dissepiment
+dissert
+dissertate
+dissertation
+dissertation's
+dissertations
+dissertator
+disserve
+disservice
+dissever
+disseverance
+disseverment
+dissidence
+dissident
+dissident's
+dissidents
+dissimilar
+dissimilarities
+dissimilarity
+dissimilarity's
+dissimilarly
+dissimilate
+dissimilated
+dissimilates
+dissimilating
+dissimilation
+dissimilative
+dissimilatory
+dissimilitude
+dissimulate
+dissimulation
+dissimulator
+dissipate
+dissipated
+dissipatedly
+dissipatedness
+dissipater
+dissipates
+dissipating
+dissipation
+dissipations
+dissipative
+dissociability
+dissociable
+dissocial
+dissocialize
+dissociant
+dissociate
+dissociated
+dissociates
+dissociating
+dissociation
+dissociative
+dissolubility
+dissoluble
+dissolute
+dissolutely
+dissoluteness
+dissolution
+dissolution's
+dissolutions
+dissolvable
+dissolve
+dissolved
+dissolvent
+dissolver
+dissolves
+dissolving
+dissonance
+dissonance's
+dissonances
+dissonant
+dissonantly
+dissuade
+dissuaded
+dissuader
+dissuades
+dissuading
+dissuasion
+dissuasive
+dissuasively
+dissuasiveness
+dissyllable
+dissymmetric
+dissymmetry
+dissympathize
+dissympathizes
+distaff
+distaffs
+distal
+distally
+distance
+distanced
+distances
+distancing
+distant
+distantly
+distantness
+distaste
+distasteful
+distastefully
+distastefulness
+distastes
+distemper
+distemperate
+distemperature
+distend
+distended
+distensibility
+distensible
+distension
+distent
+distention
+distich
+distichous
+distill
+distillate
+distillates
+distillation
+distillations
+distilled
+distiller
+distilleries
+distillers
+distillery
+distilling
+distills
+distinct
+distinction
+distinction's
+distinctions
+distinctive
+distinctively
+distinctiveness
+distinctly
+distinctness
+distinguish
+distinguishability
+distinguishable
+distinguishably
+distinguished
+distinguisher
+distinguishes
+distinguishing
+distort
+distortable
+distorted
+distorter
+distorting
+distortion
+distortion's
+distortional
+distortions
+distorts
+distract
+distracted
+distractedly
+distractibility
+distractible
+distracting
+distractingly
+distraction
+distraction's
+distractions
+distractive
+distracts
+distrain
+distrainable
+distrainee
+distrainer
+distrainor
+distraint
+distrait
+distraught
+distraughtly
+distress
+distressed
+distresses
+distressful
+distressfully
+distressfulness
+distressing
+distressingly
+distributary
+distribute
+distributed
+distributee
+distributer
+distributes
+distributing
+distribution
+distribution's
+distributional
+distributions
+distributive
+distributively
+distributiveness
+distributivity
+distributor
+distributor's
+distributors
+distributorship
+district
+district's
+districted
+districting
+districts
+distringas
+distrito
+distrubuted
+distrust
+distrusted
+distrustful
+distrustfully
+distrustfulness
+distrusts
+disturb
+disturbance
+disturbance's
+disturbances
+disturbed
+disturber
+disturbing
+disturbingly
+disturbs
+disubstituted
+disulfide
+disulfiram
+disulphate
+disulphide
+disulphuric
+disunion
+disunionist
+disunite
+disunited
+disunity
+disuse
+disused
+disutility
+disutilize
+disutilizes
+disvalue
+disvalues
+disyllabic
+disyllable
+dita
+ditch
+ditch's
+ditched
+ditcher
+ditches
+ditching
+ditheism
+dither
+dithered
+ditherer
+dithering
+dithery
+dithionite
+dithionous
+dithyramb
+dithyrambic
+dittander
+dittany
+ditties
+ditto
+dittography
+dittos
+ditty
+Ditzel
+diu
+diuresis
+diuretic
+diurnal
+div
+diva
+divagate
+divagation
+divalent
+divan
+divan's
+divans
+divaricate
+divarication
+divaricator
+dive
+dived
+diver
+diverge
+diverged
+divergence
+divergence's
+divergences
+divergencies
+divergency
+divergent
+divergently
+diverges
+diverging
+divers
+diverse
+diversely
+diverseness
+diversification
+diversified
+diversifier
+diversifies
+diversiform
+diversify
+diversifying
+diversion
+diversionary
+diversionist
+diversions
+diversities
+diversity
+divert
+diverted
+diverticulitis
+diverticulosis
+diverticulum
+divertimento
+diverting
+divertissement
+divertissements
+diverts
+dives
+divest
+divested
+divesting
+divestiture
+divestment
+divests
+divi
+dividable
+divide
+divided
+dividend
+dividend's
+dividends
+divider
+dividers
+divides
+dividing
+divination
+divinatory
+divine
+divined
+divinely
+diviner
+divines
+diving
+divining
+divinities
+divinity
+divinity's
+divinization
+divinization's
+divinizations
+divinize
+divinized
+divinizes
+divinizing
+divinylbenzene
+divisibility
+divisible
+divisibly
+division
+division's
+divisional
+divisionism
+divisionist
+divisions
+divisive
+divisively
+divisiveness
+divisor
+divisor's
+divisors
+divorce
+divorced
+divorcee
+divorcees
+divorcement
+divorces
+divorcing
+divot
+divulgate
+divulge
+divulged
+divulgence
+divulges
+divulging
+divulsion
+divvied
+divvies
+divvy
+divvying
+Dixie
+Dixiecrats
+dixiecrats
+Dixieland
+Dixon
+Dixon's
+diyarbakir
+dizen
+dizequalise
+dizequalise's
+dizequaliser
+dizequalisers
+dizequalises
+dizorganisation
+dizorganise
+dizzied
+dizzier
+dizzily
+dizziness
+dizzy
+dizzying
+dizzyingly
+djailolo
+djaja
+djajapura
+Djakarta
+djambi
+djebel
+djerba
+Djibouti
+djinni
+djokjakarta
+DMA
+DMF
+Dmitri
+DNA
+Dneprodzerzhinsk
+Dnepropetrovsk
+Dnieper
+Dnieper's
+Dniester
+do
+doab
+doable
+dobbin
+Dobbs
+dobby
+doberman
+Doberman
+dobla
+dobro
+dobruja
+dobson
+dobsonfly
+doc
+Doc
+docent
+docetic
+Docetism
+docile
+docilely
+docility
+dock
+dockage
+docked
+docker
+docket
+docketed
+docketing
+dockets
+dockhand
+docking
+dockization
+dockization's
+dockizations
+dockize
+dockizes
+dockland
+docklands
+docks
+dockside
+dockworker
+dockyard
+doctor
+doctor's
+doctoral
+doctorate
+doctorate's
+doctorates
+doctored
+doctoring
+doctorization
+doctorization's
+doctorizations
+doctorize
+doctorizes
+doctorless
+doctors
+doctorship
+doctrinaire
+doctrinairism
+doctrinal
+doctrinally
+doctrine
+doctrine's
+doctrines
+doctrinization
+doctrinization's
+doctrinizations
+doctrinize
+doctrinizes
+document
+document's
+documental
+documentale
+documentalist
+documentarian
+documentaries
+documentarily
+documentarist
+documentary
+documentary's
+documentation
+documentation's
+documentational
+documentations
+documented
+documenter
+documenters
+documenting
+documentize
+documentizes
+documents
+DOD
+Dodd
+Dodd's
+dodder
+doddered
+dodderer
+doddering
+dodders
+doddery
+doddle
+dodecagon
+dodecahedra
+dodecahedral
+dodecahedron
+dodecanese
+dodecanoic
+dodecaphonic
+dodecasyllable
+dodecyl
+dodge
+dodged
+dodgem
+dodger
+dodgers
+dodgery
+dodges
+dodging
+Dodgson
+dodgy
+Dodington
+dodington
+dodo
+dodo's
+dodoma
+Dodona
+dodos
+Dodson
+Dodson's
+doe
+doek
+doenitz
+doer
+doers
+does
+Doese
+doeskin
+doesn't
+doff
+doffing
+doffs
+dog
+dog's
+dogbane
+dogberry
+dogcart
+dogcatcher
+doge
+dogface
+dogfight
+dogfights
+dogfish
+dogfishs
+dogged
+doggedly
+doggedness
+dogger
+doggerel
+doggery
+doggie
+doggier
+doggies
+dogging
+doggish
+doggishly
+doggishness
+doggo
+doggone
+doggoned
+doggoning
+doggy
+doghouse
+dogleg
+doglike
+dogma
+dogma's
+dogman
+dogmas
+dogmatic
+dogmatical
+dogmatically
+dogmaticalness
+dogmatics
+dogmatism
+dogmatist
+dogmatist's
+dogmatists
+dogmatization
+dogmatize
+dogmatizer
+dognaped
+dognaping
+dogs
+dogsbody
+dogtooth
+Dogtown
+dogtrot
+dogvane
+dogwatch
+dogwood
+dogy
+doh
+doha
+Doherty
+Doherty's
+Dohnanyi
+doilies
+doily
+doing
+doings
+doit
+doited
+dojo
+Dol
+dolabriform
+Dolan
+Dolan's
+dolby
+dolce
+doldrum
+doldrums
+dole
+doled
+doleful
+dolefully
+dolefulness
+dolerite
+doles
+dolesome
+dolichocephalic
+Dolichosaurus
+doline
+doling
+doll
+doll's
+dollar
+dollarbird
+dollarfish
+dollars
+dollfuss
+dollhouse
+dollied
+dollies
+dollish
+dollishly
+dollishness
+dollop
+dollop's
+dolloped
+dolloping
+dollops
+dolls
+dolly
+dolly's
+dollying
+dolman
+dolmas
+dolmen
+dolmetsch
+dolomite
+dolomites
+dolomitic
+dolomitization
+dolomitization's
+dolomitizations
+dolomitize
+dolomitizes
+dolor
+Dolores
+dolorimetry
+doloroso
+dolorous
+dolorously
+dolorousness
+dolphin
+dolphin's
+dolphins
+dolt
+doltish
+doltishly
+doltishness
+dom
+domain
+domain's
+domains
+dome
+domed
+Domenico
+Domenico's
+domes
+Domesday
+domestic
+domestically
+domesticate
+domesticated
+domesticates
+domesticating
+domestication
+domesticity
+domesticize
+domesticizes
+domett
+domical
+domicil
+domicile
+domiciled
+domiciliary
+domiciliate
+domiciliation
+dominance
+dominant
+dominantly
+dominate
+dominated
+dominates
+dominating
+domination
+dominations
+dominative
+dominator
+dominee
+domineer
+domineering
+domineeringly
+domineeringness
+doming
+Domingo
+Dominic
+Dominica
+dominical
+Dominican
+Dominicans
+Dominick
+Dominick's
+dominie
+dominion
+dominions
+Dominique
+Dominique's
+dominium
+domino
+dominoes
+Domitian
+don
+don't
+dona
+Donahue
+Donald
+Donald's
+Donaldson
+Donar
+donate
+donated
+donatello
+donates
+Donath
+donating
+donation
+donations
+Donatist
+donative
+donator
+donatus
+donau
+donbass
+Doncaster
+done
+Doneck
+Doneck's
+donee
+Donegal
+doneness
+Donetsk
+dong
+donga
+Dongola
+Donizetti
+donjon
+donkey
+donkey's
+donkeys
+Donna
+donne
+donned
+Donnelly
+donner
+donnert
+donning
+donnish
+donnishly
+donnishness
+donny
+donnybrook
+donor
+donors
+Donovan
+dons
+donut
+donuts
+doodad
+doodah
+doodle
+doodlebug
+doodled
+doodler
+doodles
+doodling
+doohickey
+Dooley
+Dooley's
+Doolittle
+doom
+doomed
+doomful
+doomfully
+dooming
+dooms
+doomsayer
+doomsday
+doomster
+door
+door's
+doorbell
+doorframe
+doorjamb
+doorkeep
+doorkeeper
+doorkeepers
+doorknob
+doorknobs
+doorless
+doorman
+doormat
+doormen
+doorn
+doornail
+doornik
+doorplate
+doorpost
+doors
+doorsill
+doorstep
+doorstep's
+doorsteps
+doorstop
+doorway
+doorway's
+doorways
+dooryard
+dopa
+dopant
+dope
+doped
+doper
+dopers
+dopes
+dopester
+dopey
+dopier
+dopiness
+doping
+doppelganger
+Dopper
+Doppler
+dopy
+Dor
+Dora
+Dora's
+Dorado
+Dorati
+Dorcas
+Dorchester
+dordogne
+dordrecht
+Doreen
+Doreen's
+Doria
+Doria's
+Dorian
+Doric
+Doric's
+Doricize
+Doricizes
+Doris
+Dorking
+dorm
+dormancy
+dormant
+dormer
+dormice
+dormie
+dormitories
+dormitory
+dormitory's
+dormobile
+dormouse
+dormouse's
+Dormoy
+dormy
+dornbirn
+dornick
+Doronicum
+Dorothea
+Dorothea's
+Dorothy
+dorp
+dorpat
+dorsad
+dorsal
+dorsally
+Dorset
+Dorset's
+dorsiferous
+dorsigrade
+dorsiventral
+dorsoventral
+dorsum
+dort
+Dortmund
+Dortmund's
+dorty
+dory
+DOS
+dosage
+dosages
+dose
+dosed
+doses
+dosimeter
+dosimeter's
+dosimeters
+dosimetric
+dosimetry
+dosing
+doss
+dossal
+dosser
+dosshouse
+dossier
+dossiers
+dost
+Dostoevsky
+dot
+dot's
+dotage
+dotal
+dotard
+dotation
+dote
+doted
+doter
+dotes
+doth
+doting
+dotingly
+dots
+dotted
+dotter
+dotterel
+dottier
+dottily
+dottiness
+dotting
+dottle
+dotty
+douai
+douala
+douay
+double
+doubled
+Doubleday
+doubleheader
+doubleness
+doubler
+doublers
+doubles
+doublespeak
+doublet
+doublet's
+doublethink
+doubleton
+doubletree
+doublets
+doubling
+doubloon
+doublure
+doubly
+doubs
+doubt
+doubtable
+doubted
+doubter
+doubters
+doubtful
+doubtfully
+doubtfulness
+doubting
+doubtingly
+doubtless
+doubtlessly
+doubtlessness
+doubts
+douc
+douce
+douceur
+douche
+Doug
+dough
+doughboy
+Dougherty
+doughface
+doughier
+doughlike
+doughnut
+doughnut's
+doughnuts
+doughnuttery
+doughtier
+doughtily
+doughtiness
+doughty
+doughy
+Douglas
+Douglass
+doukhobors
+doum
+dour
+doura
+dourine
+dourly
+dourness
+douro
+douroucouli
+douse
+doused
+douser
+douses
+dousing
+dovap
+dove
+dovecot
+dovecote
+dovekie
+dover
+doves
+dovetail
+dovish
+dovishness
+Dow
+dowable
+dowager
+dowagers
+dowdier
+dowdies
+dowdily
+dowdiness
+dowding
+dowdy
+dowdyish
+dowel
+doweled
+doweler
+doweling
+dower
+dowery
+dowitcher
+Dowland
+Dowling
+Dowling's
+down
+downbeat
+downcast
+downcome
+downcomer
+downcourt
+downdraft
+downed
+downer
+downers
+Downey
+downfall
+downfallen
+downgrade
+downgraded
+downgrades
+downgrading
+downhaul
+downhearted
+downheartedly
+downheartedness
+downhill
+downhole
+downier
+downing
+download
+downloaded
+downloading
+downloads
+downpatrick
+downpipe
+downplay
+downplayed
+downplaying
+downplays
+downpour
+downrange
+downright
+downrightly
+downrightness
+downriver
+downs
+downshift
+downside
+downslope
+downspout
+downstage
+downstairs
+downstate
+downstater
+downstream
+downstroke
+downswing
+downswings
+downthrow
+downtime
+downtown
+downtowner
+downtowns
+downtrend
+downtrodden
+downturn
+downturns
+downward
+downwardly
+downwardness
+downwards
+downwash
+downweight
+downweighted
+downweighting
+downwell
+downwind
+downy
+dowries
+dowry
+dowsabel
+dowse
+dowser
+dowses
+dowsing
+Dowson
+doxastic
+doxographer
+doxology
+doxy
+doyen
+Doyle
+doyley
+doze
+dozed
+dozen
+dozens
+dozenth
+dozer
+dozes
+dozier
+doziness
+dozing
+dozy
+DPP
+Dr
+drab
+drabber
+drabbest
+drabbet
+drabbing
+drabble
+drabbled
+drabbling
+drably
+drabness
+drabs
+Dracaena
+Draco
+Draco's
+Draconian
+Draconic
+draff
+draft
+draft's
+draftable
+draftboard
+drafted
+draftee
+draftees
+drafter
+drafters
+draftier
+draftily
+draftiness
+drafting
+drafts
+draftsman
+draftsmanship
+draftsmen
+draftsperson
+drafty
+drag
+dragged
+dragger
+draggier
+dragging
+draggingly
+draggle
+draggled
+draggletailed
+draggling
+draggy
+draghound
+dragline
+dragnet
+dragoman
+dragon
+dragon's
+dragonet
+dragonfly
+dragonhead
+dragonish
+dragonize
+dragonizes
+dragonnade
+dragonroot
+dragons
+dragoon
+dragooned
+dragoons
+dragrope
+drags
+dragster
+drail
+drain
+drainage
+drainages
+drained
+drainer
+drainers
+draining
+drainpipe
+drainpipes
+drains
+drake
+Drakensberg
+dram
+drama
+drama's
+dramalogue
+Dramamine
+dramamine
+dramas
+dramatic
+dramatical
+dramatically
+dramatics
+dramatis
+dramatist
+dramatist's
+dramatists
+dramatizable
+dramatizable's
+dramatizables
+dramatization
+dramatization's
+dramatizations
+dramatize
+dramatized
+dramatizer
+dramatizers
+dramatizes
+dramatizing
+dramaturge
+dramaturgic
+dramaturgical
+dramaturgically
+dramaturgy
+drammen
+dramshop
+drancy
+drank
+drapability
+drapable
+drape
+drapeability
+drapeable
+draped
+draper
+draperies
+drapers
+drapery
+drapery's
+drapes
+draping
+drastic
+drastically
+drat
+dratted
+dratting
+drava
+Dravidian
+draw
+drawable
+drawback
+drawback's
+drawbacks
+drawbar
+drawbridge
+drawbridge's
+drawbridges
+drawdown
+drawee
+drawer
+drawerful
+drawers
+drawing
+drawings
+drawknife
+drawl
+drawled
+drawler
+drawling
+drawlingly
+drawls
+drawly
+drawn
+drawnly
+drawnness
+drawnwork
+drawplate
+draws
+drawstring
+drawstring's
+drawstrings
+drawtube
+dray
+drayage
+drayhorse
+drayman
+drayman's
+draymen
+draymen's
+Drayton
+dread
+dreaded
+dreadful
+dreadfully
+dreadfulness
+dreading
+dreadnought
+dreads
+dream
+dreamboat
+dreamed
+dreamer
+dreamers
+dreamful
+dreamfully
+dreamfulness
+dreamier
+dreamily
+dreaminess
+dreaming
+dreamingly
+dreamland
+dreamless
+dreamlessly
+dreamlessness
+dreamlike
+dreams
+dreamt
+dreamworld
+dreamy
+drear
+drearier
+drearily
+dreariness
+dreary
+dreck
+dredge
+dredge's
+dredged
+dredger
+dredgers
+dredges
+dredging
+dree
+dreg
+dreggy
+dregs
+dreich
+dreiser
+drench
+drenched
+drencher
+drenches
+drenching
+drenthe
+dresden
+dress
+dressage
+dressed
+Dressen
+dresser
+dressers
+dresses
+dressier
+dressiness
+dressing
+dressings
+dressmake
+dressmaker
+dressmaker's
+dressmakers
+dressmaking
+dressy
+drew
+Drexel
+Dreyfuss
+drib
+dribble
+dribbled
+dribbler
+dribbles
+dribbling
+driblet
+dribs
+dried
+drier
+drier's
+driers
+dries
+driest
+drift
+driftage
+drifted
+drifter
+drifters
+driftier
+drifting
+driftingly
+drifts
+driftweed
+driftwood
+driftwood's
+drifty
+drill
+drillability
+drillable
+drilled
+driller
+drilling
+drillmaster
+drills
+drillstock
+drily
+drin
+drink
+drinkability
+drinkable
+drinker
+drinkers
+drinking
+drinks
+drinkwater
+drip
+drip's
+dripless
+dripped
+dripper
+drippier
+dripping
+drippy
+drips
+dripstone
+Driscoll
+Driscoll's
+drivable
+drive
+driveable
+drivel
+driveled
+driveler
+drivelers
+driveline
+driveling
+driven
+drivenness
+driver
+driver's
+driverless
+drivers
+drives
+driveway
+driveway's
+driveways
+driving
+drizzle
+drizzled
+drizzles
+drizzling
+drizzlingly
+drizzly
+drogheda
+drogue
+droit
+droll
+drolleries
+drollery
+drollness
+drolly
+dromedary
+dromond
+drone
+drone's
+droner
+drones
+Dronfield
+drongo
+drongos
+droning
+droningly
+droob
+drool
+drooled
+drooler
+drooling
+drools
+droop
+drooped
+droopier
+drooping
+droopingly
+droops
+droopy
+drop
+drop's
+drophead
+dropkick
+dropkicker
+droplet
+droplets
+droplight
+dropout
+dropouts
+droppage
+dropped
+dropper
+dropper's
+dropperful
+droppers
+dropping
+dropping's
+droppings
+drops
+dropshot
+dropsonde
+dropsy
+droshky
+drosophila
+dross
+drossy
+drought
+drought's
+droughtiness
+droughts
+droughty
+drouth
+drove
+drover
+drovers
+droves
+drown
+drownd
+drownded
+drownding
+drowned
+drowner
+drowning
+drownings
+drowns
+drowse
+drowsed
+drowses
+drowsier
+drowsiest
+drowsily
+drowsiness
+drowsing
+drowsy
+drub
+drubber
+drubbing
+drudge
+drudger
+drudgery
+drudges
+drudging
+drudgingly
+druffen
+drug
+drug's
+drugged
+drugget
+drugging
+druggist
+druggist's
+druggists
+drugless
+drugmaker
+drugs
+drugstore
+drugstores
+druid
+druidess
+druidic
+druidical
+druidism
+drum
+drum's
+drumbeat
+drumbeater
+drumbeating
+drumfire
+drumhead
+drumlike
+drumlin
+drummed
+drummer
+drummer's
+drummers
+drumming
+Drummond
+Drummond's
+drumroll
+drums
+drumstick
+drumsticks
+drunk
+drunk's
+drunkard
+drunkard's
+drunkards
+drunken
+drunkeness
+drunkenly
+drunkenness
+drunker
+drunkly
+drunkometer
+drunkometer's
+drunkometers
+drunks
+drupe
+drupelet
+Drury
+Druse
+dry
+dryable
+dryad
+dryasdust
+Dryden
+dryer
+dryers
+drying
+drylot
+dryly
+dryness
+dryopithecine
+drypoint
+drys
+drysalter
+drysaltery
+drysdale
+drystone
+drywall
+du
+dual
+Duala
+dualism
+dualist
+dualistic
+dualistically
+dualities
+duality
+duality's
+dualization
+dualization's
+dualizations
+dualize
+dualizes
+dually
+duals
+Duane
+dub
+dubai
+dubbed
+dubber
+dubbin
+dubbing
+Dubhe
+Dubhe's
+dubiety
+dubiosity
+dubious
+dubiously
+dubiousness
+dubitable
+dubitation
+Dublin
+Dubonnet
+dubrovnik
+dubs
+dubuffet
+Dubuque
+dubuque
+ducal
+ducally
+ducat
+duccio
+duce
+duces
+duchamp
+duchess
+duchess's
+duchesses
+duchies
+duchy
+duck
+duckbill
+duckbilled
+duckboard
+ducked
+ducker
+duckfooted
+duckier
+ducking
+duckling
+duckpin
+ducks
+duckweed
+duckweed's
+duckweeds
+ducky
+duclos
+duct
+ducted
+ductile
+ductility
+ductilize
+ductilizes
+ducting
+ductless
+ducts
+ductule
+ductwork
+dud
+dude
+dudeen
+dudgeon
+dudish
+dudishly
+Dudley
+Dudley's
+duds
+due
+duel
+dueled
+dueler
+duelers
+dueling
+duelings
+duelist
+duelists
+duello
+duels
+duende
+dueness
+duenna
+duennaship
+duero
+dues
+duet
+duets
+duetted
+duetting
+duff
+duffel
+duffer
+duffers
+duffle
+Duffy
+dufy
+dug
+Dugan
+Dugan's
+dugong
+dugout
+duhamel
+duiker
+Duisburg
+duka
+Dukas
+duke
+duke's
+dukedom
+dukes
+dukhobors
+dulcet
+dulcetly
+dulciana
+dulcify
+dulcimer
+dulcimore
+Dulcinea
+dulgence
+dulia
+dull
+dullard
+dulled
+duller
+Dulles
+dulles
+dullest
+dulling
+dullish
+dullishly
+dullness
+dulls
+dullsville
+dully
+dulness
+dulosis
+dulse
+Duluth
+duly
+Duma
+Duma's
+dumas
+Dumas
+dumb
+Dumbarton
+dumbbell
+dumbbell's
+dumbbells
+dumbell
+dumbells
+dumber
+dumbest
+dumbfound
+dumbfounded
+dumbfounder
+dumbfounds
+dumbly
+dumbness
+dumbstruck
+dumbwaiter
+dumbwaiters
+dumdum
+dumfries
+dumka
+dummied
+dummies
+dummy
+dummy's
+dummying
+Dumont
+dumortierite
+dump
+dumped
+dumper
+dumpers
+dumpier
+dumpily
+dumpiness
+dumping
+dumpish
+dumpling
+dumpling's
+dumplings
+dumpo
+dumps
+dumpster
+dumpster's
+dumpsters
+Dumpty
+dumpy
+dumyat
+dun
+duna
+dunaj
+dunant
+Dunbar
+Dunbar's
+Dunbarton
+Duncan
+dunce
+dunce's
+dunces
+dundalk
+dundee
+Dundee
+Dundee's
+dunderhead
+dunderheaded
+dune
+dune's
+Dunedin
+Dunedin's
+duneland
+dunelike
+dunes
+dunfermline
+dung
+dungaree
+dungas
+dungeness
+dungeon
+dungeon's
+dungeons
+dunghill
+dungy
+Dunham
+dunite
+duniwassal
+dunk
+dunkel
+Dunker
+dunker
+dunkerque
+Dunkirk
+Dunlap
+dunlin
+Dunlop
+Dunlop's
+Dunn
+Dunn's
+dunnage
+dunnakin
+dunne
+Dunne
+dunnite
+dunno
+dunnock
+dunny
+dunois
+dunoon
+dunsany
+dunsinane
+dunstable
+dunstan
+dunt
+duntroon
+dunwoody
+duo
+duodecimal
+duodecimo
+duodenal
+duodenary
+duodenitis
+duodenum
+duologue
+duomo
+duomos
+duopolist
+duopolistic
+duopoly
+duos
+duotone
+dup
+duparc
+dupatta
+dupe
+duped
+duper
+dupery
+dupes
+duping
+dupion
+duple
+dupleix
+duplet
+duplex
+duplexer
+duplicable
+duplicate
+duplicated
+duplicates
+duplicating
+duplication
+duplications
+duplicative
+duplicator
+duplicator's
+duplicators
+duplicitous
+duplicitously
+duplicity
+dupondius
+DuPont
+Dupont
+dupont
+DuPonts
+Duponts
+duponts
+duppy
+Dupre
+duque
+Duquesne
+durabilities
+durability
+durable
+durableness
+durables
+durably
+Duralumin
+duramen
+durance
+Durango
+Durango's
+duration
+duration's
+durational
+durations
+durative
+durazzo
+Durban
+durbar
+Durer
+duress
+durex
+durgah
+Durham
+durian
+during
+Durkee
+Durkheim
+Durkin
+Durkin's
+durmast
+duro
+Duroc
+durometer
+durometer's
+durometers
+duros
+durra
+Durrell
+Durrell's
+durst
+Durufle
+durum
+Durward
+Durward's
+durzi
+Dusenberg
+Dusenbury
+Dusenbury's
+dushanbe
+dusk
+duskier
+duskily
+duskiness
+dusky
+Dusseldorf
+dust
+dustability
+dustable
+dustbin
+dustbins
+dustcart
+dustcarts
+dustcover
+dusted
+duster
+dusters
+dustheap
+dustier
+dustiest
+dustily
+Dustin
+dustin
+dustiness
+dusting
+dustless
+dustlike
+dustman
+dustmen
+dustpan
+dustpans
+dusts
+dustsheet
+dustsheets
+dustup
+dusty
+Dutch
+dutchess
+Dutchman
+Dutchmen
+duteous
+dutiable
+duties
+dutiful
+dutifully
+dutifulness
+Dutoit
+Dutton
+Dutton's
+duty
+duty's
+duumvir
+duumvirate
+duvalier
+duverger
+duvet
+dux
+Duyker
+Dvandva
+Dvina
+Dvinsk
+Dvorak
+Dvorsky
+dwale
+dwarf
+dwarfed
+dwarfishly
+dwarfishness
+dwarfism
+dwarflike
+dwarfness
+dwarfs
+dwarves
+dwell
+dwelled
+dweller
+dwellers
+dwelling
+dwellings
+dwells
+dwelt
+Dwight
+dwindle
+dwindled
+dwindles
+dwindling
+DWT
+Dwyer
+Dwyer's
+dyad
+dyadic
+dyadically
+dyads
+Dyak
+dyarchy
+dybbuk
+dye
+dyeability
+dyeable
+dyed
+dyeing
+dyer
+dyerear
+dyers
+dyes
+dyestuff
+dyewood
+dyfed
+dying
+Dyke
+dykes
+Dylan
+Dylan's
+dynameter
+dynamic
+dynamical
+dynamically
+dynamicism
+dynamics
+dynamism
+dynamist
+dynamistic
+dynamite
+dynamited
+dynamiter
+dynamites
+dynamitic
+dynamiting
+dynamized
+dynamo
+dynamoelectric
+dynamometer
+dynamometer's
+dynamometers
+dynamometric
+dynamometry
+dynamos
+dynamotor
+dynapolis
+dynast
+dynastic
+dynastically
+dynasties
+dynasts
+dynasty
+dynasty's
+dynatron
+dyne
+dynode
+dynodes
+Dyonisian
+dyscrasia
+dysenteric
+dysentery
+dysfunction
+dysfunctional
+dysgenesis
+dysgenic
+dysgenics
+dysgraphia
+dyslexia
+dyslexic
+dyslogistic
+dyslogistically
+dysmenorrhoea
+dyspepsia
+dyspeptic
+dyspeptically
+dysphagia
+dysphagic
+dysphasia
+dysphasic
+dysphemism
+dysphonia
+dysphonic
+dysphoria
+dysphoric
+dysplasia
+dysplastic
+dyspnoea
+dysprosium
+dysteleology
+dysthymia
+dystopia
+dystrophic
+dystrophy
+dysuria
+dytiscid
+dyula
+Dzaudzhikau
+Dzerzhinsk
+Dzhambul
+Dziggetai
+Dzongka
+Dzungaria
+e'er
+e's
+each
+Eagan
+Eagan's
+eager
+eagerly
+eagerness
+eagle
+eagle's
+eagles
+Eaglestone
+eaglet
+Eaglewood
+eagre
+ealdorman
+ealing
+eanes
+ear
+earache
+earbash
+eardrop
+eardrops
+eardrum
+eardrums
+eared
+earflap
+earful
+earhart
+earing
+earl
+earl's
+earlap
+earldom
+earless
+earlier
+earliest
+earliness
+earlobe
+earlock
+earls
+early
+earmark
+earmarked
+earmarking
+earmarkings
+earmarks
+earmuff
+earmuffs
+earn
+earned
+earner
+earner's
+earners
+earnest
+earnestly
+earnestness
+earning
+earnings
+earns
+earom
+Earp
+earp
+earphone
+earphones
+earpiece
+earplug
+earring
+earring's
+earrings
+ears
+earshot
+earsplitting
+earth
+earth's
+earthborn
+earthbound
+earthed
+earthen
+earthenware
+earthier
+earthily
+earthiness
+earthlight
+earthlike
+earthliness
+earthling
+earthly
+Earthman
+earthman
+Earthman's
+Earthmen
+earthmen
+Earthmen's
+earthmove
+earthmover
+earthmoving
+earthnut
+earthquake
+earthquake's
+earthquakes
+earthrise
+earths
+earthshaker
+earthshaking
+earthshakingly
+earthshine
+earthstar
+earthward
+earthwards
+earthwork
+earthworks
+earthworm
+earthworm's
+earthworms
+earthy
+earwax
+earwig
+earwigged
+earwigging
+earwitness
+ease
+eased
+easeful
+easefully
+easel
+easement
+easement's
+easements
+easer
+eases
+easier
+easiest
+easily
+easiness
+easing
+east
+eastbound
+Eastbourne
+easter
+easterly
+eastern
+easterner
+easterners
+easternize
+easternmost
+Eastertide
+Easthampton
+easthampton
+easting
+Eastland
+Eastleigh
+Eastman
+eastmost
+easts
+eastward
+eastwards
+eastwick
+Eastwick
+Eastwood
+easure
+easy
+easygoing
+easygoingness
+eat
+eatable
+eatables
+eatage
+eaten
+eater
+eaters
+eatery
+eating
+eatings
+Eaton
+Eaton's
+eats
+eave
+eaves
+eavesdrop
+eavesdropped
+eavesdropper
+eavesdropper's
+eavesdroppers
+eavesdropping
+eavesdrops
+ebb
+ebbed
+ebbing
+ebbs
+EBCDIC
+Eben
+Eben's
+Ebert
+eblis
+ebon
+ebonite
+ebonization
+ebonize
+ebonized
+ebonizes
+ebonizing
+ebony
+ebracteate
+ebullience
+ebulliency
+ebullient
+ebulliently
+ebullioscopy
+ebullition
+eburnation
+ECAD
+ecbatana
+ecbolic
+ecce
+eccentric
+eccentric's
+eccentrically
+eccentricities
+eccentricity
+eccentrics
+ecchymosis
+Eccles
+ecclesall
+ecclesia
+ecclesial
+Ecclesiastes
+ecclesiastic
+ecclesiastical
+ecclesiastically
+ecclesiasticism
+ecclesiasticize
+ecclesiasticizes
+Ecclesiasticus
+ecclesiolatry
+ecclesiological
+ecclesiology
+eccrinology
+ecdysiast
+ecdysis
+ecdysone
+ecesis
+ecevit
+ECG
+ech
+echard
+echelon
+echelons
+Echeveria
+echidna
+echinate
+echinococcus
+echinoderm
+echinoid
+echinulate
+echinulation
+echinus
+echo
+echoed
+echoes
+echoey
+echoic
+echoing
+echoism
+echoize
+echoizes
+echolalia
+echolocation
+echopraxia
+echos
+echovirus
+eck
+eckhart
+eclampsia
+eclat
+eclectic
+eclectically
+eclecticism
+eclecticize
+eclecticizes
+eclipse
+eclipsed
+eclipses
+eclipsing
+eclipsis
+ecliptic
+eclogite
+eclogue
+eclosion
+ecocide
+ecol
+Ecole
+ecologic
+ecological
+ecologically
+ecologist
+ecologists
+ecology
+econometric
+Econometrica
+econometrically
+econometrician
+econometricians
+econometrics
+econometrist
+economic
+economical
+economically
+economics
+economies
+economist
+economist's
+economists
+economization
+economization's
+economizations
+economize
+economized
+economizer
+economizers
+economizes
+economizing
+economy
+economy's
+ecophysiological
+ecophysiology
+ecospecies
+ecospecific
+ecosphere
+ecosystem
+ecosystems
+ecotone
+ecotype
+ecotypic
+ecotypically
+ecowas
+ecru
+ecstacy
+ecstasy
+ecstatic
+ecstatically
+ecstaticize
+ecstaticizes
+ecstatics
+ecthyma
+ectoblast
+ectoblastic
+ectocrine
+ectoderm
+ectodermal
+ectodermic
+ectoenzyme
+ectogenic
+ectogenous
+ectomere
+ectomeric
+ectomorph
+ectomorphic
+ectoparasite
+ectoparasitic
+ectophyte
+ectopia
+ectopic
+ectoplasm
+ectoplasmic
+ectoproct
+ectosarc
+ectotherm
+ectothermic
+ectotrophic
+ectotropic
+ectype
+Ecuador
+ecumenic
+ecumenic's
+ecumenical
+ecumenicalism
+ecumenically
+ecumenicism
+ecumenicist
+ecumenicist's
+ecumenicists
+ecumenicity
+ecumenics
+ecumenism
+ecumenist
+ecumenist's
+ecumenists
+eczema
+eczematous
+ed
+edacious
+edacity
+edale
+edam
+edaphic
+edaphically
+Edda
+Eddie
+eddied
+eddies
+Eddington
+eddo
+eddy
+eddy's
+eddying
+eddystone
+ede
+edelweiss
+edema
+edema's
+edemas
+edematous
+eden
+Edenization
+Edenization's
+Edenizations
+Edenize
+Edenizes
+edentate
+edentulous
+edessa
+Edgar
+edge
+edged
+edgehill
+edgeless
+edger
+Edgerton
+edges
+Edgewater
+edgewater
+edgeways
+edgewise
+edgewood
+Edgewood
+edgeworth
+edgier
+edgily
+edginess
+edging
+edgy
+edibility
+edible
+edibleness
+edibles
+edict
+edict's
+edictal
+edicts
+edification
+edificatory
+edifice
+edifice's
+edifices
+edified
+edifies
+edify
+edifying
+edile
+Edinburgh
+edirne
+Edison
+edit
+editable
+edited
+Edith
+editing
+edition
+edition's
+editions
+editor
+editor's
+editorial
+editorialist
+editorialization
+editorialize
+editorialized
+editorializer
+editorializes
+editorializing
+editorially
+editorials
+editors
+editorship
+editress
+edits
+Edmonds
+Edmondson
+Edmondson's
+Edmonton
+Edmonton's
+Edmund
+Edna
+Edo
+edom
+Edomite
+EDP
+Edsger
+Edsger's
+EDT
+Eduard
+eduard
+Eduardo
+Eduardo's
+educability
+educable
+educate
+educated
+educatedly
+educatedness
+educates
+educating
+education
+education's
+educational
+educationalist
+educationalists
+educationally
+educationist
+educations
+educative
+educator
+educator's
+educators
+educatory
+educe
+educible
+educing
+educt
+eduction
+eductor
+eductors
+edulcorate
+Edward
+Edwardian
+edwardine
+Edwardine
+Edwards
+Edwin
+Edwina
+eeg
+EEG
+eel
+eel's
+eelgrass
+eellike
+eelpout
+eels
+eelworm
+eely
+EEOC
+eerie
+eerier
+eerily
+eeriness
+eery
+eff
+effable
+efface
+effaceable
+effaced
+effacement
+effacer
+effaces
+effacing
+effect
+effected
+effecting
+effective
+effectively
+effectiveness
+effectives
+effectivity
+effector
+effector's
+effectors
+effects
+effectual
+effectuality
+effectualize
+effectualizes
+effectually
+effectualness
+effectuate
+effectuated
+effectuates
+effectuating
+effectuation
+effeminacy
+effeminate
+effeminatize
+effeminatizes
+effendi
+efferent
+efferently
+effervesce
+effervescence
+effervescent
+effervescently
+effete
+effetely
+effeteness
+efficacious
+efficaciously
+efficaciousness
+efficacity
+efficacy
+efficency
+efficiencies
+efficiency
+efficient
+efficiently
+Effie
+Effie's
+effigy
+effloresce
+efflorescence
+efflorescent
+efflrescent
+effluence
+effluent
+effluents
+effluvia
+effluvium
+efflux
+effluxion
+effort
+effort's
+effortful
+effortfully
+effortless
+effortlessly
+effortlessness
+efforts
+effrontery
+effulgence
+effulgent
+effuse
+effused
+effuses
+effusing
+effusiometer
+effusion
+effusive
+effusively
+effusiveness
+Efik
+eft
+efta
+eftsoons
+EGA
+EGA's
+egad
+egads
+egalitarian
+egalitarianism
+Egan
+Egan's
+Egbert
+Egeria
+Egerton
+egerton
+egest
+egesta
+egestion
+egestive
+egg
+eggbeater
+eggcup
+egged
+egger
+egghead
+eggheaded
+eggheadedness
+egging
+eggnog
+eggplant
+eggs
+eggshell
+Egham
+egis
+eglantine
+Egmont
+ego
+egocentric
+egocentrically
+egocentricity
+egocentrism
+egoism
+egoist
+egoistic
+egoistical
+egoistically
+egoists
+egoize
+egoizer
+egoizers
+egoizes
+egomania
+egomaniac
+egomaniacal
+egomaniacally
+egomaniacs
+egos
+egotism
+egotist
+egotistic
+egotistical
+egotistically
+egotists
+egregious
+egregiously
+egregiousness
+egress
+egression
+egret
+egrets
+Egypt
+Egyptian
+Egyptianization
+Egyptianization's
+Egyptianizations
+Egyptianize
+Egyptianizes
+Egyptians
+Egyptize
+Egyptizes
+Egyptology
+egyptus
+eh
+Ehrenburg
+Ehrlich
+Ehrlich's
+Eichendorff
+eichmann
+Eichmann
+eider
+eiderdown
+eidetic
+eidetically
+eidolon
+Eiffel
+eigenfrequencies
+eigenfrequency
+eigenfunction
+eigenfunctions
+eigenspace
+eigenstate
+eigenstates
+eigenstructure
+eigensystem
+eigensystems
+eigenvalue
+eigenvalue's
+eigenvalues
+eigenvector
+eigenvectors
+eiger
+eight
+eighteen
+eighteens
+eighteenth
+eightfold
+eighth
+eighth's
+eighthes
+eighths
+eighties
+eightieth
+eights
+eightsome
+eighty
+eightyfold
+Eijkman
+Eikon
+Eilat
+Eileen
+ein
+Eindhoven
+eine
+Einkorn
+Einstein
+Einsteinian
+einsteinium
+Eire
+Eire's
+eirenic
+eirenicon
+eisegesis
+Eisenach
+Eisenhower
+Eisenstadt
+Eisenstein
+eisk
+Eisner
+Eisner's
+Eisteddfod
+either
+ejaculate
+ejaculated
+ejaculates
+ejaculating
+ejaculation
+ejaculations
+ejaculatory
+eject
+ejecta
+ejectable
+ejected
+ejecting
+ejection
+ejective
+ejectment
+ejector
+ejectors
+ejects
+Ekaterinburg
+Ekaterinodar
+Ekaterinoslav
+Ekberg
+eke
+eked
+ekes
+eking
+ekistic
+ekistics
+Ekstrom
+Ekstrom's
+Ektachrome
+el
+elaborate
+elaborated
+elaborately
+elaborateness
+elaborates
+elaborating
+elaboration
+elaborations
+elaborative
+elaborators
+elaeoptene
+elagabalus
+Elaine
+elam
+Elamite
+elan
+eland
+elapid
+elapse
+elapsed
+elapses
+elapsing
+elasmobranch
+elasmosaur
+elastance
+elastase
+elastic
+elastically
+elasticate
+elasticated
+elasticates
+elasticating
+elasticities
+elasticity
+elasticization
+elasticize
+elasticized
+elasticizer
+elasticizers
+elasticizes
+elasticizing
+elastics
+elastin
+elastomer
+elastomeric
+elastoplast
+elat
+elate
+elated
+elatedly
+elatedness
+elater
+elaterid
+elaterin
+elaterite
+elaterium
+elates
+elating
+elation
+Elba
+elbe
+Elbert
+elbow
+elbowed
+elbowing
+elbowroom
+elbows
+elbrus
+elburz
+eld
+elder
+elderberry
+elderliness
+elderly
+elders
+eldership
+eldest
+eldo
+Eldon
+Eldon's
+eldritch
+elea
+Eleanor
+Eleatic
+Eleazar
+Eleazar's
+elecampane
+elecroencephalographic
+elect
+electability
+electable
+elected
+electing
+election
+election's
+electioneer
+electioneerer
+elections
+elective
+electively
+electiveness
+electives
+elector
+elector's
+electoral
+electorally
+electorate
+electors
+Electra
+electress
+electret
+electric
+electrical
+electricalize
+electricalizes
+electrically
+electricalness
+electrician
+electricians
+electricities
+electricity
+electricize
+electricizes
+electrics
+electrification
+electrified
+electrify
+electrifying
+electriques
+electro
+electroacoustic
+electroacoustically
+electroacoustics
+electroanalysis
+electroanalytic
+electroanalytical
+electroanesthesia
+electroanesthesia's
+electroanesthesias
+electrocardiogram
+electrocardiogram's
+electrocardiograms
+electrocardiograph
+electrocardiographic
+electrocardiographically
+electrocardiography
+electrocauterization
+electrocauterization's
+electrocauterizations
+electrochemical
+electrochemically
+electrochemist
+electrochemistry
+electrochemists
+electroconvulsive
+electrocorticogram
+electrocorticogram's
+electrocorticograms
+electrocute
+electrocuted
+electrocutes
+electrocuting
+electrocution
+electrocutions
+electrode
+electrode's
+electrodeposit
+electrodeposition
+electrodes
+electrodialysis
+electrodialytic
+electrodialyze
+electrodialyzer
+electrodialyzer's
+electrodialyzers
+electrodialyzes
+electrodynamic
+electrodynamicly
+electrodynamics
+electrodynamometer
+electrodynamometer's
+electrodynamometers
+electroencephalogram
+electroencephalogram's
+electroencephalograms
+electroencephalograph
+electroencephalography
+electroform
+electrogalvanize
+electrogalvanizes
+electrogenesis
+electrogenic
+electrogram
+electrogram's
+electrograms
+electrograph
+electrohomeopathies
+electrohomeopathy
+electrohomeopathy's
+electrohydraulic
+electrohydraulically
+electrojet
+electrokinetic
+electrokinetics
+electroless
+electrologist
+electroluminescence
+electroluminescent
+electrolysis
+electrolyte
+electrolyte's
+electrolytes
+electrolytic
+electrolytically
+electrolyze
+electrolyzed
+electrolyzes
+electrolyzing
+electromagnet
+electromagnetic
+electromagnetically
+electromagnetism
+electromagnetisms
+electromagnetizable
+electromagnets
+electromechanical
+electromechanically
+electromerism
+electrometallurgy
+electrometer
+electrometer's
+electrometers
+electromotive
+electromyogram
+electromyogram's
+electromyograms
+electromyograph
+electromyographic
+electromyographical
+electromyographically
+electromyography
+electron
+electron's
+electronegative
+electronegativity
+electronic
+electronically
+electronics
+electronography
+electrons
+electronvolt
+electrooculogram
+electrooculogram's
+electrooculograms
+electrophilic
+electrophone
+electrophoresis
+electrophoretic
+electrophoretically
+electrophoretogram
+electrophoretogram's
+electrophoretograms
+electrophorus
+electrophotographic
+electrophotography
+electrophysiologic
+electrophysiological
+electrophysiologically
+electrophysiologist
+electrophysiology
+electroplate
+electroplater
+electropositive
+electroretinogram
+electroretinogram's
+electroretinograms
+electroretinograph
+electroretinographic
+electroretinography
+electroscope
+electroshock
+electroshocks
+electrostatic
+electrostatically
+electrostatics
+electrostriction
+electrosurgery
+electrosurgical
+electrotechnology
+electrotherapist
+electrothermal
+electrothermally
+electrothermic
+electrotonic
+electrotonically
+electrotonize
+electrotonizes
+electrotonus
+electrotype
+electrotyper
+electrotypers
+electrovalence
+electrovalency
+electrovalent
+electroviscous
+electroweak
+electrowinning
+electrum
+elects
+electuary
+eleemosynary
+elegance
+elegances
+elegancy
+elegant
+elegantly
+elegiac
+elegiacal
+elegiacally
+elegies
+elegit
+elegize
+elegized
+elegizes
+elegizing
+elegy
+eleia
+element
+element's
+elemental
+elementalize
+elementalizes
+elementally
+elementals
+elementarily
+elementariness
+elementary
+elements
+elemi
+Elena
+Elena's
+elenchus
+eleoptene
+elephant
+elephant's
+elephantiasis
+elephantine
+elephants
+Eleusinian
+eleusis
+elevate
+elevated
+elevates
+elevating
+elevation
+elevations
+elevator
+elevator's
+elevators
+eleven
+elevenfold
+elevens
+elevenses
+eleventh
+elevon
+elf
+elfin
+elfish
+elfishly
+Elfland
+elflock
+Elgar
+Elgin
+Elgin's
+elgon
+Eli
+Elia
+Elias
+elicit
+elicitation
+elicited
+eliciting
+elicitor
+elicits
+elide
+elided
+elides
+elidible
+eliding
+eligibilities
+eligibility
+eligible
+eligibles
+eligibly
+Elijah
+eliminable
+eliminate
+eliminated
+eliminately
+eliminates
+eliminating
+elimination
+eliminations
+eliminative
+eliminator
+eliminators
+Elinor
+Elinor's
+Eliot
+elis
+Elisabeth
+Elisabethville
+Elisavetgrad
+Elisavetpol
+Elise
+Elise's
+Elisha
+Elisha's
+elision
+elisions
+elisp
+elite
+eliteness
+elites
+elitism
+elitist
+elitists
+elixir
+Elizabeth
+Elizabethan
+Elizabethanize
+Elizabethanizes
+Elizabethans
+elk
+elk's
+Elkhart
+elkhound
+elks
+ell
+Ella
+elle
+Ellen
+Ellen's
+Ellesmere
+Ellice
+Ellie
+ellie
+Ellington
+Elliot
+elliot
+Elliott
+ellipse
+ellipse's
+ellipses
+ellipsis
+ellipsoid
+ellipsoid's
+ellipsoidal
+ellipsoids
+ellipsometer
+ellipsometer's
+ellipsometers
+ellipsometry
+elliptic
+elliptical
+elliptically
+ellipticity
+Ellis
+Ellison
+Ellsworth
+Ellwood
+Ellwood's
+elm
+elmer
+Elmhurst
+Elmira
+elms
+Elmsford
+elocution
+elocutionary
+elocutionist
+elocutionists
+Elohim
+Elohist
+eloign
+Eloise
+elongate
+elongated
+elongates
+elongating
+elongation
+elope
+eloped
+elopement
+eloper
+elopes
+eloping
+eloquence
+eloquent
+eloquently
+elroy
+Elroy
+els
+elsan
+Elsass
+else
+else's
+Elsevier
+Elsevier's
+elsewhere
+Elsie
+Elsinore
+Elton
+Elton's
+eluant
+eluate
+eluates
+elucidate
+elucidated
+elucidates
+elucidating
+elucidation
+elucidative
+elucidator
+elucubrate
+elucubrated
+elucubrates
+elucubrating
+elucubration
+elude
+eluded
+eludes
+eluding
+eluent
+elusion
+elusive
+elusively
+elusiveness
+elute
+eluted
+eluting
+elution
+elutriate
+elutriator
+eluvial
+eluviate
+eluviation
+eluvium
+elver
+elves
+Elvira
+elvis
+Elvis
+Elvis's
+elvish
+Elwood
+Elwood's
+Ely
+Ely's
+elyot
+Elysee
+Elysee's
+Elysees
+elysian
+Elysium
+elysium
+elytron
+elytrum
+em
+emaciate
+emaciated
+emaciates
+emaciating
+emaciation
+emacs
+emacs's
+email
+email's
+emanate
+emanated
+emanates
+emanating
+emanation
+emanational
+emanations
+emanative
+emancipate
+emancipated
+emancipates
+emancipating
+emancipation
+emancipationist
+emancipator
+Emanuel
+emarginate
+emarginated
+emargination
+emasculate
+emasculated
+emasculates
+emasculating
+emasculation
+emasculator
+embalm
+embalmer
+embalmers
+embalming
+embalmment
+embalms
+embank
+embanked
+embanking
+embankment
+embankments
+embanks
+embarcadero
+embargo
+embargoed
+embargoes
+embargoing
+embark
+embarkation
+embarked
+embarking
+embarkment
+embarks
+embarrass
+embarrassable
+embarrassed
+embarrassedly
+embarrasses
+embarrassing
+embarrassingly
+embarrassment
+embassage
+embassies
+embassy
+embassy's
+embattle
+embattled
+embattlement
+embattles
+embattling
+embay
+embayment
+embed
+embeddable
+embedded
+embedder
+embedding
+embedment
+embeds
+embellish
+embellished
+embellisher
+embellishes
+embellishing
+embellishment
+embellishment's
+embellishments
+ember
+embers
+embezzle
+embezzled
+embezzlement
+embezzler
+embezzler's
+embezzlers
+embezzles
+embezzling
+embitter
+embittered
+embitterment
+embitters
+emblaze
+emblazed
+emblazes
+emblazing
+emblazon
+emblazoned
+emblazoner
+emblazoning
+emblazonment
+emblazonry
+emblazons
+emblem
+emblematic
+emblematical
+emblematically
+emblematicize
+emblematicizes
+emblematization
+emblematize
+emblematized
+emblematizes
+emblematizing
+emblements
+emblemize
+emblemizes
+emblems
+embodied
+embodier
+embodies
+embodiment
+embodiment's
+embodiments
+embody
+embodying
+embolden
+emboldened
+emboldens
+embolectomy
+embolic
+embolism
+embolismic
+embolization
+embolus
+embosom
+emboss
+embossable
+embossed
+embosser
+embossers
+embosses
+embossing
+embossment
+embouchure
+embow
+embowed
+embowel
+emboweled
+emboweling
+embower
+embrace
+embraceable
+embraced
+embracement
+embraceor
+embracer
+embracery
+embraces
+embracing
+embracingly
+embracive
+embranchment
+embrangle
+embranglement
+embrasure
+embrectomy
+embrittle
+embrittlement
+embrocate
+embrocated
+embrocates
+embrocating
+embrocation
+embroglio
+embroider
+embroidered
+embroiderer
+embroideries
+embroiders
+embroidery
+embroil
+embroiled
+embroiling
+embroilment
+embroils
+embrown
+embrue
+embryectomy
+embryo
+embryo's
+embryogenesis
+embryogenetic
+embryogenic
+embryogeny
+embryol
+embryologic
+embryological
+embryologically
+embryologist
+embryology
+embryonal
+embryonally
+embryonated
+embryonic
+embryonically
+embryos
+embryotic
+embus
+emcee
+emceed
+emceeing
+emden
+emend
+emendable
+emendate
+emendation
+emendator
+emendatory
+emender
+emerald
+emerald's
+emeralds
+emerge
+emerged
+emergence
+emergencies
+emergency
+emergency's
+emergent
+emerges
+emerging
+emeries
+emeriti
+emeritus
+emersed
+emerses
+emersion
+Emerson
+emery
+emesis
+emetic
+emetically
+emetine
+emf
+emigrant
+emigrant's
+emigrants
+emigrate
+emigrated
+emigrates
+emigrating
+emigration
+emigre
+emigre's
+emigree
+Emil
+Emil's
+Emile
+Emile's
+Emilio
+Emilio's
+Emily
+eminence
+eminency
+eminent
+eminently
+emir
+emirate
+Emirates
+emiscan
+emissaries
+emissary
+emission
+emission's
+emissions
+emissive
+emissivities
+emissivity
+emit
+emits
+emittance
+emitted
+emitter
+emitters
+emitting
+Emma
+Emmanuel
+emmen
+emmenagogue
+Emmenthal
+emmer
+Emmet
+emmetropia
+Emmett
+Emmett's
+Emmy
+emollient
+emollients
+emolument
+emoluments
+Emory
+emote
+emoted
+emotes
+emoting
+emotion
+emotion's
+emotional
+emotionalism
+emotionalist
+emotionalistic
+emotionality
+emotionalization
+emotionalization's
+emotionalizations
+emotionalize
+emotionalized
+emotionalizes
+emotionalizing
+emotionally
+emotionize
+emotionizes
+emotionless
+emotionlessness
+emotions
+emotive
+emotively
+emotivism
+emotivity
+empale
+empanel
+empaneled
+empaneling
+empanels
+empassion
+empath
+empathetic
+empathetically
+empathic
+empathize
+empathized
+empathizes
+empathizing
+empathy
+empedocles
+empennage
+emperies
+emperor
+emperor's
+emperors
+emperorship
+empery
+emphases
+emphasing
+emphasis
+emphasization
+emphasization's
+emphasize
+emphasized
+emphasizer
+emphasizers
+emphasizes
+emphasizing
+emphatic
+emphatically
+emphysema
+emphysematous
+empire
+empire's
+empires
+empiric
+empirical
+empirically
+empiricism
+empiricist
+empiricist's
+empiricists
+emplace
+emplacement
+emplane
+employ
+employability
+employable
+employed
+employee
+employee's
+employees
+employer
+employer's
+employers
+employing
+employment
+employment's
+employments
+employs
+empoison
+empoisonment
+empolder
+emporium
+emporiums
+empower
+empowered
+empowering
+empowerment
+empowers
+empress
+empressement
+emprise
+Empson
+emptied
+emptier
+empties
+emptiest
+emptily
+emptiness
+empty
+emptyhanded
+emptying
+empurple
+empurpled
+empurpling
+empyema
+empyrean
+empyreuma
+ems
+emu
+emulate
+emulated
+emulates
+emulating
+emulation
+emulations
+emulative
+emulatively
+emulator
+emulator's
+emulators
+emulous
+emulously
+emulousness
+emulsible
+emulsifiable
+emulsification
+emulsified
+emulsifier
+emulsifies
+emulsify
+emulsion
+emulsionize
+emulsionizes
+emulsions
+emulsive
+emulsoid
+emunctory
+en
+enable
+enabled
+enabler
+enablers
+enables
+enabling
+enact
+enacted
+enacting
+enactment
+enactments
+enactor
+enacts
+enamel
+enameled
+enameler
+enamelers
+enameling
+enamelings
+enamelist
+enamelists
+enamels
+enamelware
+enamine
+enamor
+enamor's
+enamored
+enamored's
+enamoredness
+enamoreds
+enamoring
+enamorment
+enamorment's
+enamorments
+enamors
+enantiomorph
+enarbor
+enarbor's
+enarbors
+enarthrosis
+enate
+encaenia
+encage
+encamp
+encamped
+encamping
+encampment
+encamps
+encapsulate
+encapsulated
+encapsulates
+encapsulating
+encapsulation
+encapsule
+encapsules
+encarnalization
+encarnalize
+encarnalized
+encarnalizes
+encarnalizing
+encase
+encased
+encasement
+encash
+encashment
+encaustic
+enceinte
+enceladus
+encephalic
+encephalin
+encephalitic
+encephalitis
+encephalitogenic
+encephalogram
+encephalogram's
+encephalograms
+encephalograph
+encephalographic
+encephalography
+encephaloma
+encephalomyelitis
+encephalon
+enchain
+enchained
+enchainment
+enchant
+enchanted
+enchanter
+enchanting
+enchantingly
+enchantment
+enchantress
+enchants
+enchase
+enchased
+enchasing
+enchilada
+enchiladas
+enchiridion
+enchondroma
+enchorial
+encipher
+enciphered
+encipherer
+enciphering
+encipherment
+enciphers
+encircle
+encircled
+encirclement
+encircles
+encircling
+enclasp
+enclave
+enclaves
+enclitic
+enclose
+enclosed
+encloses
+enclosing
+enclosure
+enclosure's
+enclosures
+encode
+encoded
+encoder
+encoders
+encodes
+encoding
+encodings
+encolor
+encolor's
+encolored
+encoloring
+encolors
+encomia
+encomiast
+encomium
+encomiums
+encompass
+encompassed
+encompasses
+encompassing
+encompassment
+encore
+encored
+encores
+encoring
+encounter
+encountered
+encountering
+encounters
+encourage
+encouraged
+encouragement
+encouragements
+encourager
+encourages
+encouraging
+encouragingly
+encrimson
+encrinite
+encroach
+encroached
+encroacher
+encroaches
+encroaching
+encroachment
+encrust
+encrustation
+encrusted
+encrusting
+encrusts
+encrypt
+encrypted
+encrypting
+encryption
+encryption's
+encryptions
+encrypts
+enculturation
+encumber
+encumbered
+encumbering
+encumbers
+encumbrance
+encumbrancer
+encumbrances
+encyclical
+encyclopedia
+encyclopedia's
+encyclopedias
+encyclopedic
+encyst
+encystation
+encystment
+end
+endamage
+Endamoeba
+endanger
+endangered
+endangering
+endangerment
+endangers
+endarch
+endarchy
+endbrain
+endear
+endeared
+endearing
+endearingly
+endearment
+endearments
+endears
+endeavor
+endeavor's
+endeavored
+endeavorer
+endeavorer's
+endeavorers
+endeavoring
+endeavors
+ended
+endemic
+endemically
+endemicity
+ender
+enderby
+endergonic
+endermic
+endermically
+enders
+endexine
+endgame
+Endicott
+ending
+endings
+endite
+endive
+endleaf
+endless
+endlessly
+endlessness
+endlong
+endmost
+endnote
+endnote's
+endnotes
+endo
+endobiotic
+endoblast
+endoblastic
+endocardial
+endocarditis
+endocardium
+endocarp
+endocentric
+endochondral
+endocranium
+endocrine
+endocrinologic
+endocrinological
+endocrinologist
+endocrinology
+endocytic
+endocytosis
+endocytotic
+endoderm
+endodermal
+endodermis
+endodontia
+endodontic
+endodontically
+endodontics
+endodontist
+endoenzyme
+endoergic
+endoerythrocytic
+endogamic
+endogamous
+endogamy
+endogen
+endogenic
+endogenous
+endogenously
+endogeny
+endolymph
+endolymphatic
+endometrial
+endometriosis
+endometrium
+endomitosis
+endomorph
+endomorphic
+endomorphism
+endomorphy
+endoneurium
+endonuclease
+endoparasite
+endoparasitism
+endopeptidase
+endophyte
+endophytic
+endoplasm
+endoplasmic
+endorsable
+endorse
+endorsed
+endorsee
+endorsement
+endorsement's
+endorsements
+endorser
+endorses
+endorsing
+endoscope
+endoscopic
+endoscopically
+endoscopy
+endoskeletal
+endoskeleton
+endosmosis
+endosmotic
+endosmotically
+endosome
+endosperm
+endospermic
+endospermous
+endospore
+endosporic
+endosporous
+endosteal
+endosteally
+endosternite
+endosteum
+endostosis
+endostyle
+endosymbiosis
+endothecium
+endothelial
+endothelioma
+endothelium
+endotherm
+endothermal
+endothermic
+endotoxic
+endotoxin
+endotracheal
+endotrophic
+endotropic
+endover
+endow
+endowed
+endowing
+endowment
+endowment's
+endowments
+endows
+endozoic
+endpaper
+endplate
+endplay
+endpoint
+endpoints
+Endrich
+ends
+endue
+endued
+enduing
+endurable
+endurably
+endurance
+endure
+endured
+endures
+enduring
+enduringly
+enduringness
+endways
+endwise
+Endymion
+enema
+enema's
+enemas
+enemata
+enemies
+enemy
+enemy's
+energetic
+energetically
+energetics
+energid
+energies
+energization
+energize
+energized
+energizer
+energizers
+energizes
+energizing
+energumen
+energy
+enervate
+enervated
+enervates
+enervating
+enervation
+enervative
+Enesco
+enface
+enfant
+enfants
+enfeeble
+enfeebled
+enfeeblement
+enfeebles
+enfeebling
+enfeoff
+enfetter
+enfever
+enfilade
+enflame
+enflamed
+enflames
+enflaming
+enfold
+enforcable
+enforce
+enforceability
+enforceable
+enforced
+enforcedly
+enforcement
+enforcer
+enforcers
+enforces
+enforcible
+enforcing
+enfranchise
+enfranchised
+enfranchisement
+enfranchiser
+enfranchises
+enfranchising
+engadine
+engage
+engaged
+engagement
+engagement's
+engagements
+engages
+engaging
+engagingly
+Engel
+Engels
+engender
+engendered
+engendering
+engenders
+engild
+engine
+engine's
+engined
+engineer
+engineer's
+engineered
+engineering
+engineeringly
+engineerings
+engineers
+engineroom
+enginerooms
+enginery
+engines
+engining
+engird
+engirdle
+englacial
+england
+englander
+englanders
+Engle
+Engle's
+Englewood
+English
+English's
+Englishism
+Englishize
+Englishizes
+Englishman
+Englishmen
+Englishry
+englut
+englutted
+engluttin
+engorge
+engorged
+engorgement
+engorges
+engorging
+engr
+engraft
+engrail
+engrailed
+engrain
+engram
+engram's
+engrammic
+engrams
+engrandize
+engrandizement
+engrandizement's
+engrandizements
+engrandizes
+engrave
+engraved
+engraver
+engravers
+engraves
+engraving
+engravings
+engross
+engrossed
+engrossedly
+engrosser
+engrossing
+engrossingly
+engrossment
+engulf
+engulfed
+engulfing
+engulfment
+engulfs
+enhalo
+enhance
+enhanced
+enhancement
+enhancement's
+enhancements
+enhances
+enhancing
+enharmonic
+enharmonically
+enhypostatize
+enhypostatizes
+Enid
+Enid's
+enigma
+enigmatic
+enigmatical
+enigmatically
+enisle
+eniwetok
+enjambement
+enjambment
+enjoin
+enjoinder
+enjoined
+enjoining
+enjoins
+enjoy
+enjoyable
+enjoyableness
+enjoyably
+enjoyed
+enjoying
+enjoyment
+enjoys
+enkindle
+enlace
+enlacement
+enlarge
+enlargeable
+enlarged
+enlargement
+enlargement's
+enlargements
+enlarger
+enlargers
+enlarges
+enlarging
+enlighten
+enlightened
+enlightening
+enlightenment
+enlightens
+enlist
+enlisted
+enlistee
+enlister
+enlisting
+enlistment
+enlistments
+enlists
+enliven
+enlivened
+enlivening
+enlivens
+enmesh
+enmeshed
+enmeshment
+enmities
+enmity
+ennage
+ennead
+enneagon
+enneahedron
+ennerdale
+ennervation
+ennis
+enniskillen
+ennius
+ennoble
+ennobled
+ennoblement
+ennobler
+ennobles
+ennobling
+ennui
+Enoch
+enol
+enolase
+enolic
+enolization
+enolization's
+enolizations
+enolize
+enolizes
+enologist
+enology
+enormities
+enormity
+enormous
+enormously
+enormousness
+Enos
+enosis
+enough
+enounce
+enow
+enphytotic
+enplane
+enqueue
+enqueued
+enqueues
+enquire
+enquired
+enquirer
+enquirers
+enquires
+enquiries
+enquiring
+enquiry
+enrage
+enraged
+enrages
+enraging
+enrapt
+enrapture
+enraptured
+enraptures
+enrapturing
+enregister
+enrich
+enriched
+enricher
+enriches
+enriching
+enrichment
+Enrico
+enrobe
+enroll
+enrolled
+enrollee
+enrollees
+enrolling
+enrollment
+enrollment's
+enrollments
+enrolls
+enroot
+ens
+ensample
+ensanguine
+enschede
+ensconce
+ensconced
+ensconces
+ensconcing
+enscroll
+ensemble
+ensemble's
+ensembles
+ensepulcher
+ensepulcher's
+ensepulchers
+enserf
+enserfment
+ensheathe
+enshrine
+enshrined
+enshrinement
+enshrines
+enshroud
+ensiform
+ensign
+ensign's
+ensigns
+ensilage
+ensile
+ensiled
+ensiling
+ensional
+enslave
+enslaved
+enslavement
+enslaver
+enslavers
+enslaves
+enslaving
+ensnare
+ensnared
+ensnares
+ensnaring
+ensnarl
+Ensolite
+ensolite
+ensor
+ensorceled
+ensorcels
+ensoul
+ensphere
+ensue
+ensued
+ensues
+ensuing
+ensure
+ensured
+ensurer
+ensurers
+ensures
+ensuring
+enswathe
+entablature
+entablement
+entablements
+entail
+entailed
+entailer
+entailing
+entailment
+entails
+Entamoeba
+entangle
+entangled
+entanglement
+entangler
+entangles
+entangling
+entasis
+ente
+entebbe
+entelechy
+entellus
+entendre
+entente
+enter
+enterable
+enteral
+enterally
+entered
+enterer
+enteric
+entering
+enteritis
+enterogastrone
+enterokinase
+enteron
+enterostomy
+enterotomy
+enterovirus
+enterprise
+enterpriser
+enterprises
+enterprising
+enterprisingly
+enters
+entertain
+entertained
+entertainer
+entertainers
+entertaining
+entertainingly
+entertainment
+entertainment's
+entertainments
+entertains
+enthalpy
+enthetic
+enthrall
+enthralled
+enthralling
+enthrallment
+enthrallment's
+enthrallments
+enthralls
+enthrone
+enthroned
+enthronement
+enthrones
+enthroning
+enthronization
+enthronization's
+enthronizations
+enthronize
+enthronizes
+enthuse
+enthused
+enthuses
+enthusiasm
+enthusiasms
+enthusiast
+enthusiast's
+enthusiastic
+enthusiastically
+enthusiasts
+enthusing
+enthymeme
+entice
+enticed
+enticement
+enticements
+enticer
+enticers
+entices
+enticing
+entire
+entirely
+entireties
+entirety
+entities
+entitle
+entitled
+entitlement
+entitlements
+entitles
+entitling
+entity
+entity's
+entoblast
+entoderm
+entodermal
+entodermic
+entoil
+entoiled
+entomb
+entombed
+entombment
+entomic
+entomological
+entomologist
+entomologize
+entomologized
+entomologizes
+entomologizing
+entomology
+entomophagous
+entomophilous
+entomophily
+entomostracan
+entophyte
+entopic
+entourage
+entourages
+entozoic
+entozoon
+entrail
+entrails
+entrain
+entrained
+entrainer
+entraining
+entrainment
+entrains
+entrammel
+entrance
+entranced
+entrancement
+entrances
+entranceway
+entrancing
+entrant
+entrants
+entrap
+entrapment
+entrapments
+entrapped
+entrappingly
+entraps
+entreat
+entreated
+entreaties
+entreating
+entreatingly
+entreatment
+entreats
+entreaty
+entrechat
+entree
+entrees
+entremets
+entrench
+entrenched
+entrenches
+entrenching
+entrenchment
+entrenchments
+entrepreneur
+entrepreneur's
+entrepreneurial
+entrepreneurs
+entrepreneurship
+entresol
+entries
+entropies
+entropy
+entrust
+entrusted
+entrusting
+entrustment
+entrusts
+entry
+entry's
+entryism
+entryist
+entryists
+entryname
+entrynames
+entrypoint
+entrypoints
+entryway
+entwine
+entwined
+entwinement
+entwines
+entwining
+entwist
+enucleate
+enucleated
+enucleating
+enucleation
+enugu
+enumerable
+enumerate
+enumerated
+enumerates
+enumerating
+enumeration
+enumerations
+enumerative
+enumerator
+enumerator's
+enumerators
+enunciable
+enunciate
+enunciated
+enunciates
+enunciating
+enunciation
+enunciator
+enunciators
+enure
+enuresis
+envapor
+envapor's
+envapors
+envelop
+envelope
+enveloped
+enveloper
+envelopes
+enveloping
+envelopment
+envelopments
+envelops
+envenom
+envenomed
+envenoming
+envenomization
+envenoms
+enver
+enviable
+enviableness
+enviably
+envied
+envier
+envies
+envious
+enviously
+enviousness
+environ
+environed
+environing
+environment
+environment's
+environmental
+environmentalism
+environmentalist
+environmentalists
+environmentally
+environments
+environs
+envisage
+envisaged
+envisages
+envisaging
+envision
+envisioned
+envisionin
+envisioning
+envisions
+envoi
+envois
+envoy
+envoy's
+envoys
+envy
+envying
+envyingly
+enwheel
+enwind
+enwinding
+enwomb
+enwrap
+enwreath
+enwreathe
+enzed
+enzootic
+enzymatic
+enzymatically
+enzyme
+enzymes
+enzymic
+enzymically
+enzymologist
+enzymology
+enzymolysis
+eobiont
+Eocene
+eogene
+eohippus
+eolian
+eolic
+eolipile
+eolith
+eolithic
+eon
+eon's
+eonian
+eonism
+eonism's
+eonisms
+eons
+eos
+eosin
+eosine
+eosinophil
+Eozoic
+EPA
+epact
+epaminondas
+eparch
+eparchy
+epaulet
+epaulet's
+epaulets
+epaulette
+epencephalon
+epenthesis
+epergne
+epexegesis
+ephah
+ephebe
+Ephedra
+Ephemera
+ephemeral
+ephemerality
+ephemerally
+ephemerals
+ephemerides
+ephemeris
+ephemeron
+Ephesian
+ephesians
+Ephesians
+Ephesus
+ephod
+ephor
+Ephraim
+Ephraimite
+epiblast
+epiboly
+epic
+epic's
+epical
+epically
+epicalyx
+epicanthus
+epicardial
+epicardium
+epicarp
+epicedium
+epicene
+epicenism
+epicenter
+epicenter's
+epicenters
+epicentral
+epiclesis
+epicontinental
+epicotyl
+epicrisis
+epicritic
+epics
+epictetus
+epicure
+epicurean
+epicureanism
+epicurism
+Epicurize
+Epicurizes
+epicurus
+Epicurus
+epicycle
+epicycles
+epicyclic
+epicyclical
+epicyclically
+epicycloidal
+epidaurus
+epideictic
+epidemic
+epidemic's
+epidemical
+epidemically
+epidemicity
+epidemics
+epidemiologic
+epidemiological
+epidemiologically
+epidemiologist
+epidemiology
+epidermal
+epidermic
+epidermis
+epidiascope
+epididymis
+epidote
+epidural
+epifocal
+epigastrium
+epigeal
+epigene
+epigenetic
+epigenous
+epigeous
+epiglottis
+epigone
+Epigoni
+epigram
+epigrammatic
+epigrammatical
+epigrammatically
+epigrammatism
+epigrammatist
+epigrammatization
+epigrammatize
+epigrammatized
+epigrammatizer
+epigrammatizes
+epigrammatizing
+epigrams
+epigraph
+epigrapher
+epigraphic
+epigraphical
+epigraphically
+epigraphist
+epigraphy
+epigynous
+epilate
+epilepsy
+epileptic
+epileptically
+epileptics
+epileptoid
+epilimnion
+epilogue
+epilogues
+epimere
+epimerism
+epimorphism
+epimorphosis
+epimysium
+epinasty
+epinephrine
+epineurium
+epiphanous
+epiphany
+epiphenomena
+epiphenomenal
+epiphenomenalism
+epiphenomenally
+epiphenomenon
+epiphragm
+epiphyseal
+epiphysis
+epiphyte
+epiphytic
+epiphytotic
+epirogeny
+epirus
+episcopacy
+episcopal
+Episcopalian
+Episcopalianize
+Episcopalianizes
+Episcopalism
+episcopally
+episcopate
+episcope
+episematic
+episiotomy
+episode
+episode's
+episodes
+episodic
+episodical
+episodically
+episomal
+episomally
+episome
+epispastic
+epistasis
+epistasy
+epistatic
+epistaxis
+epistemic
+epistemically
+epistemological
+epistemologically
+epistemologist
+epistemology
+episternum
+epistle
+epistle's
+epistler
+epistles
+epistolary
+epistolatory
+epistoler
+epistrophe
+epitaph
+epitaphed
+epitaphial
+epitaphic
+epitaphing
+epitaphize
+epitaphizes
+epitaphs
+epitaxial
+epitaxially
+epitaxy
+epithalamium
+epithelial
+epithelioma
+epithelium
+epithet
+epithet's
+epithetic
+epithetical
+epithetize
+epithetizes
+epithets
+epitome
+epitomes
+epitomization
+epitomization's
+epitomizations
+epitomize
+epitomized
+epitomizer
+epitomizers
+epitomizes
+epitomizing
+epizoic
+epizoon
+epizootic
+epoch
+epochal
+epochally
+epoches
+epochs
+epode
+epodes
+eponym
+eponymous
+eponymy
+epos
+epoxide
+epoxy
+epping
+eprom
+eproms
+epsilon
+epsilons
+Epsom
+Epstein
+epyllion
+equability
+equable
+equableness
+equably
+equal
+equaled
+equaling
+equalitarian
+equalitarianism
+equalities
+equality
+equality's
+equalization
+equalization's
+equalizations
+equalize
+equalized
+equalizer
+equalizer's
+equalizers
+equalizes
+equalizing
+equalizings
+equally
+equals
+equanimities
+equanimity
+equate
+equated
+equates
+equating
+equation
+equational
+equationally
+equations
+equator
+equator's
+equatorial
+Equatorial
+equators
+equatorward
+equerries
+equerry
+equestrian
+equestrianize
+equestrianizes
+equestrians
+equestrienne
+equiangular
+equiangularity
+equicaloric
+equidistant
+equidistantly
+equifrequent
+equifrequently
+equilateral
+equilaterals
+equilibrant
+equilibrate
+equilibrated
+equilibrates
+equilibrating
+equilibration
+equilibrator
+equilibrators
+equilibratory
+equilibria
+equilibrist
+equilibristic
+equilibrium
+equilibriums
+equimolal
+equimolar
+equimolecular
+equine
+equines
+equinoctial
+equinox
+equip
+equipage
+equipartition
+equipment
+equipments
+equipoise
+equipollence
+equipollent
+equipollently
+equiponderant
+equiponderate
+equipotent
+equipotential
+equipped
+equipping
+equiprobable
+equiproportional
+equiproportionality
+equiproportionate
+equips
+Equisetum
+equitability
+equitable
+equitableness
+equitably
+equitant
+equitation
+equites
+equities
+equity
+equivalence
+equivalenced
+equivalences
+equivalencing
+equivalency
+equivalent
+equivalently
+equivalents
+equivocal
+equivocality
+equivocally
+equivocalness
+equivocate
+equivocated
+equivocates
+equivocating
+equivocation
+equivocator
+equivoke
+equivoque
+equuleus
+era
+era's
+eradiate
+eradicable
+eradicably
+eradicate
+eradicated
+eradicates
+eradicating
+eradication
+eradicative
+eradicator
+eradicators
+eradictions
+eras
+erasabilities
+erasability
+erasable
+erase
+erased
+eraser
+erasers
+erases
+erasing
+erasion
+Erasmus
+Erastianism
+Erastus
+erasure
+Erato
+Erato's
+Eratosthenes
+erbium
+erciyas
+ERDA
+ere
+erebus
+Erechtheum
+Erechtheus
+erect
+erectable
+erected
+erectile
+erectility
+erecting
+erection
+erection's
+erections
+erectly
+erectness
+erector
+erector's
+erectors
+erects
+erelong
+eremite
+Erenburg
+erenow
+erepsin
+erethism
+erevan
+erewhile
+erewhiles
+erfurt
+erg
+ergastoplasm
+ergative
+ergatocracy
+ergo
+ergodic
+ergodicity
+ergograph
+ergometer
+ergometer's
+ergometers
+ergometric
+ergonomic
+ergonomics
+ergonomist
+ergonovine
+ergosterol
+ergot
+ergotamine
+ergotic
+ergotism
+ergotized
+ergotizes
+ergotropic
+erhard
+Eric
+Erica
+ericaceous
+Erich
+Erickson
+Ericson
+Ericsson
+eridanus
+Erie
+Erik
+Erik's
+Erika
+Erika's
+Erikson
+Erin
+erinaceous
+eringo
+erinyes
+eris
+eristic
+erith
+Eritrea
+erivan
+erk
+Erlang
+erlang
+Erlang's
+erlangen
+erlanger
+Erlenmeyer
+Erlenmeyer's
+erlking
+Ermanaric
+ermine
+ermine's
+ermined
+ermines
+Ermler
+erne
+Ernest
+Ernestine
+Ernie
+Ernst
+erode
+eroded
+erodes
+erodibility
+erodible
+eroding
+erogenic
+erogenous
+Eros
+erose
+erosely
+erosible
+erosion
+erosional
+erosionally
+erosive
+erosiveness
+erosivity
+erotema
+erotic
+erotica
+erotical
+erotically
+eroticism
+eroticist
+eroticization
+eroticize
+eroticized
+eroticizes
+eroticizing
+erotism
+erotogenic
+erotology
+erotomania
+err
+errancies
+errancy
+errand
+errands
+errant
+errantly
+errantry
+errants
+errata
+erratas
+erratic
+erratical
+erratically
+erraticism
+erratum
+erred
+errhine
+erring
+erringly
+Errol
+erroneous
+erroneously
+erroneousness
+error
+error's
+errorless
+errors
+errs
+errupt
+erruptive
+ersatz
+Erse
+Erskine
+Erskine's
+erst
+erstwhile
+erubescence
+eruct
+erudite
+eruditely
+erudition
+erumpent
+erupt
+erupted
+eruptible
+erupting
+eruption
+eruptions
+eruptive
+eruptively
+erupts
+Ervin
+Erwin
+Erymanthian
+erymanthus
+eryngo
+erysipelas
+erysipeloid
+erythema
+erythrism
+erythrite
+erythritol
+erythroblast
+erythroblastosis
+erythrocyte
+erythrocytometer
+erythromycin
+erythropoiesis
+erzgebirge
+erzurum
+esaki
+esau
+esbjerg
+ESC
+escadrille
+escalade
+escalader
+escalades
+escalate
+escalated
+escalates
+escalating
+escalation
+escalator
+escalators
+escalatory
+Escallonia
+escallop
+escallops
+escalope
+escapable
+escapade
+escapade's
+escapades
+escape
+escaped
+escapee
+escapee's
+escapees
+escapement
+escapements
+escaper
+escapes
+escaping
+escapism
+escapist
+escapologist
+escapology
+escargot
+escarp
+escarpment
+escarpment's
+escarpments
+escaut
+eschalot
+escharotic
+eschatology
+escheat
+escherichia
+Escherichia
+eschew
+eschewal
+eschewed
+eschewing
+eschews
+escoffier
+escolar
+Escorial
+escort
+escorted
+escorting
+escorts
+escot
+escribe
+escritoire
+escrow
+escuage
+escudo
+esculent
+escurial
+escutcheon
+escutcheons
+esdraelon
+Esdras
+esemplastic
+eserine
+esher
+esker
+Eskilstuna
+Eskimo
+Eskimoized
+Eskimoized's
+Eskimoizeds
+Eskimos
+esky
+Esmark
+Esmark's
+esophageal
+esophagi
+esophagus
+esoteric
+esoterica
+esoterically
+esotericism
+Esp
+esp
+espadrille
+espagnol
+Espagnol
+espalier
+espanol
+esparto
+especial
+especially
+esperance
+Esperanto
+espial
+espied
+espies
+espionage
+esplanade
+espoo
+Esposito
+Esposito's
+espousal
+espousals
+espouse
+espoused
+espouser
+espouses
+espousing
+espresso
+espressos
+esprit
+esprits
+espy
+espying
+Esquiline
+esquimau
+esquire
+esquires
+esro
+essaouira
+essay
+essayed
+essayer
+essayist
+essayistic
+essayists
+essays
+Essen
+Essen's
+essence
+essence's
+essences
+Essene
+Essenize
+Essenizes
+essential
+essentialism
+essentialist
+essentiality
+essentialize
+essentializes
+essentially
+essentialness
+essentials
+essequibo
+Essex
+essonite
+essonne
+EST
+establish
+establishable
+established
+establisher
+establishes
+establishing
+establishment
+establishment's
+establishmentarian
+establishmentarianism
+establishments
+estancia
+estate
+estate's
+estates
+este
+esteem
+esteemable
+esteemed
+esteeming
+esteems
+Estella
+Estella's
+ester
+esterase
+esterify
+esterization
+esterization's
+esterizations
+esterize
+esterizes
+esters
+Estes
+Esther
+esthesia
+esthesiometer
+esthesiometer's
+esthesiometers
+esthesis
+esthete
+esthetes
+esthetic
+esthetic's
+esthetically
+esthetics
+esthonia
+estienne
+estimable
+estimableness
+estimate
+estimated
+estimates
+estimating
+estimation
+estimations
+estimative
+estimator
+estimators
+estipulate
+estival
+estivate
+estivation
+Estonia
+Estonia's
+Estonian
+estop
+estoppal
+estopped
+estoppel
+estopping
+estovers
+estrade
+estradiol
+estragon
+estral
+estrange
+estranged
+estrangement
+estranger
+estranges
+estranging
+estray
+estreat
+estremadura
+estrin
+estriol
+estrogen
+estrogenic
+estrogenically
+estrone
+estrous
+estrum
+estrus
+estuarial
+estuaries
+estuarine
+estuary
+esurience
+esuriency
+esurient
+esuriently
+et
+eta
+etaerio
+etagere
+etalon
+etamine
+etaoin
+etas
+etatism
+etatist
+etc
+etcetera
+etceteras
+etch
+etchant
+etched
+etcher
+etches
+etching
+eteocles
+eternal
+eternalization
+eternalization's
+eternalizations
+eternalize
+eternalized
+eternalizes
+eternalizing
+eternally
+eternalness
+eterne
+eternities
+eternity
+eternize
+eternized
+eternizes
+eternizing
+etesian
+Eth
+Ethan
+ethane
+ethanol
+Ethel
+Ethelbert
+Ethelred
+ethene
+ether
+ether's
+ethereal
+ethereality
+etherealization
+etherealization's
+etherealizations
+etherealize
+etherealized
+etherealizes
+etherealizing
+ethereally
+etherealness
+etherege
+etheric
+etherify
+etherish
+etherization
+etherization's
+etherizations
+etherize
+etherized
+etherizer
+etherizers
+etherizes
+etherizing
+etherlike
+Ethernet
+Ethernet's
+Ethernets
+ethers
+ethic
+ethical
+ethicality
+ethically
+ethicalness
+ethician
+ethicians
+ethicist
+ethicists
+ethicization
+ethicize
+ethicized
+ethicizes
+ethicizing
+ethics
+Ethiopia
+Ethiopian
+Ethiopians
+ethmoid
+ethnarch
+ethnic
+ethnical
+ethnically
+ethnicities
+ethnicity
+ethnicize
+ethnicizes
+ethnobiological
+ethnobiology
+ethnobotany
+ethnocentric
+ethnocentrically
+ethnocentricity
+ethnocentrism
+ethnogeny
+ethnographer
+ethnographers
+ethnographic
+ethnographical
+ethnographically
+ethnography
+ethnol
+ethnologic
+ethnological
+ethnologically
+ethnologist
+ethnology
+ethnomethodology
+ethnomusicology
+ethological
+ethologist
+ethology
+ethonone
+ethos
+ethoxide
+ethoxy
+ethoxyethane
+ethyl
+ethylate
+ethylation
+ethylbenzene
+ethylene
+ethylenic
+ethylenically
+ethylic
+ethyne
+ethynyl
+etiolate
+etiologies
+etiology
+etiology's
+etiquette
+Etna
+etna
+Eton
+Etruria
+Etruscan
+etude
+etudes
+etui
+etymological
+etymologically
+etymologies
+etymologist
+etymologists
+etymologization
+etymologize
+etymologized
+etymologizes
+etymologizing
+etymology
+etymon
+etzel
+eubacteria
+euboea
+eucaine
+eucalyptol
+eucalyptus
+eucaryotic
+Eucharis
+Eucharist
+eucharistic
+euchlorine
+euchre
+euchromatin
+eucken
+Euclid
+Euclidean
+euclidian
+eucre
+eudemon
+eudemonia
+eudemonics
+eudiometer
+eudoxus
+Eugene
+Eugenia
+eugenic
+eugenically
+eugenicist
+eugenics
+eugenol
+euglena
+euhemerism
+euhemerist
+euhemeristic
+euhemeristically
+euhemerize
+eukaryote
+eukaryotic
+eulachon
+Euler
+Eulerian
+eulogia
+eulogies
+eulogist
+eulogistic
+eulogistically
+eulogium
+eulogization
+eulogization's
+eulogizations
+eulogize
+eulogized
+eulogizer
+eulogizers
+eulogizes
+eulogizing
+eulogy
+Eumenides
+eumorphic
+Eunice
+eunuch
+eunuchism
+eunuchs
+Euonymus
+Eupatorium
+eupatrid
+eupen
+eupepsia
+euphausiid
+euphemism
+euphemism's
+euphemisms
+euphemist
+euphemistic
+euphemistically
+euphemize
+euphemized
+euphemizer
+euphemizes
+euphemizing
+euphonic
+euphonically
+euphonious
+euphoniously
+euphoniousness
+euphonium
+euphonization
+euphonize
+euphonized
+euphonizes
+euphonizing
+euphony
+euphorbia
+euphorbiaceous
+euphoria
+euphoriant
+euphoric
+euphorically
+euphotic
+euphrasy
+Euphrates
+euphroe
+Euphrosyne
+euphuism
+euphuist
+euphuistic
+euphuistically
+euplastic
+euploid
+eupnoea
+Eurasia
+Eurasian
+euratom
+eure
+eureka
+eurhythmic
+eurhythmics
+eurhythmy
+Euridyce
+Euridyce's
+Euripides
+euripus
+Euroclydon
+Eurocommunism
+Eurocrat
+Eurodollar
+Euromarket
+Europa
+Europe
+Europe's
+European
+European's
+europeanish
+Europeanization
+Europeanization's
+Europeanizations
+Europeanize
+Europeanized
+Europeanizes
+Europeanizing
+Europeans
+europium
+Eurovision
+Eurus
+Euryale
+Eurydice
+eurypterid
+Eurystheus
+eurythermal
+eurythmic
+eurythmics
+eurythmy
+eurytopic
+eurytopicity
+eurytropic
+eusebius
+eusporangiate
+Eustachian
+eustatic
+eutectic
+eutectoid
+Euterpe
+Euterpe's
+euthanasia
+euthanasic
+euthenics
+euthenist
+eutherian
+euthyroid
+eutrophic
+eutrophication
+eutrophy
+eux
+euxenite
+Euxine
+eV
+Eva
+evacuant
+evacuate
+evacuated
+evacuates
+evacuating
+evacuation
+evacuations
+evacuative
+evacuator
+evacuee
+evacuees
+evadable
+evade
+evaded
+evader
+evades
+evading
+evaginate
+evagination
+evaluable
+evaluate
+evaluated
+evaluates
+evaluating
+evaluation
+evaluations
+evaluative
+evaluator
+evaluator's
+evaluators
+evanesce
+evanesced
+evanescence
+evanescent
+evanesces
+evanescing
+evangel
+evangelic
+evangelical
+evangelicalism
+evangelically
+Evangeline
+evangeline
+evangelism
+evangelist
+evangelistic
+evangelistically
+evangelists
+evangelization
+evangelization's
+evangelizations
+evangelize
+evangelized
+evangelizer
+evangelizers
+evangelizes
+evangelizing
+evanish
+evanishment
+Evans
+Evanston
+Evansville
+evaporable
+evaporate
+evaporated
+evaporates
+evaporating
+evaporation
+evaporations
+evaporative
+evaporatively
+evaporativity
+evaporator
+evaporators
+evaporimeter
+evaporimeters
+evaporite
+evaporitic
+evapotranspiration
+evasion
+evasions
+evasive
+evasively
+evasiveness
+eve
+evection
+Evelyn
+even
+evened
+evener
+evenfall
+evenhanded
+evenhandedly
+evenhandedness
+evening
+evening's
+evenings
+evenly
+evenness
+evens
+Evensen
+evensong
+event
+event's
+eventful
+eventfully
+eventfulness
+eventide
+eventides
+eventless
+events
+eventual
+eventualities
+eventuality
+eventualize
+eventualizes
+eventually
+eventuate
+eventuated
+eventuates
+eventuating
+ever
+everblooming
+Eveready
+everest
+Everett
+Everglade
+Everglades
+evergreen
+Everhart
+Everhart's
+everlasting
+everlastingly
+everlastingness
+evermore
+eversible
+eversion
+eversions
+evert
+Everton
+Evertor
+every
+everybody
+everybody's
+everyday
+everydayness
+everyman
+everyone
+everyone's
+everyones
+everyplace
+everything
+everywhere
+eves
+Evesham
+evict
+evicted
+evictee
+evictees
+evicting
+eviction
+eviction's
+evictions
+evictor
+evictors
+evicts
+evidence
+evidenced
+evidences
+evidencing
+evident
+evidential
+evidentially
+evidentiary
+evidently
+evil
+evildoer
+evildoers
+evildoing
+eviler
+evilest
+evilly
+evilness
+evils
+evince
+evinced
+evinces
+evincible
+evincing
+eviscerate
+eviscerated
+eviscerates
+eviscerating
+evisceration
+evitable
+evite
+evocable
+evocate
+evocation
+evocations
+evocative
+evocatively
+evocativeness
+evocator
+evocators
+evoke
+evoked
+evokes
+evoking
+evolute
+evolute's
+evolutes
+evolution
+evolution's
+evolutionarily
+evolutionary
+evolutionism
+evolutionist
+evolutionists
+evolutionize
+evolutionizes
+evolutions
+evolvable
+evolve
+evolved
+evolvement
+evolves
+evolving
+Evonymus
+evulsion
+evulsions
+evzone
+ewe
+ewe's
+Ewen
+ewen
+ewer
+ewes
+Ewing
+ex
+exacerbate
+exacerbated
+exacerbates
+exacerbating
+exacerbation
+exacerbations
+exact
+exacta
+exactable
+exacted
+exacter
+exacting
+exactingly
+exactingness
+exaction
+exaction's
+exactions
+exactitude
+exactly
+exactness
+exactor
+exactors
+exacts
+exaggerate
+exaggerated
+exaggeratedly
+exaggeratedness
+exaggerates
+exaggerating
+exaggeration
+exaggerations
+exaggerative
+exaggeratively
+exaggerator
+exaggerators
+exagitates
+exalt
+exaltation
+exaltations
+exalted
+exaltedly
+exalter
+exalters
+exalting
+exalts
+exam
+exam's
+examen
+examinable
+examinant
+examinants
+examination
+examination's
+examinational
+examinations
+examinatorial
+examine
+examined
+examinee
+examinees
+examiner
+examiners
+examines
+examining
+example
+example's
+exampled
+examples
+exampling
+exams
+exanimate
+exanimated
+exanimates
+exanimating
+exanthema
+exarate
+exarch
+exarchate
+exasperate
+exasperated
+exasperatedly
+exasperates
+exasperating
+exasperatingly
+exasperation
+exasperations
+Excalibur
+excaudate
+excavate
+excavated
+excavates
+excavating
+excavation
+excavational
+excavations
+excavator
+excavators
+exceed
+exceeded
+exceeder
+exceeding
+exceedingly
+exceeds
+excel
+excelled
+excellence
+excellences
+excellency
+excellent
+excellently
+excelling
+excels
+excelsior
+except
+excepted
+excepting
+exception
+exception's
+exceptionability
+exceptionable
+exceptionably
+exceptional
+exceptionality
+exceptionally
+exceptionalness
+exceptions
+exceptive
+excepts
+excerpt
+excerpted
+excerpter
+excerption
+excerptions
+excerptor
+excerptors
+excerpts
+excess
+excesses
+excessive
+excessively
+excessiveness
+exchange
+exchangeability
+exchangeable
+exchanged
+exchangee
+exchangees
+exchanger
+exchangers
+exchanges
+exchanging
+exchequer
+exchequer's
+exchequers
+excide
+excided
+excides
+exciding
+excipient
+excisable
+excise
+excised
+exciseman
+excises
+excising
+excision
+excisions
+excitability
+excitable
+excitableness
+excitant
+excitants
+excitation
+excitation's
+excitations
+excitative
+excitatory
+excite
+excited
+excitedly
+excitement
+exciter
+excites
+exciting
+excitingly
+exciton
+excitor
+exclaim
+exclaimed
+exclaimer
+exclaimers
+exclaiming
+exclaims
+exclamation
+exclamation's
+exclamations
+exclamatory
+exclaustration
+exclave
+exclaves
+exclosure
+exclosures
+excludability
+excludable
+exclude
+excluded
+excluder
+excludes
+excludible
+excluding
+exclusion
+exclusionary
+exclusioner
+exclusioners
+exclusionist
+exclusionists
+exclusions
+exclusive
+exclusively
+exclusiveness
+exclusivity
+excogitate
+excogitation
+excogitative
+excommunicate
+excommunicated
+excommunicates
+excommunicating
+excommunication
+excommunicative
+excommunicator
+excoriate
+excoriated
+excoriates
+excoriating
+excoriation
+excoriations
+excrement
+excrement's
+excremental
+excrementitious
+excrements
+excrescence
+excrescences
+excrescency
+excrescent
+excrescently
+excreta
+excretal
+excrete
+excreted
+excreter
+excretes
+excreting
+excretion
+excretions
+excretory
+excruciate
+excruciated
+excruciates
+excruciating
+excruciatingly
+excruciation
+exculpate
+exculpated
+exculpates
+exculpating
+exculpation
+exculpations
+exculpatory
+excurrent
+excursion
+excursion's
+excursionist
+excursionists
+excursionize
+excursionizes
+excursions
+excursive
+excursively
+excursiveness
+excursus
+excursuses
+excusable
+excusableness
+excusably
+excusatory
+excuse
+excused
+excuser
+excuses
+excusing
+exeat
+exec
+execrable
+execrableness
+execrably
+execrate
+execrated
+execrates
+execrating
+execration
+execrative
+execrator
+execrators
+executability
+executable
+executable's
+executables
+executant
+execute
+executed
+executer
+executers
+executes
+executing
+execution
+executional
+executioner
+executions
+executive
+executive's
+executives
+executor
+executor's
+executorial
+executors
+executory
+executrices
+executrix
+executrixes
+exedra
+exegesis
+exegete
+exegetic
+exegetical
+exegetically
+exegetics
+exegetist
+exemplar
+exemplarily
+exemplariness
+exemplarity
+exemplars
+exemplary
+exemplification
+exemplified
+exemplifier
+exemplifiers
+exemplifies
+exemplify
+exemplifying
+exemplum
+exempt
+exempted
+exempting
+exemption
+exemptions
+exempts
+exenterate
+exenterated
+exenterates
+exenterating
+exenteration
+exenterations
+exequatur
+exequies
+exercisable
+exercise
+exercised
+exerciser
+exercisers
+exercises
+exercising
+exercitation
+exergonic
+exergue
+exert
+exerted
+exerting
+exertion
+exertion's
+exertions
+exerts
+Exeter
+exeunt
+exfoliate
+exfoliated
+exfoliates
+exfoliating
+exfoliation
+exfoliative
+exhalant
+exhalants
+exhalation
+exhalations
+exhale
+exhaled
+exhalent
+exhalents
+exhales
+exhaling
+exhaust
+exhausted
+exhaustedly
+exhauster
+exhaustibility
+exhaustible
+exhausting
+exhaustingly
+exhaustion
+exhaustive
+exhaustively
+exhaustiveness
+exhaustivity
+exhaustless
+exhaustlessly
+exhaustlessness
+exhausts
+exhibit
+exhibited
+exhibiting
+exhibition
+exhibition's
+exhibitioner
+exhibitionism
+exhibitionist
+exhibitionistic
+exhibitionize
+exhibitionizes
+exhibitions
+exhibitive
+exhibitor
+exhibitor's
+exhibitors
+exhibitory
+exhibits
+exhilarant
+exhilarate
+exhilarated
+exhilarates
+exhilarating
+exhilaratingly
+exhilaration
+exhilarative
+exhort
+exhortation
+exhortation's
+exhortations
+exhortative
+exhortatory
+exhorted
+exhorter
+exhorting
+exhorts
+exhumation
+exhumations
+exhume
+exhumed
+exhumer
+exhumes
+exhuming
+exigence
+exigencies
+exigency
+exigent
+exigently
+exigible
+exiguity
+exiguous
+exiguously
+exiguousness
+exile
+exiled
+exiles
+exilic
+exiling
+eximious
+exine
+exist
+existed
+existence
+existences
+existent
+existential
+existentialism
+existentialist
+existentialist's
+existentialistic
+existentialistically
+existentialists
+existentialize
+existentializes
+existentially
+existing
+exists
+exit
+exitance
+exited
+exiting
+exits
+Exmoor
+exo
+exobiological
+exobiologist
+exobiology
+exocarp
+exocentric
+exocrine
+exocyclic
+exoderm
+exodermis
+exodontia
+exodontics
+exodontist
+exodus
+exoergic
+exogamic
+exogamous
+exogamy
+exogenous
+exogenously
+Exon
+exonerate
+exonerated
+exonerates
+exonerating
+exoneration
+exonerative
+exonuclease
+exonym
+exopeptidase
+exophthalmic
+exophthalmos
+exoplasm
+exorable
+exorbitance
+exorbitances
+exorbitant
+exorbitantly
+exorciser
+exorcism
+exorcist
+exorcistic
+exorcistical
+exorcize
+exorcized
+exorcizes
+exorcizing
+exordial
+exordium
+exoskeleta
+exoskeletal
+exoskeleton
+exoskeletons
+exosmosis
+exosmotic
+exosphere
+exospheric
+exospore
+exostosis
+exosystem
+exosystems
+exoteric
+exotericaly
+exothermal
+exothermic
+exothermically
+exotic
+exotica
+exotically
+exoticism
+exoticness
+exotism
+exotoxin
+expand
+expandable
+expanded
+expander
+expander's
+expanders
+expanding
+expands
+expanse
+expansed
+expanses
+expansibility
+expansible
+expansile
+expansing
+expansion
+expansional
+expansionary
+expansionism
+expansionist
+expansionistic
+expansions
+expansive
+expansively
+expansiveness
+expansivity
+expatiate
+expatiated
+expatiates
+expatiating
+expatiation
+expatriate
+expatriated
+expatriates
+expatriating
+expatriation
+expecially
+expect
+expectable
+expectably
+expectance
+expectancies
+expectancy
+expectant
+expectantly
+expectation
+expectation's
+expectations
+expectative
+expected
+expectedly
+expectedness
+expecting
+expectingly
+expectorant
+expectorate
+expectoration
+expects
+expedience
+expediency
+expedient
+expediential
+expediently
+expedite
+expedited
+expediter
+expedites
+expediting
+expedition
+expedition's
+expeditionary
+expeditions
+expeditious
+expeditiously
+expeditiousness
+expeditor
+expel
+expellable
+expellant
+expelled
+expellee
+expeller
+expellers
+expelling
+expels
+expend
+expendability
+expendable
+expended
+expender
+expending
+expenditure
+expenditure's
+expenditures
+expends
+expense
+expensed
+expenses
+expensing
+expensive
+expensively
+expensiveness
+experience
+experienced
+experiences
+experiencing
+experiential
+experientialism
+experientially
+experiment
+experimental
+experimentalism
+experimentalist
+experimentalist's
+experimentalists
+experimentalize
+experimentalizes
+experimentally
+experimentation
+experimentation's
+experimentations
+experimented
+experimenter
+experimenters
+experimenting
+experimentize
+experimentizes
+experiments
+expert
+expertise
+expertism
+expertly
+expertness
+experts
+expiable
+expiate
+expiated
+expiates
+expiating
+expiation
+expiator
+expiatory
+expiration
+expiration's
+expirations
+expiratory
+expire
+expired
+expires
+expiring
+expiry
+explain
+explainable
+explained
+explainer
+explainers
+explaining
+explains
+explanation
+explanation's
+explanations
+explanative
+explanatively
+explanatorily
+explanatory
+explant
+explantation
+explants
+expletive
+expletives
+expletory
+explicable
+explicably
+explicate
+explicated
+explicates
+explicating
+explication
+explicative
+explicatively
+explicator
+explicatory
+explicit
+explicite
+explicitely
+explicitly
+explicitness
+explicity
+explictly
+explode
+exploded
+explodent
+exploder
+explodes
+exploding
+exploit
+exploitable
+exploitation
+exploitation's
+exploitations
+exploitative
+exploitatively
+exploited
+exploiter
+exploiters
+exploiting
+exploitive
+exploits
+exploration
+exploration's
+explorational
+explorations
+explorative
+exploratively
+exploratory
+explore
+explored
+explorer
+explorers
+explores
+exploring
+explosibility
+explosible
+explosion
+explosion's
+explosions
+explosive
+explosively
+explosiveness
+explosives
+expo
+exponent
+exponent's
+exponential
+exponentially
+exponentials
+exponentiate
+exponentiated
+exponentiates
+exponentiating
+exponentiation
+exponentiation's
+exponentiations
+exponents
+exponible
+export
+exportability
+exportable
+exportation
+exported
+exporter
+exporters
+exporting
+exports
+expos
+expose
+exposed
+exposer
+exposers
+exposes
+exposing
+exposit
+exposited
+exposition
+exposition's
+expositional
+expositions
+expositor
+expository
+expostulate
+expostulation
+expostulatory
+exposure
+exposure's
+exposures
+expound
+expounded
+expounder
+expounding
+expounds
+express
+expressage
+expressed
+expresser
+expresses
+expressibility
+expressible
+expressibly
+expressing
+expression
+expression's
+expressional
+expressionism
+expressionist
+expressionistic
+expressionistically
+expressionists
+expressionless
+expressionlessly
+expressionlessness
+expressions
+expressive
+expressively
+expressiveness
+expressivity
+expressly
+expresso
+expressway
+expressways
+expropriate
+expropriated
+expropriates
+expropriating
+expropriation
+expropriations
+expropriator
+expropriators
+expulsion
+expulsive
+expunction
+expunge
+expunged
+expunger
+expunges
+expunging
+expurgate
+expurgated
+expurgates
+expurgating
+expurgation
+expurgator
+expurgatorial
+expurgatory
+exquisite
+exquisitely
+exquisiteness
+exsanguinate
+exsanguination
+exsanguine
+exscind
+exsect
+exsert
+exserted
+exsertile
+exsertion
+exsertions
+exsiccate
+exsiccation
+exstipulate
+exstrophy
+ext
+extant
+extemporal
+extemporally
+extemporaneity
+extemporaneous
+extemporaneously
+extemporaneousness
+extemporarily
+extemporary
+extempore
+extemporization
+extemporization's
+extemporizations
+extemporize
+extemporized
+extemporizer
+extemporizers
+extemporizes
+extemporizing
+extend
+extendable
+extended
+extendedly
+extendedness
+extender
+extendibility
+extendible
+extendibles
+extending
+extends
+extensibility
+extensible
+extensile
+extension
+extension's
+extensional
+extensionality
+extensionally
+extensions
+extensity
+extensive
+extensively
+extensiveness
+extensometer
+extensometer's
+extensometers
+extensor
+extent
+extent's
+extention
+extentions
+extents
+extenuate
+extenuated
+extenuating
+extenuation
+extenuator
+extenuatory
+exterior
+exterior's
+exteriority
+exteriorization
+exteriorization's
+exteriorizations
+exteriorize
+exteriorized
+exteriorizes
+exteriorizing
+exteriorly
+exteriors
+exterminate
+exterminated
+exterminates
+exterminating
+extermination
+exterminations
+exterminator
+exterminator's
+exterminators
+exterminatory
+extermine
+extern
+external
+externalism
+externalities
+externality
+externalization
+externalization's
+externalizations
+externalize
+externalized
+externalizes
+externalizing
+externally
+externals
+externship
+exteroceptive
+exteroceptor
+exterritorial
+exterritoriality
+extinct
+extinction
+extinctive
+extine
+extinguish
+extinguishable
+extinguishant
+extinguished
+extinguisher
+extinguishers
+extinguishes
+extinguishing
+extinguishment
+extirpate
+extirpated
+extirpating
+extirpation
+extirpative
+extol
+extoll
+extolled
+extoller
+extolling
+extolment
+extols
+extort
+extorted
+extorter
+extorting
+extortion
+extortionary
+extortionate
+extortionately
+extortioner
+extortionist
+extortionist's
+extortionists
+extortive
+extorts
+extra
+extracanonical
+extracellular
+extracellularly
+extrachromosomal
+extracorporeal
+extracorporeally
+extracranial
+extract
+extractability
+extractable
+extracted
+extractible
+extracting
+extraction
+extraction's
+extractions
+extractive
+extractively
+extractor
+extractor's
+extractors
+extracts
+extracurricular
+extraditable
+extradite
+extradites
+extradition
+extrados
+extradoses
+extragalactic
+extrajudicial
+extrajudicially
+extralegal
+extralegally
+extralimital
+extralinguistic
+extralinguistically
+extrality
+extramarital
+extramundane
+extramural
+extramurally
+extraneous
+extraneously
+extraneousness
+extranuclear
+extraordinarily
+extraordinariness
+extraordinary
+extrapolate
+extrapolated
+extrapolates
+extrapolating
+extrapolation
+extrapolations
+extrapolative
+extrapolator
+extraposition
+extras
+extrasensory
+extrasystole
+extrasystolic
+extraterrestrial
+extraterritorial
+extraterritoriality
+extrauterine
+extravagance
+extravagancy
+extravagant
+extravagantly
+extravaganza
+extravaganzas
+extravagate
+extravasate
+extravasation
+extravascular
+extravehicular
+extraversion
+extraversive
+extravert
+extraverted
+extrema
+extremadura
+extremal
+extreme
+extremed
+extremely
+extremeness
+extremer
+extremes
+extremest
+extremis
+extremism
+extremist
+extremist's
+extremists
+extremities
+extremity
+extremity's
+extremum
+extricable
+extricate
+extricated
+extricates
+extricating
+extrication
+extrinsic
+extrinsically
+extrorse
+extrorsely
+extroversion
+extrovert
+extroverted
+extroverts
+extrudability
+extrudable
+extrude
+extruded
+extruder
+extrudes
+extruding
+extrusion
+extrusive
+exuberance
+exuberant
+exuberantly
+exuberate
+exudate
+exudation
+exudative
+exude
+exuded
+exudes
+exuding
+exult
+exultance
+exultancy
+exultant
+exultantly
+exultation
+exulted
+exulting
+exultingly
+exults
+exurban
+exurbanite
+exurbia
+exuviae
+exuviate
+exuviation
+Exxon
+eyas
+eye
+eyeball
+eyeballs
+eyebath
+eyeblack
+eyebolt
+eyebright
+eyebrow
+eyebrow's
+eyebrows
+eyecup
+eyed
+eyedness
+eyedropper
+eyedropperful
+eyeful
+eyeglass
+eyeglasses
+eyehole
+eyehook
+eyeing
+eyelash
+eyelashes
+eyeless
+eyelet
+eyeleteer
+eyelets
+eyelid
+eyelid's
+eyelids
+eyelike
+eyeliner
+eyepatch
+eyepiece
+eyepiece's
+eyepieces
+eyepoint
+eyepopper
+eyer
+eyers
+eyes
+eyeshade
+eyeshot
+eyesight
+eyesore
+eyesore's
+eyesores
+eyespot
+eyestalk
+eyestrain
+eyestrings
+eyeteeth
+eyetie
+eyetooth
+eyewash
+eyewink
+eyewitness
+eyewitness's
+eyewitnesses
+eying
+eyot
+eyots
+eyra
+eyre
+eyrie
+eyrir
+eysenck
+Ezekiel
+Ezra
+f's
+FAA
+fab
+fabaceous
+Faber
+Faber's
+Fabian
+Fabian's
+Fabianism
+fabians
+fabius
+fable
+fabled
+fabler
+fables
+fabliau
+fabling
+fabre
+fabric
+fabric's
+fabricant
+fabricate
+fabricated
+fabricates
+fabricating
+fabrication
+fabrications
+fabricator
+fabricators
+fabrics
+Fabrikoid
+fabular
+fabulist
+fabulous
+fabulously
+fabulousness
+facade
+facaded
+facades
+facading
+face
+facebar
+faced
+facedown
+faceless
+facelessness
+facement
+facepiece
+facepieces
+faceplate
+facer
+faces
+facet
+faceted
+facetiae
+faceting
+facetious
+facetiously
+facetiousness
+facets
+facetted
+faceup
+facia
+facial
+facially
+facies
+facile
+facilely
+facileness
+facilitate
+facilitated
+facilitates
+facilitating
+facilitation
+facilitative
+facilitator
+facilitators
+facilitatory
+facilities
+facility
+facility's
+facilties
+facing
+facings
+facsimile
+facsimile's
+facsimiled
+facsimiles
+facsimiling
+facsimilize
+facsimilizes
+fact
+fact's
+Factice
+facticity
+faction
+faction's
+factional
+factionalism
+factionally
+factions
+factious
+factiously
+factiousness
+factitious
+factitiously
+factitiousness
+factitive
+factitively
+facto
+factor
+factorable
+factorage
+factored
+factorial
+factories
+factoring
+factorings
+factorization
+factorization's
+factorizations
+factorize
+factorized
+factorizes
+factorizing
+factors
+factorship
+factory
+factory's
+factotum
+facts
+factual
+factualism
+factualist
+factualists
+factuality
+factually
+factualness
+facture
+factures
+facula
+faculae
+facultative
+facultatively
+faculties
+faculty
+faculty's
+fad
+fadden
+faddish
+faddishness
+faddism
+faddist
+faddists
+fade
+fadeaway
+faded
+fadedly
+fadeless
+fadelessly
+fadeout
+fader
+faders
+fades
+fadge
+fading
+fads
+faecal
+faeces
+faenza
+faerie
+faeroes
+faeroese
+faery
+faff
+Fafnir
+Fafnir's
+fag
+fagaceous
+fagging
+faggot
+faggoting
+faggots
+Fagin
+fags
+Fahey
+Fahey's
+fahlband
+Fahrenheit
+Fahrenheits
+faial
+faience
+fail
+failed
+failing
+failingly
+failings
+faille
+fails
+failsafe
+failsoft
+failure
+failure's
+failures
+fain
+faint
+fainted
+fainter
+faintest
+fainthearted
+faintheartedly
+faintheartedness
+fainting
+faintish
+faintishness
+faintly
+faintness
+faints
+fair
+fairbanks
+Fairbanks
+Fairchild
+faired
+fairer
+fairest
+Fairfax
+Fairfield
+fairgoer
+fairgoers
+fairground
+fairgrounds
+fairies
+fairing
+fairish
+fairishly
+fairlead
+fairleader
+fairless
+fairly
+Fairmont
+fairness
+Fairport
+fairs
+Fairview
+fairview
+fairway
+fairways
+fairweather
+fairy
+fairy's
+fairyfloss
+fairyland
+fairylike
+Faisal
+faith
+faithful
+faithfully
+faithfulness
+faithfuls
+faithless
+faithlessly
+faithlessness
+faiths
+faitour
+faiyum
+Faizabad
+fake
+faked
+faker
+fakery
+fakes
+faking
+fakir
+falafel
+Falange
+falbala
+falcate
+falcated
+falchion
+falciform
+falcon
+falconer
+falconet
+falconiform
+falconine
+falconry
+falcons
+falderal
+faldstool
+falerii
+Faliscan
+falk
+Falk
+Falkirk
+Falkland
+Falklands
+Falkner
+fall
+Falla
+fallacies
+fallacious
+fallaciously
+fallaciousness
+fallacy
+fallacy's
+fallal
+fallback
+fallen
+faller
+fallfish
+fallibility
+fallible
+fallibly
+falling
+falloff
+Fallopian
+fallout
+fallouts
+fallow
+fallowness
+falls
+Falmouth
+Falmouth's
+false
+falsehood
+falsehood's
+falsehoods
+falsely
+falseness
+falser
+falsest
+falseties
+falsetto
+falsettos
+falsety
+falsework
+falsies
+falsification
+falsified
+falsifier
+falsifies
+falsify
+falsifying
+falsity
+Falstaff
+Falstaffian
+falster
+faltboat
+falter
+faltered
+falterer
+faltering
+falteringly
+falters
+falun
+famagusta
+fame
+famed
+fames
+familial
+familiar
+familiarities
+familiarity
+familiarization
+familiarization's
+familiarizations
+familiarize
+familiarized
+familiarizer
+familiarizers
+familiarizes
+familiarizing
+familiarizingly
+familiarly
+familiarness
+familiars
+families
+familism
+familist
+family
+family's
+famine
+famine's
+famines
+faming
+famish
+famished
+famishes
+famishing
+famishment
+famous
+famously
+famousness
+famulus
+fan
+fan's
+fanagalo
+fanatic
+fanatic's
+fanatical
+fanatically
+fanaticalness
+fanaticism
+fanaticize
+fanaticized
+fanaticizes
+fanaticizing
+fanatics
+fancied
+fancier
+fancier's
+fanciers
+fancies
+fanciest
+fanciful
+fancifully
+fancifulness
+fancily
+fanciness
+fancy
+fancying
+fancywork
+fandangle
+fandango
+fane
+fanfani
+fanfare
+fanfaronade
+fanfold
+fang
+fang's
+fanged
+fangio
+fangled
+fango
+fangs
+fanion
+fankle
+fanlight
+fanlike
+fanned
+fanner
+Fannies
+fanning
+Fanny
+fanon
+fanout
+fans
+fantail
+fantasia
+fantasied
+fantasies
+fantasist
+fantasize
+fantasized
+fantasizer
+fantasizes
+fantasizing
+fantasm
+fantast
+fantastic
+fantastical
+fantasticality
+fantastically
+fantasticalness
+fantasticate
+fantasticated
+fantasticates
+fantasticating
+fantastication
+fantasy
+fantasy's
+Fanti
+fantoccini
+fantod
+fantom
+fanwise
+FAQ
+FAQ's
+FAQ'S
+faqir
+FAQs
+far
+farad
+Faraday
+faradic
+faradism
+faradization
+faradization's
+faradizations
+faradize
+faradized
+faradizer
+faradizers
+faradizes
+faradizing
+farandole
+faraway
+Farber
+farce
+farce's
+farces
+farceur
+farci
+farcical
+farcicality
+farcically
+farcing
+farcy
+fard
+fardel
+fare
+fared
+Fareham
+farer
+fares
+farewell
+farewells
+farfetched
+farfetchedness
+Fargo
+farina
+farinaceous
+faring
+farinose
+Farkas
+farl
+Farley
+farm
+farmed
+farmer
+farmer's
+farmers
+farmhand
+farmhands
+farmhouse
+farmhouse's
+farmhouses
+farming
+Farmington
+farmland
+farmlands
+farms
+farmstead
+farmsteading
+farmworker
+farmworkers
+farmyard
+farmyard's
+farmyards
+Farnborough
+Farnese
+Farnesol
+Farnham
+Farnsworth
+Farnsworth's
+faro
+Faroe
+Faroes
+Farouk
+Farquhar
+Farrago
+Farrell
+farrier
+farriery
+farrow
+farseeing
+farside
+farsighted
+farsightedly
+farsightedness
+fart
+farther
+farthermost
+farthest
+farthing
+Farthingale
+Fartlek
+Faruk
+fasces
+fascia
+fascial
+fasciate
+fasciated
+fasciation
+fascicle
+fascicled
+fascicles
+fascicular
+fascicularly
+fasciculate
+fasciculated
+fasciculation
+fasciculations
+fascicule
+fasciculus
+fascinate
+fascinated
+fascinates
+fascinating
+fascinatingly
+fascination
+fascinations
+fascinator
+fascinators
+fascine
+fascism
+fascist
+fascistic
+fascistically
+fascisticization
+fascisticization's
+fascisticizations
+fascisticize
+fascisticizes
+fascistization
+fascistization's
+fascistizations
+fascistize
+fascistized
+fascistizes
+fascistizing
+fascists
+fash
+fashion
+fashionabilities
+fashionability
+fashionable
+fashionableness
+fashionably
+fashioned
+fashioner
+fashioners
+fashioning
+fashionize
+fashionizes
+fashionmonger
+fashions
+fashoda
+Fassbaender
+Fassbinder
+fast
+fastback
+fastball
+fastball's
+fastballs
+fasted
+fasten
+fastened
+fastener
+fasteners
+fastening
+fastenings
+fastens
+faster
+fastest
+fastidious
+fastidiously
+fastidiousness
+fastigiate
+fasting
+fastness
+fasts
+fastuous
+fastuously
+fat
+fatah
+fatal
+fatalism
+fatalist
+fatalistic
+fatalistically
+fatalists
+fatalities
+fatality
+fatality's
+fatalize
+fatalizes
+fatally
+fatals
+fatback
+fate
+fated
+fateful
+fatefully
+fatefulness
+fates
+fathead
+fatheaded
+fatheadedness
+father
+father's
+fathered
+fatherhood
+fathering
+fatherland
+fatherless
+fatherlike
+fatherliness
+fatherly
+fathers
+fathom
+fathomable
+fathomed
+Fathometer
+fathoming
+fathomless
+fathomlessly
+fathomlessness
+fathoms
+fatidic
+fatigability
+fatigable
+fatigue
+fatigued
+fatigues
+fatiguing
+fatiguingly
+Fatima
+Fatimid
+fating
+fatling
+fatly
+fatness
+fats
+Fatshan
+fatso
+fatted
+fatten
+fattened
+fattener
+fatteners
+fattening
+fattens
+fatter
+fattest
+fattier
+fatties
+fattiness
+fatting
+fattish
+fatty
+fatuity
+fatuous
+fatuously
+fatuousness
+Faubourg
+faucal
+fauces
+faucet
+faucets
+faugh
+Faulkner
+Faulknerian
+faulknerian
+fault
+faulted
+faultfinder
+faultfinding
+faultier
+faultily
+faultiness
+faulting
+faultless
+faultlessly
+faultlessness
+faults
+faulty
+faun
+fauna
+faunal
+faunally
+faunistic
+faunistically
+fauntleroy
+Fauntleroy
+faunus
+Faure
+Faust
+Faustian
+Faustus
+fauteuil
+fauve
+fauvism
+fauvist
+faux
+faveolate
+favonian
+favor
+favor's
+favorable
+favorable's
+favorableness
+favorables
+favorably
+favored
+favored's
+favoredly
+favoredness
+favoreds
+favorer
+favorer's
+favorers
+favoring
+favoring's
+favoringly
+favorings
+favorite
+favorite's
+favorites
+favoritism
+favoritism's
+favoritisms
+favorless
+favorlesses
+favors
+favrile
+favus
+fawkes
+Fawkes
+fawn
+fawned
+fawner
+fawning
+fawningly
+fawns
+fawny
+fax
+fax's
+faxes
+fay
+Fayal
+fayalite
+Fayette
+Fayette's
+Fayetteville
+fayum
+faze
+fazed
+fazes
+fazing
+FBI
+FCC
+FDA
+feal
+fealty
+fear
+feared
+fearer
+fearful
+fearfully
+fearfulness
+fearing
+fearless
+fearlessly
+fearlessness
+fearnought
+fears
+fearsome
+fearsomely
+fearsomeness
+feasibility
+feasible
+feasibleness
+feasibly
+feast
+feasted
+feaster
+feasting
+feasts
+feat
+feat's
+feather
+featherbed
+featherbedding
+featherbrain
+featherbrained
+feathered
+featheredge
+featherer
+featherers
+featherhead
+featherheaded
+feathering
+featherless
+featherman
+Featherman
+feathers
+featherstitch
+feathertop
+featherweight
+feathery
+feating
+featly
+feats
+feature
+featured
+featureless
+features
+featuring
+feaze
+Feb
+febricity
+febrifacient
+febrific
+febrifuge
+febrile
+Februaries
+February
+February's
+fecal
+feces
+fechner
+feck
+feckless
+fecklessly
+fecklessness
+feckly
+fecula
+feculence
+feculent
+fecund
+fecundability
+fecundate
+fecundated
+fecundates
+fecundating
+fecundation
+fecundations
+fecundity
+fecundize
+fecundizes
+fed
+fedayee
+federal
+federalism
+federalist
+federalists
+federalization
+federalization's
+federalizations
+federalize
+federalized
+federalizes
+federalizing
+federally
+federals
+federate
+federated
+federates
+federating
+federation
+federations
+federative
+federatively
+fedora
+Fedoseyev
+feds
+fee
+feeble
+feebleminded
+feeblemindedly
+feeblemindedness
+feebleness
+feebler
+feeblest
+feebly
+feed
+feedback
+feedbacks
+feedbag
+feeder
+feeders
+feeding
+feedings
+feedlot
+feeds
+feedstock
+feedstuff
+feeing
+feel
+feeler
+feelers
+feeling
+feelingly
+feelingness
+feelings
+feels
+Feeney
+Feeney's
+fees
+feet
+feetfirst
+feeze
+Feigin
+feign
+feigned
+feigner
+feigning
+feigns
+feininger
+feint
+feinted
+feinting
+feints
+Feisal
+feist
+feistier
+feisty
+felafel
+Felder
+Feldman
+feldspar
+feldspathic
+Felice
+Felicia
+felicific
+felicitate
+felicitated
+felicitates
+felicitating
+felicitation
+felicitator
+felicities
+felicitous
+felicitously
+felicitousness
+felicity
+feline
+felinely
+felines
+felinity
+Felix
+fell
+fella
+fellable
+fellah
+fellas
+fellatio
+fellation
+fellations
+felled
+feller
+fellers
+felling
+fellini
+Fellini
+fellmonger
+fellness
+felloe
+fellow
+fellow's
+fellowly
+fellowman
+fellows
+fellowship
+fellowship's
+fellowships
+fells
+felo
+felon
+felones
+felonious
+feloniously
+feloniousness
+felonry
+felons
+felony
+felsite
+felsitic
+felspar
+felt
+felted
+felting
+felts
+felucca
+female
+female's
+femaleness
+females
+femalize
+femalizes
+Feme
+feminine
+femininely
+feminineness
+femininity
+feminism
+feminist
+feminist's
+feministic
+feminists
+feminity
+feminization
+feminizations
+feminize
+feminized
+feminizes
+feminizing
+femme
+femmes
+femoral
+femur
+femur's
+femurs
+fen
+fence
+fenced
+fenceless
+fencelessness
+fencepost
+fencer
+fencers
+fences
+fencible
+fencing
+fend
+fender
+fenders
+fenestella
+fenestra
+fenestral
+fenestrate
+fenestrated
+fenestrates
+fenestration
+Fenian
+Fenice
+fennec
+fennel
+fennelflower
+fenny
+Fenrir
+Fenton
+Fenton's
+fenugreek
+Fenwick
+feoff
+feoffee
+feoffment
+feral
+ferbam
+Ferber
+Ferber's
+Ferdinand
+ferdinando
+Ferdinando
+fere
+feretory
+fergana
+Fergus
+Ferguson
+Ferguson's
+feria
+ferial
+ferine
+fering
+ferity
+fermanagh
+Fermat
+Fermat's
+ferment
+fermentable
+fermentation
+fermentation's
+fermentations
+fermentative
+fermented
+fermenter
+fermenting
+ferments
+Fermi
+fermion
+fermion's
+fermions
+fermium
+fern
+fern's
+fernandel
+Fernandi
+Fernando
+fernery
+fernlike
+ferns
+ferny
+ferocious
+ferociously
+ferociousness
+ferocity
+Ferrara
+ferrari
+ferrate
+Ferreira
+ferreled
+ferreling
+ferreous
+Ferrer
+Ferrer's
+ferret
+ferreted
+ferreter
+ferreting
+ferrets
+ferrety
+ferriage
+ferric
+ferricyanic
+ferricyanide
+ferried
+ferries
+ferriferous
+ferrimagnet
+ferrimagnetic
+ferrimagnetically
+ferrimagnetism
+ferris
+ferrite
+ferritic
+ferritin
+ferritization
+ferritization's
+ferritizations
+ferro
+ferrocene
+ferrochromium
+ferroconcrete
+ferrocyanic
+ferrocyanide
+ferroelectric
+ferrofluid
+ferrol
+ferromagnesian
+ferromagnet
+ferromagnetic
+ferromagnetism
+ferromanganese
+ferrosilicon
+ferrotype
+ferrous
+ferruginous
+ferrule
+ferry
+ferryboat
+ferrying
+ferryman
+fertile
+fertilely
+fertileness
+fertilities
+fertility
+fertilizable
+fertilizable's
+fertilizables
+fertilization
+fertilization's
+fertilizational
+fertilizational's
+fertilizationals
+fertilizations
+fertilize
+fertilized
+fertilizer
+fertilizers
+fertilizes
+fertilizing
+ferula
+ferule
+fervency
+fervent
+fervently
+fervid
+fervidly
+fervidness
+fervor
+fervor's
+fervorless
+fervorlesses
+fervors
+Fescennine
+fescue
+Fess
+fess
+fesse
+fest
+festal
+fester
+festered
+festering
+festers
+festinate
+festinately
+festination
+festival
+festival's
+festivals
+festive
+festively
+festiveness
+festivities
+festivity
+festoon
+festoonery
+festoons
+festschrift
+feta
+fetal
+fetalization
+fetalization's
+fetalizations
+fetation
+fetch
+fetched
+fetcher
+fetches
+fetching
+fetchingly
+fete
+feted
+feterita
+fetes
+fetial
+feticide
+fetid
+fetidly
+fetidness
+fetiparous
+fetish
+fetishes
+fetishism
+fetishist
+fetishistic
+fetishization
+fetishization's
+fetishizations
+fetishize
+fetishized
+fetishizes
+fetishizing
+fetlock
+fetlocks
+fetologist
+fetology
+fetor
+fetter
+fettered
+fettering
+fetterlock
+fetters
+fettle
+fettled
+fettles
+fettling
+fettuccine
+fetus
+fetus's
+fetuses
+Feuchtwanger
+feud
+feud's
+feudal
+feudalism
+feudalist
+feudalistic
+feudality
+feudalizable
+feudalizable's
+feudalizables
+feudalization
+feudalization's
+feudalizations
+feudalize
+feudalized
+feudalizes
+feudalizing
+feudally
+feudatory
+feudist
+feuds
+Feuerbach
+Feuilleton
+fever
+fevered
+feverfew
+fevering
+feverish
+feverishly
+feverishness
+feverous
+feverously
+fevers
+feverwort
+few
+fewer
+fewest
+fewness
+fews
+fey
+feydeau
+feyness
+fez
+fezes
+Fezzan
+fezzes
+fiacre
+fiance
+fiancee
+Fianna
+fiasco
+fiat
+fiats
+fib
+fibber
+fibbing
+fiber
+fiber's
+fiberboard
+fibered
+Fiberglas
+fiberglass
+fiberization
+fiberize
+fiberized
+fiberizer
+fiberizer's
+fiberizers
+fiberizes
+fiberizing
+fiberless
+fiberlesses
+fibers
+Fibonacci
+fibration
+fibrefill
+fibriallating
+fibriform
+fibril
+fibrillar
+fibrillate
+fibrillated
+fibrillates
+fibrillation
+fibrilliform
+fibrillose
+fibrils
+fibrin
+fibrinogen
+fibrinolysin
+fibrinolysis
+fibrinous
+fibrize
+fibrizer
+fibrizers
+fibrizes
+fibro
+fibroblast
+fibrocement
+fibroid
+fibroin
+fibroma
+fibronectin
+fibrosis
+fibrositis
+fibrous
+fibrously
+fibrousness
+fibrovascular
+fibula
+fibular
+fiche
+fichte
+fichu
+ficino
+fickle
+fickleness
+ficticious
+fictile
+fiction
+fiction's
+fictional
+fictionalization
+fictionalize
+fictionalized
+fictionalizes
+fictionalizing
+fictionally
+fictioneer
+fictioneering
+fictionist
+fictionization
+fictionization's
+fictionizations
+fictionize
+fictionizes
+fictions
+fictitious
+fictitiously
+fictitiousness
+fictive
+fictively
+ficus
+fid
+fiddle
+fiddleback
+fiddled
+fiddlehead
+fiddler
+fiddles
+fiddlestick
+fiddlesticks
+fiddlewood
+fiddling
+fide
+fideicommissary
+fideicommissum
+fideism
+fideist
+fideistic
+fidel
+Fidel
+fidelism
+fidelity
+fidge
+fidget
+fidgeted
+fidgetiness
+fidgeting
+fidgets
+fidgety
+fidging
+fiducial
+fiducially
+fiduciary
+fidus
+fie
+fief
+fiefdom
+field
+fielded
+fielder
+fielders
+fieldfare
+fielding
+fieldmouse
+fieldpiece
+fields
+fieldsman
+fieldstone
+fieldstrip
+fieldwork
+fieldworker
+fieldworkers
+fiend
+fiendish
+fiendishly
+fiendishness
+fiends
+fierce
+fiercely
+fierceness
+fiercer
+fiercest
+fieri
+fierily
+fieriness
+fiery
+fiesole
+fiesta
+fifa
+fife
+FIFO
+fifteen
+fifteens
+fifteenth
+fifth
+fifthly
+fifths
+fifties
+fiftieth
+fifty
+fiftyfold
+fig
+fig's
+figaro
+Figaro
+fight
+fighter
+fighters
+fighting
+fights
+figment
+figs
+figuline
+figurable
+figural
+figurant
+figurate
+figuration
+figurations
+figurative
+figuratively
+figurativeness
+figure
+figured
+figurehead
+figurer
+figurers
+figures
+figurine
+figurines
+figuring
+figurings
+figurize
+figurizes
+figwort
+Fiji
+Fiji's
+Fijian
+Fijian's
+Fijians
+filable
+filament
+filament's
+filamentary
+filamentous
+filaments
+filar
+filaria
+filarial
+filariasis
+filature
+filbert
+filberts
+filch
+filched
+filches
+file
+file's
+filecard
+filed
+filefish
+filename
+filename's
+filenames
+filer
+filers
+files
+filespace
+filestore
+filet
+filets
+filial
+filially
+filiate
+filiation
+filibuster
+filibustered
+filibusterer
+filibustering
+filibusters
+filicide
+filiform
+filigree
+filigreed
+filigreeing
+filing
+filings
+Filipino
+Filipinos
+filippo
+Filippo
+fill
+fillable
+fillagree
+fille
+filled
+filler
+fillers
+filles
+fillet
+filleted
+filleting
+fillets
+fillies
+filling
+fillings
+fillip
+fillips
+fillment
+Fillmore
+fillmore
+fills
+filly
+film
+filmcard
+filmdom
+filmed
+filmic
+filmically
+filmier
+filmily
+filminess
+filming
+filmize
+filmizes
+filmmake
+filmmaker
+filmmakers
+filmmaking
+filmography
+films
+filmset
+filmsetting
+filmstrip
+filmstrips
+filmy
+filoplume
+filose
+filoselle
+fils
+filter
+filter's
+filterability
+filterable
+filtered
+filterer
+filtering
+filters
+filth
+filthier
+filthiest
+filthily
+filthiness
+filthy
+filtrable
+filtrate
+filtrated
+filtrates
+filtrating
+filtration
+filtration's
+filum
+fimble
+fimbria
+fimbrial
+fimbriate
+fimbriated
+fimbriates
+fimbriation
+fin
+fin's
+finable
+finagle
+finagled
+finagler
+finagles
+finagling
+final
+finale
+finale's
+finales
+finalism
+finalist
+finalists
+finality
+finalization
+finalizations
+finalize
+finalized
+finalizes
+finalizing
+finally
+finals
+finance
+financed
+finances
+financial
+financially
+financier
+financier's
+financiers
+financing
+finback
+finch
+finchley
+find
+findable
+finder
+finders
+finding
+findings
+finds
+fine
+fineable
+fined
+finely
+fineness
+finer
+finery
+fines
+finespun
+finesse
+finessed
+finessing
+finest
+finfoot
+finger
+fingerboard
+fingerbreadth
+fingered
+fingerer
+fingering
+fingerings
+fingerlike
+fingerling
+fingermark
+fingermarked
+fingermarking
+fingermarks
+fingernail
+fingernails
+fingerpost
+fingerprint
+fingerprinted
+fingerprinting
+fingerprints
+fingers
+fingerstall
+fingerstalls
+fingertip
+fingertips
+fingo
+finial
+finical
+finically
+finicalness
+finickiness
+finicking
+finicky
+fining
+finis
+finish
+finished
+finisher
+finishers
+finishes
+finishing
+finishings
+finisterre
+finitary
+finite
+finitely
+finiteness
+finites
+finitude
+fink
+Finland
+Finley
+Finley's
+finlike
+Finn
+finnan
+finned
+Finnegan
+finner
+finney
+Finnic
+finning
+Finnish
+finnmark
+Finns
+finny
+fino
+finochio
+fins
+Finsen
+Finsteraarhorn
+fiord
+Fiorello
+fiori
+Fiori
+fiorin
+fipple
+fir
+Firbank
+firdausi
+fire
+firearm
+firearm's
+firearms
+fireback
+fireball
+fireballs
+firebird
+fireboat
+firebomb
+firebox
+firebrand
+firebrat
+firebreak
+firebreaks
+firebrick
+firebug
+fireclay
+firecracker
+firecrackers
+firecrest
+fired
+firedamp
+firedog
+firedrake
+firefight
+firefighters
+firefighting
+firefights
+fireflies
+firefly
+firefly's
+fireguard
+firehouse
+firehouses
+fireless
+firelight
+firelighting
+firelock
+fireman
+firemen
+firenze
+firepan
+fireplace
+fireplace's
+fireplaces
+fireplug
+fireplugs
+firepower
+fireproof
+firer
+fireroom
+firers
+fires
+fireside
+Firestone
+firestorm
+firethorn
+firetrap
+firewall
+firewarden
+firewater
+firewood
+firework
+fireworks
+firing
+firings
+firkin
+firm
+firm's
+firma
+firmament
+firmamental
+firmed
+firmer
+firmest
+firming
+firmly
+firmness
+firms
+firmware
+firmwares
+firry
+first
+firstborn
+firstfruits
+firsthand
+firstling
+firstlings
+firstly
+firsts
+firth
+fisc
+fiscal
+fiscalization
+fiscalization's
+fiscalizations
+fiscalize
+fiscalizes
+fiscally
+fiscals
+Fischbein
+Fischbein's
+Fischer
+fish
+fishability
+fishable
+fishbolt
+fishbowl
+fished
+fisher
+fisheries
+fisherman
+fisherman's
+fishermen
+fishermen's
+fishers
+fishery
+fishes
+fishfinger
+fishgig
+fishhook
+fishier
+fishing
+Fishkill
+fishkill
+fishmeal
+fishmonger
+fishmongers
+fishnet
+fishplate
+fishplates
+fishpond
+fishskin
+fishtail
+fishway
+fishwife
+fishy
+fishyback
+Fisk
+Fiske
+Fiske's
+fissile
+fissility
+fission
+fissionability
+fissionable
+fissional
+fissioned
+fissioning
+fissions
+fissipalmate
+fissiparous
+fissiparously
+fissiparousness
+fissiped
+fissirostral
+fissure
+fissured
+fissures
+fissuring
+fist
+fisted
+fistfight
+fistful
+fistic
+fisticuff
+fisticuffs
+fistmele
+fistnote
+fists
+fistula
+fistulous
+fit
+Fitch
+Fitchburg
+fitchew
+fitful
+fitfully
+fitfulness
+fitly
+fitment
+fitness
+fits
+fitted
+fitter
+fitter's
+fitters
+fittest
+fitting
+fittingly
+fittingness
+fittings
+fittipaldi
+Fitzgerald
+Fitzpatrick
+Fitzroy
+fitzsimmons
+fiume
+five
+fivefold
+fivepenny
+fivepins
+fiver
+fives
+fix
+fixable
+fixate
+fixated
+fixates
+fixating
+fixation
+fixations
+fixative
+fixed
+fixedly
+fixedness
+fixer
+fixers
+fixes
+fixing
+fixings
+fixity
+fixture
+fixture's
+fixtures
+fixups
+Fizeau
+Fizeau's
+fizgig
+fizz
+fizzer
+fizzle
+fizzled
+fizzles
+fizzling
+fizzy
+fjord
+fjords
+FL
+flab
+flabbergast
+flabbergasted
+flabbergasting
+flabbergastingly
+flabbergasts
+flabbier
+flabbily
+flabbiness
+flabby
+flabellate
+flabellum
+flaccid
+flaccidity
+flaccidly
+flack
+flacon
+flag
+flag's
+flagellant
+flagellantism
+flagellants
+flagellar
+flagellate
+flagellated
+flagellates
+flagellating
+flagellation
+flagelliform
+flagellum
+flageolet
+flagged
+flagger
+flagging
+flaggingly
+flaggy
+flagitious
+flagitiously
+flagitiousness
+Flagler
+Flagler's
+flagman
+flagon
+flagpole
+flagpoles
+flagrance
+flagrancies
+flagrancy
+flagrant
+flagrante
+flagrantly
+flags
+flagship
+flagship's
+flagships
+flagstad
+flagstaff
+flagstone
+flail
+flailed
+flailing
+flails
+flair
+flak
+flake
+flaked
+flaker
+flakes
+flakier
+flakiness
+flaking
+flaky
+flam
+flamb
+flambeau
+flamborough
+flamboyance
+flamboyancy
+flamboyant
+flamboyantize
+flamboyantizes
+flamboyantly
+flame
+flamed
+flamelet
+flamelets
+flamen
+flamenco
+flameout
+flameproof
+flamer
+flamers
+flames
+flamethrower
+Flamig
+flaming
+flamingly
+flamingo
+flamingoes
+Flaminian
+flamininus
+flaminius
+flammability
+flammable
+flammables
+flamsteed
+flan
+flan's
+Flanagan
+flanch
+Flanders
+flange
+flanged
+flanges
+flank
+flanked
+flanker
+flankers
+flanking
+flanks
+flannel
+flannel's
+flanneled
+flannelette
+flanneling
+flannels
+flap
+flap's
+flapdoodle
+flapjack
+flapped
+flapper
+flappers
+flapping
+flappy
+flaps
+flare
+flareback
+flared
+flares
+flaring
+flaringly
+flash
+flashback
+flashbacks
+flashboard
+flashbulb
+flashbulbs
+flashcube
+flashcubes
+flashed
+flasher
+flashers
+flashes
+flashgun
+flashguns
+flashier
+flashily
+flashiness
+flashing
+flashlight
+flashlight's
+flashlights
+flashover
+flashovers
+flashtube
+flashy
+flask
+flasket
+flat
+flatbed
+flatboat
+flatcap
+flatcar
+flatette
+flatfeet
+flatfish
+flatfishes
+flatfoot
+flatfooted
+flatfoots
+flathead
+flatiron
+flatirons
+flatland
+flatlander
+flatlands
+flatlet
+flatlets
+flatling
+flatly
+flatmate
+flatmates
+flatness
+flatnesses
+flats
+flatted
+flatten
+flattened
+flattener
+flattening
+flattens
+flatter
+flattered
+flatterer
+flattering
+flatteringly
+flatters
+flattery
+flattest
+flatting
+flattish
+flattop
+flatulence
+flatulency
+flatulent
+flatulently
+flatus
+flatware
+flatways
+flatwise
+flatwork
+flatworm
+flaubert
+flaunch
+flaunt
+flaunted
+flaunting
+flauntingly
+flaunts
+flaunty
+flautist
+flavescent
+flavin
+flavine
+flavone
+flavoprotein
+flavopurpurin
+flavor
+flavor's
+flavored
+flavorer
+flavorer's
+flavorers
+flavorful
+flavorfully
+flavoring
+flavorings
+flavorless
+flavorlesses
+flavorous
+flavors
+flavorsome
+flavory
+flaw
+flawed
+flawing
+flawless
+flawlessly
+flawlessness
+flaws
+flax
+flaxen
+flaxier
+flaxman
+flaxseed
+flaxy
+flay
+flea
+flea's
+fleabag
+fleabane
+fleabite
+fleabites
+fleam
+fleapit
+fleapits
+fleas
+fleawort
+fleck
+flecked
+flecker
+flecking
+flecks
+flection
+flective
+fled
+Fledermaus
+fledermaus
+fledge
+fledged
+fledges
+fledging
+fledgling
+fledgling's
+fledglings
+fledgy
+flee
+fleece
+fleece's
+fleeced
+fleeces
+fleecier
+fleecy
+fleeing
+fleer
+fleeringly
+flees
+fleet
+fleetest
+fleeting
+fleetingly
+fleetingness
+fleetly
+fleetness
+fleets
+Fleetwood
+Fleischman
+fleischman
+Fleisher
+fleisher
+Fleming
+Flemings
+Flemish
+Flemished
+Flemishes
+Flemishing
+Flensburg
+flense
+flesh
+fleshed
+flesher
+fleshes
+fleshier
+fleshiness
+fleshing
+fleshings
+fleshly
+fleshment
+fleshpot
+fleshpots
+fleshy
+fletch
+fletched
+Fletcher
+fletcher
+Fletcherism
+Fletcherize
+Fletcherizes
+fletches
+fletching
+fletching's
+fletchings
+fleurette
+fleury
+flew
+flews
+flex
+flexed
+flexibilities
+flexibility
+flexible
+flexibly
+flexile
+flexing
+flexion
+flexitime
+flexo
+flexographic
+flexographically
+flexography
+flexor
+flexuous
+flexuously
+flexural
+flexure
+fley
+fleysome
+flibbertigibbet
+flibbertigibbety
+flick
+flicked
+flicker
+flickered
+flickering
+flickeringly
+flickery
+flicking
+flicks
+flier
+fliers
+flies
+flight
+flight's
+flightier
+flightily
+flightiness
+flightless
+flights
+flighty
+flimflam
+flimflammed
+flimflammer
+flimflamming
+flimsier
+flimsies
+flimsily
+flimsiness
+flimsy
+flinch
+flinched
+flincher
+flinches
+flinching
+flinders
+fling
+fling's
+flinger
+flinging
+flings
+flint
+flintier
+flintily
+flintiness
+flintless
+flintlike
+flintlock
+flints
+Flintshire
+flinty
+flip
+flipflop
+flippancy
+flippant
+flippantly
+flipped
+flipper
+flippers
+flipping
+flips
+flirt
+flirtation
+flirtations
+flirtatious
+flirtatiously
+flirtatiousness
+flirted
+flirter
+flirting
+flirts
+flirty
+flit
+flitch
+flite
+flits
+flitted
+flitter
+flitting
+flivver
+Flo
+Flo's
+float
+floatage
+floatation
+floated
+floater
+floaters
+floating
+floatplane
+floats
+floaty
+floc
+floccose
+flocculant
+flocculants
+flocculate
+flocculated
+flocculates
+flocculating
+flocculation
+flocculent
+flocculus
+floccus
+flock
+flocked
+flocking
+flocks
+flodden
+floe
+floes
+flog
+flogged
+flogger
+flogging
+flogs
+flong
+flood
+flooded
+flooder
+floodgate
+flooding
+floodlight
+floodlit
+floodplain
+floods
+floodwall
+floodwater
+floodwater's
+floodwaters
+floodway
+flooey
+floor
+floorage
+floorboard
+floorboards
+floored
+floorer
+flooring
+floorings
+floors
+floorwalker
+floozie
+floozies
+floozy
+flop
+flop's
+flophouse
+flophouses
+flopover
+flopovers
+flopped
+flopper
+floppers
+floppier
+floppies
+floppily
+floppiness
+flopping
+floppy
+floppy's
+flops
+flora
+floral
+floralize
+floralizes
+florally
+floreated
+Florence
+Florentine
+flores
+florescence
+florescent
+floret
+florey
+floriate
+floriated
+floriation
+floriations
+floribunda
+florican
+floricultural
+floriculturally
+floriculture
+floriculturist
+florid
+Florida
+Florida's
+Floridian
+Floridians
+floridity
+floridly
+floridness
+floriferous
+floriferously
+floriferousness
+florigen
+florigenic
+florilegium
+florin
+florio
+florist
+floristic
+floristically
+floristics
+floristry
+florists
+floruit
+flory
+flos
+floss
+flossed
+flosses
+flossier
+flossing
+flossy
+flotage
+flotation
+flotations
+flotilla
+flotillas
+flotow
+flotsam
+flounce
+flounced
+flounces
+flouncing
+flouncy
+flounder
+floundered
+floundering
+flounders
+flour
+floured
+flourish
+flourished
+flourisher
+flourishes
+flourishing
+flourishingly
+flours
+floury
+flout
+flouted
+flouter
+flouting
+flouts
+flow
+flowability
+flowage
+flowchart
+flowcharting
+flowcharts
+flowed
+flower
+flowerage
+flowerbed
+flowered
+flowerer
+floweret
+floweriness
+flowering
+flowerless
+flowerlike
+flowerpot
+flowers
+flowery
+flowing
+flowingly
+flown
+flows
+flowstone
+Floyd
+flu
+flub
+flubbed
+flubbing
+flubs
+fluctuant
+fluctuate
+fluctuated
+fluctuates
+fluctuating
+fluctuation
+fluctuations
+flue
+fluegelhorn
+fluency
+fluent
+fluently
+fluff
+fluffier
+fluffiest
+fluffiness
+fluffs
+fluffy
+Flugelhorn
+fluid
+fluidal
+fluidally
+fluidextract
+fluidic
+fluidics
+fluidity
+fluidization
+fluidization's
+fluidizations
+fluidize
+fluidized
+fluidizer
+fluidizes
+fluidizing
+fluidly
+fluidness
+fluidounce
+fluidram
+fluids
+fluke
+flukey
+flukier
+fluky
+flume
+flumed
+flumes
+fluming
+flummery
+flummox
+flump
+flumped
+flumping
+flumps
+flung
+flunk
+flunked
+flunker
+flunkeys
+flunking
+flunks
+flunky
+fluor
+fluorene
+fluoresce
+fluorescein
+fluorescence
+fluorescent
+fluorescer
+fluoresces
+fluoric
+fluoridate
+fluoridated
+fluoridates
+fluoridating
+fluoridation
+fluoridations
+fluoride
+fluorides
+fluoridization
+fluoridization's
+fluoridizations
+fluoridize
+fluoridizes
+fluorimeter
+fluorimeter's
+fluorimeters
+fluorimetric
+fluorimetry
+fluorinate
+fluorinated
+fluorinates
+fluorinating
+fluorination
+fluorinations
+fluorine
+fluorite
+fluorocarbon
+fluorometer
+fluorophore
+fluoroscope
+fluoroscopic
+fluoroscopy
+fluorosis
+fluorosulphuric
+fluorspar
+flurried
+flurries
+flurry
+flurrying
+flush
+flushable
+flushed
+flushes
+flushing
+flushness
+fluster
+flustered
+flustering
+flusters
+flute
+flute's
+fluted
+flutelike
+fluter
+flutes
+fluting
+flutist
+flutter
+flutterboard
+fluttered
+flutterer
+fluttering
+flutters
+fluttery
+fluvial
+fluviatile
+fluviomarine
+flux
+fluxed
+fluxes
+fluxion
+fluxional
+fluxmeter
+fluxmeters
+fly
+flyable
+flyaway
+flyback
+flyblow
+flyblown
+flyboat
+flyboats
+flybook
+flyby
+flybys
+flycatcher
+flycatchers
+flyer
+flyer's
+flyers
+flying
+flyleaf
+flyleaves
+flyman
+Flynn
+flyover
+flyovers
+flypaper
+flypast
+flypasts
+Flysch
+flyspeck
+flyswatter
+flyte
+flytier
+flyting
+flytrap
+flytraps
+flyway
+flyweight
+flywheel
+flywheels
+FM
+FMC
+foal
+foals
+foam
+foamed
+foamer
+foamflower
+foamier
+foaminess
+foaming
+foamless
+foams
+foamy
+fob
+fobbing
+focal
+focalization
+focalization's
+focalizations
+focalize
+focalized
+focalizes
+focalizing
+focally
+foch
+foci
+fock
+focus
+focusable
+focused
+focuser
+focuses
+focusing
+focusless
+fodder
+fodgel
+foe
+foe's
+foehn
+foeman
+foes
+foetal
+foetation
+foeticide
+foetor
+fog
+fog's
+Fogarty
+fogbound
+fogbow
+fogbows
+fogdog
+fogey
+fogeys
+fogged
+fogger
+foggest
+foggia
+foggier
+foggiest
+foggily
+fogginess
+fogging
+foggy
+foghorn
+foghorns
+fogies
+fogless
+fogs
+fogy
+fogyish
+fogyism
+foible
+foibles
+foie
+foil
+foiled
+foiling
+foils
+foilsman
+foin
+Foism
+Foison
+foist
+foisted
+foisting
+foists
+Fokine
+Fokker
+folacin
+fold
+foldable
+foldaway
+foldboat
+foldboater
+foldboating
+folded
+folder
+folderol
+folders
+folding
+foldings
+foldout
+foldouts
+folds
+Foley
+Foley's
+folia
+foliaceous
+foliage
+foliaged
+foliages
+foliar
+foliate
+foliated
+foliates
+foliating
+foliation
+foliations
+folic
+folie
+folio
+foliolate
+folios
+foliose
+foliot
+foliots
+folium
+folk
+folk's
+folkestone
+folketing
+folkish
+folkishness
+folklike
+folklore
+folkloric
+folklorish
+folklorist
+folkloristic
+folkmoot
+folks
+folksier
+folksily
+folksiness
+folksinger
+folksinger's
+folksingers
+folksinging
+folksong
+folksongs
+folksy
+folktale
+folktale's
+folktales
+folkway
+folkways
+follicle
+follicles
+follicular
+folliculate
+folliculated
+folliculin
+follies
+follow
+followed
+follower
+followers
+followership
+followeth
+following
+followings
+follows
+followup
+followup's
+followups
+folly
+folsom
+Folsom
+Fomalhaut
+Fomalhaut's
+foment
+fomentation
+fomentations
+fomented
+fomenter
+fomenting
+foments
+fond
+fonda
+fondant
+fondants
+fonder
+fondest
+fondle
+fondled
+fondler
+fondles
+fondling
+fondly
+fondness
+fonds
+fondue
+fondues
+fonseca
+font
+font's
+Fontaine
+Fontaine's
+Fontainebleau
+fontal
+fontana
+Fontana
+fontanelle
+fonteyn
+fonts
+Foochow
+food
+food's
+foodless
+foodlessness
+foods
+foodstuff
+foodstuff's
+foodstuffs
+fool
+fooled
+foolery
+foolhardily
+foolhardiness
+foolhardy
+fooling
+foolish
+foolishly
+foolishness
+foolproof
+fools
+foolscap
+foolscap's
+foot
+footage
+footages
+football
+football's
+footballed
+footballer
+footballers
+footballs
+footboard
+footboards
+footboy
+footboys
+footbridge
+footbridges
+footcandle
+footcloth
+Foote
+footed
+footer
+footers
+footfall
+footfalls
+footgear
+foothill
+foothills
+foothold
+footholds
+footing
+footings
+footle
+footled
+footler
+footles
+footless
+footlessly
+footlessness
+footlight
+footlights
+footlike
+footling
+footlocker
+footloose
+footman
+footmark
+footmen
+footnote
+footnote's
+footnotes
+footpace
+footpad
+footpads
+footpath
+footpaths
+footplate
+footplates
+footprint
+footprint's
+footprints
+footrace
+footrest
+footrests
+footrope
+footropes
+foots
+footsie
+footslog
+footslogged
+footslogger
+footslogging
+footslogs
+footsore
+footsoreness
+footstalk
+footstall
+footstep
+footsteps
+footstock
+footstool
+footstools
+footwall
+footway
+footways
+footwear
+footwork
+footworn
+footy
+foozle
+foozled
+fop
+foppery
+fopping
+foppish
+foppishly
+foppishness
+fops
+for
+fora
+forage
+foraged
+forager
+forages
+foraging
+foramen
+foraminifer
+foraminifera
+forasmuch
+foray
+foray's
+forayer
+forays
+forbade
+forbear
+forbear's
+forbearance
+forbearer
+forbearing
+forbears
+Forbes
+forbid
+forbiddance
+forbidden
+forbidder
+forbidding
+forbiddingly
+forbiddingness
+forbids
+forbode
+forbore
+forborne
+forby
+forbye
+force
+force's
+forced
+forcedly
+forcefield
+forcefield's
+forcefields
+forceful
+forcefully
+forcefulness
+forceless
+forcemeat
+forceps
+forcepslike
+forcer
+forces
+forcible
+forcibleness
+forcibly
+forcing
+ford
+fordable
+Fordham
+fordo
+fordone
+fords
+fore
+forearm
+forearm's
+forearmed
+forearms
+forebear
+forebears
+forebode
+foreboded
+foreboder
+forebodes
+foreboding
+forebodingly
+forebodingness
+forebodings
+forebrain
+forecast
+forecasted
+forecaster
+forecasters
+forecasting
+forecastle
+forecastles
+forecasts
+foreclose
+foreclosed
+forecloses
+foreclosing
+foreclosure
+forecourse
+forecourt
+forecourts
+foredeck
+foredo
+foredoom
+foredoomed
+forefather
+forefather's
+forefathers
+forefeel
+forefeet
+forefend
+forefinger
+forefinger's
+forefingers
+forefoot
+forefront
+foregather
+forego
+foregoer
+foregoes
+foregoing
+foregone
+foreground
+foregrounds
+foregut
+forehand
+forehanded
+forehandedly
+forehandedness
+forehead
+forehead's
+foreheads
+forehock
+foreign
+foreigner
+foreigners
+foreignism
+foreignization
+foreignization's
+foreignizations
+foreignize
+foreignizes
+foreignly
+foreignness
+foreigns
+forejudge
+forejudgment
+forejudgment's
+forejudgments
+foreknow
+foreknowledge
+foreknown
+forelady
+foreland
+foreleg
+forelimb
+forelock
+foreman
+foremanship
+foremast
+foremasts
+foremen
+foremost
+foremother
+forename
+forenamed
+forenames
+forenoon
+forensic
+forensical
+forensically
+forensics
+foreordain
+foreordained
+foreordaining
+foreordains
+foreordination
+forepart
+forepassed
+forepast
+forepaw
+forepaws
+forepeak
+foreplay
+forequarter
+forequarters
+forereach
+forerun
+forerunner
+forerunners
+foresaid
+foresail
+foresaw
+foresee
+foreseeable
+foreseeing
+foreseen
+foreseer
+foresees
+foreshadow
+foreshadowed
+foreshadower
+foreshadowing
+foreshadows
+foreshank
+foresheet
+foreshock
+foreshore
+foreshorten
+foreshortened
+foreshortening
+foreshortens
+foreshow
+foreside
+foresight
+foresighted
+foresightedly
+foresightedness
+foresightful
+foreskin
+forespeak
+forespent
+forest
+forestage
+forestal
+forestall
+forestalled
+forestaller
+forestalling
+forestallment
+forestalls
+forestation
+forestay
+forestaysail
+forested
+forester
+foresters
+forestial
+forestry
+forests
+foreswear
+foresworn
+foretaste
+foretell
+foretellable
+foreteller
+foretelling
+foretells
+forethought
+forethought's
+forethoughtfully
+forethoughtfulness
+forethougtful
+foretime
+foretoken
+foretold
+foretooth
+foretop
+foretriangle
+forever
+forevermore
+foreverness
+forewarn
+forewarned
+forewarner
+forewarning
+forewarnings
+forewarns
+forewent
+forewind
+forewing
+forewoman
+foreword
+foreworn
+foreyard
+forfar
+forfeit
+forfeitable
+forfeited
+forfeiter
+forfeiters
+forfeiting
+forfeits
+forfeiture
+forfeitures
+forfend
+forfended
+forfending
+forfends
+forficate
+forgat
+forgather
+forgave
+forge
+forgeability
+forgeable
+forged
+forger
+forgeries
+forgers
+forgery
+forgery's
+forges
+forget
+forgetful
+forgetfully
+forgetfulness
+forgetive
+forgets
+forgettable
+forgettably
+forgetter
+forgetting
+forging
+forgivable
+forgivably
+forgive
+forgiveable
+forgiveably
+forgiven
+forgiveness
+forgiver
+forgives
+forgiving
+forgivingly
+forgivingness
+forgo
+forgoer
+forgoes
+forgoing
+forgone
+forgot
+forgotten
+forint
+forjudge
+fork
+forked
+forker
+forkful
+forkier
+forking
+forklift
+forklike
+forks
+forky
+forlorn
+forlornly
+forlornness
+form
+forma
+formability
+formable
+formal
+formaldehyde
+formalin
+formalism
+formalism's
+formalisms
+formalist
+formalistic
+formalistically
+formalities
+formality
+formalizable
+formalization
+formalization's
+formalizations
+formalize
+formalized
+formalizer
+formalizers
+formalizes
+formalizing
+formally
+formalness
+formals
+formant
+formants
+format
+formate
+formated
+formates
+formating
+formation
+formation's
+formational
+formations
+formative
+formatively
+formativeness
+formats
+formatted
+formatter
+formatter's
+formatters
+formatting
+forme
+formed
+former
+formerly
+formers
+formfeed
+formfeeds
+formfitting
+formful
+formic
+Formica
+formicary
+formicate
+formication
+formidability
+formidable
+formidableness
+formidably
+forming
+formless
+formlessly
+formlessness
+Formosa
+Formosan
+forms
+formula
+formula's
+formulae
+formulaic
+formulaically
+formularization
+formularizations
+formularize
+formularized
+formularizer
+formularizes
+formularizing
+formulary
+formulas
+formulate
+formulated
+formulates
+formulating
+formulation
+formulations
+formulator
+formulator's
+formulators
+formulism
+formulization
+formulizations
+formulize
+formulized
+formulizes
+formulizing
+formwork
+formyl
+Fornax
+fornenst
+fornicate
+fornicated
+fornicates
+fornicating
+fornication
+fornications
+fornicator
+fornicators
+fornix
+forrader
+forrarder
+Forrester
+forsake
+forsaken
+forsakes
+forsaking
+forsee
+forseen
+forsook
+forsooth
+forspeak
+forspent
+forster
+forsterite
+forswear
+forswears
+forswore
+forsworn
+Forsythe
+Forsythe's
+Forsythia
+fort
+fort's
+fortaleza
+fortalice
+forte
+fortepiano
+fortes
+Fortescue
+Fortescue's
+forth
+forthcome
+forthcoming
+forthright
+forthrightly
+forthrightness
+forthwith
+fortier
+forties
+fortieth
+fortification
+fortifications
+fortified
+fortifier
+fortifies
+fortify
+fortifying
+fortin
+fortiori
+fortis
+fortissimo
+fortitude
+fortman
+fortnight
+fortnightly
+Fortran
+Fortran's
+fortress
+fortress's
+fortresses
+forts
+fortuitism
+fortuitous
+fortuitously
+fortuitousness
+fortuity
+fortuna
+fortunate
+fortunately
+fortunateness
+fortunates
+fortune
+fortune's
+fortuned
+fortunes
+fortuning
+forty
+fortyfold
+forum
+forum's
+forumize
+forumizes
+forums
+forward
+forwarded
+forwarder
+forwarders
+forwarding
+forwardly
+forwardness
+forwards
+forwent
+forwhy
+forworn
+forzando
+fosbury
+Foss
+fossa
+fossate
+fosse
+fossette
+fossick
+fossil
+fossiled
+fossiliferous
+fossilizable
+fossilizable's
+fossilizables
+fossilization
+fossilization's
+fossilizations
+fossilize
+fossilized
+fossilizes
+fossilizing
+fossils
+fossorial
+foster
+fosterage
+fostered
+fosterer
+fostering
+fosterite
+fosterling
+fosterlings
+fosters
+fotheringhay
+fou
+foucault
+foucquet
+foudroyant
+fought
+foul
+foulard
+fouled
+fouler
+foulest
+fouling
+foully
+foulmouth
+foulmouthed
+foulness
+fouls
+found
+foundation
+foundation's
+foundational
+foundationally
+foundationless
+foundations
+founded
+founder
+foundered
+foundering
+founderous
+founders
+founding
+foundling
+foundlings
+foundress
+foundries
+foundrous
+foundry
+foundry's
+founds
+fount
+fount's
+fountain
+fountain's
+fountainhead
+fountains
+founts
+Fouquet
+four
+fourdrinier
+fourfold
+Fourier
+Fourier's
+Fourierism
+Fournet
+Fournier
+fourpence
+fourpenny
+fours
+fourscore
+foursome
+foursomes
+foursquare
+fourteen
+fourteener
+fourteens
+fourteenth
+fourth
+fourthly
+fourths
+fovea
+foveola
+fowey
+fowl
+fowler
+fowliang
+fowling
+fowls
+fox
+fox's
+foxed
+foxes
+foxfire
+foxglove
+Foxhall
+foxhole
+foxholes
+foxhound
+foxier
+foxily
+foxiness
+foxing
+foxtail
+foxtrot
+foxtrot's
+foxtrots
+foxy
+foyboat
+foyer
+FPC
+FPS
+fracas
+fracases
+fractal
+fractal's
+fractals
+fracted
+fraction
+fraction's
+fractional
+fractionalization
+fractionalize
+fractionalized
+fractionalizes
+fractionalizing
+fractionally
+fractionate
+fractionated
+fractionates
+fractionating
+fractionation
+fractionations
+fractionator
+fractionators
+fractioned
+fractioning
+fractionization
+fractionization's
+fractionizations
+fractionize
+fractionizes
+fractions
+fractious
+fractiously
+fractiousness
+fractocumulus
+fractostratus
+fracture
+fractured
+fractures
+fracturing
+frae
+fraenum
+frag
+fragged
+fragging
+fragile
+fragilely
+fragility
+fragment
+fragmental
+fragmentally
+fragmentarily
+fragmentariness
+fragmentary
+fragmentate
+fragmentated
+fragmentates
+fragmentating
+fragmentation
+fragmentations
+fragmented
+fragmenting
+fragmentize
+fragmentized
+fragmentizer
+fragmentizes
+fragmentizing
+fragments
+fragonard
+fragrance
+fragrance's
+fragrances
+fragrancy
+fragrant
+fragrantly
+frags
+frail
+frailer
+frailest
+frailly
+frailness
+frailties
+frailty
+fraise
+fraktur
+framable
+frambesia
+framboesia
+frame
+frame's
+frameable
+framed
+framer
+framers
+frames
+framework
+framework's
+frameworks
+framing
+framings
+Fran
+Fran's
+franc
+franca
+francaise
+Francaise
+France
+France's
+Frances
+Francesca
+francesca
+Francescatti
+Francesco
+francesco
+franchise
+franchise's
+franchised
+franchisee
+franchiser
+franchises
+franchising
+franchisor
+Francie
+francie
+Francine
+Francine's
+Francis
+Franciscan
+Franciscans
+Francisco
+francium
+Francize
+Francizes
+Franck
+Franco
+Francois
+francois
+Francoise
+Francoise's
+francolin
+Franconia
+Franconian
+Francophile
+Francophobe
+Francophone
+francs
+franger
+frangibility
+frangible
+frangipane
+frangipani
+Franglais
+frank
+frankalmoign
+franked
+Frankel
+Frankel's
+Frankenstein
+franker
+frankest
+Frankford
+Frankfort
+Frankfurt
+frankfurter
+frankfurters
+Frankie
+frankincense
+franking
+Frankish
+franklin
+Franklinization
+Franklinization's
+Franklinizations
+frankly
+frankness
+frankpledge
+franks
+franny
+Franny
+frantic
+frantically
+franticly
+franticness
+Franz
+frap
+frappe
+frapping
+Fraser
+Fraser's
+frass
+frat
+fratchy
+frater
+fraternal
+fraternalism
+fraternally
+fraternities
+fraternity
+fraternity's
+fraternization
+fraternization's
+fraternizations
+fraternize
+fraternized
+fraternizer
+fraternizers
+fraternizes
+fraternizing
+fratricidal
+fratricide
+Frau
+fraud
+fraud's
+frauds
+fraudulence
+fraudulent
+fraudulently
+fraudulentness
+Frauenfeld
+fraught
+fraughted
+fraughting
+fraughts
+Fraunhofer
+fraxinella
+fray
+frayed
+fraying
+Frayne
+frayne
+frays
+Frazer
+Frazier
+Frazil
+frazzle
+frazzled
+frazzles
+frazzling
+freak
+freak's
+freakier
+freakish
+freakishly
+freakishness
+freaks
+freaky
+Freccia
+freckle
+freckled
+freckles
+freckling
+freckly
+Fred
+Freda
+Freddie
+Freddy
+Freddy's
+Frederic
+Fredericia
+Frederick
+Fredericks
+Fredericksburg
+Fredericksburg's
+Frederico
+Fredericton
+Fredericton's
+Frederiksberg
+Fredholm
+Fredholm's
+Fredrick
+fredrick
+Fredrickson
+Fredrikstad
+free
+freebie
+freeboard
+freeboot
+freebooter
+freebooters
+freeborn
+freed
+freedman
+freedmen
+freedom
+freedom's
+freedomites
+freedoms
+freedwoman
+freehand
+freehanded
+freehandedly
+freehearted
+freeheartedly
+freehold
+freeholder
+freeholders
+freeing
+freeings
+freelance
+freeload
+freeloader
+freely
+freeman
+freemartin
+freemason
+Freemason
+freemasonry
+freemen
+freeness
+Freeport
+freer
+frees
+freesheet
+freesheets
+Freesia
+freest
+freestanding
+freestone
+freestyle
+freethink
+freethinker
+freethinkers
+freethinking
+Freetown
+Freetown's
+freeway
+freeway's
+freeways
+freewheel
+freewheeled
+freewheeler
+freewheelers
+freewheeling
+freewheelingness
+freewheels
+freewill
+freeze
+freezer
+freezers
+freezes
+freezing
+Freiburg
+Freida
+freida
+freight
+freightage
+freighted
+freighter
+freighters
+freighting
+freightliner
+freights
+fremantle
+fremitus
+French
+French's
+frenchification
+frenchify
+Frenchize
+Frenchizes
+Frenchman
+Frenchmen
+Frenchy
+frenetic
+frenetically
+Freni
+frenulum
+frenum
+frenzied
+frenziedly
+frenzies
+frenzy
+frenzying
+freon
+frequence
+frequencies
+frequency
+frequent
+frequentation
+frequentations
+frequentative
+frequentatives
+frequented
+frequenter
+frequenters
+frequenting
+frequently
+frequentness
+frequents
+fresco
+Frescobaldi
+frescoed
+frescoes
+frescoing
+frescos
+fresh
+freshen
+freshened
+freshener
+fresheners
+freshening
+freshens
+fresher
+freshers
+freshest
+freshet
+freshly
+freshman
+freshmen
+freshness
+freshwater
+Fresnel
+Fresno
+fret
+fretful
+fretfully
+fretfulness
+frets
+fretted
+fretting
+fretwork
+Freud
+Freudian
+Frey
+Freya
+Freya's
+Freytag
+Fri
+friability
+friable
+friableness
+friar
+friar's
+friarbird
+friarly
+friars
+friary
+fribble
+fribbled
+fribbles
+fribbling
+Fribourg
+Fricandeau
+fricasee
+fricassee
+frication
+fricative
+fricatives
+Frick
+friction
+friction's
+frictional
+frictionally
+frictionize
+frictionizes
+frictionless
+frictionlessly
+frictions
+Friday
+Friday's
+Fridays
+fridge
+fridge's
+fridges
+fried
+Friedman
+Friedrich
+Friedrich's
+friend
+friend's
+friendless
+friendlessness
+friendlier
+friendlies
+friendliest
+friendlily
+friendliness
+friendly
+friends
+friendship
+friendship's
+friendships
+frier
+fries
+Friesian
+Friesland
+Friesland's
+frieze
+frieze's
+friezes
+frig
+frigate
+frigate's
+frigates
+Frigg
+Frigga
+frigging
+fright
+frighten
+frightened
+frightening
+frighteningly
+frightens
+frightful
+frightfully
+frightfulness
+frigid
+Frigidaire
+frigidity
+frigidly
+frigidness
+frigorific
+Frijol
+frill
+frill's
+frilled
+frillery
+frills
+frilly
+fringe
+fringed
+fringes
+fringier
+fringilline
+fringing
+fringy
+frippery
+frippet
+Frisbee
+Frisch
+Frisco
+Frisian
+frisk
+frisked
+frisker
+frisket
+friskier
+friskily
+friskiness
+frisking
+frisks
+frisky
+frisson
+frissons
+frit
+fritillary
+frito
+Frito
+fritted
+fritter
+fritterer
+fritters
+fritting
+Fritz
+Friuli
+Friulian
+frivol
+frivoled
+frivoler
+frivoling
+frivolity
+frivolous
+frivolously
+frivolousness
+Frizette
+frizz
+frizzier
+frizzily
+frizziness
+frizzle
+frizzled
+frizzles
+frizzlier
+frizzling
+frizzly
+frizzy
+fro
+Frobisher
+frock
+frock's
+frocked
+frocking
+frocks
+froe
+froebel
+frog
+frog's
+frogfish
+frogged
+frogging
+froghopper
+frogman
+frogmarch
+frogmen
+frogmouth
+frogs
+frogspawn
+froissart
+frolic
+frolick
+frolicked
+frolicking
+frolicks
+frolics
+frolicsome
+frolicsomely
+frolicsomeness
+from
+frome
+Froment
+fromenty
+fromm
+frond
+frond's
+fronde
+fronded
+frondescence
+frondeur
+frondose
+frondosely
+fronds
+frons
+front
+frontage
+frontal
+frontality
+frontally
+fronted
+frontenac
+frontier
+frontier's
+frontiers
+frontiersman
+frontiersmen
+fronting
+frontispiece
+frontispieces
+frontless
+frontlet
+frontogenesis
+frontolysis
+fronton
+frontrunner
+fronts
+frontwards
+frore
+frost
+Frostbelt
+Frostbelt's
+frostbite
+frostbiting
+frostbitten
+frosted
+frostier
+frostily
+frostiness
+frosting
+frosts
+frostwork
+frosty
+froth
+frothier
+frothily
+frothiness
+frothing
+froths
+frothy
+frottage
+froude
+froufrou
+frow
+froward
+frowardly
+frowardness
+frown
+frowned
+frowner
+frowning
+frowningly
+frowns
+frowsier
+frowst
+frowstier
+frowsty
+frowsy
+frowzier
+frowzy
+froze
+frozen
+frozenly
+frozenness
+fructiferous
+fructification
+fructifications
+fructify
+fructose
+fructose's
+fructoses
+fructuous
+fructuously
+Fruehauf
+Fruehauf's
+frugal
+frugality
+frugally
+frugivorous
+fruit
+fruit's
+fruitage
+fruitarian
+fruitcake
+fruited
+fruiter
+fruiterer
+fruitful
+fruitfully
+fruitfulness
+fruitier
+fruition
+fruitless
+fruitlessly
+fruitlessness
+fruitlet
+fruits
+fruity
+frumentaceous
+frumenty
+frump
+frumpier
+frumpish
+frumps
+frumpy
+frunze
+frustrate
+frustrated
+frustrater
+frustrates
+frustrating
+frustratingly
+frustration
+frustrations
+frustule
+frustum
+frutescent
+fry
+Frye
+Frye's
+fryer
+frying
+FSF
+FSF'S
+Ft
+ft
+FTC
+ftp
+FTP
+ftper
+ftpers
+ftping
+ftpings
+ftps
+fuad
+fubsy
+Fuchs
+fuchsia
+fuchsin
+fuck
+fuck's
+fucked
+fucker
+fucker's
+fuckers
+fucking
+fucks
+fuckwit
+fucoid
+fucose
+fucus
+fuddle
+fuddled
+fuddles
+fuddling
+fudge
+fudged
+fudges
+fudging
+Fuegian
+fuel
+fueled
+fueler
+fuelers
+fueling
+fuelizer
+fuelizer's
+fuelizers
+fuels
+fugacious
+fugacity
+fugal
+fugally
+fugard
+fugato
+fugger
+fugio
+fugitive
+fugitive's
+fugitively
+fugitiveness
+fugitives
+fugue
+fuguist
+Fuji
+Fujitsu
+Fujitsu's
+fukien
+fukuda
+fukuoka
+fukushima
+fula
+fulani
+Fulbright
+fulbright
+Fulbright's
+Fulbrights
+fulcra
+fulcrum
+fulfill
+fulfilled
+fulfiller
+fulfilling
+fulfillment
+fulfillment's
+fulfillments
+fulfills
+fulgent
+fulgently
+fulgurant
+fulgurate
+fulgurated
+fulgurates
+fulgurating
+fulguration
+fulgurations
+fulgurite
+fulgurous
+Fulham
+fuliginous
+fuliginously
+full
+fullback
+fullbacking
+fuller
+Fullerton
+fullest
+fullmouthed
+fullness
+fullword
+fullword's
+fullwords
+fully
+fulmar
+fulminant
+fulminate
+fulminated
+fulminates
+fulminating
+fulmination
+fulminations
+fulminator
+fulminators
+fulminic
+fulminous
+fulness
+fulsome
+fulsomely
+fulsomeness
+Fulton
+Fulton's
+fulvous
+fum
+fumarate
+fumaric
+fumarole
+fumatorium
+fumatory
+fumble
+fumbled
+fumbler
+fumbles
+fumbling
+fumblingly
+fume
+fumed
+fumes
+fumigant
+fumigate
+fumigated
+fumigates
+fumigation
+fumigations
+fumigator
+fumigators
+fuming
+fumitory
+fumy
+fun
+funambulist
+funchal
+function
+function's
+functional
+functionalism
+functionalist
+functionalistic
+functionalists
+functionalities
+functionality
+functionalize
+functionalizes
+functionally
+functionals
+functionary
+functioned
+functioning
+functionize
+functionizes
+functionless
+functions
+functor
+functor's
+functorial
+functors
+fund
+fundament
+fundamental
+fundamentalism
+fundamentalist
+fundamentalist's
+fundamentalistic
+fundamentalists
+fundamentally
+fundamentals
+funded
+funder
+funders
+fundi
+funding
+fundraiser
+fundraiser's
+fundraisers
+fundraising
+funds
+fundus
+fundy
+funeral
+funeral's
+funeralize
+funeralizes
+funerals
+funerary
+funereal
+funereally
+funfair
+fungal
+fungi
+fungibility
+fungible
+fungicidal
+fungicidally
+fungicide
+fungicides
+fungiform
+fungistat
+fungo
+fungoes
+fungoid
+fungous
+fungus
+funguses
+funicle
+funicular
+funiculus
+funigating
+funk
+funkier
+funkiness
+funky
+funnel
+funneled
+funneler
+funnelform
+funneling
+funnels
+funnier
+funnies
+funniest
+funnily
+funniness
+funning
+funny
+funnyman
+fur
+fur's
+furan
+furbearer
+furbelow
+furbish
+furbisher
+furbishes
+furbishing
+furcate
+furcated
+furcately
+furcates
+furcating
+furcation
+furcations
+furcula
+furcular
+furfur
+furfuraceous
+furfural
+furfuraldehyde
+furfuran
+furies
+furioso
+furious
+furiouser
+furiously
+furiousness
+furl
+furled
+furless
+furlong
+furlongs
+furlough
+furloughed
+furloughs
+Furman
+Furman's
+furmenty
+furmity
+furnace
+furnace's
+furnaced
+furnaces
+furnacing
+furness
+furnish
+furnished
+furnisher
+furnishers
+furnishes
+furnishing
+furnishings
+furniture
+furnivall
+furor
+furor's
+furors
+furphy
+furred
+furrier
+furriers
+furriery
+furring
+furrow
+furrowed
+furrowing
+furrows
+furry
+furs
+further
+furtherance
+furthered
+furtherer
+furtherest
+furthering
+furthermore
+furthermost
+furthers
+furthest
+furtive
+furtively
+furtiveness
+furuncle
+furuncular
+furunculosis
+furunculous
+fury
+fury's
+furze
+fusain
+fuscous
+fuse
+fused
+fusee
+fusee's
+fusees
+fuselage
+fuselages
+fuses
+fushih
+fushun
+fusibility
+fusible
+fusiform
+fusil
+fusile
+fusileer
+fusilier
+fusillade
+fusillades
+fusing
+fusion
+fusionism
+fusionist
+fusions
+fuss
+fussbudget
+fussbudgety
+fusser
+fussier
+fussily
+fussiness
+fussing
+fusspot
+fussy
+fustanella
+fustian
+fustians
+fustic
+fustigate
+fustigated
+fustigates
+fustigating
+fustigation
+fustigations
+fustily
+fustiness
+fusty
+futile
+futilely
+futileness
+futilitarian
+futilitarianism
+futility
+futilize
+futilizes
+futtock
+Futuna
+future
+future's
+futureless
+futures
+futurism
+futurist
+futuristic
+futuristically
+futurists
+futurity
+futurize
+futurizes
+futurology
+fuzz
+fuzzed
+fuzzier
+fuzziest
+fuzzily
+fuzziness
+fuzzy
+fyke
+fylde
+fylfot
+fyn
+fyrd
+Fyzabad
+g's
+GA
+gab
+gabar
+gabardine
+gabardines
+gabber
+gabbier
+gabbing
+gabble
+gabbled
+gabbler
+gabbles
+gabbling
+gabbro
+gabby
+gabelle
+gaberdine
+gaberlunzie
+Gaberones
+gabfest
+gabfests
+gabion
+gabionade
+gable
+gabled
+gabler
+gables
+gablet
+gabo
+Gabon
+Gabon's
+gabor
+gaborone
+Gabriel
+Gabrielle
+gaby
+gad
+gadabout
+gadabouts
+Gadarene
+gaddafi
+gadded
+gadder
+gadding
+gadfly
+gadget
+gadget's
+gadgeteer
+gadgeteers
+gadgetry
+gadgets
+gadgety
+gadhelic
+gadid
+gadoid
+gadolinite
+gadolinium
+gadroon
+gadsden
+gadwall
+gadzooks
+gaea
+gaekwar
+Gael
+Gaelic
+Gaelicization
+Gaelicization's
+Gaelicizations
+Gaelicize
+Gaelicizes
+Gaeltacht
+gaff
+gaffe
+gaffer
+gaffes
+gaffs
+gaffsail
+gag
+gaga
+Gagarin
+gagauzi
+gage
+gaged
+gager
+gages
+gagged
+gagger
+gagging
+gaggle
+gaging
+gagman
+gagmen
+gags
+gagster
+gagsters
+gagwriter
+gagwriters
+gahnite
+Gaia
+gaieties
+gaiety
+gaikwar
+Gail
+gaillard
+gaillardia
+gaily
+gain
+gained
+gainer
+gainers
+Gaines
+Gainesville
+gainful
+gainfully
+gainfulness
+gaingiving
+gaining
+gainings
+gainless
+gainlessness
+gainly
+gains
+gainsay
+gainsayer
+Gainsborough
+gaiseric
+gait
+gaited
+gaiter
+gaiters
+Gaithersburg
+gaits
+gaitskell
+gaius
+gal
+gala
+galactagogue
+galactic
+galactometer
+galactopoietic
+galactopyranose
+galactopyranoside
+galactopyranosides
+galactopyranosyl
+galactose
+Galago
+galah
+Galahad
+galahad
+galangal
+galantine
+galanty
+Galapagos
+galashiels
+galata
+Galatea
+Galatia
+Galatia's
+galatians
+galavant
+galaxies
+galaxy
+galaxy's
+galba
+galbanum
+galbraith
+Galbreath
+gale
+galea
+Galen
+galen
+Galen's
+galena
+Galenic
+Galenical
+Galenism
+galenite
+gales
+Galibi
+Galician
+Galilean
+Galilee
+Galileo
+galileo
+Galileo's
+galimatias
+galingale
+galiot
+galipot
+gall
+Galla
+Gallagher
+Gallagher's
+gallant
+gallantize
+gallantizes
+gallantly
+gallantry
+gallants
+gallberry
+gallbladder
+galle
+galleass
+galled
+galleon
+galleons
+galleried
+galleries
+gallery
+gallet
+galley
+galley's
+galleys
+gallfly
+gallia
+galliambic
+galliard
+Gallic
+Gallican
+Gallicanism
+gallice
+Gallicism
+Gallicization
+Gallicize
+Gallicized
+Gallicizes
+Gallicizing
+gallied
+galligaskins
+gallimaufry
+gallinacean
+gallinaceous
+gallinas
+galling
+gallingly
+gallinule
+galliot
+gallipoli
+gallipot
+gallium
+gallivant
+gallivanted
+gallivanting
+gallivants
+galliwasp
+gallnut
+galloglass
+gallon
+gallon's
+gallonage
+gallons
+galloon
+galloot
+gallop
+gallopade
+galloped
+galloper
+gallopers
+galloping
+gallops
+gallous
+gallow
+Galloway
+gallows
+gallowses
+galls
+gallstone
+gallstones
+Gallup
+gallus
+galluses
+Galois
+galoot
+galop
+galore
+galosh
+galoshed
+galoshes
+galoshing
+gals
+galsworthy
+Galt
+Galt's
+Galton
+galumph
+galvani
+galvanic
+galvanically
+galvanism
+galvanization
+galvanization's
+galvanizations
+galvanize
+galvanized
+galvanizer
+galvanizers
+galvanizes
+galvanizing
+galvanometer
+galvanometer's
+galvanometers
+galvanometric
+galvanoscope
+galvanostat
+galvanotropism
+Galveston
+Galvin
+Galvin's
+galvo
+Galway
+Galway's
+Galwegian
+galyak
+gam
+gama
+gamba
+gambado
+Gambeson
+Gambetta
+Gambia
+Gambia's
+Gambier
+gambit
+gambits
+gamble
+gambled
+gambler
+gamblers
+gambles
+gambling
+Gamboge
+gambol
+gamboled
+gamboling
+gambols
+gambrel
+gambrinus
+game
+gamecock
+gamed
+gamekeeper
+gamekeepers
+gamelan
+gamely
+gameness
+games
+gamesman
+gamesmanship
+gamesome
+gamesomely
+gamesomeness
+gamester
+gametangium
+gamete
+gamete's
+gametes
+gametic
+gametically
+gametocyte
+gametogenesis
+gametophore
+gametophyte
+gamey
+gamic
+gamier
+gamily
+gamin
+gamine
+gaminess
+gaming
+gamma
+gammadion
+gammas
+gammer
+gamming
+gammon
+gamogenesis
+gamopetalous
+gamophyllous
+gamosepalous
+gamp
+gamut
+gamy
+gan
+gance
+gand
+Ganda
+gandalf
+gander
+gandhi
+Gandhi
+Gandhi's
+Gandhian
+Gandhiism
+gandy
+gandzha
+ganesa
+gang
+gang's
+Ganga
+gangbang
+ganger
+Ganges
+gangland
+ganglier
+gangling
+ganglion
+ganglioside
+gangliosides
+gangly
+gangplank
+gangplow
+gangrel
+gangrene
+gangrened
+gangrenes
+gangrening
+gangrenous
+gangs
+gangster
+gangster's
+gangsterism
+gangsters
+gangtok
+gangue
+gangway
+gangways
+ganister
+ganja
+gannet
+Gannett
+Gannett's
+ganof
+ganoid
+gansey
+gantlet
+gantries
+gantry
+Ganymede
+GAO
+gap
+gap's
+gape
+gaped
+gaper
+gapes
+gapeworm
+gaping
+gapingly
+gapped
+gapping
+gappy
+gaps
+gar
+garage
+garaged
+garageman
+garagemen
+garages
+garaging
+garam
+Garamond
+garand
+garb
+garbage
+garbage's
+garbaged
+garbages
+garbaging
+garbanzo
+garbed
+garble
+garbled
+garbler
+garbles
+garbling
+garbo
+garboard
+garboil
+Garcia
+gard
+garda
+gardant
+garde
+garden
+gardened
+gardener
+gardeners
+gardenful
+gardenia
+gardenias
+gardening
+gardenize
+gardenizes
+gardens
+garderobe
+gardiner
+Gardner
+Garfield
+garfish
+Garfunkel
+garganey
+Gargantua
+gargantuan
+garget
+gargle
+gargled
+gargles
+gargling
+gargoyle
+gargoyled
+gargoyles
+Garibaldi
+garish
+garishly
+garishness
+garland
+garlanded
+garlands
+garlic
+garlicky
+garlics
+garment
+garment's
+garmented
+garmenting
+garments
+garner
+garnered
+garnering
+garners
+garnet
+garnett
+Garnett
+garnierite
+garnish
+garnishable
+garnished
+garnishee
+garnishees
+garnishes
+garnishment
+garnishments
+garniture
+garnitures
+garonne
+garotte
+garpike
+garret
+garrets
+Garrett
+garrick
+garrison
+garrisoned
+Garrisonian
+garrisoning
+garrisons
+garrote
+garroted
+garroter
+garrotes
+garroting
+garrots
+garrulity
+garrulous
+garrulously
+garrulousness
+Garry
+Garrya
+garter
+garter's
+gartered
+gartering
+garters
+Garth
+garth
+Garth's
+Garvey
+Gary
+Gary's
+gas
+gas's
+gasbag
+Gascon
+gasconade
+Gascony
+gaselier
+gaseous
+gaseously
+gaseousness
+gases
+gash
+gash's
+gashed
+gashes
+gashing
+gasholder
+gashouse
+gasification
+gasifications
+gasified
+gasifier
+gasifiers
+gasifies
+gasiform
+gasify
+gasifying
+gaskell
+gasket
+gaskets
+gaskin
+gaslight
+gaslighted
+gaslights
+gaslit
+gasman
+gasogene
+gasohol
+gasolene
+gasolier
+gasoline
+gasolines
+gasolinic
+gasometer
+gasometer's
+gasometers
+gasometry
+gasp
+Gaspar
+gasped
+Gaspee
+Gaspee's
+gasper
+gaspers
+gasping
+gaspingly
+gasps
+gassed
+gasser
+gassers
+gasses
+Gasset
+gasset
+gassiness
+gassing
+gassings
+gassy
+gast
+gasteropod
+gastight
+gastightness
+gastness
+Gaston
+gastral
+gastralgia
+gastrectomy
+gastric
+gastrin
+gastritis
+gastroenteric
+gastroenteritis
+gastroenterology
+gastroenterostomy
+gastrogenic
+gastrogenous
+gastrointestinal
+gastrolith
+gastrology
+gastronome
+gastronomes
+gastronomic
+gastronomical
+gastronomically
+gastronomist
+gastronomy
+gastropod
+gastroscope
+gastrostomy
+gastrotomy
+gastrotrich
+gastrovascular
+gastrula
+gastrulate
+gastrulation
+gasworker
+gasworks
+gat
+gate
+gated
+gatefold
+gatehouse
+gatekeep
+gatekeeper
+gatekeeper's
+gatekeepers
+gatepost
+gates
+Gates
+gateshead
+gateway
+gateway's
+gateways
+gath
+Gatha
+gather
+gathered
+gatherer
+gatherers
+gathering
+gatherings
+gathers
+gating
+Gatlinburg
+gatling
+gator
+Gatsby
+gatsby
+gatt
+gauche
+gauchely
+gaucheness
+gaucherie
+gaucheries
+Gaucho
+gaud
+gauded
+gaudery
+gaudier
+gaudies
+gaudily
+gaudiness
+gauding
+gauds
+gaudy
+gauffer
+gauge
+gaugeable
+gaugeably
+gauged
+gaugeing
+gauger
+gauges
+gauging
+Gauguin
+gauhati
+Gaul
+Gaulish
+Gaulle
+Gaulle's
+Gaullism
+Gaullist
+Gaultheria
+gaum
+gaumless
+gaums
+gaunt
+gauntlet
+gauntleted
+Gauntley
+gauntley
+gauntly
+gauntness
+gauntry
+gaup
+gaur
+gauss
+gausses
+Gaussian
+gaussmeter
+Gautama
+gautama
+gautier
+gauze
+gauzed
+gauzelike
+gauzes
+gauzily
+gauziness
+gauzing
+gauzy
+gavage
+gave
+gavel
+gaveled
+gaveler
+gaveling
+gavial
+Gavin
+gavotte
+gavottes
+gawk
+gawker
+gawkier
+gawkily
+gawkish
+gawkishly
+gawkishness
+gawks
+gawky
+gawp
+gay
+gaya
+gayer
+gayest
+gayety
+Gaylor
+Gaylord
+gayly
+gayness
+Gaynor
+gayomart
+Gaza
+gazankulu
+gaze
+gazebo
+gazebo's
+gazebos
+gazed
+gazehound
+gazelle
+gazelles
+gazer
+gazers
+gazes
+gazette
+gazetted
+gazetteer
+gazetteers
+gazettes
+gazetting
+gaziantep
+gazing
+gazpacho
+gazpacho's
+gazump
+GCD
+gdynia
+GE
+gean
+geanticline
+gear
+gearbox
+geared
+gearing
+gearless
+gears
+gearshift
+gearwheel
+Geary
+geary
+geber
+gec
+gecko
+gedact
+gedanken
+Gedda
+gee
+geegaw
+geek
+geek's
+geeks
+geelong
+geese
+geest
+geezer
+gefilte
+Gegenschein
+Gehenna
+gehlenite
+Gehrig
+gehrig
+Geiger
+Geigy
+Geigy's
+Geisel
+geisha
+geishas
+Geissler
+gel
+gel's
+gelable
+gelada
+gelant
+gelate
+gelated
+gelates
+gelatin
+gelatine
+gelating
+gelatinizabilities
+gelatinizability
+gelatinizability's
+gelatinizable
+gelatinizable's
+gelatinizables
+gelatinization
+gelatinization's
+gelatinizations
+gelatinize
+gelatinized
+gelatinizer
+gelatinizers
+gelatinizes
+gelatinizing
+gelatinoid
+gelatinous
+gelatinously
+gelatinousness
+gelation
+geld
+Gelderland
+gelding
+geldings
+gelibolu
+gelid
+gelidity
+gelidly
+gelin
+gell
+gelled
+gelligaer
+gelling
+gels
+Gelsemium
+Gelsenkirchen
+gelt
+gem
+gem's
+Gemara
+gemeinschaft
+geminal
+geminally
+geminate
+geminately
+gemination
+Gemini
+Geminid
+gemlike
+Gemma
+gemmate
+gemmated
+gemmates
+gemmating
+gemmation
+gemming
+gemmiparous
+gemmulation
+gemmule
+gemology
+gemot
+gems
+gemsbok
+gemstone
+gemstone's
+gemstones
+gen
+genappe
+Gencer
+gendarme
+gendarmerie
+gender
+gender's
+gendered
+gendering
+genders
+Gendron
+gene
+gene's
+genealogical
+genealogically
+genealogies
+genealogist
+genealogists
+genealogy
+genera
+generable
+general
+general's
+generale
+generalism
+generalissimo
+generalist
+generalist's
+generalists
+generalities
+generality
+generalizability
+generalizable
+generalizable's
+generalizables
+generalization
+generalization's
+generalizational
+generalizations
+generalize
+generalized
+generalizer
+generalizers
+generalizes
+generalizing
+generally
+generalness
+generals
+generalship
+generalships
+generate
+generated
+generates
+generating
+generation
+generational
+generations
+generative
+generatively
+generator
+generator's
+generators
+generatrix
+generic
+generically
+genericness
+generosities
+generosity
+generosity's
+generous
+generously
+generousness
+genes
+Genesco
+genesis
+genet
+genetic
+genetical
+genetically
+geneticist
+geneticist's
+geneticists
+genetics
+Geneva
+Geneva's
+Genevan
+Genevieve
+Genevieve's
+Genf
+Genfersee
+Genghis
+genial
+geniality
+genialize
+genializes
+genially
+genialness
+genic
+genically
+geniculate
+geniculated
+geniculately
+genie
+genie's
+genies
+genii
+genip
+genipap
+genital
+genital's
+genitalia
+genitalic
+genitally
+genitals
+genitive
+genitive's
+genitives
+genitor
+genitourinary
+genius
+genius's
+geniuses
+genizah
+genk
+Genoa
+Genoa's
+genocidal
+genocide
+genocides
+Genoese
+genome
+genome's
+genomes
+genotype
+genotype's
+genotypes
+genotypic
+genotypical
+genotypically
+genotypicity
+Genova
+genre
+genre's
+genres
+genro
+gens
+genseric
+genstat
+gent
+genteel
+genteeler
+genteelest
+genteelism
+genteelize
+genteelizes
+genteelly
+genteelness
+gentian
+gentianaceous
+gentianella
+gentians
+gentile
+gentiles
+gentilesse
+gentility
+gentilization
+gentilization's
+gentilizations
+gentilize
+gentilizes
+gentle
+gentled
+gentlefolk
+gentlefolks
+gentleman
+gentlemanize
+gentlemanizes
+gentlemanlike
+gentlemanlikeness
+gentlemanliness
+gentlemanly
+gentlemen
+gentleness
+gentler
+gentlest
+gentlewoman
+gentlewomen
+gentlewomen's
+gentling
+gently
+Gentoo
+gentrice
+gentries
+gentrification
+gentry
+gents
+genu
+genuflect
+genuflected
+genuflecting
+genuflection
+genuflectory
+genuflects
+genuine
+genuinely
+genuineness
+genus
+geocentric
+geocentrically
+geocentricism
+geochemical
+geochemically
+geochemist
+geochemistry
+geochronologic
+geochronological
+geochronologically
+geochronologist
+geochronology
+geochronometric
+geochronometry
+geode
+geode's
+geodes
+geodesic
+geodesics
+geodesist
+geodesy
+geodetic
+geodetical
+geodetically
+geoduck
+geodynamics
+Geoff
+Geoff's
+Geoffrey
+Geoffrey's
+geognosy
+geographer
+geographer's
+geographers
+geographic
+geographical
+geographically
+geographies
+geography
+geohydrologic
+geohydrology
+geoid
+geologic
+geological
+geologist
+geologist's
+geologists
+geologize
+geologized
+geologizes
+geologizing
+geology
+geomagnetic
+geomagnetically
+geomagnetism
+geomancy
+geomantic
+geomechanics
+geometer
+geometer's
+geometers
+geometric
+geometrical
+geometrically
+geometrician
+geometricize
+geometricizes
+geometrid
+geometries
+geometrize
+geometrized
+geometrizes
+geometrizing
+geometry
+geomorphic
+geomorphological
+geomorphology
+geophagy
+geophysical
+geophysically
+geophysicist
+geophysicists
+geophysics
+geophyte
+geopolitic
+geopolitical
+geopolitically
+geopolitician
+geopolitics
+geoponic
+geoponics
+Geordie
+George
+George's
+Georges
+Georgetown
+Georgette
+Georgia
+Georgian
+Georgians
+georgic
+geoscience
+geosphere
+geostatic
+geostatics
+geostrategic
+geostrategist
+geostrategy
+geostrophic
+geostrophically
+geosynchronous
+geosyncline
+geotaxis
+geotectonic
+geothermal
+geothermally
+geothermic
+geotropic
+geotropically
+geotropism
+gera
+gerah
+Gerald
+Geraldine
+geraniaceous
+geranial
+geraniol
+geranium
+Gerard
+geratology
+Gerber
+gerbil
+gerent
+gerenuk
+gerfalcon
+Gerhard
+Gerhardt
+geriatric
+geriatrician
+geriatricians
+geriatrics
+geriatrist
+gerlachovka
+germ
+germ's
+German
+German's
+germander
+germane
+Germania
+germania
+Germanic
+germanicus
+Germanism
+germanium
+germanization
+germanization's
+germanizations
+germanize
+germanized
+germanizer
+germanizers
+germanizes
+germanizing
+Germanophile
+Germanophobe
+germanous
+Germans
+Germantown
+Germany
+Germany's
+germen
+germfree
+germicidal
+germicide
+germicides
+germier
+germinability
+germinal
+germinally
+germinant
+germinate
+germinated
+germinates
+germinating
+germination
+germinations
+germinative
+germinatively
+germiston
+germproof
+germs
+germy
+gerome
+Gerome
+gerona
+geronimo
+gerontic
+gerontocracy
+gerontological
+gerontologist
+gerontologists
+gerontology
+Gerry
+Gerry's
+gerrymander
+gerrymandered
+gerrymandering
+gers
+Gershwin
+Gershwins
+Gertrude
+gerund
+gerundial
+gerundive
+geryon
+gesellschaft
+gesso
+gest
+gestalt
+gestapo
+gestate
+gestated
+gestates
+gestating
+gestation
+gestation's
+gestational
+gestations
+gestatorial
+gesticulate
+gesticulated
+gesticulates
+gesticulating
+gesticulation
+gesticulations
+gesticulative
+gesticulatively
+gesticulator
+gesticulators
+gesticulatory
+gestural
+gesture
+gestured
+gestures
+gesturing
+gesualdo
+get
+getatable
+getaway
+getaways
+Gethsemane
+gets
+getter
+getter's
+gettered
+getters
+getting
+Getty
+Gettysburg
+getup
+getups
+Geum
+gewgaw
+gey
+geyser
+geysered
+geysering
+geyserite
+geysers
+gezira
+Ghana
+Ghanian
+Gharial
+Gharry
+ghastful
+ghastfully
+ghastlier
+ghastliness
+ghastly
+ghat
+ghats
+Ghaut
+ghazal
+ghazals
+Ghazi
+Ghazzah
+Gheber
+ghee
+Ghent
+Gherao
+gherkin
+gherkins
+ghetto
+ghettoization
+ghettoization's
+ghettoizations
+ghettoize
+ghettoized
+ghettoizes
+ghettoizing
+ghettos
+Ghiaurov
+Ghiberti
+Ghibli
+Ghillie
+Ghirlandaio
+Ghitalla
+ghost
+ghosted
+ghosting
+ghostlier
+ghostlike
+ghostliness
+ghostlinesses
+ghostly
+ghosts
+ghostwrite
+ghostwriter
+ghosty
+ghoul
+ghoulish
+ghoulishly
+ghoulishness
+ghouls
+Giacometti
+Giacomo
+giant
+giant's
+giantess
+gianthood
+gianthoods
+giantism
+giantisms
+giantize
+giantizes
+giantlike
+giants
+gib
+gibber
+gibbered
+gibberellic
+gibberellin
+gibbering
+gibberish
+gibbers
+gibbet
+gibbeted
+gibbeting
+gibbets
+gibbing
+gibbon
+gibbons
+gibbosity
+gibbous
+gibbously
+gibbousness
+Gibbs
+gibbsite
+Gibby
+gibby
+gibe
+gibeon
+Gibeonite
+giber
+gibes
+gibing
+giblet
+giblets
+gibli
+Gibraltar
+gibran
+Gibson
+Gibson's
+gid
+giddap
+giddied
+giddier
+giddily
+giddiness
+giddings
+Giddings
+giddy
+giddying
+gide
+Gideon
+gidgee
+gie
+Gielgud
+Gierek
+Giessen
+Gifford
+gift
+gifted
+giftedly
+giftedness
+gifts
+giftwrap
+gifu
+gig
+gig's
+gigabit
+gigabyte
+gigabytes
+gigacycle
+gigacycles
+gigahertz
+gigaherz
+gigantesque
+gigantic
+gigantically
+giganticness
+gigantism
+gigantisms
+gigantomachy
+gigavolt
+gigawatt
+gigging
+giggle
+giggled
+giggler
+giggles
+giggling
+gigglingly
+giggly
+gigli
+gigolo
+gigot
+gigots
+Gigout
+gigs
+gigue
+Gil
+Gil's
+gila
+gilbert
+Gilbertian
+Gilbertson
+Gilchrist
+Gilchrist's
+gild
+Gilda
+Gilda's
+gildas
+gilded
+gilder
+gilding
+gilds
+Gilead
+Gilead's
+Gileadite
+Gilels
+Giles
+gilet
+gilgai
+gilgamesh
+Gilkson
+gill
+gill's
+gilled
+giller
+Gillespie
+Gillette
+gillies
+Gilligan
+Gillingham
+gillion
+gillray
+gills
+gillyflower
+Gilmore
+Gilmore's
+gilolo
+gilsonite
+gilt
+gilthead
+gimbal
+gimbaled
+gimbaling
+gimbals
+Gimbel
+gimcrack
+gimcrackery
+gimel
+gimlet
+gimlet's
+gimlets
+gimmal
+gimme
+gimmick
+gimmick's
+gimmickry
+gimmicks
+gimmicky
+gimp
+gimpy
+gin
+gin's
+Gina
+Gina's
+ginger
+gingerbread
+gingered
+gingering
+gingerliness
+gingerly
+gingersnap
+gingery
+gingham
+ginghams
+gingiva
+gingivitis
+gingko
+gink
+ginkgo
+ginmill
+ginnel
+ginning
+Gino
+Gino's
+gins
+Ginsberg
+Ginsberg's
+Ginsburg
+Ginsburg's
+ginseng
+Gioconda
+gioconda
+Giorgio
+giorgione
+giotto
+Giovanni
+gip
+gipon
+Gippsland
+Gippy
+Gipsies
+Gipsy
+Gipsy's
+giraffe
+giraffe's
+giraffes
+giraffish
+giraldus
+girandole
+Giraud
+Giraudoux
+gird
+girded
+girder
+girder's
+girders
+girding
+girdle
+girdlecake
+girdled
+girdler
+girdles
+girdling
+girds
+girgenti
+girl
+girl's
+girlfriend
+girlfriend's
+girlfriends
+girlhood
+girlhoods
+girlie
+girlish
+girlishly
+girlishness
+girls
+girly
+girn
+giro
+gironde
+gironny
+girosol
+girt
+girth
+gisarme
+Gisborne
+Giscard
+gish
+gismo
+gismos
+gissing
+gist
+git
+gittern
+Giuliano
+Giuliano's
+Giulini
+Giulio
+Giuseppe
+Giuseppe's
+giusto
+givable
+give
+giveaway
+giveaways
+given
+givenness
+givens
+giver
+givers
+gives
+giveth
+giving
+givingly
+gizmo
+gizmo's
+gizmos
+gizzard
+gizzard's
+gizzards
+glabella
+glabrous
+glacial
+glacialist
+glacialize
+glacializes
+glacially
+glaciate
+glaciated
+glaciates
+glaciating
+glaciation
+glacier
+glacier's
+glaciers
+glaciologic
+glaciological
+glaciologist
+glaciology
+glacis
+glad
+gladbeck
+gladded
+gladden
+gladdened
+gladdening
+gladdens
+gladder
+gladdest
+gladding
+gladdon
+gladdy
+glade
+glades
+gladiate
+gladiator
+gladiatorial
+gladiators
+gladiola
+gladiolus
+gladly
+gladness
+gladrags
+gladsome
+gladsomely
+gladsomeness
+Gladstone
+glady
+Gladys
+Glagolitic
+glaikit
+glair
+glaive
+glamorgan
+glamorization
+glamorizations
+glamorize
+glamorized
+glamorizer
+glamorizers
+glamorizes
+glamorizing
+glamorless
+glamorous
+glamorously
+glamorousness
+glamour
+glamoured
+glamouring
+glamours
+glance
+glanced
+glances
+glancing
+glancingly
+gland
+gland's
+glandered
+glanders
+glandless
+glands
+glandular
+glandularly
+glandule
+glans
+glare
+glared
+glares
+glarier
+glaring
+glaringly
+glaringness
+glarus
+glary
+glaser
+Glasgow
+glass
+glassblower
+glassblowing
+glassed
+glasses
+glassful
+glasshouse
+glassier
+glassies
+glassily
+glassine
+glassiness
+glassless
+glassmaker
+glassmaking
+glassman
+glassware
+glasswork
+glassworker
+glassworks
+glasswort
+glassy
+glastonbury
+Glaswegian
+glauce
+glaucoma
+glauconite
+glaucous
+glaze
+glazed
+glazer
+glazers
+glazes
+glazier
+glaziers
+glaziery
+glazing
+Glazunov
+gleam
+gleamed
+gleaming
+gleams
+gleamy
+glean
+gleanable
+gleaned
+gleaner
+gleaning
+gleanings
+gleans
+Gleason
+glebe
+glee
+gleed
+gleeful
+gleefully
+gleefulness
+gleeman
+glees
+gleesome
+gleet
+gleiwitz
+glen
+glen's
+glencoe
+Glenda
+Glendale
+glendower
+Glengarry
+Glenn
+glenoid
+glenrothes
+glens
+gley
+glia
+gliadin
+glib
+glibber
+glibbest
+glibly
+glibness
+Glickman
+Glidden
+Glidden's
+glide
+glided
+glider
+gliders
+glides
+gliding
+glim
+glimmer
+glimmered
+glimmering
+glimmers
+glimpse
+glimpsed
+glimpser
+glimpsers
+glimpses
+glimpsing
+Glinka
+glint
+glinted
+glinting
+glints
+glioma
+glissade
+glissando
+glisten
+glistened
+glistening
+glistens
+glister
+glitch
+glitch's
+glitches
+glitter
+glittered
+glittering
+glitteringly
+glitters
+glittery
+gliwice
+gloam
+gloamed
+gloaming
+gloams
+gloat
+gloated
+gloater
+gloats
+glob
+global
+globalism
+globalist
+globalists
+globalization
+globalizations
+globalize
+globalized
+globalizes
+globalizing
+globally
+globals
+globate
+globe
+globe's
+globeflower
+globes
+globetrotter
+Globigerina
+globin
+globing
+globoid
+globose
+globular
+globularity
+globularly
+globularness
+globule
+globuliferous
+globulin
+globulins
+glochidium
+glockenspiel
+glogg
+glom
+glomerate
+glomeration
+glomerular
+glomerulate
+glomerule
+glomerulus
+glomma
+glommed
+glomming
+gloms
+gloom
+gloomier
+gloomily
+gloominess
+glooms
+gloomy
+Gloria
+Gloriana
+Gloriana's
+gloried
+glories
+glorification
+glorifications
+glorified
+glorifier
+glorifiers
+glorifies
+glorify
+Glorioso
+glorious
+gloriously
+gloriousness
+glory
+glorying
+gloss
+glossa
+glossarial
+glossaries
+glossarist
+glossary
+glossary's
+glossator
+glossectomy
+glossed
+glosseme
+glosses
+glossier
+glossies
+glossily
+glossiness
+glossing
+glossitis
+glossographer
+glossography
+glossolalia
+glossology
+glossopharyngeal
+glossy
+glottal
+glottalization
+glottalize
+glottalizes
+glottic
+glottis
+glottochronology
+Gloucester
+Gloucestershire
+glove
+gloved
+gloveless
+glover
+glovers
+gloves
+gloving
+glow
+glowed
+glower
+glowered
+glowering
+glowers
+glowing
+glowingly
+glows
+Gloxinia
+gloze
+glucagon
+glucinum
+Gluck
+glucocorticord
+gluconeogenesis
+gluconyl
+glucoprotein
+glucopyranosyl
+glucosamine
+glucose
+glucoside
+glucosuria
+glue
+glued
+glueing
+gluer
+gluers
+glues
+gluey
+gluily
+gluing
+glum
+glumaceous
+glume
+glumly
+glummer
+glummest
+glumness
+gluon
+glut
+glutamate
+glutamic
+glutamine
+glutathione
+gluteal
+glutelin
+gluten
+gluteus
+glutinous
+glutinously
+glutinousness
+gluts
+glutted
+glutting
+glutton
+glutton's
+gluttonize
+gluttonizes
+gluttonous
+gluttonously
+gluttonousness
+gluttons
+gluttony
+glyceric
+glyceride
+glycerin
+glycerinate
+glycerinated
+glycerine
+glycerinize
+glycerinizes
+glycerol
+glycerolize
+glycerolized
+glycerolizes
+glycerophosphate
+glyceryl
+glycine
+glycocholate
+glycocholates
+glycoconjugate
+glycoconjugates
+glycodeoxycholate
+glycodeoxycholates
+glycogen
+glycogenesis
+glycogenize
+glycogenizes
+glycol
+glycolic
+glycolipid
+glycolipids
+glycols
+glycolysis
+glyconeogenesis
+glycopeptide
+glycopeptides
+glycoprotein
+glycoproteins
+glycosidase
+glycosidases
+glycoside
+glycosidic
+glycosphingolipid
+glycosphingolipids
+glycosuria
+glycosyl
+glycosylate
+glycosylated
+glycosylates
+glycosylation
+glynn
+Glynn
+glyoxaline
+glyph
+glyphography
+glyptal
+glyptic
+glyptics
+glyptodont
+glyptography
+GM
+GMT
+gnarl
+gnarled
+gnarls
+gnarly
+gnash
+gnashes
+gnashing
+gnat
+gnat's
+gnatcatcher
+gnathic
+gnathion
+gnathite
+gnathonic
+gnats
+gnatty
+gnaw
+gnawed
+gnawer
+gnawing
+gnaws
+gneiss
+gneissic
+gnocchi
+gnome
+gnomelike
+gnomes
+gnomic
+gnomish
+gnomon
+gnomonic
+gnosis
+gnostic
+gnosticism
+gnosticize
+gnosticizer
+gnosticizers
+gnosticizes
+gnotobiotics
+GNP
+gnu
+gnus
+go
+goad
+goaded
+goading
+goads
+goal
+goal's
+goalie
+goalkeeper
+goalmouth
+goalpost
+goals
+goaltender
+goaltending
+goanna
+goat
+goat's
+goatee
+goatee's
+goatees
+goatfish
+goatherd
+goatish
+goatlike
+goats
+goatsbeard
+goatskin
+goatsucker
+gob
+gobbet
+Gobbi
+gobble
+gobbled
+gobbledegook
+gobbledygook
+gobbler
+gobblers
+gobbles
+gobbling
+Gobelin
+Gobi
+gobi
+Gobi's
+gobioid
+goblet
+goblet's
+goblets
+goblin
+goblin's
+goblins
+gobo
+gobstopper
+goby
+god
+god's
+godard
+godavari
+godchild
+goddamn
+goddamned
+Goddard
+Goddard's
+goddaughter
+godded
+goddess
+goddess's
+goddesses
+godding
+goddize
+goddizes
+godefroy
+goderich
+Godesberg
+Godetia
+godfather
+godforsaken
+Godfrey
+Godfrey's
+godhead
+godhood
+Godiva
+godkin
+godless
+godlessness
+godlier
+godlike
+godlikeness
+godliness
+godling
+godly
+godmother
+godmother's
+godmothers
+Godolphin
+godot
+Godot
+godown
+godparent
+godroon
+gods
+godsend
+godsends
+godson
+Godspeed
+Godthaab
+Godunov
+Godwin
+Godwin's
+godwit
+Godzilla
+Godzilla's
+Goebbels
+goer
+goering
+goes
+Goethe
+goethite
+Goff
+Goff's
+gog
+gogga
+goggle
+gogglebox
+goggled
+goggler
+gogglers
+goggles
+goggling
+goggly
+Gogh
+goglet
+gogo
+gogol
+gogra
+Goidel
+going
+goings
+goiter
+goiters
+goitrogen
+goitrogenic
+Golconda
+gold
+Golda
+golda
+goldarn
+goldbeater
+goldbeating
+Goldberg
+goldbrick
+goldbug
+goldcrest
+golden
+goldeneye
+goldenly
+goldenness
+goldenrod
+goldenseal
+goldeye
+Goldfield
+goldfinch
+goldfish
+goldilocks
+golding
+Goldman
+Goldmark
+goldoni
+golds
+goldschmidt
+goldsmith
+goldsmiths
+Goldstein
+Goldstein's
+Goldstine
+Goldstine's
+goldthread
+Goldwater
+golem
+Goleta
+Goleta's
+golf
+golfer
+golfers
+golfing
+golfs
+Golgi
+Golgotha
+goliard
+goliardery
+Goliath
+golliwog
+gollop
+golly
+goloshes
+Gomberg
+gombroon
+gomel
+gomez
+Gomez
+gomorrah
+gompers
+gomphosis
+gomulka
+gomuti
+gonad
+gonad's
+gonadal
+gonadotropic
+gonadotropin
+gonads
+goncourt
+Gond
+gondar
+Gondi
+gondola
+gondolas
+gondolier
+gondoliers
+Gondwanaland
+gone
+goner
+gonfalon
+gonfalonier
+gong
+gong's
+gongola
+Gongorism
+gongs
+gonidium
+goniometer
+gonion
+gonk
+gonna
+gonococcus
+gonocyte
+gonof
+gonophore
+gonopore
+gonorrhea
+gonorrheal
+Gonzales
+Gonzalez
+goo
+goober
+good
+goodbye
+goodbye's
+goodbyes
+Goode
+Goode's
+goodie
+goodie's
+goodies
+goodish
+goodly
+Goodman
+goodness
+goodnight
+Goodrich
+goods
+goodwife
+goodwill
+Goodwin
+goody
+goody's
+Goodyear
+gooey
+goof
+goofball
+goofed
+goofier
+goofily
+goofiness
+goofing
+goofs
+goofy
+googly
+googol
+googolplex
+gook
+goole
+goon
+gooney
+Goop
+goosander
+goose
+gooseberry
+gooseflesh
+goosefoot
+goosegog
+goosegrass
+gooseneck
+goosenecked
+gooses
+goosey
+goosing
+goosy
+GOP
+gopak
+gopher
+gophers
+gorakhpur
+goral
+gorbals
+gorblimey
+Gorcock
+Gordian
+Gordon
+gore
+gored
+Goren
+Goren's
+goreng
+gores
+gorge
+gorgeous
+gorgeously
+gorgeousness
+gorger
+gorgerin
+gorges
+gorget
+gorgias
+gorging
+gorgon
+gorgoneion
+gorgonian
+gorgonize
+gorgonized
+gorgonizes
+gorgonizing
+Gorgonzola
+gorgously
+Gorham
+gorica
+gorier
+gorilla
+gorilla's
+gorillas
+goring
+gorizia
+Gorki
+Gorky
+Gorlovka
+gormandize
+gormandized
+gormandizer
+gormandizes
+gormandizing
+gormless
+gorse
+gorsedd
+Gorton
+Gorton's
+gory
+gosh
+goshawk
+Goshen
+gosling
+gospel
+gospeler
+gospelers
+gospelize
+gospelizes
+gospels
+Gosplan
+gosport
+gossamer
+gossamery
+gosse
+gossip
+gossiped
+gossiper
+gossipers
+gossiping
+gossipmonger
+gossipmongers
+gossipry
+gossips
+gossipy
+gossoon
+goster
+got
+gotama
+gotcha
+gotcha's
+gotchas
+goth
+Goth
+Gotha
+Gotham
+Gothenburg
+Gothic
+Gothically
+Gothicism
+Gothicize
+Gothicized
+Gothicizer
+Gothicizers
+Gothicizes
+Gothicizing
+Gotland
+goto
+gotta
+gotten
+Gottfried
+Gottfried's
+gouache
+goucher
+Goucher
+gouda
+Gouda's
+gouge
+gouged
+gouger
+gouges
+gouging
+goulash
+Gould
+Gould's
+Gounod
+gourami
+gourd
+gourde
+gourmand
+gourmand's
+gourmandism
+gourmandize
+gourmandized
+gourmandizes
+gourmandizing
+gourmands
+gourmet
+gourmets
+gourmont
+gout
+goutweed
+gouty
+govern
+governable
+governance
+governed
+governess
+governesses
+governessy
+governing
+government
+government's
+governmental
+governmentalism
+governmentalist
+governmentalize
+governmentalized
+governmentalizes
+governmentalizing
+governmentally
+governments
+governor
+governor's
+governorate
+governorates
+governors
+governorship
+governs
+gowan
+gower
+gowk
+gown
+gowned
+gowns
+gowon
+goy
+Goya
+goyish
+goys
+GPO
+GPSS
+Graafian
+grab
+grabbed
+grabber
+grabber's
+grabbers
+grabbier
+grabbing
+grabbings
+grabble
+grabbled
+grabbler
+grabbles
+grabbling
+grabby
+Graben
+grabs
+Gracchus
+grace
+graced
+graceful
+gracefully
+gracefulness
+graceless
+gracelessly
+gracelessness
+graces
+gracie
+Gracie
+gracile
+gracileness
+gracility
+gracing
+gracioso
+gracious
+graciously
+graciousness
+grackle
+grad
+gradable
+gradate
+gradated
+gradates
+gradating
+gradation
+gradation's
+gradational
+gradationally
+gradations
+grade
+graded
+gradeless
+gradely
+grader
+graders
+grades
+gradient
+gradient's
+gradients
+grading
+gradings
+gradiometer
+gradiometer's
+gradiometers
+grads
+gradual
+gradualism
+gradualist
+gradualists
+gradually
+gradualness
+graduand
+graduate
+graduated
+graduates
+graduating
+graduation
+graduations
+graduator
+gradus
+Grady
+Graeae
+graecism
+Graff
+Graff's
+graffiti
+graffito
+Graffman
+graft
+graftage
+grafted
+grafter
+grafting
+grafton
+Grafton
+grafts
+graham
+graham's
+grahame
+grahams
+graiae
+Graian
+grail
+grails
+grain
+grained
+grainer
+grainger
+grainier
+graininess
+graining
+grains
+grainy
+grallatorial
+gram
+gram's
+grama
+gramarye
+gramercy
+gramicidin
+gramineous
+graminivorous
+grammar
+grammar's
+grammarian
+grammarians
+grammars
+grammatic
+grammatical
+grammaticality
+grammatically
+grammaticalness
+grammaticize
+grammaticizes
+grammatology
+gramophone
+gramophone's
+gramophones
+grampian
+gramps
+grampus
+grams
+granada
+granadilla
+granados
+granaries
+granary
+granary's
+grand
+grandad
+grandaddy
+grandam
+grandame
+grandaunt
+grandchild
+grandchildren
+granddad
+granddaughter
+granddaughters
+grande
+grandee
+grander
+grandest
+grandeur
+grandfather
+grandfather's
+grandfatherly
+grandfathers
+grandiloquence
+grandiloquent
+grandiloquently
+grandiose
+grandiosely
+grandioseness
+grandiosity
+grandioso
+grandkid
+grandkid's
+grandkids
+grandly
+grandma
+grandma's
+grandmaster
+grandmasters
+grandmother
+grandmother's
+grandmotherly
+grandmothers
+grandnephew
+grandnephews
+grandness
+grandniece
+grandnieces
+grandpa
+grandpa's
+grandparent
+grandparental
+grandparenthood
+grandparents
+grandpas
+grands
+grandsire
+grandsires
+grandson
+grandson's
+grandsons
+grandstand
+grandstanded
+grandstander
+grandstanding
+grandstands
+granduncle
+granduncles
+grange
+grangemouth
+granger
+grangerism
+grangerize
+grangerized
+grangerizer
+grangerizes
+grangerizing
+granges
+granicus
+granite
+graniteware
+granitic
+granitite
+granitization
+granitization's
+granitizations
+granitize
+granitizes
+granivorous
+grannies
+granny
+granodiorite
+granola
+granolith
+granophyre
+grant
+grant's
+granta
+grantable
+granted
+grantee
+granter
+Granth
+granting
+grantor
+grants
+grantsman
+grantsmanship
+granular
+granularity
+granularly
+granulate
+granulated
+granulates
+granulating
+granulation
+granulations
+granulative
+granulator
+granule
+granules
+granulite
+granulitic
+granulize
+granulizes
+granulocyte
+granulocytes
+granulocytic
+granuloma
+granulose
+Granville
+grape
+grape's
+grapefruit
+grapes
+grapeshot
+grapevine
+grapevine's
+grapevines
+graph
+graph's
+graphed
+grapheme
+graphemic
+graphemically
+graphemics
+graphic
+graphical
+graphically
+graphicness
+graphics
+graphing
+graphite
+graphitic
+graphitizable
+graphitization
+graphitization's
+graphitizations
+graphitize
+graphitizes
+graphological
+graphologist
+graphology
+graphomotor
+graphophone
+graphs
+grapier
+grapnel
+grappa
+grappelli
+grapple
+grappled
+grappler
+grapples
+grappling
+graptolite
+grapy
+gras
+grasmere
+grasp
+graspable
+grasped
+grasper
+grasping
+graspingly
+graspingness
+grasps
+grass
+grassed
+grassers
+grasses
+grassfinch
+grasshook
+grasshopper
+grasshopper's
+grasshoppers
+grassier
+grassiest
+grassing
+grassland
+grasslands
+grasslike
+grassquit
+grassroot
+grassroots
+grassy
+grata
+grate
+grated
+grateful
+gratefully
+gratefulness
+grater
+grates
+gratian
+graticule
+gratification
+gratifications
+gratified
+gratify
+gratifying
+gratifyingly
+gratin
+grating
+gratingly
+gratings
+gratis
+gratitude
+grattan
+gratuities
+gratuitous
+gratuitously
+gratuitousness
+gratuity
+gratuity's
+gratulate
+gratulating
+graupel
+grav
+gravamen
+grave
+gravel
+graveled
+graveless
+graveling
+gravelly
+gravels
+gravely
+graven
+graveness
+gravenhage
+graver
+gravers
+graves
+gravesend
+gravest
+gravestone
+gravestones
+gravettian
+graveyard
+graveyards
+gravid
+gravidity
+gravidly
+gravidness
+gravies
+gravimeter
+gravimeter's
+gravimeters
+gravimetric
+gravimetrical
+gravimetrically
+gravimetry
+graving
+gravitate
+gravitated
+gravitates
+gravitating
+gravitation
+gravitational
+gravitationally
+gravitations
+gravitative
+gravities
+gravitometer
+gravitometer's
+gravitometers
+graviton
+graviton's
+gravitons
+gravity
+gravure
+gravy
+gray
+graybeard
+graybeards
+grayed
+grayer
+grayest
+graying
+grayish
+grayling
+graylings
+grayly
+grayness
+grays
+Grayson
+graywacke
+graz
+grazable
+graze
+grazeable
+grazed
+grazer
+grazes
+grazier
+graziers
+grazing
+grease
+greased
+greaseless
+greasepaint
+greasepaints
+greaseproof
+greaser
+greasers
+greases
+greasewood
+greasier
+greasily
+greasiness
+greasing
+greasy
+great
+greatcoat
+greatcoated
+greatcoats
+greaten
+greatened
+greatening
+greater
+greatest
+greathearted
+greatheartedly
+greatheartedness
+greatly
+greatness
+greats
+greave
+greaves
+grebe
+Grecian
+Grecianize
+Grecianizes
+Grecism
+grecize
+grecized
+grecizing
+gree
+Greece
+greed
+greedier
+greedily
+greediness
+greedy
+greegree
+Greek
+Greek's
+Greekize
+Greekizes
+Greeks
+greeley
+green
+Green
+greenaway
+greenback
+greenbacker
+greenbackism
+greenbelt
+Greenberg
+Greenblatt
+greenbottle
+Greenbriar
+greenbrier
+Greene
+Greene's
+greened
+greener
+greenery
+greenest
+Greenfeld
+Greenfield
+greenfinch
+greenfly
+greengage
+greengrocer
+greengrocery
+Greenham
+greenhead
+greenheart
+greenhorn
+greenhouse
+greenhouse's
+greenhouses
+greening
+greenish
+greenishness
+Greenland
+greenlet
+greenling
+greenly
+greenness
+greenock
+greenockite
+Greenpeace
+Greenpeace's
+greenroom
+greens
+greensand
+Greensboro
+greenshank
+greensickness
+greenstick
+greenstone
+greenstuff
+Greensville
+greensward
+Greentree
+greentree
+Greenville
+greenware
+Greenwich
+greenwood
+greeny
+Greer
+Greer's
+greet
+greeted
+greeter
+greeting
+greetings
+greets
+Greg
+Greg's
+gregarine
+gregarinian
+gregarious
+gregariously
+gregariousness
+Gregg
+Gregorian
+Gregory
+greige
+Greisen
+gremial
+gremlin
+gremlin's
+gremlins
+gremmie
+gremmies
+gremmy
+Grenada
+grenade
+grenade's
+grenades
+grenadier
+grenadine
+Grenadines
+Grendel
+grenier
+Grenier
+Grenoble
+Grenville
+grep
+Gresham
+Gresham's
+gressorial
+Greta
+Gretchen
+Gretel
+Gretel's
+Gretna
+greuze
+grew
+grewsome
+grey
+greyback
+greybeard
+greyest
+greyhen
+greyhound
+greying
+greylag
+greystones
+greywacke
+gribble
+grid
+grid's
+griddle
+griddlecake
+gridfile
+gridfiles
+gridiron
+gridlock
+gridlock's
+grids
+grief
+grief's
+griefless
+griefs
+Grieg
+Grierson
+grievance
+grievance's
+grievances
+grievant
+grieve
+grieved
+griever
+grievers
+grieves
+grieving
+grievingly
+grievous
+grievously
+grievousness
+Griffe
+griffin
+Griffith
+Griffiths
+Griffon
+Grig
+Grigioni
+Grignard
+Grikwa
+grill
+grillage
+grille
+grilled
+griller
+grilling
+grillparzer
+grillroom
+grills
+grillwork
+grilse
+grim
+grimace
+grimaced
+grimacer
+grimaces
+grimacing
+Grimaldi
+Grimaldi's
+grimalkin
+grime
+grimed
+grimes
+grimier
+grimines
+griming
+grimly
+Grimm
+grimmer
+grimmest
+grimness
+grimsby
+grimy
+grin
+Grinch
+Grinch's
+grind
+Grindelia
+grindelwald
+grinder
+grinders
+grindery
+grinding
+grindingly
+grindings
+grinds
+grindstone
+grindstone's
+grindstones
+gringo
+gringos
+grinned
+grinner
+grinning
+grinningly
+grins
+grip
+gripe
+griped
+griper
+gripes
+griping
+grippe
+gripped
+gripper
+gripper's
+grippers
+gripping
+grippingly
+grippy
+grips
+Griqua
+Griqualand
+Gris
+gris
+grisaille
+griseofulvin
+griseous
+grisette
+grishun
+griskin
+grisliness
+grisly
+Grison
+grisons
+grist
+gristle
+gristlier
+gristliness
+gristly
+gristmill
+Griswold
+Griswold's
+grit
+grit's
+grith
+grits
+gritted
+grittier
+grittily
+grittiness
+gritting
+gritty
+grivation
+grivet
+grizzle
+grizzled
+grizzles
+grizzlier
+grizzling
+grizzly
+groan
+groaned
+groaner
+groaners
+groaning
+groans
+groat
+groats
+grocer
+grocer's
+groceries
+grocers
+grocery
+grockle
+grodno
+grog
+groggier
+groggily
+grogginess
+groggy
+grogram
+grogshop
+groin
+grok
+grokked
+grokking
+groks
+Grolier
+grommet
+gromyko
+groningen
+groom
+groom's
+groomed
+groomer
+grooming
+grooms
+groomsman
+groomsmen
+Groot
+groot
+groove
+grooved
+groover
+grooves
+groovier
+grooving
+groovy
+grope
+groped
+groper
+gropes
+groping
+gropius
+gros
+grosbeak
+groschen
+grosgrain
+gross
+grosse
+grossed
+grosser
+grosses
+grossest
+Grosset
+grosseteste
+grossing
+grossly
+Grossman
+grossness
+grossular
+grossularite
+grosswardein
+Grosvenor
+grosz
+grot
+grote
+grotesque
+grotesquely
+grotesqueness
+grotesquerie
+grotesquery
+grotius
+Groton
+grotto
+grotto's
+grottoes
+grottos
+grouch
+grouch's
+grouched
+grouches
+grouchier
+grouchily
+grouchiness
+grouching
+grouchy
+ground
+groundage
+grounded
+grounder
+grounders
+groundhog
+groundhog's
+groundhogs
+grounding
+groundless
+groundlessly
+groundlessness
+groundling
+groundmass
+groundnut
+groundout
+grounds
+groundsel
+groundsheet
+groundsill
+groundskeep
+groundskeepers
+groundsman
+groundspeed
+groundswell
+groundwater
+groundwork
+group
+group's
+groupable
+grouped
+grouper
+groupie
+groupie's
+groupies
+grouping
+groupings
+groupoid
+groups
+groupwork
+grouse
+groused
+grouser
+grouses
+grousing
+grout
+grouted
+grouter
+grouting
+grouts
+grouty
+grove
+grovel
+groveled
+groveler
+grovelers
+grovelike
+groveling
+grovelingly
+grovels
+grover
+grovers
+groves
+grovet
+grow
+grower
+growers
+growing
+growingly
+growl
+growled
+growler
+growlier
+growliness
+growling
+growlingly
+growls
+growly
+grown
+grownup
+grownup's
+grownups
+grows
+growth
+growths
+groyne
+grozing
+grozny
+grub
+grub's
+grubber
+grubbier
+grubbily
+grubbiness
+grubbing
+grubby
+grubs
+grubstake
+grubstaker
+grudge
+grudge's
+grudged
+grudger
+grudges
+grudging
+grudgingly
+gruel
+grueled
+grueler
+gruelers
+grueling
+gruelingly
+gruesome
+gruesomely
+gruesomeness
+gruff
+gruffly
+gruffness
+grugru
+grumble
+grumbled
+grumbler
+grumbles
+grumbling
+grumblingly
+grumbly
+Grumman
+grummet
+grumous
+grump
+grumped
+grumpier
+grumpily
+grumpiness
+grumping
+grumps
+grumpy
+Grundheber
+grundy
+grunion
+grunt
+grunted
+grunter
+grunting
+gruntle
+gruntled
+gruntles
+gruntling
+grunts
+Grus
+grusky
+Grusky
+Gruyere
+gryphon
+grysbok
+GSA
+gtad
+GU
+guacamole
+guacharo
+guaco
+guadalajara
+guadalcanal
+guadalquivir
+guadalupe
+Guadalupe
+Guadeloupe
+guadiana
+guaiacum
+Guam
+guan
+guanabara
+guanaco
+guanajuato
+guanase
+guanidine
+guanine
+guano
+guanosine
+Guarani
+guarantee
+guaranteed
+guaranteeing
+guaranteer
+guaranteers
+guarantees
+guarantor
+guaranty
+guard
+guardafui
+guardant
+guarded
+guardedly
+guardedness
+guarder
+guardhouse
+Guardia
+guardian
+guardian's
+guardians
+guardianship
+guarding
+guardrail
+guardroom
+guards
+guardsman
+guarneri
+Guatemala
+Guatemalan
+guava
+guayaquil
+guayule
+gubbins
+gubernatorial
+guck
+gudeance
+gudgeon
+gudrun
+guelders
+Guelph
+guenon
+Guenther
+Guenther's
+guerdon
+guerilla
+Guerin
+Guernica
+Guernsey
+guernsey
+guernseys
+Guerrero
+guerrilla
+guerrilla's
+guerrillas
+guess
+guessed
+guesser
+guesses
+guessing
+guesstimate
+guesswork
+guest
+guest's
+guested
+guesthouse
+guesting
+guests
+Guevara
+guff
+guffaw
+guffaws
+Guggenheim
+guggle
+guggled
+guggles
+guggling
+Guhleman
+guhleman
+Guiana
+guidable
+guidance
+guidances
+guide
+guidebook
+guidebook's
+guidebooks
+guided
+guideline
+guideline's
+guidelines
+guidepost
+guideposts
+guider
+guides
+guideway
+guiding
+Guido
+guidon
+guienne
+guignol
+guild
+guilder
+Guildford
+guildhall
+guildship
+guildsman
+guile
+guileful
+guilefully
+guilefulness
+guileless
+guilelessly
+guilelessness
+Guilford
+Guilford's
+Guillaume
+guillemot
+guilloche
+guillotine
+guillotine's
+guillotined
+guillotines
+guillotining
+Guillou
+guilt
+guiltier
+guiltiest
+guiltily
+guiltiness
+guiltless
+guiltlessly
+guiltlessness
+guilts
+guilty
+guimet
+guimpe
+Guinea
+guinea
+guineas
+Guinevere
+Guinevere's
+Guinness
+guipure
+guisard
+guiscard
+guise
+guise's
+guised
+guises
+guising
+guitar
+guitar's
+guitarfish
+guitarist
+guitarists
+guitars
+guizot
+Gujarat
+Gujarati
+gujranwala
+gul
+gulag
+gulags
+gular
+gulbenkian
+gulch
+gulch's
+gulches
+gulden
+gules
+gulf
+gulf's
+gulfs
+gulfweed
+gull
+gullable
+Gullah
+gulled
+gullet
+gullets
+gullibility
+gullible
+gullibly
+gullied
+gullies
+gulling
+gulls
+gully
+gully's
+gullying
+gulosity
+gulp
+gulped
+gulper
+gulps
+gum
+gum's
+gumbo
+gumboil
+gumdrop
+gumdrop's
+gumdrops
+gumma
+gummatous
+gummed
+gummer
+gummier
+gumminess
+gumming
+gummite
+gummosis
+gummous
+gummy
+gumption
+gums
+gumshield
+gumshoe
+gumtree
+gun
+gun's
+gunboat
+guncotton
+Gunderson
+gundog
+gunfight
+gunfighter
+gunfights
+gunfire
+gunfires
+gunflint
+gunge
+gunk
+gunky
+gunlock
+gunman
+gunmen
+gunmetal
+gunnar
+Gunnar
+gunned
+gunnel
+gunner
+gunner's
+gunners
+gunnery
+gunning
+gunny
+gunnysack
+gunpaper
+gunplay
+gunpoint
+gunpowder
+gunpowders
+gunpowdery
+gunrunner
+gunrunning
+guns
+gunsel
+gunship
+gunshot
+gunsling
+gunslinger
+gunslinging
+gunsmith
+gunstock
+gunter
+Gunther
+Gunther's
+guntur
+gunwale
+gunyah
+guppies
+guppy
+gur
+gurdwara
+gurgitation
+gurgle
+gurgled
+gurgles
+gurglet
+gurgling
+gurjun
+Gurkha
+Gurkha's
+gurkhali
+Gurmukhi
+gurnard
+gurney
+gurneys
+guru
+guru's
+gurus
+Gurzenich
+Gus
+gush
+gushed
+gusher
+gushes
+gushier
+gushily
+gushiness
+gushing
+gushy
+gusset
+gussets
+gust
+gust's
+Gustafson
+Gustafson's
+gustation
+gustative
+gustativeness
+gustatorial
+gustatorially
+gustatorily
+gustatory
+Gustav
+Gustav's
+Gustave
+Gustave's
+gustavo
+Gustavus
+gustily
+gustiness
+gusto
+gustoes
+gusts
+gusty
+gut
+gutbucket
+Gutenberg
+Guthrie
+guthrun
+gutless
+gutlessness
+guts
+gutser
+gutsier
+gutsiness
+gutsy
+gutta
+guttate
+guttation
+gutted
+gutter
+guttered
+guttering
+gutters
+guttersnipe
+guttersnipish
+guttier
+gutting
+guttural
+gutturalism
+gutturalization
+gutturalization's
+gutturalizations
+gutturalize
+gutturalized
+gutturalizes
+gutturalizing
+gutturalness
+gutty
+guv
+guy
+guy's
+Guyana
+guyed
+guyenne
+guyer
+guyers
+guying
+guyot
+guys
+guzzle
+guzzled
+guzzler
+guzzles
+guzzling
+gwalior
+gwelo
+Gwen
+gwent
+Gwyn
+Gwyn's
+gwynedd
+gwyniad
+gyani
+gybe
+gym
+gymkhana
+gymnasiarch
+gymnasiast
+gymnasium
+gymnasium's
+gymnasiums
+gymnast
+gymnast's
+gymnastic
+gymnastically
+gymnastics
+gymnasts
+gymnosophist
+gymnosperm
+gyms
+gymslip
+gynaeceum
+gynaecocracy
+gynaecoid
+gynaecomastia
+gynandrous
+gynarchy
+gynecium
+gynecocrat
+gynecocratic
+gynecologic
+gynecological
+gynecological's
+gynecologicals
+gynecologics
+gynecologies
+gynecologist
+gynecologist's
+gynecologists
+gynecology
+gynecology's
+gyniatrics
+gynophore
+gyp
+gypping
+gypseous
+gypsied
+gypsies
+gypsite
+Gypsophila
+gypsum
+gypsy
+gypsy's
+gypsying
+gyral
+gyrate
+gyrated
+gyrates
+gyrating
+gyration
+gyrational
+gyrations
+gyrator
+gyrators
+gyratory
+gyre
+gyrene
+gyrfalcon
+gyro
+gyrocompass
+gyrofrequency
+gyromagnetic
+gyron
+gyronny
+gyroplane
+gyros
+gyroscope
+gyroscope's
+gyroscopes
+gyroscopic
+gyroscopically
+gyrose
+gyrostabilizer
+gyrostat
+gyrostatic
+gyrostatics
+gyve
+h's
+ha
+Haag
+Haag's
+Haas
+habeas
+haberdasher
+haberdasheries
+haberdashery
+Haberman
+Haberman's
+Habib
+Habib's
+habiles
+habiliment
+habilitate
+habilitated
+habilitates
+habilitating
+habilitation
+habilitations
+habit
+habit's
+habitability
+habitable
+habitableness
+habitably
+habitant
+habitants
+habitat
+habitat's
+habitation
+habitation's
+habitations
+habitats
+habits
+habitual
+habitualize
+habitualizes
+habitually
+habitualness
+habituate
+habituated
+habituates
+habituating
+habituation
+habitude
+habitudes
+habitus
+Habsburg
+habu
+hac
+hachure
+hacienda
+haciendas
+hack
+hackamore
+hackberry
+hackbut
+hacked
+hacker
+hacker's
+hackers
+Hackett
+hacking
+hackle
+hackled
+hackler
+hackles
+hackling
+hackmatack
+hackney
+hackneyed
+hackneying
+hackneys
+hacks
+hacksaw
+hacksaws
+hackstaff
+hackwork
+had
+hadal
+Hadamard
+hadaway
+Haddad
+Haddad's
+Haddington
+haddix
+haddock
+haddocks
+hade
+hades
+Hades
+hadhramaut
+Hadith
+hadj
+hadji
+Hadley
+Hadley's
+hadn't
+Hadrian
+hadron
+hadrosaur
+hadst
+hae
+haecceity
+haeckel
+haem
+haemachrome
+haemacytometer
+haemagglutinate
+haemagglutinin
+haemagogue
+haemal
+haematein
+haematemesis
+haematic
+haematin
+haematinic
+haematite
+haematoblast
+haematocele
+haematocrit
+haematocryal
+haematogenesis
+haematogenous
+haematoid
+haematological
+haematology
+haematolysis
+haematoma
+haematopoiesis
+haematosis
+haematothermal
+haematoxylin
+Haematoxylon
+haematozoon
+haematuria
+haemic
+haemin
+haemochrome
+haemocoel
+haemocyanin
+haemocyte
+haemocytometer
+haemodialysis
+haemoflagellate
+haemoglobin
+haemoglobinuria
+haemoid
+haemolysin
+haemolysis
+haemophile
+haemophilia
+haemophiliac
+haemophilic
+haemopoiesis
+haemoptysis
+haemorrhage
+haemorrhagic
+haemorrhoidectomy
+haemorrhoids
+haemostasis
+haemostat
+haemostatic
+haeres
+hafiz
+Hafiz
+hafnium
+haft
+haftarah
+hag
+hagar
+hagbut
+Hagegard
+Hagen
+hagen
+Hagen's
+Hager
+Hager's
+hagfish
+haggadah
+haggadic
+haggadist
+haggadistic
+haggai
+haggard
+haggardly
+haggardness
+haggis
+haggish
+haggle
+haggled
+haggler
+haggles
+haggling
+hagiarchy
+hagiocracy
+Hagiographa
+hagiographer
+hagiographies
+hagiography
+hagiography's
+hagiolatry
+hagiology
+hagioscope
+Hagstrom
+Hagstrom's
+Hague
+hah
+Hahn
+Hahn's
+hahnemann
+Haida
+haidar
+Haifa
+haig
+haik
+haiku
+hail
+haile
+hailed
+hailer
+hailing
+hails
+hailstone
+hailstorm
+Hainan
+hainaut
+Haines
+haiphong
+hair
+hair's
+hairball
+hairbreadth
+hairbrush
+haircloth
+haircut
+haircut's
+haircuts
+haircutter
+haircutting
+hairdo
+hairdos
+hairdresser
+hairdresser's
+hairdressers
+hairdressing
+haired
+hairgrip
+hairier
+hairif
+hairiness
+hairless
+hairlessness
+hairlike
+hairline
+hairnet
+hairpiece
+hairpin
+hairs
+hairsbreadth
+hairsplitter
+hairsplitting
+hairspring
+hairspring's
+hairsprings
+hairstreak
+hairstyle
+hairstyle's
+hairstyles
+hairstyling
+hairstylist
+hairtail
+hairweaving
+hairworm
+hairy
+Haiti
+Haitian
+Haitink
+hajj
+hake
+Hakea
+hakim
+hakluyt
+hakodate
+Hal
+halafian
+halakah
+halal
+halation
+halberd
+halberdier
+halcyon
+halcyone
+haldane
+hale
+haleakala
+haler
+halesowen
+Haley
+Haley's
+half
+halfback
+halfbacks
+halfbeak
+halfhearted
+halfheartedly
+halfheartedness
+halfness
+halfpennies
+halfpenny
+halftime
+halftone
+halfway
+halfwit
+halfword
+halfword's
+halfwords
+halibut
+halibuts
+halicarnassus
+halide
+halides
+halidom
+Halifax
+haling
+halite
+halitosis
+hall
+hall's
+hallah
+hallam
+Hallamshire
+Halle
+hallel
+hallelujah
+hallelujahs
+haller
+Halley
+Halley's
+halliard
+halliards
+hallinan
+Hallinan
+hallmark
+hallmark's
+hallmarked
+hallmarking
+hallmarks
+hallo
+halloo
+halloos
+hallow
+hallowed
+Halloween
+hallowing
+Hallowmas
+hallows
+halls
+Hallstatt
+halluces
+hallucinate
+hallucinated
+hallucinates
+hallucinating
+hallucination
+hallucinational
+hallucinations
+hallucinative
+hallucinatory
+hallucinogen
+hallucinogenic
+hallucinogens
+hallucinosis
+hallux
+hallway
+hallway's
+hallways
+halm
+halma
+halmahera
+halmstad
+halo
+halobiont
+halocarbon
+halocline
+haloes
+halogen
+halogenate
+halogenation
+halogenous
+halogens
+haloid
+halomorphic
+halomorphism
+halophyte
+halos
+halothane
+Halpern
+halpern
+hals
+Halsey
+Halsey's
+Halstead
+Halstead's
+halt
+halted
+haltemprice
+halter
+haltere
+haltered
+haltering
+halters
+halting
+haltingly
+halts
+halvah
+halve
+halved
+halvers
+Halverson
+Halverson's
+halves
+halving
+halyard
+ham
+ham's
+hama
+hamadryad
+hamadryas
+Hamal
+Hamal's
+hamamatsu
+hamamelidaceous
+hamate
+hambletonian
+Hamburg
+hamburger
+hamburger's
+hamburgers
+hame
+hamelin
+hameln
+hamersley
+hamey
+Hamey
+hamhung
+hamilcar
+Hamilton
+Hamiltonian
+Hamiltonians
+Hamite
+Hamitic
+hamlet
+hamlet's
+hamletization
+hamletization's
+hamletizations
+hamletize
+hamletizes
+hamlets
+Hamlin
+Hamlin's
+hamm
+hammer
+hammered
+hammerer
+hammerfest
+hammerhead
+hammering
+hammerless
+hammerlock
+hammers
+hammersmith
+hammerstein
+hammertoe
+hammett
+Hammett
+hammier
+hammily
+hamminess
+hamming
+hammock
+hammock's
+hammocks
+Hammond
+hammurabi
+hammy
+hampden
+hamper
+hampered
+hampering
+hampers
+Hampshire
+hampstead
+Hampton
+hams
+hamshackle
+hamster
+hamsters
+hamstring
+hamstrung
+hamsun
+hamulus
+hamza
+hanaper
+hanau
+Hancock
+hand
+handbag
+handbag's
+handbags
+handball
+handbarrow
+handbell
+handbill
+handbook
+handbook's
+handbooks
+handbrake
+handbreadth
+handcar
+handcart
+handclasp
+handcraft
+handcraftman
+handcraftsman
+handcrank
+handcranks
+handcuff
+handcuffed
+handcuffing
+handcuffs
+handed
+handedly
+handedness
+Handel
+Handel's
+hander
+handers
+handfast
+handfasting
+handfeed
+handful
+handfuls
+handgrip
+handgun
+handguns
+handhold
+handicap
+handicap's
+handicapped
+handicapper
+handicapping
+handicaps
+handicraft
+handicrafter
+handicrafts
+handicraftsman
+handicraftsmen
+handier
+handiest
+handily
+handiness
+handing
+handiwork
+handkerchief
+handkerchief's
+handkerchiefs
+handle
+handleability
+handleable
+handlebar
+handlebars
+handled
+handleless
+handler
+handlers
+handles
+handless
+Handley
+handline
+handling
+handlist
+handmade
+handmaid
+handmaiden
+handout
+handouts
+handpick
+handpicked
+handpress
+handprint
+handprint's
+handprints
+handrail
+hands
+handsaw
+handsbreadth
+handseled
+handseling
+handset
+handsets
+handsful
+handshake
+handshake's
+handshaker
+handshakes
+handshaking
+handshook
+handsome
+handsomely
+handsomeness
+handsomer
+handsomest
+handspike
+handspikes
+handspring
+handsprings
+handstand
+handstands
+handstroke
+handwaving
+handwheel
+handwheels
+handwork
+handworker
+handwoven
+handwrite
+handwrites
+handwriting
+handwritings
+handwritten
+handwrought
+handy
+handyman
+handymen
+Haney
+Haney's
+Hanford
+Hanford's
+hang
+hangable
+hangar
+hangar's
+hangars
+hangbird
+hangchow
+hangdog
+hanged
+hanger
+hangers
+hanging
+hangman
+hangman's
+hangmen
+hangnail
+hangnail's
+hangnails
+hangout
+hangouts
+hangover
+hangover's
+hangovers
+hangs
+hangtag
+hangup
+hank
+Hankel
+Hankel's
+hanker
+hankerchief
+hankered
+hankerer
+hankering
+hankers
+hankie
+hankies
+hankow
+hanky
+Hanley
+Hanley's
+Hanlon
+Hanlon's
+Hanna
+Hanna's
+Hannah
+Hannibal
+hannover
+Hanoi
+Hanover
+Hanoverian
+Hanoverianize
+Hanoverianizes
+Hanoverize
+Hanoverizes
+hanratty
+Hans
+Hansard
+Hanseatic
+Hansel
+hanseled
+hanseling
+Hansen
+hansom
+Hanson
+hant
+hanter
+Hanukkah
+Hanuman
+Hanyang
+haole
+hap
+hapax
+hapchance
+hapgood
+Hapgood
+haphazard
+haphazardly
+haphazardness
+haphazardry
+haphtarah
+hapless
+haplessly
+haplessness
+haplite
+haplography
+haploid
+haploidy
+haplology
+haplosis
+haply
+happen
+happenchance
+happened
+happening
+happenings
+happens
+happenstance
+happier
+happiest
+happily
+happiness
+happing
+happy
+Hapsburg
+Hapsburg's
+hapten
+hapteron
+haptic
+hapto
+haptotropism
+harakiri
+harald
+harambee
+harangue
+harangued
+haranguer
+harangues
+haranguing
+harappa
+harar
+harass
+harassed
+harasser
+harasses
+harassing
+harassment
+harassments
+Harbin
+Harbin's
+harbinger
+harbingers
+harbor
+harbor's
+harborage
+harborages
+harbored
+harborer
+harborer's
+harborers
+harborful
+harboring
+harborless
+harborlesses
+harbors
+Harcourt
+hard
+hardback
+hardbake
+hardball
+hardboard
+hardboiled
+hardboot
+hardbound
+hardcase
+hardcopies
+hardcopy
+hardcover
+hardcovers
+hardecanute
+harden
+Hardenberg
+hardened
+hardener
+hardening
+hardens
+harder
+hardest
+hardfisted
+hardfistedness
+hardhack
+hardhanded
+hardhandedness
+hardhat
+hardhead
+hardheaded
+hardheadedly
+hardheadedness
+hardhearted
+hardheartedly
+hardheartedness
+hardicanute
+hardie
+hardier
+hardihood
+hardily
+hardiment
+Hardin
+hardiness
+harding
+hardings
+hardly
+hardmouthed
+hardness
+hardnesses
+hardpan
+hards
+hardscrabble
+hardshell
+hardship
+hardship's
+hardships
+hardstand
+hardstanding
+hardtack
+hardtop
+hardtops
+hardware
+hardwares
+hardwire
+hardwired
+hardwires
+hardwiring
+hardwood
+hardwoods
+hardworking
+Hardy
+hardy
+hare
+hare's
+harebell
+harebrain
+harebrained
+harelip
+harelipped
+harelips
+harem
+hares
+hargeisa
+Hargreaves
+haricot
+harijan
+harikari
+Haringey
+hark
+harked
+harken
+harking
+harks
+Harl
+Harlan
+Harlan's
+Harlem
+harlequin
+harlequinade
+Harley
+Harley's
+harlot
+harlot's
+harlotry
+harlots
+Harlow
+harm
+harmattan
+harmed
+harmer
+harmful
+harmfully
+harmfulness
+harming
+harmless
+harmlessly
+harmlessness
+Harmon
+Harmon's
+harmonic
+harmonica
+harmonica's
+harmonical
+harmonically
+harmonicalness
+harmonicas
+harmonics
+harmonies
+harmonious
+harmoniously
+harmoniousness
+Harmonist
+harmonist
+Harmonistic
+Harmonistically
+harmonium
+harmonizable
+harmonizable's
+harmonizables
+harmonization
+harmonization's
+harmonizations
+harmonize
+harmonized
+harmonizer
+harmonizers
+harmonizes
+harmonizing
+harmonograph
+harmonographs
+harmony
+harmotome
+harms
+Harmsworth
+harness
+harnessed
+harnesser
+harnesses
+harnessing
+harney
+Harold
+harp
+harped
+harpenden
+Harper
+harper
+harpers
+harpies
+harping
+harpings
+harpist
+harpoon
+harpoon's
+harpooned
+harpooner
+harpooning
+harpoons
+harps
+harpsichord
+harpsichordist
+harpsichords
+harpy
+harpy's
+harquebus
+harquebusier
+harrar
+harridan
+harried
+harrier
+Harriet
+Harrild
+Harriman
+Harriman's
+Harrington
+Harrington's
+Harris
+Harrisburg
+Harrison
+Harrisonburg
+harrogate
+Harrovian
+harrow
+harrowed
+harrower
+harrowing
+harrows
+harrumph
+harrumphed
+harrumphes
+harrumphing
+harrumphs
+harry
+Harry's
+harrying
+harsh
+harshen
+harshened
+harshening
+harsher
+harshest
+harshly
+harshness
+harslet
+hart
+hartal
+harte
+hartebeest
+Hartford
+harthacanute
+hartlepool
+Hartley
+Hartman
+hartnell
+hartree
+hartshead
+harun
+haruspex
+Harvard
+Harvardize
+Harvardizes
+harvest
+harvestable
+harvested
+harvester
+harvesters
+harvesting
+harvestman
+harvestmen
+harvests
+harvesttime
+Harvey
+Harveyize
+Harveyizes
+Harveys
+harwell
+harwich
+haryana
+harz
+has
+hasa
+hasdrubal
+hash
+hashed
+hashemite
+hasher
+hashes
+hashing
+hashish
+hask
+haskell
+Haskell
+haskins
+Haskins
+haslet
+hasn't
+hasp
+hasps
+hassan
+hasselt
+hassle
+hassled
+hassler
+hassles
+hassling
+hassock
+hassocks
+hast
+hastate
+hastately
+haste
+hasted
+hasten
+hastened
+hastener
+hastening
+hastens
+hastes
+hastier
+hastiest
+hastily
+hastiness
+hasting
+hastings
+hasty
+hat
+hat's
+hatband
+hatbox
+hatch
+hatchability
+hatchable
+hatchback
+hatcheck
+hatched
+hatcheled
+hatcheling
+hatcher
+hatcheries
+hatchery
+hatchery's
+hatches
+hatchet
+hatchet's
+hatchets
+hatching
+hatchling
+hatchment
+hatchments
+Hatchure
+hatchure
+hatchway
+hate
+hated
+hateful
+hatefully
+hatefulness
+hater
+hates
+Hatfield
+hath
+Hathaway
+Hathaway's
+Hathor
+hating
+hatless
+hatpin
+hatred
+hats
+hatshepsut
+hatted
+hatter
+Hatteras
+hatters
+Hattie
+Hattiesburg
+Hattiesburg's
+hatting
+Hattize
+Hattizes
+haubergeon
+hauberk
+Haugen
+Haugen's
+haugh
+haughtier
+haughtily
+haughtiness
+haughty
+haul
+haulage
+haulageway
+haulaway
+hauled
+hauler
+haulers
+haulier
+hauling
+haulm
+hauls
+haunch
+haunch's
+haunches
+haunt
+haunted
+haunter
+haunting
+hauntingly
+haunts
+Hauptmann
+hauraki
+Hausa
+Hausa's
+Hausdorff
+Hausdorff's
+hauser
+Hauser
+hausfrau
+haustellum
+haustorium
+hautboy
+hautboys
+haute
+hauteur
+Havana
+havant
+have
+havel
+havelock
+haven
+haven's
+haven't
+havens
+haver
+havering
+havers
+haversack
+haversack's
+haversacks
+Haversian
+haves
+havildar
+Havilland
+Havilland's
+having
+havoc
+havocked
+havocking
+havocs
+havre
+haw
+Hawaii
+Hawaiian
+hawes
+hawfinch
+hawhaw
+Hawick
+hawing
+hawk
+hawkbill
+hawked
+hawker
+hawkers
+hawking
+Hawkins
+hawkish
+hawkishly
+hawkishness
+hawks
+hawksbill
+hawkweed
+Hawley
+haworth
+hawse
+hawsehole
+hawsepipe
+hawser
+hawthorn
+Hawthorne
+hay
+haybox
+haycock
+Hayden
+Hayden's
+Haydn
+hayer
+Hayes
+hayfield
+hayfields
+hayfork
+haying
+hayloft
+hayloft's
+haylofts
+haymaker
+haymaking
+haymow
+Haynes
+hayrack
+hayrick
+hayride
+hays
+hayseed
+hayseeds
+haystack
+haystacks
+Hayward
+haywire
+haywood
+Haywood
+hazard
+hazard's
+hazarded
+hazarding
+hazardize
+hazardizes
+hazardous
+hazardously
+hazardousness
+hazards
+haze
+haze's
+hazed
+hazel
+hazelhen
+hazelnut
+hazelnuts
+hazer
+hazes
+hazier
+haziest
+hazily
+haziness
+hazing
+hazlitt
+hazy
+HDL
+he
+he'd
+he'll
+he's
+head
+head's
+headache
+headache's
+headaches
+headachy
+headband
+headboard
+headboards
+headcount
+headdress
+headed
+header
+headers
+headfirst
+headforemost
+headgear
+headgroup
+headgroup's
+headgroups
+headhunter
+headier
+headily
+headiness
+heading
+heading's
+headings
+headlamp
+headland
+headland's
+headlands
+headless
+headlessness
+headlight
+headlights
+headline
+headlined
+headliner
+headlines
+headlining
+headlock
+headlong
+headman
+headman's
+headmaster
+headmastership
+headmen
+headmen's
+headmistress
+headmost
+headnote
+headphone
+headphone's
+headphones
+headpiece
+headpin
+headquarter
+headquartered
+headquarters
+headrace
+headrail
+headreach
+headrest
+headroom
+heads
+headsail
+headscarf
+headset
+headsets
+headship
+headshrinker
+headsman
+headsmen
+headspring
+headsquare
+headstall
+headstand
+headstands
+headstock
+headstone
+headstones
+headstream
+headstrong
+headwaiter
+headwall
+headwalls
+headward
+headwards
+headwater
+headwaters
+headway
+headwind
+headwind's
+headwinds
+headword
+headwork
+heady
+heal
+heald
+healds
+healed
+healer
+healers
+Healey
+Healey's
+healing
+heals
+health
+healthful
+healthfully
+healthfulness
+healthier
+healthiest
+healthily
+healthiness
+healths
+healthy
+Healy
+Healy's
+heap
+heaped
+heaping
+heaps
+hear
+heard
+Heard
+hearer
+hearers
+hearest
+hearing
+hearings
+hearken
+hearkened
+hearkening
+hears
+hearsay
+hearse
+hearses
+hearsing
+Hearst
+heart
+heart's
+heartache
+heartache's
+heartaches
+heartbeat
+heartbeats
+heartbreak
+heartbreaking
+heartbreakingly
+heartbroken
+heartburn
+heartburning
+hearted
+heartedly
+hearten
+heartened
+heartening
+hearteningly
+heartens
+heartfelt
+hearth
+hearths
+hearthstone
+heartier
+hearties
+heartiest
+heartily
+heartiness
+heartland
+heartland's
+heartless
+heartlessly
+heartlessness
+heartrending
+heartrendingly
+hearts
+heartsease
+heartsick
+heartsickness
+heartsome
+heartsomely
+heartsore
+heartstring
+heartstrings
+heartthrob
+heartthrob's
+heartthrobs
+heartwarming
+heartwood
+Heartwood
+heartworm
+hearty
+heat
+heatable
+heated
+heatedly
+heater
+heaters
+heath
+heathberry
+heathen
+heathendom
+heathenish
+heathenishly
+heathenism
+heathenization
+heathenize
+heathenized
+heathenizes
+heathenizing
+heathenry
+heather
+heathery
+heathfowl
+Heathkit
+heathless
+heathlike
+heathman
+Heathman
+heating
+heatless
+heats
+heatstroke
+heaume
+heave
+heaved
+heaven
+heaven's
+heavenize
+heavenizes
+heavenliness
+heavenly
+heavens
+heavenward
+heavenwards
+heaver
+heavers
+heaves
+heavier
+heavies
+heaviest
+heavily
+heaviness
+heaving
+Heaviside
+heavy
+heavyhearted
+heavyheartedly
+heavyheartedness
+heavyset
+heavyweight
+hebbel
+hebdomad
+hebdomadal
+hebdomadally
+Hebe
+hebephrenia
+hebephrenic
+hebetate
+hebetation
+hebetic
+hebetude
+hebetudinous
+Hebraic
+Hebraicize
+Hebraicizes
+Hebraism
+Hebraist
+hebraization
+hebraizations
+hebraize
+hebraized
+hebraizes
+hebraizing
+Hebrew
+Hebrews
+Hebrides
+Hebrides's
+Hebron
+Hecate
+Hecate's
+hecatomb
+heck
+heckelphone
+heckle
+heckled
+heckler
+hecklers
+heckles
+heckling
+Heckman
+Heckman's
+hectare
+hectares
+hectic
+hectically
+hectocotylus
+hectogram
+hectogram's
+hectograms
+hectograph
+hectographic
+hectoliter
+hectometer
+hectometer's
+hectometers
+hector
+Hecuba
+hedda
+Hedda
+heddle
+heddler
+hedge
+hedged
+hedgehog
+hedgehog's
+hedgehogs
+hedgehop
+hedgehopper
+hedgepig
+hedger
+hedgerow
+hedges
+hedging
+hedgingly
+hedjaz
+hedonic
+hedonically
+hedonics
+hedonism
+hedonist
+hedonistic
+hedonistically
+hedonists
+hee
+heed
+heeded
+heedful
+heedfully
+heedfulness
+heeding
+heedless
+heedlessly
+heedlessness
+heeds
+heehaw
+heel
+heelball
+heeled
+heeler
+heelers
+heeling
+heelless
+heelpiece
+heelpost
+heels
+heeltap
+heenan
+heerlen
+heffer
+heft
+hefted
+heftier
+heftily
+heftiness
+hefts
+hefty
+Hegel
+hegel
+Hegelian
+Hegelianize
+Hegelianizes
+hegemonic
+hegemonies
+hegemony
+hegira
+hegumen
+heh
+Heidegger
+heidegger
+Heidegger's
+Heidelberg
+Heidi
+Heidi's
+heiduc
+heifer
+Heifetz
+heigh
+height
+heighten
+heightened
+heightening
+heightens
+heights
+heilbronn
+heilungkiang
+Heine
+Heine's
+Heinlein
+Heinlein's
+heinous
+heinously
+heinousness
+Heinrich
+Heinrich's
+Heinz
+Heinze
+heinze
+heir
+heir's
+heirdom
+heiress
+heiress's
+heiresses
+heirless
+heirloom
+heirs
+heirship
+Heisenberg
+Heiser
+heiser
+heist
+heist's
+heisted
+heister
+heisting
+heists
+heitiki
+heitler
+hejira
+hekate
+hekla
+hel
+held
+heldentenor
+Helen
+Helena
+Helene
+Helga
+Helga's
+Helgoland
+heliacal
+heliacally
+Helianthus
+helical
+helically
+helices
+helichrysum
+helicline
+helicograph
+helicoid
+helicoidal
+helicon
+helicopt
+helicopted
+helicopter
+helicopters
+helicopting
+Heligoland
+heliocentric
+heliochrome
+Heliogabalus
+heliogram
+heliogram's
+heliograms
+heliograph
+heliographer
+heliographic
+heliography
+heliogravure
+heliolatrous
+heliolatry
+heliolithic
+heliometer
+heliometer's
+heliometers
+heliometric
+heliometrically
+heliophyte
+Heliopolis
+heliopolis
+Helios
+heliostat
+heliotaxis
+heliotherapy
+heliotrope
+heliotropic
+heliotropically
+heliotropin
+heliotropism
+heliotype
+heliozoan
+heliozoic
+helipad
+heliport
+helistop
+helium
+helix
+helixes
+hell
+hell's
+Helladic
+Hellas
+hellbender
+hellbent
+hellbox
+hellbroth
+hellcat
+Helldiver
+helle
+hellebore
+Helleborine
+Hellenic
+Hellenism
+Hellenist
+Hellenistic
+Hellenization
+Hellenizations
+Hellenize
+Hellenized
+Hellenizes
+Hellenizing
+heller
+hellery
+helles
+Hellespont
+hellfire
+hellgrammite
+hellhole
+hellhound
+hellion
+hellish
+hellishly
+hellishness
+hello
+hellos
+hells
+helluva
+helm
+helmand
+helmet
+helmet's
+helmeted
+helmetlike
+helmets
+Helmholtz
+helminth
+helminthiasis
+helminthic
+helminthology
+helmont
+helmsman
+helmsmanship
+helmsmen
+Helmut
+helot
+helotism
+helotry
+help
+helped
+helper
+helpers
+helpful
+helpfully
+helpfulness
+helping
+helpless
+helplessly
+helplessness
+helpmann
+helpmate
+helpmeet
+helps
+helsingborg
+Helsinki
+helve
+helved
+helvellyn
+helves
+Helvetia
+Helvetian
+Helvetic
+Helvetica
+Helvetii
+helving
+hem
+hem's
+hemacytometer
+hemacytometer's
+hemacytometers
+hemal
+hematic
+hematin
+hematinic
+hematite
+hematoblast
+hematoblastic
+hematocrit
+hematogenous
+hematologic
+hematological
+hematologist
+hematology
+hematoma
+hematophagous
+hemel
+hemelytron
+hemeralopia
+hemialgia
+hemianopsia
+hemicellulose
+hemichordate
+hemicycle
+hemidemisemiquaver
+hemielytron
+hemihedral
+hemihedrally
+hemihydrate
+hemihydrated
+hemimetabolic
+hemimetabolism
+hemimetabolous
+hemimorphic
+hemimorphism
+hemimorphite
+Hemingway
+hemiola
+hemiparasite
+hemiparasitic
+hemiplegia
+hemiplegic
+hemipode
+hemipteran
+hemipterous
+hemispheral
+hemisphere
+hemisphere's
+hemisphered
+hemispheres
+hemispheric
+hemispherical
+hemispheroid
+hemistich
+hemiterpene
+hemline
+hemlock
+hemlock's
+hemlocks
+hemmed
+hemmer
+hemming
+Hemmings
+hemoblast
+hemodynamically
+hemodynamics
+hemoflagellate
+hemoglobin
+hemoglobinic
+hemoglobinopathy
+hemoglobinous
+hemolymph
+hemolysin
+hemolytic
+hemophilia
+hemophiliac
+hemophilic
+hemoprotein
+hemoptysis
+hemorrhage
+hemorrhaged
+hemorrhages
+hemorrhagic
+hemorrhaging
+hemorrhoid
+hemorrhoidal
+hemorrhoids
+hemosiderin
+hemostasis
+hemostat
+hemostatic
+hemostats
+hemp
+hempel
+hempen
+Hempstead
+Hempstead's
+hems
+hemstitch
+hemus
+hen
+hen's
+henae
+henbane
+henbit
+hence
+henceforth
+henceforward
+henchman
+henchmen
+hencoop
+hendecagon
+hendecahedron
+hendecasyllabic
+hendecasyllable
+Henderson
+hendiadys
+Hendrick
+Hendricks
+Hendrickson
+Hendrix
+hendrix
+henequen
+henge
+hengelo
+hengist
+henhouse
+Henie
+Henley
+Henley's
+henna
+hennery
+Hennessey
+Hennessey's
+Hennessy
+henning
+henotheism
+henotheist
+henotheistic
+henpeck
+henpecked
+Henri
+Henri's
+Henrietta
+henry
+Henryson
+hens
+Henslowe
+hent
+Henze
+hep
+heparin
+heparinize
+hepatic
+hepatica
+hepatitis
+hepatize
+hepatized
+hepatizes
+hepatizing
+hepatocellular
+hepatocyte
+hepatocyte's
+hepatocytes
+hepatoma
+Hepburn
+hepcat
+Hephaestus
+hepplewhite
+hepta
+heptad
+heptadecanoic
+heptagon
+heptagonal
+heptahedron
+heptamerous
+heptameter
+heptameter's
+heptameters
+heptane
+heptangular
+heptarchy
+heptastich
+Heptateuch
+heptatriene
+heptavalent
+heptose
+hepworth
+her
+Hera
+heraclea
+heracles
+Heraclid
+Heraclitus
+herakleion
+herald
+heralded
+heraldic
+heraldically
+heralding
+heraldize
+heraldizes
+heraldry
+heralds
+Herat
+herb
+herb's
+herbaceous
+herbage
+herbal
+herbalist
+herbarium
+Herbert
+herbicidal
+herbicidally
+herbicide
+herbicide's
+herbicides
+herbivore
+herbivorous
+herbivorously
+herblike
+herbs
+herby
+hercegovina
+herculaneum
+Herculean
+Hercules
+Hercynian
+herd
+herded
+herder
+herdic
+herding
+herdlike
+herds
+herdsman
+herdsmen
+here
+here's
+hereabout
+hereabouts
+hereafter
+hereat
+hereaway
+hereaways
+hereby
+heredes
+hereditable
+hereditament
+hereditarian
+hereditarianism
+hereditarily
+hereditary
+hereditist
+heredity
+Hereford
+Herefordshire
+herein
+hereinabove
+hereinafter
+hereinbefore
+hereinbelow
+hereinto
+hereof
+hereon
+Herero
+heres
+heresiarch
+heresy
+heretic
+heretic's
+heretical
+heretically
+hereticalness
+hereticize
+hereticizes
+heretics
+hereto
+heretofore
+hereunder
+hereunto
+hereupon
+hereward
+herewith
+heriot
+herisau
+heritability
+heritable
+heritage
+heritages
+heritor
+herl
+herm
+Herman
+Hermann
+Hermann's
+hermannstadt
+hermaphrodite
+hermaphrodite's
+hermaphrodites
+hermaphroditic
+hermaphroditically
+hermaphroditism
+Hermaphroditus
+hermatypic
+hermeneutic
+hermeneutical
+hermeneutically
+hermeneutics
+Hermes
+hermetic
+hermetical
+hermetically
+hermeticism
+hermetism
+hermetist
+hermit
+hermit's
+hermitage
+hermitage's
+hermitages
+Hermite
+hermitian
+hermitism
+hermits
+hermon
+Hermosa
+hermosillo
+hermoupolis
+hern
+Hernandez
+hernandez
+Hernandez's
+herne
+hernia
+hernia's
+hernial
+hernias
+herniate
+herniated
+herniates
+herniating
+herniation
+herniations
+herniorrhaphy
+hero
+hero's
+herod
+herodias
+Herodotus
+heroes
+heroic
+heroical
+heroically
+heroicomic
+heroicomical
+heroics
+heroin
+heroine
+heroine's
+heroines
+heroinism
+heroinize
+heroinizes
+heroism
+heroization
+heroization's
+heroizations
+heroize
+heroized
+heroizes
+heroizing
+heron
+heron's
+heronry
+herons
+herophilus
+heros
+herpes
+herpesvirus
+herpetic
+herpetologic
+herpetological
+herpetologically
+herpetologist
+herpetologists
+herpetology
+Herr
+herrick
+herring
+herring's
+herringbone
+herrings
+Herrington
+herrington
+herriot
+hers
+Herschel
+herself
+hersey
+Hersey
+Hershel
+Hershey
+herstmonceux
+Hertford
+Hertfordshire
+herty
+hertz
+hertzes
+Hertzian
+Hertzog
+Hertzog's
+Herzegovina
+Herzl
+Herzog
+hesiod
+hesiometer
+hesiometer's
+hesiometers
+Hesione
+hesitance
+hesitancy
+hesitant
+hesitantly
+hesitate
+hesitated
+hesitater
+hesitates
+hesitating
+hesitatingly
+hesitation
+hesitations
+Hesperia
+Hesperian
+Hesperides
+hesperidin
+hesperidium
+Hesperus
+Hess
+Hesse
+Hesse's
+Hessian
+Hessians
+hest
+Hester
+Hester's
+hestia
+Hesychast
+Het
+hetaera
+hetaerism
+heterarchy
+heterecious
+hetero
+heteroatom
+heteroautotrophic
+heterocercal
+heterochromatic
+heterochromatin
+heterochromatins
+heterochromosome
+heterochromous
+heteroclite
+heterocycle
+heterocyclic
+heterocyst
+heterodactyl
+heterodont
+heterodox
+heterodoxy
+heterodyne
+heteroecious
+heteroecism
+heterogamete
+heterogametic
+heterogamous
+heterogamy
+heterogeneity
+heterogeneous
+heterogeneously
+heterogeneousness
+heterogenesis
+heterogenetic
+heterogenous
+heterogeny
+heterogonic
+heterogony
+heterograft
+heterography
+heterogynous
+heterolecithal
+heterologous
+heterologously
+heterology
+heterolysis
+heterolytic
+heteromerous
+heteromorphic
+heteromorphism
+heteromorphous
+heteronomous
+heteronomously
+heteronomy
+heteronym
+Heteroousian
+heterophil
+heterophile
+heterophony
+heterophyllous
+heterophylly
+heterophyte
+heterophytic
+heteroplasty
+heteroploid
+heteroploidy
+heteropolar
+heteropolarity
+heteropterous
+heteroscedasticity
+heterosexual
+heterosexuality
+heterosexually
+heterosexuals
+heterosis
+heterosporous
+heterostructure
+heterostyly
+heterotaxis
+heterothallic
+heterotic
+heterotopia
+heterotopic
+heterotroph
+heterotrophic
+heterotrophically
+heterotypic
+heterotypical
+heterozygosis
+heterozygosity
+heterozygote
+heterozygous
+heth
+Hetman
+Hetman's
+Hettie
+Hettie's
+Hetty
+Hetty's
+Heublein
+heuristic
+heuristic's
+heuristically
+heuristics
+Heusen
+Heusen's
+Heuser
+Heuser's
+hevelius
+hevesy
+hew
+hewed
+hewer
+Hewett
+Hewett's
+hewing
+Hewitt
+Hewitt's
+Hewlett
+Hewlett's
+hewn
+hews
+hex
+hexachloride
+hexachloroethane
+hexachlorophene
+hexachord
+hexacosanoic
+hexad
+hexade
+hexadecane
+hexadecimal
+hexadecimally
+hexadecimals
+hexadic
+hexaemeron
+hexafluoride
+hexagon
+hexagonal
+hexagonally
+hexagons
+hexagram
+hexahedron
+hexahydrate
+hexahydrated
+hexahydrite
+hexamerous
+hexameter
+hexamethonium
+hexane
+hexangular
+hexanoic
+hexapla
+hexaploid
+hexaploidy
+hexapod
+hexapody
+hexastich
+hexastyle
+Hexateuch
+hexavalent
+hexene
+hexer
+hexone
+hexosan
+hexose
+hexyl
+hexylresorcinol
+hey
+heyday
+heyduck
+heyerdahl
+Heynis
+Heysham
+heywood
+Heywood
+Hezekiah
+hi
+Hialeah
+Hiatt
+Hiatt's
+hiatus
+hiatuses
+Hiawatha
+hibachi
+Hibbard
+Hibbard's
+hibernaculum
+hibernal
+hibernate
+hibernated
+hibernates
+hibernating
+hibernation
+hibernator
+Hibernia
+Hibernicism
+hibiscus
+hic
+hiccup
+hiccuped
+hiccuping
+hiccups
+hick
+Hickey
+Hickeys
+Hickman
+Hickman's
+hickok
+Hickok
+hickories
+hickory
+Hickox
+hicks
+hid
+hidalgo
+hidden
+hiddenite
+hide
+hideaway
+hidebound
+hided
+hideous
+hideously
+hideousness
+hideout
+hideout's
+hideouts
+hider
+hides
+Hideyoshi
+hiding
+hidrosis
+hidrotic
+hie
+hieing
+Hieland
+hiemal
+hieracosphinx
+hierarch
+hierarchal
+hierarchic
+hierarchical
+hierarchically
+hierarchies
+hierarchy
+hierarchy's
+hieratic
+hieratically
+hierocracy
+hierodule
+hieroglyph
+hieroglyphic
+hieroglyphical
+hieroglyphically
+hieroglyphics
+hierogram
+hierology
+Hieronymus
+hierophant
+hifalutin
+Higgins
+higgle
+higgled
+higgler
+higgles
+higgling
+high
+highball
+highbinder
+highborn
+highboy
+highbred
+highbrow
+highbrowed
+highbrowism
+highchair
+higher
+highest
+highfalutin
+Highfield
+highhanded
+highjack
+highland
+highlander
+highlands
+highlife
+highlight
+highlighted
+highlighting
+highlights
+highline
+highlines
+highly
+highness
+highness's
+highnesses
+highroad
+highs
+hight
+hightail
+highveld
+highway
+highway's
+highwayman
+highwaymen
+highways
+hijack
+hijacked
+hijacker
+hijackers
+hijacking
+hijacks
+hijaz
+hijinks
+hike
+hiked
+hiker
+hikers
+hikes
+hiking
+hilarious
+hilariously
+hilariousness
+hilarity
+Hilary
+Hilbert
+Hildebrand
+Hildebrand's
+Hildesheim
+hilding
+hill
+hill's
+hilla
+hillary
+Hillary
+hillbilly
+Hillcrest
+hilled
+Hillel
+hiller
+hillery
+hillfort
+hilliard
+hillier
+hilling
+hillingdon
+hillman
+hillmen
+hillock
+hillocks
+hillocky
+hills
+Hillsboro
+Hillsdale
+hillside
+hilltop
+hilltop's
+hilltops
+hilly
+hillyer
+hilt
+hilt's
+Hilton
+hilts
+hilum
+hilus
+hilversum
+him
+himachal
+Himalaya
+Himalaya's
+himalayas
+Himalayas
+himation
+himeji
+himmler
+Himmler
+hims
+himself
+Himyarite
+Himyaritic
+hin
+Hinayana
+hinckley
+hind
+hindbrain
+Hindemith
+Hindenburg
+hinder
+hindered
+hinderer
+hindering
+hinders
+hindgut
+Hindi
+hindmost
+hindoo
+hindquarter
+hindquarters
+hindrance
+hindrances
+hinds
+hindsight
+Hindu
+Hindu's
+Hinduism
+Hindus
+hindustan
+Hindustan
+Hindustan's
+Hines
+hinge
+hinged
+hinger
+hinges
+hinging
+hingism
+Hinkle
+hinkle
+Hinman
+Hinman's
+hinny
+Hinsdale
+hinshelwood
+hint
+hinted
+hinter
+hinterland
+hinterlands
+hinting
+hints
+hip
+hip's
+hipbone
+hipness
+hipparch
+hipparchus
+Hippeastrum
+hipped
+hipper
+hippest
+hippie
+hippies
+hipping
+hippo
+hippocampal
+hippocampus
+hippocras
+Hippocrates
+Hippocratic
+Hippocrene
+hippodrome
+hippogriff
+hippolyta
+Hippolytus
+Hippomenes
+hippopotamus
+hippos
+hippy
+hips
+hipster
+hipsterism
+hipsters
+hiragana
+Hiram
+hircine
+hire
+hired
+hireling
+hirelings
+hirer
+hirers
+hires
+Hirey
+hirey
+hiri
+hiring
+hirings
+hirohito
+Hiroshi
+Hiroshi's
+hiroshige
+Hiroshima
+Hirsch
+hirseled
+hirseling
+hirsute
+hirsuteness
+hirsutism
+hirsutulous
+Hirudin
+hirundine
+his
+Hispania
+Hispanic
+Hispanic's
+Hispanicism
+Hispanicization
+Hispanicize
+Hispanicized
+Hispanicizes
+Hispanicizing
+Hispanics
+Hispaniola
+hispid
+hiss
+hissed
+hisser
+hisses
+hissing
+hist
+histaminase
+histamine
+histaminergic
+histaminic
+histidine
+histiocyte
+histochemic
+histochemical
+histochemistry
+histogen
+histogenesis
+histogram
+histogram's
+histograms
+histoid
+histologic
+histological
+histologically
+histologist
+histology
+histolysis
+histolytic
+histone
+histopathologic
+histopathological
+histopathologically
+histopathologist
+histopathology
+histophysiologic
+histophysiological
+histophysiology
+histoplasmosis
+historian
+historian's
+historians
+historiated
+historic
+historical
+historically
+historicalness
+historicism
+historicist
+historicity
+historicize
+historicized
+historicizes
+historicizing
+histories
+historiographer
+historiographic
+historiographical
+historiographically
+historiography
+history
+history's
+histrionic
+histrionically
+histrionics
+hit
+hit's
+Hitachi
+hitch
+Hitchcock
+hitched
+hitcher
+hitches
+hitchhike
+hitchhiked
+hitchhiker
+hitchhikers
+hitchhikes
+hitchhiking
+hitching
+hither
+hithermost
+hitherto
+hitherward
+Hitler
+Hitlerian
+Hitlerism
+Hitlerite
+Hitlerites
+hitless
+hitparade
+hits
+hitter
+hitter's
+hitters
+hitting
+Hittite
+hive
+hiveless
+hives
+hiving
+hmm
+hmso
+ho
+hoactzin
+hoad
+hoagie
+hoagies
+Hoagland
+Hoagland's
+hoagy
+hoar
+hoard
+hoarded
+hoarder
+hoarding
+hoards
+hoarfrost
+hoarhound
+hoarier
+hoariness
+hoarse
+hoarsely
+hoarsen
+hoarsened
+hoarseness
+hoarsening
+hoarser
+hoarsest
+hoary
+hoatching
+hoatzin
+hoax
+hoax's
+hoaxed
+hoaxer
+hoaxes
+hoaxing
+hob
+Hobart
+Hobart's
+hobbema
+Hobbes
+hobbies
+hobbing
+Hobbism
+hobble
+hobbled
+hobbledehoy
+hobbler
+hobbles
+hobbling
+Hobbs
+hobby
+hobby's
+hobbyhorse
+hobbyist
+hobbyist's
+hobbyists
+hobday
+Hobday
+hobgoblin
+hobnail
+hobnailed
+hobnob
+hobnobbed
+hobnobber
+hobnobbing
+hobnobs
+hobo
+Hoboken
+hobos
+hoc
+Hochheimer
+hochhuth
+hock
+hockaday
+hocker
+hockey
+hocking
+hockney
+hocks
+Hocktide
+hocus
+hocused
+hocusing
+hocussed
+hocussing
+hod
+hodad
+hodaddy
+hodden
+hodeida
+Hodge
+hodge
+Hodge's
+hodgepodge
+hodges
+Hodgkin
+Hodgkin's
+Hodgson
+hodman
+hodometer
+hodoscope
+hoe
+hoe's
+hoecake
+hoedown
+hoeing
+hoek
+Hoene
+hoer
+hoes
+hofei
+Hoff
+Hoff's
+Hoffman
+Hofmann
+hofmannsthal
+hofuf
+hog
+hog's
+Hogan
+hogan
+Hogan's
+hogarth
+hogback
+hogg
+hogged
+hogging
+hoggish
+hoggishly
+hoggishness
+hogmanay
+hognosed
+hogs
+hogshead
+hogtie
+hogue
+hogwash
+hogweed
+hohenlinden
+hohenlohe
+hohenstaufen
+Hohenzollern
+hoi
+hoick
+hoicks
+hoiden
+hoising
+hoist
+hoisted
+hoister
+hoisting
+hoistman
+hoistmen
+hoists
+hokan
+hoke
+hokey
+hokeyer
+hokeyest
+hokeyness
+hokeypokey
+hoking
+hokkaido
+hokku
+hokum
+hokusai
+holabird
+holandric
+holandry
+holarctic
+holbein
+Holbrook
+Holcomb
+Holcomb's
+hold
+holdall
+holdalls
+holdback
+holden
+holder
+holders
+holdfast
+holding
+holdings
+holdout
+holdouts
+holdover
+holdovers
+holds
+holdup
+holdups
+hole
+hole's
+holeable
+holed
+holes
+holey
+holiday
+holiday's
+holidayer
+holidaymaker
+holidays
+holier
+holies
+holily
+holiness
+holing
+holinshed
+holism
+holistic
+holistically
+holkar
+Holland
+Holland's
+hollandaise
+Hollander
+Hollanders
+Hollandia
+Hollands
+hollas
+holler
+hollered
+hollering
+Hollerith
+hollers
+Holliday
+hollies
+Holliger
+Hollingsworth
+Hollingsworth's
+Hollister
+hollo
+holloa
+hollow
+holloware
+Holloway
+Holloway's
+hollowed
+hollower
+hollowest
+hollowing
+hollowly
+hollowness
+hollows
+hollowware
+holly
+hollyhock
+hollyhocks
+Hollywood
+Hollywood's
+Hollywoodize
+Hollywoodizes
+Holm
+Holm's
+Holman
+Holman's
+Holmdel
+Holmdel's
+Holmes
+holmic
+holmium
+holoblastic
+holoblastically
+holocaine
+holocaust
+Holocene
+holoenzyme
+holofernes
+hologamous
+hologamy
+hologram
+hologram's
+holograms
+holograph
+holographic
+holographically
+holography
+hologynic
+hologyny
+holohedral
+holometabolism
+holometabolous
+holomyarian
+holophrastic
+holophytic
+holoplankton
+holothurian
+holotype
+holotypic
+holozoic
+holp
+holpen
+hols
+Holst
+Holstein
+holster
+holstered
+holstering
+holsters
+holt
+holy
+holyhead
+holyoake
+Holyoke
+holystone
+holystones
+holytide
+holzman
+Holzman
+Hom
+homage
+homaged
+homager
+homages
+homaging
+hombre
+homburg
+home
+homebody
+homebound
+homebred
+homebuild
+homebuilder
+homebuilders
+homebuilding
+homebuilt
+homecome
+homecoming
+homecomings
+homecraft
+homed
+homegrown
+homeland
+homeless
+homelessness
+homelier
+homelike
+homeliness
+homely
+homemade
+homemake
+homemaker
+homemaker's
+homemakers
+homemaking
+homeobox
+homeomorph
+homeomorphic
+homeomorphism
+homeomorphism's
+homeomorphisms
+homeopath
+homeopathic
+homeopathically
+homeopathies
+homeopaths
+homeopathy
+homeopathy's
+homeostasis
+homeostatic
+homeotypic
+homeown
+homeowner
+homeowners
+homeownership
+homer
+Homeric
+homerists
+homeroom
+homers
+homes
+homesick
+homesickness
+homesite
+homespun
+homestead
+homesteader
+homesteaders
+homesteads
+homestretch
+hometown
+homeward
+homewards
+homework
+homeworker
+homeworkers
+homey
+homeyness
+homicidal
+homicidally
+homicide
+homicides
+homier
+homiletic
+homiletical
+homiletically
+homiletics
+homily
+hominess
+homing
+hominid
+hominization
+hominized
+hominoid
+hominy
+homo
+homocentric
+homocercal
+homochromatic
+homochromous
+homocyclic
+homodont
+homoerotic
+homoeroticism
+homogametic
+homogamic
+homogamous
+homogamy
+homogenate
+homogenates
+homogeneities
+homogeneity
+homogeneity's
+homogeneous
+homogeneously
+homogeneousness
+homogenization
+homogenization's
+homogenizations
+homogenize
+homogenized
+homogenizer
+homogenizers
+homogenizes
+homogenizing
+homogenous
+homogeny
+homograft
+homograph
+homographic
+homoiotherm
+homoiothermal
+homoiothermic
+Homoiousian
+homolog
+homologate
+homologation
+homological
+homologically
+homologization
+homologize
+homologized
+homologizer
+homologizes
+homologizing
+homologous
+homolographic
+homologue
+homology
+homolysis
+homolytic
+homomorphic
+homomorphism
+homomorphism's
+homomorphisms
+homomorphy
+homonuclear
+homonym
+homonym's
+homonymic
+homonymous
+homonymously
+homonyms
+homonymy
+homoousian
+homophile
+homophobe
+homophobes
+homophobia
+homophone
+homophonic
+homophonous
+homophony
+homophyly
+homoplastic
+homoplastically
+homoplasy
+homopolar
+homopolymer
+homopolymers
+homopteran
+homopterous
+homorganic
+homos
+homoscedastic
+homoscedasticity
+homosexual
+homosexuality
+homosexually
+homosexuals
+homosporous
+homospory
+homotaxis
+homothallic
+homothallism
+homothermal
+homotopy
+homotransplant
+homotransplantation
+homozygosis
+homozygosity
+homozygote
+homozygotic
+homozygous
+homozygously
+homunculi
+homunculus
+homy
+hon
+honan
+honcho
+honchos
+Honda
+Honda's
+hondo
+Hondo
+Honduras
+hone
+honecker
+honed
+honegger
+honer
+hones
+honest
+honestly
+honesty
+honewort
+honey
+honeybee
+honeybees
+honeybunch
+honeycomb
+honeycombed
+honeydew
+honeyed
+honeying
+honeymoon
+honeymooned
+honeymooner
+honeymooners
+honeymooning
+honeymoons
+honeys
+honeysucker
+honeysuckle
+Honeywell
+Hong
+hong
+honiara
+honied
+honing
+Honiton
+honk
+honked
+honker
+honkers
+honkeys
+honkie
+honkies
+honking
+honks
+honky
+honky's
+Honolulu
+honor
+honorabilities
+honorability
+honorability's
+honorable
+honorable's
+honorableness
+honorables
+honorableship
+honorableship's
+honorableships
+honorablies
+honorably
+honoraria
+honorarily
+honorarium
+honorary
+honored
+honoree
+honorer
+honorer's
+honorers
+honorific
+honorific's
+honorifically
+honorifics
+honoring
+honorless
+honorlesses
+honors
+Honshu
+Honshu's
+hoo
+hooch
+hood
+hood's
+hooded
+hoodedness
+hooding
+hoodlike
+hoodlum
+hoodlumish
+hoodlumism
+hoodlumize
+hoodlumizes
+hoodlums
+hoodoo
+hoodooism
+hoodoos
+hoods
+hoodwink
+hoodwinked
+hoodwinker
+hoodwinking
+hoodwinks
+hooey
+hoof
+hoof's
+hoofbeat
+hoofbound
+hoofed
+hoofer
+hoofmark
+hoofmarks
+hoofprint
+hoofprint's
+hoofprints
+hoofs
+hoogh
+hooghly
+hook
+hookah
+hooke
+hooked
+hookedness
+hooker
+hookers
+hookey
+hookeys
+hooking
+hooklet
+hooknose
+hooks
+hookup
+hookups
+hookworm
+hooky
+hooligan
+hooliganism
+hooliganize
+hooliganizes
+hooligans
+hoop
+hooped
+hooper
+hooping
+hoopla
+hoopoe
+hoopoes
+hoops
+hooray
+hooray's
+hoorays
+hoosegow
+hoosegows
+Hoosier
+Hoosierize
+Hoosierizes
+hoot
+hootch
+hooted
+hootenanny
+hooter
+hooters
+hooting
+hoots
+Hoover
+Hoover's
+hoovered
+hoovering
+Hooverize
+Hooverizes
+hoovers
+hooves
+hop
+hope
+hoped
+hopeful
+hopefully
+hopefulness
+hopefuls
+hopeh
+hopeless
+hopelessly
+hopelessness
+hoper
+hopes
+hophead
+hopi
+Hopi
+Hopi's
+hoping
+Hopkins
+Hopkinsian
+hoplite
+hoplology
+hopped
+hopper
+hopper's
+hoppers
+hopping
+hopple
+hoppled
+hopples
+hoppus
+hops
+hopsack
+hopscotch
+hora
+Horace
+horae
+horal
+horary
+Horatian
+Horatio
+Horatius
+hord
+horde
+horde's
+hordein
+hordes
+horeb
+horehound
+Horenstein
+horizon
+horizon's
+horizonal
+horizons
+horizontal
+horizontalization
+horizontalization's
+horizontalizations
+horizontalize
+horizontalizes
+horizontally
+horme
+hormonal
+hormonally
+hormone
+hormone's
+hormonelike
+hormones
+hormonize
+hormonizes
+hormuz
+horn
+hornbeam
+hornbeams
+hornbill
+hornbills
+hornblende
+Hornblower
+hornbook
+hornby
+Horne
+horned
+hornedness
+hornet
+hornet's
+hornets
+hornfels
+hornier
+horniness
+hornless
+hornlessness
+hornlike
+hornmouth
+hornpipe
+hornpipe's
+hornpipes
+horns
+hornstone
+hornswoggle
+hornswoggled
+hornswoggles
+hornswoggling
+horntail
+hornwort
+horny
+horologe
+horologer
+horologic
+horological
+horologist
+horologists
+horologium
+horology
+horoscope
+horoscopes
+horoscopy
+Horowitz
+horrendous
+horrendously
+horrent
+horrible
+horribleness
+horribly
+horrid
+horridly
+horridness
+horrific
+horrifically
+horrified
+horrifies
+horrify
+horrifying
+horrifyingly
+horripilation
+horror
+horror's
+horrorize
+horrorizes
+horrors
+hors
+horsa
+horse
+horse's
+horseback
+horsebox
+horseboxs
+horsecar
+horsedom
+horseflesh
+horseflies
+horsefly
+horsehair
+horsehide
+horselaugh
+horseleech
+horseleeches
+horselike
+horsely
+horseman
+horsemanship
+horsemen
+horsemint
+horsens
+horseplay
+horseplayer
+horsepower
+horsepowers
+horseradish
+horseradishes
+horseriding
+horses
+horseshit
+horseshoe
+horseshoer
+horseshoes
+horsetail
+horsewhip
+horsewoman
+horsewomen
+horsey
+horsier
+horsily
+horsiness
+horsing
+horst
+horsy
+horta
+hortative
+hortatively
+hortatory
+Hortense
+horthy
+horticultural
+horticulturalist
+horticulturally
+horticulture
+horticulturist
+Horton
+hortus
+Horus
+hosanna
+hose
+hose's
+hosea
+hosed
+hoses
+hosier
+hosiery
+hosing
+hospice
+hospices
+hospitable
+hospitably
+hospital
+hospital's
+hospitalet
+hospitality
+hospitalization
+hospitalization's
+hospitalizations
+hospitalize
+hospitalized
+hospitalizes
+hospitalizing
+hospitaller
+hospitals
+hospodar
+host
+host's
+Hosta
+hostage
+hostage's
+hostages
+hosted
+hostel
+hosteler
+hosteller
+hostelling
+hostelries
+hostelry
+hostels
+hostess
+hostess's
+hostesses
+hostie
+hostile
+hostilely
+hostilities
+hostility
+hostilize
+hostilizes
+hosting
+hostler
+hostly
+hosts
+hot
+hotbed
+hotblood
+hotbox
+hotchpot
+hotchpotch
+hotdogs
+hotel
+hotel's
+hotelier
+hotelization
+hotelization's
+hotelizations
+hotelize
+hotelizes
+hotelman
+hotels
+hotfeet
+hotfoot
+hotfoot's
+hotfoots
+hothead
+hotheaded
+hotheadedly
+hotheadedness
+hothouse
+hotien
+hotly
+hotness
+hotplate
+hotpot
+hotrod
+hotshot
+hotspur
+Hottentot
+Hottentot's
+hotter
+hottest
+hottie
+hottish
+Houdaille
+Houdaille's
+Houdan
+Houdini
+houdon
+hough
+Houghton
+Houghton's
+houmous
+hound
+hounded
+hounder
+hounding
+hounds
+hounslow
+hour
+hour's
+hourglass
+houri
+hourly
+hours
+house
+house's
+houseboat
+houseboats
+housebound
+houseboy
+houseboys
+housebreak
+housebreaker
+housebreakers
+housebreaking
+housebroken
+housebuilding
+housecarl
+houseclean
+housecleaner
+housecleaning
+housecoat
+housed
+housedress
+housefather
+housefathers
+houseflies
+housefly
+housefly's
+housefront
+houseful
+houseguest
+household
+household's
+householder
+householders
+households
+housekeep
+housekeeper
+housekeeper's
+housekeepers
+housekeeping
+housel
+houseled
+houseleek
+houseleeks
+houseless
+houselessness
+houselights
+houseline
+houseling
+houselings
+housemaid
+housemaids
+houseman
+housemaster
+housemasters
+housemate
+housemate's
+housemates
+housemother
+housemothers
+houseplant
+houser
+houseroom
+houses
+housetop
+housetop's
+housetops
+houseward
+housewares
+housewarming
+housewife
+housewife's
+housewifeliness
+housewifely
+housewifery
+housewives
+housework
+houseworker
+houseworkers
+housing
+housings
+housman
+Houston
+Houstonia
+houting
+hove
+hovel
+hovel's
+hoveled
+hoveler
+hovelers
+hoveling
+hovels
+hover
+hovercraft
+hovered
+hoverer
+hovering
+hoverport
+hovers
+hovertrain
+hovertrains
+how
+how's
+Howard
+howbeit
+howdah
+howdy
+Howe
+Howell
+however
+howitzer
+howl
+Howland
+howled
+howler
+howlet
+howling
+howls
+howrah
+hows
+howsoever
+howsomever
+howtowdie
+hoxha
+hoy
+Hoya
+hoyden
+hoydenish
+hoylake
+hoyle
+Hoyt
+Hoyt's
+HP
+hradec
+Hrothgar
+Hrothgar's
+hrs
+hrvatska
+hsi
+hsian
+hsiang
+hsining
+hsinking
+hua
+huambo
+huang
+hub
+hub's
+hubba
+Hubbard
+Hubbard's
+Hubbell
+Hubbell's
+hubbies
+hubble
+Hubble
+Hubble's
+hubbub
+hubby
+hubcap
+hubcap's
+hubcaps
+Huber
+Huber's
+Hubert
+hubli
+hubris
+hubristic
+hubristically
+hubs
+huck
+Huck
+huckaback
+huckel
+huckle
+huckleberry
+hucklebone
+huckster
+huckstered
+huckstering
+hucksterism
+hucksterize
+hucksterizes
+hucksters
+hud
+Huddersfield
+huddle
+huddled
+huddler
+huddles
+Huddleston
+huddling
+Hudibrastic
+Hudson
+hue
+hue's
+hued
+huelva
+hues
+huesca
+huey
+Huey
+huff
+huffier
+huffiness
+huffish
+Huffman
+Huffman's
+huffy
+hufuf
+hug
+huge
+hugely
+hugeness
+hugeous
+hugeously
+huger
+hugest
+huggable
+hugged
+hugger
+huggermugger
+huggers
+hugging
+huggings
+Huggins
+Hugh
+Hughes
+hughie
+Hugo
+hugs
+Huguenot
+huh
+huhehot
+hula
+hulk
+hulked
+hulking
+hulks
+hull
+hull's
+hullabaloo
+hullabalooed
+hullabalooing
+hullabaloos
+hulled
+huller
+hulling
+hullo
+hulls
+hulme
+hum
+human
+humane
+humanely
+humaneness
+humanism
+humanist
+humanistic
+humanistically
+humanists
+humanitarian
+humanitarianism
+humanitarianize
+humanitarianizes
+humanitarians
+humanities
+humanity
+humanity's
+humanization
+humanization's
+humanizations
+humanize
+humanized
+humanizer
+humanizers
+humanizes
+humanizing
+humankind
+humanlike
+humanly
+humanness
+humanoid
+humans
+humber
+humberside
+humble
+humblebee
+humbled
+humbleness
+humbler
+humbles
+humblest
+humbling
+humbly
+Humboldt
+humbug
+humbugged
+humbuggery
+humbugging
+humdinger
+humdrum
+Hume
+humectant
+humeral
+humeri
+humerus
+humic
+humid
+humidification
+humidifications
+humidified
+humidifier
+humidifiers
+humidifies
+humidify
+humidifying
+humidistat
+humidities
+humidity
+humidly
+humidor
+humification
+humifications
+humified
+humiliate
+humiliated
+humiliates
+humiliating
+humiliatingly
+humiliation
+humiliations
+humility
+hummable
+hummed
+Hummel
+Hummel's
+hummer
+humming
+hummingbird
+hummingbirds
+hummock
+hummocks
+hummocky
+humor
+humor's
+humoral
+humored
+humorer
+humorers
+humoresque
+humoring
+humorism
+humorism's
+humorisms
+humorist
+humorist's
+humoristic
+humoristical
+humoristical's
+humoristicals
+humoristics
+humorists
+humorize
+humorizes
+humorless
+humorlesses
+humorlessness
+humorous
+humorously
+humorousness
+humors
+humorsome
+hump
+humpback
+humpbacked
+humpbacks
+humped
+Humperdinck
+humph
+Humphrey
+Humphreys
+humpier
+humping
+humps
+humpty
+Humpty
+humpy
+hums
+humus
+Hun
+hunan
+hunch
+hunchback
+hunchback's
+hunchbacked
+hunchbacks
+hunched
+hunches
+hundred
+hundredfold
+hundreds
+hundredth
+hundredweight
+hundredweights
+hung
+Hungarian
+Hungary
+hunger
+hungered
+hungering
+hungers
+hungnam
+hungrier
+hungriest
+hungrily
+hungriness
+hungry
+hunk
+hunk's
+hunker
+hunkered
+hunkering
+hunkers
+hunks
+Hunnish
+huns
+hunt
+hunted
+hunter
+hunters
+hunting
+huntingdon
+Huntingdonshire
+Huntington
+Huntington's
+Huntley
+Huntley's
+huntress
+hunts
+huntsman
+Huntsville
+hunyadi
+huon
+hup
+hupeh
+huppah
+Hurd
+Hurd's
+Hurdies
+hurdle
+hurdled
+hurdler
+hurdles
+hurdling
+hurds
+hurl
+hurled
+hurler
+hurlers
+hurley
+hurling
+hurly
+Huron
+hurrah
+hurray
+hurrays
+hurricane
+hurricane's
+hurricanes
+hurricanize
+hurricanizes
+hurried
+hurriedly
+hurriedness
+hurrier
+hurries
+hurry
+hurrying
+Hurst
+hurstmonceux
+hurt
+hurter
+hurtful
+hurtfully
+hurtfulness
+hurting
+hurtingly
+hurtle
+hurtled
+hurtles
+hurtless
+hurtling
+hurts
+hurty
+Hurwitz
+hus
+husain
+husband
+husband's
+husbander
+husbandly
+husbandman
+husbandmen
+husbandry
+husbands
+husein
+hush
+hushaby
+hushed
+hushes
+hushing
+husk
+husked
+husker
+huskier
+huskies
+huskily
+huskiness
+husking
+husks
+husky
+huss
+hussar
+hussein
+husserl
+hussies
+Hussite
+hussy
+hustings
+hustle
+hustled
+hustler
+hustlers
+hustles
+hustling
+Huston
+Huston's
+hut
+hut's
+hutch
+hutchie
+Hutchins
+Hutchinson
+Hutchison
+hutment
+huts
+hutu
+hutzpah
+Huxley
+Huxtable
+Huxtable's
+Huybrechts
+huygens
+huysmans
+huzzah
+huzzahs
+hwang
+hwyl
+hyacinth
+hyacinthine
+hyacinths
+Hyacinthus
+Hyades
+hyaena
+hyaenas
+hyalin
+hyaline
+hyalinization
+hyalinization's
+hyalinizations
+hyalinize
+hyalinizes
+hyalite
+hyaloid
+hyaloplasm
+hyaluronic
+Hyannis
+hybrid
+hybridism
+hybridity
+hybridizable
+hybridizable's
+hybridizables
+hybridization
+hybridization's
+hybridizations
+hybridize
+hybridized
+hybridizer
+hybridizers
+hybridizes
+hybridizing
+hybrids
+hybris
+hydantoin
+hydathode
+hydatid
+Hyde
+Hyde's
+hyderabad
+hydnocarpate
+hydnocarpic
+hydra
+hydracid
+hydrangea
+hydrant
+hydranth
+hydrants
+hydrastinine
+Hydrastis
+hydrate
+hydrated
+hydrates
+hydrating
+hydration
+hydrations
+hydrator
+hydraulic
+hydraulical
+hydraulically
+hydraulics
+hydrazide
+hydrazine
+hydrazoic
+hydria
+hydric
+hydrically
+hydride
+hydrides
+hydriodic
+hydro
+hydrobiological
+hydrobiologist
+hydrobiology
+hydrobromic
+hydrocarbon
+hydrocarbonaceous
+hydrocarbonic
+hydrocarbonous
+hydrocarbons
+hydrocaryaceous
+hydrocaryaceouses
+hydrocele
+hydrocellulose
+hydrocephalic
+hydrocephalus
+hydrocephaly
+hydrochemistry
+hydrochloric
+hydrochloride
+hydrocoral
+hydrocortisone
+hydrocyanic
+hydrodynamic
+hydrodynamical
+hydrodynamically
+hydrodynamicist
+hydrodynamics
+hydroelectric
+hydroelectrically
+hydroelectricity
+hydrofluoric
+hydrofoil
+hydroformer
+hydroforming
+hydrogen
+hydrogen's
+hydrogenate
+hydrogenation
+hydrogenization
+hydrogenization's
+hydrogenizations
+hydrogenize
+hydrogenized
+hydrogenizes
+hydrogenizing
+hydrogenolysis
+hydrogenous
+hydrogens
+hydrograph
+hydrographer
+hydrographic
+hydrographically
+hydrography
+hydroid
+hydrokinetic
+hydrokinetics
+hydrolase
+hydrologic
+hydrological
+hydrologically
+hydrologist
+hydrology
+hydrolysate
+hydrolysis
+hydrolyte
+hydrolytic
+hydrolytically
+hydrolyzable
+hydrolyzable's
+hydrolyzables
+hydrolyze
+hydrolyze's
+hydrolyzed
+hydrolyzes
+hydromagnetic
+hydromagnetics
+hydromancy
+hydromechanical
+hydromechanics
+hydromedusa
+hydromel
+hydrometallurgy
+hydrometeor
+hydrometer
+hydrometer's
+hydrometers
+hydrometric
+hydrometrical
+hydrometry
+hydromorphic
+hydronaut
+hydronic
+hydronically
+hydronium
+hydropathic
+hydropathically
+hydropathy
+hydroperoxide
+hydrophane
+hydrophile
+hydrophilic
+hydrophilous
+hydrophobia
+hydrophobic
+hydrophobicity
+hydrophone
+hydrophyte
+hydrophytic
+hydroplane
+hydroplaner
+hydroponic
+hydroponically
+hydroponics
+hydropower
+hydroquinone
+hydros
+hydroscope
+hydrosere
+Hydroski
+hydrosol
+hydrosolic
+hydrospace
+hydrosphere
+hydrospheric
+hydrostat
+hydrostatic
+hydrostatical
+hydrostatically
+hydrostatics
+hydrosulfide
+hydrosulfite
+hydrosulphate
+hydrosulphide
+hydrosulphurous
+hydrotactic
+hydrotaxis
+hydrotherapeutics
+hydrotherapy
+hydrothermal
+hydrothermally
+hydrothorax
+hydrotropic
+hydrotropically
+hydrotropism
+hydrous
+hydroxide
+hydroxides
+hydroxonium
+hydroxy
+hydroxyl
+hydroxyl's
+hydroxylamine
+hydroxylate
+hydroxylation
+hydroxylic
+hydroxylization
+hydroxylization's
+hydroxylizations
+hydroxylize
+hydroxylizes
+hydroxyls
+hydroxyproline
+hydroxyzine
+hydrozoan
+Hydrus
+hyena
+hyenic
+hyenoid
+hyetograph
+hyetography
+Hygeia
+hygiene
+hygienic
+hygienically
+hygienics
+hygienist
+hygienists
+hygienization
+hygienization's
+hygienizations
+hygienize
+hygienizes
+hygristor
+hygrograph
+hygrometer
+hygrometer's
+hygrometers
+hygrometric
+hygrometry
+hygrophilous
+hygrophyte
+hygrophytic
+hygroscope
+hygroscopic
+hygroscopically
+hygroscopicity
+hygrostat
+hying
+hyksos
+hyla
+hylomorphism
+hylophagous
+hylotheism
+hylozoism
+Hyman
+hymen
+hymenal
+hymeneal
+hymeneally
+hymenial
+hymenium
+hymenopteran
+hymenopterous
+hymens
+hymettus
+hymn
+hymn's
+hymnal
+hymnary
+hymnbook
+hymning
+hymnist
+hymnody
+hymnology
+hymns
+Hynninen
+hyoid
+hyoscyamine
+Hyoscyamus
+hypabyssal
+hypaesthesia
+hypaethral
+hypallage
+hypanthium
+hype
+hype's
+hyped
+hyper
+hyperacid
+hyperacidity
+hyperactive
+hyperactivity
+hyperaemia
+hyperbaric
+hyperbarically
+hyperbaton
+hyperbola
+hyperbole
+hyperbolic
+hyperbolical
+hyperbolically
+hyperbolist
+hyperbolize
+hyperbolized
+hyperbolizes
+hyperbolizing
+hyperboloid
+hyperboloidal
+hyperborean
+hypercatalectic
+hypercatharsises
+hypercellularity
+hypercharge
+hypercivilization
+hypercivilization's
+hypercivilizations
+hypercivilized
+hypercivilized's
+hypercivilizeds
+hypercorrect
+hypercorrection
+hypercritic
+hypercritical
+hypercritically
+hypercriticism
+hypercriticize
+hypercriticizes
+hypercube
+hypercube's
+hypercubes
+hyperdulia
+hyperemia
+hyperemic
+hyperemphasize
+hyperemphasizes
+hyperesthesia
+hyperesthetic
+hypereutectic
+hyperextension
+hyperfine
+hyperfocal
+hypergamous
+hypergamously
+hypergamy
+hyperglycaemia
+hyperglycemia
+hyperglycemic
+hyperimmunization
+hyperimmunization's
+hyperimmunizations
+hyperimmunize
+hyperimmunizes
+hyperinsulinism
+hyperinsulinization
+hyperinsulinization's
+hyperinsulinizations
+hyperinsulinize
+hyperinsulinizes
+hyperion
+hyperirritability
+hyperirritable
+hyperkeratosis
+hyperkeratotic
+hyperkinesia
+hyperkinesis
+hyperkinetic
+hypermarket
+hypermeter
+hypermeter's
+hypermeters
+hypermetric
+hypermetrical
+hypermetropia
+hypermetropic
+hypermetropical
+hypermetropy
+hypermnesia
+hypermnesic
+hypermorph
+hypermorphic
+hypermorphism
+hyperon
+hyperope
+hyperopia
+hyperopic
+hyperostosis
+hyperostotic
+hyperoxygenize
+hyperoxygenizes
+hyperparasite
+hyperparasitic
+hyperparasitism
+hyperparasitize
+hyperparasitizes
+hyperphagia
+hyperphysical
+hyperphysically
+hyperpituitarism
+hyperpituitary
+hyperplane
+hyperplanes
+hyperplasia
+hyperplastic
+hyperploid
+hyperploidy
+hyperpnoea
+hyperpyrexia
+hyperrealize
+hyperrealizes
+hypersensitive
+hypersensitiveness
+hypersensitivity
+hypersensitization
+hypersensitization's
+hypersensitizations
+hypersensitize
+hypersensitized
+hypersensitizes
+hypersensitizing
+hypersonic
+hypersonically
+hyperspace
+hyperspiritualizing
+hyperspiritualizing's
+hyperspiritualizings
+hyperstability
+hyperstable
+hypersthene
+hypersurface
+hypertension
+hypertensive
+hyperterm
+hyperterms
+hypertext
+hypertext's
+hyperthermia
+hyperthermic
+hyperthyroid
+hyperthyroidism
+hyperthyroidization
+hyperthyroidization's
+hyperthyroidizations
+hyperthyroidize
+hyperthyroidizes
+hypertonic
+hypertonicity
+hypertrophic
+hypertrophied
+hypertrophy
+hypervelocity
+hyperventilation
+hypervitalization
+hypervitalization's
+hypervitalizations
+hypervitalize
+hypervitalizes
+hypervitaminosis
+hypes
+hypesthesia
+hypethral
+hypha
+hyphae
+hyphal
+hyphen
+hyphen's
+hyphenate
+hyphenated
+hyphenates
+hyphenating
+hyphenation
+hyphenations
+hyphened
+hyphening
+hyphenization
+hyphenization's
+hyphenizations
+hyphenize
+hyphenizes
+hyphenless
+hyphens
+hypnagogic
+hypnoanalysis
+hypnogenesis
+hypnogenetic
+hypnogenetically
+hypnogogic
+hypnoid
+hypnoidal
+hypnology
+hypnopaedia
+hypnopompic
+Hypnos
+hypnoses
+hypnosis
+hypnotherapy
+hypnotic
+hypnotically
+hypnotics
+hypnotism
+hypnotist
+hypnotists
+hypnotizabilities
+hypnotizability
+hypnotizability's
+hypnotizable
+hypnotizable's
+hypnotizables
+hypnotization
+hypnotization's
+hypnotizations
+hypnotize
+hypnotized
+hypnotizer
+hypnotizers
+hypnotizes
+hypnotizing
+hypo
+hypoacidity
+hypoactive
+hypoblast
+hypocaust
+hypocellularity
+hypocenter
+hypocentral
+hypochlorite
+hypochlorous
+hypochondria
+hypochondriac
+hypochondriacal
+hypochondriacally
+hypochondrium
+hypocoristic
+hypocoristical
+hypocoristically
+hypocotyl
+hypocrisies
+hypocrisy
+hypocrite
+hypocrite's
+hypocrites
+hypocritic
+hypocritical
+hypocritically
+hypocycloid
+hypoderm
+hypodermic
+hypodermically
+hypodermics
+hypodermis
+hypoeutectic
+hypogastrium
+hypogeal
+hypogene
+hypogenous
+hypogeous
+hypogeum
+hypoglossal
+hypoglycaemia
+hypoglycemia
+hypoglycemic
+hypognathous
+hypogynous
+hypoid
+hypoiodite
+hypolimnion
+hypomania
+hypomorphic
+hyponasty
+hyponitrite
+hyponitrous
+hypophosphate
+hypophosphite
+hypophosphoric
+hypophosphorous
+hypophyge
+hypophyseal
+hypophysectomized
+hypophysis
+hypopituitarism
+hypoplasia
+hypoploid
+hypopnoea
+hypos
+hyposensitization
+hyposensitize
+hypostatization
+hypostatization's
+hypostatizations
+hypostatize
+hypostatizes
+hyposthenia
+hypostyle
+hyposulphite
+hyposulphurous
+hypotaxis
+hypotension
+hypotensive
+hypotenuse
+hypotenuses
+hypothalamic
+hypothalamically
+hypothalamus
+hypothalmus
+hypothec
+hypothecate
+hypothecation
+hypothecator
+hypothenuse
+hypothermal
+hypothermia
+hypothermic
+hypotheses
+hypothesis
+hypothesize
+hypothesized
+hypothesizer
+hypothesizers
+hypothesizes
+hypothesizing
+hypothetic
+hypothetical
+hypothetically
+hypothyroid
+hypothyroidism
+hypotonic
+hypotonically
+hypotonicity
+hypotrophy
+hypoxanthine
+hypoxemia
+hypoxemic
+hypoxia
+hypoxic
+hypsography
+hypsometer
+hypsometer's
+hypsometers
+hypsometric
+hypsometry
+hyracoid
+hyrax
+hyrcania
+Hyson
+hyssop
+hysterectomize
+hysterectomized
+hysterectomizes
+hysterectomizing
+hysterectomy
+hysteresis
+hysteretic
+hysteria
+hysteric
+hysterical
+hysterically
+hysterics
+hysterogenic
+hysteroid
+hysteron
+hysterotomy
+hystricomorph
+Hz
+I'd
+I'll
+I'm
+i's
+I've
+IA
+iamb
+iambic
+iambus
+iambuses
+Ian
+Ian's
+Iapetus
+iata
+iatric
+iatrogenic
+ibadan
+ibarruri
+Iberia
+Iberian
+ibero
+Ibero
+ibert
+ibex
+ibibio
+ibid
+ibidem
+ibis
+ibises
+ibiza
+IBM
+IBM's
+Ibn
+Ibo
+Ibrahim
+Ibsen
+Icaria
+Icarian
+Icarus
+ICC
+ice
+iceberg
+iceberg's
+icebergs
+iceblink
+icebound
+icebox
+icebreaker
+icecap
+icecap's
+icecaps
+iced
+icefall
+icehouse
+Iceland
+Iceland's
+Icelander
+Icelandic
+iceless
+iceman
+iceman's
+icemans
+Iceni
+ices
+ichang
+ichinomiya
+ichneumon
+ichneumonized
+ichneumonized's
+ichneumonizeds
+ichnography
+ichnology
+ichor
+ichorous
+ichthyic
+ichthyoid
+ichthyolite
+ichthyology
+ichthyophagous
+Ichthyornis
+ichthyosaur
+ichthyosis
+icicle
+icicles
+icier
+iciest
+icily
+iciness
+icing
+icings
+ickier
+icky
+ICL
+icon
+icon's
+iconic
+iconically
+iconicity
+iconium
+iconoclasm
+iconoclast
+iconoclastic
+iconoclastically
+iconographer
+iconographic
+iconographical
+iconographically
+iconography
+iconolatry
+iconological
+iconology
+iconomatic
+iconoscope
+iconostasis
+icons
+icosahedra
+icosahedral
+icosahedron
+icterus
+ictinus
+ictus
+icy
+id
+id's
+Ida
+Ida's
+Idaho
+ide
+idea
+idea's
+ideal
+idealess
+idealism
+idealist
+idealistic
+idealistically
+ideality
+idealization
+idealization's
+idealizations
+idealize
+idealized
+idealizer
+idealizers
+idealizes
+idealizing
+idealless
+ideally
+idealogical
+idealogy
+ideals
+ideas
+ideate
+ideates
+ideation
+ideational
+ideationally
+ideatum
+idem
+idempotent
+idempotents
+identic
+identical
+identically
+identicalness
+identifers
+identifiability
+identifiable
+identifiably
+identification
+identifications
+identified
+identifier
+identifiers
+identifies
+identify
+identifying
+identikit
+identities
+identity
+identity's
+ideogram
+ideogram's
+ideogramic
+ideogrammatic
+ideogrammic
+ideograms
+ideograph
+ideographic
+ideographically
+ideography
+ideolect
+ideologic
+ideological
+ideologically
+ideologies
+ideologist
+ideologists
+ideologue
+ideologues
+ideology
+ideomotor
+ideosyncrasies
+ideosyncrasy
+ides
+idetic
+idioblast
+idiocies
+idiocy
+idiographic
+idiolect
+idiolectal
+idiom
+idiomatic
+idiomatically
+idiomaticness
+idiomorphic
+idiomorphically
+idioms
+idiopathic
+idiopathically
+idiopathy
+idiophone
+idioplasm
+idioplasmatic
+idioplasmic
+idiosyncracies
+idiosyncracy
+idiosyncrasies
+idiosyncrasy
+idiosyncrasy's
+idiosyncratic
+idiosyncratically
+idiot
+idiot's
+idiotic
+idiotical
+idiotically
+idioticalness
+idiotism
+idiotize
+idiotizes
+idiots
+idle
+idled
+idleness
+idler
+idlers
+idles
+idlest
+idling
+idly
+Ido
+idocrase
+idol
+idol's
+idolater
+idolatrize
+idolatrized
+idolatrizes
+idolatrizing
+idolatrous
+idolatrously
+idolatrousness
+idolatry
+idolization
+idolization's
+idolizations
+idolize
+idolized
+idolizer
+idolizers
+idolizes
+idolizing
+idols
+idolum
+Idomeneus
+idun
+idyll
+idyllic
+idyllically
+idyllist
+ie
+IEE
+IEEE
+ieper
+ieyasu
+if
+ife
+iffiness
+iffy
+Ifni
+igbo
+igdrasil
+igfet
+igloo
+igloos
+IGN
+Ignatius
+igneous
+ignescent
+ignis
+ignitability
+ignitable
+ignite
+ignited
+igniter
+ignites
+ignitible
+igniting
+ignition
+ignitions
+ignitor
+ignitron
+ignobility
+ignoble
+ignobleness
+ignobly
+ignominiosness
+ignominious
+ignominiously
+ignominy
+ignorable
+ignoramus
+ignorance
+ignorant
+ignorantly
+ignorantness
+ignoratio
+ignore
+ignored
+ignorer
+ignores
+ignoring
+ignotum
+Igor
+igor
+Igor's
+Igorot
+igraine
+iguana
+Iguanodon
+ihram
+ii
+iii
+Ijssel
+Ijsselmeer
+ikan
+Ike
+Ike's
+ikebana
+ikeja
+ikhnaton
+ikon
+IL
+ilea
+ileac
+ileitis
+ileostomy
+ilesha
+ileum
+ileus
+ilex
+Ilford
+ilia
+iliac
+Iliad
+Iliadize
+Iliadizes
+ilial
+iliamna
+iligan
+ilion
+ilium
+ilk
+ilk's
+Ilkeston
+ilkley
+ill
+illampu
+illation
+illative
+illatively
+illaudable
+illaudably
+illawarra
+illegal
+illegalities
+illegality
+illegalization
+illegalize
+illegalized
+illegalizes
+illegalizing
+illegally
+illegibility
+illegible
+illegibly
+illegitimacy
+illegitimate
+illegitimately
+illegitimatize
+illegitimatizes
+illiberal
+illiberalism
+illiberality
+illiberally
+illiberalness
+illich
+illicit
+illicitly
+illimani
+illimitability
+illimitable
+illimitableness
+illimitably
+illinium
+Illinois
+illiquid
+illiquidity
+illite
+illiteracy
+illiterate
+illiterately
+illiterateness
+illiterates
+illitic
+illness
+illness's
+illnesses
+illocution
+illogic
+illogical
+illogicality
+illogically
+illogicalness
+illon
+ills
+illude
+illume
+illumed
+illuminable
+illuminance
+illuminant
+illuminate
+illuminated
+illuminates
+illuminati
+illuminating
+illuminatingly
+illumination
+illuminations
+illuminative
+illuminator
+illuminators
+illumine
+illumined
+illumines
+illuming
+illuminism
+illuminist
+Illuminize
+Illuminizes
+illus
+illusion
+illusion's
+illusional
+illusionary
+illusionism
+illusionist
+illusionistic
+illusions
+illusive
+illusively
+illusiveness
+illusorily
+illusoriness
+illusory
+illust
+illustrate
+illustrated
+illustrates
+illustrating
+illustration
+illustrational
+illustrations
+illustrative
+illustratively
+illustrator
+illustrator's
+illustrators
+illustrious
+illustriously
+illustriousness
+illutation
+illutation's
+illutations
+illuvial
+illuviate
+illuviation
+illuvium
+illy
+illyria
+Illyrian
+illyricum
+ilmen
+ilmenite
+iloilo
+Ilona
+ilorin
+Ilyushin
+im
+image
+imaged
+Imagen
+imagen
+Imagen's
+imagery
+images
+imaginable
+imaginableness
+imaginably
+imaginal
+imaginarily
+imaginariness
+imaginary
+imaginate
+imagination
+imagination's
+imaginations
+imaginative
+imaginatively
+imaginativeness
+imagine
+imagined
+imaginer
+imagines
+imaging
+imagining
+imaginings
+imagism
+imagist
+imagistic
+imagistically
+imago
+Imai
+imam
+imamate
+imaret
+imbalance
+imbalances
+imbecile
+imbecilely
+imbecilic
+imbecility
+imbed
+imbibe
+imbibed
+imbiber
+imbibing
+imbibition
+imbibitional
+imbitter
+imbosom
+imbricate
+imbricately
+imbrication
+Imbrium
+imbroglio
+imbros
+imbrown
+imbrue
+imbrued
+imbruing
+imbrute
+imbruted
+imbruting
+imbue
+imbued
+imbuing
+imdtly
+ime
+imidazole
+imide
+imidic
+imido
+imine
+imino
+iminourea
+imipramine
+imit
+imitable
+imitate
+imitated
+imitates
+imitating
+imitation
+imitational
+imitations
+imitative
+imitatively
+imitativeness
+imitator
+imitators
+immaculacy
+immaculate
+immaculately
+immaculateness
+immane
+immanence
+immanency
+immanent
+immanentism
+immanentist
+immanentistic
+immanently
+Immanuel
+immaterial
+immaterialism
+immaterialist
+immateriality
+immaterialization
+immaterialize
+immaterialized
+immaterializes
+immaterializing
+immaterially
+immaterialness
+immature
+immaturel
+immaturely
+immatureness
+immaturity
+immeasurable
+immeasurableness
+immeasurably
+immediacies
+immediacy
+immediate
+immediately
+immediateness
+immedicable
+immedicably
+Immelmann
+immemorial
+immemorially
+immense
+immensely
+immenseness
+immensities
+immensity
+immensurable
+immerge
+immerged
+immergence
+immerging
+immerse
+immersed
+immerser
+immerses
+immersible
+immersing
+immersion
+immersionism
+immersions
+immesh
+immethodical
+immethodically
+immigrant
+immigrant's
+immigrants
+immigrate
+immigrated
+immigrates
+immigrating
+immigration
+immigrational
+imminence
+imminency
+imminent
+imminently
+imminentness
+Immingham
+immingle
+immiscibility
+immiscible
+immiscibly
+immitigable
+immitigableness
+immitigably
+immittance
+immix
+immixture
+immobile
+immobilism
+immobility
+immobilization
+immobilization's
+immobilizations
+immobilize
+immobilized
+immobilizer
+immobilizes
+immobilizing
+immoderacy
+immoderate
+immoderately
+immoderateness
+immoderation
+immodest
+immodestly
+immodesty
+immolate
+immolation
+immolator
+immoral
+immoralist
+immoralities
+immorality
+immoralize
+immoralizes
+immorally
+immortal
+immortality
+immortalizable
+immortalizable's
+immortalizables
+immortalization
+immortalization's
+immortalizations
+immortalize
+immortalized
+immortalizer
+immortalizers
+immortalizes
+immortalizing
+immortally
+immortals
+immortelle
+immotile
+immotility
+immovability
+immovable
+immovableness
+immovably
+immoveables
+immune
+immunities
+immunity
+immunity's
+immunization
+immunization's
+immunizations
+immunize
+immunized
+immunizes
+immunizing
+immunoassay
+immunochemical
+immunochemically
+immunochemistry
+immunoelectrophoresis
+immunofluorescence
+immunofluorescent
+immunogenesis
+immunogenetic
+immunogenetically
+immunogenetics
+immunogenic
+immunogenically
+immunogenicity
+immunoglobulin
+immunohematological
+immunohematology
+immunologic
+immunological
+immunologically
+immunologist
+immunology
+immunomicrosphere
+immunopathologic
+immunopathological
+immunopathologist
+immunopathology
+immunoreaction
+immunosuppression
+immunosuppressive
+immunotherapy
+immunotoxin
+immunotoxins
+immure
+immured
+immurement
+immures
+immuring
+immutability
+immutable
+immutableness
+immutably
+imp
+imp's
+impact
+impacted
+impacter
+impacting
+impaction
+impactionize
+impactionizes
+impactions
+impactive
+impactor
+impactor's
+impactors
+impacts
+impair
+impaired
+impairer
+impairing
+impairment
+impairs
+impala
+impale
+impaled
+impalement
+impales
+impaling
+impalpability
+impalpable
+impalpably
+impanation
+impanel
+impaneled
+impaneling
+imparadised
+imparipinnate
+imparisyllabic
+imparity
+impart
+impartable
+impartation
+imparted
+impartial
+impartiality
+impartially
+impartible
+impartibly
+imparting
+impartment
+imparts
+impassability
+impassable
+impassableness
+impassably
+impasse
+impasses
+impassibility
+impassible
+impassibly
+impassion
+impassioned
+impassioning
+impassions
+impassive
+impassively
+impassiveness
+impassivity
+impaste
+impasto
+impatience
+Impatiens
+impatient
+impatiently
+impeach
+impeachable
+impeached
+impeaches
+impeaching
+impeachment
+impearl
+impeccability
+impeccable
+impeccably
+impeccant
+impecuniosity
+impecunious
+impecuniously
+impecuniousness
+impedance
+impedance's
+impedances
+impede
+impeded
+impeder
+impedes
+impediment
+impediment's
+impedimenta
+impediments
+impeding
+impel
+impelled
+impeller
+impellers
+impelling
+impellor
+impels
+impend
+impendent
+impending
+impenetrability
+impenetrable
+impenetrableness
+impenetrably
+impenitence
+impenitent
+impenitently
+impennate
+imperate
+imperative
+imperatively
+imperativeness
+imperatives
+imperator
+imperatorial
+imperceivable
+imperceptibility
+imperceptible
+imperceptibly
+imperceptive
+imperceptiveness
+imperceptivity
+imperfect
+imperfectability
+imperfection
+imperfection's
+imperfections
+imperfective
+imperfectivity
+imperfectly
+imperfectness
+imperforate
+imperforated
+imperforates
+imperial
+imperialism
+imperialist
+imperialist's
+imperialistic
+imperialistically
+imperialists
+imperialization
+imperialization's
+imperializations
+imperialize
+imperializes
+imperially
+imperil
+imperiled
+imperiling
+imperilment
+imperious
+imperiously
+imperiousness
+imperishability
+imperishable
+imperishableness
+imperishably
+imperium
+impermanence
+impermanency
+impermanent
+impermanently
+impermeability
+impermeable
+impermeableness
+impermeably
+impermissibility
+impermissible
+impermissibly
+imperscriptible
+impersonal
+impersonality
+impersonalization
+impersonalization's
+impersonalizations
+impersonalize
+impersonalized
+impersonalizes
+impersonalizing
+impersonally
+impersonate
+impersonated
+impersonates
+impersonating
+impersonation
+impersonations
+impersonator
+impertinence
+impertinency
+impertinent
+impertinently
+imperturbability
+imperturbable
+imperturbably
+impervious
+imperviously
+imperviousness
+impetigo
+impetrate
+impetrated
+impetrates
+impetrating
+impetration
+impetrations
+impetuosity
+impetuous
+impetuously
+impetuousness
+impetus
+imphal
+impi
+impiety
+impinge
+impinged
+impingement
+impinges
+impinging
+impious
+impiously
+impish
+impishly
+impishness
+implacability
+implacable
+implacableness
+implacably
+implacental
+implant
+implantable
+implantation
+implanted
+implanter
+implanting
+implants
+implausibility
+implausible
+implausibly
+implead
+implement
+implementability
+implementable
+implemental
+implementation
+implementation's
+implementations
+implemented
+implementer
+implementers
+implementing
+implementor
+implementor's
+implementors
+implements
+implicant
+implicant's
+implicants
+implicate
+implicated
+implicates
+implicating
+implication
+implications
+implicative
+implicatively
+implicativeness
+implicit
+implicitly
+implicitness
+implied
+implies
+implode
+imploded
+implodes
+imploding
+implore
+implored
+implores
+imploring
+implosion
+implosions
+implosive
+implosively
+imply
+implying
+impolder
+impolicy
+impolite
+impolitely
+impoliteness
+impolitic
+impolitical
+impolitically
+impoliticly
+impoliticness
+imponderabilia
+imponderability
+imponderable
+imponderableness
+imponderables
+imponderably
+imponent
+import
+importable
+importance
+importancy
+important
+importantly
+importation
+importations
+imported
+importer
+importers
+importing
+imports
+importunate
+importunately
+importunateness
+importune
+importunely
+importuner
+importuners
+importunities
+importunity
+imposable
+impose
+imposed
+imposer
+imposes
+imposing
+imposingly
+imposition
+imposition's
+impositions
+impossibilities
+impossibility
+impossible
+impossibleness
+impossibles
+impossibly
+impost
+imposter
+imposthume
+impostor
+impostor's
+impostors
+imposts
+impostume
+imposture
+impotence
+impotency
+impotent
+impotently
+impound
+impounded
+impounding
+impoundment
+impoundments
+impounds
+impoverish
+impoverished
+impoverisher
+impoverishes
+impoverishing
+impoverishment
+impower
+impracticability
+impracticable
+impracticableness
+impracticably
+impractical
+impracticality
+impractically
+impracticalness
+imprecate
+imprecated
+imprecates
+imprecating
+imprecation
+imprecations
+imprecatory
+imprecise
+imprecisely
+impreciseness
+imprecision
+impregnability
+impregnable
+impregnableness
+impregnably
+impregnate
+impregnated
+impregnates
+impregnating
+impregnation
+impregnations
+impregnator
+impregnators
+impresa
+impresario
+imprescriptible
+impress
+impressed
+impresser
+impresses
+impressibility
+impressible
+impressibly
+impressing
+impression
+impression's
+impressionability
+impressionable
+impressionableness
+impressionably
+impressional
+impressionism
+impressionist
+impressionistic
+impressionistically
+impressionists
+impressions
+impressive
+impressively
+impressiveness
+impressment
+impressure
+imprest
+imprimatur
+imprimis
+imprint
+imprinted
+imprinting
+imprints
+imprison
+imprisonable
+imprisoned
+imprisoning
+imprisonment
+imprisonment's
+imprisonments
+imprisons
+improbability
+improbable
+improbableness
+improbably
+improbity
+impromptu
+improper
+improperly
+improperness
+impropitious
+impropriety
+improvability
+improvable
+improvably
+improve
+improved
+improvement
+improvements
+improver
+improves
+improvidence
+improvident
+improvidently
+improving
+improvisation
+improvisation's
+improvisational
+improvisations
+improvisator
+improvisatorial
+improvisatory
+improvise
+improvised
+improviser
+improvisers
+improvises
+improvising
+improvisor
+improvizatorize
+improvizatorizes
+imprudence
+imprudent
+imprudently
+imps
+impudence
+impudent
+impudently
+impudicity
+impugn
+impugnable
+impugned
+impugner
+impugning
+impugns
+impuissance
+impuissant
+impulse
+impulsed
+impulses
+impulsing
+impulsion
+impulsions
+impulsive
+impulsively
+impulsiveness
+impunity
+impure
+impurely
+impureness
+impurities
+impurity
+impurity's
+imputability
+imputable
+imputation
+imputations
+imputative
+imputatively
+impute
+imputed
+imputes
+imputing
+imroz
+in
+inabilities
+inability
+inaccessibility
+inaccessible
+inaccessibly
+inaccuracies
+inaccuracy
+inaccurate
+inaccurately
+inaction
+inactions
+inactivate
+inactivation
+inactive
+inactively
+inactivity
+inadequacies
+inadequacy
+inadequate
+inadequately
+inadequateness
+inadmissibility
+inadmissible
+inadmissibly
+inadvertence
+inadvertency
+inadvertent
+inadvertently
+inadvisability
+inadvisable
+inalienability
+inalienable
+inalienably
+inalterability
+inalterable
+inalterableness
+inalterably
+inamorata
+inane
+inanely
+inaneness
+inaner
+inanest
+inanimate
+inanimately
+inanimateness
+inanition
+inanity
+inapparent
+inapparently
+inappeasable
+inappellable
+inappetence
+inapplicability
+inapplicable
+inapplicably
+inapposite
+inappositely
+inappositeness
+inappreciable
+inappreciably
+inappreciative
+inappreciatively
+inappreciativeness
+inapprehensive
+inapproachable
+inappropriate
+inappropriately
+inappropriateness
+inapt
+inaptitude
+inaptly
+inaptness
+inarch
+inarguable
+inarguably
+inarticulable
+inarticulate
+inarticulately
+inarticulateness
+inartificial
+inartistic
+inartistically
+inasmuch
+inattention
+inattentive
+inattentively
+inattentiveness
+inaudibility
+inaudible
+inaudibly
+inaugural
+inaugurate
+inaugurated
+inaugurating
+inauguration
+inaugurations
+inaugurator
+inaugurators
+inauspicious
+inauspiciously
+inauspiciousness
+inauthentic
+inauthenticity
+Inbal
+inbeing
+inboard
+inboards
+inborn
+inbound
+inbounds
+inbreathe
+inbred
+inbreed
+inbreeder
+inbreeding
+inbuilt
+Inc
+Inca
+incalculability
+incalculable
+incalculableness
+incalculably
+incalescence
+incalescences
+incalescent
+incandesce
+incandesced
+incandescence
+incandescent
+incandescently
+incandesces
+incandescing
+incant
+incantation
+incantational
+incantations
+incantatory
+incanted
+incapability
+incapable
+incapableness
+incapably
+incapacitate
+incapacitated
+incapacitates
+incapacitating
+incapacitation
+incapacitator
+incapacity
+incaparina
+incapsulate
+incarcerate
+incarcerated
+incarcerates
+incarcerating
+incarceration
+incardinate
+incardination
+incarnadine
+incarnate
+incarnation
+incarnation's
+incarnations
+Incas
+incase
+incaution
+incautious
+incautiously
+incautiousness
+incendiaries
+incendiarism
+incendiary
+incense
+incensed
+incenses
+incensing
+incensory
+incentive
+incentive's
+incentively
+incentives
+incept
+incepted
+incepting
+inception
+inceptions
+inceptive
+inceptively
+inceptor
+incepts
+incertitude
+incessancy
+incessant
+incessantly
+incest
+incestuous
+incestuously
+incestuousness
+inch
+inched
+inches
+inching
+inchmeal
+inchoate
+inchoately
+inchoateness
+inchoative
+inchoatively
+inchon
+inchworm
+inchworm's
+inchworms
+incidence
+incidences
+incident
+incident's
+incidental
+incidentally
+incidentals
+incidents
+incinerate
+incinerated
+incinerates
+incinerating
+incineration
+incinerations
+incinerator
+incinerators
+incipience
+incipiency
+incipient
+incipiently
+incipit
+incise
+incised
+incises
+incising
+incision
+incision's
+incisions
+incisive
+incisively
+incisiveness
+incisor
+incisor's
+incisors
+incisure
+incitant
+incitants
+incitation
+incitations
+incite
+incited
+incitement
+incitements
+inciter
+incites
+inciting
+incivility
+inclemency
+inclement
+inclemently
+inclinable
+inclination
+inclination's
+inclinational
+inclinations
+incline
+inclined
+incliner
+inclines
+inclining
+inclinometer
+inclinometer's
+inclinometers
+inclip
+inclose
+inclosed
+incloses
+inclosing
+includable
+include
+included
+includes
+includible
+including
+incluse
+inclusion
+inclusion's
+inclusions
+inclusive
+inclusively
+inclusiveness
+incoercible
+incog
+incogitable
+incogitant
+incognita
+incognito
+incognizance
+incognizant
+incoherence
+incoherences
+incoherent
+incoherently
+incombustibility
+incombustible
+income
+incomer
+incomers
+incomes
+incoming
+incommensurability
+incommensurable
+incommensurably
+incommensurate
+incommode
+incommodious
+incommodiously
+incommodiousness
+incommodity
+incommunicability
+incommunicable
+incommunicably
+incommunicado
+incommunicative
+incommutable
+incommutably
+incomparability
+incomparable
+incomparably
+incompatibilities
+incompatibility
+incompatibility's
+incompatible
+incompatibly
+incompetence
+incompetency
+incompetent
+incompetent's
+incompetently
+incompetents
+incomplete
+incompletely
+incompleteness
+incompletion
+incompliant
+incomprehensibility
+incomprehensible
+incomprehensibleness
+incomprehensibly
+incomprehension
+incomprehensive
+incompressibility
+incompressible
+incompressibly
+incomputable
+incomputably
+inconceivability
+inconceivable
+inconceivableness
+inconceivably
+inconcinnity
+inconclusive
+inconclusively
+inconclusiveness
+incondensable
+incondite
+inconformity
+incongruence
+incongruent
+incongruently
+incongruities
+incongruity
+incongruous
+incongruously
+incongruousness
+inconscient
+inconsecutive
+inconsequence
+inconsequent
+inconsequential
+inconsequentiality
+inconsequentially
+inconsequently
+inconsiderable
+inconsiderableness
+inconsiderably
+inconsiderate
+inconsiderately
+inconsiderateness
+inconsideration
+inconsistence
+inconsistencies
+inconsistency
+inconsistency's
+inconsistent
+inconsistently
+inconsolable
+inconsolableness
+inconsolably
+inconsonance
+inconsonant
+inconspicuous
+inconspicuously
+inconspicuousness
+inconstancy
+inconstant
+inconstantly
+inconsumable
+inconsumably
+incontestability
+incontestable
+incontestably
+incontinence
+incontinency
+incontinent
+incontinently
+incontrollable
+incontrovertible
+incontrovertibly
+inconvenience
+inconvenienced
+inconveniences
+inconveniencing
+inconveniency
+inconvenient
+inconveniently
+inconvertibility
+inconvertible
+inconvertibly
+inconvincible
+incoordinate
+incoordination
+incorporable
+incorporate
+incorporated
+incorporates
+incorporating
+incorporation
+incorporative
+incorporator
+incorporeal
+incorporeally
+incorporeity
+incorrect
+incorrectly
+incorrectness
+incorrigibility
+incorrigible
+incorrigibleness
+incorrigibly
+incorrupt
+incorrupted
+incorruptibility
+incorruptible
+incorruptibly
+incorruption
+incorruptly
+incorruptness
+increasable
+increase
+increased
+increaser
+increases
+increasing
+increasingly
+increate
+incredibility
+incredible
+incredibleness
+incredibly
+incredulity
+incredulous
+incredulously
+increment
+incremental
+incrementalism
+incrementalist
+incrementalists
+incrementally
+incrementation
+incremented
+incrementing
+increments
+increscent
+incriminate
+incriminated
+incriminates
+incriminating
+incrimination
+incriminatory
+incross
+incrossbred
+incrust
+incrustation
+incubate
+incubated
+incubates
+incubating
+incubation
+incubational
+incubative
+incubator
+incubator's
+incubators
+incubatory
+incubi
+incubus
+incudes
+inculcate
+inculcated
+inculcates
+inculcation
+inculcator
+inculpable
+inculpate
+inculpation
+inculpative
+inculpatory
+incult
+incumbency
+incumbent
+incumbents
+incumber
+incunabula
+incunabulum
+incur
+incurability
+incurable
+incurableness
+incurables
+incurably
+incuriosity
+incurious
+incuriously
+incuriousness
+incurred
+incurrence
+incurrent
+incurrer
+incurring
+incurs
+incursion
+incursions
+incurvate
+incurvated
+incurvates
+incurvating
+incurvation
+incurvature
+incurve
+incus
+incuse
+Ind
+indaba
+indagate
+indagation
+indagator
+indamine
+indebted
+indebtedness
+indecency
+indecent
+indecently
+indeces
+indecipherable
+indecision
+indecisive
+indecisively
+indecisiveness
+indeclinable
+indecomposable
+indecorous
+indecorously
+indecorousness
+indecorum
+indeed
+indefatigability
+indefatigable
+indefatigableness
+indefatigably
+indefeasibility
+indefeasible
+indefeasibly
+indefectibility
+indefectible
+indefectibly
+indefensibility
+indefensible
+indefensibly
+indefinability
+indefinable
+indefinableness
+indefinably
+indefinite
+indefinitely
+indefiniteness
+indefinity
+indehiscence
+indehiscent
+indelibility
+indelible
+indelibly
+indelicacy
+indelicate
+indelicately
+indelicateness
+indemnification
+indemnifier
+indemnify
+indemnity
+indemonstrable
+indemonstrably
+indene
+indent
+indentation
+indentation's
+indentations
+indented
+indenter
+indenting
+indention
+indents
+indenture
+indentured
+indentures
+indenturing
+independence
+independency
+independent
+independently
+independents
+indescribable
+indescribableness
+indescribably
+indestructibility
+indestructible
+indestructibleness
+indestructibly
+indeterminable
+indeterminableness
+indeterminably
+indeterminacies
+indeterminacy
+indeterminacy's
+indeterminate
+indeterminately
+indeterminateness
+indetermination
+indetermine
+indeterminism
+indeterminist
+indeterministic
+index
+indexable
+indexation
+indexed
+indexer
+indexers
+indexes
+indexical
+indexing
+India
+India's
+Indiaman
+Indian
+Indian's
+Indiana
+Indiana's
+Indianapolis
+Indians
+Indic
+indican
+indicant
+indicants
+indicate
+indicated
+indicates
+indicating
+indication
+indicational
+indications
+indicative
+indicatively
+indicatives
+indicator
+indicator's
+indicators
+indicatory
+indices
+indicia
+indict
+indictable
+indicted
+indicter
+indiction
+indictment
+indictment's
+indictments
+indictor
+Indies
+indifference
+indifferency
+indifferent
+indifferentism
+indifferentist
+indifferently
+indigen
+indigence
+indigene
+indigenes
+indigenous
+indigenously
+indigenousness
+indigent
+indigested
+indigestibility
+indigestible
+indigestion
+indigestive
+indign
+indignant
+indignantly
+indignation
+indignities
+indignity
+indigo
+indigoid
+indigotin
+Indira
+indirect
+indirected
+indirecting
+indirection
+indirections
+indirectly
+indirectness
+indirects
+indiscernability
+indiscernible
+indisciplinable
+indiscipline
+indisciplined
+indiscoverable
+indiscreet
+indiscreetly
+indiscreetness
+indiscrete
+indiscretion
+indiscriminate
+indiscriminately
+indiscriminateness
+indiscriminating
+indiscriminatingly
+indiscrimination
+indiscussible
+indispensability
+indispensable
+indispensableness
+indispensably
+indispose
+indisposed
+indisposes
+indisposing
+indisposition
+indisputable
+indisputableness
+indisputably
+indissociable
+indissociably
+indissolubility
+indissoluble
+indissolubleness
+indissolubly
+indistinct
+indistinctive
+indistinctly
+indistinctness
+indistinguishability
+indistinguishable
+indistinguishableness
+indistinguishably
+indite
+indited
+inditer
+inditing
+indium
+indivertible
+indivertibly
+individual
+individual's
+individualism
+individualist
+individualistic
+individualistically
+individualists
+individuality
+individualization
+individualization's
+individualizations
+individualize
+individualized
+individualizer
+individualizers
+individualizes
+individualizing
+individualizingly
+individually
+individuals
+individuate
+individuated
+individuates
+individuating
+individuation
+indivisibility
+indivisible
+indivisibleness
+indivisibly
+indo
+Indo
+Indochina
+Indochinese
+indocile
+indocility
+indoctrinate
+indoctrinated
+indoctrinates
+indoctrinating
+indoctrination
+indoctrinator
+Indoeuropean
+indole
+indoleacetic
+indolebutyric
+indolence
+indolent
+indolently
+Indologist
+indomethacin
+indomitability
+indomitable
+indomitableness
+indomitably
+Indonesia
+Indonesian
+indoor
+indoors
+indophenol
+indore
+indorsee
+indoxyl
+indra
+indraft
+indrawn
+indre
+Indris
+indubitability
+indubitable
+indubitableness
+indubitably
+induce
+induced
+inducement
+inducement's
+inducements
+inducer
+induces
+inducibility
+inducible
+inducing
+induct
+inductance
+inductances
+inducted
+inductee
+inductees
+inductile
+inducting
+induction
+induction's
+inductions
+inductive
+inductively
+inductiveness
+inductor
+inductor's
+inductors
+inducts
+indue
+indulge
+indulged
+indulgence
+indulgence's
+indulgences
+indulgent
+indulgently
+indulger
+indulges
+indulging
+indult
+induna
+induplicate
+indurate
+induration
+indurative
+Indus
+indusium
+industrial
+industrialism
+industrialist
+industrialist's
+industrialists
+industrialization
+industrialization's
+industrializations
+industrialize
+industrialized
+industrializes
+industrializing
+industrially
+industrials
+industries
+industrious
+industriously
+industriousness
+industry
+industry's
+indwell
+indweller
+indwelling
+indy
+Indy
+inearth
+inebriant
+inebriate
+inebriated
+inebriates
+inebriating
+inebriation
+inebriety
+inedible
+inedited
+ineducability
+ineducable
+ineffability
+ineffable
+ineffableness
+ineffably
+ineffaceability
+ineffaceable
+ineffaceably
+ineffective
+ineffectively
+ineffectiveness
+ineffectual
+ineffectuality
+ineffectually
+ineffectualness
+inefficacious
+inefficaciously
+inefficaciousness
+inefficacy
+inefficiencies
+inefficiency
+inefficient
+inefficiently
+inegalitarian
+inelastic
+inelastically
+inelasticity
+inelegance
+inelegant
+inelegantly
+ineligibility
+ineligible
+ineliminable
+ineloquent
+ineloquently
+ineluctability
+ineluctable
+ineluctably
+ineludible
+inenarrable
+inept
+ineptitude
+ineptly
+ineptness
+inequable
+inequalities
+inequality
+inequitable
+inequitably
+inequities
+inequity
+inequivalent
+inequivalve
+inequivalved
+ineradicability
+ineradicable
+ineradicably
+inerrable
+inerrancy
+inerrant
+inert
+inertance
+inertia
+inertial
+inertially
+inertias
+inertly
+inertness
+inescapable
+inescapably
+inescutcheon
+inessential
+inessive
+inestimable
+inestimably
+inevitabilities
+inevitability
+inevitable
+inevitableness
+inevitably
+inexact
+inexactitude
+inexactly
+inexactness
+inexcusable
+inexcusableness
+inexcusably
+inexhaustibility
+inexhaustible
+inexhaustibleness
+inexhaustibly
+inexistence
+inexistent
+inexorability
+inexorable
+inexorableness
+inexorably
+inexpedience
+inexpediency
+inexpedient
+inexpediently
+inexpensive
+inexpensively
+inexpensiveness
+inexperience
+inexperienced
+inexpert
+inexpertly
+inexpertness
+inexpiable
+inexpiably
+inexplainable
+inexplicability
+inexplicable
+inexplicableness
+inexplicably
+inexplicit
+inexpressibility
+inexpressible
+inexpressibleness
+inexpressibly
+inexpressive
+inexpressively
+inexpressiveness
+inexpugnable
+inexpugnableness
+inexpugnably
+inexpungible
+inextensible
+inextinguishable
+inextinguishably
+inextirpable
+inextricability
+inextricable
+inextricably
+infall
+infallibilism
+infallibility
+infallible
+infallibly
+infamous
+infamously
+infamy
+infancy
+infant
+infant's
+infanta
+infante
+infanticide
+infanticide's
+infantile
+infantilism
+infantility
+infantry
+infantryman
+infantrymen
+infants
+infarct
+infarcted
+infarction
+infare
+infatuate
+infatuated
+infatuation
+infatuations
+infauna
+infaunal
+infeasible
+infect
+infected
+infecting
+infection
+infection's
+infections
+infectious
+infectiously
+infectiousness
+infective
+infectivity
+infector
+infects
+infecund
+infecundibility
+infelicitous
+infelicitously
+infelicity
+infer
+inferable
+inference
+inference's
+inferencer
+inferences
+inferencing
+inferential
+inferentially
+inferior
+inferior's
+inferiority
+inferiorize
+inferiorizes
+inferiorly
+inferiors
+infernal
+infernalize
+infernalizes
+infernally
+inferno
+inferno's
+infernos
+inferred
+inferrer
+inferrible
+inferring
+infers
+infertile
+infertility
+infest
+infestant
+infestation
+infestations
+infested
+infester
+infesting
+infests
+infeudation
+infibulate
+infidel
+infidel's
+infidelity
+infidelize
+infidelizes
+infidels
+infield
+infield's
+infielder
+infielder's
+infielders
+infields
+infight
+infighter
+infighter's
+infighters
+infighting
+infill
+infiltrate
+infiltrated
+infiltrates
+infiltrating
+infiltration
+infiltrative
+infiltrator
+infiltrators
+infinite
+infinitely
+infiniteness
+infinitesimal
+infinitesimally
+infinities
+infinitival
+infinitive
+infinitive's
+infinitively
+infinitives
+infinitize
+infinitizes
+infinitude
+infinitum
+infinity
+infirm
+infirmary
+infirmed
+infirmity
+infirmly
+infix
+infix's
+infixes
+inflame
+inflamed
+inflamer
+inflaming
+inflammability
+inflammable
+inflammableness
+inflammably
+inflammation
+inflammatorily
+inflammatory
+inflatable
+inflate
+inflated
+inflater
+inflates
+inflating
+inflation
+inflationary
+inflationism
+inflationist
+inflator
+inflect
+inflected
+inflecting
+inflection
+inflectional
+inflectionally
+inflections
+inflective
+inflects
+inflexed
+inflexibility
+inflexible
+inflexibleness
+inflexibly
+inflexion
+inflict
+inflicted
+inflicter
+inflicting
+infliction
+inflictive
+inflictor
+inflicts
+inflorescence
+inflorescences
+inflorescent
+inflow
+inflows
+influence
+influenced
+influencer
+influences
+influencing
+influent
+influential
+influentially
+influenza
+influx
+info
+infold
+inform
+informal
+informality
+informalize
+informalizes
+informally
+informant
+informant's
+informants
+Informatica
+informatics
+information
+informational
+informations
+informative
+informatively
+informativeness
+informatory
+informed
+informer
+informers
+informing
+informs
+infra
+infracostal
+infract
+infraction
+infractions
+infractor
+infrahuman
+infralapsarian
+infrangibility
+infrangible
+infrangibleness
+infrangibly
+infrared
+infrasonic
+infraspecific
+infrastructural
+infrastructure
+infrastructures
+infrequence
+infrequency
+infrequent
+infrequently
+infringe
+infringed
+infringement
+infringement's
+infringements
+infringer
+infringes
+infringing
+infulae
+infundibular
+infundibulate
+infundibuliform
+infundibulum
+infuriate
+infuriated
+infuriately
+infuriates
+infuriating
+infuriatingly
+infuriation
+infuscate
+infuse
+infused
+infuser
+infuses
+infusibility
+infusible
+infusibleness
+infusing
+infusion
+infusionism
+infusions
+infusoria
+infusorial
+infusorian
+ingather
+ingathering
+inge
+ingeminate
+ingenerate
+ingenious
+ingeniously
+ingeniousness
+ingenue
+ingenuity
+ingenuous
+ingenuously
+ingenuousness
+Ingersoll
+ingest
+ingesta
+ingested
+ingestible
+ingestion
+ingestive
+ingle
+ingleborough
+inglenook
+inglorious
+ingloriously
+ingloriousness
+ingoing
+ingolstadt
+ingot
+ingraft
+ingrain
+ingrained
+ingrainedly
+ingrains
+Ingram
+ingrate
+ingratiate
+ingratiating
+ingratiatingly
+ingratiation
+ingratiatory
+ingratitude
+ingravescent
+ingredient
+ingredient's
+ingredients
+ingres
+ingress
+ingression
+ingressive
+ingressiveness
+ingrowing
+ingrown
+ingrownness
+ingrowth
+ingrowths
+inguinal
+ingulf
+ingurgitate
+ingurgitation
+Ingush
+inhabit
+inhabitable
+inhabitance
+inhabitancy
+inhabitant
+inhabitant's
+inhabitants
+inhabitation
+inhabited
+inhabiter
+inhabiting
+inhabits
+inhalant
+inhalation
+inhalational
+inhalator
+inhale
+inhaled
+inhaler
+inhales
+inhaling
+inhambane
+inharmonic
+inharmonious
+inharmoniously
+inharmoniousness
+inharmony
+inhaul
+inhere
+inhered
+inherence
+inherent
+inherently
+inheres
+inhering
+inherit
+inheritability
+inheritable
+inheritableness
+inheritance
+inheritance's
+inheritances
+inherited
+inheriting
+inheritor
+inheritor's
+inheritors
+inheritress
+inheritress's
+inheritresses
+inheritrices
+inheritrix
+inherits
+inhesion
+inhibit
+inhibited
+inhibiter
+inhibiting
+inhibition
+inhibition's
+inhibitions
+inhibitive
+inhibitor
+inhibitors
+inhibitory
+inhibits
+inholding
+inholdings
+inhomogeneities
+inhomogeneity
+inhomogeneous
+inhospitable
+inhospitableness
+inhospitably
+inhospitality
+inhuman
+inhumane
+inhumanely
+inhumanities
+inhumanity
+inhumanize
+inhumanizes
+inhumanly
+inhumanness
+inhumation
+inhume
+inhumed
+inhumes
+inhuming
+inimical
+inimically
+inimitable
+inimitableness
+inimitably
+inion
+iniquities
+iniquitous
+iniquitously
+iniquitousness
+iniquity
+iniquity's
+initial
+initialed
+initialer
+initialing
+initialism
+initializable
+initialization
+initialization's
+initializations
+initialize
+initialized
+initializer
+initializers
+initializes
+initializing
+initialness
+initials
+initiate
+initiated
+initiates
+initiating
+initiation
+initiations
+initiative
+initiative's
+initiatives
+initiator
+initiator's
+initiators
+initiatory
+initio
+inject
+injectable
+injectant
+injected
+injecting
+injection
+injection's
+injections
+injective
+injector
+injectors
+injects
+injudicious
+injudiciously
+injudiciousness
+injunct
+injunction
+injunction's
+injunctions
+injunctive
+injure
+injured
+injurer
+injures
+injuries
+injuring
+injurious
+injuriously
+injuriousness
+injury
+injury's
+injustice
+injustice's
+injustices
+ink
+inkberry
+inkblot
+inked
+inker
+Inkerman
+inkers
+inkhorn
+inkiness
+inking
+inkings
+inkle
+inkling
+inkling's
+inklings
+inks
+inkstand
+inkwell
+inky
+inlace
+inlaid
+inland
+inlander
+inlay
+inlayer
+inlaying
+inlet
+inlet's
+inlets
+inlier
+inly
+inlying
+Inman
+Inman's
+inmate
+inmate's
+inmates
+inmesh
+inmigrant
+inmost
+inn
+innard
+innards
+innate
+innately
+innateness
+inner
+innerly
+innermost
+innersole
+innerspring
+innervate
+innervated
+innervates
+innervating
+innervation
+innervational
+innerve
+inning
+innings
+inniskilling
+innkeeper
+innkeeper's
+innkeepers
+innocence
+innocency
+innocent
+innocently
+innocents
+innocuous
+innocuously
+innocuousness
+innominate
+innovate
+innovated
+innovates
+innovating
+innovation
+innovation's
+innovational
+innovations
+innovative
+innovativeness
+innovator
+innovators
+innovatory
+innoxious
+inns
+innsbruck
+innuendo
+innuendoes
+innuendos
+Innuit
+innumerability
+innumerable
+innumerableness
+innumerably
+innumerate
+innumerous
+innutrition
+inobservance
+inobservant
+inoculable
+inoculant
+inoculate
+inoculated
+inoculates
+inoculating
+inoculation
+inoculations
+inoculative
+inoculativity
+inoculator
+inoculum
+inodorous
+inoffensive
+inoffensively
+inoffensiveness
+inofficious
+inoperable
+inoperative
+inoperativeness
+inoperculate
+inopportune
+inopportunely
+inopportuneness
+inordinate
+inordinately
+inordinateness
+inorganic
+inorganically
+inosculate
+inosculated
+inosculates
+inosculating
+inosculation
+inositol
+inotropic
+inpatient
+inphase
+inpour
+input
+input's
+inputed
+inputer
+inputing
+inputs
+inputted
+inputting
+inqilab
+inquest
+inquietude
+inquire
+inquired
+inquirer
+inquirers
+inquires
+inquiries
+inquiring
+inquiringly
+inquiry
+inquiry's
+inquisition
+inquisition's
+inquisitional
+inquisitions
+inquisitive
+inquisitively
+inquisitiveness
+inquisitor
+inquisitorial
+inquisitorially
+inroad
+inroads
+inrush
+ins
+insalivate
+insalubrious
+insalubrity
+insane
+insanely
+insaneness
+insanitary
+insanitation
+insanity
+insatiability
+insatiable
+insatiableness
+insatiably
+insatiate
+insatiately
+insatiateness
+inscape
+inscribe
+inscribed
+inscriber
+inscribes
+inscribing
+inscription
+inscription's
+inscriptional
+inscriptions
+inscriptive
+inscriptively
+inscroll
+inscrutability
+inscrutable
+inscrutableness
+inscrutably
+insculp
+inseam
+insect
+insect's
+insectan
+insectarium
+insectary
+insecticidal
+insecticidally
+insecticide
+insecticides
+insectifuge
+insectile
+insectivore
+insectivore's
+insectivores
+insectivorous
+insectivory
+insects
+insecure
+insecurely
+insecureness
+insecurity
+Inselberg
+inseminate
+insemination
+inseminator
+insensate
+insensately
+insensateness
+insensibility
+insensible
+insensibleness
+insensibly
+insensitive
+insensitively
+insensitiveness
+insensitivity
+insentience
+insentient
+inseparability
+inseparable
+inseparableness
+inseparably
+insert
+inserted
+inserter
+inserting
+insertion
+insertion's
+insertional
+insertions
+inserts
+insessorial
+inset
+insets
+insetted
+insetting
+inshore
+inshrine
+inside
+insider
+insiders
+insides
+insidious
+insidiously
+insidiousness
+insight
+insight's
+insightful
+insightfully
+insights
+insignia
+insignias
+insignificance
+insignificances
+insignificancy
+insignificant
+insignificantly
+insincere
+insincerely
+insincerity
+insinuate
+insinuated
+insinuates
+insinuating
+insinuatingly
+insinuation
+insinuations
+insinuative
+insinuator
+insipid
+insipidity
+insipidly
+insipience
+insist
+insisted
+insistence
+insistency
+insistent
+insistently
+insisting
+insists
+insnare
+insobriety
+insociability
+insociable
+insociably
+insofar
+insolate
+insolation
+insole
+insolence
+insolent
+insolently
+insolubility
+insolubilization
+insolubilize
+insoluble
+insolubleness
+insolubly
+insolvable
+insolvably
+insolvency
+insolvent
+insomnia
+insomniac
+insomniacs
+insomuch
+insouciance
+insouciant
+insouciantly
+insoul
+inspan
+inspect
+inspected
+inspecting
+inspection
+inspection's
+inspections
+inspective
+inspector
+inspector's
+inspectorate
+inspectors
+inspectorship
+inspects
+insphere
+inspiration
+inspiration's
+inspirational
+inspirationally
+inspirations
+inspirator
+inspiratory
+inspire
+inspired
+inspirer
+inspires
+inspiring
+inspirit
+inspissate
+inspissated
+inspissation
+inspissator
+instabilities
+instability
+instable
+instalation
+install
+installant
+installation
+installation's
+installations
+installed
+installer
+installers
+installing
+installment
+installment's
+installments
+installs
+instalment
+instalments
+instance
+instanced
+instances
+instancing
+instancy
+instant
+instantaneity
+instantaneous
+instantaneously
+instantaneousness
+instanter
+instantiate
+instantiated
+instantiates
+instantiating
+instantiation
+instantiation's
+instantiations
+instantly
+instantness
+instants
+instar
+instate
+instated
+instates
+instating
+instauration
+instead
+instep
+insteps
+instigate
+instigated
+instigates
+instigating
+instigation
+instigative
+instigator
+instigator's
+instigators
+instil
+instill
+instillation
+instilled
+instiller
+instilling
+instillment
+instills
+instils
+instinct
+instinct's
+instinctive
+instinctively
+instincts
+instinctual
+institute
+instituted
+instituter
+instituters
+institutes
+instituting
+institution
+institution's
+institutional
+institutionalism
+institutionalist
+institutionalization
+institutionalization's
+institutionalizations
+institutionalize
+institutionalized
+institutionalizes
+institutionalizing
+institutionally
+institutionize
+institutionizes
+institutions
+institutive
+institutor
+instruct
+instructed
+instructing
+instruction
+instruction's
+instructional
+instructions
+instructive
+instructively
+instructiveness
+instructor
+instructor's
+instructors
+instructorship
+instructress
+instructs
+instrument
+instrumental
+instrumentalism
+instrumentalist
+instrumentalist's
+instrumentalists
+instrumentalities
+instrumentality
+instrumentalize
+instrumentalizes
+instrumentally
+instrumentals
+instrumentation
+instrumented
+instrumenting
+instruments
+insubordinate
+insubordinately
+insubordination
+insubstantial
+insubstantiality
+insufferable
+insufferableness
+insufferably
+insufficience
+insufficiencies
+insufficiency
+insufficient
+insufficiently
+insufflate
+insufflated
+insufflates
+insufflating
+insufflation
+insufflator
+insugently
+insulant
+insular
+insularism
+insularity
+insularize
+insularizes
+insularly
+insulate
+insulated
+insulates
+insulating
+insulation
+insulations
+insulator
+insulator's
+insulators
+insulin
+insult
+insulted
+insulter
+insulting
+insultingly
+insults
+insuperable
+insuperably
+insupportable
+insupportableness
+insupportably
+insuppressible
+insuppressibly
+insurability
+insurable
+insurance
+insurances
+insure
+insured
+insurer
+insurers
+insures
+insurgence
+insurgency
+insurgent
+insurgent's
+insurgents
+insuring
+insurmountable
+insurmountably
+insuror
+insurrection
+insurrection's
+insurrectional
+insurrectionary
+insurrectionist
+insurrectionize
+insurrectionizes
+insurrections
+insusceptibility
+insusceptible
+insusceptibly
+inswing
+intact
+intactness
+intaglio
+intake
+intakes
+intaking
+intangibility
+intangible
+intangible's
+intangibleness
+intangibles
+intangibly
+intarsia
+integer
+integer's
+integers
+integrability
+integrable
+integral
+integral's
+integrality
+integralization
+integralization's
+integralizations
+integralize
+integralizes
+integrally
+integrals
+integrand
+integrant
+integratable
+integrate
+integrated
+integrates
+integrating
+integration
+integrationist
+integrations
+integrative
+integrator
+integrity
+integument
+integumental
+integumentary
+Intel
+Intel's
+intellect
+intellect's
+intellection
+intellective
+intellectively
+intellects
+intellectual
+intellectualism
+intellectualist
+intellectualistic
+intellectuality
+intellectualization
+intellectualization's
+intellectualizations
+intellectualize
+intellectualized
+intellectualizer
+intellectualizers
+intellectualizes
+intellectualizing
+intellectually
+intellectualness
+intellectuals
+intellectus
+intelligence
+intelligencer
+intelligences
+intelligent
+intelligential
+intelligently
+intelligentsia
+intelligibility
+intelligible
+intelligibleness
+intelligibly
+Intelsat
+intemperance
+intemperate
+intemperately
+intemperateness
+intend
+intendance
+intendancy
+intendant
+intendants
+intended
+intendedly
+intendedness
+intender
+intending
+intendment
+intends
+intenerate
+inteneration
+intense
+intensely
+intenseness
+intensification
+intensified
+intensifier
+intensifiers
+intensifies
+intensify
+intensifying
+intension
+intensional
+intensionally
+intensities
+intensity
+intensive
+intensively
+intensiveness
+intent
+intention
+intentional
+intentionality
+intentionally
+intentioned
+intentions
+intently
+intentness
+intents
+intepupillary
+inter
+interact
+interactant
+interacted
+interacting
+interaction
+interaction's
+interactional
+interactions
+interactive
+interactively
+interactivity
+interacts
+interagency
+INTERAMA
+interatomic
+interaxial
+interbedded
+interbrain
+interbreed
+intercalary
+intercalate
+intercalated
+intercalates
+intercalating
+intercalation
+intercalative
+intercase
+intercaste
+intercede
+interceder
+intercedes
+intercellular
+intercellularly
+intercensal
+intercept
+intercepted
+intercepter
+intercepting
+interception
+interceptor
+intercepts
+intercession
+intercessional
+intercessor
+intercessory
+interchange
+interchangeability
+interchangeable
+interchangeableness
+interchangeably
+interchanged
+interchanger
+interchanges
+interchanging
+interchangings
+interchannel
+intercity
+intercivilization
+intercivilization's
+intercivilizations
+interclass
+interclavicle
+interclavicular
+intercohort
+intercollegiate
+intercolonization
+intercolonization's
+intercolonizations
+intercolumniation
+intercom
+intercommunicate
+intercommunicated
+intercommunicates
+intercommunicating
+intercommunication
+intercommunion
+intercomputer
+interconnect
+interconnectable
+interconnected
+interconnectedness
+interconnecting
+interconnection
+interconnection's
+interconnections
+interconnectivity
+interconnects
+interconsole
+intercontinental
+interconversion
+interconvert
+interconvertibility
+interconvertible
+intercooler
+intercorrelated
+intercostal
+intercostally
+intercourse
+intercrisis
+intercrop
+intercross
+intercrystallization
+intercrystallization's
+intercrystallizations
+intercrystallize
+intercrystallizes
+intercultural
+interculturally
+intercurrent
+intercurrently
+intercut
+interdenominational
+interdenominationalism
+interdental
+interdentally
+interdepartmental
+interdepartmentally
+interdepend
+interdependence
+interdependencies
+interdependency
+interdependent
+interdependently
+interdict
+interdiction
+interdictive
+interdictor
+interdictory
+interdiffuse
+interdiffusion
+interdigitate
+interdigitation
+interdisciplinary
+interest
+interested
+interestedly
+interesting
+interestingly
+interestingness
+interests
+interface
+interfaced
+interfacer
+interfaces
+interfacial
+interfacing
+interfaith
+interfascicular
+interfere
+interfered
+interference
+interferences
+interferential
+interferer
+interferes
+interfering
+interferingly
+interferogram
+interferogram's
+interferograms
+interferometer
+interferometer's
+interferometers
+interferometric
+interferometrically
+interferometry
+interferon
+interfertile
+interfertility
+interfile
+interflow
+interfluent
+interfluve
+interframe
+interfuse
+interfusion
+intergalactic
+intergeneration
+intergenerational
+intergeneric
+interglacial
+intergovernmental
+intergradation
+intergradational
+intergrade
+intergranal
+intergroup
+intergrowth
+interhemispheric
+interhybridize
+interhybridizes
+interim
+interindex
+interindustry
+interionic
+interior
+interior's
+interiority
+interiorization
+interiorize
+interiorized
+interiorizes
+interiorizing
+interiorly
+interiors
+Interisland
+interjacent
+interject
+interjected
+interjecting
+interjection
+interjectional
+interjectionalize
+interjectionalizes
+interjectionally
+interjectionize
+interjectionizes
+interjector
+interjectory
+interjects
+interjudgment
+interjudgment's
+interjudgments
+interlace
+interlaced
+interlacement
+interlaces
+interlacing
+interlaken
+interlaminate
+interlamination
+interlap
+interlard
+interlay
+interlayer
+interlayering
+interleaf
+interleave
+interleaved
+interleaves
+interleaving
+interlibrary
+interline
+interlinear
+interlinearly
+interlineation
+interlingua
+interlining
+interlink
+interlinked
+interlinking
+interlinks
+interlisp
+interlisp's
+interlobular
+interlocal
+interlocation
+interlock
+interlocked
+interlocker
+interlocking
+interlocks
+interlocution
+interlocutor
+interlocutory
+interlope
+interloped
+interloper
+interlopes
+interloping
+interlude
+interludes
+interlunar
+interlunary
+interlunation
+intermarriage
+intermarry
+intermeddle
+intermeddler
+intermediacy
+intermediaries
+intermediary
+intermediate
+intermediate's
+intermediated
+intermediately
+intermediateness
+intermediates
+intermediating
+intermediation
+intermembrane
+interment
+intermesh
+intermeshed
+intermetallic
+intermetrics
+intermezzo
+intermigration
+interminable
+interminableness
+interminably
+intermingle
+intermingled
+intermingles
+intermingling
+intermission
+intermissions
+intermit
+intermittence
+intermittency
+intermittent
+intermittently
+intermitter
+intermix
+intermixed
+intermixer
+intermixes
+intermixing
+intermixture
+intermodule
+intermolecular
+intermolecularly
+intern
+internal
+internality
+internalization
+internalization's
+internalizations
+internalize
+internalized
+internalizes
+internalizing
+internally
+internals
+international
+internationalism
+internationalist
+internationalists
+internationality
+internationalization
+internationalization's
+internationalizations
+internationalize
+internationalized
+internationalizes
+internationalizing
+internationally
+internationals
+interne
+internecine
+interned
+internee
+internescine
+Internet
+Internet's
+internetwork
+interneuron
+interneuronal
+interning
+internist
+internment
+internodal
+internode
+interns
+internship
+internuclear
+internuncial
+internuncially
+internuncio
+interoceptive
+interoceptor
+interoffice
+interorganizational
+interosculate
+interpage
+interparticle
+interpellant
+interpellate
+interpellation
+interpellator
+interpenetrate
+interpenetrates
+interpenetration
+interpersonal
+interpersonally
+interphase
+interphone
+interplanetary
+interplant
+interplay
+interplead
+interpleader
+interpol
+interpolant
+interpolate
+interpolated
+interpolates
+interpolating
+interpolation
+interpolations
+interpolative
+interpolator
+interpolatory
+interpose
+interposed
+interposer
+interposes
+interposing
+interposition
+interpret
+interpretability
+interpretable
+interpretation
+interpretation's
+interpretational
+interpretations
+interpretative
+interpretatively
+interprete
+interpreted
+interpreter
+interpreters
+interpretes
+interpreting
+interpretive
+interpretively
+interpretor
+interpretors
+interprets
+interprocess
+interprocessor
+interquartile
+interracial
+interradial
+interred
+interregional
+interregnum
+interrelate
+interrelated
+interrelatedly
+interrelatedness
+interrelates
+interrelating
+interrelation
+interrelations
+interrelationship
+interrelationship's
+interrelationships
+interreligious
+interrex
+interring
+interrobang
+interrogable
+interrogate
+interrogated
+interrogates
+interrogating
+interrogation
+interrogational
+interrogations
+interrogative
+interrogatively
+interrogatives
+interrogator
+interrogatories
+interrogators
+interrogatory
+interrogee
+interrogees
+interrupt
+interrupted
+interrupter
+interrupters
+interruptible
+interrupting
+interruption
+interruption's
+interruptions
+interruptive
+interrupts
+interscholastic
+intersect
+intersected
+intersecting
+intersection
+intersection's
+intersections
+intersectoral
+intersects
+interservice
+intersession
+intersex
+intersexual
+intersexuality
+intersexually
+interspace
+interspecies
+interspecific
+intersperse
+interspersed
+intersperses
+interspersing
+interspersion
+interspersions
+interstadial
+interstage
+interstate
+interstellar
+intersterile
+intersterility
+interstice
+interstices
+interstitial
+interstitially
+interstratify
+intersubjective
+intersubjectively
+intersubjectivity
+intersurvey
+intersystem
+intertask
+intertestamental
+intertexture
+intertidal
+intertidally
+intertie
+intertill
+intertillage
+intertrigo
+intertropical
+intertwine
+intertwined
+intertwinement
+intertwines
+intertwining
+intertwist
+interurban
+interval
+interval's
+intervale
+intervalometer
+intervalometer's
+intervalometers
+intervals
+intervene
+intervened
+intervener
+intervenes
+intervening
+intervenor
+intervention
+intervention's
+interventionism
+interventionist
+interventions
+intervertebral
+intervertebrally
+interview
+interviewed
+interviewee
+interviewee's
+interviewees
+interviewer
+interviewer's
+interviewers
+interviewing
+interviews
+intervocalic
+interwar
+interweave
+interweaves
+interweaving
+interwoven
+interzonal
+interzone
+intestacy
+intestate
+intestinal
+intestinally
+intestine
+intestine's
+intestines
+intima
+intimacy
+intimal
+intimate
+intimated
+intimately
+intimateness
+intimater
+intimates
+intimating
+intimation
+intimations
+intimidate
+intimidated
+intimidates
+intimidating
+intimidation
+intimidator
+intimidatory
+intinction
+intine
+intitule
+intl
+intnl
+into
+intolerability
+intolerable
+intolerableness
+intolerably
+intolerance
+intolerant
+intolerantly
+intolerantness
+intonate
+intonation
+intonation's
+intonational
+intonations
+intone
+intoned
+intoner
+intoning
+intorsion
+intoxicant
+intoxicate
+intoxicated
+intoxicatedly
+intoxicating
+intoxication
+intra
+intraarterial
+intraarterially
+intracardiac
+intracardial
+intracardially
+intracellular
+intracellularly
+intracity
+intraclass
+intracoastal
+intracohort
+intracranial
+intracranially
+intractability
+intractable
+intractableness
+intractably
+intracutaneous
+intracutaneously
+intradepartmental
+intradermal
+intradermally
+intrados
+intraepithelial
+intrafamily
+intragalactic
+intragenerational
+intraindustry
+intraline
+intrametropolitan
+intramolecular
+intramolecularly
+intramural
+intramurally
+intramuscular
+intramuscularly
+intranasal
+intranational
+intrans
+intransigeance
+intransigeant
+intransigeantly
+intransigence
+intransigent
+intransigently
+intransigents
+intransitive
+intransitively
+intransitiveness
+intrant
+intranuclear
+intraoffice
+intraorganization
+intraorganization's
+intraorganizations
+intraperitoneal
+intraperitoneally
+intrapersonal
+intrapopulation
+intraprocess
+intrapsychic
+intrapsychically
+intrapulmonary
+intraregional
+intrasectoral
+intrasocietal
+intraspecies
+intraspecific
+intraspecifically
+intrastate
+intratelluric
+intratissue
+intrauterine
+intravasation
+intravascular
+intravenous
+intravenously
+intravital
+intravitally
+intravitam
+intrazonal
+intreat
+intrench
+intrepid
+intrepidity
+intrepidly
+intrepidness
+intricacies
+intricacy
+intricate
+intricately
+intricateness
+intrigant
+intriguant
+intrigue
+intrigued
+intriguer
+intrigues
+intriguing
+intriguingly
+intrinsic
+intrinsical
+intrinsically
+intrinsicalness
+intrinsics
+intro
+introduce
+introduced
+introducer
+introduces
+introducing
+introduction
+introduction's
+introductions
+introductorily
+introductory
+introgressant
+introgression
+introgressive
+introit
+introject
+introjected
+introjection
+introjects
+intromission
+intromit
+intromittent
+intromitter
+introrse
+introrsely
+introspect
+introspection
+introspectional
+introspectionism
+introspectionist
+introspectionistic
+introspections
+introspective
+introspectively
+introspectiveness
+introversion
+introversive
+introversively
+introvert
+introverted
+intrude
+intruded
+intruder
+intruder's
+intruders
+intrudes
+intruding
+intrusion
+intrusion's
+intrusions
+intrusive
+intrusively
+intrusiveness
+intrust
+intrvascularly
+intsv
+intubate
+intubated
+intubates
+intubating
+intubation
+intuc
+intuit
+intuitable
+intuiting
+intuition
+intuition's
+intuitional
+intuitionism
+intuitionist
+intuitions
+intuitive
+intuitively
+intuitiveness
+intuitivism
+intumesce
+intumescence
+intumescent
+intussuscept
+intussusception
+intussusceptive
+intwine
+inuit
+inulin
+inunction
+inundate
+inundated
+inundates
+inundating
+inundation
+inundations
+inundator
+inundatory
+inurbane
+inure
+inured
+inurement
+inuring
+inurn
+inutile
+inutility
+inv
+invade
+invaded
+invader
+invaders
+invades
+invading
+invaginate
+invaginated
+invaginates
+invaginating
+invagination
+invalid
+invalidate
+invalidated
+invalidates
+invalidating
+invalidation
+invalidations
+invalidator
+invalidism
+invalidities
+invalidity
+invalidly
+invalidness
+invalids
+invaluable
+invaluableness
+invaluably
+Invar
+invariability
+invariable
+invariableness
+invariably
+invariance
+invariant
+invariantly
+invariants
+invasion
+invasion's
+invasions
+invasive
+invasiveness
+invective
+invectively
+invectiveness
+inveigh
+inveigher
+inveigle
+inveigled
+inveiglement
+inveigler
+inveigling
+invenit
+invent
+invented
+inventing
+invention
+invention's
+inventions
+inventive
+inventively
+inventiveness
+inventor
+inventor's
+inventorial
+inventorially
+inventories
+inventors
+inventory
+inventory's
+inventress
+invents
+inveracity
+invercalt
+invercargill
+Inverness
+inverse
+inversely
+inverses
+inversion
+inversions
+inversive
+invert
+invertase
+invertebrate
+invertebrate's
+invertebrates
+inverted
+inverter
+inverters
+invertible
+inverting
+inverts
+invest
+investable
+invested
+investigate
+investigated
+investigates
+investigating
+investigation
+investigational
+investigations
+investigative
+investigator
+investigator's
+investigators
+investigatory
+investing
+investiture
+investment
+investment's
+investments
+investor
+investor's
+investors
+invests
+inveteracy
+inveterate
+inveterately
+inviability
+inviable
+invictus
+invidious
+invidiously
+invidiousness
+invigorate
+invigorated
+invigorates
+invigorating
+invigoratingly
+invigoration
+invigorator
+inviible
+invincibility
+invincible
+invincibleness
+invincibly
+inviolability
+inviolable
+inviolableness
+inviolably
+inviolacy
+inviolate
+inviolately
+inviolateness
+inviscid
+invisibility
+invisible
+invisibleness
+invisibly
+invitation
+invitation's
+invitational
+invitations
+invitatory
+invite
+invited
+invitee
+invitees
+inviter
+invites
+inviting
+invitingly
+invocable
+invocate
+invocation
+invocation's
+invocational
+invocations
+invocatory
+invoice
+invoiced
+invoices
+invoicing
+invokable
+invoke
+invoked
+invoker
+invokers
+invokes
+invoking
+involucel
+involucral
+involucrate
+involucre
+involucred
+involucrum
+involuntarily
+involuntariness
+involuntary
+involute
+involutely
+involution
+involutional
+involutionary
+involutions
+involutorial
+involutory
+involve
+involved
+involvedly
+involvement
+involvement's
+involvements
+involver
+involves
+involving
+invulnerability
+invulnerable
+invulnerableness
+invulnerably
+invultuation
+inward
+inwardly
+inwardness
+inwards
+inweave
+inwrap
+inwrought
+inyala
+Io
+ioctl
+iodate
+iodated
+iodating
+iodation
+iodic
+iodide
+iodin
+iodinate
+iodinated
+iodinating
+iodination
+iodine
+iodism
+iodization
+iodize
+iodized
+iodizer
+iodizers
+iodizes
+iodizing
+iodoamino
+iodocompounds
+iodoform
+iodometry
+iodophor
+iodoprotein
+iodopsin
+iodothyronines
+iodotyrosines
+iodous
+iolite
+ion
+iona
+ione
+Ionesco
+Ionia
+Ionian
+ionic
+ionicity
+Ionicization
+Ionicization's
+Ionicizations
+Ionicize
+Ionicizes
+ionium
+ionizable
+ionizable's
+ionizables
+ionization
+ionization's
+ionizations
+ionize
+ionized
+ionizer
+ionizers
+ionizes
+ionizing
+ionizings
+ionizion
+ionizions
+ionone
+ionopause
+ionosphere
+ionospheric
+ionospherically
+ions
+iontophoresis
+iosola
+IOT
+iota
+iotacism
+Iowa
+ipecac
+ipecacuanha
+iphigenia
+ipoh
+Ipomoea
+iproniazid
+ipsambul
+ipsilateral
+ipsilaterally
+ipso
+ipsus
+ipswich
+IQ
+iqbal
+iquique
+iquitos
+IR
+Ira
+iracund
+irade
+IRAF
+Iran
+Iran's
+Iranian
+Iranian's
+Iranians
+Iranize
+Iranizes
+Iraq
+iraqi
+Iraqi
+Iraqi's
+Iraqis
+irascibility
+irascible
+irascibleness
+irascibly
+irate
+irately
+irateness
+irbid
+irbil
+ire
+ire's
+ireful
+Ireland
+Ireland's
+irenaeus
+Irene
+irenic
+irenically
+irenicon
+irenics
+ires
+Ireton
+irian
+irid
+iridaceous
+iridectomy
+irides
+iridescence
+iridescent
+iridescently
+iridic
+iridium
+irido
+iridosmine
+iridotomy
+irina
+iris
+irises
+Irish
+Irishism
+Irishize
+Irishizes
+Irishman
+Irishmen
+iritis
+irk
+irked
+irking
+irks
+irksome
+irksomely
+irksomeness
+Irkutsk
+Irma
+iron
+ironbark
+ironbound
+ironclad
+ironed
+ironer
+ironfisted
+ironfounding
+ironhanded
+ironhandedly
+ironhandedness
+ironhearted
+ironic
+ironical
+ironically
+ironicalness
+ironies
+ironing
+ironings
+ironist
+ironize
+ironizes
+ironmaster
+ironmonger
+ironmongery
+ironness
+Irons
+irons
+ironside
+ironsides
+ironstone
+ironware
+ironweed
+ironwood
+ironwork
+ironwork's
+ironworker
+ironworks
+irony
+Iroquoian
+Iroquois
+irradiance
+irradiant
+irradiate
+irradiated
+irradiation
+irradiative
+irradiator
+irradicable
+irradicably
+irrational
+irrationalism
+irrationalist
+irrationalistic
+irrationality
+irrationalize
+irrationalizes
+irrationally
+irrationalness
+irrationals
+Irrawaddy
+irreal
+irreality
+irreclaimable
+irreclaimably
+irreconcilability
+irreconcilable
+irreconcilableness
+irreconcilably
+irreconciliable
+irrecoverable
+irrecoverableness
+irrecoverably
+irrecusable
+irrecusably
+irred
+irredeemable
+irredeemably
+irredenta
+irredentism
+irredentist
+irreducibility
+irreducible
+irreducibly
+irreflexive
+irreformability
+irreformable
+irrefragability
+irrefragable
+irrefragably
+irrefrangible
+irrefutability
+irrefutable
+irrefutably
+irreg
+irregardless
+irregular
+irregularities
+irregularity
+irregularize
+irregularizes
+irregularly
+irregulars
+irrelative
+irrelatively
+irrelevance
+irrelevances
+irrelevancies
+irrelevancy
+irrelevant
+irrelevantly
+irrelievable
+irreligion
+irreligionist
+irreligious
+irreligiously
+irremeable
+irremediable
+irremediableness
+irremediably
+irremissible
+irremovability
+irremovable
+irremovably
+irreparable
+irreparableness
+irreparably
+irrepealability
+irrepealable
+irreplaceability
+irreplaceable
+irreplaceableness
+irreplaceably
+irrepressibility
+irrepressible
+irrepressibly
+irreproachability
+irreproachable
+irreproachableness
+irreproachably
+irreproducibility
+irreproducible
+irresistibility
+irresistible
+irresistibleness
+irresistibly
+irresoluble
+irresolute
+irresolutely
+irresoluteness
+irresolution
+irresolvable
+irrespective
+irrespectively
+irrespirable
+irresponsibility
+irresponsible
+irresponsibleness
+irresponsibly
+irresponsive
+irresponsiveness
+irretentive
+irretrievability
+irretrievable
+irretrievably
+irreverence
+irreverent
+irreverently
+irreversibility
+irreversible
+irreversibly
+irrevocability
+irrevocable
+irrevocableness
+irrevocably
+irrigate
+irrigated
+irrigates
+irrigating
+irrigation
+irrigational
+irrigationists
+irrigations
+irrigator
+irrigators
+irriguous
+irritability
+irritable
+irritableness
+irritably
+irritant
+irritants
+irritate
+irritated
+irritates
+irritating
+irritatingly
+irritation
+irritations
+irritative
+irrotational
+irrotationally
+irrupt
+irrupted
+irrupting
+irruption
+irruptions
+irruptive
+irruptively
+irrupts
+IRS
+irtysh
+Irvin
+Irvin's
+Irvine
+Irving
+Irwin
+Irwin's
+is
+Isaac
+Isaacs
+Isaacson
+Isaacson's
+Isabel
+Isabella
+Isabella's
+Isadore
+Isadore's
+isagoge
+isagogics
+Isaiah
+Isaiah's
+isallobar
+isar
+isarithmic
+isatin
+isauria
+Isbn
+Iscariot
+ischaemia
+ischia
+ischium
+isentropic
+isentropically
+isherwood
+Ishmael
+Ishmaelite
+Ishtar
+Isidore
+isinglass
+Isis
+Iskander
+Iskenderun
+Islam
+Islamabad
+Islamabad's
+Islamic
+Islamization
+Islamization's
+Islamizations
+Islamize
+Islamized
+Islamizes
+Islamizing
+island
+islander
+islanders
+Islandia
+islandia
+islands
+islay
+isle
+isle's
+isles
+islet
+islet's
+islets
+isling
+Islington
+ism
+Ismaili
+ismailia
+isn't
+iso
+ISO
+isoagglutination
+isoagglutinative
+isoagglutinin
+isoagglutinogen
+isoalloxazine
+isoamyl
+isoantibody
+isoantigen
+isoantigenic
+isoantigenicity
+isobar
+isobaric
+isobath
+isobutylene
+isocept
+Isocheim
+isochor
+isochromatic
+isochron
+isochronal
+isochronally
+isochrone
+isochronism
+isochronization
+isochronize
+isochronized
+isochronizes
+isochronizing
+isochronous
+isochronously
+isochroous
+isoclinal
+isoclinally
+isocline
+isoclinic
+isoclinically
+isocracy
+isocrates
+isocyanate
+isocyanic
+isocyanide
+isodiametric
+isodiaphere
+isodimorphism
+isodine
+isodynamic
+isoelectric
+isoelectronic
+isoenergetic
+isogamete
+isogenous
+isogeotherm
+isogloss
+isogon
+isogonic
+isogram
+isogram's
+isograms
+isohel
+isohyet
+isoimmunization
+isoimmunization's
+isoimmunizations
+isoimmunize
+isoimmunizes
+isolate
+isolated
+isolates
+isolating
+isolation
+isolationism
+isolationist
+isolationistic
+isolations
+isolator
+Isolde
+Isolde's
+isolecithal
+isoleucine
+isolex
+isoline
+isologous
+isologue
+isomagnetic
+isomer
+isomerase
+isomeric
+isomerism
+isomerization
+isomerization's
+isomerizations
+isomerize
+isomerized
+isomerizeparabolization
+isomerizes
+isomerizing
+isomerous
+isomers
+isometric
+isometrical
+isometrically
+isometrics
+isometry
+isomorph
+isomorphic
+isomorphically
+isomorphism
+isomorphism's
+isomorphisms
+isomorphous
+isoniazid
+isonomy
+isooctane
+isophone
+isophotal
+isophote
+isopiestic
+isopleth
+isopleths
+isopod
+isoprene
+isopropyl
+isorhythmic
+isosceles
+isoseismal
+isosmotic
+isospondylous
+isostasy
+isosteric
+isotactic
+isothere
+isotherm
+isothermal
+isothermally
+isotherms
+isotone
+isotonic
+isotonically
+isotonicity
+isotope
+isotope's
+isotopes
+isotopic
+isotopically
+isotopy
+isotron
+isotropic
+isotropical
+isotropically
+isotropy
+isozyme
+isozymic
+ispell
+ispell's
+Israel
+Israel's
+Israeli
+Israeli's
+Israelis
+Israelite
+Israelites
+Israelitize
+Israelitizes
+israfil
+issachar
+ISSN
+issuable
+issuably
+issuance
+issuant
+issue
+issued
+issueless
+issuer
+issuers
+issues
+issuing
+issus
+istana
+Istanbul
+isthmian
+isthmic
+isthmus
+istle
+istria
+Istvan
+Istvan's
+it
+it'd
+it'll
+it's
+itacolumite
+itaconic
+Italia
+Italian
+Italian's
+italianate
+Italianism
+Italianization
+Italianization's
+Italianizations
+Italianize
+Italianized
+Italianizer
+Italianizers
+Italianizes
+Italianizing
+Italians
+italic
+italicity
+italicization
+italicization's
+italicizations
+italicize
+italicized
+italicizes
+italicizing
+italics
+italicy
+Italy
+itch
+itches
+itchiness
+itching
+itchy
+ITcorp
+ITCorp
+ITcorp's
+ITCorp's
+item
+item's
+itemization
+itemization's
+itemizations
+itemize
+itemized
+itemizer
+itemizers
+itemizes
+itemizing
+items
+iterance
+iterant
+iterate
+iterated
+iterates
+iterating
+iteration
+iterations
+iterative
+iteratively
+iterator
+iterator's
+iterators
+Ithaca
+Ithacan
+ithunn
+ithyphallic
+itineracy
+itinerancy
+itinerant
+itinerantly
+itineraries
+itinerary
+itinerate
+itinerated
+itinerates
+itinerating
+itineration
+Ito
+Ito's
+its
+itself
+itsy
+ITT
+IUD
+iud
+IUDs
+iuds
+iulus
+iv
+Ivan
+Ivanhoe
+Ivanovo
+Ivanovsky
+Iverson
+Iverson's
+Ives
+ivied
+ivies
+iviza
+ivories
+Ivory
+ivory
+ivy
+ivy's
+ix
+Ixia
+Ixion
+Ixtaccihuatl
+ixtle
+iyar
+iyeyasu
+Izaak
+izaak
+Izhevsk
+izmir
+izmit
+iznik
+Iztaccihuatl
+Izvestia
+izzard
+j's
+jab
+jab's
+Jabalpur
+jabbed
+jabber
+jabbered
+jabberer
+jabbering
+jabberings
+jabbers
+jabberwocky
+jabbing
+Jabir
+Jabiru
+Jablonsky
+Jablonsky's
+Jaborandi
+jabot
+jabs
+jacamar
+Jacaranda
+jacdaw
+jack
+jackal
+jackal's
+jackals
+jackanapes
+jackass
+jackassery
+jackboot
+jackbooted
+jackboots
+jackdaw
+jackdaws
+jacked
+jacker
+jackeroo
+jacket
+jacketed
+jackets
+jacketted
+jacketting
+jackfish
+jackfruit
+jackhammer
+Jackie
+jacking
+jackknife
+Jackman
+jackpot
+jackpots
+jacks
+jackscrew
+jackshaft
+jacksmelt
+jacksnipe
+Jackson
+Jacksonian
+Jacksons
+Jacksonville
+jackstay
+jackstraws
+Jacky
+JACM
+Jacob
+Jacobean
+Jacobi
+Jacobi's
+Jacobian
+Jacobin
+Jacobinize
+jacobite
+Jacobite
+Jacobs
+Jacobsen
+Jacobson
+Jacobson's
+Jacobus
+Jacoby
+jacoby
+jaconet
+Jacquard
+Jacqueline
+jacquerie
+Jacques
+jactitation
+jade
+jaded
+jadedly
+jadedness
+jadeite
+jades
+jading
+Jadotville
+Jaeger
+Jaeger's
+jael
+jaffa
+jaffna
+jag
+Jaga
+jagged
+jaggedly
+jaggedness
+jagger
+jaggers
+jaggery
+jagging
+jaggy
+jaguar
+jaguarondi
+jahveh
+Jahvist
+jahweh
+jai
+jail
+jailbait
+jailbird
+jailbreak
+jailed
+jailer
+jailers
+jailhouse
+jailing
+jailor
+jails
+Jaime
+Jaime's
+Jain
+Jainism
+jaipur
+Jakarta
+Jake
+Jakes
+jalap
+jalapa
+jalisco
+jalopies
+jalopy
+jalousie
+jam
+Jamaica
+Jamaican
+jamb
+jambalaya
+jambeau
+jambi
+jambo
+jamboree
+James
+Jamesian
+Jameson
+Jamestown
+Jamie
+Jamie's
+jammed
+jammer
+jamming
+jammu
+jammy
+jamnagar
+jampan
+jams
+jamshedpur
+jamshid
+Jan
+jana
+Janacek
+janata
+Jane
+Jane's
+Janeiro
+Janesville
+Janet
+Janet's
+jangle
+jangled
+jangler
+jangles
+jangling
+Janice
+Janiculum
+Janigro
+janina
+janis
+Janis
+janissaries
+janissary
+janitor
+janitor's
+janitorial
+janitors
+janitress
+Janos
+Janowitz
+Jansen
+Jansenism
+Jansenist
+Jansenist's
+Januaries
+January
+January's
+Janus
+Jap
+Japan
+Japan's
+Japanese
+Japanese's
+Japanization
+Japanization's
+Japanizations
+Japanize
+Japanized
+Japanizes
+Japanizing
+japanned
+japanner
+japanning
+jape
+japer
+japery
+japes
+Japheth
+Japhetic
+japing
+japonica
+jar
+jar's
+jardiniere
+jarful
+jargon
+jargonistic
+jargonization
+jargonization's
+jargonizations
+jargonize
+jargonized
+jargonizes
+jargonizing
+jarl
+jarp
+jarrah
+jarred
+jarring
+jarringly
+jarrow
+jarry
+jars
+jarvey
+Jarvi
+Jarvin
+Jarvin's
+Jarvis
+jasmine
+Jason
+jasper
+jasperize
+jasperizes
+jaspers
+jassy
+Jastrow
+Jat
+jato
+jaundice
+jaundiced
+jaundices
+jaundicing
+jaunt
+jaunt's
+jaunted
+jauntier
+jauntily
+jauntiness
+jaunting
+jaunts
+jaunty
+Java
+java
+Javanese
+javanese
+javari
+javelin
+javelin's
+javelins
+jaw
+jaw's
+jawan
+jawara
+jawbone
+jawbreak
+jawbreaker
+jawed
+jawline
+jaws
+jaxartes
+jay
+jayawardena
+jaybird
+Jaycee
+Jaycees
+jaywalk
+jazz
+jazzier
+jazzily
+jazziness
+jazzman
+jazzmen
+jazzy
+JCL
+jealous
+jealousies
+jealously
+jealousness
+jealousy
+jean
+jean's
+Jeanette
+Jeanie
+jeanne
+Jeanne
+Jeannie
+jeans
+jebel
+Jed
+Jed's
+jedda
+jeep
+jeep's
+jeepable
+jeeped
+jeepers
+jeeping
+jeeps
+jeer
+jeer's
+jeerer
+jeeringly
+jeers
+jefe
+Jeff
+Jefferson
+Jefferson's
+Jeffersonian
+Jeffersonians
+Jeffrey
+Jeffreys
+jehad
+jehol
+jehoshaphat
+Jehovah
+Jehovist
+jehu
+jejune
+jejunely
+jejuneness
+jejunum
+jekyll
+jell
+jellaba
+jelled
+jellicoe
+jellied
+jellies
+jellify
+jelling
+Jello
+jello
+jells
+jelly
+jelly's
+jellybean
+jellyfish
+jellying
+jellylike
+jemadar
+jemappes
+jembe
+Jemmy
+Jena
+Jenghis
+Jenkins
+Jenner
+Jennie
+Jennifer
+Jennings
+jenny
+Jensen
+Jensen's
+jeopard
+jeopardies
+jeopardization
+jeopardize
+jeopardized
+jeopardizes
+jeopardizing
+jeopardy
+Jephthah
+jequirity
+jerba
+jerbil
+jerboa
+Jeremiad
+Jeremiah
+Jeremy
+Jeres
+jerez
+Jericho
+jerid
+jerk
+jerked
+jerker
+jerkier
+jerkily
+jerkin
+jerkiness
+jerking
+jerkings
+jerks
+jerkwater
+jerky
+jeroboam
+Jerome
+jerreed
+jerry
+Jerry's
+Jersey
+jersey
+jersey's
+jerseys
+Jerusalem
+Jervis
+Jespersen
+jess
+Jesse
+Jesse's
+Jesselton
+Jessica
+Jessie
+jessy
+Jessy
+jest
+jested
+jester
+jesting
+jests
+Jesu
+Jesuit
+jesuitic
+jesuitical
+jesuitically
+Jesuitism
+Jesuitize
+Jesuitized
+Jesuitizes
+Jesuitizing
+jesuitry
+Jesuits
+Jesus
+jet
+jet's
+jetbead
+Jethro
+jetliner
+jetliners
+jetport
+jets
+jetsam
+jetted
+jettied
+jetties
+jetting
+jettison
+jettisonable
+Jetton
+jetty
+jettying
+jeunes
+jevons
+Jew
+jewel
+jeweled
+jeweler
+jeweleries
+jewelers
+jewelery
+jewelfish
+jeweling
+Jewell
+Jewell's
+Jewelled
+jewelries
+jewelry
+jewels
+Jewess
+Jewett
+Jewett's
+jewfish
+Jewish
+Jewishness
+Jewry
+Jews
+Jezebel
+Jezreel
+jhansi
+jhelum
+jib
+jibber
+jibbers
+jibbing
+jibbons
+jibboom
+jibe
+jibed
+jibes
+jibing
+jibouti
+jidda
+jiff
+jiffies
+jiffy
+jig
+jig's
+jigged
+jigger
+jiggered
+jiggermast
+jigging
+jiggle
+jiggled
+jiggles
+jigglier
+jiggling
+jiggly
+jigs
+jigsaw
+jihad
+Jill
+Jill's
+jillaroo
+jillion
+jilolo
+jilt
+jilted
+jilter
+jilts
+Jim
+Jim's
+Jimenez
+jimjams
+Jimmie
+jimmied
+jimmies
+jimmy
+Jimmy's
+jimmying
+jinghis
+jingle
+jingled
+jingler
+jingles
+jingling
+jingly
+jingo
+jingoes
+jingoish
+jingoism
+jingoist
+jingoistic
+jingoistically
+jinja
+jink
+jinks
+jinn
+jinnah
+jinni
+jinny
+Jinny
+jinx
+jipijapa
+jissom
+jitney
+jitneys
+jitter
+jitterbug
+jitterbugger
+jitterbugging
+jitters
+jittery
+jiujitsu
+jiujutsu
+jive
+jived
+jives
+jiving
+Jo
+Jo's
+Joab
+Joan
+Joanna
+Joanne
+Joanne's
+Joannes
+Joaquin
+job
+job's
+jobbed
+jobber
+jobbers
+jobbery
+jobbing
+jobcentre
+jobcentres
+jobholder
+jobholders
+jobless
+joblessness
+jobname
+jobrel
+Jobrel
+jobs
+Jocasta
+Jochum
+jock
+jockey
+jockeyed
+jockeying
+jockeys
+jocko
+jocks
+jockstrap
+jockstraps
+jocose
+jocosely
+jocoseness
+jocosity
+jocular
+jocularity
+jocularly
+jocund
+jocundity
+jocundly
+jodhpur
+jodhpuri
+jodhpurs
+Jodi
+Jodi's
+Jodo
+jodrell
+Jody
+Joe
+Joel
+Joes
+joey
+joffre
+jog
+jogged
+jogger
+joggers
+jogging
+joggle
+joggled
+joggler
+joggles
+joggling
+jogjakarta
+jogs
+Johann
+Johanna
+Johanna's
+Johannes
+Johannesburg
+Johansen
+Johanson
+john
+john's
+Johnnie
+Johnnie's
+Johnny
+Johnny's
+johns
+Johnsen
+Johnson
+Johnsonian
+Johnston
+Johnston's
+Johnstown
+johore
+join
+joinable
+joinder
+joined
+joiner
+joiners
+joinery
+joining
+joins
+joint
+joint's
+jointed
+jointedly
+jointedness
+jointer
+jointing
+jointly
+jointness
+jointress
+joints
+jointure
+jointured
+jointures
+jointuring
+jointworm
+Joinville
+joist
+joists
+joke
+joked
+joker
+jokers
+jokes
+joking
+jokingly
+jokjakarta
+Joliet
+Jolla
+Jolla's
+jollied
+jollier
+jollies
+jollification
+jollifications
+jollify
+jollities
+jollity
+jolly
+jollying
+jolo
+Jolson
+jolt
+jolted
+jolter
+jolting
+jolts
+jolty
+Jon
+Jon's
+Jonah
+Jonas
+Jonathan
+Jonathanization
+Jonathanization's
+Jonathanizations
+Jones
+Joneses
+jongleur
+jonnock
+jonquil
+jonquils
+Jonson
+jook
+Joplin
+joppa
+jordaens
+Jordan
+Jorge
+Jorgensen
+Jorgenson
+jorum
+jos
+Jose
+Josef
+Joseph
+Josephine
+Josephson
+Josephus
+josh
+joshed
+josher
+joshes
+joshing
+Joshua
+Josiah
+josquin
+joss
+jostle
+jostled
+jostles
+jostling
+jot
+jota
+jots
+jotted
+jotter
+jotting
+jotun
+Jotunheim
+joual
+joule
+jounce
+jounced
+jounces
+jouncier
+jouncing
+jouncy
+jour
+journal
+journal's
+journalese
+journaleses
+journalism
+journalist
+journalist's
+journalistic
+journalistically
+journalists
+journalization
+journalization's
+journalizations
+journalize
+journalized
+journalizer
+journalizers
+journalizes
+journalizing
+journalled
+journals
+journey
+journeyed
+journeying
+journeyings
+journeyman
+journeymen
+journeys
+journeywork
+joust
+jousted
+jouster
+jousting
+jousts
+Jovanovich
+Jove
+jovial
+joviality
+jovialize
+jovializes
+jovially
+Jovian
+jow
+jowett
+jowl
+jowled
+jowlier
+jowls
+jowly
+joy
+joy's
+joyance
+Joyce
+joyful
+joyfully
+joyfulness
+joyless
+joylessly
+joylessness
+joyous
+joyously
+joyousness
+joypop
+joyride
+joyrider
+joyriding
+joys
+joystick
+joysticks
+Jr
+Juan
+Juanita
+Juantorena
+juba
+Jubal
+jubbah
+Jubbulpore
+jube
+jubilant
+jubilantly
+jubilarian
+jubilate
+jubilated
+jubilates
+jubilating
+jubilation
+jubilations
+jubilee
+Judaea
+Judah
+Judaic
+Judaica
+Judaism
+Judas
+Judd
+Judd's
+Judder
+Juddered
+Juddering
+Judders
+Jude
+Judea
+judezmo
+judge
+judged
+judger
+judges
+judgeship
+judging
+judgmatic
+judgmatical
+judgmatically
+judgment
+judgment's
+judgmental
+judgments
+judicable
+judicative
+judicator
+judicatory
+judicature
+judicatures
+judicial
+judicialize
+judicializes
+judicially
+judiciaries
+judiciary
+judicious
+judiciously
+judiciousness
+Judith
+judo
+judogi
+judoist
+judoka
+Judson
+Judson's
+Judy
+jug
+jug's
+jugal
+jugate
+jugfet
+jugful
+jugged
+juggernaut
+juggernaut's
+juggernauted
+juggernauting
+juggernauts
+jugging
+juggins
+juggle
+juggled
+juggler
+jugglers
+jugglery
+juggles
+juggling
+juglandaceous
+Jugoslavia
+jugs
+jugular
+jugulate
+jugulum
+jugum
+jugurtha
+juice
+juice's
+juiced
+juiceless
+juicer
+juicers
+juices
+juicier
+juiciest
+juicily
+juiciness
+juicing
+juicy
+Juilliard
+juiz
+jujitsu
+juju
+jujube
+jujutsu
+juke
+jukebox
+jukes
+juking
+Jul
+julep
+juleps
+Jules
+Julia
+Julian
+Juliana
+Julie
+Julie's
+julienne
+Julies
+Juliet
+Julio
+Julius
+jullundur
+July
+July's
+Julys
+Jumada
+jumble
+jumbled
+jumbles
+jumbling
+jumbo
+jumbos
+jumbuck
+jumna
+jump
+jumped
+jumper
+jumpers
+jumpier
+jumpiness
+jumping
+jumps
+jumpy
+Jun
+juncaceous
+junco
+junction
+junction's
+junctional
+junctions
+junctor
+juncture
+juncture's
+junctures
+June
+June's
+Juneau
+Juneberry
+Junes
+Jung
+Jung's
+jungfrau
+Jungian
+jungian
+jungle
+jungle's
+jungled
+jungles
+jungly
+junior
+junior's
+juniors
+juniper
+Junius
+junk
+junker
+junkerdom
+junkers
+junket
+junketed
+junketeer
+junketeering
+junketer
+junketing
+junkets
+junkie
+junkies
+junkman
+junks
+junky
+junkyard
+Juno
+Junoesque
+junta
+junto
+juntos
+Jupiter
+jupon
+Jura
+Jura's
+jural
+jurally
+Juras
+jurassic
+jurat
+juratory
+jure
+jurel
+juridic
+juridical
+juridically
+juries
+jurisconsult
+jurisconsults
+jurisdiction
+jurisdiction's
+jurisdictional
+jurisdictionally
+jurisdictions
+jurisprudence
+jurisprudent
+jurisprudential
+jurisprudentially
+jurist
+juristic
+juristically
+jurists
+juror
+juror's
+jurors
+jury
+jury's
+juryman
+jus
+jussive
+jussives
+just
+juste
+juster
+justice
+justice's
+justices
+justiceship
+justiciability
+justiciable
+justiciar
+justiciary
+justifiability
+justifiable
+justifiably
+justification
+justifications
+justificative
+justificatory
+justified
+justifier
+justifier's
+justifiers
+justifies
+justify
+justifying
+Justine
+justing
+Justinian
+justle
+justly
+justment
+justness
+jut
+jute
+jutes
+Jutish
+Jutland
+Jutland's
+jutted
+juttied
+jutties
+jutting
+jutty
+juttying
+juvenal
+juvenescence
+juvenescent
+juvenile
+juvenile's
+juveniles
+juvenilia
+juvenility
+juvenilize
+juvenilizes
+juvenocracy
+juxtapose
+juxtaposed
+juxtaposes
+juxtaposing
+juxtaposition
+juxtapositional
+Jylland
+k's
+Kaaba
+Kabaka
+kabalega
+kabaragoya
+kabbala
+kabob
+kaboom
+Kabuki
+Kabul
+Kabyle
+kachang
+kachina
+Kaddish
+kadi
+kadiyevka
+kaduna
+Kaffir
+kaffirs
+Kaffraria
+Kafir
+kafiristan
+Kafka
+Kafkaesque
+kaftan
+kagera
+kagoshima
+kagu
+Kahn
+Kahn's
+kaiak
+kaieteur
+kaif
+kaifeng
+kail
+kailyard
+kain
+kainogenesis
+kairouan
+kaiser
+Kaiserslautern
+Kajar
+Kajar's
+kaka
+kakapo
+kakemono
+kaki
+Kalahari
+Kalamazoo
+kalat
+kale
+kaleidescope
+kaleidoscope
+kaleidoscoped
+kaleidoscopes
+kaleidoscopic
+kaleidoscopical
+kaleidoscopically
+kaleidoscoping
+kalends
+Kalevala
+kaleyard
+kalgan
+kalgoorlie
+kali
+kalian
+kalidasa
+kalif
+kalimantan
+kalinin
+kaliningrad
+kalisz
+kaliyuga
+kalmar
+kalmia
+Kalmuck
+Kalmuk
+Kalmuk's
+kalong
+kalpa
+kalpak
+kalsomine
+kaluga
+kama
+kamakura
+kamala
+kamasutra
+Kamchatka
+kame
+kamerun
+kamet
+kami
+Kamikaze
+kamikaze
+Kamikaze's
+Kamikazes
+Kampala
+Kampala's
+kampong
+kampuchea
+Kampuchea
+Kampuchea's
+kamseen
+Kamu
+kana
+Kanaka
+kanamycin
+kananga
+kanara
+Kanarese
+Kanawa
+kanazawa
+kanchenjunga
+kanchipuram
+kandahar
+Kandinsky
+kandy
+Kane
+Kane's
+kanga
+kangaroo
+kangaroos
+kangwane
+Kanji
+Kankakee
+Kannada
+kannada
+kano
+kanpur
+Kansas
+kansu
+Kant
+kantar
+kanu
+kanzu
+kaohsiung
+kaolack
+kaoliang
+kaolin
+kaolinite
+kaolinization
+kaolinization's
+kaolinizations
+kaolinize
+kaolinizes
+kaon
+kapellmeister
+Kapfenberg
+kaph
+Kaplan
+Kaplan's
+kapok
+kappa
+kaput
+karabiner
+Karachi
+Karachi's
+karafuto
+karaganda
+Karaite
+Karajan
+karakoram
+karakorum
+Karakul
+karamanlis
+Karamazov
+Karamazov's
+karat
+karate
+karateist
+karbala
+Karczykowski
+karelia
+Karelian
+Karen
+kariba
+Karl
+Karloff
+Karlovy
+Karlsbad
+Karlsruhe
+karma
+karmic
+Karnak
+karnataka
+Karol
+karoo
+kaross
+Karp
+Karp's
+Karpov
+Karri
+Karst
+kart
+karyatid
+karyogamy
+karyokinesis
+karyolymph
+karyolysis
+karyoplasm
+karyosome
+karyotin
+karyotype
+kasai
+kasbah
+Kasha
+kasher
+kashgar
+Kashmir
+kashmir
+Kashmiri
+Kaskaskia
+Kaspszyk
+kassa
+kassala
+kassel
+kat
+katabasis
+katabolism
+katakana
+katanga
+katar
+Kate
+kathak
+katharevusa
+Katharine
+Katharine's
+katharsis
+Katherine
+kathiawar
+Kathleen
+Kathy
+Katie
+Katie's
+katmai
+Katmandu
+Katowice
+Katowice's
+Katrina
+Katrina's
+Katrine
+katsina
+kattegat
+katydid
+Katz
+katzenjammer
+kauai
+Kauffman
+Kauffman's
+Kaufman
+Kaufman's
+kaunas
+kaunda
+kauri
+kava
+kaveri
+kawasaki
+Kay
+kayak
+kayaker
+kayaks
+kayo
+kayoed
+kayoing
+kayseri
+kazachok
+kazakh
+kazan
+kazantzakis
+kazbek
+kazoo
+kazoos
+kcal
+kea
+kean
+kearney
+Keaton
+Keats
+kebab
+kebabs
+keble
+kebob
+Keck
+keck
+Keck's
+ked
+kedah
+keddah
+kedge
+kedgeree
+kediri
+kedron
+keef
+Keegan
+keegan
+keel
+keelboat
+keeled
+keeler
+keelhaul
+keeling
+Keeling
+keelless
+keels
+keelson
+keelung
+keen
+Keenan
+keener
+keenest
+keening
+keenly
+keenness
+keep
+keeper
+keepers
+keeping
+keepnet
+keeps
+keepsake
+keepsakes
+keeshond
+Keewatin
+kef
+keffiyeh
+keg
+kegful
+kegler
+kegs
+kegsful
+Keighley
+Keijo
+keister
+keitel
+Keith
+keitloa
+kekkonen
+kelantan
+Keller
+Kelley
+Kellogg
+Kelly
+Kelly's
+keloid
+kelp
+kelpie
+Kelsey
+Kelsey's
+Kelson
+kelt
+kelter
+kelts
+Kelvin
+kemal
+kemble
+kemerovo
+Kemp
+kempe
+Kempff
+kempis
+kempt
+Ken
+ken
+Ken's
+kenaf
+kendal
+Kendall
+Kendall's
+kendo
+Kenilworth
+Kennan
+Kennan's
+Kennecott
+Kennedy
+kennel
+kennel's
+kenneled
+kenneling
+Kennelly
+kennels
+Kenneth
+Kenney
+Kenney's
+Kennington
+Kenny
+keno
+kenogenesis
+Kenosha
+kenosis
+Kensington
+kenspeckle
+Kent
+kente
+Kentish
+kentledge
+Kenton
+Kenton's
+Kentucky
+Kenya
+kenyatta
+Kenyon
+Kenyon's
+keos
+kep
+Kepler
+Kepler's
+kept
+kerala
+keramic
+keramics
+keratin
+keratinization
+keratinize
+keratinized
+keratinizes
+keratinizing
+keratitis
+keratogenous
+keratoid
+keratoplasty
+keratose
+keratosis
+kerb
+kerbaya
+kerbela
+kerbing
+kerbstone
+kerch
+kerchief
+kerchief's
+kerchiefed
+kerchiefs
+kerchieves
+Kerenski
+kerf
+kerguelen
+kerkrade
+kerman
+Kermanshah
+kermes
+kermis
+Kermit
+kermits
+kern
+kerne
+kernel
+kernel's
+kerneled
+kerneling
+kernels
+Kernighan
+Kernighan's
+kernite
+kero
+kerosene
+kerosine
+Kerouac
+kerouac
+Kerouac's
+Kerr
+Kerr's
+kerry
+kersey
+kerseymere
+Kertesz
+kerygma
+kesselring
+Kessler
+Kessler's
+kesteven
+kestrel
+Keswick
+ketch
+ketches
+ketchup
+ketene
+keto
+ketogenesis
+ketogenic
+ketone
+ketonic
+ketonization
+ketonization's
+ketonizations
+ketonize
+ketonizes
+ketonuria
+ketose
+ketosis
+ketosteroid
+ketotic
+ketoxime
+Kettering
+kettle
+kettle's
+kettledrum
+kettles
+kevel
+Kevin
+kew
+kewaskum
+Kewaskum
+kewaunee
+Kewaunee
+kewpie
+kex
+key
+keyboard
+keyboard's
+keyboarder
+keyboarding
+keyboards
+keybutton
+keyclick
+keyclick's
+keyclicks
+keyed
+Keyes
+keyhole
+keyholes
+keying
+keyless
+Keynes
+Keynesian
+Keynesianism
+keynote
+keynoter
+keynotes
+keypad
+keypad's
+keypads
+keypunch
+keypunched
+keypuncher
+keypunches
+keypunching
+keys
+keystone
+keystones
+keystroke
+keystroke's
+keystrokes
+keytop
+keytops
+keyway
+keyways
+keyword
+keyword's
+keywords
+KGB
+Khabarovsk
+Khachaturian
+Khaddar
+Khakass
+khaki
+Khakis
+Khalid
+Khalif
+Khalkha
+Khalkidiki
+Khama
+Khamsin
+khan
+Khanate
+Khanga
+Khania
+Kharif
+Kharkov
+Khartoum
+Khartoum's
+Khat
+Khayal
+Khedive
+Khelat
+Kherson
+Khieu
+Khingan
+Khirbet
+Khiva
+Khmer
+Khoikhoi
+Khoisan
+Khojent
+Khotan
+khrush
+Khrushchev
+Khrushchevs
+Khufu
+Khulna
+Khuskhus
+Khyber
+kHz
+Kiaat
+Kiang
+Kiangsi
+Kiangsu
+Kiaochow
+kibble
+kibbled
+kibbles
+kibbling
+kibbutz
+kibbutzim
+kibbutznik
+kibe
+Kibitka
+kibitz
+kibitzer
+Kiblah
+kibosh
+kick
+Kickapoo
+kickapoo
+kickback
+kickbacks
+kickdown
+kicked
+kicker
+kickers
+kicking
+kickoff
+kickoffs
+kicks
+kickshaw
+kickshaws
+kicksorter
+kickstand
+kicktail
+kickup
+kickups
+kid
+kid's
+kidd
+Kidde
+Kidde's
+kidded
+kidder
+Kidderminster
+kiddie
+kiddies
+kidding
+kiddingly
+kiddish
+kiddle
+kiddush
+kiddy
+kidless
+kidnap
+kidnap's
+kidnaped
+kidnaper
+kidnaper's
+kidnapers
+kidnaping
+kidnaping's
+kidnapings
+kidnaps
+kidney
+kidney's
+kidneys
+kidron
+kids
+kidskin
+kief
+Kieffer
+Kieffer's
+Kiel
+kiel
+kielbasa
+Kielce
+Kier
+Kierkegaard
+Kieselguhr
+Kiev
+Kiewit
+Kiewit's
+Kif
+Kigali
+Kigali's
+kike
+Kikoi
+Kikumon
+Kikuyu
+Kikuyu's
+Kilauea
+Kildare
+Kilderkin
+Kilgore
+Kilgore's
+Kilimanjaro
+Kilimanjaro's
+Kilkenny
+kill
+killable
+Killarney
+killdeer
+Killebrew
+killebrew
+killed
+killer
+killers
+Killick
+Killiecrankie
+Killifish
+Killikinick
+killing
+killingly
+killings
+killjoy
+kills
+Kilmarnock
+kiln
+kilo
+kilobar
+kilobaud
+kilobit
+kilobits
+kilobuck
+kilobyte
+kilobytes
+kilocalorie
+kilocalories
+kilocurie
+kilocycle
+kilocycles
+kilogauss
+kilogram
+kilogram's
+kilograms
+kilohertz
+kilohm
+kilojoule
+kiloliter
+kiloliter's
+kiloliters
+kilometer
+kilometer's
+kilometers
+kilooersted
+kiloparsec
+kilorad
+kilos
+kiloton
+kilotons
+kilovolt
+kilovolts
+kilowatt
+kilowatts
+kiloword
+kilt
+kilter
+kilts
+kilung
+Kim
+Kimball
+Kimball's
+kimberley
+kimberlite
+Kimberly
+Kimberly's
+kimono
+kin
+kina
+kinabalu
+kinase
+kincardine
+kinchinjunga
+kincob
+kind
+kinder
+kindergarten
+kindergartner
+kindest
+kindhearted
+kindheartedly
+kindheartedness
+kindle
+kindled
+kindler
+kindles
+kindless
+kindlessly
+kindlier
+kindliness
+kindling
+kindly
+kindness
+kindnesses
+kindred
+kinds
+kine
+kinematic
+kinematical
+kinematically
+kinematics
+kinematograph
+kinescope
+kinescoped
+kinescopes
+kineses
+kinesic
+kinesics
+kinesiology
+kinesis
+kinesthesia
+kinesthesis
+kinesthetic
+kinesthetically
+kinesthetics
+kinetic
+kineticist
+kinetics
+kinetin
+kinetochore
+kinetonucleus
+kinetoplast
+kinetoplastic
+kinetoscope
+kinetosome
+kinfolk
+kinfolks
+King
+king
+kingbird
+kingbolt
+kingcraft
+kingcup
+kingdom
+Kingdom
+kingdom's
+kingdoms
+kingfish
+kingfisher
+kinglet
+kinglier
+kingliness
+kingly
+kingmaker
+Kingman
+kingpin
+kings
+Kingsbury
+kingship
+kingside
+Kingsley
+Kingston
+Kingstown
+kingwana
+Kingwood
+kingwood
+kinin
+kink
+kinkajou
+kinkajou's
+kinkier
+kinkiness
+kinky
+Kinney
+Kinney's
+Kinnickinnic
+kinnickinnic
+Kinnock
+kino
+Kinross
+kinsey
+Kinsey
+kinsfolk
+Kinshasa
+Kinshasha
+Kinshasha's
+kinship
+kinsman
+kinsmen
+kinsmen's
+kinswoman
+kiosk
+kiosks
+kioto
+Kiowa
+kip
+Kipling
+kipper
+kippered
+kippering
+kippers
+kips
+Kirby
+Kirchhoff
+Kirchner
+Kirchner's
+Kirchoff
+Kirghiz
+Kiribati
+Kirigami
+Kirin
+kirk
+Kirk
+Kirk's
+Kirkby
+Kirkcaldy
+Kirkcudbright
+Kirkland
+Kirkman
+Kirkpatrick
+Kirkuk
+Kirkwall
+kirkwood
+Kirkwood
+Kirman
+Kirmess
+Kirov
+Kirov's
+Kirovabad
+Kirovograd
+kirsch
+Kirshbaum
+kirtle
+Kiruna
+Kirundi
+Kisangani
+Kish
+Kishinev
+Kishke
+Kismayu
+kismet
+kiss
+kissable
+kissed
+Kissel
+kisser
+kissers
+kisses
+Kissin
+kissing
+Kissinger
+kissings
+Kist
+Kistna
+Kisumu
+kit
+kit's
+Kitakyushu
+Kitakyushu's
+kitbag
+kitbags
+kitchen
+kitchen's
+kitchener
+kitchenette
+kitchenettes
+kitchenless
+kitchens
+kitchenware
+kitchenwares
+kite
+kited
+kitenge
+kiter
+kites
+kith
+kithara
+kithe
+kithing
+kiting
+kits
+kitsch
+kitschy
+kitten
+kitten's
+kittened
+kittening
+kittenish
+kittenishly
+kittenishness
+kittens
+kitties
+kittiwake
+kittle
+kittled
+kittler
+kittles
+kittling
+Kitts
+kitty
+kitwe
+kiushu
+kiva
+kivu
+Kiwanis
+kiwi
+kiwi's
+kiwis
+kiz
+Kizil
+kizzie
+Klagenfurt
+klaipeda
+Klan
+Klangfarbe
+Klansman
+klatch
+klatsch
+klauber
+Klaus
+Klausenburg
+klaxon
+Klee
+kleenex
+Kleiber
+Klein
+Klein's
+Kleinrock
+Kleinrock's
+Kleist
+Klemperer
+klepht
+kleptomania
+kleptomaniac
+klieg
+Klimt
+Kline
+kline
+Kline's
+Klipspringer
+Klondike
+klong
+klootchman
+klopstock
+kludge
+kludge's
+kludged
+kludger
+kludger's
+kludgers
+kludges
+kludgey
+kludging
+klutz
+klutz's
+klutzes
+klutziness
+klutzy
+Klux
+klystron
+klystrons
+km
+knack
+knacker
+knackery
+knacks
+knackwurst
+knag
+knap
+Knapp
+Knapp's
+knapsack
+knapsack's
+knapsacks
+knar
+Knauer
+Knauer's
+knave
+knave's
+knavery
+knaves
+knavish
+knavishly
+knawel
+knead
+kneadable
+kneaded
+kneader
+kneading
+kneads
+knee
+kneecap
+kneecaps
+kneed
+kneehole
+kneeholes
+kneeing
+kneel
+kneeled
+kneeler
+kneeling
+kneels
+kneepad
+kneepads
+knees
+knell
+knell's
+Kneller
+knells
+knelt
+Knesset
+knew
+knick
+knicker
+knickerbocker
+knickers
+knickknack
+knickpoint
+knife
+knifed
+knifelike
+kniferest
+knifes
+knifing
+knight
+knighted
+Knighthead
+knighthood
+knighting
+knightliness
+knightly
+knights
+Knightsbridge
+Knightsbridge's
+Kniplova
+knish
+knit
+knits
+knitted
+knitter
+knitting
+knitwear
+knives
+knob
+knob's
+knobbed
+knobby
+Knobeloch
+knobeloch
+Knobkerrie
+knobs
+knock
+knockabout
+knockabouts
+knockdown
+knockdowns
+knocked
+knocker
+knockers
+knocking
+knockout
+knockouts
+knocks
+knockwurst
+knoll
+knoll's
+knolls
+knop
+Knossos
+knossos
+knot
+knot's
+knotgrass
+knothole
+knots
+Knott
+Knott's
+knotted
+knotter
+knottier
+knottiness
+knotting
+knotty
+knotweed
+knotwork
+knout
+know
+knowable
+knower
+knoweth
+knowhow
+knowily
+knowing
+knowingly
+knowledge
+knowledgeability
+knowledgeable
+knowledgeableness
+knowledgeably
+knowledges
+Knowles
+Knowlton
+Knowlton's
+known
+knows
+Knox
+Knoxville
+knuckle
+knuckleball
+knuckleballer
+knucklebone
+knucklebones
+knuckled
+knucklehead
+knuckleheaded
+knuckles
+knuckling
+Knudsen
+Knudson
+knurl
+knurly
+Knussen
+Knuth
+Knuth's
+Knutsen
+Knutson
+koa
+koala
+koan
+kob
+kobarid
+Kobayashi
+kobe
+Koblenz
+kobold
+Koch
+Kochab
+Kochab's
+kochi
+Kodachrome
+Kodak
+Kodaks
+Kodaly
+Kodiak
+kodok
+koel
+Koenig
+Koenigsberg
+Koestler
+kofta
+koftgar
+kofu
+Koheleth
+Kohima
+Kohl
+Kohler
+kohlrabi
+Kohn
+Kohoutek
+koine
+koinonia
+Kokand
+Kokanee
+Kokobeh
+Kokoschka
+kokura
+kola
+kolar
+kolding
+Kolhapur
+Kolinsky
+kolkhoz
+Kollo
+Kollwitz
+Kolmar
+Kolmogorov
+Kolo
+Kolomna
+Kolyma
+Komati
+Komatik
+kombu
+Komi
+Kommunarsk
+Kommunizma
+Komodo
+Komsomol
+Komsomolsk
+Konakry
+Kondo
+Kondrashin
+Kong
+konga
+koniology
+Konrad
+konrad
+Konrad's
+Konstanz
+konya
+koodoo
+kook
+kookaburra
+kookie
+kookier
+kookiness
+kooks
+kooky
+kooning
+Kootenay
+kopeck
+Kopeisk
+kopek
+koph
+Kopje
+Koppa
+Koppers
+Koran
+Koran's
+Korbut
+Korchnoi
+Kordofan
+Kordofanian
+Korea
+Korean
+Koreans
+korfball
+Korma
+Korngold
+Korsakov
+Kortrijk
+Koruna
+Korzybski
+Kos
+Kosciusko
+kosher
+koshered
+koshering
+Kossuth
+Kostroma
+Kosygin
+Kota
+Kotabaru
+koto
+Koulibiaca
+Koumis
+Kovacs
+Kovic
+Kovic's
+Kovno
+Kovrov
+Kowalewski
+Kowalewski's
+Kowalski
+Kowalski's
+Koweit
+Kowhai
+Kowloon
+kowtow
+Kozhikode
+kpc
+Kra
+Kraal
+Kraemer
+kraemer
+kraft
+Kragujevac
+Krait
+Krakatoa
+Krakau
+kraken
+Krakow
+Kramatorsk
+Kramer
+Krameria
+Kranj
+Krans
+Krasnodar
+Krasnoyarsk
+Krause
+kraut
+krauts
+Krebs
+Krefeld
+Kreisky
+Kreisler
+Kremenchug
+Kremer
+Kremlin
+kremlinologist
+kremlinology
+Krems
+Kreplach
+Kresge
+kretchmer
+Kreutzer
+Krieger
+Krieger's
+Kriegspiel
+Kriemhild
+krill
+Krimmer
+Krio
+Krips
+Kris
+Krishna
+Kriss
+Kristiansand
+Kristianstad
+Kristin
+Kristin's
+Kristina
+Krivoy
+Kromesky
+Krone
+Kronecker
+Kronecker's
+Kronig
+Kronos
+Kroon
+Kropotkin
+Krueger
+Kruger
+Krugersdorp
+Kruller
+krummholz
+Krummhorn
+Krupp
+Kruse
+Kruse's
+Kruysen
+Krym
+krypton
+KS
+Kshatriya
+Kuala
+Kuban
+Kubelik
+Kublai
+Kubrick
+Kuch
+Kuchen
+Kuching
+kudo
+kudos
+kudu
+kudzu
+Kueh
+Kuenlun
+Kuenning
+Kuenning's
+Kufic
+Kuhn
+Kuhn's
+Kuibyshev
+Kukri
+Kuku
+Kula
+kulak
+kultur
+Kulturkampf
+Kulun
+Kum
+Kumamoto
+Kumar
+Kumasi
+Kumbaloi
+kumquat
+Kung
+Kungur
+Kunming
+Kunzite
+Kuomintang
+Kuopio
+Kura
+kurchatovium
+Kurd
+kurdish
+Kurdish
+Kurgan
+Kuril
+Kurland
+Kurosawa
+Kuroshio
+Kurrajong
+Kursaal
+Kursk
+Kurt
+kurtosis
+Kurzeme
+Kuskokwim
+Kutaisi
+Kutch
+Kutuzov
+Kuwait
+Kuznetsk
+Kwa
+Kwacha
+Kwajalein
+Kwakiutl
+Kwangchow
+Kwangchowan
+Kwangju
+Kwangtung
+Kwantung
+Kwanza
+Kwara
+kwashiorkor
+Kwazulu
+Kweichow
+Kweilin
+Kweisui
+Kweiyang
+Kwela
+KWIC
+KWOC
+KY
+kyanite
+kyanize
+kyanized
+kyanizes
+kyanizing
+Kyle
+kylin
+kylix
+kyloe
+kymograph
+kymric
+kymry
+Kynewulf
+Kyongsong
+Kyoto
+kyphosis
+Kyprianou
+Kyrie
+kythera
+Kyushu
+l's
+L'vov
+la
+La
+Laager
+Laaland
+lab
+lab's
+Laban
+Laban's
+labarum
+labdanum
+labe
+labefaction
+label
+label's
+labelable
+labeled
+labeler
+labeler's
+labelers
+labeling
+labellate
+labellum
+labels
+labia
+labial
+labialization
+labialization's
+labializations
+labialize
+labialized
+labializes
+labializing
+labially
+labiate
+labiche
+labile
+lability
+labilization
+labilization's
+labilizations
+labilize
+labilizes
+labiodental
+labionasal
+labiovelar
+labium
+lablab
+labor
+laborabilities
+laborability
+laborability's
+laborable
+laborable's
+laborables
+laboratories
+laboratory
+laboratory's
+labored
+labored's
+laboredly
+laboredness
+laborer
+laborer's
+laborers
+laborhood
+laborhood's
+laborhoods
+laboring
+laboring's
+laboringly
+laborings
+laborious
+laboriously
+laboriousness
+laborism
+laborism's
+laborisms
+laborist
+laborist's
+laborists
+laborite
+laborite's
+laborites
+laborless
+laborlesses
+labors
+laborsaving
+labour's
+Labrador
+labradorite
+labret
+labroid
+labrum
+labs
+labuan
+Laburnum
+labyrinth
+labyrinthian
+labyrinthine
+labyrinthodont
+labyrinths
+laccolith
+lace
+laced
+lacedaemon
+Lacedaemonian
+laceless
+lacelike
+lacemaker
+lacer
+lacerant
+lacerate
+lacerated
+lacerates
+lacerating
+laceration
+lacerations
+lacerative
+Lacerta
+Lacerta's
+lacertilian
+laces
+lacewing
+lacework
+Lacey
+lacey
+laches
+Lachesis
+lachlan
+lachryma
+lachrymal
+lachrymator
+lachrymatory
+lachrymose
+lachrymosely
+lacier
+lacing
+laciniate
+laciniated
+laciniation
+lack
+lackadaisic
+lackadaisical
+lackadaisically
+lackaday
+Lackawanna
+lacked
+lacker
+lackey
+lackeyed
+lackeying
+lackeys
+lacking
+lackluster
+lacks
+laclos
+laconia
+laconic
+laconically
+laconics
+laconism
+laconisms
+laconize
+laconized
+laconizes
+laconizing
+lacquer
+lacquered
+lacquerer
+lacquerers
+lacquering
+lacquers
+lacrimal
+lacrimation
+lacrimator
+lacrosse
+lacrosses
+lactalbumin
+lactam
+lactary
+lactase
+lactate
+lactated
+lactates
+lactating
+lactation
+lactational
+lactationally
+lacteal
+lactescent
+lactic
+lactiferous
+lactiferousness
+Lactobacillus
+lactobionamide
+lactobionamides
+lactobionic
+lactobionyl
+lactoflavin
+lactogenic
+lactoglobulin
+lactometer
+lactone
+lactonic
+lactonized
+lactophenol
+lactoprotein
+lactoscope
+lactose
+lacuna
+lacunae
+lacunal
+lacunar
+lacunaria
+lacunary
+lacunas
+lacunate
+lacustrine
+lacy
+lad
+ladanum
+ladder
+ladders
+laddie
+lade
+laded
+laden
+ladened
+ladening
+ladies
+Ladin
+lading
+Ladino
+ladislaus
+ladle
+ladled
+ladles
+ladling
+ladoga
+ladrone
+lads
+lady
+lady's
+ladybird
+ladybird's
+ladybirds
+ladybug
+ladybug's
+ladybugs
+ladyfern
+ladyfinger
+ladyfy
+ladykin
+ladylike
+ladylove
+ladyship
+ladysmith
+ladysnow
+laertes
+laevogyrate
+laevorotatory
+laevulin
+laevulose
+Lafayette
+laforgue
+lag
+lagan
+lage
+lagena
+lager
+lagerkvist
+lagers
+laggard
+laggardly
+laggardness
+laggards
+lagged
+lagger
+lagging
+lagniappe
+lagomorph
+lagomorphic
+lagomorphous
+lagoon
+lagoon's
+lagoonal
+lagoons
+Lagos
+Lagrange
+Lagrangian
+Lagrangian's
+lags
+Lagting
+Laguerre
+laguna
+Laguna
+lah
+Lahnda
+Lahore
+Lahore's
+Lahti
+Laibach
+laic
+laical
+laically
+laicism
+laicization
+laicizations
+laicize
+laicized
+laicizes
+laicizing
+laid
+Laidlaw
+Laidlaw's
+laik
+lain
+laing
+lair
+lair's
+laird
+lairdly
+lairs
+lairy
+laissez
+laitance
+laitances
+laity
+laius
+lake
+lake's
+lakefront
+Lakehurst
+Lakeland
+laker
+Lakes
+lakes
+lakeshore
+lakeside
+Lakewood
+lakewood
+lakh
+laking
+Laksa
+Lakshadweep
+laky
+lala
+lalang
+lalapalooza
+lallans
+lallation
+lallygag
+lallygagged
+Lalo
+lam
+lama
+Lamaism
+Lamar
+Lamar's
+Lamarck
+Lamarckian
+Lamarckism
+lamartine
+lamas
+lamasery
+lamb
+lamb's
+lambast
+lambaste
+lambda
+lambda's
+lambdacism
+lambdas
+lambdoid
+lambency
+lambent
+lambently
+lamber
+lambert
+lambertian
+lambeth
+lambkill
+lambkin
+Lamborghini
+Lamborghini's
+Lamborghinis
+lambrequin
+lambs
+lambskin
+lame
+lamebrain
+lamebrained
+lamed
+lamella
+lamellae
+lamellar
+lamellarly
+lamellas
+lamellate
+lamellately
+lamellation
+lamellicorn
+lamelliform
+lamellirostral
+lamely
+lameness
+lament
+lamentable
+lamentableness
+lamentably
+lamentation
+lamentation's
+lamentations
+lamented
+lamenting
+laments
+lamer
+lames
+lamest
+lametedly
+lamia
+lamina
+laminal
+laminar
+laminaria
+laminarian
+laminarin
+laminate
+laminated
+laminates
+laminating
+lamination
+laminations
+laminator
+laming
+Lamington
+laminin
+laminitis
+Lammas
+Lammastide
+lammed
+lammergeier
+lamming
+lamp
+lamp's
+lampas
+lampblack
+lampedusa
+lamper
+lampern
+lampeter
+lampholder
+lampion
+lamplight
+lamplighter
+lampoon
+lampooned
+lampooner
+lampoonery
+lampooning
+lampoons
+Lamport
+Lamport's
+lamppost
+lampposts
+lamprey
+lampreys
+lamprophyre
+lamps
+lampshade
+lampshades
+lamster
+Lana
+Lana's
+lanai
+lanark
+lanate
+Lancashire
+Lancaster
+Lancastrian
+lance
+lanced
+lancejack
+lancelet
+lancelot
+Lancelot
+Lancelot's
+lanceolate
+lanceolately
+lancer
+lancers
+lances
+lancet
+lanceted
+lancewood
+lanchow
+lancinate
+lancinated
+lancinates
+lancinating
+lancination
+lancinations
+lancing
+land
+landammann
+Landau
+landau
+landaulet
+landed
+lander
+landers
+landes
+landeshauptmann
+landfall
+landfill
+landform
+landgrave
+landgraviate
+landgravine
+landhold
+landholder
+landholders
+landholding
+landholdings
+landing
+landings
+Landis
+landladies
+landlady
+landlady's
+landless
+landlocked
+landloper
+landlord
+landlord's
+landlordism
+landlords
+landlubber
+landlubberly
+landmark
+landmark's
+landmarks
+landmass
+landmasses
+landor
+landowner
+landowner's
+landowners
+landownership
+landowning
+landowska
+landrace
+lands
+landscape
+landscaped
+landscaper
+landscapes
+landscaping
+landscapist
+landscapists
+landseer
+landshark
+landshut
+landside
+landsknecht
+landslide
+landslides
+landslip
+landslips
+landsman
+landtag
+landwaiter
+landward
+landwards
+Landwehr
+lane
+lane's
+lanes
+lanesmanship
+lanfranc
+Lang
+Lang's
+Lange
+Langeland
+langeland
+Langford
+Langland
+langlauf
+Langley
+Langmuir
+Langmuir's
+Langobard
+Langobardic
+langouste
+langrage
+langres
+Langridge
+langsyne
+Langton
+Langtry
+language
+language's
+languages
+langue
+languedoc
+languet
+languid
+languidly
+languidness
+languish
+languished
+languisher
+languishes
+languishing
+languishingly
+languishment
+languor
+languorous
+languorously
+langur
+laniard
+laniary
+laniferous
+lank
+Lanka
+Lanka's
+lankester
+lankier
+lankily
+lankiness
+lankly
+lankness
+lanky
+lanner
+lanneret
+lanolin
+lanose
+Lansing
+lansquenet
+Lantana
+lantern
+lantern's
+lanterns
+lanthanide
+lanthanum
+lanthorn
+lanuginous
+lanuginousness
+lanugo
+lanyard
+Lao
+laoag
+Laocoon
+laodicea
+laodicean
+laomedon
+Laos
+Laotian
+Laotians
+laotze
+lap
+lap's
+laparotomy
+lapboard
+lapdog
+lapel
+lapel's
+lapeled
+lapels
+lapful
+lapidarian
+lapidary
+lapidate
+lapidify
+lapillus
+lapis
+Lapith
+Laplace
+Laplacian
+Lapland
+Lapp
+lapped
+lapper
+lappet
+lapping
+laps
+lapse
+lapsed
+lapser
+lapses
+lapsing
+lapstrake
+lapstreak
+lapsus
+laptev
+laptop
+laptop's
+laptops
+lapwing
+Lar
+Laramie
+larcener
+larcenist
+larcenous
+larcenously
+larceny
+larch
+lard
+larded
+larder
+larding
+lardon
+lards
+lardy
+Laredo
+lares
+large
+largehearted
+largely
+largemouth
+largen
+largeness
+larger
+largess
+largesse
+largest
+larghetto
+largish
+largo
+largos
+lariat
+larine
+larisa
+lark
+lark's
+larker
+larkier
+Larkin
+Larkin's
+larks
+larkspur
+larky
+larmor
+larn
+larnax
+larousse
+larrigan
+larrikin
+larrup
+Larry
+Larry's
+Lars
+Larsen
+Larson
+larum
+larva
+larvae
+larval
+larvas
+larvicidal
+larvicide
+larwood
+laryngeal
+laryngeally
+larynges
+laryngitis
+laryngology
+laryngoscope
+laryngoscopic
+laryngotomy
+larynx
+larynxes
+las
+lasagna
+lasagne
+lascar
+lascaux
+lascivious
+lasciviously
+lasciviousness
+lase
+laser
+laser's
+lasers
+lash
+lashed
+lasher
+lashes
+lashing
+lashings
+lashio
+lashkar
+lasing
+lasker
+lasket
+Laski
+lass
+lass's
+lassa
+lassalle
+Lassen
+lasses
+lassie
+lassies
+lassitude
+lassitudes
+lasso
+lassoed
+lassoer
+lassoes
+lassus
+last
+lasted
+laster
+lasting
+lastingly
+lastingness
+lastly
+lasts
+Laszlo
+Laszlo's
+lat
+Latakia
+latch
+latched
+latches
+latchet
+latching
+latchkey
+latchstring
+late
+latecomer
+latecomers
+lated
+lateen
+lateener
+lateiner
+lately
+latencies
+latency
+latency's
+latened
+lateness
+latening
+latensification
+latensifications
+latensified
+latensifies
+latensify
+latent
+latentize
+latentizes
+latently
+latents
+later
+latera
+lateral
+lateralization
+lateralization's
+lateralizations
+lateralize
+lateralizes
+laterally
+Lateran
+Lateran's
+laterite
+laterization
+laterization's
+laterizations
+lateroversion
+latest
+LaTeX
+latex
+LaTeX's
+latex's
+latexes
+lath
+lathe
+lather
+lathered
+latherer
+lathering
+lathery
+lathes
+lathi
+lathing
+Lathrop
+lathy
+latices
+laticiferous
+latifundium
+latimer
+Latimeria
+Latin
+Latin's
+Latina
+Latinate
+Latinism
+Latinist
+Latinity
+Latinization
+Latinization's
+Latinizations
+Latinize
+Latinized
+Latinizer
+Latinizers
+Latinizes
+Latinizing
+Latino
+latish
+latitude
+latitude's
+latitudes
+latitudinal
+latitudinally
+latitudinarian
+latitudinarianism
+latitudinary
+latium
+Latona
+Latour
+latria
+latrine
+latrine's
+latrines
+Latrobe
+Latrobe's
+latten
+latter
+latter's
+latterly
+lattermost
+lattice
+lattice's
+latticed
+lattices
+latticework
+latticing
+lattimer
+Lattimer
+latus
+Latvia
+Latvia's
+Latvian
+laud
+lauda
+laudability
+laudable
+laudableness
+laudably
+laudanum
+laudation
+laudations
+laudative
+laudatorily
+laudatory
+lauder
+Lauderdale
+Laudian
+lauds
+Laue
+Laue's
+laugh
+laughable
+laughableness
+laughably
+laughed
+laugher
+laughers
+laughing
+laughingly
+laughingstock
+laughingstocks
+Laughlin
+Laughlin's
+laughs
+laughter
+laughterful
+laughters
+Laughton
+Launce
+Launceston
+launch
+launched
+launcher
+launchers
+launches
+launching
+launchings
+launder
+launderability
+laundered
+launderer
+launderette
+launderettes
+laundering
+launderings
+launders
+laundress
+laundresses
+laundries
+Laundromat
+Laundromats
+laundry
+laundryman
+laundrymen
+laundrywoman
+laura
+Laura's
+lauraceous
+laurasia
+laurate
+laureate
+laureated
+laureates
+laureateship
+laureating
+laureation
+laurel
+laurel's
+laureled
+laureling
+laurels
+Lauren
+Laurence
+Laurent
+Laurent's
+Laurentian
+lauric
+Laurie
+Laurie's
+laurier
+laurustinus
+lauryl
+Lausanne
+Lausanne's
+lautrec
+lav
+lava
+lavabo
+lavage
+lavaged
+laval
+lavalava
+lavaliere
+lavalike
+lavallade
+lavalliere
+lavation
+lavational
+lavato
+lavatories
+lavatory
+lavatory's
+lave
+laveer
+lavender
+lavendered
+lavendering
+laver
+laverock
+laving
+lavish
+lavished
+lavishing
+lavishly
+lavishness
+Lavoisier
+Lavoisier's
+lavolta
+law
+law's
+lawbreak
+lawbreaker
+lawbreakers
+lawbreaking
+lawes
+Lawford
+lawful
+lawfully
+lawfulness
+lawgive
+lawgiver
+lawgivers
+lawgiving
+lawks
+Lawless
+lawless
+lawlessly
+lawlessness
+lawmake
+lawmaker
+lawmakers
+lawmaking
+lawman
+lawmen
+lawn
+lawn's
+lawns
+lawny
+Lawrence
+Lawrenceville
+lawrencium
+Lawrentian
+laws
+Lawson
+lawsuit
+lawsuit's
+lawsuits
+lawyer
+lawyer's
+lawyerly
+lawyers
+lax
+laxation
+laxative
+laxatively
+laxativeness
+laxatives
+laxey
+laxity
+laxly
+laxness
+lay
+layabout
+layabouts
+layamon
+layard
+layaway
+laycock
+layer
+layerage
+layered
+layering
+layers
+layette
+laying
+layman
+laymen
+layoff
+layoffs
+layout
+layout's
+layouts
+layover
+layovers
+laypeople
+layperson
+lays
+layshaft
+Layton
+Layton's
+layup
+layup's
+layups
+laywoman
+laywomen
+Lazar
+lazaretto
+Lazarus
+laze
+lazed
+lazes
+lazied
+lazier
+laziest
+lazily
+laziness
+lazing
+lazio
+lazuli
+lazulite
+lazurite
+lazy
+lazybones
+lazying
+lazyish
+lb
+lbs
+LDL
+lea
+leach
+leachable
+leachate
+leaches
+leaching
+Leacock
+lead
+leadbelly
+leaded
+leaden
+leadenly
+leadenness
+leader
+leader's
+leaderless
+leaders
+leadership
+leadership's
+leaderships
+leadeth
+leadier
+leading
+leadings
+leadless
+leadoff
+leads
+leadsman
+leadsmen
+leadwork
+leadwort
+leady
+leaf
+Leaf
+leafage
+leafcutter
+leafed
+leafhopper
+leafier
+leafiest
+leafing
+leafless
+leaflet
+leaflet's
+leaflets
+leafletting
+leaflike
+leafs
+leafstalk
+leafstalks
+leafy
+league
+leagued
+leaguer
+leaguers
+leagues
+leaguing
+Leah
+leak
+leakage
+leakage's
+leakages
+leaked
+leaker
+leakey
+leakier
+leakily
+leakiness
+leaking
+leaks
+leaky
+leal
+Leamington
+lean
+Leander
+Leander's
+leaned
+leaner
+leanest
+leaning
+leanings
+leanly
+leanness
+leans
+leant
+leap
+leaped
+leaper
+leapfrog
+leapfrogged
+leapfrogging
+leaping
+leaps
+leapt
+Lear
+learn
+learnable
+learned
+learnedly
+learnedness
+learner
+learners
+learning
+learnings
+learns
+leary
+Leary
+lease
+leaseback
+leased
+leasehold
+leaseholder
+leases
+leash
+leash's
+leashes
+leasing
+least
+leastways
+leastwise
+leasure
+leat
+leather
+leatherback
+leathered
+Leatherette
+leatherhead
+leathering
+leatherize
+leatherizes
+leatherjacket
+leatherlike
+leathern
+leatherneck
+leathers
+leatherwood
+leatherwork
+leathery
+leave
+leaved
+leaven
+leavened
+leavening
+Leavenworth
+leaver
+leavers
+leaves
+leaving
+leavings
+leavis
+Lebanese
+Lebanon
+leben
+lebensraum
+Lebesgue
+lebkuchen
+leblanc
+lebowa
+lebrun
+lecce
+lech
+lecher
+lecherous
+lecherously
+lecherousness
+lechery
+lecithin
+lecithinase
+lecky
+leconte
+lectern
+lectern's
+lecterns
+lectin
+lectin's
+lectins
+lection
+lectionary
+lector
+lecture
+lectured
+lecturer
+lecturers
+lectures
+lectureship
+lecturing
+lecythus
+led
+LED's
+Leda
+lederhosen
+ledge
+ledger
+ledgers
+ledges
+ledgy
+LEDs
+lee
+Lee's
+leeboard
+leech
+leech's
+leeches
+leeds
+leek
+leer
+leered
+leering
+leers
+leery
+lees
+leet
+leeuwarden
+Leeuwenhoek
+Leeuwenhoek's
+leeward
+leewards
+leeway
+Lefkowitz
+left
+lefthand
+lefthanded
+lefties
+leftism
+leftist
+leftist's
+leftists
+leftmost
+leftover
+leftover's
+leftovers
+lefts
+leftward
+leftwards
+leftwing
+leftwinger
+leftwingers
+lefty
+leg
+legacies
+legacy
+legacy's
+legal
+legalese
+legalism
+legalist
+legalistic
+legalistically
+legalities
+legality
+legalization
+legalization's
+legalizations
+legalize
+legalized
+legalizes
+legalizing
+legally
+legals
+legaspi
+legate
+legated
+legatee
+legates
+legateship
+legatine
+legating
+legation
+legations
+legato
+legator
+legend
+legend's
+legendarily
+legendary
+Legendre
+Legendre's
+legendry
+legends
+legerdemain
+legerity
+leges
+legged
+leggier
+legging
+leggings
+leggy
+leghorn
+legibility
+legible
+legibly
+legion
+legion's
+legionary
+legionnaire
+legionnaires
+legions
+legis
+legislate
+legislated
+legislates
+legislating
+legislation
+legislations
+legislative
+legislatively
+legislator
+legislator's
+legislatorial
+legislators
+legislatorship
+legislatress
+legislatrix
+legislature
+legislature's
+legislatures
+legist
+legit
+legitimacy
+legitimate
+legitimated
+legitimately
+legitimates
+legitimating
+legitimation
+legitimatize
+legitimatized
+legitimatizes
+legitimatizing
+legitimism
+legitimist
+legitimization
+legitimization's
+legitimizations
+legitimize
+legitimized
+legitimizer
+legitimizes
+legitimizing
+legless
+legman
+legnica
+legroom
+legs
+legume
+legumes
+legumin
+leguminous
+legwork
+Lehigh
+Lehman
+Lehman's
+lehmann
+lehmbruck
+lehr
+lei
+Leibnitz
+Leibniz
+Leicester
+Leicestershire
+Leichhardt
+Leiden
+Leif
+Leigh
+Leighton
+Leila
+Leinsdorf
+Leinster
+Leipzig
+Leipzig's
+leiria
+Leishmania
+leishmaniasis
+leister
+leisure
+leisured
+leisureliness
+leisurely
+leith
+leitmotif
+leitmotiv
+Leitner
+leitrim
+leix
+lek
+lekker
+Leland
+Leland's
+lely
+leman
+Lemberg
+lemke
+Lemke
+lemma
+lemma's
+lemmas
+Lemmens
+lemming
+lemmings
+lemniscate
+lemnos
+lemon
+lemon's
+lemonade
+lemons
+lemony
+lempira
+Lemuel
+lemur
+lemures
+lemuroid
+Len
+Len's
+Lena
+Lena's
+lend
+lender
+lenders
+lending
+lends
+lenglen
+length
+lengthen
+lengthened
+lengthener
+lengthening
+lengthens
+lengthier
+lengthily
+lengthiness
+lengthly
+lengthman
+lengths
+lengthways
+lengthwise
+lengthy
+lenience
+leniency
+lenient
+leniently
+Lenin
+Leninabad
+Leninakan
+Leningrad
+Leninism
+Leninist
+lenis
+lenitive
+lenitively
+lenity
+Lennon
+Lennon's
+Lennox
+Lennox's
+Lenny
+Leno
+Lenore
+Lenore's
+lens
+lens's
+lense
+lensed
+lenser
+lensers
+lenses
+lensing
+lensings
+lensless
+lent
+lentamente
+Lenten
+lentic
+lenticel
+lenticular
+lenticulate
+lenticulation
+lentigo
+lentil
+lentil's
+lentils
+lentissimo
+lento
+Lenya
+Leo
+leoben
+Leon
+Leona
+Leonard
+Leonardo
+Leoncavallo
+Leone
+Leonid
+Leonid's
+Leonidas
+leonine
+leopard
+leopard's
+leopardess
+Leopardi
+leopards
+Leopold
+Leopoldville
+leotard
+leotards
+Lepanto
+lepaya
+leper
+lepers
+lepidolite
+lepidopteran
+lepidopterist
+Lepidosiren
+lepidote
+lepidus
+lepontine
+leporid
+leporine
+leprechaun
+leprechauns
+leprosarium
+leprose
+leprosy
+leprotic
+leprous
+leprously
+leprousness
+Leptocephalus
+Lepton
+lepton
+lepton's
+leptons
+leptophyllous
+leptosome
+leptospiral
+leptospirosis
+leptotene
+Lepus
+Lermontov
+Leroy
+Lerwick
+les
+lesbian
+lesbianism
+lesbians
+lesbos
+lesion
+lesions
+Leslie
+Lesotho
+Lesotho's
+less
+lessee
+lessen
+lessened
+lessening
+lessens
+lesseps
+lesser
+lesses
+lessing
+lesson
+lesson's
+lessoned
+lessoning
+lessons
+lessor
+lest
+lester
+let
+let's
+letch
+letchworth
+letdown
+letdowns
+lethal
+lethality
+lethalize
+lethalizes
+lethally
+lethargic
+lethargically
+lethargies
+lethargy
+Lethbridge
+Lethe
+Lethe's
+Letitia
+Letitia's
+Leto
+lets
+Lett
+letted
+letter
+lettered
+letterer
+letterhead
+letterheads
+lettering
+letterman
+lettermen
+letterpress
+letters
+letterset
+letting
+Lettish
+lettuce
+letup
+leu
+leucas
+leucine
+Leucippus
+leucite
+leucitic
+leuco
+leucocratic
+leucocyte
+leucocytosis
+leucoderma
+leucoma
+leucomaine
+leucopenia
+leucoplast
+leucopoiesis
+leucorrhoea
+leucotomy
+leuctra
+leukas
+leukemia
+leukemic
+leukemoid
+leukocyte
+leukocytic
+leuven
+lev
+levalloisian
+Levant
+levanter
+Levantine
+levator
+levatores
+levators
+levee
+levee's
+leveed
+leveeing
+levees
+level
+leveled
+leveler
+levelers
+levelest
+levelheaded
+levelheadedness
+leveling
+levelly
+levelness
+levels
+leven
+lever
+lever's
+leverage
+leveraged
+leverages
+leveraging
+levered
+leveret
+Leverhulme
+levering
+Leverkusen
+leverrier
+levers
+Levi
+Leviable
+leviable
+leviathan
+leviathan's
+levied
+levier
+levies
+levigate
+levigated
+levigates
+levigating
+levigation
+Levin
+Levin's
+Levine
+levirate
+leviratic
+Levis
+levitate
+levitated
+levitates
+levitating
+levitation
+levitational
+Levite
+Levitical
+Leviticus
+levities
+Levitt
+Levitt's
+levity
+levkas
+Levko
+levorotation
+levorotatory
+levulose
+levy
+levying
+Lew
+Lew's
+lewd
+lewdly
+lewdness
+Lewellyn
+lewellyn
+lewes
+lewis
+Lewisham
+lewisite
+lex
+lexeme
+lexica
+lexical
+lexicality
+lexically
+lexicographer
+lexicographer's
+lexicographers
+lexicographic
+lexicographical
+lexicographically
+lexicography
+lexicology
+lexicon
+lexicon's
+lexiconize
+lexiconizes
+lexicons
+lexicostatistic
+lexicostatistics
+lexigraphy
+Lexington
+lexis
+ley
+Leyden
+Leyte
+Lhasa
+liabilities
+liability
+liability's
+liable
+liableness
+Liadov
+liaise
+liaised
+liaises
+liaising
+liaison
+liaison's
+liaisons
+liana
+Liao
+Liaoning
+Liaotung
+Liaoyang
+liar
+liar's
+liard
+liars
+Lias
+liase
+liason
+lib
+libation
+libationary
+libations
+libau
+libava
+Libby
+Libby's
+libeccio
+libel
+libelant
+libelants
+libeled
+libelee
+libelees
+libeler
+libelers
+libeling
+libelist
+libelous
+libelously
+libels
+liber
+liberace
+Liberace
+liberal
+liberalism
+liberalist
+liberalistic
+liberality
+liberalization
+liberalization's
+liberalizations
+liberalize
+liberalized
+liberalizer
+liberalizers
+liberalizes
+liberalizing
+liberally
+liberalness
+liberals
+liberate
+liberated
+liberates
+liberating
+liberation
+liberationist
+liberationists
+liberator
+liberator's
+liberators
+liberec
+Liberia
+libertarian
+libertarianism
+libertarians
+liberticide
+libertie
+liberties
+libertinage
+libertine
+libertines
+libertinism
+liberty
+liberty's
+libia
+libidinal
+libidinally
+libidinous
+libidinously
+libidinousness
+libido
+libra
+librae
+librarian
+librarian's
+librarians
+librarianship
+libraries
+library
+library's
+librate
+libration
+librational
+libratory
+libretti
+librettist
+librettists
+libretto
+libretto's
+librettos
+Libreville
+Libreville's
+libriform
+Libya
+Libyan
+licating
+lice
+licensable
+license
+license's
+licensed
+licensee
+licensee's
+licensees
+licenseless
+licenselesses
+licenser
+licenses
+licensing
+licensor
+licensure
+licentiate
+licentiateship
+licentious
+licentiously
+licentiousness
+lichee
+lichen
+lichen's
+lichened
+lichenin
+lichenization
+lichenization's
+lichenizations
+lichenize
+lichenizes
+lichenology
+lichenous
+lichens
+Lichfield
+lichi
+licht
+lichtenstein
+Lichtenstein
+Lichter
+lichter
+licit
+licitly
+lick
+licked
+licker
+lickerish
+lickerishly
+lickerishness
+licking
+licks
+lickspittle
+licorice
+lictor
+lid
+lid's
+lidded
+liddell
+lidding
+lidice
+lidless
+lido
+lidocaine
+lidos
+lids
+lie
+lieberman
+Lieberman
+Lieberman's
+Liebfraumilch
+liebig
+liebknecht
+Liechtenstein
+lied
+lieder
+lief
+liege
+liegeman
+liegnitz
+lien
+lien's
+lienal
+liens
+lientery
+lier
+lierne
+lies
+liestal
+lietuva
+lieu
+lieut
+lieutenancy
+lieutenant
+lieutenant's
+lieutenants
+lieve
+life
+life's
+lifeblood
+lifeboat
+lifeboats
+lifeful
+lifeguard
+lifeguards
+lifeless
+lifelessly
+lifelessness
+lifelike
+lifelikeness
+lifeline
+lifelines
+lifelong
+lifemanship
+lifer
+lifers
+lifesaver
+lifesaving
+lifespan
+lifespans
+lifestyle
+lifestyles
+lifetime
+lifetime's
+lifetimes
+lifeway
+lifework
+liffey
+LIFO
+lift
+liftable
+liftboy
+lifted
+lifter
+lifters
+lifting
+liftman
+liftoff
+lifts
+ligament
+ligamentary
+ligamentous
+ligaments
+ligan
+ligand
+ligands
+ligate
+ligated
+ligates
+ligating
+ligation
+ligations
+ligature
+ligatured
+ligatures
+ligaturing
+liger
+ligeti
+Ligget
+Ligget's
+Liggett
+Liggett's
+light
+lighted
+lighten
+lightened
+lightener
+lightening
+lightens
+lighter
+lighter's
+lighterage
+lighters
+lightest
+lightface
+lightfaced
+lightfooted
+lightfootedly
+lightfootedness
+lightful
+lighthanded
+lighthandedness
+lightheaded
+lighthearted
+lightheartedly
+lightheartedness
+lighthouse
+lighthouse's
+lighthouses
+lighting
+lightish
+lightless
+lightly
+lightness
+lightning
+lightning's
+lightninged
+lightnings
+lightproof
+lights
+lightship
+lightships
+lightsome
+lightsomely
+lightsomeness
+lightweight
+lightweights
+lightyear
+lightyears
+ligneous
+lignification
+lignified
+lignifies
+ligniform
+lignify
+lignifying
+lignin
+lignite
+lignitic
+lignitize
+lignitizes
+lignocaine
+lignocellulose
+lignum
+ligroin
+ligula
+ligulate
+ligule
+ligure
+liguria
+lii
+likability
+likable
+likableness
+likasi
+like
+likeable
+liked
+likelier
+likeliest
+likelihood
+likelihoods
+likeliness
+likely
+liken
+likened
+likeness
+likeness's
+likenesses
+likening
+likens
+liker
+likes
+likest
+likewise
+liking
+likings
+liklihood
+likuta
+Lila
+Lila's
+lilac
+lilac's
+lilacs
+lilburne
+liliaceous
+Lilian
+Lilian's
+lilied
+lilienthal
+lilies
+Lilith
+liliuokalani
+lille
+Lillian
+Lillian's
+lilliput
+Lilliputian
+lilliputian
+Lilliputianize
+Lilliputianizes
+Lilly
+lilo
+lilongwe
+lilt
+lilting
+liltingly
+liltingness
+lily
+lily's
+Lima
+limacine
+Liman
+limassol
+limb
+limba
+limbate
+limbed
+limber
+limbered
+limbering
+limberly
+limberness
+limbers
+limbic
+limbless
+limbo
+limbos
+Limbourg
+limbs
+Limburg
+Limburger
+limbus
+lime
+lime's
+limeade
+limed
+limekiln
+limelight
+limen
+limerick
+limerick's
+limericks
+limes
+limestone
+limewater
+limey
+limicoline
+limicolous
+limier
+liminal
+liming
+limit
+limitability
+limitable
+limitably
+limitarian
+limitary
+limitation
+limitation's
+limitational
+limitations
+limitative
+limited
+limitedly
+limitedness
+limiteds
+limiter
+limiters
+limiting
+limitless
+limitlessly
+limitlessness
+limitrophe
+limits
+limmer
+limn
+limner
+limnetic
+limnic
+limning
+limnological
+limnologically
+limnologist
+limnology
+limo
+limo's
+limoges
+limonene
+limonite
+limonitic
+limos
+limousin
+limousine
+limousines
+limp
+limped
+limper
+limpet
+limpid
+limpidity
+limpidly
+limpidness
+limping
+limpkin
+limply
+limpness
+Limpopo
+limps
+limpsy
+limulus
+limy
+Lin
+Lin's
+linac
+linacre
+linage
+linalool
+linares
+linate
+linated
+lination
+linchpin
+linchpin's
+linchpins
+Lincoln
+Lincolnshire
+lincrusta
+linctus
+Lind
+Lind's
+Linda
+lindane
+Lindberg
+Lindbergh
+Lindbergh's
+linden
+lindesnes
+Lindholm
+Lindholm's
+lindisfarne
+Lindquist
+Lindquist's
+Lindsay
+Lindsay's
+Lindsey
+Lindsey's
+Lindstrom
+Lindstrom's
+lindwall
+Lindy
+lindy
+line
+line's
+lineage
+lineages
+lineal
+lineality
+lineally
+lineament
+lineamental
+linear
+linearities
+linearity
+linearizable
+linearization
+linearization's
+linearizations
+linearize
+linearized
+linearizes
+linearizing
+linearizion
+linearly
+lineate
+lineation
+lineations
+linebacker
+linebackers
+linebacking
+linebreed
+linecaster
+linecasting
+lined
+linefeed
+linefeeds
+lineman
+linemen
+linen
+linen's
+linenize
+linenizer
+linenizers
+linenizes
+linens
+linenumber
+lineolate
+lineolated
+lineprinter
+lineprinter's
+lineprinters
+liner
+linerless
+liners
+lines
+linesman
+linestyle
+lineup
+lineups
+linewidth
+linga
+lingam
+lingayen
+lingcod
+linger
+lingered
+lingerer
+lingerie
+lingering
+lingeringly
+lingers
+lingo
+lingoes
+lingonberry
+lingua
+linguae
+lingual
+lingualize
+lingualizes
+lingually
+linguiform
+linguine
+linguini
+linguist
+linguist's
+linguistic
+linguistical
+linguistically
+linguistician
+linguistics
+linguists
+lingulate
+linhay
+liniment
+liniments
+linin
+lining
+linings
+link
+linkage
+linkage's
+linkages
+linkboy
+linked
+linker
+linkers
+linking
+linkings
+linkman
+links
+linksman
+linkup
+linkwork
+linlithgow
+linn
+Linnaean
+linnaeus
+Linnaeus
+linnet
+linnhe
+lino
+linocut
+linoleate
+linoleic
+linolenate
+linolenic
+linoleum
+linos
+Linotype
+Linsang
+linseed
+linstock
+lint
+lintel
+linter
+Linton
+lints
+lintwhite
+linty
+linum
+Linus
+linz
+lion
+lion's
+Lionel
+lioness
+lioness's
+lionesses
+lionfish
+lionhearted
+lionizable
+lionizable's
+lionizables
+lionization
+lionization's
+lionizations
+lionize
+lionized
+lionizer
+lionizers
+lionizes
+lionizing
+lionlike
+lions
+lip
+lip's
+lipari
+lipase
+lipchitz
+Lipetsk
+lipid
+lipid's
+lipide
+lipidic
+lipids
+lipless
+liplike
+lipography
+lipoid
+lipolysis
+lipolytic
+lipoma
+lipophilic
+lipoprotein
+lippe
+lipped
+lippen
+lippi
+lippie
+lippier
+Lippincott
+Lippincott's
+lipping
+Lippizaner
+lippy
+lipread
+lipreading
+lips
+Lipschitz
+Lipscomb
+Lipscomb's
+lipstick
+Lipton
+liquate
+liquated
+liquates
+liquating
+liquation
+liquations
+liquefacient
+liquefaction
+liquefactive
+liquefactive's
+liquefactives
+liquefiability
+liquefiable
+liquefied
+liquefier
+liquefiers
+liquefies
+liquefy
+liquefying
+liquesce
+liquescent
+liqueur
+liquid
+liquid's
+liquidate
+liquidated
+liquidates
+liquidating
+liquidation
+liquidation's
+liquidations
+liquidator
+liquidity
+liquidization
+liquidize
+liquidized
+liquidizer
+liquidizers
+liquidizes
+liquidizing
+liquidly
+liquidness
+liquids
+liquidus
+liquor
+liquor's
+liquored
+liquorice
+liquoring
+liquorish
+liquors
+lira
+liras
+lire
+Liriodendron
+liripipe
+Lisa
+Lisbon
+Lise
+Lise's
+lisieux
+lisle
+lisp
+lisp's
+lisped
+lisper
+lisping
+lisps
+liss
+Liss
+Lissajous
+lissom
+lissome
+lissomely
+lissomeness
+list
+liste
+listed
+listel
+listen
+listenable
+listened
+listener
+listeners
+listening
+listens
+lister
+listeriosis
+Listerism
+Listerize
+Listerizes
+listers
+listing
+listing's
+listings
+listless
+listlessly
+listlessness
+liston
+Liston
+lists
+Liszt
+lit
+litanies
+litany
+liter
+literacy
+literae
+literal
+literalism
+literalist
+literalistic
+literality
+literalization
+literalization's
+literalizations
+literalize
+literalized
+literalizer
+literalizers
+literalizes
+literally
+literalness
+literals
+literarily
+literariness
+literary
+literate
+literately
+literateness
+literati
+literatim
+literation
+literator
+literature
+literature's
+literatures
+literatus
+liters
+litharge
+lithe
+lithely
+litheness
+lithesome
+lithia
+lithiasis
+lithic
+lithically
+lithium
+litho
+lithograph
+lithographer
+lithographers
+lithographic
+lithographically
+lithographize
+lithographizes
+lithographs
+lithography
+lithoid
+lithologic
+lithological
+lithologically
+lithology
+lithomarge
+lithometeor
+lithophane
+lithophyte
+lithophytic
+lithopone
+lithos
+lithosol
+lithosphere
+lithospheric
+lithotomy
+lithotrity
+Lithuania
+lithuanian
+Lithuanian
+litigable
+litigant
+litigants
+litigate
+litigated
+litigates
+litigating
+litigation
+litigator
+litigious
+litigiously
+litigiousness
+litmus
+litotes
+litter
+litterateur
+litterbag
+litterbug
+littered
+litterer
+littering
+littermate
+littermate's
+littermates
+litters
+littery
+little
+littleneck
+littleness
+littler
+littlest
+Littleton
+Litton
+littoral
+littoria
+liturgic
+liturgical
+liturgically
+liturgics
+liturgiologist
+liturgiology
+liturgist
+liturgy
+litz
+liu
+Liv
+livability
+livable
+livableness
+livably
+live
+liveability
+liveable
+lived
+livelier
+liveliest
+livelihood
+livelily
+liveliness
+livelong
+lively
+liven
+livened
+liveness
+livening
+liver
+liveried
+liverish
+liverishness
+Livermore
+Liverpool
+Liverpudlian
+livers
+liverwort
+livery
+liveryman
+lives
+livest
+livestock
+liveth
+livid
+lividity
+lividness
+living
+livingly
+livingness
+livings
+Livingston
+livingstone
+livlihood
+livonia
+livorno
+livraison
+livy
+lix
+lixiviate
+lixiviated
+lixiviates
+lixiviating
+lixiviation
+lixivium
+Liz
+Liz's
+lizard
+lizard's
+lizards
+Lizzie
+lizzy
+Lizzy
+Ljubljana
+llama
+llama's
+llamas
+Llandaff
+Llandudno
+Llanelli
+Llangollen
+llano
+llanos
+Llewellyn
+Lleyn
+Lloyd
+lo
+loach
+loaches
+load
+loadable
+loaded
+loader
+loaders
+loading
+loadings
+loads
+loadstar
+loadstone
+loaf
+loafed
+loafer
+loafers
+loafing
+loafs
+loam
+loamy
+loan
+loanable
+loanda
+loaned
+loaner
+loaning
+loans
+loanword
+loanword's
+loanwords
+loath
+loathe
+loathed
+loather
+loathes
+loathing
+loathly
+loathness
+loathsome
+loathsomely
+loathsomeness
+loaves
+lob
+Lobachevsky
+lobar
+lobate
+lobated
+lobately
+lobation
+lobbied
+lobbies
+lobbing
+lobby
+lobbyer
+lobbying
+lobbyism
+lobbyist
+lobe
+lobe's
+lobectomy
+lobed
+lobelia
+lobeline
+lobengula
+lobes
+lobito
+loblolly
+lobo
+lobola
+lobos
+lobotomy
+lobscouse
+lobster
+lobster's
+lobsterman
+lobstermen
+lobsters
+lobular
+lobularity
+lobularly
+lobulate
+lobulated
+lobulation
+lobule
+lobules
+lobulose
+lobworm
+local
+locale
+locales
+localism
+localisms
+localite
+localities
+locality
+locality's
+localizable
+localizable's
+localizables
+localization
+localization's
+localizations
+localize
+localized
+localizer
+localizers
+localizes
+localizing
+locally
+locals
+Locarno
+locatable
+locate
+located
+locater
+locates
+locating
+location
+locational
+locationally
+locations
+locative
+locatives
+locator
+locator's
+locators
+loch
+lochia
+loci
+lock
+lockable
+lockage
+lockbox
+Locke
+locked
+locker
+lockers
+locket
+Lockhart
+Lockheed
+Lockian
+lockies
+locking
+lockings
+lockjaw
+locknut
+lockout
+lockout's
+lockouts
+locks
+locksmith
+locksmithing
+lockstep
+lockstitch
+lockup
+lockup's
+lockups
+Lockwood
+lockyer
+locl
+loco
+locoes
+locofoco
+locoism
+locoman
+locomote
+locomoted
+locomotes
+locomoting
+locomotion
+locomotive
+locomotive's
+locomotively
+locomotives
+locomotor
+locomotory
+locoweed
+locris
+locular
+loculate
+loculated
+loculation
+locule
+loculed
+loculus
+locum
+locus
+locus's
+locust
+locust's
+locusts
+locution
+locutor
+lod
+lode
+loden
+lodestar
+lodestone
+lodge
+lodged
+lodgement
+lodgepole
+lodger
+lodger's
+lodgers
+lodges
+lodging
+lodgings
+lodgment
+lodi
+lodicule
+Lodowick
+Lodowick's
+Loeb
+Loeb's
+loess
+Loewe
+loewi
+lofoten
+loft
+loft's
+lofter
+loftier
+loftily
+loftiness
+lofts
+lofty
+log
+log's
+Logan
+loganberry
+loganiaceous
+logaoedic
+logarithm
+logarithm's
+logarithmic
+logarithmically
+logarithms
+logbook
+loge
+logged
+logger
+logger's
+loggerhead
+loggers
+loggets
+loggia
+loggie
+logging
+loggy
+logia
+logic
+logic's
+logical
+logicality
+logicalization
+logicalization's
+logicalizations
+logicalize
+logicalizes
+logically
+logicalness
+logicals
+logician
+logician's
+logicians
+logicism
+logicize
+logicized
+logicizes
+logicizing
+logics
+login
+logins
+logion
+logions
+logistic
+logistical
+logistically
+logistician
+logistics
+logjam
+loglog
+lognormal
+lognormality
+lognormally
+logo
+logoff
+logogram
+logogram's
+logogrammatic
+logograms
+logograph
+logographic
+logographically
+logography
+logogriph
+logomachy
+logopaedics
+logorrhea
+logorrhea's
+logorrheas
+logorrheic
+logos
+logotype
+logout
+logroll
+logroller
+logrolling
+logs
+logwood
+logy
+lohengrin
+loin
+loin's
+loincloth
+loins
+Loire
+loiret
+Lois
+loiter
+loitered
+loiterer
+loitering
+loiters
+Loki
+Loki's
+Lola
+loll
+Lolland
+lollapalooza
+Lollard
+loller
+lollies
+lolling
+lollipop
+lollop
+lolly
+lollygag
+lollypop
+lomax
+Lomb
+Lomb's
+Lombard
+Lombardy
+Lombardy's
+lombok
+Lombrosian
+lombroso
+Lome
+loment
+lomond
+London
+Londonderry
+londonderry
+Londoner
+Londonization
+Londonization's
+Londonizations
+Londonize
+Londonizes
+londrina
+lone
+lonelier
+loneliest
+lonelily
+loneliness
+lonely
+loneness
+loner
+loners
+lonesome
+lonesomely
+lonesomeness
+long
+longan
+longanimity
+longanimous
+Longbenton
+longboat
+longboats
+longbow
+longbowman
+longcase
+longcloth
+longe
+longed
+longer
+longeron
+longest
+longevity
+longevous
+Longfellow
+Longford
+longhair
+longhaired
+longhand
+longhead
+longheaded
+longheadedness
+longhorn
+longhorns
+longhouse
+longicorn
+longing
+longingly
+longings
+longinus
+longish
+longitude
+longitude's
+longitudes
+longitudinal
+longitudinally
+longlasting
+longleaf
+longlegs
+longline
+longly
+longness
+Longobard
+longs
+longship
+longshore
+longshoreman
+longshoremen
+longshoring
+longsome
+longsomely
+longsomeness
+longspur
+longstanding
+Longstreet
+longstreet
+longterm
+longtime
+longue
+longueuil
+longueur
+longus
+longways
+longwinded
+longword
+longword's
+longwords
+longyearbyen
+Lonicera
+loo
+loobies
+looby
+loofah
+look
+lookahead
+looked
+looker
+lookers
+lookin
+looking
+lookout
+lookouts
+looks
+lookup
+lookup's
+lookups
+loom
+loomed
+looming
+Loomis
+looms
+loon
+looney
+loonier
+looniness
+loony
+loop
+looped
+looper
+loophole
+loophole's
+loopholed
+loopholes
+loopholing
+looping
+loops
+loopy
+loose
+loosebox
+loosed
+looseleaf
+loosely
+loosen
+loosened
+loosener
+looseness
+loosening
+loosens
+looser
+looses
+loosest
+loosestrife
+loosing
+loot
+looted
+looter
+looting
+loots
+lop
+lope
+loped
+loper
+Lopez
+lophobranch
+lophophore
+loping
+lopped
+lopper
+loppier
+lopping
+loppy
+lops
+lopseed
+lopsided
+lopsidedly
+lopsidedness
+loquacious
+loquaciously
+loquaciousness
+loquacity
+loquat
+lor
+loran
+lorans
+lorca
+lord
+lord's
+lording
+lordlier
+lordliness
+lordling
+lordly
+lordosis
+lordotic
+lords
+lordship
+lordy
+lore
+loreal
+Lorelei
+Loren
+Loren's
+Lorengar
+lorentz
+Lorentzian
+Lorenz
+Lorenz's
+Loretta
+lorgnette
+lorgnettes
+lorgnon
+lorgnons
+Lori
+Lori's
+lorica
+loricate
+loricated
+lorient
+lorikeet
+lorimer
+Lorinda
+Lorinda's
+loris
+lorn
+lornness
+lorrain
+Lorraine
+lorries
+lorris
+lorry
+lory
+los
+losable
+losableness
+lose
+losel
+loser
+losers
+loses
+losey
+losing
+losings
+loss
+loss's
+lossage
+losses
+lossier
+lossiest
+lossless
+lossy
+lost
+lostness
+lot
+lot's
+Lota
+loth
+lothair
+lothario
+Lothario
+lotharios
+lothian
+lothians
+lothringen
+lotic
+lotion
+lotions
+lotos
+lots
+Lotte
+Lotte's
+lotted
+lotteries
+lottery
+Lottie
+lotting
+lotto
+lotus
+Lou
+Lou's
+louche
+loud
+louden
+loudened
+loudening
+louder
+loudest
+loudish
+loudly
+loudmouth
+loudmouthed
+loudness
+loudspeak
+loudspeaker
+loudspeaker's
+loudspeakers
+loudspeaking
+lough
+Loughborough
+Louis
+Louisa
+Louisburg
+Louise
+Louisiana
+Louisianan
+Louisville
+lounge
+lounged
+lounger
+loungers
+lounges
+lounging
+Lounsbury
+Lounsbury's
+loup
+loupe
+louping
+Lourdes
+louse
+loused
+louses
+lousewort
+lousier
+lousily
+lousiness
+lousing
+lousy
+lout
+louth
+loutish
+loutishly
+loutishness
+louts
+louvain
+louvar
+louver
+louvered
+louvers
+Louvre
+lovable
+lovableness
+lovably
+lovage
+lovat
+love
+love's
+loveable
+lovebird
+lovebirds
+loved
+Lovejoy
+lovejoy
+Lovelace
+Loveland
+loveless
+lovelessly
+lovelessness
+lovelier
+lovelies
+loveliest
+lovelily
+loveliness
+lovell
+lovelock
+lovelocks
+lovelorn
+lovelornness
+lovely
+lovemaking
+lover
+lover's
+lovering
+loverly
+lovers
+loves
+lovesick
+lovesickness
+lovesome
+lovey
+loving
+lovingly
+lovingness
+low
+lowan
+lowborn
+lowboy
+lowbred
+lowbrow
+lowdown
+Lowe
+Lowe's
+Lowell
+lower
+lowercase
+lowercased
+lowercases
+lowercasing
+lowerclassman
+lowered
+lowering
+lowermost
+lowers
+lowery
+lowest
+lowestoft
+lowing
+lowland
+lowlander
+lowlands
+lowlier
+lowliest
+lowlight
+lowlight's
+lowlights
+lowlihead
+lowlily
+lowliness
+lowly
+lown
+lowness
+Lowry
+Lowry's
+lows
+lowveld
+lox
+loxes
+loxodrome
+loxodromic
+loxodromically
+loxodromics
+Loy
+loy
+loyal
+loyalist
+loyalists
+loyalize
+loyalizes
+loyally
+loyalties
+loyalty
+loyalty's
+loyang
+loyola
+Loyola
+lozenge
+lozenged
+lozenges
+lozengy
+lozi
+LPG
+LSI
+Ltd
+LTV
+lualaba
+luanda
+luang
+luau
+Luba
+lubber
+lubberland
+lubberlanders
+lubberliness
+lubberly
+lubbers
+Lubbock
+lube
+Lubell
+Lubell's
+lublin
+lubra
+lubric
+lubrical
+lubricant
+lubricant's
+lubricants
+lubricate
+lubricated
+lubricates
+lubricating
+lubrication
+lubrications
+lubricative
+lubricator
+lubricious
+lubriciously
+lubricity
+lubricous
+lubritorium
+lubumbashi
+Lucan
+Lucania
+lucarne
+Lucas
+lucca
+luce
+lucency
+lucent
+lucently
+Lucerne
+Lucia
+Lucian
+lucid
+lucidity
+lucidly
+lucidness
+lucien
+Lucien
+Lucifer
+luciferin
+luciferous
+lucilius
+Lucille
+Lucina
+Lucius
+luck
+lucked
+luckier
+luckiest
+luckily
+luckiness
+luckless
+Lucknow
+lucks
+lucky
+lucrative
+lucratively
+lucrativeness
+lucre
+Lucretia
+Lucretius
+lucubrate
+lucubrated
+lucubrates
+lucubrating
+lucubration
+lucubrations
+lucubrator
+luculent
+luculently
+lucullus
+Lucy
+lud
+Luddite
+Ludendorff
+ludhiana
+ludicrous
+ludicrously
+ludicrousness
+Ludlow
+Ludlow's
+ludmilla
+Ludmilla
+ludo
+Ludwig
+Ludwigsburg
+Ludwigshafen
+lues
+luetic
+luetically
+luff
+Luffa
+luffed
+luffing
+luffs
+Lufthansa
+Luftwaffe
+lug
+Luganda
+Lugansk
+luge
+luger
+luggage
+luggageless
+lugged
+lugger
+lugging
+lugo
+lugs
+lugsail
+lugubrious
+lugubriously
+lugubriousness
+lugworm
+luichow
+luik
+Luis
+Luke
+Luke's
+lukemia
+lukewarm
+lukewarmly
+lukewarmness
+lull
+lullaby
+lulled
+lulls
+lulu
+Luluabourg
+lum
+lumbago
+lumbar
+lumbarization
+lumbarization's
+lumbarizations
+lumber
+lumbered
+lumberer
+lumbering
+lumberjack
+lumberjack's
+lumberjacket
+lumberjacks
+lumberman
+lumbermen
+lumbers
+lumberyard
+lumbian
+lumbricalis
+lumbricoid
+lumen
+lumenal
+lumens
+lumiere
+lumina
+luminaire
+luminal
+luminance
+luminaries
+luminary
+luminesce
+luminesced
+luminescence
+luminescent
+luminescing
+luminiferous
+luminist
+luminosity
+luminous
+luminously
+luminousness
+lumisterol
+lumme
+lummox
+lummus
+lump
+lumped
+lumpen
+lumpenproletariat
+lumper
+lumpier
+lumpily
+lumpiness
+lumping
+lumpish
+lumpishly
+lumpishness
+lumps
+Lumpur
+lumpy
+lumumba
+luna
+Luna
+Luna's
+lunacy
+lunar
+lunarian
+lunary
+lunate
+lunated
+lunately
+lunatic
+lunatics
+lunation
+lunatize
+lunatizes
+lunch
+lunched
+luncheon
+luncheon's
+luncheonette
+luncheons
+luncher
+lunches
+lunching
+lunchroom
+lunchrooms
+lunchtime
+Lund
+Lund's
+Lundberg
+Lundberg's
+Lundquist
+Lundquist's
+lune
+lunes
+lunette
+lung
+lungan
+lunge
+lunged
+lunger
+lungfish
+lungi
+lunging
+lungki
+lungs
+lungworm
+lungwort
+lunik
+lunisolar
+lunitidal
+lunker
+lunkhead
+lunkheaded
+luns
+lunt
+lunula
+lunulate
+lunule
+luny
+Luo
+lupanar
+Lupercalia
+lupin
+lupine
+lupulin
+lupus
+Lur
+Lura
+lurch
+lurched
+lurcher
+lurches
+lurching
+lurdan
+lurdane
+lure
+lured
+lurer
+lures
+lurex
+lurid
+luridly
+luridness
+luring
+lurk
+lurked
+lurker
+lurkers
+lurking
+lurks
+Lusaka
+Lusaka's
+lusatia
+Lusatian
+luscious
+lusciously
+lusciousness
+lush
+lushes
+lushly
+lushness
+lusion
+Lusitania
+lust
+luster
+lustered
+lustering
+lusterless
+lusters
+lusterware
+lustful
+lustfully
+lustfulness
+lustier
+lustihood
+lustily
+lustiness
+lusting
+lustra
+lustral
+lustrate
+lustrated
+lustrates
+lustrating
+lustration
+lustrations
+lustrous
+lustrously
+lustrousness
+lustrum
+lusts
+lusty
+lusus
+lutanist
+lute
+lute's
+luteal
+luted
+luteinization
+luteinize
+lutenist
+luteolin
+luteous
+lutes
+lutestring
+Lutetia
+lutetium
+Luther
+Lutheran
+Lutheranize
+Lutheranizer
+Lutheranizers
+Lutheranizes
+luthern
+luthuli
+lutihaw
+lutine
+luting
+lutist
+Luton
+Lutoslawski
+Lutyens
+Lutz
+lux
+luxate
+luxated
+luxates
+luxating
+luxation
+luxations
+luxe
+Luxembourg
+Luxemburg
+luxes
+Luxon
+luxor
+luxulianite
+luxuriance
+luxuriant
+luxuriantly
+luxuriate
+luxuriated
+luxuriating
+luxuries
+luxurious
+luxuriously
+luxuriousness
+luxury
+luxury's
+Luzon
+Luzon's
+lvi
+lvii
+Lvov
+lxi
+lxii
+lxiv
+lxix
+lxvi
+lxvii
+lyallpur
+lyautey
+lycanthrope
+lycanthropic
+lycanthropy
+lycaon
+lycaonia
+lycee
+lyceum
+lychee
+lychnis
+lycia
+Lycian
+lycidas
+lycopod
+lycopodium
+lycurgus
+lydda
+lyddite
+lydgate
+Lydia
+Lydian
+lye
+lyell
+lying
+lyingly
+lyings
+Lykes
+Lyle
+Lyle's
+lyly
+Lyman
+Lyman's
+Lyme
+Lymington
+lymph
+lymphadenitis
+lymphangial
+lymphangitis
+lymphatic
+lymphatically
+lymphoadenoma
+lymphoblast
+lymphoblastic
+lymphocyte
+lymphocytes
+lymphocytic
+lymphocytosis
+lymphoid
+lymphoma
+lymphomatoid
+lymphomatosis
+lymphomatous
+lymphopoiesis
+lyncean
+lynch
+Lynchburg
+lynched
+lyncher
+lynches
+lynchet
+Lyndon
+lyndon
+Lynn
+lynx
+lynx's
+lynxes
+Lyon
+Lyonnais
+lyonnaise
+Lyonnesse
+lyophile
+lyophilic
+lyophilization
+lyophilize
+lyophilized
+lyophilizer
+lyophobic
+lyotropic
+Lyra
+Lyra's
+lyrate
+lyrated
+lyrately
+lyre
+lyre's
+lyrebird
+lyrebird's
+lyrebirds
+lyres
+lyric
+lyrical
+lyrically
+lyricalness
+lyricism
+lyricist
+lyricists
+lyricize
+lyricized
+lyricizes
+lyricizing
+lyrics
+lyrism
+lyrist
+Lysander
+lysate
+lyse
+Lysenko
+Lysenko's
+Lysenkoism
+lysergic
+lyses
+lysias
+Lysimachus
+lysimeter
+lysimeter's
+lysimeters
+lysimetric
+lysin
+lysine
+lysing
+lysippus
+lysis
+lysogen
+lysogenic
+lysogenicity
+lysogenization
+lysogenize
+lysogeny
+lysol
+lysolecithin
+lysosomal
+lysosomally
+lysosome
+lysozyme
+lyssa
+Lytham
+Lythraceous
+lytic
+lytically
+lytta
+lytton
+Lyublin
+m's
+Ma
+ma
+ma'am
+Maag
+Maar
+Maarianhamina
+Maas
+Maastricht
+Maazel
+Mab
+Mabel
+Mabel's
+mabela
+mabuse
+Mac
+macabre
+macabrely
+macaco
+macadam
+Macadamia
+macadamization
+macadamize
+macadamized
+macadamizes
+macadamizing
+Macao
+macaque
+macarize
+macarized
+macarizes
+macarizing
+macaroni
+macaroni's
+macaronic
+macaronically
+macaronies
+macaroon
+MacArthur
+Macarthur
+Macaskill
+Macassar
+Macau
+Macaulay
+Macaulayan
+Macaulayism
+Macaulayisms
+macaw
+macaw's
+macaws
+Macbeth
+Maccabean
+Maccabees
+maccaroni
+Macclesfield
+Macdonald
+MacDonald
+Macdonnell
+MacDougall
+Macdougall
+MacDougall's
+Macdougall's
+MacDraw
+MacDraw's
+mace
+macebearer
+maced
+macedoine
+Macedon
+Macedonia
+Macedonian
+macer
+macerate
+macerated
+macerates
+macerating
+maceration
+macerations
+macerator
+macerators
+maces
+Macgregor
+MacGregor
+Mach
+machado
+machan
+machel
+machete
+Machiavelli
+Machiavellian
+machicolate
+machicolation
+machin
+machinability
+machinable
+machinate
+machinated
+machinates
+machinating
+machination
+machination's
+machinations
+machinator
+machine
+machine's
+machineable
+machined
+machinelike
+machineries
+machinery
+machines
+machining
+machinist
+machinists
+machinization
+machinization's
+machinizations
+machinize
+machinizes
+machismo
+machmeter
+macho
+machree
+machu
+macing
+macintosh
+MacIntosh
+MacIntosh's
+mack
+Mackay
+MacKenzie
+Mackenzie
+mackerel
+mackerels
+Mackerras
+MacKerras
+Mackey
+Mackey's
+Mackinac
+mackinaw
+mackintosh
+mackle
+mackled
+mackles
+macklin
+mackling
+macle
+Maclean
+macled
+Macleod
+MacMahon
+Macmahon
+MacMahon's
+MacMillan
+Macmillan
+Macneice
+Macon
+MacPaint
+MacPaint's
+Macpherson
+macrame
+Macready
+macro
+macro's
+macroaggregate
+macroaggregated
+macrobiotic
+macrobiotics
+macrocephalic
+macrocephalous
+macrocephaly
+macroclimate
+macrocosm
+macrocosmic
+macrocosmically
+macrocyte
+macrocytic
+macrocytosis
+macrodynamic
+macroeconomic
+macroeconomics
+macroencephaly
+macroevolution
+macroevolutionary
+macrofossil
+macrogamete
+macrograph
+macroinstruction
+macromolecular
+macromolecule
+macromolecule's
+macromolecules
+macron
+macronucleus
+macronutrient
+macropathological
+macropathology
+macrophage
+macrophages
+macrophagic
+macrophysics
+macrophyte
+macrophytic
+macroprocessor
+macropterous
+macros
+macroscale
+macroscopic
+macroscopical
+macroscopically
+macrosimulation
+macrosocioeconomic
+macrosporangium
+macrospore
+macrostructural
+macrostructure
+macrostructure's
+macrosystem
+macruran
+macula
+maculate
+maculated
+maculates
+maculating
+maculation
+maculations
+macule
+macumba
+mad
+madafu
+Madagascar
+madam
+Madame
+Madames
+madams
+madcap
+Maddalena
+madded
+madden
+maddened
+maddening
+maddeningly
+madder
+maddest
+madding
+maddish
+Maddox
+made
+Madeira
+Madeleine
+Madeleine's
+Madeline
+Madeline's
+mademoiselle
+mademoiselles
+madhouse
+Madhya
+madhya
+madina
+Madison
+madly
+madman
+madmen
+madness
+Madonna
+Madonnas
+madras
+madre
+madrepore
+Madrid
+madrigal
+madrigalian
+madrigaling
+madrigalist
+madrigals
+madrilene
+madrona
+madrone
+Madsen
+Madsen's
+madstone
+madstones
+madura
+madurai
+maduro
+madwoman
+madwomen
+madwort
+Mae
+Mae's
+maebashi
+Maecenas
+Maelstrom
+maelstrom
+maelstrom's
+maelstroms
+maenad
+maenadic
+maestoso
+maestricht
+maestro
+maeterlinck
+maewo
+mafeking
+maffick
+mafia
+Mafia
+Mafia's
+Mafiosi
+mafioso
+mag
+MAG
+magallanes
+magazine
+magazine's
+magazined
+magazines
+magazining
+magazinism
+magazinist
+magazinists
+Magdalen
+magdalena
+Magdalene
+Magdalenian
+Magdeburg
+mage
+Magellan
+Magellanic
+magen
+magenta
+Maggie
+maggiore
+maggot
+maggot's
+maggotries
+maggotry
+maggots
+maggoty
+Maghreb
+magi
+magic
+magical
+magicalize
+magicalizes
+magically
+magician
+magician's
+magicians
+magicked
+magicking
+Magill
+magill
+magilp
+maginot
+magisterial
+magisterially
+magisterium
+magistery
+magistracy
+magistral
+magistrally
+magistrate
+magistrate's
+magistrates
+magistrateship
+magistratical
+magistratically
+magistrature
+Maglemosian
+magma
+magmatic
+magna
+magnanimity
+magnanimous
+magnanimously
+magnanimousness
+magnate
+magnates
+magnesia
+magnesian
+magnesite
+magnesium
+magnesiums
+magnet
+magnet's
+magnetic
+magnetically
+magnetics
+magnetism
+magnetism's
+magnetisms
+magnetite
+magnetitic
+magnetizabilities
+magnetizability
+magnetizability's
+magnetizable
+magnetizable's
+magnetizables
+magnetization
+magnetization's
+magnetizations
+magnetize
+magnetized
+magnetizer
+magnetizers
+magnetizes
+magnetizing
+magneto
+magnetochemistry
+magnetodynamo
+magnetoelectric
+magnetoelectrical
+magnetoelectricity
+magnetofluidmechanic
+magnetofluidmechanics
+magnetogasdynamic
+magnetogasdynamics
+magnetogram
+magnetogram's
+magnetograms
+magnetograph
+magnetohydrodynamic
+magnetohydrodynamics
+magnetometer
+magnetometer's
+magnetometers
+magnetometric
+magnetometry
+magnetomotive
+magneton
+magnetooptic
+magnetooptical
+magnetooptics
+magnetopause
+magnetos
+magnetoscope
+magnetosheath
+magnetosphere
+magnetospheric
+magnetostatic
+magnetostriction
+magnetostrictive
+magnetostrictively
+magnetron
+magnetrons
+magnets
+magnific
+magnifical
+magnifically
+Magnificat
+magnification
+magnifications
+magnificats
+magnificence
+magnificent
+magnificently
+magnifico
+magnified
+magnifier
+magnifiers
+magnifies
+magnify
+magnifying
+magniloquence
+magniloquent
+magniloquently
+magnitude
+magnitude's
+magnitudes
+magnolia
+magnoliaceous
+magnolias
+magnum
+magnums
+magnus
+Magnuson
+Magnuson's
+Magog
+Magog's
+magot
+magpie
+magpies
+magritte
+Magruder
+magtape
+magtapes
+maguey
+Maguire
+maguire
+Maguires
+maguires
+magus
+Magyar
+mahabharata
+mahalla
+mahanadi
+maharaja
+maharaja's
+maharajah
+maharanee
+maharani
+maharashtra
+Maharashtra
+maharishi
+mahatma
+mahatmaism
+Mahayana
+Mahayanist
+Mahdi
+mahewu
+Mahican
+mahjong
+Mahler
+mahler
+Mahler's
+mahlstick
+mahoganize
+mahoganized
+mahoganizes
+mahoganizing
+mahogany
+Mahomet
+mahometan
+Mahoney
+Mahoney's
+Mahonia
+Mahound
+mahout
+mahratta
+mahseer
+Maia
+maid
+maid's
+maidan
+maiden
+maidenhair
+maidenhead
+maidenhood
+maidenliness
+maidenly
+maidens
+maidhood
+maidish
+maids
+maidservant
+maidstone
+maiduguri
+maier
+maieutic
+maieutical
+maieutics
+maigre
+maihem
+maikop
+mail
+mailability
+mailable
+mailbag
+mailbags
+mailboat
+mailboats
+mailbox
+mailbox's
+mailboxes
+mailcoach
+mailed
+mailer
+mailer's
+mailers
+mailing
+mailings
+maillol
+maillot
+mailman
+mailmen
+mailplane
+mailplanes
+mails
+mailsack
+mailsacks
+maim
+maimed
+maimedness
+maimer
+maimers
+maiming
+maimonides
+maims
+main
+mainbrace
+Maine
+mainframe
+mainframe's
+mainframes
+mainland
+mainlander
+mainlanders
+mainline
+mainlined
+mainliner
+mainliners
+mainlines
+mainlining
+mainly
+mainmast
+mains
+mainsail
+mainsheet
+mainspring
+mainstay
+mainstream
+maintain
+maintainability
+maintainable
+maintained
+maintainer
+maintainer's
+maintainers
+maintaining
+maintains
+maintenance
+maintenance's
+maintenances
+maintenence
+Maintenon
+maintop
+maintopsail
+mainz
+maiolica
+maisonette
+maisonettes
+Maitland
+maitre
+maitres
+maize
+maizer
+maizers
+maizes
+majestic
+majestical
+majestically
+majesties
+majesty
+majesty's
+Majlis
+majolica
+major
+Majorca
+Majorca's
+majordomo
+majordomos
+majored
+majorette
+majorettes
+majoring
+majorities
+majority
+majority's
+majorize
+majorizes
+majors
+majunga
+majuscular
+majuscule
+makable
+makalu
+makarios
+make
+makeable
+makebate
+makefast
+makefile
+makefiles
+makepeace
+maker
+makers
+makes
+makeshift
+makeshifts
+makeshifty
+makeup
+makeups
+makeweight
+makeyevka
+makhachkala
+making
+makings
+makkah
+mako
+makos
+makurdi
+makuta
+mal
+Malabar
+Malabar's
+malabo
+Malacca
+malachi
+malachite
+malacologic
+malacological
+malacologist
+malacology
+malacophyllous
+malacopterygian
+malacostracan
+maladapt
+maladaptation
+maladapted
+maladaptive
+maladdress
+maladies
+maladjust
+maladjusted
+maladjustive
+maladjustment
+maladjustments
+maladminister
+maladministration
+maladroit
+maladroitly
+malady
+malady's
+Malagasy
+Malagasy's
+malaise
+malam
+Malamud
+malamud
+malamute
+malang
+malapert
+malapertly
+malapertness
+malapportioned
+malapportionment
+malappropriate
+malappropriated
+malappropriates
+malappropriating
+malaprop
+malapropian
+malapropism
+malapropos
+malar
+malaria
+malarial
+malarian
+malariated
+malariologist
+malariology
+malarious
+malarkey
+malassimilation
+malate
+malatesta
+malathion
+malatya
+Malawi
+Malawi's
+malaxate
+malaxated
+malaxates
+malaxating
+Malay
+Malaya
+Malayize
+Malayizes
+Malaysia
+Malaysian
+Malcolm
+malconduct
+malconformation
+malcontent
+malcontent's
+malcontented
+malcontentedly
+malcontentedness
+malcontents
+Malden
+Malden's
+maldevelopment
+maldistribute
+maldistribution
+Maldive
+Maldive's
+Maldives
+maldon
+male
+male's
+maleable
+malebranche
+maledict
+malediction
+maledictory
+malefaction
+malefactor
+malefactor's
+malefactors
+malefic
+maleficence
+maleficent
+maleic
+malemute
+maleness
+malentendu
+males
+malevich
+malevolence
+malevolencies
+malevolent
+malevolently
+malfeasance
+malfeasant
+malformation
+malformations
+malformed
+malfunction
+malfunctioned
+malfunctioning
+malfunctions
+malgovernment
+malherbe
+Mali
+Mali's
+Malibu
+Malibu's
+malic
+malice
+malicious
+maliciously
+maliciousness
+maliferous
+malign
+malignance
+malignancies
+malignancy
+malignant
+malignantly
+maligned
+malignity
+malignly
+malihini
+malimprinted
+malines
+malinger
+malingered
+malingerer
+malingering
+malinke
+Malinowski
+malism
+Malison
+malkin
+mall
+mall's
+mallam
+mallard
+mallards
+malleability
+malleable
+malleableness
+malleablize
+malleablizes
+mallee
+mallemuck
+mallenders
+malleolus
+mallet
+mallet's
+mallets
+malleus
+mallorca
+Mallory
+mallow
+malls
+malm
+malmsey
+malnourished
+malnutrition
+malocclusion
+malodor
+malodorous
+malodorously
+malodorousness
+malolactic
+Malone
+Maloney
+Maloney's
+malonic
+malonylurea
+malory
+malpighi
+malpighiaceous
+Malpighian
+malposed
+malposition
+malpractice
+malpractitioner
+Malraux
+malt
+Malta
+maltase
+malted
+Maltese
+maltha
+malthus
+Malthus
+Malthusian
+malting
+maltman
+maltobionic
+Malton
+Malton's
+maltose
+maltreat
+maltreatment
+malts
+maltster
+malty
+maluku
+malvaceous
+malvasia
+malvasian
+malvern
+malversation
+malvoisie
+malwa
+Mam
+mama
+mamaguy
+mamba
+mambo
+mambos
+mamelon
+Mameluke
+mamilla
+mamillate
+mamma
+mamma's
+mammal
+mammal's
+mammalian
+mammalogist
+mammalogy
+mammals
+mammary
+mammas
+mammee
+mammer
+mammet
+mammies
+mammiferous
+mammilla
+mammillar
+mammillary
+mammillate
+mammillated
+mammock
+mammography
+mammon
+mammonism
+mammonist
+mammonite
+mammoth
+mammy
+mampara
+man
+man's
+mana
+manacle
+manacled
+manacles
+manacling
+manado
+manage
+manageability
+manageable
+manageableness
+manageably
+managed
+management
+management's
+managemental
+managements
+manager
+manager's
+manageress
+managerial
+managerialism
+managerially
+managers
+managership
+manages
+managing
+Managua
+manakin
+manassas
+manasseh
+manatee
+manaus
+manche
+Manchester
+manchet
+manchineel
+Manchu
+manchukuo
+manchuria
+Manchuria
+mancipation
+mancipatory
+manciple
+manciples
+Mancunian
+Mandaean
+mandala
+Mandalay
+mandamus
+mandamused
+mandamuses
+mandamusing
+mandarin
+mandarinate
+mandarinates
+mandarinic
+mandarinism
+mandarinize
+mandarinizes
+mandarins
+mandataries
+mandatary
+mandate
+mandated
+mandates
+mandating
+mandator
+mandatorial
+mandatories
+mandatorily
+mandatory
+Mande
+Mandelbrot
+Mandelbrot's
+Mandeville
+mandi
+mandible
+mandibular
+mandibulate
+Mandingo
+mandir
+mandola
+mandolin
+mandolin's
+mandolinist
+mandolinists
+mandolins
+mandorla
+mandragora
+mandrake
+mandrakes
+mandrel
+mandril
+mandrill
+manducate
+manducated
+manducates
+manducating
+mane
+mane's
+maned
+manege
+manes
+manet
+maneuver
+maneuverability
+maneuverable
+maneuvered
+maneuverer
+maneuvering
+maneuvers
+Manfred
+manful
+manfully
+manfulness
+mangabey
+mangalore
+manganate
+manganese
+manganesian
+manganic
+manganin
+manganite
+manganous
+mange
+mangel
+mangelwurzel
+manger
+manger's
+mangers
+mangier
+mangily
+manginess
+mangle
+mangled
+mangler
+mangles
+mangling
+mango
+mango's
+mangonel
+mangos
+mangosteen
+mangrove
+mangy
+manhandle
+manhandled
+manhandles
+manhandling
+Manhattan
+Manhattan's
+Manhattanize
+Manhattanizes
+manhole
+manholes
+manhood
+manhunt
+manhunts
+mani
+mania
+maniac
+maniac's
+maniacal
+maniacally
+maniacs
+manic
+manically
+Manichaeism
+manichaeus
+manicotti
+manicure
+manicured
+manicures
+manicuring
+manicurist
+manicurists
+manifest
+manifestant
+manifestation
+manifestation's
+manifestations
+manifested
+manifesting
+manifestly
+manifestness
+manifesto
+manifesto's
+manifestoed
+manifestoes
+manifestoing
+manifestos
+manifests
+manifold
+manifold's
+manifolder
+manifoldly
+manifoldness
+manifolds
+manikin
+manikins
+Manila
+Manila's
+manilla
+manille
+maninke
+manioc
+maniple
+manipulability
+manipulable
+manipular
+manipulatable
+manipulate
+manipulated
+manipulates
+manipulating
+manipulation
+manipulations
+manipulative
+manipulativeness
+manipulator
+manipulator's
+manipulators
+manipulatory
+manipur
+manisa
+Manitoba
+manitoulin
+manitowoc
+Manitowoc
+manizales
+mankind
+Mankowski
+mankowski
+manky
+manless
+Manley
+Manley's
+manlier
+manliest
+manlike
+manliness
+manly
+Mann
+Mann's
+manna
+mannar
+manned
+mannequin
+mannequins
+manner
+mannered
+Mannerheim
+mannerism
+mannerisms
+mannerist
+manneristic
+mannerize
+mannerizes
+mannerless
+mannerliness
+mannerly
+manners
+Mannheim
+mannikin
+manning
+mannish
+mannishly
+mannishness
+mannitic
+mannitol
+mannopyranosyl
+mannosyl
+manolete
+manometer
+manometer's
+manometers
+manometric
+manometrical
+manometrically
+manometry
+manor
+manor's
+manorial
+manorialism
+manors
+manpower
+manque
+manresa
+manrope
+manropes
+mans
+mansard
+mansarded
+mansart
+manse
+manservant
+Mansfield
+manship
+mansholt
+mansion
+mansion's
+mansions
+manslaughter
+manslayer
+mansuete
+mansuetude
+manteau
+mantegna
+mantel
+mantel's
+mantelet
+mantelletta
+mantelpiece
+mantels
+mantelshelf
+manteltree
+mantic
+mantilla
+mantinea
+mantis
+mantises
+mantissa
+mantissa's
+mantissas
+mantle
+mantle's
+mantled
+mantlepiece
+Mantler
+mantles
+mantling
+mantoux
+mantova
+mantra
+mantrap
+mantua
+manual
+manual's
+manually
+manuals
+manubrium
+manuduction
+manuductory
+Manuel
+Manuel's
+manufactory
+manufacturable
+manufacture
+manufactured
+manufacturer
+manufacturer's
+manufacturers
+manufactures
+manufacturing
+Manuguerra
+manuka
+manukau
+manumission
+manumit
+manumitted
+manumitting
+manure
+manured
+manurer
+manurers
+manures
+manurial
+manuring
+manus
+manuscript
+manuscript's
+manuscriptal
+manuscripts
+manutius
+Manville
+manward
+manwards
+manwise
+Manx
+Manxman
+many
+manyfold
+manyplies
+manzanilla
+manzanita
+manzoni
+Mao
+maoism
+Maori
+map
+map's
+maple
+maple's
+maplecrest
+Maplecrest
+maples
+mapmaker
+mapmakers
+mapmaking
+mappable
+mapped
+mapper
+mappery
+mapping
+mapping's
+mappings
+mappist
+mappists
+maps
+maputo
+maquette
+maquillage
+maquis
+Mar
+mar
+mara
+marabou
+Marabout
+marabunta
+maraca
+Maracaibo
+maracanda
+maracay
+maraging
+marasca
+maraschino
+marasmic
+marasmus
+marat
+Maratha
+Marathi
+marathon
+marathons
+maraud
+marauder
+marauders
+marauding
+marauds
+maravedi
+marble
+marbled
+marbleize
+marbleized
+marbleizes
+marbleizing
+marbler
+marbles
+marbling
+marbly
+Marburg
+Marc
+Marc's
+marcasite
+Marceau
+Marceau's
+Marcel
+marcelled
+marcelling
+Marcello
+Marcello's
+marcellus
+marcescent
+march
+marche
+marched
+marcher
+marches
+marchesa
+marchese
+marching
+marchioness
+Marchland
+marchpane
+Marcia
+Marcia's
+Marciano
+Marcie
+Marcie's
+Marcionism
+Marco
+Marco's
+Marconi
+marconigram
+marconigram's
+marconigrams
+marcos
+marcotte
+Marcotte
+Marcus
+marcuse
+Marcy
+Mardi
+Mardis
+marduk
+mardy
+mare
+mare's
+maremma
+Marengo
+Marenzio
+mares
+marg
+Margaret
+Margaret's
+margaric
+margarine
+margarita
+margarite
+margate
+Margaux
+Margay
+Marge
+Margery
+Margery's
+margin
+margin's
+marginal
+marginalia
+marginality
+marginalization
+marginalize
+marginalized
+marginalizes
+marginalizing
+marginally
+marginals
+marginate
+marginated
+marginates
+marginating
+margination
+marginations
+margined
+margining
+margins
+Margo
+Margo's
+margravate
+margrave
+margravine
+margrethe
+Marguerite
+maria
+Maria's
+mariachi
+Marian
+Marian's
+Mariana
+marianao
+Marianne
+Marianne's
+maribor
+mariculture
+Marie
+Marie's
+Mariehamn
+Marienbad
+Marietta
+marigold
+marigold's
+marigolds
+marijuana
+marijuana's
+Marilyn
+marimba
+Marin
+marina
+marinade
+marinades
+marinas
+marinate
+marinated
+marinates
+marinating
+Marinduque
+marine
+mariner
+marines
+Marinetti
+Marino
+Mario
+Mariolatry
+Mariology
+Marion
+marionette
+marionettes
+mariposa
+marish
+Marissa
+Marissa's
+Marist
+maritage
+maritain
+marital
+maritally
+maritime
+maritimer
+maritsa
+Mariupol
+Marius
+Marivaux
+marjoram
+Marjorie
+Marjory
+Marjory's
+mark
+Mark's
+markable
+markdown
+marked
+markedly
+marker
+markers
+market
+marketability
+marketable
+marketed
+marketeer
+marketeer's
+marketeering
+marketeers
+marketer
+marketing
+marketings
+marketplace
+marketplace's
+marketplaces
+markets
+marketwise
+Markevitch
+Markham
+Markham's
+Markhor
+marking
+markings
+Markism
+Markism's
+Markka
+Markov
+Markova
+Markovian
+Markovitz
+markovitz
+marks
+marksman
+marksmanship
+marksmen
+markswoman
+markswomen
+markup
+markups
+marl
+Marlborough
+Marlene
+Marley
+marlin
+marline
+marlite
+Marlow
+Marlowe
+marmalade
+marmalades
+marmara
+marmite
+marmolada
+marmoreal
+marmoreally
+marmorean
+marmoset
+marmoset's
+marmosets
+marmot
+maroc
+marocain
+Maronite
+maroon
+marooned
+maroquin
+maros
+marplot
+marprelate
+marquand
+marque
+marquee
+marquees
+Marquesan
+marquesas
+marquess
+marquessate
+marquesses
+marquet
+Marquette
+marquis
+marquisate
+marquise
+marquises
+marquisette
+Marrakech
+Marrakesh
+marram
+marrano
+marred
+marriage
+marriage's
+marriageability
+marriageable
+marriages
+married
+marries
+Marriner
+marring
+Marriott
+marron
+marrow
+marrowbone
+marrowbones
+marrowfat
+marrowless
+marrows
+marrowy
+marry
+marryat
+marrying
+mars
+Marsala
+marse
+Marseillaise
+Marseille
+Marseilles
+marsh
+marsh's
+Marsha
+marshal
+marshalcy
+marshaled
+marshaler
+marshalers
+marshaling
+Marshall
+Marshalled
+Marshalling
+marshals
+Marshalsea
+marshalship
+marshes
+marshier
+marshiness
+marshland
+marshlands
+marshmallow
+marshmallows
+marshmallowy
+marshy
+marsilius
+marsipobranch
+Marston
+marsupial
+marsupial's
+marsupialization
+marsupialization's
+marsupializations
+marsupialize
+marsupializes
+marsupials
+marsupium
+mart
+martaban
+martagon
+martel
+martellato
+martello
+marten
+martens
+martensite
+martensitic
+martensitically
+Martha
+martial
+martialization
+martialization's
+martializations
+martialize
+martializes
+martially
+Martian
+Martians
+Martin
+martin
+martineau
+martinet
+Martinez
+martingale
+martini
+Martinique
+martinis
+Martinmas
+Martinon
+Martinson
+martlet
+Marton
+marts
+Marty
+martyr
+martyr's
+martyrdom
+martyrization
+martyrization's
+martyrizations
+martyrize
+martyrized
+martyrizer
+martyrizers
+martyrizes
+martyrizing
+martyrologies
+martyrologist
+martyrologists
+martyrology
+martyrs
+martyry
+marvel
+marveled
+marveler
+marveling
+marvell
+marvelous
+marvelously
+marvelousness
+marvels
+Marvin
+Marx
+Marxian
+Marxism
+Marxisms
+Marxist
+marxists
+Mary
+Mary's
+Maryland
+Maryland's
+Marylanders
+marzipam
+marzipan
+masaccio
+Masai
+masan
+masaryk
+masbate
+Mascagni
+mascara
+mascaras
+mascarene
+mascle
+mascon
+mascot
+mascot's
+mascots
+masculine
+masculinely
+masculineness
+masculinity
+masculinization
+masculinization's
+masculinizations
+masculinize
+masculinized
+masculinizes
+masculinizing
+Masefield
+maser
+Maserati
+Maserati's
+Maseratis
+mash
+masharbrum
+mashed
+masher
+mashers
+mashes
+mashhad
+mashie
+mashing
+mashings
+masinissa
+masjid
+mask
+maskable
+maskanonge
+masked
+masker
+masking
+maskings
+masks
+masochism
+masochist
+masochist's
+masochistic
+masochistically
+masochists
+mason
+mason's
+masoned
+Masonic
+masoning
+Masonite
+masonry
+masons
+masqat
+masque
+masquer
+masquerade
+masquerader
+masquerades
+masquerading
+masquers
+masques
+mass
+massa
+massachuset
+Massachusetts
+massacre
+massacred
+massacrer
+massacres
+massacring
+massage
+massaged
+massager
+massages
+massaging
+massasauga
+massasoit
+Massawa
+massbus
+massed
+Massenet
+masses
+masseter
+masseteric
+masseur
+masseurs
+masseuse
+Massey
+Massey's
+massicot
+massif
+massifs
+massine
+massing
+massinger
+massinissa
+massive
+massively
+massiveness
+massless
+massorete
+massotherapy
+massy
+mast
+mastaba
+mastectomies
+mastectomy
+masted
+master
+master's
+mastered
+masterful
+masterfully
+masterfulness
+mastering
+masterings
+masterliness
+masterly
+mastermind
+masterminded
+masterminding
+masterminds
+masterpiece
+masterpiece's
+masterpieces
+masters
+mastership
+mastersinger
+mastersingers
+masterstroke
+masterstrokes
+masterwork
+mastery
+masthead
+mastic
+masticate
+masticated
+masticates
+masticating
+mastication
+mastications
+masticator
+masticators
+masticatory
+mastiff
+mastigophoran
+mastitic
+mastitis
+mastodon
+mastodonic
+mastodons
+mastodont
+mastoid
+mastoidectomy
+mastoideus
+mastoiditis
+masts
+masturbate
+masturbated
+masturbates
+masturbating
+masturbation
+masturbational
+masturbatory
+masuria
+masurium
+mat
+mat's
+Matabele
+Matabeleland
+matadi
+matador
+matamoros
+matanzas
+matapan
+match
+matchable
+matchboard
+matchboarding
+matchbook
+matchbox
+matched
+matcher
+matchers
+matches
+matching
+matchings
+matchless
+matchlessly
+matchlock
+matchmake
+matchmaker
+matchmaker's
+matchmakers
+matchmaking
+matchmaking's
+matchmark
+matchstick
+matchwood
+mate
+mate's
+mated
+matelote
+Mateo
+Mateo's
+mater
+materfamilias
+material
+materialism
+materialism's
+materialist
+materialistic
+materialistically
+materiality
+materialization
+materialization's
+materializations
+materialize
+materialized
+materializer
+materializers
+materializes
+materializing
+materially
+materialness
+materials
+materiel
+maternal
+maternalize
+maternalizes
+maternally
+maternity
+mates
+matey
+math
+mathematic
+mathematical
+mathematically
+mathematician
+mathematician's
+mathematicians
+mathematicize
+mathematicizes
+mathematics
+mathematization
+Mathews
+Mathewson
+Mathias
+Mathieu
+Mathis
+maths
+mathura
+Matilda
+matinal
+matinee
+mating
+matings
+matins
+Matisse
+Matisses
+matlo
+matlock
+mato
+matoke
+matopo
+Matorin
+matozinhos
+matrass
+matriarch
+matriarchal
+matriarchate
+matriarchy
+matric
+matrices
+matricidal
+matricide
+matriclinous
+matriculant
+matriculate
+matriculated
+matriculates
+matriculating
+matriculation
+matrilineal
+matrilineally
+matrilocal
+matrimonial
+matrimonially
+matrimony
+matrix
+matrixes
+matroclinous
+matroid
+matron
+matronage
+matronize
+matronized
+matronizes
+matronizing
+matronly
+matronymic
+mats
+Matson
+Matson's
+matsu
+Matsumoto
+Matsumoto's
+matsuyama
+matt
+Matt
+Matt's
+mattamore
+matte
+matted
+mattei
+matter
+mattered
+matterhorn
+mattering
+matters
+mattery
+Matthew
+Matthews
+matthias
+Mattie
+mattie
+Mattila
+matting
+mattins
+mattock
+mattoid
+mattrass
+mattress
+mattress's
+mattresses
+Mattson
+Mattson's
+maturate
+maturated
+maturates
+maturating
+maturation
+maturational
+maturations
+maturative
+mature
+matured
+maturely
+matureness
+maturer
+matures
+maturing
+maturities
+maturity
+matutinal
+matutinally
+matzo
+matzoon
+matzos
+maubeuge
+mauby
+Mauceri
+Maud
+maude
+Maude
+maudlin
+maudlinism
+maudlinisms
+maudlinize
+maudlinizes
+maudlinly
+Maugham
+maugre
+maui
+maul
+maulana
+mauler
+maulers
+mauling
+maulmain
+mauls
+maulstick
+maumet
+mauna
+maund
+maunder
+maundy
+maungy
+maupassant
+maupertuis
+Maureen
+mauretania
+mauriac
+Maurice
+mauricio
+Mauricio
+Maurine
+Maurine's
+Maurist
+Mauritania
+Mauritius
+maurois
+maury
+maurya
+Mauser
+mausoleum
+mausoleums
+mauve
+maverick
+mavericks
+Mavis
+Mavourneen
+maw
+mawger
+mawkin
+mawkish
+mawkishly
+mawkishness
+Mawr
+mawsie
+Mawson
+max
+maxi
+maxilla
+maxillae
+maxillary
+maxillas
+maxilliped
+maxillipede
+maxim
+Maxim
+maxim's
+maxima
+maximal
+maximalist
+maximally
+Maximilian
+maximin
+maximization
+maximization's
+maximizations
+maximize
+maximized
+maximizer
+maximizers
+maximizes
+maximizing
+maxims
+maximum
+maximumly
+maximums
+maximus
+Maxine
+maxint
+maxisingle
+maxixe
+Maxtor
+Maxtor's
+maxwell
+Maxwellian
+May
+may
+Maya
+Mayakovski
+Mayan
+Mayans
+mayapple
+maybe
+mayday
+Mayen
+mayence
+Mayer
+mayer
+Mayer's
+mayest
+Mayfair
+mayflower
+Mayflower
+mayfly
+mayhap
+mayhem
+maying
+Maynard
+Mayo
+Mayo's
+mayon
+mayonnaise
+mayor
+mayor's
+mayoral
+mayoralty
+mayoress
+mayors
+mayorship
+Mayotte
+maypole
+mays
+mayst
+mazard
+mazarin
+Mazda
+Mazdaism
+maze
+maze's
+mazed
+mazedly
+mazedness
+mazednesses
+mazer
+mazes
+mazing
+mazuma
+mazurka
+mazurka's
+mazurkas
+mazy
+mazzard
+mazzini
+MBA
+Mbujimayi
+McAdams
+Mcadams
+McAllister
+Mcallister
+Mcallister's
+McAllister's
+McBride
+Mcbride
+McBride's
+Mcbride's
+Mccabe
+McCabe
+Mccabe's
+McCabe's
+Mccall
+McCall
+McCall's
+Mccall's
+McCallum
+Mccallum
+Mccallum's
+McCallum's
+Mccann
+McCann
+Mccann's
+McCann's
+Mccarthy
+McCarthy
+McCarthy's
+Mccarthy's
+Mccarthyism
+Mccartney
+McCarty
+Mccarty
+McCarty's
+Mccarty's
+McCauley
+Mccauley
+McCauley's
+Mccauley's
+Mcclain
+McClain
+Mcclain's
+McClain's
+McClellan
+Mcclellan
+McClellan's
+Mcclellan's
+Mcclure
+McClure
+Mcclure's
+McClure's
+McCluskey
+Mccluskey
+Mccluskey's
+McCluskey's
+McConnel
+Mcconnel
+Mcconnel's
+McConnel's
+McConnell
+Mcconnell
+McConnell's
+Mcconnell's
+Mccormack
+McCormick
+Mccormick
+Mccormick's
+McCormick's
+McCoy
+Mccoy
+Mccoy's
+McCoy's
+McCracken
+Mccracken
+McCracken's
+Mccracken's
+Mccullers
+McCullough
+Mccullough
+Mccullough's
+McCullough's
+Mcdaniel
+McDaniel
+McDaniel's
+Mcdaniel's
+McDermott
+Mcdermott
+McDermott's
+Mcdermott's
+Mcdiarmid
+McDonald
+Mcdonald
+Mcdonald's
+McDonald's
+McDonnell
+Mcdonnell
+McDonnell's
+Mcdonnell's
+Mcdougall
+McDougall
+Mcdougall's
+McDougall's
+McDowell
+Mcdowell
+McDowell's
+Mcdowell's
+McElhaney
+McElhaney's
+McElroy
+Mcelroy
+McElroy's
+Mcelroy's
+Mcfadden
+McFadden
+Mcfadden's
+McFadden's
+Mcfarland
+McFarland
+McFarland's
+Mcfarland's
+McGee
+Mcgee
+Mcgee's
+McGee's
+McGill
+Mcgill
+McGill's
+Mcgill's
+McGillicuddy
+McGillicuddy's
+Mcginnis
+McGinnis
+McGinty
+McGinty's
+Mcgonagall
+Mcgovern
+McGovern
+Mcgovern's
+McGovern's
+Mcgowan
+McGowan
+Mcgowan's
+McGowan's
+Mcgrath
+McGrath
+McGrath's
+Mcgrath's
+McGraw
+Mcgraw
+McGraw's
+Mcgraw's
+Mcgregor
+McGregor
+Mcgregor's
+McGregor's
+McGuire
+Mcguire
+Mcguire's
+McGuire's
+Mchugh
+McHugh
+McHugh's
+Mchugh's
+McIntosh
+Mcintosh
+Mcintosh's
+McIntosh's
+Mcintyre
+McIntyre
+McIntyre's
+Mcintyre's
+McKay
+Mckay
+Mckay's
+McKay's
+Mckee
+McKee
+Mckee's
+McKee's
+Mckenna
+McKenna
+Mckenna's
+McKenna's
+McKenzie
+Mckenzie
+Mckenzie's
+McKenzie's
+Mckeon
+McKeon
+McKeon's
+Mckeon's
+McKesson
+Mckesson
+Mckesson's
+McKesson's
+McKinley
+Mckinley
+Mckinley's
+McKinley's
+McKinney
+Mckinney
+McKinney's
+Mckinney's
+Mcknight
+McKnight
+Mcknight's
+McKnight's
+McLanahan
+Mclaughlin
+McLaughlin
+McLaughlin's
+Mclaughlin's
+Mclean
+McLean
+Mclean's
+McLean's
+Mcleod
+McLeod
+Mcleod's
+McLeod's
+Mcluhan
+Mclure
+Mcmahon
+McMahon
+McMahon's
+Mcmahon's
+McMartin
+McMartin's
+McMillan
+Mcmillan
+Mcmillan's
+McMillan's
+Mcmullen
+McMullen
+McMullen's
+Mcmullen's
+Mcmunn
+Mcmurdo
+McNair
+McNally
+Mcnally
+Mcnally's
+McNally's
+Mcnaughten
+McNaughton
+Mcnaughton
+Mcnaughton's
+McNaughton's
+Mcneil
+McNeil
+Mcneil's
+McNeil's
+McNulty
+Mcnulty
+McNulty's
+Mcnulty's
+Mcpherson
+McPherson
+Mcpherson's
+McPherson's
+Mcqueen
+MD
+MDs
+MDT
+me
+mea
+mead
+Meade
+meadow
+meadow's
+meadowland
+meadowlark
+meadowlark's
+meadowlarks
+meadows
+meadowsweet
+meads
+meager
+meagerly
+meagerness
+meagre
+meal
+meal's
+mealie
+mealier
+mealies
+meals
+mealtime
+mealworm
+mealy
+mealymouth
+mealymouthed
+mealymouthedly
+mealymouthedness
+mealymouthednesses
+mean
+meander
+meandered
+meandering
+meanderings
+meanders
+meandrous
+meaner
+meanest
+meaning
+meaning's
+meaningful
+meaningfully
+meaningfulness
+meaningless
+meaninglessly
+meaninglessness
+meanings
+meanly
+meanness
+means
+meant
+meantime
+meanwhile
+meany
+measle
+measled
+measles
+measlier
+measly
+measurability
+measurable
+measurably
+measure
+measured
+measuredly
+measureless
+measurement
+measurement's
+measurements
+measurer
+measures
+measuring
+meat
+meat's
+meatball
+meatballs
+meath
+meatier
+meatiest
+meatiness
+meatman
+meatmen
+meats
+meatus
+meaty
+mecamylamine
+mecca
+Meccano
+mech
+mechanic
+mechanic's
+mechanical
+mechanicalization
+mechanicalization's
+mechanicalizations
+mechanicalize
+mechanicalizes
+mechanically
+mechanicals
+mechanician
+mechanics
+mechanism
+mechanism's
+mechanisms
+mechanist
+mechanistic
+mechanistically
+mechanizable
+mechanization
+mechanization's
+mechanizations
+mechanize
+mechanized
+mechanizer
+mechanizers
+mechanizes
+mechanizing
+mechanochemically
+mechanoreceptor
+mechanotherapy
+mechelen
+Mechem
+Mechlin
+mecholyl
+meck
+Mecklenburg
+meconium
+mecum
+med
+medal
+medal's
+medaled
+medaling
+medalist
+medalists
+medalize
+medalizes
+medallic
+medallion
+medallion's
+medallions
+medals
+medan
+medawar
+meddle
+meddled
+meddler
+meddles
+meddlesome
+meddlesomeness
+meddling
+Mede
+Medea
+Medfield
+Medford
+Medford's
+media
+mediacy
+mediad
+mediae
+medial
+medialization
+medialization's
+medializations
+medialize
+medializes
+medially
+median
+median's
+medianly
+medians
+mediant
+medias
+mediastinum
+mediate
+mediated
+mediately
+mediateness
+mediates
+mediating
+mediation
+mediational
+mediations
+mediative
+mediatization
+mediatization's
+mediatizations
+mediatize
+mediatized
+mediatizes
+mediatizing
+mediator
+mediatorial
+mediators
+mediatorship
+mediatory
+mediatress
+mediatresses
+mediatrice
+mediatrix
+medic
+medic's
+medicable
+medicably
+Medicaid
+medicaid
+medical
+medically
+medicament
+medicamented
+medicamenting
+medicamentous
+medicaments
+medicare
+Medicare
+medicate
+medicated
+medicates
+medicating
+medication
+medications
+medicative
+Medici
+medicinable
+medicinal
+medicinally
+medicine
+medicine's
+medicines
+Medicis
+medico
+medicolegal
+medicos
+medics
+medieval
+medieval's
+medievalise
+medievalises
+medievalism
+medievalism's
+medievalisms
+medievalist
+medievalist's
+medievalistic
+medievalistics
+medievalists
+medievalize
+medievalizes
+medievally
+medievals
+Medina
+mediocre
+mediocrities
+mediocrity
+meditate
+meditated
+meditates
+meditating
+meditation
+meditations
+meditative
+meditatively
+meditativeness
+meditator
+Mediterranean
+Mediterraneanization
+Mediterraneanization's
+Mediterraneanizations
+Mediterraneanize
+Mediterraneanizes
+medium
+medium's
+mediumistic
+mediumization
+mediumization's
+mediumizations
+mediumize
+mediumizes
+mediums
+mediumship
+medlar
+medlars
+medley
+medleys
+medulla
+medullary
+medullated
+Medusa
+Medusa's
+medusae
+Medusan
+medusoid
+medway
+mee
+meed
+meek
+meeker
+meekest
+meekly
+meekness
+meerkat
+meerschaum
+meerut
+meet
+meeter
+meeting
+meetinghouse
+meetings
+meetly
+meets
+Meg
+Meg's
+mega
+megabit
+megabits
+megabuck
+megabyte
+megabytes
+megacephaly
+megacycle
+megadeath
+Megaera
+megaflop
+megaflops
+megagamete
+megagametophyte
+megahertz
+megakaryocyte
+megakaryocytic
+megalith
+megalithic
+megaloblast
+megaloblastic
+megalocardia
+megalocephaly
+megalomania
+megalomaniac
+megalomaniacal
+megalomaniacally
+megalomanic
+megalopolis
+megalopolises
+megalopolistic
+megalopolitan
+megalopolitanism
+megalopteran
+megalopterous
+megalosaur
+megaparsec
+megaphone
+megaphonic
+megapode
+megapolis
+megapolitan
+megara
+megarians
+megaron
+megascopic
+megascopically
+megasporangium
+megaspore
+megasporic
+megasporogenesis
+megasporophyll
+megathere
+megaton
+megatons
+megavolt
+megawatt
+megaword
+megawords
+megger
+meghalaya
+megiddo
+megillah
+megilp
+megohm
+megohms
+megrim
+megrims
+mehemet
+Mehta
+Meier
+Meier's
+Meiji
+meilhac
+meiny
+meiosis
+meiotic
+meiotically
+meir
+Meissen
+Meister
+meister
+Meistersinger
+meitner
+mekka
+Mekong
+Mel
+Melaleuca
+melamine
+Melampus
+melancholia
+melancholiac
+melancholic
+melancholically
+melancholy
+melanchthon
+Melanesia
+Melanesian
+melange
+melanic
+Melanie
+melanin
+melanism
+melanist
+melanistic
+melanite
+melanitic
+melanization
+melanize
+melanized
+melanizes
+melanizing
+melanoblast
+melanoblastic
+melanoblastoma
+Melanochroi
+melanochroic
+melanocyte
+melanogenesis
+melanoid
+melanoma
+melanophore
+melanosis
+melanotic
+melanous
+melaphyre
+melatonin
+melba
+Melbourne
+Melcher
+Melcher's
+melchior
+Melchite
+Melchizedek
+meld
+melding
+melds
+Meleager
+melee
+meliaceous
+melic
+melies
+melilla
+melilot
+Melinda
+melinite
+meliorate
+meliorated
+meliorates
+meliorating
+melioration
+meliorations
+meliorative
+meliorator
+meliorism
+meliorist
+melioristic
+Melisande
+melisma
+Melissa
+Melitopol
+mell
+melliferous
+mellifluent
+mellifluently
+mellifluous
+mellifluously
+mellifluousness
+mellitin
+Mellon
+mellophone
+mellow
+mellowed
+mellowing
+mellowly
+mellowness
+mellows
+melodeon
+melodic
+melodically
+melodies
+melodious
+melodiously
+melodiousness
+melodist
+melodization
+melodize
+melodized
+melodizer
+melodizes
+melodizing
+melodrama
+melodrama's
+melodramas
+melodramatic
+melodramatically
+melodramatics
+melodramatist
+melodramatization
+melodramatize
+melodramatized
+melodramatizes
+melodramatizing
+melody
+melody's
+meloid
+melon
+melon's
+melons
+melos
+Melpomene
+Melpomene's
+melt
+meltability
+meltable
+meltage
+meltdown
+meltdown's
+melted
+melter
+melting
+meltingly
+Melton
+melts
+meltwater
+meltwaters
+Melungeon
+Melville
+Melvin
+mem
+member
+member's
+membered
+members
+membership
+membership's
+memberships
+membranal
+membrane
+membrane's
+membraned
+membraneless
+membranes
+membranous
+membranously
+meme
+memel
+memento
+mementoes
+mementos
+memling
+Memnon
+memo
+memo's
+memoir
+memoire
+memoirs
+memorabilia
+memorability
+memorable
+memorableness
+memorably
+memoranda
+memorandum
+memorandums
+memorex
+memorial
+memorialist
+memorialization
+memorialization's
+memorializations
+memorialize
+memorialized
+memorializer
+memorializers
+memorializes
+memorializing
+memorially
+memorials
+memoriam
+memories
+memoriter
+memorizable
+memorizable's
+memorizables
+memorization
+memorization's
+memorizations
+memorize
+memorized
+memorizer
+memorizers
+memorizes
+memorizing
+memory
+memory's
+memoryless
+memos
+Memphian
+Memphis
+memphremagog
+memsahib
+men
+men's
+menace
+menaced
+menaces
+menacing
+menacingly
+menadione
+menado
+menagerie
+menageries
+menai
+menam
+menander
+menaquinone
+menarche
+menarcheal
+menarches
+mencius
+Mencken
+mencken
+menckenese
+mend
+mendable
+mendacious
+mendaciously
+mendaciousness
+mendacity
+mended
+Mendel
+Mendel's
+mendelevium
+Mendeleyev
+Mendelian
+Mendelism
+Mendelize
+Mendelizes
+Mendelssohn
+mender
+menderes
+mendicancies
+mendicancy
+mendicant
+mendicants
+mendicities
+mendicity
+mending
+mendips
+Mendoza
+mendoza
+mends
+Menelaus
+Menelik
+menes
+menfolk
+menfolks
+Mengelberg
+mengistu
+menhaden
+menhir
+menial
+menially
+menials
+meningeal
+meninges
+meningitic
+meningitis
+meningocele
+meningococcal
+meningococcic
+meninx
+menisci
+meniscus
+meniscuses
+menispermaceous
+Menlo
+Mennonite
+Mennonites
+meno
+menology
+Menominee
+menominee
+menomini
+menon
+menopausal
+menopause
+menorah
+Menorca
+menorrhagia
+menorrhagic
+menotti
+mens
+mensa
+mensal
+mensch
+Mensch
+mense
+mensed
+menseful
+menseless
+menservants
+menses
+Menshevik
+mensing
+menstrual
+menstruate
+menstruated
+menstruates
+menstruating
+menstruation
+menstruations
+menstruous
+menstruum
+mensurability
+mensurable
+mensurableness
+mensural
+mensuration
+mensurational
+mensurations
+menswear
+mental
+mentalism
+mentalist
+mentalities
+mentality
+mentalization
+mentalization's
+mentalizations
+mentalize
+mentalizes
+mentally
+mentation
+mentations
+menthol
+mentholated
+mention
+mentionable
+mentioned
+mentioner
+mentioners
+mentioning
+mentions
+Menton
+mentor
+mentor's
+mentors
+mentorship
+mentum
+menu
+menu's
+menuhin
+menus
+Menzies
+meow
+meow's
+meowed
+meowing
+meows
+mepacrine
+meperidine
+Mephistopheles
+mephitic
+mephitis
+meprobamate
+mer
+merano
+merbromin
+merca
+mercantile
+mercantilism
+mercantilist
+mercantilistic
+mercaptan
+mercaptide
+mercaptopurine
+Mercator
+Mercedes
+mercenaries
+mercenarily
+mercenariness
+mercenary
+mercenary's
+mercer
+mercerization
+mercerization's
+mercerizations
+mercerize
+mercerized
+mercerizer
+mercerizers
+mercerizes
+mercerizing
+mercers
+mercery
+merchandise
+merchandised
+merchandiser
+merchandises
+merchandising
+merchant
+merchant's
+merchantability
+merchantable
+merchantman
+merchantmen
+merchants
+merchet
+mercia
+Mercian
+mercians
+mercies
+merciful
+mercifully
+mercifulness
+merciless
+mercilessly
+mercilessness
+Merck
+Merck's
+Mercouri
+mercurate
+mercurated
+mercurates
+mercurating
+mercuration
+mercurations
+mercurial
+mercurialization
+mercurialization's
+mercurializations
+mercurialize
+mercurializes
+mercurially
+mercurialness
+Mercurian
+mercuric
+mercuries
+Mercurochrome
+mercurous
+mercury
+mercy
+mere
+Meredith
+merely
+merengue
+merest
+meretricious
+meretriciously
+meretriciousness
+merganser
+merge
+merged
+mergence
+mergences
+merger
+mergers
+merges
+merging
+mergui
+meridian
+meridians
+meridional
+meridionally
+meringue
+meringues
+merino
+Merionethshire
+meristem
+meristic
+meristically
+merit
+merited
+meriting
+meritocracy
+meritocratic
+meritorious
+meritoriously
+meritoriousness
+merits
+Meriwether
+meriwether
+merkin
+Merle
+merlin
+merlon
+mermaid
+mermaid's
+mermaids
+merman
+merman's
+mermen
+meroblastic
+meroblastically
+merocrine
+meromorphic
+meromyosin
+meroplankton
+Merovingian
+merozoite
+Merriam
+Merrick
+merrick
+merrier
+merriest
+Merrill
+merrily
+merrimac
+Merrimac
+Merrimack
+merriment
+merriments
+merriness
+Merritt
+Merritt's
+merry
+merrymake
+merrymaker
+merrymaking
+merryman
+merrythought
+merse
+Merseburg
+Mersey
+Merseyside
+mersin
+merthyr
+Merton
+Mervin
+Mervin's
+mesa
+mesarch
+mescal
+mescaline
+mesdames
+mesdemoiselles
+meseems
+Mesembryanthemum
+mesencephalon
+mesenchyme
+mesenteric
+mesenteritis
+mesenteron
+mesentery
+mesh
+meshach
+meshed
+meshes
+meshing
+meshuga
+meshwork
+meshy
+mesial
+mesially
+mesic
+mesically
+mesitylene
+mesmeric
+mesmerically
+mesmerism
+mesmerisms
+mesmerist
+mesmerists
+mesmerizabilities
+mesmerizability
+mesmerizability's
+mesmerizable
+mesmerizable's
+mesmerizables
+mesmerization
+mesmerization's
+mesmerizations
+mesmerize
+mesmerized
+mesmerizer
+mesmerizers
+mesmerizes
+mesmerizing
+mesnalty
+mesne
+mesobenthos
+mesoblast
+mesoblastic
+mesocarp
+mesocephalic
+mesocratic
+mesoderm
+mesodermal
+mesodermic
+mesogastrium
+mesoglea
+mesognathous
+mesolithic
+mesolonghi
+mesomeric
+mesomerism
+mesomorph
+mesomorphic
+mesomorphism
+mesomorphy
+meson
+mesonephric
+mesonephros
+mesonic
+mesopause
+mesopelagic
+mesophase
+mesophases
+mesophyll
+mesophyte
+Mesopotamia
+mesosome
+mesosphere
+mesospheric
+mesothelioma
+mesothelium
+mesothoracic
+mesothorax
+mesothorium
+mesotron
+mesotronic
+mesotrophic
+Mesozoic
+Mesple
+mesquite
+mess
+message
+message's
+messaged
+messages
+messaging
+messalina
+messaline
+Messapian
+messed
+messene
+messenger
+messenger's
+messengers
+messenia
+messes
+messiaen
+messiah
+messiahs
+messiahship
+messianic
+messianism
+messier
+messiest
+messieurs
+messily
+messina
+messiness
+messing
+messmate
+messmates
+Messrs
+messuage
+messuages
+messy
+mestee
+mester
+mestizo
+mestranol
+met
+meta
+metabole
+metabolic
+metabolically
+metabolism
+metabolisms
+metabolite
+metabolites
+metabolizable
+metabolizable's
+metabolizables
+metabolize
+metabolized
+metabolizes
+metabolizing
+metacarpal
+metacarpus
+metacenter
+metacentres
+metacentric
+metacharacter
+metacharacters
+metachromatic
+metachromatism
+metacinnabarite
+metacircular
+metacircularity
+metaethical
+metaethics
+metafemale
+metagalactic
+metagalaxies
+metagalaxy
+metagenesis
+metagenetic
+metagenetically
+metagnathous
+metagram
+metagram's
+metagrams
+metal
+metal's
+metalanguage
+metalanguages
+metaled
+metalicities
+metalicity
+metalicity's
+metaling
+metalization
+metalization's
+metalizations
+metalize
+metalized
+metalizes
+metalizing
+metallic
+metallically
+metallicize
+metallicizes
+metalliferous
+metallike
+metalline
+metallist
+metallists
+metallocene
+metallographer
+metallographic
+metallographically
+metallographist
+metallography
+metalloid
+metalloidal
+metallophone
+metallurgic
+metallurgical
+metallurgically
+metallurgist
+metallurgists
+metallurgy
+metals
+metalsmith
+metalsmithes
+metalware
+metalwork
+metalworker
+metalworking
+metalworkings
+metamale
+metamathematical
+metamathematician
+metamathematics
+metamer
+metamere
+metameric
+metamerically
+metamerism
+metamerization
+metamerization's
+metamerizations
+metamerized
+metamerized's
+metamerizeds
+metamorphic
+metamorphically
+metamorphism
+metamorphose
+metamorphosed
+metamorphosis
+metanephric
+metanephros
+metanotion
+metanotions
+metaperiodate
+metaph
+metaphase
+metaphonize
+metaphonizes
+metaphor
+metaphor's
+metaphoric
+metaphorical
+metaphorically
+metaphorize
+metaphorizes
+metaphors
+metaphosphate
+metaphosphoric
+metaphrase
+metaphrast
+metaphysic
+metaphysical
+metaphysically
+metaphysician
+metaphysicize
+metaphysicizes
+metaphysics
+metaplasia
+metaplasm
+metaplasmic
+metaplastic
+metapolitics
+metaproduction
+metaproductions
+metaprotein
+metapsychological
+metapsychology
+metasomatic
+metasomatically
+metasomatism
+metastability
+metastable
+metastably
+metastasis
+metastasize
+metastasized
+metastasizes
+metastasizing
+metastatic
+metastatically
+metasymbol
+metasymbols
+metasyntax
+metasyntaxes
+metatarsal
+metatarsally
+metatarsus
+metate
+metatheory
+metatherian
+metathesis
+metathetic
+metathetical
+metathetically
+metathoracic
+metathorax
+metavariable
+metaxylem
+metazoa
+metazoal
+metazoan
+Metcalf
+Metcalf's
+metchnikoff
+mete
+meted
+metempirical
+metempirics
+metempsychosis
+metencephalic
+metencephalon
+meteor
+meteor's
+meteoric
+meteorically
+meteorite
+meteorites
+meteoritic
+meteoritical
+meteoritics
+meteorization
+meteorization's
+meteorizations
+meteorize
+meteorizes
+meteorograph
+meteorographic
+meteoroid
+meteoroid's
+meteoroidal
+meteoroids
+meteorol
+meteorologic
+meteorological
+meteorologicaly
+meteorologist
+meteorology
+meteors
+meter
+meter's
+metered
+metering
+meters
+metes
+metestrus
+methacrylate
+methacrylic
+methadon
+methadone
+methaemoglobin
+methamphetamine
+methane
+methanol
+methanolic
+metheglin
+methenamine
+methinks
+methionine
+metho
+method
+method's
+methodic
+methodical
+methodically
+methodicalness
+methodism
+methodist
+methodist's
+methodistic
+methodists
+methodius
+methodization
+methodization's
+methodizations
+methodize
+methodized
+methodizer
+methodizers
+methodizes
+methodizing
+methodological
+methodologically
+methodologies
+methodologist
+methodologists
+methodology
+methodology's
+methods
+methotrexate
+methought
+methoxide
+meths
+Methuen
+Methuen's
+Methuselah
+Methuselahs
+methyl
+methylal
+methylamine
+methylase
+methylate
+methylated
+methylation
+methylator
+methylcholanthrene
+methylcyclohexane
+methyldopa
+methylene
+methylic
+methylnaphthalene
+methylphenidate
+methylphthalate
+methylthionine
+metic
+meticulosity
+meticulous
+meticulously
+meticulousness
+metier
+meting
+metis
+metoestrus
+Metol
+metonic
+metonym
+metonymic
+metonymical
+metonymically
+metonymy
+metope
+metopic
+metopon
+metrazol
+Metrecal
+metric
+metric's
+metrical
+metrically
+metricate
+metrication
+metricize
+metricized
+metricizes
+metricizing
+metrics
+metrify
+metrist
+metritis
+metro
+metrological
+metrologically
+metrologist
+metrology
+metronidazole
+metronome
+metronomes
+metronomic
+metronomical
+metronomically
+metronymic
+metropolis
+metropolitan
+metropolitanization
+metropolitanize
+metropolitanizes
+metrorrhagia
+metros
+mets
+Metternich
+mettle
+mettled
+mettles
+mettlesome
+metz
+Metzler
+Metzler's
+meu
+meung
+meuse
+mew
+mewed
+mewl
+mews
+Mexicali
+Mexican
+Mexicanize
+Mexicanizes
+Mexicans
+Mexico
+Meyer
+Meyerbeer
+Meyerhof
+Meyers
+mezcal
+mezcaline
+mezereon
+mezereum
+mezuza
+mezuzah
+mezzanine
+mezzanines
+mezzo
+mezzos
+mezzotint
+MFD
+mho
+MHz
+Miami
+miaou
+miasma
+miasmal
+miasmatic
+miasmic
+miaul
+mica
+micaceous
+Micah
+micawber
+mice
+micellar
+micelle
+micelle's
+micelles
+Michael
+Michael's
+Michaelangelo
+Michaelmas
+Michaels
+Michaelson
+Michel
+Michel's
+Michelangelo
+Michele
+Michele's
+Michelin
+Michelle
+Michelle's
+michelozzo
+Michelson
+Michigan
+Michigan's
+Mick
+mick
+Mickelson
+mickery
+Mickey
+Mickey's
+Mickie
+mickiewicz
+mickle
+Micky
+Micmac
+micra
+micro
+microamp
+microampere
+microamperes
+microanalysis
+microanalyst
+microanalytic
+microanalytical
+microanatomical
+microanatomy
+microbalance
+microbalances
+microbarograph
+microbarographs
+microbe
+microbe's
+microbeless
+microbes
+microbial
+microbic
+microbicidal
+microbicide
+microbiologic
+microbiological
+microbiologically
+microbiologist
+microbiology
+microbodies
+microbody
+microbrailler
+microbus
+microcalorimetric
+microcephalic
+microcephaly
+microchemistry
+microchip
+microchips
+microcircuit
+microcircuitry
+microcircuits
+microcirculation
+microcirculatory
+microclimate
+microclimates
+microclimatic
+microclimatological
+microclimatologist
+microclimatology
+microcline
+microclines
+micrococcal
+micrococcus
+microcode
+microcoded
+microcodes
+microcoding
+microcomputer
+microcomputer's
+microcomputers
+microconcrete
+microconsumer
+microcontroller
+microcopier
+microcopy
+microcosm
+microcosmic
+microcosmically
+microcrack
+microcracked
+microcracking
+microcracks
+microcrystal
+microcrystalline
+microcrystallinity
+microcyte
+microcytic
+microdensitometer
+microdensitometer's
+microdensitometers
+microdensitometric
+microdensitometry
+microdetector
+microdissection
+microdomain
+microdomains
+microdont
+microdot
+microeconomic
+microeconomics
+microelectrode
+microelectronic
+microelectronically
+microelectronics
+microelectrophoresis
+microelectrophoretic
+microelectrophoretical
+microelectrophoretically
+microelement
+microencapsulate
+microencapsulation
+microenvironment
+microenvironmental
+microevolution
+microevolutionary
+microfabric
+microfarad
+microfarads
+microfauna
+microfaunal
+microfibril
+microfibrillar
+microfiche
+microfiches
+microfilaria
+microfilarial
+microfilm
+microfilm's
+microfilmed
+microfilmer
+microfilms
+microfine
+microflash
+microflora
+microfloral
+microform
+microfossil
+microfossils
+microfungal
+microfungus
+microgamete
+microgametocyte
+microgel
+microgram
+microgram's
+micrograms
+micrograph
+micrographer
+micrographers
+micrographs
+micrography
+microgroove
+microhabitat
+microhardness
+microinch
+microinjection
+microinstruction
+microinstruction's
+microinstructions
+microjoule
+microkink
+microkinking
+microlevel
+microliter
+microliter's
+microliters
+microlith
+microlithic
+micromania
+micromanipulation
+micromanipulator
+micromere
+micrometeorite
+micrometeorites
+micrometeoritic
+micrometeoroid
+micrometeorological
+micrometeorologist
+micrometeorology
+micrometer
+micrometer's
+micrometers
+micromethod
+micrometric
+micrometry
+micromicrofarad
+micromicrofarads
+micromicron
+micromillimeter
+micromillimeter's
+micromillimeters
+microminiature
+microminiaturization
+microminiaturize
+microminiaturized
+microminiaturizer
+microminiaturizers
+microminiaturizes
+microminiaturizing
+micromixing
+micron
+Micronesia
+Micronesian
+micronization
+micronization's
+micronizations
+micronize
+micronizes
+microns
+micronuclear
+micronucleate
+micronucleus
+micronutrient
+micronutrients
+microorganic
+microorganism
+microorganisms
+micropalaeontology
+micropaleontologic
+micropaleontological
+micropaleontologist
+micropaleontology
+microparasite
+microparasites
+microparasitic
+microphage
+microphone
+microphones
+microphonic
+microphonics
+microphoning
+microphotograph
+microphotographer
+microphotographic
+microphotography
+microphotometer
+microphotometer's
+microphotometers
+microphotometric
+microphotometrically
+microphotometry
+microphyll
+microphyllous
+microphysical
+microphysically
+microphysics
+microphyte
+micropipet
+micropipette
+microplankton
+micropolarization
+micropolarization's
+micropolarizations
+micropore
+microporosity
+microporous
+Microport
+Microport's
+microprint
+microprobe
+microprocessing
+microprocessor
+microprocessor's
+microprocessors
+microprogram
+microprogram's
+microprogrammable
+microprogrammed
+microprogramming
+microprograms
+microprojection
+microprojector
+micropulsation
+micropump
+micropylar
+micropyle
+micropyrometer
+microradiograph
+microradiographic
+microradiography
+microreader
+microrelief
+microreproduction
+micros
+microscale
+microscope
+microscope's
+microscopes
+microscopic
+microscopical
+microscopically
+microscopist
+Microscopium
+microscopize
+microscopizes
+microscopy
+microsecond
+microsecond's
+microseconds
+microsection
+microseism
+microseismic
+microseismicity
+microsimulation
+microsimulations
+Microsoft
+Microsoft's
+microsomal
+microsome
+microsomes
+microspectrophotometer
+microspectrophotometer's
+microspectrophotometers
+microspectrophotometric
+microspectrophotometrical
+microspectrophotometrically
+microspectrophotometry
+microsphere
+microspheric
+microsporangium
+microspore
+microsporic
+microsporophyll
+microstate
+microstomatous
+microstore
+microstructural
+microstructurally
+microstructure
+microstructures
+microsurgery
+microsurgical
+microswitch
+microswitches
+microsystem
+microsystems
+microtechnic
+microtechnique
+microtherm
+microtome
+microtomes
+microtomy
+microtonal
+microtonality
+microtonally
+microtone
+microtones
+microtubular
+microtubule
+microtubules
+microvolt
+microvolts
+microwatt
+microwatts
+microwave
+microwave's
+microwaves
+microword
+microwords
+microwriter
+microwriters
+micrurgy
+micturate
+micturated
+micturates
+micturating
+micturition
+micturitions
+mid
+midafternoon
+midair
+midas
+midband
+midbrain
+midcapacity
+midcourse
+midday
+Middelburg
+midden
+middens
+middies
+middle
+middlebreaker
+middlebrow
+middlebrowism
+middlebrows
+Middlebury
+middled
+middleman
+middlemen
+middlemost
+middler
+middles
+Middlesbrough
+Middlesex
+Middleton
+Middletown
+middleweight
+middleweights
+Middlewood
+middling
+middlingly
+middlings
+middorsal
+middy
+mideast
+midfield
+midfielder
+midge
+midges
+midget
+midgut
+midheaven
+midi
+midian
+midinette
+midiron
+midland
+midlander
+Midlandize
+Midlandizes
+midlands
+midlife
+midline
+midlothian
+midmorn
+midmorning
+midmost
+midnight
+midnightly
+midnights
+midplane
+midpoint
+midpoint's
+midpoints
+midportion
+midrange
+midrash
+midrashic
+midrashim
+midrib
+midribbed
+midriff
+midriffs
+midscale
+midsection
+midsemester
+midship
+midshipman
+midshipmen
+midships
+midsole
+midspan
+midst
+midstream
+midsts
+midsummer
+midsummery
+midterm
+midterm's
+midterms
+midtown
+midwatch
+midwatches
+Midway
+midway
+midways
+midweek
+midweekly
+Midwest
+Midwestern
+Midwesterner
+Midwesterners
+midwife
+midwifed
+midwifery
+midwifing
+midwing
+midwinter
+midwinterly
+midwintry
+midwived
+midwives
+midwiving
+midyear
+mien
+miens
+mieres
+mies
+miff
+miffed
+miffing
+miffs
+miffy
+MIG
+mig
+might
+mightier
+mightiest
+mightily
+mightiness
+mightless
+mights
+mighty
+mignon
+mignonette
+migraine
+migraines
+migrainous
+migrancy
+migrant
+migrant's
+migrants
+migrate
+migrated
+migrates
+migratetic
+migratetics
+migrating
+migration
+migrational
+migrationist
+migrationists
+migrations
+migrative
+migrator
+migratorial
+migratories
+migratory
+MIGs
+migs
+Miguel
+mihrab
+mikado
+mike
+mikhail
+Mikhail
+Mikoyan
+mikoyan
+mil
+mila
+milacre
+milady
+milage
+Milan
+milanese
+Milashkina
+milazzo
+milch
+mild
+milden
+milder
+mildest
+mildew
+mildewcide
+mildewproof
+mildews
+mildewy
+mildhearted
+mildish
+mildly
+mildness
+Mildred
+mile
+mile's
+mileage
+mileages
+mileometer
+milepost
+miler
+miles
+milesian
+milestone
+milestone's
+milestones
+miletus
+milfoil
+milfoils
+Milford
+Milhaud
+milia
+miliaria
+miliarial
+miliarias
+miliary
+milieu
+milieus
+milieux
+milinch
+militance
+militances
+militancies
+militancy
+militant
+militantly
+militantness
+militants
+militaries
+militarily
+militarism
+militarisms
+militarist
+militaristic
+militaristically
+militarization
+militarizations
+militarize
+militarized
+militarizes
+militarizing
+military
+militaryism
+militaryisms
+militate
+militated
+militates
+militating
+militia
+militiaman
+militiamen
+militias
+milium
+milk
+milked
+milker
+milkers
+milkfish
+milkhouse
+milkier
+milkily
+milkiness
+milking
+milkless
+milklike
+milkmaid
+milkmaid's
+milkmaids
+milkman
+milkmen
+milks
+milksop
+milksopping
+milksoppy
+milkstone
+milkweed
+milkwort
+milky
+mill
+millable
+millage
+millais
+Millard
+millboard
+millcourse
+milldam
+milled
+millefleurs
+millenarian
+millenarianism
+millenaries
+millenary
+millenia
+millennia
+millennial
+millennialism
+millennium
+millepede
+millepore
+miller
+millerite
+millers
+millesimal
+millesimally
+millet
+millhouse
+milli
+milliammeter
+milliammeter's
+milliammeters
+milliamp
+milliampere
+milliamperes
+milliard
+milliary
+millibar
+millibarn
+millicron
+millicurie
+millicycle
+millidarcy
+millidegree
+millidegrees
+Millie
+millieme
+milliemes
+milliequivalent
+millifarad
+milligal
+milligan
+milligram
+milligram's
+milligrams
+millihenry
+millihertz
+millihg
+millijoule
+millijoules
+Millikan
+millilambert
+milliliter
+milliliter's
+milliliters
+millilux
+millime
+millimeter
+millimeter's
+millimeters
+millimetric
+millimicrofarad
+millimicrofarads
+millimicron
+millimicrosecond
+millimolar
+millimolarity
+millimole
+milline
+milliner
+milliners
+millinery
+milling
+Millington
+million
+millionaire
+millionaire's
+millionairedom
+millionaires
+millionairess
+millionary
+millioned
+millionfold
+millionize
+millionizes
+millions
+millionth
+millipede
+millipede's
+millipedes
+milliphot
+millipoise
+millirad
+milliroentgen
+millisecond
+milliseconds
+millivolt
+millivoltmeter
+millivoltmeter's
+millivoltmeters
+millivolts
+milliwatt
+milliwatts
+millman
+millmen
+millowner
+millpond
+millponds
+millrace
+millraces
+millrun
+mills
+millsite
+millstone
+millstone's
+millstones
+millstream
+millstreams
+millwheel
+millwheels
+millwork
+millwright
+millwrights
+Milne
+milne
+Milnes
+milo
+milometer
+milometers
+milord
+milquetoast
+Milquetoast
+Milquetoasts
+milquetoasts
+milreis
+Milstein
+milt
+milter
+miltiades
+Milton
+Miltonian
+Miltonic
+Miltonism
+Miltonist
+Miltonize
+Miltonized
+Miltonizes
+Miltonizing
+Milwaukee
+mim
+mimas
+MIMD
+mime
+mimeograph
+mimeographed
+mimeographes
+mimeographing
+mimer
+mimesis
+mimetic
+mimetically
+mimetism
+mimetite
+Mimi
+mimic
+mimical
+mimicked
+mimicking
+mimicry
+mimics
+miming
+mimir
+mimosa
+mimosaceous
+min
+Mina
+minable
+minacious
+minaret
+minareted
+minarets
+minas
+minatory
+mince
+minced
+mincemeat
+mincer
+mincers
+minces
+minch
+mincing
+mincingly
+mincy
+mind
+Mindanao
+Mindanao's
+minded
+mindedness
+Mindel
+minder
+minders
+mindful
+mindfully
+mindfulness
+minding
+mindless
+mindlessly
+mindlessness
+mindoro
+minds
+mindszenty
+mine
+mineable
+mined
+minefield
+minelayer
+miner
+mineral
+mineral's
+mineralizable
+mineralizable's
+mineralizables
+mineralization
+mineralization's
+mineralizations
+mineralize
+mineralized
+mineralizer
+mineralizers
+mineralizes
+mineralizing
+mineralocorticoid
+mineralogical
+mineralogies
+mineralogist
+mineralogists
+mineralogy
+minerals
+miners
+Minerva
+mines
+minestrone
+minesweeper
+minesweepers
+minesweeping
+mineworker
+mineworkers
+ming
+Ming
+minge
+mingle
+mingled
+mingles
+mingling
+Mingrelian
+mingus
+mingy
+minho
+mini
+miniature
+miniature's
+miniatured
+miniatures
+miniaturing
+miniaturist
+miniaturistic
+miniaturists
+miniaturization
+miniaturizations
+miniaturize
+miniaturized
+miniaturizes
+miniaturizing
+minibike
+minibus
+minibuses
+minicab
+minicabs
+minicam
+minicamera
+minicar
+minicartridge
+minicomputer
+minicomputer's
+minicomputers
+minidress
+minidresses
+minified
+minifies
+minify
+minifying
+minikin
+minim
+minima
+minimal
+minimalism
+minimalist
+minimalist's
+minimalists
+minimally
+minimax
+minimization
+minimization's
+minimizations
+minimize
+minimized
+minimizer
+minimizers
+minimizes
+minimizing
+minimum
+minimums
+minimus
+mining
+minion
+minions
+minipill
+minis
+miniscule
+miniskirt
+minister
+minister's
+ministered
+ministerial
+ministerialist
+ministerially
+ministering
+ministerium
+ministers
+ministrable
+ministrant
+ministration
+ministrations
+ministries
+ministry
+ministry's
+minitab
+minitrack
+minium
+miniver
+minivet
+mink
+mink's
+Minkowski
+minks
+minna
+Minneapolis
+minnesinger
+Minnesota
+Minnesota's
+Minnie
+minnow
+minnow's
+minnows
+Minoan
+minor
+minor's
+Minorca
+minored
+minoring
+Minorite
+minorities
+minority
+minority's
+minors
+Minos
+minot
+Minot's
+Minotaur
+Minotaur's
+minous
+Minsk
+Minsk's
+Minsky
+Minsky's
+minster
+minstrel
+minstrel's
+minstrels
+minstrelsy
+mint
+mintage
+minted
+minter
+minting
+mintoff
+Minton
+mints
+minuend
+minuends
+minuet
+minus
+minuscular
+minuscule
+minuses
+minute
+minuted
+minutely
+minuteman
+minutemen
+minuteness
+minuter
+minutes
+minutest
+minutia
+minutiae
+minutial
+minuting
+minx
+minxes
+Minya
+Miocene
+miocrystalline
+miombo
+mioses
+miosis
+miotic
+MIPS
+Miquelon
+Mira
+mirabeau
+mirabilite
+miracidium
+miracle
+miracle's
+miracles
+miracular
+miraculism
+miraculisms
+miraculist
+miraculists
+miraculize
+miraculized
+miraculizes
+miraculizing
+miraculous
+miraculously
+miraculousness
+mirador
+miraflores
+mirage
+miraged
+mirages
+miraging
+Miranda
+mirate
+mirated
+mirates
+mirating
+miration
+mirations
+mire
+mired
+mirepoix
+mires
+Mirfak
+Mirfak's
+Miriam
+miring
+mirk
+mirky
+mirror
+mirrored
+mirroring
+mirrorize
+mirrorizes
+mirrorlike
+mirrors
+mirrory
+mirth
+mirthful
+mirthfully
+mirthfulness
+mirthless
+mirthlessly
+mirthlessness
+mirths
+MIRV
+miry
+mirza
+misaddress
+misaddressed
+misadjustment
+misadventure
+misadventured
+misadventures
+misadventurous
+misadvise
+misaim
+misalign
+misaligned
+misaligning
+misalignment
+misalignment's
+misalignments
+misaligns
+misalliance
+misallocate
+misallocated
+misallocates
+misallocating
+misallocation
+misally
+misalphabetize
+misalphabetizes
+misandry
+misanthrope
+misanthropic
+misanthropically
+misanthropism
+misanthropist
+misanthropists
+misanthropize
+misanthropized
+misanthropizes
+misanthropizing
+misanthropy
+misapplication
+misapplied
+misapplier
+misapplies
+misapply
+misapplying
+misapplys
+misappreciate
+misappreciation
+misapprehend
+misapprehended
+misapprehending
+misapprehendingly
+misapprehends
+misapprehension
+misapprehensions
+misapprehensive
+misapprehensively
+misapprehensiveness
+misappropriate
+misappropriates
+misappropriation
+misarranged
+misarrangement
+misarray
+misascription
+misassignment
+misattribution
+misauthorization
+misauthorization's
+misauthorizations
+misauthorize
+misauthorizes
+misbaptize
+misbaptizes
+misbecome
+misbecoming
+misbeget
+misbegotten
+misbehadden
+misbehave
+misbehaved
+misbehaver
+misbehaves
+misbehaving
+misbehavior
+misbehavior's
+misbehaviors
+misbeholden
+misbelief
+misbelieve
+misbeliever
+misbelieving
+misbelievingly
+misbeseem
+misbestow
+misbirth
+misbrand
+misbranded
+misbranding
+misbrands
+misc
+miscalculate
+miscalculated
+miscalculates
+miscalculating
+miscalculation
+miscalculation's
+miscalculations
+miscalculator
+miscall
+miscaller
+miscanonize
+miscanonizes
+miscarriage
+miscarriages
+miscarried
+miscarries
+miscarry
+miscarrying
+miscarrys
+miscast
+miscasting
+miscasts
+miscegenation
+miscegenational
+miscegenations
+miscellanea
+miscellaneity
+miscellaneous
+miscellaneously
+miscellaneousness
+miscellanies
+miscellanist
+miscellanists
+miscellany
+mischance
+mischaracterization
+mischaracterization's
+mischaracterizations
+mischaracterize
+mischaracterizes
+mischief
+mischiefful
+mischievous
+mischievously
+mischievousness
+miscibility
+miscible
+misclassification
+misclassifications
+misclassified
+misclassify
+misclassifying
+miscode
+miscoded
+miscodes
+miscoding
+miscolor
+miscolor's
+miscolored
+miscoloring
+miscolors
+miscommunicate
+miscommunicated
+miscommunicates
+miscommunication
+miscomprehend
+miscomprehension
+misconceit
+misconceive
+misconceived
+misconceiver
+misconceives
+misconceiving
+misconception
+misconception's
+misconceptions
+misconduct
+misconducted
+misconducting
+misconducts
+misconstruction
+misconstructions
+misconstrue
+misconstrued
+misconstrues
+misconstruing
+miscontent
+miscontentment
+miscook
+miscopy
+miscorrect
+miscorrected
+miscounsel
+miscounseled
+miscount
+miscounted
+miscounting
+miscounts
+miscreance
+miscreances
+miscreant
+miscreants
+miscreate
+miscreation
+miscreative
+miscreator
+miscue
+miscue's
+miscues
+misdate
+misdeal
+misdealing
+misdeclared
+misdeed
+misdeeds
+misdeem
+misdeems
+misdefined
+misdeliver
+misdelivered
+misdelivery
+misdemean
+misdemeanant
+misdemeanants
+misdemeanor
+misdemeanor's
+misdemeanors
+misdescribe
+misdescription
+misdescriptive
+misdirect
+misdirected
+misdirection
+misdirector
+misdirectors
+misdirects
+misdo
+misdoer
+misdoing
+misdoubt
+mise
+miseducated
+miseducation
+misemphasis
+misemphasization
+misemphasize
+misemphasized
+misemphasizes
+misemphasizing
+misemploy
+misemployment
+misendeavor
+misendeavor's
+misendeavors
+miseno
+miser
+miserable
+miserableness
+miserably
+Miserere
+misericord
+misericorde
+miseries
+miserliness
+miserly
+misers
+misery
+misery's
+mises
+misesteem
+misestimate
+misestimation
+misfeasance
+misfeasor
+misfeature
+misfeed
+misfile
+misfiled
+misfiles
+misfiling
+misfire
+misfired
+misfires
+misfiring
+misfit
+misfit's
+misfits
+misfortune
+misfortune's
+misfortunes
+misgauge
+misgauged
+misgauges
+misgauging
+misgive
+misgives
+misgiving
+misgivingly
+misgivings
+misgovern
+misgovernment
+misguidance
+misguide
+misguided
+misguidedly
+misguidedness
+misguider
+misguides
+misguiding
+mishandle
+mishandled
+mishandles
+mishandling
+mishap
+mishap's
+mishaps
+mishear
+Mishima
+mishmash
+Mishnah
+misidentification
+misidentified
+misidentifies
+misidentify
+misidentifying
+misimpression
+misimprove
+misinform
+misinformation
+misinformative
+misinformed
+misinforming
+misinforms
+misintelligence
+misinterpret
+misinterpretable
+misinterpretation
+misinterpretations
+misinterpreted
+misinterpreter
+misinterpreters
+misinterpreting
+misinterprets
+misjoinder
+misjudge
+misjudged
+misjudges
+misjudging
+misjudgingly
+misjudgment
+misjudgment's
+misjudgments
+misknow
+misknowledge
+misknows
+miskolc
+mislabel
+mislabeled
+mislabeling
+mislabor
+mislabor's
+mislabored
+mislaboring
+mislabors
+mislaid
+mislay
+mislaying
+mislays
+mislead
+misleader
+misleading
+misleadingly
+misleadings
+misleads
+misleared
+misled
+mislike
+mismachine
+mismanage
+mismanaged
+mismanagement
+mismanages
+mismanaging
+mismarriage
+mismatch
+mismatched
+mismatches
+mismatching
+mismate
+misname
+misnamed
+misnames
+misnaming
+misnomer
+misnomered
+misogamic
+misogamist
+misogamists
+misogamy
+misogynic
+misogynist
+misogynist's
+misogynistic
+misogynists
+misogyny
+misologist
+misology
+misoneism
+misorder
+misorganization
+misorganization's
+misorganizations
+misorganize
+misorganizes
+misperceive
+misperceived
+misperceives
+misperception
+misperceptions
+misplace
+misplaced
+misplacement
+misplacements
+misplaces
+misplacing
+misplay
+misplead
+mispleading
+mispoint
+misposition
+mispositioned
+mispositioning
+mispositions
+mispraise
+misprint
+misprision
+misprisions
+misprize
+misprized
+misprizes
+misprizing
+mispronounce
+mispronounced
+mispronounces
+mispronouncing
+mispronunciation
+mispunctuate
+mispunctuation
+misquotation
+misquote
+misquoted
+misquotes
+misread
+misreader
+misreading
+misreads
+misrealize
+misrealizes
+misreckon
+misrecognize
+misrecognizes
+misrecollect
+misrecollection
+misregister
+misregistration
+misrelated
+misremember
+misreport
+misreporting
+misrepresent
+misrepresentation
+misrepresentation's
+misrepresentations
+misrepresentative
+misrepresented
+misrepresenter
+misrepresenting
+misrepresents
+misroute
+misrouted
+misroutes
+misrouting
+misrule
+misruled
+misruler
+misrules
+misruling
+miss
+missal
+missals
+missed
+missel
+missend
+misses
+misshape
+misshapen
+misshapenly
+misshapenness
+misshapennesses
+misshapes
+missile
+missile's
+missileer
+missileers
+missileman
+missilemen
+missilery
+missiles
+missilry
+missing
+mission
+missionaries
+missionarize
+missionarizes
+missionary
+missionary's
+missionate
+missioned
+missioner
+missioning
+missionization
+missionize
+missionized
+missionizer
+missionizers
+missionizes
+missionizing
+missions
+missis
+mississauga
+mississipi
+Mississippi
+Mississippian
+Mississippians
+missive
+missives
+missolonghi
+missort
+Missoula
+Missouri
+missout
+misspeak
+misspecification
+misspecified
+misspell
+misspelled
+misspelling
+misspellings
+misspells
+misspelt
+misspend
+misspended
+misspender
+misspending
+misspends
+misstate
+misstated
+misstatement
+misstatements
+misstater
+misstates
+misstating
+misstep
+misstrike
+missus
+Missy
+mist
+mistakable
+mistake
+mistaken
+mistakenly
+mistaker
+mistakes
+mistaking
+mistakingly
+mistal
+mistassini
+misted
+mister
+mistered
+mistering
+misterm
+misters
+mistful
+misthink
+misti
+mistier
+mistiest
+mistigris
+mistily
+mistime
+mistimed
+mistiness
+misting
+mistle
+mistletoe
+mistook
+mistrain
+mistral
+mistrals
+mistranslate
+mistranslation
+mistreat
+mistreated
+mistreating
+mistreatment
+mistreats
+mistress
+mistressly
+mistrial
+mistrust
+mistrusted
+mistruster
+mistrustful
+mistrustfully
+mistrustfulness
+mistrusting
+mistrusts
+mists
+misty
+mistype
+mistyped
+mistypes
+mistyping
+misunderstand
+misunderstander
+misunderstanders
+misunderstanding
+misunderstanding's
+misunderstandings
+misunderstands
+misunderstood
+misusage
+misuse
+misused
+misuser
+misuses
+misusing
+misvalue
+misventure
+miswrite
+miswrites
+miswriting
+miswritten
+MIT
+MIT's
+Mitch
+mitch
+Mitch's
+Mitchell
+Mitchell's
+mite
+miter
+mitered
+miterer
+mitering
+miterwort
+mites
+mither
+mithgarthr
+Mithraism
+Mithras
+mithridate
+mithridates
+mithridatism
+miticide
+mitigate
+mitigated
+mitigates
+mitigating
+mitigation
+mitigations
+mitigative
+mitigator
+mitigators
+mitigatory
+mitis
+mitochondria
+mitochondrion
+mitogenesis
+mitogenetic
+mitogenic
+mitoinhibitory
+mitosis
+mitotic
+mitotically
+mitrailleuse
+mitral
+mitrewort
+Mitropolous
+Mitropoulos
+mitt
+mitted
+Mittelland
+mitten
+mitten's
+mittens
+Mitterrand
+mittimus
+mitts
+mitzvah
+mitzvah's
+mitzvahes
+mitzvahs
+mix
+mixable
+mixed
+mixer
+mixers
+mixes
+mixing
+mixologist
+mixologists
+mixology
+mixolydian
+Mixtec
+mixture
+mixture's
+mixtures
+mixup
+mizanthropise
+mizanthropises
+Mizar
+Mizar's
+Mizoguchi
+mizoram
+mizzen
+mizzenmast
+mizzle
+mizzled
+mizzles
+mizzling
+mizzly
+MKS
+MKSA
+ml
+mlea
+Mlle
+mm
+Mme
+MN
+mnemonic
+mnemonic's
+mnemonically
+mnemonics
+Mnemosyne
+MO
+moa
+moab
+moan
+moaned
+moanful
+moanfully
+moaning
+moans
+moat
+moat's
+moats
+mob
+mob's
+mobbed
+mobbing
+mobbish
+mobbishly
+mobbishness
+mobbism
+mobcap
+mobcaps
+Mobil
+mobile
+mobiles
+mobility
+mobilizable
+mobilizable's
+mobilizables
+mobilization
+mobilization's
+mobilizations
+mobilize
+mobilized
+mobilizer
+mobilizes
+mobilizing
+mobocracy
+mobocrat
+mobocratic
+mobs
+mobster
+mobsters
+mobutu
+moccasin
+moccasin's
+moccasins
+mocha
+mock
+mocked
+mocker
+mockernut
+mockers
+mockery
+mocking
+mockingbird
+mockingly
+mocks
+mockup
+mockups
+mod
+modal
+modalities
+modality
+modality's
+modalize
+modalizes
+modally
+mode
+model
+model's
+modeled
+modeler
+modelers
+modeling
+modelings
+models
+modem
+modems
+modena
+moderate
+moderated
+moderately
+moderateness
+moderates
+moderating
+moderation
+moderationist
+moderations
+moderatism
+moderato
+moderator
+moderator's
+moderators
+moderatorship
+modern
+moderne
+modernism
+modernist
+modernistic
+modernists
+modernity
+modernizable
+modernizable's
+modernizables
+modernization
+modernization's
+modernizations
+modernize
+modernized
+modernizer
+modernizers
+modernizes
+modernizing
+modernly
+modernness
+moderns
+modes
+modest
+modestly
+Modesto
+modesty
+modge
+modicity
+modicum
+modifiability
+modifiable
+modifiableness
+modification
+modifications
+modificative
+modified
+modifier
+modifiers
+modifies
+modify
+modifying
+modigliani
+modillion
+Modiolus
+modish
+modishly
+modishness
+modiste
+Modred
+mods
+modulability
+modular
+modularities
+modularity
+modularization
+modularize
+modularized
+modularizes
+modularizing
+modularly
+modulate
+modulated
+modulates
+modulating
+modulation
+modulations
+modulator
+modulator's
+modulators
+modulatory
+module
+module's
+modules
+moduli
+modulo
+modulus
+modus
+Moe
+Moe's
+Moen
+Moen's
+mofette
+mog
+Mogadiscio
+mogador
+mogen
+Moghul
+Mogilev
+mogul
+mohair
+Mohammed
+Mohammedan
+Mohammedanism
+Mohammedanization
+Mohammedanization's
+Mohammedanizations
+Mohammedanize
+Mohammedanized
+Mohammedanizes
+Mohammedanizing
+Mohave
+Mohawk
+Mohican
+mohm
+moho
+Mohock
+mohole
+Mohr
+mohs
+mohur
+moidore
+moieties
+moiety
+moil
+moiler
+moiling
+moilingly
+Moines
+moirai
+moire
+Moiseyev
+Moiseyev's
+moist
+moisten
+moistened
+moistener
+moistening
+moistly
+moistness
+moisture
+moistureless
+moistures
+moisturization
+moisturize
+moisturized
+moisturizer
+moisturizers
+moisturizes
+moisturizing
+Mojave
+moke
+mokha
+mokpo
+molal
+molality
+molar
+molarity
+molarization
+molarizations
+molars
+molasses
+mold
+moldable
+Moldau
+Moldavia
+Moldavian
+Moldavite
+moldboard
+molded
+molder
+moldered
+moldering
+molders
+moldier
+moldiness
+molding
+molds
+moldy
+mole
+Molech
+molecular
+molecularity
+molecularly
+molecule
+molecule's
+molecules
+molehill
+moles
+moleskin
+moleskins
+molest
+molestation
+molestations
+molested
+molester
+molesters
+molesting
+molests
+Moliere
+molina
+Moline
+molise
+Moll
+moll
+mollah
+mollescent
+Mollet
+mollie
+mollification
+mollifications
+mollified
+mollifies
+mollify
+mollifying
+mollusc
+molluscan
+molluscoid
+molluscs
+mollusk
+molluskan
+mollusks
+mollweide
+Molly
+mollycoddle
+mollycoddled
+mollycoddler
+mollycoddles
+mollycoddling
+Moloch
+Molochize
+Molochizes
+Molokai
+molopo
+molotov
+Molotov
+molt
+molten
+molter
+moltke
+molto
+molts
+molucca
+Moluccas
+moly
+molybdate
+molybdenite
+molybdenous
+molybdenum
+molybdic
+molybdous
+mom
+mom's
+mombasa
+moment
+moment's
+momenta
+momental
+momentaneous
+momentarily
+momentariness
+momentary
+momently
+momentous
+momentously
+momentousness
+moments
+momentum
+momentums
+momism
+momma
+Mommsen
+mommy
+moms
+Momus
+Mon
+Mona
+Mona's
+monachal
+monachism
+monacid
+Monaco
+monad
+monadelphous
+monadic
+monadism
+monadnock
+monads
+monaghan
+monal
+monandrous
+monandry
+monanthous
+monarch
+monarchal
+monarchial
+monarchic
+monarchical
+monarchically
+monarchies
+monarchism
+monarchist
+monarchistic
+monarchists
+monarchize
+monarchizer
+monarchizers
+monarchizes
+monarchs
+monarchy
+monarchy's
+monas
+Monash
+monasterial
+monasteries
+monastery
+monastery's
+monastic
+monastical
+monastically
+monasticism
+monasticize
+monasticizes
+monatomic
+monaural
+monaurally
+monaxial
+monazite
+monck
+Moncton
+Mondale
+Monday
+Monday's
+Mondays
+monde
+Mondial
+mondrian
+monecious
+Monegasque
+monel
+moneme
+moner
+monestrous
+Monet
+monet
+monetarily
+monetarism
+monetarist
+monetary
+monetization
+monetize
+monetized
+monetizes
+monetizing
+money
+money's
+moneybags
+moneychanger
+moneyed
+moneyer
+moneylender
+moneylenders
+moneylending
+moneyless
+moneymake
+moneymaker
+moneymaking
+moneys
+moneywort
+Monfort
+mong
+monger
+mongered
+mongering
+mongers
+Mongo
+Mongol
+Mongolia
+Mongolian
+Mongolianism
+Mongolic
+mongolism
+mongoloid
+mongoose
+mongooses
+mongrel
+mongrelism
+mongrelization
+mongrelizations
+mongrelize
+mongrelized
+mongrelizer
+mongrelizes
+mongrelizing
+mongrelly
+mongrelness
+monic
+Monica
+monicker
+monied
+monies
+moniker
+monilia
+moniliform
+monish
+monism
+monist
+monistic
+monistical
+monition
+monitions
+monitor
+monitored
+monitorial
+monitorially
+monitoring
+monitors
+monitorship
+monitory
+monitress
+monk
+monk's
+monkeries
+monkery
+monkey
+monkeyed
+monkeyflower
+monkeying
+monkeypot
+monkeys
+monkeyshine
+monkfish
+monkhood
+monkish
+monks
+monkshood
+Monmouth
+Monmouth's
+Monmouthshire
+monnet
+mono
+mono's
+monoacid
+monoacidic
+monoamine
+monoatomic
+monobasic
+monocarp
+monocarpellary
+monocarpic
+monocausal
+Monoceros
+monochasial
+monochasium
+monochloride
+monochloroethanol
+monochord
+monochordize
+monochordizes
+monochromat
+monochromatic
+monochromatically
+monochromaticity
+monochromatism
+monochromator
+monochrome
+monochromes
+monochromic
+monochromist
+monocle
+monocled
+monocles
+monocline
+monoclinic
+monoclinous
+monocoque
+monocracy
+monocrat
+monocratic
+monocular
+monocularly
+monocultural
+monoculture
+monocycle
+monocyclic
+monocycly
+monocyte
+monocytic
+monodisperse
+monodispersity
+monodist
+monodrama
+monodramatic
+monody
+monoecious
+monoeciously
+monoecism
+monoenergetic
+monoester
+monofilament
+monofuel
+monogamic
+monogamist
+monogamists
+monogamous
+monogamously
+monogamousness
+monogamy
+monogastric
+monogenean
+monogenesis
+monogenetic
+monogenic
+monogenically
+monogerm
+monogram
+monogram's
+monogrammatic
+monograms
+monograph
+monograph's
+monographes
+monographic
+monographical
+monographs
+monography
+monogynous
+monogyny
+monohull
+monohybrid
+monohydrate
+monohydric
+monohydroxy
+monoicous
+monoid
+monolatry
+monolayer
+monolingual
+monolingualism
+monolinguals
+monolith
+monolithic
+monolithically
+monoliths
+monologist
+monologists
+monologize
+monologized
+monologizes
+monologizing
+monologue
+monologues
+monologuist
+monomania
+monomaniac
+monomark
+monomer
+monomer's
+monomeric
+monomerous
+monomers
+monometalism
+monometalist
+monometallic
+monometer
+monometer's
+monometers
+monomial
+monomolecular
+monomolecularly
+monomorphemic
+monomorphic
+monomorphism
+monomorphous
+Monongahela
+Monongahela's
+mononuclear
+mononucleosis
+monopetalous
+monophagous
+monophobia
+monophonic
+monophonically
+monophony
+monophthong
+monophthongal
+monophyletic
+monophyletism
+monophyllous
+Monophysite
+monoplane
+monoplegia
+monoploid
+monopode
+monopodial
+monopodially
+monopodium
+monopolies
+monopolist
+monopolistic
+monopolistically
+monopolists
+monopolizable
+monopolizable's
+monopolizables
+monopolization
+monopolization's
+monopolizations
+monopolize
+monopolized
+monopolizer
+monopolizers
+monopolizes
+monopolizing
+monopoly
+monopoly's
+monopropellant
+monopsony
+monopteros
+monopulse
+monorail
+monorail's
+monorails
+monosaccharide
+monosaccharides
+monosemy
+monosepalous
+monosized
+monosodium
+monosome
+monosomic
+monospermous
+monostat
+monostatic
+monostich
+monostichous
+monostome
+monostrophe
+monostylous
+monosyllabic
+monosyllabically
+monosyllabicity
+monosyllable
+monosyllables
+monosymmetric
+monosymmetry
+monosynaptic
+monosynaptically
+monotheism
+monotheist
+monotheistic
+monotheistical
+monotheistically
+monothetic
+monotint
+monotone
+monotonic
+monotonically
+monotonicity
+monotonize
+monotonizes
+monotonous
+monotonously
+monotonousness
+monotony
+monotower
+monotrematous
+monotreme
+monotrichous
+monotropism
+monotype
+monotypic
+monovalent
+monovular
+monoxide
+monozygotic
+Monroe
+Monrovia
+mons
+Monsanto
+monsieur
+monsignor
+monsoon
+monsoonal
+monsoons
+monster
+monster's
+monsters
+monstrance
+monstrances
+monstrosities
+monstrosity
+monstrous
+monstrously
+monstrousness
+montage
+montaged
+montages
+montaging
+montagnard
+montagu
+Montague
+montagues
+Montaigne
+montaigne
+montale
+Montana
+Montana's
+Montanan
+Montanan's
+montane
+montauban
+montbretia
+montcalm
+Montclair
+monte
+montefiore
+montego
+monteith
+Montenegrin
+Montenegrin's
+montenegro
+Monterey
+montero
+monterrey
+montesquieu
+montessori
+Monteux
+Monteverdi
+Monteverdi's
+Montevideo
+Montezuma
+montfort
+montgolfier
+Montgomery
+Montgomeryshire
+month
+month's
+montherlant
+monthlies
+monthly
+months
+Monticello
+monticule
+Montmartre
+Montmartre's
+montmorillonite
+montparnasse
+Montpelier
+montpellier
+Montrachet
+Montrachet's
+Montreal
+montreuil
+montreux
+montrose
+Montserrat
+Monty
+monument
+monument's
+monumental
+monumentality
+monumentalization
+monumentalization's
+monumentalizations
+monumentalize
+monumentalized
+monumentalizes
+monumentalizing
+monumentally
+monumentless
+monuments
+monza
+monzonite
+moo
+mooch
+moocher
+mooches
+mooching
+mood
+mood's
+moodier
+moodily
+moodiness
+moods
+moody
+mooed
+moog
+moola
+moolah
+moolvie
+moon
+moonbeam
+moonbeam's
+moonbeams
+moonbow
+mooncalf
+mooned
+Mooney
+mooneye
+moonfish
+moonflower
+mooning
+moonish
+moonishly
+moonless
+moonlet
+moonlight
+moonlighted
+moonlighter
+moonlighting
+moonlights
+moonlit
+moonquake
+moonraker
+moonrise
+moons
+moonscape
+moonseed
+moonset
+moonshine
+moonshiner
+moonshot
+moonstone
+moonstruck
+moonward
+moonwort
+moony
+moor
+moor's
+moorage
+Moorcock
+Moore
+moored
+moorfowl
+moorhen
+mooring
+moorings
+Moorish
+Moorland
+moors
+moorwort
+moos
+moose
+moot
+mooted
+mop
+mopboard
+mope
+moped
+moper
+mopes
+moping
+mopoke
+mopped
+mopper
+moppet
+mopping
+mops
+moquette
+mor
+mora
+moraceous
+Moradabad
+morainal
+moraine
+morainic
+moral
+moral's
+morale
+morales
+moralism
+moralist
+moralistic
+moralistically
+moralities
+morality
+moralization
+moralization's
+moralizations
+moralize
+moralized
+moralizer
+moralizers
+moralizes
+moralizing
+moralizinglies
+moralizingly
+morally
+morals
+Moran
+Moran's
+morar
+morass
+morasses
+morassy
+moratorium
+moratoriums
+morava
+Moravia
+Moravian
+Moravianized
+Moravianized's
+Moravianizeds
+moray
+morbid
+morbidity
+morbidize
+morbidizes
+morbidly
+morbidness
+morbific
+morbihan
+morbilli
+morcha
+mordacious
+mordaciously
+mordacity
+mordancy
+mordant
+mordantly
+mordecai
+mordent
+mordred
+Mordvin
+Mordvinian
+more
+morea
+moreau
+morecambe
+mored
+moreen
+morehouse
+Morehouse
+moreish
+morel
+Moreland
+morelia
+morello
+morelos
+moreover
+morepork
+mores
+Moresby
+Moresby's
+moresco
+moresque
+Moreton
+Morgan
+morganatic
+morganatically
+morganite
+morgen
+morgue
+morgues
+Moriarty
+moribund
+moribundity
+morion
+Morisco
+morish
+Morley
+Morley's
+Mormon
+morn
+mornay
+morning
+mornings
+Moro
+Moroccan
+morocco
+Morocco
+moron
+moroni
+moronic
+moronically
+moronism
+moronity
+morose
+morosely
+moroseness
+morosity
+morph
+morphallaxis
+morpheme
+morphemic
+Morpheus
+morphine
+morphines
+morphinic
+morphinism
+morphinization
+morphinization's
+morphinizations
+morphinize
+morphinizes
+morphism
+morphism's
+morphisms
+morpho
+morphogenesis
+morphologic
+morphological
+morphologically
+morphology
+morphophoneme
+morphophonemic
+morphophonemics
+morphosis
+morphotype
+morphotypes
+morphy
+Morrill
+Morrill's
+Morris
+morris
+Morrison
+Morrissey
+Morrissey's
+Morristown
+morro
+morrow
+mors
+Morse
+morsel
+morsel's
+morseled
+morseling
+morselization
+morselization's
+morselizations
+morselize
+morselizes
+morsels
+mort
+mortal
+mortality
+mortalize
+mortalizes
+mortally
+mortals
+mortar
+mortarboard
+mortared
+mortaring
+mortarize
+mortarizes
+mortars
+mortem
+mortgage
+mortgage's
+mortgaged
+mortgagee
+mortgagees
+mortgager
+mortgages
+mortgaging
+mortgagor
+mortgagors
+mortician
+morticians
+mortification
+mortifications
+mortified
+mortifiedly
+mortifier
+mortifies
+mortify
+mortifying
+mortimer
+Mortimer
+mortise
+mortising
+mortmain
+Morton
+Morton's
+mortuaries
+mortuary
+mortuary's
+morula
+morwong
+mos
+mosaic
+mosaic's
+mosaically
+mosaicism
+mosaicist
+mosaics
+mosasaur
+moschatel
+moscone
+Moscone
+Moscow
+moseley
+Moselle
+Moser
+Moser's
+Moses
+mosey
+moseyed
+moseying
+moshav
+moshesh
+moskva
+Moslem
+Moslem's
+Moslemize
+Moslemizes
+Moslems
+mosley
+mosotho
+mosque
+mosques
+mosquito
+mosquitoes
+mosquitoey
+mosquitos
+moss
+moss's
+mossback
+mossbacked
+Mossberg
+mossbunker
+mosses
+Mossi
+mossie
+mossier
+mosslike
+mosso
+mosstrooper
+mossy
+most
+mostly
+Mosul
+mot
+mote
+motel
+motel's
+motels
+motet
+moth
+mothball
+mother
+mother's
+motherboard
+motherboard's
+motherboards
+mothered
+motherer
+motherers
+motherfucker
+motherhood
+motherhouse
+mothering
+motherland
+motherless
+motherlessness
+motherliness
+motherly
+mothers
+motherwell
+motherwort
+mothproof
+mothproofer
+moths
+mothy
+motif
+motif's
+motifs
+motile
+motility
+motion
+motional
+motioned
+motioner
+motioning
+motionless
+motionlessly
+motionlessness
+motions
+motivate
+motivated
+motivates
+motivating
+motivation
+motivational
+motivationally
+motivations
+motivative
+motivator
+motive
+motived
+motives
+motivic
+motiving
+motivity
+motley
+motmot
+motocross
+motoneuron
+motor
+motorable
+motorbicycle
+motorbike
+motorboat
+motorboater
+motorboating
+motorbus
+motorcade
+motorcade's
+motorcades
+motorcar
+motorcar's
+motorcars
+motorcoach
+motorcycle
+motorcycle's
+motorcycles
+motorcyclist
+motordrome
+motored
+motoric
+motorically
+motoring
+motorist
+motorist's
+motorists
+motorization
+motorization's
+motorizations
+motorize
+motorized
+motorizes
+motorizing
+motorless
+motorman
+motormen
+Motorola
+Motorola's
+motors
+motortruck
+motorway
+motown
+mots
+motte
+mottle
+mottled
+mottler
+mottles
+mottling
+motto
+mottoes
+mottos
+motu
+mouflon
+moujik
+moulage
+mould
+mouldboard
+moulded
+moulder
+mouldering
+moulding
+moulds
+mouldy
+moulin
+moulins
+moulmein
+moult
+Moulton
+Moulton's
+mound
+mounded
+mounds
+mount
+mountable
+mountain
+mountain's
+mountaineer
+mountaineering
+mountaineers
+mountainous
+mountainously
+mountainousness
+mountains
+mountainside
+mountainsides
+mountaintop
+mountaintop's
+mountaintops
+mountainy
+Mountbatten
+mountebank
+mountebankery
+mounted
+mounter
+Mountie
+mounting
+mountings
+mounts
+mourn
+mourned
+mourner
+mourners
+mournful
+mournfully
+mournfulness
+mourning
+mourningly
+mourns
+mouse
+mousebird
+mouser
+mouses
+mousetail
+mousetrap
+mousey
+mousier
+mousily
+mousiness
+mousing
+moussaka
+mousse
+mousseline
+Moussorgsky
+Mousterian
+mousy
+mouth
+mouthbrooder
+mouthed
+mouther
+mouthes
+mouthful
+mouthier
+mouthing
+mouthlike
+mouthpart
+mouthpiece
+mouthpieces
+mouths
+mouthwash
+mouthwatering
+mouthy
+Mouton
+movability
+movable
+movableness
+movably
+move
+moved
+moveless
+movelessly
+movelessness
+movement
+movement's
+movements
+mover
+movers
+moves
+movie
+movie's
+moviedom
+moviegoer
+moviemaker
+movies
+movietone
+moving
+movingly
+movings
+moviola
+mow
+mowburnt
+mowed
+mower
+mowers
+mowing
+mown
+mows
+moxa
+moxie
+Moyer
+Moyer's
+Mozambique
+Mozarab
+Mozart
+Mozart's
+mozzarella
+Mpc
+MPH
+Mr
+MRI
+Mridang
+Mrs
+Ms
+MSC
+MST
+Mt
+MTS
+MTV
+mu
+much
+muchness
+muciferous
+mucilage
+mucilaginous
+mucilaginously
+mucin
+muck
+muckamuck
+mucked
+mucker
+mucking
+muckle
+muckrake
+muckraker
+muckraking
+mucks
+mucksweat
+muckworm
+mucky
+mucoid
+mucopolysaccharide
+mucoprotein
+mucopurulent
+mucosa
+mucous
+mucro
+mucronate
+mucus
+mud
+mudcat
+Mudd
+Mudd's
+mudded
+muddied
+muddier
+muddily
+muddiness
+mudding
+muddle
+muddled
+muddlehead
+muddleheaded
+muddleheadedness
+muddleheads
+muddler
+muddlers
+muddles
+muddling
+muddy
+muddying
+mudfish
+mudguard
+mudhole
+mudhole's
+mudholes
+mudir
+mudlark
+mudpack
+mudra
+muds
+mudsill
+mudskipper
+mudskippers
+mudsling
+mudslinger
+mudslingers
+mudslinging
+mudstone
+mudstones
+Mueller
+Mueller's
+Muenster
+muenster
+muesli
+muezzin
+muff
+muff's
+muffin
+muffin's
+muffins
+muffle
+muffled
+muffler
+mufflers
+muffles
+muffling
+muffs
+mufti
+muftis
+mufulira
+mug
+mug's
+mugabe
+mugged
+mugger
+muggers
+muggier
+muggily
+mugginess
+mugging
+muggings
+muggins
+muggy
+mugho
+mugs
+mugwort
+mugwump
+muhammad
+Muhammad
+muhammadan
+Muharram
+Muir
+mujik
+Mukden
+Mukden's
+mukluk
+mulatto
+mulattoes
+mulattos
+mulberries
+mulberry
+mulberry's
+mulch
+mulched
+mulches
+mulching
+Mulciber
+mulct
+muldoon
+mule
+mule's
+mules
+muleta
+muleteer
+muley
+mulga
+mulhouse
+muliebrity
+muling
+mulish
+mulishly
+mulishness
+mulki
+mull
+mullah
+mullein
+mullen
+muller
+mullet
+mullets
+mulley
+mulligan
+Mulligan's
+mulligatawny
+mulliken
+mulling
+mullion
+mullite
+mullock
+mulloway
+multan
+multangular
+multeity
+multi
+multiaperture
+Multibus
+Multibus's
+multicavity
+multicellular
+multicellularity
+multichannel
+multichip
+multicide
+multicollector
+multicollinearity
+multicolor
+multicolor's
+multicolored
+multicolors
+multicolumn
+multicompletion
+multicomponent
+multicomputer
+multicomputer's
+multicomputers
+multicoupler
+Multics
+multicycle
+multideck
+multidimensional
+multidimensionality
+multidisciplinary
+multidrop
+multielectrode
+multiengine
+multifaceted
+multifactorial
+multifactrially
+multifarious
+multifariously
+multifariousness
+multifibered
+multifibered's
+multifibereds
+multifid
+multifigure
+multifile
+multiflora
+multifoil
+multifold
+multifoliate
+multiform
+multiformity
+multifunctioned
+multigravida
+multihop
+multihued
+multihull
+multihulls
+multikey
+multikeys
+multilane
+multilaned
+multilateral
+multilateralist
+multilateralists
+multilaterally
+multilayer
+multilayered
+multilayers
+multilevel
+multileveled
+multilingual
+multilingualism
+multilingualist
+multilingually
+multimedia
+multimegaton
+multimembered
+multimeter
+multimeter's
+multimeters
+multimillionaire
+multinational
+multinomial
+multinuclear
+multinucleate
+multinucleated
+multipacket
+multipactor
+multipara
+multiparous
+multipartite
+multiped
+multiphase
+multiphasic
+multiphastic
+multiplane
+multiple
+multiple's
+multiplepoinding
+multiples
+multiplet
+multiplets
+multiplex
+multiplexed
+multiplexer
+multiplexers
+multiplexes
+multiplexing
+multiplexor
+multiplexor's
+multiplexors
+multipliable
+multiplicable
+multiplicand
+multiplicand's
+multiplicands
+multiplicate
+multiplicates
+multiplication
+multiplications
+multiplicative
+multiplicatively
+multiplicatives
+multiplicity
+multiplied
+multiplier
+multipliers
+multiplies
+multiply
+multiplying
+multipolar
+multipolarity
+multiprocess
+multiprocessing
+multiprocessor
+multiprocessor's
+multiprocessors
+multiprogram
+multiprogrammed
+multiprogramming
+multiprogrammings
+multipronged
+multipunch
+multipunched
+multipurpose
+multiracial
+multiracialism
+multireel
+multirole
+multiscreen
+multisectoral
+multisegment
+multispectral
+multistage
+multistatic
+multistorey
+multistory
+multisubject
+multisyllabic
+multitasking
+multitude
+multitude's
+multitudes
+multitudinous
+multitudinously
+multitudinousness
+multiuser
+multivalence
+multivalent
+multivalued
+multivariable
+multivariate
+multiversity
+multivibrator
+multivocal
+multivolume
+multivolumed
+multiway
+multiword
+multure
+mum
+mumble
+mumbled
+mumbler
+mumblers
+mumbles
+mumbling
+mumblings
+mumbo
+mumchance
+Mumford
+mummer
+mummery
+mummies
+mummification
+mummifications
+mummified
+mummify
+mumming
+mummy
+mummy's
+mump
+mumper
+mumps
+Munch
+munch
+munched
+muncher
+munches
+munching
+Muncie
+Munda
+mundane
+mundanely
+mundaneness
+Mundt
+mundt
+mung
+munga
+munge
+munged
+munger
+mungers
+munges
+munging
+mungings
+mungo
+Munich
+municipal
+municipalities
+municipality
+municipality's
+municipalization
+municipalization's
+municipalizations
+municipalize
+municipalized
+municipalizer
+municipalizers
+municipalizes
+municipalizing
+municipally
+munificence
+munificent
+munificently
+muniment
+muniments
+munist
+munition
+munitions
+munnion
+munro
+munroe
+Munroe
+munsell
+Munsey
+Munsey's
+Munson
+munster
+munt
+muntin
+muntjac
+muntz
+muon
+Muong
+Muong's
+muonic
+murage
+mural
+muralist
+murals
+murasaki
+murat
+murcia
+Murdabad
+murder
+murdered
+murderee
+murderer
+murderers
+murderess
+murdering
+murderous
+murderously
+murderousness
+murders
+Murdoch
+mure
+murex
+muriate
+muriatic
+muricate
+Muriel
+Murillo
+murine
+murk
+murkier
+murkily
+murkiness
+murky
+murman
+Murmansk
+murmur
+murmured
+murmurer
+murmuring
+murmurous
+murmurously
+murmurs
+Murphy
+murra
+murrain
+Murray
+murre
+murrelet
+murrey
+murrhine
+Murrow
+murrow
+murrumbidgee
+murther
+musaceous
+Musca
+muscadel
+muscadine
+muscae
+muscarine
+Muscat
+muscatel
+muscid
+muscle
+muscled
+muscleman
+musclemen
+muscles
+muscling
+muscly
+muscovado
+muscovite
+muscovites
+Muscovy
+muscular
+muscularity
+muscularize
+muscularizes
+muscularly
+musculature
+musculoskeletal
+muse
+mused
+musee
+museology
+muser
+muses
+musette
+musettes
+museum
+museum's
+museumize
+museumizes
+museums
+mush
+musher
+mushier
+mushily
+mushiness
+mushroom
+mushroomed
+mushrooming
+mushrooms
+mushy
+music
+musical
+musicale
+musicality
+musicalization
+musicalization's
+musicalizations
+musicalize
+musicalizes
+musically
+musicals
+musician
+musicianly
+musicians
+musicianship
+musicological
+musicologist
+musicologists
+musicology
+musics
+musil
+musing
+musingly
+musings
+musjid
+musk
+muskeg
+Muskegon
+muskellunge
+musket
+musket's
+musketeer
+musketry
+muskets
+Muskhogean
+muskie
+muskier
+muskies
+muskiness
+muskmelon
+muskox
+muskoxen
+muskrat
+muskrat's
+muskrats
+musks
+musky
+Muslim
+Muslim's
+Muslims
+muslin
+muso
+musquash
+muss
+mussed
+mussel
+mussel's
+mussels
+musses
+musset
+mussier
+mussily
+mussiness
+mussing
+Mussolini
+Mussolini's
+Mussolinis
+Mussorgsky
+Mussorgsky's
+Mussulman
+mussy
+must
+must've
+mustache
+mustached
+mustaches
+mustachio
+mustachioed
+mustachios
+mustafa
+mustang
+mustangs
+mustard
+mustards
+mustee
+musteline
+muster
+mustered
+mustering
+musters
+musth
+mustier
+mustily
+mustiness
+mustn't
+musts
+musty
+mutability
+mutable
+mutableness
+mutably
+mutafacient
+mutagen
+mutagenesis
+mutagenic
+mutagenically
+mutagenicity
+mutandis
+mutant
+mutants
+mutase
+mutate
+mutated
+mutates
+mutating
+mutation
+mutational
+mutationally
+mutations
+mutatis
+mutative
+mutator
+mutators
+mutch
+mutchkin
+mute
+muted
+mutedly
+mutely
+muteness
+muter
+mutes
+mutest
+Muti
+muticous
+mutilate
+mutilated
+mutilates
+mutilating
+mutilation
+mutilations
+mutilator
+mutine
+mutined
+mutineer
+muting
+mutinies
+mutining
+mutinous
+mutinously
+mutinousness
+mutiny
+mutiny's
+mutism
+mutsuhito
+mutt
+mutter
+muttered
+mutterer
+mutterers
+muttering
+mutters
+mutton
+muttonchops
+muttonhead
+muttony
+muttra
+mutual
+mutualism
+mutualist
+mutualistic
+mutuality
+mutualization
+mutualization's
+mutualizations
+mutualize
+mutualized
+mutualizes
+mutualizing
+mutually
+mutuel
+mutule
+muumuu
+Muzak
+Muzo
+Muzo's
+muzorewa
+muzz
+muzzier
+muzzily
+muzziness
+muzzle
+muzzle's
+muzzled
+muzzler
+muzzles
+muzzling
+muzzy
+MVS
+MVT
+Mwalimu
+Mweru
+my
+myalgia
+myalism
+myall
+myasthenia
+mycelium
+Mycenae
+Mycenaean
+mycetoma
+mycetozoan
+mycin
+mycobacteria
+Mycobacterium
+mycology
+mycoplasma
+mycorrhiza
+mycosis
+mycostatin
+mycotic
+mydriasis
+mydriatic
+myel
+myelencephalon
+myelin
+myeline
+myelinization
+myelinization's
+myelinizations
+myelitis
+myeloid
+myeloma
+myers
+myiasis
+mylar
+mylonite
+myna
+mynah
+Mynheer
+myocardial
+myocardiograph
+myocarditis
+myocardium
+myofibril
+myogenic
+myoglobin
+myograph
+myology
+myoma
+myope
+myopia
+myopic
+myopically
+myosin
+myosotis
+myotic
+myotome
+myotonia
+Myra
+Myra's
+myriad
+myriameter
+myriameter's
+myriameters
+myriapod
+Myrica
+myriopod
+myristate
+myrmecological
+myrmecology
+myrmecophagous
+myrmecophile
+Myrmidon
+myrobalan
+Myron
+myrrh
+myrtaceous
+myrtle
+myself
+mysia
+Mysore
+mystagogue
+mystagogy
+mysteries
+mysterious
+mysteriously
+mysteriousness
+mystery
+mystery's
+mystic
+mystic's
+mystical
+mystically
+mysticism
+mysticisms
+mysticize
+mysticizes
+mystics
+mystification
+mystified
+mystifier
+mystifies
+mystify
+mystifying
+mystifyingly
+mystique
+myth
+myth's
+mythes
+mythic
+mythical
+mythically
+mythicization
+mythicize
+mythicized
+mythicizer
+mythicizers
+mythicizes
+mythicizing
+mythize
+mythizes
+mythmaker
+mythmaking
+mythographer
+mythographers
+mythography
+mythologer
+mythologic
+mythological
+mythologically
+mythologies
+mythologist
+mythologization
+mythologize
+mythologized
+mythologizer
+mythologizes
+mythologizing
+mythology
+mythology's
+mythomania
+mythomaniac
+mythopoeia
+mythopoeic
+mythopoetic
+mythopoetical
+mythos
+myths
+mytilene
+myxoedema
+myxoma
+myxomatosis
+myxomycete
+myxovirus
+mzee
+mzungu
+n's
+NAACP
+Naafi
+nab
+Nabataean
+nabbed
+nabbing
+nabis
+Nabisco
+nabla
+nablas
+nablus
+nabob
+Nabokov
+Nabonidus
+naboth
+nacelle
+NaCl
+nacre
+nacreous
+Nadia
+Nadine
+Nadine's
+nadir
+nae
+naevus
+nag
+nag's
+Naga
+Nagaland
+Nagana
+Nagano
+Nagari
+Nagasaki
+nagged
+nagger
+nagging
+naggingly
+nagor
+Nagoya
+Nagoya's
+Nagpur
+nags
+Nagy
+Nagy's
+Nagyszeben
+naha
+Nahuatl
+Nahum
+naiad
+nail
+nailbrush
+nailed
+nailer
+nailfile
+nailhead
+nailing
+nails
+nainsook
+Nair
+Nair's
+naira
+nairn
+Nairobi
+naissant
+naive
+naively
+naiveness
+naiver
+naivete
+naivety
+nakamura
+Nakamura
+Nakayama
+naked
+nakedize
+nakedizes
+nakedly
+nakedness
+naker
+nakhichevan
+nakoma
+Nakoma
+nakuru
+nalchik
+nalgo
+Nama
+namable
+namangan
+Namaqualand
+namas
+name
+name's
+nameable
+named
+nameless
+namelessly
+namelessness
+namelist
+namelists
+namely
+namen
+nameplate
+nameplates
+namer
+namers
+names
+namesake
+namesake's
+namesakes
+nametape
+namhoi
+Namibia
+naming
+namur
+Nan
+Nana
+nanak
+nanchang
+Nancy
+Nancy's
+nanda
+Nanette
+nanga
+nankeen
+Nanking
+nannies
+nanning
+nanny
+nanogram
+nanograms
+nanometer
+nanometers
+nanometric
+Nanook
+nanook
+nanoplankton
+nanosecond
+nanoseconds
+Nansen
+nanterre
+nantes
+Nantucket
+nantung
+Naomi
+nap
+nap's
+napalm
+nape
+napery
+napes
+naphtali
+naphtha
+naphthalene
+naphthalenic
+naphthene
+naphthenic
+naphthol
+naphthyl
+Napier
+Napierian
+napiform
+napkin
+napkin's
+napkins
+Naples
+napless
+Napoleon
+Napoleonic
+Napoleonize
+Napoleonizes
+Napoli
+nappa
+napped
+napper
+nappier
+nappies
+napping
+nappy
+Napravnik
+naps
+nara
+Narayanganj
+narbada
+Narbonne
+Narbonne's
+narc
+narceine
+narcism
+narcissi
+narcissism
+narcissist
+narcissistic
+narcissus
+narcissuses
+narcist
+narcoanalysis
+narcolepsy
+narcoleptic
+narcos
+narcosis
+narcosynthesis
+narcotic
+narcotically
+narcotics
+narcotism
+narcotization
+narcotize
+narcotized
+narcotizes
+narcotizing
+nardoo
+nares
+narial
+nark
+narmada
+Narraganset
+Narragansett
+Narragansett's
+narrate
+narrated
+narrates
+narrating
+narration
+narrational
+narrations
+narrative
+narrative's
+narratively
+narratives
+narrator
+narrators
+narrow
+narrowed
+narrower
+narrowest
+narrowing
+narrowingness
+narrowly
+narrowminded
+narrowness
+narrows
+narthex
+narva
+narvik
+narwal
+narwhal
+narwhal's
+narwhals
+nary
+NASA
+nasal
+nasality
+nasalization
+nasalization's
+nasalizations
+nasalize
+nasalized
+nasalizes
+nasalizing
+nasally
+nascence
+nascency
+nascent
+naseberry
+naseby
+Nash
+nashe
+nasho
+Nashua
+Nashville
+nasion
+nasofrontal
+nasopharynx
+Nassau
+nasser
+nastase
+nastic
+nastier
+nasties
+nastiest
+nastily
+nastiness
+nasturtium
+nasty
+Nat
+natal
+Natalie
+Natalie's
+natalist
+natality
+natant
+natation
+natations
+natatorial
+natatorium
+natatory
+natch
+Natchez
+nate
+Nate
+Nate's
+nates
+Nathan
+Nathanael
+Nathaniel
+natheless
+nation
+nation's
+national
+nationalism
+nationalisms
+nationalist
+nationalist's
+nationalistic
+nationalistically
+nationalists
+nationalities
+nationality
+nationality's
+nationalization
+nationalization's
+nationalizations
+nationalize
+nationalized
+nationalizer
+nationalizers
+nationalizes
+nationalizing
+nationally
+nationals
+nationhood
+nations
+nationwide
+native
+natively
+nativeness
+natives
+nativism
+nativist
+nativistic
+nativity
+NATO
+natrium
+natrolite
+natron
+natsopa
+natter
+natterjack
+nattier
+nattily
+nattiness
+natty
+natural
+naturalism
+naturalist
+naturalistic
+naturalistically
+naturalization
+naturalization's
+naturalizations
+naturalize
+naturalized
+naturalizer
+naturalizers
+naturalizes
+naturalizing
+naturally
+naturalness
+naturals
+naturam
+nature
+nature's
+natured
+natures
+naturism
+naturize
+naturizes
+naturopath
+naturopathy
+nauch
+naucratis
+naught
+naught's
+naughtier
+naughtily
+naughtiness
+naughts
+naughty
+naumachia
+nauplius
+naur
+Nauru
+nausea
+nauseant
+nauseas
+nauseate
+nauseated
+nauseates
+nauseating
+nauseatingly
+nauseous
+nauseously
+nauseousness
+nauseum
+naut
+nautch
+nautical
+nautically
+nautiloid
+nautilus
+navaho
+Navaho
+Navajo
+naval
+navally
+navar
+navarin
+navarino
+navarre
+Navassa
+nave
+navel
+navels
+naves
+navew
+navicert
+navicular
+navies
+navigability
+navigable
+navigableness
+navigably
+navigate
+navigated
+navigates
+navigating
+navigation
+navigational
+navigationally
+navigations
+navigator
+navigator's
+navigators
+navona
+Navona
+navratilova
+navtas
+navvy
+navy
+navy's
+naw
+nawab
+naxalite
+naxos
+nay
+Nayarit
+Nazarene
+Nazareth
+Nazarite
+naze
+Nazi
+Nazi's
+nazification
+nazifications
+nazified
+nazifies
+nazify
+nazifying
+Nazis
+Nazism
+NBC
+NBS
+NC
+NCAA
+NCAR
+NCC
+NCO
+NCR
+nd
+ndola
+NE
+neagh
+Neal
+Neal's
+Neanderthal
+neap
+Neapolitan
+near
+nearby
+Nearctic
+neared
+nearer
+nearest
+nearing
+nearly
+nearness
+nears
+nearside
+nearsighted
+nearsightedly
+nearsightedness
+neat
+neaten
+neater
+neatest
+neath
+neatly
+neatness
+neats
+neb
+nebbish
+Neblett
+nebo
+Nebraska
+Nebraska's
+Nebraskan
+Nebraskan's
+nebuchadnezzar
+Nebuchadnezzar
+Nebuchadnezzar's
+nebula
+nebulae
+nebular
+nebularization
+nebularization's
+nebularizations
+nebularize
+nebularizes
+nebulization
+nebulizations
+nebulize
+nebulized
+nebulizer
+nebulizes
+nebulizing
+nebulosity
+nebulous
+nebulously
+nebulousness
+necessaries
+necessarily
+necessary
+necessitarian
+necessitarianism
+necessitate
+necessitated
+necessitates
+necessitating
+necessitation
+necessitations
+necessities
+necessitous
+necessitously
+necessitousness
+necessity
+neck
+neckar
+neckband
+neckcloth
+necked
+necker
+neckerchief
+necking
+necklace
+necklace's
+necklaces
+neckline
+neckpiece
+necks
+necktie
+necktie's
+neckties
+neckwear
+necrobiosis
+necrolatry
+necrological
+necrologist
+necrologists
+necrology
+necromancer
+necromancers
+necromancy
+necromania
+necromantic
+necromantically
+necrophagia
+necrophagous
+necrophagy
+necrophilia
+necrophilic
+necrophilism
+necrophobia
+necropolis
+necropsy
+necrose
+necroses
+necrosis
+necrotic
+necrotize
+necrotized
+necrotizes
+necrotizing
+necrotomy
+nectar
+nectareous
+nectaries
+nectarine
+nectarize
+nectarizes
+nectarous
+nectary
+Ned
+Ned's
+neddy
+Nederland
+nee
+need
+needed
+needer
+needful
+needfully
+needfulness
+Needham
+needier
+neediness
+needing
+needle
+needlecord
+needlecraft
+needled
+needlefish
+needleful
+needlelike
+needlepoint
+needler
+needlers
+needles
+needless
+needlessly
+needlessness
+needlewoman
+needlewomen
+needlework
+needleworker
+needling
+needly
+needn't
+needs
+needy
+neep
+nefarious
+nefariously
+nefariousness
+nefertiti
+Neff
+Neff's
+negate
+negated
+negater
+negates
+negating
+negation
+negational
+negations
+negative
+negatived
+negatively
+negativeness
+negatives
+negativing
+negativism
+negativisms
+negativist
+negativistic
+negativists
+negativity
+negaton
+negator
+negators
+negatron
+negev
+neglect
+neglected
+neglecter
+neglectful
+neglectfully
+neglectfulness
+neglecting
+neglects
+negligee
+negligees
+negligence
+negligent
+negligently
+negligibility
+negligible
+negligibly
+negotiability
+negotiable
+negotiant
+negotiate
+negotiated
+negotiates
+negotiating
+negotiation
+negotiations
+negotiator
+negotiators
+negotiatory
+Negress
+negresses
+negrillo
+Negritic
+Negrito
+negritude
+Negro
+Negro's
+Negroes
+negroid
+Negroization
+Negroization's
+Negroizations
+Negroize
+Negroizes
+Negrophil
+negrophile
+negrophilism
+Negrophobe
+negropont
+negros
+Negus
+Nehemiah
+Nehru
+Nehru's
+neigh
+neighbor
+neighbor's
+neighbored
+neighborer
+neighborer's
+neighborers
+neighborhood
+neighborhood's
+neighborhoods
+neighboring
+neighborings
+neighborless
+neighborlesses
+neighborlike
+neighborlike's
+neighborlikes
+neighborliness
+neighborly
+neighbors
+neighborship
+neighborship's
+neighborships
+Neil
+Neil's
+neisse
+neither
+Nejd
+nek
+Nekrasov
+nekton
+Nell
+Nell's
+Nellie
+Nellie's
+Nelly
+Nelsen
+Nelsen's
+Nelson
+nelson
+neman
+nemathelminth
+nematic
+nematicidal
+nematicide
+nematocyst
+nematode
+nematodes
+Nembutal
+nemea
+Nemean
+nemertean
+nemery
+nemeses
+Nemesia
+nemesis
+nemophila
+nene
+neo
+neoanthropic
+neoarsphenamine
+Neocene
+neoclassic
+neoclassical
+neoclassicism
+neoclassicist
+neocolonialism
+neoconservative
+neocortex
+neocosmic
+neodymium
+neofascism
+Neogaea
+Neogene
+neogenesis
+neogenetic
+neoglycolipid
+neoglycolipids
+neoimpressionism
+neoliberalism
+neolith
+neolithic
+neological
+neologism
+neologism's
+neologisms
+neologistic
+neologization
+neologize
+neologized
+neologizes
+neologizing
+neology
+neomycin
+neon
+neonatal
+neonatally
+neonate
+neoned
+neoorthodox
+neoorthodoxy
+neophyte
+neophytes
+neoplasia
+neoplasm
+neoplasms
+neoplastic
+neoplasticism
+neoplasticist
+neoplasticists
+neoplasty
+neoprene
+neoscholasticism
+neostigmine
+neotenic
+neoteny
+neoteric
+Neotropical
+neotype
+Neozoic
+Nepal
+Nepal's
+Nepali
+nepenthe
+nepenthean
+neper
+nephanalysis
+nepheline
+nephelinic
+nephelinite
+nephelinitic
+nephelite
+nephelometer
+nephelometer's
+nephelometers
+nephelometric
+nephelometry
+nephew
+nephew's
+nephews
+nephogram
+nephograph
+nephology
+nephometer
+nephometer's
+nephometers
+nephoscope
+nephralgia
+nephrectomy
+nephridium
+nephrite
+nephritic
+nephritis
+nephron
+nephrosis
+nephrotomy
+nepos
+nepotism
+nepotist
+nepotistic
+nepotists
+Neptune
+Neptunian
+neptunium
+neral
+nereid
+Nereis
+nereus
+Neri
+neritic
+nernst
+Nero
+neroli
+neruda
+nerva
+nerval
+nervate
+nervation
+nervations
+nerve
+nerve's
+nerved
+nerveless
+nervelessly
+nervelessness
+nerves
+nervier
+nervine
+nerviness
+nerving
+nervosity
+nervous
+nervously
+nervousness
+nervure
+nervy
+nescience
+nesciences
+nescient
+nesh
+Ness
+nesselrode
+nessus
+nest
+nested
+nester
+nesting
+nestle
+nestled
+nestler
+nestles
+nestling
+Nestor
+Nestorianism
+nestorius
+nests
+net
+net's
+netaji
+netball
+nether
+Netherlands
+nethermost
+netherworld
+netkeeper
+netless
+netlike
+neto
+nets
+netsuke
+nett
+netted
+netter
+netting
+nettle
+nettled
+nettles
+nettlesome
+nettling
+netty
+network
+network's
+networked
+networking
+networks
+Neubrandenburg
+Neumann
+neumatic
+neume
+neural
+neuralgia
+neuralgic
+neurally
+neurasthenia
+neurasthenic
+neurectomy
+neurilemma
+neuritic
+neuritis
+neuro
+neuroanatomic
+neuroanatomy
+neuroanotomy
+neurobiology
+neurobiology's
+neuroblast
+neuroblastoma
+neurochemistry
+neurocirculatory
+neurocoele
+neuroendocrine
+neuroepithelial
+neurofibril
+neurofibrillary
+neurogenic
+neurogenically
+neuroglia
+neuroglial
+neurogram
+neurohypophysis
+neurolemma
+neurological
+neurologically
+neurologist
+neurologists
+neurology
+neuroma
+neuromuscular
+neuron
+neuron's
+neuronal
+neuronic
+neurons
+neuropath
+neuropathic
+neuropathically
+neuropathology
+neuropathy
+neurophysiology
+neuropsychiatric
+neuropsychiatry
+neuropteran
+neuropterous
+neuroses
+neurosis
+neurospora
+neurosurgeon
+neurosurgery
+neurosurgical
+neurotic
+neurotically
+neuroticism
+neuroticize
+neuroticizes
+neurotomy
+neurotoxic
+neurotoxicity
+neurotoxin
+neurotransmitter
+neurotransmitters
+neurotropic
+neurovascular
+neusatz
+neuss
+neustria
+neuter
+neutercane
+neutered
+neuterer
+neuterers
+neutering
+neuterings
+neuters
+neutral
+neutralism
+neutralist
+neutralistic
+neutralists
+neutralities
+neutrality
+neutralization
+neutralization's
+neutralizations
+neutralize
+neutralized
+neutralizer
+neutralizers
+neutralizes
+neutralizing
+neutrally
+neutralness
+neutrals
+neutretto
+neutrino
+neutrino's
+neutrinos
+neutron
+neutronium
+neutrons
+neutrophil
+neutrophile
+neutrophilic
+neutrophilis
+neutrophils
+Neva
+Neva's
+Nevada
+neve
+never
+nevermore
+nevers
+nevertheless
+Neville
+Nevins
+Nevis
+Nevski
+nevus
+New
+new
+Newark
+Newbold
+Newbold's
+newborn
+newborns
+Newburg
+Newbury
+newbury
+Newburyport
+Newcastle
+Newcombe
+Newcomen
+newcomer
+newcomer's
+newcomers
+newel
+Newell
+newer
+newest
+newfangled
+newfangledness
+Newfie
+newfound
+newfoundland
+Newgate
+Newham
+Newhaven
+newish
+newline
+newline's
+newlines
+newly
+newlywed
+newlyweds
+Newman
+Newmanize
+Newmanizes
+Newmarket
+newness
+Newport
+news
+NeWS
+newsagent
+newsagents
+newsboy
+newsboys
+newsbreak
+newscast
+newscaster
+newscasters
+newscasting
+newscasts
+newsgroup
+newsgroup's
+newsgroups
+newshawk
+newsier
+newsiness
+newsless
+newsletter
+newsletter's
+newsletters
+newsmagazine
+newsman
+newsmen
+newsmonger
+newspaper
+newspaper's
+newspaperized
+newspaperized's
+newspaperizeds
+newspaperman
+newspapermen
+newspapers
+newspeak
+newsprint
+newsreel
+newsroom
+newsstand
+Newsweek
+Newsweekly
+newswire
+newsworthiness
+newsworthy
+newsy
+newt
+newton
+Newton
+Newton's
+Newtonabbey
+Newtonian
+Newtown
+newts
+next
+nexus
+nexuses
+ney
+nez
+NFS
+Ngaio
+Ngaliema
+NGK
+Ngoma
+Nguni
+Nguyen
+Nguyen's
+Ngwee
+NH
+Nha
+niacin
+Niagara
+Niamey
+Niamey's
+nib
+nibble
+nibbled
+nibbler
+nibblers
+nibbles
+nibbling
+Nibelung
+nibelungenlied
+niblick
+nibs
+Nicaea
+Nicaean
+Nicaragua
+niccolo
+Niccolo
+nice
+Nice
+nicely
+Nicene
+niceness
+nicer
+nicest
+niceties
+nicety
+niche
+niches
+niching
+Nicholas
+Nicholls
+Nichols
+Nicholson
+nichrome
+Nicias
+nick
+nicked
+nickel
+nickel's
+nickeled
+nickelic
+nickeliferous
+nickeling
+nickelization
+nickelization's
+nickelizations
+nickelize
+nickelizes
+nickelodeon
+nickelous
+nickels
+nicker
+nickered
+nickering
+nicking
+Nicklaus
+nicklaus
+nicknack
+nickname
+nicknamed
+nicknameless
+nicknamer
+nicknames
+nickpoint
+nicks
+Nicobar
+Nicodemus
+Nicol
+Nicola
+Nicolai
+Nicolesco
+Nicolson
+Nicosia
+Nicosia's
+Nicotiana
+nicotinamide
+nicotine
+nicotinic
+nicotinism
+nicotinize
+nicotinizes
+nictheroy
+nictitate
+nictitating
+nidaros
+niddering
+nide
+nidicolous
+nidification
+nidifugous
+nidify
+nidus
+niebuhr
+niece
+niece's
+nieces
+Niedersachsen
+niello
+Nielsen
+Nielson
+niemen
+Niersteiner
+Nietszche
+Nietzsche
+nietzschean
+nieve
+niff
+Niflheim
+niftier
+nifties
+nifty
+Niger
+Niger's
+Nigeria
+Nigerian
+niggard
+niggardliness
+niggardly
+nigger
+niggle
+niggled
+niggler
+niggles
+niggling
+nigglingly
+nigh
+night
+night's
+nightcap
+nightclothes
+nightclub
+nightclubber
+nightclubs
+nightdress
+nighted
+nighters
+nightfall
+nightglow
+nightgown
+nighthawk
+nightie
+nighties
+nightingale
+nightingale's
+nightingales
+nightingalize
+nightingalizes
+nightlife
+nightlong
+nightly
+nightmare
+nightmare's
+nightmares
+nightmarish
+nightmarishly
+nightrider
+nights
+nightshade
+nightshirt
+nightside
+nightspot
+nightstand
+nightstick
+nighttide
+nighttime
+nightwalker
+nightwear
+nighty
+nigrescent
+nigrify
+nigritude
+NIH
+nihilianism
+nihilism
+nihilisms
+nihilist
+nihilistic
+nihilistically
+nihility
+nihon
+niigata
+nijinsky
+Nijinsky
+Nijmegen
+Nikaria
+Nike
+Nikko
+Nikko's
+Nikolai
+Nikolai's
+Nikolainkaupunki
+Nikolayev
+nil
+Nile
+nilgai
+nilgiri
+nill
+nilly
+nilmanifold
+Nilotic
+nilpotent
+Nilsen
+Nilsson
+nim
+nimble
+nimbleness
+nimbler
+nimblest
+nimblewit
+nimbly
+nimbostratus
+nimbus
+nimbused
+nimbuses
+NIMH
+nimiety
+Nimitz
+nimming
+nimonic
+Nimrod
+Nimwegen
+Nina
+nincompoop
+nincompoopery
+nine
+ninebark
+ninefold
+ninepin
+ninepins
+nines
+nineteen
+nineteens
+nineteenth
+nineties
+ninetieth
+ninety
+ninetyfold
+Nineveh
+Ningpo
+ningsia
+ninnies
+ninny
+ninnyhammer
+Ninon
+ninth
+ninus
+Niobe
+niobic
+niobium
+niobous
+niort
+nip
+nipa
+nipigon
+Nipissing
+nipped
+nipper
+nippers
+nippier
+nippily
+nippiness
+nipping
+nippingly
+nipple
+nipples
+nipplewort
+Nippon
+Nipponize
+Nipponizes
+nippur
+nippy
+nips
+nirvana
+nisei
+Nisei
+niseis
+Nishapur
+nishinomiya
+Nissen
+nisus
+nit
+nite
+niter
+nitid
+niton
+nitpick
+nitramine
+nitrate
+nitrated
+nitrates
+nitrating
+nitration
+nitrations
+nitrator
+nitric
+nitride
+nitriding
+nitridization
+nitridization's
+nitridizations
+nitridize
+nitridizes
+nitrification
+nitrifications
+nitrify
+nitrile
+nitrite
+nitro
+nitrobacteria
+nitrobenzene
+nitrocellulose
+nitrocellulosic
+nitrochloroform
+nitrofuran
+nitrogen
+nitrogenization
+nitrogenization's
+nitrogenizations
+nitrogenize
+nitrogenized
+nitrogenizes
+nitrogenizing
+nitrogenous
+nitroglycerin
+nitroglycerine
+nitrohydrochloric
+nitrometer
+nitromethane
+nitroparaffin
+nitros
+nitrosamine
+nitroso
+nitrosoamine
+nitrosyl
+nitrous
+nitty
+nitwit
+nitwitted
+Niue
+nival
+nivation
+niven
+niveous
+nivernais
+nix
+nixed
+nixer
+nixes
+nixie
+nixing
+Nixon
+Nizam
+nizhni
+NJ
+njord
+nkomo
+nkrumah
+NM
+nm
+NMR
+NNE
+NNW
+no
+NOAA
+Noachian
+Noah
+nob
+nobbier
+nobble
+nobbled
+nobbling
+nobbut
+nobby
+Nobel
+nobelium
+nobiliary
+nobilities
+nobility
+noble
+Noble
+nobleman
+noblemen
+nobleness
+nobler
+nobles
+noblesse
+noblest
+noblewoman
+nobly
+nobodies
+nobody
+nobody's
+nocent
+noces
+nociceptive
+nock
+nocking
+noctambulation
+noctambulism
+noctambulist
+Noctiluca
+noctilucent
+noctuid
+noctule
+nocturn
+nocturnal
+nocturnally
+nocturne
+nocuous
+nocuously
+nod
+nod's
+nodal
+nodality
+nodally
+nodded
+nodder
+noddies
+nodding
+noddle
+noddy
+node
+node's
+nodes
+nodi
+nodical
+nodose
+nodosity
+nods
+nodular
+nodulation
+nodule
+nodules
+nodulize
+nodulizes
+nodus
+Noel
+noes
+noesis
+Noetherian
+noetic
+nofretete
+nog
+noggin
+nogging
+Noguchi
+noh
+nohow
+noil
+noise
+noised
+noiseless
+noiselessly
+noisemake
+noisemaker
+noisemakers
+noisemaking
+noises
+noisette
+noisier
+noisily
+noisiness
+noising
+noisome
+noisomely
+noisomeness
+noisy
+Nolan
+Nolan's
+nolde
+Noll
+Noll's
+nolle
+nolo
+noma
+nomad
+nomadic
+nomadism
+nomadization
+nomadization's
+nomadizations
+nomadize
+nomadized
+nomadizes
+nomadizing
+nomads
+nomarch
+nomarchy
+nombles
+nombril
+nome
+nomen
+nomenclator
+nomenclatorial
+nomenclatural
+nomenclature
+nomenclatures
+nomic
+nomina
+nominal
+nominalism
+nominalist
+nominalistic
+nominalize
+nominalized
+nominalizes
+nominalizing
+nominally
+nominate
+nominated
+nominates
+nominating
+nomination
+nomination's
+nominations
+nominative
+nominatively
+nominator
+nominators
+nominee
+nominees
+nomism
+nomocracy
+nomogram
+nomogram's
+nomograms
+nomograph
+nomographer
+nomographic
+nomographically
+nomographies
+nomography
+nomological
+nomology
+nomothetic
+non
+nonacid
+nonacknowledgment
+nonacknowledgment's
+nonacknowledgments
+nonactive
+nonadjacent
+nonage
+nonagenarian
+nonaggression
+nonagon
+nonagricultural
+nonaligned
+nonallelic
+nonanalytic
+nonanesthetized
+nonanoic
+nonapostatizing
+nonapostatizing's
+nonapostatizings
+nonappearance
+nonbank
+nonblank
+nonblanks
+nonblocking
+nonbook
+nonbusiness
+noncalcareous
+noncanonization
+noncanonization's
+noncanonizations
+noncarbohydrate
+noncartelized
+noncartelized's
+noncartelizeds
+noncatechizable
+noncatechizable's
+noncatechizables
+noncausal
+nonce
+nonchalance
+nonchalant
+nonchalantly
+nonchalantness
+noncharitable
+noncivilized
+noncivilized's
+noncivilizeds
+noncoloring
+noncoloring's
+noncolorings
+noncom
+noncombatant
+noncommissioned
+noncommittal
+noncommittally
+noncompliance
+noncomputable
+nonconcurrence
+nonconcurrency
+noncondensing
+nonconducting
+nonconductor
+nonconductors
+nonconfidence
+nonconform
+nonconformable
+nonconformably
+nonconformance
+nonconformer
+nonconforming
+nonconformism
+nonconformist
+nonconformists
+nonconformity
+nonconservative
+noncontiguous
+noncontributory
+noncooperation
+noncooperationist
+noncooperative
+noncooperator
+noncritical
+noncrossing
+noncrystallizable
+noncrystallizable's
+noncrystallizables
+noncrystallized
+noncrystallized's
+noncrystallizeds
+noncrystallizing
+noncrystallizing's
+noncrystallizings
+noncurrent
+noncyclic
+nondecreasing
+nondeductibility
+nondeductible
+nondefense
+nondefense's
+nondefenses
+nondeforming
+nondegenerate
+nondemobilization
+nondemobilization's
+nondemobilizations
+nondemocratic
+nondescript
+nondescriptly
+nondestructive
+nondestructively
+nondeterminacy
+nondeterminate
+nondeterminately
+nondeterminism
+nondeterministic
+nondeterministically
+nondialyzing
+nondialyzing's
+nondialyzings
+nondimensionalize
+nondimensionalized
+nondirected
+nondirectional
+nondirective
+nondisclosure
+nondisclosures
+nondiscriminatory
+nondisjunction
+nondisjunctional
+nondispersive
+nondistinctive
+nondivided
+nondormant
+nondramatic
+nondrying
+nondurable
+none
+noneconomic
+noneconomist
+noneffective
+nonego
+nonelectrolyte
+nonemergency
+nonempty
+nonentities
+nonentity
+nonequivalence
+nonequivalent
+nones
+nonessential
+nonesuch
+nonet
+nonetheless
+noneuclidean
+nonevent
+nonexecutable
+nonexistence
+nonexistent
+nonextensible
+nonfat
+nonfavorite
+nonfavorite's
+nonfavorites
+nonfeasance
+nonferrous
+nonfiction
+nonfictional
+nonfigurative
+nonflammable
+nonflowering
+nonfragmenting
+nonfulfillment
+nonfulfillment's
+nonfulfillments
+nonfunctional
+nong
+nongalvanized
+nongalvanized's
+nongalvanizeds
+nongelatinizing
+nongelatinizing's
+nongelatinizings
+nongovernment
+nongovernmental
+nonharmonic
+nonhierarchic
+nonhierarchical
+nonhuman
+nonhydrolyzable
+nonhydrolyzable's
+nonhydrolyzables
+nonidentical
+nonillion
+nonimmunized
+nonimmunized's
+nonimmunizeds
+nonimpact
+nonimpinging
+noninductive
+noninteger
+noninteracting
+noninterference
+nonintersecting
+nonintervention
+noninterventionist
+nonintuitive
+noninvertible
+noninverting
+noninvolvement
+nonionic
+nonionized
+nonionized's
+nonionizeds
+nonionizing
+nonionizing's
+nonionizings
+nonjoinder
+nonjuring
+nonjuror
+nonlinear
+nonlinearities
+nonlinearity
+nonlinearity's
+nonlinearly
+nonlinguist
+nonlinguistic
+nonliterary
+nonliterate
+nonloaded
+nonlocal
+nonlocalized
+nonlocalized's
+nonlocalizeds
+nonmagical
+nonmagnetizable
+nonmagnetizable's
+nonmagnetizables
+nonmatching
+nonmetal
+nonmetallic
+nonmoral
+nonmultiple
+nonnegative
+nonnitrogenized
+nonnitrogenized's
+nonnitrogenizeds
+nonnucleated
+nonnumeric
+nono
+nonobjective
+nonobjectivism
+nonobjectivist
+nonobjectivity
+nonobservance
+nonoccurrence
+nonogenarian
+nonorganization
+nonorganization's
+nonorganizations
+nonorthogonal
+nonorthogonality
+nonowner
+nonowners
+nonoxidizable
+nonoxidizable's
+nonoxidizables
+nonoxidizing
+nonoxidizing's
+nonoxidizings
+nonparallel
+nonparametric
+nonparametrical
+nonparametrics
+nonpareil
+nonparlor
+nonparlor's
+nonparlors
+nonparous
+nonparticipant
+nonparticipating
+nonparticipation
+nonpartisan
+nonpartisanship
+nonparty
+nonpast
+nonpaternity
+nonpathogenic
+nonpayment
+nonpenalized
+nonpenalized's
+nonpenalizeds
+nonperishable
+nonpermanent
+nonpersonal
+nonperturbing
+nonphosphorized
+nonphosphorized's
+nonphosphorizeds
+nonplus
+nonpluses
+nonpoisonous
+nonpolar
+nonpolarizable
+nonpolarizable's
+nonpolarizables
+nonpolarized
+nonpolarizing
+nonpolarizing's
+nonpolarizings
+nonpolitical
+nonporous
+nonpositive
+nonpossession
+nonpossessor
+nonprescription
+nonprint
+nonprinting
+nonprocedural
+nonprocedurally
+nonproducer
+nonproductive
+nonproductively
+nonproductiveness
+nonprofessional
+nonprofessionally
+nonprofit
+nonprofitable
+nonprogrammable
+nonprogrammer
+nonprogressive
+nonproliferation
+nonpros
+nonprossed
+nonprossing
+nonprotein
+nonracial
+nonrandom
+nonrationalized
+nonrationalized's
+nonrationalizeds
+nonreactive
+nonreader
+nonrealistic
+nonrealization
+nonrealization's
+nonrealizations
+nonreclosing
+nonrecognized
+nonrecognized's
+nonrecognizeds
+nonrecording
+nonrecursive
+nonrecursively
+nonreducing
+nonredundant
+nonregulation
+nonreimbursable
+nonrelativistic
+nonrelevance
+nonrelevant
+nonreligious
+nonremovable
+nonrenewable
+nonrepresentational
+nonrepresentationalism
+nonrepresentative
+nonresidence
+nonresidency
+nonresident
+nonresidential
+nonresistance
+nonresistant
+nonrespondent
+nonrespondents
+nonresponse
+nonrestraint
+nonrestricted
+nonrestrictive
+nonretractable
+nonreturnable
+nonrigid
+nonscheduled
+nonschematized
+nonschematized's
+nonschematizeds
+nonscientific
+nonseasonal
+nonsecretor
+nonsectarian
+nonsegregated
+nonsegregation
+nonsense
+nonsensical
+nonsensically
+nonsensicalness
+nonsensitized
+nonsensitized's
+nonsensitizeds
+nonsequenced
+nonsignificant
+nonsignificantly
+nonsingular
+nonskid
+nonslip
+nonsmoker
+nonsmokers
+nonsocial
+nonspecialist
+nonspecialist's
+nonspecialists
+nonspecialized
+nonspecialized's
+nonspecializeds
+nonspecific
+nonsporting
+nonstandard
+nonstandardized
+nonstandardized's
+nonstandardizeds
+nonstarter
+nonstative
+nonstick
+nonstop
+nonstriated
+nonstylized
+nonstylized's
+nonstylizeds
+nonsuch
+nonsuit
+nonsupervisory
+nonsupport
+nonsyllabic
+nonsympathizer
+nonsympathizer's
+nonsympathizers
+nonsynchronous
+nonsynthesized
+nonsynthesized's
+nonsynthesizeds
+nontechnical
+nontechnically
+nontemporal
+nontemporizing
+nontemporizing's
+nontemporizings
+nontenure
+nonterminal
+nonterminal's
+nonterminals
+nonterminating
+nontermination
+nontrivial
+nonuniform
+nonunion
+nonunionism
+nonuse
+nonuser
+nonutilized
+nonutilized's
+nonutilizeds
+nonverbal
+nonverbally
+nonveteran
+nonveterans
+nonviable
+nonviolence
+nonviolent
+nonviolently
+nonvisualized
+nonvisualized's
+nonvisualizeds
+nonvocal
+nonvolatile
+nonvolatilized
+nonvolatilized's
+nonvolatilizeds
+nonvolunteer
+nonvolunteers
+nonvoter
+nonvoting
+nonvulcanizable
+nonvulcanizable's
+nonvulcanizables
+nonwhite
+nonworker
+nonzero
+noodle
+noodled
+noodles
+noodling
+nook
+nook's
+nooks
+noon
+noonday
+nooning
+noons
+noontide
+noontime
+noordbrabant
+Noordholland
+noose
+nooses
+noosing
+nopal
+nope
+nor
+Nora
+Nora's
+noradrenalin
+noradrenaline
+nord
+nordau
+Nordhoff
+Nordhoff's
+Nordic
+Nordkyn
+Nordstrom
+Nordstrom's
+Noreen
+Noreen's
+norepinephrine
+Norfolk
+norge
+noria
+noricum
+norite
+nork
+Norland
+norm
+norm's
+Norma
+normal
+normalcy
+normality
+normalizable
+normalization
+normalization's
+normalizations
+normalize
+normalized
+normalizer
+normalizers
+normalizes
+normalizing
+normally
+normals
+Norman
+Normandy
+Normanization
+Normanization's
+Normanizations
+Normanize
+Normanized
+Normanizer
+Normanizers
+Normanizes
+Normanizing
+Normanton
+normative
+normatively
+normativeness
+normed
+normotensive
+norms
+Norn
+norodom
+Norris
+Norristown
+Norse
+Norseman
+north
+north's
+Northallerton
+Northampton
+Northamptonshire
+northbound
+Northcliffe
+Northcountryman
+northeast
+northeaster
+northeasterly
+northeastern
+northeasternmost
+northeastward
+northeastwards
+norther
+northerly
+northern
+northerner
+northerners
+northernize
+northernizes
+northernly
+northernmost
+northers
+Northfield
+northing
+northland
+Northman
+Northmen
+northmost
+Northrop
+Northrop's
+Northrup
+Northrup's
+norths
+Northumberland
+Northumbria
+Northumbrian
+Northumbrians
+northward
+northwards
+northwest
+northwester
+northwesterly
+northwestern
+northwestward
+northwestwards
+Northwich
+Norton
+Norwalk
+Norway
+Norwegian
+Norwich
+nose
+nosebag
+nosebag's
+nosebags
+noseband
+nosebleed
+nosebleed's
+nosebleeds
+nosed
+nosegay
+nosepiece
+noses
+nosey
+noseying
+nosh
+nosher
+nosier
+nosily
+nosiness
+nosing
+nosize
+nosography
+nosologic
+nosological
+nosologically
+nosology
+nostalgia
+nostalgic
+nostalgically
+Nostoc
+nostology
+Nostradamus
+Nostrand
+Nostrand's
+nostril
+nostril's
+nostrils
+nostrum
+nosy
+not
+nota
+notability
+notable
+notableness
+notables
+notably
+notarial
+notarially
+notarius
+notarization
+notarizations
+notarize
+notarized
+notarizes
+notarizing
+notary
+notate
+notated
+notates
+notating
+notation
+notation's
+notational
+notationally
+notations
+notative
+notch
+notched
+notches
+notching
+note
+notebook
+notebook's
+notebooks
+notecase
+noted
+notedly
+notedness
+noteless
+notelet
+notepaper
+noter
+notes
+noteworthily
+noteworthiness
+noteworthy
+nothing
+nothingize
+nothingizes
+nothingness
+nothings
+notice
+noticeable
+noticeably
+noticeboard
+noticeboards
+noticed
+notices
+noticing
+notifiable
+notification
+notifications
+notified
+notifier
+notifiers
+notifies
+notify
+notifying
+noting
+notion
+notional
+notionality
+notionally
+notions
+notitia
+notochord
+notocord
+Notogaea
+notoriety
+notorious
+notoriously
+notoriousness
+Notornis
+Nototherium
+Notour
+Notre
+Nottingham
+Nottinghamshire
+notum
+Notus
+notwithstanding
+nougat
+noumenon
+noun
+noun's
+nouncing
+nounize
+nounizes
+nouns
+nourish
+nourished
+nourisher
+nourishes
+nourishing
+nourishment
+nous
+nouveau
+nouvelle
+Nov
+nova
+nova's
+novaculite
+novae
+Novak
+Novak's
+novalis
+novara
+novas
+novation
+novaya
+novel
+novel's
+novelese
+novelette
+novelettish
+novelist
+novelist's
+novelistic
+novelists
+novelization
+novelization's
+novelizations
+novelize
+novelized
+novelizer
+novelizers
+novelizes
+novelizing
+novella
+novelle
+novello
+novels
+novelties
+novelty
+novelty's
+November
+November's
+Novembers
+novemdecillion
+novena
+novercal
+Novgorod
+novice
+novice's
+novices
+novitiate
+novitiates
+novocaine
+Novokuznetsk
+Novosibirsk
+Novosibirsk's
+now
+nowaday
+nowadays
+noway
+noways
+nowel
+nowhence
+nowhere
+nowheres
+nowhither
+nowise
+nows
+nowt
+nox
+noxious
+noxiously
+noxiousness
+noyade
+noyau
+noyes
+Noyes
+noyon
+nozzle
+nozzles
+NRC
+nroff
+nroff's
+NSF
+nth
+NTIS
+NTP
+nu
+nuance
+nuanced
+nuances
+nub
+Nuba
+nubbin
+nubble
+nubbles
+nubbly
+nubecula
+Nubia
+Nubia's
+Nubian
+nubians
+nubile
+nubility
+Nucci
+nucellar
+nucelli
+nucellus
+nucha
+nuchal
+nucleant
+nuclear
+nuclease
+nucleate
+nucleated
+nucleation
+nucleator
+nuclei
+nucleic
+nuclein
+nucleocapsid
+nucleolar
+nucleoli
+nucleolus
+nucleon
+nucleon's
+nucleonic
+nucleonics
+nucleons
+nucleophile
+nucleophilic
+nucleophilically
+nucleophilicity
+nucleoplasm
+nucleoplasmatic
+nucleoplasmic
+nucleoprotein
+nucleoside
+nucleosynthesis
+nucleotidase
+nucleotide
+nucleotide's
+nucleotides
+nucleus
+nucleuses
+nuclide
+nuclidic
+nuddy
+nude
+nudely
+nudeness
+nuder
+nudes
+nudest
+nudge
+nudged
+nudger
+nudges
+nudging
+nudibranch
+nudicaul
+nudism
+nudist
+nudists
+nudity
+nudum
+nuevo
+Nuffield
+nugatory
+Nugent
+nugent
+nuggar
+nugget
+nuggets
+nuggety
+nuisance
+nuisance's
+nuisances
+nuissance
+nuke
+nukus
+null
+nullah
+nullarbor
+nulled
+nullification
+nullificationist
+nullifidian
+nullified
+nullifier
+nullifiers
+nullifies
+nullify
+nullifying
+nullipara
+nulliparous
+nullity
+nulls
+Nullstellensatz
+numantia
+numb
+numbat
+numbed
+number
+numberable
+numbered
+numberer
+numbering
+numberless
+numberplate
+numbers
+numbfish
+numbing
+numbingly
+numbles
+numbly
+numbness
+numbs
+numbskull
+numdah
+numen
+numerable
+numeral
+numeral's
+numerally
+numerals
+numerary
+numerate
+numerated
+numerates
+numerating
+numeration
+numerations
+numerator
+numerator's
+numerators
+numeric
+numerical
+numerically
+numerics
+numerological
+numerology
+numerous
+numerously
+numerousness
+numia
+numidia
+numinous
+numis
+numismatic
+numismatically
+numismatics
+numismatist
+nummary
+nummular
+nummulite
+numnah
+numskull
+nun
+nun's
+nunatak
+nunc
+nunciation
+nunciature
+nuncio
+nuncle
+nuncupate
+nuncupation
+nuncupative
+Nuneaton
+nunes
+nunhood
+nunnery
+nunny
+nuns
+nuovo
+Nupe
+nuptial
+nuptiality
+nuptialize
+nuptializes
+nuptials
+Nuremberg
+nureyev
+nuri
+nuristan
+nurmi
+nurse
+nurse's
+nursed
+nursemaid
+nurser
+nurseries
+nursery
+nursery's
+nurserymaid
+nurseryman
+nurses
+nursing
+nursling
+nurtural
+nurturant
+nurture
+nurtured
+nurturer
+nurtures
+nurturing
+nusa
+nut
+nut's
+nutant
+nutate
+nutated
+nutates
+nutating
+nutation
+nutational
+nutbrown
+nutcase
+nutcrack
+nutcracker
+nutgall
+nuthatch
+nuthouse
+nutlet
+nutlike
+nutmeg
+nutria
+nutrient
+nutrients
+nutriment
+nutrition
+nutrition's
+nutritional
+nutritionally
+nutritionist
+nutritionists
+nutritious
+nutritiously
+nutritiousness
+nutritive
+nutritively
+nuts
+nutshell
+nutted
+nutter
+nuttier
+nuttiness
+nutting
+nutty
+nutwood
+nux
+nuzzle
+nuzzled
+nuzzles
+nuzzling
+NV
+NW
+NY
+nyala
+Nyanja
+nyanza
+nyasa
+Nyasaland
+NYC
+nyctaginaceous
+nyctalopia
+nyctinasty
+nyctitropism
+nyctophobia
+nye
+nyeman
+nyerere
+nylghau
+nylon
+nylons
+nymph
+nympha
+nymphaeaceous
+nymphal
+nymphalid
+nymphet
+nymphette
+nympho
+nympholepsy
+nympholept
+nymphomania
+nymphomaniac
+nymphomaniacal
+nymphomaniacs
+nymphs
+Nynorsk
+Nyoro
+Nyquist
+Nyquist's
+NYSE
+nystagmic
+nystagmus
+nystatin
+NYT
+NYU
+nyx
+O'Brien
+O'Brien's
+o'clock
+O'Clock
+O'Connell
+O'Connell's
+O'Connor
+O'Connor's
+O'Dell
+O'Dell's
+O'Donnell
+O'Donnell's
+O'Dwyer
+O'Dwyer's
+o'er
+O'Er
+O'Hare
+O'Hare's
+O'Leary
+O'Leary's
+O'Neill
+O'Neill's
+o's
+O'Shea
+O'Shea's
+O'Sullivan
+O'Sullivan's
+oaf
+oafish
+oafishly
+oafishness
+oafs
+Oahu
+oak
+oaken
+Oakham
+Oakland
+Oakley
+Oakmont
+oaks
+oakum
+Oakville
+oakwood
+oar
+oar's
+oared
+oarfish
+oaring
+oarlock
+oars
+oarsman
+oarsmanship
+oases
+oasis
+oast
+oat
+oatcake
+oatcake's
+oatcakes
+oaten
+oater
+oates
+oath
+oaths
+oatmeal
+oats
+Oaxaca
+oba
+Obadiah
+oban
+obasanjo
+obbligato
+obconic
+obcordate
+obduracy
+obdurate
+obdurately
+obdurateness
+obeah
+obedience
+obediences
+obedient
+obedientiary
+obediently
+obeisance
+obeisant
+obeisantly
+obelisk
+obelize
+obelized
+obelizes
+obelizing
+Oberammergau
+Oberhausen
+Oberland
+Oberlin
+Oberon
+obese
+obesity
+obey
+obeyed
+obeyer
+obeying
+obeys
+obfuscate
+obfuscated
+obfuscater
+obfuscates
+obfuscating
+obfuscation
+obfuscations
+obfuscatory
+obi
+obit
+obiter
+obituaries
+obituary
+object
+object's
+objected
+objectification
+objectifications
+objectified
+objectifies
+objectify
+objectifying
+objecting
+objection
+objection's
+objectionable
+objectionableness
+objectionably
+objections
+objective
+objectively
+objectiveness
+objectives
+objectivism
+objectivist
+objectivistic
+objectivity
+objectivize
+objectivizes
+objectization
+objectization's
+objectizations
+objectize
+objectizes
+objectless
+objectlessness
+objector
+objector's
+objectors
+objects
+objurgate
+objurgated
+objurgates
+objurgating
+objurgation
+objurgations
+objurgatory
+oblanceolate
+oblast
+oblate
+oblately
+oblateness
+oblation
+oblations
+obligate
+obligated
+obligately
+obligates
+obligating
+obligation
+obligation's
+obligational
+obligations
+obligato
+obligator
+obligatorily
+obligatory
+oblige
+obliged
+obligee
+obliger
+obliges
+obliging
+obligingly
+obligingness
+obligor
+obligors
+oblique
+obliquely
+obliqueness
+obliquity
+obliterate
+obliterated
+obliterates
+obliterating
+obliteration
+obliterations
+obliterative
+obliteratively
+obliterator
+obliviated
+obliviates
+obliviating
+oblivion
+oblivionize
+oblivionizes
+oblivions
+oblivious
+obliviously
+obliviousness
+oblong
+oblongatal
+oblongated
+oblongish
+oblongly
+oblongness
+obloquious
+obloquy
+obmutescence
+obnoxious
+obnoxiously
+obnoxiousness
+obnubilate
+obnubilated
+obnubilates
+obnubilating
+obnubilation
+obnubilations
+oboe
+oboes
+oboist
+obolus
+obote
+obovate
+obovoid
+Obraztsova
+obreption
+obscene
+obscenely
+obscenities
+obscenity
+obscurant
+obscurantic
+obscurantism
+obscurantist
+obscuration
+obscurations
+obscure
+obscured
+obscurely
+obscureness
+obscurer
+obscures
+obscuring
+obscurities
+obscurity
+obscurum
+obsecrate
+obsequent
+obsequies
+obsequious
+obsequiously
+obsequiousness
+obsequy
+observable
+observably
+observance
+observance's
+observances
+observant
+observantly
+observation
+observation's
+observational
+observationally
+observations
+observatories
+observatory
+observe
+observed
+observer
+observers
+observes
+observing
+observingly
+obsess
+obsessed
+obsesses
+obsession
+obsession's
+obsessional
+obsessionally
+obsessions
+obsessive
+obsessively
+obsessiveness
+obsidian
+obsolesce
+obsolescence
+obsolescent
+obsolescently
+obsolete
+obsoleted
+obsoletely
+obsoleteness
+obsoletes
+obsoleting
+obstacle
+obstacle's
+obstacles
+obstetric
+obstetrical
+obstetrically
+obstetrician
+obstetrician's
+obstetricians
+obstetrics
+obstinacy
+obstinate
+obstinately
+obstinateness
+obstipation
+obstreperous
+obstreperously
+obstreperousness
+obstruct
+obstructed
+obstructer
+obstructing
+obstruction
+obstruction's
+obstructionism
+obstructionist
+obstructionistic
+obstructions
+obstructive
+obstructively
+obstructiveness
+obstructor
+obstructs
+obstruent
+obtain
+obtainability
+obtainable
+obtainably
+obtained
+obtainer
+obtaining
+obtainment
+obtains
+obtect
+obtected
+obtest
+obtestation
+obtrude
+obtruded
+obtruder
+obtrudes
+obtruding
+obtrusion
+obtrusive
+obtrusively
+obtrusiveness
+obtund
+obturate
+obturated
+obturates
+obturating
+obturation
+obturator
+obtuse
+obtusely
+obtuseness
+obtuser
+obtusest
+obverse
+obversely
+obvert
+obviate
+obviated
+obviates
+obviating
+obviation
+obviations
+obvious
+obviously
+obviousness
+obvolute
+oca
+ocarina
+Occam
+Occam's
+occas
+occasion
+occasional
+occasionalism
+occasionally
+occasioned
+occasioning
+occasionings
+occasions
+occident
+occidental
+Occidentalization
+Occidentalization's
+Occidentalizations
+Occidentalize
+Occidentalized
+Occidentalizes
+Occidentalizing
+occidentally
+occipital
+occipitally
+occiput
+occlude
+occluded
+occludent
+occludes
+occluding
+occlusal
+occlusion
+occlusion's
+occlusions
+occlusive
+occular
+occult
+occultate
+occultation
+occultations
+occulter
+occultism
+occultist
+occultly
+occupancies
+occupancy
+occupant
+occupant's
+occupants
+occupation
+occupation's
+occupational
+occupationally
+occupations
+occupied
+occupier
+occupiers
+occupies
+occupy
+occupying
+occur
+occurred
+occurrence
+occurrence's
+occurrences
+occurrent
+occurring
+occurs
+ocean
+ocean's
+oceana
+oceanarium
+oceanfront
+oceangoing
+Oceania
+oceanic
+oceanid
+oceanographer
+oceanographer's
+oceanographers
+oceanographic
+oceanographical
+oceanographically
+oceanography
+oceanologic
+oceanological
+oceanologically
+oceanologist
+oceanology
+oceans
+oceanside
+oceanus
+ocellar
+ocellate
+ocellated
+ocellation
+ocelli
+ocellus
+ocelot
+och
+ocher
+ocher's
+ocherous
+ochers
+ochlocracy
+ochlocrat
+ochlocratic
+ochlocratical
+ochlophobia
+Ochman
+ochone
+ochrea
+ockeghem
+ocker
+Ockham
+ocode
+oconomowoc
+Oconomowoc
+ocotillo
+Ocrea
+Oct
+octachord
+octad
+octadecyl
+octagon
+octagonal
+octagonally
+octagons
+octahedra
+octahedral
+octahedrally
+octahedrite
+octahedron
+octal
+octals
+octamerous
+octameter
+octameter's
+octameters
+octandrious
+octane
+octanedioic
+octangle
+octangular
+Octans
+octant
+octant's
+octants
+octarchy
+octaroon
+octavalent
+octave
+octaves
+Octavia
+Octavian
+octavo
+octennial
+octet
+octile
+octillion
+October
+October's
+Octobers
+Octobrist
+octocentenary
+octodecillion
+octodecimo
+octogenarian
+octonary
+octoploid
+octoploidy
+octopod
+octopodan
+octopodous
+octopus
+octoroon
+octosyllabic
+octosyllable
+octroi
+octu
+octuple
+octylphenylether
+ocular
+ocularist
+oculist
+oculomotor
+odalisque
+odd
+oddball
+oddball's
+oddballs
+odder
+oddest
+oddfellow
+oddities
+oddity
+oddity's
+oddly
+oddment
+oddness
+odds
+ode
+ode's
+odea
+oded
+Odelsting
+odense
+oder
+Oderberg
+Oderberg's
+Oderbergs
+odes
+Odessa
+odeum
+odic
+odilo
+Odin
+odious
+odiously
+odiousness
+odium
+odoacer
+odograph
+odometer
+odometer's
+odometers
+odontalgia
+odontoblast
+Odontoglossum
+odontograph
+odontoid
+odontologst
+odontology
+odontophore
+odor
+odor's
+odorant
+odored
+odorful
+odoriferous
+odoriferously
+odoriferousness
+odorize
+odorized
+odorizer
+odorizes
+odorizing
+odorless
+odorlesses
+odorous
+odorously
+odorousness
+odors
+odovacar
+odra
+odyl
+Odysseus
+odyssey
+oecology
+Oedipal
+oedipal
+Oedipally
+Oedipus
+oeillade
+OEM
+OEM's
+OEMS
+oenology
+oenomel
+oenone
+oersted
+oestrin
+oestrogen
+oestrone
+oestrous
+oestrus
+oeuvre
+oeuvres
+of
+ofay
+off
+offa
+offal
+offaly
+offbeat
+offcast
+offcut
+offcuts
+Offenbach
+offend
+offended
+offender
+offenders
+offending
+offends
+offense
+offense's
+offenseless
+offenselesses
+offenselessly
+offenses
+offensive
+offensively
+offensiveness
+offensives
+offer
+offered
+offerer
+offerers
+offering
+offerings
+offers
+offertories
+offertory
+offhand
+offhanded
+offhandedly
+offhandedness
+office
+office's
+officeholder
+officeholders
+officemate
+officemates
+officer
+officer's
+officered
+officers
+offices
+official
+official's
+officialdom
+officialese
+officialism
+officialization
+officialization's
+officializations
+officialize
+officializes
+officially
+officials
+officiant
+officiary
+officiate
+officiated
+officiates
+officiating
+officiation
+officiations
+officinal
+officio
+officious
+officiously
+officiousness
+offing
+offish
+offishly
+offishness
+offline
+offload
+offloaded
+offloading
+offloads
+offprint
+offprints
+offramp
+offs
+offsaddle
+offscour
+offscouring
+offscreen
+offset
+offset's
+offsets
+offsetting
+offshoot
+offshore
+offside
+offspring
+offsprings
+offstage
+oft
+often
+oftener
+oftentimes
+ofttimes
+ogaden
+ogasawara
+ogbomosho
+Ogden
+ogdoad
+ogee
+ogeographically
+Ogham
+ogive
+ogle
+ogled
+ogler
+ogles
+Oglethorpe
+ogling
+Ogpu
+ogre
+ogreish
+ogress
+ogun
+Ogygian
+oh
+Ohio
+Ohio's
+ohm
+ohmage
+ohmic
+ohmically
+ohmmeter
+ohmmeter's
+ohmmeters
+ohms
+oho
+ohs
+Oidium
+oil
+oilbird
+oilcan
+oilcloth
+oilcup
+oiled
+oiler
+oilers
+oilfield
+oilfired
+oilier
+oiliest
+oilily
+oiliness
+oiling
+oilman
+oilmen
+oils
+oilseed
+oilseeds
+oilskin
+oilstone
+oily
+oink
+ointment
+ointments
+Oireachtas
+oise
+Oistrakh
+oita
+Ojibwa
+OK
+OK's
+oka
+okamoto
+Okamoto
+okapi
+okavango
+okay
+okay's
+Okayama
+okays
+oke
+Okeechobee
+Okefenokee
+Okhotsk
+Okie
+Okinawa
+Oklahoma
+Oklahoma's
+Oklahoman
+Oklahoman's
+okra
+okta
+Olaf
+olasticism
+Olav
+Olav's
+Olcott
+old
+Oldcastle
+olden
+Oldenburg
+older
+oldest
+oldfangled
+Oldham
+oldie
+oldies
+oldish
+oldness
+Oldsmobile
+oldster
+oldsters
+Olduvai
+oldwife
+oldy
+oleaceous
+oleaginous
+oleaginously
+oleaginousness
+oleander
+oleanders
+oleaster
+oleate
+olecranon
+olefin
+olefine
+olefinic
+Oleg
+oleg
+oleic
+olein
+oleograph
+oleomargarine
+oleophilic
+oleophobic
+oleoresin
+oleum
+olfaction
+olfactions
+olfactive
+olfactology
+olfactometer
+olfactometer's
+olfactometers
+olfactorily
+olfactory
+Olga
+olibanum
+olid
+oligarch
+oligarchic
+oligarchical
+oligarchy
+Oligocene
+oligochaete
+oligoclase
+oligomer
+oligomer's
+oligomers
+oligopolistic
+oligopoly
+oligopsony
+oligosaccharide
+oligosaccharide's
+oligosaccharides
+oligotrophic
+oliguria
+Olin
+Olin's
+olio
+oliphant
+olivaceous
+olivary
+olive
+olive's
+Oliveira
+olivenite
+oliver
+Oliver's
+Olivers
+olives
+Olivetti
+Olivia
+Olivier
+olivier
+Olivier's
+olivine
+olla
+olm
+ology
+olomouc
+oloroso
+Olsen
+Olson
+olszyn
+Olympia
+olympiad
+Olympian
+Olympianize
+Olympianizes
+Olympic
+Olympics
+Olympus
+Olynthus
+om
+omadhaun
+omagh
+Omaha
+Oman
+omar
+omasum
+omayyad
+ombre
+ombudsman
+ombudsman's
+ombudsperson
+omdurman
+omega
+omegas
+omelet
+omelets
+omelette
+omen
+omen's
+omens
+omental
+omentum
+omer
+omicron
+ominous
+ominously
+ominousness
+omissible
+omission
+omission's
+omissions
+omit
+omits
+omitted
+omitting
+ommatidial
+ommatidium
+ommatophore
+Ommiad
+ommission
+omni
+omnibus
+omnicompetent
+omnidirectional
+omnifarious
+omnifariously
+omnifariousness
+omnific
+omnificence
+omnificences
+omnificent
+omnify
+omnipotence
+omnipotency
+omnipotent
+omnipotently
+omnipresence
+omnipresent
+omnipresently
+omnirange
+omniscience
+omnisciency
+omniscient
+omnisciently
+omnist
+omnivore
+omnivorous
+omnivorously
+omnivorousness
+omophagia
+omphale
+omphalos
+Omsk
+omuta
+on
+onager
+onagraceous
+onanism
+onanistic
+onassis
+once
+oncer
+oncogene
+oncogene's
+oncogenes
+oncogenic
+oncology
+oncoming
+ondes
+ondo
+ondograph
+ondometer
+one
+one's
+onefold
+onega
+Oneida
+oneiric
+oneirocritic
+oneirocritical
+oneirocritically
+oneiromancy
+oneness
+oner
+onerous
+onerously
+onerousness
+ones
+oneself
+onetime
+oneupmanship
+ongoing
+onion
+onionized
+onionized's
+onionizeds
+onions
+onionskin
+onitsha
+onium
+online
+onliness
+onload
+onlook
+onlooker
+onlookers
+onlooking
+only
+onomasiology
+onomastic
+onomastics
+onomatology
+onomatopoeia
+onomatopoeia's
+onomatopoeic
+Onondaga
+Onondaga's
+onrush
+onrushing
+ons
+onset
+onset's
+onsets
+onsetting
+onshore
+onside
+onslaught
+onslaughts
+onstage
+Ontario
+ontically
+onto
+ontogenesis
+ontogenetic
+ontogenetically
+ontogeny
+ontological
+ontologically
+ontologist
+ontology
+onus
+onward
+onwards
+onychophoran
+onymous
+onyx
+oocyte
+oodles
+oof
+oogamy
+oogenesis
+oogonium
+ooh
+oolite
+oology
+oolong
+oomiak
+oompah
+oomph
+oont
+oophorectomy
+oophoritis
+oophyte
+oops
+oose
+oosperm
+oosphere
+oospore
+oostende
+ootheca
+ootid
+ooze
+oozed
+oozes
+oozier
+oozing
+oozy
+op
+opacities
+opacity
+opah
+opal
+opal's
+opaled
+opalesce
+opalescence
+opalescences
+opalescent
+opalescently
+opaline
+opalize
+opalizes
+opals
+opaque
+opaquely
+opaqueness
+opcode
+opcode's
+opcodes
+ope
+OPEC
+Opel
+open
+openability
+openable
+opencast
+opened
+openendedness
+opener
+openers
+openest
+openhanded
+openhandedly
+openhandedness
+openhearted
+openheartedly
+openheartedness
+opening
+opening's
+openings
+openly
+openmouthed
+openmouthedly
+openmouthedness
+openness
+opens
+openwork
+opera
+opera's
+operability
+operable
+operably
+operand
+operand's
+operandi
+operands
+operant
+operantly
+operants
+operas
+operate
+operated
+operates
+operatic
+operatically
+operating
+operation
+operational
+operationalism
+operationalist
+operationalistic
+operationalization
+operationalizations
+operationalize
+operationalized
+operationally
+operationism
+operationist
+operations
+operative
+operatively
+operativeness
+operatives
+operatize
+operatizes
+operator
+operator's
+operators
+opercular
+operculate
+operculated
+operculum
+operetta
+operettist
+operon
+operose
+ophicleide
+ophidian
+ophiology
+ophiophagous
+ophir
+ophite
+ophitic
+Ophiuchus
+Ophiucus
+ophthalmia
+ophthalmic
+ophthalmitis
+ophthalmologic
+ophthalmologically
+ophthalmologist
+ophthalmology
+ophthalmoscope
+ophthalmoscopic
+ophthalmoscopical
+ophthalmoscopy
+opiate
+opiates
+opine
+opined
+opines
+oping
+opining
+opinion
+opinion's
+opinionate
+opinionated
+opinionatedly
+opinionatedness
+opinionative
+opinionatively
+opinionativeness
+opinions
+opisometer
+opisthobranch
+opisthognathous
+opium
+opiumism
+Oporto
+opossum
+Oppenheimer
+Oppens
+oppidan
+oppilate
+opponent
+opponent's
+opponents
+opportune
+opportunely
+opportunism
+opportunist
+opportunistic
+opportunistically
+opportunities
+opportunity
+opportunity's
+opposability
+opposable
+oppose
+opposed
+opposeless
+opposer
+opposes
+opposing
+opposite
+oppositely
+oppositeness
+opposites
+opposition
+oppositional
+oppositions
+oppress
+oppressed
+oppresses
+oppressing
+oppression
+oppressive
+oppressively
+oppressiveness
+oppressor
+oppressor's
+oppressors
+opprobrious
+opprobriously
+opprobriousness
+opprobrium
+oppugn
+oppugnant
+oppugner
+ops
+opsimath
+opsonic
+opsonin
+opt
+optacon
+optacons
+optative
+optatively
+opted
+opthalmic
+opthalmologic
+opthalmology
+optic
+optical
+optically
+optician
+opticians
+optics
+optima
+optimal
+optimality
+optimally
+optimism
+optimist
+optimistic
+optimistical
+optimistically
+optimists
+optimization
+optimization's
+optimizations
+optimize
+optimized
+optimizer
+optimizer's
+optimizers
+optimizes
+optimizing
+optimo
+optimum
+opting
+option
+option's
+optional
+optionality
+optionalize
+optionalizes
+optionally
+options
+optoacoustic
+optoelectronic
+optoisolate
+optokinetic
+optometer
+optometric
+optometrical
+optometrist
+optometrists
+optometry
+opts
+opulence
+opulent
+opulently
+opuntia
+opus
+opuscule
+opusculum
+opuses
+or
+or's
+ora
+orach
+orache
+oracle
+oracle's
+oracles
+oracular
+oracularity
+oracularly
+oracy
+oradea
+oral
+orality
+oralization
+oralization's
+oralizations
+oralize
+oralizes
+orally
+orals
+oran
+orange
+orange's
+orangeade
+Orangeism
+Orangeman
+orangeroot
+orangery
+oranges
+orangewood
+orangey
+orangish
+orangize
+orangizes
+orangoutan
+orangutan
+orangy
+orate
+orated
+orates
+orating
+oratio
+oration
+oration's
+orations
+orator
+orator's
+Oratorian
+oratoric
+oratorical
+oratorically
+oratories
+oratorio
+oratorios
+oratorize
+oratorizes
+orators
+oratory
+oratory's
+orb
+orbicular
+orbicularity
+orbicularly
+orbiculate
+orbiculately
+orbit
+orbital
+orbitally
+orbitals
+orbited
+orbiter
+orbiters
+orbiting
+orbits
+orc
+orca
+orca's
+Orcadian
+orcas
+orcein
+orch
+orchard
+orchard's
+orchardist
+orchardman
+orchards
+orchesis
+orchestra
+orchestra's
+orchestral
+orchestrally
+orchestras
+orchestrate
+orchestrated
+orchestrater
+orchestrates
+orchestrating
+orchestration
+orchestrational
+orchestrations
+orchestrator
+orchestre
+orchestrina
+orchid
+orchid's
+orchidaceous
+orchids
+orchil
+orchis
+orchitis
+orcinol
+orczy
+ordain
+ordained
+ordainer
+ordaining
+ordainment
+ordains
+ordeal
+ordeals
+order
+ordered
+orderer
+ordering
+orderings
+orderless
+orderlies
+orderliness
+orderly
+orders
+ordinal
+ordinance
+ordinance's
+ordinances
+ordinand
+ordinaries
+ordinarily
+ordinariness
+ordinary
+ordinate
+ordinated
+ordinates
+ordinating
+ordination
+ordinations
+ordinator
+ordinators
+ordines
+ordnance
+ordnances
+ordonnance
+Ordovician
+ordure
+ordzhonikidze
+ore
+ore's
+oread
+orectic
+oregano
+Oregon
+Oregonians
+orel
+Orenburg
+orense
+ores
+Oresteia
+Oresteia's
+Orestes
+orfe
+Orff
+orfray
+organ
+organ's
+organdie
+organdy
+organelle
+organic
+organically
+organicism
+organicist
+organics
+organism
+organism's
+organismal
+organismic
+organismically
+organisms
+organist
+organist's
+organists
+organizabilities
+organizability
+organizability's
+organizable
+organizable's
+organizables
+organization
+organization's
+organizational
+organizational's
+organizationally
+organizationals
+organizationist
+organizationist's
+organizationists
+organizations
+organize
+organized
+organizer
+organizers
+organizes
+organizing
+organogenesis
+organography
+organoleptic
+organology
+organometallic
+organon
+organotherapy
+organs
+organum
+organza
+organzine
+orgasm
+orgasmic
+orgasms
+orgastic
+orgeat
+orgiastic
+orgiastically
+orgies
+orgulous
+orgy
+orgy's
+oribi
+oriel
+orient
+orientable
+oriental
+orientalism
+orientalist
+orientalization
+orientalization's
+orientalizations
+orientalize
+orientalized
+orientalizes
+orientalizing
+orientally
+orientation
+orientation's
+orientational
+orientationally
+orientations
+oriente
+oriented
+orienteering
+orienting
+orientization
+orientization's
+orientizations
+orientize
+orientizes
+orients
+orifice
+orifice's
+orifices
+orificial
+oriflamme
+origami
+origanum
+origen
+origin
+origin's
+original
+originality
+originally
+originals
+originate
+originated
+originates
+originating
+origination
+originations
+originative
+originatively
+originator
+originator's
+originators
+origins
+Orin
+orinasal
+Orinoco
+oriole
+orioles
+Orion
+orion
+Orion's
+orismological
+orismology
+orison
+orissa
+Oriya
+orizaba
+orjonikidze
+Orkney
+Orkney's
+orkneys
+Orlando
+orle
+Orleanist
+Orleans
+Orlick
+orlon
+orlop
+Orly
+orly
+Ormandy
+Ormazd
+ormer
+ormolu
+ormuz
+ornament
+ornamental
+ornamentalize
+ornamentalizes
+ornamentally
+ornamentation
+ornamentations
+ornamented
+ornamenting
+ornaments
+ornate
+ornately
+ornateness
+orne
+orneriness
+ornery
+orney
+ornis
+ornith
+ornithic
+ornithine
+ornithischian
+ornithology
+ornithology's
+ornithomancy
+ornithopod
+ornithopter
+Ornithorhynchus
+ornithoscopy
+ornithosis
+orobanchaceous
+orogenic
+orogeny
+orographic
+orographical
+orographically
+orography
+oroide
+orometer
+Orono
+Orono's
+orontes
+orotund
+orotundity
+orozco
+orphan
+orphanage
+orphanages
+orphaned
+orphanhood
+orphaning
+orphanize
+orphanizes
+orphans
+orpharion
+Orphean
+Orpheus
+Orphic
+Orphically
+Orphism
+orphrey
+orpiment
+orpine
+Orpington
+Orr
+Orr's
+orrery
+orris
+orsini
+Orsk
+ort
+Ortega
+ortegal
+orthant
+orthicon
+ortho
+orthocenter
+orthocephalic
+orthocephalous
+orthocephaly
+orthochromatic
+orthoclase
+orthoclastic
+orthodontia
+orthodontic
+orthodontics
+orthodontist
+orthodontists
+orthodox
+orthodoxes
+orthodoxly
+orthodoxy
+orthoepic
+orthoepical
+orthoepically
+orthoepist
+orthoepy
+orthogenesis
+orthogenetic
+orthogenetically
+orthogenic
+orthognathism
+orthognathous
+orthognathy
+orthogonal
+orthogonality
+orthogonalization
+orthogonalize
+orthogonalized
+orthogonalizes
+orthogonalizing
+orthogonally
+orthograde
+orthographic
+orthographical
+orthographically
+orthographies
+orthography
+orthohydrogen
+orthonormal
+orthopedic
+orthopedically
+orthopedics
+orthopedist
+orthophosphate
+orthophosphates
+orthophosphoric
+orthophosphorous
+orthopsychiatric
+orthopsychiatrist
+orthopsychiatry
+orthopter
+orthopteran
+orthopterist
+orthopteroid
+orthopteron
+orthopterous
+orthoptic
+orthoptics
+orthorhombic
+orthoscope
+orthoscopes
+orthoscopic
+orthostichy
+orthotic
+orthotics
+orthotist
+orthotone
+orthotropic
+orthotropically
+orthotropism
+orthotropous
+ortles
+ortolan
+orts
+oruro
+Orvieto
+Orville
+Orville's
+Orwell
+Orwellian
+oryol
+oryx
+oryxes
+orzae
+OS
+OS's
+Osage
+Osaka
+Osbert
+Osborn
+Osborne
+Oscan
+Oscar
+oscillate
+oscillated
+oscillates
+oscillating
+oscillation
+oscillation's
+oscillational
+oscillations
+oscillator
+oscillator's
+oscillators
+oscillatory
+oscillogram
+oscillogram's
+oscillograms
+oscillograph
+oscillographic
+oscillographically
+oscillography
+oscilloscope
+oscilloscope's
+oscilloscopes
+oscilloscopic
+oscilloscopically
+oscine
+oscitancy
+osculant
+oscular
+osculate
+osculated
+osculates
+osculating
+osculation
+osculations
+osculatory
+osculum
+OSF
+OSF'S
+Osgood
+Osgood's
+OSHA
+Oshawa
+Oshkosh
+Oshogbo
+osier
+Osijek
+Osiris
+Oslo
+osman
+Osmanli
+osmatic
+osmeterium
+osmic
+osmious
+osmiridium
+osmium
+osmolal
+osmolality
+osmolar
+osmolarity
+osmometer
+osmometer's
+osmometers
+osmometric
+osmometry
+osmoregulation
+osmoregulatory
+osmose
+osmosed
+osmosing
+osmosis
+osmotic
+osmotically
+osmous
+osmunda
+Osnaburg
+oso
+osprey
+ospreys
+osram
+osric
+ossa
+ossein
+osseous
+osseously
+Osset
+ossetia
+Ossetic
+Ossian
+ossicle
+ossicular
+ossiculate
+ossiculated
+ossie
+ossietzky
+ossiferous
+ossification
+ossifications
+ossificatory
+ossified
+ossifrage
+ossify
+osso
+ossuary
+osteal
+osteitis
+ostend
+ostensible
+ostensibly
+ostensive
+ostensively
+ostensorium
+ostensory
+ostentation
+ostentations
+ostentatious
+ostentatiously
+ostentatiousness
+osteoarthritic
+osteoarthritis
+osteoblast
+osteoblastic
+osteoclasis
+osteoclast
+osteoclastic
+osteocyte
+osteogenesis
+osteoid
+osteological
+osteologically
+osteologist
+osteology
+osteoma
+osteomalacia
+osteomyelitis
+osteopath
+osteopathic
+osteopathically
+osteopaths
+osteopathy
+osteophyte
+osteophytic
+osteoplastic
+osteoplasty
+osteoporosis
+osteotome
+osteotomy
+ostia
+ostinato
+ostiole
+ostium
+ostler
+ostmark
+ostosis
+ostracism
+ostracizable
+ostracizable's
+ostracizables
+ostracization
+ostracization's
+ostracizations
+ostracize
+ostracized
+ostracizer
+ostracizers
+ostracizes
+ostracizing
+ostracod
+ostracoderm
+ostracon
+Ostrander
+ostrava
+ostrich
+ostrich's
+ostriches
+Ostrogoth
+ostwald
+Ostyak
+Oswald
+otalgia
+Othello
+other
+other's
+othergates
+otherguess
+otherness
+others
+otherwhere
+otherwhile
+otherwhiles
+otherwise
+otherworld
+otherworldliness
+otherworldly
+Othin
+othman
+otho
+otic
+otiose
+Otis
+otitis
+otocyst
+otolaryngology
+otology
+otoscope
+otranto
+Ott
+Ott's
+ottar
+ottava
+Ottawa
+otter
+otter's
+otterburn
+otters
+Ottley
+Otto
+Otto's
+Ottoman
+Ottomanization
+Ottomanization's
+Ottomanizations
+Ottomanize
+Ottomanizes
+otway
+ouabain
+ouachita
+Ouagadougou
+ouan
+ouananiche
+oubangui
+oubliette
+ouch
+oudh
+ouessant
+ough
+ought
+oughtn't
+oughts
+oui
+Ouija
+oujda
+oulu
+ounce
+ounces
+our
+ours
+ourself
+ourselves
+ouse
+ousel
+oust
+ousted
+ouster
+ousting
+out
+outage
+outage's
+outages
+outasight
+outback
+outbalance
+outbid
+outboard
+outboards
+outbound
+outbrave
+outbreak
+outbreak's
+outbreaks
+outbreed
+outbreeding
+outbuilding
+outburst
+outburst's
+outbursts
+outby
+outbye
+outcast
+outcast's
+outcaste
+outcasts
+outcaviled
+outcaviling
+outclamor
+outclamor's
+outclamors
+outclass
+outclassed
+outcome
+outcome's
+outcomes
+outcries
+outcrop
+outcrops
+outcross
+outcry
+outdate
+outdated
+outdatedness
+outdazzle
+outdistance
+outdistanced
+outdistancing
+outdo
+outdoor
+outdoors
+outdoorsman
+outdoorsmanship
+outdoorsy
+outdraw
+outdrew
+outed
+outer
+outercoat
+outermost
+outface
+outfall
+outfield
+outfielder
+outfielders
+outfight
+outfighting
+outfit
+outfit's
+outfits
+outfitted
+outfitter
+outfitting
+outflank
+outflanker
+outflow
+outflows
+outfoot
+outfought
+outfox
+outgas
+outgeneral
+outgeneraled
+outgiving
+outgo
+outgoes
+outgoing
+outgoingness
+outgoings
+outgrew
+outgrip
+outgrow
+outgrowing
+outgrown
+outgrows
+outgrowth
+outguess
+outgun
+outhaul
+outhouse
+outhumor
+outhumor's
+outhumored
+outhumoring
+outhumors
+outhyperbolize
+outhyperbolizes
+outing
+outing's
+outings
+outjockey
+outlabor
+outlabor's
+outlabors
+outland
+outlander
+outlanders
+outlandish
+outlandishly
+outlandishness
+outlast
+outlasts
+outlaw
+outlawed
+outlawing
+outlawry
+outlaws
+outlay
+outlay's
+outlays
+outlet
+outlet's
+outlets
+outlier
+outliers
+outline
+outlined
+outlines
+outlining
+outlist
+outlive
+outlived
+outlives
+outliving
+outlook
+outlying
+outman
+outmaneuver
+outmaneuvered
+outmaneuvering
+outmaneuvers
+outmatch
+outmatched
+outmigration
+outmode
+outmoded
+outmoding
+outmost
+outness
+outnumber
+outnumbered
+outnumbering
+outnumbers
+outpace
+outpaced
+outpatient
+outpatients
+outperform
+outperformed
+outperforming
+outperforms
+outplay
+outplayed
+outpoint
+outport
+outporter
+outpost
+outpost's
+outposts
+outpour
+outpouring
+outpourings
+outpull
+output
+output's
+outputs
+outputted
+outputting
+outrace
+outrage
+outraged
+outrageous
+outrageously
+outrageousness
+outrages
+outraging
+outrance
+outrange
+outrank
+outreach
+outride
+outrider
+outrigger
+outriggers
+outright
+outrightly
+outrival
+outrivaled
+outrivaling
+outrun
+outrunner
+outruns
+outrush
+outs
+outsavor
+outsavor's
+outsavoring
+outsavors
+outscore
+outscoring
+outsell
+outsert
+outset
+outshine
+outshone
+outshoot
+outshout
+outside
+outsider
+outsider's
+outsiderness
+outsiders
+outsight
+outsit
+outsize
+outsized
+outskirt
+outskirts
+outsleep
+outsmart
+outsmarted
+outsmarting
+outsmarts
+outsmell
+outsoar
+outsole
+outspeak
+outspeed
+outspend
+outspent
+outspin
+outsplendor
+outsplendor's
+outsplendors
+outspoken
+outspokenly
+outspokenness
+outspread
+outstand
+outstanding
+outstandingly
+outstare
+outstart
+outstate
+outstation
+outstay
+outstretch
+outstretched
+outstrip
+outstripped
+outstripping
+outstrips
+outswing
+outtake
+outtalk
+outthink
+outturn
+outtyrannize
+outtyrannizes
+outvote
+outvoted
+outvotes
+outvoting
+outward
+outwardly
+outwardness
+outwards
+outwash
+outwear
+outweigh
+outweighed
+outweighing
+outweighs
+outwit
+outwith
+outwits
+outwitted
+outwitting
+outwork
+outworn
+ouvre
+ouzel
+ouzo
+ova
+oval
+oval's
+ovalization
+ovalization's
+ovalizations
+ovalize
+ovalizes
+ovally
+ovalness
+ovals
+Ovambo
+ovarial
+ovarian
+ovariectomized
+ovariectomy
+ovaries
+ovariole
+ovariotomy
+ovaritis
+ovary
+ovary's
+ovate
+ovates
+ovation
+ovationed
+ovationing
+ovations
+oven
+oven's
+ovenbird
+ovenbirds
+ovenproof
+ovenproofed
+ovenproofing
+ovenproofs
+ovens
+ovenware
+over
+overabundance
+overabundant
+overachieve
+overachieved
+overachiever
+overachieves
+overachieving
+overact
+overaction
+overactive
+overactivity
+overage
+overaggressive
+overagonize
+overagonizes
+overall
+overall's
+overalls
+overarch
+overarching
+overarm
+overawe
+overbalance
+overbear
+overbearance
+overbearing
+overbearingly
+overbearingness
+overbid
+overbite
+overblew
+overblouse
+overblow
+overblowing
+overblown
+overblows
+overboard
+overboot
+overbought
+overbrutalize
+overbrutalizes
+overbuild
+overburden
+overburdened
+overburdening
+overburdeningly
+overburdens
+overbuy
+overcall
+overcalled
+overcalling
+overcalls
+overcame
+overcapacity
+overcapitalization
+overcapitalization's
+overcapitalizations
+overcapitalize
+overcapitalized
+overcapitalizes
+overcapitalizing
+overcareful
+overcarefully
+overcast
+overcasting
+overcautious
+overcentralization
+overcentralization's
+overcentralizations
+overcentralize
+overcentralizes
+overcerebral
+overcharge
+overcheck
+overcivilization
+overcivilization's
+overcivilizations
+overcivilize
+overcivilizes
+overclamor
+overclamor's
+overclamors
+overcloud
+overcoat
+overcoat's
+overcoating
+overcoats
+overcolor
+overcolor's
+overcolors
+overcome
+overcomer
+overcomes
+overcoming
+overcompensate
+overcompensation
+overcompensatory
+overcompetence
+overconfidence
+overconfident
+overconfidently
+overconsolidate
+overconsolidated
+overconsolidates
+overconsolidating
+overconsolidation
+overconsumption
+overcooked
+overcooled
+overcorrection
+overcriticize
+overcriticizes
+overcrop
+overcrowd
+overcrowded
+overcrowding
+overcrowds
+overcurious
+overcurrent
+overcurrents
+overdetermination
+overdetermine
+overdetermined
+overdetermines
+overdetermining
+overdevelop
+overdeveloped
+overdevelopment
+overdo
+overdoctrinize
+overdoctrinizes
+overdoing
+overdominance
+overdominant
+overdone
+overdose
+overdose's
+overdosed
+overdoses
+overdosing
+overdraft
+overdraft's
+overdrafts
+overdraw
+overdrawing
+overdrawn
+overdraws
+overdress
+overdrew
+overdrive
+overdriving
+overdue
+overdye
+overeager
+overeagerly
+overeagerness
+overeat
+overeaten
+overeater
+overeating
+overeducated
+overemotionalize
+overemotionalizes
+overemphasis
+overemphasization
+overemphasization's
+overemphasizations
+overemphasize
+overemphasized
+overemphasizer
+overemphasizers
+overemphasizes
+overemphasizing
+overestimate
+overestimated
+overestimates
+overestimating
+overestimation
+overestimations
+overet
+overexcite
+overexcited
+overexcitement
+overexploitation
+overexploited
+overexpose
+overexposure
+overextend
+overextended
+overextending
+overextends
+overextension
+overfall
+overfastidious
+overfavor
+overfavor's
+overfavorable
+overfavorable's
+overfavorables
+overfavorablies
+overfavorably
+overfavors
+overfed
+overfeed
+overfertilization
+overfill
+overfilled
+overfilling
+overfills
+overfish
+overfleshed
+overflight
+overflow
+overflowed
+overflowing
+overflown
+overflows
+overfly
+overfold
+overgarment
+overgeneralize
+overgeneralizes
+overgenerous
+overglaze
+overgraze
+overgrazing
+overground
+overgrow
+overgrown
+overgrowth
+overhand
+overhanded
+overhang
+overhanging
+overhangs
+overhaul
+overhauled
+overhauler
+overhauling
+overhaulings
+overhauls
+overhead
+overheads
+overhear
+overheard
+overhearer
+overhearing
+overhears
+overheat
+overheated
+overheating
+overheats
+overhonor
+overhonor's
+overhonors
+overhumanize
+overhumanizes
+overhype
+overhyped
+overhypes
+overhyping
+Overijssel
+overily
+overindulge
+overindulged
+overindulgence
+overindulgent
+overindustrialization
+overindustrialization's
+overindustrializations
+overindustrialize
+overindustrializes
+overing
+overissue
+overissued
+overissues
+overissuing
+overjoy
+overjoyed
+overjudgment
+overjudgment's
+overjudgments
+overkill
+overkill's
+overlabor
+overlabor's
+overlabors
+overlaid
+overland
+overlap
+overlap's
+overlapped
+overlapping
+overlaps
+overlay
+overlaying
+overlays
+overleaf
+overleap
+overlearn
+overlie
+overlive
+overload
+overloaded
+overloading
+overloads
+overlong
+overlook
+overlooked
+overlooking
+overlooks
+overlord
+overlords
+overlordship
+overloud
+overly
+overlying
+overman
+overmantel
+overmaster
+overmatch
+overmatter
+overmuch
+overnationalization
+overnationalization's
+overnationalizations
+overnice
+overnight
+overnighter
+overnighters
+overnights
+overoptimism
+overoptimist
+overoptimistic
+overoptimistically
+overpaid
+overpass
+overpay
+overpayment
+overpersuade
+overpersuasion
+overpitch
+overplay
+overplayed
+overplaying
+overplus
+overpopulate
+overpopulated
+overpopulation
+overpower
+overpowered
+overpowering
+overpoweringly
+overpowers
+overpraise
+overpressure
+overprice
+overpriced
+overprint
+overprinted
+overprinting
+overprints
+overprize
+overproduce
+overproduced
+overproduces
+overproducing
+overproduction
+overpronounce
+overproof
+overproportion
+overprotect
+overprotection
+overprotective
+overran
+overrapturize
+overrapturizes
+overrate
+overrated
+overrationalize
+overrationalizes
+overreach
+overreached
+overreacher
+overreaches
+overreact
+overreaction
+overrefine
+overrefinement
+overrepresent
+overrepresented
+overridden
+override
+overrider
+overrides
+overriding
+overripe
+overrode
+overrule
+overruled
+overrules
+overruling
+overrun
+overrunning
+overruns
+overs
+oversample
+oversampled
+oversampling
+oversanguine
+oversaturate
+overscale
+overscore
+oversea
+overseas
+oversee
+overseeing
+overseen
+overseer
+overseers
+oversees
+oversell
+overselling
+oversells
+oversensitive
+oversensitiveness
+oversentimentalize
+oversentimentalizes
+overset
+oversew
+oversexed
+overshadow
+overshadowed
+overshadowing
+overshadows
+overshoe
+overshoes
+overshoot
+overshooting
+overshoots
+overshot
+overside
+oversight
+oversight's
+oversights
+oversimplification
+oversimplifications
+oversimplified
+oversimplifies
+oversimplify
+oversimplifying
+oversize
+oversized
+oversizes
+overskirt
+overslaugh
+oversleep
+oversleeve
+overslip
+oversoft
+oversoftness
+oversold
+oversoul
+overspecialization
+overspecialization's
+overspecializations
+overspecialize
+overspecialized
+overspecializes
+overspeculate
+overspeculation
+overspeed
+overspend
+overspender
+overspending
+overspends
+overspent
+overspill
+overspread
+overstaff
+overstaffed
+overstaffing
+overstaffs
+overstate
+overstated
+overstatement
+overstatement's
+overstatements
+overstates
+overstating
+overstay
+oversteepen
+oversteer
+overstep
+overstepped
+overstepping
+oversteps
+overstock
+overstocks
+overstory
+overstrain
+overstraining
+overstress
+overstressed
+overstrew
+overstride
+overstrike
+overstrikes
+overstriking
+overstruck
+overstrung
+overstuff
+overstuffed
+overstuffing
+overstuffs
+oversubscribe
+oversubscribed
+oversubscribes
+oversubscribing
+oversubscription
+oversubtle
+oversubtlety
+oversupply
+oversystematize
+oversystematizes
+overt
+overtake
+overtaken
+overtaker
+overtakers
+overtakes
+overtaking
+overtask
+overtax
+overtaxation
+overtaxed
+overthrew
+overthrow
+overthrowing
+overthrown
+overthrows
+overthrust
+overtime
+overtly
+overtness
+overtone
+overtone's
+overtones
+overtook
+overtop
+overtrade
+overtrain
+overtrick
+overtrump
+overture
+overture's
+overtures
+overturn
+overturned
+overturning
+overturns
+overtype
+overtyping
+overunionized
+overunionized's
+overunionizeds
+overurbanization
+overurbanization's
+overurbanizations
+overuse
+overvalue
+overview
+overview's
+overviews
+overvoltage
+overvoltages
+overwatch
+overwear
+overweary
+overween
+overweening
+overweigh
+overweight
+overwhelm
+overwhelmed
+overwhelming
+overwhelmingly
+overwhelms
+overwind
+overwinter
+overwomanize
+overwomanizes
+overword
+overwork
+overworked
+overworking
+overworks
+overwrap
+overwrite
+overwrites
+overwriting
+overwritten
+overwrote
+overwrought
+overzealous
+overzealousness
+ovicidal
+ovicide
+Ovid
+oviduct
+oviductal
+oviedo
+oviferous
+oviform
+ovine
+oviparous
+oviparously
+oviparousness
+oviposit
+oviposition
+ovipositional
+ovipositor
+ovisac
+ovoid
+ovoidal
+ovonic
+ovotestis
+ovoviviparous
+ovoviviparously
+ovoviviparousness
+ovular
+ovulate
+ovulated
+ovulates
+ovulating
+ovulation
+ovulations
+ovulatory
+ovule
+ovum
+ow
+owe
+owed
+owelty
+Owen
+Owens
+owerless
+owerri
+owes
+owing
+owl
+owl's
+owler
+owlet
+owlish
+owlishly
+owlishness
+owls
+owly
+own
+owned
+owner
+owner's
+owners
+ownership
+ownerships
+owning
+owns
+owt
+ox
+oxacillin
+oxalacetate
+oxalacetic
+oxalate
+oxalic
+oxalis
+oxaloacetate
+oxaloacetic
+oxazine
+oxblood
+oxbow
+Oxbridge
+oxcart
+oxen
+oxenstierna
+oxeye
+Oxford
+Oxfordshire
+oxheart
+oxhide
+oxidant
+oxidase
+oxidasic
+oxidate
+oxidation
+oxidations
+oxidative
+oxidatively
+oxide
+oxide's
+oxides
+oxidic
+oxidimetry
+oxidizabilities
+oxidizability
+oxidizability's
+oxidizable
+oxidizable's
+oxidizables
+oxidization
+oxidization's
+oxidizations
+oxidize
+oxidized
+oxidizement
+oxidizement's
+oxidizements
+oxidizer
+oxidizers
+oxidizes
+oxidizing
+oxidizings
+oxime
+Oxnard
+oxon
+oxonian
+oxonium
+oxpecker
+oxtail
+oxter
+oxtongue
+oxus
+oxyacetylene
+oxyacid
+oxycephaly
+oxychloride
+oxygen
+oxygenate
+oxygenated
+oxygenates
+oxygenating
+oxygenation
+oxygenations
+oxygenator
+oxygenic
+oxygenicity
+oxygenizable
+oxygenizable's
+oxygenizables
+oxygenize
+oxygenizement
+oxygenizement's
+oxygenizements
+oxygenizer
+oxygenizers
+oxygenizes
+oxygenless
+oxygens
+oxyhaemoglobin
+oxyhemoglobin
+oxyhydrogen
+oxyhydroxides
+oxymoron
+oxyphil
+oxyphile
+oxyphilic
+oxysalt
+oxysome
+oxysulfide
+oxysulphide
+oxytetracycline
+oxytocic
+oxytocin
+oxytone
+oyer
+oyez
+oyo
+oystchers
+oyster
+oyster's
+oystercatcher
+oystering
+oysterman
+oystermen
+oysters
+Oz
+oz
+ozagen
+ozagenians
+ozalid
+Ozark
+Ozarks
+Ozawa
+ozocerite
+ozokerite
+ozone
+ozonic
+ozonide
+ozoniferous
+ozonization
+ozonization's
+ozonizations
+ozonize
+ozonized
+ozonizer
+ozonizers
+ozonizes
+ozonizing
+ozonolysis
+ozonosphere
+ozonous
+ozs
+Ozzie
+ozzie
+p's
+pa
+Paal
+PABA
+Pablo
+Pabst
+pabulum
+paca
+pace
+pace's
+paced
+pacem
+pacemaker
+pacemaking
+pacer
+pacers
+paces
+pacesetter
+pacesetting
+paceway
+pacha
+pachalic
+Pachisi
+Pachouli
+pachuca
+pachuco
+pachyderm
+pachydermal
+pachydermatous
+pachydermatously
+pachysandra
+pachytene
+pacifiable
+Pacific
+pacific
+pacifically
+pacification
+pacifications
+pacificator
+pacificators
+pacificatory
+pacificist
+pacified
+pacifier
+pacifies
+pacifism
+pacifist
+pacifistic
+pacifistically
+pacify
+pacifying
+pacing
+pack
+packability
+packable
+package
+packaged
+packager
+packagers
+packages
+packaging
+packagings
+Packard
+Packard's
+Packards
+packboard
+packed
+packer
+packers
+packet
+packet's
+packeted
+packeting
+packetization
+packetize
+packetized
+packetizer
+packetizer's
+packetizers
+packetizes
+packetizing
+packets
+packhorse
+packing
+packinghouse
+packman
+packs
+packsack
+packsaddle
+packthread
+packwood
+Packwood
+pact
+pact's
+pacts
+pad
+pad's
+padang
+padauk
+padded
+paddies
+padding
+paddings
+paddle
+paddleboard
+paddled
+paddlefish
+paddler
+paddles
+paddling
+paddock
+paddy
+Paddywhack
+pademelon
+paderborn
+Paderewski
+padishah
+padlock
+padlocked
+padlocks
+padma
+padouk
+padova
+padre
+padrone
+pads
+padsaw
+padua
+paduasoy
+Padus
+paean
+paeanize
+paeanizes
+paeans
+paederast
+paediatrician
+paediatrics
+paedogenesis
+paedology
+paedomorphosis
+paedophilia
+paella
+paeon
+paeony
+paestum
+pagan
+pagan's
+paganini
+Paganini
+paganish
+paganism
+paganization
+paganization's
+paganizations
+paganize
+paganized
+paganizer
+paganizers
+paganizes
+paganizing
+pagans
+page
+page's
+pageant
+pageant's
+pageantry
+pageants
+pageboy
+paged
+pageful
+pagefuls
+pager
+pager's
+pagers
+pages
+paginal
+paginate
+paginated
+paginates
+paginating
+pagination
+paginations
+paging
+pagoda
+pagodas
+pagurian
+pah
+pahang
+Pahari
+Pahlavi
+pahsien
+paid
+paigle
+Paignton
+pail
+pail's
+pailful
+paillasse
+paillette
+pails
+pain
+Paine
+pained
+painful
+painfuller
+painfullest
+painfully
+painfulness
+paining
+painkiller
+painless
+painlessly
+painlessness
+pains
+painstaking
+painstakingly
+paint
+paintbox
+paintbrush
+painted
+painter
+painterliness
+painterly
+painters
+painting
+paintings
+paints
+pair
+paired
+pairing
+pairings
+pairs
+pairwise
+paisa
+paisano
+paisley
+Paiute
+paix
+pajama
+pajama's
+pajamaed
+pajamas
+pakeha
+paki
+Pakistan
+Pakistani
+Pakistanis
+pal
+pal's
+palace
+palace's
+palaces
+Palacio
+paladin
+palaeanthropic
+Palaearctic
+palaeethnology
+palaeoanthropic
+palaeoanthropology
+palaeobotany
+Palaeocene
+palaeoclimatology
+palaeoecological
+palaeoecology
+palaeoethnobotany
+palaeogene
+palaeography
+palaeolith
+palaeolithic
+palaeomagnetism
+palaeontography
+palaeontology
+palaeontology's
+Palaeozoic
+palaeozoology
+palaestra
+palais
+palanquin
+palasts
+palatability
+palatable
+palatableness
+palatably
+palatal
+palatalization
+palatalize
+palatalized
+palatalizes
+palatalizing
+palatally
+palate
+palate's
+palates
+palatial
+palatially
+palatialness
+palatinate
+Palatine
+palatization
+palatization's
+palatizations
+palatize
+palatizes
+Palau
+palaver
+palavered
+palavering
+palawan
+palazzo
+palazzos
+pale
+palea
+paled
+paleface
+palefaces
+palely
+palembang
+palencia
+paleness
+Palenque
+paleoanthropology
+paleoanthropology's
+paleoecologic
+paleoecological
+paleoecologist
+paleoecology
+paleogeographic
+paleogeographical
+paleogeographically
+paleogeography
+paleographer
+paleographic
+paleographical
+paleographically
+paleography
+paleolith
+Paleolithic
+paleoliths
+paleologist
+paleologists
+paleomagnetics
+paleontologic
+paleontological
+paleontologist
+paleontology
+Paleozoic
+paleozoological
+paleozoology
+paler
+Palermo
+pales
+palest
+Palestine
+Palestinian
+palestra
+palestrina
+paletot
+palette
+paley
+palfrey
+Pali
+palikar
+palimpsest
+palindrome
+palindromes
+palindromic
+palindromicity
+paling
+palingenesis
+palingenetic
+palinode
+palisade
+palisades
+palish
+palk
+pall
+palladia
+Palladian
+palladic
+palladio
+palladium
+palladiumize
+palladiumizes
+palladous
+Pallas
+pallbearer
+pallet
+pallete
+palletization
+palletizations
+palletize
+palletized
+palletizer
+palletizes
+palletizing
+pallette
+pallial
+palliasse
+palliate
+palliation
+palliative
+palliatively
+palliatives
+palliator
+pallid
+pallidly
+pallidness
+palling
+pallium
+pallor
+pallor's
+pallors
+pally
+palm
+palma
+palmaceous
+palmar
+palmary
+palmate
+palmated
+palmately
+palmation
+palmed
+palmer
+Palmerston
+palmetto
+palmier
+palming
+palmira
+palmist
+palmistry
+palmitate
+palmlike
+Palmolive
+palms
+palmy
+Palmyra
+Palo
+palolo
+Palomar
+palomino
+palooka
+palos
+palour
+palp
+palpability
+palpable
+palpably
+palpal
+palpate
+palpated
+palpates
+palpating
+palpation
+palpations
+palpebral
+palpebrate
+palpi
+palpitant
+palpitate
+palpitated
+palpitates
+palpitating
+pals
+palsgrave
+palsied
+palsies
+palstave
+palsy
+palsying
+palter
+paltered
+palterer
+paltering
+paltrier
+paltriness
+paltry
+paludal
+paludism
+palynologic
+palynological
+palynologically
+palynologist
+palynology
+Pam
+Pam's
+Pamela
+pamirs
+pampa
+pampas
+pamper
+pampered
+pamperer
+pampering
+pamperize
+pamperizes
+pampero
+pampers
+pamphlet
+pamphlet's
+pamphleteer
+pamphleteers
+pamphletize
+pamphletizes
+pamphlets
+pamphrey
+pamphylia
+pamplona
+pan
+pan's
+panacea
+panacea's
+panacean
+panaceas
+panache
+panada
+panama
+Panama
+Panamanian
+panatela
+panatella
+panatellas
+Panathenaea
+panay
+pancake
+pancake's
+pancaked
+pancakes
+pancaking
+panchax
+panchayat
+panchen
+Pancho
+panchromatic
+pancosmism
+pancratium
+pancreas
+pancreatic
+pancreatin
+panda
+panda's
+pandanaceous
+Pandanus
+Pandarus
+pandas
+Pandean
+pandect
+pandects
+pandemic
+pandemonium
+pander
+pandered
+panderer
+pandering
+panderize
+panderizes
+panders
+pandied
+pandit
+Pandora
+pandore
+pandour
+pandowdy
+pandurate
+pandy
+pandybat
+pane
+pane's
+panegyric
+panegyrical
+panegyrically
+panegyrist
+panel
+paneled
+paneling
+panelings
+panelist
+panelist's
+panelists
+panelization
+panelized
+panellist
+panellists
+panels
+panes
+panetela
+panetella
+panettone
+panful
+pang
+pang's
+panga
+Pangaea
+pangenesis
+pangenetic
+pangolin
+pangs
+panhandle
+panhandled
+panhandler
+panhandles
+panhandling
+Panhellenic
+Panhellenism
+panhuman
+panic
+panic's
+panicked
+panicking
+panicky
+panicle
+panicmonger
+panics
+paniculate
+Panjabi
+panjandrum
+panjim
+pankhurst
+panmixia
+panmunjom
+pannage
+panne
+panned
+pannier
+pannikin
+panning
+pannonia
+panocha
+panoplied
+panoply
+panoptic
+panorama
+panoramas
+panoramic
+panoramically
+panpipe
+panpipes
+pans
+pansies
+pansophy
+pansy
+pansy's
+pant
+Pantagruel
+pantalets
+pantalettes
+pantaloon
+pantaloons
+pantas
+pantechnicon
+panted
+pantelleria
+pantheism
+pantheist
+pantheistic
+pantheistical
+pantheistically
+pantheon
+pantheonization
+pantheonization's
+pantheonizations
+pantheonize
+pantheonizes
+panther
+panther's
+panthers
+pantie
+panties
+pantihose
+pantile
+pantiled
+panting
+pantisocracies
+pantisocracy
+pantisocratic
+pantisocratical
+pantisocratist
+panto
+pantograph
+pantographic
+pantomime
+pantomimed
+pantomimic
+pantomimist
+pantothenate
+pantothenic
+pantoum
+pantries
+pantropic
+pantry
+pantry's
+pantryman
+pantrymen
+pants
+pantsuit
+panty
+pantywaist
+panza
+panzer
+Paoli
+Paoli's
+paoting
+paotow
+pap
+papa
+papacy
+papadopoulos
+papain
+papal
+papalization
+papalization's
+papalizations
+papalize
+papalizer
+papalizers
+papalizes
+papally
+papandreou
+papaveraceous
+papaverine
+papaw
+papaya
+papeete
+papen
+paper
+paper's
+paperback
+paperback's
+paperbacks
+paperbark
+paperboard
+paperbound
+paperboy
+paperboys
+paperclip
+paperclips
+papered
+paperer
+paperers
+paperhanger
+paperhangers
+paperhanging
+paperiness
+papering
+paperings
+paperknife
+paperknives
+paperless
+papermaker
+papermakers
+papermaking
+papers
+paperthrow
+paperweight
+paperweights
+paperwork
+papery
+papeterie
+Paphian
+paphlagonia
+paphos
+Papiamento
+papier
+papiers
+papilionaceous
+papilla
+papillae
+papillary
+papillate
+papillated
+papilloma
+papillomatous
+papillon
+papillose
+papillote
+papist
+papistry
+papoose
+Pappas
+pappies
+pappose
+pappus
+pappy
+paprika
+Papua
+Papua's
+Papuan
+papule
+papyraceous
+papyri
+papyrology
+papyrus
+papyruses
+par
+para
+parabasis
+parabiosis
+parabiotic
+parabiotically
+parablast
+parable
+parables
+parabola
+parabolic
+parabolically
+parabolize
+parabolized
+parabolizes
+parabolizing
+paraboloid
+paraboloidal
+parabrake
+paracasein
+Paracel
+Paracelsus
+paracetamol
+parachronism
+parachute
+parachute's
+parachuted
+parachuter
+parachutes
+parachutic
+parachuting
+parachutist
+paraclete
+parade
+paraded
+parader
+parades
+paradigm
+paradigm's
+paradigmatic
+paradigmatical
+paradigms
+parading
+paradisaic
+paradisaical
+paradisaically
+paradisal
+paradise
+paradisiac
+paradisiacal
+paradisiacally
+paradox
+paradox's
+paradoxes
+paradoxic
+paradoxical
+paradoxically
+paradoxicalness
+paradrop
+paraesthesia
+paraffin
+paraffinic
+paraffinize
+paraffinizes
+paraffins
+paraformaldehyde
+paragenesis
+paragenetic
+paragenetically
+paraginase
+paragoge
+paragon
+paragon's
+paragonite
+paragons
+paragraph
+paragraphed
+paragrapher
+paragraphic
+paragraphing
+paragraphize
+paragraphizes
+paragraphs
+Paraguay
+Paraguayan
+Paraguayan's
+Paraguayans
+parahydrogen
+parakeet
+parakeets
+paralanguage
+paraldehyde
+paralinguistic
+paralipomena
+parallactic
+parallax
+parallax's
+parallel
+paralleled
+parallelepiped
+parallelepipeds
+paralleling
+parallelism
+parallelization
+parallelization's
+parallelizations
+parallelize
+parallelized
+parallelizer
+parallelizers
+parallelizes
+parallelizing
+parallelogram
+parallelogram's
+parallelograms
+parallels
+paralogism
+paralysis
+paralytic
+paralyzation
+paralyze
+paralyzed
+paralyzedlies
+paralyzedly
+paralyzer
+paralyzer's
+paralyzers
+paralyzes
+paralyzing
+paralyzinglies
+paralyzingly
+paramagnet
+paramagnetic
+paramagnetically
+paramagnetism
+paramaribo
+paramatta
+paramecium
+paramedic
+paramedical
+parament
+parameter
+parameter's
+parameterizable
+parameterization
+parameterization's
+parameterizations
+parameterize
+parameterized
+parameterizes
+parameterizing
+parameterless
+parameters
+parametric
+parametrical
+parametrically
+paramilitary
+paramnesia
+paramo
+paramorph
+paramorphine
+paramorphism
+paramount
+paramountcy
+paramour
+Paramus
+parang
+paranoia
+paranoiac
+paranoiacs
+paranoid
+paranormal
+paranormality
+paranormally
+paranymph
+paraoxon
+parapet
+parapet's
+parapeted
+parapets
+paraph
+paraphernalia
+paraphrasable
+paraphrase
+paraphrased
+paraphraser
+paraphrases
+paraphrasing
+paraphrastic
+paraphrastically
+paraphysis
+paraplegia
+paraplegic
+parapodial
+parapodium
+parapraxis
+paraprofessional
+paraprofessionals
+parapsychology
+paraquat
+pararosaniline
+parasang
+paraselene
+paraselenic
+parasexual
+parasexuality
+parashah
+parasite
+parasite's
+parasites
+parasitic
+parasitical
+parasitically
+parasiticidal
+parasiticide
+parasitics
+parasitism
+parasitization
+parasitize
+parasitized
+parasitizes
+parasitizing
+parasitology
+parasol
+parasols
+parastichy
+parasympathetic
+parasympathomimetic
+parasynthesis
+parasynthetic
+parasyntheton
+paratactic
+paratactical
+paratactically
+parataxis
+parathion
+parathyroid
+parathyroidectomize
+parathyroidectomized
+parathyroidectomizes
+parathyroidectomizing
+parathyroidectomy
+paratroop
+paratrooper
+paratroopers
+paratroops
+paratyphoid
+paravane
+paraxial
+parboil
+parboiled
+parbuckle
+parbuckled
+parbuckling
+parcae
+parcel
+parceled
+parceler
+parceling
+parcels
+parcenary
+parcener
+parch
+parched
+parcheesi
+parchment
+parchmentize
+parchmentizes
+parclose
+pard
+pardalote
+pardner
+pardners
+pardon
+pardonable
+pardonableness
+pardonably
+pardoned
+pardoner
+pardoners
+pardoning
+pardons
+pardubice
+pare
+paregoric
+pareira
+parella
+parenchyma
+parenchymal
+parent
+parent's
+parentage
+parental
+parentally
+parenteral
+parenterally
+parentheses
+parenthesis
+parenthesization
+parenthesize
+parenthesized
+parenthesizes
+parenthesizing
+parenthetic
+parenthetical
+parenthetically
+parenthood
+parenting
+parents
+parer
+parergon
+pares
+paresis
+paresthesia
+Pareto
+Pareto's
+pareu
+pareve
+parfait
+parfleche
+parfocalization
+parfocalize
+parget
+parhelic
+parhelion
+pariah
+parian
+paries
+parietal
+parietes
+parimutuel
+parimutuels
+paring
+parings
+parioli
+paripinnate
+Paris
+parish
+parish's
+parishad
+parishes
+parishioner
+parishioners
+Parisian
+Parisianization
+Parisianization's
+Parisianizations
+Parisianize
+Parisianizes
+parisina
+parisology
+parison
+parisyllabic
+parities
+parity
+park
+parka
+parka's
+parkas
+Parke
+Parke's
+parked
+parker
+parkers
+Parkersburg
+Parkhouse
+parkin
+parking
+Parkinson
+Parkinsonian
+parkinsonism
+parkish
+parkland
+parklike
+parks
+parkway
+parky
+parlance
+parlando
+parlante
+parlay
+parlayed
+parle
+parley
+parleys
+parleyvoo
+parliament
+parliament's
+parliamentarian
+parliamentarianism
+parliamentarians
+parliamentary
+parliaments
+parling
+parlor
+parlor's
+parlors
+parlous
+parlously
+parm
+Parma
+parmenides
+parmentier
+Parmesan
+parmigiana
+parmigianino
+parmigiano
+Parnassian
+Parnassus
+parnell
+parochial
+parochialism
+parochialism's
+parochialisms
+parochialization
+parochialization's
+parochializations
+parochialize
+parochializes
+parochially
+parodic
+parodied
+parodies
+parodist
+parodistic
+parody
+paroicous
+parol
+parole
+paroled
+parolee
+parolees
+paroles
+paroling
+paronomasia
+paronomastic
+paronym
+paronymous
+parotic
+parotid
+parotitis
+parotoid
+parous
+parousia
+paroxysm
+paroxysmal
+paroxytone
+parquet
+parqueted
+parqueting
+parquetry
+Parr
+Parr's
+parrakeet
+parramatta
+parrel
+parricidal
+parricide
+parried
+parrillo
+parring
+parris
+Parrish
+parrot
+parrotfish
+parroting
+parrotize
+parrotizes
+parrotlike
+parrots
+Parrs
+parry
+parrying
+pars
+parse
+parsec
+parsecs
+parsed
+Parsee
+parser
+parser's
+parsers
+parses
+Parsi
+Parsifal
+Parsifal's
+parsimonious
+parsimoniously
+parsimony
+parsing
+parsings
+parsley
+parsnip
+parson
+parson's
+parsonage
+parsonize
+parsonizes
+parsons
+part
+partake
+partaker
+partakes
+partaking
+partan
+parted
+parter
+parterre
+parters
+parthenocarpic
+parthenocarpically
+parthenocarpy
+parthenogenesis
+parthenogenetic
+parthenogenetically
+Parthenon
+Parthenopaeus
+Parthenope
+Parthenos
+Parthia
+parthia
+Parthian
+parti
+partial
+partiality
+partialize
+partializes
+partially
+partials
+partible
+participant
+participant's
+participants
+participate
+participated
+participates
+participating
+participation
+participations
+participative
+participator
+participatory
+participial
+participially
+participle
+participles
+particlar
+particle
+particle's
+particles
+particular
+particularism
+particularist
+particularistic
+particularity
+particularization
+particularization's
+particularizations
+particularize
+particularized
+particularizes
+particularizing
+particularly
+particulars
+particulate
+particulates
+partied
+parties
+parting
+partings
+partisan
+partisan's
+partisanize
+partisanizes
+partisans
+partisanship
+partita
+partite
+partition
+partitioned
+partitioner
+partitioning
+partitionist
+partitions
+partitive
+partitively
+partizan
+partlet
+partly
+partner
+partner's
+partnered
+partnering
+partners
+partnership
+partnerships
+partook
+partridge
+partridge's
+partridges
+parts
+parturient
+parturifacient
+parturition
+partway
+party
+party's
+partying
+parulis
+parure
+parve
+parvenu
+parvenue
+parvis
+parvise
+parzival
+pas
+Pasadena
+pasargadae
+pasay
+Pascal
+Pascal's
+Pasch
+paschal
+pase
+pash
+pasha
+pashalik
+pashka
+pashm
+Pashto
+pasionaria
+Paso
+pasolini
+pasqueflower
+pasquinade
+pass
+passable
+passably
+passacaglia
+passade
+passage
+passage's
+passaged
+passages
+passageway
+passaging
+Passaic
+Passamaquoddy
+passant
+passarine
+passavant
+passband
+passbook
+passbook's
+passbooks
+passe
+passed
+passel
+passementerie
+passenger
+passenger's
+passengerly
+passengers
+passepied
+passer
+passerby
+passerine
+passers
+passersby
+passes
+passible
+passifloraceous
+passim
+passing
+passion
+passional
+passionate
+passionately
+passionateness
+passionflower
+passionless
+passions
+Passiontide
+passivate
+passivated
+passivates
+passivating
+passivation
+passivations
+passive
+passively
+passiveness
+passives
+passivism
+passivist
+passivists
+passivity
+passkey
+Passover
+passport
+passport's
+passports
+password
+password's
+passworded
+passwords
+past
+past's
+pasta
+paste
+pasteboard
+pasted
+pastel
+pastelist
+pastellist
+pastels
+pastern
+pasternak
+Pasternak
+pasterns
+pastes
+pasteup
+Pasteur
+Pasteurism
+pasteurization
+pasteurizations
+pasteurize
+pasteurized
+pasteurizer
+Pasteurizers
+pasteurizes
+pasteurizing
+pastiche
+pastier
+pasties
+pastil
+pastilles
+pastime
+pastime's
+pastimes
+pastiness
+pasting
+pastis
+pastlle
+pastness
+pasto
+pastor
+pastor's
+pastoral
+pastorale
+pastoralism
+pastoralist
+pastoralize
+pastoralizes
+pastorally
+pastoralness
+pastorate
+pastorium
+pastorize
+pastorizes
+pastors
+pastorship
+pastrami
+pastries
+pastry
+pasts
+pasturage
+pasture
+pasture's
+pastured
+pastureland
+pasturer
+pastures
+pasturing
+pasty
+pat
+pat's
+patagium
+Patagonia
+Patagonians
+patagonians
+patch
+patchboard
+patched
+patcher
+patches
+patchier
+patchily
+patchiness
+patching
+patchouli
+patchouly
+patchwork
+patchworker
+patchworkers
+patchy
+pate
+pated
+patella
+patellae
+patellar
+patellas
+patellate
+patelliform
+paten
+patency
+patent
+patentability
+patentable
+patented
+patentee
+patentees
+patenter
+patenters
+patenting
+patently
+patentor
+patents
+pater
+paterfamilias
+paternal
+paternalism
+paternalist
+paternalistic
+paternalize
+paternalizes
+paternally
+paternity
+paternoster
+Paterson
+Paterson's
+path
+Pathan
+pathbreaking
+pathetic
+pathetical
+pathetically
+pathfind
+pathfinder
+pathfinding
+pathic
+pathlength
+pathless
+pathlessness
+pathname
+pathname's
+pathnames
+pathogen
+pathogenesis
+pathogenetic
+pathogenic
+pathogenically
+pathogenicity
+pathogens
+pathognomonic
+pathognomy
+pathol
+pathologic
+pathological
+pathologically
+pathologies
+pathologist
+pathologist's
+pathologists
+pathology
+pathometer
+pathometer's
+pathometers
+pathomorphologic
+pathomorphological
+pathomorphology
+pathophysiologic
+pathophysiological
+pathophysiology
+pathos
+paths
+pathway
+pathway's
+pathways
+patiala
+patible
+paticularly
+patience
+patient
+patient's
+patiently
+patients
+patil
+patin
+patina
+patinae
+patinas
+patine
+patined
+patining
+patio
+patios
+patisserie
+patisseries
+patmore
+Patmos
+patna
+patois
+paton
+patras
+patresfamilias
+patrial
+patriarch
+patriarchal
+patriarchate
+patriarchies
+patriarchs
+patriarchy
+Patrice
+Patricia
+patrician
+patrician's
+patricians
+patriciate
+patriciates
+patricidal
+patricide
+Patrick
+patriclinous
+patrilineage
+patrilineal
+patrilocal
+patrimonial
+patrimony
+patriot
+patriot's
+patriotic
+patriotically
+patriotism
+patriots
+patristic
+patristical
+patristics
+patroclus
+patrol
+patrol's
+patrolled
+patroller
+patrolling
+patrolman
+patrolmen
+patrology
+patrols
+patron
+patron's
+patronage
+patronal
+patroness
+patronizable
+patronizable's
+patronizables
+patronization
+patronization's
+patronizations
+patronize
+patronized
+patronizer
+patronizers
+patronizes
+patronizing
+patronizing's
+patronizingly
+patronizings
+patronly
+patronne
+patrons
+patronymic
+patroon
+pats
+Patsies
+Patsy
+patted
+patten
+patter
+pattered
+patterer
+pattering
+patterings
+pattern
+patterned
+patterning
+patternize
+patternizes
+patterns
+patters
+Patterson
+Patti
+Patti's
+pattie
+patties
+patting
+Patton
+patty
+patty's
+patulous
+patulously
+patulousness
+pau
+paua
+paucal
+paucity
+Pauk
+Paul
+Paul's
+Paula
+pauldron
+Paulette
+Paulette's
+Pauli
+Pauline
+Pauling
+pauling
+Paulinize
+Paulinizes
+Paulinus
+Paulo
+Paulo's
+paulownia
+Paulsen
+Paulson
+Paulus
+paumotu
+paunch
+paunchier
+paunchiness
+paunchy
+pauper
+pauperism
+pauperization
+pauperization's
+pauperizations
+pauperize
+pauperized
+pauperizer
+pauperizers
+pauperizes
+pauperizing
+pausanias
+pause
+paused
+pauses
+pausing
+pav
+pavage
+pavane
+pavanne
+Pavarotti
+pave
+paved
+pavement
+pavement's
+pavements
+paver
+paves
+pavese
+pavid
+pavilion
+pavilion's
+pavilions
+paving
+pavior
+pavis
+pavlodar
+Pavlov
+pavlova
+Pavlovian
+Pavo
+pavonine
+paw
+pawed
+pawing
+pawky
+pawl
+pawn
+pawn's
+pawnbroker
+pawnbroker's
+pawnbrokers
+pawnbroking
+pawned
+Pawnee
+pawnees
+pawner
+pawning
+pawnor
+pawns
+pawnshop
+pawnshop's
+pawnshops
+pawpaw
+paws
+Pawtucket
+pax
+paxam
+paxton
+paxwax
+pay
+payable
+paycheck
+paycheck's
+paychecks
+payday
+payed
+payee
+payer
+payer's
+payers
+paygrade
+paygrades
+paying
+payload
+payload's
+payloads
+paymaster
+paymasters
+payment
+payment's
+payments
+Payne
+Paynes
+paynim
+Paynize
+Paynizes
+payoff
+payoff's
+payoffs
+payola
+payor
+payroll
+payrolls
+pays
+Payson
+Paz
+PBS
+PC
+PC's
+PCB
+PCBS
+PCs
+PDP
+PDT
+pea
+pea's
+Peabody
+peace
+peaceable
+peaceableness
+peaceably
+peaceful
+peacefully
+peacefulness
+peacekeeper
+peacekeeping
+peacemake
+peacemaker
+peacemaking
+peaces
+peacetime
+peacetimes
+peach
+peach's
+peaches
+peachier
+Peachtree
+peachy
+peacock
+peacock's
+peacockish
+peacocks
+peafowl
+peag
+peahen
+peak
+peake
+peaked
+peakedness
+peaking
+peaks
+peaky
+peal
+Peale
+Peale's
+pealed
+pealike
+pealing
+peals
+pean
+peanut
+peanut's
+peanuts
+pear
+Pearce
+pearl
+pearl's
+pearler
+pearlescence
+pearlescent
+pearlier
+pearlite
+pearlitic
+pearlization
+pearlize
+pearlized
+pearlizes
+pearlizing
+pearls
+pearlstone
+pearlwort
+pearly
+pearmain
+pears
+Pears
+Pearson
+peart
+peary
+peas
+peasant
+peasant's
+peasanthood
+peasantize
+peasantizes
+peasantry
+peasants
+peascod
+Pease
+peasecod
+peashooter
+peasouper
+peat
+peaty
+peau
+peavey
+pebble
+pebble's
+pebbled
+pebbles
+pebbling
+pebbly
+pecan
+pecans
+peccable
+peccadillo
+peccadilloes
+peccancy
+peccant
+peccantly
+peccary
+peccavi
+pechora
+peck
+pecked
+pecker
+pecking
+peckinpah
+peckish
+pecks
+Pecksniffian
+pecky
+Pecos
+pectase
+pectate
+pecten
+pectic
+pectin
+pectinaceous
+pectinate
+pectinated
+pectination
+pectines
+pectization
+pectize
+pectized
+pectizes
+pectizing
+pectoral
+pectoralis
+pectorals
+peculate
+peculated
+peculates
+peculating
+peculation
+peculator
+peculiar
+peculiarities
+peculiarity
+peculiarity's
+peculiarize
+peculiarizes
+peculiarly
+peculiars
+peculium
+pecuniarily
+pecuniary
+pedagog
+pedagogic
+pedagogical
+pedagogically
+pedagogics
+pedagogue
+pedagogy
+pedal
+pedaled
+pedaler
+pedalers
+pedalfer
+pedalferic
+pedaling
+pedalo
+pedals
+pedant
+pedantic
+pedantically
+pedantize
+pedantizes
+pedantry
+pedate
+pedatifid
+peddle
+peddled
+peddler
+peddler's
+peddlers
+peddlery
+peddles
+peddling
+peden
+pederast
+pederastic
+pederasts
+pederasty
+pedestal
+pedestaled
+pedestaling
+pedestals
+pedestrian
+pedestrian's
+pedestrianism
+pedestrianization
+pedestrianize
+pedestrianized
+pedestrianizes
+pedestrianizing
+pedestrians
+pedi
+pediatric
+pediatrician
+pediatrics
+pediatrist
+pedicab
+pedicel
+pedicellate
+pedicle
+pedicled
+pedicular
+pediculate
+pediculosis
+pediculous
+pedicure
+pedicurist
+pediform
+pedigree
+pedigreed
+pediment
+pedimental
+pedimented
+pedipalp
+pedlar
+pedlary
+pedocal
+pedocalic
+pedogenesis
+pedogenetic
+pedogenic
+pedologic
+pedological
+pedologist
+pedology
+pedometer
+pedometer's
+pedometers
+pedophile
+pedophilia
+pedophiliac
+pedophilic
+Pedro
+pedunculate
+pee
+peebles
+peek
+peekaboo
+peeked
+peeking
+peeks
+peel
+peelable
+peeled
+peeler
+peeler's
+peeling
+peels
+peen
+peened
+peening
+peens
+peep
+peeped
+peeper
+peepers
+peephole
+peeping
+peeps
+peepshow
+peepul
+peepy
+peer
+peerage
+peered
+peeress
+peering
+peerless
+peerlessly
+peerlessness
+peers
+peeter
+peetweet
+peeve
+peeve's
+peeved
+peevers
+peeves
+peeving
+peevish
+peevishly
+peevishness
+peewee
+peewit
+peg
+peg's
+Pegasus
+pegboard
+pegboards
+pegged
+pegging
+Peggy
+pegmatite
+pegs
+pegu
+Pehlevi
+peignoir
+Peiping
+peipus
+peiraeus
+peirce
+pejoration
+pejorative
+pejoratively
+pejoratives
+pekan
+peke
+Pekin
+Peking
+Pekingese
+pekoe
+pelage
+Pelagian
+Pelagianism
+pelagic
+pelagius
+pelargonic
+pelargonium
+Pelasgian
+pelerine
+Peleus
+Pelew
+pelf
+Pelham
+Pelias
+pelican
+pelicans
+pelion
+pelisse
+pelite
+pella
+pellagra
+pellagrin
+pellagrous
+pelles
+pellet
+pellet's
+pelletal
+pelleted
+pelletier
+pelleting
+pelletization
+pelletizations
+pelletize
+pelletized
+pelletizer
+pelletizes
+pelletizing
+pellets
+pellicle
+pellitory
+pellucid
+pellucidity
+pellucidly
+pellucidness
+Pelmanism
+pelmet
+Peloponnese
+peloponnese
+Peloponnesian
+Pelops
+peloria
+peloric
+pelorus
+pelota
+pelotas
+pelt
+peltast
+peltate
+peltately
+pelter
+peltier
+pelting
+peltries
+peltry
+pelts
+pelvic
+pelvis
+pelvises
+pemba
+pemberton
+Pembroke
+Pembroke's
+Pembrokeshire
+pemican
+pemmican
+pemmicanization
+pemmicanization's
+pemmicanizations
+pemmicanize
+pemmicanizes
+pemphigus
+pen
+penal
+penalizable
+penalizable's
+penalizables
+penalization
+penalization's
+penalizations
+penalize
+penalized
+penalizes
+penalizing
+penally
+penalties
+penalty
+penalty's
+penance
+penanced
+penances
+penancing
+penang
+penates
+pence
+penchant
+penchi
+pencil
+penciled
+penciler
+pencilers
+penciling
+pencilings
+pencils
+pend
+pendant
+pended
+pendency
+pendent
+pendente
+pendentive
+pendently
+penderecki
+pending
+Pendleton
+pendleton
+pendragon
+pends
+pendular
+pendulous
+pendulously
+pendulousness
+pendulum
+pendulum's
+pendulums
+Penelope
+Penelope's
+peneplain
+penetrability
+penetrable
+penetrableness
+penetrably
+penetralia
+penetrance
+penetrances
+penetrant
+penetrants
+penetrate
+penetrated
+penetrates
+penetrating
+penetratingly
+penetration
+penetrations
+penetrative
+penetratively
+penetrativeness
+penetrator
+penetrator's
+penetrators
+penetrometer
+penetrometer's
+penetrometers
+peneus
+pengally
+pengpu
+penguin
+penguin's
+penguins
+Penh
+penholder
+penicillate
+penicillately
+penicillation
+penicillin
+penicillium
+penile
+penillion
+peninsula
+peninsula's
+peninsular
+peninsulas
+peninsulate
+penis
+penises
+penitence
+penitences
+penitency
+penitent
+penitential
+penitentially
+penitentiary
+penitently
+penki
+penknife
+penknife's
+penknives
+penlight
+penman
+penmanship
+penmen
+Penn
+penna
+pennaceous
+pennae
+pennant
+pennants
+pennate
+penned
+pennies
+penniless
+pennine
+pennines
+penning
+penninite
+pennis
+pennon
+pennoncel
+Pennsylvania
+Pennsylvania's
+penny
+penny's
+pennycress
+pennyroyal
+pennyweight
+pennywort
+pennyworth
+penological
+penologist
+penology
+penrith
+Penrose
+pens
+Pensacola
+pensile
+pension
+pensionable
+pensionary
+pensioned
+pensioner
+pensioners
+pensioning
+pensionless
+pensions
+pensive
+pensively
+pensiveness
+penstemon
+penstock
+pent
+penta
+pentachlorophenol
+pentacle
+pentacles
+pentad
+pentadactyl
+pentadactylism
+pentagon
+pentagon's
+pentagonal
+pentagonally
+pentagons
+pentagram
+pentagram's
+pentagrams
+pentagraph
+pentahedral
+pentahedron
+pentamerous
+pentameter
+pentane
+pentangle
+pentangles
+pentangular
+pentanoic
+pentapeptide
+pentaploid
+pentaploidy
+pentaprism
+pentaquin
+pentaquine
+pentarchy
+pentastich
+Pentateuch
+pentathlete
+pentathlon
+pentatomic
+pentatonic
+pentavalent
+pentazocine
+Pentecost
+pentecostal
+pentelikon
+pentene
+penthesileia
+pentheus
+penthouse
+penthouse's
+penthouses
+pentimento
+Pentland
+pentlandite
+pentobarbital
+pentobarbitone
+pentode
+pentodes
+pentomic
+pentosan
+pentose
+pentothal
+pentoxide
+Pentstemon
+pentyl
+pentylenetetrazol
+penuche
+penuchle
+penult
+penultima
+penultimate
+penultimately
+penumbra
+penumbral
+penurious
+penuriously
+penuriousness
+penury
+Penutian
+penza
+penzance
+peon
+peonage
+peones
+peonies
+peony
+people
+people's
+peopled
+peoplehood
+peopleless
+peoples
+peopling
+Peoria
+pep
+pepin
+peplos
+peplum
+pepo
+pepper
+peppercorn
+peppercorn's
+peppercorns
+peppered
+pepperer
+peppergrass
+peppering
+peppermint
+peppermints
+pepperminty
+pepperoni
+peppers
+peppertree
+pepperwort
+peppery
+peppier
+peppiness
+pepping
+peppy
+Pepsi
+pepsico
+Pepsico
+pepsin
+pepsinate
+pepsinogen
+peptic
+peptidase
+peptidases
+peptide
+peptides
+peptizable
+peptizable's
+peptizables
+peptization
+peptization's
+peptizations
+peptize
+peptized
+peptizer
+peptizers
+peptizes
+peptizing
+peptone
+peptonization
+peptonize
+peptonized
+peptonizes
+peptonizing
+Pepys
+Pequot
+per
+pera
+peracid
+peradventure
+peraea
+perak
+perambulate
+perambulated
+perambulates
+perambulating
+perambulation
+perambulations
+perambulator
+perambulatory
+perborate
+percale
+percaline
+perceivable
+perceivably
+perceive
+perceived
+perceiver
+perceivers
+perceives
+perceiving
+percent
+percentage
+percentages
+percentile
+percentiles
+percents
+percept
+perceptibility
+perceptible
+perceptibly
+perception
+perceptional
+perceptions
+perceptive
+perceptively
+perceptiveness
+perceptivity
+perceptual
+perceptually
+Perceval
+perch
+perchance
+perched
+Percheron
+perches
+perching
+perchlorate
+perchloric
+perchloride
+percipience
+percipient
+Percival
+Percival's
+percoid
+percoidean
+percolate
+percolated
+percolates
+percolating
+percolation
+percolator
+percolators
+percptibly
+percuss
+percussion
+percussionist
+percussionize
+percussionizes
+percussions
+percussive
+percussively
+percussiveness
+percutaneous
+percutaneously
+Percy
+perdido
+perdition
+perditions
+perdu
+perdurability
+perdurable
+perdurably
+pere
+peregrinate
+peregrinated
+peregrinates
+peregrinating
+peregrination
+peregrinations
+peregrine
+pereira
+peremptorily
+peremptoriness
+peremptory
+perennate
+perennated
+perennates
+perennating
+perennation
+perennations
+perennial
+perennialize
+perennializes
+perennially
+perennials
+Perez
+perfect
+perfecta
+perfected
+perfecter
+perfectibility
+perfectible
+perfecting
+perfection
+perfectionism
+perfectionist
+perfectionist's
+perfectionists
+perfections
+perfective
+perfectively
+perfectiveness
+perfectivity
+perfectivize
+perfectivizes
+perfectly
+perfectness
+perfecto
+perfects
+perfervid
+perfidious
+perfidiously
+perfidiousness
+perfidy
+perfin
+perfoliate
+perfoliation
+perforate
+perforated
+perforates
+perforating
+perforation
+perforations
+perforator
+perforce
+perform
+performable
+performance
+performance's
+performances
+performative
+performatory
+performed
+performer
+performers
+performing
+performs
+perfume
+perfumed
+perfumer
+perfumery
+perfumes
+perfuming
+perfunctorily
+perfunctoriness
+perfunctory
+perfuse
+perfused
+perfusing
+perfusion
+perfusive
+Pergamon
+pergamum
+pergola
+pergolesi
+perhaps
+peri
+perianth
+periapt
+periblem
+pericardial
+pericarditis
+pericardium
+pericarp
+perichondral
+perichondrial
+perichondrium
+periclase
+Periclean
+Pericles
+periclinal
+pericline
+pericope
+pericranial
+pericranium
+pericycle
+pericyclic
+pericynthion
+periderm
+peridermal
+peridermic
+peridia
+peridium
+peridot
+peridotic
+peridotite
+peridotitic
+perigean
+perigee
+perigee's
+periglacial
+perigon
+perigordian
+perigynous
+perigyny
+perihelial
+perihelion
+perikaryal
+perikaryon
+peril
+peril's
+periled
+periling
+Perilla
+perilous
+perilously
+perilousness
+perils
+perilune
+perilymph
+perimeter
+perimorph
+perimysium
+perinatal
+perinephrium
+perineum
+perineuritis
+perineurium
+period
+period's
+periodate
+periodic
+periodical
+periodicalize
+periodicalizes
+periodically
+periodicals
+periodicities
+periodicity
+periodization
+periodizations
+periodize
+periodized
+periodizes
+periodizing
+periodontal
+periodontally
+periodontics
+periodontist
+periods
+perioneum
+perionychium
+periosteum
+periostitis
+periotic
+peripatecically
+peripatetic
+peripatetically
+peripateticism
+peripatus
+peripety
+peripherad
+peripheral
+peripherally
+peripherals
+peripheries
+periphery
+periphery's
+periphrasis
+periphrastic
+periphrastically
+periphytic
+periphyton
+periplast
+peripteral
+perique
+perisarc
+periscope
+periscopes
+periscopic
+perish
+perishability
+perishable
+perishable's
+perishables
+perished
+perisher
+perishers
+perishes
+perishing
+perishingly
+perisperm
+perispomenon
+perissodactyl
+peristalsis
+peristome
+peristyle
+peritectic
+perithecium
+peritoneum
+peritonitis
+peritrack
+Peritricha
+peritrichous
+peritrichously
+periwig
+periwinkle
+periwinkles
+perjure
+perjured
+perjurer
+perjures
+perjuring
+perjurious
+perjuriously
+perjury
+perk
+perked
+perkier
+perkily
+perkiness
+perking
+Perkins
+perks
+perky
+Perle
+Perle's
+perlis
+perlite
+perlitic
+Perlman
+perlocution
+perlocutionary
+perm
+permafrost
+permalloy
+permanence
+permanency
+permanent
+permanently
+permanentness
+permanents
+permanganate
+permanganic
+permeability
+permeable
+permeableness
+permeably
+permeance
+permease
+permeate
+permeated
+permeates
+permeating
+permeation
+permeations
+permeative
+Permian
+permissable
+permissibility
+permissible
+permissibleness
+permissibly
+permission
+permissions
+permissive
+permissively
+permissiveness
+permit
+permit's
+permits
+permitted
+permitter
+permitting
+permittivity
+permutation
+permutation's
+permutational
+permutations
+permute
+permuted
+permutes
+permuting
+pernambuco
+pernicious
+perniciously
+perniciousness
+pernickety
+pernik
+pernod
+Pernod
+perogative
+peroneal
+peroral
+perorally
+perorate
+peroration
+perorational
+peroxidase
+peroxide
+peroxidic
+peroxidize
+peroxidizement
+peroxidizement's
+peroxidizements
+peroxidizes
+peroxisomal
+peroxisome
+peroxysulphuric
+perpend
+perpendicular
+perpendicularity
+perpendicularly
+perpendiculars
+perpetrate
+perpetrated
+perpetrates
+perpetrating
+perpetration
+perpetrations
+perpetrator
+perpetrator's
+perpetrators
+perpetual
+perpetually
+perpetuate
+perpetuated
+perpetuates
+perpetuating
+perpetuation
+perpetuator
+perpetuity
+perpignan
+perplex
+perplexed
+perplexedly
+perplexes
+perplexing
+perplexities
+perplexity
+perquisite
+perquisites
+perrault
+perrin
+perron
+Perry
+Perry's
+persalt
+perse
+persecute
+persecuted
+persecutes
+persecuting
+persecution
+persecutive
+persecutor
+persecutor's
+persecutors
+persecutory
+Perseid
+persephone
+Persephone
+Persephone's
+persepolis
+Perseus
+perseverance
+perseverant
+perseveration
+perseverations
+persevere
+persevered
+perseveres
+persevering
+Pershing
+Persia
+Persian
+Persianization
+Persianization's
+Persianizations
+Persianize
+Persianizes
+Persians
+Persicaria
+persiennes
+persiflage
+persimmon
+persimmons
+Persis
+persist
+persisted
+persistence
+persistency
+persistent
+persistently
+persister
+persisting
+persists
+persnickety
+person
+person's
+persona
+personable
+personableness
+personae
+personage
+personage's
+personages
+personal
+personalism
+personalist
+personalistic
+personalities
+personality
+personality's
+personalization
+personalization's
+personalizations
+personalize
+personalized
+personalizes
+personalizing
+personally
+personals
+personalty
+personate
+personated
+personates
+personating
+personation
+personative
+personator
+personhood
+personification
+personifications
+personified
+personifier
+personifies
+personify
+personifying
+personization
+personization's
+personizations
+personize
+personizes
+personnel
+persons
+perspective
+perspective's
+perspectively
+perspectives
+perspectivism
+perspex
+perspicacious
+perspicaciously
+perspicaciousness
+perspicacity
+perspicuity
+perspicuous
+perspicuously
+perspicuousness
+perspiration
+perspirations
+perspiratory
+perspire
+perspired
+perspires
+perspiring
+Persson
+persuadable
+persuade
+persuaded
+persuader
+persuaders
+persuades
+persuading
+persuasible
+persuasion
+persuasion's
+persuasions
+persuasive
+persuasively
+persuasiveness
+persulphate
+persulphuric
+pert
+pertain
+pertained
+pertaining
+pertains
+Perth
+pertinacious
+pertinaciously
+pertinaciousness
+pertinacity
+pertinence
+pertinency
+pertinent
+pertinently
+pertly
+pertness
+perturb
+perturbable
+perturbation
+perturbation's
+perturbational
+perturbations
+perturbative
+perturbed
+perturbing
+pertussis
+Peru
+perugia
+perugino
+peruke
+perusal
+peruse
+perused
+peruser
+perusers
+peruses
+perusing
+perutz
+Peruvian
+Peruvianize
+Peruvianizes
+Peruvians
+peruzzi
+perv
+pervade
+pervaded
+pervades
+pervading
+pervasion
+pervasive
+pervasively
+pervasiveness
+perverse
+perversely
+perverseness
+perversion
+perversions
+perversity
+perversive
+pervert
+perverted
+pervertedly
+pervertedness
+perverter
+perverting
+perverts
+pervious
+perviousness
+pes
+Pesach
+pesade
+pesaro
+pescadores
+pescara
+peseta
+pesewa
+peshawar
+peshitta
+peskier
+pesky
+peso
+pesos
+pessary
+pessimal
+pessimism
+pessimist
+pessimistic
+pessimistically
+pessimists
+pessimum
+pest
+pestalozzi
+peste
+pester
+pestered
+pestering
+pesters
+pesthole
+pesthouse
+pesticide
+pesticides
+pestiferous
+pestiferously
+pestiferousness
+pestilence
+pestilences
+pestilent
+pestilential
+pestilentially
+pestilently
+pestle
+pestled
+pestles
+pestling
+pests
+pet
+petal
+petal's
+petaled
+petaliferous
+petallike
+petalody
+petaloid
+petalous
+petals
+petard
+petasos
+petasus
+Pete
+Pete's
+petechia
+peter
+Peter
+Peter's
+Peterborough
+petered
+Peterlee
+Peterloo
+Peterman
+Petermann
+Peters
+peters
+Petersburg
+Petersen
+Petersham
+Peterson
+pethidine
+petiolate
+petiolated
+petiole
+petioled
+petiolule
+petit
+petite
+petiteness
+petition
+petitionary
+petitioned
+petitioner
+petitioning
+petitions
+petits
+Petkiewicz
+Petkiewicz's
+Petra
+petrarch
+petrarchan
+petrel
+petri
+Petrie
+petrifaction
+petrification
+petrified
+petrify
+Petrine
+petrochemical
+petrochemistry
+petrodollar
+petrogenesis
+petrogenetic
+petroglyph
+petrograd
+petrographer
+petrographic
+petrographical
+petrographically
+petrography
+petrol
+petrolatum
+petroleum
+petrolic
+petrolization
+petrolization's
+petrolizations
+petrolize
+petrolizes
+petrologic
+petrological
+petrologically
+petrologist
+petrology
+petronel
+Petronius
+Petropavlovsk
+petrosal
+Petrosian
+petrous
+Petrov
+Petrovsk
+Petrozavodsk
+pets
+petsamo
+petted
+petter
+petter's
+petters
+pettibone
+Pettibone
+petticoat
+petticoat's
+petticoated
+petticoats
+pettier
+pettiest
+pettifog
+pettifogger
+pettifoggery
+pettifogging
+pettily
+pettiness
+pettinesses
+petting
+pettish
+pettishly
+pettishness
+pettitoes
+petty
+petulance
+petulances
+petulancy
+petulant
+petulantly
+petunia
+petuntse
+Peugeot
+pevsner
+pew
+pew's
+Pewaukee
+pewaukee
+pewee
+pewit
+pews
+pewter
+pewterer
+Peyer
+peyote
+Peyton
+Peyton's
+Pfalz
+pfennig
+Pfizer
+Pforzheim
+ph
+Ph
+pH
+Phaeacian
+Phaedra
+Phaedrus
+phaeton
+phage
+phagedaena
+phagocyte
+phagocytes
+phagocytize
+phagocytizes
+phagocytosis
+phagomania
+phagophobia
+phalangeal
+phalanger
+phalanges
+phalanstery
+phalanx
+phalanxes
+phalarope
+phalli
+phallic
+phallically
+phallicism
+phallus
+phalluses
+phanerocrystalline
+phanerogam
+phanerogamic
+phanerogamous
+phanerophyte
+phanerozoic
+phantasm
+phantasma
+phantasmagoria
+phantasmagoric
+phantasmal
+phantasmic
+phantasy
+phantom
+phantom's
+phantomize
+phantomizer
+phantomizers
+phantomizes
+phantomlike
+phantoms
+pharaoh
+pharaonic
+pharisaic
+pharisaical
+pharisaically
+pharisaicalness
+pharisaism
+pharisee
+pharmaceutic
+pharmaceutical
+pharmaceutically
+pharmaceuticals
+pharmaceutics
+pharmacies
+pharmacist
+pharmacists
+pharmacodynamic
+pharmacodynamically
+pharmacodynamics
+pharmacogenetic
+pharmacogenetics
+pharmacognostic
+pharmacognostical
+pharmacognosy
+pharmacokinetic
+pharmacokinetics
+pharmacologic
+pharmacological
+pharmacologically
+pharmacologist
+pharmacology
+pharmacophore
+pharmacophores
+pharmacophoric
+pharmacopoeia
+pharmacy
+pharnges
+pharos
+pharsalus
+pharyngeal
+pharyngitis
+pharyngology
+pharyngoscope
+pharyngotomy
+pharynx
+pharynxes
+phase
+phased
+phaser
+phasers
+phases
+phasic
+phasing
+phasmid
+phatic
+PhD
+phd
+pheasant
+pheasant's
+pheasants
+pheidippides
+phelloderm
+phellogen
+Phelps
+phenacaine
+phenacetin
+phenacite
+phenanthrene
+phenazine
+phenetic
+phenetics
+phenetidine
+phenetole
+phenformin
+phenix
+phenobarbital
+phenobarbitone
+phenocain
+phenocopy
+phenocryst
+phenol
+phenolate
+phenolic
+phenolization
+phenolization's
+phenolizations
+phenolize
+phenolizes
+phenological
+phenologically
+phenology
+phenolphthalein
+phenomena
+phenomenal
+phenomenalism
+phenomenalist
+phenomenalistic
+phenomenalistically
+phenomenalization
+phenomenalization's
+phenomenalizations
+phenomenalize
+phenomenalizes
+phenomenally
+phenomenological
+phenomenologically
+phenomenologies
+phenomenologist
+phenomenology
+phenomenom
+phenomenon
+phenothiazine
+phenotype
+phenotypic
+phenotypical
+phenotypically
+phenoxide
+phentolamine
+phenyl
+phenylalanine
+phenylamine
+phenylene
+phenylephrine
+phenylic
+phenylketonuria
+pheromone
+pheromone's
+pheromones
+phew
+phi
+phial
+phidias
+phidippides
+Phil
+Philadelphia
+Philadelphus
+philae
+philander
+philandered
+philanderer
+philanderer's
+philanderers
+philandering
+philanders
+philanthropic
+philanthropical
+philanthropically
+philanthropies
+philanthropist
+philanthropists
+philanthropize
+philanthropizes
+philanthropy
+philatelic
+philatelically
+philatelist
+philately
+philby
+Philco
+philco
+philemon
+philharmonic
+philhellene
+philibeg
+Philip
+Philippe
+philippe
+Philippeville
+philippi
+philippians
+Philippians
+Philippic
+philippics
+Philippine
+Philippines
+philippopolis
+philips
+Philistia
+Philistine
+Philistines
+philistines
+Philistinism
+Philistinize
+Philistinizes
+Phillies
+Phillip
+Phillip's
+phillips
+Phillips
+phillumenist
+Philly
+Philoctetes
+philodendron
+philogyny
+philol
+philological
+philologically
+philologist
+philologists
+philology
+philomel
+Philomela
+philoprogenitive
+philoprogenitiveness
+philosopher
+philosopher's
+philosophers
+philosophic
+philosophical
+philosophically
+philosophies
+philosophization
+philosophization's
+philosophizations
+philosophize
+philosophized
+philosophizer
+philosophizers
+philosophizes
+philosophizing
+philosophy
+philosophy's
+philter
+philtre
+phimosis
+Phipps
+phiz
+phlebitis
+phlebosclerosis
+phlebotomization
+phlebotomize
+phlebotomized
+phlebotomizes
+phlebotomizing
+phlebotomy
+Phlegethon
+phlegm
+phlegmatic
+phlegmatically
+phlegmy
+phloem
+phlogistic
+phlogiston
+phlogopite
+phlox
+phlyctena
+phnom
+phobia
+phobic
+Phobos
+phocaea
+phocine
+phocis
+phocomelia
+phoebe
+phoebus
+Phoenicia
+Phoenicia's
+Phoenician
+phoenicians
+phoenix
+phomvihane
+phon
+phonate
+phonated
+phonates
+phonating
+phonation
+phone
+phone's
+phoned
+phonematic
+phoneme
+phoneme's
+phonemes
+phonemic
+phonemically
+phonemics
+phonendoscope
+phones
+phonetic
+phonetical
+phonetically
+phonetician
+phoneticization
+phoneticization's
+phoneticizations
+phoneticize
+phoneticizes
+phonetics
+phonetist
+phoney
+phoneys
+phonic
+phonically
+phonics
+phonier
+phonies
+phonily
+phoniness
+phoning
+phonocardiogram
+phonocardiogram's
+phonocardiograms
+phonocardiograph
+phonocardiographic
+phonocardiography
+phonogram
+phonogram's
+phonogramic
+phonogramically
+phonogrammic
+phonogrammically
+phonograms
+phonograph
+phonographer
+phonographic
+phonographically
+phonographs
+phonography
+phonolite
+phonolitic
+phonologial
+phonologic
+phonological
+phonologically
+phonologist
+phonology
+phonometer
+phonon
+phonons
+phonoreception
+phonoreceptor
+phonorecord
+phonos
+phonoscope
+phonotactics
+phonotype
+phonotypes
+phonotypy
+phony
+phooey
+phosgene
+phosgenite
+phosophoric
+phosphatase
+phosphate
+phosphate's
+phosphates
+phosphatic
+phosphatide
+phosphatidic
+phosphatidyl
+phosphatization
+phosphatization's
+phosphatizations
+phosphatize
+phosphatized
+phosphatizes
+phosphatizing
+phosphaturia
+phosphene
+phosphide
+phosphine
+phosphines
+phosphino
+phosphite
+phosphocreatine
+phospholipid
+phospholipids
+phosphonium
+phosphoprotein
+phosphor
+phosphorate
+phosphore
+phosphoresce
+phosphorescence
+phosphorescent
+phosphorescently
+phosphoreted
+phosphoretted
+phosphoric
+phosphorism
+phosphorite
+phosphoritic
+phosphorize
+phosphorizes
+phosphorolysis
+phosphorolytic
+phosphoroscope
+phosphorous
+phosphors
+phosphorus
+phosphoryl
+phosphorylase
+phosphorylate
+phosphorylation
+phosphorylative
+phossy
+phot
+photic
+photically
+photo
+photo's
+photoactinic
+photoactive
+photoautotrophic
+photoautotrophically
+photobiologic
+photobiological
+photobiologist
+photobiology
+photobiotic
+photocatalyzer
+photocatalyzer's
+photocatalyzers
+photocathode
+photocathodes
+photocell
+photochemical
+photochemically
+photochemist
+photochemistry
+photochromic
+photochromism
+photochronograph
+photocoagulation
+photocompose
+photocomposer
+photocomposition
+photoconduction
+photoconductive
+photoconductivity
+photocopied
+photocopier
+photocopies
+photocopy
+photocopying
+photocurrent
+photodecomposition
+photodetector
+photodiode
+photodiodes
+photodisintegrate
+photodisintegration
+photodissociation
+photodissociative
+photodrama
+photoduplicate
+photoduplication
+photodynamic
+photodynamically
+photodynamics
+photoelastic
+photoelasticity
+photoelectric
+photoelectrically
+photoelectron
+photoelectronic
+photoelectrons
+photoelectrotype
+photoemission
+photoemissive
+photoengrave
+photoengraver
+photoengravers
+photoengraving
+photofit
+photoflash
+photoflood
+photofluorogram
+photofluorogram's
+photofluorograms
+photofluorographic
+photofluorography
+photogene
+photogenic
+photogenically
+photogeologic
+photogeological
+photogeology
+photogram
+photogram's
+photogrammetric
+photogrammetrist
+photogrammetry
+photograms
+photograph
+photographed
+photographer
+photographers
+photographic
+photographically
+photographing
+photographize
+photographizes
+photographs
+photography
+photogravure
+photoheliograph
+photoinduced
+photoinduction
+photoinductive
+photoionization
+photoionization's
+photoionizations
+photoisomerization
+photoisomerization's
+photoisomerizations
+photojournalism
+photojournalist
+photojournalist's
+photojournalistic
+photojournalists
+photokinesis
+photokinetic
+photolabeled
+photolabeler
+photolabeling
+photolithograph
+photolithographer
+photolithographic
+photolithographically
+photolithography
+photoluminescence
+photolysis
+photolytic
+photolytically
+photolyzable
+photolyze
+photolyzed
+photolyzes
+photolyzing
+photomap
+photomechanical
+photomechanically
+photometer
+photometer's
+photometers
+photometric
+photometrically
+photometry
+photomicrgraphical
+photomicrogram
+photomicrogram's
+photomicrograms
+photomicrograph
+photomicrographic
+photomicrography
+photomicroscope
+photomicroscopic
+photomontage
+photomorphogenesis
+photomorphogenic
+photomultiplier
+photomural
+photon
+photon's
+photonasty
+photonegative
+photoneutron
+photonic
+photons
+photonuclear
+photooxidation
+photooxidative
+photoperiod
+photoperiodic
+photoperiodically
+photoperiodism
+photophilic
+photophilous
+photophily
+photophobia
+photophobic
+photophore
+photophysical
+photophysics
+photopia
+photoplay
+photopolymer
+photopolymerization
+photopolymerization's
+photopolymerizations
+photopositive
+photoprint
+photoproduct
+photoproduction
+photoreaction
+photorealism
+photoreception
+photoreceptive
+photoreceptor
+photoreconnaissance
+photorecord
+photorecorder
+photoreduction
+photoresistance
+photorespiration
+photos
+photoselected
+photoselection
+photosensitive
+photosensitivity
+photosensitization
+photosensitization's
+photosensitizations
+photosensitize
+photosensitized
+photosensitizer
+photosensitizers
+photosensitizes
+photosensitizing
+photoset
+photosetter
+photosphere
+photospheric
+photostat
+photostatic
+photosynthesis
+photosynthesize
+photosynthesized
+photosynthesizes
+photosynthesizing
+photosynthetic
+photosynthetically
+phototactic
+phototactically
+phototaxis
+phototelegraphy
+phototherapy
+photothermic
+phototonus
+phototopography
+phototransistor
+phototropic
+phototropically
+phototropism
+phototube
+phototype
+phototypeset
+phototypesetter
+phototypesetting
+phototypographic
+phototypography
+photovoltaic
+photozincography
+Phragmites
+phrasal
+phrasally
+phrase
+phrased
+phrasemaker
+phrasemaking
+phrasemonger
+phrasemongering
+phraseogram
+phraseogram's
+phraseograms
+phraseograph
+phraseological
+phraseologically
+phraseologies
+phraseologist
+phraseology
+phraseology's
+phrases
+phrasing
+phrasings
+phratries
+phratry
+phreatic
+phreatophyte
+phreatophytic
+phrenetic
+phrenic
+phrenitis
+phrenological
+phrenologically
+phrenologist
+phrenology
+phrensy
+phrixus
+phrygia
+Phrygian
+phthalate
+phthalein
+phthalic
+phthalocyanine
+phthiriasis
+phthisic
+phthisis
+phut
+phycologist
+phycology
+phycomycete
+phycomycetes
+phyfe
+phyla
+phylactery
+phylae
+phylar
+phyle
+phylesis
+phyletic
+phyllary
+Phyllis
+phyllite
+phylloclade
+phyllode
+phyllodium
+phylloid
+phyllome
+phyllomic
+phyllophagous
+phyllopod
+phylloquinone
+phyllotaxis
+Phylloxera
+phylogenetic
+phylogeny
+phylum
+physiatrics
+physiatrist
+physic
+physical
+physicalism
+physicalist
+physicalistic
+physicality
+physically
+physicalness
+physicals
+physician
+physician's
+physicians
+physicist
+physicist's
+physicists
+physicked
+physicking
+physicochemical
+physicochemically
+physics
+physiochemical
+physiocrat
+physiocratic
+physiognomic
+physiognomical
+physiognomically
+physiognomy
+physiographer
+physiographic
+physiographical
+physiography
+physiol
+physiologic
+physiological
+physiologically
+physiologist
+physiology
+physiopathologic
+physiopathological
+physiopathology
+physiotherapist
+physiotherapy
+physique
+physiqued
+physoclistous
+physostigmine
+physostomous
+phytane
+phytoalexin
+phytochemical
+phytochemically
+phytochemist
+phytochemistry
+phytochrome
+phytoflagellate
+phytogenesis
+phytogenic
+phytogeographic
+phytogeographical
+phytogeographically
+phytogeography
+phytography
+phytohormone
+phytolith
+phytoliths
+phytological
+phytologically
+phytology
+phyton
+phytonic
+phytopathogen
+phytopathogenic
+phytopathologic
+phytopathological
+phytopathology
+phytophagous
+phytophagy
+phytoplankton
+phytoplanktonic
+phytosociological
+phytosociologically
+phytosociologist
+phytosociology
+phytosterol
+phytotoxic
+phytotoxicity
+phytotoxin
+phytotron
+pi
+piacenza
+piacular
+piaf
+piaffe
+piaget
+pial
+pianism
+pianissimo
+pianist
+pianistic
+pianistically
+pianists
+piano
+piano's
+pianoforte
+pianoforte's
+pianofortes
+Pianola
+pianos
+pias
+piassava
+piaster
+piave
+Piavko
+piaza
+piazza
+piazza's
+piazzas
+piazze
+pibroch
+pic
+pica
+picador
+picadores
+picaninny
+picara
+Picard
+picardy
+picaresque
+picaro
+picaroon
+Picasso
+picayune
+picayunish
+Piccadilly
+piccalilli
+piccanin
+piccaninny
+piccard
+piccolo
+piccoloist
+pice
+piceous
+pichiciego
+pick
+pickaback
+pickaninny
+pickaroon
+pickax
+pickaxe
+picked
+pickeer
+picker
+pickerel
+pickerels
+pickerelweed
+pickering
+pickers
+picket
+picketboat
+picketed
+picketer
+picketers
+picketing
+pickets
+Pickett
+Pickett's
+Pickford
+pickier
+pickin
+picking
+pickings
+pickle
+pickled
+pickles
+pickling
+picklock
+Pickman
+pickoff
+pickoffs
+pickpocket
+pickproof
+picks
+pickthank
+pickup
+pickup's
+pickups
+Pickwickian
+picky
+picnic
+picnic's
+picnicked
+picnicker
+picnickers
+picnicking
+picnicky
+picnics
+picnometer
+picnometer's
+picnometers
+pico
+picofarad
+picofarads
+picogram
+picogram's
+picograms
+picojoule
+picoline
+picometer
+picometer's
+picometers
+picon
+picong
+picosecond
+picoseconds
+picot
+picotee
+picrate
+picric
+picrite
+picrotoxin
+Pict
+Pictish
+pictogram
+pictograph
+pictographic
+pictography
+pictor
+pictorial
+pictorialism
+pictorialization
+pictorialization's
+pictorializations
+pictorialize
+pictorialized
+pictorializes
+pictorializing
+pictorially
+pictorialness
+picts
+picture
+pictured
+picturegoer
+pictures
+picturesque
+picturesquely
+picturesqueness
+picturing
+picturization
+picturization's
+picturizations
+picturize
+picturized
+picturizes
+picturizing
+picul
+piddle
+piddling
+piddock
+pidgin
+pidginization
+pidginize
+pidginized
+pidginizes
+pidginizing
+pie
+piebald
+piece
+pieced
+piecemeal
+piecer
+pieces
+piecewise
+piecework
+pieceworker
+piecing
+piecrust
+pied
+Piedfort
+Piedmont
+piedmont
+piedmontite
+piefort
+pieing
+pieman
+piemonte
+pier
+pierce
+pierced
+pierces
+piercing
+piercingly
+pieria
+Pierian
+Pierides
+pieridine
+piero
+Pierre
+Pierrot
+piers
+Pierson
+pies
+pieta
+Pietermaritzburg
+Pieterson
+pieties
+pietism
+pietist
+pietistic
+pietistical
+pietistically
+pietro
+piety
+piezo
+piezochemistry
+piezoelectric
+piezoelectrically
+piezoelectricity
+piezometer
+piezometer's
+piezometers
+piezometric
+piezometry
+piffle
+piffled
+piffles
+piffling
+pig
+pig's
+pigboat
+pigeon
+pigeon's
+pigeonberry
+pigeonfoot
+pigeonhearted
+pigeonhole
+pigeonholed
+pigeonholes
+pigeonholing
+pigeons
+pigeonwing
+pigface
+pigfaced
+pigfish
+pigged
+piggeries
+piggery
+piggin
+pigging
+piggish
+piggishly
+piggishness
+piggledy
+piggott
+piggy
+piggyback
+piggybacked
+piggybacking
+pigheaded
+pigheadedness
+piglet
+piglets
+pigmeat
+pigment
+pigmentary
+pigmentation
+pigmentations
+pigmented
+pigmentize
+pigmentizes
+pigments
+pigmy
+pignut
+pigpen
+pigpens
+pigroot
+pigs
+pigskin
+pigstick
+pigsticker
+pigsticking
+pigsty
+pigswill
+pigtail
+pigtailed
+pigweed
+pika
+pike
+pike's
+piked
+pikelet
+pikeman
+pikeperch
+piker
+pikes
+pikestaff
+piking
+pilaf
+pilaff
+pilaster
+Pilate
+pilatus
+pilau
+pilch
+pilchard
+pilcomayo
+pile
+pilea
+pileate
+pileated
+piled
+pilei
+pileous
+pilers
+piles
+pileum
+pileup
+pileus
+pilewort
+pilfer
+pilferage
+pilfered
+pilferer
+pilfering
+pilfers
+pilgarlic
+pilgrim
+pilgrim's
+pilgrimage
+pilgrimage's
+pilgrimages
+pilgrimize
+pilgrimizes
+pilgrims
+pili
+piliferous
+piliform
+piling
+pilings
+pill
+pill's
+pillage
+pillaged
+pillager
+pillages
+pillaging
+pillar
+pillared
+pillarize
+pillarizes
+pillars
+pillbox
+pillboxes
+pillion
+pillions
+pilliwinks
+pilloried
+pillories
+pillory
+pillorying
+pillow
+pillow's
+pillowcase
+pillowcases
+pillows
+pills
+Pillsbury
+pillwort
+pilocarpine
+piloerection
+pilose
+pilot
+pilot's
+pilotage
+pilotages
+piloted
+pilothouse
+piloting
+pilotless
+pilots
+Pilsen
+pilsener
+pilsner
+Pilsudski
+Piltdown
+pilular
+pilule
+pilus
+pimento
+pimiento
+pimp
+pimpernel
+pimping
+pimple
+pimpled
+pimples
+pimplike
+pimply
+pimps
+pin
+pin's
+pinaceous
+pinafore
+pinafores
+pinar
+pinaster
+pinata
+pinball
+pinbone
+pincer
+pincer's
+pincerlike
+pincers
+pinch
+pinchbeck
+pinchcock
+pinched
+pincher
+pinches
+pinching
+pinchpenny
+pinckney
+pincushion
+pindar
+Pindaric
+pindling
+pindus
+pine
+pineal
+pineapple
+pineapple's
+pineapples
+pinecone
+pined
+pinedrops
+Pinehurst
+pinene
+pinero
+pinery
+pines
+pinesap
+pineta
+pinetum
+pinewood
+piney
+pinfeather
+pinfish
+pinfold
+ping
+pinger
+pinging
+pingo
+pinguid
+pinhead
+pinheaded
+pinheadedness
+pinheads
+pinhole
+pinholes
+pining
+pinion
+pinioned
+pinions
+pinite
+pink
+pinked
+pinker
+Pinkerton
+pinkest
+pinkeye
+pinkie
+pinkies
+pinking
+pinkish
+pinkishness
+pinkly
+pinkness
+pinko
+pinkoes
+pinkos
+pinkroot
+pinks
+Pinkster
+pinky
+pinna
+pinnace
+pinnacle
+pinnacle's
+pinnacled
+pinnacles
+pinnacling
+pinnae
+pinnal
+pinnas
+pinnate
+pinnately
+pinnatifid
+pinnatipartite
+pinnatiped
+pinnatisect
+pinned
+pinner
+pinning
+pinnings
+pinniped
+pinniped's
+pinnipeds
+pinnula
+pinnular
+pinnulate
+pinnulated
+pinnule
+pinny
+pinochet
+pinochle
+pinole
+pinpoint
+pinpointed
+pinpointing
+pinpoints
+pinprick
+pinpricks
+pins
+pinscher
+pinsetter
+Pinsk
+Pinsky
+Pinsky's
+pinspotter
+pinstripe
+pint
+pint's
+pinta
+pintadera
+pintail
+pintails
+pinter
+pintle
+pinto
+pintoes
+pints
+pinturicchio
+pinup
+pinwheel
+pinwork
+pinworm
+pinxter
+piny
+piolet
+pion
+pioneer
+pioneered
+pioneering
+pioneers
+pionic
+Piotr
+Piotr's
+pious
+piously
+piousness
+pip
+pipa
+pipage
+pipal
+pipe
+pipeage
+pipeclay
+piped
+pipefish
+pipefitting
+pipeful
+pipeless
+pipelike
+pipeline
+pipelined
+pipelines
+pipelining
+piper
+piperaceous
+piperazine
+piperidine
+piperine
+piperonal
+pipers
+pipes
+Pipestone
+pipestone
+pipet
+pipette
+pipewort
+pipgras
+piping
+pipingly
+pipings
+pipistrelle
+pipit
+pipkin
+pippin
+pipping
+pipsissewa
+pipsqueak
+piquancy
+piquant
+piquantly
+piquantness
+pique
+piqued
+piquet
+piquing
+piracy
+Piraeus
+piragua
+pirandello
+piranesi
+piranha
+piraro
+pirate
+pirate's
+pirated
+pirates
+piratical
+piratically
+pirating
+piratize
+piratizes
+pirhouette
+pirn
+pirog
+pirogue
+piroplasm
+piroplasma
+piroplasmata
+pirouette
+pirouetting
+pirozhki
+Pisa
+Pisanello
+Pisano
+piscary
+Piscataway
+Piscataway's
+piscatorial
+Pisces
+piscicultural
+pisciculture
+pisciculturist
+piscina
+piscine
+Piscis
+piscivorous
+pisgah
+pish
+pishogue
+pishpek
+pisiform
+pisistratus
+pismire
+pisolite
+pisolitic
+piss
+pissarro
+pissed
+pisser
+pisses
+pissing
+pissoir
+pistachio
+pistareen
+piste
+pistil
+pistil's
+pistillate
+pistils
+pistoia
+pistol
+pistol's
+pistole
+pistoled
+pistoleer
+pistoleers
+pistoling
+pistols
+piston
+piston's
+pistons
+pit
+pit's
+pita
+pitapat
+Pitcairn
+pitch
+pitchblende
+pitched
+pitcher
+pitchers
+pitches
+pitchfork
+pitchfork's
+pitchforks
+pitching
+pitchman
+pitchometer
+pitchometers
+pitchout
+pitchstone
+pitchy
+piteous
+piteously
+piteousness
+pitfall
+pitfall's
+pitfalls
+pith
+pithead
+Pithecanthropus
+pithed
+pithes
+pithier
+pithiest
+pithily
+pithiness
+pithing
+pithos
+pithy
+pitiable
+pitiableness
+pitiably
+pitied
+pitier
+pitiers
+pities
+pitiful
+pitifully
+pitifulness
+pitiless
+pitilessly
+pitilessness
+pitman
+Pitney
+piton
+piton's
+pitons
+pitot
+pits
+pitsaw
+Pitt
+Pitta
+pittance
+pittance's
+pittances
+pitted
+pitting
+Pittsburgh
+Pittsburghers
+Pittsfield
+Pittston
+pituitary
+pituri
+pity
+pitying
+pityingly
+pityriasis
+piura
+Pius
+pivot
+pivotable
+pivotal
+pivotally
+pivoted
+pivoting
+pivotman
+pivots
+pix
+pixel
+pixel's
+pixels
+pixie
+pixieish
+pixies
+pixilated
+pixilates
+pixilation
+pixiness
+pixmap
+pixmap's
+pixmaps
+pixy
+Pizarro
+pizazz
+pize
+pizz
+pizza
+pizzazz
+pizzeria
+pizzicato
+pizzle
+Pl
+placability
+placable
+placably
+placard
+placard's
+placards
+placate
+placated
+placater
+placates
+placating
+placation
+placative
+placatory
+place
+placeable
+placebo
+placed
+placeholder
+placeless
+placelessly
+placeman
+placemat
+placemat's
+placemats
+placement
+placement's
+placements
+placency
+placent
+placenta
+placental
+placentation
+placentations
+placentia
+placer
+places
+placet
+placid
+placidity
+placidly
+placidness
+placing
+placket
+placoderm
+placoid
+plafond
+plagal
+plage
+plagiarism
+plagiarist
+plagiaristic
+plagiarization
+plagiarization's
+plagiarizations
+plagiarize
+plagiarized
+plagiarizer
+plagiarizers
+plagiarizes
+plagiarizing
+plagiary
+plagioclase
+plagioclimax
+plagiotropism
+plague
+plagued
+plaguer
+plagues
+plaguesome
+plaguey
+plaguily
+plaguing
+plaguy
+plaice
+plaid
+plaid's
+plaided
+plaids
+plain
+plainchant
+plainclothes
+plainclothesman
+plainer
+plainest
+Plainfield
+plainly
+plainness
+plains
+plainsman
+plainsong
+plainspoken
+plainspokenness
+plaint
+plaintext
+plaintful
+plaintiff
+plaintiff's
+plaintiffs
+plaintive
+plaintively
+plaintiveness
+Plainview
+plainview
+plaister
+plait
+plait's
+plaiter
+plaiting
+plaits
+plan
+plan's
+planar
+planarian
+planarity
+planation
+planchet
+planchette
+Planck
+Planck's
+plane
+plane's
+planed
+planeload
+planer
+planers
+planes
+planet
+planet's
+planetaria
+planetarium
+planetary
+planetesimal
+planetoid
+planetoidal
+planetoids
+planetological
+planetologist
+planetology
+planets
+planform
+plangency
+plangent
+plangently
+planimeter
+planimeter's
+planimeters
+planimetric
+planimetry
+planing
+planish
+planisher
+planisphere
+planispheric
+plank
+planking
+planks
+plankton
+planktonic
+planless
+planlessly
+planlessness
+planned
+planner
+planner's
+planners
+planning
+plano
+planoconcave
+planoconvex
+planogamete
+planograph
+planographic
+planography
+planometer
+planosol
+plans
+plant
+plantable
+plantagenet
+plantain
+plantar
+plantation
+plantation's
+plantations
+planted
+planter
+planters
+plantigrade
+planting
+plantings
+plantlike
+plantocracy
+plants
+planula
+planular
+planuloid
+plaque
+plaques
+plash
+plashy
+plasm
+plasma
+plasmagel
+plasmagene
+plasmagenic
+plasmalemma
+plasmapheresis
+plasmasol
+plasmatic
+plasmid
+plasmid's
+plasmids
+plasmin
+plasminogen
+plasmodesm
+plasmodesma
+plasmodium
+plasmogamy
+plasmolysis
+plasmolytic
+plasmolytically
+plasmolyze
+plasmon
+plasmosome
+plasodesma
+plassey
+Plasson
+plaster
+plasterboard
+plastered
+plasterer
+plasterers
+plastering
+plasters
+plasterwork
+plastery
+plastic
+plastically
+Plasticine
+plasticity
+plasticization
+plasticization's
+plasticizations
+plasticize
+plasticized
+plasticizer
+plasticizers
+plasticizes
+plasticizing
+plasticly
+plastics
+plastid
+plastidial
+plastisol
+plastisols
+plastogene
+plastometer
+plastral
+plastron
+plat
+plata
+plataea
+platan
+plate
+plateau
+plateau's
+plateaus
+plateaux
+plated
+plateful
+platelayer
+platelayers
+platelet
+platelet's
+platelets
+platelike
+platemaker
+platemaking
+platemark
+platemarks
+platen
+platen's
+platens
+plater
+plateresque
+platers
+plates
+platform
+platform's
+platforms
+plath
+platies
+platina
+plating
+platings
+platinic
+platiniferous
+platiniridium
+platinization
+platinization's
+platinizations
+platinize
+platinized
+platinizes
+platinizing
+platinocyanic
+platinocyanide
+platinoid
+platinotype
+platinous
+platinum
+platipi
+platipi's
+platitude
+platitudes
+platitudinal
+platitudinarian
+platitudinization
+platitudinize
+platitudinized
+platitudinizes
+platitudinizing
+platitudinous
+platitudinously
+Plato
+platonic
+Platonical
+platonically
+Platonism
+Platonist
+platonization
+platonize
+platonized
+platonizes
+platonizing
+platoon
+platoons
+Plattdeutsch
+Platte
+platted
+Platteland
+platter
+platter's
+platterful
+platters
+Platteville
+platting
+platy
+platyhelminth
+platypus
+platypus's
+platypuses
+platyrrhine
+plauded
+plauding
+plaudit
+plauen
+plause
+plausibility
+plausible
+plausibleness
+plausibly
+plausive
+Plautus
+play
+playa
+playability
+playable
+playact
+playback
+playbacks
+playbill
+playbills
+playbook
+playboy
+playboys
+played
+player
+player's
+players
+playful
+playfully
+playfulness
+playgirl
+playgoer
+playgoers
+playground
+playground's
+playgrounds
+playgroup
+playgroups
+playhouse
+playhouses
+playing
+playland
+playlet
+playmaker
+playmate
+playmate's
+playmates
+playoff
+playpen
+playpen's
+playpens
+playroom
+plays
+playschool
+playsuit
+plaything
+plaything's
+playthings
+playtime
+playwright
+playwright's
+playwrights
+playwriting
+plaza
+plazas
+plea
+plea's
+pleach
+plead
+pleadable
+pleaded
+pleader
+pleading
+pleadingly
+pleadings
+pleads
+pleas
+pleasance
+pleasant
+pleasantly
+pleasantness
+pleasantry
+please
+pleased
+pleasely
+pleaser
+pleases
+pleasing
+pleasingly
+pleasingness
+pleasurability
+pleasurable
+pleasurableness
+pleasurably
+pleasure
+pleasured
+pleasureless
+pleasures
+pleasuring
+pleat
+pleated
+pleater
+pleatless
+pleats
+pleb
+plebby
+plebe
+plebeian
+plebeianism
+plebeianize
+plebeianizes
+plebeianly
+plebes
+plebian
+plebiscitary
+plebiscite
+plebiscite's
+plebiscites
+plebs
+plectognath
+plectrum
+plectrum's
+plectrums
+pled
+pledge
+pledged
+pledgee
+pledger
+pledges
+pledget
+pledging
+pledgor
+pleiad
+Pleiades
+pleiocene
+pleiotropism
+Pleistocene
+plenary
+plenipotent
+plenipotentiary
+plenish
+plenitude
+plenitudinous
+plenteous
+plenteously
+plenteousness
+plenties
+plentiful
+plentifully
+plentifulness
+plentitude
+plenty
+plenum
+pleochroism
+pleomorphism
+pleonasm
+pleopod
+plesiosaur
+plessor
+plethora
+plethoric
+plethysmograph
+pleura
+pleurae
+pleural
+pleuras
+pleurisy
+pleuritic
+pleurodont
+pleurodynia
+pleuron
+pleuropneumonia
+pleurotomy
+pleuston
+pleven
+plex
+plexiform
+Plexiglas
+plexiglass
+plexor
+plexus
+pliability
+pliable
+pliableness
+pliably
+pliancy
+pliant
+pliantly
+pliantness
+plica
+plicate
+plication
+plied
+plier
+pliers
+plies
+plight
+plighter
+plimsoll
+plink
+plinked
+plinker
+plinking
+plinks
+plinth
+Pliny
+Pliocene
+ploat
+plod
+plodded
+plodder
+plodding
+ploddingly
+plodge
+plods
+plonk
+plonko
+plop
+plopped
+plopping
+plosion
+plosive
+plot
+plot's
+plotinus
+plotless
+plotlessness
+plots
+plottable
+plottage
+plotted
+plotter
+plotter's
+plotters
+plottier
+plotting
+plotty
+ploughboys
+ploughmen
+ploughs
+ploughstaff
+plover
+plovers
+plow
+plowable
+plowboy
+plowed
+plower
+plowhead
+plowing
+plowman
+plowmen
+plowmen's
+plows
+plowshare
+plowshare's
+plowshares
+ploy
+ploy's
+ploys
+pluck
+plucked
+plucker
+pluckier
+pluckily
+pluckiness
+plucking
+plucky
+plug
+plug's
+plugboard
+plugboard's
+plugboards
+pluggable
+plugged
+plugger
+plugging
+plugs
+plum
+plum's
+plumage
+plumaged
+plumages
+plumate
+plumb
+plumb's
+plumbaginaceous
+plumbaginous
+plumbago
+plumbate
+plumbed
+plumbeous
+plumber
+plumbers
+plumbic
+plumbicon
+plumbiferous
+plumbing
+plumbism
+plumbous
+plumbs
+plumbum
+plume
+plumed
+plumelet
+plumes
+plumier
+pluming
+plumlike
+plummer
+plummet
+plummeted
+plummeting
+plummets
+plummier
+plummy
+plumose
+plumosely
+plump
+plumped
+plumpen
+plumper
+plumpish
+plumply
+plumpness
+plums
+plumulate
+plumule
+plumulose
+plumy
+plunder
+plunderable
+plunderage
+plundered
+plunderer
+plunderers
+plundering
+plunderous
+plunders
+plunge
+plunged
+plunger
+plungers
+plunges
+plunging
+plunk
+plunker
+plunkers
+plunking
+pluperfect
+plural
+pluralism
+pluralist
+pluralistic
+pluralistically
+pluralists
+plurality
+pluralization
+pluralization's
+pluralizations
+pluralize
+pluralized
+pluralizer
+pluralizers
+pluralizes
+pluralizing
+plurally
+plurals
+pluriaxial
+pluriliteral
+pluripotent
+pluripresence
+plus
+pluses
+plush
+plushier
+plushiness
+plushly
+plushness
+plushy
+plussage
+plusses
+Plutarch
+Pluto
+plutocracy
+plutocrat
+plutocratic
+plutocratically
+pluton
+plutonian
+plutonic
+plutonium
+plutus
+pluvial
+pluviometer
+pluvious
+ply
+plying
+Plymouth
+plyscore
+plywood
+PM
+pma
+pneuma
+pneumatic
+pneumatically
+pneumaticity
+pneumatics
+pneumatology
+pneumatolysis
+pneumatolytic
+pneumatometer
+pneumatometer's
+pneumatometers
+pneumatophore
+pneumatophoric
+pneumectomy
+pneumobacillus
+pneumococcus
+pneumoconiosis
+pneumodynamics
+pneumogastric
+pneumograph
+pneumonectomy
+pneumonia
+pneumonic
+pneumonitis
+pneumothorax
+pnom
+poaceous
+poach
+poached
+poacher
+poachers
+poaches
+poaching
+POBox
+Pocahontas
+pocahontas
+pochard
+pock
+pocket
+pocketbook
+pocketbook's
+pocketbooks
+pocketed
+pocketful
+pocketing
+pocketknife
+pocketknife's
+pocketknives
+pockets
+pockmark
+pocky
+poco
+pococurante
+Pocono
+Poconos
+pocus
+pod
+pod's
+podagra
+podagral
+podded
+podding
+poddy
+podesta
+podge
+podger
+podgers
+podgier
+podgorica
+podgy
+podia
+podiatric
+podiatrist
+podiatry
+podite
+poditic
+podium
+Podolsk
+podophyllin
+pods
+podsol
+Poe
+poem
+poem's
+poems
+poenology
+poesies
+poesy
+poet
+poet's
+poetaster
+poetess
+poetic
+poetical
+poetically
+poeticalness
+poeticism
+poeticization
+poeticize
+poeticized
+poeticizes
+poeticizing
+poetics
+poetization
+poetization's
+poetizations
+poetize
+poetized
+poetizer
+poetizers
+poetizes
+poetizing
+poetries
+poetry
+poetry's
+poets
+pogey
+pogge
+pogo
+Pogonia
+Pogorelich
+pogrom
+pogromist
+pogromize
+pogromizes
+pogroms
+pogy
+pohai
+pohutukawa
+poi
+poignancy
+poignant
+poignantly
+poikilotherm
+poikilothermic
+poikilothermism
+poilu
+Poincare
+poinciana
+poind
+Poindexter
+poinsettia
+point
+pointe
+pointed
+pointedly
+pointedness
+pointer
+pointers
+pointier
+pointiest
+pointillism
+pointillist
+pointilliste
+pointillistic
+pointing
+pointless
+pointlessly
+pointlessness
+points
+pointsman
+pointwise
+pointy
+poirot
+poise
+poised
+poises
+poising
+poison
+poisoned
+poisoner
+poisoning
+poisonous
+poisonously
+poisonousness
+poisons
+Poisson
+poitiers
+poitou
+poitrine
+poke
+pokeberry
+poked
+pokelogan
+poker
+pokerface
+pokerfaced
+pokes
+pokeweed
+pokey
+pokeys
+pokie
+pokier
+pokily
+pokiness
+poking
+poky
+pol
+pola
+Polack
+polacre
+Poland
+Poland's
+Polanski
+polar
+polarimeter
+polarimeter's
+polarimeters
+polarimetric
+polarimetry
+Polaris
+polariscope
+polariscopic
+polarities
+polariton
+polarity
+polarity's
+polarizabilities
+polarizability
+polarizability's
+polarizable
+polarizable's
+polarizables
+polarization
+polarization's
+polarizations
+polarize
+polarized
+polarizer
+polarizers
+polarizes
+polarizing
+polarogram
+polarogram's
+polarograms
+polarograph
+polarographic
+polarographically
+polarography
+Polaroid
+polaron
+polder
+pole
+poleax
+poleaxe
+polecat
+poled
+poleless
+polemarch
+polemic
+polemical
+polemically
+polemicist
+polemicize
+polemicized
+polemicizes
+polemicizing
+polemics
+polemist
+polemize
+polemized
+polemizes
+polemizing
+polemoniaceous
+polemonium
+polenta
+poler
+poles
+polestar
+poleward
+poleyn
+police
+police's
+policed
+policeman
+policeman's
+policemen
+policemen's
+polices
+policewoman
+policewoman's
+policewomen
+policies
+policing
+policize
+policizer
+policizers
+policizes
+policy
+policy's
+policyholder
+policyholders
+policymaker
+policymakers
+policymaking
+poling
+polio
+poliomyelitic
+poliomyelitis
+poliovirus
+polis
+polish
+polished
+polisher
+polishers
+polishes
+polishing
+politburo
+polite
+politely
+politeness
+politer
+politesse
+politest
+politic
+political
+politicalize
+politicalizes
+politically
+politician
+politician's
+politicians
+politicization
+politicize
+politicized
+politicizer
+politicizers
+politicizes
+politicizing
+politick
+politicker
+politicking
+politico
+politicos
+politics
+polities
+politize
+politizes
+polity
+Polje
+Polk
+polka
+polka's
+polkadot
+polkadots
+polkas
+poll
+Pollack
+pollaiuolo
+pollan
+Pollard
+Pollard's
+polled
+pollee
+pollen
+pollenate
+pollenated
+pollenates
+pollenating
+pollenation
+pollenizer
+pollenosis
+poller
+pollex
+pollical
+pollices
+pollinate
+pollinated
+pollinates
+pollinating
+pollination
+pollinator
+polling
+Pollini
+pollinic
+polliniferous
+pollinium
+pollinize
+pollinized
+pollinizer
+pollinizes
+pollinizing
+pollinosis
+polliwog
+pollock
+polloi
+polls
+pollster
+pollutant
+pollutants
+pollute
+polluted
+polluter
+pollutes
+polluting
+pollution
+pollutive
+Pollux
+Pollyanna
+pollywog
+pollywog's
+pollywogs
+polo
+poloist
+polonaise
+polonium
+polony
+Polska
+poltava
+poltergeist
+poltroon
+poltroonery
+poltroonish
+poltroonishly
+Poly
+poly
+polyadelphous
+polyamide
+polyandrous
+polyandry
+polyanka
+polyantha
+polyanthus
+polyatomic
+polybasic
+polybasite
+polybius
+polybutene
+polybutenes
+polycarbonate
+Polycarp
+polycarpellary
+polycarpic
+polycarpous
+polycarpy
+polycentrism
+polychaete
+polychaetous
+polychasium
+polychemicals
+polychotomous
+polychotomy
+polychromatic
+polychromatize
+polychromatizes
+polychrome
+polychromize
+polychromizes
+polychromy
+polycistronic
+polyclinic
+polycondensation
+polyconic
+polycot
+polycotyl
+polycotyledon
+polycotyledonous
+polycrates
+polycrystal
+polycrystalline
+polycyclic
+polycythemia
+polycythemic
+polydactyl
+polydactylous
+polydactyly
+polydemic
+polydeuces
+polydipsi
+polydipsia
+polydisperse
+polydispersity
+polyelectrolytes
+polyembryony
+polyester
+polyesters
+polyether
+polyethers
+polyethylene
+polygala
+polygalaceous
+polygamic
+polygamical
+polygamically
+polygamist
+polygamize
+polygamizes
+polygamous
+polygamously
+polygamy
+polygene
+polygenesis
+polygenesist
+polygenetic
+polygenetically
+polygenic
+polyglandular
+polyglot
+polyglotism
+polyglottism
+polygnotus
+polygon
+polygon's
+polygonaceous
+polygonal
+polygonally
+polygons
+polygonum
+polygram
+polygram's
+polygrams
+polygraph
+polygraphic
+polygynoecial
+polygynous
+polygyny
+polyhedra
+polyhedral
+polyhedron
+polyhedrosis
+polyhistor
+polyhistoric
+polyhydric
+polyhydroxy
+Polyhymnia
+polyisobutylene
+polyisocyanates
+polyisoprene
+polymath
+polymathic
+polymathy
+polymer
+polymer's
+polymerase
+polymeric
+polymerically
+polymerism
+polymerization
+polymerization's
+polymerizations
+polymerize
+polymerizes
+polymerous
+polymers
+polymorph
+polymorphic
+polymorphically
+polymorphism
+polymorphonuclear
+polymorphous
+polymorphously
+polymyositis
+polymyxin
+Polynesia
+Polynesia's
+Polynesian
+polyneuritis
+polynices
+polynomial
+polynomial's
+polynomials
+polynuclear
+polynucleotide
+polynya
+polyonymous
+polyoxyethene
+polyp
+polypary
+polypeptide
+polypeptidic
+polypetalous
+polyphagia
+polyphagous
+polyphagy
+polyphase
+polyphasic
+Polyphemus
+polyphenol
+polyphenolic
+polyphone
+polyphonic
+polyphonically
+polyphonous
+polyphonously
+polyphony
+polyphosphate
+polyphosphates
+polyphosphoric
+polyphyletic
+polyphyletically
+polyphyleticism
+polyphyodont
+polypide
+polyploid
+polyploidy
+polypnea
+polypneic
+polypod
+polypody
+polypoid
+polypous
+polypropylene
+polyprotodont
+polyptych
+polypus
+polyrhythm
+polyrhythmic
+polyrhythmically
+polyribonucleotide
+polyribosomal
+polyribosome
+Polys
+polysaccharide
+polysaccharides
+polysaprobic
+polysemous
+polysemy
+polysepalous
+polysilicon
+polysiloxanes
+polysome
+polysomic
+polysorbate
+polystichous
+polystyrene
+polysulfide
+polysulphide
+polysulphurization
+polysulphurization's
+polysulphurizations
+polysyllabic
+polysyllabically
+polysyllable
+polysyllogism
+polysynaptic
+polysynaptically
+polysyndeton
+polytechnic
+polytene
+polyteny
+polytheism
+polytheist
+polytheistic
+polytheistical
+polythene
+polythetic
+polythionic
+polytocous
+polytonal
+polytonality
+polytonally
+polytope
+polytrophic
+polytype
+polytypic
+polytypism
+polytypy
+polyunsaturated
+polyurethane
+polyuria
+polyvalence
+polyvalent
+polyvinyl
+polyvinylidene
+polywater
+polyxena
+polyzoan
+polyzoarium
+polyzoic
+pom
+pomace
+pomaceous
+pomade
+pomaded
+pomades
+pomander
+pomatum
+pombal
+pombe
+pome
+pomegranate
+pomelo
+pomerania
+Pomerania
+Pomeranian
+pomeranian
+pomfret
+pomiculture
+pomiferous
+pommel
+pommeled
+pommeling
+pommern
+pommy
+pomological
+pomologically
+pomologist
+pomology
+Pomona
+pomorze
+pomp
+pompadour
+pompano
+Pompeii
+Pompey
+pompey
+pompidou
+pompon
+pompons
+pomposity
+pompous
+pompously
+pompousness
+pon
+Ponce
+Ponchartrain
+Ponchartrain's
+poncho
+pond
+ponder
+ponderable
+pondered
+ponderer
+pondering
+ponderosa
+ponderosa's
+ponderosas
+ponderous
+ponderously
+ponderousness
+ponders
+pondicherry
+Pondo
+pondokkie
+Pondoland
+ponds
+pondweed
+pone
+pong
+pongee
+pongid
+poniard
+ponies
+Pons
+pons
+pont
+ponta
+pontchartrain
+pontefract
+pontevedra
+Pontiac
+pontianak
+Pontic
+pontifex
+pontiff
+pontific
+pontifical
+pontificals
+pontificaly
+pontificate
+pontificated
+pontificates
+pontificating
+pontification
+pontificator
+pontifices
+pontil
+pontine
+pontius
+ponton
+pontonier
+pontoon
+pontormo
+pontus
+pontypool
+pontypridd
+pony
+pony's
+ponytail
+pooch
+pooched
+pood
+poodle
+poof
+pooftah
+pooh
+pool
+Poole
+Poole's
+pooled
+pooling
+poolroom
+pools
+poon
+poona
+poonce
+poop
+poor
+poorer
+poorest
+poorhouse
+poorish
+poorly
+poorness
+poove
+pop
+pop's
+popcorn
+pope
+pope's
+popedom
+Popek
+Popek's
+Popeks
+popery
+popes
+popeyed
+popgun
+popinjay
+popish
+popishly
+poplar
+poplin
+popliteal
+Popov
+popover
+Popp
+poppa
+poppadom
+popped
+popper
+poppet
+poppied
+poppies
+popping
+popple
+poppy
+poppy's
+poppycock
+poppyhead
+poppyseed
+pops
+Popsicle
+popsicle
+Popsicles
+popsy
+populace
+populaire
+populaires
+popular
+popularism
+popularity
+popularization
+popularization's
+popularizations
+popularize
+popularized
+popularizer
+popularizers
+popularizes
+popularizing
+popularly
+populate
+populated
+populates
+populating
+population
+populations
+populism
+populist
+populistic
+populous
+populously
+populousness
+porbeagle
+porcelain
+porcelainization
+porcelainization's
+porcelainizations
+porcelainize
+porcelainizes
+porcelainlike
+porcelaneous
+porcellaneous
+porch
+porch's
+porches
+porcine
+porcupine
+porcupine's
+porcupines
+pore
+pored
+pores
+porgy
+pori
+poriferal
+poriferan
+poring
+porirua
+porism
+pork
+porker
+porkies
+porkpie
+porky
+porn
+pornocracy
+pornographer
+pornographic
+pornographically
+pornography
+poromeric
+porosimeter
+porosity
+porous
+porously
+porousness
+porphyria
+porphyrin
+porphyritic
+porphyrogenite
+porphyroid
+porphyropsin
+porphyry
+porpoise
+porpoises
+porrect
+porridge
+porringer
+porsena
+Porson
+port
+portability
+portable
+portables
+portably
+portadown
+portage
+portaged
+portaging
+portal
+portal's
+portals
+portamento
+portamento's
+portance
+portative
+portcullis
+Porte
+Porte's
+ported
+portend
+portended
+portending
+portends
+portent
+portentous
+portentously
+portentousness
+portents
+porter
+porterage
+porterhouse
+portering
+porters
+portfire
+portfolio
+portfolios
+porthole
+Portia
+portico
+portiere
+porting
+portion
+portion's
+portioned
+portioning
+portionize
+portionizes
+portionless
+portions
+Portland
+portlaoise
+portlier
+portliness
+portly
+portmanteau
+portmanteaus
+Porto
+portobello
+portrait
+portrait's
+portraitist
+portraits
+portraiture
+portray
+portrayal
+portrayals
+portrayed
+portrayer
+portraying
+portrays
+portress
+ports
+Portsmouth
+Portugal
+Portuguese
+portulaca
+portulacaceous
+posable
+posada
+pose
+posed
+Poseidon
+Posen
+poser
+posers
+poses
+poseur
+poseurs
+posey
+posh
+poshest
+posho
+posies
+posing
+posit
+posited
+Positif
+positing
+position
+positional
+positioned
+positioning
+positions
+positive
+positively
+positiveness
+positives
+positivism
+positivist
+positivistic
+positivists
+positivity
+positivize
+positivizes
+positron
+positronium
+posits
+Posner
+Posner's
+posology
+poss
+posse
+posseman
+possemen
+posses
+possess
+possessed
+possessedly
+possessedness
+possesses
+possessing
+possession
+possession's
+possessional
+possessions
+possessive
+possessive's
+possessively
+possessiveness
+possessives
+possessor
+possessor's
+possessors
+possessory
+posset
+possets
+possibilities
+possibility
+possibility's
+possible
+possibles
+possibly
+possie
+possum
+possum's
+possums
+post
+postage
+postal
+postaxial
+postaxially
+postbag
+postbags
+postbellum
+postbox
+postboxes
+postboy
+postboys
+postbreeding
+postcard
+postcard's
+postcards
+postcava
+postclassic
+postclassical
+postcode
+postcodes
+postcolonial
+postcondition
+postconditions
+postdate
+postdated
+postdates
+postdating
+postdental
+postdiluvian
+postdoctoral
+postdoctorate
+posted
+postembryonal
+postembryonic
+postemergence
+poster
+poster's
+posteriad
+posterior
+posteriori
+posteriority
+posteriorly
+posterity
+posterize
+posterizes
+postern
+posters
+postexilian
+postexilic
+postface
+postfix
+postfixed
+postfixes
+postfixing
+postform
+postglacial
+postgraduate
+posthaste
+posthole
+posthumous
+posthumously
+posthumousness
+posthypnotic
+postiche
+posticous
+postie
+postil
+postilion
+postillion
+postimpressionism
+posting
+postings
+postliminy
+postlude
+postludes
+postman
+postmarital
+postmark
+postmarked
+postmarks
+postmaster
+postmaster's
+postmasters
+postmastership
+postmen
+postmenopausal
+postmeridian
+postmillenarian
+postmillenarianism
+postmillennial
+postmillennialism
+postmillennialist
+postmistress
+postmodern
+postmortem
+postmultiply
+postnasal
+postnatal
+postnatally
+postnuptial
+postnuptially
+postoperative
+postoperatively
+postorbital
+postorder
+postpaid
+postpartum
+postpituitary
+postponable
+postpone
+postponed
+postponement
+postponer
+postpones
+postponing
+postposition
+postpositional
+postpositionally
+postpositions
+postpositive
+postpositively
+postprandial
+postprandially
+postprocess
+postprocessor
+postprocessors
+postrider
+posts
+postschool
+postscript
+postscript's
+postscripts
+postsecondary
+postsynaptic
+postsynaptically
+postsynchronization
+posttension
+posttraumatic
+postulancy
+postulant
+postulate
+postulated
+postulates
+postulating
+postulation
+postulational
+postulations
+postulator
+postural
+posture
+posture's
+postured
+posturer
+postures
+posturing
+posturize
+posturizes
+postvocalic
+postwar
+posy
+pot
+pot's
+potability
+potable
+potableness
+potage
+potamic
+potamology
+potash
+potassic
+potassium
+potation
+potato
+potatoes
+potatory
+potbellied
+potbelly
+potboil
+potboiler
+potboilers
+potboy
+potch
+poteen
+potemkin
+Potemkin
+potence
+potency
+potent
+potentate
+potentate's
+potentates
+potential
+potentialities
+potentiality
+potentialization
+potentialization's
+potentializations
+potentialize
+potentializes
+potentially
+potentials
+potentiate
+potentiating
+potentiation
+potentiator
+potentiometer
+potentiometer's
+potentiometers
+potentiometric
+potentiostat
+potentize
+potentizes
+potently
+potful
+pothead
+pothecary
+potheen
+pother
+potherb
+pothered
+pothering
+pothole
+potholed
+potholing
+pothook
+pothouse
+pothunter
+pothunting
+potiche
+potion
+potions
+potiphar
+potlatch
+potlatches
+potluck
+potman
+Potomac
+potoroo
+potpie
+potpourri
+pots
+Potsdam
+potsdam
+potsherd
+potshot
+potshotting
+potstone
+pottage
+pottawatomie
+Pottawatomie
+potted
+potter
+potter's
+potterer
+potteries
+potteringly
+potters
+pottery
+pottier
+potties
+potting
+pottle
+potto
+pottos
+Potts
+potty
+potyomkin
+pouch
+pouch's
+pouched
+pouches
+pouchier
+pouchy
+pouf
+pouff
+pouffed
+Poughkeepsie
+poulard
+poularde
+Poulenc
+poult
+poulterer
+poultice
+poultices
+poultry
+poultryman
+pounce
+pounced
+pounces
+pouncet
+pouncing
+pound
+poundage
+poundal
+pounded
+pounder
+pounders
+pounding
+pounds
+pour
+pourable
+pourboire
+poured
+pourer
+pourers
+pouring
+pouringly
+pourparler
+pourpoint
+pours
+poussette
+poussetted
+poussetting
+Poussin
+poussin
+poussins
+Poussins
+pout
+pouted
+pouter
+pouting
+pouts
+pouty
+poverty
+pow
+powan
+powder
+powdered
+powderer
+powdering
+powderization
+powderization's
+powderizations
+powderize
+powderizer
+powderizers
+powderizes
+powderman
+powdermen
+powderpuff
+powders
+powdery
+Powell
+power
+powerboat
+powered
+powerful
+powerfully
+powerfulness
+powerhouse
+powerhouse's
+powerhouses
+powering
+powerless
+powerlessly
+powerlessness
+powers
+Powhatan
+powwow
+powys
+pox
+poxes
+poxvirus
+poyang
+Poynting
+Poynting's
+poza
+pozsony
+pozzuolana
+pozzuoli
+pozzy
+ppm
+PR
+pracharak
+practicability
+practicable
+practicableness
+practicably
+practical
+practicalities
+practicality
+practicalization
+practicalization's
+practicalizations
+practicalize
+practicalizer
+practicalizers
+practicalizes
+practically
+practicalness
+practice
+practice's
+practiced
+practicer
+practices
+practicing
+practicum
+practitioner
+practitioner's
+practitioners
+pradesh
+Pradesh
+Prado
+praecox
+praedial
+praemunire
+praenomen
+Praesepe
+praetor
+Praetorian
+praetorius
+pragmat
+pragmatic
+pragmatical
+pragmatically
+pragmaticism
+pragmaticist
+pragmatics
+pragmatism
+pragmatist
+pragmatistic
+pragmatists
+pragmats
+Prague
+praha
+prairie
+prairies
+praise
+praised
+praiser
+praisers
+praises
+praiseworthily
+praiseworthiness
+praiseworthy
+praising
+praisingly
+prajna
+Prakrit
+praline
+pralltriller
+pram
+prams
+prance
+pranced
+prancer
+prances
+prancing
+prancingly
+prandial
+prang
+prank
+prank's
+prankish
+prankishly
+prankishness
+pranks
+prankster
+pranksters
+prase
+praseodymium
+prat
+prate
+prated
+prater
+prates
+pratfall
+pratincole
+prating
+pratingly
+pratique
+prato
+Pratt
+prattle
+prattled
+prattler
+prattles
+prattling
+prattlingly
+Prattville
+prau
+Pravda
+prawn
+prawner
+prawns
+praxeological
+praxeology
+praxes
+praxis
+praxiteles
+pray
+prayed
+prayer
+prayer's
+prayerful
+prayerfully
+prayerfulness
+prayers
+praying
+prays
+pre
+preach
+preached
+preacher
+preacherize
+preacherizes
+preachers
+preaches
+preachier
+preachifies
+preachify
+preachily
+preachiness
+preaching
+preachingly
+preachment
+preachy
+preacknowledgment
+preacknowledgment's
+preacknowledgments
+preadamite
+preadapt
+preadaptation
+preadapted
+preadaptive
+preadolescence
+preadolescent
+preallocate
+preallocated
+preallocates
+preallocating
+preallocation
+preallocation's
+preallocations
+preallocator
+preallocators
+preamble
+preambles
+preamplifier
+preamplifiers
+preanesthetic
+preanesthetics
+prearrange
+prearranged
+prearrangement
+preassign
+preassigned
+preassigning
+preassigns
+preatomic
+preaxial
+preaxially
+prebaptize
+prebaptizes
+prebend
+prebendal
+prebendary
+prebind
+prebiologic
+prebiological
+prebiotic
+precall
+Precambrian
+precancel
+precancelation
+precancerous
+precarious
+precariously
+precariousness
+precast
+precatory
+precaution
+precaution's
+precautionary
+precautioned
+precautioning
+precautions
+precautious
+precede
+preceded
+precedence
+precedence's
+precedences
+precedency
+precedent
+precedented
+precedential
+precedents
+precedes
+preceding
+preceed
+preceeded
+preceeding
+precensor
+precentor
+precentorial
+precentorship
+precept
+precept's
+preceptive
+preceptively
+preceptor
+preceptorial
+preceptorship
+preceptory
+preceptress
+precepts
+precess
+precessed
+precesses
+precessing
+precession
+precessional
+prechlorination
+precinct
+precinct's
+precincts
+preciosity
+precious
+preciously
+preciousness
+precipice
+precipitable
+precipitance
+precipitancy
+precipitant
+precipitantly
+precipitantness
+precipitate
+precipitated
+precipitately
+precipitateness
+precipitates
+precipitating
+precipitation
+precipitative
+precipitator
+precipitin
+precipitinogen
+precipitinogenic
+precipitous
+precipitously
+precipitousness
+precis
+precise
+precisely
+preciseness
+precisian
+precisianism
+precision
+precisionist
+precisionize
+precisionizes
+precisions
+precivilization
+precivilization's
+precivilizations
+preclinical
+preclude
+precluded
+precludes
+precluding
+preclusion
+preclusive
+preclusively
+precoat
+precoating
+precocial
+precocious
+precociously
+precociousness
+precocity
+precode
+precoded
+precognition
+precognitive
+precollege
+precolonial
+precolor
+precolor's
+precolorable
+precolorable's
+precolorables
+precoloring
+precolorings
+precolors
+precombustion
+precompact
+precompile
+precompiled
+precompiles
+precompiling
+precompose
+precomputation
+precomputed
+preconceive
+preconceived
+preconception
+preconception's
+preconceptions
+preconceptual
+preconcert
+preconcerted
+preconcertedly
+preconcertedness
+precondition
+preconditioned
+preconditions
+preconization
+preconization's
+preconizations
+preconize
+preconizer
+preconizers
+preconizes
+preconnected
+preconnection
+preconscious
+preconsolidate
+preconsolidated
+preconsolidates
+preconsolidating
+preconsolidation
+preconsonantal
+precook
+precooked
+precritical
+precriticize
+precriticizes
+precursor
+precursor's
+precursors
+precursory
+precut
+predaceous
+predaceousness
+predacious
+predacity
+predate
+predated
+predates
+predating
+predation
+predator
+predator's
+predatorily
+predators
+predatory
+predawn
+predecease
+predecessor
+predecessor's
+predecessors
+predecline
+predefense
+predefense's
+predefenses
+predefine
+predefined
+predefines
+predefining
+predefinition
+predefinition's
+predefinitions
+predella
+predesignate
+predesignation
+predestinarian
+predestinarianism
+predestinate
+predestination
+predestinator
+predestine
+predestined
+predeterminate
+predetermination
+predetermine
+predetermined
+predeterminer
+predetermines
+predetermining
+predial
+predicable
+predicament
+predicant
+predicatable
+predicate
+predicated
+predicates
+predicating
+predication
+predications
+predicative
+predicator
+predicatory
+predict
+predictability
+predictable
+predictably
+predicted
+predicting
+prediction
+prediction's
+predictions
+predictive
+predictively
+predictor
+predictors
+predicts
+predigest
+predigested
+predigestion
+predikant
+predilect
+predilection
+predilections
+predispose
+predisposed
+predisposes
+predisposition
+predispositions
+prednisone
+predoctoral
+predominance
+predominancy
+predominant
+predominantly
+predominate
+predominated
+predominately
+predominates
+predominating
+predomination
+predrilled
+preemergence
+preemergent
+preemie
+preeminence
+preeminent
+preeminently
+preemphasization
+preemphasization's
+preemphasize
+preemphasized
+preemphasizer
+preemphasizers
+preemphasizes
+preemphasizing
+preemployment
+preempt
+preempted
+preempting
+preemption
+preemptive
+preemptively
+preemptor
+preempts
+preen
+preener
+preening
+preexchange
+preexchanged
+preexist
+preexistence
+preexistent
+preexisting
+prefab
+prefabricate
+prefabricated
+prefabrication
+preface
+prefaced
+prefacer
+prefaces
+prefacing
+prefatorial
+prefatorially
+prefatorily
+prefatory
+prefavor
+prefavor's
+prefavorable
+prefavorable's
+prefavorables
+prefavorablies
+prefavorably
+prefavorite
+prefavorite's
+prefavorites
+prefavors
+prefect
+prefects
+prefectural
+prefecture
+prefectures
+prefer
+preferability
+preferable
+preferableness
+preferably
+preference
+preference's
+preferences
+preferential
+preferentially
+preferment
+preferred
+preferrer
+preferring
+prefers
+prefertilization
+prefertilization's
+prefertilizations
+prefertilize
+prefertilizes
+prefiguration
+prefigurative
+prefiguratively
+prefigurativeness
+prefigure
+prefigured
+prefigurement
+prefigures
+prefiguring
+prefill
+prefilled
+prefilling
+prefills
+prefix
+prefixal
+prefixally
+prefixed
+prefixes
+prefixing
+preflavor
+preflavor's
+preflavoring
+preflavorings
+preflavors
+preflight
+preflighted
+preflighting
+preflights
+prefocus
+prefocused
+prefocuses
+prefocusing
+preform
+preformation
+preformed
+preforms
+prefrontal
+pregalvanize
+pregalvanizes
+preglacial
+pregnability
+pregnable
+pregnancies
+pregnancy
+pregnant
+pregnantly
+pregnenolone
+preheat
+preheated
+preheater
+prehensile
+prehensility
+prehension
+prehistorian
+prehistoric
+prehistorical
+prehistorically
+prehistory
+prehominid
+prehumor
+prehumor's
+prehumors
+preignition
+preincubate
+preincubated
+preincubates
+preincubating
+preinduction
+preindustrial
+preinitialize
+preinitialized
+preinitializes
+preinitializing
+preinterview
+preisolated
+prejudge
+prejudged
+prejudger
+prejudgment
+prejudgment's
+prejudgments
+prejudice
+prejudiced
+prejudices
+prejudicial
+prejudicially
+prejudicialness
+prejudicing
+prejudicious
+prejudiciously
+prelabor
+prelabor's
+prelabors
+prelacy
+prelate
+prelatism
+prelatize
+prelatizes
+prelature
+prelect
+prelection
+prelexical
+prelibation
+prelicense
+prelicensed
+prelicenser
+prelicenses
+prelicensing
+preliminaries
+preliminarily
+preliminary
+prelims
+preliterate
+prelocalization
+prelocalization's
+prelocalizations
+prelude
+prelude's
+preluded
+preluder
+preludes
+preluding
+preludize
+preludizes
+prelusion
+prelusive
+prelusively
+prelusory
+premalignant
+preman
+premarital
+premaritally
+premarket
+premature
+prematurely
+prematureness
+prematurity
+premaxilla
+premed
+premedial
+premedian
+premedical
+premedication
+premedieval
+premedieval's
+premedievalism
+premedievalism's
+premedievalisms
+premedievals
+premeditate
+premeditated
+premeditatedly
+premeditation
+premeditative
+premeditator
+premeiotic
+premenstrual
+premenstrually
+premership
+premie
+premier
+premier's
+premiere
+premiered
+premieres
+premiering
+premiers
+premiership
+premillenarian
+premillenarianism
+premillennial
+premillennialism
+premillennialist
+premillennially
+premise
+premise's
+premised
+premises
+premising
+premiss
+premium
+premium's
+premiums
+premix
+premixed
+premolar
+premonish
+premonition
+premonitions
+premonitorily
+premonitory
+premonopolize
+premonopolizes
+premorse
+premultiplied
+premultiply
+premultiplying
+premultiplys
+premune
+premunition
+prename
+prenatal
+prenatally
+prenomen
+prenominal
+prenominate
+prenomination
+prenotion
+Prentice
+Prenticed
+Prenticing
+preoccupancy
+preoccupation
+preoccupations
+preoccupied
+preoccupies
+preoccupy
+preoffense
+preoffense's
+preoffenses
+preopened
+preoperative
+preoperatively
+preorbital
+preordain
+preordained
+preordaining
+preordainment
+preordains
+preordination
+preorganization
+preorganization's
+preorganizations
+preorganize
+preorganizes
+preoviposition
+preovulatory
+preoxidation
+preoxidize
+preoxidized
+preoxidizes
+preoxidizing
+prep
+prepackage
+prepackaged
+preparation
+preparation's
+preparations
+preparative
+preparative's
+preparatively
+preparatives
+preparator
+preparatorily
+preparatory
+prepare
+prepared
+preparedly
+preparedness
+preparer
+prepares
+preparing
+prepausal
+prepay
+prepayment
+prepend
+prepended
+prepender
+prependers
+prepending
+prepends
+prepense
+prepensely
+preplan
+preponderance
+preponderances
+preponderancy
+preponderant
+preponderantly
+preponderate
+preponderately
+preponderating
+preponderation
+preposition
+preposition's
+prepositional
+prepositionally
+prepositions
+prepositive
+prepositively
+prepositor
+prepossess
+prepossessing
+prepossessingly
+prepossessingness
+prepossession
+preposterous
+preposterously
+preposterousness
+prepotency
+prepotent
+prepotently
+preppie
+prepping
+preprandial
+preprepared
+preprint
+preprinted
+preprinting
+preprints
+preprocess
+preprocessed
+preprocesses
+preprocessing
+preprocessor
+preprocessors
+preproduction
+preprofessional
+preprogram
+preprogrammed
+prepuberal
+prepuberally
+prepubertal
+prepubertally
+prepuberty
+prepubescence
+prepubescent
+prepublication
+prepuce
+prepunch
+prepupal
+preputial
+preradiation
+prerealization
+prerealization's
+prerealizations
+prerealize
+prerealizes
+prerecognize
+prerecognizes
+prerecord
+prerelease
+prerequisite
+prerequisite's
+prerequisites
+prerogative
+prerogative's
+prerogatived
+prerogatives
+presa
+presage
+presaged
+presageful
+presager
+presages
+presaging
+presanctified
+presbyope
+presbyopia
+presbyopic
+presbyter
+presbyterate
+presbyterial
+presbyterially
+Presbyterian
+Presbyterianism
+Presbyterianize
+Presbyterianizes
+presbytery
+prescan
+preschool
+preschooler
+prescience
+prescience's
+prescient
+prescientific
+presciently
+prescind
+prescore
+Prescott
+prescribe
+prescribed
+prescriber
+prescribes
+prescribing
+prescript
+prescriptible
+prescription
+prescription's
+prescriptions
+prescriptive
+prescriptively
+prescriptivism
+prese
+preselect
+preselected
+preselecting
+preselection
+preselects
+presell
+presence
+presence's
+presences
+present
+presentability
+presentable
+presentableness
+presentably
+presentation
+presentation's
+presentational
+presentationism
+presentations
+presentative
+presented
+presentee
+presenter
+presenters
+presentient
+presentiment
+presentimental
+presenting
+presently
+presentment
+presentments
+presentness
+presents
+preservable
+preservation
+preservationist
+preservations
+preservative
+preservative's
+preservatives
+preserve
+preserved
+preserver
+preservers
+preserves
+preserving
+preset
+presets
+presettable
+presetting
+preshrunk
+preside
+presided
+presidency
+president
+president's
+presidential
+presidentially
+presidents
+presidentship
+presider
+presides
+presidial
+presidiary
+presiding
+presidio
+presidium
+presignify
+Presley
+presley
+presoak
+presoaks
+prespecialize
+prespecializes
+presplendor
+presplendor's
+presplendors
+press
+pressboard
+Pressburg
+pressed
+presser
+presses
+pressing
+pressingly
+pressings
+pression
+pressman
+pressmark
+pressmen
+pressor
+pressroom
+pressrun
+pressure
+pressured
+pressures
+pressuring
+pressurization
+pressurize
+pressurized
+pressurizer
+pressurizers
+pressurizes
+pressurizing
+presswork
+prest
+prestandardization
+prestandardization's
+prestandardizations
+prestandardize
+prestandardizes
+prestel
+prester
+presternum
+prestidigitate
+prestidigitation
+prestidigitator
+prestige
+prestigeful
+prestigious
+prestigiously
+prestigiousness
+prestissimo
+presto
+Preston
+Preston's
+prestonpans
+prestos
+prestress
+prestressed
+prestwich
+presumable
+presumably
+presume
+presumed
+presumer
+presumes
+presuming
+presumingly
+presumption
+presumption's
+presumptions
+presumptive
+presumptively
+presumptuous
+presumptuously
+presumptuousness
+presuppose
+presupposed
+presupposes
+presupposing
+presupposition
+presuppositions
+presympathize
+presympathizes
+presynaptic
+presynaptically
+pretax
+preteen
+pretend
+pretended
+pretendedly
+pretender
+pretenders
+pretending
+pretends
+pretense
+pretenses
+pretension
+pretensionless
+pretensions
+pretensive
+pretentious
+pretentiously
+pretentiousness
+preterhuman
+preterit
+preterite
+preterition
+preteritive
+preterminal
+pretermission
+pretermit
+preternatural
+preternaturally
+preternaturalness
+pretest
+pretested
+pretesting
+pretests
+pretext
+pretext's
+pretexts
+pretonic
+pretor
+Pretoria
+Pretorian
+pretorius
+Pretre
+pretreat
+pretreatment
+pretrial
+prettied
+prettier
+pretties
+prettiest
+prettification
+prettify
+prettily
+prettiness
+pretty
+prettying
+prettyish
+pretubercular
+pretuberculous
+pretzel
+pretzels
+Preussen
+preutilizable
+preutilizable's
+preutilizables
+preutilization
+preutilization's
+preutilizations
+preutilize
+preutilizes
+prevail
+prevailed
+prevailing
+prevailingly
+prevails
+prevalence
+prevalent
+prevalently
+prevaricate
+prevaricated
+prevaricates
+prevaricating
+prevarication
+prevaricator
+prevenient
+preveniently
+prevent
+preventability
+preventable
+preventably
+preventative
+prevented
+preventer
+preventible
+preventing
+prevention
+preventions
+preventive
+preventively
+preventiveness
+preventives
+prevents
+preverbal
+preview
+previewed
+previewer
+previewers
+previewing
+previews
+Previn
+previous
+previously
+previousness
+previse
+prevision
+previsional
+previsionary
+previsioned
+previsioning
+previsions
+prevocalic
+prevocational
+prevue
+prewar
+prexy
+prey
+Prey
+preyed
+preyer
+preying
+preys
+Priam
+priapic
+priapism
+Priapus
+pribilof
+price
+Price
+priced
+priceless
+pricer
+pricers
+prices
+pricey
+pricier
+pricing
+prick
+pricked
+pricker
+pricket
+prickier
+pricking
+prickle
+prickled
+pricklier
+prickliness
+prickling
+prickly
+pricks
+pricky
+pricy
+pride
+prided
+prideful
+pridefully
+pridefulness
+prides
+priding
+pried
+prier
+pries
+priest
+priestcraft
+priestess
+priestesses
+priesthood
+Priestley
+priestliness
+priestly
+priests
+prieur
+prig
+priggery
+priggish
+priggishly
+priggishness
+priggism
+prill
+prim
+prima
+primacy
+primaeval
+primal
+primality
+primaquine
+primaries
+primarily
+primary
+primary's
+primate
+primates
+primateship
+primatial
+primatives
+primatological
+primatologist
+primatology
+prime
+Prime's
+primed
+primely
+primeness
+primer
+primero
+primers
+primes
+primeval
+primevally
+primigravida
+primine
+priming
+primipara
+primiparity
+primiparous
+primitive
+primitively
+primitiveness
+primitives
+primitivism
+primitivist
+primitivistic
+primitivity
+primly
+primmer
+primmest
+primming
+primness
+primo
+primogenitor
+primogeniture
+primordial
+primordially
+primordium
+primos
+primp
+primping
+primrdium
+primrose
+primula
+primulaceous
+primus
+prince
+princedom
+princekin
+princelet
+princelier
+princeliness
+princeling
+princely
+princes
+princeship
+princess
+princess's
+princesse
+princesses
+Princeton
+principal
+principalities
+principality
+principality's
+principally
+principals
+principalship
+Principe
+Principia
+principial
+principium
+principle
+principled
+principles
+princox
+prink
+prinker
+print
+printability
+printable
+printably
+printed
+printemps
+printer
+printers
+printery
+printing
+printless
+printmake
+printmaker
+printmakers
+printmaking
+printout
+printouts
+prints
+prior
+priorate
+prioress
+prioresses
+priori
+priorities
+prioritization
+prioritize
+prioritized
+prioritizer
+prioritizers
+prioritizes
+prioritizing
+prioritizings
+priority
+priority's
+priorization
+priorizations
+priorize
+priorized
+priorizes
+priorizing
+priorly
+priors
+priorship
+priory
+pripet
+prisage
+Priscian
+Priscilla
+prise
+prisere
+prism
+prism's
+prismatic
+prismatically
+prismatoid
+prismatoidal
+prismoid
+prismoidal
+prisms
+prison
+prisoner
+prisoner's
+prisoners
+prisons
+prissier
+prissily
+prissiness
+prissy
+pristane
+pristine
+pristinely
+Pritchard
+Pritchard's
+prithee
+privacies
+privacy
+privatdocent
+privatdozent
+private
+privateer
+privateer's
+privateers
+privately
+privateness
+privates
+privation
+privations
+privatism
+privative
+privatively
+privatization
+privatize
+privatized
+privatizing
+privet
+privies
+privilege
+privileged
+privileges
+privily
+privity
+privy
+privy's
+prix
+prize
+prized
+prizefight
+prizefighter
+prizefighting
+prizer
+prizers
+prizes
+prizewinner
+prizing
+pro
+pro's
+proa
+proach
+proaching
+proactive
+probabilism
+probabilist
+probabilistic
+probabilistically
+probabilities
+probability
+probable
+probably
+proband
+probang
+probate
+probated
+probates
+probating
+probation
+probational
+probationally
+probationary
+probationer
+probationers
+probative
+probatory
+probe
+probed
+probenecid
+prober
+probes
+probing
+probings
+probit
+probity
+problem
+problem's
+problematic
+problematical
+problematically
+problemize
+problemizes
+problems
+probosces
+proboscidean
+proboscidian
+proboscis
+proc
+procaine
+procambial
+procambium
+procarp
+procaryote
+procaryotic
+procathedral
+procedural
+procedurally
+procedure
+procedure's
+procedures
+proceed
+proceeded
+proceeder
+proceeding
+proceedings
+proceeds
+proceleusmatic
+procephalic
+procercoid
+process
+process's
+processability
+processable
+processed
+processes
+processibility
+processible
+processing
+procession
+processional
+processionally
+processionize
+processionizes
+processor
+processor's
+processors
+prochronism
+proclaim
+proclaimed
+proclaimer
+proclaimers
+proclaiming
+proclaims
+proclamation
+proclamation's
+proclamations
+proclimax
+proclitic
+proclivities
+proclivity
+proclivity's
+proclus
+Procne
+proconsul
+proconsular
+proconsulate
+proconsulship
+procopius
+procrastinate
+procrastinated
+procrastinates
+procrastinating
+procrastination
+procrastinator
+procrastinator's
+procrastinators
+procreant
+procreate
+procreation
+procreative
+procreativity
+procreator
+procrustean
+Procrusteanize
+Procrusteanizes
+Procrustes
+procryptic
+Procter
+Procter's
+proctodaeum
+proctologic
+proctological
+proctologist
+proctology
+proctor
+proctor's
+proctored
+proctorial
+proctoring
+proctorization
+proctorization's
+proctorizations
+proctorize
+proctorizes
+proctors
+proctorship
+proctoscope
+procumbent
+procurable
+procurance
+procuration
+procurator
+procuratorial
+procuratory
+procure
+procured
+procurement
+procurement's
+procurements
+procurer
+procurers
+procures
+procuress
+procuring
+Procyon
+prod
+prodded
+prodder
+prodding
+prodigal
+prodigality
+prodigalize
+prodigalizes
+prodigally
+prodigies
+prodigious
+prodigiously
+prodigiousness
+prodigy
+prodromal
+prodromata
+prodrome
+prodromes
+prodromic
+producable
+produce
+produced
+producer
+producers
+produces
+producible
+producing
+product
+product's
+production
+production's
+productional
+productions
+productive
+productively
+productiveness
+productivities
+productivity
+productize
+productized
+productizer
+productizers
+productizes
+productizing
+products
+proem
+proemial
+proenzyme
+proestrus
+prof
+profanation
+profanatory
+profane
+profaned
+profanely
+profaneness
+profaner
+profaning
+profanity
+profanize
+profanizes
+profess
+professed
+professedly
+professes
+professeur
+professing
+profession
+profession's
+professional
+professionalism
+professionalisms
+professionalization
+professionalization's
+professionalizations
+professionalize
+professionalized
+professionalizes
+professionalizing
+professionally
+professionals
+professionize
+professionizes
+professions
+professor
+professor's
+professorate
+professorial
+professorially
+professoriat
+professoriate
+professors
+professorship
+proffer
+proffered
+proffering
+proffers
+proficiencies
+proficiency
+proficient
+proficiently
+profile
+profiled
+profiler
+profiler's
+profilers
+profiles
+profili
+profiling
+profit
+profit's
+profitability
+profitable
+profitableness
+profitably
+profited
+profiteer
+profiteer's
+profiteers
+profiter
+profiterole
+profiters
+profiting
+profitless
+profits
+profitted
+profitting
+profligacy
+profligate
+profligately
+profligates
+profluent
+profound
+profoundest
+profoundity
+profoundly
+profoundness
+profundity
+profuse
+profusely
+profuseness
+profusion
+prog
+progamete
+progenitive
+progenitor
+progeny
+progestational
+progesterone
+progestin
+progestogen
+progging
+proglottid
+proglottidean
+proglottis
+prognathic
+prognathism
+prognathous
+prognoses
+prognosis
+prognostic
+prognosticate
+prognostication
+prognosticative
+prognosticator
+prograde
+program
+program's
+programist
+programist's
+programistic
+programistics
+programists
+programmability
+programmable
+programmatic
+programmatically
+programmed
+programmer
+programmer's
+programmers
+programming
+programs
+progress
+progressed
+progresses
+progressing
+progression
+progression's
+progressional
+progressionist
+progressions
+progressist
+progressive
+progressively
+progressiveness
+progressivism
+progressivist
+progressivistic
+prohibit
+prohibited
+prohibiter
+prohibiting
+prohibition
+prohibition's
+prohibitionist
+prohibitions
+prohibitive
+prohibitively
+prohibitiveness
+prohibitory
+prohibits
+project
+project's
+projectable
+projected
+projectile
+projectiles
+projecting
+projection
+projection's
+projectional
+projectionist
+projectionists
+projections
+projective
+projectively
+projector
+projector's
+projectors
+projects
+projet
+projets
+prokaryote
+prokaryotic
+Prokofieff
+Prokofiev
+Prokofiev's
+Prokopyevsk
+prolactin
+prolamin
+prolamine
+prolan
+prolapse
+prolapsed
+prolapsing
+prolate
+prole
+proleg
+prolegomena
+prolegomenon
+prolepsis
+proleptic
+proletarian
+proletarianization
+proletarianize
+proletarianized
+proletarianizes
+proletarianizing
+proletariat
+proliferate
+proliferated
+proliferates
+proliferating
+proliferation
+proliferative
+proliferous
+proliferously
+prolific
+prolificacy
+prolifically
+prolificity
+prolificness
+proline
+prolix
+prolixity
+prolixly
+prolocutor
+prolog
+prolog's
+prologize
+prologs
+prologue
+prologue's
+prologues
+prologuize
+prologuizer
+prologuizers
+prologuizes
+prolong
+prolongate
+prolongated
+prolongates
+prolongating
+prolongation
+prolonged
+prolonger
+prolonging
+prolongs
+prolotherapy
+prolusion
+prolusionize
+prolusionizes
+prolusions
+prolusory
+prom
+promazine
+promenade
+promenade's
+promenader
+promenades
+promenading
+promethazine
+Promethean
+Prometheus
+promethium
+prominence
+prominent
+prominently
+promiscuity
+promiscuity's
+promiscuous
+promiscuously
+promiscuousness
+promise
+promised
+promisee
+promiser
+promises
+promising
+promisingly
+promisor
+promissory
+promontories
+promontory
+promotability
+promotable
+promote
+promoted
+promoter
+promoters
+promotes
+promoting
+promotion
+promotional
+promotions
+promotive
+promotiveness
+prompt
+promptbook
+promptbooks
+prompted
+prompter
+prompters
+promptest
+prompting
+promptings
+promptitude
+promptly
+promptness
+prompts
+promulgate
+promulgated
+promulgates
+promulgating
+promulgation
+promulgations
+promulgator
+promulgators
+promycelium
+pronatalism
+pronatalist
+pronate
+pronated
+pronating
+pronation
+pronator
+prone
+pronely
+proneness
+pronephric
+pronephros
+prong
+pronged
+pronghorn
+pronghorns
+prongs
+pronominal
+pronominalization
+pronominalize
+pronominally
+pronoun
+pronoun's
+pronounce
+pronounceable
+pronounced
+pronouncedly
+pronouncement
+pronouncement's
+pronouncements
+pronouncer
+pronounces
+pronouncing
+pronouns
+pronto
+pronuclear
+pronucleus
+pronunciamento
+pronunciation
+pronunciation's
+pronunciational
+pronunciations
+proof
+proof's
+proofed
+proofer
+proofing
+prooflike
+proofread
+proofreader
+proofreading
+proofreads
+proofroom
+proofs
+prop
+propaedeutic
+propagable
+propaganda
+propagandism
+propagandist
+propagandistic
+propagandistically
+propagandists
+propagandize
+propagandized
+propagandizes
+propagandizing
+propagate
+propagated
+propagates
+propagating
+propagation
+propagational
+propagations
+propagative
+propagator
+propagule
+propane
+propanoic
+proparoxytone
+propel
+propellant
+propellants
+propelled
+propellent
+propeller
+propeller's
+propellers
+propelling
+propellor
+propels
+propenamide
+propend
+propene
+propense
+propensities
+propensity
+proper
+properdin
+properly
+properness
+propertied
+properties
+propertius
+property
+propertyless
+prophage
+prophase
+prophasic
+prophecies
+prophecy
+prophecy's
+prophesied
+prophesier
+prophesies
+prophesy
+prophesying
+prophet
+prophet's
+prophetess
+prophetic
+prophetical
+prophetically
+prophetize
+prophetizes
+prophets
+prophylactic
+prophylactically
+prophylaxis
+propine
+propined
+propining
+propinquity
+propionate
+propionibacteria
+propionic
+propitiable
+propitiate
+propitiation
+propitiator
+propitiatory
+propitious
+propitiously
+propitiousness
+propjet
+proplastid
+propman
+propolis
+propone
+proponed
+proponent
+proponent's
+proponents
+proponing
+propontis
+proportion
+proportionable
+proportionably
+proportional
+proportionality
+proportionally
+proportionate
+proportionately
+proportioned
+proportioner
+proportioning
+proportionment
+proportions
+propos
+proposal
+proposal's
+proposals
+propose
+proposed
+proposer
+proposers
+proposes
+proposing
+proposition
+propositional
+propositionally
+propositioned
+propositioning
+propositionize
+propositionizes
+propositions
+propositus
+propound
+propounded
+propounder
+propounding
+propounds
+propped
+propping
+propranolol
+propretor
+proprietary
+proprietor
+proprietor's
+proprietors
+proprietorship
+proprietorships
+proprietress
+propriety
+proprioception
+proprioceptive
+proprioceptor
+props
+proptosis
+propulsion
+propulsion's
+propulsions
+propulsive
+propyl
+propylaeum
+propylene
+propylite
+prorate
+prorated
+prorating
+proration
+prorogate
+prorogation
+prorogue
+prorogued
+proroguing
+pros
+prosaic
+prosaically
+prosaism
+prosaist
+prosateur
+proscenium
+prosceniums
+prosciutto
+proscribe
+proscribed
+proscriber
+proscribes
+proscribing
+proscription
+proscriptive
+proscriptively
+prose
+prosector
+prosectorial
+prosecutable
+prosecute
+prosecuted
+prosecutes
+prosecuting
+prosecution
+prosecutions
+prosecutor
+prosecutors
+proselyte
+proselytism
+proselytization
+proselytization's
+proselytizations
+proselytize
+proselytized
+proselytizer
+proselytizers
+proselytizes
+proselytizing
+proseminar
+prosencephalic
+prosencephalon
+prosenchyma
+prosenchymas
+prosenchymata
+prosenchymatous
+proser
+proserpina
+Proserpine
+Proserpine's
+prosier
+prosily
+prosiness
+prosing
+prosit
+proso
+prosobranch
+prosodic
+prosodical
+prosodically
+prosodics
+prosodies
+prosodist
+prosody
+prosoma
+prosomal
+prosopographical
+prosopography
+prosopopoeia
+prospect
+prospected
+prospecting
+prospection
+prospection's
+prospections
+prospective
+prospectively
+prospectiveness
+prospectives
+prospector
+prospector's
+prospectors
+prospects
+prospectus
+prosper
+prospered
+prospering
+prosperity
+prosperous
+prosperously
+prosperousness
+prospers
+prossed
+prosser
+prost
+prostaglandin
+prostate
+prostatectomy
+prostatic
+prostatism
+prostatitis
+prostheses
+prosthesis
+prosthetic
+prosthetically
+prosthetics
+prosthodontics
+prosthodontist
+prostitute
+prostitutes
+prostitution
+prostitutor
+prostomial
+prostomium
+prostrate
+prostrated
+prostration
+prostyle
+prosy
+protactinium
+protagonist
+protagonists
+protagoras
+protamine
+protandrous
+protanopia
+protasis
+protatic
+protea
+protean
+protease
+proteases
+protect
+protectant
+protected
+protectedly
+protecting
+protection
+protection's
+protectionism
+protectionist
+protectionize
+protectionizes
+protections
+protective
+protectively
+protectiveness
+protector
+protector's
+protectoral
+protectorate
+protectors
+protectorship
+protectory
+protectress
+protects
+protege
+protege's
+proteges
+proteid
+proteide
+protein
+protein's
+proteinaceous
+proteinase
+proteinate
+proteins
+proteinuria
+proteinuric
+protend
+protensive
+protensively
+proteoclastic
+proteolysis
+proteolytic
+proteose
+proteranthous
+proteranthy
+Proterozoic
+proters
+protest
+protest's
+protestant
+protestantism
+Protestantism
+Protestantize
+Protestantizes
+protestants
+protestation
+protestations
+protested
+protester
+protester's
+protesters
+protesting
+protestingly
+protestor
+protests
+proteus
+prothalamion
+prothalamium
+prothallial
+prothallium
+prothallus
+prothesis
+prothetelic
+prothetely
+prothetic
+prothonotarial
+prothonotary
+prothoracic
+prothorax
+prothrombin
+protist
+Protista
+protistan
+protitch
+protium
+proto
+protoactinium
+protochordate
+protocol
+protocol's
+protocoled
+protocoling
+protocolization
+protocolization's
+protocolizations
+protocolize
+protocolizes
+protocols
+protoderm
+protodermal
+protogalaxy
+protogeometric
+protogynous
+protohistorian
+protohistoric
+protohistory
+protohuman
+protolanguage
+protolithic
+protomartyr
+protomorphic
+proton
+proton's
+protonate
+protonated
+protonation
+protonema
+protonemal
+protonematal
+protonic
+protonotary
+protons
+protonymph
+protonymphal
+protopathic
+protophloem
+Protophyta
+protophyta
+protoplanet
+protoplasm
+protoplasmic
+protoplast
+protoplastic
+protoporphyrin
+protosemitic
+protostar
+protostele
+protostelic
+prototherian
+prototroph
+prototrophic
+prototrophy
+prototypal
+prototype
+prototype's
+prototyped
+prototypes
+prototypic
+prototypical
+prototypically
+prototyping
+protoxide
+protoxylem
+protozoa
+protozoal
+protozoan
+protozoic
+protozoological
+protozoologist
+protozoology
+protozoon
+protract
+protracted
+protractile
+protraction
+protractive
+protractor
+protreptic
+protrude
+protruded
+protrudes
+protruding
+protrusible
+protrusile
+protrusion
+protrusion's
+protrusions
+protrusive
+protrusively
+protrusiveness
+protuberance
+protuberant
+protuberate
+protuberatly
+protude
+protudes
+protuding
+protyle
+proud
+prouder
+proudest
+proudful
+proudhearted
+proudhon
+proudly
+Proust
+proustite
+prout
+provability
+provable
+provableness
+provably
+provascular
+prove
+proved
+provement
+proven
+provenance
+Provence
+provender
+provenience
+provenly
+proventriculus
+prover
+proverb
+proverb's
+proverbial
+proverbialize
+proverbializes
+proverbially
+proverbize
+proverbizes
+proverbs
+provers
+proves
+provide
+provided
+providence
+provident
+providential
+providentially
+providently
+provider
+providers
+provides
+providing
+province
+province's
+provinces
+Provincetown
+provincial
+provincialism
+provincialist
+provinciality
+provincialization
+provincialization's
+provincializations
+provincialize
+provincializes
+provincially
+proving
+proviral
+provirus
+provision
+provisional
+provisionally
+provisionary
+provisioned
+provisioner
+provisioning
+provisions
+proviso
+provisons
+provisory
+provitamin
+provo
+provocate
+provocateur
+provocateurs
+provocation
+provocations
+provocative
+provocatively
+provocativeness
+provoke
+provoked
+provokes
+provoking
+provokingly
+provolone
+provost
+prow
+prow's
+prowess
+prowl
+prowled
+prowler
+prowlers
+prowling
+prowls
+prows
+proxemic
+proxemics
+proxies
+proxima
+proximal
+proximally
+proximate
+proximately
+proximateness
+proximity
+proximo
+proxmire
+Proxmire
+proxy
+prude
+prude's
+prudence
+prudent
+prudential
+prudentially
+prudentius
+prudently
+prudery
+prudes
+prudish
+prudishly
+prudishness
+pruinose
+prune
+pruned
+Prunella
+prunelle
+pruner
+pruners
+prunes
+pruning
+prurience
+pruriency
+prurient
+pruriently
+pruriginous
+prurigo
+pruritic
+pruritus
+Prussia
+Prussian
+Prussianism
+Prussianization
+Prussianization's
+Prussianizations
+Prussianize
+Prussianized
+Prussianizer
+Prussianizers
+Prussianizes
+Prussianizing
+prussiate
+prussic
+prut
+prutot
+pry
+pryer
+prying
+pryingly
+prynne
+prytaneum
+psalm
+psalm's
+psalmbook
+psalmist
+psalmody
+psalms
+psalter
+psalterium
+psaltery
+psaltry
+psammite
+psephite
+psephological
+psephologist
+psephology
+pseud
+pseudaxis
+pseudepigraph
+pseudepigrapha
+pseudepigraphon
+pseudepigraphy
+pseudo
+pseudoallele
+pseudoallelic
+pseudoallelism
+pseudoanemia
+pseudoanemia's
+pseudoanemias
+pseudoanemic
+pseudoanemics
+pseudocarp
+pseudoclassic
+pseudoclassicism
+pseudocode
+pseudoedema
+pseudoedema's
+pseudoedemas
+pseudoenergy
+pseudographize
+pseudographizes
+pseudomedieval
+pseudomedieval's
+pseudomedievals
+pseudomorph
+pseudomutuality
+pseudonym
+pseudonym's
+pseudonymity
+pseudonymous
+pseudonymously
+pseudonymousness
+pseudonyms
+pseudopodium
+pseudopotential
+pseudorandom
+pseudoscience
+pseudoscientific
+pseudoscientist
+pseudoscorpion
+pseudosophisticated
+pseudosophistication
+pseudotuberculosis
+pshaw
+psi
+psilocybin
+psilomelane
+psittacine
+psittacosis
+Pskov
+psoas
+Psoralea
+psoriasis
+psst
+PST
+psych
+psychasthenia
+psyche
+psyche's
+psychedelia
+psychedelic
+psychedelically
+psyches
+psychiatric
+psychiatrically
+psychiatrist
+psychiatrist's
+psychiatrists
+psychiatry
+psychic
+psychic's
+psychical
+psychically
+psychics
+psycho
+psychoacoustic
+psychoacoustics
+psychoactive
+psychoanalysis
+psychoanalyst
+psychoanalytic
+psychoanalytical
+psychoanalytically
+psychoanalyze
+psychoanalyzer
+psychoanalyzer's
+psychoanalyzers
+psychoanalyzes
+psychobiographical
+psychobiography
+psychobiologic
+psychobiological
+psychobiologist
+psychobiology
+psychochemical
+psychocultural
+psychodrama
+psychodramatic
+psychodynamic
+psychodynamically
+psychodynamics
+psychogenesis
+psychogenetic
+psychogenic
+psychogenically
+psychognosis
+psychognosy
+psychograph
+psychohistory
+psychokinesis
+psychokinetic
+psycholinguist
+psycholinguistic
+psycholinguistics
+psychologic
+psychological
+psychologically
+psychologism
+psychologist
+psychologist's
+psychologists
+psychologization
+psychologize
+psychologized
+psychologizes
+psychologizing
+psychology
+psychometric
+psychometrically
+psychometrics
+psychometry
+psychomimetic
+psychomotor
+psychoneurosis
+psychoneurotic
+psychopath
+psychopathic
+psychopathically
+psychopathologic
+psychopathological
+psychopathologically
+psychopathologist
+psychopathology
+psychopathy
+psychopharmaceutical
+psychopharmacologic
+psychopharmacological
+psychopharmacologist
+psychopharmacology
+psychophysic
+psychophysical
+psychophysically
+psychophysicist
+psychophysics
+psychophysiologic
+psychophysiological
+psychophysiologically
+psychophysiologist
+psychophysiology
+psychopomp
+psychos
+psychoses
+psychosexual
+psychosexuality
+psychosexually
+psychosis
+psychosocial
+psychosocially
+psychosomatic
+psychosomatically
+psychosomatics
+psychosurgery
+psychosurgical
+psychotechnics
+psychotherapeutic
+psychotherapeutically
+psychotherapeutics
+psychotherapist
+psychotherapists
+psychotherapy
+psychotic
+psychotically
+psychotogen
+psychotogenic
+psychotomimetic
+psychotomimetically
+psychotropic
+psychrometer
+psychrometer's
+psychrometers
+psychrometric
+psychrometry
+psychrophilic
+psycoanalyze
+psyllium
+PTA
+ptah
+ptarmigan
+pteridology
+pteridophyte
+pteridosperm
+pterodactyl
+pterodactyl's
+pterodactyls
+pteropod
+pterosaur
+pterygoid
+pteryla
+ptisan
+ptochocracy
+ptolemaeus
+Ptolemaic
+Ptolemaist
+ptolemaists
+Ptolemaists
+Ptolemy
+ptomaine
+ptosis
+ptyalin
+ptyalism
+pub
+pub's
+puberal
+pubertal
+puberty
+puberulent
+pubes
+pubescence
+pubescent
+pubic
+pubis
+public
+publican
+publicans
+publication
+publication's
+publications
+publicist
+publicists
+publicity
+publicize
+publicized
+publicizes
+publicizing
+publick
+publicly
+publicness
+publics
+publique
+publish
+publishable
+published
+publisher
+publishers
+publishes
+publishing
+pubs
+PUC
+Puccini
+puccoon
+puce
+puck
+pucka
+pucker
+puckered
+puckering
+puckers
+puckery
+puckish
+puckishly
+puckishness
+pud
+pudding
+pudding's
+puddings
+puddingstone
+puddle
+puddled
+puddler
+puddles
+puddling
+puddly
+pudency
+pudendal
+pudendum
+pudgier
+pudginess
+pudgy
+pudsey
+puebla
+pueblo
+puebloization
+puebloization's
+puebloizations
+puebloize
+puebloizes
+pueblos
+puerile
+puerilely
+puerilism
+puerperal
+puerperium
+Puerto
+puff
+puffball
+puffballs
+puffbird
+puffbirds
+puffed
+puffer
+puffers
+puffery
+puffin
+puffiness
+puffing
+puffins
+puffs
+puffy
+pug
+pugaree
+puget
+puggaree
+pugging
+Pugh
+pugilism
+pugilist
+pugilistic
+puglia
+pugmark
+pugnacious
+pugnaciously
+pugnaciousness
+pugnacity
+pugwash
+puisne
+puissance
+puissant
+puissantly
+puke
+puked
+pukes
+puking
+pukka
+pul
+pula
+Pulaski
+pulchritude
+pulchritudinous
+pule
+puler
+puli
+pulicide
+pulik
+puling
+pulis
+Pulitzer
+pull
+pullback
+pulled
+puller
+pullet
+pulley
+pulley's
+pulleys
+pulling
+pullings
+Pullman
+Pullmanize
+Pullmanizes
+Pullmans
+pullorum
+pullout
+pullover
+pulls
+pullulate
+pullulation
+pulmonary
+pulmonate
+pulmonic
+pulmotor
+pulp
+pulpal
+pulpally
+pulper
+pulpiness
+pulping
+pulpit
+pulpit's
+pulpitize
+pulpitizes
+pulpits
+pulpwood
+pulpy
+pulque
+pulsant
+pulsar
+pulsar's
+pulsars
+pulsate
+pulsated
+pulsates
+pulsatile
+pulsating
+pulsation
+pulsations
+pulsator
+pulsatory
+pulse
+pulsed
+pulsejet
+pulser
+pulses
+pulsimeter
+pulsimeter's
+pulsimeters
+pulsing
+pulsometer
+pulsometer's
+pulsometers
+pulverable
+pulverizable
+pulverizable's
+pulverizables
+pulverization
+pulverization's
+pulverizations
+pulverize
+pulverized
+pulverizer
+pulverizers
+pulverizes
+pulverizing
+pulverulent
+pulvillus
+pulvinate
+pulvinus
+puma
+puma's
+pumice
+pumiced
+pumiceous
+pumicing
+pumicite
+pummel
+pummeled
+pummeler
+pummeling
+pummels
+pump
+pumped
+pumper
+pumpernickel
+pumping
+pumpkin
+pumpkin's
+pumpkins
+pumpkinseed
+pumpkinseeds
+pumps
+pun
+pun's
+puna
+punakha
+punce
+punch
+punchable
+punchball
+punchballs
+punchboard
+punchbowl
+punchbowls
+punched
+puncheon
+puncher
+puncher's
+punchers
+punches
+punchier
+punchinello
+punching
+punchings
+punchless
+punchy
+punctate
+punctation
+punctilio
+punctilious
+punctiliously
+punctiliousness
+punctual
+punctuality
+punctually
+punctualness
+punctuate
+punctuated
+punctuates
+punctuating
+punctuation
+punctuator
+puncture
+puncture's
+punctured
+punctures
+puncturing
+pundit
+punditry
+pundits
+pune
+pung
+pungency
+pungent
+pungently
+Punic
+punier
+punily
+puniness
+punish
+punishability
+punishable
+punished
+punisher
+punishes
+punishing
+punishment
+punishment's
+punishments
+punition
+punitive
+punitively
+punitiveness
+punjab
+Punjab
+Punjab's
+Punjabi
+punk
+punka
+punkah
+punkie
+punkier
+punkies
+punkin
+punkiness
+punks
+punky
+punnet
+punnets
+punnier
+punning
+punny
+puns
+punster
+punsters
+punt
+punta
+punted
+punter
+punters
+punties
+punting
+punts
+punty
+puny
+pup
+pup's
+pupa
+pupae
+pupal
+puparia
+puparial
+puparium
+pupas
+pupate
+pupated
+pupates
+pupating
+pupation
+pupfish
+pupil
+pupil's
+pupilage
+pupilar
+pupilize
+pupilizes
+pupillage
+pupillary
+pupils
+pupiparous
+puppet
+puppet's
+puppeteer
+puppeteers
+puppetize
+puppetizes
+puppetry
+puppets
+puppies
+pupping
+Puppis
+puppy
+puppy's
+puppyish
+pups
+purana
+Purbeck
+purblind
+purblindly
+purblindness
+Purcell
+purchasable
+purchase
+purchased
+purchaser
+purchasers
+purchases
+purchasing
+purdah
+purdew
+Purdue
+pure
+pureblood
+purebred
+puree
+puree's
+pureed
+pureeing
+purees
+purely
+pureness
+purer
+purest
+purfle
+purfled
+purfling
+purgation
+purgative
+purgatorial
+purgatory
+purge
+purged
+purger
+purges
+purging
+puri
+purification
+purifications
+purificator
+purificatory
+purified
+purifier
+purifiers
+purifies
+purifing
+purify
+purifying
+purim
+Purina
+purine
+purism
+purist
+puristic
+purists
+puritan
+puritanic
+puritanical
+puritanically
+puritanism
+Puritanize
+Puritanizer
+Puritanizers
+Puritanizes
+puritans
+purity
+purl
+purled
+purler
+purlers
+purlieu
+purlin
+purling
+purloin
+purloined
+purloiner
+purloining
+purloins
+puromycin
+purple
+purpled
+purpler
+purples
+purplest
+purpling
+purplish
+purply
+purport
+purported
+purportedly
+purporter
+purporters
+purporting
+purports
+purpose
+purposed
+purposeful
+purposefully
+purposefulness
+purposeless
+purposelessly
+purposelessness
+purposely
+purposes
+purposing
+purposive
+purposively
+purposiveness
+purpura
+purpure
+purpuric
+purpurin
+purr
+purred
+purring
+purringly
+purrs
+purse
+pursed
+purselike
+purser
+pursers
+purses
+pursewarden
+pursier
+pursiness
+pursing
+purslane
+pursuance
+pursuant
+pursue
+pursued
+pursuer
+pursuers
+pursues
+pursuing
+pursuit
+pursuit's
+pursuits
+pursuivant
+pursy
+purtenance
+purulence
+purulent
+purvey
+purveyance
+purveyed
+purveying
+purveyor
+purveyors
+purveys
+purview
+purvis
+pus
+Pusan
+Pusan's
+Pusey
+Pusey's
+Puseyism
+push
+pushball
+pushbutton
+pushbuttons
+pushcart
+pushchair
+pushchairs
+pushdown
+pushed
+pusher
+pushers
+pushes
+pushful
+pushfulness
+pushier
+pushily
+pushiness
+pushing
+pushkin
+pushout
+pushover
+pushover's
+pushovers
+pushpin
+pushpin's
+pushpins
+pushrod
+pushrods
+pushto
+pushup
+pushy
+pusillanimity
+pusillanimous
+pusillanimously
+puss
+pussier
+pussies
+pussy
+pussycat
+pussyfoot
+pussyfooter
+pussyfooting
+pussytoes
+pustulant
+pustular
+pustulate
+pustulated
+pustulation
+pustule
+pustules
+put
+putains
+putamen
+putas
+putative
+putatively
+putdown
+putdown's
+putdowns
+Putnam
+Putnam's
+putout
+putrefaction
+putrefactive
+putrefy
+putrescence
+putrescent
+putrescible
+putrescine
+putrid
+putridity
+putridly
+putridness
+puts
+putsch
+putschist
+putt
+puttana
+putted
+puttee
+puttees
+putter
+putterer
+puttering
+putters
+puttied
+putties
+putting
+putto
+putty
+puttying
+puttyroot
+putumayo
+puvis
+puy
+puzzle
+puzzled
+puzzleheaded
+puzzleheadedness
+puzzlement
+puzzler
+puzzlers
+puzzles
+puzzling
+puzzlings
+PVC
+PWT
+pya
+pyaemia
+pycnidium
+pycnogonid
+pycnometer
+pycnometer's
+pycnometers
+pydna
+pye
+pyelitis
+pyelography
+pyelonephritic
+pyelonephritis
+pyemia
+pyemic
+pygidial
+pygidium
+pygmaean
+Pygmalion
+pygmean
+pygmies
+pygmoid
+pygmy
+pygmy's
+pygmyish
+pygmyism
+Pyhrric
+pyknic
+pyknotic
+Pyle
+Pyle's
+pylon
+pylons
+pylorectomy
+pylori
+pyloric
+pylorus
+pylos
+pym
+pyocanea
+pyoderma
+pyodermic
+pyogenesis
+pyogenic
+pyoid
+Pyongyang
+Pyongyang's
+pyorrhea
+pyorrhea's
+pyorrheal
+pyorrheas
+pyosis
+Pyotr
+Pyotr's
+pyracanth
+pyracantha
+pyralid
+pyralidid
+pyramid
+pyramid's
+pyramidal
+pyramidally
+pyramidical
+pyramidize
+pyramidizes
+pyramids
+pyramus
+pyran
+pyranoid
+pyranometer
+pyranose
+pyranoside
+pyrargyrite
+pyrazole
+pyre
+pyrene
+pyrenees
+pyrenoid
+pyrethrin
+pyrethroid
+pyrethrum
+pyretic
+Pyrex
+pyrexia
+pyrexial
+pyrexic
+pyrheliometer
+pyrheliometer's
+pyrheliometers
+pyrheliometric
+pyric
+pyridine
+pyridinize
+pyridinizes
+pyridoxal
+pyridoxamine
+pyridoxin
+pyridoxine
+pyriform
+pyrimethamine
+pyrimidine
+pyrimidines
+pyrite
+pyrites
+pyritic
+pyritization
+pyritization's
+pyritizations
+pyritize
+pyritizes
+pyrocatechol
+pyrocellulose
+pyrochemical
+pyrochemically
+pyroclastic
+pyroconductivity
+pyroelectric
+pyroelectricity
+pyrogallate
+pyrogallol
+pyrogen
+pyrogenic
+pyrogenicity
+pyrogenous
+pyrognostics
+pyrographic
+pyrography
+pyrola
+pyroligneous
+pyrolusite
+pyrolysed
+pyrolysing
+pyrolysis
+pyrolytic
+pyrolytically
+pyrolyzable
+pyrolyzate
+pyrolyze
+pyrolyze's
+pyrolyzer
+pyrolyzes
+pyromagnetic
+pyromancy
+pyromania
+pyromaniac
+pyromaniac's
+pyromaniacal
+pyromaniacs
+pyrometallurgical
+pyrometallurgy
+pyrometer
+pyrometer's
+pyrometers
+pyrometric
+pyrometrically
+pyrometry
+pyromorphite
+pyrone
+pyronine
+pyroninophilic
+pyrope
+pyrophoric
+pyrophosphate
+pyrophosphatic
+pyrophosphoric
+pyrophotometer
+pyrophyllite
+pyrophyllte
+pyrosis
+pyrostat
+pyrosulphate
+pyrosulphuric
+pyrotechnic
+pyrotechnical
+pyrotechnically
+pyrotechnics
+pyrotechnist
+pyroxene
+pyroxenic
+pyroxenite
+pyroxenitic
+pyroxenoid
+pyroxylin
+pyrrha
+pyrrhic
+pyrrho
+pyrrhotite
+pyrrhuloxia
+Pyrrhus
+pyrrol
+pyrrole
+pyrrolic
+pyrrolidine
+pyrruvic
+pyruvate
+pyschiatrist
+Pythagoras
+Pythagorean
+Pythagoreanism
+Pythagoreanize
+Pythagoreanizes
+Pythagoreans
+Pythia
+Pythian
+pythias
+python
+pythoness
+pythonic
+pythonine
+pythonize
+pythonizes
+pythons
+pyuria
+pyx
+pyxides
+pyxidium
+pyxie
+pyxis
+q's
+QA
+qaboos
+qaddafi
+qaddish
+qadi
+qairwan
+Qatar
+Qatar's
+qattara
+QED
+qeshm
+qibla
+qintar
+qishm
+QM
+qoph
+qua
+quack
+quacked
+quackery
+quacking
+quackish
+quacks
+quad
+quadded
+quadding
+quadragenarian
+Quadragesima
+quadragesimal
+quadrangle
+quadrangles
+quadrangular
+quadrant
+quadrant's
+quadrantal
+quadrants
+quadraphonic
+quadraphonics
+quadraphony
+quadraplegic
+quadrapole
+quadrat
+quadrate
+quadrated
+quadrates
+quadratic
+quadratical
+quadratically
+quadratics
+quadrating
+quadrature
+quadrature's
+quadratures
+quadrella
+quadrennial
+quadrennially
+quadrennium
+quadric
+quadricentennial
+quadriceps
+quadricipital
+quadrifid
+quadriga
+quadrilateral
+quadrilaterals
+quadrille
+quadrilles
+quadrillion
+quadrillionth
+quadrinomial
+quadripartite
+quadripartitely
+quadripartition
+quadriplegia
+quadriplegic
+quadripuntal
+quadrisect
+quadrisected
+quadrisecting
+quadrisects
+quadrisyllabic
+quadrivalent
+quadrivial
+quadrivium
+quadroon
+quadroons
+quadrophonics
+quadrumanous
+quadrumvir
+quadrumvirate
+quadruped
+quadrupedal
+quadrupeds
+quadruple
+quadrupled
+quadruples
+quadruplet
+quadruplets
+quadruplex
+quadruplicate
+quadruplicated
+quadruplicates
+quadruplicating
+quadruplication
+quadruplications
+quadruplicity
+quadrupling
+quadruply
+quadrupolar
+quadrupole
+quadword
+quadword's
+quadwords
+quaere
+quaestor
+quaff
+quaffer
+quag
+quagga
+quaggy
+quagmire
+quagmire's
+quagmires
+quahog
+quai
+quaich
+quail
+quail's
+quails
+quaint
+quaintly
+quaintness
+quake
+quaked
+quaker
+Quakeress
+Quakerization
+Quakerization's
+Quakerizations
+Quakerize
+Quakerizes
+quakers
+quakes
+quaking
+quaky
+quale
+qualification
+qualifications
+qualified
+qualifiedly
+qualifier
+qualifiers
+qualifies
+qualify
+qualifying
+qualitative
+qualitatively
+qualities
+quality
+quality's
+qualm
+qualmish
+qualmishly
+qualmishness
+qualms
+qualmy
+quandaries
+quandary
+quandary's
+quango
+quangos
+quant
+quanta
+quantal
+quantasome
+quantic
+Quantico
+quantifiable
+quantifiably
+quantification
+quantificational
+quantificationally
+quantifications
+quantified
+quantifier
+quantifiers
+quantifies
+quantify
+quantifying
+quantifys
+quantile
+quantiles
+quantitate
+quantitated
+quantitates
+quantitating
+quantitation
+quantitations
+quantitative
+quantitatively
+quantitativeness
+quantities
+quantity
+quantity's
+quantization
+quantization's
+quantizations
+quantize
+quantized
+quantizer
+quantizer's
+quantizers
+quantizes
+quantizing
+quantum
+quaquaversal
+quarantinable
+quarantine
+quarantine's
+quarantined
+quarantines
+quarantining
+quare
+quark
+quarks
+quarrel
+quarreled
+quarreler
+quarrelers
+quarreling
+quarrelous
+quarrels
+quarrelsome
+quarrelsomely
+quarrelsomeness
+quarrian
+quarried
+quarrier
+quarries
+quarry
+quarry's
+quarrying
+quarryman
+quarrymen
+quart
+quartan
+quarter
+quarterage
+quarterback
+quarterbacks
+quarterdeck
+quarterdecks
+quartered
+quarterer
+quarterfinal
+quarterfinalist
+quartering
+quarterization
+quarterization's
+quarterizations
+quarterlies
+quarterlight
+quarterlights
+quarterly
+quartermaster
+quartermasters
+quartern
+quarternary
+quarters
+quartersaw
+quarterstaff
+quartet
+quartet's
+quartets
+quartette
+quartic
+quartics
+quartile
+quartiles
+quarto
+quartos
+quarts
+quartz
+quartziferous
+quartzite
+quartzitic
+quartzose
+quasar
+quasar's
+quasars
+quash
+quashed
+quashes
+quashi
+quashing
+quasi
+quasicontinuous
+quasimodo
+Quasimodo
+quasiorder
+quasiparticle
+quasiperiodic
+quasistationary
+quass
+Quassia
+quatercentenary
+quaternaries
+quaternary
+quaternion
+quaternity
+quathlamba
+quatrain
+quatre
+quatrefoil
+quattrocento
+quattuordecillion
+quaver
+quavered
+quavering
+quaveringly
+quavers
+quavery
+quay
+quayage
+quays
+quayside
+quean
+queasier
+queasily
+queasiness
+queasy
+queazy
+Quebec
+quebracho
+queen
+queen's
+Queenborough
+queencake
+queenly
+queens
+queensberry
+queenship
+Queensland
+Queensland's
+Queenstown
+queer
+queerer
+queerest
+queerish
+queerly
+queerness
+queers
+quell
+quelled
+queller
+quelling
+quells
+quelpart
+quelquechose
+quemoy
+quench
+quenchable
+quenched
+quencher
+quenches
+quenching
+quenchless
+queneau
+quenelle
+quercetin
+quercine
+queried
+querier
+queries
+querilla
+querist
+quern
+querns
+querulous
+querulously
+querulousness
+query
+querying
+quesnay
+quest
+quested
+quester
+questers
+questing
+question
+questionable
+questionableness
+questionably
+questionary
+questioned
+questioner
+questioners
+questioning
+questioningly
+questionings
+questionless
+questionnaire
+questionnaire's
+questionnaires
+questions
+questor
+quests
+quetta
+quetzal
+quetzalcoatl
+quetzales
+queue
+queue's
+queued
+queuer
+queuer's
+queuers
+queues
+queuing
+Quezon
+Quezon's
+quib
+quibble
+quibbled
+quibbler
+quibbles
+quibbling
+quiberon
+quibs
+quiche
+quiches
+Quichua
+quick
+quicken
+quickened
+quickener
+quickening
+quickens
+quicker
+quickest
+quickie
+quickies
+quicklime
+quickly
+quickness
+quicksand
+quicksands
+quickset
+quicksilver
+quickstep
+quicksteps
+quid
+quid's
+quiddity
+quidnunc
+quids
+quiescence
+quiescent
+quiescently
+quiescentness
+quiet
+quieted
+quieten
+quietened
+quietening
+quietens
+quieter
+quietest
+quieting
+quietism
+quietist
+quietly
+quietness
+quiets
+quietude
+quietus
+quiff
+quiffed
+quiffs
+quill
+quillet
+quillon
+quills
+quillwort
+quilmes
+quilt
+quilted
+quilter
+quilting
+quilts
+quim
+Quimper
+quinacrine
+quinary
+quinate
+quince
+quincentenary
+quinces
+quincuncial
+quincuncially
+quincunx
+quincunxes
+quincunxial
+quincy
+quindecagon
+quindecaplet
+quindecennial
+quindecillion
+quinic
+quinidine
+quiniela
+quinine
+quininize
+quininizes
+Quinn
+Quinn's
+quinnat
+quinoa
+quinoid
+quinoidine
+quinol
+quinoline
+quinone
+quinonoid
+quinquagenarian
+Quinquagesima
+quinquecentenary
+quinquefoliate
+quinquennial
+quinquennially
+quinquennium
+quinquepartite
+quinquereme
+quinquevalent
+quinquivalent
+quinsy
+quint
+quintain
+quintal
+quintan
+quintana
+quintero
+quintessence
+quintessential
+quintet
+quintets
+quintette
+quintic
+quintile
+quintiles
+quintilian
+quintillion
+quintillionth
+quintuple
+quintupled
+quintuples
+quintuplet
+quintuplet's
+quintuplets
+quintuplicate
+quintuplicated
+quintuplicates
+quintuplicating
+quintupling
+quintus
+quinze
+quip
+quipped
+quipping
+quips
+quipster
+quipu
+quire
+Quirinal
+quirinus
+Quirites
+quirk
+quirkily
+quirkiness
+quirking
+quirks
+quirky
+quirt
+quisling
+quislingism
+quist
+quit
+quitch
+quitclaim
+quite
+Quito
+Quito's
+quitrent
+quits
+quittance
+quitted
+quitter
+quitter's
+quitters
+quitting
+quittor
+Quivar
+quiver
+quivered
+quiverful
+quivering
+quivers
+Quixote
+quixotic
+quixotical
+quixotically
+Quixotism
+quixotry
+quiz
+quizmaster
+quizzed
+quizzer
+quizzes
+quizzical
+quizzicality
+quizzically
+quizzing
+qum
+qumran
+quo
+quod
+quodlibet
+quoin
+quoit
+quoits
+quokka
+quondam
+quonset
+quorum
+quot
+quota
+quota's
+quotable
+quotas
+quotation
+quotation's
+quotations
+quote
+quoted
+quotes
+quoth
+quotha
+quotidian
+quotient
+quotients
+quoting
+r's
+Rabat
+Rabat's
+rabato
+rabaul
+rabbath
+rabbet
+rabbeted
+rabbeting
+rabbets
+rabbi
+rabbinate
+rabbinic
+rabbinical
+rabbinically
+rabbinism
+rabbit
+rabbit's
+rabbited
+rabbiter
+rabbitfish
+rabbiting
+rabbitoh
+rabbitry
+rabbits
+rabbity
+rabble
+rabbled
+rabblement
+rabbler
+rabbling
+Rabelais
+Rabelaisian
+Rabi
+Rabia
+rabic
+rabid
+rabidity
+rabidly
+rabidness
+rabies
+Rabin
+Rabin's
+raccoon
+raccoon's
+raccoons
+race
+racecard
+racecards
+racecourse
+racecourses
+raced
+racegoer
+racegoers
+racehorse
+racehorse's
+racehorses
+racemate
+raceme
+racemic
+racemization
+racemize
+racemized
+racemizes
+racemizing
+racemose
+racer
+racers
+races
+racetrack
+racetracker
+raceway
+Rachel
+rachet
+rachides
+rachiodont
+rachis
+rachises
+rachitic
+rachitis
+Rachmaninoff
+rachmanism
+racial
+racialism
+racialist
+racialistic
+racialization
+racialization's
+racializations
+racialize
+racializes
+racially
+racier
+racily
+racine
+Racine
+raciness
+racing
+racism
+racist
+racists
+rack
+racked
+racker
+racket
+racket's
+racketeer
+racketeering
+racketeers
+rackets
+rackety
+Rackham
+racking
+rackle
+racks
+racon
+raconteur
+racoon
+racquet
+racquets
+racy
+rad
+rada
+radar
+radar's
+radars
+radarscope
+radarscopes
+Radcliffe
+raddle
+raddled
+raddles
+raddling
+Radetzky
+radial
+radiale
+radialization
+radialization's
+radializations
+radialize
+radializes
+radially
+radian
+radiance
+radiancy
+radians
+radiant
+radiantly
+radiate
+radiated
+radiately
+radiates
+radiating
+radiation
+radiational
+radiationless
+radiations
+radiative
+radiatively
+radiator
+radiator's
+radiators
+radic
+radical
+radicalism
+radicalization
+radicalization's
+radicalizations
+radicalize
+radicalized
+radicalizes
+radicalizing
+radically
+radicalness
+radicals
+radicand
+radicate
+radicel
+radices
+radicle
+radicular
+radiguet
+radii
+radio
+radioactivate
+radioactive
+radioactively
+radioactivities
+radioactivity
+radioastronomy
+radioautograph
+radioautographic
+radioautography
+radiobiologic
+radiobiological
+radiobiologically
+radiobiologist
+radiobiology
+radiobroadcast
+radiobroadcaster
+radiobroadcasting
+radiocarbon
+radiocast
+radiocaster
+radiochemical
+radiochemically
+radiochemist
+radiochemistry
+radiochlorine
+radiocommunication
+radioecological
+radioecologist
+radioecology
+radioed
+radioelement
+radiogenic
+radiogram
+radiogram's
+radiograms
+radiograph
+radiographic
+radiographically
+radiography
+radioimmunoassay
+radioing
+radioisotope
+radioisotopic
+radioisotopically
+radiolarian
+radioligand
+radiolocation
+radiologic
+radiological
+radiologically
+radiologist
+radiology
+radiolucency
+radiolucent
+radioluminescence
+radiolysis
+radiolytic
+radioman
+radiomen
+radiometeorograph
+radiometer
+radiometer's
+radiometers
+radiometric
+radiometrically
+radiometry
+radiomicrometer
+radiomimetic
+radionics
+radionuclide
+radiopaque
+radiopasteurization
+radiophone
+radiophonic
+radiophoto
+radiophotograph
+radiophysics
+radios
+radioscope
+radioscopic
+radioscopy
+radiosensitive
+radiosensitivity
+radiosonde
+radiosterilization
+radiosterilize
+radiosterilized
+radiosterilizes
+radiosterilizing
+radiostrontium
+radiosymmetrical
+radiotelegram
+radiotelegraph
+radiotelegraphic
+radiotelegraphy
+radiotelemetry
+radiotelephone
+radiotelephony
+radioteletype
+radiotherapist
+radiotherapy
+radiothermy
+radiothorium
+radiotoxic
+radiotracer
+radish
+radish's
+radishes
+radium
+radiumization
+radiumization's
+radiumizations
+radiumize
+radiumizes
+radius
+radiuses
+radix
+radixes
+Radnorshire
+radom
+radome
+radon
+rads
+radula
+radular
+Rae
+Rae's
+raeburn
+raf
+Rafael
+raff
+Rafferty
+Rafferty's
+raffia
+raffinate
+raffinose
+raffish
+raffishly
+raffishness
+raffle
+raffled
+raffles
+Rafflesia
+raffling
+raft
+rafter
+raftered
+rafters
+rafts
+raftsman
+rag
+rag's
+raga
+ragamuffin
+ragbag
+ragbolt
+rage
+raged
+rages
+ragged
+raggedly
+raggedness
+raggedy
+ragging
+raggle
+ragi
+raging
+raglan
+ragman
+ragout
+ragpicker
+rags
+ragtag
+ragtime
+ragusa
+Ragusan
+ragweed
+ragweeds
+ragworm
+ragworms
+ragwort
+rah
+rahman
+Raia
+raid
+raided
+raider
+raiders
+raiding
+raids
+rail
+railbird
+railbirds
+railcar
+railcars
+railed
+railer
+railers
+railhead
+railheads
+railing
+raillery
+railroad
+railroaded
+railroader
+railroaders
+railroading
+railroads
+rails
+railway
+railway's
+railwayman
+railways
+raiment
+Raimondi
+rain
+rain's
+rainband
+rainbird
+rainbow
+rainbows
+raincheck
+raincoat
+raincoat's
+raincoats
+raindrop
+raindrop's
+raindrops
+rained
+rainfall
+rainforest
+rainier
+rainiest
+raining
+rainless
+rainmaker
+rainmaking
+rainout
+rainproof
+rains
+rainspout
+rainsquall
+rainstorm
+rainwash
+rainwater
+rainwear
+rainy
+raise
+raised
+raiser
+raisers
+raises
+raisin
+raising
+raisins
+raison
+raj
+raja
+rajab
+rajah
+rajahs
+rajasthan
+Rajive
+Rajive's
+rajkot
+Rajput
+rajputana
+rajya
+rakata
+rake
+raked
+rakehell
+raker
+rakes
+raki
+raking
+rakish
+rakishly
+rakishness
+rale
+Raleigh
+rallentando
+rallied
+rallies
+ralline
+rally
+rallycross
+rallye
+rallying
+rallyist
+rallymaster
+Ralph
+Ralph's
+Ralston
+ram
+ram's
+Rama
+ramachandra
+Ramada
+ramakrishna
+Raman
+Raman's
+ramat
+ramate
+ramayana
+rambert
+ramble
+rambled
+rambler
+ramblers
+rambles
+rambling
+ramblingly
+ramblings
+Rambouillet
+rambunctious
+rambunctiously
+rambunctiousness
+rambutan
+rameau
+ramekin
+ramentum
+ramequin
+Rameses
+rami
+ramie
+ramification
+ramification's
+ramifications
+ramified
+ramifies
+ramiform
+ramify
+ramifying
+ramillies
+Ramirez
+ramirez
+ramjet
+ramjets
+rammed
+rammer
+ramming
+rammish
+Ramo
+Ramo's
+Ramona
+ramose
+ramosely
+ramous
+ramp
+ramp's
+rampage
+rampaged
+rampageous
+rampageously
+rampageousness
+rampages
+rampaging
+Rampal
+rampancy
+rampant
+rampantly
+rampart
+ramparts
+ramped
+ramping
+rampion
+ramps
+rampur
+ramrod
+ramrods
+rams
+ramsay
+ramses
+Ramsey
+ramsgate
+ramshackle
+ramsons
+ramtil
+ramulose
+ramus
+ran
+rancagua
+rance
+ranch
+ranched
+rancher
+rancherie
+ranchero
+ranchers
+ranches
+ranchi
+ranching
+ranchman
+rancho
+ranchos
+rancid
+rancidity
+rancidness
+rancor
+rancor's
+rancorous
+rancorously
+rancors
+Rand
+Randall
+randan
+randers
+randies
+Randolph
+random
+randomization
+randomization's
+randomizations
+randomize
+randomized
+randomizer
+randomizes
+randomizing
+randomly
+randomness
+Randova
+randy
+Randy's
+ranee
+rang
+range
+ranged
+rangefinder
+rangeland
+rangelands
+ranger
+rangers
+ranges
+rangier
+ranginess
+ranging
+Rangoon
+rangy
+rani
+ranian
+Ranier
+Ranier's
+ranjit
+rank
+ranked
+ranker
+ranker's
+rankers
+rankest
+Ranki
+Rankin
+Rankin's
+Rankine
+ranking
+ranking's
+rankings
+rankle
+rankled
+rankles
+rankling
+rankly
+rankness
+ranks
+ranmoor
+ransack
+ransacked
+ransacker
+ransacking
+ransacks
+ransom
+ransome
+ransomer
+ransoming
+ransoms
+rant
+ranted
+ranter
+ranters
+ranting
+rantingly
+rantry
+rants
+ranunculaceous
+ranunculus
+Raoul
+rap
+rap's
+rapacious
+rapaciously
+rapaciousness
+rapacity
+rapacki
+Rapallo
+rape
+raped
+raper
+rapes
+rapeseed
+Raphael
+raphe
+Raphia
+raphide
+rapid
+rapidity
+rapidly
+rapidness
+rapids
+rapier
+rapine
+raping
+rapist
+rapists
+rapparee
+rapped
+rappee
+rappel
+rappen
+rapper
+rapper's
+rappers
+rapping
+rapport
+rapporteur
+rapprochement
+raps
+rapscallion
+rapt
+raptly
+raptness
+raptor
+raptorial
+rapture
+rapture's
+raptured
+raptures
+rapturing
+rapturize
+rapturizes
+rapturous
+rapturously
+rapturousness
+rapunzel
+Rapunzel
+rara
+rare
+rarebit
+raree
+rarefaction
+rarefactional
+rarefactive
+rarefied
+rarefy
+rarely
+rareness
+rarer
+rareripe
+rarest
+rarify
+raring
+Raritan
+Raritan's
+rarities
+rarity
+rarity's
+rarotonga
+rasa
+rasbora
+rascal
+rascality
+rascalize
+rascalizes
+rascally
+rascals
+rase
+rash
+rasher
+rashes
+rashly
+rashness
+rasht
+rasing
+rask
+Rasmussen
+rasorial
+rasp
+raspatory
+raspberry
+rasped
+rasper
+rasping
+raspingly
+raspings
+rasps
+rasputin
+raspy
+rasse
+Rastafarian
+raster
+rasters
+Rastus
+rasure
+rat
+rat's
+rata
+ratable
+ratably
+ratafia
+ratan
+rataplan
+ratatouille
+ratbag
+ratbaggery
+ratbite
+ratch
+ratchet
+ratchet's
+ratcheted
+ratcheting
+ratchets
+rate
+rateable
+rated
+rateen
+ratel
+ratemeter
+ratemeter's
+ratemeters
+ratepayer
+ratepayers
+rater
+raters
+rates
+ratfink
+ratfish
+Ratfor
+ratha
+rathe
+rathenau
+rather
+rathskeller
+raticide
+ratification
+ratificationist
+ratifications
+ratified
+ratifies
+ratify
+ratifying
+rating
+ratings
+ratio
+ratio's
+ratiocinate
+ratiocinated
+ratiocinates
+ratiocinating
+ratiocination
+ratiocinative
+ratiocinator
+ratiometer
+ration
+rational
+rationale
+rationale's
+rationales
+rationalism
+rationalist
+rationalistic
+rationalistically
+rationalists
+rationalities
+rationality
+rationalizable
+rationalizable's
+rationalizables
+rationalization
+rationalization's
+rationalizations
+rationalize
+rationalized
+rationalizer
+rationalizers
+rationalizes
+rationalizing
+rationally
+rationalness
+rationed
+rationing
+rations
+ratios
+ratisbon
+ratite
+ratlam
+ratlike
+ratline
+rato
+raton
+ratoon
+rats
+ratsbane
+rattail
+rattan
+ratted
+ratteen
+ratter
+rattier
+rattigan
+ratting
+rattish
+Rattle
+rattle
+rattlebox
+rattlebrain
+rattlebrained
+rattled
+rattler
+rattlers
+rattles
+rattlesnake
+rattlesnake's
+rattlesnakes
+rattletrap
+rattling
+rattlingly
+rattly
+rattoon
+rattrap
+ratty
+raucous
+raucously
+raucousness
+Raul
+Raul's
+raunchier
+raunchily
+raunchiness
+raunchy
+Rauwolfia
+ravage
+ravaged
+ravagement
+ravager
+ravagers
+ravages
+ravaging
+rave
+raved
+ravel
+Ravel
+raveled
+raveler
+ravelers
+ravelin
+raveling
+ravelings
+ravelment
+ravels
+raven
+ravened
+ravener
+ravening
+ravenna
+ravenous
+ravenously
+ravenousness
+ravens
+raver
+raves
+ravin
+ravine
+ravine's
+ravined
+ravines
+raving
+ravings
+ravioli
+ravish
+ravisher
+ravishes
+ravishing
+ravishingly
+ravishment
+raw
+rawalpindi
+rawboned
+rawer
+rawest
+rawhide
+rawhided
+rawhiding
+rawinsonde
+Rawlings
+rawlings
+Rawlins
+rawlins
+Rawlinson
+rawly
+rawness
+raws
+Rawson
+rawsthorne
+ray
+ray's
+Rayburn
+rayed
+Rayleigh
+rayless
+raylessness
+raylet
+Raymond
+Raymondville
+rayon
+rays
+Raytheon
+raze
+razed
+razee
+razeed
+razeeing
+razer
+razes
+razing
+razoo
+razor
+razor's
+razorback
+razorbill
+razors
+razz
+razzia
+razzle
+razzmatazz
+RCA
+RCS
+rd
+re
+Rea
+reabbreviate
+reabbreviated
+reabbreviates
+reabbreviating
+reabsorb
+reabsorption
+reacclimatization
+reacclimatization's
+reacclimatizations
+reacclimatize
+reacclimatizes
+reach
+reachability
+reachable
+reachably
+reached
+reacher
+reaches
+reaching
+reacknowledgment
+reacknowledgment's
+reacknowledgments
+reacquaint
+reacquainted
+reacquire
+reacquisition
+react
+reactance
+reactances
+reactant
+reactants
+reacted
+reacting
+reaction
+reaction's
+reactional
+reactionally
+reactionaries
+reactionary
+reactionary's
+reactionaryism
+reactions
+reactivate
+reactivated
+reactivates
+reactivating
+reactivation
+reactive
+reactively
+reactiveness
+reactivity
+reactor
+reactor's
+reactors
+reacts
+reactualization
+reactualization's
+reactualizations
+reactualize
+reactualizes
+read
+readability
+readable
+readableness
+readably
+readapting
+reade
+reader
+reader's
+readers
+readership
+readership's
+readied
+readier
+readies
+readiest
+readily
+readiness
+reading
+readings
+readjust
+readjustable
+readjusted
+readjuster
+readjusting
+readjustment
+readjustments
+readjusts
+readonly
+readout
+readout's
+readouts
+reads
+readwrite
+ready
+readying
+reaffirm
+reaffirmation
+reaffirmed
+reaffirming
+reaffirms
+reafforest
+Reagan
+reagent
+reagents
+reaggregate
+reaggregation
+real
+realest
+realgar
+realign
+realigned
+realigning
+realignment
+realignments
+realigns
+realism
+realist
+realist's
+realistic
+realistically
+realisticize
+realisticizes
+realists
+realities
+reality
+realizabilities
+realizability
+realizability's
+realizable
+realizable's
+realizableness
+realizables
+realizablies
+realizably
+realization
+realization's
+realizations
+realize
+realized
+realizer
+realizers
+realizes
+realizing
+realizing's
+realizingly
+realizings
+reallocate
+reallocated
+reallocates
+reallocating
+reallocation
+reallocation's
+reallocations
+reallocator
+reallocator's
+reallocators
+reallot
+reallotment
+reallotments
+reallots
+reallotted
+reallotting
+really
+realm
+realm's
+realms
+realness
+realpolitik
+reals
+realtor
+realtors
+realty
+ream
+ream's
+reamed
+reamer
+reaming
+reams
+reanalysis
+reanalyze
+reanalyzed
+reanalyzer
+reanalyzers
+reanalyzes
+reanalyzing
+reanimalize
+reanimalizes
+reap
+reaped
+reaper
+reaping
+reapologize
+reapologizes
+reappear
+reappearance
+reappeared
+reappearing
+reappears
+reapplication
+reapplied
+reapplies
+reapply
+reapplying
+reapportion
+reapportioned
+reapportionment
+reappraisal
+reappraisals
+reappraise
+reappraised
+reappraises
+reappraising
+reaps
+rear
+reared
+rearer
+rearguard
+rearguards
+rearhorse
+rearing
+rearm
+rearmament
+rearmed
+rearming
+rearmost
+rearms
+rearrange
+rearrangeable
+rearranged
+rearrangement
+rearrangement's
+rearrangements
+rearranges
+rearranging
+rearrest
+rearrested
+rears
+rearward
+rearwardly
+rearwards
+reason
+reasonability
+reasonable
+reasonableness
+reasonably
+reasoned
+reasoner
+reasoning
+reasonings
+reasonless
+reasonlessly
+reasons
+reassemble
+reassembled
+reassembler
+reassembles
+reassembling
+reassembly
+reassert
+reasserted
+reasserting
+reassertion
+reasserts
+reassess
+reassessed
+reassesses
+reassessing
+reassessment
+reassessment's
+reassessments
+reassign
+reassignable
+reassigned
+reassigning
+reassignment
+reassignment's
+reassignments
+reassigns
+reassociation
+reassurance
+reassurances
+reassure
+reassured
+reassures
+reassuring
+reassuringly
+reast
+reauthorization
+reauthorization's
+reauthorizations
+reauthorize
+reauthorizes
+reave
+reaver
+reaving
+reawaken
+reawakened
+reawakening
+reawakens
+reb
+rebaptization
+rebaptization's
+rebaptizations
+rebarbative
+rebarbatively
+rebate
+rebate's
+rebated
+rebater
+rebates
+rebating
+rebato
+rebec
+Rebecca
+rebel
+rebel's
+rebell
+rebelled
+rebelling
+rebellion
+rebellion's
+rebellions
+rebellious
+rebelliously
+rebelliousness
+rebellow
+rebells
+rebels
+rebid
+rebidding
+rebids
+rebirth
+rebirth's
+reboant
+rebond
+rebonded
+rebonding
+rebonds
+reboot
+rebooted
+rebooter
+rebooters
+rebooting
+reboots
+reborn
+rebound
+rebounded
+rebounder
+rebounding
+rebounds
+rebourbonize
+rebourbonizes
+Rebozo
+rebroadcast
+rebroadcasts
+rebrutalize
+rebrutalizes
+rebs
+rebuff
+rebuffed
+rebuffing
+rebuffs
+rebuild
+rebuilding
+rebuilds
+rebuilt
+rebuke
+rebuked
+rebuker
+rebukes
+rebuking
+rebus
+rebut
+rebuttable
+rebuttal
+rebuttals
+rebutted
+rebutter
+rebutting
+rec
+recalcitrance
+recalcitrancy
+recalcitrant
+recalculate
+recalculated
+recalculates
+recalculating
+recalculation
+recalculations
+recalesce
+recalescence
+recall
+recallability
+recallable
+recalled
+recaller
+recalling
+recalls
+recanalization
+recant
+recantation
+recanted
+recap
+recapitalization
+recapitalization's
+recapitalizations
+recapitalize
+recapitalized
+recapitalizes
+recapitulate
+recapitulated
+recapitulates
+recapitulating
+recapitulation
+recappable
+recapped
+recapping
+recaption
+recapture
+recaptured
+recaptures
+recapturing
+recarbonization
+recarbonization's
+recarbonizations
+recarbonize
+recarbonizer
+recarbonizers
+recarbonizes
+recast
+recasting
+recasts
+recategorized
+recatory
+recausticize
+recausticizes
+recede
+receded
+recedes
+receding
+receipt
+receipt's
+receipted
+receipting
+receiptor
+receipts
+receivable
+receivables
+receive
+received
+receiver
+receiver's
+receivers
+receivership
+receives
+receiving
+recency
+recension
+recent
+recently
+recentness
+recentralization
+recentralization's
+recentralizations
+recentralize
+recentralizes
+recept
+receptacle
+receptacle's
+receptacles
+receptaculum
+reception
+reception's
+receptionist
+receptionists
+receptions
+receptive
+receptively
+receptiveness
+receptivity
+receptor
+receptor's
+receptors
+recertification
+recess
+recessed
+recesses
+recessing
+recession
+recession's
+recessional
+recessionary
+recessions
+recessive
+recessively
+recessiveness
+recharge
+rechargeable
+recharged
+recharger
+recharges
+recharging
+rechartering
+recheat
+recheck
+rechecked
+rechecking
+rechecks
+recherche
+recherches
+recidivism
+recidivist
+recidivistic
+Recife
+Recife's
+recipe
+recipe's
+recipes
+recipience
+recipiency
+recipient
+recipient's
+recipients
+reciprocal
+reciprocalize
+reciprocalizes
+reciprocally
+reciprocals
+reciprocate
+reciprocated
+reciprocates
+reciprocating
+reciprocation
+reciprocative
+reciprocator
+reciprocity
+recirculate
+recirculated
+recirculates
+recirculating
+recirculation
+recision
+recital
+recital's
+recitalist
+recitals
+recitation
+recitation's
+recitations
+recitative
+recitativo
+recite
+recited
+reciter
+recites
+reciting
+recivilization
+recivilization's
+recivilizations
+recivilize
+recivilizes
+reck
+reckless
+recklessly
+recklessness
+Recklinghausen
+reckon
+reckoned
+reckoner
+reckoning
+reckonings
+reckons
+reclaim
+reclaimable
+reclaimed
+reclaimer
+reclaimers
+reclaiming
+reclaims
+reclamation
+reclamations
+reclassification
+reclassified
+reclassifies
+reclassify
+reclassifying
+reclinate
+recline
+reclined
+reclines
+reclining
+reclosable
+recluse
+recluse's
+recluses
+reclusion
+reclusive
+recluster
+reclustered
+reclustering
+reclusters
+recode
+recoded
+recodes
+recodified
+recodifies
+recodify
+recodifying
+recoding
+recognition
+recognition's
+recognitions
+recognizability
+recognizable
+recognizably
+recognizance
+recognize
+recognized
+recognizedlies
+recognizedly
+recognizee
+recognizer
+recognizers
+recognizes
+recognizing
+recognizinglies
+recognizingly
+recoil
+recoiled
+recoiling
+recoilless
+recoils
+recoin
+recoinage
+recollect
+recollected
+recollecting
+recollection
+recollection's
+recollections
+recollects
+recolonization
+recolonization's
+recolonizations
+recolonize
+recolonizes
+recolor
+recolor's
+recolored
+recoloring
+recolors
+recombinant
+recombination
+recombination's
+recombinational
+recombinations
+recombine
+recombined
+recombines
+recombining
+recommence
+recommenced
+recommences
+recommencing
+recommend
+recommendable
+recommendation
+recommendation's
+recommendations
+recommendatory
+recommended
+recommender
+recommending
+recommends
+recommit
+recommitment
+recommittal
+recompence
+recompense
+recompilation
+recompilations
+recompile
+recompiled
+recompiles
+recompiling
+recompose
+recomposition
+recompute
+recomputed
+recomputes
+recomputing
+reconceptualization
+reconceptualizing
+reconcilability
+reconcilable
+reconcilableness
+reconcile
+reconciled
+reconcilement
+reconciler
+reconciles
+reconciliation
+reconciliation's
+reconciliations
+reconciliatory
+reconciling
+recondite
+reconditely
+reconditeness
+recondition
+reconditioned
+reconditioning
+reconditionings
+reconditions
+reconfigurability
+reconfigurable
+reconfiguration
+reconfiguration's
+reconfigurations
+reconfigure
+reconfigured
+reconfigurer
+reconfigures
+reconfiguring
+reconfirm
+reconfirmation
+reconnaissance
+reconnect
+reconnected
+reconnecter
+reconnecting
+reconnection
+reconnects
+reconnoiter
+reconnoitered
+reconnoiterer
+reconnoiterer's
+reconnoiterers
+reconnoitering
+reconnoiters
+reconquer
+reconquered
+reconquering
+reconquers
+reconsider
+reconsideration
+reconsidered
+reconsidering
+reconsiders
+reconsolidate
+reconsolidated
+reconsolidates
+reconsolidating
+reconstitute
+reconstituted
+reconstitutes
+reconstitution
+reconstruct
+reconstructed
+reconstructible
+reconstructing
+reconstruction
+reconstructionism
+reconstructionist
+reconstructions
+reconstructive
+reconstructor
+reconstructs
+recontacted
+recontaminate
+recontamination
+reconvene
+reconvened
+reconvenes
+reconvening
+reconvention
+reconversion
+reconvert
+reconverted
+reconverting
+reconverts
+reconvey
+reconveyance
+recopied
+recopies
+recopy
+record
+recordable
+recordation
+recorded
+recorder
+recorders
+recording
+recordings
+recordist
+records
+recored
+recount
+recounted
+recounter
+recounting
+recounts
+recoup
+recoupable
+recouped
+recouping
+recoupment
+recoups
+recourse
+recourses
+recover
+recoverability
+recoverable
+recovered
+recoverer
+recoveries
+recovering
+recovers
+recovery
+recovery's
+recreant
+recreatable
+recreate
+recreated
+recreates
+recreating
+recreation
+recreational
+recreationist
+recreations
+recreative
+recrement
+recriminate
+recriminated
+recriminates
+recriminating
+recrimination
+recriminations
+recriminative
+recriminatory
+recriticize
+recriticizes
+recrudesce
+recrudescence
+recrudescent
+recruit
+recruit's
+recruited
+recruiter
+recruiter's
+recruiters
+recruiting
+recruitment
+recruits
+recrystallization
+recrystallization's
+recrystallizations
+recrystallize
+recrystallized
+recrystallizes
+recrystallizing
+recta
+rectal
+rectally
+rectangle
+rectangle's
+rectangles
+rectangular
+rectangularity
+rectangularly
+recti
+rectifiability
+rectifiable
+rectification
+rectifications
+rectified
+rectifier
+rectifiers
+rectify
+rectilinear
+rectilinearly
+rectillinear
+recting
+rection
+rectitude
+rectitudinous
+rective
+recto
+rectocele
+rector
+rector's
+rectorate
+rectorial
+rectors
+rectorship
+rectory
+rectos
+rectrices
+rectrix
+rectum
+rectum's
+rectums
+rectus
+recumbency
+recumbent
+recumbently
+recuperate
+recuperated
+recuperates
+recuperating
+recuperation
+recuperative
+recuperator
+recur
+recurred
+recurrence
+recurrence's
+recurrences
+recurrency
+recurrent
+recurrently
+recurring
+recurs
+recurse
+recursed
+recurses
+recursing
+recursion
+recursion's
+recursions
+recursive
+recursively
+recursiveness
+recursivity
+recurvate
+recurve
+recurved
+recusancy
+recusant
+recuse
+recyclable
+recycle
+recycled
+recycles
+recycling
+red
+redact
+redaction
+redactional
+redactions
+redactor
+redan
+redargue
+redback
+redbird
+redbirds
+redbone
+redbreast
+redbrick
+Redbridge
+redbud
+redbug
+redcap
+redcoat
+redcoats
+redcurrant
+redd
+redded
+redden
+reddened
+reddening
+redder
+reddest
+redding
+reddish
+reddishness
+redditch
+reddle
+reddy
+rede
+redear
+redeclare
+redeclared
+redeclares
+redeclaring
+redecorate
+redecorated
+redecorates
+redecorating
+redecoration
+redecorator
+rededicate
+redeem
+redeemable
+redeemed
+redeemer
+redeemers
+redeeming
+redeems
+redefine
+redefined
+redefines
+redefining
+redefinition
+redefinition's
+redefinitions
+redemption
+redemptional
+redemptioner
+redemptive
+Redemptorist
+redemptory
+redeploy
+redeployed
+redeployment
+redeploys
+redeposit
+redeposit's
+redeposited
+redepositing
+redeposition
+redepositor
+redepositor's
+redepositors
+redeposits
+redescribe
+redescription
+redesign
+redesigned
+redesigning
+redesigns
+redetermination
+redetermine
+redetermined
+redetermines
+redetermining
+redevelop
+redeveloped
+redeveloper
+redevelopers
+redeveloping
+redevelopment
+redevelops
+redeye
+redfin
+Redford
+Redford's
+Redgrave
+redhead
+redheaded
+redheader
+redheads
+Redhook
+redhook
+redhorse
+redia
+rediae
+redial
+redialed
+redialer
+redialing
+redials
+redias
+rediffusion
+redingote
+redintegrate
+redintegration
+redintegrative
+redirect
+redirected
+redirecting
+redirection
+redirections
+redirector
+redirector's
+redirectors
+redirects
+rediscount
+rediscountable
+rediscover
+rediscovered
+rediscovering
+rediscovers
+rediscovery
+redisplay
+redisplayed
+redisplaying
+redisplays
+redistribute
+redistributed
+redistributes
+redistributing
+redistribution
+redistribution's
+redistributions
+redistributive
+redistributory
+redistrict
+redistricting
+redivivus
+redleg
+redly
+Redmond
+Redmond's
+redneck
+rednecked
+rednecks
+redness
+redo
+redoing
+redolence
+redolent
+redolently
+redon
+redondo
+Redondo's
+redone
+redose
+redouble
+redoubled
+redoubles
+redoubling
+redoubt
+redoubtable
+redoubtably
+redound
+redout
+redowa
+redox
+redpoll
+redraw
+redrawing
+redrawn
+redraws
+redress
+redressed
+redresser
+redresses
+redressing
+redroot
+reds
+redshank
+redshift
+redshifted
+redshifting
+redshifts
+redshirt
+redskin
+redstart
+Redstone
+redtop
+reduce
+reduced
+reducer
+reducers
+reduces
+reducibility
+reducible
+reducibly
+reducing
+reduct
+reductant
+reductase
+reductio
+reduction
+reduction's
+reductional
+reductionalist
+reductionism
+reductionist
+reductionistic
+reductions
+reductive
+redundancies
+redundancy
+redundant
+redundantly
+reduplicate
+reduplicated
+reduplication
+reduplicative
+reduplicatively
+reduviid
+redware
+redwing
+redwood
+redwoods
+ree
+reebok
+reed
+reed's
+reedbuck
+reeder
+reedier
+reedify
+reeding
+reedling
+reeds
+reeducate
+reeducation
+reeducative
+Reedville
+reedy
+reef
+reefer
+reefing
+reefs
+reek
+reeked
+reeker
+reeking
+reeks
+reeky
+reel
+reelable
+reelect
+reelected
+reelecting
+reelection
+reelects
+reeled
+reeler
+reeling
+reels
+reembroider
+reemerged
+reemission
+reemission's
+reemissions
+reemphasization
+reemphasization's
+reemphasize
+reemphasized
+reemphasizer
+reemphasizers
+reemphasizes
+reemphasizing
+reemploy
+reemployment
+reen
+reenact
+reenactment
+reenforce
+reenforcement
+reenlist
+reenlisted
+reenlistment
+reenlists
+reenter
+reentered
+reentering
+reenters
+reentrance
+reentrant
+reentry
+reenumerate
+reenumeration
+Reese
+reest
+reestablish
+reestablished
+reestablishes
+reestablishing
+reestablishment
+reestimate
+reestimating
+reevaluate
+reevaluated
+reevaluates
+reevaluating
+reevaluation
+reeve
+reeves
+reexamination
+reexamine
+reexamined
+reexamines
+reexamining
+ref
+reface
+refaced
+refaces
+refacing
+refactoring
+refashion
+refavor
+refavor's
+refavors
+refect
+refection
+refectories
+refectory
+refelled
+refelling
+refer
+referable
+referee
+referee's
+refereed
+refereeing
+referees
+reference
+referenced
+referencer
+references
+referencing
+referenda
+referendum
+referent
+referent's
+referential
+referentiality
+referentially
+referents
+referral
+referral's
+referrals
+referred
+referrer
+referring
+refers
+refertilization
+refertilization's
+refertilizations
+refertilize
+refertilizes
+refill
+refillable
+refilled
+refilling
+refills
+refinance
+refine
+refined
+refinement
+refinement's
+refinements
+refiner
+refineries
+refinery
+refines
+refining
+refinish
+refinished
+refinisher
+refinishes
+refinishing
+refit
+reflate
+reflated
+reflates
+reflating
+reflation
+reflationary
+reflect
+reflectance
+reflected
+reflecting
+reflection
+reflection's
+reflectional
+reflections
+reflective
+reflectively
+reflectiveness
+reflectivity
+reflectometer
+reflectometer's
+reflectometers
+reflectometry
+reflector
+reflector's
+reflectorize
+reflectorized
+reflectorizes
+reflectorizing
+reflectors
+reflects
+reflet
+reflex
+reflex's
+reflexed
+reflexes
+reflexion
+reflexive
+reflexively
+reflexiveness
+reflexivity
+reflexly
+reflexology
+reflorescence
+reflorescent
+reflow
+refluence
+refluent
+reflux
+refluxed
+refluxes
+refluxing
+refocus
+refocused
+refocuses
+refocusing
+refolded
+reforest
+reforestation
+reforestization
+reforestization's
+reforestize
+reforestizes
+reforge
+reform
+reformability
+reformable
+reformat
+reformate
+reformation
+reformational
+reformative
+reformatories
+reformatory
+reformats
+reformatted
+reformatter
+reformatting
+reformed
+reformer
+reformers
+reforming
+reformism
+reformist
+reformists
+reforms
+reformulate
+reformulated
+reformulates
+reformulating
+reformulation
+refract
+refracted
+refractile
+refracting
+refraction
+refractive
+refractively
+refractiveness
+refractivities
+refractivity
+refractometer
+refractometer's
+refractometers
+refractometric
+refractometry
+refractor
+refractorily
+refractoriness
+refractory
+refrain
+refrained
+refraining
+refrainment
+refrains
+refrangibility
+refrangible
+refrangibleness
+refresh
+refreshed
+refreshen
+refresher
+refreshers
+refreshes
+refreshing
+refreshingly
+refreshment
+refreshment's
+refreshments
+refried
+refries
+refrigerant
+refrigerate
+refrigerated
+refrigeration
+refrigerator
+refrigerator's
+refrigerators
+refringent
+refry
+refrying
+reft
+refuel
+refueled
+refueling
+refuels
+refuge
+refuged
+refugee
+refugee's
+refugeeism
+refugees
+refuges
+refuging
+refugium
+refulgence
+refulgent
+refund
+refund's
+refundability
+refundable
+refunded
+refunder
+refunders
+refunding
+refunds
+refurbish
+refurbished
+refurbisher
+refurbishing
+refurbishment
+refusal
+refusals
+refuse
+refused
+refuser
+refuses
+refusing
+refutable
+refutably
+refutation
+refute
+refuted
+refuter
+refutes
+refuting
+regain
+regained
+regaining
+regains
+regal
+regale
+regaled
+regalia
+regaling
+regality
+regalize
+regalizes
+regally
+regalvanization
+regalvanization's
+regalvanizations
+regalvanize
+regalvanizes
+regard
+regardant
+regarded
+regardful
+regardfully
+regardfulness
+regarding
+regardless
+regardlessly
+regardlessness
+regards
+regatta
+regattas
+regelate
+regelation
+regency
+regenerable
+regeneracy
+regenerate
+regenerated
+regenerately
+regenerateness
+regenerates
+regenerating
+regeneration
+regenerative
+regeneratively
+regenerator
+regenerators
+Regensburg
+regent
+regent's
+regental
+regents
+reger
+reggae
+reggio
+regicidal
+regicide
+regime
+regime's
+regimen
+regiment
+regimental
+regimentally
+regimentals
+regimentation
+regimented
+regiments
+regimes
+regin
+Regina
+Reginald
+regiomontanus
+region
+region's
+regional
+regionalism
+regionalist
+regionalistic
+regionalization
+regionalization's
+regionalizations
+regionalize
+regionalized
+regionalizes
+regionalizing
+regionally
+regions
+Regis
+regisseur
+register
+registered
+registering
+registers
+registrable
+registrant
+registrants
+registrar
+registrars
+registration
+registration's
+registrations
+registries
+registry
+regius
+reglet
+regna
+regnal
+regnant
+regnum
+rego
+regolith
+regorge
+regorged
+regorging
+regosol
+regrant
+regrate
+regreet
+regreets
+regress
+regressed
+regresses
+regressing
+regression
+regression's
+regressions
+regressive
+regressively
+regressiveness
+regressor
+regressors
+regret
+regretful
+regretfully
+regretfulness
+regretless
+regrets
+regrettable
+regrettably
+regretted
+regretter
+regretting
+regrid
+regridded
+regridding
+regrids
+reground
+regroup
+regrouped
+regrouping
+regrow
+regulable
+regular
+regularities
+regularity
+regularization
+regularization's
+regularizations
+regularize
+regularized
+regularizer
+regularizers
+regularizes
+regularizing
+regularly
+regulars
+regulate
+regulated
+regulates
+regulating
+regulation
+regulations
+regulative
+regulator
+regulator's
+regulators
+regulatory
+Regulus
+regurgitate
+regurgitated
+regurgitates
+regurgitating
+regurgitation
+regurgitative
+rehabilitant
+rehabilitate
+rehabilitated
+rehabilitates
+rehabilitating
+rehabilitation
+rehabilitationist
+rehabilitations
+rehabilitative
+rehabilitator
+reharmonization
+reharmonize
+reharmonizes
+rehash
+rehashed
+rehashes
+rehashing
+rehear
+rehearing
+rehearsal
+rehearsal's
+rehearsals
+rehearse
+rehearsed
+rehearser
+rehearses
+rehearsing
+Rehoboam
+rehonor
+rehonor's
+rehonors
+rehouse
+rehoused
+rehouses
+rehousing
+rehumanization
+rehumanize
+rehumanizes
+rehybridize
+rehybridizes
+rehydratable
+rehydrate
+rehydration
+Reich
+Reichenberg
+reichsmark
+Reichsrat
+Reichstag
+Reid
+Reid's
+reification
+reified
+reify
+reifying
+reigate
+reign
+reigned
+reigning
+reigns
+Reilly
+reimbursable
+reimburse
+reimbursed
+reimbursement
+reimbursement's
+reimbursements
+reimburses
+reimbursing
+reimpression
+reims
+rein
+reincarnate
+reincarnated
+reincarnation
+reincarnationist
+reincorporating
+reincorporation
+reindeer
+reined
+Reiner
+reinfection
+reinforce
+reinforceable
+reinforced
+reinforcement
+reinforcement's
+reinforcements
+reinforcer
+reinforces
+reinforcing
+reinhard
+Reinhard
+reinhardt
+Reinhardt
+Reinhold
+reining
+reinitialization
+reinitialize
+reinitialized
+reinitializes
+reinitializing
+reinless
+reins
+reinsert
+reinserted
+reinserting
+reinsertion
+reinsertions
+reinserts
+reinsman
+reinstall
+reinstalled
+reinstaller
+reinstalling
+reinstalls
+reinstate
+reinstated
+reinstatement
+reinstates
+reinstating
+reinstitution
+reinsurance
+reinsure
+reinsurer
+reintegrate
+reintegrated
+reintegration
+reintegrative
+reinterpret
+reinterpretation
+reinterpretations
+reinterpreted
+reinterpreting
+reinterprets
+reinterview
+reinterviewed
+reintroduce
+reintroduced
+reintroduces
+reintroducing
+reintroduction
+reinvent
+reinvented
+reinventing
+reinvention
+reinvents
+reinvest
+reinvested
+reinvestigation
+reinvestment
+reinvigorate
+reinvigoration
+reinvigorator
+reinvoke
+reinvoked
+reinvokes
+reinvoking
+reissue
+reissued
+reissuer
+reissuer's
+reissuers
+reissues
+reissuing
+reitemize
+reitemizes
+reiterate
+reiterated
+reiterates
+reiterating
+reiteration
+reiterations
+reiterative
+reiteratively
+reiterativeness
+reiterator
+reith
+reive
+reiver
+reiving
+reject
+rejected
+rejectee
+rejecter
+rejecting
+rejectingly
+rejection
+rejection's
+rejections
+rejective
+rejector
+rejector's
+rejectors
+rejects
+rejig
+rejigger
+rejoice
+rejoiced
+rejoicer
+rejoices
+rejoicing
+rejoicingly
+rejoin
+rejoinder
+rejoined
+rejoining
+rejoins
+rejuvenate
+rejuvenated
+rejuvenates
+rejuvenating
+rejuvenation
+rejuvenator
+rejuvenesce
+rejuvenescence
+rejuvenescent
+rekindle
+rekindled
+rekindler
+rekindles
+rekindling
+reknit
+relabel
+relabeled
+relabeler
+relabelers
+relabeling
+relabels
+relapse
+relapsed
+relapser
+relapses
+relapsing
+relatable
+relate
+related
+relatedly
+relatedness
+relater
+relates
+relating
+relation
+relational
+relationally
+relations
+relationship
+relationship's
+relationships
+relative
+relatively
+relativeness
+relatives
+relativism
+relativist
+relativistic
+relativistically
+relativity
+relativity's
+relativization
+relativization's
+relativizations
+relativize
+relativized
+relativizes
+relativizing
+relator
+relatum
+relax
+relaxant
+relaxation
+relaxation's
+relaxations
+relaxed
+relaxedly
+relaxedness
+relaxer
+relaxes
+relaxin
+relaxing
+relay
+relayed
+relaying
+relays
+relearn
+relearns
+releasability
+releasable
+releasably
+release
+released
+releaser
+releases
+releasing
+relection
+relegate
+relegated
+relegates
+relegating
+relegation
+relent
+relented
+relenting
+relentless
+relentlessly
+relentlessness
+relents
+relevance
+relevances
+relevancy
+relevant
+relevantly
+reliabilities
+reliability
+reliable
+reliableness
+reliably
+reliance
+reliant
+reliantly
+relic
+relic's
+relicense
+relicensed
+relicenser
+relicenses
+relicensing
+relics
+relict
+reliction
+relied
+relief
+reliefs
+relier
+relies
+relievable
+relieve
+relieved
+relievedly
+reliever
+relievers
+relieves
+relieving
+relievo
+religion
+religion's
+religionism
+religionist
+religionists
+religionize
+religionizes
+religions
+religiose
+religiosity
+religious
+religiously
+religiousness
+reline
+relinking
+relinquish
+relinquished
+relinquishes
+relinquishing
+relinquishment
+reliquary
+relique
+reliquiae
+relish
+relishable
+relished
+relishes
+relishing
+relive
+relives
+reliving
+reload
+reloaded
+reloader
+reloading
+reloads
+relocatable
+relocate
+relocated
+relocatee
+relocates
+relocating
+relocation
+relocations
+relucent
+reluct
+reluctance
+reluctances
+reluctancy
+reluctant
+reluctantly
+reluctate
+reluctated
+reluctation
+reluctivity
+relume
+relumed
+relumine
+reluming
+rely
+relying
+remade
+remagnetization
+remagnetization's
+remagnetizations
+remagnetize
+remagnetizes
+remain
+remainder
+remainder's
+remaindered
+remaindering
+remainderman
+remainders
+remained
+remaines
+remaining
+remains
+remake
+remaking
+reman
+remand
+remanded
+remanding
+remanence
+remanent
+remanufacture
+remanufacturer
+remap
+remark
+remarkable
+remarkableness
+remarkably
+remarked
+remarking
+remarks
+remarque
+remarriage
+remarriages
+remarried
+remarry
+remarrying
+rematch
+rematerialize
+rematerializes
+Remblai
+Rembrandt
+Reme
+remediable
+remediableness
+remediably
+remedial
+remedially
+remediate
+remediation
+remedied
+remedies
+remediless
+remedilessly
+remedy
+remedying
+remember
+rememberability
+rememberable
+remembered
+rememberer
+remembering
+remembers
+remembrance
+remembrance's
+remembrancer
+remembrances
+rememorize
+rememorizes
+Remex
+remigial
+remilitarization
+remilitarize
+remind
+reminded
+reminder
+reminders
+remindful
+reminding
+reminds
+remineralization
+remineralization's
+remineralizations
+remineralize
+remineralizes
+Remington
+reminisce
+reminisced
+reminiscence
+reminiscence's
+reminiscences
+reminiscent
+reminiscential
+reminiscently
+reminisces
+reminiscing
+remint
+remise
+remised
+remising
+remiss
+remissible
+remissibly
+remission
+remissions
+remissly
+remissness
+remit
+remitment
+remits
+remittable
+remittal
+remittance
+remittances
+remitted
+remittee
+remittent
+remittently
+remitter
+remitting
+remix
+remixed
+remixes
+remixing
+remnant
+remnant's
+remnants
+remobilization
+remobilization's
+remobilizations
+remobilize
+remobilizes
+remodel
+remodeled
+remodeling
+remodels
+remodulate
+remodulated
+remodulates
+remodulating
+remodulation
+remodulator
+remodulator's
+remodulators
+remolding
+remonetization
+remonetize
+remonetized
+remonetizes
+remonetizing
+remonstrance
+remonstrant
+remonstrantly
+remonstrate
+remonstrated
+remonstrates
+remonstrating
+remonstration
+remonstrative
+remonstratively
+remonstrator
+remontant
+remontoir
+remora
+remorse
+remorseful
+remorsefully
+remorsefulness
+remorseless
+remorselessly
+remorselessness
+remote
+remotely
+remoteness
+remotest
+remotion
+remould
+remoulded
+remoulding
+remoulds
+remount
+remounting
+removability
+removable
+removableness
+removably
+removal
+removal's
+removalist
+removals
+remove
+removed
+remover
+removes
+removing
+remscheid
+remunerate
+remunerated
+remunerates
+remunerating
+remuneration
+remunerations
+remunerative
+remuneratively
+remunerativeness
+remunerator
+remuneratory
+Remus
+remus
+Remy
+Rena
+Rena's
+renaissance
+renal
+rename
+renamed
+renames
+renaming
+Renardy
+renascence
+renascent
+renaturation
+renature
+renatured
+renatures
+renaturing
+Renault
+Renault's
+Renaults
+rencounter
+rend
+render
+renderable
+rendered
+renderer
+rendering
+renderings
+renders
+rendezvous
+rendezvoused
+rendezvouses
+rendezvousing
+rending
+rendition
+rendition's
+renditions
+rends
+rendzina
+Rene
+Rene's
+Renee
+Renee's
+renegade
+renegades
+renegado
+renege
+reneged
+reneger
+reneges
+reneging
+renegotiable
+renegotiate
+renegotiated
+renegotiates
+renegotiation
+renew
+renewability
+renewable
+renewably
+renewal
+renewals
+renewed
+renewer
+renewing
+renews
+Renfrew
+reni
+reniform
+renig
+renigged
+renigging
+renin
+renitency
+renitent
+rennes
+rennet
+rennin
+reno
+renographic
+renography
+Renoir
+renominate
+renominated
+renominates
+renominating
+renomination
+renormalization
+renormalize
+renormalized
+renormalizes
+renormalizing
+renounce
+renounced
+renouncement
+renouncer
+renounces
+renouncing
+renovate
+renovated
+renovates
+renovation
+renovator
+renown
+renowned
+Rensselaer
+Rensselaer's
+Rensselaerite
+rent
+rentability
+rentable
+rental
+rental's
+rentals
+rente
+rented
+renter
+renter's
+renters
+rentier
+renting
+rents
+renumber
+renumbered
+renumbering
+renumbers
+renumeration
+renunciate
+renunciation
+renunciations
+renunciative
+renunciatory
+Renville
+renvoi
+reobjectivization
+reobjectivization's
+reobjectivizations
+reobjectivize
+reobjectivizes
+reoccupy
+reoccur
+reoccurrence
+reopen
+reopened
+reopening
+reopens
+reorder
+reordered
+reordering
+reorders
+reorganization
+reorganization's
+reorganizational
+reorganizationist
+reorganizationist's
+reorganizationists
+reorganizations
+reorganize
+reorganized
+reorganizer
+reorganizers
+reorganizes
+reorganizing
+reorient
+reorientate
+reorientated
+reorientates
+reorientating
+reorientation
+reoriented
+reoxidize
+reoxidizes
+reoxygenize
+reoxygenizes
+rep
+repack
+repackage
+repackaged
+repackager
+repackages
+repackaging
+repacked
+repacker
+repacking
+repacks
+repaganization
+repaganization's
+repaganizations
+repaganize
+repaganizer
+repaganizers
+repaganizes
+repaid
+repaint
+repainted
+repainter
+repainters
+repainting
+repaints
+repair
+repairability
+repairable
+repaired
+repairer
+repairers
+repairing
+repairman
+repairmen
+repairs
+repand
+reparable
+reparation
+reparation's
+reparations
+reparative
+repartee
+repartition
+repartitioned
+repartitioner
+repartitioners
+repartitioning
+repartitions
+repass
+repassage
+repassivation
+repast
+repast's
+repasts
+repatriate
+repatriated
+repatriates
+repatriating
+repatriation
+repatriations
+repatronize
+repatronizes
+repaving
+repay
+repayable
+repaying
+repayment
+repayments
+repays
+repeal
+repealable
+repealed
+repealer
+repealing
+repeals
+repeat
+repeatability
+repeatable
+repeated
+repeatedly
+repeater
+repeaters
+repeating
+repeats
+repechage
+repel
+repellant
+repelled
+repellency
+repellent
+repellently
+repeller
+repelling
+repels
+repent
+repentance
+repentant
+repentantly
+repented
+repenter
+repenting
+repents
+repercussion
+repercussion's
+repercussions
+repercussive
+repersonalize
+repertoire
+repertory
+repetend
+repetition
+repetition's
+repetitional
+repetitions
+repetitious
+repetitiously
+repetitiousness
+repetitive
+repetitively
+repetitiveness
+rephosphorization
+rephosphorization's
+rephosphorizations
+rephosphorize
+rephosphorizes
+rephrase
+rephrased
+rephrases
+rephrasing
+repine
+repined
+repiner
+repining
+replace
+replaceable
+replaced
+replacement
+replacement's
+replacements
+replacer
+replaces
+replacing
+replant
+replanted
+replay
+replayed
+replaying
+replays
+repleader
+replenish
+replenished
+replenisher
+replenishes
+replenishing
+replenishment
+replenishments
+replete
+repleteness
+repletion
+repleviable
+replevied
+replevies
+replevin
+replevy
+replica
+replica's
+replicable
+replicas
+replicate
+replicated
+replicates
+replicating
+replication
+replications
+replicative
+replicator
+replicators
+replied
+replier
+replies
+reply
+replying
+repoint
+repolymerization
+repolymerization's
+repolymerizations
+repolymerize
+repolymerizes
+repone
+repopularize
+report
+reportable
+reportage
+reported
+reportedly
+reporter
+reporters
+reporting
+reportorial
+reportorially
+reports
+reposal
+repose
+reposed
+reposeful
+reposefully
+reposefulness
+reposes
+reposing
+reposit
+reposited
+repositing
+reposition
+repositioned
+repositioning
+repositions
+repositories
+repository
+repository's
+repossess
+repossession
+repost
+reposted
+reposter
+reposting
+repostings
+reposts
+repot
+repower
+reprehend
+reprehensibility
+reprehensible
+reprehensibleness
+reprehensibly
+reprehension
+reprehensive
+represent
+representable
+representably
+representation
+representation's
+representational
+representationalism
+representationalist
+representationally
+representations
+representative
+representatively
+representativeness
+representatives
+representativity
+represented
+representer
+representing
+represents
+repress
+repressed
+represses
+repressibility
+repressible
+repressing
+repression
+repression's
+repressionist
+repressions
+repressive
+repressively
+repressiveness
+repressor
+reprieval
+reprieve
+reprieved
+reprieves
+reprieving
+reprimand
+reprimanded
+reprint
+reprinted
+reprinter
+reprinting
+reprints
+reprisal
+reprisal's
+reprisals
+reprise
+reprised
+reprising
+repristinate
+repristination
+reprivatization
+reprivatization's
+reprivatizations
+reprivatize
+reprivatizes
+repro
+reproach
+reproachable
+reproached
+reproacher
+reproaches
+reproachful
+reproachfully
+reproachfulness
+reproaching
+reproachingly
+reprobance
+reprobate
+reprobates
+reprobating
+reprobation
+reprobative
+reprobatory
+reprocess
+reprocessable
+reprocessed
+reprocesses
+reprocessor
+reproduce
+reproduced
+reproducer
+reproducers
+reproduces
+reproducibilities
+reproducibility
+reproducible
+reproducibly
+reproducing
+reproduction
+reproduction's
+reproductions
+reproductive
+reproductively
+reproductivity
+reprogram
+reprogrammed
+reprogrammer
+reprogrammer's
+reprogrammers
+reprogramming
+reprograms
+reprography
+reproof
+repros
+reprove
+reproved
+reprover
+reproving
+reprovingly
+reps
+reptant
+reptile
+reptile's
+reptiles
+reptilian
+republic
+republic's
+republican
+republican's
+republicanism
+republicanization
+republicanization's
+republicanizations
+republicanize
+republicanized
+republicanizer
+republicanizers
+republicanizes
+republicanizing
+republicans
+republication
+republics
+republish
+republished
+republisher
+republisher's
+republishers
+republishes
+republishing
+repudiate
+repudiated
+repudiates
+repudiating
+repudiation
+repudiationist
+repudiations
+repudiator
+repugn
+repugnance
+repugnancy
+repugnant
+repugnantly
+repulse
+repulsed
+repulses
+repulsing
+repulsion
+repulsions
+repulsive
+repulsively
+repulsiveness
+repulverize
+repulverizes
+reputability
+reputable
+reputably
+reputation
+reputation's
+reputations
+repute
+reputed
+reputedly
+reputes
+reputing
+req
+request
+requested
+requester
+requesters
+requesting
+requestioned
+requestioner
+requestor
+requests
+requiem
+requiem's
+requiems
+requiescat
+requin
+require
+required
+requirement
+requirement's
+requirements
+requirer
+requires
+requiring
+requisite
+requisiteness
+requisites
+requisition
+requisitioned
+requisitioner
+requisitioning
+requisitions
+requital
+requite
+requited
+requiter
+requiting
+reradiate
+reradiation
+reran
+reread
+rereading
+rereads
+reredos
+reremouse
+rereward
+reroute
+rerouted
+rerouter
+rerouters
+reroutes
+reroutings
+reroyalize
+reroyalizes
+rerun
+rerunning
+reruns
+res
+resail
+resalable
+resale
+resample
+resampling
+resaturate
+resaturated
+resaturates
+resaturating
+resaturation
+rescale
+rescaled
+rescaling
+rescan
+rescanned
+rescanning
+rescans
+reschedule
+rescheduled
+rescheduler
+reschedules
+rescheduling
+rescind
+rescinded
+rescinder
+rescindment
+rescissible
+rescission
+rescissory
+rescript
+rescue
+rescued
+rescuer
+rescuers
+rescues
+rescuing
+resealed
+research
+researchable
+researched
+researcher
+researcher's
+researchers
+researches
+researching
+researchist
+reseat
+reseau
+resect
+resectability
+resectable
+resection
+reseed
+reselect
+reselected
+reselecting
+reselection
+reselects
+resell
+reseller
+resellers
+reselling
+resells
+resemblance
+resemblance's
+resemblances
+resemblant
+resemble
+resembled
+resembles
+resembling
+resend
+resending
+resends
+resensitization
+resensitization's
+resensitizations
+resensitize
+resensitizes
+resent
+resented
+resentful
+resentfully
+resentfulness
+resenting
+resentment
+resents
+resepulcher
+resepulchers
+resequence
+resequenced
+reserpine
+reservation
+reservation's
+reservations
+reserve
+reserved
+reservedly
+reservedness
+reserver
+reserves
+reserving
+reservist
+reservists
+reservoir
+reservoir's
+reservoirs
+reset
+reseted
+reseter
+reseting
+resets
+resettable
+resetting
+resettings
+resettle
+resettled
+resettlement
+resettles
+resettling
+reshape
+reshaped
+reshaper
+reshapes
+reshaping
+reship
+reshipment
+reshipper
+reshuffle
+reside
+resided
+residence
+residence's
+residences
+residency
+resident
+resident's
+residential
+residentially
+residentiary
+residents
+resider
+resides
+residing
+residua
+residual
+residually
+residuals
+residuary
+residue
+residue's
+residues
+residuum
+resifted
+resign
+resignation
+resignation's
+resignations
+resigned
+resignedly
+resignedness
+resigner
+resigning
+resigns
+resile
+resiled
+resilience
+resiliency
+resilient
+resiliently
+resiling
+resin
+resin's
+resinate
+resined
+resiniferous
+resinify
+resining
+resinize
+resinizes
+resinlike
+resinoid
+resinous
+resins
+resiny
+resipiscence
+resist
+resistable
+resistance
+resistances
+resistant
+resistantly
+resisted
+resistencia
+resister
+resistibility
+resistible
+resistibly
+resisting
+resistive
+resistively
+resistiveness
+resistivity
+resistless
+resistlessly
+resistlessness
+resistor
+resistor's
+resistors
+resists
+resit
+resitting
+resize
+resized
+resizes
+resizing
+resnais
+resnatron
+Resnik
+resojet
+resold
+resole
+resolemnize
+resolemnizes
+resoluble
+resolute
+resolutely
+resoluteness
+resolution
+resolutions
+resolutive
+resolvable
+resolve
+resolved
+resolvent
+resolver
+resolvers
+resolves
+resolving
+resonance
+resonances
+resonant
+resonantly
+resonate
+resonated
+resonates
+resonating
+resonator
+resonators
+resorb
+resorcinol
+resorption
+resorptive
+resort
+resorted
+resorter
+resorting
+resorts
+resound
+resounding
+resoundingly
+resounds
+resource
+resource's
+resourced
+resourceful
+resourcefully
+resourcefulness
+resources
+resourcing
+respecified
+respecifies
+respecify
+respect
+respectability
+respectable
+respectableness
+respectably
+respected
+respecter
+respectful
+respectfully
+respectfulness
+respecting
+respective
+respectively
+respectiveness
+respects
+respell
+Respighi
+respirable
+respiration
+respirational
+respirations
+respirator
+respirators
+respiratory
+respire
+respired
+respires
+respiring
+respirometer
+respirometer's
+respirometers
+respirometric
+respirometry
+respite
+respited
+respiting
+resplendence
+resplendency
+resplendent
+resplendently
+respond
+responded
+respondent
+respondent's
+respondents
+responder
+responders
+responding
+responds
+response
+responser
+responses
+responsibilities
+responsibility
+responsible
+responsibleness
+responsibly
+responsions
+responsive
+responsively
+responsiveness
+responsory
+responsum
+resrict
+ressentiment
+resses
+rest
+restage
+restandardization
+restandardization's
+restandardizations
+restandardize
+restandardizes
+restart
+restartable
+restarted
+restarter
+restarting
+restarts
+restate
+restated
+restatement
+restates
+restating
+restaurant
+restaurant's
+restauranteur
+restaurants
+restaurateur
+rested
+rester
+resterilize
+resterilizes
+restful
+restfully
+restfulness
+restiform
+restigmatize
+restigmatizes
+resting
+restitute
+restitution
+restive
+restively
+restiveness
+restless
+restlessly
+restlessness
+restock
+restorability
+restorable
+restoral
+restoration
+restoration's
+restorationism
+restorations
+restorative
+restoratively
+restorativeness
+restore
+restored
+restorer
+restorers
+restores
+restoring
+restrain
+restrainable
+restrained
+restrainedly
+restrainer
+restrainers
+restraining
+restrains
+restraint
+restraint's
+restraints
+restransmit
+restrict
+restricted
+restrictedly
+restricting
+restriction
+restriction's
+restrictionism
+restrictionist
+restrictions
+restrictive
+restrictively
+restrictiveness
+restricts
+restrike
+restroom
+restroom's
+restrooms
+restructurability
+restructure
+restructured
+restructures
+restructuring
+rests
+restudy
+resubmission
+resubmit
+resubmits
+resubmitted
+resubmitting
+result
+resultant
+resultantly
+resultants
+resulted
+resultful
+resultfulness
+resulting
+resultless
+results
+resumable
+resume
+resumed
+resumes
+resuming
+resumption
+resumption's
+resumptions
+resupinate
+resupination
+resupine
+resupplied
+resupplier
+resupplier's
+resuppliers
+resupplies
+resupply
+resupply's
+resupplying
+resurface
+resurfaced
+resurfacer
+resurfacer's
+resurfacers
+resurfaces
+resurfacing
+resurgam
+resurge
+resurged
+resurgence
+resurgent
+resurges
+resurging
+resurrect
+resurrected
+resurrecting
+resurrection
+resurrection's
+resurrectional
+resurrectionism
+resurrectionist
+resurrectionize
+resurrectionizes
+resurrections
+resurrects
+resuscitate
+resuscitated
+resuscitates
+resuscitating
+resuscitation
+resuscitative
+resuscitator
+resuscitators
+resuspended
+resuspension
+resvering
+resymbolization
+resymbolization's
+resymbolizations
+resymbolize
+resymbolizes
+resynchronization
+resynchronizations
+resynchronize
+resynchronized
+resynchronizes
+resynchronizing
+resynthesize
+resynthesizes
+ret
+retable
+retail
+retailed
+retailer
+retailers
+retailing
+retails
+retain
+retained
+retainer
+retainers
+retaining
+retainment
+retains
+retake
+retaliate
+retaliated
+retaliates
+retaliating
+retaliation
+retaliative
+retaliatory
+retard
+retardant
+retardate
+retardation
+retarded
+retarder
+retarding
+retch
+retching
+rete
+retell
+retelling
+retene
+retension
+retensioned
+retention
+retentionist
+retentions
+retentive
+retentively
+retentiveness
+retentivity
+retenue
+retest
+rethink
+rethinker
+rethinking
+rethinks
+rethought
+rethreading
+retia
+retiarius
+retiary
+reticence
+reticency
+reticent
+reticently
+reticle
+reticle's
+reticles
+reticular
+reticulate
+reticulated
+reticulately
+reticulates
+reticulating
+reticulation
+reticule
+reticulocyte
+reticulocytic
+reticulose
+reticulum
+retied
+retiform
+retina
+retina's
+retinacular
+retinaculum
+retinae
+retinal
+retinas
+retinene
+retinite
+retinitis
+retinize
+retinizes
+retinol
+retinopathy
+retinoscopy
+retinospora
+retinue
+retinues
+retinula
+retinular
+retirant
+retire
+retired
+retiredly
+retiredness
+retiree
+retirement
+retirement's
+retirements
+retires
+retiring
+retiringly
+retiringness
+retitled
+retold
+retool
+retorsion
+retort
+retorted
+retorting
+retortion
+retorts
+retot
+retouch
+retoucher
+retouching
+retrace
+retraced
+retraces
+retracing
+retract
+retractable
+retracted
+retractile
+retractility
+retracting
+retraction
+retractions
+retractor
+retractor's
+retractors
+retracts
+retrain
+retrainable
+retrained
+retrainee
+retraining
+retrains
+retral
+retrally
+retranquilize
+retranquilizes
+retranslated
+retransmission
+retransmission's
+retransmissions
+retransmit
+retransmits
+retransmitted
+retransmitting
+retread
+retreaded
+retreading
+retreat
+retreatant
+retreated
+retreater
+retreating
+retreats
+retrench
+retrenching
+retrenchment
+retrial
+retributed
+retribution
+retributive
+retributively
+retributory
+retried
+retrier
+retriers
+retries
+retrievability
+retrievable
+retrieval
+retrieval's
+retrievals
+retrieve
+retrieved
+retriever
+retrievers
+retrieves
+retrieving
+retro
+retroact
+retroaction
+retroactive
+retroactively
+retroactivity
+retrocede
+retrocession
+retrochoir
+retrodiction
+retrofire
+retrofit
+retrofitted
+retrofitting
+retroflection
+retroflex
+retroflexed
+retroflexion
+retrogradation
+retrogradations
+retrograde
+retrogradely
+retrograding
+retrogress
+retrogression
+retrogressive
+retrogressively
+retroject
+retrolental
+retrolingual
+retropack
+retroperitoneal
+retroperitoneally
+retroreflection
+retroreflective
+retroreflector
+retrorocket
+retrorse
+retrorsely
+retroserrate
+retrospect
+retrospection
+retrospective
+retrospectively
+retroversion
+retrovision
+retry
+retrying
+rets
+retsina
+retted
+retting
+return
+returnable
+returned
+returnee
+returnee's
+returnees
+returner
+returners
+returning
+returns
+retuse
+retype
+retyped
+retypes
+retyping
+Reub
+Reub's
+Reuben
+reuchlin
+reunification
+reunify
+reunion
+Reunion
+reunion's
+reunionist
+reunionistic
+reunions
+reunite
+reunited
+reuniting
+reupholstering
+reus
+reusable
+reuse
+reused
+reuses
+reusing
+reuter
+Reuters
+Reuther
+reutilization
+reutilize
+reutilizes
+reutlingen
+Rev
+rev
+reval
+revalidate
+revalidated
+revalidates
+revalidating
+revalidation
+revalorization
+revalorization's
+revalorizations
+revalorize
+revalorized
+revalorizes
+revalorizing
+revaluate
+revaluation
+revalue
+revalued
+revalues
+revamp
+revamped
+revamping
+revamps
+revanche
+revanchism
+revanchist
+revaporization
+revaporization's
+revaporizations
+revaporize
+revaporizes
+reveal
+revealable
+revealed
+revealer
+revealing
+revealment
+reveals
+revegetate
+revegetation
+revehent
+reveille
+reveilles
+revel
+revelation
+revelation's
+revelationist
+revelationize
+revelationizes
+revelations
+revelator
+revelatory
+reveled
+reveler
+revelers
+reveling
+revelings
+revelry
+revels
+revenant
+revenge
+revenge's
+revenged
+revengeful
+revengefully
+revengefulness
+revenger
+revenges
+revenging
+revenue
+revenuer
+revenuers
+revenues
+rever
+reverb
+reverberant
+reverberantly
+reverberate
+reverberated
+reverberation
+reverberations
+reverberative
+reverberator
+reverberatory
+revere
+revered
+reverence
+reverencer
+reverend
+reverend's
+reverends
+reverent
+reverential
+reverentially
+reverently
+reveres
+reverie
+reveries
+reverified
+reverifies
+reverify
+reverifying
+revering
+revers
+reversal
+reversal's
+reversals
+reverse
+reversed
+reversely
+reverser
+reverses
+reversi
+reversibility
+reversible
+reversibly
+reversing
+reversion
+reversional
+reversionary
+reversioner
+reversions
+reverso
+revert
+reverted
+reverter
+revertible
+reverting
+revertive
+reverts
+revery
+revest
+revet
+revetment
+revetments
+revetted
+revetting
+revictual
+review
+reviewed
+reviewer
+reviewers
+reviewing
+reviews
+revile
+reviled
+revilement
+reviler
+reviling
+revisable
+revisal
+revise
+revised
+reviser
+revises
+revising
+revision
+revision's
+revisionary
+revisionism
+revisionist
+revisionists
+revisions
+revisit
+revisited
+revisiting
+revisits
+revisor
+revisory
+revisualization
+revisualization's
+revisualizations
+revisualize
+revisualizes
+revitalization
+revitalization's
+revitalizations
+revitalize
+revitalized
+revitalizer
+revitalizers
+revitalizes
+revitalizing
+revivable
+revival
+revival's
+revivalism
+revivalist
+revivalistic
+revivalists
+revivalize
+revivalizes
+revivals
+revive
+revived
+reviver
+revives
+revivification
+revivified
+revivify
+reviving
+reviviscence
+reviviscent
+revocable
+revocation
+revocations
+revoice
+revokable
+revoke
+revoked
+revoker
+revokes
+revoking
+revolatilize
+revolatilizes
+revolt
+revolted
+revolter
+revolting
+revoltingly
+revolts
+revoluable
+revolute
+revolution
+revolution's
+revolutionaries
+revolutionarily
+revolutionariness
+revolutionary
+revolutionary's
+revolutionibus
+revolutionist
+revolutionists
+revolutionize
+revolutionized
+revolutionizement
+revolutionizement's
+revolutionizements
+revolutionizer
+revolutionizers
+revolutionizes
+revolutionizing
+revolutions
+revolvable
+revolve
+revolved
+revolver
+revolvers
+revolves
+revolving
+revs
+revue
+revues
+revulsed
+revulsion
+revulsive
+revved
+revving
+rew
+rewake
+rewaken
+reward
+rewardable
+rewarded
+rewarder
+rewarding
+rewardingly
+rewards
+rewind
+rewinded
+rewinder
+rewinding
+rewinds
+rewire
+rewired
+rewires
+rewiring
+reword
+reworded
+rewording
+rewording's
+rewordings
+rewords
+rework
+reworked
+reworking
+reworks
+rewound
+rewrite
+rewriter
+rewrites
+rewriting
+rewritings
+rewritten
+rewrote
+Rex
+rexine
+rexroth
+rey
+Reykjavik
+Reykjavik's
+reynard
+reynaud
+Reynolds
+reynosa
+rezone
+RFI
+rhabdom
+rhabdomancy
+rhabdome
+rhabdomere
+rhabdomyoma
+rhachis
+rhadamanthine
+Rhadamanthus
+rhaetia
+Rhaetian
+Rhaetic
+rhamnaceous
+rhamnose
+rhamnus
+rhaphe
+rhapsodic
+rhapsodical
+rhapsodically
+rhapsodist
+rhapsodize
+rhapsodized
+rhapsodizes
+rhapsodizing
+rhapsody
+rhatany
+Rhea
+rhebok
+rhee
+Rheims
+rheims
+rhein
+Rheinholdt
+rheinholdt
+Rheinland
+Rhemish
+Rhenish
+rhenium
+rheobase
+rheological
+rheologically
+rheologist
+rheology
+rheometer
+rheometer's
+rheometers
+rheophile
+rheophilic
+rheostat
+rheostatic
+rheostats
+rheotaxis
+rheotropism
+rhesus
+rhet
+rhetic
+rhetor
+rhetoric
+rhetorical
+rhetorically
+rhetoricalness
+rhetorician
+rhetoricians
+rheum
+rheumatic
+rheumatically
+rheumatics
+rheumatism
+rheumatiz
+rheumatoid
+rheumatologist
+rheumatology
+rheumy
+rheydt
+rhigolene
+rhinal
+Rhine
+Rhineland
+rhinelander
+Rhinelander
+rhinencephalic
+rhinencephalon
+rhinestone
+rhinestones
+rhinitis
+rhino
+rhinoceros
+rhinocerotic
+rhinolaryngology
+rhinology
+rhinopharyngitis
+rhinoplasty
+rhinos
+rhinoscopy
+rhinosporidium
+rhinotracheitis
+rhinovirus
+rhizanthous
+rhizobium
+rhizocarpic
+rhizocarpous
+rhizocephalan
+rhizocephalid
+rhizoctonia
+rhizogenesis
+rhizogenetic
+rhizogenic
+rhizoid
+rhizoidal
+rhizomatous
+rhizome
+rhizomic
+rhizomorph
+rhizomorphous
+rhizoplane
+rhizopod
+rhizopodal
+rhizopodous
+rhizopus
+rhizosphere
+rhizotomy
+rho
+Rhoda
+Rhoda's
+rhodamine
+Rhode
+Rhodes
+Rhodesia
+Rhodesian
+Rhodesoid
+Rhodian
+rhodic
+rhodinal
+rhodium
+rhodochrosite
+rhododendron
+rhododendrons
+rhodolite
+rhodomontade
+rhodonite
+Rhodope
+rhodoplast
+rhodopsin
+rhodora
+rhodos
+rhomb
+rhombencephalon
+rhombi
+rhombic
+rhombohedral
+rhombohedron
+rhomboid
+rhomboidal
+rhomboideus
+rhombs
+rhombus
+rhombuses
+rhonchi
+rhonchus
+Rhonda
+rhotacism
+rhotic
+rhubarb
+rhumb
+rhumba
+rhumbatron
+rhumbs
+rhus
+rhuses
+rhyme
+rhymed
+rhymer
+rhymes
+rhymester
+rhyming
+rhynchocephalian
+rhyolite
+rhyolitic
+rhythm
+rhythm's
+rhythmic
+rhythmical
+rhythmically
+rhythmicity
+rhythmicize
+rhythmicizes
+rhythmics
+rhythmist
+rhythmizable
+rhythmizable's
+rhythmizables
+rhythmization
+rhythmization's
+rhythmizations
+rhythmize
+rhythmizes
+rhythms
+rhytidome
+rhyton
+ri
+RI
+ria
+rial
+rialto
+riant
+riantly
+riata
+rib
+rib's
+ribald
+ribaldry
+riband
+ribas
+ribband
+ribbed
+ribbentrop
+ribber
+ribbing
+ribble
+ribbon
+ribbon's
+ribbonfish
+ribbonlike
+ribbons
+ribbonwood
+ribby
+ribera
+ribgrass
+riblet
+riboflavin
+ribonuclease
+ribonucleic
+ribonucleoprotein
+ribonucleoside
+ribonucleotide
+ribose
+ribosomal
+ribosome
+ribosomes
+ribs
+ribwort
+ribworts
+Rica
+Rican
+Ricanism
+Ricans
+ricardo
+Ricci
+ricci
+Ricciarelli
+riccio
+rice
+ricebird
+ricer
+ricercar
+ricercare
+rices
+rich
+Richard
+Richard's
+Richards
+Richardson
+richelieu
+richen
+richened
+richening
+richer
+richert
+riches
+richest
+richey
+Richey
+Richfield
+richland
+Richland
+richly
+richment
+Richmond
+richness
+Richter
+richthofen
+rici
+ricin
+ricinoleic
+ricinus
+Rick
+Rick's
+rickards
+Rickenbaugh
+rickenbaugh
+rickets
+rickettsia
+rickettsial
+rickety
+rickey
+rickeys
+rickrack
+ricksha
+rickshaw
+rickshaw's
+rickshaws
+Rico
+ricochet
+ricocheted
+ricocheting
+ricochets
+ricotta
+rictal
+rictus
+rid
+ridable
+riddance
+ridded
+ridden
+ridder
+ridding
+riddle
+riddled
+riddler
+riddles
+riddling
+ride
+rideable
+rident
+rider
+rider's
+riderless
+riders
+rides
+ridge
+ridge's
+ridged
+Ridgefield
+ridgeling
+ridgepole
+ridges
+ridgetree
+ridgeway
+ridging
+ridgling
+Ridgway
+ridgy
+ridicule
+ridiculed
+ridiculer
+ridicules
+ridiculing
+ridiculize
+ridiculizes
+ridiculous
+ridiculously
+ridiculousness
+riding
+ridings
+ridley
+ridotto
+ridpath
+rids
+riefenstahl
+riegger
+riel
+Riemann
+Riemannian
+riempie
+rien
+rienzi
+rier
+Riesling
+rife
+rifely
+riff
+riffle
+riffled
+riffler
+riffles
+riffling
+riffraff
+rification
+rifice
+rificer
+rifle
+riflebird
+rifled
+rifleman
+riflemen
+rifler
+riflery
+rifles
+riflescope
+rifling
+rift
+rifying
+rig
+rig's
+Riga
+rigadoon
+rigamarole
+rigatoni
+rigaudon
+Rigel
+Rigel's
+rigged
+rigger
+riggers
+rigging
+Riggs
+right
+rightable
+righted
+righten
+righteous
+righteously
+righteousness
+righter
+rightful
+rightfully
+rightfulness
+righthand
+righthanded
+righting
+rightish
+rightism
+rightist
+rightly
+rightmost
+rightness
+righto
+rights
+rightward
+rightwards
+rightwinger
+rightwingers
+rigi
+rigid
+rigidification
+rigidify
+rigidities
+rigidity
+rigidly
+rigidness
+rigil
+rigmarole
+rigmaroles
+rigor
+rigor's
+rigorism
+rigorism's
+rigorisms
+rigorist
+rigorist's
+rigoristic
+rigoristics
+rigorists
+rigorous
+rigorously
+rigorousness
+rigors
+rigs
+Rigsdaler
+Rijeka
+Rijksdaaler
+Rijn
+Rijswijk
+Riksdag
+rile
+Riley
+riling
+Rilke
+rilke
+rill
+rille
+rillet
+rilly
+rim
+rim's
+rimbaud
+rime
+rimer
+rimester
+rimier
+riming
+Rimini
+rimland
+rimless
+rimmed
+rimming
+rimose
+rimous
+rimrock
+rims
+Rimsky
+rimu
+rimy
+rin
+rinascimento
+rind
+rind's
+rinded
+rinderpest
+rinds
+Rinehart
+rinforzando
+ring
+ringbark
+ringbolt
+ringbolts
+ringbone
+ringboned
+ringdove
+ringed
+ringel
+ringent
+ringer
+ringers
+ringgit
+ringhals
+ringing
+ringinglow
+ringingly
+ringings
+ringleader
+ringleaders
+ringlet
+ringlets
+ringlike
+ringmaster
+ringmasters
+ringneck
+ringolade
+rings
+ringside
+ringsiders
+ringster
+ringstraked
+ringtail
+ringtaw
+ringtoss
+ringworm
+ringworms
+rink
+rinker
+rinse
+rinsed
+rinser
+rinses
+rinsing
+Rio
+Riordan
+Riordan's
+riot
+rioted
+rioter
+rioters
+rioting
+riotous
+riotously
+riotousness
+riots
+rip
+riparian
+ripcord
+ripe
+ripely
+ripen
+ripened
+ripener
+ripeness
+ripening
+ripens
+riper
+ripest
+ripieno
+Ripley
+ripoff
+ripoff's
+ripoffs
+ripon
+riposte
+ripped
+ripper
+ripping
+ripple
+rippled
+rippler
+ripples
+ripplet
+rippling
+riprap
+rips
+ripsaw
+ripsnorter
+ripsnorting
+riptide
+Ripuarian
+RISC
+rise
+risen
+riser
+risers
+rises
+risibility
+risible
+risibles
+rising
+risings
+risk
+risked
+risker
+riskier
+riskiness
+risking
+risks
+risky
+risorgimento
+risotto
+Riss
+rissole
+risus
+rit
+ritard
+ritardando
+Ritchie
+Ritchie's
+rite
+rite's
+rited
+ritenuto
+rites
+ritornello
+Ritter
+ritual
+ritualism
+ritualist
+ritualistic
+ritualistically
+ritualization
+ritualize
+ritualized
+ritualizes
+ritualizing
+ritually
+rituals
+Ritz
+ritzier
+ritziness
+ritzy
+rivage
+rival
+rivaled
+rivaless
+rivalesses
+rivaling
+rivalize
+rivalizes
+rivalries
+rivalrous
+rivalry
+rivalry's
+rivals
+rive
+rived
+riven
+river
+river's
+Rivera
+riverbank
+riverbanks
+riverbed
+riverboat
+riverfront
+riverine
+rivers
+riverside
+Riverview
+riverview
+riverward
+riverwards
+riverweed
+rivet
+riveted
+riveter
+riveting
+rivets
+Riviera
+riving
+rivulet
+rivulet's
+rivulets
+Riyadh
+riyal
+rizal
+rizzio
+RMS
+RNA
+roach
+roaches
+road
+road's
+roadability
+roadbed
+roadbeds
+roadblock
+roadblocks
+roadholding
+roadhouse
+roadhouses
+roadless
+roadroller
+roadrollers
+roadrunner
+roadrunners
+roads
+roadside
+roadsides
+roadstead
+roadster
+roadster's
+roadsters
+roadway
+roadway's
+roadways
+roadwork
+roadworks
+roadworthiness
+roadworthy
+roam
+roamed
+roamer
+roaming
+roams
+roan
+Roanoke
+roar
+roared
+roarer
+roaring
+roaringest
+roars
+roast
+roasted
+roaster
+roasting
+roasts
+rob
+robalo
+roband
+robbed
+robben
+robber
+robber's
+robberies
+robbers
+robbery
+robbery's
+robbia
+robbie
+Robbie
+robbing
+Robbins
+robe
+robed
+Robert
+Robert's
+Roberta
+Roberto
+Roberts
+Robertson
+Robertsons
+robes
+Robeson
+Robespierre
+robin
+robin's
+robing
+robins
+Robinson
+Robinson's
+Robinsonville
+roble
+roborant
+robot
+robot's
+robotic
+robotics
+robotism
+robotization
+robotization's
+robotizations
+robotize
+robotizes
+robots
+robs
+Robson
+robust
+robustious
+robustiously
+robustiousness
+robustly
+robustness
+roc
+roca
+rocaille
+rocambole
+Rocco
+Rochberg
+Rochdale
+Rochelle
+Rochester
+Rochester's
+rochet
+Rochford
+rock
+rockabilly
+rockabye
+Rockaway
+rockaway
+rockaways
+Rockaways
+rockbound
+rocked
+Rockefeller
+rocker
+rockers
+rockery
+rocket
+rocket's
+rocketed
+rocketeer
+rocketing
+rocketry
+rockets
+rockettes
+rockfish
+Rockford
+Rockhampton
+rockier
+rockies
+rockiness
+rocking
+Rockingham
+Rockland
+rocklike
+rockling
+rockoon
+rockrose
+rocks
+rockshaft
+rockskipper
+Rockville
+rockweed
+Rockwell
+rocky
+rococo
+rod
+rod's
+rodder
+rodding
+rode
+rodent
+rodenticide
+rodents
+rodeo
+rodeos
+rodeph
+Rodgers
+Rodin
+rodless
+rodlike
+Rodney
+Rodney's
+rodomontade
+Rodrigo
+Rodriguez
+rods
+Rodzinski
+roe
+roebuck
+roebucks
+roemer
+roentgen
+roentgenize
+roentgenogram
+roentgenogram's
+roentgenograms
+roentgenograph
+roentgenographic
+roentgenographically
+roentgenography
+roentgenologic
+roentgenological
+roentgenologically
+roentgenologist
+roentgenology
+roentgenopaque
+roentgenoscope
+roentgenoscopic
+roentgenoscopy
+roentgenotherapy
+roes
+roeselare
+Roethke
+roff
+rogation
+rogatory
+Roger
+Roger's
+Rogers
+roget
+rogue
+rogue's
+rogueing
+roguery
+rogues
+roguing
+roguish
+roguishly
+roguishness
+roi
+roic
+roil
+roiling
+roily
+roister
+roistered
+roisterer
+roistering
+roisterous
+Rojak
+rolamite
+Roland
+role
+role's
+roles
+Rolf
+roll
+rollaway
+rollback
+rollbar
+rolled
+roller
+rollers
+rollick
+rollicking
+rollickingly
+Rollie
+rollie
+rolling
+Rollins
+rollmop
+rollmops
+rollneck
+Rollo
+rollout
+rollover
+rolls
+rollway
+rolnick
+ROM
+Roma
+Romagna
+Romaic
+romaine
+Romains
+Romaji
+Roman
+Roman's
+romance
+romanced
+romancer
+romancers
+romances
+romancing
+Romanes
+Romanesque
+Romania
+Romanic
+Romanies
+Romanism
+Romanist
+Romanization
+Romanization's
+Romanizations
+Romanize
+Romanized
+Romanizer
+Romanizers
+Romanizes
+Romanizing
+Romano
+Romanov
+Romans
+Romansch
+romantic
+romantic's
+romantically
+romanticism
+romanticist
+romanticization
+romanticize
+romanticizes
+romanticizing
+romantics
+Romany
+romanza
+romaunt
+Romberg
+Rome
+Romeldale
+Romeo
+Romeos
+Romero
+Romeros
+Romish
+Rommel
+Romney
+romp
+romped
+romper
+rompers
+romping
+romps
+romulo
+Romulus
+Ron
+Ronald
+Roncesvalles
+rondeau
+rondeaux
+rondel
+rondelet
+rondelle
+rondo
+rondos
+rondure
+rone
+roneo
+ronggeng
+Ronin
+ronnel
+Ronnie
+Ronsard
+ronyon
+roo
+rood
+roof
+roofed
+roofer
+roofers
+roofhouse
+roofing
+roofless
+rooflike
+roofline
+roofs
+rooftop
+rooftops
+rooftree
+rooinek
+rook
+rookery
+rookie
+rookies
+rooks
+rooky
+room
+roomed
+roomer
+roomers
+roomette
+roomful
+roomier
+roominess
+rooming
+roommate
+roommate's
+roommates
+rooms
+roomy
+Rooney
+rooney
+roorback
+roos
+roose
+Roosevelt
+Roosevelt's
+Rooseveltian
+roost
+rooster
+roosters
+root
+root's
+rootage
+rooted
+rootedness
+rooter
+roothold
+rooting
+rootle
+rootless
+rootlessness
+rootlet
+rootlike
+roots
+rootstalk
+rootstock
+rooty
+ropable
+rope
+ropean
+roped
+ropedancer
+ropedancing
+roper
+ropers
+ropery
+ropes
+ropewalk
+ropewalker
+ropeway
+ropework
+ropier
+ropiness
+roping
+ropy
+roque
+roquefort
+roquelaure
+Roquemore
+roquet
+roraima
+rorqual
+Rorschach
+rorschach
+rort
+Rosa
+rosabelle
+Rosabelle
+rosace
+rosaceous
+Rosalie
+Rosalind
+rosaniline
+rosarian
+rosaries
+rosario
+rosarium
+rosary
+roscius
+roscoe
+roscommon
+rose
+rose's
+roseate
+roseately
+rosebay
+roseberry
+rosebud
+rosebud's
+rosebuds
+rosebush
+rosefish
+rosehip
+Roseland
+roselike
+rosella
+Rosella
+rosemaling
+rosemary
+Rosen
+Rosenberg
+Rosenblum
+Rosenblum's
+Rosenthal
+Rosenthal's
+Rosenzweig
+Rosenzweig's
+roseola
+roseolar
+rosery
+roses
+roset
+Rosetta
+rosette
+rosettes
+rosewall
+rosewater
+rosewood
+rosh
+Rosicrucian
+Rosie
+rosie
+rosier
+rosily
+rosin
+rosinante
+rosined
+rosiness
+rosining
+rosinous
+rosinweed
+roskilde
+roslev
+rospa
+Ross
+rossetti
+Rossi
+rossi
+Rossini
+rossiya
+rossoff
+rostagno
+rostagnos
+rostand
+rostellar
+rostellate
+rostellum
+roster
+rostock
+Rostov
+rostra
+rostral
+rostrate
+Rostropovich
+rostrum
+rosulate
+roswell
+Roswell
+rosy
+rot
+rota
+rotaed
+rotameter
+rotameter's
+rotameters
+Rotarian
+Rotarians
+rotary
+rotatable
+rotate
+rotated
+rotates
+rotating
+rotation
+rotational
+rotationally
+rotations
+rotative
+rotatively
+rotator
+rotator's
+rotators
+rotatory
+ROTC
+rote
+rotenone
+rotgut
+Roth
+Rotherham
+Rothermere
+Rothesay
+rothko
+Rothschild
+Rothschild's
+roti
+rotifer
+rotisserie
+rotogravure
+rotogravures
+rotonda
+rotor
+rotorcraft
+rotors
+rotorua
+rotos
+rototill
+rots
+rotted
+rotten
+rottenly
+rottenness
+rottenstone
+rotter
+Rotterdam
+rotting
+rottosei
+rottweiler
+rotund
+rotunda
+rotundity
+rotundly
+rotundness
+roturier
+rou
+Rouault
+Roubaix
+roucou
+rouen
+rouge
+rouget
+rough
+roughage
+roughcast
+roughed
+roughen
+roughened
+roughening
+roughens
+rougher
+roughest
+roughhouse
+roughhoused
+roughhousing
+roughish
+roughleg
+roughly
+roughneck
+roughness
+roughrider
+roughriders
+roughshod
+rouging
+roulade
+rouleau
+rouleaux
+roulers
+roulette
+rouletted
+roulettes
+rouletting
+roumelia
+round
+roundabout
+roundaboutness
+rounded
+roundedness
+roundel
+roundelay
+rounder
+rounders
+roundest
+roundhead
+roundheaded
+roundheadedness
+roundhouse
+rounding
+roundish
+roundlet
+roundly
+roundness
+roundoff
+rounds
+roundsman
+roundtable
+roundup
+roundup's
+roundups
+roundwood
+roundworm
+roup
+Rourke
+rous
+rouse
+rouseabout
+roused
+rousement
+rouser
+rouses
+rousing
+Rousseau
+Rousseau's
+Roussillon
+roust
+roustabout
+rouster
+rout
+route
+routed
+routeman
+Routemarch
+router
+routers
+routes
+routeway
+routh
+routine
+routinely
+routines
+routing
+routings
+routinization
+routinization's
+routinizations
+routinize
+routinizes
+roux
+rove
+roved
+roven
+rover
+roves
+roving
+row
+Rowan
+rowboat
+rowboats
+Rowbotham
+rowdier
+rowdies
+rowdily
+rowdiness
+rowdy
+rowdyish
+rowdyism
+Rowe
+Rowe's
+rowed
+rowel
+roweled
+roweling
+rowen
+Rowena
+Rowena's
+rower
+rowers
+Rowicki
+rowing
+Rowland
+Rowland's
+Rowlandson
+Rowley
+Rowley's
+rowlock
+rowntree
+rows
+roxas
+Roxburgh
+Roxbury
+Roxbury's
+Roxy
+roxy
+Roxy's
+Roy
+Roy's
+royal
+royalism
+royalist
+royalist's
+royalists
+royalization
+royalization's
+royalizations
+royalize
+royalizes
+royally
+royalties
+royalty
+royalty's
+royaux
+Royce
+Royden
+royster
+rozella
+rozelle
+Rozelle
+Rozelle's
+Rozhdestvensky
+rozzer
+RPM
+rpt
+rRNA
+RSVP
+RSX
+RTT
+rub
+Rubaiyat
+rubasse
+rubato
+rubbed
+rubber
+rubber's
+rubberization
+rubberize
+rubberized
+rubberizes
+rubberizing
+rubberlike
+rubberneck
+rubbernecker
+rubbers
+rubbery
+rubbing
+rubbish
+rubbishes
+rubbishy
+rubble
+rubbled
+rubblework
+rubbling
+rubbra
+rubby
+rubdown
+rube
+rubefacient
+rubefy
+rubella
+rubellite
+Ruben
+Ruben's
+Rubens
+Rubenstein
+rubeola
+rubeolar
+rubes
+rubescent
+rubiaceous
+Rubicon
+rubicund
+rubicundity
+rubidium
+rubies
+rubiginous
+Rubin
+Rubin's
+rubinstein
+rubious
+ruble
+ruble's
+rubles
+rubout
+rubric
+rubrical
+rubrically
+rubricate
+rubrication
+rubricator
+rubrician
+rubricize
+rubricizes
+rubs
+rubstone
+rubus
+ruby
+ruby's
+rubythroat
+rucellai
+ruche
+ruching
+ruck
+rucksack
+ruckus
+ruction
+rudbeckia
+rudd
+rudder
+rudder's
+rudderhead
+rudderless
+rudderpost
+rudders
+rudderstock
+ruddier
+ruddily
+ruddiness
+ruddle
+ruddled
+ruddleman
+ruddling
+ruddock
+ruddy
+rude
+rudely
+rudeness
+ruder
+ruderal
+rudesbies
+rudesby
+Rudesheimer
+rudest
+rudiment
+rudiment's
+rudimental
+rudimentarily
+rudimentariness
+rudimentary
+rudiments
+rudish
+Rudolf
+Rudolf's
+Rudolph
+Rudolph's
+Rudy
+Rudyard
+Rudyard's
+rue
+rueful
+ruefully
+ruefulness
+rues
+rufescent
+ruff
+ruffe
+ruffed
+ruffian
+ruffianism
+ruffianize
+ruffianizes
+ruffianly
+ruffians
+ruffle
+ruffled
+ruffler
+ruffles
+ruffling
+ruffly
+rufous
+Rufus
+rug
+rug's
+ruga
+rugae
+rugal
+rugate
+rugby
+rugged
+ruggedization
+ruggedize
+ruggedized
+ruggedizes
+ruggedizing
+ruggedly
+ruggedness
+rugger
+ruggiero
+rugose
+rugosely
+rugosity
+rugs
+rugulose
+ruh
+Ruhr
+ruidoso
+ruin
+ruinate
+ruination
+ruination's
+ruinations
+ruined
+ruiner
+ruing
+ruining
+ruinous
+ruinously
+ruinousness
+ruins
+ruisdael
+rule
+ruled
+ruleless
+ruler
+rulers
+rulership
+rules
+ruling
+rulings
+rum
+Rumania
+Rumanian
+Rumanians
+rumba
+rumble
+rumbled
+rumbler
+rumbles
+rumbling
+rumbly
+rumbustious
+rumdum
+rumelia
+rumen
+rumens
+Rumford
+rumina
+ruminal
+ruminant
+ruminantly
+ruminants
+ruminate
+rumination
+ruminative
+ruminatively
+ruminator
+rummage
+rummaged
+rummager
+rummaging
+rummel
+Rummel
+rummer
+rummest
+rummier
+rummies
+rummy
+rumor
+rumor's
+rumored
+rumorer
+rumorer's
+rumorers
+rumoring
+rumormonger
+rumormonger's
+rumormongers
+rumors
+rump
+Rumpelstiltskin
+rumple
+rumpled
+rumples
+rumplier
+rumpling
+rumply
+rumps
+rumpus
+rumrunner
+run
+runabout
+runabouts
+runagate
+runaround
+runaway
+runaways
+runback
+runcible
+runcinate
+runcorn
+rundle
+rundlet
+rundown
+Rundstedt
+rune
+runes
+rung
+rung's
+Runge
+rungs
+runic
+runless
+runlet
+runnable
+runnel
+runnels
+runner
+runner's
+runners
+runneth
+running
+runny
+Runnymede
+runoff
+runoffs
+runout
+runouts
+runover
+runs
+runt
+runtime
+runtiness
+runtm
+runts
+runty
+runway
+runways
+Runyon
+rupee
+rupees
+Rupert
+rupiah
+rupiahs
+rupicoline
+rupicolous
+Ruppert
+ruppert
+rupture
+ruptured
+ruptures
+rupturing
+rural
+ruralist
+rurality
+ruralization
+ruralization's
+ruralizations
+ruralize
+ruralized
+ruralizes
+ruralizing
+rurally
+rurban
+Rurik
+Ruritania
+ruse
+rush
+rushall
+rushed
+rushee
+rusher
+rushes
+rushing
+rushlight
+Rushmore
+rushy
+rusk
+Ruskin
+Russ
+Russell
+russet
+russeted
+russeting
+russets
+russetting
+Russia
+Russian
+Russian's
+russianization
+Russianization's
+Russianizations
+russianize
+Russianized
+Russianizes
+Russianizing
+Russians
+russification
+russify
+Russky
+Russo
+Russo's
+Russophile
+Russophobe
+russula
+rust
+rusted
+rustic
+rustical
+rustically
+rusticate
+rusticated
+rusticates
+rusticating
+rustication
+rusticator
+rusticity
+rusticize
+rusticizes
+rustier
+rustily
+rustiness
+rusting
+rustle
+rustled
+rustler
+rustlers
+rustles
+rustling
+rustproof
+rusts
+rusty
+rut
+rut's
+rutabaga
+rutabagas
+Rutgers
+Ruth
+ruthenia
+Ruthenian
+ruthenic
+ruthenious
+ruthenium
+Rutherford
+Rutherfordium
+ruthful
+Ruthful
+Ruthfully
+Ruthfulness
+ruthless
+ruthlessly
+ruthlessness
+rutilant
+rutilated
+rutile
+Rutland
+Rutledge
+ruts
+rutted
+Rutter
+ruttier
+rutting
+ruttish
+ruttishly
+ruttishness
+rutty
+ruwenzori
+ruysdael
+ruyter
+Rwanda
+Rwanda's
+Ryan
+ryazan
+Rybinsk
+rydal
+Rydberg
+Rydberg's
+Ryder
+rye
+rye's
+ryegrass
+ryobu
+ryokan
+ryot
+Ryswick
+Ryukyu
+Ryurik
+Rzewski
+s's
+Saadi
+Saar
+Saarinen
+Saarland
+saba
+sabadell
+sabadilla
+Sabaean
+sabah
+Sabaoth
+sabatier
+sabayon
+sabbat
+Sabbatarian
+sabbath
+Sabbathize
+Sabbathizes
+sabbatic
+sabbatical
+Sabellian
+saber
+saber's
+sabered
+sabering
+saberlike
+saberlike's
+saberlikes
+sabers
+sabertooth
+sabin
+Sabina
+Sabina's
+Sabine
+sable
+sable's
+sables
+sabol
+sabot
+sabotage
+sabotaged
+sabotages
+sabotaging
+saboteur
+saboteurs
+sabra
+sabras
+sabretache
+sabulous
+sac
+sacahuiste
+sacaton
+saccade
+saccadic
+saccate
+saccharase
+saccharate
+saccharic
+saccharide
+saccharides
+saccharification
+saccharify
+saccharimeter
+saccharimeter's
+saccharimeters
+saccharimetry
+saccharin
+saccharine
+saccharinity
+saccharoid
+saccharoidal
+saccharometer
+saccharometer's
+saccharometers
+saccharomyces
+saccharose
+sacco
+saccular
+sacculate
+sacculated
+sacculates
+sacculation
+saccule
+sacculus
+sacerdotal
+sacerdotalism
+sacerdotalist
+sacerdotally
+sachem
+sachemic
+sachems
+sachet
+sacheted
+sacheverell
+Sachs
+Sachsen
+sack
+sackbut
+sackcloth
+sacked
+sacker
+sackful
+sacking
+sacks
+Sackville
+saclike
+sacque
+sacra
+sacral
+sacralization
+sacralization's
+sacralizations
+sacrament
+sacramental
+sacramentalism
+sacramentalist
+sacramentally
+Sacramentarian
+sacramentize
+sacramentizes
+Sacramento
+sacraments
+sacrarium
+sacre
+sacred
+sacredly
+sacredness
+sacrestia
+sacrifice
+sacrificed
+sacrificer
+sacrificers
+sacrifices
+sacrificial
+sacrificially
+sacrificing
+sacrilege
+sacrilegious
+sacrilegiously
+sacrilegiousnes
+sacring
+sacristan
+sacristy
+sacroiliac
+sacrosanct
+sacrosanctity
+sacrum
+sad
+sadat
+sadden
+saddened
+saddening
+saddens
+sadder
+saddest
+saddhu
+saddle
+saddlebag
+saddlebags
+saddlebill
+saddlebow
+saddlecloth
+saddled
+saddleless
+saddler
+saddlery
+saddles
+saddletree
+saddling
+Sadducee
+sade
+sadhu
+sadi
+Sadie
+sadiron
+sadism
+sadist
+sadist's
+sadistic
+sadistically
+sadists
+Sadler
+Sadler's
+sadly
+sadness
+sadomasochism
+sadomasochist
+sadomasochistic
+sadowa
+Saens
+Safar
+safari
+safe
+safecracker
+safecracking
+safeguard
+safeguarded
+safeguarding
+safeguards
+safekeeping
+safelight
+safely
+safeness
+safer
+safes
+safest
+safetied
+safeties
+safety
+safetying
+safetyman
+saffian
+safflower
+saffron
+Safi
+safid
+safranin
+safranine
+safrole
+sag
+saga
+sagacious
+sagaciously
+sagaciousness
+sagacity
+sagami
+sagamore
+sage
+sagebrush
+sagely
+sageness
+sages
+saggar
+sagged
+sagger
+sagging
+saghalien
+Saginaw
+sagitta
+sagittal
+sagittally
+Sagittarius
+sagittate
+sago
+sagos
+sags
+saguache
+saguaro
+saguenay
+saguia
+sagunto
+Sahaptin
+Sahara
+Saharan
+saharanpur
+sahib
+sahitya
+said
+saida
+saiga
+Saigon
+sail
+sailable
+sailboard
+sailboat
+sailboater
+sailboaters
+sailboating
+sailboats
+sailcloth
+sailed
+sailer
+sailfish
+sailing
+sailon
+sailor
+sailorizing
+sailorizing's
+sailorizings
+sailorly
+sailors
+sailplane
+sailplaner
+sails
+sain
+sainfoin
+sainsbury
+saint
+Saint
+saintdom
+sainted
+sainthood
+saintlike
+saintliness
+saintly
+Saintpaulia
+saints
+saintsbury
+saintship
+saipan
+saith
+saithe
+Saiva
+Sakai
+sake
+saker
+sakes
+sakhalin
+Sakharov
+saki
+sako
+saktas
+sakti
+Sakyamuni
+Sal
+salaam
+salability
+salable
+salacious
+salaciously
+salaciousness
+salad
+salad's
+salade
+saladin
+salado
+salads
+salamanca
+salamander
+salamandrine
+salambria
+salami
+salamis
+salariat
+salaried
+salaries
+salary
+salchow
+salduba
+sale
+sale's
+saleable
+saledo
+Salem
+salep
+saleratus
+Salerno
+saleroom
+sales
+salesclerk
+salesgirl
+Salesian
+saleslady
+salesman
+salesmanship
+salesmen
+salespeople
+salespeople's
+salesperson
+salesperson's
+salesroom
+saleswoman
+saleswomen
+salet
+Salford
+Salian
+salic
+salicaceous
+salicin
+salicional
+Salicornia
+salicylate
+salicylic
+salida
+salience
+saliency
+salient
+salientian
+saliently
+saliferous
+salify
+salimeter
+salimeter's
+salimeters
+Salina
+Salina's
+saline
+salinger
+salinity
+salinization
+salinize
+salinizes
+salinometer
+salinometer's
+salinometers
+salique
+Salisbury
+Salish
+saliva
+salivary
+salivate
+salivated
+salivates
+salivating
+salivation
+Salk
+Salle
+sallee
+sallet
+sallied
+sallies
+Sallinen
+sallow
+sallowish
+sallowness
+sallust
+Sally
+sally
+Sally's
+sallying
+salmagundi
+salmanazar
+salmi
+Salminen
+salmon
+salmonberries
+salmonberry
+salmonella
+salmonellosis
+salmonid
+salmonoid
+salmons
+Salol
+salometer
+salometer's
+salometers
+salon
+salon's
+Salonen
+salonika
+salons
+saloon
+saloon's
+saloonkeep
+saloonkeeper
+saloons
+saloop
+salop
+salopette
+Salpa
+salpicon
+Salpiglossis
+salpingectomy
+salpingitis
+salpinx
+salsa
+salsa's
+salsas
+salsify
+salt
+salta
+saltant
+saltarello
+saltation
+saltatorial
+saltatory
+saltbox
+saltbush
+saltcellar
+saltchuck
+saltchucker
+salted
+salter
+saltern
+salters
+saltfish
+saltier
+saltiest
+saltigrade
+saltillo
+saltily
+saltine
+saltiness
+salting
+saltire
+saltless
+saltlike
+saltness
+salto
+Salton
+saltonstall
+saltpan
+saltpeter
+saltpeter's
+saltpeters
+salts
+saltshaker
+saltus
+saltwater
+saltworks
+saltwort
+salty
+salubrious
+salubriously
+salubriousness
+salubrity
+saluki
+salutarily
+salutariness
+salutaris
+salutary
+salutation
+salutation's
+salutational
+salutations
+salutatorian
+salutatory
+salute
+saluted
+saluter
+salutes
+salutiferous
+saluting
+salutory
+salvable
+Salvador
+Salvadoran
+salvage
+salvageability
+salvageable
+salvaged
+salvager
+salvages
+salvaging
+salvation
+salvational
+salvationism
+salvationist
+Salvatore
+salvatorian
+salve
+salver
+salverform
+salves
+Salvia
+salvific
+salving
+salvo
+salvoes
+salvor
+salvos
+salween
+salyut
+Salz
+Salz's
+Salzburg
+salzgitter
+Sam
+Sam's
+samar
+samara
+samarang
+samaria
+Samaritan
+samarium
+Samarkand
+samarskite
+samba
+sambar
+Sambo
+sambre
+sambur
+same
+samekh
+sameness
+samfoo
+Samian
+samiel
+samisen
+samite
+samiti
+samizdat
+samlet
+Sammy
+Sammy's
+Samnite
+samnium
+Samoa
+Samoan
+samos
+samothrace
+samovar
+Samoyed
+samp
+sampan
+samphire
+sample
+sample's
+sampled
+sampler
+samplers
+samples
+sampling
+samplings
+Sampson
+samsara
+samshu
+Samson
+samsun
+Samuel
+Samuels
+Samuelson
+samurai
+samurai's
+samurais
+San
+Sana
+sanatarium
+sanative
+sanatoria
+sanatorium
+sanbenito
+Sanborn
+Sanborn's
+Sanchez
+Sancho
+sancta
+sanctification
+sanctified
+sanctifier
+sanctify
+sanctimonious
+sanctimoniously
+sanctimoniousness
+sanctimony
+sanction
+sanctioned
+sanctioning
+sanctions
+sanctities
+sanctitude
+sanctity
+sanctuaries
+sanctuary
+sanctuary's
+sanctum
+Sanctus
+sand
+sandakan
+sandal
+sandal's
+sandaled
+sandaling
+sandals
+sandalwood
+sandarac
+sandbag
+sandbagger
+sandbank
+sandbar
+sandbars
+sandblast
+sandblaster
+sandbox
+sandbur
+Sandburg
+sanded
+sander
+Sanderling
+sanders
+Sanderson
+sandfly
+sandglass
+sandgrouse
+sandhi
+sandhill
+sandhog
+Sandhurst
+Sandia
+sandier
+sandiness
+sanding
+sandling
+sandlot
+sandlotter
+sandman
+sandpaper
+sandpapery
+sandpile
+sandpiper
+sandpit
+Sandra
+Sandringham
+sands
+sandsoap
+sandstone
+sandstones
+sandstorm
+sandstorms
+Sandusky
+sandwich
+Sandwich
+sandwiched
+sandwiches
+sandwiching
+sandworm
+sandworms
+sandwort
+sandworts
+sandy
+sane
+sanely
+saneness
+saner
+sanest
+Sanford
+Sanforized
+sang
+sangaree
+Sanger
+sangfroid
+Sangh
+sango
+Sangraal
+sangre
+sangria
+sanguinaria
+sanguinarily
+sanguinary
+sanguine
+sanguinely
+sanguineness
+sanguineous
+sanguineum
+sanguinity
+sanguinolent
+Sanhedrin
+sanicle
+sanies
+sanious
+sanipractor
+sanitaire
+sanitarian
+sanitarily
+sanitarium
+sanitariums
+sanitary
+sanitate
+sanitation
+sanitations
+sanitization
+sanitize
+sanitized
+sanitizer
+sanitizes
+sanitizing
+sanitorium
+sanity
+Sanjak
+sank
+sankey
+Sankhya
+sankt
+sanmicheli
+sannyasi
+sans
+sansei
+sanseis
+sanserif
+sansevieria
+Sanskrit
+sanskritic
+Sanskritic
+Sanskritize
+sansom
+sansome
+sant
+Santa
+santalaceous
+santana
+santander
+Santayana
+Santee
+Santiago
+Santo
+santolina
+santonica
+santonin
+Santos
+santour
+Sao
+saorstat
+sap
+sap's
+sapajou
+sapanwood
+sapele
+saphead
+sapheaded
+saphena
+saphenous
+sapid
+sapidity
+sapience
+sapiens
+sapient
+sapiential
+sapientize
+sapientizes
+sapiently
+sapindaceous
+sapio
+sapir
+sapless
+saplessness
+sapling
+sapling's
+saplings
+sapodilla
+sapogenin
+saponaceous
+saponaceousness
+saponifiable
+saponification
+saponifier
+saponify
+saponin
+saponins
+saponite
+sapor
+saporous
+sapota
+sapotaceous
+sappanwood
+sapped
+sapper
+sapphic
+sapphira
+sapphire
+sapphirine
+sapphism
+Sappho
+Sappho's
+sappier
+sappiness
+sapping
+sapporo
+sappy
+sapraemia
+sapremia
+sapremic
+saprobe
+saprobic
+saprobically
+saprogenic
+saprogenicity
+saprolite
+sapropel
+sapropelic
+saprophagous
+saprophyte
+saprophytic
+saprophytically
+saprozoic
+saps
+sapsago
+sapsucker
+sapwood
+Sara
+saraband
+sarabande
+Saracen
+Saracen's
+Saracens
+saragossa
+Sarah
+Sarajevo
+Saran
+Sarangi
+Saransk
+sarape
+sarasate
+Sarasota
+Saratoga
+Saratov
+sarawak
+sarcasm
+sarcasm's
+sarcasms
+sarcastic
+sarcastically
+sarcenet
+sarcocarp
+sarcoid
+sarcoidosis
+sarcolemma
+sarcolemmal
+sarcoma
+sarcomatosis
+sarcomatous
+sarcomere
+sarcomeric
+sarcophagic
+sarcophagous
+sarcophagus
+sarcophagy
+sarcoplasm
+sarcoplasma
+sarcoplasmatic
+sarcoplasmic
+sarcosomal
+sarcosome
+sarcous
+Sard
+sardar
+sardegna
+sardine
+sardines
+Sardinia
+Sardinia's
+Sardinian
+Sardis
+Sardius
+sardonic
+sardonically
+sardonicism
+sardonyx
+Sardou
+sargasso
+sargassum
+sarge
+Sarge's
+Sargent
+Sargodha
+Sargon
+sari
+Sark
+Sarkis
+sarmatia
+sarmentose
+sarmi
+sarnen
+sarnia
+sarod
+sarode
+sarodist
+sarong
+sarong's
+sarongs
+saronic
+saros
+sarpanch
+sarpedon
+sarpsis
+Sarracenia
+sarraceniaceous
+sarraute
+sarre
+sarrusophone
+sarsaparilla
+Sarsen
+sarsenet
+sarsparilla
+sarthe
+sarti
+sarto
+sartor
+sartorial
+sartorially
+sartorius
+Sartre
+sarum
+sarvodaya
+Saschowa
+sasebo
+sash
+sashay
+sashayed
+sashed
+sashes
+sashimi
+sasin
+Saskatchewan
+saskatoon
+sass
+sassaby
+sassafras
+Sassanid
+sassari
+Sassenach
+sassier
+sassing
+sassoon
+sasswood
+sassy
+sastruga
+sat
+satai
+Satan
+satang
+satangs
+satanic
+satanically
+Satanism
+Satanist
+satanize
+satanizes
+satchel
+satchel's
+satchelful
+satchels
+sate
+sated
+sateen
+satellite
+satellite's
+satellites
+satellitium
+satem
+sates
+sati
+satiable
+satiate
+satiated
+satiates
+satiating
+satiation
+Satie
+satiety
+satin
+satinet
+satinflower
+sating
+satinize
+satinizes
+satinpod
+satinwood
+satiny
+satire
+satire's
+satires
+satiric
+satirical
+satirically
+satirist
+satirist's
+satirists
+satirizable
+satirizable's
+satirizables
+satirize
+satirized
+satirizer
+satirizers
+satirizes
+satirizing
+satisfaction
+satisfaction's
+satisfactions
+satisfactorily
+satisfactoriness
+satisfactory
+satisfiability
+satisfiable
+satisfied
+satisfier
+satisfiers
+satisfies
+satisfy
+satisfying
+satisfyingly
+satori
+satrap
+satrapy
+Satsuma
+saturable
+saturant
+saturate
+saturated
+saturater
+saturates
+saturating
+saturation
+saturations
+saturator
+Saturday
+Saturday's
+Saturdays
+Saturn
+saturnali
+saturnalia
+saturnalian
+saturnalianly
+Saturnian
+saturniid
+saturnine
+saturninely
+Saturnism
+saturnism
+satyagraha
+satyagrahi
+Satyanarayanan
+Satyanarayanan's
+satyr
+satyriasis
+satyric
+satyrid
+sauce
+saucebox
+saucepan
+saucepan's
+saucepans
+saucer
+saucerlike
+saucers
+sauces
+sauch
+saucier
+saucily
+sauciness
+saucing
+saucy
+Saud
+Saudi
+Sauerbaum
+sauerbraten
+sauerkraut
+sauger
+Saukville
+Saul
+Saul's
+Sault
+sauna
+sauna's
+saunas
+Saunders
+saunter
+sauntered
+saunterer
+sauntering
+saunters
+saurel
+saurian
+sauries
+saurischian
+sauropod
+saury
+sausage
+sausage's
+sausages
+saussure
+saute
+sauterne
+sauternes
+sav
+sava
+savable
+savage
+savaged
+savagely
+savageness
+savager
+savagers
+savagery
+savages
+savaging
+savagism
+savagize
+savagizes
+savaii
+savanna
+savanna's
+Savannah
+savannahs
+savannas
+savant
+savants
+savas
+savate
+save
+saveable
+saved
+saveloy
+saver
+savers
+saves
+saving
+savings
+savior
+savior's
+saviorhood
+saviorhood's
+saviorhoods
+saviors
+saviorship
+saviorship's
+saviorships
+Saviour
+savoie
+savoir
+savona
+Savonarola
+savor
+savored
+savorer
+savorer's
+savorers
+savorier
+savories
+savoriest
+savorilies
+savorily
+savoriness
+savoring
+savoringlies
+savoringly
+savorless
+savorlesses
+savorous
+savors
+savory
+savory's
+savoy
+Savoy
+Savoyard
+Savoyards
+savvied
+savvy
+savvying
+saw
+sawbelly
+sawbill
+sawbones
+sawboneses
+sawbuck
+sawder
+sawdust
+sawed
+sawer
+sawfish
+sawfly
+sawhorse
+sawing
+sawlike
+sawmill
+sawmill's
+sawmills
+sawn
+Sawney
+saws
+sawtimber
+sawtooth
+sawyer
+sax
+Saxe
+saxhorn
+saxicolous
+saxifragaceous
+saxifrage
+saxo
+Saxon
+Saxonization
+Saxonization's
+Saxonizations
+Saxonize
+Saxonizes
+Saxons
+saxons
+Saxony
+saxophone
+saxophone's
+saxophones
+saxophonic
+saxophonist
+Saxton
+saxton
+say
+sayable
+sayan
+sayer
+sayers
+saying
+sayings
+says
+sazerac
+SC
+scab
+scabbard
+scabbard's
+scabbards
+scabbed
+scabbier
+scabbing
+scabble
+scabbled
+scabbles
+scabbling
+scabby
+scabies
+scabietic
+scabiosa
+scabious
+scabrous
+scabrously
+scabrousness
+scabs
+scad
+scad's
+scads
+scafell
+scaffold
+scaffolding
+scaffoldings
+scaffolds
+scag
+scagliola
+Scala
+Scala's
+scalability
+scalable
+scalade
+scalado
+scalage
+scalar
+scalar's
+scalare
+scalariform
+scalariformly
+scalars
+scalation
+scalawag
+scald
+scalded
+scaldfish
+scalding
+scalds
+scale
+scaleboard
+scaled
+scaleless
+scalelike
+scalene
+scalenus
+scalepan
+scaler
+scalers
+scales
+scalier
+scaliger
+scaliness
+scaling
+scalings
+scall
+scallion
+scallop
+scalloped
+scalloper
+scalloping
+scallopini
+scallops
+scallywag
+scallywags
+scalogram
+scalogram's
+scalograms
+scaloppine
+scalp
+scalp's
+scalpel
+scalper
+scalping
+scalps
+scaly
+scam
+scam's
+scammed
+scammel
+scamming
+scammony
+scamp
+scamper
+scampered
+scampering
+scampers
+scampi
+scampini
+scampish
+scams
+scan
+scandal
+scandal's
+scandaled
+scandaling
+scandalization
+scandalization's
+scandalizations
+scandalize
+scandalized
+scandalizer
+scandalizers
+scandalizes
+scandalizing
+scandalmonger
+scandalous
+scandalously
+scandalousness
+scandals
+scandaroon
+scandent
+scanderbeg
+Scandian
+scandic
+Scandinavia
+Scandinavian
+Scandinavians
+scandium
+scannable
+scanned
+scanner
+scanner's
+scanners
+scanning
+scans
+scansion
+scansorial
+scant
+scantier
+scanties
+scantiest
+scantily
+scantiness
+scantling
+scantly
+scantness
+scanty
+scapa
+scape
+scapegoat
+scapegoating
+scapegoatism
+scapegoats
+scapegrace
+scapewheel
+scaphoid
+scaphopod
+scapin
+scaping
+scapolite
+scapose
+scapula
+scapular
+scapulars
+scar
+scar's
+scarab
+scarabaeid
+scarabaeus
+scaramouch
+scaramouche
+Scarborough
+scarce
+scarcely
+scarcement
+scarceness
+scarcer
+scarcest
+scarcity
+scare
+scarecrow
+scarecrowish
+scared
+scarehead
+scaremonger
+scarer
+scares
+scarey
+scarf
+scarface
+scarfpin
+scarfs
+scarfskin
+scarier
+scarification
+scarificator
+scarifier
+scarify
+scaring
+scarious
+scarlatina
+scarlatinal
+Scarlatti
+Scarlatti's
+scarless
+scarlet
+scarp
+scarped
+scarper
+scarpered
+scarpering
+scarpers
+scarph
+scarping
+scarps
+scarred
+scarring
+scarron
+scarry
+scars
+Scarsdale
+Scarsdale's
+scarves
+scary
+scat
+scatback
+scathe
+scathed
+scatheless
+scathes
+scathing
+scathingly
+scatological
+scatology
+scatted
+scatter
+scatteration
+scatterbrain
+scatterbrained
+scattered
+scatterer
+scattergram
+scattergun
+scattering
+scatteringly
+scatterplot
+scatterplots
+scatters
+scattershot
+scattier
+scatting
+scatty
+scaup
+scauper
+scaups
+scavenge
+scavenged
+scavenger
+scavenger's
+scavengers
+scavenges
+scavenging
+scc
+SCCS
+scena
+scenario
+scenario's
+scenarioization
+scenarioization's
+scenarioizations
+scenarioize
+scenarioizes
+scenarios
+scenarist
+scenarization
+scenarization's
+scenarizations
+scenarize
+scenarizes
+scend
+scene
+scene's
+sceneries
+scenery
+scenes
+scenic
+scenical
+scenically
+scenics
+scenographic
+scenographically
+scenography
+scent
+scented
+scentless
+scents
+scepter
+scepter's
+sceptered
+sceptering
+scepterless
+scepterlesses
+scepters
+sceptibly
+sceptic
+sceptical
+scepticism
+Schaefer
+Schaeffer
+Schaerbeek
+Schafer
+Schaffhausen
+Schaffner
+Schantz
+Schapiro
+schappe
+schedule
+schedule's
+scheduled
+scheduler
+scheduler's
+schedulers
+schedules
+scheduling
+schedulize
+schedulizes
+scheel
+scheele
+scheelite
+Scheherazade
+Scheherazade's
+Scheherezade
+Schein
+scheldt
+Schelling
+schelling
+schema
+schema's
+schemas
+schemata
+schematic
+schematically
+schematics
+schematism
+schematization
+schematization's
+schematizations
+schematize
+schematized
+schematizer
+schematizers
+schematizes
+schematizing
+scheme
+scheme's
+schemed
+schemer
+schemers
+schemes
+scheming
+Schenck
+Schenectady
+scherzando
+scherzi
+scherzo
+schiaparelli
+schickard
+Schiedam
+Schiff
+Schiller
+Schiller's
+schilling
+Schippers
+schism
+schismatic
+schismatical
+schismatically
+schismatist
+schismatize
+schismatized
+schismatizes
+schismatizing
+schist
+schistose
+schistosity
+schistosomal
+schistosome
+schistosomiasis
+schistous
+schizo
+schizocarp
+schizogenesis
+schizogonic
+schizogonous
+schizogony
+schizoid
+schizomycete
+schizomycetes
+schizomycetous
+schizont
+schizophrene
+schizophrenia
+schizophrenic
+schizophrenically
+schizophyceous
+schizophyte
+schizophytic
+schizopod
+schizos
+schizothymia
+schizothymic
+schlegel
+Schleiermacher
+schlemiel
+schlepp
+Schlesien
+Schlesinger
+Schlesinger's
+Schleswig
+Schliemann
+schlieren
+schlieric
+Schlitz
+schlock
+Schloss
+schmaltz
+schmaltzy
+schmalz
+Schmidt
+Schmitt
+schmo
+schmooze
+schmuck
+Schnabel
+Schnabel's
+schnapps
+schnauzer
+Schnecken
+Schneider
+schnitzel
+Schnitzler
+schnook
+schnorkle
+schnorrer
+schnozzle
+Schoenberg
+Schoenberg's
+Schofield
+Schofield's
+schola
+scholar
+scholarly
+scholars
+scholarship
+scholarship's
+scholarships
+scholastic
+scholastica
+scholastically
+scholasticate
+scholasticism
+scholastics
+scholiast
+scholiastic
+scholium
+schongauer
+school
+schoolbag
+schoolbook
+schoolbooks
+schoolboy
+schoolboy's
+schoolboys
+schoolchild
+schooled
+schooler
+schoolers
+schoolfellow
+schoolgirl
+schoolgirlish
+schoolgirls
+schoolhouse
+schoolhouse's
+schoolhouses
+schoolie
+schooling
+schoolman
+schoolmarm
+schoolmaster
+schoolmaster's
+schoolmasters
+schoolmate
+schoolmates
+schoolmistress
+schoolroom
+schoolroom's
+schoolrooms
+schools
+schoolteacher
+schooltime
+schoolwork
+schoolyard
+schoolyard's
+schoolyards
+schooner
+Schopenhauer
+schopenhauer
+schorl
+schorlaceous
+schottische
+Schottky
+Schottky's
+schouten
+schrodinger
+Schroeder
+Schroedinger
+Schubert
+schul
+Schultz
+Schulz
+Schumacher
+schuman
+Schuman
+Schumann
+Schuster
+Schuyler
+Schuyler's
+Schuylkill
+schwa
+Schwab
+schwaben
+schwada
+schwann
+Schwartz
+Schwarz
+Schwarzkopf
+schwarzwald
+schweinfurt
+Schweitzer
+Schweitzer's
+schweiz
+schwerin
+schwitters
+schwyz
+Sci
+sciaenid
+sciaenoid
+sciamachy
+sciatic
+sciatica
+science
+science's
+sciences
+scienter
+sciential
+scientific
+scientifically
+scientifique
+scientism
+scientist
+scientist's
+scientists
+scientologist
+scientology
+scilicet
+scilla
+scilly
+scimitar
+scimitars
+Scimone
+scincoid
+scintigraphic
+scintigraphy
+scintilla
+scintillant
+scintillantly
+scintillate
+scintillated
+scintillates
+scintillating
+scintillation
+scintillator
+scintillometer
+scintillometer's
+scintillometers
+sciolism
+sciolist
+sciolistic
+sciomachy
+sciomancy
+sciomantic
+scion
+scions
+scipio
+scire
+scirocco
+scirrhi
+scirrhous
+scirrhus
+scissel
+scissile
+scission
+scissor
+scissored
+scissoring
+scissors
+scissortail
+scissure
+sciurine
+sciuroid
+sclera
+sclerenchyma
+scleritis
+Scleroderma
+sclerodermatous
+scleroid
+scleroma
+sclerometer
+sclerophyll
+scleroprotein
+sclerose
+sclerosed
+sclerosis
+sclerotial
+sclerotic
+sclerotin
+sclerotium
+sclerotization
+sclerotized
+sclerotomy
+sclerous
+SCM
+scoff
+scoffed
+scoffer
+scoffing
+scofflaw
+scofflaw's
+scofflaws
+scoffs
+Scofield
+scold
+scolded
+scolder
+scolding
+scolds
+scolecite
+scolex
+scolices
+scoliosis
+scoliotic
+scollop
+scolopendra
+scolopendrid
+scombroid
+sconce
+scone
+scoop
+scooped
+scooper
+scoopful
+scooping
+scoops
+scoot
+scooted
+scooter
+scooting
+scoots
+scop
+scopas
+scope
+scoped
+scopes
+scopic
+scoping
+scopolamine
+scops
+scopula
+scopulate
+Scopus
+scorbutic
+scorbutically
+scorch
+scorched
+scorcher
+scorches
+scorching
+scorchingly
+score
+score's
+scoreboard
+scoreboards
+scorecard
+scored
+scorekeeper
+scoreless
+scorer
+scorers
+scores
+scoria
+scoriaceous
+scorify
+scoring
+scorings
+scorn
+scorned
+scorner
+scornful
+scornfully
+scornfulness
+scorning
+scorns
+scorpaenid
+scorpaenoid
+scorper
+Scorpio
+scorpioid
+scorpion
+scorpion's
+scorpions
+Scorpius
+Scot
+scotch
+Scotchgard
+scotchgard
+Scotchman
+scotchman
+scoter
+Scotia
+Scotian
+Scotism
+Scotland
+Scotland's
+scotoma
+scotomatous
+scotopia
+scotopic
+Scots
+Scotsman
+Scotsmen
+Scotswoman
+scotswomen
+Scott
+Scotticism
+scottie
+Scottish
+Scotto
+Scottsdale
+Scotty
+scotus
+scoundrel
+scoundrel's
+scoundrelly
+scoundrels
+scour
+scoured
+scourer
+scourge
+scourger
+scourging
+scouring
+scourings
+scours
+scouse
+scouser
+scout
+scoutcraft
+scouted
+scouter
+scouting
+scoutmaster
+scouts
+scow
+scowl
+scowled
+scowler
+scowling
+scowls
+scrabble
+scrabbled
+scrabbler
+scrabbles
+scrabbling
+scrabbly
+scrag
+scraggier
+scragging
+scraggly
+scraggy
+scram
+scramb
+scramble
+scrambled
+scrambler
+scrambles
+scrambling
+scramming
+scran
+scrannel
+Scranton
+scrap
+scrap's
+scrapbook
+scrapbooks
+scrape
+scraped
+scraper
+scraperboard
+scraperboards
+scrapers
+scrapes
+scrapheap
+scrapheaps
+scrapie
+scraping
+scrapings
+scrapped
+scrapper
+scrappier
+scrappiness
+scrapping
+scrapple
+scrappy
+scraps
+scratch
+scratched
+scratcher
+scratchers
+scratches
+scratchier
+scratchiness
+scratching
+scratchy
+scrawl
+scrawled
+scrawler
+scrawling
+scrawls
+scrawly
+scrawnier
+scrawniness
+scrawny
+screak
+screaky
+scream
+screamed
+screamer
+screamers
+screaming
+screamingly
+screams
+scree
+screech
+screeched
+screecher
+screeches
+screeching
+screechy
+screed
+screen
+screenable
+screened
+screener
+screenful
+screening
+screenings
+screenplay
+screens
+screenwriter
+screenwriter's
+screenwriters
+screvane
+screw
+screwball
+screwbean
+screwdriver
+screwdrivers
+screwed
+screwer
+screwier
+screwiness
+screwing
+screwlike
+screws
+screwup
+screwworm
+screwy
+Scriabin
+scribble
+scribbled
+scribbler
+scribbles
+scribbling
+scribe
+scriber
+scribes
+scribing
+Scribners
+scrieve
+scrim
+scrimmage
+scrimmaged
+scrimmager
+scrimmages
+scrimmaging
+scrimp
+scrimped
+scrimping
+scrimps
+scrimpy
+scrimshank
+scrimshaw
+scrip
+Scripps
+script
+script's
+scriptal
+scripted
+scripting
+scription
+scriptorium
+scripts
+scriptural
+scripturalize
+scripturalizes
+scripturally
+scripture
+scriptures
+scriptwriter
+scriptwriter's
+scriptwriters
+scriven
+scrivener
+scrobiculate
+scrod
+scrofula
+scrofulous
+scroll
+scrollbar
+scrollbar's
+scrollbars
+scrolled
+scrolling
+scrolls
+scrollwork
+scrooge
+scrooge's
+scrooges
+scroop
+scrophulariaceous
+scrota
+scrotal
+scrotum
+scrotum's
+scrotums
+scrouge
+scrouging
+scrounge
+scrounged
+scrounger
+scroungers
+scrounges
+scrounging
+scrub
+scrubbed
+scrubber
+scrubbier
+scrubbing
+scrubby
+scrubland
+scrubs
+scrubwoman
+scruff
+scruffier
+scruffiness
+scruffy
+scrum
+scrummage
+scrump
+scrumptious
+scrumptiously
+scrumpy
+scrunch
+scruple
+scrupled
+scruples
+scrupling
+scrupulosity
+scrupulous
+scrupulously
+scrupulousness
+scrutable
+scrutator
+scrutin
+scrutineer
+scrutinization
+scrutinization's
+scrutinizations
+scrutinize
+scrutinized
+scrutinizer
+scrutinizers
+scrutinizes
+scrutinizing
+scrutinizinglies
+scrutinizingly
+scrutiny
+scry
+SCSI
+scuba
+scud
+scudded
+scudding
+scudo
+scuds
+scuff
+scuffed
+scuffing
+scuffle
+scuffled
+scuffles
+scuffling
+scuffs
+scull
+sculled
+sculler
+sculleries
+scullery
+scullin
+sculling
+scullion
+scullions
+sculls
+sculpin
+sculpsit
+sculpt
+sculpted
+sculpting
+sculptor
+sculptor's
+sculptors
+sculptress
+sculpts
+sculptural
+sculpturally
+sculpture
+sculptured
+sculptures
+sculpturesque
+sculpturesquely
+sculpturing
+scum
+scum's
+scumble
+scumbled
+scumbles
+scumbling
+scumming
+scummy
+scums
+scuncheon
+scunge
+scungy
+scunner
+scunthorpe
+scup
+scupper
+scuppered
+scuppering
+scuppernong
+scuppers
+scups
+scurf
+scurfy
+scurried
+scurril
+scurrile
+scurrility
+scurrilous
+scurrilously
+scurrilousness
+scurry
+scurrying
+scurvily
+scurviness
+scurvy
+scut
+scuta
+scutage
+scutate
+scutch
+scutcheon
+scute
+scutellation
+scutellum
+scutiform
+scuttle
+scuttlebutt
+scuttled
+scuttles
+scuttling
+scutum
+Scylla
+scyphiform
+scyphistoma
+scyphozoan
+scyphus
+scyros
+scythe
+scythe's
+scythes
+Scythia
+Scythian
+scything
+SD
+SE
+sea
+seabag
+seabeach
+seabed
+seabed's
+Seabee
+seabird
+seaboard
+seaboot
+Seaborg
+seaborg
+seaborne
+Seabrook
+seacoast
+seacoast's
+seacoasts
+seacock
+seacraft
+seadog
+seadrome
+seafare
+seafarer
+seafarers
+seafaring
+seafloor
+seafood
+seafowl
+seafront
+Seagate
+Seagate's
+seagirt
+seagoing
+Seagram
+Seagram's
+seagull
+seagulls
+seahorse
+seakale
+seal
+sealant
+sealants
+sealed
+sealer
+sealery
+sealing
+seals
+sealskin
+sealy
+Sealyham
+seam
+seaman
+seamanlike
+seamanly
+seamanship
+seamanships
+seamark
+seamed
+seamen
+seamer
+seami
+seamier
+seaminess
+seaming
+seamless
+seamlessly
+seamlessness
+seamlike
+seamount
+seams
+seamster
+seamstress
+seamstresses
+seamy
+Sean
+Sean's
+seanad
+seance
+seaplane
+seaport
+seaport's
+seaports
+seaquake
+Seaquarium
+seaquarium
+sear
+search
+searchable
+searched
+searcher
+searcher's
+searchers
+searches
+searching
+searchingly
+searchings
+searchless
+searchlight
+searchlights
+seared
+searing
+searingly
+Searle
+sears
+seas
+seascape
+sease
+seashell
+seashell's
+seashells
+seashore
+seashore's
+seashores
+seasick
+seasickness
+seaside
+season
+season's
+seasonable
+seasonableness
+seasonably
+seasonal
+seasonality
+seasonally
+seasoned
+seasoner
+seasoners
+seasoning
+seasonings
+seasonly
+seasons
+seastrand
+seat
+seated
+seater
+seating
+seatmate
+seatmate's
+seatmates
+seato
+Seaton
+seats
+Seattle
+Seattle's
+seawall
+seawan
+seaward
+seawards
+seaware
+seawater
+seawater's
+seaway
+seaweed
+seaweeds
+seaworthiness
+seaworthy
+seaworthyness
+sebaceous
+sebacic
+Sebastian
+Sebastopol
+sebiferous
+seborrhea
+seborrheic
+Sebring
+Sebring's
+sebum
+sec
+secam
+secant
+secants
+secateur
+secateurs
+secco
+secede
+seceded
+seceder
+secedes
+seceding
+secern
+secession
+secessionism
+secessionist
+sech
+seclude
+secluded
+secludedly
+secludedness
+secludes
+secluding
+seclusion
+seclusive
+seclusively
+seclusiveness
+secobarbital
+second
+secondaries
+secondarily
+secondariness
+secondary
+seconded
+seconder
+seconders
+secondhand
+seconding
+secondly
+secondo
+seconds
+secrecy
+secret
+secretarial
+secretariat
+secretaries
+secretary
+secretary's
+secretaryship
+secrete
+secreted
+secretes
+secretin
+secreting
+secretion
+secretionary
+secretions
+secretive
+secretively
+secretiveness
+secretly
+secretor
+secretory
+secrets
+sect
+sect's
+sectarian
+sectarianism
+sectarianization
+sectarianize
+sectarianized
+sectarianizes
+sectarianizing
+sectary
+sectile
+sectility
+section
+sectional
+sectionalism
+sectionalization
+sectionalization's
+sectionalizations
+sectionalize
+sectionalized
+sectionalizes
+sectionalizing
+sectionally
+sectioned
+sectioning
+sectionize
+sectionizes
+sections
+sector
+sector's
+sectoral
+sectored
+sectorial
+sectoring
+sectors
+sects
+secular
+secularism
+secularist
+secularistic
+secularists
+secularity
+secularization
+secularization's
+secularizations
+secularize
+secularized
+secularizer
+secularizers
+secularizes
+secularizing
+secularly
+secund
+Secunderabad
+secundine
+secundines
+secure
+secured
+securely
+securement
+secureness
+securer
+secures
+securing
+securings
+securities
+security
+sedan
+sedans
+sedate
+sedated
+sedately
+sedateness
+sedates
+sedating
+sedation
+sedative
+seddon
+sedentary
+seder
+sedge
+Sedgemoor
+sedgwick
+Sedgwick
+sedgy
+sedilia
+sediment
+sediment's
+sedimentary
+sedimentation
+sedimentologic
+sedimentological
+sedimentologically
+sedimentologist
+sedimentology
+sediments
+sedition
+seditious
+seditiously
+seditiousness
+seduce
+seduced
+seducement
+seducer
+seducers
+seduces
+seducing
+seduction
+seductions
+seductive
+seductively
+seductiveness
+seductress
+sedulity
+sedulous
+sedulously
+sedulousness
+sedum
+see
+seeable
+Seebeck
+seed
+seedbed
+seedbeds
+seedcake
+seedcakes
+seeded
+seeder
+seeders
+seedier
+seedily
+seediness
+seeding
+seedings
+seedless
+seedlike
+seedling
+seedling's
+seedlings
+seedpod
+seeds
+seedsman
+seedtime
+seedy
+Seeger
+seeing
+seek
+seeker
+seekers
+seeking
+seekingly
+seeks
+seel
+Seeland
+Seeley
+seeley
+seem
+seemed
+seeming
+seemingly
+seemlier
+seemliness
+seemly
+seems
+seen
+seep
+seepage
+seeped
+seeping
+seeps
+seepy
+seer
+seeress
+seerey
+seers
+seersucker
+sees
+seesaw
+seesawed
+seesawing
+seesaws
+seethe
+seethed
+seethes
+seething
+seferis
+seg
+segetal
+segment
+segmental
+segmentally
+segmentary
+segmentation
+segmentation's
+segmentations
+segmented
+segmenting
+segments
+segno
+segnos
+Segovia
+segregant
+segregate
+segregated
+segregates
+segregating
+segregation
+segregationist
+segregative
+segue
+segue's
+segued
+segueing
+segues
+seguidilla
+Segundo
+segur
+segura
+sei
+seicento
+seiche
+Seidel
+Seidlitz
+seif
+Seifert
+seigneur
+seigneurial
+seigneury
+seignior
+seigniorage
+seigniory
+seignorage
+seignorial
+seignory
+seine
+seiner
+seining
+seise
+seisin
+seisins
+seism
+seismic
+seismicity
+seismism
+seismogram
+seismogram's
+seismograms
+seismograph
+seismographer
+seismographic
+seismographs
+seismography
+seismological
+seismologist
+seismology
+seismometer
+seismometric
+seismometry
+seismoscope
+seizable
+seize
+seized
+seizer
+seizers
+seizes
+seizin
+seizing
+seizings
+seizins
+seizor
+seizors
+seizure
+seizure's
+seizures
+selachian
+selaginella
+selah
+selangor
+selden
+seldom
+select
+selectable
+selected
+selectedly
+selectee
+selecting
+selection
+selection's
+selectional
+selections
+selective
+selectively
+selectiveness
+selectivity
+selectman
+selectmen
+selectness
+selector
+selector's
+selectors
+Selectric
+selects
+Selena
+Selena's
+selenate
+Selene
+selenic
+selenide
+seleniferous
+selenious
+selenite
+selenium
+selenocentric
+selenodont
+selenographer
+selenographic
+selenographist
+selenography
+selenological
+selenologist
+selenologist's
+selenologists
+selenology
+selenomorphology
+selenosis
+seleucia
+Seleucid
+seleucus
+self
+selfadjoint
+selfdom
+selfheal
+selfhood
+selfish
+selfishly
+selfishness
+selfless
+selflessly
+selflessness
+selfness
+Selfridge
+selfsame
+selfsameness
+Selig
+Seljuk
+Selkirk
+Selkirk's
+sell
+sellable
+selle
+seller
+sellers
+selling
+sellotape
+sellout
+sells
+Selma
+selsyn
+seltzer
+selva
+selvage
+selvaged
+selvedge
+selvedged
+selves
+Selwyn
+Selwyn's
+semanteme
+semantic
+semantical
+semantically
+semanticist
+semanticist's
+semanticists
+semantics
+semaphore
+semaphore's
+semaphores
+semarang
+semasiological
+semasiologist
+semasiology
+sematic
+sematology
+semblable
+semblably
+semblance
+semeiology
+semele
+sememe
+semen
+sement
+semeru
+semester
+semester's
+semesters
+semestral
+semestrial
+semi
+semiabstract
+semiabstraction
+semiannual
+semiannually
+semiaquatic
+semiarboreal
+semiarid
+semiaridity
+semiautomated
+semiautomatic
+semiautomatically
+semiautonomous
+semibasement
+semibituminous
+semibold
+semibreve
+semicarbonize
+semicarbonizes
+semicentenary
+semicentennial
+semicircle
+semicircles
+semicircular
+semicivilization
+semicivilization's
+semicivilizations
+semicivilized
+semicivilized's
+semicivilizeds
+semiclassic
+semiclassical
+semicolon
+semicolon's
+semicolonial
+semicolonialism
+semicolons
+semicolony
+semicommercial
+semicompile
+semiconducting
+semiconductor
+semiconductor's
+semiconductors
+semiconscious
+semiconsciously
+semiconsciousness
+semiconservative
+semiconservatively
+semicrystalline
+semicylindrical
+semidarkness
+semidefinite
+semidesert
+semidetached
+semidiameter
+semidiurnal
+semidivine
+semidocumentary
+semidome
+semidomed
+semidomestic
+semidomesticated
+semidomestication
+semidominant
+semidouble
+semidry
+semidrying
+semiellipse
+semielliptic
+semielliptical
+semiempirical
+semierect
+semievergreen
+semifinal
+semifinalist
+semifinished
+semifitted
+semiflexible
+semifluid
+semiformal
+semifossil
+semifossilized
+semifossilized's
+semifossilizeds
+semigloss
+semigovernmental
+semigroup
+semihonor
+semihonor's
+semihonors
+semihumanized
+semihumanized's
+semihumanizeds
+semilegendary
+semilethal
+semiliquid
+semiliterate
+semilog
+semilogarithmic
+semilunar
+semilustrous
+semimanufactures
+semimercerized
+semimercerized's
+semimercerizeds
+semimetal
+semimetallic
+semimicro
+semimineralized
+semimineralized's
+semimineralizeds
+semimoist
+semimonastic
+semimonthly
+semimystical
+seminal
+seminally
+seminar
+seminar's
+seminarian
+seminarians
+seminaries
+seminarist
+seminarize
+seminarizes
+seminars
+seminary
+seminary's
+semination
+seminationalization
+seminationalization's
+seminationalizations
+seminiferous
+Seminole
+seminumerical
+semiofficial
+semiofficially
+semiological
+semiology
+semiopaque
+semiorganized
+semiorganized's
+semiorganizeds
+semiosis
+semiotic
+semiotical
+semiotician
+semiotics
+semioxidized
+semioxidized's
+semioxidizeds
+semioxygenized
+semioxygenized's
+semioxygenizeds
+Semipalatinsk
+semipalmate
+semipalmated
+semiparasitic
+semipermanent
+semipermanently
+semipermeability
+semipermeable
+semiphore
+semipolitical
+semiporcelain
+semipostal
+semiprecious
+semiprivate
+semipro
+semiprofessional
+semiprofessionalized
+semiprofessionalized's
+semiprofessionalizeds
+semiprofessionally
+semiprofessionals
+semipublic
+semiquantitative
+semiquantitatively
+semiquaver
+semiramis
+semireligious
+semiretired
+semiretirement
+semirigid
+semisacred
+semisecret
+semisedentary
+semishrub
+semishrubby
+semiskilled
+semisoft
+semisolid
+semistructured
+semisweet
+semisynthetic
+Semite
+semiterrestrial
+semitic
+Semiticize
+Semiticizes
+Semitics
+semitics
+Semitization
+Semitization's
+Semitizations
+Semitize
+Semitizes
+semitonal
+semitonally
+semitone
+semitonic
+semitonically
+semitrailer
+semitrance
+semitranslucent
+semitransparent
+semitropic
+semitropical
+semitropics
+semivitreous
+semivocal
+semivowel
+semivulcanized
+semivulcanized's
+semivulcanizeds
+semiweekly
+semiworks
+semiyearly
+semmes
+semolina
+sempach
+semper
+sempervivum
+sempiternal
+sempiternally
+sempiternity
+semple
+semplice
+sempre
+sempstress
+semra
+sen
+sena
+senarii
+senarius
+senarmontite
+senary
+senate
+senate's
+senates
+senator
+senator's
+senatorial
+senatorian
+senators
+senatorship
+send
+sendable
+sendai
+sendal
+sender
+senders
+sending
+sendoff
+sends
+Seneca
+Senechal
+senecio
+senectitude
+senega
+Senegal
+senegambia
+senesac
+senescence
+senescent
+seneschal
+senghor
+sengi
+senhor
+senhora
+senhores
+senhorita
+senile
+senilely
+senilis
+senility
+senilize
+senilizes
+senior
+senior's
+senioritatis
+seniority
+seniors
+seniti
+Senlac
+senna
+sennacherib
+sennar
+sennet
+sennight
+sennit
+senor
+Senora
+senorita
+sens
+sensa
+sensate
+sensately
+sensation
+sensation's
+sensational
+sensationalism
+sensationalist
+sensationalistic
+sensationalize
+sensationalized
+sensationalizes
+sensationalizing
+sensationally
+sensations
+sense
+sensed
+senseful
+senseless
+senselessly
+senselessness
+senses
+sensibilia
+sensibilities
+sensibility
+sensible
+sensibleness
+sensibly
+sensillum
+sensing
+sensitive
+sensitively
+sensitiveness
+sensitives
+sensitivities
+sensitivity
+sensitization
+sensitization's
+sensitizations
+sensitize
+sensitized
+sensitizer
+sensitizers
+sensitizes
+sensitizing
+sensitometer
+sensitometer's
+sensitometers
+sensitometric
+sensitometry
+sensize
+sensizes
+sensor
+sensor's
+sensorial
+sensorially
+sensorimotor
+sensorineural
+sensorium
+sensors
+sensory
+sensual
+sensualism
+sensualist
+sensualistic
+sensuality
+sensualization
+sensualization's
+sensualizations
+sensualize
+sensualized
+sensualizes
+sensualizing
+sensually
+sensum
+sensuosity
+sensuous
+sensuously
+sensuousness
+sent
+sentence
+sentenced
+sentences
+sentencing
+sententia
+sentential
+sententially
+sententious
+sententiously
+sententiousness
+senti
+sentience
+sentient
+sentiently
+sentiment
+sentiment's
+sentimental
+sentimentalism
+sentimentalist
+sentimentalists
+sentimentality
+sentimentalization
+sentimentalization's
+sentimentalizations
+sentimentalize
+sentimentalized
+sentimentalizer
+sentimentalizers
+sentimentalizes
+sentimentalizing
+sentimentally
+sentiments
+sentinel
+sentinel's
+sentineled
+sentineling
+sentinels
+sentries
+sentry
+sentry's
+senussi
+Seoul
+Sep
+sepal
+sepaled
+sepaloid
+separability
+separable
+separableness
+separably
+separate
+separated
+separately
+separateness
+separates
+separating
+separation
+separationist
+separations
+separatism
+separatist
+separatistic
+separative
+separator
+separator's
+separators
+Sephardi
+sepia
+sepiolite
+Sepoy
+seppuku
+sepses
+sepsis
+sept
+septa
+septal
+septarium
+septate
+septation
+septavalent
+September
+September's
+Septembers
+Septembrist
+septenarius
+septenary
+septendecillion
+septennial
+septennially
+septennium
+septentrion
+septentrional
+septet
+septic
+septicaemia
+septicemia
+septicemic
+septicidal
+septicization
+septicization's
+septicizations
+septifragal
+septilateral
+septillion
+septime
+septivalent
+septuagenarian
+septuagesima
+Septuagint
+septum
+septuple
+septuplet
+septuplicate
+sepuchral
+sepulcher
+sepulcher's
+sepulchered
+sepulchers
+sepulchral
+sepulchralize
+sepulchralizes
+sepulchrally
+sepulture
+seq
+sequacious
+sequaciously
+sequacity
+sequel
+sequel's
+sequela
+sequelae
+sequels
+sequence
+sequenced
+sequencer
+sequencers
+sequences
+sequencing
+sequencings
+sequency
+sequent
+sequential
+sequentiality
+sequentialize
+sequentialized
+sequentializes
+sequentializing
+sequentially
+sequester
+sequestered
+sequestering
+sequestrant
+sequestrate
+sequestration
+sequestrum
+sequin
+sequined
+sequinned
+sequins
+sequitur
+sequoia
+ser
+sera
+serac
+Serafin
+serafin
+seraglio
+serai
+serajevo
+seral
+seram
+serang
+serape
+seraph
+seraphic
+seraphically
+seraphim
+seraphs
+Serapis
+Serb
+serbantian
+Serbia
+Serbia's
+Serbian
+serbian
+Serbo
+sercq
+serdab
+sere
+serein
+seremban
+serenade
+serenaded
+serenader
+serenades
+serenata
+serendipitous
+serendipitously
+serendipity
+serene
+serenely
+sereneness
+serenity
+serenize
+serenizes
+serf
+serf's
+serfage
+serfdom
+serfs
+serge
+sergeancy
+sergeant
+sergeant's
+sergeants
+sergeanty
+Sergei
+Sergei's
+serging
+sergipe
+serial
+serialism
+serialist
+serializability
+serializable
+serialization
+serialization's
+serializations
+serialize
+serialized
+serializes
+serializing
+serially
+serials
+seriate
+seriately
+seriatim
+sericeous
+sericin
+sericultural
+sericulture
+sericulturist
+seriema
+series
+serieuses
+serif
+serigraph
+serigrapher
+serigraphy
+serin
+serine
+seringa
+seringapatam
+seriocomic
+seriocomically
+serious
+seriously
+seriousness
+serjeant
+serjeants
+serjeanty
+Serkin
+sermon
+sermon's
+sermonic
+sermonize
+sermonized
+sermonizer
+sermonizers
+sermonizes
+sermonizing
+sermons
+serodiagnosis
+serodiagnostic
+serologic
+serological
+serologically
+serologist
+serology
+seropurulent
+serosa
+serosal
+serotinal
+serotine
+serotinous
+serotonin
+serotype
+serous
+serow
+Serpens
+serpent
+serpent's
+serpentine
+serpentinely
+serpentinization
+serpentinization's
+serpentinizations
+serpentinize
+serpentinizes
+serpentize
+serpentizes
+serpents
+serpiginous
+serpiginously
+serpigo
+serpulid
+serra
+Serra
+serranid
+serranoid
+serrate
+serrated
+serrates
+serrating
+serration
+serratus
+serried
+serriedly
+serriedness
+serriform
+serrulate
+serrulation
+serry
+serrying
+serting
+sertive
+sertorius
+sertularian
+serum
+serum's
+serums
+serval
+servanda
+servant
+servant's
+servants
+servation
+servatius
+serve
+served
+server
+server's
+servers
+serves
+servetus
+servia
+service
+serviceability
+serviceable
+serviceableness
+serviceably
+serviceberry
+serviced
+serviceman
+servicemen
+servicer
+services
+servicewoman
+servicewomen
+servicing
+servient
+serviette
+serviettes
+servile
+servilely
+servileness
+servility
+servilize
+servilizes
+serving
+servings
+servitor
+servitors
+servitude
+servo
+servomechanism
+servomechanisms
+servomotor
+servos
+servosystem
+servosystems
+sesame
+sesamoid
+sesotho
+sesquialtera
+sesquicarbonate
+sesquicentenary
+sesquicentennial
+sesquioxide
+sesquipedalian
+sessed
+sesshu
+sessile
+sessility
+session
+session's
+sessional
+sessions
+sesterce
+sestertium
+sestet
+sestina
+sestos
+set
+set's
+seta
+setaceous
+setaceously
+setae
+setal
+setback
+setbacks
+Seth
+Seth's
+setiferous
+setiform
+setline
+setnm
+seto
+setoff
+setom
+Seton
+setose
+setout
+setpoint
+setpoints
+sets
+setscrew
+setscrews
+sett
+settable
+settee
+settees
+setter
+setter's
+setters
+setting
+settings
+settle
+settled
+settlement
+settlement's
+settlements
+settler
+settlers
+settles
+settling
+settlings
+settlor
+setup
+setups
+setz
+setzb
+setzm
+seurat
+sevan
+Sevastopol
+sevec
+seven
+sevenfold
+sevens
+seventeen
+seventeens
+seventeenth
+seventh
+sevenths
+seventies
+seventieth
+seventy
+seventyfold
+sever
+severability
+severable
+several
+severalfold
+severalize
+severalizes
+severally
+severals
+severalty
+severance
+severe
+severed
+severely
+severeness
+severer
+severest
+severing
+severities
+severity
+severity's
+severization
+severization's
+severizations
+severize
+severizes
+Severn
+Severn's
+severna
+Severnaya
+severs
+Severus
+sevigli
+Seville
+sew
+sewage
+sewan
+Seward
+sewed
+sewell
+sewer
+sewerage
+sewers
+sewickley
+sewing
+sewn
+sews
+sex
+sexagenarian
+Sexagesima
+sexagesimal
+sexangular
+sexcentenary
+sexdecillion
+sexed
+sexennial
+sexes
+sexier
+sexily
+sexiness
+sexism
+sexism's
+sexist
+sexist's
+sexists
+sexivalent
+sexless
+sexlessly
+sexlessness
+sexology
+sexpartite
+sexpot
+sext
+sextain
+sextan
+Sextans
+sextant
+sextet
+sextic
+sextile
+sextillion
+sexto
+sextodecimo
+sexton
+sextos
+sextuor
+sextuple
+sextupled
+sextuplet
+sextuplicate
+sextupling
+sexual
+sexuality
+sexualization
+sexualization's
+sexualizations
+sexualize
+sexualized
+sexualizes
+sexually
+sexy
+sey
+Seychelles
+seyfert
+seyhan
+Seymour
+sfax
+sforza
+sforzando
+sfumato
+sgraffito
+shaba
+Shaban
+shabbat
+shabbier
+shabbily
+shabbiness
+shabby
+Shabuoth
+shack
+shacked
+shackle
+shacklebone
+shackled
+shackler
+shackles
+Shackleton
+shackling
+shacks
+shad
+shadberry
+shadblow
+shadbush
+shaddock
+shade
+shaded
+shadeless
+shader
+shades
+shadflower
+shadier
+shadiest
+shadily
+shadiness
+shading
+shadings
+shadoof
+shadow
+shadowbox
+shadowed
+shadower
+shadowgraph
+shadowily
+shadowiness
+shadowing
+shadowless
+shadowlike
+shadows
+shadowy
+shadrach
+shaduf
+shadwell
+shady
+shaef
+Shafer
+Shafer's
+Shaffer
+Shaffer's
+shaft
+shaft's
+shafted
+shaftesbury
+shafting
+shafts
+shaftsbury
+shag
+shagbark
+shaggier
+shaggily
+shagginess
+shagging
+shaggy
+shaggymane
+shagreen
+shags
+shah
+shahaptin
+shahdom
+shahjahanpur
+shahn
+shaitan
+Shaka
+shakable
+shakably
+shake
+shakeable
+shakedown
+shaken
+shakeout
+shaker
+shakers
+shakes
+Shakespeare
+Shakespearean
+Shakespearian
+Shakespearize
+Shakespearizes
+shakhty
+shakier
+shakily
+shakiness
+shaking
+shako
+shakoes
+Shakta
+Shakti
+shaky
+shakya
+shale
+shales
+shall
+shalloon
+shallop
+shallot
+shallow
+shallower
+shallowly
+shallowness
+shallows
+shalom
+shalt
+sham
+sham's
+shaman
+shamanism
+shamanist
+shamanistic
+shamash
+shamba
+shamble
+shambled
+shambles
+shambling
+shame
+shamed
+shameface
+shamefaced
+shamefacedly
+shamefacedness
+shamefast
+shameful
+shamefully
+shamefulness
+shameless
+shamelessly
+shamelessness
+shames
+shaming
+shammer
+shammes
+shamming
+shammosim
+shammy
+shamo
+shampoo
+shampooer
+shampoos
+shamrock
+shams
+shamus
+shan
+shan't
+shandies
+shandrydan
+shandy
+shandygaff
+Shang
+shangaan
+Shanghai
+shanghaied
+shanghaier
+Shanghaiing
+shango
+shank
+Shankar
+Shankaracharya
+shanked
+shankpiece
+Shannon
+shanny
+shansi
+shantey
+shanties
+shantow
+Shantung
+shanty
+shanty's
+shantyman
+shantytown
+shapable
+shape
+shapeable
+shaped
+shapeless
+shapelessly
+shapelessness
+shapelier
+shapeliness
+shapely
+shapen
+shaper
+shapers
+shapes
+shaping
+Shapiro
+sharable
+shard
+shards
+share
+shareability
+shareable
+sharecrop
+sharecropper
+sharecropper's
+sharecroppers
+sharecropping
+shared
+sharefarmer
+sharefarmers
+shareholder
+shareholder's
+shareholders
+shareown
+sharer
+sharers
+shares
+Shari
+Shari's
+Sharia
+sharing
+shark
+shark's
+sharks
+sharkskin
+sharksucker
+Sharon
+sharp
+Sharpe
+sharped
+sharpen
+sharpened
+sharpener
+sharpening
+sharpens
+sharper
+sharpest
+sharpie
+sharpies
+sharping
+sharply
+sharpness
+sharps
+sharpshoot
+sharpshooter
+sharpshooters
+sharpshooting
+sharpy
+sharrow
+shashlick
+shashlik
+Shasta
+shatilov
+shatter
+shattered
+shattering
+shatteringly
+shatterproof
+shatters
+Shattuck
+Shattuck's
+shave
+shaved
+shaveling
+shaven
+shaver
+shaves
+shavetail
+Shavian
+shavie
+shaving
+shavings
+shavuot
+shaw
+Shaw
+Shawano
+shawano
+shawl
+shawl's
+shawls
+shawm
+Shawnee
+shawomet
+Shawwal
+shay
+shayne
+shayol
+shays
+Shchedrin
+Shcheglovsk
+Shcherbakov
+she
+she'd
+she'll
+she's
+Shea
+sheading
+sheaf
+sheaflike
+sheahe
+shear
+sheared
+shearer
+shearers
+shearing
+shearlegs
+shearling
+shearn
+shears
+shearwater
+sheatfish
+sheath
+sheathbill
+sheathe
+sheather
+sheathing
+sheaths
+sheave
+sheaves
+sheaving
+sheba
+shebang
+shebeen
+sheboygan
+Sheboygan
+Shechem
+shechina
+shed
+shedded
+shedder
+shedding
+Shedir
+sheds
+Sheehan
+Sheehan's
+sheen
+sheene
+sheeny
+sheep
+sheepcote
+sheepdog
+sheepfold
+sheepherder
+sheepherding
+sheepish
+sheepishly
+sheepishness
+sheepshank
+sheepshead
+sheepshearer
+sheepshearing
+sheepskin
+sheepwalk
+sheer
+sheeran
+sheered
+sheerlegs
+sheerly
+sheerness
+sheet
+sheeted
+sheeter
+sheetfed
+sheeting
+sheetlike
+sheets
+Sheffield
+Sheffielder
+Sheffielders
+sheik
+sheikdom
+sheikh
+sheikhdom
+Sheila
+shekel
+Shekinah
+shelagh
+Shelby
+Sheldon
+shelf
+shelfful
+shelflike
+shelfs
+shell
+shell's
+shellac
+shellacked
+shellacking
+shellback
+shellback's
+shellbacks
+shellbark
+shellcracker
+shelled
+sheller
+Shelley
+shellfire
+shellfish
+shelling
+shellproof
+shells
+shellwork
+shelly
+shelta
+shelter
+shelterbelt
+sheltered
+shelterer
+sheltering
+shelterless
+shelters
+sheltie
+shelties
+Shelton
+shelty
+shelve
+shelved
+shelver
+shelves
+shelving
+shem
+shema
+shembe
+Shemite
+Shemitic
+Shenandoah
+shenanigan
+shenanigans
+shend
+shending
+shensi
+shenyang
+Sheol
+shep
+Shepard
+shepherd
+shepherd's
+shepherded
+shepherdess
+shepherding
+shepherdize
+shepherdizes
+shepherds
+Sheppard
+Sheppard's
+sher
+Sheraton
+sherbert
+sherbet
+sherbrooke
+sherd
+Sheri
+Sheri's
+sheria
+Sheridan
+sherif
+sheriff
+sheriff's
+sheriffdom
+sheriffs
+sherlock
+Sherman
+Sherpa
+sherries
+Sherrill
+Sherrill's
+Sherrington
+sherris
+sherry
+sherwani
+Sherwin
+Sherwood
+shes
+Shetland
+shetlands
+shevelling
+shew
+shewbread
+shewe
+shewn
+shews
+shh
+Shiah
+shiai
+shibboleth
+shibboleths
+shicker
+shickered
+shied
+shiel
+shield
+shielded
+shielder
+shielding
+shields
+shieling
+shier
+shies
+shiest
+shietz
+shiflett
+shift
+shiftable
+shifted
+shifter
+shifters
+shiftier
+shiftiest
+shiftily
+shiftiness
+shifting
+shiftless
+shiftlessly
+shiftlessness
+shifts
+shifty
+shigella
+shih
+shihchiachuang
+Shiism
+Shiite
+Shiite's
+Shiites
+shikar
+shikari
+shikarred
+shikarring
+shikoku
+shiksa
+shikse
+shilingi
+shill
+shillalah
+shillelagh
+shilling
+shillings
+Shillong
+shillong
+shills
+shillyshally
+Shiloh
+shily
+shim
+shimmer
+shimmered
+shimmering
+shimmery
+shimmied
+shimmies
+shimming
+shimmy
+shimmying
+Shimonoseki
+shims
+shin
+shinar
+shinbone
+shindies
+shindig
+shindig's
+shindigs
+shindy
+shine
+shined
+shiner
+shiners
+shines
+shingle
+shingle's
+shingled
+shingler
+shingles
+shingling
+shingly
+shinier
+shininess
+shining
+shiningly
+shinkin
+shinleaf
+shinleafs
+shinnery
+shinney
+shinnied
+shinning
+shinny
+shinnying
+shinplaster
+shinsplints
+Shinto
+Shintoism
+Shintoize
+Shintoizes
+shinty
+shiny
+ship
+ship's
+shipboard
+shipboards
+shipborne
+shipbuild
+shipbuilder
+shipbuilding
+shipfitter
+shipka
+shiplap
+Shipley
+shipload
+shipman
+shipmaster
+shipmate
+shipmates
+shipmen
+shipment
+shipment's
+shipments
+shipowner
+shippable
+shipped
+shipper
+shipper's
+shippers
+shipping
+ships
+shipshape
+shipside
+shipway
+shipworm
+shipwreck
+shipwrecked
+shipwrecks
+shipwright
+shipyard
+shipyards
+shiralee
+Shiraz
+shire
+shires
+shirk
+shirker
+shirking
+shirks
+Shirley
+shirr
+shirring
+shirt
+shirting
+shirtmake
+shirtmaker
+shirts
+shirtsleeve
+shirttail
+shirtwaist
+shirtwaister
+shirty
+shish
+shit
+shitepoke
+shithead
+shittah
+shittim
+shiv
+shiva
+Shiva
+Shiva's
+shivaree
+shive
+shiver
+shivered
+shiverer
+shivering
+shivers
+shivery
+shizuoka
+shlemiehl
+shlock
+Shluh
+Shmuel
+sho
+Shoa
+shoal
+shoal's
+shoals
+shoat
+shock
+shocked
+shocker
+shockers
+shockheaded
+shocking
+shockingly
+Shockley
+Shockley's
+shockproof
+shocks
+shockstall
+shod
+shoddier
+shoddily
+shoddiness
+shoddy
+shoe
+shoebill
+shoeblack
+shoed
+shoehorn
+shoeing
+shoelace
+shoelaces
+shoemake
+shoemaker
+shoemakers
+shoepac
+shoepack
+shoer
+shoes
+shoeshine
+shoestring
+shoestrings
+shoetree
+shofar
+shogun
+shogunate
+sholapur
+Sholokhov
+sholom
+Shona
+shone
+shoo
+shoofly
+shoogle
+shooing
+shook
+shool
+shoon
+shoot
+shooter
+shooters
+shooting
+shootings
+shootout
+shootout's
+shootouts
+shoots
+shop
+shop's
+shopfloor
+shopfloors
+shophar
+shopkeep
+shopkeeper
+shopkeeper's
+shopkeepers
+shoplift
+shoplifter
+shoplifters
+shoplifting
+shoppe
+shopped
+shopper
+shopper's
+shoppers
+shopping
+shops
+shopsoiled
+shoptalk
+shopwalker
+shopwork
+shopworker
+shopworn
+shoran
+shore
+shore's
+shorebird
+shorebird's
+shorebirds
+shored
+shorefront
+shoreless
+shoreline
+shorelines
+shores
+shoreside
+shoreward
+shorewards
+Shorewood
+shoring
+shorn
+short
+shortage
+shortage's
+shortages
+shortbread
+shortcake
+shortchange
+shortchanger
+shortcoming
+shortcoming's
+shortcomings
+shortcut
+shortcut's
+shortcuts
+shorted
+shorten
+shortened
+shortener
+shortening
+shortens
+shorter
+shortest
+shortfall
+shortfalls
+shorthand
+shorthanded
+shorthands
+shorthorn
+shortie
+shorties
+shorting
+shortish
+shortliffe
+shortlist
+shortlisted
+shortlisting
+shortlists
+shortlived
+shortly
+shortness
+shorts
+shortsighted
+shortsightedly
+shortsightedness
+shortstop
+shorty
+Shoshone
+shoshone
+Shoshone's
+Shoshonean
+Shostakovich
+shot
+shot's
+shotbush
+shote
+shotgun
+shotgun's
+shotguns
+shotline
+shotlines
+shots
+shott
+shotten
+should
+shoulder
+shouldered
+shouldering
+shoulders
+shouldest
+shouldn't
+shouldst
+shoup
+shouse
+shout
+shouted
+shouter
+shouters
+shouting
+shouts
+shove
+shoved
+shovel
+shoveled
+shoveler
+shovelers
+shovelful
+shovelhead
+shoveling
+shovelman
+shovelnose
+shovels
+shovelsful
+shover
+shoves
+shoving
+show
+showboat
+showbread
+showcase
+showcase's
+showcased
+showcases
+showcasing
+showd
+showdown
+showed
+shower
+showered
+showering
+showerproof
+showers
+showery
+showgirl
+showier
+showily
+showiness
+showing
+showings
+showjumping
+showman
+showmanship
+showmen
+shown
+showpiece
+showplace
+showroom
+shows
+showstopper
+showy
+shrank
+shrapnel
+shred
+shred's
+shredded
+shredder
+shredder's
+shredders
+shredding
+shreds
+Shreveport
+shrew
+shrew's
+shrewd
+shrewdest
+shrewdie
+shrewdly
+shrewdness
+shrewish
+shrewishly
+shrewishness
+shrewmouse
+shrews
+Shrewsbury
+shriek
+shrieked
+shrieking
+shrieks
+shrieval
+shrievalty
+shrieve
+shrift
+shrike
+shrill
+shrilled
+shrilling
+shrillness
+shrilly
+shrimp
+shrimpy
+shrine
+shrine's
+shrines
+shrink
+shrinkable
+shrinkage
+shrinker
+shrinking
+shrinks
+shrive
+shrived
+shrivel
+shriveled
+shriveling
+shrivels
+shriven
+shriver
+shroff
+Shropshire
+shroud
+shrouded
+shrouding
+shrouds
+shrove
+Shrovetide
+shrub
+shrub's
+shrubbery
+shrubbier
+shrubby
+shrubs
+shrug
+shrugged
+shrugging
+shrugs
+shrunk
+shrunken
+shtetel
+shtetl
+shtetlach
+shtg
+shtick
+Shu
+Shu's
+shuck
+shucker
+shucks
+shudder
+shuddered
+shuddering
+shudders
+shuddery
+shuffle
+shuffleboard
+shuffled
+shuffler
+shuffles
+shuffling
+shufty
+shufu
+shuggy
+shuiski
+shul
+Shulamite
+shulde
+Shulman
+Shulman's
+shun
+shunned
+shunner
+shunning
+shunpike
+shunpiker
+shunpiking
+shuns
+shunt
+shunted
+shunter
+shunting
+shunts
+shush
+shushan
+shut
+shutdown
+shutdown's
+shutdowns
+shute
+shuteye
+shutoff
+shutout
+shuts
+shutter
+shutterbug
+shuttered
+shuttering
+shutterless
+shutters
+shutting
+shuttle
+shuttlecock
+shuttlecocks
+shuttled
+shuttles
+shuttling
+shuz
+shy
+shyer
+shyes
+shyest
+shying
+Shylock
+Shylockian
+shylockian
+shyly
+shyness
+shypoo
+shyster
+si
+sialagogue
+sialkot
+sialoid
+SIAM
+siamang
+Siamese
+Sian
+Sian's
+siang
+siangtan
+sib
+sibe
+Sibelius
+Siberia
+Siberian
+sibilant
+sibilantly
+sibilate
+sibilation
+sibiu
+Sibley
+sibling
+sibling's
+siblings
+sibly
+sibyl
+sibylic
+sibylla
+sibyllic
+sibylline
+sibyls
+sic
+Sicanian
+siccative
+siccing
+sicilia
+Sicilian
+Siciliana
+siciliana
+Sicilians
+Sicily
+sick
+sickbay
+sickbed
+sickbed's
+sickbeds
+sicken
+sickened
+sickener
+sickening
+sickeningly
+sicker
+sickerly
+sickert
+sickest
+sickie
+sicking
+sickish
+sickishly
+sickishness
+sickle
+sicklebill
+sickled
+sicklemia
+sicklewort
+sicklied
+sicklily
+sickliness
+sickling
+sickly
+sicklying
+sickness
+sickness's
+sicknesses
+sickroom
+sicks
+sicyon
+sid
+Siddhartha
+siddo
+siddons
+siddur
+siddurim
+side
+sidearm
+sidearms
+sideband
+sidebands
+sideboard
+sideboard's
+sideboards
+sideburned
+sideburns
+sidecar
+sidecars
+sidechain
+sidechains
+sided
+sidedness
+sidedress
+sideffect
+sideffects
+sidehill
+sidekick
+sidekicks
+sidelight
+sidelight's
+sidelights
+sideline
+sideliner
+sidelines
+sideling
+sidelong
+sideman
+sidemen
+sidency
+sident
+sidepiece
+sideplate
+sideplates
+sidereal
+siderealize
+siderealizes
+siderite
+sideritic
+siderolite
+siderophilin
+siderosis
+siderostat
+sides
+sidesaddle
+sideshow
+sideshows
+sideslip
+sideslips
+sidesman
+sidespin
+sidesplitting
+sidestep
+sidestepped
+sidestepper
+sidestepping
+sidesteps
+sidestroke
+sideswipe
+sidetrack
+sidetracked
+sidetracking
+sidetracks
+sidewalk
+sidewalk's
+sidewalks
+sidewall
+sideward
+sidewards
+sideway
+sideways
+sidewheel
+sidewheeler
+sidewinder
+sidewise
+sidi
+siding
+sidings
+sidle
+sidled
+sidles
+sidling
+Sidney
+sidon
+sidra
+SIDS
+sie
+sieben
+siebern
+siecle
+siecles
+siegbahn
+siege
+siege's
+Siegel
+Siegel's
+sieges
+Siegfried
+sieging
+siegler
+Sieglinda
+Sieglinda's
+sieglinde
+Siegmund
+Siegmund's
+Siemens
+Siena
+sienkiewicz
+sienna
+siepi
+Sierra
+sierra
+sierran
+sierras
+siesta
+sieux
+sieve
+sieve's
+sievers
+sieves
+sieving
+sifaka
+Sifford
+sift
+sifted
+sifter
+sifting
+siftings
+sifts
+sig
+SIGABRT
+SIGALRM
+SIGBUS
+SIGCHLD
+SIGCLD
+SIGCONT
+SIGEMT
+SIGFPE
+Siggraph
+sigh
+sighed
+sigher
+sighing
+sighs
+sight
+sighted
+sighter
+sighting
+sightings
+sightless
+sightlessness
+sightliness
+sightly
+sights
+sightscreen
+sightsee
+sightseeing
+sightseer
+sightseers
+SIGHUP
+Sigil
+sigil
+SIGILL
+SIGINT
+SIGIO
+SIGIOT
+sigismund
+SIGKILL
+sigla
+siglos
+sigma
+sigmas
+sigmate
+sigmoid
+sigmoidal
+sigmoidally
+sigmoidoscope
+Sigmund
+sign
+signac
+signal
+signaled
+signaler
+signalers
+signaling
+signalization
+signalize
+signalized
+signalizes
+signalizing
+signally
+signalman
+signalmen
+signalment
+signals
+signatories
+signatory
+signature
+signature's
+signatures
+signboard
+signed
+signer
+signers
+signet
+signifiable
+significance
+significances
+significancy
+significant
+significantly
+significants
+signification
+significative
+significatively
+significativeness
+significs
+signified
+signifier
+signifies
+signify
+signifying
+signing
+signior
+signiories
+signiory
+Signor
+Signora
+signore
+signorelli
+signori
+signories
+signorina
+signorino
+signory
+signpost
+signposted
+signposting
+signposts
+signs
+SIGPIPE
+SIGPROF
+SIGQUIT
+SIGSEGV
+SIGSTOP
+SIGSYS
+SIGTERM
+SIGTRAP
+SIGTSTP
+SIGTTIN
+SIGTTOU
+sigurd
+SIGURG
+SIGUSR
+SIGVTALRM
+SIGWINCH
+SIGXCPU
+SIGXFSZ
+Sihanouk
+Sika
+sikang
+sike
+Sikh
+Sikh's
+Sikhes
+Sikhs
+siking
+Sikkim
+Sikkim's
+Sikkimese
+Sikorsky
+silage
+silane
+Silas
+silastic
+sild
+silds
+sile
+silence
+silenced
+silencer
+silencers
+silences
+silencing
+silent
+silently
+silentness
+silents
+silenus
+silesia
+silex
+silhouette
+silhouetted
+silhouettes
+silica
+silicate
+silicates
+silicatization
+silicatization's
+silicatizations
+siliceous
+silicic
+silicicolous
+silicide
+silicidize
+silicidizes
+siliciferous
+silicification
+silicify
+silicious
+silicium
+silicle
+silicon
+silicone
+siliconize
+siliconizes
+silicons
+silicosis
+silicothermic
+silicotic
+siliculose
+siliqua
+silique
+silk
+silkaline
+silke
+silken
+silkier
+silkiest
+silkily
+silkiness
+silkoline
+silks
+silkweed
+silkworm
+silkworms
+silky
+sill
+sill's
+sillabub
+sillier
+silliest
+sillily
+sillimanite
+silliness
+sills
+silly
+silo
+siloam
+silone
+silos
+siloxane
+silt
+siltation
+silted
+silting
+silts
+siltstone
+siltstones
+silty
+Silures
+Silurian
+silurid
+siluroid
+silva
+silvan
+Silvanus
+silvas
+silver
+silvered
+silverer
+silverfish
+silveriness
+silvering
+silverize
+silverizer
+silverizers
+silverizes
+silverly
+Silverman
+silvern
+silverpoint
+silvers
+silverside
+silversides
+silversmith
+silversmiths
+Silverstein
+Silverstein's
+silvertail
+silverware
+silverweed
+silvery
+silvical
+silvicolous
+silvics
+silvicultural
+silviculturally
+silviculture
+silviculturist
+simar
+Simarouba
+simaroubaceous
+simazine
+simba
+Simbirsk
+simca
+simchath
+SIMD
+Simeon
+Simferopol
+simian
+similar
+similarities
+similarity
+similarize
+similarizes
+similarly
+simile
+similitude
+similize
+similizes
+simitar
+Simla
+simla
+simmel
+simmer
+simmered
+simmering
+simmers
+Simmons
+Simmonsville
+simms
+Simms
+simnel
+simoleon
+Simon
+simoniac
+simonides
+simonize
+Simonson
+Simonson's
+simony
+simoom
+simoon
+simp
+simpatico
+simper
+simpered
+simperer
+simpering
+simpers
+simple
+simpleminded
+simplemindedly
+simplemindedness
+simpleness
+simpler
+simples
+simplest
+simpleton
+simplex
+simplexes
+simplices
+simplicial
+simplicially
+simplicidentate
+simplicities
+simplicity
+simplicity's
+simplification
+simplifications
+simplifiction
+simplified
+simplifier
+simplifiers
+simplifies
+simplify
+simplifying
+simplism
+simplistic
+simplistically
+simplon
+simply
+Simpson
+Sims
+simsim
+simula
+simulacre
+simulacrum
+simulant
+simular
+simulate
+simulated
+simulates
+simulating
+simulation
+simulations
+simulative
+simulator
+simulator's
+simulators
+simulcast
+simultaneity
+simultaneous
+simultaneously
+simultaneousness
+sin
+sin's
+Sinai
+Sinaloa
+sinan
+sinanthropus
+sinapism
+sinarquist
+sinatra
+Sinatra
+Sinbad
+Sinbad's
+since
+sincere
+sincerely
+sincereness
+sincerest
+sincerity
+sincipita
+sincipital
+sinciput
+Sinclair
+sind
+Sindhi
+sine
+sinecure
+sines
+sinew
+sinew's
+sinews
+sinewy
+sinfonia
+sinfonietta
+sinful
+sinfully
+sinfulness
+sing
+singable
+Singapore
+Singapore's
+Singborg
+singe
+singed
+singeing
+singer
+singer's
+singers
+Singhalese
+singing
+singingly
+single
+singled
+singlehanded
+singlehandedly
+singleminded
+singleness
+singles
+singlestick
+singlet
+singleton
+singleton's
+singletons
+singletree
+singling
+singly
+sings
+singsong
+singsonged
+singsongy
+singspiel
+singular
+singularities
+singularity
+singularity's
+singularization
+singularization's
+singularizations
+singularize
+singularizes
+singularly
+singultus
+sinh
+sinhailien
+Sinhalese
+siniboia
+Sinicism
+sinicize
+sinicized
+sinicizes
+sinicizing
+sining
+sinister
+sinisterly
+sinisterness
+sinistral
+sinistrally
+sinistrodextral
+sinistrorse
+sinistrous
+Sinitic
+sink
+sinkable
+sinkage
+sinked
+sinker
+sinkers
+sinkhole
+sinkholes
+sinking
+sinks
+sinless
+sinlessly
+sinlessness
+sinn
+sinned
+sinner
+sinner's
+sinners
+sinning
+Sino
+sinoatrial
+sinological
+sinologist
+sinologue
+sinology
+sinopia
+Sinopoli
+sins
+sinsyne
+sint
+sinter
+sinterability
+sintered
+sinton
+Sintow
+sinuate
+sinuately
+sinuatrial
+sinuosity
+sinuous
+sinuousities
+sinuously
+sinuousness
+sinus
+sinuses
+sinusitis
+sinusoid
+sinusoidal
+sinusoidally
+sinusoids
+sion
+Siouan
+Sioux
+sip
+siphon
+siphon's
+siphoned
+siphoning
+siphonless
+siphonlesses
+siphonlike
+siphonlike's
+siphonlikes
+siphonophore
+siphonostele
+siphonostelic
+siphonostely
+siphons
+siple
+sipped
+sipper
+sippers
+sippet
+sipping
+sips
+siqueiros
+sir
+Siracusa
+sirdar
+sire
+sired
+siree
+siren
+sirenian
+sirenize
+sirenizes
+sirens
+sires
+siret
+siring
+Sirius
+sirloin
+sirocco
+sirra
+sirrah
+sirree
+sirs
+sirup
+sirupy
+sirvente
+sirventes
+sis
+sisal
+sisera
+siskin
+Sisley
+sismondi
+sissies
+sissified
+sissy
+sister
+sister's
+sistered
+sisterhood
+sistering
+sisterize
+sisterizes
+sisterly
+sisters
+Sistine
+sistrum
+Sisyphean
+Sisyphus
+sit
+Sitar
+sitar
+Sitarist
+sitcom
+site
+site's
+sited
+sitella
+sites
+sitfast
+sith
+sithole
+siting
+Sitka
+sitology
+sitosterol
+sits
+sitsang
+sitter
+sitter's
+sitters
+sitting
+sittings
+situ
+situate
+situated
+situates
+situating
+situation
+situational
+situationally
+situations
+situla
+situs
+sitwell
+sitz
+sitzkrieg
+sitzmark
+Siva
+siva
+Sivaism
+Sivan
+sivas
+Siwash
+six
+sixain
+sixes
+sixfold
+sixgun
+sixmo
+sixmos
+sixpence
+sixpences
+sixpenny
+sixte
+sixteen
+sixteenmo
+sixteens
+sixteenth
+sixth
+sixthly
+sixths
+sixties
+sixtieth
+Sixtus
+sixty
+sixtyfold
+sizable
+sizableness
+sizably
+sizar
+size
+sizeable
+sized
+sizer
+sizers
+sizes
+sizing
+sizings
+sizova
+sizzle
+sizzled
+sizzler
+sizzling
+sjambok
+skag
+skagen
+skagerrak
+skald
+skaldic
+skara
+skat
+skate
+skateboard
+skateboard's
+skateboarder
+skateboarding
+skateboards
+skated
+skatepark
+skater
+skater's
+skaters
+skates
+skating
+skatole
+skaw
+skean
+skedaddle
+skedaddled
+skedaddler
+skedaddles
+skedaddling
+skeet
+skeeter
+skeg
+skeigh
+skein
+skein's
+skeins
+skeleta
+skeletal
+skeletally
+skeleton
+skeleton's
+skeletonization
+skeletonization's
+skeletonizations
+skeletonize
+skeletonized
+skeletonizer
+skeletonizers
+skeletonizes
+skeletonizing
+skeletons
+skelf
+skellum
+skelly
+skelmersdale
+skelp
+skelping
+skelpit
+skelter
+skeltered
+skeltering
+Skelton
+sken
+skene
+skep
+skepsis
+skeptic
+skeptic's
+skeptical
+skeptically
+skepticism
+skepticize
+skepticizes
+skeptics
+skerrick
+skerries
+skers
+skery
+sket
+sketch
+sketchbook
+sketched
+sketcher
+sketches
+sketchier
+sketchily
+sketchiness
+sketching
+sketchpad
+sketchy
+skew
+skewback
+skewbald
+skewed
+skewer
+skewered
+skewering
+skewers
+skewing
+skewness
+skews
+skewwhiff
+ski
+skiable
+skiagram
+skiagram's
+skiagrams
+skiagraph
+skiagraphy
+skiamachy
+skiascope
+skiascopy
+skibob
+skid
+skidded
+skidder
+skiddier
+skidding
+skiddoo
+skiddy
+skidlid
+skidoo
+skidpan
+skidproof
+skids
+skidway
+skied
+skien
+skier
+skies
+skiff
+skiffle
+skiffs
+skiing
+Skijoring
+Skikda
+skilful
+skilfully
+skill
+skilled
+skilless
+skillet
+skillful
+skillfully
+skillfulness
+skilling
+skillion
+skills
+skilly
+skim
+skim's
+skimmed
+skimmer
+skimmer's
+skimmers
+Skimmia
+skimming
+skimmings
+skimobile
+skimp
+skimped
+skimpier
+skimpily
+skimpiness
+skimping
+skimps
+skimpy
+skims
+skin
+skin's
+skindive
+skindiving
+skinflint
+skinflint's
+skinflints
+skinful
+skinhead
+skink
+skinker
+skinless
+skinned
+skinner
+skinner's
+skinners
+skinnier
+skinniness
+skinning
+skinny
+skins
+skint
+skintight
+skip
+skipjack
+skiplane
+skipped
+skipper
+skipper's
+skippered
+skippering
+skippers
+skippet
+skipping
+Skippy
+skips
+Skipton
+skirl
+skirmish
+skirmished
+skirmisher
+skirmishers
+skirmishes
+skirmishing
+skirr
+skirret
+skirt
+skirted
+skirter
+skirting
+skirts
+skis
+skit
+skite
+skits
+skitter
+skittery
+skittish
+skittishly
+skittishness
+skittle
+skive
+skiver
+skiving
+skivvies
+skivvy
+skiway
+skiwear
+skoal
+Skokiaan
+Skolly
+Skopje
+Skrowaczewski
+Skua
+skulduggery
+skulk
+skulked
+skulker
+skulking
+skulks
+skull
+skull's
+skullcap
+skullduggery
+skulled
+skulls
+skunk
+skunk's
+skunks
+sky
+sky's
+skyborne
+skycap
+skydive
+skydiving
+Skye
+skyey
+skyhook
+skying
+skyjack
+skyjacked
+skyjacker
+skyjackers
+skyjacking
+skylab
+skylark
+skylarker
+skylarking
+skylarks
+skylight
+skylight's
+skylights
+skyline
+skylounge
+skyphoi
+skyphos
+skyrocket
+skyros
+skysail
+skyscape
+skyscrape
+skyscraper
+skyscraper's
+skyscrapers
+skyward
+skywave
+skyway
+skywrite
+skywriter
+skywriting
+slab
+slabber
+slabbered
+slabbering
+slabbing
+slabs
+slack
+slacked
+slacken
+slackened
+slackening
+slackens
+slacker
+slackest
+slacking
+slackly
+slackness
+slacks
+slade
+slag
+slain
+slaister
+slake
+slaked
+slaking
+slalom
+slaloms
+slam
+slammed
+slamming
+slams
+slander
+slandered
+slanderer
+slandering
+slanderous
+slanderously
+slanderousness
+slanders
+slang
+slangily
+slanginess
+slanging
+slangy
+slant
+slanted
+slanting
+slantingly
+slants
+slantways
+slantwise
+slap
+slapdash
+slaphappy
+slapjack
+slapped
+slapping
+slaps
+slapshot
+slapstick
+slash
+slashed
+slasher
+slashes
+slashing
+slashingly
+slat
+slat's
+slate
+slated
+slatelike
+slater
+slaters
+slates
+slather
+slathered
+slathering
+slathers
+slating
+Slatkin
+slats
+slatted
+slattern
+slatternliness
+slatternly
+slatting
+slaty
+slaughter
+slaughtered
+slaughterer
+slaughterhouse
+slaughterhouses
+slaughtering
+slaughterman
+slaughtermen
+slaughterous
+slaughterously
+slaughters
+Slav
+slave
+slaved
+slaveholder
+slaveholders
+slaveholding
+slaver
+slavered
+slavering
+slavery
+slaves
+slavey
+slaveys
+Slavic
+Slavicize
+Slavicizes
+slaving
+slavish
+slavishly
+slavishness
+Slavism
+Slavization
+Slavization's
+Slavizations
+Slavize
+Slavizes
+Slavkov
+slavocracy
+Slavonia
+Slavonic
+Slavonicize
+Slavonicizes
+Slavophile
+Slavophiles
+Slavs
+slavs
+slaw
+slay
+slayer
+slayers
+slaying
+slays
+sleave
+sleazier
+sleazily
+sleaziness
+sleazy
+sled
+sled's
+sledded
+sledder
+sledding
+sledge
+sledge's
+sledgehammer
+sledges
+sledging
+sleds
+sleek
+sleekit
+sleekly
+sleekness
+sleep
+sleeper
+sleepers
+sleepier
+sleepily
+sleepiness
+sleeping
+sleepless
+sleeplessess
+sleeplessly
+sleeplessness
+sleeplike
+sleeps
+sleepwalk
+sleepwalker
+sleepy
+sleepyhead
+sleet
+sleety
+sleeve
+sleeve's
+sleeved
+sleeveless
+sleevelet
+sleeves
+sleeving
+sleezy
+sleigh
+sleighs
+sleight
+sleken
+slekened
+slekening
+slender
+slenderer
+slenderize
+slenderized
+slenderizes
+slenderizing
+slenderly
+slenderness
+slept
+slesinger
+Slesinger
+Slesvig
+sleuth
+sleuthhound
+sleuthing
+slew
+slewed
+slewing
+slezsko
+slice
+sliced
+slicer
+slicers
+slices
+slicing
+slick
+slickenside
+slicker
+slickers
+slickly
+slickness
+slicks
+slid
+slidden
+slide
+slider
+sliders
+slides
+slideway
+sliding
+slier
+sliest
+slight
+slighted
+slighter
+slightest
+slighting
+slightingly
+slightly
+slightness
+slights
+sligo
+slily
+slim
+slime
+slimed
+slimes
+slimier
+slimily
+sliminess
+sliming
+slimly
+slimmed
+slimmer
+slimmers
+slimmest
+slimming
+slimness
+slimpsy
+slimsy
+slimy
+sling
+slingback
+slinger
+slinging
+slings
+slingshot
+slink
+slinked
+slinkier
+slinkily
+slinkiness
+slinking
+slinks
+slinky
+slip
+slip's
+slipcase
+slipcover
+slipform
+slipknot
+slipnoose
+slipover
+slippage
+slipped
+slipper
+slipper's
+slipperier
+slipperiness
+slippers
+slipperwort
+slippery
+slippier
+slipping
+slippy
+slips
+slipsheet
+slipshod
+slipslop
+slipsole
+slipstick
+slipstream
+slipup
+slipway
+slit
+slit's
+slither
+slithered
+slithering
+slithers
+slithery
+slitless
+slits
+slitter
+slitters
+slitting
+sliver
+slivered
+slivering
+slivers
+slivery
+slivovitz
+Sloan
+Sloane
+slob
+slobber
+slobbered
+slobberer
+slobbering
+slobbers
+slobbery
+slobbish
+Slocum
+Slocum's
+sloe
+slog
+slogan
+slogan's
+sloganeer
+sloganeering
+sloganize
+sloganizes
+slogans
+slogger
+slogging
+sloop
+sloops
+sloot
+slop
+slope
+sloped
+sloper
+slopers
+slopes
+sloping
+slopped
+sloppier
+sloppily
+sloppiness
+slopping
+sloppy
+slops
+slopwork
+slopworker
+slosh
+sloshed
+slot
+slot's
+slotback
+sloth
+slothful
+slothfully
+slothfulness
+sloths
+slots
+slotted
+slotting
+slouch
+slouched
+sloucher
+slouches
+slouchier
+slouchily
+slouchiness
+slouching
+slouchy
+slough
+sloughed
+sloughing
+sloughs
+sloughy
+Slovak
+Slovakia
+Slovakia's
+sloven
+Slovene
+Slovenia
+Slovenia's
+slovenliness
+slovenly
+slow
+slowcoach
+slowdown
+slowed
+slower
+slowest
+slowing
+slowish
+slowly
+slowness
+slowpoke
+slows
+slowworm
+slub
+slubber
+slubberdegullion
+slubbered
+slubbering
+slubbing
+sludge
+sludges
+sludgier
+sludgy
+slue
+sluff
+slug
+slugabed
+slugfest
+sluggard
+sluggardly
+sluggardness
+slugged
+slugger
+sluggers
+slugging
+sluggish
+sluggishly
+sluggishness
+slugs
+sluice
+sluiced
+sluices
+sluiceway
+sluicing
+sluicy
+sluing
+slum
+slum's
+slumber
+slumber's
+slumbered
+slumberer
+slumbering
+slumberous
+slumbers
+slumbery
+slumbrous
+slumgullion
+slumlord
+slummer
+slummier
+slumming
+slummy
+slump
+slumped
+slumps
+slums
+slung
+slungshot
+slunk
+slur
+slur's
+slurp
+slurped
+slurping
+slurps
+slurried
+slurries
+slurring
+slurry
+slurrying
+slurs
+slush
+slushier
+slushiness
+slushy
+slut
+sluttish
+sluttishly
+sluttishness
+sly
+slyboots
+slyer
+slyest
+slyly
+slyness
+slype
+smack
+smacked
+smacker
+smacking
+smacks
+small
+smallage
+smallboy
+smallclothes
+smaller
+smallest
+Smalley
+Smalley's
+smallholding
+smallish
+smallmouth
+smallness
+smallpox
+smallsword
+smalltime
+Smallwood
+smaltite
+smalto
+smaragd
+smaragdite
+smarm
+smarmy
+smart
+smarted
+smarten
+smartened
+smartening
+smarter
+smartest
+smartie
+smarties
+smarting
+smartly
+smartness
+smarts
+smartweed
+smarty
+smash
+smashed
+smasher
+smashers
+smashes
+smashing
+smashingly
+smashup
+smatch
+smatter
+smatterer
+smattering
+smatterings
+smear
+smearcase
+smeared
+smearer
+smearing
+smears
+smeary
+Smeaton
+smectic
+smegma
+smell
+smelled
+smeller
+smellier
+smelling
+smells
+smelly
+smelt
+smelter
+smeltery
+smelts
+Smetana
+smew
+smidgen
+smidgeon
+smilacaceous
+Smilax
+smile
+smiled
+smileless
+smilelessly
+smiler
+smiles
+smiley
+smiley's
+smilies
+smiling
+smilingly
+smirch
+smirk
+smirked
+smirky
+Smirnov
+smit
+smite
+smiter
+smith
+smith's
+smithereens
+smithery
+Smithfield
+smithies
+smiths
+Smithson
+Smithson's
+Smithsonian
+smithsonite
+Smithtown
+smithy
+smiting
+smitten
+smock
+smocking
+smocks
+smog
+smoggier
+smoggy
+smogless
+smokable
+smoke
+smokeable
+smokechaser
+smoked
+smokeho
+smokehouse
+smokejack
+smokeless
+smokelike
+smokeproof
+smoker
+smoker's
+smokers
+smokes
+smokescreen
+smokestack
+smokey
+smokier
+smokies
+smokily
+smokiness
+smoking
+smoko
+smoky
+smolder
+smoldered
+smoldering
+smolderingly
+smolders
+Smolensk
+Smollett
+smolt
+smooch
+smooching
+smoochy
+smoodge
+smooth
+smoothbore
+smoothed
+smoothen
+smoothened
+smoothening
+smoother
+smoothers
+smoothes
+smoothest
+smoothie
+smoothies
+smoothing
+smoothly
+smoothness
+smooths
+smoothy
+smorgasbord
+smote
+smother
+smothered
+smothering
+smothers
+smothery
+smoulder
+smriti
+SMSA
+smsa
+smsa's
+SMSA's
+SMSAs
+smsas
+SMTP
+Smucker
+smudge
+smudged
+smudgily
+smudginess
+smudging
+smudgy
+smug
+smugger
+smuggest
+smuggle
+smuggled
+smuggler
+smugglers
+smuggles
+smuggling
+smugly
+smugness
+smut
+smutch
+smutchy
+smuts
+smutted
+smuttier
+smuttily
+smuttiness
+smutting
+smutty
+Smyrna
+Smyrna's
+Smythe
+snack
+snackette
+snacks
+snaffle
+snaffled
+snaffling
+snafu
+snag
+snagged
+snagging
+snaggletooth
+snaggletoothed
+snaggy
+snags
+snail
+snail's
+snaillike
+snails
+snake
+snakebird
+snakebite
+snakebite's
+snakebites
+snaked
+snakelike
+snakemouth
+snakeroot
+snakes
+snakeskin
+snakestrike
+snakeweed
+snakily
+snaking
+snaky
+snap
+snapback
+snapdragon
+snapdragons
+snappe
+snapped
+snapper
+snapper's
+snappers
+snappier
+snappiest
+snappily
+snappiness
+snapping
+snappish
+snappishly
+snappishness
+snappy
+snaps
+snapshoot
+snapshooter
+snapshot
+snapshot's
+snapshots
+snare
+snared
+snarer
+snares
+snarf
+snarfed
+snarfing
+snarfings
+snarfs
+snaring
+snark
+snarks
+snarl
+snarled
+snarler
+snarling
+snarls
+snarly
+snash
+snatch
+snatched
+snatcher
+snatches
+snatching
+snatchy
+snath
+snathe
+snazzier
+snazzy
+SNCC
+sndmsg
+snead
+Snead
+sneak
+sneaked
+sneaker
+sneakered
+sneakers
+sneakier
+sneakiest
+sneakily
+sneakiness
+sneaking
+sneakingly
+sneaks
+sneaky
+sneap
+sneck
+sned
+Sneed
+sneed
+sneer
+sneered
+sneerer
+sneering
+sneers
+sneesh
+sneeze
+sneezed
+sneezer
+sneezes
+sneezeweed
+sneezewort
+sneezing
+sneezy
+snell
+snelling
+snib
+snick
+snicker
+snickered
+snickerer
+snickering
+snickersnee
+snickery
+snicket
+snide
+snidely
+snideness
+snider
+snidest
+sniff
+sniffed
+sniffer
+sniffily
+sniffiness
+sniffing
+sniffish
+sniffishly
+sniffishness
+sniffle
+sniffled
+sniffler
+sniffles
+sniffling
+sniffs
+sniffy
+snifter
+snigger
+sniggered
+sniggerer
+sniggering
+sniggle
+sniggled
+sniggling
+snip
+snipe
+sniped
+snipefish
+sniper
+sniper's
+snipers
+sniperscope
+snipes
+sniping
+snipped
+snipper
+snipper's
+snippers
+snippet
+snippety
+snippier
+snipping
+snippy
+snips
+snit
+snitch
+snitcher
+snivel
+sniveled
+sniveler
+snivelers
+sniveling
+snivelings
+snob
+snobbery
+snobbish
+snobbishly
+snobbishness
+snobbism
+snobby
+SNOBOL
+snobs
+snobsniveling
+snodgrass
+Snodgrass
+snog
+snollygoster
+snood
+snook
+snooker
+snookers
+snooks
+snoop
+snooped
+snooper
+snooperscope
+snoopily
+snooping
+snoops
+snoopy
+snoot
+snootier
+snootily
+snootiness
+snooty
+snooze
+snoozer
+snoozes
+snoozing
+snoozle
+snoozled
+snoozles
+snoozling
+snopes
+snore
+snored
+snorer
+snores
+snoring
+snorkel
+snorkeled
+snorkeler
+snorkeling
+snorri
+snort
+snorted
+snorter
+snorting
+snorts
+snot
+snotty
+snout
+snout's
+snouted
+snoutish
+snouts
+snouty
+snow
+snowball
+snowballed
+snowballing
+snowballs
+snowbank
+snowbank's
+snowbanks
+Snowbelt
+Snowbelt's
+snowberry
+snowbird
+snowblink
+snowblower
+snowblowers
+snowbound
+snowbrush
+snowcap
+snowcapped
+snowdon
+snowdonia
+snowdrift
+snowdrop
+snowed
+snowfall
+snowfield
+snowflake
+snowflakes
+snowier
+snowiest
+snowily
+snowiness
+snowing
+snowless
+snowmaker
+snowmaking
+snowman
+snowmelt
+snowmen
+snowmobile
+snowmobiler
+snowmobiling
+snowpack
+snowplough
+snowplow
+snows
+snowscape
+snowshed
+snowshoe
+snowshoe's
+snowshoed
+snowshoeing
+snowshoer
+snowshoes
+snowslide
+snowstorm
+snowsuit
+snowy
+snub
+snubbed
+snubber
+snubbiness
+snubbing
+snubby
+snubness
+snubs
+snuck
+snuff
+snuffbox
+snuffboxes
+snuffed
+snuffer
+snuffing
+snuffle
+snuffled
+snuffler
+snuffling
+snuffs
+snuffy
+snug
+snugged
+snugger
+snuggery
+snuggest
+snugging
+snuggle
+snuggled
+snuggles
+snuggling
+snuggly
+snugly
+snugness
+snugs
+Snyder
+snye
+so
+soak
+soakage
+soakaway
+soaked
+soaker
+soaking
+soaks
+soap
+soapbark
+soapberry
+soapbox
+soapboxes
+soaped
+soapier
+soapily
+soapiness
+soaping
+soapless
+soapmaking
+soapolallie
+soaps
+soapstone
+soapstones
+soapsud
+soapsuds
+soapwort
+soapy
+soar
+soared
+soarer
+soares
+soaring
+soars
+sob
+soba
+sobbed
+sobbing
+sobbingly
+sobe
+sobeit
+sober
+sobered
+soberer
+soberest
+sobering
+soberize
+soberized
+soberizes
+soberizing
+soberly
+soberness
+sobers
+sobersided
+sobersides
+sobf
+sobibor
+Sobranje
+sobriety
+sobriquet
+sobs
+Soc
+socage
+socager
+socal
+soccage
+soccer
+soche
+sochi
+sociability
+sociable
+sociableness
+sociably
+social
+socialism
+socialist
+socialist's
+socialistic
+socialistically
+socialists
+socialite
+sociality
+socialization
+socialization's
+socializations
+socialize
+socialized
+socializer
+socializes
+socializing
+socially
+societal
+societally
+Societe
+societies
+society
+society's
+Socinian
+socinianism
+socinus
+socio
+sociobiology
+sociocultural
+socioculturally
+sociodemographic
+socioeconomic
+socioeconomically
+socioeconomics
+sociolinguistic
+sociolinguistics
+sociologic
+sociological
+sociologically
+sociologist
+sociologists
+sociology
+sociometric
+sociometry
+sociopath
+sociopathic
+sociopolitical
+sociosexual
+sociosexuality
+sock
+sockdolager
+sockdologer
+sockdologizing
+socked
+socket
+socket's
+sockets
+sockeye
+socking
+socks
+socle
+socman
+socola
+soconoco
+Socrates
+Socratic
+socred
+sod
+sod's
+soda
+sodalist
+sodalite
+sodality
+sodamide
+sodbuster
+sodded
+sodden
+soddened
+soddening
+soddenly
+soddenness
+sodding
+Soddy
+soddy
+Soderblom
+Soderstrom
+sodic
+sodium
+Sodom
+sodomite
+sodomy
+sods
+soekarno
+soemba
+soembawa
+soenda
+soerabaja
+soeren
+soever
+sofa
+sofa's
+sofar
+sofas
+Soffel
+soffit
+Sofia
+soft
+softa
+softback
+softball
+softbound
+softcover
+soften
+softened
+softener
+softening
+softens
+softer
+softest
+softhead
+softheaded
+softheadedly
+softheadedness
+softhearted
+softheartedly
+softheartedness
+softie
+softies
+softish
+softly
+softness
+software
+software's
+softwares
+softwood
+softy
+sogat
+Sogdian
+sogdiana
+soggier
+soggily
+sogginess
+soggy
+soh
+sohn
+soho
+soign
+soignee
+soil
+soilage
+soilborne
+soiled
+soilge
+soiling
+soilless
+soils
+soilure
+soir
+soiree
+soirees
+soissons
+sojourn
+sojourner
+sojourners
+soke
+sokeman
+sokol
+sokolev
+sokolov
+sokolsky
+sokoto
+sokotra
+Sol
+sola
+solace
+solaced
+solacement
+solacer
+solacing
+solan
+solanaceous
+solander
+solanin
+solanine
+solanum
+solar
+solarimeter
+solarism
+solarium
+solarization
+solarization's
+solarizations
+solarize
+solarized
+solarizes
+solarizing
+solate
+solated
+solating
+solatium
+sold
+soldan
+solder
+solderability
+soldered
+solderer
+soldering
+solders
+soldi
+soldier
+soldiered
+soldiering
+soldierize
+soldierizes
+soldierly
+soldiers
+soldiership
+soldiery
+soldo
+sole
+solecism
+solecistic
+solecize
+solecized
+solecizes
+solecizing
+soled
+solely
+solemn
+solemnify
+solemnity
+solemnization
+solemnization's
+solemnizations
+solemnize
+solemnized
+solemnizer
+solemnizers
+solemnizes
+solemnizing
+solemnly
+solemnness
+soleness
+Solenodon
+solenoid
+solenoidal
+solenoids
+solent
+soleplate
+soleprint
+soles
+solesmes
+soleure
+solfatara
+solfeggio
+solferino
+soli
+solicit
+solicitant
+solicitation
+solicited
+soliciting
+solicitor
+solicitors
+solicitorship
+solicitous
+solicitously
+solicitousness
+solicits
+solicitude
+solid
+solidago
+solidarism
+solidarist
+solidaristic
+solidarity
+solidary
+solidification
+solidified
+solidifies
+solidify
+solidifying
+solidity
+solidly
+solidness
+solids
+solidus
+solifidian
+solifluction
+solihull
+soliloquist
+soliloquization
+soliloquize
+soliloquized
+soliloquizer
+soliloquizers
+soliloquizes
+soliloquizing
+soliloquizing's
+soliloquizingly
+soliloquizings
+soliloquy
+soliman
+soling
+solingen
+solipsism
+solipsist
+solipsistic
+solitaire
+solitarily
+solitariness
+solitary
+soliton
+solitude
+solitude's
+solitudes
+solitudinarian
+solitudinem
+solleret
+sollicker
+Solly
+solmization
+soln
+solo
+solo's
+soloed
+soloing
+soloist
+soloists
+Solomon
+Solon
+solonchak
+solonets
+solonetz
+solonetzic
+solos
+solothurn
+Soloviev
+solstice
+solstitial
+Solti
+solubility
+solubilization
+solubilize
+solubilized
+solubilizes
+solubilizing
+soluble
+solubleness
+solubly
+solum
+solus
+solute
+solution
+solution's
+solutions
+solutize
+solutizer
+solutizers
+solutizes
+Solutrean
+solvability
+solvable
+solvate
+solvated
+solvating
+solvation
+solvay
+solve
+solved
+solvency
+solvent
+solvent's
+solventless
+solvently
+solvents
+solver
+solvers
+solves
+solving
+solvolysis
+solvolytic
+solway
+solyman
+Solzhenitsyn
+soma
+Somali
+Somalia
+Somaliland
+Somalis
+somatic
+somatically
+somatogenic
+somatological
+somatology
+somatoplasm
+somatoplastic
+somatopleure
+somatopleuric
+somatosensory
+somatotrophin
+somatotropin
+somatotype
+somatotypic
+somatotypically
+somber
+somberly
+somberness
+sombre
+sombrero
+sombrous
+some
+somebodies
+somebody
+somebody'll
+somebody's
+someday
+somedeal
+somehow
+someone
+someone'll
+someone's
+someplace
+someplace's
+somers
+somersault
+somersaulting
+somersaults
+Somerset
+Somerville
+something
+sometime
+sometimes
+someway
+someways
+somewhat
+somewhen
+somewhere
+somewheres
+somewhither
+somewise
+somite
+somitic
+somme
+sommelier
+sommeliers
+Sommerfeld
+Sommerfeld's
+somnambulant
+somnambular
+somnambulate
+somnambulation
+somnambulator
+somnambulism
+somnambulist
+somnambulistic
+somnambulistically
+somnifacient
+somniferous
+somniferously
+somniloquy
+somnolence
+somnolency
+somnolent
+somnolently
+somnus
+son
+son's
+sonambula
+sonance
+sonant
+sonantized
+sonantized's
+sonantizeds
+sonar
+sonarman
+sonars
+sonata
+sonatas
+sonatina
+sondage
+sonde
+Sondheim
+sone
+Sonenberg
+song
+song's
+songau
+songbag
+songbird
+songbook
+songfest
+songful
+songfully
+songfulness
+Songhai
+songkok
+songless
+songlessly
+songs
+songsmith
+songster
+songtress
+songwriter
+songwriting
+sonic
+sonically
+sonicate
+sonicated
+sonication
+sonicator
+sonicators
+soniferous
+sonless
+sonly
+sonnet
+sonnet's
+sonneteer
+sonnetize
+sonnetizes
+sonnets
+sonnobuoy
+sonny
+sonobuoy
+sonofabitch
+sonogram
+sonogram's
+sonograms
+Sonoma
+Sonora
+sonorant
+sonorities
+sonority
+sonorous
+sonorously
+sonorousness
+sonovox
+sons
+sonship
+sonsie
+sonsy
+sonuvabitch
+Sony
+Sony's
+soo
+soochow
+sook
+soomed
+soon
+sooner
+soonest
+soong
+soot
+sooth
+soothe
+soothed
+soother
+soothes
+soothfast
+soothing
+soothingly
+soothingness
+soothly
+soothsay
+soothsayer
+soothsayers
+soothsaying
+sootier
+sootily
+sootiness
+sooty
+sop
+Sophia
+Sophias
+Sophie
+sophism
+sophist
+sophister
+sophistic
+sophistical
+sophistically
+sophisticate
+sophisticated
+sophisticatedly
+sophisticates
+sophistication
+sophistocated
+sophistry
+Sophoclean
+Sophocles
+sophomore
+sophomore's
+sophomores
+sophomoric
+sophy
+sopite
+sopited
+sopiting
+sopor
+soporiferous
+soporiferousness
+soporific
+soporific's
+soporifics
+soppier
+sopping
+soppy
+sopranino
+soprano
+sopranos
+sops
+sopsaisana
+sora
+sorata
+sorb
+sorbability
+sorbable
+sorbate
+sorbed
+sorbefacient
+sorbent
+Sorbian
+sorbic
+sorbitol
+Sorbonne
+sorcerer
+sorcerer's
+sorcerers
+sorceress
+sorcerous
+sorcery
+Sordello
+sordid
+sordidly
+sordidness
+sordino
+sore
+soredium
+sorehead
+soreheaded
+sorely
+soreness
+Sorensen
+Sorenson
+sorer
+sores
+sorest
+sorghum
+sorgo
+sori
+soricine
+sorites
+sorn
+sorocaba
+sororal
+sororate
+sororicide
+sororities
+sorority
+sorosis
+sorption
+sorptive
+sorrel
+sorrentine
+Sorrentine
+sorrentino
+sorrento
+sorrier
+sorriest
+sorrily
+sorriness
+sorrow
+sorrow's
+sorrower
+sorrowful
+sorrowfully
+sorrowfulness
+sorrows
+sorry
+sort
+sortable
+sorted
+sorter
+sorters
+sortie
+sortilege
+sorting
+sortition
+sorts
+sorus
+sos
+SOS
+sosnowiec
+sostenuto
+sot
+soteriological
+soteriology
+Sothic
+Sothis
+Sotho
+sotol
+sottish
+sottishly
+sottishness
+sotto
+sotun
+sou
+soubise
+soubrette
+soubriquet
+souchong
+soudan
+souffle
+sough
+sought
+soukhouma
+soul
+soul's
+soule
+souled
+soulful
+soulfully
+soulfulness
+soulless
+soullessly
+soullessness
+souls
+soult
+sound
+soundable
+soundboard
+soundbox
+sounded
+sounder
+soundest
+sounding
+sounding's
+soundingly
+soundings
+soundless
+soundlessly
+soundly
+soundness
+soundpost
+soundproof
+soundproofed
+soundproofing
+soundproofs
+sounds
+soup
+soup's
+soupfin
+Souphanourong
+soupier
+soups
+soupspoon
+soupy
+sour
+sourberry
+source
+source's
+sourceless
+sources
+sourdine
+sourdough
+soured
+sourer
+sourest
+souring
+sourish
+sourly
+sourness
+sourpuss
+sours
+soursop
+sourwood
+Sousa
+sousaphone
+souse
+sousing
+Souslik
+Sousse
+sout
+soutache
+soutane
+souter
+Souterrain
+south
+Southampton
+southbound
+Southdown
+southeast
+southeaster
+southeasterly
+southeastern
+southeasternmost
+southeastward
+southeastwards
+souther
+southerly
+Southern
+southern
+southerner
+southerners
+southernisms
+southernize
+southernizes
+southernly
+southernmost
+southernness
+Southernwood
+Southey
+Southfield
+southing
+southland
+southmost
+southpaw
+southpaws
+Southport
+Southron
+souths
+southward
+southwards
+Southwark
+southwest
+southwester
+southwesterly
+southwestern
+southwesternmost
+southwestward
+southwestwards
+soutine
+souvenir
+souvenirs
+sovereign
+sovereign's
+sovereignly
+sovereigns
+sovereignty
+Sovetsk
+Soviet
+soviet
+soviet's
+sovietism
+sovietization
+sovietization's
+sovietizations
+sovietize
+Sovietized
+sovietizes
+Sovietizing
+soviets
+sovkhoz
+sovkhozes
+sovran
+sovranty
+sow
+sowbelly
+sowbug
+sowbug's
+sowbugs
+sowens
+sower
+sowered
+Soweto
+sowing
+sown
+sox
+soxhlet
+soy
+soya
+soybean
+soybeans
+Soyinka
+Soyuz
+sozzled
+spa
+Spaak
+space
+spaceband
+spacecraft
+spaced
+spaceflight
+spaceless
+spaceman
+spaceport
+spacer
+spacers
+spaces
+spaceship
+spaceship's
+spaceships
+spacesuit
+spacesuits
+spacetime
+spacewalk
+spacewalker
+spacewalking
+Spacewar
+spacial
+spacing
+spacings
+spacious
+spaciously
+spaciousness
+spackle
+spackled
+spackling
+spacs
+spacward
+spada
+spade
+spaded
+spadefish
+spadeful
+spader
+spades
+spadework
+spadiceous
+spadices
+spadille
+spading
+spadix
+spaeing
+Spafford
+Spafford's
+spaghetti
+spagyric
+spahi
+spahn
+Spahn
+Spain
+Spain's
+spake
+spalato
+Spalding
+spalding
+spall
+spallable
+spallation
+spalled
+spalling
+spalpeen
+spam
+span
+span's
+spancel
+spandrel
+spandrels
+spandril
+spang
+spangle
+spangled
+spangles
+spangling
+Spaniard
+Spaniardization
+Spaniardization's
+Spaniardizations
+Spaniardize
+Spaniardizes
+Spaniards
+spaniel
+Spanish
+Spanish's
+Spanishize
+Spanishizes
+spank
+spanked
+spanker
+spanking
+spanks
+spanned
+spanner
+spanner's
+spanners
+spanning
+spans
+spanworm
+spar
+sparable
+sparce
+spare
+spareable
+spared
+sparely
+spareness
+sparer
+sparerib
+spareribs
+spares
+sparest
+sparge
+sparger
+sparging
+sparid
+sparing
+sparingly
+spark
+sparked
+sparker
+sparkier
+sparkily
+sparking
+sparkish
+sparkle
+sparkled
+sparkler
+sparkles
+sparkling
+Sparkman
+sparkplug
+sparks
+sparky
+sparling
+sparlings
+sparoid
+sparred
+sparring
+sparrow
+sparrow's
+sparrowgrass
+sparrowhawk
+sparrows
+sparry
+spars
+sparse
+sparsely
+sparseness
+sparser
+sparsest
+sparsity
+Sparta
+Spartacus
+spartan
+Spartan
+Spartanize
+Spartanizes
+sparteine
+spas
+spasm
+spasmodic
+spasmodical
+spasmodically
+spasmolytic
+spasmolytically
+spasms
+Spassky
+spastic
+spastically
+spasticity
+spat
+spatchcock
+spate
+spate's
+spates
+spathe
+spathic
+spathulate
+spatial
+spatiality
+spatialization
+spatialization's
+spatializations
+spatialize
+spatializes
+spatially
+spatiotemporal
+spatiotemporally
+spatlum
+spats
+spatted
+spatter
+spatterdash
+spatterdock
+spattered
+spatting
+spatula
+spatulate
+Spaulding
+Spaulding's
+spavin
+spavined
+spawn
+spawned
+spawner
+spawning
+spawns
+spay
+spayed
+spaying
+speak
+speakable
+speakeasy
+speaker
+speaker's
+Speakerphone
+speakers
+speakership
+speaking
+speaks
+spean
+spear
+speared
+spearer
+spearfish
+spearhead
+spearing
+spearman
+spearmint
+spears
+spearwort
+spec
+special
+specialism
+specialisms
+specialist
+specialist's
+specialistic
+specialists
+specialization
+specialization's
+specializations
+specialize
+specialized
+specializer
+specializers
+specializes
+specializing
+specially
+specialness
+specials
+specialties
+specialty
+specialty's
+speciate
+speciation
+speciational
+specie
+species
+specifiability
+specifiable
+specific
+specifically
+specification
+specifications
+specificities
+specificity
+specificize
+specificizes
+specifics
+specified
+specifier
+specifiers
+specifies
+specify
+specifying
+specimen
+specimen's
+specimenize
+specimenizes
+specimens
+speciosity
+specious
+speciously
+speciousness
+speck
+speck's
+speckle
+speckled
+speckles
+speckling
+specks
+specs
+specsartine
+spect
+spectacle
+spectacled
+spectacles
+spectacular
+spectacularly
+spectate
+spectated
+spectating
+spectator
+spectator's
+spectators
+spectatress
+specter
+specter's
+spectered
+specterlike
+specterlike's
+specterlikes
+specters
+spector
+Spector's
+spectra
+spectral
+spectrality
+spectrally
+spectralness
+spectrobolometer
+spectrofluorimeter
+spectrofluorimeter's
+spectrofluorimeters
+spectrofluorometer
+spectrofluorometer's
+spectrofluorometers
+spectrofluorometric
+spectrofluorometry
+spectrogram
+spectrogram's
+spectrograms
+spectrograph
+spectrographic
+spectrographically
+spectrography
+spectroheliogram
+spectroheliogram's
+spectroheliograms
+spectroheliograph
+spectroheliography
+spectrohelioscope
+spectrometer
+spectrometer's
+spectrometers
+spectrometric
+spectrometry
+spectrophotometer
+spectrophotometer's
+spectrophotometers
+spectrophotometric
+spectrophotometrical
+spectrophotometrically
+spectrophotometry
+spectroscope
+spectroscopic
+spectroscopical
+spectroscopically
+spectroscopist
+spectroscopy
+spectrum
+spectrums
+specular
+specularity
+specularly
+speculate
+speculated
+speculates
+speculating
+speculation
+speculations
+speculative
+speculatively
+speculator
+speculator's
+speculators
+speculum
+sped
+speech
+speech's
+speeches
+speechify
+speechless
+speechlessly
+speechlessness
+speed
+speedball
+speedboat
+speedboater
+speedboating
+speeded
+speeder
+speeders
+speedier
+speedily
+speediness
+speeding
+speedlight
+speedo
+speedometer
+speedometer's
+speedometers
+speeds
+speedster
+speedup
+speedup's
+speedups
+speedway
+speedwell
+speedwriting
+speedy
+speel
+Speenhamland
+speer
+speight
+speir
+speiss
+spelaean
+speleogenesis
+speleogenetic
+speleological
+speleologist
+speleology
+spelk
+spell
+spellbind
+spellbinder
+spellbound
+spelldown
+spelled
+speller
+spellers
+spellican
+spelling
+spellings
+spells
+spelt
+spelter
+spelunker
+spelunking
+Spenborough
+Spence
+Spencer
+Spencer's
+Spencerian
+spend
+spendable
+spender
+spenders
+spending
+spends
+spendthrift
+Spengler
+spenglerian
+Spenglerian
+Spenser
+Spenserian
+spent
+speos
+sperm
+spermaceti
+spermagonium
+spermary
+spermatheca
+spermathecal
+spermatial
+spermatic
+spermatid
+spermatium
+spermatocidal
+spermatocide
+spermatocyte
+spermatogenesis
+spermatogenetic
+spermatogenic
+spermatogonial
+spermatogonium
+spermatophore
+spermatophyte
+spermatophytic
+spermatorrhoea
+spermatozoa
+spermatozoal
+spermatozoan
+spermatozoid
+spermatozoon
+spermic
+spermicidal
+spermicide
+spermidine
+spermine
+spermiogenesis
+spermogonium
+spermophile
+spermophyte
+spermous
+sperms
+Sperry
+sperrylite
+spessartite
+spew
+spewer
+spewing
+spewings
+spey
+speyer
+sphagnous
+sphagnum
+sphalerite
+sphene
+sphenic
+sphenodon
+sphenodont
+sphenogram
+sphenoid
+sphenoidal
+sphenopsid
+spheral
+sphere
+sphere's
+spheres
+spheric
+spherical
+spherically
+sphericity
+spherics
+sphering
+spheroid
+spheroidal
+spheroidally
+spheroidicity
+spheroidize
+spheroidizes
+spherometer
+spherometer's
+spherometers
+spheroplast
+spherule
+spherules
+spherulite
+spherulitic
+sphery
+sphincter
+sphincteral
+sphinges
+sphingid
+sphingomyelin
+sphingosine
+sphinx
+sphinxes
+sphragistics
+sphygmic
+sphygmograph
+sphygmographic
+sphygmography
+sphygmoid
+sphygmomanometer
+sphygmomanometer's
+sphygmomanometers
+sphygmomanometric
+sphygmomanometrically
+sphygmomanometry
+spic
+Spica
+spicae
+Spicas
+spicate
+spiccato
+spice
+spiceberry
+spicebush
+spiced
+spicery
+spices
+spicier
+spicily
+spiciness
+spicing
+spicula
+spicular
+spiculate
+spiculation
+spicule
+spiculiferous
+spiculum
+spicy
+spider
+spider's
+spiderman
+spiders
+spiderweb
+spiderwort
+spidery
+spied
+Spiegel
+spiegeleisen
+spiel
+spieler
+spier
+spies
+spif
+spiffier
+spiffing
+spiffy
+spiflicate
+spignel
+spigot
+spigots
+spike
+spiked
+spikelet
+spikelike
+spikenard
+spiker
+spikes
+spikier
+spiking
+spiky
+spile
+spiled
+spiles
+spiling
+spill
+spillable
+spillage
+spillage's
+spillages
+spilled
+spiller
+spillikin
+spillikins
+spilling
+spillover
+spillover's
+spillovers
+spills
+spillway
+spilosite
+spilt
+spilth
+spin
+spina
+spinach
+spinal
+spinally
+spinco
+spindle
+spindled
+spindlelegs
+spindler
+spindles
+spindling
+spindly
+spindrift
+spine
+spinel
+spineless
+spinelessly
+spinelessness
+spinelle
+spines
+spinescent
+spinet
+spinier
+spiniferous
+spinifex
+spininess
+spinless
+spinnability
+spinnaker
+spinner
+spinner's
+spinneret
+spinnerette
+spinners
+spinney
+spinneys
+spinning
+spinodal
+spinoff
+spinor
+spinose
+spinosely
+spinosity
+spinous
+spinout
+Spinoza
+Spinozism
+spinrad
+spins
+spinse
+spinster
+spinsterhood
+spinsterish
+spinthariscope
+spinule
+spinulose
+spiny
+spiracle
+spiracular
+spiraea
+spiral
+spiraled
+spiraling
+spiralization
+spiralization's
+spiralizations
+spiralize
+spiralizes
+spirally
+spirals
+spirant
+spire
+spire's
+spirea
+spired
+spireme
+spires
+spirillum
+spiring
+spirit
+spirited
+spiritedly
+spiritedness
+spiriting
+spiritism
+spiritist
+spiritistic
+spiritize
+spiritizes
+spiritless
+spiritlessly
+spiritlessness
+spiritoso
+spiritous
+spirits
+spiritual
+spiritualism
+spiritualist
+spiritualistic
+spirituality
+spiritualization
+spiritualization's
+spiritualizations
+spiritualize
+spiritualized
+spiritualizer
+spiritualizers
+spiritualizes
+spiritualizing
+spiritually
+spiritualness
+spirituals
+spiritualty
+spirituel
+spirituelle
+spirituous
+spiritus
+spirketting
+Spiro
+Spiro's
+spirochetal
+spirochete
+spirochete's
+spirochetes
+spirochetosis
+spirograph
+spirographic
+spirography
+spirogyra
+spiroid
+spirometer
+spirometer's
+spirometers
+spirometric
+spirometry
+spironolactone
+spirt
+spirula
+spiry
+spit
+spital
+spitball
+spitchcock
+spite
+spited
+spiteful
+spitefully
+spitefulness
+spites
+spitfire
+spithead
+spiting
+spits
+Spitsbergen
+spitsticker
+spitted
+spitter
+spitting
+spittle
+spittoon
+spittoons
+Spitz
+spiv
+Spivakov
+splake
+splanchnic
+splash
+splashback
+splashbacks
+splashboard
+splashdown
+splashdowns
+splashed
+splasher
+splashers
+splashes
+splashier
+splashily
+splashiness
+splashing
+splashy
+splat
+splatter
+splattered
+splay
+splayed
+splayfoot
+splayfooted
+spleen
+spleenful
+spleenwort
+spleeny
+splendent
+splendid
+splendidly
+splendidness
+splendiferous
+splendiferously
+splendiferousness
+splendor
+splendor's
+splendorous
+splendors
+splendrous
+splenectomized
+splenectomy
+splenetic
+splenetically
+splenic
+splenitis
+splenius
+splenomegaly
+splent
+spleuchan
+splice
+spliced
+splicer
+splicers
+splices
+splicing
+splicings
+spline
+spline's
+splined
+splines
+splint
+splinted
+splinter
+splintered
+splintering
+splinters
+splintery
+splinting
+splints
+split
+split's
+splits
+splitter
+splitter's
+splitters
+splitting
+splittings
+splodge
+splore
+splotch
+splotched
+splotches
+splotchy
+splurge
+splurges
+splurging
+splutter
+splutterer
+spluttery
+spock
+spode
+spodumene
+spoil
+spoilable
+spoilables
+spoilage
+spoiled
+spoiler
+spoilers
+spoilfive
+spoiling
+spoils
+spoilsman
+spoilsport
+spoilt
+Spokane
+spoke
+spoked
+spoken
+spokes
+spokeshave
+spokesman
+spokesmen
+spokespeople
+spokesperson
+spokesperson's
+spokespersons
+spokeswoman
+spoking
+spoliate
+spoliation
+spoliator
+spondaic
+spondee
+spondulix
+spondylitis
+sponge
+sponged
+sponger
+spongers
+sponges
+spongier
+spongin
+sponginess
+sponging
+spongioblast
+spongy
+sponsion
+sponson
+sponsor
+sponsored
+sponsorial
+sponsoring
+sponsors
+sponsorship
+spontaneity
+spontaneous
+spontaneously
+spontaneousness
+spontoon
+spoof
+spook
+spookier
+spookily
+spookiness
+spookish
+spooky
+spool
+spooled
+spooler
+spoolers
+spooling
+spools
+spoon
+spoonbill
+spoondrift
+spooned
+spoonerism
+spooney
+spoonful
+spoonfuls
+spoonier
+spooning
+spoons
+spoonsful
+spoony
+spoor
+sporades
+sporadic
+sporadically
+sporadicly
+sporangial
+sporangiophore
+sporangium
+spore
+spore's
+spored
+spores
+sporicidal
+sporicide
+sporiferous
+sporing
+sporocarp
+sporocyst
+sporocystic
+sporocyte
+sporogenesis
+sporogenic
+sporogenous
+sporogonic
+sporogonium
+sporogonos
+sporogony
+sporophore
+sporophyll
+sporophyte
+sporophytic
+sporopollenin
+sporotrichosis
+sporozoan
+sporozoite
+sporran
+sport
+sported
+sportful
+sportfully
+sportfulness
+sportier
+sportiest
+sportily
+sportiness
+sporting
+sportingly
+sportive
+sportively
+sportiveness
+sports
+sportscast
+sportsman
+sportsmanlike
+sportsmanly
+sportsmanship
+sportsmen
+sportswear
+sportswoman
+sportswrite
+sportswriter
+sportswriting
+sporty
+sporulate
+sporulation
+sporulative
+sporule
+Sposato
+spot
+spot's
+spotless
+spotlessly
+spotlessness
+spotlight
+spotlight's
+spotlighted
+spotlighting
+spotlights
+spots
+spottable
+spotted
+spotter
+spotter's
+spotters
+spottier
+spottily
+spottiness
+spotting
+spotty
+spousal
+spouse
+spouse's
+spouses
+spousing
+spout
+spouted
+spouter
+spouting
+spouts
+sprag
+Sprague
+Sprague's
+sprain
+sprained
+sprains
+sprang
+sprat
+Spratly
+sprawl
+sprawled
+sprawling
+sprawls
+spray
+sprayed
+sprayer
+spraying
+sprays
+spread
+spreadability
+spreadable
+spreader
+spreaders
+spreading
+spreadings
+spreads
+spreadsheet
+spreadsheets
+sprechgesang
+sprechstimme
+spree
+spree's
+sprees
+sprent
+sprier
+spriest
+sprig
+sprigging
+sprightful
+sprightfully
+sprightfulness
+sprightlier
+sprightliness
+sprightly
+sprigtail
+spring
+springal
+springald
+springboard
+springbok
+springboks
+springe
+springer
+springers
+Springfield
+Springhaas
+springhalt
+springhead
+springhouse
+springier
+springiest
+springily
+springiness
+springing
+springlet
+springs
+springtail
+springtails
+springtide
+springtime
+springvale
+springwood
+springy
+sprinkle
+sprinkled
+sprinkler
+sprinklered
+sprinkles
+sprinkling
+sprint
+sprinted
+sprinter
+sprinters
+sprinting
+sprints
+sprit
+sprite
+spritsail
+sprocket
+sprocketed
+sprocketing
+sprockets
+Sproul
+Sproul's
+sprout
+sprouted
+sprouting
+sprouts
+spruce
+spruced
+sprucely
+spruceness
+sprucer
+sprucest
+sprucier
+sprucing
+sprucy
+sprue
+spruik
+sprung
+spry
+spryer
+spryest
+spryly
+spryness
+SPSS
+spss
+spud
+spudded
+spudding
+Spuds
+spue
+spuggy
+spume
+spumescent
+spuming
+spumone
+spumoni
+spumous
+spumy
+spun
+spunk
+spunkie
+spunkier
+spunkily
+spunkiness
+spunky
+spur
+spur's
+spurge
+spurious
+spuriously
+spuriousness
+spurn
+spurned
+spurner
+spurning
+spurns
+spurred
+spurrey
+spurreys
+spurrier
+spurring
+spurry
+spurs
+spurt
+spurted
+spurting
+spurtle
+spurts
+sputa
+sputnik
+sputniks
+sputter
+sputtered
+sputterer
+sputum
+spuyten
+spy
+spyglass
+spying
+sqrt
+squab
+squabble
+squabbled
+squabbler
+squabbles
+squabbling
+squabs
+squacco
+squad
+squad's
+squadded
+squadding
+squadron
+squadron's
+squadrons
+squads
+squalane
+squalene
+squalid
+squalidly
+squalidness
+squall
+squall's
+squaller
+squallier
+squalls
+squally
+squalor
+squama
+squamae
+squamate
+squamation
+squamosal
+squamose
+squamous
+squamously
+squamulose
+squander
+squandered
+squanderer
+squandering
+squanders
+square
+squared
+squarely
+squareness
+squarer
+squares
+squarest
+squaresville
+Squaresville
+squaring
+squarish
+squarishly
+squarishness
+squark
+squarrose
+squash
+squashberry
+squashed
+squasher
+squashes
+squashier
+squashily
+squashiness
+squashing
+squashy
+squat
+squatly
+squatness
+squats
+squatted
+squatter
+squatters
+squattest
+squattier
+squatting
+squattocracy
+squatty
+squaw
+squawbush
+squawk
+squawked
+squawker
+squawking
+squawks
+squawroot
+squeak
+squeaked
+squeaker
+squeaking
+squeaks
+squeaky
+squeal
+squealed
+squealer
+squealing
+squeals
+squeamish
+squeamishly
+squeamishness
+squeegee
+squeegeed
+squeegeeing
+squeegees
+squeezability
+squeezable
+squeeze
+squeezed
+squeezer
+squeezes
+squeezing
+squelch
+squelched
+squelcher
+squelches
+squelching
+squelchy
+squeteague
+squib
+Squibb
+Squibbing
+squibs
+squid
+squidded
+squidding
+squids
+squiffed
+squiffy
+squiggle
+squiggled
+squiggles
+squiggling
+squiggly
+squilgee
+squill
+squilla
+squillae
+squills
+squinch
+squinnied
+squinny
+squinnying
+squint
+squinted
+squinter
+squinting
+squintingly
+squints
+squinty
+squirarchy
+squire
+squire's
+squirearchy
+squireen
+squirehood
+squires
+squiring
+squirish
+squirm
+squirmed
+squirming
+squirms
+squirmy
+squirrel
+squirreled
+squirrelfish
+squirreling
+squirrelly
+squirrels
+squirt
+squirted
+squirter
+squirting
+squirts
+squish
+squished
+squishes
+squishier
+squishiest
+squishiness
+squishing
+squishy
+squit
+squiz
+squoosh
+Sr
+Srbija
+Sri
+Sri's
+srinagar
+SSE
+SST
+SSW
+st
+stab
+stabat
+stabbed
+stabber
+stabbing
+stabile
+stabilities
+stability
+stability's
+stabilizable
+stabilization
+stabilization's
+stabilizations
+stabilize
+stabilized
+stabilizer
+stabilizers
+stabilizes
+stabilizing
+stable
+stableboy
+stabled
+stableman
+stablemate
+stablemen
+stableness
+stabler
+stables
+stablest
+stabling
+stablish
+stablishment
+stably
+stabroek
+stabs
+staccato
+staccatos
+stack
+stack's
+stackable
+stacked
+stacker
+stackframe
+stacking
+stacks
+stacte
+Stacy
+Stacy's
+staddle
+staddlestone
+stade
+Stade
+stadholder
+stadia
+stadiometer
+stadium
+stadium's
+stadiums
+stadtholder
+stadtholderate
+stadtholdership
+staff
+staff's
+staffa
+staffed
+staffer
+staffers
+staffing
+staffman
+Stafford
+Staffordshire
+staffs
+stag
+stag's
+stage
+stagecoach
+stagecraft
+staged
+stagehand
+stager
+stagers
+stages
+stagestruck
+stagey
+stagflation
+staggard
+stagger
+staggerbush
+staggered
+staggerer
+staggering
+staggeringly
+staggers
+staggery
+stagging
+staggy
+staghound
+stagier
+stagily
+staginess
+staging
+stagira
+Stagirite
+stagnancy
+stagnant
+stagnantly
+stagnate
+stagnated
+stagnates
+stagnating
+stagnation
+stags
+stagy
+Stahl
+Stahl's
+staid
+staidly
+staidness
+stain
+stainability
+stainable
+stained
+stainer
+staines
+staining
+stainless
+stainlessly
+stains
+stair
+stair's
+staircase
+staircase's
+staircases
+stairhead
+stairs
+stairway
+stairway's
+stairways
+stairwell
+stairwells
+stake
+staked
+stakeholder
+stakeout
+stakes
+Stakhanovism
+staking
+stalactite
+stalactite's
+stalactites
+stalactitic
+stalag
+stalagmite
+stalagmite's
+stalagmites
+stalagmitic
+stale
+staled
+stalely
+stalemate
+staleness
+staler
+stales
+stalest
+Staley
+Staley's
+Stalin
+Stalin's
+Stalinabad
+staling
+Stalingrad
+Stalinism
+Stalinist
+Stalinogrod
+Stalins
+Stalinsk
+stalk
+stalked
+stalker
+stalking
+stalkless
+stalks
+stalky
+stall
+stallard
+stalled
+stalling
+stallings
+stallion
+stallionize
+stallionizes
+stalls
+stalwart
+stalwartize
+stalwartizes
+stalwartly
+stalwartness
+stalworth
+stambul
+stamen
+stamen's
+stamens
+Stamford
+stamina
+staminal
+staminate
+staminode
+staminodium
+staminody
+stammel
+stammer
+stammered
+stammerer
+stammering
+stammers
+stamp
+stamped
+stampede
+stampeded
+stampeder
+stampedes
+stampeding
+stamper
+stampers
+stamping
+stamps
+Stan
+Stan's
+stance
+stance's
+stances
+stanch
+stancher
+stanchest
+stanchion
+stanchioned
+stanchioning
+stanchions
+stand
+standalone
+standard
+standardbred
+standardizable
+standardizable's
+standardizables
+standardization
+standardization's
+standardizations
+standardize
+standardized
+standardizer
+standardizers
+standardizes
+standardizing
+standardly
+standards
+standaway
+standby
+standbys
+standee
+stander
+standeth
+standfast
+standing
+standings
+Standish
+Standish's
+standoff
+standoffish
+standoffishly
+standoffishness
+standout
+standpat
+standpatter
+standpattism
+standpipe
+standpoint
+standpoint's
+standpoints
+stands
+standstill
+stane
+Stanford
+Stanford's
+stang
+Stanhope
+Stanhope's
+Stanislavsky
+stanite
+stank
+Stanley
+Stanleyville
+stannard
+stannaries
+stannary
+stannic
+stanniferous
+stannite
+stannous
+stannum
+stanovoi
+Stans
+stans
+Stanton
+stanza
+stanza's
+stanzaic
+stanzas
+stapedectomized
+stapedectomy
+stapedes
+stapedial
+stapelia
+stapes
+staph
+staphylinid
+staphylococcal
+staphylococcic
+staphylococcus
+staphyloplasty
+staphylorrhaphy
+staple
+stapled
+stapler
+staplers
+staples
+Stapleton
+stapling
+star
+star's
+stara
+starbird
+starboard
+starboarded
+starboarding
+starboards
+starch
+starched
+starches
+starchier
+starchily
+starchiness
+starching
+starchy
+stardom
+stardust
+stare
+stared
+starer
+stares
+starets
+starfish
+starflower
+Stargate
+Stargate's
+stargaze
+stargazer
+stargazes
+stargazing
+staring
+stark
+Starker
+starkest
+Starkey
+starkly
+starkness
+starless
+starlet
+starlet's
+starlets
+starlight
+starlike
+starling
+starlings
+starlit
+Starr
+starre
+starred
+starrier
+starring
+starry
+stars
+starship
+start
+startc
+started
+starter
+starters
+starting
+startle
+startled
+startles
+startling
+startlingly
+startlingness
+starts
+startup
+startup's
+startups
+starvation
+starve
+starved
+starveling
+starver
+starves
+starving
+starwort
+stases
+stash
+stashed
+stashes
+stashing
+stasis
+statable
+statant
+state
+state's
+stateable
+statecraft
+stated
+statedly
+statehood
+statehouse
+stateless
+statelessness
+statelier
+stateliness
+stately
+statement
+statement's
+statements
+Staten
+stater
+stateroom
+states
+stateside
+statesman
+statesman's
+statesmanlike
+statesmanly
+statesmanship
+statesmen
+statewide
+static
+statical
+statically
+statice
+statics
+stating
+station
+stational
+stationaries
+stationarily
+stationarity
+stationary
+stationed
+stationer
+stationeries
+stationery
+stationing
+stationmaster
+stations
+statism
+statist
+statistic
+statistic's
+statistical
+statistically
+statistician
+statistician's
+statisticians
+statisticize
+statisticizes
+statistics
+statius
+stative
+Statler
+stato
+statoblast
+statocyst
+statolatry
+statolith
+stator
+stators
+statoscope
+statuary
+statue
+statue's
+statued
+statues
+statuesque
+statuesquely
+statuesqueness
+statuette
+stature
+status
+statuses
+statutable
+statute
+statute's
+statutes
+statutorily
+statutoriness
+statutory
+statz
+Stauffer
+staunch
+staunchest
+staunchly
+staunchness
+Staunton
+staurolite
+staurolitic
+stauroscope
+Stavanger
+stave
+staved
+staves
+stavesacre
+staving
+Stavropol
+stavropoulos
+stay
+stayed
+stayer
+stayers
+staying
+stays
+staysail
+stdio
+stead
+steadfast
+steadfastly
+steadfastness
+steadied
+steadier
+steadies
+steadiest
+steadily
+steadiness
+steading
+steady
+steadying
+steak
+steak's
+steakhouse
+steaks
+steal
+stealer
+stealing
+steals
+stealth
+stealthier
+stealthily
+stealthiness
+stealthy
+steam
+steamboat
+steamboat's
+steamboats
+steamed
+steamer
+steamers
+steamie
+steamier
+steamily
+steaminess
+steaming
+steamroll
+steamroller
+steams
+steamship
+steamship's
+steamships
+steamtight
+steamy
+steapsin
+stearate
+stearic
+stearin
+stearine
+Stearns
+stearoptene
+steatite
+steatitic
+steatolysis
+steatopygia
+steatopygic
+steatorrhoea
+Steber
+stecher
+stedfast
+steed
+steeds
+steel
+Steele
+Steele's
+steeled
+steelers
+steelhead
+steelie
+steelier
+steelies
+steeliness
+steeling
+steelmaker
+steels
+steelwork
+steelworker
+steelworks
+steely
+steelyard
+Steen
+Steen's
+steenbok
+steep
+steeped
+steepen
+steepened
+steepening
+steeper
+steepest
+steeping
+steeple
+steeple's
+steeplebush
+steeplechase
+steeplechaser
+steeplejack
+steeples
+steeply
+steepness
+steeps
+steer
+steerable
+steerage
+steerageway
+steered
+steerer
+steering
+steers
+steersman
+steeve
+steeves
+steeving
+Stefan
+Stefan's
+Stefansson
+steffens
+Stegodon
+Stegomyia
+stegosaur
+stegosaurus
+Stegosaurus
+steichen
+Steier
+Steiermark
+stein
+Stein
+Steinbeck
+Steinbecks
+steinbecks
+Steinberg
+steiner
+steiners
+Steinitz
+stela
+stelae
+stelar
+stele
+Stella
+stellar
+stellarator
+stellate
+stelliferous
+stelliform
+stellify
+Stellite
+stellular
+stem
+stem's
+stemhead
+stemless
+stemma
+stemmata
+stemmed
+stemmer
+stemmier
+stemming
+stemmy
+stems
+stemson
+stemware
+stench
+stench's
+stenches
+stenchful
+stenchy
+stencil
+stencil's
+stenciled
+stenciler
+stencilers
+stenciling
+stencilize
+stencils
+Stendhal
+stendhal
+Stendler
+steno
+stenobathic
+stenograph
+stenographer
+stenographer's
+stenographers
+stenographic
+stenographically
+stenography
+stenohaline
+stenopetalous
+stenophagous
+stenophyllous
+stenos
+stenosed
+stenosis
+stenotherm
+stenothermal
+stenothermy
+stenotic
+stenotopic
+stenotropic
+stenotype
+stenotypist
+stenotypy
+stentor
+stentorian
+stentorophonic
+step
+step's
+stepbrother
+stepchild
+stepchildren
+stepdame
+stepdaughter
+stepfather
+stephan
+Stephan
+Stephanie
+Stephanie's
+stephanotis
+Stephen
+Stephens
+Stephenson
+stepladder
+stepladders
+steplike
+stepmother
+stepmother's
+stepmothers
+stepparent
+steppe
+stepped
+stepper
+steppes
+stepping
+steprelation
+steps
+stepsister
+stepson
+stepwise
+steradian
+stercoraceous
+stercoricolous
+sterculiaceous
+stere
+stereo
+stereo's
+stereobate
+stereochemical
+stereochemically
+stereochemistry
+stereochrome
+stereochromy
+stereogram
+stereogram's
+stereograms
+stereograph
+stereographic
+stereographically
+stereography
+stereoisomer
+stereoisomeric
+stereoisomerism
+stereoisomers
+stereological
+stereologically
+stereology
+stereometric
+stereometry
+stereomicroscope
+stereomicroscopic
+stereomicroscopically
+stereophonic
+stereophonically
+stereophony
+stereophotographic
+stereophotography
+stereopsis
+stereopticon
+stereoregular
+stereoregularity
+stereos
+stereoscope
+stereoscopic
+stereoscopically
+stereoscopy
+stereospecific
+stereospecifically
+stereospecificity
+stereotape
+stereotaxic
+stereotaxically
+stereotaxis
+stereotomy
+stereotropism
+stereotype
+stereotyped
+stereotyper
+stereotypers
+stereotypes
+stereotypic
+stereotypical
+stereotypically
+stereotyping
+stereotypy
+stereovision
+steric
+sterically
+sterics
+sterigma
+sterilant
+sterile
+sterility
+sterilizabilities
+sterilizability
+sterilizability's
+sterilizable
+sterilizable's
+sterilizables
+sterilization
+sterilization's
+sterilizations
+sterilize
+sterilized
+sterilizer
+sterilizers
+sterilizes
+sterilizing
+sterios
+sterlet
+sterling
+sterlingly
+sterlingness
+sterlitamak
+stern
+Stern
+sterna
+sternal
+Sternberg
+Sternberg's
+sterne
+sternforemost
+sternite
+sternly
+sternmost
+sternness
+Sterno
+sternocostal
+sternpost
+sterns
+sternson
+sternum
+sternutation
+sternutator
+sternutatory
+sternward
+sternwards
+sternway
+steroid
+steroidal
+steroidogenesis
+steroidogenic
+steroids
+sterol
+stertor
+stertorous
+stertorously
+stet
+stethoscope
+stethoscopic
+stethoscopically
+Stetson
+Stetsons
+stetted
+stettin
+stetting
+Steuben
+Steve
+Steve's
+stevedore
+stevedores
+Steven
+Steven's
+stevenage
+stevengraph
+Stevens
+Stevenson
+Stevie
+stevie
+stew
+steward
+steward's
+stewardess
+stewardesses
+stewards
+stewardship
+Stewart
+Stewart's
+stewed
+stewing
+stewpan
+stews
+steyr
+sthenic
+stheno
+stibine
+stibium
+stibnite
+stich
+stichometry
+stichomythia
+stichomythic
+stichomythy
+stick
+stickball
+sticked
+sticker
+stickers
+stickful
+stickhandler
+stickier
+stickiest
+stickily
+stickiness
+sticking
+stickit
+stickle
+stickleback
+stickled
+stickler
+stickling
+stickpin
+sticks
+stickseed
+sticktight
+stickum
+stickup
+stickweed
+stickwork
+sticky
+stickybeak
+sticle
+sticy
+stidger
+stiff
+stiffen
+stiffened
+stiffener
+stiffeners
+stiffening
+stiffens
+stiffer
+stiffest
+stiffish
+stiffly
+stiffness
+stiffnesses
+stiffs
+stifle
+stifled
+stifler
+stifles
+stifling
+stiflingly
+stigma
+stigmal
+stigmas
+stigmasterol
+stigmata
+stigmatic
+stigmatically
+stigmatism
+stigmatist
+stigmatization
+stigmatization's
+stigmatizations
+stigmatize
+stigmatized
+stigmatizer
+stigmatizers
+stigmatizes
+stigmatizing
+Stijl
+stilbene
+stilbestrol
+stilbite
+stile
+stile's
+stiles
+stiletto
+stilicho
+still
+stillage
+stillbirth
+stillbirths
+stillborn
+stilled
+stiller
+stillest
+stillicide
+stilliform
+stilling
+stillman
+stillness
+stillroom
+stills
+Stillson
+Stillsons
+stillwater
+stillwell
+Stillwell
+stilly
+stilt
+stilted
+stiltedly
+stiltedness
+Stilton
+stilts
+Stilwell
+stime
+Stimson
+stimulant
+stimulant's
+stimulants
+stimulate
+stimulated
+stimulates
+stimulating
+stimulation
+stimulations
+stimulative
+stimulator
+stimulators
+stimulatory
+stimuli
+stimulus
+sting
+stingaree
+stinger
+stingier
+stingily
+stinginess
+stinging
+stingingly
+stingless
+stingo
+stingray
+stingray's
+stingrays
+stings
+stingy
+stink
+stinkard
+stinkbug
+stinkbug's
+stinkbugs
+stinker
+stinkers
+stinkhorn
+stinking
+stinkingly
+stinko
+stinkpot
+stinkpotters
+stinks
+stinkstone
+stinkweed
+stinkwood
+stinky
+stint
+stint's
+stinted
+stinter
+stinting
+stints
+stion
+stioning
+stipe
+stiped
+stipel
+stipellate
+stipend
+stipend's
+stipendiary
+stipends
+stipes
+stipitate
+stipites
+stipple
+stippled
+stippler
+stipples
+stippling
+stipular
+stipulate
+stipulated
+stipulates
+stipulating
+stipulation
+stipulations
+stipulator
+stipulatory
+stipule
+stipuled
+stir
+stirabout
+stirk
+Stirling
+stirp
+stirpes
+stirps
+stirred
+stirrer
+stirrer's
+stirrers
+stirring
+stirringly
+stirrings
+stirrup
+stirrups
+stirs
+stitch
+stitched
+stitcher
+stitchery
+stitches
+stitching
+stitchwort
+stithies
+stithy
+stiver
+stoa
+stoat
+stoat's
+stoats
+stob
+stochastic
+stochastically
+stochasticity
+stock
+stockade
+stockade's
+stockaded
+stockades
+stockading
+stockbreeder
+stockbroker
+stockbrokerage
+stockbroking
+stockcar
+stocked
+stocker
+stockers
+stockfish
+Stockhausen
+stockholder
+stockholder's
+stockholders
+Stockholm
+stockier
+stockily
+stockiness
+stockinet
+stockinette
+stocking
+stockinged
+stockings
+stockish
+stockist
+stockjobber
+stockkeeper
+stockman
+stockpile
+stockpiler
+stockpiling
+Stockport
+stockpot
+stockproof
+stockroom
+stocks
+stocktaking
+Stockton
+Stockwood
+stocky
+stockyard
+stockynges
+stodge
+stodgier
+stodgily
+stodginess
+stodging
+stodgy
+stogie
+stogies
+stogy
+stoic
+stoical
+stoically
+stoichiometric
+stoichiometrically
+stoichiometry
+stoicism
+stoics
+stoke
+stoked
+stokehold
+stokehole
+stoker
+stokes
+stokesia
+stoking
+Stokowski
+Stokys
+STOL
+stole
+stole's
+stoled
+stolen
+stoles
+stolid
+stolidity
+stolidly
+stoll
+stollen
+stollens
+stolon
+stolonate
+stoloniferous
+stoloniferously
+stolzenbach
+stoma
+stomach
+stomachache
+stomached
+stomacher
+stomaches
+stomachic
+stomachically
+stomaching
+stomachs
+stomachy
+stomack
+stomal
+stomas
+stomata
+stomatal
+stomate
+stomatic
+stomatitis
+stomatologic
+stomatological
+stomatologist
+stomatology
+stomatoplasty
+stomatopod
+stomodaeal
+stomodaeum
+stomodeal
+stomodeum
+stomp
+stomped
+stomping
+stomps
+stone
+Stone
+Stone's
+stone's
+stoneboat
+stonecast
+stonechat
+stonecrop
+stonecutter
+stonecutters
+stonecutting
+stoned
+stonefish
+stonefly
+stoneground
+Stonehenge
+stonemason
+stonemasonry
+stonemasons
+stoner
+stones
+stonewall
+stoneware
+stonework
+stoneworker
+stonewort
+stoney
+stonier
+stonily
+stoniness
+stoning
+stonk
+stonkered
+stony
+stonyhearted
+stonyheartedness
+stood
+stooge
+stooges
+stooging
+stook
+stool
+stoolie
+stools
+stoop
+stoopball
+stooped
+stooping
+stoops
+stop
+stop's
+stopband
+stopcock
+stopcocks
+stope
+stopes
+stopgap
+stopgap's
+stopgaps
+stoplight
+stoplights
+stopover
+stopovers
+stoppable
+stoppage
+stoppages
+stoppard
+stopped
+stopper
+stopper's
+stoppered
+stoppering
+stoppers
+stopping
+stopple
+stoppled
+stoppling
+stops
+stopwatch
+stopwatches
+storable
+storage
+storage's
+storages
+storax
+store
+stored
+storefront
+storefront's
+storefronts
+storehouse
+storehouse's
+storehouses
+storekeep
+storekeeper
+storekeepers
+storeria
+storeroom
+stores
+storeship
+storewide
+Storey
+Storeyed
+storeyed
+Storeys
+storiated
+storied
+stories
+storing
+stork
+stork's
+storks
+storksbill
+storm
+stormbound
+stormed
+stormier
+stormiest
+stormily
+storminess
+storming
+stormproof
+storms
+stormy
+stornoway
+storr
+storrs
+Storting
+story
+story's
+storyboard
+storyboards
+storybook
+storybooks
+storying
+storyteller
+storytellers
+storytelling
+storywriter
+stoss
+stot
+stotinka
+stotious
+stotter
+Stouffer
+stound
+stoup
+stour
+Stourbridge
+stoush
+stout
+stouten
+stoutened
+stoutening
+stouter
+stoutest
+stouthearted
+stoutheartedly
+stoutheartedness
+stoutish
+stoutly
+stoutness
+stove
+stove's
+stovepipe
+stovepipes
+stover
+stoves
+stow
+stowage
+stowages
+stowaway
+stowaway's
+stowaways
+stowe
+Stowe
+stowed
+stowey
+stowing
+stows
+strabismic
+strabismus
+strabo
+strabotomy
+strachey
+straddle
+straddled
+straddler
+straddlers
+straddles
+straddling
+Stradivari
+Stradivarius
+strafaci
+strafe
+strafer
+strafes
+Strafford
+strafing
+straggle
+straggled
+straggler
+stragglers
+straggles
+stragglier
+straggling
+straggly
+straight
+straightaway
+straightbred
+straightedge
+straighten
+straightened
+straightener
+straighteners
+straightening
+straightens
+straighter
+straightest
+straightforward
+straightforwardly
+straightforwardness
+straightforwards
+straightish
+straightjacket
+straightlaced
+straightly
+straightness
+straightway
+strain
+strained
+strainer
+strainers
+straining
+strainometer
+strainometer's
+strainometers
+strains
+strait
+straiten
+straitened
+straitening
+straitjacket
+straitlaced
+straitlacedly
+straitlacedness
+straitly
+straitness
+straits
+strake
+Stralsund
+stram
+stramash
+stramonium
+stranahan
+strand
+stranded
+strandedness
+strander
+stranding
+strandline
+strandloper
+strands
+strange
+strangely
+strangeness
+stranger
+stranger's
+strangers
+strangest
+strangle
+strangled
+stranglehold
+strangler
+stranglers
+strangles
+strangling
+stranglings
+strangulate
+strangulated
+strangulation
+strangulation's
+strangulations
+strangury
+Stranraer
+strap
+strap's
+straphang
+straphanger
+strapless
+strappado
+strapped
+strapper
+strapping
+straps
+Strasbourg
+strata
+stratagem
+stratagem's
+stratagems
+Stratas
+strategem
+strategems
+strategic
+strategical
+strategically
+strategics
+strategies
+strategist
+strategists
+strategy
+strategy's
+Stratford
+strath
+Strathclyde
+strathspey
+strathspeys
+strati
+straticulate
+stratification
+stratificational
+stratifications
+stratified
+stratifies
+stratiform
+stratify
+stratifying
+stratigraphic
+stratigraphical
+stratigraphically
+stratigraphy
+stratocracy
+stratocumulus
+stratopause
+stratosphere
+stratospheric
+Stratton
+Stratton's
+stratum
+stratus
+Straus
+Strauss
+stravage
+Stravaig
+Stravinsky
+stravinsky
+straw
+straw's
+strawberries
+strawberry
+strawberry's
+strawboard
+strawflower
+strawflowers
+strawman
+straws
+strawworm
+stray
+stray's
+strayed
+strayer
+straying
+strays
+streak
+streaked
+streakier
+streakiness
+streaking
+streaks
+streaky
+stream
+streambed
+streamed
+streamer
+streamers
+streaming
+streamlet
+streamline
+streamlined
+streamliner
+streamlines
+streamlining
+streams
+streamside
+streamy
+streek
+street
+streetcar
+streetcar's
+streetcars
+streeters
+streetlight
+streets
+streetwalker
+streetwalking
+Streisand
+Strelitzia
+strength
+strengthen
+strengthened
+strengthener
+strengthening
+strengthens
+strengthless
+strengthlessness
+strengths
+strenuosity
+strenuous
+strenuously
+strenuousness
+strep
+strepitous
+streptobacillus
+streptococcal
+streptococcic
+streptococcus
+streptokinase
+streptolysin
+streptomyces
+streptomycete
+streptomycin
+streptothricin
+stress
+stressed
+stresses
+stressful
+stressfully
+stressing
+stressless
+stresslessness
+stressor
+stretch
+stretchability
+stretchable
+stretched
+stretcher
+stretchers
+stretches
+stretching
+stretchy
+Stretford
+stretta
+stretti
+stretto
+strettos
+Streusel
+strew
+strewing
+strewment
+strewn
+strews
+strewth
+stria
+striae
+striate
+striated
+striates
+striating
+striation
+strick
+stricken
+Strickland
+Strickland's
+strickle
+strickled
+strickling
+strict
+stricter
+strictest
+striction
+strictly
+strictness
+stricture
+strictures
+stridden
+stride
+stridence
+stridency
+strident
+stridently
+strider
+strides
+striding
+stridor
+stridulate
+stridulation
+stridulatory
+stridulous
+stridulously
+strife
+strifeless
+strigiform
+strigil
+strigose
+strike
+strikebound
+strikebreak
+strikebreaker
+strikebreakers
+strikebreaking
+strikeless
+strikeout
+strikeover
+striker
+strikers
+strikes
+striking
+strikingly
+strimon
+Strindberg
+strine
+string
+string's
+stringboard
+stringcourse
+stringed
+stringency
+stringendo
+stringent
+stringently
+stringer
+stringers
+stringhalt
+stringhalted
+stringier
+stringiest
+stringiness
+stringing
+stringless
+stringpiece
+strings
+stringy
+strip
+strip's
+stripe
+striped
+stripeless
+striper
+stripes
+stripfilm
+stripier
+striping
+stripling
+strippable
+stripped
+stripper
+stripper's
+strippers
+stripping
+strips
+stript
+striptease
+stripteaser
+stripy
+strive
+striven
+striver
+strives
+striving
+strivings
+strobe
+strobe's
+strobed
+strobes
+strobic
+strobila
+strobilaceous
+strobilar
+strobilation
+strobile
+strobilization
+strobilus
+strobing
+stroboscope
+stroboscopic
+stroboscopically
+strobotron
+strode
+stroganoff
+Stroheim
+stroke
+stroked
+strokefinder
+stroker
+strokers
+strokes
+stroking
+stroll
+strolled
+stroller
+strolling
+strolls
+Strom
+Strom's
+stroma
+stromal
+stromata
+stromatal
+stromatic
+stromatolite
+stromatolitic
+Stromberg
+stromboli
+stromeyerite
+strong
+strongbox
+stronger
+strongest
+Strongheart
+strongheart
+stronghold
+strongish
+strongly
+strongman
+strongroom
+strongrooms
+strongyle
+strontia
+strontian
+strontianite
+strontic
+strontium
+strop
+strophanthin
+Strophanthus
+strophe
+strophes
+strophic
+strophoid
+stropped
+stropping
+stroppy
+strops
+stroud
+strouding
+strove
+strow
+strowing
+stroy
+struck
+structural
+structuralism
+structuralist
+structuralists
+structuralization
+structuralization's
+structuralizations
+structuralize
+structuralizes
+structurally
+structure
+structured
+structureless
+structurelessness
+structurer
+structures
+structuring
+strudel
+struggle
+struggled
+struggler
+struggles
+struggling
+strum
+struma
+strumae
+strumas
+strummer
+strumming
+strumose
+strumpet
+strung
+strunt
+strut
+struthious
+struts
+strutted
+strutter
+strutting
+strychnic
+strychnine
+strychninism
+strychninization
+strychninization's
+strychninizations
+strychninize
+strychninizes
+Strymon
+Stu
+Stuart
+stub
+stub's
+stubbed
+stubbing
+stubble
+stubblefield
+Stubblefield
+Stubblefields
+stubblefields
+stubbly
+stubborn
+stubbornly
+stubbornness
+stubbs
+stubby
+stubs
+stucco
+stuccoes
+stuccowork
+stuck
+stud
+stud's
+studbook
+studbooks
+studded
+studding
+studdingsail
+Studebaker
+student
+student's
+students
+studentship
+studentships
+studhorse
+studied
+studiedly
+studiedness
+studier
+studies
+studio
+studio's
+studios
+studious
+studiously
+studiousness
+studs
+studwork
+study
+studying
+stuff
+stuffed
+stuffer
+stuffier
+stuffiest
+stuffily
+stuffiness
+stuffing
+stuffings
+stuffless
+stuffs
+stuffy
+stull
+stultification
+stultify
+stultifying
+stum
+stumble
+stumblebum
+stumbled
+stumbler
+stumbles
+stumbling
+stumblingly
+stumer
+stumming
+stump
+stumpage
+stumped
+stumper
+stumping
+stumps
+stumpy
+stun
+stung
+stunk
+stunned
+stunner
+stunning
+stunningly
+stuns
+stunsail
+stunt
+stunt's
+stunted
+stuntedness
+stunting
+stunts
+stupa
+stupe
+stupefacient
+stupefaction
+stupefy
+stupefying
+stupendous
+stupendously
+stupendousness
+stupid
+stupider
+stupidest
+stupidities
+stupidity
+stupidly
+stupidness
+stupor
+stuporous
+Sturbridge
+Sturbridge's
+sturch
+sturdier
+sturdily
+sturdiness
+sturdy
+sturgeon
+sturley
+Sturm
+Sturm's
+sturmer
+sturt
+stutter
+stuttered
+stutterer
+stuttering
+stutters
+Stuttgart
+Stuyvesant
+sty
+stye
+styes
+Stygian
+stying
+styka
+Stylar
+style
+stylebook
+styled
+styleless
+stylelessness
+styler
+stylers
+styles
+stylet
+styli
+styliform
+styling
+stylish
+stylishly
+stylishness
+stylist
+stylistic
+stylistically
+stylistics
+stylite
+stylites
+stylitic
+stylization
+stylization's
+stylizations
+stylize
+stylized
+stylizer
+stylizers
+stylizes
+stylizing
+stylobate
+stylograph
+stylographic
+stylographical
+stylographically
+stylography
+styloid
+stylolite
+stylopodium
+Stylops
+stylostixis
+stylus
+styluses
+stymie
+stymied
+stymieing
+stymies
+stypsis
+styptic
+styracaceous
+styrax
+styrene
+styrenes
+styria
+Styrofoam
+Styx
+suability
+suable
+suably
+suakin
+suasion
+suasive
+suasively
+suasiveness
+suave
+suavely
+suaveness
+suavity
+sub
+subacetate
+subacid
+subacidly
+subacidness
+subacute
+subacutely
+subadar
+subadult
+subaerial
+subaerially
+subagency
+subagent
+subah
+subahdar
+subalpine
+subaltern
+subalternate
+subalternately
+subalternation
+subangular
+subantarctic
+subapical
+Subapically
+subapostolic
+subaqua
+subaquatic
+subaqueous
+subarctic
+subarea
+subareas
+subarid
+subarmor
+subarmor's
+subarmors
+subassemblage
+subassemblages
+subassembly
+subastral
+subatmospheric
+subatomic
+subaudible
+subaudition
+subauricular
+subaverage
+subaxillary
+subbase
+subbasement
+subbass
+subbing
+subcabinet
+subcalibre
+subcapsular
+subcartilaginous
+subcaste
+subcategorizing
+subcelestial
+subcellular
+subcenter
+subcentral
+subcentrally
+subception
+subchain
+subchannels
+subchaser
+subchloride
+subclass
+subclass's
+subclasses
+subclassifications
+subclavian
+subclimax
+subclinical
+subclinically
+subcluster
+subclusters
+subcollegiate
+subcommand
+subcommands
+subcommittee
+subcommittee's
+subcommittees
+subcommunity
+subcompact
+subcomponent
+subcomponent's
+subcomponents
+subcomputation
+subcomputation's
+subcomputations
+subconcept
+subconscious
+subconsciously
+subconsciousness
+subconstituent
+subcontinent
+subcontinental
+subcontract
+subcontracting
+subcontractor
+subcontraoctave
+subcontrariety
+subcontrary
+subcool
+subcordate
+subcortex
+subcortical
+subcritical
+subcrustal
+subcultural
+subculture
+subculture's
+subcultures
+subcutaneous
+subcutaneously
+subdeacon
+subdeb
+subdebutante
+subdelirium
+subdepot
+subdiaconate
+subdirectories
+subdirectory
+subdistrict
+subdividable
+subdivide
+subdivided
+subdivider
+subdivides
+subdividing
+subdivision
+subdivision's
+subdivisions
+subdominance
+subdominant
+subduct
+subdue
+subdued
+subduedly
+subduer
+subdues
+subduing
+subedit
+subeditor
+subeditorial
+subelement
+subelements
+subemployed
+subemployment
+subentries
+subentry
+subepidermal
+subepidermally
+subepidermis
+subequatorial
+suberect
+suberic
+suberin
+suberization
+suberization's
+suberizations
+suberize
+suberized
+suberizes
+suberizing
+suberose
+subexpression
+subexpression's
+subexpressions
+subfamilies
+subfamily
+subfield
+subfield's
+subfields
+subfile
+subfile's
+subfiles
+subfix
+subflavor
+subflavor's
+subflavors
+subfloor
+subfossil
+subfreezing
+subfusc
+subgenus
+subglacial
+subglacially
+subglottal
+subgoal
+subgoal's
+subgoals
+subgrade
+subgrammar
+subgraph
+subgraphs
+subgross
+subgroup
+subgroup's
+subgrouping
+subgroups
+subhead
+subheading
+subhuman
+subhumanity
+subi
+subic
+subindex
+subinfeud
+subinfeudate
+subinfeudation
+subinfeudatory
+subinstance
+subinstances
+subinterval
+subinterval's
+subintervals
+subirrigate
+subirrigation
+subito
+subj
+subjacency
+subjacent
+subjacently
+subject
+subject's
+subjected
+subjectify
+subjecting
+subjection
+subjective
+subjectively
+subjectiveness
+subjectivism
+subjectivist
+subjectivistic
+subjectivists
+subjectivity
+subjectivization
+subjectivize
+subjectivizes
+subjectless
+subjects
+subjoin
+subjugate
+subjugated
+subjugates
+subjugating
+subjugation
+subjugator
+subjunction
+subjunctive
+subkingdom
+sublanguage
+sublanguages
+sublapsarianism
+sublate
+sublated
+sublating
+sublation
+sublease
+sublet
+sublethal
+sublethally
+sublevel
+sublicense
+sublicensed
+sublicenser
+sublicenses
+sublicensing
+sublieutenant
+sublimable
+sublimate
+sublimated
+sublimates
+sublimating
+sublimation
+sublimations
+sublime
+sublimed
+sublimely
+sublimeness
+sublimer
+subliminal
+subliminally
+subliming
+sublimity
+sublimize
+sublimizes
+sublingual
+sublist
+sublist's
+sublists
+subliterary
+subliterature
+sublittoral
+sublunar
+sublunary
+subluxation
+submachine
+submandibular
+submarginal
+submarginally
+submarine
+submarined
+submariner
+submariners
+submarines
+submarining
+submaxilla
+submaxillary
+submediant
+submental
+submerge
+submerged
+submergence
+submerges
+submergible
+submerging
+submerse
+submersed
+submersible
+submersing
+submersion
+submicrogram
+submicrogram's
+submicrograms
+submicron
+submicroscopic
+submicroscopically
+subminiature
+subminiaturization
+subminiaturize
+subminiaturized
+subminiaturizes
+subminiaturizing
+submiss
+submission
+submission's
+submissions
+submissive
+submissively
+submissiveness
+submit
+submitochondrial
+submits
+submittal
+submitted
+submitter
+submitters
+submitting
+submode
+submodes
+submodule
+submodule's
+submodules
+submontane
+submucosa
+submucosal
+submucosally
+submucous
+submultiple
+subnational
+subnet
+subnets
+subnetwork
+subnetwork's
+subnetworks
+subnormal
+subnormality
+subnormally
+suboceanic
+subopposite
+suboptimal
+suboptimum
+suborbicular
+suborbital
+suborder
+subordinary
+subordinate
+subordinated
+subordinately
+subordinateness
+subordinates
+subordinating
+subordination
+subordinationism
+subordinative
+subordinator
+suborn
+subornation
+suborned
+suborner
+suborning
+suborns
+subotica
+subovate
+suboxide
+suboxides
+subpage
+subpanel
+subpanels
+subpar
+subparagraph
+subparallel
+subparameter
+subparameters
+subpart
+subparts
+subphylum
+subplot
+subplots
+subpoena
+subpoenaed
+subpoenas
+subpolar
+subpopulation
+subpopulations
+subpotency
+subpotent
+subprincipal
+subproblem
+subproblem's
+subproblems
+subprocess
+subprocess's
+subprocesses
+subprocessor
+subprofessional
+subprogram
+subprogram's
+subprograms
+subproject
+subproof
+subproof's
+subproofs
+subpulverizer
+subpulverizer's
+subpulverizers
+subquestion
+subquestion's
+subquestions
+subrange
+subrange's
+subranges
+subregion
+subregional
+subregionally
+subregions
+subreption
+subreptitious
+subreptitiously
+subring
+subrogate
+subrogation
+subroutine
+subroutine's
+subroutines
+subs
+subsaline
+subsample
+subsamples
+subsatellite
+subsaturated
+subsaturation
+subscan
+subscans
+subscapular
+subschema
+subschema's
+subschemas
+subscribe
+subscribed
+subscriber
+subscribers
+subscribes
+subscribing
+subscript
+subscripted
+subscripting
+subscription
+subscription's
+subscriptions
+subscripts
+subsectio
+subsection
+subsection's
+subsections
+subsegment
+subsegment's
+subsegments
+subsentence
+subsequence
+subsequence's
+subsequences
+subsequent
+subsequently
+subsequentness
+subserve
+subservience
+subserviency
+subservient
+subserviently
+subset
+subset's
+subsets
+subshrub
+subshrubby
+subside
+subsided
+subsidence
+subsides
+subsidiaries
+subsidiarily
+subsidiary
+subsidiary's
+subsidies
+subsiding
+subsidizable
+subsidizable's
+subsidizables
+subsidization
+subsidization's
+subsidizations
+subsidize
+subsidized
+subsidizer
+subsidizers
+subsidizes
+subsidizing
+subsidy
+subsidy's
+subsist
+subsisted
+subsistence
+subsistent
+subsisting
+subsists
+subsocial
+subsocietal
+subsoil
+subsoiler
+subsolar
+subsonic
+subsonically
+subspace
+subspace's
+subspaces
+subspecialize
+subspecializes
+subspecialties
+subspecialty
+subspecialty's
+subspecies
+subspecific
+substage
+substance
+substance's
+substanceless
+substances
+substandard
+substandardize
+substandardizes
+substantial
+substantialism
+substantiality
+substantialize
+substantializes
+substantially
+substantialness
+substantiate
+substantiated
+substantiates
+substantiating
+substantiation
+substantiations
+substantiative
+substantival
+substantivally
+substantive
+substantively
+substantiveness
+substantivity
+substantivize
+substantivizes
+substation
+substations
+substerilization
+substituent
+substituents
+substitutability
+substitutable
+substitute
+substituted
+substituter
+substitutes
+substituting
+substitution
+substitutional
+substitutionally
+substitutionary
+substitutions
+substitutive
+substitutively
+substomatal
+substrate
+substrate's
+substrates
+substratosphere
+substratospheric
+substratum
+substring
+substrings
+substructural
+substructure
+substructure's
+substructures
+subsume
+subsumed
+subsumes
+subsuming
+subsumption
+subsurface
+subsystem
+subsystem's
+subsystems
+subtable
+subtables
+subtangent
+subtask
+subtask's
+subtasks
+subteen
+subtemperate
+subtenancy
+subtenant
+subtend
+subtended
+subtends
+subterfuge
+subterfuges
+subterminal
+subternatural
+subterranean
+subterraneanize
+subterraneanizes
+subterraneanly
+subterraneous
+subtest
+subtetanic
+subthreshold
+subtile
+subtilely
+subtileness
+subtiler
+subtilest
+subtilis
+subtilisin
+subtilization
+subtilization's
+subtilizations
+subtilize
+subtilizer
+subtilizers
+subtilizes
+subtilty
+subtitle
+subtitle's
+subtitled
+subtitles
+subtitling
+subtle
+subtleness
+subtler
+subtlest
+subtleties
+subtlety
+subtly
+subtonic
+subtopic
+subtopic's
+subtopics
+subtorrid
+subtotal
+subtotaled
+subtotaling
+subtotals
+subtract
+subtracted
+subtracter
+subtracter's
+subtracters
+subtracting
+subtraction
+subtractions
+subtractive
+subtracts
+subtrahend
+subtrahend's
+subtrahends
+subtreasury
+subtree
+subtree's
+subtrees
+subtropic
+subtropical
+subtropics
+subtype
+subtypes
+subufd
+subufds
+subulate
+subunit
+subunit's
+subunits
+suburb
+suburb's
+suburban
+suburbanite
+suburbanites
+suburbanization
+suburbanization's
+suburbanizations
+suburbanize
+suburbanized
+suburbanizes
+suburbanizing
+suburbia
+suburbicarian
+suburbs
+subvene
+subvention
+subventionary
+subversion
+subversionary
+subversive
+subversively
+subversiveness
+subversives
+subvert
+subverted
+subverter
+subverting
+subverts
+subviral
+subvitalized
+subvitalized's
+subvitalizeds
+subvocal
+subvocally
+subway
+subway's
+subways
+subzero
+succedaneous
+succedaneum
+succedent
+succeed
+succeeded
+succeeder
+succeeding
+succeeds
+succentor
+succeptibility
+success
+successes
+successful
+successfully
+successfulness
+succession
+succession's
+successional
+successionally
+successions
+successive
+successively
+successiveness
+successor
+successor's
+successors
+successorship
+successsive
+succinate
+succinct
+succinctly
+succinctness
+succinic
+succinyl
+succinylcholine
+succor
+succorable
+succorable's
+succorables
+succored
+succorer
+succorer's
+succorers
+succoring
+succorless
+succorlesses
+succors
+succory
+succotash
+succoth
+succuba
+succubi
+succubus
+succulence
+succulent
+succulently
+succumb
+succumbed
+succumbing
+succumbs
+succursal
+succuss
+such
+suchlike
+suck
+sucked
+sucker
+suckered
+suckerfish
+suckering
+suckers
+sucking
+suckle
+suckled
+suckles
+suckling
+sucks
+sucrase
+sucre
+sucrose
+suction
+suctional
+suctorial
+suctorian
+Sudan
+Sudanese
+Sudanic
+sudanic
+sudarium
+sudatorium
+sudatory
+sudbury
+sudd
+sudden
+suddenly
+suddenness
+Sudetenland
+sudetes
+sudor
+sudoriferous
+sudorific
+Sudra
+suds
+sudser
+sudsier
+sudsing
+sudsless
+sudsy
+sue
+sued
+suede
+sueded
+sueding
+suer
+sues
+suet
+suetonius
+suey
+Suez
+suff
+suffer
+sufferable
+sufferableness
+sufferably
+sufferage
+sufferance
+suffered
+sufferer
+sufferers
+suffering
+sufferings
+suffers
+suffice
+sufficed
+sufficer
+suffices
+sufficiency
+sufficient
+sufficiently
+sufficing
+suffiency
+suffix
+suffixation
+suffixed
+suffixer
+suffixes
+suffixing
+sufflate
+suffocate
+suffocated
+suffocates
+suffocating
+suffocatingly
+suffocation
+suffocative
+Suffolk
+suffragan
+suffrage
+suffragette
+suffragettes
+suffragist
+suffragists
+suffruticose
+suffumigate
+suffuse
+suffused
+suffuses
+suffusing
+suffusion
+suffusive
+Sufi
+Sufism
+sufu
+sugar
+sugarcane
+sugarcoat
+sugared
+sugarhouse
+sugaring
+sugarings
+sugarloaf
+sugarplum
+sugars
+sugary
+suggest
+suggested
+suggester
+suggestibility
+suggestible
+suggestibly
+suggesting
+suggestion
+suggestion's
+suggestionize
+suggestionizes
+suggestions
+suggestive
+suggestively
+suggestiveness
+suggests
+suharto
+suicidal
+suicidally
+suicide
+suicide's
+suicided
+suicides
+suiciding
+suing
+suint
+suisse
+suit
+suit's
+suitability
+suitable
+suitableness
+suitably
+suitcase
+suitcase's
+suitcases
+suite
+suited
+suiters
+suites
+suiting
+suitor
+suitor's
+suitors
+suits
+sukarnapura
+Sukarno
+sukarno
+sukhumi
+sukiyaki
+sukkoth
+sulamite
+sulamith
+sulcate
+sulci
+sulcus
+suleiman
+sulfa
+sulfadiazine
+sulfanilamide
+sulfaquinoxaline
+sulfatase
+sulfate
+sulfated
+sulfatide
+sulfatides
+sulfating
+sulfatize
+sulfatizes
+sulfhydryl
+sulfide
+sulfinyl
+sulfite
+sulfitic
+sulfonamide
+sulfonamides
+sulfonate
+sulfonation
+sulfone
+sulfonic
+sulfonium
+sulfonmethane
+sulfonyl
+sulfonylurea
+sulfoxide
+sulfur
+sulfured
+sulfureous
+sulfureously
+sulfureousness
+sulfuret
+sulfuric
+sulfuring
+sulfurization
+sulfurization's
+sulfurizations
+sulfurize
+sulfurizes
+sulfurous
+sulfurously
+sulfurousness
+sulfuryl
+sulk
+sulked
+sulkies
+sulkily
+sulkiness
+sulking
+sulks
+sulky
+sulla
+sullage
+sullen
+sullenly
+sullenness
+sullied
+sullies
+Sullivan
+sully
+sullying
+sulphadiazine
+sulphanilamide
+sulphate
+sulphates
+sulphathiazole
+sulphide
+sulphinyl
+sulphisoxazole
+sulphite
+sulphonamide
+sulphonate
+sulphonated
+sulphone
+sulphonic
+sulphonium
+sulphonmethane
+sulphonyl
+sulphur
+sulphurate
+sulphured
+sulphuret
+sulphuretted
+sulphuric
+sulphurization
+sulphurization's
+sulphurizations
+sulphurize
+sulphurizes
+sulphurou
+sulphurous
+sulphuryl
+sultan
+sultan's
+sultana
+Sultanabad
+sultanate
+sultaness
+sultanize
+sultanizes
+sultans
+sultrier
+sultrily
+sultriness
+sultry
+Sulu
+sulzberger
+Sulzberger
+sum
+sum's
+sumac
+sumach
+Sumatra
+Sumba
+Sumbawa
+sumer
+Sumeria
+Sumerian
+summa
+summability
+summable
+summae
+summand
+summand's
+summands
+summaries
+summarily
+summarization
+summarization's
+summarizations
+summarize
+summarized
+summarizer
+summarizers
+summarizes
+summarizing
+summary
+summary's
+summated
+summates
+summating
+summation
+summation's
+summational
+summations
+summed
+summer
+summer's
+Summerdale
+summered
+summerhouse
+summering
+summerize
+summerizes
+summers
+Summers
+summersault
+summertime
+summerweight
+summerwood
+summery
+summing
+summit
+summitry
+summon
+summoned
+summoner
+summoners
+summoning
+summons
+summonses
+Sumner
+Sumner's
+Sumo
+sump
+sumpter
+sumptuary
+sumptuous
+sumptuously
+sumptuousness
+sums
+Sumter
+sumy
+sun
+sun's
+sunay
+sunbake
+sunbaked
+sunbath
+sunbathe
+sunbather
+sunbeam
+sunbeam's
+sunbeams
+Sunbelt
+Sunbelt's
+sunbird
+sunbonnet
+sunbow
+sunburn
+sunburnt
+sunburst
+sunbursts
+sundae
+sundaes
+Sunday
+Sunday's
+Sundays
+sunder
+sundered
+sundering
+Sunderland
+sunders
+sundew
+sundial
+sundials
+sundog
+sundown
+sundowner
+sundowners
+sundress
+sundresses
+sundries
+sundrops
+sundry
+sundsvall
+sunfast
+sunfish
+sunflower
+sung
+sungari
+sungkiang
+sunglass
+sunglasses
+sunglow
+sungrebe
+sunhat
+sunk
+sunken
+sunlamp
+sunless
+sunlight
+sunlights
+sunlit
+sunn
+sunna
+sunned
+Sunni
+sunnier
+sunnily
+sunniness
+sunning
+Sunnite
+sunny
+Sunnyvale
+sunray
+sunrise
+sunrises
+sunroof
+suns
+sunscald
+sunscreen
+sunscreen's
+sunscreening
+sunscreens
+sunset
+sunsets
+sunshade
+sunshades
+sunshine
+sunshines
+sunshiny
+sunspot
+sunstar
+sunstroke
+sunstruck
+sunsuit
+suntan
+suntanned
+suntanning
+suntrap
+sunup
+sunward
+sunwards
+sunwise
+SUNY
+suo
+Suomi
+sup
+super
+superable
+superableness
+superably
+superabound
+superabundance
+superabundant
+superabundantly
+superacknowledgment
+superacknowledgment's
+superacknowledgments
+superadd
+superaddition
+superagency
+superaltar
+superaltern
+superannuate
+superannuated
+superannuation
+superb
+superbazaar
+superblock
+superbly
+superbness
+supercalender
+supercanonization
+supercanonization's
+supercanonizations
+supercarbonization
+supercarbonization's
+supercarbonizations
+supercarbonize
+supercarbonizes
+supercargo
+supercede
+superceded
+supercedes
+supercharge
+supercharger
+superciliary
+supercilious
+superciliously
+superciliousness
+supercity
+supercivilization
+supercivilization's
+supercivilizations
+supercivilized
+supercivilized's
+supercivilizeds
+superclass
+superclass's
+supercolumnar
+supercomputer
+supercomputer's
+supercomputers
+supercomputing
+superconcept
+superconduct
+superconducting
+superconduction
+superconductive
+superconductivity
+superconductor
+superconductors
+supercool
+supercritical
+supercurrent
+superdense
+superdominant
+supered
+superego
+superego's
+superegos
+superelevate
+superelevation
+supereminence
+supereminent
+supereminently
+superemphasize
+superemphasizes
+superempirical
+superencipher
+superencipherment
+supererogate
+supererogation
+supererogatory
+superfamily
+superfecundation
+superfemale
+superfetation
+superficial
+superficiality
+superficialize
+superficializes
+superficially
+superficialness
+superficies
+superfine
+superfix
+superfluid
+superfluidity
+superfluities
+superfluity
+superfluity's
+superfluous
+superfluously
+superfluousness
+superfuse
+supergalaxy
+supergene
+supergiant
+superglacial
+superheat
+superheater
+superheats
+superhero
+superhet
+superheterodyne
+superhigh
+superhighway
+superhighways
+superhuman
+superhumanity
+superhumanize
+superhumanizes
+superhumanly
+superhumanness
+superhumeral
+superieure
+superimposable
+superimpose
+superimposed
+superimposes
+superimposing
+superimposition
+superincumbent
+superincumbently
+superindividual
+superinduce
+superinduction
+superinfection
+supering
+superintend
+superintendence
+superintendency
+superintendent
+superintendent's
+superintendents
+superior
+superior's
+superiority
+superiorly
+superiors
+superjacent
+superjet
+superlanguage
+superlative
+superlatively
+superlativeness
+superlatives
+superliner
+superload
+superluminal
+superlunar
+superlunary
+supermachine
+supermale
+superman
+Superman's
+supermarket
+supermarket's
+supermarkets
+supermodel
+supermodels
+supermundane
+supernal
+supernally
+supernatant
+supernational
+supernatural
+supernaturalism
+supernaturalist
+supernaturalistic
+supernaturalize
+supernaturalizes
+supernaturally
+supernaturalness
+supernormal
+supernormality
+supernormally
+supernova
+supernova's
+supernovae
+supernovas
+supernumerary
+superorder
+superordinate
+superorganic
+superorganism
+superorganization
+superorganization's
+superorganizations
+superorganize
+superorganizes
+superovulation
+superoxide
+superparasitism
+superpatriot
+superpatriotic
+superpatriotism
+superphosphate
+superphysical
+superposable
+superpose
+superposed
+superposes
+superposing
+superposition
+superpositions
+superpower
+superpowered
+superpowers
+superpredicate
+supersaturate
+supersaturated
+supersaturation
+superscribe
+superscript
+superscripted
+superscripting
+superscription
+superscripts
+supersede
+supersedeas
+superseded
+superseder
+supersedes
+superseding
+supersedure
+supersensible
+supersensitive
+supersensitiveness
+supersensitization
+supersensitization's
+supersensitizations
+supersensory
+superserviceable
+supersession
+supersessive
+superset
+superset's
+supersets
+supersex
+supersonic
+supersonically
+supersonics
+superspecialize
+superspecializes
+superstar
+superstition
+superstition's
+superstitions
+superstitious
+superstitiously
+superstitiousness
+superstratum
+superstruct
+superstructural
+superstructure
+superstructures
+supersubstantial
+supersubtilized
+supersubtilized's
+supersubtilizeds
+supersubtle
+supersubtlety
+supersulphurize
+supersulphurizes
+supersystem
+supertanker
+supertax
+supertitle
+supertitle's
+supertitled
+supertitles
+supertitling
+supertonic
+superuser
+superuser's
+superusers
+supervene
+supervened
+supervenience
+supervenient
+supervention
+supervise
+supervised
+supervisee
+supervises
+supervising
+supervision
+supervisions
+supervisor
+supervisor's
+supervisors
+supervisory
+supinate
+supination
+supinator
+supine
+supinely
+supineness
+suplex
+supper
+supper's
+suppers
+supping
+suppl
+supplant
+supplantation
+supplanted
+supplanter
+supplanting
+supplants
+supple
+suppled
+supplejack
+supplely
+supplement
+supplemental
+supplementaries
+supplementary
+supplementation
+supplemented
+supplementer
+supplementing
+supplements
+suppleness
+suppler
+suppletion
+suppletive
+suppletory
+suppliance
+suppliant
+suppliantly
+supplicant
+supplicant's
+supplicantly
+supplicants
+supplicate
+supplicating
+supplication
+supplicatory
+supplied
+supplier
+supplier's
+suppliers
+supplies
+suppling
+supply
+supply's
+supplying
+support
+supportability
+supportable
+supportableness
+supportably
+supported
+supporter
+supporters
+supporting
+supportingly
+supportive
+supportively
+supports
+supposable
+supposably
+supposal
+suppose
+supposed
+supposedly
+supposer
+supposes
+supposing
+supposition
+supposition's
+suppositional
+suppositionally
+suppositions
+suppositious
+supposititious
+supposititiously
+supposititiousness
+suppositive
+suppositively
+suppositories
+suppository
+suppress
+suppressant
+suppressed
+suppresses
+suppressibility
+suppressible
+suppressing
+suppression
+suppressions
+suppressive
+suppressiveness
+suppressor
+suppressors
+suppurate
+suppuration
+suppurative
+supr
+supra
+supraglottal
+supralapsarian
+supralaryngeal
+supraliminal
+supraliminally
+supramolecular
+supranational
+supranationalism
+supranationalist
+supranationality
+supraorbital
+supraprotest
+suprarational
+suprarenal
+suprasegmental
+supravital
+supravitally
+supremacist
+supremacy
+suprematism
+supreme
+supremely
+supremeness
+supremo
+supremum
+suqutra
+sur
+sura
+surah
+surakarta
+sural
+surat
+surbase
+surbased
+surcease
+surceased
+surceasing
+surcharge
+surcharged
+surcharges
+surcharging
+surcingle
+surcliffe
+surcoat
+surcoats
+surculose
+surd
+sure
+sured
+surefire
+surefooted
+surefootedly
+surefootedness
+surely
+sureness
+surer
+surest
+sureties
+surety
+suretyship
+surf
+surfable
+surface
+surfaced
+surfaceness
+surfacer
+surfacers
+surfaces
+surfacing
+surfactant
+surfactants
+surfbird
+surfbirds
+surfboard
+surfboarder
+surfboards
+surfboat
+surfboats
+surfcasting
+surfeit
+surfeited
+surfeiter
+surfeits
+surfer
+surfer's
+surfers
+surficial
+surfie
+surfing
+surfperch
+surg
+surge
+surged
+surgely
+surgeon
+surgeon's
+surgeoncy
+surgeonfish
+surgeons
+surgeries
+surgerize
+surgerizes
+surgery
+surges
+surgical
+surgically
+surging
+suribachi
+suricate
+Surinam
+Suriname
+surjection
+surjective
+surlier
+surlily
+surliness
+surly
+surmise
+surmised
+surmiser
+surmises
+surmising
+surmount
+surmountable
+surmounted
+surmounting
+surmounts
+surmullet
+surname
+surname's
+surnamed
+surnames
+surpass
+surpassable
+surpassed
+surpasses
+surpassing
+surpassingly
+surplice
+surplus
+surplus's
+surplusage
+surpluses
+surprint
+surprisal
+surprise
+surprise's
+surprised
+surpriser
+surprises
+surprising
+surprisingly
+surra
+surreal
+surrealism
+surrealist
+surrealistic
+surrealistically
+surrealists
+surrebuttal
+surrebutter
+surrejoinder
+surrender
+surrendered
+surrenderer
+surrendering
+surrenders
+surreptitious
+surreptitiously
+surreptitiousness
+surrey
+surreys
+surrogate
+surrogate's
+surrogates
+surrogation
+surround
+surrounded
+surrounding
+surroundings
+surrounds
+surroyal
+sursum
+surtax
+surtout
+surveil
+surveillance
+surveillances
+surveillant
+survey
+surveyed
+surveying
+surveyor
+surveyor's
+surveyors
+surveys
+survivability
+survivable
+survival
+survivalist
+survivalists
+survivals
+survivance
+survive
+survived
+surviver
+survives
+surviving
+survivor
+survivor's
+survivors
+survivorship
+Sus
+susa
+susah
+Susan
+Susan's
+Susanna
+Susanne
+Susanne's
+susceptance
+susceptibility
+susceptible
+susceptive
+susceptiveness
+susceptivity
+suseptible
+sushi
+Susian
+Susie
+Susie's
+suslik
+suspect
+suspected
+suspecter
+suspecting
+suspects
+suspend
+suspended
+suspender
+suspender's
+suspenders
+suspending
+suspends
+suspense
+suspenseful
+suspenses
+suspension
+suspensions
+suspensive
+suspensively
+suspensoid
+suspensor
+suspensory
+suspicion
+suspicion's
+suspicioned
+suspicioning
+suspicions
+suspicious
+suspiciously
+suspiciousness
+suspiration
+suspire
+suspired
+suspiring
+Susquehanna
+susquehanna
+Susquehanna's
+suss
+Sussex
+Sussex's
+susso
+sustain
+sustainable
+sustained
+sustainer
+sustaining
+sustainment
+sustains
+sustenance
+sustentacular
+sustentation
+sustentative
+sustention
+Susu
+susurrant
+susurrate
+susurration
+susurrous
+susurrus
+Sutcliffe
+Sutherland
+Sutherland's
+sutlej
+sutler
+sutra
+suttee
+Sutton
+Sutton's
+sutural
+suturally
+suture
+sutured
+sutures
+suturing
+suva
+Suvorov
+Suwanee
+Suwanee's
+Suwannee
+Suzanne
+Suzanne's
+suzerain
+suzerainty
+Suzuki
+Suzuki's
+Svalbard
+svelte
+sveltely
+svelteness
+Sverdlovsk
+sverige
+Svetlana
+Svetlana's
+Svetlanov
+svizzera
+SW
+swab
+swabbed
+swabber
+swabbie
+swabbies
+swabbing
+swabby
+Swabia
+Swabian
+Swabian's
+Swabians
+swabs
+swacked
+swaddle
+swaddled
+swaddling
+swadesh
+Swadeshi
+swag
+swage
+swagger
+swaggered
+swaggering
+swagging
+swaging
+swagman
+Swahili
+Swahili's
+swain
+swain's
+swainish
+swainishness
+swains
+swale
+swallow
+swallowable
+swallowed
+swallower
+swallowing
+swallows
+swallowtail
+swallowwort
+swam
+swami
+swamp
+swamped
+swamper
+swampier
+swampiness
+swamping
+swampland
+swampland's
+swamplands
+swamps
+swampy
+swan
+swan's
+swanage
+Swanee
+swang
+swanherd
+swank
+swanker
+swankier
+swankily
+swankiness
+swanky
+swanlike
+swannery
+swanning
+swans
+swansdown
+Swansea
+Swansea's
+swanskin
+Swanson
+swap
+swappable
+swapped
+swapper
+swapper's
+swappers
+swapping
+swaps
+swaraj
+sward
+swarf
+swarm
+swarmed
+swarmer
+swarming
+swarms
+swart
+swarthier
+swarthiness
+Swarthmore
+Swarthout
+Swarthout's
+swarthy
+swartness
+swartz
+Swartz
+swash
+swashbuckle
+swashbuckler
+swashbuckling
+swasher
+swastika
+swat
+swatch
+swatches
+swath
+swath's
+swathe
+swathed
+swather
+swathes
+swathing
+swathings
+Swatow
+swats
+swatted
+swatter
+swatting
+sway
+swayback
+swaybacked
+swayed
+swayer
+swaying
+sways
+Swazi
+Swaziland
+swear
+swearer
+swearing
+swears
+swearword
+sweat
+sweatband
+sweatbox
+sweated
+sweater
+sweaters
+sweatier
+sweatily
+sweatiness
+sweating
+sweatpants
+sweats
+sweatshirt
+sweatshop
+sweatshop's
+sweatshops
+sweatsocks
+sweaty
+sweazey
+Swede
+Sweden
+Swedenborg
+Swedenborgianism
+Swedes
+Swedish
+sweelinck
+Sweeney
+Sweeneys
+Sweeny
+sweep
+sweepback
+sweeper
+sweepers
+sweepier
+sweeping
+sweepingly
+sweepingness
+sweepings
+sweeps
+sweepstake
+sweepstakes
+sweepy
+sweet
+sweetbread
+sweetbread's
+sweetbreads
+sweetbrier
+sweeten
+sweetened
+sweetener
+sweeteners
+sweetening
+sweetenings
+sweetens
+sweeter
+sweetest
+sweetheart
+sweetheart's
+sweethearts
+sweetie
+sweetie's
+sweeties
+sweetiewife
+sweeting
+sweetish
+sweetishly
+sweetly
+sweetman
+sweetmeal
+sweetmeat
+sweetness
+sweets
+sweetshop
+sweetsop
+swell
+swelled
+swellhead
+swellheaded
+swellheadedness
+swelling
+swellings
+swells
+swelter
+sweltered
+sweltering
+swelteringly
+Swenson
+swept
+sweptback
+sweptwing
+swerve
+swerved
+swerves
+swerving
+sweven
+sweyn
+swidden
+swift
+swifter
+swiftest
+swiftie
+swiftlet
+swiftly
+swiftness
+swig
+swigger
+swigging
+swill
+swiller
+swim
+swimmable
+swimmer
+swimmer's
+swimmeret
+swimmers
+swimmier
+swimmily
+swimminess
+swimming
+swimmingly
+swimmy
+swims
+swimsuit
+swimsuit's
+swimsuits
+swinburne
+Swinburne
+swindle
+swindled
+swindler
+swindles
+swindling
+swindon
+swine
+swineherd
+swinepox
+swing
+swingable
+swingably
+swingboat
+swinge
+swingeing
+swinger
+swingers
+swingier
+swinging
+swingingly
+swingle
+swingletree
+swingometer
+swingometers
+swings
+swingy
+swinish
+swinishly
+swinishness
+Swink
+swipe
+swiped
+swipes
+swiping
+swirl
+swirled
+swirler
+swirlier
+swirling
+swirlingly
+swirls
+swirly
+swish
+swished
+swisher
+swishier
+swishingly
+swishy
+swiss
+switch
+switch's
+switchable
+switchback
+switchback's
+switchbacks
+switchblade
+switchboard
+switchboard's
+switchboards
+switched
+switcher
+switcheroo
+switchers
+switches
+switchgear
+switchgirl
+switchgrass
+switching
+switchings
+switchman
+switchmen
+switchmen's
+switchyard
+swith
+swither
+Swithin
+Switzer
+Switzerland
+swivel
+swiveled
+swiveling
+swivels
+swivet
+swizzle
+swizzled
+swizzler
+swizzling
+swob
+swollen
+swoon
+swooned
+swooner
+swooning
+swooningly
+swoons
+swoop
+swooped
+swooper
+swooping
+swoops
+swoosh
+swop
+sword
+sword's
+swordbill
+swordcraft
+swordfight
+swordfight's
+swordfights
+swordfish
+swordlike
+swordplay
+swordplayer
+swords
+swordsman
+swordsmanship
+swordsmen
+swordstick
+swordsticks
+swordtail
+swore
+sworn
+swot
+swots
+swotted
+swotting
+swound
+swounds
+swum
+swung
+swy
+sybaris
+sybarite
+sybaritically
+sybert
+Sybil
+sycamine
+sycamore
+syce
+sycee
+syconium
+sycophancy
+sycophant
+sycophantic
+sycophantically
+sycophantish
+sycophantishly
+sycophantism
+sycophantize
+sycophantizes
+sycophantly
+sycophants
+sycosis
+Sydney
+sydneysider
+syene
+syenite
+syenitic
+Sykes
+syktyvkar
+syllabarium
+syllabary
+syllabi
+syllabic
+syllabically
+syllabicate
+syllabication
+syllabicity
+syllabification
+syllabify
+syllabism
+syllable
+syllable's
+syllabled
+syllables
+syllabling
+syllabogram
+syllabography
+syllabub
+syllabus
+syllepsis
+sylleptic
+syllogism
+syllogism's
+syllogisms
+syllogist
+syllogistic
+syllogistically
+syllogize
+Sylow
+sylph
+sylphid
+sylphlike
+sylva
+sylvan
+Sylvan
+Sylvania
+sylvanite
+sylvanize
+sylvanizes
+sylvanus
+sylvatic
+Sylvester
+Sylvia
+sylviculture
+sylvie
+Sylvie
+Sylvie's
+sylvine
+sylvite
+sym
+symbiont
+symbiontic
+symbiosis
+symbiote
+symbiotic
+symbiotically
+symbol
+symbol's
+symboled
+symbolic
+symbolic's
+symbolical
+symbolically
+symbolics
+symboling
+symbolism
+symbolisms
+symbolist
+symbolistic
+symbolists
+symbolization
+symbolization's
+symbolizations
+symbolize
+symbolized
+symbolizer
+symbolizers
+symbolizes
+symbolizing
+symbology
+symbols
+symington
+Symington
+symmetallism
+symmetric
+symmetrical
+symmetrically
+symmetricalness
+symmetries
+symmetrization
+symmetrization's
+symmetrizations
+symmetrize
+symmetrized
+symmetrizes
+symmetrizing
+symmetry
+symmetry's
+symonds
+Symons
+sympathectomy
+sympathetic
+sympathetically
+sympathies
+sympathin
+sympathize
+sympathized
+sympathizer
+sympathizers
+sympathizes
+sympathizing
+sympathizing's
+sympathizingly
+sympathizings
+sympatholytic
+sympathomimetic
+sympathy
+sympathy's
+sympatric
+sympatrically
+sympatry
+sympetalous
+sympetaly
+symphile
+symphonic
+symphonically
+symphonies
+symphonious
+symphoniously
+symphonist
+symphony
+symphony's
+symphyseal
+symphysial
+symphysis
+symplectic
+sympodial
+sympodially
+sympodium
+symposia
+symposiac
+symposiarch
+symposiast
+symposium
+symposiums
+symptom
+symptom's
+symptomatic
+symptomatically
+symptomatologic
+symptomatological
+symptomatologically
+symptomatology
+symptomize
+symptomizes
+symptomless
+symptoms
+synaeresis
+synaesthesis
+synagog
+synagogal
+synagogue
+synagogues
+synalepha
+synaloepha
+synapse
+synapse's
+synapsed
+synapses
+synapsing
+synapsis
+synaptic
+synaptically
+synaptosomal
+synaptosome
+synarchy
+synarthrodial
+synarthrodially
+synarthrosis
+sync
+syncarp
+syncarpous
+syncarpy
+synch
+synching
+synchro
+synchrocyclotron
+synchroflash
+synchromesh
+synchrometer
+synchronal
+synchroneity
+synchronic
+synchronical
+synchronically
+synchronism
+synchronistic
+synchronizable
+synchronizable's
+synchronizables
+synchronization
+synchronization's
+synchronizations
+synchronize
+synchronized
+synchronizer
+synchronizers
+synchronizes
+synchronizing
+synchronous
+synchronously
+synchronousness
+synchrony
+synchros
+synchroscope
+synchrotron
+syncing
+synclastic
+synclinal
+syncline
+synclinorium
+syncom
+syncopal
+syncopate
+syncopated
+syncopation
+syncopative
+syncopator
+syncope
+syncretic
+syncretism
+syncretist
+syncretistic
+syncretize
+syncretized
+syncretizes
+syncretizing
+syncrisis
+syncytial
+syncytium
+syndactyl
+syndactylism
+syndactyly
+syndesis
+syndesmosis
+syndesmotic
+syndetic
+syndetically
+syndic
+syndical
+syndicalism
+syndicalist
+syndicalize
+syndicalizes
+syndicate
+syndicated
+syndicates
+syndicating
+syndication
+syndicator
+syndics
+syndrome
+syndrome's
+syndromes
+syne
+synecdoche
+synecdochic
+synecdochical
+synecdochically
+synecious
+synecologic
+synecological
+synecologically
+synecology
+synectic
+synectically
+synectics
+synephrine
+syneresis
+synergetic
+synergic
+synergically
+synergid
+synergism
+synergist
+synergistic
+synergistically
+synergy
+synesis
+synesthesia
+synesthetic
+syngamy
+Synge
+syngeneic
+synizesis
+synkaryon
+synod
+synodal
+synodic
+synodical
+synods
+synonym
+synonym's
+synonymic
+synonymical
+synonymist
+synonymity
+synonymize
+synonymizes
+synonymous
+synonymously
+synonyms
+synonymy
+synopses
+synopsis
+synopsize
+synoptic
+synoptical
+synoptically
+synostosis
+synovia
+synovial
+synovitis
+synsepalous
+syntactic
+syntactical
+syntactically
+syntacticly
+syntactics
+syntagma
+syntax
+syntaxes
+syntheses
+synthesis
+synthesist
+synthesization
+synthesization's
+synthesizations
+synthesize
+synthesized
+synthesizer
+synthesizers
+synthesizes
+synthesizing
+synthetase
+synthetic
+synthetical
+synthetically
+synthetics
+synthetism
+syntonic
+syntonically
+sypher
+syphilis
+syphilitic
+syphilologist
+syphilology
+syphiloma
+syr
+Syracuse
+syren
+Syria
+Syriac
+Syrian
+Syrian's
+Syrianize
+Syrianizes
+Syrians
+syringa
+syringe
+syringed
+syringes
+syringing
+syringomyelia
+syringomyelic
+syrinx
+syrinxes
+syrphid
+Syrtis
+syrup
+syrupy
+sys
+sysgt
+syssarcosis
+syst
+systaltic
+systat
+system
+system's
+systematic
+systematical
+systematically
+systematicness
+systematics
+systematism
+systematist
+systematization
+systematization's
+systematizations
+systematize
+systematized
+systematizer
+systematizers
+systematizes
+systematizing
+systematology
+systemic
+systemically
+systemizable
+systemizable's
+systemizables
+systemization
+systemization's
+systemizations
+systemize
+systemizer
+systemizers
+systemizes
+systemless
+systems
+systemwide
+systole
+systolic
+sytactic
+syzran
+syzygial
+syzygy
+Szabadka
+Szczecin
+Szechwan
+Szeged
+Szell
+Szerying
+Szeryng
+Szewinska
+Szilard
+Szombathely
+Szymanowski
+TA
+taata
+tab
+tabac
+tabanid
+tabard
+tabaret
+Tabasco
+tabbed
+tabbies
+tabbing
+tabby
+tabellen
+tabernacle
+tabernacle's
+tabernacled
+tabernacles
+tabernacling
+tabernacular
+tabes
+tabescent
+tabetic
+tabla
+tablature
+table
+tableau
+tableau's
+tableaus
+tableaux
+tablecloth
+tablecloths
+tabled
+tableful
+tableland
+tables
+tablespoon
+tablespoon's
+tablespoonful
+tablespoonful's
+tablespoonfuls
+tablespoons
+tablespoonsful
+tablet
+tablet's
+tabletop
+tabletop's
+tabletops
+tablets
+tableware
+tabling
+tabloid
+tabloids
+taboo
+taboo's
+taboos
+tabor
+tabored
+taborer
+taborers
+taboret
+taborets
+taborin
+taboring
+taborins
+tabors
+Tabriz
+tabs
+tabu
+tabula
+tabular
+tabularization
+tabularization's
+tabularizations
+tabularize
+tabularizes
+tabularly
+tabulate
+tabulated
+tabulates
+tabulating
+tabulation
+tabulations
+tabulator
+tabulator's
+tabulators
+Tacamahac
+Tacchino
+tace
+tacet
+tach
+Tachina
+tachinid
+tachism
+tachist
+tachiste
+tachistoscope
+tachistoscopic
+tachistosopically
+tachograph
+tachometer
+tachometer's
+tachometers
+tachometry
+tachs
+tachycardia
+tachygraphic
+tachygraphical
+tachygraphy
+tachylite
+tachylyte
+tachymeter
+tachymeter's
+tachymeters
+tachymetry
+tachyon
+tachyon's
+tachyons
+tachyphylaxis
+tacit
+tacitly
+tacitness
+taciturn
+taciturnity
+Tacitus
+tack
+tackboard
+tacked
+tacker
+tacket
+tackier
+tackies
+tackifier
+tackify
+tackily
+tackiness
+tacking
+tackle
+tackle's
+tackled
+tackler
+tackles
+tackling
+tacks
+tacky
+tacloban
+tacmahack
+taco
+Tacoma
+taconite
+tacos
+tact
+tactful
+tactfully
+tactfulness
+tactic
+tactical
+tactically
+tactician
+tactics
+tactile
+tactilely
+tactility
+taction
+tactless
+tactlessly
+tactlessness
+tactual
+tactually
+tad
+tadmor
+tadpole
+tadpoles
+Tadzhiki
+taegu
+taejon
+tael
+taenia
+taeniacide
+taeniafuge
+taeniasis
+taffeta
+taffetized
+taffies
+taffrail
+taffy
+tafia
+tafilelt
+Taft
+tag
+tag's
+Tagalog
+tagalong
+taganrog
+tagboard
+tagged
+taggers
+tagging
+tagine
+tagines
+tagliatelle
+tagmeme
+tagmemics
+tagore
+tags
+tagus
+tahina
+Tahiti
+Tahoe
+tahr
+tahsil
+tahsildar
+Tai
+Taichung
+taig
+taiga
+tail
+tailback
+tailboard
+tailbone
+tailcoat
+tailcoated
+tailed
+tailer
+tailgate
+tailgated
+tailgater
+tailgating
+tailing
+tailings
+taille
+tailless
+taillight
+taillight's
+taillights
+taillike
+tailor
+tailorbird
+tailored
+tailoress
+tailoring
+tailorization
+tailorization's
+tailorizations
+tailorize
+tailorizes
+tailors
+tailpiece
+tailpipe
+tailplane
+tailrace
+tails
+tailskid
+tailspin
+tailspin's
+tailspins
+tailstock
+tailwater
+tailwind
+tailwind's
+tailwinds
+taimyr
+tain
+Tainan
+taine
+Taino
+taint
+tainted
+taintless
+taints
+taipan
+Taipei
+Taiping
+Taisho
+Taiwan
+taiwanese
+Taiwanese
+taiyuan
+taj
+Tajik
+tajo
+taka
+takahe
+takamatsu
+takao
+take
+takeaway
+takedown
+taken
+takeoff
+takeoffs
+takeout
+takeover
+takeovers
+taker
+takers
+takes
+taketh
+takin
+taking
+takings
+takoradi
+Talaing
+talapoin
+talaria
+talavera
+talbot
+talc
+talca
+talcahuano
+talcose
+talcum
+tale
+tale's
+talebearer
+talebearing
+talent
+talented
+talentless
+talents
+taler
+tales
+talesman
+taleysim
+tali
+taliesin
+taligrade
+talion
+taliped
+talipes
+talipot
+talisman
+talismanic
+talismanically
+talk
+talkathon
+talkative
+talkatively
+talkativeness
+talked
+talker
+talkers
+talkie
+talking
+talks
+talky
+tall
+Talladega
+talladega
+tallage
+Tallahassee
+tallahatchie
+Tallahatchie
+tallahoosa
+Tallahoosa
+tallboy
+tallchief
+Tallchief
+taller
+tallest
+talleyrand
+Talleyrand
+tallied
+tallies
+tallinn
+tallis
+tallish
+tallith
+tallithim
+tallness
+tallow
+tallowy
+tally
+tallyho
+tallying
+tallyman
+Talmud
+talmudic
+talmudical
+Talmudism
+Talmudist
+Talmudization
+Talmudization's
+Talmudizations
+Talmudize
+Talmudizes
+talon
+taloned
+talons
+talos
+taluk
+talus
+Talvela
+talweg
+tam
+tamable
+tamale
+tamandua
+tamarack
+tamarau
+tamarin
+tamarind
+tamarisk
+tamasha
+tamatave
+tamaulipas
+tambac
+tambala
+tambora
+tambour
+tambourer
+tambourine
+Tambov
+tambura
+tamburitza
+tamburlaine
+tame
+tameable
+tamed
+tameless
+tamely
+tameness
+tamer
+Tamerlane
+tames
+tamest
+Tamil
+taming
+tamis
+Tammany
+Tammanyize
+Tammanyizes
+tammerfors
+tammuz
+tammy
+tamp
+Tampa
+tampala
+tamper
+tampere
+tampered
+tamperer
+tampering
+tamperproof
+tampers
+tampico
+tamping
+tampion
+tampon
+Tamworth
+tan
+tana
+tanager
+Tanagra
+Tanaka
+Tanaka's
+tanana
+Tananarive
+tanbark
+tance
+tancred
+tandem
+tandemize
+tandemizes
+tandjungpriok
+tandoori
+tang
+tanga
+Tanganyika
+Tanganyika's
+tanged
+tangelo
+tangency
+tangent
+tangent's
+tangential
+tangentially
+tangents
+tangere
+tangerine
+tangibility
+tangible
+tangibleness
+tangibly
+tangier
+tangle
+tangleberry
+tangled
+tanglement
+tangles
+tangling
+tangly
+tango
+tangos
+tangram
+tangshan
+tanguy
+tangy
+tanh
+tanis
+tanist
+tanjore
+Tanjungpriok
+tank
+tanka
+tankage
+tankard
+tanked
+tanker
+tankers
+tankful
+tanking
+tanks
+tannage
+tannate
+tanned
+Tannenbaum
+tannenbaum
+Tannenberg
+tanner
+tanner's
+tanners
+tannery
+tannest
+tannic
+tannin
+tanning
+tannish
+tans
+tansies
+tansy
+tanta
+tantalate
+tantalic
+tantalite
+tantalization
+tantalization's
+tantalizations
+tantalize
+tantalized
+tantalizer
+tantalizers
+tantalizes
+tantalizing
+tantalizinglies
+tantalizingly
+tantalizingness
+tantalizingnesses
+tantalous
+tantalum
+Tantalus
+tantamount
+tantara
+tantivy
+tanto
+tantra
+tantric
+tantrism
+tantrum
+tantrum's
+tantrums
+Tanya
+Tanzania
+tao
+taoism
+taoist
+taoists
+taos
+tap
+tap's
+tapa
+tapadera
+Tapdance
+tape
+taped
+tapeline
+tapemark
+tapemarks
+taper
+tapered
+taperer
+tapering
+tapers
+tapes
+tapestried
+tapestries
+tapestry
+tapestry's
+tapeta
+tapetum
+tapeworm
+taphole
+taphouse
+taping
+tapings
+tapioca
+tapir
+tapirs
+tapis
+tapley
+tappa
+tapped
+tapper
+tapper's
+tappers
+tappet
+tappets
+tapping
+taproom
+taprooms
+taproot
+taproot's
+taproots
+taps
+tapster
+tapsters
+tar
+Tara
+tara
+tarabulus
+taraday
+taradiddle
+taramasalata
+tarantara
+tarantass
+tarantella
+tarantism
+taranto
+tarantula
+tarantulas
+taras
+tarawa
+taraxacum
+Tarbell
+Tarbell's
+tarbes
+tarboosh
+tarbush
+Tardenoisian
+tardier
+tardies
+tardigrade
+tardily
+tardiness
+tardo
+tardy
+tare
+tarentum
+targe
+target
+targeted
+targeting
+targets
+targo
+Targum
+tarheelia
+tariff
+tariff's
+tariffize
+tariffizes
+tariffs
+tarim
+taring
+Tarkington
+tarlatan
+tarmac
+tarmacadam
+tarn
+tarnal
+tarnation
+tarnish
+tarnishable
+tarnished
+tarnishes
+tarnishing
+tarnishs
+Tarnopol
+taro
+tarok
+taros
+tarot
+tarp
+tarpan
+tarpaper
+tarpapered
+tarpaulin
+tarpaulins
+Tarpeia
+Tarpeian
+tarpon
+tarpons
+Tarquin
+tarradiddle
+tarragon
+tarragona
+tarrant
+tarrasa
+tarre
+tarred
+tarriance
+tarried
+tarries
+tarring
+tarry
+tarrying
+Tarrytown
+tars
+tarsal
+tarshish
+tarsi
+tarsia
+tarsier
+tarsometatarsus
+tarsus
+tart
+tartan
+tartar
+Tartarean
+Tartaric
+tartarization
+tartarization's
+tartarizations
+tartarize
+tartarized
+tartarizes
+tartarous
+tartarughe
+Tartarus
+Tartary
+tartish
+tartishly
+tartlet
+tartlets
+tartly
+tartness
+tartrate
+tartrated
+tartrates
+tarts
+tartu
+tartuffe
+Tartuffe
+taruffi
+Tarzan
+tashi
+tashkent
+tasimeter
+task
+tasked
+tasking
+taskmaster
+taskmistress
+tasks
+taskwork
+tasman
+Tasmania
+Tasmanian
+Tass
+tasse
+tassel
+tassel's
+tasseled
+tasseling
+tassels
+tasset
+tassie
+tassle
+tasso
+taste
+tasted
+tasteful
+tastefully
+tastefulness
+tasteless
+tastelessly
+tastelessness
+tastemaker
+taster
+tasters
+tastes
+tastier
+tastily
+tastiness
+tasting
+tasty
+tat
+tatami
+Tatar
+Tatary
+tatchell
+Tate
+tate
+tater
+tati
+tatian
+tatler
+tatouay
+tatra
+tatras
+tatted
+tatter
+tatterdemalion
+tattered
+tattersall
+tattier
+tatting
+tattle
+tattled
+tattler
+tattles
+tattletale
+tattling
+tattoo
+tattooed
+tattooer
+tattooist
+tattoos
+tatty
+Tatum
+tau
+taught
+taui
+taunt
+taunted
+taunter
+taunting
+tauntingly
+Taunton
+taunts
+taupe
+taupo
+tauranga
+taurine
+taurocholate
+taurocholic
+taurog
+tauromachy
+Taurus
+taussig
+taut
+tauten
+tautened
+tautening
+tautly
+tautness
+tautog
+tautological
+tautologically
+tautologies
+tautologous
+tautologously
+tautology
+tautology's
+tautomer
+tautomeric
+tautomerism
+tautonym
+tautonymic
+tautonymous
+tautonymy
+tav
+tavel
+tavern
+tavern's
+taverna
+taverner
+tavernize
+tavernizes
+taverns
+taw
+tawdrier
+tawdrily
+tawdriness
+tawdry
+tawes
+tawie
+Tawney
+tawney
+tawnier
+tawnies
+tawniness
+tawny
+tawpie
+taws
+tawse
+tax
+taxa
+taxability
+taxable
+taxably
+taxaceous
+taxation
+taxed
+taxeme
+taxemic
+taxer
+taxes
+taxi
+taxi's
+taxicab
+taxicab's
+taxicabs
+taxidermic
+taxidermist
+taxidermist's
+taxidermists
+taxidermy
+taxied
+taxies
+taxiing
+taximan
+taximeter
+taximeter's
+taximeters
+taxing
+taxingly
+taxiplane
+taxiplanes
+taxis
+taxiway
+taxiway's
+taxiways
+taxon
+taxonomic
+taxonomically
+taxonomist
+taxonomist's
+taxonomists
+taxonomy
+taxons
+taxpayer
+taxpayer's
+taxpayers
+taxpaying
+taxus
+taxying
+Tay
+Taylor
+Taylorize
+Taylorizes
+Taylors
+Taymyr
+Tayra
+Tayside
+tazza
+Tbilisi
+Tchad
+tchaikovsky
+Tchaikovsky
+TCP
+Te
+tea
+teacake
+teacart
+teach
+teachability
+teachable
+teachableness
+teachably
+teacher
+teacher's
+teachers
+teachership
+teaches
+teaching
+teachings
+teacup
+teacupful
+teahouse
+teahouses
+teak
+teak's
+teakettle
+teaks
+teakwood
+teal
+Teal
+teals
+team
+team's
+teamed
+teaming
+teammate
+teammates
+teams
+teamster
+teamsters
+teamwork
+teapot
+teapots
+teapoy
+Tear
+tear
+tear's
+teardown
+teardrop
+teardrops
+teared
+tearer
+tearful
+tearfully
+tearfulness
+teargas
+tearier
+tearily
+tearing
+tearjerker
+tearle
+tearless
+tearlessly
+tearlessnss
+tearoom
+tearooms
+tears
+tearstain
+tearstained
+teary
+teas
+tease
+teased
+teasel
+teaseled
+teaseler
+teaselers
+teaseling
+teaser
+teases
+teashop
+teasing
+teasingly
+teaspoon
+teaspoon's
+teaspoonful
+teaspoonful's
+teaspoonfuls
+teaspoons
+teaspoonsful
+teat
+teated
+teatime
+teatro
+teats
+teazel
+teazeled
+teazeling
+teazle
+teazled
+Tebaldi
+tech
+teched
+technetium
+technetronic
+technic
+technical
+technicalities
+technicality
+technicality's
+technicalization
+technicalize
+technicalizes
+technically
+technicalness
+technician
+technician's
+technicians
+Technicolor
+technics
+technion
+Technion
+technique
+technique's
+techniques
+technocommercial
+technocracy
+technocrat
+technocratic
+technography
+technol
+technologic
+technological
+technologically
+technologies
+technologist
+technologist's
+technologists
+technologize
+technology
+technology's
+technostructure
+techy
+tecta
+tectal
+tectonic
+tectonics
+tectonism
+tectorial
+tectum
+tecum
+tecumseh
+ted
+tedded
+tedder
+tedding
+Teddy
+tedious
+tediously
+tediousness
+tedium
+teds
+tee
+teeing
+teem
+teemed
+teeming
+teemingly
+teemingness
+teems
+teen
+teenage
+teenaged
+teenager
+teenagers
+teener
+teenie
+teenier
+teens
+teensier
+teensy
+teentsier
+teentsy
+teeny
+teenybopper
+teepee
+tees
+teesside
+teet
+teeter
+teeterboard
+teetering
+teeth
+teethe
+teethed
+teether
+teethes
+teething
+teetotal
+teetotaled
+teetotaler
+teetotaling
+teetotalism
+teetotalist
+teetotum
+tef
+Teflon
+Teflon's
+teg
+tegmen
+tegmental
+tegmentum
+Tegucigalpa
+Tegucigalpa's
+tegular
+tegument
+tegumental
+tegumentary
+Teheran
+Tehran
+tehuantepec
+teide
+teiid
+teilhard
+tejo
+tektite
+tektites
+tektitic
+Tektronix
+Tektronix's
+tel
+Tel
+tela
+telamon
+telamones
+telanaipura
+telangiectasia
+telangiectasis
+telangiectatic
+telautograph
+tele
+telecamera
+telecast
+telecaster
+telecom
+telecommunicate
+telecommunication
+telecommunications
+telecomunications
+teleconference
+teleconference's
+teleconferenced
+teleconferences
+teleconferencing
+telecourse
+teledu
+Teledyne
+telefacsimile
+telefilm
+Telefunken
+teleg
+telega
+telegenic
+telegnosis
+telegonus
+telegony
+telegram
+telegram's
+telegrams
+telegraph
+telegraphed
+telegrapher
+telegraphers
+telegraphese
+telegraphic
+telegraphically
+telegraphing
+telegraphist
+telegraphs
+telegraphy
+Telegu
+telekinesis
+telekinetic
+telekinetically
+telemachus
+teleman
+Telemann
+telemann
+telemark
+telemeter
+telemeter's
+telemeters
+telemetric
+telemetrically
+telemetry
+telencephalic
+telencephalon
+teleologic
+teleological
+teleologically
+teleologist
+teleology
+teleost
+teleostean
+teleostome
+telepathic
+telepathically
+telepathy
+telephone
+telephoned
+telephoner
+telephoners
+telephones
+telephonic
+telephonically
+telephoning
+telephonist
+telephonists
+telephony
+telephoto
+telephotographic
+telephotography
+teleplay
+teleprinter
+teleprocessing
+teleprompter
+teleran
+telescope
+telescoped
+telescopes
+telescopic
+telescopically
+telescoping
+Telescopium
+telescopy
+telescript
+telesis
+telespectroscope
+telestereoscope
+telesthesia
+telesthetic
+telestich
+teletext
+telethermoscope
+telethon
+teletranscription
+teletube
+teletype
+teletype's
+teletypes
+teletypesetter
+teletypesetting
+teletypewrite
+teletypewriter
+teletypist
+teleutospore
+teleutosporic
+televideo
+teleview
+televiewer
+televise
+televised
+televises
+televising
+television
+televisionally
+televisionary
+televisions
+televisor
+televisor's
+televisors
+televisual
+telewriter
+Telex
+telexed
+telexes
+telexing
+telfer
+telferage
+Telford
+telia
+telial
+telic
+telically
+teliospore
+teliosporic
+telium
+tell
+teller
+tellers
+telli
+telling
+tellingly
+tellings
+tells
+telltale
+telltale's
+telltales
+tellurate
+tellurian
+telluric
+telluride
+tellurion
+tellurite
+tellurium
+tellurize
+tellurized
+tellurizes
+tellurizing
+tellurometer
+tellurometer's
+tellurometers
+tellurous
+tellus
+telly
+telnet
+telnets
+telocentric
+teloic
+telome
+telomeric
+telophase
+telos
+telotaxis
+telpher
+telpherage
+telson
+Telstar
+Telugu
+Tema
+temblor
+temerarious
+temerariously
+temerariousness
+temerity
+Temne
+temp
+Tempe
+tempeh
+temper
+tempera
+temperable
+temperament
+temperamental
+temperamentally
+temperaments
+temperance
+temperate
+temperately
+temperateness
+temperature
+temperature's
+temperatures
+tempered
+temperer
+tempering
+tempers
+tempest
+tempests
+tempestuous
+tempestuously
+tempestuousness
+tempi
+Templar
+template
+template's
+templates
+temple
+temple's
+templed
+Templeman
+templeman
+temples
+templet
+Templeton
+templize
+templizes
+tempo
+temporal
+temporality
+temporalize
+temporalized
+temporalizes
+temporalizing
+temporally
+temporaries
+temporarily
+temporariness
+temporary
+temporization
+temporization's
+temporizations
+temporize
+temporized
+temporizer
+temporizer's
+temporizers
+temporizes
+temporizing
+temporizing's
+temporizingly
+temporizings
+tempos
+tempt
+temptable
+temptation
+temptation's
+temptations
+tempted
+tempter
+tempters
+tempting
+temptingly
+temptress
+tempts
+tempura
+temuco
+ten
+ten's
+tenability
+tenable
+tenableness
+tenably
+tenace
+tenacious
+tenaciously
+tenaciousness
+tenacity
+tenaculum
+tenaille
+tenancies
+tenancy
+tenant
+tenant's
+tenantable
+tenantless
+tenantry
+tenants
+tench
+tenches
+tend
+tenda
+tendance
+tended
+tendencies
+tendencious
+tendency
+tendentious
+tendentiously
+tendentiousness
+tender
+tendered
+tenderfoot
+tenderhearted
+tenderheartedly
+tenderheartedness
+tendering
+tenderization
+tenderize
+tenderized
+tenderizer
+tenderizes
+tenderizing
+tenderloin
+tenderly
+tenderness
+tenderometer
+tenderometer's
+tenderometers
+tenders
+tending
+tendinous
+tendon
+tendons
+tendresse
+tendril
+tendriled
+tendrilous
+tendrils
+tends
+Tenebrae
+tenebrific
+tenebrionid
+tenebrious
+tenebrism
+tenebrist
+tenebrous
+tenedos
+tenement
+tenement's
+tenementary
+tenementization
+tenementization's
+tenementizations
+tenementize
+tenementizes
+tenements
+tenenbaum
+Tenerife
+tenesmus
+tenet
+tenets
+Tenex
+tenex
+tenfold
+teng
+tengri
+tenia
+teniacide
+teniafuge
+teniasis
+teniers
+Tenneco
+tenner
+Tennessee
+Tennessee's
+Tenney
+tenniel
+tennis
+tennist
+tenno
+Tennstedt
+Tennyson
+tenon
+tenor
+tenor's
+tenorite
+tenorrhaphy
+tenors
+tenosynovitis
+tenotomy
+tenour
+tenpenny
+tenpin
+tenpins
+tenpounder
+tenrec
+tens
+tense
+tensed
+tensely
+tenseness
+tenser
+tenses
+tensest
+tensible
+tensile
+tensility
+tensimeter
+tensimeter's
+tensimeters
+tensing
+tensiometer
+tensiometer's
+tensiometers
+tensiometric
+tensiometry
+tension
+tensional
+tensioned
+tensioner
+tensioning
+tensionless
+tensions
+tensity
+tensive
+tensometer
+tensometer's
+tensometers
+tensor
+tensor's
+tensorial
+tensors
+tenspot
+tent
+tentacle
+tentacled
+tentacles
+tentacular
+tentage
+tentation
+tentative
+tentatively
+tentativeness
+tented
+tenter
+tenterhook
+tenterhooks
+tenth
+tenthes
+tenths
+tentie
+tenting
+tentless
+tentmaker
+tents
+tenty
+tenuis
+tenuity
+tenuous
+tenuously
+tenuousness
+tenure
+tenured
+tenures
+tenurial
+tenurially
+tenuto
+Tenzi
+tenzing
+teocalli
+teonanacatl
+teosinte
+tepa
+tepal
+tepee
+tepees
+tepefy
+tephra
+tephrite
+tepic
+tepid
+tepidity
+tepidly
+tepidness
+tequila
+tequila's
+ter
+terai
+teraph
+teraphim
+teratism
+teratogen
+teratogenesis
+teratogenic
+teratogenicity
+teratoid
+teratologic
+teratological
+teratologies
+teratologist
+teratology
+teratoma
+teratomatous
+terbia
+terbium
+terce
+terceira
+tercel
+tercentenary
+tercentennial
+tercept
+tercet
+terebene
+terebic
+terebinth
+terebinthine
+tered
+teredines
+teredo
+Terence
+terephthalate
+terephthalic
+Teresa
+tereshkova
+Teresina
+terest
+terete
+Tereus
+terga
+tergal
+tergite
+tergiversate
+tergiversation
+tergiversator
+tergum
+teriyaki
+term
+termagant
+termagantly
+termcap
+termed
+termer
+terminable
+terminableness
+terminably
+terminal
+terminal's
+terminalization
+terminalization's
+terminalizations
+terminalized
+terminalized's
+terminalizeds
+terminally
+terminals
+terminate
+terminated
+terminates
+terminating
+termination
+terminational
+terminations
+terminative
+terminatively
+terminator
+terminator's
+terminators
+termined
+terming
+termini
+termining
+terminism
+terminological
+terminologically
+terminologies
+terminology
+terminosity
+terminus
+termitarium
+termite
+termites
+termless
+termly
+termor
+terms
+termtime
+tern
+ternary
+ternate
+ternately
+terne
+terneplate
+terni
+ternion
+ternize
+ternizes
+Ternopol
+terotechnology
+terpene
+terpeneless
+terpenic
+terpenoid
+terpineol
+terpolymer
+Terpsichore
+Terpsichore's
+terpsichorean
+terr
+Terra
+terrace
+terraced
+terraces
+terracing
+terrae
+terrain
+terrain's
+terrains
+terram
+terramycin
+Terran
+terrane
+Terrani
+terrapin
+terrapins
+terraqueous
+terrarium
+terrazzo
+Terre
+Terre's
+terrene
+terreplein
+terrestial
+terrestrial
+terrestrial's
+terrestrialize
+terrestrializes
+terrestrially
+terrestrials
+terret
+terrible
+terribleness
+terribly
+terricolous
+terrier
+terrier's
+terriers
+terries
+terrific
+terrifically
+terrificly
+terrified
+terrifies
+terrify
+terrifying
+terrifyingly
+terrigenous
+terrine
+territorial
+territorialism
+territorialist
+territoriality
+territorialization
+territorialization's
+territorializations
+territorialize
+territorializes
+territorially
+territorian
+territories
+territory
+territory's
+terror
+terror's
+terrorism
+terrorist
+terrorist's
+terroristic
+terrorists
+terrorization
+terrorization's
+terrorizations
+terrorize
+terrorized
+terrorizer
+terrorizers
+terrorizes
+terrorizing
+terrorless
+terrors
+terry
+terse
+tersely
+terseness
+terser
+tersest
+tertial
+tertian
+tertiaries
+tertiary
+tertium
+tertre
+tertullian
+teruel
+tervalent
+tery
+terylene
+terza
+terzetto
+tesla
+Tess
+tessellate
+tessellated
+tessellates
+tessellation
+tessera
+Tesseract
+tesseract
+Tessie
+tessie
+tessin
+tessitura
+test
+test's
+testa
+testability
+testable
+testacean
+testaceous
+testacy
+testae
+testament
+testament's
+testamentary
+testaments
+testate
+testator
+testator's
+testators
+testatrix
+testbed
+testcross
+tested
+tester
+tester's
+testers
+testes
+testicle
+testicle's
+testicles
+testicular
+testiculate
+testier
+testified
+testifier
+testifiers
+testifies
+testify
+testifying
+testily
+testimonial
+testimonialization
+testimonialization's
+testimonializations
+testimonialize
+testimonializer
+testimonializers
+testimonializes
+testimonials
+testimonies
+testimony
+testimony's
+testiness
+testing
+testings
+testis
+teston
+testoon
+testosterone
+tests
+testudinal
+testudo
+testy
+tetanal
+tetanic
+tetanically
+tetanization
+tetanize
+tetanized
+tetanizes
+tetanizing
+tetanus
+tetany
+tetartohedral
+tetched
+tetchier
+tetchy
+tete
+teter
+teth
+tether
+tetherball
+tethered
+tethering
+tethers
+Tethys
+Teton
+tetra
+tetrabasic
+tetrabasicity
+tetrabrach
+tetrabutylammonium
+tetracaine
+tetrachlorethylene
+tetrachloride
+tetrachord
+tetracid
+tetracyclic
+tetracycline
+tetrad
+tetradecyl
+tetradic
+tetradrachm
+tetradymite
+tetradynamous
+tetraethyl
+tetraethyllead
+tetrafluoride
+tetragonal
+tetragonally
+tetragonolobus
+tetragram
+tetragrammaton
+tetrahalides
+tetrahedra
+tetrahedral
+tetrahedrally
+tetrahedrite
+tetrahedron
+tetrahydrate
+tetrahydrated
+tetrahydrocannabinol
+tetrahydrofuran
+tetrahydroxy
+tetrahymena
+tetralogy
+tetramer
+tetramer's
+tetrameric
+tetrameron
+tetramerous
+tetramers
+tetrameter
+tetramethyl
+tetramethyllead
+tetraphenyl
+tetraplegia
+tetraploid
+tetraploidy
+tetrapod
+tetrapody
+tetrapterous
+tetrapyrrole
+tetrarch
+tetrarchic
+tetrarchy
+tetrasodium
+tetraspore
+tetrasporic
+tetrastich
+tetrastichous
+tetrasyllable
+tetratomic
+tetravalent
+tetrazolium
+tetrazzini
+tetrode
+tetrodes
+tetrodotoxin
+tetroxide
+tetrxide
+tetryl
+tetter
+tetzel
+Teucer
+Teucrian
+teutoburger
+Teuton
+Teutonic
+Teutonism
+teutonize
+tevere
+tevet
+tewfik
+Tewkesbury
+TeX
+Tex
+TeX's
+Texaco
+Texan
+Texans
+Texas
+Texas's
+Texases
+text
+text's
+textbook
+textbook's
+textbookish
+textbooks
+textile
+textile's
+textiles
+Textron
+texts
+textual
+textualism
+textually
+textuary
+textural
+texturally
+texture
+textured
+textures
+texturing
+texturized
+teyde
+tezel
+th
+thackeray
+thaddeus
+thadentsonyane
+Thai
+Thailand
+thalamencephalon
+thalamic
+thalamically
+thalamus
+thalassemia
+thalassemic
+thalassic
+thalassocracy
+thalassocrat
+thaler
+thales
+Thalia
+Thalia's
+thalidomide
+thalli
+thallic
+thallium
+thalloid
+thallophyte
+thallophytic
+thallous
+thallus
+thalluses
+thalweg
+Thames
+thames
+thammuz
+than
+thanatopsis
+Thanatos
+thane
+thaneship
+thanet
+thanjavur
+thank
+thanked
+thanker
+thankful
+thankfully
+thankfulness
+thanking
+thankless
+thanklessly
+thanklessness
+thanks
+thanksgiving
+thanksgiving's
+thanksgivings
+thankworthy
+thapsus
+thar
+that
+that'd
+that'll
+that's
+thatch
+thatched
+thatcher
+thatcherism
+thatches
+thatching
+thats
+thaumatology
+thaumatrope
+thaumaturge
+thaumaturgic
+thaumaturgist
+thaumaturgy
+thaw
+thawed
+thawing
+thaws
+Thayer
+Thayer's
+the
+Thea
+Thea's
+theaceous
+theanthropism
+thearchy
+theast
+theat
+theater
+theater's
+theatergoer
+theatergoer's
+theatergoers
+theatergoing
+theatergoing's
+theatergoings
+theaterless
+theaterlesses
+theaterlike
+theaterlike's
+theaterlikes
+theaters
+theatric
+theatrical
+theatricalism
+theatricality
+theatricalization
+theatricalization's
+theatricalizations
+theatricalize
+theatricalized
+theatricalizes
+theatricalizing
+theatrically
+theatricals
+theatricize
+theatricizes
+theatrics
+Thebaid
+thebaine
+Thebes
+theca
+thecae
+thecal
+thecate
+thecodont
+thee
+theelin
+theelol
+theft
+theft's
+thefts
+thegn
+theine
+their
+their's
+theirs
+theism
+theist
+theist's
+theistic
+theistical
+theistically
+theists
+Thelma
+them
+thematic
+thematically
+theme
+theme's
+themes
+Themis
+themistocles
+themselves
+then
+thenar
+thenardite
+thence
+thenceforth
+thenceforward
+thenceforwards
+theobromine
+theocentric
+theocentricity
+theocentrism
+theocracy
+theocrasy
+theocrat
+theocratic
+theocratical
+theocratically
+theocritus
+theodicy
+theodolite
+theodolitic
+Theodora
+theodorakis
+Theodore
+Theodoric
+Theodosian
+theodosius
+Theodosius
+theogonic
+theogony
+theol
+theolog
+theologian
+theologian's
+theologians
+theologic
+theological
+theologically
+theologies
+theologization
+theologize
+theologized
+theologizer
+theologizes
+theologizing
+theologue
+theology
+theomachy
+theomancy
+theomania
+theomorphic
+theonomous
+theonomously
+theonomy
+theopathy
+theophagy
+theophanic
+theophany
+Theophilus
+theophobia
+theophrastus
+theophylline
+theorbo
+theorem
+theorem's
+theorematic
+theorems
+theoretic
+theoretical
+theoretically
+theoretician
+theoreticians
+theoretics
+theories
+theorist
+theorist's
+theorists
+theorization
+theorization's
+theorizations
+theorize
+theorized
+theorizer
+theorizers
+theorizes
+theorizing
+theory
+theory's
+theosophical
+theosophically
+theosophist
+theosophy
+therapeusis
+therapeutic
+therapeutically
+therapeutics
+therapeutist
+therapies
+therapist
+therapist's
+therapists
+therapsid
+therapy
+therapy's
+theravada
+there
+there'd
+there'll
+there's
+thereabout
+thereabouts
+thereafter
+thereat
+thereby
+therefor
+therefore
+therefrom
+therein
+thereinafter
+thereinto
+thereof
+thereon
+Theresa
+thereto
+theretofore
+thereunder
+thereunto
+thereupon
+therewith
+therewithal
+therezina
+therfore
+theriac
+theriaca
+theriacal
+therianthropic
+theriomorphic
+therm
+thermae
+thermaesthesia
+thermal
+thermalization
+thermalize
+thermalized
+thermalizes
+thermalizing
+thermally
+thermals
+thermic
+thermically
+thermion
+thermionic
+thermionics
+thermistor
+thermistors
+Thermit
+thermite
+thermite's
+thermo
+thermoanesthesia
+thermoanesthesia's
+thermoanesthesias
+thermobarograph
+thermobarometer
+thermochemical
+thermochemist
+thermochemistry
+thermocline
+thermocoagulation
+thermocouple
+thermocouples
+thermoduric
+thermodynamic
+thermodynamical
+thermodynamically
+thermodynamicist
+thermodynamics
+thermoelastic
+thermoelectric
+thermoelectricity
+thermoelectron
+thermoelement
+Thermofax
+thermoform
+thermoformable
+thermoformed
+thermoforming
+thermogenesis
+thermogram
+thermogram's
+thermograms
+thermograph
+thermographic
+thermographically
+thermography
+thermogravimetric
+thermohaline
+thermojunction
+thermolabile
+thermolability
+thermoluminescence
+thermoluminescent
+thermolysis
+thermolytic
+thermomagnetic
+thermomagnetically
+thermometer
+thermometer's
+thermometerize
+thermometerizes
+thermometers
+thermometric
+thermometrically
+thermometry
+thermomotor
+thermonuclear
+thermoperiodicity
+thermoperiodism
+thermophile
+thermophilic
+thermophilous
+thermophysical
+thermopile
+thermoplastic
+thermoplasticity
+thermopolymerization
+thermopolymerization's
+thermopolymerizations
+thermopower
+thermopylae
+thermoreceptor
+thermoregularity
+thermoregulation
+thermoregulator
+thermoregulatory
+thermoremanence
+thermoremanent
+thermos
+thermoscope
+thermoset
+thermosetting
+thermosiphon
+thermosiphon's
+thermosiphons
+thermosphere
+thermospheric
+thermostability
+thermostable
+thermostat
+thermostat's
+thermostated
+thermostatic
+thermostatical
+thermostatically
+thermostatics
+thermostats
+thermotactic
+thermotaxis
+thermotensile
+thermotherapy
+thermotropic
+thermotropism
+theroelectricity
+theroid
+theropod
+Thersites
+thersitical
+thesaural
+thesauri
+thesaurus
+these
+theses
+Theseus
+thesis
+thespian
+thespians
+thespis
+Thessalonian
+Thessalonians
+Thessaly
+theta
+thetas
+Thetford
+thetic
+thetically
+Thetis
+theurgic
+theurgical
+theurgist
+theurgy
+thew
+they
+they'd
+they'll
+they're
+they've
+thiabendazole
+thiamin
+thiaminase
+thiamine
+thiazide
+thiazine
+thiazole
+thick
+thicken
+thickened
+thickener
+thickeners
+thickening
+thickens
+thicker
+thickest
+thicket
+thicket's
+thicketed
+thickets
+thickety
+thickhead
+thickheaded
+thickish
+thickleaf
+thickly
+thickness
+thicknesses
+thicks
+thickset
+thief
+Thiensville
+thieve
+thievery
+thieves
+thieving
+thievish
+thievishly
+thievishness
+thigh
+thighbone
+thighed
+thighs
+thigmotaxis
+thigmotropism
+thill
+thills
+thimble
+thimble's
+thimbleberry
+thimbleful
+thimbleful's
+thimblerig
+thimblerigger
+thimbles
+thimblesful
+thimbleweed
+thimblewit
+thimerosal
+thin
+thinclad
+thine
+thiner
+thinest
+thing
+thingamabob
+thingamajig
+thingamajig's
+thingamajigs
+thingness
+things
+thingumabob
+thingumajig
+thingummy
+think
+thinkable
+thinkableness
+thinkably
+thinker
+thinkers
+thinking
+thinkingly
+thinkingness
+thinks
+thinly
+thinned
+thinner
+thinners
+thinness
+thinnest
+thinning
+thinnish
+thins
+thioalcohol
+thiocarbamide
+thiocyanate
+thiocyanic
+thiofuran
+thioguanine
+thiol
+thiolic
+thionate
+thionic
+thionine
+thionyl
+thiopental
+thiopentone
+thiophen
+thiophene
+thiophosphate
+thiosinamine
+thiosulfate
+thiosulfuric
+thiosulphate
+thiosulphuric
+thiotepa
+thiouracid
+thiouracil
+thiourea
+thir
+thiram
+third
+thirdhand
+thirdly
+thirds
+thirdstream
+thirl
+thirlage
+thirlmere
+thirst
+thirsted
+thirster
+thirstier
+thirstily
+thirstiness
+thirsts
+thirsty
+thirteen
+thirteens
+thirteenth
+thirties
+thirtieth
+thirty
+thirtyfold
+this
+this'll
+thisbe
+thistle
+thistledown
+thistly
+thither
+thitherto
+thitherward
+thixotropic
+thixotropy
+tho
+thod
+tholdy
+thole
+tholed
+tholeiite
+tholeiitic
+tholepin
+tholer
+tholes
+tholing
+tholos
+Thomas
+Thomism
+Thomistic
+Thomistic's
+Thompson
+Thompson's
+Thomson
+thonburi
+thong
+thonged
+Thor
+thoraces
+thoracic
+thoracically
+thoracoplasty
+thoracotomy
+thorax
+thoraxes
+Thoreau
+thoria
+thorianite
+thoriate
+thoriated
+thoric
+thorite
+thorium
+thorn
+thorn's
+thornback
+thornbill
+Thornburg
+thornbush
+Thorndike
+thornier
+thorniness
+thornless
+thornlike
+thorns
+Thornton
+thorny
+thoron
+thorough
+thoroughbred
+thoroughfare
+thoroughfare's
+thoroughfares
+thoroughgoing
+thoroughly
+thoroughness
+thoroughpaced
+thoroughpin
+thoroughwort
+thorp
+Thorpe
+thorshavn
+Thorstein
+Thorvaldsen
+those
+thoth
+thou
+though
+thought
+thought's
+thoughtful
+thoughtfully
+thoughtfulness
+thoughtless
+thoughtlessly
+thoughtlessness
+thoughts
+thoughtway
+thous
+thousand
+thousandfold
+thousands
+thousandth
+thousandths
+Thrace
+Thrace's
+Thracian
+thraldom
+thrall
+thralldom
+thrash
+thrashed
+thrasher
+thrashes
+thrashing
+thrasonical
+thrasonically
+thrave
+thraw
+thrawart
+thrawn
+thrawnly
+thread
+threadbare
+threadbareness
+threaded
+threader
+threaders
+threadfin
+threadiness
+threading
+threadless
+threadlike
+threadneedle
+threads
+threadworm
+thready
+threap
+threat
+threaten
+threatened
+threatener
+threatening
+threateningly
+threatens
+threats
+three
+three's
+threefold
+threepence
+threepences
+threepenny
+threes
+threescore
+threesome
+thremmatology
+threnode
+threnodic
+threnodist
+threnody
+threonine
+thresh
+threshed
+thresher
+threshing
+threshold
+threshold's
+thresholded
+thresholding
+thresholds
+threw
+thrice
+thrift
+thriftier
+thriftily
+thriftiness
+thriftless
+thriftlessly
+thriftlessness
+thrifty
+thrill
+thrilled
+thriller
+thrillers
+thrilling
+thrillingly
+thrills
+thrips
+thrive
+thrived
+thriven
+thriver
+thrives
+thriving
+thrivingly
+thro
+throat
+throated
+throatier
+throatily
+throatiness
+throating
+throatlash
+throatlatch
+throats
+throaty
+throb
+throbbed
+throbber
+throbbing
+throbs
+throe
+throes
+thrombi
+thrombin
+thrombocyte
+thrombocytic
+thrombocytopenia
+thrombocytopenic
+thromboembolic
+thromboembolism
+thrombogen
+thrombokinase
+thrombophlebitis
+thromboplastic
+thromboplastically
+thromboplastin
+thrombose
+thrombosed
+thromboses
+thrombosis
+thrombospondin
+thrombotic
+thrombus
+throne
+throne's
+Throneberry
+throneberry
+thrones
+throng
+throng's
+thronging
+throngs
+throning
+thronize
+thronizes
+throstle
+throttle
+throttleable
+throttled
+throttlehold
+throttler
+throttles
+throttling
+through
+throughither
+throughly
+throughother
+throughout
+throughput
+throughway
+throve
+throw
+throwaway
+throwback
+thrower
+throwing
+thrown
+throws
+throwster
+thru
+thrum
+thrumming
+thrush
+thrushes
+thrust
+thruster
+thrusters
+thrustful
+thrustfulness
+thrusting
+thrustor
+thrusts
+Thruway
+Thruways
+Thu
+Thuban
+Thuban's
+Thucydides
+thud
+thudded
+thudding
+thuds
+thug
+thug's
+thuggee
+thugs
+Thuja
+Thule
+thulium
+thumb
+thumbed
+thumbhole
+thumbing
+thumbnail
+thumbnut
+thumbprint
+thumbprint's
+thumbprints
+thumbs
+thumbscrew
+thumbstall
+thumbtack
+thumbtack's
+thumbtacked
+thumbtacking
+thumbtacks
+thummim
+thump
+thumped
+thumper
+thumping
+thumps
+thun
+thunder
+thunderbird
+thunderbolt
+thunderbolt's
+thunderbolts
+thunderbox
+thunderclap
+thunderclaps
+thundercloud
+thundercloud's
+thunderclouds
+thundered
+thunderer
+thunderers
+thunderflower
+thunderhead
+thundering
+thunderingly
+thunderous
+thunderously
+thunderpeal
+thunders
+thundershower
+thundershower's
+thundershowers
+thunderstone
+thunderstorm
+thunderstorm's
+thunderstorms
+thunderstrike
+thunderstroke
+thunderstruck
+thundery
+thuner
+thunk
+Thurber
+thurber
+Thurgau
+thurible
+thurifer
+Thuringia
+Thuringian
+thurl
+Thurman
+Thurn
+Thursday
+Thursday's
+Thursdays
+thus
+thusly
+thuya
+thwack
+thwart
+thwarted
+thwarter
+thwarting
+thwartly
+thwarts
+thwartwise
+thwump
+thy
+Thyestes
+thylacine
+thylakoid
+thyme
+thyme's
+thymectomize
+thymectomy
+thymelaeaceous
+thymes
+thymey
+thymic
+thymidine
+thymine
+thymocyte
+thymol
+thymus
+thymy
+thyratron
+thyrglobulin
+thyristor
+thyrocalcitonin
+thyroglobulin
+thyroid
+thyroidal
+thyroidectomized
+thyroidectomy
+thyroiditis
+thyroidization
+thyroidization's
+thyroidizations
+thyroids
+thyronine
+thyrotoxic
+thyrotoxicosis
+thyrotrophic
+thyrotrophin
+thyrotropic
+thyrotropin
+thyroxin
+thyroxine
+thyrse
+thyrsi
+thyrsus
+thysanopteran
+thysanuran
+thyself
+ti
+tia
+tial
+tiality
+tian
+tiara
+tiated
+Tiber
+tiberias
+Tiberius
+tibesti
+Tibet
+Tibetan
+tibia
+tibial
+tibiotarsus
+tibullus
+tibur
+tiburon
+Tiburon
+tic
+tical
+ticino
+ticism
+tick
+ticked
+ticker
+tickers
+ticket
+ticket's
+ticketed
+ticketing
+tickets
+tickicide
+ticking
+tickle
+ticklebrush
+tickled
+tickler
+tickles
+tickling
+ticklish
+ticklishly
+ticklishness
+ticks
+tickseed
+ticktack
+ticktacktoe
+ticktock
+Ticonderoga
+ticonderoga
+tictac
+tidal
+tidally
+tidbit
+tidbits
+tiddledywinks
+tiddler
+tiddly
+tiddlywinks
+tide
+tided
+tideland
+tidelands
+tideless
+tidemark
+tides
+tidewaiter
+tidewater
+tideway
+tidied
+tidier
+tidies
+tidily
+tidiness
+tiding
+tidings
+tidy
+tidying
+tie
+tieback
+tiebreaker
+Tieck
+tieck
+tied
+tieing
+tieless
+tiemannite
+tien
+Tientsin
+Tientsin's
+tiepin
+tiepolo
+tier
+tierce
+tiercel
+tiered
+tierra
+tiers
+ties
+tiff
+tiffany
+tiffin
+tiflis
+tiger
+tiger's
+tigerish
+tigerishly
+tigerishness
+tigerlike
+tigers
+tight
+tighten
+tightened
+tightener
+tighteners
+tightening
+tightenings
+tightens
+tighter
+tightest
+tightfisted
+tightknit
+tightly
+tightness
+tightrope
+tights
+tightwad
+tightwad's
+tightwads
+tightwire
+tiglic
+tiglon
+tigon
+tigress
+tigrinya
+Tigris
+tihwa
+tijuana
+Tijuana
+tike
+tiki
+tikoloshe
+til
+tilapia
+Tilburg
+Tilbury
+tilde
+tildes
+tile
+tiled
+tilefish
+tiler
+tiles
+tiliaceous
+tiling
+till
+tillable
+tillage
+tillandsia
+tilled
+tiller
+tillered
+tillering
+tillerman
+tillers
+tillich
+Tillich
+tillicum
+tillie
+Tillie
+tilling
+tills
+tilly
+Tilsit
+tilt
+tiltable
+tilted
+tilter
+tilters
+tilth
+tilting
+tiltmeter
+tiltmeter's
+tiltmeters
+tilts
+tiltyard
+Tim
+Tim's
+timaru
+timbal
+timbale
+timber
+timbered
+timberhead
+timbering
+timberland
+timberlands
+timberline
+timberman
+timbers
+timberwork
+timberyard
+timbral
+timbre
+timbrel
+timbrelled
+timbuktu
+time
+timecard
+timed
+timekeeper
+timekeeping
+timeless
+timelessly
+timelessness
+timelier
+timeliness
+timely
+timeous
+timeously
+timeout
+timeouts
+timepiece
+timepleaser
+timer
+timers
+times
+timesaving
+timescale
+timescales
+timeserver
+timeservers
+timeserving
+timeshare
+timeshared
+timeshares
+timesharing
+timeslice
+timeslices
+timestamp
+timestamped
+timestamping
+timestamps
+timetable
+timetable's
+timetabled
+timetables
+timetabling
+timework
+timeworker
+timeworn
+Timex
+timid
+timidity
+timidly
+timidness
+timing
+timings
+Timmy
+timmy
+timocracy
+timocratic
+timocratical
+Timon
+Timonize
+Timonizes
+Timor
+timorous
+timorously
+timorousness
+Timoshenko
+timothy
+Timour
+timpani
+timpanist
+Tims
+tin
+tin's
+Tina
+Tina's
+tinamou
+tinc
+tincal
+tinct
+tinctorial
+tinctorially
+tincture
+tinctured
+tincturing
+tindal
+tinder
+tinderbox
+tine
+tine's
+tinea
+tineal
+tineau
+tineid
+tines
+tinfoil
+tinful
+ting
+tinge
+tinged
+tingeing
+tingen
+tinging
+tingle
+tingled
+tingles
+tingling
+tinglingly
+tingly
+tinhorn
+tinier
+tiniest
+tinily
+tininess
+tinker
+tinkered
+tinkerer
+tinkering
+tinkers
+tinkle
+tinkled
+tinkles
+tinkling
+tinkly
+tinman
+tinned
+tinner
+tinnier
+tinniest
+tinnily
+tinniness
+tinning
+tinnitus
+tinny
+tinplate
+tinpot
+tins
+tinsel
+tinseled
+tinselier
+tinseliest
+tinseling
+tinselly
+Tinseltown
+Tinseltown's
+tinsmith
+tinsmiths
+tinstone
+tint
+tintable
+Tintagel
+tinted
+tinter
+tinting
+tintinnabulary
+tintinnabulation
+tintinnabulum
+tintless
+tintoretto
+tints
+tintype
+tinware
+tinwork
+tinworks
+tiny
+Tioga
+tip
+tip's
+tipcart
+tipcat
+tipi
+tipoff
+Tippecanoe
+tippecanoe
+tipped
+tipper
+tipper's
+Tipperary
+tippers
+tippet
+Tippett
+tippier
+tipping
+tipple
+tippled
+tippler
+tipples
+tippling
+tippy
+tips
+tipsier
+tipsily
+tipsiness
+tipstaff
+tipstaves
+tipster
+tipstock
+tipsy
+tiptoe
+tiptoed
+tiptoeing
+tiptop
+tipu
+tirade
+tirades
+tiran
+Tirana
+Tirana's
+tire
+tire's
+tired
+tiredly
+tiredness
+tireless
+tirelessly
+tirelessness
+tires
+tiresias
+tiresome
+tiresomely
+tiresomeness
+tirewoman
+tirich
+tiring
+tiro
+Tirol
+tiros
+tirpitz
+tirso
+Tiruchirapalli
+Tirunelveli
+Tisa
+tisane
+Tishab
+Tisiphone
+tissue
+tissue's
+tissued
+tissues
+tissuey
+tissuing
+tisza
+tit
+tit's
+titan
+titanate
+Titanesque
+titaness
+titania
+titanic
+titanically
+titaniferous
+titanism
+titanite
+titanium
+Titanomachy
+titanosaur
+titanothere
+titanous
+titans
+titbit
+titer
+titers
+titfer
+tithable
+tithe
+tithe's
+tither
+tithes
+tithing
+tithonia
+tithonus
+titi
+titian
+titicaca
+titillate
+titillating
+titillatingly
+titillation
+titillative
+titivate
+titivation
+titlark
+title
+titled
+titleholder
+titleholders
+titles
+titling
+titlist
+titman
+titmice
+titmouse
+titmouse's
+tito
+Tito
+Tito's
+Titograd
+Titoism
+titrant
+titratable
+titrate
+titrated
+titrates
+titrating
+titration
+titrator
+titrimetric
+titrimetrically
+tits
+titter
+tittered
+tittering
+titters
+tittie
+tittivate
+tittle
+tittup
+tittuped
+tittuping
+tittupy
+titubation
+titular
+titularly
+Titus
+tiu
+tiv
+Tivoli
+tizzies
+tizzy
+Tjirebon
+TKO
+Tlaxcala
+Tlemcen
+Tlingit
+Tmesis
+TN
+TNT
+to
+toad
+toad's
+toadeater
+toadeater's
+toadeaters
+toadfish
+toadfish's
+toadfishes
+toadflax
+toadied
+toadies
+toads
+toadstone
+toadstone's
+toadstones
+toadstool
+toady
+toadying
+toadyism
+toast
+toasted
+toaster
+toasters
+toastier
+toasting
+toastmaster
+toastmaster's
+toastmasters
+toastmistress
+toasts
+toasty
+tobacco
+tobacconist
+tobacconist's
+tobacconists
+tobaggon
+tobaggon's
+tobaggons
+Tobago
+Tobey
+tobies
+tobit
+toboggan
+toboggan's
+tobogganer
+tobogganing
+tobogganist
+toboggans
+tobol
+Tobolsk
+Tobruk
+Toby
+Toby's
+tocantins
+toccata
+Tocharian
+tocher
+tocology
+tocopherol
+Tocqueville
+tocsin
+tod
+today
+today'll
+today's
+todays
+Todd
+Todd's
+toddies
+toddle
+toddled
+toddler
+toddlers
+toddles
+toddling
+toddy
+toddy's
+todies
+tody
+toe
+toe's
+toea
+toecap
+toed
+TOEFL
+toehold
+toehold's
+toeholds
+toeing
+toeless
+toenail
+toenails
+toepiece
+toeplate
+toes
+toey
+toff
+toffee
+toffies
+toffy
+toft
+tofu
+tog
+toga
+togaed
+together
+togetherness
+toggery
+togging
+toggle
+toggled
+toggles
+toggling
+Togliatti
+Togo
+Togoland
+togs
+togue
+toheroa
+toil
+toile
+toiled
+toiler
+toilet
+toilet's
+toiletry
+toilets
+toilette
+toilful
+toilfully
+toiling
+toils
+toilsome
+toilsomely
+toilsomeness
+toilworn
+Tojo
+tokamak
+Tokay
+toke
+Tokelau
+token
+token's
+tokenism
+tokens
+Tokharian
+Tokoloshe
+tokonoma
+Tokugawa
+Tokyo
+tola
+Tolan
+Toland
+toland
+Tolbert
+tolbooth
+tolbutamide
+told
+tole
+Toledo
+tolerability
+tolerable
+tolerably
+tolerance
+tolerances
+tolerant
+tolerantly
+tolerate
+tolerated
+tolerates
+tolerating
+toleration
+tolerative
+tolerator
+tolidine
+Tolima
+toling
+Tolkien
+toll
+tollbooth
+tollbooth's
+tollbooths
+tolled
+Toller
+Tolley
+tolley
+tollgate
+tollhouse
+tolling
+tollman
+tolls
+tollway
+Tolly
+tolpuddle
+Tolstoy
+Toltec
+tolu
+toluate
+Toluca
+toluene
+toluic
+toluidine
+toluol
+toluyl
+tolyl
+tolylene
+tolylphosphine
+Tom
+tom
+Tom's
+tom's
+tomahawk
+tomahawk's
+tomahawks
+tomalley
+toman
+tomato
+tomatoes
+tomb
+tomb's
+tombac
+tombigbee
+Tombigbee
+tombless
+tomblike
+tombola
+tombolo
+tombouctou
+tomboy
+tomboyish
+tomboyishness
+tombs
+tombstone
+tombstones
+tomcat
+tomcod
+Tome
+tome
+tomentose
+tomentum
+tomes
+tomfool
+tomfoolery
+Tomlinson
+Tomlinson's
+Tommie
+tommy
+tommyrot
+tomogram
+tomogram's
+tomograms
+tomograph
+tomography
+tomorrow
+tomorrow's
+tomorrows
+Tomowa
+tompion
+Tompkins
+toms
+Tomsk
+tomtit
+ton
+ton's
+tonal
+tonalities
+tonality
+tonally
+Tonbridge
+tondi
+tondo
+tone
+toned
+toneless
+tonelessly
+tonelessness
+toneme
+tonemic
+toner
+tones
+tonetic
+tonetically
+tonetics
+tonette
+tong
+tonga
+Tonga
+tonger
+tongs
+tongue
+tongued
+tongueless
+tonguelike
+tongues
+tonguing
+Toni
+tonic
+tonic's
+tonically
+tonicity
+tonicize
+tonicizes
+tonics
+tonier
+tonight
+toning
+tonio
+Tonio
+tonk
+Tonka
+Tonkin
+tonks
+tonle
+tonn
+tonnage
+tonne
+tonneau
+tonneaus
+tonner
+tonnes
+tonometer
+tonometer's
+tonometers
+tonometric
+tonometry
+tonoplast
+tons
+tonsil
+tonsillar
+tonsillectomy
+tonsillitis
+tonsillotomy
+tonsorial
+tonsure
+tonsured
+tonsuring
+tontine
+tonus
+tony
+too
+toodle
+took
+tool
+toolbox
+toolboxes
+tooled
+tooler
+toolers
+toolhead
+toolholder
+toolhouse
+tooling
+toolkit
+toolkit's
+toolkits
+toolmake
+toolmaker
+toolmakers
+toolmaking
+toolroom
+tools
+toolshed
+toolsmith
+toom
+Toomey
+toomey
+toon
+toot
+tooted
+tooter
+tooth
+toothache
+toothache's
+toothaches
+toothbrush
+toothbrush's
+toothbrushes
+toothbrushing
+toothed
+toothier
+toothily
+toothing
+toothless
+toothlike
+toothpaste
+toothpick
+toothpick's
+toothpicks
+tooths
+toothsome
+toothsomely
+toothsomeness
+toothwort
+toothy
+tooting
+tootle
+tootled
+tootler
+tootling
+toots
+tootsie
+tootsies
+tootsy
+toowoomba
+top
+toparch
+topaz
+topazolite
+topcoat
+topcoats
+topcross
+topdressing
+tope
+toped
+topee
+Topeka
+toper
+topes
+topflight
+topful
+topfull
+topgallant
+topheavy
+Tophet
+tophi
+tophus
+topi
+topiary
+topic
+topic's
+topical
+topicality
+topically
+topics
+toping
+topkick
+topknot
+topless
+toploftical
+toploftily
+toploftiness
+toplofty
+topmast
+topminnow
+topmost
+topnotch
+topnotcher
+topocentric
+topograph
+topographer
+topographic
+topographical
+topographically
+topographies
+topography
+topoi
+topological
+topologically
+topologies
+topologise
+topologist
+topology
+toponym
+toponymic
+toponymical
+toponymy
+topos
+topotype
+topped
+topper
+toppers
+topping
+toppings
+topple
+toppled
+topples
+toppling
+tops
+topsail
+topside
+topsides
+topsoil
+topspin
+topstitch
+Topsy
+topwork
+toque
+tor
+Torah
+torbay
+torc
+torch
+torch's
+torchbearer
+torches
+torchier
+torchlight
+torchon
+torchwood
+tore
+toreador
+torero
+toreutic
+toreutics
+tori
+toric
+Tories
+tories
+torii
+torino
+torment
+tormented
+tormenter
+tormenters
+tormentil
+tormenting
+tormentor
+torments
+torn
+tornadic
+tornado
+tornadoes
+tornados
+tornillo
+toroid
+toroidal
+toroidally
+toroids
+Toronto
+torose
+torpedo
+torpedoed
+torpedoes
+torpedoing
+torpedos
+torpid
+torpidity
+torpidly
+torpor
+torporize
+torporizes
+torquate
+torquay
+torque
+torquemada
+Torquemada
+torquer
+torquers
+torques
+torquing
+torr
+Torrance
+Torrance's
+torre
+torrefy
+torrence
+torrens
+torrent
+torrent's
+torrential
+torrentially
+torrents
+torres
+torricelli
+Torricellian
+torrid
+torridity
+torridly
+torridness
+torsade
+torsi
+torsibility
+torsion
+torsional
+torsionally
+Torsk
+torso
+torsos
+tort
+torte
+tortelier
+tortellini
+torten
+tortes
+torticollis
+tortile
+tortilla
+tortious
+tortiously
+tortoise
+tortoise's
+tortoises
+tortoiseshell
+tortola
+tortoni
+tortricid
+tortrix
+tortuga
+tortuosity
+tortuous
+tortuously
+torture
+tortured
+torturer
+torturers
+tortures
+torturing
+torturous
+torturously
+torula
+torus
+torus's
+toruses
+tory
+Tory
+Toryize
+Toryizes
+Tosca
+Tosca's
+toscana
+toscanini
+Toscanini
+Toscanini's
+tosh
+Toshiba
+Toshiba's
+toss
+tossed
+tosser
+tosses
+tossing
+tosspot
+tot
+total
+total's
+totaled
+totaler
+totaler's
+totalers
+totaling
+totalism
+totalistic
+totalitarian
+totalitarianism
+totalitarianize
+totalities
+totality
+totality's
+totalization
+totalization's
+totalizations
+totalizator
+totalize
+totalized
+totalizer
+totalizers
+totalizes
+totalizing
+totally
+totals
+totaquina
+totaquine
+tote
+toted
+totem
+totemic
+totemically
+totemism
+totemist
+totemistic
+totemite
+totemization
+totemization's
+totemizations
+toter
+totes
+tother
+toting
+totipotency
+totipotent
+toto
+Toto
+tots
+totted
+totter
+tottered
+tottering
+totteringly
+totters
+tottery
+totting
+toucan
+touch
+touchable
+touchback
+touchdown
+touchdowns
+touched
+toucher
+touches
+touchhole
+touchier
+touchiest
+touchily
+touchiness
+touching
+touchingly
+touchline
+touchmark
+touchstone
+touchstones
+touchwood
+touchy
+tough
+toughen
+toughened
+toughening
+toughens
+tougher
+toughest
+toughie
+toughies
+toughly
+toughness
+toughs
+toughy
+toul
+toulon
+Toulouse
+toulouse
+toupee
+tour
+touraco
+touraine
+tourane
+tourbillion
+tourbillon
+tourcoing
+toured
+Tourel
+tourer
+touring
+tourism
+tourist
+tourist's
+touristic
+touristically
+tourists
+touristy
+tourize
+tourizes
+tourmaline
+tournai
+tournament
+tournament's
+tournaments
+tournedos
+tourneur
+tourney
+tourneyed
+tourneying
+tourneys
+tourniquet
+tourniquets
+tours
+touse
+tousing
+tousle
+tousled
+tousles
+tousling
+toussaint
+tout
+touted
+touter
+touting
+touts
+touzle
+tovarich
+tovarish
+tow
+towage
+toward
+towardliness
+towardly
+towards
+towbar
+towboat
+towboats
+towed
+towel
+towel's
+toweled
+toweling
+towelings
+towels
+tower
+towered
+towering
+toweringly
+towerlike
+towers
+towhead
+towheaded
+towhee
+towie
+towing
+towkay
+towline
+towmond
+town
+town's
+townee
+towner
+townhall
+townhouse
+townies
+townlet
+townley
+Townley
+towns
+townscape
+Townsend
+townsfolk
+townshend
+township
+township's
+townships
+townsman
+townsmen
+townspeople
+Townsville
+townswoman
+townwear
+towny
+towpath
+towrope
+tows
+towsley
+Towsley
+toxaemia
+toxalbumin
+toxaphene
+toxemia
+toxemic
+toxic
+toxicant
+toxicity
+toxicogenic
+toxicologic
+toxicological
+toxicologically
+toxicologist
+toxicology
+toxicosis
+toxigenic
+toxigenicity
+toxin
+toxin's
+toxins
+toxoid
+toxophilite
+toxophilites
+toxophily
+toxoplasma
+toxoplasmic
+toxoplasmosis
+toy
+toyama
+toyed
+toyer
+toying
+toylike
+toynbee
+Toynbee
+toyon
+Toyota
+toys
+TP
+trabeate
+trabeated
+trabeation
+trabecula
+trabecular
+trabeculate
+trabzon
+tracasserie
+trace
+traceability
+traceable
+traceableness
+traceably
+traceback
+traceback's
+tracebacks
+traced
+traceless
+tracelessly
+tracepoint
+tracepoint's
+tracepoints
+tracer
+traceried
+tracers
+tracery
+traces
+trachea
+tracheae
+tracheal
+tracheary
+tracheate
+tracheated
+tracheid
+tracheidal
+tracheitis
+tracheobronchial
+tracheolar
+tracheole
+tracheophyte
+tracheostomy
+tracheotomy
+trachoma
+trachomatous
+trachyte
+trachytic
+tracing
+tracings
+track
+trackage
+tracked
+tracker
+trackers
+tracking
+tracklayer
+tracklaying
+trackless
+trackman
+tracks
+trackside
+tracksuit
+trackwalker
+tract
+tract's
+tractability
+tractable
+tractableness
+tractably
+Tractarianism
+Tractarians
+tractarians
+tractate
+tractile
+traction
+tractional
+tractive
+tractor
+tractor's
+tractorization
+tractorization's
+tractorizations
+tractorize
+tractorizes
+tractors
+tracts
+Tracy
+trad
+tradable
+trade
+tradeability
+tradeable
+traded
+trademark
+trademark's
+trademarks
+tradeoff
+tradeoffs
+trader
+traders
+trades
+tradescantia
+tradesman
+tradesmen
+tradespeople
+tradevman
+trading
+tradition
+tradition's
+traditional
+traditionalism
+traditionalistic
+traditionalists
+traditionalize
+traditionalized
+traditionalizes
+traditionally
+traditionary
+traditionize
+traditionizes
+traditionless
+traditions
+traditor
+tradtionalist
+traduce
+traduced
+traducement
+traducer
+traducianism
+traducing
+trafalgar
+traffic
+traffic's
+trafficable
+trafficked
+trafficker
+trafficker's
+traffickers
+trafficking
+traffics
+tragacanth
+tragedian
+tragedians
+tragedienne
+tragedies
+tragedy
+tragedy's
+tragi
+tragic
+tragical
+tragically
+tragicize
+tragicizes
+tragicomedy
+tragicomic
+tragicomical
+tragopan
+tragus
+traherne
+trail
+trailblaze
+trailblazer
+trailblazer's
+trailblazers
+trailblazing
+trailbreaker
+trailed
+trailer
+trailerable
+trailerist
+trailerite
+trailers
+trailership
+trailhead
+trailhead's
+trailheads
+trailing
+trailings
+trailless
+trails
+trailside
+train
+trainability
+trainable
+trainband
+trainbearer
+trained
+trainee
+trainee's
+trainees
+traineeship
+traineeships
+trainer
+trainers
+trainferry
+trainful
+training
+trainload
+trainload's
+trainloads
+trainman
+trainman's
+trainmen
+trains
+trainsick
+traipse
+traipsing
+trait
+trait's
+traitor
+traitor's
+traitoress
+traitorize
+traitorizes
+traitorous
+traitorously
+traitors
+traitress
+traits
+trajan
+traject
+trajection
+trajectories
+trajectory
+trajectory's
+tral
+tralee
+tram
+tramcar
+tramline
+trammel
+trammeled
+trammeler
+trammelers
+trammeling
+trammels
+trammie
+tramming
+tramontane
+tramp
+tramped
+tramper
+tramping
+trample
+trampled
+trampler
+tramples
+trampling
+trampoline
+trampoliner
+trampolining
+trampolinist
+tramps
+tramroad
+tramway
+trance
+trance's
+trancelike
+trances
+trancing
+tranformed
+trangam
+tranmission
+tranmitted
+trannie
+tranquil
+tranquility
+tranquilization
+tranquilization's
+tranquilizations
+tranquilize
+tranquilized
+tranquilizer
+tranquilizer's
+tranquilizers
+tranquilizes
+tranquilizing
+tranquilizing's
+tranquilizingly
+tranquilizings
+tranquillity
+tranquillization
+tranquillize
+tranquillized
+tranquillizer
+tranquillizers
+tranquillizes
+tranquillizing
+tranquilly
+tranquilness
+transact
+transacted
+transacting
+transactinide
+transaction
+transaction's
+transactional
+transactions
+transactor
+transacts
+transalpine
+transaminase
+transamination
+transatlantic
+transaxle
+transcalent
+Transcaucasia
+transceiver
+transceiver's
+transceivers
+transcend
+transcended
+transcendence
+transcendency
+transcendent
+transcendental
+transcendentalism
+transcendentalist
+transcendentalists
+transcendentalize
+transcendentalizes
+transcendentally
+transcendently
+transcending
+transcends
+transconductance
+transcontinental
+transcribe
+transcribed
+transcriber
+transcribers
+transcribes
+transcribing
+transcript
+transcript's
+transcription
+transcription's
+transcriptional
+transcriptionally
+transcriptions
+transcripts
+transcultural
+transculturation
+transcurrent
+transcutaneous
+transduced
+transducer
+transducers
+transducing
+transduction
+transductional
+transect
+transected
+transecting
+transection
+transects
+transept
+transeptal
+transepts
+transfer
+transfer's
+transferability
+transferable
+transferal
+transferal's
+transferals
+transferase
+transfered
+transferee
+transference
+transferential
+transferor
+transferors
+transferral
+transferral's
+transferrals
+transferred
+transferrer
+transferrer's
+transferrers
+transferring
+transfers
+transfiguration
+transfigure
+transfinite
+transfix
+transfixed
+transfixes
+transfixing
+transfixion
+transform
+transformable
+transformant
+transformants
+transformation
+transformation's
+transformational
+transformationalist
+transformations
+transformative
+transformed
+transformer
+transformers
+transforming
+transformism
+transforms
+transfusable
+transfuse
+transfused
+transfusible
+transfusing
+transfusion
+transfusional
+transfusions
+transglottal
+transgranular
+transgress
+transgressed
+transgresses
+transgressing
+transgression
+transgression's
+transgressions
+transgressive
+transgressor
+transgressors
+tranship
+transhumance
+transhumant
+transience
+transiency
+transient
+transiently
+transients
+transilient
+transilluminate
+transillumination
+transilluminator
+transistor
+transistor's
+transistorization
+transistorize
+transistorized
+transistorizes
+transistorizing
+transistors
+transit
+Transite
+Transite's
+transitio
+transition
+transitional
+transitionally
+transitioned
+transitions
+transitive
+transitively
+transitiveness
+transitivity
+transitorily
+transitoriness
+transitory
+transkei
+translatability
+translatable
+translate
+translated
+translates
+translating
+translation
+translational
+translations
+translative
+translator
+translator's
+translators
+translatory
+transliterate
+transliteration
+transliterator
+translocate
+translocation
+translucence
+translucency
+translucent
+translucently
+translunar
+transmarine
+transmembrane
+transmigrant
+transmigrate
+transmigration
+transmigrator
+transmigratory
+transmissibility
+transmissible
+transmission
+transmission's
+transmissions
+transmissive
+transmissivity
+transmissometer
+transmissometer's
+transmissometers
+transmit
+transmits
+transmittable
+transmittal
+transmittance
+transmittancy
+transmitted
+transmitter
+transmitter's
+transmitters
+transmitting
+transmogrification
+transmogrify
+transmontane
+transmountain
+transmundane
+transmutable
+transmutation
+transmutative
+transmute
+transmuted
+transmutes
+transmuting
+transnational
+transnatural
+transoceanic
+transom
+transoms
+transonic
+transpacific
+transpadane
+transparence
+transparencies
+transparency
+transparency's
+transparent
+transparentize
+transparentizes
+transparently
+transparentness
+transpassive
+transpersonal
+transpicuous
+transpierce
+transpiration
+transpirations
+transpire
+transpired
+transpires
+transpiring
+transplacental
+transplacentally
+transplant
+transplantability
+transplantable
+transplantation
+transplanted
+transplanter
+transplanting
+transplants
+transpolar
+transpond
+transponder
+transponders
+transpontine
+transport
+transportability
+transportable
+transportaion
+transportation
+transportational
+transportations
+transported
+transporter
+transporters
+transporting
+transports
+transposable
+transpose
+transposed
+transposes
+transposing
+transposition
+transpositional
+transput
+transputer
+Transputer
+transputers
+transsexual
+transsexualism
+transshape
+transship
+transshipment
+transshipped
+transshipping
+transships
+transthoracic
+transthoracically
+transubstantial
+transubstantiate
+transubstantiation
+transudate
+transudation
+transude
+transuded
+transuding
+transuranic
+transuranium
+Transvaal
+Transvaal's
+transvaluate
+transvaluation
+transvalue
+transversal
+transversally
+transverse
+transversely
+transverses
+transvestism
+transvestite
+transvestitism
+transylvania
+Transylvania
+Transylvania's
+Transylvanian
+tranverse
+trap
+trap's
+trapan
+trapani
+trapdoor
+trapdoors
+trapes
+trapeze
+trapeziform
+trapezist
+trapezium
+trapezius
+trapezohedron
+trapezoid
+trapezoid's
+trapezoidal
+trapezoids
+trapnest
+trappean
+trapped
+trapper
+trapper's
+trappers
+trapping
+trappings
+Trappist
+traprock
+traps
+trapshooter
+trapshooting
+trapunto
+trash
+trashed
+trasher
+trashes
+trashier
+trashiness
+trashing
+trashman
+trashy
+trasimene
+trass
+trattoria
+trauma
+traumas
+traumata
+traumatic
+traumatically
+traumatism
+traumatization
+traumatize
+traumatized
+traumatizes
+traumatizing
+travail
+travails
+travancore
+trave
+travel
+traveled
+traveler
+traveler's
+travelers
+traveling
+travelings
+travelog
+travelog's
+travelogs
+travels
+traversable
+traversal
+traversal's
+traversals
+traverse
+traversed
+traverser
+traverses
+traversing
+travertine
+travesties
+travesty
+travesty's
+Travis
+travois
+travoises
+trawl
+trawler
+trawlerman
+tray
+tray's
+trayal
+trayful
+traymobile
+trays
+treacheries
+treacherous
+treacherously
+treacherousness
+treachery
+treachery's
+treacle
+treacly
+tread
+treaded
+treader
+treading
+treadle
+treadled
+treadless
+treadling
+treadmill
+treads
+treadwell
+Treadwell
+treason
+treasonable
+treasonably
+treasonous
+treasurable
+treasure
+treasured
+treasurer
+treasurership
+treasures
+treasuries
+treasuring
+treasury
+treasury's
+treat
+treatability
+treatable
+treated
+treater
+treaters
+treaties
+treating
+treatise
+treatise's
+treatises
+treatment
+treatment's
+treatments
+treats
+treaty
+treaty's
+trebizond
+treble
+trebled
+trebles
+trebling
+Treblinka
+trebly
+trebuchet
+trebucket
+trecento
+tred
+tredecillion
+tree
+tree's
+treece
+treed
+treehopper
+treeing
+treeless
+treelike
+treen
+treenail
+treename
+treenames
+treenware
+trees
+treetop
+treetop's
+treetops
+tref
+trefoil
+trehala
+trehalase
+trehalose
+treillage
+treitschke
+trek
+trek's
+trekked
+trekker
+trekking
+treks
+trellis
+trellised
+trellises
+trelliswork
+trematode
+tremble
+trembled
+trembler
+trembles
+trembling
+trembly
+tremendous
+tremendously
+tremendousness
+tremolant
+tremolite
+tremolitic
+tremolo
+tremor
+tremor's
+tremors
+tremulant
+tremulous
+tremulously
+tremulousness
+trenail
+trench
+trenchancy
+trenchant
+trenchantly
+trenched
+trencher
+trencherman
+trenchermen
+trenchers
+trenches
+trend
+trendier
+trendily
+trendiness
+trending
+trends
+trendy
+trengganu
+Trent
+trente
+trento
+Trenton
+trepan
+trepanation
+trepang
+trepanned
+trepanning
+trepans
+trephination
+trephine
+trephined
+trephining
+trepid
+trepidant
+trepidation
+treponema
+treponemal
+treponematosis
+treponematous
+treponeme
+trespass
+trespassed
+trespasser
+trespassers
+trespasses
+tress
+tress's
+tressed
+tressel
+tresses
+tressure
+trestle
+trestles
+trestletree
+trestlework
+tret
+trevally
+Trevelyan
+Trevino
+Treviso
+trevithick
+Trevor
+trews
+trey
+treys
+tri
+triable
+triableness
+triac
+triacetate
+triacid
+triad
+triadic
+triadically
+triage
+trial
+trial's
+trialization
+trialogue
+trials
+triamcinolone
+triangle
+triangle's
+triangles
+triangular
+triangularity
+triangularization
+triangularizations
+triangularize
+triangularized
+triangularizes
+triangularizing
+triangularly
+triangulate
+triangulated
+triangulately
+triangulation
+Triangulum
+Trianon
+triarchy
+Triassic
+triatomic
+triaxial
+triaxiality
+triazine
+triazines
+triazole
+trib
+tribade
+tribal
+tribalism
+tribally
+tribasic
+tribe
+tribe's
+tribes
+tribesman
+tribesmen
+triblet
+triboelectric
+triboelectricity
+tribological
+tribologist
+tribology
+triboluminescence
+triboluminescent
+tribophysics
+tribrach
+tribrachic
+tribromide
+tribromoethanol
+tribulate
+tribulation
+tribulation's
+tribulations
+tribunal
+tribunal's
+tribunals
+tribunate
+tribune
+tribune's
+tribunes
+tribuneship
+tributary
+tribute
+tribute's
+tributes
+tributing
+tricarbonyl
+tricarboxylic
+tricarpellary
+tricarpellate
+trice
+tricentenary
+triceps
+tricepses
+triceratops
+trichiasis
+trichina
+trichinal
+Trichinella
+Trichinella's
+trichinize
+trichinopoly
+trichinosis
+trichinous
+trichite
+trichlorfon
+trichloride
+trichloro
+trichloroacetic
+trichloroethane
+trichloroethanol
+trichloroethylene
+trichocyst
+trichocystic
+trichogyne
+trichoid
+trichology
+trichome
+trichomic
+trichomonacidal
+trichomonacide
+trichomonad
+trichomonadal
+trichomonal
+trichomoniasis
+trichopteran
+trichosis
+trichotomous
+trichotomously
+trichotomy
+trichroism
+trichromat
+trichromatic
+trichromatism
+trichrome
+trichuriasis
+tricing
+trick
+tricked
+tricker
+trickeries
+trickery
+trickier
+trickiest
+trickily
+trickiness
+tricking
+trickish
+trickishly
+trickishness
+trickle
+trickled
+trickles
+trickling
+tricks
+tricksier
+tricksiness
+trickster
+tricksy
+tricktrack
+tricky
+triclad
+triclinic
+triclinium
+tricolette
+tricolor
+tricolor's
+tricolored
+tricolors
+tricorn
+tricorne
+tricornered
+tricostate
+tricot
+tricotine
+tricotyledonous
+tricritical
+tricriticality
+tricrotic
+trictrac
+tricuspid
+tricycle
+tricycles
+tricyclic
+tricyclohexyl
+tridactyl
+trident
+tridentate
+Tridentine
+tridents
+tridentum
+tridiagonal
+tridimensional
+tridimensionality
+triduum
+triecious
+tried
+triene
+triennial
+triennially
+triennium
+trier
+trierarch
+trierarchy
+triers
+tries
+trieste
+triethyl
+trifacial
+trifid
+trifle
+trifled
+trifler
+trifles
+trifling
+trifluoride
+trifluralin
+trifocal
+trifold
+trifoliate
+trifoliolate
+trifolium
+triforium
+triform
+trifurcate
+trifurcation
+trig
+trigeminal
+trigger
+triggered
+triggerfish
+triggering
+triggerman
+triggers
+trigging
+triglyceride
+triglycerides
+triglyph
+triglyphic
+triglyphical
+trigon
+trigonal
+trigonally
+trigonometric
+trigonometrical
+trigonometrically
+trigonometry
+trigonous
+trigram
+trigrams
+trigraph
+trigraphic
+trihedral
+trihedron
+trihybrid
+trihydrate
+trihydric
+trihydroxy
+triiodomethane
+triiodothyronine
+trijet
+trike
+trilateral
+trilaterality
+trilaterally
+trilateration
+trilbies
+trilby
+trilemma
+trilinear
+trilingual
+trilingually
+triliteral
+triliteralism
+trilithon
+trill
+trilled
+triller
+trillion
+trillionize
+trillionizes
+trillions
+trillionth
+trillium
+trilobate
+trilobation
+trilobed
+trilobite
+trilocular
+triloculate
+trilogy
+trim
+trimaran
+Trimble
+trimble
+trimer
+trimeric
+trimerization
+trimerization's
+trimerizations
+trimerous
+trimester
+trimestral
+trimestrial
+trimeter
+trimethadione
+trimetric
+trimetrogon
+trimly
+trimmed
+trimmer
+trimmest
+trimming
+trimmings
+trimness
+trimolecular
+trimonthly
+trimorph
+trimorphic
+trimorphism
+trimorphous
+trimotor
+trims
+trimurti
+trinacria
+trinal
+trinary
+trincomalee
+trindle
+trindled
+trindling
+trine
+Trinidad
+Trinil
+trinitarian
+trinitarians
+trinitrobenzene
+trinitrocresol
+trinitroglycerin
+trinitrophenol
+trinitrotoluene
+trinity
+trinket
+trinket's
+trinketed
+trinketer
+trinketry
+trinkets
+trinkums
+trinocular
+trinomial
+trinucleotide
+trio
+triode
+triodes
+trioecious
+triol
+triolein
+triolet
+trios
+triose
+trioxide
+trip
+trip's
+tripack
+tripalmitin
+tripartite
+tripartition
+tripe
+tripersonal
+triphammer
+triphammer's
+triphammers
+triphenyl
+triphenylarsine
+triphenylmethane
+triphenylphosphine
+triphenylstibine
+triphibian
+triphibious
+triphosphate
+triphosphopyridine
+triphthong
+triphthongal
+tripinnate
+tripinnately
+Tripitaka
+triplane
+triple
+tripled
+triples
+triplet
+triplet's
+tripletail
+triplets
+Triplett
+Triplett's
+triplex
+triplicate
+triplication
+triplicity
+tripling
+triplite
+triploblastic
+triploid
+triploidy
+triply
+tripod
+tripodal
+tripods
+tripody
+tripoli
+tripolitania
+tripolyphosphate
+tripos
+tripped
+tripper
+trippet
+tripping
+trippingly
+trips
+triptane
+tripterous
+triptolemus
+triptych
+triptyque
+tripura
+tripwire
+triquetrous
+triradiate
+trireme
+tris
+trisaccharide
+trisect
+trisection
+trisector
+triserial
+triskaidekaphobia
+triskele
+triskelion
+trismegistus
+trismus
+trisoctahedron
+trisodium
+trisome
+trisomic
+trisomy
+Tristan
+tristate
+triste
+tristearin
+tristeza
+tristful
+tristfully
+tristfulness
+tristich
+tristichous
+tristimulus
+trisubstituted
+trisulfide
+trisulphide
+trisyllabic
+trisyllabicall
+trisyllable
+trit
+tritanopia
+trite
+tritely
+triteness
+triter
+tritest
+tritheism
+tritheist
+tritheistic
+tritheistical
+trithing
+tritiate
+tritiated
+triticale
+Triticum
+tritium
+tritium's
+tritoma
+triton
+tritone
+triturable
+triturate
+trituration
+triturator
+triumph
+triumphal
+triumphant
+triumphantly
+triumphed
+triumphing
+triumphs
+triumvir
+triumviral
+triumvirate
+triune
+triunitarian
+trivalent
+trivalve
+trivandrum
+trivet
+trivia
+trivial
+trivialities
+triviality
+trivialization
+trivialize
+trivialized
+trivializes
+trivializing
+trivially
+trivium
+triweekly
+troas
+troat
+trobriand
+Trobriand
+trocar
+trochaic
+trochal
+trochanter
+trochanteral
+trochanteric
+trochar
+troche
+trochee
+trochelminth
+trochilus
+trochlea
+trochlear
+trochoid
+trochoidal
+trochophore
+trod
+trodden
+trode
+troff
+troff's
+troffer
+trog
+troglodyte
+troglodytic
+trogon
+trograd
+troika
+troilism
+troilite
+troilus
+trois
+Trojan
+troll
+troll's
+trolley
+trolley's
+trolleybus
+trolleyed
+trolleys
+trollied
+trollies
+trollop
+trollope
+trolls
+trolly
+tromba
+trombidiasis
+trombone
+trombone's
+trombones
+trombonist
+Tromelin
+trommel
+tromp
+trona
+Trondheim
+trone
+troop
+trooped
+trooper
+troopers
+trooping
+troops
+troopship
+troopships
+troostite
+trop
+tropaeolin
+tropaeolum
+trope
+Tropez
+tropez
+trophallaxis
+trophic
+trophically
+trophied
+trophies
+trophoblast
+trophoblastic
+trophoplasm
+trophozoite
+trophy
+trophy's
+trophying
+tropic
+tropic's
+tropical
+tropicalization
+tropicalization's
+tropicalizations
+tropicalize
+tropicalized
+tropicalizes
+tropicalizing
+tropically
+tropicbird
+tropics
+tropidoclonion
+tropine
+tropism
+tropisms
+tropistic
+tropocollagen
+tropologic
+tropological
+tropologically
+tropology
+tropomyosin
+tropopause
+tropophilous
+tropophyte
+troposphere
+tropospheric
+tropotaxis
+troppo
+tropylium
+trossachs
+trot
+troth
+trothplight
+trotline
+trots
+Trotsky
+trotsky
+trotskyism
+trotskyist
+trotted
+trotter
+trotting
+trotyl
+troubador
+troubadour
+troubadour's
+troubadours
+trouble
+troubled
+troublemaker
+troublemaker's
+troublemakers
+troubler
+troubles
+troubleshoot
+troubleshooted
+troubleshooter
+troubleshooters
+troubleshooting
+troubleshoots
+troubleshot
+troublesome
+troublesomely
+troublesomeness
+troubling
+troublous
+troublously
+troublousness
+trough
+troughs
+trounce
+trounced
+trounces
+trouncing
+troupe
+trouper
+troupes
+troupial
+trouping
+trouse
+trouser
+trousered
+trousers
+trousseau
+trousseaus
+trousseaux
+trout
+troutier
+Troutman
+trouts
+trouty
+trove
+trover
+trow
+Trowbridge
+trowel
+trowel's
+troweled
+troweler
+trowelers
+troweling
+trowels
+Troy
+troy
+Troyanos
+troyes
+truancy
+truant
+truant's
+truantry
+truants
+truce
+trucial
+trucing
+truck
+truckage
+trucked
+Truckee
+truckee
+trucker
+truckers
+truckie
+trucking
+truckle
+truckled
+truckler
+truckline
+truckling
+truckload
+truckload's
+truckloads
+truckman
+truckmaster
+trucks
+truculence
+truculency
+truculent
+truculently
+Trudeau
+Trudeau's
+trudge
+trudged
+trudgen
+trudger
+trudges
+trudging
+Trudy
+true
+trueborn
+trued
+truehearted
+trueheartedness
+trueing
+truelove
+trueness
+truepenny
+truer
+trues
+truest
+Truffaut
+truffle
+truffle's
+truffled
+truffles
+trug
+trugs
+truing
+truism
+truism's
+truisms
+truistic
+Trujillo
+trujillo
+Truk
+truk
+trull
+truly
+Truman
+Trumbull
+trumeau
+trump
+trumped
+trumpery
+trumpet
+trumpeted
+trumpeter
+trumpeting
+trumpetlike
+trumpets
+trumpetweed
+trumps
+truncate
+truncated
+truncates
+truncating
+truncation
+truncation's
+truncations
+truncheon
+truncheons
+trundle
+trundled
+trundler
+trundles
+trundling
+trunk
+trunk's
+trunked
+trunkfish
+trunkful
+trunks
+trunnel
+trunnion
+trunnions
+Truro
+truss
+trusser
+trusses
+trussing
+trust
+trustability
+trustable
+trustbuster
+trusted
+trustee
+trustee's
+trusteed
+trusteeing
+trustees
+trusteeship
+truster
+trustful
+trustfully
+trustfulness
+trustier
+trusties
+trustiness
+trusting
+trustingly
+trustless
+trusts
+trustworthily
+trustworthiness
+trustworthy
+trusty
+truth
+truthful
+truthfully
+truthfulness
+truths
+TRW
+try
+trying
+tryingly
+tryma
+tryout
+trypanosome
+trypanosomiasis
+tryparsamide
+trypsin
+trypsinize
+trypsinizes
+trypsinogen
+tryptamine
+tryptic
+tryptophan
+tryptophane
+tryptophanyl
+trysail
+tryst
+trytophan
+tryworks
+tsade
+tsana
+tsar
+tsarevich
+tsarevitch
+tsarevna
+tsarina
+tsarism
+tsarist
+tsaritsyn
+tselinograd
+tset
+tsetse
+tsetses
+tshiluba
+tshombe
+tsinan
+tsinghai
+tsingtao
+tsingyuan
+tso
+tsonga
+tsotsi
+tsugaru
+tsukahara
+tsunami
+tsunamic
+Tsunematsu
+tsunematsu
+tsushima
+tsutsugamushi
+tswana
+TTL
+TTY
+tty
+tty's
+ttys
+Tuamotu
+Tuareg
+tuart
+tuatara
+tub
+tub's
+tuba
+tubal
+tubate
+tubbable
+tubbed
+tubber
+tubbier
+tubbing
+tubby
+tube
+tubed
+tubeless
+tubelike
+tuber
+tubercle
+tubercled
+tubercular
+tubercularly
+tuberculate
+tuberculated
+tuberculation
+tuberculin
+tuberculinization
+tuberculinization's
+tuberculinizations
+tuberculinize
+tuberculinizes
+tuberculoid
+tuberculosis
+tuberculous
+tuberculously
+tuberization
+tuberization's
+tuberizations
+tuberize
+tuberizes
+tuberose
+tuberosity
+tuberous
+tubers
+tubes
+tubful
+tubifex
+tubifexes
+tubificid
+tubing
+tubman
+tubocurarine
+tubs
+tubuai
+tubular
+tubularity
+tubularly
+tubule
+tubules
+tubuliflorous
+tubulization
+tubulization's
+tubulizations
+tubulous
+Tucana
+tuchun
+tuck
+tuckahoe
+tucked
+tucker
+Tucker
+tuckered
+tuckering
+tucket
+tucking
+tucks
+Tuckwell
+tucotuco
+Tucson
+Tudor
+Tue
+tuebor
+tuel
+Tuesday
+Tuesday's
+Tuesdays
+tufa
+tufaceous
+tuff
+tuffaceous
+tuffet
+tuft
+tuft's
+tufted
+tufter
+tufts
+tufty
+tug
+tugboat
+tugela
+tugged
+tugger
+tugging
+tugrik
+tugs
+tui
+tuileries
+tuille
+tuition
+tuitional
+tuitions
+tula
+Tulane
+tularaemia
+tularemia
+tularemic
+tulation
+tulatory
+tule
+tulip
+tulip's
+tulips
+tulipwood
+tull
+tulle
+tullibee
+tully
+Tulsa
+tum
+tumble
+tumblebug
+tumbled
+tumbledown
+tumblehome
+tumbler
+tumblerful
+tumblers
+tumbles
+tumbleweed
+tumbling
+tumbrel
+tumbrels
+tumbril
+tumefaciens
+tumefacient
+tumefaction
+tumefactive
+tumefy
+tumescence
+tumescent
+tumid
+tumidity
+tumidly
+tummies
+tummy
+tummy's
+tumor
+tumor's
+tumoral
+tumored
+tumorigenic
+tumorigenicity
+tumorlike
+tumorlike's
+tumorlikes
+tumorous
+tumors
+tump
+tumpline
+tumular
+tumulose
+tumult
+tumult's
+tumults
+tumultuary
+tumultuous
+tumultuously
+tumultuousness
+tumulus
+tun
+tuna
+tunability
+tunable
+tunableness
+tunably
+tunas
+Tunbridge
+tundish
+tundra
+tune
+tuneable
+tuned
+tuneful
+tunefully
+tunefulness
+tuneless
+tunelessly
+tuner
+tuners
+tunes
+tunesmith
+tung
+tungstate
+tungsten
+tungstic
+tungstite
+tungstous
+tungting
+Tungus
+Tungusic
+tunguska
+tunic
+tunic's
+tunica
+tunicae
+tunicate
+tunicated
+tunicle
+tunics
+tuning
+tuning's
+tunings
+Tunis
+Tunisia
+Tunisian
+tunnage
+tunnel
+tunneled
+tunneler
+tunnelers
+tunneling
+tunnelings
+tunnellike
+tunnels
+tunny
+tup
+tupamaro
+tupelo
+Tupi
+tuple
+tuple's
+tuples
+tuppence
+tuppenny
+tupping
+tupungato
+tuque
+turaco
+tural
+Turanian
+turban
+turban's
+turbaned
+turbanned
+turbans
+turbary
+turbellarian
+turbid
+turbidimeter
+turbidimeter's
+turbidimeters
+turbidimetric
+turbidimetrically
+turbidimetry
+turbidite
+turbidity
+turbidly
+turbidness
+turbinal
+turbinate
+turbinated
+turbinates
+turbine
+turbines
+turbit
+turbjet
+turbo
+turbocar
+turbocharge
+turbocharger
+turboelectric
+turbofan
+turbogenerator
+turbojet
+turboprop
+turbos
+turboshaft
+turbosupercharged
+turbosupercharger
+turbot
+turbots
+turbulence
+turbulence's
+turbulency
+turbulent
+turbulently
+Turco
+turd
+turdine
+ture
+tured
+tureen
+turenne
+turf
+turfman
+turfski
+turfskiing
+turfy
+turgenev
+turgent
+turgescence
+turgescent
+turgid
+turgidity
+turgidly
+turgidness
+turgite
+turgor
+turgot
+Turin
+Turing
+Turing's
+turion
+turishcheva
+turk
+turkestan
+turkey
+Turkey
+turkey's
+turkeys
+Turki
+Turkic
+Turkish
+Turkism
+Turkize
+Turkizes
+Turkmen
+Turkoman
+turks
+Turks
+turku
+turmeric
+turmoil
+turmoil's
+turmoils
+turn
+turnable
+turnabout
+turnaround
+turnarounds
+turnbuckle
+turncoat
+turncock
+turndown
+turned
+turner
+turners
+turnery
+turning
+turnings
+turnip
+turnip's
+turnips
+turnkey
+turnkeys
+turnoff
+turnout
+turnouts
+turnover
+turnovers
+turnpike
+turnpikes
+turnround
+turns
+turnsole
+turnspit
+turnstile
+turnstone
+turntable
+turnup
+turnverein
+turpentine
+turpentinic
+turpentinous
+turpeth
+turpin
+turpitude
+turps
+turquois
+turquoise
+turret
+turret's
+turreted
+turrets
+turtle
+turtle's
+turtleback
+turtlebacks
+turtledove
+turtlehead
+turtleneck
+turtles
+turtling
+turves
+turvy
+Tuscaloosa
+Tuscan
+Tuscanize
+Tuscanizes
+Tuscany
+tusche
+tusculum
+tush
+tusk
+Tuskegee
+tusker
+tuskers
+tusklike
+tusks
+tussah
+tussaud
+tussis
+tussive
+tussle
+tussled
+tussles
+tussling
+tussock
+tussocks
+tussocky
+tussore
+tut
+Tutankhamen
+tutankhamen
+tutee
+tutees
+tutelage
+tutelar
+tutelary
+Tutenkhamon
+tutiorism
+tutor
+tutorage
+tutored
+tutoress
+tutorial
+tutorial's
+tutorials
+tutoring
+tutorization
+tutorization's
+tutorizations
+tutorize
+tutorizes
+tutors
+tutorship
+tutoyer
+tutsan
+tutsi
+tutti
+Tuttle
+tutty
+tutu
+tutuila
+tuva
+Tuvalu
+tux
+tuxedo
+tuxedo's
+tuxedoed
+tuxedos
+tuxtla
+tuyere
+TV
+TV's
+TVA
+tver
+TWA
+twaddle
+twaddled
+twaddler
+twaddles
+twaddling
+twae
+twain
+twang
+twanging
+twangy
+twas
+twat
+twattle
+twayblade
+tweak
+tweaked
+tweaker
+tweaking
+tweaks
+twee
+tweed
+tweeddale
+tweedier
+tweediness
+tweedledum
+tweedsmuir
+tweedy
+tween
+tweeny
+tweet
+tweeter
+tweeze
+tweezed
+tweezer
+tweezers
+tweezing
+twelfth
+twelfths
+Twelfthtide
+twelve
+twelvefold
+twelvemo
+twelvemonth
+twelves
+twenties
+twentieth
+twenty
+twentyfold
+twerp
+Twi
+twice
+Twickenham
+twiddle
+twiddled
+twiddles
+twiddling
+twig
+twig's
+twigged
+twigging
+twiggy
+twigs
+twilight
+twilight's
+twilights
+twilit
+twill
+twilled
+twilling
+twin
+twin's
+twinberry
+twinborn
+twine
+twined
+twiner
+twines
+twinflower
+twinge
+twingeing
+twinges
+twinging
+twining
+twinkle
+twinkled
+twinkler
+twinkles
+twinkling
+twinkly
+twinning
+twins
+twinship
+twiny
+twirl
+twirled
+twirler
+twirling
+twirlingly
+twirls
+twirly
+twirp
+twist
+twisted
+twister
+twisters
+twisting
+twists
+twisty
+twit
+twitch
+twitched
+twitcher
+twitchily
+twitching
+twitchy
+twite
+twitted
+twitter
+twittered
+twitterer
+twittering
+twittery
+twitting
+twixt
+two
+two's
+twofer
+twofold
+twohandedness
+Twombly
+Twombly's
+twopence
+twopences
+twopenny
+twos
+twosome
+TWP
+TWX
+TX
+Tyburn
+Tyburn's
+Tyche
+tychism
+tycho
+tycoon
+tye
+tying
+tyke
+tyke's
+tykes
+Tyler
+Tylerize
+Tylerizes
+tylopod
+tylosis
+tymbal
+tympan
+tympani
+tympani's
+tympanic
+tympanis
+tympanist
+tympanites
+tympanitic
+tympanitis
+tympanum
+tympanum's
+tympany
+tyndall
+tyndareus
+tynemouth
+tyneside
+Tynwald
+typal
+type
+type's
+typeable
+typeahead
+typebar
+typecase
+typecast
+typed
+typedef
+typedefs
+typeface
+typefounder
+typefounding
+typefoundry
+typeout
+typer
+types
+typescript
+typeset
+typesets
+typesetter
+typesetters
+typesetting
+typewrite
+typewriter
+typewriter's
+typewriters
+typewriting
+typewritten
+typey
+typhlitis
+typhlology
+typhlosole
+typhoeus
+typhogenic
+typhoid
+typhoidin
+Typhon
+typhoon
+typhus
+typic
+typical
+typicality
+typically
+typicalness
+typier
+typification
+typified
+typifies
+typify
+typifying
+typing
+typist
+typist's
+typists
+typo
+typograph
+typographer
+typographic
+typographical
+typographically
+typography
+typological
+typologically
+typologies
+typologist
+typology
+typos
+typothetae
+typy
+tyr
+tyramine
+tyrannic
+tyrannical
+tyrannically
+tyrannicalness
+tyrannicide
+tyrannize
+tyrannized
+tyrannizer
+tyrannizers
+tyrannizes
+tyrannizing
+tyrannizing's
+tyrannizingly
+tyrannizings
+tyrannosaur
+Tyrannosaurus
+tyrannosaurus
+Tyrannosaurus's
+tyrannous
+tyrannously
+tyranny
+tyrant
+tyrant's
+tyrants
+Tyrian
+tyro
+tyrocidin
+tyrocidine
+Tyrol
+Tyrolienne
+Tyrone
+tyros
+tyrosinase
+tyrosine
+tyrothricin
+Tyrr
+Tyrrhenian
+Tyson
+tyumen
+tzaddik
+tzaddikim
+tzar
+tzekung
+Tzeltal
+tzetze
+tzigane
+tzimmes
+tzitzis
+UART
+Ubangi
+ubbelohde
+ubiety
+Ubiquitarian
+ubiquitous
+ubiquitously
+ubiquitousness
+ubiquity
+ucayali
+ucca
+uccello
+UCLA
+udaipur
+udal
+Udall
+udall
+udder
+Ude
+udine
+udmurt
+udo
+udometer
+uele
+ufa
+ufd
+ufo
+ufology
+ugali
+Uganda
+ugaritic
+ugh
+ugli
+uglier
+ugliest
+uglification
+uglify
+uglily
+ugliness
+ugly
+Ugrian
+Ugric
+UHF
+uhlan
+Uhland
+Uhuru
+Uigur
+Uinta
+uintathere
+Uitlander
+Ujamaa
+Ujiji
+Ujjain
+Ujung
+UK
+Ukase
+Ukiyoe
+Ukraine
+Ukraine's
+Ukrainian
+Ukrainians
+ukulele
+ulama
+Ulan
+Ulbricht
+ulcer
+ulcer's
+ulcerate
+ulcerated
+ulcerates
+ulceration
+ulcerations
+ulcerative
+ulcered
+ulcering
+ulcerogenic
+ulcerous
+ulcers
+uldered
+ulema
+ulexite
+ulfilas
+ullage
+Ullman
+Ullswater
+Ulm
+ulmaceous
+ulna
+ulna's
+ulnar
+ulotrichous
+ulotrichy
+ulpian
+ulster
+Ulsterman
+ulterior
+ulteriorly
+ultima
+ultimacy
+ultimate
+ultimately
+ultimateness
+ultimatum
+ultimo
+ultimogeniture
+ultra
+ultrabasic
+ultracentralizer
+ultracentralizer's
+ultracentralizers
+ultracentrifugal
+ultracentrifugally
+ultracentrifugation
+ultracentrifuge
+ultraconservative
+ultrafashionable
+ultrafast
+ultrafiche
+ultrafilter
+ultrafiltration
+ultrahigh
+ultrahonorable
+ultrahonorable's
+ultrahonorables
+ultraism
+ultraist
+ultraistic
+ultramafic
+ultramarine
+ultramicro
+ultramicrometer
+ultramicrometers
+ultramicroscope
+ultramicroscopes
+ultramicroscopic
+ultramicrotome
+ultramicrotomes
+ultramicrotomy
+ultramodern
+ultramodernist
+ultramontane
+ultramontanism
+ultramundane
+ultranationalism
+ultranationalist
+ultrapure
+ultrapurely
+ultrared
+ultrasecret
+ultrashort
+ultrasonic
+ultrasonically
+ultrasonicate
+ultrasonicated
+ultrasonicates
+ultrasonicating
+ultrasonics
+ultrasound
+ultraspecialization
+ultraspecialization's
+ultraspecializations
+ultrastandardization
+ultrastandardization's
+ultrastandardizations
+ultrastructural
+ultrastructurally
+ultrastructure
+ultrathin
+ultraviolet
+ultravirus
+ultrawet
+Ultrix
+Ultrix's
+ululant
+ululate
+ululation
+ulva
+Ulyanovsk
+Ulysses
+umayyad
+umbel
+umbellate
+umbellifer
+umbelliferous
+umbellule
+umber
+umbered
+umbering
+umberto
+umbilical
+umbilicate
+umbilicated
+umbilication
+umbilici
+umbilicus
+umbilicuses
+umbles
+umbo
+umbonate
+umbones
+umbos
+umbra
+umbrae
+umbrage
+umbrageous
+umbrageously
+umbrageousness
+umbral
+umbrella
+umbrella's
+umbrellas
+umbria
+Umbrian
+Umbriel
+umiak
+umlaut
+ump
+umpirage
+umpire
+umpire's
+umpired
+umpires
+umpiring
+umpteen
+umpteenth
+umpy
+umrcc
+umtali
+un
+UN
+unabashed
+unabashedly
+unabated
+unabatedly
+unabbreviated
+unable
+unabridged
+unaccelerated
+unacceptability
+unacceptable
+unacceptably
+unaccessible
+unacclimatized
+unaccommodated
+unaccompanied
+unaccomplished
+unaccountability
+unaccountable
+unaccountably
+unaccounted
+unaccustomed
+unaccustomedly
+unachievable
+unachieved
+unacknowledged
+unacquainted
+unadaptable
+unadapted
+unadjustable
+unadjusted
+unadopted
+unadorned
+unadulterated
+unadulteratedly
+unadventurous
+unadvised
+unadvisedly
+unaesthetic
+unaffected
+unaffectedly
+unaffectedness
+unaffectionate
+unaffectionately
+unafraid
+unageing
+unaggregated
+unaggressive
+unagonize
+unaided
+Unalaska
+unalcoholized
+unalcoholized's
+unalcoholizeds
+unalienability
+unalienable
+unaligned
+unallocable
+unallocated
+unallocateed
+unalloyed
+unalterability
+unalterable
+unalterableness
+unalterably
+unaltered
+unamazed
+unambiguity
+unambiguous
+unambiguously
+unambitious
+unamortization
+unamortization's
+unamortizations
+unamortized
+unamuno
+unamused
+unamusing
+unanalyzable
+unanalyzed
+unanchor
+unanchored
+unaneled
+unanimalized
+unanimalized's
+unanimalizeds
+unanimity
+unanimous
+unanimously
+unannounced
+unanswerable
+unanswerably
+unanswered
+unantagonizable
+unantagonizable's
+unantagonizables
+unantagonized
+unantagonizing
+unanticipated
+unanticipatedly
+unapologetic
+unapologetically
+unapologizing
+unapostatized
+unapostatized's
+unapostatizeds
+unappealable
+unappealing
+unappealingly
+unappeasable
+unappeasably
+unappetizing
+unappetizingly
+unappreciated
+unappreciation
+unapproachability
+unapproachable
+unapproachably
+unappropriated
+unapt
+unaptly
+unaptness
+unarguable
+unarguably
+unarm
+unarmed
+unarmored
+unarticulated
+unary
+unashamed
+unashamedly
+unaskable
+unasked
+unassailability
+unassailable
+unassailableness
+unassailably
+unassembled
+unassertive
+unassign
+unassigned
+unassigns
+unassisted
+unassuageable
+unassuming
+unassumingness
+unasterisked
+unattach
+unattached
+unattainability
+unattainable
+unattended
+unattenuated
+unattractive
+unattractively
+unattractiveness
+unattributed
+unauthentic
+unauthenticated
+unauthorize
+unauthorized
+unauthorizedly
+unauthorizedness
+unauthorizes
+unavailability
+unavailable
+unavailing
+unavailingly
+unavailingness
+unaverage
+unavoidable
+unavoidably
+unaware
+unawarely
+unawareness
+unawares
+unbacked
+unbalance
+unbalanced
+unbalancedness
+unballasted
+unban
+unbandage
+unbanned
+unbanning
+unbans
+unbaptize
+unbaptized
+unbaptizes
+unbar
+unbarbered
+unbarred
+unbastardized
+unbated
+unbearable
+unbearably
+unbeatable
+unbeatably
+unbeaten
+unbeautiful
+unbeautifully
+unbecome
+unbecoming
+unbecomingly
+unbecomingness
+unbeknown
+unbeknownst
+unbelief
+unbelievable
+unbelievably
+unbeliever
+unbelieving
+unbelievingly
+unbelt
+unbelted
+unbend
+unbendable
+unbending
+unbent
+unbeseeming
+unbetrothed
+unbiased
+unbiasedness
+unbiblical
+unbid
+unbidden
+unbind
+unbirthday
+unbitted
+unblemished
+unblenched
+unblessed
+unblest
+unblinded
+unblinking
+unblinkingly
+unblock
+unblocked
+unblocking
+unblocks
+unblown
+unblushing
+unblushingly
+unbodied
+unbolt
+unbolted
+unboned
+unbonnet
+unbonneted
+unborn
+unbosom
+unbound
+unbounded
+unboundedness
+unbowed
+unbox
+unbrace
+unbraid
+unbranched
+unbreakable
+unbreathable
+unbred
+unbridle
+unbridled
+unbroke
+unbroken
+unbrutalize
+unbrutalized
+unbrutalizes
+unbrutize
+unbrutizes
+unbuckle
+unbudgeable
+unbudgeably
+unbudging
+unbudgingly
+unbuffered
+unbuild
+unbuilt
+unbundle
+unbundled
+unburden
+unburdened
+unbureaucratic
+unburied
+unburned
+unbuttered
+unbutton
+unbuttoned
+unbuttoning
+unbuttons
+uncage
+uncaged
+uncalculated
+uncalculating
+uncalculatingly
+uncalled
+uncanceled
+uncandid
+uncandidly
+uncannily
+uncanniness
+uncanny
+uncanonize
+uncanonized
+uncanonizes
+uncantonized
+uncantonized's
+uncantonizeds
+uncap
+uncapitalized
+uncared
+uncaring
+uncatchable
+uncatechized
+uncatechized's
+uncatechizedness
+uncatechizeds
+uncategorized
+uncatholicize
+uncatholicizes
+uncaught
+uncaused
+uncauterized
+uncauterized's
+uncauterizeds
+unceasing
+unceasingly
+uncelebrated
+uncelestialized
+uncelestialized's
+uncelestializeds
+uncensored
+unceremonious
+unceremoniously
+unceremoniousness
+uncertain
+uncertainly
+uncertainness
+uncertainties
+uncertainty
+uncertified
+unchain
+unchallengeable
+unchallenged
+unchancy
+unchangeability
+unchangeable
+unchangeably
+unchangealeness
+unchanged
+unchanging
+unchangingly
+unchangingness
+uncharacteristic
+uncharacteristically
+uncharacterized
+uncharge
+uncharged
+uncharitable
+uncharitableness
+uncharitably
+uncharted
+unchartered
+unchaste
+unchastely
+unchasteness
+unchastity
+uncheckable
+unchecked
+unchivalrous
+unchivalrously
+unchloridized
+unchloridized's
+unchloridizeds
+unchoke
+unchosen
+unchristian
+unchristianize
+unchristianized
+unchristianizes
+unchurch
+uncial
+uncially
+unciform
+uncil
+uncinaria
+uncinariasis
+uncinate
+uncinus
+uncircularized
+uncircularized's
+uncircularizeds
+uncircumcised
+uncircumcision
+uncivil
+uncivilizable
+uncivilizable's
+uncivilizables
+uncivilize
+uncivilized
+uncivilizedly
+uncivilizedness
+uncivilizes
+uncivilly
+unclad
+unclaimed
+unclamorous
+unclamorously
+unclamorousness
+unclamp
+unclarity
+unclasp
+unclasping
+unclassical
+unclassified
+uncle
+uncle's
+unclean
+uncleanliness
+uncleanly
+uncleanness
+unclear
+uncleared
+unclench
+unclenched
+unclericalize
+unclericalizes
+uncles
+unclimbable
+unclimbableness
+unclinch
+unclipped
+uncloak
+unclog
+unclose
+unclosed
+unclothe
+unclothed
+unclouded
+uncloudedly
+unclustered
+unclutter
+uncluttered
+unco
+uncoated
+uncock
+uncodable
+uncodeable
+uncoded
+uncoffin
+uncoffined
+uncoil
+uncoiled
+uncoiling
+uncoined
+uncolonize
+uncolonized
+uncolonizes
+uncolorable
+uncolorable's
+uncolorables
+uncolorablies
+uncolorably
+uncolored
+uncoloredly
+uncoloredness
+uncoloreds
+uncombable
+uncomfortable
+uncomfortably
+uncomforted
+uncomment
+uncommented
+uncommenting
+uncomments
+uncommercial
+uncommitted
+uncommon
+uncommonly
+uncommonness
+uncommunicable
+uncommunicative
+uncompassionate
+uncompetitive
+uncompetitiveness
+uncomplaining
+uncomplainingly
+uncompleted
+uncomplicated
+uncomplimentary
+uncomprehending
+uncomprehendingly
+uncompress
+uncompressed
+uncompresses
+uncompressing
+uncompromisable
+uncompromising
+uncompromisingly
+uncomputable
+unconceivable
+unconcern
+unconcerned
+unconcernedly
+unconcernedness
+unconditional
+unconditionally
+unconditioned
+unconfined
+unconfirmed
+unconformable
+unconformably
+unconformity
+uncongenial
+uncongeniality
+unconnected
+unconquerable
+unconquerably
+unconscionability
+unconscionable
+unconscionableness
+unconscionably
+unconscious
+unconsciously
+unconsciousness
+unconservative
+unconsidered
+unconsolidated
+unconstitutional
+unconstitutionality
+unconstitutionally
+unconstrained
+unconstraint
+uncontaminated
+uncontested
+uncontrollability
+uncontrollable
+uncontrollably
+uncontrolled
+uncontroversial
+unconventional
+unconventionality
+unconventionalize
+unconventionalizes
+unconventionally
+unconvertible
+unconvinced
+unconvincing
+unconvincingly
+unconvincingness
+uncool
+uncooled
+uncooperative
+uncoordinated
+uncork
+uncorked
+uncorrectable
+uncorrected
+uncorrelated
+uncorseted
+uncountable
+uncountably
+uncounted
+uncouple
+uncoupler
+uncourageous
+uncousinly
+uncouth
+uncouthly
+uncouthness
+uncovenanted
+uncover
+uncovered
+uncovering
+uncovers
+uncreated
+uncritical
+uncritically
+uncriticizable
+uncriticizable's
+uncriticizables
+uncriticized
+uncriticizing
+uncriticizingly
+uncross
+uncrown
+uncrowned
+uncrumple
+uncrushable
+uncrystallizabilities
+uncrystallizability
+uncrystallizability's
+uncrystallizable
+uncrystallizable's
+uncrystallizables
+uncrystallized
+unction
+unctuous
+unctuously
+unctuousness
+uncured
+uncurl
+uncurled
+uncurricularized
+uncurricularized's
+uncurricularizeds
+uncus
+uncut
+uncynical
+uncynically
+undamaged
+undamped
+undated
+undauntable
+undaunted
+undauntedly
+undebatable
+undebatably
+undecagon
+undeceive
+undecidable
+undecided
+undecillion
+undeclared
+undecomposable
+undecorated
+undedicated
+undefended
+undefense
+undefense's
+undefenses
+undefinability
+undefinable
+undefine
+undefined
+undefinedness
+undeflected
+undeformed
+undelete
+undeleted
+undeliverability
+undeliverable
+undemagnetizable
+undemagnetizable's
+undemagnetizables
+undemocratic
+undemocratically
+undemocratize
+undemocratizes
+undemonstrative
+undemonstratively
+undemonstrativeness
+undeniable
+undeniableness
+undeniably
+undenominationalize
+undenominationalizes
+undependable
+undepicted
+under
+underachieve
+underachievers
+underact
+underactivity
+underadjusting
+underage
+underarm
+underbedding
+underbelly
+underbid
+underbidder
+underbody
+underbracing
+underbred
+underbrim
+underbrush
+underbuy
+undercapitalization
+undercapitalization's
+undercapitalizations
+undercapitalize
+undercapitalized
+undercapitalizes
+undercapitalizing
+undercarriage
+undercart
+undercharge
+underclass
+underclassman
+underclassmen
+underclay
+underclothes
+underclothing
+undercoat
+undercoating
+undercolor
+undercolor's
+undercolored
+undercoloring
+undercolorings
+undercolors
+underconsumption
+undercook
+undercooked
+undercool
+undercount
+undercounts
+undercover
+undercroft
+undercurrent
+undercut
+undercutting
+underdevelop
+underdeveloped
+underdevelopment
+underdo
+underdog
+underdone
+underdrawers
+underdress
+underdressed
+undereducated
+undereducation
+underemphasis
+underemphasize
+underemphasized
+underemphasizes
+underemphasizing
+underemployed
+underemployment
+underenumerated
+underenumeration
+underestimate
+underestimated
+underestimates
+underestimating
+underestimation
+underestimations
+underexpose
+underexposure
+underfeed
+underfelt
+underfilled
+underfloor
+underflow
+underflowed
+underflowing
+underflows
+underfoot
+underfur
+undergarment
+undergarments
+undergird
+undergirding
+underglaze
+undergo
+undergoes
+undergoing
+undergone
+undergrad
+undergrad's
+undergrads
+undergraduate
+undergraduate's
+undergraduates
+underground
+undergrounder
+undergrown
+undergrowth
+underhand
+underhanded
+underhandedly
+underhandedness
+underheat
+underhung
+underinsurance
+underivable
+underived
+underlaborer
+underlaborer's
+underlaborers
+underlaid
+underlay
+underlayment
+underlet
+underletting
+underlie
+underlies
+underline
+underlined
+underlinen
+underlines
+underling
+underling's
+underlings
+underlining
+underlinings
+underlip
+underly
+underlying
+undermanned
+undermentioned
+undermine
+undermined
+undermines
+undermining
+undermost
+underneath
+undernourish
+undernourished
+undernourishment
+undernutrition
+underorganization
+underorganization's
+underorganizations
+underoxidize
+underoxidizes
+underpaid
+underpainting
+underpants
+underpart
+underpass
+underpasses
+underpay
+underpayment
+underpayment's
+underpayments
+underpin
+underpinned
+underpinning
+underpinnings
+underpins
+underpitch
+underpitched
+underpitches
+underpitching
+underplay
+underplayed
+underplaying
+underplays
+underplot
+underplots
+underpopulated
+underpowered
+underprice
+underpriced
+underprices
+underpricing
+underprivileged
+underproduction
+underproductive
+underproof
+underprop
+underquote
+underrate
+underrated
+underrealize
+underrealizes
+underregistration
+underreport
+underreported
+underreporting
+underrepresentation
+underrepresented
+underripe
+underrun
+undersaturated
+undersavior
+undersavior's
+undersaviors
+underscore
+underscored
+underscores
+undersea
+underseal
+underseas
+undersecretariat
+undersecretaries
+undersecretary
+undersecretary's
+undersell
+underset
+undersexed
+undersheriff
+undershirt
+undershirt's
+undershirts
+undershoot
+undershooting
+undershoots
+undershorts
+undershot
+undershrub
+underside
+underside's
+undersides
+undersigned
+undersize
+undersized
+undersizes
+undersizing
+underskirt
+underslung
+undersmooth
+undersmoothed
+undersmoothing
+undersmooths
+undersong
+underspent
+underspin
+understaff
+understaffed
+understand
+understandability
+understandable
+understandably
+understanding
+understandingly
+understandings
+understands
+understate
+understated
+understatement
+understatements
+understates
+understating
+understeer
+understood
+understory
+understrapper
+understrength
+understructure
+understructure's
+understructures
+understudies
+understudy
+understudy's
+undersupply
+undersurface
+undertake
+undertaken
+undertaker
+undertaker's
+undertakers
+undertakes
+undertaking
+undertakings
+undertenant
+underthrust
+undertint
+undertone
+undertook
+undertow
+undertow's
+undertows
+undertrick
+undertrump
+undertype
+underused
+underutilization
+underutilize
+underutilized
+undervaluation
+undervalue
+undervalued
+undervaluing
+undervitalized
+undervitalized's
+undervitalizeds
+underwaist
+underwater
+underway
+underwear
+underweight
+underwent
+underwhelm
+underwhelmed
+underwhelming
+underwhelms
+underwing
+underwood
+underwool
+underworld
+underwrite
+underwriter
+underwriters
+underwrites
+underwriting
+undescended
+undeserved
+undesigned
+undesigning
+undesirability
+undesirable
+undesirableness
+undesirably
+undesired
+undetectability
+undetectable
+undetected
+undetermined
+undeveloped
+undeviated
+undeviating
+undeviatingly
+undialectical
+undialyzed
+undialyzed's
+undialyzeds
+undid
+undies
+undifferentiated
+undigested
+undignified
+undiluted
+undiminished
+undimmed
+undine
+undiphthongize
+undiphthongizes
+undiplomatic
+undiplomatically
+undirected
+undirectional
+undisciplined
+undisclosed
+undiscolored
+undiscolored's
+undiscoloreds
+undiscovered
+undiscussed
+undisguised
+undisguisedly
+undishonored
+undismayed
+undisorganized
+undisputed
+undisrupted
+undissociated
+undistinguished
+undistorted
+undistributed
+undisturbed
+undivided
+undo
+undock
+undocumented
+undoer
+undoes
+undogmatic
+undogmatically
+undoing
+undoings
+undomesticated
+undone
+undouble
+undoubled
+undoubted
+undoubtedly
+undrained
+undramatic
+undramatically
+undramatizable
+undramatizable's
+undramatizables
+undramatized
+undramatized's
+undramatizeds
+undrape
+undraw
+undreamed
+undreamt
+undress
+undressed
+undresses
+undressing
+undried
+undrinkable
+undro
+undrunk
+undset
+undualize
+undualizes
+undue
+undulant
+undulate
+undulated
+undulates
+undulating
+undulation
+undulations
+undulatory
+unduly
+undumper
+undumper's
+undutiful
+undutifully
+undutifulness
+undying
+une
+unearned
+unearth
+unearthed
+unearthing
+unearthliness
+unearthly
+unease
+uneasily
+uneasiness
+uneasy
+uneconomic
+uneconomical
+uneconomizing
+unedited
+uneducated
+unelected
+unembellished
+unemotional
+unemotionally
+unemphatic
+unemphatically
+unemployability
+unemployable
+unemployed
+unemployment
+unenamored
+unenamored's
+unenamoreds
+unencroachable
+unencumbered
+unendeavored
+unending
+unendingly
+unendurable
+unendurableness
+unendurably
+unenergized
+unenergized's
+unenergizeds
+unenforcable
+unenforceable
+unenforcible
+unenlightening
+unenthusiastic
+unenthusiastically
+unenumerated
+unenunciated
+unenviable
+unenvied
+unepitomized
+unequal
+unequaled
+unequalize
+unequalized
+unequalizes
+unequally
+unequivocably
+unequivocal
+unequivocally
+unerring
+unerringly
+UNESCO
+unessential
+unethically
+uneulogized
+uneulogized's
+uneulogizeds
+unevaluated
+unevangelized
+unevangelized's
+unevangelizeds
+uneven
+unevenly
+unevenness
+uneventful
+uneventfully
+unexamined
+unexampled
+unexceptionable
+unexceptionableness
+unexceptionably
+unexceptional
+unexceptionally
+unexcited
+unexcused
+unexpanded
+unexpected
+unexpectedly
+unexpectedness
+unexpended
+unexperienced
+unexplainable
+unexplained
+unexploited
+unexplored
+unexpressed
+unexpressive
+unextended
+unfaded
+unfading
+unfadingly
+unfailing
+unfailingly
+unfailingness
+unfair
+unfairly
+unfairness
+unfaith
+unfaithful
+unfaithfully
+unfaithfulness
+unfaltering
+unfalteringly
+unfamiliar
+unfamiliarity
+unfamiliarized
+unfamiliarly
+unfancy
+unfashionable
+unfashionably
+unfasten
+unfastened
+unfathered
+unfathomable
+unfavorable
+unfavorable's
+unfavorableness
+unfavorables
+unfavorably
+unfavored
+unfavored's
+unfavoring
+unfavoring's
+unfavorings
+unfavorite
+unfavorite's
+unfavorites
+unfeathered
+unfederated
+unfeeling
+unfeelingly
+unfeelingness
+unfeigned
+unfeignedly
+unfelt
+unfenced
+unfertile
+unfertilizable
+unfertilizable's
+unfertilizables
+unfertilized
+unfetter
+unfettered
+unfeudalize
+unfeudalized
+unfeudalizes
+unfilial
+unfilially
+unfilled
+unfindable
+unfinished
+unfired
+unfit
+unfitly
+unfitness
+unfitted
+unfitting
+unfix
+unfixable
+unfixed
+unflagging
+unflaggingly
+unflappability
+unflappable
+unflattering
+unflatteringly
+unflavored
+unfledged
+unflinching
+unflinchingly
+unfocused
+unfold
+unfolded
+unfolding
+unfoldment
+unfolds
+unforced
+unforeseen
+unforgeable
+unforgettability
+unforgettable
+unforgettably
+unforgivable
+unforgiveable
+unforgiveably
+unforgiving
+unforgivingness
+unformalized
+unformatted
+unformed
+unforseen
+unforthcoming
+unfortunate
+unfortunately
+unfortunates
+unfossilized
+unfossilized's
+unfossilizeds
+unfounded
+unfraternizing
+unfraternizing's
+unfraternizings
+unfreeze
+unfrequented
+unfriended
+unfriendliness
+unfriendly
+unfrock
+unfrocking
+unfrosted
+unfrozen
+unfruitful
+unfruitfully
+unfruitfulness
+unfulfilled
+unfunded
+unfunnily
+unfurl
+unfurled
+unfurnished
+unfussy
+ungainliness
+ungainly
+ungallant
+ungallantly
+ungalvanized
+ungalvanized's
+ungalvanizeds
+ungaretti
+ungava
+ungelatinizable
+ungelatinizable's
+ungelatinizables
+ungelatinized
+ungelatinized's
+ungelatinizeds
+ungeneralized
+ungenerosity
+ungenerous
+ungenerously
+ungentilize
+ungentilizes
+ungentlemanize
+ungentlemanizes
+ungird
+ungirt
+unglamorous
+unglazed
+unglue
+unglued
+ungodliness
+ungodly
+ungospelized
+ungospelized's
+ungospelizeds
+ungot
+ungotten
+ungovernable
+ungoverned
+ungraceful
+ungracefully
+ungracefulness
+ungracious
+ungraciously
+ungraded
+ungrammatical
+ungrammaticality
+ungraphitized
+ungraphitized's
+ungraphitizeds
+ungrateful
+ungratefully
+ungratefulness
+ungratified
+ungrounded
+ungrudging
+ungual
+unguard
+unguarded
+unguardedly
+unguardedness
+unguent
+unguessable
+unguessed
+unguiculate
+unguided
+unguinous
+unguis
+ungula
+ungulate
+unguligrade
+unhair
+unhallow
+unhallowed
+unhampered
+unhand
+unhandily
+unhandiness
+unhandsome
+unhandsomely
+unhandy
+unhappier
+unhappiest
+unhappily
+unhappiness
+unhappy
+unharbor
+unharbor's
+unharbored
+unharmed
+unharmonious
+unharmonize
+unharmonized
+unharmonizes
+unharness
+unhealthily
+unhealthiness
+unhealthy
+unheard
+unheated
+unheeded
+unheeding
+unhelm
+unhelpful
+unhelpfully
+unheralded
+unheroize
+unheroizes
+unhesitant
+unhesitating
+unhesitatingly
+unhinge
+unhinged
+unhitch
+unhitched
+unhitches
+unhitching
+unholiness
+unholy
+unhonorable
+unhonorable's
+unhonorables
+unhonorablies
+unhonorably
+unhonored
+unhood
+unhook
+unhooked
+unhooking
+unhooks
+unhoped
+unhorse
+unhorsed
+unhouseled
+unhumored
+unhurried
+unhurriedly
+unhurt
+unhydrolyzed
+unhydrolyzed's
+unhydrolyzeds
+unhypnotizable
+unhypnotizable's
+unhypnotizables
+unhypnotize
+unhypnotizes
+unhysterical
+unhysterically
+uni
+unialgal
+Uniat
+uniaxial
+uniaxially
+unibus
+Unibus
+unibuss
+unicameral
+unicamerally
+unicef
+unicellular
+unicellularity
+unicolour
+unicorn
+unicorn's
+unicorns
+unicostate
+unicycle
+unicyclist
+unideal
+unidealized
+unidentifiable
+unidentified
+unidimensional
+unidirection
+unidirectional
+unidirectionality
+unidirectionally
+unidolized
+unidolized's
+unidolizeds
+unifactorial
+unifiable
+unification
+unifications
+unified
+unifier
+unifiers
+unifies
+unifilar
+unifoliate
+unifoliolate
+uniform
+uniformally
+uniformed
+uniforming
+uniformitarian
+uniformitarianism
+uniformities
+uniformity
+uniformization
+uniformization's
+uniformizations
+uniformize
+uniformizes
+uniformly
+uniformness
+uniforms
+unify
+unifying
+unijugate
+unilateral
+unilateralist
+unilateralists
+unilateralization
+unilateralization's
+unilateralizations
+unilateralize
+unilateralizes
+unilaterally
+unilinear
+unilingual
+uniliteral
+unilluminating
+unillusioned
+unilocular
+unimaginable
+unimaginably
+unimaginative
+unimaginatively
+unimak
+unimmortalize
+unimmortalized
+unimmortalizes
+unimodal
+unimodular
+unimpaired
+unimpassioned
+unimpeachable
+unimpeachably
+unimpeded
+unimplemented
+unimportance
+unimportant
+unimposing
+unimpressed
+unimpressive
+unimproved
+unincorporated
+unindented
+unindividualize
+unindividualized
+unindividualizes
+unindustrialized
+unindustrialized's
+unindustrializeds
+uninfected
+uninfluenced
+uninfluential
+uninformative
+uninformatively
+uninformed
+uninhabited
+uninhibited
+uninhibitedly
+uninhibitedness
+uninitializable
+uninitialized
+uninitiate
+uninitiated
+uninjectable
+uninjured
+uninominal
+uninspired
+uninspiring
+uninstantiated
+uninsulated
+unintelligence
+unintelligent
+unintelligently
+unintelligibility
+unintelligible
+unintelligibleness
+unintelligibly
+unintended
+unintentional
+unintentionally
+uninterested
+uninteresting
+uninterestingly
+uninterpretable
+uninterpreted
+uninterruptable
+uninterrupted
+uninterruptedly
+uninterruptedness
+uninterviewed
+uninucleate
+uninvaginated
+uninvited
+uninvolved
+union
+Union
+union's
+unionism
+unionist
+unionists
+unionization
+unionization's
+unionizations
+unionize
+unionized
+unionizer
+unionizers
+unionizes
+unionizing
+unions
+uniparental
+uniparentally
+uniparous
+unipersonal
+uniplanar
+uniplex
+UniPlus
+UniPlus's
+unipod
+unipolar
+unipolarity
+uniprocessor
+uniprocessor's
+uniprocessors
+unique
+uniquely
+uniqueness
+uniramous
+Uniroyal
+uniseptate
+uniserial
+unisex
+unisexual
+unisexuality
+unisexually
+UniSoft
+UniSoft's
+unison
+Unisys
+unit
+unit's
+unitage
+unital
+unitalicized
+unitarian
+unitarianism
+Unitarianize
+Unitarianizes
+unitarians
+unitarily
+unitarity
+unitary
+unite
+united
+United
+unitedly
+unitemized
+uniter
+uniterm
+unites
+unities
+uniting
+unitive
+unitization
+unitize
+unitized
+unitizes
+unitizing
+units
+unity
+unity's
+Univac
+univalent
+univalve
+univalve's
+univalves
+univariate
+universal
+universalism
+universalist
+universalistic
+universality
+universalization
+universalization's
+universalizations
+universalize
+universalized
+universalizer
+universalizers
+universalizes
+universalizing
+universally
+universalness
+universals
+universe
+universe's
+universes
+universities
+university
+university's
+univocal
+univocally
+Unix
+Unix's
+UNIX's
+unjacketed
+unjam
+unjammed
+unjamming
+unjoined
+unjournalized
+unjust
+unjustifiable
+unjustified
+unjustly
+unjustness
+unkempt
+unkenned
+unkennel
+unkenneled
+unkenneling
+unkind
+unkindliness
+unkindly
+unkindness
+unkink
+unknit
+unknowable
+unknowing
+unknowingly
+unknown
+unknowns
+unlabeled
+unlabialize
+unlabializes
+unlaborable
+unlaborable's
+unlaborables
+unlabored
+unlabored's
+unlaboring
+unlaboring's
+unlaborings
+unlace
+unlaced
+unlacing
+unlade
+unlamented
+unlash
+unlashed
+unlatch
+unlaundered
+unlawful
+unlawfully
+unlawfulness
+unlay
+unlead
+unleaded
+unlearn
+unlearned
+unleash
+unleashed
+unleashes
+unleashing
+unleavened
+unlegalized
+unless
+unlettable
+unlettered
+unleveled
+unleveling
+unliberalized
+unlicensed
+unlicked
+unlike
+unlikelihood
+unlikelihoods
+unlikeliness
+unlikely
+unlikeness
+unlimber
+unlimbered
+unlimbering
+unlimbers
+unlimited
+unlimitedly
+unlined
+unlink
+unlinked
+unlinking
+unlinks
+unlisted
+unliterary
+unlive
+unload
+unloaded
+unloader
+unloaders
+unloading
+unloads
+unlocalizable
+unlocalizable's
+unlocalizables
+unlocalize
+unlocalized
+unlocalizes
+unlock
+unlocked
+unlocking
+unlocks
+unlogged
+unloose
+unloosen
+unloved
+unloveliness
+unlovely
+unluckily
+unluckiness
+unlucky
+unmade
+unmagnetized
+unmagnetized's
+unmagnetizeds
+unmagnified
+unmaintainable
+unmaintained
+unmake
+unmalicious
+unmaliciously
+unman
+unmanageable
+unmanageably
+unmanaged
+unmanliness
+unmanly
+unmanned
+unmannered
+unmanneredly
+unmannerliness
+unmannerly
+unmapped
+unmaps
+unmarked
+unmarred
+unmarried
+unmarrieds
+unmask
+unmasked
+unmatchable
+unmatched
+unmate
+unmated
+unmates
+unmating
+unmeaning
+unmeant
+unmeasurable
+unmeasured
+unmechanize
+unmechanized
+unmechanizes
+unmediatized
+unmediatized's
+unmediatizeds
+unmeet
+unmemorable
+unmemorably
+unmemorialized
+unmemorialized's
+unmemorializeds
+unmemorized
+unmentionable
+unmentionables
+unmentioned
+unmercerized
+unmercerized's
+unmercerizeds
+unmerciful
+unmercifully
+unmeritorious
+unmeshed
+unmesmerize
+unmesmerized
+unmesmerizes
+unmet
+unmetalized
+unmetalized's
+unmetalizeds
+unmethodical
+unmethodized
+unmethodized's
+unmethodizeds
+unmethodizing
+unmethodizing's
+unmethodizings
+unmindful
+unmineralized
+unmineralized's
+unmineralizeds
+unminimized
+unmissionized
+unmissionized's
+unmissionizeds
+unmistakable
+unmistakably
+unmitigatd
+unmitigated
+unmitigatedly
+unmitigatedness
+unmixed
+unmobilized
+unmobilized's
+unmobilizeds
+unmodeled
+unmoderated
+unmodernize
+unmodernized
+unmodernizes
+unmodifiable
+unmodified
+unmolested
+unmonopolize
+unmonopolized
+unmonopolizes
+unmonopolizing
+unmonopolizings
+unmoor
+unmoral
+unmorality
+unmoralize
+unmoralized
+unmoralizes
+unmoralizing
+unmoralizings
+unmotivated
+unmotorized
+unmount
+unmountable
+unmounted
+unmoved
+unmoving
+unmuffle
+unmunicipalized
+unmunicipalized's
+unmunicipalizeds
+unmurmuring
+unmusical
+unmutualized
+unmutualized's
+unmutualizeds
+unmuzzle
+unmyelinated
+unmysticize
+unmysticizes
+unnail
+unnameable
+unnamed
+unnationalized
+unnatural
+unnaturalizable
+unnaturalizable's
+unnaturalizables
+unnaturalize
+unnaturalized
+unnaturalizes
+unnaturally
+unnaturalness
+unnecessarily
+unnecessary
+unneeded
+unnegated
+unneighbored
+unneighborlike
+unneighborlike's
+unneighborlikes
+unneighborliness
+unneighborly
+unnerve
+unnerved
+unnerves
+unnerving
+unnervingly
+unneutralized
+unnitrogenized
+unnitrogenized's
+unnitrogenizeds
+unnormalize
+unnormalized
+unnormalizes
+unnormalizing
+unnoticed
+unnourished
+unnumbered
+uno
+unobservable
+unobservables
+unobserved
+unobtainable
+unobtrusive
+unobtrusively
+unobtrusiveness
+unoccupied
+unofficial
+unofficially
+unopenable
+unopened
+unoptimize
+unoptimized
+unoptimizes
+unoptimizing
+unordered
+unorganizable
+unorganizable's
+unorganizables
+unorganized
+unorganizedly
+unorganizedness
+unoriginals
+unorthodox
+unorthodoxly
+unorthodoxy
+unoxidizable
+unoxidizable's
+unoxidizables
+unoxidized
+unoxygenized
+unoxygenized's
+unoxygenizeds
+unpack
+unpackage
+unpackaged
+unpackages
+unpackaging
+unpacked
+unpacker
+unpacking
+unpacks
+unpaddable
+unpadded
+unpaganize
+unpaganizes
+unpaged
+unpaid
+unpaintable
+unpainted
+unpaired
+unpalatability
+unpalatable
+unparagonized
+unparagonized's
+unparagonizeds
+unparalleled
+unparalyzed
+unparalyzed's
+unparalyzeds
+unparameterized
+unparceled
+unparliamentary
+unparsed
+unparticularized
+unparticularized's
+unparticularizeds
+unparticularizing
+unparticularizing's
+unparticularizings
+unpartisan
+unpartitioned
+unpatriotic
+unpatronizable
+unpatronizable's
+unpatronizables
+unpatronized
+unpatronizing
+unpatronizing's
+unpauperized
+unpauperized's
+unpauperizeds
+unpaved
+unpeg
+unpenalized
+unpeople
+unperceived
+unperfect
+unperforated
+unperformed
+unperson
+unperturbed
+unperturbedly
+unphilosophize
+unphilosophized
+unphilosophizes
+unphosphatized
+unphosphatized's
+unphosphatizeds
+unphysical
+unpick
+unpicturesque
+unpile
+unpin
+unplaced
+unplagiarized
+unplagiarized's
+unplagiarizeds
+unplagued
+unplanned
+unpleasant
+unpleasantly
+unpleasantness
+unpleased
+unplowed
+unplug
+unplugged
+unplugging
+unplugs
+unplumbed
+unpoeticized
+unpoeticized's
+unpoeticizeds
+unpoetize
+unpoetized
+unpoetizes
+unpolarizable
+unpolarizable's
+unpolarizables
+unpolarized
+unpolarized's
+unpolarizeds
+unpolitic
+unpolitical
+unpolled
+unpolluted
+unpolymerized
+unpolymerized's
+unpolymerizeds
+unpopular
+unpopularity
+unpopularize
+unpopularizes
+unpracticed
+unprecedented
+unprecedentedly
+unpredictability
+unpredictable
+unpredictably
+unpredicted
+unpreemphasized
+unpregnant
+unprejudiced
+unpremeditated
+unprepared
+unprepossessing
+unprescribed
+unpreserved
+unpretending
+unpretentious
+unpretentiously
+unpretentiousness
+unpriced
+unprimed
+unprincipled
+unprincipledness
+unprintable
+unprinted
+unprivileged
+unproblematic
+unproblematical
+unproblematically
+unprocessed
+unprocurable
+unproductive
+unprofessed
+unprofessional
+unprofitable
+unprofitableness
+unprofitably
+unprojected
+unpromising
+unpromisingly
+unprompted
+unpronounceable
+unpronounced
+unpropagated
+unpropertied
+unprotected
+unprotectedly
+unprotestantize
+unprotestantizes
+unprovability
+unprovable
+unproved
+unproven
+unprovided
+unprovocative
+unpublished
+unpulverize
+unpulverized
+unpulverizes
+unpunched
+unpunished
+unqualified
+unqualifiedly
+unquantifiable
+unquenched
+unquestionable
+unquestionably
+unquestioned
+unquestioning
+unquestioningly
+unquiet
+unquietly
+unquietness
+unquote
+unquoted
+unradicalize
+unradicalizes
+unrancored
+unrancored's
+unrancoreds
+unranked
+unrated
+unravel
+unraveled
+unraveler
+unravelers
+unraveling
+unravels
+unreachable
+unreacted
+unreactive
+unread
+unreadability
+unreadable
+unreadiness
+unready
+unreal
+unrealism
+unrealistic
+unrealistically
+unreality
+unrealizable
+unrealizable's
+unrealizables
+unrealize
+unrealized
+unrealizes
+unrealizing
+unrealizings
+unreason
+unreasonable
+unreasonableness
+unreasonably
+unreasoning
+unreasoningly
+unreassuringly
+unreceptive
+unreckonable
+unrecognizable
+unrecognized
+unrecognizing
+unrecognizingly
+unreconnoitered
+unreconnoitered's
+unreconnoitereds
+unreconstructed
+unrecordable
+unrecorded
+unrecoverable
+unredeemable
+unredeemed
+unreel
+unreeling
+unreeve
+unreferenced
+unrefined
+unreflected
+unreflective
+unregenerate
+unregister
+unregistered
+unregistering
+unregisters
+unregulated
+unrehearsed
+unreinforced
+unrelated
+unreleased
+unrelenting
+unrelentingly
+unreliabilities
+unreliability
+unreliable
+unreliably
+unrelieved
+unreligious
+unremarkable
+unremarked
+unremitting
+unremittingly
+unremunerated
+unreorganized
+unrepair
+unrepentant
+unreported
+unrepresentable
+unrepresentative
+unrepresented
+unrequested
+unrequited
+unreserve
+unreserved
+unreservedly
+unreservedness
+unresisted
+unresisting
+unresolved
+unresponsive
+unresponsively
+unresponsiveness
+unrest
+unrestrained
+unrestrainedly
+unrestrainedness
+unrestraint
+unrestricted
+unrestrictedly
+unrestrictive
+unreturned
+unrevealing
+unrevelationize
+unrevelationizes
+unrewarding
+unriddle
+unrifled
+unrig
+unrighteous
+unrighteously
+unrighteousness
+unrip
+unripe
+unripeness
+unrivaled
+unrobe
+unroll
+unrolled
+unrolling
+unrolls
+unromantic
+unromantically
+unromanticized
+unromanticized's
+unromanticizeds
+unroof
+unroot
+unrotate
+unrotated
+unround
+unrounded
+unroyalized
+unroyalized's
+unroyalizeds
+unruffled
+unruled
+unruliness
+unruly
+unrumored
+unrwa
+unsabered
+unsaddle
+unsafe
+unsafely
+unsafety
+unsaid
+unsalted
+unsanitary
+unsatirize
+unsatirized
+unsatirizes
+unsatisfactorily
+unsatisfactory
+unsatisfiability
+unsatisfiable
+unsatisfied
+unsatisfying
+unsaturate
+unsaturated
+unsaved
+unsavored
+unsavoredly
+unsavoredness
+unsavories
+unsavorilies
+unsavorily
+unsavoriness
+unsavory
+unsavory's
+unsay
+unsayable
+unscandalize
+unscandalized
+unscandalizes
+unscathed
+unscepter
+unscepter's
+unsceptered
+unscepters
+unscheduled
+unschematized
+unschematized's
+unschematizeds
+unschooled
+unscientific
+unscientifically
+unscramble
+unscrambled
+unscrambler
+unscrambles
+unscrambling
+unscratched
+unscreened
+unscrew
+unscrewed
+unscrewing
+unscrews
+unscripted
+unscrupulous
+unscrupulously
+unscrupulousness
+unscrutinized
+unscrutinizing
+unscrutinizingly
+unseal
+unsealed
+unsealing
+unseals
+unseam
+unsearchable
+unsearchably
+unseasonable
+unseasonableness
+unseasonably
+unseasoned
+unseat
+unsectarianize
+unsectarianizes
+unsecularize
+unsecularized
+unsecularizes
+unsecured
+unsee
+unseeded
+unseeing
+unseemly
+unseen
+unsegmented
+unsegregated
+unsel
+unselected
+unselective
+unselfconscious
+unselfconsciousness
+unselfish
+unselfishly
+unselfishness
+unsensitize
+unsensitized
+unsensitizes
+unsensualize
+unsensualized
+unsensualizes
+unsent
+unsentimentalize
+unsentimentalizes
+unsepulcher
+unsepulchered
+unsepulchers
+unserved
+unserviceable
+unserviced
+unservile
+unset
+unsettle
+unsettled
+unsettledness
+unsettlement
+unsettling
+unsettlingly
+unsew
+unsex
+unshackle
+unshaded
+unshakable
+unshakeable
+unshaken
+unshapen
+unshared
+unsharpened
+unshaved
+unshaven
+unsheathe
+unsheathing
+unshed
+unshell
+unshelled
+unsheltered
+unshielded
+unshift
+unship
+unshockability
+unshockable
+unshod
+unshped
+unsight
+unsighted
+unsightly
+unsignalized
+unsignalized's
+unsignalizeds
+unsigned
+unsimplified
+unsinkable
+unsiphon
+unsiphon's
+unsiphons
+unsized
+unskilful
+unskilled
+unskillful
+unskillfully
+unskillfulness
+unslaked
+unsling
+unslinged
+unslinging
+unslings
+unsloped
+unslung
+unsmiling
+unsmilingly
+unsnap
+unsnapped
+unsnapping
+unsnaps
+unsnarl
+unsociability
+unsociable
+unsociableness
+unsociably
+unsocial
+unsocialized
+unsocially
+unsold
+unsolder
+unsolemnize
+unsolemnized
+unsolemnizes
+unsolicited
+unsolvable
+unsolved
+unsophisticated
+unsophistication
+unsorted
+unsought
+unsound
+unsounded
+unsoundly
+unsoundness
+unsparing
+unsparingly
+unspeak
+unspeakable
+unspeakably
+unspeaking
+unspecialized
+unspecializing
+unspecifed
+unspecific
+unspecified
+unspecify
+unspectacular
+unspecterlike
+unspecterlike's
+unspecterlikes
+unspent
+unsphere
+unspiritualize
+unspiritualized
+unspiritualizes
+unspoiled
+unspoken
+unsportsmanlike
+unspotted
+unsprayed
+unsprocketed
+unsprung
+unstable
+unstableness
+unstably
+unstacked
+unstacks
+unstained
+unstandardized
+unstapled
+unstaring
+unstate
+unstated
+unsteadily
+unsteadiness
+unsteady
+unsteel
+unstemmed
+unstep
+unsterilized
+unstick
+unstigmatized
+unstigmatized's
+unstigmatizeds
+unstilted
+unstinting
+unstintingly
+unstoicize
+unstoicizes
+unstop
+unstoppable
+unstoppably
+unstopped
+unstrained
+unstrap
+unstratified
+unstreamed
+unstressed
+unstriated
+unstring
+unstriped
+unstructured
+unstrung
+unstuck
+unstudied
+unstuffy
+unsubscripted
+unsubsidized
+unsubstantial
+unsubstantiality
+unsubstantialize
+unsubstantializes
+unsubstantially
+unsubstantiated
+unsubstituted
+unsubtle
+unsuccess
+unsuccessful
+unsuccessfully
+unsuccorable
+unsuccorable's
+unsuccorables
+unsuccored
+unsuffixed
+unsuggestive
+unsuitability
+unsuitable
+unsuitably
+unsuited
+unsulphurized
+unsulphurized's
+unsulphurizeds
+unsummarized
+unsung
+unsupernaturalize
+unsupernaturalized
+unsupernaturalizes
+unsupportable
+unsupported
+unsupportive
+unsure
+unsurmountable
+unsurpassed
+unsurprised
+unsurprising
+unsurprisingly
+unsuspected
+unsuspecting
+unsuspended
+unswathe
+unswear
+unswerving
+unsymbolized
+unsymmetrical
+unsymmetrically
+unsymmetrized
+unsymmetrized's
+unsymmetrizeds
+unsympathetic
+unsympathizabilities
+unsympathizability
+unsympathizability's
+unsympathizable
+unsympathizable's
+unsympathizables
+unsympathized
+unsympathizing
+unsympathizing's
+unsympathizingly
+unsympathizings
+unsynchronized
+unsynthesized
+unsystematic
+unsystematized
+unsystematizedly
+unsystematizing
+unsystemizable
+unsystemizable's
+unsystemizables
+untamed
+untampered
+untangle
+untantalized
+untantalizing
+untantalizing's
+untantalizings
+untaped
+untapped
+untartarized
+untartarized's
+untartarizeds
+untaught
+unteach
+untechnicalize
+untechnicalizes
+untellable
+untemporizing
+untemporizing's
+untemporizings
+untenability
+untenable
+untenanted
+untented
+unter
+unterminated
+unterrorized
+unterwalden
+untestable
+untested
+untether
+unthaw
+unthematic
+untheorizable
+untheorizable's
+untheorizables
+unthink
+unthinkability
+unthinkable
+unthinkably
+unthinking
+unthinkingly
+unthought
+unthread
+unthrone
+untidily
+untidiness
+untidy
+untie
+untied
+unties
+until
+untimeliness
+untimely
+untimeous
+untitled
+unto
+untold
+untouchability
+untouchable
+untouchable's
+untouchables
+untouched
+untoward
+untowardly
+untowardness
+untraceability
+untraceable
+untraced
+untracked
+untraditional
+untrained
+untrammeled
+untranquilized
+untransformed
+untranslated
+untransposed
+untravelled
+untread
+untreated
+untried
+untrod
+untrodden
+untroubled
+untrue
+untruly
+untruss
+untrusted
+untrustworthiness
+untruth
+untruthful
+untruthfully
+untruthfulness
+untuck
+untune
+untutored
+untwine
+untwist
+untwisted
+untying
+untyped
+untypical
+unusable
+unused
+unusual
+unusually
+unusualness
+unutilizable
+unutilizable's
+unutilizables
+unutterable
+unutterably
+unuttered
+unvacuolated
+unvalued
+unvaporized
+unvaporized's
+unvaporizeds
+unvarnished
+unvarying
+unvectorizable
+unveil
+unveiled
+unveiling
+unveils
+unventilated
+unverbalized
+unverified
+unvictimized
+unvisited
+unvisualized
+unvitalized
+unvitalized's
+unvitalizeds
+unvitriolized
+unvitriolized's
+unvitriolizeds
+unvocal
+unvocalized
+unvocalized's
+unvocalizeds
+unvoice
+unvoiced
+unvolatilize
+unvolatilized
+unvolatilizes
+unvulcanized
+unvulcanized's
+unvulcanizeds
+unvulgarize
+unvulgarized
+unvulgarizes
+unwaged
+unwaivering
+unwanted
+unwarily
+unwariness
+unwarrant
+unwarrantable
+unwarrantably
+unwarranted
+unwary
+unwashed
+unwashedness
+unwatched
+unwavering
+unwaveringly
+unwearied
+unweariedly
+unweave
+unwed
+unweeting
+unweetingly
+unweighed
+unweight
+unweighted
+unwelcome
+unwell
+unwept
+unwesternized
+unwesternized's
+unwesternizeds
+unwholesome
+unwholesomely
+unwieldily
+unwieldiness
+unwieldy
+unwilled
+unwilling
+unwillingly
+unwillingness
+unwind
+unwinder
+unwinders
+unwinding
+unwinds
+unwinking
+unwinnable
+unwire
+unwired
+unwisdom
+unwise
+unwisely
+unwiser
+unwisest
+unwish
+unwished
+unwitnessed
+unwitting
+unwittingly
+unwomanize
+unwomanized
+unwomanizes
+unwomanly
+unwonted
+unwontedly
+unwontedness
+unworkable
+unworldliness
+unworldly
+unworn
+unworthily
+unworthiness
+unworthy
+unwound
+unwounded
+unwoven
+unwrap
+unwrapped
+unwrapping
+unwraps
+unwreathe
+unwrinkled
+unwritable
+unwritten
+unyielded
+unyielding
+unyieldingly
+unyoke
+unzio
+unzip
+up
+upanishad
+uparrow
+upas
+upbeat
+upbraid
+upbraider
+upbring
+upbringing
+upbuild
+upbuilder
+upcast
+upchuck
+upcome
+upcoming
+upcountry
+update
+updated
+updater
+updates
+updating
+updo
+updos
+updraft
+upend
+upfield
+upgrade
+upgraded
+upgrades
+upgrading
+upgrowth
+upheaval
+upheavals
+upheave
+upheaver
+upheld
+uphill
+uphold
+upholder
+upholders
+upholding
+upholds
+upholster
+upholstered
+upholsterer
+upholsterers
+upholstering
+upholsters
+upholstery
+uphoster
+uphroe
+upkeep
+upland
+uplander
+uplands
+uplift
+uplifted
+uplifter
+uplifting
+uplifts
+upload
+uploaded
+uploading
+uploads
+upmanship
+upmost
+upolu
+upon
+upped
+upper
+upperbound
+upperbounds
+uppercase
+uppercased
+uppercases
+uppercasing
+upperclassman
+upperclassmen
+uppercut
+uppermost
+upperpart
+uppers
+upping
+uppish
+uppishly
+uppishness
+uppity
+uppityness
+uppsala
+upraise
+upraised
+uprear
+upright
+uprightly
+uprightness
+uprise
+upriser
+uprising
+uprising's
+uprisings
+upriver
+uproar
+uproarious
+uproariously
+uproariousness
+uproot
+uprooted
+uprooter
+uprooting
+uproots
+uprouse
+uprush
+ups
+upsadaisy
+upsala
+upset
+upsets
+upsetter
+upsetting
+upshift
+upshot
+upshot's
+upshots
+upside
+upsides
+upsilon
+upslope
+upspring
+upstage
+upstaged
+upstages
+upstaging
+upstairs
+upstand
+upstanding
+upstandingness
+upstart
+upstate
+upstater
+upstream
+upstretched
+upstroke
+upsurge
+upsweep
+upswell
+upswept
+upswing
+upswings
+uptake
+upthrow
+upthrust
+uptight
+uptightness
+uptilt
+uptime
+upto
+Upton
+uptown
+uptrend
+upturn
+upturned
+upturning
+upturns
+upward
+upwardly
+upwardness
+upwards
+upwell
+upwind
+uracil
+uraei
+uraemia
+uraeus
+Ural
+Uralic
+uralite
+uralitic
+uranalysis
+Urania
+Uranian
+uranic
+uranide
+uraninite
+uranism
+uranite
+uranium
+uranographic
+uranographical
+uranography
+uranological
+uranology
+uranometry
+uranous
+Uranus
+uranyl
+urate
+uratic
+urban
+Urbana
+urbane
+urbanely
+urbanism
+urbanist
+urbanistic
+urbanistically
+urbanite
+urbanites
+urbanity
+urbanization
+urbanization's
+urbanizations
+urbanize
+urbanized
+urbanizes
+urbanizing
+urbanologist
+urbanology
+urbiculture
+urceolate
+urchin
+urchin's
+urchins
+Urdu
+ure
+urea
+urease
+uredinial
+uredinium
+urediospore
+uredium
+Uredo
+uredosorus
+uredospore
+uredostage
+ureide
+uremia
+uremic
+ureotelic
+ureotelism
+ureter
+ureteral
+ureteric
+urethan
+urethane
+urethanes
+urethra
+urethral
+urethritis
+urethroscope
+uretic
+urey
+urfa
+urga
+urge
+urged
+urgencies
+urgency
+urgent
+urgently
+urger
+urges
+urging
+urgings
+Uri
+Uriah
+uric
+uricosuric
+uricotelic
+uricotelism
+uridine
+Uriel
+urim
+urinal
+urinals
+urinalysis
+urinant
+urinary
+urinate
+urinated
+urinates
+urinating
+urination
+urine
+uriniferous
+urinogenital
+urinometer
+urinometer's
+urinometers
+urinous
+Uris
+urmia
+Urmston
+urn
+urn's
+Urnfield
+urning
+urns
+urochord
+urochordal
+urochordate
+urochrome
+urodele
+urogenital
+urogenous
+urokinase
+urol
+urolith
+urolithiasis
+urologic
+urological
+urologist
+urology
+uropod
+uropygial
+uropygium
+uroscopy
+urostyle
+Urquhart
+urquhart
+Ursa
+ursine
+Ursula
+Ursuline
+urticaceous
+urticaria
+urticarial
+urticate
+urtication
+uruapan
+Uruguay
+urumchi
+urundi
+urus
+urushiol
+us
+USA
+usability
+usable
+usableness
+usably
+USAF
+usage
+usages
+usance
+USART
+USC
+USC's
+USDA
+use
+useably
+used
+useful
+usefully
+usefulness
+useless
+uselessly
+uselessness
+Usenet
+Usenet's
+Usenix
+Usenix's
+user
+user's
+username
+usernames
+users
+uses
+useway
+USG
+USG's
+USGS
+ushant
+ushas
+usher
+ushered
+usherette
+ushering
+ushers
+USIA
+using
+USN
+usnach
+usnea
+uspallata
+USPS
+usquebaugh
+usrio
+ussher
+USSR
+ussuri
+ustashi
+Ustinov
+ustulation
+ustyurt
+usual
+usually
+usualness
+usufruct
+usufructuary
+usumbura
+usurer
+usurious
+usuriously
+usuriousness
+usurp
+usurpation
+usurped
+usurper
+usury
+UT
+Utah
+Utah's
+utamaro
+ute
+uteca
+utensil
+utensil's
+utensils
+utep
+uterine
+uterus
+uteruses
+utgard
+uther
+Utica
+utile
+utilitarian
+utilitarianism
+utilitarianize
+utilitarianizes
+utilities
+utility
+utility's
+utilizabilities
+utilizability
+utilizable
+utilizable's
+utilizables
+utilization
+utilize
+utilized
+utilizer
+utilizers
+utilizes
+utilizing
+utiny
+utmost
+utopia
+utopian
+utopian's
+utopianism
+Utopianize
+utopianizer
+utopianizer's
+utopianizers
+Utopianizes
+utopians
+utopias
+utopism
+utopist
+utopistic
+Utrecht
+Utrecht's
+utricle
+utricular
+utricularia
+utriculitis
+utriculus
+utrillo
+uttar
+utter
+utterable
+utterance
+utterance's
+utterances
+uttered
+utterer
+uttering
+utterly
+uttermost
+utters
+uttium
+uucp
+uucp's
+UV
+uvarovite
+uvea
+uveal
+uvedale
+uveitis
+uvula
+uvular
+uvularly
+uvulitis
+Uxbridge
+uxmal
+uxorial
+uxoricide
+uxorious
+uxoriously
+uxoriousness
+Uzbek
+Uzi
+Uzi's
+VA
+Vaal
+Vaasa
+VAC
+vacancies
+vacancy
+vacancy's
+vacant
+vacantly
+vacantness
+vacate
+vacated
+vacates
+vacating
+vacation
+vacationed
+vacationer
+vacationers
+vacationing
+vacationist
+vacationland
+vacationless
+vacations
+vaccinal
+vaccinate
+vaccinated
+vaccinates
+vaccinating
+vaccination
+vaccinations
+vaccinator
+vaccinators
+vaccine
+vaccines
+vaccinia
+vaccinial
+vaccinization
+vaccinization's
+vaccinizations
+vacherin
+vacillate
+vacillated
+vacillates
+vacillating
+vacillatingly
+vacillation
+vacillations
+vacillator
+vacillator's
+vacillators
+vacua
+vacuity
+vacuo
+vacuolar
+vacuolate
+vacuolated
+vacuolates
+vacuolating
+vacuolation
+vacuole
+vacuoles
+vacuolization
+vacuolization's
+vacuolizations
+vacuous
+vacuously
+vacuousness
+vacuum
+vacuumed
+vacuuming
+vacuumize
+vacuumized
+vacuumizes
+vacuumizing
+vacuums
+vadodara
+vadose
+Vaduz
+VAG
+vagabond
+vagabond's
+vagabondage
+vagabondish
+vagabondism
+vagabondize
+vagabondizer
+vagabondizers
+vagabondizes
+vagabonds
+vagal
+vagally
+vagaries
+vagarious
+vagariously
+vagary
+vagary's
+vagile
+vagility
+vagina
+vagina's
+vaginal
+vaginally
+vaginas
+vaginate
+vaginectomy
+vaginismus
+vaginitis
+vagotomy
+vagotonia
+vagotonic
+vagotropic
+vagrancy
+vagrant
+vagrantize
+vagrantizes
+vagrantly
+vagrants
+vague
+vaguely
+vagueness
+vaguer
+vaguest
+vagus
+vahana
+Vail
+vain
+vainglorious
+vaingloriously
+vaingloriousness
+vainglory
+vainly
+vainness
+Vaishnava
+vaisya
+valais
+valance
+valanced
+valances
+valdai
+valdemar
+valdivia
+vale
+vale's
+valediction
+valedictorian
+valedictorian's
+valedictory
+valence
+valence's
+valences
+Valencia
+Valenciennes
+valencies
+valency
+valens
+valentine
+valentine's
+valentines
+Valentinian
+valera
+valerian
+valerianaceous
+valeric
+Valerie
+Valery
+Valery's
+vales
+valet
+valet's
+valeta
+valets
+valetta
+valetudinarian
+valetudinarianism
+valetudinary
+valgus
+Valhalla
+valiance
+valiancy
+valiant
+valiantly
+valiantness
+valid
+validate
+validated
+validates
+validating
+validation
+validations
+validity
+validly
+validness
+valine
+valise
+valises
+Valjakka
+Valkyrie
+valladolid
+vallation
+valle
+vallecula
+vallecular
+Valletta
+Valletta's
+valley
+valley's
+valleys
+vallombrosa
+Valois
+valona
+valonia
+valor
+valor's
+valorization
+valorization's
+valorizations
+valorize
+valorized
+valorizes
+valorizing
+valorous
+valorously
+valors
+Valparaiso
+valuable
+valuableness
+valuables
+valuably
+valuate
+valuated
+valuates
+valuating
+valuation
+valuation's
+valuational
+valuationally
+valuations
+valuator
+valuators
+value
+valued
+valueless
+valuelessness
+valuer
+valuers
+values
+valuing
+valuta
+valvate
+valve
+valve's
+valved
+valves
+valving
+valvular
+valvule
+valvulitis
+vambrace
+vamoose
+vamoosed
+vamooses
+vamoosing
+vamp
+vamper
+vampire
+vampires
+vampirism
+vampirize
+vampirizes
+vampish
+van
+van's
+vanadate
+vanadic
+vanadinite
+vanadium
+vanadous
+vanaspati
+vanbrugh
+Vance
+Vancement
+Vancouver
+Vanda
+vandal
+vandalism
+vandalistic
+vandalization
+vandalization's
+vandalizations
+vandalize
+vandalized
+vandalizes
+vandalizing
+vandals
+Vandenberg
+Vanderbilt
+vanderburgh
+Vanderburgh
+Vanderpoel
+Vanderpoel's
+Vandyke
+vandyked
+vane
+vane's
+vaned
+vanes
+Vanessa
+Vanessa's
+vang
+vanguard
+vanguardism
+vanguardist
+vanilla
+vanillic
+vanillin
+Vanir
+vanish
+vanished
+vanisher
+vanishes
+vanishing
+vanishingly
+vanities
+vanity
+vanquish
+vanquishable
+vanquished
+vanquisher
+vanquishes
+vanquishing
+vanquishment
+vans
+vansittart
+vantage
+vantages
+vanua
+Vanuatu
+vanward
+vanzetti
+vapid
+vapidity
+vapidly
+vapidness
+vapor
+vapor's
+vaporabilities
+vaporability
+vaporability's
+vaporable
+vaporable's
+vaporables
+vapored
+vaporer
+vaporer's
+vaporers
+vaporescence
+vaporetto
+vaporier
+vaporiest
+vaporific
+vaporimeter
+vaporing
+vaporing's
+vaporingly
+vaporings
+vaporish
+vaporishness
+vaporizable
+vaporizable's
+vaporizables
+vaporization
+vaporization's
+vaporizations
+vaporize
+vaporized
+vaporizer
+vaporizers
+vaporizes
+vaporizing
+vaporless
+vaporlesses
+vaporlike
+vaporlike's
+vaporlikes
+vaporous
+vaporously
+vaporousness
+vapors
+vapory
+vaquero
+VAR
+vara
+varactor
+Varady
+varanasi
+Varangian
+vardar
+vardon
+varec
+varese
+Varga
+vargas
+varia
+variability
+variable
+variable's
+variableness
+variables
+variablity
+variably
+variac
+Varian
+variance
+variance's
+variances
+variant
+variantly
+variants
+variate
+variated
+variates
+variating
+variation
+variation's
+variational
+variationally
+variations
+varicella
+varicellate
+varicelloid
+varices
+varicocele
+varicolored
+varicolored's
+varicoloreds
+varicose
+varicosed
+varicosis
+varicosity
+varicotomy
+varied
+variedly
+variegate
+variegated
+variegation
+variegator
+varier
+varies
+varietal
+varietally
+varieties
+variety
+variety's
+variform
+variocoupler
+variola
+variolate
+variole
+variolite
+varioloid
+variolous
+variometer
+variometer's
+variometers
+variorum
+various
+variously
+variousness
+variscite
+varisized
+varistor
+Varitype
+Varitype's
+varityper
+Varityping
+varix
+varlet
+varletry
+varmint
+varna
+varnish
+varnish's
+varnished
+varnisher
+varnishers
+varnishes
+varnishing
+varnishy
+varro
+varsity
+Varuna
+varus
+varve
+varved
+vary
+varying
+varyingly
+varyings
+vas
+vasal
+vasari
+vasco
+vascular
+vascularity
+vascularization
+vascularization's
+vascularizations
+vascularize
+vascularized
+vascularizes
+vascularizing
+vasculature
+vasculum
+vase
+vase's
+vasectomies
+vasectomy
+vaselike
+Vaseline
+vases
+vashti
+vasiform
+vasoactive
+vasoactivity
+vasoconstriction
+vasoconstrictive
+vasoconstrictor
+vasodilatation
+vasodilation
+vasodilator
+vasoinhibitor
+vasomotor
+vasopressin
+vasopressor
+vasoregulatory
+vasospasm
+vasospastic
+vasotocin
+Vasquez
+Vasquez's
+vassal
+vassalage
+vassalization
+vassalize
+vassalized
+vassalizes
+vassalizing
+vassals
+Vassar
+Vassar's
+vast
+vaster
+vastest
+vastitude
+vastity
+vastly
+vastness
+vasty
+vat
+vat's
+vatic
+Vatican
+Vaticanism
+Vaticanization
+Vaticanization's
+Vaticanizations
+Vaticanize
+Vaticanizes
+vaticide
+vaticinal
+vaticinate
+vaticination
+vaticinator
+vats
+vatted
+vatting
+vauban
+vaucluse
+vaud
+vaudeville
+vaudevillian
+Vaudois
+Vaughan
+Vaughan's
+Vaughn
+vault
+vaulted
+vaulter
+vaulting
+vaults
+vaulty
+vaunt
+vaunted
+vaunter
+vauntful
+vauntingly
+vaunty
+vav
+vavasor
+vaward
+Vax
+VAX
+Vax's
+VCR
+VDU
+veal
+vealer
+vealing
+vealy
+Veasy
+Veblen
+vectograph
+vectographic
+vector
+vector's
+vectorcardiogram
+vectorcardiogram's
+vectorcardiograms
+vectorcardiographic
+vectorcardiography
+vectored
+vectorial
+vectoring
+vectorizable
+vectorization
+vectorize
+vectorized
+vectorizer
+vectorizers
+vectorizes
+vectorizing
+vectors
+Veda
+Veda's
+Vedalia
+Vedanta
+Vedda
+Veddoid
+Vedernikov
+vedette
+Vedic
+vee
+veep
+veer
+veered
+veeries
+veering
+veeringly
+veers
+veery
+veg
+Vega
+vegan
+Veganism
+Vegas
+vegetable
+vegetable's
+vegetables
+vegetablize
+vegetablizes
+vegetably
+vegetal
+vegetarian
+vegetarian's
+vegetarianism
+vegetarians
+vegetate
+vegetated
+vegetates
+vegetating
+vegetation
+vegetational
+vegetationally
+vegetative
+vegetatively
+vegetativeness
+vegete
+vegetive
+vehemence
+vehement
+vehemently
+vehicle
+vehicle's
+vehicles
+vehicular
+veii
+veil
+veiled
+veiling
+veils
+vein
+veinal
+veined
+veiner
+veining
+veinlet
+veins
+veinstone
+veinule
+veiny
+vela
+velamen
+velamentous
+velamina
+velar
+velarium
+velarization
+velarize
+velarized
+velarizes
+velarizing
+Velasquez
+velate
+velcro
+veld
+veldskoen
+veldt
+veldt's
+veldts
+veleta
+veliger
+velitation
+velites
+Vella
+Vella's
+velleity
+vellicate
+vellore
+vellum
+veloce
+velocimeter
+velocimeter's
+velocimeters
+velocipede
+velocities
+velocity
+velocity's
+velodrome
+velopment
+velour
+velours
+Velsen
+velum
+velure
+velutinous
+velvet
+velveteen
+velvety
+vena
+venae
+venal
+venality
+venalization
+venalization's
+venalizations
+venalize
+venalizes
+venally
+venatic
+venation
+venational
+vend
+Venda
+vendable
+vendace
+vendaces
+vendee
+vender
+vendetta
+vendibility
+vendible
+vendibly
+vending
+vendition
+vendor
+vendor's
+vendors
+vendue
+veneeal
+veneer
+veneerer
+veneering
+venenate
+venenation
+venenose
+venepuncture
+venerability
+venerable
+venerableness
+venerably
+venerate
+venerated
+venerates
+venerating
+veneration
+venerations
+venerator
+venereal
+venereological
+venereologist
+venereology
+venerology
+venery
+venesection
+Veneti
+Venetia
+venetian
+Venetian
+Venetian's
+Venetians
+Venetic
+Veneto
+Veneto's
+Venezia
+Venezuela
+Venezuelan
+venge
+vengeance
+vengeful
+vengefully
+vengefulness
+venging
+venial
+venially
+venialness
+Venice
+venin
+venipuncture
+venire
+venireman
+venisection
+venison
+Venizelos
+venlo
+Venn
+venography
+venom
+venomization
+venomization's
+venomizations
+venomize
+venomizes
+venomous
+venomously
+venomousness
+Venora
+venose
+venosity
+venous
+venously
+vent
+ventage
+ventail
+vented
+venter
+ventilate
+ventilated
+ventilates
+ventilating
+ventilation
+ventilations
+ventilative
+ventilator
+ventilatory
+venting
+ventless
+ventral
+ventrally
+ventricle
+ventricle's
+ventricles
+ventricose
+ventricular
+ventriculus
+ventriloquial
+ventriloquially
+ventriloquism
+ventriloquist
+ventriloquist's
+ventriloquistic
+ventriloquists
+ventriloquize
+ventriloquized
+ventriloquizes
+ventriloquizing
+ventriloquy
+ventris
+ventrolateral
+ventrolaterally
+ventromedial
+vents
+Ventura
+ventura
+Ventura's
+venture
+ventured
+venturer
+venturers
+ventures
+venturesome
+venturesomely
+venturesomeness
+venturi
+venturing
+venturings
+venturis
+venturous
+venturously
+venturousness
+venue
+venue's
+venues
+venule
+Venus
+Venusberg
+Venusian
+Venusians
+Vera
+veracious
+veraciously
+veraciousness
+veracity
+Veracruz
+veranda
+veranda's
+verandaed
+verandah
+verandahed
+verandas
+veratrine
+veratrum
+verb
+verb's
+verbal
+verbalism
+verbalist
+verbalistic
+verbalization
+verbalization's
+verbalizations
+verbalize
+verbalized
+verbalizer
+verbalizers
+verbalizes
+verbalizing
+verbally
+verbatim
+verbena
+verbenaceous
+verbenas
+verbiage
+verbicide
+verbid
+verbify
+verbigeration
+verbile
+verbose
+verbosely
+verboseness
+verbosity
+verbs
+vercelli
+vercingetorix
+verdancy
+verdant
+verdantly
+Verde
+Verde's
+Verderer
+verderer
+verderor
+Verdi
+Verdi's
+verdict
+verdicts
+verdigris
+verdin
+verdun
+verdure
+verdured
+verdurous
+verdurousness
+verecund
+vereeniging
+verge
+vergeboard
+verger
+verges
+vergil
+Vergil
+verglas
+veridic
+veridical
+veridicality
+veridically
+verier
+veriest
+verifiability
+verifiable
+verifiableness
+verifiably
+verification
+verifications
+verified
+verifier
+verifier's
+verifiers
+verifies
+verify
+verifying
+verily
+verisimilar
+verisimilarly
+verisimilitude
+verisimilitudinous
+verism
+verismo
+verist
+veristic
+veritable
+veritableness
+veritably
+verity
+verjuice
+verkrampte
+Verlag
+verlaine
+verligte
+vermeer
+vermeil
+vermeiled
+vermeiles
+vermeiling
+vermian
+vermicelli
+vermicide
+vermicular
+vermiculate
+vermiculated
+vermiculation
+vermiculite
+vermiform
+vermifuge
+vermilion
+vermilionize
+vermilionizes
+vermillion
+vermin
+vermination
+verminosis
+verminous
+verminously
+vermis
+vermivorous
+Vermont
+vermouth
+Vern
+vern
+Verna
+Verna's
+vernacle
+vernacular
+vernacularism
+vernacularization
+vernacularization's
+vernacularizations
+vernacularize
+vernacularizes
+vernacularly
+vernal
+vernalization
+vernalization's
+vernalizations
+vernalize
+vernalized
+vernalizes
+vernalizing
+vernally
+vernation
+Verne
+vernicle
+vernier
+vernissage
+Vernoleninsk
+Vernon
+verny
+Verona
+Veronal
+Veronese
+Veronica
+verrazano
+Verrett
+verrocchio
+verruca
+verrucae
+verrucose
+versa
+versabraille
+Versailles
+versal
+versant
+versatec
+Versatec
+Versatec's
+versatile
+versatilely
+versatileness
+versatility
+verse
+versed
+verseman
+verser
+verses
+verset
+versicle
+versicolor
+versicolored
+versicular
+versification
+versifier
+versify
+versine
+versing
+version
+versional
+versionize
+versionizes
+versions
+verso
+versos
+verst
+versus
+vert
+vertebra
+vertebrae
+vertebral
+vertebrally
+vertebrate
+vertebrate's
+vertebrates
+vertebration
+vertex
+vertexes
+vertical
+verticality
+vertically
+verticalness
+verticals
+vertices
+verticil
+verticillaster
+verticillate
+verticillte
+vertiginous
+vertiginously
+vertigo
+vertu
+Vertumnus
+verulamium
+vervain
+verve
+vervet
+verwoerd
+very
+vesalius
+vesical
+vesicant
+vesicate
+vesication
+vesicle
+vesicles
+vesicular
+vesicularity
+vesicularly
+vesiculate
+vesiculation
+vespasian
+vesper
+vesperal
+vespers
+vespertilionine
+vespertinal
+vespertine
+vespiary
+vespid
+vespine
+vespucci
+vessel
+vessel's
+vessels
+vest
+vesta
+vestal
+vestally
+vested
+vestee
+vestiary
+vestibular
+vestibule
+vestibuled
+vestige
+vestige's
+vestiges
+vestigial
+vestigially
+vesting
+vestlike
+vestment
+vestmental
+vestments
+vestries
+vestry
+vestryize
+vestryizes
+vestryman
+vests
+vesture
+vestured
+vestures
+vesturing
+vesuvian
+vesuvianite
+Vesuvius
+vesuvius
+vet
+vetch
+vetchling
+veteran
+veteran's
+veteranize
+veteranizes
+veterans
+veterinarian
+veterinarian's
+veterinarians
+veterinary
+vetiver
+veto
+vetoed
+vetoer
+vetoes
+vetoing
+vetted
+vetting
+vex
+vexation
+vexatious
+vexatiously
+vexatiousness
+vexed
+vexedly
+vexes
+vexillary
+vexillologic
+vexillological
+vexillologist
+vexillology
+vexillum
+vexing
+VGA
+VHF
+vi
+vi's
+via
+viability
+viable
+viably
+viaduct
+viaducts
+vial
+vial's
+vialed
+vialing
+vials
+viand
+viands
+viareggio
+viaticum
+viator
+vibes
+vibist
+vibraculum
+vibraharp
+vibraharpist
+vibrance
+vibrancy
+vibrant
+vibrantly
+vibraphone
+vibraphonist
+vibrate
+vibrated
+vibrates
+vibratile
+vibratility
+vibrating
+vibration
+vibrational
+vibrationless
+vibrations
+vibrato
+vibrator
+vibratory
+vibrio
+vibrion
+vibrionic
+vibriosis
+vibrissa
+vibrissae
+vibronic
+viburnum
+Vic
+vic
+Vic's
+vicar
+vicarage
+vicarate
+vicarial
+vicariate
+vicarious
+vicariously
+vicariousness
+vicarship
+vice
+vice's
+vicegerency
+vicegerent
+vicenary
+vicennial
+vicenza
+viceregal
+viceregally
+vicereine
+viceroy
+viceroyalty
+viceroyship
+vices
+Vichy
+Vichy's
+vichyssoise
+vicinage
+vicinal
+vicing
+vicinities
+vicinity
+vicious
+viciously
+viciousness
+vicissitude
+vicissitude's
+vicissitudes
+vicissitudinous
+Vickers
+vickers
+Vickie
+Vickie's
+Vicksburg
+Vicksburg's
+Vicky
+Vicky's
+vico
+vicomte
+victim
+victim's
+victimizable
+victimizable's
+victimizables
+victimization
+victimization's
+victimizations
+victimize
+victimized
+victimizer
+victimizers
+victimizes
+victimizing
+victims
+victor
+victor's
+Victoria
+Victoria's
+Victorian
+victoriana
+Victorianize
+Victorianizes
+Victorians
+victories
+victorious
+victoriously
+victoriousness
+victors
+victory
+victory's
+victress
+Victrola
+Victrola's
+Victrolas
+victual
+victualage
+victualed
+victualer
+victualers
+victualess
+victualing
+victuals
+vicuna
+Vida
+Vida's
+Vidal
+vidal
+Vidal's
+vide
+videlicet
+video
+videophone
+videos
+videotape
+videotape's
+videotaped
+videotapes
+videotaping
+videotex
+vidette
+vidhan
+vidicon
+viduity
+vie
+vied
+Vienna
+Vienna's
+vienne
+Viennese
+Viennese's
+Vientiane
+Vientiane's
+vier
+Vierne
+vies
+Viet
+Vietcong
+Vietminh
+Vietnam
+Vietnam's
+Vietnamese
+Vietnamese's
+Vietnamization
+Vietnamize
+Vietnamized
+Vietnamizes
+Vietnamizing
+view
+viewable
+viewed
+viewer
+viewers
+viewfinder
+viewfinder's
+viewfinders
+viewgraph
+viewgraph's
+viewgraphes
+viewing
+viewings
+viewless
+viewlessly
+viewpoint
+viewpoint's
+viewpoints
+viewport
+viewport's
+viewports
+views
+viewscan
+viewy
+vigesimal
+vigil
+vigilance
+vigilant
+vigilante
+vigilante's
+vigilantes
+vigilantism
+vigilantly
+vigintillion
+vignette
+vignette's
+vignetted
+vignetter
+vignettes
+vignetting
+vignettist
+vignola
+vigny
+vigo
+vigor
+vigor's
+vigorish
+vigorist
+vigorist's
+vigorists
+vigorless
+vigoroso
+vigorous
+vigorously
+vigorousness
+vigors
+Vihuela
+vii
+viii
+Viipuri
+Vijayawada
+Viking
+Vikings
+Vikram
+Vilayet
+vile
+vilely
+vileness
+viler
+vilest
+vilification
+vilifications
+vilified
+vilifier
+vilifies
+vilify
+vilifying
+vilipend
+villa
+villa's
+Villach
+villadom
+village
+village's
+villager
+villagers
+villagery
+villages
+Villahermosa
+villain
+villain's
+Villainage
+villainess
+villainous
+villainously
+villainousness
+villains
+villainy
+villanella
+villanelle
+Villanovan
+Villars
+villas
+villatic
+villein
+villenage
+Villeneuve
+Villeurbanne
+villi
+Villiers
+villiform
+Villon
+villosity
+villous
+villus
+Vilnius
+vim
+vimen
+Viminal
+vimineous
+vina
+vinaceous
+vinaigrette
+vinal
+vinasse
+vinblastine
+vinca
+Vince
+Vincennes
+Vincent
+Vincent's
+Vinci
+Vinci's
+vincible
+vincristine
+vinculum
+Vindhya
+vindicable
+vindicate
+vindicated
+vindicates
+vindicating
+vindication
+vindicative
+vindicator
+vindicators
+vindicatory
+vindictive
+vindictively
+vindictiveness
+vine
+vine's
+vineal
+vinedresser
+vinedressers
+vinegar
+vinegarette
+vinegarish
+vinegarroon
+vinegars
+vinegary
+Vineland
+vinery
+vines
+vineyard
+vineyard's
+vineyardist
+vineyards
+vinic
+viniculture
+vinier
+viniferous
+vinification
+vinificator
+vining
+Vinland
+vinnitsa
+vino
+vinosity
+vinous
+vinously
+Vinson
+vintage
+vintager
+vintages
+vintner
+viny
+vinyl
+vinylic
+vinylidene
+viol
+viola
+violability
+violable
+violableness
+violably
+violaceous
+violaceously
+violate
+violated
+violates
+violating
+violation
+violations
+violative
+violator
+violator's
+violators
+violence
+violent
+violently
+violet
+violet's
+violets
+violin
+violin's
+violinist
+violinist's
+violinists
+violins
+violist
+violoncello
+violone
+viomycin
+viosterol
+viper
+viper's
+viperine
+viperish
+viperous
+viperously
+vipers
+viraginous
+virago
+viral
+virally
+Virchow
+virelay
+viremia
+viremic
+viren
+vireo
+vires
+virescence
+virescent
+virga
+virgate
+Virgil
+Virgil's
+virgin
+virgin's
+virginal
+virginally
+Virginia
+Virginia's
+Virginian
+Virginians
+virginity
+virginium
+virgins
+Virgo
+Virgo's
+Virgos
+virgulate
+virgule
+virial
+viricidal
+viricide
+virid
+viridescent
+viridian
+viridity
+virile
+virilism
+virility
+virion
+virologic
+virological
+virologically
+virologist
+virology
+viroses
+virosis
+virtu
+virtual
+virtuality
+virtualize
+virtualizes
+virtually
+virtue
+virtue's
+virtueless
+virtues
+virtuosa
+virtuosi
+virtuosic
+virtuosity
+virtuoso
+virtuoso's
+virtuosos
+virtuous
+virtuously
+virtuousness
+virucidal
+virucide
+virulence
+virulency
+virulent
+virulently
+viruliferous
+virus
+virus's
+viruses
+virustatic
+vis
+visa
+visaed
+visage
+visaged
+visaing
+Visakhapatnam
+visas
+Visayan
+Visby
+viscacha
+viscera
+visceral
+viscerally
+viscerogenic
+visceromotor
+viscid
+viscidity
+viscidly
+viscoelastic
+viscoelasticity
+viscoid
+viscometer
+viscometer's
+viscometers
+viscometric
+viscometry
+Visconti
+viscose
+viscosimeter
+viscosimeter's
+viscosimeters
+viscosimetric
+viscosities
+viscosity
+viscount
+viscount's
+viscountcy
+viscountess
+viscounts
+viscounty
+viscous
+viscously
+viscousness
+viscus
+vise
+vised
+viselike
+Viseu
+Vishakhapatnam
+Vishinsky
+Vishnu
+visibilities
+visibility
+visible
+visibleness
+visibly
+Visigoth
+Visigoths
+vising
+vision
+vision's
+visional
+visionally
+visionariness
+visionary
+visioned
+visioning
+visionize
+visionizes
+visionless
+visions
+visit
+visitable
+visitant
+visitation
+visitation's
+visitational
+visitations
+visitatorial
+visited
+visiting
+visitor
+visitor's
+visitors
+visits
+visive
+visor
+visor's
+visored
+visorless
+visors
+vista
+vista's
+vistaed
+vistas
+vistula
+visual
+visualization
+visualization's
+visualizations
+visualize
+visualized
+visualizer
+visualizers
+visualizes
+visualizing
+visually
+visuals
+vita
+vitaceous
+vitae
+vital
+vitalism
+vitalist
+vitalistic
+vitality
+vitalization
+vitalization's
+vitalizations
+vitalize
+vitalized
+vitalizer
+vitalizers
+vitalizes
+vitalizing
+vitalizing's
+vitalizingly
+vitalizings
+vitally
+vitals
+vitamer
+vitameric
+vitamin
+vitamin's
+vitaminization
+vitaminize
+vitaminizes
+vitamins
+vitaphone
+vitascope
+Vitebsk
+vitellin
+vitelline
+vitellogenesis
+vitellus
+vitiate
+vitiated
+vitiates
+vitiating
+vitiation
+vitiator
+viticultural
+viticulture
+viticulturist
+vitiligo
+vitiosity
+vitite
+Vito
+Vito's
+vitoria
+vitrain
+vitreous
+vitreously
+vitreousness
+vitrescence
+vitrescent
+vitric
+vitrifiable
+vitrification
+vitriform
+vitrify
+vitrine
+vitriol
+vitriolic
+vitriolizable
+vitriolizable's
+vitriolizables
+vitriolization
+vitriolization's
+vitriolizations
+vitriolize
+vitriolizer
+vitriolizers
+vitriolizes
+vitro
+vitruvius
+vitta
+vittae
+vittate
+vittle
+vittles
+vituline
+vituperate
+vituperation
+vituperative
+vituperatively
+vituperator
+vituperatory
+Vitus
+vitus
+viva
+vivace
+vivacious
+vivaciously
+vivaciousness
+vivacity
+Vivaldi
+vivarium
+vive
+viverrid
+viverrine
+vivers
+Vivian
+vivid
+vividly
+vividness
+vivific
+vivification
+vivified
+vivifier
+vivify
+viviparity
+viviparous
+viviparously
+viviparousness
+vivisect
+vivisection
+vivisectional
+vivisectionally
+vivisectionist
+vivisector
+vivo
+vixen
+vixenish
+vixenishly
+vixenishness
+viyella
+viz
+Vizagapatam
+vizard
+Vizcacha
+vizier
+vizierate
+vizierial
+viziership
+vizor
+Vizsla
+Vlaardingen
+Vlach
+Vladikavkaz
+Vladimir
+Vladivostok
+Vlaminck
+Vlei
+VLF
+Vlissingen
+VLSI
+Vltava
+VMS
+vms
+VMS's
+vocable
+vocabular
+vocabularian
+vocabularianism
+vocabularies
+vocabulary
+vocal
+vocalic
+vocalically
+vocalism
+vocalist
+vocalists
+vocality
+vocalization
+vocalization's
+vocalizations
+vocalize
+vocalized
+vocalizer
+vocalizers
+vocalizes
+vocalizing
+vocally
+vocals
+vocate
+vocation
+vocation's
+vocational
+vocationalism
+vocationalist
+vocationalization
+vocationalization's
+vocationalizations
+vocationalize
+vocationalizes
+vocationally
+vocations
+vocative
+vocatively
+vociferant
+vociferate
+vociferation
+vociferator
+vociferous
+vociferously
+vociferousness
+vocoded
+vocoder
+vodka
+vodka's
+Voetsek
+Voetstoots
+Vogel
+Vogelweide
+vogue
+voguish
+voguishness
+Vogul
+voice
+voiceband
+voiced
+voicedness
+voiceful
+voicefulness
+voiceless
+voicelessly
+voicelessness
+voiceprint
+voicer
+voicers
+voices
+voicing
+void
+voidable
+voidableness
+voidage
+voidance
+voided
+voider
+voiding
+voidness
+voids
+voila
+voile
+voiotia
+voir
+voix
+vojvodina
+Vol
+Volans
+volant
+volante
+Volapuk
+volar
+volatile
+volatileness
+volatiles
+volatilities
+volatility
+volatilizable
+volatilizable's
+volatilizables
+volatilization
+volatilization's
+volatilizations
+volatilize
+volatilized
+volatilizer
+volatilizers
+volatilizes
+volatilizing
+volcanic
+volcanically
+volcanicity
+volcanism
+volcano
+volcano's
+volcanoes
+volcanologic
+volcanological
+volcanologist
+volcanology
+volcanos
+vole
+voles
+Volga
+Volgograd
+volitant
+volition
+volitional
+volitionality
+volitionally
+volitive
+volkslied
+volkslieder
+Volkswagen
+Volkswagens
+volley
+volleyball
+volleyball's
+volleyballs
+volleyed
+volleyer
+volleying
+volleys
+vologda
+volost
+volplane
+volplaned
+volplaning
+Volsci
+Volscian
+Volstead
+volsung
+volsunga
+volt
+Volta
+voltage
+voltages
+voltaic
+Voltaire
+voltaism
+voltameter
+voltameter's
+voltameters
+voltametric
+voltammeter
+Volterra
+Volterra's
+voltize
+voltizes
+voltmeter
+voltmeter's
+voltmeters
+volts
+volturno
+volubility
+voluble
+volubleness
+volubly
+volume
+volume's
+volumed
+volumes
+volumeter
+volumeter's
+volumeters
+volumetric
+volumetrically
+voluming
+voluminosity
+voluminous
+voluminously
+voluminousness
+voluntarily
+voluntariness
+voluntarism
+voluntarist
+voluntaristic
+voluntary
+voluntaryism
+voluntaryist
+volunteer
+volunteered
+volunteering
+volunteerism
+volunteers
+voluptuary
+voluptuous
+voluptuously
+volute
+voluted
+volutin
+volution
+volva
+volvement
+Volvo
+volvox
+volvulus
+vomer
+vomerine
+vomit
+vomited
+vomiter
+vomiting
+vomitory
+vomits
+vomiturition
+vomitus
+Von
+von
+voodoo
+voodooism
+voodooist
+voodooistic
+voodoos
+voortrekker
+voracious
+voraciously
+voraciousness
+voracity
+Vorarlberg
+vored
+Voronezh
+Voroshilov
+Voroshilovgrad
+Voroshilovsk
+vorster
+vortex
+vortexes
+vortical
+vortically
+vorticella
+vortices
+vorticism
+vorticist
+vorticity
+vorticose
+vortiginous
+Vortumnus
+vosges
+Voss
+vostok
+votaress
+votarist
+votary
+vote
+voted
+voteless
+voter
+voters
+votes
+voting
+votive
+votively
+votiveness
+votress
+Votyak
+vouch
+vouchee
+voucher
+vouchers
+vouches
+vouching
+vouchsafe
+vouchsafed
+vouchsafement
+vouchsafes
+vouchsafing
+vouge
+Vought
+Vought's
+voussoir
+Vouvray
+vow
+vowed
+vowel
+vowel's
+vowelization
+vowelization's
+vowelizations
+vowelize
+vowelized
+vowelizes
+vowelizing
+vowels
+vower
+vowing
+vows
+vox
+voyage
+voyaged
+voyager
+voyagers
+voyages
+voyageur
+voyageurs
+voyaging
+voyagings
+voyeur
+voyeurism
+voyeuristic
+voyeuristically
+voyeurs
+Vreeland
+Vreeland's
+Vries
+vroom
+vs
+VT
+VTOL
+Vuelta
+vuillard
+Vulcan
+vulcanian
+vulcanicity
+Vulcanism
+Vulcanite
+vulcanizable
+vulcanizable's
+vulcanizables
+vulcanizate
+vulcanization
+vulcanization's
+vulcanizations
+vulcanize
+vulcanized
+vulcanizer
+vulcanizers
+vulcanizes
+vulcanizing
+vulcanologist
+vulcanology
+vulgar
+vulgarian
+vulgaris
+vulgarism
+vulgarity
+vulgarization
+vulgarization's
+vulgarizations
+vulgarize
+vulgarized
+vulgarizer
+vulgarizers
+vulgarizes
+vulgarizing
+vulgarly
+vulgate
+vulgus
+vulnerabilities
+vulnerability
+vulnerable
+vulnerableness
+vulnerably
+vulnerary
+Vulpecula
+vulpine
+vulterine
+vulture
+vulture's
+vulturelike
+vultures
+vulturine
+vulturous
+vulva
+vulvae
+vulval
+vulvar
+vulviform
+vulvitis
+vulvovaginitis
+Vyatka
+vyborg
+vying
+Vyshinsky
+Vyvyan
+WA
+WAAC
+WAAF
+Waals
+Waart
+Wabash
+wabble
+wabbled
+wabbles
+wabbling
+WAC
+wace
+wackier
+wackily
+wackiness
+wacko
+wacko's
+wackos
+wacky
+Waco
+wad
+wadable
+wadai
+wadded
+Waddenzee
+wadder
+waddie
+waddied
+waddies
+wadding
+Waddington
+waddle
+waddled
+waddler
+waddles
+waddling
+waddy
+waddying
+wade
+Wade's
+wadeable
+waded
+wader
+waders
+wades
+wadi
+wading
+wadmal
+wads
+wadset
+Wadsworth
+Wadsworth's
+wafer
+wafer's
+wafered
+wafering
+wafers
+waffle
+waffle's
+waffled
+waffles
+waffling
+waft
+waftage
+wafter
+wafture
+wag
+wage
+waged
+wageless
+wager
+wagered
+wagerer
+wagering
+wagers
+wages
+wageworker
+wagged
+wagger
+waggery
+wagging
+waggish
+waggishly
+waggishness
+waggle
+waggled
+waggles
+waggling
+waggly
+waging
+Wagner
+Wagnerian
+Wagnerize
+Wagnerizes
+wagon
+wagon's
+wagoneer
+wagoneer's
+wagoneers
+wagoner
+wagoner's
+wagoners
+wagonette
+wagonette's
+wagonettes
+wagonload
+wagonload's
+wagonloads
+wagons
+wagram
+wags
+wagtail
+wah
+Wahhabi
+wahine
+Wahl
+Wahl's
+wahoo
+wahoos
+waif
+Waikato
+Waikiki
+wail
+wailed
+wailer
+wailful
+wailfully
+wailing
+wails
+wain
+wained
+wainscot
+wainscoted
+wainscoting
+wainscots
+wainscotting
+Wainwright
+waist
+waist's
+waistband
+waistcloth
+waistcoat
+waistcoat's
+waistcoated
+waistcoats
+waisted
+waister
+waistline
+waists
+wait
+Waite
+Waite's
+waited
+waiter
+waiter's
+waiters
+waiting
+waitress
+waitress's
+waitresses
+waits
+waive
+waived
+waiver
+waiverable
+waivers
+waives
+waiving
+Wajda
+Wakashan
+Wakayama
+wake
+waked
+Wakefield
+wakeful
+wakefully
+wakefulness
+wakeless
+waken
+wakened
+wakener
+wakening
+waker
+Wakerife
+wakerobin
+wakes
+wakeup
+waking
+Waksman
+Walach
+Walachia
+Walbridge
+Walbrzych
+Walcheren
+Walcott
+Waldemar
+Walden
+Waldenburg
+Waldensian
+Waldgrave
+Waldheim
+Waldo
+Waldorf
+Waldron
+Waldron's
+wale
+waler
+wales
+Waley
+walfish
+Walford
+Walgreen
+walhalla
+waling
+walk
+walkable
+walkabout
+walkaway
+walked
+walker
+walkers
+walkie
+walking
+walkingstick
+walkley
+walkout
+walkover
+walks
+walkway
+walkway's
+walkways
+wall
+wall's
+wallaby
+Wallace
+Wallachia
+wallah
+wallaroo
+wallasey
+wallboard
+walled
+Wallenstein
+wallenstein
+waller
+wallet
+wallet's
+wallets
+walleye
+walleyed
+wallflower
+wallies
+walling
+Wallis
+Walloon
+wallop
+walloped
+walloper
+walloping
+wallops
+wallow
+wallowed
+wallower
+wallowing
+wallows
+wallpaper
+wallpapers
+walls
+Wallsend
+wally
+Wally's
+walnut
+walnut's
+walnuts
+Walpole
+Walpurgis
+walrus
+walrus's
+walruses
+Walsall
+Walsh
+Walsingham
+Walt
+Walter
+Walters
+Waltham
+Waltham's
+Walther
+Walton
+waltz
+waltzed
+waltzer
+waltzes
+waltzing
+Walvis
+Walworth
+wamble
+wambled
+wambling
+wame
+wampum
+wan
+Wand
+wand
+wander
+wandered
+wanderer
+wanderers
+wandering
+wanderings
+wanderlust
+wanderoo
+wanders
+wandoo
+Wandsworth
+wane
+waned
+wanes
+waney
+Wang
+wanganui
+wangle
+wangled
+wangler
+wangles
+wangling
+wanhsien
+wanier
+waning
+wank
+wankel
+wankie
+wanly
+wanna
+wanner
+wanness
+wannest
+wanning
+Wansee
+wansee
+wansley
+Wansley
+want
+wanted
+wanter
+wanting
+wanton
+wantoner
+wantonly
+wantonness
+wants
+wany
+Wapentake
+wapiti
+wapitis
+Wappenshaw
+Wappinger
+Wappinger's
+war
+war's
+Waragi
+Warangal
+waratah
+Warbeck
+warble
+warbled
+warbler
+warbles
+warbling
+warbonnet
+Warburton
+ward
+Ward
+warded
+warden
+wardens
+wardenship
+warder
+wardership
+wardian
+warding
+wardle
+wardmote
+wardress
+wardrobe
+wardrobe's
+wardrobes
+wardroom
+wardrooms
+wards
+wardship
+ware
+warehouse
+warehoused
+warehouseman
+warehousemen
+warehouser
+warehouses
+warehousing
+wareroom
+wares
+warfare
+Warfarin
+Warfield
+Warfield's
+warhead
+warheads
+Warhol
+warhorse
+warhorses
+warier
+wariest
+warily
+wariness
+waring
+Warison
+warless
+Warley
+warlike
+warlock
+warlord
+warlordism
+warlords
+warm
+warmed
+warmer
+warmers
+warmest
+warmhearted
+warmheartedly
+warmheartedness
+warming
+warmish
+warmly
+warmness
+warmonger
+warmongering
+warmongers
+warms
+warmth
+warmup
+warn
+warned
+warner
+warning
+warningly
+warnings
+Warnock
+Warnock's
+warns
+warp
+warp's
+warpage
+warpath
+warped
+warper
+warping
+warplane
+warplane's
+warplanes
+warps
+warrant
+warrantable
+warrantableness
+warrantably
+warranted
+warrantee
+warrantees
+warranter
+warranties
+warranting
+warrantless
+warrantor
+warrantors
+warrants
+warranty
+warranty's
+warred
+warren
+Warren
+warrener
+warreners
+warrens
+warrigal
+warring
+Warrington
+warrior
+warrior's
+warriors
+wars
+Warsaw
+Warsaw's
+warship
+warship's
+warships
+warsle
+wart
+wart's
+warta
+Wartburg
+warted
+wartime
+wartimes
+warts
+warty
+Warwick
+Warwick's
+Warwickshire
+wary
+was
+Wasatch
+wash
+washability
+washable
+washaway
+washbasin
+washboard
+washbowl
+Washburn
+washcloth
+washcloths
+washday
+washdays
+washed
+washer
+washerman
+washers
+washerwoman
+washerwomen
+washery
+washes
+washhouse
+washier
+washin
+washing
+washings
+Washington
+Washington's
+washoe
+Washoe
+washout
+washrag
+washroom
+washrooms
+washstand
+washstands
+washtub
+washtubs
+washwoman
+washwomen
+washy
+wasn't
+wasp
+wasp's
+waspish
+waspishly
+waspishness
+wasplike
+wasps
+wassail
+wassailer
+Wasserman
+wassermann
+wast
+wastage
+wastages
+waste
+wastebasket
+wastebaskets
+wasted
+wasteful
+wastefully
+wastefulness
+wasteland
+wastelands
+wastepaper
+waster
+wastes
+wastewater
+wasteweir
+wasting
+wastingly
+wastrel
+wastrels
+Watanabe
+Watanabe's
+watap
+watch
+watchband
+watchcase
+watchdog
+watched
+watcher
+watchers
+watches
+watcheye
+watchful
+watchfully
+watchfulness
+watching
+watchings
+watchmake
+watchmaker
+watchmakers
+watchmaking
+watchman
+watchmen
+watchpoints
+watchstrap
+watchtower
+watchword
+watchword's
+watchwords
+watchworks
+water
+waterage
+waterborne
+waterbrain
+waterbuck
+Waterbury
+watercolor
+watercolor's
+watercolored
+watercoloring
+watercolorist
+watercolorists
+watercolors
+watercourse
+watercraft
+watercress
+watered
+waterer
+waterfall
+waterfall's
+waterfalls
+waterflood
+Waterford
+waterfowl
+waterfowl's
+waterfowler
+waterfront
+Watergate
+waterhole
+waterhole's
+waterholes
+Waterhouse
+waterily
+wateriness
+watering
+waterings
+waterish
+waterishness
+waterless
+waterlessly
+waterlessness
+waterline
+waterlines
+waterlog
+waterlogged
+waterloo
+waterman
+watermanship
+watermark
+watermelon
+waterpower
+waterproof
+waterproofed
+waterproofer
+waterproofing
+waterproofness
+waterproofs
+waters
+waterscape
+watershed
+watersheds
+waterside
+watersider
+waterspout
+watertight
+watertightness
+watertower
+Watertown
+waterway
+waterway's
+waterways
+waterweed
+waterwheel
+waterworks
+waterworn
+watery
+Watford
+Watkins
+Watling
+Watson
+Watson's
+watt
+wattage
+wattages
+Watteau
+Wattenberg
+Wattenscheid
+Watterson
+wattle
+wattlebird
+wattled
+wattles
+wattling
+wattmeter
+wattmeter's
+wattmeters
+Watts
+watts
+Watusi
+Waugh
+waught
+Waukesha
+waukesha
+waul
+Waunona
+waunona
+Waupaca
+waupaca
+Waupun
+waupun
+Wausau
+wausau
+wauwatosa
+Wauwatosa
+wave
+waveband
+wavebands
+waved
+waveform
+waveform's
+waveforms
+wavefront
+wavefront's
+wavefronts
+wavefunction
+wavefunctions
+waveguide
+waveguides
+Waveland
+waveland
+wavelength
+wavelengths
+waveless
+wavelessly
+wavelet
+wavelets
+wavelike
+wavellite
+wavemeter
+wavenumber
+waveoff
+waver
+wavered
+waverer
+wavering
+waveringly
+wavers
+wavery
+waves
+wavier
+wavily
+waviness
+waving
+wavy
+waw
+wawa
+wawl
+wax
+waxberry
+waxbill
+waxed
+waxen
+waxer
+waxers
+waxes
+waxier
+waxiness
+waxing
+waxlike
+waxplant
+waxwing
+waxwing's
+waxwings
+waxwork
+waxworks
+waxy
+way
+way's
+waybill
+wayfarer
+wayfaring
+waygoing
+waylaid
+Wayland
+waylay
+wayless
+Wayne
+Waynesboro
+ways
+wayside
+waysides
+wayward
+waywardly
+waywardness
+wayworn
+wayzgoose
+waziristan
+we
+we'd
+we'll
+we're
+we've
+weak
+weaken
+weakened
+weakener
+weakening
+weakens
+weaker
+weakest
+weakfish
+weakhearted
+weakish
+weakliness
+weakling
+weakly
+weakness
+weakness's
+weaknesses
+weal
+weald
+wealth
+wealthier
+wealthiest
+wealthily
+wealthiness
+wealths
+wealthy
+wean
+weaned
+weaner
+weaning
+weanling
+weapon
+weapon's
+weaponed
+weaponeer
+weaponless
+weaponry
+weapons
+wear
+wearability
+wearable
+wearer
+wearied
+wearier
+wearies
+weariest
+weariful
+wearifully
+wearifulness
+weariless
+wearilessly
+wearily
+weariness
+wearing
+wearingly
+wearisome
+wearisomely
+wearisomeness
+wearproof
+wears
+weary
+wearying
+weasand
+weasel
+weasel's
+weaseled
+weaseling
+weasels
+weather
+weatherability
+weatherbeaten
+weatherboard
+weatherboarding
+weathercock
+weathercock's
+weathercocks
+weathered
+weatherer
+Weatherford
+weatherglass
+weathering
+weatherly
+weatherman
+weatherproof
+weatherproofness
+weathers
+weatherstrip
+weatherstripping
+weatherworn
+weathery
+weave
+weaver
+weaverbird
+weavers
+weaves
+weaving
+web
+web's
+Webb
+Webb's
+webbed
+Webber
+webber
+webbing
+webbs
+webby
+weber
+Webern
+webfoot
+weblike
+webs
+Webster
+Webster's
+Websterville
+webwheel
+wed
+wedded
+weddell
+wedder
+wedding
+wedding's
+weddings
+wedekind
+wedeling
+wedge
+wedged
+wedges
+wedging
+Wedgwood
+wedgy
+wedlock
+Wednesday
+Wednesday's
+Wednesdays
+weds
+wee
+weed
+weeded
+weeder
+weediness
+weeding
+weedkiller
+weedless
+weeds
+weedy
+week
+week's
+weekday
+weekday's
+weekdays
+weekend
+weekend's
+weekender
+weekends
+weeklies
+weekly
+weeknight
+weeknights
+weeks
+weelkes
+ween
+weeny
+weep
+weeped
+weeper
+weepers
+weeping
+weeps
+weepy
+weet
+weever
+weevil
+weeviled
+weevilly
+weevily
+weft
+wefts
+Wehr
+Wehr's
+Wei
+Wei's
+Weibull
+Weibull's
+weider
+Weider
+weidman
+Weidman
+Weierstrass
+Weigela
+weigh
+weighable
+weighbridge
+weighbridges
+weighed
+weigher
+weighing
+weighings
+weighs
+weight
+weighted
+weighter
+weightier
+weightily
+weightiness
+weighting
+weightings
+weightless
+weightlessly
+weightlessness
+weightlifter
+weightlifting
+weights
+weighty
+weihai
+Weikert
+Weikl
+Weill
+Weimar
+weimaraner
+Weinberg
+weiner
+Weiner
+Weinstein
+weir
+weird
+weirdie
+weirdies
+weirdly
+weirdness
+weirdo
+weirdos
+weirs
+Weisenheimer
+Weismannism
+Weiss
+Weisshorn
+Weissman
+Weissmuller
+Weizmann
+weka
+Welch
+Welcher
+Welches
+welcome
+welcomed
+welcomely
+welcomeness
+welcomer
+welcomes
+welcoming
+weld
+weldable
+welded
+welder
+welders
+welding
+weldings
+weldment
+Weldon
+weldor
+welds
+weldwood
+Weldwood
+welfare
+welfarism
+welfarist
+welkin
+welkom
+well
+welland
+wellaway
+wellbeing
+wellborn
+welled
+Weller
+Welles
+Wellesley
+wellesz
+wellhead
+wellies
+welling
+Wellingborough
+wellington
+Wellington
+Wellingtonia
+Wellman
+wellman
+wellness
+wells
+Wellsville
+wellwisher
+wellwisher's
+wellwishers
+Welmers
+welmers
+Welsbach
+welsh
+welsher
+Welshman
+welt
+welter
+weltered
+weltering
+welterweight
+Welton
+welts
+weltschmerz
+Welwitschia
+welwyn
+Wembley
+wen
+Wenceslaus
+wench
+wench's
+wencher
+wenches
+wend
+Wendell
+Wendish
+Wendy
+Wenkel
+Wensleydale
+went
+wentletrap
+Wentworth
+wept
+were
+weren't
+werewolf
+werewolf's
+werewolves
+Werner
+wernerite
+wersh
+wert
+Werther
+Werther's
+weser
+wesker
+weskit
+Wesley
+Wesleyan
+wessex
+Wesson
+west
+westbound
+Westbrook
+Westchester
+wester
+westered
+westering
+westerlies
+westerly
+western
+westerner
+westerners
+Westernism
+westernization
+westernization's
+westernizations
+westernize
+westernized
+westernizes
+westernizing
+westernmost
+Westfalen
+Westfield
+Westhampton
+westing
+Westinghouse
+Westmeath
+Westminster
+Westmore
+Westmorland
+westmost
+Weston
+Westphalia
+Westport
+westward
+westwards
+Westwood
+wet
+wetback
+wetland
+wetlands
+wetly
+wetness
+wets
+wettable
+wetted
+wetter
+Wetterhorn
+wettest
+wetting
+wettish
+Wexford
+Weyerhauser
+Weymouth
+WFF
+wff
+whack
+whacked
+whacker
+whacking
+whacko
+whacks
+whacky
+whale
+whaleback
+whaleboat
+whalebone
+whalebone's
+whalebones
+Whalen
+Whalen's
+whaler
+whales
+whaling
+wham
+whammies
+whamming
+whammy
+whang
+whangarei
+whangee
+whap
+whare
+wharf
+wharfage
+wharfie
+wharfinger
+wharfmaster
+wharfs
+Wharton
+wharve
+wharves
+what
+what'd
+what're
+what's
+whatchamacallit
+whatchamacallit's
+whatchamacallits
+whatever
+Whatley
+Whatley's
+whatnot
+whats
+whatsit
+whatsoever
+whaup
+wheal
+wheat
+wheatear
+wheaten
+Wheatland
+wheatland
+Wheaton
+wheaton
+Wheatstone
+wheatworm
+whee
+wheedle
+wheedled
+wheedles
+wheedling
+wheel
+wheelbarrow
+wheelbarrow's
+wheelbarrows
+wheelbase
+wheelchair
+wheelchair's
+wheeled
+wheeler
+wheelers
+wheelhorse
+wheelhouse
+wheelie
+wheeling
+wheelings
+wheelless
+wheelman
+wheelock
+Wheelock
+wheels
+wheelsman
+wheelwork
+wheelwright
+wheen
+wheeze
+wheezed
+wheezes
+wheezier
+wheezily
+wheeziness
+wheezing
+wheezy
+Whelan
+whelk
+Wheller
+whelm
+whelp
+when
+whenas
+whence
+whencesoever
+whenever
+whens
+whensoever
+where
+where'd
+where're
+where's
+whereabout
+whereabouts
+whereafter
+whereas
+whereat
+whereby
+wherefore
+wherefores
+wherefrom
+wherein
+whereinto
+whereness
+whereof
+whereon
+wheres
+wheresoever
+wheresomever
+wherethrough
+whereto
+whereunto
+whereupon
+wherever
+wherewith
+wherewithal
+wherries
+wherrit
+wherry
+whet
+whether
+whets
+whetstone
+whetted
+whetter
+whetting
+whew
+whey
+wheyface
+which
+whichever
+whichsoever
+whicker
+whickered
+whickering
+whidah
+whidding
+whiff
+whiffle
+whiffled
+whiffler
+whiffles
+whiffletree
+whiffling
+whig
+whigmaleerie
+whigs
+Whikehart
+while
+whiled
+whiles
+whiling
+whilom
+whilst
+whim
+whim's
+whimbrel
+whimper
+whimpered
+whimpering
+whimpers
+whims
+whimsey
+whimseys
+whimsical
+whimsicality
+whimsically
+whimsicalness
+whimsied
+whimsies
+whimsy
+whimsy's
+whin
+whinchat
+whine
+whined
+whiner
+whines
+whiney
+whinge
+whining
+whiningly
+whinnied
+whinnies
+whinny
+whinnying
+whinstone
+whip
+whip's
+whipcord
+whiplash
+whiplashes
+whiplike
+Whippany
+whipped
+whipper
+whipper's
+whippers
+whippersnapper
+whippet
+whippier
+whipping
+whipping's
+whippings
+Whipple
+whippletree
+whippoorwill
+whippy
+whips
+whipsaw
+whipsawed
+whipstall
+whipstitch
+whipstock
+whipworm
+whir
+whirl
+whirlabout
+whirled
+whirler
+whirlies
+whirligig
+whirling
+whirlpool
+whirlpool's
+whirlpools
+whirls
+whirlwind
+whirly
+whirlybird
+whirr
+whirried
+whirring
+whirry
+whirrying
+whish
+whisht
+whisk
+whisked
+whisker
+whiskered
+whiskers
+whiskery
+whiskey
+whiskey's
+whiskeys
+whiskies
+whisking
+whisks
+whisper
+whispered
+whisperer
+whispering
+whisperingly
+whisperings
+whispers
+whispery
+whist
+whistle
+whistleable
+whistled
+whistler
+whistlers
+whistles
+whistling
+whit
+Whitaker
+Whitaker's
+whitby
+Whitcomb
+White
+white
+whitebait
+whitebeam
+whitebeard
+Whiteboy
+whitecap
+Whitechapel
+whited
+whitedamp
+whiteface
+Whitefield
+whitefish
+whitefly
+Whitehall
+whitehead
+Whitehorse
+Whitehorse's
+whiteleaf
+Whiteleaf
+Whiteley
+whiteley
+whitely
+whiten
+whitened
+whitener
+whiteners
+whiteness
+whitening
+whitens
+whiteout
+whiter
+whites
+whitesmith
+whitespace
+whitest
+whitetail
+whitethorn
+whitethroat
+whitewall
+whitewash
+whitewashed
+whitewasher
+whitewashing
+Whitewater
+whitewater
+whitewing
+whitewood
+whitey
+Whitfield
+whither
+whithersoever
+whitherward
+whiting
+whitish
+Whitlam
+Whitley
+Whitlock
+Whitlow
+Whitman
+Whitmanize
+Whitmanizes
+Whitney
+Whitsun
+Whitsuntide
+Whittaker
+Whittier
+Whittington
+whittle
+whittled
+whittler
+whittles
+whittling
+whittlings
+whity
+whiz
+whizbang
+whizz
+whizzbang
+whizzed
+whizzer
+whizzes
+whizzing
+who
+who'd
+who'll
+who's
+who've
+whoa
+whodunit
+whodunit's
+whodunits
+whoever
+whole
+wholefood
+wholehearted
+wholeheartedly
+wholemeal
+wholeness
+wholes
+wholesale
+wholesaled
+wholesaler
+wholesalers
+wholesales
+wholesaling
+wholesome
+wholesomely
+wholesomeness
+wholism
+wholly
+whom
+whomever
+whomp
+whomsoever
+whoop
+whooped
+whoopee
+whooper
+whooping
+whoopla
+whoops
+whoosh
+whop
+whopper
+whoppers
+whopping
+whore
+whore's
+whoredom
+whorehouse
+whoremaster
+whoremonger
+whores
+whoreson
+whoring
+whorish
+whorl
+whorl's
+whorled
+whorls
+whort
+whortle
+whortleberry
+whose
+whosesoever
+whoso
+whosoever
+whump
+whup
+why
+whyalla
+whydah
+whys
+WI
+Wichita
+wick
+wicked
+wickedly
+wickedness
+wicker
+Wickersley
+wickerwork
+wicket
+wicketkeeper
+wicketkeepers
+wicketkeeping
+wickets
+wicking
+wickiup
+Wickliffe
+Wicklow
+wicks
+wickthing
+wicopy
+widdershins
+wide
+widely
+widemouthed
+widen
+widened
+widener
+wideness
+widening
+widens
+wider
+widespread
+widest
+widgeon
+widgeons
+widgery
+widget
+widget's
+widgets
+widgie
+widish
+widnes
+Widor
+widow
+widowed
+widower
+widowerhood
+widowers
+widowhood
+widows
+width
+widths
+widthways
+widthwise
+widukind
+wieland
+Wieland
+wield
+wielded
+wielder
+wielding
+wields
+wieldy
+wien
+wiener
+wieners
+wienerwurst
+wienie
+Wiesbaden
+wife
+wife's
+wifehood
+wifeless
+wifelike
+wifeliness
+wifely
+wig
+wig's
+wigan
+wigeon
+wigeons
+wigged
+wigging
+Wiggins
+wiggle
+wiggled
+wiggler
+wiggles
+wiggling
+wiggly
+wight
+Wightman
+Wightman's
+wiglet
+wigmaker
+Wigner
+wigs
+Wigtown
+wigwag
+wigwam
+Wijngaarden
+wikiup
+Wilberforce
+Wilbur
+Wilbur's
+wilco
+Wilcox
+wild
+wildcard
+wildcarded
+wildcarding
+wildcards
+wildcat
+wildcat's
+wildcats
+wildcatted
+wildcatter
+wildcatting
+wilde
+wildebeest
+wildebeest's
+wilder
+wilderment
+wilderness
+wildest
+wildfire
+wildflower
+wildflower's
+wildflowers
+wildfowl
+wildfowler
+wildfowling
+wilding
+wildish
+wildlife
+wildling
+wildly
+wildness
+wildwood
+wile
+wiled
+wiles
+Wiley
+Wilfred
+wilful
+wilfully
+Wilhelm
+Wilhelmina
+wilhelmshaven
+wilhelmstrasse
+wilier
+wilily
+wiliness
+wiling
+Wilkes
+Wilkie
+Wilkie's
+Wilkins
+Wilkinson
+will
+Willa
+Willa's
+willable
+Willamette
+Willard
+Willcocks
+Willcox
+willed
+Willem
+willemite
+willemstad
+willer
+willet
+willful
+willfully
+willfulness
+William
+Williams
+Williamsburg
+Williamson
+Willie
+Willied
+willies
+Willies
+willing
+willingly
+willingness
+willings
+Willis
+Willisson
+Willisson's
+williwaw
+Willoughby
+willow
+willow's
+willower
+willowherb
+willowlike
+willows
+willowware
+willowy
+willpower
+wills
+willy
+Willy
+willying
+Wilma
+wilmette
+Wilmette
+Wilmington
+wilmslow
+wilno
+Wilshire
+Wilson
+Wilson's
+Wilsonian
+wilt
+wilted
+wilting
+Wilton
+wilts
+Wiltshire
+Wiltshire's
+wily
+wimble
+wimbled
+Wimbledon
+wimbles
+wimbling
+wimp
+wimp's
+wimpier
+wimpiest
+wimple
+wimpled
+wimpling
+wimps
+wimpy
+Wimshurst
+win
+wince
+winced
+winces
+wincey
+Winceyette
+winch
+winched
+Winchell
+winchell
+wincher
+winches
+Winchester
+winchester
+Winchesters
+winching
+wincing
+Winckelmann
+wind
+windage
+windbag
+windbags
+windblown
+windbound
+windbreak
+windbreaks
+windburn
+windburned
+windcheater
+windcheaters
+windchill
+winded
+winder
+windermere
+winders
+windfall
+windflaw
+windflower
+windgall
+windhoek
+windhover
+windier
+windily
+windiness
+winding
+windjammer
+windlass
+windlassed
+windlasses
+windlassing
+windlassly
+windless
+windlessly
+windlessness
+windlestraw
+windmill
+windmill's
+windmilling
+windmills
+window
+window's
+windowed
+windowing
+windowless
+windowpane
+windowpanes
+windows
+windowsill
+windpipe
+windproof
+windrow
+winds
+windsail
+windscreen
+windshield
+windsock
+Windsor
+windstorm
+windsurf
+windsurfed
+windsurfing
+windsurfs
+windswept
+windup
+windward
+windwardly
+windway
+windy
+wine
+winebibber
+wined
+wineglass
+winegrower
+winehead
+Winehead
+winemake
+winemaster
+winepress
+winer
+winers
+winery
+wines
+wineshop
+wineskin
+winey
+Winfield
+wing
+wingback
+wingbeat
+wingbeat's
+wingbeats
+wingding
+winged
+winger
+wingers
+winging
+wingless
+winglessness
+winglet
+winglike
+wingman
+wingmen
+wingover
+wings
+wingspan
+wingspread
+wingspread's
+wingspreads
+wingtip
+wingy
+Winifred
+wining
+winism
+wink
+winked
+winkelried
+winker
+winking
+winkle
+winkled
+winkles
+winkling
+winks
+winless
+winnable
+winnebago
+Winnebago
+winned
+winner
+winner's
+winners
+Winnetka
+Winnie
+winning
+winningly
+winnings
+Winnipeg
+winnipegosis
+winnow
+winnower
+wino
+Winograd
+winooski
+Winooski
+winos
+wins
+Winsborough
+Winsett
+winsett
+Winslow
+winsome
+winsomely
+winsomeness
+Winston
+winter
+wintered
+winterer
+winterfeed
+wintergreen
+wintering
+winterization
+winterization's
+winterizations
+winterize
+winterized
+winterizes
+winterizing
+winterkill
+winterly
+winters
+winterthur
+wintertide
+wintertime
+winterweight
+wintery
+Winthrop
+wintle
+wintrier
+wintrily
+wintriness
+wintry
+winy
+winze
+wipe
+wiped
+wiper
+wipers
+wipes
+wiping
+wipo
+wirable
+wire
+wired
+wiredraw
+wiredrawer
+wiredrawn
+wirehair
+wirehaired
+wireless
+wirelike
+wireman
+wiremen
+wirepuller
+wirer
+wires
+wiretap
+wiretap's
+wiretapper
+wiretapping
+wiretaps
+wirewalker
+wireway
+wirework
+wireworks
+wireworm
+wirier
+wirily
+wiriness
+wiring
+wirings
+wirra
+wirral
+wiry
+wis
+Wisconsin
+Wisconsin's
+wisdom
+wisdoms
+wise
+wiseacre
+wisecrack
+wisecracked
+wisecracker
+wised
+wisely
+Wiseman
+wiseness
+Wisenheimer
+wisenheimer
+wisent
+wiser
+wises
+wisest
+wisewoman
+wish
+wisha
+wishbone
+wished
+wisher
+wishers
+wishes
+wishful
+wishfully
+wishfulness
+wishing
+wishlist
+wishlists
+wishy
+wising
+wislany
+wismar
+wisp
+wisp's
+wispish
+wisps
+wispy
+wist
+wistaria
+wisteria
+wistful
+wistfully
+wistfulness
+wit
+wit's
+witan
+witch
+witchcraft
+witchery
+witches
+witchetty
+witching
+witchlike
+witchy
+wite
+witenagemot
+with
+withal
+withdraw
+withdrawable
+withdrawal
+withdrawal's
+withdrawals
+withdrawer
+withdrawing
+withdrawn
+withdrawnness
+withdraws
+withdrew
+withe
+wither
+withered
+withering
+witheringly
+witherite
+withers
+withershins
+Witherspoon
+witherspoon
+withheld
+withhold
+withholder
+withholders
+withholding
+withholdings
+withholds
+withies
+within
+withindoors
+without
+withoutdoors
+withstand
+withstanding
+withstands
+withstood
+withy
+witless
+witling
+witness
+witnessed
+witnesses
+witnessing
+wits
+Witt
+Witt's
+witted
+Wittenberg
+witter
+Wittgenstein
+Wittgenstein's
+witticism
+wittier
+wittiest
+wittily
+wittiness
+witting
+wittingly
+wittol
+witty
+Witwatersrand
+wive
+wivern
+wives
+wiving
+Wixell
+wiz
+wizard
+wizard's
+wizardly
+wizardry
+wizards
+wizen
+wizened
+woad
+woaded
+woadwaxen
+woald
+Wobbegong
+wobble
+wobbled
+wobbler
+wobbles
+wobbliness
+wobbling
+wobbly
+Wodehouse
+Woden
+wodge
+wodges
+woe
+woebegone
+woebegoneness
+woeful
+woefully
+woeness
+wog
+woggle
+wok
+woke
+woken
+Woking
+Wokingham
+Wolcott
+wold
+Wolds
+wolf
+wolfbane
+Wolfe
+Wolfe's
+wolfenden
+wolfer
+Wolff
+Wolff's
+Wolffian
+wolffish
+Wolfgang
+wolfhound
+wolfish
+wolfishly
+wolfishness
+wolfit
+wolflike
+Wolfram
+wolframite
+wolfsbane
+Wolfsburg
+wollastonite
+Wollongong
+wolly
+Wolof
+wolsey
+wolve
+wolver
+Wolverhampton
+wolverine
+wolverine's
+wolverines
+wolverton
+Wolverton
+wolves
+woman
+woman's
+womanhood
+womanish
+womanishly
+womanishness
+womanization
+womanization's
+womanizations
+womanize
+womanized
+womanizer
+womanizers
+womanizes
+womanizing
+womankind
+womanless
+womanlike
+womanliness
+womanly
+womanpower
+womb
+womb's
+wombat
+wombat's
+wombats
+wombed
+wombs
+women
+women's
+womenfolk
+womenfolks
+womenkind
+womens
+womera
+won
+won't
+wonder
+wondered
+wonderer
+wonderful
+wonderfully
+wonderfulness
+wondering
+wonderingly
+wonderland
+wonderland's
+wonderment
+wonders
+wonderwork
+wondrous
+wondrously
+wondrousness
+Wong
+Wong's
+wonky
+wonning
+wonsan
+wont
+wonted
+wontedly
+wontedness
+wonting
+wonton
+woo
+wood
+wood's
+Woodard
+Woodberry
+woodberry
+woodborer
+Woodbury
+woodcarver
+woodcarving
+woodchat
+woodchopper
+woodchoppers
+woodchuck
+woodchuck's
+woodchucks
+woodcock
+woodcock's
+woodcockize
+woodcockizes
+woodcocks
+woodcraft
+woodcut
+woodcutter
+woodcutters
+woodcutting
+wooded
+wooden
+woodenhead
+woodenheaded
+woodenly
+woodenness
+woodenware
+woodgrain
+woodgraining
+woodgrouse
+woodhen
+woodhook
+woodier
+woodiness
+wooding
+woodland
+woodlander
+woodlark
+Woodlawn
+woodlore
+woodlot
+woodlouse
+woodman
+woodnote
+woodpecker
+woodpecker's
+woodpeckers
+woodpile
+Woodrow
+woodruff
+woodrush
+woods
+woodscrew
+woodseats
+woodser
+woodshed
+Woodsia
+woodside
+woodsman
+Woodstock
+Woodstock's
+woodsy
+Woodward
+Woodwards
+woodwaxen
+woodwind
+woodwork
+woodworker
+woodworking
+woodworm
+Woody
+woody
+Woody's
+woodyard
+wooed
+wooer
+woof
+woofed
+woofer
+woofers
+woofing
+woofs
+wooing
+wool
+wooled
+woolen
+woolenization
+woolenization's
+woolenizations
+woolenize
+woolenizes
+woolens
+woolf
+woolfell
+woolgather
+woolgatherer
+woolgathering
+woolgrower
+woolie
+woolley
+woollier
+woollies
+woolliness
+woolly
+woollybutt
+woolpack
+wools
+woolsack
+woolshed
+woolskin
+Woolworth
+wooly
+Woomera
+Woonsocket
+woop
+woops
+woorali
+woos
+Wooster
+woozier
+woozily
+wooziness
+woozy
+wop
+wops
+Worcester
+Worcestershire
+Worcestershire's
+word
+word's
+wordage
+wordages
+wordbook
+worded
+wordier
+wordily
+wordiness
+wording
+wordings
+wordless
+wordlessly
+wordlessness
+wordmonger
+wordplay
+words
+Wordsworth
+wordy
+wore
+work
+workability
+workable
+workableness
+workably
+workaday
+workaround
+workaround's
+workarounds
+workbag
+workbasket
+workbench
+workbench's
+workbenches
+workboat
+workbook
+workbook's
+workbooks
+workbox
+workday
+worked
+worker
+worker's
+workers
+workfile
+workfiles
+workfolk
+workfolks
+workforce
+workforce's
+workforces
+workgroup
+workgroups
+workhorse
+workhorse's
+workhorses
+workhouse
+workhouses
+working
+workingman
+workingmen
+workings
+workless
+worklessness
+workload
+workloads
+workman
+workmanlike
+workmanly
+workmanship
+workmate
+workmates
+workmen
+workmen's
+workout
+workouts
+workpeople
+workperson
+workpiece
+workpieces
+workplace
+workplace's
+workplaces
+workroom
+workrooms
+works
+worksheet
+worksheets
+workshop
+workshop's
+workshops
+workshy
+worksop
+workspace
+workspaces
+workstation
+workstation's
+workstations
+worktable
+workweek
+workwoman
+world
+world's
+worlders
+worldliness
+worldling
+worldly
+worlds
+worldwide
+worm
+wormcast
+wormed
+wormer
+wormhole
+wormier
+worming
+wormlike
+worms
+wormseed
+wormwood
+wormy
+worn
+worried
+worriedly
+worrier
+worriers
+worries
+worriment
+worrisome
+worrisomely
+worrisomeness
+worry
+worrying
+worryingly
+worrywart
+worse
+worsen
+worsened
+worsening
+worsens
+worser
+worship
+worshiped
+worshiper
+worshiper's
+worshipers
+worshipful
+worshipfully
+worshipfulness
+worshiping
+worshipless
+worships
+worsley
+worst
+worsted
+wort
+worth
+worthful
+worthier
+worthies
+worthiest
+worthily
+worthiness
+worthing
+Worthington
+worthless
+worthlessly
+worthlessness
+worths
+worthwhile
+worthwhileness
+worthy
+wot
+Wotan
+Wotan's
+wotted
+Wotton
+would
+would've
+wouldest
+wouldn't
+wouldst
+Woulfe
+wound
+wounded
+wounding
+woundless
+wounds
+woundwort
+wove
+woven
+wow
+wowser
+Wraac
+wrack
+wracked
+wracking
+wracks
+wraith
+wraiths
+wran
+wrangle
+wrangled
+wrangler
+wranglers
+wrangles
+wrangling
+wrap
+wrap's
+wraparound
+wrapover
+wrapped
+wrapper
+wrapper's
+wrappers
+wrapping
+wrappings
+wrapround
+wraps
+wrapup
+wrasse
+wrath
+wrathful
+wrathfully
+wrathfulness
+wrathy
+wreak
+wreaks
+wreath
+wreathe
+wreathed
+wreathes
+wreathing
+wreaths
+wreathy
+wreck
+wreckage
+wrecked
+wrecker
+wreckers
+wreckfish
+wreckful
+wrecking
+wrecks
+wrekin
+wren
+wren's
+wrench
+wrenched
+wrenches
+wrenching
+wrenchingly
+wrens
+wrest
+wrested
+wrester
+wresting
+wrestle
+wrestled
+wrestler
+wrestles
+wrestling
+wrestlings
+wrests
+wretch
+wretched
+wretchedly
+wretchedness
+wretches
+Wrexham
+wrier
+wriest
+wriggle
+wriggled
+wriggler
+wriggles
+wriggling
+wriggly
+wright
+Wrigley
+wring
+wringer
+wringing
+wrings
+wrinkle
+wrinkled
+wrinkles
+wrinkling
+wrinkly
+wrist
+wrist's
+wristband
+wristlet
+wristlock
+wrists
+wristwatch
+wristwatch's
+wristwatches
+wristy
+writ
+writ's
+writable
+write
+writer
+writer's
+writers
+writes
+writeup
+writeup's
+writeups
+writhe
+writhed
+writhen
+writhes
+writhing
+writing
+writings
+writs
+written
+wroclaw
+wrong
+wrongdo
+wrongdoer
+wrongdoers
+wrongdoing
+wronged
+wronger
+wrongest
+wrongful
+wrongfully
+wrongfulness
+wrongheaded
+wrongheadedly
+wrongheadedness
+wronging
+wrongly
+wrongness
+wrongs
+Wronskian
+wrote
+wroth
+wrought
+wrung
+wry
+wrybill
+wryly
+wryneck
+Wu
+Wu's
+wuchang
+wuhsien
+wuhu
+wulfenite
+wulfila
+wunderkind
+Wunderlich
+wundt
+wuppertal
+wurley
+wurst
+wus
+wusih
+wuthering
+wutsin
+WV
+WWW
+WY
+Wyatt
+Wyatt's
+wycherley
+wycliffe
+Wycliffite
+wye
+Wyeth
+Wyeth's
+Wykeham
+Wylie
+Wylie's
+Wyman
+wynd
+Wynn
+Wynn's
+Wyoming
+wysiwyg
+wyvern
+xanthate
+xanthein
+xanthene
+xanthic
+xanthin
+xanthine
+xanthippe
+xanthochroid
+xanthochroism
+xanthoma
+xanthophyll
+xanthous
+Xanthus
+xanthus
+Xavier
+xci
+xcii
+xciv
+xcix
+xcvi
+xcvii
+Xenakis
+xenakis
+Xenia
+xenia
+Xenix
+Xenix's
+xenocrates
+xenocryst
+xenogamy
+xenogenesis
+xenoglossia
+xenolith
+xenomania
+xenomorphic
+xenon
+xenophanes
+xenophile
+xenophilous
+xenophobe
+xenophobia
+xenophobic
+xenophon
+xerarch
+Xeres
+xeric
+xerically
+xeroderma
+xerographic
+xerographically
+xerography
+xeromorphic
+xerophile
+xerophilous
+xerophily
+xerophthalmia
+xerophyte
+xerosere
+xerosis
+Xerox
+Xerox's
+Xeroxed
+Xeroxes
+Xeroxing
+Xerxes
+xhosa
+Xhosa
+xi
+xii
+xiii
+xiphisternum
+xiphoid
+xiphosuran
+xiv
+xix
+Xmas
+XOR
+xterm
+xterm's
+xuthus
+xv
+xvi
+xvii
+xviii
+xx
+xxi
+xxii
+xxiii
+xxiv
+xxix
+xxv
+xxvi
+xxvii
+xxviii
+xxx
+xxxi
+xxxii
+xxxiii
+xxxiv
+xxxix
+xxxv
+xxxvi
+xxxvii
+xxxviii
+xylan
+xylem
+xylene
+xylidine
+xylocarp
+xylograph
+xylography
+xyloid
+xylol
+xylophagous
+xylophone
+xylophones
+xylophonist
+xylose
+xylotomic
+xylotomical
+xylotomous
+xylotomy
+xylyl
+xyst
+xyster
+yabber
+yabby
+Yablonovy
+yacc
+yacc's
+yacht
+yachters
+yachting
+yachts
+yachtsman
+yachtsmen
+yack
+yacking
+yaffle
+yafo
+yagi
+yah
+yahata
+Yahoo
+Yahweh
+yak
+Yakima
+yakking
+yaks
+Yakut
+Yakutsk
+Yale
+Yalies
+yalies
+Yalta
+Yalu
+yam
+yamagata
+Yamaha
+Yamaha's
+yamani
+yamashita
+yamen
+yammer
+yang
+Yangtze
+yanina
+yank
+yanked
+Yankee
+Yankeeism
+Yankees
+yanking
+yanks
+Yankton
+Yankton's
+Yaounde
+Yaounde's
+yap
+yapok
+yapon
+yapping
+Yaqui
+Yarborough
+yard
+yard's
+yardage
+yardarm
+yardbird
+yarded
+yarding
+yardman
+yardmaster
+yards
+yardstick
+yardstick's
+yardsticks
+yare
+yarely
+Yarkand
+yarmelke
+Yarmouth
+Yarmouth's
+yarmulke
+yarn
+yarn's
+yarned
+yarning
+yarns
+Yaroslavl
+yarrow
+yarwood
+Yashmak
+yataghan
+yate
+Yates
+yauld
+yaunde
+yaup
+yaupon
+yautia
+yaw
+yawata
+yawed
+yawing
+yawl
+yawn
+yawner
+yawning
+yawningly
+yawns
+yawp
+yaws
+yazd
+ycleped
+yclept
+ye
+yea
+Yeager
+yeah
+yean
+yeanling
+year
+year's
+yearbook
+yearling
+yearlong
+yearly
+yearn
+yearned
+yearner
+yearning
+yearningly
+yearnings
+yearns
+years
+yeas
+yeast
+yeast's
+yeastier
+yeastily
+yeastiness
+yeasts
+yeasty
+Yeats
+yecch
+yegg
+Yekaterinburg
+Yekaterinodar
+Yekaterinoslav
+yeld
+Yelisavetgrad
+Yelisavetpol
+Yelizaveta
+yelk
+yell
+yelled
+yeller
+yellerish
+yelling
+yellow
+yellowbark
+yellowbird
+yellowed
+yellower
+yellowest
+yellowhammer
+yellowing
+yellowish
+Yellowknife
+Yellowknife's
+yellowlegs
+yellowness
+yellows
+Yellowstone
+Yellowstone's
+yellowtail
+yellowweed
+yellowwood
+yells
+yelp
+yelped
+yelper
+yelping
+yelps
+Yemen
+yen
+yenan
+Yenisei
+yentai
+Yentl
+Yentl's
+yeoman
+yeomanly
+yeomanry
+yeomen
+yep
+Yerba
+yerevan
+Yerkes
+yes
+yeses
+yeshiva
+yester
+yesterday
+yesterday's
+yesterdays
+yesteryear
+yestreen
+yet
+yeti
+yeuk
+Yevtushenko
+yew
+yezd
+ygerne
+Yid
+Yiddish
+yield
+yielded
+yielder
+yielding
+yields
+yike
+yin
+yingkow
+yip
+yippee
+yipping
+yirr
+ylem
+YMCA
+ymir
+yob
+yod
+yodel
+yodeled
+yodeler
+yodeling
+yodels
+yodle
+yoga
+yogh
+yoghurt
+yoghurt's
+yogi
+yogic
+yogin
+yogurt
+yogurt's
+yohimbine
+yoicks
+yoke
+yoke's
+yokefellow
+yokel
+yokels
+yokes
+yoking
+Yoknapatawpha
+yoknapatawpha
+Yokohama
+yola
+yolk
+yolks
+yolky
+yom
+yon
+yond
+yonder
+yoni
+Yonkers
+yonne
+yonnie
+yore
+Yorick
+York
+York's
+Yorke
+Yorker
+Yorkers
+Yorkist
+Yorkists
+Yorks
+Yorkshire
+Yorkshire's
+Yorktown
+Yoruba
+Yosemite
+Yoshihito
+Yost
+Yost's
+you
+you'd
+you'll
+you're
+you've
+young
+Youngberry
+younger
+youngest
+youngish
+youngling
+youngly
+youngness
+youngster
+youngster's
+youngsters
+Youngstown
+Younker
+your
+your's
+yours
+yourself
+yourselves
+youth
+youth's
+youthes
+youthful
+youthfully
+youthfulness
+youths
+yow
+yowl
+Ypres
+Ypsilanti
+Yquem
+yr
+Yresko
+Ysaye
+Yser
+Yseult
+Yssel
+ytterbia
+ytterbite
+ytterbium
+yttria
+yttriferous
+yttrium
+yuba
+Yuba
+Yucatan
+yucca
+yuck
+Yuga
+Yugoslav
+Yugoslavia
+yuk
+Yukawa
+Yukon
+yulan
+yule
+yuletide
+Yuman
+yummier
+yummy
+yup
+yuppie
+yuppie's
+yuppies
+Yurev
+Yuri
+yuri
+Yurlov
+yurt
+Yuzovka
+yvelines
+Yves
+Yvette
+YWCA
+ywis
+Zaandam
+zabaglione
+Zabrze
+Zacatecas
+Zaccaria
+Zacharias
+Zachary
+zacynthus
+zaffer
+zag
+zagazig
+zagged
+zagging
+Zagreb
+Zagreb's
+zagreus
+zagros
+zags
+Zaibatsu
+Zaire
+Zakai
+Zakuski
+zama
+Zambezi
+Zambia
+Zambia's
+Zamboanga
+Zamenhof
+Zamia
+zamindar
+zamindari
+zamora
+Zan
+Zan's
+Zanasi
+zanier
+zanies
+zanily
+zaniness
+zante
+Zanthoxylum
+zanu
+zany
+Zanzibar
+zap
+zapata
+zaporozhye
+Zapotec
+zappa
+zapped
+zapping
+zaps
+zapu
+zaqaziq
+zaragoza
+zarathustra
+zaratite
+zareba
+zarf
+zarga
+zaria
+zarzuela
+zastruga
+zayin
+zazen
+zeal
+Zealand
+Zealand's
+zealot
+zealotry
+zealous
+zealously
+zealousness
+zeami
+zebec
+zebedee
+zebra
+zebra's
+zebras
+zebrawood
+zebu
+zebulun
+zecchino
+zechariah
+zed
+zedekiah
+zedoary
+zee
+Zeebrugge
+Zeeland
+Zeeman
+zeffirelli
+Zeffirelli
+zein
+Zeiss
+zeist
+zeitgeist
+Zellerbach
+zemindar
+Zemstvo
+Zen
+zenana
+Zend
+zener
+zenith
+zenithal
+Zennist
+Zenobia
+zeolite
+zeolitic
+zephaniah
+zephyr
+zephyrus
+zeppelin
+Zepperitz
+Zermatt
+zero
+zeroed
+zeroes
+zeroing
+zeroize
+zeroized
+zeroizes
+zeroizing
+zeros
+zeroth
+zest
+zestful
+zestfully
+zestfulness
+zestier
+zesty
+zeta
+zetas
+Zetland
+zeugma
+Zeus
+Zeus's
+zeuxis
+Zhdanov
+Zhitomir
+Zhivkov
+Zho
+Zhukov
+zia
+ziaur
+zibeline
+zibet
+Ziegfeld
+Ziegfeld's
+Ziegfelds
+Ziegler
+Ziegler's
+ziff
+zig
+zigged
+zigging
+ziggurat
+ziggy
+Ziggy
+zigzag
+zigzagged
+zigzagger
+zigzagging
+zila
+zilch
+zillion
+zilpah
+Zimbabwe
+Zimmerman
+Zimmerman's
+zinc
+zinc's
+zincate
+zincic
+zinciferous
+zincite
+zinckenite
+zincograph
+zincography
+Zindabad
+zinfandel
+zing
+zinger
+zingiberaceous
+zingier
+zings
+zingy
+zinjanthropus
+zinkenite
+Zinman
+zinnia
+Zinovievsk
+Zinzendorf
+Zion
+Zion's
+Zionism
+Zionist
+Zionist's
+Zionists
+Zions
+zip
+zipangu
+zipped
+zipper
+zippered
+zippers
+zippier
+zipping
+zippy
+zips
+zircalloy
+zircon
+zirconia
+zirconic
+zirconium
+ziska
+zither
+zitherist
+zithers
+zizith
+zlatoust
+zloty
+zlotys
+Zoa
+zoaea
+zoan
+zoantharian
+zoarial
+zoarium
+zobrist
+zodiac
+zodiacal
+zodiacs
+Zoe
+Zoe's
+zoea
+zoffany
+zohar
+zola
+zombi
+zombie
+zombies
+zombiism
+zonal
+zonally
+zonate
+zonated
+zonation
+zond
+zone
+zoned
+zonely
+zoner
+zones
+zoning
+zonk
+zonked
+zonking
+zonks
+zonule
+zoo
+zoo's
+zoochemistry
+zoochore
+zoogenic
+zoogenous
+zoogeographer
+zoogeographic
+zoogeography
+zoogloea
+zoography
+zooid
+zooks
+zoolatry
+zoologic
+zoological
+zoologically
+zoologist
+zoologists
+zoology
+zoom
+zoomed
+zoometry
+zooming
+zoomorphic
+zoomorphism
+zooms
+zoonosis
+zoonotic
+zooparasite
+zooparasitic
+zoophagous
+zoophile
+zoophilia
+zoophilic
+zoophilism
+zoophilous
+zoophobia
+zoophyte
+zoophytic
+zooplankton
+zooplasty
+zoos
+zoosperm
+zoosporal
+zoosporangium
+zoospore
+zoosterol
+zootechnics
+zootomy
+zootoxin
+zootoxins
+zori
+zorilla
+Zorn
+Zoroaster
+Zoroastrian
+Zoroastrianism
+Zoroastrians
+zorrilla
+zoster
+Zouave
+zoug
+zounds
+Zoysia
+zsigmondy
+zucchetto
+zucchini
+zugzwang
+Zuider
+Zuidholland
+Zukerman
+Zulu
+Zulu's
+Zulus
+Zurich
+Zurich's
+Zwilich
+zwitterion
+zwitterionic
+zwitterions
+zygote
+zygote's
+zygotes
+zymurgy
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/README b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/README
new file mode 100644
index 00000000000..d9ee38b3ca5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/README
@@ -0,0 +1,45 @@
+
+This file contains the contents of the Ispell (ver 3.1.20) word list after
+being expand from there affix compressed form used by Ispell.
+
+Ispell can be found at http://fmg-www.cs.ucla.edu/geoff/ispell.html.
+This wordlist can be found at http://wordlist.sourceforge.net/
+
+These word lists are under the same copyright as Ispell itself:
+
+ Copyright 1993, Geoff Kuenning, Granada Hills, CA
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. All modifications to the source code must be clearly marked as
+ such. Binary redistributions based on modified source code
+ must be clearly marked as modified versions in the documentation
+ and/or other materials provided with the distribution.
+ 4. All advertising materials mentioning features or use of this software
+ must display the following acknowledgment:
+ This product includes software developed by Geoff Kuenning and
+ other unpaid contributors.
+ 5. The name of Geoff Kuenning may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS
+ IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GEOFF
+ KUENNING OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/README.txt b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/README.txt
new file mode 100644
index 00000000000..81a5e002701
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/README.txt
@@ -0,0 +1,5 @@
+Acceptable open source dictionary as per
+https://dev.eclipse.org/ipzilla/show_bug.cgi?id=1416
+
+File AllWords.txt has been created out of american.*, english.* files as a convenience
+so only one file can be opened and read versus 6. \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.0 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.0
new file mode 100644
index 00000000000..aec70b51d95
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.0
@@ -0,0 +1,239 @@
+acknowledgement
+acknowledgement's
+acknowledgements
+appal
+appals
+apparelled
+archeological
+archeologically
+archeologist
+archeologist's
+archeologists
+archeology
+autodialler
+barrelled
+barrelling
+bevelled
+bevelling
+canalled
+canalling
+cancelled
+canceller
+cancelling
+channelled
+channeller
+channeller's
+channellers
+channelling
+chiselled
+chiseller
+chisellers
+councilor
+councilor's
+counselled
+counselling
+counsellor
+counsellor's
+counsellors
+crystalize
+crystalized
+crystalizer
+crystalizes
+crystalizing
+dialled
+dialler
+dialling
+draught
+draught's
+draughts
+duelled
+dueller
+duelling
+enamelled
+enameller
+enamellers
+enamelling
+enrol
+enrols
+equalled
+equalling
+eviller
+evillest
+focussable
+focussed
+focusser
+focusses
+focussing
+fuelled
+fueller
+fuelling
+fulfil
+fulfils
+funnelled
+funnelling
+glamor
+glamored
+glamoring
+glamors
+glamourize
+glamourized
+glamourizer
+glamourizers
+glamourizes
+glamourizing
+gospeller
+gospellers
+gravelled
+gravelling
+grovelled
+groveller
+grovelling
+grovellingly
+imperilled
+initialled
+initialler
+initialling
+jewelled
+jeweller
+jewellers
+jewelling
+judgement
+judgement's
+judgements
+kidnapped
+kidnapper
+kidnapper's
+kidnappers
+kidnapping
+kidnapping's
+kidnappings
+labelled
+labeller
+labeller's
+labellers
+labelling
+laurelled
+levelled
+leveller
+levellest
+levelling
+marshalled
+marvelled
+marvelling
+marvellous
+marvellously
+marvellousness
+medalled
+medalling
+metalled
+metalling
+misjudgement
+modelled
+modeller
+modelling
+modellings
+multilevelled
+nickelled
+nickelling
+panelled
+panelling
+parametrizable
+parametrization
+parametrization's
+parametrizations
+parametrize
+parametrized
+parametrizes
+parametrizing
+parcelled
+parcelling
+pencilled
+pencilling
+petalled
+pretence
+pretences
+pretencion
+pretencions
+pretencive
+quarrelled
+quarreller
+quarrelling
+queueing
+recrystalized
+recrystalizes
+redialled
+redialling
+refocussed
+refocusses
+refocussing
+refuelled
+refuelling
+relabelled
+relabeller
+relabellers
+relabelling
+remodelled
+remodelling
+revelled
+reveller
+revellers
+revelling
+revellings
+rivalled
+rivalling
+shovelled
+shoveller
+shovelling
+shrivelled
+shrivelling
+signalled
+signaller
+signalling
+spiralled
+spiralling
+squirrelled
+squirrelling
+stencilled
+stenciller
+stencilling
+symbolled
+symbolling
+syphon
+syphon's
+syphoned
+syphoning
+syphons
+totalled
+totaller
+totaller's
+totallers
+totalling
+towelled
+towelling
+travelled
+traveller
+traveller's
+travellers
+travelling
+travellings
+troweller
+tunnelled
+tunneller
+tunnelling
+uncancelled
+uncrystalized
+unequalled
+unfocussed
+unlabelled
+unlevelled
+unparametrized
+unravelled
+unravelling
+unrivalled
+unsyphons
+victualler
+worshipped
+worshipper
+worshipper's
+worshippers
+worshipping
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.1 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.1
new file mode 100644
index 00000000000..615dc5474ed
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.1
@@ -0,0 +1,51 @@
+cancellate
+caviller
+cigaret
+defocussing
+dishevelled
+dowelling
+duellist
+enthral
+enthrals
+gimballed
+glamourous
+glamourously
+glamourousness
+gruelling
+gruellingly
+libeller
+libellous
+pedalled
+pedalling
+programability
+programable
+programed
+programer
+programer's
+programers
+programing
+pummelled
+recrystalize
+recrystalizing
+reprogramed
+reprogramer
+reprogramer's
+reprogramers
+reprograming
+snivelled
+sniveller
+snivelling
+snivellings
+swivelled
+swivelling
+teaselled
+teaselling
+teetotaller
+tinselled
+tinselling
+tyne
+tynes
+untrammelled
+yodelled
+yodeller
+yodelling
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.2 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.2
new file mode 100644
index 00000000000..ba386139468
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/altamer.2
@@ -0,0 +1,90 @@
+asafoetida
+bemedalled
+bimetallist
+bimetallistic
+calliper
+cancellable
+cancellous
+chiselling
+corbelling
+counsellee
+counsellorship
+crenellate
+crenellated
+crenellation
+crystalographical
+crystalographically
+cupellation
+cupeller
+disenthral
+disenthrals
+driveller
+enamellist
+frivolled
+frivoller
+frivolling
+gambolled
+gambolling
+gavelled
+gruelled
+hiccupped
+hiccupping
+hovelled
+judgemental
+kennelled
+kernelled
+labellable
+lapelled
+libellant
+libellee
+marshall
+marshalling
+marshalls
+medallist
+medallists
+metallization
+metallization's
+metallizations
+metallize
+metallized
+metallizes
+metallizing
+microcrystaline
+microcrystalinity
+miocrystaline
+mislabelled
+monometallism
+monometallist
+penciller
+perilled
+photolabelled
+photolabeller
+photolabelling
+precancellation
+prejudgement
+programmist
+programmist's
+programmistic
+programmistics
+programmists
+raveller
+ravelling
+semicrystaline
+snobsnivelling
+subtotalled
+subtotalling
+teazelling
+tendrilled
+trammelled
+trammelling
+trowelled
+trowelling
+unhouselled
+weevilled
+woollen
+woollenization
+woollenization's
+woollenizations
+woollenize
+woollenizes
+woollens
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.0 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.0
new file mode 100644
index 00000000000..935ff42c75e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.0
@@ -0,0 +1,1835 @@
+acclimatization
+acclimatization's
+acclimatizations
+acclimatized
+accouterment
+accouterment's
+accouterments
+acknowledgment
+acknowledgment's
+acknowledgments
+actualization
+actualization's
+actualizations
+aerosolize
+aerosolized
+agonize
+agonized
+agonizedlies
+agonizedly
+agonizer
+agonizers
+agonizes
+agonizing
+agonizingly
+airfoil
+airfoils
+airplane
+airplane's
+airplanes
+alphabetize
+alphabetized
+alphabetizer
+alphabetizers
+alphabetizes
+alphabetizing
+aluminum
+aluminum's
+aluminums
+amenorrhea
+amortize
+amortized
+amortizes
+amortizing
+amphitheater
+amphitheater's
+amphitheaters
+analog
+analog's
+analogs
+analyzable
+analyze
+analyzed
+analyzer
+analyzers
+analyzes
+analyzing
+anemia
+anemia's
+anemias
+anemic
+anemics
+anesthesia
+anesthesia's
+anesthesias
+anesthetic
+anesthetic's
+anesthetically
+anesthetics
+anesthetize
+anesthetized
+anesthetizer
+anesthetizer's
+anesthetizers
+anesthetizes
+anesthetizing
+anodize
+anodized
+anodizes
+anodizing
+antagonize
+antagonized
+antagonizer
+antagonizers
+antagonizes
+antagonizing
+apologize
+apologized
+apologizer
+apologizers
+apologizes
+apologizing
+appall
+appalls
+appareled
+appetizer
+appetizing
+appetizingly
+arbor
+arbor's
+arbored
+arbors
+archaize
+archaized
+archaizer
+archaizers
+archaizes
+archaizing
+ardor
+ardor's
+ardors
+arithmetize
+arithmetized
+arithmetizes
+armor
+armor's
+armored
+armorer
+armorer's
+armorers
+armoried
+armories
+armoring
+armors
+armory
+armory's
+atomization
+atomization's
+atomizations
+atomize
+atomized
+atomizer
+atomizers
+atomizes
+atomizing
+authorization
+authorization's
+authorizations
+authorize
+authorized
+authorizer
+authorizers
+authorizes
+authorizing
+autodialer
+axiomatization
+axiomatization's
+axiomatizations
+axiomatize
+axiomatized
+axiomatizes
+axiomatizing
+balkanize
+balkanized
+balkanizing
+baptize
+baptized
+baptizer
+baptizers
+baptizes
+baptizing
+barreled
+barreling
+bastardize
+bastardized
+bastardizes
+bastardizing
+bedeviled
+bedeviling
+behavior
+behavior's
+behavioral
+behaviorally
+behaviored
+behaviorism
+behaviorism's
+behaviorisms
+behavioristic
+behavioristics
+behaviors
+behoove
+behoove's
+behooved
+behooves
+behooving
+behooving's
+behoovingly
+behoovings
+belabor
+belabor's
+belabored
+belaboring
+belabors
+beveled
+beveling
+bevelings
+bowdlerize
+bowdlerized
+bowdlerizer
+bowdlerizes
+bowdlerizing
+brutalize
+brutalized
+brutalizes
+brutalizing
+burglarize
+burglarized
+burglarizes
+burglarizing
+busheled
+busheling
+bushelings
+caliber
+calibers
+canaled
+canaling
+canceled
+canceler
+canceling
+candor
+candor's
+candors
+cannibalize
+cannibalized
+cannibalizes
+cannibalizing
+canonicalization
+canonicalize
+canonicalized
+canonicalizes
+canonicalizing
+capitalization
+capitalization's
+capitalizations
+capitalize
+capitalized
+capitalizer
+capitalizers
+capitalizes
+capitalizing
+carbonization
+carbonization's
+carbonizations
+carbonize
+carbonized
+carbonizer
+carbonizers
+carbonizes
+carbonizing
+catalog
+catalog's
+cataloged
+cataloger
+cataloging
+catalogs
+categorization
+categorization's
+categorizations
+categorize
+categorized
+categorizer
+categorizers
+categorizes
+categorizing
+center
+center's
+centered
+centerer
+centerers
+centering
+centerings
+centerpiece
+centerpiece's
+centerpieces
+centers
+centimeter
+centimeter's
+centimeters
+centralization
+centralization's
+centralizations
+centralize
+centralized
+centralizer
+centralizers
+centralizes
+centralizing
+channeled
+channeler
+channeler's
+channelers
+channeling
+characterizable
+characterizable's
+characterizables
+characterization
+characterization's
+characterizations
+characterize
+characterized
+characterizer
+characterizers
+characterizes
+characterizing
+checkbook
+checkbook's
+checkbooks
+chiseled
+chiseler
+chiselers
+civilization
+civilization's
+civilizations
+civilize
+civilized
+civilizedness
+civilizer
+civilizers
+civilizes
+civilizing
+clamor
+clamored
+clamorer
+clamorer's
+clamorers
+clamoring
+clamors
+cognizance
+cognizant
+colonization
+colonization's
+colonizations
+colonize
+colonized
+colonizer
+colonizers
+colonizes
+colonizing
+color
+color's
+colored
+coloreds
+colorer
+colorer's
+colorers
+colorful
+colorfully
+colorfulness
+coloring
+colorings
+colorless
+colorlessly
+colorlessness
+colors
+columnize
+columnized
+columnizes
+columnizing
+compartmentalize
+compartmentalized
+compartmentalizes
+compartmentalizing
+computerize
+computerized
+computerizes
+computerizing
+conceptualization
+conceptualization's
+conceptualizations
+conceptualize
+conceptualized
+conceptualizer
+conceptualizes
+conceptualizing
+counseled
+counseling
+counselor
+counselor's
+counselors
+criticize
+criticized
+criticizer
+criticizers
+criticizes
+criticizing
+criticizinglies
+criticizingly
+crystallize
+crystallized
+crystallizer
+crystallizers
+crystallizes
+crystallizing
+customizable
+customization
+customization's
+customizations
+customize
+customized
+customizer
+customizers
+customizes
+customizing
+decentralization
+decentralization's
+decentralizations
+decentralized
+defense
+defense's
+defensed
+defenseless
+defenselessly
+defenselessness
+defenses
+defensing
+demeanor
+demeanor's
+demeanors
+demoralize
+demoralized
+demoralizer
+demoralizers
+demoralizes
+demoralizing
+demoralizingly
+dialed
+dialer
+dialers
+dialing
+dialings
+dichotomize
+dichotomized
+dichotomizes
+dichotomizing
+digitize
+digitized
+digitizer
+digitizer's
+digitizers
+digitizes
+digitizing
+dishonor
+dishonored
+dishonorer
+dishonorer's
+dishonorers
+dishonoring
+dishonors
+disorganized
+draftsman
+dueled
+dueler
+duelers
+dueling
+duelings
+economize
+economized
+economizer
+economizers
+economizes
+economizing
+editorialize
+editorialized
+editorializer
+editorializes
+editorializing
+enameled
+enameler
+enamelers
+enameling
+enamelings
+endeavor
+endeavor's
+endeavored
+endeavorer
+endeavorer's
+endeavorers
+endeavoring
+endeavors
+enroll
+enrollment
+enrollment's
+enrollments
+enrolls
+epitomize
+epitomized
+epitomizer
+epitomizers
+epitomizes
+epitomizing
+equaled
+equaling
+equalization
+equalization's
+equalizations
+equalize
+equalized
+equalizer
+equalizer's
+equalizers
+equalizes
+equalizing
+equalizings
+esthetic
+esthetic's
+esthetically
+esthetics
+eviler
+evilest
+factorization
+factorization's
+factorizations
+familiarization
+familiarization's
+familiarizations
+familiarize
+familiarized
+familiarizer
+familiarizers
+familiarizes
+familiarizing
+familiarizingly
+fantasize
+fantasized
+fantasizer
+fantasizes
+fantasizing
+favor
+favor's
+favorable
+favorable's
+favorableness
+favorables
+favorably
+favored
+favored's
+favoredly
+favoredness
+favoreds
+favorer
+favorer's
+favorers
+favoring
+favoring's
+favoringly
+favorings
+favorite
+favorite's
+favorites
+favors
+fertilization
+fertilization's
+fertilizations
+fertilize
+fertilized
+fertilizer
+fertilizers
+fertilizes
+fertilizing
+fervor
+fervor's
+fervors
+fiber
+fiber's
+fibered
+fiberglass
+fibers
+finalization
+finalizations
+finalize
+finalized
+finalizes
+finalizing
+flavor
+flavor's
+flavored
+flavorer
+flavorer's
+flavorers
+flavoring
+flavorings
+flavors
+formalization
+formalization's
+formalizations
+formalize
+formalized
+formalizer
+formalizers
+formalizes
+formalizing
+fueled
+fueler
+fuelers
+fueling
+fulfill
+fulfillment
+fulfillment's
+fulfillments
+fulfills
+funneled
+funneling
+generalization
+generalization's
+generalizations
+generalize
+generalized
+generalizer
+generalizers
+generalizes
+generalizing
+glamorize
+glamorized
+glamorizer
+glamorizers
+glamorizes
+glamorizing
+gospeler
+gospelers
+gossiped
+gossiping
+gram
+gram's
+grams
+graveled
+graveling
+groveled
+groveler
+grovelers
+groveling
+grovelingly
+harbor
+harbor's
+harbored
+harborer
+harborer's
+harborers
+harboring
+harbors
+harmonize
+harmonized
+harmonizer
+harmonizers
+harmonizes
+harmonizing
+honor
+honorable
+honorable's
+honorableness
+honorables
+honorablies
+honorably
+honored
+honorer
+honorer's
+honorers
+honoring
+honors
+hospitalize
+hospitalized
+hospitalizes
+hospitalizing
+humor
+humor's
+humored
+humorer
+humorers
+humoring
+humors
+hypothesize
+hypothesized
+hypothesizer
+hypothesizers
+hypothesizes
+hypothesizing
+idealization
+idealization's
+idealizations
+idealize
+idealized
+idealizer
+idealizers
+idealizes
+idealizing
+imperiled
+incognizance
+incognizant
+individualize
+individualized
+individualizer
+individualizers
+individualizes
+individualizing
+individualizingly
+industrialization
+industrialization's
+industrializations
+informalizes
+initialed
+initialer
+initialing
+initialization
+initialization's
+initializations
+initialize
+initialized
+initializer
+initializers
+initializes
+initializing
+institutionalize
+institutionalized
+institutionalizes
+institutionalizing
+internalization
+internalization's
+internalizations
+internalize
+internalized
+internalizes
+internalizing
+italicize
+italicized
+italicizes
+italicizing
+itemization
+itemization's
+itemizations
+itemize
+itemized
+itemizer
+itemizers
+itemizes
+itemizing
+jeopardize
+jeopardized
+jeopardizes
+jeopardizing
+jeweled
+jeweler
+jewelers
+jeweling
+journalize
+journalized
+journalizer
+journalizers
+journalizes
+journalizing
+judgment
+judgment's
+judgments
+kidnaped
+kidnaper
+kidnaper's
+kidnapers
+kidnaping
+kidnaping's
+kidnapings
+kilogram
+kilogram's
+kilograms
+kilometer
+kilometer's
+kilometers
+labeled
+labeler
+labeler's
+labelers
+labeling
+labor
+labored
+labored's
+laboredly
+laboredness
+laborer
+laborer's
+laborers
+laboring
+laboring's
+laboringly
+laborings
+labors
+laureled
+legalization
+legalization's
+legalizations
+legalize
+legalized
+legalizes
+legalizing
+leveled
+leveler
+levelers
+levelest
+leveling
+liberalize
+liberalized
+liberalizer
+liberalizers
+liberalizes
+liberalizing
+license's
+linearizable
+linearize
+linearized
+linearizes
+linearizing
+linearizion
+liter
+liters
+localization
+localization's
+localizations
+localize
+localized
+localizer
+localizers
+localizes
+localizing
+luster
+lustered
+lustering
+lusters
+magnetization
+magnetization's
+magnetizations
+maneuver
+maneuvered
+maneuverer
+maneuvering
+maneuvers
+marveled
+marveling
+marvelous
+marvelously
+marvelousness
+materialize
+materialized
+materializer
+materializers
+materializes
+materializing
+maximize
+maximized
+maximizer
+maximizers
+maximizes
+maximizing
+mechanization
+mechanization's
+mechanizations
+mechanize
+mechanized
+mechanizer
+mechanizers
+mechanizes
+mechanizing
+medaled
+medaling
+memorization
+memorization's
+memorizations
+memorize
+memorized
+memorizer
+memorizers
+memorizes
+memorizing
+metaled
+metaling
+millimeter
+millimeter's
+millimeters
+miniaturization
+miniaturizations
+miniaturize
+miniaturized
+miniaturizes
+miniaturizing
+minimization
+minimization's
+minimizations
+minimize
+minimized
+minimizer
+minimizers
+minimizes
+minimizing
+misjudgment
+misjudgment's
+misjudgments
+miter
+mitered
+miterer
+mitering
+modeled
+modeler
+modelers
+modeling
+modelings
+modernize
+modernized
+modernizer
+modernizers
+modernizes
+modernizing
+modularization
+modularize
+modularized
+modularizes
+modularizing
+motorize
+motorized
+motorizes
+motorizing
+multileveled
+mustache
+mustached
+mustaches
+nationalization
+nationalization's
+nationalizations
+nationalize
+nationalized
+nationalizer
+nationalizers
+nationalizes
+nationalizing
+naturalization
+naturalization's
+naturalizations
+neighbor
+neighbor's
+neighbored
+neighborer
+neighborer's
+neighborers
+neighborhood
+neighborhood's
+neighborhoods
+neighboring
+neighborings
+neighborliness
+neighborly
+neighbors
+neutralize
+neutralized
+neutralizer
+neutralizers
+neutralizes
+neutralizing
+nickeled
+nickeling
+normalization
+normalization's
+normalizations
+normalize
+normalized
+normalizer
+normalizers
+normalizes
+normalizing
+notarize
+notarized
+notarizes
+notarizing
+odor
+odor's
+odored
+odors
+offense
+offense's
+offenses
+optimization
+optimization's
+optimizations
+optimize
+optimized
+optimizer
+optimizer's
+optimizers
+optimizes
+optimizing
+organizable
+organizable's
+organizables
+organization
+organization's
+organizational
+organizational's
+organizationally
+organizationals
+organizations
+organize
+organized
+organizer
+organizers
+organizes
+organizing
+oxidize
+oxidized
+oxidizer
+oxidizers
+oxidizes
+oxidizing
+oxidizings
+pajama
+pajama's
+pajamaed
+pajamas
+paneled
+paneling
+panelings
+paralleled
+paralleling
+parallelization
+parallelization's
+parallelizations
+parallelize
+parallelized
+parallelizer
+parallelizers
+parallelizes
+parallelizing
+paralyze
+paralyzed
+paralyzedlies
+paralyzedly
+paralyzer
+paralyzer's
+paralyzers
+paralyzes
+paralyzing
+paralyzinglies
+paralyzingly
+parameterizable
+parameterization
+parameterization's
+parameterizations
+parameterize
+parameterized
+parameterizes
+parameterizing
+parceled
+parceling
+parenthesized
+parlor
+parlor's
+parlors
+patronize
+patronized
+patronizer
+patronizers
+patronizes
+patronizing
+patronizing's
+patronizingly
+patronizings
+penalize
+penalized
+penalizes
+penalizing
+penciled
+penciling
+pencilings
+personalization
+personalization's
+personalizations
+personalize
+personalized
+personalizes
+personalizing
+petaled
+philosophize
+philosophized
+philosophizer
+philosophizers
+philosophizes
+philosophizing
+plow
+plowed
+plower
+plowing
+plowman
+plows
+pluralization
+pluralization's
+pluralizations
+pluralize
+pluralized
+pluralizer
+pluralizers
+pluralizes
+pluralizing
+polarization
+polarization's
+polarizations
+popularization
+popularization's
+popularizations
+popularize
+popularized
+popularizer
+popularizers
+popularizes
+popularizing
+practiced
+practicer
+practicing
+preinitialize
+preinitialized
+preinitializes
+preinitializing
+pressurize
+pressurized
+pressurizer
+pressurizers
+pressurizes
+pressurizing
+pretense
+pretenses
+pretension
+pretensions
+pretensive
+prioritize
+prioritized
+prioritizer
+prioritizers
+prioritizes
+prioritizing
+prioritizings
+productize
+productized
+productizer
+productizers
+productizes
+productizing
+proselytize
+proselytized
+proselytizer
+proselytizers
+proselytizes
+proselytizing
+publicize
+publicized
+publicizes
+publicizing
+pulverize
+pulverized
+pulverizer
+pulverizers
+pulverizes
+pulverizing
+quantization
+quantization's
+quantizations
+quantize
+quantized
+quantizer
+quantizer's
+quantizers
+quantizes
+quantizing
+quarreled
+quarreler
+quarrelers
+quarreling
+queuing
+randomize
+randomized
+randomizer
+randomizes
+randomizing
+rationalize
+rationalized
+rationalizer
+rationalizers
+rationalizes
+rationalizing
+reacclimatization
+reacclimatization's
+reacclimatizations
+reacknowledgment
+reacknowledgment's
+reacknowledgments
+reactualization
+reactualization's
+reactualizations
+reanalyze
+reanalyzed
+reanalyzer
+reanalyzers
+reanalyzes
+reanalyzing
+reapologizes
+reauthorization
+reauthorization's
+reauthorizations
+reauthorizes
+rebrutalizes
+recapitalization
+recapitalization's
+recapitalizations
+recapitalized
+recapitalizes
+recarbonization
+recarbonization's
+recarbonizations
+recarbonizer
+recarbonizers
+recarbonizes
+recategorized
+recentralization
+recentralization's
+recentralizations
+recentralizes
+recivilization
+recivilization's
+recivilizations
+recivilizes
+recognizability
+recognizable
+recognizably
+recognizance
+recognize
+recognized
+recognizedlies
+recognizedly
+recognizer
+recognizers
+recognizes
+recognizing
+recognizinglies
+recognizingly
+recolonization
+recolonization's
+recolonizations
+recolonizes
+recolored
+recolors
+reconceptualizing
+recriticizes
+recrystallized
+recrystallizes
+redialed
+refavors
+refertilization
+refertilization's
+refertilizations
+refertilizes
+refueled
+refueling
+reharmonizes
+rehonors
+reinitialize
+reinitialized
+reinitializes
+reinitializing
+reitemizes
+relabeled
+relabeler
+relabelers
+relabeling
+remagnetization
+remagnetization's
+remagnetizations
+rematerializes
+rememorizes
+remodeled
+remodeling
+renormalized
+renormalizes
+reorganization
+reorganization's
+reorganizations
+reorganize
+reorganized
+reorganizer
+reorganizers
+reorganizes
+reorganizing
+reoxidizes
+repatronizes
+reprogram
+reprograms
+repulverizes
+resepulchers
+restandardization
+restandardization's
+restandardizations
+restandardizes
+resterilizes
+resymbolization
+resymbolization's
+resymbolizations
+resymbolizes
+resynchronizations
+resynchronized
+resynchronizes
+resynthesizes
+retranquilizes
+reutilization
+reutilizes
+reveled
+reveler
+revelers
+reveling
+revelings
+revisualizes
+revolutionize
+revolutionized
+revolutionizer
+revolutionizers
+revolutionizes
+revolutionizing
+rigor
+rigor's
+rigors
+rivaled
+rivaling
+ruble
+ruble's
+rubles
+rumor
+rumor's
+rumored
+rumorer
+rumorer's
+rumorers
+rumoring
+rumors
+saber
+saber's
+sabered
+sabering
+sabers
+sanitize
+sanitized
+sanitizer
+sanitizes
+sanitizing
+savior
+savior's
+saviors
+savor
+savored
+savorer
+savorer's
+savorers
+savorier
+savories
+savoriest
+savoriness
+savoring
+savoringlies
+savoringly
+savors
+savory
+savory's
+scepter
+scepter's
+sceptered
+sceptering
+scepters
+scrutinize
+scrutinized
+scrutinizer
+scrutinizers
+scrutinizes
+scrutinizing
+scrutinizinglies
+scrutinizingly
+sepulcher
+sepulcher's
+sepulchered
+sepulchers
+sequentialize
+sequentialized
+sequentializes
+sequentializing
+serialization
+serialization's
+serializations
+serialize
+serialized
+serializes
+serializing
+shoveled
+shoveler
+shovelers
+shoveling
+shriveled
+shriveling
+signaled
+signaler
+signalers
+signaling
+siphon
+siphon's
+siphoned
+siphoning
+siphons
+socialize
+socialized
+socializer
+socializes
+socializing
+specialization
+specialization's
+specializations
+specialize
+specialized
+specializer
+specializers
+specializes
+specializing
+specialties
+specialty
+specialty's
+specter
+specter's
+spectered
+specters
+spiraled
+spiraling
+splendor
+splendor's
+splendors
+squirreled
+squirreling
+stabilize
+stabilized
+stabilizer
+stabilizers
+stabilizes
+stabilizing
+standardization
+standardization's
+standardizations
+standardize
+standardized
+standardizer
+standardizers
+standardizes
+standardizing
+stenciled
+stenciler
+stencilers
+stenciling
+sterilization
+sterilization's
+sterilizations
+sterilize
+sterilized
+sterilizer
+sterilizers
+sterilizes
+sterilizing
+stylized
+subsidize
+subsidized
+subsidizer
+subsidizers
+subsidizes
+subsidizing
+succor
+succored
+succorer
+succorer's
+succorers
+succoring
+succors
+summarization
+summarization's
+summarizations
+summarize
+summarized
+summarizer
+summarizers
+summarizes
+summarizing
+symboled
+symboling
+symbolization
+symbolization's
+symbolizations
+symbolize
+symbolized
+symbolizer
+symbolizers
+symbolizes
+symbolizing
+sympathize
+sympathized
+sympathizer
+sympathizers
+sympathizes
+sympathizing
+sympathizing's
+sympathizingly
+sympathizings
+synchronization
+synchronization's
+synchronizations
+synchronize
+synchronized
+synchronizer
+synchronizers
+synchronizes
+synchronizing
+synthesize
+synthesized
+synthesizer
+synthesizers
+synthesizes
+synthesizing
+systematize
+systematized
+systematizer
+systematizers
+systematizes
+systematizing
+tantalize
+tantalized
+tantalizer
+tantalizers
+tantalizes
+tantalizing
+tantalizinglies
+tantalizingly
+tantalizingness
+tantalizingnesses
+terrorize
+terrorized
+terrorizer
+terrorizers
+terrorizes
+terrorizing
+theater
+theater's
+theaters
+theorization
+theorization's
+theorizations
+theorize
+theorized
+theorizer
+theorizers
+theorizes
+theorizing
+tire's
+titer
+titers
+totaled
+totaler
+totaler's
+totalers
+totaling
+toweled
+toweling
+towelings
+tranquilize
+tranquilized
+tranquilizer
+tranquilizer's
+tranquilizers
+tranquilizes
+tranquilizing
+tranquilizing's
+tranquilizingly
+tranquilizings
+transistorize
+transistorized
+transistorizes
+transistorizing
+traveled
+traveler
+traveler's
+travelers
+traveling
+travelings
+trivialize
+trivialized
+trivializes
+trivializing
+troweler
+trowelers
+tumor
+tumor's
+tumored
+tumors
+tunneled
+tunneler
+tunnelers
+tunneling
+tunnelings
+unacclimatized
+unamortized
+unanalyzable
+unanalyzed
+unantagonized
+unantagonizing
+unapologizing
+unappetizing
+unappetizingly
+unarmored
+unauthorized
+unauthorizedly
+unauthorizedness
+unauthorizes
+unbaptized
+unbaptizes
+unbastardized
+unbrutalized
+unbrutalizes
+uncanceled
+uncapitalized
+uncategorized
+uncharacterized
+uncivilized
+uncivilizedly
+uncivilizedness
+uncivilizes
+uncolonized
+uncolonizes
+uncolored
+uncoloredly
+uncoloredness
+uncoloreds
+uncriticized
+uncriticizing
+uncriticizingly
+uncrystallized
+undefenses
+undishonored
+undisorganized
+uneconomizing
+unendeavored
+unepitomized
+unequaled
+unequalized
+unequalizes
+unfamiliarized
+unfavorable
+unfavorable's
+unfavorableness
+unfavorables
+unfavorably
+unfavored
+unfavored's
+unfavorings
+unfavorite
+unfavorite's
+unfavorites
+unfertilized
+unflavored
+unformalized
+ungeneralized
+unharmonized
+unharmonizes
+unhonorables
+unhonorablies
+unhonorably
+unhonored
+unhumored
+unidealized
+unindividualized
+unindividualizes
+uninitialized
+unionization
+unionize
+unionized
+unionizer
+unionizers
+unionizes
+unionizing
+unitalicized
+unitemized
+unjournalized
+unlabeled
+unlabored
+unlabored's
+unlaborings
+unlegalized
+unleveled
+unleveling
+unliberalized
+unlocalized
+unlocalizes
+unmechanized
+unmechanizes
+unmemorized
+unminimized
+unmodernized
+unmodernizes
+unmotorized
+unnationalized
+unneighbored
+unneighborliness
+unneighborly
+unneutralized
+unnormalized
+unnormalizes
+unoptimized
+unoptimizes
+unorganizable
+unorganizable's
+unorganizables
+unorganized
+unorganizedly
+unorganizedness
+unoxidized
+unparalleled
+unparameterized
+unparceled
+unpatronized
+unpatronizing's
+unpenalized
+unphilosophized
+unphilosophizes
+unpopularizes
+unpracticed
+unpulverized
+unpulverizes
+unraveled
+unraveling
+unrecognizable
+unrecognized
+unrecognizing
+unrecognizingly
+unreorganized
+unrivaled
+unrumored
+unsabered
+unsavored
+unsavoredly
+unsavoredness
+unscepters
+unscrutinized
+unscrutinizing
+unscrutinizingly
+unsepulchers
+unsiphons
+unsocialized
+unspecialized
+unspecializing
+unstandardized
+unsterilized
+unsubsidized
+unsuccored
+unsummarized
+unsymbolized
+unsympathized
+unsympathizing
+unsympathizing's
+unsympathizingly
+unsympathizings
+unsynchronized
+unsynthesized
+unsystematized
+unsystematizedly
+unsystematizing
+untantalized
+unterrorized
+untranquilized
+unverbalized
+unvictimized
+unvisualized
+unwomanized
+unwomanizes
+utilization
+utilize
+utilized
+utilizer
+utilizers
+utilizes
+utilizing
+valor
+valor's
+valors
+vandalize
+vandalized
+vandalizes
+vandalizing
+vapor
+vapor's
+vapored
+vaporer
+vaporer's
+vaporers
+vaporing
+vaporing's
+vaporingly
+vaporings
+vapors
+vectorization
+vectorizing
+verbalize
+verbalized
+verbalizer
+verbalizers
+verbalizes
+verbalizing
+victimize
+victimized
+victimizer
+victimizers
+victimizes
+victimizing
+victualer
+victualers
+vigor
+vigor's
+vigors
+visualize
+visualized
+visualizer
+visualizers
+visualizes
+visualizing
+wagoner
+wagoner's
+wagoners
+weaseled
+weaseling
+womanize
+womanized
+womanizer
+womanizers
+womanizes
+womanizing
+worshiped
+worshiper
+worshiper's
+worshipers
+worshiping
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.1 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.1
new file mode 100644
index 00000000000..eb0e6c806ee
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.1
@@ -0,0 +1,741 @@
+Christianizing
+Europeanization
+Europeanization's
+Europeanizations
+Europeanized
+Sanskritize
+acclimatize
+acclimatizer
+acclimatizers
+acclimatizes
+acclimatizing
+actualize
+actualized
+actualizes
+actualizing
+aggrandizement
+aggrandizement's
+aggrandizements
+americanized
+amortization
+amortization's
+amortizations
+animized
+annualized
+asshole
+asshole's
+assholes
+balkanization
+biosynthesized
+bucketfuls
+bureaucratization
+bureaucratization's
+bureaucratizations
+caliper
+calipers
+cancelate
+cancelated
+canonized
+cauterize
+cauterized
+cauterizes
+cauterizing
+caviler
+cavilers
+centerline
+centerlines
+civilizational
+civilizational's
+civilizationals
+cognizable
+colorimeter
+colorimeter's
+colorimeters
+colorimetry
+commercialization
+commercialization's
+commercializations
+communize
+communized
+communizes
+communizing
+computerization
+conventionalized
+crystallization
+crystallization's
+crystallizations
+decentralizing
+deemphasize
+deemphasized
+deemphasizer
+deemphasizers
+deemphasizes
+deemphasizing
+deglycerolized
+dehumanize
+dehumanized
+dehumanizes
+dehumanizing
+demineralization
+demineralization's
+demineralizations
+democratization
+democratization's
+democratizations
+democratize
+democratized
+democratizer
+democratizes
+democratizing
+demoralization
+demoralization's
+demoralizations
+demythologization
+demythologize
+demythologized
+demythologizer
+demythologizes
+demythologizing
+depersonalization
+depersonalization's
+depersonalizations
+depersonalized
+deputized
+destabilize
+destabilized
+destabilizes
+destabilizing
+destigmatization
+desynchronize
+desynchronized
+desynchronizes
+desynchronizing
+detribalize
+detribalized
+detribalizes
+detribalizing
+diagonalizable
+dialyzed
+diarrhea
+diarrhea's
+diarrheal
+diarrheas
+dichotomization
+digitalization
+digitalization's
+digitalizations
+digitization
+diopter
+discolored
+discolored's
+discoloredness
+discoloreds
+discolors
+disfavor
+disfavored
+disfavorer
+disfavorer's
+disfavorers
+disfavoring
+disfavors
+disheveled
+disorganization
+disorganization's
+disorganizations
+doweling
+downdraft
+draftier
+draftiness
+draftsperson
+drafty
+dramatization
+dramatization's
+dramatizations
+dramatize
+dramatized
+dramatizer
+dramatizers
+dramatizes
+dramatizing
+duelist
+duelists
+dynamized
+edema
+edema's
+edemas
+edematous
+emphasize
+emphasized
+emphasizer
+emphasizers
+emphasizes
+emphasizing
+energized
+energizes
+enthrall
+enthralls
+epicenter
+epicenter's
+epicenters
+esthete
+esthetes
+eulogize
+eulogized
+eulogizer
+eulogizers
+eulogizes
+eulogizing
+exorcize
+exorcized
+exorcizes
+exorcizing
+extemporize
+extemporized
+extemporizer
+extemporizers
+extemporizes
+extemporizing
+externalization
+externalization's
+externalizations
+favoritism
+favoritism's
+favoritisms
+federalize
+federalized
+federalizes
+federalizing
+fetid
+fetidly
+fetidness
+fetus
+fetus's
+fetuses
+fiberboard
+fossilized
+fraternize
+fraternized
+fraternizer
+fraternizers
+fraternizes
+fraternizing
+galvanizing
+generalizable
+generalizable's
+generalizables
+germanized
+gimbaled
+glottalization
+glycerolized
+grueling
+gruelingly
+gynecological
+gynecological's
+gynecologicals
+gynecologist
+gynecologist's
+gynecologists
+harmonization
+harmonization's
+harmonizations
+homeomorph
+homeopath
+homogenization
+homogenization's
+homogenizations
+homogenize
+homogenized
+homogenizer
+homogenizers
+homogenizes
+homogenizing
+honoree
+hospitalization
+hospitalization's
+hospitalizations
+humanize
+humanized
+humanizer
+humanizers
+humanizes
+humanizing
+hydrolyzed
+hypnotized
+hypophysectomized
+idolize
+idolized
+idolizer
+idolizers
+idolizes
+idolizing
+immobilize
+immobilized
+immobilizer
+immobilizes
+immobilizing
+immortalized
+immunization
+immunization's
+immunizations
+impersonalized
+industrialized
+industrializing
+inhumanizes
+institutionalization
+institutionalization's
+institutionalizations
+internationalization
+internationalization's
+internationalizations
+internationalized
+ionize
+ionized
+ionizer
+ionizers
+ionizes
+ionizing
+ionizings
+ionizion
+ionizions
+kinesthesis
+kinesthetic
+kinesthetically
+kinesthetics
+legitimize
+legitimized
+legitimizer
+legitimizes
+legitimizing
+libeler
+libelers
+libelous
+libelously
+liberalization
+liberalization's
+liberalizations
+licensable
+lionize
+lionized
+lionizer
+lionizers
+lionizes
+lionizing
+magnetized
+maneuverability
+maneuverable
+marbleized
+marbleizing
+maximization
+maximization's
+maximizations
+memorialized
+mesmerized
+metabolized
+metalization
+metalization's
+metalizations
+metropolitanization
+milligram
+milligram's
+milligrams
+milliliter
+milliliter's
+milliliters
+mineralized
+misbehavior
+misbehavior's
+misbehaviors
+misdemeanor
+misdemeanor's
+misdemeanors
+mobilization
+mobilization's
+mobilizations
+mobilize
+mobilized
+mobilizer
+mobilizes
+mobilizing
+modernization
+modernization's
+modernizations
+monetization
+monetize
+monetized
+monetizes
+monetizing
+monopolization
+monopolization's
+monopolizations
+monopolize
+monopolized
+monopolizer
+monopolizers
+monopolizes
+monopolizing
+multicolor
+multicolor's
+multicolored
+multicolors
+narcotizes
+nasalization
+nasalization's
+nasalizations
+nasalized
+naturalized
+neutralization
+neutralization's
+neutralizations
+nominalized
+novelized
+ocher
+ocher's
+ochers
+operationalization
+operationalizations
+operationalize
+operationalized
+orthogonalization
+orthogonalized
+orthopedic
+orthopedics
+ostracized
+outmaneuver
+outmaneuvered
+outmaneuvering
+outmaneuvers
+overemphasize
+overemphasized
+overemphasizer
+overemphasizers
+overemphasizes
+overemphasizing
+palatalization
+palatalize
+palatalized
+palatalizes
+palatalizing
+palletized
+panelization
+panelized
+parenthesize
+parenthesizes
+parenthesizing
+pasteurization
+pasteurizations
+pedaled
+pedaling
+peptizing
+platinize
+platinized
+platinizes
+platinizing
+plowshare
+plowshare's
+plowshares
+polarize
+polarized
+polarizer
+polarizers
+polarizes
+polarizing
+politicized
+polymerizations
+proletarianization
+proletarianized
+pronominalization
+pronominalize
+pummeled
+pyorrhea
+pyorrhea's
+pyorrheas
+pyrolyze
+pyrolyze's
+pyrolyzer
+pyrolyzes
+radiopasteurization
+radiosterilization
+radiosterilized
+rancor
+rancor's
+rancors
+randomization
+randomization's
+randomizations
+rationalization
+rationalization's
+rationalizations
+reacclimatizes
+reactualizes
+realizabilities
+realizability
+realizability's
+reconceptualization
+recrystallization
+recrystallization's
+recrystallizations
+recrystallize
+recrystallizing
+reemphasize
+reemphasized
+reemphasizer
+reemphasizers
+reemphasizes
+reemphasizing
+regularizing
+reharmonization
+rehumanizes
+remobilization
+remobilization's
+remobilizations
+remobilizes
+remonetization
+remonetize
+remonetized
+remonetizes
+remonetizing
+repopularize
+revaporization
+revaporization's
+revaporizations
+revisualization
+revisualization's
+revisualizations
+revitalization
+revitalize
+revitalized
+revitalizer
+revitalizers
+revitalizes
+revitalizing
+ritualized
+romanticize
+romanticizes
+romanticizing
+rubberized
+satirizes
+scandalized
+scandalizing
+sectionalized
+secularization
+secularization's
+secularizations
+secularized
+sensitized
+sentimentalize
+sentimentalized
+sentimentalizer
+sentimentalizers
+sentimentalizes
+sentimentalizing
+sexualized
+signalizes
+sniveled
+sniveler
+snivelers
+sniveling
+snivelings
+socialization
+socialization's
+socializations
+stabilization
+stabilization's
+stabilizations
+stigmatization
+stigmatization's
+stigmatizations
+stigmatized
+stylization
+stylization's
+stylizations
+subcategorizing
+subsidization
+subsidization's
+subsidizations
+substerilization
+suburbanization
+suburbanization's
+suburbanizations
+suburbanized
+suburbanizing
+swiveled
+swiveling
+systematization
+systematization's
+systematizations
+systemization
+systemization's
+systemizations
+teaseled
+teaseling
+teetotaler
+temporize
+temporized
+temporizer
+temporizer's
+temporizers
+temporizes
+temporizing
+temporizing's
+temporizingly
+temporizings
+theatergoer
+theatergoer's
+theatergoers
+theatergoing
+theatergoing's
+theatergoings
+thru
+tine's
+tinseled
+tinseling
+traditionalized
+travelog
+travelog's
+travelogs
+trialization
+triangularization
+triangularizations
+tricolor
+tricolor's
+tricolored
+tricolors
+tyrannize
+tyrannized
+tyrannizer
+tyrannizers
+tyrannizes
+tyrannizing
+tyrannizing's
+tyrannizingly
+tyrannizings
+unamortization
+unamortization's
+unamortizations
+uncanonized
+uncauterized
+uncauterized's
+uncauterizeds
+undemocratizes
+underutilization
+underutilized
+undialyzed
+undialyzed's
+undialyzeds
+undiscoloreds
+undramatized
+undramatized's
+undramatizeds
+unenergized
+unenergized's
+unenergizeds
+uneulogized
+uneulogized's
+uneulogizeds
+unfossilized
+unfossilized's
+unfossilizeds
+unfraternizing
+unfraternizing's
+unfraternizings
+unhydrolyzed
+unhydrolyzed's
+unhydrolyzeds
+unidolized
+unidolized's
+unidolizeds
+unimmortalized
+unindustrialized
+unindustrialized's
+unindustrializeds
+unitized
+universalize
+universalized
+universalizer
+universalizers
+universalizes
+universalizing
+unmagnetized
+unmagnetized's
+unmagnetizeds
+unmemorialized
+unmemorialized's
+unmemorializeds
+unmesmerized
+unmineralized
+unmineralized's
+unmineralizeds
+unmobilized
+unmobilized's
+unmobilizeds
+unmonopolized
+unmonopolizes
+unnaturalized
+unpatronizing
+unpolarized
+unpolarized's
+unpolarizeds
+unsatirizes
+unsavories
+unsavoriness
+unsavory
+unsavory's
+unscandalized
+unsecularized
+unsensitized
+unsentimentalizes
+unstigmatized
+unstigmatized's
+unstigmatizeds
+untemporizings
+untrammeled
+unvocalized
+unvocalized's
+unvocalizeds
+unvulcanized
+unvulcanized's
+unvulcanizeds
+updraft
+urbanization
+urbanization's
+urbanizations
+urbanized
+vacuolization
+vacuolization's
+vacuolizations
+vaporization
+vaporization's
+vaporizations
+varicolored
+varicolored's
+varicoloreds
+velarize
+velarized
+velarizes
+velarizing
+visualization
+visualization's
+visualizations
+vocalization
+vocalization's
+vocalizations
+vocalize
+vocalized
+vocalizer
+vocalizers
+vocalizes
+vocalizing
+volatilization
+volatilization's
+volatilizations
+vulcanized
+watercolor
+watercolor's
+watercolored
+watercoloring
+watercolorist
+watercolorists
+watercolors
+yodeled
+yodeler
+yodeling
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.2 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.2
new file mode 100644
index 00000000000..133e19e3675
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/american.2
@@ -0,0 +1,6767 @@
+Africanization
+Africanization's
+Africanizations
+Africanize
+Africanized
+Africanizes
+Africanizing
+Afrikanerization
+Afrikanerize
+Afrikanerized
+Afrikanerizes
+Afrikanerizing
+Americanization
+Americanization's
+Americanizations
+Americanize
+Americanizer
+Americanizers
+Americanizes
+Americanizing
+Anglicanize
+Anglicanizes
+Arabianize
+Arabianizes
+Arabicize
+Arabicizes
+Aryanization
+Aryanize
+Aryanized
+Aryanizes
+Aryanizing
+Asiaticization
+Asiaticization's
+Asiaticizations
+Asiaticize
+Asiaticizes
+Assyrianize
+Assyrianizes
+Australianize
+Australianizes
+Austrianize
+Austrianizes
+Babelize
+Babelizes
+Babylonize
+Babylonizes
+Balkanization
+Balkanization's
+Balkanizations
+Balkanize
+Balkanizes
+Berlinize
+Berlinizes
+Bessemerize
+Bessemerizes
+Birminghamize
+Birminghamizes
+Boswellize
+Boswellizes
+Byronize
+Byronizes
+Byzantinize
+Byzantinizes
+Caesarize
+Caesarizes
+Calvinize
+Calvinizes
+Canadianization
+Canadianization's
+Canadianizations
+Canadianize
+Canadianizes
+Caponization
+Catholicization
+Catholicized
+Catholicizing
+Celticize
+Celticizes
+Chablises
+Christianization
+Christianization's
+Christianizations
+Christianize
+Christianizer
+Christianizers
+Christianizes
+Ciceronianize
+Ciceronianizes
+Continentalize
+Continentalizes
+Corinthianize
+Corinthianizes
+Creolization
+Creolize
+Creolized
+Creolizes
+Creolizing
+Cubanize
+Cubanizes
+Czechization
+Czechization's
+Czechizations
+Danization
+Danization's
+Danizations
+Danize
+Danizes
+Darwinize
+Darwinizes
+Doricize
+Doricizes
+Edenization
+Edenization's
+Edenizations
+Edenize
+Edenizes
+Egyptianization
+Egyptianization's
+Egyptianizations
+Egyptianize
+Egyptianizes
+Egyptize
+Egyptizes
+Elizabethanize
+Elizabethanizes
+Englishize
+Englishizes
+Epicurize
+Epicurizes
+Episcopalianize
+Episcopalianizes
+Eskimoized
+Eskimoized's
+Eskimoizeds
+Essenize
+Essenizes
+Etna
+Europeanize
+Europeanizes
+Europeanizing
+Fletcherize
+Fletcherizes
+Francize
+Francizes
+Franklinization
+Franklinization's
+Franklinizations
+Frenchize
+Frenchizes
+Gaelicization
+Gaelicization's
+Gaelicizations
+Gaelicize
+Gaelicizes
+Gallicization
+Gallicize
+Gallicized
+Gallicizes
+Gallicizing
+Gothicize
+Gothicized
+Gothicizer
+Gothicizers
+Gothicizes
+Gothicizing
+Grecianize
+Grecianizes
+Greekize
+Greekizes
+Hanoverianize
+Hanoverianizes
+Hanoverize
+Hanoverizes
+Harvardize
+Harvardizes
+Harveyize
+Harveyizes
+Hattize
+Hattizes
+Hebraicize
+Hebraicizes
+Hegelianize
+Hegelianizes
+Hellenization
+Hellenizations
+Hellenize
+Hellenized
+Hellenizes
+Hellenizing
+Hispanicization
+Hispanicize
+Hispanicized
+Hispanicizes
+Hispanicizing
+Hollywoodize
+Hollywoodizes
+Hoosierize
+Hoosierizes
+Hooverize
+Hooverizes
+Iliadize
+Iliadizes
+Illuminize
+Illuminizes
+Ionicization
+Ionicization's
+Ionicizations
+Ionicize
+Ionicizes
+Iranize
+Iranizes
+Irishize
+Irishizes
+Islamization
+Islamization's
+Islamizations
+Islamize
+Islamized
+Islamizes
+Islamizing
+Israelitize
+Israelitizes
+Italianism
+Italianization
+Italianization's
+Italianizations
+Italianize
+Italianized
+Italianizer
+Italianizers
+Italianizes
+Italianizing
+Jacobinize
+Japanization
+Japanization's
+Japanizations
+Japanize
+Japanized
+Japanizes
+Japanizing
+Jesuitize
+Jesuitized
+Jesuitizes
+Jesuitizing
+Jonathanization
+Jonathanization's
+Jonathanizations
+Latinization
+Latinization's
+Latinizations
+Latinize
+Latinized
+Latinizer
+Latinizers
+Latinizes
+Latinizing
+Lilliputianize
+Lilliputianizes
+Listerize
+Listerizes
+Londonization
+Londonization's
+Londonizations
+Londonize
+Londonizes
+Lutheranize
+Lutheranizer
+Lutheranizers
+Lutheranizes
+Malayize
+Malayizes
+Manhattanize
+Manhattanizes
+Mediterraneanization
+Mediterraneanization's
+Mediterraneanizations
+Mediterraneanize
+Mediterraneanizes
+Melampus
+Mendelize
+Mendelizes
+Mexicanize
+Mexicanizes
+Midlandize
+Midlandizes
+Miltonize
+Miltonized
+Miltonizes
+Miltonizing
+Mohammedanization
+Mohammedanization's
+Mohammedanizations
+Mohammedanize
+Mohammedanized
+Mohammedanizes
+Mohammedanizing
+Molochize
+Molochizes
+Moravianized
+Moravianized's
+Moravianizeds
+Moslemize
+Moslemizes
+Napoleonize
+Napoleonizes
+Negroization
+Negroization's
+Negroizations
+Negroize
+Negroizes
+Newmanize
+Newmanizes
+Nipponize
+Nipponizes
+Normanization
+Normanization's
+Normanizations
+Normanize
+Normanized
+Normanizer
+Normanizers
+Normanizes
+Normanizing
+Occidentalization
+Occidentalization's
+Occidentalizations
+Occidentalize
+Occidentalized
+Occidentalizes
+Occidentalizing
+Olympianize
+Olympianizes
+Ottomanization
+Ottomanization's
+Ottomanizations
+Ottomanize
+Ottomanizes
+Parisianization
+Parisianization's
+Parisianizations
+Parisianize
+Parisianizes
+Pasteurizers
+Paulinize
+Paulinizes
+Paynize
+Paynizes
+Persianization
+Persianization's
+Persianizations
+Persianize
+Persianizes
+Peruvianize
+Peruvianizes
+Philistinize
+Philistinizes
+Presbyterianize
+Presbyterianizes
+Procrusteanize
+Procrusteanizes
+Protestantize
+Protestantizes
+Prussianization
+Prussianization's
+Prussianizations
+Prussianize
+Prussianized
+Prussianizer
+Prussianizers
+Prussianizes
+Prussianizing
+Pullmanize
+Pullmanizes
+Puritanize
+Puritanizer
+Puritanizers
+Puritanizes
+Pythagoreanize
+Pythagoreanizes
+Quakerization
+Quakerization's
+Quakerizations
+Quakerize
+Quakerizes
+Romania
+Romanization
+Romanization's
+Romanizations
+Romanize
+Romanized
+Romanizer
+Romanizers
+Romanizes
+Romanizing
+Russianization's
+Russianizations
+Russianized
+Russianizes
+Russianizing
+Sabbathize
+Sabbathizes
+Saxonization
+Saxonization's
+Saxonizations
+Saxonize
+Saxonizes
+Semiticize
+Semiticizes
+Semitization
+Semitization's
+Semitizations
+Semitize
+Semitizes
+Shakespearize
+Shakespearizes
+Shintoize
+Shintoizes
+Slavicize
+Slavicizes
+Slavization
+Slavization's
+Slavizations
+Slavize
+Slavizes
+Slavonicize
+Slavonicizes
+Sovietized
+Sovietizing
+Spaniardization
+Spaniardization's
+Spaniardizations
+Spaniardize
+Spaniardizes
+Spanishize
+Spanishizes
+Spartanize
+Spartanizes
+Syrianize
+Syrianizes
+Talmudization
+Talmudization's
+Talmudizations
+Talmudize
+Talmudizes
+Tammanyize
+Tammanyizes
+Taylorize
+Taylorizes
+Timonize
+Timonizes
+Toryize
+Toryizes
+Turkize
+Turkizes
+Tuscanize
+Tuscanizes
+Tylerize
+Tylerizes
+Unitarianize
+Unitarianizes
+Utopianize
+Utopianizes
+Vaticanization
+Vaticanization's
+Vaticanizations
+Vaticanize
+Vaticanizes
+Victorianize
+Victorianizes
+Vietnamization
+Vietnamize
+Vietnamized
+Vietnamizes
+Vietnamizing
+Wagnerize
+Wagnerizes
+Whitmanize
+Whitmanizes
+abnormalize
+abnormalizes
+abolitionize
+abolitionizes
+absolutization
+absolutization's
+absolutizations
+absolutize
+absolutizes
+accessorize
+acclimatizable
+acclimatizable's
+acclimatizables
+accouter
+accoutered
+accoutering
+accouters
+acculturize
+acetonization
+acetonization's
+acetonizations
+acetonize
+acetonizes
+achromatization
+achromatize
+achromatized
+achromatizes
+achromatizing
+acidize
+acidizes
+acronymize
+acronymizes
+actionize
+actionizes
+activize
+activizes
+adrenalize
+adrenalizes
+adulterize
+adulterizes
+adverbialize
+adverbializes
+aerosolization
+aestheticize
+aestheticizes
+agatize
+agatizes
+agenize
+aggrandizable
+aggrandizable's
+aggrandizables
+aggrandization
+aggrandize
+aggrandized
+aggrandizer
+aggrandizers
+aggrandizes
+aggrandizing
+agnize
+agnized
+agnizes
+agnizing
+agrarianize
+agrarianizes
+albumenization
+albumenize
+albumenized
+albumenizes
+albumenizing
+albuminization
+albuminization's
+albuminizations
+albuminize
+albuminizes
+alchemize
+alcoholizable
+alcoholizable's
+alcoholizables
+alcoholization
+alcoholization's
+alcoholizations
+alcoholize
+alcoholizes
+algebraization
+algebraization's
+algebraizations
+algebraize
+algebraizes
+alienize
+alienizes
+alkalinization
+alkalinization's
+alkalinizations
+alkalinize
+alkalinizes
+alkalization
+alkalize
+alkalized
+alkalizes
+alkalizing
+allegorization
+allegorize
+allegorized
+allegorizer
+allegorizes
+allegorizing
+alphabetization
+alphabetization's
+alphabetizations
+alternize
+alternizes
+aluminization
+aluminize
+aluminized
+aluminizes
+aluminizing
+amalgamatize
+amalgamatizes
+amalgamization
+amalgamization's
+amalgamizations
+amalgamize
+amalgamizes
+amor
+amor's
+amoralize
+amoralizes
+amorism
+amorism's
+amorisms
+amoristic
+amoristics
+amorphization
+amorphize
+amors
+amortizable
+amortizable's
+amortizables
+amortizement
+amortizement's
+amortizements
+anagrammatization
+anagrammatize
+analogism
+analogism's
+analogisms
+analogize
+analogizes
+analyzation
+anarchize
+anarchizes
+anathematization
+anathematize
+anathematized
+anathematizes
+anathematizing
+anatomize
+anemically
+anesthesiologist
+anesthesiology
+anesthetist
+anesthetization
+anesthetization's
+anesthetizations
+angelicize
+angelicizes
+angelize
+angelizes
+anglicization
+anglicization's
+anglicizations
+anglicize
+anglicized
+anglicizes
+angularization
+angularization's
+angularizations
+angularize
+angularizes
+anhydridization
+anhydridization's
+anhydridizations
+anhydridize
+anhydridizes
+animalization
+animalization's
+animalizations
+animalize
+animalized
+animalizes
+animalizing
+annalize
+annalizes
+annualization
+annualize
+annualizes
+annualizing
+anodization
+antagonization
+antagonization's
+antagonizations
+anthologization
+anthologize
+anthologized
+anthologizer
+anthologizes
+anthologizing
+anthracitization
+anthracitization's
+anthracitizations
+anthropomorphization
+anthropomorphize
+anthropomorphized
+anthropomorphizes
+anthropomorphizing
+anticatalyzer
+anticatalyzer's
+anticatalyzers
+anticentralization
+anticentralization's
+anticentralizations
+anticize
+anticizes
+antiepicenter
+antiepicenter's
+antiepicenters
+antifertilizer
+antifertilizer's
+antifertilizers
+antilabor
+antilabor's
+antilabors
+antioxidizer
+antioxidizer's
+antioxidizers
+antioxidizing
+antioxidizing's
+antioxidizings
+antipathize
+antipathizes
+antiquarianize
+antiquarianizes
+antirumor
+antirumor's
+antirumors
+antisensitize
+antisensitizer
+antisensitizer's
+antisensitizers
+antisensitizes
+antisepticize
+antisepticizes
+antiseptize
+antiseptizes
+antisiphon
+antisiphon's
+antisiphons
+antithesize
+antithesizes
+anviled
+anviling
+aphorize
+aphorized
+aphorizer
+aphorizers
+aphorizes
+aphorizing
+apostatization
+apostatize
+apostatized
+apostatizes
+apostatizing
+apostrophize
+apostrophized
+apostrophizes
+apostrophizing
+apotheosize
+appareling
+appetize
+appetized
+appetizement
+appetizement's
+appetizements
+appetizers
+appetizes
+arabization
+arabize
+arabized
+arabizes
+arabizing
+arbores
+arborization
+arborize
+arborized
+arborizes
+arborizing
+arcticize
+arcticizes
+arithmetization
+arithmetization's
+arithmetizations
+aromatization
+aromatize
+aromatized
+aromatizes
+aromatizing
+arsenicize
+arsenicizes
+arterialization
+arterialization's
+arterializations
+arterialize
+arterialized
+arterializes
+arterializing
+artificialize
+artificializes
+asafetida
+asepticize
+asepticizes
+astigmatizer
+astigmatizer's
+astigmatizers
+asynchronize
+asynchronized
+asynchronizes
+asynchronizing
+atomizability
+atomizable
+atticize
+atticizes
+attitudinization
+attitudinize
+attitudinized
+attitudinizes
+attitudinizing
+autoimmunization
+autoionization
+automatization
+automatization's
+automatizations
+automatize
+automatizes
+autotomize
+avianize
+azotization
+azotize
+azotized
+azotizes
+azotizing
+bachelorize
+bachelorizes
+baconize
+baconizes
+bacterize
+balladize
+balladizes
+balsamize
+balsamizes
+bantamize
+bantamizes
+baptizable
+baptizable's
+baptizables
+baptizement
+baptizement's
+baptizements
+barbarianize
+barbarianizes
+barbarization
+barbarize
+barbarized
+barbarizes
+barbarizing
+baronize
+baronizes
+bastardization
+bastardization's
+bastardizations
+beaverize
+beaverizes
+beclamor
+beclamored
+beclamoring
+beclamors
+becudgeled
+becudgeling
+bedlamize
+bedlamizes
+bedriveled
+bedriveling
+bejeweled
+bejeweling
+bemedaled
+bestialize
+bestialized
+bestializes
+bestializing
+beveler
+bevelers
+bichromatize
+bichromatizes
+bicolor
+bicolored
+bimetalist
+bimetalistic
+biographize
+biographizes
+biologize
+biologizes
+bipolarization
+bipolarize
+bipolarizes
+bister
+bistered
+bituminization
+bituminize
+bituminized
+bituminizes
+bituminizing
+bolshevize
+bonderize
+borize
+borizes
+botanize
+botanized
+botanizes
+botanizing
+boulevardize
+boulevardizes
+bourbonize
+bourbonizes
+bowdlerization
+boweled
+boweling
+brominize
+brominizes
+brutalization
+brutalization's
+brutalizations
+bureaucratize
+bureaucratized
+bureaucratizes
+busheler
+bushelers
+cadaverize
+cadaverizes
+cadmiumize
+cadmiumizes
+canaler
+canalers
+canalization
+canalization's
+canalizations
+canalize
+canalized
+canalizes
+canalizing
+cancelable
+cancelous
+cannibalization
+cannibalization's
+cannibalizations
+canonization
+canonization's
+canonizations
+canonize
+canonizer
+canonizers
+canonizes
+canonizing
+capitalizable
+capitalizable's
+capitalizables
+caponize
+caponized
+caponizes
+caponizing
+capsulization
+capsulize
+capsulized
+capsulizes
+capsulizing
+caracoled
+caracoling
+caramelization
+caramelization's
+caramelizations
+caramelize
+caramelized
+caramelizes
+caramelizing
+carbolization
+carbolize
+carbolized
+carbolizes
+carbolizing
+carbonatization
+carbonatization's
+carbonatizations
+carbonizable
+carbonizable's
+carbonizables
+carburization
+carburize
+carburized
+carburizes
+carburizing
+carnalize
+carnalizes
+caroled
+caroler
+carolers
+caroling
+cartelization
+cartelization's
+cartelizations
+cartelize
+cartelizes
+castorized
+castorized's
+castorizeds
+catabolize
+cataloguize
+cataloguizes
+catalyze
+catalyzer
+catalyzer's
+catalyzers
+catalyzes
+catechizable
+catechizable's
+catechizables
+catechization
+catechization's
+catechizations
+catechize
+catechized
+catechizer
+catechizers
+catechizes
+catechizing
+catheterization
+catheterization's
+catheterizations
+catheterize
+catheterizes
+catheti
+catheti's
+cathetis
+catholicize
+catholicizer
+catholicizers
+catholicizes
+causticization
+causticization's
+causticizations
+causticize
+causticizer
+causticizers
+causticizes
+cauterization
+cauterization's
+cauterizations
+cavilation
+caviled
+caviling
+cavilings
+celestialize
+celestializes
+centerable
+centerable's
+centerables
+centerboard
+centerless
+centigram
+centigram's
+centigrams
+centiliter
+centrifugalization
+centrifugalization's
+centrifugalizations
+centrifugalize
+centrifugalizes
+cephalization
+cerebralization
+cerebralization's
+cerebralizations
+cerebralize
+cerebralizes
+ceremonialize
+ceremonializes
+chameleonize
+chameleonizes
+championize
+championizes
+channelization
+channelization's
+channelizations
+channelize
+channelizes
+chattelization
+chattelization's
+chattelizations
+chattelize
+chattelizes
+cheerfulize
+cheerfulizes
+chemicalization
+chemicalization's
+chemicalizations
+chemicalize
+chemicalizes
+chiseling
+chiselings
+chloridize
+chloridizes
+chlorinize
+chlorinizes
+chloroformization
+chloroformization's
+chloroformizations
+chloroformize
+chloroformizes
+chorization
+chorization's
+chorizations
+chromatize
+chromatizes
+chromicize
+chromicizes
+chromize
+chromized
+chromizes
+chromizing
+chronologize
+chronologizes
+cinchonize
+cinematize
+circularization
+circularization's
+circularizations
+circularize
+circularized
+circularizer
+circularizers
+circularizes
+circularizing
+citizenize
+citizenizes
+civilianization
+civilianizations
+civilianize
+civilianized
+civilianizes
+civilianizing
+civilizable
+civilizable's
+civilizables
+clangor
+clangor's
+clangored
+clangoring
+clangors
+classicalize
+classicalizes
+classicization
+classicize
+classicized
+classicizes
+classicizing
+clericalize
+clericalizes
+climatize
+climatizes
+coalize
+coalizer
+coalizers
+coalizes
+cocainization
+cocainization's
+cocainizations
+cocainize
+cocainizes
+coeducationalize
+coeducationalizes
+coenamor
+coenamored
+coenamoring
+coenamors
+coequalize
+coequalizes
+cognizably
+cognize
+cognized
+cognizer
+cognizers
+cognizes
+cognizing
+collateralize
+collectivization
+collectivization's
+collectivizations
+collectivize
+collectivized
+collectivizes
+colloquialize
+colloquializes
+colonialize
+colonializes
+colonizabilities
+colonizability
+colonizability's
+colonizable
+colonizable's
+colonizables
+colonizationist
+colonizationist's
+colonizationists
+colorabilities
+colorability
+colorability's
+colorable
+colorable's
+colorableness
+colorables
+colorablies
+colorably
+colorama
+colorant
+colorants
+colorcast
+colorcaster
+colorcasters
+colorfast
+colorfastness
+colorific
+colorimetric
+colorimetrically
+colorism
+colorisms
+colorist
+colorist's
+coloristic
+coloristically
+coloristics
+colorists
+colorization
+colorization's
+colorizations
+colorize
+colorizes
+colorman
+colormap
+colormap's
+colormaps
+colormen
+columnization
+columnization's
+columnizations
+commercialize
+commercialized
+commercializes
+commercializing
+commonize
+commonizes
+communalization
+communalization's
+communalizations
+communalize
+communalized
+communalizer
+communalizers
+communalizes
+communalizing
+communization
+communization's
+communizations
+companionize
+companionizes
+compartmentalization
+compartmentalization's
+compartmentalizations
+compartmentize
+compartmentizes
+complementizer
+computerizable
+concenter
+concertize
+concertizer
+concertizers
+concertizes
+concretization
+concretizations
+concretize
+concretized
+concretizes
+concretizing
+conditionalize
+conditionalizes
+confederatize
+confederatizes
+congenialize
+congenializes
+congregationalize
+congregationalizes
+conservatize
+conservatized
+conservatizes
+conservatizing
+consonantize
+consonantizes
+constitutionalization
+constitutionalization's
+constitutionalizations
+constitutionalize
+constitutionalizes
+containerization
+containerize
+containerized
+containerizes
+containerizing
+contemporization
+contemporize
+contemporized
+contemporizes
+contemporizing
+controversialize
+controversializes
+conundrumize
+conundrumizes
+conventionalization
+conventionalization's
+conventionalizations
+conventionalize
+conventionalizes
+conventionalizing
+conventionize
+conventionizes
+conversationize
+conversationizes
+conveyorize
+conveyorized
+conveyorizes
+conveyorizing
+convivialize
+convivializes
+copolymerization
+copolymerization's
+copolymerizations
+copolymerize
+copolymerized
+copolymerizes
+copolymerizing
+copperization
+copperization's
+copperizations
+copperize
+copperizes
+coraled
+corbeled
+corbeling
+corbelings
+cordialize
+cordializes
+corporealization
+corporealization's
+corporealizations
+corporealize
+corporealizes
+cosmopolitanization
+cosmopolitanization's
+cosmopolitanizations
+cosmopolitanize
+cosmopolitanizes
+cottonization
+cottonization's
+cottonizations
+cottonize
+cottonizes
+councilorship
+counselee
+counselorship
+crawlerize
+crawlerizes
+creaturize
+creaturizes
+crenelate
+crenelated
+crenelates
+crenelation
+creneled
+creneling
+cretinization
+cretinization's
+cretinizations
+cretinize
+cretinizes
+criminalization
+criminalization's
+criminalize
+criticizable
+criticizable's
+criticizables
+crofterization
+crofterization's
+crofterizations
+crofterize
+crofterizes
+cruelize
+cruelizes
+crystallizabilities
+crystallizability
+crystallizability's
+crystallizable
+crystallizable's
+crystallizables
+cudgeled
+cudgeler
+cudgelers
+cudgeling
+cudgelings
+culturization
+culturization's
+culturizations
+culturize
+culturizes
+cupelation
+cupeled
+cupeler
+cupelers
+cupeling
+curarize
+curarized
+curarizes
+curarizing
+curatize
+curatizes
+curricularization
+curricularization's
+curricularizations
+curricularize
+curricularizes
+cutinize
+cutinized
+cutinizes
+cutinizing
+cutization
+cutization's
+cutizations
+cyclization
+cyclization's
+cyclizations
+cyclize
+cyclized
+cyclizes
+cyclizing
+dandyize
+dandyizes
+dastardize
+dastardizes
+deaconize
+deaconizes
+deaminize
+decaliter
+decaliters
+decameter
+decameter's
+decameters
+decarbonization
+decarbonize
+decarbonized
+decarbonizer
+decarbonizes
+decarbonizing
+decarburization
+decarburize
+decarburized
+decarburizes
+decarburizing
+decasualization
+decentralizationist
+decentralize
+decentralizes
+decigram
+decigram's
+decigrams
+deciliter
+deciliters
+decimalization
+decimalization's
+decimalizations
+decimalize
+decimalized
+decimalizes
+decimalizing
+decimeter
+decimeter's
+decimeters
+decolonization
+decolonize
+decolonized
+decolonizes
+decolonizing
+decolor
+decolorant
+decolorants
+decolorate
+decolorated
+decolorates
+decolored
+decoloring
+decolorise
+decolorised
+decolorises
+decolorization
+decolorize
+decolorized
+decolorizer
+decolorizes
+decolors
+decriminalization
+decriminalization's
+decriminalize
+deemphasization
+deemphasization's
+deenergize
+deenergized
+deenergizer
+deenergizes
+deenergizing
+defeminize
+defeminized
+defeminizes
+defeminizing
+defenseman
+definitization
+definitization's
+definitizations
+definitize
+definitized
+definitizes
+definitizing
+deflectionization
+deflectionization's
+deflectionizations
+deflectionize
+deflectionizes
+deformalize
+defunctionalization
+defunctionalization's
+defunctionalizations
+defunctionalize
+defunctionalizes
+dehumanization
+dehumanization's
+dehumanizations
+dehypnotization
+dehypnotize
+dehypnotized
+dehypnotizes
+dehypnotizing
+deindustrialization
+deindustrialize
+deionization
+deionize
+deionizes
+dekagram
+dekagram's
+dekagrams
+dekaliter
+dekameter
+dekameter's
+dekameters
+delimitize
+delimitizes
+delocalization
+delocalize
+deluster
+demagnetizable
+demagnetizable's
+demagnetizables
+demagnetization
+demagnetization's
+demagnetizations
+demagnetize
+demagnetized
+demagnetizer
+demagnetizers
+demagnetizes
+demagnetizing
+dematerialization
+dematerialize
+dematerialized
+dematerializes
+dematerializing
+demilitarization
+demilitarize
+demilitarized
+demilitarizes
+demilitarizing
+demineralize
+demineralized
+demineralizer
+demineralizes
+demineralizing
+demobilization
+demobilize
+demobilized
+demobilizes
+demobilizing
+demonetization
+demonetize
+demonetized
+demonetizes
+demonetizing
+demonization
+demonize
+demonized
+demonizes
+demonizing
+denationalization
+denationalize
+denationalized
+denationalizes
+denationalizing
+denaturalization
+denaturalize
+denaturalized
+denaturalizes
+denaturalizing
+denaturization
+denaturization's
+denaturizations
+denaturize
+denaturizer
+denaturizers
+denaturizes
+denicotinize
+denizenize
+denizenizes
+denominationalize
+denominationalizes
+denormalize
+dentalization
+dentalization's
+dentalizations
+dentalize
+dentalizes
+denuclearization
+denuclearize
+denuclearized
+denuclearizes
+denuclearizing
+deodorize
+deodorized
+deodorizes
+deodorizing
+deoxidizer
+departmentalization
+departmentalization's
+departmentalizations
+departmentalize
+departmentalizes
+departmentization
+departmentization's
+departmentizations
+departmentize
+departmentizes
+depersonalize
+depersonalizes
+depersonalizing
+depolarization
+depolarization's
+depolarizations
+depolarize
+depolarized
+depolarizer
+depolarizers
+depolarizes
+depolarizing
+depoliticization
+depoliticize
+depoliticized
+depoliticizes
+depoliticizing
+depolymerization
+depolymerize
+depolymerized
+depolymerizes
+depolymerizing
+depressurization
+depressurize
+depressurized
+depressurizes
+depressurizing
+deputationize
+deputationizes
+deputization
+deputize
+deputizes
+deputizing
+derationalization
+derationalization's
+derationalizations
+derationalize
+derationalizes
+deratization
+deratization's
+deratizations
+derealization
+deregulationize
+deregulationizes
+desalinization
+desalinize
+desensitization
+desensitization's
+desensitizations
+desensitize
+desensitized
+desensitizer
+desensitizers
+desensitizes
+desensitizing
+desexualization
+desexualize
+desexualized
+desexualizes
+desexualizing
+despiritualization
+despiritualize
+despotize
+despotizes
+destabilization
+destalinize
+destalinized
+destalinizes
+destalinizing
+desterilize
+desulfurization
+desulfurize
+desulphurization
+desulphurize
+desulphurized
+desulphurizes
+desulphurizing
+desynchronization
+detribalization
+detribalization's
+detribalizations
+develed
+develing
+deviled
+deviling
+devilize
+devilizes
+devitalization
+devitalize
+devitalized
+devitalizes
+devitalizing
+devocalize
+devolatilization
+devolatilize
+devolatilized
+devolatilizes
+devolatilizing
+diabolization
+diabolize
+diabolized
+diabolizes
+diabolizing
+diagonalization
+diagonalize
+diagonalizes
+dialecticize
+dialecticizes
+dialist
+dialists
+dialyzabilities
+dialyzability
+dialyzability's
+dialyzable
+dialyzable's
+dialyzables
+dialyze
+dialyzer
+dialyzer's
+dialyzers
+dialyzes
+diamondize
+diamondizes
+diarrheic
+diarrhetic
+dieselization
+dieselization's
+dieselizations
+dieselize
+dieselizes
+differentialize
+differentializes
+digitalize
+digitalized
+digitalizes
+digitalizing
+dimensionalization
+dimensionalize
+dimensionalized
+dimensionalizes
+dimensionalizing
+dimerization
+dimerization's
+dimerizations
+dimerize
+dimerized
+dimerizes
+dimerizing
+diminutivize
+diminutivizes
+diphthongization
+diphthongization's
+diphthongizations
+diphthongize
+diphthongizes
+diplomatize
+diplomatizes
+disangularize
+disangularizes
+disauthorize
+disauthorizes
+disboweled
+disboweling
+discanonization
+discanonization's
+discanonizations
+discanonize
+discanonizes
+discolor
+discolor's
+discoloration
+discoloring
+discolorization
+discolorization's
+discolorizations
+discolorment
+discolorment's
+discolorments
+discretization
+discretize
+disdenominationalize
+disdenominationalizes
+disdiplomatize
+disdiplomatizes
+disemboweled
+disemboweling
+disenamor
+disenamor's
+disenamors
+disenthrall
+disenthralls
+disharmonize
+disharmonizes
+disheveler
+disheveling
+dishonorable
+dishonorable's
+dishonorableness
+dishonorables
+dishonorablies
+dishonorably
+dishumanize
+dishumanizes
+dishumor
+dishumored
+dishumors
+disillusionize
+disillusionizer
+disillusionizers
+disillusionizes
+disindividualize
+disindividualizes
+dismalize
+dismalizes
+disnaturalization
+disnaturalization's
+disnaturalizations
+disnaturalize
+disnaturalizes
+disorganize
+disorganizer
+disorganizers
+disorganizes
+disorganizing
+disozonize
+disozonizes
+dispapalize
+dispapalizes
+dispauperize
+dispauperizes
+dispersonalize
+dispersonalizes
+dispopularize
+dispopularizes
+disrealize
+disrealizes
+disscepter
+disscepter's
+disscepters
+disseize
+disseized
+disseizes
+disseizin
+disseizing
+disseizins
+disseizor
+disseizors
+dissensualize
+dissensualizes
+dissocialize
+dissympathize
+dissympathizes
+disutilize
+disutilizes
+divinization
+divinization's
+divinizations
+divinize
+divinized
+divinizes
+divinizing
+dizequalise
+dizequalise's
+dizequaliser
+dizequalisers
+dizequalises
+dizorganisation
+dizorganise
+dockization
+dockization's
+dockizations
+dockize
+dockizes
+doctorization
+doctorization's
+doctorizations
+doctorize
+doctorizes
+doctrinization
+doctrinization's
+doctrinizations
+doctrinize
+doctrinizes
+documentize
+documentizes
+dogmatization
+dogmatize
+dogmatizer
+dognaped
+dognaping
+dolomitization
+dolomitization's
+dolomitizations
+dolomitize
+dolomitizes
+dolor
+domesticize
+domesticizes
+doweled
+doweler
+draftboard
+draftily
+draftsmanship
+dragonize
+dragonizes
+dramatizable
+dramatizable's
+dramatizables
+driveled
+driveler
+drivelers
+driveling
+dualization
+dualization's
+dualizations
+dualize
+dualizes
+ductilize
+ductilizes
+easternize
+ebonization
+ebonize
+ebonized
+ebonizes
+ebonizing
+ecclesiasticize
+ecclesiasticizes
+echoize
+echoizes
+eclecticize
+eclecticizes
+economization
+economization's
+economizations
+ecstaticize
+ecstaticizes
+editorialization
+effectualize
+effectualizes
+effeminatize
+effeminatizes
+egoize
+egoizer
+egoizers
+egoizes
+egyptus
+elasticization
+elasticize
+elasticized
+elasticizer
+elasticizers
+elasticizes
+elasticizing
+electricalize
+electricalizes
+electricize
+electricizes
+electroanesthesia
+electroanesthesia's
+electroanesthesias
+electrocauterization
+electrocauterization's
+electrocauterizations
+electrodialyze
+electrodialyzer
+electrodialyzer's
+electrodialyzers
+electrodialyzes
+electrogalvanize
+electrogalvanizes
+electrohomeopathies
+electrohomeopathy
+electrohomeopathy's
+electrolyze
+electrolyzed
+electrolyzes
+electrolyzing
+electromagnetizable
+electrotonize
+electrotonizes
+elegize
+elegized
+elegizes
+elegizing
+elementalize
+elementalizes
+emblematicize
+emblematicizes
+emblematization
+emblematize
+emblematized
+emblematizes
+emblematizing
+emblemize
+emblemizes
+embolization
+emboweled
+emboweling
+emotionalization
+emotionalization's
+emotionalizations
+emotionalize
+emotionalized
+emotionalizes
+emotionalizing
+emotionize
+emotionizes
+empaneled
+empaneling
+empathize
+empathized
+empathizes
+empathizing
+emulsionize
+emulsionizes
+enamelist
+enamelists
+enamor
+enamor's
+enamored
+enamored's
+enamoredness
+enamoreds
+enamoring
+enamorment
+enamorment's
+enamorments
+enamors
+enarbor
+enarbor's
+enarbors
+encarnalization
+encarnalize
+encarnalized
+encarnalizes
+encarnalizing
+encolor
+encolor's
+encolored
+encoloring
+encolors
+energization
+energize
+energizer
+energizers
+energizing
+engram
+engram's
+engrams
+engrandize
+engrandizement
+engrandizement's
+engrandizements
+engrandizes
+enhypostatize
+enhypostatizes
+enolization
+enolization's
+enolizations
+enolize
+enolizes
+ensepulcher
+ensepulcher's
+ensepulchers
+ensorceled
+ensorcels
+enthrallment
+enthrallment's
+enthrallments
+enthronization
+enthronization's
+enthronizations
+enthronize
+enthronizes
+entomologize
+entomologized
+entomologizes
+entomologizing
+envapor
+envapor's
+envapors
+envenomization
+eonism
+eonism's
+eonisms
+epigrammatization
+epigrammatize
+epigrammatized
+epigrammatizer
+epigrammatizes
+epigrammatizing
+epitaphize
+epitaphizes
+epithetize
+epithetizes
+epitomization
+epitomization's
+epitomizations
+epoches
+equestrianize
+equestrianizes
+ergotized
+ergotizes
+eroticization
+eroticize
+eroticized
+eroticizes
+eroticizing
+esophagus
+essentialize
+essentializes
+esterization
+esterization's
+esterizations
+esterize
+esterizes
+esthesia
+esthesiometer
+esthesiometer's
+esthesiometers
+esthesis
+eternalization
+eternalization's
+eternalizations
+eternalize
+eternalized
+eternalizes
+eternalizing
+eternize
+eternized
+eternizes
+eternizing
+etherealization
+etherealization's
+etherealizations
+etherealize
+etherealized
+etherealizes
+etherealizing
+etherization
+etherization's
+etherizations
+etherize
+etherized
+etherizer
+etherizers
+etherizes
+etherizing
+ethicization
+ethicize
+ethicized
+ethicizes
+ethicizing
+ethnicize
+ethnicizes
+etiologies
+etiology
+etiology's
+etymologization
+etymologize
+etymologized
+etymologizes
+etymologizing
+euhemerize
+eulogization
+eulogization's
+eulogizations
+euphemize
+euphemized
+euphemizer
+euphemizes
+euphemizing
+euphonization
+euphonize
+euphonized
+euphonizes
+euphonizing
+evangelization
+evangelization's
+evangelizations
+evangelize
+evangelized
+evangelizer
+evangelizers
+evangelizes
+evangelizing
+eventualize
+eventualizes
+evolutionize
+evolutionizes
+excursionize
+excursionizes
+exhibitionize
+exhibitionizes
+existentialize
+existentializes
+experimentalize
+experimentalizes
+experimentize
+experimentizes
+extemporization
+extemporization's
+extemporizations
+exteriorization
+exteriorization's
+exteriorizations
+exteriorize
+exteriorized
+exteriorizes
+exteriorizing
+externalize
+externalized
+externalizes
+externalizing
+facsimilize
+facsimilizes
+factorize
+factorized
+factorizes
+factorizing
+fanaticize
+fanaticized
+fanaticizes
+fanaticizing
+faradization
+faradization's
+faradizations
+faradize
+faradized
+faradizer
+faradizers
+faradizes
+faradizing
+fascisticization
+fascisticization's
+fascisticizations
+fascisticize
+fascisticizes
+fascistization
+fascistization's
+fascistizations
+fascistize
+fascistized
+fascistizes
+fascistizing
+fashionize
+fashionizes
+fatalize
+fatalizes
+favorless
+favorlesses
+fecundize
+fecundizes
+federalization
+federalization's
+federalizations
+femalize
+femalizes
+feminization
+feminizations
+feminize
+feminized
+feminizes
+feminizing
+ferreled
+ferreling
+ferritization
+ferritization's
+ferritizations
+fertilizable
+fertilizable's
+fertilizables
+fertilizational
+fertilizational's
+fertilizationals
+fervorless
+fervorlesses
+fetalization
+fetalization's
+fetalizations
+fetishization
+fetishization's
+fetishizations
+fetishize
+fetishized
+fetishizes
+fetishizing
+feudalizable
+feudalizable's
+feudalizables
+feudalization
+feudalization's
+feudalizations
+feudalize
+feudalized
+feudalizes
+feudalizing
+fiberization
+fiberize
+fiberized
+fiberizer
+fiberizer's
+fiberizers
+fiberizes
+fiberizing
+fiberless
+fiberlesses
+fibrize
+fibrizer
+fibrizers
+fibrizes
+fictionalization
+fictionalize
+fictionalized
+fictionalizes
+fictionalizing
+fictionization
+fictionization's
+fictionizations
+fictionize
+fictionizes
+figurize
+figurizes
+filmize
+filmizes
+fiscalization
+fiscalization's
+fiscalizations
+fiscalize
+fiscalizes
+flamboyantize
+flamboyantizes
+flanneled
+flanneling
+flavorful
+flavorfully
+flavorless
+flavorlesses
+flavorsome
+flavory
+floralize
+floralizes
+fluidization
+fluidization's
+fluidizations
+fluidize
+fluidized
+fluidizer
+fluidizes
+fluidizing
+fluoridization
+fluoridization's
+fluoridizations
+fluoridize
+fluoridizes
+focalization
+focalization's
+focalizations
+focalize
+focalized
+focalizes
+focalizing
+foreignization
+foreignization's
+foreignizations
+foreignize
+foreignizes
+forejudgment
+forejudgment's
+forejudgments
+formalizable
+formularization
+formularizations
+formularize
+formularized
+formularizer
+formularizes
+formularizing
+formulization
+formulizations
+formulize
+formulized
+formulizes
+formulizing
+forumize
+forumizes
+fossiled
+fossilizable
+fossilizable's
+fossilizables
+fossilization
+fossilization's
+fossilizations
+fossilize
+fossilizes
+fossilizing
+fractionalization
+fractionalize
+fractionalized
+fractionalizes
+fractionalizing
+fractionization
+fractionization's
+fractionizations
+fractionize
+fractionizes
+fragmentize
+fragmentized
+fragmentizer
+fragmentizes
+fragmentizing
+fraternization
+fraternization's
+fraternizations
+frictionize
+frictionizes
+frivoled
+frivoler
+frivoling
+fuelizer
+fuelizer's
+fuelizers
+functionalize
+functionalizes
+functionize
+functionizes
+funeralize
+funeralizes
+funneler
+futilize
+futilizes
+futurize
+futurizes
+gallantize
+gallantizes
+galvanization
+galvanization's
+galvanizations
+galvanize
+galvanized
+galvanizer
+galvanizers
+galvanizes
+gamboled
+gamboling
+gardenize
+gardenizes
+gaveled
+gaveler
+gaveling
+gelatinizabilities
+gelatinizability
+gelatinizability's
+gelatinizable
+gelatinizable's
+gelatinizables
+gelatinization
+gelatinization's
+gelatinizations
+gelatinize
+gelatinized
+gelatinizer
+gelatinizers
+gelatinizes
+gelatinizing
+generalizability
+generalizational
+genialize
+genializes
+genteelize
+genteelizes
+gentilization
+gentilization's
+gentilizations
+gentilize
+gentilizes
+gentlemanize
+gentlemanizes
+geologize
+geologized
+geologizes
+geologizing
+geometricize
+geometricizes
+geometrize
+geometrized
+geometrizes
+geometrizing
+germanization
+germanization's
+germanizations
+germanize
+germanizer
+germanizers
+germanizes
+germanizing
+ghettoization
+ghettoization's
+ghettoizations
+ghettoize
+ghettoized
+ghettoizes
+ghettoizing
+giantize
+giantizes
+gimbaling
+glacialize
+glacializes
+glamorization
+glamorizations
+glamorless
+globalization
+globalizations
+globalize
+globalized
+globalizes
+globalizing
+glottalize
+glottalizes
+gluttonize
+gluttonizes
+glycerinize
+glycerinizes
+glycerolize
+glycerolizes
+glycogenize
+glycogenizes
+gnosticize
+gnosticizer
+gnosticizers
+gnosticizes
+goddize
+goddizes
+goiter
+goiters
+gonorrhea
+gonorrheal
+gorgonize
+gorgonized
+gorgonizes
+gorgonizing
+gormandize
+gormandized
+gormandizer
+gormandizes
+gormandizing
+gospelize
+gospelizes
+gourmandize
+gourmandized
+gourmandizes
+gourmandizing
+governmentalize
+governmentalized
+governmentalizes
+governmentalizing
+grammaticize
+grammaticizes
+grangerize
+grangerized
+grangerizer
+grangerizes
+grangerizing
+granitization
+granitization's
+granitizations
+granitize
+granitizes
+granulize
+granulizes
+graphitizable
+graphitization
+graphitization's
+graphitizations
+graphitize
+graphitizes
+grecize
+grecized
+grecizing
+grueled
+grueler
+gruelers
+gutturalization
+gutturalization's
+gutturalizations
+gutturalize
+gutturalized
+gutturalizes
+gutturalizing
+gynecocrat
+gynecocratic
+gynecologic
+gynecologics
+gynecologies
+gynecology
+gynecology's
+gyrostabilizer
+habitualize
+habitualizes
+hamletization
+hamletization's
+hamletizations
+hamletize
+hamletizes
+handseled
+handseling
+hanseled
+hanseling
+harborage
+harborages
+harborful
+harborless
+harborlesses
+harmonizable
+harmonizable's
+harmonizables
+hatcheled
+hatcheling
+hazardize
+hazardizes
+heathenization
+heathenize
+heathenized
+heathenizes
+heathenizing
+heavenize
+heavenizes
+hebraization
+hebraizations
+hebraize
+hebraized
+hebraizes
+hebraizing
+hectogram
+hectogram's
+hectograms
+hectoliter
+hectometer
+hectometer's
+hectometers
+heparinize
+hepatize
+hepatized
+hepatizes
+hepatizing
+heraldize
+heraldizes
+hereticize
+hereticizes
+heroinize
+heroinizes
+heroization
+heroization's
+heroizations
+heroize
+heroized
+heroizes
+heroizing
+hiccup
+hiccuped
+hiccuping
+hiccups
+hirseled
+hirseling
+historicize
+historicized
+historicizes
+historicizing
+homeopathic
+homeopathically
+homeopathies
+homeopathy
+homeopathy's
+homeostasis
+homeostatic
+homeotypic
+hominization
+hominized
+homologization
+homologize
+homologized
+homologizer
+homologizes
+homologizing
+honorabilities
+honorability
+honorability's
+honorableship
+honorableship's
+honorableships
+honorless
+honorlesses
+hoodlumize
+hoodlumizes
+hooliganize
+hooliganizes
+horizontalization
+horizontalization's
+horizontalizations
+horizontalize
+horizontalizes
+hormonize
+hormonizes
+horrorize
+horrorizes
+hostilize
+hostilizes
+hotelization
+hotelization's
+hotelizations
+hotelize
+hotelizes
+houseled
+houseling
+houselings
+hoveled
+hoveler
+hovelers
+hoveling
+hucksterize
+hucksterizes
+humanitarianize
+humanitarianizes
+humanization
+humanization's
+humanizations
+humoral
+humorize
+humorizes
+humorless
+humorlesses
+humorlessness
+humorsome
+hurricanize
+hurricanizes
+hyalinization
+hyalinization's
+hyalinizations
+hyalinize
+hyalinizes
+hybridizable
+hybridizable's
+hybridizables
+hybridization
+hybridization's
+hybridizations
+hybridize
+hybridized
+hybridizer
+hybridizers
+hybridizes
+hybridizing
+hydrocaryaceous
+hydrocaryaceouses
+hydrogenization
+hydrogenization's
+hydrogenizations
+hydrogenize
+hydrogenized
+hydrogenizes
+hydrogenizing
+hydrolyzable
+hydrolyzable's
+hydrolyzables
+hydrolyze
+hydrolyze's
+hydrolyzes
+hydroxylization
+hydroxylization's
+hydroxylizations
+hydroxylize
+hydroxylizes
+hygienization
+hygienization's
+hygienizations
+hygienize
+hygienizes
+hyperbolize
+hyperbolized
+hyperbolizes
+hyperbolizing
+hypercatharsises
+hypercivilization
+hypercivilization's
+hypercivilizations
+hypercivilized
+hypercivilized's
+hypercivilizeds
+hypercriticize
+hypercriticizes
+hyperemphasize
+hyperemphasizes
+hyperesthesia
+hyperesthetic
+hyperimmunization
+hyperimmunization's
+hyperimmunizations
+hyperimmunize
+hyperimmunizes
+hyperinsulinization
+hyperinsulinization's
+hyperinsulinizations
+hyperinsulinize
+hyperinsulinizes
+hyperoxygenize
+hyperoxygenizes
+hyperparasitize
+hyperparasitizes
+hyperrealize
+hyperrealizes
+hypersensitization
+hypersensitization's
+hypersensitizations
+hypersensitize
+hypersensitized
+hypersensitizes
+hypersensitizing
+hyperspiritualizing
+hyperspiritualizing's
+hyperspiritualizings
+hyperthyroidization
+hyperthyroidization's
+hyperthyroidizations
+hyperthyroidize
+hyperthyroidizes
+hypervitalization
+hypervitalization's
+hypervitalizations
+hypervitalize
+hypervitalizes
+hyphenization
+hyphenization's
+hyphenizations
+hyphenize
+hyphenizes
+hypnotizabilities
+hypnotizability
+hypnotizability's
+hypnotizable
+hypnotizable's
+hypnotizables
+hypnotization
+hypnotization's
+hypnotizations
+hypnotize
+hypnotizer
+hypnotizers
+hypnotizes
+hypnotizing
+hypocenter
+hyposensitization
+hyposensitize
+hypostatization
+hypostatization's
+hypostatizations
+hypostatize
+hypostatizes
+hysterectomize
+hysterectomized
+hysterectomizes
+hysterectomizing
+ichneumonized
+ichneumonized's
+ichneumonizeds
+idiotize
+idiotizes
+idolatrize
+idolatrized
+idolatrizes
+idolatrizing
+idolization
+idolization's
+idolizations
+illegalization
+illegalize
+illegalized
+illegalizes
+illegalizing
+illegitimatize
+illegitimatizes
+illutation
+illutation's
+illutations
+immaterialization
+immaterialize
+immaterialized
+immaterializes
+immaterializing
+immobilization
+immobilization's
+immobilizations
+immoralize
+immoralizes
+immortalizable
+immortalizable's
+immortalizables
+immortalization
+immortalization's
+immortalizations
+immortalize
+immortalizer
+immortalizers
+immortalizes
+immortalizing
+immunize
+immunized
+immunizes
+immunizing
+impactionize
+impactionizes
+impaneled
+impaneling
+imperialization
+imperialization's
+imperializations
+imperialize
+imperializes
+imperiling
+impersonalization
+impersonalization's
+impersonalizations
+impersonalize
+impersonalizes
+impersonalizing
+improvizatorize
+improvizatorizes
+individualization
+individualization's
+individualizations
+indraft
+industrialize
+industrializes
+inferiorize
+inferiorizes
+infernalize
+infernalizes
+infidelize
+infidelizes
+infinitize
+infinitizes
+informalize
+inhumanize
+initializable
+insolubilization
+insolubilize
+institutionize
+institutionizes
+instrumentalize
+instrumentalizes
+insularize
+insularizes
+insurrectionize
+insurrectionizes
+integralization
+integralization's
+integralizations
+integralize
+integralizes
+intellectualization
+intellectualization's
+intellectualizations
+intellectualize
+intellectualized
+intellectualizer
+intellectualizers
+intellectualizes
+intellectualizing
+intercivilization
+intercivilization's
+intercivilizations
+intercolonization
+intercolonization's
+intercolonizations
+intercrystallization
+intercrystallization's
+intercrystallizations
+intercrystallize
+intercrystallizes
+interhybridize
+interhybridizes
+interiorization
+interiorize
+interiorized
+interiorizes
+interiorizing
+interjectionalize
+interjectionalizes
+interjectionize
+interjectionizes
+interjudgment
+interjudgment's
+interjudgments
+internationalize
+internationalizes
+internationalizing
+interorganizational
+intraorganization
+intraorganization's
+intraorganizations
+iodization
+iodize
+iodized
+iodizer
+iodizers
+iodizes
+iodizing
+ionizable
+ionizable's
+ionizables
+ionization
+ionization's
+ionizations
+ironize
+ironizes
+irrationalize
+irrationalizes
+irregularize
+irregularizes
+isochronization
+isochronize
+isochronized
+isochronizes
+isochronizing
+isoimmunization
+isoimmunization's
+isoimmunizations
+isoimmunize
+isoimmunizes
+isomerization
+isomerization's
+isomerizations
+isomerize
+isomerized
+isomerizeparabolization
+isomerizes
+isomerizing
+italicization
+italicization's
+italicizations
+jargonization
+jargonization's
+jargonizations
+jargonize
+jargonized
+jargonizes
+jargonizing
+jasperize
+jasperizes
+jeopardization
+jeweleries
+jewelery
+journalization
+journalization's
+journalizations
+jovialize
+jovializes
+judgmental
+judicialize
+judicializes
+juvenilize
+juvenilizes
+kaolinization
+kaolinization's
+kaolinizations
+kaolinize
+kaolinizes
+kenneled
+kenneling
+keratinization
+keratinize
+keratinized
+keratinizes
+keratinizing
+kerneled
+kerneling
+ketonization
+ketonization's
+ketonizations
+ketonize
+ketonizes
+kiloliter
+kiloliter's
+kiloliters
+kinesthesia
+kyanize
+kyanized
+kyanizes
+kyanizing
+labelable
+labialization
+labialization's
+labializations
+labialize
+labialized
+labializes
+labializing
+labilization
+labilization's
+labilizations
+labilize
+labilizes
+laborabilities
+laborability
+laborability's
+laborable
+laborable's
+laborables
+laborhood
+laborhood's
+laborhoods
+laborism
+laborism's
+laborisms
+laborist
+laborist's
+laborists
+laborite
+laborite's
+laborites
+laborless
+laborlesses
+labour's
+lackluster
+laconize
+laconized
+laconizes
+laconizing
+lactonized
+laicization
+laicizations
+laicize
+laicized
+laicizes
+laicizing
+lapeled
+latentize
+latentizes
+lateralization
+lateralization's
+lateralizations
+lateralize
+lateralizes
+laterization
+laterization's
+laterizations
+laureling
+leatherize
+leatherizes
+legitimatize
+legitimatized
+legitimatizes
+legitimatizing
+legitimization
+legitimization's
+legitimizations
+lethalize
+lethalizes
+leukemia
+lexiconize
+lexiconizes
+libelant
+libelants
+libeled
+libelee
+libelees
+libeling
+lichenization
+lichenization's
+lichenizations
+lichenize
+lichenizes
+lignitize
+lignitizes
+linearization
+linearization's
+linearizations
+linenize
+linenizer
+linenizers
+linenizes
+lingualize
+lingualizes
+lionizable
+lionizable's
+lionizables
+lionization
+lionization's
+lionizations
+liquidization
+liquidize
+liquidized
+liquidizer
+liquidizers
+liquidizes
+liquidizing
+literalization
+literalization's
+literalizations
+literalize
+literalized
+literalizer
+literalizers
+literalizes
+lithographize
+lithographizes
+localizable
+localizable's
+localizables
+logicalization
+logicalization's
+logicalizations
+logicalize
+logicalizes
+logicize
+logicized
+logicizes
+logicizing
+logorrhea
+logorrhea's
+logorrheas
+louver
+louvered
+louvers
+loyalize
+loyalizes
+lumbarization
+lumbarization's
+lumbarizations
+lunatize
+lunatizes
+lusterless
+lusterware
+luteinization
+luteinize
+lyophilization
+lyophilize
+lyophilized
+lyophilizer
+lyricize
+lyricized
+lyricizes
+lyricizing
+lysogenization
+lysogenize
+macadamization
+macadamize
+macadamized
+macadamizes
+macadamizing
+macarize
+macarized
+macarizes
+macarizing
+machinization
+machinization's
+machinizations
+machinize
+machinizes
+magicalize
+magicalizes
+magnetizabilities
+magnetizability
+magnetizability's
+magnetizable
+magnetizable's
+magnetizables
+magnetize
+magnetizer
+magnetizers
+magnetizes
+magnetizing
+mahoganize
+mahoganized
+mahoganizes
+mahoganizing
+majorize
+majorizes
+malleablize
+malleablizes
+malodor
+mandarinize
+mandarinizes
+mannerize
+mannerizes
+marbleize
+marbleizes
+marginalization
+marginalize
+marginalized
+marginalizes
+marginalizing
+marsupialization
+marsupialization's
+marsupializations
+marsupialize
+marsupializes
+martialization
+martialization's
+martializations
+martialize
+martializes
+martyrization
+martyrization's
+martyrizations
+martyrize
+martyrized
+martyrizer
+martyrizers
+martyrizes
+martyrizing
+marveler
+masculinization
+masculinization's
+masculinizations
+masculinize
+masculinized
+masculinizes
+masculinizing
+materialization
+materialization's
+materializations
+maternalize
+maternalizes
+mathematicize
+mathematicizes
+mathematization
+matronize
+matronized
+matronizes
+matronizing
+maudlinize
+maudlinizes
+mazurka
+mazurka's
+mazurkas
+mechanicalization
+mechanicalization's
+mechanicalizations
+mechanicalize
+mechanicalizes
+mechanizable
+medalist
+medalists
+medalize
+medalizes
+medialization
+medialization's
+medializations
+medialize
+medializes
+mediatization
+mediatization's
+mediatizations
+mediatize
+mediatized
+mediatizes
+mediatizing
+medievalize
+medievalizes
+mediumization
+mediumization's
+mediumizations
+mediumize
+mediumizes
+melanization
+melanize
+melanized
+melanizes
+melanizing
+melodization
+melodize
+melodized
+melodizer
+melodizes
+melodizing
+melodramatization
+melodramatize
+melodramatized
+melodramatizes
+melodramatizing
+memorialization
+memorialization's
+memorializations
+memorialize
+memorializer
+memorializers
+memorializes
+memorializing
+memorizable
+memorizable's
+memorizables
+mentalization
+mentalization's
+mentalizations
+mentalize
+mentalizes
+mercerization
+mercerization's
+mercerizations
+mercerize
+mercerized
+mercerizer
+mercerizers
+mercerizes
+mercerizing
+mercurialization
+mercurialization's
+mercurializations
+mercurialize
+mercurializes
+mesmerizabilities
+mesmerizability
+mesmerizability's
+mesmerizable
+mesmerizable's
+mesmerizables
+mesmerization
+mesmerization's
+mesmerizations
+mesmerize
+mesmerizer
+mesmerizers
+mesmerizes
+mesmerizing
+metabolizable
+metabolizable's
+metabolizables
+metabolize
+metabolizes
+metabolizing
+metacenter
+metagram
+metagram's
+metagrams
+metalize
+metalized
+metalizes
+metalizing
+metallicize
+metallicizes
+metamerization
+metamerization's
+metamerizations
+metamerized
+metamerized's
+metamerizeds
+metaphonize
+metaphonizes
+metaphorize
+metaphorizes
+metaphysicize
+metaphysicizes
+metastasize
+metastasized
+metastasizes
+metastasizing
+meteorization
+meteorization's
+meteorizations
+meteorize
+meteorizes
+methodization
+methodization's
+methodizations
+methodize
+methodized
+methodizer
+methodizers
+methodizes
+methodizing
+metricize
+metricized
+metricizes
+metricizing
+metropolitanize
+metropolitanizes
+microgram
+microgram's
+micrograms
+microliter
+microliter's
+microliters
+micromillimeter
+micromillimeter's
+micromillimeters
+microminiaturization
+microminiaturize
+microminiaturized
+microminiaturizer
+microminiaturizers
+microminiaturizes
+microminiaturizing
+micronization
+micronization's
+micronizations
+micronize
+micronizes
+micropolarization
+micropolarization's
+micropolarizations
+microscopize
+microscopizes
+militarization
+militarizations
+militarize
+militarized
+militarizes
+militarizing
+millionize
+millionizes
+mineralizable
+mineralizable's
+mineralizables
+mineralization
+mineralization's
+mineralizations
+mineralize
+mineralizer
+mineralizers
+mineralizes
+mineralizing
+miraculize
+miraculized
+miraculizes
+miraculizing
+mirrorize
+mirrorizes
+misalphabetize
+misalphabetizes
+misanthropize
+misanthropized
+misanthropizes
+misanthropizing
+misauthorization
+misauthorization's
+misauthorizations
+misauthorize
+misauthorizes
+misbaptize
+misbaptizes
+miscanonize
+miscanonizes
+mischaracterization
+mischaracterization's
+mischaracterizations
+mischaracterize
+mischaracterizes
+miscolor
+miscolor's
+miscolored
+miscoloring
+miscolors
+misendeavor
+misendeavor's
+misendeavors
+mislabeled
+mislabeling
+mislabor
+mislabor's
+mislabored
+mislaboring
+mislabors
+misorganization
+misorganization's
+misorganizations
+misorganize
+misorganizes
+misrealize
+misrealizes
+misrecognize
+misrecognizes
+misrouting
+missionarize
+missionarizes
+missionization
+missionize
+missionized
+missionizer
+missionizers
+missionizes
+missionizing
+mizanthropise
+mizanthropises
+mobilizable
+mobilizable's
+mobilizables
+modalize
+modalizes
+modernizable
+modernizable's
+modernizables
+moisturization
+moisturize
+moisturized
+moisturizer
+moisturizers
+moisturizes
+moisturizing
+molarization
+molarizations
+monarchize
+monarchizer
+monarchizers
+monarchizes
+monasticize
+monasticizes
+mongrelization
+mongrelizations
+mongrelize
+mongrelized
+mongrelizer
+mongrelizes
+mongrelizing
+monochordize
+monochordizes
+monologize
+monologized
+monologizes
+monologizing
+monometalism
+monometalist
+monopolizable
+monopolizable's
+monopolizables
+monotonize
+monotonizes
+monumentalization
+monumentalization's
+monumentalizations
+monumentalize
+monumentalized
+monumentalizes
+monumentalizing
+moralization
+moralization's
+moralizations
+moralize
+moralized
+moralizer
+moralizers
+moralizes
+moralizing
+moralizinglies
+moralizingly
+morbidize
+morbidizes
+morphinization
+morphinization's
+morphinizations
+morphinize
+morphinizes
+morseled
+morseling
+morselization
+morselization's
+morselizations
+morselize
+morselizes
+mortalize
+mortalizes
+mortarize
+mortarizes
+motorization
+motorization's
+motorizations
+multifibered
+multifibered's
+multifibereds
+municipalization
+municipalization's
+municipalizations
+municipalize
+municipalized
+municipalizer
+municipalizers
+municipalizes
+municipalizing
+muscularize
+muscularizes
+museumize
+museumizes
+musicalization
+musicalization's
+musicalizations
+musicalize
+musicalizes
+mutualization
+mutualization's
+mutualizations
+mutualize
+mutualized
+mutualizes
+mutualizing
+myelinization
+myelinization's
+myelinizations
+mysticize
+mysticizes
+mythicization
+mythicize
+mythicized
+mythicizer
+mythicizers
+mythicizes
+mythicizing
+mythize
+mythizes
+mythologization
+mythologize
+mythologized
+mythologizer
+mythologizes
+mythologizing
+nakedize
+nakedizes
+nanogram
+nanograms
+nanometer
+nanometers
+narcotization
+narcotize
+narcotized
+narcotizing
+nasalize
+nasalizes
+nasalizing
+naturalize
+naturalizer
+naturalizers
+naturalizes
+naturalizing
+naturize
+naturizes
+nebularization
+nebularization's
+nebularizations
+nebularize
+nebularizes
+nebulization
+nebulizations
+nebulize
+nebulized
+nebulizer
+nebulizes
+nebulizing
+necrotize
+necrotized
+necrotizes
+necrotizing
+nectarize
+nectarizes
+neighborless
+neighborlesses
+neighborlike
+neighborlike's
+neighborlikes
+neighborship
+neighborship's
+neighborships
+neologization
+neologize
+neologized
+neologizes
+neologizing
+neuroticize
+neuroticizes
+newspaperized
+newspaperized's
+newspaperizeds
+nickelization
+nickelization's
+nickelizations
+nickelize
+nickelizes
+nicotinize
+nicotinizes
+nightingalize
+nightingalizes
+niter
+nitridization
+nitridization's
+nitridizations
+nitridize
+nitridizes
+nitrogenization
+nitrogenization's
+nitrogenizations
+nitrogenize
+nitrogenized
+nitrogenizes
+nitrogenizing
+nodulize
+nodulizes
+nomadization
+nomadization's
+nomadizations
+nomadize
+nomadized
+nomadizes
+nomadizing
+nominalize
+nominalizes
+nominalizing
+nonacknowledgment
+nonacknowledgment's
+nonacknowledgments
+nonanesthetized
+nonapostatizing
+nonapostatizing's
+nonapostatizings
+noncanonization
+noncanonization's
+noncanonizations
+noncartelized
+noncartelized's
+noncartelizeds
+noncatechizable
+noncatechizable's
+noncatechizables
+noncivilized
+noncivilized's
+noncivilizeds
+noncoloring
+noncoloring's
+noncolorings
+noncrystallizable
+noncrystallizable's
+noncrystallizables
+noncrystallized
+noncrystallized's
+noncrystallizeds
+noncrystallizing
+noncrystallizing's
+noncrystallizings
+nondemobilization
+nondemobilization's
+nondemobilizations
+nondialyzing
+nondialyzing's
+nondialyzings
+nondimensionalize
+nondimensionalized
+nonfavorite
+nonfavorite's
+nonfavorites
+nonfulfillment
+nonfulfillment's
+nonfulfillments
+nongalvanized
+nongalvanized's
+nongalvanizeds
+nongelatinizing
+nongelatinizing's
+nongelatinizings
+nonhydrolyzable
+nonhydrolyzable's
+nonhydrolyzables
+nonimmunized
+nonimmunized's
+nonimmunizeds
+nonionized
+nonionized's
+nonionizeds
+nonionizing
+nonionizing's
+nonionizings
+nonlocalized
+nonlocalized's
+nonlocalizeds
+nonmagnetizable
+nonmagnetizable's
+nonmagnetizables
+nonnitrogenized
+nonnitrogenized's
+nonnitrogenizeds
+nonorganization
+nonorganization's
+nonorganizations
+nonoxidizable
+nonoxidizable's
+nonoxidizables
+nonoxidizing
+nonoxidizing's
+nonoxidizings
+nonparlor
+nonparlor's
+nonparlors
+nonpenalized
+nonpenalized's
+nonpenalizeds
+nonphosphorized
+nonphosphorized's
+nonphosphorizeds
+nonpolarizable
+nonpolarizable's
+nonpolarizables
+nonpolarized
+nonpolarizing
+nonpolarizing's
+nonpolarizings
+nonrationalized
+nonrationalized's
+nonrationalizeds
+nonrealization
+nonrealization's
+nonrealizations
+nonrecognized
+nonrecognized's
+nonrecognizeds
+nonschematized
+nonschematized's
+nonschematizeds
+nonsensitized
+nonsensitized's
+nonsensitizeds
+nonspecialized
+nonspecialized's
+nonspecializeds
+nonstandardized
+nonstandardized's
+nonstandardizeds
+nonstylized
+nonstylized's
+nonstylizeds
+nonsympathizer
+nonsympathizer's
+nonsympathizers
+nonsynthesized
+nonsynthesized's
+nonsynthesizeds
+nontemporizing
+nontemporizing's
+nontemporizings
+nonutilized
+nonutilized's
+nonutilizeds
+nonvisualized
+nonvisualized's
+nonvisualizeds
+nonvolatilized
+nonvolatilized's
+nonvolatilizeds
+nonvulcanizable
+nonvulcanizable's
+nonvulcanizables
+normalizable
+northernize
+northernizes
+nosize
+notarization
+notarizations
+nothingize
+nothingizes
+nounize
+nounizes
+novelization
+novelization's
+novelizations
+novelize
+novelizer
+novelizers
+novelizes
+novelizing
+nuptialize
+nuptializes
+obelize
+obelized
+obelizes
+obelizing
+objectivize
+objectivizes
+objectization
+objectization's
+objectizations
+objectize
+objectizes
+oblivionize
+oblivionizes
+ocherous
+odorful
+odorize
+odorized
+odorizer
+odorizes
+odorizing
+odorless
+odorlesses
+offenseless
+offenselesses
+offenselessly
+officialization
+officialization's
+officializations
+officialize
+officializes
+onionized
+onionized's
+onionizeds
+opaled
+opalize
+opalizes
+operatize
+operatizes
+optionalize
+optionalizes
+oralization
+oralization's
+oralizations
+oralize
+oralizes
+orangize
+orangizes
+oratorize
+oratorizes
+organizabilities
+organizability
+organizability's
+organizationist
+organizationist's
+organizationists
+orientalization
+orientalization's
+orientalizations
+orientalize
+orientalized
+orientalizes
+orientalizing
+orientization
+orientization's
+orientizations
+orientize
+orientizes
+ornamentalize
+ornamentalizes
+orphanize
+orphanizes
+orthocenter
+orthogonalize
+orthogonalizes
+orthogonalizing
+orthopedically
+orthopedist
+ostracizable
+ostracizable's
+ostracizables
+ostracization
+ostracization's
+ostracizations
+ostracize
+ostracizer
+ostracizers
+ostracizes
+ostracizing
+outcaviled
+outcaviling
+outclamor
+outclamor's
+outclamors
+outhumor
+outhumor's
+outhumored
+outhumoring
+outhumors
+outhyperbolize
+outhyperbolizes
+outlabor
+outlabor's
+outlabors
+outrivaled
+outrivaling
+outsavor
+outsavor's
+outsavoring
+outsavors
+outsplendor
+outsplendor's
+outsplendors
+outtyrannize
+outtyrannizes
+ovalization
+ovalization's
+ovalizations
+ovalize
+ovalizes
+ovariectomized
+overagonize
+overagonizes
+overbrutalize
+overbrutalizes
+overcapitalization
+overcapitalization's
+overcapitalizations
+overcapitalize
+overcapitalized
+overcapitalizes
+overcapitalizing
+overcentralization
+overcentralization's
+overcentralizations
+overcentralize
+overcentralizes
+overcivilization
+overcivilization's
+overcivilizations
+overcivilize
+overcivilizes
+overclamor
+overclamor's
+overclamors
+overcolor
+overcolor's
+overcolors
+overcriticize
+overcriticizes
+overdoctrinize
+overdoctrinizes
+overemotionalize
+overemotionalizes
+overfavor
+overfavor's
+overfavorable
+overfavorable's
+overfavorables
+overfavorablies
+overfavorably
+overfavors
+overfertilization
+overgeneralize
+overgeneralizes
+overhonor
+overhonor's
+overhonors
+overhumanize
+overhumanizes
+overindustrialization
+overindustrialization's
+overindustrializations
+overindustrialize
+overindustrializes
+overjudgment
+overjudgment's
+overjudgments
+overlabor
+overlabor's
+overlabors
+overnationalization
+overnationalization's
+overnationalizations
+overrapturize
+overrapturizes
+overrationalize
+overrationalizes
+oversentimentalize
+oversentimentalizes
+overspecialization
+overspecialization's
+overspecializations
+overspecialize
+overspecialized
+overspecializes
+oversystematize
+oversystematizes
+overunionized
+overunionized's
+overunionizeds
+overurbanization
+overurbanization's
+overurbanizations
+overwomanize
+overwomanizes
+oxidizabilities
+oxidizability
+oxidizability's
+oxidizable
+oxidizable's
+oxidizables
+oxidization
+oxidization's
+oxidizations
+oxidizement
+oxidizement's
+oxidizements
+oxygenizable
+oxygenizable's
+oxygenizables
+oxygenize
+oxygenizement
+oxygenizement's
+oxygenizements
+oxygenizer
+oxygenizers
+oxygenizes
+ozonization
+ozonization's
+ozonizations
+ozonize
+ozonized
+ozonizer
+ozonizers
+ozonizes
+ozonizing
+packetization
+packetize
+packetized
+packetizer
+packetizer's
+packetizers
+packetizes
+packetizing
+paeanize
+paeanizes
+paganization
+paganization's
+paganizations
+paganize
+paganized
+paganizer
+paganizers
+paganizes
+paganizing
+palatization
+palatization's
+palatizations
+palatize
+palatizes
+palladiumize
+palladiumizes
+palletization
+palletizations
+palletize
+palletizer
+palletizes
+palletizing
+pamperize
+pamperizes
+pamphletize
+pamphletizes
+panderize
+panderizes
+pantheonization
+pantheonization's
+pantheonizations
+pantheonize
+pantheonizes
+papalization
+papalization's
+papalizations
+papalize
+papalizer
+papalizers
+papalizes
+parabolize
+parabolized
+parabolizes
+parabolizing
+paraffinize
+paraffinizes
+paragraphize
+paragraphizes
+paralyzation
+parasitization
+parasitize
+parasitized
+parasitizes
+parasitizing
+parathyroidectomize
+parathyroidectomized
+parathyroidectomizes
+parathyroidectomizing
+parceler
+parchmentize
+parchmentizes
+parenthesization
+parfocalization
+parfocalize
+parochialization
+parochialization's
+parochializations
+parochialize
+parochializes
+parrotize
+parrotizes
+parsonize
+parsonizes
+partialize
+partializes
+particularization
+particularization's
+particularizations
+particularize
+particularized
+particularizes
+particularizing
+partisanize
+partisanizes
+pasteurize
+pasteurized
+pasteurizer
+pasteurizes
+pasteurizing
+pastoralize
+pastoralizes
+pastorize
+pastorizes
+paternalize
+paternalizes
+patronizable
+patronizable's
+patronizables
+patronization
+patronization's
+patronizations
+patternize
+patternizes
+pauperization
+pauperization's
+pauperizations
+pauperize
+pauperized
+pauperizer
+pauperizers
+pauperizes
+pauperizing
+pavior
+pearlization
+pearlize
+pearlized
+pearlizes
+pearlizing
+peasantize
+peasantizes
+pectization
+pectize
+pectized
+pectizes
+pectizing
+peculiarize
+peculiarizes
+pedaler
+pedalers
+pedantize
+pedantizes
+pedestaled
+pedestaling
+pedestrianization
+pedestrianize
+pedestrianized
+pedestrianizes
+pedestrianizing
+pelletization
+pelletizations
+pelletize
+pelletized
+pelletizer
+pelletizes
+pelletizing
+pemmicanization
+pemmicanization's
+pemmicanizations
+pemmicanize
+pemmicanizes
+penalizable
+penalizable's
+penalizables
+penalization
+penalization's
+penalizations
+penciler
+pencilers
+peptizable
+peptizable's
+peptizables
+peptization
+peptization's
+peptizations
+peptize
+peptized
+peptizer
+peptizers
+peptizes
+peptonization
+peptonize
+peptonized
+peptonizes
+peptonizing
+percussionize
+percussionizes
+perennialize
+perennializes
+perfectivize
+perfectivizes
+periled
+periling
+periodicalize
+periodicalizes
+periodization
+periodizations
+periodize
+periodized
+periodizes
+periodizing
+peroxidize
+peroxidizement
+peroxidizement's
+peroxidizements
+peroxidizes
+personization
+personization's
+personizations
+personize
+personizes
+petrolization
+petrolization's
+petrolizations
+petrolize
+petrolizes
+phagocytize
+phagocytizes
+phantomize
+phantomizer
+phantomizers
+phantomizes
+phenolization
+phenolization's
+phenolizations
+phenolize
+phenolizes
+phenomenalization
+phenomenalization's
+phenomenalizations
+phenomenalize
+phenomenalizes
+philanthropize
+philanthropizes
+philosophization
+philosophization's
+philosophizations
+phlebotomization
+phlebotomize
+phlebotomized
+phlebotomizes
+phlebotomizing
+phoneticization
+phoneticization's
+phoneticizations
+phoneticize
+phoneticizes
+phosphatization
+phosphatization's
+phosphatizations
+phosphatize
+phosphatized
+phosphatizes
+phosphatizing
+phosphorize
+phosphorizes
+photocatalyzer
+photocatalyzer's
+photocatalyzers
+photographize
+photographizes
+photoionization
+photoionization's
+photoionizations
+photoisomerization
+photoisomerization's
+photoisomerizations
+photolabeled
+photolabeler
+photolabeling
+photolyzable
+photolyze
+photolyzed
+photolyzes
+photolyzing
+photopolymerization
+photopolymerization's
+photopolymerizations
+photosensitization
+photosensitization's
+photosensitizations
+photosensitize
+photosensitized
+photosensitizer
+photosensitizers
+photosensitizes
+photosensitizing
+photosynthesize
+photosynthesized
+photosynthesizes
+photosynthesizing
+piaster
+picogram
+picogram's
+picograms
+picometer
+picometer's
+picometers
+pictorialization
+pictorialization's
+pictorializations
+pictorialize
+pictorialized
+pictorializes
+pictorializing
+picturization
+picturization's
+picturizations
+picturize
+picturized
+picturizes
+picturizing
+pidginization
+pidginize
+pidginized
+pidginizes
+pidginizing
+pigmentize
+pigmentizes
+pilgrimize
+pilgrimizes
+pillarize
+pillarizes
+piratize
+piratizes
+pistoled
+pistoling
+plagiarization
+plagiarization's
+plagiarizations
+plagiarize
+plagiarized
+plagiarizer
+plagiarizers
+plagiarizes
+plagiarizing
+plasmolyze
+plasticization
+plasticization's
+plasticizations
+plasticize
+plasticized
+plasticizer
+plasticizers
+plasticizes
+plasticizing
+platinization
+platinization's
+platinizations
+platitudinization
+platitudinize
+platitudinized
+platitudinizes
+platitudinizing
+platonization
+platonize
+platonized
+platonizes
+platonizing
+plebeianize
+plebeianizes
+plowable
+plowboy
+plowhead
+poeticization
+poeticize
+poeticized
+poeticizes
+poeticizing
+poetization
+poetization's
+poetizations
+poetize
+poetized
+poetizer
+poetizers
+poetizes
+poetizing
+pogromize
+pogromizes
+polarizabilities
+polarizability
+polarizability's
+polarizable
+polarizable's
+polarizables
+polemicize
+polemicized
+polemicizes
+polemicizing
+polemize
+polemized
+polemizes
+polemizing
+policize
+policizer
+policizers
+policizes
+politicalize
+politicalizes
+politicization
+politicize
+politicizer
+politicizers
+politicizes
+politicizing
+politize
+politizes
+pollenizer
+pollinize
+pollinized
+pollinizer
+pollinizes
+pollinizing
+polychromatize
+polychromatizes
+polychromize
+polychromizes
+polygamize
+polygamizes
+polymerization
+polymerization's
+polymerize
+polymerizes
+polysulphurization
+polysulphurization's
+polysulphurizations
+pommeled
+pommeling
+porcelainization
+porcelainization's
+porcelainizations
+porcelainize
+porcelainizes
+portionize
+portionizes
+positivize
+positivizes
+posterize
+posterizes
+postsynchronization
+posturize
+posturizes
+potentialization
+potentialization's
+potentializations
+potentialize
+potentializes
+potentize
+potentizes
+powderization
+powderization's
+powderizations
+powderize
+powderizer
+powderizers
+powderizes
+practicalization
+practicalization's
+practicalizations
+practicalize
+practicalizer
+practicalizers
+practicalizes
+preacherize
+preacherizes
+preacknowledgment
+preacknowledgment's
+preacknowledgments
+preanesthetic
+preanesthetics
+prebaptize
+prebaptizes
+precancelation
+precisionize
+precisionizes
+precivilization
+precivilization's
+precivilizations
+precolor
+precolor's
+precolorable
+precolorable's
+precolorables
+precoloring
+precolorings
+precolors
+preconization
+preconization's
+preconizations
+preconize
+preconizer
+preconizers
+preconizes
+precriticize
+precriticizes
+prefavor
+prefavor's
+prefavorable
+prefavorable's
+prefavorables
+prefavorablies
+prefavorably
+prefavorite
+prefavorite's
+prefavorites
+prefavors
+prefertilization
+prefertilization's
+prefertilizations
+prefertilize
+prefertilizes
+preflavor
+preflavor's
+preflavoring
+preflavorings
+preflavors
+pregalvanize
+pregalvanizes
+prehumor
+prehumor's
+prehumors
+prejudgment
+prejudgment's
+prejudgments
+prelabor
+prelabor's
+prelabors
+prelatize
+prelatizes
+prelocalization
+prelocalization's
+prelocalizations
+preludize
+preludizes
+premonopolize
+premonopolizes
+preoffense
+preoffense's
+preoffenses
+preorganization
+preorganization's
+preorganizations
+preorganize
+preorganizes
+preoxidize
+preoxidized
+preoxidizes
+preoxidizing
+preprogram
+prerecognize
+prerecognizes
+prespecialize
+prespecializes
+presplendor
+presplendor's
+presplendors
+pressurization
+prestandardization
+prestandardization's
+prestandardizations
+prestandardize
+prestandardizes
+presympathize
+presympathizes
+preutilizable
+preutilizable's
+preutilizables
+preutilization
+preutilization's
+preutilizations
+preutilize
+preutilizes
+prioritization
+priorization
+priorizations
+priorize
+priorized
+priorizes
+priorizing
+privatization
+privatize
+privatized
+privatizing
+problemize
+problemizes
+processionize
+processionizes
+proctorization
+proctorization's
+proctorizations
+proctorize
+proctorizes
+prodigalize
+prodigalizes
+profanize
+profanizes
+professionalization
+professionalization's
+professionalizations
+professionalize
+professionalized
+professionalizes
+professionalizing
+professionize
+professionizes
+programist
+programist's
+programistic
+programistics
+programists
+proletarianize
+proletarianizes
+proletarianizing
+prologize
+prologuize
+prologuizer
+prologuizers
+prologuizes
+prolusionize
+prolusionizes
+propagandize
+propagandized
+propagandizes
+propagandizing
+prophetize
+prophetizes
+propositionize
+propositionizes
+propretor
+proselytization
+proselytization's
+proselytizations
+protectionize
+protectionizes
+protocoled
+protocoling
+protocolization
+protocolization's
+protocolizations
+protocolize
+protocolizes
+proverbialize
+proverbializes
+proverbize
+proverbizes
+provincialization
+provincialization's
+provincializations
+provincialize
+provincializes
+pseudoanemia
+pseudoanemia's
+pseudoanemias
+pseudoanemic
+pseudoanemics
+pseudoedema
+pseudoedema's
+pseudoedemas
+pseudographize
+pseudographizes
+psychoanalyze
+psychoanalyzer
+psychoanalyzer's
+psychoanalyzers
+psychoanalyzes
+psychologization
+psychologize
+psychologized
+psychologizes
+psychologizing
+psycoanalyze
+puebloization
+puebloization's
+puebloizations
+puebloize
+puebloizes
+pulpitize
+pulpitizes
+pulverizable
+pulverizable's
+pulverizables
+pulverization
+pulverization's
+pulverizations
+pummeler
+pummeling
+pupilize
+pupilizes
+puppetize
+puppetizes
+pyorrheal
+pyramidize
+pyramidizes
+pyridinize
+pyridinizes
+pyritization
+pyritization's
+pyritizations
+pyritize
+pyritizes
+pyrolyzable
+pyrolyzate
+pythonize
+pythonizes
+quarrelous
+quarterization
+quarterization's
+quarterizations
+quininize
+quininizes
+racemization
+racemize
+racemized
+racemizes
+racemizing
+racialization
+racialization's
+racializations
+racialize
+racializes
+radialization
+radialization's
+radializations
+radialize
+radializes
+radicalization
+radicalization's
+radicalizations
+radicalize
+radicalized
+radicalizes
+radicalizing
+radiosterilize
+radiosterilizes
+radiosterilizing
+radiumization
+radiumization's
+radiumizations
+radiumize
+radiumizes
+rapturize
+rapturizes
+rascalize
+rascalizes
+rationalizable
+rationalizable's
+rationalizables
+raveled
+raveler
+ravelers
+raveling
+ravelings
+reacclimatize
+reactualize
+realisticize
+realisticizes
+reanimalize
+reanimalizes
+reapologize
+reauthorize
+rebaptization
+rebaptization's
+rebaptizations
+rebourbonize
+rebourbonizes
+rebrutalize
+recanalization
+recapitalize
+recarbonize
+recausticize
+recausticizes
+recentralize
+reciprocalize
+reciprocalizes
+recivilize
+recolonize
+recolor
+recolor's
+recoloring
+reconnoiter
+reconnoitered
+reconnoiterer
+reconnoiterer's
+reconnoiterers
+reconnoitering
+reconnoiters
+recriticize
+redialer
+redialing
+refavor
+refavor's
+refertilize
+reflectorize
+reflectorized
+reflectorizes
+reflectorizing
+reforestization
+reforestization's
+reforestize
+reforestizes
+regalize
+regalizes
+regalvanization
+regalvanization's
+regalvanizations
+regalvanize
+regalvanizes
+regionalization
+regionalization's
+regionalizations
+regionalize
+regionalized
+regionalizes
+regionalizing
+regularization
+regularization's
+regularizations
+regularize
+regularized
+regularizer
+regularizers
+regularizes
+reharmonize
+rehonor
+rehonor's
+rehumanization
+rehumanize
+rehybridize
+rehybridizes
+reinitialization
+reitemize
+relativization
+relativization's
+relativizations
+relativize
+relativized
+relativizes
+relativizing
+religionize
+religionizes
+remagnetize
+remagnetizes
+rematerialize
+rememorize
+remilitarization
+remilitarize
+remineralization
+remineralization's
+remineralizations
+remineralize
+remineralizes
+remobilize
+rencounter
+renormalization
+renormalize
+renormalizing
+reobjectivization
+reobjectivization's
+reobjectivizations
+reobjectivize
+reobjectivizes
+reorganizational
+reorganizationist
+reorganizationist's
+reorganizationists
+reoxidize
+reoxygenize
+reoxygenizes
+repaganization
+repaganization's
+repaganizations
+repaganize
+repaganizer
+repaganizers
+repaganizes
+repatronize
+repersonalize
+rephosphorization
+rephosphorization's
+rephosphorizations
+rephosphorize
+rephosphorizes
+repolymerization
+repolymerization's
+repolymerizations
+repolymerize
+repolymerizes
+reprivatization
+reprivatization's
+reprivatizations
+reprivatize
+reprivatizes
+republicanization
+republicanization's
+republicanizations
+republicanize
+republicanized
+republicanizer
+republicanizers
+republicanizes
+republicanizing
+repulverize
+reroyalize
+reroyalizes
+resensitization
+resensitization's
+resensitizations
+resensitize
+resensitizes
+resepulcher
+resinize
+resinizes
+resolemnize
+resolemnizes
+restandardize
+resterilize
+restigmatize
+restigmatizes
+resurrectionize
+resurrectionizes
+resymbolize
+resynchronization
+resynchronize
+resynchronizing
+resynthesize
+retinize
+retinizes
+retranquilize
+reutilize
+revalorization
+revalorization's
+revalorizations
+revalorize
+revalorized
+revalorizes
+revalorizing
+revaporize
+revaporizes
+revelationize
+revelationizes
+revisualize
+revitalization's
+revitalizations
+revivalize
+revivalizes
+revolatilize
+revolatilizes
+revolutionizement
+revolutionizement's
+revolutionizements
+rhapsodize
+rhapsodized
+rhapsodizes
+rhapsodizing
+rhythmicize
+rhythmicizes
+rhythmizable
+rhythmizable's
+rhythmizables
+rhythmization
+rhythmization's
+rhythmizations
+rhythmize
+rhythmizes
+ridiculize
+ridiculizes
+ritualization
+ritualize
+ritualizes
+ritualizing
+rivaless
+rivalesses
+rivalize
+rivalizes
+robotization
+robotization's
+robotizations
+robotize
+robotizes
+roentgenize
+romanticization
+routinization
+routinization's
+routinizations
+routinize
+routinizes
+roweled
+roweling
+royalization
+royalization's
+royalizations
+royalize
+royalizes
+rubberization
+rubberize
+rubberizes
+rubberizing
+rubricize
+rubricizes
+ruffianize
+ruffianizes
+ruggedization
+ruggedize
+ruggedized
+ruggedizes
+ruggedizing
+rumormonger
+rumormonger's
+rumormongers
+ruralization
+ruralization's
+ruralizations
+ruralize
+ruralized
+ruralizes
+ruralizing
+russianization
+russianize
+rusticize
+rusticizes
+saberlike
+saberlike's
+saberlikes
+sabertooth
+sacralization
+sacralization's
+sacralizations
+sacramentize
+sacramentizes
+sailorizing
+sailorizing's
+sailorizings
+salinization
+salinize
+salinizes
+saltpeter
+saltpeter's
+saltpeters
+sandaled
+sandaling
+sanitization
+sapientize
+sapientizes
+satanize
+satanizes
+satinize
+satinizes
+satirizable
+satirizable's
+satirizables
+satirize
+satirized
+satirizer
+satirizers
+satirizing
+savagize
+savagizes
+saviorhood
+saviorhood's
+saviorhoods
+saviorship
+saviorship's
+saviorships
+savorilies
+savorily
+savorless
+savorlesses
+savorous
+scandaled
+scandaling
+scandalization
+scandalization's
+scandalizations
+scandalize
+scandalizer
+scandalizers
+scandalizes
+scenarioization
+scenarioization's
+scenarioizations
+scenarioize
+scenarioizes
+scenarization
+scenarization's
+scenarizations
+scenarize
+scenarizes
+scepterless
+scepterlesses
+schedulize
+schedulizes
+schematization
+schematization's
+schematizations
+schematize
+schematized
+schematizer
+schematizers
+schematizes
+schematizing
+schismatize
+schismatized
+schismatizes
+schismatizing
+sclerotization
+sclerotized
+scripturalize
+scripturalizes
+scrutinization
+scrutinization's
+scrutinizations
+seborrhea
+seborrheic
+sectarianization
+sectarianize
+sectarianized
+sectarianizes
+sectarianizing
+sectionalization
+sectionalization's
+sectionalizations
+sectionalize
+sectionalizes
+sectionalizing
+sectionize
+sectionizes
+secularize
+secularizer
+secularizers
+secularizes
+secularizing
+semicarbonize
+semicarbonizes
+semicivilization
+semicivilization's
+semicivilizations
+semicivilized
+semicivilized's
+semicivilizeds
+semifossilized
+semifossilized's
+semifossilizeds
+semihonor
+semihonor's
+semihonors
+semihumanized
+semihumanized's
+semihumanizeds
+semimercerized
+semimercerized's
+semimercerizeds
+semimineralized
+semimineralized's
+semimineralizeds
+seminarize
+seminarizes
+seminationalization
+seminationalization's
+seminationalizations
+semiorganized
+semiorganized's
+semiorganizeds
+semioxidized
+semioxidized's
+semioxidizeds
+semioxygenized
+semioxygenized's
+semioxygenizeds
+semiprofessionalized
+semiprofessionalized's
+semiprofessionalizeds
+semivulcanized
+semivulcanized's
+semivulcanizeds
+senilize
+senilizes
+sensationalize
+sensationalized
+sensationalizes
+sensationalizing
+sensitization
+sensitization's
+sensitizations
+sensitize
+sensitizer
+sensitizers
+sensitizes
+sensitizing
+sensize
+sensizes
+sensualization
+sensualization's
+sensualizations
+sensualize
+sensualized
+sensualizes
+sensualizing
+sentimentalization
+sentimentalization's
+sentimentalizations
+sentineled
+sentineling
+sepaled
+septicization
+septicization's
+septicizations
+sepulchralize
+sepulchralizes
+serenize
+serenizes
+serializability
+serializable
+sermonize
+sermonized
+sermonizer
+sermonizers
+sermonizes
+sermonizing
+serpentinization
+serpentinization's
+serpentinizations
+serpentinize
+serpentinizes
+serpentize
+serpentizes
+servilize
+servilizes
+severalize
+severalizes
+severization
+severization's
+severizations
+severize
+severizes
+sexualization
+sexualization's
+sexualizations
+sexualize
+sexualizes
+shepherdize
+shepherdizes
+siderealize
+siderealizes
+signalization
+signalize
+signalized
+signalizing
+signatories
+silicatization
+silicatization's
+silicatizations
+silicidize
+silicidizes
+siliconize
+siliconizes
+silverize
+silverizer
+silverizers
+silverizes
+similarize
+similarizes
+similize
+similizes
+simonize
+singularization
+singularization's
+singularizations
+singularize
+singularizes
+sinicize
+sinicized
+sinicizes
+sinicizing
+siphonless
+siphonlesses
+siphonlike
+siphonlike's
+siphonlikes
+siphonophore
+siphonostele
+siphonostelic
+siphonostely
+sirenize
+sirenizes
+sisterize
+sisterizes
+skeletonization
+skeletonization's
+skeletonizations
+skeletonize
+skeletonized
+skeletonizer
+skeletonizers
+skeletonizes
+skeletonizing
+skepticize
+skepticizes
+slenderize
+slenderized
+slenderizes
+slenderizing
+sloganize
+sloganizes
+snobsniveling
+soberize
+soberized
+soberizes
+soberizing
+sockdologizing
+solarization
+solarization's
+solarizations
+solarize
+solarized
+solarizes
+solarizing
+soldierize
+soldierizes
+solecize
+solecized
+solecizes
+solecizing
+solemnization
+solemnization's
+solemnizations
+solemnize
+solemnized
+solemnizer
+solemnizers
+solemnizes
+solemnizing
+soliloquization
+soliloquize
+soliloquized
+soliloquizer
+soliloquizers
+soliloquizes
+soliloquizing
+soliloquizing's
+soliloquizingly
+soliloquizings
+solmization
+solubilization
+solubilize
+solubilized
+solubilizes
+solubilizing
+solutize
+solutizer
+solutizers
+solutizes
+sonantized
+sonantized's
+sonantizeds
+sonnetize
+sonnetizes
+southernize
+southernizes
+sovietization
+sovietization's
+sovietizations
+sovietize
+sovietizes
+spatialization
+spatialization's
+spatializations
+spatialize
+spatializes
+specificize
+specificizes
+specimenize
+specimenizes
+specterlike
+specterlike's
+specterlikes
+spheroidize
+spheroidizes
+spiralization
+spiralization's
+spiralizations
+spiralize
+spiralizes
+spiritize
+spiritizes
+spiritualization
+spiritualization's
+spiritualizations
+spiritualize
+spiritualized
+spiritualizer
+spiritualizers
+spiritualizes
+spiritualizing
+spirochetal
+spirochete
+spirochete's
+spirochetes
+spirochetosis
+splenectomized
+stabilizable
+stallionize
+stallionizes
+stalwartize
+stalwartizes
+standardizable
+standardizable's
+standardizables
+stapedectomized
+statisticize
+statisticizes
+stencilize
+sterilizabilities
+sterilizability
+sterilizability's
+sterilizable
+sterilizable's
+sterilizables
+stigmatize
+stigmatizer
+stigmatizers
+stigmatizes
+stigmatizing
+strobilization
+structuralization
+structuralization's
+structuralizations
+structuralize
+structuralizes
+strychninization
+strychninization's
+strychninizations
+strychninize
+strychninizes
+stylize
+stylizer
+stylizers
+stylizes
+stylizing
+subarmor
+subarmor's
+subarmors
+subcenter
+suberization
+suberization's
+suberizations
+suberize
+suberized
+suberizes
+suberizing
+subflavor
+subflavor's
+subflavors
+subjectivization
+subjectivize
+subjectivizes
+sublimize
+sublimizes
+subminiaturization
+subminiaturize
+subminiaturized
+subminiaturizes
+subminiaturizing
+subpulverizer
+subpulverizer's
+subpulverizers
+subsidizable
+subsidizable's
+subsidizables
+subspecialize
+subspecializes
+subspecialties
+subspecialty
+subspecialty's
+substandardize
+substandardizes
+substantialize
+substantializes
+substantivize
+substantivizes
+subterraneanize
+subterraneanizes
+subtilization
+subtilization's
+subtilizations
+subtilize
+subtilizer
+subtilizers
+subtilizes
+subtotaled
+subtotaling
+suburbanize
+suburbanizes
+subvitalized
+subvitalized's
+subvitalizeds
+succorable
+succorable's
+succorables
+succorless
+succorlesses
+suggestionize
+suggestionizes
+sulfatize
+sulfatizes
+sulfurization
+sulfurization's
+sulfurizations
+sulfurize
+sulfurizes
+sulphurization
+sulphurization's
+sulphurizations
+sulphurize
+sulphurizes
+sultanize
+sultanizes
+summerize
+summerizes
+superacknowledgment
+superacknowledgment's
+superacknowledgments
+supercanonization
+supercanonization's
+supercanonizations
+supercarbonization
+supercarbonization's
+supercarbonizations
+supercarbonize
+supercarbonizes
+supercivilization
+supercivilization's
+supercivilizations
+supercivilized
+supercivilized's
+supercivilizeds
+superemphasize
+superemphasizes
+superficialize
+superficializes
+superhumanize
+superhumanizes
+supernaturalize
+supernaturalizes
+superorganization
+superorganization's
+superorganizations
+superorganize
+superorganizes
+supersensitization
+supersensitization's
+supersensitizations
+superspecialize
+superspecializes
+supersubtilized
+supersubtilized's
+supersubtilizeds
+supersulphurize
+supersulphurizes
+surgerize
+surgerizes
+sycophantize
+sycophantizes
+syllogize
+sylvanize
+sylvanizes
+symmetrization
+symmetrization's
+symmetrizations
+symmetrize
+symmetrized
+symmetrizes
+symmetrizing
+symptomize
+symptomizes
+synchronizable
+synchronizable's
+synchronizables
+syncretize
+syncretized
+syncretizes
+syncretizing
+syndicalize
+syndicalizes
+synesthesia
+synesthetic
+synonymize
+synonymizes
+synopsize
+synthesization
+synthesization's
+synthesizations
+systemizable
+systemizable's
+systemizables
+systemize
+systemizer
+systemizers
+systemizes
+taboret
+taborets
+tabularization
+tabularization's
+tabularizations
+tabularize
+tabularizes
+taffetized
+tailorization
+tailorization's
+tailorizations
+tailorize
+tailorizes
+tambura
+tandemize
+tandemizes
+tantalization
+tantalization's
+tantalizations
+tariffize
+tariffizes
+tartarization
+tartarization's
+tartarizations
+tartarize
+tartarized
+tartarizes
+tasseled
+tasseling
+tassels
+tavernize
+tavernizes
+teaseler
+teaselers
+teazeled
+teazeling
+technicalization
+technicalize
+technicalizes
+technologize
+teetotaled
+teetotaling
+telesthesia
+telesthetic
+tellurize
+tellurized
+tellurizes
+tellurizing
+templize
+templizes
+temporalize
+temporalized
+temporalizes
+temporalizing
+temporization
+temporization's
+temporizations
+tenderization
+tenderize
+tenderized
+tenderizer
+tenderizes
+tenderizing
+tendriled
+tenementization
+tenementization's
+tenementizations
+tenementize
+tenementizes
+terminalization
+terminalization's
+terminalizations
+terminalized
+terminalized's
+terminalizeds
+ternize
+ternizes
+terrestrialize
+terrestrializes
+territorialization
+territorialization's
+territorializations
+territorialize
+territorializes
+terrorization
+terrorization's
+terrorizations
+testimonialization
+testimonialization's
+testimonializations
+testimonialize
+testimonializer
+testimonializers
+testimonializes
+tetanization
+tetanize
+tetanized
+tetanizes
+tetanizing
+teutonize
+texturized
+theaterless
+theaterlesses
+theaterlike
+theaterlike's
+theaterlikes
+theatricalization
+theatricalization's
+theatricalizations
+theatricalize
+theatricalized
+theatricalizes
+theatricalizing
+theatricize
+theatricizes
+theologization
+theologize
+theologized
+theologizer
+theologizes
+theologizing
+thermoanesthesia
+thermoanesthesia's
+thermoanesthesias
+thermometerize
+thermometerizes
+thermopolymerization
+thermopolymerization's
+thermopolymerizations
+thermosiphon
+thermosiphon's
+thermosiphons
+thronize
+thronizes
+thymectomize
+thyroidectomized
+thyroidization
+thyroidization's
+thyroidizations
+tinselier
+tinseliest
+tittuped
+tittuping
+tittupy
+tonicize
+tonicizes
+torporize
+torporizes
+totalitarianize
+totalization
+totalization's
+totalizations
+totalizator
+totalize
+totalized
+totalizer
+totalizers
+totalizes
+totalizing
+totemization
+totemization's
+totemizations
+tourize
+tourizes
+tractorization
+tractorization's
+tractorizations
+tractorize
+tractorizes
+traditionalize
+traditionalizes
+traditionize
+traditionizes
+tragicize
+tragicizes
+traitorize
+traitorizes
+trammeled
+trammeler
+trammelers
+trammeling
+tranquilization
+tranquilization's
+tranquilizations
+tranquillization
+tranquillize
+tranquillized
+tranquillizer
+tranquillizers
+tranquillizes
+tranquillizing
+transcendentalize
+transcendentalizes
+transistorization
+transparentize
+transparentizes
+traumatization
+traumatize
+traumatized
+traumatizes
+traumatizing
+triangularize
+triangularized
+triangularizes
+triangularizing
+trichinize
+trillionize
+trillionizes
+trimerization
+trimerization's
+trimerizations
+trivialization
+tropicalization
+tropicalization's
+tropicalizations
+tropicalize
+tropicalized
+tropicalizes
+tropicalizing
+troweled
+troweling
+trypsinize
+trypsinizes
+tuberculinization
+tuberculinization's
+tuberculinizations
+tuberculinize
+tuberculinizes
+tuberization
+tuberization's
+tuberizations
+tuberize
+tuberizes
+tubulization
+tubulization's
+tubulizations
+tutorization
+tutorization's
+tutorizations
+tutorize
+tutorizes
+ultracentralizer
+ultracentralizer's
+ultracentralizers
+ultrahonorable
+ultrahonorable's
+ultrahonorables
+ultraspecialization
+ultraspecialization's
+ultraspecializations
+ultrastandardization
+ultrastandardization's
+ultrastandardizations
+unagonize
+unalcoholized
+unalcoholized's
+unalcoholizeds
+unanimalized
+unanimalized's
+unanimalizeds
+unantagonizable
+unantagonizable's
+unantagonizables
+unapostatized
+unapostatized's
+unapostatizeds
+unauthorize
+unbaptize
+unbrutalize
+unbrutize
+unbrutizes
+uncanonize
+uncanonizes
+uncantonized
+uncantonized's
+uncantonizeds
+uncatechized
+uncatechized's
+uncatechizedness
+uncatechizeds
+uncatholicize
+uncatholicizes
+uncelestialized
+uncelestialized's
+uncelestializeds
+unchloridized
+unchloridized's
+unchloridizeds
+unchristianize
+unchristianized
+unchristianizes
+uncircularized
+uncircularized's
+uncircularizeds
+uncivilizable
+uncivilizable's
+uncivilizables
+uncivilize
+unclericalize
+unclericalizes
+uncolonize
+uncolorable
+uncolorable's
+uncolorables
+uncolorablies
+uncolorably
+unconventionalize
+unconventionalizes
+uncriticizable
+uncriticizable's
+uncriticizables
+uncrystallizabilities
+uncrystallizability
+uncrystallizability's
+uncrystallizable
+uncrystallizable's
+uncrystallizables
+uncurricularized
+uncurricularized's
+uncurricularizeds
+undefense
+undefense's
+undemagnetizable
+undemagnetizable's
+undemagnetizables
+undemocratize
+undenominationalize
+undenominationalizes
+undercapitalization
+undercapitalization's
+undercapitalizations
+undercapitalize
+undercapitalized
+undercapitalizes
+undercapitalizing
+undercolor
+undercolor's
+undercolored
+undercoloring
+undercolorings
+undercolors
+underemphasize
+underemphasized
+underemphasizes
+underemphasizing
+underlaborer
+underlaborer's
+underlaborers
+underorganization
+underorganization's
+underorganizations
+underoxidize
+underoxidizes
+underrealize
+underrealizes
+undersavior
+undersavior's
+undersaviors
+underutilize
+undervitalized
+undervitalized's
+undervitalizeds
+undiphthongize
+undiphthongizes
+undiscolored
+undiscolored's
+undramatizable
+undramatizable's
+undramatizables
+undualize
+undualizes
+unenamored
+unenamored's
+unenamoreds
+unequalize
+unevangelized
+unevangelized's
+unevangelizeds
+unfavoring
+unfavoring's
+unfertilizable
+unfertilizable's
+unfertilizables
+unfeudalize
+unfeudalized
+unfeudalizes
+ungalvanized
+ungalvanized's
+ungalvanizeds
+ungelatinizable
+ungelatinizable's
+ungelatinizables
+ungelatinized
+ungelatinized's
+ungelatinizeds
+ungentilize
+ungentilizes
+ungentlemanize
+ungentlemanizes
+ungospelized
+ungospelized's
+ungospelizeds
+ungraphitized
+ungraphitized's
+ungraphitizeds
+unharbor
+unharbor's
+unharbored
+unharmonize
+unheroize
+unheroizes
+unhonorable
+unhonorable's
+unhouseled
+unhypnotizable
+unhypnotizable's
+unhypnotizables
+unhypnotize
+unhypnotizes
+uniformization
+uniformization's
+uniformizations
+uniformize
+uniformizes
+unilateralization
+unilateralization's
+unilateralizations
+unilateralize
+unilateralizes
+unimmortalize
+unimmortalizes
+unindividualize
+uninitializable
+unionization's
+unionizations
+unitization
+unitize
+unitizes
+unitizing
+universalization
+universalization's
+universalizations
+unkenneled
+unkenneling
+unlabialize
+unlabializes
+unlaborable
+unlaborable's
+unlaborables
+unlaboring
+unlaboring's
+unlocalizable
+unlocalizable's
+unlocalizables
+unlocalize
+unmechanize
+unmediatized
+unmediatized's
+unmediatizeds
+unmercerized
+unmercerized's
+unmercerizeds
+unmesmerize
+unmesmerizes
+unmetalized
+unmetalized's
+unmetalizeds
+unmethodized
+unmethodized's
+unmethodizeds
+unmethodizing
+unmethodizing's
+unmethodizings
+unmissionized
+unmissionized's
+unmissionizeds
+unmodernize
+unmonopolize
+unmonopolizing
+unmonopolizings
+unmoralize
+unmoralized
+unmoralizes
+unmoralizing
+unmoralizings
+unmunicipalized
+unmunicipalized's
+unmunicipalizeds
+unmutualized
+unmutualized's
+unmutualizeds
+unmysticize
+unmysticizes
+unnaturalizable
+unnaturalizable's
+unnaturalizables
+unnaturalize
+unnaturalizes
+unneighborlike
+unneighborlike's
+unneighborlikes
+unnitrogenized
+unnitrogenized's
+unnitrogenizeds
+unnormalize
+unnormalizing
+unoptimize
+unoptimizing
+unoxidizable
+unoxidizable's
+unoxidizables
+unoxygenized
+unoxygenized's
+unoxygenizeds
+unpaganize
+unpaganizes
+unparagonized
+unparagonized's
+unparagonizeds
+unparalyzed
+unparalyzed's
+unparalyzeds
+unparticularized
+unparticularized's
+unparticularizeds
+unparticularizing
+unparticularizing's
+unparticularizings
+unpatronizable
+unpatronizable's
+unpatronizables
+unpauperized
+unpauperized's
+unpauperizeds
+unphilosophize
+unphosphatized
+unphosphatized's
+unphosphatizeds
+unplagiarized
+unplagiarized's
+unplagiarizeds
+unpoeticized
+unpoeticized's
+unpoeticizeds
+unpoetize
+unpoetized
+unpoetizes
+unpolarizable
+unpolarizable's
+unpolarizables
+unpolymerized
+unpolymerized's
+unpolymerizeds
+unpopularize
+unprotestantize
+unprotestantizes
+unpulverize
+unradicalize
+unradicalizes
+unrancored
+unrancored's
+unrancoreds
+unraveler
+unravelers
+unrealizable
+unrealizable's
+unrealizables
+unrealize
+unrealizing
+unrealizings
+unreconnoitered
+unreconnoitered's
+unreconnoitereds
+unrevelationize
+unrevelationizes
+unromanticized
+unromanticized's
+unromanticizeds
+unroyalized
+unroyalized's
+unroyalizeds
+unsatirize
+unsatirized
+unsavorilies
+unsavorily
+unscandalize
+unscandalizes
+unscepter
+unscepter's
+unsceptered
+unschematized
+unschematized's
+unschematizeds
+unsectarianize
+unsectarianizes
+unsecularize
+unsecularizes
+unsensitize
+unsensitizes
+unsensualize
+unsensualized
+unsensualizes
+unsentimentalize
+unsepulcher
+unsepulchered
+unsignalized
+unsignalized's
+unsignalizeds
+unsiphon
+unsiphon's
+unsolemnize
+unsolemnized
+unsolemnizes
+unspecterlike
+unspecterlike's
+unspecterlikes
+unspiritualize
+unspiritualized
+unspiritualizes
+unstoicize
+unstoicizes
+unsubstantialize
+unsubstantializes
+unsuccorable
+unsuccorable's
+unsuccorables
+unsulphurized
+unsulphurized's
+unsulphurizeds
+unsupernaturalize
+unsupernaturalized
+unsupernaturalizes
+unsymmetrized
+unsymmetrized's
+unsymmetrizeds
+unsympathizabilities
+unsympathizability
+unsympathizability's
+unsympathizable
+unsympathizable's
+unsympathizables
+unsystemizable
+unsystemizable's
+unsystemizables
+untantalizing
+untantalizing's
+untantalizings
+untartarized
+untartarized's
+untartarizeds
+untechnicalize
+untechnicalizes
+untemporizing
+untemporizing's
+untheorizable
+untheorizable's
+untheorizables
+unutilizable
+unutilizable's
+unutilizables
+unvaporized
+unvaporized's
+unvaporizeds
+unvectorizable
+unvitalized
+unvitalized's
+unvitalizeds
+unvitriolized
+unvitriolized's
+unvitriolizeds
+unvolatilize
+unvolatilized
+unvolatilizes
+unvulgarize
+unvulgarized
+unvulgarizes
+unwesternized
+unwesternized's
+unwesternizeds
+unwomanize
+urbanize
+urbanizes
+urbanizing
+utilitarianize
+utilitarianizes
+utilizabilities
+utilizability
+utilizable
+utilizable's
+utilizables
+utopianizer
+utopianizer's
+utopianizers
+vaccinization
+vaccinization's
+vaccinizations
+vacuumize
+vacuumized
+vacuumizes
+vacuumizing
+vagabondize
+vagabondizer
+vagabondizers
+vagabondizes
+vagrantize
+vagrantizes
+valorization
+valorization's
+valorizations
+valorize
+valorized
+valorizes
+valorizing
+vampirize
+vampirizes
+vandalization
+vandalization's
+vandalizations
+vaporabilities
+vaporability
+vaporability's
+vaporable
+vaporable's
+vaporables
+vaporier
+vaporiest
+vaporish
+vaporishness
+vaporizable
+vaporizable's
+vaporizables
+vaporize
+vaporized
+vaporizer
+vaporizers
+vaporizes
+vaporizing
+vaporless
+vaporlesses
+vaporlike
+vaporlike's
+vaporlikes
+vapory
+vascularization
+vascularization's
+vascularizations
+vascularize
+vascularized
+vascularizes
+vascularizing
+vassalization
+vassalize
+vassalized
+vassalizes
+vassalizing
+vectorizable
+vectorize
+vectorized
+vectorizer
+vectorizers
+vectorizes
+vegetablize
+vegetablizes
+velarization
+venalization
+venalization's
+venalizations
+venalize
+venalizes
+venomization
+venomization's
+venomizations
+venomize
+venomizes
+ventriloquize
+ventriloquized
+ventriloquizes
+ventriloquizing
+verbalization
+verbalization's
+verbalizations
+vermeiled
+vermeiles
+vermeiling
+vermilionize
+vermilionizes
+vernacularization
+vernacularization's
+vernacularizations
+vernacularize
+vernacularizes
+vernalization
+vernalization's
+vernalizations
+vernalize
+vernalized
+vernalizes
+vernalizing
+versicolor
+versicolored
+versionize
+versionizes
+vestryize
+vestryizes
+veteranize
+veteranizes
+vialed
+vialing
+victimizable
+victimizable's
+victimizables
+victimization
+victimization's
+victimizations
+victualage
+victualed
+victualess
+victualing
+vigorless
+virtualize
+virtualizes
+visionize
+visionizes
+vitalization
+vitalization's
+vitalizations
+vitalize
+vitalized
+vitalizer
+vitalizers
+vitalizes
+vitalizing
+vitalizing's
+vitalizingly
+vitalizings
+vitaminization
+vitaminize
+vitaminizes
+vitriolizable
+vitriolizable's
+vitriolizables
+vitriolization
+vitriolization's
+vitriolizations
+vitriolize
+vitriolizer
+vitriolizers
+vitriolizes
+vocationalization
+vocationalization's
+vocationalizations
+vocationalize
+vocationalizes
+volatilizable
+volatilizable's
+volatilizables
+volatilize
+volatilized
+volatilizer
+volatilizers
+volatilizes
+volatilizing
+voltize
+voltizes
+vowelization
+vowelization's
+vowelizations
+vowelize
+vowelized
+vowelizes
+vowelizing
+vulcanizable
+vulcanizable's
+vulcanizables
+vulcanizate
+vulcanization
+vulcanization's
+vulcanizations
+vulcanize
+vulcanizer
+vulcanizers
+vulcanizes
+vulcanizing
+vulgarization
+vulgarization's
+vulgarizations
+vulgarize
+vulgarized
+vulgarizer
+vulgarizers
+vulgarizes
+vulgarizing
+weeviled
+westernization
+westernization's
+westernizations
+westernize
+westernized
+westernizes
+westernizing
+winterization
+winterization's
+winterizations
+winterize
+winterized
+winterizes
+winterizing
+womanization
+womanization's
+womanizations
+woodcockize
+woodcockizes
+woolenization
+woolenization's
+woolenizations
+woolenize
+woolenizes
+zeroize
+zeroized
+zeroizes
+zeroizing
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.0 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.0
new file mode 100644
index 00000000000..4c1d2cc1f08
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.0
@@ -0,0 +1,1899 @@
+acclimatisation
+acclimatisations
+acclimatised
+accoutrement
+accoutrement's
+accoutrements
+acknowledgement
+acknowledgement's
+acknowledgements
+actualisation
+actualisation's
+actualisations
+aerofoil
+aerofoils
+aeroplane
+aeroplane's
+aeroplanes
+aerosolise
+aerosolised
+aesthetic
+aesthetic's
+aesthetically
+aesthetics
+agonise
+agonised
+agonisedly
+agoniser
+agonisers
+agonises
+agonising
+agonisinglies
+agonisingly
+alphabetise
+alphabetised
+alphabetiser
+alphabetisers
+alphabetises
+alphabetising
+aluminium
+aluminium's
+aluminiums
+amenorrhoea
+amorist
+amorist's
+amorists
+amortise
+amortised
+amortises
+amortising
+amphitheatre
+amphitheatre's
+amphitheatres
+anaemia
+anaemia's
+anaemias
+anaemic
+anaemics
+anaesthesia
+anaesthesia's
+anaesthesias
+anaesthetic
+anaesthetic's
+anaesthetically
+anaesthetics
+anaesthetise
+anaesthetised
+anaesthetiser
+anaesthetisers
+anaesthetises
+anaesthetising
+analogue
+analogue's
+analogues
+analysable
+analyse
+analysed
+analyser
+analysers
+analyses
+analysing
+anodise
+anodised
+anodises
+anodising
+antagonise
+antagonised
+antagoniser
+antagonisers
+antagonises
+antagonising
+apologise
+apologised
+apologiser
+apologisers
+apologises
+apologising
+appal
+appals
+apparelled
+appetiser
+appetising
+appetisingly
+arbour
+arbour's
+arboured
+arbours
+archaise
+archaised
+archaiser
+archaisers
+archaises
+archaising
+ardour
+ardour's
+ardours
+arithmetise
+arithmetised
+arithmetises
+armour
+armour's
+armoured
+armourer
+armourer's
+armourers
+armouried
+armouries
+armouring
+armours
+armoury
+armoury's
+atomisation
+atomisation's
+atomisations
+atomise
+atomised
+atomiser
+atomisers
+atomises
+atomising
+authorisation
+authorisation's
+authorisations
+authorise
+authorised
+authoriser
+authorisers
+authorises
+authorising
+autodialler
+axiomatisation
+axiomatisation's
+axiomatisations
+axiomatise
+axiomatised
+axiomatises
+axiomatising
+balkanise
+balkanised
+balkanising
+baptise
+baptised
+baptiser
+baptisers
+baptises
+baptising
+barrelled
+barrelling
+bastardise
+bastardised
+bastardises
+bastardising
+bedevilled
+bedevilling
+behaviour
+behaviour's
+behavioural
+behaviourally
+behavioured
+behaviourism
+behaviourism's
+behaviourisms
+behaviouristic
+behaviouristics
+behaviours
+behove
+behoved
+behoves
+behoving
+behoving's
+behovingly
+behovings
+belabour
+belabour's
+belaboured
+belabouring
+belabours
+bevelled
+bevelling
+bevellings
+bowdlerise
+bowdlerised
+bowdleriser
+bowdlerises
+bowdlerising
+brutalise
+brutalised
+brutalises
+brutalising
+bushelled
+bushelling
+bushellings
+calibre
+calibres
+canalled
+canalling
+cancelled
+canceller
+cancelling
+candour
+candour's
+candours
+cannibalise
+cannibalised
+cannibalises
+cannibalising
+canonicalisation
+canonicalise
+canonicalised
+canonicalises
+canonicalising
+capitalisation
+capitalisation's
+capitalisations
+capitalise
+capitalised
+capitaliser
+capitalisers
+capitalises
+capitalising
+carbonisation
+carbonisation's
+carbonisations
+carbonise
+carbonised
+carboniser
+carbonisers
+carbonises
+carbonising
+catalogue
+catalogue's
+catalogued
+cataloguer
+catalogues
+cataloguing
+categorisation
+categorisation's
+categorisations
+categorise
+categorised
+categoriser
+categorisers
+categorises
+categorising
+centimetre
+centimetre's
+centimetres
+centralisation
+centralisation's
+centralisations
+centralise
+centralised
+centraliser
+centralisers
+centralises
+centralising
+centre
+centre's
+centred
+centrepiece
+centrepiece's
+centrepieces
+centres
+centring
+channelled
+channeller
+channeller's
+channellers
+channelling
+characterisable
+characterisables
+characterisation
+characterisation's
+characterisations
+characterise
+characterised
+characteriser
+characterisers
+characterises
+characterising
+cheque
+cheque's
+chequebook
+chequebook's
+chequebooks
+chequer
+chequered
+chequers
+cheques
+chiselled
+chiseller
+chisellers
+civilisation
+civilisation's
+civilisations
+civilise
+civilised
+civilisedness
+civiliser
+civilisers
+civilises
+civilising
+clamour
+clamoured
+clamourer
+clamourer's
+clamourers
+clamouring
+clamours
+cognisance
+cognisant
+colonisation
+colonisation's
+colonisations
+colonise
+colonised
+coloniser
+colonisers
+colonises
+colonising
+colour
+colour's
+coloured
+coloureds
+colourer
+colourer's
+colourers
+colourful
+colourfully
+colourfulness
+colouring
+colourings
+colourless
+colourlessly
+colourlessness
+colours
+columnise
+columnised
+columnises
+columnising
+compartmentalise
+compartmentalised
+compartmentalises
+compartmentalising
+computerise
+computerised
+computerises
+computerising
+conceptualisation
+conceptualisation's
+conceptualisations
+conceptualise
+conceptualised
+conceptualiser
+conceptualises
+conceptualising
+counselled
+counselling
+counsellor
+counsellor's
+counsellors
+criticise
+criticised
+criticiser
+criticisers
+criticises
+criticising
+criticisinglies
+criticisingly
+crystallise
+crystallised
+crystalliser
+crystallisers
+crystallises
+crystallising
+customisable
+customisation
+customisation's
+customisations
+customise
+customised
+customiser
+customisers
+customises
+customising
+decentralisation
+decentralisation's
+decentralisations
+decentralised
+defence
+defence's
+defenced
+defenceless
+defencelessly
+defencelessness
+defences
+defencing
+defencive
+demeanour
+demeanour's
+demeanours
+demoralise
+demoralised
+demoraliser
+demoralisers
+demoralises
+demoralising
+demoralisingly
+dialled
+dialler
+diallers
+dialling
+diallings
+dichotomise
+dichotomised
+dichotomises
+dichotomising
+digitise
+digitised
+digitiser
+digitiser's
+digitisers
+digitises
+digitising
+dishonour
+dishonoured
+dishonourer
+dishonourer's
+dishonourers
+dishonouring
+dishonours
+disorganised
+draught
+draught's
+draughts
+draughtsman
+duelled
+dueller
+duellers
+duelling
+duellings
+economise
+economised
+economiser
+economisers
+economises
+economising
+editorialise
+editorialised
+editorialiser
+editorialises
+editorialising
+enamelled
+enameller
+enamellers
+enamelling
+enamellings
+encyclopaedia
+encyclopaedia's
+encyclopaedias
+endeavour
+endeavoured
+endeavourer
+endeavourer's
+endeavourers
+endeavouring
+endeavours
+enrol
+enrolment
+enrolment's
+enrolments
+enrols
+epitomise
+epitomised
+epitomiser
+epitomisers
+epitomises
+epitomising
+equalisation
+equalisation's
+equalisations
+equalise
+equalised
+equaliser
+equaliser's
+equalisers
+equalises
+equalising
+equalisings
+equalled
+equalling
+eviller
+evillest
+factorisation
+factorisation's
+factorisations
+familiarisation
+familiarisation's
+familiarisations
+familiarise
+familiarised
+familiariser
+familiarisers
+familiarises
+familiarising
+familiarisingly
+fantasise
+fantasised
+fantasiser
+fantasises
+fantasising
+favour
+favourable
+favourableness
+favourables
+favourably
+favoured
+favoured's
+favouredly
+favouredness
+favoureds
+favourer
+favourer's
+favourers
+favouring
+favouring's
+favouringly
+favourings
+favourite
+favourite's
+favourites
+favours
+fertilisation
+fertilisation's
+fertilisations
+fertilise
+fertilised
+fertiliser
+fertilisers
+fertilises
+fertilising
+fervour
+fervour's
+fervours
+fibre
+fibre's
+fibred
+fibreglass
+fibres
+finalisation
+finalisations
+finalise
+finalised
+finalises
+finalising
+flavour
+flavour's
+flavoured
+flavourer
+flavourer's
+flavourers
+flavouring
+flavourings
+flavours
+formalisation
+formalisation's
+formalisations
+formalise
+formalised
+formaliser
+formalisers
+formalises
+formalising
+fuelled
+fueller
+fuellers
+fuelling
+fulfil
+fulfilment
+fulfilment's
+fulfilments
+fulfils
+funnelled
+funnelling
+gaol
+generalisation
+generalisation's
+generalisations
+generalise
+generalised
+generaliser
+generalisers
+generalises
+generalising
+glamorise
+glamorised
+glamoriser
+glamorisers
+glamorises
+glamorising
+gospeller
+gospellers
+gossipped
+gossipping
+gramme
+gramme's
+grammes
+gravelled
+gravelling
+grovelled
+groveller
+grovellers
+grovelling
+grovellingly
+harbour
+harbour's
+harboured
+harbourer
+harbourer's
+harbourers
+harbouring
+harbours
+harmonise
+harmonised
+harmoniser
+harmonisers
+harmonises
+harmonising
+honour
+honourable
+honourableness
+honourables
+honourablies
+honourably
+honoured
+honourer
+honourer's
+honourers
+honouring
+honours
+hospitalise
+hospitalised
+hospitalises
+hospitalising
+humour
+humour's
+humoured
+humourer
+humourers
+humouring
+humours
+hypothesise
+hypothesised
+hypothesiser
+hypothesisers
+hypothesises
+hypothesising
+idealisation
+idealisation's
+idealisations
+idealise
+idealised
+idealiser
+idealisers
+idealises
+idealising
+imperilled
+incognisance
+incognisant
+individualise
+individualised
+individualiser
+individualisers
+individualises
+individualising
+individualisingly
+industrialisation
+industrialisation's
+industrialisations
+informalises
+initialisation
+initialisation's
+initialisations
+initialise
+initialised
+initialiser
+initialisers
+initialises
+initialising
+initialled
+initialler
+initialling
+institutionalise
+institutionalised
+institutionalises
+institutionalising
+internalisation
+internalisation's
+internalisations
+internalise
+internalised
+internalises
+internalising
+italicise
+italicised
+italicises
+italicising
+itemisation
+itemisation's
+itemisations
+itemise
+itemised
+itemiser
+itemisers
+itemises
+itemising
+jeopardise
+jeopardised
+jeopardises
+jeopardising
+jewelled
+jeweller
+jewellers
+jewelling
+journalise
+journalised
+journaliser
+journalisers
+journalises
+journalising
+judgement
+judgement's
+judgements
+kidnapped
+kidnapper
+kidnapper's
+kidnappers
+kidnapping
+kidnapping's
+kidnappings
+kilogramme
+kilogramme's
+kilogrammes
+kilometre
+kilometre's
+kilometres
+labelled
+labeller
+labeller's
+labellers
+labelling
+labour
+laboured
+laboured's
+labouredly
+labouredness
+labourer
+labourer's
+labourers
+labouring
+labouring's
+labouringly
+labourings
+labours
+laurelled
+legalisation
+legalisation's
+legalisations
+legalise
+legalised
+legalises
+legalising
+levelled
+leveller
+levellers
+levellest
+levelling
+liberalise
+liberalised
+liberaliser
+liberalisers
+liberalises
+liberalising
+licence
+licence's
+licences
+linearisable
+linearise
+linearised
+linearises
+linearising
+linearision
+litre
+litres
+localisation
+localisation's
+localisations
+localise
+localised
+localiser
+localisers
+localises
+localising
+lustre
+lustred
+lustres
+lustring
+magnetisation
+magnetisation's
+magnetisations
+manoeuvre
+manoeuvred
+manoeuvrer
+manoeuvres
+manoeuvring
+marvelled
+marvelling
+marvellous
+marvellously
+marvellousness
+materialise
+materialised
+materialiser
+materialisers
+materialises
+materialising
+maximise
+maximised
+maximiser
+maximisers
+maximises
+maximising
+mechanisation
+mechanisation's
+mechanisations
+mechanise
+mechanised
+mechaniser
+mechanisers
+mechanises
+mechanising
+medalled
+medalling
+mediaeval
+mediaeval's
+mediaevally
+mediaevals
+memorisation
+memorisation's
+memorisations
+memorise
+memorised
+memoriser
+memorisers
+memorises
+memorising
+metalled
+metalling
+metallisation
+metallisation's
+metallisations
+metre
+metre's
+metred
+metres
+metring
+millimetre
+millimetre's
+millimetres
+miniaturisation
+miniaturisations
+miniaturise
+miniaturised
+miniaturises
+miniaturising
+minimisation
+minimisation's
+minimisations
+minimise
+minimised
+minimiser
+minimisers
+minimises
+minimising
+misjudgement
+mitre
+mitred
+mitrer
+mitring
+modelled
+modeller
+modellers
+modelling
+modellings
+modernise
+modernised
+moderniser
+modernisers
+modernises
+modernising
+modularisation
+modularise
+modularised
+modularises
+modularising
+motorise
+motorised
+motorises
+motorising
+moustache
+moustached
+moustaches
+multilevelled
+nationalisation
+nationalisation's
+nationalisations
+nationalise
+nationalised
+nationaliser
+nationalisers
+nationalises
+nationalising
+naturalisation
+naturalisation's
+naturalisations
+neighbour
+neighbour's
+neighboured
+neighbourer
+neighbourer's
+neighbourers
+neighbourhood
+neighbourhood's
+neighbourhoods
+neighbouring
+neighbourings
+neighbourliness
+neighbourly
+neighbours
+neutralise
+neutralised
+neutraliser
+neutralisers
+neutralises
+neutralising
+nickelled
+nickelling
+normalisation
+normalisation's
+normalisations
+normalise
+normalised
+normaliser
+normalisers
+normalises
+normalising
+notarise
+notarised
+notarises
+notarising
+nought
+noughts
+odour
+odour's
+odoured
+odours
+offence
+offence's
+offences
+offencive
+optimisation
+optimisation's
+optimisations
+optimise
+optimised
+optimiser
+optimiser's
+optimisers
+optimises
+optimising
+organisable
+organisables
+organisation
+organisation's
+organisational
+organisational's
+organisationally
+organisationals
+organisations
+organise
+organised
+organiser
+organisers
+organises
+organising
+oxidise
+oxidised
+oxidiser
+oxidisers
+oxidises
+oxidising
+oxidisings
+panelled
+panelling
+panellings
+parallelisation
+parallelisation's
+parallelisations
+parallelise
+parallelised
+paralleliser
+parallelisers
+parallelises
+parallelising
+parallelled
+parallelling
+paralyse
+paralysed
+paralysedlies
+paralysedly
+paralyser
+paralyser's
+paralysers
+paralyses
+paralysing
+paralysinglies
+paralysingly
+parameterisable
+parameterisation
+parameterisation's
+parameterisations
+parameterise
+parameterised
+parameterises
+parameterising
+parametrisable
+parametrisation
+parametrisation's
+parametrisations
+parametrise
+parametrised
+parametrises
+parametrising
+parcelled
+parcelling
+parenthesised
+parlour
+parlour's
+parlours
+patronise
+patronised
+patroniser
+patronisers
+patronises
+patronising
+patronising's
+patronisingly
+patronisings
+penalise
+penalised
+penalises
+penalising
+pencilled
+pencilling
+pencillings
+personalisation
+personalisation's
+personalisations
+personalise
+personalised
+personalises
+personalising
+petalled
+philosophise
+philosophised
+philosophiser
+philosophisers
+philosophises
+philosophising
+plough
+ploughed
+plougher
+ploughes
+ploughing
+ploughman
+pluralisation
+pluralisation's
+pluralisations
+pluralise
+pluralised
+pluraliser
+pluralisers
+pluralises
+pluralising
+polarisation
+polarisation's
+polarisations
+popularisation
+popularisation's
+popularisations
+popularise
+popularised
+populariser
+popularisers
+popularises
+popularising
+practician
+practise
+practised
+practiser
+practises
+practising
+preinitialise
+preinitialised
+preinitialises
+preinitialising
+pressurise
+pressurised
+pressuriser
+pressurisers
+pressurises
+pressurising
+pretence
+pretences
+pretencion
+pretencions
+pretencive
+prioritise
+prioritised
+prioritiser
+prioritisers
+prioritises
+prioritising
+prioritisings
+productise
+productised
+productiser
+productisers
+productises
+productising
+programme
+programme's
+programmes
+proselytise
+proselytised
+proselytiser
+proselytisers
+proselytises
+proselytising
+publicise
+publicised
+publicises
+publicising
+pulverise
+pulverised
+pulveriser
+pulverisers
+pulverises
+pulverising
+pyjama
+pyjama's
+pyjamaed
+pyjamas
+quantisation
+quantisation's
+quantisations
+quantise
+quantised
+quantiser
+quantiser's
+quantisers
+quantises
+quantising
+quarrelled
+quarreller
+quarrellers
+quarrelling
+queueing
+randomise
+randomised
+randomiser
+randomises
+randomising
+rationalise
+rationalised
+rationaliser
+rationalisers
+rationalises
+rationalising
+reacclimatisation
+reacclimatisation's
+reacclimatisations
+reacknowledgement
+reacknowledgement's
+reacknowledgements
+reactualisation
+reactualisation's
+reactualisations
+realisable
+realisableness
+realisables
+realisablies
+realisably
+realisation
+realisation's
+realisations
+realise
+realised
+realiser
+realisers
+realises
+realising
+realising's
+realisingly
+realisings
+reanalyse
+reanalysed
+reanalyser
+reanalysers
+reanalyses
+reanalysing
+reapologises
+reauthorisation
+reauthorisation's
+reauthorisations
+reauthorises
+rebrutalises
+recapitalisation
+recapitalisation's
+recapitalisations
+recapitalised
+recapitalises
+recarbonisation
+recarbonisation's
+recarbonisations
+recarboniser
+recarbonisers
+recarbonises
+recategorised
+recentralisation
+recentralisation's
+recentralisations
+recentralises
+recivilisation
+recivilisation's
+recivilisations
+recivilises
+recognisability
+recognisable
+recognisably
+recognisance
+recognise
+recognised
+recognisedlies
+recognisedly
+recogniser
+recognisers
+recognises
+recognising
+recognisinglies
+recognisingly
+recolonisation
+recolonisation's
+recolonisations
+recolonises
+recoloured
+recolours
+reconceptualising
+recriticises
+recrystallised
+recrystallises
+redialled
+refavours
+refertilisation
+refertilisation's
+refertilisations
+refertilises
+refuelled
+refuelling
+reharmonises
+rehonours
+reinitialise
+reinitialised
+reinitialises
+reinitialising
+reitemises
+relabelled
+relabeller
+relabellers
+relabelling
+remagnetisation
+remagnetisation's
+remagnetisations
+rematerialises
+rememorises
+remodelled
+remodelling
+renationalised
+renationalises
+renormalised
+renormalises
+reorganisation
+reorganisation's
+reorganisations
+reorganise
+reorganised
+reorganiser
+reorganisers
+reorganises
+reorganising
+reoxidises
+repatronises
+reprogramme
+reprogrammes
+repulverises
+resepulchres
+restandardisation
+restandardisation's
+restandardisations
+restandardises
+resterilises
+resymbolisation
+resymbolisation's
+resymbolisations
+resymbolises
+resynchronisations
+resynchronised
+resynchronises
+resynthesises
+retranquilises
+reutilisation
+reutilises
+revelled
+reveller
+revellers
+revelling
+revellings
+revisualises
+revolutionise
+revolutionised
+revolutioniser
+revolutionisers
+revolutionises
+revolutionising
+rigour
+rigour's
+rigours
+rivalled
+rivalling
+rouble
+rouble's
+roubles
+routeing
+rumour
+rumour's
+rumoured
+rumourer
+rumourer's
+rumourers
+rumouring
+rumours
+sabre
+sabre's
+sabred
+sabres
+sabring
+sanitise
+sanitised
+sanitiser
+sanitises
+sanitising
+saviour
+saviour's
+saviours
+savour
+savoured
+savourer
+savourer's
+savourers
+savourier
+savouries
+savouriest
+savouriness
+savouring
+savouringlies
+savouringly
+savours
+savoury
+savoury's
+sceptre
+sceptre's
+sceptred
+sceptres
+sceptring
+scrutinise
+scrutinised
+scrutiniser
+scrutinisers
+scrutinises
+scrutinising
+scrutinisinglies
+scrutinisingly
+sepulchre
+sepulchre's
+sepulchred
+sepulchres
+sequentialise
+sequentialised
+sequentialises
+sequentialising
+serialisation
+serialisation's
+serialisations
+serialise
+serialised
+serialises
+serialising
+shovelled
+shoveller
+shovellers
+shovelling
+shrivelled
+shrivelling
+signalled
+signaller
+signallers
+signalling
+socialise
+socialised
+socialiser
+socialises
+socialising
+specialisation
+specialisation's
+specialisations
+specialise
+specialised
+specialiser
+specialisers
+specialises
+specialising
+specialities
+speciality
+speciality's
+spectre
+spectre's
+spectred
+spectres
+spiralled
+spiralling
+splendour
+splendour's
+splendours
+squirrelled
+squirrelling
+stabilise
+stabilised
+stabiliser
+stabilisers
+stabilises
+stabilising
+standardisation
+standardisation's
+standardisations
+standardise
+standardised
+standardiser
+standardisers
+standardises
+standardising
+stencilled
+stenciller
+stencillers
+stencilling
+sterilisation
+sterilisation's
+sterilisations
+sterilise
+sterilised
+steriliser
+sterilisers
+sterilises
+sterilising
+stylised
+subsidise
+subsidised
+subsidiser
+subsidisers
+subsidises
+subsidising
+succour
+succoured
+succourer
+succourer's
+succourers
+succouring
+succours
+summarisation
+summarisation's
+summarisations
+summarise
+summarised
+summariser
+summarisers
+summarises
+summarising
+symbolisation
+symbolisation's
+symbolisations
+symbolise
+symbolised
+symboliser
+symbolisers
+symbolises
+symbolising
+symbolled
+symbolling
+sympathise
+sympathised
+sympathiser
+sympathisers
+sympathises
+sympathising
+sympathising's
+sympathisingly
+sympathisings
+synchronisation
+synchronisation's
+synchronisations
+synchronise
+synchronised
+synchroniser
+synchronisers
+synchronises
+synchronising
+synthesise
+synthesised
+synthesiser
+synthesisers
+synthesises
+synthesising
+syphon
+syphon's
+syphoned
+syphoning
+syphons
+systematise
+systematised
+systematiser
+systematisers
+systematises
+systematising
+tantalise
+tantalised
+tantaliser
+tantalisers
+tantalises
+tantalising
+tantalisinglies
+tantalisingly
+tantalisingness
+tantalisingnesses
+terrorise
+terrorised
+terroriser
+terrorisers
+terrorises
+terrorising
+theatre
+theatre's
+theatres
+theorisation
+theorisation's
+theorisations
+theorise
+theorised
+theoriser
+theorisers
+theorises
+theorising
+titre
+titres
+totalled
+totaller
+totaller's
+totallers
+totalling
+towelled
+towelling
+towellings
+tranquilise
+tranquilised
+tranquiliser
+tranquiliser's
+tranquilisers
+tranquilises
+tranquilising
+tranquilising's
+tranquilisingly
+tranquilisings
+transistorise
+transistorised
+transistorises
+transistorising
+travelled
+traveller
+traveller's
+travellers
+travelling
+travellings
+trivialise
+trivialised
+trivialises
+trivialising
+troweller
+trowellers
+tumour
+tumour's
+tumoured
+tumours
+tunnelled
+tunneller
+tunnellers
+tunnelling
+tunnellings
+tyre
+tyre's
+tyres
+unacclimatised
+unaesthetically
+unamortised
+unanalysable
+unanalysed
+unantagonised
+unantagonising
+unapologising
+unappetising
+unappetisingly
+unarmoured
+unauthorised
+unauthorisedly
+unauthorisedness
+unauthorises
+unbaptised
+unbaptises
+unbastardised
+unbrutalised
+unbrutalises
+uncancelled
+uncapitalised
+uncategorised
+uncharacterised
+uncivilised
+uncivilisedly
+uncivilisedness
+uncivilises
+uncolonised
+uncolonises
+uncoloured
+uncolouredly
+uncolouredness
+uncoloureds
+uncriticised
+uncriticising
+uncriticisingly
+uncrystallised
+undefences
+undishonoured
+undisorganised
+uneconomising
+unendeavoured
+unepitomised
+unequalised
+unequalises
+unequalled
+unfamiliarised
+unfavourable
+unfavourableness
+unfavourables
+unfavourably
+unfavoured
+unfavoured's
+unfavourings
+unfavourite
+unfavourite's
+unfavourites
+unfertilised
+unflavoured
+unformalised
+ungeneralised
+unharmonised
+unharmonises
+unhonourables
+unhonourablies
+unhonourably
+unhonoured
+unhumoured
+unidealised
+unindividualised
+unindividualises
+uninitialised
+unionisation
+unionise
+unionised
+unioniser
+unionisers
+unionises
+unionising
+unitalicised
+unitemised
+unjournalised
+unlabelled
+unlaboured
+unlaboured's
+unlabourings
+unlegalised
+unlevelled
+unlevelling
+unliberalised
+unlocalised
+unlocalises
+unmechanised
+unmechanises
+unmemorised
+unminimised
+unmodernised
+unmodernises
+unmotorised
+unnationalised
+unneighboured
+unneighbourliness
+unneighbourly
+unneutralised
+unnormalised
+unnormalises
+unoptimised
+unoptimises
+unorganisable
+unorganisables
+unorganised
+unoxidised
+unparallelled
+unparameterised
+unparametrised
+unparcelled
+unpatronised
+unpatronising's
+unpenalised
+unphilosophised
+unphilosophises
+unpopularises
+unpractised
+unpulverised
+unpulverises
+unravelled
+unravelling
+unrealisables
+unrealised
+unrealises
+unrecognisable
+unrecognised
+unrecognising
+unrecognisingly
+unreorganised
+unrivalled
+unrumoured
+unsabred
+unsavoured
+unsavouredly
+unsavouredness
+unsceptred
+unsceptres
+unscrutinised
+unscrutinising
+unscrutinisingly
+unsepulchred
+unsepulchres
+unsocialised
+unspecialised
+unspecialising
+unstandardised
+unsterilised
+unsubsidised
+unsuccoured
+unsummarised
+unsymbolised
+unsympathised
+unsympathising
+unsympathising's
+unsympathisingly
+unsympathisings
+unsynchronised
+unsynthesised
+unsyphons
+unsystematised
+unsystematisedly
+unsystematising
+untantalised
+unterrorised
+untranquilised
+unverbalised
+unvictimised
+unvisualised
+unwomanised
+unwomanises
+utilisation
+utilise
+utilised
+utiliser
+utilisers
+utilises
+utilising
+valour
+valour's
+valours
+vandalise
+vandalised
+vandalises
+vandalising
+vapour
+vapour's
+vapoured
+vapourer
+vapourers
+vapouring
+vapouringly
+vapourings
+vapours
+vectorisation
+vectorising
+verbalise
+verbalised
+verbaliser
+verbalisers
+verbalises
+verbalising
+victimise
+victimised
+victimiser
+victimisers
+victimises
+victimising
+victualler
+victuallers
+vigour
+vigour's
+vigours
+visualise
+visualised
+visualiser
+visualisers
+visualises
+visualising
+waggon
+waggon's
+waggoner
+waggoner's
+waggoners
+waggons
+wagonner
+wagonner's
+wagonners
+weaselled
+weaselling
+whisky
+whisky's
+whiskys
+womanise
+womanised
+womaniser
+womanisers
+womanises
+womanising
+woollen
+woollens
+worshipped
+worshipper
+worshipper's
+worshippers
+worshipping
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.1 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.1
new file mode 100644
index 00000000000..54c88ee7a30
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.1
@@ -0,0 +1,743 @@
+Christianising
+Europeanisation
+Europeanisation's
+Europeanisations
+Europeanised
+Sanskritise
+acclimatise
+acclimatiser
+acclimatisers
+acclimatises
+acclimatising
+actualise
+actualised
+actualises
+actualising
+aesthete
+aesthetes
+aggrandisement
+aggrandisement's
+aggrandisements
+americanised
+amortisation
+amortisation's
+amortisations
+animised
+annualised
+arsehole
+arsehole's
+arseholes
+balkanisation
+biosynthesised
+bureaucratisation
+bureaucratisation's
+bureaucratisations
+calliper
+callipers
+cancellate
+cancellated
+canonised
+cauterise
+cauterised
+cauterises
+cauterising
+caviller
+cavillers
+centreline
+centrelines
+civilisational
+civilisational's
+civilisationals
+cognisable
+colouration
+colourimeter
+colourimeter's
+colourimeters
+colourimetry
+commercialisation
+commercialisation's
+commercialisations
+communise
+communised
+communises
+communising
+computerisation
+conventionalised
+crystallisation
+crystallisation's
+crystallisations
+decentralising
+deemphasise
+deemphasised
+deemphasiser
+deemphasisers
+deemphasises
+deemphasising
+deglycerolised
+dehumanise
+dehumanised
+dehumanises
+dehumanising
+demineralisation
+demineralisation's
+demineralisations
+democratisation
+democratisation's
+democratisations
+democratise
+democratised
+democratiser
+democratises
+democratising
+demoralisation
+demoralisation's
+demoralisations
+demythologisation
+demythologise
+demythologised
+demythologiser
+demythologises
+demythologising
+depersonalisation
+depersonalisation's
+depersonalisations
+depersonalised
+deputised
+destabilise
+destabilised
+destabilises
+destabilising
+destigmatisation
+desynchronise
+desynchronised
+desynchronises
+desynchronising
+detribalise
+detribalised
+detribalises
+detribalising
+diagonalisable
+dialysed
+diarrhoea
+diarrhoea's
+diarrhoeal
+diarrhoeas
+dichotomisation
+digitalisation
+digitalisation's
+digitalisations
+digitisation
+dioptre
+discoloured
+discoloured's
+discolouredness
+discoloureds
+discolours
+disfavour
+disfavoured
+disfavourer
+disfavourer's
+disfavourers
+disfavouring
+disfavours
+dishevelled
+disorganisation
+disorganisation's
+disorganisations
+dowelling
+downdraught
+dramatisation
+dramatisation's
+dramatisations
+dramatise
+dramatised
+dramatiser
+dramatisers
+dramatises
+dramatising
+draughtier
+draughtiness
+draughtsperson
+draughty
+duellist
+duellists
+dynamised
+emphasise
+emphasised
+emphasiser
+emphasisers
+emphasises
+emphasising
+energised
+energises
+enthral
+enthrals
+epicentre
+epicentre's
+epicentres
+eulogise
+eulogised
+eulogiser
+eulogisers
+eulogises
+eulogising
+exorcise
+exorcised
+exorcises
+exorcising
+extemporise
+extemporised
+extemporiser
+extemporisers
+extemporises
+extemporising
+externalisation
+externalisation's
+externalisations
+favouritism
+favouritism's
+favouritisms
+federalise
+federalised
+federalises
+federalising
+fibreboard
+foetid
+foetidly
+foetidness
+foetus
+foetus's
+foetuses
+fossilised
+fraternise
+fraternised
+fraterniser
+fraternisers
+fraternises
+fraternising
+galvanising
+generalisable
+generalisables
+germanised
+gimballed
+glottalisation
+glycerolised
+gruelling
+gruellingly
+gruellings
+gynaecological
+gynaecological's
+gynaecologicals
+gynaecologist
+gynaecologist's
+gynaecologists
+harmonisation
+harmonisation's
+harmonisations
+homoeomorph
+homoeopath
+homogenisation
+homogenisation's
+homogenisations
+homogenise
+homogenised
+homogeniser
+homogenisers
+homogenises
+homogenising
+honouree
+hospitalisation
+hospitalisation's
+hospitalisations
+humanise
+humanised
+humaniser
+humanisers
+humanises
+humanising
+hydrolysed
+hypnotised
+hypophysectomised
+idolise
+idolised
+idoliser
+idolisers
+idolises
+idolising
+immobilise
+immobilised
+immobiliser
+immobilises
+immobilising
+immortalised
+immunisation
+immunisation's
+immunisations
+impersonalised
+industrialised
+industrialising
+inhumanises
+institutionalisation
+institutionalisation's
+institutionalisations
+internationalisation
+internationalisation's
+internationalisations
+internationalised
+ionise
+ionised
+ioniser
+ionisers
+ionises
+ionising
+ionisings
+ionision
+ionisions
+kinaesthesis
+kinaesthetic
+kinaesthetically
+kinaesthetics
+learnt
+legitimise
+legitimised
+legitimiser
+legitimises
+legitimising
+libeller
+libellers
+libellous
+libellously
+liberalisation
+liberalisation's
+liberalisations
+licenseable
+lionise
+lionised
+lioniser
+lionisers
+lionises
+lionising
+magnetised
+manoeuvrability
+manoeuvrable
+marbleised
+marbleising
+maximisation
+maximisation's
+maximisations
+mediaevalist
+mediaevalist's
+mediaevalists
+memorialised
+mesmerised
+metabolised
+metropolitanisation
+milligramme
+milligramme's
+milligrammes
+millilitre
+millilitre's
+millilitres
+mineralised
+misbehaviour
+misbehaviour's
+misbehaviours
+misdemeanour
+misdemeanour's
+misdemeanours
+mobilisation
+mobilisation's
+mobilisations
+mobilise
+mobilised
+mobiliser
+mobilises
+mobilising
+modernisation
+modernisation's
+modernisations
+monetisation
+monetise
+monetised
+monetises
+monetising
+monopolisation
+monopolisation's
+monopolisations
+monopolise
+monopolised
+monopoliser
+monopolisers
+monopolises
+monopolising
+multicolour
+multicolour's
+multicoloured
+multicolours
+narcotises
+nasalisation
+nasalisation's
+nasalisations
+nasalised
+naturalised
+neutralisation
+neutralisation's
+neutralisations
+nominalised
+novelised
+ochre
+ochre's
+ochres
+oedema
+oedema's
+oedemas
+oedematous
+operationalisation
+operationalisations
+operationalise
+operationalised
+orthogonalisation
+orthogonalised
+orthopaedic
+orthopaedics
+ostracised
+outmanoeuvre
+outmanoeuvred
+outmanoeuvres
+outmanoeuvring
+overemphasise
+overemphasised
+overemphasiser
+overemphasisers
+overemphasises
+overemphasising
+palatalisation
+palatalise
+palatalised
+palatalises
+palatalising
+palletised
+panelisation
+panelised
+parenthesise
+parenthesises
+parenthesising
+pasteurisation
+pasteurisations
+pedalled
+pedalling
+peptising
+platinise
+platinised
+platinises
+platinising
+ploughshare
+ploughshare's
+ploughshares
+polarise
+polarised
+polariser
+polarisers
+polarises
+polarising
+politicised
+polymerisations
+proletarianisation
+proletarianised
+pronominalisation
+pronominalise
+pummelled
+pyorrhoea
+pyorrhoea's
+pyorrhoeas
+pyrolyse
+pyrolyse's
+pyrolyser
+pyrolyses
+radiopasteurisation
+radiosterilisation
+radiosterilised
+rancour
+rancour's
+rancours
+randomisation
+randomisation's
+randomisations
+rationalisation
+rationalisation's
+rationalisations
+reacclimatises
+reactualises
+realisabilities
+realisability
+realisability's
+reconceptualisation
+recrystallisation
+recrystallisation's
+recrystallisations
+recrystallise
+recrystallising
+reemphasise
+reemphasised
+reemphasiser
+reemphasisers
+reemphasises
+reemphasising
+regularising
+reharmonisation
+rehumanises
+remobilisation
+remobilisation's
+remobilisations
+remobilises
+remonetisation
+remonetise
+remonetised
+remonetises
+remonetising
+repopularise
+revaporisation
+revaporisation's
+revaporisations
+revisualisation
+revisualisation's
+revisualisations
+revitalisation
+revitalise
+revitalised
+revitaliser
+revitalisers
+revitalises
+revitalising
+ritualised
+romanticise
+romanticises
+romanticising
+rubberised
+satirises
+scandalised
+scandalising
+sectionalised
+secularisation
+secularisation's
+secularisations
+secularised
+sensitised
+sentimentalise
+sentimentalised
+sentimentaliser
+sentimentalisers
+sentimentalises
+sentimentalising
+sexualised
+signalises
+snivelled
+sniveller
+snivellers
+snivelling
+snivellings
+socialisation
+socialisation's
+socialisations
+stabilisation
+stabilisation's
+stabilisations
+stigmatisation
+stigmatisation's
+stigmatisations
+stigmatised
+stylisation
+stylisation's
+stylisations
+subcategorising
+subsidisation
+subsidisation's
+subsidisations
+substerilisation
+suburbanisation
+suburbanisation's
+suburbanisations
+suburbanised
+suburbanising
+swivelled
+swivelling
+systematisation
+systematisation's
+systematisations
+systemisation
+systemisation's
+systemisations
+teaselled
+teaselling
+teetotaller
+temporise
+temporised
+temporiser
+temporiser's
+temporisers
+temporises
+temporising
+temporising's
+temporisingly
+temporisings
+theatregoer
+theatregoer's
+theatregoers
+theatregoing
+tinselled
+tinselling
+traditionalised
+travelogue
+travelogue's
+travelogues
+trialisation
+triangularisation
+triangularisations
+tricolour
+tricolour's
+tricoloured
+tricolours
+tyne
+tyne's
+tynes
+tyrannise
+tyrannised
+tyranniser
+tyrannisers
+tyrannises
+tyrannising
+tyrannising's
+tyrannisingly
+tyrannisings
+unamortisation
+unamortisation's
+unamortisations
+uncanonised
+uncauterised
+uncauterised's
+uncauteriseds
+undemocratises
+underutilisation
+underutilised
+undialysed
+undialysed's
+undialyseds
+undiscoloureds
+undramatised
+undramatised's
+undramatiseds
+unenergised
+unenergised's
+unenergiseds
+uneulogised
+uneulogised's
+uneulogiseds
+unfossilised
+unfossilised's
+unfossiliseds
+unfraternising
+unfraternising's
+unfraternisings
+unhydrolysed
+unhydrolysed's
+unhydrolyseds
+unidolised
+unidolised's
+unidoliseds
+unimmortalised
+unindustrialised
+unindustrialised's
+unindustrialiseds
+unitised
+universalise
+universalised
+universaliser
+universalisers
+universalises
+universalising
+unlearnt
+unmagnetised
+unmagnetised's
+unmagnetiseds
+unmemorialised
+unmemorialised's
+unmemorialiseds
+unmesmerised
+unmineralised
+unmineralised's
+unmineraliseds
+unmobilised
+unmobilised's
+unmobiliseds
+unmonopolised
+unmonopolises
+unnaturalised
+unpatronising
+unpolarised
+unpolarised's
+unpolariseds
+unsatirises
+unsavouries
+unsavouriness
+unsavoury
+unsavoury's
+unscandalised
+unsecularised
+unsensitised
+unsentimentalises
+unstigmatised
+unstigmatised's
+unstigmatiseds
+untemporisings
+untrammelled
+unvocalised
+unvocalised's
+unvocaliseds
+unvulcanised
+unvulcanised's
+unvulcaniseds
+updraught
+urbanisation
+urbanisation's
+urbanisations
+urbanised
+vacuolisation
+vacuolisation's
+vacuolisations
+vaporisation
+vaporisation's
+vaporisations
+varicoloured
+varicoloured's
+varicoloureds
+velarise
+velarised
+velarises
+velarising
+visualisation
+visualisation's
+visualisations
+vocalisation
+vocalisation's
+vocalisations
+vocalise
+vocalised
+vocaliser
+vocalisers
+vocalises
+vocalising
+volatilisation
+volatilisation's
+volatilisations
+vulcanised
+waggoneer
+watercolour
+watercolour's
+watercoloured
+watercolouring
+watercolourist
+watercolourists
+watercolours
+yodelled
+yodeller
+yodelling
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.2 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.2
new file mode 100644
index 00000000000..096e6785460
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/british.2
@@ -0,0 +1,6688 @@
+Aetna
+Africanisation
+Africanisation's
+Africanisations
+Africanise
+Africanised
+Africanises
+Africanising
+Afrikanerisation
+Afrikanerise
+Afrikanerised
+Afrikanerises
+Afrikanerising
+Americanisation
+Americanisation's
+Americanisations
+Americanise
+Americaniser
+Americanisers
+Americanises
+Americanising
+Anglicanise
+Anglicanises
+Arabianise
+Arabianises
+Arabicise
+Arabicises
+Aryanisation
+Aryanise
+Aryanised
+Aryanises
+Aryanising
+Asiaticisation
+Asiaticisation's
+Asiaticisations
+Asiaticise
+Asiaticises
+Assyrianise
+Assyrianises
+Australianise
+Australianises
+Austrianise
+Austrianises
+Babelise
+Babelises
+Babylonise
+Babylonises
+Balkanisation
+Balkanisation's
+Balkanisations
+Balkanise
+Balkanises
+Berlinise
+Berlinises
+Bessemerise
+Bessemerises
+Birminghamise
+Birminghamises
+Boswellise
+Boswellises
+Byronise
+Byronises
+Byzantinise
+Byzantinises
+Caesarise
+Caesarises
+Calvinise
+Calvinises
+Canadianisation
+Canadianisation's
+Canadianisations
+Canadianise
+Canadianises
+Caponisation
+Catholicisation
+Catholicised
+Catholicising
+Celticise
+Celticises
+Christianisation
+Christianisation's
+Christianisations
+Christianise
+Christianiser
+Christianisers
+Christianises
+Ciceronianise
+Ciceronianises
+Continentalise
+Continentalises
+Corinthianise
+Corinthianises
+Creolisation
+Creolise
+Creolised
+Creolises
+Creolising
+Cubanise
+Cubanises
+Czechisation
+Czechisation's
+Czechisations
+Danisation
+Danisation's
+Danisations
+Danise
+Danises
+Darwinise
+Darwinises
+Doricise
+Doricises
+Edenisation
+Edenisation's
+Edenisations
+Edenise
+Edenises
+Egyptianisation
+Egyptianisation's
+Egyptianisations
+Egyptianise
+Egyptianises
+Egyptise
+Egyptises
+Elizabethanise
+Elizabethanises
+Englishise
+Englishises
+Epicurise
+Epicurises
+Episcopalianise
+Episcopalianises
+Eskimoised
+Eskimoised's
+Eskimoiseds
+Essenise
+Essenises
+Europeanise
+Europeanises
+Europeanising
+Fletcherise
+Fletcherises
+Francise
+Francises
+Franklinisation
+Franklinisation's
+Franklinisations
+Frenchise
+Frenchises
+Gaelicisation
+Gaelicisation's
+Gaelicisations
+Gaelicise
+Gaelicises
+Gallicisation
+Gallicise
+Gallicised
+Gallicises
+Gallicising
+Gothicise
+Gothicised
+Gothiciser
+Gothicisers
+Gothicises
+Gothicising
+Grecianise
+Grecianises
+Greekise
+Greekises
+Hanoverianise
+Hanoverianises
+Hanoverise
+Hanoverises
+Harvardise
+Harvardises
+Harveyise
+Harveyises
+Hattise
+Hattises
+Hebraicise
+Hebraicises
+Hegelianise
+Hegelianises
+Hellenisation
+Hellenisations
+Hellenise
+Hellenised
+Hellenises
+Hellenising
+Hispanicisation
+Hispanicise
+Hispanicised
+Hispanicises
+Hispanicising
+Hollywoodise
+Hollywoodises
+Hoosierise
+Hoosierises
+Hooverise
+Hooverises
+Iliadise
+Iliadises
+Illuminise
+Illuminises
+Ionicisation
+Ionicisation's
+Ionicisations
+Ionicise
+Ionicises
+Iranise
+Iranises
+Irishise
+Irishises
+Islamisation
+Islamisation's
+Islamisations
+Islamise
+Islamised
+Islamises
+Islamising
+Israelitise
+Israelitises
+Italianisation
+Italianisation's
+Italianisations
+Italianise
+Italianised
+Italianiser
+Italianisers
+Italianises
+Italianising
+Jacobinise
+Japanisation
+Japanisation's
+Japanisations
+Japanise
+Japanised
+Japanises
+Japanising
+Jesuitise
+Jesuitised
+Jesuitises
+Jesuitising
+Jonathanisation
+Jonathanisation's
+Jonathanisations
+Latinisation
+Latinisation's
+Latinisations
+Latinise
+Latinised
+Latiniser
+Latinisers
+Latinises
+Latinising
+Lilliputianise
+Lilliputianises
+Listerise
+Listerises
+Londonisation
+Londonisation's
+Londonisations
+Londonise
+Londonises
+Lutheranise
+Lutheraniser
+Lutheranisers
+Lutheranises
+Malayise
+Malayises
+Manhattanise
+Manhattanises
+Mediterraneanisation
+Mediterraneanisation's
+Mediterraneanisations
+Mediterraneanise
+Mediterraneanises
+Mendelise
+Mendelises
+Mexicanise
+Mexicanises
+Midlandise
+Midlandises
+Miltonise
+Miltonised
+Miltonises
+Miltonising
+Mohammedanisation
+Mohammedanisation's
+Mohammedanisations
+Mohammedanise
+Mohammedanised
+Mohammedanises
+Mohammedanising
+Molochise
+Molochises
+Moravianised
+Moravianiseds
+Moslemise
+Moslemises
+Napoleonise
+Napoleonises
+Negroisation
+Negroisation's
+Negroisations
+Negroise
+Negroises
+Newmanise
+Newmanises
+Nipponise
+Nipponises
+Normanisation
+Normanisation's
+Normanisations
+Normanise
+Normanised
+Normaniser
+Normanisers
+Normanises
+Normanising
+Occidentalisation
+Occidentalisation's
+Occidentalisations
+Occidentalise
+Occidentalised
+Occidentalises
+Occidentalising
+Olympianise
+Olympianises
+Ottomanisation
+Ottomanisation's
+Ottomanisations
+Ottomanise
+Ottomanises
+Parisianisation
+Parisianisation's
+Parisianisations
+Parisianise
+Parisianises
+Pasteurisers
+Paulinise
+Paulinises
+Paynise
+Paynises
+Persianisation
+Persianisation's
+Persianisations
+Persianise
+Persianises
+Peruvianise
+Peruvianises
+Philistinise
+Philistinises
+Presbyterianise
+Presbyterianises
+Procrusteanise
+Procrusteanises
+Protestantise
+Protestantises
+Prussianisation
+Prussianisation's
+Prussianisations
+Prussianise
+Prussianised
+Prussianiser
+Prussianisers
+Prussianises
+Prussianising
+Pullmanise
+Pullmanises
+Puritanise
+Puritaniser
+Puritanisers
+Puritanises
+Pythagoreanise
+Pythagoreanises
+Quakerisation
+Quakerisation's
+Quakerisations
+Quakerise
+Quakerises
+Romanisation
+Romanisation's
+Romanisations
+Romanise
+Romanised
+Romaniser
+Romanisers
+Romanises
+Romanising
+Roumania
+Russianisation's
+Russianisations
+Russianised
+Russianises
+Russianising
+Sabbathise
+Sabbathises
+Saxonisation
+Saxonisation's
+Saxonisations
+Saxonise
+Saxonises
+Semiticise
+Semiticises
+Semitisation
+Semitisation's
+Semitisations
+Semitise
+Semitises
+Shakespearise
+Shakespearises
+Shintoise
+Shintoises
+Slavicise
+Slavicises
+Slavisation
+Slavisation's
+Slavisations
+Slavise
+Slavises
+Slavonicise
+Slavonicises
+Sovietised
+Sovietising
+Spaniardisation
+Spaniardisation's
+Spaniardisations
+Spaniardise
+Spaniardises
+Spanishise
+Spanishises
+Spartanise
+Spartanises
+Syrianise
+Syrianises
+Talmudisation
+Talmudisation's
+Talmudisations
+Talmudise
+Talmudises
+Tammanyise
+Tammanyises
+Taylorise
+Taylorises
+Timonise
+Timonises
+Toryise
+Toryises
+Turkise
+Turkises
+Tuscanise
+Tuscanises
+Tylerise
+Tylerises
+Unitarianise
+Unitarianises
+Utopianise
+Utopianises
+Vaticanisation
+Vaticanisation's
+Vaticanisations
+Vaticanise
+Vaticanises
+Victorianise
+Victorianises
+Vietnamisation
+Vietnamise
+Vietnamised
+Vietnamises
+Vietnamising
+Wagnerise
+Wagnerises
+Whitmanise
+Whitmanises
+abnormalise
+abnormalises
+abolitionise
+abolitionises
+absolutisation
+absolutisation's
+absolutisations
+absolutise
+absolutises
+accessorise
+acclimatisable
+acclimatisables
+accoutre
+accoutred
+accoutres
+accoutring
+acculturise
+acetonisation
+acetonisation's
+acetonisations
+acetonise
+acetonises
+achromatisation
+achromatise
+achromatised
+achromatises
+achromatising
+acidise
+acidises
+acronymise
+acronymises
+actionise
+actionises
+activise
+activises
+adrenalise
+adrenalises
+adulterise
+adulterises
+adverbialise
+adverbialises
+aegyptus
+aeon
+aeon's
+aeonism
+aeonism's
+aeonisms
+aeons
+aerodonetics
+aerodrome
+aerogel
+aeromechanic
+aerometry
+aerophagia
+aerophobia
+aerophyte
+aeropropulsion
+aerosolisation
+aerostation
+aesthesia
+aesthesis
+aesthetical
+aesthetician
+aestheticise
+aestheticises
+aestival
+aestivate
+aestivation
+aetiologies
+aetiology
+aetiology's
+agatise
+agatises
+agenise
+aggrandisable
+aggrandisable's
+aggrandisables
+aggrandisation
+aggrandise
+aggrandised
+aggrandiser
+aggrandisers
+aggrandises
+aggrandising
+agnise
+agnised
+agnises
+agnising
+agrarianise
+agrarianises
+alarum
+albumenisation
+albumenise
+albumenised
+albumenises
+albumenising
+albuminisation
+albuminisation's
+albuminisations
+albuminise
+albuminises
+alchemise
+alcoholisable
+alcoholisables
+alcoholisation
+alcoholisation's
+alcoholisations
+alcoholise
+alcoholises
+algebraisation
+algebraisation's
+algebraisations
+algebraise
+algebraises
+alienise
+alienises
+alkalinisation
+alkalinisation's
+alkalinisations
+alkalinise
+alkalinises
+alkalisation
+alkalise
+alkalised
+alkalises
+alkalising
+allegorisation
+allegorise
+allegorised
+allegoriser
+allegorises
+allegorising
+alphabetisation
+alphabetisation's
+alphabetisations
+alternise
+alternises
+aluminisation
+aluminise
+aluminised
+aluminises
+aluminising
+amalgamatise
+amalgamatises
+amalgamisation
+amalgamisation's
+amalgamisations
+amalgamise
+amalgamises
+amoralise
+amoralises
+amorphisation
+amorphise
+amortisable
+amortisables
+amortisement
+amortisement's
+amortisements
+amourism
+amourism's
+amourisms
+amouristic
+amouristics
+anaemically
+anaesthesiologist
+anaesthesiology
+anaesthetisation
+anaesthetisation's
+anaesthetisations
+anaesthetist
+anaesthetization
+anaesthetization's
+anaesthetizations
+anagrammatisation
+anagrammatise
+analogise
+analogises
+analysation
+anarchise
+anarchises
+anathematisation
+anathematise
+anathematised
+anathematises
+anathematising
+anatomise
+angelicise
+angelicises
+angelise
+angelises
+anglicisation
+anglicisation's
+anglicisations
+anglicise
+anglicised
+anglicises
+angularisation
+angularisation's
+angularisations
+angularise
+angularises
+anhydridisation
+anhydridisation's
+anhydridisations
+anhydridise
+anhydridises
+animalisation
+animalisation's
+animalisations
+animalise
+animalised
+animalises
+animalising
+annalise
+annalises
+annualisation
+annualise
+annualises
+annualising
+anodisation
+antagonisation
+antagonisation's
+antagonisations
+anthologisation
+anthologise
+anthologised
+anthologiser
+anthologises
+anthologising
+anthracitisation
+anthracitisation's
+anthracitisations
+anthropomorphisation
+anthropomorphise
+anthropomorphised
+anthropomorphises
+anthropomorphising
+anticatalyser
+anticatalyser's
+anticatalysers
+anticentralisation
+anticentralisation's
+anticentralisations
+anticise
+anticises
+antiepicentre
+antiepicentre's
+antiepicentres
+antifertiliser
+antifertiliser's
+antifertilisers
+antilabour
+antilabour's
+antilabours
+antimediaeval
+antimediaeval's
+antimediaevals
+antioxidiser
+antioxidiser's
+antioxidisers
+antioxidising
+antioxidising's
+antioxidisings
+antipathise
+antipathises
+antiquarianise
+antiquarianises
+antirumour
+antirumour's
+antirumours
+antisensitise
+antisensitiser
+antisensitiser's
+antisensitisers
+antisensitises
+antisepticise
+antisepticises
+antiseptise
+antiseptises
+antisyphon
+antisyphon's
+antisyphons
+antithesise
+anvilled
+anvilling
+aphorise
+aphorised
+aphoriser
+aphorisers
+aphorises
+aphorising
+apostatisation
+apostatise
+apostatised
+apostatises
+apostatising
+apostrophise
+apostrophised
+apostrophises
+apostrophising
+apotheosise
+apparelling
+appetise
+appetised
+appetisement
+appetisement's
+appetisements
+appetisers
+appetises
+arabisation
+arabise
+arabised
+arabises
+arabising
+arborisation
+arborise
+arborised
+arborises
+arborising
+arboures
+arcticise
+arcticises
+arithmetisation
+arithmetisation's
+arithmetisations
+armourless
+aromatisation
+aromatise
+aromatised
+aromatises
+aromatising
+arsenicise
+arsenicises
+arterialisation
+arterialisation's
+arterialisations
+arterialise
+arterialised
+arterialises
+arterialising
+artificialise
+artificialises
+asafoetida
+asepticise
+asepticises
+astigmatiser
+astigmatiser's
+astigmatisers
+asynchronise
+asynchronised
+asynchronises
+asynchronising
+atomisability
+atomisable
+atticise
+atticises
+attitudinisation
+attitudinise
+attitudinised
+attitudinises
+attitudinising
+autoimmunisation
+autoionisation
+automatisation
+automatisation's
+automatisations
+automatise
+automatises
+autotomise
+avianise
+azotisation
+azotise
+azotised
+azotises
+azotising
+bachelorise
+bachelorises
+baconise
+baconises
+bacterise
+balladise
+balladises
+balsamise
+balsamises
+bantamise
+bantamises
+baptisable
+baptisables
+baptisement
+baptisement's
+baptisements
+barbarianise
+barbarianises
+barbarisation
+barbarise
+barbarised
+barbarises
+barbarising
+baronise
+baronises
+bastardisation
+bastardisation's
+bastardisations
+beaverise
+beaverises
+beclamour
+beclamoured
+beclamouring
+beclamours
+becudgelled
+becudgelling
+bedlamise
+bedlamises
+bedrivelled
+bedrivelling
+bejewelled
+bejewelling
+bemedalled
+bestialise
+bestialised
+bestialises
+bestialising
+beveller
+bevellers
+bichromatise
+bichromatises
+bicolour
+bicoloured
+bimetallist
+bimetallistic
+biographise
+biographises
+biologise
+biologises
+bipolarisation
+bipolarise
+bipolarises
+bistre
+bistred
+bituminisation
+bituminise
+bituminised
+bituminises
+bituminising
+bolshevise
+bonderise
+borise
+borises
+botanise
+botanised
+botanises
+botanising
+boulevardise
+boulevardises
+bourbonise
+bourbonises
+bowdlerisation
+bowelled
+bowelling
+brominise
+brominises
+brutalisation
+brutalisation's
+brutalisations
+bureaucratise
+bureaucratised
+bureaucratises
+busheller
+bushellers
+cadaverise
+cadaverises
+cadmiumise
+cadmiumises
+canalisation
+canalisation's
+canalisations
+canalise
+canalised
+canalises
+canalising
+canaller
+canallers
+cancellable
+cancellous
+cannibalisation
+cannibalisation's
+cannibalisations
+canonisation
+canonisation's
+canonisations
+canonise
+canoniser
+canonisers
+canonises
+canonising
+capitalisable
+capitalisables
+caponise
+caponised
+caponises
+caponising
+capsulisation
+capsulise
+capsulised
+capsulises
+capsulising
+caracolled
+caracolling
+caramelisation
+caramelisation's
+caramelisations
+caramelise
+caramelised
+caramelises
+caramelising
+carbolisation
+carbolise
+carbolised
+carbolises
+carbolising
+carbonatisation
+carbonatisation's
+carbonatisations
+carbonisable
+carbonisables
+carburisation
+carburise
+carburised
+carburises
+carburising
+carnalise
+carnalises
+carolled
+caroller
+carollers
+carolling
+cartelisation
+cartelisation's
+cartelisations
+cartelise
+cartelises
+castorised
+castorised's
+castoriseds
+catabolise
+cataloguise
+cataloguises
+catalyse
+catalyser
+catalyser's
+catalysers
+catalyses
+catechisable
+catechisables
+catechisation
+catechisation's
+catechisations
+catechise
+catechised
+catechiser
+catechisers
+catechises
+catechising
+catheterisation
+catheterisation's
+catheterisations
+catheterise
+catheterises
+catholicise
+catholiciser
+catholicisers
+catholicises
+causticisation
+causticisation's
+causticisations
+causticise
+causticiser
+causticisers
+causticises
+cauterisation
+cauterisation's
+cauterisations
+cavillation
+cavilled
+cavilling
+cavillings
+celestialise
+celestialises
+centigramme
+centigramme's
+centigrammes
+centilitre
+centreboard
+centrifugalisation
+centrifugalisation's
+centrifugalisations
+centrifugalise
+centrifugalises
+cephalisation
+cerebralisation
+cerebralisation's
+cerebralisations
+cerebralise
+cerebralises
+ceremonialise
+ceremonialises
+chameleonise
+chameleonises
+championise
+championises
+channelisation
+channelisation's
+channelisations
+channelise
+channelises
+chattelisation
+chattelisation's
+chattelisations
+chattelise
+chattelises
+cheerfulise
+cheerfulises
+chemicalisation
+chemicalisation's
+chemicalisations
+chemicalise
+chemicalises
+chequerboard
+chiselling
+chisellings
+chloridise
+chloridises
+chlorinise
+chlorinises
+chloroformisation
+chloroformisation's
+chloroformisations
+chloroformise
+chloroformises
+chorisation
+chorisation's
+chorisations
+chromatise
+chromatises
+chromicise
+chromicises
+chromise
+chromised
+chromises
+chromising
+chronologise
+chronologises
+cinchonise
+cinematise
+circularisation
+circularisation's
+circularisations
+circularise
+circularised
+circulariser
+circularisers
+circularises
+circularising
+citizenise
+citizenises
+civilianisation
+civilianisations
+civilianise
+civilianised
+civilianises
+civilianising
+civilisable
+civilisables
+clangour
+clangour's
+clangoured
+clangouring
+clangours
+classicalise
+classicalises
+classicisation
+classicise
+classicised
+classicises
+classicising
+clericalise
+clericalises
+climatise
+climatises
+coalise
+coaliser
+coalisers
+coalises
+cocainisation
+cocainisation's
+cocainisations
+cocainise
+cocainises
+coeducationalise
+coeducationalises
+coenamour
+coenamoured
+coenamouring
+coenamours
+coequalise
+coequalises
+cognisably
+cognise
+cognised
+cogniser
+cognisers
+cognises
+cognising
+collateralise
+collectivisation
+collectivisation's
+collectivisations
+collectivise
+collectivised
+collectivises
+colloquialise
+colloquialises
+colonialise
+colonialises
+colonisabilities
+colonisability
+colonisability's
+colonisable
+colonisables
+colonisationist
+colonisationist's
+colonisationists
+colourabilities
+colourability
+colourability's
+colourable
+colourableness
+colourables
+colourablies
+colourably
+colourama
+colourant
+colourants
+colourcast
+colourcaster
+colourcasters
+colourfast
+colourfastness
+colourific
+colourimetric
+colourimetrically
+colourisation
+colourisation's
+colourisations
+colourise
+colourises
+colourism
+colourisms
+colourist
+colourist's
+colouristic
+colouristically
+colouristics
+colourists
+colourman
+colourmap
+colourmap's
+colourmaps
+colourmen
+coloury
+columnisation
+columnisation's
+columnisations
+commercialise
+commercialised
+commercialises
+commercialising
+commonise
+commonises
+communalisation
+communalisation's
+communalisations
+communalise
+communalised
+communaliser
+communalisers
+communalises
+communalising
+communisation
+communisation's
+communisations
+companionise
+companionises
+compartmentalisation
+compartmentalisation's
+compartmentalisations
+compartmentise
+compartmentises
+complementiser
+computerisable
+concentre
+concertise
+concertiser
+concertisers
+concertises
+concretisation
+concretisations
+concretise
+concretised
+concretises
+concretising
+conditionalise
+conditionalises
+confederatise
+confederatises
+congenialise
+congenialises
+congregationalise
+congregationalises
+connexion
+conservatise
+conservatised
+conservatises
+conservatising
+consonantise
+consonantises
+constitutionalisation
+constitutionalisation's
+constitutionalisations
+constitutionalise
+constitutionalises
+containerisation
+containerise
+containerised
+containerises
+containerising
+contemporisation
+contemporise
+contemporised
+contemporises
+contemporising
+controversialise
+controversialises
+conundrumise
+conundrumises
+conventionalisation
+conventionalisation's
+conventionalisations
+conventionalise
+conventionalises
+conventionalising
+conventionise
+conventionises
+conversationise
+conversationises
+conveyorise
+conveyorised
+conveyorises
+conveyorising
+convivialise
+convivialises
+copolymerisation
+copolymerisation's
+copolymerisations
+copolymerise
+copolymerised
+copolymerises
+copolymerising
+copperisation
+copperisation's
+copperisations
+copperise
+copperises
+coralled
+corbelled
+corbelling
+corbellings
+cordialise
+cordialises
+corporealisation
+corporealisation's
+corporealisations
+corporealise
+corporealises
+cosmopolitanisation
+cosmopolitanisation's
+cosmopolitanisations
+cosmopolitanise
+cosmopolitanises
+cottonisation
+cottonisation's
+cottonisations
+cottonise
+cottonises
+councillorship
+counsellee
+counsellorship
+crawlerise
+crawlerises
+creaturise
+creaturises
+crenellate
+crenellated
+crenellates
+crenellation
+crenelled
+crenelling
+cretinisation
+cretinisation's
+cretinisations
+cretinise
+cretinises
+criminalisation
+criminalisation's
+criminalise
+criticisable
+criticisables
+crofterisation
+crofterisation's
+crofterisations
+crofterise
+crofterises
+cruelise
+cruelises
+crystallisabilities
+crystallisability
+crystallisability's
+crystallisable
+crystallisables
+crystallographical
+crystallographically
+cudgelled
+cudgeller
+cudgellers
+cudgelling
+cudgellings
+culturisation
+culturisation's
+culturisations
+culturise
+culturises
+cupellation
+cupelled
+cupeller
+cupellers
+cupelling
+curarise
+curarised
+curarises
+curarising
+curatise
+curatises
+curricularisation
+curricularisation's
+curricularisations
+curricularise
+curricularises
+cutinise
+cutinised
+cutinises
+cutinising
+cutisation
+cutisation's
+cutisations
+cyclisation
+cyclisation's
+cyclisations
+cyclise
+cyclised
+cyclises
+cyclising
+dandyise
+dandyises
+dastardise
+dastardises
+deaconise
+deaconises
+deaminise
+decalitre
+decalitres
+decametre
+decametre's
+decametres
+decarbonisation
+decarbonise
+decarbonised
+decarboniser
+decarbonises
+decarbonising
+decarburisation
+decarburise
+decarburised
+decarburises
+decarburising
+decasualisation
+decentralisationist
+decentralise
+decentralises
+decigramme
+decigramme's
+decigrammes
+decilitre
+decilitres
+decimalisation
+decimalisation's
+decimalisations
+decimalise
+decimalised
+decimalises
+decimalising
+decimetre
+decimetre's
+decimetres
+decolonisation
+decolonised
+decolonises
+decolonising
+decolour
+decolourant
+decolourants
+decolourate
+decolourated
+decolourates
+decoloured
+decolouring
+decolourisation
+decolourise
+decolourised
+decolouriser
+decolourises
+decolours
+decriminalisation
+decriminalisation's
+decriminalise
+deemphasisation
+deemphasisation's
+deenergise
+deenergised
+deenergiser
+deenergises
+deenergising
+defeminise
+defeminised
+defeminises
+defeminising
+defenceman
+definitisation
+definitisation's
+definitisations
+definitise
+definitised
+definitises
+definitising
+deflectionisation
+deflectionisation's
+deflectionisations
+deflectionise
+deflectionises
+deformalise
+defunctionalisation
+defunctionalisation's
+defunctionalisations
+defunctionalise
+defunctionalises
+dehumanisation
+dehumanisation's
+dehumanisations
+dehypnotisation
+dehypnotise
+dehypnotised
+dehypnotises
+dehypnotising
+deindustrialisation
+deindustrialise
+deionisation
+deionise
+deionises
+dekagramme
+dekagramme's
+dekagrammes
+dekalitre
+dekametre
+dekametre's
+dekametres
+delimitise
+delimitises
+delocalisation
+delocalise
+delustre
+demagnetisable
+demagnetisables
+demagnetisation
+demagnetisation's
+demagnetisations
+demagnetise
+demagnetised
+demagnetiser
+demagnetisers
+demagnetises
+demagnetising
+dematerialisation
+dematerialise
+dematerialised
+dematerialises
+dematerialising
+demilitarisation
+demilitarise
+demilitarised
+demilitarises
+demilitarising
+demineralise
+demineralised
+demineraliser
+demineralises
+demineralising
+demobilisation
+demobilise
+demobilised
+demobilises
+demobilising
+demonetisation
+demonetise
+demonetised
+demonetises
+demonetising
+demonisation
+demonise
+demonised
+demonises
+demonising
+denationalisation
+denationalise
+denationalised
+denationalises
+denationalising
+denaturalisation
+denaturalise
+denaturalised
+denaturalises
+denaturalising
+denaturisation
+denaturisation's
+denaturisations
+denaturise
+denaturiser
+denaturisers
+denaturises
+denicotinise
+denizenise
+denizenises
+denominationalise
+denominationalises
+denormalise
+dentalisation
+dentalisation's
+dentalisations
+dentalise
+dentalises
+denuclearisation
+denuclearise
+denuclearised
+denuclearises
+denuclearising
+deodorise
+deodorised
+deodorises
+deodorising
+deoxidiser
+departmentalisation
+departmentalisation's
+departmentalisations
+departmentalise
+departmentalises
+departmentisation
+departmentisation's
+departmentisations
+departmentise
+departmentises
+depersonalise
+depersonalises
+depersonalising
+depolarisation
+depolarisation's
+depolarisations
+depolarise
+depolarised
+depolariser
+depolarisers
+depolarises
+depolarising
+depoliticisation
+depoliticise
+depoliticised
+depoliticises
+depoliticising
+depolymerisation
+depolymerise
+depolymerised
+depolymerises
+depolymerising
+depressurisation
+depressurise
+depressurised
+depressurises
+depressurising
+deputationise
+deputationises
+deputisation
+deputise
+deputises
+deputising
+derationalisation
+derationalisation's
+derationalisations
+derationalise
+derationalises
+deratisation
+deratisation's
+deratisations
+derealisation
+deregulationise
+deregulationises
+desalinisation
+desalinise
+desensitisation
+desensitisation's
+desensitisations
+desensitise
+desensitised
+desensitiser
+desensitisers
+desensitises
+desensitising
+desexualisation
+desexualise
+desexualised
+desexualises
+desexualising
+despiritualisation
+despiritualise
+despotise
+despotises
+destabilisation
+destalinise
+destalinised
+destalinises
+destalinising
+desterilise
+desulphurisation
+desulphurise
+desulphurised
+desulphurises
+desulphurising
+desynchronisation
+detribalisation
+detribalisation's
+detribalisations
+develled
+develling
+devilise
+devilises
+devilled
+devilling
+devitalisation
+devitalise
+devitalised
+devitalises
+devitalising
+devocalise
+devolatilisation
+devolatilise
+devolatilised
+devolatilises
+devolatilising
+diabolisation
+diabolise
+diabolised
+diabolises
+diabolising
+diagonalisation
+diagonalise
+diagonalises
+dialecticise
+dialecticises
+diallist
+diallists
+dialysabilities
+dialysability
+dialysability's
+dialysable
+dialysables
+dialyse
+dialyser
+dialyser's
+dialysers
+dialyses
+diamondise
+diamondises
+diarrhoeic
+diarrhoetic
+dieselisation
+dieselisation's
+dieselisations
+dieselise
+dieselises
+differentialise
+differentialises
+digitalise
+digitalised
+digitalises
+digitalising
+dimensionalisation
+dimensionalise
+dimensionalised
+dimensionalises
+dimensionalising
+dimerisation
+dimerisation's
+dimerisations
+dimerise
+dimerised
+dimerises
+dimerising
+diminutivise
+diminutivises
+diphthongisation
+diphthongisation's
+diphthongisations
+diphthongise
+diphthongises
+diplomatise
+diplomatises
+disangularise
+disangularises
+disauthorise
+disauthorises
+disbowelled
+disbowelling
+discanonisation
+discanonisation's
+discanonisations
+discanonise
+discanonises
+discolour
+discolour's
+discolouration
+discolouring
+discolourisation
+discolourisation's
+discolourisations
+discolourment
+discolourment's
+discolourments
+discretisation
+discretise
+disdenominationalise
+disdenominationalises
+disdiplomatise
+disdiplomatises
+disembowelled
+disembowelling
+disenamour
+disenamour's
+disenamours
+disenthral
+disenthrals
+disequalise
+disequaliser
+disequalisers
+disequalises
+disharmonise
+disharmonises
+disheveller
+dishevelling
+dishonourable
+dishonourableness
+dishonourables
+dishonourablies
+dishonourably
+dishumanise
+dishumanises
+dishumour
+dishumoured
+dishumours
+disillusionise
+disillusioniser
+disillusionisers
+disillusionises
+disindividualise
+disindividualises
+dismalise
+dismalises
+disnaturalisation
+disnaturalisation's
+disnaturalisations
+disnaturalise
+disnaturalises
+disorganise
+disorganiser
+disorganisers
+disorganises
+disorganising
+disorientate
+disorientated
+disorientates
+disorientating
+disozonise
+disozonises
+dispapalise
+dispapalises
+dispauperise
+dispauperises
+dispersonalise
+dispersonalises
+dispopularise
+dispopularises
+disrealise
+disrealises
+dissceptre
+dissceptre's
+dissceptres
+disseise
+disseised
+disseises
+disseisin
+disseising
+disseisins
+disseisor
+disseisors
+dissensualise
+dissensualises
+dissocialise
+dissympathise
+dissympathises
+disutilise
+disutilises
+divinisation
+divinisation's
+divinisations
+divinise
+divinised
+divinises
+divinising
+dockisation
+dockisation's
+dockisations
+dockise
+dockises
+doctorisation
+doctorisation's
+doctorisations
+doctorise
+doctorises
+doctrinisation
+doctrinisation's
+doctrinisations
+doctrinise
+doctrinises
+documentise
+documentises
+dogmatisation
+dogmatise
+dogmatiser
+dognapped
+dognapping
+dolomitisation
+dolomitisation's
+dolomitisations
+dolomitise
+dolomitises
+dolour
+domesticise
+domesticises
+dowelled
+doweller
+dragonise
+dragonises
+dramatisable
+dramatisables
+draughtboard
+draughtily
+draughtsmanship
+drivelled
+driveller
+drivellers
+drivelling
+dualisation
+dualisation's
+dualisations
+dualise
+dualises
+ductilise
+ductilises
+easternise
+ebonisation
+ebonise
+ebonised
+ebonises
+ebonising
+ecclesiasticise
+ecclesiasticises
+echoise
+echoises
+eclecticise
+eclecticises
+economisation
+economisation's
+economisations
+ecstaticise
+ecstaticises
+editorialisation
+effectualise
+effectualises
+effeminatise
+effeminatises
+egoise
+egoiser
+egoisers
+egoises
+elasticisation
+elasticise
+elasticised
+elasticiser
+elasticisers
+elasticises
+elasticising
+electricalise
+electricalises
+electricise
+electricises
+electroanaesthesia
+electroanaesthesia's
+electroanaesthesias
+electrocauterisation
+electrocauterisation's
+electrocauterisations
+electrodialyse
+electrodialyser
+electrodialyser's
+electrodialysers
+electrodialyses
+electrogalvanise
+electrogalvanises
+electrohomoeopathies
+electrohomoeopathy
+electrohomoeopathy's
+electrolyse
+electrolysed
+electrolyses
+electrolysing
+electromagnetisable
+electrotonise
+electrotonises
+elegise
+elegised
+elegises
+elegising
+elementalise
+elementalises
+emblematicise
+emblematicises
+emblematisation
+emblematise
+emblematised
+emblematises
+emblematising
+emblemise
+emblemises
+embolisation
+embowelled
+embowelling
+emotionalisation
+emotionalisation's
+emotionalisations
+emotionalise
+emotionalised
+emotionalises
+emotionalising
+emotionise
+emotionises
+empanelled
+empanelling
+empathise
+empathised
+empathises
+empathising
+emulsionise
+emulsionises
+enamellist
+enamellists
+enamour
+enamour's
+enamoured
+enamoured's
+enamouredness
+enamoureds
+enamouring
+enamourment
+enamourment's
+enamourments
+enamours
+enarbour
+enarbour's
+enarbours
+encarnalisation
+encarnalise
+encarnalised
+encarnalises
+encarnalising
+encolour
+encolour's
+encoloured
+encolouring
+encolours
+encyclopaedic
+encyclopaedically
+encyclopaedism
+encyclopaedist
+energisation
+energise
+energiser
+energisers
+energising
+engramme
+engramme's
+engrammes
+engrandise
+engrandisement
+engrandisement's
+engrandisements
+engrandises
+enhypostatise
+enhypostatises
+enolisation
+enolisation's
+enolisations
+enolise
+enolises
+ensepulchre
+ensepulchre's
+ensepulchres
+ensorcelled
+ensorcells
+enthralment
+enthralment's
+enthralments
+enthronisation
+enthronisation's
+enthronisations
+enthronise
+enthronises
+entomologise
+entomologised
+entomologises
+entomologising
+envapour
+envapour's
+envapours
+envenomisation
+epigrammatisation
+epigrammatise
+epigrammatised
+epigrammatiser
+epigrammatises
+epigrammatising
+epitaphise
+epitaphises
+epithetise
+epithetises
+epitomisation
+epitomisation's
+epitomisations
+equestrianise
+equestrianises
+ergotised
+ergotises
+eroticisation
+eroticise
+eroticised
+eroticises
+eroticising
+essentialise
+essentialises
+esterisation
+esterisation's
+esterisations
+esterise
+esterises
+eternalisation
+eternalisation's
+eternalisations
+eternalise
+eternalised
+eternalises
+eternalising
+eternise
+eternised
+eternises
+eternising
+etherealisation
+etherealisation's
+etherealisations
+etherealise
+etherealised
+etherealises
+etherealising
+etherisation
+etherisation's
+etherisations
+etherise
+etherised
+etheriser
+etherisers
+etherises
+etherising
+ethicisation
+ethicise
+ethicised
+ethicises
+ethicising
+ethnicise
+ethnicises
+etymologisation
+etymologise
+etymologised
+etymologises
+etymologising
+euhemerise
+eulogisation
+eulogisation's
+eulogisations
+euphemise
+euphemised
+euphemiser
+euphemises
+euphemising
+euphonisation
+euphonise
+euphonised
+euphonises
+euphonising
+evangelisation
+evangelisation's
+evangelisations
+evangelise
+evangelised
+evangeliser
+evangelisers
+evangelises
+evangelising
+eventualise
+eventualises
+evolutionise
+evolutionises
+excursionise
+excursionises
+exhibitionise
+exhibitionises
+existentialise
+existentialises
+experimentalise
+experimentalises
+experimentise
+experimentises
+extemporisation
+extemporisation's
+extemporisations
+exteriorisation
+exteriorisation's
+exteriorisations
+exteriorise
+exteriorised
+exteriorises
+exteriorising
+externalise
+externalised
+externalises
+externalising
+facsimilise
+facsimilises
+factorise
+factorised
+factorises
+factorising
+fanaticise
+fanaticised
+fanaticises
+fanaticising
+faradisation
+faradisation's
+faradisations
+faradise
+faradised
+faradiser
+faradisers
+faradises
+faradising
+fascisticisation
+fascisticisation's
+fascisticisations
+fascisticise
+fascisticises
+fascistisation
+fascistisation's
+fascistisations
+fascistise
+fascistised
+fascistises
+fascistising
+fashionise
+fashionises
+fatalise
+fatalises
+favourless
+favourlesses
+fecundise
+fecundises
+federalisation
+federalisation's
+federalisations
+femalise
+femalises
+feminisation
+feminisations
+feminise
+feminised
+feminises
+feminising
+ferrelled
+ferrelling
+ferritisation
+ferritisation's
+ferritisations
+fertilisable
+fertilisables
+fertilisational
+fertilisational's
+fertilisationals
+fervourless
+fervourlesses
+fetishisation
+fetishisation's
+fetishisations
+fetishise
+fetishised
+fetishises
+fetishising
+feudalisable
+feudalisables
+feudalisation
+feudalisation's
+feudalisations
+feudalise
+feudalised
+feudalises
+feudalising
+fibreless
+fibrelesses
+fibrisation
+fibrise
+fibrised
+fibriser
+fibrisers
+fibrises
+fibrising
+fictionalisation
+fictionalise
+fictionalised
+fictionalises
+fictionalising
+fictionisation
+fictionisation's
+fictionisations
+fictionise
+fictionises
+figurise
+figurises
+filmise
+filmises
+fiscalisation
+fiscalisation's
+fiscalisations
+fiscalise
+fiscalises
+flamboyantise
+flamboyantises
+flannelled
+flannelling
+flavourful
+flavourfully
+flavourless
+flavourlesses
+flavoursome
+flavoury
+floralise
+floralises
+fluidisation
+fluidisation's
+fluidisations
+fluidise
+fluidised
+fluidiser
+fluidises
+fluidising
+fluoridisation
+fluoridisation's
+fluoridisations
+fluoridise
+fluoridises
+focalisation
+focalisation's
+focalisations
+focalise
+focalised
+focalises
+focalising
+foetalisation
+foetalisation's
+foetalisations
+foreignisation
+foreignisation's
+foreignisations
+foreignise
+foreignises
+forejudgement
+forejudgement's
+forejudgements
+formalisable
+formularisation
+formularisations
+formularise
+formularised
+formulariser
+formularises
+formularising
+formulisation
+formulisations
+formulise
+formulised
+formulises
+formulising
+forumise
+forumises
+fossilisable
+fossilisables
+fossilisation
+fossilisation's
+fossilisations
+fossilise
+fossilises
+fossilising
+fossilled
+fractionalisation
+fractionalise
+fractionalised
+fractionalises
+fractionalising
+fractionisation
+fractionisation's
+fractionisations
+fractionise
+fractionises
+fragmentise
+fragmentised
+fragmentiser
+fragmentises
+fragmentising
+fraternisation
+fraternisation's
+fraternisations
+frictionise
+frictionises
+frivolled
+frivoller
+frivolling
+fueliser
+fueliser's
+fuelisers
+functionalise
+functionalises
+functionise
+functionises
+funeralise
+funeralises
+funneller
+furore
+furore's
+furores
+futilise
+futilises
+futurise
+futurises
+gallantise
+gallantises
+galvanisation
+galvanisation's
+galvanisations
+galvanise
+galvanised
+galvaniser
+galvanisers
+galvanises
+gambolled
+gambolling
+gardenise
+gardenises
+gavelled
+gaveller
+gavelling
+gelatinisabilities
+gelatinisability
+gelatinisability's
+gelatinisable
+gelatinisables
+gelatinisation
+gelatinisation's
+gelatinisations
+gelatinise
+gelatinised
+gelatiniser
+gelatinisers
+gelatinises
+gelatinising
+generalisability
+generalisational
+genialise
+genialises
+genteelise
+genteelises
+gentilisation
+gentilisation's
+gentilisations
+gentilise
+gentilises
+gentlemanise
+gentlemanises
+geologise
+geologised
+geologises
+geologising
+geometricise
+geometricises
+geometrise
+geometrised
+geometrises
+geometrising
+germanisation
+germanisation's
+germanisations
+germanise
+germaniser
+germanisers
+germanises
+germanising
+ghettoisation
+ghettoisation's
+ghettoisations
+ghettoise
+ghettoised
+ghettoises
+ghettoising
+giantise
+giantises
+gimballing
+glacialise
+glacialises
+glamorisation
+glamorisations
+glamourless
+globalisation
+globalisations
+globalise
+globalised
+globalises
+globalising
+glottalise
+glottalises
+gluttonise
+gluttonises
+glycerinise
+glycerinises
+glycerolise
+glycerolises
+glycogenise
+glycogenises
+gnosticise
+gnosticiser
+gnosticisers
+gnosticises
+goddise
+goddises
+goitre
+goitres
+gonorrhoea
+gonorrhoeal
+gorgonise
+gorgonised
+gorgonises
+gorgonising
+gormandise
+gormandised
+gormandiser
+gormandises
+gormandising
+gospelise
+gospelises
+gourmandise
+gourmandised
+gourmandises
+gourmandising
+governmentalise
+governmentalised
+governmentalises
+governmentalising
+grammaticise
+grammaticises
+grangerise
+grangerised
+grangeriser
+grangerises
+grangerising
+granitisation
+granitisation's
+granitisations
+granitise
+granitises
+granulise
+granulises
+graphitisable
+graphitisation
+graphitisation's
+graphitisations
+graphitise
+graphitises
+grecise
+grecised
+grecising
+gruelled
+grueller
+gruellers
+gutturalisation
+gutturalisation's
+gutturalisations
+gutturalise
+gutturalised
+gutturalises
+gutturalising
+gynaecocrat
+gynaecocratic
+gynaecologic
+gynaecologics
+gynaecologies
+gynaecology
+gynaecology's
+gyrostabiliser
+habitualise
+habitualises
+hamletisation
+hamletisation's
+hamletisations
+hamletise
+hamletises
+handselled
+handselling
+hanselled
+hanselling
+harbourage
+harbourages
+harbourful
+harbourless
+harbourlesses
+harmonisable
+harmonisables
+hatchelled
+hatchelling
+hazardise
+hazardises
+heathenisation
+heathenise
+heathenised
+heathenises
+heathenising
+heavenise
+heavenises
+hebraisation
+hebraisations
+hebraise
+hebraised
+hebraises
+hebraising
+hectogramme
+hectogramme's
+hectogrammes
+hectolitre
+hectometre
+hectometre's
+hectometres
+heparinise
+hepatise
+hepatised
+hepatises
+hepatising
+heraldise
+heraldises
+hereticise
+hereticises
+heroinise
+heroinises
+heroisation
+heroisation's
+heroisations
+heroise
+heroised
+heroises
+heroising
+hiccough
+hiccoughed
+hiccoughes
+hiccoughing
+hirselled
+hirselling
+historicise
+historicised
+historicises
+historicising
+hominisation
+hominised
+homoeopathic
+homoeopathically
+homoeopathies
+homoeopathy
+homoeopathy's
+homoeostasis
+homoeostatic
+homoeotypic
+homologisation
+homologise
+homologised
+homologiser
+homologises
+homologising
+honourabilities
+honourability
+honourability's
+honourableship
+honourableship's
+honourableships
+honourless
+honourlesses
+hoodlumise
+hoodlumises
+hooliganise
+hooliganises
+horizontalisation
+horizontalisation's
+horizontalisations
+horizontalise
+horizontalises
+hormonise
+hormonises
+horrorise
+horrorises
+hostilise
+hostilises
+hotelisation
+hotelisation's
+hotelisations
+hotelise
+hotelises
+houselled
+houselling
+housellings
+hovelled
+hoveller
+hovellers
+hovelling
+hucksterise
+hucksterises
+humanisation
+humanisation's
+humanisations
+humanitarianise
+humanitarianises
+humorise
+humorises
+humoural
+humourless
+humourlesses
+humourlessness
+humoursome
+hurricanise
+hurricanises
+hyalinisation
+hyalinisation's
+hyalinisations
+hyalinise
+hyalinises
+hybridisable
+hybridisables
+hybridisation
+hybridisation's
+hybridisations
+hybridise
+hybridised
+hybridiser
+hybridisers
+hybridises
+hybridising
+hydrogenisation
+hydrogenisation's
+hydrogenisations
+hydrogenise
+hydrogenised
+hydrogenises
+hydrogenising
+hydrolyse
+hydrolyse's
+hydrolyses
+hydroxylisation
+hydroxylisation's
+hydroxylisations
+hydroxylise
+hydroxylises
+hygienisation
+hygienisation's
+hygienisations
+hygienise
+hygienises
+hyperaesthesia
+hyperaesthetic
+hyperbolise
+hyperbolised
+hyperbolises
+hyperbolising
+hypercatharses
+hypercivilisation
+hypercivilisation's
+hypercivilisations
+hypercivilised
+hypercivilised's
+hyperciviliseds
+hypercriticise
+hypercriticises
+hyperemphasise
+hyperemphasises
+hyperimmunisation
+hyperimmunisation's
+hyperimmunisations
+hyperimmunise
+hyperimmunises
+hyperinsulinisation
+hyperinsulinisation's
+hyperinsulinisations
+hyperinsulinise
+hyperinsulinises
+hyperoxygenise
+hyperoxygenises
+hyperparasitise
+hyperparasitises
+hyperrealise
+hyperrealises
+hypersensitisation
+hypersensitisation's
+hypersensitisations
+hypersensitise
+hypersensitised
+hypersensitises
+hypersensitising
+hyperspiritualising
+hyperspiritualising's
+hyperspiritualisings
+hyperthyroidisation
+hyperthyroidisation's
+hyperthyroidisations
+hyperthyroidise
+hyperthyroidises
+hypervitalisation
+hypervitalisation's
+hypervitalisations
+hypervitalise
+hypervitalises
+hyphenisation
+hyphenisation's
+hyphenisations
+hyphenise
+hyphenises
+hypnotisabilities
+hypnotisability
+hypnotisability's
+hypnotisable
+hypnotisables
+hypnotisation
+hypnotisation's
+hypnotisations
+hypnotise
+hypnotiser
+hypnotisers
+hypnotises
+hypnotising
+hypocentre
+hyposensitisation
+hyposensitise
+hypostatisation
+hypostatisation's
+hypostatisations
+hypostatise
+hypostatises
+hysterectomise
+hysterectomised
+hysterectomises
+hysterectomising
+ichneumonised
+ichneumonised's
+ichneumoniseds
+idiotise
+idiotises
+idolatrise
+idolatrised
+idolatrises
+idolatrising
+idolisation
+idolisation's
+idolisations
+illegalisation
+illegalise
+illegalised
+illegalises
+illegalising
+illegitimatise
+illegitimatises
+immaterialisation
+immaterialise
+immaterialised
+immaterialises
+immaterialising
+immobilisation
+immobilisation's
+immobilisations
+immoralise
+immoralises
+immortalisable
+immortalisables
+immortalisation
+immortalisation's
+immortalisations
+immortalise
+immortaliser
+immortalisers
+immortalises
+immortalising
+immunise
+immunised
+immunises
+immunising
+impactionise
+impactionises
+impanelled
+impanelling
+imperialisation
+imperialisation's
+imperialisations
+imperialise
+imperialises
+imperilling
+impersonalisation
+impersonalisation's
+impersonalisations
+impersonalise
+impersonalises
+impersonalising
+improvisatorise
+improvisatorises
+individualisation
+individualisation's
+individualisations
+indraught
+industrialise
+industrialises
+inferiorise
+inferiorises
+infernalise
+infernalises
+infidelise
+infidelises
+infinitise
+infinitises
+informalise
+inhumanise
+initialisable
+initially
+insolubilisation
+insolubilise
+institutionise
+institutionises
+instrumentalise
+instrumentalises
+insularise
+insularises
+insurrectionise
+insurrectionises
+integralisation
+integralisation's
+integralisations
+integralise
+integralises
+intellectualisation
+intellectualisation's
+intellectualisations
+intellectualise
+intellectualised
+intellectualiser
+intellectualisers
+intellectualises
+intellectualising
+intercivilisation
+intercivilisation's
+intercivilisations
+intercolonisation
+intercolonisation's
+intercolonisations
+intercrystallisation
+intercrystallisation's
+intercrystallisations
+intercrystallise
+intercrystallises
+interhybridise
+interhybridises
+interiorisation
+interiorise
+interiorised
+interiorises
+interiorising
+interjectionalise
+interjectionalises
+interjectionise
+interjectionises
+interjudgement
+interjudgement's
+interjudgements
+internationalise
+internationalises
+internationalising
+interorganisational
+intraorganisation
+intraorganisation's
+intraorganisations
+iodisation
+iodise
+iodised
+iodiser
+iodisers
+iodises
+iodising
+ionisable
+ionisables
+ionisation
+ionisation's
+ionisations
+ironise
+ironises
+irrationalise
+irrationalises
+irregularise
+irregularises
+isochronisation
+isochronise
+isochronised
+isochronises
+isochronising
+isoimmunisation
+isoimmunisation's
+isoimmunisations
+isoimmunise
+isoimmunises
+isomerisation
+isomerisation's
+isomerisations
+isomerise
+isomerised
+isomerises
+isomerising
+italicisation
+italicisation's
+italicisations
+jargonisation
+jargonisation's
+jargonisations
+jargonise
+jargonised
+jargonises
+jargonising
+jasperise
+jasperises
+jeopardisation
+jewelleries
+jewellery
+journalisation
+journalisation's
+journalisations
+jovialise
+jovialises
+judgemental
+judicialise
+judicialises
+juvenilise
+juvenilises
+kaolinisation
+kaolinisation's
+kaolinisations
+kaolinise
+kaolinises
+kennelled
+kennelling
+keratinisation
+keratinise
+keratinised
+keratinises
+keratinising
+kernelled
+kernelling
+ketonisation
+ketonisation's
+ketonisations
+ketonise
+ketonises
+kilolitre
+kilolitre's
+kilolitres
+kinaesthesia
+kyanise
+kyanised
+kyanises
+kyanising
+labellable
+labialisation
+labialisation's
+labialisations
+labialise
+labialised
+labialises
+labialising
+labilisation
+labilisation's
+labilisations
+labilise
+labilises
+labourabilities
+labourability
+labourability's
+labourable
+labourables
+labourhood
+labourhood's
+labourhoods
+labourism
+labourism's
+labourisms
+labourist
+labourist's
+labourists
+labourite
+labourite's
+labourites
+labourless
+labourlesses
+lacklustre
+laconise
+laconised
+laconises
+laconising
+lactonised
+laicisation
+laicisations
+laicise
+laicised
+laicises
+laicising
+lapelled
+latentise
+latentises
+lateralisation
+lateralisation's
+lateralisations
+lateralise
+lateralises
+laterisation
+laterisation's
+laterisations
+laurelling
+leatherise
+leatherises
+legitimatise
+legitimatised
+legitimatises
+legitimatising
+legitimisation
+legitimisation's
+legitimisations
+lethalise
+lethalises
+leukaemia
+lexiconise
+lexiconises
+libellant
+libellants
+libelled
+libellee
+libellees
+libelling
+licenceless
+licencelesses
+lichenisation
+lichenisation's
+lichenisations
+lichenise
+lichenises
+lignitise
+lignitises
+linearisation
+linearisation's
+linearisations
+linenise
+lineniser
+linenisers
+linenises
+lingualise
+lingualises
+lionisable
+lionisables
+lionisation
+lionisation's
+lionisations
+liquidisation
+liquidise
+liquidised
+liquidiser
+liquidisers
+liquidises
+liquidising
+literalisation
+literalisation's
+literalisations
+literalise
+literalised
+literaliser
+literalisers
+literalises
+lithographise
+lithographises
+localisable
+localisables
+logicalisation
+logicalisation's
+logicalisations
+logicalise
+logicalises
+logicise
+logicised
+logicises
+logicising
+logorrhoea
+logorrhoea's
+logorrhoeas
+louvre
+louvred
+louvres
+loyalise
+loyalises
+lumbarisation
+lumbarisation's
+lumbarisations
+lunatise
+lunatises
+lustreless
+lustreware
+luteinisation
+luteinise
+lyophilisation
+lyophilise
+lyophilised
+lyophiliser
+lyricise
+lyricised
+lyricises
+lyricising
+lysogenisation
+lysogenise
+macadamisation
+macadamise
+macadamised
+macadamises
+macadamising
+macarise
+macarised
+macarises
+macarising
+machinisation
+machinisation's
+machinisations
+machinise
+machinises
+magicalise
+magicalises
+magnetisabilities
+magnetisability
+magnetisability's
+magnetisable
+magnetisables
+magnetise
+magnetiser
+magnetisers
+magnetises
+magnetising
+mahoganise
+mahoganised
+mahoganises
+mahoganising
+majorise
+majorises
+malleablise
+malleablises
+malodour
+mandarinise
+mandarinises
+mannerise
+mannerises
+marbleise
+marbleises
+marginalisation
+marginalise
+marginalised
+marginalises
+marginalising
+marsupialisation
+marsupialisation's
+marsupialisations
+marsupialise
+marsupialises
+martialisation
+martialisation's
+martialisations
+martialise
+martialises
+martyrisation
+martyrisation's
+martyrisations
+martyrise
+martyrised
+martyriser
+martyrisers
+martyrises
+martyrising
+marveller
+masculinisation
+masculinisation's
+masculinisations
+masculinise
+masculinised
+masculinises
+masculinising
+materialisation
+materialisation's
+materialisations
+maternalise
+maternalises
+mathematicise
+mathematicises
+mathematisation
+matronise
+matronised
+matronises
+matronising
+maudlinise
+maudlinises
+mazourka
+mazourka's
+mazourkas
+mechanicalisation
+mechanicalisation's
+mechanicalisations
+mechanicalise
+mechanicalises
+mechanisable
+medalise
+medalises
+medallist
+medallists
+mediaevalise
+mediaevalises
+mediaevalism
+mediaevalism's
+mediaevalisms
+mediaevalistic
+mediaevalistics
+medialisation
+medialisation's
+medialisations
+medialise
+medialises
+mediatisation
+mediatisation's
+mediatisations
+mediatise
+mediatised
+mediatises
+mediatising
+mediumisation
+mediumisation's
+mediumisations
+mediumise
+mediumises
+melanisation
+melanise
+melanised
+melanises
+melanising
+melodisation
+melodise
+melodised
+melodiser
+melodises
+melodising
+melodramatisation
+melodramatise
+melodramatised
+melodramatises
+melodramatising
+memorialisation
+memorialisation's
+memorialisations
+memorialise
+memorialiser
+memorialisers
+memorialises
+memorialising
+memorisable
+memorisables
+mentalisation
+mentalisation's
+mentalisations
+mentalise
+mentalises
+mercerisation
+mercerisation's
+mercerisations
+mercerise
+mercerised
+merceriser
+mercerisers
+mercerises
+mercerising
+mercurialisation
+mercurialisation's
+mercurialisations
+mercurialise
+mercurialises
+mesmerisabilities
+mesmerisability
+mesmerisability's
+mesmerisable
+mesmerisables
+mesmerisation
+mesmerisation's
+mesmerisations
+mesmerise
+mesmeriser
+mesmerisers
+mesmerises
+mesmerising
+metabolisable
+metabolisables
+metabolise
+metabolises
+metabolising
+metacentre
+metallicise
+metallicises
+metallise
+metallised
+metallises
+metallising
+metamerisation
+metamerisation's
+metamerisations
+metamerised
+metamerised's
+metameriseds
+metaphonise
+metaphonises
+metaphorise
+metaphorises
+metaphysicise
+metaphysicises
+metastasise
+metastasised
+metastasises
+metastasising
+meteorisation
+meteorisation's
+meteorisations
+meteorise
+meteorises
+methodisation
+methodisation's
+methodisations
+methodise
+methodised
+methodiser
+methodisers
+methodises
+methodising
+metricise
+metricised
+metricises
+metricising
+metropolitanise
+metropolitanises
+miaow
+miaowed
+miaowing
+miaows
+microgramme
+microgramme's
+microgrammes
+microlitre
+microlitre's
+microlitres
+micrometre
+micrometre's
+micrometres
+micromillimetre
+micromillimetre's
+micromillimetres
+microminiaturisation
+microminiaturise
+microminiaturised
+microminiaturiser
+microminiaturisers
+microminiaturises
+microminiaturising
+micronisation
+micronisation's
+micronisations
+micronise
+micronises
+micropolarisation
+micropolarisation's
+micropolarisations
+microscopise
+microscopises
+militarisation
+militarisations
+militarise
+militarised
+militarises
+militarising
+millionise
+millionises
+mineralisable
+mineralisables
+mineralisation
+mineralisation's
+mineralisations
+mineralise
+mineraliser
+mineralisers
+mineralises
+mineralising
+miraculise
+miraculised
+miraculises
+miraculising
+mirrorise
+mirrorises
+misalphabetise
+misalphabetises
+misanthropise
+misanthropised
+misanthropises
+misanthropising
+misauthorisation
+misauthorisation's
+misauthorisations
+misauthorise
+misauthorises
+misbaptise
+misbaptises
+miscanonise
+miscanonises
+mischaracterisation
+mischaracterisation's
+mischaracterisations
+mischaracterise
+mischaracterises
+miscolour
+miscolour's
+miscoloured
+miscolouring
+miscolours
+misemphases
+misemphasise
+misemphasises
+misendeavour
+misendeavour's
+misendeavours
+mislabelled
+mislabelling
+mislabour
+mislabour's
+mislaboured
+mislabouring
+mislabours
+misorganisation
+misorganisation's
+misorganisations
+misorganise
+misorganises
+misprise
+misprised
+misprises
+misprising
+misrealise
+misrealises
+misrecognise
+misrecognises
+misrouteing
+missionarise
+missionarises
+missionisation
+missionise
+missionised
+missioniser
+missionisers
+missionises
+missionising
+mobilisable
+mobilisables
+modalise
+modalises
+modernisable
+modernisables
+moisturisation
+moisturise
+moisturised
+moisturiser
+moisturisers
+moisturises
+moisturising
+molarisation
+molarisations
+monarchise
+monarchiser
+monarchisers
+monarchises
+monasticise
+monasticises
+mongrelisation
+mongrelisations
+mongrelise
+mongrelised
+mongreliser
+mongrelises
+mongrelising
+monochordise
+monochordises
+monologise
+monologised
+monologises
+monologising
+monometallism
+monometallist
+monopolisable
+monopolisables
+monotonise
+monotonises
+monumentalisation
+monumentalisation's
+monumentalisations
+monumentalise
+monumentalised
+monumentalises
+monumentalising
+moralisation
+moralisation's
+moralisations
+moralise
+moralised
+moraliser
+moralisers
+moralises
+moralising
+moralisinglies
+moralisingly
+morbidise
+morbidises
+morphinisation
+morphinisation's
+morphinisations
+morphinise
+morphinises
+morselisation
+morselisation's
+morselisations
+morselise
+morselises
+morselled
+morselling
+mortalise
+mortalises
+mortarise
+mortarises
+motorisation
+motorisation's
+motorisations
+multifibred
+multifibred's
+multifibreds
+municipalisation
+municipalisation's
+municipalisations
+municipalise
+municipalised
+municipaliser
+municipalisers
+municipalises
+municipalising
+muscularise
+muscularises
+museumise
+museumises
+musicalisation
+musicalisation's
+musicalisations
+musicalise
+musicalises
+mutualisation
+mutualisation's
+mutualisations
+mutualise
+mutualised
+mutualises
+mutualising
+myelinisation
+myelinisation's
+myelinisations
+mysticise
+mysticises
+mythicisation
+mythicise
+mythicised
+mythiciser
+mythicisers
+mythicises
+mythicising
+mythise
+mythises
+mythologisation
+mythologise
+mythologised
+mythologiser
+mythologises
+mythologising
+nakedise
+nakedises
+nanogramme
+nanogrammes
+nanometre
+nanometres
+narcotisation
+narcotise
+narcotised
+narcotising
+nasalise
+nasalises
+nasalising
+naturalise
+naturaliser
+naturalisers
+naturalises
+naturalising
+naturise
+naturises
+nebularisation
+nebularisation's
+nebularisations
+nebularise
+nebularises
+nebulisation
+nebulisations
+nebulise
+nebulised
+nebuliser
+nebulises
+nebulising
+necrotise
+necrotised
+necrotises
+necrotising
+nectarise
+nectarises
+neighbourless
+neighbourlesses
+neighbourlike
+neighbourlike's
+neighbourlikes
+neighbourship
+neighbourship's
+neighbourships
+neologisation
+neologise
+neologised
+neologises
+neologising
+neuroticise
+neuroticises
+newspaperised
+newspaperised's
+newspaperiseds
+nickelisation
+nickelisation's
+nickelisations
+nickelise
+nickelises
+nicotinise
+nicotinises
+nightingalise
+nightingalises
+nitre
+nitridisation
+nitridisation's
+nitridisations
+nitridise
+nitridises
+nitrogenisation
+nitrogenisation's
+nitrogenisations
+nitrogenise
+nitrogenised
+nitrogenises
+nitrogenising
+nodulise
+nodulises
+nomadisation
+nomadisation's
+nomadisations
+nomadise
+nomadised
+nomadises
+nomadising
+nominalise
+nominalises
+nominalising
+nonacknowledgement
+nonacknowledgement's
+nonacknowledgements
+nonanaesthetised
+nonapostatising
+nonapostatising's
+nonapostatisings
+noncanonisation
+noncanonisation's
+noncanonisations
+noncartelised
+noncartelised's
+noncarteliseds
+noncatechisable
+noncatechisables
+noncivilised
+noncivilised's
+nonciviliseds
+noncolouring
+noncolouring's
+noncolourings
+noncrystallisable
+noncrystallisables
+noncrystallised
+noncrystallised's
+noncrystalliseds
+noncrystallising
+noncrystallising's
+noncrystallisings
+nondemobilisation
+nondemobilisation's
+nondemobilisations
+nondialysing
+nondialysing's
+nondialysings
+nondimensionalise
+nondimensionalised
+nonfavourite
+nonfavourite's
+nonfavourites
+nonfulfilment
+nonfulfilment's
+nonfulfilments
+nongalvanised
+nongalvanised's
+nongalvaniseds
+nongelatinising
+nongelatinising's
+nongelatinisings
+nonhydrolysable
+nonhydrolysables
+nonimmunised
+nonimmunised's
+nonimmuniseds
+nonionised
+nonionised's
+nonioniseds
+nonionising
+nonionising's
+nonionisings
+nonlocalised
+nonlocalised's
+nonlocaliseds
+nonmagnetisable
+nonmagnetisables
+nonnitrogenised
+nonnitrogenised's
+nonnitrogeniseds
+nonorganisation
+nonorganisation's
+nonorganisations
+nonoxidisable
+nonoxidisables
+nonoxidising
+nonoxidising's
+nonoxidisings
+nonparlour
+nonparlour's
+nonparlours
+nonpenalised
+nonpenalised's
+nonpenaliseds
+nonphosphorised
+nonphosphorised's
+nonphosphoriseds
+nonpolarisable
+nonpolarisables
+nonpolarised
+nonpolarising
+nonpolarising's
+nonpolarisings
+nonrationalised
+nonrationalised's
+nonrationaliseds
+nonrealisation
+nonrealisation's
+nonrealisations
+nonrecognised
+nonrecognised's
+nonrecogniseds
+nonschematised
+nonschematised's
+nonschematiseds
+nonsensitised
+nonsensitised's
+nonsensitiseds
+nonspecialised
+nonspecialised's
+nonspecialiseds
+nonstandardised
+nonstandardised's
+nonstandardiseds
+nonstylised
+nonstylised's
+nonstyliseds
+nonsympathiser
+nonsympathiser's
+nonsympathisers
+nonsynthesised
+nonsynthesised's
+nonsynthesiseds
+nontemporising
+nontemporising's
+nontemporisings
+nonutilised
+nonutilised's
+nonutiliseds
+nonvisualised
+nonvisualised's
+nonvisualiseds
+nonvolatilised
+nonvolatilised's
+nonvolatiliseds
+nonvulcanisable
+nonvulcanisables
+normalisable
+northernise
+northernises
+nosise
+notarisation
+notarisations
+nothingise
+nothingises
+nounise
+nounises
+novelisation
+novelisation's
+novelisations
+novelise
+noveliser
+novelisers
+novelises
+novelising
+nuptialise
+nuptialises
+obelise
+obelised
+obelises
+obelising
+objectisation
+objectisation's
+objectisations
+objectise
+objectises
+objectivise
+objectivises
+oblivionise
+oblivionises
+ochreous
+odorise
+odorised
+odoriser
+odorises
+odorising
+odourful
+odourless
+odourlesses
+oesophagus
+offenceless
+offencelesses
+offencelessly
+officialisation
+officialisation's
+officialisations
+officialise
+officialises
+onionised
+onionised's
+onioniseds
+opalise
+opalises
+opalled
+operatise
+operatises
+optionalise
+optionalises
+oralisation
+oralisation's
+oralisations
+oralise
+oralises
+orangise
+orangises
+oratorise
+oratorises
+organisabilities
+organisability
+organisability's
+organisationist
+organisationist's
+organisationists
+orientalisation
+orientalisation's
+orientalisations
+orientalise
+orientalised
+orientalises
+orientalising
+orientate
+orientated
+orientates
+orientating
+orientisation
+orientisation's
+orientisations
+orientise
+orientises
+ornamentalise
+ornamentalises
+orphanise
+orphanises
+orthocentre
+orthogonalise
+orthogonalises
+orthogonalising
+orthopaedically
+orthopaedist
+ostracisable
+ostracisables
+ostracisation
+ostracisation's
+ostracisations
+ostracise
+ostraciser
+ostracisers
+ostracises
+ostracising
+outcavilled
+outcavilling
+outclamour
+outclamour's
+outclamours
+outhumour
+outhumour's
+outhumoured
+outhumouring
+outhumours
+outhyperbolise
+outhyperbolises
+outlabour
+outlabour's
+outlabours
+outrivalled
+outrivalling
+outsavour
+outsavour's
+outsavouring
+outsavours
+outsplendour
+outsplendour's
+outsplendours
+outtyrannise
+outtyrannises
+ovalisation
+ovalisation's
+ovalisations
+ovalise
+ovalises
+ovariectomised
+overagonise
+overagonises
+overbrutalise
+overbrutalises
+overcapitalisation
+overcapitalisation's
+overcapitalisations
+overcapitalise
+overcapitalised
+overcapitalises
+overcapitalising
+overcentralisation
+overcentralisation's
+overcentralisations
+overcentralise
+overcentralises
+overcivilisation
+overcivilisation's
+overcivilisations
+overcivilise
+overcivilises
+overclamour
+overclamour's
+overclamours
+overcolour
+overcolour's
+overcolours
+overcriticise
+overcriticises
+overdoctrinise
+overdoctrinises
+overemotionalise
+overemotionalises
+overfavour
+overfavour's
+overfavourable
+overfavourables
+overfavourablies
+overfavourably
+overfavours
+overfertilisation
+overgeneralise
+overgeneralises
+overhonour
+overhonour's
+overhonours
+overhumanise
+overhumanises
+overindustrialisation
+overindustrialisation's
+overindustrialisations
+overindustrialise
+overindustrialises
+overjudgement
+overjudgement's
+overjudgements
+overlabour
+overlabour's
+overlabours
+overnationalisation
+overnationalisation's
+overnationalisations
+overrapturise
+overrapturises
+overrationalise
+overrationalises
+oversentimentalise
+oversentimentalises
+overspecialisation
+overspecialisation's
+overspecialisations
+overspecialise
+overspecialised
+overspecialises
+oversystematise
+oversystematises
+overunionised
+overunionised's
+overunioniseds
+overurbanisation
+overurbanisation's
+overurbanisations
+overwomanise
+overwomanises
+oxidisabilities
+oxidisability
+oxidisability's
+oxidisable
+oxidisables
+oxidisation
+oxidisation's
+oxidisations
+oxidisement
+oxidisement's
+oxidisements
+oxygenisable
+oxygenisables
+oxygenise
+oxygenisement
+oxygenisement's
+oxygenisements
+oxygeniser
+oxygenisers
+oxygenises
+ozonisation
+ozonisation's
+ozonisations
+ozonise
+ozonised
+ozoniser
+ozonisers
+ozonises
+ozonising
+packetisation
+packetise
+packetised
+packetiser
+packetiser's
+packetisers
+packetises
+packetising
+paeanise
+paeanises
+paganisation
+paganisation's
+paganisations
+paganise
+paganised
+paganiser
+paganisers
+paganises
+paganising
+palatisation
+palatisation's
+palatisations
+palatise
+palatises
+palladiumise
+palladiumises
+palletisation
+palletisations
+palletise
+palletiser
+palletises
+palletising
+pamperise
+pamperises
+pamphletise
+pamphletises
+panderise
+panderises
+pantheonisation
+pantheonisation's
+pantheonisations
+pantheonise
+pantheonises
+papalisation
+papalisation's
+papalisations
+papalise
+papaliser
+papalisers
+papalises
+parabolisation
+parabolise
+parabolised
+parabolises
+parabolising
+paraffinise
+paraffinises
+paragraphise
+paragraphises
+paralysation
+parasitisation
+parasitise
+parasitised
+parasitises
+parasitising
+parathyroidectomise
+parathyroidectomised
+parathyroidectomises
+parathyroidectomising
+parceller
+parchmentise
+parchmentises
+parenthesisation
+parfocalisation
+parfocalise
+parochialisation
+parochialisation's
+parochialisations
+parochialise
+parochialises
+parrotise
+parrotises
+parsonise
+parsonises
+partialise
+partialises
+particularisation
+particularisation's
+particularisations
+particularise
+particularised
+particularises
+particularising
+partisanise
+partisanises
+pasteurise
+pasteurised
+pasteuriser
+pasteurises
+pasteurising
+pastoralise
+pastoralises
+pastorise
+pastorises
+paternalise
+paternalises
+patronisable
+patronisables
+patronisation
+patronisation's
+patronisations
+patternise
+patternises
+pauperisation
+pauperisation's
+pauperisations
+pauperise
+pauperised
+pauperiser
+pauperisers
+pauperises
+pauperising
+paviour
+pearlisation
+pearlise
+pearlised
+pearlises
+pearlising
+peasantise
+peasantises
+pectisation
+pectise
+pectised
+pectises
+pectising
+peculiarise
+peculiarises
+pedaller
+pedallers
+pedantise
+pedantises
+pedestalled
+pedestalling
+pedestrianisation
+pedestrianise
+pedestrianised
+pedestrianises
+pedestrianising
+pelletisation
+pelletisations
+pelletise
+pelletised
+pelletiser
+pelletises
+pelletising
+pemmicanisation
+pemmicanisation's
+pemmicanisations
+pemmicanise
+pemmicanises
+penalisable
+penalisables
+penalisation
+penalisation's
+penalisations
+penciller
+pencillers
+peptisable
+peptisables
+peptisation
+peptisation's
+peptisations
+peptise
+peptised
+peptiser
+peptisers
+peptises
+peptonisation
+peptonise
+peptonised
+peptonises
+peptonising
+percussionise
+percussionises
+perennialise
+perennialises
+perfectivise
+perfectivises
+perilled
+perilling
+periodicalise
+periodicalises
+periodisation
+periodisations
+periodise
+periodised
+periodises
+periodising
+peroxidise
+peroxidisement
+peroxidisement's
+peroxidisements
+peroxidises
+personisation
+personisation's
+personisations
+personise
+personises
+petrolisation
+petrolisation's
+petrolisations
+petrolise
+petrolises
+phagocytise
+phagocytises
+phantomise
+phantomiser
+phantomisers
+phantomises
+phenolisation
+phenolisation's
+phenolisations
+phenolise
+phenolises
+phenomenalisation
+phenomenalisation's
+phenomenalisations
+phenomenalise
+phenomenalises
+philanthropise
+philanthropises
+philosophisation
+philosophisation's
+philosophisations
+phlebotomisation
+phlebotomise
+phlebotomised
+phlebotomises
+phlebotomising
+phoneticisation
+phoneticisation's
+phoneticisations
+phoneticise
+phoneticises
+phosphatisation
+phosphatisation's
+phosphatisations
+phosphatise
+phosphatised
+phosphatises
+phosphatising
+phosphorise
+phosphorises
+photocatalyser
+photocatalyser's
+photocatalysers
+photographise
+photographises
+photoionisation
+photoionisation's
+photoionisations
+photoisomerisation
+photoisomerisation's
+photoisomerisations
+photolabelled
+photolabeller
+photolabelling
+photolysable
+photolyse
+photolysed
+photolyses
+photolysing
+photopolymerisation
+photopolymerisation's
+photopolymerisations
+photosensitisation
+photosensitisation's
+photosensitisations
+photosensitise
+photosensitised
+photosensitiser
+photosensitisers
+photosensitises
+photosensitising
+photosynthesise
+photosynthesised
+photosynthesises
+photosynthesising
+piastre
+picogramme
+picogramme's
+picogrammes
+picometre
+picometre's
+picometres
+pictorialisation
+pictorialisation's
+pictorialisations
+pictorialise
+pictorialised
+pictorialises
+pictorialising
+picturisation
+picturisation's
+picturisations
+picturise
+picturised
+picturises
+picturising
+pidginisation
+pidginise
+pidginised
+pidginises
+pidginising
+pigmentise
+pigmentises
+pilgrimise
+pilgrimises
+pillarise
+pillarises
+piratise
+piratises
+pistolled
+pistolling
+plagiarisation
+plagiarisation's
+plagiarisations
+plagiarise
+plagiarised
+plagiariser
+plagiarisers
+plagiarises
+plagiarising
+plasmolyse
+plasticisation
+plasticisation's
+plasticisations
+plasticise
+plasticised
+plasticiser
+plasticisers
+plasticises
+plasticising
+platinisation
+platinisation's
+platinisations
+platitudinisation
+platitudinise
+platitudinised
+platitudinises
+platitudinising
+platonisation
+platonise
+platonised
+platonises
+platonising
+plebeianise
+plebeianises
+ploughable
+ploughboy
+ploughhead
+poeticisation
+poeticise
+poeticised
+poeticises
+poeticising
+poetisation
+poetisation's
+poetisations
+poetise
+poetised
+poetiser
+poetisers
+poetises
+poetising
+pogromise
+pogromises
+polarisabilities
+polarisability
+polarisability's
+polarisable
+polarisables
+polemicise
+polemicised
+polemicises
+polemicising
+polemise
+polemised
+polemises
+polemising
+policise
+policiser
+policisers
+policises
+politicalise
+politicalises
+politicisation
+politicise
+politiciser
+politicisers
+politicises
+politicising
+politise
+politises
+polleniser
+pollinise
+pollinised
+polliniser
+pollinises
+pollinising
+polychromatise
+polychromatises
+polychromise
+polychromises
+polygamise
+polygamises
+polymerisation
+polymerisation's
+polymerise
+polymerises
+polysulphurisation
+polysulphurisation's
+polysulphurisations
+pommelled
+pommelling
+porcelainisation
+porcelainisation's
+porcelainisations
+porcelainise
+porcelainises
+portionise
+portionises
+positivise
+positivises
+posterise
+posterises
+postsynchronisation
+posturise
+posturises
+potentialisation
+potentialisation's
+potentialisations
+potentialise
+potentialises
+potentise
+potentises
+powderisation
+powderisation's
+powderisations
+powderise
+powderiser
+powderisers
+powderises
+preacherise
+preacherises
+preacknowledgement
+preacknowledgement's
+preacknowledgements
+preanaesthetic
+preanaesthetics
+prebaptise
+prebaptises
+precancellation
+precisionise
+precisionises
+precivilisation
+precivilisation's
+precivilisations
+precolour
+precolour's
+precolourable
+precolourables
+precolouring
+precolourings
+precolours
+preconisation
+preconisation's
+preconisations
+preconise
+preconiser
+preconisers
+preconises
+precriticise
+precriticises
+prefavour
+prefavour's
+prefavourable
+prefavourables
+prefavourablies
+prefavourably
+prefavourite
+prefavourite's
+prefavourites
+prefavours
+prefertilisation
+prefertilisation's
+prefertilisations
+prefertilise
+prefertilises
+preflavour
+preflavour's
+preflavouring
+preflavourings
+preflavours
+pregalvanise
+pregalvanises
+prehumour
+prehumour's
+prehumours
+prejudgement
+prelabour
+prelabour's
+prelabours
+prelatise
+prelatises
+prelocalisation
+prelocalisation's
+prelocalisations
+preludise
+preludises
+premediaeval
+premediaeval's
+premediaevalism
+premediaevalism's
+premediaevalisms
+premediaevals
+premonopolise
+premonopolises
+preoffence
+preoffence's
+preoffences
+preorganisation
+preorganisation's
+preorganisations
+preorganise
+preorganises
+preoxidise
+preoxidised
+preoxidises
+preoxidising
+preprogramme
+prerealisation
+prerealisation's
+prerealisations
+prerealise
+prerealises
+prerecognise
+prerecognises
+prespecialise
+prespecialises
+presplendour
+presplendour's
+presplendours
+pressurisation
+prestandardisation
+prestandardisation's
+prestandardisations
+prestandardise
+prestandardises
+presympathise
+presympathises
+preutilisable
+preutilisables
+preutilisation
+preutilisation's
+preutilisations
+preutilise
+preutilises
+priorisation
+priorisations
+priorise
+priorised
+priorises
+priorising
+prioritisation
+privatisation
+privatise
+privatised
+privatising
+problemise
+problemises
+processionise
+processionises
+proctorisation
+proctorisation's
+proctorisations
+proctorise
+proctorises
+prodigalise
+prodigalises
+profanise
+profanises
+professionalisation
+professionalisation's
+professionalisations
+professionalise
+professionalised
+professionalises
+professionalising
+professionise
+professionises
+programmist
+programmist's
+programmistic
+programmistics
+programmists
+proletarianise
+proletarianises
+proletarianising
+prologuise
+prologuiser
+prologuisers
+prologuises
+prolusionise
+prolusionises
+propagandise
+propagandised
+propagandises
+propagandising
+prophetise
+prophetises
+propositionise
+propositionises
+propraetor
+proselytisation
+proselytisation's
+proselytisations
+protectionise
+protectionises
+protocolisation
+protocolisation's
+protocolisations
+protocolise
+protocolises
+protocolled
+protocolling
+proverbialise
+proverbialises
+proverbise
+proverbises
+provincialisation
+provincialisation's
+provincialisations
+provincialise
+provincialises
+pseudoanaemia
+pseudoanaemia's
+pseudoanaemias
+pseudoanaemic
+pseudoanaemics
+pseudographise
+pseudographises
+pseudomediaeval
+pseudomediaeval's
+pseudomediaevals
+pseudooedema
+pseudooedema's
+pseudooedemas
+psychoanalyse
+psychoanalyser
+psychoanalyser's
+psychoanalysers
+psychoanalyses
+psychologisation
+psychologise
+psychologised
+psychologises
+psychologising
+puebloisation
+puebloisation's
+puebloisations
+puebloise
+puebloises
+pulpitise
+pulpitises
+pulverisable
+pulverisables
+pulverisation
+pulverisation's
+pulverisations
+pummeller
+pummelling
+pupilise
+pupilises
+puppetise
+puppetises
+pyorrhoeal
+pyramidise
+pyramidises
+pyridinise
+pyridinises
+pyritisation
+pyritisation's
+pyritisations
+pyritise
+pyritises
+pyrolysable
+pyrolysate
+pythonise
+pythonises
+quarrellous
+quarterisation
+quarterisation's
+quarterisations
+quininise
+quininises
+racemisation
+racemise
+racemised
+racemises
+racemising
+racialisation
+racialisation's
+racialisations
+racialise
+racialises
+radialisation
+radialisation's
+radialisations
+radialise
+radialises
+radicalisation
+radicalisation's
+radicalisations
+radicalise
+radicalised
+radicalises
+radicalising
+radiosterilise
+radiosterilises
+radiosterilising
+radiumisation
+radiumisation's
+radiumisations
+radiumise
+radiumises
+rapturise
+rapturises
+rascalise
+rascalises
+rationalisable
+rationalisables
+ravelled
+raveller
+ravellers
+ravelling
+ravellings
+reacclimatise
+reactualise
+realisticise
+realisticises
+reanimalise
+reanimalises
+reapologise
+reauthorise
+rebaptisation
+rebaptisation's
+rebaptisations
+rebourbonise
+rebourbonises
+rebrutalise
+recanalisation
+recapitalise
+recarbonise
+recausticise
+recausticises
+recentralise
+reciprocalise
+reciprocalises
+recivilise
+recolonise
+recolour
+recolour's
+recolouring
+reconnoitre
+reconnoitre's
+reconnoitred
+reconnoitres
+reconnoitring
+recriticise
+redialler
+redialling
+refavour
+refavour's
+refertilise
+reflectorise
+reflectorised
+reflectorises
+reflectorising
+reforestisation
+reforestisation's
+reforestise
+reforestises
+regalise
+regalises
+regalvanisation
+regalvanisation's
+regalvanisations
+regalvanise
+regalvanises
+regionalisation
+regionalisation's
+regionalisations
+regionalise
+regionalised
+regionalises
+regionalising
+regularisation
+regularisation's
+regularisations
+regularise
+regularised
+regulariser
+regularisers
+regularises
+reharmonise
+rehonour
+rehonour's
+rehumanisation
+rehumanise
+rehybridise
+rehybridises
+reinitialisation
+reitemise
+relativisation
+relativisation's
+relativisations
+relativise
+relativised
+relativises
+relativising
+religionise
+religionises
+remagnetise
+remagnetises
+rematerialise
+rememorise
+remilitarisation
+remilitarise
+remineralisation
+remineralisation's
+remineralisations
+remineralise
+remineralises
+remobilise
+renationalise
+renationalising
+rencontre
+renormalisation
+renormalise
+renormalising
+reobjectivisation
+reobjectivisation's
+reobjectivisations
+reobjectivise
+reobjectivises
+reorganisational
+reorganisationist
+reorganisationist's
+reorganisationists
+reoxidise
+reoxygenise
+reoxygenises
+repaganisation
+repaganisation's
+repaganisations
+repaganise
+repaganiser
+repaganisers
+repaganises
+repatronise
+repersonalise
+rephosphorisation
+rephosphorisation's
+rephosphorisations
+rephosphorise
+rephosphorises
+repolymerisation
+repolymerisation's
+repolymerisations
+repolymerise
+repolymerises
+reprivatisation
+reprivatisation's
+reprivatisations
+reprivatise
+reprivatises
+republicanisation
+republicanisation's
+republicanisations
+republicanise
+republicanised
+republicaniser
+republicanisers
+republicanises
+republicanising
+repulverise
+reroyalise
+reroyalises
+resensitisation
+resensitisation's
+resensitisations
+resensitise
+resensitises
+resepulchre
+resinise
+resinises
+resolemnise
+resolemnises
+restandardise
+resterilise
+restigmatise
+restigmatises
+resurrectionise
+resurrectionises
+resymbolise
+resynchronisation
+resynchronise
+resynchronising
+resynthesise
+retinise
+retinises
+retranquilise
+reutilise
+revalorisation
+revalorisation's
+revalorisations
+revalorise
+revalorised
+revalorises
+revalorising
+revaporise
+revaporises
+revelationise
+revelationises
+revisualise
+revitalisation's
+revitalisations
+revivalise
+revivalises
+revolatilise
+revolatilises
+revolutionisement
+revolutionisement's
+revolutionisements
+rhapsodise
+rhapsodised
+rhapsodises
+rhapsodising
+rhythmicise
+rhythmicises
+rhythmisable
+rhythmisables
+rhythmisation
+rhythmisation's
+rhythmisations
+rhythmise
+rhythmises
+ridiculise
+ridiculises
+ritualisation
+ritualise
+ritualises
+ritualising
+rivalise
+rivalises
+rivalless
+rivallesses
+robotisation
+robotisation's
+robotisations
+robotise
+robotises
+roentgenise
+romanticisation
+routinisation
+routinisation's
+routinisations
+routinise
+routinises
+rowelled
+rowelling
+royalisation
+royalisation's
+royalisations
+royalise
+royalises
+rubberisation
+rubberise
+rubberises
+rubberising
+rubricise
+rubricises
+ruffianise
+ruffianises
+ruggedisation
+ruggedise
+ruggedised
+ruggedises
+ruggedising
+rumourmonger
+rumourmonger's
+rumourmongers
+ruralisation
+ruralisation's
+ruralisations
+ruralise
+ruralised
+ruralises
+ruralising
+russianisation
+russianise
+rusticise
+rusticises
+sabrelike
+sabrelike's
+sabrelikes
+sabretooth
+sacralisation
+sacralisation's
+sacralisations
+sacramentise
+sacramentises
+sailorising
+sailorising's
+sailorisings
+salinisation
+salinise
+salinises
+saltpetre
+saltpetre's
+saltpetres
+sandalled
+sandalling
+sanitisation
+sapientise
+sapientises
+satanise
+satanises
+satinise
+satinises
+satirisable
+satirisables
+satirise
+satirised
+satiriser
+satirisers
+satirising
+savagise
+savagises
+saviourhood
+saviourhood's
+saviourhoods
+saviourship
+saviourship's
+saviourships
+savourilies
+savourily
+savourless
+savourlesses
+savourous
+scandalisation
+scandalisation's
+scandalisations
+scandalise
+scandaliser
+scandalisers
+scandalises
+scandalled
+scandalling
+scenarioisation
+scenarioisation's
+scenarioisations
+scenarioise
+scenarioises
+scenarisation
+scenarisation's
+scenarisations
+scenarise
+scenarises
+sceptreless
+sceptrelesses
+schedulise
+schedulises
+schematisation
+schematisation's
+schematisations
+schematise
+schematised
+schematiser
+schematisers
+schematises
+schematising
+schismatise
+schismatised
+schismatises
+schismatising
+sclerotisation
+sclerotised
+scripturalise
+scripturalises
+scrutinisation
+scrutinisation's
+scrutinisations
+seborrhoea
+seborrhoeic
+sectarianisation
+sectarianise
+sectarianised
+sectarianises
+sectarianising
+sectionalisation
+sectionalisation's
+sectionalisations
+sectionalise
+sectionalises
+sectionalising
+sectionise
+sectionises
+secularise
+seculariser
+secularisers
+secularises
+secularising
+semicarbonise
+semicarbonises
+semicivilisation
+semicivilisation's
+semicivilisations
+semicivilised
+semicivilised's
+semiciviliseds
+semifossilised
+semifossilised's
+semifossiliseds
+semihonour
+semihonour's
+semihonours
+semihumanised
+semihumanised's
+semihumaniseds
+semimercerised
+semimercerised's
+semimerceriseds
+semimineralised
+semimineralised's
+semimineraliseds
+seminarise
+seminarises
+seminationalisation
+seminationalisation's
+seminationalisations
+semiorganised
+semiorganised's
+semiorganiseds
+semioxidised
+semioxidised's
+semioxidiseds
+semioxygenised
+semioxygenised's
+semioxygeniseds
+semiprofessionalised
+semiprofessionalised's
+semiprofessionaliseds
+semivulcanised
+semivulcanised's
+semivulcaniseds
+senilise
+senilises
+sensationalise
+sensationalised
+sensationalises
+sensationalising
+sensise
+sensises
+sensitisation
+sensitisation's
+sensitisations
+sensitise
+sensitiser
+sensitisers
+sensitises
+sensitising
+sensualisation
+sensualisation's
+sensualisations
+sensualise
+sensualised
+sensualises
+sensualising
+sentimentalisation
+sentimentalisation's
+sentimentalisations
+sentinelled
+sentinelling
+sepalled
+septicisation
+septicisation's
+septicisations
+sepulchralise
+sepulchralises
+serenise
+serenises
+serialisability
+serialisable
+sermonise
+sermonised
+sermoniser
+sermonisers
+sermonises
+sermonising
+serpentinisation
+serpentinisation's
+serpentinisations
+serpentinise
+serpentinises
+serpentise
+serpentises
+servilise
+servilises
+severalise
+severalises
+severisation
+severisation's
+severisations
+severise
+severises
+sexualisation
+sexualisation's
+sexualisations
+sexualise
+sexualises
+shepherdise
+shepherdises
+siderealise
+siderealises
+signalisation
+signalise
+signalised
+signalising
+silicatisation
+silicatisation's
+silicatisations
+silicidise
+silicidises
+siliconise
+siliconises
+silverise
+silveriser
+silverisers
+silverises
+similarise
+similarises
+similise
+similises
+simonise
+singularisation
+singularisation's
+singularisations
+singularise
+singularises
+sinicise
+sinicised
+sinicises
+sinicising
+sirenise
+sirenises
+sisterise
+sisterises
+skeletonisation
+skeletonisation's
+skeletonisations
+skeletonise
+skeletonised
+skeletoniser
+skeletonisers
+skeletonises
+skeletonising
+skepticise
+skepticises
+slenderise
+slenderised
+slenderises
+slenderising
+sloganise
+sloganises
+snobsnivelling
+soberise
+soberised
+soberises
+soberising
+sockdologising
+solarisation
+solarisation's
+solarisations
+solarise
+solarised
+solarises
+solarising
+soldierise
+soldierises
+solecise
+solecised
+solecises
+solecising
+solemnisation
+solemnisation's
+solemnisations
+solemnise
+solemnised
+solemniser
+solemnisers
+solemnises
+solemnising
+soliloquisation
+soliloquise
+soliloquised
+soliloquiser
+soliloquisers
+soliloquises
+soliloquising
+soliloquising's
+soliloquisingly
+soliloquisings
+solmisation
+solubilisation
+solubilise
+solubilised
+solubilises
+solubilising
+solutise
+solutiser
+solutisers
+solutises
+sonantised
+sonantised's
+sonantiseds
+sonnetise
+sonnetises
+southernise
+southernises
+sovietisation
+sovietisation's
+sovietisations
+sovietise
+sovietises
+spatialisation
+spatialisation's
+spatialisations
+spatialise
+spatialises
+specificise
+specificises
+specimenise
+specimenises
+spectrelike
+spectrelike's
+spectrelikes
+spheroidise
+spheroidises
+spiralisation
+spiralisation's
+spiralisations
+spiralise
+spiralises
+spiritise
+spiritises
+spiritualisation
+spiritualisation's
+spiritualisations
+spiritualise
+spiritualised
+spiritualiser
+spiritualisers
+spiritualises
+spiritualising
+spirochaetal
+spirochaete
+spirochaete's
+spirochaetes
+spirochaetosis
+splenectomised
+stabilisable
+stallionise
+stallionises
+stalwartise
+stalwartises
+standardisable
+standardisables
+stapedectomised
+statisticise
+statisticises
+stencilise
+sterilisabilities
+sterilisability
+sterilisability's
+sterilisable
+sterilisables
+stigmatise
+stigmatiser
+stigmatisers
+stigmatises
+stigmatising
+strobilisation
+structuralisation
+structuralisation's
+structuralisations
+structuralise
+structuralises
+strychninisation
+strychninisation's
+strychninisations
+strychninise
+strychninises
+stylise
+styliser
+stylisers
+stylises
+stylising
+subarmour
+subarmour's
+subarmours
+subcentre
+suberisation
+suberisation's
+suberisations
+suberise
+suberised
+suberises
+suberising
+subflavour
+subflavour's
+subflavours
+subjectivisation
+subjectivise
+subjectivises
+sublimise
+sublimises
+subminiaturisation
+subminiaturise
+subminiaturised
+subminiaturises
+subminiaturising
+subpulveriser
+subpulveriser's
+subpulverisers
+subsidisable
+subsidisables
+subspecialise
+subspecialises
+subspecialities
+subspeciality
+subspeciality's
+substandardise
+substandardises
+substantialise
+substantialises
+substantivise
+substantivises
+subterraneanise
+subterraneanises
+subtilisation
+subtilisation's
+subtilisations
+subtilise
+subtiliser
+subtilisers
+subtilises
+subtotalled
+subtotalling
+suburbanise
+suburbanises
+subvitalised
+subvitalised's
+subvitaliseds
+succourable
+succourables
+succourless
+succourlesses
+suggestionise
+suggestionises
+sulfatise
+sulfatises
+sulphurisation
+sulphurisation's
+sulphurisations
+sulphurise
+sulphurises
+sultanise
+sultanises
+summerise
+summerises
+superacknowledgement
+superacknowledgement's
+superacknowledgements
+supercanonisation
+supercanonisation's
+supercanonisations
+supercarbonisation
+supercarbonisation's
+supercarbonisations
+supercarbonise
+supercarbonises
+supercivilisation
+supercivilisation's
+supercivilisations
+supercivilised
+supercivilised's
+superciviliseds
+superemphasise
+superemphasises
+superficialise
+superficialises
+superhumanise
+superhumanises
+supernaturalise
+supernaturalises
+superorganisation
+superorganisation's
+superorganisations
+superorganise
+superorganises
+supersensitisation
+supersensitisation's
+supersensitisations
+superspecialise
+superspecialises
+supersubtilised
+supersubtilised's
+supersubtiliseds
+supersulphurise
+supersulphurises
+surgerise
+surgerises
+sycophantise
+sycophantises
+syllogise
+sylvanise
+sylvanises
+symmetrisation
+symmetrisation's
+symmetrisations
+symmetrise
+symmetrised
+symmetrises
+symmetrising
+symptomise
+symptomises
+synaesthesia
+synaesthetic
+synchronisable
+synchronisables
+syncretise
+syncretised
+syncretises
+syncretising
+syndicalise
+syndicalises
+synonymise
+synonymises
+synopsise
+synthesisation
+synthesisation's
+synthesisations
+syphonless
+syphonlesses
+syphonlike
+syphonlike's
+syphonlikes
+syphonophore
+syphonostele
+syphonostelic
+syphonostely
+systemisable
+systemisables
+systemise
+systemiser
+systemisers
+systemises
+tabouret
+tabourets
+tabularisation
+tabularisation's
+tabularisations
+tabularise
+tabularises
+taffetised
+tailorisation
+tailorisation's
+tailorisations
+tailorise
+tailorises
+tamboura
+tandemise
+tandemises
+tantalisation
+tantalisation's
+tantalisations
+tariffise
+tariffises
+tartarisation
+tartarisation's
+tartarisations
+tartarise
+tartarised
+tartarises
+tasselled
+tasselling
+tassells
+tavernise
+tavernises
+teaseller
+teasellers
+teazelled
+teazelling
+technicalisation
+technicalise
+technicalises
+technologise
+teetotalled
+teetotalling
+telaesthesia
+telaesthetic
+tellurise
+tellurised
+tellurises
+tellurising
+templise
+templises
+temporalise
+temporalised
+temporalises
+temporalising
+temporisation
+temporisation's
+temporisations
+tenderisation
+tenderise
+tenderised
+tenderiser
+tenderises
+tenderising
+tendrilled
+tenementisation
+tenementisation's
+tenementisations
+tenementise
+tenementises
+terminalisation
+terminalisation's
+terminalisations
+terminalised
+terminalised's
+terminaliseds
+ternise
+ternises
+terrestrialise
+terrestrialises
+territorialisation
+territorialisation's
+territorialisations
+territorialise
+territorialises
+terrorisation
+terrorisation's
+terrorisations
+testimonialisation
+testimonialisation's
+testimonialisations
+testimonialise
+testimonialiser
+testimonialisers
+testimonialises
+tetanisation
+tetanise
+tetanised
+tetanises
+tetanising
+teutonise
+texturised
+theatreless
+theatrelesses
+theatrelike
+theatrelike's
+theatrelikes
+theatricalisation
+theatricalisation's
+theatricalisations
+theatricalise
+theatricalised
+theatricalises
+theatricalising
+theatricise
+theatricises
+theologisation
+theologise
+theologised
+theologiser
+theologises
+theologising
+thermoanaesthesia
+thermoanaesthesia's
+thermoanaesthesias
+thermometerise
+thermometerises
+thermopolymerisation
+thermopolymerisation's
+thermopolymerisations
+thermosyphon
+thermosyphon's
+thermosyphons
+thronise
+thronises
+thymectomise
+thyroidectomised
+thyroidisation
+thyroidisation's
+thyroidisations
+tined
+tining
+tinsellier
+tinselliest
+tittupped
+tittupping
+tittuppy
+tonicise
+tonicises
+torporise
+torporises
+totalisation
+totalisation's
+totalisations
+totalisator
+totalise
+totalised
+totaliser
+totalisers
+totalises
+totalising
+totalitarianise
+totemisation
+totemisation's
+totemisations
+tourise
+tourises
+tractorisation
+tractorisation's
+tractorisations
+tractorise
+tractorises
+traditionalise
+traditionalises
+traditionise
+traditionises
+tragicise
+tragicises
+traitorise
+traitorises
+trammelled
+trammeller
+trammellers
+trammelling
+tranquilisation
+tranquilisation's
+tranquilisations
+tranquillisation
+tranquillise
+tranquillised
+tranquilliser
+tranquillisers
+tranquillises
+tranquillising
+transcendentalise
+transcendentalises
+transistorisation
+transparentise
+transparentises
+traumatisation
+traumatise
+traumatised
+traumatises
+traumatising
+triangularise
+triangularised
+triangularises
+triangularising
+trichinise
+trillionise
+trillionises
+trimerisation
+trimerisation's
+trimerisations
+trivialisation
+tropicalisation
+tropicalisation's
+tropicalisations
+tropicalise
+tropicalised
+tropicalises
+tropicalising
+trowelled
+trowelling
+trypsinise
+trypsinises
+tuberculinisation
+tuberculinisation's
+tuberculinisations
+tuberculinise
+tuberculinises
+tuberisation
+tuberisation's
+tuberisations
+tuberise
+tuberises
+tubulisation
+tubulisation's
+tubulisations
+tutorisation
+tutorisation's
+tutorisations
+tutorise
+tutorises
+ultracentraliser
+ultracentraliser's
+ultracentralisers
+ultrahonourable
+ultrahonourables
+ultraspecialisation
+ultraspecialisation's
+ultraspecialisations
+ultrastandardisation
+ultrastandardisation's
+ultrastandardisations
+unagonise
+unalcoholised
+unalcoholised's
+unalcoholiseds
+unanimalised
+unanimalised's
+unanimaliseds
+unantagonisable
+unantagonisables
+unapostatised
+unapostatised's
+unapostatiseds
+unauthorise
+unbaptise
+unbrutalise
+unbrutise
+unbrutises
+uncanonise
+uncanonises
+uncantonised
+uncantonised's
+uncantoniseds
+uncatechised
+uncatechised's
+uncatechisedness
+uncatechiseds
+uncatholicise
+uncatholicises
+uncelestialised
+uncelestialised's
+uncelestialiseds
+unchloridised
+unchloridised's
+unchloridiseds
+unchristianise
+unchristianised
+unchristianises
+uncircularised
+uncircularised's
+uncirculariseds
+uncivilisable
+uncivilisables
+uncivilise
+unclericalise
+unclericalises
+uncolonise
+uncolourable
+uncolourables
+uncolourablies
+uncolourably
+unconventionalise
+unconventionalises
+uncriticisable
+uncriticisables
+uncrystallisabilities
+uncrystallisability
+uncrystallisability's
+uncrystallisable
+uncrystallisables
+uncurricularised
+uncurricularised's
+uncurriculariseds
+undefence
+undefence's
+undemagnetisable
+undemagnetisables
+undemocratise
+undenominationalise
+undenominationalises
+undercapitalisation
+undercapitalisation's
+undercapitalisations
+undercapitalise
+undercapitalised
+undercapitalises
+undercapitalising
+undercolour
+undercolour's
+undercoloured
+undercolouring
+undercolourings
+undercolours
+underemphasise
+underemphasised
+underemphasises
+underemphasising
+underlabourer
+underlabourer's
+underlabourers
+underorganisation
+underorganisation's
+underorganisations
+underoxidise
+underoxidises
+underrealise
+underrealises
+undersaviour
+undersaviour's
+undersaviours
+underutilise
+undervitalised
+undervitalised's
+undervitaliseds
+undiphthongise
+undiphthongises
+undiscoloured
+undiscoloured's
+undramatisable
+undramatisables
+undualise
+undualises
+unenamoured
+unenamoured's
+unenamoureds
+unequalise
+unevangelised
+unevangelised's
+unevangeliseds
+unfavouring
+unfavouring's
+unfertilisable
+unfertilisables
+unfeudalise
+unfeudalised
+unfeudalises
+ungalvanised
+ungalvanised's
+ungalvaniseds
+ungelatinisable
+ungelatinisables
+ungelatinised
+ungelatinised's
+ungelatiniseds
+ungentilise
+ungentilises
+ungentlemanise
+ungentlemanises
+ungospelised
+ungospelised's
+ungospeliseds
+ungraphitised
+ungraphitised's
+ungraphitiseds
+unharbour
+unharbour's
+unharboured
+unharmonise
+unheroise
+unheroises
+unhonourable
+unhouselled
+unhypnotisable
+unhypnotisables
+unhypnotise
+unhypnotises
+uniformisation
+uniformisation's
+uniformisations
+uniformise
+uniformises
+unilateralisation
+unilateralisation's
+unilateralisations
+unilateralise
+unilateralises
+unimmortalise
+unimmortalises
+unindividualise
+uninitialisable
+unionisation's
+unionisations
+unitisation
+unitise
+unitises
+unitising
+universalisation
+universalisation's
+universalisations
+unkennelled
+unkennelling
+unlabialise
+unlabialises
+unlabourable
+unlabourables
+unlabouring
+unlabouring's
+unlocalisable
+unlocalisables
+unlocalise
+unmechanise
+unmediatised
+unmediatised's
+unmediatiseds
+unmercerised
+unmercerised's
+unmerceriseds
+unmesmerise
+unmesmerises
+unmetallised
+unmetallised's
+unmetalliseds
+unmethodised
+unmethodised's
+unmethodiseds
+unmethodising
+unmethodising's
+unmethodisings
+unmissionised
+unmissionised's
+unmissioniseds
+unmodernise
+unmonopolise
+unmonopolising
+unmonopolisings
+unmoralise
+unmoralised
+unmoralises
+unmoralising
+unmoralisings
+unmunicipalised
+unmunicipalised's
+unmunicipaliseds
+unmutualised
+unmutualised's
+unmutualiseds
+unmysticise
+unmysticises
+unnaturalisable
+unnaturalisables
+unnaturalise
+unnaturalises
+unneighbourlike
+unneighbourlike's
+unneighbourlikes
+unnitrogenised
+unnitrogenised's
+unnitrogeniseds
+unnormalise
+unnormalising
+unoptimise
+unoptimising
+unoxidisable
+unoxidisables
+unoxygenised
+unoxygenised's
+unoxygeniseds
+unpaganise
+unpaganises
+unparagonised
+unparagonised's
+unparagoniseds
+unparalysed
+unparalysed's
+unparalyseds
+unparticularised
+unparticularised's
+unparticulariseds
+unparticularising
+unparticularising's
+unparticularisings
+unpatronisable
+unpatronisables
+unpauperised
+unpauperised's
+unpauperiseds
+unphilosophise
+unphosphatised
+unphosphatised's
+unphosphatiseds
+unplagiarised
+unplagiarised's
+unplagiariseds
+unpoeticised
+unpoeticised's
+unpoeticiseds
+unpoetise
+unpoetised
+unpoetises
+unpolarisable
+unpolarisables
+unpolymerised
+unpolymerised's
+unpolymeriseds
+unpopularise
+unprotestantise
+unprotestantises
+unpulverise
+unradicalise
+unradicalises
+unrancoured
+unrancoured's
+unrancoureds
+unraveller
+unravellers
+unrealisable
+unrealise
+unrealising
+unrealisings
+unreconnoitred
+unreconnoitred's
+unreconnoitreds
+unrevelationise
+unrevelationises
+unromanticised
+unromanticised's
+unromanticiseds
+unroyalised
+unroyalised's
+unroyaliseds
+unsatirise
+unsatirised
+unsavourilies
+unsavourily
+unscandalise
+unscandalises
+unsceptre
+unsceptre's
+unschematised
+unschematised's
+unschematiseds
+unsectarianise
+unsectarianises
+unsecularise
+unsecularises
+unsensitise
+unsensitises
+unsensualise
+unsensualised
+unsensualises
+unsentimentalise
+unsepulchre
+unsignalised
+unsignalised's
+unsignaliseds
+unsolemnise
+unsolemnised
+unsolemnises
+unspectrelike
+unspectrelike's
+unspectrelikes
+unspiritualise
+unspiritualised
+unspiritualises
+unstoicise
+unstoicises
+unsubstantialise
+unsubstantialises
+unsuccourable
+unsuccourables
+unsulphurised
+unsulphurised's
+unsulphuriseds
+unsupernaturalise
+unsupernaturalised
+unsupernaturalises
+unsymmetrised
+unsymmetrised's
+unsymmetriseds
+unsympathisabilities
+unsympathisability
+unsympathisability's
+unsympathisable
+unsympathisables
+unsyphon
+unsyphon's
+unsystemisable
+unsystemisables
+untantalising
+untantalising's
+untantalisings
+untartarised
+untartarised's
+untartariseds
+untechnicalise
+untechnicalises
+untemporising
+untemporising's
+untheorisable
+untheorisables
+unutilisable
+unutilisables
+unvaporised
+unvaporised's
+unvaporiseds
+unvectorisable
+unvitalised
+unvitalised's
+unvitaliseds
+unvitriolised
+unvitriolised's
+unvitrioliseds
+unvolatilise
+unvolatilised
+unvolatilises
+unvulgarise
+unvulgarised
+unvulgarises
+unwesternised
+unwesternised's
+unwesterniseds
+unwomanise
+urbanise
+urbanises
+urbanising
+utilisabilities
+utilisability
+utilisable
+utilisables
+utilitarianise
+utilitarianises
+utopianiser
+utopianiser's
+utopianisers
+vaccinisation
+vaccinisation's
+vaccinisations
+vacuumise
+vacuumised
+vacuumises
+vacuumising
+vagabondise
+vagabondiser
+vagabondisers
+vagabondises
+vagrantise
+vagrantises
+valorisation
+valorisation's
+valorisations
+valorise
+valorised
+valorises
+valorising
+vampirise
+vampirises
+vandalisation
+vandalisation's
+vandalisations
+vaporisable
+vaporisables
+vaporise
+vaporised
+vaporiser
+vaporisers
+vaporises
+vaporising
+vapourier
+vapouriest
+vapourisable
+vapourisation
+vapourisations
+vapourise
+vapourised
+vapouriser
+vapourises
+vapourish
+vapourishness
+vapourising
+vapourless
+vapourlike
+vapoury
+vascularisation
+vascularisation's
+vascularisations
+vascularise
+vascularised
+vascularises
+vascularising
+vassalisation
+vassalise
+vassalised
+vassalises
+vassalising
+vectorisable
+vectorise
+vectorised
+vectoriser
+vectorisered
+vectorisering
+vectorisers
+vectorises
+vegetablise
+vegetablises
+velarisation
+venalisation
+venalisation's
+venalisations
+venalise
+venalises
+venomisation
+venomisation's
+venomisations
+venomise
+venomises
+ventriloquise
+ventriloquised
+ventriloquises
+ventriloquising
+verbalisation
+verbalisation's
+verbalisations
+vermeilled
+vermeilles
+vermeilling
+vermilionise
+vermilionises
+vernacularisation
+vernacularisation's
+vernacularisations
+vernacularise
+vernacularises
+vernalisation
+vernalisation's
+vernalisations
+vernalise
+vernalised
+vernalises
+vernalising
+versicolour
+versicoloured
+versionise
+versionises
+vestryise
+vestryises
+veteranise
+veteranises
+vialled
+vialling
+victimisable
+victimisables
+victimisation
+victimisation's
+victimisations
+victuallage
+victualled
+victualless
+victualling
+vigourless
+virtualise
+virtualises
+visionise
+visionises
+vitalisation
+vitalisation's
+vitalisations
+vitalise
+vitalised
+vitaliser
+vitalisers
+vitalises
+vitalising
+vitalising's
+vitalisingly
+vitalisings
+vitaminisation
+vitaminise
+vitaminises
+vitriolisable
+vitriolisables
+vitriolisation
+vitriolisation's
+vitriolisations
+vitriolise
+vitrioliser
+vitriolisers
+vitriolises
+vocationalisation
+vocationalisation's
+vocationalisations
+vocationalise
+vocationalises
+volatilisable
+volatilisables
+volatilise
+volatiliser
+volatilisers
+volatilises
+volatilising
+voltise
+voltises
+vowelisation
+vowelisation's
+vowelisations
+vowelise
+vowelised
+vowelises
+vowelising
+vulcanisable
+vulcanisables
+vulcanisate
+vulcanisation
+vulcanisation's
+vulcanisations
+vulcanise
+vulcaniser
+vulcanisers
+vulcanises
+vulcanising
+vulgarisation
+vulgarisation's
+vulgarisations
+vulgarise
+vulgarised
+vulgariser
+vulgarisers
+vulgarises
+vulgarising
+waggonette
+weevilled
+westernisation
+westernisation's
+westernisations
+westernise
+westernised
+westernises
+westernising
+winterisation
+winterisation's
+winterisations
+winterise
+winterised
+winterises
+winterising
+womanisation
+womanisation's
+womanisations
+woodcockise
+woodcockises
+woollenisation
+woollenisation's
+woollenisations
+woollenise
+woollenises
+zeroise
+zeroised
+zeroises
+zeroising
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.0 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.0
new file mode 100644
index 00000000000..4008ec0ff79
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.0
@@ -0,0 +1,47158 @@
+ACM
+ANSI
+ASAP
+ASCII
+ATM's
+Achilles
+Ada
+Ada's
+Afghanistan
+Afghanistan's
+Africa
+Africa's
+African
+African's
+Africans
+Airedale
+Airedale's
+Alabama
+Alabama's
+Alabamian
+Alabamian's
+Alaska
+Alaska's
+Albania
+Albania's
+Albanian
+Albanian's
+Albanians
+Alcibiades
+Alden
+Alden's
+Algeria
+Algeria's
+Algerian
+Algerian's
+Algol
+Algol's
+Allah
+Allah's
+Alyssa
+Alyssa's
+Amanda
+Amanda's
+Amdahl
+Amdahl's
+Amelia
+Amelia's
+America
+America's
+American
+American's
+Americana
+Americans
+Americas
+Ames
+Amsterdam
+Amsterdam's
+Amtrak
+Amtrak's
+Anabaptist
+Anabaptist's
+Anabaptists
+Andorra
+Andorra's
+Angeleno
+Angeleno's
+Angelenos
+Anglican
+Anglican's
+Anglicanism
+Anglicanism's
+Anglicans
+Anglophilia
+Anglophilia's
+Anglophobia
+Anglophobia's
+Angola
+Angola's
+Antarctica
+Antarctica's
+Aphrodite
+Aphrodite's
+Apollo
+Apollo's
+Apollonian
+Appalachia
+Appalachia's
+Appalachian
+Appalachian's
+Appalachians
+April
+April's
+Aprils
+Aquarius
+Arab
+Arab's
+Arabia
+Arabia's
+Arabian
+Arabian's
+Arabians
+Arabic
+Arabic's
+Arabs
+Archie
+Archie's
+Argentina
+Argentina's
+Argo
+Argo's
+Argos
+Arianism
+Arianism's
+Arianist
+Arianist's
+Arianists
+Aries
+Aristotelian
+Aristotelian's
+Aristotle
+Aristotle's
+Arizona
+Arizona's
+Arkansas
+Arkansas's
+Armageddon
+Armageddon's
+Armenian
+Armenian's
+Armour
+Armour's
+Armstrong
+Armstrong's
+Artemis
+Aryan
+Aryan's
+Aryans
+Asia
+Asia's
+Asian
+Asian's
+Asians
+Asiatic
+Asiatic's
+Asiatics
+Assyrian
+Assyrian's
+Assyriology
+Assyriology's
+Athena
+Athena's
+Athenian
+Athenian's
+Athenians
+Athens
+Atlantic
+Atlantic's
+Auckland
+Auckland's
+Audubon
+Audubon's
+Augusta
+Augusta's
+Augusts
+Austin
+Austin's
+Australia
+Australia's
+Australian
+Australian's
+Australians
+Austria
+Austria's
+Austrian
+Austrian's
+Ave
+BSD
+Babel
+Babel's
+Bach
+Bach's
+Bagrodia
+Bagrodia's
+Bagrodias
+Balkan
+Balkan's
+Balkans
+Baltic
+Baltic's
+Bangladesh
+Bangladesh's
+Bantu
+Bantu's
+Bantus
+Barbados
+Baxter
+Baxter's
+Beethoven
+Beethoven's
+Belgian
+Belgian's
+Belgians
+Belgium
+Belgium's
+Bellovin
+Bellovin's
+Belushi
+Belushi's
+Benedict
+Benedict's
+Benedictine
+Benedictine's
+Bengal
+Bengal's
+Bengali
+Bengali's
+Benzedrine
+Benzedrine's
+Bergsten
+Bergsten's
+Berkeley
+Berkeley's
+Berlin
+Berlin's
+Berliner
+Berliners
+Bermuda
+Bermuda's
+Bessel
+Bessel's
+Beverly
+Beverly's
+Bilbo
+Bilbo's
+Bolivia
+Bolivia's
+Bologna
+Bologna's
+Bolshevik
+Bolshevik's
+Bolsheviks
+Bolshevism
+Bolshevism's
+Borneo
+Borneo's
+Boston
+Boston's
+Bostonian
+Bostonian's
+Bostonians
+Botswana
+Botswana's
+Bourne
+Bourne's
+Brazil
+Brazil's
+Brazilian
+Brazilian's
+Bresenham
+Bresenham's
+Britain
+Britain's
+British
+Britisher
+Britishly
+Briton
+Briton's
+Britons
+Buehring
+Buehring's
+CDC
+CDC's
+CEO
+CMOS
+CPU
+CPU's
+CPUs
+California
+California's
+Californian
+Californian's
+Californians
+Cambridge
+Cambridge's
+Canada
+Canada's
+Carolina
+Carolina's
+Carolinas
+Cartesian
+Chinese
+Chinese's
+Christian
+Christian's
+Christians
+Christiansen
+Christmas
+Cobol
+Cobol's
+Coleman
+Coleman's
+Colorado
+Colorado's
+Comdex
+Comdex's
+Cray
+Cray's
+Crays
+Cupertino
+Cupertino's
+Czechoslovakian
+DARPA
+DARPA's
+DECNET
+DOS
+Dan
+Dan's
+DeMorgan
+DeMorgan's
+Debbie
+Debbie's
+December
+December's
+Decembers
+Delaware
+Delaware's
+Denmark
+Denmark's
+Dijkstra
+Dijkstra's
+Diophantine
+Dylan
+Dylan's
+EDP
+EGA
+EGA's
+Edsger
+Edsger's
+Ellen
+Ellen's
+Elvis
+Elvis's
+English
+English's
+Erlang
+Erlang's
+Ethernet
+Ethernet's
+Ethernets
+Europe
+Europe's
+European
+European's
+Europeans
+FIFO
+Fairbanks
+Februaries
+February
+February's
+Felder
+Florida
+Florida's
+Fortran
+Fortran's
+Fourier
+Fourier's
+France
+France's
+Frances
+French
+French's
+Friday
+Friday's
+Fridays
+GPSS
+Galvin
+Galvin's
+Garfunkel
+Geoff
+Geoff's
+Geoffrey
+Geoffrey's
+German
+German's
+Germans
+Germany
+Germany's
+Gibson
+Gibson's
+Gipsies
+Gipsy
+Gipsy's
+Godzilla
+Godzilla's
+Gothic
+Greek
+Greek's
+Greeks
+Greg
+Greg's
+Heinlein
+Heinlein's
+Hewlett
+Hewlett's
+Holland
+Holland's
+Hollander
+Hollanders
+Hollands
+Honda
+Honda's
+Hz
+I'd
+I'll
+I'm
+I've
+IBM
+IBM's
+IEEE
+ITCorp
+ITCorp's
+ITcorp
+ITcorp's
+Illinois
+Inc
+India
+India's
+Indian
+Indian's
+Indiana
+Indiana's
+Indians
+Intel
+Intel's
+Internet
+Internet's
+Iran
+Iran's
+Ireland
+Ireland's
+Israel
+Israel's
+Israeli
+Israeli's
+Israelis
+Italian
+Italian's
+Italians
+James
+Januaries
+January
+January's
+Japan
+Japan's
+Japanese
+Japanese's
+Jefferson
+Jefferson's
+Jill
+Jill's
+Johnnie
+Johnnie's
+Jr
+Julie
+Julie's
+Julies
+July
+July's
+Julys
+June
+June's
+Junes
+Klein
+Klein's
+Kleinrock
+Kleinrock's
+Kline
+Kline's
+Knuth
+Knuth's
+Kuenning
+Kuenning's
+LED's
+LEDs
+LaTeX
+LaTeX's
+Lagrangian
+Lagrangian's
+Lamport
+Lamport's
+Latin
+Latin's
+Laurie
+Laurie's
+Lenten
+Liz
+Liz's
+Lyle
+Lyle's
+MHz
+MIT
+MIT's
+MacDraw
+MacDraw's
+MacIntosh
+MacIntosh's
+MacPaint
+MacPaint's
+Mafia
+Mafia's
+Malibu
+Malibu's
+Mandelbrot
+Mandelbrot's
+Manhattan
+Manhattan's
+Manila
+Manila's
+Marianne
+Marianne's
+Mary
+Mary's
+Maryland
+Maryland's
+Marylanders
+Massachusetts
+Massey
+Massey's
+Matt
+Matt's
+Maxtor
+Maxtor's
+McElhaney
+McElhaney's
+McKenzie
+McKenzie's
+McMartin
+McMartin's
+Medusa
+Medusa's
+Michigan
+Michigan's
+Microport
+Microport's
+Microsoft
+Microsoft's
+Midwest
+Minnesota
+Minnesota's
+Monday
+Monday's
+Mondays
+Montana
+Montana's
+Montanan
+Montanan's
+Moslem
+Moslem's
+Moslems
+Motorola
+Motorola's
+Mr
+Mrs
+Ms
+Multibus
+Multibus's
+Multics
+Munsey
+Munsey's
+Muslim
+Muslim's
+Muslims
+NFS
+Nazi
+Nazi's
+Nazis
+NeWS
+Nebraska
+Nebraska's
+Nebraskan
+Nebraskan's
+Negro
+Negro's
+Negroes
+Nepal
+Nepal's
+Netherlands
+Newtonian
+November
+November's
+Novembers
+OEM
+OEM's
+OEMS
+OK
+OS
+OS's
+October
+October's
+Octobers
+Oderberg
+Oderberg's
+Oderbergs
+Oedipus
+Ohio
+Ohio's
+Oklahoma
+Oklahoma's
+Oklahoman
+Oklahoman's
+Oliver's
+PC
+PC's
+PCs
+PDP
+Packard
+Packard's
+Packards
+Palestinian
+Pascal
+Pascal's
+Pennsylvania
+Pennsylvania's
+Peter's
+Petkiewicz
+Petkiewicz's
+PhD
+Planck
+Planck's
+Poland
+Poland's
+Popek
+Popek's
+Popeks
+Prime's
+Prokofiev
+Prokofiev's
+QA
+RCS
+ROM
+RSX
+Redford
+Redford's
+Rick
+Rick's
+Ritchie
+Ritchie's
+Robert
+Robert's
+Roberts
+Robinson
+Robinson's
+Roman
+Roman's
+Romans
+Roy
+Roy's
+Rubens
+Russian
+Russian's
+Russians
+SCCS
+SMTP
+Sally's
+Salz
+Salz's
+Sam
+Sam's
+Saturday
+Saturday's
+Saturdays
+Scotland
+Scotland's
+Seagate
+Seagate's
+September
+September's
+Septembers
+Signor
+Sikkim
+Sikkim's
+Sikkimese
+Silverstein
+Silverstein's
+Singapore
+Singapore's
+Spafford
+Spafford's
+Spain
+Spain's
+Spanish
+Spanish's
+Spencer
+Spencer's
+Spuds
+Sr
+Sunday
+Sunday's
+Sundays
+TCP
+TV's
+TeX
+TeX's
+Teflon
+Teflon's
+Tektronix
+Tektronix's
+Tennessee
+Tennessee's
+Texas
+Texas's
+Texases
+Thursday
+Thursday's
+Thursdays
+Tinseltown
+Tinseltown's
+Trudeau
+Trudeau's
+Tuesday
+Tuesday's
+Tuesdays
+Turing
+Turing's
+UART
+UCLA
+UNIX's
+USC
+USC's
+USG
+USG's
+Ultrix
+Ultrix's
+Unix
+Unix's
+Usenet
+Usenet's
+Usenix
+Usenix's
+Utah
+Utah's
+VAR
+VCR
+VMS
+VMS's
+Vanessa
+Vanessa's
+Vax
+Vax's
+Ventura
+Ventura's
+Virginia
+Virginia's
+Warnock
+Warnock's
+Washington
+Washington's
+Wednesday
+Wednesday's
+Wednesdays
+Weibull
+Weibull's
+Wilbur
+Wilbur's
+Willisson
+Willisson's
+Wilson
+Wilson's
+Xenix
+Xenix's
+Xeroxed
+Xeroxes
+Xeroxing
+Yamaha
+Yamaha's
+Yentl
+Yentl's
+York
+York's
+Yorker
+Yorkers
+Yorks
+Zealand
+Zealand's
+Zulu
+Zulu's
+Zulus
+aback
+abaft
+abandon
+abandoned
+abandoner
+abandoning
+abandonment
+abandonments
+abandons
+abase
+abased
+abasement
+abasements
+abaser
+abases
+abash
+abashed
+abashes
+abashing
+abasing
+abate
+abated
+abatement
+abatements
+abater
+abates
+abating
+abbe
+abbey
+abbey's
+abbeys
+abbot
+abbot's
+abbots
+abbreviate
+abbreviated
+abbreviates
+abbreviating
+abbreviation
+abbreviations
+abdomen
+abdomen's
+abdomens
+abdominal
+abdominally
+abduct
+abducted
+abducting
+abduction
+abduction's
+abductions
+abductor
+abductor's
+abductors
+abducts
+abed
+aberrant
+aberrantly
+aberration
+aberrations
+abet
+abets
+abetted
+abetter
+abetting
+abettor
+abeyance
+abhor
+abhorred
+abhorrent
+abhorrently
+abhorrer
+abhorring
+abhors
+abide
+abided
+abider
+abides
+abiding
+abidingly
+abilities
+ability
+ability's
+abject
+abjection
+abjections
+abjectly
+abjectness
+abjure
+abjured
+abjurer
+abjures
+abjuring
+ablate
+ablated
+ablates
+ablating
+ablation
+ablative
+ablatively
+ablaze
+able
+abler
+ablest
+ablution
+ablutions
+ably
+abnormal
+abnormalities
+abnormality
+abnormally
+aboard
+abode
+abode's
+abodes
+abolish
+abolished
+abolisher
+abolishers
+abolishes
+abolishing
+abolishment
+abolishment's
+abolishments
+abolition
+abolitionist
+abolitionists
+abominable
+aboriginal
+aboriginally
+aborigine
+aborigine's
+aborigines
+abort
+aborted
+aborter
+aborting
+abortion
+abortion's
+abortions
+abortive
+abortively
+abortiveness
+aborts
+abound
+abounded
+abounding
+abounds
+about
+above
+aboveground
+abrade
+abraded
+abrader
+abrades
+abrading
+abrasion
+abrasion's
+abrasions
+abreaction
+abreaction's
+abreactions
+abreast
+abridge
+abridged
+abridger
+abridges
+abridging
+abridgment
+abroad
+abrogate
+abrogated
+abrogates
+abrogating
+abrogation
+abrupt
+abruptly
+abruptness
+abscess
+abscessed
+abscesses
+abscissa
+abscissa's
+abscissas
+abscond
+absconded
+absconder
+absconding
+absconds
+absence
+absence's
+absences
+absent
+absented
+absentee
+absentee's
+absenteeism
+absentees
+absentia
+absenting
+absently
+absentminded
+absentmindedly
+absentmindedness
+absents
+absinthe
+absolute
+absolutely
+absoluteness
+absolutes
+absolution
+absolve
+absolved
+absolver
+absolves
+absolving
+absorb
+absorbed
+absorbency
+absorbent
+absorbent's
+absorbents
+absorber
+absorbing
+absorbingly
+absorbs
+absorption
+absorption's
+absorptions
+absorptive
+abstain
+abstained
+abstainer
+abstaining
+abstains
+abstention
+abstentions
+abstinence
+abstract
+abstracted
+abstractedly
+abstractedness
+abstracter
+abstracting
+abstraction
+abstraction's
+abstractionism
+abstractionist
+abstractionists
+abstractions
+abstractive
+abstractly
+abstractness
+abstractor
+abstractor's
+abstractors
+abstracts
+abstruse
+abstrusely
+abstruseness
+abstrusenesses
+absurd
+absurdities
+absurdity
+absurdity's
+absurdly
+absurdness
+abundance
+abundances
+abundant
+abundantly
+abuse
+abused
+abuser
+abusers
+abuses
+abusing
+abusive
+abusively
+abusiveness
+abut
+abutment
+abutments
+abuts
+abutted
+abutter
+abutter's
+abutters
+abutting
+abysmal
+abysmally
+abyss
+abyss's
+abysses
+acacia
+academia
+academic
+academically
+academics
+academies
+academy
+academy's
+accede
+acceded
+accedes
+acceding
+accelerate
+accelerated
+accelerates
+accelerating
+acceleratingly
+acceleration
+accelerations
+accelerative
+accelerator
+accelerators
+accelerometer
+accelerometer's
+accelerometers
+accent
+accented
+accenting
+accents
+accentual
+accentually
+accentuate
+accentuated
+accentuates
+accentuating
+accentuation
+accept
+acceptability
+acceptable
+acceptableness
+acceptably
+acceptance
+acceptance's
+acceptances
+accepted
+acceptedly
+accepter
+accepters
+accepting
+acceptingly
+acceptingness
+acceptive
+acceptor
+acceptor's
+acceptors
+accepts
+access
+accessed
+accesses
+accessibility
+accessible
+accessibly
+accessing
+accession
+accession's
+accessions
+accessories
+accessory
+accessory's
+accident
+accident's
+accidental
+accidentally
+accidentalness
+accidently
+accidents
+acclaim
+acclaimed
+acclaimer
+acclaiming
+acclaims
+acclamation
+acclimate
+acclimated
+acclimates
+acclimating
+acclimation
+accolade
+accolades
+accommodate
+accommodated
+accommodates
+accommodating
+accommodatingly
+accommodation
+accommodations
+accommodative
+accommodativeness
+accompanied
+accompanier
+accompanies
+accompaniment
+accompaniment's
+accompaniments
+accompanist
+accompanist's
+accompanists
+accompany
+accompanying
+accomplice
+accomplices
+accomplish
+accomplished
+accomplisher
+accomplishers
+accomplishes
+accomplishing
+accomplishment
+accomplishment's
+accomplishments
+accord
+accordance
+accordances
+accorded
+accorder
+accorders
+according
+accordingly
+accordion
+accordion's
+accordions
+accords
+accost
+accosted
+accosting
+accosts
+account
+accountabilities
+accountability
+accountable
+accountableness
+accountably
+accountancy
+accountant
+accountant's
+accountants
+accounted
+accounting
+accountings
+accounts
+accredit
+accreditation
+accreditations
+accredited
+accretion
+accretion's
+accretions
+accrue
+accrued
+accrues
+accruing
+acculturate
+acculturated
+acculturates
+acculturating
+acculturation
+acculturative
+accumulate
+accumulated
+accumulates
+accumulating
+accumulation
+accumulations
+accumulative
+accumulatively
+accumulativeness
+accumulator
+accumulator's
+accumulators
+accuracies
+accuracy
+accurate
+accurately
+accurateness
+accursed
+accursedly
+accursedness
+accusal
+accusation
+accusation's
+accusations
+accusative
+accuse
+accused
+accuser
+accusers
+accuses
+accusing
+accusingly
+accustom
+accustomed
+accustomedness
+accustoming
+accustoms
+ace
+ace's
+aced
+acer
+aces
+acetate
+acetone
+acetylene
+ache
+ached
+aches
+achievable
+achieve
+achieved
+achievement
+achievement's
+achievements
+achiever
+achievers
+achieves
+achieving
+aching
+achingly
+acid
+acidic
+acidities
+acidity
+acidly
+acidness
+acids
+acidulous
+acing
+acknowledge
+acknowledged
+acknowledgedly
+acknowledger
+acknowledgers
+acknowledges
+acknowledging
+acme
+acne
+acned
+acolyte
+acolytes
+acorn
+acorn's
+acorns
+acoustic
+acoustical
+acoustically
+acoustician
+acoustics
+acquaint
+acquaintance
+acquaintance's
+acquaintances
+acquainted
+acquainting
+acquaints
+acquiesce
+acquiesced
+acquiescence
+acquiesces
+acquiescing
+acquirable
+acquire
+acquired
+acquires
+acquiring
+acquisition
+acquisition's
+acquisitions
+acquisitiveness
+acquit
+acquits
+acquittal
+acquittals
+acquitted
+acquitter
+acquitting
+acre
+acre's
+acreage
+acres
+acrid
+acridly
+acridness
+acrimonious
+acrimoniously
+acrimony
+acrobat
+acrobat's
+acrobatic
+acrobatics
+acrobats
+acronym
+acronym's
+acronyms
+acropolis
+across
+acrylic
+act
+acted
+acting
+actinium
+actinometer
+actinometer's
+actinometers
+action
+action's
+actions
+activate
+activated
+activates
+activating
+activation
+activations
+activator
+activator's
+activators
+active
+actively
+activeness
+activism
+activist
+activist's
+activists
+activities
+activity
+activity's
+actor
+actor's
+actors
+actress
+actress's
+actresses
+acts
+actual
+actualities
+actuality
+actually
+actuals
+actuarial
+actuarially
+actuate
+actuated
+actuates
+actuating
+actuation
+actuator
+actuator's
+actuators
+acuity
+acumen
+acute
+acutely
+acuteness
+acuter
+acutest
+acyclic
+acyclically
+ad
+adage
+adages
+adagio
+adagios
+adamant
+adamantly
+adapt
+adaptability
+adaptable
+adaptation
+adaptation's
+adaptations
+adapted
+adaptedness
+adapter
+adapters
+adapting
+adaption
+adaptive
+adaptively
+adaptiveness
+adaptor
+adaptors
+adapts
+add
+added
+addenda
+addendum
+adder
+adders
+addict
+addicted
+addicting
+addiction
+addiction's
+addictions
+addictive
+addicts
+adding
+addition
+addition's
+additional
+additionally
+additions
+additive
+additive's
+additively
+additives
+additivity
+address
+addressability
+addressable
+addressed
+addressee
+addressee's
+addressees
+addresser
+addressers
+addresses
+addressing
+adds
+adduce
+adduced
+adducer
+adduces
+adducing
+adduct
+adducted
+adducting
+adduction
+adductive
+adductor
+adducts
+adept
+adeptly
+adeptness
+adepts
+adequacies
+adequacy
+adequate
+adequately
+adequateness
+adhere
+adhered
+adherence
+adherences
+adherent
+adherent's
+adherently
+adherents
+adherer
+adherers
+adheres
+adhering
+adhesion
+adhesions
+adhesive
+adhesive's
+adhesively
+adhesiveness
+adhesives
+adiabatic
+adiabatically
+adieu
+adjacency
+adjacent
+adjacently
+adjective
+adjective's
+adjectively
+adjectives
+adjoin
+adjoined
+adjoining
+adjoins
+adjourn
+adjourned
+adjourning
+adjournment
+adjourns
+adjudge
+adjudged
+adjudges
+adjudging
+adjudicate
+adjudicated
+adjudicates
+adjudicating
+adjudication
+adjudication's
+adjudications
+adjudicative
+adjunct
+adjunct's
+adjunctive
+adjunctly
+adjuncts
+adjure
+adjured
+adjures
+adjuring
+adjust
+adjustable
+adjustably
+adjusted
+adjuster
+adjusters
+adjusting
+adjustive
+adjustment
+adjustment's
+adjustments
+adjustor
+adjustor's
+adjustors
+adjusts
+adjutant
+adjutants
+administer
+administered
+administering
+administerings
+administers
+administration
+administration's
+administrations
+administrative
+administratively
+administrator
+administrator's
+administrators
+admirable
+admirableness
+admirably
+admiral
+admiral's
+admirals
+admiralty
+admiration
+admirations
+admire
+admired
+admirer
+admirers
+admires
+admiring
+admiringly
+admissibility
+admissible
+admission
+admission's
+admissions
+admit
+admits
+admittance
+admitted
+admittedly
+admitting
+admix
+admixed
+admixes
+admixture
+admonish
+admonished
+admonisher
+admonishes
+admonishing
+admonishingly
+admonishment
+admonishment's
+admonishments
+admonition
+admonition's
+admonitions
+ado
+adobe
+adolescence
+adolescent
+adolescent's
+adolescently
+adolescents
+adopt
+adopted
+adopter
+adopters
+adopting
+adoption
+adoption's
+adoptions
+adoptive
+adoptively
+adopts
+adorable
+adorableness
+adoration
+adore
+adored
+adorer
+adores
+adoring
+adorn
+adorned
+adorning
+adornment
+adornment's
+adornments
+adorns
+adrenal
+adrenaline
+adrenally
+adrift
+adroit
+adroitly
+adroitness
+ads
+adsorb
+adsorbed
+adsorbing
+adsorbs
+adsorption
+adulate
+adulating
+adulation
+adulations
+adult
+adult's
+adulterate
+adulterated
+adulterates
+adulterating
+adulteration
+adulterer
+adulterer's
+adulterers
+adulterous
+adulterously
+adultery
+adulthood
+adultly
+adultness
+adults
+adumbrate
+adumbrated
+adumbrates
+adumbrating
+adumbration
+adumbrative
+adumbratively
+advance
+advanced
+advancement
+advancement's
+advancements
+advancer
+advancers
+advances
+advancing
+advantage
+advantaged
+advantageous
+advantageously
+advantageousness
+advantages
+advantaging
+advent
+adventist
+adventists
+adventitious
+adventitiously
+adventitiousness
+adventive
+adventively
+adventure
+adventured
+adventurer
+adventurers
+adventures
+adventuring
+adventurous
+adventurously
+adventurousness
+adverb
+adverb's
+adverbial
+adverbially
+adverbs
+adversaries
+adversary
+adversary's
+adverse
+adversed
+adversely
+adverses
+adversing
+adversities
+adversity
+advertise
+advertised
+advertisement
+advertisement's
+advertisements
+advertiser
+advertisers
+advertises
+advertising
+advice
+advisability
+advisable
+advisableness
+advisably
+advise
+advised
+advisedly
+advisee
+advisee's
+advisees
+advisement
+advisements
+adviser
+adviser's
+advisers
+advises
+advising
+advisor
+advisor's
+advisors
+advisory
+advocacy
+advocate
+advocated
+advocates
+advocating
+advocation
+advocative
+aegis
+aerate
+aerated
+aerates
+aerating
+aeration
+aerator
+aerators
+aerial
+aerial's
+aerially
+aerials
+aeroacoustic
+aerobic
+aerobics
+aerodynamic
+aerodynamics
+aeronautic
+aeronautical
+aeronautically
+aeronautics
+aerosol
+aerosols
+aerospace
+afar
+afars
+affable
+affair
+affair's
+affairs
+affect
+affectation
+affectation's
+affectations
+affected
+affectedly
+affectedness
+affecter
+affecting
+affectingly
+affection
+affection's
+affectionate
+affectionately
+affectioned
+affections
+affective
+affectively
+affects
+afferent
+afferently
+affianced
+affidavit
+affidavit's
+affidavits
+affiliate
+affiliated
+affiliates
+affiliating
+affiliation
+affiliations
+affinities
+affinity
+affinity's
+affirm
+affirmation
+affirmation's
+affirmations
+affirmative
+affirmatively
+affirmed
+affirming
+affirms
+affix
+affixed
+affixes
+affixing
+afflict
+afflicted
+afflicting
+affliction
+affliction's
+afflictions
+afflictive
+afflictively
+afflicts
+affluence
+affluent
+affluently
+afford
+affordable
+afforded
+affording
+affords
+affricate
+affricates
+affrication
+affricative
+affright
+affront
+affronted
+affronting
+affronts
+afghan
+afghans
+aficionado
+aficionados
+afield
+afire
+aflame
+afloat
+afoot
+afore
+aforementioned
+aforesaid
+aforethought
+afoul
+afraid
+afresh
+aft
+after
+aftereffect
+aftereffects
+aftermath
+aftermost
+afternoon
+afternoon's
+afternoons
+afters
+aftershock
+aftershock's
+aftershocks
+afterthought
+afterthoughts
+afterward
+afterwards
+again
+against
+agape
+agar
+agate
+agates
+age
+aged
+agedly
+agedness
+ageless
+agelessly
+agelessness
+agencies
+agency
+agency's
+agenda
+agenda's
+agendas
+agent
+agent's
+agentive
+agents
+ager
+agers
+ages
+agglomerate
+agglomerated
+agglomerates
+agglomeration
+agglomerative
+agglutinate
+agglutinated
+agglutinates
+agglutinating
+agglutination
+agglutinative
+agglutinin
+agglutinins
+aggravate
+aggravated
+aggravates
+aggravating
+aggravation
+aggravations
+aggregate
+aggregated
+aggregately
+aggregateness
+aggregates
+aggregating
+aggregation
+aggregations
+aggregative
+aggregatively
+aggression
+aggression's
+aggressions
+aggressive
+aggressively
+aggressiveness
+aggressor
+aggressors
+aggrieve
+aggrieved
+aggrievedly
+aggrieves
+aggrieving
+aghast
+agile
+agilely
+agility
+aging
+agitate
+agitated
+agitatedly
+agitates
+agitating
+agitation
+agitations
+agitative
+agitator
+agitator's
+agitators
+agleam
+aglow
+agnostic
+agnostic's
+agnostics
+ago
+agog
+agonies
+agony
+agrarian
+agree
+agreeable
+agreeableness
+agreeably
+agreed
+agreeing
+agreement
+agreement's
+agreements
+agreer
+agreers
+agrees
+agricultural
+agriculturally
+agriculture
+ague
+ah
+ahead
+aid
+aide
+aided
+aider
+aides
+aiding
+aids
+ail
+ailed
+aileron
+ailerons
+ailing
+ailment
+ailment's
+ailments
+ails
+aim
+aimed
+aimer
+aimers
+aiming
+aimless
+aimlessly
+aimlessness
+aims
+air
+airbag
+airbag's
+airbags
+airborne
+aircraft
+aircrafts
+airdrop
+airdrops
+aired
+airer
+airers
+airfield
+airfield's
+airfields
+airflow
+airframe
+airframe's
+airframes
+airhead
+airier
+airiest
+airily
+airiness
+airing
+airings
+airless
+airlessness
+airlift
+airlift's
+airlifts
+airline
+airline's
+airliner
+airliner's
+airliners
+airlines
+airlock
+airlock's
+airlocks
+airmail
+airmails
+airman
+airmen
+airport
+airport's
+airports
+airs
+airship
+airship's
+airships
+airspace
+airspeed
+airspeeds
+airstrip
+airstrip's
+airstrips
+airway
+airway's
+airways
+airy
+aisle
+aisles
+ajar
+akimbo
+akin
+alabaster
+alacrity
+alarm
+alarmed
+alarming
+alarmingly
+alarmist
+alarms
+alas
+alba
+albacore
+albeit
+album
+albumen
+albumin
+albums
+alchemy
+alcohol
+alcohol's
+alcoholic
+alcoholic's
+alcoholics
+alcoholism
+alcoholisms
+alcohols
+alcove
+alcove's
+alcoved
+alcoves
+alder
+alderman
+alderman's
+aldermen
+ale
+alee
+alert
+alerted
+alertedly
+alerter
+alerters
+alerting
+alertly
+alertness
+alerts
+alfalfa
+alfresco
+alga
+algae
+algaecide
+algebra
+algebra's
+algebraic
+algebraically
+algebras
+alginate
+alginates
+algorithm
+algorithm's
+algorithmic
+algorithmically
+algorithms
+alias
+aliased
+aliases
+aliasing
+alibi
+alibi's
+alibis
+alien
+alien's
+alienate
+alienated
+alienates
+alienating
+alienation
+aliens
+alight
+alighted
+alighting
+align
+aligned
+aligner
+aligning
+alignment
+alignments
+aligns
+alike
+alikeness
+aliment
+aliments
+alimony
+alive
+aliveness
+alkali
+alkali's
+alkaline
+alkalis
+alkaloid
+alkaloid's
+alkaloids
+alkyl
+all
+allay
+allayed
+allaying
+allays
+allegation
+allegation's
+allegations
+allege
+alleged
+allegedly
+alleges
+allegiance
+allegiance's
+allegiances
+alleging
+allegoric
+allegorical
+allegorically
+allegoricalness
+allegories
+allegory
+allegory's
+allegretto
+allegretto's
+allegrettos
+allegro
+allegro's
+allegros
+allele
+alleles
+allemande
+allergic
+allergies
+allergy
+allergy's
+alleviate
+alleviated
+alleviates
+alleviating
+alleviation
+alleviative
+alleviator
+alleviator's
+alleviators
+alley
+alley's
+alleys
+alleyway
+alleyway's
+alleyways
+alliance
+alliance's
+alliances
+allied
+allier
+allies
+alligator
+alligator's
+alligatored
+alligators
+alliteration
+alliteration's
+alliterations
+alliterative
+alliteratively
+allocate
+allocated
+allocates
+allocating
+allocation
+allocation's
+allocations
+allocative
+allocator
+allocator's
+allocators
+allophone
+allophones
+allophonic
+allot
+alloted
+allotment
+allotment's
+allotments
+allots
+allotted
+allotter
+allotting
+allow
+allowable
+allowableness
+allowably
+allowance
+allowance's
+allowanced
+allowances
+allowancing
+allowed
+allowedly
+allowing
+allows
+alloy
+alloy's
+alloyed
+alloying
+alloys
+allude
+alluded
+alludes
+alluding
+allure
+allured
+allurement
+allures
+alluring
+allusion
+allusion's
+allusions
+allusive
+allusively
+allusiveness
+ally
+allying
+alma
+almanac
+almanac's
+almanacs
+almightiness
+almighty
+almond
+almond's
+almonds
+almoner
+almost
+alms
+almsman
+alnico
+aloe
+aloes
+aloft
+aloha
+alone
+aloneness
+along
+alongside
+aloof
+aloofly
+aloofness
+aloud
+alpha
+alphabet
+alphabet's
+alphabetic
+alphabetical
+alphabetically
+alphabetics
+alphabets
+alphanumeric
+alphanumerics
+alpine
+alps
+already
+also
+altar
+altar's
+altars
+alter
+alterable
+alteration
+alteration's
+alterations
+altercation
+altercation's
+altercations
+altered
+alterer
+alterers
+altering
+alternate
+alternated
+alternately
+alternates
+alternating
+alternation
+alternations
+alternative
+alternatively
+alternativeness
+alternatives
+alternator
+alternator's
+alternators
+alters
+although
+altitude
+altitudes
+alto
+alto's
+altogether
+altos
+altruism
+altruist
+altruistic
+altruistically
+altruists
+alum
+alumna
+alumna's
+alumnae
+alumni
+alumnus
+alundum
+alveolar
+alveolarly
+alveoli
+alveolus
+always
+am
+amain
+amalgam
+amalgam's
+amalgamate
+amalgamated
+amalgamates
+amalgamating
+amalgamation
+amalgamations
+amalgamative
+amalgams
+amanuensis
+amass
+amassed
+amasser
+amasses
+amassing
+amateur
+amateur's
+amateurish
+amateurishly
+amateurishness
+amateurism
+amateurs
+amatory
+amaze
+amazed
+amazedly
+amazement
+amazer
+amazers
+amazes
+amazing
+amazingly
+amazon
+amazon's
+amazons
+ambassador
+ambassador's
+ambassadors
+amber
+ambiance
+ambiances
+ambidextrous
+ambidextrously
+ambient
+ambiguities
+ambiguity
+ambiguity's
+ambiguous
+ambiguously
+ambiguousness
+ambition
+ambition's
+ambitions
+ambitious
+ambitiously
+ambitiousness
+ambivalence
+ambivalent
+ambivalently
+amble
+ambled
+ambler
+ambles
+ambling
+ambrosial
+ambrosially
+ambulance
+ambulance's
+ambulances
+ambulatory
+ambuscade
+ambuscader
+ambush
+ambushed
+ambusher
+ambushes
+ameliorate
+ameliorated
+ameliorating
+amelioration
+ameliorative
+amen
+amenable
+amend
+amended
+amender
+amending
+amendment
+amendment's
+amendments
+amends
+amenities
+amenity
+americium
+amiable
+amiableness
+amiabler
+amiablest
+amicable
+amicableness
+amicably
+amid
+amide
+amidst
+amigo
+amino
+amiss
+amity
+ammo
+ammonia
+ammoniac
+ammonias
+ammonium
+ammunition
+ammunitions
+amnesty
+amoeba
+amoeba's
+amoebas
+amok
+among
+amongst
+amoral
+amorality
+amorally
+amorous
+amorously
+amorousness
+amorphous
+amorphously
+amorphousness
+amount
+amounted
+amounter
+amounters
+amounting
+amounts
+amour
+amour's
+amours
+amp
+ampere
+amperes
+ampersand
+ampersand's
+ampersands
+amphetamine
+amphetamines
+amphibian
+amphibian's
+amphibians
+amphibious
+amphibiously
+amphibiousness
+amphibology
+ample
+ampleness
+ampler
+amplest
+amplification
+amplifications
+amplified
+amplifier
+amplifiers
+amplifies
+amplify
+amplifying
+amplitude
+amplitude's
+amplitudes
+amply
+ampoule
+ampoule's
+ampoules
+amps
+amputate
+amputated
+amputates
+amputating
+amputation
+ams
+amulet
+amulets
+amuse
+amused
+amusedly
+amusement
+amusement's
+amusements
+amuser
+amusers
+amuses
+amusing
+amusingly
+amusingness
+amusive
+amyl
+an
+anachronism
+anachronism's
+anachronisms
+anachronistically
+anaconda
+anacondas
+anaerobic
+anagram
+anagram's
+anagrams
+anal
+analogical
+analogically
+analogies
+analogous
+analogously
+analogousness
+analogy
+analogy's
+analysis
+analyst
+analyst's
+analysts
+analytic
+analytical
+analytically
+analyticities
+analyticity
+analytics
+anaphora
+anaphoric
+anaphorically
+anaplasmosis
+anarchic
+anarchical
+anarchist
+anarchist's
+anarchists
+anarchy
+anastomoses
+anastomosis
+anastomotic
+anathema
+anatomic
+anatomical
+anatomically
+anatomicals
+anatomy
+ancestor
+ancestor's
+ancestors
+ancestral
+ancestrally
+ancestry
+anchor
+anchorage
+anchorage's
+anchorages
+anchored
+anchoring
+anchorite
+anchoritism
+anchors
+anchovies
+anchovy
+ancient
+anciently
+ancientness
+ancients
+ancillaries
+ancillary
+and
+anded
+anders
+anding
+ands
+anecdotal
+anecdotally
+anecdote
+anecdote's
+anecdotes
+anechoic
+anemometer
+anemometer's
+anemometers
+anemometry
+anemone
+anew
+angel
+angel's
+angelic
+angels
+anger
+angered
+angering
+angers
+angiography
+angle
+angled
+angler
+anglers
+angles
+angling
+angrier
+angriest
+angrily
+angriness
+angry
+angst
+angstrom
+angstroms
+anguish
+anguished
+angular
+angularly
+anhydrous
+anhydrously
+aniline
+animal
+animal's
+animally
+animalness
+animals
+animate
+animated
+animatedly
+animately
+animateness
+animates
+animating
+animation
+animations
+animator
+animator's
+animators
+animism
+animosity
+anion
+anion's
+anionic
+anionics
+anions
+anise
+aniseikonic
+anisotropic
+anisotropies
+anisotropy
+anisotropy's
+ankle
+ankle's
+ankles
+annal
+annalen
+annals
+annex
+annexation
+annexations
+annexed
+annexes
+annexing
+annihilate
+annihilated
+annihilates
+annihilating
+annihilation
+annihilative
+anniversaries
+anniversary
+anniversary's
+annotate
+annotated
+annotates
+annotating
+annotation
+annotations
+annotative
+announce
+announced
+announcement
+announcement's
+announcements
+announcer
+announcers
+announces
+announcing
+annoy
+annoyance
+annoyance's
+annoyances
+annoyed
+annoyer
+annoyers
+annoying
+annoyingly
+annoys
+annual
+annually
+annuals
+annul
+annulled
+annulling
+annulment
+annulment's
+annulments
+annuls
+annum
+annunciate
+annunciated
+annunciates
+annunciating
+annunciation
+annunciator
+annunciators
+anode
+anode's
+anodes
+anoint
+anointed
+anointer
+anointing
+anoints
+anomalies
+anomalous
+anomalously
+anomalousness
+anomaly
+anomaly's
+anomic
+anomie
+anon
+anonymity
+anonymous
+anonymously
+anonymousness
+anorexia
+another
+another's
+answer
+answerable
+answered
+answerer
+answerers
+answering
+answers
+ant
+ant's
+antagonism
+antagonisms
+antagonist
+antagonist's
+antagonistic
+antagonistically
+antagonists
+antarctic
+ante
+anteater
+anteater's
+anteaters
+antecedent
+antecedent's
+antecedently
+antecedents
+anted
+antedate
+antedated
+antedates
+antedating
+antelope
+antelope's
+antelopes
+antenna
+antenna's
+antennae
+antennas
+anterior
+anteriorly
+anteriors
+anthem
+anthem's
+anthems
+anther
+anthologies
+anthology
+anthracite
+anthropological
+anthropologically
+anthropologist
+anthropologist's
+anthropologists
+anthropology
+anthropomorphic
+anthropomorphically
+anti
+antibacterial
+antibiotic
+antibiotics
+antibodies
+antibody
+antic
+antic's
+anticipate
+anticipated
+anticipates
+anticipating
+anticipation
+anticipations
+anticipative
+anticipatively
+anticipatory
+anticoagulation
+anticompetitive
+antics
+antidisestablishmentarianism
+antidote
+antidote's
+antidotes
+antiformant
+antifundamentalist
+antigen
+antigen's
+antigens
+antihistorical
+antimicrobial
+antimony
+anting
+antinomian
+antinomy
+antipathy
+antiphonal
+antiphonally
+antipode
+antipode's
+antipodes
+antiquarian
+antiquarian's
+antiquarians
+antiquate
+antiquated
+antiquation
+antique
+antique's
+antiques
+antiquities
+antiquity
+antiredeposition
+antiresonance
+antiresonator
+antiseptic
+antisera
+antiserum
+antislavery
+antisocial
+antisubmarine
+antisymmetric
+antisymmetry
+antithesis
+antithetical
+antithetically
+antithyroid
+antitoxin
+antitoxin's
+antitoxins
+antitrust
+antitruster
+antler
+antlered
+ants
+anus
+anvil
+anvil's
+anvils
+anxieties
+anxiety
+anxious
+anxiously
+anxiousness
+any
+anybodies
+anybody
+anyhow
+anymore
+anyone
+anyone's
+anyones
+anyplace
+anything
+anythings
+anyway
+anyways
+anywhere
+anywheres
+aorta
+apace
+apart
+apartheid
+apartment
+apartment's
+apartments
+apartness
+apathetic
+apathy
+ape
+aped
+aper
+aperiodic
+aperiodicity
+aperture
+apertured
+apes
+apex
+apexes
+aphasia
+aphasic
+aphid
+aphid's
+aphids
+aphonic
+aphorism
+aphorism's
+aphorisms
+apiaries
+apiary
+apical
+apically
+apiece
+aping
+apish
+apishly
+apishness
+aplenty
+aplomb
+apocalypse
+apocalyptic
+apocrypha
+apocryphal
+apocryphally
+apocryphalness
+apogee
+apogees
+apologetic
+apologetically
+apologetics
+apologia
+apologies
+apologist
+apologist's
+apologists
+apology
+apology's
+apostate
+apostates
+apostle
+apostle's
+apostles
+apostolic
+apostrophe
+apostrophes
+apothecary
+apotheoses
+apotheosis
+appalled
+appalling
+appallingly
+appanage
+apparatus
+apparatuses
+apparel
+apparels
+apparent
+apparently
+apparentness
+apparition
+apparition's
+apparitions
+appeal
+appealed
+appealer
+appealers
+appealing
+appealingly
+appeals
+appear
+appearance
+appearances
+appeared
+appearer
+appearers
+appearing
+appears
+appease
+appeased
+appeasement
+appeaser
+appeases
+appeasing
+appellant
+appellant's
+appellants
+appellate
+appellation
+appellative
+appellatively
+append
+appendage
+appendage's
+appendages
+appended
+appender
+appenders
+appendices
+appendicitis
+appending
+appendix
+appendix's
+appendixes
+appends
+appertain
+appertained
+appertaining
+appertains
+appetite
+appetite's
+appetites
+appetitive
+applaud
+applauded
+applauder
+applauding
+applauds
+applause
+apple
+apple's
+applejack
+apples
+appliance
+appliance's
+appliances
+applicability
+applicable
+applicant
+applicant's
+applicants
+application
+application's
+applications
+applicative
+applicatively
+applicator
+applicator's
+applicators
+applied
+applier
+appliers
+applies
+applique
+appliques
+apply
+applying
+appoint
+appointed
+appointee
+appointee's
+appointees
+appointer
+appointers
+appointing
+appointive
+appointment
+appointment's
+appointments
+appoints
+apportion
+apportioned
+apportioning
+apportionment
+apportionments
+apportions
+appraisal
+appraisal's
+appraisals
+appraise
+appraised
+appraiser
+appraisers
+appraises
+appraising
+appraisingly
+appreciable
+appreciably
+appreciate
+appreciated
+appreciates
+appreciating
+appreciation
+appreciations
+appreciative
+appreciatively
+appreciativeness
+apprehend
+apprehended
+apprehender
+apprehending
+apprehends
+apprehensible
+apprehension
+apprehension's
+apprehensions
+apprehensive
+apprehensively
+apprehensiveness
+apprentice
+apprenticed
+apprentices
+apprenticeship
+apprenticeships
+apprise
+apprised
+appriser
+apprisers
+apprises
+apprising
+apprisings
+apprize
+apprized
+apprizer
+apprizers
+apprizes
+apprizing
+apprizingly
+apprizings
+approach
+approachability
+approachable
+approached
+approacher
+approachers
+approaches
+approaching
+approbate
+approbation
+appropriate
+appropriated
+appropriately
+appropriateness
+appropriates
+appropriatest
+appropriating
+appropriation
+appropriations
+appropriative
+appropriator
+appropriator's
+appropriators
+approval
+approval's
+approvals
+approve
+approved
+approver
+approvers
+approves
+approving
+approvingly
+approximate
+approximated
+approximately
+approximates
+approximating
+approximation
+approximations
+approximative
+approximatively
+appurtenance
+appurtenances
+apricot
+apricot's
+apricots
+apron
+apron's
+aprons
+apropos
+apse
+apses
+apsis
+apt
+aptitude
+aptitudes
+aptly
+aptness
+aqua
+aquaria
+aquarium
+aquas
+aquatic
+aquatics
+aqueduct
+aqueduct's
+aqueducts
+aqueous
+aqueously
+aquifer
+aquifers
+arabesque
+arable
+arachnid
+arachnid's
+arachnids
+arbiter
+arbiter's
+arbiters
+arbitrarily
+arbitrariness
+arbitrary
+arbitrate
+arbitrated
+arbitrates
+arbitrating
+arbitration
+arbitrative
+arbitrator
+arbitrator's
+arbitrators
+arboreal
+arboreally
+arc
+arcade
+arcade's
+arcaded
+arcades
+arcading
+arcane
+arced
+arch
+archaeological
+archaeologically
+archaeologist
+archaeologist's
+archaeologists
+archaeology
+archaic
+archaically
+archaicness
+archaism
+archangel
+archangel's
+archangels
+archbishop
+archdiocese
+archdioceses
+arched
+archenemy
+archer
+archers
+archery
+arches
+archetype
+archetypes
+archfool
+arching
+archipelago
+archipelagoes
+architect
+architect's
+architectonic
+architectonics
+architects
+architectural
+architecturally
+architecture
+architecture's
+architectures
+archival
+archive
+archived
+archiver
+archivers
+archives
+archiving
+archivist
+archivists
+archly
+archness
+arcing
+arclike
+arcs
+arctic
+ardent
+ardently
+arduous
+arduously
+arduousness
+are
+area
+area's
+areas
+aren't
+arena
+arena's
+arenas
+ares
+argon
+argonaut
+argonauts
+argot
+arguable
+arguably
+argue
+argued
+arguer
+arguers
+argues
+arguing
+argument
+argument's
+argumentation
+argumentative
+argumentatively
+arguments
+arid
+aridity
+aridness
+aright
+arise
+arisen
+ariser
+arises
+arising
+arisings
+aristocracy
+aristocrat
+aristocrat's
+aristocratic
+aristocratically
+aristocrats
+arithmetic
+arithmetical
+arithmetically
+arithmetics
+ark
+arm
+arm's
+armadillo
+armadillos
+armament
+armament's
+armaments
+armchair
+armchair's
+armchairs
+armed
+armer
+armers
+armful
+armfuls
+armhole
+armies
+arming
+armistice
+armload
+armpit
+armpit's
+armpits
+arms
+army
+army's
+aroma
+aromas
+aromatic
+aromaticness
+arose
+around
+arousal
+arouse
+aroused
+arouses
+arousing
+arpeggio
+arpeggio's
+arpeggios
+arrack
+arraign
+arraigned
+arraigning
+arraignment
+arraignment's
+arraignments
+arraigns
+arrange
+arranged
+arrangement
+arrangement's
+arrangements
+arranger
+arrangers
+arranges
+arranging
+arrant
+arrantly
+array
+arrayed
+arrayer
+arraying
+arrays
+arrears
+arrest
+arrested
+arrester
+arresters
+arresting
+arrestingly
+arrestor
+arrestor's
+arrestors
+arrests
+arrival
+arrival's
+arrivals
+arrive
+arrived
+arriver
+arrives
+arriving
+arrogance
+arrogant
+arrogantly
+arrogate
+arrogated
+arrogates
+arrogating
+arrogation
+arrow
+arrowed
+arrowhead
+arrowhead's
+arrowheads
+arrowing
+arrows
+arroyo
+arroyos
+arsenal
+arsenal's
+arsenals
+arsenic
+arsine
+arsines
+arson
+art
+art's
+arterial
+arterially
+arteries
+arteriolar
+arteriole
+arteriole's
+arterioles
+arteriosclerosis
+artery
+artery's
+artful
+artfully
+artfulness
+arthritis
+arthrogram
+arthrogram's
+arthrograms
+arthropod
+arthropod's
+arthropods
+artichoke
+artichoke's
+artichokes
+article
+article's
+articled
+articles
+articling
+articulate
+articulated
+articulately
+articulateness
+articulates
+articulating
+articulation
+articulations
+articulative
+articulator
+articulators
+articulatory
+artifact
+artifact's
+artifacts
+artifice
+artificer
+artifices
+artificial
+artificialities
+artificiality
+artificially
+artificialness
+artilleries
+artillerist
+artillery
+artisan
+artisan's
+artisans
+artist
+artist's
+artistic
+artistically
+artistry
+artists
+artless
+artlessly
+arts
+artwork
+as
+asbestos
+ascend
+ascendancy
+ascendant
+ascendantly
+ascended
+ascendency
+ascendent
+ascender
+ascenders
+ascending
+ascends
+ascension
+ascensions
+ascent
+ascertain
+ascertainable
+ascertained
+ascertaining
+ascertains
+ascetic
+ascetic's
+asceticism
+ascetics
+ascot
+ascribable
+ascribe
+ascribed
+ascribes
+ascribing
+ascription
+aseptic
+ash
+ashamed
+ashamedly
+ashen
+asher
+ashes
+ashman
+ashore
+ashtray
+ashtray's
+ashtrays
+aside
+asides
+asinine
+asininely
+ask
+askance
+asked
+asker
+askers
+askew
+askewness
+asking
+asks
+asleep
+asocial
+asp
+asparagus
+aspect
+aspect's
+aspects
+aspen
+asper
+aspersion
+aspersion's
+aspersions
+asphalt
+asphalted
+asphyxia
+aspic
+aspirant
+aspirant's
+aspirants
+aspirate
+aspirated
+aspirates
+aspirating
+aspiration
+aspiration's
+aspirations
+aspirator
+aspirators
+aspire
+aspired
+aspirer
+aspires
+aspirin
+aspiring
+aspirins
+ass
+ass's
+assail
+assailant
+assailant's
+assailants
+assailed
+assailing
+assails
+assassin
+assassin's
+assassinate
+assassinated
+assassinates
+assassinating
+assassination
+assassinations
+assassins
+assault
+assaulted
+assaulter
+assaulting
+assaultive
+assaultively
+assaultiveness
+assaults
+assay
+assayed
+assayer
+assayers
+assaying
+assemblage
+assemblage's
+assemblages
+assemble
+assembled
+assembler
+assemblers
+assembles
+assemblies
+assembling
+assembly
+assembly's
+assen
+assent
+assented
+assenter
+assenting
+assents
+assert
+asserted
+asserter
+asserters
+asserting
+assertion
+assertion's
+assertions
+assertive
+assertively
+assertiveness
+asserts
+asses
+assess
+assessed
+assesses
+assessing
+assessment
+assessment's
+assessments
+assessor
+assessor's
+assessors
+asset
+asset's
+assets
+assiduity
+assiduous
+assiduously
+assiduousness
+assign
+assignable
+assigned
+assignee
+assignee's
+assignees
+assigner
+assigners
+assigning
+assignment
+assignment's
+assignments
+assigns
+assimilate
+assimilated
+assimilates
+assimilating
+assimilation
+assimilations
+assimilative
+assist
+assistance
+assistances
+assistant
+assistant's
+assistants
+assistantship
+assistantships
+assisted
+assister
+assisting
+assists
+associate
+associated
+associates
+associating
+association
+association's
+associational
+associations
+associative
+associatively
+associativities
+associativity
+associator
+associator's
+associators
+assonance
+assonant
+assort
+assorted
+assorter
+assorting
+assortment
+assortment's
+assortments
+assorts
+assuage
+assuaged
+assuages
+assuaging
+assume
+assumed
+assumer
+assumes
+assuming
+assumption
+assumption's
+assumptions
+assurance
+assurance's
+assurances
+assure
+assured
+assuredly
+assuredness
+assurer
+assurers
+assures
+assuring
+assuringly
+astatine
+aster
+aster's
+asterisk
+asterisk's
+asterisks
+asteroid
+asteroid's
+asteroidal
+asteroids
+asters
+asthma
+astonish
+astonished
+astonishes
+astonishing
+astonishingly
+astonishment
+astound
+astounded
+astounding
+astoundingly
+astounds
+astral
+astrally
+astray
+astride
+astringency
+astringent
+astringently
+astronaut
+astronaut's
+astronautics
+astronauts
+astronomer
+astronomer's
+astronomers
+astronomical
+astronomically
+astronomy
+astrophysical
+astrophysics
+astute
+astutely
+astuteness
+asunder
+asylum
+asylums
+asymmetric
+asymmetrical
+asymmetrically
+asymmetries
+asymmetry
+asymptomatically
+asymptote
+asymptote's
+asymptotes
+asymptotic
+asymptotically
+asymptoticly
+asynchronism
+asynchronous
+asynchronously
+asynchrony
+at
+atavistic
+ate
+atemporal
+atheism
+atheist
+atheist's
+atheistic
+atheists
+atherosclerosis
+athlete
+athlete's
+athletes
+athletic
+athleticism
+athletics
+atlas
+atmosphere
+atmosphere's
+atmosphered
+atmospheres
+atmospheric
+atmospherics
+atoll
+atoll's
+atolls
+atom
+atom's
+atomic
+atomically
+atomics
+atoms
+atonal
+atonally
+atone
+atoned
+atonement
+atones
+atoning
+atop
+atrocious
+atrociously
+atrociousness
+atrocities
+atrocity
+atrocity's
+atrophic
+atrophied
+atrophies
+atrophy
+atrophying
+attach
+attache
+attached
+attacher
+attachers
+attaches
+attaching
+attachment
+attachment's
+attachments
+attack
+attackable
+attacked
+attacker
+attacker's
+attackers
+attacking
+attacks
+attain
+attainable
+attainableness
+attainably
+attained
+attainer
+attainers
+attaining
+attainment
+attainment's
+attainments
+attains
+attempt
+attempted
+attempter
+attempters
+attempting
+attempts
+attend
+attendance
+attendance's
+attendances
+attendant
+attendant's
+attendants
+attended
+attendee
+attendee's
+attendees
+attender
+attenders
+attending
+attends
+attention
+attention's
+attentional
+attentionality
+attentions
+attentive
+attentively
+attentiveness
+attenuate
+attenuated
+attenuates
+attenuating
+attenuation
+attenuator
+attenuator's
+attenuators
+attest
+attested
+attester
+attesting
+attests
+attic
+attic's
+attics
+attire
+attired
+attires
+attiring
+attitude
+attitude's
+attitudes
+attitudinal
+attitudinally
+attorney
+attorney's
+attorneys
+attract
+attracted
+attracting
+attraction
+attraction's
+attractions
+attractive
+attractively
+attractiveness
+attractor
+attractor's
+attractors
+attracts
+attributable
+attribute
+attributed
+attributer
+attributes
+attributing
+attribution
+attributions
+attributive
+attributively
+attrition
+attune
+attuned
+attunes
+attuning
+atypical
+atypically
+auburn
+auction
+auctioned
+auctioneer
+auctioneer's
+auctioneers
+auctioning
+audacious
+audaciously
+audaciousness
+audacity
+audible
+audibly
+audience
+audience's
+audiences
+audio
+audiogram
+audiogram's
+audiograms
+audiological
+audiologist
+audiologist's
+audiologists
+audiology
+audiometer
+audiometer's
+audiometers
+audiometric
+audiometry
+audit
+audited
+auditing
+audition
+audition's
+auditioned
+auditioning
+auditions
+auditive
+auditor
+auditor's
+auditorium
+auditoriums
+auditors
+auditory
+audits
+auger
+auger's
+augers
+aught
+augment
+augmentation
+augmentations
+augmented
+augmenter
+augmenting
+augments
+augur
+augurs
+august
+augustly
+augustness
+aunt
+aunt's
+auntly
+aunts
+aura
+aura's
+aural
+aurally
+auras
+aureole
+aureomycin
+aurora
+auscultate
+auscultated
+auscultates
+auscultating
+auscultation
+auscultations
+auspice
+auspices
+auspicious
+auspiciously
+auspiciousness
+austere
+austerely
+austereness
+austerity
+authentic
+authentically
+authenticate
+authenticated
+authenticates
+authenticating
+authentication
+authentications
+authenticator
+authenticators
+authenticity
+author
+author's
+authored
+authoring
+authoritarian
+authoritarianism
+authoritative
+authoritatively
+authoritativeness
+authorities
+authority
+authority's
+authors
+authorship
+autism
+autistic
+auto
+auto's
+autobiographic
+autobiographical
+autobiographically
+autobiographies
+autobiography
+autobiography's
+autocollimator
+autocorrelate
+autocorrelated
+autocorrelates
+autocorrelating
+autocorrelation
+autocorrelations
+autocracies
+autocracy
+autocrat
+autocrat's
+autocratic
+autocratically
+autocrats
+autodial
+autofluorescence
+autograph
+autographed
+autographing
+autographs
+automata
+automate
+automated
+automates
+automatic
+automatically
+automatics
+automating
+automation
+automaton
+automatons
+automobile
+automobile's
+automobiles
+automotive
+autonavigator
+autonavigator's
+autonavigators
+autonomic
+autonomous
+autonomously
+autonomy
+autopilot
+autopilot's
+autopilots
+autopsied
+autopsies
+autopsy
+autoregressive
+autorepeat
+autorepeating
+autorepeats
+autos
+autosuggestibility
+autotransformer
+autumn
+autumn's
+autumnal
+autumnally
+autumns
+auxiliaries
+auxiliary
+avail
+availabilities
+availability
+available
+availableness
+availably
+availed
+availer
+availers
+availing
+avails
+avalanche
+avalanched
+avalanches
+avalanching
+avant
+avarice
+avaricious
+avariciously
+avariciousness
+avenge
+avenged
+avenger
+avenges
+avenging
+avenue
+avenue's
+avenues
+aver
+average
+averaged
+averagely
+averageness
+averages
+averaging
+averred
+averrer
+averring
+avers
+averse
+aversely
+averseness
+aversion
+aversion's
+aversions
+aversive
+avert
+averted
+averting
+averts
+avian
+aviaries
+aviary
+aviation
+aviator
+aviator's
+aviators
+avid
+avidity
+avidly
+avidness
+avionic
+avionics
+avocado
+avocados
+avocation
+avocation's
+avocations
+avoid
+avoidable
+avoidably
+avoidance
+avoided
+avoider
+avoiders
+avoiding
+avoids
+avouch
+avow
+avowed
+avowedly
+avower
+avows
+await
+awaited
+awaiting
+awaits
+awake
+awaked
+awaken
+awakened
+awakener
+awakening
+awakens
+awakes
+awaking
+award
+awarded
+awarder
+awarders
+awarding
+awards
+aware
+awareness
+awash
+away
+awayness
+awe
+awed
+awesome
+awesomely
+awesomeness
+awful
+awfully
+awfulness
+awhile
+awhiles
+awing
+awkward
+awkwardly
+awkwardness
+awl
+awl's
+awls
+awning
+awning's
+awninged
+awnings
+awoke
+awry
+ax
+axe
+axed
+axer
+axers
+axes
+axial
+axially
+axing
+axiological
+axiologically
+axiom
+axiom's
+axiomatic
+axiomatically
+axiomatics
+axioms
+axion
+axion's
+axions
+axis
+axle
+axle's
+axles
+axolotl
+axolotl's
+axolotls
+axon
+axon's
+axons
+aye
+ayer
+ayers
+ayes
+azalea
+azalea's
+azaleas
+azimuth
+azimuth's
+azimuths
+azure
+babble
+babbled
+babbler
+babbles
+babbling
+babe
+babe's
+babes
+babied
+babies
+baby
+baby's
+babyhood
+babying
+babyish
+babysit
+babysits
+babysitter
+babysitters
+baccalaureate
+bachelor
+bachelor's
+bachelors
+bacilli
+bacillus
+back
+backache
+backache's
+backaches
+backbone
+backbone's
+backbones
+backdrop
+backdrop's
+backdrops
+backed
+backer
+backers
+background
+background's
+backgrounds
+backing
+backlash
+backlasher
+backlog
+backlog's
+backlogs
+backpack
+backpack's
+backpacker
+backpackers
+backpacks
+backplane
+backplane's
+backplanes
+backs
+backscatter
+backscattered
+backscattering
+backscatters
+backslash
+backslashed
+backslashes
+backslashing
+backspace
+backspaced
+backspaces
+backspacing
+backstabber
+backstabbing
+backstage
+backstairs
+backstitch
+backstitched
+backstitches
+backstitching
+backtrack
+backtracked
+backtracker
+backtrackers
+backtracking
+backtracks
+backup
+backups
+backward
+backwardly
+backwardness
+backwards
+backwater
+backwater's
+backwaters
+backwoods
+backyard
+backyard's
+backyards
+bacon
+baconer
+bacteria
+bacterial
+bacterially
+bacterium
+bad
+bade
+baden
+badge
+badged
+badger
+badger's
+badgered
+badgering
+badgers
+badges
+badging
+badlands
+badly
+badminton
+badness
+bads
+baffle
+baffled
+baffler
+bafflers
+baffles
+baffling
+bafflingly
+bag
+bag's
+bagatelle
+bagatelle's
+bagatelles
+bagel
+bagel's
+bagels
+baggage
+bagged
+bagger
+bagger's
+baggers
+baggier
+baggies
+bagginess
+bagging
+baggy
+bagpipe
+bagpipe's
+bagpiper
+bagpipes
+bags
+bah
+bail
+bailer
+bailiff
+bailiff's
+bailiffs
+bailing
+bailly
+bait
+baited
+baiter
+baiting
+baits
+bake
+baked
+baker
+bakeries
+bakers
+bakery
+bakery's
+bakes
+baking
+bakings
+baklava
+balalaika
+balalaika's
+balalaikas
+balance
+balanced
+balancedness
+balancer
+balancers
+balances
+balancing
+balconied
+balconies
+balcony
+balcony's
+bald
+balder
+balding
+baldly
+baldness
+bale
+baled
+baleful
+balefully
+balefulness
+baler
+balers
+bales
+baling
+balk
+balked
+balker
+balkier
+balkiness
+balking
+balks
+balky
+ball
+ballad
+ballad's
+ballads
+ballast
+ballast's
+ballasts
+balled
+baller
+ballerina
+ballerina's
+ballerinas
+ballers
+ballet
+ballet's
+ballets
+balling
+ballistic
+ballistics
+balloon
+ballooned
+ballooner
+ballooners
+ballooning
+balloons
+ballot
+ballot's
+balloted
+balloter
+balloting
+ballots
+ballplayer
+ballplayer's
+ballplayers
+ballroom
+ballroom's
+ballrooms
+balls
+ballyhoo
+balm
+balm's
+balmier
+balminess
+balms
+balmy
+balsa
+balsam
+balsams
+balustrade
+balustrade's
+balustrades
+bamboo
+bamboos
+ban
+ban's
+banal
+banally
+banana
+banana's
+bananas
+band
+bandage
+bandaged
+bandager
+bandages
+bandaging
+banded
+bander
+bandied
+bandies
+banding
+bandit
+bandit's
+bandits
+bandpass
+bands
+bandstand
+bandstand's
+bandstands
+bandwagon
+bandwagon's
+bandwagons
+bandwidth
+bandwidths
+bandy
+bandying
+bane
+baneful
+banefully
+bang
+banged
+banger
+banging
+bangle
+bangle's
+bangles
+bangs
+baning
+banish
+banished
+banisher
+banishes
+banishing
+banishment
+banister
+banister's
+banisters
+banjo
+banjo's
+banjos
+bank
+banked
+banker
+bankers
+banking
+bankrupt
+bankruptcies
+bankruptcy
+bankruptcy's
+bankrupted
+bankrupting
+bankrupts
+banks
+banned
+banner
+banner's
+banners
+banning
+banquet
+banqueted
+banqueter
+banqueting
+banquetings
+banquets
+bans
+banshee
+banshee's
+banshees
+bantam
+banter
+bantered
+banterer
+bantering
+banteringly
+banters
+baptism
+baptism's
+baptismal
+baptismally
+baptisms
+baptist
+baptist's
+baptistery
+baptistries
+baptistry
+baptistry's
+baptists
+bar
+bar's
+barb
+barbarian
+barbarian's
+barbarians
+barbaric
+barbarities
+barbarity
+barbarous
+barbarously
+barbarousness
+barbecue
+barbecued
+barbecuer
+barbecues
+barbecuing
+barbed
+barbedness
+barbell
+barbell's
+barbells
+barber
+barbered
+barbering
+barbers
+barbital
+barbiturate
+barbiturates
+barbs
+bard
+bard's
+bards
+bare
+bared
+barefoot
+barefooted
+barely
+bareness
+barer
+bares
+barest
+barflies
+barfly
+barfly's
+bargain
+bargained
+bargainer
+bargaining
+bargains
+barge
+barged
+barges
+barging
+baring
+baritone
+baritone's
+baritones
+barium
+bark
+barked
+barker
+barkers
+barking
+barks
+barley
+barn
+barn's
+barns
+barnstorm
+barnstormed
+barnstormer
+barnstorming
+barnstorms
+barnyard
+barnyard's
+barnyards
+barometer
+barometer's
+barometers
+barometric
+baron
+baron's
+baroness
+baronial
+baronies
+barons
+barony
+barony's
+baroque
+baroquely
+baroqueness
+barrack
+barracker
+barracks
+barracuda
+barracuda's
+barracudas
+barrage
+barrage's
+barraged
+barrages
+barraging
+barred
+barrel
+barrel's
+barrels
+barren
+barrenness
+barrens
+barricade
+barricade's
+barricades
+barrier
+barrier's
+barriers
+barring
+barringer
+barrow
+barrows
+bars
+bartender
+bartender's
+bartenders
+barter
+bartered
+barterer
+bartering
+barters
+bas
+basal
+basally
+basalt
+base
+baseball
+baseball's
+baseballs
+baseboard
+baseboard's
+baseboards
+based
+baseless
+baseline
+baseline's
+baselines
+basely
+baseman
+basement
+basement's
+basements
+baseness
+baser
+bases
+basest
+bash
+bashed
+basher
+bashes
+bashful
+bashfully
+bashfulness
+bashing
+basic
+basically
+basics
+basil
+basin
+basin's
+basined
+basing
+basins
+basis
+bask
+basked
+basket
+basket's
+basketball
+basketball's
+basketballs
+baskets
+basking
+bass
+bass's
+basses
+basset
+bassinet
+bassinet's
+bassinets
+basso
+bastard
+bastard's
+bastardly
+bastards
+baste
+basted
+baster
+bastes
+basting
+bastion
+bastion's
+bastioned
+bastions
+bat
+bat's
+batch
+batched
+batcher
+batches
+batching
+bated
+bater
+bath
+bathe
+bathed
+bather
+bathers
+bathes
+bathing
+bathos
+bathrobe
+bathrobe's
+bathrobes
+bathroom
+bathroom's
+bathroomed
+bathrooms
+baths
+bathtub
+bathtub's
+bathtubs
+bating
+baton
+baton's
+batons
+bats
+battalion
+battalion's
+battalions
+batted
+batten
+battened
+battening
+battens
+batter
+battered
+batteries
+battering
+batters
+battery
+battery's
+batting
+battle
+battled
+battlefield
+battlefield's
+battlefields
+battlefront
+battlefront's
+battlefronts
+battleground
+battleground's
+battlegrounds
+battlement
+battlement's
+battlemented
+battlements
+battler
+battlers
+battles
+battleship
+battleship's
+battleships
+battling
+bauble
+bauble's
+baubles
+baud
+bauds
+bauxite
+bawdier
+bawdiness
+bawdy
+bawl
+bawled
+bawler
+bawling
+bawls
+bay
+bayed
+baying
+bayly
+bayonet
+bayonet's
+bayoneted
+bayoneting
+bayonets
+bayou
+bayou's
+bayous
+bays
+bazaar
+bazaar's
+bazaars
+be
+beach
+beached
+beaches
+beachhead
+beachhead's
+beachheads
+beaching
+beacon
+beacon's
+beaconed
+beaconing
+beacons
+bead
+beaded
+beading
+beadle
+beadle's
+beadles
+beads
+beady
+beagle
+beagle's
+beagles
+beak
+beaked
+beaker
+beakers
+beaks
+beam
+beamed
+beamer
+beamers
+beaming
+beams
+bean
+beanbag
+beanbag's
+beanbags
+beaned
+beaner
+beaners
+beaning
+beans
+bear
+bearable
+bearably
+beard
+bearded
+beardedness
+beardless
+beards
+bearer
+bearers
+bearing
+bearings
+bearish
+bearishly
+bearishness
+bears
+beast
+beastings
+beastlier
+beastliness
+beastly
+beasts
+beat
+beatable
+beatably
+beaten
+beater
+beaters
+beatific
+beatification
+beatify
+beating
+beatings
+beatitude
+beatitude's
+beatitudes
+beatnik
+beatnik's
+beatniks
+beats
+beau
+beau's
+beaus
+beauteous
+beauteously
+beauteousness
+beauties
+beautification
+beautifications
+beautified
+beautifier
+beautifiers
+beautifies
+beautiful
+beautifully
+beautifulness
+beautify
+beautifying
+beauty
+beauty's
+beaver
+beaver's
+beavers
+becalm
+becalmed
+becalming
+becalms
+became
+because
+beck
+beckon
+beckoned
+beckoning
+beckons
+become
+becomes
+becoming
+becomingly
+bed
+bed's
+bedazzle
+bedazzled
+bedazzlement
+bedazzles
+bedazzling
+bedbug
+bedbug's
+bedbugs
+bedded
+bedder
+bedder's
+bedders
+bedding
+bedevil
+bedevils
+bedfast
+bedlam
+bedpost
+bedpost's
+bedposts
+bedraggle
+bedraggled
+bedridden
+bedrock
+bedrock's
+bedroom
+bedroom's
+bedroomed
+bedrooms
+beds
+bedside
+bedspread
+bedspread's
+bedspreads
+bedspring
+bedspring's
+bedsprings
+bedstead
+bedstead's
+bedsteads
+bedtime
+bee
+beech
+beechen
+beecher
+beef
+beefed
+beefer
+beefers
+beefier
+beefing
+beefs
+beefsteak
+beefy
+beehive
+beehive's
+beehives
+been
+beens
+beep
+beeped
+beeper
+beeping
+beeps
+beer
+beers
+bees
+beet
+beet's
+beetle
+beetle's
+beetled
+beetles
+beetling
+beets
+befall
+befallen
+befalling
+befalls
+befell
+befit
+befit's
+befits
+befitted
+befitting
+befittingly
+befog
+befogged
+befogging
+befogs
+before
+beforehand
+befoul
+befouled
+befouling
+befouls
+befriend
+befriended
+befriending
+befriends
+befuddle
+befuddled
+befuddles
+befuddling
+beg
+began
+beget
+begets
+begetting
+beggar
+beggared
+beggaring
+beggarliness
+beggarly
+beggars
+beggary
+begged
+begging
+begin
+beginner
+beginner's
+beginners
+beginning
+beginning's
+beginnings
+begins
+begot
+begotten
+begrudge
+begrudged
+begrudger
+begrudges
+begrudging
+begrudgingly
+begs
+beguile
+beguiled
+beguiler
+beguiles
+beguiling
+beguilingly
+begun
+behalf
+behave
+behaved
+behaver
+behaves
+behaving
+behead
+beheading
+beheld
+behest
+behind
+behold
+beholden
+beholder
+beholders
+beholding
+beholds
+beige
+being
+beings
+belated
+belatedly
+belatedness
+belay
+belayed
+belaying
+belays
+belch
+belched
+belches
+belching
+belfries
+belfry
+belfry's
+belie
+belied
+belief
+belief's
+beliefs
+belier
+belies
+believability
+believable
+believably
+believe
+believed
+believer
+believers
+believes
+believing
+belittle
+belittled
+belittler
+belittles
+belittling
+bell
+bell's
+bellboy
+bellboy's
+bellboys
+belle
+belle's
+belles
+bellhop
+bellhop's
+bellhops
+bellicose
+bellicosely
+bellicoseness
+bellicosity
+bellied
+bellies
+belligerence
+belligerent
+belligerent's
+belligerently
+belligerents
+bellman
+bellmen
+bellow
+bellowed
+bellowing
+bellows
+bells
+bellwether
+bellwether's
+bellwethers
+belly
+belly's
+bellyful
+bellying
+belong
+belonged
+belonging
+belongingness
+belongings
+belongs
+beloved
+below
+belt
+belted
+belting
+belts
+bely
+belying
+bemoan
+bemoaned
+bemoaning
+bemoans
+bench
+benched
+bencher
+benches
+benching
+benchmark
+benchmark's
+benchmarking
+benchmarks
+bend
+bendable
+bended
+bender
+benders
+bending
+bends
+beneath
+benediction
+benediction's
+benedictions
+benefactor
+benefactor's
+benefactors
+beneficence
+beneficences
+beneficial
+beneficially
+beneficialness
+beneficiaries
+beneficiary
+benefit
+benefited
+benefiter
+benefiters
+benefiting
+benefits
+benevolence
+benevolent
+benevolently
+benevolentness
+benighted
+benightedly
+benightedness
+benign
+benignly
+bent
+bents
+benzene
+bequeath
+bequeathed
+bequeathes
+bequeathing
+bequest
+bequest's
+bequests
+berate
+berated
+berates
+berating
+bereave
+bereaved
+bereavement
+bereavements
+bereaves
+bereaving
+bereft
+beret
+beret's
+berets
+beribboned
+beriberi
+berkelium
+berried
+berries
+berry
+berry's
+berrying
+berth
+berthed
+berthing
+berthings
+berths
+beryl
+beryllium
+bes
+beseech
+beseeches
+beseeching
+beseechingly
+beset
+besets
+besetting
+beside
+besides
+besiege
+besieged
+besieger
+besiegers
+besieging
+besmirch
+besmirched
+besmirches
+besmirching
+besotted
+besotting
+besought
+bespeak
+bespeaks
+bespectacled
+best
+bested
+bester
+bestial
+bestially
+besting
+bestow
+bestowal
+bestowed
+bests
+bestseller
+bestseller's
+bestsellers
+bestselling
+bet
+bet's
+beta
+betas
+beth
+betide
+betray
+betrayal
+betrayed
+betrayer
+betraying
+betrays
+betroth
+betrothal
+betrothals
+betrothed
+bets
+better
+bettered
+bettering
+betterment
+betterments
+betters
+betting
+between
+betweenness
+betwixt
+bevel
+bevels
+beverage
+beverage's
+beverages
+bevies
+bevy
+bewail
+bewailed
+bewailing
+bewails
+beware
+bewhiskered
+bewilder
+bewildered
+bewilderedly
+bewilderedness
+bewildering
+bewilderingly
+bewilderment
+bewilders
+bewitch
+bewitched
+bewitches
+bewitching
+bewitchingly
+beyond
+biannual
+bias
+biased
+biases
+biasing
+biasness
+bib
+bib's
+bibbed
+bibbing
+bible
+bible's
+bibles
+biblical
+biblically
+bibliographic
+bibliographical
+bibliographically
+bibliographics
+bibliographies
+bibliography
+bibliography's
+bibliophile
+bibliophiles
+bibs
+bicameral
+bicarbonate
+bicentennial
+biceps
+bicker
+bickered
+bickerer
+bickering
+bickers
+biconcave
+biconvex
+bicycle
+bicycled
+bicycler
+bicyclers
+bicycles
+bicycling
+bid
+bid's
+biddable
+bidden
+bidder
+bidder's
+bidders
+biddies
+bidding
+biddy
+bide
+bided
+bider
+bides
+biding
+bidirectional
+bids
+biennial
+biennially
+biennium
+bier
+bifocal
+bifocals
+bifurcate
+bifurcated
+bifurcately
+bifurcates
+bifurcating
+bifurcation
+bifurcations
+big
+bigger
+biggest
+bight
+bight's
+bights
+bigly
+bigness
+bigot
+bigot's
+bigoted
+bigotedly
+bigoting
+bigotry
+bigots
+bijection
+bijection's
+bijections
+bijective
+bijectively
+bike
+bike's
+biked
+biker
+biker's
+bikers
+bikes
+biking
+bikini
+bikini's
+bikinied
+bikinis
+bilabial
+bilateral
+bilaterally
+bilateralness
+bile
+bilge
+bilge's
+bilged
+bilges
+bilging
+bilinear
+bilingual
+bilingually
+bilinguals
+bilk
+bilked
+bilker
+bilking
+bilks
+bill
+billboard
+billboard's
+billboards
+billed
+biller
+billers
+billet
+billeted
+billeting
+billets
+billiard
+billiards
+billing
+billings
+billion
+billions
+billionth
+billow
+billowed
+billowing
+billows
+bills
+bimodal
+bimolecular
+bimolecularly
+bimonthlies
+bimonthly
+bin
+bin's
+binaries
+binary
+binaural
+binaurally
+bind
+binded
+binder
+binders
+binding
+bindingly
+bindingness
+bindings
+binds
+bing
+binge
+bingen
+binges
+bingo
+bingos
+binocular
+binocularly
+binoculars
+binomial
+binomially
+bins
+binuclear
+biochemical
+biochemically
+biochemistry
+biofeedback
+biographer
+biographer's
+biographers
+biographic
+biographical
+biographically
+biographies
+biography
+biography's
+biological
+biologically
+biologicals
+biologist
+biologist's
+biologists
+biology
+biomedical
+biomedicine
+biopsies
+biopsy
+bipartisan
+bipartite
+bipartitely
+bipartition
+biped
+bipeds
+biplane
+biplane's
+biplanes
+bipolar
+biracial
+birch
+birchen
+bircher
+birches
+bird
+bird's
+birdbath
+birdbath's
+birdbaths
+birder
+birdie
+birdied
+birdies
+birdlike
+birds
+birefringence
+birefringent
+birth
+birthday
+birthday's
+birthdays
+birthed
+birthplace
+birthplaces
+birthright
+birthright's
+birthrights
+births
+biscuit
+biscuit's
+biscuits
+bisect
+bisected
+bisecting
+bisection
+bisection's
+bisections
+bisector
+bisector's
+bisectors
+bisects
+bishop
+bishop's
+bishops
+bismuth
+bison
+bison's
+bisons
+bisque
+bisques
+bit
+bit's
+bitblt
+bitblts
+bitch
+bitch's
+bitches
+bite
+biter
+biters
+bites
+biting
+bitingly
+bitmap
+bitmap's
+bitmaps
+bits
+bitser
+bitten
+bitter
+bitterer
+bitterest
+bitterly
+bitterness
+bitters
+bittersweet
+bittersweetly
+bittersweetness
+bituminous
+bitwise
+bivalve
+bivalve's
+bivalved
+bivalves
+bivariate
+bivouac
+bivouacs
+biweekly
+bizarre
+bizarrely
+bizarreness
+blab
+blabbed
+blabbermouth
+blabbermouths
+blabbing
+blabs
+black
+blackberries
+blackberry
+blackberry's
+blackbird
+blackbird's
+blackbirder
+blackbirds
+blackboard
+blackboard's
+blackboards
+blacked
+blacken
+blackened
+blackener
+blackening
+blackens
+blacker
+blackest
+blacking
+blackjack
+blackjack's
+blackjacks
+blacklist
+blacklisted
+blacklister
+blacklisting
+blacklists
+blackly
+blackmail
+blackmailed
+blackmailer
+blackmailers
+blackmailing
+blackmails
+blackness
+blackout
+blackout's
+blackouts
+blacks
+blacksmith
+blacksmith's
+blacksmithing
+blacksmiths
+bladder
+bladder's
+bladders
+blade
+blade's
+bladed
+blades
+blamable
+blame
+blamed
+blameless
+blamelessly
+blamelessness
+blamer
+blamers
+blames
+blaming
+blanch
+blanched
+blancher
+blanches
+blanching
+bland
+blandly
+blandness
+blank
+blanked
+blanker
+blankest
+blanket
+blanketed
+blanketer
+blanketers
+blanketing
+blankets
+blanking
+blankly
+blankness
+blanks
+blare
+blared
+blares
+blaring
+blase
+blaspheme
+blasphemed
+blasphemer
+blasphemes
+blasphemies
+blaspheming
+blasphemous
+blasphemously
+blasphemousness
+blasphemy
+blast
+blasted
+blaster
+blasters
+blasting
+blasts
+blatant
+blatantly
+blatantness
+blaze
+blazed
+blazer
+blazers
+blazes
+blazing
+blazingly
+bleach
+bleached
+bleacher
+bleachers
+bleaches
+bleaching
+bleak
+bleakly
+bleakness
+blear
+bleariness
+bleary
+bleat
+bleater
+bleating
+bleats
+bled
+bleed
+bleeder
+bleeders
+bleeding
+bleedings
+bleeds
+blemish
+blemish's
+blemished
+blemishes
+blemishing
+blend
+blended
+blender
+blenders
+blending
+blends
+bless
+blessed
+blessedly
+blessedness
+blesses
+blessing
+blessings
+blew
+blight
+blighted
+blighter
+blimp
+blimp's
+blimps
+blind
+blinded
+blinder
+blinders
+blindfold
+blindfolded
+blindfolding
+blindfolds
+blinding
+blindingly
+blindly
+blindness
+blinds
+blink
+blinked
+blinker
+blinkered
+blinkering
+blinkers
+blinking
+blinks
+blip
+blip's
+blips
+bliss
+blissful
+blissfully
+blissfulness
+blister
+blistered
+blistering
+blisteringly
+blisters
+blithe
+blithely
+blither
+blithest
+blitz
+blitz's
+blitzes
+blitzkrieg
+blizzard
+blizzard's
+blizzards
+bloat
+bloated
+bloater
+bloaters
+bloating
+bloats
+blob
+blob's
+blobs
+bloc
+bloc's
+block
+block's
+blockade
+blockaded
+blockader
+blockades
+blockading
+blockage
+blockage's
+blockages
+blocked
+blocker
+blockers
+blockhouse
+blockhouses
+blocking
+blocks
+blocs
+bloke
+bloke's
+blokes
+blond
+blond's
+blonde
+blonde's
+blondes
+blonds
+blood
+blooded
+bloodhound
+bloodhound's
+bloodhounds
+bloodied
+bloodiest
+bloodiness
+bloodless
+bloodlessly
+bloodlessness
+bloods
+bloodshed
+bloodshot
+bloodstain
+bloodstain's
+bloodstained
+bloodstains
+bloodstream
+bloody
+bloodying
+bloom
+bloomed
+bloomer
+bloomers
+blooming
+blooms
+blossom
+blossomed
+blossoms
+blot
+blot's
+blots
+blotted
+blotting
+blouse
+blouse's
+blouses
+blousing
+blow
+blowed
+blower
+blowers
+blowfish
+blowing
+blown
+blows
+blowup
+blubber
+blubbered
+blubbering
+bludgeon
+bludgeoned
+bludgeoning
+bludgeons
+blue
+blueberries
+blueberry
+blueberry's
+bluebird
+bluebird's
+bluebirds
+bluebonnet
+bluebonnet's
+bluebonnets
+blued
+bluefish
+bluely
+blueness
+blueprint
+blueprint's
+blueprinted
+blueprinting
+blueprints
+bluer
+blues
+bluest
+bluestocking
+bluff
+bluffed
+bluffer
+bluffing
+bluffly
+bluffness
+bluffs
+bluing
+bluish
+bluishness
+blunder
+blundered
+blunderer
+blundering
+blunderingly
+blunderings
+blunders
+blunt
+blunted
+blunter
+bluntest
+blunting
+bluntly
+bluntness
+blunts
+blur
+blur's
+blurb
+blurred
+blurredly
+blurrier
+blurriness
+blurring
+blurringly
+blurry
+blurs
+blurt
+blurted
+blurter
+blurting
+blurts
+blush
+blushed
+blusher
+blushes
+blushing
+blushingly
+bluster
+blustered
+blusterer
+blustering
+blusteringly
+blusters
+blustery
+boar
+board
+boarded
+boarder
+boarders
+boarding
+boardinghouse
+boardinghouse's
+boardinghouses
+boards
+boast
+boasted
+boaster
+boasters
+boastful
+boastfully
+boastfulness
+boasting
+boastings
+boasts
+boat
+boated
+boater
+boaters
+boathouse
+boathouse's
+boathouses
+boating
+boatload
+boatload's
+boatloads
+boatman
+boatmen
+boats
+boatswain
+boatswain's
+boatswains
+boatyard
+boatyard's
+boatyards
+bob
+bob's
+bobbed
+bobbies
+bobbin
+bobbin's
+bobbing
+bobbins
+bobby
+bobolink
+bobolink's
+bobolinks
+bobs
+bobwhite
+bobwhite's
+bobwhites
+bode
+boded
+bodes
+bodice
+bodied
+bodies
+bodily
+boding
+body
+bodybuilder
+bodybuilder's
+bodybuilders
+bodybuilding
+bodyguard
+bodyguard's
+bodyguards
+bodying
+bog
+bog's
+bogged
+boggle
+boggled
+boggles
+boggling
+bogs
+bogus
+boil
+boiled
+boiler
+boilerplate
+boilers
+boiling
+boils
+boisterous
+boisterously
+boisterousness
+bold
+bolder
+boldest
+boldface
+boldfaced
+boldfaces
+boldfacing
+boldly
+boldness
+boll
+bolster
+bolstered
+bolsterer
+bolstering
+bolsters
+bolt
+bolted
+bolter
+bolting
+bolts
+bomb
+bombard
+bombarded
+bombarding
+bombardment
+bombardments
+bombards
+bombast
+bombaster
+bombastic
+bombed
+bomber
+bombers
+bombing
+bombings
+bombproof
+bombs
+bonanza
+bonanza's
+bonanzas
+bond
+bondage
+bonded
+bonder
+bonders
+bonding
+bonds
+bondsman
+bondsmen
+bone
+boned
+boner
+boners
+bones
+bonfire
+bonfire's
+bonfires
+bong
+bonier
+boning
+bonnet
+bonneted
+bonnets
+bonnier
+bonny
+bonus
+bonus's
+bonuses
+bony
+boo
+boob
+boobies
+booboo
+booby
+book
+bookcase
+bookcase's
+bookcases
+booked
+booker
+bookers
+bookie
+bookie's
+bookies
+booking
+bookings
+bookish
+bookishly
+bookishness
+bookkeeper
+bookkeeper's
+bookkeepers
+bookkeeping
+booklet
+booklet's
+booklets
+books
+bookseller
+bookseller's
+booksellers
+bookshelf
+bookshelf's
+bookshelves
+bookstore
+bookstore's
+bookstores
+boolean
+booleans
+boom
+boomed
+boomer
+boomerang
+boomerang's
+boomerangs
+booming
+booms
+boon
+boor
+boor's
+boorish
+boorishly
+boorishness
+boors
+boos
+boost
+boosted
+booster
+boosting
+boosts
+boot
+booted
+booth
+booths
+booties
+booting
+bootleg
+bootlegged
+bootlegger
+bootlegger's
+bootleggers
+bootlegging
+bootlegs
+boots
+bootstrap
+bootstrap's
+bootstrapped
+bootstrapping
+bootstraps
+booty
+booze
+boozer
+boozing
+borate
+borated
+borates
+borax
+bordello
+bordello's
+bordellos
+border
+bordered
+borderer
+bordering
+borderings
+borderland
+borderland's
+borderlands
+borderline
+borders
+bore
+bored
+boredom
+borer
+borers
+bores
+boric
+boring
+boringly
+boringness
+born
+borne
+boron
+borough
+boroughs
+borrow
+borrowed
+borrower
+borrowers
+borrowing
+borrowings
+borrows
+bosom
+bosom's
+bosoms
+boss
+bossed
+bosses
+bosun
+botanical
+botanically
+botanist
+botanist's
+botanists
+botany
+botch
+botched
+botcher
+botchers
+botches
+botching
+both
+bother
+bothered
+bothering
+bothers
+bothersome
+bottle
+bottled
+bottleneck
+bottleneck's
+bottlenecks
+bottler
+bottlers
+bottles
+bottling
+bottom
+bottomed
+bottomer
+bottoming
+bottomless
+bottomlessly
+bottomlessness
+bottoms
+botulinus
+botulism
+bouffant
+bough
+bough's
+boughed
+boughs
+bought
+boughten
+boulder
+boulder's
+bouldered
+boulders
+boulevard
+boulevard's
+boulevards
+bounce
+bounced
+bouncer
+bouncers
+bounces
+bouncier
+bouncing
+bouncingly
+bouncy
+bound
+boundaries
+boundary
+boundary's
+bounded
+bounden
+bounder
+bounding
+boundless
+boundlessly
+boundlessness
+bounds
+bounteous
+bounteously
+bounteousness
+bountied
+bounties
+bounty
+bounty's
+bouquet
+bouquet's
+bouquets
+bourbon
+bourbons
+bourgeois
+bourgeoisie
+bout
+bout's
+bouts
+bovine
+bovinely
+bovines
+bow
+bowed
+bowel
+bowel's
+bowels
+bowen
+bower
+bowers
+bowing
+bowl
+bowled
+bowler
+bowlers
+bowline
+bowline's
+bowlines
+bowling
+bowls
+bowman
+bows
+bowser
+bowstring
+bowstring's
+bowstrings
+box
+boxcar
+boxcar's
+boxcars
+boxed
+boxer
+boxers
+boxes
+boxing
+boxwood
+boy
+boy's
+boycott
+boycotted
+boycotter
+boycotting
+boycotts
+boyer
+boyfriend
+boyfriend's
+boyfriends
+boyhood
+boyish
+boyishly
+boyishness
+boys
+bra
+bra's
+brace
+braced
+bracelet
+bracelet's
+bracelets
+bracer
+braces
+bracing
+bracket
+bracketed
+bracketing
+brackets
+brackish
+brackishness
+brae
+brae's
+braes
+brag
+bragged
+bragger
+bragging
+brags
+braid
+braided
+braider
+braiding
+braids
+braille
+brain
+brainchild
+brainchild's
+brained
+brainier
+braininess
+braining
+brains
+brainstorm
+brainstorm's
+brainstormer
+brainstorming
+brainstorms
+brainwash
+brainwashed
+brainwasher
+brainwashes
+brainwashing
+brainy
+brake
+braked
+brakes
+braking
+bramble
+bramble's
+brambles
+brambling
+brambly
+bran
+branch
+branched
+branches
+branching
+branchings
+brand
+branded
+brander
+brandied
+brandies
+branding
+brandish
+brandishes
+brandishing
+brands
+brandy
+brandying
+bras
+brash
+brashly
+brashness
+brass
+brassed
+brasses
+brassier
+brassiere
+brassiness
+brassy
+brat
+brat's
+brats
+bravado
+brave
+braved
+bravely
+braveness
+braver
+bravery
+braves
+bravest
+braving
+bravo
+bravoed
+bravoing
+bravos
+bravura
+brawl
+brawled
+brawler
+brawling
+brawls
+brawn
+bray
+brayed
+brayer
+braying
+brays
+braze
+brazed
+brazen
+brazened
+brazening
+brazenly
+brazenness
+brazer
+brazes
+brazier
+brazier's
+braziers
+brazing
+breach
+breached
+breacher
+breachers
+breaches
+breaching
+bread
+breadboard
+breadboard's
+breadboards
+breaded
+breading
+breads
+breadth
+breadwinner
+breadwinner's
+breadwinners
+break
+breakable
+breakables
+breakage
+breakaway
+breakdown
+breakdown's
+breakdowns
+breaker
+breakers
+breakfast
+breakfasted
+breakfaster
+breakfasters
+breakfasting
+breakfasts
+breaking
+breakpoint
+breakpoint's
+breakpointed
+breakpointing
+breakpoints
+breaks
+breakthrough
+breakthrough's
+breakthroughes
+breakthroughs
+breakup
+breakups
+breakwater
+breakwater's
+breakwaters
+breast
+breasted
+breasting
+breasts
+breastwork
+breastwork's
+breastworks
+breath
+breathable
+breathe
+breathed
+breather
+breathers
+breathes
+breathier
+breathing
+breathless
+breathlessly
+breathlessness
+breaths
+breathtaking
+breathtakingly
+breathy
+bred
+breech
+breech's
+breeches
+breeching
+breed
+breeder
+breeding
+breeds
+breeze
+breeze's
+breezed
+breezes
+breezier
+breezily
+breeziness
+breezing
+breezy
+bremsstrahlung
+brethren
+breve
+breves
+brevet
+breveted
+breveting
+brevets
+brevity
+brew
+brewed
+brewer
+breweries
+brewers
+brewery
+brewery's
+brewing
+brews
+briar
+briar's
+briars
+bribe
+bribed
+briber
+bribers
+bribes
+bribing
+brick
+bricked
+bricker
+bricking
+bricklayer
+bricklayer's
+bricklayers
+bricklaying
+bricks
+bridal
+bride
+bride's
+bridegroom
+brides
+bridesmaid
+bridesmaid's
+bridesmaids
+bridge
+bridgeable
+bridged
+bridgehead
+bridgehead's
+bridgeheads
+bridges
+bridgework
+bridgework's
+bridging
+bridle
+bridled
+bridles
+bridling
+brief
+briefcase
+briefcase's
+briefcases
+briefed
+briefer
+briefest
+briefing
+briefing's
+briefings
+briefly
+briefness
+briefs
+brier
+brig
+brig's
+brigade
+brigade's
+brigaded
+brigades
+brigadier
+brigadier's
+brigadiers
+brigading
+brigantine
+bright
+brighten
+brightened
+brightener
+brighteners
+brightening
+brightens
+brighter
+brightest
+brighting
+brightly
+brightness
+brightnesses
+brights
+brigs
+brilliance
+brilliancy
+brilliant
+brilliantly
+brilliantness
+brim
+brimful
+brimmed
+brindle
+brindled
+brine
+briner
+bring
+bringer
+bringers
+bringing
+brings
+brining
+brink
+brinkmanship
+brisk
+brisker
+briskly
+briskness
+bristle
+bristled
+bristles
+bristling
+britches
+brittle
+brittled
+brittlely
+brittleness
+brittler
+brittlest
+brittling
+broach
+broached
+broacher
+broaches
+broaching
+broad
+broadband
+broadcast
+broadcasted
+broadcaster
+broadcasters
+broadcasting
+broadcastings
+broadcasts
+broaden
+broadened
+broadener
+broadeners
+broadening
+broadenings
+broadens
+broader
+broadest
+broadly
+broadness
+broads
+broadside
+brocade
+brocaded
+broccoli
+brochure
+brochure's
+brochures
+broil
+broiled
+broiler
+broilers
+broiling
+broils
+broke
+broken
+brokenly
+brokenness
+broker
+brokerage
+brokers
+bromide
+bromide's
+bromides
+bromine
+bromines
+bronchi
+bronchial
+bronchiole
+bronchiole's
+bronchioles
+bronchitis
+bronchus
+bronze
+bronzed
+bronzer
+bronzes
+bronzing
+brooch
+brooch's
+brooches
+brood
+brooder
+brooding
+broodingly
+broods
+brook
+brooked
+brooks
+broom
+broom's
+broomed
+brooming
+brooms
+broomstick
+broomstick's
+broomsticks
+broth
+brothel
+brothel's
+brothels
+brother
+brother's
+brotherhood
+brotherliness
+brotherly
+brothers
+brought
+brow
+brow's
+browbeat
+browbeaten
+browbeating
+browbeats
+brown
+browned
+browner
+brownest
+brownie
+brownie's
+brownies
+browning
+brownings
+brownish
+brownly
+brownness
+browns
+brows
+browse
+browsed
+browser
+browsers
+browses
+browsing
+bruise
+bruised
+bruiser
+bruisers
+bruises
+bruising
+brunch
+brunches
+brunette
+brunettes
+brunt
+brush
+brushed
+brusher
+brushes
+brushfire
+brushfire's
+brushfires
+brushier
+brushing
+brushlike
+brushy
+brusque
+brusquely
+brusqueness
+brutal
+brutalities
+brutality
+brutally
+brute
+brute's
+brutes
+brutish
+brutishly
+brutishness
+bubble
+bubbled
+bubbler
+bubbles
+bubblier
+bubbling
+bubbly
+buck
+buckboard
+buckboard's
+buckboards
+bucked
+bucker
+bucket
+bucket's
+bucketed
+bucketing
+buckets
+bucking
+buckle
+buckled
+buckler
+buckles
+buckling
+bucks
+buckshot
+buckskin
+buckskins
+buckwheat
+bucolic
+bud
+bud's
+budded
+buddies
+budding
+buddy
+buddy's
+budge
+budged
+budges
+budget
+budgetary
+budgeted
+budgeter
+budgeters
+budgeting
+budgets
+budging
+buds
+buff
+buff's
+buffalo
+buffaloes
+buffer
+buffer's
+buffered
+bufferer
+bufferer's
+bufferers
+buffering
+buffers
+buffet
+buffeted
+buffeting
+buffetings
+buffets
+buffing
+buffoon
+buffoon's
+buffoons
+buffs
+bug
+bug's
+bugged
+bugger
+bugger's
+buggered
+buggering
+buggers
+buggies
+bugging
+buggy
+buggy's
+bugle
+bugled
+bugler
+bugles
+bugling
+bugs
+build
+builded
+builder
+builders
+building
+building's
+buildings
+builds
+buildup
+buildup's
+buildups
+built
+bulb
+bulb's
+bulbed
+bulbs
+bulge
+bulged
+bulges
+bulging
+bulk
+bulked
+bulkhead
+bulkhead's
+bulkheaded
+bulkheads
+bulkier
+bulkiness
+bulks
+bulky
+bull
+bulldog
+bulldog's
+bulldogs
+bulldoze
+bulldozed
+bulldozer
+bulldozers
+bulldozes
+bulldozing
+bulled
+bullet
+bullet's
+bulletin
+bulletin's
+bulletins
+bulletproof
+bulletproofed
+bulletproofing
+bulletproofs
+bullets
+bullied
+bullies
+bulling
+bullion
+bullish
+bullishly
+bullishness
+bulls
+bully
+bullying
+bulwark
+bum
+bum's
+bumble
+bumblebee
+bumblebee's
+bumblebees
+bumbled
+bumbler
+bumblers
+bumbles
+bumbling
+bumblingly
+bummed
+bummer
+bummers
+bumming
+bump
+bumped
+bumper
+bumpers
+bumping
+bumps
+bumptious
+bumptiously
+bumptiousness
+bums
+bun
+bun's
+bunch
+bunched
+bunches
+bunching
+bundle
+bundled
+bundler
+bundles
+bundling
+bungalow
+bungalow's
+bungalows
+bungle
+bungled
+bungler
+bunglers
+bungles
+bungling
+bunglingly
+bunion
+bunion's
+bunions
+bunk
+bunked
+bunker
+bunker's
+bunkered
+bunkering
+bunkers
+bunkhouse
+bunkhouse's
+bunkhouses
+bunking
+bunkmate
+bunkmate's
+bunkmates
+bunks
+bunnies
+bunny
+bunny's
+buns
+bunt
+bunted
+bunter
+bunters
+bunting
+bunts
+buoy
+buoyancy
+buoyant
+buoyantly
+buoyed
+buoying
+buoys
+burden
+burden's
+burdened
+burdening
+burdens
+burdensome
+burdensomely
+burdensomeness
+bureau
+bureau's
+bureaucracies
+bureaucracy
+bureaucracy's
+bureaucrat
+bureaucrat's
+bureaucratic
+bureaucrats
+bureaus
+burgeon
+burgeoned
+burgeoning
+burgeons
+burger
+burgess
+burgess's
+burgesses
+burgher
+burgher's
+burghers
+burglar
+burglar's
+burglaries
+burglarproof
+burglarproofed
+burglarproofing
+burglarproofs
+burglars
+burglary
+burglary's
+burgle
+burgled
+burgles
+burgling
+burial
+buried
+burier
+buries
+burl
+burled
+burler
+burlesque
+burlesqued
+burlesquely
+burlesquer
+burlesques
+burlesquing
+burlier
+burliness
+burly
+burn
+burned
+burner
+burners
+burning
+burningly
+burnings
+burnish
+burnished
+burnisher
+burnishes
+burnishing
+burns
+burnt
+burntly
+burntness
+burp
+burped
+burping
+burps
+burr
+burr's
+burred
+burrer
+burro
+burro's
+burros
+burrow
+burrowed
+burrower
+burrowing
+burrows
+burrs
+bursa
+bursas
+bursitis
+burst
+bursted
+burster
+bursting
+bursts
+bury
+burying
+bus
+busboy
+busboy's
+busboys
+bused
+buses
+bush
+bushed
+bushel
+bushel's
+bushels
+bushes
+bushier
+bushiness
+bushing
+bushings
+bushwhack
+bushwhacked
+bushwhacker
+bushwhacking
+bushwhacks
+bushy
+busied
+busier
+busies
+busiest
+busily
+business
+business's
+businesses
+businesslike
+businessman
+businessmen
+busing
+buss
+bussed
+busses
+bussing
+bust
+bustard
+bustard's
+bustards
+busted
+buster
+busting
+bustle
+bustled
+bustling
+bustlingly
+busts
+busy
+busying
+but
+butane
+butcher
+butcher's
+butchered
+butcherer
+butchering
+butcherly
+butchers
+butchery
+butler
+butler's
+butlers
+butt
+butt's
+butte
+butted
+butter
+buttered
+butterer
+butterers
+butterfat
+butterflies
+butterfly
+butterfly's
+buttering
+butternut
+butters
+buttes
+butting
+buttock
+buttock's
+buttocks
+button
+buttoned
+buttoner
+buttonhole
+buttonhole's
+buttonholer
+buttonholes
+buttoning
+buttons
+buttress
+buttressed
+buttresses
+buttressing
+butts
+butyl
+butyrate
+buxom
+buxomly
+buxomness
+buy
+buyer
+buyer's
+buyers
+buying
+buys
+buzz
+buzzard
+buzzard's
+buzzards
+buzzed
+buzzer
+buzzes
+buzzing
+buzzword
+buzzword's
+buzzwords
+buzzy
+by
+bye
+byers
+byes
+bygone
+bygones
+bylaw
+bylaw's
+bylaws
+byline
+byline's
+byliner
+bylines
+bypass
+bypassed
+bypasses
+bypassing
+byproduct
+byproduct's
+byproducts
+bystander
+bystander's
+bystanders
+byte
+byte's
+bytes
+byway
+byways
+byword
+byword's
+bywords
+cab
+cab's
+cabbage
+cabbage's
+cabbaged
+cabbages
+cabbaging
+caber
+cabin
+cabin's
+cabinet
+cabinet's
+cabinets
+cabins
+cable
+cabled
+cables
+cabling
+cabs
+cache
+cache's
+cached
+cacher
+caches
+caching
+cackle
+cackled
+cackler
+cackles
+cackling
+cacti
+cactus
+cactuses
+cad
+cadence
+cadenced
+cadences
+cadencing
+cafe
+cafe's
+cafes
+cafeteria
+cafeteria's
+cafeterias
+cage
+caged
+cager
+cagers
+cages
+caging
+cajole
+cajoled
+cajoler
+cajoles
+cajoling
+cake
+caked
+cakes
+caking
+calamities
+calamity
+calamity's
+calcium
+calculate
+calculated
+calculatedly
+calculatedness
+calculates
+calculating
+calculation
+calculations
+calculative
+calculator
+calculator's
+calculators
+calculus
+calendar
+calendar's
+calendared
+calendaring
+calendars
+calf
+calfs
+calibrate
+calibrated
+calibrater
+calibrates
+calibrating
+calibration
+calibrations
+calibrator
+calibrators
+calico
+caliph
+caliphs
+call
+called
+caller
+caller's
+callers
+calling
+callous
+calloused
+callously
+callousness
+calls
+calm
+calmed
+calmer
+calmest
+calming
+calmingly
+calmly
+calmness
+calms
+calorie
+calorie's
+calories
+calves
+came
+camel
+camel's
+camels
+camera
+camera's
+cameras
+camion
+camouflage
+camouflaged
+camouflages
+camouflaging
+camp
+campaign
+campaigned
+campaigner
+campaigners
+campaigning
+campaigns
+camped
+camper
+campers
+camping
+camps
+campus
+campus's
+campuses
+can
+can's
+can't
+canal
+canal's
+canals
+canaries
+canary
+canary's
+cancel
+cancellation
+cancellation's
+cancellations
+cancels
+cancer
+cancer's
+cancers
+candid
+candidate
+candidate's
+candidates
+candidly
+candidness
+candied
+candies
+candle
+candled
+candler
+candles
+candlestick
+candlestick's
+candlesticks
+candling
+candy
+candying
+cane
+caned
+caner
+canes
+caning
+canker
+cankered
+cankering
+canned
+canner
+canner's
+canners
+cannibal
+cannibal's
+cannibals
+canning
+cannister
+cannister's
+cannisters
+cannon
+cannon's
+cannoned
+cannoning
+cannons
+cannot
+canoe
+canoe's
+canoed
+canoes
+canon
+canon's
+canonical
+canonically
+canonicals
+canons
+canopy
+cans
+cantankerous
+cantankerously
+cantankerousness
+canto
+canton
+canton's
+cantons
+cantor
+cantor's
+cantors
+cantos
+canvas
+canvas's
+canvaser
+canvases
+canvass
+canvassed
+canvasser
+canvassers
+canvasses
+canvassing
+canyon
+canyon's
+canyons
+cap
+cap's
+capabilities
+capability
+capability's
+capable
+capableness
+capably
+capacious
+capaciously
+capaciousness
+capacitance
+capacitances
+capacities
+capacitive
+capacitively
+capacitor
+capacitor's
+capacitors
+capacity
+cape
+caper
+capered
+capering
+capers
+capes
+capillary
+capita
+capital
+capitalism
+capitalist
+capitalist's
+capitalists
+capitally
+capitals
+capitol
+capitol's
+capitols
+capped
+capping
+capricious
+capriciously
+capriciousness
+caps
+captain
+captained
+captaining
+captains
+caption
+caption's
+captioned
+captioner
+captioning
+captions
+captivate
+captivated
+captivates
+captivating
+captivation
+captive
+captive's
+captives
+captivity
+captor
+captor's
+captors
+capture
+captured
+capturer
+capturers
+captures
+capturing
+car
+car's
+caravan
+caravan's
+caravaner
+caravans
+carbohydrate
+carbohydrate's
+carbohydrates
+carbolic
+carbon
+carbon's
+carbonate
+carbonated
+carbonates
+carbonation
+carbonic
+carbons
+carcass
+carcass's
+carcasses
+card
+card's
+cardboard
+cardboards
+carded
+carder
+cardiac
+cardinal
+cardinalities
+cardinality
+cardinality's
+cardinally
+cardinals
+carding
+cards
+care
+cared
+career
+career's
+careered
+careering
+careers
+carefree
+careful
+carefully
+carefulness
+careless
+carelessly
+carelessness
+carer
+carers
+cares
+caress
+caressed
+caresser
+caresses
+caressing
+caressingly
+caressive
+caressively
+caret
+carets
+cargo
+cargoes
+cargos
+caribou
+caribous
+caring
+carnation
+carnations
+carnival
+carnival's
+carnivals
+carnivorous
+carnivorously
+carnivorousness
+carol
+carol's
+carols
+carpenter
+carpenter's
+carpentered
+carpentering
+carpenters
+carpet
+carpeted
+carpeting
+carpets
+carriage
+carriage's
+carriages
+carried
+carrier
+carriers
+carries
+carrot
+carrot's
+carrots
+carry
+carrying
+carryover
+carryovers
+cars
+cart
+carted
+carter
+carters
+carting
+cartography
+carton
+carton's
+cartons
+cartoon
+cartoon's
+cartoons
+cartridge
+cartridge's
+cartridges
+carts
+carve
+carved
+carver
+carvers
+carves
+carving
+carvings
+cascade
+cascaded
+cascades
+cascading
+case
+cased
+casement
+casement's
+casements
+cases
+cash
+cashed
+casher
+cashers
+cashes
+cashier
+cashier's
+cashiers
+cashing
+casing
+casings
+cask
+cask's
+casket
+casket's
+caskets
+casks
+casserole
+casserole's
+casseroles
+cast
+cast's
+caste
+caste's
+casted
+caster
+casters
+castes
+casteth
+casting
+castings
+castle
+castled
+castles
+castling
+casts
+casual
+casually
+casualness
+casuals
+casualties
+casualty
+casualty's
+cat
+cat's
+catalyst
+catalyst's
+catalysts
+cataract
+cataracts
+catastrophe
+catastrophe's
+catastrophes
+catastrophic
+catch
+catchable
+catcher
+catcher's
+catchers
+catches
+catching
+categorical
+categorically
+categories
+category
+category's
+cater
+catered
+caterer
+catering
+caterpillar
+caterpillar's
+caterpillars
+caters
+cathedral
+cathedral's
+cathedrals
+catheter
+catheters
+cathode
+cathode's
+cathodes
+catholic
+catholic's
+catholics
+cats
+catsup
+cattle
+caught
+causal
+causality
+causally
+causation
+causation's
+causations
+cause
+caused
+causer
+causes
+causeway
+causeway's
+causeways
+causing
+caustic
+causticly
+caustics
+caution
+cautioned
+cautioner
+cautioners
+cautioning
+cautionings
+cautions
+cautious
+cautiously
+cautiousness
+cavalier
+cavalierly
+cavalierness
+cavalry
+cave
+caveat
+caveat's
+caveats
+caved
+caver
+cavern
+cavern's
+caverns
+caves
+caving
+cavities
+cavity
+cavity's
+caw
+cawed
+cawing
+caws
+cease
+ceased
+ceaseless
+ceaselessly
+ceaselessness
+ceases
+ceasing
+cedar
+ceiling
+ceiling's
+ceilinged
+ceilings
+celebrate
+celebrated
+celebratedness
+celebrates
+celebrating
+celebration
+celebrations
+celebratory
+celebrities
+celebrity
+celebrity's
+celery
+celestial
+celestially
+celibate
+celibates
+cell
+cellar
+cellar's
+cellared
+cellarer
+cellaring
+cellars
+celled
+cellist
+cellist's
+cellists
+cells
+cellular
+cellularly
+cement
+cemented
+cementer
+cementing
+cements
+cemeteries
+cemetery
+cemetery's
+censor
+censored
+censoring
+censors
+censorship
+censure
+censured
+censurer
+censures
+censuring
+census
+census's
+censuses
+cent
+centipede
+centipede's
+centipedes
+central
+centrally
+centrals
+centrifuge
+centrifuge's
+centrifuged
+centrifuges
+centrifuging
+centripetal
+centripetally
+cents
+centuries
+century
+century's
+cereal
+cereal's
+cereals
+cerebral
+cerebrally
+ceremonial
+ceremonially
+ceremonialness
+ceremonies
+ceremony
+ceremony's
+certain
+certainly
+certainties
+certainty
+certifiable
+certificate
+certificated
+certificates
+certificating
+certification
+certifications
+certified
+certifier
+certifiers
+certifies
+certify
+certifying
+cessation
+cessation's
+cessations
+chafe
+chafer
+chaff
+chaffer
+chaffered
+chafferer
+chaffering
+chaffing
+chafing
+chagrin
+chagrined
+chagrining
+chagrins
+chain
+chained
+chaining
+chains
+chair
+chaired
+chairing
+chairman
+chairmanship
+chairmanships
+chairmen
+chairperson
+chairperson's
+chairpersons
+chairs
+chalice
+chalice's
+chaliced
+chalices
+chalk
+chalked
+chalking
+chalks
+challenge
+challenged
+challenger
+challengers
+challenges
+challenging
+challengingly
+chamber
+chambered
+chamberer
+chamberers
+chambering
+chamberlain
+chamberlain's
+chamberlains
+chambers
+champagne
+champaign
+champion
+championed
+championing
+champions
+championship
+championship's
+championships
+chance
+chanced
+chancellor
+chancellors
+chances
+chancing
+chandelier
+chandelier's
+chandeliers
+change
+changeability
+changeable
+changeableness
+changeably
+changed
+changeover
+changeover's
+changeovers
+changer
+changers
+changes
+changing
+channel
+channels
+chant
+chanted
+chanter
+chanticleer
+chanticleer's
+chanticleers
+chanting
+chants
+chaos
+chaotic
+chap
+chap's
+chapel
+chapel's
+chapels
+chaperon
+chaperoned
+chaplain
+chaplain's
+chaplains
+chaps
+chapter
+chapter's
+chaptered
+chaptering
+chapters
+char
+character
+character's
+charactered
+charactering
+characteristic
+characteristic's
+characteristically
+characteristics
+characters
+charcoal
+charcoaled
+charcoals
+charge
+chargeable
+chargeableness
+charged
+charger
+chargers
+charges
+charging
+charing
+chariot
+chariot's
+chariots
+charitable
+charitableness
+charities
+charity
+charity's
+charm
+charmed
+charmer
+charmers
+charming
+charmingly
+charms
+chars
+chart
+chartable
+charted
+charter
+chartered
+charterer
+charterers
+chartering
+charters
+charting
+chartings
+charts
+chase
+chased
+chaser
+chasers
+chases
+chasing
+chasm
+chasm's
+chasms
+chaste
+chastely
+chasteness
+chaster
+chastest
+chastise
+chastised
+chastiser
+chastisers
+chastises
+chastising
+chat
+chateau
+chateau's
+chateaus
+chats
+chatter
+chattered
+chatterer
+chatterers
+chattering
+chatterly
+chatters
+chauffeur
+chauffeured
+chauffeuring
+chauffeurs
+chauvinism
+chauvinism's
+chauvinist
+chauvinist's
+chauvinistic
+chauvinists
+cheap
+cheapen
+cheapened
+cheapening
+cheapens
+cheaper
+cheapest
+cheaply
+cheapness
+cheat
+cheated
+cheater
+cheaters
+cheating
+cheats
+check
+checkable
+checked
+checker
+checkered
+checkering
+checkers
+checking
+checkout
+checkouts
+checkpoint
+checkpoint's
+checkpoints
+checks
+checksum
+checksum's
+checksums
+cheek
+cheek's
+cheeks
+cheer
+cheered
+cheerer
+cheerers
+cheerful
+cheerfully
+cheerfulness
+cheerier
+cheerily
+cheeriness
+cheering
+cheerless
+cheerlessly
+cheerlessness
+cheerly
+cheers
+cheery
+cheese
+cheese's
+cheesed
+cheeses
+cheesing
+chef
+chef's
+chefs
+chemical
+chemically
+chemicals
+chemise
+chemises
+chemist
+chemist's
+chemistries
+chemistry
+chemists
+cherish
+cherished
+cherisher
+cherishes
+cherishing
+cherries
+cherry
+cherry's
+cherub
+cherub's
+cherubim
+cherubs
+chess
+chest
+chester
+chestnut
+chestnut's
+chestnuts
+chests
+chew
+chewed
+chewer
+chewers
+chewing
+chews
+chick
+chickadee
+chickadee's
+chickadees
+chicken
+chickened
+chickening
+chickens
+chicks
+chide
+chided
+chides
+chiding
+chief
+chief's
+chiefly
+chiefs
+chieftain
+chieftain's
+chieftains
+chiffon
+child
+child's
+childhood
+childhoods
+childish
+childishly
+childishness
+childly
+children
+children's
+chill
+chilled
+chiller
+chillers
+chillier
+chillies
+chilliness
+chilling
+chillingly
+chillness
+chills
+chilly
+chime
+chime's
+chimed
+chimer
+chimes
+chiming
+chimney
+chimney's
+chimneyed
+chimneys
+chin
+chin's
+chink
+chinked
+chinks
+chinned
+chinner
+chinners
+chinning
+chins
+chintz
+chip
+chip's
+chipmunk
+chipmunk's
+chipmunks
+chips
+chirp
+chirped
+chirping
+chirps
+chisel
+chisels
+chivalrous
+chivalrously
+chivalrousness
+chivalry
+chlorine
+chloroplast
+chloroplast's
+chloroplasts
+chock
+chock's
+chocked
+chocker
+chocking
+chocks
+chocolate
+chocolate's
+chocolates
+choice
+choicely
+choiceness
+choicer
+choices
+choicest
+choir
+choir's
+choirs
+choke
+choked
+choker
+chokers
+chokes
+choking
+chokingly
+cholera
+choose
+chooser
+choosers
+chooses
+choosing
+chop
+chopped
+chopper
+chopper's
+choppers
+chopping
+chops
+choral
+chorally
+chord
+chord's
+chorded
+chording
+chords
+chore
+chores
+choring
+chorion
+chorus
+chorused
+choruses
+chose
+chosen
+christen
+christened
+christening
+christens
+chronic
+chronicle
+chronicled
+chronicler
+chroniclers
+chronicles
+chronological
+chronologically
+chronologies
+chronology
+chronology's
+chubbier
+chubbiest
+chubbiness
+chubby
+chuck
+chuck's
+chucked
+chucking
+chuckle
+chuckled
+chuckles
+chuckling
+chucklingly
+chucks
+chum
+chump
+chump's
+chumping
+chumps
+chums
+chunk
+chunk's
+chunks
+church
+churched
+churches
+churching
+churchliness
+churchly
+churchman
+churchyard
+churchyard's
+churchyards
+churn
+churned
+churner
+churners
+churning
+churns
+chute
+chute's
+chuted
+chutes
+chuting
+cider
+ciders
+cigar
+cigar's
+cigarette
+cigarette's
+cigarettes
+cigars
+cinder
+cinder's
+cinders
+cinnamon
+cipher
+cipher's
+ciphered
+ciphering
+ciphers
+circle
+circled
+circler
+circles
+circling
+circuit
+circuit's
+circuited
+circuiting
+circuitous
+circuitously
+circuitousness
+circuitry
+circuits
+circular
+circular's
+circularities
+circularity
+circularly
+circularness
+circulars
+circulate
+circulated
+circulates
+circulating
+circulation
+circulations
+circulative
+circumference
+circumferences
+circumflex
+circumflexes
+circumlocution
+circumlocution's
+circumlocutions
+circumspect
+circumspectly
+circumstance
+circumstance's
+circumstanced
+circumstances
+circumstancing
+circumstantial
+circumstantially
+circumvent
+circumventable
+circumvented
+circumventing
+circumvents
+circus
+circus's
+circuses
+cistern
+cistern's
+cisterns
+citadel
+citadel's
+citadels
+citation
+citation's
+citations
+cite
+cited
+cites
+citied
+cities
+citing
+citizen
+citizen's
+citizenly
+citizens
+citizenship
+city
+city's
+civic
+civics
+civil
+civilian
+civilian's
+civilians
+civilities
+civility
+civilly
+clad
+clads
+claim
+claimable
+claimant
+claimant's
+claimants
+claimed
+claimer
+claiming
+claims
+clairvoyant
+clairvoyantly
+clairvoyants
+clam
+clam's
+clamber
+clambered
+clamberer
+clambering
+clambers
+clamorous
+clamorously
+clamorousness
+clamp
+clamped
+clamper
+clamping
+clamps
+clams
+clan
+clang
+clanged
+clanger
+clangers
+clanging
+clangs
+clans
+clap
+claps
+clarification
+clarifications
+clarified
+clarifier
+clarifies
+clarify
+clarifying
+clarity
+clash
+clashed
+clasher
+clashes
+clashing
+clasp
+clasped
+clasper
+clasping
+clasps
+class
+classed
+classer
+classes
+classic
+classical
+classically
+classics
+classifiable
+classification
+classifications
+classified
+classifieds
+classifier
+classifiers
+classifies
+classify
+classifying
+classing
+classmate
+classmate's
+classmates
+classroom
+classroom's
+classrooms
+classwork
+clatter
+clattered
+clatterer
+clattering
+clatteringly
+clatters
+clause
+clause's
+clauses
+claw
+clawed
+clawer
+clawing
+claws
+clay
+clay's
+clayed
+claying
+clays
+clean
+cleaned
+cleaner
+cleaner's
+cleaners
+cleanest
+cleaning
+cleanlier
+cleanliness
+cleanly
+cleanness
+cleans
+cleanse
+cleansed
+cleanser
+cleansers
+cleanses
+cleansing
+cleanup
+cleanup's
+cleanups
+clear
+clearance
+clearance's
+clearances
+cleared
+clearer
+clearest
+clearing
+clearing's
+clearings
+clearly
+clearness
+clears
+cleavage
+cleavages
+cleave
+cleaved
+cleaver
+cleavers
+cleaves
+cleaving
+cleft
+cleft's
+clefts
+clench
+clenched
+clenches
+clenching
+clergy
+clergyman
+clerical
+clerically
+clericals
+clerk
+clerk's
+clerked
+clerking
+clerkly
+clerks
+clever
+cleverer
+cleverest
+cleverly
+cleverness
+cliche
+cliche's
+cliches
+click
+clicked
+clicker
+clickers
+clicking
+clicks
+client
+client's
+clients
+cliff
+cliff's
+cliffs
+climate
+climate's
+climates
+climatic
+climatically
+climax
+climaxed
+climaxes
+climaxing
+climb
+climbed
+climber
+climbers
+climbing
+climbs
+clime
+clime's
+climes
+clinch
+clinched
+clincher
+clinches
+clinching
+clinchingly
+cling
+clinging
+clings
+clinic
+clinic's
+clinical
+clinically
+clinics
+clink
+clinked
+clinker
+clinkered
+clinkering
+clinkers
+clip
+clip's
+clipped
+clipper
+clipper's
+clippers
+clipping
+clipping's
+clippings
+clips
+clique
+clique's
+cliques
+cloak
+cloak's
+cloaked
+cloaking
+cloaks
+clobber
+clobbered
+clobbering
+clobbers
+clock
+clocked
+clocker
+clockers
+clocking
+clockings
+clocks
+clockwise
+clockwork
+clod
+clod's
+clods
+clog
+clog's
+clogged
+clogging
+clogs
+cloister
+cloister's
+cloistered
+cloistering
+cloisters
+clone
+cloned
+cloner
+cloners
+clones
+cloning
+close
+closed
+closely
+closeness
+closenesses
+closer
+closers
+closes
+closest
+closet
+closeted
+closets
+closing
+closings
+closure
+closure's
+closured
+closures
+closuring
+cloth
+clothe
+clothed
+clothes
+clothing
+cloud
+clouded
+cloudier
+cloudiest
+cloudiness
+clouding
+cloudless
+cloudlessly
+cloudlessness
+clouds
+cloudy
+clout
+clove
+clover
+cloves
+clown
+clowning
+clowns
+club
+club's
+clubbed
+clubbing
+clubs
+cluck
+clucked
+clucking
+clucks
+clue
+clue's
+clues
+cluing
+clump
+clumped
+clumping
+clumps
+clumsier
+clumsiest
+clumsily
+clumsiness
+clumsy
+clung
+cluster
+clustered
+clustering
+clusterings
+clusters
+clutch
+clutched
+clutches
+clutching
+clutter
+cluttered
+cluttering
+clutters
+coach
+coach's
+coached
+coacher
+coaches
+coaching
+coachman
+coagulate
+coagulated
+coagulates
+coagulating
+coagulation
+coal
+coaled
+coaler
+coalesce
+coalesced
+coalesces
+coalescing
+coaling
+coalition
+coals
+coarse
+coarsely
+coarsen
+coarsened
+coarseness
+coarsening
+coarser
+coarsest
+coast
+coastal
+coasted
+coaster
+coasters
+coasting
+coasts
+coat
+coated
+coater
+coaters
+coating
+coatings
+coats
+coax
+coaxed
+coaxer
+coaxes
+coaxial
+coaxially
+coaxing
+cobbler
+cobbler's
+cobblers
+cobweb
+cobweb's
+cobwebs
+cock
+cocked
+cocker
+cocking
+cockroach
+cockroaches
+cocks
+cocktail
+cocktail's
+cocktails
+cocoa
+coconut
+coconut's
+coconuts
+cocoon
+cocoon's
+cocoons
+cod
+code
+coded
+coder
+coder's
+coders
+codes
+codeword
+codeword's
+codewords
+codification
+codification's
+codifications
+codified
+codifier
+codifier's
+codifiers
+codifies
+codify
+codifying
+coding
+codings
+cods
+coefficient
+coefficient's
+coefficiently
+coefficients
+coerce
+coerced
+coerces
+coercing
+coercion
+coercions
+coercive
+coercively
+coerciveness
+coexist
+coexisted
+coexistence
+coexisting
+coexists
+coffee
+coffee's
+coffees
+coffer
+coffer's
+coffers
+coffin
+coffin's
+coffins
+cogent
+cogently
+cogitate
+cogitated
+cogitates
+cogitating
+cogitation
+cogitative
+cognition
+cognitions
+cognitive
+cognitively
+cognitives
+cohabit
+cohabitation
+cohabitations
+cohabited
+cohabiting
+cohabits
+cohere
+cohered
+coherence
+coherent
+coherently
+coherer
+coheres
+cohering
+cohesion
+cohesive
+cohesively
+cohesiveness
+coil
+coiled
+coiling
+coils
+coin
+coinage
+coincide
+coincided
+coincidence
+coincidence's
+coincidences
+coincidental
+coincidentally
+coincides
+coinciding
+coined
+coiner
+coining
+coins
+coke
+cokes
+coking
+cold
+colder
+coldest
+coldly
+coldness
+colds
+collaborate
+collaborated
+collaborates
+collaborating
+collaboration
+collaborations
+collaborative
+collaboratively
+collaborator
+collaborator's
+collaborators
+collapse
+collapsed
+collapses
+collapsing
+collar
+collared
+collaring
+collars
+collate
+collated
+collateral
+collaterally
+collates
+collating
+collation
+collations
+collative
+collator
+collators
+colleague
+colleague's
+colleagues
+collect
+collected
+collectedly
+collectedness
+collectible
+collecting
+collection
+collection's
+collections
+collective
+collectively
+collectives
+collector
+collector's
+collectors
+collects
+college
+college's
+colleges
+collegiate
+collegiately
+collide
+collided
+collides
+colliding
+collie
+collied
+collier
+collies
+collision
+collision's
+collisions
+cologne
+cologned
+colon
+colon's
+colonel
+colonel's
+colonels
+colonial
+colonially
+colonialness
+colonials
+colonies
+colonist
+colonist's
+colonists
+colons
+colony
+colony's
+colossal
+colossally
+colt
+colt's
+colter
+colts
+column
+column's
+columnar
+columned
+columns
+comb
+combat
+combatant
+combatant's
+combatants
+combated
+combating
+combative
+combatively
+combativeness
+combats
+combed
+comber
+combers
+combination
+combination's
+combinational
+combinations
+combinator
+combinator's
+combinatorial
+combinatorially
+combinatoric
+combinatorics
+combinators
+combine
+combined
+combiner
+combiners
+combines
+combing
+combings
+combining
+combs
+combustion
+combustions
+come
+comedian
+comedian's
+comedians
+comedic
+comedies
+comedy
+comedy's
+comelier
+comeliness
+comely
+comer
+comers
+comes
+comest
+comestible
+comestibles
+comet
+comet's
+cometh
+comets
+comfort
+comfortabilities
+comfortability
+comfortable
+comfortableness
+comfortably
+comforted
+comforter
+comforters
+comforting
+comfortingly
+comforts
+comic
+comic's
+comical
+comically
+comics
+coming
+comings
+comma
+comma's
+command
+command's
+commandant
+commandant's
+commandants
+commanded
+commandeer
+commandeered
+commandeering
+commandeers
+commander
+commanders
+commanding
+commandingly
+commandment
+commandment's
+commandments
+commands
+commas
+commemorate
+commemorated
+commemorates
+commemorating
+commemoration
+commemorations
+commemorative
+commemoratively
+commemoratives
+commence
+commenced
+commencement
+commencement's
+commencements
+commencer
+commences
+commencing
+commend
+commendation
+commendation's
+commendations
+commended
+commender
+commending
+commends
+commensurate
+commensurately
+commensurates
+commensuration
+commensurations
+comment
+comment's
+commentaries
+commentary
+commentary's
+commentator
+commentator's
+commentators
+commented
+commenter
+commenting
+comments
+commerce
+commerced
+commercial
+commercially
+commercialness
+commercials
+commercing
+commission
+commissioned
+commissioner
+commissioners
+commissioning
+commissions
+commit
+commitment
+commitment's
+commitments
+commits
+committed
+committee
+committee's
+committees
+committing
+commodities
+commodity
+commodity's
+commodore
+commodore's
+commodores
+common
+commonalities
+commonality
+commoner
+commoner's
+commoners
+commonest
+commonly
+commonness
+commonplace
+commonplaceness
+commonplaces
+commons
+commonwealth
+commonwealths
+commotion
+commotions
+communal
+communally
+commune
+communed
+communes
+communicant
+communicant's
+communicants
+communicate
+communicated
+communicates
+communicating
+communication
+communications
+communicative
+communicatively
+communicativeness
+communicator
+communicator's
+communicators
+communing
+communion
+communist
+communist's
+communists
+communities
+community
+community's
+commutative
+commutatively
+commutativity
+commute
+commuted
+commuter
+commuters
+commutes
+commuting
+compact
+compacted
+compacter
+compacters
+compactest
+compacting
+compactly
+compactness
+compactor
+compactor's
+compactors
+compacts
+companies
+companion
+companion's
+companionable
+companionableness
+companions
+companionship
+company
+company's
+comparability
+comparable
+comparableness
+comparably
+comparative
+comparatively
+comparativeness
+comparatives
+comparator
+comparator's
+comparators
+compare
+compared
+comparer
+compares
+comparing
+comparison
+comparison's
+comparisons
+compartment
+compartmented
+compartmenting
+compartments
+compass
+compassed
+compasses
+compassing
+compassion
+compassionate
+compassionately
+compassionateness
+compatibilities
+compatibility
+compatibility's
+compatible
+compatibleness
+compatibles
+compatibly
+compel
+compelled
+compelling
+compellingly
+compels
+compendium
+compensate
+compensated
+compensates
+compensating
+compensation
+compensations
+compensative
+compensatory
+compete
+competed
+competence
+competences
+competent
+competently
+competes
+competing
+competition
+competition's
+competitions
+competitive
+competitively
+competitiveness
+competitor
+competitor's
+competitors
+compilable
+compilation
+compilation's
+compilations
+compile
+compiled
+compiler
+compiler's
+compilers
+compiles
+compiling
+complain
+complained
+complainer
+complainers
+complaining
+complainingly
+complains
+complaint
+complaint's
+complaints
+complement
+complementariness
+complementary
+complemented
+complementer
+complementers
+complementing
+complements
+complete
+completed
+completely
+completeness
+completer
+completes
+completing
+completion
+completions
+completive
+complex
+complexes
+complexion
+complexioned
+complexities
+complexity
+complexly
+complexness
+compliance
+compliances
+complicate
+complicated
+complicatedly
+complicatedness
+complicates
+complicating
+complication
+complications
+complicator
+complicator's
+complicators
+complicity
+complied
+complier
+compliers
+complies
+compliment
+complimentary
+complimented
+complimenter
+complimenters
+complimenting
+compliments
+comply
+complying
+component
+component's
+components
+compose
+composed
+composedly
+composedness
+composer
+composer's
+composers
+composes
+composing
+composite
+compositely
+composites
+composition
+compositional
+compositionally
+compositions
+composure
+compound
+compounded
+compounder
+compounding
+compounds
+comprehend
+comprehended
+comprehending
+comprehends
+comprehensibility
+comprehensible
+comprehensibleness
+comprehension
+comprehensive
+comprehensively
+comprehensiveness
+compress
+compressed
+compressedly
+compresses
+compressible
+compressing
+compression
+compressions
+compressive
+compressively
+comprise
+comprised
+comprises
+comprising
+compromise
+compromised
+compromiser
+compromisers
+compromises
+compromising
+compromisingly
+comptroller
+comptroller's
+comptrollers
+compulsion
+compulsion's
+compulsions
+compulsory
+compunction
+compunctions
+computability
+computable
+computation
+computation's
+computational
+computationally
+computations
+compute
+computed
+computer
+computer's
+computerese
+computers
+computes
+computing
+comrade
+comradeliness
+comradely
+comrades
+comradeship
+concatenate
+concatenated
+concatenates
+concatenating
+concatenation
+concatenations
+conceal
+concealed
+concealer
+concealers
+concealing
+concealingly
+concealment
+conceals
+concede
+conceded
+concededly
+conceder
+concedes
+conceding
+conceit
+conceited
+conceitedly
+conceitedness
+conceits
+conceivable
+conceivably
+conceive
+conceived
+conceiver
+conceives
+conceiving
+concentrate
+concentrated
+concentrates
+concentrating
+concentration
+concentrations
+concentrative
+concentrator
+concentrators
+concentric
+concept
+concept's
+conception
+conception's
+conceptions
+conceptive
+concepts
+conceptual
+conceptually
+concern
+concerned
+concernedly
+concerning
+concerns
+concert
+concerted
+concertedly
+concertedness
+concerts
+concession
+concession's
+concessioner
+concessions
+concise
+concisely
+conciseness
+concision
+concisions
+conclude
+concluded
+concluder
+concludes
+concluding
+conclusion
+conclusion's
+conclusions
+conclusive
+conclusively
+conclusiveness
+concomitant
+concomitantly
+concomitants
+concord
+concrete
+concreted
+concretely
+concreteness
+concretes
+concreting
+concretion
+concur
+concurred
+concurrence
+concurrencies
+concurrency
+concurrent
+concurrently
+concurring
+concurs
+condemn
+condemnation
+condemnations
+condemned
+condemner
+condemners
+condemning
+condemns
+condensation
+condense
+condensed
+condenser
+condensers
+condenses
+condensing
+condescend
+condescending
+condescendingly
+condescends
+condition
+conditional
+conditionally
+conditionals
+conditioned
+conditioner
+conditioners
+conditioning
+conditions
+condone
+condoned
+condoner
+condones
+condoning
+conducive
+conduciveness
+conduct
+conducted
+conducting
+conduction
+conductive
+conductively
+conductivities
+conductivity
+conductor
+conductor's
+conductors
+conducts
+conduit
+conduits
+cone
+cone's
+coned
+cones
+confederacy
+confederate
+confederates
+confederation
+confederations
+confederative
+confer
+conference
+conference's
+conferences
+conferencing
+conferred
+conferrer
+conferrer's
+conferrers
+conferring
+confers
+confess
+confessed
+confessedly
+confesses
+confessing
+confession
+confession's
+confessions
+confessor
+confessor's
+confessors
+confidant
+confidant's
+confidants
+confide
+confided
+confidence
+confidences
+confident
+confidential
+confidentiality
+confidentially
+confidentialness
+confidently
+confider
+confides
+confiding
+confidingly
+confidingness
+configurable
+configuration
+configuration's
+configurations
+configure
+configured
+configures
+configuring
+confine
+confined
+confinement
+confinement's
+confinements
+confiner
+confines
+confining
+confirm
+confirmation
+confirmation's
+confirmations
+confirmed
+confirmedly
+confirmedness
+confirming
+confirms
+confiscate
+confiscated
+confiscates
+confiscating
+confiscation
+confiscations
+conflict
+conflicted
+conflicting
+conflictingly
+conflictive
+conflicts
+conform
+conformed
+conformer
+conformers
+conforming
+conformity
+conforms
+confound
+confounded
+confoundedly
+confounder
+confounding
+confounds
+confront
+confrontation
+confrontation's
+confrontations
+confronted
+confronter
+confronters
+confronting
+confronts
+confuse
+confused
+confusedly
+confusedness
+confuser
+confusers
+confuses
+confusing
+confusingly
+confusion
+confusions
+congenial
+congenially
+congested
+congestion
+congratulate
+congratulated
+congratulates
+congratulation
+congratulations
+congregate
+congregated
+congregates
+congregating
+congregation
+congregations
+congress
+congress's
+congressed
+congresses
+congressing
+congressional
+congressionally
+congressman
+congruence
+congruent
+congruently
+coning
+conjecture
+conjectured
+conjecturer
+conjectures
+conjecturing
+conjoined
+conjunct
+conjuncted
+conjunction
+conjunction's
+conjunctions
+conjunctive
+conjunctively
+conjuncts
+conjure
+conjured
+conjurer
+conjurers
+conjures
+conjuring
+connect
+connected
+connectedly
+connectedness
+connecter
+connecters
+connecting
+connection
+connection's
+connections
+connective
+connective's
+connectively
+connectives
+connectivities
+connectivity
+connector
+connector's
+connectors
+connects
+connoisseur
+connoisseur's
+connoisseurs
+connote
+connoted
+connotes
+connoting
+conquer
+conquerable
+conquered
+conquerer
+conquerers
+conquering
+conqueror
+conqueror's
+conquerors
+conquers
+conquest
+conquest's
+conquests
+cons
+conscience
+conscience's
+consciences
+conscientious
+conscientiously
+conscientiousness
+conscious
+consciouses
+consciously
+consciousness
+consecrate
+consecrated
+consecrates
+consecrating
+consecration
+consecrations
+consecrative
+consecutive
+consecutively
+consecutiveness
+consensus
+consent
+consented
+consenter
+consenters
+consenting
+consentingly
+consents
+consequence
+consequence's
+consequences
+consequent
+consequential
+consequentialities
+consequentiality
+consequentially
+consequentialness
+consequently
+consequentness
+consequents
+conservation
+conservation's
+conservationist
+conservationist's
+conservationists
+conservations
+conservatism
+conservative
+conservatively
+conservativeness
+conservatives
+conserve
+conserved
+conserver
+conserves
+conserving
+consider
+considerable
+considerably
+considerate
+considerately
+considerateness
+consideration
+considerations
+considered
+considerer
+considering
+considers
+consign
+consigned
+consigning
+consigns
+consist
+consisted
+consistencies
+consistency
+consistent
+consistently
+consisting
+consists
+consolable
+consolation
+consolation's
+consolations
+console
+consoled
+consoler
+consolers
+consoles
+consolidate
+consolidated
+consolidates
+consolidating
+consolidation
+consolidations
+consoling
+consolingly
+consonant
+consonant's
+consonantly
+consonants
+consort
+consorted
+consorting
+consortium
+consorts
+conspicuous
+conspicuously
+conspicuousness
+conspiracies
+conspiracy
+conspiracy's
+conspirator
+conspirator's
+conspirators
+conspire
+conspired
+conspires
+conspiring
+constable
+constable's
+constables
+constancy
+constant
+constantly
+constants
+constellation
+constellation's
+constellations
+consternation
+constituencies
+constituency
+constituency's
+constituent
+constituent's
+constituently
+constituents
+constitute
+constituted
+constitutes
+constituting
+constitution
+constitutional
+constitutionality
+constitutionally
+constitutions
+constitutive
+constitutively
+constrain
+constrained
+constrainedly
+constraining
+constrains
+constraint
+constraint's
+constraints
+construct
+constructed
+constructibility
+constructible
+constructing
+construction
+construction's
+constructions
+constructive
+constructively
+constructiveness
+constructor
+constructor's
+constructors
+constructs
+construe
+construed
+construes
+construing
+consul
+consul's
+consulate
+consulate's
+consulates
+consuls
+consult
+consultant
+consultant's
+consultants
+consultation
+consultation's
+consultations
+consultative
+consulted
+consulter
+consulting
+consultive
+consults
+consumable
+consumables
+consume
+consumed
+consumedly
+consumer
+consumer's
+consumers
+consumes
+consuming
+consumingly
+consummate
+consummated
+consummately
+consummates
+consummating
+consummation
+consummations
+consummative
+consumption
+consumption's
+consumptions
+consumptive
+consumptively
+contact
+contacted
+contacting
+contacts
+contagion
+contagious
+contagiously
+contagiousness
+contain
+containable
+contained
+container
+containers
+containing
+containment
+containment's
+containments
+contains
+contaminate
+contaminated
+contaminates
+contaminating
+contamination
+contaminations
+contaminative
+contemplate
+contemplated
+contemplates
+contemplating
+contemplation
+contemplations
+contemplative
+contemplatively
+contemplativeness
+contemporaneous
+contemporaneously
+contemporaneousness
+contemporaries
+contemporariness
+contemporary
+contempt
+contemptible
+contemptibleness
+contemptuous
+contemptuously
+contemptuousness
+contend
+contended
+contender
+contenders
+contending
+contends
+content
+contented
+contentedly
+contentedness
+contenting
+contention
+contention's
+contentions
+contently
+contentment
+contents
+contest
+contestable
+contested
+contester
+contesters
+contesting
+contests
+context
+context's
+contexts
+contextual
+contextually
+contiguity
+contiguous
+contiguously
+contiguousness
+continent
+continent's
+continental
+continentally
+continently
+continents
+contingencies
+contingency
+contingency's
+contingent
+contingent's
+contingently
+contingents
+continual
+continually
+continuance
+continuance's
+continuances
+continuation
+continuation's
+continuations
+continue
+continued
+continuer
+continues
+continuing
+continuities
+continuity
+continuous
+continuously
+continuousness
+continuum
+contour
+contour's
+contoured
+contouring
+contours
+contract
+contracted
+contracting
+contraction
+contraction's
+contractions
+contractive
+contractor
+contractor's
+contractors
+contracts
+contractual
+contractually
+contradict
+contradicted
+contradicting
+contradiction
+contradiction's
+contradictions
+contradictoriness
+contradictory
+contradicts
+contradistinction
+contradistinctions
+contrapositive
+contrapositives
+contraption
+contraption's
+contraptions
+contrariness
+contrary
+contrast
+contrasted
+contraster
+contrasters
+contrasting
+contrastingly
+contrastive
+contrastively
+contrasts
+contribute
+contributed
+contributer
+contributers
+contributes
+contributing
+contribution
+contributions
+contributive
+contributively
+contributor
+contributor's
+contributorily
+contributors
+contributory
+contrivance
+contrivance's
+contrivances
+contrive
+contrived
+contriver
+contrives
+contriving
+control
+control's
+controllability
+controllable
+controllably
+controlled
+controller
+controller's
+controllers
+controlling
+controls
+controversial
+controversially
+controversies
+controversy
+controversy's
+conundrum
+conundrum's
+conundrums
+convalescence
+convene
+convened
+convener
+conveners
+convenes
+convenience
+convenience's
+conveniences
+convenient
+conveniently
+convening
+convent
+convent's
+convention
+convention's
+conventional
+conventionally
+conventions
+convents
+converge
+converged
+convergence
+convergences
+convergent
+converges
+converging
+conversant
+conversantly
+conversation
+conversation's
+conversational
+conversationally
+conversations
+converse
+conversed
+conversely
+converses
+conversing
+conversion
+conversioning
+conversions
+convert
+converted
+converter
+converters
+convertibility
+convertible
+convertibleness
+converting
+converts
+convex
+convey
+conveyance
+conveyance's
+conveyanced
+conveyancer
+conveyancers
+conveyances
+conveyancing
+conveyed
+conveyer
+conveyers
+conveying
+conveys
+convict
+convicted
+convicting
+conviction
+conviction's
+convictions
+convictive
+convicts
+convince
+convinced
+convincer
+convincers
+convinces
+convincing
+convincingly
+convincingness
+convoluted
+convoy
+convoyed
+convoying
+convoys
+convulsion
+convulsion's
+convulsions
+coo
+cooing
+cook
+cook's
+cooked
+cooker
+cookers
+cookery
+cookie
+cookie's
+cookies
+cooking
+cooks
+cooky
+cool
+cooled
+cooler
+cooler's
+coolers
+coolest
+coolie
+coolie's
+coolies
+cooling
+coolings
+coolly
+coolness
+coolnesses
+cools
+coon
+coon's
+coons
+coop
+cooped
+cooper
+cooperate
+cooperated
+cooperates
+cooperating
+cooperation
+cooperations
+cooperative
+cooperatively
+cooperativeness
+cooperatives
+cooperator
+cooperator's
+cooperators
+coopered
+coopering
+coopers
+coops
+coordinate
+coordinated
+coordinately
+coordinateness
+coordinates
+coordinating
+coordination
+coordinations
+coordinative
+coordinator
+coordinator's
+coordinators
+cop
+cop's
+cope
+coped
+coper
+copes
+copied
+copier
+copiers
+copies
+coping
+copings
+copious
+copiously
+copiousness
+copper
+copper's
+coppered
+coppering
+coppers
+cops
+copse
+copses
+copy
+copying
+copyright
+copyright's
+copyrighted
+copyrighter
+copyrighters
+copyrighting
+copyrights
+coral
+cord
+corded
+corder
+cordial
+cordially
+cordialness
+cording
+cords
+core
+cored
+corer
+corers
+cores
+coring
+cork
+corked
+corker
+corkers
+corking
+corks
+cormorant
+cormorants
+corn
+corned
+corner
+cornered
+cornering
+corners
+cornerstone
+cornerstone's
+cornerstones
+cornfield
+cornfield's
+cornfields
+corning
+corns
+corollaries
+corollary
+corollary's
+coronaries
+coronary
+coronation
+coronet
+coronet's
+coroneted
+coronets
+coroutine
+coroutine's
+coroutines
+corporal
+corporal's
+corporally
+corporals
+corporate
+corporately
+corporation
+corporation's
+corporations
+corporative
+corps
+corpse
+corpse's
+corpses
+corpus
+correct
+correctable
+corrected
+correcting
+correction
+corrections
+corrective
+correctively
+correctiveness
+correctives
+correctly
+correctness
+corrector
+corrects
+correlate
+correlated
+correlates
+correlating
+correlation
+correlations
+correlative
+correlatively
+correspond
+corresponded
+correspondence
+correspondence's
+correspondences
+correspondent
+correspondent's
+correspondents
+corresponding
+correspondingly
+corresponds
+corridor
+corridor's
+corridors
+corroborate
+corroborated
+corroborates
+corroborating
+corroboration
+corroborations
+corroborative
+corroboratively
+corrosion
+corrosions
+corrupt
+corrupted
+corrupter
+corrupting
+corruption
+corruptive
+corruptively
+corruptly
+corrupts
+corset
+corsets
+cosine
+cosines
+cosmetic
+cosmetics
+cosmology
+cosmopolitan
+cost
+costed
+costing
+costive
+costively
+costiveness
+costlier
+costliness
+costly
+costs
+costume
+costumed
+costumer
+costumers
+costumes
+costuming
+cot
+cot's
+cots
+cottage
+cottager
+cottagers
+cottages
+cotton
+cottoned
+cottoning
+cottons
+cotyledon
+cotyledon's
+cotyledons
+couch
+couched
+couches
+couching
+cough
+coughed
+cougher
+coughing
+coughs
+could
+couldest
+couldn't
+council
+council's
+councillor
+councillor's
+councillors
+councils
+counsel
+counsel's
+counsels
+count
+countable
+countably
+counted
+countenance
+countenancer
+counter
+counteract
+counteracted
+counteracting
+counteractive
+counteracts
+counterclockwise
+countered
+counterexample
+counterexamples
+counterfeit
+counterfeited
+counterfeiter
+counterfeiting
+counterfeits
+countering
+countermeasure
+countermeasure's
+countermeasures
+counterpart
+counterpart's
+counterparts
+counterpoint
+counterpointing
+counterproductive
+counterrevolution
+counters
+countess
+counties
+counting
+countless
+countlessly
+countries
+country
+country's
+countryman
+countryside
+counts
+county
+county's
+couple
+couple's
+coupled
+coupler
+couplers
+couples
+coupling
+couplings
+coupon
+coupon's
+coupons
+courage
+courageous
+courageously
+courageousness
+courier
+courier's
+couriers
+course
+coursed
+courser
+courses
+coursing
+court
+courted
+courteous
+courteously
+courteousness
+courter
+courters
+courtesies
+courtesy
+courtesy's
+courthouse
+courthouse's
+courthouses
+courtier
+courtier's
+courtiers
+courting
+courtliness
+courtly
+courtroom
+courtroom's
+courtrooms
+courts
+courtship
+courtyard
+courtyard's
+courtyards
+cousin
+cousin's
+cousins
+cove
+covenant
+covenant's
+covenanted
+covenanter
+covenanting
+covenants
+cover
+coverable
+coverage
+covered
+coverer
+covering
+coverings
+coverlet
+coverlet's
+coverlets
+covers
+covert
+covertly
+covertness
+coves
+covet
+coveted
+coveter
+coveting
+covetingly
+covetous
+covetously
+covetousness
+covets
+coving
+cow
+coward
+cowardice
+cowardliness
+cowardly
+cowards
+cowboy
+cowboy's
+cowboys
+cowed
+cowedly
+cower
+cowered
+cowerer
+cowerers
+cowering
+coweringly
+cowers
+cowgirl
+cowgirl's
+cowgirls
+cowing
+cowl
+cowled
+cowling
+cowls
+cows
+cowslip
+cowslip's
+cowslips
+coyote
+coyote's
+coyotes
+cozier
+cozies
+coziness
+cozy
+crab
+crab's
+crabs
+crack
+cracked
+cracker
+crackers
+cracking
+crackle
+crackled
+crackles
+crackling
+crackly
+cracks
+cradle
+cradled
+cradler
+cradles
+cradling
+craft
+crafted
+crafter
+craftier
+craftiness
+crafting
+crafts
+craftsman
+crafty
+crag
+crag's
+crags
+cram
+cramp
+cramp's
+cramped
+cramper
+cramps
+crams
+cranberries
+cranberry
+cranberry's
+crane
+crane's
+craned
+cranes
+craning
+crank
+cranked
+crankier
+crankiest
+crankily
+crankiness
+cranking
+cranks
+cranky
+crap
+craping
+craps
+crash
+crashed
+crasher
+crashers
+crashes
+crashing
+crate
+crater
+cratered
+craters
+crates
+crating
+cravat
+cravat's
+cravats
+crave
+craved
+craven
+cravenly
+cravenness
+craver
+craves
+craving
+crawl
+crawled
+crawler
+crawlers
+crawling
+crawls
+craze
+crazed
+crazes
+crazier
+craziest
+crazily
+craziness
+crazing
+crazy
+creak
+creaked
+creaking
+creaks
+cream
+creamed
+creamer
+creamers
+creaminess
+creaming
+creams
+creamy
+crease
+creased
+creaser
+creases
+creasing
+create
+created
+creates
+creating
+creation
+creations
+creative
+creatively
+creativeness
+creativity
+creator
+creator's
+creators
+creature
+creature's
+creatureliness
+creaturely
+creatures
+credence
+credibility
+credible
+credibly
+credit
+creditable
+creditableness
+creditably
+credited
+crediting
+creditor
+creditor's
+creditors
+credits
+credulity
+credulous
+credulously
+credulousness
+creed
+creed's
+creeds
+creek
+creek's
+creeks
+creep
+creeper
+creepers
+creeping
+creeps
+cremate
+cremated
+cremates
+cremating
+cremation
+cremations
+crepe
+crept
+crescent
+crescent's
+crescents
+crest
+crested
+cresting
+crests
+cretin
+cretins
+crevice
+crevice's
+crevices
+crew
+crewed
+crewing
+crews
+crib
+crib's
+cribs
+cricket
+cricket's
+cricketer
+cricketing
+crickets
+cried
+crier
+criers
+cries
+crime
+crime's
+crimes
+criminal
+criminally
+criminals
+crimson
+crimsoning
+cringe
+cringed
+cringer
+cringes
+cringing
+cripple
+crippled
+crippler
+cripples
+crippling
+crises
+crisis
+crisp
+crisper
+crisply
+crispness
+crisps
+criteria
+criterion
+critic
+critic's
+critical
+critically
+criticalness
+criticism
+criticism's
+criticisms
+critics
+critique
+critiqued
+critiques
+critiquing
+critter
+critter's
+critters
+croak
+croaked
+croaker
+croakers
+croaking
+croaks
+crochet
+crocheted
+crocheter
+crocheting
+crochets
+crook
+crooked
+crookedly
+crookedness
+crooks
+crop
+crop's
+cropped
+cropper
+cropper's
+croppers
+cropping
+crops
+cross
+crossable
+crossbar
+crossbar's
+crossbars
+crossed
+crosser
+crossers
+crosses
+crossing
+crossings
+crossly
+crossover
+crossover's
+crossovers
+crossword
+crossword's
+crosswords
+crouch
+crouched
+crouches
+crouching
+crow
+crowd
+crowded
+crowdedness
+crowder
+crowding
+crowds
+crowed
+crowing
+crown
+crowned
+crowner
+crowning
+crowns
+crows
+crucial
+crucially
+crucification
+crucified
+crucifies
+crucify
+crucifying
+crude
+crudely
+crudeness
+cruder
+crudest
+cruel
+crueler
+cruelest
+cruelly
+cruelness
+cruelty
+cruise
+cruised
+cruiser
+cruisers
+cruises
+cruising
+crumb
+crumble
+crumbled
+crumbles
+crumblier
+crumbliness
+crumbling
+crumblings
+crumbly
+crumbs
+crumple
+crumpled
+crumples
+crumpling
+crunch
+crunched
+cruncher
+crunchers
+crunches
+crunchier
+crunchiest
+crunchiness
+crunching
+crunchy
+crusade
+crusaded
+crusader
+crusaders
+crusades
+crusading
+crush
+crushable
+crushed
+crusher
+crushers
+crushes
+crushing
+crushingly
+crust
+crust's
+crustacean
+crustacean's
+crustaceans
+crusted
+crusting
+crusts
+crutch
+crutch's
+crutched
+crutches
+crux
+crux's
+cruxes
+cry
+crying
+cryptanalysis
+cryptic
+cryptographic
+cryptography
+cryptology
+crystal
+crystal's
+crystalline
+crystals
+cub
+cub's
+cube
+cubed
+cuber
+cubes
+cubic
+cubicly
+cubics
+cubing
+cubs
+cuckoo
+cuckoo's
+cuckoos
+cucumber
+cucumber's
+cucumbers
+cuddle
+cuddled
+cuddles
+cuddling
+cudgel
+cudgel's
+cudgels
+cue
+cued
+cues
+cuff
+cuff's
+cuffed
+cuffing
+cuffs
+cuing
+cull
+culled
+culler
+culling
+culls
+culminate
+culminated
+culminates
+culminating
+culmination
+culpability
+culprit
+culprit's
+culprits
+cult
+cult's
+cultivate
+cultivated
+cultivates
+cultivating
+cultivation
+cultivations
+cultivator
+cultivator's
+cultivators
+cults
+cultural
+culturally
+culture
+cultured
+cultures
+culturing
+cumbersome
+cumbersomely
+cumbersomeness
+cumulative
+cumulatively
+cunning
+cunningly
+cunningness
+cup
+cup's
+cupboard
+cupboard's
+cupboards
+cupful
+cupfuls
+cupped
+cupping
+cups
+cur
+curable
+curableness
+curably
+curb
+curbed
+curbing
+curbs
+curds
+cure
+cured
+curer
+cures
+curfew
+curfew's
+curfews
+curing
+curiosities
+curiosity
+curiosity's
+curious
+curiouser
+curiousest
+curiously
+curiousness
+curl
+curled
+curler
+curlers
+curlier
+curliness
+curling
+curls
+curly
+currant
+currant's
+currants
+currencies
+currency
+currency's
+current
+currently
+currentness
+currents
+curricular
+curriculum
+curriculum's
+curriculums
+curried
+currier
+curries
+curry
+currying
+curs
+curse
+cursed
+cursedly
+cursedness
+curses
+cursing
+cursive
+cursively
+cursiveness
+cursor
+cursor's
+cursorily
+cursoriness
+cursors
+cursory
+curt
+curtail
+curtailed
+curtailer
+curtailing
+curtails
+curtain
+curtained
+curtaining
+curtains
+curtly
+curtness
+curtsied
+curtsies
+curtsy
+curtsy's
+curtsying
+curvature
+curvatures
+curve
+curved
+curves
+curving
+cushion
+cushioned
+cushioning
+cushions
+cusp
+cusp's
+cusps
+cuss
+cussed
+cussedly
+cussedness
+cusser
+cusses
+custard
+custodian
+custodian's
+custodians
+custodies
+custody
+custom
+customarily
+customariness
+customary
+customer
+customer's
+customers
+customs
+cut
+cut's
+cute
+cutely
+cuteness
+cuter
+cutes
+cutest
+cutoff
+cutoffs
+cuts
+cutter
+cutter's
+cutters
+cutting
+cuttingly
+cuttings
+cybernetic
+cybernetics
+cycle
+cycled
+cycler
+cycles
+cyclic
+cyclically
+cyclicly
+cycling
+cycloid
+cycloid's
+cycloidal
+cycloids
+cyclone
+cyclone's
+cyclones
+cylinder
+cylinder's
+cylindered
+cylindering
+cylinders
+cylindrical
+cylindrically
+cymbal
+cymbal's
+cymbals
+cynical
+cynically
+cypress
+cyst
+cysts
+cytology
+czar
+dabble
+dabbled
+dabbler
+dabblers
+dabbles
+dabbling
+dad
+dad's
+daddies
+daddy
+dads
+daemon
+daemon's
+daemons
+daffodil
+daffodil's
+daffodils
+dagger
+daggers
+dailies
+daily
+daintier
+dainties
+daintily
+daintiness
+dainty
+dairies
+dairy
+dairying
+daisies
+daisy
+daisy's
+dale
+dale's
+dales
+daleth
+dam
+dam's
+damage
+damaged
+damager
+damagers
+damages
+damaging
+damagingly
+damask
+dame
+damed
+damn
+damnation
+damned
+damneder
+damnedest
+damning
+damningly
+damns
+damp
+damped
+dampen
+dampened
+dampener
+dampening
+dampens
+damper
+dampers
+damping
+damply
+dampness
+damps
+dams
+damsel
+damsel's
+damsels
+dance
+danced
+dancer
+dancers
+dances
+dancing
+dandelion
+dandelion's
+dandelions
+dandier
+dandies
+dandy
+danger
+danger's
+dangerous
+dangerously
+dangerousness
+dangers
+dangle
+dangled
+dangler
+dangler's
+danglers
+dangles
+dangling
+danglingly
+dare
+dared
+darer
+darers
+dares
+daring
+daringly
+daringness
+dark
+darken
+darkened
+darkener
+darkeners
+darkening
+darker
+darkest
+darkly
+darkness
+darks
+darling
+darling's
+darlingly
+darlingness
+darlings
+darn
+darned
+darner
+darning
+darns
+dart
+darted
+darter
+darting
+darts
+dash
+dashed
+dasher
+dashers
+dashes
+dashing
+dashingly
+data
+database
+database's
+databases
+date
+dated
+datedly
+datedness
+dater
+dates
+dating
+dative
+datum
+datums
+daughter
+daughter's
+daughterly
+daughters
+daunt
+daunted
+daunting
+dauntless
+dauntlessly
+dauntlessness
+daunts
+dawn
+dawned
+dawning
+dawns
+day
+day's
+daybreak
+daybreaks
+daydream
+daydreamed
+daydreamer
+daydreamers
+daydreaming
+daydreams
+daylight
+daylight's
+daylights
+days
+daytime
+daytimes
+daze
+dazed
+dazedness
+dazes
+dazing
+dazzle
+dazzled
+dazzler
+dazzlers
+dazzles
+dazzling
+dazzlingly
+deacon
+deacon's
+deacons
+dead
+deaden
+deadened
+deadener
+deadening
+deadeningly
+deadens
+deadlier
+deadliest
+deadline
+deadline's
+deadlines
+deadliness
+deadlock
+deadlocked
+deadlocking
+deadlocks
+deadly
+deadness
+deaf
+deafen
+deafened
+deafening
+deafeningly
+deafens
+deafer
+deafest
+deafly
+deafness
+deal
+dealer
+dealers
+dealing
+dealings
+deallocate
+deallocated
+deallocates
+deallocating
+deallocation
+deallocation's
+deallocations
+deallocator
+deals
+dealt
+dean
+dean's
+deans
+dear
+dearer
+dearest
+dearly
+dearness
+dears
+dearth
+dearths
+death
+deathly
+deaths
+debatable
+debate
+debated
+debater
+debaters
+debates
+debating
+debilitate
+debilitated
+debilitates
+debilitating
+debilitation
+debris
+debt
+debt's
+debtor
+debtors
+debts
+debug
+debugged
+debugger
+debugger's
+debuggers
+debugging
+debugs
+decade
+decade's
+decadence
+decadent
+decadently
+decades
+decay
+decayed
+decayer
+decaying
+decays
+decease
+deceased
+deceases
+deceasing
+deceit
+deceitful
+deceitfully
+deceitfulness
+deceive
+deceived
+deceiver
+deceivers
+deceives
+deceiving
+deceivingly
+decelerate
+decelerated
+decelerates
+decelerating
+deceleration
+decelerations
+decencies
+decency
+decency's
+decent
+decently
+deception
+deception's
+deceptions
+deceptive
+deceptively
+deceptiveness
+decidability
+decidable
+decide
+decided
+decidedly
+decidedness
+decider
+decides
+deciding
+decimal
+decimally
+decimals
+decimate
+decimated
+decimates
+decimating
+decimation
+decipher
+deciphered
+decipherer
+decipherers
+deciphering
+deciphers
+decision
+decision's
+decisions
+decisive
+decisively
+decisiveness
+deck
+decked
+decker
+decking
+deckings
+decks
+declaration
+declaration's
+declarations
+declarative
+declaratively
+declaratives
+declare
+declared
+declarer
+declarers
+declares
+declaring
+declination
+declination's
+declinations
+decline
+declined
+decliner
+decliners
+declines
+declining
+decode
+decoded
+decoder
+decoders
+decodes
+decoding
+decodings
+decompile
+decompiled
+decompiler
+decompilers
+decompiles
+decompiling
+decomposability
+decomposable
+decompose
+decomposed
+decomposer
+decomposes
+decomposing
+decomposition
+decomposition's
+decompositions
+decompression
+decorate
+decorated
+decorates
+decorating
+decoration
+decorations
+decorative
+decoratively
+decorativeness
+decorum
+decorums
+decouple
+decoupled
+decoupler
+decouples
+decoupling
+decoy
+decoy's
+decoys
+decrease
+decreased
+decreases
+decreasing
+decreasingly
+decree
+decreed
+decreeing
+decreer
+decrees
+decrement
+decremented
+decrementing
+decrements
+dedicate
+dedicated
+dedicatedly
+dedicates
+dedicating
+dedication
+dedications
+dedicative
+deduce
+deduced
+deducer
+deduces
+deducible
+deducing
+deduct
+deducted
+deducting
+deduction
+deduction's
+deductions
+deductive
+deductively
+deducts
+deed
+deeded
+deeding
+deeds
+deem
+deemed
+deeming
+deems
+deep
+deepen
+deepened
+deepening
+deepens
+deeper
+deepest
+deeply
+deepness
+deeps
+deer
+deers
+default
+defaulted
+defaulter
+defaulting
+defaults
+defeat
+defeated
+defeating
+defeatism
+defeatist
+defeatists
+defeats
+defect
+defected
+defecting
+defection
+defection's
+defections
+defective
+defectively
+defectiveness
+defectives
+defects
+defend
+defendant
+defendant's
+defendants
+defended
+defender
+defenders
+defending
+defends
+defenestrate
+defenestrated
+defenestrates
+defenestrating
+defenestration
+defenestrations
+defensive
+defensively
+defensiveness
+defer
+deference
+deferment
+deferment's
+deferments
+deferrable
+deferred
+deferrer
+deferrer's
+deferrers
+deferring
+defers
+defiance
+defiances
+defiant
+defiantly
+deficiencies
+deficiency
+deficient
+deficiently
+deficit
+deficit's
+deficits
+defied
+defier
+defies
+defile
+defiled
+defiler
+defiles
+defiling
+definable
+define
+defined
+definer
+definers
+defines
+defining
+definite
+definitely
+definiteness
+definition
+definition's
+definitional
+definitions
+definitive
+definitively
+definitiveness
+deformation
+deformation's
+deformations
+deformed
+deformities
+deformity
+deformity's
+deftly
+defy
+defying
+defyingly
+degenerate
+degenerated
+degenerately
+degenerateness
+degenerates
+degenerating
+degeneration
+degenerative
+degradable
+degradation
+degradation's
+degradations
+degrade
+degraded
+degradedly
+degradedness
+degrader
+degrades
+degrading
+degradingly
+degree
+degree's
+degreed
+degrees
+deign
+deigned
+deigning
+deigns
+deities
+deity
+deity's
+dejected
+dejectedly
+dejectedness
+delay
+delayed
+delayer
+delayers
+delaying
+delays
+delegate
+delegated
+delegates
+delegating
+delegation
+delegations
+delete
+deleted
+deleter
+deletes
+deleting
+deletion
+deletions
+deliberate
+deliberated
+deliberately
+deliberateness
+deliberates
+deliberating
+deliberation
+deliberations
+deliberative
+deliberatively
+deliberativeness
+deliberator
+deliberator's
+deliberators
+delicacies
+delicacy
+delicacy's
+delicate
+delicately
+delicateness
+delicates
+delicious
+deliciouses
+deliciously
+deliciousness
+delight
+delighted
+delightedly
+delightedness
+delighter
+delightful
+delightfully
+delightfulness
+delighting
+delights
+delimit
+delimited
+delimiter
+delimiters
+delimiting
+delimits
+delineate
+delineated
+delineates
+delineating
+delineation
+delineations
+delineative
+delinquency
+delinquent
+delinquent's
+delinquently
+delinquents
+delirious
+deliriously
+deliriousness
+deliver
+deliverable
+deliverables
+deliverance
+delivered
+deliverer
+deliverers
+deliveries
+delivering
+delivers
+delivery
+delivery's
+dell
+dell's
+dells
+delta
+delta's
+deltas
+delude
+deluded
+deluder
+deludes
+deluding
+deludingly
+deluge
+deluged
+deluges
+deluging
+delusion
+delusion's
+delusions
+delve
+delved
+delver
+delves
+delving
+demand
+demanded
+demander
+demanding
+demandingly
+demands
+demise
+demised
+demises
+demising
+demo
+democracies
+democracy
+democracy's
+democrat
+democrat's
+democratic
+democratically
+democrats
+demodulate
+demodulated
+demodulates
+demodulating
+demodulation
+demodulation's
+demodulations
+demodulator
+demodulator's
+demodulators
+demographic
+demographics
+demolish
+demolished
+demolisher
+demolishes
+demolishing
+demolition
+demolitions
+demon
+demon's
+demoness
+demons
+demonstrable
+demonstrableness
+demonstrate
+demonstrated
+demonstrates
+demonstrating
+demonstration
+demonstrations
+demonstrative
+demonstratively
+demonstrativeness
+demonstrator
+demonstrator's
+demonstrators
+demos
+demur
+demurs
+den
+den's
+deniable
+denial
+denial's
+denials
+denied
+denier
+denies
+denigrate
+denigrated
+denigrates
+denigrating
+denigration
+denigrative
+denizen
+denizens
+denomination
+denomination's
+denominations
+denominator
+denominator's
+denominators
+denotable
+denotation
+denotation's
+denotational
+denotationally
+denotations
+denotative
+denote
+denoted
+denotes
+denoting
+denounce
+denounced
+denouncer
+denouncers
+denounces
+denouncing
+dens
+dense
+densely
+denseness
+denser
+densest
+densities
+density
+density's
+dent
+dental
+dentally
+dentals
+dented
+denting
+dentist
+dentist's
+dentists
+dents
+deny
+denying
+denyingly
+depart
+departed
+departing
+department
+department's
+departmental
+departmentally
+departments
+departs
+departure
+departure's
+departures
+depend
+dependability
+dependable
+dependableness
+dependably
+depended
+dependence
+dependences
+dependencies
+dependency
+dependent
+dependently
+dependents
+depending
+depends
+depict
+depicted
+depicter
+depicting
+depicts
+deplete
+depleted
+depletes
+depleting
+depletion
+depletions
+depletive
+deplorable
+deplorableness
+deplore
+deplored
+deplorer
+deplores
+deploring
+deploringly
+deploy
+deployed
+deploying
+deployment
+deployment's
+deployments
+deploys
+deport
+deportation
+deported
+deportee
+deportee's
+deportees
+deporting
+deportment
+deports
+depose
+deposed
+deposes
+deposing
+deposit
+deposited
+depositing
+deposition
+deposition's
+depositions
+depositor
+depositor's
+depositors
+deposits
+depot
+depot's
+depots
+deprave
+depraved
+depravedly
+depravedness
+depraver
+depraves
+depraving
+depreciate
+depreciated
+depreciates
+depreciating
+depreciatingly
+depreciation
+depreciations
+depreciative
+depreciatively
+depress
+depressed
+depresses
+depressing
+depressingly
+depression
+depression's
+depressions
+depressive
+depressively
+deprivation
+deprivation's
+deprivations
+deprive
+deprived
+deprives
+depriving
+depth
+depths
+deputies
+deputy
+deputy's
+dequeue
+dequeued
+dequeues
+dequeuing
+derail
+derailed
+derailing
+derails
+derbies
+derby
+dereference
+dereferenced
+dereferencer
+dereferencers
+dereferences
+dereferencing
+deride
+derided
+derider
+derides
+deriding
+deridingly
+derision
+derivable
+derivation
+derivation's
+derivations
+derivative
+derivative's
+derivatively
+derivativeness
+derivatives
+derive
+derived
+deriver
+derives
+deriving
+descend
+descendant
+descendant's
+descendants
+descended
+descender
+descenders
+descending
+descends
+descent
+descent's
+descents
+describable
+describe
+described
+describer
+describers
+describes
+describing
+descried
+description
+description's
+descriptions
+descriptive
+descriptively
+descriptiveness
+descriptives
+descriptor
+descriptor's
+descriptors
+descry
+descrying
+desert
+deserted
+deserter
+deserters
+deserting
+desertion
+desertions
+deserts
+deserve
+deserved
+deservedly
+deservedness
+deserver
+deserves
+deserving
+deservingly
+deservings
+desiderata
+desideratum
+design
+designate
+designated
+designates
+designating
+designation
+designations
+designative
+designator
+designator's
+designators
+designed
+designedly
+designer
+designer's
+designers
+designing
+designs
+desirability
+desirable
+desirableness
+desirably
+desire
+desired
+desirer
+desires
+desiring
+desirous
+desirously
+desirousness
+desk
+desk's
+desks
+desktop
+desolate
+desolated
+desolately
+desolateness
+desolater
+desolates
+desolating
+desolatingly
+desolation
+desolations
+despair
+despaired
+despairer
+despairing
+despairingly
+despairs
+despatch
+despatched
+desperate
+desperately
+desperateness
+desperation
+despise
+despised
+despiser
+despises
+despising
+despite
+despited
+despot
+despot's
+despotic
+despots
+dessert
+dessert's
+desserts
+destination
+destination's
+destinations
+destine
+destined
+destinies
+destining
+destiny
+destiny's
+destitute
+destituteness
+destitution
+destroy
+destroyed
+destroyer
+destroyer's
+destroyers
+destroying
+destroys
+destruction
+destruction's
+destructions
+destructive
+destructively
+destructiveness
+detach
+detached
+detachedly
+detachedness
+detacher
+detaches
+detaching
+detachment
+detachment's
+detachments
+detail
+detailed
+detailedly
+detailedness
+detailer
+detailing
+details
+detain
+detained
+detainer
+detaining
+detains
+detect
+detectable
+detectably
+detected
+detecting
+detection
+detection's
+detections
+detective
+detectives
+detector
+detector's
+detectors
+detects
+detention
+deteriorate
+deteriorated
+deteriorates
+deteriorating
+deterioration
+deteriorative
+determinable
+determinableness
+determinacy
+determinant
+determinant's
+determinants
+determinate
+determinately
+determinateness
+determination
+determinations
+determinative
+determinatively
+determinativeness
+determine
+determined
+determinedly
+determinedness
+determiner
+determiners
+determines
+determining
+determinism
+deterministic
+deterministically
+detest
+detestable
+detestableness
+detested
+detesting
+detests
+detonate
+detonated
+detonates
+detonating
+detonation
+detonative
+detract
+detracted
+detracting
+detractive
+detractively
+detractor
+detractor's
+detractors
+detracts
+detriment
+detriments
+devastate
+devastated
+devastates
+devastating
+devastatingly
+devastation
+devastations
+devastative
+develop
+developed
+developer
+developer's
+developers
+developing
+development
+development's
+developmental
+developmentally
+developments
+develops
+deviant
+deviant's
+deviantly
+deviants
+deviate
+deviated
+deviates
+deviating
+deviation
+deviations
+device
+device's
+devices
+devil
+devil's
+devilish
+devilishly
+devilishness
+devils
+devise
+devised
+deviser
+devises
+devising
+devisings
+devision
+devisions
+devoid
+devote
+devoted
+devotedly
+devotee
+devotee's
+devotees
+devotes
+devoting
+devotion
+devotions
+devour
+devoured
+devourer
+devouring
+devours
+devout
+devoutly
+devoutness
+dew
+dewdrop
+dewdrop's
+dewdrops
+dewed
+dewier
+dewiness
+dewing
+dews
+dewy
+dexterity
+diabetes
+diadem
+diagnosable
+diagnose
+diagnosed
+diagnoses
+diagnosing
+diagnosis
+diagnostic
+diagnostic's
+diagnostics
+diagonal
+diagonally
+diagonals
+diagram
+diagram's
+diagramed
+diagraming
+diagrammable
+diagrammatic
+diagrammatically
+diagrammed
+diagrammer
+diagrammer's
+diagrammers
+diagramming
+diagrams
+dial
+dial's
+dialect
+dialect's
+dialects
+dialog
+dialog's
+dialogs
+dialogue
+dialogue's
+dialogues
+dials
+diameter
+diameter's
+diameters
+diametrically
+diamond
+diamond's
+diamonds
+diaper
+diaper's
+diapered
+diapering
+diapers
+diaphragm
+diaphragm's
+diaphragms
+diaries
+diary
+diary's
+diatribe
+diatribe's
+diatribes
+dice
+dicer
+dices
+dichotomies
+dichotomy
+dicing
+dickens
+dicky
+dictate
+dictated
+dictates
+dictating
+dictation
+dictations
+dictator
+dictator's
+dictators
+dictatorship
+dictatorships
+diction
+dictionaries
+dictionary
+dictionary's
+dictions
+dictum
+dictum's
+dictums
+did
+didn't
+die
+died
+dielectric
+dielectric's
+dielectrics
+dies
+diet
+dieter
+dieters
+dietitian
+dietitian's
+dietitians
+diets
+differ
+differed
+difference
+difference's
+differenced
+differences
+differencing
+different
+differential
+differential's
+differentially
+differentials
+differentiate
+differentiated
+differentiates
+differentiating
+differentiation
+differentiations
+differentiators
+differently
+differentness
+differer
+differers
+differing
+differs
+difficult
+difficulties
+difficultly
+difficulty
+difficulty's
+diffuse
+diffused
+diffusely
+diffuseness
+diffuser
+diffusers
+diffuses
+diffusing
+diffusion
+diffusions
+diffusive
+diffusively
+diffusiveness
+dig
+digest
+digested
+digester
+digestible
+digesting
+digestion
+digestions
+digestive
+digestively
+digestiveness
+digests
+digger
+digger's
+diggers
+digging
+diggings
+digit
+digit's
+digital
+digitally
+digits
+dignified
+dignify
+dignities
+dignity
+digress
+digressed
+digresses
+digressing
+digression
+digression's
+digressions
+digressive
+digressively
+digressiveness
+digs
+dike
+dike's
+diker
+dikes
+diking
+dilate
+dilated
+dilatedly
+dilatedness
+dilates
+dilating
+dilation
+dilative
+dilemma
+dilemma's
+dilemmas
+diligence
+diligences
+diligent
+diligently
+diligentness
+dilute
+diluted
+dilutely
+diluteness
+diluter
+dilutes
+diluting
+dilution
+dilutions
+dilutive
+dim
+dime
+dime's
+dimension
+dimensional
+dimensionality
+dimensionally
+dimensioned
+dimensioning
+dimensions
+dimer
+dimers
+dimes
+diminish
+diminished
+diminishes
+diminishing
+diminution
+diminutive
+diminutively
+diminutiveness
+dimly
+dimmed
+dimmer
+dimmer's
+dimmers
+dimmest
+dimming
+dimness
+dimple
+dimpled
+dimples
+dimpling
+dims
+din
+dine
+dined
+diner
+diners
+dines
+dingier
+dinginess
+dingy
+dining
+dinner
+dinner's
+dinners
+dint
+diode
+diode's
+diodes
+dioxide
+dioxides
+dip
+diphtheria
+diploma
+diploma's
+diplomacy
+diplomas
+diplomat
+diplomat's
+diplomatic
+diplomatics
+diplomats
+dipped
+dipper
+dipper's
+dippers
+dipping
+dippings
+dips
+dire
+direct
+directed
+directing
+direction
+direction's
+directional
+directionality
+directionally
+directions
+directive
+directive's
+directives
+directly
+directness
+director
+director's
+directories
+directors
+directory
+directory's
+directs
+direly
+direness
+direr
+direst
+dirge
+dirge's
+dirged
+dirges
+dirging
+dirt
+dirt's
+dirtied
+dirtier
+dirties
+dirtiest
+dirtily
+dirtiness
+dirts
+dirty
+dirtying
+disabilities
+disability
+disability's
+disable
+disabled
+disabler
+disablers
+disables
+disabling
+disabuse
+disadvantage
+disadvantage's
+disadvantaged
+disadvantagedness
+disadvantages
+disadvantaging
+disagree
+disagreeable
+disagreeableness
+disagreed
+disagreeing
+disagreement
+disagreement's
+disagreements
+disagrees
+disallow
+disallowed
+disallowing
+disallows
+disambiguate
+disambiguated
+disambiguates
+disambiguating
+disambiguation
+disambiguations
+disappear
+disappearance
+disappearance's
+disappearances
+disappeared
+disappearing
+disappears
+disappoint
+disappointed
+disappointedly
+disappointing
+disappointingly
+disappointment
+disappointment's
+disappointments
+disappoints
+disapproval
+disapprove
+disapproved
+disapprover
+disapproves
+disapproving
+disapprovingly
+disarm
+disarmament
+disarmed
+disarmer
+disarmers
+disarming
+disarmingly
+disarms
+disassemble
+disassembled
+disassembler
+disassembler's
+disassemblers
+disassembles
+disassembling
+disaster
+disaster's
+disasters
+disastrous
+disastrously
+disband
+disbanded
+disbanding
+disbands
+disbelieve
+disbelieved
+disbeliever
+disbelievers
+disbelieves
+disbelieving
+disburse
+disbursed
+disbursement
+disbursement's
+disbursements
+disburser
+disburses
+disbursing
+disc
+disc's
+discard
+discarded
+discarder
+discarding
+discards
+discern
+discerned
+discerner
+discernibility
+discernible
+discernibly
+discerning
+discerningly
+discernment
+discerns
+discharge
+discharged
+discharger
+discharges
+discharging
+disciple
+disciple's
+disciples
+disciplinary
+discipline
+disciplined
+discipliner
+disciplines
+disciplining
+disclaim
+disclaimed
+disclaimer
+disclaimers
+disclaiming
+disclaims
+disclose
+disclosed
+discloser
+discloses
+disclosing
+disclosure
+disclosure's
+disclosures
+discomfort
+discomforting
+discomfortingly
+disconcert
+disconcerted
+disconcerting
+disconcertingly
+disconcerts
+disconnect
+disconnected
+disconnectedly
+disconnectedness
+disconnecter
+disconnecting
+disconnection
+disconnections
+disconnects
+discontent
+discontented
+discontentedly
+discontinuance
+discontinue
+discontinued
+discontinues
+discontinuing
+discontinuities
+discontinuity
+discontinuity's
+discontinuous
+discontinuously
+discord
+discords
+discount
+discounted
+discounter
+discounting
+discounts
+discourage
+discouraged
+discouragement
+discourager
+discourages
+discouraging
+discouragingly
+discourse
+discourse's
+discoursed
+discourser
+discourses
+discoursing
+discover
+discovered
+discoverer
+discoverers
+discoveries
+discovering
+discovers
+discovery
+discovery's
+discredit
+discredited
+discrediting
+discredits
+discreet
+discreetly
+discreetness
+discrepancies
+discrepancy
+discrepancy's
+discrete
+discretely
+discreteness
+discretion
+discretions
+discriminate
+discriminated
+discriminates
+discriminating
+discriminatingly
+discrimination
+discriminations
+discriminative
+discriminatory
+discs
+discuss
+discussed
+discusser
+discusses
+discussing
+discussion
+discussion's
+discussions
+disdain
+disdaining
+disdains
+disease
+diseased
+diseases
+diseasing
+disenfranchise
+disenfranchised
+disenfranchisement
+disenfranchisement's
+disenfranchisements
+disenfranchiser
+disenfranchises
+disenfranchising
+disengage
+disengaged
+disengages
+disengaging
+disentangle
+disentangled
+disentangler
+disentangles
+disentangling
+disfigure
+disfigured
+disfigures
+disfiguring
+disgorge
+disgorger
+disgrace
+disgraced
+disgraceful
+disgracefully
+disgracefulness
+disgracer
+disgraces
+disgracing
+disgruntled
+disguise
+disguised
+disguisedly
+disguiser
+disguises
+disguising
+disgust
+disgusted
+disgustedly
+disgusting
+disgustingly
+disgusts
+dish
+dishearten
+disheartening
+dishearteningly
+dished
+dishes
+dishing
+dishonest
+dishonestly
+dishwasher
+dishwashers
+disillusion
+disillusioned
+disillusioning
+disillusionment
+disillusionment's
+disillusionments
+disinterested
+disinterestedly
+disinterestedness
+disjoint
+disjointed
+disjointedly
+disjointedness
+disjointly
+disjointness
+disjunct
+disjunction
+disjunctions
+disjunctive
+disjunctively
+disjuncts
+disk
+disk's
+disked
+disking
+disks
+dislike
+disliked
+disliker
+dislikes
+disliking
+dislocate
+dislocated
+dislocates
+dislocating
+dislocation
+dislocations
+dislodge
+dislodged
+dislodges
+dislodging
+dismal
+dismally
+dismalness
+dismay
+dismayed
+dismaying
+dismayingly
+dismays
+dismiss
+dismissal
+dismissal's
+dismissals
+dismissed
+dismisser
+dismissers
+dismisses
+dismissing
+dismissive
+dismount
+dismounted
+dismounting
+dismounts
+disobedience
+disobey
+disobeyed
+disobeyer
+disobeying
+disobeys
+disorder
+disordered
+disorderedly
+disorderedness
+disorderliness
+disorderly
+disorders
+disown
+disowned
+disowning
+disowns
+disparate
+disparately
+disparateness
+disparities
+disparity
+disparity's
+dispatch
+dispatched
+dispatcher
+dispatchers
+dispatches
+dispatching
+dispel
+dispelled
+dispelling
+dispels
+dispensation
+dispense
+dispensed
+dispenser
+dispensers
+dispenses
+dispensing
+disperse
+dispersed
+dispersedly
+disperser
+disperses
+dispersing
+dispersion
+dispersions
+dispersive
+dispersively
+dispersiveness
+displace
+displaced
+displacement
+displacement's
+displacements
+displacer
+displaces
+displacing
+display
+displayed
+displayer
+displaying
+displays
+displease
+displeased
+displeasedly
+displeases
+displeasing
+displeasure
+disposable
+disposal
+disposal's
+disposals
+dispose
+disposed
+disposer
+disposes
+disposing
+disposition
+disposition's
+dispositions
+disprove
+disproved
+disproves
+disproving
+dispute
+disputed
+disputer
+disputers
+disputes
+disputing
+disqualification
+disqualified
+disqualifies
+disqualify
+disqualifying
+disquiet
+disquieting
+disquietingly
+disquietly
+disregard
+disregarded
+disregarding
+disregards
+disrupt
+disrupted
+disrupter
+disrupting
+disruption
+disruption's
+disruptions
+disruptive
+disruptively
+disruptiveness
+disrupts
+dissatisfaction
+dissatisfaction's
+dissatisfactions
+dissatisfied
+disseminate
+disseminated
+disseminates
+disseminating
+dissemination
+dissension
+dissension's
+dissensions
+dissent
+dissented
+dissenter
+dissenters
+dissenting
+dissents
+dissertation
+dissertation's
+dissertations
+disservice
+dissident
+dissident's
+dissidents
+dissimilar
+dissimilarities
+dissimilarity
+dissimilarity's
+dissimilarly
+dissipate
+dissipated
+dissipatedly
+dissipatedness
+dissipater
+dissipates
+dissipating
+dissipation
+dissipations
+dissipative
+dissociate
+dissociated
+dissociates
+dissociating
+dissociation
+dissociative
+dissolution
+dissolution's
+dissolutions
+dissolve
+dissolved
+dissolver
+dissolves
+dissolving
+dissonance
+dissonance's
+dissonances
+distal
+distally
+distance
+distanced
+distances
+distancing
+distant
+distantly
+distantness
+distaste
+distasteful
+distastefully
+distastefulness
+distastes
+distemper
+distill
+distillation
+distilled
+distiller
+distillers
+distilling
+distills
+distinct
+distinction
+distinction's
+distinctions
+distinctive
+distinctively
+distinctiveness
+distinctly
+distinctness
+distinguish
+distinguishable
+distinguished
+distinguisher
+distinguishes
+distinguishing
+distort
+distorted
+distorter
+distorting
+distortion
+distortion's
+distortions
+distorts
+distract
+distracted
+distractedly
+distracting
+distractingly
+distraction
+distraction's
+distractions
+distractive
+distracts
+distraught
+distraughtly
+distress
+distressed
+distresses
+distressing
+distressingly
+distribute
+distributed
+distributer
+distributes
+distributing
+distribution
+distribution's
+distributional
+distributions
+distributive
+distributively
+distributiveness
+distributivity
+distributor
+distributor's
+distributors
+district
+district's
+districted
+districting
+districts
+distrust
+distrusted
+distrusts
+disturb
+disturbance
+disturbance's
+disturbances
+disturbed
+disturber
+disturbing
+disturbingly
+disturbs
+ditch
+ditch's
+ditched
+ditcher
+ditches
+ditching
+divan
+divan's
+divans
+dive
+dived
+diver
+diverge
+diverged
+divergence
+divergence's
+divergences
+divergent
+divergently
+diverges
+diverging
+divers
+diverse
+diversely
+diverseness
+diversification
+diversified
+diversifier
+diversifies
+diversify
+diversifying
+diversion
+diversions
+diversities
+diversity
+divert
+diverted
+diverting
+diverts
+dives
+divest
+divested
+divesting
+divests
+divide
+divided
+dividend
+dividend's
+dividends
+divider
+dividers
+divides
+dividing
+divine
+divined
+divinely
+diviner
+divines
+diving
+divining
+divinities
+divinity
+divinity's
+division
+division's
+divisions
+divisor
+divisor's
+divisors
+divorce
+divorced
+divorces
+divorcing
+divulge
+divulged
+divulges
+divulging
+dizzied
+dizzier
+dizziness
+dizzy
+dizzying
+dizzyingly
+do
+dock
+docked
+docker
+docking
+docks
+doctor
+doctor's
+doctoral
+doctorate
+doctorate's
+doctorates
+doctored
+doctoring
+doctors
+doctrine
+doctrine's
+doctrines
+document
+document's
+documentaries
+documentary
+documentary's
+documentation
+documentation's
+documentations
+documented
+documenter
+documenters
+documenting
+documents
+dodge
+dodged
+dodger
+dodgers
+dodges
+dodging
+doer
+doers
+does
+doesn't
+dog
+dog's
+dogged
+doggedly
+doggedness
+dogging
+dogma
+dogma's
+dogmas
+dogmatism
+dogs
+doing
+doings
+dole
+doled
+doleful
+dolefully
+dolefulness
+doles
+doling
+doll
+doll's
+dollar
+dollars
+dollied
+dollies
+dolls
+dolly
+dolly's
+dollying
+dolphin
+dolphin's
+dolphins
+domain
+domain's
+domains
+dome
+domed
+domes
+domestic
+domestically
+domesticate
+domesticated
+domesticates
+domesticating
+domestication
+dominance
+dominant
+dominantly
+dominate
+dominated
+dominates
+dominating
+domination
+dominations
+dominative
+doming
+dominion
+dominions
+don
+don't
+donate
+donated
+donates
+donating
+donation
+donations
+donative
+done
+donkey
+donkey's
+donkeys
+dons
+doom
+doomed
+dooming
+dooms
+door
+door's
+doors
+doorstep
+doorstep's
+doorsteps
+doorway
+doorway's
+doorways
+dope
+doped
+doper
+dopers
+dopes
+doping
+dormant
+dormitories
+dormitory
+dormitory's
+dorsal
+dorsally
+dose
+dosed
+doses
+dosing
+dot
+dot's
+dote
+doted
+doter
+dotes
+doth
+doting
+dotingly
+dots
+dotted
+dotting
+double
+doubled
+doubleness
+doubler
+doublers
+doubles
+doublet
+doublet's
+doublets
+doubling
+doubly
+doubt
+doubtable
+doubted
+doubter
+doubters
+doubtful
+doubtfully
+doubtfulness
+doubting
+doubtingly
+doubtless
+doubtlessly
+doubtlessness
+doubts
+dough
+doughnut
+doughnut's
+doughnuts
+douse
+doused
+douser
+douses
+dousing
+dove
+dover
+doves
+down
+downcast
+downed
+downer
+downers
+downfall
+downfallen
+downier
+downing
+downplay
+downplayed
+downplaying
+downplays
+downright
+downrightly
+downrightness
+downs
+downstairs
+downstream
+downtown
+downtowner
+downtowns
+downward
+downwardly
+downwardness
+downwards
+downy
+doze
+dozed
+dozen
+dozens
+dozenth
+dozer
+dozes
+dozing
+drab
+drably
+drabness
+drabs
+draft
+draft's
+drafted
+drafter
+drafters
+drafting
+drafts
+draftsmen
+drag
+dragged
+dragging
+draggingly
+dragon
+dragon's
+dragons
+dragoon
+dragooned
+dragoons
+drags
+drain
+drainage
+drainages
+drained
+drainer
+drainers
+draining
+drains
+drake
+drama
+drama's
+dramas
+dramatic
+dramatically
+dramatics
+dramatist
+dramatist's
+dramatists
+drank
+drape
+draped
+draper
+draperies
+drapers
+drapery
+drapery's
+drapes
+draping
+drastic
+drastically
+draw
+drawback
+drawback's
+drawbacks
+drawbridge
+drawbridge's
+drawbridges
+drawer
+drawers
+drawing
+drawings
+drawl
+drawled
+drawler
+drawling
+drawlingly
+drawls
+drawly
+drawn
+drawnly
+drawnness
+draws
+dread
+dreaded
+dreadful
+dreadfully
+dreadfulness
+dreading
+dreads
+dream
+dreamed
+dreamer
+dreamers
+dreamier
+dreamily
+dreaminess
+dreaming
+dreamingly
+dreams
+dreamy
+drearier
+dreariness
+dreary
+dredge
+dredge's
+dredged
+dredger
+dredgers
+dredges
+dredging
+dregs
+drench
+drenched
+drencher
+drenches
+drenching
+dress
+dressed
+dresser
+dressers
+dresses
+dressing
+dressings
+dressmaker
+dressmaker's
+dressmakers
+drew
+dried
+drier
+drier's
+driers
+dries
+driest
+drift
+drifted
+drifter
+drifters
+drifting
+driftingly
+drifts
+drill
+drilled
+driller
+drilling
+drills
+drily
+drink
+drinkable
+drinker
+drinkers
+drinking
+drinks
+drip
+drip's
+drips
+drive
+driven
+drivenness
+driver
+driver's
+drivers
+drives
+driveway
+driveway's
+driveways
+driving
+drone
+drone's
+droner
+drones
+droning
+droningly
+drool
+drooled
+drooler
+drooling
+drools
+droop
+drooped
+drooping
+droopingly
+droops
+drop
+drop's
+dropped
+dropper
+dropper's
+droppers
+dropping
+dropping's
+droppings
+drops
+drought
+drought's
+droughts
+drove
+drover
+drovers
+droves
+drown
+drowned
+drowner
+drowning
+drownings
+drowns
+drowsier
+drowsiest
+drowsiness
+drowsy
+drudgery
+drug
+drug's
+druggist
+druggist's
+druggists
+drugs
+drum
+drum's
+drummed
+drummer
+drummer's
+drummers
+drumming
+drums
+drunk
+drunk's
+drunkard
+drunkard's
+drunkards
+drunken
+drunkenly
+drunkenness
+drunker
+drunkly
+drunks
+dry
+drying
+dryly
+dual
+dualities
+duality
+duality's
+dually
+duals
+dub
+dubious
+dubiously
+dubiousness
+dubs
+duchess
+duchess's
+duchesses
+duchies
+duchy
+duck
+ducked
+ducker
+ducking
+ducks
+dude
+due
+duel
+duels
+dueness
+dues
+dug
+duke
+duke's
+dukes
+dull
+dulled
+duller
+dullest
+dulling
+dullness
+dulls
+dully
+duly
+dumb
+dumbbell
+dumbbell's
+dumbbells
+dumber
+dumbest
+dumbly
+dumbness
+dummied
+dummies
+dummy
+dummy's
+dummying
+dump
+dumped
+dumper
+dumpers
+dumping
+dumps
+dunce
+dunce's
+dunces
+dune
+dune's
+dunes
+dungeon
+dungeon's
+dungeons
+duplicate
+duplicated
+duplicates
+duplicating
+duplication
+duplications
+duplicative
+duplicator
+duplicator's
+duplicators
+durabilities
+durability
+durable
+durableness
+durables
+durably
+duration
+duration's
+durations
+during
+dusk
+duskier
+duskiness
+dusky
+dust
+dusted
+duster
+dusters
+dustier
+dustiest
+dustiness
+dusting
+dusts
+dusty
+duties
+dutiful
+dutifully
+dutifulness
+duty
+duty's
+dwarf
+dwarfed
+dwarfness
+dwarfs
+dwell
+dwelled
+dweller
+dwellers
+dwelling
+dwellings
+dwells
+dwindle
+dwindled
+dwindles
+dwindling
+dye
+dyed
+dyeing
+dyer
+dyers
+dyes
+dying
+dynamic
+dynamically
+dynamics
+dynamite
+dynamited
+dynamiter
+dynamites
+dynamiting
+dynasties
+dynasty
+dynasty's
+each
+eager
+eagerly
+eagerness
+eagle
+eagle's
+eagles
+ear
+eared
+earing
+earl
+earl's
+earlier
+earliest
+earliness
+earls
+early
+earmark
+earmarked
+earmarking
+earmarkings
+earmarks
+earn
+earned
+earner
+earner's
+earners
+earnest
+earnestly
+earnestness
+earning
+earnings
+earns
+earring
+earring's
+earrings
+ears
+earshot
+earth
+earth's
+earthed
+earthen
+earthenware
+earthliness
+earthly
+earthquake
+earthquake's
+earthquakes
+earths
+earthworm
+earthworm's
+earthworms
+ease
+eased
+easement
+easement's
+easements
+easer
+eases
+easier
+easiest
+easily
+easiness
+easing
+east
+easter
+easterly
+eastern
+easterner
+easterners
+easting
+easts
+eastward
+eastwards
+easy
+eat
+eaten
+eater
+eaters
+eating
+eatings
+eats
+eaves
+eavesdrop
+eavesdropped
+eavesdropper
+eavesdropper's
+eavesdroppers
+eavesdropping
+eavesdrops
+ebb
+ebbed
+ebbing
+ebbs
+ebony
+eccentric
+eccentric's
+eccentricities
+eccentricity
+eccentrics
+ecclesiastical
+ecclesiastically
+echo
+echoed
+echoes
+echoing
+echos
+eclipse
+eclipsed
+eclipses
+eclipsing
+ecology
+economic
+economical
+economically
+economics
+economies
+economist
+economist's
+economists
+economy
+economy's
+ecstasy
+eddied
+eddies
+eddy
+eddy's
+eddying
+edge
+edged
+edger
+edges
+edging
+edible
+edibleness
+edibles
+edict
+edict's
+edicts
+edifice
+edifice's
+edifices
+edit
+edited
+editing
+edition
+edition's
+editions
+editor
+editor's
+editorial
+editorially
+editorials
+editors
+edits
+educate
+educated
+educatedly
+educatedness
+educates
+educating
+education
+education's
+educational
+educationally
+educations
+educative
+educator
+educator's
+educators
+eel
+eel's
+eels
+eerie
+eerier
+effect
+effected
+effecting
+effective
+effectively
+effectiveness
+effectives
+effector
+effector's
+effectors
+effects
+effectually
+effeminate
+efficacy
+efficiencies
+efficiency
+efficient
+efficiently
+effigy
+effort
+effort's
+effortless
+effortlessly
+effortlessness
+efforts
+egg
+egged
+egger
+egging
+eggs
+ego
+egos
+eigenvalue
+eigenvalue's
+eigenvalues
+eight
+eighteen
+eighteens
+eighteenth
+eighth
+eighth's
+eighthes
+eighties
+eightieth
+eights
+eighty
+either
+ejaculate
+ejaculated
+ejaculates
+ejaculating
+ejaculation
+ejaculations
+eject
+ejected
+ejecting
+ejective
+ejects
+eke
+eked
+ekes
+eking
+el
+elaborate
+elaborated
+elaborately
+elaborateness
+elaborates
+elaborating
+elaboration
+elaborations
+elaborative
+elaborators
+elapse
+elapsed
+elapses
+elapsing
+elastic
+elastically
+elasticities
+elasticity
+elastics
+elate
+elated
+elatedly
+elatedness
+elater
+elates
+elating
+elation
+elbow
+elbowed
+elbowing
+elbows
+elder
+elderliness
+elderly
+elders
+eldest
+elect
+elected
+electing
+election
+election's
+elections
+elective
+electively
+electiveness
+electives
+elector
+elector's
+electoral
+electorally
+electors
+electric
+electrical
+electrically
+electricalness
+electricities
+electricity
+electrics
+electrification
+electrified
+electrify
+electrifying
+electrocute
+electrocuted
+electrocutes
+electrocuting
+electrocution
+electrocutions
+electrode
+electrode's
+electrodes
+electrolyte
+electrolyte's
+electrolytes
+electrolytic
+electron
+electron's
+electronic
+electronically
+electronics
+electrons
+elects
+elegance
+elegances
+elegant
+elegantly
+element
+element's
+elemental
+elementally
+elementals
+elementariness
+elementary
+elements
+elephant
+elephant's
+elephants
+elevate
+elevated
+elevates
+elevating
+elevation
+elevations
+elevator
+elevator's
+elevators
+eleven
+elevens
+elevenses
+eleventh
+elf
+elicit
+elicited
+eliciting
+elicits
+eligibilities
+eligibility
+eligible
+eligibles
+eliminate
+eliminated
+eliminately
+eliminates
+eliminating
+elimination
+eliminations
+eliminative
+eliminator
+eliminators
+elk
+elk's
+elks
+ellipse
+ellipse's
+ellipses
+ellipsis
+ellipsoid
+ellipsoid's
+ellipsoidal
+ellipsoids
+elliptic
+elliptical
+elliptically
+elm
+elmer
+elms
+elongate
+elongated
+elongates
+elongating
+elongation
+eloquence
+eloquent
+eloquently
+els
+else
+else's
+elsewhere
+elucidate
+elucidated
+elucidates
+elucidating
+elucidation
+elucidative
+elude
+eluded
+eludes
+eluding
+elusive
+elusively
+elusiveness
+elves
+emaciated
+emacs
+emacs's
+email
+email's
+emanating
+emancipation
+embark
+embarked
+embarking
+embarks
+embarrass
+embarrassed
+embarrassedly
+embarrasses
+embarrassing
+embarrassingly
+embarrassment
+embassies
+embassy
+embassy's
+embed
+embedded
+embedding
+embeds
+embellish
+embellished
+embellisher
+embellishes
+embellishing
+embellishment
+embellishment's
+embellishments
+ember
+embers
+embezzle
+embezzled
+embezzler
+embezzler's
+embezzlers
+embezzles
+embezzling
+emblem
+emblems
+embodied
+embodier
+embodies
+embodiment
+embodiment's
+embodiments
+embody
+embodying
+embrace
+embraced
+embracer
+embraces
+embracing
+embracingly
+embracive
+embroider
+embroidered
+embroiderer
+embroideries
+embroiders
+embroidery
+embryo
+embryo's
+embryology
+embryos
+emerald
+emerald's
+emeralds
+emerge
+emerged
+emergence
+emergencies
+emergency
+emergency's
+emergent
+emerges
+emerging
+emeries
+emery
+emigrant
+emigrant's
+emigrants
+emigrate
+emigrated
+emigrates
+emigrating
+emigration
+eminence
+eminent
+eminently
+emit
+emits
+emitted
+emotion
+emotion's
+emotional
+emotionally
+emotions
+empathy
+emperor
+emperor's
+emperors
+emphases
+emphasis
+emphatic
+emphatically
+empire
+empire's
+empires
+empirical
+empirically
+empiricist
+empiricist's
+empiricists
+employ
+employable
+employed
+employee
+employee's
+employees
+employer
+employer's
+employers
+employing
+employment
+employment's
+employments
+employs
+empower
+empowered
+empowering
+empowers
+empress
+emptied
+emptier
+empties
+emptiest
+emptily
+emptiness
+empty
+emptying
+emulate
+emulated
+emulates
+emulating
+emulation
+emulations
+emulative
+emulatively
+emulator
+emulator's
+emulators
+enable
+enabled
+enabler
+enablers
+enables
+enabling
+enact
+enacted
+enacting
+enactment
+enactments
+enacts
+enamel
+enamels
+encamp
+encamped
+encamping
+encamps
+encapsulate
+encapsulated
+encapsulates
+encapsulating
+encapsulation
+enchant
+enchanted
+enchanter
+enchanting
+enchantingly
+enchantment
+enchants
+encipher
+enciphered
+encipherer
+enciphering
+enciphers
+encircle
+encircled
+encircles
+encircling
+enclose
+enclosed
+encloses
+enclosing
+enclosure
+enclosure's
+enclosures
+encode
+encoded
+encoder
+encoders
+encodes
+encoding
+encodings
+encompass
+encompassed
+encompasses
+encompassing
+encounter
+encountered
+encountering
+encounters
+encourage
+encouraged
+encouragement
+encouragements
+encourager
+encourages
+encouraging
+encouragingly
+encrypt
+encrypted
+encrypting
+encryption
+encryption's
+encryptions
+encrypts
+encumber
+encumbered
+encumbering
+encumbers
+encyclopedia
+encyclopedia's
+encyclopedias
+encyclopedic
+end
+endanger
+endangered
+endangering
+endangers
+endear
+endeared
+endearing
+endearingly
+endears
+ended
+endemic
+ender
+enders
+ending
+endings
+endive
+endless
+endlessly
+endlessness
+endorse
+endorsed
+endorsement
+endorsement's
+endorsements
+endorser
+endorses
+endorsing
+endow
+endowed
+endowing
+endowment
+endowment's
+endowments
+endows
+ends
+endurable
+endurably
+endurance
+endure
+endured
+endures
+enduring
+enduringly
+enduringness
+enema
+enema's
+enemas
+enemies
+enemy
+enemy's
+energetic
+energetics
+energies
+energy
+enforce
+enforced
+enforcedly
+enforcement
+enforcer
+enforcers
+enforces
+enforcing
+enfranchise
+enfranchised
+enfranchisement
+enfranchiser
+enfranchises
+enfranchising
+engage
+engaged
+engagement
+engagement's
+engagements
+engages
+engaging
+engagingly
+engender
+engendered
+engendering
+engenders
+engine
+engine's
+engined
+engineer
+engineer's
+engineered
+engineering
+engineeringly
+engineerings
+engineers
+engines
+engining
+england
+englander
+englanders
+engrave
+engraved
+engraver
+engravers
+engraves
+engraving
+engravings
+engross
+engrossed
+engrossedly
+engrosser
+engrossing
+engrossingly
+enhance
+enhanced
+enhancement
+enhancement's
+enhancements
+enhances
+enhancing
+enigmatic
+enjoin
+enjoined
+enjoining
+enjoins
+enjoy
+enjoyable
+enjoyableness
+enjoyably
+enjoyed
+enjoying
+enjoyment
+enjoys
+enlarge
+enlarged
+enlargement
+enlargement's
+enlargements
+enlarger
+enlargers
+enlarges
+enlarging
+enlighten
+enlightened
+enlightening
+enlightenment
+enlightens
+enlist
+enlisted
+enlister
+enlisting
+enlistment
+enlistments
+enlists
+enliven
+enlivened
+enlivening
+enlivens
+enmities
+enmity
+ennoble
+ennobled
+ennobler
+ennobles
+ennobling
+ennui
+enormities
+enormity
+enormous
+enormously
+enormousness
+enough
+enqueue
+enqueued
+enqueues
+enquire
+enquired
+enquirer
+enquirers
+enquires
+enquiring
+enrage
+enraged
+enrages
+enraging
+enrich
+enriched
+enricher
+enriches
+enriching
+enrolled
+enrolling
+ensemble
+ensemble's
+ensembles
+ensign
+ensign's
+ensigns
+enslave
+enslaved
+enslaver
+enslavers
+enslaves
+enslaving
+ensnare
+ensnared
+ensnares
+ensnaring
+ensue
+ensued
+ensues
+ensuing
+ensure
+ensured
+ensurer
+ensurers
+ensures
+ensuring
+entail
+entailed
+entailer
+entailing
+entails
+entangle
+entangled
+entangler
+entangles
+entangling
+enter
+entered
+enterer
+entering
+enterprise
+enterpriser
+enterprises
+enterprising
+enterprisingly
+enters
+entertain
+entertained
+entertainer
+entertainers
+entertaining
+entertainingly
+entertainment
+entertainment's
+entertainments
+entertains
+enthusiasm
+enthusiasms
+enthusiast
+enthusiast's
+enthusiastic
+enthusiastically
+enthusiasts
+entice
+enticed
+enticer
+enticers
+entices
+enticing
+entire
+entirely
+entireties
+entirety
+entities
+entitle
+entitled
+entitles
+entitling
+entity
+entity's
+entrance
+entranced
+entrances
+entrancing
+entreat
+entreated
+entreaties
+entreating
+entreatingly
+entreats
+entreaty
+entrench
+entrenched
+entrenches
+entrenching
+entrepreneur
+entrepreneur's
+entrepreneurs
+entries
+entropies
+entropy
+entrust
+entrusted
+entrusting
+entrusts
+entry
+entry's
+enumerable
+enumerate
+enumerated
+enumerates
+enumerating
+enumeration
+enumerations
+enumerative
+enumerator
+enumerator's
+enumerators
+enunciation
+envelop
+envelope
+enveloped
+enveloper
+envelopes
+enveloping
+envelops
+enviably
+envied
+envier
+envies
+envious
+enviously
+enviousness
+environ
+environed
+environing
+environment
+environment's
+environmental
+environmentally
+environments
+environs
+envisage
+envisaged
+envisages
+envisaging
+envision
+envisioned
+envisioning
+envisions
+envoy
+envoy's
+envoys
+envy
+envying
+envyingly
+epaulet
+epaulet's
+epaulets
+ephemeral
+ephemerally
+ephemerals
+epic
+epic's
+epics
+epidemic
+epidemic's
+epidemics
+episcopal
+episcopally
+episode
+episode's
+episodes
+episodic
+epistemological
+epistemologically
+epistemology
+epistle
+epistle's
+epistler
+epistles
+epitaph
+epitaphed
+epitaphing
+epitaphs
+epitaxial
+epitaxially
+epithet
+epithet's
+epithets
+epoch
+epochs
+epsilon
+epsilons
+equal
+equalities
+equality
+equality's
+equally
+equals
+equate
+equated
+equates
+equating
+equation
+equations
+equator
+equator's
+equatorial
+equators
+equilibrium
+equilibriums
+equip
+equipment
+equipments
+equipped
+equipping
+equips
+equitable
+equitableness
+equitably
+equities
+equity
+equivalence
+equivalenced
+equivalences
+equivalencing
+equivalent
+equivalently
+equivalents
+era
+era's
+eradicate
+eradicated
+eradicates
+eradicating
+eradication
+eradicative
+eras
+erasable
+erase
+erased
+eraser
+erasers
+erases
+erasing
+erasion
+erasure
+ere
+erect
+erected
+erecting
+erection
+erection's
+erections
+erectly
+erectness
+erector
+erector's
+erectors
+erects
+ergo
+ermine
+ermine's
+ermined
+ermines
+err
+errand
+errands
+erratic
+erred
+erring
+erringly
+erroneous
+erroneously
+erroneousness
+error
+error's
+errors
+errs
+eruption
+eruptions
+escalate
+escalated
+escalates
+escalating
+escalation
+escapable
+escapade
+escapade's
+escapades
+escape
+escaped
+escapee
+escapee's
+escapees
+escaper
+escapes
+escaping
+eschew
+eschewed
+eschewing
+eschews
+escort
+escorted
+escorting
+escorts
+esoteric
+especial
+especially
+espied
+espies
+espionage
+espouse
+espoused
+espouser
+espouses
+espousing
+esprit
+esprits
+espy
+espying
+esquire
+esquires
+essay
+essayed
+essayer
+essays
+essence
+essence's
+essences
+essential
+essentially
+essentialness
+essentials
+establish
+established
+establisher
+establishes
+establishing
+establishment
+establishment's
+establishments
+estate
+estate's
+estates
+esteem
+esteemed
+esteeming
+esteems
+estimate
+estimated
+estimates
+estimating
+estimation
+estimations
+estimative
+etc
+eternal
+eternally
+eternalness
+eternities
+eternity
+ethereal
+ethereally
+etherealness
+ethic
+ethical
+ethically
+ethicalness
+ethics
+ethnic
+etiquette
+eunuch
+eunuchs
+euphemism
+euphemism's
+euphemisms
+euphoria
+evacuate
+evacuated
+evacuates
+evacuating
+evacuation
+evacuations
+evacuative
+evade
+evaded
+evader
+evades
+evading
+evaluate
+evaluated
+evaluates
+evaluating
+evaluation
+evaluations
+evaluative
+evaluator
+evaluator's
+evaluators
+evaporate
+evaporated
+evaporates
+evaporating
+evaporation
+evaporations
+evaporative
+evaporatively
+eve
+even
+evened
+evener
+evenhanded
+evenhandedly
+evenhandedness
+evening
+evening's
+evenings
+evenly
+evenness
+evens
+event
+event's
+eventful
+eventfully
+eventfulness
+events
+eventual
+eventualities
+eventuality
+eventually
+ever
+everest
+evergreen
+everlasting
+everlastingly
+everlastingness
+evermore
+every
+everybody
+everybody's
+everyday
+everydayness
+everyone
+everyone's
+everyones
+everything
+everywhere
+eves
+evict
+evicted
+evicting
+eviction
+eviction's
+evictions
+evicts
+evidence
+evidenced
+evidences
+evidencing
+evident
+evidently
+evil
+evilly
+evilness
+evils
+evince
+evinced
+evinces
+evincing
+evoke
+evoked
+evokes
+evoking
+evolute
+evolute's
+evolutes
+evolution
+evolution's
+evolutionary
+evolutions
+evolve
+evolved
+evolves
+evolving
+ewe
+ewe's
+ewer
+ewes
+exacerbate
+exacerbated
+exacerbates
+exacerbating
+exacerbation
+exacerbations
+exact
+exacted
+exacter
+exacting
+exactingly
+exactingness
+exaction
+exaction's
+exactions
+exactitude
+exactly
+exactness
+exacts
+exaggerate
+exaggerated
+exaggeratedly
+exaggeratedness
+exaggerates
+exaggerating
+exaggeration
+exaggerations
+exaggerative
+exaggeratively
+exalt
+exalted
+exaltedly
+exalter
+exalters
+exalting
+exalts
+exam
+exam's
+examen
+examination
+examination's
+examinations
+examine
+examined
+examiner
+examiners
+examines
+examining
+example
+example's
+exampled
+examples
+exampling
+exams
+exasperate
+exasperated
+exasperatedly
+exasperates
+exasperating
+exasperatingly
+exasperation
+exasperations
+excavate
+excavated
+excavates
+excavating
+excavation
+excavations
+exceed
+exceeded
+exceeder
+exceeding
+exceedingly
+exceeds
+excel
+excelled
+excellence
+excellences
+excellency
+excellent
+excellently
+excelling
+excels
+except
+excepted
+excepting
+exception
+exception's
+exceptional
+exceptionally
+exceptionalness
+exceptions
+exceptive
+excepts
+excerpt
+excerpted
+excerpter
+excerpts
+excess
+excesses
+excessive
+excessively
+excessiveness
+exchange
+exchangeable
+exchanged
+exchanger
+exchangers
+exchanges
+exchanging
+exchequer
+exchequer's
+exchequers
+excise
+excised
+excises
+excising
+excision
+excisions
+excitable
+excitableness
+excitation
+excitation's
+excitations
+excite
+excited
+excitedly
+excitement
+exciter
+excites
+exciting
+excitingly
+exclaim
+exclaimed
+exclaimer
+exclaimers
+exclaiming
+exclaims
+exclamation
+exclamation's
+exclamations
+exclude
+excluded
+excluder
+excludes
+excluding
+exclusion
+exclusioner
+exclusioners
+exclusions
+exclusive
+exclusively
+exclusiveness
+exclusivity
+excommunicate
+excommunicated
+excommunicates
+excommunicating
+excommunication
+excommunicative
+excrete
+excreted
+excreter
+excretes
+excreting
+excretion
+excretions
+excruciatingly
+excursion
+excursion's
+excursions
+excusable
+excusableness
+excusably
+excuse
+excused
+excuser
+excuses
+excusing
+executable
+executable's
+executables
+execute
+executed
+executer
+executers
+executes
+executing
+execution
+executional
+executioner
+executions
+executive
+executive's
+executives
+executor
+executor's
+executors
+exemplar
+exemplariness
+exemplars
+exemplary
+exemplification
+exemplified
+exemplifier
+exemplifiers
+exemplifies
+exemplify
+exemplifying
+exempt
+exempted
+exempting
+exempts
+exercise
+exercised
+exerciser
+exercisers
+exercises
+exercising
+exert
+exerted
+exerting
+exertion
+exertion's
+exertions
+exerts
+exhale
+exhaled
+exhales
+exhaling
+exhaust
+exhausted
+exhaustedly
+exhauster
+exhaustible
+exhausting
+exhaustingly
+exhaustion
+exhaustive
+exhaustively
+exhaustiveness
+exhausts
+exhibit
+exhibited
+exhibiting
+exhibition
+exhibition's
+exhibitioner
+exhibitions
+exhibitive
+exhibitor
+exhibitor's
+exhibitors
+exhibits
+exhortation
+exhortation's
+exhortations
+exigencies
+exigency
+exile
+exiled
+exiles
+exiling
+exist
+existed
+existence
+existences
+existent
+existential
+existentialism
+existentialist
+existentialist's
+existentialists
+existentially
+existing
+exists
+exit
+exited
+exiting
+exits
+exorbitant
+exorbitantly
+exoskeletons
+exotic
+exoticness
+expand
+expandable
+expanded
+expander
+expander's
+expanders
+expanding
+expands
+expanse
+expansed
+expanses
+expansing
+expansion
+expansionism
+expansions
+expansive
+expansively
+expansiveness
+expect
+expectancies
+expectancy
+expectant
+expectantly
+expectation
+expectation's
+expectations
+expected
+expectedly
+expectedness
+expecting
+expectingly
+expects
+expedient
+expediently
+expedite
+expedited
+expediter
+expedites
+expediting
+expedition
+expedition's
+expeditions
+expeditious
+expeditiously
+expeditiousness
+expel
+expelled
+expelling
+expels
+expend
+expendable
+expended
+expender
+expending
+expenditure
+expenditure's
+expenditures
+expends
+expense
+expensed
+expenses
+expensing
+expensive
+expensively
+expensiveness
+experience
+experienced
+experiences
+experiencing
+experiment
+experimental
+experimentally
+experimentation
+experimentation's
+experimentations
+experimented
+experimenter
+experimenters
+experimenting
+experiments
+expert
+expertise
+expertly
+expertness
+experts
+expiration
+expiration's
+expirations
+expire
+expired
+expires
+expiring
+explain
+explainable
+explained
+explainer
+explainers
+explaining
+explains
+explanation
+explanation's
+explanations
+explanatory
+explicit
+explicitly
+explicitness
+explode
+exploded
+exploder
+explodes
+exploding
+exploit
+exploitable
+exploitation
+exploitation's
+exploitations
+exploited
+exploiter
+exploiters
+exploiting
+exploitive
+exploits
+exploration
+exploration's
+explorations
+exploratory
+explore
+explored
+explorer
+explorers
+explores
+exploring
+explosion
+explosion's
+explosions
+explosive
+explosively
+explosiveness
+explosives
+exponent
+exponent's
+exponential
+exponentially
+exponentials
+exponentiate
+exponentiated
+exponentiates
+exponentiating
+exponentiation
+exponentiation's
+exponentiations
+exponents
+export
+exported
+exporter
+exporters
+exporting
+exports
+expose
+exposed
+exposer
+exposers
+exposes
+exposing
+exposition
+exposition's
+expositions
+expository
+exposure
+exposure's
+exposures
+expound
+expounded
+expounder
+expounding
+expounds
+express
+expressed
+expresser
+expresses
+expressibility
+expressible
+expressibly
+expressing
+expression
+expression's
+expressions
+expressive
+expressively
+expressiveness
+expressly
+expropriate
+expropriated
+expropriates
+expropriating
+expropriation
+expropriations
+expulsion
+expunge
+expunged
+expunger
+expunges
+expunging
+exquisite
+exquisitely
+exquisiteness
+extant
+extend
+extended
+extendedly
+extendedness
+extender
+extendible
+extendibles
+extending
+extends
+extensibility
+extensible
+extension
+extension's
+extensions
+extensive
+extensively
+extensiveness
+extent
+extent's
+extents
+extenuate
+extenuated
+extenuating
+extenuation
+exterior
+exterior's
+exteriorly
+exteriors
+exterminate
+exterminated
+exterminates
+exterminating
+extermination
+exterminations
+external
+externally
+externals
+extinct
+extinction
+extinctive
+extinguish
+extinguished
+extinguisher
+extinguishers
+extinguishes
+extinguishing
+extol
+extols
+extortion
+extortioner
+extortionist
+extortionist's
+extortionists
+extra
+extract
+extracted
+extracting
+extraction
+extraction's
+extractions
+extractive
+extractively
+extractor
+extractor's
+extractors
+extracts
+extracurricular
+extraneous
+extraneously
+extraneousness
+extraordinarily
+extraordinariness
+extraordinary
+extrapolate
+extrapolated
+extrapolates
+extrapolating
+extrapolation
+extrapolations
+extrapolative
+extras
+extravagance
+extravagant
+extravagantly
+extremal
+extreme
+extremed
+extremely
+extremeness
+extremer
+extremes
+extremest
+extremist
+extremist's
+extremists
+extremities
+extremity
+extremity's
+extrinsic
+exuberance
+exult
+exultation
+exulted
+exulting
+exultingly
+exults
+eye
+eyeball
+eyeballs
+eyebrow
+eyebrow's
+eyebrows
+eyed
+eyedness
+eyeglass
+eyeglasses
+eyeing
+eyelid
+eyelid's
+eyelids
+eyepiece
+eyepiece's
+eyepieces
+eyer
+eyers
+eyes
+eyesight
+eyewitness
+eyewitness's
+eyewitnesses
+eying
+fable
+fabled
+fabler
+fables
+fabling
+fabric
+fabric's
+fabricate
+fabricated
+fabricates
+fabricating
+fabrication
+fabrications
+fabrics
+fabulous
+fabulously
+fabulousness
+facade
+facaded
+facades
+facading
+face
+faced
+faceless
+facelessness
+facer
+faces
+facet
+faceted
+faceting
+facets
+facial
+facially
+facile
+facilely
+facileness
+facilitate
+facilitated
+facilitates
+facilitating
+facilitation
+facilitative
+facilities
+facility
+facility's
+facing
+facings
+facsimile
+facsimile's
+facsimiled
+facsimiles
+facsimiling
+fact
+fact's
+faction
+faction's
+factions
+factor
+factored
+factorial
+factories
+factoring
+factorings
+factors
+factory
+factory's
+facts
+factual
+factually
+factualness
+faculties
+faculty
+faculty's
+fade
+faded
+fadedly
+fader
+faders
+fades
+fading
+fag
+fags
+fail
+failed
+failing
+failingly
+failings
+fails
+failure
+failure's
+failures
+fain
+faint
+fainted
+fainter
+faintest
+fainting
+faintly
+faintness
+faints
+fair
+faired
+fairer
+fairest
+fairies
+fairing
+fairly
+fairness
+fairs
+fairy
+fairy's
+fairyland
+faith
+faithful
+faithfully
+faithfulness
+faithfuls
+faithless
+faithlessly
+faithlessness
+faiths
+fake
+faked
+faker
+fakes
+faking
+falcon
+falconer
+falcons
+fall
+fallacies
+fallacious
+fallaciously
+fallaciousness
+fallacy
+fallacy's
+fallen
+faller
+fallibility
+fallible
+falling
+falls
+false
+falsehood
+falsehood's
+falsehoods
+falsely
+falseness
+falser
+falsest
+falsification
+falsified
+falsifier
+falsifies
+falsify
+falsifying
+falsity
+falter
+faltered
+falterer
+faltering
+falteringly
+falters
+fame
+famed
+fames
+familiar
+familiarities
+familiarity
+familiarly
+familiarness
+familiars
+families
+family
+family's
+famine
+famine's
+famines
+faming
+famish
+famished
+famishes
+famishing
+famous
+famously
+famousness
+fan
+fan's
+fanatic
+fanatic's
+fanatically
+fanatics
+fancied
+fancier
+fancier's
+fanciers
+fancies
+fanciest
+fanciful
+fancifully
+fancifulness
+fancily
+fanciness
+fancy
+fancying
+fang
+fang's
+fanged
+fangs
+fanned
+fanning
+fans
+fantasied
+fantasies
+fantastic
+fantasy
+fantasy's
+far
+faraway
+farce
+farce's
+farces
+farcing
+fare
+fared
+farer
+fares
+farewell
+farewells
+faring
+farm
+farmed
+farmer
+farmer's
+farmers
+farmhouse
+farmhouse's
+farmhouses
+farming
+farms
+farmyard
+farmyard's
+farmyards
+farther
+farthest
+farthing
+fascinate
+fascinated
+fascinates
+fascinating
+fascinatingly
+fascination
+fascinations
+fashion
+fashionable
+fashionableness
+fashionably
+fashioned
+fashioner
+fashioners
+fashioning
+fashions
+fast
+fasted
+fasten
+fastened
+fastener
+fasteners
+fastening
+fastenings
+fastens
+faster
+fastest
+fasting
+fastness
+fasts
+fat
+fatal
+fatalities
+fatality
+fatality's
+fatally
+fatals
+fate
+fated
+fates
+father
+father's
+fathered
+fathering
+fatherland
+fatherliness
+fatherly
+fathers
+fathom
+fathomed
+fathoming
+fathoms
+fatigue
+fatigued
+fatigues
+fatiguing
+fatiguingly
+fating
+fatly
+fatness
+fats
+fatten
+fattened
+fattener
+fatteners
+fattening
+fattens
+fatter
+fattest
+fault
+faulted
+faultier
+faultiness
+faulting
+faultless
+faultlessly
+faultlessness
+faults
+faulty
+fawn
+fawned
+fawner
+fawning
+fawningly
+fawns
+fear
+feared
+fearer
+fearful
+fearfully
+fearfulness
+fearing
+fearless
+fearlessly
+fearlessness
+fears
+feasibility
+feasible
+feasibleness
+feast
+feasted
+feaster
+feasting
+feasts
+feat
+feat's
+feather
+feathered
+featherer
+featherers
+feathering
+feathers
+feating
+featly
+feats
+feature
+featured
+featureless
+features
+featuring
+fed
+federal
+federally
+federals
+federation
+feds
+fee
+feeble
+feebleness
+feebler
+feeblest
+feebly
+feed
+feedback
+feedbacks
+feeder
+feeders
+feeding
+feedings
+feeds
+feel
+feeler
+feelers
+feeling
+feelingly
+feelingness
+feelings
+feels
+fees
+feet
+feign
+feigned
+feigner
+feigning
+feigns
+felicities
+felicity
+fell
+felled
+feller
+fellers
+felling
+fellness
+fellow
+fellow's
+fellowly
+fellows
+fellowship
+fellowship's
+fellowships
+fells
+felt
+felted
+felting
+felts
+female
+female's
+femaleness
+females
+feminine
+femininely
+feminineness
+femininity
+feminist
+feminist's
+feminists
+femur
+femur's
+femurs
+fen
+fence
+fenced
+fencer
+fencers
+fences
+fencing
+ferment
+fermentation
+fermentation's
+fermentations
+fermented
+fermenter
+fermenting
+ferments
+fern
+fern's
+ferns
+ferocious
+ferociously
+ferociousness
+ferocity
+ferried
+ferries
+ferrite
+ferry
+ferrying
+fertile
+fertilely
+fertileness
+fertilities
+fertility
+fervent
+fervently
+festival
+festival's
+festivals
+festive
+festively
+festiveness
+festivities
+festivity
+fetch
+fetched
+fetcher
+fetches
+fetching
+fetchingly
+fetter
+fettered
+fettering
+fetters
+feud
+feud's
+feudal
+feudalism
+feudally
+feuds
+fever
+fevered
+fevering
+feverish
+feverishly
+feverishness
+fevers
+few
+fewer
+fewest
+fewness
+fews
+fibrous
+fibrously
+fibrousness
+fickle
+fickleness
+fiction
+fiction's
+fictional
+fictionally
+fictions
+fictitious
+fictitiously
+fictitiousness
+fiddle
+fiddled
+fiddler
+fiddles
+fiddling
+fidelity
+field
+fielded
+fielder
+fielders
+fielding
+fields
+fiend
+fiends
+fierce
+fiercely
+fierceness
+fiercer
+fiercest
+fieriness
+fiery
+fife
+fifteen
+fifteens
+fifteenth
+fifth
+fifthly
+fifties
+fiftieth
+fifty
+fig
+fig's
+fight
+fighter
+fighters
+fighting
+fights
+figs
+figurative
+figuratively
+figurativeness
+figure
+figured
+figurer
+figurers
+figures
+figuring
+figurings
+filament
+filament's
+filaments
+file
+file's
+filed
+filename
+filename's
+filenames
+filer
+filers
+files
+filial
+filially
+filing
+filings
+fill
+fillable
+filled
+filler
+fillers
+filling
+fillings
+fills
+film
+filmed
+filming
+films
+filter
+filter's
+filtered
+filterer
+filtering
+filters
+filth
+filthier
+filthiest
+filthiness
+filthy
+filtration
+filtration's
+fin
+fin's
+final
+finality
+finally
+finals
+finance
+financed
+finances
+financial
+financially
+financier
+financier's
+financiers
+financing
+find
+finder
+finders
+finding
+findings
+finds
+fine
+fined
+finely
+fineness
+finer
+fines
+finest
+finger
+fingered
+fingerer
+fingering
+fingerings
+fingers
+fining
+finish
+finished
+finisher
+finishers
+finishes
+finishing
+finishings
+finite
+finitely
+finiteness
+finites
+fins
+fir
+fire
+firearm
+firearm's
+firearms
+fired
+fireflies
+firefly
+firefly's
+firelight
+firelighting
+fireman
+fireplace
+fireplace's
+fireplaces
+firer
+firers
+fires
+fireside
+firewood
+fireworks
+firing
+firings
+firm
+firm's
+firmament
+firmed
+firmer
+firmest
+firming
+firmly
+firmness
+firms
+firmware
+firmwares
+first
+firsthand
+firstly
+firsts
+firth
+fiscal
+fiscally
+fiscals
+fish
+fished
+fisher
+fisheries
+fisherman
+fisherman's
+fishermen
+fishermen's
+fishers
+fishery
+fishes
+fishing
+fissure
+fissured
+fissures
+fissuring
+fist
+fisted
+fists
+fit
+fitful
+fitfully
+fitfulness
+fitly
+fitness
+fits
+fitted
+fitter
+fitter's
+fitters
+fitting
+fittingly
+fittingness
+fittings
+five
+fiver
+fives
+fix
+fixate
+fixated
+fixates
+fixating
+fixation
+fixations
+fixative
+fixed
+fixedly
+fixedness
+fixer
+fixers
+fixes
+fixing
+fixings
+fixture
+fixture's
+fixtures
+flab
+flabbier
+flabbiness
+flabby
+flag
+flag's
+flagged
+flagging
+flaggingly
+flagrant
+flagrantly
+flags
+flagship
+flagship's
+flagships
+flake
+flaked
+flaker
+flakes
+flaking
+flame
+flamed
+flamer
+flamers
+flames
+flaming
+flamingly
+flammable
+flammables
+flank
+flanked
+flanker
+flankers
+flanking
+flanks
+flannel
+flannel's
+flannels
+flap
+flap's
+flapping
+flaps
+flare
+flared
+flares
+flaring
+flaringly
+flash
+flashed
+flasher
+flashers
+flashes
+flashing
+flashlight
+flashlight's
+flashlights
+flask
+flat
+flatly
+flatness
+flatnesses
+flats
+flatten
+flattened
+flattener
+flattening
+flattens
+flatter
+flattered
+flatterer
+flattering
+flatteringly
+flatters
+flattery
+flattest
+flaunt
+flaunted
+flaunting
+flauntingly
+flaunts
+flaw
+flawed
+flawing
+flawless
+flawlessly
+flawlessness
+flaws
+flax
+flaxen
+flea
+flea's
+fleas
+fled
+fledged
+fledgling
+fledgling's
+fledglings
+flee
+fleece
+fleece's
+fleeced
+fleeces
+fleecier
+fleecy
+fleeing
+fleer
+flees
+fleet
+fleetest
+fleeting
+fleetingly
+fleetingness
+fleetly
+fleetness
+fleets
+flesh
+fleshed
+flesher
+fleshes
+fleshier
+fleshiness
+fleshing
+fleshings
+fleshly
+fleshy
+flew
+flews
+flexibilities
+flexibility
+flexible
+flexibly
+flick
+flicked
+flicker
+flickered
+flickering
+flickeringly
+flicking
+flicks
+flier
+fliers
+flies
+flight
+flight's
+flights
+flinch
+flinched
+flincher
+flinches
+flinching
+fling
+fling's
+flinger
+flinging
+flings
+flint
+flints
+flip
+flips
+flirt
+flirted
+flirter
+flirting
+flirts
+flit
+flits
+float
+floated
+floater
+floaters
+floating
+floats
+flock
+flocked
+flocking
+flocks
+flood
+flooded
+flooder
+flooding
+floods
+floor
+floored
+floorer
+flooring
+floorings
+floors
+flop
+flop's
+floppier
+floppies
+floppily
+floppiness
+floppy
+floppy's
+flops
+flora
+florin
+floss
+flossed
+flosses
+flossing
+flounder
+floundered
+floundering
+flounders
+flour
+floured
+flourish
+flourished
+flourisher
+flourishes
+flourishing
+flourishingly
+flours
+flow
+flowchart
+flowcharting
+flowcharts
+flowed
+flower
+flowered
+flowerer
+floweriness
+flowering
+flowers
+flowery
+flowing
+flowingly
+flown
+flows
+fluctuate
+fluctuated
+fluctuates
+fluctuating
+fluctuation
+fluctuations
+fluent
+fluently
+fluffier
+fluffiest
+fluffiness
+fluffy
+fluid
+fluidity
+fluidly
+fluidness
+fluids
+flung
+flunk
+flunked
+flunker
+flunking
+flunks
+fluorescence
+flurried
+flurries
+flurry
+flurrying
+flush
+flushed
+flushes
+flushing
+flushness
+flute
+flute's
+fluted
+fluter
+flutes
+fluting
+flutter
+fluttered
+flutterer
+fluttering
+flutters
+fly
+flyable
+flyer
+flyer's
+flyers
+flying
+foam
+foamed
+foamer
+foaming
+foams
+focal
+focally
+foci
+focus
+focusable
+focused
+focuser
+focuses
+focusing
+fodder
+foe
+foe's
+foes
+fog
+fog's
+fogged
+foggier
+foggiest
+foggily
+fogginess
+fogging
+foggy
+fogs
+foil
+foiled
+foiling
+foils
+fold
+folded
+folder
+folders
+folding
+foldings
+folds
+foliage
+foliaged
+foliages
+folk
+folk's
+folklore
+folks
+follies
+follow
+followed
+follower
+followers
+following
+followings
+follows
+folly
+fond
+fonder
+fondest
+fondle
+fondled
+fondler
+fondles
+fondling
+fondly
+fondness
+fonds
+font
+font's
+fonts
+food
+food's
+foods
+foodstuff
+foodstuff's
+foodstuffs
+fool
+fooled
+fooling
+foolish
+foolishly
+foolishness
+foolproof
+fools
+foot
+football
+football's
+footballed
+footballer
+footballers
+footballs
+footed
+footer
+footers
+foothold
+footholds
+footing
+footings
+footman
+footnote
+footnote's
+footnotes
+footprint
+footprint's
+footprints
+foots
+footstep
+footsteps
+for
+forage
+foraged
+forager
+forages
+foraging
+foray
+foray's
+forayer
+forays
+forbade
+forbear
+forbear's
+forbearance
+forbearer
+forbearing
+forbears
+forbid
+forbidden
+forbidding
+forbiddingly
+forbiddingness
+forbids
+force
+force's
+forced
+forcedly
+forcefield
+forcefield's
+forcefields
+forceful
+forcefully
+forcefulness
+forcer
+forces
+forcible
+forcibleness
+forcibly
+forcing
+ford
+fords
+fore
+forearm
+forearm's
+forearmed
+forearms
+foreboding
+forebodingly
+forebodingness
+forebodings
+forecast
+forecasted
+forecaster
+forecasters
+forecasting
+forecastle
+forecastles
+forecasts
+forefather
+forefather's
+forefathers
+forefinger
+forefinger's
+forefingers
+forego
+foregoer
+foregoes
+foregoing
+foregone
+foreground
+foregrounds
+forehead
+forehead's
+foreheads
+foreign
+foreigner
+foreigners
+foreignly
+foreignness
+foreigns
+foreman
+foremost
+forenoon
+foresee
+foreseeable
+foreseen
+foreseer
+foresees
+foresight
+foresighted
+foresightedly
+foresightedness
+forest
+forestall
+forestalled
+forestaller
+forestalling
+forestallment
+forestalls
+forested
+forester
+foresters
+forests
+foretell
+foreteller
+foretelling
+foretells
+forethought
+forethought's
+foretold
+forever
+foreverness
+forewarn
+forewarned
+forewarner
+forewarning
+forewarnings
+forewarns
+forfeit
+forfeited
+forfeiter
+forfeiters
+forfeiting
+forfeits
+forgave
+forge
+forged
+forger
+forgeries
+forgers
+forgery
+forgery's
+forges
+forget
+forgetful
+forgetfully
+forgetfulness
+forgetive
+forgets
+forgettable
+forgettably
+forgetting
+forging
+forgivable
+forgivably
+forgive
+forgiven
+forgiveness
+forgiver
+forgives
+forgiving
+forgivingly
+forgivingness
+forgot
+forgotten
+fork
+forked
+forker
+forking
+forks
+forlorn
+forlornly
+forlornness
+form
+formal
+formalism
+formalism's
+formalisms
+formalities
+formality
+formally
+formalness
+formals
+formant
+formants
+format
+formated
+formating
+formation
+formation's
+formations
+formative
+formatively
+formativeness
+formats
+formatted
+formatter
+formatter's
+formatters
+formatting
+formed
+former
+formerly
+formers
+formidable
+formidableness
+forming
+forms
+formula
+formula's
+formulae
+formulas
+formulate
+formulated
+formulates
+formulating
+formulation
+formulations
+formulator
+formulator's
+formulators
+fornication
+forsake
+forsaken
+forsakes
+forsaking
+fort
+fort's
+forte
+fortes
+forth
+forthcoming
+forthwith
+fortier
+forties
+fortieth
+fortification
+fortifications
+fortified
+fortifier
+fortifies
+fortify
+fortifying
+fortitude
+fortnight
+fortnightly
+fortress
+fortress's
+fortresses
+forts
+fortuitous
+fortuitously
+fortuitousness
+fortunate
+fortunately
+fortunateness
+fortunates
+fortune
+fortune's
+fortuned
+fortunes
+fortuning
+forty
+forum
+forum's
+forums
+forward
+forwarded
+forwarder
+forwarders
+forwarding
+forwardly
+forwardness
+forwards
+fossil
+fossils
+foster
+fostered
+fosterer
+fostering
+fosters
+fought
+foul
+fouled
+fouler
+foulest
+fouling
+foully
+foulness
+fouls
+found
+foundation
+foundation's
+foundations
+founded
+founder
+foundered
+foundering
+founders
+founding
+foundries
+foundry
+foundry's
+founds
+fount
+fount's
+fountain
+fountain's
+fountains
+founts
+four
+fours
+fourscore
+fourteen
+fourteener
+fourteens
+fourteenth
+fourth
+fourthly
+fowl
+fowler
+fowling
+fowls
+fox
+fox's
+foxed
+foxes
+foxing
+fractal
+fractal's
+fractals
+fraction
+fraction's
+fractional
+fractionally
+fractioned
+fractioning
+fractions
+fracture
+fractured
+fractures
+fracturing
+fragile
+fragilely
+fragment
+fragmentariness
+fragmentary
+fragmented
+fragmenting
+fragments
+fragrance
+fragrance's
+fragrances
+fragrant
+fragrantly
+frail
+frailer
+frailest
+frailly
+frailness
+frailties
+frailty
+frame
+frame's
+framed
+framer
+framers
+frames
+framework
+framework's
+frameworks
+framing
+framings
+franc
+franchise
+franchise's
+franchised
+franchiser
+franchises
+franchising
+francs
+frank
+franked
+franker
+frankest
+franking
+frankly
+frankness
+franks
+frantic
+frantically
+franticly
+franticness
+fraternal
+fraternally
+fraternities
+fraternity
+fraternity's
+fraud
+fraud's
+frauds
+fraudulently
+fraught
+fraughted
+fraughting
+fraughts
+fray
+frayed
+fraying
+frays
+freak
+freak's
+freaks
+freckle
+freckled
+freckles
+freckling
+free
+freed
+freedom
+freedom's
+freedoms
+freeing
+freeings
+freely
+freeman
+freeness
+freer
+frees
+freest
+freeway
+freeway's
+freeways
+freeze
+freezer
+freezers
+freezes
+freezing
+freight
+freighted
+freighter
+freighters
+freighting
+freights
+frenzied
+frenziedly
+frenzies
+frenzy
+frenzying
+frequencies
+frequency
+frequent
+frequented
+frequenter
+frequenters
+frequenting
+frequently
+frequentness
+frequents
+fresh
+freshen
+freshened
+freshener
+fresheners
+freshening
+freshens
+fresher
+freshers
+freshest
+freshly
+freshman
+freshmen
+freshness
+fret
+fretful
+fretfully
+fretfulness
+frets
+friar
+friar's
+friarly
+friars
+frication
+fricative
+fricatives
+friction
+friction's
+frictionless
+frictionlessly
+frictions
+fried
+friend
+friend's
+friendless
+friendlessness
+friendlier
+friendlies
+friendliest
+friendliness
+friendly
+friends
+friendship
+friendship's
+friendships
+frier
+fries
+frieze
+frieze's
+friezes
+frigate
+frigate's
+frigates
+fright
+frighten
+frightened
+frightening
+frighteningly
+frightens
+frightful
+frightfully
+frightfulness
+frill
+frill's
+frilled
+frills
+fringe
+fringed
+fringes
+fringing
+frisk
+frisked
+frisker
+frisking
+frisks
+frivolous
+frivolously
+frivolousness
+frock
+frock's
+frocked
+frocking
+frocks
+frog
+frog's
+frogs
+frolic
+frolics
+from
+front
+fronted
+frontier
+frontier's
+frontiers
+fronting
+fronts
+frost
+frosted
+frostier
+frostiness
+frosting
+frosts
+frosty
+froth
+frothing
+frown
+frowned
+frowner
+frowning
+frowningly
+frowns
+froze
+frozen
+frozenly
+frozenness
+frugal
+frugally
+fruit
+fruit's
+fruited
+fruiter
+fruiterer
+fruitful
+fruitfully
+fruitfulness
+fruition
+fruitless
+fruitlessly
+fruitlessness
+fruits
+frustrate
+frustrated
+frustrater
+frustrates
+frustrating
+frustratingly
+frustration
+frustrations
+fry
+frying
+fuel
+fuels
+fugitive
+fugitive's
+fugitively
+fugitiveness
+fugitives
+fulfilled
+fulfiller
+fulfilling
+full
+fuller
+fullest
+fullness
+fullword
+fullword's
+fullwords
+fully
+fumble
+fumbled
+fumbler
+fumbles
+fumbling
+fumblingly
+fume
+fumed
+fumes
+fuming
+fun
+function
+function's
+functional
+functionalities
+functionality
+functionally
+functionals
+functioned
+functioning
+functions
+functor
+functor's
+functors
+fund
+fundamental
+fundamentalist
+fundamentalist's
+fundamentalists
+fundamentally
+fundamentals
+funded
+funder
+funders
+funding
+funds
+funeral
+funeral's
+funerals
+fungus
+funguses
+funnel
+funnels
+funnier
+funnies
+funniest
+funnily
+funniness
+funny
+fur
+fur's
+furies
+furious
+furiouser
+furiously
+furiousness
+furnace
+furnace's
+furnaced
+furnaces
+furnacing
+furness
+furnish
+furnished
+furnisher
+furnishers
+furnishes
+furnishing
+furnishings
+furniture
+furrow
+furrowed
+furrowing
+furrows
+furs
+further
+furthered
+furtherer
+furtherest
+furthering
+furthermore
+furthers
+furtive
+furtively
+furtiveness
+fury
+fury's
+fuse
+fused
+fuses
+fusing
+fusion
+fusions
+fuss
+fusser
+fussing
+futile
+futilely
+futileness
+futility
+future
+future's
+futures
+fuzzier
+fuzziest
+fuzziness
+fuzzy
+gabardine
+gabardines
+gable
+gabled
+gabler
+gables
+gad
+gadget
+gadget's
+gadgets
+gag
+gaged
+gager
+gagged
+gagging
+gaging
+gags
+gaieties
+gaiety
+gaily
+gain
+gained
+gainer
+gainers
+gaining
+gainings
+gainly
+gains
+gait
+gaited
+gaiter
+gaiters
+gaits
+galaxies
+galaxy
+galaxy's
+gale
+gales
+gall
+gallant
+gallantly
+gallantry
+gallants
+galled
+galleried
+galleries
+gallery
+galley
+galley's
+galleys
+galling
+gallingly
+gallon
+gallon's
+gallons
+gallop
+galloped
+galloper
+gallopers
+galloping
+gallops
+gallows
+gallowses
+galls
+gamble
+gambled
+gambler
+gamblers
+gambles
+gambling
+game
+gamed
+gamely
+gameness
+games
+gaming
+gamma
+gammas
+gang
+gang's
+ganger
+ganglier
+gangly
+gangrene
+gangrened
+gangrenes
+gangrening
+gangs
+gangster
+gangster's
+gangsters
+gap
+gap's
+gape
+gaped
+gaper
+gapes
+gaping
+gapingly
+gaps
+garage
+garaged
+garages
+garaging
+garb
+garbage
+garbage's
+garbaged
+garbages
+garbaging
+garbed
+garble
+garbled
+garbler
+garbles
+garbling
+garden
+gardened
+gardener
+gardeners
+gardening
+gardens
+gargle
+gargled
+gargles
+gargling
+garland
+garlanded
+garlands
+garlic
+garlics
+garment
+garment's
+garmented
+garmenting
+garments
+garner
+garnered
+garnering
+garners
+garnish
+garnished
+garnishes
+garrison
+garrisoned
+garrisoning
+garrisons
+garter
+garter's
+gartered
+gartering
+garters
+gas
+gas's
+gaseous
+gaseously
+gaseousness
+gases
+gash
+gash's
+gashed
+gashes
+gashing
+gasoline
+gasolines
+gasp
+gasped
+gasper
+gaspers
+gasping
+gaspingly
+gasps
+gassed
+gasser
+gassers
+gassing
+gassings
+gastric
+gastrointestinal
+gate
+gated
+gates
+gateway
+gateway's
+gateways
+gather
+gathered
+gatherer
+gatherers
+gathering
+gatherings
+gathers
+gating
+gaudier
+gaudies
+gaudiness
+gaudy
+gauge
+gauged
+gauger
+gauges
+gauging
+gaunt
+gauntly
+gauntness
+gauze
+gauzed
+gauzes
+gauzing
+gave
+gay
+gayer
+gayest
+gayly
+gayness
+gaze
+gazed
+gazer
+gazers
+gazes
+gazing
+gear
+geared
+gearing
+gears
+geese
+gel
+gel's
+gelatin
+gelled
+gelling
+gels
+gem
+gem's
+gems
+gender
+gender's
+gendered
+gendering
+genders
+gene
+gene's
+general
+general's
+generalist
+generalist's
+generalists
+generalities
+generality
+generally
+generalness
+generals
+generate
+generated
+generates
+generating
+generation
+generations
+generative
+generatively
+generator
+generator's
+generators
+generic
+generically
+genericness
+generosities
+generosity
+generosity's
+generous
+generously
+generousness
+genes
+genetic
+genetically
+genetics
+genial
+genially
+genialness
+genius
+genius's
+geniuses
+genre
+genre's
+genres
+genteel
+genteeler
+genteelest
+genteelly
+genteelness
+gentle
+gentled
+gentleman
+gentlemanliness
+gentlemanly
+gentleness
+gentler
+gentlest
+gentlewoman
+gentling
+gently
+gentries
+gentry
+genuine
+genuinely
+genuineness
+genus
+geographic
+geographical
+geographically
+geographies
+geography
+geological
+geologist
+geologist's
+geologists
+geometric
+geometries
+geometry
+geranium
+germ
+germ's
+germane
+germen
+germinate
+germinated
+germinates
+germinating
+germination
+germinations
+germinative
+germinatively
+germs
+gestalt
+gesture
+gestured
+gestures
+gesturing
+get
+gets
+getter
+getter's
+gettered
+getters
+getting
+ghastlier
+ghastliness
+ghastly
+ghost
+ghosted
+ghosting
+ghostlier
+ghostliness
+ghostlinesses
+ghostly
+ghosts
+giant
+giant's
+giants
+gibberish
+giddied
+giddier
+giddiness
+giddy
+giddying
+gift
+gifted
+giftedly
+giftedness
+gifts
+gig
+gig's
+gigantic
+giganticness
+giggle
+giggled
+giggler
+giggles
+giggling
+gigglingly
+gigs
+gild
+gilded
+gilder
+gilding
+gilds
+gill
+gill's
+gilled
+giller
+gills
+gilt
+gimmick
+gimmick's
+gimmicks
+gin
+gin's
+ginger
+gingerbread
+gingered
+gingering
+gingerliness
+gingerly
+gingham
+ginghams
+gins
+giraffe
+giraffe's
+giraffes
+gird
+girded
+girder
+girder's
+girders
+girding
+girdle
+girdled
+girdler
+girdles
+girdling
+girds
+girl
+girl's
+girlfriend
+girlfriend's
+girlfriends
+girls
+girt
+girth
+give
+given
+givenness
+givens
+giver
+givers
+gives
+giveth
+giving
+givingly
+gizmo
+gizmo's
+gizmos
+glacial
+glacially
+glacier
+glacier's
+glaciers
+glad
+gladder
+gladdest
+glade
+glades
+gladly
+gladness
+glamour
+glamoured
+glamouring
+glamours
+glance
+glanced
+glances
+glancing
+glancingly
+gland
+gland's
+glanders
+glands
+glare
+glared
+glares
+glaring
+glaringly
+glaringness
+glass
+glassed
+glasses
+glassier
+glassies
+glassiness
+glassy
+glaze
+glazed
+glazer
+glazers
+glazes
+glazing
+gleam
+gleamed
+gleaming
+gleams
+glean
+gleaned
+gleaner
+gleaning
+gleanings
+gleans
+glee
+gleed
+gleeful
+gleefully
+gleefulness
+glees
+glen
+glen's
+glens
+glide
+glided
+glider
+gliders
+glides
+gliding
+glimmer
+glimmered
+glimmering
+glimmers
+glimpse
+glimpsed
+glimpser
+glimpsers
+glimpses
+glimpsing
+glint
+glinted
+glinting
+glints
+glisten
+glistened
+glistening
+glistens
+glitch
+glitch's
+glitches
+glitter
+glittered
+glittering
+glitteringly
+glitters
+global
+globally
+globals
+globe
+globe's
+globes
+globing
+globular
+globularity
+globularly
+globularness
+gloom
+gloomier
+gloomily
+gloominess
+glooms
+gloomy
+gloried
+glories
+glorification
+glorifications
+glorified
+glorifier
+glorifiers
+glorifies
+glorify
+glorious
+gloriously
+gloriousness
+glory
+glorying
+gloss
+glossaries
+glossary
+glossary's
+glossed
+glosses
+glossier
+glossies
+glossiness
+glossing
+glossy
+glottal
+glove
+gloved
+glover
+glovers
+gloves
+gloving
+glow
+glowed
+glower
+glowered
+glowering
+glowers
+glowing
+glowingly
+glows
+glucose
+glue
+glued
+gluer
+gluers
+glues
+gluing
+gnat
+gnat's
+gnats
+gnaw
+gnawed
+gnawer
+gnawing
+gnaws
+go
+goad
+goaded
+goading
+goads
+goal
+goal's
+goals
+goat
+goat's
+goatee
+goatee's
+goatees
+goats
+gobble
+gobbled
+gobbler
+gobblers
+gobbles
+gobbling
+goblet
+goblet's
+goblets
+goblin
+goblin's
+goblins
+god
+god's
+goddess
+goddess's
+goddesses
+godlier
+godlike
+godlikeness
+godliness
+godly
+godmother
+godmother's
+godmothers
+gods
+goer
+goering
+goes
+going
+goings
+gold
+golden
+goldenly
+goldenness
+golding
+golds
+goldsmith
+golf
+golfer
+golfers
+golfing
+golfs
+gone
+goner
+gong
+gong's
+gongs
+gonion
+good
+goodbye
+goodbye's
+goodbyes
+goodie
+goodie's
+goodies
+goodly
+goodness
+goods
+goody
+goody's
+goose
+gooses
+goosing
+gore
+gored
+gores
+gorge
+gorgeous
+gorgeously
+gorgeousness
+gorger
+gorges
+gorging
+gorilla
+gorilla's
+gorillas
+goring
+gosh
+gospel
+gospels
+gossip
+gossiper
+gossipers
+gossips
+got
+gotcha
+gotcha's
+gotchas
+goth
+goto
+gotten
+gouge
+gouged
+gouger
+gouges
+gouging
+govern
+governed
+governess
+governesses
+governing
+government
+government's
+governmental
+governmentally
+governments
+governor
+governor's
+governors
+governs
+gown
+gowned
+gowns
+grab
+grabbed
+grabber
+grabber's
+grabbers
+grabbing
+grabbings
+grabs
+grace
+graced
+graceful
+gracefully
+gracefulness
+graces
+gracing
+gracious
+graciously
+graciousness
+gradation
+gradation's
+gradations
+grade
+graded
+gradely
+grader
+graders
+grades
+gradient
+gradient's
+gradients
+grading
+gradings
+gradual
+gradually
+gradualness
+graduate
+graduated
+graduates
+graduating
+graduation
+graduations
+graft
+grafted
+grafter
+grafting
+grafts
+graham
+graham's
+grahams
+grain
+grained
+grainer
+graining
+grains
+grammar
+grammar's
+grammars
+grammatical
+grammatically
+grammaticalness
+granaries
+granary
+granary's
+grand
+grander
+grandest
+grandeur
+grandfather
+grandfather's
+grandfatherly
+grandfathers
+grandiose
+grandiosely
+grandioseness
+grandkid
+grandkid's
+grandkids
+grandly
+grandma
+grandma's
+grandmother
+grandmother's
+grandmotherly
+grandmothers
+grandness
+grandpa
+grandpa's
+grandparent
+grandparents
+grandpas
+grands
+grandson
+grandson's
+grandsons
+grange
+granger
+granges
+granite
+grannies
+granny
+grant
+grant's
+granted
+granter
+granting
+grants
+granularity
+granulate
+granulated
+granulates
+granulating
+granulation
+granulations
+granulative
+grape
+grape's
+grapes
+grapevine
+grapevine's
+grapevines
+graph
+graph's
+graphed
+graphic
+graphical
+graphically
+graphicness
+graphics
+graphing
+graphite
+graphs
+grapple
+grappled
+grappler
+grapples
+grappling
+grasp
+graspable
+grasped
+grasper
+grasping
+graspingly
+graspingness
+grasps
+grass
+grassed
+grassers
+grasses
+grassier
+grassiest
+grassing
+grassy
+grate
+grated
+grateful
+gratefully
+gratefulness
+grater
+grates
+gratification
+gratifications
+gratified
+gratify
+gratifying
+gratifyingly
+grating
+gratingly
+gratings
+gratitude
+gratuities
+gratuitous
+gratuitously
+gratuitousness
+gratuity
+gratuity's
+grave
+gravel
+gravelly
+gravels
+gravely
+graveness
+graver
+gravers
+graves
+gravest
+gravies
+graving
+gravitation
+gravitational
+gravitationally
+gravities
+gravity
+gravy
+gray
+grayed
+grayer
+grayest
+graying
+grayly
+grayness
+grays
+graze
+grazed
+grazer
+grazes
+grazing
+grease
+greased
+greaser
+greasers
+greases
+greasier
+greasiness
+greasing
+greasy
+great
+greaten
+greatened
+greatening
+greater
+greatest
+greatly
+greatness
+greats
+greed
+greedier
+greedily
+greediness
+greedy
+green
+greened
+greener
+greenest
+greenhouse
+greenhouse's
+greenhouses
+greening
+greenish
+greenishness
+greenly
+greenness
+greens
+greet
+greeted
+greeter
+greeting
+greetings
+greets
+grenade
+grenade's
+grenades
+grew
+grey
+greyest
+greying
+grid
+grid's
+grids
+grief
+grief's
+griefs
+grievance
+grievance's
+grievances
+grieve
+grieved
+griever
+grievers
+grieves
+grieving
+grievingly
+grievous
+grievously
+grievousness
+grill
+grilled
+griller
+grilling
+grills
+grim
+grimed
+griming
+grimly
+grimness
+grin
+grind
+grinder
+grinders
+grinding
+grindingly
+grindings
+grinds
+grindstone
+grindstone's
+grindstones
+grins
+grip
+gripe
+griped
+griper
+gripes
+griping
+gripped
+gripper
+gripper's
+grippers
+gripping
+grippingly
+grips
+grit
+grit's
+grits
+grizzlier
+grizzly
+groan
+groaned
+groaner
+groaners
+groaning
+groans
+grocer
+grocer's
+groceries
+grocers
+grocery
+groom
+groom's
+groomed
+groomer
+grooming
+grooms
+groove
+grooved
+groover
+grooves
+grooving
+grope
+groped
+groper
+gropes
+groping
+gross
+grossed
+grosser
+grosses
+grossest
+grossing
+grossly
+grossness
+grotesque
+grotesquely
+grotesqueness
+grotto
+grotto's
+grottos
+ground
+grounded
+grounder
+grounders
+grounding
+grounds
+groundwork
+group
+group's
+grouped
+grouper
+grouping
+groupings
+groups
+grouse
+groused
+grouser
+grouses
+grousing
+grove
+grovel
+grovels
+grover
+grovers
+groves
+grow
+grower
+growers
+growing
+growingly
+growl
+growled
+growler
+growlier
+growliness
+growling
+growlingly
+growls
+growly
+grown
+grownup
+grownup's
+grownups
+grows
+growth
+growths
+grub
+grub's
+grubs
+grudge
+grudge's
+grudged
+grudger
+grudges
+grudging
+grudgingly
+gruesome
+gruesomely
+gruesomeness
+gruff
+gruffly
+gruffness
+grumble
+grumbled
+grumbler
+grumbles
+grumbling
+grumblingly
+grunt
+grunted
+grunter
+grunting
+grunts
+guarantee
+guaranteed
+guaranteeing
+guaranteer
+guaranteers
+guarantees
+guaranty
+guard
+guarded
+guardedly
+guardedness
+guarder
+guardian
+guardian's
+guardians
+guardianship
+guarding
+guards
+guerrilla
+guerrilla's
+guerrillas
+guess
+guessed
+guesser
+guesses
+guessing
+guest
+guest's
+guested
+guesting
+guests
+guidance
+guidances
+guide
+guidebook
+guidebook's
+guidebooks
+guided
+guideline
+guideline's
+guidelines
+guider
+guides
+guiding
+guild
+guilder
+guile
+guilt
+guiltier
+guiltiest
+guiltily
+guiltiness
+guiltless
+guiltlessly
+guiltlessness
+guilts
+guilty
+guinea
+guineas
+guise
+guise's
+guised
+guises
+guising
+guitar
+guitar's
+guitars
+gulch
+gulch's
+gulches
+gulf
+gulf's
+gulfs
+gull
+gulled
+gullibility
+gullied
+gullies
+gulling
+gulls
+gully
+gully's
+gullying
+gulp
+gulped
+gulper
+gulps
+gum
+gum's
+gums
+gun
+gun's
+gunfire
+gunfires
+gunned
+gunner
+gunner's
+gunners
+gunning
+gunpowder
+gunpowders
+guns
+gurgle
+gurgled
+gurgles
+gurgling
+guru
+guru's
+gurus
+gush
+gushed
+gusher
+gushes
+gushing
+gust
+gust's
+gusts
+gut
+guts
+gutser
+gutter
+guttered
+guttering
+gutters
+guy
+guy's
+guyed
+guyer
+guyers
+guying
+guys
+gym
+gymnasium
+gymnasium's
+gymnasiums
+gymnast
+gymnast's
+gymnastic
+gymnastics
+gymnasts
+gyms
+gypsied
+gypsies
+gypsy
+gypsy's
+gypsying
+gyration
+gyrations
+gyroscope
+gyroscope's
+gyroscopes
+ha
+habit
+habit's
+habitable
+habitableness
+habitat
+habitat's
+habitation
+habitation's
+habitations
+habitats
+habits
+habitual
+habitually
+habitualness
+hack
+hacked
+hacker
+hacker's
+hackers
+hacking
+hacks
+had
+hadn't
+hag
+hagen
+haggard
+haggardly
+haggardness
+hail
+hailed
+hailer
+hailing
+hails
+hair
+hair's
+haircut
+haircut's
+haircuts
+hairdresser
+hairdresser's
+hairdressers
+haired
+hairier
+hairiness
+hairless
+hairlessness
+hairs
+hairy
+hale
+haler
+half
+halfness
+halfway
+halfword
+halfword's
+halfwords
+haling
+hall
+hall's
+haller
+hallmark
+hallmark's
+hallmarked
+hallmarking
+hallmarks
+hallow
+hallowed
+hallowing
+hallows
+halls
+hallway
+hallway's
+hallways
+halt
+halted
+halter
+haltered
+haltering
+halters
+halting
+haltingly
+halts
+halve
+halved
+halvers
+halves
+halving
+ham
+ham's
+hamburger
+hamburger's
+hamburgers
+hamlet
+hamlet's
+hamlets
+hammer
+hammered
+hammerer
+hammering
+hammers
+hammock
+hammock's
+hammocks
+hamper
+hampered
+hampering
+hampers
+hams
+hand
+handbag
+handbag's
+handbags
+handbook
+handbook's
+handbooks
+handcuff
+handcuffed
+handcuffing
+handcuffs
+handed
+handedly
+handedness
+hander
+handers
+handful
+handfuls
+handicap
+handicap's
+handicapped
+handicaps
+handier
+handiest
+handily
+handiness
+handing
+handiwork
+handkerchief
+handkerchief's
+handkerchiefs
+handle
+handled
+handler
+handlers
+handles
+handling
+hands
+handshake
+handshake's
+handshaker
+handshakes
+handshaking
+handsome
+handsomely
+handsomeness
+handsomer
+handsomest
+handwriting
+handwritten
+handy
+hang
+hangar
+hangar's
+hangars
+hanged
+hanger
+hangers
+hanging
+hangover
+hangover's
+hangovers
+hangs
+hap
+haphazard
+haphazardly
+haphazardness
+hapless
+haplessly
+haplessness
+haply
+happen
+happened
+happening
+happenings
+happens
+happier
+happiest
+happily
+happiness
+happy
+harass
+harassed
+harasser
+harasses
+harassing
+harassment
+harassments
+hard
+harden
+hardened
+hardener
+hardening
+hardens
+harder
+hardest
+hardier
+hardiness
+harding
+hardings
+hardly
+hardness
+hardnesses
+hards
+hardship
+hardship's
+hardships
+hardware
+hardwares
+hardy
+hare
+hare's
+hares
+hark
+harked
+harken
+harking
+harks
+harlot
+harlot's
+harlots
+harm
+harmed
+harmer
+harmful
+harmfully
+harmfulness
+harming
+harmless
+harmlessly
+harmlessness
+harmonies
+harmonious
+harmoniously
+harmoniousness
+harmony
+harms
+harness
+harnessed
+harnesser
+harnesses
+harnessing
+harp
+harped
+harper
+harpers
+harping
+harpings
+harps
+harried
+harrier
+harrow
+harrowed
+harrower
+harrowing
+harrows
+harry
+harrying
+harsh
+harshen
+harshened
+harshening
+harsher
+harshest
+harshly
+harshness
+hart
+harvest
+harvested
+harvester
+harvesters
+harvesting
+harvests
+has
+hash
+hashed
+hasher
+hashes
+hashing
+hasn't
+hassle
+hassled
+hassler
+hassles
+hassling
+haste
+hasted
+hasten
+hastened
+hastener
+hastening
+hastens
+hastes
+hastier
+hastiest
+hastily
+hastiness
+hasting
+hastings
+hasty
+hat
+hat's
+hatch
+hatched
+hatcher
+hatcheries
+hatchery
+hatchery's
+hatches
+hatchet
+hatchet's
+hatchets
+hatching
+hate
+hated
+hateful
+hatefully
+hatefulness
+hater
+hates
+hath
+hating
+hatred
+hats
+haughtier
+haughtily
+haughtiness
+haughty
+haul
+hauled
+hauler
+haulers
+hauling
+hauls
+haunch
+haunch's
+haunches
+haunt
+haunted
+haunter
+haunting
+hauntingly
+haunts
+have
+haven
+haven's
+haven't
+havens
+haver
+havering
+havers
+haves
+having
+havoc
+havocs
+hawk
+hawked
+hawker
+hawkers
+hawking
+hawks
+hay
+hayer
+haying
+hays
+hazard
+hazard's
+hazarded
+hazarding
+hazardous
+hazardously
+hazardousness
+hazards
+haze
+haze's
+hazed
+hazel
+hazer
+hazes
+hazier
+haziest
+haziness
+hazing
+hazy
+he
+he'd
+he'll
+he's
+head
+head's
+headache
+headache's
+headaches
+headed
+header
+headers
+headgear
+heading
+heading's
+headings
+headland
+headland's
+headlands
+headline
+headlined
+headliner
+headlines
+headlining
+headlong
+headphone
+headphone's
+headphones
+headquarters
+heads
+headway
+heal
+healed
+healer
+healers
+healing
+heals
+health
+healthful
+healthfully
+healthfulness
+healthier
+healthiest
+healthily
+healthiness
+healthy
+heap
+heaped
+heaping
+heaps
+hear
+heard
+hearer
+hearers
+hearest
+hearing
+hearings
+hearken
+hearkened
+hearkening
+hears
+hearsay
+hearses
+hearsing
+heart
+heart's
+heartache
+heartache's
+heartaches
+hearted
+heartedly
+hearten
+heartened
+heartening
+hearteningly
+heartens
+hearth
+heartier
+hearties
+heartiest
+heartily
+heartiness
+heartless
+heartlessly
+heartlessness
+hearts
+hearty
+heat
+heatable
+heated
+heatedly
+heater
+heaters
+heath
+heathen
+heather
+heating
+heats
+heave
+heaved
+heaven
+heaven's
+heavenliness
+heavenly
+heavens
+heaver
+heavers
+heaves
+heavier
+heavies
+heaviest
+heavily
+heaviness
+heaving
+heavy
+hedge
+hedged
+hedgehog
+hedgehog's
+hedgehogs
+hedger
+hedges
+hedging
+hedgingly
+heed
+heeded
+heeding
+heedless
+heedlessly
+heedlessness
+heeds
+heel
+heeled
+heeler
+heelers
+heeling
+heels
+heifer
+height
+heighten
+heightened
+heightening
+heightens
+heights
+heinous
+heinously
+heinousness
+heir
+heir's
+heiress
+heiress's
+heiresses
+heirs
+held
+hell
+hell's
+heller
+hello
+hellos
+hells
+helm
+helmet
+helmet's
+helmeted
+helmets
+help
+helped
+helper
+helpers
+helpful
+helpfully
+helpfulness
+helping
+helpless
+helplessly
+helplessness
+helps
+hem
+hem's
+hemisphere
+hemisphere's
+hemisphered
+hemispheres
+hemlock
+hemlock's
+hemlocks
+hemostat
+hemostats
+hemp
+hempen
+hems
+hen
+hen's
+hence
+henceforth
+henchman
+henchmen
+hens
+her
+herald
+heralded
+heralding
+heralds
+herb
+herb's
+herbivore
+herbivorous
+herbivorously
+herbs
+herd
+herded
+herder
+herding
+herds
+here
+here's
+hereabout
+hereabouts
+hereafter
+hereby
+hereditary
+heredity
+herein
+hereinafter
+heres
+heresy
+heretic
+heretic's
+heretics
+heretofore
+herewith
+heritage
+heritages
+hermit
+hermit's
+hermits
+hero
+hero's
+heroes
+heroic
+heroically
+heroics
+heroin
+heroine
+heroine's
+heroines
+heroism
+heron
+heron's
+herons
+heros
+herring
+herring's
+herrings
+hers
+herself
+hesitant
+hesitantly
+hesitate
+hesitated
+hesitater
+hesitates
+hesitating
+hesitatingly
+hesitation
+hesitations
+heterogeneous
+heterogeneously
+heterogeneousness
+heuristic
+heuristic's
+heuristically
+heuristics
+hew
+hewed
+hewer
+hewing
+hews
+hex
+hexagonal
+hexagonally
+hexer
+hey
+hickories
+hickory
+hid
+hidden
+hide
+hided
+hideous
+hideously
+hideousness
+hideout
+hideout's
+hideouts
+hider
+hides
+hiding
+hierarchical
+hierarchically
+hierarchies
+hierarchy
+hierarchy's
+high
+higher
+highest
+highland
+highlander
+highlands
+highlight
+highlighted
+highlighting
+highlights
+highly
+highness
+highness's
+highnesses
+highway
+highway's
+highways
+hijack
+hijacked
+hijacker
+hijackers
+hijacking
+hijacks
+hike
+hiked
+hiker
+hikers
+hikes
+hiking
+hilarious
+hilariously
+hilariousness
+hill
+hill's
+hilled
+hiller
+hilling
+hillock
+hillocks
+hills
+hillside
+hilltop
+hilltop's
+hilltops
+hilt
+hilt's
+hilts
+him
+hims
+himself
+hind
+hinder
+hindered
+hinderer
+hindering
+hinders
+hindrance
+hindrances
+hinds
+hindsight
+hinge
+hinged
+hinger
+hinges
+hinging
+hint
+hinted
+hinter
+hinting
+hints
+hip
+hip's
+hipness
+hips
+hire
+hired
+hirer
+hirers
+hires
+hiring
+hirings
+his
+hiss
+hissed
+hisser
+hisses
+hissing
+histogram
+histogram's
+histograms
+historian
+historian's
+historians
+historic
+historical
+historically
+historicalness
+histories
+history
+history's
+hit
+hit's
+hitch
+hitched
+hitcher
+hitches
+hitchhike
+hitchhiked
+hitchhiker
+hitchhikers
+hitchhikes
+hitchhiking
+hitching
+hither
+hitherto
+hits
+hitter
+hitter's
+hitters
+hitting
+hive
+hives
+hiving
+hoar
+hoard
+hoarded
+hoarder
+hoarding
+hoards
+hoarier
+hoariness
+hoarse
+hoarsely
+hoarseness
+hoarser
+hoarsest
+hoary
+hoax
+hoax's
+hoaxed
+hoaxer
+hoaxes
+hoaxing
+hobbies
+hobble
+hobbled
+hobbler
+hobbles
+hobbling
+hobby
+hobby's
+hobbyist
+hobbyist's
+hobbyists
+hockey
+hoe
+hoe's
+hoer
+hoes
+hog
+hog's
+hogs
+hoist
+hoisted
+hoister
+hoisting
+hoists
+hold
+holden
+holder
+holders
+holding
+holdings
+holds
+hole
+hole's
+holed
+holes
+holiday
+holiday's
+holidayer
+holidays
+holier
+holies
+holiness
+holing
+holistic
+hollies
+hollow
+hollowed
+hollower
+hollowest
+hollowing
+hollowly
+hollowness
+hollows
+holly
+holocaust
+hologram
+hologram's
+holograms
+holy
+homage
+homaged
+homager
+homages
+homaging
+home
+homebuilt
+homed
+homeless
+homelessness
+homelier
+homeliness
+homely
+homemade
+homemaker
+homemaker's
+homemakers
+homeomorphic
+homeomorphism
+homeomorphism's
+homeomorphisms
+homer
+homers
+homes
+homesick
+homesickness
+homespun
+homestead
+homesteader
+homesteaders
+homesteads
+homeward
+homewards
+homework
+homeworker
+homeworkers
+homing
+homogeneities
+homogeneity
+homogeneity's
+homogeneous
+homogeneously
+homogeneousness
+homomorphic
+homomorphism
+homomorphism's
+homomorphisms
+hone
+honed
+honer
+hones
+honest
+honestly
+honesty
+honey
+honeycomb
+honeycombed
+honeyed
+honeying
+honeymoon
+honeymooned
+honeymooner
+honeymooners
+honeymooning
+honeymoons
+honeys
+honeysuckle
+honing
+honorary
+hood
+hood's
+hooded
+hoodedness
+hooding
+hoods
+hoodwink
+hoodwinked
+hoodwinker
+hoodwinking
+hoodwinks
+hoof
+hoof's
+hoofed
+hoofer
+hoofs
+hook
+hooked
+hookedness
+hooker
+hookers
+hooking
+hooks
+hoop
+hooped
+hooper
+hooping
+hoops
+hooray
+hooray's
+hoorays
+hoot
+hooted
+hooter
+hooters
+hooting
+hoots
+hop
+hope
+hoped
+hopeful
+hopefully
+hopefulness
+hopefuls
+hopeless
+hopelessly
+hopelessness
+hoper
+hopes
+hoping
+hopped
+hopper
+hopper's
+hoppers
+hopping
+hops
+horde
+horde's
+hordes
+horizon
+horizon's
+horizons
+horizontal
+horizontally
+hormone
+hormone's
+hormones
+horn
+horned
+hornedness
+hornet
+hornet's
+hornets
+horns
+horrendous
+horrendously
+horrible
+horribleness
+horribly
+horrid
+horridly
+horridness
+horrified
+horrifies
+horrify
+horrifying
+horrifyingly
+horror
+horror's
+horrors
+horse
+horse's
+horseback
+horsely
+horseman
+horsepower
+horsepowers
+horses
+horseshoe
+horseshoer
+horseshoes
+horsing
+hose
+hose's
+hosed
+hoses
+hosing
+hospitable
+hospitably
+hospital
+hospital's
+hospitality
+hospitals
+host
+host's
+hostage
+hostage's
+hostages
+hosted
+hostess
+hostess's
+hostesses
+hostile
+hostilely
+hostilities
+hostility
+hosting
+hostly
+hosts
+hot
+hotel
+hotel's
+hotels
+hotly
+hotness
+hotter
+hottest
+hound
+hounded
+hounder
+hounding
+hounds
+hour
+hour's
+hourly
+hours
+house
+house's
+housed
+houseflies
+housefly
+housefly's
+household
+household's
+householder
+householders
+households
+housekeeper
+housekeeper's
+housekeepers
+housekeeping
+houser
+houses
+housetop
+housetop's
+housetops
+housewife
+housewife's
+housewifeliness
+housewifely
+housework
+houseworker
+houseworkers
+housing
+housings
+hovel
+hovel's
+hovels
+hover
+hovered
+hoverer
+hovering
+hovers
+how
+how's
+however
+howl
+howled
+howler
+howling
+howls
+hows
+hrs
+hub
+hub's
+hubris
+hubs
+huddle
+huddled
+huddler
+huddles
+huddling
+hue
+hue's
+hued
+hues
+hug
+huge
+hugely
+hugeness
+huger
+hugest
+hugs
+huh
+hull
+hull's
+hulled
+huller
+hulling
+hulls
+hum
+human
+humane
+humanely
+humaneness
+humanities
+humanity
+humanity's
+humanly
+humanness
+humans
+humble
+humbled
+humbleness
+humbler
+humbles
+humblest
+humbling
+humbly
+humid
+humidification
+humidifications
+humidified
+humidifier
+humidifiers
+humidifies
+humidify
+humidifying
+humidities
+humidity
+humidly
+humiliate
+humiliated
+humiliates
+humiliating
+humiliatingly
+humiliation
+humiliations
+humility
+hummed
+humming
+humorous
+humorously
+humorousness
+hump
+humped
+humping
+humps
+hums
+hunch
+hunched
+hunches
+hundred
+hundreds
+hundredth
+hung
+hunger
+hungered
+hungering
+hungers
+hungrier
+hungriest
+hungrily
+hungriness
+hungry
+hunk
+hunk's
+hunker
+hunkered
+hunkering
+hunkers
+hunks
+hunt
+hunted
+hunter
+hunters
+hunting
+hunts
+huntsman
+hurdle
+hurdled
+hurdler
+hurdles
+hurdling
+hurl
+hurled
+hurler
+hurlers
+hurling
+hurrah
+hurricane
+hurricane's
+hurricanes
+hurried
+hurriedly
+hurriedness
+hurrier
+hurries
+hurry
+hurrying
+hurt
+hurter
+hurting
+hurtingly
+hurts
+husband
+husband's
+husbander
+husbandly
+husbandry
+husbands
+hush
+hushed
+hushes
+hushing
+husk
+husked
+husker
+huskier
+huskies
+huskiness
+husking
+husks
+husky
+hustle
+hustled
+hustler
+hustlers
+hustles
+hustling
+hut
+hut's
+huts
+hyacinth
+hybrid
+hybrids
+hydraulic
+hydraulically
+hydraulics
+hydrodynamic
+hydrodynamics
+hydrogen
+hydrogen's
+hydrogens
+hygiene
+hymn
+hymn's
+hymning
+hymns
+hype
+hype's
+hyped
+hyper
+hyperbolic
+hypertext
+hypertext's
+hypes
+hyphen
+hyphen's
+hyphened
+hyphening
+hyphens
+hypocrisies
+hypocrisy
+hypocrite
+hypocrite's
+hypocrites
+hypodermic
+hypodermics
+hypotheses
+hypothesis
+hypothetical
+hypothetically
+hysteresis
+hysterical
+hysterically
+ice
+iceberg
+iceberg's
+icebergs
+iced
+ices
+icier
+iciest
+iciness
+icing
+icings
+icon
+icon's
+icons
+icy
+id
+id's
+idea
+idea's
+ideal
+idealism
+idealistic
+ideally
+ideals
+ideas
+identical
+identically
+identicalness
+identifiable
+identifiably
+identification
+identifications
+identified
+identifier
+identifiers
+identifies
+identify
+identifying
+identities
+identity
+identity's
+ideological
+ideologically
+ideologies
+ideology
+idiocies
+idiocy
+idiosyncrasies
+idiosyncrasy
+idiosyncrasy's
+idiosyncratic
+idiot
+idiot's
+idiotic
+idiots
+idle
+idled
+idleness
+idler
+idlers
+idles
+idlest
+idling
+idly
+idol
+idol's
+idolatry
+idols
+if
+ignition
+ignoble
+ignobleness
+ignorance
+ignorant
+ignorantly
+ignorantness
+ignore
+ignored
+ignorer
+ignores
+ignoring
+ii
+iii
+ill
+illegal
+illegalities
+illegality
+illegally
+illicit
+illicitly
+illiterate
+illiterately
+illiterateness
+illiterates
+illness
+illness's
+illnesses
+illogical
+illogically
+illogicalness
+ills
+illuminate
+illuminated
+illuminates
+illuminating
+illuminatingly
+illumination
+illuminations
+illuminative
+illusion
+illusion's
+illusions
+illusive
+illusively
+illusiveness
+illustrate
+illustrated
+illustrates
+illustrating
+illustration
+illustrations
+illustrative
+illustratively
+illustrator
+illustrator's
+illustrators
+illustrious
+illustriously
+illustriousness
+illy
+image
+imaged
+images
+imaginable
+imaginableness
+imaginably
+imaginariness
+imaginary
+imagination
+imagination's
+imaginations
+imaginative
+imaginatively
+imaginativeness
+imagine
+imagined
+imaginer
+imagines
+imaging
+imagining
+imaginings
+imbalance
+imbalances
+imitate
+imitated
+imitates
+imitating
+imitation
+imitations
+imitative
+imitatively
+imitativeness
+immaculate
+immaculately
+immaculateness
+immaterial
+immaterially
+immaterialness
+immature
+immaturely
+immatureness
+immaturity
+immediacies
+immediacy
+immediate
+immediately
+immediateness
+immemorial
+immemorially
+immense
+immensely
+immenseness
+immerse
+immersed
+immerser
+immerses
+immersing
+immersion
+immersions
+immigrant
+immigrant's
+immigrants
+immigrate
+immigrated
+immigrates
+immigrating
+immigration
+imminent
+imminently
+imminentness
+immoral
+immoralities
+immorality
+immorally
+immortal
+immortality
+immortally
+immortals
+immovability
+immovable
+immovableness
+immovably
+immune
+immunities
+immunity
+immunity's
+immunology
+immutable
+immutableness
+imp
+imp's
+impact
+impacted
+impacter
+impacting
+impaction
+impactions
+impactive
+impactor
+impactor's
+impactors
+impacts
+impair
+impaired
+impairer
+impairing
+impairs
+impart
+imparted
+impartial
+impartially
+imparting
+imparts
+impasse
+impasses
+impassion
+impassioned
+impassioning
+impassions
+impassive
+impassively
+impassiveness
+impatience
+impatient
+impatiently
+impeach
+impeached
+impeaches
+impeaching
+impedance
+impedance's
+impedances
+impede
+impeded
+impeder
+impedes
+impediment
+impediment's
+impediments
+impeding
+impel
+impels
+impending
+impenetrability
+impenetrable
+impenetrableness
+impenetrably
+imperative
+imperatively
+imperativeness
+imperatives
+imperfect
+imperfection
+imperfection's
+imperfections
+imperfective
+imperfectly
+imperfectness
+imperial
+imperialism
+imperialist
+imperialist's
+imperialists
+imperially
+imperil
+imperious
+imperiously
+imperiousness
+impermanence
+impermanent
+impermanently
+impermissible
+impersonal
+impersonally
+impersonate
+impersonated
+impersonates
+impersonating
+impersonation
+impersonations
+impertinent
+impertinently
+imperturbability
+impervious
+imperviously
+imperviousness
+impetuous
+impetuously
+impetuousness
+impetus
+impinge
+impinged
+impinges
+impinging
+impious
+impiously
+implant
+implanted
+implanter
+implanting
+implants
+implausible
+implement
+implementable
+implementation
+implementation's
+implementations
+implemented
+implementer
+implementers
+implementing
+implementor
+implementor's
+implementors
+implements
+implicant
+implicant's
+implicants
+implicate
+implicated
+implicates
+implicating
+implication
+implications
+implicative
+implicatively
+implicativeness
+implicit
+implicitly
+implicitness
+implied
+implies
+implore
+implored
+implores
+imploring
+imply
+implying
+import
+importance
+important
+importantly
+importation
+importations
+imported
+importer
+importers
+importing
+imports
+impose
+imposed
+imposer
+imposes
+imposing
+imposingly
+imposition
+imposition's
+impositions
+impossibilities
+impossibility
+impossible
+impossibleness
+impossibles
+impossibly
+impostor
+impostor's
+impostors
+impotence
+impotent
+impotently
+impoverish
+impoverished
+impoverisher
+impoverishes
+impoverishing
+impoverishment
+impracticable
+impracticableness
+impractical
+impracticality
+impractically
+impracticalness
+imprecise
+imprecisely
+impreciseness
+imprecision
+impregnable
+impregnableness
+impress
+impressed
+impresser
+impresses
+impressing
+impression
+impression's
+impressionable
+impressionableness
+impressionist
+impressionistic
+impressionists
+impressions
+impressive
+impressively
+impressiveness
+impressment
+imprint
+imprinted
+imprinting
+imprints
+imprison
+imprisoned
+imprisoning
+imprisonment
+imprisonment's
+imprisonments
+imprisons
+improbable
+improbableness
+impromptu
+improper
+improperly
+improperness
+improve
+improved
+improvement
+improvements
+improver
+improves
+improving
+improvisation
+improvisation's
+improvisational
+improvisations
+improvise
+improvised
+improviser
+improvisers
+improvises
+improvising
+imps
+impudent
+impudently
+impulse
+impulsed
+impulses
+impulsing
+impulsion
+impulsions
+impulsive
+impulsively
+impulsiveness
+impunity
+impure
+impurely
+impureness
+impurities
+impurity
+impurity's
+impute
+imputed
+imputes
+imputing
+in
+inabilities
+inability
+inaccessibility
+inaccessible
+inaccessibly
+inaccuracies
+inaccuracy
+inaccurate
+inaccurately
+inactions
+inactivation
+inactive
+inactively
+inactivity
+inadequacies
+inadequacy
+inadequate
+inadequately
+inadequateness
+inadmissibility
+inadmissible
+inadvertent
+inadvertently
+inadvisability
+inadvisable
+inalterable
+inalterableness
+inane
+inanely
+inaneness
+inaner
+inanest
+inanimate
+inanimately
+inanimateness
+inapparently
+inapplicability
+inapplicable
+inappreciable
+inappreciably
+inappreciative
+inappreciatively
+inappreciativeness
+inapproachable
+inappropriate
+inappropriately
+inappropriateness
+inapt
+inaptly
+inaptness
+inarguable
+inarguably
+inarticulable
+inartistic
+inartistically
+inasmuch
+inattentive
+inattentively
+inattentiveness
+inaudible
+inaudibly
+inaugural
+inaugurate
+inaugurated
+inaugurating
+inauguration
+inaugurations
+inauspicious
+inauspiciously
+inauspiciousness
+inauthentic
+inauthenticity
+inboards
+inborn
+inbounds
+inbred
+inbuilt
+incantation
+incantations
+incapable
+incapableness
+incapably
+incapacitating
+incarnation
+incarnation's
+incarnations
+incautious
+incautiously
+incautiousness
+incendiaries
+incendiary
+incense
+incensed
+incenses
+incensing
+incentive
+incentive's
+incentively
+incentives
+inception
+inceptions
+incessant
+incessantly
+inch
+inched
+inches
+inching
+incidence
+incidences
+incident
+incident's
+incidental
+incidentally
+incidentals
+incidents
+incipient
+incipiently
+incision
+incision's
+incisions
+incitations
+incite
+incited
+inciter
+incites
+inciting
+incivility
+inclination
+inclination's
+inclinations
+incline
+inclined
+incliner
+inclines
+inclining
+inclose
+inclosed
+incloses
+inclosing
+include
+included
+includes
+including
+inclusion
+inclusion's
+inclusions
+inclusive
+inclusively
+inclusiveness
+incoherence
+incoherences
+incoherent
+incoherently
+income
+incomer
+incomers
+incomes
+incoming
+incommensurate
+incomparability
+incomparable
+incomparably
+incompatibilities
+incompatibility
+incompatibility's
+incompatible
+incompatibly
+incompetence
+incompetent
+incompetent's
+incompetently
+incompetents
+incomplete
+incompletely
+incompleteness
+incompletion
+incomprehensibility
+incomprehensible
+incomprehensibleness
+incomprehensibly
+incomprehension
+incompressible
+incomputable
+inconceivable
+inconceivableness
+inconceivably
+inconclusive
+inconclusively
+inconclusiveness
+inconformity
+incongruence
+incongruent
+incongruently
+inconsequential
+inconsequentially
+inconsequently
+inconsiderable
+inconsiderableness
+inconsiderably
+inconsiderate
+inconsiderately
+inconsiderateness
+inconsideration
+inconsistencies
+inconsistency
+inconsistency's
+inconsistent
+inconsistently
+inconsolable
+inconsolableness
+inconspicuous
+inconspicuously
+inconspicuousness
+inconstancy
+inconstantly
+incontestable
+incontinently
+incontrollable
+inconvenience
+inconvenienced
+inconveniences
+inconveniencing
+inconvenient
+inconveniently
+inconvertibility
+inconvertible
+incorporate
+incorporated
+incorporates
+incorporating
+incorporation
+incorporative
+incorrect
+incorrectly
+incorrectness
+incorruption
+increase
+increased
+increaser
+increases
+increasing
+increasingly
+incredibility
+incredible
+incredibleness
+incredibly
+incredulity
+incredulous
+incredulously
+increment
+incremental
+incrementally
+incremented
+incrementing
+increments
+incubate
+incubated
+incubates
+incubating
+incubation
+incubative
+incubator
+incubator's
+incubators
+incur
+incurable
+incurableness
+incurables
+incurably
+incurred
+incurring
+incurs
+indebted
+indebtedness
+indecent
+indecently
+indecision
+indecisive
+indecisively
+indecisiveness
+indecomposable
+indeed
+indefinable
+indefinableness
+indefinite
+indefinitely
+indefiniteness
+indemnity
+indent
+indentation
+indentation's
+indentations
+indented
+indenter
+indenting
+indents
+independence
+independent
+independently
+independents
+indescribable
+indescribableness
+indeterminable
+indeterminableness
+indeterminacies
+indeterminacy
+indeterminacy's
+indeterminate
+indeterminately
+indeterminateness
+indetermination
+indeterminism
+indeterministic
+index
+indexable
+indexed
+indexer
+indexers
+indexes
+indexing
+indicate
+indicated
+indicates
+indicating
+indication
+indications
+indicative
+indicatively
+indicatives
+indicator
+indicator's
+indicators
+indices
+indictment
+indictment's
+indictments
+indifference
+indifferent
+indifferently
+indigenous
+indigenously
+indigenousness
+indigested
+indigestible
+indigestion
+indignant
+indignantly
+indignation
+indignities
+indignity
+indigo
+indirect
+indirected
+indirecting
+indirection
+indirections
+indirectly
+indirectness
+indirects
+indiscernible
+indiscipline
+indisciplined
+indiscreet
+indiscreetly
+indiscreetness
+indiscriminate
+indiscriminately
+indiscriminateness
+indiscriminating
+indiscriminatingly
+indiscrimination
+indispensability
+indispensable
+indispensableness
+indispensably
+indisposed
+indisposes
+indistinct
+indistinctive
+indistinctly
+indistinctness
+indistinguishable
+indistinguishableness
+individual
+individual's
+individualistic
+individuality
+individually
+individuals
+indivisibility
+indivisible
+indivisibleness
+indoctrinate
+indoctrinated
+indoctrinates
+indoctrinating
+indoctrination
+indolent
+indolently
+indomitable
+indomitableness
+indoor
+indoors
+induce
+induced
+inducement
+inducement's
+inducements
+inducer
+induces
+inducing
+induct
+inductance
+inductances
+inducted
+inducting
+induction
+induction's
+inductions
+inductive
+inductively
+inductiveness
+inductor
+inductor's
+inductors
+inducts
+indulge
+indulged
+indulgence
+indulgence's
+indulgences
+indulger
+indulges
+indulging
+industrial
+industrialist
+industrialist's
+industrialists
+industrially
+industrials
+industries
+industrious
+industriously
+industriousness
+industry
+industry's
+inedited
+ineffective
+ineffectively
+ineffectiveness
+inefficacy
+inefficiencies
+inefficiency
+inefficient
+inefficiently
+inelastically
+inelegant
+inelegantly
+ineloquent
+ineloquently
+inequalities
+inequality
+inequitably
+inequities
+inequity
+inert
+inertia
+inertias
+inertly
+inertness
+inescapable
+inescapably
+inessential
+inestimable
+inevitabilities
+inevitability
+inevitable
+inevitableness
+inevitably
+inexact
+inexactitude
+inexactly
+inexactness
+inexcusable
+inexcusableness
+inexcusably
+inexhaustible
+inexhaustibleness
+inexistent
+inexorable
+inexorableness
+inexorably
+inexpedient
+inexpediently
+inexpensive
+inexpensively
+inexpensiveness
+inexperience
+inexperienced
+inexplainable
+inexplicable
+inexplicableness
+inexplicably
+inexpressibility
+inexpressible
+inexpressibleness
+inexpressibly
+inexpressive
+inexpressively
+inexpressiveness
+inextensible
+infallibility
+infallible
+infallibly
+infamous
+infamously
+infancy
+infant
+infant's
+infantry
+infants
+infeasible
+infect
+infected
+infecting
+infection
+infection's
+infections
+infectious
+infectiously
+infectiousness
+infective
+infects
+infer
+inference
+inference's
+inferencer
+inferences
+inferencing
+inferential
+inferentially
+inferior
+inferior's
+inferiority
+inferiorly
+inferiors
+infernal
+infernally
+inferno
+inferno's
+infernos
+inferred
+inferring
+infers
+infertility
+infest
+infested
+infester
+infesting
+infests
+infidel
+infidel's
+infidelity
+infidels
+infields
+infighter
+infighter's
+infighters
+infighting
+infiltrate
+infiltrated
+infiltrates
+infiltrating
+infiltration
+infiltrative
+infinite
+infinitely
+infiniteness
+infinitesimal
+infinitesimally
+infinities
+infinitive
+infinitive's
+infinitively
+infinitives
+infinitum
+infinity
+infirmity
+infix
+infix's
+infixes
+inflame
+inflamed
+inflamer
+inflaming
+inflammable
+inflammableness
+inflatable
+inflate
+inflated
+inflater
+inflates
+inflating
+inflation
+inflationary
+inflexibility
+inflexible
+inflexibleness
+inflexibly
+inflict
+inflicted
+inflicter
+inflicting
+inflictive
+inflicts
+inflows
+influence
+influenced
+influencer
+influences
+influencing
+influent
+influential
+influentially
+influenza
+inform
+informal
+informality
+informally
+informant
+informant's
+informants
+information
+informational
+informations
+informative
+informatively
+informativeness
+informed
+informer
+informers
+informing
+informs
+infractions
+infrastructure
+infrastructures
+infrequent
+infrequently
+infringe
+infringed
+infringement
+infringement's
+infringements
+infringer
+infringes
+infringing
+infuriate
+infuriated
+infuriately
+infuriates
+infuriating
+infuriatingly
+infuriation
+infuse
+infused
+infuser
+infuses
+infusing
+infusion
+infusions
+ingenious
+ingeniously
+ingeniousness
+ingenuity
+inglorious
+ingloriously
+ingloriousness
+ingot
+ingrained
+ingrainedly
+ingrains
+ingratitude
+ingredient
+ingredient's
+ingredients
+ingrown
+ingrownness
+ingrowth
+ingrowths
+inhabit
+inhabitable
+inhabitance
+inhabitant
+inhabitant's
+inhabitants
+inhabited
+inhabiter
+inhabiting
+inhabits
+inhale
+inhaled
+inhaler
+inhales
+inhaling
+inharmonious
+inharmoniously
+inharmoniousness
+inhere
+inhered
+inherent
+inherently
+inheres
+inhering
+inherit
+inheritable
+inheritableness
+inheritance
+inheritance's
+inheritances
+inherited
+inheriting
+inheritor
+inheritor's
+inheritors
+inheritress
+inheritress's
+inheritresses
+inheritrices
+inheritrix
+inherits
+inhibit
+inhibited
+inhibiter
+inhibiting
+inhibition
+inhibition's
+inhibitions
+inhibitive
+inhibitors
+inhibits
+inholding
+inholdings
+inhomogeneities
+inhomogeneity
+inhospitable
+inhospitableness
+inhospitably
+inhospitality
+inhuman
+inhumane
+inhumanely
+inhumanities
+inhumanly
+inhumanness
+inion
+iniquities
+iniquity
+iniquity's
+initial
+initialness
+initials
+initiate
+initiated
+initiates
+initiating
+initiation
+initiations
+initiative
+initiative's
+initiatives
+initiator
+initiator's
+initiators
+inject
+injected
+injecting
+injection
+injection's
+injections
+injective
+injects
+injudicious
+injudiciously
+injudiciousness
+injunction
+injunction's
+injunctions
+injure
+injured
+injurer
+injures
+injuries
+injuring
+injurious
+injuriously
+injuriousness
+injury
+injury's
+injustice
+injustice's
+injustices
+ink
+inked
+inker
+inkers
+inking
+inkings
+inkling
+inkling's
+inklings
+inks
+inlaid
+inland
+inlander
+inlet
+inlet's
+inlets
+inlier
+inly
+inlying
+inmate
+inmate's
+inmates
+inn
+innards
+innate
+innately
+innateness
+inner
+innerly
+innermost
+inning
+innings
+innocence
+innocent
+innocently
+innocents
+innocuous
+innocuously
+innocuousness
+innovate
+innovated
+innovates
+innovating
+innovation
+innovation's
+innovations
+innovative
+innovativeness
+inns
+innumerability
+innumerable
+innumerableness
+innumerably
+inoperable
+inopportune
+inopportunely
+inopportuneness
+inordinate
+inordinately
+inordinateness
+inorganic
+input
+input's
+inputed
+inputer
+inputing
+inputs
+inputting
+inquietude
+inquire
+inquired
+inquirer
+inquirers
+inquires
+inquiries
+inquiring
+inquiringly
+inquiry
+inquiry's
+inquisition
+inquisition's
+inquisitions
+inquisitive
+inquisitively
+inquisitiveness
+inroad
+inroads
+ins
+insane
+insanely
+insaneness
+insanitary
+insanity
+inscribe
+inscribed
+inscriber
+inscribes
+inscribing
+inscription
+inscription's
+inscriptions
+insect
+insect's
+insects
+insecure
+insecurely
+insecureness
+insecurity
+insensible
+insensibleness
+insensibly
+insensitive
+insensitively
+insensitiveness
+insensitivity
+inseparable
+inseparableness
+insert
+inserted
+inserter
+inserting
+insertion
+insertion's
+insertions
+inserts
+insets
+insetting
+inside
+insider
+insiders
+insides
+insidious
+insidiously
+insidiousness
+insight
+insight's
+insightful
+insightfully
+insights
+insignia
+insignias
+insignificance
+insignificances
+insignificant
+insignificantly
+insincerity
+insinuate
+insinuated
+insinuates
+insinuating
+insinuatingly
+insinuation
+insinuations
+insinuative
+insist
+insisted
+insistence
+insistent
+insistently
+insisting
+insists
+insociability
+insociable
+insociably
+insofar
+insolence
+insolent
+insolently
+insolubility
+insoluble
+insolubleness
+insolvable
+inspect
+inspected
+inspecting
+inspection
+inspection's
+inspections
+inspective
+inspector
+inspector's
+inspectors
+inspects
+inspiration
+inspiration's
+inspirations
+inspire
+inspired
+inspirer
+inspires
+inspiring
+instabilities
+instability
+install
+installation
+installation's
+installations
+installed
+installer
+installers
+installing
+installment
+installment's
+installments
+installs
+instance
+instanced
+instances
+instancing
+instant
+instantaneous
+instantaneously
+instantaneousness
+instanter
+instantiate
+instantiated
+instantiates
+instantiating
+instantiation
+instantiation's
+instantiations
+instantly
+instantness
+instants
+instated
+instates
+instead
+insteps
+instigate
+instigated
+instigates
+instigating
+instigation
+instigative
+instigator
+instigator's
+instigators
+instills
+instinct
+instinct's
+instinctive
+instinctively
+instincts
+institute
+instituted
+instituter
+instituters
+institutes
+instituting
+institution
+institution's
+institutional
+institutionally
+institutions
+institutive
+instruct
+instructed
+instructing
+instruction
+instruction's
+instructional
+instructions
+instructive
+instructively
+instructiveness
+instructor
+instructor's
+instructors
+instructs
+instrument
+instrumental
+instrumentalist
+instrumentalist's
+instrumentalists
+instrumentally
+instrumentals
+instrumentation
+instrumented
+instrumenting
+instruments
+insufficiencies
+insufficiency
+insufficient
+insufficiently
+insulate
+insulated
+insulates
+insulating
+insulation
+insulations
+insulator
+insulator's
+insulators
+insult
+insulted
+insulter
+insulting
+insultingly
+insults
+insuperable
+insupportable
+insupportableness
+insurance
+insurances
+insure
+insured
+insurer
+insurers
+insures
+insurgent
+insurgent's
+insurgents
+insuring
+insurmountable
+insurrection
+insurrection's
+insurrections
+insusceptible
+intact
+intactness
+intakes
+intangible
+intangible's
+intangibleness
+intangibles
+intangibly
+integer
+integer's
+integers
+integral
+integral's
+integrally
+integrals
+integrate
+integrated
+integrates
+integrating
+integration
+integrations
+integrative
+integrity
+intellect
+intellect's
+intellective
+intellectively
+intellects
+intellectual
+intellectually
+intellectualness
+intellectuals
+intelligence
+intelligencer
+intelligences
+intelligent
+intelligently
+intelligibility
+intelligible
+intelligibleness
+intelligibly
+intemperance
+intemperate
+intemperately
+intemperateness
+intend
+intended
+intendedly
+intendedness
+intender
+intending
+intends
+intense
+intensely
+intenseness
+intensification
+intensified
+intensifier
+intensifiers
+intensifies
+intensify
+intensifying
+intension
+intensities
+intensity
+intensive
+intensively
+intensiveness
+intent
+intention
+intentional
+intentionally
+intentioned
+intentions
+intently
+intentness
+intents
+interact
+interacted
+interacting
+interaction
+interaction's
+interactions
+interactive
+interactively
+interactivity
+interacts
+intercept
+intercepted
+intercepter
+intercepting
+intercepts
+interchange
+interchangeability
+interchangeable
+interchangeableness
+interchangeably
+interchanged
+interchanger
+interchanges
+interchanging
+interchangings
+intercity
+intercommunicate
+intercommunicated
+intercommunicates
+intercommunicating
+intercommunication
+interconnect
+interconnected
+interconnectedness
+interconnecting
+interconnection
+interconnection's
+interconnections
+interconnectivity
+interconnects
+intercourse
+interdependence
+interdependencies
+interdependency
+interdependent
+interdependently
+interdisciplinary
+interest
+interested
+interestedly
+interesting
+interestingly
+interestingness
+interests
+interface
+interfaced
+interfacer
+interfaces
+interfacing
+interfere
+interfered
+interference
+interferences
+interferer
+interferes
+interfering
+interferingly
+interim
+interior
+interior's
+interiorly
+interiors
+interlace
+interlaced
+interlaces
+interlacing
+interleave
+interleaved
+interleaves
+interleaving
+interlink
+interlinked
+interlinking
+interlinks
+interlisp
+interlisp's
+intermediaries
+intermediary
+intermediate
+intermediate's
+intermediated
+intermediately
+intermediateness
+intermediates
+intermediating
+intermediation
+interminable
+intermingle
+intermingled
+intermingles
+intermingling
+intermittent
+intermittently
+intermix
+intermixed
+intermixer
+intermixes
+intermixing
+intermodule
+intern
+internal
+internally
+internals
+international
+internationality
+internationally
+internationals
+interned
+interning
+interns
+interpersonal
+interpersonally
+interplay
+interpolate
+interpolated
+interpolates
+interpolating
+interpolation
+interpolations
+interpolative
+interpose
+interposed
+interposer
+interposes
+interposing
+interpret
+interpretable
+interpretation
+interpretation's
+interpretations
+interpreted
+interpreter
+interpreters
+interpreting
+interpretive
+interpretively
+interprets
+interprocess
+interrelate
+interrelated
+interrelatedly
+interrelatedness
+interrelates
+interrelating
+interrelation
+interrelations
+interrelationship
+interrelationship's
+interrelationships
+interrogate
+interrogated
+interrogates
+interrogating
+interrogation
+interrogations
+interrogative
+interrogatively
+interrogatives
+interrupt
+interrupted
+interrupter
+interrupters
+interruptible
+interrupting
+interruption
+interruption's
+interruptions
+interruptive
+interrupts
+intersect
+intersected
+intersecting
+intersection
+intersection's
+intersections
+intersects
+intersperse
+interspersed
+intersperses
+interspersing
+interspersion
+interspersions
+interstage
+interstate
+intertask
+intertwine
+intertwined
+intertwines
+intertwining
+interval
+interval's
+intervals
+intervene
+intervened
+intervener
+intervenes
+intervening
+intervention
+intervention's
+interventions
+interview
+interviewed
+interviewee
+interviewee's
+interviewees
+interviewer
+interviewer's
+interviewers
+interviewing
+interviews
+interwoven
+intestinal
+intestinally
+intestine
+intestine's
+intestines
+intimacy
+intimate
+intimated
+intimately
+intimateness
+intimater
+intimates
+intimating
+intimation
+intimations
+intimidate
+intimidated
+intimidates
+intimidating
+intimidation
+into
+intolerability
+intolerable
+intolerableness
+intolerably
+intolerance
+intolerant
+intolerantly
+intolerantness
+intonation
+intonation's
+intonations
+intoned
+intoner
+intoxicate
+intoxicated
+intoxicatedly
+intoxicating
+intoxication
+intractability
+intractable
+intractableness
+intractably
+intramural
+intramurally
+intransigent
+intransigently
+intransigents
+intransitive
+intransitively
+intransitiveness
+intraprocess
+intricacies
+intricacy
+intricate
+intricately
+intricateness
+intrigue
+intrigued
+intriguer
+intrigues
+intriguing
+intriguingly
+intrinsic
+intrinsically
+intrinsics
+introduce
+introduced
+introducer
+introduces
+introducing
+introduction
+introduction's
+introductions
+introductory
+introspect
+introspection
+introspections
+introspective
+introspectively
+introspectiveness
+introvert
+introverted
+intrude
+intruded
+intruder
+intruder's
+intruders
+intrudes
+intruding
+intrusion
+intrusion's
+intrusions
+intrusive
+intrusively
+intrusiveness
+intrust
+intubate
+intubated
+intubates
+intubating
+intubation
+intuition
+intuition's
+intuitionist
+intuitions
+intuitive
+intuitively
+intuitiveness
+invade
+invaded
+invader
+invaders
+invades
+invading
+invalid
+invalidate
+invalidated
+invalidates
+invalidating
+invalidation
+invalidations
+invalidities
+invalidity
+invalidly
+invalidness
+invalids
+invaluable
+invaluableness
+invaluably
+invariability
+invariable
+invariableness
+invariably
+invariance
+invariant
+invariantly
+invariants
+invasion
+invasion's
+invasions
+invent
+invented
+inventing
+invention
+invention's
+inventions
+inventive
+inventively
+inventiveness
+inventor
+inventor's
+inventories
+inventors
+inventory
+inventory's
+invents
+inveracity
+inverse
+inversely
+inverses
+inversion
+inversions
+inversive
+invert
+invertebrate
+invertebrate's
+invertebrates
+inverted
+inverter
+inverters
+invertible
+inverting
+inverts
+invest
+invested
+investigate
+investigated
+investigates
+investigating
+investigation
+investigations
+investigative
+investigator
+investigator's
+investigators
+investing
+investment
+investment's
+investments
+investor
+investor's
+investors
+invests
+inviability
+inviable
+invincible
+invincibleness
+invisibility
+invisible
+invisibleness
+invisibly
+invitation
+invitation's
+invitations
+invite
+invited
+inviter
+invites
+inviting
+invitingly
+invocation
+invocation's
+invocations
+invoice
+invoiced
+invoices
+invoicing
+invokable
+invoke
+invoked
+invoker
+invokers
+invokes
+invoking
+involuntarily
+involuntariness
+involuntary
+involve
+involved
+involvedly
+involvement
+involvement's
+involvements
+involver
+involves
+involving
+invulnerable
+invulnerableness
+inward
+inwardly
+inwardness
+inwards
+inwrought
+ioctl
+iodine
+ion
+ions
+irate
+irately
+irateness
+ire
+ire's
+ires
+iris
+irises
+irk
+irked
+irking
+irks
+irksome
+irksomely
+irksomeness
+iron
+ironed
+ironer
+ironical
+ironically
+ironicalness
+ironies
+ironing
+ironings
+ironness
+irons
+ironwork
+ironwork's
+ironworker
+ironworks
+irony
+irrational
+irrationality
+irrationally
+irrationalness
+irrationals
+irrecoverable
+irrecoverableness
+irreducible
+irreducibly
+irreflexive
+irrefutable
+irregular
+irregularities
+irregularity
+irregularly
+irregulars
+irrelevance
+irrelevances
+irrelevant
+irrelevantly
+irrepressible
+irresistible
+irresistibleness
+irrespective
+irrespectively
+irresponsible
+irresponsibleness
+irresponsibly
+irreversible
+irrigate
+irrigated
+irrigates
+irrigating
+irrigation
+irrigations
+irritate
+irritated
+irritates
+irritating
+irritatingly
+irritation
+irritations
+irritative
+is
+island
+islander
+islanders
+islands
+isle
+isle's
+isles
+islet
+islet's
+islets
+isling
+isn't
+isolate
+isolated
+isolates
+isolating
+isolation
+isolations
+isometric
+isometrics
+isomorphic
+isomorphically
+isomorphism
+isomorphism's
+isomorphisms
+isotope
+isotope's
+isotopes
+ispell
+ispell's
+issuance
+issue
+issued
+issuer
+issuers
+issues
+issuing
+isthmus
+it
+it'd
+it'll
+it's
+italic
+italics
+itch
+itches
+itching
+item
+item's
+items
+iterate
+iterated
+iterates
+iterating
+iteration
+iterations
+iterative
+iteratively
+iterator
+iterator's
+iterators
+itineraries
+itinerary
+its
+itself
+iv
+ivied
+ivies
+ivories
+ivory
+ivy
+ivy's
+ix
+jab
+jab's
+jabbed
+jabbing
+jabs
+jack
+jacked
+jacker
+jacket
+jacketed
+jackets
+jacking
+jacks
+jade
+jaded
+jadedly
+jadedness
+jades
+jading
+jail
+jailed
+jailer
+jailers
+jailing
+jails
+jam
+jammed
+jamming
+jams
+janitor
+janitor's
+janitors
+jar
+jar's
+jargon
+jarred
+jarring
+jarringly
+jars
+jaunt
+jaunt's
+jaunted
+jauntier
+jauntiness
+jaunting
+jaunts
+jaunty
+javelin
+javelin's
+javelins
+jaw
+jaw's
+jawed
+jaws
+jay
+jazz
+jealous
+jealousies
+jealously
+jealousness
+jealousy
+jean
+jean's
+jeans
+jeep
+jeep's
+jeeped
+jeepers
+jeeping
+jeeps
+jeer
+jeer's
+jeerer
+jeers
+jellied
+jellies
+jelly
+jelly's
+jellyfish
+jellying
+jenny
+jerk
+jerked
+jerker
+jerkier
+jerkiness
+jerking
+jerkings
+jerks
+jerky
+jersey
+jersey's
+jerseys
+jest
+jested
+jester
+jesting
+jests
+jet
+jet's
+jets
+jetted
+jetting
+jewel
+jewelries
+jewelry
+jewels
+jig
+jig's
+jigs
+jingle
+jingled
+jingler
+jingles
+jingling
+job
+job's
+jobs
+jocks
+jocund
+jocundly
+jog
+jogs
+john
+john's
+johns
+join
+joined
+joiner
+joiners
+joining
+joins
+joint
+joint's
+jointed
+jointedly
+jointedness
+jointer
+jointing
+jointly
+jointness
+joints
+joke
+joked
+joker
+jokers
+jokes
+joking
+jokingly
+jollied
+jollier
+jollies
+jolly
+jollying
+jolt
+jolted
+jolter
+jolting
+jolts
+jostle
+jostled
+jostles
+jostling
+jot
+jots
+jotted
+jotting
+journal
+journal's
+journalism
+journalist
+journalist's
+journalistic
+journalists
+journals
+journey
+journeyed
+journeying
+journeyings
+journeys
+joust
+jousted
+jouster
+jousting
+jousts
+joy
+joy's
+joyful
+joyfully
+joyfulness
+joyous
+joyously
+joyousness
+joys
+jubilee
+judge
+judged
+judger
+judges
+judging
+judicable
+judicial
+judicially
+judiciaries
+judiciary
+judicious
+judiciously
+judiciousness
+jug
+jug's
+juggle
+juggled
+juggler
+jugglers
+juggles
+juggling
+jugs
+juice
+juice's
+juiced
+juicer
+juicers
+juices
+juicier
+juiciest
+juiciness
+juicing
+juicy
+jumble
+jumbled
+jumbles
+jumbling
+jump
+jumped
+jumper
+jumpers
+jumpier
+jumpiness
+jumping
+jumps
+jumpy
+junction
+junction's
+junctions
+juncture
+juncture's
+junctures
+jungle
+jungle's
+jungled
+jungles
+junior
+junior's
+juniors
+juniper
+junk
+junker
+junkers
+junkie
+junkies
+junks
+junky
+juries
+jurisdiction
+jurisdiction's
+jurisdictions
+juror
+juror's
+jurors
+jury
+jury's
+just
+juster
+justice
+justice's
+justices
+justifiable
+justifiably
+justification
+justifications
+justified
+justifier
+justifier's
+justifiers
+justifies
+justify
+justifying
+justing
+justly
+justness
+jut
+juvenile
+juvenile's
+juveniles
+juxtapose
+juxtaposed
+juxtaposes
+juxtaposing
+kHz
+keel
+keeled
+keeler
+keeling
+keels
+keen
+keener
+keenest
+keening
+keenly
+keenness
+keep
+keeper
+keepers
+keeping
+keeps
+ken
+kennel
+kennel's
+kennels
+kept
+kerchief
+kerchief's
+kerchiefed
+kerchiefs
+kernel
+kernel's
+kernels
+kerosene
+ketchup
+kettle
+kettle's
+kettles
+key
+keyboard
+keyboard's
+keyboarder
+keyboarding
+keyboards
+keyclick
+keyclick's
+keyclicks
+keyed
+keying
+keypad
+keypad's
+keypads
+keys
+keystroke
+keystroke's
+keystrokes
+keyword
+keyword's
+keywords
+kick
+kicked
+kicker
+kickers
+kicking
+kicks
+kid
+kid's
+kidded
+kidding
+kiddingly
+kidnap
+kidnap's
+kidnaps
+kidney
+kidney's
+kidneys
+kids
+kill
+killed
+killer
+killers
+killing
+killingly
+killings
+kills
+kilobit
+kilobits
+kilobyte
+kilobytes
+kin
+kind
+kinder
+kindergarten
+kindest
+kindhearted
+kindheartedly
+kindheartedness
+kindle
+kindled
+kindler
+kindles
+kindlier
+kindliness
+kindling
+kindly
+kindness
+kindnesses
+kindred
+kinds
+king
+kingdom
+kingdom's
+kingdoms
+kinglier
+kingliness
+kingly
+kings
+kinkier
+kinkiness
+kinky
+kinship
+kinsman
+kiss
+kissed
+kisser
+kissers
+kisses
+kissing
+kissings
+kit
+kit's
+kitchen
+kitchen's
+kitchener
+kitchens
+kite
+kited
+kiter
+kites
+kiting
+kits
+kitsch
+kitten
+kitten's
+kittened
+kittening
+kittens
+kitties
+kitty
+kludge
+kludge's
+kludged
+kludger
+kludger's
+kludgers
+kludges
+kludgey
+kludging
+klutz
+klutz's
+klutzes
+klutziness
+klutzy
+knack
+knacker
+knacks
+knapsack
+knapsack's
+knapsacks
+knave
+knave's
+knaves
+knead
+kneaded
+kneader
+kneading
+kneads
+knee
+kneed
+kneeing
+kneel
+kneeled
+kneeler
+kneeling
+kneels
+knees
+knell
+knell's
+knells
+knelt
+knew
+knife
+knifed
+knifes
+knifing
+knight
+knighted
+knighthood
+knighting
+knightliness
+knightly
+knights
+knit
+knits
+knives
+knob
+knob's
+knobs
+knock
+knocked
+knocker
+knockers
+knocking
+knocks
+knoll
+knoll's
+knolls
+knot
+knot's
+knots
+knotted
+knotting
+know
+knowable
+knower
+knowhow
+knowing
+knowingly
+knowledge
+knowledgeable
+knowledgeableness
+knowledges
+known
+knows
+knuckle
+knuckled
+knuckles
+knuckling
+kudos
+lab
+lab's
+label
+label's
+labels
+laboratories
+laboratory
+laboratory's
+labs
+labyrinth
+labyrinths
+lace
+laced
+lacer
+lacerate
+lacerated
+lacerates
+lacerating
+laceration
+lacerations
+lacerative
+laces
+lacing
+lack
+lackadaisical
+lackadaisically
+lacked
+lacker
+lacking
+lacks
+lacquer
+lacquered
+lacquerer
+lacquerers
+lacquering
+lacquers
+lad
+ladder
+ladders
+laded
+laden
+ladened
+ladening
+ladies
+lading
+lads
+lady
+lady's
+lag
+lager
+lagers
+lagged
+lagoon
+lagoon's
+lagoons
+lags
+laid
+lain
+lair
+lair's
+lairs
+lake
+lake's
+laker
+lakes
+laking
+lamb
+lamb's
+lambda
+lambda's
+lambdas
+lamber
+lambs
+lame
+lamed
+lamely
+lameness
+lament
+lamentable
+lamentableness
+lamentation
+lamentation's
+lamentations
+lamented
+lamenting
+laments
+lamer
+lames
+lamest
+laminar
+laming
+lamp
+lamp's
+lamper
+lamps
+lance
+lanced
+lancer
+lancers
+lances
+lancing
+land
+landed
+lander
+landers
+landing
+landings
+landladies
+landlady
+landlady's
+landlord
+landlord's
+landlords
+landmark
+landmark's
+landmarks
+landowner
+landowner's
+landowners
+lands
+landscape
+landscaped
+landscaper
+landscapes
+landscaping
+lane
+lane's
+lanes
+language
+language's
+languages
+languid
+languidly
+languidness
+languish
+languished
+languisher
+languishes
+languishing
+languishingly
+lantern
+lantern's
+lanterns
+lap
+lap's
+lapel
+lapel's
+lapels
+laps
+lapse
+lapsed
+lapser
+lapses
+lapsing
+lard
+larded
+larder
+larding
+lards
+large
+largely
+largeness
+larger
+largest
+lark
+lark's
+larker
+larks
+larva
+larvae
+larvas
+laser
+laser's
+lasers
+lash
+lashed
+lasher
+lashes
+lashing
+lashings
+lass
+lass's
+lasses
+last
+lasted
+laster
+lasting
+lastingly
+lastingness
+lastly
+lasts
+latch
+latched
+latches
+latching
+late
+lated
+lately
+latencies
+latency
+latency's
+lateness
+latent
+latently
+latents
+later
+lateral
+laterally
+latest
+latex
+latex's
+latexes
+lath
+lather
+lathered
+latherer
+lathering
+lathes
+lathing
+latitude
+latitude's
+latitudes
+latrine
+latrine's
+latrines
+latter
+latter's
+latterly
+lattice
+lattice's
+latticed
+lattices
+latticing
+laugh
+laughable
+laughableness
+laughably
+laughed
+laugher
+laughers
+laughing
+laughingly
+laughs
+laughter
+laughters
+launch
+launched
+launcher
+launchers
+launches
+launching
+launchings
+launder
+laundered
+launderer
+laundering
+launderings
+launders
+laundries
+laundry
+laurel
+laurel's
+laurels
+lava
+lavatories
+lavatory
+lavatory's
+lavender
+lavendered
+lavendering
+lavish
+lavished
+lavishing
+lavishly
+lavishness
+law
+law's
+lawful
+lawfully
+lawfulness
+lawless
+lawlessly
+lawlessness
+lawn
+lawn's
+lawns
+laws
+lawsuit
+lawsuit's
+lawsuits
+lawyer
+lawyer's
+lawyerly
+lawyers
+lay
+layer
+layered
+layering
+layers
+laying
+layman
+laymen
+layoffs
+layout
+layout's
+layouts
+lays
+lazed
+lazied
+lazier
+laziest
+lazily
+laziness
+lazing
+lazy
+lazying
+lead
+leaded
+leaden
+leadenly
+leadenness
+leader
+leader's
+leaders
+leadership
+leadership's
+leaderships
+leading
+leadings
+leads
+leaf
+leafed
+leafier
+leafiest
+leafing
+leafless
+leaflet
+leaflet's
+leaflets
+leafs
+leafy
+league
+leagued
+leaguer
+leaguers
+leagues
+leaguing
+leak
+leakage
+leakage's
+leakages
+leaked
+leaker
+leaking
+leaks
+lean
+leaned
+leaner
+leanest
+leaning
+leanings
+leanly
+leanness
+leans
+leap
+leaped
+leaper
+leaping
+leaps
+leapt
+learn
+learned
+learnedly
+learnedness
+learner
+learners
+learning
+learnings
+learns
+lease
+leased
+leases
+leash
+leash's
+leashes
+leasing
+least
+leather
+leathered
+leathering
+leathern
+leathers
+leave
+leaved
+leaven
+leavened
+leavening
+leaver
+leavers
+leaves
+leaving
+leavings
+lecture
+lectured
+lecturer
+lecturers
+lectures
+lecturing
+led
+ledge
+ledger
+ledgers
+ledges
+lee
+leech
+leech's
+leeches
+leer
+leered
+leering
+leers
+lees
+left
+leftist
+leftist's
+leftists
+leftmost
+leftover
+leftover's
+leftovers
+lefts
+leftward
+leftwards
+leg
+legacies
+legacy
+legacy's
+legal
+legalities
+legality
+legally
+legals
+legend
+legend's
+legendary
+legends
+legged
+leggings
+legibility
+legible
+legibly
+legion
+legion's
+legions
+legislate
+legislated
+legislates
+legislating
+legislation
+legislations
+legislative
+legislatively
+legislator
+legislator's
+legislators
+legislature
+legislature's
+legislatures
+legitimacy
+legitimate
+legitimated
+legitimately
+legitimates
+legitimating
+legitimation
+legs
+leisure
+leisured
+leisureliness
+leisurely
+lemma
+lemma's
+lemmas
+lemon
+lemon's
+lemonade
+lemons
+lend
+lender
+lenders
+lending
+lends
+length
+lengthen
+lengthened
+lengthener
+lengthening
+lengthens
+lengthier
+lengthiness
+lengthly
+lengths
+lengthwise
+lengthy
+leniency
+lenient
+leniently
+lens
+lens's
+lensed
+lenser
+lensers
+lenses
+lensing
+lensings
+lent
+lentil
+lentil's
+lentils
+leopard
+leopard's
+leopards
+leprosy
+less
+lessen
+lessened
+lessening
+lessens
+lesser
+lesses
+lessing
+lesson
+lesson's
+lessoned
+lessoning
+lessons
+lest
+lester
+let
+let's
+lets
+letter
+lettered
+letterer
+lettering
+letters
+letting
+lettuce
+levee
+levee's
+leveed
+levees
+level
+levelly
+levelness
+levels
+lever
+lever's
+leverage
+leveraged
+leverages
+leveraging
+levered
+levering
+levers
+levied
+levier
+levies
+levy
+levying
+lewd
+lewdly
+lewdness
+lexical
+lexically
+lexicographic
+lexicographical
+lexicographically
+lexicon
+lexicon's
+lexicons
+liabilities
+liability
+liability's
+liable
+liableness
+liaison
+liaison's
+liaisons
+liar
+liar's
+liars
+liberal
+liberally
+liberalness
+liberals
+liberate
+liberated
+liberates
+liberating
+liberation
+liberator
+liberator's
+liberators
+liberties
+liberty
+liberty's
+libido
+librarian
+librarian's
+librarians
+libraries
+library
+library's
+libretti
+license
+licensed
+licensee
+licensee's
+licensees
+licenser
+licenses
+licensing
+lichen
+lichen's
+lichened
+lichens
+lick
+licked
+licker
+licking
+licks
+lid
+lid's
+lids
+lie
+lied
+lieder
+liege
+lien
+lien's
+liens
+lier
+lies
+lieu
+lieutenant
+lieutenant's
+lieutenants
+life
+life's
+lifeless
+lifelessly
+lifelessness
+lifelike
+lifelikeness
+lifelong
+lifer
+lifers
+lifestyle
+lifestyles
+lifetime
+lifetime's
+lifetimes
+lift
+lifted
+lifter
+lifters
+lifting
+lifts
+light
+lighted
+lighten
+lightened
+lightener
+lightening
+lightens
+lighter
+lighter's
+lighters
+lightest
+lighthouse
+lighthouse's
+lighthouses
+lighting
+lightly
+lightness
+lightning
+lightning's
+lightninged
+lightnings
+lights
+lightweight
+lightweights
+like
+liked
+likelier
+likeliest
+likelihood
+likelihoods
+likeliness
+likely
+liken
+likened
+likeness
+likeness's
+likenesses
+likening
+likens
+liker
+likes
+likest
+likewise
+liking
+likings
+lilac
+lilac's
+lilacs
+lilied
+lilies
+lily
+lily's
+limb
+limbed
+limber
+limbered
+limbering
+limberly
+limberness
+limbers
+limbs
+lime
+lime's
+limed
+limes
+limestone
+liming
+limit
+limitability
+limitably
+limitation
+limitation's
+limitations
+limited
+limitedly
+limitedness
+limiteds
+limiter
+limiters
+limiting
+limits
+limp
+limped
+limper
+limping
+limply
+limpness
+limps
+linden
+line
+line's
+linear
+linearities
+linearity
+linearly
+lined
+linen
+linen's
+linens
+liner
+liners
+lines
+linger
+lingered
+lingerer
+lingering
+lingeringly
+lingers
+linguist
+linguist's
+linguistic
+linguistically
+linguistics
+linguists
+lining
+linings
+link
+linkage
+linkage's
+linkages
+linked
+linker
+linkers
+linking
+linkings
+links
+linoleum
+linseed
+lint
+linter
+lints
+lion
+lion's
+lioness
+lioness's
+lionesses
+lions
+lip
+lip's
+lips
+lipstick
+liquefied
+liquefier
+liquefiers
+liquefies
+liquefy
+liquefying
+liquid
+liquid's
+liquidation
+liquidation's
+liquidations
+liquidity
+liquidly
+liquidness
+liquids
+liquor
+liquor's
+liquored
+liquoring
+liquors
+lisp
+lisp's
+lisped
+lisper
+lisping
+lisps
+list
+listed
+listen
+listened
+listener
+listeners
+listening
+listens
+lister
+listers
+listing
+listing's
+listings
+lists
+lit
+literacy
+literal
+literally
+literalness
+literals
+literariness
+literary
+literate
+literately
+literateness
+literation
+literature
+literature's
+literatures
+lithe
+lithely
+litheness
+litigate
+litigated
+litigates
+litigating
+litigation
+litigator
+litter
+littered
+litterer
+littering
+litters
+little
+littleness
+littler
+littlest
+livable
+livableness
+livably
+live
+lived
+livelier
+liveliest
+livelihood
+liveliness
+lively
+liven
+livened
+liveness
+livening
+liver
+liveried
+livers
+livery
+lives
+livest
+liveth
+living
+livingly
+livingness
+livings
+lizard
+lizard's
+lizards
+load
+loaded
+loader
+loaders
+loading
+loadings
+loads
+loaf
+loafed
+loafer
+loafers
+loafing
+loafs
+loan
+loaned
+loaner
+loaning
+loans
+loath
+loathe
+loathed
+loather
+loathes
+loathing
+loathly
+loathness
+loathsome
+loathsomely
+loathsomeness
+loaves
+lobbied
+lobbies
+lobby
+lobbying
+lobe
+lobe's
+lobed
+lobes
+lobster
+lobster's
+lobsters
+local
+localities
+locality
+locality's
+locally
+locals
+locate
+located
+locater
+locates
+locating
+location
+locations
+locative
+locatives
+locator
+locator's
+locators
+loci
+lock
+locked
+locker
+lockers
+locking
+lockings
+lockout
+lockout's
+lockouts
+locks
+lockup
+lockup's
+lockups
+locomotion
+locomotive
+locomotive's
+locomotively
+locomotives
+locus
+locus's
+locust
+locust's
+locusts
+lodge
+lodged
+lodger
+lodger's
+lodgers
+lodges
+lodging
+lodgings
+loft
+loft's
+lofter
+loftier
+loftiness
+lofts
+lofty
+log
+log's
+logarithm
+logarithm's
+logarithmically
+logarithms
+logged
+logger
+logger's
+loggers
+logging
+logic
+logic's
+logical
+logically
+logicalness
+logicals
+logician
+logician's
+logicians
+logics
+login
+logins
+logistic
+logistics
+logout
+logs
+loin
+loin's
+loins
+loiter
+loitered
+loiterer
+loitering
+loiters
+lone
+lonelier
+loneliest
+loneliness
+lonely
+loneness
+loner
+loners
+lonesome
+lonesomely
+lonesomeness
+long
+longed
+longer
+longest
+longing
+longingly
+longings
+longitude
+longitude's
+longitudes
+longly
+longness
+longs
+longword
+longword's
+longwords
+look
+lookahead
+looked
+looker
+lookers
+looking
+lookout
+lookouts
+looks
+lookup
+lookup's
+lookups
+loom
+loomed
+looming
+looms
+loon
+loop
+looped
+looper
+loophole
+loophole's
+loopholed
+loopholes
+loopholing
+looping
+loops
+loose
+loosed
+loosely
+loosen
+loosened
+loosener
+looseness
+loosening
+loosens
+looser
+looses
+loosest
+loosing
+loot
+looted
+looter
+looting
+loots
+lord
+lord's
+lording
+lordlier
+lordliness
+lordly
+lords
+lordship
+lore
+lorries
+lorry
+lose
+loser
+losers
+loses
+losing
+losings
+loss
+loss's
+losses
+lossier
+lossiest
+lossy
+lost
+lostness
+lot
+lot's
+lots
+lotteries
+lottery
+lotus
+loud
+louden
+loudened
+loudening
+louder
+loudest
+loudly
+loudness
+loudspeaker
+loudspeaker's
+loudspeakers
+lounge
+lounged
+lounger
+loungers
+lounges
+lounging
+lousier
+lousiness
+lousy
+lovable
+lovableness
+lovably
+love
+love's
+loved
+lovelier
+lovelies
+loveliest
+loveliness
+lovely
+lover
+lover's
+lovering
+loverly
+lovers
+loves
+loving
+lovingly
+lovingness
+low
+lower
+lowered
+lowering
+lowers
+lowest
+lowing
+lowland
+lowlander
+lowlands
+lowlier
+lowliest
+lowliness
+lowly
+lowness
+lows
+loyal
+loyally
+loyalties
+loyalty
+loyalty's
+lubricant
+lubricant's
+lubricants
+lubrication
+luck
+lucked
+luckier
+luckiest
+luckily
+luckiness
+luckless
+lucks
+lucky
+ludicrous
+ludicrously
+ludicrousness
+luggage
+lukewarm
+lukewarmly
+lukewarmness
+lull
+lullaby
+lulled
+lulls
+lumber
+lumbered
+lumberer
+lumbering
+lumbers
+luminous
+luminously
+luminousness
+lump
+lumped
+lumpen
+lumper
+lumping
+lumps
+lunar
+lunatic
+lunatics
+lunch
+lunched
+luncheon
+luncheon's
+luncheons
+luncher
+lunches
+lunching
+lung
+lunged
+lunger
+lunging
+lungs
+lurch
+lurched
+lurcher
+lurches
+lurching
+lure
+lured
+lurer
+lures
+luring
+lurk
+lurked
+lurker
+lurkers
+lurking
+lurks
+luscious
+lusciously
+lusciousness
+lust
+lustier
+lustily
+lustiness
+lusting
+lustrous
+lustrously
+lustrousness
+lusts
+lusty
+lute
+lute's
+luted
+lutes
+luting
+luxuriant
+luxuriantly
+luxuries
+luxurious
+luxuriously
+luxuriousness
+luxury
+luxury's
+lying
+lyingly
+lyings
+lymph
+lynch
+lynched
+lyncher
+lynches
+lynx
+lynx's
+lynxes
+lyre
+lyre's
+lyres
+lyric
+lyrics
+ma'am
+macaroni
+macaroni's
+mace
+maced
+macer
+maces
+machine
+machine's
+machined
+machineries
+machinery
+machines
+machining
+macing
+macro
+macro's
+macroeconomics
+macromolecule
+macromolecule's
+macromolecules
+macros
+macroscopic
+mad
+madam
+madams
+madden
+maddened
+maddening
+maddeningly
+madder
+maddest
+made
+mademoiselle
+mademoiselles
+madly
+madman
+madness
+madras
+magazine
+magazine's
+magazined
+magazines
+magazining
+maggot
+maggot's
+maggots
+magic
+magical
+magically
+magician
+magician's
+magicians
+magistrate
+magistrate's
+magistrates
+magnesium
+magnesiums
+magnet
+magnet's
+magnetic
+magnetically
+magnetics
+magnetism
+magnetism's
+magnetisms
+magnets
+magnification
+magnifications
+magnificence
+magnificent
+magnificently
+magnified
+magnifier
+magnifiers
+magnifies
+magnify
+magnifying
+magnitude
+magnitude's
+magnitudes
+mahogany
+maid
+maid's
+maiden
+maidenliness
+maidenly
+maidens
+maids
+mail
+mailable
+mailbox
+mailbox's
+mailboxes
+mailed
+mailer
+mailer's
+mailers
+mailing
+mailings
+mails
+maim
+maimed
+maimedness
+maimer
+maimers
+maiming
+maims
+main
+mainframe
+mainframe's
+mainframes
+mainland
+mainlander
+mainlanders
+mainly
+mains
+mainstay
+maintain
+maintainability
+maintainable
+maintained
+maintainer
+maintainer's
+maintainers
+maintaining
+maintains
+maintenance
+maintenance's
+maintenances
+majestic
+majesties
+majesty
+majesty's
+major
+majored
+majoring
+majorities
+majority
+majority's
+majors
+makable
+make
+makefile
+makefiles
+maker
+makers
+makes
+makeshift
+makeshifts
+makeup
+makeups
+making
+makings
+maladies
+malady
+malady's
+malaria
+male
+male's
+malefactor
+malefactor's
+malefactors
+maleness
+males
+malfunction
+malfunctioned
+malfunctioning
+malfunctions
+malice
+malicious
+maliciously
+maliciousness
+malignant
+malignantly
+mall
+mall's
+mallet
+mallet's
+mallets
+malls
+malnutrition
+malt
+malted
+malting
+malts
+mama
+mamma
+mamma's
+mammal
+mammal's
+mammals
+mammas
+mammoth
+man
+man's
+manage
+manageable
+manageableness
+managed
+management
+management's
+managements
+manager
+manager's
+managerial
+managerially
+managers
+manages
+managing
+mandate
+mandated
+mandates
+mandating
+mandatories
+mandatory
+mandible
+mandolin
+mandolin's
+mandolins
+mane
+mane's
+maned
+manes
+manger
+manger's
+mangers
+mangle
+mangled
+mangler
+mangles
+mangling
+manhood
+maniac
+maniac's
+maniacs
+manicure
+manicured
+manicures
+manicuring
+manifest
+manifestation
+manifestation's
+manifestations
+manifested
+manifesting
+manifestly
+manifestness
+manifests
+manifold
+manifold's
+manifolder
+manifoldly
+manifoldness
+manifolds
+manipulability
+manipulable
+manipulatable
+manipulate
+manipulated
+manipulates
+manipulating
+manipulation
+manipulations
+manipulative
+manipulativeness
+manipulator
+manipulator's
+manipulators
+manipulatory
+mankind
+manlier
+manliest
+manliness
+manly
+manned
+manner
+mannered
+mannerliness
+mannerly
+manners
+manning
+manometer
+manometer's
+manometers
+manor
+manor's
+manors
+manpower
+mans
+mansion
+mansion's
+mansions
+mantel
+mantel's
+mantels
+mantissa
+mantissa's
+mantissas
+mantle
+mantle's
+mantled
+mantles
+mantling
+manual
+manual's
+manually
+manuals
+manufacture
+manufactured
+manufacturer
+manufacturer's
+manufacturers
+manufactures
+manufacturing
+manure
+manured
+manurer
+manurers
+manures
+manuring
+manuscript
+manuscript's
+manuscripts
+many
+map
+map's
+maple
+maple's
+maples
+mappable
+mapped
+mapping
+mapping's
+mappings
+maps
+mar
+marble
+marbled
+marbler
+marbles
+marbling
+march
+marched
+marcher
+marches
+marching
+mare
+mare's
+mares
+margin
+margin's
+marginal
+marginally
+marginals
+margined
+margining
+margins
+marigold
+marigold's
+marigolds
+marijuana
+marijuana's
+marinate
+marinated
+marinates
+marinating
+marine
+mariner
+marines
+maritime
+maritimer
+mark
+markable
+marked
+markedly
+marker
+markers
+market
+marketability
+marketable
+marketed
+marketer
+marketing
+marketings
+marketplace
+marketplace's
+marketplaces
+markets
+marking
+markings
+marks
+marquis
+marquises
+marriage
+marriage's
+marriages
+married
+marries
+marrow
+marrows
+marry
+marrying
+mars
+marsh
+marsh's
+marshal
+marshaled
+marshaler
+marshalers
+marshaling
+marshals
+marshes
+mart
+marten
+martens
+martial
+martially
+marts
+martyr
+martyr's
+martyrdom
+martyrs
+marvel
+marvels
+masculine
+masculinely
+masculineness
+masculinity
+mash
+mashed
+masher
+mashers
+mashes
+mashing
+mashings
+mask
+masked
+masker
+masking
+maskings
+masks
+masochist
+masochist's
+masochists
+mason
+mason's
+masoned
+masoning
+masonry
+masons
+masquerade
+masquerader
+masquerades
+masquerading
+mass
+massacre
+massacred
+massacrer
+massacres
+massacring
+massage
+massaged
+massager
+massages
+massaging
+massed
+masses
+massing
+massinger
+massive
+massively
+massiveness
+mast
+masted
+master
+master's
+mastered
+masterful
+masterfully
+masterfulness
+mastering
+masterings
+masterliness
+masterly
+masterpiece
+masterpiece's
+masterpieces
+masters
+mastery
+masts
+masturbate
+masturbated
+masturbates
+masturbating
+masturbation
+mat
+mat's
+match
+matchable
+matched
+matcher
+matchers
+matches
+matching
+matchings
+matchless
+matchlessly
+matchmaker
+matchmaker's
+matchmakers
+matchmaking
+matchmaking's
+mate
+mate's
+mated
+mater
+material
+materialism
+materialism's
+materially
+materialness
+materials
+maternal
+maternally
+mates
+math
+mathematical
+mathematically
+mathematician
+mathematician's
+mathematicians
+mathematics
+mating
+matings
+matrices
+matriculation
+matrimony
+matrix
+matrixes
+matron
+matronly
+mats
+matted
+matter
+mattered
+mattering
+matters
+mattress
+mattress's
+mattresses
+maturation
+mature
+matured
+maturely
+matureness
+maturer
+matures
+maturing
+maturities
+maturity
+max
+maxim
+maxim's
+maximal
+maximally
+maxims
+maximum
+maximumly
+maximums
+may
+maybe
+mayer
+mayest
+mayhap
+mayhem
+maying
+mayonnaise
+mayor
+mayor's
+mayoral
+mayors
+mays
+maze
+maze's
+mazed
+mazedly
+mazedness
+mazednesses
+mazer
+mazes
+mazing
+me
+mead
+meadow
+meadow's
+meadows
+meads
+meager
+meagerly
+meagerness
+meal
+meal's
+meals
+mean
+meander
+meandered
+meandering
+meanderings
+meanders
+meaner
+meanest
+meaning
+meaning's
+meaningful
+meaningfully
+meaningfulness
+meaningless
+meaninglessly
+meaninglessness
+meanings
+meanly
+meanness
+means
+meant
+meantime
+meanwhile
+measles
+measurable
+measurably
+measure
+measured
+measuredly
+measurement
+measurement's
+measurements
+measurer
+measures
+measuring
+meat
+meat's
+meats
+mechanic
+mechanic's
+mechanical
+mechanically
+mechanicals
+mechanics
+mechanism
+mechanism's
+mechanisms
+med
+medal
+medal's
+medallion
+medallion's
+medallions
+medals
+meddle
+meddled
+meddler
+meddles
+meddling
+media
+median
+median's
+medianly
+medians
+medias
+mediate
+mediated
+mediately
+mediateness
+mediates
+mediating
+mediation
+mediations
+mediative
+medic
+medic's
+medical
+medically
+medicinal
+medicinally
+medicine
+medicine's
+medicines
+medics
+medieval
+medieval's
+medievally
+medievals
+meditate
+meditated
+meditates
+meditating
+meditation
+meditations
+meditative
+meditatively
+meditativeness
+medium
+medium's
+mediums
+meek
+meeker
+meekest
+meekly
+meekness
+meet
+meeter
+meeting
+meetings
+meetly
+meets
+megabit
+megabits
+megabyte
+megabytes
+megaword
+megawords
+melancholy
+meld
+melding
+melds
+mellow
+mellowed
+mellowing
+mellowly
+mellowness
+mellows
+melodies
+melodious
+melodiously
+melodiousness
+melodrama
+melodrama's
+melodramas
+melody
+melody's
+melon
+melon's
+melons
+melt
+melted
+melter
+melting
+meltingly
+melts
+member
+member's
+membered
+members
+membership
+membership's
+memberships
+membrane
+membrane's
+membraned
+membranes
+memo
+memo's
+memoir
+memoirs
+memorability
+memorable
+memorableness
+memoranda
+memorandum
+memorandums
+memorial
+memorially
+memorials
+memories
+memory
+memory's
+memoryless
+memos
+men
+men's
+menace
+menaced
+menaces
+menacing
+menacingly
+menagerie
+menageries
+mend
+mended
+mender
+mending
+mends
+menial
+menially
+menials
+mens
+mensed
+menses
+mensing
+mental
+mentalities
+mentality
+mentally
+mention
+mentionable
+mentioned
+mentioner
+mentioners
+mentioning
+mentions
+mentor
+mentor's
+mentors
+menu
+menu's
+menus
+mer
+mercenaries
+mercenariness
+mercenary
+mercenary's
+merchandise
+merchandised
+merchandiser
+merchandises
+merchandising
+merchant
+merchant's
+merchants
+mercies
+merciful
+mercifully
+mercifulness
+merciless
+mercilessly
+mercilessness
+mercuries
+mercury
+mercy
+mere
+merely
+merest
+merge
+merged
+merger
+mergers
+merges
+merging
+meridian
+meridians
+merit
+merited
+meriting
+meritorious
+meritoriously
+meritoriousness
+merits
+merrier
+merriest
+merrily
+merriment
+merriments
+merriness
+merry
+mesh
+meshed
+meshes
+meshing
+mess
+message
+message's
+messaged
+messages
+messaging
+messed
+messenger
+messenger's
+messengers
+messes
+messiah
+messiahs
+messier
+messiest
+messieurs
+messily
+messiness
+messing
+messy
+met
+meta
+metacircular
+metacircularity
+metal
+metal's
+metalanguage
+metalanguages
+metallic
+metallurgy
+metals
+metamathematical
+metamorphosis
+metaphor
+metaphor's
+metaphorical
+metaphorically
+metaphors
+metaphysical
+metaphysically
+metaphysics
+metavariable
+mete
+meted
+meteor
+meteor's
+meteoric
+meteorology
+meteors
+meter
+meter's
+metered
+metering
+meters
+metes
+method
+method's
+methodical
+methodically
+methodicalness
+methodist
+methodist's
+methodists
+methodological
+methodologically
+methodologies
+methodologists
+methodology
+methodology's
+methods
+meting
+metric
+metric's
+metrical
+metrically
+metrics
+metropolis
+metropolitan
+mets
+mew
+mewed
+mews
+mica
+mice
+microbicidal
+microbicide
+microcode
+microcoded
+microcodes
+microcoding
+microcomputer
+microcomputer's
+microcomputers
+microeconomics
+microfilm
+microfilm's
+microfilmed
+microfilmer
+microfilms
+microinstruction
+microinstruction's
+microinstructions
+microphone
+microphones
+microphoning
+microprocessing
+microprocessor
+microprocessor's
+microprocessors
+microprogram
+microprogram's
+microprogrammed
+microprogramming
+microprograms
+microscope
+microscope's
+microscopes
+microscopic
+microsecond
+microsecond's
+microseconds
+microstore
+microwave
+microwave's
+microwaves
+microword
+microwords
+mid
+midday
+middle
+middled
+middler
+middles
+middling
+middlingly
+middlings
+midnight
+midnightly
+midnights
+midpoint
+midpoint's
+midpoints
+midst
+midsts
+midsummer
+midway
+midways
+midwinter
+midwinterly
+mien
+miens
+mies
+miff
+miffed
+miffing
+miffs
+might
+mightier
+mightiest
+mightily
+mightiness
+mights
+mighty
+migrate
+migrated
+migrates
+migrating
+migration
+migrations
+migrative
+mild
+milden
+milder
+mildest
+mildew
+mildews
+mildly
+mildness
+mile
+mile's
+mileage
+mileages
+miler
+miles
+milestone
+milestone's
+milestones
+militant
+militantly
+militantness
+militants
+militaries
+militarily
+militarism
+militarisms
+military
+militia
+militias
+milk
+milked
+milker
+milkers
+milkier
+milkiness
+milking
+milkmaid
+milkmaid's
+milkmaids
+milks
+milky
+mill
+milled
+miller
+millers
+millet
+milling
+million
+millionaire
+millionaire's
+millionaires
+millioned
+millions
+millionth
+millipede
+millipede's
+millipedes
+millisecond
+milliseconds
+mills
+millstone
+millstone's
+millstones
+mimic
+mimicked
+mimicking
+mimics
+mince
+minced
+mincer
+mincers
+minces
+mincing
+mincingly
+mind
+minded
+mindedness
+minder
+minders
+mindful
+mindfully
+mindfulness
+minding
+mindless
+mindlessly
+mindlessness
+minds
+mine
+mined
+miner
+mineral
+mineral's
+minerals
+miners
+mines
+ming
+mingle
+mingled
+mingles
+mingling
+miniature
+miniature's
+miniatured
+miniatures
+miniaturing
+minicomputer
+minicomputer's
+minicomputers
+minimal
+minimally
+minimum
+minimums
+mining
+minion
+minions
+minister
+minister's
+ministered
+ministering
+ministers
+ministries
+ministry
+ministry's
+mink
+mink's
+minks
+minnow
+minnow's
+minnows
+minor
+minor's
+minored
+minoring
+minorities
+minority
+minority's
+minors
+minstrel
+minstrel's
+minstrels
+mint
+minted
+minter
+minting
+mints
+minus
+minuses
+minute
+minuted
+minutely
+minuteness
+minuter
+minutes
+minutest
+minuting
+miracle
+miracle's
+miracles
+miraculous
+miraculously
+miraculousness
+mire
+mired
+mires
+miring
+mirror
+mirrored
+mirroring
+mirrors
+mirth
+misapplication
+misapplied
+misapplier
+misapplies
+misapply
+misapplying
+misbehaving
+miscalculation
+miscalculation's
+miscalculations
+miscellaneous
+miscellaneously
+miscellaneousness
+mischief
+mischievous
+mischievously
+mischievousness
+miscommunicate
+miscommunicated
+miscommunicates
+miscommunication
+misconception
+misconception's
+misconceptions
+misconstrue
+misconstrued
+misconstrues
+misconstruing
+misdirect
+misdirected
+misdirection
+misdirects
+miser
+miserable
+miserableness
+miserably
+miseries
+miserliness
+miserly
+misers
+misery
+misery's
+misfeature
+misfit
+misfit's
+misfits
+misfortune
+misfortune's
+misfortunes
+misgiving
+misgivingly
+misgivings
+misguide
+misguided
+misguidedly
+misguidedness
+misguider
+misguides
+misguiding
+mishap
+mishap's
+mishaps
+misinform
+misinformation
+misinformed
+misinforming
+misinforms
+misinterpret
+misinterpreted
+misinterpreter
+misinterpreters
+misinterpreting
+misinterprets
+mislead
+misleader
+misleading
+misleadingly
+misleadings
+misleads
+misled
+mismatch
+mismatched
+mismatches
+mismatching
+misnomer
+misnomered
+misperceive
+misperceived
+misperceives
+misplace
+misplaced
+misplaces
+misplacing
+misread
+misreader
+misreading
+misreads
+misrepresentation
+misrepresentation's
+misrepresentations
+miss
+missed
+misses
+missile
+missile's
+missiles
+missing
+mission
+missionaries
+missionary
+missionary's
+missioned
+missioner
+missioning
+missions
+missive
+missives
+misspell
+misspelled
+misspelling
+misspellings
+misspells
+misstate
+misstated
+misstater
+misstates
+misstating
+mist
+mistakable
+mistake
+mistaken
+mistakenly
+mistaker
+mistakes
+mistaking
+mistakingly
+misted
+mister
+mistered
+mistering
+misters
+mistier
+mistiest
+mistiness
+misting
+mistreat
+mistreated
+mistreating
+mistreats
+mistress
+mistressly
+mistrust
+mistrusted
+mistruster
+mistrusting
+mistrusts
+mists
+misty
+mistype
+mistyped
+mistypes
+mistyping
+misunderstand
+misunderstander
+misunderstanders
+misunderstanding
+misunderstanding's
+misunderstandings
+misunderstands
+misunderstood
+misuse
+misused
+misuser
+misuses
+misusing
+mite
+mites
+mitigate
+mitigated
+mitigates
+mitigating
+mitigation
+mitigations
+mitigative
+mitten
+mitten's
+mittens
+mix
+mixed
+mixer
+mixers
+mixes
+mixing
+mixture
+mixture's
+mixtures
+ml
+mnemonic
+mnemonic's
+mnemonically
+mnemonics
+moan
+moaned
+moaning
+moans
+moat
+moat's
+moats
+mob
+mob's
+mobility
+mobs
+moccasin
+moccasin's
+moccasins
+mock
+mocked
+mocker
+mockers
+mockery
+mocking
+mockingly
+mocks
+modal
+modalities
+modality
+modality's
+modally
+mode
+model
+model's
+models
+modem
+modems
+moderate
+moderated
+moderately
+moderateness
+moderates
+moderating
+moderation
+moderations
+moderator
+moderator's
+moderators
+modern
+modernity
+modernly
+modernness
+moderns
+modes
+modest
+modestly
+modesty
+modifiability
+modifiable
+modifiableness
+modification
+modifications
+modified
+modifier
+modifiers
+modifies
+modify
+modifying
+modular
+modularities
+modularity
+modularly
+modulate
+modulated
+modulates
+modulating
+modulation
+modulations
+modulator
+modulator's
+modulators
+module
+module's
+modules
+modulo
+modulus
+modus
+moist
+moisten
+moistened
+moistener
+moistening
+moistly
+moistness
+moisture
+moistures
+molasses
+mold
+molded
+molder
+moldered
+moldering
+molders
+moldier
+moldiness
+molding
+molds
+moldy
+mole
+molecular
+molecularly
+molecule
+molecule's
+molecules
+moles
+molest
+molested
+molester
+molesters
+molesting
+molests
+molten
+mom
+mom's
+moment
+moment's
+momentarily
+momentariness
+momentary
+momently
+momentous
+momentously
+momentousness
+moments
+momentum
+momentums
+moms
+monarch
+monarchies
+monarchs
+monarchy
+monarchy's
+monasteries
+monastery
+monastery's
+monastic
+monetary
+money
+money's
+moneyed
+moneyer
+moneys
+monitor
+monitored
+monitoring
+monitors
+monk
+monk's
+monkey
+monkeyed
+monkeying
+monkeys
+monks
+mono
+mono's
+monochrome
+monochromes
+monograph
+monograph's
+monographes
+monographs
+monolithic
+monopolies
+monopoly
+monopoly's
+monotheism
+monotone
+monotonic
+monotonically
+monotonicity
+monotonous
+monotonously
+monotonousness
+monotony
+monster
+monster's
+monsters
+monstrous
+monstrously
+monstrousness
+month
+month's
+monthlies
+monthly
+months
+monument
+monument's
+monumental
+monumentally
+monuments
+mood
+mood's
+moodier
+moodiness
+moods
+moody
+moon
+mooned
+mooning
+moonlight
+moonlighted
+moonlighter
+moonlighting
+moonlights
+moonlit
+moons
+moonshine
+moonshiner
+moor
+moor's
+moored
+mooring
+moorings
+moors
+moose
+moot
+mooted
+mop
+moped
+moper
+moping
+mops
+moral
+moral's
+morale
+morales
+moralities
+morality
+morally
+morals
+morass
+morasses
+morbid
+morbidly
+morbidness
+more
+mored
+moreover
+mores
+morion
+morn
+morning
+mornings
+morphological
+morphologically
+morphology
+morrow
+morsel
+morsel's
+morsels
+mortal
+mortality
+mortally
+mortals
+mortar
+mortared
+mortaring
+mortars
+mortgage
+mortgage's
+mortgaged
+mortgager
+mortgages
+mortgaging
+mortification
+mortifications
+mortified
+mortifiedly
+mortifier
+mortifies
+mortify
+mortifying
+mosaic
+mosaic's
+mosaics
+mosquito
+mosquitoes
+mosquitos
+moss
+moss's
+mosses
+mossier
+mossy
+most
+mostly
+motel
+motel's
+motels
+moth
+mother
+mother's
+motherboard
+motherboard's
+motherboards
+mothered
+motherer
+motherers
+mothering
+motherliness
+motherly
+mothers
+motif
+motif's
+motifs
+motion
+motioned
+motioner
+motioning
+motionless
+motionlessly
+motionlessness
+motions
+motivate
+motivated
+motivates
+motivating
+motivation
+motivational
+motivationally
+motivations
+motivative
+motive
+motived
+motives
+motiving
+motley
+motor
+motorcar
+motorcar's
+motorcars
+motorcycle
+motorcycle's
+motorcycles
+motored
+motoring
+motorist
+motorist's
+motorists
+motors
+motto
+mottoes
+mottos
+mould
+moulded
+moulder
+mouldering
+moulding
+moulds
+mound
+mounded
+mounds
+mount
+mountain
+mountain's
+mountaineer
+mountaineering
+mountaineers
+mountainous
+mountainously
+mountainousness
+mountains
+mounted
+mounter
+mounting
+mountings
+mounts
+mourn
+mourned
+mourner
+mourners
+mournful
+mournfully
+mournfulness
+mourning
+mourningly
+mourns
+mouse
+mouser
+mouses
+mousing
+mouth
+mouthed
+mouther
+mouthes
+mouthful
+mouthing
+mouths
+movable
+movableness
+move
+moved
+movement
+movement's
+movements
+mover
+movers
+moves
+movie
+movie's
+movies
+moving
+movingly
+movings
+mow
+mowed
+mower
+mowers
+mowing
+mows
+much
+muchness
+muck
+mucked
+mucker
+mucking
+mucks
+mud
+muddied
+muddier
+muddiness
+muddle
+muddled
+muddler
+muddlers
+muddles
+muddling
+muddy
+muddying
+muds
+muff
+muff's
+muffin
+muffin's
+muffins
+muffle
+muffled
+muffler
+mufflers
+muffles
+muffling
+muffs
+mug
+mug's
+mugs
+mulberries
+mulberry
+mulberry's
+mule
+mule's
+mules
+muling
+multicellular
+multicomponent
+multidimensional
+multilevel
+multinational
+multiple
+multiple's
+multiples
+multiplex
+multiplexed
+multiplexer
+multiplexers
+multiplexes
+multiplexing
+multiplexor
+multiplexor's
+multiplexors
+multiplicand
+multiplicand's
+multiplicands
+multiplication
+multiplications
+multiplicative
+multiplicatively
+multiplicatives
+multiplicity
+multiplied
+multiplier
+multipliers
+multiplies
+multiply
+multiplying
+multiprocess
+multiprocessing
+multiprocessor
+multiprocessor's
+multiprocessors
+multiprogram
+multiprogrammed
+multiprogramming
+multiprogrammings
+multistage
+multitasking
+multitude
+multitude's
+multitudes
+multiuser
+multivariate
+mumble
+mumbled
+mumbler
+mumblers
+mumbles
+mumbling
+mumblings
+mummies
+mummy
+mummy's
+munch
+munched
+muncher
+munches
+munching
+mundane
+mundanely
+mundaneness
+municipal
+municipalities
+municipality
+municipality's
+municipally
+munition
+munitions
+mural
+murals
+murder
+murdered
+murderer
+murderers
+murdering
+murderous
+murderously
+murderousness
+murders
+murkier
+murkiness
+murky
+murmur
+murmured
+murmurer
+murmuring
+murmurs
+muscle
+muscled
+muscles
+muscling
+muscular
+muscularly
+muse
+mused
+muser
+muses
+museum
+museum's
+museums
+mushier
+mushiness
+mushroom
+mushroomed
+mushrooming
+mushrooms
+mushy
+music
+musical
+musically
+musicals
+musician
+musicianly
+musicians
+musics
+musing
+musingly
+musings
+musk
+musket
+musket's
+muskets
+muskrat
+muskrat's
+muskrats
+musks
+muslin
+mussel
+mussel's
+mussels
+must
+mustard
+mustards
+muster
+mustered
+mustering
+musters
+mustier
+mustiness
+musts
+musty
+mutability
+mutable
+mutableness
+mutate
+mutated
+mutates
+mutating
+mutation
+mutations
+mutative
+mutator
+mutators
+mute
+muted
+mutedly
+mutely
+muteness
+muter
+mutes
+mutest
+mutilate
+mutilated
+mutilates
+mutilating
+mutilation
+mutilations
+muting
+mutinies
+mutiny
+mutiny's
+mutter
+muttered
+mutterer
+mutterers
+muttering
+mutters
+mutton
+mutual
+mutually
+muzzle
+muzzle's
+muzzled
+muzzler
+muzzles
+muzzling
+my
+myriad
+myrtle
+myself
+mysteries
+mysterious
+mysteriously
+mysteriousness
+mystery
+mystery's
+mystic
+mystic's
+mystical
+mystically
+mysticism
+mysticisms
+mystics
+myth
+myth's
+mythes
+mythical
+mythically
+mythologies
+mythology
+mythology's
+nag
+nag's
+nags
+nail
+nailed
+nailer
+nailing
+nails
+naive
+naively
+naiveness
+naiver
+naivete
+naked
+nakedly
+nakedness
+name
+name's
+nameable
+named
+nameless
+namelessly
+namelessness
+namely
+namer
+namers
+names
+namesake
+namesake's
+namesakes
+naming
+nanosecond
+nanoseconds
+nap
+nap's
+napkin
+napkin's
+napkins
+naps
+narcissistic
+narcissus
+narcissuses
+narcotic
+narcotics
+narrative
+narrative's
+narratively
+narratives
+narrow
+narrowed
+narrower
+narrowest
+narrowing
+narrowingness
+narrowly
+narrowness
+narrows
+nasal
+nasally
+nastier
+nasties
+nastiest
+nastily
+nastiness
+nasty
+nation
+nation's
+national
+nationalist
+nationalist's
+nationalists
+nationalities
+nationality
+nationality's
+nationally
+nationals
+nations
+nationwide
+native
+natively
+nativeness
+natives
+nativity
+natural
+naturalism
+naturalist
+naturally
+naturalness
+naturals
+nature
+nature's
+natured
+natures
+naught
+naught's
+naughtier
+naughtiness
+naughts
+naughty
+naval
+navally
+navies
+navigable
+navigableness
+navigate
+navigated
+navigates
+navigating
+navigation
+navigations
+navigator
+navigator's
+navigators
+navy
+navy's
+nay
+near
+nearby
+neared
+nearer
+nearest
+nearing
+nearly
+nearness
+nears
+neat
+neaten
+neater
+neatest
+neatly
+neatness
+neats
+nebula
+necessaries
+necessarily
+necessary
+necessitate
+necessitated
+necessitates
+necessitating
+necessitation
+necessitations
+necessities
+necessity
+neck
+necked
+necker
+necking
+necklace
+necklace's
+necklaces
+necks
+necktie
+necktie's
+neckties
+need
+needed
+needer
+needful
+needfully
+needfulness
+needier
+neediness
+needing
+needle
+needled
+needler
+needlers
+needles
+needless
+needlessly
+needlessness
+needlework
+needleworker
+needling
+needly
+needn't
+needs
+needy
+negate
+negated
+negater
+negates
+negating
+negation
+negations
+negative
+negatived
+negatively
+negativeness
+negatives
+negativing
+negator
+negators
+neglect
+neglected
+neglecter
+neglecting
+neglects
+negligence
+negligible
+negotiable
+negotiate
+negotiated
+negotiates
+negotiating
+negotiation
+negotiations
+neigh
+neither
+neophyte
+neophytes
+nephew
+nephew's
+nephews
+nerve
+nerve's
+nerved
+nerves
+nerving
+nervous
+nervously
+nervousness
+nest
+nested
+nester
+nesting
+nestle
+nestled
+nestler
+nestles
+nestling
+nests
+net
+net's
+nether
+nets
+netted
+netting
+nettle
+nettled
+nettles
+nettling
+network
+network's
+networked
+networking
+networks
+neural
+neurally
+neurobiology
+neurobiology's
+neurological
+neurologically
+neurologists
+neuron
+neuron's
+neurons
+neutral
+neutralities
+neutrality
+neutrally
+neutralness
+neutrals
+neutrino
+neutrino's
+neutrinos
+never
+nevertheless
+new
+newborn
+newborns
+newcomer
+newcomer's
+newcomers
+newer
+newest
+newline
+newline's
+newlines
+newly
+newness
+news
+newsgroup
+newsgroup's
+newsgroups
+newsletter
+newsletter's
+newsletters
+newsman
+newsmen
+newspaper
+newspaper's
+newspapers
+newswire
+newt
+newts
+next
+nibble
+nibbled
+nibbler
+nibblers
+nibbles
+nibbling
+nice
+nicely
+niceness
+nicer
+nicest
+niceties
+nicety
+niche
+niches
+niching
+nick
+nicked
+nickel
+nickel's
+nickels
+nicker
+nickered
+nickering
+nicking
+nickname
+nicknamed
+nicknamer
+nicknames
+nicks
+nicotine
+niece
+niece's
+nieces
+niftier
+nifties
+nifty
+nigh
+night
+night's
+nighted
+nighters
+nightfall
+nightgown
+nightingale
+nightingale's
+nightingales
+nightly
+nightmare
+nightmare's
+nightmares
+nights
+nil
+nilly
+nimble
+nimbleness
+nimbler
+nimblest
+nimbly
+nine
+nines
+nineteen
+nineteens
+nineteenth
+nineties
+ninetieth
+ninety
+ninth
+nip
+nips
+nitrogen
+nix
+nixed
+nixer
+nixes
+nixing
+no
+nobilities
+nobility
+noble
+nobleman
+nobleness
+nobler
+nobles
+noblest
+nobly
+nobodies
+nobody
+nobody's
+nocturnal
+nocturnally
+nod
+nod's
+nodded
+nodding
+node
+node's
+nodes
+nods
+noise
+noised
+noiseless
+noiselessly
+noises
+noisier
+noisily
+noisiness
+noising
+noisy
+nomenclature
+nomenclatures
+nominal
+nominally
+nominate
+nominated
+nominates
+nominating
+nomination
+nomination's
+nominations
+nominative
+nominatively
+non
+nonblocking
+nonconservative
+noncyclic
+nondecreasing
+nondescript
+nondescriptly
+nondestructively
+nondeterminacy
+nondeterminate
+nondeterminately
+nondeterminism
+nondeterministic
+nondeterministically
+nondisclosure
+nondisclosures
+none
+nonempty
+nones
+nonetheless
+nonexistence
+nonexistent
+nonextensible
+nonfunctional
+noninteracting
+noninterference
+nonintuitive
+nonlinear
+nonlinearities
+nonlinearity
+nonlinearity's
+nonlinearly
+nonlocal
+nonnegative
+nonorthogonal
+nonorthogonality
+nonperishable
+nonprocedural
+nonprocedurally
+nonprogrammable
+nonprogrammer
+nonsense
+nonsensical
+nonsensically
+nonsensicalness
+nonspecialist
+nonspecialist's
+nonspecialists
+nonstandard
+nontechnical
+nontechnically
+nonterminal
+nonterminal's
+nonterminals
+nonterminating
+nontermination
+nontrivial
+nonuniform
+nonzero
+nook
+nook's
+nooks
+noon
+noonday
+nooning
+noons
+noontide
+nope
+nor
+norm
+norm's
+normal
+normalcy
+normality
+normally
+normals
+normed
+norms
+north
+north's
+northeast
+northeaster
+northeasterly
+northeastern
+norther
+northerly
+northern
+northerner
+northerners
+northernly
+northers
+northing
+northward
+northwards
+northwest
+northwester
+northwesterly
+northwestern
+nose
+nosed
+noses
+nosing
+nostril
+nostril's
+nostrils
+not
+notable
+notableness
+notables
+notably
+notation
+notation's
+notational
+notationally
+notations
+notch
+notched
+notches
+notching
+note
+notebook
+notebook's
+notebooks
+noted
+notedly
+notedness
+noter
+notes
+noteworthiness
+noteworthy
+nothing
+nothingness
+nothings
+notice
+noticeable
+noticeably
+noticed
+notices
+noticing
+notification
+notifications
+notified
+notifier
+notifiers
+notifies
+notify
+notifying
+noting
+notion
+notions
+notorious
+notoriously
+notoriousness
+notwithstanding
+noun
+noun's
+nouns
+nourish
+nourished
+nourisher
+nourishes
+nourishing
+nourishment
+novel
+novel's
+novelist
+novelist's
+novelists
+novels
+novelties
+novelty
+novelty's
+novice
+novice's
+novices
+now
+nowadays
+nowhere
+nowheres
+nows
+nroff
+nroff's
+nuances
+nuclear
+nucleotide
+nucleotide's
+nucleotides
+nucleus
+nucleuses
+nuisance
+nuisance's
+nuisances
+null
+nulled
+nullification
+nullified
+nullifier
+nullifiers
+nullifies
+nullify
+nullifying
+nulls
+numb
+numbed
+number
+numbered
+numberer
+numbering
+numberless
+numbers
+numbing
+numbingly
+numbly
+numbness
+numbs
+numeral
+numeral's
+numerally
+numerals
+numerator
+numerator's
+numerators
+numeric
+numerical
+numerically
+numerics
+numerous
+numerously
+numerousness
+nun
+nun's
+nuns
+nuptial
+nuptials
+nurse
+nurse's
+nursed
+nurser
+nurseries
+nursery
+nursery's
+nurses
+nursing
+nurture
+nurtured
+nurturer
+nurtures
+nurturing
+nut
+nut's
+nutrition
+nutrition's
+nuts
+nymph
+nymphs
+o'clock
+oak
+oaken
+oaks
+oar
+oar's
+oared
+oaring
+oars
+oasis
+oat
+oaten
+oater
+oath
+oaths
+oatmeal
+oats
+obedience
+obediences
+obedient
+obediently
+obey
+obeyed
+obeyer
+obeying
+obeys
+obfuscate
+obfuscated
+obfuscater
+obfuscates
+obfuscating
+obfuscation
+obfuscations
+object
+object's
+objected
+objecting
+objection
+objection's
+objectionable
+objectionableness
+objections
+objective
+objectively
+objectiveness
+objectives
+objector
+objector's
+objectors
+objects
+oblate
+oblately
+oblateness
+oblation
+oblations
+obligate
+obligated
+obligately
+obligates
+obligating
+obligation
+obligation's
+obligations
+obligatory
+oblige
+obliged
+obliger
+obliges
+obliging
+obligingly
+obligingness
+oblique
+obliquely
+obliqueness
+obliterate
+obliterated
+obliterates
+obliterating
+obliteration
+obliterations
+obliterative
+obliteratively
+oblivion
+oblivions
+oblivious
+obliviously
+obliviousness
+oblong
+oblongly
+oblongness
+obscene
+obscenely
+obscure
+obscured
+obscurely
+obscureness
+obscurer
+obscures
+obscuring
+obscurities
+obscurity
+observable
+observance
+observance's
+observances
+observant
+observantly
+observation
+observation's
+observations
+observatories
+observatory
+observe
+observed
+observer
+observers
+observes
+observing
+observingly
+obsession
+obsession's
+obsessions
+obsolescence
+obsolete
+obsoleted
+obsoletely
+obsoleteness
+obsoletes
+obsoleting
+obstacle
+obstacle's
+obstacles
+obstinacy
+obstinate
+obstinately
+obstinateness
+obstruct
+obstructed
+obstructer
+obstructing
+obstruction
+obstruction's
+obstructionist
+obstructions
+obstructive
+obstructively
+obstructiveness
+obstructs
+obtain
+obtainable
+obtainably
+obtained
+obtainer
+obtaining
+obtains
+obviate
+obviated
+obviates
+obviating
+obviation
+obviations
+obvious
+obviously
+obviousness
+occasion
+occasional
+occasionally
+occasioned
+occasioning
+occasionings
+occasions
+occlude
+occluded
+occludes
+occluding
+occlusion
+occlusion's
+occlusions
+occupancies
+occupancy
+occupant
+occupant's
+occupants
+occupation
+occupation's
+occupational
+occupationally
+occupations
+occupied
+occupier
+occupiers
+occupies
+occupy
+occupying
+occur
+occurred
+occurrence
+occurrence's
+occurrences
+occurring
+occurs
+ocean
+ocean's
+oceans
+octal
+octals
+octave
+octaves
+octopus
+odd
+odder
+oddest
+oddities
+oddity
+oddity's
+oddly
+oddness
+odds
+ode
+ode's
+oded
+oder
+odes
+odious
+odiously
+odiousness
+odorous
+odorously
+odorousness
+of
+off
+offend
+offended
+offender
+offenders
+offending
+offends
+offensive
+offensively
+offensiveness
+offensives
+offer
+offered
+offerer
+offerers
+offering
+offerings
+offers
+office
+office's
+officer
+officer's
+officered
+officers
+offices
+official
+official's
+officially
+officials
+officiate
+officiated
+officiates
+officiating
+officiation
+officiations
+officio
+officious
+officiously
+officiousness
+offing
+offs
+offset
+offset's
+offsets
+offspring
+offsprings
+oft
+often
+oftener
+oftentimes
+oh
+oil
+oilcloth
+oiled
+oiler
+oilers
+oilier
+oiliest
+oiliness
+oiling
+oils
+oily
+ointment
+ointments
+okay
+okay's
+okays
+old
+olden
+older
+oldest
+oldness
+olive
+olive's
+oliver
+olives
+omen
+omen's
+omens
+ominous
+ominously
+ominousness
+omission
+omission's
+omissions
+omit
+omits
+omitted
+omitting
+omnipresent
+omnipresently
+omniscient
+omnisciently
+omnivore
+on
+onanism
+once
+oncer
+one
+one's
+oneness
+oner
+onerous
+onerously
+onerousness
+ones
+oneself
+ongoing
+onion
+onions
+online
+onliness
+only
+ons
+onset
+onset's
+onsets
+onto
+onward
+onwards
+oops
+ooze
+oozed
+oozes
+oozing
+opacities
+opacity
+opal
+opal's
+opals
+opaque
+opaquely
+opaqueness
+opcode
+opcode's
+opcodes
+open
+opened
+opener
+openers
+openest
+opening
+opening's
+openings
+openly
+openness
+opens
+opera
+opera's
+operable
+operand
+operand's
+operandi
+operands
+operas
+operate
+operated
+operates
+operating
+operation
+operational
+operationally
+operations
+operative
+operatively
+operativeness
+operatives
+operator
+operator's
+operators
+opiate
+opiates
+opinion
+opinion's
+opinions
+opium
+opponent
+opponent's
+opponents
+opportune
+opportunely
+opportunism
+opportunistic
+opportunistically
+opportunities
+opportunity
+opportunity's
+oppose
+opposed
+opposer
+opposes
+opposing
+opposite
+oppositely
+oppositeness
+opposites
+opposition
+oppositions
+oppress
+oppressed
+oppresses
+oppressing
+oppression
+oppressive
+oppressively
+oppressiveness
+oppressor
+oppressor's
+oppressors
+opt
+opted
+optic
+optical
+optically
+optics
+optimal
+optimality
+optimally
+optimism
+optimistic
+optimistically
+optimum
+opting
+option
+option's
+optional
+optionally
+options
+opts
+or
+or's
+oracle
+oracle's
+oracles
+oral
+orally
+orals
+orange
+orange's
+oranges
+oration
+oration's
+orations
+orator
+orator's
+oratories
+orators
+oratory
+oratory's
+orb
+orbit
+orbital
+orbitally
+orbitals
+orbited
+orbiter
+orbiters
+orbiting
+orbits
+orchard
+orchard's
+orchards
+orchestra
+orchestra's
+orchestras
+orchid
+orchid's
+orchids
+ordain
+ordained
+ordainer
+ordaining
+ordains
+ordeal
+ordeals
+order
+ordered
+orderer
+ordering
+orderings
+orderlies
+orderliness
+orderly
+orders
+ordinal
+ordinance
+ordinance's
+ordinances
+ordinaries
+ordinarily
+ordinariness
+ordinary
+ordinate
+ordinated
+ordinates
+ordinating
+ordination
+ordinations
+ore
+ore's
+ores
+organ
+organ's
+organic
+organics
+organism
+organism's
+organisms
+organist
+organist's
+organists
+organs
+orgies
+orgy
+orgy's
+orient
+orientation
+orientation's
+orientations
+oriented
+orienting
+orients
+orifice
+orifice's
+orifices
+origin
+origin's
+original
+originality
+originally
+originals
+originate
+originated
+originates
+originating
+origination
+originations
+originative
+originatively
+originator
+originator's
+originators
+origins
+orion
+orly
+ornament
+ornamental
+ornamentally
+ornamentation
+ornamentations
+ornamented
+ornamenting
+ornaments
+orphan
+orphaned
+orphaning
+orphans
+orthodox
+orthodoxes
+orthodoxly
+orthogonal
+orthogonality
+orthogonally
+oscillate
+oscillated
+oscillates
+oscillating
+oscillation
+oscillation's
+oscillations
+oscillator
+oscillator's
+oscillators
+oscillatory
+oscilloscope
+oscilloscope's
+oscilloscopes
+ostrich
+ostrich's
+ostriches
+other
+other's
+otherness
+others
+otherwise
+otter
+otter's
+otters
+ought
+oughts
+ounce
+ounces
+our
+ours
+ourself
+ourselves
+out
+outbreak
+outbreak's
+outbreaks
+outburst
+outburst's
+outbursts
+outcast
+outcast's
+outcasts
+outcome
+outcome's
+outcomes
+outcries
+outcry
+outdoor
+outdoors
+outed
+outer
+outermost
+outfit
+outfit's
+outfits
+outgoing
+outgoingness
+outgoings
+outgrew
+outgrow
+outgrowing
+outgrown
+outgrows
+outgrowth
+outing
+outing's
+outings
+outlast
+outlasts
+outlaw
+outlawed
+outlawing
+outlaws
+outlay
+outlay's
+outlays
+outlet
+outlet's
+outlets
+outline
+outlined
+outlines
+outlining
+outlive
+outlived
+outlives
+outliving
+outlook
+outness
+outperform
+outperformed
+outperforming
+outperforms
+outpost
+outpost's
+outposts
+output
+output's
+outputs
+outputting
+outrage
+outraged
+outrageous
+outrageously
+outrageousness
+outrages
+outraging
+outright
+outrightly
+outrun
+outruns
+outs
+outset
+outside
+outsider
+outsider's
+outsiderness
+outsiders
+outskirts
+outstanding
+outstandingly
+outstretched
+outstrip
+outstripped
+outstripping
+outstrips
+outvote
+outvoted
+outvotes
+outvoting
+outward
+outwardly
+outwardness
+outwards
+outweigh
+outweighed
+outweighing
+outweighs
+outwit
+outwits
+outwitted
+outwitting
+oval
+oval's
+ovally
+ovalness
+ovals
+ovaries
+ovary
+ovary's
+oven
+oven's
+ovens
+over
+overall
+overall's
+overalls
+overblown
+overboard
+overcame
+overcast
+overcasting
+overcoat
+overcoat's
+overcoating
+overcoats
+overcome
+overcomer
+overcomes
+overcoming
+overcrowd
+overcrowded
+overcrowding
+overcrowds
+overdone
+overdose
+overdose's
+overdosed
+overdoses
+overdosing
+overdraft
+overdraft's
+overdrafts
+overdraw
+overdrawing
+overdrawn
+overdraws
+overdrew
+overdue
+overemphasis
+overestimate
+overestimated
+overestimates
+overestimating
+overestimation
+overestimations
+overflow
+overflowed
+overflowing
+overflows
+overhang
+overhanging
+overhangs
+overhaul
+overhauled
+overhauler
+overhauling
+overhaulings
+overhauls
+overhead
+overheads
+overhear
+overheard
+overhearer
+overhearing
+overhears
+overing
+overjoy
+overjoyed
+overkill
+overkill's
+overlaid
+overland
+overlap
+overlap's
+overlapped
+overlapping
+overlaps
+overlay
+overlaying
+overlays
+overload
+overloaded
+overloading
+overloads
+overlook
+overlooked
+overlooking
+overlooks
+overly
+overlying
+overnight
+overnighter
+overnighters
+overnights
+overpower
+overpowered
+overpowering
+overpoweringly
+overpowers
+overprint
+overprinted
+overprinting
+overprints
+overproduction
+overridden
+override
+overrider
+overrides
+overriding
+overrode
+overrule
+overruled
+overrules
+overruling
+overrun
+overruns
+overs
+overseas
+oversee
+overseeing
+overseer
+overseers
+oversees
+overshadow
+overshadowed
+overshadowing
+overshadows
+overshoot
+overshooting
+overshoots
+overshot
+oversight
+oversight's
+oversights
+oversimplification
+oversimplifications
+oversimplified
+oversimplifies
+oversimplify
+oversimplifying
+overstate
+overstated
+overstatement
+overstatement's
+overstatements
+overstates
+overstating
+overstocks
+overt
+overtake
+overtaken
+overtaker
+overtakers
+overtakes
+overtaking
+overthrew
+overthrow
+overthrowing
+overthrown
+overthrows
+overtime
+overtly
+overtness
+overtone
+overtone's
+overtones
+overtook
+overture
+overture's
+overtures
+overturn
+overturned
+overturning
+overturns
+overuse
+overview
+overview's
+overviews
+overweight
+overwhelm
+overwhelmed
+overwhelming
+overwhelmingly
+overwhelms
+overwork
+overworked
+overworking
+overworks
+overwrite
+overwrites
+overwriting
+overwritten
+overwrote
+overzealous
+overzealousness
+ovum
+owe
+owed
+owes
+owing
+owl
+owl's
+owler
+owls
+own
+owned
+owner
+owner's
+owners
+ownership
+ownerships
+owning
+owns
+ox
+oxen
+oxidation
+oxide
+oxide's
+oxides
+oxygen
+oxygens
+oyster
+oyster's
+oystering
+oysters
+pa
+pace
+pace's
+paced
+pacer
+pacers
+paces
+pacific
+pacification
+pacifications
+pacified
+pacifier
+pacifies
+pacify
+pacifying
+pacing
+pack
+package
+packaged
+packager
+packagers
+packages
+packaging
+packagings
+packed
+packer
+packers
+packet
+packet's
+packeted
+packeting
+packets
+packing
+packs
+pact
+pact's
+pacts
+pad
+pad's
+padded
+paddies
+padding
+paddings
+paddle
+paddled
+paddler
+paddles
+paddling
+paddy
+pads
+pagan
+pagan's
+pagans
+page
+page's
+pageant
+pageant's
+pageants
+paged
+pager
+pager's
+pagers
+pages
+paginate
+paginated
+paginates
+paginating
+pagination
+paginations
+paging
+paid
+pail
+pail's
+pails
+pain
+pained
+painful
+painfully
+painfulness
+paining
+painless
+painlessly
+painlessness
+pains
+painstaking
+painstakingly
+paint
+painted
+painter
+painterliness
+painterly
+painters
+painting
+paintings
+paints
+pair
+paired
+pairing
+pairings
+pairs
+pairwise
+pal
+pal's
+palace
+palace's
+palaces
+palate
+palate's
+palates
+pale
+paled
+palely
+paleness
+paler
+pales
+palest
+palfrey
+paling
+pall
+palliate
+palliation
+palliative
+palliatively
+palliatives
+pallid
+pallidly
+pallidness
+palling
+pally
+palm
+palmed
+palmer
+palming
+palms
+pals
+pamphlet
+pamphlet's
+pamphlets
+pan
+pan's
+panacea
+panacea's
+panaceas
+pancake
+pancake's
+pancaked
+pancakes
+pancaking
+pancreas
+panda
+panda's
+pandas
+pandemonium
+pander
+pandered
+panderer
+pandering
+panders
+pane
+pane's
+panel
+panelist
+panelist's
+panelists
+panels
+panes
+pang
+pang's
+pangs
+panic
+panic's
+panics
+panned
+panning
+pans
+pansies
+pansy
+pansy's
+pant
+panted
+panther
+panther's
+panthers
+panties
+panting
+pantries
+pantry
+pantry's
+pants
+panty
+papa
+papal
+papally
+paper
+paper's
+paperback
+paperback's
+paperbacks
+papered
+paperer
+paperers
+papering
+paperings
+papers
+paperwork
+paprika
+par
+parachute
+parachute's
+parachuted
+parachuter
+parachutes
+parachuting
+parade
+paraded
+parader
+parades
+paradigm
+paradigm's
+paradigms
+parading
+paradise
+paradox
+paradox's
+paradoxes
+paradoxical
+paradoxically
+paradoxicalness
+paraffin
+paraffins
+paragon
+paragon's
+paragons
+paragraph
+paragraphed
+paragrapher
+paragraphing
+paragraphs
+parallax
+parallax's
+parallel
+parallelism
+parallelogram
+parallelogram's
+parallelograms
+parallels
+paralysis
+parameter
+parameter's
+parameterless
+parameters
+parametric
+paramilitary
+paramount
+paranoia
+paranoid
+parapet
+parapet's
+parapeted
+parapets
+paraphrase
+paraphrased
+paraphraser
+paraphrases
+paraphrasing
+parasite
+parasite's
+parasites
+parasitic
+parasitics
+parcel
+parcels
+parch
+parched
+parchment
+pardon
+pardonable
+pardonableness
+pardonably
+pardoned
+pardoner
+pardoners
+pardoning
+pardons
+pare
+parent
+parent's
+parentage
+parental
+parentally
+parentheses
+parenthesis
+parenthetical
+parenthetically
+parenthood
+parenting
+parents
+parer
+pares
+paring
+parings
+parish
+parish's
+parishes
+parities
+parity
+park
+parked
+parker
+parkers
+parking
+parks
+parliament
+parliament's
+parliamentary
+parliaments
+parole
+paroled
+paroles
+paroling
+parried
+parrot
+parroting
+parrots
+parry
+parrying
+pars
+parse
+parsed
+parser
+parser's
+parsers
+parses
+parsimony
+parsing
+parsings
+parsley
+parson
+parson's
+parsons
+part
+partake
+partaker
+partakes
+partaking
+parted
+parter
+parters
+partial
+partiality
+partially
+partials
+participant
+participant's
+participants
+participate
+participated
+participates
+participating
+participation
+participations
+participative
+participatory
+particle
+particle's
+particles
+particular
+particularly
+particulars
+partied
+parties
+parting
+partings
+partisan
+partisan's
+partisans
+partition
+partitioned
+partitioner
+partitioning
+partitions
+partly
+partner
+partner's
+partnered
+partnering
+partners
+partnership
+partnerships
+partridge
+partridge's
+partridges
+parts
+party
+party's
+partying
+pas
+pass
+passage
+passage's
+passaged
+passages
+passageway
+passaging
+passe
+passed
+passenger
+passenger's
+passengerly
+passengers
+passer
+passers
+passes
+passing
+passion
+passionate
+passionately
+passionateness
+passions
+passive
+passively
+passiveness
+passives
+passivity
+passport
+passport's
+passports
+password
+password's
+passworded
+passwords
+past
+past's
+paste
+pasted
+pastes
+pastime
+pastime's
+pastimes
+pasting
+pastness
+pastor
+pastor's
+pastoral
+pastorally
+pastoralness
+pastors
+pastries
+pastry
+pasts
+pasture
+pasture's
+pastured
+pasturer
+pastures
+pasturing
+pat
+pat's
+patch
+patched
+patcher
+patches
+patching
+patchwork
+patchworker
+patchworkers
+pated
+paten
+patent
+patentable
+patented
+patenter
+patenters
+patenting
+patently
+patents
+pater
+paternal
+paternally
+path
+pathetic
+pathname
+pathname's
+pathnames
+pathological
+pathologically
+pathologies
+pathologist
+pathologist's
+pathologists
+pathology
+pathos
+paths
+pathway
+pathway's
+pathways
+patience
+patient
+patient's
+patiently
+patients
+patriarch
+patriarchs
+patrician
+patrician's
+patricians
+patriot
+patriot's
+patriotic
+patriotism
+patriots
+patrol
+patrol's
+patrols
+patron
+patron's
+patronage
+patronly
+patrons
+pats
+patter
+pattered
+patterer
+pattering
+patterings
+pattern
+patterned
+patterning
+patterns
+patters
+patties
+patty
+patty's
+paucity
+pause
+paused
+pauses
+pausing
+pave
+paved
+pavement
+pavement's
+pavements
+paver
+paves
+pavilion
+pavilion's
+pavilions
+paving
+paw
+pawed
+pawing
+pawn
+pawn's
+pawned
+pawner
+pawning
+pawns
+paws
+pay
+payable
+paycheck
+paycheck's
+paychecks
+payed
+payer
+payer's
+payers
+paying
+payment
+payment's
+payments
+payoff
+payoff's
+payoffs
+payroll
+payrolls
+pays
+pea
+pea's
+peace
+peaceable
+peaceableness
+peaceful
+peacefully
+peacefulness
+peaces
+peach
+peach's
+peaches
+peacock
+peacock's
+peacocks
+peak
+peaked
+peakedness
+peaking
+peaks
+peal
+pealed
+pealing
+peals
+peanut
+peanut's
+peanuts
+pear
+pearl
+pearl's
+pearler
+pearlier
+pearls
+pearly
+pears
+peas
+peasant
+peasant's
+peasantry
+peasants
+peat
+pebble
+pebble's
+pebbled
+pebbles
+pebbling
+peck
+pecked
+pecker
+pecking
+pecks
+peculiar
+peculiarities
+peculiarity
+peculiarity's
+peculiarly
+peculiars
+pedagogic
+pedagogical
+pedagogically
+pedagogics
+pedantic
+peddler
+peddler's
+peddlers
+pedestal
+pedestals
+pedestrian
+pedestrian's
+pedestrians
+pediatric
+pediatrics
+peek
+peeked
+peeking
+peeks
+peel
+peeled
+peeler
+peeler's
+peeling
+peels
+peep
+peeped
+peeper
+peepers
+peeping
+peeps
+peer
+peered
+peering
+peerless
+peerlessly
+peerlessness
+peers
+peeve
+peeve's
+peeved
+peevers
+peeves
+peeving
+peg
+peg's
+pegs
+pellet
+pellet's
+pelleted
+pelleting
+pellets
+pelt
+pelter
+pelting
+pelts
+pen
+penalties
+penalty
+penalty's
+penance
+penanced
+penances
+penancing
+pence
+pencil
+pencils
+pend
+pended
+pending
+pends
+pendulum
+pendulum's
+pendulums
+penetrate
+penetrated
+penetrates
+penetrating
+penetratingly
+penetration
+penetrations
+penetrative
+penetratively
+penetrativeness
+penetrator
+penetrator's
+penetrators
+penguin
+penguin's
+penguins
+peninsula
+peninsula's
+peninsulas
+penitent
+penitentiary
+penitently
+penned
+pennies
+penniless
+penning
+penny
+penny's
+pens
+pension
+pensioned
+pensioner
+pensioners
+pensioning
+pensions
+pensive
+pensively
+pensiveness
+pent
+pentagon
+pentagon's
+pentagons
+penthouse
+penthouse's
+penthouses
+people
+people's
+peopled
+peoples
+peopling
+pep
+pepper
+peppercorn
+peppercorn's
+peppercorns
+peppered
+pepperer
+peppering
+peppers
+per
+perceivable
+perceivably
+perceive
+perceived
+perceiver
+perceivers
+perceives
+perceiving
+percent
+percentage
+percentages
+percentile
+percentiles
+percents
+perceptible
+perceptibly
+perception
+perceptions
+perceptive
+perceptively
+perceptiveness
+perceptual
+perceptually
+perch
+perchance
+perched
+perches
+perching
+percolate
+percolated
+percolates
+percolating
+percolation
+percutaneous
+percutaneously
+peremptoriness
+peremptory
+perennial
+perennially
+perennials
+perfect
+perfected
+perfecter
+perfecting
+perfection
+perfectionist
+perfectionist's
+perfectionists
+perfections
+perfective
+perfectively
+perfectiveness
+perfectly
+perfectness
+perfects
+perforce
+perform
+performance
+performance's
+performances
+performed
+performer
+performers
+performing
+performs
+perfume
+perfumed
+perfumer
+perfumes
+perfuming
+perhaps
+peril
+peril's
+perilous
+perilously
+perilousness
+perils
+period
+period's
+periodic
+periodical
+periodically
+periodicals
+periods
+peripheral
+peripherally
+peripherals
+peripheries
+periphery
+periphery's
+perish
+perishable
+perishable's
+perishables
+perished
+perisher
+perishers
+perishes
+perishing
+perishingly
+permanence
+permanent
+permanently
+permanentness
+permanents
+permeate
+permeated
+permeates
+permeating
+permeation
+permeations
+permeative
+permissibility
+permissible
+permissibleness
+permissibly
+permission
+permissions
+permissive
+permissively
+permissiveness
+permit
+permit's
+permits
+permitted
+permitting
+permutation
+permutation's
+permutations
+permute
+permuted
+permutes
+permuting
+perpendicular
+perpendicularly
+perpendiculars
+perpetrate
+perpetrated
+perpetrates
+perpetrating
+perpetration
+perpetrations
+perpetrator
+perpetrator's
+perpetrators
+perpetual
+perpetually
+perpetuate
+perpetuated
+perpetuates
+perpetuating
+perpetuation
+perplex
+perplexed
+perplexedly
+perplexes
+perplexing
+perplexities
+perplexity
+persecute
+persecuted
+persecutes
+persecuting
+persecution
+persecutive
+persecutor
+persecutor's
+persecutors
+perseverance
+persevere
+persevered
+perseveres
+persevering
+persist
+persisted
+persistence
+persistent
+persistently
+persister
+persisting
+persists
+person
+person's
+personable
+personableness
+personage
+personage's
+personages
+personal
+personalities
+personality
+personality's
+personally
+personals
+personification
+personifications
+personified
+personifier
+personifies
+personify
+personifying
+personnel
+persons
+perspective
+perspective's
+perspectively
+perspectives
+perspicuous
+perspicuously
+perspicuousness
+perspiration
+perspirations
+persuadable
+persuade
+persuaded
+persuader
+persuaders
+persuades
+persuading
+persuasion
+persuasion's
+persuasions
+persuasive
+persuasively
+persuasiveness
+pertain
+pertained
+pertaining
+pertains
+pertinent
+pertinently
+perturb
+perturbation
+perturbation's
+perturbations
+perturbed
+perturbing
+perusal
+peruse
+perused
+peruser
+perusers
+peruses
+perusing
+pervade
+pervaded
+pervades
+pervading
+pervasive
+pervasively
+pervasiveness
+pervert
+perverted
+pervertedly
+pervertedness
+perverter
+perverting
+perverts
+pessimistic
+pest
+pester
+pestered
+pestering
+pesters
+pestilence
+pestilences
+pests
+pet
+petal
+petal's
+petals
+peter
+petered
+peters
+petition
+petitioned
+petitioner
+petitioning
+petitions
+petroleum
+pets
+petted
+petter
+petter's
+petters
+petticoat
+petticoat's
+petticoated
+petticoats
+pettier
+pettiest
+pettiness
+pettinesses
+petting
+petty
+pew
+pew's
+pews
+pewter
+pewterer
+phantom
+phantom's
+phantoms
+phase
+phased
+phaser
+phasers
+phases
+phasing
+pheasant
+pheasant's
+pheasants
+phenomena
+phenomenal
+phenomenally
+phenomenological
+phenomenologically
+phenomenologies
+phenomenology
+phenomenon
+philosopher
+philosopher's
+philosophers
+philosophic
+philosophical
+philosophically
+philosophies
+philosophy
+philosophy's
+phone
+phone's
+phoned
+phoneme
+phoneme's
+phonemes
+phonemic
+phonemics
+phones
+phonetic
+phonetics
+phoning
+phonograph
+phonographer
+phonographs
+phosphate
+phosphate's
+phosphates
+phosphoric
+photo
+photo's
+photocopied
+photocopier
+photocopies
+photocopy
+photocopying
+photograph
+photographed
+photographer
+photographers
+photographic
+photographing
+photographs
+photography
+photos
+phrase
+phrased
+phrases
+phrasing
+phrasings
+phyla
+phylum
+physic
+physical
+physically
+physicalness
+physicals
+physician
+physician's
+physicians
+physicist
+physicist's
+physicists
+physics
+physiological
+physiologically
+physiology
+physique
+physiqued
+pi
+piano
+piano's
+pianos
+piazza
+piazza's
+piazzas
+picayune
+pick
+picked
+picker
+pickering
+pickers
+picket
+picketed
+picketer
+picketers
+picketing
+pickets
+picking
+pickings
+pickle
+pickled
+pickles
+pickling
+picks
+pickup
+pickup's
+pickups
+picnic
+picnic's
+picnics
+pictorial
+pictorially
+pictorialness
+picture
+pictured
+pictures
+picturesque
+picturesquely
+picturesqueness
+picturing
+pie
+piece
+pieced
+piecemeal
+piecer
+pieces
+piecewise
+piecing
+pied
+pier
+pierce
+pierced
+pierces
+piercing
+piercingly
+piers
+pies
+pieties
+piety
+pig
+pig's
+pigeon
+pigeon's
+pigeons
+pigment
+pigmented
+pigments
+pigs
+pike
+pike's
+piked
+piker
+pikes
+piking
+pile
+piled
+pilers
+piles
+pilferage
+pilgrim
+pilgrim's
+pilgrimage
+pilgrimage's
+pilgrimages
+pilgrims
+piling
+pilings
+pill
+pill's
+pillage
+pillaged
+pillager
+pillages
+pillaging
+pillar
+pillared
+pillars
+pillow
+pillow's
+pillows
+pills
+pilot
+pilot's
+piloted
+piloting
+pilots
+pin
+pin's
+pinch
+pinched
+pincher
+pinches
+pinching
+pine
+pineapple
+pineapple's
+pineapples
+pined
+pines
+ping
+pinger
+pinging
+pining
+pinion
+pinioned
+pinions
+pink
+pinked
+pinker
+pinkest
+pinking
+pinkly
+pinkness
+pinks
+pinnacle
+pinnacle's
+pinnacled
+pinnacles
+pinnacling
+pinned
+pinning
+pinnings
+pinpoint
+pinpointed
+pinpointing
+pinpoints
+pins
+pint
+pint's
+pinter
+pints
+pioneer
+pioneered
+pioneering
+pioneers
+pious
+piously
+piousness
+pipe
+piped
+pipeline
+pipelined
+pipelines
+pipelining
+piper
+pipers
+pipes
+piping
+pipingly
+pipings
+pique
+piqued
+piquing
+pirate
+pirate's
+pirated
+pirates
+pirating
+piss
+pissed
+pisser
+pisses
+pissing
+pistil
+pistil's
+pistils
+pistol
+pistol's
+pistols
+piston
+piston's
+pistons
+pit
+pit's
+pitch
+pitched
+pitcher
+pitchers
+pitches
+pitching
+piteous
+piteously
+piteousness
+pitfall
+pitfall's
+pitfalls
+pith
+pithed
+pithes
+pithier
+pithiest
+pithiness
+pithing
+pithy
+pitiable
+pitiableness
+pitied
+pitier
+pitiers
+pities
+pitiful
+pitifully
+pitifulness
+pitiless
+pitilessly
+pitilessness
+pits
+pitted
+pity
+pitying
+pityingly
+pivot
+pivotal
+pivotally
+pivoted
+pivoting
+pivots
+pixel
+pixel's
+pixels
+placard
+placard's
+placards
+place
+placed
+placement
+placement's
+placements
+placer
+places
+placid
+placidly
+placidness
+placing
+plague
+plagued
+plaguer
+plagues
+plaguing
+plaid
+plaid's
+plaided
+plaids
+plain
+plainer
+plainest
+plainly
+plainness
+plains
+plaintiff
+plaintiff's
+plaintiffs
+plaintive
+plaintively
+plaintiveness
+plait
+plait's
+plaiter
+plaiting
+plaits
+plan
+plan's
+planar
+planarity
+plane
+plane's
+planed
+planer
+planers
+planes
+planet
+planet's
+planetary
+planets
+planing
+plank
+planking
+planks
+planned
+planner
+planner's
+planners
+planning
+plans
+plant
+plantation
+plantation's
+plantations
+planted
+planter
+planters
+planting
+plantings
+plants
+plasma
+plaster
+plastered
+plasterer
+plasterers
+plastering
+plasters
+plastic
+plasticity
+plasticly
+plastics
+plate
+plateau
+plateau's
+plateaus
+plated
+platelet
+platelet's
+platelets
+platen
+platen's
+platens
+plater
+platers
+plates
+platform
+platform's
+platforms
+plating
+platings
+platinum
+platter
+platter's
+platters
+plausibility
+plausible
+plausibleness
+play
+playable
+played
+player
+player's
+players
+playful
+playfully
+playfulness
+playground
+playground's
+playgrounds
+playing
+playmate
+playmate's
+playmates
+plays
+plaything
+plaything's
+playthings
+playwright
+playwright's
+playwrights
+plea
+plea's
+plead
+pleaded
+pleader
+pleading
+pleadingly
+pleadings
+pleads
+pleas
+pleasant
+pleasantly
+pleasantness
+please
+pleased
+pleasely
+pleaser
+pleases
+pleasing
+pleasingly
+pleasingness
+pleasurable
+pleasurableness
+pleasure
+pleasured
+pleasures
+pleasuring
+plebeian
+plebeianly
+plebiscite
+plebiscite's
+plebiscites
+pledge
+pledged
+pledger
+pledges
+pledging
+plenary
+plenteous
+plenteously
+plenteousness
+plenties
+plentiful
+plentifully
+plentifulness
+plenty
+pleurisy
+plication
+plied
+plier
+pliers
+plies
+plight
+plighter
+plod
+plods
+plot
+plot's
+plots
+plotted
+plotter
+plotter's
+plotters
+plotting
+ploy
+ploy's
+ploys
+pluck
+plucked
+plucker
+pluckier
+pluckiness
+plucking
+plucky
+plug
+plug's
+plugged
+plugging
+plugs
+plum
+plum's
+plumage
+plumaged
+plumages
+plumb
+plumb's
+plumbed
+plumber
+plumbers
+plumbing
+plumbs
+plume
+plumed
+plumes
+pluming
+plummeting
+plump
+plumped
+plumpen
+plumper
+plumply
+plumpness
+plums
+plunder
+plundered
+plunderer
+plunderers
+plundering
+plunders
+plunge
+plunged
+plunger
+plungers
+plunges
+plunging
+plural
+plurality
+plurally
+plurals
+plus
+pluses
+plush
+plushly
+plushness
+ply
+plying
+pneumonia
+poach
+poached
+poacher
+poachers
+poaches
+poaching
+pocket
+pocketbook
+pocketbook's
+pocketbooks
+pocketed
+pocketing
+pockets
+pod
+pod's
+pods
+poem
+poem's
+poems
+poet
+poet's
+poetic
+poetical
+poetically
+poeticalness
+poetics
+poetries
+poetry
+poetry's
+poets
+point
+pointed
+pointedly
+pointedness
+pointer
+pointers
+pointier
+pointiest
+pointing
+pointless
+pointlessly
+pointlessness
+points
+pointy
+poise
+poised
+poises
+poising
+poison
+poisoned
+poisoner
+poisoning
+poisonous
+poisonously
+poisonousness
+poisons
+poke
+poked
+poker
+pokes
+poking
+polar
+polarities
+polarity
+polarity's
+pole
+poled
+polemic
+polemics
+poler
+poles
+police
+police's
+policed
+policeman
+policeman's
+policemen
+policemen's
+polices
+policies
+policing
+policy
+policy's
+poling
+polish
+polished
+polisher
+polishers
+polishes
+polishing
+polite
+politely
+politeness
+politer
+politest
+politic
+political
+politically
+politician
+politician's
+politicians
+politics
+poll
+polled
+pollen
+poller
+polling
+polls
+pollute
+polluted
+polluter
+pollutes
+polluting
+pollution
+pollutive
+polo
+polygon
+polygon's
+polygons
+polymer
+polymer's
+polymers
+polynomial
+polynomial's
+polynomials
+polyphonic
+pomp
+pompous
+pompously
+pompousness
+pond
+ponder
+pondered
+ponderer
+pondering
+ponderous
+ponderously
+ponderousness
+ponders
+ponds
+ponies
+pony
+pony's
+poof
+pool
+pooled
+pooling
+pools
+poor
+poorer
+poorest
+poorly
+poorness
+pop
+pop's
+pope
+pope's
+popes
+poplar
+popped
+poppied
+poppies
+popping
+poppy
+poppy's
+pops
+populace
+popular
+popularity
+popularly
+populate
+populated
+populates
+populating
+population
+populations
+populous
+populously
+populousness
+porcelain
+porch
+porch's
+porches
+porcupine
+porcupine's
+porcupines
+pore
+pored
+pores
+poring
+pork
+porker
+porn
+pornographic
+porridge
+port
+portability
+portable
+portables
+portably
+portal
+portal's
+portals
+portamento
+portamento's
+ported
+portend
+portended
+portending
+portends
+porter
+portering
+porters
+porting
+portion
+portion's
+portioned
+portioning
+portions
+portlier
+portliness
+portly
+portrait
+portrait's
+portraits
+portray
+portrayed
+portrayer
+portraying
+portrays
+ports
+pose
+posed
+poser
+posers
+poses
+posing
+posit
+posited
+positing
+position
+positional
+positioned
+positioning
+positions
+positive
+positively
+positiveness
+positives
+posits
+possess
+possessed
+possessedly
+possessedness
+possesses
+possessing
+possession
+possession's
+possessional
+possessions
+possessive
+possessive's
+possessively
+possessiveness
+possessives
+possessor
+possessor's
+possessors
+possibilities
+possibility
+possibility's
+possible
+possibles
+possibly
+possum
+possum's
+possums
+post
+postage
+postal
+postcard
+postcard's
+postcards
+postcondition
+postconditions
+posted
+poster
+poster's
+posterior
+posteriorly
+posterity
+posters
+posting
+postings
+postman
+postmaster
+postmaster's
+postmasters
+postpone
+postponed
+postponer
+postpones
+postponing
+posts
+postscript
+postscript's
+postscripts
+postulate
+postulated
+postulates
+postulating
+postulation
+postulations
+posture
+posture's
+postured
+posturer
+postures
+posturing
+pot
+pot's
+potash
+potassium
+potato
+potatoes
+potent
+potentate
+potentate's
+potentates
+potential
+potentialities
+potentiality
+potentially
+potentials
+potentiating
+potentiometer
+potentiometer's
+potentiometers
+potently
+pots
+potted
+potter
+potter's
+potterer
+potteries
+potters
+pottery
+potting
+pouch
+pouch's
+pouched
+pouches
+poultry
+pounce
+pounced
+pounces
+pouncing
+pound
+pounded
+pounder
+pounders
+pounding
+pounds
+pour
+poured
+pourer
+pourers
+pouring
+pouringly
+pours
+pout
+pouted
+pouter
+pouting
+pouts
+poverty
+powder
+powdered
+powderer
+powdering
+powders
+power
+powered
+powerful
+powerfully
+powerfulness
+powering
+powerless
+powerlessly
+powerlessness
+powers
+pox
+poxes
+practicable
+practicableness
+practicably
+practical
+practicalities
+practicality
+practically
+practicalness
+practice
+practice's
+practices
+practitioner
+practitioner's
+practitioners
+pragmatic
+pragmatically
+pragmatics
+prairie
+prairies
+praise
+praised
+praiser
+praisers
+praises
+praising
+praisingly
+prance
+pranced
+prancer
+prances
+prancing
+prancingly
+prank
+prank's
+pranks
+prate
+prated
+prater
+prates
+prating
+pratingly
+pray
+prayed
+prayer
+prayer's
+prayers
+praying
+prays
+preach
+preached
+preacher
+preachers
+preaches
+preaching
+preachingly
+preallocate
+preallocated
+preallocates
+preallocating
+preallocation
+preallocation's
+preallocations
+preallocator
+preallocators
+preassign
+preassigned
+preassigning
+preassigns
+precarious
+precariously
+precariousness
+precaution
+precaution's
+precautioned
+precautioning
+precautions
+precede
+preceded
+precedence
+precedence's
+precedences
+precedent
+precedented
+precedents
+precedes
+preceding
+precept
+precept's
+preceptive
+preceptively
+precepts
+precinct
+precinct's
+precincts
+precious
+preciously
+preciousness
+precipice
+precipitate
+precipitated
+precipitately
+precipitateness
+precipitates
+precipitating
+precipitation
+precipitative
+precipitous
+precipitously
+precipitousness
+precise
+precisely
+preciseness
+precision
+precisions
+preclude
+precluded
+precludes
+precluding
+precocious
+precociously
+precociousness
+preconceive
+preconceived
+preconception
+preconception's
+preconceptions
+precondition
+preconditioned
+preconditions
+precursor
+precursor's
+precursors
+predate
+predated
+predates
+predating
+predation
+predecessor
+predecessor's
+predecessors
+predefine
+predefined
+predefines
+predefining
+predefinition
+predefinition's
+predefinitions
+predetermine
+predetermined
+predeterminer
+predetermines
+predetermining
+predicament
+predicate
+predicated
+predicates
+predicating
+predication
+predications
+predicative
+predict
+predictability
+predictable
+predictably
+predicted
+predicting
+prediction
+prediction's
+predictions
+predictive
+predictively
+predictor
+predictors
+predicts
+predominant
+predominantly
+predominate
+predominated
+predominately
+predominates
+predominating
+predomination
+preempt
+preempted
+preempting
+preemption
+preemptive
+preemptively
+preempts
+preface
+prefaced
+prefacer
+prefaces
+prefacing
+prefer
+preferable
+preferableness
+preferably
+preference
+preference's
+preferences
+preferential
+preferentially
+preferred
+preferring
+prefers
+prefix
+prefixed
+prefixes
+prefixing
+pregnant
+pregnantly
+prehistoric
+prejudge
+prejudged
+prejudger
+prejudice
+prejudiced
+prejudices
+prejudicing
+prelate
+preliminaries
+preliminary
+prelude
+prelude's
+preluded
+preluder
+preludes
+preluding
+premature
+prematurely
+prematureness
+prematurity
+premeditated
+premeditatedly
+premier
+premier's
+premiere
+premiered
+premieres
+premiering
+premiers
+premise
+premise's
+premised
+premises
+premising
+premium
+premium's
+premiums
+preoccupation
+preoccupations
+preoccupied
+preoccupies
+preoccupy
+preparation
+preparation's
+preparations
+preparative
+preparative's
+preparatively
+preparatives
+preparatory
+prepare
+prepared
+preparedly
+preparedness
+preparer
+prepares
+preparing
+prepend
+prepended
+prepender
+prependers
+prepending
+prepends
+preposition
+preposition's
+prepositional
+prepositionally
+prepositions
+preposterous
+preposterously
+preposterousness
+preprint
+preprinted
+preprinting
+preprints
+preprocessor
+preprocessors
+preproduction
+preprogrammed
+prerequisite
+prerequisite's
+prerequisites
+prerogative
+prerogative's
+prerogatived
+prerogatives
+prescribe
+prescribed
+prescriber
+prescribes
+prescribing
+prescription
+prescription's
+prescriptions
+prescriptive
+prescriptively
+preselect
+preselected
+preselecting
+preselects
+presence
+presence's
+presences
+present
+presentation
+presentation's
+presentations
+presented
+presenter
+presenters
+presenting
+presently
+presentness
+presents
+preservation
+preservations
+preservative
+preservative's
+preservatives
+preserve
+preserved
+preserver
+preservers
+preserves
+preserving
+preset
+presets
+preside
+presided
+presidency
+president
+president's
+presidential
+presidentially
+presidents
+presider
+presides
+presiding
+press
+pressed
+presser
+presses
+pressing
+pressingly
+pressings
+pressure
+pressured
+pressures
+pressuring
+prestige
+presumably
+presume
+presumed
+presumer
+presumes
+presuming
+presumingly
+presumption
+presumption's
+presumptions
+presumptuous
+presumptuously
+presumptuousness
+presuppose
+presupposed
+presupposes
+presupposing
+pretend
+pretended
+pretendedly
+pretender
+pretenders
+pretending
+pretends
+pretentious
+pretentiously
+pretentiousness
+pretext
+pretext's
+pretexts
+prettied
+prettier
+pretties
+prettiest
+prettily
+prettiness
+pretty
+prettying
+prevail
+prevailed
+prevailing
+prevailingly
+prevails
+prevalence
+prevalent
+prevalently
+prevent
+preventable
+preventably
+prevented
+preventer
+preventing
+prevention
+preventions
+preventive
+preventively
+preventiveness
+preventives
+prevents
+preview
+previewed
+previewer
+previewers
+previewing
+previews
+previous
+previously
+previousness
+prey
+preyed
+preyer
+preying
+preys
+price
+priced
+priceless
+pricer
+pricers
+prices
+pricing
+prick
+pricked
+pricker
+pricking
+pricklier
+prickliness
+prickly
+pricks
+pride
+prided
+prides
+priding
+pried
+prier
+pries
+priest
+priestliness
+priestly
+priests
+primacy
+primaries
+primarily
+primary
+primary's
+prime
+primed
+primely
+primeness
+primer
+primers
+primes
+primeval
+primevally
+priming
+primitive
+primitively
+primitiveness
+primitives
+primrose
+prince
+princelier
+princeliness
+princely
+princes
+princess
+princess's
+princesses
+principal
+principalities
+principality
+principality's
+principally
+principals
+principle
+principled
+principles
+print
+printable
+printably
+printed
+printer
+printers
+printing
+printout
+printouts
+prints
+prior
+priori
+priorities
+priority
+priority's
+priorly
+priors
+priory
+prism
+prism's
+prisms
+prison
+prisoner
+prisoner's
+prisoners
+prisons
+privacies
+privacy
+private
+privately
+privateness
+privates
+privation
+privations
+privative
+privatively
+privies
+privilege
+privileged
+privileges
+privy
+privy's
+prize
+prized
+prizer
+prizers
+prizes
+prizing
+pro
+pro's
+probabilistic
+probabilistically
+probabilities
+probability
+probable
+probably
+probate
+probated
+probates
+probating
+probation
+probationer
+probationers
+probative
+probe
+probed
+prober
+probes
+probing
+probings
+problem
+problem's
+problematic
+problematical
+problematically
+problems
+procedural
+procedurally
+procedure
+procedure's
+procedures
+proceed
+proceeded
+proceeder
+proceeding
+proceedings
+proceeds
+process
+process's
+processed
+processes
+processing
+procession
+processor
+processor's
+processors
+proclaim
+proclaimed
+proclaimer
+proclaimers
+proclaiming
+proclaims
+proclamation
+proclamation's
+proclamations
+proclivities
+proclivity
+proclivity's
+procrastinate
+procrastinated
+procrastinates
+procrastinating
+procrastination
+procrastinator
+procrastinator's
+procrastinators
+procure
+procured
+procurement
+procurement's
+procurements
+procurer
+procurers
+procures
+procuring
+prodigal
+prodigally
+prodigious
+prodigiously
+prodigiousness
+produce
+produced
+producer
+producers
+produces
+producible
+producing
+product
+product's
+production
+production's
+productions
+productive
+productively
+productiveness
+productivities
+productivity
+products
+profane
+profaned
+profanely
+profaneness
+profaner
+profaning
+profess
+professed
+professedly
+professes
+professing
+profession
+profession's
+professional
+professionalism
+professionalisms
+professionally
+professionals
+professions
+professor
+professor's
+professors
+proffer
+proffered
+proffering
+proffers
+proficiencies
+proficiency
+proficient
+proficiently
+profile
+profiled
+profiler
+profiler's
+profilers
+profiles
+profiling
+profit
+profit's
+profitability
+profitable
+profitableness
+profitably
+profited
+profiteer
+profiteer's
+profiteers
+profiter
+profiters
+profiting
+profits
+profound
+profoundest
+profoundly
+profoundness
+progeny
+program
+program's
+programmability
+programmable
+programmed
+programmer
+programmer's
+programmers
+programming
+programs
+progress
+progressed
+progresses
+progressing
+progression
+progression's
+progressions
+progressive
+progressively
+progressiveness
+prohibit
+prohibited
+prohibiter
+prohibiting
+prohibition
+prohibition's
+prohibitions
+prohibitive
+prohibitively
+prohibitiveness
+prohibits
+project
+project's
+projected
+projecting
+projection
+projection's
+projections
+projective
+projectively
+projector
+projector's
+projectors
+projects
+prolegomena
+proletariat
+proliferate
+proliferated
+proliferates
+proliferating
+proliferation
+proliferative
+prolific
+prolificness
+prolog
+prolog's
+prologs
+prologue
+prologue's
+prologues
+prolong
+prolonged
+prolonger
+prolonging
+prolongs
+promenade
+promenade's
+promenader
+promenades
+promenading
+prominence
+prominent
+prominently
+promiscuity
+promiscuity's
+promiscuous
+promiscuously
+promiscuousness
+promise
+promised
+promiser
+promises
+promising
+promisingly
+promontories
+promontory
+promote
+promoted
+promoter
+promoters
+promotes
+promoting
+promotion
+promotional
+promotions
+promotive
+promotiveness
+prompt
+prompted
+prompter
+prompters
+promptest
+prompting
+promptings
+promptly
+promptness
+prompts
+promulgate
+promulgated
+promulgates
+promulgating
+promulgation
+promulgations
+prone
+pronely
+proneness
+prong
+pronged
+prongs
+pronoun
+pronoun's
+pronounce
+pronounceable
+pronounced
+pronouncedly
+pronouncement
+pronouncement's
+pronouncements
+pronouncer
+pronounces
+pronouncing
+pronouns
+pronunciation
+pronunciation's
+pronunciations
+proof
+proof's
+proofed
+proofer
+proofing
+proofs
+prop
+propaganda
+propagate
+propagated
+propagates
+propagating
+propagation
+propagations
+propagative
+propel
+propelled
+propeller
+propeller's
+propellers
+propels
+propensities
+propensity
+proper
+properly
+properness
+propertied
+properties
+property
+prophecies
+prophecy
+prophecy's
+prophesied
+prophesier
+prophesies
+prophesy
+prophesying
+prophet
+prophet's
+prophetic
+prophets
+propitious
+propitiously
+propitiousness
+proponent
+proponent's
+proponents
+proportion
+proportional
+proportionally
+proportionately
+proportioned
+proportioner
+proportioning
+proportionment
+proportions
+proposal
+proposal's
+proposals
+propose
+proposed
+proposer
+proposers
+proposes
+proposing
+proposition
+propositional
+propositionally
+propositioned
+propositioning
+propositions
+propound
+propounded
+propounder
+propounding
+propounds
+proprietary
+proprietor
+proprietor's
+proprietors
+propriety
+props
+propulsion
+propulsion's
+propulsions
+pros
+prose
+prosecute
+prosecuted
+prosecutes
+prosecuting
+prosecution
+prosecutions
+proser
+prosing
+prosodic
+prosodics
+prospect
+prospected
+prospecting
+prospection
+prospection's
+prospections
+prospective
+prospectively
+prospectiveness
+prospectives
+prospector
+prospector's
+prospectors
+prospects
+prospectus
+prosper
+prospered
+prospering
+prosperity
+prosperous
+prosperously
+prosperousness
+prospers
+prostitution
+prostrate
+prostrated
+prostration
+protect
+protected
+protectedly
+protecting
+protection
+protection's
+protections
+protective
+protectively
+protectiveness
+protector
+protector's
+protectorate
+protectors
+protects
+protege
+protege's
+proteges
+protein
+protein's
+proteins
+protest
+protest's
+protestants
+protestation
+protestations
+protested
+protester
+protester's
+protesters
+protesting
+protestingly
+protests
+protocol
+protocol's
+protocols
+proton
+proton's
+protons
+protoplasm
+prototype
+prototype's
+prototyped
+prototypes
+prototypical
+prototypically
+prototyping
+protrude
+protruded
+protrudes
+protruding
+protrusion
+protrusion's
+protrusions
+proud
+prouder
+proudest
+proudly
+provability
+provable
+provableness
+provably
+prove
+proved
+proven
+provenly
+prover
+proverb
+proverb's
+proverbs
+provers
+proves
+provide
+provided
+providence
+provider
+providers
+provides
+providing
+province
+province's
+provinces
+provincial
+provincially
+proving
+provision
+provisional
+provisionally
+provisioned
+provisioner
+provisioning
+provisions
+provocation
+provoke
+provoked
+provokes
+provoking
+provokingly
+prow
+prow's
+prowess
+prowl
+prowled
+prowler
+prowlers
+prowling
+prowls
+prows
+proximal
+proximally
+proximate
+proximately
+proximateness
+proximity
+prudence
+prudent
+prudently
+prune
+pruned
+pruner
+pruners
+prunes
+pruning
+pry
+prying
+pryingly
+psalm
+psalm's
+psalms
+pseudo
+psyche
+psyche's
+psyches
+psychiatrist
+psychiatrist's
+psychiatrists
+psychiatry
+psychological
+psychologically
+psychologist
+psychologist's
+psychologists
+psychology
+psychosocial
+psychosocially
+pub
+pub's
+public
+publication
+publication's
+publications
+publicity
+publicly
+publicness
+publics
+publish
+published
+publisher
+publishers
+publishes
+publishing
+pubs
+pucker
+puckered
+puckering
+puckers
+pudding
+pudding's
+puddings
+puddle
+puddled
+puddler
+puddles
+puddling
+puff
+puffed
+puffer
+puffers
+puffing
+puffs
+pull
+pulled
+puller
+pulley
+pulley's
+pulleys
+pulling
+pullings
+pulls
+pulp
+pulper
+pulping
+pulpit
+pulpit's
+pulpits
+pulse
+pulsed
+pulser
+pulses
+pulsing
+pump
+pumped
+pumper
+pumping
+pumpkin
+pumpkin's
+pumpkins
+pumps
+pun
+pun's
+punch
+punched
+puncher
+puncher's
+punchers
+punches
+punching
+punchings
+punctual
+punctually
+punctualness
+punctuation
+puncture
+puncture's
+punctured
+punctures
+puncturing
+punier
+puniness
+punish
+punishable
+punished
+punisher
+punishes
+punishing
+punishment
+punishment's
+punishments
+punitive
+punitively
+punitiveness
+puns
+punt
+punted
+punter
+punters
+punting
+punts
+puny
+pup
+pup's
+pupa
+pupas
+pupil
+pupil's
+pupils
+puppet
+puppet's
+puppets
+puppies
+puppy
+puppy's
+pups
+purchasable
+purchase
+purchased
+purchaser
+purchasers
+purchases
+purchasing
+pure
+purely
+pureness
+purer
+purest
+purge
+purged
+purger
+purges
+purging
+purification
+purifications
+purified
+purifier
+purifiers
+purifies
+purify
+purifying
+purity
+purple
+purpled
+purpler
+purples
+purplest
+purpling
+purport
+purported
+purportedly
+purporter
+purporters
+purporting
+purports
+purpose
+purposed
+purposeful
+purposefully
+purposefulness
+purposely
+purposes
+purposing
+purposive
+purposively
+purposiveness
+purr
+purred
+purring
+purringly
+purrs
+purse
+pursed
+purser
+pursers
+purses
+pursing
+pursue
+pursued
+pursuer
+pursuers
+pursues
+pursuing
+pursuit
+pursuit's
+pursuits
+purview
+push
+pushbutton
+pushbuttons
+pushdown
+pushed
+pusher
+pushers
+pushes
+pushing
+puss
+pussier
+pussies
+pussy
+put
+puts
+putter
+putterer
+puttering
+putters
+putting
+puzzle
+puzzled
+puzzlement
+puzzler
+puzzlers
+puzzles
+puzzling
+puzzlings
+pygmies
+pygmy
+pygmy's
+pyramid
+pyramid's
+pyramids
+quack
+quacked
+quacking
+quacks
+quadrant
+quadrant's
+quadrants
+quadratic
+quadratical
+quadratically
+quadratics
+quadrature
+quadrature's
+quadratures
+quadruple
+quadrupled
+quadruples
+quadrupling
+quadword
+quadword's
+quadwords
+quagmire
+quagmire's
+quagmires
+quail
+quail's
+quails
+quaint
+quaintly
+quaintness
+quake
+quaked
+quaker
+quakers
+quakes
+quaking
+qualification
+qualifications
+qualified
+qualifiedly
+qualifier
+qualifiers
+qualifies
+qualify
+qualifying
+qualitative
+qualitatively
+qualities
+quality
+quality's
+qualm
+qualms
+quandaries
+quandary
+quandary's
+quanta
+quantifiable
+quantification
+quantifications
+quantified
+quantifier
+quantifiers
+quantifies
+quantify
+quantifying
+quantitative
+quantitatively
+quantitativeness
+quantities
+quantity
+quantity's
+quantum
+quarantine
+quarantine's
+quarantined
+quarantines
+quarantining
+quarrel
+quarrels
+quarrelsome
+quarrelsomely
+quarrelsomeness
+quarried
+quarrier
+quarries
+quarry
+quarry's
+quarrying
+quart
+quarter
+quartered
+quarterer
+quartering
+quarterlies
+quarterly
+quarters
+quartet
+quartet's
+quartets
+quarts
+quartz
+quash
+quashed
+quashes
+quashing
+quasi
+quaver
+quavered
+quavering
+quaveringly
+quavers
+quay
+quays
+queen
+queen's
+queenly
+queens
+queer
+queerer
+queerest
+queerly
+queerness
+queers
+quell
+quelled
+queller
+quelling
+quells
+quench
+quenched
+quencher
+quenches
+quenching
+queried
+querier
+queries
+query
+querying
+quest
+quested
+quester
+questers
+questing
+question
+questionable
+questionableness
+questionably
+questioned
+questioner
+questioners
+questioning
+questioningly
+questionings
+questionnaire
+questionnaire's
+questionnaires
+questions
+quests
+queue
+queue's
+queued
+queuer
+queuer's
+queuers
+queues
+quick
+quicken
+quickened
+quickener
+quickening
+quickens
+quicker
+quickest
+quickly
+quickness
+quicksilver
+quiet
+quieted
+quieten
+quietened
+quietening
+quietens
+quieter
+quietest
+quieting
+quietly
+quietness
+quiets
+quietude
+quill
+quills
+quilt
+quilted
+quilter
+quilting
+quilts
+quinine
+quit
+quite
+quits
+quitter
+quitter's
+quitters
+quitting
+quiver
+quivered
+quivering
+quivers
+quiz
+quizzed
+quizzes
+quizzing
+quo
+quota
+quota's
+quotas
+quotation
+quotation's
+quotations
+quote
+quoted
+quotes
+quoth
+quotient
+quotients
+quoting
+rabbit
+rabbit's
+rabbited
+rabbiter
+rabbiting
+rabbits
+rabble
+rabbled
+rabbler
+rabbling
+raccoon
+raccoon's
+raccoons
+race
+raced
+racehorse
+racehorse's
+racehorses
+racer
+racers
+races
+racial
+racially
+racing
+rack
+racked
+racker
+racket
+racket's
+racketeer
+racketeering
+racketeers
+rackets
+racking
+racks
+radar
+radar's
+radars
+radial
+radially
+radiance
+radiant
+radiantly
+radiate
+radiated
+radiately
+radiates
+radiating
+radiation
+radiations
+radiative
+radiatively
+radiator
+radiator's
+radiators
+radical
+radically
+radicalness
+radicals
+radio
+radioed
+radioing
+radiology
+radios
+radish
+radish's
+radishes
+radius
+radiuses
+radix
+radixes
+raft
+rafter
+raftered
+rafters
+rafts
+rag
+rag's
+rage
+raged
+rages
+ragged
+raggedly
+raggedness
+raging
+rags
+raid
+raided
+raider
+raiders
+raiding
+raids
+rail
+railed
+railer
+railers
+railing
+railroad
+railroaded
+railroader
+railroaders
+railroading
+railroads
+rails
+railway
+railway's
+railways
+raiment
+rain
+rain's
+rainbow
+rainbows
+raincoat
+raincoat's
+raincoats
+raindrop
+raindrop's
+raindrops
+rained
+rainfall
+rainier
+rainiest
+raining
+rains
+rainy
+raise
+raised
+raiser
+raisers
+raises
+raisin
+raising
+raisins
+rake
+raked
+raker
+rakes
+raking
+rallied
+rallies
+rally
+rallying
+ram
+ram's
+ramble
+rambled
+rambler
+ramblers
+rambles
+rambling
+ramblingly
+ramblings
+ramification
+ramification's
+ramifications
+ramp
+ramp's
+rampart
+ramparts
+ramped
+ramping
+ramps
+rams
+ramses
+ran
+ranch
+ranched
+rancher
+ranchers
+ranches
+ranching
+random
+randomly
+randomness
+rang
+range
+ranged
+ranger
+rangers
+ranges
+ranging
+rank
+ranked
+ranker
+ranker's
+rankers
+rankest
+ranking
+ranking's
+rankings
+rankle
+rankled
+rankles
+rankling
+rankly
+rankness
+ranks
+ransack
+ransacked
+ransacker
+ransacking
+ransacks
+ransom
+ransomer
+ransoming
+ransoms
+rant
+ranted
+ranter
+ranters
+ranting
+rantingly
+rants
+rap
+rap's
+rape
+raped
+raper
+rapes
+rapid
+rapidity
+rapidly
+rapidness
+rapids
+raping
+raps
+rapt
+raptly
+raptness
+rapture
+rapture's
+raptured
+raptures
+rapturing
+rapturous
+rapturously
+rapturousness
+rare
+rarely
+rareness
+rarer
+rarest
+raring
+rarities
+rarity
+rarity's
+rascal
+rascally
+rascals
+rash
+rasher
+rashes
+rashly
+rashness
+rasp
+raspberry
+rasped
+rasper
+rasping
+raspingly
+raspings
+rasps
+raster
+rasters
+rat
+rat's
+rate
+rated
+rater
+raters
+rates
+rather
+ratification
+ratifications
+ratified
+ratifies
+ratify
+ratifying
+rating
+ratings
+ratio
+ratio's
+ration
+rational
+rationale
+rationale's
+rationales
+rationalities
+rationality
+rationally
+rationalness
+rationed
+rationing
+rations
+ratios
+rats
+rattle
+rattled
+rattler
+rattlers
+rattles
+rattlesnake
+rattlesnake's
+rattlesnakes
+rattling
+rattlingly
+ravage
+ravaged
+ravager
+ravagers
+ravages
+ravaging
+rave
+raved
+raven
+ravened
+ravener
+ravening
+ravenous
+ravenously
+ravenousness
+ravens
+raver
+raves
+ravine
+ravine's
+ravined
+ravines
+raving
+ravings
+raw
+rawer
+rawest
+rawly
+rawness
+raws
+ray
+ray's
+rayed
+rays
+razor
+razor's
+razors
+re
+reabbreviate
+reabbreviated
+reabbreviates
+reabbreviating
+reach
+reachable
+reachably
+reached
+reacher
+reaches
+reaching
+reacquainted
+react
+reacted
+reacting
+reaction
+reaction's
+reactionaries
+reactionary
+reactionary's
+reactions
+reactivate
+reactivated
+reactivates
+reactivating
+reactivation
+reactive
+reactively
+reactiveness
+reactivity
+reactor
+reactor's
+reactors
+reacts
+read
+readability
+readable
+readableness
+readapting
+reader
+reader's
+readers
+readied
+readier
+readies
+readiest
+readily
+readiness
+reading
+readings
+readjustable
+readjusted
+readjustments
+readjusts
+readout
+readout's
+readouts
+reads
+ready
+readying
+reaffirm
+reaffirmed
+reaffirming
+reaffirms
+reagents
+real
+realest
+realign
+realigned
+realigning
+realignment
+realignments
+realigns
+realism
+realist
+realist's
+realistic
+realistically
+realists
+realities
+reality
+realizable
+realizable's
+realizableness
+realizables
+realizablies
+realizably
+realization
+realization's
+realizations
+realize
+realized
+realizer
+realizers
+realizes
+realizing
+realizing's
+realizingly
+realizings
+reallocate
+reallocated
+reallocates
+reallocating
+reallocation
+reallocation's
+reallocations
+reallocator
+reallocator's
+reallocators
+reallotments
+reallots
+reallotted
+reallotting
+really
+realm
+realm's
+realms
+realness
+reals
+ream
+ream's
+reamed
+reamer
+reaming
+reams
+reanalysis
+reap
+reaped
+reaper
+reaping
+reappear
+reappeared
+reappearing
+reappears
+reapplying
+reapportioned
+reappraisal
+reappraisals
+reappraised
+reappraises
+reaps
+rear
+reared
+rearer
+rearing
+rearmed
+rearms
+rearrange
+rearrangeable
+rearranged
+rearrangement
+rearrangement's
+rearrangements
+rearranges
+rearranging
+rearrest
+rearrested
+rears
+reason
+reasonable
+reasonableness
+reasonably
+reasoned
+reasoner
+reasoning
+reasonings
+reasons
+reassemble
+reassembled
+reassembler
+reassembles
+reassembling
+reasserts
+reassess
+reassessed
+reassesses
+reassessing
+reassessment
+reassessment's
+reassessments
+reassign
+reassignable
+reassigned
+reassigning
+reassignment
+reassignment's
+reassignments
+reassigns
+reassurances
+reassure
+reassured
+reassures
+reassuring
+reassuringly
+reawaken
+reawakened
+reawakening
+reawakens
+rebate
+rebate's
+rebated
+rebater
+rebates
+rebating
+rebel
+rebel's
+rebelled
+rebelling
+rebellion
+rebellion's
+rebellions
+rebellious
+rebelliously
+rebelliousness
+rebells
+rebels
+rebidding
+rebids
+rebirth
+rebirth's
+rebonds
+reboot
+rebooted
+rebooter
+rebooters
+rebooting
+reboots
+reborn
+rebound
+rebounded
+rebounder
+rebounding
+rebounds
+rebroadcast
+rebroadcasts
+rebuff
+rebuffed
+rebuffing
+rebuffs
+rebuild
+rebuilding
+rebuilds
+rebuilt
+rebuke
+rebuked
+rebuker
+rebukes
+rebuking
+rebut
+rebuttal
+rebuttals
+rebutted
+rebutting
+recalculate
+recalculated
+recalculates
+recalculating
+recalculation
+recalculations
+recall
+recalled
+recaller
+recalling
+recalls
+recapitulate
+recapitulated
+recapitulates
+recapitulating
+recapitulation
+recapped
+recapping
+recapture
+recaptured
+recaptures
+recapturing
+recast
+recasting
+recasts
+recede
+receded
+recedes
+receding
+receipt
+receipt's
+receipted
+receipting
+receipts
+receivable
+receivables
+receive
+received
+receiver
+receiver's
+receivers
+receives
+receiving
+recent
+recently
+recentness
+receptacle
+receptacle's
+receptacles
+reception
+reception's
+receptions
+receptive
+receptively
+receptiveness
+receptivity
+receptor
+receptor's
+receptors
+recess
+recessed
+recesses
+recessing
+recession
+recession's
+recessions
+recessive
+recessively
+recessiveness
+recharged
+recharges
+rechartering
+rechecked
+rechecks
+recipe
+recipe's
+recipes
+recipient
+recipient's
+recipients
+reciprocal
+reciprocally
+reciprocals
+reciprocate
+reciprocated
+reciprocates
+reciprocating
+reciprocation
+reciprocative
+reciprocity
+recirculate
+recirculated
+recirculates
+recirculating
+recirculation
+recital
+recital's
+recitals
+recitation
+recitation's
+recitations
+recite
+recited
+reciter
+recites
+reciting
+reckless
+recklessly
+recklessness
+reckon
+reckoned
+reckoner
+reckoning
+reckonings
+reckons
+reclaim
+reclaimable
+reclaimed
+reclaimer
+reclaimers
+reclaiming
+reclaims
+reclamation
+reclamations
+reclassification
+reclassified
+reclassifies
+reclassify
+reclassifying
+recline
+reclined
+reclines
+reclining
+reclustered
+reclusters
+recode
+recoded
+recodes
+recoding
+recognition
+recognition's
+recognitions
+recoil
+recoiled
+recoiling
+recoils
+recoinage
+recollect
+recollected
+recollecting
+recollection
+recollection's
+recollections
+recollects
+recombination
+recombination's
+recombinational
+recombinations
+recombine
+recombined
+recombines
+recombining
+recommenced
+recommences
+recommend
+recommendation
+recommendation's
+recommendations
+recommended
+recommender
+recommending
+recommends
+recompense
+recompilations
+recompile
+recompiled
+recompiles
+recompiling
+recompute
+recomputed
+recomputes
+recomputing
+reconcile
+reconciled
+reconciler
+reconciles
+reconciliation
+reconciliation's
+reconciliations
+reconciling
+reconditioned
+reconfigurable
+reconfiguration
+reconfiguration's
+reconfigurations
+reconfigure
+reconfigured
+reconfigurer
+reconfigures
+reconfiguring
+reconnect
+reconnected
+reconnecter
+reconnecting
+reconnection
+reconnects
+reconsider
+reconsideration
+reconsidered
+reconsidering
+reconsiders
+reconsolidated
+reconsolidates
+reconstituted
+reconstitutes
+reconstruct
+reconstructed
+reconstructible
+reconstructing
+reconstruction
+reconstructions
+reconstructive
+reconstructs
+recontacted
+reconvened
+reconvenes
+reconverts
+record
+recorded
+recorder
+recorders
+recording
+recordings
+records
+recored
+recount
+recounted
+recounter
+recounting
+recounts
+recourse
+recourses
+recover
+recoverability
+recoverable
+recovered
+recoverer
+recoveries
+recovering
+recovers
+recovery
+recovery's
+recreate
+recreated
+recreates
+recreating
+recreation
+recreational
+recreations
+recreative
+recruit
+recruit's
+recruited
+recruiter
+recruiter's
+recruiters
+recruiting
+recruits
+recta
+rectangle
+rectangle's
+rectangles
+rectangular
+rectangularly
+rector
+rector's
+rectors
+rectum
+rectum's
+rectums
+recur
+recurrence
+recurrence's
+recurrences
+recurrent
+recurrently
+recurring
+recurs
+recurse
+recursed
+recurses
+recursing
+recursion
+recursion's
+recursions
+recursive
+recursively
+recursiveness
+recurved
+recyclable
+recycle
+recycled
+recycles
+recycling
+red
+redbreast
+redden
+reddened
+reddening
+redder
+reddest
+reddish
+reddishness
+redeclare
+redeclared
+redeclares
+redeclaring
+redecorated
+redecorates
+redeem
+redeemed
+redeemer
+redeemers
+redeeming
+redeems
+redefine
+redefined
+redefines
+redefining
+redefinition
+redefinition's
+redefinitions
+redemption
+redemptioner
+redeploys
+redeposit
+redeposit's
+redeposited
+redepositing
+redepositor
+redepositor's
+redepositors
+redeposits
+redesign
+redesigned
+redesigning
+redesigns
+redetermination
+redetermines
+redevelop
+redeveloped
+redeveloper
+redevelopers
+redeveloping
+redevelopment
+redevelops
+redials
+redirect
+redirected
+redirecting
+redirection
+redirections
+redirector
+redirector's
+redirectors
+redirects
+rediscovered
+rediscovers
+redisplay
+redisplayed
+redisplaying
+redisplays
+redistribute
+redistributed
+redistributes
+redistributing
+redistribution
+redistribution's
+redistributions
+redistributive
+redly
+redness
+redoing
+redone
+redouble
+redoubled
+redoubles
+redoubling
+redoubtable
+redraw
+redrawing
+redrawn
+redraws
+redress
+redressed
+redresser
+redresses
+redressing
+reds
+reduce
+reduced
+reducer
+reducers
+reduces
+reducibility
+reducible
+reducibly
+reducing
+reduction
+reduction's
+reductions
+redundancies
+redundancy
+redundant
+redundantly
+reduplicated
+reed
+reed's
+reeder
+reeding
+reeds
+reeducation
+reef
+reefer
+reefing
+reefs
+reel
+reelect
+reelected
+reelecting
+reelects
+reeled
+reeler
+reeling
+reels
+reemerged
+reenactment
+reenforcement
+reenlists
+reenter
+reentered
+reentering
+reenters
+reentrant
+reestablish
+reestablished
+reestablishes
+reestablishing
+reestimating
+reevaluate
+reevaluated
+reevaluates
+reevaluating
+reevaluation
+reeves
+reexamine
+reexamined
+reexamines
+reexamining
+refaced
+refaces
+refelled
+refelling
+refer
+referee
+referee's
+refereed
+refereeing
+referees
+reference
+referenced
+referencer
+references
+referencing
+referendum
+referent
+referent's
+referential
+referentiality
+referentially
+referents
+referral
+referral's
+referrals
+referred
+referrer
+referring
+refers
+refill
+refillable
+refilled
+refilling
+refills
+refine
+refined
+refinement
+refinement's
+refinements
+refiner
+refines
+refining
+refinished
+reflect
+reflected
+reflecting
+reflection
+reflection's
+reflections
+reflective
+reflectively
+reflectiveness
+reflectivity
+reflector
+reflector's
+reflectors
+reflects
+reflex
+reflex's
+reflexed
+reflexes
+reflexive
+reflexively
+reflexiveness
+reflexivity
+reflexly
+refluent
+refocus
+refocused
+refocuses
+refocusing
+refolded
+reform
+reformable
+reformat
+reformation
+reformative
+reformats
+reformatted
+reformatter
+reformatting
+reformed
+reformer
+reformers
+reforming
+reforms
+reformulate
+reformulated
+reformulates
+reformulating
+reformulation
+refractoriness
+refractory
+refrain
+refrained
+refraining
+refrains
+refresh
+refreshed
+refreshen
+refresher
+refreshers
+refreshes
+refreshing
+refreshingly
+refreshment
+refreshment's
+refreshments
+refried
+refries
+refrigerator
+refrigerator's
+refrigerators
+refry
+refrying
+refuel
+refuels
+refuge
+refuged
+refugee
+refugee's
+refugees
+refuges
+refuging
+refund
+refund's
+refunded
+refunder
+refunders
+refunding
+refunds
+refusal
+refusals
+refuse
+refused
+refuser
+refuses
+refusing
+refutable
+refutation
+refute
+refuted
+refuter
+refutes
+refuting
+regain
+regained
+regaining
+regains
+regal
+regaled
+regaling
+regally
+regard
+regarded
+regarding
+regardless
+regardlessly
+regardlessness
+regards
+regenerate
+regenerated
+regenerately
+regenerateness
+regenerates
+regenerating
+regeneration
+regenerative
+regeneratively
+regenerators
+regent
+regent's
+regents
+regime
+regime's
+regimen
+regiment
+regimented
+regiments
+regimes
+region
+region's
+regional
+regionally
+regions
+register
+registered
+registering
+registers
+registration
+registration's
+registrations
+regreets
+regress
+regressed
+regresses
+regressing
+regression
+regression's
+regressions
+regressive
+regressively
+regressiveness
+regret
+regretful
+regretfully
+regretfulness
+regrets
+regrettable
+regrettably
+regretted
+regretting
+regrids
+regroup
+regrouped
+regrouping
+regular
+regularities
+regularity
+regularly
+regulars
+regulate
+regulated
+regulates
+regulating
+regulation
+regulations
+regulative
+regulator
+regulator's
+regulators
+rehash
+rehashed
+rehashes
+rehashing
+rehearsal
+rehearsal's
+rehearsals
+rehearse
+rehearsed
+rehearser
+rehearses
+rehearsing
+rehoused
+rehouses
+reign
+reigned
+reigning
+reigns
+reimbursed
+reimbursement
+reimbursement's
+reimbursements
+rein
+reincarnate
+reincarnated
+reincarnation
+reincorporating
+reincorporation
+reindeer
+reined
+reinforce
+reinforced
+reinforcement
+reinforcement's
+reinforcements
+reinforcer
+reinforces
+reinforcing
+reining
+reins
+reinsert
+reinserted
+reinserting
+reinsertions
+reinserts
+reinstall
+reinstalled
+reinstaller
+reinstalling
+reinstalls
+reinstate
+reinstated
+reinstatement
+reinstates
+reinstating
+reintegrated
+reinterpret
+reinterpretations
+reinterpreted
+reinterpreting
+reinterprets
+reinterviewed
+reintroduce
+reintroduced
+reintroduces
+reintroducing
+reinvent
+reinvented
+reinventing
+reinvention
+reinvents
+reinvested
+reinvoked
+reinvokes
+reissue
+reissued
+reissuer
+reissuer's
+reissuers
+reissues
+reissuing
+reiterate
+reiterated
+reiterates
+reiterating
+reiteration
+reiterations
+reiterative
+reiteratively
+reiterativeness
+reject
+rejected
+rejecter
+rejecting
+rejectingly
+rejection
+rejection's
+rejections
+rejective
+rejector
+rejector's
+rejectors
+rejects
+rejoice
+rejoiced
+rejoicer
+rejoices
+rejoicing
+rejoicingly
+rejoin
+rejoined
+rejoining
+rejoins
+rekindle
+rekindled
+rekindler
+rekindles
+rekindling
+reknit
+relabel
+relabels
+relapse
+relapsed
+relapser
+relapses
+relapsing
+relate
+related
+relatedly
+relatedness
+relater
+relates
+relating
+relation
+relational
+relationally
+relations
+relationship
+relationship's
+relationships
+relative
+relatively
+relativeness
+relatives
+relativism
+relativistic
+relativistically
+relativity
+relativity's
+relax
+relaxation
+relaxation's
+relaxations
+relaxed
+relaxedly
+relaxedness
+relaxer
+relaxes
+relaxing
+relay
+relayed
+relaying
+relays
+relearns
+release
+released
+releaser
+releases
+releasing
+relegate
+relegated
+relegates
+relegating
+relegation
+relent
+relented
+relenting
+relentless
+relentlessly
+relentlessness
+relents
+relevance
+relevances
+relevant
+relevantly
+reliabilities
+reliability
+reliable
+reliableness
+reliably
+reliance
+relic
+relic's
+relicense
+relicensed
+relicenser
+relicenses
+relicensing
+relics
+relied
+relief
+reliefs
+relier
+relies
+relieve
+relieved
+relievedly
+reliever
+relievers
+relieves
+relieving
+religion
+religion's
+religions
+religious
+religiously
+religiousness
+relinking
+relinquish
+relinquished
+relinquishes
+relinquishing
+relish
+relished
+relishes
+relishing
+relive
+relives
+reliving
+reload
+reloaded
+reloader
+reloading
+reloads
+relocate
+relocated
+relocates
+relocating
+relocation
+relocations
+reluctance
+reluctances
+reluctant
+reluctantly
+rely
+relying
+remade
+remain
+remainder
+remainder's
+remaindered
+remaindering
+remainders
+remained
+remaining
+remains
+remark
+remarkable
+remarkableness
+remarkably
+remarked
+remarking
+remarks
+remarriages
+remarried
+remedied
+remedies
+remedy
+remedying
+remember
+remembered
+rememberer
+remembering
+remembers
+remembrance
+remembrance's
+remembrancer
+remembrances
+remind
+reminded
+reminder
+reminders
+reminding
+reminds
+reminiscence
+reminiscence's
+reminiscences
+reminiscent
+reminiscently
+remissions
+remittance
+remittances
+remixed
+remnant
+remnant's
+remnants
+remodel
+remodels
+remodulate
+remodulated
+remodulates
+remodulating
+remodulation
+remodulator
+remodulator's
+remodulators
+remolding
+remonstrate
+remonstrated
+remonstrates
+remonstrating
+remonstration
+remonstrative
+remonstratively
+remorse
+remote
+remotely
+remoteness
+remotest
+remotion
+remoulds
+removable
+removableness
+removal
+removal's
+removals
+remove
+removed
+remover
+removes
+removing
+renaissance
+renal
+rename
+renamed
+renames
+renaming
+renatured
+renatures
+rend
+render
+rendered
+renderer
+rendering
+renderings
+renders
+rendezvous
+rendezvoused
+rendezvouses
+rendezvousing
+rending
+rendition
+rendition's
+renditions
+rends
+renegotiable
+renegotiated
+renegotiates
+renew
+renewal
+renewals
+renewed
+renewer
+renewing
+renews
+reno
+renominated
+renominates
+renounce
+renounced
+renouncer
+renounces
+renouncing
+renown
+renowned
+rent
+rental
+rental's
+rentals
+rented
+renter
+renter's
+renters
+renting
+rents
+renumber
+renumbered
+renumbering
+renumbers
+reopen
+reopened
+reopening
+reopens
+reorder
+reordered
+reordering
+reorders
+reoriented
+repackage
+repackaged
+repackager
+repackages
+repackaging
+repacks
+repaid
+repaint
+repainted
+repainter
+repainters
+repainting
+repaints
+repair
+repaired
+repairer
+repairers
+repairing
+repairman
+repairs
+reparable
+reparation
+reparation's
+reparations
+repartition
+repartitioned
+repartitioner
+repartitioners
+repartitioning
+repartitions
+repast
+repast's
+repasts
+repaving
+repay
+repayable
+repaying
+repayments
+repays
+repeal
+repealed
+repealer
+repealing
+repeals
+repeat
+repeatable
+repeated
+repeatedly
+repeater
+repeaters
+repeating
+repeats
+repel
+repels
+repent
+repentance
+repented
+repenter
+repenting
+repents
+repercussion
+repercussion's
+repercussions
+repertoire
+repetition
+repetition's
+repetitions
+repetitive
+repetitively
+repetitiveness
+rephrase
+rephrased
+rephrases
+rephrasing
+repine
+repined
+repiner
+repining
+replace
+replaceable
+replaced
+replacement
+replacement's
+replacements
+replacer
+replaces
+replacing
+replanted
+replay
+replayed
+replaying
+replays
+repleader
+replenish
+replenished
+replenisher
+replenishes
+replenishing
+replete
+repleteness
+repletion
+replica
+replica's
+replicas
+replicate
+replicated
+replicates
+replicating
+replication
+replications
+replicative
+replied
+replier
+replies
+reply
+replying
+report
+reported
+reportedly
+reporter
+reporters
+reporting
+reports
+repose
+reposed
+reposes
+reposing
+reposition
+repositioned
+repositioning
+repositions
+repositories
+repository
+repository's
+repost
+reposted
+reposter
+reposting
+repostings
+reposts
+represent
+representable
+representably
+representation
+representation's
+representational
+representationally
+representations
+representative
+representatively
+representativeness
+representatives
+represented
+representer
+representing
+represents
+repress
+repressed
+represses
+repressing
+repression
+repression's
+repressions
+repressive
+repressively
+repressiveness
+reprieve
+reprieved
+reprieves
+reprieving
+reprint
+reprinted
+reprinter
+reprinting
+reprints
+reprisal
+reprisal's
+reprisals
+reproach
+reproached
+reproacher
+reproaches
+reproaching
+reproachingly
+reprobates
+reprocessed
+reproduce
+reproduced
+reproducer
+reproducers
+reproduces
+reproducibilities
+reproducibility
+reproducible
+reproducibly
+reproducing
+reproduction
+reproduction's
+reproductions
+reproductive
+reproductively
+reproductivity
+reprogrammed
+reprogrammer
+reprogrammer's
+reprogrammers
+reprogramming
+reproof
+reprove
+reproved
+reprover
+reproving
+reprovingly
+reptile
+reptile's
+reptiles
+republic
+republic's
+republican
+republican's
+republicans
+republication
+republics
+republish
+republished
+republisher
+republisher's
+republishers
+republishes
+republishing
+repudiate
+repudiated
+repudiates
+repudiating
+repudiation
+repudiations
+repulse
+repulsed
+repulses
+repulsing
+repulsion
+repulsions
+repulsive
+repulsively
+repulsiveness
+reputable
+reputably
+reputation
+reputation's
+reputations
+repute
+reputed
+reputedly
+reputes
+reputing
+request
+requested
+requester
+requesters
+requesting
+requestioned
+requests
+requiem
+requiem's
+requiems
+require
+required
+requirement
+requirement's
+requirements
+requirer
+requires
+requiring
+requisite
+requisiteness
+requisites
+requisition
+requisitioned
+requisitioner
+requisitioning
+requisitions
+requite
+requited
+requiter
+requiting
+reran
+reread
+rereading
+rereads
+reroute
+rerouted
+rerouter
+rerouters
+reroutes
+reroutings
+rerun
+rerunning
+reruns
+res
+resalable
+resaturated
+resaturates
+rescaled
+rescan
+rescanned
+rescanning
+rescans
+reschedule
+rescheduled
+rescheduler
+reschedules
+rescheduling
+rescue
+rescued
+rescuer
+rescuers
+rescues
+rescuing
+resealed
+research
+researched
+researcher
+researcher's
+researchers
+researches
+researching
+reselect
+reselected
+reselecting
+reselects
+resell
+reseller
+resellers
+reselling
+resells
+resemblance
+resemblance's
+resemblances
+resemble
+resembled
+resembles
+resembling
+resends
+resent
+resented
+resentful
+resentfully
+resentfulness
+resenting
+resentment
+resents
+resequenced
+reservation
+reservation's
+reservations
+reserve
+reserved
+reservedly
+reservedness
+reserver
+reserves
+reserving
+reservoir
+reservoir's
+reservoirs
+reset
+reseted
+reseter
+reseting
+resets
+resetting
+resettings
+resettled
+resettles
+resettling
+reshape
+reshaped
+reshaper
+reshapes
+reshaping
+reside
+resided
+residence
+residence's
+residences
+resident
+resident's
+residential
+residentially
+residents
+resider
+resides
+residing
+residue
+residue's
+residues
+resifted
+resign
+resignation
+resignation's
+resignations
+resigned
+resignedly
+resignedness
+resigner
+resigning
+resigns
+resin
+resin's
+resined
+resining
+resins
+resist
+resistance
+resistances
+resistant
+resistantly
+resisted
+resister
+resistible
+resistibly
+resisting
+resistive
+resistively
+resistiveness
+resistivity
+resistor
+resistor's
+resistors
+resists
+resize
+resized
+resizes
+resizing
+resold
+resoluble
+resolute
+resolutely
+resoluteness
+resolution
+resolutions
+resolutive
+resolvable
+resolve
+resolved
+resolver
+resolvers
+resolves
+resolving
+resonance
+resonances
+resonant
+resonantly
+resort
+resorted
+resorter
+resorting
+resorts
+resound
+resounding
+resoundingly
+resounds
+resource
+resource's
+resourced
+resourceful
+resourcefully
+resourcefulness
+resources
+resourcing
+respecified
+respect
+respectability
+respectable
+respectableness
+respectably
+respected
+respecter
+respectful
+respectfully
+respectfulness
+respecting
+respective
+respectively
+respectiveness
+respects
+respiration
+respirations
+respired
+respires
+respite
+respited
+respiting
+resplendent
+resplendently
+respond
+responded
+respondent
+respondent's
+respondents
+responder
+responders
+responding
+responds
+response
+responser
+responses
+responsibilities
+responsibility
+responsible
+responsibleness
+responsibly
+responsions
+responsive
+responsively
+responsiveness
+rest
+restart
+restarted
+restarter
+restarting
+restarts
+restate
+restated
+restatement
+restates
+restating
+restaurant
+restaurant's
+restaurants
+rested
+rester
+restful
+restfully
+restfulness
+resting
+restive
+restively
+restiveness
+restless
+restlessly
+restlessness
+restoration
+restoration's
+restorations
+restore
+restored
+restorer
+restorers
+restores
+restoring
+restrain
+restrained
+restrainedly
+restrainer
+restrainers
+restraining
+restrains
+restraint
+restraint's
+restraints
+restrict
+restricted
+restrictedly
+restricting
+restriction
+restriction's
+restrictions
+restrictive
+restrictively
+restrictiveness
+restricts
+restroom
+restroom's
+restrooms
+restructure
+restructured
+restructures
+restructuring
+rests
+resubmit
+resubmits
+resubmitted
+resubmitting
+result
+resultant
+resultantly
+resultants
+resulted
+resulting
+results
+resumable
+resume
+resumed
+resumes
+resuming
+resumption
+resumption's
+resumptions
+resupplier
+resupplier's
+resuppliers
+resurface
+resurfaced
+resurfacer
+resurfacer's
+resurfacers
+resurfaces
+resurfacing
+resurged
+resurges
+resurrect
+resurrected
+resurrecting
+resurrection
+resurrection's
+resurrections
+resurrects
+resuspended
+retail
+retailed
+retailer
+retailers
+retailing
+retails
+retain
+retained
+retainer
+retainers
+retaining
+retainment
+retains
+retaliation
+retard
+retarded
+retarder
+retarding
+retention
+retentions
+retentive
+retentively
+retentiveness
+rethinks
+rethreading
+reticence
+reticent
+reticently
+reticle
+reticle's
+reticles
+reticular
+reticulate
+reticulated
+reticulately
+reticulates
+reticulating
+reticulation
+retied
+retina
+retina's
+retinal
+retinas
+retinue
+retinues
+retire
+retired
+retiredly
+retiredness
+retirement
+retirement's
+retirements
+retires
+retiring
+retiringly
+retiringness
+retitled
+retold
+retort
+retorted
+retorting
+retorts
+retrace
+retraced
+retraces
+retracing
+retract
+retractable
+retracted
+retracting
+retraction
+retractions
+retractor
+retractor's
+retractors
+retracts
+retrain
+retrained
+retraining
+retrains
+retranslated
+retransmission
+retransmission's
+retransmissions
+retransmit
+retransmits
+retransmitted
+retransmitting
+retreat
+retreated
+retreater
+retreating
+retreats
+retried
+retrier
+retriers
+retries
+retrievable
+retrieval
+retrieval's
+retrievals
+retrieve
+retrieved
+retriever
+retrievers
+retrieves
+retrieving
+retroactively
+retrospect
+retrospection
+retrospective
+retrospectively
+retry
+retrying
+return
+returnable
+returned
+returner
+returners
+returning
+returns
+retype
+retyped
+retypes
+retyping
+reunion
+reunion's
+reunions
+reunite
+reunited
+reuniting
+reupholstering
+reusable
+reuse
+reused
+reuses
+reusing
+revalidated
+revalidates
+revalidation
+revalued
+revalues
+revamp
+revamped
+revamping
+revamps
+reveal
+revealed
+revealer
+revealing
+reveals
+revel
+revelation
+revelation's
+revelations
+revelry
+revels
+revenge
+revenge's
+revenged
+revenger
+revenges
+revenging
+revenue
+revenuer
+revenuers
+revenues
+revere
+revered
+reverence
+reverencer
+reverend
+reverend's
+reverends
+reverently
+reveres
+reverified
+reverifies
+reverify
+reverifying
+revering
+reversal
+reversal's
+reversals
+reverse
+reversed
+reversely
+reverser
+reverses
+reversible
+reversing
+reversion
+reversioner
+reversions
+revert
+reverted
+reverter
+reverting
+revertive
+reverts
+revetting
+review
+reviewed
+reviewer
+reviewers
+reviewing
+reviews
+revile
+reviled
+reviler
+reviling
+revise
+revised
+reviser
+revises
+revising
+revision
+revision's
+revisions
+revisit
+revisited
+revisiting
+revisits
+revival
+revival's
+revivals
+revive
+revived
+reviver
+revives
+reviving
+revocation
+revocations
+revoke
+revoked
+revoker
+revokes
+revoking
+revolt
+revolted
+revolter
+revolting
+revoltingly
+revolts
+revolution
+revolution's
+revolutionaries
+revolutionariness
+revolutionary
+revolutionary's
+revolutions
+revolve
+revolved
+revolver
+revolvers
+revolves
+revolving
+reward
+rewarded
+rewarder
+rewarding
+rewardingly
+rewards
+rewind
+rewinded
+rewinder
+rewinding
+rewinds
+rewired
+rewires
+reword
+reworded
+rewording
+rewording's
+rewordings
+rewords
+rework
+reworked
+reworking
+reworks
+rewound
+rewrite
+rewriter
+rewrites
+rewriting
+rewritings
+rewritten
+rewrote
+rhetoric
+rheumatism
+rhinoceros
+rhubarb
+rhyme
+rhymed
+rhymer
+rhymes
+rhyming
+rhythm
+rhythm's
+rhythmic
+rhythmical
+rhythmically
+rhythmics
+rhythms
+rib
+rib's
+ribbed
+ribbing
+ribbon
+ribbon's
+ribbons
+ribs
+rice
+ricer
+rices
+rich
+richen
+richened
+richening
+richer
+riches
+richest
+richly
+richness
+rickshaw
+rickshaw's
+rickshaws
+rid
+ridden
+riddle
+riddled
+riddler
+riddles
+riddling
+ride
+rider
+rider's
+riders
+rides
+ridge
+ridge's
+ridged
+ridges
+ridging
+ridicule
+ridiculed
+ridiculer
+ridicules
+ridiculing
+ridiculous
+ridiculously
+ridiculousness
+riding
+ridings
+rids
+rifle
+rifled
+rifleman
+rifler
+rifles
+rifling
+rift
+rig
+rig's
+rigged
+rigging
+right
+righted
+righten
+righteous
+righteously
+righteousness
+righter
+rightful
+rightfully
+rightfulness
+righting
+rightly
+rightmost
+rightness
+rights
+rightward
+rightwards
+rigid
+rigidities
+rigidity
+rigidly
+rigidness
+rigorous
+rigorously
+rigorousness
+rigs
+rill
+rim
+rim's
+rime
+rimer
+riming
+rims
+rind
+rind's
+rinded
+rinds
+ring
+ringed
+ringer
+ringers
+ringing
+ringingly
+ringings
+rings
+rinse
+rinsed
+rinser
+rinses
+rinsing
+riot
+rioted
+rioter
+rioters
+rioting
+riotous
+riotously
+riotousness
+riots
+rip
+ripe
+ripely
+ripen
+ripened
+ripener
+ripeness
+ripening
+ripens
+riper
+ripest
+ripped
+ripping
+ripple
+rippled
+rippler
+ripples
+rippling
+rips
+rise
+risen
+riser
+risers
+rises
+rising
+risings
+risk
+risked
+risker
+risking
+risks
+rite
+rite's
+rited
+rites
+ritual
+ritually
+rituals
+rival
+rivalries
+rivalry
+rivalry's
+rivals
+rive
+rived
+riven
+river
+river's
+rivers
+riverside
+rivet
+riveted
+riveter
+riveting
+rivets
+riving
+rivulet
+rivulet's
+rivulets
+road
+road's
+roads
+roadside
+roadsides
+roadster
+roadster's
+roadsters
+roadway
+roadway's
+roadways
+roam
+roamed
+roamer
+roaming
+roams
+roar
+roared
+roarer
+roaring
+roaringest
+roars
+roast
+roasted
+roaster
+roasting
+roasts
+rob
+robbed
+robber
+robber's
+robberies
+robbers
+robbery
+robbery's
+robbing
+robe
+robed
+robes
+robin
+robin's
+robing
+robins
+robot
+robot's
+robotic
+robotics
+robots
+robs
+robust
+robustly
+robustness
+rock
+rocked
+rocker
+rockers
+rocket
+rocket's
+rocketed
+rocketing
+rockets
+rockier
+rockies
+rockiness
+rocking
+rocks
+rocky
+rod
+rod's
+rode
+rods
+roe
+roes
+rogue
+rogue's
+rogues
+roguing
+role
+role's
+roles
+roll
+rolled
+roller
+rollers
+rolling
+rolls
+romance
+romanced
+romancer
+romancers
+romances
+romancing
+romantic
+romantic's
+romantically
+romantics
+romp
+romped
+romper
+rompers
+romping
+romps
+roof
+roofed
+roofer
+roofers
+roofing
+roofs
+rook
+rooks
+room
+roomed
+roomer
+roomers
+rooming
+rooms
+roost
+rooster
+roosters
+root
+root's
+rooted
+rootedness
+rooter
+rooting
+roots
+rope
+roped
+roper
+ropers
+ropes
+roping
+rose
+rose's
+rosebud
+rosebud's
+rosebuds
+roses
+rosier
+rosiness
+rosy
+rot
+rotary
+rotate
+rotated
+rotates
+rotating
+rotation
+rotational
+rotationally
+rotations
+rotative
+rotatively
+rotator
+rotator's
+rotators
+rots
+rotten
+rottenly
+rottenness
+rouge
+rough
+roughed
+roughen
+roughened
+roughening
+roughens
+rougher
+roughest
+roughly
+roughness
+rouging
+round
+roundabout
+roundaboutness
+rounded
+roundedness
+rounder
+rounders
+roundest
+rounding
+roundly
+roundness
+roundoff
+rounds
+roundup
+roundup's
+roundups
+rouse
+roused
+rouser
+rouses
+rousing
+rout
+route
+routed
+router
+routers
+routes
+routine
+routinely
+routines
+routing
+routings
+rove
+roved
+rover
+roves
+roving
+row
+rowed
+rowen
+rower
+rowers
+rowing
+rows
+royal
+royalist
+royalist's
+royalists
+royally
+royalties
+royalty
+royalty's
+rub
+rubbed
+rubber
+rubber's
+rubbers
+rubbing
+rubbish
+rubbishes
+rubble
+rubbled
+rubbling
+rubies
+rubout
+rubs
+ruby
+ruby's
+rudder
+rudder's
+rudders
+ruddier
+ruddiness
+ruddy
+rude
+rudely
+rudeness
+ruder
+rudest
+rudiment
+rudiment's
+rudimentariness
+rudimentary
+rudiments
+rue
+ruefully
+rues
+ruffian
+ruffianly
+ruffians
+ruffle
+ruffled
+ruffler
+ruffles
+ruffling
+rug
+rug's
+rugged
+ruggedly
+ruggedness
+rugs
+ruin
+ruination
+ruination's
+ruinations
+ruined
+ruiner
+ruing
+ruining
+ruinous
+ruinously
+ruinousness
+ruins
+rule
+ruled
+ruler
+rulers
+rules
+ruling
+rulings
+rum
+rumble
+rumbled
+rumbler
+rumbles
+rumbling
+rumen
+rumens
+rump
+rumple
+rumpled
+rumples
+rumplier
+rumpling
+rumply
+rumps
+run
+runaway
+runaways
+rung
+rung's
+rungs
+runnable
+runner
+runner's
+runners
+running
+runs
+runtime
+rupture
+ruptured
+ruptures
+rupturing
+rural
+rurally
+rush
+rushed
+rusher
+rushes
+rushing
+russet
+russeted
+russeting
+russets
+rust
+rusted
+rustic
+rusticate
+rusticated
+rusticates
+rusticating
+rustication
+rustier
+rustiness
+rusting
+rustle
+rustled
+rustler
+rustlers
+rustles
+rustling
+rusts
+rusty
+rut
+rut's
+ruthless
+ruthlessly
+ruthlessness
+ruts
+rye
+rye's
+sable
+sable's
+sables
+sabotage
+sabotaged
+sabotages
+sabotaging
+sack
+sacked
+sacker
+sacking
+sacks
+sacred
+sacredly
+sacredness
+sacrifice
+sacrificed
+sacrificer
+sacrificers
+sacrifices
+sacrificial
+sacrificially
+sacrificing
+sad
+sadden
+saddened
+saddening
+saddens
+sadder
+saddest
+saddle
+saddled
+saddler
+saddles
+saddling
+sadism
+sadist
+sadist's
+sadistic
+sadistically
+sadists
+sadly
+sadness
+safe
+safeguard
+safeguarded
+safeguarding
+safeguards
+safely
+safeness
+safer
+safes
+safest
+safetied
+safeties
+safety
+safetying
+sag
+sagacious
+sagaciously
+sagaciousness
+sagacity
+sage
+sagely
+sageness
+sages
+sags
+said
+sail
+sailed
+sailer
+sailing
+sailor
+sailorly
+sailors
+sails
+saint
+sainted
+saintliness
+saintly
+saints
+sake
+saker
+sakes
+salable
+salad
+salad's
+salads
+salaried
+salaries
+salary
+sale
+sale's
+sales
+salesman
+salesmen
+salespeople
+salespeople's
+salesperson
+salesperson's
+salient
+saliently
+saline
+saliva
+sallied
+sallies
+sallow
+sallowness
+sally
+sallying
+salmon
+salmons
+salon
+salon's
+salons
+saloon
+saloon's
+saloons
+salt
+salted
+salter
+salters
+saltier
+saltiest
+saltiness
+salting
+saltness
+salts
+salty
+salutariness
+salutary
+salutation
+salutation's
+salutations
+salute
+saluted
+saluter
+salutes
+saluting
+salvage
+salvaged
+salvager
+salvages
+salvaging
+salvation
+salve
+salver
+salves
+salving
+same
+sameness
+sample
+sample's
+sampled
+sampler
+samplers
+samples
+sampling
+samplings
+sanctification
+sanctified
+sanctifier
+sanctify
+sanction
+sanctioned
+sanctioning
+sanctions
+sanctities
+sanctity
+sanctuaries
+sanctuary
+sanctuary's
+sand
+sandal
+sandal's
+sandals
+sanded
+sander
+sanders
+sandier
+sandiness
+sanding
+sandpaper
+sands
+sandstone
+sandstones
+sandwich
+sandwiched
+sandwiches
+sandwiching
+sandy
+sane
+sanely
+saneness
+saner
+sanest
+sang
+sanguine
+sanguinely
+sanguineness
+sanitarium
+sanitariums
+sanitary
+sanitation
+sanity
+sank
+sap
+sap's
+sapling
+sapling's
+saplings
+sapphire
+saps
+sarcasm
+sarcasm's
+sarcasms
+sarcastic
+sash
+sashed
+sashes
+sat
+satchel
+satchel's
+satchels
+sate
+sated
+satellite
+satellite's
+satellites
+sates
+satin
+sating
+satire
+satire's
+satires
+satirist
+satirist's
+satirists
+satisfaction
+satisfaction's
+satisfactions
+satisfactorily
+satisfactoriness
+satisfactory
+satisfiability
+satisfiable
+satisfied
+satisfier
+satisfiers
+satisfies
+satisfy
+satisfying
+satisfyingly
+saturate
+saturated
+saturater
+saturates
+saturating
+saturation
+saturations
+satyr
+sauce
+saucepan
+saucepan's
+saucepans
+saucer
+saucers
+sauces
+saucier
+sauciness
+saucing
+saucy
+saunter
+sauntered
+saunterer
+sauntering
+saunters
+sausage
+sausage's
+sausages
+savage
+savaged
+savagely
+savageness
+savager
+savagers
+savages
+savaging
+save
+saved
+saver
+savers
+saves
+saving
+savings
+saw
+sawed
+sawer
+sawing
+sawmill
+sawmill's
+sawmills
+saws
+sawtooth
+say
+sayer
+sayers
+saying
+sayings
+says
+scabbard
+scabbard's
+scabbards
+scaffold
+scaffolding
+scaffoldings
+scaffolds
+scalable
+scalar
+scalar's
+scalars
+scald
+scalded
+scalding
+scalds
+scale
+scaled
+scaler
+scalers
+scales
+scalier
+scaliness
+scaling
+scalings
+scallop
+scalloped
+scalloper
+scalloping
+scallops
+scalp
+scalp's
+scalper
+scalping
+scalps
+scaly
+scam
+scam's
+scamper
+scampered
+scampering
+scampers
+scams
+scan
+scandal
+scandal's
+scandalous
+scandalously
+scandalousness
+scandals
+scanned
+scanner
+scanner's
+scanners
+scanning
+scans
+scant
+scantier
+scanties
+scantiest
+scantily
+scantiness
+scantly
+scantness
+scanty
+scar
+scar's
+scarce
+scarcely
+scarceness
+scarcer
+scarcest
+scarcity
+scare
+scared
+scarer
+scares
+scarf
+scarfs
+scarier
+scaring
+scarlet
+scars
+scary
+scatter
+scattered
+scatterer
+scattering
+scatteringly
+scatters
+scavenger
+scavenger's
+scavengers
+scenario
+scenario's
+scenarios
+scene
+scene's
+sceneries
+scenery
+scenes
+scenic
+scenics
+scent
+scented
+scents
+schedule
+schedule's
+scheduled
+scheduler
+scheduler's
+schedulers
+schedules
+scheduling
+schema
+schema's
+schemas
+schemata
+schematic
+schematically
+schematics
+scheme
+scheme's
+schemed
+schemer
+schemers
+schemes
+scheming
+schizophrenia
+scholar
+scholarly
+scholars
+scholarship
+scholarship's
+scholarships
+scholastic
+scholastically
+scholastics
+school
+schoolboy
+schoolboy's
+schoolboys
+schooled
+schooler
+schoolers
+schoolhouse
+schoolhouse's
+schoolhouses
+schooling
+schoolmaster
+schoolmaster's
+schoolmasters
+schoolroom
+schoolroom's
+schoolrooms
+schools
+schoolyard
+schoolyard's
+schoolyards
+schooner
+science
+science's
+sciences
+scientific
+scientifically
+scientist
+scientist's
+scientists
+scissor
+scissored
+scissoring
+scissors
+scoff
+scoffed
+scoffer
+scoffing
+scoffs
+scold
+scolded
+scolder
+scolding
+scolds
+scoop
+scooped
+scooper
+scooping
+scoops
+scope
+scoped
+scopes
+scoping
+scorch
+scorched
+scorcher
+scorches
+scorching
+scorchingly
+score
+score's
+scored
+scorer
+scorers
+scores
+scoring
+scorings
+scorn
+scorned
+scorner
+scornful
+scornfully
+scornfulness
+scorning
+scorns
+scorpion
+scorpion's
+scorpions
+scoundrel
+scoundrel's
+scoundrelly
+scoundrels
+scour
+scoured
+scourer
+scourge
+scourger
+scourging
+scouring
+scourings
+scours
+scout
+scouted
+scouter
+scouting
+scouts
+scow
+scowl
+scowled
+scowler
+scowling
+scowls
+scramble
+scrambled
+scrambler
+scrambles
+scrambling
+scrap
+scrap's
+scrape
+scraped
+scraper
+scrapers
+scrapes
+scraping
+scrapings
+scrapped
+scraps
+scratch
+scratched
+scratcher
+scratchers
+scratches
+scratching
+scrawl
+scrawled
+scrawler
+scrawling
+scrawls
+scream
+screamed
+screamer
+screamers
+screaming
+screamingly
+screams
+screech
+screeched
+screecher
+screeches
+screeching
+screen
+screened
+screener
+screening
+screenings
+screens
+screw
+screwed
+screwer
+screwing
+screws
+scribble
+scribbled
+scribbler
+scribbles
+scribbling
+scribe
+scriber
+scribes
+scribing
+script
+script's
+scripted
+scripting
+scripts
+scripture
+scriptures
+scroll
+scrolled
+scrolling
+scrolls
+scrooge
+scrooge's
+scrooges
+scrub
+scrubs
+scruple
+scrupled
+scruples
+scrupling
+scrupulous
+scrupulously
+scrupulousness
+scrutiny
+scuffle
+scuffled
+scuffles
+scuffling
+sculpt
+sculpted
+sculpting
+sculptor
+sculptor's
+sculptors
+sculpts
+sculpture
+sculptured
+sculptures
+sculpturing
+scum
+scum's
+scums
+scurried
+scurry
+scurrying
+scuttle
+scuttled
+scuttles
+scuttling
+scythe
+scythe's
+scythes
+scything
+sea
+seaboard
+seacoast
+seacoast's
+seacoasts
+seal
+sealed
+sealer
+sealing
+seals
+sealy
+seam
+seaman
+seamanly
+seamed
+seamen
+seamer
+seaming
+seams
+seaport
+seaport's
+seaports
+sear
+search
+searched
+searcher
+searcher's
+searchers
+searches
+searching
+searchingly
+searchings
+seared
+searing
+searingly
+sears
+seas
+seashore
+seashore's
+seashores
+seaside
+season
+season's
+seasonable
+seasonableness
+seasonably
+seasonal
+seasonally
+seasoned
+seasoner
+seasoners
+seasoning
+seasonings
+seasonly
+seasons
+seat
+seated
+seater
+seating
+seats
+seaward
+seawards
+seaweed
+seaweeds
+secede
+seceded
+seceder
+secedes
+seceding
+secluded
+secludedly
+secludedness
+seclusion
+second
+secondaries
+secondarily
+secondariness
+secondary
+seconded
+seconder
+seconders
+secondhand
+seconding
+secondly
+seconds
+secrecy
+secret
+secretarial
+secretaries
+secretary
+secretary's
+secrete
+secreted
+secretes
+secreting
+secretion
+secretions
+secretive
+secretively
+secretiveness
+secretly
+secrets
+sect
+sect's
+section
+sectional
+sectionally
+sectioned
+sectioning
+sections
+sector
+sector's
+sectored
+sectoring
+sectors
+sects
+secular
+secularly
+secure
+secured
+securely
+secureness
+securer
+secures
+securing
+securings
+securities
+security
+sedge
+sediment
+sediment's
+sediments
+seduce
+seduced
+seducer
+seducers
+seduces
+seducing
+seductive
+seductively
+seductiveness
+see
+seed
+seeded
+seeder
+seeders
+seeding
+seedings
+seedling
+seedling's
+seedlings
+seeds
+seeing
+seek
+seeker
+seekers
+seeking
+seekingly
+seeks
+seem
+seemed
+seeming
+seemingly
+seemlier
+seemliness
+seemly
+seems
+seen
+seep
+seeped
+seeping
+seeps
+seer
+seers
+sees
+seethe
+seethed
+seethes
+seething
+segment
+segmentation
+segmentation's
+segmentations
+segmented
+segmenting
+segments
+segregate
+segregated
+segregates
+segregating
+segregation
+segregative
+seismic
+seizable
+seize
+seized
+seizer
+seizers
+seizes
+seizin
+seizing
+seizings
+seizins
+seizor
+seizors
+seizure
+seizure's
+seizures
+seldom
+select
+selected
+selecting
+selection
+selection's
+selections
+selective
+selectively
+selectiveness
+selectivity
+selectness
+selector
+selector's
+selectors
+selects
+self
+selfish
+selfishly
+selfishness
+selfness
+selfsame
+selfsameness
+sell
+seller
+sellers
+selling
+sells
+selves
+semantic
+semantical
+semantically
+semanticist
+semanticist's
+semanticists
+semantics
+semaphore
+semaphore's
+semaphores
+semblance
+semester
+semester's
+semesters
+semiautomated
+semicolon
+semicolon's
+semicolons
+semiconductor
+semiconductor's
+semiconductors
+seminal
+seminally
+seminar
+seminar's
+seminaries
+seminars
+seminary
+seminary's
+semipermanent
+semipermanently
+senate
+senate's
+senates
+senator
+senator's
+senators
+send
+sender
+senders
+sending
+sends
+senior
+senior's
+seniority
+seniors
+sensation
+sensation's
+sensational
+sensationally
+sensations
+sense
+sensed
+senseless
+senselessly
+senselessness
+senses
+sensibilities
+sensibility
+sensible
+sensibleness
+sensibly
+sensing
+sensitive
+sensitively
+sensitiveness
+sensitives
+sensitivities
+sensitivity
+sensor
+sensor's
+sensors
+sensory
+sent
+sentence
+sentenced
+sentences
+sentencing
+sentential
+sententially
+sentiment
+sentiment's
+sentimental
+sentimentally
+sentiments
+sentinel
+sentinel's
+sentinels
+sentries
+sentry
+sentry's
+separable
+separableness
+separate
+separated
+separately
+separateness
+separates
+separating
+separation
+separations
+separative
+separator
+separator's
+separators
+sequel
+sequel's
+sequels
+sequence
+sequenced
+sequencer
+sequencers
+sequences
+sequencing
+sequencings
+sequential
+sequentiality
+sequentially
+sequester
+sequestered
+sequestering
+serendipitous
+serendipitously
+serendipity
+serene
+serenely
+sereneness
+serenity
+serf
+serf's
+serfs
+sergeant
+sergeant's
+sergeants
+serial
+serially
+serials
+series
+serious
+seriously
+seriousness
+sermon
+sermon's
+sermons
+serpent
+serpent's
+serpentine
+serpentinely
+serpents
+serum
+serum's
+serums
+servant
+servant's
+servants
+serve
+served
+server
+server's
+servers
+serves
+service
+serviceable
+serviceableness
+serviced
+servicer
+services
+servicing
+servile
+servilely
+servileness
+serving
+servings
+servitude
+session
+session's
+sessions
+set
+set's
+sets
+setter
+setter's
+setters
+setting
+settings
+settle
+settled
+settlement
+settlement's
+settlements
+settler
+settlers
+settles
+settling
+settlings
+setup
+setups
+seven
+sevens
+seventeen
+seventeens
+seventeenth
+seventh
+seventies
+seventieth
+seventy
+sever
+several
+severally
+severals
+severance
+severe
+severed
+severely
+severeness
+severer
+severest
+severing
+severities
+severity
+severity's
+severs
+sew
+sewed
+sewer
+sewers
+sewing
+sews
+sex
+sexed
+sexes
+sexism
+sexism's
+sexist
+sexist's
+sexists
+sexual
+sexuality
+sexually
+shabbier
+shabbiness
+shabby
+shack
+shacked
+shackle
+shackled
+shackler
+shackles
+shackling
+shacks
+shade
+shaded
+shader
+shades
+shadier
+shadiest
+shadily
+shadiness
+shading
+shadings
+shadow
+shadowed
+shadower
+shadowiness
+shadowing
+shadows
+shadowy
+shady
+shaft
+shaft's
+shafted
+shafting
+shafts
+shaggier
+shagginess
+shaggy
+shakable
+shakably
+shake
+shaken
+shaker
+shakers
+shakes
+shakier
+shakiness
+shaking
+shaky
+shale
+shales
+shall
+shallow
+shallower
+shallowly
+shallowness
+shallows
+sham
+sham's
+shambles
+shame
+shamed
+shameful
+shamefully
+shamefulness
+shameless
+shamelessly
+shamelessness
+shames
+shaming
+shams
+shan't
+shanties
+shanty
+shanty's
+shape
+shaped
+shapeless
+shapelessly
+shapelessness
+shapelier
+shapeliness
+shapely
+shaper
+shapers
+shapes
+shaping
+sharable
+share
+sharecropper
+sharecropper's
+sharecroppers
+shared
+shareholder
+shareholder's
+shareholders
+sharer
+sharers
+shares
+sharing
+shark
+shark's
+sharks
+sharp
+sharped
+sharpen
+sharpened
+sharpener
+sharpening
+sharpens
+sharper
+sharpest
+sharping
+sharply
+sharpness
+sharps
+shatter
+shattered
+shattering
+shatteringly
+shatters
+shave
+shaved
+shaven
+shaver
+shaves
+shaving
+shavings
+shawl
+shawl's
+shawls
+she
+she'd
+she'll
+she's
+sheaf
+shear
+sheared
+shearer
+shearers
+shearing
+shears
+sheath
+sheather
+sheathing
+sheaths
+sheaves
+shed
+sheds
+sheep
+sheer
+sheered
+sheerly
+sheerness
+sheet
+sheeted
+sheeter
+sheeting
+sheets
+shelf
+shelfs
+shell
+shell's
+shelled
+sheller
+shelling
+shells
+shelter
+sheltered
+shelterer
+sheltering
+shelters
+shelve
+shelved
+shelver
+shelves
+shelving
+shepherd
+shepherd's
+shepherded
+shepherding
+shepherds
+sheriff
+sheriff's
+sheriffs
+shied
+shield
+shielded
+shielder
+shielding
+shields
+shier
+shies
+shiest
+shift
+shifted
+shifter
+shifters
+shiftier
+shiftiest
+shiftily
+shiftiness
+shifting
+shifts
+shifty
+shilling
+shillings
+shimmer
+shimmered
+shimmering
+shin
+shine
+shined
+shiner
+shiners
+shines
+shingle
+shingle's
+shingled
+shingler
+shingles
+shingling
+shinier
+shininess
+shining
+shiningly
+shiny
+ship
+ship's
+shipboard
+shipboards
+shipbuilding
+shipment
+shipment's
+shipments
+shippable
+shipped
+shipper
+shipper's
+shippers
+shipping
+ships
+shipwreck
+shipwrecked
+shipwrecks
+shirk
+shirker
+shirking
+shirks
+shirt
+shirting
+shirts
+shit
+shiver
+shivered
+shiverer
+shivering
+shivers
+shoal
+shoal's
+shoals
+shock
+shocked
+shocker
+shockers
+shocking
+shockingly
+shocks
+shod
+shoe
+shoed
+shoeing
+shoemaker
+shoer
+shoes
+shone
+shook
+shoot
+shooter
+shooters
+shooting
+shootings
+shoots
+shop
+shop's
+shopkeeper
+shopkeeper's
+shopkeepers
+shopped
+shopper
+shopper's
+shoppers
+shopping
+shops
+shore
+shore's
+shored
+shores
+shoring
+shorn
+short
+shortage
+shortage's
+shortages
+shortcoming
+shortcoming's
+shortcomings
+shortcut
+shortcut's
+shortcuts
+shorted
+shorten
+shortened
+shortener
+shortening
+shortens
+shorter
+shortest
+shorthand
+shorthanded
+shorthands
+shorting
+shortly
+shortness
+shorts
+shot
+shot's
+shotgun
+shotgun's
+shotguns
+shots
+should
+shoulder
+shouldered
+shouldering
+shoulders
+shouldest
+shouldn't
+shout
+shouted
+shouter
+shouters
+shouting
+shouts
+shove
+shoved
+shovel
+shovels
+shover
+shoves
+shoving
+show
+showed
+shower
+showered
+showering
+showers
+showing
+showings
+shown
+shows
+shrank
+shred
+shred's
+shredder
+shredder's
+shredders
+shreds
+shrew
+shrew's
+shrewd
+shrewdest
+shrewdly
+shrewdness
+shrews
+shriek
+shrieked
+shrieking
+shrieks
+shrill
+shrilled
+shrilling
+shrillness
+shrilly
+shrimp
+shrine
+shrine's
+shrines
+shrink
+shrinkable
+shrinker
+shrinking
+shrinks
+shrivel
+shrivels
+shroud
+shrouded
+shrouding
+shrouds
+shrub
+shrub's
+shrubbery
+shrubs
+shrug
+shrugs
+shrunk
+shrunken
+shudder
+shuddered
+shuddering
+shudders
+shuffle
+shuffled
+shuffler
+shuffles
+shuffling
+shun
+shuns
+shut
+shutdown
+shutdown's
+shutdowns
+shuts
+shutter
+shuttered
+shuttering
+shutters
+shutting
+shuttle
+shuttled
+shuttles
+shuttling
+shy
+shying
+shyly
+shyness
+sibling
+sibling's
+siblings
+sick
+sicken
+sickened
+sickener
+sickening
+sickeningly
+sicker
+sickerly
+sickest
+sicking
+sickle
+sickled
+sicklied
+sickliness
+sickling
+sickly
+sicklying
+sickness
+sickness's
+sicknesses
+sicks
+side
+sideboard
+sideboard's
+sideboards
+sideburns
+sided
+sidedness
+sidelight
+sidelight's
+sidelights
+sides
+sidetrack
+sidetracked
+sidetracking
+sidetracks
+sidewalk
+sidewalk's
+sidewalks
+sideways
+sidewise
+siding
+sidings
+siege
+siege's
+sieges
+sieging
+sierra
+sierras
+sieve
+sieve's
+sievers
+sieves
+sieving
+sift
+sifted
+sifter
+sifting
+siftings
+sifts
+sigh
+sighed
+sigher
+sighing
+sighs
+sight
+sighted
+sighter
+sighting
+sightings
+sightliness
+sightly
+sights
+sign
+signal
+signally
+signals
+signature
+signature's
+signatures
+signed
+signer
+signers
+signet
+significance
+significances
+significant
+significantly
+significants
+signification
+signified
+signifier
+signifies
+signify
+signifying
+signing
+signs
+silence
+silenced
+silencer
+silencers
+silences
+silencing
+silent
+silently
+silentness
+silents
+silhouette
+silhouetted
+silhouettes
+silicon
+silicone
+silicons
+silk
+silken
+silkier
+silkiest
+silkily
+silkiness
+silks
+silky
+sill
+sill's
+sillier
+silliest
+silliness
+sills
+silly
+silt
+silted
+silting
+silts
+silver
+silvered
+silverer
+silveriness
+silvering
+silverly
+silvers
+silvery
+similar
+similarities
+similarity
+similarly
+similitude
+simmer
+simmered
+simmering
+simmers
+simple
+simpleness
+simpler
+simples
+simplest
+simplex
+simplexes
+simplicities
+simplicity
+simplicity's
+simplification
+simplifications
+simplified
+simplifier
+simplifiers
+simplifies
+simplify
+simplifying
+simplistic
+simply
+simulate
+simulated
+simulates
+simulating
+simulation
+simulations
+simulative
+simulator
+simulator's
+simulators
+simultaneity
+simultaneous
+simultaneously
+simultaneousness
+sin
+sin's
+since
+sincere
+sincerely
+sincereness
+sincerest
+sincerity
+sine
+sines
+sinew
+sinew's
+sinews
+sinful
+sinfully
+sinfulness
+sing
+singable
+singed
+singer
+singer's
+singers
+singing
+singingly
+single
+singled
+singleness
+singles
+singleton
+singleton's
+singletons
+singling
+singly
+sings
+singular
+singularities
+singularity
+singularity's
+singularly
+sining
+sinister
+sinisterly
+sinisterness
+sink
+sinked
+sinker
+sinkers
+sinkhole
+sinkholes
+sinking
+sinks
+sinned
+sinner
+sinner's
+sinners
+sinning
+sins
+sinusoidal
+sinusoidally
+sinusoids
+sip
+sips
+sir
+sire
+sired
+siren
+sirens
+sires
+siring
+sirs
+sirup
+sister
+sister's
+sistered
+sistering
+sisterly
+sisters
+sit
+site
+site's
+sited
+sites
+siting
+sits
+sitter
+sitter's
+sitters
+sitting
+sittings
+situate
+situated
+situates
+situating
+situation
+situational
+situationally
+situations
+six
+sixes
+sixpence
+sixpences
+sixteen
+sixteens
+sixteenth
+sixth
+sixthly
+sixties
+sixtieth
+sixty
+sizable
+sizableness
+size
+sized
+sizer
+sizers
+sizes
+sizing
+sizings
+skate
+skated
+skater
+skater's
+skaters
+skates
+skating
+skeletal
+skeletally
+skeleton
+skeleton's
+skeletons
+skeptic
+skeptic's
+skeptical
+skeptically
+skeptics
+sketch
+sketched
+sketcher
+sketches
+sketchier
+sketchily
+sketchiness
+sketching
+sketchy
+skew
+skewed
+skewer
+skewered
+skewering
+skewers
+skewing
+skewness
+skews
+ski
+skied
+skien
+skier
+skies
+skiing
+skill
+skilled
+skillful
+skillfully
+skillfulness
+skilling
+skills
+skim
+skim's
+skimmed
+skimmer
+skimmer's
+skimmers
+skimming
+skimmings
+skimp
+skimped
+skimping
+skimps
+skims
+skin
+skin's
+skinned
+skinner
+skinner's
+skinners
+skinning
+skins
+skip
+skipped
+skipper
+skipper's
+skippered
+skippering
+skippers
+skipping
+skips
+skirmish
+skirmished
+skirmisher
+skirmishers
+skirmishes
+skirmishing
+skirt
+skirted
+skirter
+skirting
+skirts
+skis
+skulk
+skulked
+skulker
+skulking
+skulks
+skull
+skull's
+skulled
+skulls
+skunk
+skunk's
+skunks
+sky
+sky's
+skying
+skylark
+skylarker
+skylarking
+skylarks
+skylight
+skylight's
+skylights
+skyscraper
+skyscraper's
+skyscrapers
+slab
+slabs
+slack
+slacked
+slacken
+slackened
+slackening
+slackens
+slacker
+slackest
+slacking
+slackly
+slackness
+slacks
+slain
+slam
+slammed
+slamming
+slams
+slander
+slandered
+slanderer
+slandering
+slanders
+slang
+slanging
+slant
+slanted
+slanting
+slantingly
+slants
+slap
+slapped
+slapping
+slaps
+slash
+slashed
+slasher
+slashes
+slashing
+slashingly
+slat
+slat's
+slate
+slated
+slater
+slaters
+slates
+slating
+slats
+slaughter
+slaughtered
+slaughterer
+slaughtering
+slaughters
+slave
+slaved
+slaver
+slavered
+slavering
+slavery
+slaves
+slaving
+slay
+slayer
+slayers
+slaying
+slays
+sled
+sled's
+sledge
+sledge's
+sledges
+sledging
+sleds
+sleek
+sleekly
+sleekness
+sleep
+sleeper
+sleepers
+sleepier
+sleepily
+sleepiness
+sleeping
+sleepless
+sleeplessly
+sleeplessness
+sleeps
+sleepy
+sleet
+sleeve
+sleeve's
+sleeved
+sleeves
+sleeving
+sleigh
+sleighs
+sleken
+slekened
+slekening
+slender
+slenderer
+slenderly
+slenderness
+slept
+slew
+slewed
+slewing
+slice
+sliced
+slicer
+slicers
+slices
+slicing
+slick
+slicker
+slickers
+slickly
+slickness
+slicks
+slid
+slide
+slider
+sliders
+slides
+sliding
+slier
+sliest
+slight
+slighted
+slighter
+slightest
+slighting
+slightingly
+slightly
+slightness
+slights
+slim
+slime
+slimed
+slimes
+slimier
+sliminess
+sliming
+slimly
+slimness
+slimy
+sling
+slinger
+slinging
+slings
+slip
+slip's
+slippage
+slipped
+slipper
+slipper's
+slipperier
+slipperiness
+slippers
+slippery
+slipping
+slips
+slit
+slit's
+slits
+slogan
+slogan's
+slogans
+slop
+slope
+sloped
+sloper
+slopers
+slopes
+sloping
+slopped
+sloppier
+sloppiness
+slopping
+sloppy
+slops
+slot
+slot's
+sloth
+sloths
+slots
+slotted
+slouch
+slouched
+sloucher
+slouches
+slouching
+slow
+slowed
+slower
+slowest
+slowing
+slowly
+slowness
+slows
+slug
+sluggish
+sluggishly
+sluggishness
+slugs
+slum
+slum's
+slumber
+slumber's
+slumbered
+slumberer
+slumbering
+slumbers
+slump
+slumped
+slumps
+slums
+slung
+slur
+slur's
+slurs
+sly
+slyly
+smack
+smacked
+smacker
+smacking
+smacks
+small
+smaller
+smallest
+smallness
+smallpox
+smart
+smarted
+smarten
+smartened
+smartening
+smarter
+smartest
+smarting
+smartly
+smartness
+smarts
+smash
+smashed
+smasher
+smashers
+smashes
+smashing
+smashingly
+smear
+smeared
+smearer
+smearing
+smears
+smell
+smelled
+smeller
+smellier
+smelling
+smells
+smelly
+smelt
+smelter
+smelts
+smile
+smiled
+smiler
+smiles
+smiling
+smilingly
+smite
+smiter
+smith
+smith's
+smithies
+smiths
+smithy
+smiting
+smitten
+smock
+smocking
+smocks
+smog
+smokable
+smoke
+smoked
+smoker
+smoker's
+smokers
+smokes
+smokier
+smokies
+smokiness
+smoking
+smoky
+smolder
+smoldered
+smoldering
+smolderingly
+smolders
+smooth
+smoothed
+smoothen
+smoothened
+smoothening
+smoother
+smoothers
+smoothes
+smoothest
+smoothing
+smoothly
+smoothness
+smote
+smother
+smothered
+smothering
+smothers
+smug
+smuggle
+smuggled
+smuggler
+smugglers
+smuggles
+smuggling
+smugly
+smugness
+snail
+snail's
+snails
+snake
+snaked
+snakes
+snaking
+snap
+snapped
+snapper
+snapper's
+snappers
+snappier
+snappiest
+snappily
+snappiness
+snapping
+snappy
+snaps
+snapshot
+snapshot's
+snapshots
+snare
+snared
+snarer
+snares
+snarf
+snarfed
+snarfing
+snarfings
+snarfs
+snaring
+snarl
+snarled
+snarler
+snarling
+snarls
+snatch
+snatched
+snatcher
+snatches
+snatching
+sneak
+sneaked
+sneaker
+sneakered
+sneakers
+sneakier
+sneakiest
+sneakily
+sneakiness
+sneaking
+sneakingly
+sneaks
+sneaky
+sneer
+sneered
+sneerer
+sneering
+sneers
+sneeze
+sneezed
+sneezer
+sneezes
+sneezing
+sniff
+sniffed
+sniffer
+sniffing
+sniffs
+snoop
+snooped
+snooper
+snooping
+snoops
+snore
+snored
+snorer
+snores
+snoring
+snort
+snorted
+snorter
+snorting
+snorts
+snout
+snout's
+snouted
+snouts
+snow
+snowed
+snowier
+snowiest
+snowily
+snowiness
+snowing
+snowman
+snowmen
+snows
+snowshoe
+snowshoe's
+snowshoed
+snowshoer
+snowshoes
+snowy
+snuff
+snuffed
+snuffer
+snuffing
+snuffs
+snug
+snuggle
+snuggled
+snuggles
+snuggling
+snugly
+snugness
+snugs
+so
+soak
+soaked
+soaker
+soaking
+soaks
+soap
+soaped
+soaping
+soaps
+soar
+soared
+soarer
+soaring
+soars
+sob
+sober
+sobered
+soberer
+soberest
+sobering
+soberly
+soberness
+sobers
+sobs
+soccer
+sociability
+sociable
+sociably
+social
+socialism
+socialist
+socialist's
+socialists
+socially
+societal
+societally
+societies
+society
+society's
+sociological
+sociologically
+sociology
+sock
+socked
+socket
+socket's
+sockets
+socking
+socks
+sod
+sod's
+soda
+sodium
+sodomy
+sods
+sofa
+sofa's
+sofas
+soft
+soften
+softened
+softener
+softening
+softens
+softer
+softest
+softly
+softness
+software
+software's
+softwares
+soil
+soiled
+soiling
+soils
+sojourn
+sojourner
+sojourners
+solace
+solaced
+solacer
+solacing
+solar
+sold
+solder
+soldered
+solderer
+soldering
+solders
+soldier
+soldiered
+soldiering
+soldierly
+soldiers
+sole
+soled
+solely
+solemn
+solemnity
+solemnly
+solemnness
+soleness
+soles
+solicit
+solicited
+soliciting
+solicitor
+solicitors
+solicits
+solid
+solidification
+solidified
+solidifies
+solidify
+solidifying
+solidity
+solidly
+solidness
+solids
+soling
+solingen
+solitaire
+solitariness
+solitary
+solitude
+solitude's
+solitudes
+solo
+solo's
+soloed
+soloing
+solos
+solubility
+soluble
+solution
+solution's
+solutions
+solvable
+solve
+solved
+solvent
+solvent's
+solvently
+solvents
+solver
+solvers
+solves
+solving
+somber
+somberly
+somberness
+some
+somebody
+somebody's
+someday
+somehow
+someone
+someone's
+someplace
+someplace's
+somers
+something
+sometime
+sometimes
+somewhat
+somewhere
+somewheres
+son
+son's
+sonar
+sonars
+song
+song's
+songs
+sonly
+sonnet
+sonnet's
+sonnets
+sons
+soon
+sooner
+soonest
+soot
+sooth
+soothe
+soothed
+soother
+soothes
+soothing
+soothingly
+soothingness
+soothly
+sophisticated
+sophisticatedly
+sophistication
+sophomore
+sophomore's
+sophomores
+sorcerer
+sorcerer's
+sorcerers
+sorcery
+sordid
+sordidly
+sordidness
+sore
+sorely
+soreness
+sorer
+sores
+sorest
+sorrier
+sorriest
+sorriness
+sorrow
+sorrow's
+sorrower
+sorrowful
+sorrowfully
+sorrowfulness
+sorrows
+sorry
+sort
+sorted
+sorter
+sorters
+sorting
+sorts
+sos
+sought
+soul
+soul's
+souled
+souls
+sound
+sounded
+sounder
+soundest
+sounding
+sounding's
+soundingly
+soundings
+soundly
+soundness
+sounds
+soup
+soup's
+soups
+sour
+source
+source's
+sources
+soured
+sourer
+sourest
+souring
+sourly
+sourness
+sours
+south
+souther
+southerly
+southern
+southerner
+southerners
+southernly
+southernness
+southing
+sovereign
+sovereign's
+sovereignly
+sovereigns
+soviet
+soviet's
+soviets
+space
+spaced
+spacer
+spacers
+spaces
+spaceship
+spaceship's
+spaceships
+spacing
+spacings
+spade
+spaded
+spader
+spades
+spading
+spaghetti
+span
+span's
+spank
+spanked
+spanker
+spanking
+spanks
+spanned
+spanner
+spanner's
+spanners
+spanning
+spans
+spare
+spared
+sparely
+spareness
+sparer
+spares
+sparest
+sparing
+sparingly
+spark
+sparked
+sparker
+sparking
+sparks
+sparrow
+sparrow's
+sparrows
+sparse
+sparsely
+sparseness
+sparser
+sparsest
+spat
+spate
+spate's
+spates
+spatial
+spatially
+spats
+spatter
+spattered
+spawn
+spawned
+spawner
+spawning
+spawns
+speak
+speakable
+speaker
+speaker's
+speakers
+speaking
+speaks
+spear
+speared
+spearer
+spearing
+spears
+special
+specialist
+specialist's
+specialists
+specially
+specialness
+specials
+species
+specifiable
+specific
+specifically
+specification
+specifications
+specificities
+specificity
+specifics
+specified
+specifier
+specifiers
+specifies
+specify
+specifying
+specimen
+specimen's
+specimens
+speck
+speck's
+speckle
+speckled
+speckles
+speckling
+specks
+spectacle
+spectacled
+spectacles
+spectacular
+spectacularly
+spectator
+spectator's
+spectators
+spectra
+spectrogram
+spectrogram's
+spectrograms
+spectroscopically
+spectrum
+spectrums
+speculate
+speculated
+speculates
+speculating
+speculation
+speculations
+speculative
+speculatively
+speculator
+speculator's
+speculators
+sped
+speech
+speech's
+speeches
+speechless
+speechlessly
+speechlessness
+speed
+speeded
+speeder
+speeders
+speedier
+speedily
+speediness
+speeding
+speeds
+speedup
+speedup's
+speedups
+speedy
+spell
+spelled
+speller
+spellers
+spelling
+spellings
+spells
+spend
+spender
+spenders
+spending
+spends
+spent
+sphere
+sphere's
+spheres
+spherical
+spherically
+sphering
+spice
+spiced
+spices
+spicier
+spiciness
+spicing
+spicy
+spider
+spider's
+spiders
+spied
+spier
+spies
+spike
+spiked
+spiker
+spikes
+spiking
+spill
+spilled
+spiller
+spilling
+spills
+spin
+spinach
+spinal
+spinally
+spindle
+spindled
+spindler
+spindles
+spindling
+spine
+spines
+spinner
+spinner's
+spinners
+spinning
+spins
+spiral
+spirally
+spirals
+spire
+spire's
+spired
+spires
+spiring
+spirit
+spirited
+spiritedly
+spiritedness
+spiriting
+spirits
+spiritual
+spiritually
+spiritualness
+spirituals
+spit
+spite
+spited
+spiteful
+spitefully
+spitefulness
+spites
+spiting
+spits
+spitting
+splash
+splashed
+splasher
+splashers
+splashes
+splashing
+spleen
+splendid
+splendidly
+splendidness
+splice
+spliced
+splicer
+splicers
+splices
+splicing
+splicings
+spline
+spline's
+splined
+splines
+splinter
+splintered
+splintering
+splinters
+split
+split's
+splits
+splitter
+splitter's
+splitters
+splitting
+splittings
+spoil
+spoiled
+spoiler
+spoilers
+spoiling
+spoils
+spoke
+spoked
+spoken
+spokes
+spokesman
+spokesmen
+spoking
+sponge
+sponged
+sponger
+spongers
+sponges
+sponging
+sponsor
+sponsored
+sponsoring
+sponsors
+sponsorship
+spontaneous
+spontaneously
+spontaneousness
+spook
+spookier
+spookiness
+spooky
+spool
+spooled
+spooler
+spoolers
+spooling
+spools
+spoon
+spooned
+spooning
+spoons
+spore
+spore's
+spored
+spores
+sporing
+sport
+sported
+sporting
+sportingly
+sportive
+sportively
+sportiveness
+sports
+sportsman
+sportsmanly
+spot
+spot's
+spotless
+spotlessly
+spotlessness
+spotlight
+spotlight's
+spotlighted
+spotlighting
+spotlights
+spots
+spotted
+spotter
+spotter's
+spotters
+spotting
+spouse
+spouse's
+spouses
+spousing
+spout
+spouted
+spouter
+spouting
+spouts
+sprang
+sprawl
+sprawled
+sprawling
+sprawls
+spray
+sprayed
+sprayer
+spraying
+sprays
+spread
+spreader
+spreaders
+spreading
+spreadings
+spreads
+spreadsheet
+spreadsheets
+spree
+spree's
+sprees
+sprig
+sprightlier
+sprightliness
+sprightly
+spring
+springer
+springers
+springier
+springiest
+springiness
+springing
+springs
+springtime
+springy
+sprinkle
+sprinkled
+sprinkler
+sprinklered
+sprinkles
+sprinkling
+sprint
+sprinted
+sprinter
+sprinters
+sprinting
+sprints
+sprite
+sprout
+sprouted
+sprouting
+sprouts
+spruce
+spruced
+sprucely
+spruceness
+sprucer
+sprucest
+sprucing
+sprung
+spun
+spur
+spur's
+spurious
+spuriously
+spuriousness
+spurn
+spurned
+spurner
+spurning
+spurns
+spurs
+spurt
+spurted
+spurting
+spurts
+sputter
+sputtered
+sputterer
+spy
+spying
+squabble
+squabbled
+squabbler
+squabbles
+squabbling
+squad
+squad's
+squadron
+squadron's
+squadrons
+squads
+squall
+squall's
+squaller
+squalls
+square
+squared
+squarely
+squareness
+squarer
+squares
+squarest
+squaring
+squash
+squashed
+squasher
+squashes
+squashing
+squat
+squatly
+squatness
+squats
+squawk
+squawked
+squawker
+squawking
+squawks
+squeak
+squeaked
+squeaker
+squeaking
+squeaks
+squeal
+squealed
+squealer
+squealing
+squeals
+squeeze
+squeezed
+squeezer
+squeezes
+squeezing
+squid
+squids
+squint
+squinted
+squinter
+squinting
+squintingly
+squints
+squire
+squire's
+squires
+squiring
+squirm
+squirmed
+squirming
+squirms
+squirrel
+squirrelly
+squirrels
+stab
+stabbed
+stabbing
+stabilities
+stability
+stability's
+stable
+stabled
+stableness
+stabler
+stables
+stablest
+stabling
+stably
+stabs
+stack
+stack's
+stacked
+stacker
+stacking
+stacks
+staff
+staff's
+staffed
+staffer
+staffers
+staffing
+staffs
+stag
+stag's
+stage
+stagecoach
+staged
+stager
+stagers
+stages
+stagger
+staggered
+staggerer
+staggering
+staggeringly
+staggers
+staging
+stagnant
+stagnantly
+stags
+staid
+staidly
+staidness
+stain
+stained
+stainer
+staining
+stainless
+stainlessly
+stains
+stair
+stair's
+staircase
+staircase's
+staircases
+stairs
+stairway
+stairway's
+stairways
+stake
+staked
+stakes
+staking
+stale
+staled
+stalely
+staleness
+staler
+stales
+stalest
+staling
+stalk
+stalked
+stalker
+stalking
+stalks
+stall
+stalled
+stalling
+stallings
+stalls
+stalwart
+stalwartly
+stalwartness
+stamen
+stamen's
+stamens
+stamina
+stammer
+stammered
+stammerer
+stammering
+stammers
+stamp
+stamped
+stampede
+stampeded
+stampeder
+stampedes
+stampeding
+stamper
+stampers
+stamping
+stamps
+stance
+stance's
+stances
+stanch
+stancher
+stanchest
+stand
+standard
+standardly
+standards
+standby
+stander
+standing
+standings
+standpoint
+standpoint's
+standpoints
+stands
+standstill
+stanza
+stanza's
+stanzas
+staple
+stapled
+stapler
+staplers
+staples
+stapling
+star
+star's
+starboard
+starboarded
+starboarding
+starboards
+starch
+starched
+starches
+starching
+stare
+stared
+starer
+stares
+starfish
+staring
+stark
+starkest
+starkly
+starkness
+starlet
+starlet's
+starlets
+starlight
+starred
+starrier
+starring
+starry
+stars
+start
+started
+starter
+starters
+starting
+startle
+startled
+startles
+startling
+startlingly
+startlingness
+starts
+startup
+startup's
+startups
+starvation
+starve
+starved
+starver
+starves
+starving
+state
+state's
+stated
+statelier
+stateliness
+stately
+statement
+statement's
+statements
+stater
+states
+statesman
+statesman's
+statesmanly
+static
+statically
+statics
+stating
+station
+stationaries
+stationary
+stationed
+stationer
+stationing
+stations
+statistic
+statistic's
+statistical
+statistically
+statistician
+statistician's
+statisticians
+statistics
+stative
+statue
+statue's
+statued
+statues
+statuesque
+statuesquely
+statuesqueness
+stature
+status
+statuses
+statute
+statute's
+statutes
+statutorily
+statutoriness
+statutory
+staunch
+staunchest
+staunchly
+staunchness
+stave
+staved
+staves
+staving
+stay
+stayed
+stayer
+stayers
+staying
+stays
+stdio
+stead
+steadfast
+steadfastly
+steadfastness
+steadied
+steadier
+steadies
+steadiest
+steadily
+steadiness
+steading
+steady
+steadying
+steak
+steak's
+steaks
+steal
+stealer
+stealing
+steals
+stealth
+stealthier
+stealthily
+stealthiness
+stealthy
+steam
+steamboat
+steamboat's
+steamboats
+steamed
+steamer
+steamers
+steaming
+steams
+steamship
+steamship's
+steamships
+steed
+steeds
+steel
+steeled
+steelers
+steeling
+steels
+steep
+steeped
+steepen
+steepened
+steepening
+steeper
+steepest
+steeping
+steeple
+steeple's
+steeples
+steeply
+steepness
+steeps
+steer
+steered
+steerer
+steering
+steers
+stellar
+stem
+stem's
+stemmed
+stemming
+stems
+stench
+stench's
+stenches
+stencil
+stencil's
+stencils
+stenographer
+stenographer's
+stenographers
+step
+step's
+stepmother
+stepmother's
+stepmothers
+stepped
+stepper
+stepping
+steps
+stepwise
+stereo
+stereo's
+stereos
+stereotype
+stereotyped
+stereotyper
+stereotypers
+stereotypes
+stereotypical
+stereotypically
+stereotyping
+sterile
+sterling
+sterlingly
+sterlingness
+stern
+sternly
+sternness
+sterns
+stew
+steward
+steward's
+stewards
+stewed
+stewing
+stews
+stick
+sticked
+sticker
+stickers
+stickier
+stickiest
+stickily
+stickiness
+sticking
+sticks
+sticky
+stiff
+stiffen
+stiffened
+stiffener
+stiffeners
+stiffening
+stiffens
+stiffer
+stiffest
+stiffly
+stiffness
+stiffnesses
+stiffs
+stifle
+stifled
+stifler
+stifles
+stifling
+stiflingly
+stigma
+stigmas
+stile
+stile's
+stiles
+still
+stilled
+stiller
+stillest
+stilling
+stillness
+stills
+stimulant
+stimulant's
+stimulants
+stimulate
+stimulated
+stimulates
+stimulating
+stimulation
+stimulations
+stimulative
+stimuli
+stimulus
+sting
+stinger
+stinging
+stingingly
+stings
+stink
+stinker
+stinkers
+stinking
+stinkingly
+stinks
+stint
+stint's
+stinted
+stinter
+stinting
+stints
+stipend
+stipend's
+stipends
+stipple
+stippled
+stippler
+stipples
+stippling
+stipulate
+stipulated
+stipulates
+stipulating
+stipulation
+stipulations
+stir
+stirred
+stirrer
+stirrer's
+stirrers
+stirring
+stirringly
+stirrings
+stirrup
+stirrups
+stirs
+stitch
+stitched
+stitcher
+stitches
+stitching
+stochastic
+stochastically
+stock
+stockade
+stockade's
+stockaded
+stockades
+stockading
+stocked
+stocker
+stockers
+stockholder
+stockholder's
+stockholders
+stocking
+stockinged
+stockings
+stocks
+stole
+stole's
+stoled
+stolen
+stoles
+stomach
+stomached
+stomacher
+stomaches
+stomaching
+stone
+stone's
+stoned
+stoner
+stones
+stonier
+stoniness
+stoning
+stony
+stood
+stool
+stools
+stoop
+stooped
+stooping
+stoops
+stop
+stop's
+stopcock
+stopcocks
+stopgap
+stopgap's
+stopgaps
+stoppable
+stoppage
+stoppages
+stopped
+stopper
+stopper's
+stoppered
+stoppering
+stoppers
+stopping
+stops
+storage
+storage's
+storages
+store
+stored
+storehouse
+storehouse's
+storehouses
+stores
+storied
+stories
+storing
+stork
+stork's
+storks
+storm
+stormed
+stormier
+stormiest
+storminess
+storming
+storms
+stormy
+story
+story's
+storying
+stout
+stouten
+stoutened
+stoutening
+stouter
+stoutest
+stoutly
+stoutness
+stove
+stove's
+stover
+stoves
+stow
+stowed
+stowing
+stows
+straggle
+straggled
+straggler
+stragglers
+straggles
+straggling
+straight
+straighten
+straightened
+straightener
+straighteners
+straightening
+straightens
+straighter
+straightest
+straightforward
+straightforwardly
+straightforwardness
+straightforwards
+straightly
+straightness
+straightway
+strain
+strained
+strainer
+strainers
+straining
+strains
+strait
+straiten
+straitened
+straitening
+straitly
+straitness
+straits
+strand
+stranded
+strandedness
+strander
+stranding
+strands
+strange
+strangely
+strangeness
+stranger
+stranger's
+strangers
+strangest
+strangle
+strangled
+strangler
+stranglers
+strangles
+strangling
+stranglings
+strangulation
+strangulation's
+strangulations
+strap
+strap's
+straps
+stratagem
+stratagem's
+stratagems
+strategic
+strategics
+strategies
+strategy
+strategy's
+stratification
+stratifications
+stratified
+stratifies
+stratify
+stratifying
+stratum
+straw
+straw's
+strawberries
+strawberry
+strawberry's
+straws
+stray
+stray's
+strayed
+strayer
+straying
+strays
+streak
+streaked
+streaking
+streaks
+stream
+streamed
+streamer
+streamers
+streaming
+streamline
+streamlined
+streamliner
+streamlines
+streamlining
+streams
+street
+streetcar
+streetcar's
+streetcars
+streeters
+streets
+strength
+strengthen
+strengthened
+strengthener
+strengthening
+strengthens
+strengths
+strenuous
+strenuously
+strenuousness
+stress
+stressed
+stresses
+stressing
+stretch
+stretched
+stretcher
+stretchers
+stretches
+stretching
+strew
+strewing
+strewn
+strews
+strewth
+stricken
+strict
+stricter
+strictest
+strictly
+strictness
+stride
+strider
+strides
+striding
+strife
+strike
+striker
+strikers
+strikes
+striking
+strikingly
+string
+string's
+stringed
+stringent
+stringently
+stringer
+stringers
+stringier
+stringiest
+stringiness
+stringing
+strings
+stringy
+strip
+strip's
+stripe
+striped
+striper
+stripes
+striping
+stripped
+stripper
+stripper's
+strippers
+stripping
+strips
+strive
+striver
+strives
+striving
+strivings
+strobe
+strobe's
+strobed
+strobes
+strobing
+stroboscopic
+strode
+stroke
+stroked
+stroker
+strokers
+strokes
+stroking
+stroll
+strolled
+stroller
+strolling
+strolls
+strong
+stronger
+strongest
+stronghold
+strongly
+strove
+struck
+structural
+structurally
+structure
+structured
+structurer
+structures
+structuring
+struggle
+struggled
+struggler
+struggles
+struggling
+strung
+strut
+struts
+strutted
+strutter
+strutting
+stub
+stub's
+stubbed
+stubbing
+stubble
+stubborn
+stubbornly
+stubbornness
+stubs
+stuck
+stud
+stud's
+student
+student's
+students
+studied
+studiedly
+studiedness
+studier
+studies
+studio
+studio's
+studios
+studious
+studiously
+studiousness
+studs
+study
+studying
+stuff
+stuffed
+stuffer
+stuffier
+stuffiest
+stuffiness
+stuffing
+stuffings
+stuffs
+stuffy
+stumble
+stumbled
+stumbler
+stumbles
+stumbling
+stumblingly
+stump
+stumped
+stumper
+stumping
+stumps
+stun
+stung
+stunning
+stunningly
+stuns
+stunt
+stunt's
+stunted
+stuntedness
+stunting
+stunts
+stupefy
+stupefying
+stupendous
+stupendously
+stupendousness
+stupid
+stupider
+stupidest
+stupidities
+stupidity
+stupidly
+stupidness
+stupor
+sturdier
+sturdiness
+sturdy
+style
+styled
+styler
+stylers
+styles
+styling
+stylish
+stylishly
+stylishness
+stylistic
+stylistically
+stylistics
+sub
+subatomic
+subclass
+subclass's
+subclasses
+subcommittee
+subcommittee's
+subcommittees
+subcomponent
+subcomponent's
+subcomponents
+subcomputation
+subcomputation's
+subcomputations
+subconscious
+subconsciously
+subconsciousness
+subculture
+subculture's
+subcultures
+subdivide
+subdivided
+subdivider
+subdivides
+subdividing
+subdivision
+subdivision's
+subdivisions
+subdue
+subdued
+subduedly
+subduer
+subdues
+subduing
+subexpression
+subexpression's
+subexpressions
+subfield
+subfield's
+subfields
+subfile
+subfile's
+subfiles
+subgoal
+subgoal's
+subgoals
+subgraph
+subgraphs
+subgroup
+subgroup's
+subgrouping
+subgroups
+subinterval
+subinterval's
+subintervals
+subject
+subject's
+subjected
+subjecting
+subjection
+subjective
+subjectively
+subjectiveness
+subjectivity
+subjects
+sublimation
+sublimations
+sublime
+sublimed
+sublimely
+sublimeness
+sublimer
+subliming
+sublist
+sublist's
+sublists
+submarine
+submarined
+submariner
+submariners
+submarines
+submarining
+submerge
+submerged
+submerges
+submerging
+submission
+submission's
+submissions
+submit
+submits
+submitted
+submitting
+submode
+submodes
+submodule
+submodule's
+submodules
+subnetwork
+subnetwork's
+subnetworks
+subordinate
+subordinated
+subordinately
+subordinateness
+subordinates
+subordinating
+subordination
+subordinative
+subproblem
+subproblem's
+subproblems
+subprocess
+subprocess's
+subprocesses
+subprogram
+subprogram's
+subprograms
+subproject
+subproof
+subproof's
+subproofs
+subrange
+subrange's
+subranges
+subroutine
+subroutine's
+subroutines
+subs
+subschema
+subschema's
+subschemas
+subscribe
+subscribed
+subscriber
+subscribers
+subscribes
+subscribing
+subscript
+subscripted
+subscripting
+subscription
+subscription's
+subscriptions
+subscripts
+subsection
+subsection's
+subsections
+subsegment
+subsegment's
+subsegments
+subsequence
+subsequence's
+subsequences
+subsequent
+subsequently
+subsequentness
+subset
+subset's
+subsets
+subside
+subsided
+subsides
+subsidiaries
+subsidiary
+subsidiary's
+subsidies
+subsiding
+subsidy
+subsidy's
+subsist
+subsisted
+subsistence
+subsisting
+subsists
+subspace
+subspace's
+subspaces
+substance
+substance's
+substances
+substantial
+substantially
+substantialness
+substantiate
+substantiated
+substantiates
+substantiating
+substantiation
+substantiations
+substantiative
+substantive
+substantively
+substantiveness
+substantivity
+substitutability
+substitutable
+substitute
+substituted
+substituter
+substitutes
+substituting
+substitution
+substitutions
+substitutive
+substitutively
+substrate
+substrate's
+substrates
+substring
+substrings
+substructure
+substructure's
+substructures
+subsume
+subsumed
+subsumes
+subsuming
+subsystem
+subsystem's
+subsystems
+subtask
+subtask's
+subtasks
+subterranean
+subterraneanly
+subtitle
+subtitle's
+subtitled
+subtitles
+subtitling
+subtle
+subtleness
+subtler
+subtlest
+subtleties
+subtlety
+subtly
+subtopic
+subtopic's
+subtopics
+subtract
+subtracted
+subtracter
+subtracter's
+subtracters
+subtracting
+subtraction
+subtractions
+subtractive
+subtracts
+subtrahend
+subtrahend's
+subtrahends
+subtree
+subtree's
+subtrees
+subunit
+subunit's
+subunits
+suburb
+suburb's
+suburban
+suburbs
+subversion
+subvert
+subverted
+subverter
+subverting
+subverts
+subway
+subway's
+subways
+succeed
+succeeded
+succeeder
+succeeding
+succeeds
+success
+successes
+successful
+successfully
+successfulness
+succession
+succession's
+successions
+successive
+successively
+successiveness
+successor
+successor's
+successors
+succinct
+succinctly
+succinctness
+succumb
+succumbed
+succumbing
+succumbs
+such
+suck
+sucked
+sucker
+suckered
+suckering
+suckers
+sucking
+suckle
+suckled
+suckles
+suckling
+sucks
+suction
+sudden
+suddenly
+suddenness
+suds
+sudser
+sudsing
+sue
+sued
+sueded
+sueding
+suer
+sues
+suffer
+sufferance
+suffered
+sufferer
+sufferers
+suffering
+sufferings
+suffers
+suffice
+sufficed
+sufficer
+suffices
+sufficiency
+sufficient
+sufficiently
+sufficing
+suffix
+suffixed
+suffixer
+suffixes
+suffixing
+suffocate
+suffocated
+suffocates
+suffocating
+suffocatingly
+suffocation
+suffocative
+suffrage
+sugar
+sugared
+sugaring
+sugarings
+sugars
+suggest
+suggested
+suggester
+suggestible
+suggesting
+suggestion
+suggestion's
+suggestions
+suggestive
+suggestively
+suggestiveness
+suggests
+suicidal
+suicidally
+suicide
+suicide's
+suicided
+suicides
+suiciding
+suing
+suit
+suit's
+suitability
+suitable
+suitableness
+suitably
+suitcase
+suitcase's
+suitcases
+suite
+suited
+suiters
+suites
+suiting
+suitor
+suitor's
+suitors
+suits
+sulk
+sulked
+sulkies
+sulkiness
+sulking
+sulks
+sulky
+sullen
+sullenly
+sullenness
+sulphate
+sulphates
+sulphur
+sulphured
+sulphuric
+sultan
+sultan's
+sultans
+sultrier
+sultriness
+sultry
+sum
+sum's
+sumer
+summand
+summand's
+summands
+summaries
+summary
+summary's
+summation
+summation's
+summations
+summed
+summer
+summer's
+summered
+summering
+summers
+summing
+summit
+summon
+summoned
+summoner
+summoners
+summoning
+summons
+summonses
+sumptuous
+sumptuously
+sumptuousness
+sums
+sun
+sun's
+sunbeam
+sunbeam's
+sunbeams
+sunburn
+sundown
+sundowner
+sundowners
+sundries
+sundry
+sung
+sunglass
+sunglasses
+sunk
+sunken
+sunlight
+sunlights
+sunned
+sunnier
+sunniness
+sunning
+sunny
+sunrise
+sunrises
+suns
+sunset
+sunsets
+sunshine
+sunshines
+sup
+super
+superb
+superbly
+superbness
+superclass
+superclass's
+supercomputer
+supercomputer's
+supercomputers
+supered
+superego
+superego's
+superegos
+superficial
+superficially
+superficialness
+superfluities
+superfluity
+superfluity's
+superfluous
+superfluously
+superfluousness
+superhuman
+superhumanly
+superhumanness
+superimpose
+superimposed
+superimposes
+superimposing
+supering
+superintend
+superintendent
+superintendent's
+superintendents
+superior
+superior's
+superiority
+superiorly
+superiors
+superlative
+superlatively
+superlativeness
+superlatives
+supermarket
+supermarket's
+supermarkets
+superpose
+superposed
+superposes
+superposing
+superscript
+superscripted
+superscripting
+superscripts
+supersede
+superseded
+superseder
+supersedes
+superseding
+superset
+superset's
+supersets
+superstition
+superstition's
+superstitions
+superstitious
+superstitiously
+superstitiousness
+supertitle
+supertitle's
+supertitled
+supertitles
+supertitling
+superuser
+superuser's
+superusers
+supervise
+supervised
+supervises
+supervising
+supervision
+supervisions
+supervisor
+supervisor's
+supervisors
+supervisory
+supper
+supper's
+suppers
+supplant
+supplanted
+supplanter
+supplanting
+supplants
+supple
+suppled
+supplely
+supplement
+supplemental
+supplementaries
+supplementary
+supplemented
+supplementer
+supplementing
+supplements
+suppleness
+suppler
+supplication
+supplied
+supplier
+supplier's
+suppliers
+supplies
+suppling
+supply
+supply's
+supplying
+support
+supportable
+supported
+supporter
+supporters
+supporting
+supportingly
+supportive
+supportively
+supports
+suppose
+supposed
+supposedly
+supposer
+supposes
+supposing
+supposition
+supposition's
+suppositions
+suppress
+suppressed
+suppresses
+suppressing
+suppression
+suppressions
+suppressive
+suppressiveness
+supremacy
+supreme
+supremely
+supremeness
+sure
+sured
+surely
+sureness
+surer
+surest
+sureties
+surety
+surf
+surface
+surfaced
+surfaceness
+surfacer
+surfacers
+surfaces
+surfacing
+surfer
+surfer's
+surfers
+surfing
+surge
+surged
+surgely
+surgeon
+surgeon's
+surgeons
+surgeries
+surgery
+surges
+surgical
+surgically
+surging
+surlier
+surliness
+surly
+surmise
+surmised
+surmiser
+surmises
+surmising
+surmount
+surmounted
+surmounting
+surmounts
+surname
+surname's
+surnamed
+surnames
+surpass
+surpassed
+surpasses
+surpassing
+surpassingly
+surplus
+surplus's
+surpluses
+surprise
+surprise's
+surprised
+surpriser
+surprises
+surprising
+surprisingly
+surrender
+surrendered
+surrenderer
+surrendering
+surrenders
+surrogate
+surrogate's
+surrogates
+surrogation
+surround
+surrounded
+surrounding
+surroundings
+surrounds
+survey
+surveyed
+surveying
+surveyor
+surveyor's
+surveyors
+surveys
+survival
+survivals
+survive
+survived
+surviver
+survives
+surviving
+survivor
+survivor's
+survivors
+susceptible
+suspect
+suspected
+suspecter
+suspecting
+suspects
+suspend
+suspended
+suspender
+suspender's
+suspenders
+suspending
+suspends
+suspense
+suspenses
+suspension
+suspensions
+suspensive
+suspensively
+suspicion
+suspicion's
+suspicioned
+suspicioning
+suspicions
+suspicious
+suspiciously
+suspiciousness
+sustain
+sustained
+sustainer
+sustaining
+sustains
+suture
+sutured
+sutures
+suturing
+swagger
+swaggered
+swaggering
+swain
+swain's
+swains
+swallow
+swallowed
+swallower
+swallowing
+swallows
+swam
+swamp
+swamped
+swamper
+swampier
+swampiness
+swamping
+swamps
+swampy
+swan
+swan's
+swans
+swap
+swapped
+swapper
+swapper's
+swappers
+swapping
+swaps
+swarm
+swarmed
+swarmer
+swarming
+swarms
+swarthier
+swarthiness
+swarthy
+swatted
+sway
+swayed
+swayer
+swaying
+sways
+swear
+swearer
+swearing
+swears
+sweat
+sweated
+sweater
+sweaters
+sweating
+sweats
+sweep
+sweeper
+sweepers
+sweeping
+sweepingly
+sweepingness
+sweepings
+sweeps
+sweet
+sweeten
+sweetened
+sweetener
+sweeteners
+sweetening
+sweetenings
+sweetens
+sweeter
+sweetest
+sweetheart
+sweetheart's
+sweethearts
+sweetie
+sweetie's
+sweeties
+sweeting
+sweetly
+sweetness
+sweets
+swell
+swelled
+swelling
+swellings
+swells
+swept
+swerve
+swerved
+swerves
+swerving
+swift
+swifter
+swiftest
+swiftly
+swiftness
+swim
+swimmer
+swimmer's
+swimmers
+swimming
+swimmingly
+swims
+swimsuit
+swimsuit's
+swimsuits
+swine
+swing
+swinger
+swingers
+swinging
+swingingly
+swings
+swipe
+swiped
+swipes
+swiping
+swirl
+swirled
+swirler
+swirling
+swirlingly
+swirls
+swish
+swished
+swisher
+switch
+switch's
+switchboard
+switchboard's
+switchboards
+switched
+switcher
+switchers
+switches
+switching
+switchings
+swollen
+swoon
+swooned
+swooner
+swooning
+swooningly
+swoons
+swoop
+swooped
+swooper
+swooping
+swoops
+sword
+sword's
+swords
+swore
+sworn
+swum
+swung
+sycamore
+syllabi
+syllable
+syllable's
+syllabled
+syllables
+syllabling
+syllabus
+syllogism
+syllogism's
+syllogisms
+symbiosis
+symbiotic
+symbol
+symbol's
+symbolic
+symbolic's
+symbolically
+symbolics
+symbolism
+symbolisms
+symbols
+symmetric
+symmetrical
+symmetrically
+symmetricalness
+symmetries
+symmetry
+symmetry's
+sympathetic
+sympathies
+sympathy
+sympathy's
+symphonies
+symphony
+symphony's
+symposium
+symposiums
+symptom
+symptom's
+symptomatic
+symptoms
+synapse
+synapse's
+synapsed
+synapses
+synapsing
+synchronous
+synchronously
+synchronousness
+synchrony
+syndicate
+syndicated
+syndicates
+syndicating
+syndication
+syndrome
+syndrome's
+syndromes
+synergism
+synergistic
+synonym
+synonym's
+synonymous
+synonymously
+synonyms
+synopses
+synopsis
+syntactic
+syntactical
+syntactically
+syntacticly
+syntactics
+syntax
+syntaxes
+syntheses
+synthesis
+synthetic
+synthetics
+syringe
+syringed
+syringes
+syringing
+syrup
+system
+system's
+systematic
+systematically
+systematicness
+systematics
+systems
+tab
+tabernacle
+tabernacle's
+tabernacled
+tabernacles
+tabernacling
+table
+tableau
+tableau's
+tableaus
+tablecloth
+tablecloths
+tabled
+tables
+tablespoon
+tablespoon's
+tablespoonful
+tablespoonful's
+tablespoonfuls
+tablespoons
+tablet
+tablet's
+tablets
+tabling
+taboo
+taboo's
+taboos
+tabs
+tabular
+tabularly
+tabulate
+tabulated
+tabulates
+tabulating
+tabulation
+tabulations
+tabulator
+tabulator's
+tabulators
+tachometer
+tachometer's
+tachometers
+tachometry
+tacit
+tacitly
+tacitness
+tack
+tacked
+tacker
+tacking
+tackle
+tackle's
+tackled
+tackler
+tackles
+tackling
+tacks
+tact
+tactics
+tactile
+tactilely
+tag
+tag's
+tagged
+tagging
+tags
+tail
+tailed
+tailer
+tailing
+tailings
+tailor
+tailored
+tailoring
+tailors
+tails
+taint
+tainted
+taints
+take
+taken
+taker
+takers
+takes
+taketh
+taking
+takings
+tale
+tale's
+talent
+talented
+talents
+taler
+tales
+talion
+talk
+talkative
+talkatively
+talkativeness
+talked
+talker
+talkers
+talkie
+talking
+talks
+tall
+taller
+tallest
+tallness
+tallow
+tame
+tamed
+tamely
+tameness
+tamer
+tames
+tamest
+taming
+tamper
+tampered
+tamperer
+tampering
+tampers
+tan
+tandem
+tang
+tanged
+tangent
+tangent's
+tangential
+tangentially
+tangents
+tangible
+tangibleness
+tangibly
+tangier
+tangle
+tangled
+tangles
+tangling
+tangly
+tangy
+tank
+tanked
+tanker
+tankers
+tanking
+tanks
+tanner
+tanner's
+tanners
+tans
+tantamount
+tantrum
+tantrum's
+tantrums
+tap
+tap's
+tape
+taped
+taper
+tapered
+taperer
+tapering
+tapers
+tapes
+tapestried
+tapestries
+tapestry
+tapestry's
+taping
+tapings
+tapped
+tapper
+tapper's
+tappers
+tapping
+taproot
+taproot's
+taproots
+taps
+tar
+tardier
+tardies
+tardiness
+tardy
+target
+targeted
+targeting
+targets
+tariff
+tariff's
+tariffs
+taring
+tarried
+tarries
+tarry
+tarrying
+tars
+tart
+tartly
+tartness
+tarts
+task
+tasked
+tasking
+tasks
+taste
+tasted
+tasteful
+tastefully
+tastefulness
+tasteless
+tastelessly
+tastelessness
+taster
+tasters
+tastes
+tasting
+tatter
+tattered
+tattoo
+tattooed
+tattooer
+tattoos
+tau
+taught
+taunt
+taunted
+taunter
+taunting
+tauntingly
+taunts
+taut
+tauten
+tautened
+tautening
+tautly
+tautness
+tautological
+tautologically
+tautologies
+tautology
+tautology's
+tavern
+tavern's
+taverner
+taverns
+tawnier
+tawnies
+tawniness
+tawny
+tax
+taxable
+taxation
+taxed
+taxer
+taxes
+taxi
+taxi's
+taxicab
+taxicab's
+taxicabs
+taxied
+taxiing
+taxing
+taxingly
+taxis
+taxonomic
+taxonomically
+taxonomy
+taxpayer
+taxpayer's
+taxpayers
+tea
+teach
+teachable
+teachableness
+teacher
+teacher's
+teachers
+teaches
+teaching
+teachings
+team
+team's
+teamed
+teaming
+teams
+tear
+tear's
+teared
+tearer
+tearful
+tearfully
+tearfulness
+tearing
+tears
+teas
+tease
+teased
+teaser
+teases
+teasing
+teasingly
+teaspoon
+teaspoon's
+teaspoonful
+teaspoonful's
+teaspoonfuls
+teaspoons
+technical
+technicalities
+technicality
+technicality's
+technically
+technicalness
+technician
+technician's
+technicians
+technique
+technique's
+techniques
+technological
+technologically
+technologies
+technologist
+technologist's
+technologists
+technology
+technology's
+tedious
+tediously
+tediousness
+tedium
+teem
+teemed
+teeming
+teemingly
+teemingness
+teems
+teen
+teenage
+teenaged
+teenager
+teenagers
+teener
+teens
+teeth
+teethe
+teethed
+teether
+teethes
+teething
+telecommunication
+telecommunications
+teleconference
+teleconference's
+teleconferenced
+teleconferences
+teleconferencing
+telegram
+telegram's
+telegrams
+telegraph
+telegraphed
+telegrapher
+telegraphers
+telegraphic
+telegraphing
+telegraphs
+teleological
+teleologically
+teleology
+telephone
+telephoned
+telephoner
+telephoners
+telephones
+telephonic
+telephoning
+telephony
+telescope
+telescoped
+telescopes
+telescoping
+teletype
+teletype's
+teletypes
+televise
+televised
+televises
+televising
+television
+televisions
+televisor
+televisor's
+televisors
+tell
+teller
+tellers
+telling
+tellingly
+tellings
+tells
+temper
+temperament
+temperamental
+temperamentally
+temperaments
+temperance
+temperate
+temperately
+temperateness
+temperature
+temperature's
+temperatures
+tempered
+temperer
+tempering
+tempers
+tempest
+tempests
+tempestuous
+tempestuously
+tempestuousness
+template
+template's
+templates
+temple
+temple's
+templed
+temples
+temporal
+temporally
+temporaries
+temporarily
+temporariness
+temporary
+tempt
+temptation
+temptation's
+temptations
+tempted
+tempter
+tempters
+tempting
+temptingly
+tempts
+ten
+ten's
+tenacious
+tenaciously
+tenaciousness
+tenant
+tenant's
+tenants
+tend
+tended
+tendencies
+tendency
+tender
+tendered
+tendering
+tenderly
+tenderness
+tenders
+tending
+tends
+tenement
+tenement's
+tenements
+tennis
+tenor
+tenor's
+tenors
+tens
+tense
+tensed
+tensely
+tenseness
+tenser
+tenses
+tensest
+tensing
+tension
+tensioned
+tensioner
+tensioning
+tensions
+tensive
+tensor
+tensor's
+tensors
+tent
+tentacle
+tentacled
+tentacles
+tentative
+tentatively
+tentativeness
+tented
+tenter
+tenth
+tenthes
+tenting
+tents
+tenure
+tenured
+tenures
+tequila
+tequila's
+term
+termcap
+termed
+termer
+terminal
+terminal's
+terminally
+terminals
+terminate
+terminated
+terminates
+terminating
+termination
+terminations
+terminative
+terminatively
+terminator
+terminator's
+terminators
+terming
+terminologies
+terminology
+terminus
+termly
+terms
+ternary
+terrace
+terraced
+terraces
+terracing
+terrain
+terrain's
+terrains
+terrestrial
+terrestrial's
+terrestrially
+terrestrials
+terrible
+terribleness
+terribly
+terrier
+terrier's
+terriers
+terrific
+terrificly
+terrified
+terrifies
+terrify
+terrifying
+terrifyingly
+territorial
+territorially
+territories
+territory
+territory's
+terror
+terror's
+terrorism
+terrorist
+terrorist's
+terroristic
+terrorists
+terrors
+tertiaries
+tertiary
+test
+test's
+testability
+testable
+testament
+testament's
+testaments
+tested
+tester
+tester's
+testers
+testicle
+testicle's
+testicles
+testified
+testifier
+testifiers
+testifies
+testify
+testifying
+testimonies
+testimony
+testimony's
+testing
+testings
+tests
+text
+text's
+textbook
+textbook's
+textbooks
+textile
+textile's
+textiles
+texts
+textual
+textually
+texture
+textured
+textures
+texturing
+than
+thank
+thanked
+thanker
+thankful
+thankfully
+thankfulness
+thanking
+thankless
+thanklessly
+thanklessness
+thanks
+thanksgiving
+thanksgiving's
+thanksgivings
+that
+that's
+thatch
+thatched
+thatcher
+thatches
+thatching
+thats
+thaw
+thawed
+thawing
+thaws
+the
+theatrical
+theatrically
+theatricals
+theft
+theft's
+thefts
+their
+their's
+theirs
+them
+thematic
+theme
+theme's
+themes
+themselves
+then
+thence
+thenceforth
+theologian
+theologian's
+theologians
+theological
+theologically
+theologies
+theology
+theorem
+theorem's
+theorems
+theoretic
+theoretical
+theoretically
+theoreticians
+theoretics
+theories
+theorist
+theorist's
+theorists
+theory
+theory's
+therapeutic
+therapeutics
+therapies
+therapist
+therapist's
+therapists
+therapy
+therapy's
+there
+there's
+thereabouts
+thereafter
+thereby
+therefore
+therein
+thereof
+thereon
+thereto
+thereupon
+therewith
+thermodynamic
+thermodynamics
+thermometer
+thermometer's
+thermometers
+thermostat
+thermostat's
+thermostated
+thermostats
+these
+theses
+thesis
+they
+they'd
+they'll
+they're
+they've
+thick
+thicken
+thickened
+thickener
+thickeners
+thickening
+thickens
+thicker
+thickest
+thicket
+thicket's
+thicketed
+thickets
+thickly
+thickness
+thicknesses
+thicks
+thief
+thieve
+thieves
+thieving
+thigh
+thighed
+thighs
+thimble
+thimble's
+thimbles
+thin
+thiner
+thinest
+thing
+thingamajig
+thingamajig's
+thingamajigs
+thingness
+things
+think
+thinkable
+thinkableness
+thinkably
+thinker
+thinkers
+thinking
+thinkingly
+thinkingness
+thinks
+thinly
+thinner
+thinners
+thinness
+thinnest
+thins
+third
+thirdly
+thirds
+thirst
+thirsted
+thirster
+thirstier
+thirstiness
+thirsts
+thirsty
+thirteen
+thirteens
+thirteenth
+thirties
+thirtieth
+thirty
+this
+thistle
+thong
+thonged
+thorn
+thorn's
+thornier
+thorniness
+thorns
+thorny
+thorough
+thoroughfare
+thoroughfare's
+thoroughfares
+thoroughly
+thoroughness
+those
+though
+thought
+thought's
+thoughtful
+thoughtfully
+thoughtfulness
+thoughtless
+thoughtlessly
+thoughtlessness
+thoughts
+thousand
+thousands
+thousandth
+thrash
+thrashed
+thrasher
+thrashes
+thrashing
+thread
+threaded
+threader
+threaders
+threading
+threads
+threat
+threaten
+threatened
+threatener
+threatening
+threateningly
+threatens
+threats
+three
+three's
+threes
+threescore
+threshold
+threshold's
+thresholded
+thresholding
+thresholds
+threw
+thrice
+thrift
+thriftier
+thriftiness
+thrifty
+thrill
+thrilled
+thriller
+thrillers
+thrilling
+thrillingly
+thrills
+thrive
+thrived
+thriver
+thrives
+thriving
+thrivingly
+throat
+throated
+throating
+throats
+throb
+throbbed
+throbbing
+throbs
+throne
+throne's
+thrones
+throng
+throng's
+thronging
+throngs
+throning
+throttle
+throttled
+throttler
+throttles
+throttling
+through
+throughly
+throughout
+throughput
+throw
+thrower
+throwing
+thrown
+throws
+thrush
+thrushes
+thrust
+thruster
+thrusters
+thrusting
+thrusts
+thud
+thuds
+thug
+thug's
+thugs
+thumb
+thumbed
+thumbing
+thumbs
+thump
+thumped
+thumper
+thumping
+thumps
+thunder
+thunderbolt
+thunderbolt's
+thunderbolts
+thundered
+thunderer
+thunderers
+thundering
+thunderingly
+thunders
+thunderstorm
+thunderstorm's
+thunderstorms
+thunderstruck
+thus
+thusly
+thwart
+thwarted
+thwarter
+thwarting
+thwartly
+thwarts
+thyself
+tick
+ticked
+ticker
+tickers
+ticket
+ticket's
+ticketed
+ticketing
+tickets
+ticking
+tickle
+tickled
+tickler
+tickles
+tickling
+ticklish
+ticklishly
+ticklishness
+ticks
+tidal
+tidally
+tide
+tided
+tides
+tidied
+tidier
+tidies
+tidiness
+tiding
+tidings
+tidy
+tidying
+tie
+tied
+tier
+tiered
+tiers
+ties
+tiger
+tiger's
+tigers
+tight
+tighten
+tightened
+tightener
+tighteners
+tightening
+tightenings
+tightens
+tighter
+tightest
+tightly
+tightness
+tights
+tilde
+tildes
+tile
+tiled
+tiler
+tiles
+tiling
+till
+tillable
+tilled
+tiller
+tillered
+tillering
+tillers
+tilling
+tills
+tilt
+tilted
+tilter
+tilters
+tilting
+tilts
+timber
+timbered
+timbering
+timbers
+time
+timed
+timeless
+timelessly
+timelessness
+timelier
+timeliness
+timely
+timeout
+timeouts
+timer
+timers
+times
+timeshare
+timeshared
+timeshares
+timesharing
+timetable
+timetable's
+timetabled
+timetables
+timetabling
+timid
+timidity
+timidly
+timidness
+timing
+timings
+tin
+tin's
+tinge
+tinged
+tinging
+tingle
+tingled
+tingles
+tingling
+tinglingly
+tinier
+tiniest
+tinily
+tininess
+tinker
+tinkered
+tinkerer
+tinkering
+tinkers
+tinkle
+tinkled
+tinkles
+tinkling
+tinned
+tinnier
+tinniest
+tinnily
+tinniness
+tinning
+tinny
+tins
+tint
+tinted
+tinter
+tinting
+tints
+tiny
+tip
+tip's
+tipped
+tipper
+tipper's
+tippers
+tipping
+tips
+tiptoe
+tiptoed
+tire
+tired
+tiredly
+tiredness
+tireless
+tirelessly
+tirelessness
+tires
+tiresome
+tiresomely
+tiresomeness
+tiring
+tissue
+tissue's
+tissued
+tissues
+tissuing
+tit
+tit's
+tithe
+tithe's
+tither
+tithes
+tithing
+title
+titled
+titles
+titling
+tits
+titter
+tittered
+tittering
+titters
+tizzies
+tizzy
+to
+toad
+toad's
+toads
+toast
+toasted
+toaster
+toasters
+toastier
+toasting
+toasts
+toasty
+tobacco
+today
+today's
+todays
+toe
+toe's
+toed
+toes
+together
+togetherness
+toggle
+toggled
+toggles
+toggling
+toil
+toiled
+toiler
+toilet
+toilet's
+toilets
+toiling
+toils
+token
+token's
+tokens
+told
+tolerability
+tolerable
+tolerably
+tolerance
+tolerances
+tolerant
+tolerantly
+tolerate
+tolerated
+tolerates
+tolerating
+toleration
+tolerative
+toll
+tolled
+tolling
+tolls
+tom
+tom's
+tomahawk
+tomahawk's
+tomahawks
+tomato
+tomatoes
+tomb
+tomb's
+tombs
+tomography
+tomorrow
+tomorrow's
+tomorrows
+toms
+ton
+ton's
+tone
+toned
+toner
+tones
+tongs
+tongue
+tongued
+tongues
+tonguing
+tonic
+tonic's
+tonics
+tonight
+toning
+tonnage
+tons
+tonsil
+too
+took
+tool
+tooled
+tooler
+toolers
+tooling
+toolkit
+toolkit's
+toolkits
+tools
+tooth
+toothbrush
+toothbrush's
+toothbrushes
+toothbrushing
+toothed
+toothing
+toothpick
+toothpick's
+toothpicks
+top
+toped
+toper
+topic
+topic's
+topical
+topically
+topics
+toping
+topmost
+topological
+topologically
+topologies
+topology
+topple
+toppled
+topples
+toppling
+tops
+torch
+torch's
+torches
+tore
+torment
+tormented
+tormenter
+tormenters
+tormenting
+torments
+torn
+tornado
+tornadoes
+tornados
+torpedo
+torpedoed
+torpedoes
+torpedoing
+torpedos
+torque
+torquer
+torquers
+torques
+torquing
+torrent
+torrent's
+torrents
+torrid
+torridly
+torridness
+tortoise
+tortoise's
+tortoises
+torture
+tortured
+torturer
+torturers
+tortures
+torturing
+torus
+torus's
+toruses
+toss
+tossed
+tosser
+tosses
+tossing
+total
+total's
+totalities
+totality
+totality's
+totally
+totals
+totter
+tottered
+tottering
+totteringly
+totters
+touch
+touchable
+touched
+toucher
+touches
+touchier
+touchiest
+touchily
+touchiness
+touching
+touchingly
+touchy
+tough
+toughen
+toughened
+toughening
+toughens
+tougher
+toughest
+toughly
+toughness
+tour
+toured
+tourer
+touring
+tourist
+tourist's
+tourists
+tournament
+tournament's
+tournaments
+tours
+tow
+toward
+towardliness
+towardly
+towards
+towed
+towel
+towel's
+towels
+tower
+towered
+towering
+toweringly
+towers
+towing
+town
+town's
+towner
+towns
+township
+township's
+townships
+tows
+toxicity
+toxin
+toxin's
+toxins
+toy
+toyed
+toyer
+toying
+toys
+trace
+traceable
+traceableness
+traced
+traceless
+tracelessly
+tracer
+tracers
+traces
+tracing
+tracings
+track
+tracked
+tracker
+trackers
+tracking
+tracks
+tract
+tract's
+tractability
+tractable
+tractive
+tractor
+tractor's
+tractors
+tracts
+trade
+traded
+trademark
+trademark's
+trademarks
+tradeoff
+tradeoffs
+trader
+traders
+trades
+tradesman
+trading
+tradition
+tradition's
+traditional
+traditionally
+traditions
+traffic
+traffic's
+trafficked
+trafficker
+trafficker's
+traffickers
+trafficking
+traffics
+tragedies
+tragedy
+tragedy's
+tragic
+tragically
+trail
+trailed
+trailer
+trailers
+trailing
+trailings
+trails
+train
+trained
+trainee
+trainee's
+trainees
+trainer
+trainers
+training
+trains
+trait
+trait's
+traitor
+traitor's
+traitors
+traits
+trajectories
+trajectory
+trajectory's
+tramp
+tramped
+tramper
+tramping
+trample
+trampled
+trampler
+tramples
+trampling
+tramps
+trance
+trance's
+trances
+trancing
+tranquil
+tranquility
+tranquillity
+tranquilly
+tranquilness
+transact
+transacted
+transacting
+transaction
+transaction's
+transactions
+transacts
+transceiver
+transceiver's
+transceivers
+transcend
+transcended
+transcendent
+transcendently
+transcending
+transcends
+transcontinental
+transcribe
+transcribed
+transcriber
+transcribers
+transcribes
+transcribing
+transcript
+transcript's
+transcription
+transcription's
+transcriptions
+transcripts
+transfer
+transfer's
+transferability
+transferable
+transferal
+transferal's
+transferals
+transfered
+transference
+transferral
+transferral's
+transferrals
+transferred
+transferrer
+transferrer's
+transferrers
+transferring
+transfers
+transfinite
+transform
+transformable
+transformation
+transformation's
+transformational
+transformations
+transformed
+transformer
+transformers
+transforming
+transforms
+transgress
+transgressed
+transgresses
+transgressing
+transgression
+transgression's
+transgressions
+transgressive
+transience
+transiency
+transient
+transiently
+transients
+transistor
+transistor's
+transistors
+transit
+transition
+transitional
+transitionally
+transitioned
+transitions
+transitive
+transitively
+transitiveness
+transitivity
+transitoriness
+transitory
+translatability
+translatable
+translate
+translated
+translates
+translating
+translation
+translational
+translations
+translative
+translator
+translator's
+translators
+translucent
+translucently
+transmission
+transmission's
+transmissions
+transmit
+transmits
+transmittal
+transmitted
+transmitter
+transmitter's
+transmitters
+transmitting
+transmogrification
+transmogrify
+transparencies
+transparency
+transparency's
+transparent
+transparently
+transparentness
+transpire
+transpired
+transpires
+transpiring
+transplant
+transplanted
+transplanter
+transplanting
+transplants
+transport
+transportability
+transportation
+transportations
+transported
+transporter
+transporters
+transporting
+transports
+transpose
+transposed
+transposes
+transposing
+transposition
+trap
+trap's
+trapezoid
+trapezoid's
+trapezoidal
+trapezoids
+trapped
+trapper
+trapper's
+trappers
+trapping
+trappings
+traps
+trash
+trashed
+trasher
+trashes
+trashing
+traumatic
+travail
+travails
+travel
+travels
+traversal
+traversal's
+traversals
+traverse
+traversed
+traverser
+traverses
+traversing
+travesties
+travesty
+travesty's
+tray
+tray's
+trays
+treacheries
+treacherous
+treacherously
+treacherousness
+treachery
+treachery's
+tread
+treaded
+treader
+treading
+treads
+treason
+treasure
+treasured
+treasurer
+treasures
+treasuries
+treasuring
+treasury
+treasury's
+treat
+treated
+treater
+treaters
+treaties
+treating
+treatise
+treatise's
+treatises
+treatment
+treatment's
+treatments
+treats
+treaty
+treaty's
+treble
+trebled
+trebles
+trebling
+tree
+tree's
+treed
+trees
+treetop
+treetop's
+treetops
+trek
+trek's
+treks
+tremble
+trembled
+trembler
+trembles
+trembling
+tremendous
+tremendously
+tremendousness
+tremor
+tremor's
+tremors
+trench
+trenched
+trencher
+trenchers
+trenches
+trend
+trending
+trends
+trespass
+trespassed
+trespasser
+trespassers
+trespasses
+tress
+tress's
+tressed
+tresses
+trial
+trial's
+trials
+triangle
+triangle's
+triangles
+triangular
+triangularly
+tribal
+tribally
+tribe
+tribe's
+tribes
+tribunal
+tribunal's
+tribunals
+tribune
+tribune's
+tribunes
+tributary
+tribute
+tribute's
+tributes
+tributing
+trichotomy
+trick
+tricked
+tricker
+trickier
+trickiest
+trickiness
+tricking
+trickle
+trickled
+trickles
+trickling
+tricks
+tricky
+tried
+trier
+triers
+tries
+trifle
+trifled
+trifler
+trifles
+trifling
+trigger
+triggered
+triggering
+triggers
+trigonometric
+trigonometry
+trihedral
+trill
+trilled
+triller
+trillion
+trillions
+trillionth
+trim
+trimer
+trimly
+trimmed
+trimmer
+trimmest
+trimming
+trimmings
+trimness
+trims
+trinket
+trinket's
+trinketed
+trinketer
+trinkets
+trip
+trip's
+triple
+tripled
+triples
+triplet
+triplet's
+triplets
+triplication
+tripling
+triply
+trips
+triumph
+triumphal
+triumphantly
+triumphed
+triumphing
+triumphs
+trivia
+trivial
+trivialities
+triviality
+trivially
+trod
+troff
+troff's
+troffer
+troll
+troll's
+trolley
+trolley's
+trolleyed
+trolleys
+trolls
+troop
+trooped
+trooper
+troopers
+trooping
+troops
+trophied
+trophies
+trophy
+trophy's
+trophying
+tropic
+tropic's
+tropical
+tropically
+tropics
+trot
+trots
+trouble
+troubled
+troublemaker
+troublemaker's
+troublemakers
+troubler
+troubles
+troubleshoot
+troubleshooted
+troubleshooter
+troubleshooters
+troubleshooting
+troubleshoots
+troublesome
+troublesomely
+troublesomeness
+troubling
+trough
+trouser
+trousered
+trousers
+trout
+trouts
+trowel
+trowel's
+trowels
+truant
+truant's
+truants
+truce
+trucing
+truck
+trucked
+trucker
+truckers
+trucking
+trucks
+trudge
+trudged
+trudger
+trudges
+trudging
+true
+trued
+trueness
+truer
+trues
+truest
+truing
+truism
+truism's
+truisms
+truly
+trump
+trumped
+trumpet
+trumpeted
+trumpeter
+trumpeting
+trumpets
+trumps
+truncate
+truncated
+truncates
+truncating
+truncation
+truncation's
+truncations
+trunk
+trunk's
+trunked
+trunks
+trust
+trusted
+trustee
+trustee's
+trusteed
+trustees
+truster
+trustful
+trustfully
+trustfulness
+trustier
+trusties
+trustiness
+trusting
+trustingly
+trusts
+trustworthiness
+trustworthy
+trusty
+truth
+truthful
+truthfully
+truthfulness
+truths
+try
+trying
+tryingly
+tty
+tty's
+ttys
+tub
+tub's
+tube
+tubed
+tuber
+tuberculosis
+tubers
+tubes
+tubing
+tubs
+tuck
+tucked
+tucker
+tuckered
+tuckering
+tucking
+tucks
+tuft
+tuft's
+tufted
+tufter
+tufts
+tug
+tugs
+tuition
+tuitions
+tulip
+tulip's
+tulips
+tumble
+tumbled
+tumbler
+tumblers
+tumbles
+tumbling
+tumult
+tumult's
+tumults
+tumultuous
+tumultuously
+tumultuousness
+tunable
+tunableness
+tune
+tuned
+tuner
+tuners
+tunes
+tunic
+tunic's
+tunics
+tuning
+tuning's
+tunings
+tunnel
+tunnels
+tuple
+tuple's
+tuples
+turban
+turban's
+turbaned
+turbans
+turbulence
+turbulence's
+turbulent
+turbulently
+turf
+turkey
+turkey's
+turkeys
+turmoil
+turmoil's
+turmoils
+turn
+turnable
+turned
+turner
+turners
+turning
+turnings
+turnip
+turnip's
+turnips
+turnkey
+turnkeys
+turnover
+turnovers
+turns
+turpentine
+turquoise
+turret
+turret's
+turreted
+turrets
+turtle
+turtle's
+turtles
+turtling
+tutor
+tutored
+tutorial
+tutorial's
+tutorials
+tutoring
+tutors
+twain
+twang
+twanging
+twas
+tweak
+tweaked
+tweaker
+tweaking
+tweaks
+tweed
+tweezer
+tweezers
+twelfth
+twelve
+twelves
+twenties
+twentieth
+twenty
+twice
+twig
+twig's
+twigs
+twilight
+twilight's
+twilights
+twill
+twilled
+twilling
+twin
+twin's
+twine
+twined
+twiner
+twines
+twining
+twinkle
+twinkled
+twinkler
+twinkles
+twinkling
+twins
+twirl
+twirled
+twirler
+twirling
+twirlingly
+twirls
+twist
+twisted
+twister
+twisters
+twisting
+twists
+twitch
+twitched
+twitcher
+twitching
+twitter
+twittered
+twitterer
+twittering
+two
+two's
+twofold
+twos
+tying
+type
+type's
+typed
+typedef
+typedefs
+typer
+types
+typewriter
+typewriter's
+typewriters
+typhoid
+typical
+typically
+typicalness
+typification
+typified
+typifies
+typify
+typifying
+typing
+typist
+typist's
+typists
+typographic
+typographical
+typographically
+typography
+typos
+tyranny
+tyrant
+tyrant's
+tyrants
+ubiquitous
+ubiquitously
+ubiquitousness
+ubiquity
+ugh
+uglier
+ugliest
+ugliness
+ugly
+ulcer
+ulcer's
+ulcered
+ulcering
+ulcers
+ultimate
+ultimately
+ultimateness
+umbrella
+umbrella's
+umbrellas
+umpire
+umpire's
+umpired
+umpires
+umpiring
+unabashed
+unabashedly
+unabated
+unabatedly
+unabbreviated
+unable
+unabridged
+unaccelerated
+unacceptability
+unacceptable
+unacceptably
+unaccessible
+unaccommodated
+unaccompanied
+unaccomplished
+unaccountably
+unaccounted
+unaccustomed
+unaccustomedly
+unachievable
+unachieved
+unacknowledged
+unacquainted
+unadaptable
+unadjustable
+unadjusted
+unadopted
+unadorned
+unadulterated
+unadulteratedly
+unadvised
+unadvisedly
+unaffected
+unaffectedly
+unaffectedness
+unaffectionate
+unaffectionately
+unafraid
+unaggregated
+unaided
+unalienability
+unalienable
+unaligned
+unallocated
+unalloyed
+unalterable
+unalterableness
+unalterably
+unaltered
+unambiguous
+unambiguously
+unambitious
+unanchored
+unanimous
+unanimously
+unannounced
+unanswerable
+unanswered
+unanticipated
+unanticipatedly
+unapologetically
+unappealing
+unappealingly
+unappreciated
+unapproachability
+unapproachable
+unappropriated
+unapt
+unaptly
+unaptness
+unarguable
+unarguably
+unarmed
+unarticulated
+unary
+unashamed
+unashamedly
+unasked
+unassailable
+unassailableness
+unassembled
+unassigned
+unassigns
+unassisted
+unassuming
+unassumingness
+unattached
+unattainability
+unattainable
+unattended
+unattenuated
+unattractive
+unattractively
+unattractiveness
+unattributed
+unauthentic
+unauthenticated
+unavailability
+unavailable
+unavailing
+unavailingly
+unavailingness
+unavoidable
+unavoidably
+unaware
+unawarely
+unawareness
+unawares
+unbacked
+unbalanced
+unbalancedness
+unbanned
+unbanning
+unbans
+unbarbered
+unbarred
+unbated
+unbearable
+unbearably
+unbeatable
+unbeatably
+unbeaten
+unbeautifully
+unbecoming
+unbecomingly
+unbecomingness
+unbelievable
+unbelievably
+unbelieving
+unbelievingly
+unbelted
+unbendable
+unbetrothed
+unbiased
+unbiasedness
+unbidden
+unblemished
+unblinded
+unblinking
+unblinkingly
+unblock
+unblocked
+unblocking
+unblocks
+unblown
+unblushing
+unblushingly
+unbodied
+unbolted
+unboned
+unbonneted
+unborn
+unbound
+unbounded
+unboundedness
+unbowed
+unbranched
+unbreakable
+unbreathable
+unbred
+unbridled
+unbroken
+unbudging
+unbudgingly
+unbuffered
+unbuilt
+unbundled
+unburdened
+unbureaucratic
+unburied
+unburned
+unbuttered
+unbuttoned
+unbuttons
+uncaged
+uncalculating
+uncalled
+uncandidly
+uncanniness
+uncanny
+uncared
+uncaring
+uncatchable
+uncaught
+uncaused
+unceasing
+unceasingly
+uncensored
+uncertain
+uncertainly
+uncertainness
+uncertainties
+uncertainty
+uncertified
+unchallenged
+unchangeability
+unchangeable
+unchangeably
+unchanged
+unchanging
+unchangingly
+unchangingness
+uncharacteristically
+uncharged
+uncharitable
+uncharitableness
+uncharted
+unchartered
+uncheckable
+unchecked
+unchivalrously
+unchosen
+uncivil
+uncivilly
+unclaimed
+unclamorous
+unclamorously
+unclamorousness
+unclarity
+unclassified
+uncle
+uncle's
+unclean
+uncleanliness
+uncleanly
+uncleanness
+unclear
+uncleared
+unclenched
+uncles
+unclipped
+unclosed
+unclothed
+unclouded
+uncloudedly
+unclustered
+uncluttered
+uncoated
+uncoded
+uncoiled
+uncoined
+uncomfortable
+uncomfortably
+uncomforted
+uncommented
+uncommitted
+uncommon
+uncommonly
+uncommonness
+uncomplaining
+uncomplainingly
+uncompleted
+uncomplimentary
+uncomprehending
+uncomprehendingly
+uncompress
+uncompressed
+uncompresses
+uncompressing
+uncompromising
+uncompromisingly
+uncomputable
+unconceivable
+unconcerned
+unconcernedly
+unconcernedness
+unconditional
+unconditionally
+unconditioned
+unconfined
+unconfirmed
+unconformity
+unconnected
+unconquerable
+unconscious
+unconsciously
+unconsciousness
+unconsidered
+unconsolidated
+unconstitutional
+unconstitutionality
+unconstitutionally
+unconstrained
+uncontaminated
+uncontested
+uncontrollability
+uncontrollable
+uncontrollably
+uncontrolled
+unconventional
+unconventionally
+unconvertible
+unconvinced
+unconvincing
+unconvincingly
+unconvincingness
+uncool
+uncooled
+uncooperative
+uncoordinated
+uncorked
+uncorrectable
+uncorrected
+uncorrelated
+uncountable
+uncountably
+uncounted
+uncouth
+uncouthly
+uncouthness
+uncovenanted
+uncover
+uncovered
+uncovering
+uncovers
+uncreated
+uncritically
+uncrowned
+uncrushable
+uncured
+uncurled
+uncynical
+uncynically
+undamaged
+undamped
+undaunted
+undauntedly
+undebatable
+undecidable
+undecided
+undeclared
+undecomposable
+undecorated
+undefended
+undefinability
+undefinable
+undefined
+undefinedness
+undeformed
+undelete
+undeleted
+undemocratic
+undemocratically
+undemonstrative
+undemonstratively
+undemonstrativeness
+undeniable
+undeniableness
+undeniably
+undepicted
+under
+underbrush
+underdone
+underestimate
+underestimated
+underestimates
+underestimating
+underestimation
+underestimations
+underflow
+underflowed
+underflowing
+underflows
+underfoot
+undergo
+undergoes
+undergoing
+undergone
+undergrad
+undergrad's
+undergrads
+undergraduate
+undergraduate's
+undergraduates
+underground
+undergrounder
+underivable
+underived
+underlie
+underlies
+underline
+underlined
+underlines
+underling
+underling's
+underlings
+underlining
+underlinings
+underly
+underlying
+undermine
+undermined
+undermines
+undermining
+underneath
+underpayment
+underpayment's
+underpayments
+underpinning
+underpinnings
+underplay
+underplayed
+underplaying
+underplays
+underscore
+underscored
+underscores
+understand
+understandability
+understandable
+understandably
+understanding
+understandingly
+understandings
+understands
+understated
+understood
+undertake
+undertaken
+undertaker
+undertaker's
+undertakers
+undertakes
+undertaking
+undertakings
+undertook
+underway
+underwear
+underwent
+underworld
+underwrite
+underwriter
+underwriters
+underwrites
+underwriting
+undescended
+undesigned
+undesigning
+undesirability
+undesirable
+undesirableness
+undesirably
+undesired
+undetectable
+undetected
+undetermined
+undeveloped
+undeviated
+undeviating
+undeviatingly
+undid
+undies
+undifferentiated
+undigested
+undignified
+undiluted
+undiminished
+undimmed
+undiplomatic
+undirected
+undisciplined
+undisclosed
+undiscovered
+undiscussed
+undisguised
+undisguisedly
+undismayed
+undisputed
+undisrupted
+undissociated
+undistinguished
+undistorted
+undistributed
+undisturbed
+undivided
+undo
+undocumented
+undoer
+undoes
+undoing
+undoings
+undomesticated
+undone
+undoubled
+undoubted
+undoubtedly
+undrained
+undramatically
+undreamed
+undress
+undressed
+undresses
+undressing
+undried
+undrinkable
+undue
+unduly
+undumper
+undumper's
+undutiful
+undutifully
+undutifulness
+undying
+unearned
+unearthliness
+unearthly
+uneasily
+uneasiness
+uneasy
+uneconomical
+unedited
+unelected
+unembellished
+unemotional
+unemotionally
+unemphatic
+unemphatically
+unemployable
+unemployed
+unemployment
+unencumbered
+unending
+unendingly
+unendurable
+unendurableness
+unendurably
+unenlightening
+unenthusiastic
+unenthusiastically
+unenumerated
+unenvied
+unequal
+unequally
+unequivocal
+unequivocally
+unerring
+unerringly
+unessential
+unethically
+unevaluated
+uneven
+unevenly
+unevenness
+uneventful
+uneventfully
+unexamined
+unexampled
+unexceptionally
+unexcused
+unexpanded
+unexpected
+unexpectedly
+unexpectedness
+unexpended
+unexperienced
+unexplainable
+unexplained
+unexploited
+unexplored
+unexpressed
+unextended
+unfading
+unfadingly
+unfair
+unfairly
+unfairness
+unfaith
+unfaithful
+unfaithfully
+unfaithfulness
+unfaltering
+unfalteringly
+unfamiliar
+unfamiliarity
+unfamiliarly
+unfashionable
+unfashionably
+unfastened
+unfathered
+unfeathered
+unfeigned
+unfeignedly
+unfenced
+unfettered
+unfilial
+unfilially
+unfilled
+unfinished
+unfired
+unfit
+unfitly
+unfitness
+unfitted
+unfixed
+unflagging
+unflaggingly
+unflattering
+unflatteringly
+unfledged
+unflinching
+unflinchingly
+unfocused
+unfold
+unfolded
+unfolding
+unfolds
+unforeseen
+unforgeable
+unforgettable
+unforgettably
+unforgivable
+unforgiving
+unforgivingness
+unformatted
+unformed
+unforthcoming
+unfortunate
+unfortunately
+unfortunates
+unfounded
+unfrequented
+unfriendliness
+unfriendly
+unfrosted
+unfruitful
+unfruitfully
+unfruitfulness
+unfulfilled
+unfunded
+unfunnily
+unfurnished
+ungainliness
+ungainly
+ungallantly
+ungenerously
+ungirt
+unglazed
+unglued
+ungot
+ungotten
+ungoverned
+ungraceful
+ungracefully
+ungracefulness
+ungraciously
+ungraded
+ungrammatical
+ungrateful
+ungratefully
+ungratefulness
+ungratified
+ungrounded
+unguarded
+unguardedly
+unguardedness
+unguessable
+unguessed
+unguided
+unhallow
+unhallowed
+unhampered
+unhandily
+unhandsomely
+unhappier
+unhappiest
+unhappily
+unhappiness
+unhappy
+unharmed
+unhealthily
+unhealthiness
+unhealthy
+unheard
+unheeded
+unheeding
+unhelm
+unhelpfully
+unheralded
+unhesitating
+unhesitatingly
+unhinged
+unhitched
+unhooks
+unhoped
+unhurriedly
+unhysterical
+unhysterically
+unicorn
+unicorn's
+unicorns
+unidentifiable
+unidentified
+unidirectional
+unidirectionality
+unidirectionally
+unification
+unifications
+unified
+unifier
+unifiers
+unifies
+uniform
+uniformed
+uniforming
+uniformities
+uniformity
+uniformly
+uniformness
+uniforms
+unify
+unifying
+unilluminating
+unimaginable
+unimaginably
+unimaginatively
+unimpaired
+unimpassioned
+unimpeded
+unimplemented
+unimportance
+unimportant
+unimpressed
+unimproved
+unincorporated
+unindented
+uninfected
+uninfluenced
+uninformatively
+uninformed
+uninhabited
+uninhibited
+uninhibitedly
+uninhibitedness
+uninitiated
+uninjured
+uninspired
+uninspiring
+uninstantiated
+uninsulated
+unintelligent
+unintelligently
+unintelligibility
+unintelligible
+unintelligibleness
+unintelligibly
+unintended
+unintentional
+unintentionally
+uninteresting
+uninterestingly
+uninterpretable
+uninterpreted
+uninterrupted
+uninterruptedly
+uninterruptedness
+uninterviewed
+uninvited
+union
+union's
+unions
+unique
+uniquely
+uniqueness
+unison
+unit
+unit's
+unite
+united
+unitedly
+uniter
+unites
+unities
+uniting
+unitive
+units
+unity
+unity's
+univalve
+univalve's
+univalves
+universal
+universality
+universally
+universalness
+universals
+universe
+universe's
+universes
+universities
+university
+university's
+unjacketed
+unjam
+unjammed
+unjamming
+unjoined
+unjust
+unjustifiable
+unjustified
+unjustly
+unjustness
+unkind
+unkindliness
+unkindly
+unkindness
+unknit
+unknowable
+unknowing
+unknowingly
+unknown
+unknowns
+unlaced
+unlamented
+unlashed
+unlaundered
+unlawful
+unlawfully
+unlawfulness
+unleaded
+unleash
+unleashed
+unleashes
+unleashing
+unleavened
+unless
+unlettered
+unlicensed
+unlicked
+unlike
+unlikelihood
+unlikelihoods
+unlikeliness
+unlikely
+unlikeness
+unlimbers
+unlimited
+unlimitedly
+unlined
+unlink
+unlinked
+unlinking
+unlinks
+unlisted
+unload
+unloaded
+unloader
+unloaders
+unloading
+unloads
+unlock
+unlocked
+unlocking
+unlocks
+unlogged
+unloved
+unluckily
+unluckiness
+unlucky
+unmade
+unmagnified
+unmaintainable
+unmaintained
+unmaliciously
+unmanageable
+unmanageably
+unmanaged
+unmanned
+unmannered
+unmanneredly
+unmannerliness
+unmannerly
+unmapped
+unmaps
+unmarked
+unmarried
+unmarrieds
+unmasked
+unmatchable
+unmatched
+unmated
+unmates
+unmeant
+unmeasurable
+unmentionable
+unmentionables
+unmentioned
+unmerciful
+unmercifully
+unmeshed
+unmistakable
+unmistakably
+unmitigated
+unmitigatedly
+unmitigatedness
+unmixed
+unmoderated
+unmodifiable
+unmodified
+unmolested
+unmotivated
+unmount
+unmountable
+unmounted
+unmoved
+unmurmuring
+unnameable
+unnamed
+unnatural
+unnaturally
+unnaturalness
+unnecessarily
+unnecessary
+unneeded
+unnegated
+unnerve
+unnerved
+unnerves
+unnerving
+unnervingly
+unnoticed
+unnourished
+unnumbered
+unobservable
+unobservables
+unobserved
+unobtainable
+unoccupied
+unofficial
+unofficially
+unopened
+unordered
+unoriginals
+unorthodoxly
+unpack
+unpackaged
+unpackages
+unpacked
+unpacker
+unpacking
+unpacks
+unpadded
+unpaged
+unpaid
+unpainted
+unpaired
+unparliamentary
+unparsed
+unpartitioned
+unpatriotic
+unpaved
+unperceived
+unperformed
+unperturbed
+unperturbedly
+unplaced
+unplagued
+unplanned
+unpleasant
+unpleasantly
+unpleasantness
+unpleased
+unplowed
+unplugged
+unplugging
+unplugs
+unplumbed
+unpolled
+unpolluted
+unpopular
+unpopularity
+unprecedented
+unprecedentedly
+unpredictability
+unpredictable
+unpredictably
+unpredicted
+unprejudiced
+unprescribed
+unpreserved
+unpretending
+unpretentious
+unpretentiously
+unpretentiousness
+unpriced
+unprimed
+unprincipled
+unprincipledness
+unprintable
+unprinted
+unprivileged
+unproblematic
+unproblematical
+unproblematically
+unprocessed
+unprofitable
+unprofitableness
+unprofitably
+unprojected
+unpromising
+unpromisingly
+unprompted
+unpronounceable
+unpropagated
+unpropertied
+unprotected
+unprotectedly
+unprovability
+unprovable
+unproved
+unproven
+unprovided
+unpublished
+unpunched
+unpunished
+unqualified
+unqualifiedly
+unquantifiable
+unquenched
+unquestionably
+unquestioned
+unquestioningly
+unquoted
+unranked
+unrated
+unravel
+unravels
+unreachable
+unreacted
+unread
+unreadability
+unreadable
+unreal
+unrealism
+unrealistic
+unrealistically
+unrealized
+unrealizes
+unreasonable
+unreasonableness
+unreasonably
+unreassuringly
+unreconstructed
+unrecordable
+unrecorded
+unrecoverable
+unredeemed
+unreferenced
+unrefined
+unreflected
+unregister
+unregistered
+unregistering
+unregisters
+unregulated
+unrehearsed
+unreinforced
+unrelated
+unreleased
+unrelenting
+unrelentingly
+unreliabilities
+unreliability
+unreliable
+unreliably
+unremarked
+unreported
+unrepresentable
+unrepresented
+unrequested
+unrequited
+unreserved
+unreservedly
+unreservedness
+unresisted
+unresisting
+unresolved
+unresponsive
+unresponsively
+unresponsiveness
+unrest
+unrestrained
+unrestrainedly
+unrestrainedness
+unrestricted
+unrestrictedly
+unrestrictive
+unreturned
+unrevealing
+unrifled
+unrighteous
+unrighteously
+unrighteousness
+unroll
+unrolled
+unrolling
+unrolls
+unromantically
+unrotated
+unruffled
+unruled
+unruliness
+unruly
+unsafe
+unsafely
+unsaid
+unsalted
+unsanitary
+unsatisfactorily
+unsatisfactory
+unsatisfiability
+unsatisfiable
+unsatisfied
+unsatisfying
+unsaturated
+unsaved
+unscheduled
+unschooled
+unscientific
+unscientifically
+unscramble
+unscrambled
+unscrambler
+unscrambles
+unscrambling
+unscratched
+unscreened
+unscrews
+unscripted
+unscrupulous
+unscrupulously
+unscrupulousness
+unsealed
+unseals
+unseasonable
+unseasonableness
+unseasonably
+unseasoned
+unsecured
+unseeded
+unseeing
+unseemly
+unseen
+unsegmented
+unsegregated
+unselected
+unselfish
+unselfishly
+unselfishness
+unsent
+unserved
+unserviced
+unsettled
+unsettledness
+unsettling
+unsettlingly
+unshaded
+unshakable
+unshaken
+unshared
+unsharpened
+unshaved
+unshaven
+unsheathing
+unshelled
+unsheltered
+unshielded
+unshod
+unsigned
+unsimplified
+unsized
+unskilled
+unskillful
+unskillfully
+unskillfulness
+unslings
+unsloped
+unslung
+unsmiling
+unsmilingly
+unsnap
+unsnapped
+unsnapping
+unsnaps
+unsociability
+unsociable
+unsociableness
+unsociably
+unsocial
+unsocially
+unsolicited
+unsolvable
+unsolved
+unsophisticated
+unsophistication
+unsorted
+unsought
+unsound
+unsounded
+unsoundly
+unsoundness
+unsparing
+unsparingly
+unspeakable
+unspecified
+unspent
+unspoiled
+unspoken
+unspotted
+unsprayed
+unsprung
+unstable
+unstableness
+unstably
+unstacked
+unstacks
+unstained
+unstapled
+unstaring
+unstated
+unsteadily
+unsteadiness
+unsteady
+unstemmed
+unstinting
+unstintingly
+unstoppable
+unstopped
+unstrained
+unstratified
+unstreamed
+unstressed
+unstriped
+unstructured
+unstrung
+unstuck
+unsubscripted
+unsubstantially
+unsubstantiated
+unsubstituted
+unsuccessful
+unsuccessfully
+unsuffixed
+unsuitability
+unsuitable
+unsuitably
+unsuited
+unsung
+unsupportable
+unsupported
+unsure
+unsurpassed
+unsurprised
+unsurprising
+unsurprisingly
+unsuspected
+unsuspecting
+unsuspended
+unswerving
+unsymmetrically
+unsympathetic
+untamed
+untampered
+untaped
+untapped
+untaught
+untented
+unterminated
+untestable
+untested
+unthematic
+unthinkable
+unthinkably
+unthinkingly
+untidiness
+untidy
+untie
+untied
+unties
+until
+untimeliness
+untimely
+untitled
+unto
+untold
+untouchable
+untouchable's
+untouchables
+untouched
+untoward
+untowardly
+untowardness
+untraceable
+untraced
+untracked
+untrained
+untransformed
+untranslated
+untransposed
+untreated
+untried
+untrod
+untroubled
+untrue
+untruly
+untrusted
+untrustworthiness
+untruth
+untruthful
+untruthfully
+untruthfulness
+untutored
+untwisted
+untying
+untyped
+unusable
+unused
+unusual
+unusually
+unusualness
+unuttered
+unvalued
+unvarnished
+unvarying
+unveil
+unveiled
+unveiling
+unveils
+unventilated
+unverified
+unvisited
+unvoiced
+unwaged
+unwanted
+unwarily
+unwarranted
+unwashed
+unwashedness
+unwatched
+unwavering
+unwaveringly
+unwearied
+unweariedly
+unweighed
+unwelcome
+unwept
+unwholesome
+unwholesomely
+unwieldiness
+unwieldy
+unwilled
+unwilling
+unwillingly
+unwillingness
+unwind
+unwinder
+unwinders
+unwinding
+unwinds
+unwinking
+unwired
+unwise
+unwisely
+unwiser
+unwisest
+unwitnessed
+unwitting
+unwittingly
+unwonted
+unwontedly
+unwontedness
+unworldliness
+unworldly
+unworn
+unworthiness
+unworthy
+unwound
+unwounded
+unwoven
+unwrap
+unwrapped
+unwrapping
+unwraps
+unwrinkled
+unwritable
+unwritten
+unyielded
+unyielding
+unyieldingly
+up
+upbraid
+upbraider
+upbringing
+update
+updated
+updater
+updates
+updating
+upfield
+upgrade
+upgraded
+upgrades
+upgrading
+upheld
+uphill
+uphold
+upholder
+upholders
+upholding
+upholds
+upholster
+upholstered
+upholsterer
+upholsterers
+upholstering
+upholsters
+upkeep
+upland
+uplander
+uplands
+uplift
+uplifted
+uplifter
+uplifting
+uplifts
+upload
+uploaded
+uploading
+uploads
+upon
+upper
+uppermost
+uppers
+upright
+uprightly
+uprightness
+uprising
+uprising's
+uprisings
+uproar
+uproot
+uprooted
+uprooter
+uprooting
+uproots
+ups
+upset
+upsets
+upsetting
+upshot
+upshot's
+upshots
+upside
+upsides
+upstairs
+upstream
+upturn
+upturned
+upturning
+upturns
+upward
+upwardly
+upwardness
+upwards
+urban
+urchin
+urchin's
+urchins
+urge
+urged
+urgent
+urgently
+urger
+urges
+urging
+urgings
+urinate
+urinated
+urinates
+urinating
+urination
+urine
+urn
+urn's
+urning
+urns
+us
+usability
+usable
+usably
+usage
+usages
+use
+used
+useful
+usefully
+usefulness
+useless
+uselessly
+uselessness
+user
+user's
+users
+uses
+usher
+ushered
+ushering
+ushers
+using
+usual
+usually
+usualness
+usurp
+usurped
+usurper
+utensil
+utensil's
+utensils
+utilities
+utility
+utility's
+utmost
+utopian
+utopian's
+utopians
+utter
+utterance
+utterance's
+utterances
+uttered
+utterer
+uttering
+utterly
+uttermost
+utters
+uucp
+uucp's
+vacancies
+vacancy
+vacancy's
+vacant
+vacantly
+vacantness
+vacate
+vacated
+vacates
+vacating
+vacation
+vacationed
+vacationer
+vacationers
+vacationing
+vacations
+vacillate
+vacillated
+vacillates
+vacillating
+vacillatingly
+vacillation
+vacillations
+vacillator
+vacillator's
+vacillators
+vacuo
+vacuous
+vacuously
+vacuousness
+vacuum
+vacuumed
+vacuuming
+vacuums
+vagabond
+vagabond's
+vagabonds
+vagaries
+vagary
+vagary's
+vagina
+vagina's
+vaginas
+vagrant
+vagrantly
+vagrants
+vague
+vaguely
+vagueness
+vaguer
+vaguest
+vainly
+vale
+vale's
+valedictorian
+valedictorian's
+valence
+valence's
+valences
+valentine
+valentine's
+valentines
+vales
+valet
+valet's
+valets
+valiant
+valiantly
+valiantness
+valid
+validate
+validated
+validates
+validating
+validation
+validations
+validity
+validly
+validness
+valley
+valley's
+valleys
+valuable
+valuableness
+valuables
+valuably
+valuation
+valuation's
+valuations
+valuator
+valuators
+value
+valued
+valuer
+valuers
+values
+valuing
+valve
+valve's
+valved
+valves
+valving
+van
+van's
+vane
+vane's
+vaned
+vanes
+vanilla
+vanish
+vanished
+vanisher
+vanishes
+vanishing
+vanishingly
+vanities
+vanity
+vanquish
+vanquished
+vanquisher
+vanquishes
+vanquishing
+vans
+vantage
+vantages
+variability
+variable
+variable's
+variableness
+variables
+variably
+variance
+variance's
+variances
+variant
+variantly
+variants
+variation
+variation's
+variations
+varied
+variedly
+varier
+varies
+varieties
+variety
+variety's
+various
+variously
+variousness
+varnish
+varnish's
+varnished
+varnisher
+varnishers
+varnishes
+varnishing
+vary
+varying
+varyingly
+varyings
+vase
+vase's
+vases
+vassal
+vassals
+vast
+vaster
+vastest
+vastly
+vastness
+vat
+vat's
+vats
+vaudeville
+vault
+vaulted
+vaulter
+vaulting
+vaults
+vaunt
+vaunted
+vaunter
+veal
+vealer
+vealing
+vector
+vector's
+vectored
+vectoring
+vectors
+veer
+veered
+veering
+veeringly
+veers
+vegetable
+vegetable's
+vegetables
+vegetarian
+vegetarian's
+vegetarians
+vegetate
+vegetated
+vegetates
+vegetating
+vegetation
+vegetative
+vegetatively
+vegetativeness
+vehemence
+vehement
+vehemently
+vehicle
+vehicle's
+vehicles
+vehicular
+veil
+veiled
+veiling
+veils
+vein
+veined
+veiner
+veining
+veins
+velocities
+velocity
+velocity's
+velvet
+vend
+vender
+vending
+vendor
+vendor's
+vendors
+venerable
+venerableness
+vengeance
+venison
+venom
+venomous
+venomously
+venomousness
+vent
+vented
+venter
+ventilate
+ventilated
+ventilates
+ventilating
+ventilation
+ventilations
+ventilative
+venting
+ventral
+ventrally
+ventricle
+ventricle's
+ventricles
+vents
+venture
+ventured
+venturer
+venturers
+ventures
+venturing
+venturings
+veracity
+veranda
+veranda's
+verandaed
+verandas
+verb
+verb's
+verbal
+verbally
+verbose
+verbosely
+verboseness
+verbs
+verdict
+verdicts
+verdure
+verdured
+verge
+verger
+verges
+verier
+veriest
+verifiability
+verifiable
+verifiableness
+verification
+verifications
+verified
+verifier
+verifier's
+verifiers
+verifies
+verify
+verifying
+verily
+veritable
+veritableness
+vermin
+versa
+versatile
+versatilely
+versatileness
+versatility
+verse
+versed
+verser
+verses
+versing
+version
+versions
+versus
+vertebrate
+vertebrate's
+vertebrates
+vertebration
+vertex
+vertexes
+vertical
+vertically
+verticalness
+verticals
+vertices
+very
+vessel
+vessel's
+vessels
+vest
+vested
+vestige
+vestige's
+vestiges
+vestigial
+vestigially
+vesting
+vests
+veteran
+veteran's
+veterans
+veterinarian
+veterinarian's
+veterinarians
+veterinary
+veto
+vetoed
+vetoer
+vetoes
+vetoing
+vetting
+vex
+vexation
+vexed
+vexedly
+vexes
+vexing
+vi
+vi's
+via
+viability
+viable
+viably
+vial
+vial's
+vials
+vibrate
+vibrated
+vibrates
+vibrating
+vibration
+vibrations
+vice
+vice's
+viceroy
+vices
+vicing
+vicinities
+vicinity
+vicious
+viciously
+viciousness
+vicissitude
+vicissitude's
+vicissitudes
+victim
+victim's
+victims
+victor
+victor's
+victories
+victorious
+victoriously
+victoriousness
+victors
+victory
+victory's
+victual
+victuals
+video
+videos
+videotape
+videotape's
+videotaped
+videotapes
+videotaping
+vie
+vied
+vier
+vies
+view
+viewable
+viewed
+viewer
+viewers
+viewing
+viewings
+viewpoint
+viewpoint's
+viewpoints
+views
+vigilance
+vigilant
+vigilante
+vigilante's
+vigilantes
+vigilantly
+vignette
+vignette's
+vignetted
+vignetter
+vignettes
+vignetting
+vigorous
+vigorously
+vigorousness
+vii
+viii
+vile
+vilely
+vileness
+viler
+vilest
+vilification
+vilifications
+vilified
+vilifier
+vilifies
+vilify
+vilifying
+villa
+villa's
+village
+village's
+villager
+villagers
+villages
+villain
+villain's
+villainous
+villainously
+villainousness
+villains
+villainy
+villas
+vindictive
+vindictively
+vindictiveness
+vine
+vine's
+vinegar
+vinegars
+vines
+vineyard
+vineyard's
+vineyards
+vining
+vintage
+vintager
+vintages
+violate
+violated
+violates
+violating
+violation
+violations
+violative
+violator
+violator's
+violators
+violence
+violent
+violently
+violet
+violet's
+violets
+violin
+violin's
+violinist
+violinist's
+violinists
+violins
+viper
+viper's
+vipers
+viral
+virally
+virgin
+virgin's
+virginity
+virgins
+virtual
+virtually
+virtue
+virtue's
+virtues
+virtuoso
+virtuoso's
+virtuosos
+virtuous
+virtuously
+virtuousness
+virus
+virus's
+viruses
+vis
+visa
+visaed
+visage
+visaged
+visaing
+visas
+viscosities
+viscosity
+viscount
+viscount's
+viscounts
+viscous
+viscously
+viscousness
+visibilities
+visibility
+visible
+visibleness
+visibly
+vision
+vision's
+visionariness
+visionary
+visioned
+visioning
+visions
+visit
+visitation
+visitation's
+visitations
+visited
+visiting
+visitor
+visitor's
+visitors
+visits
+visor
+visor's
+visored
+visors
+vista
+vista's
+vistaed
+vistas
+visual
+visually
+visuals
+vita
+vitae
+vital
+vitality
+vitally
+vitals
+vitamin
+vitamin's
+vitamins
+vivid
+vividly
+vividness
+vizier
+vocabularies
+vocabulary
+vocal
+vocally
+vocals
+vocation
+vocation's
+vocational
+vocationally
+vocations
+vogue
+voice
+voiced
+voicer
+voicers
+voices
+voicing
+void
+voided
+voider
+voiding
+voidness
+voids
+volatile
+volatileness
+volatiles
+volatilities
+volatility
+volcanic
+volcano
+volcano's
+volcanos
+volley
+volleyball
+volleyball's
+volleyballs
+volleyed
+volleyer
+volleying
+volleys
+volt
+voltage
+voltages
+volts
+volume
+volume's
+volumed
+volumes
+voluming
+voluntarily
+voluntariness
+voluntary
+volunteer
+volunteered
+volunteering
+volunteers
+vomit
+vomited
+vomiter
+vomiting
+vomits
+vortex
+vortexes
+vote
+voted
+voter
+voters
+votes
+voting
+votive
+votively
+votiveness
+vouch
+voucher
+vouchers
+vouches
+vouching
+vow
+vowed
+vowel
+vowel's
+vowels
+vower
+vowing
+vows
+voyage
+voyaged
+voyager
+voyagers
+voyages
+voyaging
+voyagings
+vulgar
+vulgarly
+vulnerabilities
+vulnerability
+vulnerable
+vulnerableness
+vulture
+vulture's
+vultures
+wade
+waded
+wader
+waders
+wades
+wading
+wafer
+wafer's
+wafered
+wafering
+wafers
+waffle
+waffle's
+waffled
+waffles
+waffling
+waft
+wafter
+wag
+wage
+waged
+wager
+wagered
+wagerer
+wagering
+wagers
+wages
+waging
+wagon
+wagon's
+wagons
+wags
+wail
+wailed
+wailer
+wailing
+wails
+waist
+waist's
+waistcoat
+waistcoat's
+waistcoated
+waistcoats
+waisted
+waister
+waists
+wait
+waited
+waiter
+waiter's
+waiters
+waiting
+waitress
+waitress's
+waitresses
+waits
+waive
+waived
+waiver
+waiverable
+waivers
+waives
+waiving
+wake
+waked
+waken
+wakened
+wakener
+wakening
+waker
+wakes
+waking
+walk
+walked
+walker
+walkers
+walking
+walks
+walkway
+walkway's
+walkways
+wall
+wall's
+walled
+waller
+wallet
+wallet's
+wallets
+walling
+wallow
+wallowed
+wallower
+wallowing
+wallows
+walls
+walnut
+walnut's
+walnuts
+walrus
+walrus's
+walruses
+waltz
+waltzed
+waltzer
+waltzes
+waltzing
+wan
+wand
+wander
+wandered
+wanderer
+wanderers
+wandering
+wanderings
+wanders
+wane
+waned
+wanes
+waning
+wanly
+wanness
+want
+wanted
+wanter
+wanting
+wanton
+wantoner
+wantonly
+wantonness
+wants
+war
+war's
+warble
+warbled
+warbler
+warbles
+warbling
+ward
+warded
+warden
+wardens
+warder
+warding
+wardrobe
+wardrobe's
+wardrobes
+wards
+ware
+warehouse
+warehoused
+warehouser
+warehouses
+warehousing
+wares
+warfare
+warier
+wariest
+warily
+wariness
+waring
+warlike
+warm
+warmed
+warmer
+warmers
+warmest
+warming
+warmly
+warmness
+warms
+warmth
+warn
+warned
+warner
+warning
+warningly
+warnings
+warns
+warp
+warp's
+warped
+warper
+warping
+warps
+warrant
+warranted
+warranter
+warranties
+warranting
+warrants
+warranty
+warranty's
+warred
+warring
+warrior
+warrior's
+warriors
+wars
+warship
+warship's
+warships
+wart
+wart's
+warted
+warts
+wary
+was
+wash
+washed
+washer
+washers
+washes
+washing
+washings
+wasn't
+wasp
+wasp's
+wasps
+waste
+wasted
+wasteful
+wastefully
+wastefulness
+waster
+wastes
+wasting
+wastingly
+watch
+watched
+watcher
+watchers
+watches
+watchful
+watchfully
+watchfulness
+watching
+watchings
+watchman
+watchword
+watchword's
+watchwords
+water
+watered
+waterer
+waterfall
+waterfall's
+waterfalls
+wateriness
+watering
+waterings
+waterproof
+waterproofed
+waterproofer
+waterproofing
+waterproofness
+waterproofs
+waters
+waterway
+waterway's
+waterways
+watery
+wave
+waved
+waveform
+waveform's
+waveforms
+wavefront
+wavefront's
+wavefronts
+wavelength
+wavelengths
+waver
+wavered
+waverer
+wavering
+waveringly
+wavers
+waves
+waving
+wax
+waxed
+waxen
+waxer
+waxers
+waxes
+waxier
+waxiness
+waxing
+waxy
+way
+way's
+ways
+wayside
+waysides
+wayward
+waywardly
+waywardness
+we
+we'd
+we'll
+we're
+we've
+weak
+weaken
+weakened
+weakener
+weakening
+weakens
+weaker
+weakest
+weakliness
+weakly
+weakness
+weakness's
+weaknesses
+wealth
+wealthier
+wealthiest
+wealthiness
+wealths
+wealthy
+wean
+weaned
+weaner
+weaning
+weapon
+weapon's
+weaponed
+weapons
+wear
+wearable
+wearer
+wearied
+wearier
+wearies
+weariest
+wearily
+weariness
+wearing
+wearingly
+wearisome
+wearisomely
+wearisomeness
+wears
+weary
+wearying
+weasel
+weasel's
+weasels
+weather
+weathercock
+weathercock's
+weathercocks
+weathered
+weatherer
+weathering
+weatherly
+weathers
+weave
+weaver
+weavers
+weaves
+weaving
+web
+web's
+weber
+webs
+wed
+wedded
+wedding
+wedding's
+weddings
+wedge
+wedged
+wedges
+wedging
+weds
+wee
+weed
+weeded
+weeder
+weeding
+weeds
+week
+week's
+weekday
+weekday's
+weekdays
+weekend
+weekend's
+weekender
+weekends
+weeklies
+weekly
+weeks
+weep
+weeped
+weeper
+weepers
+weeping
+weeps
+weigh
+weighed
+weigher
+weighing
+weighings
+weighs
+weight
+weighted
+weighter
+weighting
+weightings
+weights
+weird
+weirdly
+weirdness
+welcome
+welcomed
+welcomely
+welcomeness
+welcomer
+welcomes
+welcoming
+weld
+welded
+welder
+welders
+welding
+weldings
+welds
+welfare
+well
+welled
+welling
+wellness
+wells
+wench
+wench's
+wencher
+wenches
+went
+wept
+were
+weren't
+west
+wester
+westered
+westering
+westerlies
+westerly
+western
+westerner
+westerners
+westing
+westward
+westwards
+wet
+wetly
+wetness
+wets
+wetted
+wetter
+wettest
+wetting
+whack
+whacked
+whacker
+whacking
+whacks
+whale
+whaler
+whales
+whaling
+whammies
+whammy
+wharf
+wharfs
+wharves
+what
+what's
+whatchamacallit
+whatchamacallit's
+whatchamacallits
+whatever
+whatsoever
+wheat
+wheaten
+wheel
+wheeled
+wheeler
+wheelers
+wheeling
+wheelings
+wheels
+whelp
+when
+whence
+whenever
+whens
+where
+where's
+whereabouts
+whereas
+whereby
+wherein
+whereupon
+wherever
+whether
+whew
+whey
+which
+whichever
+while
+whiled
+whiles
+whiling
+whim
+whim's
+whimper
+whimpered
+whimpering
+whimpers
+whims
+whimsical
+whimsically
+whimsicalness
+whimsied
+whimsies
+whimsy
+whimsy's
+whine
+whined
+whiner
+whines
+whining
+whiningly
+whip
+whip's
+whipped
+whipper
+whipper's
+whippers
+whipping
+whipping's
+whippings
+whips
+whirl
+whirled
+whirler
+whirling
+whirlpool
+whirlpool's
+whirlpools
+whirls
+whirlwind
+whirr
+whirring
+whisk
+whisked
+whisker
+whiskered
+whiskers
+whiskey
+whiskey's
+whiskeys
+whisking
+whisks
+whisper
+whispered
+whisperer
+whispering
+whisperingly
+whisperings
+whispers
+whistle
+whistled
+whistler
+whistlers
+whistles
+whistling
+whit
+white
+whited
+whitely
+whiten
+whitened
+whitener
+whiteners
+whiteness
+whitening
+whitens
+whiter
+whites
+whitespace
+whitest
+whitewash
+whitewashed
+whitewasher
+whitewashing
+whiting
+whittle
+whittled
+whittler
+whittles
+whittling
+whittlings
+whiz
+whizzed
+whizzes
+whizzing
+who
+who's
+whoever
+whole
+wholehearted
+wholeheartedly
+wholeness
+wholes
+wholesale
+wholesaled
+wholesaler
+wholesalers
+wholesales
+wholesaling
+wholesome
+wholesomely
+wholesomeness
+wholly
+whom
+whomever
+whoop
+whooped
+whooper
+whooping
+whoops
+whore
+whore's
+whores
+whoring
+whorl
+whorl's
+whorled
+whorls
+whose
+why
+wick
+wicked
+wickedly
+wickedness
+wicker
+wicking
+wicks
+wide
+widely
+widen
+widened
+widener
+wideness
+widening
+widens
+wider
+widespread
+widest
+widget
+widget's
+widgets
+widow
+widowed
+widower
+widowers
+widows
+width
+widths
+wield
+wielded
+wielder
+wielding
+wields
+wife
+wife's
+wifeliness
+wifely
+wig
+wig's
+wigs
+wigwam
+wild
+wildcat
+wildcat's
+wildcats
+wilder
+wilderness
+wildest
+wilding
+wildly
+wildness
+wile
+wiled
+wiles
+wilier
+wiliness
+wiling
+will
+willed
+willer
+willful
+willfully
+willfulness
+willing
+willingly
+willingness
+willings
+willow
+willow's
+willower
+willows
+wills
+wilt
+wilted
+wilting
+wilts
+wily
+win
+wince
+winced
+winces
+wincing
+wind
+winded
+winder
+winders
+windier
+windiness
+winding
+windmill
+windmill's
+windmilling
+windmills
+window
+window's
+windowed
+windowing
+windows
+winds
+windy
+wine
+wined
+winer
+winers
+wines
+wing
+winged
+winger
+wingers
+winging
+wings
+wining
+wink
+winked
+winker
+winking
+winks
+winner
+winner's
+winners
+winning
+winningly
+winnings
+wins
+winter
+wintered
+winterer
+wintering
+winterly
+winters
+wintrier
+wintriness
+wintry
+wipe
+wiped
+wiper
+wipers
+wipes
+wiping
+wire
+wired
+wireless
+wirer
+wires
+wiretap
+wiretap's
+wiretaps
+wirier
+wiriness
+wiring
+wirings
+wiry
+wisdom
+wisdoms
+wise
+wised
+wisely
+wiseness
+wiser
+wises
+wisest
+wish
+wished
+wisher
+wishers
+wishes
+wishful
+wishfully
+wishfulness
+wishing
+wising
+wisp
+wisp's
+wisps
+wistful
+wistfully
+wistfulness
+wit
+wit's
+witch
+witchcraft
+witches
+witching
+with
+withal
+withdraw
+withdrawal
+withdrawal's
+withdrawals
+withdrawer
+withdrawing
+withdrawn
+withdrawnness
+withdraws
+withdrew
+wither
+withered
+withering
+witheringly
+withers
+withheld
+withhold
+withholder
+withholders
+withholding
+withholdings
+withholds
+within
+without
+withstand
+withstanding
+withstands
+withstood
+witness
+witnessed
+witnesses
+witnessing
+wits
+wittier
+wittiest
+wittiness
+witty
+wives
+wizard
+wizard's
+wizardly
+wizards
+woe
+woeful
+woefully
+woeness
+woke
+wolf
+wolfer
+wolves
+woman
+woman's
+womanhood
+womanliness
+womanly
+womb
+womb's
+wombed
+wombs
+women
+women's
+womens
+won't
+wonder
+wondered
+wonderer
+wonderful
+wonderfully
+wonderfulness
+wondering
+wonderingly
+wonderland
+wonderland's
+wonderment
+wonders
+wondrous
+wondrously
+wondrousness
+wont
+wonted
+wontedly
+wontedness
+wonting
+woo
+wood
+wood's
+woodchuck
+woodchuck's
+woodchucks
+woodcock
+woodcock's
+woodcocks
+wooded
+wooden
+woodenly
+woodenness
+woodier
+woodiness
+wooding
+woodland
+woodlander
+woodman
+woodpecker
+woodpecker's
+woodpeckers
+woods
+woodser
+woodwork
+woodworker
+woodworking
+woody
+wooed
+wooer
+woof
+woofed
+woofer
+woofers
+woofing
+woofs
+wooing
+wool
+wooled
+woolen
+woolens
+woollier
+woollies
+woolliness
+woolly
+wools
+wooly
+woos
+word
+word's
+worded
+wordier
+wordily
+wordiness
+wording
+wordings
+words
+wordy
+wore
+work
+workable
+workableness
+workably
+workaround
+workaround's
+workarounds
+workbench
+workbench's
+workbenches
+workbook
+workbook's
+workbooks
+worked
+worker
+worker's
+workers
+workhorse
+workhorse's
+workhorses
+working
+workingman
+workings
+workload
+workloads
+workman
+workmanly
+workmanship
+workmen
+workmen's
+works
+workshop
+workshop's
+workshops
+workstation
+workstation's
+workstations
+world
+world's
+worlders
+worldliness
+worldly
+worlds
+worldwide
+worm
+wormed
+wormer
+worming
+worms
+worn
+worried
+worriedly
+worrier
+worriers
+worries
+worrisome
+worrisomely
+worrisomeness
+worry
+worrying
+worryingly
+worse
+worser
+worship
+worshipful
+worshipfully
+worshipfulness
+worships
+worst
+worsted
+worth
+worthier
+worthies
+worthiest
+worthiness
+worthing
+worthless
+worthlessly
+worthlessness
+worths
+worthwhile
+worthwhileness
+worthy
+would
+wouldest
+wouldn't
+wound
+wounded
+wounding
+wounds
+wove
+woven
+wrangle
+wrangled
+wrangler
+wranglers
+wrangles
+wrangling
+wrap
+wrap's
+wrapped
+wrapper
+wrapper's
+wrappers
+wrapping
+wrappings
+wraps
+wrath
+wreak
+wreaks
+wreath
+wreathed
+wreathes
+wreathing
+wreck
+wreckage
+wrecked
+wrecker
+wreckers
+wrecking
+wrecks
+wren
+wren's
+wrench
+wrenched
+wrenches
+wrenching
+wrenchingly
+wrens
+wrest
+wrested
+wrester
+wresting
+wrestle
+wrestled
+wrestler
+wrestles
+wrestling
+wrestlings
+wrests
+wretch
+wretched
+wretchedly
+wretchedness
+wretches
+wriggle
+wriggled
+wriggler
+wriggles
+wriggling
+wring
+wringer
+wringing
+wrings
+wrinkle
+wrinkled
+wrinkles
+wrinkling
+wrist
+wrist's
+wrists
+wristwatch
+wristwatch's
+wristwatches
+writ
+writ's
+writable
+write
+writer
+writer's
+writers
+writes
+writhe
+writhed
+writhes
+writhing
+writing
+writings
+writs
+written
+wrong
+wronged
+wronger
+wrongest
+wronging
+wrongly
+wrongness
+wrongs
+wrote
+wrought
+wrung
+xi
+xii
+xiii
+xiv
+xix
+xv
+xvi
+xvii
+xviii
+xx
+yacc
+yacc's
+yank
+yanked
+yanking
+yanks
+yard
+yard's
+yarded
+yarding
+yards
+yardstick
+yardstick's
+yardsticks
+yarn
+yarn's
+yarned
+yarning
+yarns
+yawn
+yawner
+yawning
+yawningly
+yawns
+yea
+yeah
+year
+year's
+yearly
+yearn
+yearned
+yearner
+yearning
+yearningly
+yearnings
+yearns
+years
+yeas
+yeast
+yeast's
+yeasts
+yecch
+yell
+yelled
+yeller
+yelling
+yellow
+yellowed
+yellower
+yellowest
+yellowing
+yellowish
+yellowness
+yellows
+yells
+yelp
+yelped
+yelper
+yelping
+yelps
+yeoman
+yeomanly
+yeomen
+yes
+yeses
+yesterday
+yesterday's
+yesterdays
+yet
+yield
+yielded
+yielder
+yielding
+yields
+yoke
+yoke's
+yokes
+yoking
+yon
+yonder
+you
+you'd
+you'll
+you're
+you've
+young
+younger
+youngest
+youngly
+youngness
+youngster
+youngster's
+youngsters
+your
+your's
+yours
+yourself
+yourselves
+youth
+youth's
+youthes
+youthful
+youthfully
+youthfulness
+yuck
+yummier
+yummy
+yuppie
+yuppie's
+yuppies
+zap
+zapped
+zapping
+zaps
+zeal
+zealous
+zealously
+zealousness
+zebra
+zebra's
+zebras
+zenith
+zero
+zeroed
+zeroes
+zeroing
+zeros
+zeroth
+zest
+zigzag
+zinc
+zinc's
+zodiac
+zodiacs
+zonal
+zonally
+zone
+zoned
+zonely
+zoner
+zones
+zoning
+zoo
+zoo's
+zoological
+zoologically
+zoom
+zoomed
+zooming
+zooms
+zoos
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.1 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.1
new file mode 100644
index 00000000000..658faad3d19
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.1
@@ -0,0 +1,20864 @@
+AI
+ALU
+AMA
+ANSI's
+ARCO
+ARPA
+Aaron
+Abe
+Abe's
+Abigail
+Abigail's
+Abilene
+Abilene's
+Abner
+Abner's
+Abraham
+Abrams
+Abramson
+Acapulco
+Ackerman
+Acta
+Adam
+Adams
+Adamson
+Addison
+Addressograph
+Adirondack
+Adirondacks
+Adonis
+Adriatic
+Aegean
+Aeneid
+Afghani
+Afghani's
+Afghanis
+Afrikaans
+Agatha
+Aggie
+Aggies
+Agnes
+Aires
+Ajax
+Akron
+Al
+Al's
+Alabamans
+Alameda
+Alamo
+Alamos
+Alan
+Alan's
+Albany
+Albert
+Alberta
+Alberto
+Albuquerque
+Alcoa
+Alec
+Aleck
+Aler
+Aleut
+Alex
+Alexander
+Alexanders
+Alexandra
+Alexandre
+Alexandria
+Alfa
+Algiers
+Alhambra
+Alice
+Alicia
+Alistair
+Allan
+Alleghenies
+Allegheny
+Allen
+Allendale
+Allentown
+Allison
+Allstate
+Alsatian
+Alsatians
+Alvarez
+Alvin
+Amadeus
+Amarillo
+Amarillo's
+Americanism
+Amherst
+Amherst's
+Amoco
+Amoco's
+Amos
+Ampex
+Ampex's
+Amy
+Amy's
+Anaheim
+Anaheim's
+Andean
+Andean's
+Andersen
+Andersen's
+Anderson
+Anderson's
+Andes
+Andover
+Andover's
+Andre
+Andre's
+Andrew
+Andrew's
+Andromeda
+Andy
+Andy's
+Angela
+Angeles
+Angelina
+Angeline
+Angelo
+Angie
+Anglia
+Anglo
+Angus
+Anheuser
+Anita
+Ankara
+Ann
+Anna
+Annapolis
+Anne
+Anne's
+Annie
+Anson
+Antares
+Anthony
+Antietam
+Antioch
+Antoine
+Antoinette
+Antony
+Apollinaire
+Appaloosas
+Appian
+Appleton
+Appomattox
+Aquinas
+Araby
+Arcadia
+Archibald
+Archimedes
+Arcturus
+Argonne
+Argus
+Ariadne
+Aristotelean
+Arkansan
+Arlene
+Arlington
+Armonk
+Arnold
+Arnold's
+Arpanet
+Arthur
+Aruba
+Asheville
+Ashland
+Ashley
+Assad
+Assyria
+Astaire
+Astaires
+Astor
+Astoria
+Atari
+Atkins
+Atkinson
+Atlanta
+Atlantis
+Atreus
+Attica
+Augean
+Augustan
+Augustine
+Augustus
+Aurelius
+Auschwitz
+Australis
+Aventine
+Aventino
+Avis
+Aviv
+Avogadro
+Avon
+Aztec
+Aztecan
+BCD
+BS
+BTW
+Babcock
+Babylon
+Babylonian
+Babylonians
+Bacchus
+Baghdad
+Bahama
+Bahamas
+Bailey
+Baileys
+Bakelite
+Bakersfield
+Baldwin
+Bali
+Balinese
+Ballard
+Ballards
+Baltimore
+Balzac
+Bamberger
+Bambi
+Bancroft
+Bangor
+Baptiste
+Barbara
+Barcelona
+Barclay
+Barnabas
+Barnard
+Barney
+Barron
+Barry
+Barry's
+Barrymore
+Barrymores
+Barstow
+Barth
+Bartholomew
+Bartlett
+Bartok
+Bascom
+Basie
+Bassett
+Batavia
+Batista
+Baudelaire
+Bauer
+Bauhaus
+Bavaria
+Bavarian
+Bayesian
+Baylor
+Bayonne
+Beatrice
+Beauchamps
+Beaujolais
+Beaumont
+Beauregard
+Beaverton
+Bechtel
+Becky
+Bedford
+Beelzebub
+Beelzebub's
+Beirut
+Belfast
+Belgrade
+Bella
+Bellatrix
+Belleville
+Bellwood
+Belmont
+Beloit
+Belton
+Beltsville
+Ben
+Ben's
+Bendix
+Benjamin
+Bennett
+Bennington
+Benny
+Benson
+Bentham
+Bentley
+Bentleys
+Benz
+Beowulf
+Bergson
+Beringer
+Berkowitz
+Berkshire
+Berkshires
+Berlioz
+Berlitz
+Bern
+Bernadine
+Bernard
+Bernardine
+Bernice
+Bernie
+Bernoulli
+Bernstein
+Berra
+Bert
+Bertha
+Bertrand
+Bess
+Bessemer
+Bessie
+Betelgeuse
+Bethesda
+Bethlehem
+Betsy
+Betties
+Betty
+Bhutan
+Biddle
+Bienville
+Bierce
+Bigelow
+Billie
+Bimini
+Bingham
+Binghamton
+Biscayne
+Bismarck
+Blackburn
+Blackfeet
+Blackman
+Blackmer
+Blackstone
+Blackwell
+Blackwells
+Blair
+Blake
+Blakey
+Blanche
+Blanton
+Blatz
+Bloomfield
+Bloomington
+Blvd
+Bobbie
+Bobbsey
+Bobrow
+Bodenheim
+Boeing
+Boer
+Bogart
+Bogartian
+Bogota
+Boheme
+Bohemia
+Bohemian
+Bohr
+Boise
+Bolshevist
+Bolshevistic
+Bolshoi
+Bolton
+Boltzmann
+Bombay
+Bombay's
+Bonaparte
+Bonaventure
+Bonham
+Boniface
+Bonn
+Bonneville
+Bonnie
+Bontempo
+Boone
+Bootle
+Bordeaux
+Borden
+Borealis
+Boreas
+Borg
+Borroughs
+Bose
+Bostitch
+Boswell
+Bouvier
+Bowes
+Boyce
+Bradbury
+Bradford
+Bradley
+Bradshaw
+Brady
+Brahms
+Brainard
+Brainards
+Branchville
+Brandeis
+Brandel
+Brandenburg
+Brandon
+Braniff
+Brannon
+Brasilia
+Braun
+Brenda
+Brian
+Bridewell
+Bridgeport
+Bridgetown
+Bridgewater
+Brien
+Brigadoon
+Brigham
+Brinkley
+Britannic
+Britannica
+Brittany
+Britten
+Britten's
+Broadway
+Brock
+Bronx
+Brookdale
+Brooke
+Brookfield
+Brookhaven
+Brooklyn
+Brookmont
+Browne
+Brownell
+Brownian
+Bruce
+Brunhilde
+Bruno
+Brussels
+Bruxelles
+Bryan
+Bryant
+Bryce
+Bryn
+Buchanan
+Bucharest
+Buchwald
+Bucky
+Budapest
+Budd
+Buddha
+Buddhism
+Buddhist
+Buddhists
+Budweiser
+Budweisers
+Bugatti
+Buick
+Bulba
+Bulgaria
+Bulgarian
+Bumbry
+Bundestag
+Bundy
+Bunsen
+Bunsen's
+Bunsens
+Bunyan
+Bunyan's
+Burbank
+Burbank's
+Burch
+Burgundian
+Burgundies
+Burgundy
+Burlingame
+Burma
+Burmese
+Burne
+Burnes
+Burnett
+Burnside
+Burnsides
+Burroughs
+Burt
+Burton
+Burundi
+Busch
+Bushnell
+Butterfield
+Byrne
+Byron
+Byron's
+Byronic
+Byronism
+Byzantine
+Byzantium
+CACM
+CDT
+CIA
+CPA
+CPR
+CRT
+CST
+Cadillac
+Cadillacs
+Caesar
+Cain
+Caine
+Cairo
+Cal
+CalComp
+Calcutta
+Calcutta's
+Calder
+Calgary
+Calif
+Caligula
+Callisto
+Caltech
+Calumet
+Calvinist
+Cambodia
+Camelot
+Camille
+Camino
+Campbellsport
+Canadian
+Canadians
+Canaveral
+Canberra
+Candide
+Candlewick
+Canis
+Canoga
+Canterbury
+Cantonese
+Canute
+Capet
+Capetown
+Capistrano
+Capitan
+Cappy
+Capricorn
+Capt
+Caracas
+Carbondale
+Carbones
+Caribbean
+Carl
+Carl's
+Carla
+Carleton
+Carletonian
+Carlos
+Carlsbad
+Carlson
+Carlton
+Carlyle
+Carmichael
+Carnegie
+Caroline
+Caroline's
+Carolinian
+Carolinians
+Carolyn
+Carrie
+Carson
+Carthage
+Carty
+Caruso
+Casey
+Cassandra
+Cassiopeia
+Cassite
+Cassius
+Castro
+Catalina
+Catawba
+Catherine
+Cathy
+Catskill
+Catskills
+Caucasian
+Caucasians
+Caucasus
+Cauchy
+Cavendish
+Cecil
+Cecilia
+Celanese
+Celsius
+Celtic
+Cenozoic
+Centralia
+Cerberus
+Cervantes
+Cessna
+Cetus
+Ceylon
+Cezanne
+Cezannes
+Chablis
+Chad
+Chaffey
+Chalmers
+Champlain
+Chancellorsville
+Chandy
+Chandy's
+Chang
+Channing
+Chantilly
+Chaplin
+Chapman
+Charles
+Charleston
+Charley
+Charlie
+Charlotte
+Charlottesville
+Charybdis
+Chattahoochee
+Chattanooga
+Chaucer
+Chautauqua
+Chekhov
+Chen
+Cheng
+Cheriton
+Cheriton's
+Cherokee
+Cherokees
+Cheryl's
+Chesapeake
+Cheshire
+Chesterfield
+Chesterton
+Chevrolet
+Chevy
+Cheyenne
+Cheyennes
+Chicago
+Chicago's
+Chicagoan
+Chicagoans
+Chicana
+Chicana's
+Chicanas
+Chicano
+Chicano's
+Chicanos
+Chickasaws
+Chile
+Chiles
+Chimiques
+Chinaman
+Chinamen
+Ching
+Chinook
+Chippendale
+Chippewa
+Chisholm
+Choctaw
+Choctaws
+Chomsky
+Chomsky's
+Chopin
+Chris
+Christ
+Christendom
+Christenson
+Christianity
+Christie
+Christine
+Christlike
+Christopher
+Christopher's
+Christy
+Chrysler
+Churchill
+Churchillian
+Cicero
+Ciceronian
+Cincinnati
+Cinderella
+Cinerama
+Circe
+Citroen
+Claire
+Clara
+Clare
+Claremont
+Clarence
+Clark
+Clarke
+Clarridge
+Claude
+Claudia
+Claudio
+Claus
+Clausen
+Clearwater
+Clemens
+Clemente
+Clemson
+Cleveland
+Clifford
+Clint
+Clinton
+Clinton's
+Clio
+Clive
+Clyde
+Clytemnestra
+Coates
+Cochise
+Coffman
+Cohen
+Cohn
+Colby
+Coleridge
+Colgate
+Colombia
+Colombian
+Colombians
+Colosseum
+Columbia
+Columbian
+Columbus
+Comanche
+Commie
+Compuserve
+Compuserve's
+Concorde
+Concordia
+Conestoga
+Confucian
+Confucianism
+Confucius
+Congo
+Connecticut
+Connelly
+Connie
+Conrad
+Conrad's
+Conrail
+Conrail's
+Constantinople
+Coolidge
+Coors
+Copeland
+Copenhagen
+Copernicus
+Copperfield
+Corinthian
+Corinthians
+Cornell
+Cornell's
+Cornish
+Cornwall
+Cornwallis
+Corp
+Corsica
+Corsican
+Cortland
+Costello
+Covent
+Coventry
+Craig
+Cramer
+Crandall
+Cranford
+Cranston
+Crawford
+Cree
+Creighton
+Creole
+Creon
+Crestview
+Cretaceous
+Cretaceously
+Cretan
+Crete
+Crimea
+Crimean
+Croatian
+Crockett
+Croix
+Cromwell
+Cromwellian
+Crosby
+Crowley
+Crusoe
+Cuba
+Cuban
+Cubans
+Culver
+Culvers
+Cumberland
+Cunard
+Cunningham
+Cupid
+Cushman
+Cyanamid
+Cygnus
+Cynthia
+Cyprian
+Cypriot
+Cyprus
+Cyril
+Cyrus
+Czech
+Czechoslovakia
+DAG
+DB
+DECsystem
+DECtape
+DNA
+Dacron
+Dadaism
+Dadaist
+Dade
+Daedalus
+Daimler
+Dakar
+Dakota
+Dali
+Dallas
+Dalton
+Daly
+Damascus
+Danbury
+Dane
+Danes
+Daniel
+Daniels
+Danielson
+Danish
+Danny
+Danny's
+Dante
+Danube
+Danville
+Danzig
+Daphne
+Darlene
+Darlington
+Darrell
+Darrow
+Dartmouth
+Darwin
+Darwinian
+Darwinism
+Datamedia
+Datsun
+Dave
+Dave's
+David
+David's
+Davidson
+Davie
+Davies
+Davinich
+Davis
+Davy
+Dawson
+Dayton
+DeKalb
+Dearborn
+Debby
+Deborah
+Debra
+Debussy
+Dec
+Decca
+Deere
+Defoe
+Delhi
+Delhi's
+Delilah
+Dellwood
+Delphi
+Delphic
+Dempsey
+Deneen
+Dennis
+Denny
+Denver
+Dependant
+Dependants
+Dept
+Derbyshire
+Descartes
+Desmond
+Deutsch
+Devon
+Devonshire
+Dewey
+Dewitt
+Dexedrine
+DiMaggio
+Diana
+Diane
+Dianne
+Dick's
+Dickinson
+Dickson
+Diego
+Dietrich
+Dijon
+Dillon
+Dinah
+Diogenes
+Dion
+Dionysian
+Dionysus
+Dirac
+Disney
+Disneyland
+Disraeli
+Dixie
+Dixiecrats
+Dixieland
+Djakarta
+Dmitri
+Doberman
+Doc
+Dodington
+Dogtown
+Dolores
+Domesday
+Domingo
+Dominic
+Dominican
+Dominicans
+Donahue
+Donald
+Donald's
+Donaldson
+Donna
+Donnelly
+Donovan
+Doolittle
+Doppler
+Dora
+Dora's
+Dorado
+Dorchester
+Doris
+Dorothy
+Dostoevsky
+Doubleday
+Doug
+Dougherty
+Douglas
+Douglass
+Dow
+Downey
+Doyle
+Dr
+Dramamine
+Drexel
+Dreyfuss
+Drury
+Dryden
+DuPont
+DuPonts
+Duane
+Dublin
+Dubuque
+Duffy
+Dulles
+Duluth
+Dumas
+Dumont
+Dumpty
+Duncan
+Dunham
+Dunkirk
+Dunlap
+Dunne
+Dupont
+Duponts
+Durham
+Durkee
+Dusenberg
+Dusseldorf
+Dustin
+Dutch
+Dutchman
+Dutchmen
+Dvorak
+Dwight
+Dyke
+EBCDIC
+EEG
+EPA
+Earp
+Easthampton
+Eastland
+Eastman
+Eastwick
+Eastwood
+Econometrica
+Ecuador
+Eddie
+Edgar
+Edgerton
+Edgewater
+Edgewood
+Edinburgh
+Edison
+Edith
+Edmund
+Edna
+Eduard
+Edward
+Edwardian
+Edwards
+Edwin
+Edwina
+Egerton
+Egypt
+Egyptian
+Egyptians
+Eichmann
+Eileen
+Einstein
+Einsteinian
+Eisenhower
+Ekberg
+Ektachrome
+Elaine
+Elba
+Eleanor
+Electra
+Eli
+Elijah
+Eliot
+Elisabeth
+Elise
+Elise's
+Elizabeth
+Elizabethan
+Elizabethans
+Elkhart
+Ella
+Ellie
+Elliot
+Elliott
+Ellis
+Ellison
+Ellsworth
+Elmhurst
+Elmira
+Elmsford
+Eloise
+Elroy
+Elsie
+Elsinore
+Elysees
+Elysium
+Emanuel
+Emerson
+Emily
+Emma
+Emmanuel
+Emory
+Endicott
+Englewood
+Englishman
+Englishmen
+Enoch
+Enos
+Enrico
+Ensolite
+Eocene
+Ephesian
+Ephesians
+Ephraim
+Epicurus
+Episcopalian
+Epsom
+Epstein
+Erasmus
+Eratosthenes
+Eric
+Erich
+Erickson
+Ericsson
+Erie
+Erik
+Erik's
+Erikson
+Ernest
+Ernestine
+Ernie
+Ernst
+Eros
+Errol
+Ervin
+Erwin
+Eskimo
+Eskimos
+Esp
+Espagnol
+Essex
+Esther
+Ethan
+Ethel
+Ethiopia
+Ethiopians
+Etruscan
+Eucharist
+Euclid
+Euclidean
+Eugene
+Eugenia
+Euler
+Eulerian
+Eunice
+Euphrates
+Eurasia
+Eurasian
+Euripides
+Europa
+Eurydice
+Eva
+Evangeline
+Evans
+Evanston
+Evansville
+Evelyn
+Eveready
+Everett
+Everglades
+Ewen
+Exeter
+Exxon
+Ezekiel
+Ezra
+FAQ's
+FAQs
+FBI
+FCC
+FDA
+FTP
+Fagin
+Fahrenheit
+Fahrenheits
+Fairchild
+Fairfax
+Fairfield
+Fairmont
+Fairport
+Fairview
+Falk
+Falstaff
+Fannies
+Fanny
+Faraday
+Farber
+Fargo
+Farley
+Farmington
+Farrell
+Fatima
+Faulkner
+Faulknerian
+Fauntleroy
+Faust
+Faustian
+Faustus
+Fawkes
+Fayetteville
+Featherman
+Feb
+Feldman
+Felice
+Felicia
+Felix
+Fellini
+Fenwick
+Ferdinand
+Ferdinando
+Fermi
+Fernando
+Fess
+Fiberglas
+Fibonacci
+Fidel
+Figaro
+Filipino
+Filipinos
+Filippo
+Fillmore
+Finland
+Finn
+Finnegan
+Finnish
+Finns
+Fiorello
+Fiori
+Firestone
+Fischer
+Fishkill
+Fisk
+Fitch
+Fitchburg
+Fitzgerald
+Fitzpatrick
+Fitzroy
+Flanagan
+Flanders
+Fledermaus
+Fleischman
+Fleisher
+Fleming
+Flemings
+Flemish
+Flemished
+Flemishes
+Flemishing
+Florence
+Florentine
+Floridian
+Floridians
+Floyd
+Flynn
+Folsom
+Fontainebleau
+Fontana
+Foote
+Forbes
+Fordham
+Formica
+Formosa
+Formosan
+Foxhall
+Fran
+Fran's
+Francaise
+Francesca
+Francesco
+Francie
+Francis
+Franciscan
+Franciscans
+Francisco
+Franco
+Francois
+Frankford
+Frankfort
+Frankfurt
+Frankie
+Franny
+Franz
+Frau
+Frayne
+Frazier
+Fred
+Freddie
+Freddy
+Freddy's
+Frederic
+Frederick
+Fredericks
+Frederico
+Fredrick
+Fredrickson
+Freeport
+Freida
+Frenchman
+Frenchmen
+Fresnel
+Fresno
+Freud
+Freudian
+Frey
+Fri
+Frick
+Friedman
+Frigga
+Frigidaire
+Frisbee
+Frito
+Fritz
+Frostbelt
+Frostbelt's
+Fuchs
+Fuji
+Fulbright
+Fullerton
+GM
+GNP
+GSA
+Gabriel
+Gabrielle
+Gaelic
+Gail
+Gainesville
+Gaithersburg
+Galahad
+Galapagos
+Galatea
+Galbreath
+Galilee
+Galloway
+Gallup
+Galois
+Galveston
+Ganges
+Ganymede
+Garcia
+Gardner
+Garfield
+Garibaldi
+Garnett
+Garrett
+Garry
+Garvey
+Gary
+Gary's
+Gascony
+Gasset
+Gaston
+Gatlinburg
+Gatsby
+Gauguin
+Gaul
+Gauntley
+Gaussian
+Gavin
+Gaylor
+Gaylord
+Gaynor
+Geary
+Gehrig
+Geiger
+Gemini
+Geneva
+Geneva's
+Genevieve
+Genevieve's
+George
+George's
+Georges
+Georgetown
+Georgia
+Georgian
+Georgians
+Gerald
+Geraldine
+Gerard
+Gerber
+Gerhard
+Gerhardt
+Germania
+Germanic
+Germantown
+Gerome
+Gerry
+Gerry's
+Gershwin
+Gershwins
+Gertrude
+Getty
+Gettysburg
+Ghana
+Ghent
+Giacomo
+Gibbs
+Gibby
+Gibraltar
+Giddings
+Gideon
+Gifford
+Gilbertson
+Gilda
+Gilda's
+Giles
+Gilkson
+Gillespie
+Gillette
+Gilligan
+Gimbel
+Gioconda
+Giorgio
+Giovanni
+Gladstone
+Gladys
+Glasgow
+Gleason
+Glenda
+Glendale
+Glenn
+Gloria
+Gloucester
+Glynn
+Godot
+Goethe
+Gogh
+Golda
+Goldberg
+Goldman
+Goldstein
+Goldstein's
+Goldwater
+Goliath
+Gomez
+Gonzales
+Goodman
+Goodrich
+Goodwin
+Goodyear
+Gordian
+Gordon
+Gorham
+Gorky
+Gotham
+Gothicism
+Gracie
+Grady
+Grafton
+Granville
+Grayson
+Grecian
+Greece
+Greenberg
+Greenblatt
+Greenbriar
+Greenfeld
+Greenfield
+Greenland
+Greensboro
+Greensville
+Greentree
+Greenville
+Greenwich
+Gregg
+Gregory
+Grendel
+Grenier
+Grenoble
+Grenville
+Greta
+Gretchen
+Gretel
+Gretel's
+Griffith
+Grimm
+Gris
+Groot
+Grosset
+Grossman
+Grosvenor
+Groton
+Grumman
+Grusky
+Guadalupe
+Guam
+Guatemala
+Guatemalan
+Guggenheim
+Guhleman
+Guiana
+Gunderson
+Gunnar
+Gus
+Gutenberg
+Guthrie
+Guyana
+Gwen
+HP
+Hackett
+Hades
+Hafiz
+Hague
+Haifa
+Haiti
+Haitian
+Hal
+Halifax
+Hallinan
+Halloween
+Hamey
+Hamilton
+Hamiltonian
+Hamiltonians
+Hammett
+Hammond
+Hampshire
+Hampton
+Hancock
+Hannah
+Hannibal
+Hanoi
+Hanover
+Hanoverian
+Hans
+Hansel
+Hansen
+Hanson
+Hanukkah
+Hapgood
+Harcourt
+Hardin
+Harlem
+Harold
+Harriet
+Harris
+Harrisburg
+Harrison
+Harrisonburg
+Harry's
+Hartford
+Hartley
+Hartman
+Harvard
+Harvey
+Harveys
+Haskell
+Haskins
+Hatchure
+Hatfield
+Hattie
+Hauser
+Havana
+Hawaii
+Hawaiian
+Hawkins
+Hawley
+Hawthorne
+Haydn
+Hayes
+Haynes
+Hayward
+Haywood
+Hearst
+Heartwood
+Heathkit
+Heathman
+Hebraic
+Hebrew
+Hebrews
+Hecuba
+Hedda
+Hegel
+Hegelian
+Heidegger
+Heidelberg
+Heidi
+Heidi's
+Heinz
+Heinze
+Heisenberg
+Heiser
+Helen
+Helena
+Helene
+Heliopolis
+Hellenic
+Helmholtz
+Helmut
+Helsinki
+Hemingway
+Henderson
+Hendrick
+Hendricks
+Hendrickson
+Hendrix
+Hennessey
+Hennessey's
+Henrietta
+Hepburn
+Hera
+Heraclitus
+Herbert
+Herculean
+Hercules
+Hereford
+Herman
+Hermes
+Hermite
+Hermosa
+Hernandez
+Herodotus
+Herr
+Herrington
+Herschel
+Hersey
+Hershel
+Hershey
+Hesperus
+Hess
+Hessian
+Hessians
+Heublein
+Heywood
+Hiawatha
+Hibernia
+Hickey
+Hickeys
+Hickok
+Hieronymus
+Highfield
+Hilbert
+Hillary
+Hillcrest
+Hillel
+Hillsboro
+Hillsdale
+Hilton
+Himalayas
+Himmler
+Hindi
+Hindu
+Hindu's
+Hinduism
+Hindus
+Hinkle
+Hinsdale
+Hiram
+Hirey
+Hiroshima
+Hispanic
+Hispanic's
+Hispanics
+Hitachi
+Hitchcock
+Hitler
+Hobbes
+Hobbs
+Hobday
+Hoboken
+Hoffman
+Holbrook
+Hollerith
+Hollister
+Hollywood
+Hollywood's
+Holmes
+Holocene
+Holst
+Holstein
+Holyoke
+Holzman
+Homeric
+Hondo
+Honduras
+Honeywell
+Honolulu
+Hoosier
+Hoover
+Hoover's
+Hopi
+Hopkins
+Hopkinsian
+Horace
+Horatio
+Hornblower
+Horowitz
+Horton
+Houdini
+Houston
+Howard
+Howe
+Howell
+Hubble
+Hubble's
+Hubert
+Huck
+Hudson
+Huey
+Hugh
+Hughes
+Hugo
+Humboldt
+Hume
+Humphrey
+Humphreys
+Humpty
+Hungarian
+Hungary
+Huntsville
+Huron
+Hurst
+Hutchins
+Hutchinson
+Hutchison
+Huxley
+Hyannis
+ICC
+ISO
+ITT
+IUD
+IUDs
+Iberia
+Iberian
+Ibero
+Ibsen
+Icarus
+Iceland
+Iceland's
+Icelander
+Icelandic
+Idaho
+Igor
+Iliad
+Imbrium
+Inca
+Incas
+Indianapolis
+Indies
+Indira
+Indochina
+Indonesia
+Indonesian
+Indy
+Ingersoll
+Ingram
+Inverness
+Io
+Iowa
+Iraq
+Iraqi
+Irene
+Irish
+Irishman
+Irishmen
+Irma
+Iroquois
+Irvine
+Irving
+Irwin's
+Isaac
+Isaacs
+Isabel
+Islam
+Islamic
+Islandia
+Israelite
+Israelites
+Istanbul
+Italy
+Ithaca
+Ithacan
+Ivan
+Ivanhoe
+Izaak
+Izvestia
+Jackie
+Jackman
+Jackson
+Jacksonian
+Jacksons
+Jacksonville
+Jacky
+Jacob
+Jacobean
+Jacobian
+Jacobite
+Jacobs
+Jacobsen
+Jacoby
+Jacqueline
+Jacques
+Jakarta
+Jake
+Jakes
+Jamaica
+Jamaican
+Jameson
+Jamestown
+Jan
+Jane
+Jane's
+Janeiro
+Janesville
+Janet
+Janet's
+Janice
+Janis
+Jansen
+Janus
+Jason
+Jastrow
+Java
+Javanese
+Jaycee
+Jaycees
+Jeanette
+Jeanie
+Jeanne
+Jeannie
+Jeff
+Jeffersonian
+Jeffersonians
+Jeffrey
+Jeffreys
+Jehovah
+Jello
+Jenkins
+Jennie
+Jennifer
+Jennings
+Jeremiah
+Jeremy
+Jericho
+Jerome
+Jerry's
+Jerusalem
+Jesse
+Jesse's
+Jessica
+Jessie
+Jessy
+Jesuit
+Jesuits
+Jesus
+Jew
+Jewelled
+Jewish
+Jewishness
+Jews
+Jim
+Jim's
+Jimmie
+Jimmy's
+Jinny
+Joan
+Joanna
+Joanne
+Joanne's
+Joannes
+Joaquin
+Jobrel
+Jodi
+Jodi's
+Jody
+Joe
+Joel
+Joes
+Johann
+Johannes
+Johannesburg
+Johansen
+Johanson
+Johnny
+Johnny's
+Johnsen
+Johnson
+Johnstown
+Joliet
+Jon
+Jon's
+Jonas
+Jonathan
+Jones
+Joneses
+Joplin
+Jordan
+Jorge
+Jorgensen
+Jorgenson
+Jose
+Josef
+Joseph
+Josephine
+Josephson
+Josephus
+Joshua
+Josiah
+Jovanovich
+Jove
+Jovian
+Joyce
+Juan
+Juanita
+Jubal
+Judaism
+Judas
+Jude
+Judea
+Judith
+Judy
+Jules
+Julia
+Julian
+Juliet
+Julio
+Julius
+Juneau
+Jungian
+Juno
+Jupiter
+Justine
+Justinian
+Jutish
+KGB
+Kabuki
+Kabul
+Kaddish
+Kafka
+Kafkaesque
+Kalamazoo
+Kamikazes
+Kankakee
+Kansas
+Kant
+Karen
+Karl
+Karol
+Kate
+Katherine
+Kathleen
+Kathy
+Katie
+Katie's
+Katmandu
+Kay
+Keaton
+Keats
+Keegan
+Keenan
+Keith
+Keller
+Kelley
+Kellogg
+Kelly
+Kelly's
+Kelvin
+Kenilworth
+Kennecott
+Kennedy
+Kenneth
+Kenny
+Kenosha
+Kensington
+Kent
+Kentucky
+Kenya
+Kepler
+Kepler's
+Kermit
+Kettering
+Kevin
+Kewaskum
+Kewaunee
+Keynes
+Keynesian
+Khmer
+Khrushchev
+Khrushchevs
+Kickapoo
+Kiel
+Kiev
+Killebrew
+Kim
+Kingsbury
+Kingsley
+Kingston
+Kingstown
+Kingwood
+Kinnickinnic
+Kinsey
+Kipling
+Kirby
+Kirchoff
+Kirk
+Kirk's
+Kirkland
+Kirkpatrick
+Kirkwood
+Kiwanis
+Klan
+Klaus
+Knobeloch
+Knowles
+Knox
+Knoxville
+Knudsen
+Knudson
+Knutsen
+Knutson
+Koch
+Kodachrome
+Kodak
+Kodaks
+Kodiak
+Koenig
+Koenigsberg
+Kohler
+Kong
+Konrad
+Korea
+Korean
+Koreans
+Kraemer
+Krakatoa
+Krakow
+Kramer
+Krause
+Kremlin
+Kresge
+Kris
+Krishna
+Kristina
+Krueger
+Kruger
+Kurd
+Kurdish
+Kurt
+Kuwait
+Kyle
+Kyoto
+LIFO
+Labrador
+Lacey
+Lackawanna
+Lafayette
+Lagrange
+Laguna
+Lakehurst
+Lakewood
+Lancashire
+Lancaster
+Landis
+Landwehr
+Lange
+Langeland
+Langford
+Langley
+Lansing
+Laocoon
+Laos
+Laotian
+Laotians
+Laplace
+Laramie
+Laredo
+Larry
+Larry's
+Lars
+Larsen
+Larson
+Lathrop
+Latinate
+Lattimer
+Lauderdale
+Laundromat
+Laundromats
+Laura's
+Lauren
+Laurence
+Laurentian
+Lawford
+Lawrence
+Lawrenceville
+Lawson
+Lazarus
+Leary
+Leavenworth
+Lebanese
+Lebanon
+Lebesgue
+Lee's
+Lehigh
+Leigh
+Leighton
+Leila
+Lemke
+Lenin
+Leningrad
+Leninism
+Leninist
+Lenny
+Leo
+Leon
+Leona
+Leonard
+Leonardo
+Leone
+Leopold
+Leopoldville
+Leroy
+Leslie
+Levi
+Levine
+Levis
+Leviticus
+Lewellyn
+Lexington
+Leyden
+Liberace
+Liberia
+Libya
+Libyan
+Lichtenstein
+Lichter
+Lieberman
+Liechtenstein
+Lilliputian
+Lima
+Lincoln
+Linda
+Lindberg
+Lindy
+Linotype
+Linus
+Lionel
+Lipton
+Lisa
+Lisbon
+Liss
+Liston
+Lithuanian
+Littleton
+Litton
+Livermore
+Liverpool
+Livingston
+Lizzie
+Lizzy
+Lloyd
+Locke
+Lockhart
+Lockheed
+Lockian
+Lockwood
+Logan
+Lois
+Lola
+Lombard
+London
+Londonderry
+Londoner
+Longfellow
+Longstreet
+Lopez
+Lorelei
+Lorentzian
+Lorenz
+Lorenz's
+Lorraine
+Lothario
+Lottie
+Louis
+Louisa
+Louise
+Louisiana
+Louisianan
+Louisville
+Lovejoy
+Lovelace
+Loveland
+Lowell
+Loy
+Loyola
+Ltd
+Lubbock
+Lucas
+Lucerne
+Lucia
+Lucian
+Lucien
+Lucifer
+Lucille
+Lucius
+Lucretia
+Lucretius
+Lucy
+Ludmilla
+Ludwig
+Lufthansa
+Luftwaffe
+Luke
+Luke's
+Luna
+Luna's
+Luther
+Lutheran
+Luxembourg
+Lydia
+Lynchburg
+Lyndon
+Lynn
+Lyon
+MAG
+MBA
+MD
+MDT
+MIG
+MIGs
+MIMD
+MPH
+MST
+MTS
+MTV
+Mac
+MacArthur
+MacDonald
+MacGregor
+MacKenzie
+MacMillan
+Macarthur
+Macaulay
+Macbeth
+Macdonald
+Macedon
+Macedonia
+Macedonian
+Macgregor
+Mach
+Machiavelli
+Mackenzie
+Mackinac
+Macmillan
+Macon
+Madagascar
+Madame
+Madames
+Madeleine
+Madeleine's
+Madeline
+Madeline's
+Madison
+Madonna
+Madonnas
+Madrid
+Maelstrom
+Magdalene
+Maggie
+Magill
+Magruder
+Maguire
+Maguires
+Mahler
+Mahler's
+Maine
+Malamud
+Malay
+Malaysia
+Malaysian
+Malcolm
+Mallory
+Malone
+Malta
+Maltese
+Malthusian
+Managua
+Manchester
+Manfred
+Manitoba
+Manitowoc
+Mankowski
+Mansfield
+Manville
+Mao
+Maori
+Maplecrest
+Marcotte
+Marcus
+Marcy
+Mardi
+Mardis
+Marguerite
+Maria's
+Marian
+Marian's
+Marie
+Marie's
+Marietta
+Marilyn
+Marin
+Marino
+Mario
+Marion
+Marjorie
+Mark's
+Markov
+Markovian
+Markovitz
+Marlborough
+Marlene
+Marlowe
+Marquette
+Marriott
+Marseilles
+Marsha
+Marshall
+Marshalled
+Marshalling
+Martha
+Martian
+Martians
+Martinez
+Martinique
+Martinson
+Marty
+Marvin
+Marx
+Marxism
+Marxisms
+Marxist
+Masonic
+Masonite
+Mathews
+Mathewson
+Mathias
+Mathieu
+Matilda
+Matisse
+Matisses
+Matthew
+Matthews
+Mattie
+Maude
+Maureen
+Maurice
+Mauritania
+Mauritius
+Mawr
+Maximilian
+Maxine
+Maxwellian
+Maya
+Mayans
+Mayfair
+Mayflower
+Maynard
+Mazda
+McAdams
+McAllister
+McAllister's
+McBride
+McBride's
+McCabe
+McCabe's
+McCall
+McCall's
+McCarthy
+McCarthy's
+McCauley
+McCauley's
+McClain
+McClain's
+McClellan
+McClellan's
+McClure
+McClure's
+McCluskey
+McCluskey's
+McConnell
+McConnell's
+McCoy
+McCoy's
+McCracken
+McCracken's
+McDaniel
+McDaniel's
+McDermott
+McDermott's
+McDonald
+McDonald's
+McDonnell
+McDonnell's
+McDougall
+McDougall's
+McFadden
+McFadden's
+McFarland
+McFarland's
+McGill
+McGill's
+McGovern
+McGovern's
+McGrath
+McGrath's
+McGraw
+McGraw's
+McGregor
+McGregor's
+McGuire
+McGuire's
+McIntosh
+McIntosh's
+McIntyre
+McIntyre's
+McKay
+McKay's
+McKee
+McKee's
+McKesson
+McKesson's
+McKinley
+McKinley's
+McKinney
+McKinney's
+McKnight
+McKnight's
+McLanahan
+McLaughlin
+McLaughlin's
+McLean
+McLean's
+McLeod
+McLeod's
+McMillan
+McMillan's
+McNaughton
+McNaughton's
+McNeil
+McNeil's
+McPherson
+McPherson's
+Medea
+Medfield
+Medicaid
+Medicare
+Medici
+Medicis
+Mediterranean
+Meister
+Meistersinger
+Mekong
+Mel
+Melanesia
+Melanesian
+Melanie
+Melbourne
+Melinda
+Melisande
+Melissa
+Mellon
+Melville
+Melvin
+Memphis
+Mencken
+Mendelssohn
+Mendoza
+Menelaus
+Menlo
+Mennonite
+Mennonites
+Menominee
+Mensch
+Mephistopheles
+Mercator
+Mercedes
+Meredith
+Meriwether
+Merle
+Merriam
+Merrick
+Merrill
+Merrimac
+Merrimack
+Mesozoic
+Messrs
+Methuselah
+Methuselahs
+Mexican
+Mexicans
+Mexico
+Meyer
+Meyers
+Miami
+Michael
+Michael's
+Michaelangelo
+Michaels
+Michaelson
+Michelangelo
+Michelin
+Michelson
+Mick
+Mickelson
+Mickey
+Mickey's
+Mickie
+Micky
+Micronesia
+Micronesian
+Middlebury
+Middlesex
+Middleton
+Middletown
+Midwestern
+Midwesterner
+Midwesterners
+Miguel
+Mikhail
+Mikoyan
+Milan
+Mildred
+Millard
+Millie
+Milquetoast
+Milquetoasts
+Milton
+Miltonic
+Milwaukee
+Mimi
+Minerva
+Minneapolis
+Minnie
+Minoan
+Miocene
+Mira
+Miranda
+Miriam
+Mississippi
+Mississippian
+Mississippians
+Missoula
+Missouri
+Missy
+Mitch
+Mitch's
+Mitchell
+Mitchell's
+Mobil
+Modesto
+Mohammed
+Mohammedan
+Mohawk
+Moines
+Moliere
+Moline
+Molly
+Molotov
+Mon
+Monaco
+Monet
+Monfort
+Mongolia
+Mongolian
+Monica
+Monroe
+Monrovia
+Monsanto
+Montague
+Montaigne
+Montclair
+Monterey
+Montevideo
+Montgomery
+Monticello
+Montpelier
+Montreal
+Monty
+Mooney
+Moore
+Moorish
+Moravia
+Moravian
+Morehouse
+Moreland
+Morgan
+Moriarty
+Mormon
+Moroccan
+Morrison
+Morristown
+Morse
+Mortimer
+Morton
+Morton's
+Moscone
+Moscow
+Moses
+Mossberg
+Mozart
+Mozart's
+Muhammad
+Muir
+Mulligan's
+Mumford
+Muncie
+Mundt
+Munich
+Munroe
+Munson
+Muriel
+Murphy
+Murray
+Murrow
+Muscat
+Muscovy
+Muskegon
+Mussolini
+Mussolini's
+Mussolinis
+Mussorgsky
+Mussorgsky's
+Muzak
+Mycenae
+Mycenaean
+Myron
+NAACP
+NASA
+NATO
+NBC
+NBS
+NCAA
+NCC
+NCR
+NOAA
+NSF
+NYSE
+NaCl
+Nabisco
+Nagasaki
+Nairobi
+Nakamura
+Nakoma
+Nan
+Nancy
+Nancy's
+Nanette
+Nanking
+Nanook
+Nantucket
+Naomi
+Naples
+Napoleon
+Napoleonic
+Nash
+Nashua
+Nashville
+Nassau
+Nat
+Natalie
+Natalie's
+Natchez
+Nate
+Nathan
+Nathaniel
+Navaho
+Navajo
+Navona
+Nazarene
+Nazareth
+Nazism
+Neal's
+Neanderthal
+Neapolitan
+Needham
+Nepali
+Neptune
+Nero
+Nestor
+Neumann
+Nevada
+Newark
+Newbury
+Newburyport
+Newcastle
+Newell
+Newman
+Newport
+Newsweek
+Newsweekly
+Niagara
+Nicaean
+Nicaragua
+Niccolo
+Nicholas
+Nichols
+Nicholson
+Nicklaus
+Nicodemus
+Nielsen
+Nielson
+Nietzsche
+Nigeria
+Nigerian
+Nijinsky
+Nile
+Nilsen
+Nilsson
+Nina
+Niobe
+Nippon
+Nixon
+Noah
+Nobel
+Noel
+Norfolk
+Norma
+Norman
+Normandy
+Norris
+Norristown
+Norse
+Northampton
+Northfield
+Northumberland
+Norton
+Norwalk
+Norway
+Norwegian
+Norwich
+Nostradamus
+Notre
+Nottingham
+Noyes
+Nubian
+Nugent
+O'Brien
+O'Brien's
+O'Clock
+O'Connell
+O'Connell's
+O'Connor
+O'Connor's
+O'Dell
+O'Dell's
+O'Donnell
+O'Donnell's
+O'Dwyer
+O'Dwyer's
+O'Er
+O'Hare
+O'Hare's
+O'Leary
+O'Leary's
+O'Shea
+O'Shea's
+O'Sullivan
+O'Sullivan's
+OK's
+OPEC
+Oakland
+Oakley
+Oakmont
+Oberlin
+Occam
+Occam's
+Oconomowoc
+Octavia
+Odessa
+Odysseus
+Oedipal
+Oedipally
+Offenbach
+Ogden
+Okamoto
+Okinawa
+Olaf
+Oldenburg
+Oldsmobile
+Oleg
+Olga
+Olivers
+Olivetti
+Olivia
+Olsen
+Olson
+Olympia
+Olympian
+Olympic
+Olympics
+Olympus
+Omaha
+Oman
+Oneida
+Ontario
+Opel
+Oppenheimer
+Oregon
+Oregonians
+Orlando
+Orleans
+Orlick
+Orpheus
+Orphic
+Ortega
+Orwell
+Orwellian
+Osaka
+Osbert
+Osborn
+Osborne
+Oscar
+Oshkosh
+Oslo
+Ostrander
+Oswald
+Othello
+Ottawa
+Otto
+Otto's
+Ottoman
+Ovid
+Owen
+Owens
+Oxford
+Oxnard
+Oz
+Ozark
+Ozarks
+Ozzie
+PBS
+PDT
+PM
+PST
+PTA
+Pablo
+Pabst
+Packwood
+Paganini
+Paine
+Pakistan
+Pakistani
+Pakistanis
+Palatine
+Paleolithic
+Paleozoic
+Palermo
+Palestine
+Palmolive
+Palmyra
+Palomar
+Pam
+Pam's
+Pamela
+Pancho
+Pandora
+Pappas
+Paraguay
+Paris
+Parisian
+Parkersburg
+Parkhouse
+Parkinson
+Parrish
+Parthenon
+Pasadena
+Passaic
+Passover
+Pasternak
+Pasteur
+Patagonia
+Patagonians
+Patrice
+Patricia
+Patrick
+Patsies
+Patsy
+Patterson
+Patton
+Paul
+Paul's
+Paula
+Paulette
+Paulette's
+Pauli
+Pauline
+Pauling
+Paulsen
+Paulson
+Pavlov
+Pawtucket
+Payne
+Paynes
+Payson
+Peabody
+Peachtree
+Pearce
+Pearson
+Pecos
+Pedro
+Pegasus
+Peggy
+Peking
+Pelham
+Pendleton
+Penn
+Pensacola
+Pentecost
+Peoria
+Pepsi
+Pepsico
+Percy
+Perez
+Pergamon
+Pericles
+Perkins
+Pernod
+Perry
+Perry's
+Perseus
+Pershing
+Persia
+Persian
+Persians
+Perth
+Peru
+Peruvian
+Peruvians
+Pete
+Pete's
+Petersburg
+Petersen
+Peterson
+Pettibone
+Peugeot
+Pewaukee
+Peyton
+Peyton's
+Pfizer
+Ph
+Phaedra
+Phil
+Philadelphia
+Philco
+Philip
+Philippe
+Philippians
+Philippine
+Philippines
+Philistine
+Philistines
+Phillies
+Phillips
+Philly
+Phyllis
+Picasso
+Piccadilly
+Pickford
+Pickman
+Pierre
+Pierson
+Pillsbury
+Pinehurst
+Pipestone
+Pisa
+Pisces
+Pitney
+Pitt
+Pittsburgh
+Pittsburghers
+Pittsfield
+Pittston
+Pius
+Plainfield
+Plainview
+Plato
+Platonism
+Platonist
+Platteville
+Pleiades
+Pleistocene
+Plexiglas
+Pliny
+Pliocene
+Plutarch
+Pluto
+Plymouth
+Pocahontas
+Pocono
+Poconos
+Poe
+Poincare
+Poindexter
+Poisson
+Polaris
+Polaroid
+Polk
+Pollux
+Polynesian
+Polyphemus
+Pomerania
+Pomeranian
+Pomona
+Pompeii
+Pompey
+Pontiac
+Popsicle
+Popsicles
+Portland
+Portsmouth
+Portugal
+Portuguese
+Poseidon
+Potemkin
+Potomac
+Potsdam
+Pottawatomie
+Potts
+Poughkeepsie
+Poussin
+Poussins
+Powell
+Prague
+Pratt
+Prattville
+Pravda
+Precambrian
+Prentice
+Prenticed
+Prenticing
+Presbyterian
+Presbyterianism
+Prescott
+Presley
+Preston
+Preston's
+Pretoria
+Priestley
+Princeton
+Principia
+Priscilla
+Procrustes
+Procyon
+Prokofieff
+Promethean
+Prometheus
+Protestantism
+Proust
+Proxmire
+Prussia
+Prussian
+Ptolemaic
+Ptolemaists
+Ptolemy
+Puccini
+Puerto
+Pulaski
+Pulitzer
+Pullman
+Pullmans
+Purcell
+Purdue
+Purina
+Pygmalion
+Pyhrric
+Pyrex
+Pythagoras
+Pythagorean
+Pythagoreans
+Quakeress
+Quantico
+Quasimodo
+Quebec
+Quinn
+Quinn's
+Quixote
+RCA
+RISC
+RMS
+ROTC
+RPM
+RSVP
+Rachel
+Rachmaninoff
+Racine
+Radcliffe
+Rafael
+Rajive
+Rajive's
+Raleigh
+Ralph
+Ralph's
+Ralston
+Ramada
+Ramirez
+Ramona
+Ramsey
+Rand
+Randall
+Randolph
+Randy's
+Rangoon
+Raoul
+Raphael
+Rapunzel
+Rasmussen
+Rawlings
+Rawlins
+Rawlinson
+Rawson
+Rayburn
+Rayleigh
+Raymond
+Raymondville
+Raytheon
+Reagan
+Rebecca
+Redhook
+Redstone
+Reedville
+Reese
+Regina
+Reginald
+Regulus
+Reich
+Reichenberg
+Reichstag
+Reilly
+Reinhard
+Reinhardt
+Reinhold
+Rembrandt
+Remington
+Remus
+Renaults
+Renee
+Renee's
+Renoir
+Renville
+Reuben
+Reuters
+Reuther
+Rev
+Rex
+Reynolds
+Rhea
+Rheims
+Rheinholdt
+Rhenish
+Rhine
+Rhinelander
+Rhodes
+Rhodesia
+Rhonda
+Rican
+Ricans
+Richard
+Richard's
+Richards
+Richardson
+Richey
+Richfield
+Richland
+Richmond
+Richter
+Rickenbaugh
+Ridgefield
+Ridgway
+Riemann
+Riggs
+Riley
+Rilke
+Rinehart
+Rio
+Ripley
+Ritter
+Ritz
+Riverview
+Riviera
+Riyadh
+Robbie
+Robbins
+Roberta
+Roberto
+Robertson
+Robertsons
+Robinsonville
+Rochester
+Rochester's
+Rockaway
+Rockaways
+Rockefeller
+Rockford
+Rockland
+Rockville
+Rockwell
+Rodgers
+Rodney
+Rodney's
+Rodriguez
+Roger
+Roger's
+Rogers
+Roland
+Rollie
+Rollins
+Romano
+Rome
+Romeo
+Romeos
+Romulus
+Ron
+Ronald
+Ronnie
+Rooney
+Roosevelt
+Roosevelt's
+Rooseveltian
+Rorschach
+Rosa
+Rosabelle
+Rosalie
+Roseland
+Rosella
+Rosen
+Rosenberg
+Rosetta
+Rosie
+Ross
+Rossi
+Roswell
+Rotarian
+Rotarians
+Roth
+Rousseau
+Rousseau's
+Rowena
+Rowena's
+Rowland
+Rowland's
+Rowley
+Rowley's
+Roxy
+Roxy's
+Rozelle
+Rozelle's
+Rudolph
+Rudolph's
+Rudy
+Rufus
+Rumania
+Rumanian
+Rumanians
+Rumford
+Rummel
+Runnymede
+Runyon
+Ruppert
+Rushmore
+Russ
+Russell
+Russia
+Rutgers
+Ruth
+Rutherford
+Rutland
+Rutledge
+Ryan
+Ryder
+SCSI
+SIMD
+SMSA
+SMSA's
+SMSAs
+SPSS
+Sabine
+Sacramento
+Sadie
+Saginaw
+Sahara
+Saigon
+Salem
+Salerno
+Salisbury
+Salk
+Salvador
+Salvadoran
+Salvatore
+Sammy
+Sammy's
+Samoa
+Samoan
+Sampson
+Samson
+Samuel
+Samuels
+Samuelson
+Sanchez
+Sancho
+Sandburg
+Sanderson
+Sandia
+Sandra
+Sandusky
+Sanford
+Sanhedrin
+Sanskrit
+Sanskritic
+Santa
+Santayana
+Santiago
+Sara
+Sarah
+Sarasota
+Saratoga
+Sargent
+Sartre
+Saskatchewan
+Satan
+Saturn
+Satyanarayanan
+Satyanarayanan's
+Saud
+Saudi
+Saukville
+Saunders
+Savannah
+Saviour
+Savonarola
+Saxon
+Saxons
+Saxony
+Saxton
+Scandinavia
+Scandinavian
+Scandinavians
+Schaefer
+Schaeffer
+Schafer
+Schaffner
+Schapiro
+Scheherezade
+Schelling
+Schenectady
+Schlitz
+Schmidt
+Schmitt
+Schneider
+Schopenhauer
+Schroeder
+Schroedinger
+Schubert
+Schultz
+Schulz
+Schumacher
+Schuman
+Schumann
+Schuster
+Schwartz
+Scorpio
+Scot
+Scotchgard
+Scotchman
+Scotia
+Scotian
+Scots
+Scotsman
+Scotsmen
+Scott
+Scottish
+Scottsdale
+Scotty
+Scranton
+Scribners
+Scripps
+Scylla
+Scythia
+Seaborg
+Seabrook
+Seaquarium
+Seattle
+Seattle's
+Sebastian
+Sedgwick
+Seeley
+Segundo
+Selectric
+Selfridge
+Selma
+Seminole
+Semite
+Seneca
+Senegal
+Senora
+Seoul
+Serafin
+Serbian
+Serbo
+Serra
+Seville
+Seward
+Seymour
+Shakespeare
+Shakespearean
+Shakespearian
+Shanghai
+Shanghaiing
+Shapiro
+Sharon
+Shasta
+Shawano
+Shawnee
+Sheboygan
+Sheffield
+Sheffielder
+Sheffielders
+Sheila
+Shelby
+Sheldon
+Shelley
+Shelton
+Shenandoah
+Sheraton
+Sheridan
+Sherman
+Sherwin
+Sherwood
+Shiite
+Shiite's
+Shiites
+Shillong
+Shiloh
+Shinto
+Shintoism
+Shirley
+Shorewood
+Shreveport
+Shylock
+Shylockian
+Siamese
+Siberia
+Siberian
+Sicilian
+Siciliana
+Sicilians
+Sicily
+Sidney
+Siegfried
+Sigmund
+Signora
+Sikh
+Sikh's
+Sikhes
+Sikhs
+Sikorsky
+Silas
+Silverman
+Simmons
+Simmonsville
+Simms
+Simon
+Simpson
+Sinai
+Sinatra
+Sinclair
+Sioux
+Sirius
+Sistine
+Sisyphean
+Sisyphus
+Siva
+Skippy
+Skye
+Slav
+Slavic
+Slavs
+Slesinger
+Sloan
+Sloane
+Smallwood
+Smithfield
+Smithsonian
+Smithtown
+Smucker
+Snead
+Sneed
+Snodgrass
+Snowbelt
+Snowbelt's
+Snyder
+Socrates
+Socratic
+Sofia
+Sol
+Solly
+Solomon
+Somali
+Somalis
+Somerset
+Somerville
+Sonoma
+Sonora
+Sophia
+Sophias
+Sophie
+Sophoclean
+Sophocles
+Sorensen
+Sorenson
+Sorrentine
+Sousa
+Southampton
+Southfield
+Spahn
+Spalding
+Spaniard
+Spaniards
+Sparkman
+Sparta
+Spartan
+Spencerian
+Spenglerian
+Sperry
+Spiegel
+Spokane
+Springfield
+Squaresville
+Squibb
+Squibbing
+Stacy
+Stacy's
+Stafford
+Staffordshire
+Staley
+Staley's
+Stalin
+Stalin's
+Stalinist
+Stalins
+Stamford
+Stan
+Stan's
+Standish
+Standish's
+Stanford
+Stanford's
+Stanley
+Stans
+Stanton
+Stapleton
+Starkey
+Starr
+Staten
+Statler
+Stauffer
+Stearns
+Steinbecks
+Steinberg
+Stella
+Stephan
+Stephanie
+Stephanie's
+Stephen
+Stephens
+Stephenson
+Sterno
+Stetson
+Stetsons
+Steuben
+Steve
+Steve's
+Steven
+Steven's
+Stevens
+Stevenson
+Stevie
+Stewart
+Stewart's
+Stillwell
+Stimson
+Stirling
+Stockholm
+Stockton
+Stonehenge
+Stouffer
+Stowe
+Strasbourg
+Stratford
+Strauss
+Stravinsky
+Stromberg
+Strongheart
+Stuart
+Stubblefield
+Stubblefields
+Studebaker
+Stuttgart
+Stuyvesant
+Stygian
+Styrofoam
+Styx
+Sudan
+Sudanese
+Sudanic
+Suez
+Suffolk
+Sukarno
+Sullivan
+Sulzberger
+Sumatra
+Sumerian
+Summerdale
+Sumter
+Sunbelt
+Sunbelt's
+Sunnyvale
+Superman's
+Susan
+Susan's
+Susanne
+Susanne's
+Susie
+Susie's
+Susquehanna
+Susquehanna's
+Sussex
+Sussex's
+Sutherland
+Sutherland's
+Sutton
+Sutton's
+Suwanee
+Suwanee's
+Suzanne
+Suzanne's
+Suzuki
+Suzuki's
+Swabian
+Swabian's
+Swabians
+Swahili
+Swahili's
+Swanson
+Swarthmore
+Swartz
+Swaziland
+Swede
+Sweden
+Swedes
+Swedish
+Sweeney
+Sweeneys
+Swenson
+Swinburne
+Switzer
+Switzerland
+Sybil
+Sydney
+Sylvania
+Sylvester
+Sylvia
+Sylvie
+Symington
+Syracuse
+Syria
+Syrian
+Syrian's
+Syrians
+TNT
+TRW
+TTL
+TV
+TVA
+TWA
+Tacitus
+Tacoma
+Taft
+Tahiti
+Tahoe
+Taipei
+Taiwan
+Taiwanese
+Talladega
+Tallahassee
+Tallahatchie
+Tallahoosa
+Tallchief
+Talleyrand
+Talmud
+Tammany
+Tampa
+Tanganyika
+Tanganyika's
+Tannenbaum
+Tantalus
+Tanya
+Tanzania
+Tapdance
+Tara
+Tarrytown
+Tartuffe
+Tarzan
+Tasmania
+Tate
+Tawney
+Taylor
+Taylors
+Tchaikovsky
+Teddy
+Teheran
+Tehran
+Teledyne
+Telefunken
+Telemann
+Telex
+Templeman
+Templeton
+Tenex
+Tenneco
+Tenney
+Tennyson
+Teresa
+Terra
+Terran
+Tess
+Tessie
+Teutonic
+Tex
+Texaco
+Texan
+Texans
+Textron
+Thai
+Thailand
+Thames
+Thebes
+Thelma
+Theodore
+Theodosian
+Theodosius
+Theresa
+Theseus
+Thiensville
+Thomas
+Thompson
+Thompson's
+Thomson
+Thor
+Thoreau
+Thornburg
+Thornton
+Thorpe
+Throneberry
+Thruway
+Thruways
+Thu
+Thule
+Thurber
+Thurman
+Tiber
+Tibet
+Tibetan
+Tiburon
+Ticonderoga
+Tieck
+Tigris
+Tijuana
+Tillich
+Tillie
+Tim
+Tim's
+Timex
+Timmy
+Timon
+Tims
+Tioga
+Tippecanoe
+Tipperary
+Tito
+Titus
+Tobago
+Todd
+Todd's
+Togo
+Tokyo
+Toland
+Toledo
+Tolley
+Tolstoy
+Tombigbee
+Tommie
+Toni
+Tonio
+Toomey
+Topeka
+Topsy
+Torah
+Toronto
+Torquemada
+Tosca
+Tosca's
+Toscanini
+Toscanini's
+Toshiba
+Toshiba's
+Toto
+Toulouse
+Townley
+Townsend
+Towsley
+Toynbee
+Toyota
+Tractarians
+Tracy
+Transylvania
+Travis
+Treadwell
+Trenton
+Trianon
+Trimble
+Trinidad
+Tristan
+Trojan
+Tropez
+Trotsky
+Troutman
+Truckee
+Trudy
+Trujillo
+Truman
+Trumbull
+Tsunematsu
+Tucson
+Tudor
+Tue
+Tulane
+Tulsa
+Tunis
+Tunisia
+Tunisian
+Turin
+Turkish
+Tuscaloosa
+Tuscan
+Tuscany
+Tuskegee
+Tuttle
+Tyler
+Typhon
+Tyson
+UN
+UNESCO
+USA
+USAF
+USART
+USDA
+USPS
+USSR
+Udall
+Uganda
+Ukrainian
+Ukrainians
+Ullman
+Ulysses
+Unibus
+Uniroyal
+Unisys
+Univac
+Upton
+Uranus
+Urbana
+Ursa
+Ursula
+Ursuline
+Uruguay
+Utica
+Uzi
+Uzi's
+VGA
+VHF
+VLSI
+Vail
+Valerie
+Valhalla
+Valkyrie
+Vance
+Vancouver
+Vandenberg
+Vanderbilt
+Vanderburgh
+Varian
+Varityping
+Vatican
+Vaudois
+Vaughn
+Vega
+Vegas
+Velasquez
+Venetian
+Venetian's
+Venetians
+Venezuela
+Venezuelan
+Venice
+Venn
+Venus
+Venusian
+Venusians
+Vera
+Vergil
+Verlag
+Vermont
+Vern
+Verne
+Vernon
+Verona
+Veronica
+Versailles
+Vic
+Vic's
+Vichy
+Vichy's
+Vickers
+Vickie
+Vickie's
+Vicksburg
+Vicksburg's
+Vicky
+Vicky's
+Victoria
+Victoria's
+Victorian
+Victorians
+Victrola
+Victrola's
+Victrolas
+Vidal
+Vidal's
+Vienna
+Vienna's
+Viennese
+Viennese's
+Viet
+Vietnam
+Vietnam's
+Vietnamese
+Vietnamese's
+Viking
+Vikings
+Vince
+Vincent
+Vincent's
+Vinson
+Virginian
+Virginians
+Virgo
+Virgo's
+Virgos
+Vishnu
+Visigoth
+Visigoths
+Vitus
+Vivaldi
+Vivian
+Vladimir
+Vladivostok
+Vogel
+Vol
+Volkswagen
+Volkswagens
+Volstead
+Volta
+Voltaire
+Volvo
+Vulcan
+WFF
+WWW
+Wabash
+Waco
+Wade's
+Wagner
+Wainwright
+Wakefield
+Walbridge
+Walcott
+Walden
+Waldensian
+Waldo
+Waldorf
+Walford
+Walgreen
+Wallace
+Wallenstein
+Wally's
+Walpole
+Walsh
+Walt
+Walter
+Walters
+Walton
+Walworth
+Wang
+Wansee
+Wansley
+Warfield
+Warfield's
+Warsaw
+Warsaw's
+Warwick
+Warwick's
+Washburn
+Washoe
+Wasserman
+Waterbury
+Watergate
+Waterhouse
+Watertown
+Watkins
+Watson
+Watson's
+Wattenberg
+Watterson
+Waukesha
+Waunona
+Waupaca
+Waupun
+Wausau
+Wauwatosa
+Waveland
+Wayne
+Waynesboro
+Weatherford
+Webber
+Webster
+Webster's
+Websterville
+Weider
+Weidman
+Weinberg
+Weiner
+Weinstein
+Weiss
+Weissman
+Weissmuller
+Welch
+Welcher
+Welches
+Weldon
+Weldwood
+Wellesley
+Wellington
+Wellman
+Wellsville
+Welmers
+Wendell
+Wendy
+Wentworth
+Werner
+Wesley
+Wesleyan
+Wesson
+Westbrook
+Westchester
+Westfield
+Westhampton
+Westinghouse
+Westminster
+Westmore
+Weston
+Westphalia
+Westport
+Westwood
+Weyerhauser
+Wharton
+Wheatland
+Wheaton
+Wheatstone
+Wheelock
+Whelan
+Wheller
+Whippany
+Whipple
+Whitcomb
+Whitehall
+Whiteleaf
+Whiteley
+Whitewater
+Whitfield
+Whitlock
+Whitman
+Whitney
+Whittaker
+Whittier
+Wichita
+Wieland
+Wiggins
+Wilcox
+Wiley
+Wilfred
+Wilhelm
+Wilhelmina
+Wilkes
+Wilkinson
+Willamette
+Willard
+Willcox
+Willem
+William
+Williams
+Williamsburg
+Williamson
+Willie
+Willied
+Willies
+Willoughby
+Willy
+Wilma
+Wilmette
+Wilmington
+Wilshire
+Wilsonian
+Winchell
+Windsor
+Winehead
+Winfield
+Winifred
+Winnebago
+Winnetka
+Winnie
+Winnipeg
+Winograd
+Winooski
+Winsborough
+Winsett
+Winslow
+Winston
+Winthrop
+Wisconsin
+Wisconsin's
+Witherspoon
+Wolcott
+Wolfgang
+Wolverton
+Woodard
+Woodberry
+Woodbury
+Woodlawn
+Woodrow
+Woodward
+Woodwards
+Woolworth
+Woonsocket
+Wooster
+Worcester
+Worcestershire
+Worcestershire's
+Wordsworth
+Worthington
+Wrigley
+Wronskian
+Wyman
+Wyoming
+XOR
+Xanthus
+Xavier
+Xenia
+Xerox
+Xerox's
+Xerxes
+YMCA
+YWCA
+Yakima
+Yale
+Yalies
+Yalta
+Yankee
+Yankees
+Yaqui
+Yates
+Yeager
+Yeats
+Yemen
+Yiddish
+Yoknapatawpha
+Yokohama
+Yonkers
+Yorick
+Yorktown
+Yosemite
+Youngstown
+Ypsilanti
+Yuba
+Yucatan
+Yugoslav
+Yugoslavia
+Yukon
+Yuri
+Yves
+Yvette
+Zachary
+Zaire
+Zanzibar
+Zeffirelli
+Zeiss
+Zellerbach
+Zen
+Zennist
+Zeus
+Zeus's
+Ziegfeld
+Ziegfeld's
+Ziegfelds
+Ziegler
+Ziegler's
+Ziggy
+Zimmerman
+Zimmerman's
+Zion
+Zion's
+Zionism
+Zionist
+Zionist's
+Zionists
+Zions
+Zoroaster
+Zoroastrian
+Zoroastrians
+Zurich
+Zurich's
+aardvark
+aardvark's
+aardvarks
+abalone
+abalone's
+abalones
+abdicate
+abdicated
+abdicates
+abdicating
+abdication
+abeyant
+abominate
+abominated
+abominates
+abominating
+abomination
+abominations
+aborning
+aboveboard
+abrasive
+abrasively
+abrasiveness
+abrasives
+abscissae
+abstemiously
+abstinent
+abstinently
+abusable
+academician
+academicianship
+acceptant
+accessors
+accordant
+accordantly
+accrual
+accruals
+acetic
+achromatic
+acknowledgeable
+acquiescent
+acquiescently
+acquisitive
+acquisitively
+acrylate
+actinic
+actinide
+actuaries
+addend
+addle
+addled
+addles
+addling
+adios
+adjectival
+adjectivally
+adjoint
+administrable
+administrate
+administrated
+administrates
+administrating
+administratrix
+adsorbate
+adsorptive
+adsorptively
+advert
+adverted
+adverting
+adverts
+aeolian
+afforest
+afforestation
+afro
+afterbirth
+afterglow
+afterlife
+aftershave
+agribusiness
+agriculturalists
+aha
+ahem
+ahoy
+ain't
+airfare
+airmass
+airpark
+airplay
+airtight
+airtightness
+ala
+albatross
+aldehyde
+aleph
+alewife
+allegiant
+alliterate
+alliterated
+alliterates
+alliterating
+allocable
+allotropic
+allspice
+alluvial
+alluvium
+almagest
+almshouses
+alp
+altercate
+altho
+altimeter
+altimeter's
+altimeters
+alway
+ambrose
+ambrosia
+ambulant
+amethyst
+amethystine
+aminobenzoic
+ammeter
+ammeter's
+ammeters
+amoebae
+amperage
+amperages
+anachronistic
+anaglyph
+analgesic
+anamorphic
+anastigmatic
+androgynous
+angelfish
+angiosperm
+angora
+anhydride
+anhydrite
+animadversion
+animadvert
+anneal
+annealed
+annealer
+annealers
+annealing
+anneals
+annuities
+annuity
+annular
+annularly
+annulus
+anodic
+antacid
+antebellum
+anthropogenic
+anthropometric
+anthropometrics
+anthropometry
+anticlimactic
+antifreeze
+antigone
+antilogs
+antimatter
+antimatter's
+antipasto
+antiperspirant
+antiquary
+antisemitic
+antisemitism
+antisemitism's
+antithetic
+anytime
+apache
+apaches
+apolar
+apparency
+applesauce
+applicate
+apposite
+appositely
+appositeness
+apposition
+appositive
+appositively
+appropriable
+arbitrage
+arbitrager
+arboretum
+arcana
+archetypical
+archetypically
+arcsine
+arctangent
+ardency
+areawide
+arenaceous
+armada
+armature
+armatures
+arrangeable
+arrear
+arrestee
+arrestee's
+arrestees
+arrowroot
+arsenate
+arsenide
+artesian
+articulable
+artier
+artiness
+arty
+ascriptive
+ashame
+ashier
+ashy
+asperity
+asphyxiate
+asphyxiation
+asplenium
+assertional
+assignation
+assignations
+assimilationist
+assn
+associable
+assumability
+asteria
+astigmatic
+astigmatism
+astraddle
+astronautic
+astronomic
+astrophysicist
+astrophysicist's
+astrophysicists
+athwart
+attestation
+attributional
+audibility
+audiotape
+audiovisual
+audiovisuals
+auntie
+auric
+australites
+autoloader
+autostart
+aviate
+aviations
+aviatrix
+axiology
+azimuthal
+azimuthally
+babbitt
+babbitted
+babbitting
+babbitts
+baboon
+babysitting
+baccarat
+bachelorhood
+backarrow
+backboard
+backchaining
+backfill
+backfilled
+backfilling
+backfills
+backhand
+backhanded
+backhandedly
+backhander
+backorder
+backplate
+backplates
+backside
+backstop
+backwood
+badland
+badmen
+baggageman
+baggagemen
+baldy
+baleen
+ballfields
+bandaid
+bandoleers
+bandstop
+bangkok
+barefaced
+barefacedly
+barefacedness
+barkeep
+barkeeper
+barnacle
+barnacled
+barnful
+barnsful
+baronet
+barrette
+barrette's
+barrettes
+barstool
+barstool's
+barstools
+bartend
+baseband
+basemen
+baseplate
+basilar
+basilisk
+basophilic
+basswood
+bates
+batik
+batwings
+bayberries
+bayberry
+beadsman
+beadworker
+beasties
+beautician
+beauticians
+beaux
+bebop
+bedmate
+bedmate's
+bedmates
+bedpan
+bedpan's
+bedpans
+bedstraw
+beechwood
+befuddlement
+begonia
+behemoths
+belate
+belladonna
+bellflower
+bellyache
+bellyacher
+bellyaching
+bellyfull
+belove
+belvedere
+beman
+bemuse
+bemused
+bemusedly
+benefice
+beneficent
+beneficently
+berg
+bergen
+berger
+bergs
+beribbon
+berserk
+berserker
+bespoke
+bestir
+bestirring
+bestubble
+bestubbled
+betatron
+bethel
+bethought
+betoken
+betokened
+betokening
+bettor
+bewhisker
+bezel
+biaxial
+biaxially
+bicep
+bichromate
+bichromated
+biconnected
+bidiagonal
+biharmonic
+bilayer
+bilayers
+bilingualism
+billies
+billy
+bimetallic
+bimetallism
+bindery
+bindle
+biochemist
+biochemists
+biograph
+biologic
+biomass
+biometric
+biometrics
+biometry
+biomolecule
+biomolecules
+biophysic
+biophysical
+biophysically
+biophysicist
+biophysicists
+biophysics
+bioscience
+biosciences
+biosphere
+biostatistic
+biostatistics
+biotic
+birdseed
+birdwatch
+birth's
+birthrate
+birthrate's
+birthrates
+biserial
+bisexual
+bisexual's
+bisexually
+bisexuals
+bishopric
+bistable
+bistate
+bisyllabic
+bittern
+bitternut
+bitterroot
+bitumen
+blackball
+blackballed
+blackballing
+blackballs
+blackbodies
+blackbody
+bladdernut
+bladderwort
+blameworthiness
+blameworthy
+blanc
+blatancy
+blather
+blathered
+blatherer
+blathering
+blatting
+blazon
+blazoned
+blazoner
+blazoning
+bldg
+bleeps
+blest
+blindside
+blindsided
+blindsides
+blindsiding
+blockier
+blocky
+bloodbath
+bloodroot
+blotch
+blowtorch
+blueback
+bluebill
+bluebook
+bluebush
+bluegill
+bluegrass
+bluejacket
+boa
+boas
+bobble
+bobbled
+bobbles
+bobbling
+bobcat
+bobsled
+bobsledding
+bock
+bockwurst
+bodhisattva
+bodyweight
+bogey
+bogeyed
+bogeying
+bogeymen
+bogeys
+bogging
+boggy
+bogies
+bogy
+boilermaker
+boilermaker's
+boilermakers
+bolivar
+bolo
+bolometer
+bolometer's
+bolometers
+bolos
+bona
+bongo
+bonito
+bonjour
+bonzes
+boogie
+bookbind
+bookbinder
+bookbinders
+bookbinding
+bookend
+bookends
+bookkeep
+bookplate
+bookplates
+boomtown
+boomtowns
+boosterism
+bootblack
+bootblacks
+bop
+bopping
+borosilicate
+boson
+bossier
+bossies
+bossiness
+bossy
+botanic
+botfly
+bottommost
+botulin
+bouillon
+boutique
+boutiques
+bowie
+boxier
+boxiness
+boxy
+bpi
+brachia
+brachium
+bracken
+brad
+braggadocio
+brakeman
+brakemen
+brakemen's
+brandywine
+bratwurst
+breadfruit
+breadfruits
+breastfed
+breastfeed
+breastfeeding
+breastplate
+bribery
+brickmason
+brickmasons
+brickyard
+brimming
+brimstone
+brinier
+brininess
+briny
+bristlier
+bristly
+bristol
+bristols
+broadloom
+bronc
+bronchiolar
+bronchiolitis
+bronco
+broncos
+broncs
+broodiness
+broody
+brookside
+brouhaha
+brucellosis
+brushwork
+bubonic
+buckaroo
+buckaroos
+bucketful
+bucketful's
+buckeye
+buckhorn
+bufflehead
+bugaboo
+bugbears
+bugeyed
+bulblet
+bullfinch
+bullfrog
+bullhead
+bullheaded
+bullheadedly
+bullheadedness
+bullhide
+bullseye
+bullshit
+bullwhackers
+bullyboy
+bullyboys
+bulrush
+burble
+burbled
+burbler
+burbles
+burbling
+burg
+burgers
+burlap
+burley
+bushmaster
+busyness
+butch
+butene
+butterball
+buttercup
+buttermilk
+buttery
+buttonweed
+bypath
+byroad
+cabal
+cabals
+cabana
+cabanas
+cabaret
+cabarets
+cabdriver
+cabdrivers
+cabinetmaker
+cabinetmaker's
+cabinetmakers
+cabinetry
+cacao
+cacciatore
+cackly
+cacophonist
+cacophony
+cadaver
+cadaverous
+cadaverously
+caddies
+caddy
+cadent
+cadenza
+cadet
+cadge
+cadged
+cadger
+cadges
+cadging
+cadmium
+cadre
+caffeine
+caffeine's
+cagey
+cageyness
+cahoot
+cahoots
+cairn
+cairned
+cairns
+calamitous
+calamitously
+calamitousness
+calcareous
+calcareously
+calcareousness
+calcification
+calcified
+calcify
+calcite
+calculability
+calculable
+calculableness
+calculi
+calfskin
+californium
+caliphate
+calisthenic
+calisthenics
+callable
+callee
+callee's
+calligraph
+calligrapher
+calligraphers
+calligraphy
+calliope
+callow
+callowness
+caloric
+calorimeter
+calorimeter's
+calorimeters
+calorimetric
+calorimetry
+calumniate
+calumniated
+calumniation
+calumny
+calvary
+calve
+calving
+calypso
+cam
+camaraderie
+camber
+cambered
+cambering
+camellias
+cameo
+cameos
+cameraman
+cameramen
+campesinos
+campfire
+campground
+campgrounds
+campsite
+campsites
+cams
+cancerous
+cancerously
+candidacy
+candlelight
+candlelighter
+canine
+canines
+canister
+canisters
+cannabis
+canneries
+cannery
+cannibalism
+cannibalism's
+cannibalistic
+cannier
+canniness
+cannonball
+canny
+canonic
+canonist
+cant
+cantaloupe
+cantaloupe's
+cantaloupes
+canted
+canteen
+canteens
+canter
+cantered
+canticle
+cantilever
+cantilevers
+canting
+canvasback
+capacitate
+capacitative
+capitalistic
+capitulate
+capitulated
+capitulates
+capitulation
+caprice
+capsize
+capsized
+capsizes
+capsizing
+capstan
+capstans
+capstone
+capsule
+capsuled
+capsules
+capsuling
+captaincy
+captious
+captiously
+captiousness
+caramel
+caraway
+carbide
+carbine
+carbines
+carbonaceous
+carbonyl
+carborundum
+carboy
+carbuncle
+carbuncled
+carcinogen
+carcinogenic
+carcinogens
+carcinoma
+cardiology
+cardiomegaly
+cardiovascular
+careen
+careened
+careening
+careerism
+caretaker
+caretakers
+careworn
+caricature
+caricatured
+caricatures
+caricaturist
+carload
+carloading
+carloads
+carmine
+carnage
+carnal
+carnality
+carnally
+carob
+carouse
+caroused
+carouser
+carousing
+carp
+carped
+carpentry
+carper
+carping
+carpingly
+carport
+carps
+carrageen
+carrel
+carrels
+carrion
+carte
+cartels
+cartilage
+cartographer
+cartographers
+cartographic
+cartoonist
+cartoonists
+cartwheel
+cartwheeler
+cartwheels
+carven
+casbah
+casebook
+casebooks
+casein
+casework
+caseworker
+caseworkers
+cashew
+cashews
+cashmere
+casino
+casinos
+cassette
+cassettes
+cassock
+cassocked
+castanet
+castanets
+castigate
+castigated
+castigates
+castigation
+castor
+cataclysmic
+catalysis
+catalytic
+catalytically
+catapult
+catapulted
+catapulting
+catapults
+catastrophically
+catatonia
+catbird
+catchier
+catchword
+catchwords
+catchy
+catechism
+catecholamine
+catecholamines
+categoric
+catenate
+catenation
+catfish
+catharsis
+cathodic
+catholicism
+catlike
+catnip
+cattail
+cattier
+catties
+cattiness
+cattleman
+cattlemen
+catty
+catwalk
+catwalk's
+catwalks
+caucus
+caucuses
+caucusing
+cauliflower
+cauliflowers
+caulk
+caulker
+caulks
+causate
+causative
+causatively
+cautionary
+cavalcade
+cavalcades
+cavalrymen
+caveman
+cavemen
+cavernous
+cavernously
+caviar
+cavil
+cavort
+cavorted
+cavorting
+cayenne
+cede
+ceded
+ceder
+cedilla
+ceding
+celebrant
+celebrants
+celerity
+celesta
+cello
+cellophane
+cellos
+cellulose
+celluloses
+censorial
+centaur
+centaurs
+centenary
+centennial
+centennially
+centigrade
+centigrades
+centrality
+centrifugal
+centrifugally
+centrifugals
+centrifugate
+centrifugation
+centrist
+centroid
+centroids
+ceramic
+ceramics
+cerate
+cerated
+cerebellum
+cerebrate
+cerebrated
+cerebrates
+cerebrating
+cerebration
+cerebrations
+ceremonious
+ceremoniously
+ceremoniousness
+cerise
+cerium
+certiorari
+certitude
+certitudes
+cerulean
+cervical
+cesium
+cession
+cetera
+ceteras
+chainlike
+chairlady
+chairwoman
+chairwomen
+chaise
+chalkline
+chalky
+chambermaid
+chambermaids
+chamfer
+chamfered
+chamfering
+chamfers
+chamois
+champ
+champers
+champs
+chanceries
+chancery
+chancier
+chanciness
+chancy
+chantey
+chantries
+chantry
+chaparral
+chaperone
+chaperones
+chapping
+charisma
+charismatic
+charitably
+charlatans
+charred
+chartist
+chartists
+chartreuse
+chartroom
+chartrooms
+charwomen
+chassis
+chastisement
+chastisements
+chastity
+chateaux
+chatted
+chattel
+chattels
+chattier
+chattiness
+chatting
+chatty
+chaw
+checkerboard
+checkerboards
+checklist
+checklists
+checksummed
+checksumming
+checkup
+checkups
+cheekbone
+cheekbones
+cheekier
+cheekiness
+cheeky
+cheerleader
+cheerleaders
+cheesecloth
+cheesier
+cheesiness
+cheesy
+cheetah
+chelate
+chelated
+chelating
+chelation
+chelations
+chemic
+chemotherapy
+chemotherapy's
+chevalier
+chevron
+chevroned
+chianti
+chic
+chicanery
+chicly
+chicness
+chicory
+chiefdom
+chiefdoms
+chigger
+chiggers
+chilblain
+chilblains
+childbearing
+childbirth
+childless
+childlessness
+childlike
+childlikeness
+childrearing
+chili
+chimera
+chimeric
+chimpanzee
+chimpanzees
+china
+chinchilla
+chinless
+chipboard
+chipped
+chipper
+chipping
+chiropractor
+chiropractors
+chive
+chives
+chivying
+chlorate
+chloride
+chlorides
+chlorinate
+chlorinated
+chlorinates
+chlorination
+chloroform
+chlorophyll
+choirmaster
+chokeberry
+cholesterol
+cholinesterase
+chomp
+choosier
+choosy
+choppier
+choppiness
+choppy
+chorale
+chorales
+chordal
+chordata
+chordate
+choreograph
+choreographed
+choreographer
+choreographers
+choreographic
+choreography
+chorines
+chortle
+chortled
+chortles
+chortling
+chow
+chowder
+chowders
+chrissake
+chromate
+chromatic
+chromaticness
+chromatics
+chromatogram
+chromatogram's
+chromatograms
+chromatograph
+chromatographic
+chromatography
+chrome
+chromed
+chromes
+chromic
+chroming
+chromite
+chromium
+chromosphere
+chronically
+chronograph
+chronography
+chrysalis
+chrysanthemum
+chrysanthemum's
+chrysanthemums
+chub
+chubs
+chug
+chugging
+chugs
+chummier
+chumminess
+chumming
+chummy
+chunkier
+chunky
+churchgoers
+churchgoing
+churchmen
+churchwoman
+churchwomen
+churl
+churls
+chutney
+chutneys
+ciao
+cicada
+cicadas
+cilia
+ciliate
+ciliated
+ciliately
+ciliates
+cinch
+cinches
+cinema
+cinemas
+cinematic
+cinnabar
+circa
+circlet
+circulant
+circulatory
+circumcise
+circumcised
+circumciser
+circumcises
+circumcising
+circumcision
+circumcisions
+circumferential
+circumferentially
+circumpolar
+circumscribe
+circumscribed
+circumscribes
+circumscribing
+circumscriptions
+circumspection
+circumspections
+circumsphere
+circumvention
+circumventions
+citizenry
+citrate
+citrated
+citric
+citron
+citrus
+citruses
+cityscape
+cityscapes
+citywide
+civet
+cladding
+clairvoyance
+clammier
+clamminess
+clamming
+clammy
+clamshell
+clamshells
+clandestine
+clandestinely
+clandestineness
+clank
+clanked
+clanking
+clankingly
+clannish
+clannishly
+clannishness
+clapboard
+clapboards
+clapped
+clapping
+claret
+clarets
+clarinet
+clarinets
+clarion
+classicist
+classier
+classiest
+classificatory
+classiness
+classless
+classlessness
+classy
+clattery
+claustrophobia
+claustrophobic
+clave
+claver
+clavicle
+clavicle's
+clavicles
+clearcut
+clearheaded
+clearheadedly
+clearheadedness
+clearinghouse
+cleat
+cleated
+cleating
+cleats
+clemence
+clemency
+clement
+clemently
+clements
+clergymen
+cleric
+clerics
+clientele
+cliffhanging
+climactic
+climatological
+climatologically
+climatology
+clinician
+clinicians
+clinometer
+clinometer's
+clinometers
+clipboard
+clipboards
+cloakroom
+cloakrooms
+clockwatcher
+cloddish
+cloddishness
+clodhopper
+clodhopper's
+clodhoppers
+clomp
+clomped
+clomping
+clomps
+closeup
+closeups
+clot
+clothbound
+clothesbrush
+clothesline
+clotheslines
+clothesman
+clothesmen
+clothier
+clotted
+clotting
+cloture
+clotured
+clotures
+cloturing
+cloudburst
+cloudbursts
+cloy
+cloying
+cloyingly
+clubhouse
+clubroom
+clubrooms
+clunkiness
+clunky
+clunkyly
+cm
+coachmen
+coachwork
+coadjutor
+coagulable
+coalescence
+coalescent
+coastline
+coattail
+coattails
+coauthor
+cobalt
+cobble
+cobbled
+cobbles
+cobblestone
+cobblestoned
+cobblestones
+cobbling
+coble
+cobra
+cocaine
+cochineal
+cochlea
+cockatoo
+cockcrow
+cockeye
+cockeyed
+cockeyedly
+cockeyedness
+cockier
+cockiness
+cockle
+cocklebur
+cockleshell
+cockpit
+cockpits
+cockscomb
+cocksure
+cocky
+coda
+coddle
+coddled
+coddler
+coddles
+coddling
+codebook
+codebooks
+codebreak
+codetermine
+codetermines
+codfish
+codicil
+coed
+coedited
+coediting
+coeditor
+coeditor's
+coeditors
+coedits
+coeds
+coeducation
+coequal
+coequally
+coercible
+coexistent
+coextensive
+coextensively
+cofactor
+cofactors
+coffeecup
+coffeepot
+cog
+cognac
+cognate
+cognately
+cognates
+cognation
+cognations
+cogs
+cohabitational
+coherency
+cohort
+cohort's
+cohorts
+coiffure
+coiffured
+coincident
+coincidently
+coital
+coitally
+coitus
+cola
+colander
+colanders
+colatitude
+colatitudes
+coleus
+colicky
+coliform
+coliseum
+collagen
+collapsibility
+collapsible
+collarbone
+collard
+collectivities
+collegian
+collegians
+collimate
+collimated
+collimates
+collimating
+collimation
+collinear
+collinearity
+collocation
+colloidal
+colloidally
+colloquia
+colloquial
+colloquialism
+colloquialism's
+colloquialisms
+colloquially
+colloquium
+collude
+colluded
+colludes
+colluding
+collusion
+collusions
+colonialism
+colonialist
+colonnade
+colonnaded
+colonnades
+coloration
+coloratura
+coltish
+coltishly
+coltishness
+columbines
+columnist
+columnists
+coma
+comas
+comatose
+combatted
+combinable
+combo
+combos
+combustible
+combustibles
+comeback
+cometary
+comeuppance
+commando
+commandos
+commendable
+commendatory
+commensurable
+commercialism
+commies
+commingle
+commingled
+commiserate
+commiserated
+commiserates
+commiserating
+commiseration
+commiserative
+commissary
+committable
+committal
+committeeman
+committeemen
+committeewoman
+committeewomen
+commodious
+commodiously
+commodiousness
+communicable
+communicational
+communique
+communiques
+communism
+communistic
+commutable
+commutate
+commutated
+commutates
+commutating
+commutation
+commutations
+compaction
+compatriot
+compatriots
+compellable
+compendia
+compensable
+competencies
+competency
+complacency
+complacent
+complainant
+complainants
+complaisance
+complaisant
+complaisantly
+complementarity
+complementation
+compliant
+compliantly
+comport
+comported
+comportment
+compositor
+compositors
+compost
+compote
+compressibility
+compressor
+compressors
+compulsive
+compulsively
+compulsiveness
+compulsives
+compulsivity
+con
+concave
+conceptuality
+concertina
+concertmaster
+concerto
+concertos
+concessionaire
+concessionaires
+conch
+conches
+concierge
+concierges
+conciliate
+conciliated
+conciliates
+conciliation
+conciliations
+conciliative
+conciliator
+conciliatory
+conclave
+conclaves
+concoct
+concocted
+concocter
+concoctive
+concocts
+concordance
+concordant
+concordantly
+concourse
+concourses
+concubine
+concubines
+concussion
+concussions
+condemnate
+condemnatory
+condensate
+condensates
+condensations
+condensible
+condescension
+condiment
+condiments
+condo
+condo's
+condolence
+condolences
+condominium
+condominium's
+condominiums
+condoms
+condos
+conduce
+conduced
+conduces
+conducing
+conductance
+conductances
+coneflower
+coney
+confabulate
+confabulated
+confabulates
+confabulation
+confabulations
+confect
+confectionery
+confects
+conferee
+conferees
+conferrable
+confessional
+confessionally
+confessionals
+confirmatory
+confiscatory
+conflagration
+conflagrations
+confluent
+confluents
+conformal
+conformance
+conformation
+conformation's
+conformational
+conformationally
+conformations
+conformist
+conformists
+confrontational
+confute
+confuted
+confuter
+confutes
+confuting
+congeal
+congealed
+congealing
+congeals
+congeniality
+congenital
+congenitally
+congest
+congesting
+congestive
+congests
+conglomerate
+conglomerated
+conglomerates
+conglomeration
+conglomerations
+conglomerative
+congratulatory
+congregationalism
+congregationalist
+congregationalists
+congressmen
+congresswoman
+congresswomen
+congruity
+congruous
+congruously
+congruousness
+conic
+conical
+conically
+conicalness
+conics
+conifer
+coniferous
+conifers
+conjectural
+conjecturally
+conjoin
+conjoining
+conjoins
+conjoint
+conjointly
+conjugal
+conjugally
+conjugate
+conjugated
+conjugately
+conjugateness
+conjugates
+conjugating
+conjugation
+conjugations
+conjugative
+conjuncture
+conjunctures
+conk
+conked
+conker
+conkers
+conking
+conks
+conn
+conned
+conner
+conning
+connivance
+connive
+connived
+conniver
+connives
+conniving
+connotation
+connotations
+connotative
+connotatively
+connubial
+connubially
+conquistador
+conquistadores
+conquistadors
+consanguine
+consanguineous
+consanguineously
+consanguinity
+conscionable
+conscript
+conscripted
+conscripting
+conscription
+conscriptions
+conscripts
+consensual
+consensually
+conservator
+conservatory
+consistence
+consonance
+consonantal
+conspiratorial
+conspiratorially
+constance
+consternate
+consternated
+consternates
+consternating
+constrict
+constricted
+constricting
+constriction
+constrictions
+constrictive
+constrictor
+constrictors
+constricts
+constructional
+constructionally
+consular
+cont'd
+contaminant
+contaminants
+contentious
+contentiously
+contentiousness
+contestant
+contestants
+continence
+continuant
+contort
+contorted
+contorting
+contortion
+contortions
+contortive
+contorts
+contraband
+contrabass
+contraception
+contraceptive
+contraceptives
+contradictorily
+contraindicate
+contraindicated
+contraindicates
+contraindicating
+contraindication
+contraindication's
+contraindications
+contraindicative
+contrarily
+contravene
+contravened
+contravener
+contravenes
+contravening
+contravention
+contrite
+contritely
+contriteness
+contrition
+controversialists
+controvertible
+contumacy
+contumely
+contusion
+contusions
+convalesce
+convalescent
+convalescing
+convection
+convections
+conventionality
+conversationalist
+convexity
+conveyor
+conveyors
+convivial
+convivially
+convocation
+convocations
+convoke
+convoked
+convokes
+convoking
+convolute
+convolutely
+convolution
+convolutions
+convolve
+convolved
+convolves
+convolving
+convulse
+convulsed
+convulses
+convulsing
+convulsive
+convulsively
+convulsiveness
+cookbook
+cookbooks
+coolant
+coolants
+coolheaded
+coplanar
+copolymer
+copolymers
+copperhead
+coppersmith
+coppersmiths
+coppery
+copter
+copters
+copybook
+copybooks
+copyist
+copywriter
+coquette
+coquetted
+coquetting
+cordage
+cordite
+cordon
+corduroy
+corduroys
+coriander
+corkscrew
+corkscrews
+cornbread
+cornea
+cornet
+cornflower
+cornier
+corniest
+corniness
+cornmeal
+cornstarch
+cornucopia
+corny
+corona
+coronal
+coronate
+coroner
+coroners
+corporeal
+corporeality
+corporeally
+corporealness
+corpsman
+corpsmen
+corpulence
+corpulences
+corpulent
+corpulently
+corpulentness
+corpulentnesses
+corpuscular
+corral
+corralled
+corralling
+corrals
+corrigendum
+corrigible
+corrode
+corroded
+corrodes
+corrodible
+corroding
+corrosive
+corrosively
+corrosiveness
+corrosives
+corrugate
+corrugated
+corrugates
+corrugating
+corrugation
+corrugations
+corruptible
+corsage
+corsages
+cortex
+cortexes
+cortical
+cortically
+corticosteroid
+corticosteroids
+cortisone
+corundum
+coruscate
+coruscated
+coruscates
+coruscating
+coruscation
+coruscations
+corvette
+cosily
+cosmic
+cosmical
+cosmically
+cosmological
+cosmologically
+cosmologist
+cosmologist's
+cosmologists
+cosmopolitanism
+cosmos
+cosmoses
+cosponsor
+cosponsored
+cosponsors
+cossack
+cossacks
+cosy
+cotangent
+coterminous
+coterminously
+cotillion
+cotter
+cotters
+cottonmouth
+cottonseed
+cottonwood
+cottony
+cougar
+cougars
+could've
+coulomb
+councilman
+councilmen
+councilwoman
+councilwomen
+counterargument
+counterarguments
+counterattack
+counterattacker
+counterbalance
+counterbalanced
+counterbalances
+counterbalancing
+counterclaim
+countercyclical
+counterflow
+counterforce
+counterintuitive
+counterman
+countermand
+countermanded
+countermanding
+countermands
+countermen
+counterpoise
+counterproposal
+countersink
+countersinking
+countersinks
+countersunk
+countervail
+countervailed
+countervailing
+countervails
+counterweight
+counterweight's
+counterweighted
+counterweighting
+counterweights
+countrified
+countrify
+countrymen
+countrywide
+coup
+coupe
+couplet
+couplet's
+couplets
+coups
+courtesan
+covalent
+covalently
+covariance
+covariances
+covariant
+covariants
+covariate
+covariates
+covariation
+covary
+coven
+coverall
+coveralled
+coveralls
+covington
+cowbell
+cowbird
+cowbirds
+cowhand
+cowhands
+cowherd
+cowhide
+cowhided
+cowhiding
+cowlick
+coworker
+coworker's
+coworkers
+cowpoke
+cowpony
+cowpox
+cowpunch
+cowpuncher
+coxcomb
+coxcombs
+coy
+coyly
+coyness
+cozen
+crabapple
+crabbed
+crabbedly
+crabbedness
+crabbing
+crackpot
+crackpots
+craftsmanship
+craftsmen
+craftspeople
+craggier
+cragginess
+craggy
+crammed
+cramming
+cranelike
+crania
+cranium
+crankcase
+crankshaft
+crannied
+crannies
+cranny
+crappie
+crappier
+crass
+crassest
+crassly
+crassness
+craw
+crawlspace
+crawlway
+crawly
+crayfish
+crayon
+crayons
+creakier
+creaky
+creamery
+creationism
+creationism's
+credent
+credential
+credentials
+credenza
+credo
+credos
+creedal
+creekside
+creepier
+creepiness
+creepy
+crematory
+crescendo
+cress
+crestfallen
+crestfallenly
+crestfallenness
+cretinous
+crewcut
+crewel
+crewman
+crewmen
+cribbing
+criminality
+crimp
+crimped
+crimper
+crimping
+crimps
+crinkle
+crinkled
+crinkles
+crinkling
+crinkly
+criss
+crisscross
+crisscrossed
+crisscrosses
+criticality
+crock
+crocked
+crocker
+crockery
+crocks
+crocodile
+crocodiles
+crocus
+crocuses
+croft
+crofter
+crofters
+crone
+crones
+cronies
+crony
+croon
+crooned
+crooner
+crooners
+crooning
+croons
+crossarm
+crosshatch
+crosshatched
+crosshatches
+crosshatching
+crosspoint
+crossproduct
+crossproducts
+crossroad
+crossroading
+crossroads
+crosstalk
+crosswalk
+crossway
+crossways
+crosswise
+crotch
+crotched
+crotches
+crotchetiness
+crotchety
+croupier
+croutons
+crowbait
+crowbar
+crowbar's
+crowbars
+crowfoot
+crowfoots
+crucible
+crucifix
+crucifixion
+crud
+cruddy
+crudities
+crudity
+cruft
+crufty
+crummier
+crummies
+crummy
+crump
+crushproof
+cryogenic
+cryogenics
+cryostat
+crypt
+cryptanalyst
+cryptanalytic
+cryptogram
+cryptogram's
+cryptograms
+cryptographer
+cryptologic
+cryptological
+cryptologist
+crypts
+crystallite
+crystallites
+crystallographer
+crystallographers
+crystallographic
+crystallography
+cubbyhole
+cubicles
+cubism
+cubist
+cubists
+cud
+cuddlier
+cuddly
+cufflink
+cufflinks
+cuisine
+culinary
+culpa
+culpable
+culpableness
+culpas
+cultist
+cultists
+cultivable
+culvert
+cumin
+cumulate
+cumulated
+cumulates
+cumulating
+cumulation
+cumulations
+cumulus
+cupcakes
+cupidity
+cupric
+cuprous
+curate
+curative
+curatively
+curator
+curators
+curbside
+curd
+curdle
+curdled
+curdles
+curdling
+curia
+curiae
+curie
+curio
+curios
+curlicue
+curricula
+curtsey
+curtseyed
+curtseying
+curtseys
+curvaceous
+curvaceously
+curvilinear
+curvilinearity
+curvilinearly
+cushiest
+cushy
+custodial
+customhouse
+customhouses
+cutaneous
+cutaneously
+cutback
+cutbacks
+cutlass
+cutlet
+cutlets
+cutout
+cutouts
+cutthroat
+cuttlebone
+cuttlebones
+cuttlefish
+cuttlefishes
+cutworm
+cyanate
+cyanic
+cyanide
+cyclical
+cyclist
+cyclists
+cyclohexanol
+cyclopean
+cyclops
+cylindric
+cynic
+cynicism
+cynics
+cytochemistry
+cytolysis
+cytoplasm
+czarevitch
+czarina
+czarism
+czarist
+czarship
+d'art
+d'etat
+d'etre
+d'oeuvre
+d's
+dab
+dabbed
+dabbing
+dabs
+dachshund
+dactyl
+dactylic
+dactyls
+daffier
+daffy
+dairyland
+dairyman
+dairymen
+dais
+daises
+dallied
+dallier
+dally
+dallying
+dammed
+damming
+dammit
+dancelike
+dandily
+dang
+danged
+dank
+dankly
+dankness
+dapper
+dapperly
+dapperness
+dapple
+dappled
+dapples
+dappling
+dashboard
+dashboards
+dastard
+dastardliness
+dastardly
+databanks
+datafile
+datagram
+datagram's
+datagrams
+dataset
+datasets
+dateline
+datelined
+datelines
+daub
+daubed
+dauber
+daubs
+davenport
+davits
+dawdle
+dawdled
+dawdler
+dawdlers
+dawdles
+dawdling
+daybed
+deaconess
+deactivate
+deactivated
+deactivates
+deactivating
+deactivation
+deadhead
+deadheads
+deadweight
+deadwood
+dealerships
+dearie
+deassign
+deassigns
+deathbed
+deathward
+debacle
+debacles
+debar
+debarring
+debars
+debase
+debased
+debaser
+debases
+debasing
+debauch
+debauched
+debauchedly
+debauchedness
+debaucher
+debauchery
+debauches
+debenture
+debentures
+debility
+debit
+debited
+debiting
+debits
+debonair
+debonairly
+debonairness
+debrief
+debriefed
+debriefing
+debriefs
+debunk
+debunker
+debunking
+debunks
+debut
+debutante
+debutante's
+debutantes
+debuting
+debuts
+decaffeinate
+decaffeinated
+decaffeinates
+decaffeinating
+decal
+decant
+decanted
+decanter
+decanters
+decanting
+decants
+decapitated
+decathlon
+decathlons
+decedent
+decennial
+decennially
+decertification
+decertify
+dechlorinate
+dechlorinated
+dechlorinates
+dechlorination
+decibel
+decibels
+deciduous
+deciduously
+deciduousness
+decile
+decisional
+declaim
+declaimed
+declaimer
+declaiming
+declaims
+declamation
+declamations
+declamatory
+declarator
+declarators
+declaratory
+declassification
+declassifications
+declassify
+declension
+declensions
+declivity
+decolletage
+decolletages
+decollimate
+decompress
+decompressed
+decompresser
+decompresses
+decompressing
+decontaminated
+decontrol
+decontrolled
+decontrolling
+decor
+decorator
+decorators
+decorous
+decorously
+decorousness
+decorticate
+decorticated
+decorticates
+decorticating
+decortication
+decried
+decrier
+decries
+decry
+decrying
+decrypt
+decrypted
+decrypting
+decryption
+decrypts
+deductibility
+deductible
+deductibles
+deemphasis
+deerskin
+deerskins
+deerstalker
+deface
+defacement
+defacer
+defaces
+defacing
+defame
+defamed
+defamer
+defames
+defaming
+defecate
+defecated
+defecates
+defecating
+defecation
+defecations
+defensible
+deferent
+deferents
+deflate
+deflated
+deflater
+deflates
+deflating
+deflation
+deflect
+deflected
+deflecting
+deflection
+deflections
+deflective
+deflector
+deflects
+defocus
+defocusing
+deforestation
+deform
+deformational
+deforming
+deforms
+defraud
+defrauded
+defrauder
+defrauding
+defrauds
+defray
+defrayed
+defraying
+defrays
+defrost
+defrosted
+defroster
+defrosting
+defrosts
+deft
+defter
+deftest
+deftness
+defunct
+degrease
+degum
+degumming
+dehumidification
+dehumidifications
+dehumidified
+dehumidifier
+dehumidify
+dehydrate
+dehydrated
+dehydrates
+dehydrating
+dehydration
+deification
+deify
+deja
+deject
+dejection
+delectable
+delectableness
+delectation
+delegable
+deleterious
+deleteriously
+deleteriousness
+deli
+deli's
+delicatessen
+delicti
+delimitation
+delirium
+deliriums
+delis
+deliveryman
+deliveryman's
+deliverymen
+deliverymen's
+delouse
+deloused
+delouses
+delousing
+deltoid
+deltoids
+delusive
+delusively
+delusiveness
+deluxe
+demagnification
+demagnify
+demagogue
+demagogues
+demarcate
+demarcated
+demarcates
+demarcating
+demarcation
+demean
+demeaned
+demeaning
+demeans
+demented
+dementedly
+dementedness
+demerit
+demerits
+demigod
+demiscible
+demit
+demitted
+demitting
+demographer
+demographer's
+demographers
+demographical
+demographically
+demography
+demoniac
+demonic
+demonstrably
+demote
+demoted
+demotes
+demoting
+demotion
+demountable
+demultiplex
+demurred
+demurrer
+demurring
+denature
+denatured
+denatures
+denaturing
+denim
+denims
+denominate
+denominated
+denominationally
+denominative
+denouement
+densitometer
+densitometer's
+densitometers
+densitometric
+densitometry
+dentistry
+denture
+dentures
+denude
+denuded
+denuder
+denudes
+denuding
+denumerable
+denunciate
+denunciated
+denunciates
+denunciating
+denunciation
+denunciations
+denunciative
+deodorant
+deodorant's
+deodorants
+deoxyribonucleic
+depiction
+depictions
+deplorably
+deployable
+depositary
+depository
+depravities
+depravity
+deprecate
+deprecated
+deprecates
+deprecating
+deprecatingly
+deprecation
+deprecations
+deprecatory
+depreciable
+depredations
+depressant
+depressants
+depressible
+depressors
+deputation
+deputations
+depute
+deputed
+deputes
+deputing
+derange
+deranged
+derangement
+deranges
+deranging
+deregulate
+derelict
+dereliction
+derelicts
+derisive
+derisively
+derisiveness
+derivate
+derogate
+derogated
+derogates
+derogating
+derogation
+derogative
+derogatory
+derrick
+derricked
+derricking
+derricks
+derriere
+dervish
+dervishes
+descant
+descendent
+descendent's
+descendents
+desecrate
+desecrated
+desecrater
+desecrates
+desecration
+desegregate
+desegregated
+desegregates
+desegregating
+desegregation
+desist
+desorption
+desperado
+desperadoes
+despicably
+despoil
+despoiled
+despoiler
+despoilers
+despoiling
+despoils
+despond
+despondency
+despondent
+despondently
+despotism
+dessicate
+destinate
+destruct
+destructor
+destructs
+desuetude
+desultoriness
+desultory
+detachable
+detente
+detentions
+deter
+detergency
+detergent
+detergents
+determinability
+deterred
+deterrence
+deterrent
+deterrently
+deterrents
+deterring
+deters
+detersive
+detersives
+detestation
+detestations
+detonable
+detonator
+detonator's
+detonators
+detour
+detoured
+detouring
+detours
+detrimental
+detrimentally
+detune
+detuned
+detunes
+detuning
+deuce
+deuced
+deucedly
+deuces
+deucing
+deus
+deuterium
+deuteriums
+devaluation
+devalue
+devalued
+devalues
+devaluing
+deviance
+deviances
+devious
+deviously
+deviousness
+devoice
+devoiced
+devoices
+devoicing
+devolve
+devolved
+devolves
+devolving
+devotional
+devotionally
+dewar
+dewars
+dexter
+dextrous
+diabase
+diabetic
+diabetics
+diabolic
+diabolical
+diabolically
+diabolicalness
+diachronic
+diachronicness
+diacritical
+diacritically
+diacriticals
+diagnometer
+diagnometer's
+diagnometers
+diagnostician
+diagnosticians
+diagrammaticality
+dialectal
+dialectally
+dialectic
+dialectical
+dialectically
+dialectics
+dialysis
+diamagnetic
+diametric
+diaphanous
+diaphanously
+diaphanousness
+diathermy
+diathesis
+diatom
+diatomic
+diatoms
+diatonic
+dichloride
+dichotomous
+dichotomously
+dichotomousness
+dick
+dicker
+dickered
+dickering
+dickers
+dickey
+dicks
+dicotyledon
+dictatorial
+dictatorially
+dictatorialness
+didactic
+didactics
+diddle
+diddled
+diddler
+diddling
+diehard
+diehards
+diem
+diesel
+diesels
+dietaries
+dietary
+dietetic
+dietetics
+diethylaminoethyl
+diethylstilbestrol
+dietician
+dieticians
+differentiability
+differentiable
+differentiator
+difficile
+diffidence
+diffident
+diffidently
+diffract
+diffracted
+diffracting
+diffraction
+diffractions
+diffractometer
+diffractometer's
+diffractometers
+diffracts
+diffusible
+digitalis
+dignitaries
+dignitary
+digram
+dihedral
+dilapidate
+dilapidated
+dilapidates
+dilapidating
+dilapidation
+dilatation
+dilator
+dilatoriness
+dilatory
+dilettante
+dilettantes
+dilithium
+dill
+dillinger
+dilogarithm
+dimensionless
+dimethyl
+dimethylglyoxime
+ding
+dinghies
+dinghy
+dingo
+dinnertime
+dinnerware
+dinosaur
+dinosaurs
+diocesan
+diocese
+diorama
+dioramas
+dioxalate
+diphthong
+diphthongs
+dipodic
+dipody
+dipole
+dipole's
+dipoles
+directivity
+directorate
+directorship
+directrices
+directrix
+direful
+direfully
+disablement
+disaffected
+disaffectedly
+disaffectedness
+disaffection
+disaffiliate
+disaffiliated
+disaffiliates
+disaffiliating
+disaffiliation
+disaggregate
+disaggregated
+disaggregating
+disaggregation
+disaggregative
+disapprobation
+disarranged
+disarray
+disarrays
+disarticulated
+disassembly
+disavow
+disavowal
+disavowals
+disavowed
+disavowing
+disavows
+disbar
+disbars
+disbelief
+discipleship
+discomfit
+discomfited
+discomfiting
+discomfits
+discontinuation
+discordant
+discordantly
+discorporate
+discorporated
+discourteous
+discourteously
+discourteousness
+discrepant
+discrepantly
+discretionary
+discriminable
+discriminant
+discursive
+discursively
+discursiveness
+discus
+discuses
+discussant
+discussants
+disdainful
+disdainfully
+disdainfulness
+disembodied
+disembowel
+disembowels
+disenchantment
+disengagement
+disequilibrium
+disgruntle
+disgruntles
+disgruntling
+disgustful
+disgustfully
+disharmony
+dishevel
+dishevels
+dishonesty
+dishwater
+disincentives
+disinclination
+disincorporated
+disinherit
+disinheritance
+disinherited
+disinheriting
+disinherits
+disintegrate
+disintegrated
+disintegrates
+disintegrating
+disintegration
+disintegrations
+disintegrative
+disinterest
+disinterred
+disjoin
+diskette
+diskettes
+dislodgement
+disloyal
+disloyally
+disloyalty
+dismantle
+dismantled
+dismantles
+dismantling
+dismembered
+dismemberment
+disobedient
+disobediently
+disoriented
+disparage
+disparaged
+disparagement
+disparager
+disparages
+disparaging
+disparagingly
+dispassionate
+dispassionately
+dispassionateness
+dispensary
+dispensate
+dispersal
+dispersement
+dispersible
+dispositional
+dispossessed
+dispossession
+disproportion
+disproportional
+disproportionate
+disproportionately
+disproportionation
+disputable
+disputant
+disquietude
+disquisition
+disrepair
+disreputable
+disreputableness
+disrepute
+disrespect
+disrobe
+dissect
+dissected
+dissecting
+dissection
+dissects
+dissemble
+dissembled
+dissembler
+dissembling
+dissimulation
+dissociable
+dissonant
+dissonantly
+dissuade
+dissuaded
+dissuader
+dissuades
+dissuading
+distaff
+distaffs
+distend
+distended
+distension
+distillate
+distillates
+distillations
+distilleries
+distillery
+distortable
+distributorship
+disulfide
+disunion
+disunited
+disunity
+disuse
+disused
+disvalues
+disyllable
+dither
+dithered
+ditherer
+dithering
+ditties
+ditto
+dittos
+ditty
+diurnal
+diva
+divalent
+diversionary
+divertimento
+divestiture
+divination
+divisible
+divisional
+divisive
+divisively
+divisiveness
+divorcee
+divorcees
+divvied
+divvies
+divvying
+dizzily
+doable
+docile
+docilely
+docket
+docketed
+docketing
+dockets
+dockside
+dockyard
+doctrinaire
+doctrinal
+doctrinally
+dodecahedra
+dodecahedral
+dodecahedron
+doe
+doff
+doffing
+doffs
+doggone
+doggoned
+doggoning
+doghouse
+dogleg
+dogmatic
+dogmatically
+dogmatics
+dogtooth
+dogtrot
+dogwood
+doldrum
+doldrums
+dolomite
+dolomites
+dolomitic
+dolt
+doltish
+doltishly
+doltishness
+domesticity
+domicile
+domiciled
+dominator
+domineer
+domineering
+domineeringly
+domineeringness
+domino
+donned
+donning
+donnish
+donnishly
+donnishness
+donnybrook
+donor
+donors
+donuts
+doodle
+doodled
+doodler
+doodles
+doodling
+doomsday
+doorbell
+doorkeep
+doorkeeper
+doorkeepers
+doorknob
+doorknobs
+doorman
+doormen
+dopant
+dorm
+dormer
+dosage
+dosages
+dosimeter
+dosimeter's
+dosimeters
+dosimetry
+dossier
+dossiers
+dotage
+dotard
+doubleheader
+doubleton
+doubloon
+dour
+dourly
+dourness
+dovetail
+dowager
+dowagers
+dowdier
+dowdies
+dowdiness
+dowdy
+dowel
+dower
+downbeat
+downgrade
+downgraded
+downgrades
+downgrading
+downhill
+downpour
+downside
+downslope
+downspout
+downswings
+downtrend
+downtrodden
+downturn
+downturns
+downwind
+dowries
+dowry
+dowse
+dowser
+dowses
+dowsing
+draftee
+draftees
+dragger
+dragnet
+dragonfly
+dragonhead
+dram
+dramatical
+dramaturgy
+dreadnought
+dreamboat
+dreamless
+dreamlessly
+dreamlessness
+dreamlike
+dreamt
+dreg
+dressier
+dressiness
+dressmaking
+dressy
+drib
+dribble
+dribbled
+dribbler
+dribbles
+dribbling
+dribs
+dripped
+drippier
+dripping
+drippy
+drizzle
+drizzled
+drizzles
+drizzling
+drizzlingly
+drizzly
+droll
+drollness
+dromedary
+droopier
+droopy
+drophead
+droplet
+droplets
+dropout
+dropouts
+drosophila
+dross
+drowse
+drowsed
+drowses
+drowsily
+drowsing
+drub
+drubbing
+drudge
+drudger
+drudges
+drudging
+drudgingly
+drugged
+drugging
+drugless
+drugstore
+drugstores
+druid
+drumhead
+dryer
+dryers
+dryness
+drywall
+dualism
+dubbed
+ducat
+duce
+duces
+duckling
+duct
+ducted
+ductile
+ducting
+ducts
+ductwork
+dud
+duds
+duet
+duets
+duff
+duffel
+duffer
+duffers
+dugout
+dukedom
+dulcet
+dulcetly
+dulcify
+dullard
+dumbfound
+dumbfounded
+dumbfounder
+dumbfounds
+dumpier
+dumpiness
+dumpy
+dun
+dung
+dunk
+dunker
+duopolist
+duopoly
+dupe
+duped
+duper
+dupes
+duping
+dupion
+duplex
+duplexer
+duplicable
+duplicity
+durational
+duress
+dustbin
+dustbins
+dutiable
+dwarves
+dwelt
+dyad
+dyadic
+dyads
+dynamical
+dynamism
+dynamo
+dynamos
+dynastic
+dysentery
+dyspeptic
+dysprosium
+dystopia
+dystrophy
+e'er
+e's
+eardrum
+eardrums
+earphone
+earphones
+earsplitting
+earthier
+earthiness
+earthmen
+earthmover
+earthmoving
+earthy
+easel
+eastbound
+easternmost
+easygoing
+easygoingness
+eatable
+eatables
+eave
+ebullient
+ebulliently
+ecclesiastic
+echelon
+echelons
+echinoderm
+eclectic
+eclectically
+ecliptic
+ecological
+ecologically
+ecologists
+econometric
+econometricians
+econometrics
+ecosystem
+ecosystems
+ecstatic
+ecstatics
+ecumenic
+ecumenic's
+ecumenical
+ecumenically
+ecumenicist
+ecumenicist's
+ecumenicists
+ecumenics
+ecumenist
+ecumenist's
+ecumenists
+ed
+edelweiss
+eden
+edgewise
+edgier
+edginess
+edgy
+edification
+edified
+edifies
+edify
+edifying
+editorialist
+editorship
+educe
+educing
+eelgrass
+eerily
+efface
+effaceable
+effaced
+effacer
+effaces
+effacing
+effectual
+effectualness
+effectuate
+effectuated
+effectuates
+effectuating
+effectuation
+efferent
+efferently
+effete
+effetely
+effeteness
+efficacious
+efficaciously
+efficaciousness
+effloresce
+efflorescent
+effluent
+effluents
+effluvia
+effluvium
+efflux
+effluxion
+effuse
+effused
+effuses
+effusing
+effusion
+effusive
+effusively
+effusiveness
+egalitarian
+egalitarianism
+egghead
+eggheaded
+eggheadedness
+eggplant
+eggshell
+egocentric
+egotism
+egotist
+egotistic
+egotistical
+egotistically
+egotists
+egregious
+egregiously
+egregiousness
+egress
+egret
+egrets
+eh
+eider
+eidetic
+eigenstate
+eigenstates
+eigenvector
+eigenvectors
+eightfold
+einsteinium
+ejection
+ejector
+ejectors
+elan
+elastomer
+electorate
+electress
+electrician
+electricians
+electro
+electrocardiogram
+electrocardiogram's
+electrocardiograms
+electrocardiograph
+electrodynamic
+electrodynamicly
+electrodynamics
+electroencephalogram
+electroencephalogram's
+electroencephalograms
+electrolysis
+electromagnet
+electromagnetism
+electromagnetisms
+electromagnets
+electromyograph
+electromyographic
+electromyographically
+electromyography
+electrophoresis
+electrophorus
+electroshock
+electroshocks
+electrostatic
+electrostatics
+electrotherapist
+electrotypers
+electroweak
+elegiac
+elegies
+elegy
+elephantine
+elfin
+elision
+elisions
+elite
+eliteness
+elites
+ellipsometer
+ellipsometer's
+ellipsometers
+ellipsometry
+ellipticity
+elocution
+elope
+eloped
+eloper
+elopes
+eloping
+eluate
+eluates
+elute
+eluted
+eluting
+elution
+elysian
+emaciate
+emaciates
+emaciating
+emaciation
+emanate
+emanated
+emanates
+emanation
+emanations
+emanative
+emancipate
+emancipated
+emancipates
+emancipating
+emasculate
+emasculated
+emasculates
+emasculating
+emasculation
+embalm
+embalmer
+embalmers
+embalming
+embalms
+embank
+embanked
+embanking
+embankment
+embankments
+embanks
+embarcadero
+embargo
+embargoed
+embargoes
+embargoing
+embattle
+embattled
+embattles
+embattling
+embedder
+embezzlement
+embittered
+emblematic
+embolden
+emboldened
+emboldens
+emboss
+embossed
+embosser
+embossers
+embosses
+embossing
+embower
+embraceable
+embrittle
+embroil
+embroiled
+embroiling
+embroils
+embryonic
+emcee
+emceed
+emend
+emendable
+emender
+emeritus
+emirate
+emissaries
+emissary
+emission
+emission's
+emissions
+emissivities
+emissivity
+emittance
+emitter
+emitters
+emitting
+emolument
+emoluments
+emotionalism
+emotionality
+empath
+empathetically
+empathic
+emphysema
+emphysematous
+empiric
+empiricism
+emplace
+employability
+emporium
+emporiums
+emulsification
+emulsified
+emulsifier
+emulsifies
+emulsify
+emulsion
+emulsions
+encampment
+encase
+encased
+encephalitis
+encephalographic
+enchain
+enchained
+enchantress
+enchiladas
+enclave
+enclaves
+encomium
+encomiums
+encore
+encored
+encores
+encoring
+encroach
+encroached
+encroacher
+encroaches
+encroaching
+encroachment
+encrust
+encrusted
+encrusting
+encrusts
+encumbrance
+encumbrancer
+encumbrances
+encyclical
+endearment
+endearments
+endemicity
+endgame
+endnote
+endnote's
+endnotes
+endogamous
+endogamy
+endogenous
+endogenously
+endosperm
+endothelial
+endothermic
+endpoint
+endpoints
+energetically
+enervate
+enervated
+enervates
+enervating
+enervation
+enervative
+enfeeble
+enfeebled
+enfeebles
+enfeebling
+enforceability
+enforceable
+enforcible
+engorge
+engorged
+engorges
+engorging
+engulfed
+engulfing
+engulfs
+enigma
+enjoinder
+enlargeable
+enmesh
+enmeshed
+enquiries
+enquiry
+enrapture
+enraptured
+enraptures
+enrapturing
+enrichment
+enrollee
+enrollees
+ensconced
+enshroud
+enslavement
+entailment
+entanglement
+enthalpy
+enthralled
+enthralling
+enthrone
+enthroned
+enthrones
+enthroning
+enthuse
+enthused
+enthuses
+enthusing
+enticements
+entitlement
+entitlements
+entomb
+entombed
+entomologist
+entomology
+entourage
+entourages
+entrain
+entrained
+entrainer
+entraining
+entrains
+entranceway
+entrant
+entrants
+entrap
+entrapment
+entrapments
+entrapped
+entraps
+entree
+entrees
+entrenchment
+entrenchments
+entrepreneurial
+entrepreneurship
+entwine
+entwined
+entwines
+entwining
+enunciable
+enunciate
+enunciated
+enunciates
+enunciating
+envenom
+envenomed
+envenoming
+envenoms
+enviable
+enviableness
+enzymatic
+enzymatically
+enzyme
+enzymes
+enzymology
+eohippus
+ephemerides
+ephemeris
+epicure
+epicurean
+epicycle
+epicycles
+epicyclic
+epicyclical
+epicyclically
+epidemiological
+epidemiologically
+epidemiology
+epidermic
+epidermis
+epigenetic
+epigram
+epigrammatic
+epigrams
+epigraph
+epigrapher
+epilepsy
+epileptic
+epileptics
+epilogue
+epilogues
+epiphany
+epiphenomena
+episcopate
+epistolatory
+epitaxy
+epithelial
+epithelium
+epitome
+epitomes
+epochal
+epochally
+epoxy
+equable
+equableness
+equanimities
+equanimity
+equestrian
+equestrians
+equidistant
+equidistantly
+equilateral
+equilaterals
+equilibrate
+equilibrated
+equilibrates
+equilibrating
+equilibration
+equilibria
+equine
+equines
+equinox
+equipotent
+equiproportional
+equiproportionality
+equiproportionate
+equivocal
+equivocally
+equivocalness
+equivocation
+eradicable
+erbium
+ergodic
+ergodicity
+erode
+eroded
+erodes
+erodible
+eroding
+erosible
+erosion
+erosive
+erosiveness
+erotic
+erotica
+erotically
+errancies
+errancy
+errant
+errantly
+errantry
+errants
+errata
+erratas
+erratically
+erratum
+ersatz
+erstwhile
+erudite
+eruditely
+erudition
+erupt
+erupted
+erupting
+eruptive
+eruptively
+erupts
+escadrille
+escapist
+escarpment
+escarpment's
+escarpments
+escritoire
+escrow
+escutcheon
+escutcheons
+esophagi
+esplanade
+espousal
+espousals
+essayists
+esters
+estimable
+estimableness
+estimator
+estimators
+estoppal
+estrange
+estranged
+estrangement
+estranger
+estranges
+estranging
+estuaries
+estuarine
+estuary
+et
+eta
+etas
+etcetera
+etceteras
+etched
+ethane
+ethanol
+ethicist
+ethicists
+ethnically
+ethnicities
+ethnicity
+ethnographers
+ethnographic
+ethnography
+ethnology
+ethnomethodology
+ethology
+ethos
+ethyl
+ethylene
+etymological
+etymologically
+etymologies
+etymology
+eucalyptus
+eugenic
+eugenics
+eulogies
+eulogy
+euphemist
+euphony
+euphoric
+eureka
+europium
+euthanasia
+evanescent
+evangelic
+evangelical
+evangelicalism
+evangelically
+evangelism
+evangelist
+evangelistic
+evangelists
+evasion
+evasions
+evasive
+evasively
+evasiveness
+evensong
+eventide
+eventides
+eventuate
+eventuated
+eventuates
+eventuating
+everyman
+evidential
+evidentially
+evildoer
+evildoers
+evocable
+evocate
+evocation
+evocations
+evocative
+evocatively
+evocativeness
+evolutionists
+ex
+exaltation
+exaltations
+examinable
+excelsior
+excisable
+excitability
+excitatory
+exclamatory
+exclusionary
+excoriate
+excoriated
+excoriates
+excoriating
+excoriation
+excoriations
+excrescence
+excrescences
+excretory
+excruciate
+excruciated
+excruciates
+excruciating
+excruciation
+exculpatory
+excursus
+excursuses
+exec
+execrable
+execrableness
+execrate
+execrated
+execrates
+execrating
+execration
+execrative
+executrix
+executrixes
+exegesis
+exegete
+exemption
+exemptions
+exercisable
+exhilarate
+exhilarated
+exhilarates
+exhilarating
+exhilaratingly
+exhilaration
+exhilarative
+exhort
+exhorted
+exhorter
+exhorting
+exhorts
+exhumation
+exhumations
+exhume
+exhumed
+exhumer
+exhumes
+exhuming
+exigent
+exigently
+exodus
+exogamous
+exogamy
+exogenous
+exogenously
+exonerate
+exonerated
+exonerates
+exonerating
+exoneration
+exonerative
+exorciser
+exorcism
+exorcist
+exoskeleton
+exothermic
+exotica
+expansible
+expansionist
+expectable
+expectorant
+expectorate
+expectoration
+expediency
+expellable
+experiential
+experientially
+experimentalism
+experimentalist
+experimentalist's
+experimentalists
+expiable
+expiate
+expiated
+expiates
+expiating
+expiation
+expletive
+expletives
+explicable
+explicate
+explicated
+explicates
+explicating
+explication
+explicative
+explicatively
+exportation
+exposit
+exposited
+expressionism
+expressionist
+expressionistic
+expressionists
+expressionless
+expressionlessly
+expressionlessness
+expressway
+expressways
+expurgate
+expurgated
+expurgates
+expurgating
+expurgation
+extemporaneous
+extemporaneously
+extemporaneousness
+extempore
+extendibility
+extensional
+extensionally
+extensor
+exterminator
+exterminator's
+exterminators
+extern
+externalities
+extirpate
+extirpated
+extirpating
+extirpation
+extirpative
+extolled
+extoller
+extolling
+extort
+extorted
+extorter
+extorting
+extortive
+extorts
+extracellular
+extracellularly
+extraditable
+extralegal
+extralegally
+extramarital
+extraterrestrial
+extravaganza
+extravaganzas
+extrema
+extremism
+extricable
+extricate
+extricated
+extricates
+extricating
+extrication
+extroversion
+extrovert
+extroverted
+extroverts
+extrude
+extruded
+extruder
+extrudes
+extruding
+extrusion
+extrusive
+exuberant
+exuberantly
+exudation
+exude
+exuded
+exudes
+exuding
+exultant
+exultantly
+eyeful
+eyelash
+eyelashes
+eyeless
+eyelet
+eyelets
+eyesore
+eyesore's
+eyesores
+eyeteeth
+f's
+faceplate
+facetious
+facetiously
+facetiousness
+facilitators
+facilitatory
+factious
+factiously
+factiousness
+facto
+factuality
+fad
+fadeout
+fads
+faerie
+faery
+failsafe
+fairgoer
+fairgoers
+fairgrounds
+fairless
+fairway
+fairways
+falafel
+falconry
+falloff
+fallout
+fallouts
+fallow
+fallowness
+familial
+fanatical
+fanaticalness
+fanaticism
+fanfare
+fanfold
+fangled
+fanout
+fantasia
+fantasist
+fantastically
+farcical
+farcically
+farfetched
+farfetchedness
+farina
+farmland
+farmlands
+farmworker
+farmworkers
+farsighted
+farsightedly
+farsightedness
+fascicle
+fascicled
+fascicles
+fasciculate
+fasciculated
+fasciculation
+fasciculations
+fascism
+fascist
+fascists
+fastidious
+fastidiously
+fastidiousness
+fatalistic
+fatalists
+fateful
+fatefully
+fatefulness
+fatherhood
+fatherless
+fatso
+fattier
+fatties
+fattiness
+fatty
+fatuity
+fatuous
+fatuously
+fatuousness
+faucet
+faucets
+faun
+fauna
+fax
+fax's
+faxes
+faze
+fazed
+fazes
+fazing
+fealty
+fearsome
+fearsomely
+fearsomeness
+feasibly
+featherbed
+featherbedding
+featherbrain
+featherbrained
+feathertop
+featherweight
+feathery
+febrile
+feces
+fecund
+fecundability
+fecundity
+federalism
+federalist
+federalists
+federate
+federated
+federates
+federating
+federations
+federative
+federatively
+fedora
+feint
+feinted
+feinting
+feints
+feldspar
+felicitous
+felicitously
+felicitousness
+feline
+felinely
+felines
+fella
+fellas
+felon
+felonious
+feloniously
+feloniousness
+felons
+felony
+feminism
+femme
+femmes
+fencepost
+fend
+fender
+fenders
+fennel
+fermion
+fermion's
+fermions
+fermium
+fernery
+ferret
+ferreted
+ferreter
+ferreting
+ferrets
+ferric
+ferris
+ferro
+ferroelectric
+ferromagnet
+ferromagnetic
+ferrous
+fervid
+fervidly
+fervidness
+fest
+fester
+festered
+festering
+festers
+fetal
+fete
+feted
+fetes
+fetish
+fetishes
+fettle
+fettled
+fettles
+fettling
+feudalistic
+feudatory
+fiance
+fiancee
+fiasco
+fiat
+fiats
+fib
+fibbing
+fibrin
+fibrosis
+fiche
+fictive
+fictively
+fiddlestick
+fiddlesticks
+fide
+fidget
+fidgeted
+fidgeting
+fidgets
+fiducial
+fiducially
+fiduciary
+fief
+fiefdom
+fieldstone
+fieldwork
+fieldworker
+fieldworkers
+fiendish
+fiendishly
+fiendishness
+fierily
+fiesta
+fifths
+figment
+figural
+figurine
+figurines
+filamentary
+filbert
+filberts
+filch
+filched
+filches
+filet
+filets
+filibuster
+filibustered
+filibusterer
+filibustering
+filibusters
+filigree
+filigreed
+fillet
+filleted
+filleting
+fillets
+fillies
+filly
+filmdom
+filmier
+filminess
+filmstrip
+filmstrips
+filmy
+filtrate
+filtrated
+filtrates
+filtrating
+finale
+finale's
+finales
+finalist
+finalists
+finch
+findable
+finesse
+finessed
+finessing
+fingernail
+fingernails
+fingerprint
+fingerprinted
+fingerprinting
+fingerprints
+fingertip
+fingertips
+finial
+finickiness
+finicky
+fink
+finned
+finny
+fireball
+fireballs
+fireboat
+firebreak
+firebreaks
+firebug
+firecracker
+firecrackers
+firefight
+firefighters
+firefighting
+firefights
+firehouse
+firehouses
+firemen
+firepower
+fireproof
+firewall
+firework
+fishier
+fishmeal
+fishmonger
+fishmongers
+fishpond
+fishy
+fissile
+fission
+fissioned
+fissioning
+fissions
+fisticuff
+fisticuffs
+fittest
+fivefold
+fizz
+fizzer
+fizzle
+fizzled
+fizzles
+fizzling
+fjord
+fjords
+flabbergast
+flabbergasted
+flabbergasting
+flabbergastingly
+flabbergasts
+flagellate
+flagellated
+flagellates
+flagellating
+flagellation
+flagman
+flagpole
+flagpoles
+flagstaff
+flagstone
+flail
+flailed
+flailing
+flails
+flair
+flak
+flakier
+flakiness
+flaky
+flam
+flamboyant
+flamboyantly
+flamen
+flamethrower
+flange
+flanged
+flanges
+flapped
+flapper
+flappers
+flashback
+flashbacks
+flashbulb
+flashbulbs
+flashier
+flashiness
+flashy
+flatbed
+flathead
+flatiron
+flatirons
+flatland
+flatlander
+flatlands
+flatulence
+flatulent
+flatulently
+flatworm
+flautist
+flaxseed
+fleawort
+fleck
+flecked
+flecker
+flecking
+flecks
+fledge
+fledges
+fledging
+fletch
+fletched
+fletcher
+fletches
+fletching
+fletching's
+fletchings
+flex
+flexed
+flexing
+flexural
+flexure
+flimsier
+flimsies
+flimsiness
+flimsy
+flintier
+flintiness
+flintless
+flintlock
+flinty
+flipflop
+flippant
+flippantly
+flipped
+flippers
+flipping
+flirtation
+flirtations
+flirtatious
+flirtatiously
+flirtatiousness
+flitting
+flocculate
+flocculated
+flocculates
+flocculating
+flocculation
+floe
+floes
+flog
+flogged
+flogging
+flogs
+floodgate
+floodlight
+floorboard
+floorboards
+flophouses
+flopped
+flopping
+floral
+florally
+florid
+floridly
+floridness
+florist
+florists
+flotation
+flotations
+flotilla
+flotillas
+flounce
+flounced
+flounces
+flouncing
+floury
+flout
+flouted
+flouter
+flouting
+flouts
+flowerpot
+flowstone
+flu
+flub
+flubbed
+flubbing
+flubs
+flue
+fluency
+fluff
+fluffs
+fluke
+fluoresce
+fluorescent
+fluorescer
+fluoresces
+fluoridate
+fluoridated
+fluoridates
+fluoridating
+fluoridation
+fluoridations
+fluoride
+fluorides
+fluorimetric
+fluorinated
+fluorine
+fluorite
+fluorocarbon
+flushable
+fluster
+flustered
+flustering
+flusters
+flutist
+flux
+fluxed
+fluxes
+flyaway
+flycatcher
+flycatchers
+flywheel
+flywheels
+foal
+foals
+foamier
+foaminess
+foamy
+fob
+foible
+foibles
+foist
+foisted
+foisting
+foists
+foldout
+foldouts
+foliate
+foliated
+foliates
+foliating
+foliation
+foliations
+folio
+folios
+folklike
+folksier
+folksiness
+folksong
+folksongs
+folksy
+follicle
+follicles
+follicular
+followup
+followup's
+followups
+foment
+fomented
+fomenter
+fomenting
+foments
+foolhardiness
+foolhardy
+footage
+footages
+footbridge
+footbridges
+footfall
+footfalls
+foothill
+foothills
+footloose
+footmen
+footpad
+footpads
+footpath
+footstool
+footstools
+footwear
+footwork
+fop
+foppery
+foppish
+foppishly
+foppishness
+fops
+forbore
+forebears
+foreclosed
+foreclosing
+forefeet
+forefront
+foreknowledge
+foreknown
+foreleg
+foremen
+forensic
+forensics
+forepart
+forepaws
+forerunner
+forerunners
+foresaw
+foreseeing
+foreshortened
+foreshortening
+forestry
+foreword
+forfeiture
+forfeitures
+forfend
+forfended
+forfending
+forfends
+forgo
+forgoer
+forgoing
+forklift
+formability
+formaldehyde
+formate
+formates
+formic
+formidably
+formulaic
+forsook
+forswear
+forswears
+forthcome
+forthright
+forthrightly
+forthrightness
+fortiori
+fossiliferous
+foulmouth
+foulmouthed
+foundling
+foundlings
+fountainhead
+fourfold
+foursome
+foursomes
+foursquare
+fourths
+fovea
+foxglove
+foxhole
+foxholes
+foxhound
+foxier
+foxiness
+foxtail
+foxy
+foyer
+fracases
+fractionated
+fractionation
+fractious
+fractiously
+fractiousness
+fragmentarily
+fragmentation
+francium
+frankfurter
+frankfurters
+franklin
+fraudulent
+fraudulentness
+frazzle
+frazzled
+frazzles
+frazzling
+freakish
+freakishly
+freakishness
+freeboot
+freebooter
+freebooters
+freeborn
+freedman
+freedmen
+freehand
+freehanded
+freehandedly
+freehold
+freeholder
+freeholders
+freemen
+freestone
+freethinkers
+freewheel
+freewheeled
+freewheeler
+freewheelers
+freewheeling
+freewheelingness
+freewheels
+frenetic
+freon
+fresco
+frescoed
+frescoes
+frescoing
+frescos
+freshwater
+fretted
+fretting
+friable
+friableness
+frictional
+frictionally
+friendlily
+frigid
+frigidly
+frigidness
+frilly
+friskier
+friskiness
+frisky
+fritter
+fritterer
+fritters
+frivolity
+frizzle
+frizzled
+frizzles
+frizzling
+fro
+frolicking
+frontage
+frontal
+frontally
+frontiersman
+frontiersmen
+frostbite
+frostbiting
+frostbitten
+frothier
+frothiness
+frothy
+frowzier
+frowzy
+frugality
+frustum
+fuchsia
+fuck
+fuck's
+fucked
+fucker
+fucker's
+fuckers
+fucking
+fucks
+fudge
+fudged
+fudges
+fudging
+fugue
+fulcrum
+fullback
+fullbacking
+fulminate
+fulminated
+fulminates
+fulminating
+fulmination
+fulminations
+fulsome
+fulsomely
+fulsomeness
+fumigant
+fumigate
+fumigated
+fumigates
+fumigation
+fumigations
+functionalism
+functionalist
+functionalists
+functionary
+fundamentalism
+funereal
+funereally
+fungal
+fungi
+fungible
+fungicides
+fungoid
+funk
+furbish
+furbisher
+furbishes
+furbishing
+furl
+furled
+furlong
+furlongs
+furlough
+furloughed
+furor
+furor's
+furors
+furrier
+furriers
+furring
+furry
+furthermost
+furthest
+fuselage
+fuselages
+fusible
+fusiform
+fusillade
+fusillades
+fussier
+fussily
+fussiness
+fussy
+fustiness
+fusty
+fuzz
+fuzzed
+g's
+gab
+gabbing
+gadfly
+gadgetry
+gaffe
+gaffer
+gaffes
+gaggle
+gagwriter
+gagwriters
+gainful
+gainfully
+gainfulness
+gal
+gala
+galactic
+galen
+galena
+galenite
+gallium
+gallivant
+gallivanted
+gallivanting
+gallivants
+gallonage
+gallstone
+gallstones
+gals
+galvanic
+galvanism
+galvanometer
+galvanometer's
+galvanometers
+gambit
+gambits
+gambol
+gambols
+gamecock
+gamut
+gander
+gangland
+gangling
+ganglion
+gangplank
+gangway
+gangways
+gantries
+gantry
+gardenia
+gardenias
+gargantuan
+gargoyle
+gargoyled
+gargoyles
+garish
+garishly
+garishness
+garnet
+garret
+garrets
+garrulous
+garrulously
+garrulousness
+gasification
+gasifications
+gasified
+gasifier
+gasifiers
+gasifies
+gasify
+gasifying
+gasket
+gaskets
+gaslight
+gaslighted
+gaslights
+gassiness
+gassy
+gastronome
+gastronomes
+gastronomy
+gator
+gauche
+gauchely
+gaucheness
+gaugeable
+gauntlet
+gauntleted
+gauss
+gausses
+gavel
+gawk
+gawker
+gawkier
+gawks
+gawky
+gazelle
+gazelles
+gazette
+gazetted
+gazetteer
+gazetteers
+gazettes
+gazetting
+gee
+geek
+geek's
+geeks
+geest
+geisha
+geishas
+gelable
+gelatine
+gelatinous
+gelatinously
+gelatinousness
+geld
+gelding
+geldings
+gemlike
+genealogies
+genealogists
+genealogy
+genera
+generational
+genesis
+geneticist
+geneticist's
+geneticists
+genie
+genie's
+genies
+genitive
+genitive's
+genitives
+genotype
+genotype's
+genotypes
+gent
+gentian
+gentians
+gentile
+gentiles
+gentility
+gentlemen
+gentlewomen
+gentlewomen's
+gentrification
+gents
+geocentric
+geocentricism
+geochemical
+geochemically
+geochemistry
+geochronology
+geodesic
+geodesics
+geodetic
+geographer
+geographer's
+geographers
+geologic
+geology
+geometer
+geometer's
+geometers
+geometrical
+geometrically
+geometrician
+geomorphological
+geomorphology
+geophysical
+geophysically
+geophysicist
+geophysicists
+geophysics
+geopolitic
+geopolitical
+geopolitically
+geopolitics
+geosynchronous
+gerbil
+geriatric
+geriatrics
+germanium
+germicidal
+germicide
+germicides
+germinal
+germinally
+gerontologist
+gerontologists
+gerontology
+gerrymandering
+gerund
+gerundive
+gestapo
+gestate
+gestated
+gestates
+gestating
+gestation
+gestation's
+gestations
+gesticulate
+gesticulated
+gesticulates
+gesticulating
+gesticulation
+gesticulations
+gesticulative
+gesticulatively
+getaway
+getaways
+geyser
+geysered
+geysering
+geysers
+gherkin
+gherkins
+ghetto
+ghettos
+ghostlike
+ghoul
+ghoulish
+ghoulishly
+ghoulishness
+ghouls
+giantess
+gibber
+gibbered
+gibbering
+gibbers
+gibbet
+gibbeted
+gibbeting
+gibbets
+gibbon
+gibbons
+gibbous
+gibbously
+gibbousness
+gibe
+giber
+gibes
+gibing
+giblet
+giblets
+giddap
+giddily
+gigacycle
+gigacycles
+gigahertz
+gigavolt
+gigawatt
+gigging
+gila
+gilbert
+gimpy
+ginkgo
+ginmill
+ginning
+ginseng
+girlie
+girlish
+girlishly
+girlishness
+gist
+git
+giveaway
+giveaways
+glaciate
+glaciated
+glaciates
+glaciating
+glaciation
+gladden
+gladdened
+gladdening
+gladdens
+gladdy
+gladiator
+gladiators
+gladiolus
+glamorous
+glamorously
+glamorousness
+glandular
+glandularly
+glassless
+glassware
+glasswort
+glaucoma
+glaucous
+glaziers
+glib
+glibly
+glibness
+glim
+gloat
+gloated
+gloater
+gloats
+glob
+globetrotter
+globule
+globulin
+globulins
+glommed
+glottis
+gloveless
+gluey
+glum
+glumly
+glumness
+glut
+gluten
+glutinous
+glutinously
+glutinousness
+gluts
+glutted
+glutting
+glutton
+glutton's
+gluttons
+glyceride
+glycerin
+glycerinate
+glycerinated
+glycerine
+glycerol
+glycol
+glycols
+glyph
+gnarl
+gnarled
+gnarls
+gnash
+gnashes
+gnashing
+gneiss
+gnome
+gnomelike
+gnomes
+gnomonic
+gnostic
+gnu
+gnus
+gob
+gobbledygook
+goddamn
+goddamned
+godfather
+godhead
+godless
+godlessness
+godparent
+godsend
+godsends
+godson
+goggle
+goggled
+goggler
+gogglers
+goggles
+goggling
+goldenrod
+goldenseal
+goldfinch
+goldfish
+goldsmiths
+golly
+gondola
+gondolas
+goober
+goodwill
+gooey
+goof
+goofed
+goofier
+goofiness
+goofing
+goofs
+goofy
+gooseberry
+gopher
+gophers
+gorgon
+goshawk
+gosling
+gossamer
+gourd
+gourmand
+gourmand's
+gourmands
+gourmet
+gourmets
+gout
+governance
+grad
+gradate
+gradated
+gradates
+gradating
+grads
+gradualist
+gradualists
+graffiti
+grail
+grails
+grammarian
+grammarians
+grammatic
+grammaticality
+grandchild
+grandchildren
+granddaughter
+granddaughters
+grandiloquent
+grandiloquently
+grandnephew
+grandnephews
+grandniece
+grandnieces
+grandstand
+grandstanded
+grandstander
+grandstanding
+grandstands
+granola
+grantee
+grantor
+granular
+granularly
+granule
+granules
+granulocytic
+grapefruit
+grapheme
+grasshoppers
+grassland
+grasslands
+grassroots
+gratis
+graven
+gravestone
+gravestones
+graveyard
+graveyards
+gravid
+gravidly
+gravidness
+gravimetric
+gravitate
+gravitated
+gravitates
+gravitating
+gravitations
+gravitative
+graybeard
+graybeards
+greatcoat
+greatcoated
+greatcoats
+greenbelt
+greenery
+greengrocer
+greenwood
+gregarious
+gregariously
+gregariousness
+greyhound
+griddle
+gridiron
+griffin
+grillwork
+grimace
+grimaced
+grimacer
+grimaces
+grimacing
+grime
+grimes
+grimmer
+grinned
+grinning
+grinningly
+grisliness
+grisly
+grist
+gristlier
+gristliness
+gristly
+gristmill
+grittier
+grittiness
+gritty
+grizzle
+grizzled
+grizzles
+grizzling
+groat
+groats
+groggier
+grogginess
+groggy
+groin
+grok
+grokked
+grokking
+groks
+grommet
+groomsmen
+grosbeak
+grottoes
+grouchier
+grouchiness
+grouchy
+groundhog
+groundhog's
+groundhogs
+groundless
+groundlessly
+groundlessness
+groundskeepers
+grout
+grouted
+grouter
+grouting
+grouts
+grovelike
+grubbier
+grubbiness
+grubbing
+grubby
+guano
+guardhouse
+gubernatorial
+guerilla
+guernsey
+guernseys
+guesswork
+guffaw
+guffaws
+guidepost
+guideposts
+guildhall
+guileless
+guilelessly
+guilelessness
+guitarist
+guitarists
+gullet
+gullets
+gullible
+gumbo
+gummier
+gumminess
+gumming
+gummy
+gumption
+gumshoe
+gunboat
+gunfight
+gunfighter
+gunfights
+gunflint
+gunk
+gunky
+gunman
+gunmen
+gunnery
+gunny
+gunshot
+gunsling
+gunslinger
+gunslinging
+gusset
+gussets
+gustiness
+gusto
+gusty
+gutsier
+gutsiness
+gutsy
+gutted
+gutting
+guttural
+gutturalness
+guzzle
+guzzled
+guzzler
+guzzles
+guzzling
+gymnosperm
+gyp
+gypping
+gypsite
+gypsum
+gyrate
+gyrated
+gyrates
+gyrating
+gyro
+gyrocompass
+gyros
+gyroscopic
+h's
+habeas
+haberdasheries
+haberdashery
+habitant
+habitants
+habituate
+habituated
+habituates
+habituating
+habituation
+hacienda
+haciendas
+hackle
+hackled
+hackler
+hackles
+hackling
+hackney
+hackneyed
+hackneying
+hackneys
+hacksaw
+hacksaws
+hackwork
+haddock
+haddocks
+hadron
+hafnium
+haggle
+haggled
+haggler
+haggles
+haggling
+haiku
+hailstone
+hailstorm
+hairdo
+hairdos
+hairdressing
+hairline
+hairpin
+halcyon
+halfback
+halfbacks
+halfhearted
+halfheartedly
+halfheartedness
+halftime
+halibut
+halibuts
+halide
+halides
+halite
+hallelujah
+hallelujahs
+hallucinate
+hallucinated
+hallucinates
+hallucinating
+hallucination
+hallucinations
+hallucinative
+halo
+halocarbon
+halogen
+halogens
+halos
+hammerhead
+hammerless
+hamming
+hamster
+hamsters
+handclasp
+handgun
+handguns
+handhold
+handicapper
+handicapping
+handicraft
+handicrafter
+handicrafts
+handicraftsman
+handicraftsmen
+handleable
+handlebar
+handlebars
+handless
+handmade
+handmaiden
+handout
+handouts
+handrail
+handset
+handsets
+handspike
+handspikes
+handstand
+handstands
+handwrite
+handwrites
+handwritings
+handyman
+handymen
+hangable
+hangman
+hangman's
+hangmen
+hangout
+hangouts
+hank
+hanker
+hankered
+hankerer
+hankering
+hankers
+hansom
+happenstance
+harangue
+harangued
+haranguer
+harangues
+haranguing
+harbinger
+harbingers
+hardboard
+hardboiled
+hardhat
+hardscrabble
+hardshell
+hardtack
+hardtop
+hardtops
+hardwire
+hardwired
+hardwires
+hardwiring
+hardwood
+hardwoods
+hardworking
+harelip
+harelips
+harem
+harmonic
+harmonics
+harpies
+harpist
+harpoon
+harpoon's
+harpooned
+harpooner
+harpooning
+harpoons
+harpsichord
+harpsichordist
+harpsichords
+harpy
+harpy's
+harrumph
+harrumphed
+harrumphes
+harrumphing
+harvestman
+hashish
+hasp
+hasps
+hatchway
+hatless
+hatted
+hatters
+haulage
+haw
+hawing
+hawser
+hawthorn
+hayfield
+hayfields
+hayloft
+hayloft's
+haylofts
+haystack
+haystacks
+hazelnut
+hazelnuts
+headboard
+headboards
+headdress
+headier
+headiness
+headless
+headlessness
+headlight
+headlights
+headmaster
+headquarter
+headquartered
+headroom
+headset
+headsets
+headship
+headsman
+headsmen
+headstand
+headstands
+headstone
+headstones
+headwall
+headwalls
+headwater
+headwaters
+heady
+hearse
+heartbeat
+heartbeats
+heartbreak
+heartbreaking
+heartbreakingly
+heartburn
+heartburning
+heartfelt
+heartland
+heartland's
+heartthrob
+heartthrob's
+heartthrobs
+heathenish
+heathenishly
+heavenward
+heavenwards
+heavyweight
+hebephrenic
+hecatomb
+heck
+heckle
+heckled
+heckler
+hecklers
+heckles
+heckling
+hectares
+hectic
+hector
+hedonism
+hedonist
+hedonistic
+hedonists
+heedful
+heedfully
+heedfulness
+heft
+hefted
+heftier
+heftiness
+hefts
+hefty
+hegemonic
+hegemonies
+hegemony
+heist
+heist's
+heisted
+heister
+heisting
+heists
+helical
+helically
+helices
+helicon
+helicopter
+heliocentric
+heliotrope
+helium
+helix
+helixes
+hellbender
+hellfire
+hellish
+hellishly
+hellishness
+helluva
+helmsman
+helmsmen
+helpmate
+hematite
+hemispheric
+hemispherical
+hemmed
+hemming
+hemoglobin
+hemolytic
+hemorrhage
+hemorrhaged
+hemorrhages
+hemorrhaging
+hemorrhoids
+henning
+henpeck
+henpecked
+henry
+hepatitis
+heptane
+herbal
+herdsman
+hereof
+hereunto
+heritable
+heritor
+hermeneutics
+hermetic
+hermitian
+herpes
+herpetologist
+herpetologists
+herpetology
+herringbone
+hertz
+hertzes
+hesitance
+hesitancy
+heterodyne
+heterogamous
+heterogamy
+heterogeneity
+heterosexual
+heterosexually
+heterosexuals
+heterostructure
+heterozygous
+hewn
+hexachloride
+hexadecimal
+hexadecimally
+hexadecimals
+hexafluoride
+hexagon
+hexagons
+hexameter
+heyday
+hi
+hiatus
+hiatuses
+hibachi
+hibernate
+hibernated
+hibernates
+hibernating
+hibernation
+hick
+hicks
+hideaway
+hierarchal
+hierarchic
+hieratic
+hieroglyphic
+hieroglyphics
+hifalutin
+highball
+highboy
+highfalutin
+highhanded
+highroad
+highs
+hight
+hightail
+highwayman
+highwaymen
+hilarity
+hillbilly
+hillier
+hillman
+hillmen
+hilly
+hindmost
+hindquarters
+hinterland
+hinterlands
+hippies
+hipping
+hippo
+hippodrome
+hippopotamus
+hippos
+hippy
+hipster
+hipsters
+hireling
+hirelings
+histochemic
+histochemical
+histochemistry
+histology
+historicism
+historicity
+historiography
+histrionic
+histrionics
+hitless
+ho
+hoagie
+hoagies
+hoagy
+hoarfrost
+hob
+hobbing
+hobbyhorse
+hobo
+hobos
+hoc
+hock
+hocker
+hocking
+hocks
+hodge
+hodgepodge
+hodges
+hogan
+hogging
+hokey
+hokeyer
+hokeyest
+hokeyness
+holdover
+holdovers
+holdup
+holdups
+hollandaise
+holler
+hollered
+hollering
+hollers
+hollowware
+hollyhock
+hollyhocks
+holmium
+holography
+holster
+holstered
+holstering
+holsters
+holystone
+holystones
+homebound
+homebuilder
+homebuilders
+homebuilding
+homecoming
+homecomings
+homeland
+homemake
+homemaking
+homeowner
+homeowners
+homeownership
+homerists
+homicidal
+homicidally
+homicide
+homicides
+homily
+homo
+homogamy
+homogenate
+homogenates
+homologous
+homologue
+homology
+homonym
+homonym's
+homonyms
+homopolymers
+homos
+homosexual
+homosexually
+homosexuals
+homozygous
+homozygously
+hon
+honeybee
+honeybees
+honeydew
+hong
+honk
+honked
+honker
+honkers
+honkies
+honking
+honks
+honky
+honky's
+hooch
+hoodlum
+hoodlums
+hoofmark
+hoofmarks
+hookup
+hookups
+hookworm
+hooligan
+hooliganism
+hooligans
+hoopla
+hoosegow
+hoosegows
+hooves
+hoppled
+hopples
+hopscotch
+hornier
+horniness
+horny
+horoscope
+horoscopes
+hors
+horsedom
+horseflesh
+horseflies
+horsefly
+horsehair
+horselike
+horsemanship
+horsemen
+horsens
+horseplay
+horseplayer
+horsetail
+horsewoman
+horticulture
+hosiery
+hospice
+hospices
+hostelries
+hostelry
+hotbed
+hotbox
+hotdogs
+hotelman
+hothead
+hotheaded
+hotheadedly
+hotheadedness
+hothouse
+hotrod
+hough
+hourglass
+houseboat
+houseboats
+housebreak
+housebreaker
+housebreakers
+housebreaking
+housebroken
+housekeep
+housewares
+housewives
+hove
+howdy
+hoy
+hubba
+hubbies
+hubbub
+hubby
+huckleberry
+huckster
+huckstered
+huckstering
+hucksters
+hugged
+hugging
+huggings
+hulk
+hulked
+hulking
+hulks
+humanism
+humanist
+humanistic
+humanists
+humanitarian
+humanitarians
+humidistat
+hummingbird
+hummingbirds
+hummock
+hummocks
+humorist
+humorist's
+humorists
+humpback
+humpbacked
+humpbacks
+humus
+hundredfold
+huntress
+hurray
+hurrays
+hurtful
+hurtfully
+hurtfulness
+hurtle
+hurtled
+hurtles
+hurtling
+husbandman
+husbandmen
+huskily
+hutch
+huzzahs
+hyacinths
+hydrant
+hydrants
+hydrate
+hydrated
+hydrates
+hydrating
+hydration
+hydrations
+hydride
+hydrides
+hydro
+hydrocarbon
+hydrocarbons
+hydrochemistry
+hydrochloric
+hydrochloride
+hydroelectric
+hydrofluoric
+hydrogenate
+hydrogenation
+hydrological
+hydrologically
+hydrology
+hydrolysis
+hydrometer
+hydrometer's
+hydrometers
+hydrophilic
+hydrophobia
+hydrophobic
+hydros
+hydrosphere
+hydrostatic
+hydrostatics
+hydrothermal
+hydrothermally
+hydrous
+hydroxide
+hydroxides
+hydroxy
+hydroxyl
+hydroxyl's
+hydroxylate
+hydroxylation
+hydroxyls
+hydroxyzine
+hyena
+hygienic
+hygienics
+hygrometer
+hygrometer's
+hygrometers
+hygroscopic
+hying
+hymen
+hymens
+hymnal
+hyperbola
+hyperbole
+hyperbolically
+hyperboloid
+hyperboloidal
+hypercellularity
+hypercube
+hypercube's
+hypercubes
+hyperemia
+hyperemic
+hyperfine
+hypergamous
+hypergamously
+hypergamy
+hyperplasia
+hypertensive
+hypertrophied
+hypertrophy
+hypervelocity
+hyphenate
+hyphenated
+hyphenates
+hyphenating
+hyphenation
+hyphenations
+hypnosis
+hypnotic
+hypnotically
+hypnotics
+hypoactive
+hypocellularity
+hypocritical
+hypocritically
+hypophyseal
+hypotenuse
+hypotenuses
+hypothalamic
+hypothalamically
+hypothalamus
+hypothermia
+hypothetic
+hypothyroid
+hypothyroidism
+hysterectomy
+hysteria
+hysteric
+hysterics
+i's
+iambic
+ibid
+ibis
+ibises
+icebox
+icicle
+icicles
+iconic
+iconoclasm
+iconoclast
+icosahedral
+icosahedron
+idealist
+idealogical
+ideate
+ideates
+ideation
+idempotent
+idempotents
+identifiability
+ideologist
+ideologists
+idiolect
+idiom
+idiomatic
+idiomaticness
+idioms
+idiosyncratically
+idiotically
+idyll
+idyllic
+iffiness
+iffy
+igloo
+igloos
+igneous
+ignite
+ignited
+igniter
+ignites
+igniting
+ignitions
+ignominious
+ignominiously
+ignoramus
+ileum
+iliac
+ilk
+ilk's
+illegible
+illegitimacy
+illegitimate
+illegitimately
+illimitable
+illimitableness
+illiteracy
+illogic
+illume
+illumed
+illumine
+illumined
+illumines
+illuming
+illusionary
+illusoriness
+illusory
+imagery
+imbecile
+imbecilely
+imbibe
+imbibed
+imbiber
+imbibing
+imbroglio
+imbruing
+imbue
+imbued
+imbuing
+imitable
+imitators
+immanent
+immanently
+immeasurable
+immeasurableness
+immeasurably
+immensities
+immensity
+imminence
+immobile
+immobility
+immoderate
+immoderately
+immoderateness
+immoderation
+immodest
+immodestly
+immodesty
+immunological
+immunologically
+impairment
+impale
+impaled
+impales
+impaling
+impalpable
+impartation
+impartiality
+impassable
+impassableness
+impeccable
+impeccably
+impelled
+impeller
+impellers
+impelling
+impend
+imperceivable
+imperceptible
+imperceptibly
+imperfectability
+imperishable
+imperishableness
+impermeable
+impermeableness
+imperturbable
+impiety
+impish
+impishly
+impishness
+implacable
+implacableness
+implantation
+implausibly
+implementability
+impolite
+impolitely
+impoliteness
+impolitic
+impoliticly
+impoliticness
+imponderable
+imponderableness
+imponderables
+importunate
+importunately
+importunateness
+importune
+importunely
+importuner
+importuners
+importunities
+impost
+imposter
+imposts
+impotency
+impound
+impounded
+impounding
+impoundments
+impounds
+imprecate
+imprecated
+imprecates
+imprecating
+imprecation
+imprecations
+impregnate
+impregnated
+impregnates
+impregnating
+impregnation
+impregnations
+impresario
+impressible
+impressionism
+imprimatur
+improbably
+impropitious
+impropriety
+improvident
+improvidently
+imprudent
+imprudently
+impudence
+impugn
+impugned
+impugner
+impugning
+impugns
+imputation
+imputations
+inaction
+inactivate
+inadvertence
+inalienable
+inanity
+inappeasable
+inarticulate
+inarticulately
+inarticulateness
+inattention
+inaudibility
+inboard
+inbreed
+inbreeder
+inbreeding
+incalculability
+incalculable
+incalculableness
+incandescent
+incandescently
+incant
+incanted
+incapacitate
+incapacitated
+incapacitates
+incapacitation
+incapacity
+incarcerate
+incarcerated
+incarcerates
+incarcerating
+incarceration
+incarnate
+incept
+incepted
+incepting
+inceptive
+inceptively
+inceptor
+incepts
+incest
+incestuous
+incestuously
+incestuousness
+incinerate
+incinerated
+incinerates
+incinerating
+incineration
+incinerations
+incinerator
+incinerators
+incipience
+incipiency
+incise
+incised
+incises
+incising
+incisive
+incisively
+incisiveness
+incisor
+incisor's
+incisors
+incitement
+incitements
+inclemency
+inclement
+inclemently
+inclinometer
+inclinometer's
+inclinometers
+incoercible
+incombustible
+incommensurable
+incommodious
+incommodiously
+incommodiousness
+incommunicable
+incommunicado
+incommutable
+incompetency
+incompressibility
+incondensable
+incongruities
+incongruity
+incongruous
+incongruously
+incongruousness
+inconsistence
+inconsonance
+inconstant
+incontinence
+incontrovertible
+incorporable
+incorporeally
+incorrigible
+incorrigibleness
+incorruptibility
+incorruptible
+increasable
+incriminating
+incubi
+incubus
+inculcate
+inculcated
+inculcates
+inculcation
+inculpable
+incumbent
+incumbents
+incursion
+incursions
+indecipherable
+indecorous
+indecorously
+indecorousness
+indefatigable
+indefatigableness
+indefensible
+indelible
+indelibly
+indelicate
+indelicately
+indelicateness
+indemnification
+indemonstrably
+indenture
+indentured
+indentures
+indenturing
+indestructible
+indestructibleness
+indicant
+indicants
+indict
+indicted
+indicter
+indigent
+indiscoverable
+indiscretion
+indispose
+indisposing
+indisposition
+indisputable
+indisputableness
+indisputably
+indissociable
+indissoluble
+indissolubleness
+indium
+individualism
+individualist
+individualists
+individuate
+individuated
+individuates
+individuating
+individuation
+indolence
+indubitable
+indubitableness
+inducible
+inductee
+inductees
+inductile
+indulgent
+indulgently
+industrialism
+inebriate
+inebriated
+inebriates
+inebriating
+inebriation
+ineffable
+ineffableness
+ineffaceable
+ineffectual
+ineffectually
+ineffectualness
+inefficacious
+inefficaciously
+inefficaciousness
+inegalitarian
+inelastic
+ineligibility
+ineligible
+ineluctable
+inept
+ineptly
+ineptness
+inequitable
+inequivalent
+ineradicable
+inertial
+inertially
+inexpediency
+inexpert
+inexpertly
+inexpertness
+inexpiable
+inexplicit
+inextinguishable
+inextricable
+inextricably
+infamy
+infanticide
+infanticide's
+infantile
+infantryman
+infantrymen
+infatuation
+infauna
+infecund
+infelicitous
+infelicitously
+infelicity
+inferable
+infertile
+infestation
+infestations
+infield
+infield's
+infielder
+infielder's
+infielders
+infinitude
+infirm
+infirmary
+infirmed
+infirmly
+inflammation
+inflammatory
+inflect
+inflected
+inflecting
+inflection
+inflectional
+inflectionally
+inflections
+inflective
+inflects
+inflexed
+infliction
+inflow
+influx
+info
+infra
+infraction
+infrared
+infusible
+infusibleness
+ingenuous
+ingenuously
+ingenuousness
+ingest
+ingested
+ingestible
+ingestion
+ingestive
+ingrain
+ingrate
+ingratiate
+ingratiating
+ingratiatingly
+ingratiation
+inhabitation
+inhalant
+inhalation
+inhibitor
+inhibitory
+inhomogeneous
+inimical
+inimically
+inimitable
+inimitableness
+iniquitous
+iniquitously
+iniquitousness
+injectable
+injunctive
+inlay
+inlayer
+inlaying
+innovators
+innuendo
+innuendoes
+innuendos
+inoculate
+inoculated
+inoculates
+inoculating
+inoculation
+inoculations
+inoculative
+inoperative
+inoperativeness
+inorganically
+inputted
+inquest
+inquisitor
+insatiable
+insatiableness
+inscrutability
+inscrutable
+inscrutableness
+insecticide
+insecticides
+inseminate
+insemination
+insensate
+insensately
+insensateness
+insensibility
+inseparability
+inseparably
+inset
+insincere
+insincerely
+insipid
+insipidly
+insobriety
+insolvency
+insolvent
+insomnia
+insomniac
+insomniacs
+insouciance
+insouciant
+insouciantly
+inspirational
+inspirationally
+instable
+instep
+instill
+instillation
+instilled
+instiller
+instilling
+instinctual
+institutionalist
+instrumentalities
+insubordinate
+insubordinately
+insubordination
+insubstantial
+insufferable
+insular
+insularity
+insularly
+insulin
+insuperably
+insuppressible
+insurgence
+insusceptibility
+intake
+intaking
+integrable
+integrand
+integument
+intellectuality
+intelligentsia
+intendant
+intendants
+intensional
+intensionally
+inter
+interaxial
+intercalate
+intercalated
+intercalates
+intercalating
+intercalation
+intercalative
+intercase
+intercaste
+intercede
+interceder
+intercedes
+intercensal
+interception
+interceptor
+interclass
+intercohort
+intercollegiate
+intercom
+intercontinental
+intercorrelated
+interdenominational
+interdepartmental
+interdepartmentally
+interdict
+interdictive
+interfaith
+interferometer
+interferometer's
+interferometers
+interferometric
+interferometry
+interferon
+intergalactic
+intergeneration
+intergenerational
+interglacial
+intergovernmental
+intergroup
+interindex
+interindustry
+interject
+interjected
+interjecting
+interjects
+interlayer
+interlayering
+interlibrary
+interlingua
+interlining
+interlobular
+interlock
+interlocked
+interlocker
+interlocking
+interlocks
+interlocutor
+interlude
+interludes
+intermarriage
+interment
+intermeshed
+intermetrics
+interminableness
+interminably
+intermission
+intermissions
+intermolecular
+intermolecularly
+internationalist
+internationalists
+internetwork
+interpenetrates
+interplanetary
+interpol
+interposition
+interpretative
+interpretatively
+interpretor
+interpretors
+interprocessor
+interquartile
+interracial
+interred
+interregional
+interregnum
+interrogator
+interrogatories
+interrogators
+interrogatory
+interspecies
+interstellar
+interstice
+interstices
+interstitial
+interstitially
+intersurvey
+intervenor
+interventionist
+intervocalic
+interweaving
+intestate
+intimal
+intonate
+intone
+intoning
+intorsion
+intoxicant
+intra
+intracity
+intraclass
+intracohort
+intradepartmental
+intrafamily
+intragenerational
+intraindustry
+intraline
+intrametropolitan
+intramuscular
+intramuscularly
+intranasal
+intransigence
+intraoffice
+intrapulmonary
+intraregional
+intrasectoral
+intrastate
+intratissue
+intravenous
+intravenously
+intrepid
+intrepidly
+intrepidness
+intro
+introject
+introjected
+introjects
+introversion
+intuitable
+inunction
+inundate
+inundated
+inundates
+inundating
+inundation
+inundations
+inure
+inured
+inuring
+inutile
+invalidism
+invasive
+invasiveness
+invective
+invectively
+invectiveness
+inveigh
+inveigher
+inveigle
+inveigled
+inveigler
+inveigling
+investigatory
+inveterate
+inveterately
+invidious
+invidiously
+invidiousness
+invigorate
+invigorated
+invigorates
+invigorating
+invigoratingly
+invigoration
+inviolability
+inviolable
+inviolate
+inviolately
+inviolateness
+invitational
+invitee
+invitees
+invocable
+invocate
+involute
+involutely
+involution
+involutions
+involutorial
+invulnerability
+iodate
+iodated
+iodating
+iodation
+iodide
+iodinate
+iodinated
+iodinating
+iodination
+ionic
+ionosphere
+ionospheric
+iota
+ipecac
+ipso
+iridium
+ironic
+ironside
+ironsides
+ironstone
+ironwood
+irradiate
+irradiated
+irradiation
+irradiative
+irreconcilable
+irreconcilableness
+irredeemable
+irredeemably
+irredentism
+irredentist
+irrelevancies
+irrelevancy
+irremediable
+irremediableness
+irremovable
+irreparable
+irreparableness
+irreparably
+irreplaceable
+irreplaceableness
+irreproachable
+irreproachableness
+irreproducibility
+irreproducible
+irresistibility
+irresistibly
+irresolute
+irresolutely
+irresoluteness
+irresolution
+irresolvable
+irresponsibility
+irretrievable
+irreverence
+irreverent
+irreverently
+irreversibly
+irrevocable
+irrevocableness
+irrevocably
+irritability
+irritable
+irritableness
+irritably
+irritant
+irritants
+irruption
+irruptions
+isinglass
+isochronal
+isochronally
+isochronous
+isochronously
+isocline
+isocyanate
+isodine
+isolationism
+isolationistic
+isomer
+isomers
+isomorph
+isopleth
+isopleths
+isotherm
+isothermal
+isothermally
+isotherms
+isotonic
+isotopic
+isotropic
+isotropically
+isotropy
+issuant
+itinerant
+itinerantly
+j's
+jabberings
+jackass
+jackboot
+jackbooted
+jackboots
+jackdaw
+jackdaws
+jackknife
+jackpot
+jackpots
+jag
+jagged
+jaggedly
+jaggedness
+jaggers
+jagging
+jaguar
+jalopies
+jalopy
+jamboree
+jangle
+jangled
+jangler
+jangles
+jangling
+janissaries
+janissary
+janitorial
+jasper
+jaspers
+jaundice
+jaundiced
+jaundices
+jaundicing
+jawbone
+jazzier
+jazziness
+jazzmen
+jazzy
+jejune
+jejunely
+jejuneness
+jejunum
+jeopard
+jeopardies
+jeopardy
+jerry
+jess
+jetliner
+jetliners
+jettison
+jibe
+jibed
+jibes
+jibing
+jiffies
+jiffy
+jigger
+jiggered
+jigging
+jiggle
+jiggled
+jiggles
+jiggling
+jigsaw
+jilt
+jilted
+jilter
+jilts
+jimmied
+jimmies
+jimmy
+jimmying
+jinx
+jitter
+jitterbug
+jitters
+jittery
+jive
+jived
+jives
+jiving
+jobbery
+jobbing
+jobholder
+jobholders
+jobless
+joblessness
+jock
+jockey
+jockeyed
+jockeying
+jockeys
+jockstrap
+jockstraps
+jocose
+jocosely
+jocoseness
+jocular
+jocularly
+joey
+joggle
+joggled
+joggler
+joggles
+joggling
+jollities
+jollity
+jonquil
+jonquils
+josh
+joshed
+josher
+joshes
+joshing
+joss
+joule
+jounce
+jounced
+jounces
+jouncing
+journalese
+journaleses
+journeyman
+journeymen
+jovial
+joviality
+jovially
+jowl
+jowled
+jowls
+joyless
+joylessly
+joylessness
+joyride
+joyrider
+joyriding
+joystick
+joysticks
+jubilant
+jubilantly
+jubilate
+jubilated
+jubilates
+jubilating
+jubilation
+jubilations
+judgeship
+judicatory
+judicature
+judicatures
+judo
+jugate
+jugging
+juju
+jujube
+juke
+jukes
+juking
+julep
+juleps
+jumbo
+jumbos
+junkerdom
+junket
+junketed
+junketeer
+junketeering
+junketer
+junketing
+junkets
+junta
+juridical
+juridically
+jurisdictional
+jurisdictionally
+jurisprudence
+jurisprudent
+jurisprudential
+jurisprudentially
+jurist
+jurists
+justiciable
+jute
+jutes
+jutting
+juxtaposition
+k's
+kaboom
+kaleidescope
+kamikaze
+kangaroo
+kangaroos
+kaolin
+kaolinite
+kappa
+karat
+karate
+kazoo
+kazoos
+kcal
+kebob
+keg
+kegs
+kelp
+keno
+ketone
+ketosis
+keyhole
+keyholes
+keynote
+keynoter
+keynotes
+keypunch
+keypunched
+keypuncher
+keypunches
+keypunching
+keystone
+keystones
+khaki
+khan
+kibbutzim
+kibitz
+kibitzer
+kickback
+kickbacks
+kickoff
+kickoffs
+kidder
+kiddie
+kiddies
+kidless
+killable
+killjoy
+kilobaud
+kilobuck
+kilogauss
+kilohertz
+kilohm
+kilojoule
+kiloton
+kilotons
+kilovolt
+kilovolts
+kilowatt
+kilowatts
+kiloword
+kilts
+kimono
+kinematic
+kinematics
+kinesics
+kinetic
+kinetics
+kingbird
+kingfisher
+kinglet
+kingpin
+kink
+kinsmen
+kinsmen's
+kiosk
+kiosks
+kitchenette
+kitchenettes
+kittenish
+kittenishly
+kittenishness
+klaxon
+kleenex
+klystron
+klystrons
+km
+kneecap
+kneecaps
+kneepad
+kneepads
+knick
+knicker
+knickerbocker
+knickers
+knitted
+knitting
+knobby
+knockdown
+knockdowns
+knockout
+knockouts
+knockwurst
+knottier
+knottiness
+knotty
+knuckleball
+knuckleballer
+knurl
+koala
+kohlrabi
+kooks
+kosher
+koshered
+koshering
+kraft
+kraut
+krauts
+krill
+krypton
+kudzu
+kumquat
+kurtosis
+l's
+la
+labial
+labially
+labile
+labiodental
+lackadaisic
+lackey
+lackeyed
+lackeying
+lackeys
+lacrosse
+lacrosses
+lactate
+lactated
+lactates
+lactating
+lactation
+lactational
+lactationally
+lactose
+lacuna
+lacunae
+lacunas
+ladle
+ladled
+ladles
+ladling
+ladylike
+laggard
+laggardly
+laggardness
+laggards
+lagging
+laing
+laissez
+laity
+lakeside
+lamas
+lamentably
+laminate
+laminated
+laminates
+laminating
+lamination
+laminations
+lammed
+lamming
+lampblack
+lamplight
+lamplighter
+lampoon
+lampooned
+lampooner
+lampooning
+lampoons
+lamprey
+lampreys
+landau
+landfill
+landhold
+landholder
+landholders
+landholding
+landholdings
+landless
+landownership
+landslide
+landslides
+languor
+lank
+lankier
+lankiness
+lankly
+lankness
+lanky
+lanthanide
+lanthanum
+lapidary
+lapped
+lapping
+laptop
+laptop's
+laptops
+larceny
+larch
+largemouth
+largesse
+lariat
+larval
+laryngeal
+laryngeally
+larynx
+larynxes
+las
+lascivious
+lasciviously
+lasciviousness
+lasing
+lasso
+lassoed
+lassoer
+lathe
+latitudinal
+latitudinally
+latitudinary
+laud
+laudably
+laudanum
+laudatory
+lauder
+lauds
+laughingstock
+laughingstocks
+laundresses
+laundrymen
+laura
+laureate
+laureated
+laureates
+laureating
+laureation
+lawbreaker
+lawbreakers
+lawbreaking
+lawgiver
+lawgivers
+lawgiving
+lawmakers
+lawmaking
+lawman
+lawmen
+lawrencium
+lax
+laxative
+laxatively
+laxativeness
+laxatives
+laxity
+laxly
+laxness
+layoff
+layperson
+layup
+layup's
+layups
+lazybones
+lb
+lbs
+leach
+leachate
+leaches
+leaching
+leaderless
+leadsman
+leadsmen
+leafhopper
+leakier
+leakiness
+leaky
+leapfrog
+leasehold
+leaseholder
+leatherneck
+leathery
+lebensraum
+lecher
+lechery
+leek
+leery
+leeward
+leewards
+leeway
+lefties
+lefty
+legate
+legated
+legatee
+legates
+legating
+legation
+legations
+legato
+legerdemain
+leggier
+legging
+leggy
+leghorn
+legume
+legumes
+leguminous
+leitmotif
+leitmotiv
+lemming
+lemmings
+lengthily
+lenticular
+leonine
+leper
+lepers
+lesbian
+lesbians
+lesion
+lesions
+lessor
+lethal
+lethality
+lethally
+lethargies
+lethargy
+letterhead
+letterheads
+letterman
+lettermen
+levitate
+levitated
+levitates
+levitating
+levitation
+levities
+levity
+lewis
+lex
+libation
+libations
+libel
+libels
+liberalism
+liberality
+libertarian
+libertarians
+libertine
+libertines
+libidinous
+libidinously
+libidinousness
+librettist
+librettists
+libretto
+libretto's
+librettos
+lice
+licensor
+licentious
+licentiously
+licentiousness
+licit
+licitly
+licorice
+lidding
+lidless
+lieut
+lifeblood
+lifeboat
+lifeboats
+lifeguard
+lifeguards
+lifesaving
+lifespan
+lifespans
+ligament
+ligaments
+ligand
+ligands
+ligature
+ligatured
+ligatures
+ligaturing
+lighthearted
+lightheartedly
+lightheartedness
+lightproof
+lightships
+lignite
+lignum
+likeable
+lilt
+lilting
+liltingly
+liltingness
+limbic
+limbo
+limbos
+limelight
+limerick
+limerick's
+limericks
+limitless
+limitlessly
+limitlessness
+limousine
+limousines
+limpid
+limpidly
+limpidness
+lineage
+lineages
+lineal
+lineally
+linebacker
+linebackers
+lineman
+linemen
+lineup
+lineups
+lingerie
+lingo
+lingua
+lingual
+lingually
+liniment
+liniments
+lipid
+lipid's
+lipids
+liquefaction
+liqueur
+liquidate
+liquidated
+liquidates
+liquidating
+listless
+listlessly
+listlessness
+litanies
+litany
+literalism
+lithium
+lithograph
+lithographer
+lithographers
+lithographs
+lithography
+lithology
+lithosphere
+lithospheric
+litigant
+litigants
+litigious
+litigiously
+litigiousness
+litmus
+litterbug
+littleneck
+littoral
+liturgic
+liturgical
+liturgically
+liturgics
+liturgy
+livability
+liverwort
+livestock
+livid
+lividness
+loadable
+loam
+loamy
+lob
+lobotomy
+lobular
+lobularity
+lobularly
+lobule
+lobules
+locale
+locales
+localisms
+locational
+locationally
+locknut
+locksmith
+locksmithing
+locomotor
+locomotory
+locoweed
+lodestone
+lodgepole
+lodgment
+logarithmic
+loge
+loggerhead
+logion
+logions
+logistical
+logistically
+logjam
+loincloth
+loll
+loller
+lollies
+lolling
+lolly
+longevity
+longhand
+longhorn
+longhorns
+longish
+longitudinal
+longitudinally
+longshoremen
+longstanding
+longterm
+longtime
+looseleaf
+lop
+lope
+loped
+loper
+loping
+lopped
+lopping
+lops
+lopsided
+lopsidedly
+lopsidedness
+loquacious
+loquaciously
+loquaciousness
+loquacity
+lossage
+lossless
+lotion
+lotions
+loudspeaking
+louse
+loused
+louses
+lousewort
+lousing
+lovebird
+lovebirds
+loveless
+lovelessly
+lovelessness
+lovelorn
+lovelornness
+lowboy
+lowdown
+lowercase
+lowercased
+lowercases
+lowercasing
+lowlight
+lowlight's
+lowlights
+loyalist
+loyalists
+lozenge
+lozenged
+lozenges
+lubricate
+lubricated
+lubricates
+lubricating
+lubrications
+lubricative
+lubricious
+lubriciously
+lubricity
+lucent
+lucently
+lucid
+lucidity
+lucidly
+lucidness
+lucrative
+lucratively
+lucrativeness
+lucre
+lug
+luge
+luger
+lugged
+lugging
+lugs
+lulu
+lumbar
+lumberman
+lumbermen
+lumberyard
+lumen
+luminaries
+luminary
+luminescence
+luminescent
+luminosity
+lummox
+lumpier
+lumpiness
+lumpish
+lumpishly
+lumpishness
+lumpy
+lunacy
+lunary
+lunate
+lunated
+lunately
+lunation
+lunchroom
+lunchrooms
+lunchtime
+lunge
+lupine
+lurid
+luridly
+luridness
+lush
+lushes
+lushly
+lushness
+lustful
+lustfully
+lustfulness
+lutanist
+luxe
+luxes
+luxuriance
+luxuriate
+luxuriated
+luxuriating
+lycopodium
+lye
+lymphocyte
+lymphocytes
+lymphoma
+lyrical
+lyrically
+lyricalness
+lyricism
+lyricist
+lyricists
+m's
+ma
+macabre
+macabrely
+machinable
+machination
+machination's
+machinations
+machinelike
+machinist
+machinists
+machismo
+macho
+macintosh
+mack
+mackinaw
+mackintosh
+macrodynamic
+macromolecular
+macrophage
+macrophages
+macroscopically
+macrosimulation
+macrosocioeconomic
+madcap
+madding
+madhouse
+madmen
+madrigal
+madrigaling
+madrigals
+maestro
+magenta
+maggoty
+magi
+magisterial
+magisterially
+magnanimity
+magnanimous
+magnanimously
+magnanimousness
+magnate
+magnates
+magnesia
+magnesite
+magnetite
+magneto
+magnetos
+magnolia
+magnolias
+magnum
+magnums
+magpie
+magpies
+maidenhair
+maidservant
+maier
+mailman
+mailmen
+mainline
+mainlined
+mainliner
+mainliners
+mainlines
+mainlining
+mainstream
+majestically
+maladapt
+maladapted
+maladaptive
+maladjust
+maladjusted
+maladjustive
+maladjustment
+maladjustments
+maladroit
+maladroitly
+malaise
+malaprop
+malapropism
+malarial
+malarious
+malcontent
+malcontent's
+malcontented
+malcontentedly
+malcontentedness
+malcontents
+maledict
+malediction
+malevolence
+malevolencies
+malevolent
+malevolently
+malfeasant
+malformation
+malformations
+malformed
+malign
+malignancies
+malignancy
+maligned
+malignly
+malingering
+mallard
+mallards
+malleable
+malleableness
+malnourished
+malocclusion
+malposed
+malpractice
+maltreat
+mambo
+mambos
+mammalian
+manatee
+mandamus
+mandamused
+mandamuses
+mandamusing
+mandarin
+mandarins
+mandrake
+mandrakes
+manganese
+manhole
+manholes
+mania
+maniacal
+maniacally
+manic
+manicurists
+manikin
+manikins
+manna
+mannequin
+mannequins
+mannerism
+mannerisms
+manorial
+manservant
+manslaughter
+mantlepiece
+mantrap
+marathon
+marathons
+marauders
+margarine
+marginalia
+marginality
+maria
+marina
+marinade
+marinades
+marinas
+marionette
+marionettes
+marital
+maritally
+marksman
+marksmanship
+marlin
+marmalade
+marmalades
+maroon
+marooned
+marquee
+marquees
+marquess
+marquesses
+marred
+marriageable
+marring
+marrowbone
+marrowbones
+marshland
+marshlands
+marshmallow
+marshmallows
+martin
+martingale
+martini
+martinis
+mascara
+mascaras
+mascot
+mascot's
+mascots
+maser
+masque
+masquer
+masquers
+masques
+massless
+mastermind
+masterminded
+masterminding
+masterminds
+mastiff
+mastodon
+mastodons
+matchbook
+matchmake
+materialistic
+materiel
+maternity
+mathematic
+matinee
+matriarch
+matriarchal
+matriculate
+matriculated
+matriculates
+matriculating
+matrimonial
+matrimonially
+matting
+maturate
+maturated
+maturates
+maturating
+maturational
+maturations
+maturative
+maudlin
+maudlinly
+maul
+mauler
+maulers
+mauling
+mauls
+mausoleum
+mausoleums
+mauve
+maverick
+mavericks
+maw
+mawkish
+mawkishly
+mawkishness
+maxima
+maxwell
+mayorship
+meadowland
+meadowsweet
+mealier
+mealies
+mealtime
+mealy
+measle
+measled
+measlier
+measly
+meatier
+meatiest
+meatiness
+meaty
+mecca
+mechanist
+mechanistic
+mechanochemically
+mediator
+mediators
+medicate
+medicated
+medicates
+medicating
+medication
+medications
+medicative
+medico
+medicos
+medievalist
+medievalist's
+medievalists
+mediocre
+mediocrities
+mediocrity
+mediumistic
+medley
+medleys
+meetinghouse
+megahertz
+megalomania
+megalomaniac
+megalopolises
+megaton
+megatons
+megavolt
+megawatt
+megohm
+megohms
+melamine
+melange
+melanin
+melanoma
+melee
+meliorate
+meliorated
+meliorates
+meliorating
+melioration
+meliorations
+meliorative
+melodic
+melodically
+melodramatic
+melodramatics
+memento
+mementoes
+mementos
+memorabilia
+memoriam
+menarche
+menarches
+mendacious
+mendaciously
+mendaciousness
+mendacity
+mendelevium
+menfolk
+menfolks
+menopause
+menstrual
+menstruate
+menstruated
+menstruates
+menstruating
+menstruation
+menstruations
+mensurable
+mensurableness
+mensuration
+mensurations
+mercantile
+mercer
+mercers
+merchantability
+mercurial
+mercurially
+mercurialness
+mercuric
+meretricious
+meretriciously
+meretriciousness
+meringue
+meringues
+meritocracy
+meritocratic
+merlin
+mermaid
+mermaid's
+mermaids
+merman
+merman's
+mermen
+merrymaking
+mesa
+mescaline
+mesmeric
+meson
+mesquite
+metabolic
+metabolism
+metabolisms
+metabolite
+metabolites
+metalliferous
+metallography
+metalloid
+metallurgic
+metallurgical
+metallurgically
+metallurgists
+metalsmith
+metalsmithes
+metalwork
+metalworker
+metalworking
+metalworkings
+metamorphic
+metamorphism
+metamorphose
+metamorphosed
+metaphoric
+metaphosphate
+metaphysic
+meteorite
+meteorites
+meteoritic
+meteoritics
+meteoroid
+meteoroid's
+meteoroids
+meteorological
+methane
+methanol
+methodism
+methyl
+methylene
+meticulous
+meticulously
+meticulousness
+metro
+metronome
+metronomes
+metros
+mettle
+mettled
+mettles
+mettlesome
+mezzo
+mezzos
+miasma
+miasmal
+micro
+microamp
+microanalysis
+microanalytic
+microbial
+microchemistry
+microcosm
+microeconomic
+microfossils
+micrography
+microjoule
+microlevel
+micrometeorites
+micrometeoritic
+micrometer
+micrometer's
+micrometers
+micron
+microns
+microorganism
+microorganisms
+micros
+microscopical
+microscopically
+microscopy
+microsimulation
+microsimulations
+microsomal
+microvolt
+microvolts
+midair
+midas
+midband
+middleman
+middlemen
+middleweight
+middleweights
+midge
+midges
+midi
+midland
+midlander
+midlands
+midlife
+midmorn
+midmorning
+midrange
+midscale
+midsection
+midship
+midshipman
+midshipmen
+midships
+midspan
+midstream
+midterm
+midterm's
+midterms
+midweek
+midweekly
+midwife
+midwifed
+midwifing
+midwives
+midyear
+mignon
+migrant
+migrant's
+migrants
+migratories
+migratory
+mike
+mil
+milieu
+milieus
+militarist
+militate
+militated
+militates
+militating
+militiamen
+milkweed
+millenarian
+millenarianism
+millennia
+millennialism
+millennium
+milliamp
+milliampere
+milliamperes
+millidegree
+millidegrees
+millijoule
+millijoules
+milliners
+millinery
+millivolt
+millivoltmeter
+millivoltmeter's
+millivoltmeters
+millivolts
+milliwatt
+milliwatts
+millwright
+millwrights
+mime
+mimeograph
+mimeographed
+mimeographes
+mimeographing
+mimer
+mimesis
+mimetic
+mimetically
+miming
+mincemeat
+minefield
+mineralogical
+mineralogies
+mineralogist
+mineralogists
+mineralogy
+minesweeper
+minesweepers
+mini
+minidress
+minidresses
+minified
+minifies
+minify
+minifying
+minima
+minimalist
+minimalist's
+minimalists
+minimax
+minis
+miniscule
+miniskirt
+ministerial
+ministerially
+ministrations
+miniver
+minuend
+minuends
+minuet
+minuscule
+minuteman
+minutemen
+minutiae
+mirage
+miraged
+mirages
+miraging
+mirthless
+mirthlessly
+mirthlessness
+misalign
+misaligned
+misaligning
+misalignment
+misalignment's
+misalignments
+misaligns
+misanthrope
+misanthropic
+misbegotten
+misbehave
+misbehaved
+misbehaver
+misbehaves
+misbrand
+misbranded
+misbranding
+misbrands
+miscalculated
+miscarriage
+miscarriages
+miscarried
+miscarries
+miscarry
+miscarrying
+miscegenation
+miscegenations
+miscellanies
+miscellany
+misclassification
+misclassified
+misclassifying
+miscode
+miscoded
+miscodes
+miscoding
+misconstruction
+misconstructions
+miscount
+miscounted
+miscounting
+miscounts
+miscreant
+miscreants
+miscue
+miscue's
+miscues
+misdeed
+misdeeds
+misdemeanant
+misdemeanants
+misdirector
+misdirectors
+misfire
+misfired
+misfires
+misfiring
+misgauge
+misgauged
+misgauges
+misgauging
+misidentification
+misidentified
+misidentifies
+misidentify
+misidentifying
+misinterpretation
+misinterpretations
+misjudge
+misjudged
+misjudges
+misjudging
+misjudgingly
+mismanage
+mismanaged
+mismanages
+mismanaging
+misname
+misnamed
+misnames
+misnaming
+misogynist
+misogynist's
+misogynists
+misogyny
+misplacement
+misplacements
+mispronounce
+mispronounced
+mispronounces
+mispronouncing
+mispronunciation
+misquoted
+misrelated
+misreporting
+misrepresent
+misrepresented
+misrepresenter
+misrepresenting
+misrepresents
+misroute
+misrouted
+misroutes
+misshapen
+misshapenly
+misshapenness
+misshapennesses
+misspecification
+misspecified
+misstatement
+misstatements
+misstep
+mistletoe
+mistook
+mistrial
+miswritten
+mitzvahs
+mixup
+mm
+mobbed
+mobbing
+mobcap
+mobcaps
+mobile
+mobiles
+mobster
+mobsters
+mockingbird
+mockup
+mockups
+mod
+modernism
+modernistic
+modernists
+modicum
+modish
+modishly
+modishness
+mods
+moieties
+moiety
+moire
+molal
+molar
+molars
+moldboard
+molehill
+moll
+mollie
+mollification
+mollifications
+mollified
+mollifies
+mollify
+mollifying
+mollusk
+mollusks
+mollycoddle
+mollycoddled
+mollycoddler
+mollycoddles
+mollycoddling
+molybdenite
+molybdenum
+momenta
+momma
+mommy
+monad
+monadic
+monads
+monarchic
+monasticism
+monaural
+monaurally
+monetarism
+moneylenders
+moneymaking
+mongoose
+mongooses
+monies
+monkish
+monochromatic
+monochromator
+monocle
+monocled
+monocles
+monoclinic
+monocular
+monocularly
+monogamous
+monogamously
+monogamousness
+monogamy
+monolingual
+monolingualism
+monolinguals
+monolith
+monolithically
+monologist
+monologists
+monologue
+monologues
+monomer
+monomer's
+monomeric
+monomers
+monomial
+mononuclear
+monophonic
+monopolistic
+monopolists
+monosyllabic
+monosyllable
+monosyllables
+monotheistic
+monsieur
+monsoon
+monsoons
+monstrosities
+monstrosity
+montage
+montaged
+montages
+montaging
+monumentality
+moo
+moodily
+mooed
+moos
+mope
+mopes
+mopped
+mopping
+moraine
+moralist
+moralistic
+moratorium
+moratoriums
+morbidity
+mordant
+mordantly
+morgen
+morgue
+morgues
+moribund
+morocco
+moronic
+morose
+morosely
+moroseness
+morpheme
+morphemic
+morphine
+morphines
+morphism
+morphism's
+morphisms
+morphologic
+morphophonemic
+morphophonemics
+morris
+mortgagee
+mortgagees
+mortician
+morticians
+mosque
+mosques
+motherhood
+motherland
+moths
+motional
+motivator
+motorman
+motormen
+mottle
+mottled
+mottler
+mottles
+mottling
+mountable
+mountainside
+mountainsides
+mousier
+mousiness
+mousy
+mouthpiece
+mouthpieces
+mucilage
+mucky
+mucus
+mudding
+muddlehead
+muddleheaded
+muddleheadedness
+muddleheads
+mudguard
+mudsling
+mudslinger
+mudslingers
+mudslinging
+muggers
+muggier
+mugginess
+mugging
+muggings
+muggy
+mulatto
+mulattoes
+mulattos
+mulch
+mulched
+mulches
+mulching
+mulct
+mulish
+mulishly
+mulishness
+mull
+mullah
+mullen
+muller
+mulligan
+mulligatawny
+mulling
+multi
+multichannel
+multicollinearity
+multicolumn
+multicomputer
+multicomputer's
+multicomputers
+multidimensionality
+multidisciplinary
+multifaceted
+multifigure
+multifunctioned
+multilateral
+multilaterally
+multimedia
+multimegaton
+multimillionaire
+multinomial
+multiplet
+multiplets
+multipliable
+multipurpose
+multisyllabic
+multitudinous
+multitudinously
+multitudinousness
+multivalent
+multiversity
+mum
+mummification
+mummifications
+mummified
+mummify
+munge
+munged
+munger
+mungers
+munges
+munging
+mungings
+munificent
+munificently
+muon
+muriatic
+murk
+muscovite
+muscovites
+musculature
+mush
+musher
+musicality
+musicianship
+musicologists
+musicology
+muskellunge
+muskmelon
+muskox
+muskoxen
+muss
+mussed
+musses
+mussing
+must've
+mustachio
+mustachioed
+mustachios
+mustang
+mustangs
+mustn't
+mutant
+mutants
+mutational
+mutationally
+mutineer
+mutt
+mutuality
+mycology
+myers
+mylar
+mynah
+myocardial
+myocardium
+myopia
+myopic
+mystification
+mystified
+mystifier
+mystifies
+mystify
+mystifying
+mystifyingly
+mystique
+mythic
+mythographer
+mythographers
+mythography
+mythological
+mythologically
+myths
+n's
+nab
+nabbed
+nabbing
+nadir
+nagged
+nagging
+naggingly
+nameplate
+nameplates
+naphtha
+napped
+napping
+narcissist
+narcosis
+narrate
+narrated
+narrates
+narrating
+narration
+narrations
+narrator
+narrators
+nary
+nasality
+nascent
+nasturtium
+natal
+natalist
+natality
+natch
+nationalism
+nationalisms
+nationalistic
+nationhood
+nattier
+nattiness
+natty
+naturalistic
+nausea
+nauseas
+nauseate
+nauseated
+nauseates
+nauseating
+nauseatingly
+nautical
+nautically
+nautilus
+navel
+navels
+nd
+nearsighted
+nearsightedly
+nearsightedness
+nebulae
+nebular
+nebulous
+nebulously
+nebulousness
+neckline
+necromancer
+necromancers
+necromancy
+necromantic
+necropsy
+necrosis
+necrotic
+nectar
+nectaries
+nectarous
+nectary
+nee
+needlepoint
+negativism
+negativisms
+negativity
+negligee
+negligees
+negligent
+negligently
+negotiant
+negroid
+nelson
+nematic
+nematode
+nematodes
+nemesis
+neoclassic
+neoclassical
+neocortex
+neodymium
+neolithic
+neologism
+neologism's
+neologisms
+neomycin
+neon
+neonatal
+neonatally
+neoned
+neoplasms
+neoprene
+neptunium
+nerveless
+nervelessly
+nervelessness
+nervier
+nerviness
+nervy
+netherworld
+nettlesome
+neuralgia
+neurasthenic
+neuritis
+neuroanatomy
+neurologist
+neurology
+neuromuscular
+neuronal
+neuropathology
+neurophysiology
+neuropsychiatric
+neuroses
+neurosis
+neurotic
+neuter
+neutered
+neuterer
+neuterers
+neutering
+neuterings
+neuters
+neutralism
+neutralist
+neutralists
+neutron
+neutrons
+newel
+newfound
+newfoundland
+newlywed
+newlyweds
+newsboy
+newsboys
+newscast
+newscaster
+newscasters
+newscasting
+newscasts
+newspaperman
+newspapermen
+newsreel
+newsstand
+newsworthiness
+newsworthy
+newton
+nexus
+nexuses
+nichrome
+niggard
+niggardliness
+niggardly
+niggle
+niggled
+niggler
+niggles
+niggling
+nigglingly
+nightcap
+nightclub
+nightclubs
+nightdress
+nighthawk
+nightmarish
+nightmarishly
+nightshirt
+nighttime
+nihilism
+nihilisms
+nihilist
+nihilistic
+nilpotent
+nimbus
+nimbused
+nimbuses
+ninefold
+niobium
+nipped
+nipping
+nippingly
+nipple
+nipples
+nirvana
+nitpick
+nitrate
+nitrated
+nitrates
+nitrating
+nitration
+nitrations
+nitric
+nitride
+nitriding
+nitrite
+nitrogenous
+nitroglycerine
+nitrous
+nm
+nob
+nobelium
+noblemen
+noblesse
+nocturne
+nodal
+nodally
+nodular
+nodule
+nodules
+noisemake
+noisemaker
+noisemakers
+noisemaking
+nominee
+nominees
+nonacid
+nonadjacent
+nonagricultural
+nonbusiness
+noncarbohydrate
+nonchalant
+nonchalantly
+nonchalantness
+noncombatant
+noncommissioned
+noncommittal
+noncommittally
+noncompliance
+nonconformist
+nonconformists
+noncontiguous
+nondiscriminatory
+nondurable
+noneconomic
+nonemergency
+nonequivalence
+nonequivalent
+nonessential
+nonferrous
+nonfiction
+nonionic
+nonlinguistic
+nonliterary
+nonmagical
+nonmetallic
+nonogenarian
+nonpartisan
+nonpayment
+nonperturbing
+nonpoisonous
+nonpolitical
+nonprescription
+nonprofit
+nonracial
+nonrandom
+nonreducing
+nonresident
+nonresidential
+nonresistance
+nonrespondent
+nonrespondents
+nonresponse
+nonsingular
+nonstop
+nonsupervisory
+nonverbal
+nonverbally
+nonveteran
+nonveterans
+nonviolent
+nonviolently
+nonvolunteer
+nonvolunteers
+nonwhite
+noodle
+noodled
+noodles
+noodling
+noontime
+noose
+nooses
+noosing
+noradrenalin
+noradrenaline
+normative
+normatively
+normativeness
+northbound
+northernmost
+northland
+norths
+nosebleed
+nosebleed's
+nosebleeds
+nosier
+nosiness
+nostalgia
+nostalgic
+nostalgically
+nosy
+notary
+notate
+notated
+notates
+notating
+notative
+notoriety
+nouveau
+nouvelle
+nova
+nova's
+novas
+novitiate
+novitiates
+noxious
+noxiously
+noxiousness
+nozzle
+nozzles
+nth
+nuance
+nuanced
+nubile
+nucleate
+nucleated
+nucleation
+nuclei
+nucleic
+nucleoli
+nucleolus
+nuclide
+nude
+nudely
+nudeness
+nuder
+nudes
+nudest
+nudge
+nudged
+nudger
+nudges
+nudging
+nudism
+nudist
+nudists
+nudity
+nugatory
+nugget
+nuggets
+nullity
+numerable
+numerate
+numerated
+numerates
+numerating
+numeration
+numerations
+numerological
+numerology
+numinous
+numismatic
+numismatics
+numismatist
+nutate
+nutated
+nutates
+nutating
+nutation
+nutcrack
+nutcracker
+nutmeg
+nutrient
+nutrients
+nutritional
+nutritionally
+nutritionist
+nutritionists
+nutritious
+nutritiously
+nutritiousness
+nutritive
+nutritively
+nutshell
+nuttier
+nuttiness
+nutty
+nuzzle
+nuzzled
+nuzzles
+nuzzling
+nylon
+nylons
+nymphomania
+nymphomaniac
+nymphomaniacs
+o's
+oaf
+oafs
+oakwood
+oases
+obduracy
+obdurate
+obdurately
+obdurateness
+obeisant
+obeisantly
+obelisk
+obese
+obesity
+obfuscatory
+obit
+obiter
+obituaries
+obituary
+objectification
+objectifications
+objectified
+objectifies
+objectify
+objectifying
+objectivity
+obligational
+obnoxious
+obnoxiously
+obnoxiousness
+oboe
+oboes
+oboist
+obscenities
+obscenity
+obsequies
+obsequious
+obsequiously
+obsequiousness
+obsequy
+observably
+observational
+observationally
+obsess
+obsessed
+obsesses
+obsessive
+obsessively
+obsessiveness
+obsidian
+obsolescent
+obsolescently
+obtrude
+obtruded
+obtruder
+obtrudes
+obtruding
+obtrusive
+obtrusively
+obtrusiveness
+obtuse
+obtusely
+obtuseness
+obtuser
+obtusest
+obverse
+obversely
+ocarina
+occident
+occidental
+occidentally
+occipital
+occipitally
+occlusive
+occult
+occulter
+occultly
+oceanic
+oceanographic
+oceanography
+oceanside
+ocelot
+octagon
+octagonal
+octagonally
+octagons
+octahedron
+octane
+octennial
+octet
+octile
+octillion
+octogenarian
+octoroon
+ocular
+oculist
+odium
+odometer
+odometer's
+odometers
+odyssey
+offal
+offbeat
+offertories
+offertory
+offhand
+offhanded
+offhandedly
+offhandedness
+officeholder
+officeholders
+officemate
+officemates
+officialdom
+offload
+offloaded
+offloading
+offloads
+offramp
+offsetting
+offshoot
+offshore
+offstage
+ogive
+ogled
+ohm
+ohmic
+ohmmeter
+ohmmeter's
+ohmmeters
+ohms
+oilman
+oilmen
+oilseed
+oilseeds
+oldies
+oldster
+oldsters
+oldy
+oleander
+oleanders
+oleomargarine
+oligarchic
+oligarchy
+oligopolistic
+oligopoly
+omega
+omegas
+omelet
+omelets
+omicron
+omni
+omnibus
+omnipotence
+omnipotent
+omnipotently
+oncology
+oncoming
+onetime
+oneupmanship
+onlooker
+onlookers
+onrush
+onrushing
+onslaught
+onslaughts
+ontogeny
+ontological
+ontologically
+ontology
+onus
+onyx
+oodles
+opalescent
+opalescently
+operant
+operantly
+operants
+operatic
+operetta
+ophthalmic
+ophthalmologist
+opinionated
+opinionatedly
+opinionatedness
+opossum
+opposable
+opprobrium
+opthalmic
+opthalmologic
+opthalmology
+opticians
+optimist
+optimists
+optionality
+optometric
+optometrist
+optometrists
+optometry
+opulent
+opulently
+opus
+opuses
+orangutan
+orate
+orated
+orates
+orating
+oratorical
+oratorically
+oratorio
+oratorios
+orchestral
+orchestrally
+orchestrate
+orchestrated
+orchestrater
+orchestrates
+orchestrating
+orchestration
+orchestrations
+ordnance
+ordnances
+oregano
+organdy
+organically
+organismic
+organometallic
+orgasm
+orgasms
+orgiastic
+oriental
+orientally
+oriole
+orioles
+ornate
+ornately
+ornateness
+orneriness
+ornery
+orographic
+orography
+orphanage
+orphanages
+orphanhood
+orthodontic
+orthodontics
+orthodontist
+orthodontists
+orthodoxy
+orthographic
+orthographies
+orthography
+orthonormal
+orthophosphate
+orthophosphates
+osmium
+osmosis
+osmotic
+osprey
+ospreys
+osseous
+osseously
+ossification
+ossifications
+ossified
+ossify
+ostensible
+ostensibly
+ostentatious
+ostentatiously
+ostentatiousness
+osteology
+osteopath
+osteopathic
+osteopaths
+osteopathy
+osteoporosis
+ostracism
+otherworld
+otherworldliness
+otherworldly
+ouch
+oughtn't
+oust
+ousted
+ouster
+ousting
+outage
+outage's
+outages
+outback
+outboard
+outboards
+outclass
+outclassed
+outcrops
+outdated
+outdatedness
+outdistanced
+outdistancing
+outdo
+outdrew
+outface
+outfield
+outfielder
+outfielders
+outfitted
+outflow
+outflows
+outfought
+outfox
+outgeneraled
+outgrip
+outhouse
+outland
+outlander
+outlanders
+outlandish
+outlandishly
+outlandishness
+outlawry
+outliers
+outlying
+outmatched
+outmigration
+outmoded
+outnumber
+outnumbered
+outnumbering
+outnumbers
+outpatient
+outpatients
+outplayed
+outpour
+outpouring
+outpourings
+outreach
+outrigger
+outriggers
+outscoring
+outshone
+outsized
+outsmart
+outsmarted
+outsmarting
+outsmarts
+outspoken
+outspokenly
+outspokenness
+outspread
+outstate
+outstation
+outworn
+ouzo
+ova
+ovate
+ovates
+ovation
+ovationed
+ovationing
+ovations
+overabundance
+overactive
+overage
+overaggressive
+overarching
+overbearing
+overbearingly
+overbearingness
+overburden
+overburdened
+overburdening
+overburdeningly
+overburdens
+overcerebral
+overconfident
+overconfidently
+overconsumption
+overcooked
+overcooled
+overcorrection
+overcurious
+overdeveloped
+overdoing
+overdriving
+overeager
+overeagerly
+overeagerness
+overeat
+overeaten
+overeater
+overeating
+overeducated
+overexcited
+overexploitation
+overexploited
+overexpose
+overextend
+overextended
+overextending
+overextends
+overextension
+overfall
+overfeed
+overfill
+overfilled
+overfilling
+overfills
+overgenerous
+overgrazing
+overgrown
+overhand
+overhanded
+overheat
+overheated
+overheating
+overheats
+overindulged
+overlords
+overloud
+overpaid
+overpayment
+overplayed
+overplaying
+overpopulated
+overpopulation
+overpressure
+overprice
+overpriced
+overprotection
+overprotective
+overran
+overrated
+overreach
+overreached
+overreacher
+overreaches
+overrepresented
+oversample
+oversampled
+oversampling
+oversaturate
+overshoes
+oversize
+oversized
+oversizes
+oversoft
+oversoftness
+overspill
+overstay
+overstepping
+overstraining
+overstrike
+overstrikes
+overstriking
+oversubscribed
+oversupply
+overtaxed
+overwrap
+oviform
+ovulatory
+owlish
+owlishly
+owlishness
+owly
+oxalate
+oxalic
+oxaloacetic
+oxcart
+oxidant
+oxidate
+oxidations
+oxidative
+oxidatively
+oxygenate
+oxygenated
+oxygenates
+oxygenating
+oxygenation
+oxygenations
+oxyhydroxides
+ozone
+p's
+pH
+pacemaker
+pacesetting
+pacifism
+pacifist
+pacifistic
+paddock
+padlock
+padlocked
+padlocks
+padre
+paean
+paeans
+paganism
+pageantry
+pagoda
+pagodas
+paintbrush
+palatability
+palatable
+palatableness
+palatal
+palatally
+palefaces
+palette
+palindrome
+palindromes
+palindromic
+palisade
+palisades
+palladium
+pallet
+palmetto
+palmist
+palpable
+palpably
+palsied
+palsies
+palsy
+palsying
+paltrier
+paltriness
+paltry
+pamper
+pampered
+pamperer
+pampering
+pampers
+panama
+pancreatic
+pandemic
+panicked
+panicky
+panjandrum
+panoplied
+panoply
+panorama
+panoramas
+panoramic
+pantheism
+pantheist
+pantheon
+pantomime
+pantomimed
+pap
+papen
+paperboard
+paperhangers
+paperiness
+paperweight
+paperweights
+papery
+papillary
+papoose
+pappies
+pappy
+papyri
+papyrus
+papyruses
+parable
+parables
+parabola
+parabolic
+paraboloid
+paraboloidal
+paradigmatic
+paradoxic
+parakeet
+parakeets
+parallelepiped
+parallelepipeds
+paramagnet
+paramagnetic
+paramedical
+parametrically
+paranoiac
+paranoiacs
+paranormal
+paranormally
+paraphernalia
+paraplegic
+paraprofessional
+paraprofessionals
+parapsychology
+parasol
+parasols
+parasympathetic
+paratroop
+paratrooper
+paratroopers
+paratroops
+parboil
+parboiled
+parenthetic
+pariah
+parimutuel
+parimutuels
+parishioner
+parishioners
+parkish
+parkland
+parklike
+parkway
+parlance
+parlay
+parlayed
+parley
+parleys
+parliamentarian
+parliamentarians
+parochial
+parochialism
+parochialism's
+parochialisms
+parochially
+parodied
+parodies
+parody
+parolee
+parolees
+parquet
+parqueted
+parqueting
+parrotlike
+parsec
+parsecs
+parsimonious
+parsimoniously
+parsnip
+parsonage
+participial
+participially
+participle
+participles
+particularistic
+particularity
+particulate
+particulates
+partook
+parvenu
+passable
+passband
+passerby
+passersby
+pasta
+pasteboard
+pastel
+pastels
+pasteup
+pastiche
+pastier
+pasties
+pastiness
+pasty
+patchier
+patchiness
+patchy
+patentee
+patentees
+paternalism
+paternalistic
+paternity
+paternoster
+pathless
+pathlessness
+pathogen
+pathogenesis
+pathogenic
+pathogens
+pathologic
+patina
+patinas
+patio
+patios
+patriarchal
+patriarchies
+patriarchy
+patrimonial
+patrimony
+patristic
+patristics
+patrolled
+patrolling
+patrolman
+patrolmen
+patroness
+patted
+patting
+paunch
+paunchier
+paunchiness
+paunchy
+pauper
+pawnshop
+pawnshop's
+pawnshops
+payday
+payload
+payload's
+payloads
+paymaster
+paymasters
+peacemaking
+peacetime
+peacetimes
+peaky
+peasanthood
+pecan
+pecans
+peccadilloes
+peccary
+pectoral
+pectorals
+peculate
+peculated
+peculates
+peculating
+peculation
+pecuniary
+pedagogue
+pedagogy
+pedal
+pedals
+pedant
+pedantry
+peddle
+peddled
+peddles
+peddling
+pediatrician
+pedigree
+pedigreed
+pediment
+pedimented
+peephole
+peepy
+peerage
+peevish
+peevishly
+peevishness
+pegboard
+pegboards
+pegged
+pegging
+pejorative
+pejoratively
+pejoratives
+pelican
+pelicans
+pellagra
+pelvic
+pelvis
+pelvises
+pemmican
+penal
+penally
+penchant
+pendant
+penicillin
+penitential
+penitentially
+penknife
+penknife's
+penknives
+penman
+penmen
+pennant
+pennants
+pentagonal
+pentagonally
+pentecostal
+penultimate
+penultimately
+penurious
+penuriously
+penuriousness
+penury
+peonies
+peony
+peppergrass
+peppermint
+peppermints
+pepperoni
+peppery
+peppier
+peppiness
+pepping
+peppy
+peptidase
+peptidases
+peptide
+peptides
+percept
+percolator
+percolators
+percussion
+percussions
+percussive
+percussively
+percussiveness
+perdition
+perditions
+perfectibility
+perfectible
+perfectionism
+perfidious
+perfidiously
+perfidiousness
+perfidy
+perforate
+perforated
+perforates
+perforating
+perforation
+perforations
+perfumery
+perfunctorily
+perfunctoriness
+perfunctory
+perfusion
+perihelion
+perimeter
+periodicities
+periodicity
+periodontal
+periodontally
+peripatetic
+periphrastic
+periscope
+periscopes
+periwinkle
+periwinkles
+perjure
+perjured
+perjurer
+perjures
+perjuring
+perjury
+perk
+perked
+perkier
+perkiness
+perking
+perks
+perky
+permalloy
+permanency
+permeable
+permeableness
+pernicious
+perniciously
+perniciousness
+peroxide
+perpetuity
+perquisite
+perquisites
+persecutory
+persiflage
+persimmon
+persimmons
+persona
+personae
+perspicacious
+perspicaciously
+perspicaciousness
+perspicuity
+perspire
+perspired
+perspires
+perspiring
+pert
+pertinacious
+pertinaciously
+pertinaciousness
+pertinence
+pertly
+pertness
+pervasion
+perverse
+perversely
+perverseness
+perversion
+perversions
+perversive
+peskier
+pesky
+pessimism
+pessimist
+pessimists
+pesticide
+pesticides
+pestilent
+pestilential
+pestilentially
+pestilently
+pestle
+pestled
+pestles
+pestling
+petite
+petiteness
+petits
+petri
+petrification
+petrified
+petrify
+petrochemical
+petroglyph
+petrol
+petrology
+pettish
+pettishly
+pettishness
+petulance
+petulances
+petulant
+petulantly
+petunia
+peyote
+pfennig
+phagocyte
+phagocytes
+phalanger
+phalanx
+phalanxes
+phantasy
+pharmaceutic
+pharmaceutical
+pharmaceutically
+pharmaceuticals
+pharmaceutics
+pharmacies
+pharmacist
+pharmacists
+pharmacological
+pharmacologically
+pharmacology
+pharmacy
+pharyngeal
+pharynx
+pharynxes
+phenol
+phenolic
+phenotype
+phenyl
+phi
+philander
+philandered
+philanderer
+philanderer's
+philanderers
+philandering
+philanders
+philanthropic
+philanthropies
+philanthropist
+philanthropists
+philanthropy
+philharmonic
+philodendron
+philological
+philologically
+philologists
+philology
+phlegm
+phlox
+phobic
+phoebe
+phoenix
+phonetically
+phonic
+phonics
+phonier
+phonies
+phoniness
+phonologic
+phonological
+phonologically
+phonology
+phony
+phosphide
+phosphine
+phosphines
+phosphor
+phosphoresce
+phosphorescent
+phosphorescently
+phosphors
+phosphorus
+photochemical
+photochemically
+photoelectronic
+photoelectrons
+photoengravers
+photogenic
+photographically
+photoluminescence
+photolysis
+photolytic
+photometric
+photometry
+photomicrograph
+photomicrography
+photon
+photon's
+photons
+photorealism
+photosensitive
+phrasemaking
+phraseologies
+phraseology
+phraseology's
+phylogeny
+physiochemical
+physiognomy
+physiologic
+physiologist
+physiotherapist
+physiotherapy
+phytoplankton
+pianism
+pianissimo
+pianist
+pianistic
+pianists
+pica
+piccolo
+pickaxe
+pickerel
+pickerels
+pickier
+pickoff
+pickoffs
+picky
+picnicked
+picnicker
+picnickers
+picnicking
+picofarad
+picofarads
+picojoule
+piddle
+piddling
+pidgin
+piedmont
+piezoelectric
+piezoelectricity
+pigeonhole
+pigeonholed
+pigeonholes
+pigeonholing
+pigging
+piggish
+piggishly
+piggishness
+piggy
+pigmentation
+pigmentations
+pigpen
+pigpens
+pigroot
+pigskin
+pigsty
+pigtail
+pigtailed
+pilfer
+pilfered
+pilferer
+pilfering
+pilfers
+pilloried
+pillories
+pillory
+pillorying
+pimento
+pimp
+pimping
+pimple
+pimpled
+pimples
+pimplike
+pimply
+pimps
+pinafore
+pinafores
+pinball
+pincushion
+pinhead
+pinheaded
+pinheadedness
+pinheads
+pinhole
+pinholes
+pinkie
+pinkies
+pinkish
+pinkishness
+pinochle
+pintail
+pintails
+pinto
+pinwheel
+pion
+pip
+pipet
+pipette
+piquant
+piquantly
+piquantness
+piracy
+pirouette
+pirouetting
+pistachio
+pistole
+pistoleers
+pitchblende
+pitchfork
+pitchfork's
+pitchforks
+pitchstone
+pitman
+piton
+piton's
+pitons
+pittance
+pittance's
+pittances
+pitting
+pituitary
+pixies
+pixiness
+pixmap
+pixmap's
+pixmaps
+pixy
+pizza
+pizzicato
+placate
+placated
+placater
+placates
+placating
+placation
+placative
+placeable
+placeless
+placelessly
+placenta
+placental
+plagiarism
+plagiarist
+plainclothes
+planeload
+planetaria
+planetarium
+planetesimal
+planetoid
+planetoids
+plankton
+planoconcave
+planoconvex
+plantain
+plaque
+plaques
+plasm
+plastically
+platitude
+platitudes
+platitudinous
+platitudinously
+platonic
+platoon
+platoons
+platted
+plausibly
+playback
+playbacks
+playboy
+playboys
+playhouse
+playhouses
+playoff
+playroom
+playtime
+playwriting
+plaza
+plazas
+pleat
+pleated
+pleater
+pleats
+plenipotentiary
+plenitude
+plenum
+plethora
+pleura
+pleural
+pleuras
+pliable
+pliableness
+pliancy
+pliant
+pliantly
+pliantness
+plink
+plinked
+plinker
+plinking
+plinks
+plodded
+plodding
+ploddingly
+plop
+plopped
+plopping
+plosive
+plover
+plovers
+pluggable
+plummer
+plummet
+plummeted
+plummets
+plunk
+plunker
+plunkers
+plunking
+pluralism
+pluralist
+pluralistic
+pluralists
+plushier
+plushiness
+plushy
+plutonium
+plywood
+pneumatic
+pneumatics
+pock
+pocketful
+pocketknife
+pocketknife's
+pocketknives
+podge
+podger
+podgers
+podia
+podium
+poesies
+poesy
+pogo
+pogrom
+pogroms
+poignancy
+poignant
+poignantly
+poinsettia
+pokerface
+pokerfaced
+pol
+polarimeter
+polarimeter's
+polarimeters
+polarimetry
+polariscope
+polarogram
+polarogram's
+polarograms
+polarograph
+polarography
+polecat
+polemical
+polemically
+policymaker
+policymakers
+policymaking
+polio
+polis
+politburo
+politicking
+politico
+politicos
+polities
+polka
+polka's
+polkas
+pollock
+pollutant
+pollutants
+polonaise
+polonium
+polybutene
+polybutenes
+polychemicals
+polycrystalline
+polyelectrolytes
+polyester
+polyesters
+polyether
+polyethers
+polyethylene
+polygamous
+polygamously
+polygamy
+polygonal
+polygonally
+polygynous
+polyhedra
+polyhedral
+polyhedron
+polyisobutylene
+polyisocyanates
+polymerase
+polymeric
+polymorph
+polymorphic
+polymyositis
+polyphony
+polyphosphate
+polyphosphates
+polypropylene
+polystyrene
+polytechnic
+polytonal
+polytonally
+polyunsaturated
+pomegranate
+pompadour
+pompano
+pompons
+pomposity
+poncho
+pons
+pontiff
+pontifical
+pontificals
+pontificate
+pontificated
+pontificates
+pontificating
+pontification
+pooch
+pooched
+poodle
+pooh
+popcorn
+poplin
+popper
+poppyseed
+popularism
+porcine
+porgy
+pornographer
+pornography
+porosity
+porous
+porously
+porousness
+porpoise
+porpoises
+portage
+portaged
+portaging
+portent
+portentous
+portentously
+portentousness
+portents
+porterhouse
+portfolio
+portfolios
+portmanteau
+portmanteaus
+portraiture
+portrayal
+portrayals
+poseur
+poseurs
+posh
+poshest
+positivism
+positivist
+positivists
+positron
+posse
+posses
+postdate
+postdated
+postdates
+postdating
+postdoctoral
+posteriori
+postfix
+postfixed
+postfixes
+postfixing
+postgraduate
+posthumous
+posthumously
+posthumousness
+postlude
+postludes
+postmarital
+postmark
+postmarked
+postmarks
+postmen
+postmortem
+postoperative
+postoperatively
+postorder
+postpartum
+postponement
+postpositions
+postsecondary
+postvocalic
+postwar
+potable
+potableness
+potage
+potbellied
+potbelly
+potboil
+potboiler
+potboilers
+potency
+pothole
+potholed
+potholing
+potion
+potions
+potlatch
+potlatches
+potluck
+potpourri
+poultice
+poultices
+pow
+powderpuff
+powdery
+practicability
+pragmatism
+pragmatist
+pragmatists
+praiseworthiness
+praiseworthy
+pram
+prams
+praseodymium
+prattle
+prattled
+prattler
+prattles
+prattling
+prattlingly
+praxes
+praxis
+prayerful
+prayerfully
+prayerfulness
+preamble
+preambles
+prearranged
+precautionary
+precess
+precessed
+precesses
+precessing
+precession
+prechlorination
+precipitable
+precocity
+precode
+precoded
+precollege
+precolonial
+preconscious
+precooked
+precut
+predator
+predator's
+predators
+predatory
+predecline
+predestined
+predicator
+predigested
+predilect
+predilection
+predilections
+predispose
+predisposed
+predisposes
+predisposition
+predispositions
+predoctoral
+predominance
+preeminence
+preeminent
+preeminently
+preemployment
+preemptor
+preen
+preener
+preening
+preexistent
+preexisting
+prefab
+prefabricate
+prefabricated
+prefabrication
+prefatory
+prefect
+prefects
+prefecture
+prefectures
+preferment
+prefiguration
+preflight
+preflighted
+preflighting
+preflights
+pregnancies
+pregnancy
+preindustrial
+preinterview
+preisolated
+prejudicial
+prejudicially
+prejudicialness
+preliterate
+premarital
+premaritally
+premarket
+premeditate
+premeditation
+premeditative
+premix
+premixed
+premonition
+premonitions
+premonitory
+preordainment
+prep
+prepackaged
+prepayment
+preponderance
+preponderances
+preponderant
+preponderantly
+preponderate
+preponderately
+preponderating
+preponderation
+prepping
+preprepared
+preprocessing
+prepubescent
+prepublication
+preradiation
+presage
+presaged
+presager
+presages
+presaging
+preschool
+preschooler
+prescience
+prescience's
+prescript
+presentable
+presentableness
+presentational
+presentments
+presoaks
+pressman
+pressmen
+prestidigitate
+prestidigitation
+prestidigitator
+prestigious
+prestigiously
+prestigiousness
+presto
+prestos
+presumable
+presupposition
+presuppositions
+pretest
+pretested
+pretesting
+pretests
+pretrial
+pretzels
+prevision
+previsioned
+previsioning
+previsions
+prewar
+prickle
+prickled
+prickling
+priestess
+priestesses
+prig
+priggish
+priggishly
+priggishness
+prim
+primal
+primate
+primates
+primitivism
+primly
+primness
+primordial
+primordially
+primp
+primping
+printmake
+printmaker
+printmakers
+printmaking
+prismatic
+prissier
+prissiness
+prissy
+pristine
+pristinely
+privateer
+privateer's
+privateers
+probabilist
+probity
+procaine
+processional
+processionally
+procreate
+procreation
+procreative
+procreativity
+procrustean
+proctor
+proctor's
+proctored
+proctoring
+proctors
+prod
+prodded
+prodding
+prodigies
+prodigy
+prof
+profanity
+professorial
+professorially
+professorship
+profligate
+profligately
+profligates
+profoundity
+profundity
+profuse
+profusely
+profuseness
+profusion
+progenitor
+prognoses
+prognosis
+prognosticate
+prognostication
+prognosticative
+prognosticator
+progressivism
+prohibitory
+projectile
+projectiles
+projectionist
+projectionists
+prolate
+prolifically
+prolix
+prolixity
+prolixly
+prolongate
+prolongated
+prolongates
+prolongating
+prolongation
+promethium
+promptitude
+promulgators
+pronto
+proofreader
+proofreading
+proofreads
+propagandist
+propagandistic
+propagandists
+propane
+propellant
+propellants
+propelling
+prophetically
+propinquity
+propionate
+propitiate
+propitiation
+proportionality
+proportionate
+propped
+propping
+proprietorship
+proprietorships
+proprioception
+proprioceptive
+propylene
+prorate
+prorated
+prorating
+proration
+prosaic
+proscenium
+prosceniums
+proscribe
+proscribed
+proscriber
+proscribes
+proscribing
+proscription
+prosecutor
+prosecutors
+prosodies
+prosody
+prostate
+prosthetic
+prosthetics
+prostitute
+prostitutes
+protactinium
+protagonist
+protagonists
+protean
+protease
+proteases
+protectionist
+proteolysis
+proteolytic
+protestant
+protoplasmic
+prototypic
+protozoa
+protozoan
+protract
+protracted
+protractive
+protrusive
+protrusively
+protrusiveness
+protuberance
+protuberant
+provenance
+proverbial
+proverbially
+provident
+providential
+providentially
+providently
+provincialism
+proviso
+provocateur
+provocateurs
+provocative
+provocatively
+provocativeness
+provost
+proxies
+proxy
+prudential
+prudentially
+prurient
+pruriently
+psalmist
+pseudonym
+pseudonym's
+pseudonyms
+psi
+psych
+psychedelic
+psychiatric
+psychic
+psychic's
+psychical
+psychically
+psychics
+psycho
+psychoacoustic
+psychoacoustics
+psychoactive
+psychoanalysis
+psychoanalyst
+psychoanalytic
+psychobiology
+psychocultural
+psycholinguistic
+psycholinguistics
+psychometric
+psychometrics
+psychometry
+psychopath
+psychopathic
+psychophysic
+psychophysical
+psychophysically
+psychophysics
+psychophysiology
+psychos
+psychoses
+psychosis
+psychosomatic
+psychosomatics
+psychotherapeutic
+psychotherapeutics
+psychotherapists
+psychotherapy
+psychotic
+ptarmigan
+puberty
+pubescent
+publicists
+puck
+puckish
+puckishly
+puckishness
+puddly
+pudgier
+pudginess
+pudgy
+pueblo
+pueblos
+puerile
+puerilely
+puffball
+puffballs
+puffery
+puffin
+puffiness
+puffins
+puffy
+puissant
+puissantly
+puke
+puked
+pukes
+puking
+pullover
+pulmonary
+pulsar
+pulsar's
+pulsars
+pulsate
+pulsated
+pulsates
+pulsating
+pulsation
+pulsations
+pulverable
+puma
+puma's
+pumice
+pumiced
+pumicing
+pummel
+pummels
+punctuality
+punctuate
+punctuated
+punctuates
+punctuating
+pundit
+punditry
+pundits
+pungency
+pungent
+pungently
+punk
+punkier
+punkies
+punkiness
+punks
+punky
+punster
+punsters
+pupal
+pupate
+pupated
+pupates
+pupating
+pupation
+puppeteer
+puppeteers
+puppyish
+purgation
+purgative
+purgatory
+purism
+purist
+purists
+puritan
+puritanic
+puritanical
+puritanically
+puritans
+purloin
+purloined
+purloiner
+purloining
+purloins
+purposeless
+purposelessly
+purposelessness
+pursuant
+purvey
+purveyed
+purveying
+purveyor
+purveyors
+purveys
+pus
+pushier
+pushiness
+pushup
+pushy
+pussycat
+putative
+putatively
+putrefy
+putrid
+putridly
+putridness
+putt
+putted
+puttied
+putties
+putty
+puttying
+pyknotic
+pyramidal
+pyramidally
+pyre
+pyridine
+pyrolysis
+pyrometer
+pyrometer's
+pyrometers
+pyrometry
+pyrophosphate
+pyrotechnic
+pyrotechnics
+pyroxene
+pyroxenite
+python
+pythons
+q's
+quackery
+quad
+quadrangle
+quadrangles
+quadrangular
+quadrapole
+quadrennial
+quadrennially
+quadric
+quadriceps
+quadrilateral
+quadrilaterals
+quadrille
+quadrilles
+quadrillion
+quadrillionth
+quadripartite
+quadripartitely
+quadripartition
+quadriplegic
+quadrivium
+quadruplicate
+quadruplicated
+quadruplicates
+quadruplicating
+quadruplication
+quadruplications
+quaff
+quaffer
+quahog
+quantile
+quantiles
+quarryman
+quarrymen
+quarterback
+quarterbacks
+quartermaster
+quartermasters
+quartile
+quartiles
+quartzite
+quasar
+quasar's
+quasars
+quaternaries
+quaternary
+quatrain
+queasier
+queasiness
+queasy
+querulous
+querulously
+querulousness
+quibble
+quibbled
+quibbler
+quibbles
+quibbling
+quiche
+quiches
+quickie
+quickies
+quicklime
+quicksand
+quicksands
+quickstep
+quicksteps
+quiescent
+quiescently
+quiescentness
+quincy
+quinquennial
+quinquennially
+quint
+quintessential
+quintet
+quintets
+quintile
+quintiles
+quintillion
+quintillionth
+quip
+quipping
+quips
+quirk
+quirking
+quirks
+quirt
+quixotic
+quizzical
+quizzically
+quonset
+quorum
+r's
+rabbi
+rabbinical
+rabbinically
+rabid
+rabidly
+rabidness
+rabies
+racetrack
+racetracker
+raceway
+racier
+raciness
+racism
+racist
+racists
+rackety
+racquet
+racquets
+racy
+radian
+radians
+radicalism
+radices
+radii
+radioactive
+radioactively
+radioactivities
+radioactivity
+radioastronomy
+radiocarbon
+radiochemical
+radiochemically
+radiochemistry
+radiographic
+radiography
+radiologic
+radiological
+radiologically
+radioman
+radiomen
+radiometer
+radiometer's
+radiometers
+radiometric
+radiometry
+radionics
+radiophysics
+radiotherapy
+radium
+radon
+raffish
+raffishly
+raffishness
+raffle
+raffled
+raffles
+raffling
+ragging
+ragout
+ragweed
+ragweeds
+railbird
+railbirds
+railhead
+railheads
+raillery
+rainless
+rainstorm
+rainwater
+rajah
+rakish
+rakishly
+rakishness
+ramified
+ramifies
+ramify
+ramifying
+rammed
+ramming
+rampage
+rampaged
+rampages
+rampaging
+rampant
+rampantly
+ramrod
+ramrods
+rancho
+ranchos
+rancid
+rancidity
+rancidness
+rancorous
+rancorously
+randies
+randy
+rangeland
+rangelands
+rangier
+ranginess
+rangy
+rapacious
+rapaciously
+rapaciousness
+rapier
+rapists
+rapped
+rappel
+rapper
+rapper's
+rappers
+rapping
+rapport
+rapprochement
+rarefied
+rarefy
+ratable
+ratchet
+ratchet's
+ratcheted
+ratcheting
+ratchets
+rateable
+ratiocinate
+ratiocinated
+ratiocinates
+ratiocinating
+ratiocination
+ratiocinative
+rationalism
+rationalist
+rationalistic
+rationalists
+rattail
+rattier
+ratty
+raucous
+raucously
+raucousness
+ravish
+ravisher
+ravishes
+ravishing
+ravishingly
+rawboned
+rawhide
+rawhided
+rawhiding
+raze
+razed
+razer
+razes
+razing
+razorback
+rd
+reachability
+reactant
+reactants
+readably
+readership
+readership's
+readjust
+readjuster
+readjusting
+readjustment
+reaffirmation
+reafforest
+reagent
+realtor
+realtors
+realty
+reappearance
+reapplication
+reapportionment
+reappraise
+reappraising
+reassert
+reasserted
+reasserting
+reassurance
+recalcitrant
+recallable
+recant
+recanted
+recappable
+recency
+receptionist
+receptionists
+recertification
+recheck
+rechecking
+recherche
+recherches
+recipiency
+recitative
+recluse
+recluse's
+recluses
+reclusion
+reclusive
+recoilless
+recommence
+recommencing
+recommendable
+recommendatory
+recommittal
+recomposition
+reconciliatory
+recondite
+reconditely
+reconditeness
+recondition
+reconditioning
+reconditionings
+reconditions
+reconfigurability
+reconnaissance
+reconquer
+reconquered
+reconquering
+reconquers
+recontamination
+reconvene
+reconvening
+reconvention
+reconverting
+recopied
+recopies
+recopy
+recoup
+recouped
+recouping
+recoups
+recriminate
+recriminated
+recriminates
+recriminating
+recrimination
+recriminations
+recriminative
+recruitment
+rectification
+rectifications
+rectified
+rectifier
+rectifiers
+rectify
+rectilinear
+rectilinearly
+rectitude
+rectory
+recumbent
+recumbently
+recuperate
+recuperated
+recuperates
+recuperating
+recuperation
+recuperative
+recurred
+recusant
+recuse
+redact
+redactions
+redactor
+redbird
+redbirds
+redbud
+redcoat
+redcoats
+redding
+redecorating
+redecoration
+rededicate
+redemptive
+redeposition
+redhead
+redheaded
+redheader
+redheads
+rediscover
+rediscovering
+rediscovery
+redistricting
+redneck
+rednecked
+rednecks
+redo
+redound
+reduct
+reductionism
+reductive
+redwood
+redwoods
+reedier
+reedy
+reek
+reeked
+reeker
+reeking
+reeks
+reelection
+reemission
+reemission's
+reemissions
+reenact
+reentry
+reenumerate
+reenumeration
+reestimate
+reeve
+reexamination
+refactoring
+refashion
+refectories
+refectory
+referenda
+refinance
+refineries
+refinery
+reflectance
+reflux
+refluxed
+refluxes
+refluxing
+reforestation
+reformability
+reformatories
+reformatory
+reformism
+reformist
+reformists
+refract
+refracted
+refracting
+refraction
+refractive
+refractively
+refractiveness
+refractometer
+refractometer's
+refractometers
+refrigerate
+refrigerated
+refrigeration
+refurbish
+refurbished
+refurbisher
+refurbishing
+regale
+regalia
+regatta
+regattas
+regency
+regimentation
+regionalism
+registrable
+registrant
+registrants
+registrar
+registrars
+registries
+registry
+regressors
+reground
+regulatory
+rehabilitate
+rehabilitated
+rehabilitates
+rehabilitating
+rehabilitation
+rehabilitations
+rehabilitative
+rehearing
+reimbursable
+reimburse
+reimburses
+reimbursing
+reinstitution
+reinterpretation
+reinterview
+reinvest
+reinvestigation
+reinvigoration
+rejigger
+rejoinder
+relativist
+releasable
+relevancy
+reliant
+reliantly
+relict
+religionists
+religiosity
+relocatable
+remake
+remaking
+remand
+remanded
+remanding
+remarriage
+remarry
+remarrying
+rematch
+remediable
+remediableness
+remedial
+reminisce
+reminisced
+reminisces
+reminiscing
+remiss
+remission
+remissly
+remissness
+remit
+remits
+remitted
+remitting
+remorseful
+remorsefully
+remorsefulness
+remorseless
+remorselessly
+remorselessness
+remounting
+remunerate
+remunerated
+remunerates
+remunerating
+remuneration
+remunerations
+remunerative
+remuneratively
+remunerativeness
+renascent
+renaturation
+renature
+renaturing
+renegotiate
+renegotiation
+renewable
+renovate
+renovated
+renovates
+renovation
+renumeration
+renunciate
+renunciation
+renunciations
+renunciative
+reorient
+reorientation
+repacked
+repairable
+repairmen
+repartee
+repatriations
+repayment
+repeatability
+repelled
+repellent
+repellently
+repelling
+repentant
+repentantly
+repertory
+repetitious
+repetitiously
+repetitiousness
+replenishment
+replenishments
+reportage
+reportorial
+reportorially
+reprehensible
+reprehensibleness
+representativity
+reprimand
+reprimanded
+reprise
+reprised
+reprising
+reprobate
+reprobating
+reprobation
+reprobative
+reps
+reptilian
+republicanism
+repugnance
+repugnant
+repugnantly
+resale
+rescaling
+rescind
+rescinded
+rescinder
+researchable
+resemblant
+resettlement
+residency
+residual
+residually
+residuals
+residuary
+residuum
+resilience
+resilient
+resiliently
+resinlike
+resonate
+resonated
+resonates
+resonating
+resonator
+resonators
+respirator
+respirators
+respiratory
+respire
+respiring
+restaurateur
+restitution
+restock
+restorability
+restorative
+restoratively
+restorativeness
+restructurability
+restudy
+resupplied
+resupplies
+resupply
+resupply's
+resupplying
+resurgence
+resurgent
+resuscitate
+resuscitated
+resuscitates
+resuscitating
+resuscitation
+resuscitative
+resuspension
+retaliate
+retaliated
+retaliates
+retaliating
+retaliative
+retaliatory
+retardant
+retardation
+retch
+retching
+retell
+retelling
+retest
+rethink
+rethinker
+rethinking
+rethought
+reticulum
+retiree
+retorsion
+retouching
+retrenching
+retrenchment
+retributed
+retribution
+retroactive
+retrofit
+retrofitting
+retroflection
+retroflex
+retroflexed
+retroflexion
+retrogradations
+retrograde
+retrogradely
+retrograding
+retrogressive
+retrogressively
+retrorocket
+retrovision
+revaluation
+revelatory
+revengeful
+revengefully
+revengefulness
+reverberate
+reverberated
+reverberation
+reverberations
+reverberative
+reverent
+reverie
+reveries
+reversibility
+revet
+revetments
+revisable
+revisionary
+revisionist
+revisionists
+revivalism
+revivified
+revocable
+revolutionists
+revue
+revues
+revulsion
+revved
+revving
+rhapsodic
+rhapsody
+rhenium
+rheology
+rheostat
+rheostats
+rhetorical
+rhetorically
+rhetoricalness
+rhetorician
+rhetoricians
+rheum
+rheumatic
+rheumatics
+rhinestone
+rhinestones
+rhino
+rhinos
+rhinotracheitis
+rho
+rhodium
+rhododendron
+rhododendrons
+rhodolite
+rhodonite
+rhombic
+rhombus
+rhombuses
+ribald
+riboflavin
+ribonucleic
+ribosomal
+ribosome
+ribosomes
+rickets
+rickety
+ricochet
+ricocheted
+ricocheting
+ricochets
+ridable
+riddance
+ridding
+ridgepole
+riflemen
+rigamarole
+rigger
+riggers
+rightist
+rigmarole
+rigmaroles
+rimless
+rimmed
+rimming
+ringlet
+ringlets
+ringside
+ringsiders
+rink
+rinker
+riparian
+risible
+risibles
+riskier
+riskiness
+risky
+riverbank
+riverbanks
+riverboat
+riverfront
+riverine
+roach
+roaches
+roadbed
+roadbeds
+roadblock
+roadblocks
+roadhouse
+roadhouses
+robotism
+rockabye
+rockbound
+rodder
+rodding
+rodent
+rodents
+rodeo
+rodeos
+roebuck
+roebucks
+roentgen
+roguish
+roguishly
+roguishness
+roil
+roiling
+rollback
+rollicking
+rollickingly
+romanticism
+rondo
+rondos
+rood
+rooftop
+rooftops
+rookie
+rookies
+roomful
+roomier
+roominess
+roommate
+roommate's
+roommates
+roomy
+rootless
+rootlessness
+rosaries
+rosary
+roseate
+roseately
+rosebush
+rosemary
+rosette
+rosettes
+roster
+rostrum
+rotogravure
+rotogravures
+rotor
+rotors
+rototill
+rotting
+rotund
+rotunda
+rotundity
+rotundly
+rotundness
+roughish
+roughneck
+roughshod
+roulette
+rouletted
+roulettes
+rouletting
+roundhead
+roundheaded
+roundheadedness
+roundhouse
+roundtable
+roundworm
+roustabout
+rowboat
+rowboats
+rowdier
+rowdies
+rowdiness
+rowdy
+rowel
+rubbery
+rubdown
+rube
+rubella
+rubes
+rubicund
+rubidium
+rubric
+ruckus
+rudderless
+rueful
+ruefulness
+ruminant
+ruminantly
+ruminants
+rummage
+rummaged
+rummager
+rummaging
+rummier
+rummies
+rummy
+rumpus
+runabout
+runabouts
+rundown
+rune
+runes
+runic
+runoff
+runoffs
+runt
+runtiness
+runts
+runty
+runway
+runways
+rupee
+rupees
+rurality
+ruse
+rusk
+rustproof
+rutabaga
+rutabagas
+ruthenium
+rutted
+ruttier
+rutting
+rutty
+s's
+sabbath
+sabbatical
+sabras
+sacral
+sacrament
+sacraments
+sacrilege
+sacrilegious
+sacrilegiously
+sacrosanct
+saddlebag
+saddlebags
+safari
+safekeeping
+saffron
+saga
+sagebrush
+sagged
+sagging
+sailboat
+sailboater
+sailboaters
+sailboating
+sailboats
+sailfish
+sainthood
+salaam
+salacious
+salaciously
+salaciousness
+salamander
+salami
+salamis
+salesgirl
+saleslady
+salesmanship
+saleswomen
+salience
+saliency
+salinger
+salivary
+salivate
+salivated
+salivates
+salivating
+salivation
+saloonkeeper
+salsa
+salsa's
+salsas
+salsify
+saltwater
+salubrious
+salubriously
+salubriousness
+salvageable
+salvo
+salvos
+samovar
+sanatoria
+sanatorium
+sanctimonious
+sanctimoniously
+sanctimoniousness
+sandalwood
+sandbag
+sandbars
+sandblast
+sandblaster
+sandhill
+sandman
+sandpile
+sandpiper
+sanguinary
+sanguineous
+sanitate
+sanitations
+sapped
+sappier
+sappiness
+sapping
+sappy
+sapsucker
+sarcastically
+sarcoma
+sardine
+sardines
+sardonic
+sari
+sartorius
+sashay
+sashayed
+sassafras
+sassing
+satanic
+satiable
+satiate
+satiated
+satiates
+satiating
+satiation
+satiric
+satirical
+satirically
+saturnalia
+saturnine
+saturninely
+saucily
+sauerkraut
+sauna
+sauna's
+saunas
+saute
+sauterne
+sauternes
+savagery
+savoy
+savvied
+savvy
+savvying
+sawdust
+sawyer
+sax
+saxophone
+saxophone's
+saxophones
+saxophonist
+scab
+scabbed
+scabrous
+scabrously
+scabrousness
+scabs
+scalability
+scalpel
+scamp
+scandium
+scapegoat
+scapegoating
+scapegoats
+scapula
+scapular
+scapulars
+scarecrow
+scarface
+scarification
+scarifier
+scarify
+scarred
+scarves
+scat
+scathing
+scathingly
+scatterbrain
+scatterbrained
+scattergun
+scatting
+scavenge
+scavenged
+scavenges
+scavenging
+sceptic
+sceptical
+scepticism
+schism
+schist
+schizoid
+schizomycetes
+schizophrenic
+schmuck
+schnapps
+schoolbook
+schoolbooks
+schoolgirl
+schoolgirlish
+schoolgirls
+schoolmarm
+schoolmate
+schoolmates
+schoolteacher
+schoolwork
+sciatica
+scimitar
+scimitars
+scintillate
+scintillated
+scintillates
+scintillating
+scintillation
+scion
+scions
+sclerosis
+sclerotic
+scoot
+scooted
+scooter
+scooting
+scoots
+scops
+scoreboard
+scoreboards
+scorecard
+scoreless
+scotch
+scrabble
+scrabbled
+scrabbler
+scrabbles
+scrabbling
+scraggly
+scram
+scramming
+scrapbook
+scrapbooks
+scrapping
+scratchier
+scratchiness
+scratchy
+scrawnier
+scrawniness
+scrawny
+screechy
+screed
+screenplay
+screenwriter
+screenwriter's
+screenwriters
+screwball
+screwdriver
+screwdrivers
+screwup
+scrim
+scrimmage
+scrimmaged
+scrimmager
+scrimmages
+scrimmaging
+scrimp
+scrimped
+scrimping
+scrimps
+scriptural
+scripturally
+scriven
+scrivener
+scrollbar
+scrollbar's
+scrollbars
+scrounge
+scrounged
+scrounger
+scroungers
+scrounges
+scrounging
+scrubbed
+scrubber
+scrubbing
+scrumptious
+scrumptiously
+scrupulosity
+scrutable
+scuba
+scuff
+scuffed
+scuffing
+scuffs
+sculptural
+sculpturally
+scurrilous
+scurrilously
+scurrilousness
+scurviness
+scurvy
+seafare
+seafarer
+seafarers
+seafaring
+seafood
+seagull
+seagulls
+seahorse
+sealant
+sealants
+seamanship
+seamanships
+seamier
+seaminess
+seamless
+seamlessly
+seamlessness
+seamstress
+seamstresses
+seamy
+seance
+seaquake
+searchlight
+searchlights
+seaway
+secant
+secants
+secession
+secessionist
+seclude
+secludes
+secluding
+secretariat
+sectarian
+secularism
+secularist
+secularists
+secularity
+sedan
+sedans
+sedate
+sedated
+sedately
+sedateness
+sedates
+sedating
+sedation
+sedative
+sedentary
+sedimentary
+sedimentation
+sedition
+seditious
+seditiously
+seditiousness
+seduction
+seductions
+sedulously
+seedbed
+seedbeds
+seedier
+seediness
+seedless
+seedy
+seepage
+seersucker
+seesaw
+seesawed
+seesawing
+seesaws
+segmental
+segmentally
+segregant
+segregationist
+seismograph
+seismographer
+seismographs
+seismography
+seismological
+seismology
+selectable
+selectional
+selenate
+selenite
+selenium
+selfless
+selflessly
+selflessness
+sellout
+seltzer
+semen
+semi
+semiannual
+semiannually
+semiarid
+semiautomatic
+semicircular
+semidefinite
+semidrying
+semilogarithmic
+seminarian
+seminarians
+semiprofessional
+semiprofessionally
+semiprofessionals
+semipublic
+semiquantitative
+semiquantitatively
+semisecret
+semistructured
+semitic
+semitics
+semitrance
+semitropical
+senatorial
+senile
+senilely
+senor
+senorita
+sensate
+sensately
+sensationalism
+sensual
+sensuality
+sensually
+sensuous
+sensuously
+sensuousness
+sentient
+sentiently
+sentimentalists
+sentimentality
+separability
+sepia
+sept
+septate
+septation
+septennial
+septennially
+septic
+septillion
+septuagenarian
+septum
+sepulchral
+sepulchrally
+sequestration
+sequin
+sequined
+sequins
+sequoia
+serape
+seraph
+seraphim
+serenade
+serenaded
+serenader
+serenades
+serfdom
+serge
+serging
+serological
+serologically
+serology
+serviceability
+serviceman
+servicemen
+serviette
+serviettes
+servitor
+servitors
+servo
+servomechanism
+servomechanisms
+servos
+sesame
+setback
+setbacks
+setscrew
+setscrews
+sevenfold
+severalfold
+severalty
+sewage
+sewerage
+sewn
+sexier
+sexiness
+sextet
+sextillion
+sexton
+sextuple
+sextupled
+sextuplet
+sextupling
+sexy
+shabbily
+shag
+shagging
+shags
+shah
+shakeable
+shakedown
+shakily
+shalom
+shamble
+shambled
+shambling
+shamefacedly
+shampoo
+shampooer
+shampoos
+shamrock
+shank
+shanked
+shards
+sharecrop
+sharecropping
+sharpshoot
+sharpshooter
+sharpshooters
+sharpshooting
+shatterproof
+shaw
+sheathe
+sheave
+sheaving
+shedding
+sheepskin
+sheik
+shenanigan
+shenanigans
+sherbet
+sherlock
+sherries
+sherry
+shibboleth
+shibboleths
+shiftless
+shiftlessly
+shiftlessness
+shill
+shills
+shim
+shimmied
+shimmies
+shimming
+shimmy
+shimmying
+shims
+shinbone
+shindig
+shindig's
+shindigs
+shipbuild
+shipbuilder
+shipman
+shipmate
+shipmates
+shipmen
+shipshape
+shipyard
+shipyards
+shire
+shires
+shirtmake
+shirtmaker
+shirttail
+shivery
+shoddier
+shoddiness
+shoddy
+shoehorn
+shoelace
+shoelaces
+shoemake
+shoemakers
+shoestring
+shoestrings
+shoo
+shoofly
+shooing
+shootout
+shootout's
+shootouts
+shopkeep
+shopworn
+shoreline
+shorelines
+shortfall
+shortfalls
+shortish
+shortsighted
+shortsightedly
+shortsightedness
+shortstop
+showboat
+showcase
+showcase's
+showcased
+showcases
+showcasing
+showdown
+showier
+showiness
+showman
+showmanship
+showmen
+showpiece
+showplace
+showroom
+showy
+shrapnel
+shredded
+shredding
+shrewish
+shrewishly
+shrewishness
+shrift
+shrinkage
+shriver
+shrove
+shrugged
+shrugging
+shuck
+shucker
+shucks
+shuddery
+shuffleboard
+shunned
+shunning
+shunt
+shunted
+shunter
+shunting
+shunts
+shutoff
+shutout
+shuttlecock
+shuttlecocks
+sibilant
+sibilantly
+sic
+sickish
+sickishly
+sickishness
+sickroom
+sidearm
+sidearms
+sideband
+sidebands
+sidecar
+sidecars
+sideline
+sideliner
+sidelines
+sidelong
+sideman
+sidemen
+sidereal
+sidesaddle
+sideshow
+sideshows
+sidestep
+sidestepping
+sidesteps
+sidewall
+sideway
+sidewinder
+sidle
+sidled
+sidles
+sidling
+sienna
+siesta
+sightsee
+sightseeing
+sightseer
+sightseers
+sigma
+sigmas
+signboard
+signpost
+signposted
+signposting
+signposts
+silage
+silica
+silicate
+silicates
+silicide
+silkworm
+silkworms
+silo
+silos
+siltation
+silty
+silversmith
+silversmiths
+silverware
+simile
+simpleminded
+simplemindedly
+simplemindedness
+simpleton
+simulcast
+sinewy
+singe
+singlehanded
+singlehandedly
+singlet
+singsonged
+sinistral
+sinistrally
+sinless
+sinlessly
+sinlessness
+sinter
+sintered
+sinuous
+sinuousities
+sinuously
+sinuousness
+sinus
+sinuses
+sinusoid
+sipped
+sippers
+sipping
+sis
+sisal
+situ
+situs
+sixfold
+sixgun
+sizeable
+sizzle
+sizzled
+sizzler
+sizzling
+skat
+skeet
+skeeter
+skepticism
+sketchbook
+sketchpad
+skid
+skidded
+skidding
+skids
+skiff
+skiffs
+skillet
+skimpier
+skimpiness
+skimpy
+skindive
+skindiving
+skinless
+skinnier
+skinniness
+skinny
+skit
+skits
+skittle
+skullcap
+skullduggery
+skyhook
+skyjack
+skyjacked
+skyjacker
+skyjackers
+skyjacking
+skyline
+skyrocket
+skyscrape
+skyward
+skywave
+skyway
+slag
+slake
+slaked
+slaking
+slalom
+slaloms
+slanderous
+slanderously
+slanderousness
+slapstick
+slatted
+slatting
+slaughterhouse
+slaughterhouses
+slavish
+slavishly
+slavishness
+slaw
+sleazier
+sleaziness
+sleazy
+sledding
+sledgehammer
+sleepwalk
+sleepwalker
+sleety
+sleight
+sleuthing
+slimmer
+slimmers
+slingshot
+slink
+slinked
+slinking
+slinks
+slipstream
+slither
+slithered
+slithering
+slithers
+slitter
+slitters
+slitting
+sliver
+slivered
+slivering
+slivers
+slivery
+slob
+sloe
+slog
+sloganeer
+sloganeering
+slogging
+sloop
+sloops
+sloppily
+slosh
+sloshed
+slothful
+slothfully
+slothfulness
+slough
+sloughed
+sloughing
+sloven
+slovenliness
+slovenly
+slowdown
+sludge
+sludges
+slugged
+slugger
+sluggers
+slugging
+sluice
+sluiced
+sluices
+sluicing
+slumming
+slunk
+slurp
+slurped
+slurping
+slurps
+slurried
+slurries
+slurring
+slurry
+slurrying
+slush
+slyness
+smallish
+smalltime
+smattering
+smatterings
+smiley
+smiley's
+smilies
+smirk
+smirked
+smithereens
+smokehouse
+smokescreen
+smokestack
+smooch
+smooching
+smudge
+smudged
+smudginess
+smudging
+smudgy
+smut
+smuts
+smuttier
+smuttiness
+smutty
+snack
+snacks
+snafu
+snag
+snagged
+snagging
+snags
+snakebird
+snakelike
+snakeroot
+snapback
+snapdragon
+snapdragons
+snappish
+snappishly
+snappishness
+snazzier
+snazzy
+snicker
+snickered
+snickerer
+snickering
+snide
+snidely
+snideness
+snider
+snidest
+sniffle
+sniffled
+sniffler
+sniffles
+sniffling
+snifter
+snip
+snipe
+sniped
+sniper
+sniper's
+snipers
+snipes
+sniping
+snipped
+snipper
+snipper's
+snippers
+snippet
+snippier
+snipping
+snippy
+snips
+snivel
+snob
+snobbery
+snobbish
+snobbishly
+snobbishness
+snobs
+snook
+snooker
+snookers
+snooks
+snoopy
+snorkel
+snorkeled
+snorkeler
+snorkeling
+snotty
+snowball
+snowballed
+snowballing
+snowballs
+snowbank
+snowbank's
+snowbanks
+snowblower
+snowblowers
+snowfall
+snowflake
+snowflakes
+snowmobile
+snowmobiler
+snowmobiling
+snowstorm
+snub
+snubbed
+snubbing
+snubness
+snubs
+snuffboxes
+snuffle
+snuffled
+snuffler
+snuffling
+snugged
+snugging
+snuggly
+soapier
+soapiness
+soapstone
+soapstones
+soapsud
+soapsuds
+soapy
+sobbed
+sobbing
+sobbingly
+sobriety
+sobriquet
+socialistic
+sociality
+socio
+sociocultural
+socioculturally
+sociodemographic
+socioeconomic
+socioeconomically
+socioeconomics
+sociologist
+sociologists
+sociometric
+sociometry
+sodden
+soddened
+soddening
+soddenly
+soddenness
+sodding
+softball
+softwood
+soggier
+sogginess
+soggy
+soiree
+soirees
+soldiery
+solecism
+solenoid
+solenoids
+solicitation
+solicitous
+solicitously
+solicitousness
+solicitude
+solidarity
+soliloquy
+solipsism
+soloist
+soloists
+solstice
+solvating
+solvency
+soma
+somatic
+somebody'll
+someone'll
+somersault
+somersaulting
+somersaults
+sommelier
+sommeliers
+somnolence
+somnolent
+somnolently
+sonata
+sonatas
+songbag
+songbook
+songful
+songfully
+songfulness
+sonic
+sonny
+sonofabitch
+sonorities
+sonority
+sonorous
+sonorously
+sonorousness
+sonuvabitch
+soothsay
+soothsayer
+soothsayers
+soothsaying
+sop
+sophism
+sophist
+sophister
+sophisticate
+sophisticates
+sophistry
+sophomoric
+soporific
+soporific's
+soporifics
+sopping
+soprano
+sopranos
+sops
+sorghum
+sororities
+sorority
+sorrel
+sortie
+soubriquet
+souffle
+soulful
+soulfully
+soulfulness
+soundproof
+soundproofed
+soundproofing
+soundproofs
+sourdough
+southbound
+southeast
+southeaster
+southeasterly
+southeastern
+southernisms
+southernmost
+southland
+southpaw
+southpaws
+southward
+southwards
+southwest
+southwester
+southwesterly
+southwestern
+souvenir
+souvenirs
+sovereignty
+sow
+sowbelly
+sowens
+sower
+sowered
+sowing
+sown
+sox
+soy
+soya
+soybean
+soybeans
+spacecraft
+spacesuit
+spacesuits
+spacious
+spaciously
+spaciousness
+spandrels
+spangle
+spangled
+spangles
+spangling
+spaniel
+spar
+sparkier
+sparkle
+sparkled
+sparkler
+sparkles
+sparkling
+sparky
+sparling
+sparlings
+sparring
+spars
+spasm
+spasms
+spastic
+spatiality
+spatterdock
+spatula
+spavined
+spay
+spayed
+spaying
+speakership
+spearhead
+spearmint
+spec
+specie
+specifiability
+specious
+speciously
+speciousness
+specs
+spectral
+spectrally
+spectralness
+spectrograph
+spectrographically
+spectrography
+spectrometer
+spectrometer's
+spectrometers
+spectrometric
+spectrometry
+spectrophotometer
+spectrophotometer's
+spectrophotometers
+spectrophotometric
+spectrophotometry
+spectroscope
+spectroscopic
+spectroscopy
+specular
+specularity
+specularly
+speedboat
+speedboater
+speedboating
+speedometer
+speedometer's
+speedometers
+speer
+speleological
+speleologist
+speleology
+spellbound
+sperm
+spermatophyte
+sperms
+spew
+spewer
+spewing
+spewings
+spheric
+spherics
+spheroid
+spheroidal
+spheroidally
+spherule
+spherules
+sphinx
+sphinxes
+spic
+spicebush
+spiderwort
+spidery
+spigot
+spigots
+spikier
+spiky
+spillover
+spillover's
+spillovers
+spilt
+spineless
+spinelessly
+spinelessness
+spinier
+spininess
+spinnability
+spinnaker
+spinster
+spiny
+spirituality
+spitfire
+spittle
+splashier
+splashiness
+splashy
+splat
+splattered
+splay
+splayed
+splenetic
+splint
+splinted
+splintery
+splinting
+splints
+splotch
+splotched
+splotches
+splotchy
+splurge
+splurges
+splurging
+splutter
+splutterer
+spoilables
+spoilage
+spokespersons
+spongier
+sponginess
+spongy
+spontaneity
+spoof
+spoonerism
+spoonful
+spoonfuls
+sporadic
+sporadically
+sporadicly
+sportier
+sportiest
+sportiness
+sportsmanship
+sportsmen
+sportswear
+sportswriter
+sporty
+spottier
+spottiness
+spotty
+spousal
+sprain
+sprained
+sprains
+springboard
+sprocket
+sprocketed
+sprocketing
+sprockets
+sprue
+spud
+spume
+spuming
+spumoni
+spunk
+spurge
+spurred
+spurring
+sputnik
+sputniks
+spyglass
+sqrt
+squalid
+squalidly
+squalidness
+squalor
+squamous
+squamously
+squander
+squandered
+squanderer
+squandering
+squanders
+squashier
+squashiness
+squashy
+squatted
+squatter
+squatters
+squatting
+squaw
+squeaky
+squeamish
+squeamishly
+squeamishness
+squeegee
+squeegeed
+squeegees
+squelch
+squelched
+squelcher
+squelches
+squelching
+squirehood
+squirmy
+squirt
+squirted
+squirter
+squirting
+squirts
+squish
+squished
+squishes
+squishier
+squishiest
+squishiness
+squishing
+squishy
+st
+stableman
+stablemen
+staccato
+staccatos
+stackable
+stadium
+stadium's
+stadiums
+stagier
+staginess
+stagnate
+stagnated
+stagnates
+stagnating
+stagnation
+stagy
+stairwell
+stairwells
+stalactite
+stalactite's
+stalactites
+stalag
+stalemate
+stallion
+staminate
+stanchion
+stanchioned
+stanchioning
+stanchions
+standoff
+stank
+stannic
+stannous
+staphylococcus
+starchier
+starchiness
+starchy
+stardom
+stargaze
+stargazer
+stargazes
+stargazing
+starling
+starlings
+starship
+stash
+stashed
+stashes
+stashing
+stasis
+statehood
+stateless
+statelessness
+stateroom
+statesmanlike
+statesmanship
+statesmen
+statewide
+stationarity
+stationeries
+stationery
+stationmaster
+statuary
+statuette
+steamier
+steamily
+steaminess
+steamy
+steelier
+steelies
+steeliness
+steelmaker
+steely
+steeplebush
+steeves
+stein
+steiner
+steiners
+stenography
+stenotype
+stepbrother
+stepchild
+stepchildren
+stepdaughter
+stepfather
+stepladders
+steppe
+steppes
+stepsister
+stepson
+stereography
+stereophonic
+stereoscopy
+stereotypic
+sterility
+sternal
+sternum
+steroid
+steroids
+stethoscope
+stevedore
+stevedores
+stewardess
+stewardesses
+stewardship
+stickle
+stickleback
+stickled
+stickler
+stickling
+stickpin
+stigmata
+stiletto
+stillbirth
+stillbirths
+stillborn
+stilt
+stilted
+stiltedly
+stiltedness
+stilts
+stimulatory
+stingier
+stinginess
+stingy
+stinkpot
+stinky
+stochasticity
+stockbroker
+stockier
+stockiness
+stockpile
+stockpiler
+stockpiling
+stockroom
+stocky
+stodgier
+stodginess
+stodgy
+stoic
+stoichiometric
+stoichiometry
+stoicism
+stoics
+stoke
+stoked
+stoker
+stokes
+stoking
+stolid
+stolidly
+stomachs
+stomp
+stomped
+stomping
+stomps
+stonecutter
+stonecutters
+stonemason
+stonemasons
+stonewall
+stoneware
+stonewort
+stonily
+stooge
+stooges
+stooging
+stopover
+stopovers
+stopwatch
+stopwatches
+storekeep
+storekeeper
+storekeepers
+storeroom
+stormbound
+storyboard
+storyboards
+storyteller
+storytellers
+stowage
+stowages
+straddle
+straddled
+straddler
+straddlers
+straddles
+straddling
+strafe
+strafer
+strafes
+strafing
+straightaway
+strangulate
+strangulated
+strapped
+strapping
+strata
+strategically
+strategist
+strategists
+stratigraphic
+stratigraphy
+stratosphere
+stratospheric
+strawflower
+strawflowers
+streptococcus
+streptomycin
+stressful
+stressfully
+stretchable
+striate
+striated
+striates
+striating
+striation
+stricture
+strictures
+stridency
+strident
+stridently
+strikebreak
+strikebreaker
+strikebreakers
+strikebreaking
+striptease
+stripteaser
+striven
+strongroom
+strongrooms
+strontium
+strop
+strophe
+strophes
+stropped
+stropping
+strops
+structuralist
+structuralists
+strum
+strumming
+strychnine
+stubby
+stucco
+studded
+stultification
+stultify
+stultifying
+stumpage
+stumpy
+stunk
+stunned
+sturgeon
+stutter
+stuttered
+stutterer
+stuttering
+stutters
+styli
+stylist
+stylites
+stylus
+styluses
+stymie
+stymied
+stymies
+styrene
+styrenes
+suable
+suave
+suavely
+suaveness
+suavity
+subaltern
+subareas
+subassembly
+subbing
+subcaste
+subchain
+subclassifications
+subcommand
+subcommands
+subconcept
+subconstituent
+subcontinent
+subcontract
+subcontracting
+subdirectories
+subdirectory
+subdistrict
+subindex
+subjectivist
+subjectivists
+subjugate
+subjugated
+subjugates
+subjugating
+subjugation
+sublease
+sublimate
+sublimated
+sublimates
+sublimating
+subliminal
+subliminally
+subliterary
+sublunary
+submachine
+submersible
+submissive
+submissively
+submissiveness
+submittal
+subnational
+subnet
+subnets
+subnormal
+subnormally
+suboptimal
+subordinator
+subpage
+subparagraph
+subpart
+subparts
+subpoena
+subpoenaed
+subpoenas
+subpopulation
+subpopulations
+subquestion
+subquestion's
+subquestions
+subregion
+subregional
+subregionally
+subregions
+subrogation
+subsample
+subsamples
+subsentence
+subservience
+subservient
+subserviently
+subsistent
+subsocietal
+subsoil
+subsoiler
+subspecies
+substitutionary
+substratum
+subsurface
+subtable
+subtables
+subtended
+subtends
+subterfuge
+subterfuges
+subtest
+subtotals
+subtype
+subtypes
+suburbanite
+suburbanites
+suburbia
+subversive
+subversively
+subversiveness
+subversives
+successorship
+succubus
+suffragette
+suffragettes
+suffuse
+suffused
+suffuses
+suffusing
+suffusion
+suffusive
+suggestibility
+sulfaquinoxaline
+sulfate
+sulfated
+sulfating
+sulfide
+sulfite
+sulfonamide
+sulfonamides
+sulfur
+sulfured
+sulfuric
+sulfuring
+sulfurous
+sulfurously
+sulfurousness
+sulkily
+sullied
+sullies
+sully
+sullying
+sultana
+sumac
+summarily
+summertime
+summitry
+sunbaked
+sunbonnet
+sunburnt
+sunder
+sundered
+sundering
+sunders
+sundial
+sundials
+sunfish
+sunflower
+sunlit
+sunshade
+sunshades
+sunshiny
+sunspot
+suntan
+suntanned
+supercilious
+superciliously
+superciliousness
+superconcept
+supercritical
+superficiality
+superhighways
+superlunary
+supermachine
+supernatant
+supernatural
+supernaturalism
+supernaturally
+supernaturalness
+supernormal
+supernormally
+supernova
+supernova's
+supernovas
+superposable
+superposition
+superpositions
+superpredicate
+supersensitive
+supersensitiveness
+supersonic
+supersonics
+superstructural
+superstructure
+superstructures
+supervene
+supervened
+supine
+supinely
+supineness
+supping
+supplementation
+supplicate
+supplicating
+supposable
+suppressible
+suppressor
+suppressors
+supra
+supranational
+supranationalism
+suprasegmental
+supremacist
+surcease
+surceased
+surceasing
+surcharge
+surcharged
+surcharges
+surcharging
+surfactant
+surfactants
+surfeit
+surfeited
+surfeiter
+surfeits
+surreal
+surrealism
+surrealist
+surrealists
+surreptitious
+surreptitiously
+surreptitiousness
+surrey
+surreys
+surtax
+surveillance
+surveillances
+surveillant
+survivability
+survivalist
+survivalists
+survivorship
+susceptibility
+sushi
+suspensor
+sustainable
+sustainment
+sustenance
+svelte
+sveltely
+svelteness
+swab
+swabbed
+swabbies
+swabbing
+swabby
+swabs
+swaddle
+swaddled
+swaddling
+swag
+swaging
+swami
+swampland
+swampland's
+swamplands
+swank
+swanker
+swankier
+swankiness
+swanky
+swanlike
+swappable
+swart
+swartness
+swash
+swasher
+swastika
+swat
+swatch
+swatches
+swath
+swath's
+swathe
+swathed
+swather
+swathes
+swathing
+swathings
+swats
+swatter
+swatting
+sweatband
+sweatier
+sweatiness
+sweatshirt
+sweatshops
+sweaty
+sweepstake
+sweepstakes
+sweetish
+sweetishly
+sweltering
+swelteringly
+swig
+swigging
+swindle
+swindled
+swindler
+swindles
+swindling
+swingable
+swingier
+swingy
+swinish
+swinishly
+swinishness
+swirlier
+swirly
+swishier
+swishy
+swiss
+switchblade
+switchgear
+switchman
+switchmen
+switchmen's
+swivel
+swivels
+swizzle
+swizzled
+swizzler
+swizzling
+swordfish
+swordplay
+swordplayer
+swordtail
+sycophant
+sycophantic
+sycophantically
+sycophantly
+sycophants
+syllabic
+syllabicity
+syllabification
+syllabify
+syllogistic
+sylvan
+symbiont
+symbolical
+symbolists
+sympathetically
+symphonic
+symposia
+symptomatology
+synagogue
+synagogues
+synaptic
+synchronism
+synchrotron
+syncopate
+syncopated
+syncopation
+syncopative
+syndic
+syndics
+synergy
+synod
+synods
+synonymy
+synoptic
+syphilitic
+syrupy
+sys
+systemic
+tabbies
+tabbing
+tabby
+tableland
+tabletop
+tabletop's
+tabletops
+tabloids
+tabula
+tackiness
+taco
+tacos
+tactful
+tactfully
+tactfulness
+tactic
+tactical
+tactically
+tactlessness
+tactual
+tactually
+tadpoles
+taffeta
+taffies
+taffy
+tailback
+tailgate
+tailgated
+tailgater
+tailgating
+takeoff
+takeoffs
+takeover
+takeovers
+talismanic
+talky
+tallied
+tallies
+tally
+tallyho
+tallying
+talon
+taloned
+talons
+tamable
+tamale
+tamarack
+tamarind
+tambourine
+tamp
+tamping
+tampon
+tangency
+tangerine
+tango
+tangos
+tankard
+tanned
+tannery
+tannin
+tanning
+tantalum
+tao
+taoism
+taoist
+taoists
+taos
+tapeworm
+tapir
+tapirs
+tappet
+tappets
+tarantula
+tarantulas
+tardily
+tarnish
+tarnished
+tarnishes
+tarnishing
+tarp
+tarpapered
+tarpaulin
+tarpaulins
+tarpon
+tarpons
+tarred
+tarring
+tartar
+taskmaster
+tastier
+tastiness
+tasty
+tater
+tattier
+tatting
+tattle
+tattled
+tattler
+tattles
+tattletale
+tattling
+tatty
+tawdrier
+tawdriness
+tawdry
+taxably
+taxiway
+taxiway's
+taxiways
+taxpaying
+teacart
+teacup
+teahouse
+teahouses
+teakettle
+teakwood
+teal
+teals
+teammate
+teammates
+teamster
+teamsters
+teamwork
+teapot
+teapots
+teardrop
+teardrops
+teasel
+teat
+teated
+teats
+tech
+teched
+technetium
+tectonic
+tectonics
+tee
+teeing
+teensier
+teensy
+tees
+teetering
+tektite
+tektites
+telecommunicate
+telegraphy
+telekinesis
+telemeter
+telemeter's
+telemeters
+telemetric
+telemetry
+telepathic
+telepathically
+telepathy
+telephotography
+teleprinter
+teleprocessing
+teleprompter
+telescopic
+telltale
+telltale's
+telltales
+tellurium
+telnet
+telnets
+telomeric
+temerity
+temp
+tempo
+tempos
+temptress
+tenable
+tenableness
+tenacity
+tenancies
+tenancy
+tenderfoot
+tenderloin
+tendon
+tendons
+tenebrous
+tenet
+tenets
+tenfold
+tenon
+tensile
+tensional
+tensionless
+tensorial
+tenspot
+tenths
+tenuous
+tenuously
+tenuousness
+tepees
+tepid
+tepidly
+tepidness
+teratogenic
+teratologies
+teratology
+terbium
+tercel
+terminable
+terminableness
+termini
+terminological
+terminologically
+termite
+termites
+tern
+terpsichorean
+terramycin
+terrapin
+terrapins
+terries
+terry
+terse
+tersely
+terseness
+terser
+tersest
+tertian
+tessellate
+tessellated
+tessellates
+tessellation
+testamentary
+testate
+testator
+testator's
+testators
+testes
+testicular
+testier
+testily
+testimonial
+testimonials
+testiness
+testy
+tetanus
+tether
+tethered
+tethering
+tethers
+tetrachloride
+tetracycline
+tetrafluoride
+tetragonal
+tetragonally
+tetrahalides
+tetrahedra
+tetrahedral
+tetrahedrally
+tetrahedron
+tetrameron
+tetrasodium
+tetravalent
+textural
+texturally
+th
+thallium
+thallophyte
+that'd
+that'll
+theatric
+theatrics
+theism
+theistic
+theocracy
+theoretician
+there'd
+there'll
+therefor
+therefrom
+theretofore
+thereunder
+thermal
+thermally
+thermals
+thermionic
+thermionics
+thermistor
+thermistors
+thermo
+thermocouple
+thermocouples
+thermodynamically
+thermoelastic
+thermoelectric
+thermoformed
+thermoforming
+thermogravimetric
+thermometric
+thermometry
+thermonuclear
+thermopile
+thermoplastic
+thermopower
+thermos
+thermosetting
+thermostable
+thermostatic
+thermostatics
+thesaurus
+thespian
+thespians
+theta
+thetas
+thiamin
+thickish
+thine
+thinned
+thinning
+thinnish
+thiocyanate
+thiouracil
+this'll
+thistledown
+thither
+thoriate
+thoriated
+thorium
+thoroughbred
+thoroughgoing
+thou
+thous
+thousandths
+thrall
+threadbare
+threadbareness
+threefold
+threesome
+thresh
+threshed
+thresher
+threshing
+throatier
+throatiness
+throaty
+throes
+thrombi
+thromboses
+thrombosis
+thrombus
+throwback
+thrum
+thrumming
+thudding
+thuggee
+thulium
+thumbnail
+thumbtack
+thumbtack's
+thumbtacked
+thumbtacking
+thumbtacks
+thunderclap
+thunderclaps
+thunderous
+thunderously
+thunk
+thwack
+thy
+thyratron
+thyroglobulin
+thyroid
+thyroidal
+thyroids
+thyronine
+thyrotoxic
+thyrotrophic
+thyrotrophin
+thyrotropic
+thyrotropin
+thyroxine
+tibia
+tic
+tidbit
+tidbits
+tideland
+tidelands
+tidewater
+tidily
+tiff
+tiffany
+tigress
+tillage
+tilth
+timberland
+timberlands
+timbre
+timepiece
+timeworn
+timothy
+tincture
+tinctured
+tincturing
+tinder
+tine
+tines
+tinfoil
+tinner
+tinplate
+tinsel
+tinselly
+tinsmith
+tinsmiths
+tintable
+tintype
+tinware
+tipoff
+tippier
+tipple
+tippled
+tippler
+tipples
+tippling
+tippy
+tipsier
+tipsiness
+tipsy
+tiptoeing
+tirade
+tirades
+titan
+titanate
+titanic
+titanium
+titans
+titian
+titillate
+titillating
+titillatingly
+titillation
+titillative
+titmouse
+titmouse's
+titrate
+titrated
+titrates
+titrating
+titration
+titular
+titularly
+toadied
+toadies
+toady
+toadying
+toadyism
+tobaggon
+tobaggon's
+tobaggons
+toccata
+today'll
+toddle
+toddled
+toddler
+toddlers
+toddles
+toddling
+toenail
+toenails
+toffee
+tofu
+tog
+togging
+togs
+toilsome
+toilsomely
+toilsomeness
+tokamak
+tollgate
+tollhouse
+toluene
+tomblike
+tombstone
+tombstones
+tome
+tomes
+tomfool
+tommy
+tonal
+tonalities
+tonally
+toneless
+tonelessly
+tonelessness
+tong
+tonger
+tonier
+tonk
+tonks
+tonsillitis
+tony
+toodle
+toolmake
+toolmaker
+toolmakers
+toolmaking
+toolsmith
+toot
+tooted
+tooter
+toothier
+toothily
+toothpaste
+toothy
+tooting
+tootle
+tootled
+tootler
+tootling
+toots
+tootsie
+tootsies
+tootsy
+topaz
+topcoat
+topcoats
+topgallant
+topnotch
+topnotcher
+topocentric
+topographic
+topographical
+topographically
+topographies
+topography
+topped
+toppers
+topping
+toppings
+topside
+topsides
+topsoil
+tori
+tories
+toroid
+toroidal
+toroidally
+toroids
+torpid
+torpidly
+torpor
+torrence
+torsion
+torsional
+torsionally
+torso
+torsos
+tort
+torten
+tortoiseshell
+tortuous
+tortuously
+tory
+tot
+totalistic
+totalitarian
+totalitarianism
+tote
+toted
+totem
+totemic
+toter
+totes
+toting
+tots
+totted
+touchdown
+touchdowns
+touchstone
+touchstones
+toughs
+tourism
+tousle
+tousled
+tousles
+tousling
+tout
+touted
+touter
+touting
+touts
+towboat
+towboats
+towhead
+towheaded
+townhouse
+townsman
+townsmen
+toxic
+traceback
+traceback's
+tracebacks
+tracepoint
+tracepoint's
+tracepoints
+traceried
+tracery
+trachea
+trackage
+trackless
+traction
+tradesmen
+traditionalism
+traditionalistic
+traditionalists
+tragedian
+tragedians
+tragicomic
+trailside
+traineeships
+trainman
+trainman's
+trainmen
+traipse
+traipsing
+traitorous
+traitorously
+tram
+trammel
+trammels
+tramway
+transalpine
+transaminase
+transatlantic
+transcendence
+transcendental
+transcendentalism
+transcendentalists
+transcendentally
+transconductance
+transcultural
+transducer
+transducers
+transduction
+transect
+transected
+transecting
+transects
+transept
+transepts
+transferee
+transferor
+transferors
+transfix
+transfixed
+transfixes
+transfixing
+transfusable
+transfuse
+transfused
+transfusing
+transfusion
+transfusions
+transgressor
+transgressors
+transliterate
+transliteration
+translucence
+translucency
+transmissible
+transmittable
+transmittance
+transmutation
+transmute
+transmuted
+transmutes
+transmuting
+transoceanic
+transom
+transoms
+transpacific
+transpiration
+transpirations
+transplantable
+transplantation
+transportable
+transposable
+transship
+transshipment
+transshipping
+transships
+transversal
+transversally
+transverse
+transversely
+transverses
+transvestite
+transvestitism
+trapdoor
+trapdoors
+trapezium
+trashier
+trashiness
+trashy
+trauma
+traumas
+traversable
+travertine
+trawl
+trawler
+treadle
+treadled
+treadling
+treadmill
+treasonable
+treasonous
+treelike
+trefoil
+trekked
+trekking
+trellis
+trellised
+trellises
+trembly
+tremulous
+tremulously
+tremulousness
+trenchant
+trenchantly
+trencherman
+trenchermen
+trendier
+trendiness
+trendy
+trepidation
+trestle
+trestles
+triable
+triableness
+triad
+triadic
+triamcinolone
+triangulate
+triangulated
+triangulately
+triangulation
+triatomic
+tribesman
+tribesmen
+tribulate
+tribulation
+tribulation's
+tribulations
+trichloroacetic
+trichloroethane
+trichromatic
+trickeries
+trickery
+trickster
+trident
+tridents
+tridiagonal
+triennial
+triennially
+trifluoride
+trig
+trigonal
+trigonally
+trigram
+trigrams
+trilobite
+trilogy
+trimester
+trinitarian
+trinitarians
+trinity
+trio
+triode
+triodes
+trios
+trioxide
+tripartite
+tripartition
+tripe
+triphenylarsine
+triphenylphosphine
+triphenylstibine
+triphosphopyridine
+triplex
+triplicate
+tripod
+tripods
+tripoli
+tripolyphosphate
+tripped
+tripping
+trippingly
+triptych
+trisodium
+tristate
+trisyllable
+trite
+tritely
+triteness
+triter
+tritest
+tritium
+tritium's
+triton
+triumphant
+triune
+trivalent
+trivium
+trodden
+troglodyte
+troika
+trollop
+trombone
+trombone's
+trombones
+trombonist
+troopship
+troopships
+trophic
+tropism
+tropisms
+tropocollagen
+tropospheric
+trotted
+trotter
+trotting
+troughs
+trounce
+trounced
+trounces
+trouncing
+troupe
+trouper
+troupes
+trouping
+troy
+truancy
+truculence
+truculent
+truculently
+trumpery
+trundle
+trundled
+trundler
+trundles
+trundling
+truss
+trusser
+trusses
+trussing
+trusteeship
+trypsin
+tsar
+tsarevich
+tsarina
+tsarism
+tsarist
+tsunami
+tuba
+tubular
+tubularly
+tubule
+tubules
+tugged
+tugging
+tularemia
+tulle
+tum
+tumbrels
+tumid
+tumidly
+tummies
+tummy
+tummy's
+tun
+tuna
+tunas
+tundra
+tuneful
+tunefully
+tunefulness
+tunelessly
+tung
+tungstate
+tungsten
+tupelo
+turbinate
+turbinated
+turbinates
+turbine
+turbines
+turbofan
+turbojet
+turgid
+turgidly
+turgidness
+turk
+turks
+turnabout
+turnaround
+turnarounds
+turnoff
+turnout
+turnouts
+turnpike
+turnpikes
+turnstone
+turntable
+turpitude
+turtleback
+turtlebacks
+turtleneck
+turvy
+tusk
+tusker
+tuskers
+tusks
+tussle
+tussled
+tussles
+tussling
+tut
+tutelage
+tutu
+tuxedo
+tuxedo's
+tuxedoed
+tuxedos
+twaddle
+twaddled
+twaddler
+twaddles
+twaddling
+tweedier
+tweediness
+tweedy
+tweeze
+tweezed
+tweezing
+twelfths
+twiddle
+twiddled
+twiddles
+twiddling
+twigged
+twigging
+twinge
+twinges
+twinging
+twinning
+twirly
+twisty
+twit
+twitchy
+twitting
+twosome
+tycoon
+typeahead
+typeface
+typescript
+typeset
+typesets
+typesetter
+typesetters
+typesetting
+typewrite
+typewriting
+typewritten
+typhoon
+typhus
+typicality
+typo
+typographer
+typological
+typologically
+typologies
+typology
+tyrannic
+tyrannical
+tyrannically
+tyrannicalness
+tyrannicide
+tyrosine
+ulcerate
+ulcerated
+ulcerates
+ulceration
+ulcerations
+ulcerative
+ulster
+ulterior
+ulteriorly
+ultimatum
+ultra
+ultracentrifugally
+ultracentrifugation
+ultracentrifuge
+ultraconservative
+ultrafast
+ultramarine
+ultramodern
+ultrashort
+ultrasonic
+ultrasonically
+ultrasonics
+ultrasound
+ultrastructure
+ultraviolet
+umber
+umbered
+umbering
+umbilical
+umbilici
+umbilicus
+umbilicuses
+umbra
+umbrage
+unaccountable
+unadventurous
+unaggressive
+unallocable
+unambiguity
+unamused
+unanimity
+unappeasable
+unappeasably
+unasterisked
+unbalance
+unbeknownst
+unbend
+unbending
+unbent
+unbind
+unblest
+unbutton
+unbuttoning
+uncap
+unceremonious
+unceremoniously
+unceremoniousness
+uncharacteristic
+uncharitably
+unchastity
+unchristian
+uncircumcised
+unclasping
+uncodable
+uncoiling
+uncombable
+uncomment
+uncommenting
+uncomments
+uncommunicable
+uncommunicative
+unconcern
+uncongeniality
+unconscionable
+unconscionableness
+unconventionality
+uncourageous
+uncousinly
+uncritical
+unction
+undedicated
+undeflected
+undeliverability
+undeliverable
+undependable
+underachievers
+underadjusting
+underarm
+underbedding
+underbelly
+underbracing
+underclassman
+underclassmen
+underclothes
+underclothing
+underconsumption
+undercooked
+undercount
+undercounts
+undercover
+undercurrent
+undercut
+underdeveloped
+underdevelopment
+underdog
+undereducated
+underemployed
+underemployment
+underenumerated
+underenumeration
+undergarments
+undergirding
+undergrowth
+underhanded
+underhandedly
+underhandedness
+underheat
+underlay
+underpaid
+underpins
+underpopulated
+underprivileged
+underrate
+underrated
+underregistration
+underreported
+underreporting
+underrepresentation
+underrepresented
+undersea
+underseas
+undersecretaries
+undersecretary
+undersecretary's
+undershirt
+undershirt's
+undershirts
+undershoot
+undershooting
+undershoots
+undershot
+underside
+underside's
+undersides
+undersize
+undersized
+undersizes
+undersizing
+understate
+understatement
+understatements
+understates
+understating
+understructure
+understructure's
+understructures
+understudies
+understudy
+understudy's
+undertow
+undertow's
+undertows
+undervalued
+underwater
+underwhelm
+underwhelmed
+underwhelming
+underwhelms
+underwood
+undeserved
+undogmatically
+undreamt
+undulate
+undulated
+undulates
+undulating
+undulation
+undulations
+unearth
+unearthed
+unearthing
+unease
+uneconomic
+uneducated
+unemployability
+unencroachable
+unenforceable
+unenforcible
+unenunciated
+unenviable
+unfaded
+unfailing
+unfailingly
+unfailingness
+unfathomable
+unfederated
+unfelt
+unfertile
+unfindable
+unfitting
+unfoldment
+unfrocking
+unfrozen
+unfurl
+unfurled
+ungallant
+unglamorous
+ungodliness
+ungodly
+ungracious
+ungrammaticality
+unhand
+unharmonious
+unheated
+unhelpful
+unhesitant
+unhinge
+unholiness
+unholy
+unhook
+unhooked
+unhooking
+unhurried
+unhurt
+unideal
+unidimensional
+unifilar
+unilateral
+unilaterally
+unimaginative
+unimodal
+unimpeachable
+unimpeachably
+unimposing
+unimpressive
+uninitiate
+uninjectable
+uninominal
+uninterested
+uninvolved
+unipolar
+uniprocessor
+uniprocessor's
+uniprocessors
+unitarian
+unitarianism
+unitarians
+unitary
+univalent
+univariate
+universalism
+universalistic
+unkempt
+unkink
+unlacing
+unlearn
+unlearned
+unliterary
+unloveliness
+unlovely
+unmake
+unmalicious
+unmanliness
+unmanly
+unmarred
+unmask
+unmeasured
+unmeritorious
+unmet
+unmethodical
+unmindful
+unmoving
+unobtrusive
+unobtrusively
+unobtrusiveness
+unorthodox
+unorthodoxy
+unpaintable
+unpalatability
+unpartisan
+unperforated
+unphysical
+unpicturesque
+unpreemphasized
+unpremeditated
+unprepared
+unprocurable
+unproductive
+unprofessional
+unprovocative
+unquestionable
+unquestioning
+unquiet
+unquietly
+unquietness
+unreadiness
+unready
+unreality
+unreason
+unreasoning
+unreasoningly
+unreceptive
+unredeemable
+unreeling
+unreflective
+unrelieved
+unremarkable
+unremitting
+unremittingly
+unremunerated
+unrepentant
+unrepresentative
+unrewarding
+unripe
+unripeness
+unromantic
+unscathed
+unscrew
+unscrewed
+unscrewing
+unseat
+unsee
+unselfconscious
+unselfconsciousness
+unservile
+unshakeable
+unsheathe
+unshed
+unsightly
+unsinkable
+unslaked
+unsold
+unsolder
+unspeaking
+unspecific
+unspectacular
+unsprocketed
+unstilted
+unstriated
+unstuffy
+unsubtle
+unsurmountable
+unsystematic
+unteach
+untellable
+untenable
+untenanted
+unthinking
+untidily
+untraditional
+untrodden
+unutterably
+unvacuolated
+unwaivering
+unwariness
+unwarrantable
+unwary
+unwed
+unweighted
+unwire
+unwomanly
+unworkable
+uparrow
+upbeat
+upbring
+upcome
+upcoming
+upend
+upheaval
+upheavals
+upholstery
+upped
+uppercase
+uppercased
+uppercases
+uppercasing
+upperclassman
+upperclassmen
+uppercut
+upraise
+upraised
+uprise
+upriser
+upriver
+uproarious
+uproariously
+uproariousness
+upsilon
+upslope
+upstanding
+upstandingness
+upstate
+upstater
+upsurge
+upswing
+upswings
+uptake
+uptime
+uptown
+uptrend
+upwind
+uranium
+uranyl
+urbane
+urbanely
+urbanism
+urbanite
+urbanites
+urea
+uremia
+urethane
+urethanes
+urethra
+urgencies
+urgency
+urinal
+urinals
+urinary
+usurer
+usurious
+usuriously
+usuriousness
+usurpation
+usury
+uterine
+utile
+utilitarian
+utopia
+utopianism
+utopias
+vacationland
+vaccinating
+vaccination
+vaccinations
+vaccine
+vaccines
+vaccinia
+vaccinial
+vacuity
+vacuolate
+vacuolated
+vacuolates
+vacuolating
+vacuolation
+vacuole
+vacuoles
+vaginal
+vaginally
+vain
+vainglorious
+vaingloriously
+vaingloriousness
+vainness
+valance
+valanced
+valances
+valedictory
+valuate
+valuated
+valuates
+valuating
+valueless
+valuelessness
+vamp
+vamper
+vampire
+vampires
+vanadium
+vandal
+vandalism
+vandals
+vanguard
+variate
+variated
+variates
+variating
+variegate
+variegated
+variegation
+varistor
+varmint
+vascular
+vasectomies
+vasectomy
+vectorial
+velar
+veldt
+veldt's
+veldts
+vellum
+velour
+velours
+velum
+velvety
+venal
+venally
+vendetta
+vendible
+veneer
+veneerer
+veneering
+venerate
+venerated
+venerates
+venerating
+veneration
+venerations
+venereal
+vengeful
+vengefully
+vengefulness
+venial
+venially
+venialness
+venous
+venously
+ventilator
+venturesome
+venturesomely
+venturesomeness
+venturi
+venturis
+venue
+venue's
+venues
+veracious
+veraciously
+veraciousness
+verandah
+verandahed
+verbatim
+verbiage
+verbosity
+verdant
+verdantly
+veridical
+veridically
+verisimilitude
+verity
+vermiculite
+vermilion
+vermouth
+vernacular
+vernacularly
+vernal
+vernally
+vernier
+vertebra
+vertebrae
+vertebral
+vertebrally
+vertigo
+verve
+vesicle
+vesicles
+vesicular
+vesicularly
+vesper
+vespers
+vestal
+vestally
+vestibule
+vestibuled
+vestments
+vestries
+vestry
+vesture
+vestured
+vestures
+vesturing
+vet
+vetch
+vexatious
+vexatiously
+vexatiousness
+viaduct
+viaducts
+vibes
+vibrancy
+vibrant
+vibrantly
+vibrato
+vibrio
+vibrionic
+vicar
+vicarious
+vicariously
+vicariousness
+viewgraph
+viewgraph's
+viewgraphes
+viewless
+viewlessly
+vigil
+vigilantism
+vindicate
+vindicated
+vindicates
+vindicating
+vindication
+vindicative
+vintner
+vinyl
+viola
+virginal
+virginally
+virgule
+virile
+virility
+virtuosi
+virtuosity
+virulence
+virulent
+virulently
+viscera
+visceral
+viscerally
+viscid
+viscidly
+viscoelastic
+viscoelasticity
+viscometer
+viscometer's
+viscometers
+vise
+vised
+viselike
+vising
+visive
+vitiate
+vitiated
+vitiates
+vitiating
+vitiation
+vitreous
+vitreously
+vitreousness
+vitrification
+vitrify
+vitriol
+vitriolic
+vitro
+vituperative
+vituperatively
+viva
+vivace
+vivacious
+vivaciously
+vivaciousness
+vivacity
+vive
+vivers
+vivification
+vivified
+vivifier
+vivify
+vivo
+vixen
+viz
+vocable
+vocabularian
+vocabularianism
+vocalic
+vocalism
+vocalist
+vocalists
+vocative
+vocatively
+vociferous
+vociferously
+vociferousness
+vocoded
+vocoder
+vodka
+vodka's
+voiceband
+voiceless
+voicelessly
+voicelessness
+voila
+volar
+volcanism
+volition
+volitional
+volitionality
+volitionally
+voltaic
+voltmeter
+voltmeter's
+voltmeters
+voluble
+volubleness
+volumetric
+volumetrically
+voluminous
+voluminously
+voluminousness
+voluptuous
+voluptuously
+voodoo
+voodoos
+voracious
+voraciously
+voraciousness
+voracity
+vortices
+vorticity
+votary
+vouchsafe
+vouchsafed
+vouchsafes
+vouchsafing
+vulpine
+vulturelike
+vying
+wackier
+wackiness
+wacko
+wacko's
+wackos
+wacky
+wad
+wadded
+waddle
+waddled
+waddler
+waddles
+waddling
+wads
+wagged
+wagging
+waggish
+waggishly
+waggishness
+waggle
+waggled
+waggles
+waggling
+wainscot
+wainscoted
+wainscoting
+wainscots
+waistline
+wakeful
+wakefully
+wakefulness
+wakeup
+wale
+waler
+wales
+waling
+walkie
+walkover
+wallaby
+wallboard
+wallies
+wallop
+walloped
+walloper
+walloping
+wallops
+wallpaper
+wallpapers
+wally
+wangle
+wangled
+wangler
+wangles
+wangling
+wapiti
+wapitis
+wardroom
+wardrooms
+warehouseman
+warhead
+warheads
+warless
+warmhearted
+warmheartedly
+warmheartedness
+warmish
+warmonger
+warmongering
+warmongers
+warmup
+warren
+warrener
+warreners
+warrens
+wartime
+wartimes
+warty
+washbasin
+washboard
+washbowl
+washcloths
+washier
+washout
+washy
+waspish
+waspishly
+waspishness
+wastebasket
+wastebaskets
+wasteland
+wastelands
+wastewater
+wastrel
+wastrels
+watchband
+watchdog
+watchmake
+watchmaker
+watchmakers
+watchmaking
+watchmen
+watchpoints
+watercourse
+waterfront
+waterline
+waterlines
+waterloo
+waterman
+watermelon
+watershed
+watersheds
+waterside
+watersider
+watertight
+watertightness
+watt
+wattage
+wattages
+wattle
+wattled
+wattles
+wattling
+watts
+waveguide
+waveguides
+wavenumber
+wavier
+waviness
+wavy
+waxwork
+waxworks
+waylaid
+weaponless
+weaponry
+weatherbeaten
+weatherproof
+weatherproofness
+weatherstrip
+webbing
+wedlock
+weediness
+weedy
+weightier
+weightiness
+weightlessness
+weighty
+weirdo
+weirdos
+weirs
+wellbeing
+welsh
+welsher
+welt
+welter
+weltered
+weltering
+welts
+werewolf
+werewolf's
+werewolves
+westbound
+wetland
+wetlands
+wham
+whamming
+what'd
+what're
+whatnot
+whee
+wheedle
+wheedled
+wheedles
+wheedling
+wheelbarrows
+wheelbase
+wheelchair
+wheelchair's
+wheelhouse
+wheelie
+wheeze
+wheezed
+wheezes
+wheezier
+wheeziness
+wheezing
+wheezy
+whelk
+where'd
+where're
+whereabout
+wherefore
+wherefores
+whereof
+whereon
+wheresoever
+wherewith
+whet
+whets
+whetted
+whetting
+whiff
+whiffle
+whiffled
+whiffler
+whiffles
+whiffling
+whig
+whigs
+whimsey
+whimseys
+whinnied
+whinnies
+whinny
+whinnying
+whiplash
+whiplashes
+whippet
+whipsaw
+whipsawed
+whir
+whirlies
+whirligig
+whirly
+whiskies
+whistleable
+whiteface
+whitehead
+whitetail
+whitey
+whither
+who'd
+who'll
+whoa
+whodunit
+whodunit's
+whodunits
+whomsoever
+whoosh
+whop
+whoppers
+whopping
+whosoever
+wicket
+wickets
+widowhood
+widthwise
+wiener
+wieners
+wigging
+wiggle
+wiggled
+wiggler
+wiggles
+wiggling
+wiggly
+wigmaker
+wildcatter
+wildfire
+wildlife
+wilful
+wilfully
+wilily
+willowy
+wimp
+wimp's
+wimpier
+wimpiest
+wimps
+wimpy
+winch
+winched
+wincher
+winches
+winchester
+winching
+windbag
+windbags
+windbreak
+windbreaks
+windfall
+windless
+windlessly
+windlessness
+windowless
+windowpane
+windowpanes
+windowsill
+windshield
+windstorm
+windup
+windward
+windwardly
+winemake
+winemaster
+winery
+wineskin
+wingback
+wingman
+wingmen
+wingspan
+wingtip
+winkle
+winkled
+winkles
+winkling
+winless
+winnow
+winnower
+wino
+winos
+winsome
+winsomely
+winsomeness
+wintertime
+winy
+wireman
+wiremen
+wiseacre
+wisecrack
+wisecracked
+wisecracker
+wisenheimer
+wishbone
+wishy
+wispy
+witter
+witting
+wittingly
+wive
+wiving
+wizen
+wizened
+wobble
+wobbled
+wobbler
+wobbles
+wobbliness
+wobbling
+wobbly
+woebegone
+woebegoneness
+wok
+woken
+wold
+wolfish
+wolfishly
+wolfishness
+won
+woodcarver
+woodchopper
+woodchoppers
+woodcut
+woodcutters
+woodgrain
+woodgraining
+woodhen
+woodlot
+woodruff
+woodshed
+woodside
+woodwind
+woodyard
+woolgather
+woolgatherer
+woolgathering
+wop
+wops
+wordlessly
+workday
+workhouses
+workingmen
+workmanlike
+workout
+workouts
+workpiece
+workpieces
+workplace
+workplace's
+workplaces
+worksheet
+worksheets
+workspace
+workspaces
+worktable
+wormier
+wormy
+worsen
+worsened
+worsening
+worsens
+would've
+wow
+wracking
+wraith
+wraparound
+wrathful
+wrathfully
+wrathfulness
+wreathe
+wreaths
+wrier
+wriest
+wright
+wrinkly
+wristband
+wrongdoer
+wrongdoing
+wrongful
+wrongfully
+wrongfulness
+wry
+wryly
+xenon
+xenophobia
+xerography
+xterm
+xterm's
+xylem
+xylene
+xylophone
+xylophones
+yacht
+yachters
+yachting
+yachts
+yachtsman
+yachtsmen
+yaks
+yang
+yap
+yapping
+yardage
+yarmulke
+yarrow
+yaw
+yawed
+yawing
+yawl
+yaws
+yearbook
+yeastier
+yeastiness
+yeasty
+yen
+yeomanry
+yeshiva
+yesteryear
+yin
+yip
+yipping
+yodel
+yodels
+yoga
+yogi
+yogurt
+yogurt's
+yokel
+yokels
+yolk
+yolks
+yore
+youngish
+youths
+yow
+yowl
+yr
+ytterbium
+yttrium
+yucca
+yule
+yup
+zag
+zagging
+zags
+zealot
+zeitgeist
+zestful
+zestfully
+zestfulness
+zestier
+zesty
+zeta
+zetas
+zig
+zigged
+zigging
+zigzagged
+zigzagging
+zilch
+zing
+zinger
+zings
+zip
+zipped
+zipper
+zippered
+zippers
+zipping
+zips
+zircon
+zirconium
+zloty
+zlotys
+zodiacal
+zombie
+zombies
+zoologist
+zoologists
+zoology
+zounds
+zymurgy
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.2 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.2
new file mode 100644
index 00000000000..d3ec471e801
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.2
@@ -0,0 +1,37616 @@
+AAA
+AAAS
+AC
+ACS
+AK
+AL
+AR
+ASTM
+AZ
+Aarhus
+Abbott
+Abbott's
+Abel
+Abelian
+Abelson
+Abelson's
+Aberdeen
+Aberdeen's
+Abernathy
+Abernathy's
+Abidjan
+Abos
+Abram
+Abram's
+Abyssinia
+Abyssinians
+Acadia
+Accra
+Achaean
+Ackley
+Actaeon
+Acton
+Acton's
+Adair
+Adair's
+Addis
+Adelaide
+Adelaide's
+Adele
+Adele's
+Adelia
+Adelia's
+Aden
+Aden's
+Adkins
+Adler
+Adler's
+Adlerian
+Adolph
+Adolph's
+Adolphus
+Adrian
+Adrian's
+Adrienne
+Adrienne's
+Aeneas
+Aeolus
+Aerobacter
+Aeschylus
+Aesop
+Afrikaner
+Agamemnon
+Agee
+Agee's
+Agnew
+Agnew's
+Agricola
+Agway
+Ahmedabad
+Aida
+Aida's
+Aiken
+Aiken's
+Ainu
+Aitken
+Aitken's
+Akers
+Aladdin
+Alastair
+Alberich
+Albrecht
+Albrecht's
+Albright
+Albright's
+Alcestis
+Alcmena
+Alcott
+Alcott's
+Aldebaran
+Aldrich
+Aldrich's
+Aleutian
+Alexei
+Alexei's
+Alexis
+Alfonso
+Alfonso's
+Alfred
+Alfred's
+Alfredo
+Alfredo's
+Algenib
+Alger
+Alger's
+Algonquian
+Algonquin
+Algonquin's
+Ali
+Alison
+Alison's
+Allegra
+Allis
+Allyn
+Allyn's
+Almaden
+Almaden's
+Alpert
+Alpert's
+Alpheratz
+Alphonse
+Alphonse's
+Alsop
+Alsop's
+Altair
+Altair's
+Alton
+Alton's
+Alva
+Alva's
+Amerada
+Amharic
+Amman
+Ammerman
+Ammerman's
+Amontillado
+Anabel
+Anabel's
+Anacreon
+Analects
+Anatole
+Anatole's
+Anatolian
+Andalusia
+Andrea
+Andrea's
+Andrei
+Andrei's
+Andromache
+Angelica
+Angelica's
+Anglophile
+Anglophiliac
+Anglophilic
+Anglophilism
+Anglophily
+Anglophobe
+Anglophobic
+Annale
+Annalen
+Annalist
+Annalistic
+Annette
+Anselm
+Anselm's
+Anselmo
+Anselmo's
+Antaeus
+Antilles
+Anton
+Anton's
+Antonio
+Antonio's
+Antwerp
+Apetalous
+Appleby
+Appleby's
+Apr
+Aquila
+Aquila's
+Arachne
+Arachne's
+Arapaho
+Arcadian
+Arden
+Arden's
+Arequipa
+Argentinian
+Argive
+Arlen
+Armata
+Armco
+Armenia
+Arragon
+Arrhenius
+Artemia
+Artie
+Artie's
+Arturo
+Arturo's
+Ashmolean
+Asilomar
+Asilomar's
+Assam
+Astarte
+Aston
+Aston's
+Asuncion
+Atchison
+Atchison's
+Athabascan
+Atlantica
+Atropos
+Attlee
+Atwater
+Atwater's
+Atwood
+Atwood's
+Auberge
+Auberge's
+Aubrey
+Aubrey's
+Audrey
+Audrey's
+Auerbach
+Auerbach's
+Aug
+Auriga
+Avernus
+Avery
+Avery's
+Avignon
+Aylesbury
+Azerbaijan
+Azerbaijan's
+Azores
+BEMA
+BIS
+BITNET
+BMW
+BP
+Baden
+Baden's
+Baffin
+Bahrein
+Bahrein's
+Baird
+Baird's
+Baja
+Bakhtiari
+Baku
+Balboa
+Balfour
+Baltimorean
+Bamako
+Banach
+Banbury
+Banbury's
+Bangui
+Barbour
+Barbour's
+Barhop
+Barlow
+Barlow's
+Barnes
+Barnet
+Barnett
+Barnett's
+Barnhard
+Barnhard's
+Barnum
+Barr
+Barr's
+Barrett
+Barrett's
+Barrington
+Barrington's
+Barton
+Barton's
+Basel
+Basque
+Basque's
+Batchelder
+Batchelder's
+Bateman
+Bateman's
+Bathurst
+Bathurst's
+Bator
+Battelle
+Battelle's
+Bausch
+Bayda
+Bayport
+Bayport's
+Bayreuth
+Beardsley
+Beardsley's
+Beckman
+Beckman's
+Beebe
+Beebe's
+Beecham
+Beecham's
+Beijing
+Bela
+Bela's
+Belize
+Bellamy
+Bellamy's
+Bellingham
+Bellingham's
+Bellini
+Bellini's
+Belshazzar
+Belshazzar's
+Benares
+Benelux
+Benelux's
+Benton
+Benton's
+Beograd
+Berea
+Berea's
+Berenices
+Beresford
+Beresford's
+Bergen
+Bergen's
+Bergland
+Bergland's
+Berglund
+Berglund's
+Bergman
+Bergman's
+Bergstrom
+Bergstrom's
+Berman
+Berman's
+Bernardino
+Bernardino's
+Bernardo
+Bernardo's
+Bernet
+Bernet's
+Bernhard
+Berniece
+Bernini
+Bertie
+Bertram
+Bertram's
+Berwick
+Berwick's
+Betsey
+Betsey's
+Bette
+Bette's
+Bhagavadgita
+Bialystok
+Biggs
+Bilbao
+Billiken
+Billikens
+Biltmore
+Biltmore's
+Bini
+Biochimica
+Biometrika
+Biophysica
+Birgit
+Birmingham
+Bismark
+Bismark's
+Bissau
+Bizet
+Bizet's
+Blackfoot
+Blackfoot's
+Blackfoots
+Blaine
+Blaine's
+Blanchard
+Blanchard's
+Bleeker
+Blenheim
+Blinn
+Blinn's
+Bloch
+Bloch's
+Blomberg
+Blomberg's
+Blomquist
+Blomquist's
+Blum
+Blumenthal
+Blumenthal's
+Blythe
+Blythe's
+Boarsh
+Boca
+Boca's
+Bodleian
+Boeotia
+Boeotian
+Bohemianism
+Bois
+Boonton
+Bootes
+Boris
+Bosch
+Bosporus
+Boucher
+Bourbaki
+Bowditch
+Bowditch's
+Bowdoin
+Bowen
+Bowen's
+Boxford
+Boyd
+Boyd's
+Boyle
+Boyle's
+Boylston
+Boylston's
+Bragg
+Brahmaputra
+Brahmsian
+Brandt
+Brandt's
+Brasstown
+Brazzaville
+Bremen
+Bremen's
+Brendan
+Brendan's
+Brennan
+Brennan's
+Brenner
+Brenner's
+Brent
+Brest
+Brest's
+Breton
+Brett
+Brett's
+Brewster
+Brewster's
+Brice
+Bridget
+Bridget's
+Brie
+Briggs
+Briggs's
+Brighton
+Brighton's
+Brillouin
+Brindisi
+Brisbane
+Brisbane's
+Broglie
+Broglie's
+Bromfield
+Bromfield's
+Bromley
+Bromley's
+Brookline
+Brookline's
+Bruckner
+Bruckner's
+Bruegel
+Bruegel's
+Brumidi
+Brumidi's
+Brunswick
+Brunswick's
+Buchenwald
+Buchenwald's
+Buckley
+Buckley's
+Bucknell
+Bucknell's
+Buena
+Buenos
+Bujumbura
+Burke
+Burkes
+Burlington
+Burlington's
+Burnham
+Burtt
+Burtt's
+Buttrick
+Buxtehude
+Buxtehude's
+Buxton
+Byrd
+CA
+CBS
+CDR
+CERN
+CSNET
+CT
+CUNY
+CURVET
+CZ
+Cabot
+Cabot's
+Cady
+Caesarian
+Caesarian's
+Cahill
+Cajun
+Cajun's
+Cajuns
+Calais
+Caldwell
+Caldwell's
+Caleb
+Caleb's
+Calhoun
+Calhoun's
+Calkins
+Callaghan
+Callaghan's
+Callahan
+Callahan's
+Callan
+Callan's
+Calvert
+Calvert's
+Calvin
+Calvin's
+Cambrian
+Camden
+Camden's
+Camembert
+Cameron
+Cameron's
+Cameroon
+Cameroun
+Cameroun's
+Camilla
+Campbell
+Canaan
+Canaan's
+Canfield
+Canfield's
+Canopus
+Cantabrigian
+Capitoline
+Caputo
+Carboloy
+Carbone
+Cardiff
+Cardiff's
+Carey
+Carey's
+Cargill
+Cargill's
+Carib
+Carlin
+Carlin's
+Carlisle
+Carlisle's
+Carlo
+Carlsbad's
+Carlsbads
+Carmela
+Carmen
+Carmen's
+Carolingian
+Carpathia
+Carpathians
+Carr
+Carr's
+Carrara
+Carroll
+Carroll's
+Carruthers
+Casanova
+Casanova's
+Castillo
+Castillo's
+Castroism
+Catalonia
+Catherwood
+Catherwood's
+Caviness
+Cayley
+Cayley's
+Cayuga
+Cayuga's
+Cecropia
+Cedric
+Celebes
+Celia
+Celia's
+Celt
+Centrex
+Cepheus
+Cesare
+Cesare's
+Chadwick
+Chadwick's
+Chandigarh
+Chao
+Chao's
+Charlemagne
+Charlemagne's
+Charlemagnes
+Charon
+Charon's
+Charta
+Chartres
+Chatham
+Chatham's
+Chatsworth
+Chatsworth's
+Chauncey
+Chauncey's
+Chelsea
+Chelsea's
+Cheney
+Cheney's
+Cheryl
+Chiang
+Chiang's
+Chimique
+Chinatown
+Chinatown's
+Chloe
+Chou
+Chou's
+Christensen
+Christensen's
+Christiana
+Christiana's
+Christianson
+Christianson's
+Christina
+Christina's
+Christmastime
+Christoffel
+Christoph
+Christoph's
+Chungking
+Cindy
+Cindy's
+Clapeyron
+Clarendon
+Clarendon's
+Clausius
+Clayton
+Clayton's
+Clifton
+Clifton's
+Clotho
+Co
+Cobb
+Cobb's
+Cochran
+Cochran's
+Cochrane
+Cochrane's
+Coddington
+Coddington's
+Cody
+Cody's
+Coffey
+Coffey's
+Cole
+Cole's
+Colette
+Colette's
+Collins
+Colombo
+Colombo's
+Cominform
+Compagnie
+Compton
+Compton's
+Conakry
+Conant
+Conant's
+Congolese
+Conklin
+Conklin's
+Conley
+Conley's
+Connally
+Connally's
+Connors
+Constantine
+Constantine's
+Convair
+Convair's
+Conway
+Conway's
+Cooke
+Cooke's
+Cooley
+Cooley's
+Copernican
+Corbett
+Corbett's
+Corcoran
+Corcoran's
+Corey
+Corey's
+Corinth
+Coriolanus
+Cornelia
+Cornelia's
+Cornelian
+Cornelius
+Coronado
+Corsica's
+Cortez
+Corvus
+Corydoras
+Cosgrove
+Cosgrove's
+Cottrell
+Cottrell's
+Coulter
+Coulter's
+Courtney
+Courtney's
+Cowan
+Cowan's
+Crispin
+Crispin's
+Croatia
+Croydon
+Croydon's
+Cruickshank
+Cruickshank's
+Cruz
+Culbertson
+Culbertson's
+Cummings
+Cummins
+Curran
+Curran's
+Curtis
+Cushing
+Cushing's
+Custer
+Custer's
+Cuvier
+Cuzco
+Cyclades
+Cyrillic
+Czerniak
+Czerniak's
+DA's
+DC
+DFL
+DMA
+DOD
+Dacca
+Dacca's
+Dada
+Dadaistic
+Dahl
+Dahl's
+Dahomey
+Dahomey's
+Dailey
+Dailey's
+Dairylea
+Daley
+Daley's
+Dalhousie
+Dalzell
+Dalzell's
+Damocles
+Damon
+Damon's
+Dana
+Dana's
+Danubian
+Darcy
+Darcy's
+Darius
+Darwinistic
+Daryl
+Daryl's
+Datamation
+Daugherty
+Daugherty's
+Davison
+Davison's
+Daytona
+Daytona's
+DeKastere
+Deane
+Deane's
+Deanna
+Deanna's
+Decatur
+Decatur's
+Dee
+Dee's
+Deimos
+Deirdre
+Deirdre's
+Deirdres
+Del
+Delaney
+Delaney's
+Delano
+Delano's
+Delia
+Delia's
+Della
+Della's
+Delmarva
+Delphically
+Delphinus
+Demeter
+Deneb
+Deneb's
+Denebola
+Denton
+Denton's
+Dependance
+Derek
+Derek's
+Detroit
+Dhabi
+Dickerson
+Dickerson's
+Dido
+Dido's
+Diebold
+Diebold's
+Dietz
+Diocletian
+Dirichlet
+Dixon
+Dixon's
+Dnieper
+Dnieper's
+Dobbs
+Dodd
+Dodd's
+Dodson
+Dodson's
+Doherty
+Doherty's
+Dolan
+Dolan's
+Domenico
+Domenico's
+Dominick
+Dominick's
+Dominique
+Dominique's
+Doneck
+Doneck's
+Dooley
+Dooley's
+Dorcas
+Doreen
+Doreen's
+Doria
+Doria's
+Doric
+Doric's
+Dorothea
+Dorothea's
+Dorset
+Dorset's
+Dortmund
+Dortmund's
+Dowling
+Dowling's
+Draco
+Draco's
+Draconian
+Dravidian
+Driscoll
+Driscoll's
+Drummond
+Drummond's
+Dubhe
+Dubhe's
+Dudley
+Dudley's
+Dugan
+Dugan's
+Duma
+Duma's
+Dunbar
+Dunbar's
+Dundee
+Dundee's
+Dunedin
+Dunedin's
+Dunlop
+Dunlop's
+Dunn
+Dunn's
+Duquesne
+Durango
+Durango's
+Durer
+Durkin
+Durkin's
+Durrell
+Durrell's
+Durward
+Durward's
+Dusenbury
+Dusenbury's
+Dutton
+Dutton's
+Dwyer
+Dwyer's
+ECG
+EDT
+EEOC
+ERDA
+ESC
+EST
+Eagan
+Eagan's
+Earthman
+Earthman's
+Earthmen
+Earthmen's
+Eaton
+Eaton's
+Eben
+Eben's
+Eccles
+Ecole
+Edmonds
+Edmondson
+Edmondson's
+Edmonton
+Edmonton's
+Eduardo
+Eduardo's
+Effie
+Effie's
+Egan
+Egan's
+Egyptology
+Ehrlich
+Ehrlich's
+Eire
+Eire's
+Eisner
+Eisner's
+Ekstrom
+Ekstrom's
+Eldon
+Eldon's
+Eleazar
+Eleazar's
+Elena
+Elena's
+Elgin
+Elgin's
+Elinor
+Elinor's
+Elisha
+Elisha's
+Ellwood
+Ellwood's
+Elsevier
+Elsevier's
+Elton
+Elton's
+Elwood
+Elwood's
+Ely
+Ely's
+Elysee
+Elysee's
+Emil
+Emil's
+Emile
+Emile's
+Emilio
+Emilio's
+Emmett
+Emmett's
+Engels
+Engle
+Engle's
+Enid
+Enid's
+Ephesus
+Erastus
+Erato
+Erato's
+Erika
+Erika's
+Erlenmeyer
+Erlenmeyer's
+Erskine
+Erskine's
+Esmark
+Esmark's
+Esposito
+Esposito's
+Essen
+Essen's
+Estella
+Estella's
+Estes
+Estonia
+Estonia's
+Etruria
+Eumenides
+Euridyce
+Euridyce's
+Euterpe
+Euterpe's
+Evensen
+Everglade
+Everhart
+Everhart's
+FAA
+FAQ
+FAQ'S
+FL
+FM
+FMC
+FPC
+FSF
+FSF'S
+FTC
+Faber
+Faber's
+Fabian
+Fabian's
+Fafnir
+Fafnir's
+Fahey
+Fahey's
+Falkland
+Falklands
+Fallopian
+Falmouth
+Falmouth's
+Farkas
+Farnsworth
+Farnsworth's
+Fayette
+Fayette's
+Feeney
+Feeney's
+Fenton
+Fenton's
+Ferber
+Ferber's
+Ferguson
+Ferguson's
+Fermat
+Fermat's
+Ferreira
+Ferrer
+Ferrer's
+Fiji
+Fiji's
+Fijian
+Fijian's
+Fijians
+Finley
+Finley's
+Fischbein
+Fischbein's
+Fiske
+Fiske's
+Fizeau
+Fizeau's
+Flagler
+Flagler's
+Flo
+Flo's
+Fogarty
+Foley
+Foley's
+Fomalhaut
+Fomalhaut's
+Fontaine
+Fontaine's
+Forsythe
+Forsythe's
+Fortescue
+Fortescue's
+Foss
+Francine
+Francine's
+Francoise
+Francoise's
+Frankel
+Frankel's
+Fraser
+Fraser's
+Fredericksburg
+Fredericksburg's
+Fredericton
+Fredericton's
+Fredholm
+Fredholm's
+Freemason
+Freetown
+Freetown's
+Freya
+Freya's
+Friedrich
+Friedrich's
+Friesland
+Friesland's
+Frisian
+Fruehauf
+Fruehauf's
+Frye
+Frye's
+Fujitsu
+Fujitsu's
+Fulbright's
+Fulbrights
+Fulton
+Fulton's
+Furman
+Furman's
+GA
+GAO
+GCD
+GE
+GMT
+GOP
+GPO
+GU
+Gaberones
+Gabon
+Gabon's
+Gaines
+Galatia
+Galatia's
+Galen
+Galen's
+Galilean
+Galileo
+Galileo's
+Gallagher
+Gallagher's
+Galt
+Galt's
+Galway
+Galway's
+Gambia
+Gambia's
+Gandhi
+Gandhi's
+Gandhian
+Gannett
+Gannett's
+Garrisonian
+Garth's
+Gaspee
+Gaspee's
+Gaulle
+Gaulle's
+Gautama
+Gegenschein
+Geigy
+Geigy's
+Geminid
+Gemma
+Genesco
+Genoa
+Genoa's
+Ghanian
+Gil
+Gil's
+Gilchrist
+Gilchrist's
+Gilead
+Gilead's
+Gilmore
+Gilmore's
+Gina
+Gina's
+Gino
+Gino's
+Ginsberg
+Ginsberg's
+Ginsburg
+Ginsburg's
+Giuliano
+Giuliano's
+Giuseppe
+Giuseppe's
+Glaswegian
+Glidden
+Glidden's
+Gloriana
+Gloriana's
+Gobi
+Gobi's
+Goddard
+Goddard's
+Godfrey
+Godfrey's
+Godwin
+Godwin's
+Goff
+Goff's
+Goldfield
+Goldstine
+Goldstine's
+Goleta
+Goleta's
+Gonzalez
+Goode
+Goode's
+Goren
+Goren's
+Gorton
+Gorton's
+Gothically
+Gottfried
+Gottfried's
+Gouda's
+Gould
+Gould's
+Graff
+Graff's
+Greene
+Greene's
+Greenpeace
+Greenpeace's
+Greer
+Greer's
+Gresham
+Gresham's
+Grimaldi
+Grimaldi's
+Grinch
+Grinch's
+Griswold
+Griswold's
+Gruyere
+Guardia
+Guelph
+Guenther
+Guenther's
+Guerin
+Guilford
+Guilford's
+Guinevere
+Guinevere's
+Gujarat
+Gujarati
+Gullah
+Gunther
+Gunther's
+Gurkha
+Gurkha's
+Gustafson
+Gustafson's
+Gustav
+Gustav's
+Gustave
+Gustave's
+Gustavus
+Gwyn
+Gwyn's
+HDL
+Haag
+Haag's
+Haas
+Haberman
+Haberman's
+Habib
+Habib's
+Hadamard
+Haddad
+Haddad's
+Hadley
+Hadley's
+Hadrian
+Hagen
+Hagen's
+Hager
+Hager's
+Hagstrom
+Hagstrom's
+Hahn
+Hahn's
+Haines
+Haley
+Haley's
+Halley
+Halley's
+Halsey
+Halsey's
+Halstead
+Halstead's
+Halverson
+Halverson's
+Hamal
+Hamal's
+Hamburg
+Hamlin
+Hamlin's
+Handel
+Handel's
+Haney
+Haney's
+Hanford
+Hanford's
+Hankel
+Hankel's
+Hanley
+Hanley's
+Hanlon
+Hanlon's
+Hanna
+Hanna's
+Hapsburg
+Hapsburg's
+Harbin
+Harbin's
+Harlan
+Harlan's
+Harley
+Harley's
+Harmon
+Harmon's
+Harmonist
+Harmonistic
+Harmonistically
+Harriman
+Harriman's
+Harrington
+Harrington's
+Hathaway
+Hathaway's
+Hatteras
+Hattiesburg
+Hattiesburg's
+Haugen
+Haugen's
+Hausa
+Hausa's
+Hausdorff
+Hausdorff's
+Havilland
+Havilland's
+Hayden
+Hayden's
+Healey
+Healey's
+Healy
+Healy's
+Hebe
+Hebrides
+Hebrides's
+Hecate
+Hecate's
+Heckman
+Heckman's
+Heidegger's
+Heine
+Heine's
+Heinrich
+Heinrich's
+Helga
+Helga's
+Hellespont
+Helvetica
+Hempstead
+Hempstead's
+Henley
+Henley's
+Hennessy
+Henri
+Henri's
+Hermann
+Hermann's
+Hernandez's
+Hertzog
+Hertzog's
+Hesse
+Hesse's
+Hester
+Hester's
+Hetman
+Hetman's
+Hettie
+Hettie's
+Hetty
+Hetty's
+Heusen
+Heusen's
+Heuser
+Heuser's
+Hewett
+Hewett's
+Hewitt
+Hewitt's
+Hiatt
+Hiatt's
+Hibbard
+Hibbard's
+Hickman
+Hickman's
+Higgins
+Hildebrand
+Hildebrand's
+Himalaya
+Himalaya's
+Hindustan
+Hindustan's
+Hines
+Hinman
+Hinman's
+Hippocrates
+Hippocratic
+Hiroshi
+Hiroshi's
+Hirsch
+Hitlerian
+Hitlerism
+Hitlerite
+Hitlerites
+Hoagland
+Hoagland's
+Hobart
+Hobart's
+Hodge
+Hodge's
+Hodgkin
+Hodgkin's
+Hoff
+Hoff's
+Hogan
+Hogan's
+Holcomb
+Holcomb's
+Hollingsworth
+Hollingsworth's
+Holloway
+Holloway's
+Holm
+Holm's
+Holman
+Holman's
+Holmdel
+Holmdel's
+Honshu
+Honshu's
+Hopi's
+Horus
+Hottentot
+Hottentot's
+Houdaille
+Houdaille's
+Houghton
+Houghton's
+Hoyt
+Hoyt's
+Hrothgar
+Hrothgar's
+Hubbard
+Hubbard's
+Hubbell
+Hubbell's
+Huber
+Huber's
+Huffman
+Huffman's
+Huggins
+Hummel
+Hummel's
+Hun
+Huntington
+Huntington's
+Huntley
+Huntley's
+Hurd
+Hurd's
+Hurdies
+Hurwitz
+Huston
+Huston's
+Huxtable
+Huxtable's
+Hyades
+Hyde
+Hyde's
+Hyman
+IA
+ICL
+IEE
+IGN
+IL
+INTERAMA
+IOT
+IQ
+IR
+IRAF
+IRS
+Ian
+Ian's
+Ibn
+Ida
+Ida's
+Ifni
+Igor's
+Ike
+Ike's
+Ilona
+Ilyushin
+Imagen
+Imagen's
+Indo
+Indochinese
+Indoeuropean
+Indus
+Informatica
+Inman
+Inman's
+Ira
+Iranian
+Iranian's
+Iranians
+Iraqi's
+Iraqis
+Irrawaddy
+Irvin
+Irvin's
+Irwin
+Isaacson
+Isaacson's
+Isabella
+Isabella's
+Isadore
+Isadore's
+Isaiah
+Isaiah's
+Isis
+Islamabad
+Islamabad's
+Isolde
+Isolde's
+Istvan
+Istvan's
+Ito
+Ito's
+Iverson
+Iverson's
+JACM
+Jablonsky
+Jablonsky's
+Jacobi
+Jacobi's
+Jacobson
+Jacobson's
+Jacobus
+Jaeger
+Jaeger's
+Jaime
+Jaime's
+Jamie
+Jamie's
+Janos
+Jansenist
+Jansenist's
+Jarvin
+Jarvin's
+Jed
+Jed's
+Jensen
+Jensen's
+Jeres
+Jesuitism
+Jewell
+Jewell's
+Jewett
+Jewett's
+Jimenez
+Jo
+Jo's
+Johanna
+Johanna's
+Johnston
+Johnston's
+Jolla
+Jolla's
+Judaica
+Judd
+Judd's
+Judder
+Juddered
+Juddering
+Judders
+Judson
+Judson's
+Jugoslavia
+Jul
+Jun
+Jung
+Jung's
+Jura
+Jura's
+Juras
+Jutland
+Jutland's
+KS
+KY
+Kahn
+Kahn's
+Kajar
+Kajar's
+Kalmuk
+Kalmuk's
+Kamchatka
+Kamikaze
+Kamikaze's
+Kampala
+Kampala's
+Kampuchea
+Kampuchea's
+Kane
+Kane's
+Kannada
+Kaplan
+Kaplan's
+Karachi
+Karachi's
+Karamazov
+Karamazov's
+Karp
+Karp's
+Kashmir
+Kaskaskia
+Katharine
+Katharine's
+Katowice
+Katowice's
+Katrina
+Katrina's
+Katz
+Kauffman
+Kauffman's
+Kaufman
+Kaufman's
+Keck
+Keck's
+Kelsey
+Kelsey's
+Kemp
+Ken
+Ken's
+Kendall
+Kendall's
+Kennan
+Kennan's
+Kenney
+Kenney's
+Kenton
+Kenton's
+Kenyon
+Kenyon's
+Kernighan
+Kernighan's
+Kerouac
+Kerouac's
+Kerr
+Kerr's
+Kessler
+Kessler's
+Keyes
+Khartoum
+Khartoum's
+Kidde
+Kidde's
+Kieffer
+Kieffer's
+Kiewit
+Kiewit's
+Kigali
+Kigali's
+Kikuyu
+Kikuyu's
+Kilgore
+Kilgore's
+Kilimanjaro
+Kilimanjaro's
+Kimball
+Kimball's
+Kimberly
+Kimberly's
+Kinney
+Kinney's
+Kinshasha
+Kinshasha's
+Kiowa
+Kirchner
+Kirchner's
+Kirov
+Kirov's
+Kitakyushu
+Kitakyushu's
+Klux
+Knapp
+Knapp's
+Knauer
+Knauer's
+Knightsbridge
+Knightsbridge's
+Knossos
+Knott
+Knott's
+Knowlton
+Knowlton's
+Kobayashi
+Kochab
+Kochab's
+Konrad's
+Koppers
+Koran
+Koran's
+Kovacs
+Kovic
+Kovic's
+Kowalewski
+Kowalewski's
+Kowalski
+Kowalski's
+Kowloon
+Krebs
+Krieger
+Krieger's
+Kristin
+Kristin's
+Kronecker
+Kronecker's
+Kruse
+Kruse's
+Kuhn
+Kuhn's
+Kumar
+L'vov
+LDL
+LSI
+LTV
+Laban
+Laban's
+Lacerta
+Lacerta's
+Lachesis
+Lagos
+Laguerre
+Lahore
+Lahore's
+Laidlaw
+Laidlaw's
+Lamar
+Lamar's
+Lamarck
+Lamborghini
+Lamborghini's
+Lamborghinis
+Lana
+Lana's
+Lancelot
+Lancelot's
+Lang
+Lang's
+Langmuir
+Langmuir's
+Lanka
+Lanka's
+Lao
+Larkin
+Larkin's
+Laszlo
+Laszlo's
+Lateran
+Lateran's
+Latinity
+Latrobe
+Latrobe's
+Latvia
+Latvia's
+Laue
+Laue's
+Laughlin
+Laughlin's
+Laurent
+Laurent's
+Lausanne
+Lausanne's
+Lavoisier
+Lavoisier's
+Layton
+Layton's
+Leander
+Leander's
+Lear
+Leeuwenhoek
+Leeuwenhoek's
+Legendre
+Legendre's
+Lehman
+Lehman's
+Leibniz
+Leipzig
+Leipzig's
+Leland
+Leland's
+Lemuel
+Len
+Len's
+Lena
+Lena's
+Lennon
+Lennon's
+Lennox
+Lennox's
+Lenore
+Lenore's
+Leonid
+Leonid's
+Lesotho
+Lesotho's
+Lethe
+Lethe's
+Letitia
+Letitia's
+Leviable
+Levin
+Levin's
+Levitt
+Levitt's
+Lew
+Lew's
+Libby
+Libby's
+Libreville
+Libreville's
+Lieberman's
+Ligget
+Ligget's
+Liggett
+Liggett's
+Lila
+Lila's
+Lilian
+Lilian's
+Lillian
+Lillian's
+Lilly
+Liman
+Lin
+Lin's
+Lind
+Lind's
+Lindbergh
+Lindbergh's
+Lindholm
+Lindholm's
+Lindquist
+Lindquist's
+Lindsay
+Lindsay's
+Lindsey
+Lindsey's
+Lindstrom
+Lindstrom's
+Linnaeus
+Linton
+Lippincott
+Lippincott's
+Lipschitz
+Lipscomb
+Lipscomb's
+Lise
+Lise's
+Lissajous
+Lithuania
+Liverpudlian
+Lodowick
+Lodowick's
+Loeb
+Loeb's
+Loire
+Loki
+Loki's
+Lomb
+Lomb's
+Lombardy
+Lombardy's
+Lome
+Loomis
+Loren
+Loren's
+Lori
+Lori's
+Lorinda
+Lorinda's
+Lotte
+Lotte's
+Lou
+Lou's
+Lounsbury
+Lounsbury's
+Lourdes
+Louvre
+Lowe
+Lowe's
+Lowry
+Lowry's
+Lubell
+Lubell's
+Ludlow
+Ludlow's
+Luis
+Lumpur
+Lund
+Lund's
+Lundberg
+Lundberg's
+Lundquist
+Lundquist's
+Lura
+Lusaka
+Lusaka's
+Lutz
+Luzon
+Luzon's
+Lykes
+Lyman
+Lyman's
+Lyra
+Lyra's
+Lysenko
+Lysenko's
+MDs
+MIPS
+MN
+MO
+MRI
+Mabel
+Mabel's
+MacDougall
+MacDougall's
+MacMahon
+MacMahon's
+Macadamia
+Macassar
+Macaulayan
+Macaulayism
+Macaulayisms
+Macdougall
+Macdougall's
+Machiavellian
+Mackey
+Mackey's
+Maddox
+Madeira
+Madhya
+Madsen
+Madsen's
+Mae
+Mae's
+Mafiosi
+Magellanic
+Magnuson
+Magnuson's
+Magog
+Magog's
+Maharashtra
+Mahayana
+Mahayanist
+Mahoney
+Mahoney's
+Majorca
+Majorca's
+Malabar
+Malabar's
+Malagasy
+Malagasy's
+Malawi
+Malawi's
+Malden
+Malden's
+Maldive
+Maldive's
+Maldives
+Mali
+Mali's
+Maloney
+Maloney's
+Malraux
+Malthus
+Malton
+Malton's
+Manchuria
+Manley
+Manley's
+Mann
+Mann's
+Manuel
+Manuel's
+Mar
+Marc
+Marc's
+Marceau
+Marceau's
+Marcel
+Marcello
+Marcello's
+Marcia
+Marcia's
+Marcie
+Marcie's
+Marco
+Marco's
+Margaret
+Margaret's
+Margery
+Margery's
+Margo
+Margo's
+Marissa
+Marissa's
+Marjory
+Marjory's
+Markham
+Markham's
+Markism
+Markism's
+Marxian
+Maserati
+Maserati's
+Maseratis
+Mateo
+Mateo's
+Matson
+Matson's
+Matsumoto
+Matsumoto's
+Mattson
+Mattson's
+Maurine
+Maurine's
+Mavis
+May
+Mayer
+Mayer's
+Mayo
+Mayo's
+McCallum
+McCallum's
+McCann
+McCann's
+McCarty
+McCarty's
+McConnel
+McConnel's
+McCormick
+McCormick's
+McCullough
+McCullough's
+McDowell
+McDowell's
+McElroy
+McElroy's
+McGee
+McGee's
+McGillicuddy
+McGillicuddy's
+McGinnis
+McGinty
+McGinty's
+McGowan
+McGowan's
+McHugh
+McHugh's
+McKenna
+McKenna's
+McKeon
+McKeon's
+McMahon
+McMahon's
+McMullen
+McMullen's
+McNally
+McNally's
+McNulty
+McNulty's
+Mcadams
+Mcallister
+Mcallister's
+Mcbride
+Mcbride's
+Mccabe
+Mccabe's
+Mccall
+Mccall's
+Mccallum
+Mccallum's
+Mccann
+Mccann's
+Mccarthy
+Mccarthy's
+Mccarty
+Mccarty's
+Mccauley
+Mccauley's
+Mcclain
+Mcclain's
+Mcclellan
+Mcclellan's
+Mcclure
+Mcclure's
+Mccluskey
+Mccluskey's
+Mcconnel
+Mcconnel's
+Mcconnell
+Mcconnell's
+Mccormick
+Mccormick's
+Mccoy
+Mccoy's
+Mccracken
+Mccracken's
+Mccullough
+Mccullough's
+Mcdaniel
+Mcdaniel's
+Mcdermott
+Mcdermott's
+Mcdonald
+Mcdonald's
+Mcdonnell
+Mcdonnell's
+Mcdougall
+Mcdougall's
+Mcdowell
+Mcdowell's
+Mcelroy
+Mcelroy's
+Mcfadden
+Mcfadden's
+Mcfarland
+Mcfarland's
+Mcgee
+Mcgee's
+Mcgill
+Mcgill's
+Mcginnis
+Mcgovern
+Mcgovern's
+Mcgowan
+Mcgowan's
+Mcgrath
+Mcgrath's
+Mcgraw
+Mcgraw's
+Mcgregor
+Mcgregor's
+Mcguire
+Mcguire's
+Mchugh
+Mchugh's
+Mcintosh
+Mcintosh's
+Mcintyre
+Mcintyre's
+Mckay
+Mckay's
+Mckee
+Mckee's
+Mckenna
+Mckenna's
+Mckenzie
+Mckenzie's
+Mckeon
+Mckeon's
+Mckesson
+Mckesson's
+Mckinley
+Mckinley's
+Mckinney
+Mckinney's
+Mcknight
+Mcknight's
+Mclaughlin
+Mclaughlin's
+Mclean
+Mclean's
+Mcleod
+Mcleod's
+Mcmahon
+Mcmahon's
+Mcmillan
+Mcmillan's
+Mcmullen
+Mcmullen's
+Mcnally
+Mcnally's
+Mcnaughton
+Mcnaughton's
+Mcneil
+Mcneil's
+Mcnulty
+Mcnulty's
+Mcpherson
+Mcpherson's
+Medford
+Medford's
+Medusan
+Meg
+Meg's
+Meier
+Meier's
+Meiji
+Melcher
+Melcher's
+Melpomene
+Melpomene's
+Mendel
+Mendel's
+Mendelian
+Menorca
+Menzies
+Merck
+Merck's
+Merritt
+Merritt's
+Mervin
+Mervin's
+Mesopotamia
+Metcalf
+Metcalf's
+Methuen
+Methuen's
+Metrecal
+Metzler
+Metzler's
+Michel
+Michel's
+Michele
+Michele's
+Michelle
+Michelle's
+Millikan
+Millington
+Milne
+Miltonian
+Miltonism
+Miltonist
+Mindanao
+Mindanao's
+Minos
+Minot's
+Minotaur
+Minotaur's
+Minsk
+Minsk's
+Minsky
+Minsky's
+Mirfak
+Mirfak's
+Mizar
+Mizar's
+Moe
+Moe's
+Moen
+Moen's
+Mogadiscio
+Moghul
+Mohammedanism
+Mohr
+Moiseyev
+Moiseyev's
+Moldavia
+Moloch
+Moluccas
+Mona
+Mona's
+Monash
+Mongolianism
+Monmouth
+Monmouth's
+Monoceros
+Monongahela
+Monongahela's
+Montenegrin
+Montenegrin's
+Monteverdi
+Monteverdi's
+Montmartre
+Montmartre's
+Montrachet
+Montrachet's
+Moran
+Moran's
+Moresby
+Moresby's
+Morley
+Morley's
+Morrill
+Morrill's
+Morris
+Morrissey
+Morrissey's
+Moser
+Moser's
+Moulton
+Moulton's
+Mouton
+Moyer
+Moyer's
+Mpc
+Mt
+Mudd
+Mudd's
+Mueller
+Mueller's
+Muenster
+Mukden
+Mukden's
+Muong
+Muong's
+Muzo
+Muzo's
+Mynheer
+Myra
+Myra's
+Mysore
+NC
+NCO
+NE
+NH
+NIH
+NIMH
+NJ
+NM
+NMR
+NNE
+NNW
+NRC
+NTIS
+NV
+NW
+NY
+NYC
+NYT
+NYU
+Nadine
+Nadine's
+Nagoya
+Nagoya's
+Nagy
+Nagy's
+Nair
+Nair's
+Nakayama
+Narbonne
+Narbonne's
+Narragansett
+Narragansett's
+Nate's
+Neal
+Nebuchadnezzar
+Nebuchadnezzar's
+Ned
+Ned's
+Neff
+Neff's
+Nehru
+Nehru's
+Neil
+Neil's
+Nell
+Nell's
+Nellie
+Nellie's
+Nelsen
+Nelsen's
+Ness
+Neva
+Neva's
+Nevins
+Newbold
+Newbold's
+Newton
+Newton's
+Nguyen
+Nguyen's
+Niamey
+Niamey's
+Nibelung
+Nicholls
+Nicosia
+Nicosia's
+Niger
+Niger's
+Nikko
+Nikko's
+Nikolai
+Nikolai's
+Nineveh
+Noetherian
+Nolan
+Nolan's
+Noll
+Noll's
+Nora
+Nora's
+Nordhoff
+Nordhoff's
+Nordic
+Nordstrom
+Nordstrom's
+Noreen
+Noreen's
+Northrop
+Northrop's
+Northrup
+Northrup's
+Nostrand
+Nostrand's
+Nov
+Novak
+Novak's
+Novosibirsk
+Novosibirsk's
+Nubia
+Nubia's
+Nyquist
+Nyquist's
+O'Neill
+O'Neill's
+OSF
+OSF'S
+Oceania
+Oct
+Odin
+Ojibwa
+Olav
+Olav's
+Olduvai
+Oligocene
+Olin
+Olin's
+Olivier
+Olivier's
+Onondaga
+Onondaga's
+Ophiucus
+Oresteia
+Oresteia's
+Orestes
+Orin
+Orinoco
+Orion
+Orion's
+Orkney
+Orkney's
+Orly
+Orono
+Orono's
+Orphically
+Orr
+Orr's
+Orville
+Orville's
+Osgood
+Osgood's
+Osiris
+Otis
+Ott
+Ott's
+Ouagadougou
+PR
+PVC
+Palladian
+Palo
+Panamanian
+Pandanus
+Pangaea
+Paoli
+Paoli's
+Papua
+Papua's
+Paraguayan
+Paraguayan's
+Paraguayans
+Paramus
+Pareto
+Pareto's
+Parke
+Parke's
+Parkinsonian
+Parmesan
+Parr
+Parr's
+Parrs
+Parsi
+Parsifal
+Parsifal's
+Parthia
+Paso
+Paterson
+Paterson's
+Patti
+Patti's
+Paulo
+Paulo's
+Paulus
+Pavlovian
+Paz
+Peale
+Peale's
+Pease
+Peiping
+Peloponnese
+Pembroke
+Pembroke's
+Penelope
+Penelope's
+Penh
+Penrose
+Pentateuch
+Percival
+Percival's
+Periclean
+Perilla
+Perle
+Perle's
+Permian
+Perseid
+Persephone
+Persephone's
+Peter
+Peters
+Phelps
+Phillip
+Phillip's
+Phipps
+Phobos
+Phoenicia
+Phoenicia's
+Pickett
+Pickett's
+Pict
+Piedfort
+Piedmont
+Pilate
+Pinsky
+Pinsky's
+Piotr
+Piotr's
+Piraeus
+Piscataway
+Piscataway's
+Pizarro
+Pl
+Pollard
+Pollard's
+Poly
+Polyhymnia
+Polynesia
+Polynesia's
+Polys
+Ponce
+Ponchartrain
+Ponchartrain's
+Poole
+Poole's
+Porte
+Porte's
+Portia
+Porto
+Posner
+Posner's
+Poynting
+Poynting's
+Pradesh
+Prado
+Pretorian
+Priam
+Pritchard
+Pritchard's
+Procter
+Procter's
+Proserpine
+Proserpine's
+Protista
+Provence
+Pugh
+Punic
+Punjab
+Punjab's
+Punjabi
+Pusan
+Pusan's
+Pusey
+Pusey's
+Putnam
+Putnam's
+Pyle
+Pyle's
+Pyongyang
+Pyongyang's
+Pyotr
+Pyotr's
+QED
+QM
+Qatar
+Qatar's
+Queensland
+Queensland's
+Quezon
+Quezon's
+Quichua
+Quirinal
+Quito
+Quito's
+Quixotism
+RFI
+RNA
+Rabat
+Rabat's
+Rabin
+Rabin's
+Rae
+Rae's
+Rafferty
+Rafferty's
+Ragusan
+Raman
+Raman's
+Ramo
+Ramo's
+Ranier
+Ranier's
+Rankin
+Rankin's
+Rankine
+Raritan
+Raritan's
+Rastus
+Ratfor
+Raul
+Raul's
+Recife
+Recife's
+Redmond
+Redmond's
+Redondo's
+Regis
+Reid
+Reid's
+Remy
+Rena
+Rena's
+Renault
+Renault's
+Rene
+Rene's
+Rensselaer
+Rensselaer's
+Reub
+Reub's
+Reykjavik
+Reykjavik's
+Rhineland
+Rhoda
+Rhoda's
+Rhode
+Rica
+Ricanism
+Rico
+Riemannian
+Riga
+Rigel
+Rigel's
+Riordan
+Riordan's
+Rocco
+Rochford
+Romanesque
+Romeldale
+Roquemore
+Rosenblum
+Rosenblum's
+Rosenthal
+Rosenthal's
+Rosenzweig
+Rosenzweig's
+Rothschild
+Rothschild's
+Rourke
+Rowe
+Rowe's
+Roxbury
+Roxbury's
+Royce
+Rubaiyat
+Ruben
+Ruben's
+Rubin
+Rubin's
+Rudolf
+Rudolf's
+Rudyard
+Rudyard's
+Runge
+Russo
+Russo's
+Ruthful
+Ruthfully
+Ruthfulness
+Rwanda
+Rwanda's
+Rydberg
+Rydberg's
+SC
+SCM
+SD
+SE
+SIAM
+SIDS
+SIGABRT
+SIGALRM
+SIGBUS
+SIGCHLD
+SIGCLD
+SIGCONT
+SIGEMT
+SIGFPE
+SIGHUP
+SIGILL
+SIGINT
+SIGIO
+SIGIOT
+SIGKILL
+SIGPIPE
+SIGPROF
+SIGQUIT
+SIGSEGV
+SIGSTOP
+SIGSYS
+SIGTERM
+SIGTRAP
+SIGTSTP
+SIGTTIN
+SIGTTOU
+SIGURG
+SIGUSR
+SIGVTALRM
+SIGWINCH
+SIGXCPU
+SIGXFSZ
+SOS
+SSE
+SST
+SSW
+SUNY
+SW
+Sabina
+Sabina's
+Sachs
+Sachsen
+Sadler
+Sadler's
+Sagittarius
+Sal
+Salesian
+Salina
+Salina's
+Salish
+Salle
+Sally
+Salton
+Samaritan
+San
+Sana
+Sanborn
+Sanborn's
+Sanderling
+Santo
+Santos
+Sappho
+Sappho's
+Saracen
+Saracen's
+Saracens
+Saran
+Sardinia
+Sardinia's
+Sarge's
+Satanism
+Satanist
+Saturnism
+Saul
+Saul's
+Sault
+Savoy
+Savoyard
+Savoyards
+Scala
+Scala's
+Scarborough
+Scarlatti
+Scarlatti's
+Scarsdale
+Scarsdale's
+Schantz
+Scheherazade
+Scheherazade's
+Schiller
+Schiller's
+Schlesinger
+Schlesinger's
+Schloss
+Schnabel
+Schnabel's
+Schoenberg
+Schoenberg's
+Schofield
+Schofield's
+Schottky
+Schottky's
+Schuyler
+Schuyler's
+Schuylkill
+Schwab
+Schweitzer
+Schweitzer's
+Seagram
+Seagram's
+Sean
+Sean's
+Sebring
+Sebring's
+Segovia
+Seidel
+Selena
+Selena's
+Selkirk
+Selkirk's
+Selwyn
+Selwyn's
+Sep
+Sepoy
+Serbia
+Serbia's
+Sergei
+Sergei's
+Serpens
+Seth
+Seth's
+Seton
+Severn
+Severn's
+Sextans
+Seychelles
+Shafer
+Shafer's
+Shaffer
+Shaffer's
+Shannon
+Shantung
+Shari
+Shari's
+Sharpe
+Shattuck
+Shattuck's
+Shea
+Shedir
+Sheehan
+Sheehan's
+Shepard
+Sheppard
+Sheppard's
+Sheri
+Sheri's
+Sherrill
+Sherrill's
+Shipley
+Shiva
+Shiva's
+Shmuel
+Shockley
+Shockley's
+Shoshone
+Shoshone's
+Shu
+Shu's
+Shulman
+Shulman's
+Sian
+Sian's
+Sibley
+Siegel
+Siegel's
+Sieglinda
+Sieglinda's
+Siegmund
+Siegmund's
+Siemens
+Siena
+Sifford
+Siggraph
+Sigil
+Simla
+Simonson
+Simonson's
+Sims
+Sinbad
+Sinbad's
+Singborg
+Sino
+Sitar
+Sitarist
+Skopje
+Slavonic
+Slocum
+Slocum's
+Slovakia
+Slovakia's
+Slovenia
+Slovenia's
+Smalley
+Smalley's
+Smithson
+Smithson's
+Smyrna
+Smyrna's
+Smythe
+Soc
+Societe
+Soddy
+Solon
+Soloviev
+Somalia
+Sommerfeld
+Sommerfeld's
+Sonenberg
+Sony
+Sony's
+Southernwood
+Southey
+Spacewar
+Spaulding
+Spaulding's
+Speakerphone
+Spector's
+Spica
+Spicas
+Spiro
+Spiro's
+Spitz
+Sposato
+Sprague
+Sprague's
+Sproul
+Sproul's
+Sri
+Sri's
+Stahl
+Stahl's
+Stanhope
+Stanhope's
+Stargate
+Stargate's
+Staunton
+Steele
+Steele's
+Steen
+Steen's
+Stefan
+Stefan's
+Stendhal
+Stendler
+Sternberg
+Sternberg's
+Stone
+Stone's
+Storey
+Storeyed
+Storeys
+Stratton
+Stratton's
+Strickland
+Strickland's
+Strindberg
+Strom
+Strom's
+Sturbridge
+Sturbridge's
+Sturm
+Sturm's
+Stylar
+Subapically
+Sumeria
+Sumner
+Sumner's
+Sus
+Svetlana
+Svetlana's
+Swansea
+Swansea's
+Swarthout
+Swarthout's
+Swink
+Sykes
+Sylow
+Sylvie's
+Synge
+Szilard
+TA
+TN
+TOEFL
+TTY
+TWX
+TX
+Talmudism
+Tamil
+Tanaka
+Tanaka's
+Tananarive
+Tarbell
+Tarbell's
+Tartary
+Tass
+Taurus
+Tegucigalpa
+Tegucigalpa's
+Terpsichore
+Terpsichore's
+Terre
+Terre's
+Tesseract
+Thalia
+Thalia's
+Thayer
+Thayer's
+Thea
+Thea's
+Thermofax
+Thessalonian
+Thessalonians
+Thessaly
+Thetis
+Thomistic
+Thomistic's
+Thorstein
+Thrace
+Thrace's
+Thracian
+Thuban
+Thuban's
+Tientsin
+Tientsin's
+Tina
+Tina's
+Tirana
+Tirana's
+Tito's
+Toby
+Toby's
+Tom
+Tom's
+Tomlinson
+Tomlinson's
+Tompkins
+Tories
+Torrance
+Torrance's
+Tory
+Transite
+Transite's
+Transputer
+Transvaal
+Transvaal's
+Transylvania's
+Trevelyan
+Trevor
+Triangulum
+Triassic
+Trichinella
+Trichinella's
+Triplett
+Triplett's
+Trobriand
+Troy
+Truk
+Tutankhamen
+Tutenkhamon
+Twombly
+Twombly's
+Tyburn
+Tyburn's
+Tyrannosaurus's
+Tzeltal
+UK
+USGS
+USIA
+USN
+UT
+UV
+Ukraine
+Ukraine's
+Ulan
+UniPlus
+UniPlus's
+UniSoft
+UniSoft's
+Urania
+Urdu
+Uri
+Uris
+Urquhart
+Utrecht
+Utrecht's
+VA
+VAX
+VT
+Vaduz
+Valery
+Valery's
+Valletta
+Valletta's
+Valois
+Valparaiso
+Vancement
+Vanderpoel
+Vanderpoel's
+Varitype
+Varitype's
+Vasquez
+Vasquez's
+Vassar
+Vassar's
+Vaughan
+Vaughan's
+Veda
+Veda's
+Veganism
+Vella
+Vella's
+Veneto
+Veneto's
+Verde
+Verde's
+Verderer
+Verdi
+Verdi's
+Verna
+Verna's
+Versatec
+Versatec's
+Vesuvius
+Vida
+Vida's
+Vientiane
+Vientiane's
+Vikram
+Vinci
+Vinci's
+Virgil
+Virgil's
+Vito
+Vito's
+Volterra
+Volterra's
+Voss
+Vought
+Vought's
+Vreeland
+Vreeland's
+Vulcanism
+WA
+WAC
+WI
+WV
+WY
+Waals
+Wadsworth
+Wadsworth's
+Wagnerian
+Wahl
+Wahl's
+Waite
+Waite's
+Waldron
+Waldron's
+Wallis
+Waltham
+Waltham's
+Wappinger
+Wappinger's
+Warburton
+Watanabe
+Watanabe's
+Webb
+Webb's
+Wehr
+Wehr's
+Wei
+Wei's
+Weierstrass
+Weisenheimer
+Weller
+Welles
+Welton
+Werther
+Werther's
+Whalen
+Whalen's
+Whatley
+Whatley's
+Whitaker
+Whitaker's
+Whitehorse
+Whitehorse's
+Wightman
+Wightman's
+Wilkie
+Wilkie's
+Wilkins
+Willa
+Willa's
+Willis
+Wiltshire
+Wiltshire's
+Winchester
+Wisenheimer
+Witt
+Witt's
+Wittgenstein
+Wittgenstein's
+Wolfe
+Wolfe's
+Wolff
+Wolff's
+Wong
+Wong's
+Woodstock
+Woodstock's
+Woody
+Woody's
+Wotan
+Wotan's
+Wu
+Wu's
+Wyatt
+Wyatt's
+Wyeth
+Wyeth's
+Wylie
+Wylie's
+Wynn
+Wynn's
+Xenakis
+Xhosa
+Yankton
+Yankton's
+Yaounde
+Yaounde's
+Yarmouth
+Yarmouth's
+Yellowknife
+Yellowknife's
+Yellowstone
+Yellowstone's
+Yorkshire
+Yorkshire's
+Yost
+Yost's
+Zagreb
+Zagreb's
+Zambia
+Zambia's
+Zan
+Zan's
+Zoe
+Zoe's
+Zorn
+ab
+abacterial
+abacus
+abacuses
+abandonee
+abashment
+abatis
+abatises
+abattoir
+abaxial
+abbacy
+abbas
+abberations
+abbreviator
+abdicable
+abdicator
+abduce
+abduced
+abducens
+abducent
+abducentes
+abducing
+abeam
+abecedarian
+aberrance
+aberrancy
+aberrated
+aberrational
+abetment
+abhorrence
+abidance
+abiogenesis
+abiogenetic
+abiogenetical
+abiogenetically
+abiogenist
+abiological
+abiologically
+abiotic
+abiotically
+abjuration
+ablaut
+abloom
+abluted
+ablutionary
+abnegate
+abnegates
+abnegation
+abnegator
+aboil
+abolishable
+abolitionary
+abolitionism
+abomasal
+abominably
+abominator
+abominators
+aboral
+aborally
+abortifacient
+abortionist
+abortionists
+abovementioned
+abracadabra
+abradable
+abradant
+abreact
+abridgement
+abrin
+abroach
+abruption
+abscise
+abscised
+abscisin
+abscising
+abscission
+absinth
+absolutism
+absolutist
+absolutistic
+absorbability
+absorbable
+absorbance
+absorbancy
+absorbant
+absorbtions
+absorptance
+absorptional
+abstemious
+abstentious
+abstractable
+abstractional
+abstrict
+abstriction
+abstrictions
+abstrusity
+absurdism
+absurdist
+absurdum
+abubble
+abuilding
+abutilon
+abuttals
+abuzz
+abyssal
+academe
+academical
+academicism
+academism
+acanthocephalan
+acanthopterygian
+acanthus
+acanthuses
+acarpellous
+acarpelous
+acatalectic
+acaulescence
+acaulescent
+accelerando
+accentless
+acceptation
+accessary
+accessibleness
+accessional
+accessorial
+acciaccatura
+accidence
+accidentalism
+accidentalist
+accipiter
+acclivity
+accommodational
+accommodator
+accommodators
+accompanyist
+accompanyists
+accomplishable
+accordionist
+accordionists
+accostable
+accountantship
+accreditable
+accrete
+accreted
+accreting
+accretionary
+accretive
+accruable
+accruement
+acculturational
+acculturationist
+accumbency
+accumbent
+accumulable
+accurses
+accursing
+accurst
+accusatory
+accusor
+accustomation
+acedia
+acellular
+acentric
+acephalous
+acerb
+acerbate
+acerbic
+acerbically
+acerbity
+acervate
+acervately
+acervation
+acetal
+acetaldehyde
+acetamide
+acetaminophen
+acetification
+acetifier
+acetify
+acetonic
+acetous
+acetyl
+acetylate
+acetylation
+acetylative
+acetylenic
+achier
+achiest
+achiness
+achromat
+achromatically
+achromaticity
+achromatism
+achy
+acidhead
+acidiferous
+acidifiable
+acidification
+acidifier
+acidify
+acidimeter
+acidimeter's
+acidimeters
+acidimetric
+acidimetry
+acidulant
+acidulate
+acidulation
+acidulent
+acinus
+acock
+acold
+acquaintanceship
+acquirement
+acquisitional
+acquisitionist
+acquisititious
+acquitment
+acquittance
+acridity
+acrobacy
+acrobatically
+acrocentric
+acrodont
+acronymic
+acronymically
+acropetal
+acropetally
+acrophobia
+acrophobic
+acrostic
+acrostical
+acrostically
+actability
+actable
+actinolite
+actionable
+actionably
+actionless
+activistic
+actorish
+actuary
+aculeate
+acuminate
+acumination
+acupuncture
+acyl
+acylate
+acylated
+acylates
+adamance
+adamancy
+adamantine
+adaptaplex
+adaptational
+adaptationally
+adaptitude
+adaptivity
+adaxial
+addable
+addible
+addlepated
+addressor
+adducible
+adenine
+adenoid
+adenoidal
+adenoids
+adenoma
+adenomatous
+adenosine
+adherend
+adhesional
+adiabaticlly
+adieux
+adipic
+adipose
+adiposity
+adject
+adjudicator
+adjudicatory
+adjunction
+adjuration
+adjuratory
+adjustability
+adjustmental
+adjutancy
+adjuvant
+adle
+adman
+admeasure
+admeasurement
+administrant
+administrational
+administrationist
+admirability
+admissive
+admitter
+admitters
+admonitorily
+admonitory
+adoptability
+adoptable
+adoptee
+adoptees
+adoptianism
+adoptianist
+adoptionism
+adoptionist
+adorability
+adorably
+adoze
+adposition
+adrenalin
+adrenergic
+adrenocortical
+adscititious
+adsorbability
+adsorbable
+adsorbent
+adulator
+adulatory
+adulterant
+adulterator
+adulteress
+adulteresses
+adulterine
+adultlike
+adust
+advection
+advections
+advective
+adventuresome
+adventuresomeness
+adventuress
+adventuresses
+adventurism
+adventurist
+adventuristic
+adventurists
+adversative
+adversatively
+advertence
+advertency
+advertent
+advertently
+advocator
+adynamic
+adz
+adze
+aeolotropic
+aeolotropy
+aeonian
+aeonic
+aerialist
+aerie
+aerier
+aerily
+aero
+aeroballistic
+aeroballistics
+aerobatic
+aerobatics
+aerobe
+aerobically
+aerobiological
+aerobiologically
+aerobiology
+aerobiosis
+aerobiotic
+aerobiotically
+aerodynamical
+aerodynamically
+aerodynamicist
+aerodyne
+aeroembolism
+aerogene
+aerogenes
+aerogram
+aerogram's
+aerograms
+aerographer
+aerography
+aerolite
+aerolith
+aerolitic
+aerological
+aerologist
+aerology
+aeromagnetic
+aeromechanics
+aeromedical
+aeromedicine
+aerometeorograph
+aerometer
+aerometer's
+aerometers
+aeronaut
+aeroneurosis
+aeronomer
+aeronomic
+aeronomical
+aeronomics
+aeronomist
+aeropause
+aerosphere
+aerostat
+aerostatics
+aerothermodynamics
+aery
+aesthesiometer
+aesthesiometer's
+aesthesiometers
+afeard
+afeared
+affability
+affably
+affaire
+affaires
+affectability
+affectable
+affectate
+affectional
+affectionally
+affectionless
+affectivity
+affectless
+affectlessness
+affiance
+affiant
+afficionado
+affine
+affined
+affinely
+affirmable
+affirmance
+affixable
+affixal
+affixation
+affixial
+affixment
+affluency
+afflux
+affray
+affusion
+afghani
+aficionada
+aflatoxin
+aflutter
+afreet
+afrika
+afrikaans
+afterburner
+afterburners
+aftercare
+afterclap
+afterdamp
+afterdeck
+afterimage
+afterpiece
+aftertaste
+aftertax
+aftertime
+afterword
+afterworld
+agamete
+agamic
+agamically
+agapeic
+agapeically
+agave
+agaze
+ageing
+agelong
+agendaless
+agendum
+agene
+agenesis
+agentry
+aggie
+aggies
+agglutinability
+agglutinogen
+agglutinogenic
+aggradation
+aggrade
+aggregational
+aggress
+aggressivity
+agio
+agios
+agitational
+agitato
+agitprop
+aglare
+aglitter
+agnate
+agnatic
+agnatically
+agnation
+agnomen
+agnosticism
+agon
+agone
+agonic
+agonist
+agonistic
+agonistical
+agonistically
+agonists
+agoraphobia
+agoraphobic
+agouti
+agrarianism
+agreeability
+agriculturalist
+agriculturist
+agrimony
+agriology
+agrobiological
+agrobiologically
+agrobiology
+agrologic
+agrological
+agrologically
+agrologist
+agrology
+agronomic
+agronomical
+agronomically
+agronomics
+agronomist
+agronomy
+aground
+aguish
+aguishly
+ahistoric
+ahistorical
+ahold
+aidman
+aigrette
+ailanthus
+aile
+airbrush
+airburst
+airbus
+aircrew
+airdrome
+airfreight
+airglow
+airmanship
+airmobile
+airpost
+airscrew
+airsick
+airsickness
+airstream
+airwave
+airwaves
+airworthiness
+airworthy
+aitch
+alabastrine
+alack
+alacritous
+alai
+alamogordo
+alarmism
+alary
+alate
+alated
+alation
+alb
+albedo
+albinic
+albinism
+albino
+albinotic
+albuminoid
+albuminous
+alcaic
+alcazar
+alchemic
+alchemical
+alchemically
+alchemist
+alchemistic
+alchemistical
+alcoholically
+alcoholometer
+alcoholometer's
+alcoholometers
+alcoholometry
+aldermanic
+aldrin
+aleatoric
+aleatory
+alehouse
+alembic
+alexandrine
+alexandrite
+alexia
+alfa
+algal
+algebraist
+algicidal
+algicide
+algid
+algidity
+algin
+algophobia
+alia
+alicyclic
+alidade
+alienability
+alienable
+alienage
+alienator
+alienee
+alienism
+alienist
+alienor
+aliform
+alightment
+alimentary
+alimentation
+alimentative
+aline
+alinement
+aliphatic
+aliquot
+aliquot's
+aliquots
+alizarin
+alk
+alkahest
+alkahestic
+alkalescence
+alkalescent
+alkalify
+alkalimeter
+alkalimeter's
+alkalimeters
+alkalimetry
+alkalinity
+alkaloidal
+alkalosis
+alla
+allan
+allegate
+allegorist
+allelic
+allelism
+allelomorph
+alleluia
+allemand
+allergen
+allergenic
+allergist
+allery
+alleviatory
+allheal
+alliaceous
+allium
+allocatable
+allocution
+allogamous
+allogamy
+allogeneic
+allograft
+allograph
+allographic
+allomerism
+allomerous
+allometric
+allometry
+allomorph
+allomorphic
+allomorphism
+allonge
+allons
+allopath
+allopathic
+allopathically
+allopathy
+allopatric
+allopatrically
+allopatry
+allophane
+allopurinol
+allosteric
+allosterically
+allotee
+allotransplant
+allotransplantation
+allotrope
+allotropically
+allotropy
+allottee
+allottees
+allotype
+allotypic
+allotypically
+allotypy
+allover
+allseed
+alluvion
+allyl
+allylic
+almandine
+almandite
+almsgiver
+almsgiving
+almshouse
+alogical
+alogically
+aloin
+alongshore
+alpaca
+alpenglow
+alpenstock
+alpestrine
+alphameric
+alphamerical
+alphamerics
+alphanumerical
+alphanumerically
+alpinism
+alpinist
+alright
+altarpiece
+altazimuth
+alterability
+alterably
+alterate
+alterative
+alterman
+altern
+althea
+altimetry
+altitudinal
+altitudinous
+altocumulus
+altricial
+alumina
+aluminate
+aluminosilicate
+aluminous
+alunite
+alveolate
+alveolation
+alyssum
+alytical
+amah
+amalgamator
+amanita
+amanuenses
+amaranth
+amassment
+amative
+amatively
+amativeness
+amaurosis
+amaurotic
+amazonite
+ambage
+ambages
+ambagious
+ambassadorial
+ambassadorship
+ambassadress
+ambergris
+ambidexterity
+ambience
+ambiences
+ambit
+ambitionless
+ambiversion
+ambiversive
+ambivert
+ambrotype
+ambsace
+ambulacral
+ambulacrum
+ambulate
+ambulation
+ambulatorily
+ambushment
+ameliorator
+amelioratory
+amenabilities
+amenability
+amenably
+amendable
+amendatory
+amende
+ament
+amentia
+amerce
+amercement
+amerciable
+amercing
+ametropia
+ametropic
+ami
+amiability
+amiably
+amicability
+amidships
+amiens
+amine
+amis
+amitosis
+amitotic
+amitotically
+amitrole
+ammino
+ammoniacal
+ammoniate
+ammoniation
+ammonification
+ammonifier
+ammonify
+ammonite
+ammonites
+ammonitic
+ammonoid
+amnesia
+amnesiac
+amnesic
+amnestic
+amnia
+amniocentesis
+amnion
+amniote
+amniotic
+amoeban
+amoebiasis
+amoebic
+amoebocyte
+amoeboid
+amoralism
+amoretto
+amorphism
+amort
+amphibia
+amphibole
+amphibolite
+amphibolitic
+amphioxis
+amphioxus
+amphipathic
+amphiploid
+amphipod
+amphitheatric
+amphitheatrical
+amphitheatrically
+amphitropous
+amplexicaul
+amplexus
+amplidyne
+ampul
+ampule
+amputator
+amputee
+amra
+amuck
+amygdaloid
+amylolytic
+ana
+anabaptism
+anabasis
+anabatic
+anabiosis
+anabiotic
+anabolic
+anabolism
+anachronic
+anachronous
+anachronously
+anaclitic
+anacoluthic
+anacoluthically
+anaculture
+anadiplosis
+anaerobe
+anaerobically
+anaerobiosis
+anaglyphic
+anagrammatic
+anagrammatical
+anagrammatically
+analemma
+analemma's
+analemmas
+analeptic
+analgesia
+analgetic
+analogic
+analogist
+analphabet
+analphabetic
+analphabetism
+analysand
+anaphase
+anaphasic
+anaphylaxis
+anaplasia
+anaplastic
+anarch
+anarchism
+anarchistic
+anarcho
+anastasia
+anastigmat
+anastrophe
+anatomist
+anatoxin
+anatropous
+ancestress
+anchoress
+anchoret
+anchoritic
+anchoritically
+anchorless
+anchorman
+ancientry
+andalusite
+andante
+andantino
+andesine
+andesite
+andesitic
+andiron
+andradite
+androgen
+androgenic
+androgyny
+android
+anecdotage
+anecdotalist
+anecdotalists
+anecdotic
+anecdotical
+anecdotically
+anecdotist
+anemograph
+anemographic
+anemometric
+anemometrical
+anent
+aneroid
+aneurism
+aneurysm
+aneurysmal
+anfractuosity
+anfractuous
+angary
+angelical
+angelically
+angerless
+angina
+anginal
+anginose
+angiocardiographic
+angiocardiography
+anglesite
+angleworm
+anglia
+anglice
+anglicism
+angularity
+angulation
+ani
+anile
+animalcular
+animalcule
+animalculum
+animalism
+animalist
+animalistic
+animality
+animallike
+animist
+animistic
+animus
+aniseed
+aniseikonia
+anisette
+anisotropically
+anisotropism
+ankerite
+ankh
+anklebone
+anklebones
+anklet
+annelid
+annexational
+annexationist
+annexe
+annihilator
+annihilatory
+annotator
+annotators
+annuary
+annuitant
+annularity
+annulate
+annulated
+annulately
+annulation
+annulet
+annuli
+annunciatory
+annunicates
+anodal
+anodally
+anodically
+anodyne
+anodynic
+anointment
+anomalistic
+anomalistical
+anomer
+anomeric
+anonym
+anorectic
+anoretic
+anorexigenic
+anorthic
+anorthite
+anorthitic
+anorthosite
+anosmia
+anosmic
+anovulant
+anovulatory
+anoxemia
+anoxemic
+anoxia
+anoxic
+anserine
+antecede
+antecedence
+antecessor
+antechamber
+antechambers
+antechoir
+antediluvian
+antefix
+antefixal
+anteing
+antemortem
+antenatal
+antennal
+antennule
+anteroom
+anterooms
+anthelion
+anthesis
+anthill
+anthologist
+anthracitic
+anthracnose
+anthrax
+anthrop
+anthropic
+anthropical
+anthropocentric
+anthropocentrically
+anthropocentricity
+anthropogenesis
+anthropogenetic
+anthropography
+anthropoid
+anthropometrical
+anthropometrically
+anthropomorphism
+anthropomorphist
+anthropopathism
+anthropophagous
+anthropophagus
+anthropophagy
+anthroposophy
+antiaircraft
+antianxiety
+antibiosis
+antibiotically
+antiblack
+antiblackism
+antically
+anticancer
+anticancerous
+anticatalyst
+anticholinergic
+anticipant
+anticipants
+anticipatable
+anticipator
+anticlerical
+anticlericalism
+anticlimactical
+anticlimactically
+anticlimax
+anticlimaxes
+anticlinal
+anticline
+anticlockwise
+anticoagulant
+anticoagulate
+anticodon
+anticonvulsant
+anticonvulsive
+antidepressant
+antiderivative
+antidiuretic
+antidotal
+antidotally
+antienzyme
+antiestablishment
+antifertility
+antiform
+antifouling
+antifriction
+antifungal
+antigenic
+antigenically
+antigenicity
+antiglobulin
+antigorite
+antigravity
+antihemophilic
+antihistamine
+antihistaminic
+antihypertensive
+antiknock
+antileukemic
+antilitter
+antilog
+antilogarithm
+antilogarithms
+antimacassar
+antimacassars
+antimagnetic
+antimalarial
+antimalarials
+antimedieval
+antimedieval's
+antimedievals
+antimetabolite
+antimitotic
+antimonial
+antimonic
+antimonious
+antineoplastic
+antineutrino
+antineutron
+antinodal
+antinode
+antinovel
+antinovelist
+antinucleon
+antioxidant
+antiparasitic
+antiparticle
+antipathetic
+antipathetically
+antiperiodic
+antiperiplanar
+antipersonnel
+antiphlogistic
+antiphon
+antiphonary
+antiphony
+antiphrasis
+antipodal
+antipodean
+antipoetic
+antipollution
+antipope
+antiproton
+antipyretic
+antipyrine
+antiquarianism
+antirheumatic
+antirrhinum
+antisemite
+antisemite's
+antisemites
+antisepsis
+antiseptically
+antispasmodic
+antistrophe
+antistrophic
+antistrophically
+antitank
+antitoxic
+antitrades
+antitubercular
+antituberculous
+antitumor
+antitumoral
+antitussive
+antivenin
+antiviral
+antivitamin
+antonym
+antonymic
+antonymous
+antonyms
+antonymy
+antrorse
+antrorsely
+anywise
+aortal
+aortic
+aortographic
+aortography
+apalachicola
+apartmental
+apathetically
+apatite
+apeak
+apelike
+aperient
+aperiodically
+aperitif
+aphaeresis
+aphaeretic
+aphanite
+aphanitic
+aphasiac
+aphelion
+aphetic
+aphetically
+aphides
+aphorist
+aphoristic
+aphoristically
+aphotic
+aphrodisiac
+aphrodisiacal
+aphyllous
+aphylly
+apian
+apiarian
+apiarist
+apices
+apiculate
+apicultural
+apiculture
+apiculturist
+aplacental
+aplanatic
+aplasia
+aplastic
+apocalyptical
+apocalyptically
+apocalypticism
+apocalyptism
+apocalyptist
+apocarpous
+apocarpy
+apochromatic
+apocope
+apocrine
+apodal
+apodeictic
+apodictic
+apodictically
+apodosis
+apodous
+apogamic
+apogamous
+apogean
+apolitical
+apolitically
+apollinaire
+apologie
+apologue
+apolune
+apomixis
+apomorphine
+aponeurosis
+aponeurotic
+apoplectic
+apoplectically
+apoplexy
+aport
+aposematic
+aposematically
+apostasy
+apostleship
+apostolate
+apostolicity
+apostrophic
+apothecial
+apothecium
+apothegm
+apothegmatic
+apothegmatical
+apothegmatically
+apothem
+apotropaic
+apotropaically
+appaloosas
+apparitional
+appealability
+appealable
+appeasable
+appellee
+appendant
+appendectomy
+appendicular
+apperceive
+apperception
+apperceptive
+appestat
+appetence
+appetency
+appetent
+applaudable
+applaudably
+applicatory
+appointe
+appomattox
+apport
+appose
+apposed
+apposing
+appositional
+appositionally
+appraisement
+appreciator
+appreciatory
+apprehensibly
+appressed
+approbatory
+approvable
+approvably
+approx
+approximable
+approximant
+appurtenant
+apractic
+apraxia
+apraxic
+apriority
+apsidal
+apsides
+apterous
+apteryx
+aptitudinal
+aptitudinally
+apyrase
+aquacade
+aquaculture
+aquafortis
+aqualunger
+aquamarine
+aquanaut
+aquaplane
+aquaplaner
+aquarelle
+aquarellist
+aquarist
+aquatically
+aquatint
+aquatinter
+aquatintist
+aquavit
+aquicultural
+aquiculture
+aquidneck
+aquiferous
+aquilegia
+aquiline
+aquilinity
+aquiver
+arability
+arachnoid
+arbitrable
+arbitrageur
+arbitral
+arbitrament
+arbitrational
+arboreous
+arborescence
+arborescent
+arborescently
+arboriculture
+arboriculturist
+arborist
+arborist's
+arborists
+arborvitae
+arbovirus
+arbritrary
+arbutus
+arcanum
+arccos
+arccosine
+archae
+archaist
+archaistic
+archangelic
+archbishopric
+archdeacon
+archdeaconate
+archdeaconry
+archdiocesan
+archducal
+archduchess
+archduchy
+archduke
+archdukedom
+archegonial
+archetypal
+archetypally
+archfiend
+archipelagic
+architectonically
+architrave
+archivolt
+archon
+archpriest
+archway
+arclength
+arco
+arcsin
+arctan
+arctically
+arcuate
+arcuately
+arcuation
+areal
+areally
+areaway
+areola
+areolar
+areolate
+areolation
+areole
+argent
+argentic
+argentiferous
+argentine
+argentite
+argentous
+arger
+argillaceous
+arginine
+argos
+argosy
+argufier
+argufy
+argumentum
+argyle
+argyll
+arhat
+aria
+arianist
+arianists
+arithmetician
+armamentarium
+armentieres
+armillaria
+armless
+armlet
+armlike
+armoire
+armorial
+armorially
+armorist
+armorist's
+armorists
+armorless
+armrest
+armsful
+aromatically
+aromaticity
+arpanet
+arras
+arrearage
+arrestant
+arrestment
+arrhythmia
+arrhythmic
+arrhythmical
+arrhythmically
+arris
+arrises
+arriviste
+arrondissement
+arrowwood
+arrowworm
+arrowy
+arsenical
+arsenious
+arsenite
+arsis
+arsonist
+arsonous
+arte
+artefact
+artefacts
+artemisia
+arteriogram
+arteriogram's
+arteriograms
+arteriographic
+arteriography
+arteriolosclerosis
+arteritis
+arthritic
+arthritically
+arthropathy
+arthrosis
+arthrospore
+arthrosporic
+articular
+artilleryman
+artily
+artiodactyl
+artiste
+artmobile
+arum
+aryl
+asap
+asbestosis
+asbestus
+ascendable
+ascendance
+ascendence
+ascendible
+ascensional
+ascensive
+ascertainment
+ascesis
+ascetical
+ascetically
+ascidian
+ascidium
+ascites
+ascitic
+ascomycetes
+ascorbate
+ascospore
+ascosporic
+ascosporous
+ascus
+asdic
+asepsis
+aseptically
+asexual
+asexually
+ashcan
+ashcans
+ashless
+ashmen
+ashram
+asininity
+askant
+askesis
+aslant
+aslope
+asparagine
+aspartate
+aspartic
+aspartokinase
+aspectual
+aspencade
+aspencades
+asperges
+asperse
+aspersed
+aspersing
+asphaltic
+asphaltite
+asphaltum
+aspheric
+aspherical
+asphodel
+asphyxiator
+aspiate
+aspidistra
+assagai
+assai
+assailable
+assassinator
+assegai
+assemblagist
+assemblyman
+assemblywoman
+assentation
+assentor
+assessable
+asseverate
+asseveration
+asseverative
+assignability
+assignat
+assignational
+assignor
+assimilability
+assimilable
+assimilationism
+assimilator
+assimilatory
+assize
+assizer
+assizers
+assizes
+associateship
+assoil
+assoilment
+assortative
+assuagement
+assuasive
+assumable
+assumably
+assumpsit
+assumptive
+assurgent
+assuror
+astaires
+astarboard
+astatic
+astatically
+astaticism
+asteriated
+asteriskless
+asterism
+asterisms
+astern
+asthenia
+asthenic
+asthenosphere
+asthmatic
+asthmatically
+astigmat
+astigmatically
+astir
+astonied
+astrachan
+astragal
+astragalus
+astrakhan
+astrobiological
+astrobiologist
+astrobiology
+astrocyte
+astrocytic
+astrocytoma
+astrodome
+astrol
+astrolabe
+astrologer
+astrologer's
+astrologers
+astrological
+astrologically
+astrology
+astron
+astronautical
+astronautically
+astronavigation
+astrophotography
+astrosphere
+aswarm
+aswirl
+aswoon
+asymptomatic
+asynapsis
+async
+asyndetic
+asyndetically
+asyndeton
+ataractic
+ataraxic
+atari
+atavism
+atavist
+atavistically
+ataxia
+ataxic
+atelectasis
+atelier
+atheistical
+atheistically
+athenaeum
+atheneum
+athirst
+athletically
+athwartship
+athwartships
+atilt
+atinate
+atingle
+atlantes
+atman
+atment
+atmometer
+atmometer's
+atmometers
+atmospherically
+atmospherium
+atomicity
+atomism
+atomist
+atomistic
+atomistically
+atomistics
+atonalism
+atonalist
+atonalistic
+atonality
+atonic
+atonicity
+atony
+atopic
+atopy
+atremble
+atresia
+atrial
+atrioventricular
+atrip
+atrium
+atriums
+atropine
+attachable
+attackman
+attainability
+attainder
+attaint
+attar
+attemptable
+atticism
+attis
+attorn
+attorneyship
+attornment
+attractable
+attractant
+attractivity
+attrited
+attritional
+attunement
+atune
+atwitter
+atypic
+atypicality
+auctorial
+aud
+auden
+audient
+audile
+auding
+audiofrequencies
+audiofrequency
+audiogenic
+audiophile
+auditable
+audivi
+augend
+augite
+augitic
+augmentable
+augmentative
+augmentor
+augury
+auk
+auld
+aunthood
+auntlike
+aurar
+aureate
+aureola
+auricle
+auricula
+auricular
+auriculate
+aurochs
+aurorae
+auroral
+aurorean
+aurous
+auscultatory
+auslander
+auspicate
+austenite
+austral
+australite
+australopithecine
+authoress
+authorial
+autoantibody
+autobahn
+autobiographer
+autobus
+autocade
+autocatalysis
+autocatalytic
+autocephalous
+autochthonous
+autoclave
+autoclaved
+autocoder
+autocratical
+autocross
+autocueing
+autodidact
+autodidactic
+autodyne
+autoecious
+autoeciously
+autoecism
+autoerotic
+autoerotically
+autoeroticism
+autoerotism
+autogamous
+autogamy
+autogenesis
+autogenetic
+autogenetically
+autogenic
+autogenous
+autogenously
+autogiro
+autograft
+autographic
+autographically
+autography
+autogyro
+autohypnosis
+autohypnotic
+autoimmune
+autoimmunity
+autoinfection
+autoinoculation
+autointoxication
+autoloading
+autologous
+autolysate
+autolysin
+autolysis
+autolytic
+automaker
+automanipulation
+automanipulative
+automat
+automatable
+automaticity
+automatism
+automatist
+automobil
+automobilist
+automorphism
+autonomically
+autonomist
+autoparagraph
+autophyte
+autophytic
+autophytically
+autoplastic
+autoplastically
+autoplasty
+autoradiogram
+autoradiogram's
+autoradiograms
+autoradiograph
+autoradiographic
+autoradiography
+autorotate
+autorotation
+autorotational
+autosexing
+autosomal
+autosomally
+autosome
+autosuggest
+autosuggestible
+autosuggestion
+autotable
+autotelic
+autotetraploid
+autotetraploidy
+autotomic
+autotomous
+autotomy
+autotransplant
+autotransplantation
+autotroph
+autotrophic
+autotrophically
+autotrophy
+autunite
+aux
+auxesis
+auxetic
+auxetically
+auxil
+auxin
+auxinic
+auxinically
+auxotroph
+auxotrophic
+auxotrophy
+avaliable
+avast
+avatar
+avaunt
+avec
+avellan
+avellane
+aventail
+aventine
+aventino
+aventurine
+averment
+avesta
+aviarist
+aviatress
+aviculture
+aviculturist
+avidin
+avifauna
+avifaunal
+avifaunally
+avifaunistic
+avigation
+avirulent
+avitaminosis
+avitaminotic
+avocate
+avocational
+avocationally
+avocet
+avoirdupois
+avouchment
+avowal
+avulse
+avulsing
+avulsion
+avuncular
+awardable
+awardee
+aweary
+aweather
+aweigh
+aweless
+awestricken
+awestruck
+awhirl
+awless
+awn
+awnless
+awoken
+axal
+axel
+axenic
+axenically
+axiality
+axil
+axile
+axilla
+axillar
+axillary
+axisymmetric
+axisymmetrical
+axisymmetrically
+axisymmetry
+axletree
+axman
+ayin
+azathioprine
+azeotropic
+azide
+azido
+azine
+azonal
+azote
+azurite
+azusa
+babblement
+baboonish
+babushka
+babysat
+baccate
+bacchanal
+bacchanalia
+bacchanalian
+bacchant
+bacchante
+bacchantes
+bacchantic
+bacchic
+bacciferous
+baci
+bacillar
+bacillary
+bacitracin
+backbite
+backbiter
+backcountry
+backcourt
+backcourtman
+backcross
+backfield
+backfire
+backfired
+backfires
+backfiring
+backgammon
+backgammon's
+backhoe
+backhouse
+backless
+backpedal
+backrest
+backsaw
+backseat
+backset
+backslap
+backslapper
+backslide
+backslider
+backspin
+backstay
+backstretch
+backstroke
+backswept
+backswing
+backsword
+backwash
+backwoodsman
+bactericidal
+bactericidally
+bactericide
+bacterin
+badinage
+bafflement
+bagful
+baggily
+bagley
+bagman
+baguette
+bailable
+bailee
+baileefe
+bailie
+bailiffship
+bailiwick
+bailment
+bailor
+bailsman
+bainite
+bairn
+baize
+bakeshop
+balderdash
+baldhead
+baldheaded
+baldish
+baldpate
+balefire
+balenciaga
+balkline
+ballade
+balladeer
+balladic
+balladist
+balladry
+ballcarrier
+balletic
+balletomane
+balletomania
+ballfield
+ballfield's
+ballgown
+ballgown's
+ballista
+ballistically
+balloonist
+ballottement
+ballyhooey
+balmily
+baloney
+balsamic
+baluster
+bam
+bambino
+bamboozle
+bamboozled
+bamboozlement
+bamboozles
+bamboozling
+banality
+banausic
+bancroft
+bandana
+bandanna
+bandbox
+bandeau
+bandeaux
+bandgap
+banditry
+banditti
+bandleader
+bandmaster
+bandoleer
+bandolier
+bandsman
+baneberry
+bangish
+bangtail
+banjoes
+banjoist
+bankable
+bankbook
+bankbooks
+bankroll
+bankroller
+bankside
+banneret
+bannerette
+bannister
+bannisters
+bannock
+banns
+banquette
+bantamweight
+bantling
+banyan
+banzai
+baobab
+barbarianism
+barbarically
+barbarism
+barbate
+barbe
+barberry
+barbershop
+barbitone
+barbudo
+barbudos
+barbwire
+bareback
+barebacked
+bareheaded
+bareheadedness
+bareknuckle
+bareknuckled
+bargeboard
+bargeman
+bariatrician
+bariatrics
+baric
+baritonal
+barkier
+barkless
+barky
+barleycorn
+barmaid
+barman
+barmier
+barmy
+barny
+barogram
+barogram's
+barograms
+barograph
+barographic
+barometrical
+barometrically
+barometry
+baronage
+baronetage
+baronetcy
+barramunda
+barramundi
+barranca
+barranco
+barrater
+barrator
+barratry
+barre
+barrelful
+barrelhouse
+barrelsful
+barrio
+barrister
+barristers
+barron
+barroom
+barrooms
+barware
+barycentric
+baryon
+baryon's
+baryonic
+baryons
+basaltic
+bascom
+bascule
+baseborn
+baselevel
+basementless
+basepoint
+baserunning
+bashaw
+basicity
+basidial
+basidiomycete
+basidiomycetes
+basidiomycetous
+basidiospore
+basidiosporous
+basidium
+basie
+basification
+basify
+basilary
+basileis
+basilica
+basilican
+basinal
+basinet
+basipetal
+basipetally
+basketful
+basketlike
+basketry
+basketwork
+basler
+baslot
+basophil
+basophile
+basophilia
+bassi
+bassis
+bassist
+bassoon
+bassoon's
+bassoonist
+bassoonist's
+bassoonists
+bassoons
+bast
+bastardy
+bastile
+bastille
+batboy
+bate
+bateau
+batfish
+batfowl
+bathhouse
+bathhouses
+bathometer
+bathometer's
+bathometers
+bathtubful
+bathwater
+batista
+batiste
+batman
+batrachian
+batrachotoxin
+batsman
+batt
+battailous
+battalia
+batteau
+battement
+battier
+battiness
+battlewagon
+battu
+battue
+batty
+batwing
+baubee
+baudrons
+baulk
+baulked
+baulking
+baulks
+baum
+bauxitic
+bawcock
+bawd
+bawden
+bawdily
+bawdry
+bayadere
+bayaderka
+bayanihan
+bazon
+bazooka
+bazookas
+bea
+beachboy
+beachboys
+beachcomb
+beachcomber
+beachcombers
+beachfront
+beachside
+beachwear
+beachy
+beadroll
+beadwork
+beale
+beall
+beame
+beamish
+beamishly
+beamy
+beanball
+beanie
+bearability
+bearbaiting
+bearberry
+beardown
+bearskin
+beastie
+beatie
+beatifically
+beatless
+beauchamps
+beauclerk
+beaverboard
+beaverton
+bebopper
+bechance
+becket
+beckett
+becloud
+bedabble
+bedaub
+bedaubing
+bedchamber
+bedclothes
+bede
+bedeck
+bedevilment
+bedew
+bedfellow
+bedim
+bedimmed
+bedimming
+bedlamite
+bedouin
+bedplate
+bedrid
+bedroll
+bedsore
+beduin
+beduins
+beebread
+beefcake
+beefeater
+beefwood
+beekeeper
+beekeeping
+beelike
+beeline
+beerier
+beery
+beestings
+beeswax
+beeves
+befoh
+befool
+beforehandedness
+beforetime
+begat
+begetter
+begone
+begrime
+begrimed
+begriming
+beguilement
+beguine
+behaviorist
+behaviorist's
+behavioristically
+behaviorists
+behemoth
+behemothic
+behindhand
+behoof
+beigy
+bel
+belaud
+beldam
+beldame
+beleaguer
+belge
+belike
+belittlement
+belive
+bellbird
+belligerency
+bellpull
+bellum
+bellwood
+bellwort
+bellyband
+belowground
+beltless
+belton
+beltway
+beluga
+beluga's
+bemadden
+bemaddening
+bemire
+bemock
+bemusement
+benchmar
+benday
+benedictory
+benefaction
+benefactress
+benefic
+beneficiate
+beneficiation
+benefitted
+benefitting
+benight
+benignancy
+benignant
+benignantly
+benignity
+benthal
+benthic
+benthonic
+benthos
+bentonite
+bentonitic
+benumb
+bepaint
+beplaster
+bequeathal
+berberine
+berceuse
+berceuses
+bergamot
+beringer
+bernardine
+berne
+berrylike
+berteros
+berto
+beseem
+besetment
+beshrew
+besmear
+besom
+besot
+besotter
+bespatter
+bespoken
+besprent
+besprinkle
+bestead
+besteaded
+besteading
+bestiality
+bestiary
+bestrew
+bestride
+bestrides
+bestriding
+bestsellerdom
+betaine
+betake
+betel
+bethink
+betimes
+betony
+betted
+betweenbrain
+betweentimes
+betweenwhiles
+bewigged
+bewitchery
+bewitchment
+bewray
+bey
+biassed
+biassin
+biassing
+biathlon
+bibb
+bibber
+bibbery
+bibcock
+bibelot
+bibelots
+bibless
+biblicism
+biblicist
+bibliographer
+bibliolater
+bibliolatrous
+bibliolatry
+bibliology
+bibliomania
+bibliomaniac
+bibliomaniacal
+bibliopegic
+bibliopegically
+bibliopegist
+bibliopegistic
+bibliopegy
+bibliophilic
+bibliophilism
+bibliophilist
+bibliophily
+bibliopole
+bibliopolic
+bibliopolist
+bibliotheca
+bibliothecal
+bibliotic
+bibliotics
+bibliotist
+bibulous
+bibulously
+bibulousness
+bicameralism
+bicapsular
+bicentenary
+bicentric
+bicentricity
+bichloride
+bichrome
+bicipital
+biconcavity
+biconditional
+biconvexity
+bicorne
+bicornuate
+bicultural
+biculturalism
+bicuspid
+bicuspidate
+bicyclic
+bicyclist
+biddability
+biddably
+bidet
+bidialectal
+bidialectalism
+bierce
+bietnar
+bifacial
+biff
+bifid
+bifidity
+bifidly
+bifilar
+bifilarly
+biflagellate
+biform
+bigamist
+bigamous
+bigamously
+bigamy
+bigeminal
+bigeminy
+bigeneric
+bigeye
+biggety
+biggin
+bigging
+biggish
+biggity
+bighead
+bigheaded
+bighearted
+bigheartedly
+bigheartedness
+bighorn
+bighorn's
+bighorns
+bigmouthed
+bignonia
+bigwig
+bijou
+bijouterie
+bikeway
+bilabiate
+bilateralism
+bilbo
+bilboa
+bilgier
+bilgy
+bilharziasis
+biliary
+bilious
+biliously
+biliousness
+billable
+billfold
+billfold's
+billfolds
+billhead
+billhook
+billionaire
+billon
+billowy
+billposter
+billposting
+billycock
+bilobal
+bilobed
+bilocular
+biloculate
+bimanual
+bimanually
+bimester
+bimestrial
+bimetal
+bimillenary
+bimillenial
+bimodality
+bimorphemic
+binational
+bindweed
+bine
+bingle
+binnacle
+binned
+binning
+binocularity
+bint
+binucleate
+binucleated
+bio
+bioactive
+bioassay
+bioastronautical
+bioastronautics
+biocatalyst
+biocatalytic
+biocenology
+biocenosis
+biocenotic
+biochemic
+biocidal
+biocide
+bioclean
+bioclimatic
+biocoenosis
+biocoenotic
+biodegradability
+biodegradable
+biodegradation
+biodegrade
+bioecological
+bioecologist
+bioecology
+bioelectric
+bioelectrical
+bioelectricity
+bioengineering
+bioenvironmental
+bioflavonoid
+biog
+biogen
+biogenesis
+biogenetic
+biogenetically
+biogenic
+biogeochemical
+biogeochemistry
+biogeographic
+biogeographical
+biogeography
+biographee
+bioinstrumentation
+biologism
+biologistic
+bioluminescence
+bioluminescent
+biomacromolecule
+biomacromolecules
+biomaterial
+biome
+biometrical
+biometrically
+biomolecular
+bionic
+bionics
+bionomic
+bionomical
+bionomically
+bionomics
+biopolymer
+biopolymers
+biosatellite
+bioscientific
+bioscientist
+biosynthesis
+biosynthetic
+biosynthetically
+biosystematic
+biosystematist
+biosystematy
+biota
+biotechnological
+biotechnology
+biotelemetric
+biotelemetry
+biotin
+biotite
+biotitic
+biotope
+biotransformation
+biotron
+biotype
+biotypic
+biovular
+bipack
+biparental
+biparentally
+bipartisanism
+bipartisanship
+bipedal
+biphenyl
+bipinnate
+bipinnately
+bipod
+bipolarity
+bipropellant
+biquadratic
+biracialism
+biradial
+biramous
+birchbark
+birdbrain
+birdbrained
+birdcage
+birdcage's
+birdcages
+birdcall
+birdhouse
+birdieback
+birdieing
+birdlime
+birdman
+birdyback
+bireme
+biretta
+birgitta
+birk
+birkhead
+birkie
+birl
+birler
+birr
+birse
+birthmark
+birthroot
+birthstone
+birthwort
+biscayne
+bisectional
+bisectionally
+bisexuality
+bistort
+bistro
+bistroic
+bistros
+bisulfate
+bisulfide
+bisulfite
+bitartrate
+bitchery
+bitchier
+bitchily
+bitchiness
+bitchy
+bitstock
+bitsy
+bitt
+bitted
+bitterish
+bitterweed
+bitting
+bittock
+bitty
+bituminoid
+bivalent
+biyearly
+biz
+blabber
+blabbered
+blabbering
+blabby
+blackamoor
+blackamoors
+blackcap
+blackcock
+blackdamp
+blackface
+blackfin
+blackfish
+blackfly
+blackguard
+blackguard's
+blackguardism
+blackguardly
+blackguards
+blackhander
+blackhead
+blackheart
+blackish
+blackland
+blackleg
+blackmer
+blackpoll
+blacksnake
+blacktail
+blackthorn
+blacktop
+blacktop's
+blacktops
+blackwash
+blackwater
+bladderlike
+blakey
+blamably
+blameful
+blamefully
+blancmange
+blandish
+blandisher
+blandishment
+blandishments
+blanketflower
+blanketlike
+blanton
+blarney
+blasingame
+blastema
+blastematic
+blastemic
+blastie
+blastment
+blastula
+blastula's
+blastular
+blastulas
+blastulation
+blat
+blate
+blatted
+blatter
+blazonry
+bleachable
+bleakish
+blearily
+blench
+blende
+blether
+blevins
+blimpishly
+blimpishness
+blindfish
+blindworm
+blintz
+blintze
+blipping
+blique
+blistery
+blithesome
+blithesomely
+blizzardy
+blobbing
+blockbuster
+blockbusters
+blockbusting
+blockhead
+blockheads
+blockish
+blockishly
+blondish
+bloodcurdling
+bloodcurdlingly
+bloodfin
+bloodguilt
+bloodguiltiness
+bloodguilty
+bloodily
+bloodletting
+bloodline
+bloodline's
+bloodlines
+bloodmobile
+bloodred
+bloodstock
+bloodstone
+bloodsucker
+bloodsucking
+bloodthirstily
+bloodthirstiness
+bloodthirsty
+bloodworm
+bloodwort
+bloomy
+bloop
+blooper
+bloops
+blossomy
+blotchily
+blotchy
+blotter
+blotty
+blouson
+blowfly
+blowgun
+blowhard
+blowhole
+blowout
+blowpipe
+blowsy
+blowtube
+blowy
+blowzy
+blubbery
+blucher
+bluebeard
+bluebell
+bluebottle
+bluecoat
+bluefin
+blueing
+bluejack
+bluenose
+bluepoint
+bluesman
+bluestem
+bluestone
+bluesy
+bluet
+bluetongue
+blueweed
+bluey
+blume
+blunderbuss
+blurrily
+blushful
+blusterous
+blutwurst
+blyth
+boardlike
+boardman
+boardmanship
+boardroom
+boardsmanship
+boardwalk
+boart
+boatel
+boatels
+boatmanship
+boatsmanship
+boaz
+bobber
+bobbery
+bobbinet
+bobbsey
+bobeche
+bobrow
+bobsledder
+bobstay
+bobtail
+bobtailed
+bocaccio
+bocci
+boccie
+bod
+bodacious
+bodaciously
+bodega
+bodement
+bodenheim
+bodiless
+bodkin
+bodysurf
+bodysurfer
+bodywork
+boehmer
+boehmite
+boer
+boff
+boffin
+boffo
+boffola
+boffos
+bogartian
+bogeyman
+bogeyman's
+boggs
+bogie
+bogle
+boheme
+bohlen
+boies
+boite
+boites
+bola
+boland
+bolas
+bolases
+bole
+bolero
+bolet
+boletus
+boliou
+bollard
+bollix
+bollworm
+bolometric
+bolometrically
+boloney
+boltrope
+bolus
+bombardier
+bombardiers
+bombardon
+bombastically
+bombazine
+bombe
+bombinate
+bombination
+bombshell
+bombsight
+bombus
+bon
+bonbon
+bondable
+bondholder
+bondmaid
+bondman
+bondstone
+bondwoman
+bonefish
+bonehead
+boneheaded
+boneless
+boneset
+bonesetter
+boney
+boneyard
+bonfiglio
+bongoes
+bongoist
+bonham
+bonheur
+bonhomie
+bonkers
+bonne
+bonner
+bonnily
+bonnor
+bonsai
+bonspiel
+bontempo
+bonze
+bonzer
+boobify
+boodle
+booger
+boogerman
+boogeyman
+bookbindery
+bookful
+booklist
+bookmaker
+bookmakers
+bookmaking
+bookman
+bookmark
+bookmark's
+bookmarker
+bookmarkers
+bookmarks
+bookmobile
+bookmobiles
+bookselling
+bookstall
+bookworm
+bookworm's
+bookworms
+booky
+boomier
+boomlet
+boomy
+boondocks
+boondoggle
+boondoggler
+boondoggling
+boonies
+bootee
+bootie
+bootjack
+bootlace
+bootle
+bootless
+bootlessly
+bootlessness
+bootlick
+bootlicker
+bootprint
+boozily
+boozy
+bopper
+bora
+borage
+borak
+borane
+borazon
+bordel
+bordereau
+boreal
+boresight
+boresights
+borglum
+boride
+borland
+borneol
+boronic
+bort
+bosomy
+bosonic
+bosphorus
+bosque
+bosquet
+bossdom
+bossism
+bostitch
+bot
+botan
+botchwork
+botchy
+botel
+botheration
+bots
+bottlecap
+bottlecap's
+bottlecaps
+bottleful
+bottomland
+bottomry
+botulinal
+botulinum
+boucle
+boudoir
+bouffe
+bougainvillaea
+bougainvillea
+bougie
+bouillabaisse
+bouldery
+boule
+boulevardier
+bouleversement
+boulez
+boulle
+bouncily
+bounderish
+bounderishly
+bountiful
+bountifully
+bountifulness
+bourbonism
+bourdon
+bourg
+bourgeoise
+bourgeoisify
+bourgeon
+bourguiba
+bourn
+bourse
+bouse
+bousing
+boustrophedon
+bouton
+boutonniere
+bouvardier
+bouvier
+bouzouki
+bovinity
+bowan
+bowelless
+bowerbird
+bowerbird's
+bowerbirds
+bowery
+bowes
+bowfin
+bowfront
+bowhead
+bowknot
+bowlder
+bowleg
+bowlegged
+bowlful
+bowmen
+bowse
+bowsprit
+bowwow
+bowyer
+boxful
+boxhaul
+boxlike
+boxthorn
+boyar
+boyard
+boyars
+bozo
+bozos
+brabble
+brabbled
+brabbling
+brachial
+brachiate
+bract
+bradded
+bradding
+braggart
+braggest
+braggy
+brahma
+brail
+braillewriter
+braincase
+brainish
+brainless
+brainlessly
+brainlessness
+brainpan
+brainpower
+brainsick
+brainsickly
+brainstem
+brainstem's
+brainstems
+brainteaser
+braise
+braised
+braiser
+braises
+braising
+brakeless
+braky
+branchia
+branchial
+branchiate
+branchless
+branchlet
+branchy
+brandel
+brandin
+brandling
+brank
+branks
+brannon
+brant
+brants
+branum
+braque
+braques
+brassard
+brassbound
+brasserie
+brassica
+brassily
+brattice
+brattiness
+brattish
+brattishing
+brattle
+brattled
+brattling
+bratty
+brava
+bravoes
+braw
+braweling
+brawle
+brawlier
+brawly
+brawnier
+brawnily
+brawniness
+brawny
+brazos
+breadbasket
+breadbaskets
+breadroot
+breadstuff
+breadthways
+breadthwise
+breadwinning
+breakfront
+breakneck
+breakoff
+breakout
+bream
+breams
+breastbone
+breaststroke
+breaststroker
+breathability
+breccia
+breccias
+brecciate
+brecciation
+breechblock
+breechcloth
+breechclout
+breechloader
+breeks
+breezeless
+breezeway
+bregma
+bregmatic
+breviaries
+breviary
+brewage
+briard
+bribable
+bricating
+brickbat
+brickle
+bricktop
+brickwork
+bridewell
+bridgeboard
+bridgeless
+briefless
+brien
+briery
+brigadoon
+brigand
+brigand's
+brigandage
+brigandine
+brigandism
+brigands
+brightwork
+brill
+brilliantine
+brimless
+brimmer
+brinded
+bringdown
+brinkley
+brinksmanship
+brio
+brioche
+briolette
+briquet
+briquette
+brisance
+brisant
+brisket
+brisling
+brist
+bristlecone
+bristlecone's
+bristlecones
+bristlelike
+bristletail
+brit
+broadax
+broadcloth
+broadleaf
+broadminded
+broadsheet
+broadsword
+broadtail
+broadwife
+brocatelle
+brochette
+brockage
+brocket
+brockle
+brocoli
+brogue
+broider
+broidery
+brokenhearted
+brollies
+brolly
+bromate
+bromated
+bromating
+bromegrass
+bromeliad
+bromelin
+bromic
+bromidic
+brominate
+bromination
+bromism
+bromo
+bromos
+bronchialy
+broncobuster
+brontosaur
+brontosaurus
+bronzy
+broomball
+broomballer
+broomcorn
+broome
+broomrape
+broths
+brougham
+broughams
+broun
+brownnose
+brownnoser
+brownout
+brownshirt
+brownstone
+brownstones
+browny
+browsability
+broxodent
+bruit
+brunet
+brushability
+brushback
+brushcut
+brushland
+brushstroke
+brushstroke's
+brushstrokes
+brushup
+brushwood
+brusk
+brusquerie
+brut
+bruxelles
+bruxism
+bryophyta
+bryophyte
+bryozoa
+bs
+bubby
+buccal
+buccaneer
+buccaneer's
+buccaneerish
+buccaneers
+bucer
+buckbean
+buckeroo
+bucketsful
+buckhead
+buckman
+bucko
+buckoes
+bucksaw
+buckshee
+bucktail
+buckthorn
+bucktooth
+bucky
+bucolically
+budder
+buddle
+budgeteer
+budgie
+budlong
+bufferred
+buffi
+buffo
+buffoonery
+buffoonish
+buffos
+bugatti
+bugbear
+bugeye
+buggery
+bughouse
+bugleweed
+bugloss
+bugseed
+builtin
+bulba
+bulbaceous
+bulbar
+bulbil
+bulbous
+bulbously
+bulbul
+bulginess
+bulgur
+bulgy
+bulkily
+bulla
+bullace
+bullae
+bullbaiting
+bullbat
+bulldogger
+bullfight
+bullfighter
+bullfighting
+bullhorn
+bullnecked
+bulloch
+bullock
+bullocky
+bullous
+bullpout
+bullring
+bullrush
+bullrush's
+bullrushes
+bullterrier
+bullwhack
+bullwhip
+bullyrag
+bumbershoot
+bumboat
+bumbry
+bumkin
+bumpier
+bumpily
+bumpiness
+bumpkin
+bumpkin's
+bumpkinish
+bumpkinly
+bumpkins
+bumpy
+bunchily
+bunchy
+bunco
+bund
+bundist
+bundoora
+bundy
+bung
+bunger
+bunghole
+bunglesome
+bunko
+bunkos
+bunkum
+buntline
+buoyance
+burbank
+burbly
+burdock
+bureaucratically
+bureaux
+buret
+burette
+burettes
+burgage
+burgee
+burglarious
+burglariously
+burgonet
+burgoo
+burgoos
+burin
+burking
+burladero
+burle
+burlily
+burlingame
+burnable
+burne
+burnes
+burnoose
+burnous
+burnout
+burrier
+burrstone
+burry
+bursae
+bursal
+bursar
+bursary
+burse
+burseed
+bursty
+burthen
+burweed
+busbies
+busby
+bushbuck
+bushbucks
+bushelage
+bushelman
+bushfire
+bushily
+bushland
+bushland's
+bushman
+businesswoman
+businesswoman's
+businesswomen
+busk
+busker
+buskin
+busload
+busload's
+busloads
+busty
+busybody
+busywork
+butadiene
+butanol
+buteo
+butterfingered
+butterfingers
+butterfish
+butterflyer
+butterless
+butterscotch
+butterweed
+butterwort
+butties
+buttinski
+buttinsky
+buttonball
+buttonbush
+buttonhook
+buttonless
+buttonwood
+buttony
+buttstock
+butty
+butut
+butylate
+butylation
+butylene
+butyraceous
+butyral
+butyraldehyde
+butyric
+bwana
+byelaw
+byelaws
+byinge
+bylot
+byname
+bypast
+byplay
+byre
+bystreet
+cabala
+cabalism
+cabalist
+cabalistic
+caballed
+caballero
+caballing
+cabbala
+cabbie
+cabbies
+cabby
+cabinetmaking
+cabinetwork
+cablegram
+cablegram's
+cablegrams
+cablet
+cableway
+cabman
+caboodle
+caboose
+cabotage
+cabriole
+cabriolet
+cabstand
+cachalot
+cachectic
+cachepot
+cachet
+cachou
+cacodemon
+cacodemonic
+cacogenesis
+cacogenic
+cacogenics
+cacographical
+cacography
+cacophonous
+cacophonously
+cacuminal
+cadastral
+cadastrally
+cadastre
+cadaveric
+cadaverine
+caddie
+caddis
+caddish
+caddishly
+caddishness
+cade
+cadency
+cadential
+cadetship
+caducean
+caduceus
+caducity
+caducous
+caffeinic
+caftan
+cageling
+cagier
+cagily
+caginess
+cagy
+cahier
+caiman
+caisson
+caitiff
+cajolement
+cajolery
+cakewalk
+cakewalker
+calabash
+calaboose
+calamine
+calamint
+calamite
+calamus
+calash
+calcaneal
+calcaneum
+calcaneus
+calcic
+calcific
+calcifuge
+calcifugous
+calcimine
+calcination
+calcine
+calcined
+calcining
+calcinosis
+calcitic
+calcomp
+calculably
+calculatingly
+calculous
+caldera
+caldron
+caleche
+calender
+calenderer
+calendric
+calendrical
+calends
+calendula
+calenture
+calflike
+calif
+caliginous
+caliphal
+calk
+calker
+calla
+callant
+callback
+callboy
+calligraphic
+calligraphically
+calligraphist
+callose
+callosity
+callus
+calluses
+calmative
+calomel
+calorically
+calorific
+calorimetrically
+calory
+calotte
+calque
+caltech
+calthrop
+caltrop
+caltrops
+calumniator
+calumnious
+calumniously
+calypsonian
+calyx
+camarilla
+cambial
+cambium
+cambric
+camelback
+cameleer
+camelia
+camellia
+camelopard
+cameralism
+cameralist
+camise
+camisole
+caml
+camlet
+camomile
+camorra
+camorrista
+camouflageable
+camouflagic
+campanile
+campanologist
+campanology
+campanula
+campanulate
+campcraft
+campership
+camphene
+camphine
+camphor
+camphoraceous
+camphorate
+camphorated
+camphoric
+campily
+campiness
+campion
+campobello
+camporee
+campos
+campstool
+campy
+camshaft
+camshafts
+canalboat
+canaliculate
+canard
+canasta
+cancan
+cancroid
+candela
+candelabra
+candelabrum
+candent
+candescence
+candescent
+candida
+candidature
+candleholder
+candlepin
+candlepins
+candlepower
+candlepowers
+candlesnuffer
+candlewick
+canebrake
+canescent
+caneware
+canful
+canicular
+cankerous
+cankerworm
+canna
+cannel
+cannibalic
+cannily
+cannonade
+cannoneer
+cannonry
+canoeing
+canoeist
+canoeist's
+canoeists
+canoness
+canonicity
+canorous
+canorously
+canorousness
+canst
+cantabile
+cantata
+cantatas
+canterelle
+canthi
+canthus
+cantillate
+cantillation
+cantina
+cantle
+cantles
+cantonal
+cantonment
+cantus
+canty
+canute
+canvaslike
+capelet
+capella
+capeskin
+capet
+capework
+capful
+capias
+capillarity
+capitalistically
+capitan
+capitate
+capitates
+capitation
+capitular
+capitulary
+capitulum
+capo
+capon
+caporal
+capper
+cappers
+cappy
+capriccio
+caprification
+caprine
+capriole
+capsular
+capsulate
+capsulated
+capt
+captainship
+captan
+captionless
+captivator
+capuchin
+capybara
+carabao
+carabid
+carabineer
+carabiner
+carabinero
+carabinier
+carabiniere
+caracole
+carafe
+carapace
+carapace's
+carapaces
+carat
+caravanner
+caravansary
+caravel
+carbarn
+carbaryl
+carbazole
+carbolated
+carboline
+carboniferous
+carbonium
+carbonless
+carbonous
+carbonylic
+carboxy
+carboxyl
+carboxylate
+carboxylation
+carboxylic
+carbuncular
+carburet
+carburetion
+carburetor
+carburetors
+carcase
+carcinogenesis
+carcinogenicity
+carcinoid
+cardamom
+cardialgia
+cardigan
+cardigan's
+cardigans
+cardinalship
+cardiogram
+cardiogram's
+cardiograms
+cardiograph
+cardiographer
+cardiographic
+cardiographs
+cardiography
+cardioid
+cardioid's
+cardioids
+cardiological
+cardiologist
+cardiopathy
+cardiopulmonary
+cardiorespiratory
+cardiotonic
+cardiovasculatory
+cardplayer
+cardsharp
+cardsharper
+careerist
+careerists
+carefuller
+carefullest
+carfare
+carful
+carhop
+caribe
+caricatural
+carioca
+cariole
+carious
+carle
+carling
+carlsbad
+carmaker
+carnallite
+carne
+carnelian
+carney
+carnivore
+caroche
+carom
+carotene
+carousal
+carousel
+carousel's
+carousels
+carpal
+carpellary
+carpetbag
+carpetbag's
+carpetbagged
+carpetbagger
+carpetbagger's
+carpetbaggers
+carpetbaggery
+carpetbagging
+carpetbags
+carpi
+carpospore
+carposporic
+carpus
+carrefour
+carriageway
+carriageways
+carriole
+carronade
+carroty
+carrousel
+carryall
+carryon
+carryout
+carsick
+cartage
+cartel
+cartilaginous
+cartload
+cartloads
+cartogram
+cartogram's
+cartograms
+cartographical
+cartomancy
+cartop
+carty
+caruncular
+carunculate
+carunculated
+casa
+casaba
+casaba's
+casabas
+cascara
+caseate
+caseation
+casebearer
+casemate
+caseous
+casern
+caserne
+cashable
+cashbook
+cashless
+casque
+cassaba
+cassava
+cassino
+cassite
+castaway
+casteism
+castigator
+castigators
+castoff
+castoffs
+castrate
+castrated
+castrater
+castraters
+castrates
+castrating
+castration
+castrato
+castrator
+castrators
+castratory
+casuistic
+casuistical
+casuistry
+catabolic
+catabolically
+catabolism
+catabolite
+catachresis
+catachresti
+catachrestic
+catachrestical
+cataclysm
+cataclysmal
+catacomb
+catacombic
+catadromous
+catafalque
+catalatic
+catalectic
+catalepsy
+cataleptic
+cataleptically
+catalpa
+catamaran
+catamount
+cataplasm
+cataplastic
+cataplexy
+cataractal
+catarrh
+catarrhal
+catarrhally
+catastasis
+catatonic
+catawba
+catboat
+catcall
+catchall
+catchee
+catchment
+catchpenny
+catchpole
+catchpoll
+catchup
+cate
+catechesis
+catechetical
+catechin
+catechismal
+catechist
+catechistic
+catena
+catenary
+catenulate
+cateran
+catercorner
+cateress
+caterwaul
+cates
+catface
+catfacing
+catgut
+catharses
+cathartic
+cathead
+cathect
+cathectic
+cathedra
+cathexes
+cathexis
+cathodically
+catholically
+catholicate
+catholicity
+cathouse
+cation
+cationic
+cationically
+cations
+catkin
+catnap
+catnaps
+catoptric
+catoptrically
+catoptrics
+catted
+cattily
+catting
+caudal
+caudally
+caudate
+caudated
+caudation
+caudillo
+caudle
+caul
+cauldron
+cauldrons
+caulescent
+caulicle
+caulicles
+cauline
+causeless
+causerie
+causey
+causeys
+caustically
+causticity
+cautery
+cavalierism
+cavalryman
+cavernicolous
+caviare
+cavies
+cavitary
+cavitate
+cavitation
+cay
+cayman
+cc
+ceasefire
+ceasefire's
+cedarn
+cedarwood
+ceil
+ceilometer
+ceilometer's
+ceilometers
+ceinture
+celandine
+celebrator
+celebrators
+celeriac
+celiac
+celibacy
+cellarage
+cellarages
+cellaret
+cellarets
+cellarette
+cellarettes
+cellularity
+cellule
+celluloid
+celluloid's
+cellulosic
+cementation
+cementite
+cementitious
+cenobite
+cenobitic
+cenobitical
+cenogenetic
+cenogenetically
+cenospecies
+cenotaph
+cense
+censer
+censing
+censorious
+censoriously
+censoriousness
+censurable
+cental
+centare
+centaurea
+centaury
+centavo
+centenarian
+centesimal
+centesimo
+centiare
+centillion
+centime
+centimo
+centner
+cento
+centones
+centra
+centrale
+centralism
+centralist
+centralistic
+centralists
+centric
+centrically
+centricity
+centriole
+centrism
+centroidal
+centromere
+centromeric
+centrosome
+centrosomic
+centrosphere
+centrosymmetric
+centrum
+centum
+centurion
+cephalad
+cephalic
+cephalically
+cephalometric
+cephalometry
+cepstrum
+ceraceous
+ceramicist
+ceramist
+ceramium
+cere
+cerebellar
+cerebroside
+cerebrosides
+cerebrovascular
+cerebrum
+cerement
+ceremonialism
+ceremonialist
+ceremonialists
+ceres
+cereus
+cering
+cernuous
+certes
+certifiably
+certificatory
+cerumen
+ceruminous
+ceruse
+cervices
+cervine
+cervix
+cervixes
+cesarean
+cesarian
+cesspit
+cesspool
+cesta
+cesti
+cetacean
+cetacean's
+cetaceans
+cf
+chaffey
+chaffy
+chainomatic
+chalcedonic
+chalcedony
+chalcid
+chalcocite
+chaldron
+chalet
+chalkboard
+chalone
+chambray
+chambrays
+chameleon
+chameleonic
+chameleons
+chamfron
+chamfrons
+chammy
+chamoix
+chamomile
+champak
+champertous
+champerty
+champlainian
+chanceful
+chancel
+chancellery
+chancellorship
+chancellorships
+chancellory
+chancels
+chancre
+chancres
+chancroid
+chancroidal
+chancrous
+chandelle
+chandler
+chandlery
+changeful
+changefully
+changefulness
+changeless
+changelessly
+changelessness
+changeling
+channing
+chanson
+chanteuse
+chanteuses
+chantier
+chanties
+chanty
+chaotically
+chapati
+chapbook
+chape
+chapeau
+chapeaus
+chapeaux
+chapelles
+chaperonage
+chapfallen
+chapiter
+chaplaincies
+chaplaincy
+chaplet
+chapleted
+chaplets
+chaplinesque
+charabanc
+characin
+characterful
+characterless
+characterological
+characterologically
+charactery
+charade
+charades
+charcuterie
+chard
+chare
+charier
+charily
+chariness
+charioteer
+charioteers
+charism
+charismata
+charisms
+charlatan
+charlatanism
+charlatanry
+charmless
+charnel
+charnock
+charring
+chartularies
+chartulary
+charwoman
+chary
+chassepot
+chasseur
+chasten
+chastened
+chastener
+chastening
+chateaubriand
+chatelain
+chatelaine
+chatelaines
+chatelains
+chatoyance
+chatoyancy
+chatoyant
+chattahoochee
+chatterbox
+chatterboxes
+chattily
+chauffers
+chaussure
+chaussures
+chauvinistically
+cheapie
+cheapish
+cheapishly
+cheapskate
+cheapskates
+checkerberry
+checkless
+checkmark
+checkmarks
+checkmate
+checkmated
+checkmates
+checkmating
+checkoff
+checkrein
+checkroom
+checkrooms
+checkrow
+cheddar
+cheekful
+cheekily
+cheep
+cheeps
+cheerio
+cheeseburger
+cheeseburgers
+cheesecake
+cheesecake's
+cheesecakes
+cheesecloths
+cheesemaker
+cheesemakers
+cheesemaking
+cheeseparer
+cheeseparing
+cheeseparings
+cheetahs
+chefdom
+chekhov
+chelatable
+chelonian
+chemiluminescence
+chemiluminescent
+chemische
+chemism
+chemisorb
+chemisorption
+chemoautotrophic
+chemoautotrophically
+chemoautotrophy
+chemoprophylaxis
+chemoreception
+chemoreceptive
+chemoreceptivity
+chemoreceptor
+chemoreceptors
+cheng
+chenille
+cherishable
+cheroot
+cherrylike
+cherrystone
+chert
+cherubic
+cherubically
+cherublike
+chervil
+chervils
+chessboard
+chessboards
+chessman
+chessmen
+chestful
+chestier
+chesty
+cheveron
+cheviot
+chevrotain
+chewable
+chewy
+chi
+chiaroscurist
+chiaroscuro
+chiasma
+chiasmatic
+chiasmus
+chiaus
+chicalote
+chicaning
+chichi
+chickasaws
+chickenhearted
+chickpea
+chickpea's
+chickpeas
+chickweed
+chickweeds
+chicle
+chicos
+chidden
+chieftaincies
+chieftaincy
+chieftainship
+chiffonier
+chignon
+childbed
+childbirths
+chilies
+chillily
+chimaera
+chimere
+chimerical
+chimerically
+chimerism
+chimneypiece
+chimp
+chimps
+chinaware
+chinbone
+chinch
+chine
+chines
+chinoiserie
+chinos
+chinquapin
+chintzier
+chintzy
+chirographer
+chirographic
+chirographical
+chirography
+chiromancer
+chiromancy
+chiropodist
+chiropodists
+chiropody
+chiropractic
+chiropter
+chiropteran
+chirpily
+chirpy
+chirrup
+chirruped
+chirruping
+chirrups
+chit
+chitchat
+chitin
+chitinous
+chitlings
+chiton
+chits
+chitter
+chittered
+chittering
+chitterlings
+chitters
+chivalric
+chivied
+chivvied
+chivvy
+chivvying
+chivy
+chloral
+chlordane
+chloric
+chlorinity
+chlorite
+chloritic
+chlorobenzene
+chlorohydrin
+chlorophyllose
+chlorophyllous
+chloroplatinate
+chockablock
+chocolaty
+choirboy
+choky
+choler
+choleraic
+choleric
+choline
+cholinergic
+chondrite
+choosey
+chopfallen
+chophouse
+choppily
+chopstick
+chopsticks
+choreman
+choreographically
+choric
+chorically
+chorine
+chorister
+chorizo
+chorographic
+chorography
+choryza
+chowderhead
+chowderheaded
+chowhound
+chowtime
+chrestomathy
+christsake
+chromatically
+chromaticism
+chromaticity
+chromatid
+chromatin
+chromatographically
+chromatolytic
+chromide
+chrominance
+chromo
+chromosomal
+chromosome
+chromosome's
+chromosomes
+chromosomic
+chromospheric
+chronical
+chronicity
+chronogram
+chronogram's
+chronogrammatic
+chronogrammatical
+chronograms
+chronographic
+chronographs
+chronologer
+chronologers
+chronologic
+chronologist
+chronologists
+chronometer
+chronometer's
+chronometers
+chronometric
+chronometrical
+chronometrically
+chronometry
+chronoscope
+chronoscopes
+chrysolite
+chubbily
+chuckhole
+chucklehead
+chuckleheaded
+chuckleheads
+chucklesome
+chuckwalla
+chuff
+chuffed
+chuffier
+chuffing
+chuffy
+chugalug
+chugger
+chummily
+chumship
+chunkily
+churchgoer
+churchianity
+churchless
+churchmanship
+churchy
+churlish
+churlishly
+churlishness
+chutist
+chutists
+chutzpa
+chutzpah
+cigarillo
+cigarillos
+ciliary
+cincture
+cindery
+cinemagoer
+cinemagoers
+cinematically
+cinematograph
+cinematographer
+cinematographic
+cinematographical
+cinematographically
+cinematography
+cinquefoil
+ciphertext
+ciphony
+circadian
+circinate
+circinately
+circuital
+circuity
+circulatable
+circulator
+circulators
+circumambient
+circumambiently
+circumambulate
+circumambulates
+circumcircle
+circumfluent
+circumfluous
+circumfuse
+circumfused
+circumfuses
+circumfusing
+circumfusion
+circumfusions
+circumjacent
+circumlocutory
+circumlunar
+circumnavigate
+circumnavigated
+circumnavigates
+circumnavigating
+circumnavigation
+circumnavigations
+circumnavigator
+circumnavigators
+circumscissile
+circumscription
+circumstantiality
+circumstantiate
+circumstantiated
+circumstantiates
+circumstantiating
+circumvallate
+circumvallated
+circumvallates
+circumvallating
+circumvallation
+circumvallations
+circumvolution
+circumvolutions
+circusy
+cirque
+cirques
+cirrhoses
+cirrhosis
+cirrhotic
+cirrous
+cirrus
+cislunar
+cist
+cit
+citable
+citational
+citified
+citify
+citizeness
+citral
+citronella
+civically
+civie
+civies
+civilists
+civvy
+clabber
+clack
+clacker
+clackers
+clacks
+cladophora
+clamant
+clamantly
+clambake
+clambakes
+clammily
+clamorist
+clamorist's
+clamorists
+clampdown
+clangorous
+clangorously
+clansman
+clansmen
+clapper
+clappers
+claptrap
+claque
+claques
+clarinetist
+clarinettist
+clarridge
+classicalism
+classicalist
+classicality
+classicism
+classicistic
+classificatorily
+clausal
+claustral
+clavichord
+clavichordist
+clavicular
+clavier
+clavierist
+clavieristic
+claybank
+clayey
+clayish
+clayware
+cleanable
+cleanhanded
+clearable
+clef
+clef's
+clefs
+clemens
+clemente
+clepe
+cleped
+clepes
+cleping
+clericalism
+clericalist
+clerkship
+cleverish
+clevis
+clientage
+cliental
+cliffhanger
+cliffy
+climacteric
+climactically
+climatologist
+climatologists
+climbable
+cline
+clines
+clingy
+clinometric
+clinometry
+clipsheet
+cliquey
+cliquish
+cliquishly
+cliquishness
+clitoral
+clitoric
+clitoris
+cloaca
+cloacal
+cloche
+clocklike
+cloddy
+clodhopping
+cloistral
+cloistress
+clonal
+clonally
+clonic
+clonicity
+clonk
+clonked
+clonking
+clonks
+clop
+clopped
+clopping
+clops
+closable
+closeable
+closefisted
+closemouthed
+closeout
+closetful
+clotheshorse
+clothespin
+clothespress
+cloths
+cloudily
+cloudland
+cloudlet
+cloudlets
+cloven
+cloverleaf
+cloverleaves
+clownery
+clownish
+clownishly
+clownishness
+clubable
+clubbable
+clubber
+clubbier
+clubbiness
+clubby
+clubfoot
+clubfooted
+clueing
+clumpy
+clunk
+clunked
+clunker
+clunking
+clunks
+clustery
+clutchy
+coact
+coaction
+coactive
+coadapted
+coadjutrices
+coadjutrix
+coadunate
+coadunated
+coadunates
+coadunating
+coadunation
+coagulability
+coagulant
+coagulants
+coagulase
+coalification
+coalify
+coalitionist
+coapt
+coaptation
+coaptation's
+coapted
+coapting
+coapts
+coarctate
+coarctation
+coarticulation
+coarticulatory
+coastguard
+coastguardman
+coastguardsman
+coastland
+coastward
+coastwards
+coastwise
+coatrack
+coatroom
+cob
+cob's
+cobaltic
+cobby
+cobelligerent
+cobia
+cobs
+cobwebbed
+cobwebby
+coca
+cocainism
+cocci
+coccidiosis
+cochairman
+cochairmen
+cochise
+cockade
+cockaded
+cockamamie
+cockatrice
+cockerel
+cockfight
+cockfight's
+cockfighting
+cockfights
+cockhorse
+cockily
+cockney
+cockneyish
+cockneyism
+cockneys
+cockshy
+coco
+coconscious
+coconsciousness
+coconspirator
+coconspirators
+cocos
+cocurricular
+codable
+codeclination
+codefendant
+codeine
+codeless
+codeposit
+codetermination
+codex
+codger
+codices
+codicillary
+codifiability
+codling
+codomain
+codominant
+codon
+codpiece
+codpieces
+coeducational
+coeducationally
+coenzyme
+coequality
+coercivity
+coeternal
+coeternally
+coeternity
+coeval
+coevality
+coevolution
+cofeature
+coffeehouse
+coffle
+coffles
+cofunction
+cogency
+cogged
+cogging
+cogitable
+cogito
+cognitional
+cognitivity
+cognomen
+cognoscenti
+cogwheel
+cogwheels
+cohabitant
+cohabitants
+coheir
+coheiress
+cohesionless
+coho
+cohomology
+cohosh
+coidentity
+coif
+coiffeur
+coiffeuse
+coiffing
+coign
+coilability
+coinsurance
+coinsure
+coinsurer
+coition
+coitional
+col
+colasanto
+coldblood
+coldhearted
+coldheartedly
+coldheartedness
+coldish
+coleslaw
+coli
+colic
+colitis
+coll
+collaborationism
+collaborationist
+collaborationists
+collage
+collages
+collagist
+collagists
+collarless
+collaterality
+colleagueship
+colleaguesmanship
+collectable
+collectivism
+collectivist
+collectivistic
+collectivistically
+collectivists
+collectivity
+collectorate
+collectorates
+collectorship
+collegial
+collegiality
+collegially
+collegium
+collet
+collieries
+colliery
+colligate
+colligation
+colligative
+collimator
+collisional
+collisionally
+collocate
+collocates
+collocational
+collodion
+collogue
+collogued
+colloguing
+colloq
+colloquiality
+colloquist
+colloquoy
+colloquy
+collusive
+collusively
+colluvial
+colly
+colog
+cologarithm
+colonelcy
+colonialistic
+colonic
+colophon
+colophony
+colossi
+colossus
+colossuses
+colostomy
+colostral
+colostrum
+coltsfoot
+columbine
+columniation
+columnistic
+colza
+com
+comae
+comaker
+combinability
+combinate
+combinative
+combinatory
+comblike
+combust
+combuster
+combustibility
+combustibly
+combusting
+combustive
+combustor
+combustors
+comedie
+comedienne
+comediennes
+comedown
+cometic
+comfier
+comfit
+comfits
+comfortless
+comfy
+comicality
+comique
+comity
+commandable
+commandership
+commandery
+commemorator
+commemorators
+commendably
+commensal
+commensalism
+commensally
+commensurability
+commensurably
+commentate
+commentates
+commercialist
+commercialistic
+commie
+commination
+comminatory
+comminute
+comminuted
+comminution
+commissar
+commissariat
+commissionaire
+commissionership
+commissural
+commissure
+commix
+commixture
+commode
+commodes
+commonage
+commonalty
+commonsense
+commonsensible
+commonsensibly
+commonsensical
+commonweal
+commove
+commoved
+commoves
+commoving
+communalism
+communalist
+communalists
+communalities
+communality
+communard
+communards
+communese
+communicability
+communicableness
+communicably
+communicatee
+communicatory
+communistically
+communitarian
+communitarianism
+commutator
+commutators
+comoving
+compactible
+compactify
+companionably
+companionate
+companionway
+companionways
+comparatist
+comparativist
+compart
+compartmental
+compartmentation
+compartmentations
+compassable
+compassionless
+compatability
+compatriotic
+compeer
+compellation
+compeller
+compend
+compendious
+compendiously
+compendiousness
+compensability
+compensational
+compensator
+compensators
+compere
+compered
+compering
+competitory
+complacence
+compleat
+complected
+complemental
+complementarily
+comples
+complexation
+complexional
+complexometric
+complexometry
+compliancy
+complicacy
+complice
+complimentarily
+compline
+complot
+compo
+componential
+componentry
+compos
+compoundable
+comprehendible
+comprehensibly
+compressional
+comprisable
+comprisal
+comprisals
+comptrollership
+compulsorily
+compunctious
+compurgation
+compurgations
+compurgator
+computerite
+computerlike
+computernik
+comradery
+comsat
+comsummatively
+concavity
+concealable
+conceivability
+conceivableness
+concentrically
+concentricity
+conceptacle
+conceptional
+conceptualism
+conceptualist
+conceptualistic
+conceptualistically
+conceptus
+concernment
+concertante
+concertgoer
+concerti
+concertmeister
+concessional
+concessionary
+concessive
+concessively
+conciliar
+conciliarly
+concinnity
+concoction
+concomitance
+concordat
+concorde
+concrescence
+concrescences
+concrescent
+concretionary
+concretism
+concretist
+concretistic
+concubinage
+concupiscence
+concupiscent
+concupiscible
+concuss
+concussed
+concusses
+concussing
+concussive
+concussively
+condemnable
+condemnor
+condensable
+condensational
+condescendence
+condign
+condignly
+condimental
+conditionable
+conditionality
+condolatory
+condole
+condoled
+condoling
+condom
+condominial
+condonable
+condonation
+condor
+conductibility
+conductible
+conductimetric
+conductometric
+conductorial
+conductress
+conduplicate
+conduplication
+confab
+confabbed
+confabbing
+confabulator
+confabulatory
+confection
+confectionary
+confectioner
+confectioners
+confections
+confederal
+confederalist
+confederalists
+conferential
+conferment
+conferments
+conferral
+conferrals
+confessable
+confessionalism
+confessionalist
+confetti
+confidante
+confidantes
+configural
+configurate
+configurated
+configurates
+configurating
+configurational
+configurationally
+configurative
+confirmability
+confirmable
+confirmational
+confiscable
+confiscatable
+confiscator
+confiscators
+conflagrant
+conflagrate
+conflagrated
+conflagrates
+conflagrator
+conflagrators
+conflagratory
+conflate
+conflated
+conflates
+conflating
+conflation
+conflations
+conflatrate
+conflatrating
+conflictful
+confliction
+conflictions
+conflictless
+conflictual
+confluence
+confluences
+conflux
+confluxes
+confocal
+conformable
+conformably
+conformism
+confraternities
+confraternity
+confrere
+confreres
+confrontal
+confrontationism
+confrontationist
+confusional
+confutation
+confutations
+confutative
+confutator
+confutators
+cong
+conga
+congealment
+congelation
+congelations
+congener
+conger
+congeries
+conglomeratic
+conglomerator
+conglutinate
+conglutinated
+conglutinates
+conglutinating
+conglutination
+congratulator
+congregant
+congregational
+congregator
+congretants
+congruency
+conicity
+conjugacy
+conjugality
+conjugant
+conjugants
+conjugational
+conjugationally
+conjunctional
+conjunctionally
+conjunctiva
+conjunctival
+conjunctivitis
+conjuration
+conjurations
+conjuror
+connate
+connately
+connatural
+connaturality
+connaturally
+connectable
+connectible
+connectional
+connelly
+conniption
+connivent
+connivery
+connoisseurship
+connotational
+connubialism
+connubiality
+conscienceless
+conscribe
+conscribed
+conscribes
+conscribing
+consecrator
+consecratory
+consecution
+consentaneous
+consentaneously
+conservancy
+conservational
+conservatorial
+consignable
+consignation
+consignee
+consignment
+consignor
+consistorial
+consistory
+consociate
+consociation
+consociational
+consol
+consolatory
+consolette
+consolidator
+consolidators
+consols
+consonancy
+conspecific
+conspectus
+conspectuses
+conspicuity
+conspiration
+conspirational
+conspirations
+constabulary
+constellate
+constellatory
+constipate
+constipated
+constipates
+constipating
+constipation
+constitutionalism
+constitutionalist
+constitutionless
+constringe
+constringed
+constringent
+constringes
+constringing
+construable
+construal
+constructionist
+constructivism
+constructivist
+consubstantial
+consubstantiate
+consubstantiation
+consuetude
+consuetudinary
+consulship
+consultancies
+consultancy
+consultantship
+consultor
+consumerism
+consumerist
+consumership
+consummator
+consummatory
+contagium
+containerboard
+contaminator
+contemplator
+contemporaneity
+contemporarily
+contemptibly
+contendere
+conterminous
+conterminously
+contestation
+contexture
+contingence
+continua
+continuate
+continuated
+continuates
+continuating
+continuative
+continuatively
+continuator
+continuo
+contortionist
+contortionistic
+contortionists
+contrabandist
+contrabassist
+contrabassoon
+contractibility
+contractible
+contractile
+contractility
+contractional
+contracture
+contradictable
+contradictious
+contradictor
+contradistinct
+contradistinctive
+contradistinctively
+contradistinguish
+contrail
+contralateral
+contralto
+contraoctave
+contraposition
+contrapuntal
+contrapuntally
+contrapuntist
+contrarieties
+contrariety
+contrarious
+contrariwise
+contrastable
+contrasty
+contravariant
+contretemps
+controllership
+controllerships
+controlment
+controlments
+controversialism
+controversialist
+controvert
+controverted
+controverter
+controverting
+controverts
+contumacious
+contumaciously
+contumelious
+contumeliously
+contuse
+contused
+contuses
+contusing
+conurbation
+conurbations
+convect
+convected
+convecting
+convectional
+convective
+convector
+convectors
+convects
+conveniency
+conventicle
+conventicler
+conventionalism
+conventionalist
+conventioneer
+conventual
+conventually
+convergency
+conversable
+conversance
+conversancy
+conversional
+convertibly
+convertiplane
+convertor
+conviviality
+convocate
+convocational
+convolutional
+convulsant
+convulsionary
+cony
+cooch
+cookout
+cookouts
+cookshack
+cookshop
+cookware
+coolish
+coomb
+coombs
+coonskin
+cooperage
+cooperationist
+coot
+cootie
+copacetic
+coparcenary
+coparcener
+copartner
+copartnership
+copeck
+copemate
+copesetic
+copesmate
+copestone
+copilot
+coplanarity
+copliots
+copperas
+copperplate
+coppice
+copping
+copra
+coprinus
+coprocessor
+coprocessor's
+coprocessors
+coproduct
+coproduct's
+coproducts
+coprolite
+coprolitic
+copula
+copulas
+copulate
+copulated
+copulates
+copulating
+copulation
+copulative
+copulatively
+copulatory
+copyboy
+copycat
+copycats
+copycatted
+copycatting
+copydesk
+copyhold
+copyholder
+copyreader
+coquet
+coquetry
+coquettish
+coquettishly
+coquettishness
+coquina
+coralberry
+coralline
+corbel
+cordate
+cordately
+cordiality
+cordiform
+cordless
+cordwain
+cordwainer
+cordwainery
+cordwood
+corecipient
+corelate
+corelation
+coreligionist
+corequisite
+corespondent
+corkboard
+corkboards
+corkier
+corky
+cornball
+corncob
+corncrib
+corneal
+corneous
+cornerman
+cornerways
+cornerwise
+cornetist
+cornettist
+cornhusking
+cornice
+corniced
+cornices
+corniche
+cornicing
+cornification
+cornily
+cornstalk
+cornucopian
+cornwallis
+corolla
+corollate
+coronagraph
+coronograph
+corpocracies
+corpocracy
+corpora
+corporality
+corporatism
+corporatist
+corporativism
+corporator
+corporeity
+corporis
+corposant
+corpulencies
+corpulency
+corpuscle
+corpuscle's
+corpuscles
+corpusculated
+corpuscule
+corpuscules
+corrade
+corraded
+corrading
+corrasion
+corrasions
+corrasive
+correctional
+correctitude
+correlatable
+correlational
+correspondency
+corresponsive
+corrigenda
+corrigibility
+corrigibly
+corroborant
+corroborator
+corroborators
+corroboratory
+corroboree
+corruptibility
+corruptibly
+corruptionist
+corsair
+corse
+corsica
+corsican
+cortege
+corteges
+corticate
+corticated
+cortices
+corticoid
+corvallis
+cos
+cosec
+coset
+cosh
+cosher
+cosigner
+cosmetician
+cosmeticians
+cosmetologist
+cosmetologists
+cosmetology
+cosmo
+cosmochemical
+cosmochemistry
+cosmogenic
+cosmogonic
+cosmogonical
+cosmogonist
+cosmogony
+cosmographer
+cosmographic
+cosmographical
+cosmographically
+cosmography
+cosmologic
+cosmonaut
+cosmopolite
+cosmopolitism
+cosponsorship
+cosset
+cosseted
+cosseting
+cossets
+costa
+costal
+costless
+costlessly
+costmary
+costumery
+costumey
+costumier
+cote
+coterie
+coteries
+cotillon
+cotman
+cotoneaster
+cotta
+cottagey
+cottontail
+cottontail's
+cottontails
+cotty
+couldst
+councilmanic
+countability
+countdown
+countdown's
+countdowns
+counteraction
+counterblow
+counterchallenge
+counterchange
+countercheck
+countercurrent
+countercurrently
+counterespionage
+counterfoil
+counterintelligence
+counterirritant
+countermarch
+countermove
+countermovement
+counteroffensive
+counteroffer
+counterpane
+counterplan
+counterplea
+counterplot
+counterpose
+counterposed
+counterposes
+counterposing
+counterpunch
+counterpuncher
+counterreformation
+counterrevolutionaries
+counterrevolutionary
+counterrevolutionary's
+counterrevolutionist
+countershaft
+countershafts
+countersign
+countersignature
+counterspy
+counterstatement
+countertenor
+countertenors
+counterterrorism
+counterterrorist
+counterthreat
+counterthreat's
+counterthreats
+countertrend
+counterview
+countryfied
+countryish
+countryseat
+countrywoman
+countywide
+coupal
+couplement
+courtmartial
+couscous
+cousinage
+cousinhood
+cousinship
+couth
+couture
+couturier
+couturiere
+covalence
+covalency
+covenantal
+covenantee
+covenantor
+covent
+coventry
+coverless
+coverture
+covertures
+covetable
+covey
+coveys
+cowage
+cowbane
+cowcatcher
+cowman
+cowmen
+cowpea
+cowry
+cox
+coypu
+cozily
+cpr
+crabber
+crabbier
+crabby
+crabwise
+crackajack
+crackdown
+crackerjack
+craftily
+craftsmanlike
+craftsperson
+craftswoman
+craftswomen
+cragged
+craggily
+cragsman
+crammer
+crampon
+crampon's
+crampons
+craneman
+cranemen
+cranial
+cranially
+craniate
+crape
+crapper
+crapping
+crappy
+crapshooter
+crapulous
+crashworthiness
+crashworthy
+crassitude
+craterlet
+crayonist
+creakily
+creamily
+creaseless
+creatural
+creaturehood
+creche
+creches
+creditability
+cree
+creepage
+creese
+creighton
+crematorium
+crenate
+crenated
+crenately
+crenation
+crenelle
+crenulate
+crenulated
+crenulation
+creosol
+creosote
+crepey
+crepitant
+crepitate
+crepitation
+crepuscle
+crepuscular
+crepuscule
+crepy
+crescentic
+crescive
+crescively
+cresol
+cresset
+crestal
+crestless
+cretinism
+cretonne
+crevasse
+crewelwork
+crewless
+crewmember
+crewmembers
+cribbage
+cribbage's
+cribber
+cribriform
+crick
+criminate
+criminating
+crimination
+criminological
+criminologically
+criminologist
+criminology
+criminous
+crimpier
+crimpy
+crinoid
+crinoline
+crispier
+crispiness
+crispy
+criticaster
+croaky
+croatian
+crocket
+crocketed
+crocodilian
+croissant
+croissants
+cronyism
+crookback
+crookbacked
+cropland
+cropland's
+croplands
+croquet
+croquette
+crore
+crossability
+crossbearer
+crossbill
+crossbones
+crossbow
+crossbowman
+crossbred
+crossbreed
+crosscurrent
+crosscurrents
+crosscut
+crosslet
+crosslink
+crosslink's
+crosslinks
+crosspatch
+crosspiece
+crosstown
+crosstree
+crosswind
+crotchet
+crotcheted
+crotcheting
+crotchets
+croton
+croup
+croupous
+croupy
+crouse
+crouton
+crowberry
+crowfeet
+crowkeeper
+crownet
+cruciate
+cruciately
+crucifer
+cruciferous
+cruciform
+cruciformly
+crudded
+crudding
+crueller
+cruellest
+cruet
+cruller
+crumbier
+crumby
+crumpet
+crupper
+crustacea
+crustaceous
+crustal
+crustier
+crustification
+crustily
+crustiness
+crustose
+crusty
+crybaby
+crymotherapy
+cryobiological
+cryobiologically
+cryobiologist
+cryobiologists
+cryobiology
+cryogen
+cryogenically
+cryogeny
+cryolite
+cryonic
+cryonics
+cryophilic
+cryoscope
+cryoscopic
+cryoscopy
+cryosurgery
+cryotherapy
+cryotron
+cryptal
+cryptical
+cryptically
+crypto
+cryptogenic
+cryptogrammic
+cryptograph
+cryptographically
+cryptos
+cryst
+cubage
+cubature
+cubbies
+cubby
+cubical
+cubically
+cubicle
+cubiform
+cubistic
+cubit
+cuboid
+cuboidal
+cuckold
+cuckoldry
+cucullate
+cucullated
+cucullates
+cucurbit
+cuddleback
+cuddlesome
+cuddy
+cueing
+cuffless
+cuke
+culation
+cullender
+culminant
+culotte
+culottes
+culpably
+cultch
+cultic
+cultigen
+cultism
+cultivability
+cultivar
+cultivars
+cultivatable
+cumbrous
+cumbrously
+cumbrousness
+cumulous
+cunctation
+cunctative
+cuneate
+cuneately
+cuneiform
+cunner
+cunnilinctus
+cunnilingus
+cunt
+cupbearer
+cupcake
+cuplike
+cupola
+cuppier
+cuppy
+cupreous
+cupriferous
+cuprite
+cupsful
+cupular
+cupulate
+cupule
+curability
+curatorial
+curatorship
+curbstone
+cureless
+curet
+curettage
+curette
+curetted
+curettement
+curetting
+curite
+curium
+curlew
+curmudgeon
+curmudgeonly
+curricle
+currie
+curriery
+currish
+currishly
+cursorial
+curst
+curtailment
+curtal
+curtesy
+curtilage
+curule
+curvacious
+curveball
+curvilineal
+curvy
+cushily
+cushionless
+cushiony
+cuspate
+cuspated
+cuspid
+cuspidate
+cuspidated
+cuspidation
+cuspidor
+cussword
+cusswords
+custodianship
+custodianships
+customshouse
+cutability
+cutaround
+cutaway
+cutch
+cutesy
+cutey
+cuteys
+cuticle
+cuticles
+cuticular
+cutie
+cutler
+cutlery
+cutline
+cutover
+cutpurse
+cutset
+cuttable
+cutup
+cutups
+cutwater
+cutwork
+cybernated
+cybernation
+cybernetical
+cybernetically
+cybernetician
+cyberneticist
+cyborg
+cycad
+cyclamate
+cyclitol
+cyclo
+cycloaddition
+cyclometer
+cyclometer's
+cyclometers
+cyclonic
+cyclonically
+cyclorama
+cyclos
+cyclotomic
+cyclotron
+cygnet
+cygnet's
+cygnets
+cymbalist
+cymbalists
+cynosure
+cypher
+cyphers
+cystamine
+cysteine
+cystic
+cytaster
+cytokinin
+cytologic
+cytological
+cytologically
+cytologist
+cytolysin
+cytolytic
+cytopathogenicity
+cytophilic
+cytoplasmic
+cytoplasmically
+cytosine
+cytostatic
+cytostatically
+cytotoxicity
+cytotoxin
+cytotropic
+dabber
+dabbers
+dachshunde
+dactylus
+daedal
+daff
+daft
+dafter
+daftest
+daftly
+daftness
+daggerman
+daguerreotype
+daguerreotype's
+daguerreotypes
+daguerreotypic
+daguerreotypy
+dahlia
+dahlias
+daimon
+daimones
+daimonic
+daimons
+daiquiri
+daiquiris
+dairymaid
+daishiki
+dali
+dalliance
+dalloway
+dallyes
+dalmatian
+dalmatians
+dalmatic
+damnable
+damnableness
+damnably
+damnatory
+damndest
+damnify
+dampish
+damselflies
+damselfly
+danceability
+danceable
+dander
+dandiacal
+dandiacally
+dandification
+dandify
+dandle
+dandled
+dandling
+dandruff
+dandruffy
+dandyish
+dandyishly
+dandyism
+dandys
+danseur
+daphnia
+daredevil
+daredevilry
+daredevils
+daredeviltry
+dareful
+daresay
+darkish
+darkle
+darkroom
+darkrooms
+darksome
+darlington
+darrow
+darry
+datable
+datamedia
+dataswitch
+dataswitches
+datcap
+dateable
+dateless
+datetime
+datura
+daughterless
+dauphin
+dauphine
+davit
+daybook
+daydreamlike
+daylong
+daymare
+dayroom
+dayrooms
+daystar
+db
+de
+deacidification
+deacidify
+deactivator
+deadbeat
+deadeye
+deadfall
+deadlight
+deadpan
+deadpanner
+deaerate
+deaerates
+deaeration
+dealate
+dealated
+dealates
+dealation
+dealership
+deaminate
+deamination
+deanery
+deanship
+deathblow
+deathless
+deathlessly
+deathlessness
+deathsman
+deathwatch
+debark
+debarkation
+debarks
+debarment
+debasement
+debatement
+debator
+debators
+debauchee
+debone
+deboner
+debones
+deboning
+debouch
+debouchment
+debouchure
+debtless
+debutant
+decadency
+decagon
+decagram
+decahedron
+decalcification
+decalcify
+decalcomania
+decalescence
+decalogue
+decalogues
+decametric
+decamp
+decampment
+decamps
+decanol
+decantation
+decapitate
+decapitates
+decapitating
+decapitation
+decapitator
+decapod
+decapod's
+decapods
+decarbonate
+decarbonated
+decarbonates
+decarbonating
+decarbonation
+decarbonator
+decasyllabic
+decasyllable
+deceivable
+deceivableness
+decelerator
+decennium
+deceptional
+decerebrate
+decerebrated
+decerebrates
+decerebrating
+decerebration
+deciare
+decidua
+decidual
+deciduate
+decillion
+decipherable
+decipherment
+decistere
+deckhand
+deckhouse
+deckle
+declarable
+declarant
+declass
+declasse
+declensional
+declensionally
+declinable
+declinate
+declinational
+declivitous
+decoct
+decocted
+decocting
+decoction
+decoctions
+decocts
+decollate
+decollated
+decollates
+decollating
+decollation
+decollations
+decolonise
+decommission
+decompensate
+decompensation
+decompensatory
+deconcentrate
+deconcentrator
+decondition
+decongest
+decongestant
+decongestion
+decongestive
+deconsecrate
+deconsecration
+decontaminate
+decontaminates
+decontaminating
+decontamination
+decontaminations
+deconvolution
+deconvolve
+decorticator
+decorticators
+decoupage
+decoupages
+decremental
+decrepid
+decrepit
+decrepitate
+decrepitation
+decrepitly
+decrepitude
+decrescendo
+decrescent
+decretal
+decretals
+decretive
+decretory
+decrial
+decrials
+decryptograph
+decsystem
+dectape
+decumbent
+decuple
+decurved
+decussate
+decussately
+decussation
+decwriter
+dedicator
+dedicatory
+dedifferentiate
+dedifferentiated
+dedifferentiation
+deedless
+deejay
+defalcate
+defalcation
+defalcator
+defamation
+defamatory
+defat
+defeasance
+defeasibility
+defeasible
+defeature
+defeatured
+defeatures
+defeaturing
+defector
+defector's
+defectors
+defendable
+defensibility
+defensibly
+deferential
+deferentially
+deferral
+defervescence
+defervescences
+defervescent
+defial
+defibrillation
+defibrillator
+defilement
+definably
+definement
+definitude
+deflagrate
+deflagrated
+deflagrates
+deflagrating
+deflagration
+deflationary
+deflator
+deflexed
+defloration
+deflorations
+deflower
+defoamer
+defoamers
+defoe
+defoliant
+defoliate
+defoliated
+defoliates
+defoliating
+defoliation
+defoliator
+deforce
+deforcement
+deforciant
+deforest
+deforester
+deformative
+defraudation
+defrayable
+defrayal
+defrayals
+defrock
+defuse
+defused
+defusing
+defyed
+defys
+degas
+degassing
+degauss
+degaussed
+degausses
+degaussing
+degeneracy
+degranulation
+degressive
+degressively
+dehydrase
+dehydrator
+deism
+deist
+deistic
+deistical
+deistically
+dejeuner
+dejeuners
+delaminate
+delamination
+delate
+delated
+delates
+delating
+delation
+delator
+delectability
+delectably
+delectate
+delegacy
+delft
+delict
+delightsome
+delightsomely
+delimitate
+delimitative
+delineament
+delineaments
+delineator
+deliquesce
+deliquescent
+delist
+deliverability
+dellwood
+delphine
+delphinium
+deltaic
+delusional
+delusionary
+delusory
+demagog
+demagogic
+demagogical
+demagogically
+demagogism
+demagoguery
+demagogy
+demandable
+demandant
+demantoid
+demark
+demarkation
+dementia
+demential
+demi
+demigoddess
+demijohn
+demission
+demitasse
+demiurge
+democratique
+demographiques
+demolishment
+demolitionist
+demoniacal
+demoniacally
+demonian
+demonical
+demonically
+demonology
+demonstrability
+demonstrational
+demonstrationist
+demotic
+demount
+demounted
+demounting
+demounts
+demulcent
+demure
+demurely
+demureness
+demurrage
+demurral
+demystified
+demystifies
+demystify
+demystifying
+denaturant
+denaturation
+denaturational
+denazification
+denazify
+dendriform
+dendrite
+dendrite's
+dendrites
+dendritic
+dendroid
+dendrologic
+dendrological
+dendrologist
+dendrology
+deneen
+denegation
+denervate
+denervated
+denervates
+denervating
+denervation
+denigrator
+denigratory
+denitrification
+denitrify
+denominational
+denominationalism
+denominationalist
+denotement
+denouncement
+densification
+densify
+densimeter
+densimeter's
+densimeters
+densimetric
+dentate
+dentated
+dentately
+dentation
+denticle
+denticulate
+denticulated
+denticulately
+denticulation
+dentiform
+dentifrice
+dentigerous
+dentil
+dentin
+dentinal
+dentine
+dentition
+dentulous
+denudation
+denudational
+denudement
+denumerably
+denunciatory
+denys
+deontological
+deontologist
+deontology
+deoxidation
+deoxycholate
+deoxygenation
+deoxyribose
+depigmentation
+depilate
+depilated
+depilates
+depilating
+depilation
+depilatory
+deplane
+deplaned
+deplanes
+deplaning
+depletable
+depone
+deponed
+deponent
+depones
+deponing
+depopulate
+depopulation
+depopulator
+deportable
+depositional
+depravation
+depravations
+depravement
+deprecatorily
+depreciator
+depreciators
+depreciatory
+depredate
+depredated
+depredates
+depredating
+depredation
+depredator
+depredators
+depredatory
+depressily
+depressor
+depthless
+derailment
+derate
+derating
+deration
+derisory
+derivational
+derma
+dermal
+dermatoid
+dermatologic
+dermatological
+dermatologist
+dermatology
+dermatosis
+derogatorily
+derrickman
+derrickmen
+desalination
+desalting
+descendible
+descension
+descrating
+desecrator
+desertic
+desex
+deshabille
+desiccant
+desiccate
+desiccated
+desiccates
+desiccation
+desiccative
+desiccator
+desiderate
+desideration
+desiderative
+designatory
+designee
+designment
+desistance
+deskman
+desolator
+desorb
+desorbable
+desorbed
+despicable
+despicableness
+despisement
+despiteful
+despitefully
+despitefulness
+despiteous
+despiteously
+despoilment
+despondence
+despondences
+despotically
+destructibility
+destructible
+destructionist
+destructivity
+desultorily
+detab
+detachability
+detachably
+detainee
+detainment
+detectability
+detectaphone
+detent
+determent
+determents
+determinably
+determinantal
+determinator
+determinist
+deterrer
+detestably
+dethrone
+dethronement
+detinue
+detonabilities
+detonability
+detonatable
+detonational
+detoxicant
+detoxicants
+detoxicate
+detoxicated
+detoxicates
+detoxicating
+detoxication
+detoxicator
+detoxification
+detoxified
+detoxifies
+detoxify
+detoxifying
+detraction
+detractions
+detrain
+detrained
+detraining
+detrainment
+detrains
+detritus
+detumescence
+detumescences
+detumescent
+deuterate
+deuterated
+deuterates
+deuterating
+deuteration
+deuterations
+deuteron
+deuteron's
+devaluate
+devaluations
+devastator
+devastators
+developable
+deverbative
+devest
+deviancies
+deviancy
+deviationism
+deviationist
+deviator
+deviators
+devilkin
+devilment
+devilments
+devilry
+deviltry
+devisability
+devisable
+devisal
+devisee
+devisor
+devitrification
+devitrify
+devoir
+devoirs
+devolution
+devolutionary
+devolutionist
+devotement
+dewater
+dewatered
+dewaterer
+dewatering
+dewaters
+dewily
+deworm
+dexedrine
+dexterous
+dexterously
+dexterousness
+dextral
+dextrality
+dextrally
+dextrine
+dextro
+dextrose
+dextrose's
+dey
+dharma
+diabolism
+diabolist
+diachronically
+diachrony
+diaconal
+diaconate
+diacritic
+diacritic's
+diacritics
+diadromous
+diagnoseable
+diagnostical
+diagnostically
+diagrammatical
+diakinesis
+diakinetic
+dialectician
+dialecticians
+dialectological
+dialectologically
+dialectologist
+dialectology
+dialogic
+dialogical
+dialogically
+dialogist
+dialogistic
+dialup
+dialup's
+dialups
+dialytic
+diamagnet
+diamagnetism
+diamagnets
+diametral
+diametrical
+dianne
+diapason
+diapause
+diapausing
+diaphaneity
+diaphone
+diaphragmatic
+diaphragmatically
+diaphragmic
+diapositive
+diarchy
+diarist
+diaspora
+diaspore
+diastole
+diastolic
+diastrophic
+diastrophically
+diastrophism
+diathermic
+diathetic
+diation
+diatomaceous
+diatomite
+diatonically
+diatropic
+diatropism
+diatropisms
+dibble
+dibs
+dicarboxylic
+dicey
+dichondra
+dichotic
+dichotically
+dichotomist
+dichroic
+dichroism
+dichroitic
+dichromat
+dichromate
+dichromatic
+dichromatism
+dichromats
+dicier
+dickcissel
+dicta
+dictionally
+dicyclic
+didact
+didactical
+didactically
+didacticism
+dieing
+diel
+dieldrin
+dieresis
+dietarily
+dietetically
+diety
+dieu
+dieux
+diffeomorphic
+diffeomorphism
+differentia
+diffusional
+difluoride
+digamma
+digenesis
+digenetic
+digestibility
+digitalin
+digitate
+digitated
+digitately
+digitation
+digitigrade
+digitonin
+digressional
+digressionary
+dihybrid
+dihydroxy
+dijon
+dilapidator
+dilatability
+dilatable
+dilatational
+dilatometer
+dilatometer's
+dilatometers
+dilatometric
+dilatometry
+dilatorily
+dildo
+dildos
+dilemmatic
+dilemmatical
+dilettanti
+dilettantish
+dilettantism
+dilettantist
+dillydally
+diluent
+dilutor
+diluvial
+dimaggio
+dimeric
+dimerism
+dimerous
+dimeter
+dimeter's
+dimeters
+dimethoxymethane
+diminishable
+diminishment
+diminuendo
+diminuendo's
+diminuendos
+diminutional
+dimmable
+dimorphic
+dimorphism
+dimorphous
+dimout
+dimply
+dimwit
+dimwits
+dimyristoyl
+dinette
+dingbat
+dingbats
+dingdong
+dingily
+dingle
+dinkey
+dinnerless
+dinning
+dinosaurian
+dinosauric
+diogenes
+dion
+dioptometer
+dioptometer's
+dioptometers
+dioptometry
+dioptric
+dioptrics
+dioramic
+diorite
+diphase
+diphasic
+diphenyl
+diphtherial
+diphtherian
+diphtheritic
+diphtheroid
+diphthongal
+diplex
+diploid
+diploid's
+diploids
+diploidy
+diplomate
+diplomatically
+diplomatist
+dipod
+dipolar
+dipperful
+dipropellant
+dipsomania
+dipsomaniac
+dipsomaniacal
+dipstick
+diptych
+directionless
+directorial
+dirigible
+dirigibles
+disaccharide
+disaccharides
+disaccord
+disaccustom
+disadvantageous
+disadvantageously
+disadvantageousness
+disaffect
+disaffirm
+disaffirmance
+disaffirmation
+disagreeability
+disagreeably
+disallowance
+disannul
+disapprovative
+disarrange
+disarrangement
+disarranges
+disarticulate
+disarticulation
+disassociate
+disassociated
+disassociates
+disassociating
+disassociation
+disavowable
+disbandment
+disbarment
+disburden
+disburdenment
+discardable
+discernable
+dischargeable
+dischargee
+disciform
+disciplinable
+disciplinal
+disciplinarian
+disciplinarily
+disciplinarity
+disclamation
+disco
+disco's
+discographer
+discographic
+discographical
+discographically
+discography
+discoid
+discoidal
+discoidin
+discombobulate
+discomfiture
+discomfitures
+discomfortable
+discomfortably
+discommend
+discommendable
+discommendation
+discommode
+discommodes
+discommoding
+discompose
+discomposed
+discomposedly
+discomposure
+disconfirm
+disconfirmation
+disconform
+disconformable
+disconformity
+disconsolate
+disconsolately
+disconsolateness
+disconsolation
+discontentment
+discophile
+discordance
+discordances
+discordancy
+discos
+discountenance
+discourageable
+discourtesy
+discoverable
+discreditable
+discreditably
+discriminability
+discriminably
+discriminational
+discriminator
+discriminatorily
+discriminators
+discussable
+discussible
+disembark
+disembarkation
+disembarrass
+disembodiment
+disembody
+disembowelment
+disenchant
+disenchanter
+disenchanting
+disenchantingly
+disencumber
+disencumbrance
+disendow
+disendower
+disendowment
+disentanglement
+disenthralled
+disenthralling
+disequilibrate
+disequilibration
+disestablish
+disestablished
+disestablishment
+disestablishmentarian
+disesteem
+disestimation
+disfeature
+disfeaturement
+disfigurement
+disfigurements
+disfranchise
+disfranchised
+disfranchisement
+disfranchises
+disfranchising
+disfrock
+disfunction
+disfurnish
+disfurnishment
+disgorgement
+disgruntlement
+disguisement
+dishabille
+disharmonic
+disharmonious
+dishcloth
+disheartenment
+disheartenments
+dishrack
+dishracks
+dishy
+disincentive
+disincline
+disinclined
+disinclines
+disinclining
+disinfect
+disinfectant
+disinfectants
+disinfected
+disinfecting
+disinfection
+disinfects
+disinfest
+disinfestant
+disinfestation
+disinfested
+disinfesting
+disinfests
+disinflation
+disinflationary
+disingenuous
+disingenuously
+disingenuousness
+disinhibition
+disinhibitory
+disinsectization
+disintegrator
+disintegrators
+disinter
+disintered
+disintering
+disinterment
+disinters
+disintoxication
+disinvest
+disinvestment
+disjuncture
+disklike
+dislicense
+dislicensed
+dislicenser
+dislicenses
+dislicensing
+dislikable
+dislikably
+dislikeable
+dislimn
+dismantlement
+dismast
+dismember
+dismembering
+dismission
+disoblige
+disobliger
+disoblingingly
+disorient
+disorientation
+disownment
+dispart
+dispassion
+dispensability
+dispensable
+dispensational
+dispensatory
+dispeople
+dispersant
+dispirit
+dispirited
+dispiritedly
+dispiritedness
+dispiriting
+dispirits
+dispiteous
+displaceable
+displant
+displode
+disploded
+displodes
+disploding
+displosion
+disport
+disportment
+disporves
+disposability
+dispositive
+dispossess
+dispossesses
+dispossessing
+dispossessor
+disposure
+disposures
+dispraise
+dispraiser
+dispraisingly
+dispread
+disprize
+disproof
+disprovable
+disputation
+disputatious
+disputatiously
+disputatiousness
+disquantity
+disraeli
+disrate
+disregardful
+disrelate
+disrelated
+disrelation
+disrelish
+disremember
+disremembrance
+disreputability
+disreputably
+disrespectability
+disrespectable
+disrespectful
+disrespectfully
+disrespectfulness
+dissatisfactory
+dissatisfies
+dissatisfy
+dissatisfying
+dissector
+disseminator
+disseminators
+dissentient
+dissention
+dissert
+dissertate
+dissertator
+disserve
+dissever
+disseverance
+disseverment
+dissidence
+dissimilate
+dissimilated
+dissimilates
+dissimilating
+dissimilation
+dissimilative
+dissimilatory
+dissimilitude
+dissimulate
+dissimulator
+dissociability
+dissocial
+dissociant
+dissolubility
+dissoluble
+dissolute
+dissolutely
+dissoluteness
+dissolvable
+dissolvent
+dissuasion
+dissuasive
+dissuasively
+dissuasiveness
+dissyllable
+dissymmetric
+dissymmetry
+distemperate
+distemperature
+distensibility
+distensible
+distent
+distention
+distinguishability
+distinguishably
+distortional
+distractibility
+distractible
+distrain
+distrainable
+distrainer
+distrainor
+distraint
+distrait
+distressful
+distressfully
+distressfulness
+distributary
+distributee
+distrustful
+distrustfully
+distrustfulness
+disubstituted
+disunionist
+disunite
+disutility
+disvalue
+disyllabic
+dithery
+divagate
+divagation
+divaricate
+divarication
+divergencies
+divergency
+diversionist
+divertissement
+divertissements
+divestment
+dividable
+divinatory
+divisibility
+divisionism
+divisionist
+divorcement
+divot
+divulgence
+divulsion
+divvy
+dixiecrats
+dobbin
+doberman
+dobson
+doc
+docent
+docetic
+docility
+dockage
+dockhand
+dockworker
+doctorless
+doctorship
+doctrinairism
+documental
+documentale
+documentalist
+documentarian
+documentarily
+documentarist
+documentational
+dodder
+doddered
+dodderer
+doddering
+dodders
+doddery
+dodecyl
+dodgery
+dodgy
+dodington
+dodo
+dodo's
+dodos
+dogbane
+dogberry
+dogcart
+dogcatcher
+doge
+dogface
+dogfight
+dogfights
+dogfish
+doggerel
+doggery
+doggie
+doggier
+doggies
+doggish
+doggishly
+doggishness
+doggy
+doglike
+dogmatical
+dogmaticalness
+dogmatist
+dogmatist's
+dogmatists
+dogwatch
+doilies
+doily
+doit
+doited
+dolce
+dolesome
+dollhouse
+dollish
+dollishly
+dollishness
+dollop
+dollop's
+dolloped
+dolloping
+dollops
+dolorous
+dolorously
+dolorousness
+domical
+domicil
+domiciliary
+domiciliate
+domiciliation
+dominical
+dona
+donator
+donee
+doneness
+dong
+donner
+donut
+doodad
+doodlebug
+doohickey
+doomful
+doomfully
+doomsayer
+doomster
+doorjamb
+doorless
+doormat
+doornail
+doorplate
+doorpost
+doorsill
+doorstop
+dooryard
+dopester
+dopey
+dopier
+dopiness
+doppelganger
+dopy
+dormancy
+dormice
+dormie
+dormouse
+dormouse's
+dormy
+dosimetric
+doss
+dossal
+dosser
+dotal
+dotter
+dotterel
+dottier
+dottily
+dottiness
+dotty
+doublespeak
+doublethink
+doubletree
+douce
+douche
+doughboy
+doughface
+doughier
+doughlike
+doughnuttery
+doughtier
+doughtily
+doughtiness
+doughty
+doughy
+dovecot
+dovecote
+dovekie
+dovish
+dovishness
+dowdily
+dowdyish
+dowitcher
+downcourt
+downhaul
+downhearted
+downheartedly
+downheartedness
+download
+downloaded
+downloading
+downloads
+downrange
+downriver
+downshift
+downstage
+downstate
+downstater
+downstroke
+downswing
+downtime
+dozier
+doziness
+dozy
+drabber
+drabbest
+drabbing
+drabble
+drabbled
+drabbling
+draftable
+draggier
+draggle
+draggled
+draggling
+draggy
+dragline
+dragonet
+dragonish
+dragster
+drainpipe
+drainpipes
+dramalogue
+dramamine
+dramaturge
+dramaturgic
+dramaturgical
+dramaturgically
+dramshop
+drapability
+drapable
+drapeability
+drapeable
+drat
+dratted
+dratting
+drawable
+drawbar
+drawdown
+drawee
+drawerful
+drawknife
+drawnwork
+drawplate
+drawstring
+drawstring's
+drawstrings
+drawtube
+dray
+drayage
+drayman
+drayman's
+draymen
+draymen's
+dreamful
+dreamfully
+dreamfulness
+dreamland
+dreamworld
+drear
+drearily
+dreck
+dressage
+dressmake
+driblet
+driftage
+driftier
+driftweed
+driftwood
+driftwood's
+drifty
+drillability
+drillable
+drillmaster
+drinkability
+dripless
+dripper
+drivable
+driveable
+drivel
+driveline
+driverless
+drolleries
+drollery
+drolly
+dropkick
+dropkicker
+droplight
+droppage
+dropperful
+dropshot
+dropsy
+drossy
+droughtiness
+droughty
+drouth
+drownd
+drownded
+drownding
+drubber
+drugget
+drugmaker
+druidess
+druidic
+druidical
+druidism
+drumbeat
+drumbeater
+drumbeating
+drumfire
+drumlike
+drumlin
+drumroll
+drumstick
+drumsticks
+drunkometer
+drunkometer's
+drunkometers
+drupe
+dryable
+dryad
+dryasdust
+drylot
+drypoint
+drys
+drysalter
+drysaltery
+du
+dualist
+dualistic
+dualistically
+dubber
+dubbing
+dubiety
+dubiosity
+dubitable
+dubitation
+dubuque
+ducal
+ducally
+duckbill
+duckbilled
+duckboard
+duckfooted
+duckier
+duckpin
+duckweed
+duckweed's
+duckweeds
+ducky
+duclos
+ductility
+ductless
+ductule
+dudgeon
+dudish
+dudishly
+duende
+duenna
+duennaship
+duetted
+duetting
+duffle
+dugong
+dulcimer
+dulcimore
+dulgence
+dulles
+dullish
+dullishly
+dullsville
+dulness
+dulse
+dumbstruck
+dumbwaiter
+dumbwaiters
+dumdum
+dumka
+dumpily
+dumpish
+dumpling
+dumpling's
+dumplings
+dumpo
+dumpster
+dumpster's
+dumpsters
+dunderhead
+dunderheaded
+duneland
+dunelike
+dungaree
+dunghill
+dungy
+dunkel
+dunne
+duo
+duodecimal
+duodecimo
+duodenal
+duodenum
+duologue
+duomo
+duomos
+duopolistic
+duos
+dupery
+duple
+duplicitous
+duplicitously
+dupont
+duponts
+durance
+durometer
+durometer's
+durometers
+duros
+duskily
+dustcover
+dustheap
+dustily
+dustin
+dustless
+dustlike
+dustman
+dustpan
+dustpans
+dustup
+dutchess
+duteous
+duverger
+dwarfishly
+dwarfishness
+dwarfism
+dwarflike
+dyadically
+dyarchy
+dyeability
+dyeable
+dyerear
+dyestuff
+dyewood
+dynamist
+dynamistic
+dynamitic
+dynamometer
+dynamometer's
+dynamometers
+dynamometric
+dynamometry
+dynamotor
+dynapolis
+dynast
+dynastically
+dynasts
+dynatron
+dyne
+dynode
+dynodes
+dysenteric
+dysfunction
+dysfunctional
+dysgenesis
+dysgenic
+dysgenics
+dyslexia
+dyslexic
+dyslogistic
+dyslogistically
+dyspepsia
+dyspeptically
+dysphagia
+dysphagic
+dysphasia
+dysphasic
+dysphonia
+dysphonic
+dysphoria
+dysphoric
+dysplasia
+dysplastic
+dystrophic
+eV
+eaglet
+eagre
+earache
+eardrop
+eardrops
+earflap
+earful
+earldom
+earlobe
+earlock
+earmuff
+earmuffs
+earp
+earpiece
+earplug
+earthborn
+earthbound
+earthily
+earthlike
+earthling
+earthshaker
+earthshaking
+earthshakingly
+earthshine
+earthstar
+earthward
+earthwards
+earthwork
+earthworks
+earwax
+earwig
+earwigged
+earwigging
+earwitness
+easeful
+easefully
+easthampton
+eastwick
+easure
+eatery
+ebullience
+ebulliency
+ebullition
+eccentrically
+ecclesial
+ecclesiasticism
+ecclesiological
+ecclesiology
+ecdysiast
+ecdysis
+ecesis
+ech
+echidna
+echinulate
+echinulation
+echoey
+echoic
+echolocation
+eclat
+eclecticism
+eclogue
+eclosion
+ecol
+ecologic
+ecologist
+econometrically
+econometrician
+econometrist
+ecophysiological
+ecophysiology
+ecospecies
+ecospecific
+ecosphere
+ecotone
+ecotype
+ecotypic
+ecotypically
+ecru
+ecstatically
+ectoblast
+ectoblastic
+ectoderm
+ectodermal
+ectodermic
+ectogenic
+ectogenous
+ectomere
+ectomeric
+ectomorph
+ectomorphic
+ectoparasite
+ectoparasitic
+ectopic
+ectoplasm
+ectoplasmic
+ectotherm
+ectothermic
+ectotrophic
+ectotropic
+ecumenicalism
+ecumenicism
+ecumenicity
+ecumenism
+eczema
+eczematous
+edacious
+edacity
+edaphic
+edaphically
+edentate
+edentulous
+edgeless
+edgewater
+edgeways
+edgewood
+edgily
+edibility
+edictal
+edificatory
+editable
+editress
+eduard
+educability
+educable
+educationalist
+educationalists
+educationist
+educible
+eduction
+eductor
+eductors
+edulcorate
+edwardine
+eeg
+eellike
+eely
+eeriness
+eery
+effacement
+effectivity
+effectuality
+effeminacy
+effervesce
+effervescence
+effervescent
+effervescently
+efficacity
+efflorescence
+efflrescent
+effluence
+effortful
+effortfully
+effrontery
+effulgence
+effulgent
+eft
+egad
+egads
+egerton
+egestion
+egestive
+eggbeater
+eggcup
+eggnog
+eglantine
+egocentrically
+egocentricity
+egocentrism
+egoism
+egoist
+egoistic
+egoistical
+egoistically
+egoists
+egomania
+egomaniac
+egomaniacal
+egomaniacally
+egomaniacs
+egression
+eichmann
+eiderdown
+eidetically
+eidolon
+eigenfunction
+eigenfunctions
+eigenspace
+eighths
+eightyfold
+ein
+eine
+ejaculatory
+ejecta
+ejectable
+ejectment
+ekistic
+ekistics
+elapid
+elastase
+elastin
+elastomeric
+elaterite
+elbowroom
+elderberry
+eldership
+elecroencephalographic
+electability
+electable
+electioneer
+electioneerer
+electret
+electriques
+electroacoustic
+electroacoustically
+electroacoustics
+electroanalysis
+electroanalytic
+electroanalytical
+electrocardiographic
+electrocardiographically
+electrocardiography
+electrochemical
+electrochemically
+electrochemistry
+electroconvulsive
+electrocorticogram
+electrocorticogram's
+electrocorticograms
+electrodeposit
+electrodeposition
+electrodialysis
+electrodialytic
+electrodynamometer
+electrodynamometer's
+electrodynamometers
+electroencephalograph
+electroencephalography
+electroform
+electrogenesis
+electrogenic
+electrogram
+electrogram's
+electrograms
+electrohydraulic
+electrohydraulically
+electrojet
+electrokinetic
+electrokinetics
+electroless
+electrologist
+electroluminescence
+electroluminescent
+electrolytically
+electromagnetic
+electromagnetically
+electromechanical
+electromechanically
+electrometallurgy
+electrometer
+electrometer's
+electrometers
+electromotive
+electromyogram
+electromyogram's
+electromyograms
+electromyographical
+electronegative
+electronegativity
+electronography
+electrooculogram
+electrooculogram's
+electrooculograms
+electrophilic
+electrophoretic
+electrophoretically
+electrophoretogram
+electrophoretogram's
+electrophoretograms
+electrophotographic
+electrophotography
+electrophysiologic
+electrophysiological
+electrophysiologically
+electrophysiologist
+electrophysiology
+electroplate
+electroplater
+electropositive
+electroretinogram
+electroretinogram's
+electroretinograms
+electroretinograph
+electroretinographic
+electroretinography
+electroscope
+electrostatically
+electrosurgery
+electrosurgical
+electrothermal
+electrothermally
+electrothermic
+electrotonic
+electrotonically
+electrotype
+electrotyper
+electrovalence
+electrovalent
+electrowinning
+electrum
+electuary
+elegancy
+elegiacal
+elegiacally
+elegit
+elementarily
+elephantiasis
+elevenfold
+elfish
+elfishly
+elicitation
+elicitor
+elide
+elided
+elides
+eliding
+eligibly
+eliminable
+elisp
+elitism
+elitist
+elitists
+elixir
+ell
+elle
+ellie
+elliot
+elocutionary
+elocutionist
+elocutionists
+elopement
+elroy
+eluant
+elucidator
+elucubrate
+elucubrated
+elucubrates
+elucubrating
+elucubration
+eluent
+elutriate
+elutriator
+eluvial
+eluviate
+eluviation
+eluvium
+elver
+elvis
+elvish
+elysium
+elytron
+elytrum
+em
+emanational
+emancipationist
+emancipator
+emarginate
+emarginated
+emargination
+emasculator
+embalmment
+embarkation
+embarkment
+embarrassable
+embassage
+embattlement
+embay
+embayment
+embeddable
+embedment
+embitter
+embitterment
+embitters
+emblaze
+emblazed
+emblazes
+emblazing
+emblazon
+emblazoned
+emblazoner
+emblazoning
+emblazonment
+emblazonry
+emblazons
+emblematical
+emblematically
+emblements
+embolic
+embolism
+embolismic
+embosom
+embossable
+embossment
+embouchure
+embowed
+embowel
+embracement
+embraceor
+embracery
+embranchment
+embrangle
+embranglement
+embrasure
+embrittlement
+embrocate
+embrocated
+embrocates
+embrocating
+embrocation
+embroglio
+embroilment
+embrown
+embrue
+embryogenesis
+embryogenetic
+embryogenic
+embryogeny
+embryol
+embryologic
+embryological
+embryologically
+embryologist
+embryonal
+embryonally
+embryonated
+embryonically
+embryotic
+emceeing
+emendate
+emendation
+emendator
+emendatory
+emeriti
+emersed
+emerses
+emersion
+emetic
+emetically
+emigre
+emigre's
+emigree
+eminency
+emir
+emissive
+emollient
+emollients
+emote
+emoted
+emotes
+emoting
+emotionalist
+emotionalistic
+emotionless
+emotionlessness
+emotive
+emotively
+emotivity
+empanel
+empanels
+empathetic
+empennage
+emperies
+emperorship
+empery
+emphasization
+emphasization's
+emplacement
+emplane
+empoison
+empoisonment
+empowerment
+empressement
+emprise
+emptyhanded
+empurple
+empurpled
+empurpling
+ems
+emu
+emulous
+emulously
+emulousness
+emulsible
+emulsifiable
+emulsive
+emunctory
+en
+enactor
+enamelware
+enamine
+encage
+encapsule
+encapsules
+encasement
+encash
+encashment
+encaustic
+enceinte
+encephalic
+encephalitic
+encephalitogenic
+encephalogram
+encephalogram's
+encephalograms
+encephalon
+enchainment
+enchase
+enchased
+enchasing
+enchilada
+encipherment
+encirclement
+enclasp
+enclitic
+encomia
+encompassment
+encrimson
+encrustation
+encyst
+encystation
+encystment
+endamage
+endangerment
+endarch
+endarchy
+endbrain
+endemically
+endergonic
+endermic
+endermically
+endexine
+endite
+endleaf
+endlong
+endmost
+endobiotic
+endoblast
+endoblastic
+endocardial
+endochondral
+endocrine
+endocrinologic
+endocrinological
+endocrinologist
+endocrinology
+endocytic
+endocytosis
+endocytotic
+endoderm
+endodermal
+endodermis
+endodontia
+endodontic
+endodontically
+endodontics
+endodontist
+endoenzyme
+endoergic
+endoerythrocytic
+endogamic
+endogen
+endogenic
+endogeny
+endolymph
+endolymphatic
+endometrial
+endometriosis
+endometrium
+endomitosis
+endomorph
+endomorphic
+endomorphism
+endomorphy
+endonuclease
+endoparasite
+endoparasitism
+endophyte
+endophytic
+endoplasm
+endoplasmic
+endorsable
+endorsee
+endoscope
+endoscopic
+endoscopically
+endoscopy
+endoskeletal
+endoskeleton
+endosmosis
+endosmotic
+endosmotically
+endospermic
+endospermous
+endospore
+endosporic
+endosporous
+endosteal
+endosteally
+endosternite
+endosteum
+endostyle
+endosymbiosis
+endotherm
+endothermal
+endotoxic
+endotoxin
+endotracheal
+endotrophic
+endotropic
+endozoic
+endpaper
+endue
+endued
+enduing
+endways
+endwise
+enemata
+enfant
+enfants
+enfeeblement
+enfetter
+enfever
+enflame
+enflamed
+enflames
+enflaming
+enfold
+engild
+engineroom
+enginerooms
+enginery
+engird
+engirdle
+englacial
+englut
+englutted
+engluttin
+engorgement
+engr
+engraft
+engrailed
+engrain
+engrammic
+engrossment
+engulf
+engulfment
+enhalo
+enharmonic
+enharmonically
+enigmatical
+enigmatically
+enisle
+enjambement
+enjambment
+enkindle
+enlace
+enlacement
+enlistee
+enmeshment
+ennoblement
+enol
+enolase
+enolic
+enologist
+enology
+enplane
+enrapt
+enregister
+enrobe
+enroot
+ens
+ensample
+ensanguine
+ensconce
+ensconces
+ensconcing
+enscroll
+enserf
+enserfment
+ensheathe
+enshrine
+enshrined
+enshrinement
+enshrines
+ensiform
+ensilage
+ensile
+ensiled
+ensiling
+ensional
+ensnarl
+ensolite
+ensoul
+ensphere
+enswathe
+entablature
+entablement
+entablements
+ente
+entendre
+entente
+enterable
+enteral
+enterally
+enteric
+enthronement
+enticement
+entoderm
+entodermal
+entodermic
+entoil
+entoiled
+entombment
+entomological
+entomophagous
+entomophilous
+entomophily
+entrail
+entrails
+entrainment
+entrancement
+entrappingly
+entreatment
+entrustment
+entryway
+entwinement
+entwist
+enucleate
+enucleated
+enucleating
+enucleation
+enunciator
+enunciators
+envelopment
+envelopments
+environmentalism
+environmentalist
+environmentalists
+envisionin
+envoi
+envois
+enwheel
+enwind
+enwinding
+enwrap
+enwreathe
+enzymic
+enzymically
+enzymologist
+eon
+eon's
+eons
+eosine
+epaulette
+ephemerality
+epical
+epically
+epicardial
+epicardium
+epicarp
+epicene
+epicenism
+epicentral
+epicureanism
+epicurism
+epicurus
+epidemical
+epidemically
+epidemicity
+epidemiologic
+epidemiologist
+epidermal
+epigrammatical
+epigrammatically
+epigrammatism
+epigrammatist
+epigraphic
+epigraphical
+epigraphically
+epigraphist
+epigraphy
+epileptically
+epimorphism
+epiphanous
+epiphenomenal
+epiphenomenally
+epiphyseal
+epiphysis
+epiphyte
+epiphytic
+episcope
+episiotomy
+episodical
+episodically
+episomal
+episomally
+episome
+epistasy
+epistatic
+epistemic
+epistemically
+epistemologist
+epistolary
+epistoler
+epistrophe
+epitaphial
+epitaphic
+epithetic
+epithetical
+epode
+epodes
+eponymous
+equability
+equably
+equalitarian
+equalitarianism
+equational
+equationally
+equatorward
+equerries
+equerry
+equestrienne
+equiangular
+equiangularity
+equicaloric
+equilibrator
+equilibrators
+equilibratory
+equilibrist
+equilibristic
+equimolal
+equimolar
+equinoctial
+equipage
+equipoise
+equipollence
+equipollent
+equipollently
+equiponderant
+equiponderate
+equipotential
+equiprobable
+equitability
+equitant
+equitation
+equivalency
+equivocality
+equivocate
+equivocated
+equivocates
+equivocating
+equivocator
+equivoke
+equivoque
+eradicably
+eradicator
+eradicators
+eradictions
+erasabilities
+erasability
+erectable
+erectile
+erectility
+erelong
+erenow
+erewhile
+erewhiles
+erg
+ergative
+ergograph
+ergometer
+ergometer's
+ergometers
+ergometric
+ergonomic
+ergonomics
+ergonomist
+ergonovine
+ergosterol
+ergot
+ergotamine
+ergotic
+ergotism
+ergotropic
+erodibility
+erogenic
+erogenous
+erose
+erosely
+erosional
+erosionally
+erosivity
+erotical
+eroticism
+eroticist
+erotism
+erotogenic
+erratical
+erraticism
+errorless
+eruptible
+escalade
+escalader
+escalades
+escalator
+escalators
+escalatory
+escallop
+escallops
+escapement
+escapements
+escapism
+escapologist
+escapology
+escargot
+escarp
+escheat
+escherichia
+eschewal
+escot
+esculent
+esemplastic
+esker
+esophageal
+esoterica
+esoterically
+esotericism
+esp
+espadrille
+espagnol
+espanol
+esperance
+espial
+espresso
+espressos
+essayist
+essayistic
+essentialism
+essentialist
+essentiality
+establishable
+establishmentarian
+establishmentarianism
+esteemable
+ester
+estop
+estopped
+estopping
+estral
+estray
+estrogen
+estrogenic
+estrogenically
+estrone
+estrous
+estrum
+estrus
+estuarial
+esurience
+esuriency
+esurient
+esuriently
+etagere
+etatism
+etatist
+etch
+etcher
+etches
+etching
+ether
+ether's
+ethereality
+etheric
+etherish
+etherlike
+ethers
+ethicality
+ethician
+ethicians
+ethnical
+ethnobiological
+ethnobiology
+ethnocentric
+ethnocentrically
+ethnocentricity
+ethnocentrism
+ethnographer
+ethnographical
+ethnographically
+ethnol
+ethnologic
+ethnological
+ethnologically
+ethnologist
+ethnomusicology
+ethological
+ethologist
+ethoxy
+ethylate
+ethylation
+ethylenic
+ethylenically
+ethylic
+ethynyl
+etude
+etudes
+etui
+etymologist
+etymologists
+eucaryotic
+eucharistic
+euchre
+euclidian
+eucre
+eugenically
+eugenicist
+euglena
+euhemerism
+euhemerist
+euhemeristic
+euhemeristically
+eukaryote
+eukaryotic
+eulogist
+eulogistic
+eulogistically
+eulogium
+eumorphic
+eunuchism
+euphemistic
+euphemistically
+euphonically
+euphonious
+euphoniously
+euphoniousness
+euphonium
+euphorbia
+euphorically
+euphotic
+euphuism
+euphuist
+euphuistic
+euphuistically
+euplastic
+eurhythmic
+eurhythmics
+europeanish
+eurythmic
+eurythmics
+eurythmy
+eurytopic
+eurytopicity
+eustatic
+eutectic
+euthanasic
+euthenics
+euthenist
+eutherian
+euthyroid
+eutrophic
+eutrophication
+eutrophy
+eux
+evacuator
+evacuee
+evacuees
+evadable
+evagination
+evaluable
+evanesce
+evanesced
+evanescence
+evanesces
+evanescing
+evangel
+evangeline
+evangelistically
+evanishment
+evaporativity
+evaporator
+evaporators
+evaporite
+evaporitic
+evapotranspiration
+evection
+evenfall
+eventless
+everblooming
+eversible
+eversion
+eversions
+evert
+everyplace
+evictee
+evictees
+evictor
+evictors
+evidentiary
+evildoing
+evincible
+eviscerate
+eviscerated
+eviscerates
+eviscerating
+evisceration
+evitable
+evocator
+evocators
+evolutionarily
+evolutionism
+evolutionist
+evolvable
+evolvement
+evulsion
+evulsions
+evzone
+ewen
+exacta
+exactable
+exactor
+exactors
+exaggerator
+exaggerators
+exagitates
+examinant
+examinants
+examinational
+examinatorial
+examinee
+examinees
+exanimate
+exanimated
+exanimates
+exanimating
+excavational
+excavator
+excavators
+exceptionability
+exceptionable
+exceptionably
+exceptionality
+excerption
+excerptions
+excerptor
+excerptors
+exchangeability
+exchangee
+exchangees
+excide
+excided
+excides
+exciding
+excipient
+exciseman
+excitant
+excitants
+excitative
+exciton
+excitor
+exclave
+exclaves
+exclosure
+exclosures
+excludability
+excludable
+excludible
+exclusionist
+exclusionists
+excogitate
+excogitation
+excogitative
+excommunicator
+excrement
+excrement's
+excremental
+excrementitious
+excrements
+excrescency
+excrescent
+excrescently
+excreta
+excretal
+exculpate
+exculpated
+exculpates
+exculpating
+exculpation
+exculpations
+excurrent
+excursionist
+excursionists
+excursive
+excursively
+excursiveness
+excusatory
+execrably
+execrator
+execrators
+executant
+executorial
+executory
+executrices
+exegetic
+exegetical
+exegetically
+exegetics
+exegetist
+exemplarily
+exemplarity
+exenterate
+exenterated
+exenterates
+exenterating
+exenteration
+exenterations
+exercitation
+exergonic
+exeunt
+exfoliate
+exfoliated
+exfoliates
+exfoliating
+exfoliation
+exfoliative
+exhalant
+exhalants
+exhalation
+exhalations
+exhalent
+exhalents
+exhaustibility
+exhaustivity
+exhaustless
+exhaustlessly
+exhaustlessness
+exhibitionism
+exhibitionist
+exhibitionistic
+exhibitory
+exhilarant
+exhortative
+exhortatory
+exigence
+exiguity
+exiguous
+exiguously
+exiguousness
+exilic
+existentialistic
+existentialistically
+exobiological
+exobiologist
+exobiology
+exocrine
+exocyclic
+exodermis
+exodontia
+exodontist
+exoergic
+exogamic
+exonuclease
+exorbitance
+exorbitances
+exorcistic
+exorcistical
+exordial
+exordium
+exoskeleta
+exoskeletal
+exosmosis
+exosmotic
+exosphere
+exospheric
+exospore
+exostosis
+exoteric
+exotericaly
+exothermal
+exothermically
+exotically
+exoticism
+exotism
+expansibility
+expansile
+expansional
+expansionary
+expansionistic
+expansivity
+expatiate
+expatiated
+expatiates
+expatiating
+expatiation
+expatriate
+expatriated
+expatriates
+expatriating
+expatriation
+expecially
+expectably
+expectance
+expectative
+expedience
+expediential
+expeditionary
+expeditor
+expellee
+expeller
+expellers
+expendability
+expertism
+expiator
+expiatory
+expiratory
+expiry
+explanative
+explanatively
+explanatorily
+explant
+explantation
+explants
+expletory
+explicably
+explicator
+explicatory
+explodent
+exploitative
+exploitatively
+explorational
+explorative
+exploratively
+explosibility
+explosible
+expo
+exportability
+exportable
+expos
+expositional
+expositor
+expostulate
+expostulation
+expostulatory
+expressage
+expressional
+expressionistically
+expropriator
+expropriators
+expulsive
+expunction
+expurgator
+expurgatorial
+expurgatory
+exsanguinate
+exsanguination
+exscind
+exsert
+exserted
+exsertile
+exsertion
+exsertions
+exsiccate
+exsiccation
+exstipulate
+ext
+extemporal
+extemporally
+extemporaneity
+extemporarily
+extemporary
+extendable
+extensile
+extensionality
+extensity
+extensometer
+extensometer's
+extensometers
+extenuator
+extenuatory
+exteriority
+exterminatory
+extermine
+externalism
+externality
+externship
+exteroceptive
+exteroceptor
+exterritorial
+exterritoriality
+extinguishable
+extinguishment
+extoll
+extolment
+extortionary
+extortionate
+extortionately
+extrachromosomal
+extracorporeal
+extracorporeally
+extracranial
+extractability
+extractable
+extractible
+extradite
+extradites
+extradition
+extradoses
+extragalactic
+extrajudicial
+extrajudicially
+extralimital
+extralinguistic
+extralinguistically
+extrality
+extramundane
+extramural
+extramurally
+extranuclear
+extrapolator
+extrasensory
+extrasystole
+extrasystolic
+extraterritorial
+extraterritoriality
+extrauterine
+extravagancy
+extravagate
+extravasate
+extravasation
+extravascular
+extravehicular
+extraversion
+extraversive
+extravert
+extraverted
+extremis
+extremum
+extrinsically
+extrorse
+extrorsely
+extrudability
+extrudable
+exuberate
+exudate
+exudative
+exultance
+exultancy
+exurban
+exurbanite
+exurbia
+exuviation
+eyebolt
+eyebright
+eyecup
+eyedropper
+eyedropperful
+eyehole
+eyelike
+eyeliner
+eyepatch
+eyepoint
+eyepopper
+eyeshade
+eyeshot
+eyespot
+eyestalk
+eyestrain
+eyestrings
+eyetooth
+eyewash
+eyewink
+eyre
+eyrie
+fabricant
+fabricator
+fabricators
+fabular
+fabulist
+facedown
+facement
+facepiece
+facepieces
+facetted
+faceup
+facies
+facilitator
+facticity
+factional
+factionalism
+factionally
+factitious
+factitiously
+factitiousness
+factitive
+factitively
+factorable
+factorage
+factorship
+factotum
+factualism
+factualist
+factualists
+facture
+factures
+facula
+facultative
+facultatively
+faddish
+faddishness
+faddism
+faddist
+faddists
+fadeaway
+fadeless
+fadelessly
+fagging
+faggot
+faggoting
+faggots
+faience
+failsoft
+fainthearted
+faintheartedly
+faintheartedness
+faintish
+faintishness
+fairground
+fairish
+fairishly
+fairlead
+fairleader
+fairview
+fairylike
+faitour
+fakery
+fakir
+falcate
+falcated
+falciform
+falconet
+falderal
+falk
+fallback
+fallibly
+falsetto
+falsettos
+familism
+famishment
+fancywork
+fandango
+fane
+fanion
+fanlight
+fanlike
+fanner
+fantastical
+fantasticality
+fantasticalness
+fantasticate
+fantasticated
+fantasticates
+fantasticating
+fantastication
+fantod
+fanwise
+farad
+farceur
+farcicality
+farmhand
+farmhands
+farmstead
+farmsteading
+faro
+farrow
+farseeing
+farthermost
+fasces
+fascia
+fascial
+fasciated
+fasciation
+fascicular
+fascicularly
+fascicule
+fasciculus
+fascinator
+fascinators
+fascistic
+fascistically
+fashionabilities
+fashionability
+fashionmonger
+fastball
+fastball's
+fastballs
+fastuous
+fastuously
+fatalism
+fatalist
+fatalistically
+fatback
+fathead
+fatheaded
+fatheadedness
+fatherlike
+fathomable
+fathomless
+fathomlessly
+fathomlessness
+fatigability
+fatigable
+fatling
+fatted
+fatting
+fattish
+faulknerian
+faultfinder
+faultfinding
+faultily
+faunal
+faunally
+faunistic
+faunistically
+fauntleroy
+fauvism
+fauvist
+faux
+favonian
+fawkes
+fawny
+fay
+featherhead
+featherheaded
+featherless
+featherman
+febrific
+fecal
+feckless
+fecklessly
+fecklessness
+feckly
+feculence
+feculent
+fecundate
+fecundated
+fecundates
+fecundating
+fecundation
+fecundations
+feebleminded
+feeblemindedly
+feeblemindedness
+feedlot
+feedstock
+feedstuff
+feeing
+feetfirst
+feist
+feistier
+feisty
+feldspathic
+felicific
+felicitate
+felicitated
+felicitates
+felicitating
+felicitation
+felicitator
+felinity
+fellable
+fellah
+fellatio
+fellation
+fellations
+fellini
+fellowman
+felones
+felonry
+felsite
+felsitic
+felspar
+feministic
+feminity
+femoral
+fenceless
+fencelessness
+fenestral
+fenestrate
+fenestrated
+fenestrates
+fenestration
+fennec
+fenny
+fenugreek
+feral
+ferdinando
+ferial
+ferine
+fering
+ferity
+fermentable
+fermentative
+fernlike
+ferny
+ferrate
+ferrety
+ferriage
+ferriferous
+ferrimagnet
+ferrimagnetic
+ferrimagnetically
+ferrimagnetism
+ferritic
+ferromagnetism
+ferrotype
+ferruginous
+ferrule
+ferryboat
+ferryman
+fervency
+fescue
+fess
+festinate
+festinately
+festination
+festoon
+festoonery
+festoons
+feta
+fetation
+feterita
+fetishism
+fetishist
+fetishistic
+fetlock
+fetlocks
+fetologist
+fetology
+fetor
+fettuccine
+feudalist
+feudality
+feudist
+feverous
+feverously
+fey
+feyness
+fez
+fezes
+fezzes
+fibber
+fibration
+fibriallating
+fibril
+fibrillar
+fibrillate
+fibrillated
+fibrillates
+fibrillation
+fibrilliform
+fibrillose
+fibrils
+fibronectin
+fibrovascular
+fibula
+fibular
+fichu
+fictile
+fictioneer
+fictioneering
+fictionist
+ficus
+fiddleback
+fiddlehead
+fideism
+fideist
+fideistic
+fidel
+fidgetiness
+fidgety
+fidging
+fie
+fieldfare
+fieldstrip
+fiftyfold
+figaro
+figurable
+figurate
+figuration
+figurations
+figurehead
+filamentous
+filar
+filaria
+filarial
+filature
+filiation
+filiform
+filigreeing
+filippo
+fille
+filles
+fillip
+fillips
+fillment
+filmcard
+filmic
+filmically
+filmily
+filmmake
+filmmaker
+filmmakers
+filmmaking
+filmography
+fils
+filterability
+filterable
+filthily
+filtrable
+filum
+fimbria
+fimbrial
+fimbriate
+fimbriated
+fimbriates
+fimbriation
+finagle
+finagled
+finagler
+finagles
+finagling
+finback
+finery
+finespun
+fingerboard
+fingerlike
+fingerling
+fingerpost
+finical
+finically
+finicalness
+finicking
+finis
+finitude
+finlike
+finning
+fiord
+fiori
+firebird
+firebox
+firebrand
+firebrick
+fireclay
+firedamp
+fireguard
+fireless
+firelock
+fireplug
+fireplugs
+fireroom
+firetrap
+firma
+firmamental
+firstborn
+firstfruits
+firstling
+firstlings
+fisc
+fishability
+fishable
+fishbowl
+fishhook
+fishkill
+fishnet
+fishplate
+fishplates
+fishtail
+fishway
+fishwife
+fishyback
+fissility
+fissionability
+fissionable
+fissional
+fissiparous
+fissiparously
+fissiparousness
+fistfight
+fistful
+fistic
+fistnote
+fitment
+fixable
+fixity
+fixups
+fizzy
+flabbily
+flabellate
+flaccid
+flaccidity
+flaccidly
+flack
+flacon
+flagellant
+flagellantism
+flagellants
+flagellar
+flageolet
+flagger
+flagitious
+flagitiously
+flagitiousness
+flagon
+flagrance
+flagrancies
+flagrancy
+flamb
+flamboyance
+flamboyancy
+flamenco
+flameout
+flameproof
+flamingo
+flammability
+flan
+flan's
+flapdoodle
+flapjack
+flappy
+flareback
+flashboard
+flashgun
+flashguns
+flashily
+flashover
+flashovers
+flashtube
+flatboat
+flatcap
+flatcar
+flatfeet
+flatfoot
+flatfooted
+flatfoots
+flatted
+flatting
+flattish
+flattop
+flatulency
+flatus
+flatware
+flatwise
+flatwork
+flaunty
+flaxier
+flaxy
+flay
+fleabag
+fleabane
+flection
+flective
+fledermaus
+fleeringly
+fleischman
+fleisher
+fleshment
+fleshpot
+fleshpots
+flexile
+flexion
+flexographic
+flexographically
+flexography
+flexor
+flexuous
+flexuously
+flibbertigibbet
+flibbertigibbety
+flickery
+flightier
+flightily
+flightiness
+flightless
+flighty
+flimflam
+flimflammed
+flimflammer
+flimflamming
+flimsily
+flintily
+flintlike
+flippancy
+flipper
+flirty
+flitted
+flitter
+flivver
+floatage
+floatation
+floatplane
+floaty
+floc
+flogger
+floodlit
+floodplain
+floodwall
+floodwater
+floodwater's
+floodwaters
+floodway
+flooey
+floorage
+floorwalker
+floozie
+floozies
+floozy
+flophouse
+flopover
+flopovers
+flopper
+floppers
+florescence
+florescent
+floret
+floriate
+floriated
+floriation
+floriations
+florican
+floricultural
+floriculturally
+floriculture
+floriculturist
+floridity
+floriferous
+floriferously
+floriferousness
+florigen
+florigenic
+floristic
+floristically
+floristics
+floristry
+floruit
+flossier
+flossy
+flotage
+flotsam
+flouncy
+flowage
+flowerage
+floweret
+flowerlike
+fluctuant
+fluegelhorn
+fluidal
+fluidally
+fluidextract
+fluidic
+fluidics
+fluidounce
+fluidram
+flukey
+flukier
+fluky
+flume
+flumed
+flumes
+fluming
+flummery
+flummox
+flump
+flumped
+flumping
+flumps
+flunkeys
+flunky
+fluor
+fluorescein
+fluorimeter
+fluorimeter's
+fluorimeters
+fluorimetry
+fluorinate
+fluorinates
+fluorinating
+fluorination
+fluorinations
+fluoroscopic
+fluorspar
+flutelike
+flutterboard
+fluttery
+fluvial
+fluviatile
+fluxion
+fluxional
+flyblown
+flyboat
+flyboats
+flyby
+flybys
+flyleaf
+flyman
+flyover
+flyovers
+flypaper
+flypast
+flypasts
+flyspeck
+flyswatter
+flytier
+flyting
+flyway
+flyweight
+foamflower
+foamless
+fobbing
+focusless
+fodgel
+foeman
+fogbound
+fogey
+fogeys
+fogger
+foggest
+foghorn
+foghorns
+fogies
+fogless
+fogy
+fogyish
+fogyism
+foilsman
+foldable
+foldaway
+foldboat
+foldboater
+foldboating
+folderol
+folia
+foliaceous
+folic
+folkish
+folkishness
+folkloric
+folklorish
+folklorist
+folkloristic
+folksily
+folksinger
+folksinger's
+folksingers
+folksinging
+folktale
+folktale's
+folktales
+folkway
+folkways
+folliculate
+folliculated
+followership
+followeth
+fomentation
+fomentations
+fondue
+fondues
+fontal
+fontana
+foodless
+foodlessness
+foolery
+foolhardily
+foolscap
+foolscap's
+footboard
+footboards
+footboy
+footboys
+footcandle
+footcloth
+footgear
+footle
+footled
+footler
+footles
+footless
+footlessly
+footlessness
+footlight
+footlights
+footlike
+footling
+footlocker
+footmark
+footpace
+footrace
+footrest
+footrests
+footrope
+footropes
+footslog
+footslogger
+footslogs
+footsore
+footsoreness
+footstall
+footwall
+footway
+footways
+footy
+foozle
+foozled
+fopping
+fora
+foraminifera
+forbiddance
+forbidder
+forbode
+forborne
+forbye
+forceless
+forceps
+forcepslike
+fordable
+fordo
+forebear
+forebode
+foreboded
+foreboder
+forebodes
+forebrain
+foreclose
+forecloses
+foreclosure
+foredeck
+forefeel
+forefoot
+foregather
+forehand
+forehanded
+forehandedly
+forehandedness
+foreignism
+forejudge
+foreknow
+forelady
+foreland
+forelimb
+forelock
+foremanship
+foremast
+foremasts
+foremother
+forename
+forenamed
+forenames
+forensical
+forensically
+foreordain
+foreordained
+foreordaining
+foreordains
+foreordination
+forepassed
+forepast
+forepaw
+forepeak
+foreplay
+forequarter
+forequarters
+forereach
+forerun
+foresaid
+foresail
+foreshadow
+foreshadowed
+foreshadower
+foreshadowing
+foreshadows
+foreshank
+foresheet
+foreshore
+foreshorten
+foreshortens
+foreshow
+foreside
+foresightful
+foreskin
+forespeak
+forestage
+forestal
+forestation
+forestay
+forestial
+foreswear
+foresworn
+foretaste
+foretellable
+forethoughtfully
+forethoughtfulness
+forethougtful
+foretime
+foretoken
+forevermore
+forewoman
+foreworn
+foreyard
+forfeitable
+forgather
+forgeability
+forgeable
+forgetter
+forgiveable
+forgiveably
+forgoes
+forgone
+forjudge
+forkful
+forkier
+forklike
+forky
+forma
+formable
+formalin
+formalist
+formalistic
+formalistically
+formational
+formfitting
+formful
+formidability
+formless
+formlessly
+formlessness
+formulaically
+formulary
+formyl
+fornicate
+fornicated
+fornicates
+fornicating
+fornications
+fornicator
+fornicators
+forrader
+forrarder
+forsooth
+forspent
+forswore
+forsworn
+fortalice
+fortin
+fortman
+fortuity
+fortyfold
+forwent
+forworn
+fossate
+fossorial
+fosterage
+fosterite
+fosterling
+fosterlings
+fou
+foudroyant
+foundational
+foundationally
+foundationless
+founderous
+foundress
+foundrous
+fourdrinier
+foxily
+foxtrot
+foxtrot's
+foxtrots
+fracas
+fracted
+fractionate
+fractionates
+fractionating
+fractionations
+fractionator
+fractionators
+frag
+fragged
+fragging
+fragility
+fragmental
+fragmentally
+fragmentate
+fragmentated
+fragmentates
+fragmentating
+fragmentations
+fragrancy
+frags
+framable
+frambesia
+frameable
+franca
+francaise
+francesca
+francesco
+franchisee
+franchisor
+francie
+francois
+frangibility
+frangible
+frangipani
+frankincense
+frankpledge
+franny
+frap
+frappe
+frapping
+frat
+frater
+fraternalism
+fratricidal
+fratricide
+fraudulence
+frayne
+freakier
+freaky
+freckly
+fredrick
+freeboard
+freedwoman
+freehearted
+freeheartedly
+freeload
+freeloader
+freemasonry
+freestanding
+freestyle
+freethink
+freethinker
+freethinking
+freewill
+freida
+freightage
+frenchification
+frenchify
+frenetically
+frequence
+frequentation
+frequentations
+frequentative
+frequentatives
+freshet
+fretwork
+friability
+friary
+fribble
+fribbled
+fribbles
+fribbling
+fricassee
+fridge
+fridge's
+fridges
+frig
+frigging
+frigidity
+frigorific
+frillery
+fringier
+fringy
+frippery
+friskily
+frisson
+frissons
+frit
+fritillary
+frito
+fritted
+fritting
+frivol
+frizz
+frizzier
+frizzily
+frizziness
+frizzlier
+frizzly
+frizzy
+frogman
+frogmen
+frolick
+frolicked
+frolicks
+frolicsome
+frolicsomely
+frolicsomeness
+frond
+frond's
+fronded
+frondeur
+frondose
+frondosely
+fronds
+frontality
+frontispiece
+frontispieces
+frontless
+fronton
+frostily
+frostwork
+frothily
+froths
+frottage
+froufrou
+froward
+frowardly
+frowardness
+frowsier
+frowstier
+frowsty
+frowsy
+fructification
+fructifications
+fructify
+fructose
+fructose's
+fructoses
+fructuous
+fructuously
+fruitage
+fruitcake
+fruitier
+fruitlet
+fruity
+frump
+frumpier
+frumpish
+frumps
+frumpy
+fryer
+ft
+ftp
+ftper
+ftpers
+ftping
+ftpings
+ftps
+fucose
+fucus
+fuddle
+fuddled
+fuddles
+fuddling
+fugacity
+fugal
+fugally
+fuguist
+fulbright
+fulcra
+fulgent
+fulgently
+fulgurant
+fulgurate
+fulgurated
+fulgurates
+fulgurating
+fulguration
+fulgurations
+fulgurous
+fuliginous
+fuliginously
+fullmouthed
+fulminant
+fulminator
+fulminators
+fulness
+fum
+fumarate
+fumarole
+fumigator
+fumigators
+fumy
+funambulist
+functionalistic
+functionless
+functorial
+fundament
+fundamentalistic
+fundraiser
+fundraiser's
+fundraisers
+fundraising
+funerary
+fungibility
+fungicidal
+fungicidally
+fungicide
+fungiform
+fungo
+fungoes
+fungous
+funicular
+funiculus
+funigating
+funkier
+funkiness
+funky
+funnelform
+funning
+funnyman
+furbearer
+furbelow
+furcate
+furcated
+furcately
+furcates
+furcating
+furcation
+furcations
+furcula
+furcular
+furfural
+furless
+furloughs
+furmity
+furriery
+furtherance
+furuncle
+furuncular
+furunculosis
+furunculous
+furze
+fusee
+fusee's
+fusees
+fusibility
+fusil
+fusile
+fusileer
+fusilier
+fusionist
+fussbudget
+fussbudgety
+fusspot
+fustian
+fustians
+fustigate
+fustigated
+fustigates
+fustigating
+fustigation
+fustigations
+fustily
+futilitarian
+futilitarianism
+futureless
+futurism
+futuristic
+futuristically
+futurity
+gabber
+gabbier
+gabble
+gabbled
+gabbler
+gabbles
+gabbling
+gabbro
+gabby
+gaberdine
+gabfest
+gabfests
+gadabout
+gadabouts
+gadded
+gadder
+gadding
+gadgeteer
+gadgeteers
+gadgety
+gadolinium
+gadwall
+gadzooks
+gaff
+gaffs
+gaga
+gage
+gages
+gagger
+gagman
+gagmen
+gagster
+gagsters
+gaillardia
+gaingiving
+gainless
+gainlessness
+gainsay
+gainsayer
+galactopyranose
+galactopyranoside
+galactopyranosides
+galactopyranosyl
+galactose
+galahad
+galavant
+gallberry
+gallbladder
+galleon
+galleons
+gallet
+gallied
+gallinule
+gallopade
+gallow
+gallus
+galluses
+galore
+galosh
+galoshed
+galoshes
+galoshing
+galumph
+galvanically
+galvanometric
+gam
+gamekeeper
+gamekeepers
+gamesmanship
+gamesome
+gamesomely
+gamesomeness
+gamester
+gamete
+gamete's
+gametes
+gametic
+gametically
+gamey
+gamic
+gamier
+gamily
+gamin
+gamine
+gaminess
+gamming
+gammon
+gamy
+ganglioside
+gangliosides
+gangplow
+gangrenous
+gangsterism
+gannet
+gantlet
+gapping
+gappy
+gar
+garageman
+garagemen
+garde
+gardenful
+garlicky
+garnett
+garnishable
+garnishee
+garnishees
+garnishment
+garnishments
+garniture
+garnitures
+garotte
+garrote
+garroted
+garroter
+garrotes
+garroting
+garrots
+garrulity
+garth
+gasbag
+gasholder
+gashouse
+gaslit
+gasogene
+gasolene
+gasolier
+gasolinic
+gasometer
+gasometer's
+gasometers
+gasses
+gasset
+gast
+gastight
+gastightness
+gastness
+gastral
+gastrectomy
+gastrin
+gastritis
+gastrogenic
+gastrogenous
+gastronomic
+gastronomical
+gastronomically
+gastronomist
+gastrulate
+gastrulation
+gasworker
+gasworks
+gat
+gatefold
+gatekeeper
+gatekeeper's
+gatekeepers
+gatepost
+gatsby
+gaucherie
+gaucheries
+gaud
+gauded
+gaudery
+gaudily
+gauding
+gauds
+gaugeably
+gaum
+gaums
+gauntley
+gaur
+gauzelike
+gauzily
+gauziness
+gauzy
+gavotte
+gavottes
+gawkily
+gawkish
+gawkishly
+gawkishness
+gayety
+gazebo
+gazebo's
+gazebos
+gazpacho
+gazpacho's
+gearbox
+gearless
+gearshift
+geary
+gecko
+geegaw
+geezer
+gehrig
+gelant
+gelate
+gelated
+gelates
+gelating
+gelation
+gelid
+gelidity
+gelidly
+gelin
+geminal
+geminally
+geminate
+geminately
+gemination
+gemmate
+gemmated
+gemmates
+gemmating
+gemmation
+gemming
+gemsbok
+gemstone
+gemstone's
+gemstones
+gendarme
+gendarmerie
+genealogical
+genealogically
+genealogist
+generable
+generale
+generalship
+generalships
+generatrix
+genetical
+geniality
+genic
+genically
+geniculate
+geniculated
+geniculately
+genii
+genital
+genital's
+genitalia
+genitalic
+genitally
+genitals
+genocidal
+genocide
+genocides
+genome
+genome's
+genomes
+genotypic
+genotypical
+genotypically
+genotypicity
+genteelism
+gentilesse
+gentlefolk
+gentlefolks
+gentlemanlike
+gentlemanlikeness
+gentrice
+genuflect
+genuflected
+genuflecting
+genuflection
+genuflectory
+genuflects
+geocentrically
+geochemist
+geochronologic
+geochronological
+geochronologically
+geochronologist
+geochronometric
+geochronometry
+geode
+geode's
+geodes
+geodesist
+geodesy
+geodetical
+geodetically
+geoduck
+geohydrologic
+geohydrology
+geomagnetic
+geomagnetically
+geomagnetism
+geomancy
+geomantic
+geomorphic
+geophyte
+geopolitician
+geoponic
+geoponics
+georgic
+geoscience
+geostrategic
+geostrategist
+geostrategy
+geostrophic
+geostrophically
+geothermal
+geothermally
+geothermic
+geotropic
+geotropically
+geotropism
+geriatrician
+geriatricians
+geriatrist
+germania
+germfree
+germier
+germinability
+germproof
+germy
+gerome
+gerontic
+gerontocracy
+gerrymander
+gerrymandered
+gerundial
+gestational
+gesticulator
+gesticulators
+gesticulatory
+gestural
+getatable
+getup
+getups
+gewgaw
+ghastful
+ghastfully
+ghazal
+ghazals
+ghee
+ghostwrite
+ghostwriter
+ghosty
+gianthood
+gianthoods
+giantism
+giantisms
+giantlike
+gib
+gibberellin
+gibbing
+gibbosity
+gibby
+giddings
+gigantesque
+gigantically
+gigantism
+gigantisms
+giggly
+gigolo
+gigot
+gigots
+gildas
+gimbal
+gimbals
+gimcrackery
+gimlet
+gimlet's
+gimlets
+gimmal
+gimmickry
+gimmicky
+gimp
+gingersnap
+gingery
+gingko
+gioconda
+giraffish
+girlhood
+girlhoods
+girly
+girn
+giro
+gismo
+gismos
+givable
+gizzard
+gizzard's
+gizzards
+glaciologic
+glaciological
+glaciologist
+glaciology
+glacis
+gladded
+gladding
+gladiatorial
+gladiola
+gladsome
+gladsomely
+gladsomeness
+glady
+glandered
+glandless
+glans
+glarier
+glary
+glassblower
+glassblowing
+glassful
+glasshouse
+glassily
+glassine
+glassmaker
+glassmaking
+glasswork
+glassworker
+glassworks
+glazier
+glaziery
+gleamy
+gleanable
+gleesome
+glibber
+glibbest
+glioma
+glissade
+glittery
+gloam
+gloamed
+gloaming
+gloams
+globalism
+globalist
+globalists
+glom
+glomerular
+glomerulate
+glomming
+gloms
+glossarial
+glossarist
+glossily
+glossographer
+glossolalia
+gluconyl
+glucopyranosyl
+glucosamine
+glueing
+gluily
+glumaceous
+glummer
+glummest
+glutamate
+glutamic
+glutamine
+gluteal
+gluttonous
+gluttonously
+gluttonousness
+gluttony
+glyceryl
+glycine
+glycocholate
+glycocholates
+glycoconjugate
+glycoconjugates
+glycodeoxycholate
+glycodeoxycholates
+glycogen
+glycolipid
+glycolipids
+glycopeptide
+glycopeptides
+glycoprotein
+glycoproteins
+glycosidase
+glycosidases
+glycosidic
+glycosphingolipid
+glycosphingolipids
+glycosyl
+glycosylate
+glycosylated
+glycosylates
+glycosylation
+glynn
+gnarly
+gnatty
+gneissic
+gnomic
+gnomish
+gnomon
+gnosticism
+goalie
+goalkeeper
+goalpost
+goaltender
+goaltending
+goatish
+goatlike
+gobbledegook
+godchild
+goddaughter
+godded
+godding
+godforsaken
+godhood
+godkin
+godling
+godot
+godwit
+goethite
+gog
+goggly
+gogo
+goitrogen
+goitrogenic
+golda
+goldbeater
+goldbeating
+goldbrick
+goldbug
+goldeneye
+golem
+gomez
+gonad
+gonad's
+gonadal
+gonadotropic
+gonads
+gondolier
+gondoliers
+goo
+goodish
+goodnight
+goodwife
+goofball
+goofily
+googol
+googolplex
+goon
+gooseflesh
+gooseneck
+goosenecked
+goosey
+gorget
+gorgonian
+gorgously
+gorier
+gorse
+gory
+gossamery
+gossipry
+gossipy
+goucher
+gouda
+goulash
+gourde
+gourmandism
+gouty
+governable
+governessy
+governmentalism
+governmentalist
+governorate
+governorates
+governorship
+goyish
+goys
+grabbier
+grabble
+grabbled
+grabbler
+grabbles
+grabbling
+grabby
+graceless
+gracelessly
+gracelessness
+gracie
+gracileness
+gracility
+grackle
+gradable
+gradational
+gradationally
+gradeless
+gradiometer
+gradiometer's
+gradiometers
+gradualism
+graduator
+graftage
+grafton
+grainier
+graininess
+grainy
+gramicidin
+gramophone
+gramophone's
+gramophones
+gramps
+grandad
+grandaddy
+grandam
+grandame
+granddad
+grande
+grandee
+grandiloquence
+grandiosity
+grandioso
+grandparental
+grandparenthood
+grandsire
+grandsires
+grangerism
+granitic
+granivorous
+grantable
+grantsman
+grantsmanship
+granulator
+granulite
+granulitic
+granulocyte
+granulocytes
+grapeshot
+graphemic
+graphemically
+graphemics
+graphitic
+graphological
+graphologist
+graphology
+graphophone
+grapier
+grapnel
+grapy
+gras
+grasshopper
+grasshopper's
+grasslike
+grata
+graticule
+gratin
+gratulating
+graveless
+gravesend
+gravidity
+gravimeter
+gravimeter's
+gravimeters
+gravimetrically
+gravimetry
+gravitometer
+gravitometer's
+gravitometers
+graviton
+graviton's
+gravitons
+gravure
+grayish
+grayling
+graylings
+graywacke
+grazable
+grazeable
+grazier
+graziers
+greaseless
+greasepaint
+greasepaints
+greaseproof
+greasewood
+greasily
+greathearted
+greatheartedly
+greatheartedness
+greave
+greaves
+grebe
+greenback
+greenbacker
+greenbackism
+greengrocery
+greenhorn
+greenlet
+greenling
+greenroom
+greensward
+greentree
+greenware
+greeny
+gregarine
+gregarinian
+gremlin
+gremlin's
+gremlins
+gremmie
+gremmies
+gremmy
+grenadier
+grenadine
+grenier
+grep
+grewsome
+greylag
+gridlock
+gridlock's
+griefless
+grievant
+grillage
+grille
+grillroom
+grimier
+grimines
+grimmest
+grimy
+gringo
+gringos
+grinner
+grippe
+grippy
+gris
+gristle
+grith
+gritted
+grittily
+gritting
+grog
+groggily
+grogshop
+groomsman
+groot
+groovier
+groovy
+grosse
+grossular
+grossularite
+grotesquerie
+grotesquery
+grouch
+grouch's
+grouched
+grouches
+grouchily
+grouching
+groundling
+groundmass
+groundnut
+groundout
+groundsel
+groundsheet
+groundskeep
+groundwater
+groupable
+groupie
+groupie's
+groupies
+groupoid
+grubber
+grubbily
+grubstake
+grubstaker
+gruel
+grumbly
+grummet
+grump
+grumped
+grumpier
+grumpily
+grumpiness
+grumping
+grumps
+grumpy
+grunion
+gruntle
+gruntled
+gruntles
+gruntling
+grusky
+gryphon
+gtad
+guacamole
+guadalupe
+guanidine
+guanine
+guarantor
+guardant
+guardrail
+guardroom
+guardsman
+guava
+guck
+gudgeon
+guerdon
+guesstimate
+guff
+guggle
+guggled
+guggles
+guggling
+guhleman
+guidable
+guideway
+guignol
+guildship
+guildsman
+guileful
+guilefully
+guilefulness
+guillemot
+guillotine
+guillotine's
+guillotined
+guillotines
+guillotining
+guimet
+guimpe
+guisard
+gul
+gules
+gullable
+gullibly
+gulosity
+gumboil
+gumdrop
+gumdrop's
+gumdrops
+gummatous
+gummed
+gummer
+guncotton
+gundog
+gunlock
+gunmetal
+gunnar
+gunnysack
+gunplay
+gunpoint
+gunpowdery
+gunrunner
+gunrunning
+gunsel
+gunship
+gunsmith
+guppies
+guppy
+gurney
+gurneys
+gushier
+gushily
+gushiness
+gushy
+gustation
+gustative
+gustativeness
+gustatorial
+gustatorially
+gustatorily
+gustatory
+gustily
+gustoes
+gutless
+gutlessness
+guttate
+guttation
+guttersnipe
+guttersnipish
+guttier
+gutturalism
+gutty
+gymkhana
+gymnastically
+gymnosophist
+gypseous
+gyral
+gyrational
+gyrator
+gyrators
+gyratory
+gyre
+gyrene
+gyrfalcon
+gyrofrequency
+gyromagnetic
+gyron
+gyroplane
+gyroscopically
+gyrostat
+haberdasher
+habiles
+habiliment
+habilitate
+habilitated
+habilitates
+habilitating
+habilitation
+habilitations
+habitability
+habitably
+habitude
+habitudes
+habitus
+hac
+hackberry
+hackmatack
+hackstaff
+hadal
+haddix
+hade
+hades
+hadst
+hafiz
+haft
+haggadic
+haggadist
+haggadistic
+haggis
+haggish
+hagiographies
+hagiography
+hagiography's
+hah
+hairbreadth
+hairbrush
+haircloth
+haircutter
+haircutting
+hairlike
+hairpiece
+hairsbreadth
+hairsplitter
+hairsplitting
+hairspring
+hairspring's
+hairsprings
+hairstreak
+hairstyle
+hairstyle's
+hairstyles
+hairstyling
+hairstylist
+halberdier
+halfpennies
+halfpenny
+halftone
+halidom
+halitosis
+halliard
+halliards
+hallinan
+hallo
+halloo
+halloos
+halluces
+hallucinational
+hallucinatory
+hallucinogen
+hallucinogenic
+hallucinogens
+hallucinosis
+halma
+halocline
+haloes
+halogenate
+halogenation
+halogenous
+halomorphic
+halomorphism
+halpern
+haltere
+halvah
+halyard
+hamate
+hamey
+hammerlock
+hammertoe
+hammett
+hammier
+hammily
+hamminess
+hammy
+hamstring
+hamstrung
+handball
+handbill
+handbreadth
+handcar
+handcart
+handcraft
+handcraftman
+handcraftsman
+handcrank
+handcranks
+handfast
+handfasting
+handgrip
+handleless
+handline
+handlist
+handmaid
+handpick
+handpicked
+handpress
+handprint
+handprint's
+handprints
+handsaw
+handsbreadth
+handsful
+handshook
+handspring
+handsprings
+handwaving
+handwheel
+handwheels
+handwork
+handworker
+handwoven
+handwrought
+hangdog
+hangnail
+hangnail's
+hangnails
+hangtag
+hangup
+hankie
+hankies
+hanky
+hant
+hanter
+haole
+hapchance
+hapgood
+haphazardry
+haploid
+haploidy
+haplology
+happenchance
+happing
+hardback
+hardbake
+hardball
+hardboot
+hardbound
+hardcase
+hardcopies
+hardcopy
+hardcover
+hardcovers
+hardfisted
+hardfistedness
+hardhanded
+hardhandedness
+hardhead
+hardheaded
+hardheadedly
+hardheadedness
+hardhearted
+hardheartedly
+hardheartedness
+hardihood
+hardiment
+hardmouthed
+hardpan
+hardstand
+hardstanding
+harebrain
+harebrained
+harelipped
+harlequin
+harlequinade
+harlotry
+harmonica
+harmonica's
+harmonical
+harmonically
+harmonicalness
+harmonicas
+harmonium
+harridan
+harrumphs
+harvestable
+harvesttime
+haskell
+haskins
+hassock
+hassocks
+hast
+hastate
+hastately
+hatband
+hatbox
+hatchability
+hatchable
+hatcheck
+hatchling
+hatchment
+hatchments
+hatchure
+hatter
+hatting
+haulageway
+haulaway
+haulier
+hauser
+hausfrau
+hautboy
+hautboys
+haute
+hauteur
+haversack
+haversack's
+haversacks
+havocked
+havocking
+hawkish
+hawkishly
+hawkishness
+haycock
+hayfork
+haymaker
+haymaking
+haymow
+hayrack
+hayrick
+hayride
+hayseed
+hayseeds
+haywire
+haywood
+hazily
+headachy
+headband
+headcount
+headfirst
+headforemost
+headgroup
+headgroup's
+headgroups
+headhunter
+headily
+headlock
+headman
+headman's
+headmastership
+headmen
+headmen's
+headmistress
+headmost
+headnote
+headpiece
+headpin
+headrest
+headsail
+headshrinker
+headspring
+headstall
+headstock
+headstream
+headstrong
+headwaiter
+headwind
+headwind's
+headwinds
+headword
+headwork
+healths
+heartbroken
+hearthstone
+heartrending
+heartrendingly
+heartsease
+heartsick
+heartsickness
+heartsome
+heartsomely
+heartsore
+heartstring
+heartstrings
+heartwarming
+heartwood
+heathendom
+heathenism
+heathenry
+heathery
+heathless
+heathlike
+heathman
+heatless
+heatstroke
+heavyhearted
+heavyheartedly
+heavyheartedness
+heavyset
+hebdomad
+hebdomadal
+hebdomadally
+hebetation
+hebetude
+hebetudinous
+hectare
+hectically
+hectograph
+hectographic
+hedda
+heddle
+heddler
+hedgehop
+hedgehopper
+hedgepig
+hedgerow
+hedonic
+hedonically
+hedonics
+hedonistically
+hee
+heelball
+heelless
+heelpiece
+heeltap
+heftily
+hegel
+heidegger
+heigh
+heinze
+heirless
+heirloom
+heirship
+heiser
+heldentenor
+heliacal
+heliacally
+helicoid
+helicoidal
+helicopt
+helicopted
+helicopters
+helicopting
+heliochrome
+heliogram
+heliogram's
+heliograms
+heliograph
+heliographer
+heliographic
+heliography
+heliogravure
+heliolatrous
+heliolatry
+heliometer
+heliometer's
+heliometers
+heliometric
+heliometrically
+heliophyte
+heliopolis
+heliostat
+heliotaxis
+heliotropic
+heliotropically
+heliotropism
+heliozoan
+heliozoic
+helipad
+heliport
+helistop
+hellbox
+hellbroth
+hellcat
+hellebore
+hellgrammite
+hellhole
+hellhound
+hellion
+helmetlike
+helmsmanship
+helot
+helotism
+helotry
+helpmeet
+helve
+helved
+helves
+helving
+hemacytometer
+hemacytometer's
+hemacytometers
+hemal
+hematic
+hematin
+hematinic
+hematoblast
+hematoblastic
+hematocrit
+hematogenous
+hematologic
+hematological
+hematologist
+hematology
+hematoma
+hematophagous
+hemihedral
+hemihedrally
+hemihydrate
+hemihydrated
+hemimetabolic
+hemimetabolism
+hemimetabolous
+hemimorphic
+hemimorphism
+hemimorphite
+hemiparasite
+hemiparasitic
+hemiplegia
+hemiplegic
+hemispheral
+hemline
+hemmer
+hemoblast
+hemodynamically
+hemodynamics
+hemoflagellate
+hemoglobinic
+hemoglobinopathy
+hemoglobinous
+hemolymph
+hemolysin
+hemophilia
+hemophiliac
+hemophilic
+hemoprotein
+hemoptysis
+hemorrhagic
+hemorrhoid
+hemorrhoidal
+hemosiderin
+hemostasis
+hemostatic
+hempel
+hemus
+henae
+henbane
+henceforward
+hendecasyllabic
+hendecasyllable
+hendiadys
+hendrix
+henequen
+henna
+hennery
+henotheism
+henotheist
+henotheistic
+hent
+hep
+heparin
+hepatic
+hepatica
+hepatocellular
+hepatocyte
+hepatocyte's
+hepatocytes
+hepatoma
+heptagon
+heptagonal
+heptameter
+heptameter's
+heptameters
+heraldic
+heraldically
+heraldry
+herbaceous
+herbage
+herbalist
+herbarium
+herbicidal
+herbicidally
+herbicide
+herbicide's
+herbicides
+herblike
+herdic
+herdlike
+herdsmen
+hereaway
+hereaways
+hereditament
+hereditarian
+hereditarianism
+hereditarily
+hereinabove
+hereinbefore
+hereinbelow
+hereon
+heretical
+heretically
+hereticalness
+hereto
+hereunder
+hereupon
+heritability
+hermaphrodite
+hermaphrodite's
+hermaphrodites
+hermaphroditic
+hermaphroditically
+hermaphroditism
+hermatypic
+hermeneutic
+hermeneutical
+hermeneutically
+hermetical
+hermetically
+hermeticism
+hermetism
+hermetist
+hermitage
+hermitage's
+hermitages
+hermitism
+hern
+hernandez
+hernia
+hernia's
+hernial
+hernias
+herniate
+herniated
+herniates
+herniating
+herniation
+herniations
+heroical
+heroicomic
+heroicomical
+heroinism
+heronry
+herpesvirus
+herpetic
+herpetologic
+herpetological
+herpetologically
+herrington
+hersey
+herty
+hesiometer
+hesiometer's
+hesiometers
+hest
+heterarchy
+heterecious
+hetero
+heteroatom
+heteroautotrophic
+heterocycle
+heterocyclic
+heterocyst
+heterodox
+heterodoxy
+heteroecious
+heteroecism
+heterogamete
+heterogametic
+heterogenesis
+heterogenetic
+heterogeny
+heterogonic
+heterogony
+heterograft
+heterologously
+heterology
+heterolysis
+heterolytic
+heteromorphic
+heteromorphism
+heteromorphous
+heteronomous
+heteronomously
+heteronomy
+heterophil
+heterophile
+heterophony
+heterophyllous
+heterophylly
+heterophyte
+heterophytic
+heteroploid
+heteroploidy
+heteropolar
+heteropolarity
+heteropterous
+heteroscedasticity
+heterosexuality
+heterosis
+heterotic
+heterotopic
+heterotroph
+heterotrophic
+heterotrophically
+heterotypic
+heterotypical
+heterozygosis
+heterozygosity
+heterozygote
+hexad
+hexade
+hexadic
+hexagram
+hexahedron
+hexahydrate
+hexahydrated
+hexahydrite
+hexamethonium
+hexane
+hexaploid
+hexaploidy
+hexapod
+heywood
+hibernal
+hibernator
+hibiscus
+hickok
+hidalgo
+hidebound
+hidrosis
+hidrotic
+hie
+hieing
+hierarch
+hieratically
+hieroglyph
+hieroglyphical
+hieroglyphically
+higgle
+higgled
+higgler
+higgles
+higgling
+highbinder
+highborn
+highbred
+highbrow
+highbrowed
+highbrowism
+highline
+highlines
+hilding
+hillary
+hillocky
+hillyer
+hilum
+himation
+hindbrain
+hindquarter
+hingism
+hinkle
+hipbone
+hipped
+hipper
+hippest
+hippie
+hippocampal
+hippocampus
+hippocras
+hippogriff
+hipsterism
+hirey
+hirsute
+hirsuteness
+hirsutism
+hirsutulous
+hist
+histaminase
+histamine
+histaminergic
+histaminic
+histidine
+histologic
+histological
+histologically
+histologist
+histolysis
+histolytic
+histopathologic
+histopathological
+histopathologically
+histopathologist
+histopathology
+histophysiologic
+histophysiological
+histophysiology
+histoplasmosis
+historicist
+historiographer
+historiographic
+historiographical
+historiographically
+histrionically
+hithermost
+hitherward
+hiveless
+hmm
+hoarsen
+hoarsened
+hoarsening
+hobbledehoy
+hobday
+hobgoblin
+hobnail
+hobnailed
+hobnob
+hobnobbed
+hobnobber
+hobnobbing
+hobnobs
+hockaday
+hocus
+hocused
+hocusing
+hocussed
+hocussing
+hod
+hodad
+hodaddy
+hodoscope
+hoecake
+hoedown
+hoeing
+hogback
+hoggish
+hoggishly
+hoggishness
+hogshead
+hogwash
+hoi
+hoising
+hoistman
+hoistmen
+hokan
+hoke
+hokeypokey
+hoking
+hokum
+holabird
+holandric
+holandry
+holdall
+holdalls
+holdback
+holdfast
+holdout
+holdouts
+holeable
+holey
+holidaymaker
+holily
+holism
+holistically
+hollas
+hollo
+holloa
+holloware
+holoblastic
+holoblastically
+hologamous
+hologamy
+holograph
+holographic
+holographically
+hologynic
+hologyny
+holohedral
+holometabolism
+holometabolous
+holomyarian
+holophrastic
+holophytic
+holotype
+holotypic
+holozoic
+holt
+holzman
+hombre
+homburg
+homebody
+homebred
+homegrown
+homelike
+homeobox
+homeroom
+homesite
+homestretch
+hometown
+homey
+homeyness
+homier
+homiletic
+homiletical
+homiletically
+homiletics
+hominess
+hominid
+hominoid
+hominy
+homocercal
+homochromatic
+homoerotic
+homoeroticism
+homogametic
+homogamic
+homogamous
+homogeny
+homograft
+homograph
+homographic
+homoiotherm
+homoiothermal
+homoiothermic
+homolog
+homologate
+homologation
+homological
+homologically
+homolographic
+homolysis
+homolytic
+homomorphy
+homonuclear
+homonymic
+homonymous
+homonymously
+homonymy
+homoousian
+homophile
+homophobia
+homophone
+homophonic
+homophonous
+homophony
+homophyly
+homoplastic
+homoplastically
+homoplasy
+homopolar
+homopolymer
+homopteran
+homopterous
+homorganic
+homoscedastic
+homoscedasticity
+homosexuality
+homosporous
+homospory
+homothallic
+homothallism
+homotopy
+homotransplant
+homotransplantation
+homozygosis
+homozygosity
+homozygote
+homozygotic
+homunculi
+homunculus
+homy
+honcho
+honchos
+hondo
+honied
+honkeys
+honkie
+honoraria
+honorarily
+honorarium
+honorific
+honorific's
+honorifically
+honorifics
+hoodlike
+hoodlumish
+hoodlumism
+hoodoo
+hoodooism
+hoodoos
+hooey
+hoofbeat
+hoofprint
+hoofprint's
+hoofprints
+hookah
+hookey
+hookeys
+hooklet
+hooky
+hootch
+hootenanny
+hophead
+hopi
+hoplite
+hopple
+hora
+horary
+hord
+horehound
+horizonal
+hormonal
+hormonally
+hormonelike
+hornbeam
+hornbeams
+hornbill
+hornbills
+hornblende
+hornless
+hornlessness
+hornlike
+hornmouth
+hornpipe
+hornpipe's
+hornpipes
+hornswoggle
+hornswoggled
+hornswoggles
+hornswoggling
+horntail
+hornwort
+horologer
+horologic
+horological
+horologist
+horologists
+horology
+horrent
+horrific
+horrifically
+horsecar
+horsehide
+horselaugh
+horsemint
+horseradish
+horseradishes
+horseshit
+horsewhip
+horsewomen
+horsey
+horsier
+horsily
+horsiness
+horsy
+hortative
+hortatively
+hortatory
+horticultural
+horticulturally
+horticulturist
+hosanna
+hostel
+hosteler
+hostels
+hostler
+hotblood
+hotchpot
+hotchpotch
+hotelier
+hotfeet
+hotfoot
+hotfoot's
+hotfoots
+hotshot
+hottish
+houri
+housebound
+houseboy
+houseboys
+houseclean
+housecleaner
+housecleaning
+housecoat
+housedress
+housefather
+housefathers
+housefront
+houseful
+houseguest
+houseless
+houselessness
+houselights
+housemaid
+housemaids
+houseman
+housemate
+housemate's
+housemates
+housemother
+housemothers
+houseplant
+houseroom
+houseward
+housewarming
+housewifery
+howbeit
+howsoever
+howsomever
+hoyden
+hoydenish
+hoyle
+hubcap
+hubcap's
+hubcaps
+hubristic
+hubristically
+huck
+huckaback
+hucksterism
+hud
+huey
+huff
+huffier
+huffiness
+huffish
+huffy
+hugeous
+hugeously
+huggable
+hugger
+huggers
+hullabaloo
+hullabalooed
+hullabalooing
+hullabaloos
+hullo
+humanistically
+humanitarianism
+humankind
+humanlike
+humanoid
+humbug
+humbugged
+humbuggery
+humbugging
+humdinger
+humdrum
+humectant
+humeral
+humeri
+humerus
+humic
+humidor
+humification
+humifications
+humified
+hummable
+hummer
+hummocky
+humoresque
+humorism
+humorism's
+humorisms
+humoristic
+humoristical
+humoristical's
+humoristicals
+humoristics
+humph
+humpier
+humpty
+humpy
+hunchback
+hunchback's
+hunchbacked
+hunchbacks
+hundredweight
+hundredweights
+hup
+hurley
+hurly
+hurtless
+hurty
+hussar
+hussies
+hussy
+hustings
+hutzpah
+huzzah
+hyacinthine
+hyaena
+hyaenas
+hyalin
+hyaline
+hyalite
+hyaloid
+hyaloplasm
+hybridism
+hybridity
+hybris
+hydra
+hydrangea
+hydranth
+hydrator
+hydraulical
+hydrazide
+hydrazine
+hydric
+hydrically
+hydrobiological
+hydrobiologist
+hydrobiology
+hydrocarbonaceous
+hydrocarbonic
+hydrocarbonous
+hydrocephalic
+hydrocephalus
+hydrocephaly
+hydrocyanic
+hydrodynamical
+hydrodynamically
+hydrodynamicist
+hydroelectrically
+hydroelectricity
+hydrofoil
+hydroformer
+hydroforming
+hydrographer
+hydrographic
+hydrographically
+hydrography
+hydroid
+hydrokinetic
+hydrokinetics
+hydrolase
+hydrologic
+hydrologist
+hydrolysate
+hydrolytic
+hydrolytically
+hydromagnetic
+hydromagnetics
+hydromancy
+hydromechanical
+hydromechanics
+hydrometric
+hydrometrical
+hydrometry
+hydromorphic
+hydronic
+hydronically
+hydronium
+hydropathic
+hydropathically
+hydropathy
+hydroperoxide
+hydrophane
+hydrophile
+hydrophobicity
+hydrophone
+hydrophyte
+hydrophytic
+hydroplane
+hydroplaner
+hydroponic
+hydroponically
+hydroponics
+hydroscope
+hydrosere
+hydrosol
+hydrosolic
+hydrospace
+hydrospheric
+hydrostatical
+hydrostatically
+hydrosulfide
+hydrosulfite
+hydrotactic
+hydrotherapy
+hydrothorax
+hydrotropic
+hydrotropically
+hydrotropism
+hydroxylic
+hydroxyproline
+hydrozoan
+hyenic
+hyenoid
+hygienically
+hygienist
+hygienists
+hygrograph
+hygrometric
+hygrometry
+hygrophyte
+hygrophytic
+hygroscope
+hygroscopically
+hygroscopicity
+hyla
+hymenal
+hymeneal
+hymeneally
+hymenial
+hymenium
+hymnary
+hymnbook
+hymnody
+hymnology
+hyperacid
+hyperacidity
+hyperactive
+hyperactivity
+hyperbaric
+hyperbarically
+hyperbolical
+hyperbolist
+hyperborean
+hypercharge
+hypercritic
+hypercritical
+hypercritically
+hypercriticism
+hypereutectic
+hyperglycemia
+hyperglycemic
+hyperirritability
+hyperirritable
+hyperkeratosis
+hyperkeratotic
+hyperkinesis
+hyperkinetic
+hypermeter
+hypermeter's
+hypermeters
+hypermetric
+hypermetrical
+hypermetropia
+hypermetropic
+hypermetropical
+hypermetropy
+hypermnesia
+hypermnesic
+hypermorph
+hypermorphic
+hypermorphism
+hyperon
+hyperope
+hyperopia
+hyperopic
+hyperostosis
+hyperostotic
+hyperparasite
+hyperparasitic
+hyperparasitism
+hyperphagia
+hyperphysical
+hyperphysically
+hyperpituitarism
+hyperpituitary
+hyperplane
+hyperplanes
+hyperplastic
+hyperploid
+hyperploidy
+hypersensitive
+hypersensitiveness
+hypersensitivity
+hypersonic
+hypersonically
+hyperspace
+hypersurface
+hypertension
+hyperthermia
+hyperthermic
+hyperthyroid
+hyperthyroidism
+hypertonic
+hypertonicity
+hypertrophic
+hyperventilation
+hypha
+hyphal
+hyphenless
+hypnagogic
+hypnoanalysis
+hypnogenesis
+hypnogenetic
+hypnogenetically
+hypnogogic
+hypnoid
+hypnoidal
+hypnoses
+hypnotherapy
+hypnotism
+hypnotist
+hypnotists
+hypo
+hypocaust
+hypocentral
+hypochlorite
+hypochlorous
+hypochondria
+hypochondriac
+hypochondriacal
+hypochondriacally
+hypocoristic
+hypocoristical
+hypocoristically
+hypocritic
+hypocycloid
+hypodermically
+hypodermis
+hypoglycemia
+hypoglycemic
+hypoiodite
+hypomorphic
+hypos
+hypotension
+hypotensive
+hypothalmus
+hypothecate
+hypothecation
+hypothecator
+hypothenuse
+hypothermal
+hypothermic
+hypotonic
+hypotonically
+hypotonicity
+hypotrophy
+hypoxemia
+hypoxemic
+hypoxia
+hypoxic
+hypsography
+hypsometer
+hypsometer's
+hypsometers
+hypsometric
+hypsometry
+hysteretic
+hysteron
+iambus
+iambuses
+iatrogenic
+ibero
+ibex
+ibidem
+iceblink
+icebound
+icebreaker
+icecap
+icecap's
+icecaps
+icefall
+icehouse
+iceless
+iceman
+iceman's
+icemans
+ichneumon
+ichorous
+icily
+ickier
+icky
+iconically
+iconicity
+iconoclastic
+iconoclastically
+iconographer
+iconographic
+iconographical
+iconographically
+iconography
+iconolatry
+iconological
+iconology
+iconoscope
+icosahedra
+idealess
+idealistically
+ideality
+idealless
+idealogy
+ideational
+ideationally
+idem
+identic
+ideogram
+ideogram's
+ideogramic
+ideogrammatic
+ideogrammic
+ideograms
+ideograph
+ideographic
+ideographically
+ideography
+ideolect
+ideologic
+ideologue
+ideologues
+ideomotor
+ides
+idetic
+idiographic
+idiolectal
+idiomatically
+idiomorphic
+idiomorphically
+idiopathic
+idiopathically
+idioplasm
+idioplasmatic
+idioplasmic
+idiotical
+idioticalness
+idiotism
+idolater
+idolatrous
+idolatrously
+idolatrousness
+idyllically
+idyllist
+ie
+ignescent
+ignitable
+ignitible
+ignitor
+ignitron
+ignobility
+ignobly
+ignominiosness
+ignominy
+ignorable
+igor
+iguana
+ikon
+ilial
+illation
+illative
+illatively
+illaudable
+illaudably
+illegibility
+illegibly
+illiberal
+illiberalism
+illiberality
+illiberally
+illiberalness
+illimitability
+illimitably
+illiquid
+illiquidity
+illite
+illitic
+illogicality
+illon
+illuminable
+illuminance
+illuminant
+illuminati
+illuminator
+illuminators
+illuminism
+illuminist
+illus
+illusional
+illusionism
+illusionist
+illusionistic
+illusorily
+illust
+illustrational
+illuvial
+illuviate
+illuviation
+illuvium
+ilmenite
+im
+imaginal
+imaginarily
+imaginate
+imagism
+imagist
+imagistic
+imagistically
+imago
+imam
+imamate
+imaret
+imbecilic
+imbecility
+imbed
+imbibition
+imbibitional
+imbitter
+imbosom
+imbricate
+imbricately
+imbrication
+imbrown
+imbrue
+imbrued
+imbrute
+imbruted
+imbruting
+imdtly
+ime
+imidazole
+imide
+imidic
+imido
+imine
+imino
+imipramine
+imit
+imitational
+imitator
+immaculacy
+immane
+immanence
+immanency
+immanentism
+immanentist
+immanentistic
+immaterialism
+immaterialist
+immateriality
+immaturel
+immedicable
+immedicably
+immensurable
+immerge
+immerged
+immergence
+immerging
+immersible
+immesh
+immethodical
+immethodically
+immigrational
+imminency
+immingle
+immiscibility
+immiscible
+immiscibly
+immitigable
+immitigableness
+immitigably
+immittance
+immix
+immixture
+immoderacy
+immolate
+immolation
+immolator
+immoralist
+immotile
+immotility
+immunochemical
+immunochemically
+immunochemistry
+immunoelectrophoresis
+immunofluorescence
+immunofluorescent
+immunogenesis
+immunogenetic
+immunogenetically
+immunogenetics
+immunogenic
+immunogenically
+immunogenicity
+immunohematological
+immunohematology
+immunologic
+immunologist
+immunopathologic
+immunopathological
+immunopathologist
+immunopathology
+immunosuppression
+immunosuppressive
+immunotherapy
+immunotoxin
+immunotoxins
+immure
+immured
+immurement
+immures
+immuring
+immutability
+immutably
+impala
+impalement
+impalpability
+impalpably
+impanel
+imparadised
+imparity
+impartable
+impartible
+impartibly
+impartment
+impassability
+impassably
+impassibility
+impassible
+impassibly
+impassivity
+impeachable
+impeachment
+impeccability
+impecuniosity
+impecunious
+impecuniously
+impecuniousness
+impellor
+impendent
+impenitence
+impenitent
+impenitently
+imperate
+imperator
+imperatorial
+imperceptibility
+imperceptive
+imperceptiveness
+imperceptivity
+imperfectivity
+imperforate
+imperforated
+imperforates
+imperialistic
+imperialistically
+imperilment
+imperishability
+imperishably
+impermanency
+impermeability
+impermeably
+impermissibility
+impermissibly
+impersonality
+impersonator
+impertinence
+impertinency
+imperturbably
+impetrate
+impetrated
+impetrates
+impetrating
+impetration
+impetrations
+impetuosity
+impingement
+implacability
+implacably
+implantable
+implausibility
+implead
+implemental
+implode
+imploded
+implodes
+imploding
+implosion
+implosions
+implosive
+implosively
+impolitical
+impolitically
+imponderability
+imponderably
+importable
+importancy
+importunity
+imposthume
+imposture
+impoundment
+impracticability
+impracticably
+imprecatory
+impregnability
+impregnably
+impregnator
+impregnators
+impressibility
+impressibly
+impressionability
+impressionably
+impressional
+impressionistically
+imprimis
+imprisonable
+improbability
+improvability
+improvable
+improvably
+improvidence
+improvisator
+improvisatorial
+improvisatory
+improvisor
+imprudence
+impudicity
+impugnable
+impuissance
+impuissant
+imputability
+imputable
+imputative
+imputatively
+inadmissibly
+inadvertency
+inalienability
+inalienably
+inalterability
+inalterably
+inamorata
+inanition
+inapparent
+inappetence
+inapplicably
+inapposite
+inappositely
+inappositeness
+inaptitude
+inaugurator
+inaugurators
+inbound
+inbreathe
+incalculably
+incalescence
+incalescences
+incalescent
+incandesce
+incandesced
+incandescence
+incandesces
+incandescing
+incantational
+incantatory
+incapability
+incapacitator
+incardination
+incarnadine
+incase
+incaution
+incendiarism
+incertitude
+incessancy
+inchoate
+inchoately
+inchoateness
+inchoative
+inchoatively
+inchworm
+inchworm's
+inchworms
+incitant
+incitants
+incitation
+inclinable
+inclinational
+inclip
+includable
+includible
+incog
+incogitable
+incogitant
+incognita
+incognito
+incombustibility
+incommensurability
+incommensurably
+incommode
+incommodity
+incommunicability
+incommunicably
+incommunicative
+incommutably
+incompliant
+incompressibly
+incomputably
+inconceivability
+inconcinnity
+incondite
+inconscient
+inconsecutive
+inconsequence
+inconsequent
+inconsequentiality
+inconsolably
+inconsonant
+inconsumable
+inconsumably
+incontestability
+incontestably
+incontinency
+incontinent
+incontrovertibly
+inconveniency
+inconvertibly
+inconvincible
+incoordinate
+incoordination
+incorporator
+incorporeal
+incorporeity
+incorrigibility
+incorrigibly
+incorrupt
+incorrupted
+incorruptibly
+incorruptly
+incorruptness
+increate
+incrementalism
+incrementalist
+incrementalists
+increscent
+incriminate
+incriminated
+incriminates
+incrimination
+incriminatory
+incross
+incrossbred
+incrust
+incrustation
+incubational
+incubatory
+incudes
+inculcator
+inculpate
+inculpation
+inculpative
+inculpatory
+incult
+incumbency
+incumber
+incunabulum
+incurability
+incuriosity
+incurious
+incuriously
+incuriousness
+incurrence
+incurrent
+incurrer
+incurvate
+incurvated
+incurvates
+incurvating
+incurvation
+incurvature
+incurve
+incus
+incuse
+indagate
+indagation
+indagator
+indamine
+indecency
+indeclinable
+indecorum
+indefatigability
+indefatigably
+indefeasibility
+indefeasible
+indefeasibly
+indefectibility
+indefectible
+indefectibly
+indefensibility
+indefensibly
+indefinability
+indefinably
+indefinity
+indehiscence
+indehiscent
+indelibility
+indelicacy
+indemnifier
+indemnify
+indemonstrable
+indention
+independency
+indescribably
+indestructibility
+indestructibly
+indeterminably
+indeterminist
+indexical
+indican
+indicational
+indicatory
+indicia
+indictable
+indiction
+indictor
+indifferency
+indifferentism
+indifferentist
+indigen
+indigence
+indigene
+indigenes
+indigestibility
+indign
+indigotin
+indisciplinable
+indiscrete
+indiscussible
+indissociably
+indissolubility
+indissolubly
+indistinguishability
+indistinguishably
+indite
+indited
+inditer
+inditing
+indivertible
+indivertibly
+individualistically
+indivisibly
+indocile
+indocility
+indoctrinator
+indole
+indomitability
+indomitably
+indrawn
+indubitability
+indubitably
+inducibility
+indue
+indult
+indurate
+induration
+indurative
+indwell
+indweller
+indwelling
+inebriant
+inebriety
+inedible
+ineducability
+ineducable
+ineffability
+ineffably
+ineffaceability
+ineffaceably
+ineffectuality
+inelasticity
+inelegance
+ineliminable
+ineluctability
+ineluctably
+ineludible
+inenarrable
+ineptitude
+inequivalve
+inequivalved
+ineradicability
+ineradicably
+inerrancy
+inerrant
+inertance
+inestimably
+inexhaustibility
+inexhaustibly
+inexistence
+inexorability
+inexpedience
+inexpiably
+inexplicability
+inexpugnable
+inexpugnableness
+inexpugnably
+inexpungible
+inextinguishably
+inextricability
+infall
+infanta
+infantilism
+infantility
+infarct
+infarcted
+infarction
+infatuate
+infatuated
+infatuations
+infaunal
+infectivity
+infector
+infecundibility
+inferrer
+inferrible
+infestant
+infiltrator
+infiltrators
+infinitival
+inflammability
+inflammably
+inflammatorily
+inflationism
+inflationist
+inflator
+inflexion
+inflictor
+inflorescence
+inflorescences
+inflorescent
+informatics
+informatory
+infract
+infractor
+infrahuman
+infrangibility
+infrangible
+infrangibleness
+infrangibly
+infrasonic
+infraspecific
+infrastructural
+infrequence
+infrequency
+infundibular
+infundibulate
+infusibility
+infusoria
+infusorial
+infusorian
+ingather
+ingathering
+ingenue
+ingle
+ingratiatory
+ingress
+ingression
+ingressive
+ingressiveness
+ingrowing
+inguinal
+ingurgitate
+ingurgitation
+inhabitancy
+inhalational
+inhalator
+inharmonic
+inharmony
+inherence
+inheritability
+inhumanity
+inhumation
+inhume
+inhumed
+inhumes
+inhuming
+inimitably
+initialism
+initiatory
+initio
+injectant
+injector
+injectors
+injunct
+inkhorn
+inkiness
+inkle
+inkstand
+inkwell
+inky
+inmost
+innard
+innersole
+innerspring
+innervate
+innervated
+innervates
+innervating
+innervation
+innervational
+innerve
+innkeeper
+innkeeper's
+innkeepers
+innocency
+innominate
+innovational
+innovator
+innovatory
+innumerous
+inobservance
+inobservant
+inoculant
+inoculativity
+inoculator
+inoculum
+inoffensive
+inoffensively
+inoffensiveness
+inoperculate
+inosculate
+inosculated
+inosculates
+inosculating
+inosculation
+inositol
+inotropic
+inpatient
+inphase
+inpour
+inquisitional
+inquisitorial
+inquisitorially
+inrush
+insalubrious
+insalubrity
+insanitation
+insatiability
+insatiably
+insatiate
+insatiately
+insatiateness
+inscriptional
+inscriptive
+inscriptively
+inscroll
+inscrutably
+insculp
+inseam
+insectan
+insectary
+insecticidal
+insecticidally
+insectifuge
+insectile
+insectivore
+insectivore's
+insectivores
+insectivorous
+insectivory
+inseminator
+insentience
+insentient
+insertional
+insessorial
+insetted
+inshore
+insignificancy
+insinuator
+insipidity
+insistency
+insolate
+insolation
+insole
+insolubly
+insolvably
+insoul
+inspan
+inspectorate
+inspectorship
+insphere
+inspirator
+inspiratory
+inspirit
+inspissate
+inspissated
+inspissation
+inspissator
+instalment
+instalments
+instancy
+instantaneity
+instar
+instate
+instating
+instauration
+instil
+instillment
+instils
+institutionalism
+institutor
+instructorship
+instructress
+instrumentalism
+instrumentality
+insubstantiality
+insufferableness
+insufferably
+insufficience
+insufflate
+insufflated
+insufflates
+insufflating
+insufflation
+insufflator
+insugently
+insulant
+insularism
+insupportably
+insuppressibly
+insurability
+insurable
+insurgency
+insurmountably
+insuror
+insurrectional
+insurrectionary
+insurrectionist
+insusceptibly
+intaglio
+intangibility
+integrability
+integrality
+integrationist
+integrator
+integumental
+integumentary
+intellection
+intellectualism
+intellectualist
+intellectualistic
+intellectus
+intelligential
+intendance
+intendment
+intenerate
+inteneration
+intentionality
+intepupillary
+interactant
+interactional
+interatomic
+interbrain
+interbreed
+intercalary
+intercellular
+intercellularly
+intercession
+intercessional
+intercessor
+intercessory
+interclavicle
+interclavicular
+intercolumniation
+intercommunion
+intercomputer
+interconversion
+interconvert
+interconvertibility
+interconvertible
+intercooler
+intercostal
+intercostally
+intercrisis
+intercrop
+intercross
+intercultural
+interculturally
+intercurrent
+intercurrently
+intercut
+interdenominationalism
+interdental
+interdentally
+interdepend
+interdiction
+interdictor
+interdictory
+interdiffuse
+interdiffusion
+interdigitate
+interdigitation
+interfacial
+interfascicular
+interferential
+interferogram
+interferogram's
+interferograms
+interferometrically
+interfertile
+interfertility
+interfile
+interframe
+interfuse
+interfusion
+intergeneric
+intergradation
+intergradational
+intergrade
+intergrowth
+interhemispheric
+interionic
+interiority
+interjection
+interjectional
+interjectionally
+interjector
+interjectory
+interlacement
+interlaminate
+interlamination
+interlard
+interleaf
+interline
+interlinear
+interlinearly
+interlineation
+interlocal
+interlocution
+interlocutory
+interlope
+interloped
+interloper
+interlopes
+interloping
+interlunar
+interlunary
+intermarry
+intermeddle
+intermeddler
+intermediacy
+intermembrane
+intermetallic
+intermezzo
+intermit
+intermittence
+intermitter
+intermixture
+internality
+internationalism
+interne
+internecine
+internee
+internescine
+interneuron
+interneuronal
+internist
+internment
+internodal
+internode
+internship
+internuclear
+internuncial
+internuncially
+internuncio
+interoceptive
+interoceptor
+interoffice
+interpellate
+interpellation
+interpellator
+interpenetrate
+interpenetration
+interphase
+interplant
+interplead
+interpleader
+interpolator
+interpolatory
+interpretability
+interpretational
+interreligious
+interring
+interrogational
+interrogee
+interrogees
+interscholastic
+intersectoral
+interservice
+intersession
+intersex
+intersexual
+intersexuality
+intersexually
+interspace
+interspecific
+interstadial
+intersterile
+intersterility
+intersubjective
+intersubjectively
+intersubjectivity
+intertestamental
+intertidal
+intertidally
+intertie
+intertill
+intertillage
+intertropical
+intertwinement
+intertwist
+interurban
+intervale
+intervalometer
+intervalometer's
+intervalometers
+interventionism
+intervertebral
+intervertebrally
+interwar
+interweave
+interweaves
+interzonal
+interzone
+intestacy
+intima
+intimidator
+intimidatory
+intinction
+intine
+intitule
+intl
+intnl
+intonational
+intraarterial
+intraarterially
+intracardiac
+intracardial
+intracardially
+intracellular
+intracellularly
+intracranial
+intracranially
+intracutaneous
+intracutaneously
+intradermal
+intradermally
+intrados
+intraepithelial
+intragalactic
+intramolecular
+intramolecularly
+intrans
+intransigeance
+intransigeant
+intransigeantly
+intrant
+intraperitoneal
+intraperitoneally
+intrapersonal
+intrapopulation
+intrapsychic
+intrapsychically
+intraspecies
+intraspecific
+intraspecifically
+intrauterine
+intravascular
+intravital
+intravitally
+intravitam
+intrazonal
+intreat
+intrench
+intrepidity
+intrigant
+intriguant
+intrinsical
+intrinsicalness
+introductorily
+introgressant
+introgression
+introgressive
+introit
+introjection
+intromission
+intromit
+intromittent
+intromitter
+introrse
+introrsely
+introspectional
+introspectionism
+introspectionist
+introspectionistic
+introversive
+introversively
+intrvascularly
+intsv
+intuit
+intuiting
+intuitional
+intuitionism
+intumesce
+intumescence
+intumescent
+intussuscept
+intussusception
+intussusceptive
+inulin
+inundator
+inundatory
+inurement
+inurn
+inutility
+inv
+invaginate
+invaginated
+invaginates
+invaginating
+invagination
+invalidator
+inveiglement
+invenit
+inventorial
+inventorially
+inventress
+invercalt
+invertase
+investable
+investigational
+investiture
+inveteracy
+invictus
+invigorator
+inviible
+invincibility
+invincibly
+inviolableness
+inviolably
+inviolacy
+inviscid
+invitatory
+invocational
+invocatory
+involucral
+involucrate
+involucre
+involucred
+involucrum
+involutional
+involutionary
+invulnerably
+inweave
+iodic
+iodin
+iodoamino
+iodocompounds
+iodoform
+iodophor
+iodoprotein
+iodopsin
+iodothyronines
+iodotyrosines
+iodous
+ione
+ionicity
+ionium
+ionospherically
+iosola
+iotacism
+ipecacuanha
+iproniazid
+ipsilateral
+ipsilaterally
+iraqi
+irascibility
+irascible
+irascibleness
+irascibly
+ireful
+irenaeus
+irenic
+irenically
+irenics
+irid
+iridaceous
+irides
+iridescence
+iridescent
+iridescently
+iridic
+iridosmine
+irina
+ironbound
+ironclad
+ironfisted
+ironhanded
+ironhandedly
+ironhandedness
+ironhearted
+ironist
+ironmaster
+ironmonger
+ironmongery
+ironware
+ironweed
+irradiance
+irradiator
+irradicable
+irradicably
+irrationalism
+irrationalist
+irrationalistic
+irreal
+irreality
+irreclaimable
+irreclaimably
+irreconcilability
+irreconcilably
+irreconciliable
+irrecoverably
+irrecusable
+irrecusably
+irred
+irredenta
+irreducibility
+irreformability
+irreformable
+irrefragability
+irrefragable
+irrefragably
+irrefrangible
+irrefutability
+irrefutably
+irreg
+irregardless
+irrelative
+irrelatively
+irreligion
+irreligionist
+irreligious
+irreligiously
+irremeable
+irremediably
+irremovability
+irremovably
+irrepealability
+irrepealable
+irreplaceability
+irreplaceably
+irrepressibility
+irrepressibly
+irreproachability
+irreproachably
+irresoluble
+irrespirable
+irresponsive
+irresponsiveness
+irretrievability
+irretrievably
+irreversibility
+irrevocability
+irrigational
+irrigationists
+irrigator
+irrigators
+irrotational
+irrotationally
+irrupt
+irrupted
+irrupting
+irruptive
+irruptively
+irrupts
+isentropic
+islandia
+ism
+isoagglutination
+isoagglutinative
+isoagglutinin
+isoagglutinogen
+isoalloxazine
+isoantibody
+isoantigen
+isoantigenic
+isoantigenicity
+isobar
+isobaric
+isobutylene
+isochromatic
+isochron
+isochrone
+isochronism
+isoclinal
+isoclinally
+isoclinic
+isoclinically
+isogram
+isogram's
+isograms
+isolationist
+isolator
+isologue
+isomagnetic
+isomerase
+isomeric
+isomerism
+isomerous
+isometrical
+isometrically
+isometry
+isomorphous
+isoniazid
+isonomy
+isooctane
+isophotal
+isophote
+isopiestic
+isotonically
+isotonicity
+isotopically
+isotopy
+isozyme
+isozymic
+issuable
+issuably
+issueless
+isthmic
+italianate
+itchiness
+itchy
+iterance
+iterant
+itineracy
+itinerancy
+itinerate
+itinerated
+itinerates
+itinerating
+itineration
+itsy
+iud
+iuds
+izaak
+jabber
+jabbered
+jabberer
+jabbering
+jabbers
+jabberwocky
+jabot
+jackal
+jackal's
+jackals
+jackanapes
+jackassery
+jacketted
+jacketting
+jackhammer
+jackscrew
+jacobite
+jacoby
+jacquerie
+jactitation
+jagger
+jaggery
+jaggy
+jai
+jailbait
+jailbird
+jailbreak
+jailor
+jalousie
+jamb
+jambalaya
+jammer
+janis
+janitress
+japanned
+japanner
+japanning
+jape
+japer
+japery
+japes
+japing
+japonica
+jardiniere
+jarful
+jargonistic
+jasmine
+jauntily
+java
+javanese
+jawbreaker
+jawline
+jaybird
+jazzily
+jazzman
+jeanne
+jeepable
+jeeringly
+jell
+jelled
+jelling
+jello
+jells
+jellylike
+jerkily
+jerkin
+jerkwater
+jeroboam
+jessy
+jesuitic
+jesuitical
+jesuitically
+jesuitry
+jetbead
+jetport
+jetsam
+jettied
+jetties
+jettisonable
+jetty
+jettying
+jeunes
+jib
+jibber
+jibbers
+jibbing
+jibboom
+jiff
+jigged
+jigglier
+jiggly
+jimjams
+jingly
+jingo
+jingoes
+jingoish
+jingoism
+jingoist
+jingoistic
+jingoistically
+jink
+jinks
+jinn
+jinni
+jinny
+jitney
+jitneys
+jiujutsu
+jobbed
+jobber
+jobbers
+jobrel
+jocosity
+jocularity
+jocundity
+jodhpur
+jodhpurs
+jogger
+joggers
+jogging
+joinable
+joinder
+joinery
+jointress
+jointure
+jointured
+jointures
+jointuring
+jointworm
+joist
+joists
+jollification
+jollifications
+jolty
+jouncier
+jouncy
+jour
+journalistically
+journeywork
+jow
+jowlier
+jowly
+joyance
+jubilarian
+judgmatic
+judgmatical
+judgmatically
+judoist
+jugful
+jugged
+juggernaut
+juggernaut's
+juggernauted
+juggernauting
+juggernauts
+jugglery
+jugular
+jugulum
+juiceless
+juicily
+jujitsu
+jujutsu
+jukebox
+julienne
+junco
+junctional
+junctor
+jungian
+jungly
+junkyard
+junto
+juntos
+jural
+jurally
+jurassic
+jurat
+jure
+jurel
+juridic
+jurisconsult
+jurisconsults
+juristic
+juristically
+jussive
+jussives
+juste
+justiciability
+justiciar
+justifiability
+justificative
+justificatory
+justment
+jutted
+juttied
+jutties
+jutty
+juttying
+juvenescence
+juvenescent
+juvenilia
+juvenility
+juvenocracy
+juxtapositional
+kaftan
+kaiser
+kale
+kaleidoscope
+kaleidoscoped
+kaleidoscopes
+kaleidoscopic
+kaleidoscopical
+kaleidoscopically
+kaleidoscoping
+kalmia
+kapok
+kaput
+karateist
+karma
+karmic
+karyatid
+katydid
+kava
+kayak
+kayaker
+kayaks
+kayo
+kayoed
+kayoing
+kebab
+kebabs
+keddah
+keegan
+keelboat
+keelhaul
+keelless
+keelson
+keepsake
+keepsakes
+keeshond
+kegful
+kegsful
+kelts
+kerchieves
+kern
+kerne
+kernite
+kerosine
+kerry
+kerygma
+kestrel
+ketch
+ketches
+ketene
+keto
+ketogenesis
+ketogenic
+ketonic
+ketose
+ketosteroid
+ketotic
+kettledrum
+kewaskum
+kewaunee
+keybutton
+keyless
+keyway
+keyways
+khrush
+kibble
+kibbled
+kibbles
+kibbling
+kibbutz
+kibbutznik
+kibe
+kibosh
+kickapoo
+kickshaw
+kickshaws
+kickstand
+kickup
+kickups
+kiddish
+kiddush
+kiddy
+kidskin
+kiel
+kielbasa
+killdeer
+killebrew
+kiln
+kilo
+kilobar
+kilocalorie
+kilocalories
+kilocurie
+kilocycle
+kilocycles
+kilooersted
+kiloparsec
+kilorad
+kilos
+kilt
+kilter
+kindergartner
+kindless
+kindlessly
+kine
+kinematical
+kinematically
+kinescope
+kinescoped
+kinescopes
+kineses
+kinesic
+kinesiology
+kinesis
+kineticist
+kinetin
+kinetochore
+kinetonucleus
+kinetoplast
+kinetoplastic
+kinetoscope
+kinetosome
+kinfolk
+kinfolks
+kingfish
+kingmaker
+kingship
+kingside
+kingwood
+kinkajou
+kinkajou's
+kinnickinnic
+kinsey
+kinsfolk
+kinswoman
+kip
+kipper
+kippered
+kippering
+kippers
+kips
+kirk
+kirkwood
+kirsch
+kismet
+kissable
+kitchenware
+kitchenwares
+kith
+kithe
+kithing
+kitschy
+kittle
+kittled
+kittler
+kittles
+kittling
+kiva
+kivu
+kiwi
+kiwi's
+kiwis
+kiz
+kizzie
+klatch
+klatsch
+klauber
+kleptomania
+kleptomaniac
+kline
+knackery
+knavery
+knavish
+knavishly
+kneadable
+kneehole
+kneeholes
+knickknack
+knifelike
+knish
+knitter
+knitwear
+knobbed
+knobeloch
+knockabout
+knockabouts
+knothole
+knotter
+knotweed
+knout
+knoweth
+knowily
+knowledgeability
+knowledgeably
+knucklebone
+knucklebones
+knucklehead
+knuckleheaded
+koine
+koinonia
+kola
+kolkhoz
+kombu
+konga
+konrad
+kook
+kookaburra
+kookie
+kookier
+kookiness
+kooky
+kooning
+kopeck
+kopek
+kowtow
+kpc
+kraemer
+kraken
+kremlinologist
+kremlinology
+kretchmer
+krummholz
+kudo
+kudu
+kulak
+kultur
+kurdish
+kwashiorkor
+labdanum
+labellate
+labellum
+labia
+labiate
+lability
+labium
+laborious
+laboriously
+laboriousness
+laborsaving
+labradorite
+labyrinthian
+labyrinthine
+laceless
+lacelike
+lacemaker
+lacewing
+lacework
+lacey
+laches
+lachrymal
+lachrymator
+lachrymose
+lachrymosely
+lacier
+laciniate
+laciniated
+laciniation
+lackaday
+laconic
+laconically
+laconics
+laconism
+laconisms
+lacrimal
+lacrimation
+lacrimator
+lactase
+lacteal
+lactic
+lactiferousness
+lactobionamide
+lactobionamides
+lactobionic
+lactobionyl
+lactogenic
+lactoglobulin
+lactone
+lactonic
+lacunal
+lacunar
+lacunaria
+lacunary
+lacunate
+lacustrine
+lacy
+ladanum
+laddie
+lade
+ladybird
+ladybird's
+ladybirds
+ladybug
+ladybug's
+ladybugs
+ladyfern
+ladyfinger
+ladykin
+ladylove
+ladyship
+lage
+lagger
+lagniappe
+lagomorph
+lagomorphic
+lagomorphous
+lagoonal
+laguna
+laic
+laical
+laically
+laicism
+laird
+lairdly
+laitance
+laitances
+lakefront
+lakeshore
+lakewood
+lakh
+laky
+lallygag
+lallygagged
+lam
+lama
+lamasery
+lambast
+lambaste
+lambency
+lambent
+lambently
+lambert
+lambertian
+lambeth
+lambkill
+lambskin
+lamebrain
+lamebrained
+lamella
+lamellae
+lamellar
+lamellarly
+lamellas
+lamellate
+lamellately
+lamellation
+lamelliform
+lametedly
+lamia
+laminal
+laminaria
+laminarian
+laminarin
+laminator
+laminin
+lampoonery
+lamster
+lanai
+lancelet
+lanceolate
+lanceolately
+lancet
+lanceted
+lancinate
+lancinated
+lancinates
+lancinating
+lancination
+lancinations
+landaulet
+landes
+landfall
+landform
+landlocked
+landlordism
+landlubber
+landlubberly
+landmass
+landmasses
+landowning
+landside
+landslip
+landslips
+landsman
+landward
+landwards
+lanesmanship
+langeland
+languishment
+languorous
+languorously
+langur
+lankily
+lanolin
+lanuginous
+lanuginousness
+lanyard
+laodicean
+laparotomy
+lapboard
+lapdog
+lapful
+lapidarian
+lapper
+lappet
+lapstrake
+lapstreak
+lapwing
+larcener
+larcenist
+larcenous
+larcenously
+lardy
+lares
+largehearted
+largess
+larghetto
+largish
+largo
+largos
+larkier
+larkspur
+larky
+larvicidal
+larvicide
+larynges
+laryngitis
+laryngology
+laryngoscope
+laryngoscopic
+lasagna
+lasagne
+lascar
+lase
+lassie
+lassies
+lassitude
+lassitudes
+lassoes
+latchet
+latchkey
+latchstring
+latecomer
+latecomers
+lateen
+lateener
+lateiner
+latened
+latening
+latensification
+latensifications
+latensified
+latensifies
+latensify
+latera
+laterite
+lathery
+latices
+laticiferous
+latish
+latitudinarian
+latitudinarianism
+latten
+latticework
+lattimer
+latus
+laudability
+laudable
+laudableness
+laudation
+laudations
+laudative
+laudatorily
+laughterful
+launderability
+launderette
+launderettes
+laundress
+laundryman
+laundrywoman
+laurate
+laureateship
+lavabo
+lavage
+lavaged
+lavalava
+lavaliere
+lavalike
+lavallade
+lavalliere
+lavation
+lavational
+lavato
+lave
+laveer
+laver
+laverock
+laving
+lawmaker
+lawny
+laxation
+layabout
+layabouts
+layaway
+layerage
+layette
+layover
+layovers
+laypeople
+laywoman
+laywomen
+laze
+lazes
+lazyish
+lea
+leachable
+leadeth
+leadier
+leadless
+leadoff
+leadwork
+leady
+leafage
+leaflike
+leafstalk
+leafstalks
+leakily
+leant
+leapfrogged
+leapfrogging
+learnable
+leary
+leastways
+leastwise
+leasure
+leatherback
+leatherlike
+leatherwork
+lecherous
+lecherously
+lecherousness
+lecithin
+lecithinase
+lectern
+lectern's
+lecterns
+lectin
+lectin's
+lectins
+lection
+lectionary
+lectureship
+lederhosen
+ledgy
+leeboard
+leeds
+leftism
+legalese
+legalism
+legalist
+legalistic
+legalistically
+legateship
+legatine
+legator
+legendarily
+legendry
+legerity
+leges
+legionary
+legionnaire
+legionnaires
+legis
+legislatorial
+legislatorship
+legislatress
+legislatrix
+legist
+legit
+legitimism
+legitimist
+legless
+legman
+legroom
+legwork
+lei
+leith
+lemke
+lemony
+lemur
+lemures
+lengthways
+lenience
+lenis
+lenitive
+lenitively
+lenity
+lense
+lensless
+lenticulate
+lenticulation
+lentissimo
+lento
+leopardess
+leotard
+leotards
+lepidolite
+lepidopterist
+leprechaun
+leprechauns
+leprotic
+leprous
+leprously
+leprousness
+lepton
+lepton's
+leptons
+leptospiral
+les
+lesbianism
+lessee
+letch
+letdown
+letdowns
+lethargic
+lethargically
+letted
+letterpress
+letup
+leu
+leucine
+leucite
+leucitic
+leucoma
+leukemic
+leukemoid
+leukocyte
+leukocytic
+lev
+levanter
+levator
+levatores
+levators
+leveeing
+levelheaded
+levelheadedness
+leven
+leveret
+leviathan
+leviathan's
+levigate
+levigated
+levigates
+levigating
+levigation
+levirate
+leviratic
+levitational
+levorotation
+levorotatory
+levulose
+lewellyn
+lewisite
+lexica
+lexicality
+lexicographer
+lexicographer's
+lexicographers
+lexicography
+lexicostatistic
+lexicostatistics
+ley
+liaise
+liaised
+liaises
+liaising
+liana
+lib
+libationary
+libelist
+liber
+liberace
+liberalist
+liberalistic
+liberationist
+liberationists
+libertarianism
+libertie
+libertinage
+libertinism
+libidinal
+libidinally
+libra
+librae
+librarianship
+librate
+libration
+librational
+libratory
+libriform
+licating
+licenseless
+licenselesses
+licensure
+licentiate
+licentiateship
+lichee
+lichenous
+licht
+lichtenstein
+lichter
+lickerish
+lickerishly
+lickerishness
+lickspittle
+lictor
+lidded
+lido
+lidocaine
+lidos
+lieberman
+lief
+lierne
+lieutenancy
+lieve
+lifeful
+lifeline
+lifelines
+lifemanship
+lifesaver
+lifeway
+lifework
+liftable
+liftman
+ligamentary
+ligamentous
+ligate
+ligated
+ligates
+ligating
+ligation
+ligations
+lighterage
+lightface
+lightfaced
+lightfooted
+lightfootedly
+lightfootedness
+lightful
+lighthanded
+lighthandedness
+lightheaded
+lightish
+lightless
+lightship
+lightsome
+lightsomely
+lightsomeness
+lightyear
+lightyears
+ligneous
+lignification
+lignified
+lignifies
+lignify
+lignifying
+lignin
+lignitic
+lignocellulose
+ligulate
+ligule
+ligure
+likability
+likable
+likableness
+lilliput
+lilliputian
+limba
+limbless
+limbus
+limeade
+limekiln
+limen
+limey
+limier
+liminal
+limitable
+limitary
+limitational
+limitative
+limitrophe
+limmer
+limn
+limner
+limnetic
+limnic
+limning
+limnological
+limnologically
+limnologist
+limnology
+limo
+limo's
+limonene
+limonite
+limonitic
+limos
+limpet
+limpidity
+limpkin
+limpsy
+limulus
+limy
+linac
+linage
+linate
+linated
+lination
+linchpin
+linchpin's
+linchpins
+lindy
+lineality
+lineament
+lineamental
+lineation
+linebacking
+linebreed
+linecaster
+linecasting
+lineolate
+lineolated
+lineprinter
+lineprinter's
+lineprinters
+linerless
+linesman
+linga
+lingoes
+lingonberry
+linguae
+linguine
+linguistical
+linguistician
+lingulate
+linin
+linkboy
+linkman
+linksman
+linkup
+linoleate
+linoleic
+linolenate
+linos
+lintel
+linty
+linum
+lionhearted
+lionlike
+lipide
+lipidic
+lipless
+liplike
+lipolysis
+lipolytic
+lipped
+lippen
+lippier
+lipping
+lippy
+lipread
+lipreading
+liquate
+liquated
+liquates
+liquating
+liquation
+liquations
+liquefactive
+liquefactive's
+liquefactives
+liquefiability
+liquefiable
+liquescent
+liquidator
+liquorice
+lira
+liras
+lire
+lisle
+liss
+lissom
+lissome
+lissomely
+lissomeness
+liste
+listel
+listenable
+listeriosis
+liston
+literalist
+literalistic
+literality
+literarily
+literati
+literatim
+literator
+literatus
+litharge
+lithesome
+lithia
+lithiasis
+lithic
+lithically
+litho
+lithographic
+lithographically
+lithologic
+lithological
+lithologically
+lithophane
+lithophyte
+lithophytic
+lithopone
+lithos
+lithosol
+lithotomy
+lithuanian
+litigable
+litotes
+litterateur
+litterbag
+littermate
+littermate's
+littermates
+littery
+liturgiologist
+liturgiology
+liturgist
+litz
+liveability
+liveable
+livelily
+livelong
+liverish
+liverishness
+liveryman
+lividity
+livlihood
+lixiviate
+lixiviated
+lixiviates
+lixiviating
+lixiviation
+lizzy
+llama
+llama's
+llamas
+llano
+llanos
+lo
+loach
+loaches
+loanable
+loanword
+loanword's
+loanwords
+lobar
+lobate
+lobated
+lobately
+lobation
+lobbing
+lobbyer
+lobbyism
+lobbyist
+lobectomy
+lobelia
+lobeline
+loblolly
+lobo
+lobos
+lobscouse
+lobsterman
+lobstermen
+lobulate
+lobulated
+lobulation
+lobulose
+localism
+localite
+locatable
+loch
+lockable
+lockage
+lockbox
+locket
+lockies
+lockjaw
+lockstep
+lockstitch
+loco
+locoes
+locofoco
+locoism
+locomote
+locomoted
+locomotes
+locomoting
+locular
+loculate
+loculated
+loculation
+locule
+loculed
+loculus
+locution
+locutor
+lode
+loden
+lodestar
+lodgement
+loess
+loftily
+logbook
+loggets
+loggia
+loggie
+loggy
+logia
+logicality
+logistician
+lognormal
+lognormality
+lognormally
+logo
+logogram
+logogram's
+logogrammatic
+logograms
+logograph
+logographic
+logographically
+logogriph
+logomachy
+logorrheic
+logos
+logotype
+logroll
+logroller
+logrolling
+logwood
+logy
+lollipop
+lollop
+lollygag
+lollypop
+londonderry
+lonelily
+longanimity
+longanimous
+longboat
+longboats
+longbow
+longbowman
+longeron
+longevous
+longhair
+longhaired
+longhead
+longheaded
+longheadedness
+longhouse
+longlegs
+longline
+longshoreman
+longshoring
+longsome
+longsomely
+longsomeness
+longspur
+longstreet
+longue
+longwinded
+loo
+loobies
+looby
+looney
+loonier
+looniness
+loony
+loosestrife
+lopper
+loppier
+loppy
+lopseed
+loquat
+loran
+lorans
+lorca
+lordling
+lordosis
+lordotic
+loreal
+lorgnette
+lorgnettes
+lorgnon
+lorgnons
+loricate
+loricated
+loris
+lorn
+lornness
+lory
+los
+losable
+losableness
+losel
+loth
+lotharios
+lotos
+lotted
+lotting
+lotto
+loudmouth
+loudmouthed
+lough
+loup
+loupe
+louping
+lousily
+lout
+loutish
+loutishly
+loutishness
+louts
+loveable
+lovejoy
+lovelily
+lovelock
+lovelocks
+lovemaking
+lovesick
+lovesickness
+lovesome
+lowborn
+lowbred
+lowbrow
+lowermost
+lowery
+lowlihead
+lowlily
+lown
+lox
+loxes
+loxodrome
+loxodromic
+loxodromically
+loxodromics
+loy
+loyola
+lubber
+lubberland
+lubberlanders
+lubberliness
+lubberly
+lubbers
+lube
+lubric
+lubrical
+lubricator
+lubricous
+lubritorium
+lucency
+lucien
+luciferous
+lucubrate
+lucubrated
+lucubrates
+lucubrating
+lucubration
+lucubrations
+lucubrator
+luculent
+luculently
+ludmilla
+lues
+luetic
+luetically
+luggageless
+lugger
+lugubrious
+lugubriously
+lugubriousness
+lukemia
+lum
+lumbago
+lumberjack
+lumberjack's
+lumberjacks
+lumbian
+lumenal
+lumens
+lumina
+luminaire
+luminal
+luminance
+luminesce
+luminesced
+luminescing
+luminiferous
+luminist
+lummus
+lumpily
+luncheonette
+lune
+lunes
+lunette
+lungfish
+lunisolar
+lunitidal
+lunker
+lunkhead
+lunkheaded
+lunt
+lunule
+luny
+lupanar
+lupulin
+lupus
+lurdane
+lusion
+lustihood
+lustra
+lustral
+lustrate
+lustrated
+lustrates
+lustrating
+lustration
+lustrations
+lustrum
+luteal
+lutenist
+luteous
+lutetium
+lutihaw
+lux
+luxate
+luxated
+luxates
+luxating
+luxation
+luxations
+lycanthropic
+lycanthropy
+lycee
+lyceum
+lychee
+lychnis
+lycidas
+lymphadenitis
+lymphatic
+lymphatically
+lymphoblast
+lymphoblastic
+lymphocytic
+lymphocytosis
+lymphoid
+lymphomatoid
+lymphomatosis
+lymphomatous
+lymphopoiesis
+lyndon
+lyonnaise
+lyophile
+lyophilic
+lyophobic
+lyotropic
+lyrate
+lyrated
+lyrately
+lyrebird
+lyrebird's
+lyrebirds
+lyrism
+lyrist
+lysate
+lyse
+lysergic
+lyses
+lysimeter
+lysimeter's
+lysimeters
+lysimetric
+lysin
+lysine
+lysing
+lysis
+lysogen
+lysogenic
+lysogenicity
+lysogeny
+lysolecithin
+lysosomal
+lysosomally
+lysosome
+lysozyme
+lytically
+macadam
+macaque
+macaronic
+macaronically
+macaronies
+macaroon
+macaw
+macaw's
+macaws
+macerate
+macerated
+macerates
+macerating
+maceration
+macerations
+macerator
+macerators
+machete
+machicolate
+machicolation
+machinability
+machinate
+machinated
+machinates
+machinating
+machinator
+machineable
+mackerel
+mackerels
+mackle
+mackled
+mackles
+macklin
+mackling
+macle
+macled
+macrame
+macroaggregate
+macroaggregated
+macrobiotic
+macrobiotics
+macrocephalic
+macrocephalous
+macrocephaly
+macrocosm
+macrocosmic
+macrocosmically
+macrocyte
+macrocytic
+macrocytosis
+macroeconomic
+macroevolution
+macroevolutionary
+macrofossil
+macrogamete
+macroinstruction
+macron
+macronucleus
+macronutrient
+macropathological
+macropathology
+macrophagic
+macrophyte
+macrophytic
+macroscale
+macroscopical
+macrostructural
+macrostructure
+macrostructure's
+maculate
+maculated
+maculates
+maculating
+maculation
+maculations
+macule
+madded
+maddish
+madrigalian
+madrigalist
+madrilene
+madrona
+madrone
+madstone
+madstones
+madwoman
+madwomen
+maelstrom
+maelstrom's
+maelstroms
+maenadic
+maeterlinck
+mafia
+mafioso
+magazinism
+magazinist
+magazinists
+maggotries
+maggotry
+magicked
+magicking
+magill
+magisterium
+magistracy
+magistral
+magistrally
+magistrateship
+magistratical
+magistratically
+magistrature
+magma
+magmatic
+magna
+magnesian
+magnetitic
+magnetodynamo
+magnetoelectric
+magnetoelectrical
+magnetoelectricity
+magnetofluidmechanic
+magnetofluidmechanics
+magnetogasdynamic
+magnetogasdynamics
+magnetogram
+magnetogram's
+magnetograms
+magnetograph
+magnetohydrodynamic
+magnetohydrodynamics
+magnetometer
+magnetometer's
+magnetometers
+magnetometric
+magnetometry
+magnetomotive
+magneton
+magnetooptic
+magnetooptical
+magnetooptics
+magnetoscope
+magnetosphere
+magnetospheric
+magnetostatic
+magnetostriction
+magnetostrictive
+magnetostrictively
+magnetron
+magnetrons
+magnific
+magnifical
+magnifically
+magnifico
+magniloquence
+magniloquent
+magniloquently
+magtape
+magtapes
+maguire
+maguires
+magus
+maharaja
+maharaja's
+maharajah
+maharanee
+maharani
+maharishi
+mahatma
+mahatmaism
+mahler
+mahlstick
+mahout
+maidenhead
+maidenhood
+maidhood
+maidish
+maieutic
+maieutical
+maieutics
+mailability
+mailbag
+mailbags
+mailboat
+mailboats
+maillot
+mailplane
+mailplanes
+mailsack
+mailsacks
+mainmast
+mainsail
+mainsheet
+mainspring
+maintop
+maisonette
+maisonettes
+maitre
+maitres
+maize
+maizer
+maizers
+maizes
+majestical
+majolica
+majordomo
+majordomos
+majorette
+majorettes
+majuscular
+majuscule
+makeable
+makebate
+makefast
+makepeace
+makeshifty
+makeweight
+mako
+makos
+mal
+malachite
+malacologic
+malacological
+malacologist
+malacology
+malacostracan
+maladaptation
+maladminister
+maladministration
+malamud
+malamute
+malapert
+malapertly
+malapertness
+malapportioned
+malapportionment
+malappropriate
+malappropriated
+malappropriates
+malappropriating
+malapropian
+malapropos
+malar
+malarian
+malariated
+malariologist
+malariology
+malarkey
+malate
+malathion
+malaxate
+malaxated
+malaxates
+malaxating
+malconduct
+malconformation
+maldevelopment
+maldistribute
+maldistribution
+maledictory
+malefaction
+malefic
+maleficence
+maleficent
+malemute
+malentendu
+malfeasance
+malgovernment
+malic
+maliferous
+malignance
+malignity
+malinger
+malingered
+malingerer
+malism
+malleability
+mallemuck
+malleus
+mallow
+malmsey
+malodorous
+malodorously
+malodorousness
+malolactic
+malposition
+malpractitioner
+maltase
+maltobionic
+maltose
+maltreatment
+maltster
+malty
+malvasia
+malvasian
+malversation
+malvoisie
+mammalogist
+mammalogy
+mammary
+mammer
+mammies
+mammillar
+mammillary
+mammillate
+mammillated
+mammock
+mammography
+mammon
+mammonism
+mammonist
+mammonite
+mammy
+mana
+manacle
+manacled
+manacles
+manacling
+manageability
+manageably
+managemental
+manageress
+managership
+manchet
+mancipation
+mancipatory
+manciple
+manciples
+mandala
+mandarinate
+mandarinates
+mandarinic
+mandarinism
+mandataries
+mandatary
+mandator
+mandatorial
+mandibular
+mandibulate
+mandola
+mandolinist
+mandolinists
+mandorla
+mandragora
+mandrel
+mandril
+mandrill
+manducate
+manducated
+manducates
+manducating
+manege
+manful
+manfully
+manfulness
+manganate
+manganesian
+manganic
+manganite
+manganous
+mange
+mangel
+mangier
+mangily
+manginess
+mango
+mango's
+mangos
+mangrove
+mangy
+manhandle
+manhandled
+manhandles
+manhandling
+manhunt
+manhunts
+manically
+manicotti
+manicurist
+manifestant
+manifesto
+manifesto's
+manifestoed
+manifestoes
+manifestoing
+manifestos
+manioc
+manipular
+manitowoc
+mankowski
+manless
+manlike
+mannerist
+manneristic
+mannerless
+mannikin
+mannish
+mannishly
+mannishness
+mannitic
+mannitol
+mannopyranosyl
+mannosyl
+manometric
+manometrical
+manometrically
+manometry
+manorialism
+manque
+manrope
+manropes
+mansard
+mansarded
+manse
+manship
+manslayer
+mansuete
+mansuetude
+mantelet
+mantelpiece
+mantelshelf
+mantic
+mantis
+mantises
+mantra
+mantua
+manubrium
+manuduction
+manuductory
+manufactory
+manumission
+manumit
+manumitted
+manumitting
+manurial
+manuscriptal
+manward
+manwards
+manwise
+manyfold
+manzanita
+maplecrest
+mapmaker
+mapmakers
+mapmaking
+mapper
+mappery
+mappist
+mappists
+maquillage
+maquis
+marabou
+maraschino
+marasmic
+marasmus
+maraud
+marauder
+marauding
+marauds
+marbly
+marcelled
+marcelling
+marchesa
+marchese
+marchioness
+marchpane
+marconigram
+marconigram's
+marconigrams
+marcotte
+margarita
+marginate
+marginated
+marginates
+marginating
+margination
+marginations
+mariachi
+marimba
+marish
+marjoram
+markdown
+marketeer
+marketeer's
+marketeering
+marketeers
+marketwise
+markovitz
+marksmen
+markswoman
+markswomen
+markup
+markups
+marl
+marline
+marmoreal
+marmoreally
+marmorean
+marmoset
+marmoset's
+marmosets
+marmot
+marplot
+marque
+marquet
+marquisate
+marquise
+marquisette
+marrowfat
+marrowless
+marrowy
+marse
+marshalcy
+marshalship
+marshier
+marshiness
+marshmallowy
+marshy
+marsupial
+marsupial's
+marsupials
+marsupium
+martensite
+martensitic
+martensitically
+martinet
+martlet
+martyrologies
+martyrologist
+martyrologists
+martyrology
+martyry
+marzipam
+marzipan
+maskable
+masochism
+masochistic
+masochistically
+massbus
+masseter
+masseteric
+masseur
+masseurs
+masseuse
+massicot
+massif
+massifs
+massy
+mastectomies
+mastectomy
+mastership
+mastersinger
+mastersingers
+masterstroke
+masterstrokes
+masterwork
+masthead
+mastic
+masticate
+masticated
+masticates
+masticating
+mastication
+mastications
+masticator
+masticators
+masticatory
+mastitic
+mastodonic
+mastodont
+mastoid
+mastoidectomy
+mastoideus
+mastoiditis
+masturbational
+masturbatory
+matador
+matchboard
+matchboarding
+matchlock
+matchwood
+matelote
+materfamilias
+materialist
+materialistically
+materiality
+matey
+maths
+matinal
+matins
+matriarchate
+matriarchy
+matric
+matricidal
+matricide
+matriculant
+matrilineal
+matrilineally
+matroid
+matronymic
+matt
+matte
+mattei
+mattery
+mattie
+mattock
+matutinal
+matutinally
+matzo
+matzos
+maude
+maudlinism
+maudlinisms
+maugre
+mauricio
+maxi
+maxilla
+maxillae
+maxillary
+maxillas
+maxilliped
+maxillipede
+maximalist
+mayapple
+mayflower
+mayfly
+mayoralty
+mayoress
+maypole
+mayst
+mazy
+mazzard
+mea
+meadowlark
+meadowlark's
+meadowlarks
+meagre
+mealie
+mealymouth
+mealymouthed
+mealymouthedly
+mealymouthedness
+mealymouthednesses
+meandrous
+measurability
+measureless
+meatball
+meatballs
+meath
+meatman
+meatmen
+mech
+mechanician
+mechanistically
+mechanoreceptor
+mecholyl
+mecum
+medallic
+meddlesome
+meddlesomeness
+mediacy
+mediad
+mediae
+medial
+medially
+mediant
+mediational
+mediatorial
+mediatorship
+mediatory
+mediatress
+mediatresses
+mediatrice
+mediatrix
+medicable
+medicably
+medicaid
+medicament
+medicamented
+medicamenting
+medicamentous
+medicaments
+medicare
+medicinable
+medicolegal
+medievalise
+medievalises
+medievalism
+medievalism's
+medievalisms
+medievalistic
+medievalistics
+meditator
+mediumship
+medlar
+medlars
+medulla
+medullary
+medullated
+medusae
+medusoid
+meerschaum
+megabuck
+megacycle
+megagamete
+megagametophyte
+megakaryocyte
+megakaryocytic
+megalith
+megalithic
+megaloblast
+megaloblastic
+megalomaniacal
+megalomaniacally
+megalomanic
+megalopolis
+megalopolistic
+megalopolitan
+megalopolitanism
+megalopteran
+megalopterous
+megaparsec
+megaphone
+megaphonic
+megapolis
+megapolitan
+megarians
+megascopic
+megascopically
+megasporangium
+megaspore
+megasporic
+megasporogenesis
+megasporophyll
+megillah
+megrim
+megrims
+meiosis
+meiotic
+meiotically
+meister
+melancholia
+melancholiac
+melancholic
+melancholically
+melanic
+melanism
+melanist
+melanistic
+melanite
+melanitic
+melanoblast
+melanoblastic
+melanoblastoma
+melanochroic
+melanocyte
+melanogenesis
+melanoid
+melanophore
+melanosis
+melanotic
+melatonin
+melic
+melies
+meliorator
+meliorism
+meliorist
+melioristic
+mell
+melliferous
+mellifluent
+mellifluently
+mellifluous
+mellifluously
+mellifluousness
+mellitin
+mellophone
+melodist
+melodramatically
+melodramatist
+meltability
+meltable
+meltdown
+meltdown's
+meltwater
+meltwaters
+membranal
+membraneless
+membranous
+membranously
+meme
+memorably
+memorialist
+memoriter
+menarcheal
+mencken
+menckenese
+mendable
+mendicancies
+mendicancy
+mendicant
+mendicants
+mendicities
+mendicity
+mendoza
+menhaden
+menhir
+meningeal
+meninges
+meningitic
+meningitis
+meningococcal
+meningococcic
+meninx
+menisci
+meniscus
+meniscuses
+menominee
+menopausal
+menorah
+menorrhagia
+menorrhagic
+mensal
+mensch
+mense
+menseful
+menseless
+menservants
+menstruous
+menstruum
+mensurability
+mensural
+mensurational
+menswear
+mentalist
+mentation
+mentations
+menthol
+mentholated
+mentorship
+mentum
+meow
+meow's
+meowed
+meowing
+meows
+mephitic
+mephitis
+mercantilism
+mercantilist
+mercantilistic
+mercenarily
+mercery
+merchantable
+merchantman
+merchantmen
+mercurate
+mercurated
+mercurates
+mercurating
+mercuration
+mercurations
+mercurous
+merganser
+mergence
+mergences
+meridional
+meridionally
+merino
+meristically
+meriwether
+meroblastic
+meroblastically
+merocrine
+meromorphic
+meromyosin
+merrick
+merrimac
+merrymaker
+merryman
+merrythought
+mescal
+mesdames
+mesdemoiselles
+meseems
+mesenteric
+mesenteron
+meshwork
+meshy
+mesial
+mesially
+mesic
+mesically
+mesmerically
+mesmerism
+mesmerisms
+mesmerist
+mesmerists
+mesne
+mesoblast
+mesoblastic
+mesocarp
+mesoderm
+mesodermal
+mesodermic
+mesomerism
+mesomorph
+mesomorphic
+mesomorphism
+mesomorphy
+mesonephric
+mesonephros
+mesonic
+mesopause
+mesopelagic
+mesophase
+mesophases
+mesosome
+mesosphere
+mesospheric
+mesothoracic
+mesothorax
+mesothorium
+mesotron
+mesotronic
+mesotrophic
+messaline
+messiahship
+messianic
+messianism
+messuage
+messuages
+mestizo
+metabole
+metabolically
+metacarpal
+metacarpus
+metacentric
+metachromatic
+metaethical
+metaethics
+metagalactic
+metagalaxies
+metagalaxy
+metagenesis
+metagenetic
+metagenetically
+metalicities
+metalicity
+metalicity's
+metallically
+metallike
+metallist
+metallists
+metallographer
+metallographic
+metallographically
+metallographist
+metalloidal
+metallurgist
+metalware
+metamathematician
+metamathematics
+metamere
+metameric
+metamerically
+metamerism
+metamorphically
+metanephric
+metanephros
+metaph
+metaphase
+metaphysician
+metaplasia
+metaplasm
+metaplasmic
+metaplastic
+metaprotein
+metapsychological
+metapsychology
+metasomatic
+metasomatically
+metasomatism
+metastability
+metastable
+metastably
+metastasis
+metastatic
+metastatically
+metatarsal
+metatarsally
+metatarsus
+metate
+metathesis
+metathetic
+metathetical
+metathetically
+metathoracic
+metazoa
+metazoal
+metazoan
+metempsychosis
+metencephalic
+metencephalon
+meteorically
+meteoritical
+meteorograph
+meteorographic
+meteoroidal
+meteorol
+meteorologic
+meteorologicaly
+meteorologist
+methacrylate
+methadon
+methadone
+methamphetamine
+methanolic
+metheglin
+methinks
+methionine
+methodic
+methodistic
+methodologist
+methought
+methylal
+methylamine
+methylase
+methylate
+methylated
+methylation
+methylator
+methylcholanthrene
+methylic
+methylnaphthalene
+methylphenidate
+meticulosity
+metier
+metis
+metonym
+metonymic
+metonymical
+metonymically
+metonymy
+metope
+metopon
+metrazol
+metrication
+metrist
+metrological
+metrologically
+metrologist
+metrology
+metronomic
+metronomical
+metronomically
+mewl
+mezuza
+mezuzah
+mezzanine
+mezzanines
+mezzotint
+miasmatic
+miasmic
+micaceous
+micellar
+micelle
+micelle's
+micelles
+micra
+microampere
+microamperes
+microanalyst
+microanalytical
+microanatomical
+microanatomy
+microbarograph
+microbe
+microbe's
+microbeless
+microbes
+microbic
+microbiologic
+microbiological
+microbiologically
+microbiologist
+microbiology
+microbus
+microcalorimetric
+microcephalic
+microcephaly
+microcircuit
+microcircuitry
+microcircuits
+microcirculation
+microcirculatory
+microclimate
+microclimates
+microclimatic
+microclimatological
+microclimatologist
+microclimatology
+microcline
+microclines
+micrococcal
+micrococcus
+microconsumer
+microcontroller
+microcopier
+microcopy
+microcosmic
+microcosmically
+microcrystal
+microcrystalline
+microcrystallinity
+microcyte
+microcytic
+microdensitometer
+microdensitometer's
+microdensitometers
+microdensitometric
+microdensitometry
+microdissection
+microdomain
+microdomains
+microelectrode
+microelectronic
+microelectronically
+microelectronics
+microelectrophoresis
+microelectrophoretic
+microelectrophoretical
+microelectrophoretically
+microelement
+microencapsulate
+microencapsulation
+microenvironment
+microenvironmental
+microevolution
+microevolutionary
+microfarad
+microfarads
+microfauna
+microfaunal
+microfibril
+microfibrillar
+microfiche
+microfiches
+microfilaria
+microfilarial
+microfine
+microflash
+microflora
+microfloral
+microform
+microfossil
+microfungal
+microfungus
+microgamete
+microgametocyte
+micrograph
+micrographer
+micrographers
+microgroove
+microhabitat
+microhardness
+microinch
+microinjection
+microlith
+microlithic
+micromania
+micromanipulation
+micromanipulator
+micromere
+micrometeorite
+micrometeoroid
+micrometeorological
+micrometeorologist
+micrometeorology
+micromethod
+micrometric
+micrometry
+micromicrofarad
+micromicrofarads
+micromicron
+microminiature
+micronuclear
+micronucleate
+micronucleus
+micronutrient
+micronutrients
+microorganic
+micropaleontologic
+micropaleontological
+micropaleontologist
+micropaleontology
+microparasite
+microparasites
+microparasitic
+microphage
+microphonic
+microphonics
+microphotograph
+microphotographer
+microphotographic
+microphotography
+microphotometer
+microphotometer's
+microphotometers
+microphotometric
+microphotometrically
+microphotometry
+microphyll
+microphyllous
+microphysical
+microphysically
+microphysics
+micropipet
+micropipette
+microplankton
+micropore
+microporosity
+microporous
+microprint
+microprobe
+microprogrammable
+microprojection
+microprojector
+micropulsation
+micropump
+micropylar
+micropyle
+microradiograph
+microradiographic
+microradiography
+microreader
+microrelief
+microreproduction
+microscale
+microscopist
+microsection
+microseism
+microseismic
+microseismicity
+microsome
+microsomes
+microspectrophotometer
+microspectrophotometer's
+microspectrophotometers
+microspectrophotometric
+microspectrophotometrical
+microspectrophotometrically
+microspectrophotometry
+microsphere
+microspheric
+microsporangium
+microspore
+microsporic
+microstate
+microstructural
+microstructurally
+microstructure
+microstructures
+microsurgery
+microsurgical
+microtechnic
+microtechnique
+microtome
+microtomes
+microtonal
+microtonality
+microtonally
+microtone
+microtones
+microtubular
+microtubule
+microtubules
+micturate
+micturated
+micturates
+micturating
+micturition
+micturitions
+midafternoon
+midbrain
+midcapacity
+midcourse
+midden
+middens
+middies
+middlebrow
+middlebrowism
+middlebrows
+middorsal
+middy
+midfield
+midfielder
+midget
+midgut
+midline
+midmost
+midplane
+midportion
+midrash
+midrashic
+midrashim
+midrib
+midribbed
+midriff
+midriffs
+midsemester
+midsole
+midsummery
+midtown
+midwatch
+midwatches
+midwifery
+midwing
+midwintry
+midwived
+midwiving
+mig
+mightless
+mignonette
+migraine
+migraines
+migrainous
+migrancy
+migratetic
+migratetics
+migrational
+migrationist
+migrationists
+migrator
+migratorial
+migs
+mikado
+mikhail
+mikoyan
+mila
+milacre
+milady
+milanese
+milch
+mildewcide
+mildewproof
+mildewy
+mildhearted
+mildish
+milepost
+milesian
+milfoil
+milfoils
+milia
+miliaria
+miliarial
+miliarias
+miliary
+milieux
+milinch
+militance
+militances
+militancies
+militancy
+militaristic
+militaristically
+militaryism
+militaryisms
+militiaman
+milium
+milkily
+milkless
+milklike
+milkman
+milkmen
+milksop
+milksopping
+milksoppy
+milkstone
+millable
+millage
+millboard
+millcourse
+milldam
+millenaries
+millenary
+millenia
+millennial
+millerite
+millesimal
+millesimally
+millhouse
+milliammeter
+milliammeter's
+milliammeters
+milliard
+milliary
+millibar
+millibarn
+millicron
+millicurie
+millicycle
+millidarcy
+millieme
+milliemes
+milliequivalent
+millifarad
+milligal
+millihenry
+millihertz
+millihg
+millilambert
+millilux
+millime
+millimetric
+millimicrofarad
+millimicrofarads
+millimicron
+millimicrosecond
+millimolar
+millimolarity
+millimole
+milline
+milliner
+millionairedom
+millionairess
+millionary
+millionfold
+milliphot
+millipoise
+millirad
+milliroentgen
+millman
+millmen
+millowner
+millpond
+millponds
+millrace
+millraces
+millsite
+millstream
+millstreams
+milord
+milquetoast
+milquetoasts
+milt
+milter
+mim
+mimetism
+mimical
+mimicry
+mimosa
+min
+minable
+minaret
+minareted
+minarets
+minatory
+mincy
+mineable
+minestrone
+minesweeping
+mingy
+miniaturist
+miniaturistic
+miniaturists
+minibus
+minibuses
+minicam
+minicamera
+minicar
+minicartridge
+minikin
+minim
+minimalism
+ministrable
+ministrant
+ministration
+minitrack
+minium
+minot
+minous
+minster
+minstrelsy
+mintage
+minuscular
+minutia
+minutial
+minx
+minxes
+miocrystalline
+mioses
+miosis
+miotic
+mirabilite
+miracular
+miraculism
+miraculisms
+miraculist
+miraculists
+mirate
+mirated
+mirates
+mirating
+miration
+mirations
+mirky
+mirrorlike
+mirrory
+mirthful
+mirthfully
+mirthfulness
+mirths
+miry
+misaddress
+misaddressed
+misadjustment
+misadventure
+misadventured
+misadventures
+misadventurous
+misadvise
+misaim
+misalliance
+misally
+misandry
+misanthropically
+misanthropism
+misanthropist
+misanthropists
+misanthropy
+misappreciate
+misappreciation
+misapprehend
+misapprehended
+misapprehending
+misapprehendingly
+misapprehends
+misapprehension
+misapprehensions
+misapprehensive
+misapprehensively
+misapprehensiveness
+misappropriate
+misappropriates
+misappropriation
+misarranged
+misarrangement
+misarray
+misascription
+misassignment
+misattribution
+misbecome
+misbecoming
+misbeget
+misbehadden
+misbeholden
+misbelief
+misbelieve
+misbeliever
+misbelieving
+misbelievingly
+misbeseem
+misbestow
+misbirth
+misc
+miscalculate
+miscalculates
+miscalculating
+miscalculator
+miscall
+miscaller
+miscast
+miscasting
+miscasts
+miscegenational
+miscellanea
+miscellaneity
+miscellanist
+miscellanists
+mischance
+mischiefful
+miscibility
+miscible
+misclassifications
+misclassify
+miscomprehend
+miscomprehension
+misconceit
+misconceive
+misconceived
+misconceiver
+misconceives
+misconceiving
+misconduct
+misconducted
+misconducting
+misconducts
+miscontent
+miscontentment
+miscook
+miscopy
+miscorrect
+miscorrected
+miscounsel
+miscounseled
+miscreance
+miscreances
+miscreate
+miscreation
+miscreative
+miscreator
+misdate
+misdeal
+misdealing
+misdeem
+misdeems
+misdeliver
+misdelivered
+misdelivery
+misdemean
+misdescribe
+misdescription
+misdescriptive
+misdo
+misdoer
+misdoing
+misdoubt
+miseducated
+miseducation
+misemphasis
+misemphasization
+misemphasize
+misemphasized
+misemphasizes
+misemphasizing
+misemploy
+misemployment
+misericorde
+mises
+misesteem
+misestimate
+misestimation
+misfeasance
+misfeasor
+misfeed
+misfile
+misfiled
+misfiles
+misfiling
+misgive
+misgives
+misgovern
+misgovernment
+misguidance
+mishandle
+mishandled
+mishandles
+mishandling
+mishear
+mishmash
+misimpression
+misimprove
+misinformative
+misintelligence
+misinterpretable
+misjoinder
+misknow
+misknowledge
+misknows
+mislabel
+mislay
+mislaying
+mislays
+misleared
+mislike
+mismachine
+mismanagement
+mismarriage
+mismate
+misogamic
+misogamist
+misogamists
+misogamy
+misogynic
+misogynistic
+misologist
+misology
+misoneism
+misorder
+misperception
+misperceptions
+misplay
+mispleading
+mispoint
+mispraise
+misprint
+misprision
+misprisions
+misprize
+misprized
+misprizes
+misprizing
+mispunctuate
+mispunctuation
+misquotation
+misquote
+misquotes
+misreckon
+misrecollect
+misrecollection
+misregister
+misregistration
+misremember
+misreport
+misrepresentative
+misrule
+misruled
+misruler
+misrules
+misruling
+missend
+misshape
+misshapes
+missileer
+missileers
+missileman
+missilemen
+missilery
+missilry
+missionate
+missort
+missout
+misspeak
+misspend
+misspended
+misspender
+misspending
+misspends
+misstrike
+misterm
+mistful
+misthink
+mistily
+mistime
+mistimed
+mistrain
+mistranslate
+mistranslation
+mistreatment
+mistrustful
+mistrustfully
+mistrustfulness
+misusage
+misvalue
+misventure
+miswrite
+miswrites
+miswriting
+mitch
+miterwort
+mitigator
+mitigators
+mitigatory
+mitochondria
+mitochondrion
+mitogenesis
+mitogenetic
+mitogenic
+mitoinhibitory
+mitosis
+mitotic
+mitotically
+mitral
+mitt
+mitted
+mittimus
+mitts
+mitzvah
+mitzvah's
+mitzvahes
+mixable
+mixologist
+mixologists
+mixology
+mizzenmast
+mizzle
+mizzled
+mizzles
+mizzling
+mizzly
+mlea
+moanful
+moanfully
+mobbish
+mobbishly
+mobbishness
+mobbism
+mobocracy
+mobocrat
+mobocratic
+mocha
+mockernut
+moderationist
+moderatism
+moderato
+moderatorship
+modernist
+modicity
+modificative
+modiste
+modulability
+modulatory
+moduli
+mogul
+mohair
+mohm
+moil
+moiler
+moiling
+moilingly
+moistureless
+molality
+molarity
+moldable
+molecularity
+moleskin
+moleskins
+molestation
+molestations
+molluscan
+molluskan
+molotov
+molt
+molter
+molto
+molts
+molucca
+moly
+molybdate
+molybdic
+molybdous
+momental
+momentaneous
+monachal
+monachism
+monadism
+monandrous
+monandry
+monarchal
+monarchial
+monarchical
+monarchically
+monarchism
+monarchist
+monarchistic
+monarchists
+monasterial
+monastical
+monastically
+monatomic
+monde
+mondrian
+monel
+moner
+monestrous
+monet
+monetarily
+moneybags
+moneylender
+moneylending
+moneyless
+moneymake
+moneymaker
+moneywort
+monger
+mongered
+mongering
+mongers
+mongolism
+mongoloid
+mongrel
+mongrelism
+mongrelly
+mongrelness
+monic
+monicker
+monied
+moniker
+monilia
+monish
+monism
+monist
+monistic
+monistical
+monition
+monitions
+monitorial
+monitorially
+monitorship
+monitory
+monitress
+monkeries
+monkery
+monkeyflower
+monkeyshine
+monkhood
+monoacid
+monoacidic
+monoamine
+monochasial
+monochromat
+monochromatically
+monochromaticity
+monochromatism
+monochromic
+monochromist
+monocline
+monocoque
+monocracy
+monocrat
+monocratic
+monocultural
+monoculture
+monocycle
+monocyclic
+monocycly
+monocyte
+monocytic
+monodisperse
+monodist
+monodrama
+monodramatic
+monoecious
+monoeciously
+monoecism
+monoenergetic
+monoester
+monofilament
+monofuel
+monogamic
+monogamist
+monogamists
+monogastric
+monogenean
+monogenesis
+monogenetic
+monogenic
+monogenically
+monogerm
+monogram
+monogram's
+monogrammatic
+monograms
+monographic
+monographical
+monography
+monogynous
+monogyny
+monohybrid
+monoid
+monolayer
+monologuist
+monomania
+monomaniac
+monometallic
+monometer
+monometer's
+monometers
+monomolecular
+monomolecularly
+monomorphemic
+monomorphic
+monomorphism
+monomorphous
+monophonically
+monophony
+monophthong
+monophthongal
+monophyletic
+monophyletism
+monoplane
+monoploid
+monopodial
+monopodially
+monopolist
+monopolistically
+monopropellant
+monopsony
+monopulse
+monorail
+monorail's
+monorails
+monosaccharide
+monosaccharides
+monosomic
+monostat
+monostatic
+monosyllabically
+monosyllabicity
+monosymmetric
+monosymmetry
+monosynaptic
+monosynaptically
+monotheist
+monotheistical
+monotheistically
+monotint
+monotrematous
+monotreme
+monotrichous
+monotype
+monotypic
+monovalent
+monovular
+monoxide
+monozygotic
+monsoonal
+monstrance
+monstrances
+montaigne
+monte
+monticule
+monumentless
+mooch
+moocher
+mooches
+mooching
+moola
+moolah
+moonbeam
+moonbeam's
+moonbeams
+moonbow
+mooncalf
+mooneye
+moonish
+moonishly
+moonless
+moonlet
+moonquake
+moonrise
+moonscape
+moonseed
+moonset
+moonstone
+moonstruck
+moonward
+moony
+moorage
+mopper
+moppet
+morainal
+morainic
+moralism
+moralistically
+morassy
+moray
+mordacious
+mordaciously
+mordacity
+mordancy
+mordent
+morehouse
+morel
+moresque
+morganatic
+morganatically
+morganite
+moribundity
+moron
+moronically
+moronism
+moronity
+morosity
+morph
+morphinic
+morphinism
+morpho
+mort
+mortarboard
+mortem
+mortgagor
+mortgagors
+mortimer
+mortise
+mortising
+mortmain
+mortuaries
+mortuary
+mortuary's
+mosaically
+mosaicism
+mosaicist
+moscone
+mosey
+moseyed
+moseying
+mosquitoey
+mossback
+mossbacked
+mosslike
+mot
+mote
+motet
+mothball
+motherhouse
+motherless
+motherlessness
+mothproof
+mothproofer
+motile
+motility
+motivic
+motivity
+motoneuron
+motorbike
+motorboat
+motorboater
+motorboating
+motorcade
+motorcade's
+motorcades
+motorcyclist
+motordrome
+motoric
+motorically
+motorless
+motortruck
+motorway
+mots
+moulage
+moulin
+moulins
+moult
+mountaintop
+mountaintop's
+mountaintops
+mountainy
+mountebank
+mountebankery
+mousetrap
+mousey
+mousily
+moussaka
+mousse
+mouthier
+mouthlike
+mouthpart
+mouthy
+movability
+movably
+moveless
+movelessly
+movelessness
+moviedom
+moviegoer
+moviemaker
+mown
+moxie
+mozzarella
+mu
+muciferous
+mucilaginous
+mucilaginously
+muckrake
+muckraker
+muckraking
+mucosa
+mucous
+mudded
+muddily
+mudhole
+mudhole's
+mudholes
+mudsill
+mudstone
+mudstones
+muezzin
+mufti
+muftis
+mugged
+mugger
+muggily
+mugho
+mugwump
+muhammad
+mukluk
+muley
+muliebrity
+mullein
+mullet
+mullets
+mullion
+mullite
+multiaperture
+multicavity
+multicellularity
+multichip
+multicollector
+multicompletion
+multicoupler
+multicycle
+multideck
+multielectrode
+multiengine
+multifactorial
+multifactrially
+multifarious
+multifariously
+multifariousness
+multifold
+multiform
+multiformity
+multihued
+multilane
+multilaned
+multilayer
+multilayered
+multilayers
+multilingual
+multilingualism
+multilingualist
+multilingually
+multimeter
+multimeter's
+multimeters
+multinucleate
+multinucleated
+multipactor
+multiparous
+multipartite
+multiphase
+multiphasic
+multiphastic
+multiplicable
+multiplicate
+multiplicates
+multipolar
+multipolarity
+multipronged
+multiracial
+multiracialism
+multisectoral
+multisegment
+multistatic
+multistory
+multivalence
+multivalued
+multivolume
+multivolumed
+mummer
+mummery
+mumming
+mump
+mumper
+mumps
+mundt
+mung
+munificence
+munist
+munroe
+muonic
+muralist
+murderee
+murderess
+muriate
+murkily
+murmurous
+murmurously
+murrain
+murre
+murrey
+murrow
+muscadine
+muscatel
+muscly
+muscularity
+musculoskeletal
+musee
+musette
+musettes
+mushily
+musicale
+musicological
+musicologist
+musketeer
+musketry
+muskie
+muskier
+muskies
+muskiness
+musky
+mussier
+mussily
+mussiness
+mussy
+mustily
+mutably
+mutafacient
+mutagen
+mutagenesis
+mutagenic
+mutagenically
+mutagenicity
+mutandis
+mutase
+mutatis
+muticous
+mutilator
+mutine
+mutined
+mutining
+mutinous
+mutinously
+mutinousness
+muttonchops
+muttony
+mutualism
+mutualist
+mutualistic
+mutuel
+muumuu
+muzzier
+muzzily
+muzziness
+muzzy
+mycobacteria
+mycoplasma
+mycorrhiza
+mycosis
+mycotic
+myel
+myeline
+myeloid
+myocarditis
+myofibril
+myoglobin
+myopically
+myosin
+myosotis
+myotic
+myotome
+myotonia
+myriameter
+myriameter's
+myriameters
+myriapod
+myriopod
+myristate
+myrmecological
+myrrh
+mystagogy
+mythmaker
+mythmaking
+mythologer
+mythologic
+mythologist
+mythomania
+mythomaniac
+mythopoeic
+mythopoetic
+mythopoetical
+mythos
+nacelle
+nacreous
+nagger
+naiad
+naivety
+nakamura
+nakoma
+namable
+nannies
+nanny
+nanook
+napalm
+nape
+napery
+napes
+naphthalene
+naphthalenic
+naphthene
+naphthenic
+naphthol
+napless
+napper
+nappier
+nappies
+nappy
+narc
+narcism
+narcissi
+narcissism
+narcist
+narcolepsy
+narcoleptic
+narcos
+narcotically
+narrational
+narrowminded
+narwal
+narwhal
+narwhal's
+narwhals
+nascence
+nascency
+nastic
+natant
+natation
+natations
+natatorial
+natatorium
+natatory
+nate
+nates
+nationalistically
+nativism
+nativist
+nativistic
+nattily
+naturalistically
+naturam
+naturopath
+naughtily
+nauseant
+nauseous
+nauseously
+nauseousness
+nauseum
+naut
+navaho
+nave
+naves
+navicular
+navigability
+navigably
+navigational
+navigationally
+navona
+navtas
+naw
+nawab
+nazification
+nazifications
+nazified
+nazifies
+nazify
+nazifying
+neath
+nebbish
+nebulosity
+necessitarian
+necessitarianism
+necessitous
+necessitously
+necessitousness
+neckerchief
+necrological
+necrologist
+necrologists
+necrology
+necromantically
+necrophagia
+necrophagous
+necrophagy
+necrophilia
+necrophilic
+necrophilism
+necropolis
+necroses
+nectareous
+nectarine
+needlelike
+needlewoman
+needlewomen
+nefarious
+nefariously
+nefariousness
+negational
+negativist
+negativistic
+negativists
+negaton
+negatron
+neglectful
+neglectfully
+neglectfulness
+negligibility
+negligibly
+negotiability
+negotiator
+negotiators
+negotiatory
+negrophile
+negrophilism
+nematicidal
+nematicide
+nematocyst
+nemeses
+nemophila
+neo
+neoanthropic
+neoclassicism
+neoclassicist
+neocosmic
+neofascism
+neogenesis
+neogenetic
+neoglycolipid
+neoglycolipids
+neoliberalism
+neolith
+neological
+neologistic
+neology
+neonate
+neoorthodox
+neoorthodoxy
+neoplasia
+neoplasm
+neoplastic
+neoplasticism
+neoplasticist
+neoplasticists
+neostigmine
+neotenic
+neoteny
+neoteric
+neotype
+nepenthe
+nepenthean
+nephanalysis
+nepheline
+nephelinic
+nephelinite
+nephelinitic
+nephelite
+nephelometer
+nephelometer's
+nephelometers
+nephelometric
+nephelometry
+nephometer
+nephometer's
+nephometers
+nephoscope
+nephrectomy
+nepotism
+nepotist
+nepotistic
+nepotists
+nereid
+nervation
+nervations
+nervosity
+nescience
+nesciences
+nescient
+nethermost
+netkeeper
+netless
+netlike
+netter
+netty
+neumatic
+neuralgic
+neuritic
+neuroanatomic
+neuroanotomy
+neuroblastoma
+neurochemistry
+neurocirculatory
+neuroendocrine
+neuroepithelial
+neurofibril
+neurofibrillary
+neurogenic
+neurogenically
+neuroglia
+neuroglial
+neuronic
+neuropathic
+neuropathically
+neuropathy
+neurospora
+neurosurgeon
+neurosurgery
+neurosurgical
+neurotically
+neuroticism
+neurotoxic
+neurotoxicity
+neurotoxin
+neurotropic
+neutercane
+neutralistic
+neutronium
+neutrophil
+neutrophile
+neutrophilic
+neutrophilis
+neutrophils
+neve
+nevermore
+nevers
+nevus
+newbury
+newfangled
+newfangledness
+newish
+newsagent
+newsagents
+newsbreak
+newsier
+newsiness
+newsless
+newsmagazine
+newsmonger
+newsprint
+newsroom
+newsy
+niacin
+nib
+nibelungenlied
+nibs
+niccolo
+nickelic
+nickeliferous
+nickelodeon
+nickelous
+nicklaus
+nicknameless
+nicotinamide
+nicotinic
+nidification
+nidifugous
+nietzschean
+nigger
+nightclothes
+nightclubber
+nightglow
+nightie
+nighties
+nightlong
+nightshade
+nightside
+nightstand
+nightstick
+nighttide
+nightwalker
+nighty
+nihilianism
+nihilistically
+nihility
+nijinsky
+nill
+nilmanifold
+nimbostratus
+nimiety
+nimming
+nincompoop
+nincompoopery
+ninebark
+ninepin
+ninepins
+ninetyfold
+ninnies
+ninny
+ninnyhammer
+nipper
+nippers
+nippier
+nippily
+nippiness
+nippy
+nisei
+niseis
+nit
+nite
+nitid
+nitrator
+nitrification
+nitrifications
+nitrify
+nitrile
+nitro
+nitrobenzene
+nitrocellulose
+nitrocellulosic
+nitrofuran
+nitroglycerin
+nitroparaffin
+nitros
+nitrosamine
+nitrosoamine
+nitty
+nitwit
+nitwitted
+nobbier
+nobble
+nobbled
+nobbling
+nobby
+noblewoman
+nocent
+noces
+nociceptive
+nock
+nocking
+noctambulation
+noctambulism
+noctambulist
+nocturn
+nocuous
+nocuously
+nodality
+nodder
+noddies
+noddle
+noddy
+nodi
+nodical
+nodose
+nodosity
+nodulation
+nodus
+noes
+noetic
+nog
+noggin
+nogging
+nohow
+noisome
+noisomely
+noisomeness
+nolo
+noma
+nomad
+nomadic
+nomadism
+nomads
+nomenclator
+nomenclatorial
+nomenclatural
+nomic
+nomina
+nominalism
+nominalist
+nominalistic
+nominator
+nominators
+nomogram
+nomogram's
+nomograms
+nomograph
+nomographer
+nomographic
+nomographically
+nomographies
+nomography
+nomological
+nomology
+nomothetic
+nonage
+nonagenarian
+nonagon
+nonallelic
+nonbank
+nonbook
+noncalcareous
+nonce
+nonchalance
+noncharitable
+noncom
+nonconcurrence
+nonconcurrency
+noncondensing
+nonconducting
+nonconductor
+nonconductors
+nonconfidence
+nonconform
+nonconformable
+nonconformably
+nonconformance
+nonconformer
+nonconforming
+nonconformism
+nonconformity
+noncooperation
+noncooperationist
+noncooperative
+noncooperator
+noncrossing
+noncurrent
+nondeductibility
+nondeductible
+nondefense
+nondefense's
+nondefenses
+nondeforming
+nondegenerate
+nondemocratic
+nondestructive
+nondirectional
+nondirective
+nondisjunction
+nondisjunctional
+nondistinctive
+nondivided
+nondormant
+nondramatic
+nondrying
+noneconomist
+nonelectrolyte
+nonentities
+nonentity
+nonesuch
+noneuclidean
+nonfat
+nonfeasance
+nonfictional
+nonfigurative
+nonflammable
+nonflowering
+nonfragmenting
+nongovernment
+nongovernmental
+nonillion
+nonimpact
+nonimpinging
+noninductive
+nonintersecting
+nonintervention
+noninterventionist
+noninverting
+noninvolvement
+nonjoinder
+nonjuring
+nonjuror
+nonlinguist
+nonliterate
+nonloaded
+nonmatching
+nonmetal
+nonmoral
+nonmultiple
+nonnucleated
+nonobjective
+nonobjectivism
+nonobjectivist
+nonobjectivity
+nonobservance
+nonoccurrence
+nonparallel
+nonparametric
+nonparametrics
+nonpareil
+nonparticipant
+nonparticipating
+nonparticipation
+nonpartisanship
+nonpast
+nonpaternity
+nonpathogenic
+nonpermanent
+nonpersonal
+nonplus
+nonpluses
+nonpolar
+nonporous
+nonpositive
+nonpossession
+nonpossessor
+nonprint
+nonprinting
+nonproducer
+nonproductive
+nonproductively
+nonproductiveness
+nonprofessional
+nonprofessionally
+nonprofitable
+nonprogressive
+nonpros
+nonprossed
+nonprossing
+nonprotein
+nonreactive
+nonreader
+nonrealistic
+nonreclosing
+nonrecording
+nonregulation
+nonreimbursable
+nonrelativistic
+nonreligious
+nonremovable
+nonrenewable
+nonrepresentational
+nonrepresentationalism
+nonrepresentative
+nonresidence
+nonresidency
+nonresistant
+nonrestraint
+nonrestricted
+nonrestrictive
+nonretractable
+nonreturnable
+nonrigid
+nonscheduled
+nonscientific
+nonseasonal
+nonsecretor
+nonsectarian
+nonsegregated
+nonsegregation
+nonsignificant
+nonsignificantly
+nonskid
+nonslip
+nonsocial
+nonspecific
+nonsporting
+nonsupport
+nonsyllabic
+nonsynchronous
+nontemporal
+nontenure
+nonunion
+nonuse
+nonuser
+nonviable
+nonviolence
+nonvolatile
+nonworker
+normotensive
+northeasternmost
+northeastward
+northeastwards
+northwestward
+northwestwards
+nosebag
+nosebag's
+nosebags
+nosegay
+nosepiece
+nosey
+noseying
+nosh
+nosher
+nosily
+nosologic
+nosological
+nosologically
+nosology
+nostrum
+nota
+notability
+notarial
+notarially
+notarius
+notecase
+noteless
+notepaper
+noteworthily
+notional
+notionality
+notionally
+notocord
+nougat
+nouncing
+nous
+novaculite
+novae
+novelette
+novelettish
+novelistic
+novella
+novelle
+novemdecillion
+novena
+novocaine
+nowaday
+noway
+noways
+nowhither
+nowise
+noyes
+nu
+nub
+nubbin
+nubble
+nubbles
+nubbly
+nubility
+nucellar
+nucelli
+nucellus
+nuchal
+nucleant
+nuclease
+nucleator
+nuclein
+nucleocapsid
+nucleolar
+nucleon
+nucleon's
+nucleonic
+nucleonics
+nucleons
+nucleophile
+nucleophilic
+nucleophilically
+nucleophilicity
+nucleoplasm
+nucleoplasmatic
+nucleoplasmic
+nucleoprotein
+nucleoside
+nucleosynthesis
+nucleotidase
+nuclidic
+nudibranch
+nugent
+nullificationist
+nulliparous
+numberable
+numbskull
+numia
+numis
+numismatically
+nummular
+numskull
+nunciation
+nunciature
+nuncupate
+nuncupation
+nuncupative
+nunes
+nunnery
+nuovo
+nuptiality
+nursemaid
+nurserymaid
+nurseryman
+nursling
+nurtural
+nurturant
+nutational
+nuthatch
+nutlike
+nutria
+nutriment
+nutted
+nutting
+nux
+nymphal
+nymphalid
+nymphet
+nymphette
+nympholepsy
+nympholept
+nymphomaniacal
+nystagmic
+nystagmus
+o'er
+oafish
+oafishly
+oafishness
+oarsman
+oarsmanship
+oatcake
+oatcake's
+oatcakes
+obbligato
+obcordate
+obeah
+obeisance
+obi
+objectionably
+objectivism
+objectivist
+objectivistic
+objectless
+objectlessness
+objurgate
+objurgated
+objurgates
+objurgating
+objurgation
+objurgations
+objurgatory
+oblast
+obligator
+obligatorily
+obligee
+obligor
+obligors
+obliquity
+obliterator
+obliviated
+obliviates
+obliviating
+oblongatal
+oblongated
+oblongish
+obloquious
+obloquy
+obnubilate
+obnubilated
+obnubilates
+obnubilating
+obnubilation
+obnubilations
+obovate
+obovoid
+obscurant
+obscurantic
+obscurantism
+obscurantist
+obscuration
+obscurations
+obsessional
+obsessionally
+obsolesce
+obstetric
+obstetrical
+obstetrically
+obstetrician
+obstetrician's
+obstetricians
+obstetrics
+obstreperous
+obstreperously
+obstreperousness
+obstructionism
+obstructionistic
+obstructor
+obstruent
+obtainability
+obtainment
+obtect
+obtected
+obtest
+obtestation
+obtrusion
+obtund
+obturate
+obturated
+obturates
+obturating
+obturation
+obturator
+obvert
+occas
+occiput
+occludent
+occlusal
+occultation
+occultations
+occultism
+occultist
+occurrent
+oceana
+oceanarium
+oceanfront
+oceangoing
+oceanographer
+oceanographer's
+oceanographers
+oceanographical
+oceanographically
+oceanologic
+oceanological
+oceanologically
+oceanologist
+oceanology
+ocellar
+ocellate
+ocellated
+ocellation
+ocelli
+ocellus
+och
+ochlocracy
+ochlocrat
+ochlocratic
+ochlocratical
+oconomowoc
+ocotillo
+octadecyl
+octahedra
+octahedral
+octahedrally
+octameter
+octameter's
+octameters
+octandrious
+octant
+octant's
+octants
+octodecillion
+octodecimo
+octoploid
+octoploidy
+octopod
+octopodan
+octopodous
+octosyllabic
+octosyllable
+octroi
+oculomotor
+odalisque
+oddball
+oddball's
+oddballs
+oddment
+odea
+odeum
+odic
+odilo
+odograph
+odontologst
+odontology
+odorant
+odoriferous
+odoriferously
+odoriferousness
+oedipal
+oeillade
+oenology
+oenomel
+oersted
+oeuvre
+oeuvres
+offcast
+officialese
+officialism
+officiant
+officiary
+offish
+offishly
+offishness
+offprint
+offprints
+offsaddle
+offscour
+offscouring
+offscreen
+offside
+ofttimes
+ogeographically
+ogle
+ogler
+ogles
+ogling
+ogre
+ogreish
+ogress
+ohmage
+ohmically
+ohs
+oilcan
+oilily
+oilskin
+oilstone
+oink
+okamoto
+okapi
+okra
+olasticism
+oldfangled
+oldie
+oldish
+oleaginous
+oleaginously
+oleaginousness
+oleaster
+oleate
+olefin
+oleg
+oleophilic
+oleophobic
+olfaction
+olfactions
+olfactive
+olfactology
+olfactometer
+olfactometer's
+olfactometers
+olfactorily
+olfactory
+oligarch
+oligarchical
+oligochaete
+oligoclase
+oligomer
+oligomer's
+oligomers
+oligosaccharide
+oligosaccharide's
+oligosaccharides
+olivine
+olympiad
+om
+ombudsman
+ombudsman's
+ombudsperson
+omelette
+omental
+omentum
+omer
+omissible
+ommatidial
+ommission
+omnidirectional
+omnifarious
+omnifariously
+omnifariousness
+omnificence
+omnificences
+omnificent
+omnify
+omnipotency
+omnipresence
+omnirange
+omniscience
+omnisciency
+omnist
+omnivorous
+omnivorously
+omnivorousness
+onanistic
+oncogene
+oncogene's
+oncogenes
+oncogenic
+onefold
+oneiric
+oneirocritic
+oneirocritical
+oneirocritically
+oneiromancy
+onionskin
+onium
+onload
+onlooking
+onomastic
+onomastics
+onomatology
+onomatopoeia
+onomatopoeia's
+onomatopoeic
+onsetting
+onshore
+onside
+onstage
+ontically
+ontogenesis
+ontogenetic
+ontogenetically
+ontologist
+oocyte
+oomph
+oozier
+oozy
+op
+opalescence
+opalescences
+opaline
+openability
+openable
+openendedness
+openhanded
+openhandedly
+openhandedness
+openhearted
+openheartedly
+openheartedness
+openmouthed
+openmouthedly
+openmouthedness
+openwork
+operability
+operably
+operatically
+operationalism
+operationalist
+operationalistic
+operationism
+operationist
+opercular
+operculate
+operculated
+operculum
+operettist
+operon
+ophidian
+ophiology
+ophiophagous
+ophite
+ophitic
+ophthalmologic
+ophthalmologically
+ophthalmology
+ophthalmoscope
+ophthalmoscopic
+ophthalmoscopical
+ophthalmoscopy
+opine
+opined
+opines
+oping
+opining
+opinionate
+opinionative
+opinionatively
+opinionativeness
+opportunist
+opposability
+opposeless
+oppositional
+opprobrious
+opprobriously
+opprobriousness
+oppugn
+oppugner
+ops
+opsonic
+opsonin
+optative
+optatively
+optician
+optima
+optimistical
+optimo
+optoacoustic
+optoisolate
+optokinetic
+optometrical
+opulence
+opuntia
+opuscule
+opusculum
+ora
+orach
+orache
+oracular
+oracularity
+oracularly
+orality
+orangeade
+orangeroot
+orangery
+orangewood
+orangey
+orangish
+orangoutan
+orangy
+oratio
+oratoric
+orbicular
+orbicularity
+orbicularly
+orbiculate
+orbiculately
+orca
+orca's
+orcas
+orch
+orchardist
+orchardman
+orchesis
+orchestrational
+orchestrator
+orchestre
+orchis
+ordainment
+orderless
+ordinand
+ordines
+ordure
+organdie
+organelle
+organicism
+organicist
+organismal
+organismically
+orgasmic
+orgastic
+orgiastically
+orgulous
+orientable
+orientalism
+orientalist
+orientational
+orientationally
+orienteering
+orificial
+oriflamme
+origami
+origanum
+orismological
+orismology
+orison
+orney
+ornith
+ornithic
+ornithine
+ornithology
+ornithology's
+orogenic
+orogeny
+orographical
+orographically
+orotund
+orotundity
+ort
+orthant
+orthicon
+ortho
+orthocephalic
+orthocephalous
+orthocephaly
+orthochromatic
+orthoclase
+orthoclastic
+orthodontia
+orthoepic
+orthoepical
+orthoepically
+orthoepist
+orthoepy
+orthogenesis
+orthogenetic
+orthogenetically
+orthogenic
+orthognathism
+orthognathous
+orthognathy
+orthograde
+orthographical
+orthographically
+orthopsychiatric
+orthopsychiatrist
+orthopsychiatry
+orthopteran
+orthopterist
+orthopteroid
+orthopteron
+orthorhombic
+orthoscope
+orthoscopes
+orthoscopic
+orthotic
+orthotics
+orthotist
+orthotropic
+orthotropically
+orthotropism
+orthotropous
+ortolan
+orts
+oryx
+oryxes
+orzae
+oscillational
+oscillogram
+oscillogram's
+oscillograms
+oscillograph
+oscillographic
+oscillographically
+oscillography
+oscilloscopic
+oscilloscopically
+oscine
+osculate
+osculated
+osculates
+osculating
+osculation
+osculations
+osculatory
+osculum
+osier
+osmatic
+osmeterium
+osmic
+osmiridium
+osmolal
+osmolality
+osmolar
+osmolarity
+osmometer
+osmometer's
+osmometers
+osmometric
+osmometry
+osmoregulation
+osmoregulatory
+osmose
+osmosed
+osmosing
+osmotically
+osmous
+osmunda
+oso
+osram
+osric
+ossicle
+ossicular
+ossiculate
+ossiculated
+ossificatory
+ossifrage
+ossuary
+osteitis
+ostensive
+ostensively
+ostensorium
+ostentation
+ostentations
+osteoarthritic
+osteoarthritis
+osteoblast
+osteoblastic
+osteoclast
+osteoclastic
+osteocyte
+osteoid
+osteological
+osteologically
+osteologist
+osteoma
+osteopathically
+osteophyte
+osteophytic
+osteoplastic
+osteoplasty
+ostracod
+otherguess
+otherwhere
+otherwhile
+otherwhiles
+otiose
+ouabain
+ouan
+oubliette
+ough
+oui
+outbalance
+outbid
+outbound
+outbrave
+outbreed
+outbreeding
+outbuilding
+outby
+outbye
+outcaste
+outcrop
+outcross
+outdazzle
+outdistance
+outdoorsman
+outdoorsmanship
+outdoorsy
+outdraw
+outercoat
+outfall
+outfight
+outfighting
+outfitter
+outfitting
+outflank
+outflanker
+outfoot
+outgas
+outgeneral
+outgiving
+outgo
+outgoes
+outguess
+outgun
+outhaul
+outlier
+outmatch
+outmode
+outmoding
+outmost
+outpace
+outpaced
+outplay
+outpoint
+outport
+outporter
+outpull
+outputted
+outrace
+outrance
+outrange
+outrank
+outride
+outrider
+outrival
+outscore
+outsell
+outsert
+outshine
+outshoot
+outshout
+outsight
+outsit
+outsize
+outskirt
+outsleep
+outsmell
+outsoar
+outsole
+outspeak
+outspeed
+outspend
+outspent
+outspin
+outstand
+outstare
+outstart
+outstay
+outstretch
+outtake
+outtalk
+outthink
+outturn
+outwear
+outwork
+ouvre
+ouzel
+ovarial
+ovarian
+ovariectomy
+ovariole
+ovariotomy
+ovaritis
+ovenbird
+ovenbirds
+overabundant
+overact
+overaction
+overactivity
+overarm
+overawe
+overbalance
+overbear
+overbearance
+overbid
+overbite
+overblew
+overblow
+overblowing
+overblows
+overbought
+overbuild
+overbuy
+overcall
+overcalled
+overcalling
+overcalls
+overcapacity
+overcareful
+overcarefully
+overcautious
+overcharge
+overcompensate
+overcompensation
+overcompensatory
+overconfidence
+overcurrent
+overcurrents
+overdetermination
+overdetermined
+overdevelop
+overdevelopment
+overdo
+overdominance
+overdominant
+overdress
+overdrive
+overemphasization
+overemphasization's
+overemphasizations
+overet
+overexcite
+overexcitement
+overexposure
+overfastidious
+overfed
+overfish
+overfleshed
+overflight
+overflown
+overfly
+overgarment
+overglaze
+overgraze
+overgrow
+overgrowth
+overily
+overindulge
+overindulgence
+overindulgent
+overissue
+overissued
+overissues
+overissuing
+overleap
+overlearn
+overlie
+overlong
+overlord
+overlordship
+overman
+overmaster
+overmatch
+overmuch
+overoptimism
+overoptimist
+overoptimistic
+overoptimistically
+overpass
+overpay
+overpersuade
+overpersuasion
+overplay
+overplus
+overpopulate
+overpraise
+overprize
+overproduce
+overproduced
+overproduces
+overproducing
+overpronounce
+overproof
+overproportion
+overprotect
+overrate
+overreact
+overreaction
+overrefine
+overrefinement
+overrepresent
+overripe
+oversanguine
+oversea
+overseen
+oversell
+overselling
+oversells
+oversensitive
+oversensitiveness
+oversexed
+overshoe
+overskirt
+overslaugh
+oversleep
+overslip
+oversold
+oversoul
+overspeculate
+overspeculation
+overspeed
+overspend
+overspender
+overspending
+overspends
+overspread
+oversteepen
+oversteer
+overstep
+oversteps
+overstock
+overstory
+overstrain
+overstrew
+overstride
+overstrung
+overstuff
+overstuffed
+overstuffing
+overstuffs
+oversubscribe
+oversubscribes
+oversubscribing
+oversubscription
+oversubtle
+oversubtlety
+overtax
+overtaxation
+overthrust
+overtop
+overtrade
+overtrain
+overtrick
+overtrump
+overvalue
+overvoltage
+overvoltages
+overwatch
+overwear
+overweary
+overween
+overweening
+overweigh
+overwind
+overwinter
+overword
+overwrought
+ovicidal
+ovicide
+oviduct
+oviductal
+ovine
+oviparous
+oviparously
+oviparousness
+oviposit
+oviposition
+ovipositional
+ovipositor
+ovoid
+ovoidal
+ovonic
+ovotestis
+ovoviviparous
+ovoviviparously
+ovoviviparousness
+ovular
+ovulate
+ovulated
+ovulates
+ovulating
+ovulation
+ovulations
+ovule
+ow
+owerless
+owlet
+oxacillin
+oxalacetate
+oxalacetic
+oxalis
+oxaloacetate
+oxazine
+oxblood
+oxbow
+oxeye
+oxheart
+oxidase
+oxidasic
+oxidic
+oxonian
+oxtail
+oxygenator
+oxygenic
+oxygenicity
+oxygenless
+oxyhemoglobin
+oxyhydrogen
+oxymoron
+oxyphil
+oxyphile
+oxyphilic
+oxysome
+oxysulfide
+oystchers
+oysterman
+oystermen
+oz
+ozagen
+ozagenians
+ozocerite
+ozokerite
+ozonic
+ozonide
+ozoniferous
+ozonosphere
+ozonous
+ozzie
+pacem
+pacemaking
+pacesetter
+pachyderm
+pachydermal
+pachydermatous
+pachydermatously
+pachysandra
+pachytene
+pacifiable
+pacifically
+pacificator
+pacificators
+pacificatory
+pacificist
+pacifistically
+packability
+packable
+packboard
+packhorse
+packinghouse
+packman
+packsack
+packsaddle
+packthread
+packwood
+paddleboard
+padrone
+paella
+paeon
+paestum
+paganini
+paganish
+pageboy
+paginal
+pailful
+painfuller
+painfullest
+paisley
+paix
+paladin
+palaeoanthropic
+palaeontology
+palaeontology's
+palaestra
+palanquin
+palasts
+palatably
+palatial
+palatially
+palatialness
+palatinate
+palaver
+palavered
+palavering
+palazzo
+palazzos
+paleface
+paleoanthropology
+paleoanthropology's
+paleoecologic
+paleoecological
+paleoecologist
+paleoecology
+paleogeographic
+paleogeographical
+paleogeographically
+paleogeography
+paleographer
+paleographic
+paleographical
+paleographically
+paleography
+paleolith
+paleoliths
+paleologist
+paleologists
+paleomagnetics
+paleontologic
+paleontological
+paleontologist
+paleontology
+paleozoological
+paleozoology
+palingenesis
+palingenetic
+palinode
+palish
+palladia
+pallbearer
+pallette
+pallial
+palliasse
+palliator
+pallium
+pallor
+pallor's
+pallors
+palmar
+palmary
+palmate
+palmated
+palmately
+palmation
+palmier
+palmistry
+palmitate
+palmlike
+palmy
+palomino
+palp
+palpability
+palpal
+palpate
+palpated
+palpates
+palpating
+palpation
+palpations
+palpebral
+palpi
+palpitant
+palpitate
+palpitated
+palpitates
+palpitating
+palter
+paltered
+palterer
+paltering
+paludal
+paludism
+palynologic
+palynological
+palynologically
+palynologist
+palynology
+pampa
+pampas
+pamphleteer
+pamphleteers
+panacean
+panache
+panatela
+panchromatic
+pancratium
+pandect
+pandects
+pandied
+pandit
+panegyric
+panegyrical
+panegyrically
+panegyrist
+panetela
+panetella
+panful
+pangenesis
+pangenetic
+pangolin
+panhandle
+panhandled
+panhandler
+panhandles
+panhandling
+panhuman
+panicking
+panicle
+pannier
+panoramically
+panpipe
+panpipes
+pantalets
+pantalettes
+pantaloon
+pantaloons
+pantas
+pantheistic
+pantheistical
+pantheistically
+pantie
+pantile
+pantiled
+pantisocracies
+pantisocracy
+pantisocratic
+pantisocratical
+pantisocratist
+pantograph
+pantographic
+pantomimic
+pantomimist
+pantothenate
+pantothenic
+pantropic
+pantryman
+pantrymen
+pantsuit
+pantywaist
+panza
+panzer
+papacy
+papaw
+paperbound
+paperboy
+paperboys
+paperhanger
+paperhanging
+papermaker
+papermakers
+papermaking
+papiers
+papilla
+papillae
+papillate
+papillated
+papilloma
+papillomatous
+papillon
+papillose
+papillote
+papist
+papistry
+pappose
+para
+parabiosis
+parabiotic
+parabiotically
+parabolically
+parachutic
+parachutist
+paradigmatical
+paradisaic
+paradisaical
+paradisaically
+paradisal
+paradisiac
+paradisiacal
+paradisiacally
+paraffinic
+paragenesis
+paragenetic
+paragenetically
+paraginase
+paragonite
+paragraphic
+paralinguistic
+parallactic
+paralogism
+paralytic
+paramagnetically
+paramagnetism
+paramecium
+paramedic
+parament
+parametrical
+paramnesia
+paramountcy
+paramour
+paranormality
+paranymph
+paraoxon
+paraph
+paraphrasable
+paraphrastic
+paraphrastically
+paraphysis
+paraplegia
+parapodial
+parapodium
+paraquat
+pararosaniline
+parasang
+paraselene
+paraselenic
+parasexual
+parasexuality
+parasitical
+parasitically
+parasiticidal
+parasiticide
+parasitism
+parasympathomimetic
+parasynthesis
+parasynthetic
+paratactic
+paratactical
+paratactically
+parataxis
+parathion
+parathyroid
+parathyroidectomy
+paratyphoid
+paravane
+paraxial
+parbuckle
+parbuckled
+parbuckling
+parcenary
+parcener
+pard
+pardner
+pardners
+paregoric
+parella
+parenchyma
+parenchymal
+parenteral
+parenterally
+parfait
+parian
+paries
+parietal
+parietes
+parioli
+parisina
+parisology
+parka
+parka's
+parkas
+parkinsonism
+parlante
+parle
+parling
+parlous
+parlously
+parmigiana
+parmigiano
+parodic
+parodist
+parodistic
+parol
+paronomasia
+paronomastic
+paronym
+paronymous
+parotid
+parotitis
+parous
+paroxysm
+paroxysmal
+paroxytone
+parquetry
+parrakeet
+parricidal
+parricide
+parrillo
+parring
+parris
+partan
+parterre
+parthenocarpic
+parthenocarpically
+parthenocarpy
+parthenogenesis
+parthenogenetic
+parthenogenetically
+parti
+partible
+participator
+particularism
+particularist
+partisanship
+partite
+partitionist
+partitive
+partitively
+partizan
+parturient
+parturition
+partway
+parure
+parve
+parvenue
+parvis
+parvise
+paschal
+pasha
+passably
+passarine
+passavant
+passbook
+passbook's
+passbooks
+passel
+passementerie
+passerine
+passible
+passim
+passional
+passionless
+passivate
+passivated
+passivates
+passivating
+passivation
+passivations
+passivism
+passivist
+passivists
+passkey
+pastelist
+pastellist
+pastern
+pasternak
+pasterns
+pastil
+pastilles
+pastlle
+pastorale
+pastoralism
+pastoralist
+pastorate
+pastorium
+pastorship
+pastrami
+pasturage
+pastureland
+patagonians
+patchboard
+patchily
+patchouli
+patchouly
+pate
+patella
+patellae
+patellar
+patellas
+patelliform
+patency
+patentability
+patentor
+paterfamilias
+paternalist
+pathbreaking
+pathetical
+pathetically
+pathfinder
+pathfinding
+pathogenetic
+pathogenically
+pathogenicity
+pathognomonic
+pathol
+pathometer
+pathometer's
+pathometers
+pathomorphologic
+pathomorphological
+pathomorphology
+pathophysiologic
+pathophysiological
+pathophysiology
+patible
+patil
+patinae
+patine
+patined
+patining
+patisseries
+patois
+patresfamilias
+patriarchate
+patriciate
+patriciates
+patricidal
+patricide
+patrilineage
+patrilineal
+patriotically
+patristical
+patroller
+patronal
+patronne
+patronymic
+patroon
+patten
+pattie
+patulous
+patulously
+patulousness
+paulownia
+pauperism
+pavanne
+pavese
+pavid
+pawl
+pawnbroker
+pawnbroker's
+pawnbrokers
+pawnbroking
+pawnor
+pawpaw
+pax
+paxam
+paxton
+payee
+paygrade
+paygrades
+payola
+payor
+peaceably
+peacekeeper
+peacekeeping
+peacemake
+peacemaker
+peachier
+peachy
+peacockish
+peafowl
+peahen
+pealike
+pearlescence
+pearlescent
+pearlite
+pearlitic
+pearlstone
+peascod
+peasecod
+peashooter
+peaty
+pebbly
+peccable
+peccadillo
+peccancy
+peccant
+peccantly
+peccavi
+pecky
+pectate
+pectic
+pectin
+pectinaceous
+pectinate
+pectinated
+pectination
+pectines
+pectoralis
+peculator
+pecuniarily
+pedagog
+pedalfer
+pedalferic
+pedantically
+peddlery
+peden
+pederast
+pederastic
+pederasts
+pederasty
+pedestrianism
+pediatrist
+pedicab
+pedicel
+pedicellate
+pedicle
+pedicled
+pediculate
+pediculosis
+pediculous
+pedicure
+pedicurist
+pedimental
+pedipalp
+pedlar
+pedlary
+pedocal
+pedocalic
+pedogenesis
+pedogenetic
+pedogenic
+pedologic
+pedological
+pedologist
+pedology
+pedometer
+pedometer's
+pedometers
+pedophile
+pedophilia
+pedophiliac
+pedophilic
+pee
+peekaboo
+peelable
+peeress
+peeter
+peewee
+peignoir
+pekoe
+pelage
+pelagic
+pellagrin
+pellagrous
+pelletal
+pellitory
+pellucid
+pellucidity
+pellucidly
+pellucidness
+peloria
+peloric
+pelorus
+pelota
+pelotas
+peltate
+peltately
+peltries
+peltry
+pemberton
+pemican
+penates
+pendency
+pendent
+pendentive
+pendently
+pendleton
+pendular
+pendulous
+pendulously
+pendulousness
+penetrability
+penetrable
+penetrableness
+penetrably
+penetralia
+penetrance
+penetrances
+penetrant
+penetrants
+penetrometer
+penetrometer's
+penetrometers
+pengally
+penholder
+penicillate
+penicillately
+penicillation
+penicillium
+penile
+peninsular
+penis
+penises
+penitence
+penitences
+penitency
+penlight
+penmanship
+penna
+pennaceous
+pennae
+pennate
+pennis
+pennyroyal
+penological
+penologist
+penology
+pensile
+pensionable
+pensionary
+pensionless
+pentacle
+pentacles
+pentad
+pentadactyl
+pentadactylism
+pentagram
+pentagram's
+pentagrams
+pentagraph
+pentahedral
+pentahedron
+pentamerous
+pentameter
+pentane
+pentangle
+pentangles
+pentapeptide
+pentaploid
+pentaploidy
+pentaquin
+pentaquine
+pentarchy
+pentathlete
+pentathlon
+pentatonic
+pentavalent
+pentazocine
+pentobarbital
+pentobarbitone
+pentode
+pentodes
+pentomic
+pentosan
+penuche
+penult
+penultima
+penumbra
+penumbral
+peon
+peonage
+peones
+peoplehood
+peopleless
+pepperminty
+peppertree
+pepsico
+pepsin
+pepsinogen
+peptic
+peptone
+peradventure
+perambulate
+perambulated
+perambulates
+perambulating
+perambulation
+perambulations
+perambulator
+perambulatory
+percale
+percaline
+perceptibility
+perceptional
+perceptivity
+perchlorate
+percipience
+percipient
+percoidean
+percptibly
+percuss
+percussionist
+perdurability
+perdurable
+perdurably
+pere
+peregrinate
+peregrinated
+peregrinates
+peregrinating
+peregrination
+peregrinations
+peregrine
+peremptorily
+perennate
+perennated
+perennates
+perennating
+perennation
+perennations
+perfecta
+perfectivity
+perfecto
+perfervid
+perfoliate
+perfoliation
+perforator
+performable
+performative
+performatory
+perfuse
+perfused
+perfusing
+perfusive
+pergola
+pericardial
+pericarditis
+pericardium
+pericarp
+perichondral
+perichondrial
+perichondrium
+pericranial
+pericranium
+pericycle
+pericyclic
+pericynthion
+periderm
+peridermal
+peridermic
+peridia
+peridium
+peridot
+peridotic
+peridotite
+peridotitic
+perigean
+perigee
+perigee's
+perigynous
+perigyny
+perihelial
+perikaryal
+perikaryon
+perilune
+perilymph
+perimorph
+perimysium
+perinatal
+perineum
+periodontics
+periodontist
+perioneum
+periotic
+peripatecically
+peripatetically
+peripateticism
+peripatus
+peripety
+peripherad
+periphrasis
+periphrastically
+periphytic
+periphyton
+periplast
+periscopic
+perishability
+peritectic
+peritonitis
+peritrichous
+peritrichously
+perjurious
+perjuriously
+perkily
+perlite
+perlitic
+perlocutionary
+perm
+permafrost
+permeability
+permeably
+permeance
+permease
+permissable
+permitter
+permittivity
+permutational
+peroneal
+peroral
+perorally
+perorate
+peroration
+perorational
+peroxidase
+peroxidic
+peroxisomal
+peroxisome
+perpend
+perpendicularity
+perpetuator
+perseverant
+perseveration
+perseverations
+persistency
+persnickety
+personalism
+personalist
+personalistic
+personate
+personated
+personates
+personating
+personation
+personative
+personator
+personhood
+perspicacity
+perspiratory
+persuasible
+pertinacity
+pertinency
+perturbable
+perturbational
+perturbative
+perversity
+pervious
+perviousness
+peso
+pesos
+pessary
+pessimal
+pessimistically
+pessimum
+peste
+pestiferous
+pestiferously
+pestiferousness
+petallike
+petaloid
+petalous
+petard
+petasos
+petasus
+petiolate
+petiolated
+petiole
+petioled
+petiolule
+petit
+petitionary
+petrarchan
+petrel
+petrifaction
+petrochemistry
+petrogenesis
+petrogenetic
+petrographer
+petrographic
+petrographical
+petrographically
+petrography
+petrolatum
+petrologic
+petrological
+petrologically
+petrologist
+petronel
+petrosal
+petrous
+pettibone
+pettifog
+pettifogger
+pettifoggery
+pettily
+petulancy
+pewaukee
+pewee
+ph
+phaeton
+phage
+phagocytosis
+phalanges
+phalanstery
+phalarope
+phalli
+phallic
+phallically
+phallicism
+phallus
+phalluses
+phanerogam
+phanerogamic
+phanerogamous
+phantasm
+phantasma
+phantasmagoria
+phantasmagoric
+phantasmal
+phantasmic
+phantomlike
+pharaoh
+pharaonic
+pharisaic
+pharisaical
+pharisaically
+pharisaicalness
+pharisaism
+pharisee
+pharmacodynamic
+pharmacodynamically
+pharmacodynamics
+pharmacogenetic
+pharmacogenetics
+pharmacognostic
+pharmacognostical
+pharmacognosy
+pharmacokinetic
+pharmacokinetics
+pharmacologic
+pharmacologist
+pharmacopoeia
+pharnges
+pharos
+pharyngitis
+phasic
+phasmid
+phd
+phenetics
+phenetidine
+phenetole
+phenobarbital
+phenobarbitone
+phenocain
+phenocopy
+phenocryst
+phenolate
+phenological
+phenologically
+phenology
+phenomenalism
+phenomenalist
+phenomenalistic
+phenomenalistically
+phenomenologist
+phenothiazine
+phenotypic
+phenotypical
+phenotypically
+phenoxide
+phentolamine
+phenylalanine
+phenylene
+phenylephrine
+phenylic
+pheromone
+pheromone's
+pheromones
+phial
+philanthropical
+philanthropically
+philatelic
+philatelically
+philatelist
+philately
+philco
+philippe
+philippians
+philogyny
+philol
+philologist
+philoprogenitive
+philoprogenitiveness
+philter
+philtre
+phlebitis
+phlebotomy
+phlegmatic
+phlegmatically
+phlegmy
+phloem
+phlogistic
+phlogiston
+phobia
+phon
+phonate
+phonated
+phonates
+phonating
+phonation
+phonematic
+phonemically
+phonetical
+phonetician
+phoney
+phoneys
+phonically
+phonily
+phonocardiogram
+phonocardiogram's
+phonocardiograms
+phonocardiograph
+phonocardiographic
+phonocardiography
+phonogram
+phonogram's
+phonogramic
+phonogramically
+phonogrammic
+phonogrammically
+phonograms
+phonographic
+phonographically
+phonography
+phonolite
+phonolitic
+phonologial
+phonologist
+phonon
+phonons
+phonoreception
+phonoreceptor
+phonorecord
+phonos
+phosgene
+phosphatic
+phosphatide
+phosphatidic
+phosphatidyl
+phosphene
+phosphite
+phosphocreatine
+phospholipid
+phospholipids
+phosphore
+phosphorescence
+phosphoreted
+phosphoretted
+phosphorism
+phosphorite
+phosphoritic
+phosphorolysis
+phosphorolytic
+phosphorous
+phosphoryl
+phosphorylase
+phosphorylate
+phosphorylation
+phosphorylative
+photic
+photically
+photoautotrophic
+photoautotrophically
+photobiologic
+photobiological
+photobiologist
+photobiology
+photobiotic
+photocathode
+photocathodes
+photocell
+photochemist
+photochemistry
+photochromic
+photochromism
+photocoagulation
+photocompose
+photocomposer
+photocomposition
+photoconductive
+photoconductivity
+photocurrent
+photodecomposition
+photodetector
+photodiode
+photodiodes
+photodisintegrate
+photodisintegration
+photodissociation
+photodissociative
+photodrama
+photoduplicate
+photoduplication
+photodynamic
+photodynamically
+photodynamics
+photoelectric
+photoelectrically
+photoelectron
+photoemission
+photoemissive
+photoengrave
+photoengraver
+photoengraving
+photoflash
+photoflood
+photofluorogram
+photofluorogram's
+photofluorograms
+photofluorographic
+photofluorography
+photogene
+photogenically
+photogeologic
+photogeological
+photogeology
+photogram
+photogram's
+photogrammetric
+photogrammetrist
+photogrammetry
+photograms
+photogravure
+photoheliograph
+photoinduced
+photoinduction
+photoinductive
+photojournalism
+photojournalist
+photojournalist's
+photojournalistic
+photojournalists
+photokinesis
+photokinetic
+photolithograph
+photolithographer
+photolithographic
+photolithographically
+photolithography
+photolytically
+photomap
+photomechanical
+photomechanically
+photometer
+photometer's
+photometers
+photometrically
+photomicrgraphical
+photomicrogram
+photomicrogram's
+photomicrograms
+photomicrographic
+photomicroscope
+photomicroscopic
+photomontage
+photomorphogenesis
+photomorphogenic
+photomultiplier
+photomural
+photonegative
+photonic
+photonuclear
+photooxidation
+photooxidative
+photoperiod
+photoperiodic
+photoperiodically
+photoperiodism
+photophilic
+photophilous
+photophily
+photophobia
+photophobic
+photophore
+photopia
+photoplay
+photopositive
+photoprint
+photoproduct
+photoproduction
+photoreaction
+photoreception
+photoreceptive
+photoreceptor
+photoreconnaissance
+photorecord
+photorecorder
+photoreduction
+photoresistance
+photorespiration
+photosensitivity
+photoset
+photosetter
+photosphere
+photospheric
+photostat
+photostatic
+photosynthesis
+photosynthetic
+photosynthetically
+phototactic
+phototactically
+phototaxis
+phototelegraphy
+phototropic
+phototropically
+phototropism
+phototube
+phototypesetter
+phototypesetting
+phototypographic
+phototypography
+photovoltaic
+phrasally
+phrasemaker
+phrasemonger
+phrasemongering
+phraseogram
+phraseogram's
+phraseograms
+phraseograph
+phraseological
+phraseologically
+phraseologist
+phratries
+phratry
+phreatic
+phreatophyte
+phreatophytic
+phrenetic
+phrenic
+phrenological
+phrenologically
+phrenologist
+phrenology
+phrensy
+phthalate
+phycologist
+phycology
+phycomycete
+phycomycetes
+phylactery
+phylae
+phylar
+phyle
+phylesis
+phyletic
+phyllary
+phylloclade
+phyllode
+phyllodium
+phylloid
+phyllome
+phyllomic
+phyllophagous
+phyllopod
+phylogenetic
+physiatrics
+physiatrist
+physicalism
+physicalist
+physicalistic
+physicality
+physicked
+physicking
+physicochemically
+physiocratic
+physiognomic
+physiognomical
+physiognomically
+physiographer
+physiographic
+physiographical
+physiography
+physiol
+physiopathologic
+physiopathological
+physiopathology
+physostigmine
+phytane
+phytoalexin
+phytochemical
+phytochemically
+phytochemist
+phytochemistry
+phytochrome
+phytoflagellate
+phytogenic
+phytogeographic
+phytogeographical
+phytogeographically
+phytogeography
+phytography
+phytological
+phytologically
+phytology
+phyton
+phytonic
+phytopathogen
+phytopathogenic
+phytopathologic
+phytopathological
+phytopathology
+phytophagous
+phytophagy
+phytoplanktonic
+phytosociological
+phytosociologically
+phytosociologist
+phytosociology
+phytosterol
+phytotoxic
+phytotoxicity
+pial
+pianistically
+pianoforte
+pianoforte's
+pianofortes
+pias
+piassava
+piazze
+pibroch
+pic
+picador
+picadores
+picaninny
+picara
+picaresque
+picaro
+picaroon
+picayunish
+piccalilli
+piccoloist
+pice
+piceous
+pickaback
+pickaninny
+pickaroon
+pickax
+pickeer
+picketboat
+picklock
+pickpocket
+pickproof
+pickthank
+picnicky
+picnometer
+picnometer's
+picnometers
+picoline
+picon
+picosecond
+picoseconds
+pictograph
+pictographic
+pictography
+pictorialism
+picturegoer
+piebald
+piecework
+pieceworker
+piecrust
+piefort
+pieing
+pieta
+pietism
+pietist
+pietistic
+pietistical
+pietistically
+pietro
+piezoelectrically
+piezometer
+piezometer's
+piezometers
+piezometric
+piezometry
+piffle
+piffled
+piffles
+piffling
+pigboat
+pigeonberry
+pigeonfoot
+pigeonhearted
+pigeonwing
+pigged
+piggeries
+piggery
+piggyback
+piggybacked
+piggybacking
+pigheaded
+pigheadedness
+piglet
+piglets
+pigmentary
+pigmy
+pigstick
+pigsticker
+pigsticking
+pikeman
+pikestaff
+pilaf
+pilaff
+pilaster
+pilchard
+pilea
+pileate
+pileated
+pilei
+pileum
+pileup
+pileus
+pilewort
+pilgarlic
+pillbox
+pillboxes
+pillion
+pillions
+pillowcase
+pillowcases
+piloerection
+pilotage
+pilotages
+pilothouse
+pilotless
+pilsener
+pilsner
+pilular
+pilule
+pilus
+pinar
+pinaster
+pinata
+pinbone
+pincer
+pincer's
+pincerlike
+pincers
+pinchbeck
+pinchcock
+pindling
+pineal
+pinecone
+pinedrops
+pinene
+pinery
+pinesap
+pineta
+pinetum
+pinewood
+piney
+pinfold
+pingo
+pinkeye
+pinko
+pinkoes
+pinkos
+pinkroot
+pinky
+pinna
+pinnace
+pinnae
+pinnal
+pinnas
+pinnate
+pinnately
+pinner
+pinniped
+pinniped's
+pinnipeds
+pinnula
+pinnular
+pinnulate
+pinnulated
+pinnule
+pinprick
+pinpricks
+pinscher
+pinsetter
+pinspotter
+pinstripe
+pinta
+pintle
+pintoes
+pinup
+pinxter
+pionic
+pipage
+pipal
+pipeage
+pipefish
+pipeful
+pipeless
+pipelike
+piperazine
+piperidine
+piperine
+piperonal
+pipestone
+pipgras
+pipit
+pipkin
+pippin
+pipping
+pipsissewa
+piquancy
+piquet
+piranha
+piraro
+piratical
+piratically
+pirogue
+piroplasm
+piroplasma
+piroplasmata
+piscicultural
+pisciculture
+pisciculturist
+piscina
+piscine
+piscivorous
+pisiform
+pismire
+pisolite
+pisolitic
+pissoir
+pistillate
+pistoleer
+pita
+pitchman
+pitchout
+pitchy
+pithead
+pithily
+pitiably
+pivotable
+pivotman
+pixie
+pixieish
+pixilated
+pixilates
+pixilation
+pizazz
+pizz
+pizzazz
+pizzeria
+placability
+placable
+placably
+placatory
+placebo
+placeholder
+placeman
+placemat
+placemat's
+placemats
+placency
+placent
+placentation
+placentations
+placentia
+placidity
+placket
+plagal
+plage
+plagiaristic
+plagiary
+plagioclase
+plaguesome
+plaguey
+plaguily
+plaguy
+plaice
+plainclothesman
+plainsman
+plainspoken
+plainspokenness
+plaint
+plaintext
+plaintful
+plainview
+plaister
+planarian
+planation
+planchet
+planetoidal
+planetological
+planetologist
+planetology
+plangency
+plangent
+plangently
+planimeter
+planimeter's
+planimeters
+planimetric
+planish
+planisher
+planisphere
+planispheric
+planktonic
+planless
+planlessly
+planlessness
+planograph
+planographic
+planography
+planosol
+plantable
+plantar
+plantlike
+planula
+planular
+planuloid
+plasmagel
+plasmagene
+plasmagenic
+plasmalemma
+plasmapheresis
+plasmasol
+plasmatic
+plasmid
+plasmid's
+plasmids
+plasmin
+plasminogen
+plasmodesm
+plasmodium
+plasmogamy
+plasmolysis
+plasmolytic
+plasmolytically
+plasmon
+plasodesma
+plasterboard
+plasterwork
+plastery
+plastid
+plastidial
+plastisol
+plastisols
+plastogene
+plastral
+plastron
+plat
+plateaux
+plateful
+platelike
+platemaker
+platemaking
+plateresque
+platies
+platina
+platinic
+platinous
+platipi
+platipi's
+platitudinal
+platitudinarian
+platonically
+platterful
+platting
+platypus
+platypus's
+platypuses
+plauded
+plauding
+plaudit
+plause
+plausive
+playa
+playability
+playact
+playbill
+playbills
+playbook
+playgirl
+playgoer
+playgoers
+playland
+playmaker
+playpen
+playpen's
+playpens
+playsuit
+pleadable
+pleasantry
+pleasurability
+pleasurably
+pleasureless
+pleatless
+plebe
+plebeianism
+plebes
+plebian
+plebiscitary
+plebs
+plectrum
+plectrum's
+plectrums
+pledgee
+pledget
+pledgor
+plenipotent
+plenish
+plenitudinous
+plentitude
+plethoric
+pleurae
+pleuritic
+pleurodont
+plex
+plexiform
+plexiglass
+plexus
+pliability
+pliably
+plimsoll
+plinth
+plodder
+plosion
+plotless
+plotlessness
+plottage
+plottier
+plotty
+plowmen
+plowmen's
+pluckily
+plugboard
+plugboard's
+plugboards
+plugger
+plumbaginous
+plumbago
+plumbate
+plumbeous
+plumbic
+plumbiferous
+plumbism
+plumbous
+plumelet
+plumier
+plumlike
+plummier
+plummy
+plumose
+plumosely
+plumpish
+plumulate
+plumule
+plumulose
+plumy
+plunderable
+plunderage
+plunderous
+pluperfect
+pluralistically
+pluriaxial
+pluripotent
+plussage
+plusses
+plutocracy
+plutocrat
+plutocratic
+plutocratically
+pluton
+plutonian
+plutonic
+pluvial
+plyscore
+pneumatically
+pneumaticity
+pneumatology
+pneumatolysis
+pneumatolytic
+pneumatometer
+pneumatometer's
+pneumatometers
+pneumatophore
+pneumatophoric
+pneumectomy
+pneumococcus
+pneumonic
+pocahontas
+pockmark
+pocky
+poco
+podagra
+podagral
+podded
+podding
+podgier
+podgy
+podiatric
+podiatrist
+podiatry
+podite
+poditic
+poetaster
+poetess
+poeticism
+pogromist
+poi
+poikilotherm
+poikilothermic
+poikilothermism
+poilu
+poinciana
+pointe
+pointillism
+pointillist
+pointilliste
+pointillistic
+pointwise
+poirot
+poitrine
+pokey
+pokeys
+pokier
+pokily
+pokiness
+poky
+polarimetric
+polariscopic
+polariton
+polarographic
+polarographically
+polaron
+polder
+poleax
+poleless
+polemicist
+polemist
+polemonium
+polestar
+poleward
+policewoman
+policewoman's
+policewomen
+policyholder
+policyholders
+poliomyelitic
+poliomyelitis
+poliovirus
+politesse
+politick
+politicker
+polity
+polkadot
+polkadots
+pollee
+pollenate
+pollenated
+pollenates
+pollenating
+pollenation
+pollenosis
+pollex
+pollical
+pollices
+pollinate
+pollinated
+pollinates
+pollinating
+pollination
+pollinator
+pollinic
+polliniferous
+pollinium
+polloi
+pollster
+pollywog
+pollywog's
+pollywogs
+poloist
+poltergeist
+poltroon
+poltroonery
+poltroonish
+poltroonishly
+polyandrous
+polyandry
+polyanka
+polyantha
+polyanthus
+polybasite
+polycarbonate
+polycarpellary
+polycarpic
+polycarpous
+polycarpy
+polycentrism
+polychaete
+polychaetous
+polychasium
+polychotomous
+polychotomy
+polychromatic
+polychrome
+polychromy
+polycistronic
+polyclinic
+polycondensation
+polycot
+polycotyl
+polycotyledon
+polycotyledonous
+polycrystal
+polycyclic
+polycythemia
+polycythemic
+polydactyl
+polydactylous
+polydactyly
+polydipsi
+polygala
+polygamic
+polygamical
+polygamically
+polygamist
+polygene
+polygenesis
+polygenesist
+polygenetic
+polygenetically
+polygenic
+polyglandular
+polyglot
+polyglotism
+polyglottism
+polygonum
+polygram
+polygram's
+polygrams
+polygraph
+polygraphic
+polygynoecial
+polygyny
+polyhedrosis
+polyhistor
+polyhistoric
+polyhydroxy
+polymath
+polymathic
+polymathy
+polymerically
+polymerism
+polymorphically
+polymorphism
+polymorphonuclear
+polymorphous
+polymorphously
+polymyxin
+polyneuritis
+polynuclear
+polynucleotide
+polynya
+polyonymous
+polyp
+polypary
+polypeptide
+polypeptidic
+polypetalous
+polyphagia
+polyphagous
+polyphagy
+polyphase
+polyphasic
+polyphenol
+polyphenolic
+polyphone
+polyphonically
+polyphonous
+polyphonously
+polyphyletic
+polyphyletically
+polyphyleticism
+polypide
+polyploid
+polyploidy
+polypnea
+polypneic
+polypody
+polypoid
+polypous
+polyptych
+polyrhythm
+polyrhythmic
+polyrhythmically
+polyribonucleotide
+polyribosomal
+polyribosome
+polysaccharide
+polysaccharides
+polysaprobic
+polysemous
+polysemy
+polysepalous
+polysilicon
+polysiloxanes
+polysome
+polysomic
+polysorbate
+polystichous
+polysulfide
+polysyllabic
+polysyllabically
+polysyllable
+polysynaptic
+polysynaptically
+polysyndeton
+polytene
+polyteny
+polytheism
+polytheist
+polytheistic
+polytheistical
+polythene
+polytocous
+polytonality
+polytope
+polytrophic
+polytype
+polytypic
+polytypism
+polytypy
+polyurethane
+polyuria
+polyvalence
+polyvalent
+polyvinyl
+polywater
+polyzoan
+polyzoarium
+polyzoic
+pomace
+pomaceous
+pomade
+pomaded
+pomades
+pomander
+pomatum
+pome
+pomelo
+pomerania
+pomeranian
+pomiferous
+pommel
+pomological
+pomologically
+pomologist
+pomology
+pompey
+pompon
+pon
+ponderable
+ponderosa
+ponderosa's
+ponderosas
+pong
+pont
+pontific
+pontificaly
+pontificator
+pontifices
+pontine
+pontius
+ponton
+pontonier
+pontoon
+ponytail
+pood
+poolroom
+poop
+poorhouse
+poorish
+popery
+popgun
+popinjay
+popish
+popishly
+popliteal
+popover
+poppa
+poppet
+popple
+poppycock
+poppyhead
+populaire
+populaires
+populism
+populist
+populistic
+porcelainlike
+porcelaneous
+porcellaneous
+poriferal
+poriferan
+porkies
+porky
+pornographically
+porphyria
+porphyrin
+porphyritic
+porphyroid
+porphyropsin
+porphyry
+porrect
+porringer
+portance
+portative
+portcullis
+porterage
+porthole
+portico
+portiere
+portionless
+portraitist
+portress
+portulaca
+posable
+posada
+posey
+posies
+positivistic
+positivity
+positronium
+posseman
+possemen
+possessory
+posset
+possets
+postaxial
+postaxially
+postbag
+postbags
+postbellum
+postbox
+postboxes
+postboy
+postboys
+postbreeding
+postclassic
+postclassical
+postcolonial
+postdental
+postdiluvian
+postdoctorate
+postembryonal
+postembryonic
+postemergence
+posteriad
+posteriority
+postern
+postexilic
+postface
+postform
+postglacial
+posthaste
+posthole
+posthypnotic
+postiche
+postilion
+postillion
+postmastership
+postmenopausal
+postmillenarian
+postmillenarianism
+postmillennial
+postmillennialism
+postmillennialist
+postmistress
+postmodern
+postmultiply
+postnasal
+postnatal
+postnatally
+postnuptial
+postnuptially
+postorbital
+postpaid
+postpituitary
+postponable
+postposition
+postpositional
+postpositionally
+postpositive
+postpositively
+postprandial
+postprandially
+postprocess
+postprocessor
+postprocessors
+postschool
+postsynaptic
+postsynaptically
+posttension
+posttraumatic
+postulancy
+postulant
+postulational
+postulator
+postural
+posy
+potability
+potassic
+potation
+potboy
+poteen
+potemkin
+potence
+potentiate
+potentiation
+potentiator
+potentiometric
+potful
+pothead
+potheen
+pother
+pothered
+pothering
+pothook
+pothouse
+pothunter
+pothunting
+potpie
+potsdam
+potsherd
+potshot
+potshotting
+potstone
+pottage
+pottawatomie
+potteringly
+pottier
+potties
+pottle
+potto
+pottos
+potty
+pouchier
+pouchy
+pouf
+pouff
+pouffed
+poulard
+poularde
+poult
+poulterer
+poultryman
+poundage
+poundal
+pourable
+pourboire
+pourparler
+pourpoint
+poussette
+poussetted
+poussetting
+poussin
+poussins
+pouty
+powderman
+powdermen
+powerboat
+powerhouse
+powerhouse's
+powerhouses
+powwow
+poxvirus
+poza
+ppm
+practicum
+praecox
+praedial
+pragmatical
+pragmaticism
+pragmaticist
+pragmatistic
+praiseworthily
+praline
+prandial
+prankish
+prankishly
+prankishness
+prankster
+pranksters
+prase
+pratfall
+pratincole
+pratique
+prawn
+prawner
+prawns
+praxeological
+praxeology
+pre
+preachier
+preachifies
+preachify
+preachily
+preachiness
+preachment
+preachy
+preadapt
+preadaptation
+preadapted
+preadaptive
+preadolescence
+preadolescent
+preamplifier
+preamplifiers
+prearrange
+prearrangement
+preatomic
+preaxial
+preaxially
+prebend
+prebendal
+prebendary
+prebind
+prebiologic
+prebiological
+prebiotic
+precancel
+precancerous
+precast
+precautious
+precedency
+preceeded
+preceeding
+precensor
+precentor
+precentorial
+precentorship
+preceptor
+preceptorial
+preceptorship
+preceptory
+preceptress
+precessional
+preciosity
+precipitance
+precipitancy
+precipitant
+precipitantly
+precipitantness
+precipitator
+precipitin
+precipitinogen
+precipitinogenic
+precisian
+precisianism
+precisionist
+preclinical
+preclusion
+preclusive
+preclusively
+precoat
+precoating
+precocial
+precognition
+precognitive
+precombustion
+precompact
+precompose
+precomputation
+precomputed
+preconceptual
+preconcert
+preconcerted
+preconcertedly
+preconcertedness
+preconsonantal
+precook
+precritical
+precursory
+predaceous
+predaceousness
+predacious
+predacity
+predatorily
+predawn
+predecease
+predefense
+predefense's
+predefenses
+predesignate
+predesignation
+predestinarian
+predestinarianism
+predestinate
+predestination
+predestinator
+predestine
+predetermination
+predicable
+predicatable
+predicatory
+predigest
+predigestion
+predominancy
+preemergence
+preemergent
+preemie
+preemphasization
+preemphasization's
+preemphasize
+preemphasized
+preemphasizer
+preemphasizers
+preemphasizes
+preemphasizing
+preexchange
+preexchanged
+preexist
+preexistence
+prefatorial
+prefatorially
+prefatorily
+prefectural
+preferability
+preferrer
+prefigurative
+prefiguratively
+prefigurativeness
+prefigure
+prefigured
+prefigurement
+prefigures
+prefiguring
+prefixal
+prefixally
+prefocus
+prefocused
+prefocuses
+prefocusing
+preform
+preformation
+preformed
+preforms
+prefrontal
+pregnability
+pregnable
+pregnenolone
+preheat
+preheated
+preheater
+prehensile
+prehensility
+prehension
+prehistorian
+prehistorical
+prehistorically
+prehistory
+prehominid
+preignition
+preinduction
+prejudicious
+prejudiciously
+prelature
+prelection
+prelibation
+prelicense
+prelicensed
+prelicenser
+prelicenses
+prelicensing
+preliminarily
+prelusion
+prelusive
+prelusively
+prelusory
+premalignant
+preman
+premed
+premedial
+premedian
+premedical
+premedieval
+premedieval's
+premedievalism
+premedievalism's
+premedievalisms
+premedievals
+premeditator
+premeiotic
+premenstrual
+premenstrually
+premership
+premie
+premillenarian
+premillenarianism
+premillennial
+premillennialism
+premillennialist
+premillennially
+premiss
+premolar
+premonish
+premonitorily
+premorse
+premune
+premunition
+prename
+prenatal
+prenatally
+prenominate
+prenomination
+prenotion
+preoccupancy
+preoperative
+preoperatively
+preorbital
+preordain
+preordained
+preordaining
+preordains
+preordination
+preoviposition
+preovulatory
+prepackage
+preparator
+preparatorily
+prepausal
+prepay
+prepense
+prepensely
+preplan
+preponderancy
+prepositive
+prepositively
+prepossess
+prepossessing
+prepossessingly
+prepossessingness
+prepossession
+prepotency
+prepotent
+prepotently
+preppie
+preprandial
+preprocess
+preprocessed
+preprocesses
+preprofessional
+prepuberal
+prepuberally
+prepubertal
+prepubertally
+prepuberty
+prepubescence
+prepuce
+prepunch
+prepupal
+preputial
+prerealization
+prerealization's
+prerealizations
+prerealize
+prerealizes
+prerecord
+presageful
+presanctified
+presbyope
+presbyopia
+presbyopic
+presbyter
+presbyterate
+presbyterial
+presbyterially
+presbytery
+prescient
+prescientific
+presciently
+prescind
+prescore
+prese
+preselection
+presell
+presentability
+presentably
+presentative
+presentee
+presentient
+presentiment
+presentimental
+presentment
+preservable
+preservationist
+presettable
+presetting
+preshrunk
+presidentship
+presidial
+presidiary
+presidio
+presidium
+presignify
+presley
+presoak
+pressboard
+pressmark
+pressor
+pressroom
+pressrun
+presswork
+prest
+prester
+presternum
+prestigeful
+prestissimo
+prestress
+prestressed
+presumptive
+presumptively
+presynaptic
+presynaptically
+pretax
+preteen
+pretensionless
+preterit
+preterite
+preterition
+preteritive
+preterminal
+pretermission
+pretermit
+preternatural
+preternaturally
+preternaturalness
+pretreat
+pretreatment
+prettification
+prettify
+prettyish
+pretubercular
+pretuberculous
+pretzel
+prevaricate
+prevaricated
+prevaricates
+prevaricating
+prevarication
+prevaricator
+prevenient
+preveniently
+preventability
+preventative
+preventible
+preverbal
+previsional
+previsionary
+prevocalic
+prevocational
+prevue
+prexy
+priapic
+pricey
+pricier
+pricket
+prickier
+pricky
+pricy
+prideful
+pridefully
+pridefulness
+priesthood
+prieur
+priggery
+priggism
+prima
+primality
+primateship
+primatial
+primatological
+primatologist
+primatology
+primero
+primipara
+primiparity
+primiparous
+primitivist
+primitivistic
+primitivity
+primmer
+primmest
+primming
+primo
+primogenitor
+primogeniture
+primos
+primrdium
+primula
+primus
+princedom
+princekin
+princelet
+princeling
+princeship
+princesse
+principalship
+principial
+principium
+princox
+prink
+prinker
+printability
+printemps
+printery
+printless
+priorate
+prioress
+prioresses
+priorship
+pripet
+prise
+prisere
+prismatically
+prismatoid
+prismatoidal
+prismoid
+prismoidal
+prissily
+pristane
+prithee
+privatdocent
+privatdozent
+privatism
+privet
+privily
+privity
+prix
+prizefight
+prizefighter
+prizefighting
+prizewinner
+proa
+proach
+proaching
+proactive
+probabilism
+proband
+probang
+probational
+probationally
+probationary
+probatory
+probenecid
+probit
+probosces
+proboscidean
+proboscidian
+proboscis
+procambial
+procambium
+procaryote
+procaryotic
+procathedral
+procephalic
+procercoid
+processability
+processable
+processibility
+processible
+proclimax
+proclitic
+proconsul
+proconsular
+proconsulate
+proconsulship
+procreant
+procreator
+procryptic
+proctodaeum
+proctologic
+proctological
+proctologist
+proctology
+proctorial
+proctorship
+procumbent
+procurable
+procurance
+procuration
+procurator
+procuratorial
+procuress
+prodder
+prodigality
+prodromal
+prodromata
+prodrome
+prodromes
+prodromic
+productional
+proemial
+proenzyme
+proestrus
+profanation
+profanatory
+professeur
+professorate
+professoriat
+professoriate
+profili
+profitless
+profitted
+profitting
+profligacy
+profluent
+prog
+progamete
+progestational
+progesterone
+progestin
+progestogen
+progging
+proglottid
+proglottidean
+proglottis
+prognathic
+prognathism
+prognathous
+prognostic
+prograde
+programmatic
+programmatically
+progressional
+progressionist
+progressist
+progressivist
+progressivistic
+prohibitionist
+projectable
+projectional
+projet
+projets
+prokaryote
+prokaryotic
+prolactin
+prolamin
+prolamine
+prolan
+prolapse
+prolapsed
+prolapsing
+prole
+proleptic
+proletarian
+proliferous
+proliferously
+prolificacy
+prolificity
+proline
+prolocutor
+prolotherapy
+prolusion
+prolusions
+prolusory
+prom
+promazine
+promisee
+promisor
+promissory
+promotability
+promotable
+promptbook
+promptbooks
+promulgator
+pronatalism
+pronatalist
+pronate
+pronated
+pronating
+pronation
+pronator
+pronephric
+pronephros
+pronghorn
+pronghorns
+pronominal
+pronominally
+pronuclear
+pronucleus
+pronunciamento
+pronunciational
+prooflike
+proofread
+proofroom
+propaedeutic
+propagable
+propagandism
+propagandistically
+propagational
+propagator
+propagule
+proparoxytone
+propellent
+propellor
+propend
+propense
+properdin
+propertyless
+prophage
+prophase
+prophasic
+prophetess
+prophetical
+prophylactic
+prophylactically
+prophylaxis
+propine
+propined
+propining
+propionibacteria
+propitiable
+propitiator
+propitiatory
+proplastid
+propman
+propolis
+propone
+proponed
+proponing
+proportionable
+proportionably
+propos
+propositus
+propranolol
+proprietress
+proprioceptor
+proptosis
+propulsive
+propyl
+prorogate
+prorogation
+prorogue
+prorogued
+proroguing
+prosaically
+prosaism
+prosaist
+prosateur
+prosciutto
+proscriptive
+proscriptively
+prosector
+prosectorial
+prosecutable
+proselyte
+proselytism
+proseminar
+prosencephalic
+prosencephalon
+prosenchyma
+prosenchymas
+prosenchymata
+prosenchymatous
+prosier
+prosily
+prosiness
+prosit
+proso
+prosobranch
+prosodical
+prosodically
+prosodist
+prosoma
+prosomal
+prosopographical
+prosopography
+prosopopoeia
+prossed
+prosser
+prost
+prostaglandin
+prostatectomy
+prostatic
+prostatism
+prostatitis
+prosthesis
+prosthetically
+prosthodontics
+prosthodontist
+prostitutor
+prostomial
+prostomium
+prosy
+protamine
+protasis
+protatic
+protea
+protectant
+protectionism
+protectoral
+protectorship
+protectory
+protectress
+proteid
+proteide
+proteinaceous
+proteinase
+proteinate
+proteinuria
+proteinuric
+protend
+protensive
+protensively
+proteoclastic
+proteose
+proteranthous
+proteranthy
+protestor
+proteus
+prothalamion
+prothalamium
+prothallial
+prothallium
+prothallus
+prothesis
+prothetelic
+prothetely
+prothetic
+prothonotarial
+prothonotary
+prothoracic
+prothorax
+prothrombin
+protist
+protistan
+protitch
+protium
+proto
+protoderm
+protodermal
+protogalaxy
+protogeometric
+protohistorian
+protohistoric
+protohistory
+protohuman
+protolanguage
+protolithic
+protomartyr
+protonate
+protonated
+protonation
+protonema
+protonemal
+protonematal
+protonic
+protonotary
+protonymph
+protonymphal
+protopathic
+protophloem
+protophyta
+protoplanet
+protoplast
+protoplastic
+protoporphyrin
+protostar
+protostele
+protostelic
+prototroph
+prototrophic
+prototrophy
+prototypal
+protoxylem
+protozoal
+protozoic
+protozoological
+protozoologist
+protozoology
+protozoon
+protractile
+protraction
+protractor
+protreptic
+protrusible
+protuberatly
+proudful
+proudhearted
+provascular
+provement
+provender
+provenience
+provincialist
+provinciality
+proviral
+provirus
+provisionary
+provisons
+provisory
+provitamin
+provolone
+proxemic
+proxemics
+proximo
+proxmire
+prude
+prude's
+prudery
+prudes
+prudish
+prudishly
+prudishness
+pruinose
+prurience
+pruriency
+pruriginous
+prurigo
+pruritic
+pruritus
+prussiate
+prussic
+prutot
+pryer
+psalmbook
+psalmody
+psalter
+psalterium
+psaltery
+psaltry
+psephological
+psephologist
+psephology
+pseud
+pseudepigraph
+pseudepigraphon
+pseudepigraphy
+pseudoallele
+pseudoallelic
+pseudoallelism
+pseudoclassic
+pseudoclassicism
+pseudoenergy
+pseudomedieval
+pseudomedieval's
+pseudomedievals
+pseudonymity
+pseudonymous
+pseudonymously
+pseudonymousness
+pseudopotential
+pseudoscience
+pseudoscientific
+pseudoscientist
+pseudoscorpion
+pseudosophisticated
+pseudosophistication
+pseudotuberculosis
+psychedelia
+psychedelically
+psychiatrically
+psychoanalytical
+psychoanalytically
+psychobiographical
+psychobiography
+psychobiologic
+psychobiological
+psychobiologist
+psychochemical
+psychodrama
+psychodramatic
+psychodynamic
+psychodynamically
+psychodynamics
+psychogenesis
+psychogenetic
+psychogenic
+psychogenically
+psychognosis
+psychognosy
+psychograph
+psychokinesis
+psychokinetic
+psycholinguist
+psychologic
+psychologism
+psychometrically
+psychomotor
+psychoneurosis
+psychoneurotic
+psychopathically
+psychopathologic
+psychopathological
+psychopathologically
+psychopathologist
+psychopathology
+psychopathy
+psychopharmaceutical
+psychopharmacologic
+psychopharmacological
+psychopharmacologist
+psychopharmacology
+psychophysicist
+psychophysiologic
+psychophysiological
+psychophysiologically
+psychophysiologist
+psychopomp
+psychosexual
+psychosexuality
+psychosexually
+psychosomatically
+psychosurgery
+psychosurgical
+psychotherapeutically
+psychotherapist
+psychotically
+psychotogen
+psychotogenic
+psychotomimetic
+psychotomimetically
+psychotropic
+psychrometer
+psychrometer's
+psychrometers
+psychrometric
+psychrometry
+psychrophilic
+psyllium
+pterodactyl
+pterodactyl's
+pterodactyls
+ptolemaists
+ptomaine
+puberal
+pubertal
+puberulent
+pubes
+pubescence
+pubic
+pubis
+publican
+publicans
+publicist
+publick
+publique
+publishable
+puccoon
+puce
+pucka
+puckery
+pud
+puddingstone
+pudency
+pudendal
+pudendum
+puerperal
+puerperium
+pug
+pugaree
+puggaree
+pugging
+pugilism
+pugilist
+pugilistic
+pugmark
+pugnacious
+pugnaciously
+pugnaciousness
+pugnacity
+puisne
+puissance
+pukka
+pul
+pulchritude
+pulchritudinous
+pule
+puler
+puli
+pulicide
+pulik
+puling
+pulis
+pullback
+pullet
+pullout
+pullulate
+pullulation
+pulmonate
+pulmonic
+pulmotor
+pulpal
+pulpally
+pulpiness
+pulpwood
+pulpy
+pulque
+pulsant
+pulsator
+pulsatory
+pulsimeter
+pulsimeter's
+pulsimeters
+pulsometer
+pulsometer's
+pulsometers
+pulverulent
+pulvillus
+pulvinus
+pumiceous
+pumicite
+pumpernickel
+pumpkinseed
+pumpkinseeds
+puna
+punchball
+punchballs
+punchboard
+puncheon
+punchier
+punchinello
+punchless
+punchy
+punctate
+punctation
+punctilio
+punctilious
+punctiliously
+punctiliousness
+punctuator
+pung
+punily
+punishability
+punition
+punkah
+punkie
+punkin
+punnier
+punning
+punny
+punties
+punty
+pupae
+puparia
+puparial
+puparium
+pupfish
+pupilage
+pupilar
+pupillage
+pupillary
+pupiparous
+puppetry
+pupping
+purblind
+purblindly
+purblindness
+purdah
+purdew
+pureblood
+purebred
+puree
+puree's
+pureed
+pureeing
+purees
+purfle
+purfled
+purfling
+purgatorial
+purificator
+purificatory
+purifing
+purine
+puristic
+puritanism
+purl
+purled
+purler
+purlers
+purlieu
+purlin
+purling
+puromycin
+purplish
+purply
+purpura
+purpure
+purpuric
+purselike
+pursewarden
+pursier
+pursiness
+purslane
+pursuance
+pursuivant
+pursy
+purtenance
+purulence
+purulent
+purveyance
+purvis
+pushball
+pushcart
+pushchair
+pushchairs
+pushful
+pushfulness
+pushily
+pushout
+pushover
+pushover's
+pushovers
+pushpin
+pushpin's
+pushpins
+pusillanimity
+pusillanimous
+pusillanimously
+pussyfoot
+pussyfooter
+pussyfooting
+pussytoes
+pustulant
+pustular
+pustulate
+pustulated
+pustulation
+pustule
+pustules
+putains
+putas
+putdown
+putdown's
+putdowns
+putout
+putrefaction
+putrefactive
+putrescence
+putrescent
+putrescible
+putrescine
+putridity
+putsch
+putschist
+puttana
+puttee
+puttees
+puttyroot
+puzzleheaded
+puzzleheadedness
+pycnidium
+pycnogonid
+pycnometer
+pycnometer's
+pycnometers
+pyelitis
+pyelonephritic
+pyelonephritis
+pyemia
+pyemic
+pygidial
+pygidium
+pygmaean
+pygmean
+pygmoid
+pygmyish
+pygmyism
+pyknic
+pylon
+pylons
+pylori
+pyloric
+pylorus
+pyocanea
+pyoderma
+pyodermic
+pyogenic
+pyracanth
+pyracantha
+pyralid
+pyralidid
+pyramidical
+pyran
+pyranoid
+pyranose
+pyranoside
+pyrargyrite
+pyrene
+pyrenoid
+pyrethrin
+pyrethroid
+pyrethrum
+pyretic
+pyrexia
+pyrexial
+pyrexic
+pyrheliometer
+pyrheliometer's
+pyrheliometers
+pyrheliometric
+pyric
+pyridoxal
+pyridoxamine
+pyridoxin
+pyridoxine
+pyriform
+pyrimethamine
+pyrimidine
+pyrimidines
+pyrite
+pyrites
+pyritic
+pyrocatechol
+pyrocellulose
+pyrochemical
+pyrochemically
+pyroclastic
+pyroelectric
+pyroelectricity
+pyrogallol
+pyrogen
+pyrogenic
+pyrogenicity
+pyrogenous
+pyrola
+pyroligneous
+pyrolusite
+pyrolytic
+pyrolytically
+pyromancy
+pyromania
+pyromaniac
+pyromaniac's
+pyromaniacal
+pyromaniacs
+pyrometallurgical
+pyrometallurgy
+pyrometric
+pyrometrically
+pyromorphite
+pyronine
+pyroninophilic
+pyrope
+pyrophoric
+pyrophosphatic
+pyrophyllte
+pyrosis
+pyrotechnical
+pyrotechnically
+pyrotechnist
+pyroxenic
+pyroxenitic
+pyroxenoid
+pyroxylin
+pyrrhic
+pyrrhotite
+pyrrhuloxia
+pyrrol
+pyrrole
+pyrrolic
+pyruvate
+pyschiatrist
+pythoness
+pythonic
+pythonine
+pyuria
+pyx
+pyxides
+pyxidium
+pyxie
+pyxis
+qua
+quackish
+quadded
+quadding
+quadrantal
+quadraphonic
+quadraphonics
+quadraphony
+quadrat
+quadrate
+quadrated
+quadrates
+quadrating
+quadrennium
+quadricentennial
+quadricipital
+quadrifid
+quadripuntal
+quadrisect
+quadrisected
+quadrisecting
+quadrisects
+quadrisyllabic
+quadrivalent
+quadrivial
+quadroon
+quadroons
+quadrumvir
+quadrumvirate
+quadruped
+quadrupedal
+quadrupeds
+quadruplet
+quadruplets
+quadruplicity
+quadruply
+quadrupolar
+quadrupole
+quaestor
+quag
+quai
+quaich
+qualmish
+qualmishly
+qualmishness
+qualmy
+quant
+quantal
+quantasome
+quantic
+quantifiably
+quantificational
+quantificationally
+quantifys
+quantitate
+quantitated
+quantitates
+quantitating
+quantitation
+quantitations
+quarantinable
+quark
+quarks
+quartan
+quarterage
+quarterdeck
+quarterdecks
+quarterfinal
+quarterfinalist
+quartern
+quarternary
+quarterstaff
+quartette
+quartic
+quartics
+quarto
+quartos
+quartziferous
+quartzitic
+quartzose
+quasimodo
+quasiparticle
+quatercentenary
+quaternion
+quaternity
+quatrefoil
+quattrocento
+quattuordecillion
+quavery
+quayage
+quayside
+quean
+queasily
+queazy
+queenship
+queerish
+quenchable
+quenchless
+querilla
+querist
+quern
+querns
+questionary
+questionless
+questor
+quetzal
+quetzales
+quib
+quibs
+quickset
+quid
+quid's
+quiddity
+quids
+quiescence
+quietism
+quietist
+quietus
+quiff
+quiffed
+quiffs
+quillwort
+quince
+quinces
+quincuncial
+quincuncially
+quincunx
+quincunxes
+quincunxial
+quindecillion
+quinidine
+quiniela
+quinoa
+quinoid
+quinoidine
+quinoline
+quinquennium
+quinquevalent
+quinquivalent
+quintain
+quintal
+quintessence
+quintette
+quintic
+quintuple
+quintupled
+quintuples
+quintuplet
+quintuplet's
+quintuplets
+quintuplicate
+quintuplicated
+quintuplicates
+quintuplicating
+quintupling
+quintus
+quipped
+quipster
+quirkily
+quirkiness
+quirky
+quisling
+quislingism
+quitch
+quitclaim
+quitrent
+quittance
+quitted
+quittor
+quixotical
+quixotically
+quixotry
+quizmaster
+quizzer
+quizzicality
+quod
+quodlibet
+quoin
+quoit
+quoits
+quondam
+quot
+quotable
+quotidian
+rRNA
+rabbet
+rabbeted
+rabbeting
+rabbets
+rabbinate
+rabbinic
+rabbinism
+rabbitry
+rabbity
+rabblement
+rabic
+rabidity
+racecourse
+racecourses
+racemate
+racemic
+racemose
+rachet
+rachides
+rachiodont
+rachis
+rachises
+rachitic
+rachitis
+racialism
+racialist
+racialistic
+racily
+racine
+rackle
+racon
+raconteur
+racoon
+rad
+radarscope
+radarscopes
+raddle
+raddled
+raddles
+raddling
+radiale
+radiancy
+radiational
+radiationless
+radic
+radicand
+radicate
+radicle
+radicular
+radioautograph
+radioautographic
+radioautography
+radiobiologic
+radiobiological
+radiobiologically
+radiobiologist
+radiobiology
+radiobroadcast
+radiobroadcaster
+radiobroadcasting
+radiocast
+radiocaster
+radiochemist
+radiochlorine
+radioecological
+radioecologist
+radioecology
+radioelement
+radiogenic
+radiogram
+radiogram's
+radiograms
+radiograph
+radiographically
+radioimmunoassay
+radioisotope
+radioisotopic
+radioisotopically
+radiolarian
+radiolocation
+radiologist
+radiolucency
+radiolucent
+radiolysis
+radiolytic
+radiometeorograph
+radiometrically
+radiomimetic
+radionuclide
+radiopaque
+radiophone
+radiophoto
+radiophotograph
+radioscopic
+radioscopy
+radiosensitive
+radiosensitivity
+radiosonde
+radiostrontium
+radiosymmetrical
+radiotelegraph
+radiotelegraphic
+radiotelegraphy
+radiotelephone
+radiotelephony
+radiotherapist
+radiothorium
+radiotracer
+radome
+rads
+radula
+radular
+raff
+raffia
+raffinose
+raftsman
+raga
+ragamuffin
+ragbag
+raggedy
+raggle
+ragi
+raglan
+ragman
+ragpicker
+ragtag
+ragtime
+rah
+rainmaker
+rainmaking
+rainproof
+rainspout
+rainsquall
+rainwash
+rainwear
+raj
+raja
+rale
+rallye
+rallyist
+rallymaster
+ramate
+rambunctious
+rambunctiously
+rambunctiousness
+ramekin
+ramentum
+ramequin
+rami
+ramie
+ramiform
+ramillies
+ramirez
+rammer
+ramose
+ramosely
+ramous
+rampageous
+rampageously
+rampageousness
+rampancy
+rampion
+ramshackle
+ramus
+ranchman
+ranian
+rantry
+ranunculus
+rapacity
+rapine
+rapist
+rappee
+rappen
+rapporteur
+rapscallion
+raptor
+raptorial
+rapunzel
+rarebit
+rarefaction
+rarefactional
+rarefactive
+rarify
+rasa
+rascality
+rasing
+rasorial
+raspy
+rasure
+rata
+ratably
+ratafia
+rataplan
+ratch
+ratel
+ratemeter
+ratemeter's
+ratemeters
+ratepayer
+ratepayers
+rathe
+rathskeller
+raticide
+ratificationist
+ratiocinator
+rationalistically
+ratlike
+ratline
+raton
+ratoon
+rattan
+ratted
+ratteen
+ratter
+ratting
+rattlebrain
+rattlebrained
+rattletrap
+rattly
+rattrap
+raunchier
+raunchily
+raunchiness
+raunchy
+ravagement
+ravel
+ravelment
+ravels
+ravioli
+ravishment
+rawinsonde
+rawlings
+rawlins
+rayless
+raylessness
+rayon
+razeed
+razeeing
+razorbill
+razz
+razzmatazz
+reabsorb
+reabsorption
+reacquaint
+reacquire
+reacquisition
+reactance
+reactances
+reactional
+reactionally
+reactionaryism
+reaggregate
+reaggregation
+realpolitik
+reapportion
+rearhorse
+rearm
+rearmament
+rearming
+rearmost
+rearward
+rearwardly
+rearwards
+reasonability
+reasonless
+reasonlessly
+reassembly
+reave
+reaver
+reaving
+reb
+rebarbative
+rebarbatively
+reboant
+rebs
+rebus
+rebuttable
+rebutter
+recalcitrance
+recalcitrancy
+recalescence
+recallability
+recantation
+recap
+recatory
+receivership
+recension
+receptaculum
+recessional
+recessionary
+recharge
+rechargeable
+recharger
+recharging
+recheat
+recidivism
+recidivist
+recidivistic
+reciprocator
+recision
+recitalist
+recitativo
+reck
+reclinate
+reclosable
+recoin
+recombinant
+recommit
+recommitment
+recompence
+recompose
+reconcilability
+reconcilable
+reconcilableness
+reconcilement
+reconfirm
+reconfirmation
+reconstitute
+reconstitution
+reconstructionism
+reconstructionist
+reconstructor
+recontaminate
+reconversion
+reconvert
+reconverted
+reconvey
+reconveyance
+recordable
+recordation
+recordist
+recoupable
+recoupment
+recreant
+recreatable
+recreationist
+recriminatory
+recrudesce
+recrudescence
+recrudescent
+rectal
+rectally
+rectangularity
+recti
+rectifiability
+rectifiable
+recting
+rection
+rectitudinous
+rective
+recto
+rectorate
+rectorial
+rectorship
+rectos
+rectrices
+rectrix
+rectus
+recumbency
+recusancy
+redaction
+redactional
+redargue
+redbone
+redcap
+redded
+reddy
+rede
+redear
+redecorate
+redecorator
+redeemable
+redemptional
+redemptory
+redeploy
+redeployed
+redeployment
+redescribe
+redescription
+redetermine
+redetermined
+redetermining
+redhook
+redhorse
+redia
+rediae
+redial
+redias
+redintegrate
+redintegration
+redintegrative
+rediscount
+rediscountable
+redistributory
+redistrict
+redivivus
+redleg
+redolence
+redolent
+redolently
+redondo
+redoubt
+redoubtably
+redout
+redox
+redpoll
+redroot
+redshank
+redshift
+redshifted
+redshifting
+redshifts
+redshirt
+redskin
+redstart
+redtop
+reductant
+reductase
+reductio
+reductional
+reductionist
+reductionistic
+reduplicate
+reduplication
+reduplicative
+reduplicatively
+reduviid
+redwing
+ree
+reedbuck
+reedify
+reeducate
+reeducative
+reeky
+reelable
+reembroider
+reemphasization
+reemphasization's
+reemploy
+reemployment
+reenforce
+reenlist
+reenlisted
+reenlistment
+reentrance
+reest
+reestablishment
+ref
+reface
+refacing
+refect
+refection
+referable
+refinish
+refinisher
+refinishes
+refinishing
+refit
+reflation
+reflationary
+reflectional
+reflectometer
+reflectometer's
+reflectometers
+reflectometry
+reflexion
+reflexology
+reflorescence
+reflorescent
+reflow
+refluence
+reforest
+reforge
+reformate
+reformational
+refractile
+refractivities
+refractivity
+refractometric
+refractometry
+refractor
+refractorily
+refrainment
+refrangibility
+refrangible
+refrangibleness
+refrigerant
+refringent
+reft
+refugeeism
+refugium
+refulgence
+refulgent
+refundability
+refundable
+refurbishment
+refutably
+regality
+regardant
+regardful
+regardfully
+regardfulness
+regelation
+regenerable
+regeneracy
+regenerator
+regental
+regicidal
+regicide
+regimental
+regimentally
+regimentals
+regionalist
+regionalistic
+regisseur
+regius
+reglet
+regna
+regnal
+regnant
+regnum
+regolith
+regorge
+regorged
+regorging
+regosol
+regrant
+regreet
+regressor
+regretless
+regretter
+regrid
+regridded
+regridding
+regrow
+regurgitate
+regurgitated
+regurgitates
+regurgitating
+regurgitation
+regurgitative
+rehabilitant
+rehabilitationist
+rehabilitator
+rehear
+rehouse
+rehousing
+rehydratable
+rehydrate
+rehydration
+reichsmark
+reification
+reified
+reify
+reifying
+reimpression
+reincarnationist
+reinfection
+reinforceable
+reinhard
+reinhardt
+reinless
+reinsman
+reinsurance
+reinsure
+reinsurer
+reintegrate
+reintegration
+reintegrative
+reinvestment
+reinvigorate
+reinvigorator
+reiterator
+reive
+reiver
+reiving
+rejectee
+rejuvenate
+rejuvenated
+rejuvenates
+rejuvenating
+rejuvenation
+rejuvenator
+rejuvenescence
+rejuvenescent
+relatable
+relator
+relaxant
+relaxin
+releasability
+releasably
+relection
+reliction
+relievable
+relievo
+religionist
+religiose
+reline
+relinquishment
+reliquary
+relique
+reliquiae
+relishable
+relocatee
+relucent
+reluctancy
+reluctate
+reluctated
+reluctation
+reluctivity
+relume
+relumed
+relumine
+reluming
+remaines
+reman
+remanence
+remanent
+remanufacture
+remanufacturer
+remap
+remarque
+remediably
+remedially
+remediate
+remediation
+remediless
+remedilessly
+rememberability
+rememberable
+remigial
+remindful
+reminiscential
+remint
+remise
+remised
+remising
+remissible
+remissibly
+remitment
+remittable
+remittal
+remittent
+remittently
+remitter
+remonstrance
+remonstrant
+remonstrantly
+remonstrator
+remount
+removability
+removably
+remunerator
+remuneratory
+remus
+renascence
+renderable
+renegade
+renegades
+renege
+reneged
+reneger
+reneges
+reneging
+renewability
+renewably
+reniform
+renig
+renigged
+renigging
+renin
+renitency
+renitent
+rennet
+rennin
+renographic
+renography
+renominate
+renominating
+renomination
+renouncement
+renovator
+rentability
+rentable
+rente
+rentier
+renunciatory
+reoccupy
+reoccur
+reoccurrence
+rep
+repack
+repacker
+repacking
+repairability
+repand
+reparative
+repass
+repassage
+repatriate
+repatriated
+repatriates
+repatriating
+repatriation
+repealable
+repellant
+repellency
+repeller
+repercussive
+repetend
+repetitional
+replant
+repleviable
+replevied
+replevies
+replevin
+reportable
+reposal
+reposeful
+reposefully
+reposefulness
+reposit
+reposited
+repositing
+repossess
+repossession
+repower
+reprehend
+reprehensibility
+reprehensibly
+reprehension
+reprehensive
+representationalism
+representationalist
+repressibility
+repressible
+repressionist
+repressor
+reprieval
+repristinate
+repristination
+repro
+reproachable
+reproachful
+reproachfully
+reproachfulness
+reprobance
+reprobatory
+reprocess
+reprocessable
+reprocesses
+repros
+repudiationist
+repudiator
+repugn
+repugnancy
+reputability
+req
+requestioner
+requestor
+requiescat
+requin
+requital
+reradiate
+reradiation
+reredos
+reremouse
+rereward
+resail
+rescale
+rescindment
+rescission
+rescissory
+rescript
+researchist
+resect
+resectability
+resectable
+resection
+reseed
+resend
+resending
+reserpine
+reservist
+reservists
+resettable
+reship
+reshipment
+reshipper
+reshuffle
+residua
+resile
+resiled
+resiliency
+resiling
+resinate
+resinify
+resinoid
+resinous
+resiny
+resistable
+resistibility
+resistless
+resistlessly
+resistlessness
+resitting
+resojet
+resole
+resolvent
+resorb
+resorcinol
+resorption
+resorptive
+respell
+respirable
+respirational
+respirometer
+respirometer's
+respirometers
+respirometric
+respirometry
+resplendence
+resplendency
+responsory
+responsum
+ressentiment
+resses
+restage
+restartable
+restauranteur
+restitute
+restorable
+restoral
+restrainable
+restrictionism
+restrictionist
+restrike
+resultful
+resultfulness
+resultless
+resupinate
+resupination
+resupine
+resurgam
+resurge
+resurging
+resurrectional
+resurrectionist
+resuscitator
+resuscitators
+resvering
+ret
+retable
+retake
+retardate
+retentivity
+retenue
+retia
+retiarius
+reticency
+reticule
+reticulocyte
+reticulocytic
+reticulose
+retiform
+retinacular
+retinaculum
+retinae
+retinene
+retinitis
+retinol
+retinopathy
+retinoscopy
+retinospora
+retinula
+retinular
+retirant
+retool
+retortion
+retot
+retouch
+retoucher
+retractile
+retractility
+retrainable
+retrainee
+retral
+retrally
+retread
+retreaded
+retreading
+retreatant
+retrench
+retrial
+retributive
+retributively
+retributory
+retrievability
+retroaction
+retroactivity
+retrocede
+retrocession
+retrofire
+retrofitted
+retrogradation
+retrogress
+retrogression
+retrolental
+retrolingual
+retropack
+retroperitoneal
+retroperitoneally
+retroreflection
+retroreflective
+retroreflector
+retrorse
+retrorsely
+retroserrate
+retroversion
+rets
+retsina
+retted
+retting
+returnee
+returnee's
+returnees
+retuse
+reunification
+reunify
+reunionist
+reunionistic
+rev
+revalidate
+revalidating
+revaluate
+revalue
+revanche
+revanchist
+revealable
+revealment
+revegetate
+revegetation
+revehent
+reveille
+reveilles
+revelator
+revenant
+rever
+reverb
+reverberant
+reverberantly
+reverberatory
+reverential
+reverentially
+revers
+reversibly
+reversional
+reversionary
+revertible
+revery
+revest
+revetment
+revetted
+revictual
+revilement
+revisal
+revisionism
+revisor
+revisory
+revivable
+revivalist
+revivalistic
+revivalists
+revivification
+revivify
+reviviscence
+reviviscent
+revokable
+revoluable
+revolute
+revolutionarily
+revolutionibus
+revolutionist
+revolvable
+revs
+revulsed
+revulsive
+rew
+rewake
+rewaken
+rewardable
+rexroth
+rey
+reynard
+rezone
+rhabdom
+rhabdomancy
+rhabdome
+rhabdomere
+rhadamanthine
+rhamnaceous
+rhamnose
+rhamnus
+rhaphe
+rhapsodical
+rhapsodically
+rhapsodist
+rhatany
+rhebok
+rheims
+rheinholdt
+rheological
+rheologically
+rheologist
+rheometer
+rheometer's
+rheometers
+rheophile
+rheophilic
+rheostatic
+rhesus
+rhet
+rhetor
+rheumatically
+rheumatiz
+rheumatoid
+rheumatologist
+rheumatology
+rheumy
+rhinal
+rhinelander
+rhinencephalic
+rhinencephalon
+rhinitis
+rhinocerotic
+rhinolaryngology
+rhinopharyngitis
+rhinoscopy
+rhinosporidium
+rhinovirus
+rhizanthous
+rhizobium
+rhizocarpic
+rhizocarpous
+rhizocephalan
+rhizocephalid
+rhizoctonia
+rhizogenesis
+rhizogenetic
+rhizogenic
+rhizoid
+rhizoidal
+rhizomatous
+rhizome
+rhizomic
+rhizomorphous
+rhizoplane
+rhizopod
+rhizopodal
+rhizopodous
+rhizopus
+rhizosphere
+rhizotomy
+rhodamine
+rhodochrosite
+rhodomontade
+rhodoplast
+rhodopsin
+rhodora
+rhomb
+rhombencephalon
+rhombi
+rhombohedral
+rhombohedron
+rhomboid
+rhomboidal
+rhomboideus
+rhombs
+rhonchi
+rhonchus
+rhumb
+rhumba
+rhumbs
+rhus
+rhuses
+rhymester
+rhyolite
+rhyolitic
+rhythmicity
+rhythmist
+rhytidome
+ri
+rial
+rialto
+riant
+riantly
+riata
+ribaldry
+riband
+ribas
+ribband
+ribber
+ribbonlike
+ribby
+ribgrass
+riblet
+ribonuclease
+ribonucleoprotein
+ribonucleoside
+ribonucleotide
+ribose
+ricci
+ricebird
+ricercar
+richert
+richey
+richland
+richment
+rici
+ricin
+ricinus
+rickards
+rickenbaugh
+rickettsia
+rickey
+rickeys
+rickrack
+ricksha
+ricotta
+rictal
+rictus
+ridded
+ridder
+rideable
+riderless
+ridgeling
+ridgling
+ridgy
+ridotto
+ridpath
+riegger
+riel
+rien
+rier
+rife
+rifely
+riff
+riffle
+riffled
+riffler
+riffles
+riffling
+riffraff
+rification
+rifice
+rificer
+riflebird
+riflery
+riflescope
+rifying
+rigadoon
+rigatoni
+rigaudon
+rightism
+rigidification
+rigidify
+rigorism
+rigorism's
+rigorisms
+rigorist
+rigorist's
+rigoristic
+rigoristics
+rigorists
+rile
+riling
+rilke
+rille
+rillet
+rilly
+rimbaud
+rimier
+rimland
+rimose
+rimous
+rimrock
+rimy
+rin
+rinascimento
+rinderpest
+ringbark
+ringbolt
+ringbolts
+ringbone
+ringboned
+ringdove
+ringel
+ringent
+ringleader
+ringleaders
+ringlike
+ringmaster
+ringmasters
+ringneck
+ringolade
+ringstraked
+ringtail
+ringtaw
+ringtoss
+ringworm
+ringworms
+ripieno
+ripoff
+ripoff's
+ripoffs
+riposte
+ripper
+riprap
+ripsaw
+ripsnorter
+ripsnorting
+riptide
+risibility
+risorgimento
+risotto
+rit
+ritard
+ritualism
+ritualist
+ritualistic
+ritualistically
+ritzier
+ritziness
+ritzy
+rivalrous
+riverbed
+riverview
+riverward
+riverwards
+riverweed
+riyal
+roadability
+roadless
+roadrunner
+roadrunners
+roadstead
+roadwork
+roadworks
+roadworthiness
+roadworthy
+roan
+robalo
+roband
+robbie
+roble
+robustious
+robustiously
+robustiousness
+roc
+rocambole
+rochet
+rockabilly
+rockaway
+rockaways
+rocketeer
+rocketry
+rockettes
+rockfish
+rocklike
+rockling
+rockoon
+rockrose
+rockshaft
+rockskipper
+rococo
+rodenticide
+rodeph
+rodless
+rodlike
+roemer
+roentgenogram
+roentgenogram's
+roentgenograms
+roentgenograph
+roentgenographic
+roentgenographically
+roentgenography
+roentgenologic
+roentgenological
+roentgenologically
+roentgenologist
+roentgenology
+roentgenoscope
+roentgenoscopic
+roentgenoscopy
+roentgenotherapy
+roff
+rogation
+rogueing
+roguery
+roi
+roic
+roily
+roister
+roistered
+roisterer
+roistering
+roisterous
+rolamite
+rollick
+rollie
+rollout
+rollover
+rolnick
+romaine
+romanticist
+romanza
+romaunt
+romulo
+rondeau
+rondeaux
+rondel
+rondelet
+rondelle
+rondure
+ronnel
+ronyon
+roofhouse
+roofless
+rooflike
+roofline
+rooftree
+rookery
+rooky
+roomette
+rooney
+roorback
+roos
+roose
+rootage
+roothold
+rootlet
+rootlike
+rootstalk
+rootstock
+rooty
+ropean
+ropedancer
+ropedancing
+ropery
+ropewalk
+ropewalker
+ropeway
+ropework
+ropier
+ropiness
+ropy
+roque
+roquelaure
+rorqual
+rosabelle
+rosaceous
+rosaniline
+rosarian
+rosebay
+rosefish
+roselike
+rosella
+rosemaling
+roseola
+roseolar
+rosery
+roset
+rosewater
+rosewood
+rosie
+rosily
+rosin
+rosined
+rosining
+rosinous
+rosinweed
+roslev
+rossi
+rossoff
+rostagno
+rostagnos
+rostellar
+rostellate
+rostellum
+rostra
+rostral
+rostrate
+rosulate
+roswell
+rota
+rotaed
+rotameter
+rotameter's
+rotameters
+rotatable
+rotatory
+rote
+rotenone
+rotgut
+rothko
+rotifer
+rotisserie
+rotonda
+rotorcraft
+rotos
+rotted
+rottenstone
+rotter
+rottosei
+rottweiler
+roturier
+rou
+rouen
+roughage
+roughcast
+roughhouse
+roughhoused
+roughhousing
+roughleg
+roughrider
+roughriders
+roulade
+rouleau
+rouleaux
+roundel
+roundelay
+roundish
+roundlet
+roundsman
+roundwood
+roup
+rous
+rouseabout
+rousement
+roust
+rouster
+routeman
+routeway
+routh
+roux
+roven
+rowdily
+rowdyish
+rowdyism
+rowlock
+roxy
+royalism
+royaux
+royster
+rozella
+rozelle
+rozzer
+rpt
+rubasse
+rubato
+rubberlike
+rubberneck
+rubbernecker
+rubbishy
+rubblework
+rubefacient
+rubellite
+rubeola
+rubeolar
+rubicundity
+rubiginous
+rubious
+rubrical
+rubrically
+rubricate
+rubrication
+rubricator
+rubus
+rubythroat
+rucellai
+ruche
+ruching
+ruck
+rucksack
+ruction
+rudbeckia
+rudd
+rudderpost
+rudderstock
+ruddily
+ruddle
+ruddled
+ruddleman
+ruddling
+ruddock
+ruderal
+rudesbies
+rudesby
+rudimental
+rudimentarily
+rufescent
+ruff
+ruffe
+ruffed
+ruffianism
+ruffly
+rufous
+ruga
+rugae
+rugal
+rugate
+rugby
+rugger
+ruggiero
+rugose
+rugosely
+rugosity
+rugulose
+ruh
+ruidoso
+ruinate
+ruleless
+rulership
+rumba
+rumbly
+rumbustious
+rumdum
+rumina
+ruminal
+ruminate
+rumination
+ruminative
+ruminatively
+ruminator
+rummel
+rummer
+rummest
+rumrunner
+runagate
+runaround
+runback
+runcinate
+rundle
+rundlet
+runless
+runlet
+runnel
+runnels
+runneth
+runny
+runout
+runouts
+runover
+runtm
+rupiah
+rupiahs
+rupicoline
+rupicolous
+ruppert
+ruralist
+rurban
+rushall
+rushee
+rushlight
+rushy
+russetting
+russification
+russify
+russula
+rustical
+rustically
+rusticator
+rusticity
+rustily
+ruthenic
+ruthenious
+rutilant
+rutile
+ruttish
+ruttishly
+ruttishness
+ryegrass
+saba
+sabadilla
+sabbat
+sabbatic
+sabin
+sabol
+sabot
+saboteur
+saboteurs
+sabra
+sac
+sacahuiste
+sacaton
+saccade
+saccadic
+saccate
+saccharase
+saccharate
+saccharide
+saccharides
+saccharification
+saccharify
+saccharimeter
+saccharimeter's
+saccharimeters
+saccharimetry
+saccharin
+saccharine
+saccharinity
+saccharoidal
+saccharometer
+saccharometer's
+saccharometers
+saccharomyces
+saccharose
+saccular
+sacculate
+sacculated
+sacculates
+sacculation
+saccule
+sacculus
+sacerdotal
+sacerdotalism
+sacerdotalist
+sacerdotally
+sachem
+sachemic
+sachems
+sachet
+sacheted
+sacheverell
+sackbut
+sackcloth
+sackful
+saclike
+sacque
+sacra
+sacramental
+sacramentalism
+sacramentalist
+sacramentally
+sacrarium
+sacre
+sacrestia
+sacrilegiousnes
+sacring
+sacristan
+sacristy
+sacroiliac
+sacrosanctity
+sacrum
+saddhu
+saddlebow
+saddlecloth
+saddleless
+saddlery
+saddletree
+sadomasochism
+sadomasochist
+sadomasochistic
+safecracker
+safecracking
+safelight
+safetyman
+safflower
+safranin
+safranine
+safrole
+sagami
+saggar
+sagger
+sagittal
+sagittally
+sagittate
+sago
+sagos
+saguaro
+sahib
+sailable
+sailboard
+sailcloth
+sailon
+sailplane
+sailplaner
+sain
+sainfoin
+saintdom
+saintlike
+saintsbury
+saintship
+saith
+saithe
+saki
+sako
+salability
+salamandrine
+salariat
+saleable
+saledo
+saleratus
+saleroom
+salesclerk
+salesroom
+saleswoman
+salic
+salicin
+salicylate
+salida
+salientian
+salimeter
+salimeter's
+salimeters
+salinity
+salinometer
+salinometer's
+salinometers
+sallet
+sallowish
+salmagundi
+salmi
+salmonberries
+salmonberry
+salmonella
+salmonellosis
+salmonid
+salmonoid
+salometer
+salometer's
+salometers
+saloonkeep
+saltarello
+saltation
+saltatorial
+saltatory
+saltbox
+saltbush
+saltcellar
+saltern
+saltily
+saltine
+saltire
+saltless
+saltlike
+saltonstall
+saltshaker
+saltworks
+saltwort
+salubrity
+saluki
+salutarily
+salutaris
+salutational
+salutatorian
+salutatory
+salutiferous
+salutory
+salvable
+salvageability
+salvational
+salvationism
+salvationist
+salverform
+salvific
+salvoes
+salvor
+samar
+samara
+samarium
+samarskite
+samba
+sambar
+sambur
+samisen
+samite
+samlet
+samp
+sampan
+samphire
+samurai
+samurai's
+samurais
+sanatarium
+sanative
+sanbenito
+sancta
+sanctimony
+sanctum
+sandarac
+sandbagger
+sandbank
+sandbar
+sandbox
+sandbur
+sandglass
+sandhog
+sandling
+sandlot
+sandlotter
+sandpapery
+sandsoap
+sandstorm
+sandstorms
+sandworm
+sandworms
+sangaree
+sangfroid
+sanguinaria
+sanguinarily
+sanguineum
+sanguinity
+sanguinolent
+sanicle
+sanious
+sanipractor
+sanitaire
+sanitarian
+sanitarily
+sanitorium
+sannyasi
+sans
+sansei
+sanseis
+sanserif
+sansevieria
+sanskritic
+sansom
+sansome
+sant
+santolina
+santonica
+santonin
+santour
+saphead
+sapheaded
+saphenous
+sapid
+sapidity
+sapience
+sapiens
+sapient
+sapiently
+sapio
+sapless
+saplessness
+sapodilla
+sapogenin
+saponaceous
+saponaceousness
+saponifiable
+saponification
+saponifier
+saponify
+saponin
+saponins
+saponite
+sapor
+saporous
+sapota
+sapper
+sapphic
+sapphirine
+sapphism
+sapremia
+sapremic
+saprobe
+saprobic
+saprobically
+saprogenic
+saprogenicity
+saprolite
+sapropelic
+saprophagous
+saprophyte
+saprophytic
+saprophytically
+saprozoic
+sapsago
+saraband
+sarabande
+sarape
+sarasate
+sarcenet
+sarcoid
+sarcoidosis
+sarcolemma
+sarcolemmal
+sarcomatosis
+sarcomatous
+sarcomere
+sarcomeric
+sarcophagic
+sarcophagous
+sarcophagus
+sarcophagy
+sarcoplasm
+sarcoplasma
+sarcoplasmatic
+sarcoplasmic
+sarcosomal
+sarcosome
+sardonically
+sardonicism
+sardonyx
+sargasso
+sargassum
+sarge
+sarmi
+sarod
+sarode
+sarodist
+sarong
+sarong's
+sarongs
+sarpsis
+sarsaparilla
+sarsenet
+sarsparilla
+sarti
+sartorial
+sartorially
+sashimi
+saskatoon
+sass
+sassier
+sasswood
+sassy
+satang
+satangs
+satanically
+satchelful
+sateen
+satem
+sati
+satiety
+satinet
+satinwood
+satiny
+satori
+saturable
+saturant
+saturator
+saturnali
+saturnalian
+saturnalianly
+saturniid
+satyriasis
+satyric
+satyrid
+saucebox
+saucerlike
+sauch
+sauerbraten
+sauger
+saurel
+saurian
+sauries
+sauropod
+savable
+savagism
+savanna
+savanna's
+savannas
+savant
+savants
+savate
+saveable
+sawbelly
+sawbones
+sawboneses
+sawbuck
+sawfish
+sawfly
+sawlike
+sawtimber
+saxhorn
+saxifrage
+saxophonic
+saxton
+sayable
+scabbier
+scabbing
+scabble
+scabbled
+scabbles
+scabbling
+scabby
+scabies
+scabietic
+scabiosa
+scabious
+scad
+scad's
+scads
+scag
+scagliola
+scalade
+scalado
+scalage
+scalare
+scalariform
+scalariformly
+scalation
+scalawag
+scaleless
+scalelike
+scalene
+scalepan
+scallion
+scallopini
+scallywag
+scallywags
+scalogram
+scalogram's
+scalograms
+scammed
+scamming
+scammony
+scampi
+scampini
+scampish
+scandalmonger
+scandent
+scannable
+scansion
+scantling
+scape
+scapegoatism
+scapegrace
+scaphoid
+scapin
+scaping
+scapolite
+scapose
+scarab
+scarabaeid
+scaramouch
+scaramouche
+scarecrowish
+scarehead
+scaremonger
+scarey
+scarfpin
+scarfskin
+scarious
+scarlatinal
+scarless
+scarp
+scarped
+scarper
+scarpered
+scarpering
+scarpers
+scarph
+scarping
+scarps
+scarring
+scarry
+scatback
+scathe
+scathed
+scatheless
+scathes
+scatological
+scatology
+scatted
+scatteration
+scattershot
+scattier
+scatty
+scaup
+scauper
+scaups
+scc
+scena
+scenarist
+scenical
+scenically
+scenographic
+scenographically
+scenography
+scentless
+sceptibly
+schelling
+schematism
+scherzi
+scherzo
+schismatic
+schismatical
+schismatically
+schismatist
+schistose
+schistosity
+schistosomal
+schistosome
+schistosomiasis
+schistous
+schizo
+schizocarp
+schizogonic
+schizogonous
+schizogony
+schizomycete
+schizomycetous
+schizont
+schizophrene
+schizophrenically
+schizophyte
+schizophytic
+schizos
+schizothymic
+schlemiel
+schlepp
+schlieren
+schlieric
+schlock
+schmaltz
+schmaltzy
+schmalz
+schnauzer
+schnitzel
+scholastica
+scholasticate
+scholasticism
+scholiast
+scholiastic
+scholium
+schoolbag
+schoolchild
+schoolfellow
+schoolman
+schoolmistress
+schooltime
+schopenhauer
+schorlaceous
+schuman
+schwada
+sciaenoid
+sciatic
+sciential
+scientifique
+scientism
+scientologist
+scientology
+scilicet
+scilla
+scintigraphic
+scintigraphy
+scintilla
+scintillant
+scintillantly
+scintillator
+scintillometer
+scintillometer's
+scintillometers
+sciolism
+sciolist
+sciolistic
+sciomancy
+sciomantic
+scirocco
+scirrhi
+scirrhous
+scirrhus
+scissile
+scission
+scissortail
+sclerose
+sclerosed
+sclerotial
+sclerotin
+sclerotium
+scofflaw
+scofflaw's
+scofflaws
+scolecite
+scolex
+scolices
+scoliosis
+scoliotic
+scollop
+scolopendra
+scombroid
+sconce
+scone
+scoopful
+scopic
+scopolamine
+scopula
+scopulate
+scorbutic
+scorbutically
+scorekeeper
+scoria
+scoriaceous
+scorpaenid
+scorpioid
+scotchgard
+scotchman
+scoter
+scotoma
+scotomatous
+scotopic
+scottie
+scouse
+scouser
+scoutcraft
+scoutmaster
+scrabbly
+scrag
+scraggier
+scragging
+scraggy
+scrannel
+scrapie
+scrapper
+scrappier
+scrappiness
+scrapple
+scrappy
+scrawly
+screak
+screaky
+scree
+screenable
+screenful
+screvane
+screwbean
+screwier
+screwiness
+screwlike
+screwworm
+screwy
+scrieve
+scrimpy
+scrimshaw
+scrip
+scriptal
+scription
+scriptorium
+scriptwriter
+scriptwriter's
+scriptwriters
+scrod
+scrofula
+scrofulous
+scrollwork
+scrota
+scrotal
+scrotum
+scrotum's
+scrotums
+scrouge
+scrouging
+scrubbier
+scrubby
+scrubland
+scrubwoman
+scruff
+scruffier
+scruffiness
+scruffy
+scrum
+scrummage
+scrunch
+scrutator
+scrutin
+scrutineer
+scud
+scudded
+scudding
+scuds
+scull
+sculled
+sculler
+sculleries
+scullery
+sculling
+scullion
+scullions
+sculls
+sculpin
+sculpsit
+sculptress
+sculpturesque
+sculpturesquely
+scumble
+scumbled
+scumbles
+scumbling
+scumming
+scummy
+scunner
+scup
+scupper
+scuppered
+scuppering
+scuppernong
+scuppers
+scups
+scurf
+scurfy
+scurril
+scurrile
+scurrility
+scurvily
+scuttlebutt
+scutum
+seabag
+seabeach
+seabed
+seabed's
+seabird
+seaboot
+seaborne
+seacraft
+seadog
+seadrome
+seafloor
+seafowl
+seafront
+seagirt
+seagoing
+sealery
+sealskin
+seamanlike
+seamark
+seamlike
+seamount
+seamster
+seaplane
+seaquarium
+searchable
+searchless
+seascape
+sease
+seashell
+seashell's
+seashells
+seasick
+seasickness
+seastrand
+seatmate
+seatmate's
+seatmates
+seawall
+seaware
+seawater
+seawater's
+seaworthiness
+seaworthy
+sebaceous
+sebum
+sec
+secateur
+secateurs
+secco
+secessionism
+seclusive
+seclusively
+seclusiveness
+secobarbital
+secondo
+secretaryship
+secretin
+secretionary
+secretor
+secretory
+sectarianism
+sectary
+sectile
+sectility
+sectionalism
+sectorial
+secularistic
+secund
+securement
+seder
+sedgwick
+sedgy
+sedilia
+sedimentologic
+sedimentological
+sedimentologically
+sedimentologist
+sedimentology
+seducement
+seductress
+sedulity
+sedulous
+sedulousness
+sedum
+seeable
+seedcake
+seedcakes
+seedily
+seedlike
+seedpod
+seedsman
+seedtime
+seel
+seeley
+seepy
+seeress
+seerey
+segetal
+segmentary
+segno
+segnos
+segue
+segue's
+segued
+segueing
+segues
+seguidilla
+segur
+segura
+sei
+seicento
+seiche
+seigneur
+seigneurial
+seigneury
+seignior
+seigniorage
+seigniory
+seignorage
+seignorial
+seignory
+seine
+seiner
+seining
+seisin
+seisins
+seism
+seismicity
+seismogram
+seismogram's
+seismograms
+seismographic
+seismologist
+seismometric
+seismometry
+selachian
+selaginella
+selden
+selectee
+selectman
+selectmen
+selenic
+selenide
+seleniferous
+selenious
+selenocentric
+selenographer
+selenographic
+selenographist
+selenography
+selenological
+selenologist
+selenologist's
+selenologists
+selenology
+selenosis
+selfadjoint
+selfdom
+selfhood
+sellable
+selle
+selvage
+selvaged
+selvedge
+selvedged
+semasiological
+semasiologist
+semasiology
+sematic
+semblable
+semblably
+semeiology
+sement
+semestral
+semestrial
+semiabstract
+semiabstraction
+semiaquatic
+semiarboreal
+semiaridity
+semiautomatically
+semiautonomous
+semibasement
+semibreve
+semicentenary
+semicentennial
+semicircle
+semicircles
+semiclassic
+semiclassical
+semicolonial
+semicolonialism
+semicolony
+semicommercial
+semiconducting
+semiconscious
+semiconsciously
+semiconsciousness
+semiconservative
+semiconservatively
+semicrystalline
+semicylindrical
+semidarkness
+semidesert
+semidetached
+semidiameter
+semidiurnal
+semidivine
+semidocumentary
+semidome
+semidomed
+semidomestic
+semidomesticated
+semidomestication
+semidominant
+semidouble
+semidry
+semiellipse
+semielliptic
+semielliptical
+semiempirical
+semierect
+semievergreen
+semifinal
+semifinalist
+semifinished
+semifitted
+semiflexible
+semifluid
+semiformal
+semifossil
+semigloss
+semigovernmental
+semigroup
+semilegendary
+semilethal
+semiliquid
+semiliterate
+semilog
+semilunar
+semilustrous
+semimanufactures
+semimetal
+semimetallic
+semimicro
+semimoist
+semimonastic
+semimonthly
+semimystical
+seminarist
+seminiferous
+semiofficial
+semiofficially
+semiological
+semiology
+semiopaque
+semiosis
+semiotic
+semiotical
+semiotician
+semiotics
+semipalmated
+semiparasitic
+semipermeability
+semipermeable
+semiphore
+semipolitical
+semiporcelain
+semipostal
+semiprecious
+semiprivate
+semipro
+semiquaver
+semiramis
+semireligious
+semiretired
+semiretirement
+semirigid
+semisacred
+semisedentary
+semishrub
+semishrubby
+semiskilled
+semisoft
+semisolid
+semisweet
+semisynthetic
+semiterrestrial
+semitonal
+semitonally
+semitone
+semitonic
+semitonically
+semitrailer
+semitranslucent
+semitransparent
+semitropic
+semitropics
+semivowel
+semiweekly
+semiworks
+semiyearly
+semmes
+semolina
+semper
+sempervivum
+sempiternal
+sempiternally
+sempiternity
+semple
+semplice
+sempre
+sempstress
+semra
+sen
+senarii
+senarius
+senary
+senatorian
+senatorship
+sendable
+senecio
+senectitude
+senega
+senesac
+senescence
+senescent
+seneschal
+sengi
+senhor
+senhora
+senhores
+senhorita
+senilis
+senility
+senioritatis
+seniti
+senna
+sennet
+sennight
+sennit
+sens
+sensa
+sensationalist
+sensationalistic
+senseful
+sensibilia
+sensillum
+sensitometer
+sensitometer's
+sensitometers
+sensitometric
+sensitometry
+sensorial
+sensorially
+sensorimotor
+sensorineural
+sensorium
+sensualism
+sensualist
+sensualistic
+sensum
+sensuosity
+sententia
+sententious
+sententiously
+sententiousness
+senti
+sentience
+sentimentalism
+sentimentalist
+sepal
+separably
+separationist
+separatism
+separatist
+separatistic
+sepiolite
+sepses
+sepsis
+septa
+septal
+septenarius
+septendecillion
+septentrion
+septentrional
+septicemia
+septicemic
+septicidal
+septifragal
+sepuchral
+sepulture
+sequacious
+sequaciously
+sequacity
+sequela
+sequelae
+sequency
+sequent
+sequestrate
+sequestrum
+sequinned
+sequitur
+ser
+sera
+serac
+serafin
+seraglio
+serai
+seral
+seraphic
+seraphically
+seraphs
+serbantian
+serbian
+sere
+serfage
+sergeancy
+sergeanty
+serialism
+serialist
+seriate
+seriately
+seriatim
+sericeous
+sericin
+sericultural
+sericulture
+sericulturist
+serieuses
+serif
+serigraph
+serigrapher
+serigraphy
+serin
+serine
+seriocomic
+seriocomically
+serjeants
+serjeanty
+sermonic
+serodiagnosis
+serodiagnostic
+serologic
+serologist
+seropurulent
+serosa
+serosal
+serotinal
+serotinous
+serotonin
+serotype
+serous
+serow
+serpiginous
+serpiginously
+serra
+serranid
+serranoid
+serrate
+serrated
+serrates
+serrating
+serration
+serratus
+serried
+serriedly
+serriedness
+serry
+serrying
+serting
+sertive
+sertularian
+serval
+servanda
+servation
+servatius
+serviceably
+serviceberry
+servility
+servomotor
+servosystem
+servosystems
+sesamoid
+sesquicarbonate
+sesquicentenary
+sesquicentennial
+sesquipedalian
+sessed
+sesshu
+sessile
+sessility
+sessional
+sesterce
+sestertium
+sestet
+sestina
+seta
+setaceous
+setaceously
+setae
+setal
+setline
+setnm
+seto
+setoff
+setom
+setose
+setout
+setpoint
+setpoints
+settee
+settees
+settlor
+setz
+setzb
+setzm
+seurat
+sevec
+sevenths
+seventyfold
+severability
+severable
+severna
+sevigli
+sewickley
+sexagenarian
+sexagesimal
+sexdecillion
+sexily
+sexless
+sexlessly
+sexlessness
+sexology
+sexpot
+sext
+sextant
+sextic
+sexto
+sextodecimo
+sextos
+sextuor
+sextuplicate
+sey
+sforzando
+shacklebone
+shad
+shadberry
+shadblow
+shadbush
+shaddock
+shadeless
+shadflower
+shadoof
+shadowbox
+shadowgraph
+shadowily
+shadowless
+shadowlike
+shagbark
+shaggily
+shaggymane
+shagreen
+shahdom
+shahn
+shaitan
+shakeout
+shako
+shakoes
+shakya
+shalloon
+shallop
+shallot
+shalt
+shaman
+shamanism
+shamanist
+shamanistic
+shamefaced
+shamefacedness
+shamefast
+shammer
+shammes
+shamming
+shammosim
+shammy
+shamus
+shan
+shandies
+shandrydan
+shandy
+shandygaff
+shanghaied
+shanghaier
+shankpiece
+shansi
+shantey
+shantyman
+shantytown
+shapable
+shapeable
+shapen
+shard
+shareability
+shareable
+sharkskin
+sharpie
+sharpies
+sharpy
+shashlick
+shashlik
+shatilov
+shaveling
+shavetail
+shavie
+shawano
+shawm
+shawomet
+shay
+shayne
+shayol
+shays
+sheaflike
+sheahe
+shearn
+shearwater
+sheatfish
+sheathbill
+shebang
+shebeen
+sheboygan
+shedded
+shedder
+sheen
+sheeny
+sheepfold
+sheepherder
+sheepherding
+sheepish
+sheepishly
+sheepishness
+sheepshank
+sheepshead
+sheepshearer
+sheepshearing
+sheeran
+sheetfed
+sheetlike
+sheikdom
+sheikh
+sheikhdom
+shekel
+shelagh
+shelfful
+shelflike
+shellac
+shellacked
+shellacking
+shellback
+shellback's
+shellbacks
+shellcracker
+shellfire
+shellfish
+shellproof
+shellwork
+shelly
+shelterbelt
+shelterless
+sheltie
+shelties
+shelty
+shend
+shending
+shensi
+shep
+shepherdess
+sher
+sherbert
+sherd
+sherif
+sheriffdom
+sherris
+shevelling
+shew
+shewe
+shews
+shh
+shiel
+shieling
+shietz
+shiflett
+shiftable
+shigella
+shih
+shikar
+shikari
+shikarred
+shikarring
+shiksa
+shikse
+shilingi
+shillalah
+shillelagh
+shillong
+shimmery
+shindies
+shindy
+shingly
+shinleaf
+shinleafs
+shinnery
+shinney
+shinnied
+shinning
+shinny
+shinnying
+shinplaster
+shinsplints
+shipborne
+shipfitter
+shiplap
+shipload
+shipmaster
+shipowner
+shipside
+shipway
+shipworm
+shipwright
+shirr
+shirring
+shirtwaist
+shirtwaister
+shirty
+shish
+shitepoke
+shiv
+shivaree
+shlemiehl
+shlock
+sho
+shoat
+shockproof
+shoddily
+shoebill
+shoeblack
+shoepac
+shoepack
+shogun
+shogunate
+sholom
+shoon
+shoplift
+shoplifter
+shoplifters
+shoplifting
+shoppe
+shoptalk
+shoran
+shorebird
+shorebird's
+shorebirds
+shorefront
+shoreside
+shoreward
+shorewards
+shortbread
+shortcake
+shortchange
+shortchanger
+shorthorn
+shortie
+shorties
+shortliffe
+shorty
+shotbush
+shotline
+shotlines
+shotten
+shouldst
+shoup
+shovelful
+shovelhead
+shovelman
+shovelnose
+shovelsful
+showbread
+showery
+showily
+showstopper
+shrievalty
+shrieve
+shrike
+shrimpy
+shrive
+shrived
+shriven
+shroff
+shrubbier
+shrubby
+shtetel
+shtetl
+shtetlach
+shtg
+shtick
+shuiski
+shul
+shulde
+shunner
+shunpike
+shunpiker
+shunpiking
+shush
+shute
+shutterbug
+shutterless
+shuz
+shyer
+shyes
+shyest
+shylockian
+shyster
+si
+sialagogue
+siamang
+sib
+sibe
+sibilate
+sibilation
+sibly
+sibyl
+sibylic
+sibylla
+sibyllic
+sibylline
+sibyls
+siccative
+siccing
+siciliana
+sickbed
+sickbed's
+sickbeds
+sicklebill
+sicklemia
+sicklewort
+sicklily
+sid
+siddo
+siddur
+siddurim
+sideburned
+sidedress
+sidehill
+sidekick
+sidekicks
+sideling
+sidency
+sident
+sidepiece
+siderite
+sideritic
+siderolite
+sideslip
+sideslips
+sidespin
+sidesplitting
+sidestepped
+sidestepper
+sidestroke
+sideswipe
+sideward
+sidewards
+sie
+sieben
+siebern
+siecle
+siecles
+siepi
+sierran
+sieux
+sig
+sightless
+sightlessness
+sigmoid
+sigmoidal
+sigmoidally
+signalman
+signalmen
+signalment
+signatory
+signifiable
+significancy
+significative
+significatively
+significativeness
+significs
+signior
+signiories
+signiory
+signori
+signories
+signorina
+signorino
+signory
+sike
+siking
+silane
+sild
+silds
+silenus
+silesia
+silex
+siliceous
+silicic
+silicicolous
+silicification
+silicify
+silicious
+silicle
+silicosis
+silicothermic
+silicotic
+silique
+silkaline
+silke
+silkoline
+silkweed
+sillabub
+sillily
+sillimanite
+silone
+siloxane
+siltstone
+siltstones
+siluroid
+silva
+silvan
+silvas
+silverfish
+silvern
+silverside
+silversides
+silverweed
+silvical
+silvicolous
+silvics
+silvicultural
+silviculturally
+silviculture
+silviculturist
+simazine
+simba
+simca
+simian
+simmel
+simms
+simnel
+simoleon
+simony
+simoom
+simoon
+simp
+simpatico
+simper
+simpered
+simperer
+simpering
+simpers
+simplices
+simplicial
+simplicially
+simplifiction
+simplism
+simplistically
+simulacre
+simulacrum
+simular
+sinan
+sinapism
+sincipita
+sincipital
+sinciput
+sind
+sinecure
+sinfonia
+sinfonietta
+singeing
+singleminded
+singlestick
+singletree
+singsong
+singsongy
+singspiel
+sinh
+siniboia
+sinistrorse
+sinistrous
+sinkable
+sinkage
+sinoatrial
+sinological
+sinologist
+sinologue
+sinology
+sinopia
+sinsyne
+sinterability
+sinton
+sinuate
+sinuately
+sinuatrial
+sinuosity
+sinusitis
+sion
+sipper
+sippet
+siree
+sirenian
+sirloin
+sirocco
+sirra
+sirrah
+sirree
+sirupy
+sirvente
+sirventes
+siskin
+sissies
+sissified
+sissy
+sisterhood
+sistrum
+sith
+sitosterol
+siva
+sivas
+sixmo
+sixmos
+sixpenny
+sixteenmo
+sixths
+sixtyfold
+sizably
+sizar
+sizova
+skag
+skagen
+skald
+skaldic
+skateboard
+skateboard's
+skateboarder
+skateboarding
+skateboards
+skedaddle
+skedaddled
+skedaddler
+skedaddles
+skedaddling
+skeg
+skeigh
+skein
+skein's
+skeins
+skeleta
+skellum
+skelp
+skelping
+skelpit
+skelter
+skeltered
+skeltering
+skene
+skep
+skepsis
+skerries
+skers
+skery
+skewback
+skewbald
+skiable
+skiagram
+skiagram's
+skiagrams
+skiagraph
+skiagraphy
+skiascope
+skiascopy
+skidder
+skiddier
+skiddoo
+skiddy
+skidoo
+skiffle
+skilful
+skilfully
+skilless
+skimobile
+skimpily
+skinflint
+skinflint's
+skinflints
+skinful
+skinhead
+skink
+skinker
+skint
+skintight
+skipjack
+skirl
+skirr
+skitter
+skittery
+skittish
+skittishly
+skittishness
+skive
+skiver
+skiving
+skivvies
+skivvy
+skiway
+skiwear
+skoal
+skulduggery
+skyborne
+skycap
+skydiving
+skyey
+skylounge
+skyphoi
+skyphos
+skyros
+skysail
+skywrite
+skywriter
+skywriting
+slabber
+slabbered
+slabbering
+slabbing
+slangily
+slanginess
+slangy
+slantways
+slantwise
+slapdash
+slaphappy
+slapjack
+slatelike
+slather
+slathered
+slathering
+slathers
+slattern
+slatternliness
+slatternly
+slaty
+slaughterous
+slaughterously
+slaveholder
+slaveholders
+slaveholding
+slavey
+slaveys
+slavocracy
+sleazily
+sledded
+sledder
+sleekit
+sleeplessess
+sleeplike
+sleepyhead
+sleeveless
+sleevelet
+slesinger
+sleuth
+sleuthhound
+slidden
+slideway
+slily
+slimily
+slimmest
+slimming
+slimpsy
+slimsy
+slinkier
+slinkily
+slinkiness
+slinky
+slipcase
+slipcover
+slipform
+slipknot
+slipover
+slippier
+slippy
+slipshod
+slipslop
+slipsole
+slipstick
+slipup
+slithery
+slitless
+slivovitz
+slobber
+slobbered
+slobberer
+slobbering
+slobbers
+slobbery
+slobbish
+slogger
+slopwork
+slopworker
+slotback
+slotting
+slouchier
+slouchily
+slouchiness
+slouchy
+sloughy
+slowish
+slowpoke
+slub
+slubber
+slubbered
+slubbering
+slubbing
+sludgier
+sludgy
+slue
+sluff
+slugabed
+slugfest
+sluggard
+sluggardly
+sluggardness
+sluiceway
+sluicy
+sluing
+slumberous
+slumbery
+slumbrous
+slumgullion
+slumlord
+slummer
+slummier
+slummy
+slungshot
+slushier
+slushiness
+slushy
+slut
+sluttish
+sluttishly
+sluttishness
+slyboots
+slyer
+slyest
+smartie
+smarties
+smartweed
+smarty
+smashup
+smatter
+smatterer
+smearcase
+smeary
+smectic
+smegma
+smeltery
+smidgen
+smidgeon
+smileless
+smilelessly
+smirch
+smirky
+smithery
+smithsonite
+smoggier
+smoggy
+smogless
+smokeable
+smokechaser
+smokeless
+smokelike
+smokeproof
+smokey
+smokily
+smolt
+smoochy
+smoothbore
+smoothie
+smoothies
+smooths
+smoothy
+smorgasbord
+smothery
+smoulder
+smsa
+smsa's
+smsas
+smudgily
+smugger
+smuggest
+smutch
+smutchy
+smutted
+smuttily
+smutting
+snaffle
+snaffled
+snaffling
+snaggletooth
+snaggletoothed
+snaggy
+snaillike
+snakebite
+snakebite's
+snakebites
+snakemouth
+snakeskin
+snakestrike
+snakeweed
+snakily
+snaky
+snappe
+snapshoot
+snapshooter
+snark
+snarks
+snarly
+snash
+snatchy
+snath
+snathe
+sndmsg
+snead
+sneap
+sneck
+sneed
+sneesh
+sneezeweed
+sneezewort
+sneezy
+snell
+snelling
+snick
+snickersnee
+snickery
+sniffily
+sniffiness
+sniffish
+sniffishly
+sniffishness
+sniffy
+snigger
+sniggered
+sniggerer
+sniggering
+sniggle
+sniggled
+sniggling
+sniperscope
+snippety
+snit
+snitch
+snitcher
+snobbism
+snobby
+snodgrass
+snollygoster
+snood
+snooperscope
+snoopily
+snoot
+snootier
+snootily
+snootiness
+snooty
+snooze
+snoozer
+snoozes
+snoozing
+snoozle
+snoozled
+snoozles
+snoozling
+snopes
+snot
+snoutish
+snouty
+snowbound
+snowbrush
+snowcap
+snowcapped
+snowdrift
+snowdrop
+snowfield
+snowless
+snowmaker
+snowmaking
+snowmelt
+snowpack
+snowplow
+snowscape
+snowshed
+snowshoeing
+snowslide
+snowsuit
+snubber
+snubbiness
+snubby
+snuffbox
+snuffy
+snugger
+snuggery
+snuggest
+soakage
+soapbark
+soapbox
+soapboxes
+soapily
+soapless
+soapmaking
+soapwort
+soba
+sobe
+sobersided
+sobersides
+sobf
+sobibor
+socage
+socager
+socal
+soccage
+sochi
+sociableness
+socialistically
+socialite
+socinianism
+sociolinguistic
+sociolinguistics
+sociologic
+sociopath
+sociopathic
+sociopolitical
+sociosexual
+sociosexuality
+sockdolager
+sockdologer
+sockeye
+socle
+socola
+soconoco
+sodalist
+sodalite
+sodality
+sodbuster
+sodded
+sodic
+sodomite
+soeren
+soever
+soffit
+softback
+softbound
+softcover
+softhead
+softheaded
+softheadedly
+softheadedness
+softhearted
+softheartedly
+softheartedness
+softie
+softies
+softish
+softy
+soggily
+sohn
+soign
+soignee
+soilborne
+soilge
+soilless
+soilure
+soir
+soke
+sokeman
+sokol
+sokolev
+sokolov
+sokolsky
+sola
+solacement
+solanaceous
+solanin
+solanine
+solanum
+solarium
+solate
+solated
+solating
+solatium
+soldan
+solderability
+soldi
+soldiership
+solecistic
+solemnify
+solenoidal
+soleplate
+soleprint
+solesmes
+solfatara
+solicitant
+solicitorship
+solidago
+solidarism
+solidarist
+solidaristic
+solidus
+solifluction
+soliloquist
+solipsist
+solipsistic
+solitarily
+soliton
+solitudinarian
+solitudinem
+solleret
+soln
+solonets
+solonetz
+solonetzic
+solstitial
+solubleness
+solubly
+solus
+solute
+solvability
+solvate
+solvated
+solvation
+solventless
+solvolysis
+solvolytic
+somatically
+somatogenic
+somatological
+somatology
+somatoplasm
+somatoplastic
+somatopleure
+somatopleuric
+somatosensory
+somatotrophin
+somatotropin
+somatotype
+somatotypic
+somatotypically
+sombre
+sombrero
+sombrous
+somebodies
+somedeal
+someway
+someways
+somewhen
+somewhither
+somite
+somitic
+somnambulant
+somnambular
+somnambulate
+somnambulation
+somnambulator
+somnambulism
+somnambulist
+somnambulistic
+somnambulistically
+somnifacient
+somniferous
+somniferously
+somnolency
+sonambula
+sonance
+sonant
+sonarman
+sonatina
+sonde
+sone
+songau
+songbird
+songfest
+songless
+songlessly
+songsmith
+songster
+songtress
+songwriter
+songwriting
+sonically
+sonicate
+sonicated
+sonication
+sonicator
+sonicators
+sonless
+sonneteer
+sonnobuoy
+sonogram
+sonogram's
+sonograms
+sonorant
+sonovox
+sonship
+sonsie
+sonsy
+soomed
+soothfast
+sootier
+sootily
+sootiness
+sooty
+sophistic
+sophistical
+sophistically
+sophy
+sopite
+sopited
+sopiting
+sopor
+soporiferous
+soporiferousness
+soppier
+soppy
+sopranino
+sopsaisana
+sora
+sorb
+sorbability
+sorbable
+sorbate
+sorbed
+sorbent
+sorceress
+sorcerous
+sordino
+sorehead
+soreheaded
+sorgo
+sori
+soricine
+sorites
+sororal
+sororate
+sorption
+sorptive
+sorrentine
+sorrentino
+sorrily
+sortable
+sortilege
+sortition
+sorus
+sostenuto
+sot
+soteriological
+soteriology
+sotol
+sottish
+sottishly
+sottishness
+sotun
+sou
+soubise
+soubrette
+souchong
+sough
+soukhouma
+soule
+soulless
+soullessly
+soullessness
+soundable
+soundboard
+soundless
+soundlessly
+soupier
+soupspoon
+soupy
+sourberry
+sourceless
+sourish
+sourpuss
+soursop
+sourwood
+sousaphone
+souse
+sousing
+sout
+soutache
+soutane
+souter
+southeasternmost
+southeastward
+southeastwards
+souths
+southwesternmost
+southwestward
+southwestwards
+sovietism
+sovkhoz
+sovkhozes
+sovran
+sovranty
+sowbug
+sowbug's
+sowbugs
+soxhlet
+spa
+spaceband
+spaceflight
+spaceless
+spaceman
+spaceport
+spacetime
+spacewalker
+spacewalking
+spacial
+spackle
+spackled
+spackling
+spacs
+spacward
+spada
+spadeful
+spadework
+spadices
+spadille
+spadix
+spaeing
+spahi
+spahn
+spake
+spalding
+spall
+spallable
+spallation
+spalled
+spalling
+spandrel
+spandril
+spang
+spanworm
+spareable
+spareribs
+sparge
+sparger
+sparging
+sparkily
+sparkish
+sparkplug
+sparred
+sparrowgrass
+sparsity
+spartan
+sparteine
+spas
+spasmodic
+spasmodical
+spasmodically
+spasmolytic
+spasmolytically
+spastically
+spasticity
+spathe
+spathic
+spathulate
+spatiotemporal
+spatiotemporally
+spatlum
+spatted
+spatting
+spatulate
+spavin
+speakeasy
+spean
+spearfish
+spearman
+specialism
+specialisms
+specialistic
+speciate
+speciation
+speciational
+speciosity
+specsartine
+spect
+spectate
+spectated
+spectating
+spectatress
+spector
+spectrality
+spectrofluorimeter
+spectrofluorimeter's
+spectrofluorimeters
+spectrofluorometer
+spectrofluorometer's
+spectrofluorometers
+spectrofluorometric
+spectrofluorometry
+spectrographic
+spectroheliogram
+spectroheliogram's
+spectroheliograms
+spectroheliograph
+spectroheliography
+spectrohelioscope
+spectrophotometrical
+spectrophotometrically
+spectroscopical
+spectroscopist
+speculum
+speechify
+speedball
+speedlight
+speedster
+speedway
+speedwell
+speel
+speir
+speiss
+speleogenesis
+speleogenetic
+spellbind
+spellbinder
+spelldown
+spelt
+spelter
+spelunker
+spelunking
+spendable
+spendthrift
+spenglerian
+spermaceti
+spermagonium
+spermary
+spermatheca
+spermathecal
+spermatial
+spermatic
+spermatid
+spermatium
+spermatocidal
+spermatocide
+spermatocyte
+spermatogenesis
+spermatogenetic
+spermatogenic
+spermatogonial
+spermatogonium
+spermatophore
+spermatophytic
+spermatozoa
+spermatozoal
+spermatozoan
+spermatozoid
+spermatozoon
+spermicidal
+spermicide
+spermidine
+spermiogenesis
+spermophile
+sperrylite
+spessartite
+sphagnous
+sphagnum
+sphalerite
+sphene
+sphenodon
+sphenodont
+sphenoid
+sphenoidal
+sphenopsid
+spheral
+sphericity
+spherometer
+spherometer's
+spherometers
+spheroplast
+spherulite
+spherulitic
+sphery
+sphincter
+sphincteral
+sphinges
+sphingid
+sphingosine
+sphygmograph
+sphygmographic
+sphygmography
+sphygmomanometer
+sphygmomanometer's
+sphygmomanometers
+sphygmomanometric
+sphygmomanometrically
+sphygmomanometry
+spicae
+spicate
+spiccato
+spiceberry
+spicery
+spicily
+spicula
+spicular
+spiculate
+spiculation
+spicule
+spiculiferous
+spiculum
+spiderweb
+spiegeleisen
+spiel
+spieler
+spiffier
+spiffy
+spikelet
+spikelike
+spikenard
+spile
+spiled
+spiles
+spiling
+spillable
+spillage
+spillage's
+spillages
+spillikin
+spillikins
+spillway
+spilosite
+spilth
+spinco
+spindly
+spindrift
+spinel
+spinelle
+spinescent
+spinet
+spinifex
+spinless
+spinneret
+spinnerette
+spinney
+spinneys
+spinodal
+spinoff
+spinor
+spinosely
+spinosity
+spinous
+spinout
+spinrad
+spinse
+spinsterhood
+spinsterish
+spinthariscope
+spinule
+spinulose
+spiracle
+spiracular
+spiraea
+spirant
+spirea
+spireme
+spirillum
+spiritism
+spiritist
+spiritistic
+spiritless
+spiritlessly
+spiritlessness
+spiritoso
+spiritous
+spiritualism
+spiritualist
+spiritualistic
+spiritualty
+spirituel
+spirituelle
+spirituous
+spirograph
+spirographic
+spirography
+spirogyra
+spirometer
+spirometer's
+spirometers
+spirometric
+spirometry
+spirt
+spirula
+spiry
+spital
+spitball
+spitted
+spitter
+spittoon
+spittoons
+splashboard
+splashdown
+splashdowns
+splashily
+splatter
+splayfoot
+splayfooted
+spleenful
+spleenwort
+spleeny
+splendent
+splendiferous
+splendiferously
+splendiferousness
+splendorous
+splendrous
+splenectomy
+splenetically
+splenic
+splenius
+splenomegaly
+splent
+spleuchan
+splore
+spluttery
+spodumene
+spoilable
+spoilsman
+spoilsport
+spoilt
+spokeshave
+spokespeople
+spokesperson
+spokesperson's
+spokeswoman
+spoliate
+spoliation
+spoliator
+spondaic
+spondee
+spondylitis
+sponson
+sponsorial
+spontoon
+spookily
+spookish
+spoondrift
+spooney
+spoonier
+spoonsful
+spoony
+spoor
+sporangial
+sporangiophore
+sporangium
+sporicidal
+sporicide
+sporiferous
+sporocarp
+sporocyst
+sporocystic
+sporogenesis
+sporogenic
+sporogenous
+sporogonic
+sporogonium
+sporogonos
+sporogony
+sporophore
+sporophyll
+sporophyte
+sporophytic
+sporopollenin
+sporotrichosis
+sporozoan
+sporozoite
+sportful
+sportfully
+sportfulness
+sportily
+sportsmanlike
+sportswoman
+sportswriting
+sporulate
+sporulation
+sporulative
+spottable
+spottily
+sprat
+spreadability
+spreadable
+sprent
+sprier
+spriest
+sprigging
+sprightful
+sprightfully
+sprightfulness
+sprigtail
+springal
+springald
+springbok
+springboks
+springe
+springily
+springtail
+springtails
+springtide
+springwood
+sprit
+spritsail
+sprucier
+sprucy
+spry
+spryer
+spryest
+spryly
+spryness
+spss
+spudded
+spudding
+spumone
+spumous
+spumy
+spunkie
+spunkier
+spunkily
+spunkiness
+spunky
+spurrey
+spurreys
+spurrier
+spurry
+spurtle
+sputa
+sputum
+spuyten
+squab
+squabs
+squadded
+squadding
+squalene
+squallier
+squally
+squama
+squamae
+squamate
+squamation
+squamosal
+squamose
+squamulose
+squaresville
+squarish
+squarishly
+squarishness
+squark
+squashberry
+squashily
+squattest
+squattier
+squatty
+squawbush
+squawroot
+squeegeeing
+squeezability
+squeezable
+squelchy
+squib
+squibs
+squidded
+squidding
+squiffed
+squiffy
+squiggle
+squiggled
+squiggles
+squiggling
+squiggly
+squilgee
+squill
+squilla
+squillae
+squills
+squinch
+squinnied
+squinny
+squinnying
+squinty
+squirarchy
+squirearchy
+squirish
+squoosh
+stabat
+stabber
+stabile
+stablemate
+stablish
+stablishment
+staddle
+stade
+stadia
+stadtholder
+stadtholderate
+stadtholdership
+stagecraft
+stagehand
+stagestruck
+stagey
+staggerbush
+staggery
+stagging
+staggy
+staghound
+stagily
+stagnancy
+stainability
+stainable
+stakeholder
+stakeout
+stalactitic
+stalagmite
+stalagmite's
+stalagmites
+stalagmitic
+stalkless
+stalky
+stallard
+stalworth
+staminal
+staminodium
+staminody
+stammel
+standardbred
+standaway
+standbys
+standee
+standeth
+standoffish
+standoffishly
+standoffishness
+standout
+standpat
+standpatter
+standpattism
+standpipe
+stang
+stanite
+stannard
+stannaries
+stannary
+stanzaic
+stapedectomy
+stapedes
+stapedial
+stapelia
+stapes
+staph
+staphylinid
+staphylococcal
+staphylococcic
+starbird
+starchily
+stardust
+starets
+starless
+starlike
+starlit
+starre
+starveling
+stases
+statable
+statant
+stateable
+statecraft
+statedly
+statehouse
+stateside
+statical
+statice
+stational
+stationarily
+statism
+statist
+stato
+statoblast
+statocyst
+statolatry
+statolith
+stator
+stators
+statoscope
+statutable
+statz
+staurolite
+staurolitic
+stavesacre
+stavropoulos
+steamroll
+steamroller
+steapsin
+stearate
+stearic
+stearin
+stearine
+steatite
+steatitic
+steatolysis
+steatopygia
+steatopygic
+steelhead
+steelie
+steelwork
+steelworker
+steelworks
+steelyard
+steenbok
+steeplechase
+steeplechaser
+steeplejack
+steerable
+steerage
+steerageway
+steersman
+steeve
+steeving
+steffens
+stegosaur
+stegosaurus
+steichen
+steinbecks
+stela
+stelae
+stelar
+stele
+stellate
+stelliform
+stellify
+stemless
+stemma
+stemmata
+stemmer
+stemmier
+stemmy
+stemson
+stemware
+stenchful
+stenchy
+steno
+stenobathic
+stenograph
+stenographic
+stenographically
+stenohaline
+stenophagous
+stenos
+stenosed
+stenosis
+stenotherm
+stenothermal
+stenothermy
+stenotic
+stenotopic
+stenotypist
+stenotypy
+stentor
+stentorian
+stentorophonic
+stephan
+stephanotis
+stepladder
+steplike
+stepparent
+steprelation
+steradian
+stercoraceous
+stere
+stereobate
+stereochemical
+stereochemically
+stereochemistry
+stereogram
+stereogram's
+stereograms
+stereograph
+stereographic
+stereographically
+stereoisomer
+stereoisomeric
+stereoisomerism
+stereoisomers
+stereological
+stereologically
+stereology
+stereometric
+stereomicroscope
+stereomicroscopic
+stereomicroscopically
+stereophonically
+stereophony
+stereophotographic
+stereophotography
+stereopsis
+stereopticon
+stereoregular
+stereoregularity
+stereoscope
+stereoscopic
+stereoscopically
+stereospecific
+stereospecifically
+stereospecificity
+stereotape
+stereotaxic
+stereotaxically
+stereotropism
+stereotypy
+steric
+sterically
+sterics
+sterigma
+sterilant
+sterios
+sterlet
+sterna
+sternforemost
+sternite
+sternmost
+sternocostal
+sternpost
+sternson
+sternutation
+sternutator
+sternutatory
+sternward
+sternwards
+sternway
+steroidal
+steroidogenesis
+steroidogenic
+sterol
+stertor
+stertorous
+stertorously
+stet
+stethoscopic
+stethoscopically
+stetted
+stettin
+stetting
+stevie
+stewpan
+stibine
+stibnite
+stichomythia
+stichomythic
+stichomythy
+stickball
+stickful
+stickhandler
+stickit
+stickseed
+sticktight
+stickum
+stickup
+stickweed
+stickwork
+sticle
+sticy
+stidger
+stiffish
+stigmal
+stigmasterol
+stigmatic
+stigmatically
+stigmatism
+stigmatist
+stilbene
+stilbestrol
+stilbite
+stillman
+stillroom
+stillwater
+stillwell
+stilly
+stime
+stimulator
+stimulators
+stingaree
+stingily
+stingless
+stingray
+stingray's
+stingrays
+stinkard
+stinkbug
+stinkbug's
+stinkbugs
+stinkhorn
+stinkpotters
+stinkstone
+stinkweed
+stinkwood
+stion
+stioning
+stipe
+stiped
+stipel
+stipellate
+stipendiary
+stipes
+stipitate
+stipites
+stipular
+stipulator
+stipulatory
+stipule
+stipuled
+stirabout
+stirk
+stirp
+stirpes
+stirps
+stitchery
+stithies
+stithy
+stoat
+stoat's
+stoats
+stockbreeder
+stockbrokerage
+stockbroking
+stockcar
+stockily
+stockinet
+stockinette
+stockish
+stockist
+stockkeeper
+stockman
+stockpot
+stockproof
+stocktaking
+stockyard
+stockynges
+stodge
+stodgily
+stodging
+stogie
+stogies
+stogy
+stoical
+stoically
+stoichiometrically
+stokehold
+stokehole
+stokesia
+stolidity
+stoll
+stollen
+stollens
+stolon
+stolonate
+stoloniferous
+stoloniferously
+stolzenbach
+stoma
+stomachache
+stomachic
+stomachically
+stomachy
+stomal
+stomas
+stomata
+stomatal
+stomate
+stomatitis
+stomatologic
+stomatological
+stomatologist
+stomatology
+stomatopod
+stomodaeal
+stomodaeum
+stomodeal
+stomodeum
+stonecrop
+stonecutting
+stonemasonry
+stonework
+stoneworker
+stoney
+stonyhearted
+stonyheartedness
+stoolie
+stoopball
+stopband
+stope
+stopes
+stoplight
+stoplights
+stopple
+stoppled
+stoppling
+storable
+storax
+storefront
+storefront's
+storefronts
+storeria
+storeship
+storewide
+storksbill
+stormily
+storybook
+storybooks
+storytelling
+storywriter
+stouthearted
+stoutheartedly
+stoutheartedness
+stoutish
+stovepipe
+stovepipes
+stowaway
+stowaway's
+stowaways
+stowe
+stowey
+strabismic
+strabismus
+strafaci
+stragglier
+straggly
+straightbred
+straightedge
+straightish
+straightjacket
+straightlaced
+strainometer
+strainometer's
+strainometers
+straitjacket
+straitlaced
+straitlacedly
+straitlacedness
+strake
+stram
+stramash
+stramonium
+stranahan
+strandline
+stranglehold
+strangury
+straphang
+straphanger
+strapless
+strappado
+strapper
+strategical
+strath
+strathspey
+strathspeys
+strati
+straticulate
+stratiform
+stratocracy
+stratocumulus
+stratus
+stravage
+stravinsky
+strawboard
+strawman
+streakier
+streakiness
+streaky
+streambed
+streamlet
+streamside
+streek
+streetwalker
+streetwalking
+strengthless
+strengthlessness
+strenuosity
+strep
+streptobacillus
+streptococcal
+streptococcic
+streptokinase
+streptolysin
+streptomyces
+streptomycete
+streptothricin
+stressless
+stresslessness
+stressor
+stretchability
+stretta
+stretti
+stretto
+strettos
+strewment
+stria
+striae
+strick
+strickle
+strickled
+strickling
+stridden
+stridence
+stridor
+stridulate
+stridulation
+stridulatory
+stridulous
+stridulously
+strifeless
+strigil
+strigose
+strikebound
+strikeless
+strikeout
+strikeover
+stringboard
+stringcourse
+stringency
+stringendo
+stringhalt
+stringhalted
+stringless
+stringpiece
+stripeless
+stripfilm
+stripier
+stripling
+strippable
+stript
+stripy
+strobila
+strobilar
+strobilation
+strobile
+strobilus
+stroboscope
+stroboscopically
+strobotron
+stroma
+stromal
+stromata
+stromatal
+stromatic
+stromatolite
+stromatolitic
+stromeyerite
+strongbox
+strongheart
+strongish
+strontia
+strontianite
+strontic
+strophanthin
+strophic
+strophoid
+stroud
+strouding
+strow
+strowing
+structuralism
+structureless
+structurelessness
+strudel
+struma
+strumae
+strumas
+strummer
+strumose
+strumpet
+strunt
+struthious
+strychninism
+stubblefield
+stubblefields
+stubbly
+stuccoes
+stuccowork
+studbook
+studbooks
+studding
+studentship
+studentships
+studhorse
+stuffily
+stuffless
+stull
+stum
+stumblebum
+stumer
+stumming
+stunner
+stunsail
+stupa
+stupe
+stupefacient
+stupefaction
+stuporous
+sturch
+sturdily
+sturley
+sturt
+stye
+styes
+stying
+styka
+stylebook
+styleless
+stylelessness
+stylet
+styliform
+stylite
+stylitic
+stylobate
+stylograph
+stylographic
+stylographical
+stylographically
+stylography
+styloid
+stylolite
+stylopodium
+stymieing
+styptic
+styrax
+suability
+suably
+suasion
+suasive
+suasively
+suasiveness
+subacid
+subacidly
+subacidness
+subacute
+subacutely
+subadar
+subadult
+subaerial
+subaerially
+subagency
+subagent
+subahdar
+subalpine
+subalternate
+subalternately
+subalternation
+subantarctic
+subapical
+subaquatic
+subaqueous
+subarctic
+subarea
+subatmospheric
+subaudible
+subaudition
+subaverage
+subbase
+subbasement
+subcabinet
+subcapsular
+subcelestial
+subcellular
+subcentral
+subcentrally
+subchaser
+subchloride
+subclavian
+subclimax
+subclinical
+subclinically
+subcollegiate
+subcommunity
+subcompact
+subcontinental
+subcontractor
+subcontraoctave
+subcontrariety
+subcontrary
+subcool
+subcordate
+subcortex
+subcortical
+subcritical
+subcrustal
+subcultural
+subcutaneous
+subcutaneously
+subdeacon
+subdeb
+subdebutante
+subdepot
+subdiaconate
+subdividable
+subdominance
+subdominant
+subedit
+subeditor
+subeditorial
+subemployed
+subemployment
+subentries
+subentry
+subepidermal
+subepidermally
+suberect
+subfamilies
+subfamily
+subfix
+subfossil
+subfreezing
+subgenus
+subglacial
+subglacially
+subglottal
+subgrade
+subgrammar
+subgross
+subhead
+subheading
+subhuman
+subhumanity
+subi
+subic
+subinfeud
+subinfeudate
+subinfeudation
+subinfeudatory
+subirrigate
+subirrigation
+subito
+subj
+subjacency
+subjacent
+subjacently
+subjectivism
+subjectivistic
+subjectless
+subjoin
+subjugator
+subjunction
+subjunctive
+subkingdom
+sublate
+sublated
+sublating
+sublation
+sublet
+sublethal
+sublethally
+sublevel
+sublicense
+sublicensed
+sublicenser
+sublicenses
+sublicensing
+sublieutenant
+sublimable
+sublimity
+sublingual
+subliterature
+sublittoral
+sublunar
+subluxation
+submandibular
+submarginal
+submarginally
+submaxilla
+submaxillary
+submediant
+submergence
+submergible
+submerse
+submersed
+submersing
+submersion
+submicrogram
+submicrogram's
+submicrograms
+submicron
+submicroscopic
+submicroscopically
+subminiature
+submiss
+submitochondrial
+submitter
+submitters
+submontane
+submucosa
+submucosal
+submucosally
+submucous
+submultiple
+subnormality
+suboceanic
+subopposite
+suboptimum
+suborbicular
+suborbital
+suborder
+suborn
+subornation
+suborned
+suborner
+suborning
+suborns
+subovate
+suboxide
+suboxides
+subpar
+subparallel
+subphylum
+subplot
+subplots
+subpolar
+subpotency
+subpotent
+subprincipal
+subprofessional
+subreption
+subreptitious
+subreptitiously
+subring
+subrogate
+subsaline
+subsatellite
+subsaturated
+subsaturation
+subsectio
+subserve
+subserviency
+subshrub
+subshrubby
+subsidence
+subsidiarily
+subsonic
+subsonically
+subspecific
+substage
+substanceless
+substandard
+substantiality
+substantival
+substantivally
+substation
+substations
+substituent
+substituents
+substitutional
+substitutionally
+substratosphere
+substratospheric
+substructural
+subsumption
+subteen
+subtemperate
+subtenancy
+subtenant
+subtend
+subterminal
+subterraneous
+subtetanic
+subthreshold
+subtile
+subtilely
+subtileness
+subtiler
+subtilest
+subtilis
+subtilisin
+subtilty
+subtonic
+subtotal
+subtropic
+subtropical
+subtropics
+subulate
+subvention
+subventionary
+subversionary
+subviral
+subvocal
+subvocally
+succedaneous
+succedaneum
+succedent
+successional
+successionally
+succinate
+succinyl
+succinylcholine
+succory
+succotash
+succuba
+succubi
+succulence
+succulent
+succulently
+suchlike
+sucrase
+sucre
+sucrose
+suctional
+suctorial
+suctorian
+sudanic
+sudatorium
+sudatory
+sudoriferous
+sudorific
+sudsier
+sudsless
+sudsy
+suede
+suet
+suey
+suff
+sufferable
+sufferableness
+sufferably
+suffixation
+suffragan
+suffragist
+suffragists
+sugarcane
+sugarcoat
+sugarhouse
+sugarloaf
+sugarplum
+sugary
+suint
+sukarno
+sukiyaki
+sulamite
+sulamith
+sulcate
+sulci
+sulcus
+sulfa
+sulfadiazine
+sulfanilamide
+sulfatase
+sulfatide
+sulfatides
+sulfhydryl
+sulfinyl
+sulfitic
+sulfonate
+sulfonation
+sulfone
+sulfonic
+sulfonium
+sulfonmethane
+sulfonyl
+sulfonylurea
+sulfoxide
+sulfureous
+sulfureously
+sulfureousness
+sulfuret
+sulfuryl
+sullage
+sulphurou
+sulphurous
+sultanate
+sultaness
+sultrily
+sulzberger
+sumach
+summa
+summability
+summable
+summae
+summated
+summates
+summating
+summational
+summerhouse
+summersault
+summerwood
+summery
+sumptuary
+sunay
+sunbath
+sunbathe
+sunbather
+sunbird
+sunbow
+sunburst
+sunbursts
+sundae
+sundaes
+sundew
+sundrops
+sunfast
+sunlamp
+sunless
+sunn
+sunna
+sunnily
+sunroof
+sunscald
+sunscreen
+sunscreen's
+sunscreening
+sunscreens
+sunstroke
+sunstruck
+sunsuit
+suntanning
+sunup
+sunward
+sunwards
+sunwise
+superable
+superableness
+superably
+superabound
+superabundance
+superabundant
+superabundantly
+superadd
+superaddition
+superagency
+superaltern
+superannuate
+superannuated
+superannuation
+superblock
+supercalender
+supercargo
+supercharge
+supercharger
+superciliary
+supercity
+superconduct
+superconducting
+superconductive
+superconductivity
+superconductor
+superconductors
+supercool
+superdominant
+superelevate
+superelevation
+supereminence
+supereminent
+supereminently
+superempirical
+superencipher
+superencipherment
+supererogation
+supererogatory
+superfamily
+superfecundation
+superfetation
+superficies
+superfine
+superfix
+superfluid
+superfluidity
+supergalaxy
+supergene
+supergiant
+superheat
+superheater
+superheats
+superheterodyne
+superhighway
+superhumanity
+superieure
+superimposable
+superimposition
+superincumbent
+superincumbently
+superindividual
+superinduce
+superinduction
+superinfection
+superintendence
+superintendency
+superjacent
+superjet
+superliner
+superluminal
+superlunar
+superman
+supernal
+supernally
+supernaturalist
+supernaturalistic
+supernormality
+supernovae
+supernumerary
+superorder
+superordinate
+superorganism
+superovulation
+superparasitism
+superpatriot
+superpatriotic
+superpatriotism
+superphosphate
+superphysical
+superpower
+superpowered
+superpowers
+supersaturate
+supersaturated
+supersaturation
+superscribe
+superscription
+supersedeas
+supersedure
+supersensible
+supersensory
+superserviceable
+supersession
+supersessive
+supersonically
+superstar
+superstratum
+supersubstantial
+supersubtle
+supersubtlety
+supersystem
+supertanker
+supertax
+supertonic
+supervenience
+supervenient
+supervention
+supervisee
+supinate
+supination
+supinator
+suppl
+supplantation
+supplejack
+suppletion
+suppletive
+suppletory
+suppliance
+suppliant
+suppliantly
+supplicant
+supplicant's
+supplicantly
+supplicants
+supplicatory
+supportability
+supportableness
+supportably
+supposably
+supposal
+suppositional
+suppositionally
+suppositious
+supposititious
+supposititiously
+supposititiousness
+suppositive
+suppositively
+suppositories
+suppository
+suppressant
+suppressibility
+suppurate
+suppuration
+suppurative
+supr
+supraglottal
+supralaryngeal
+supraliminal
+supraliminally
+supramolecular
+supranationalist
+supranationality
+supraorbital
+supraprotest
+suprarational
+suprarenal
+supravital
+supravitally
+supremum
+surah
+surbase
+surbased
+surcingle
+surcliffe
+surcoat
+surcoats
+surefire
+surefooted
+surefootedly
+surefootedness
+suretyship
+surfable
+surfboard
+surfboarder
+surfboards
+surfboat
+surfboats
+surficial
+surfperch
+surg
+surjection
+surjective
+surlily
+surmountable
+surmullet
+surpassable
+surplice
+surplusage
+surprint
+surprisal
+surra
+surrealistic
+surrealistically
+surrebutter
+surrejoinder
+surroyal
+surtout
+surveil
+survivable
+survivance
+susceptance
+susceptive
+susceptiveness
+susceptivity
+suspenseful
+suspensoid
+suspensory
+suspiration
+suspire
+suspired
+suspiring
+susquehanna
+sustentacular
+sustentation
+sustentative
+sustention
+susurrant
+susurration
+susurrous
+susurrus
+sutra
+suttee
+sutural
+suturally
+suzerain
+suzerainty
+swabber
+swabbie
+swadesh
+swage
+swagging
+swagman
+swainish
+swainishness
+swale
+swallowable
+swallowtail
+swallowwort
+swang
+swanherd
+swankily
+swannery
+swanning
+swansdown
+swanskin
+swartz
+swashbuckle
+swashbuckler
+swashbuckling
+swayback
+swaybacked
+swearword
+sweatbox
+sweatily
+sweatpants
+sweatshop
+sweatshop's
+sweatsocks
+sweazey
+sweepback
+sweepier
+sweepy
+sweetbread
+sweetbread's
+sweetbreads
+sweetbrier
+sweetmeat
+sweetshop
+sweetsop
+swellhead
+swellheaded
+swellheadedness
+swelter
+sweltered
+swidden
+swigger
+swill
+swiller
+swimmable
+swimmeret
+swimmier
+swimmily
+swimminess
+swimmy
+swinburne
+swineherd
+swingably
+swinge
+swingeing
+swingletree
+swishingly
+switchable
+switchback
+switchback's
+switchbacks
+switcheroo
+switchgrass
+switchyard
+swith
+swither
+swivet
+swoosh
+swop
+swordfight
+swordfight's
+swordfights
+swordlike
+swordsman
+swordsmanship
+swot
+swots
+swotted
+swotting
+sybarite
+sybaritically
+sybert
+sycamine
+syce
+sycee
+syconium
+sycophancy
+sycophantish
+sycophantishly
+sycophantism
+sycosis
+syenite
+syenitic
+syllabarium
+syllabary
+syllabically
+syllabicate
+syllabication
+syllabub
+syllepsis
+sylleptic
+syllogist
+syllogistically
+sylph
+sylphid
+sylphlike
+sylvanite
+sylvatic
+sylviculture
+sylvie
+sylvine
+sylvite
+sym
+symbiontic
+symbiote
+symbiotically
+symbolist
+symbolistic
+symbology
+symington
+symmetallism
+symonds
+sympathin
+sympatholytic
+sympathomimetic
+sympatric
+sympatrically
+sympatry
+sympetalous
+sympetaly
+symphonically
+symphonious
+symphoniously
+symphonist
+symphyseal
+symphysial
+symphysis
+symplectic
+sympodial
+sympodially
+symposiarch
+symposiast
+symptomatically
+symptomatologic
+symptomatological
+symptomatologically
+symptomless
+synaeresis
+synaesthesis
+synagog
+synagogal
+synalepha
+synaloepha
+synapsis
+synaptically
+synaptosomal
+synaptosome
+synarthrodial
+synarthrodially
+synarthrosis
+sync
+syncarpous
+syncarpy
+synch
+synching
+synchro
+synchroflash
+synchromesh
+synchronal
+synchroneity
+synchronic
+synchronical
+synchronically
+synchronistic
+synchros
+synchroscope
+syncing
+synclinal
+syncline
+syncopal
+syncopator
+syncope
+syncretic
+syncretism
+syncretist
+syncretistic
+syncytial
+syncytium
+syndactylism
+syndactyly
+syndesis
+syndesmosis
+syndesmotic
+syndetic
+syndetically
+syndical
+syndicalism
+syndicalist
+syndicator
+syne
+synecdoche
+synecdochic
+synecdochical
+synecdochically
+synecologic
+synecological
+synecologically
+synecology
+synectic
+synectically
+synectics
+synephrine
+syneresis
+synergetic
+synergic
+synergically
+synergid
+synergist
+synergistically
+synesis
+syngamy
+syngeneic
+synizesis
+synkaryon
+synodal
+synodic
+synodical
+synonymic
+synonymical
+synonymist
+synonymity
+synoptical
+synoptically
+synostosis
+synovial
+synovitis
+synsepalous
+synthesist
+synthetase
+synthetical
+synthetically
+syntonic
+syntonically
+syphilis
+syphilologist
+syphilology
+syren
+syringa
+syringomyelia
+syringomyelic
+syrinx
+syrinxes
+syrphid
+sysgt
+syst
+systaltic
+systat
+systematical
+systematism
+systematist
+systemically
+systemless
+systemwide
+systole
+systolic
+syzygial
+syzygy
+tabac
+tabanid
+tabard
+tabbed
+tabellen
+tabernacular
+tabes
+tabetic
+tabla
+tablature
+tableaux
+tableful
+tablespoonsful
+tableware
+tabloid
+tabor
+tabored
+taborer
+taborers
+taborin
+taboring
+taborins
+tabors
+tabu
+tace
+tacet
+tach
+tachinid
+tachism
+tachist
+tachiste
+tachistoscope
+tachistoscopic
+tachistosopically
+tachs
+tachycardia
+tachygraphic
+tachygraphical
+tachygraphy
+tachylite
+tachymeter
+tachymeter's
+tachymeters
+tachyon
+tachyon's
+tachyons
+taciturn
+taciturnity
+tackboard
+tackier
+tackies
+tackifier
+tackify
+tackily
+tacky
+tacloban
+taconite
+tactician
+tactility
+taction
+tactless
+tactlessly
+tad
+tadpole
+taeniacide
+taeniasis
+tagalong
+tagboard
+tagine
+tagines
+taiga
+tailboard
+tailbone
+tailcoat
+tailcoated
+taille
+tailless
+taillight
+taillight's
+taillights
+taillike
+tailorbird
+tailoress
+tailpiece
+tailrace
+tailspin
+tailspin's
+tailspins
+tailwater
+tailwind
+tailwind's
+tailwinds
+taintless
+taipan
+taiwanese
+takedown
+takeout
+talc
+talcose
+talcum
+talebearer
+talebearing
+talentless
+talesman
+taleysim
+tali
+talipes
+talipot
+talisman
+talismanically
+talkathon
+talladega
+tallage
+tallahatchie
+tallahoosa
+tallboy
+tallchief
+talleyrand
+tallish
+tallith
+tallithim
+tallowy
+tallyman
+talmudic
+talmudical
+talus
+tam
+tamandua
+tamarau
+tamarin
+tamarisk
+tambala
+tambour
+tambourer
+tamburitza
+tameable
+tameless
+tampala
+tamperproof
+tampion
+tanager
+tanbark
+tance
+tangelo
+tangere
+tangibility
+tanglement
+tangram
+tanh
+tanka
+tankage
+tankful
+tannage
+tannate
+tannenbaum
+tannest
+tannic
+tannish
+tansies
+tansy
+tantalate
+tantalic
+tantalite
+tantara
+tantivy
+tantra
+tantric
+tapa
+tapeline
+tapeta
+tapetum
+taphole
+tapioca
+tapis
+tapley
+tappa
+taproom
+taprooms
+tapster
+tapsters
+tara
+taraday
+tarantara
+tarantism
+taras
+taraxacum
+tarboosh
+tarbush
+tardigrade
+tardo
+tare
+targe
+targo
+tarheelia
+tarlatan
+tarmac
+tarmacadam
+tarn
+tarnishable
+taro
+tarok
+taros
+tarot
+tarpaper
+tarragon
+tarrant
+tarre
+tarriance
+tarsal
+tarsi
+tarsier
+tarsus
+tartan
+tartarughe
+tartish
+tartishly
+tartlet
+tartlets
+tartrate
+tartrated
+tartrates
+tartuffe
+taruffi
+taskmistress
+taskwork
+tasse
+tassel
+tassel's
+tasso
+tastemaker
+tastily
+tat
+tatami
+tate
+tatian
+tatler
+tatras
+tatted
+tatterdemalion
+tattersall
+tattooist
+taui
+taupe
+taurine
+taurocholate
+taurocholic
+taurog
+taussig
+tautog
+tautologous
+tautologously
+tautomer
+tautomeric
+tautomerism
+tautonym
+tautonymic
+tautonymous
+tautonymy
+taverna
+taw
+tawdrily
+tawes
+tawie
+tawpie
+taws
+tawse
+taxa
+taxability
+taxeme
+taxemic
+taxidermic
+taxidermist
+taxidermist's
+taxidermists
+taxidermy
+taxies
+taximan
+taximeter
+taximeter's
+taximeters
+taxon
+taxonomist
+taxonomist's
+taxonomists
+taxons
+taxus
+taxying
+tazza
+tchaikovsky
+teachability
+teachably
+teachership
+teacupful
+teak
+teak's
+teaks
+teapoy
+teardown
+teargas
+tearier
+tearily
+tearjerker
+tearle
+tearless
+tearlessly
+tearlessnss
+tearoom
+tearooms
+tearstain
+tearstained
+teary
+teaspoonsful
+teatime
+teatro
+teazel
+teazle
+teazled
+technetronic
+technic
+technics
+technion
+technocracy
+technocrat
+technocratic
+technol
+technologic
+technostructure
+techy
+tecta
+tectal
+tectonism
+tectum
+tecum
+ted
+tedded
+tedding
+teds
+teenie
+teenier
+teentsier
+teentsy
+teeny
+teenybopper
+teepee
+teeter
+teeterboard
+teetotal
+teetotalism
+teetotalist
+teetotum
+tegmen
+tegmental
+tegmentum
+tegument
+tegumental
+tegumentary
+teiid
+tektitic
+tel
+telamon
+telamones
+telangiectasia
+telangiectasis
+telangiectatic
+tele
+telecamera
+telecast
+telecaster
+telecourse
+teledu
+telefacsimile
+telefilm
+teleg
+telegony
+telegraphese
+telegraphically
+telegraphist
+telekinetic
+telekinetically
+teleman
+telemann
+telemark
+telemetrically
+telencephalic
+telencephalon
+teleologic
+teleologist
+teleost
+teleostean
+teleostome
+telephonically
+telephonist
+telephonists
+telephoto
+telephotographic
+teleplay
+teleran
+telescopically
+telesis
+telethermoscope
+telethon
+teletypesetting
+teletypewrite
+teletypewriter
+teletypist
+teleutospore
+teleutosporic
+teleview
+televiewer
+televisionally
+televisionary
+televisual
+telia
+telial
+telic
+telically
+teliospore
+teliosporic
+telium
+telli
+tellurian
+telluric
+telluride
+tellurite
+tellurometer
+tellurometer's
+tellurometers
+tellurous
+telly
+telocentric
+teloic
+telome
+telophase
+telos
+telotaxis
+telpher
+telson
+temblor
+temerarious
+temerariously
+temerariousness
+tempeh
+tempera
+temperable
+tempi
+templeman
+templet
+temporality
+temptable
+tempura
+tenability
+tenably
+tenace
+tenaculum
+tenantable
+tenantless
+tenantry
+tench
+tenches
+tenda
+tendance
+tendencious
+tendentious
+tendentiously
+tendentiousness
+tenderhearted
+tenderheartedly
+tenderheartedness
+tenderometer
+tenderometer's
+tenderometers
+tendinous
+tendresse
+tendril
+tendrilous
+tendrils
+tenebrific
+tenebrionid
+tenebrious
+tenebrism
+tenebrist
+tenementary
+tenenbaum
+tenesmus
+tenex
+tenia
+teniacide
+teniasis
+tennist
+tenosynovitis
+tenour
+tenpenny
+tenpin
+tenpins
+tenpounder
+tenrec
+tensility
+tensimeter
+tensimeter's
+tensimeters
+tensiometer
+tensiometer's
+tensiometers
+tensiometric
+tensiometry
+tensity
+tensometer
+tensometer's
+tensometers
+tentacular
+tentage
+tenterhook
+tenterhooks
+tentie
+tentless
+tentmaker
+tenty
+tenuis
+tenuity
+tenurial
+tenurially
+tenuto
+teocalli
+teonanacatl
+teosinte
+tepa
+tepee
+tephra
+tepidity
+ter
+terai
+teraph
+teraphim
+teratogen
+teratogenesis
+teratogenicity
+teratologic
+teratological
+teratologist
+teratoma
+teratomatous
+terce
+tercentenary
+tercentennial
+tercept
+tercet
+terebene
+terebic
+terebinth
+terebinthine
+tered
+teredines
+teredo
+terephthalate
+terest
+terete
+terga
+tergal
+tergite
+tergiversate
+tergiversation
+tergiversator
+tergum
+teriyaki
+termagant
+termagantly
+terminably
+terminational
+termined
+termining
+terminism
+termitarium
+termless
+termtime
+ternate
+ternately
+terneplate
+terpene
+terpeneless
+terpenic
+terpenoid
+terpineol
+terpolymer
+terr
+terrae
+terram
+terrane
+terraqueous
+terrarium
+terrazzo
+terrene
+terreplein
+terret
+terricolous
+terrifically
+terrigenous
+territorialism
+territorialist
+territoriality
+terrorless
+tertre
+tervalent
+tery
+tessera
+tessie
+tessitura
+testa
+testacean
+testaceous
+testacy
+testae
+testatrix
+testcross
+testis
+teston
+testoon
+testosterone
+testudo
+tetanal
+tetanic
+tetanically
+tetany
+tetartohedral
+tetched
+tetchier
+tetchy
+tete
+teter
+teth
+tetherball
+tetra
+tetrabasic
+tetrabasicity
+tetracaine
+tetrachord
+tetracid
+tetrad
+tetradecyl
+tetradic
+tetradrachm
+tetradymite
+tetradynamous
+tetraethyl
+tetraethyllead
+tetragonolobus
+tetragrammaton
+tetrahedrite
+tetrahydrate
+tetrahydrated
+tetrahydrocannabinol
+tetrahydrofuran
+tetrahydroxy
+tetrahymena
+tetralogy
+tetramer
+tetramer's
+tetrameric
+tetramerous
+tetramers
+tetrameter
+tetramethyl
+tetramethyllead
+tetraploid
+tetraploidy
+tetrapod
+tetrapyrrole
+tetrarch
+tetrarchic
+tetrarchy
+tetraspore
+tetrasporic
+tetratomic
+tetrazolium
+tetrode
+tetrodes
+tetrodotoxin
+tetrxide
+tetryl
+tetter
+tewfik
+textbookish
+textuary
+thalamencephalon
+thalamic
+thalamically
+thalamus
+thalassemia
+thalassemic
+thalassic
+thalassocracy
+thalassocrat
+thaler
+thalidomide
+thalli
+thallic
+thalloid
+thallophytic
+thallous
+thallus
+thalluses
+thames
+thane
+thaneship
+thankworthy
+thar
+thaumaturge
+thaumaturgic
+thaumaturgist
+thaumaturgy
+theast
+theat
+theatricalism
+theatricality
+theca
+thecae
+thecal
+thecate
+thecodont
+thee
+theelin
+theelol
+theist
+theist's
+theistical
+theistically
+theists
+thematically
+thenar
+thenceforward
+thenceforwards
+theobromine
+theocentric
+theocentricity
+theocentrism
+theocrat
+theocratic
+theocratical
+theocratically
+theodicy
+theodolite
+theodolitic
+theodosius
+theogonic
+theogony
+theol
+theolog
+theologic
+theologue
+theonomous
+theonomously
+theonomy
+theophanic
+theophany
+theophylline
+theorematic
+theosophical
+theosophically
+theosophist
+theosophy
+therapeusis
+therapeutically
+therapeutist
+therapsid
+thereabout
+thereat
+thereinafter
+thereinto
+thereunto
+therewithal
+theriac
+theriaca
+theriacal
+theriomorphic
+therm
+thermae
+thermalization
+thermalize
+thermalized
+thermalizes
+thermalizing
+thermic
+thermically
+thermion
+thermite
+thermite's
+thermochemical
+thermochemist
+thermochemistry
+thermocline
+thermocoagulation
+thermoduric
+thermodynamical
+thermodynamicist
+thermoelectron
+thermoelement
+thermoform
+thermoformable
+thermogram
+thermogram's
+thermograms
+thermograph
+thermographic
+thermographically
+thermography
+thermohaline
+thermojunction
+thermolabile
+thermolability
+thermoluminescence
+thermoluminescent
+thermolysis
+thermolytic
+thermomagnetic
+thermomagnetically
+thermometrically
+thermoperiodicity
+thermoperiodism
+thermophile
+thermophilic
+thermophilous
+thermoplasticity
+thermopylae
+thermoreceptor
+thermoregulation
+thermoregulator
+thermoregulatory
+thermoremanence
+thermoremanent
+thermoscope
+thermoset
+thermosphere
+thermospheric
+thermostability
+thermostatically
+thermotactic
+thermotaxis
+thermotropic
+thermotropism
+theroelectricity
+thesaural
+thetic
+thetically
+theurgic
+theurgical
+theurgist
+theurgy
+thew
+thiabendazole
+thiaminase
+thiamine
+thiazide
+thiazine
+thiazole
+thickety
+thickhead
+thickheaded
+thickset
+thievery
+thievish
+thievishly
+thievishness
+thighbone
+thigmotaxis
+thigmotropism
+thill
+thills
+thimbleberry
+thimbleful
+thimbleful's
+thimblerig
+thimblerigger
+thimblesful
+thimbleweed
+thimerosal
+thinclad
+thingamabob
+thingumajig
+thingummy
+thiocarbamide
+thiocyanic
+thioguanine
+thiol
+thiolic
+thionate
+thionic
+thiopental
+thiophene
+thiophosphate
+thiosulfate
+thiosulfuric
+thiotepa
+thiouracid
+thiourea
+thir
+thiram
+thirdhand
+thirl
+thirstily
+thirtyfold
+thistly
+thitherto
+thitherward
+thixotropic
+thixotropy
+tho
+thod
+tholdy
+thole
+tholed
+tholeiite
+tholeiitic
+tholepin
+tholer
+tholes
+tholing
+thoraces
+thoracic
+thoracically
+thoracotomy
+thorax
+thoraxes
+thoria
+thorianite
+thoric
+thorite
+thornback
+thornbush
+thornless
+thornlike
+thoroughpin
+thoroughwort
+thoth
+thoughtway
+thousandfold
+thraldom
+thralldom
+thrasonical
+thrasonically
+thraw
+thrawart
+thrawn
+thrawnly
+threadfin
+threadiness
+threadless
+threadlike
+thready
+threepence
+threepences
+threepenny
+thremmatology
+threnode
+threnodic
+threnodist
+threnody
+threonine
+thriftily
+thriftless
+thriftlessly
+thriftlessness
+thrips
+thriven
+thro
+throatily
+throatlatch
+throbber
+throe
+thrombin
+thrombocyte
+thrombocytic
+thrombocytopenia
+thrombocytopenic
+thromboembolic
+thromboembolism
+thrombokinase
+thrombophlebitis
+thromboplastic
+thromboplastically
+thromboplastin
+thrombosed
+thrombospondin
+thrombotic
+throneberry
+throstle
+throttleable
+throttlehold
+throughither
+throughother
+throughway
+throve
+throwaway
+throwster
+thrustful
+thrustfulness
+thrustor
+thudded
+thumbhole
+thumbprint
+thumbprint's
+thumbprints
+thumbscrew
+thunderbird
+thundercloud
+thundercloud's
+thunderclouds
+thunderflower
+thunderhead
+thunderpeal
+thundershower
+thundershower's
+thundershowers
+thunderstone
+thunderstrike
+thunderstroke
+thurber
+thurible
+thurifer
+thurl
+thwartwise
+thwump
+thylacine
+thylakoid
+thyme
+thyme's
+thymectomy
+thymes
+thymey
+thymic
+thymidine
+thymine
+thymocyte
+thymol
+thymus
+thymy
+thyrglobulin
+thyrocalcitonin
+thyroidectomy
+thyroiditis
+thyrotoxicosis
+thyroxin
+thyrse
+thyrsi
+thyrsus
+thysanopteran
+thysanuran
+ti
+tial
+tiality
+tian
+tiara
+tiated
+tibial
+tiburon
+tical
+ticism
+tickicide
+ticklebrush
+tickseed
+ticktack
+ticktacktoe
+ticktock
+ticonderoga
+tictac
+tiddledywinks
+tiddlywinks
+tideless
+tidemark
+tideway
+tieback
+tieck
+tieing
+tieless
+tiemannite
+tien
+tiepin
+tierce
+tiercel
+tigerish
+tigerishly
+tigerishness
+tigerlike
+tightfisted
+tightrope
+tightwad
+tightwad's
+tightwads
+tightwire
+tiglon
+tigon
+tijuana
+tike
+tiki
+til
+tilapia
+tilefish
+tillandsia
+tillerman
+tillich
+tillie
+tilly
+tiltable
+tiltmeter
+tiltmeter's
+tiltmeters
+tiltyard
+timbal
+timbale
+timberhead
+timberline
+timberman
+timberwork
+timbral
+timbrel
+timbrelled
+timekeeper
+timekeeping
+timeous
+timeously
+timepleaser
+timesaving
+timeserver
+timeservers
+timeserving
+timework
+timeworker
+timmy
+timocracy
+timocratic
+timocratical
+timorous
+timorously
+timorousness
+timpani
+timpanist
+tinamou
+tinc
+tincal
+tinct
+tinctorial
+tinctorially
+tinderbox
+tinea
+tineal
+tineau
+tinful
+ting
+tingeing
+tingen
+tingly
+tinhorn
+tinkly
+tinman
+tinnitus
+tinstone
+tintinnabulary
+tintinnabulation
+tintless
+tintoretto
+tinwork
+tinworks
+tipcart
+tipi
+tippecanoe
+tippet
+tipsily
+tipstaff
+tipstaves
+tipster
+tipstock
+tirewoman
+tisane
+tissuey
+titaness
+titania
+titanically
+titaniferous
+titanism
+titanous
+titbit
+tithable
+tithonia
+titi
+titivate
+titivation
+titlark
+titleholder
+titleholders
+titlist
+titmice
+tito
+titrant
+titratable
+titrator
+titrimetric
+titrimetrically
+tittie
+tittivate
+tittle
+tittup
+toadstool
+toastmaster
+toastmaster's
+toastmasters
+toastmistress
+tobacconist
+tobacconist's
+tobacconists
+tobies
+toboggan
+toboggan's
+tobogganer
+tobogganing
+tobogganist
+toboggans
+tocher
+tocopherol
+tocsin
+tod
+toddies
+toddy
+toddy's
+todies
+tody
+toehold
+toehold's
+toeholds
+toeing
+toeless
+toepiece
+toeplate
+toff
+toffies
+toffy
+toft
+toga
+togaed
+toggery
+togue
+toile
+toiletry
+toilette
+toilful
+toilfully
+toilworn
+toke
+tokenism
+tokonoma
+tola
+toland
+tolbooth
+tolbutamide
+tole
+tolerator
+tolidine
+toling
+tollbooth
+tollbooth's
+tollbooths
+tolley
+tollman
+tollway
+tolu
+toluate
+toluic
+toluidine
+toluol
+tolyl
+tolylene
+tombac
+tombigbee
+tombless
+tombolo
+tomboy
+tomboyish
+tomboyishness
+tomcat
+tomcod
+tomentose
+tomentum
+tomfoolery
+tommyrot
+tomogram
+tomogram's
+tomograms
+tompion
+tomtit
+tonality
+tondi
+tondo
+toneme
+tonemic
+tonetic
+tonetically
+tonetics
+tonette
+tonga
+tongueless
+tonguelike
+tonically
+tonicity
+tonio
+tonn
+tonne
+tonneau
+tonneaus
+tonner
+tonnes
+tonometer
+tonometer's
+tonometers
+tonometric
+tonometry
+tonoplast
+tonsillar
+tonsillectomy
+tonsorial
+tonsure
+tonsured
+tonsuring
+tontine
+tonus
+toolbox
+toolboxes
+toolhead
+toolholder
+toolhouse
+toolroom
+toolshed
+toom
+toomey
+toon
+toothache
+toothache's
+toothaches
+toothless
+toothlike
+tooths
+toothsome
+toothsomely
+toothsomeness
+toothwort
+topcross
+topdressing
+tope
+topee
+topes
+topflight
+topful
+topfull
+topheavy
+tophi
+tophus
+topi
+topiary
+topicality
+topkick
+topknot
+topless
+toploftical
+toploftily
+toploftiness
+toplofty
+topmast
+topminnow
+topograph
+topographer
+topoi
+topologise
+topologist
+toponym
+toponymic
+toponymical
+toponymy
+topos
+topper
+topsail
+topstitch
+topwork
+toque
+tor
+torchbearer
+torchlight
+torchon
+torchwood
+toreador
+torero
+toreutic
+toreutics
+tormentil
+tormentor
+tornadic
+tornillo
+torpidity
+torquate
+torr
+torrens
+torrential
+torrentially
+torridity
+torsade
+torsi
+torte
+tortes
+torticollis
+tortilla
+tortious
+tortiously
+tortoni
+tortricid
+tortrix
+tortuosity
+torturous
+torturously
+torula
+tosh
+tosspot
+totalism
+totaquina
+totaquine
+totemically
+totemism
+totemist
+totemistic
+totemite
+tother
+totipotency
+totipotent
+toto
+tottery
+totting
+toucan
+touchback
+touchhole
+touchline
+touchmark
+touchwood
+toughie
+toughies
+toughy
+toulouse
+toupee
+touraco
+tourbillion
+tourbillon
+touristic
+touristically
+tourmaline
+tournedos
+tourney
+tourneyed
+tourneying
+tourneys
+tourniquet
+tourniquets
+touse
+tousing
+tovarich
+tovarish
+towage
+towerlike
+towhee
+towie
+towline
+towmond
+townee
+townies
+townlet
+townley
+townsfolk
+townspeople
+townswoman
+townwear
+towny
+towpath
+towrope
+towsley
+toxaphene
+toxemia
+toxemic
+toxicant
+toxicogenic
+toxicologic
+toxicological
+toxicologically
+toxicologist
+toxicology
+toxicosis
+toxigenic
+toxigenicity
+toxoid
+toxophilite
+toxophilites
+toxophily
+toxoplasma
+toxoplasmic
+toxoplasmosis
+toylike
+toynbee
+toyon
+trabeate
+trabeated
+trabeation
+trabecula
+trabecular
+trabeculate
+traceability
+traceably
+tracheae
+tracheal
+tracheary
+tracheate
+tracheated
+tracheid
+tracheidal
+tracheitis
+tracheobronchial
+tracheolar
+tracheole
+tracheophyte
+tracheotomy
+trachoma
+trachomatous
+trachyte
+trachytic
+tracklayer
+tracklaying
+trackman
+trackside
+trackwalker
+tractableness
+tractably
+tractarians
+tractate
+tractional
+tradable
+tradeable
+tradescantia
+tradespeople
+tradevman
+traditionary
+traditionless
+tradtionalist
+traduce
+traduced
+traducement
+traducer
+traducing
+trafficable
+tragacanth
+tragedienne
+tragi
+tragical
+tragicomedy
+tragicomical
+tragopan
+tragus
+trailblazer
+trailblazer's
+trailblazers
+trailblazing
+trailbreaker
+trailerable
+trailerist
+trailerite
+trailership
+trailhead
+trailhead's
+trailheads
+trailless
+trainability
+trainable
+trainband
+trainbearer
+traineeship
+trainferry
+trainful
+trainload
+trainload's
+trainloads
+trainsick
+traitoress
+traitress
+traject
+trajection
+tral
+tramcar
+tramline
+tramming
+tramontane
+trampoline
+trampoliner
+trampolining
+trampolinist
+tramroad
+trancelike
+trangam
+transactinide
+transactional
+transactor
+transamination
+transaxle
+transcendency
+transcendentalist
+transcriptional
+transcriptionally
+transcutaneous
+transduced
+transducing
+transductional
+transection
+transeptal
+transferase
+transferential
+transfiguration
+transfigure
+transfixion
+transformant
+transformants
+transformationalist
+transformative
+transfusible
+transfusional
+transglottal
+tranship
+transhumance
+transhumant
+transilluminate
+transillumination
+transilluminator
+transitio
+transitorily
+translatory
+translocate
+translocation
+transmarine
+transmembrane
+transmigrate
+transmigration
+transmigrator
+transmigratory
+transmissibility
+transmissive
+transmissivity
+transmissometer
+transmissometer's
+transmissometers
+transmontane
+transmountain
+transmutable
+transmutative
+transnational
+transnatural
+transonic
+transparence
+transpersonal
+transpicuous
+transpierce
+transplacental
+transplacentally
+transplantability
+transpolar
+transponder
+transpontine
+transportational
+transpositional
+transsexual
+transsexualism
+transshape
+transthoracic
+transthoracically
+transubstantial
+transubstantiate
+transubstantiation
+transudate
+transudation
+transude
+transuded
+transuding
+transuranic
+transuranium
+transvaluate
+transvaluation
+transvalue
+transvestism
+transylvania
+trapeze
+trapezist
+trapezius
+trapezohedron
+trapnest
+traprock
+trapshooter
+trapshooting
+trapunto
+trashman
+trass
+trattoria
+traumata
+traumatically
+traumatism
+trave
+travois
+travoises
+trawlerman
+trayal
+trayful
+treacle
+treacly
+treadless
+treadwell
+treasonably
+treasurable
+treasurership
+treatability
+treatable
+trebly
+trebuchet
+trebucket
+trecento
+tred
+tredecillion
+treece
+treehopper
+treeing
+treeless
+treenail
+trehalase
+trehalose
+treillage
+trekker
+trelliswork
+trematode
+tremolant
+tremolite
+tremolitic
+tremolo
+tremulant
+trenail
+trenchancy
+trendily
+trepan
+trepanation
+trepang
+trepanned
+trepanning
+trepans
+trephination
+trephine
+trephined
+trephining
+trepid
+trepidant
+treponema
+treponemal
+treponematosis
+treponematous
+treponeme
+tressel
+trestletree
+trestlework
+trews
+trey
+treys
+tri
+triacetate
+triacid
+triadically
+triage
+trialogue
+triangularity
+triarchy
+triaxial
+triaxiality
+triazine
+triazines
+trib
+tribalism
+tribasic
+triboelectric
+triboelectricity
+tribological
+tribologist
+tribology
+triboluminescence
+triboluminescent
+tribophysics
+tribrach
+tribrachic
+tribromide
+tribunate
+tribuneship
+tricarboxylic
+tricarpellary
+tricarpellate
+trice
+triceps
+tricepses
+triceratops
+trichiasis
+trichina
+trichinal
+trichinosis
+trichinous
+trichite
+trichlorfon
+trichloride
+trichocyst
+trichocystic
+trichogyne
+trichoid
+trichome
+trichomic
+trichomonacidal
+trichomonacide
+trichomonad
+trichomonadal
+trichomonal
+trichomoniasis
+trichopteran
+trichotomous
+trichotomously
+trichromat
+trichromatism
+trichrome
+trichuriasis
+tricing
+trickily
+trickish
+trickishly
+trickishness
+tricksier
+tricksiness
+tricksy
+triclad
+triclinic
+triclinium
+tricolette
+tricorn
+tricorne
+tricornered
+tricot
+tricotine
+tricotyledonous
+trictrac
+tricuspid
+tricycle
+tricycles
+tricyclic
+tridimensional
+tridimensionality
+triduum
+triene
+triennium
+trierarch
+trierarchy
+triethyl
+trifacial
+trifid
+trifluralin
+trifocal
+trifoliate
+trifoliolate
+trifolium
+triforium
+triform
+trifurcate
+trifurcation
+trigeminal
+triggerfish
+triggerman
+trigging
+triglyceride
+triglycerides
+triglyph
+triglyphic
+triglyphical
+trigon
+trigonometrical
+trigonometrically
+trigonous
+trigraph
+trigraphic
+trihybrid
+trihydroxy
+triiodothyronine
+trijet
+trilateral
+trilaterality
+trilaterally
+trilbies
+trilby
+trilinear
+trilingual
+trilingually
+triliteral
+triliteralism
+trillium
+trilobate
+trilobation
+trilobed
+trilocular
+triloculate
+trimaran
+trimble
+trimeric
+trimerous
+trimestral
+trimestrial
+trimeter
+trimetrogon
+trimonthly
+trimorph
+trimorphic
+trimorphism
+trimorphous
+trimotor
+trinal
+trinary
+trindle
+trindled
+trindling
+trine
+trinitrotoluene
+trinketry
+trinkums
+trinocular
+trinomial
+trinucleotide
+triol
+triolet
+triose
+tripack
+triphammer
+triphammer's
+triphammers
+triphenylmethane
+triphibian
+triphibious
+triphosphate
+triphthong
+triphthongal
+tripinnate
+tripinnately
+triplane
+tripletail
+triplicity
+triplite
+triploblastic
+triploid
+triploidy
+tripodal
+tripos
+tripper
+trippet
+triptane
+triquetrous
+triradiate
+trireme
+tris
+trisaccharide
+trisect
+trisection
+trisector
+triskele
+triskelion
+trismus
+trisoctahedron
+trisome
+trisomic
+trisomy
+triste
+tristearin
+tristeza
+tristful
+tristfully
+tristfulness
+tristimulus
+trisubstituted
+trisulfide
+trisyllabic
+trisyllabicall
+trit
+tritheism
+tritheist
+tritheistic
+tritheistical
+trithing
+tritiated
+triticale
+tritoma
+tritone
+triturable
+triturate
+trituration
+triturator
+triumvir
+triumviral
+triumvirate
+trivalve
+trivet
+triweekly
+trochaic
+trochal
+trochanter
+trochanteral
+trochanteric
+trochar
+troche
+trochee
+trochilus
+trochlea
+trochlear
+trochoid
+trochoidal
+trochophore
+troglodytic
+trogon
+trograd
+troilite
+trolleybus
+trollied
+trollies
+trolly
+trombidiasis
+trommel
+tromp
+trona
+trone
+troostite
+trop
+tropaeolum
+trope
+tropez
+trophallaxis
+trophically
+trophoblast
+trophoblastic
+trophozoite
+tropidoclonion
+tropistic
+tropologic
+tropological
+tropologically
+tropology
+tropomyosin
+tropopause
+tropophilous
+troposphere
+tropotaxis
+troth
+trothplight
+trotline
+trotsky
+trotskyism
+troubadour
+troubadour's
+troubadours
+troubleshot
+troublous
+troublously
+troublousness
+troupial
+trousseau
+trousseaus
+trousseaux
+troutier
+trouty
+trove
+trover
+trow
+truantry
+truckage
+truckee
+truckle
+truckled
+truckler
+truckline
+truckling
+truckload
+truckload's
+truckloads
+truckman
+truckmaster
+truculency
+trueborn
+truehearted
+trueheartedness
+trueing
+truelove
+truepenny
+truffle
+truffle's
+truffled
+truffles
+truistic
+trujillo
+trull
+trumpetlike
+trumpetweed
+truncheon
+truncheons
+trunkfish
+trunkful
+trunnel
+trunnion
+trunnions
+trustability
+trustable
+trustbuster
+trusteeing
+trustless
+trustworthily
+tryout
+trypanosome
+trypanosomiasis
+tryparsamide
+trypsinogen
+tryptamine
+tryptic
+tryptophan
+tryptophane
+trysail
+tryst
+trytophan
+tryworks
+tset
+tsetse
+tsetses
+tsunamic
+tsunematsu
+tubal
+tubbable
+tubbed
+tubber
+tubbier
+tubbing
+tubby
+tubeless
+tubelike
+tubercle
+tubercled
+tubercular
+tubercularly
+tuberculate
+tuberculated
+tuberculation
+tuberculin
+tuberculoid
+tuberculous
+tuberculously
+tuberose
+tuberosity
+tuberous
+tubful
+tubifex
+tubifexes
+tubificid
+tubocurarine
+tubularity
+tubulous
+tuchun
+tuckahoe
+tucket
+tuebor
+tuel
+tufa
+tufaceous
+tuff
+tuffaceous
+tuffet
+tufty
+tugboat
+tugger
+tui
+tuille
+tuitional
+tularemic
+tulation
+tulatory
+tule
+tulipwood
+tullibee
+tumblebug
+tumbledown
+tumblerful
+tumbleweed
+tumbrel
+tumbril
+tumefaciens
+tumefaction
+tumefactive
+tumescence
+tumescent
+tumidity
+tumoral
+tumorigenic
+tumorigenicity
+tumorlike
+tumorlike's
+tumorlikes
+tumorous
+tump
+tumpline
+tumultuary
+tumulus
+tunability
+tunably
+tundish
+tuneable
+tuneless
+tunesmith
+tungstic
+tungstite
+tunica
+tunicae
+tunicate
+tunicated
+tunicle
+tunnellike
+tunny
+tup
+tuppence
+tupping
+tuque
+tural
+turbanned
+turbellarian
+turbid
+turbidimeter
+turbidimeter's
+turbidimeters
+turbidimetric
+turbidimetrically
+turbidimetry
+turbidite
+turbidity
+turbidly
+turbidness
+turbinal
+turbit
+turbjet
+turbo
+turbocar
+turbocharge
+turbocharger
+turboelectric
+turboprop
+turbos
+turboshaft
+turbosupercharged
+turbosupercharger
+turbot
+turbots
+turbulency
+turd
+ture
+tured
+tureen
+turfman
+turfski
+turfskiing
+turfy
+turgescence
+turgescent
+turgidity
+turgor
+turion
+turmeric
+turnbuckle
+turncoat
+turndown
+turnery
+turnsole
+turnspit
+turnstile
+turnup
+turnverein
+turpentinic
+turpentinous
+turps
+turquois
+turtledove
+turtlehead
+turves
+tusche
+tush
+tusklike
+tussah
+tussive
+tussock
+tussocks
+tussocky
+tussore
+tutee
+tutees
+tutelar
+tutelary
+tutorage
+tutoress
+tutorship
+tutoyer
+tutti
+tux
+tuyere
+twae
+twangy
+tween
+tweet
+tweeter
+twelvefold
+twelvemonth
+twentyfold
+twerp
+twiggy
+twilit
+twinberry
+twinborn
+twinflower
+twingeing
+twinkly
+twinship
+twiny
+twirp
+twitchily
+twitted
+twittery
+twixt
+twofer
+twohandedness
+twopence
+twopences
+twopenny
+tyke
+tyke's
+tykes
+tymbal
+tympan
+tympani
+tympani's
+tympanic
+tympanis
+tympanites
+tympanitic
+tympanum
+tympanum's
+tympany
+typal
+typeable
+typecase
+typecast
+typefounder
+typefounding
+typefoundry
+typeout
+typey
+typhlosole
+typic
+typier
+typograph
+typologist
+typy
+tyramine
+tyrannosaur
+tyrannosaurus
+tyrannous
+tyrannously
+tyro
+tyrocidin
+tyrocidine
+tyros
+tyrosinase
+tyrothricin
+tzaddik
+tzaddikim
+tzar
+tzigane
+tzimmes
+tzitzis
+udall
+udder
+uglification
+uglify
+uglily
+ukulele
+ulama
+ulcerogenic
+ulcerous
+uldered
+ulema
+ulexite
+ullage
+ulna
+ulna's
+ulnar
+ulotrichous
+ulotrichy
+ultima
+ultimacy
+ultimo
+ultimogeniture
+ultrabasic
+ultracentrifugal
+ultrafashionable
+ultrafiche
+ultrafilter
+ultrafiltration
+ultrahigh
+ultraism
+ultraist
+ultraistic
+ultramafic
+ultramicro
+ultramicroscope
+ultramicroscopes
+ultramicrotome
+ultramicrotomes
+ultramicrotomy
+ultramodernist
+ultramontane
+ultramontanism
+ultranationalism
+ultranationalist
+ultrapure
+ultrapurely
+ultrasecret
+ultrasonicate
+ultrasonicated
+ultrasonicates
+ultrasonicating
+ultrastructural
+ultrastructurally
+ululant
+ululate
+ululation
+ulva
+umbel
+umbellate
+umbellifer
+umbelliferous
+umbilicate
+umbilicated
+umbilication
+umbonate
+umbones
+umbos
+umbrae
+umbrageous
+umbrageously
+umbrageousness
+umbral
+umlaut
+ump
+umpirage
+umpteen
+umpteenth
+un
+unaccountability
+unadapted
+unageing
+unalterability
+unamazed
+unamusing
+unanchor
+unanswerably
+unapologetic
+unappealable
+unappreciation
+unapproachably
+unarm
+unassailability
+unassailably
+unassertive
+unassuageable
+unattach
+unaverage
+unballasted
+unbandage
+unbar
+unbeautiful
+unbecome
+unbeknown
+unbelief
+unbeliever
+unbeseeming
+unbiblical
+unbid
+unbitted
+unblenched
+unblessed
+unbolt
+unbosom
+unbox
+unbrace
+unbraid
+unbridle
+unbroke
+unbuckle
+unbudgeable
+unbudgeably
+unbuild
+unbundle
+unburden
+uncage
+uncalculated
+uncalculatingly
+uncandid
+uncannily
+uncelebrated
+unchain
+unchallengeable
+unchancy
+unchangealeness
+uncharge
+unchaste
+unchastely
+unchasteness
+unchivalrous
+unchoke
+uncial
+uncially
+unciform
+uncil
+uncinaria
+uncinariasis
+uncinate
+uncinus
+uncircumcision
+unclamp
+unclasp
+unclassical
+unclench
+unclimbable
+unclimbableness
+unclinch
+uncloak
+unclog
+unclose
+unclothe
+unclutter
+uncock
+uncoffin
+uncoffined
+uncoil
+uncommercial
+uncompassionate
+uncompetitive
+uncompetitiveness
+uncomplicated
+uncompromisable
+unconformable
+unconformably
+uncongenial
+unconquerably
+unconscionability
+unconscionably
+unconstraint
+uncork
+uncorseted
+uncouple
+uncoupler
+uncross
+uncrown
+uncrumple
+unctuous
+unctuously
+unctuousness
+uncurl
+uncus
+uncut
+undauntable
+undebatably
+undecagon
+undeceive
+undecillion
+underact
+underactivity
+underage
+underbid
+underbidder
+underbody
+underbred
+underbrim
+undercarriage
+undercharge
+underclass
+undercoat
+undercoating
+undercook
+undercool
+underdo
+underdrawers
+underdress
+underdressed
+undereducation
+underexpose
+underexposure
+underfeed
+undergarment
+undergird
+underglaze
+underhand
+underinsurance
+underlaid
+underlayment
+underlet
+underlip
+undermanned
+undermost
+undernourished
+undernourishment
+undernutrition
+underpants
+underpart
+underpass
+underpasses
+underpin
+underplot
+underplots
+underpowered
+underproduction
+underproductive
+underproof
+underreport
+underripe
+underrun
+undersaturated
+undersecretariat
+undersell
+undersexed
+undershorts
+undershrub
+undersigned
+underskirt
+underslung
+undersong
+underspin
+understaffed
+understeer
+understory
+understrapper
+understrength
+undersupply
+undersurface
+undertenant
+undertone
+undertrick
+underused
+undervaluation
+undervalue
+undervaluing
+underwaist
+underweight
+underwing
+underwool
+undetectability
+undine
+undiplomatically
+undock
+undogmatic
+undouble
+undramatic
+undrape
+undraw
+undrunk
+undulant
+undulatory
+une
+unequivocably
+unexceptionable
+unexceptionableness
+unexceptionably
+unexceptional
+unexpressive
+unfancy
+unfasten
+unfeeling
+unfeelingly
+unfeelingness
+unfetter
+unfix
+unfixable
+unflappability
+unflappable
+unforgettability
+unforgiveable
+unforgiveably
+unfreeze
+unfriended
+unfrock
+unfussy
+ungenerosity
+ungenerous
+ungird
+unglue
+ungovernable
+ungrudging
+ungual
+unguard
+unguent
+ungulate
+unhair
+unhandiness
+unhandsome
+unhandy
+unharness
+unhitch
+unhitches
+unhitching
+unhood
+unhorse
+unhorsed
+unialgal
+uniaxial
+uniaxially
+unibuss
+unicameral
+unicamerally
+unicellular
+unicellularity
+unicycle
+unicyclist
+unifactorial
+unifiable
+unifoliate
+unifoliolate
+uniformitarian
+uniformitarianism
+unijugate
+unilinear
+unilingual
+unillusioned
+unilocular
+uninformative
+unintelligence
+uninucleate
+uninvaginated
+unionism
+unionist
+unionists
+uniparental
+uniparentally
+uniparous
+uniplanar
+uniplex
+unipolarity
+uniramous
+unisex
+unisexual
+unisexuality
+unisexually
+unitage
+unital
+unitarily
+unitarity
+universalist
+univocal
+univocally
+unkenned
+unkennel
+unlace
+unlade
+unlash
+unlatch
+unlay
+unlimber
+unlimbered
+unlimbering
+unlive
+unloose
+unloosen
+unman
+unmate
+unmating
+unmeaning
+unmeet
+unmemorable
+unmemorably
+unmitigatd
+unmoor
+unmoral
+unmorality
+unmuffle
+unmuzzle
+unmyelinated
+unnail
+uno
+unopenable
+unpackage
+unpackaging
+unpalatable
+unpeg
+unpeople
+unperfect
+unperson
+unpick
+unpile
+unpin
+unplug
+unpolitical
+unpregnant
+unprofessed
+unpronounced
+unquote
+unreel
+unreeve
+unregenerate
+unreserve
+unrestraint
+unriddle
+unrig
+unrip
+unrobe
+unroof
+unroot
+unrotate
+unround
+unrounded
+unsaddle
+unsafety
+unsaturate
+unsay
+unsayable
+unseal
+unsealing
+unseam
+unsearchable
+unsearchably
+unsel
+unselective
+unserviceable
+unset
+unsettle
+unsettlement
+unsew
+unsex
+unshackle
+unshapen
+unshell
+unshift
+unship
+unshockability
+unshockable
+unshped
+unsight
+unsighted
+unsling
+unslinged
+unslinging
+unsnarl
+unspeak
+unspeakably
+unsphere
+unsportsmanlike
+unstate
+unstep
+unstick
+unstop
+unstoppably
+unstrap
+unstring
+unstudied
+unsubstantial
+unsubstantiality
+unsuccess
+unswathe
+unswear
+unsymmetrical
+untangle
+untenability
+unter
+untether
+unthaw
+unthink
+unthinkability
+unthought
+unthread
+unthrone
+untimeous
+untouchability
+untraceability
+untread
+untruss
+untuck
+untune
+untwine
+untwist
+unutterable
+unvocal
+unvoice
+unwarrantably
+unweave
+unweeting
+unweetingly
+unweight
+unwell
+unwieldily
+unwinnable
+unwisdom
+unwish
+unwished
+unworthily
+unwreathe
+unyoke
+unzio
+unzip
+upas
+upbuild
+upbuilder
+upcast
+upchuck
+updo
+updos
+upgrowth
+upheave
+upheaver
+uphoster
+upmanship
+upmost
+upperpart
+upping
+uppish
+uppishly
+uppishness
+uppity
+uppityness
+uprear
+uprush
+upsetter
+upshift
+upspring
+upstage
+upstaged
+upstages
+upstaging
+upstart
+upstroke
+upsweep
+upswept
+upthrow
+upthrust
+uptight
+uptightness
+uptilt
+upwell
+uracil
+uraei
+uraemia
+uraeus
+uralite
+uralitic
+uranic
+uranide
+uraninite
+uranographic
+uranographical
+uranography
+uranological
+uranology
+uranometry
+uranous
+urate
+uratic
+urbanist
+urbanistic
+urbanistically
+urbanity
+urbanologist
+urbanology
+urbiculture
+urceolate
+ure
+urease
+uredinial
+uredinium
+urediospore
+uredium
+uredostage
+ureide
+uremic
+ureotelic
+ureotelism
+ureter
+ureteral
+ureteric
+urethan
+urethral
+urethritis
+urethroscope
+uric
+uricosuric
+uricotelic
+uricotelism
+uridine
+urinalysis
+urinogenital
+urinometer
+urinometer's
+urinometers
+urinous
+urochord
+urochordal
+urochordate
+urochrome
+urodele
+urogenital
+urokinase
+urol
+urolith
+urolithiasis
+urologic
+urological
+urologist
+urology
+uropod
+uropygial
+uropygium
+urostyle
+ursine
+urticaria
+urticarial
+urticate
+urtication
+urus
+urushiol
+usableness
+usance
+useably
+usernames
+useway
+usherette
+usnea
+usrio
+usufruct
+usufructuary
+ute
+uteca
+utep
+uterus
+uteruses
+utilitarianism
+utiny
+utopism
+utopist
+utopistic
+utricle
+utricular
+utricularia
+utriculus
+utterable
+uttium
+uvarovite
+uvea
+uveal
+uveitis
+uvula
+uvular
+uvularly
+uxorial
+uxoricide
+uxorious
+uxoriously
+uxoriousness
+vacationist
+vacationless
+vaccinal
+vaccinate
+vaccinated
+vaccinates
+vaccinator
+vaccinators
+vacua
+vacuolar
+vagabondage
+vagabondish
+vagabondism
+vagally
+vagarious
+vagariously
+vagile
+vagility
+vagotomy
+vagotonic
+vagotropic
+vagrancy
+vainglory
+valediction
+valerian
+valetudinarian
+valetudinarianism
+valetudinary
+valiance
+valiancy
+valine
+valise
+valises
+valle
+vallecular
+valorous
+valorously
+valuational
+valuationally
+valvular
+vamoose
+vamoosed
+vamooses
+vamoosing
+vampirism
+vampish
+vandalistic
+vanderburgh
+vandyked
+vanguardism
+vanguardist
+vanillic
+vanillin
+vanquishable
+vanquishment
+vanward
+vapid
+vapidity
+vapidly
+vapidness
+vaporous
+vaporously
+vaporousness
+vaquero
+variac
+variational
+variationally
+varices
+varicose
+varicosed
+varicosity
+variegator
+varietal
+varietally
+variform
+variocoupler
+varioloid
+variolous
+variometer
+variometer's
+variometers
+variorum
+varisized
+varix
+varlet
+varletry
+varnishy
+varsity
+varus
+varve
+varved
+vasal
+vascularity
+vasculature
+vasculum
+vaselike
+vasiform
+vasoactive
+vasoactivity
+vasoconstriction
+vasoconstrictive
+vasoconstrictor
+vasodilatation
+vasodilation
+vasodilator
+vasomotor
+vasopressin
+vasopressor
+vasospasm
+vasospastic
+vasotocin
+vassalage
+vastitude
+vastity
+vasty
+vatic
+vaticinal
+vaticinate
+vaticination
+vaticinator
+vatted
+vatting
+vaudevillian
+vaulty
+vauntful
+vauntingly
+vaunty
+vaward
+vealy
+vectograph
+vectographic
+vectorcardiogram
+vectorcardiogram's
+vectorcardiograms
+vectorcardiographic
+vectorcardiography
+vee
+veep
+veeries
+veery
+vegetably
+vegetal
+vegetarianism
+vegetational
+vegetationally
+vegete
+vegetive
+veinal
+veinlet
+veiny
+velamen
+velamentous
+velamina
+velarium
+veld
+velitation
+velleity
+veloce
+velocimeter
+velocimeter's
+velocimeters
+velocipede
+velodrome
+velopment
+velure
+velutinous
+velveteen
+venae
+venality
+venatic
+venation
+venational
+vendable
+vendace
+vendaces
+vendee
+vendibility
+vendibly
+vendition
+vendue
+veneeal
+venenate
+venenation
+venerability
+venerably
+venerator
+venereological
+venereologist
+venereology
+venerology
+venery
+venesection
+venetian
+venge
+venging
+venin
+venipuncture
+venire
+venireman
+venisection
+venography
+ventage
+ventail
+ventilatory
+ventless
+ventricose
+ventricular
+ventriculus
+ventriloquial
+ventriloquially
+ventriloquism
+ventriloquist
+ventriloquist's
+ventriloquistic
+ventriloquists
+ventriloquy
+ventrolateral
+ventrolaterally
+ventromedial
+ventura
+venturous
+venturously
+venturousness
+venule
+veratrine
+veratrum
+verbalism
+verbalist
+verbalistic
+verbena
+verbenas
+verbicide
+verbid
+verbify
+verbigeration
+verbile
+verdancy
+verderor
+verdigris
+verdin
+verdurous
+verdurousness
+vergil
+veridic
+veridicality
+verisimilar
+verisimilarly
+verisimilitudinous
+verism
+verismo
+verist
+veristic
+veritably
+verjuice
+vermeil
+vermian
+vermicelli
+vermicide
+vermicular
+vermiculate
+vermiculated
+vermiculation
+vermiform
+vermifuge
+vermillion
+verminosis
+verminous
+verminously
+vern
+vernacle
+vernacularism
+vernation
+vernicle
+vernissage
+versal
+verseman
+verset
+versicle
+versicular
+versification
+versifier
+versify
+versine
+versional
+verso
+versos
+verticality
+verticil
+verticillte
+vertiginous
+vertiginously
+vesical
+vesicant
+vesicate
+vesication
+vesicularity
+vesiculate
+vesiculation
+vesperal
+vespertinal
+vespertine
+vespiary
+vespid
+vespine
+vesta
+vestee
+vestiary
+vestibular
+vestlike
+vestment
+vestmental
+vestryman
+vesuvian
+vesuvianite
+vetchling
+vetted
+vexillary
+vexillologic
+vexillological
+vexillologist
+vexillology
+vexillum
+viand
+viands
+viaticum
+vibist
+vibraharp
+vibraharpist
+vibrance
+vibraphone
+vibraphonist
+vibratile
+vibratility
+vibrational
+vibrationless
+vibrator
+vibratory
+vibrion
+vibriosis
+vibrissa
+vibrissae
+viburnum
+vic
+vicarage
+vicarate
+vicarial
+vicariate
+vicarship
+vicegerency
+vicegerent
+vicennial
+viceregal
+viceregally
+vicereine
+viceroyalty
+viceroyship
+vichyssoise
+vicinage
+vicinal
+vicissitudinous
+vickers
+victress
+vicuna
+vidal
+vide
+videophone
+vidette
+vidicon
+viduity
+viewfinder
+viewfinder's
+viewfinders
+viewy
+vigesimal
+vigintillion
+vignettist
+vigorish
+vigorist
+vigorist's
+vigorists
+vigoroso
+vilipend
+villadom
+villagery
+villainess
+villanella
+villanelle
+villatic
+villein
+villenage
+villi
+villiform
+villosity
+villus
+vim
+vimen
+vinaceous
+vinaigrette
+vinal
+vinblastine
+vinca
+vincible
+vincristine
+vinculum
+vindicable
+vindicator
+vindicators
+vindicatory
+vineal
+vinedresser
+vinedressers
+vinegarish
+vinegarroon
+vinegary
+vinery
+vineyardist
+vinic
+viniculture
+vinier
+viniferous
+vinification
+vino
+vinosity
+vinous
+vinously
+viny
+vinylic
+vinylidene
+viol
+violability
+violable
+violableness
+violably
+violaceous
+violaceously
+violist
+viomycin
+viosterol
+viperine
+viperish
+viperous
+viperously
+viraginous
+virago
+virelay
+viremia
+viremic
+vireo
+vires
+virescence
+virescent
+virga
+virgate
+virginium
+virgulate
+viricidal
+viricide
+virid
+viridescent
+viridian
+viridity
+virilism
+virion
+virologic
+virological
+virologically
+virologist
+virology
+viroses
+virosis
+virtuality
+virtueless
+virtuosa
+virtuosic
+virucidal
+virucide
+virulency
+viruliferous
+virustatic
+viscacha
+viscerogenic
+visceromotor
+viscidity
+viscometric
+viscometry
+viscose
+viscosimeter
+viscosimeter's
+viscosimeters
+viscosimetric
+viscountcy
+viscountess
+viscounty
+viscus
+visional
+visionally
+visionless
+visitable
+visitant
+visitational
+visitatorial
+visorless
+vitalism
+vitalist
+vitalistic
+vitamer
+vitameric
+vitellin
+vitelline
+vitellogenesis
+vitellus
+vitiator
+viticultural
+viticulture
+viticulturist
+vitiligo
+vitiosity
+vitite
+vitrifiable
+vitrine
+vittae
+vittate
+vittles
+vituperate
+vituperation
+vituperator
+vituperatory
+vitus
+vivarium
+viverrid
+vivific
+viviparity
+viviparous
+viviparously
+viviparousness
+vivisect
+vivisection
+vivisectional
+vivisectionally
+vivisectionist
+vivisector
+vixenish
+vixenishly
+vixenishness
+vizard
+vizierate
+vizierial
+viziership
+vizor
+vms
+vocabular
+vocalically
+vocality
+vocationalism
+vocationalist
+vociferant
+vociferate
+vociferation
+vociferator
+voguish
+voguishness
+voicedness
+voiceful
+voicefulness
+voiceprint
+voidable
+voidableness
+voidance
+voile
+volant
+volante
+volcanically
+volcanicity
+volcanoes
+volcanologic
+volcanological
+volcanologist
+volcanology
+vole
+voles
+volitive
+volkslied
+volkslieder
+volplane
+volplaned
+volplaning
+voltameter
+voltameter's
+voltameters
+voltametric
+volubility
+volubly
+volumeter
+volumeter's
+volumeters
+voluminosity
+voluntarism
+voluntarist
+voluntaristic
+voluntaryism
+voluntaryist
+volunteerism
+voluptuary
+volute
+voluted
+volutin
+volution
+volva
+volvement
+volvox
+vomerine
+vomitory
+vomiturition
+vomitus
+von
+voodooism
+voodooist
+voodooistic
+vored
+vortical
+vortically
+vorticella
+vorticism
+vorticist
+vorticose
+vortiginous
+votaress
+votarist
+voteless
+votress
+vouchee
+vouchsafement
+voussoir
+voyageur
+voyageurs
+voyeur
+voyeurism
+voyeuristic
+voyeuristically
+voyeurs
+vroom
+vs
+vulcanian
+vulcanicity
+vulcanologist
+vulcanology
+vulgarian
+vulgarism
+vulgarity
+vulgate
+vulgus
+vulnerably
+vulnerary
+vulterine
+vulturine
+vulturous
+vulva
+vulvae
+vulval
+vulvar
+vulviform
+vulvitis
+wackily
+wadable
+wadder
+waddie
+waddied
+waddies
+wadding
+waddy
+waddying
+wadeable
+wadi
+waftage
+wafture
+wageless
+wageworker
+wagger
+waggery
+waggly
+wagoneer
+wagoneer's
+wagoneers
+wagonette
+wagonette's
+wagonettes
+wagonload
+wagonload's
+wagonloads
+wah
+wahine
+wahoo
+wahoos
+waif
+wailful
+wailfully
+wain
+wained
+wainscotting
+waistband
+wakeless
+wakerobin
+walkabout
+walkaway
+walkingstick
+walkout
+wallaroo
+wallenstein
+walleye
+walleyed
+wallflower
+wamble
+wambled
+wambling
+wampum
+wanderlust
+waney
+wanier
+wanner
+wannest
+wanning
+wansee
+wansley
+wany
+warbonnet
+wardenship
+wardership
+wardress
+wardship
+warehousemen
+wareroom
+warlock
+warlord
+warlordism
+warlords
+warpage
+warpath
+warplane
+warplane's
+warplanes
+warrantable
+warrantableness
+warrantably
+warrantee
+warrantees
+warrantless
+warrantor
+warrantors
+washability
+washable
+washcloth
+washerman
+washerwoman
+washhouse
+washoe
+washrag
+washroom
+washrooms
+washstand
+washstands
+washtub
+washtubs
+washwoman
+wasplike
+wassail
+wassailer
+wast
+wastage
+wastages
+wastepaper
+watchcase
+watcheye
+watchtower
+watchworks
+waterborne
+watercraft
+watercress
+waterflood
+waterfowl
+waterfowl's
+waterfowler
+waterhole
+waterhole's
+waterholes
+waterily
+waterish
+waterishness
+waterless
+waterlessly
+waterlessness
+waterlog
+waterlogged
+watermanship
+watermark
+waterpower
+waterscape
+waterweed
+waterwheel
+waterworks
+waterworn
+wattmeter
+wattmeter's
+wattmeters
+waught
+waukesha
+waunona
+waupaca
+waupun
+wausau
+wauwatosa
+waveland
+waveless
+wavelessly
+wavelet
+wavelets
+wavelike
+wavery
+wavily
+waxlike
+waxwing
+waxwing's
+waxwings
+waybill
+wayfarer
+wayfaring
+waygoing
+waylay
+wayless
+wayworn
+weakhearted
+weakish
+weakling
+weal
+wealthily
+weanling
+wearability
+weariful
+wearifully
+wearifulness
+weariless
+wearilessly
+weatherability
+weatherboard
+weatherboarding
+weatherglass
+weatherman
+weatherstripping
+weatherworn
+weathery
+webbed
+webber
+webby
+webfoot
+weblike
+wedder
+wedgy
+weedless
+weeknight
+weeknights
+weepy
+weet
+weever
+weevil
+weevilly
+weevily
+weft
+wefts
+weider
+weidman
+weighable
+weightily
+weightless
+weightlessly
+weimaraner
+weiner
+weir
+weirdie
+weirdies
+weldable
+weldment
+weldor
+weldwood
+welfarism
+welfarist
+welkin
+wellaway
+wellborn
+wellhead
+wellington
+wellman
+wellwisher
+wellwisher's
+wellwishers
+welmers
+weltschmerz
+wen
+wend
+wert
+weskit
+westernmost
+wetback
+wettable
+wettish
+wff
+whacky
+whaleback
+whaleboat
+whalebone
+whalebone's
+whalebones
+whang
+whangee
+whap
+wharfage
+wharfinger
+wharfmaster
+whats
+wheal
+wheatear
+wheatland
+wheaton
+wheelbarrow
+wheelbarrow's
+wheelhorse
+wheelless
+wheelman
+wheelock
+wheelsman
+wheelwork
+wheelwright
+wheen
+wheezily
+whelm
+whenas
+whencesoever
+whensoever
+whereat
+wherefrom
+whereinto
+whereness
+wheres
+wheresomever
+wherethrough
+whereto
+whereunto
+wherewithal
+wherries
+wherry
+whetstone
+whetter
+whichsoever
+whicker
+whickered
+whickering
+whidding
+whiffletree
+whigmaleerie
+whilom
+whilst
+whimsicality
+whiney
+whinstone
+whipcord
+whiplike
+whippersnapper
+whippier
+whippletree
+whippoorwill
+whippy
+whipstitch
+whipstock
+whirlybird
+whirried
+whirry
+whirrying
+whish
+whisht
+whiskery
+whispery
+whist
+whitebait
+whitebeard
+whitecap
+whitefish
+whiteleaf
+whiteley
+whiteout
+whitesmith
+whitethroat
+whitewall
+whitewater
+whitewing
+whithersoever
+whitherward
+whitish
+whity
+whizbang
+whizz
+whizzbang
+whizzer
+whomp
+whoopee
+whoopla
+whopper
+whoredom
+whorehouse
+whoremaster
+whoremonger
+whoreson
+whorish
+whort
+whortle
+whosesoever
+whoso
+whump
+whup
+whys
+wickerwork
+wickiup
+widemouthed
+widgeon
+widgeons
+widish
+widowerhood
+widthways
+wieland
+wieldy
+wienerwurst
+wienie
+wifehood
+wifeless
+wifelike
+wigan
+wigeon
+wigeons
+wigged
+wight
+wiglet
+wigwag
+wilco
+wildcatted
+wildcatting
+wildebeest
+wildebeest's
+wilderment
+wildflower
+wildflower's
+wildflowers
+wildfowl
+wildfowler
+wildfowling
+wildish
+wildling
+wildwood
+willable
+willemite
+willet
+willies
+williwaw
+willowlike
+willowware
+willpower
+willy
+willying
+wilmette
+wimble
+wimbled
+wimbles
+wimbling
+wimple
+wimpled
+wimpling
+winchell
+windage
+windblown
+windburn
+windburned
+windflaw
+windily
+windjammer
+windlass
+windlassed
+windlasses
+windlassing
+windlassly
+windpipe
+windproof
+windscreen
+windsurf
+windsurfed
+windsurfing
+windsurfs
+windswept
+windway
+wineglass
+winegrower
+winehead
+winepress
+wineshop
+winey
+wingbeat
+wingbeat's
+wingbeats
+wingding
+wingless
+winglessness
+winglet
+winglike
+wingover
+wingspread
+wingspread's
+wingspreads
+wingy
+winism
+winnable
+winnebago
+winned
+winooski
+winsett
+wintergreen
+winterkill
+wintertide
+wintery
+wintle
+wintrily
+winze
+wirable
+wiredraw
+wiredrawer
+wiredrawn
+wirehair
+wirehaired
+wirelike
+wiretapper
+wireway
+wirework
+wireworks
+wireworm
+wirily
+wisent
+wisewoman
+wisha
+wispish
+wistaria
+wisteria
+witchery
+witchlike
+witchy
+withdrawable
+withe
+witherite
+witherspoon
+withies
+withindoors
+withoutdoors
+withy
+witless
+witling
+witted
+witticism
+wittily
+wiz
+wizardry
+wolfhound
+wolflike
+wolverine
+wolverine's
+wolverines
+wolverton
+womanish
+womanishly
+womanishness
+womankind
+womanless
+womanlike
+womanpower
+wombat
+wombat's
+wombats
+womenfolk
+womenfolks
+womenkind
+wonderwork
+wonky
+wonning
+wonton
+woodberry
+woodcraft
+woodcutter
+woodcutting
+woodenhead
+woodenheaded
+woodenware
+woodlore
+woodnote
+woodpile
+woodsman
+woodsy
+woolie
+woolpack
+woolsack
+woolshed
+woolskin
+woops
+woozier
+woozily
+wooziness
+woozy
+wordage
+wordages
+wordbook
+wordless
+wordlessness
+wordmonger
+wordplay
+workability
+workbasket
+workboat
+workbox
+workfolk
+workfolks
+workforce
+workforce's
+workforces
+workhouse
+workless
+worklessness
+workpeople
+workroom
+workrooms
+workweek
+workwoman
+worldling
+wormhole
+wormlike
+worriment
+worrywart
+worshipless
+wort
+worthful
+worthily
+wotted
+wouldst
+woundless
+woundwort
+wowser
+wrack
+wracked
+wracks
+wraiths
+wrapup
+wrasse
+wrathy
+wreathy
+wriggly
+wristlet
+wristlock
+wristy
+writeup
+writeup's
+writeups
+writhen
+wrongheaded
+wrongheadedly
+wrongheadedness
+wunderkind
+wysiwyg
+xanthate
+xanthene
+xanthic
+xanthin
+xanthine
+xenia
+xenomania
+xenophile
+xenophilous
+xenophobe
+xenophobic
+xerarch
+xeric
+xerically
+xerographic
+xerographically
+xerophile
+xerophilous
+xerophily
+xylophonist
+xylose
+xylotomic
+xylotomical
+xylotomous
+xylotomy
+yack
+yacking
+yah
+yak
+yakking
+yalies
+yam
+yamen
+yardarm
+yardbird
+yardman
+yardmaster
+yare
+yarely
+yarmelke
+ycleped
+yclept
+ye
+yearling
+yearlong
+yeastily
+yellerish
+yep
+yester
+yeuk
+yew
+yoghurt
+yoghurt's
+yogic
+yogin
+yoknapatawpha
+yolky
+yond
+youngling
+yuba
+yuletide
+yuri
+zabaglione
+zagged
+zanier
+zanies
+zanily
+zaniness
+zany
+zazen
+zealotry
+zeffirelli
+zenithal
+zeolite
+zeolitic
+zephyr
+zeppelin
+ziggy
+zillion
+zincate
+zincic
+zinfandel
+zingier
+zingy
+zinnia
+zippier
+zippy
+zirconia
+zirconic
+zither
+zitherist
+zithers
+zizith
+zoantharian
+zoarial
+zoarium
+zobrist
+zombi
+zombiism
+zonate
+zonated
+zonation
+zonked
+zoogenic
+zoogenous
+zoogeographer
+zoogeographic
+zoogeography
+zooks
+zoologic
+zoomorphic
+zoonosis
+zoonotic
+zooparasite
+zooparasitic
+zoophagous
+zoophilic
+zoophilous
+zoophyte
+zoophytic
+zooplankton
+zoosporal
+zoospore
+zoosterol
+zootechnics
+zori
+zucchini
+zwitterion
+zwitterionic
+zwitterions
+zygote
+zygote's
+zygotes
diff --git a/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.3 b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.3
new file mode 100644
index 00000000000..4ecbceb570c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/spellCheck/english.3
@@ -0,0 +1,19708 @@
+AAU
+AKA
+APS
+Aachen
+Aalborg
+Aalesund
+Aargau
+Aaronic
+Abba
+Abbado
+Abbevillian
+Abbeydale
+Abelard
+Abele
+Abelmosk
+Abernethy
+Aberystwyth
+Abravanel
+Abraxas
+Absalom
+Abu
+Abyssinian
+Acarus
+Accrington
+Aceldama
+Achaemenid
+Achates
+Achernar
+Achitophel
+Acis
+Actinia
+Actium
+Adamite
+Adar
+Addams
+Addington
+Adenauer
+Adige
+Adonai
+Adonic
+Adullamite
+Advowson
+Aedes
+Aegeus
+Aegina
+Aegisthus
+Aeolic
+Aeolipile
+Aeolis
+Aepyornis
+Aeschines
+Aesculapian
+Aesculapius
+Aesir
+Aetolia
+Affenpinscher
+Africanism
+Africanist
+Afrikander
+Afrikanerdom
+Agama
+Agapanthus
+Ageratum
+Agincourt
+Aglaia
+Agostini
+Agra
+Agrapha
+Agrippa
+Aguascalientes
+Ahasuerus
+Ahmednagar
+Ahriman
+Ahvenanmaa
+Ahwaz
+Aidan
+Aidin
+Aileen
+Akan
+Akhmatova
+Akkad
+Akkadian
+Akmolinsk
+Aktyubinsk
+Alamein
+Alaric
+Albi
+Albigenses
+Albinoni
+Albion
+Alboin
+Albury
+Alcman
+Alcock
+Alcoran
+Alcyone
+Aldermaston
+Alderney
+Aldine
+Aldus
+Aleksandropol
+Aleksandrovsk
+Alemanni
+Alemannic
+Aleppo
+Alexandrian
+Alexius
+Algerine
+Algonkian
+Alkoran
+Allahabad
+Allenby
+Allende
+Allhallowtide
+Almeida
+Almohade
+Almoravide
+Alsatia
+Altaic
+Altamira
+Altrincham
+Amaryllis
+Amati
+Amboina
+Ambrosian
+Ameling
+Americanist
+Amerigo
+Amerindian
+Amersfoort
+Ameslan
+Amfortas
+Amish
+Ammonites
+Amoy
+Ampelopsis
+Amphitrite
+Amphitryon
+Amritsar
+Amundsen
+Amytal
+Anabaena
+Anabas
+Anableps
+Anacreontic
+Anam
+Ananias
+Anchises
+Ancona
+Andaman
+Andhra
+Angara
+Angarsk
+Angelus
+Angevin
+Angkor
+Anglesey
+Anglian
+Anglicist
+Anglomania
+Anglophone
+Anguilla
+Anjou
+Annam
+Annamese
+Annapurna
+Anopheles
+Anouilh
+Ansermet
+Antarctic
+Anthurium
+Antigonus
+Antigua
+Anubis
+Anzac
+Aphis
+Apis
+Apollyon
+Apus
+Arabist
+Arafat
+Araiza
+Aramaic
+Araucanian
+Araucaria
+Arawakan
+Arbela
+Arcadic
+Archaeopteryx
+Archaeornis
+Archean
+Archilochian
+Arctic
+Arctogaea
+Areca
+Areopagus
+Ares
+Arethusa
+Argerich
+Argyrol
+Arian
+Ariel
+Aristides
+Aristippus
+Arius
+Arkhangelsk
+Arkhipova
+Arlberg
+Arminian
+Arrau
+Arroyo
+Arthurian
+Asarum
+Ascanius
+Ascensiontide
+Aschaffenburg
+Ascham
+Asclepiadean
+Asclepius
+Ashanti
+Ashford
+Ashkenazi
+Ashkenazy
+Ashkhabad
+Ashmore
+Ashton
+Ashur
+Asimov
+Aspasia
+Assamese
+Assisi
+Astilbe
+Aten
+Athanasian
+Atherton
+Atlantean
+Atlantov
+Attenborough
+Attila
+Aubergine
+Aubervilliers
+Aubrietia
+Aubusson
+Auger
+Augsburg
+Augustinian
+Aurignacian
+Aussie
+Auster
+Austerlitz
+Australasia
+Australiana
+Australianism
+Australoid
+Australorp
+Austrasia
+Austronesia
+Austronesian
+Autoharp
+Avar
+Averroism
+Avestan
+Axminster
+Aymara
+Ayrshire
+Azerbaijani
+Azilian
+Azotobacter
+Azov
+Azrael
+BBC
+BCPL
+BNF
+Baal
+Baalbek
+Baaskap
+Bab
+Babi
+Babism
+Bacchae
+Bacharach
+Bacquier
+Bactrian
+Baedeker
+Baganda
+Bagdad
+Bahai
+Bahaism
+Bahrain
+Bairam
+Baker
+Bala
+Balaam
+Balakirev
+Balaklava
+Balaton
+Balearic
+Balkis
+Balmacaan
+Balmoral
+Balt
+Balthazar
+Baltsa
+Baluchi
+Baluchistan
+Bambara
+Bamberg
+Banda
+Banff
+Bank
+Bannockburn
+Bantoid
+Bantustan
+Banville
+Barabbas
+Barathea
+Barbarossa
+Barbary
+Barber
+Barbirolli
+Barbuda
+Barcoo
+Bardolatry
+Barenboim
+Bari
+Barmecide
+Barotse
+Barsac
+Bart
+Bartoletti
+Bashkir
+Basilian
+Basingstoke
+Baskerville
+Bassas
+Bastianini
+Basutoland
+Bataan
+Bathonian
+Battenburg
+Battle
+Baudo
+Bauhinia
+Bax
+Bayard
+Beaconsfield
+Beaufort
+Beaune
+Bebington
+Bechuana
+Bechuanaland
+Beckenham
+Beckford
+Beckmann
+Bedfordshire
+Bedlington
+Beghard
+Beguin
+Behrens
+Belgae
+Belgravia
+Belial
+Belisarius
+Belisha
+Belleek
+Bellerophon
+Bellingshausen
+Bellmouth
+Bellona
+Belmondo
+Belorussia
+Belostok
+Belsen
+Beltane
+Bemba
+Benackova
+Benedictus
+Benedikt
+Beni
+Benin
+Benison
+Benne
+Bennet
+Berber
+Berberis
+Berbie
+Berchtesgaden
+Berdichev
+Berdyayev
+Berenson
+Berezina
+Berezniki
+Berg
+Bergama
+Bergamo
+Berganza
+Berger
+Bergonzi
+Bergsonism
+Berkeleian
+Berkeleianism
+Bernese
+Bessarabia
+Bethany
+Bethmann
+Betta
+Beulah
+Beveridge
+Bewick
+Bice
+Biedermeier
+Bielefeld
+Bihari
+Biisk
+Bilharzia
+Billingham
+Billingsgate
+Billiton
+Bim
+Birkenhead
+Bishop
+Blachut
+Blackbeard
+Blagoveshchensk
+Blanzat
+Blavatsky
+Blech
+Blegen
+Bley
+Blindheim
+Blini
+Bliss
+Blomstedt
+Bloomsbury
+Boanerges
+Boatwright
+Boche
+Bodoni
+Bogas
+Bohm
+Boildieu
+Boito
+Bokhara
+Bolshie
+Bolson
+Boltonia
+Bonapartism
+Bonynge
+Bordelaise
+Borghese
+Borodin
+Boronia
+Bosky
+Bosnia
+Bougainville
+Boughton
+Boulez
+Boult
+Bournemouth
+Bouvet
+Bozcaada
+Braata
+Brachiosaurus
+Bragi
+Brahman
+Brahmana
+Brahmani
+Brahmanism
+Brahmin
+Brahui
+Brailler
+Braillers
+Braillewriters
+Brantford
+Breconshire
+Bremerhaven
+Brendel
+Brentano
+Brentwood
+Brescia
+Breslau
+Bresson
+Bretagne
+Bretton
+Breuer
+Breughel
+Briareus
+Bridgeford
+Bridgeman
+Bright
+Brigid
+Britannia
+Briticism
+Britishism
+Brixton
+Brno
+Broadbrim
+Bromberg
+Brown
+Bruch
+Brule
+Brummagem
+Brunei
+Brunelle
+Bruson
+Brutus
+Bryansk
+Brython
+Brythonic
+Bubo
+Bucephalus
+Buchmanism
+Buckingham
+Buckinghamshire
+Buddleia
+Buenaventura
+Bueno
+Bulgar
+Bumbledom
+Buna
+Bundaberg
+Bundoora
+Bundu
+Burberry
+Burgos
+Burgoyne
+Burkina
+Burseraceous
+Bushire
+Bute
+Buttermere
+Butterworth
+Bydgoszcz
+Byelorussian
+Byelostok
+CATV
+CB
+CCNY
+CEQ
+CGS
+CO
+Caballe
+Cabinda
+Caddoan
+Cadmean
+Cadmus
+Caelian
+Caelum
+Caernarvonshire
+Caerphilly
+Caesarean
+Caesarism
+Cahokia
+Caicos
+Calabar
+Caladium
+Calciferous
+Caledonia
+Caledonian
+Caliban
+Calicut
+Callas
+Calliopsis
+Calvados
+Calvinism
+Calydonian
+Cambridgeshire
+Camelopardus
+Camenae
+Cana
+Canaanite
+Canaanitic
+Canadianism
+Candace
+Candiot
+Candlemas
+Canicula
+Canopic
+Canossa
+Cantabrian
+Canuck
+Capablanca
+Cape
+Capernaum
+Capetian
+Capone
+Cappuccilli
+Capri
+Capricornus
+Capsian
+Caravaggio
+Carbonari
+Cardiganshire
+Caribbee
+Carlist
+Carlovingian
+Carman
+Carmarthenshire
+Carmel
+Carmelite
+Carpathian
+Carreras
+Carrick
+Carteri
+Carthaginian
+Carthusian
+Cartier
+Caslon
+Caspar
+Casparian
+Caspian
+Cassegrainian
+Cassia
+Castalia
+Castilian
+Castilla
+Castleford
+Castlereagh
+Casuarina
+Catalan
+Cathay
+Cattleya
+Caucasoid
+Cavell
+Cavesson
+Cavetto
+Cavour
+Cawdrey
+Cawley
+Cawnpore
+Caxton
+Cayes
+Cayman
+Cayuse
+Ceanothus
+Cecrops
+Ceiba
+Celadon
+Celaeno
+Celeste
+Celtiberian
+Centaurus
+Central
+Cepheid
+Ceratodus
+Cercis
+Cerenkov
+Ceres
+Cete
+Chaco
+Chadderton
+Chailly
+Chalcis
+Chaldean
+Chaldee
+Cham
+Chamaeleon
+Chambertin
+Charlottenburg
+Charlottetown
+Charlton
+Charmeuse
+Charpentier
+Chartism
+Chasidim
+Chatterton
+Chaucerian
+Chechen
+Cheek
+Chellean
+Chelmsford
+Cheltenham
+Chelyabinsk
+Chelyuskin
+Chengchow
+Chengteh
+Chengtu
+Cheongsam
+Cheops
+Cherbourg
+Cheremiss
+Cheremkhovo
+Cherenkov
+Chernovtsy
+Chernozem
+Chertsey
+Cherubini
+Chessel
+Chesterfieldian
+Chetnik
+Cheval
+Chian
+Chibchan
+Chickasaw
+Chihuahua
+Childermas
+Chilean
+Chiltern
+Chilton
+China
+Chinee
+Chinookan
+Chionodoxa
+Chiron
+Chita
+Chkalov
+Chlorella
+Chloromycetin
+Chocho
+Choco
+Chrissie
+Christadelphian
+Christchurch
+Christhood
+Christmastide
+Christoff
+Christology
+Christophe
+Chukchi
+Chung
+Churrigueresque
+Chuvash
+Ciccolini
+Cicely
+Cid
+Cilician
+Cimbri
+Cimmerian
+Cinchona
+Cincinnatus
+Cinemascope
+Cineraria
+Cipango
+Circassian
+Circinus
+Cisalpine
+Cistercian
+Cistus
+City
+Clacton
+Clapham
+Clapton
+Clarabella
+Clarenceux
+Clarkia
+Claudel
+Claudius
+Clausewitz
+Claytonia
+Clematis
+Clementine
+Clemmons
+Cleome
+Cleopatra
+Cleve
+Clevenger
+Cliburn
+Clintonia
+Clipperton
+Clostridium
+Cluj
+Cluytens
+Clydesdale
+Coast
+Coatbridge
+Cobbett
+Cobham
+Cochin
+Cockaigne
+Cocos
+Cointreau
+Colchicum
+Colchis
+Colima
+Colleen
+Collier
+Collinsia
+Colloq
+Colobus
+Cologne
+Colossian
+Coltrane
+Columba
+Colwyn
+Comanchean
+Comintern
+Command
+Comoros
+Compositae
+Comptometer
+Comus
+Conferva
+Congreve
+Coniston
+Conium
+Convolvulus
+Cook
+Copland
+Coprosma
+Copt
+Coptic
+Coquille
+Coral
+Corantijn
+Cordelier
+Cordovan
+Coreopsis
+Corriedale
+Cortes
+Corvallis
+Corybant
+Corydalis
+Corydon
+Costa
+Costermansville
+Cotinga
+Cotrubas
+Couperin
+Courland
+Cousteau
+Cowell
+Cowichan
+Craal
+Cranfield
+Cressida
+Creston
+Cretic
+Crichton
+Crinum
+Croat
+Crockford
+Crompton
+Cronin
+Crookes
+Crookesmoor
+Crossley
+Crownland
+Cryptomeria
+Cuberli
+Culex
+Cumbrian
+Cundick
+Curculio
+Curcuma
+Curtana
+Curvet
+Cuscus
+Cushitic
+Cuthbert
+Cymric
+Cypripedium
+Cyrano
+Cyrenaic
+Cytherea
+Czechoslovak
+Czernowitz
+Czerny
+DMF
+DPP
+DWT
+Dagenham
+Dagestan
+Dago
+Daltonism
+Damara
+Damaraland
+Damascene
+Damien
+Damson
+Danaides
+Danegeld
+Danelaw
+Danio
+Danton
+Daphnis
+Dapsang
+Darby
+Dard
+Dardan
+Dardic
+Darien
+Darjeeling
+Darry
+Dartford
+Dartmoor
+Davidovich
+Deauville
+Deb
+Decembrist
+Deepfreeze
+Delian
+Delibes
+Delius
+Deller
+Delorme
+Delos
+Delsarte
+Demogorgon
+Demosthenes
+Denbighshire
+Dene
+Denis
+Dentalium
+Depraz
+Dernesch
+Derris
+Deuteronomist
+Deuteronomistic
+Deuteronomy
+Deutschland
+Deutzia
+Devereux
+Devonian
+Diablo
+Diamond
+Dictaphone
+Dictograph
+Didache
+Dieskau
+Dimitrovo
+Dinaric
+Dinesen
+Dingaan
+Dinka
+Dinnington
+Dinoceras
+Dione
+Dionysia
+Dionysiac
+Dioscuri
+Diplodocus
+Dirham
+Ditzel
+Djibouti
+Dneprodzerzhinsk
+Dnepropetrovsk
+Dniester
+Docetism
+Dodgson
+Dodona
+Doese
+Dohnanyi
+Dol
+Dolichosaurus
+Dominica
+Domitian
+Donar
+Donath
+Donatist
+Doncaster
+Donegal
+Donetsk
+Dongola
+Donizetti
+Dopper
+Dor
+Dorati
+Dorian
+Dorking
+Dormoy
+Doronicum
+Dowland
+Dowson
+Dracaena
+Draconic
+Drakensberg
+Drayton
+Dressen
+Dronfield
+Druse
+Duala
+Dubonnet
+Duisburg
+Dukas
+Dulcinea
+Dumbarton
+Dunbarton
+Dunker
+Dupre
+Duralumin
+Durban
+Durkheim
+Duroc
+Durufle
+Dutoit
+Duyker
+Dvandva
+Dvina
+Dvinsk
+Dvorsky
+Dyak
+Dyonisian
+Dzaudzhikau
+Dzerzhinsk
+Dzhambul
+Dziggetai
+Dzongka
+Dzungaria
+ECAD
+Eaglestone
+Eaglewood
+Eastbourne
+Eastertide
+Eastleigh
+Ebert
+Ecclesiastes
+Ecclesiasticus
+Echeveria
+Edda
+Eddington
+Edo
+Edomite
+Edwardine
+Efik
+Egbert
+Egeria
+Egham
+Egmont
+Ehrenburg
+Eichendorff
+Eiffel
+Eijkman
+Eikon
+Eilat
+Eindhoven
+Einkorn
+Eisenach
+Eisenstadt
+Eisenstein
+Eisteddfod
+Ekaterinburg
+Ekaterinodar
+Ekaterinoslav
+Elamite
+Elbert
+Eleatic
+Eleusinian
+Elfland
+Elgar
+Elia
+Elias
+Elisabethville
+Elisavetgrad
+Elisavetpol
+Ellesmere
+Ellice
+Ellington
+Elohim
+Elohist
+Elsass
+Elvira
+Emirates
+Emmenthal
+Emmet
+Emmy
+Empson
+Endamoeba
+Endrich
+Endymion
+Enesco
+Engel
+Englishism
+Englishry
+Entamoeba
+Eozoic
+Ephedra
+Ephemera
+Ephraimite
+Epigoni
+Episcopalism
+Equatorial
+Equisetum
+Erastianism
+Erechtheum
+Erechtheus
+Erenburg
+Erica
+Ericson
+Erin
+Eritrea
+Ermanaric
+Ermler
+Erse
+Erymanthian
+Escallonia
+Escherichia
+Escorial
+Esdras
+Eskilstuna
+Esperanto
+Esquiline
+Essene
+Estonian
+Eth
+Ethelbert
+Ethelred
+Ethiopian
+Eton
+Eucharis
+Euonymus
+Eupatorium
+Euphrosyne
+Euroclydon
+Eurocommunism
+Eurocrat
+Eurodollar
+Euromarket
+Eurovision
+Eurus
+Euryale
+Eurystheus
+Eustachian
+Euxine
+Everton
+Evertor
+Evesham
+Evonymus
+Ewing
+Excalibur
+Exmoor
+Exon
+FPS
+Fabianism
+Fabrikoid
+Factice
+Faisal
+Faizabad
+Falange
+Faliscan
+Falkirk
+Falkner
+Falla
+Falstaffian
+Fanti
+Fareham
+Farnborough
+Farnese
+Farnesol
+Farnham
+Faroe
+Faroes
+Farouk
+Farquhar
+Farrago
+Farthingale
+Fartlek
+Faruk
+Fassbaender
+Fassbinder
+Fathometer
+Fatimid
+Fatshan
+Faubourg
+Faure
+Fayal
+Fedoseyev
+Feigin
+Feisal
+Feme
+Fenian
+Fenice
+Fenrir
+Fergus
+Fernandi
+Ferrara
+Fescennine
+Feuchtwanger
+Feuerbach
+Feuilleton
+Fezzan
+Fianna
+Finnic
+Finsen
+Finsteraarhorn
+Firbank
+Flamig
+Flaminian
+Fleetwood
+Flensburg
+Fletcher
+Fletcherism
+Flintshire
+Flugelhorn
+Flysch
+Foism
+Foison
+Fokine
+Fokker
+Foochow
+Fornax
+Forrester
+Forsythia
+Fouquet
+Fourierism
+Fournet
+Fournier
+Francescatti
+Franck
+Franconia
+Franconian
+Francophile
+Francophobe
+Francophone
+Franglais
+Frankenstein
+Frankish
+Frauenfeld
+Fraunhofer
+Frazer
+Frazil
+Freccia
+Freda
+Fredericia
+Frederiksberg
+Fredrikstad
+Freesia
+Freiburg
+Frenchy
+Freni
+Frescobaldi
+Freytag
+Fribourg
+Fricandeau
+Friesian
+Frigg
+Frijol
+Frisch
+Frisco
+Friuli
+Friulian
+Frizette
+Frobisher
+Froment
+Ft
+Fuegian
+Fulham
+Futuna
+Fyzabad
+Gadarene
+Gael
+Gaeltacht
+Gagarin
+Gaia
+Gainsborough
+Galago
+Galenic
+Galenical
+Galenism
+Galibi
+Galician
+Galla
+Gallic
+Gallican
+Gallicanism
+Gallicism
+Galton
+Galwegian
+Gambeson
+Gambetta
+Gambier
+Gamboge
+Ganda
+Gandhiism
+Ganga
+Garamond
+Gargantua
+Garrya
+Garth
+Gascon
+Gaspar
+Gates
+Gatha
+Gaucho
+Gaulish
+Gaullism
+Gaullist
+Gaultheria
+Gaza
+Gedda
+Gehenna
+Geisel
+Geissler
+Gelderland
+Gelsemium
+Gelsenkirchen
+Gemara
+Gencer
+Gendron
+Genevan
+Genf
+Genfersee
+Genghis
+Genoese
+Genova
+Gentoo
+Geordie
+Georgette
+Germanism
+Germanophile
+Germanophobe
+Gethsemane
+Geum
+Gharial
+Gharry
+Ghaut
+Ghazi
+Ghazzah
+Gheber
+Gherao
+Ghiaurov
+Ghiberti
+Ghibli
+Ghillie
+Ghirlandaio
+Ghitalla
+Giacometti
+Gibeonite
+Gielgud
+Gierek
+Giessen
+Gigout
+Gilbertian
+Gileadite
+Gilels
+Gillingham
+Gippsland
+Gippy
+Giraud
+Giraudoux
+Gisborne
+Giscard
+Giulini
+Giulio
+Glagolitic
+Glazunov
+Glengarry
+Glickman
+Glinka
+Globigerina
+Glorioso
+Gloucestershire
+Gloxinia
+Gluck
+Gobbi
+Gobelin
+Godesberg
+Godetia
+Godiva
+Godolphin
+Godspeed
+Godthaab
+Godunov
+Goebbels
+Goidel
+Golconda
+Goldmark
+Golgi
+Golgotha
+Gomberg
+Gond
+Gondi
+Gondwanaland
+Gongorism
+Goop
+Gorcock
+Gorgonzola
+Gorki
+Gorlovka
+Goshen
+Gosplan
+Goth
+Gotha
+Gothenburg
+Gotland
+Goucher
+Gounod
+Goya
+Graafian
+Graben
+Gracchus
+Graeae
+Graffman
+Graian
+Granth
+Grecism
+Green
+Greenham
+Gregorian
+Greisen
+Grenada
+Grenadines
+Gretna
+Grieg
+Grierson
+Griffe
+Griffiths
+Griffon
+Grig
+Grigioni
+Grignard
+Grikwa
+Grindelia
+Griqua
+Griqualand
+Grison
+Grolier
+Grundheber
+Grus
+Guadeloupe
+Guarani
+Guernica
+Guernsey
+Guerrero
+Guevara
+Guido
+Guildford
+Guillaume
+Guillou
+Guinea
+Guinness
+Gurmukhi
+Gurzenich
+Gypsophila
+Habsburg
+Haddington
+Hadith
+Haematoxylon
+Hagegard
+Hagiographa
+Haida
+Hainan
+Haitink
+Hakea
+Hallamshire
+Halle
+Hallowmas
+Hallstatt
+Halpern
+Hamite
+Hamitic
+Handley
+Hansard
+Hanseatic
+Hanuman
+Hanyang
+Hardenberg
+Hardy
+Hargreaves
+Haringey
+Harl
+Harlow
+Harmsworth
+Harper
+Harrild
+Harrovian
+Hathor
+Hauptmann
+Haversian
+Hawick
+Heard
+Heaviside
+Hebraism
+Hebraist
+Hebron
+Heifetz
+Helgoland
+Helianthus
+Heligoland
+Heliogabalus
+Helios
+Helladic
+Hellas
+Helldiver
+Helleborine
+Hellenism
+Hellenist
+Hellenistic
+Helvetia
+Helvetian
+Helvetic
+Helvetii
+Hemmings
+Henie
+Henryson
+Henslowe
+Henze
+Hephaestus
+Heptateuch
+Heraclid
+Herat
+Hercynian
+Herefordshire
+Herero
+Hermaphroditus
+Hertford
+Hertfordshire
+Hertzian
+Herzegovina
+Herzl
+Herzog
+Hesione
+Hesperia
+Hesperian
+Hesperides
+Hesychast
+Het
+Heteroousian
+Hexateuch
+Heynis
+Heysham
+Hezekiah
+Hialeah
+Hibernicism
+Hickox
+Hideyoshi
+Hieland
+Hilary
+Hildesheim
+Himyarite
+Himyaritic
+Hinayana
+Hindemith
+Hindenburg
+Hippeastrum
+Hippocrene
+Hippolytus
+Hippomenes
+Hirudin
+Hispania
+Hispanicism
+Hispaniola
+Hittite
+Hobbism
+Hochheimer
+Hocktide
+Hodgson
+Hoene
+Hofmann
+Hohenzollern
+Hollandia
+Holliday
+Holliger
+Hom
+Homoiousian
+Hong
+Honiton
+Horatian
+Horatius
+Horenstein
+Horne
+Hortense
+Hosta
+Houdan
+Houstonia
+Howland
+Hoya
+Huddersfield
+Huddleston
+Hudibrastic
+Huguenot
+Humperdinck
+Hunnish
+Huntingdonshire
+Hussite
+Huybrechts
+Hyacinthus
+Hydrastis
+Hydroski
+Hydrus
+Hygeia
+Hynninen
+Hyoscyamus
+Hypnos
+Hyson
+ISSN
+Iapetus
+Ibo
+Ibrahim
+Icaria
+Icarian
+Iceni
+Ichthyornis
+Ido
+Idomeneus
+Ignatius
+Igorot
+Iguanodon
+Ijssel
+Ijsselmeer
+Ilford
+Ilkeston
+Illyrian
+Imai
+Immanuel
+Immelmann
+Immingham
+Impatiens
+Inbal
+Ind
+Indiaman
+Indic
+Indologist
+Indris
+Ingush
+Inkerman
+Innuit
+Inselberg
+Intelsat
+Interisland
+Invar
+Ionesco
+Ionia
+Ionian
+Ipomoea
+Ireton
+Irishism
+Irkutsk
+Irons
+Iroquoian
+Isbn
+Iscariot
+Ishmael
+Ishmaelite
+Ishtar
+Isidore
+Iskander
+Iskenderun
+Islington
+Ismaili
+Isocheim
+Italia
+Ivanovo
+Ivanovsky
+Ives
+Ivory
+Ixia
+Ixion
+Ixtaccihuatl
+Izhevsk
+Iztaccihuatl
+JCL
+Jabalpur
+Jabir
+Jabiru
+Jaborandi
+Jacaranda
+Jacobin
+Jacquard
+Jadotville
+Jaga
+Jahvist
+Jain
+Jainism
+Jamesian
+Janacek
+Janiculum
+Janigro
+Janowitz
+Jansenism
+Jap
+Japheth
+Japhetic
+Jarvi
+Jarvis
+Jat
+Jehovist
+Jemmy
+Jena
+Jenghis
+Jenner
+Jephthah
+Jeremiad
+Jersey
+Jervis
+Jespersen
+Jesselton
+Jesu
+Jethro
+Jetton
+Jewess
+Jewry
+Jezebel
+Jezreel
+Joab
+Jocasta
+Jochum
+Jodo
+Johnsonian
+Joinville
+Jolson
+Jonah
+Jonson
+Jotunheim
+Juantorena
+Jubbulpore
+Judaea
+Judah
+Judaic
+Juilliard
+Juliana
+Jumada
+Juneberry
+Junius
+Junoesque
+Jylland
+KWIC
+KWOC
+Kaaba
+Kabaka
+Kabyle
+Kaffir
+Kaffraria
+Kafir
+Kaiserslautern
+Kalahari
+Kalevala
+Kalmuck
+Kamu
+Kanaka
+Kanarese
+Kanawa
+Kandinsky
+Kanji
+Kapfenberg
+Karaite
+Karajan
+Karakul
+Karczykowski
+Karelian
+Karloff
+Karlovy
+Karlsbad
+Karlsruhe
+Karnak
+Karpov
+Karri
+Karst
+Kasha
+Kashmiri
+Kaspszyk
+Katrine
+Keeling
+Keewatin
+Keighley
+Keijo
+Kelson
+Kempff
+Kennelly
+Kennington
+Kentish
+Kerenski
+Kermanshah
+Kertesz
+Keswick
+Keynesianism
+Khabarovsk
+Khachaturian
+Khaddar
+Khakass
+Khakis
+Khalid
+Khalif
+Khalkha
+Khalkidiki
+Khama
+Khamsin
+Khanate
+Khanga
+Khania
+Kharif
+Kharkov
+Khat
+Khayal
+Khedive
+Khelat
+Kherson
+Khieu
+Khingan
+Khirbet
+Khiva
+Khoikhoi
+Khoisan
+Khojent
+Khotan
+Khufu
+Khulna
+Khuskhus
+Khyber
+Kiaat
+Kiang
+Kiangsi
+Kiangsu
+Kiaochow
+Kibitka
+Kiblah
+Kidderminster
+Kielce
+Kier
+Kierkegaard
+Kieselguhr
+Kif
+Kikoi
+Kikumon
+Kilauea
+Kildare
+Kilderkin
+Kilkenny
+Killarney
+Killick
+Killiecrankie
+Killifish
+Killikinick
+Kilmarnock
+King
+Kingdom
+Kingman
+Kinnock
+Kinross
+Kinshasa
+Kirchhoff
+Kirghiz
+Kiribati
+Kirigami
+Kirin
+Kirkby
+Kirkcaldy
+Kirkcudbright
+Kirkman
+Kirkuk
+Kirkwall
+Kirman
+Kirmess
+Kirovabad
+Kirovograd
+Kirshbaum
+Kiruna
+Kirundi
+Kisangani
+Kish
+Kishinev
+Kishke
+Kismayu
+Kissel
+Kissin
+Kissinger
+Kist
+Kistna
+Kisumu
+Kitts
+Kizil
+Klagenfurt
+Klangfarbe
+Klansman
+Klausenburg
+Klee
+Kleiber
+Kleist
+Klemperer
+Klimt
+Klipspringer
+Klondike
+Kneller
+Knesset
+Knighthead
+Kniplova
+Knobkerrie
+Knussen
+Koblenz
+Kodaly
+Koestler
+Koheleth
+Kohima
+Kohl
+Kohn
+Kohoutek
+Kokand
+Kokanee
+Kokobeh
+Kokoschka
+Kolhapur
+Kolinsky
+Kollo
+Kollwitz
+Kolmar
+Kolmogorov
+Kolo
+Kolomna
+Kolyma
+Komati
+Komatik
+Komi
+Kommunarsk
+Kommunizma
+Komodo
+Komsomol
+Komsomolsk
+Konakry
+Kondo
+Kondrashin
+Konstanz
+Kootenay
+Kopeisk
+Kopje
+Koppa
+Korbut
+Korchnoi
+Kordofan
+Kordofanian
+Korma
+Korngold
+Korsakov
+Kortrijk
+Koruna
+Korzybski
+Kos
+Kosciusko
+Kossuth
+Kostroma
+Kosygin
+Kota
+Kotabaru
+Koulibiaca
+Koumis
+Kovno
+Kovrov
+Koweit
+Kowhai
+Kozhikode
+Kra
+Kraal
+Kragujevac
+Krait
+Krakau
+Kramatorsk
+Krameria
+Kranj
+Krans
+Krasnodar
+Krasnoyarsk
+Krefeld
+Kreisky
+Kreisler
+Kremenchug
+Kremer
+Krems
+Kreplach
+Kreutzer
+Kriegspiel
+Kriemhild
+Krimmer
+Krio
+Krips
+Kriss
+Kristiansand
+Kristianstad
+Krivoy
+Kromesky
+Krone
+Kronig
+Kronos
+Kroon
+Kropotkin
+Krugersdorp
+Kruller
+Krummhorn
+Krupp
+Kruysen
+Krym
+Kshatriya
+Kuala
+Kuban
+Kubelik
+Kublai
+Kubrick
+Kuch
+Kuchen
+Kuching
+Kueh
+Kuenlun
+Kufic
+Kuibyshev
+Kukri
+Kuku
+Kula
+Kulturkampf
+Kulun
+Kum
+Kumamoto
+Kumasi
+Kumbaloi
+Kung
+Kungur
+Kunming
+Kunzite
+Kuomintang
+Kuopio
+Kura
+Kurgan
+Kuril
+Kurland
+Kurosawa
+Kuroshio
+Kurrajong
+Kursaal
+Kursk
+Kurzeme
+Kuskokwim
+Kutaisi
+Kutch
+Kutuzov
+Kuznetsk
+Kwa
+Kwacha
+Kwajalein
+Kwakiutl
+Kwangchow
+Kwangchowan
+Kwangju
+Kwangtung
+Kwantung
+Kwanza
+Kwara
+Kwazulu
+Kweichow
+Kweilin
+Kweisui
+Kweiyang
+Kwela
+Kynewulf
+Kyongsong
+Kyprianou
+Kyrie
+Kyushu
+LPG
+La
+Laager
+Laaland
+Laburnum
+Lacedaemonian
+Lactobacillus
+Ladin
+Ladino
+Lagting
+Lahnda
+Lahti
+Laibach
+Lakeland
+Lakes
+Laksa
+Lakshadweep
+Lalo
+Lamaism
+Lamarckian
+Lamarckism
+Lamington
+Lammas
+Lammastide
+Lancastrian
+Landau
+Langland
+Langobard
+Langobardic
+Langridge
+Langton
+Langtry
+Lantana
+Lapith
+Laplacian
+Lapland
+Lapp
+Lar
+Laski
+Lassen
+Latakia
+Latimeria
+Latina
+Latinism
+Latinist
+Latino
+Latona
+Latour
+Latvian
+Laudian
+Laughton
+Launce
+Launceston
+Lawless
+Lawrentian
+Lazar
+Leacock
+Leaf
+Leah
+Leamington
+Leatherette
+Leda
+Lefkowitz
+Leibnitz
+Leicester
+Leicestershire
+Leichhardt
+Leiden
+Leif
+Leinsdorf
+Leinster
+Leishmania
+Leitner
+Lemberg
+Lemmens
+Leninabad
+Leninakan
+Leno
+Lenya
+Leoncavallo
+Leonidas
+Leopardi
+Lepanto
+Lepidosiren
+Leptocephalus
+Lepton
+Lepus
+Lermontov
+Lerwick
+Lethbridge
+Leto
+Lett
+Lettish
+Leucippus
+Levant
+Levantine
+Leverhulme
+Leverkusen
+Levite
+Levitical
+Levko
+Lewisham
+Leyte
+Lhasa
+Liadov
+Liao
+Liaoning
+Liaotung
+Liaoyang
+Lias
+Lichfield
+Liebfraumilch
+Lilith
+Limbourg
+Limburg
+Limburger
+Limpopo
+Lincolnshire
+Linnaean
+Linsang
+Lipetsk
+Lippizaner
+Liriodendron
+Listerism
+Liszt
+Liv
+Ljubljana
+Llandaff
+Llandudno
+Llanelli
+Llangollen
+Llewellyn
+Lleyn
+Lobachevsky
+Locarno
+Loewe
+Lolland
+Lollard
+Lombrosian
+Longbenton
+Longford
+Longobard
+Lonicera
+Lorengar
+Loretta
+Lota
+Loughborough
+Louisburg
+Luba
+Lucan
+Lucania
+Lucina
+Lucknow
+Luddite
+Ludendorff
+Ludwigsburg
+Ludwigshafen
+Luffa
+Luganda
+Lugansk
+Luluabourg
+Luo
+Lupercalia
+Lur
+Lusatian
+Lusitania
+Lutetia
+Luton
+Lutoslawski
+Lutyens
+Luxemburg
+Luxon
+Lvov
+Lycian
+Lydian
+Lyme
+Lymington
+Lyonnais
+Lyonnesse
+Lysander
+Lysenkoism
+Lysimachus
+Lytham
+Lythraceous
+Lyublin
+MFD
+MIRV
+MKS
+MKSA
+MSC
+MVS
+MVT
+Ma
+Maag
+Maar
+Maarianhamina
+Maas
+Maastricht
+Maazel
+Mab
+MacKerras
+Macao
+Macaskill
+Macau
+Maccabean
+Maccabees
+Macclesfield
+Macdonnell
+Mackay
+Mackerras
+Maclean
+Macleod
+Macmahon
+Macneice
+Macpherson
+Macready
+Maddalena
+Maecenas
+Magdalen
+Magdalenian
+Magdeburg
+Magellan
+Maghreb
+Maglemosian
+Magnificat
+Magyar
+Mahdi
+Mahican
+Mahomet
+Mahonia
+Mahound
+Maia
+Maintenon
+Maitland
+Majlis
+Malacca
+Malaya
+Malinowski
+Malison
+Malpighian
+Mam
+Mameluke
+Manchu
+Mancunian
+Mandaean
+Mandalay
+Mande
+Mandeville
+Mandingo
+Manichaeism
+Mannerheim
+Mannheim
+Mantler
+Manuguerra
+Manx
+Manxman
+Marabout
+Maracaibo
+Maratha
+Marathi
+Marburg
+Marchland
+Marciano
+Marcionism
+Marconi
+Marengo
+Marenzio
+Margaux
+Margay
+Marge
+Mariana
+Mariehamn
+Marienbad
+Marinduque
+Marinetti
+Mariolatry
+Mariology
+Marist
+Mariupol
+Marius
+Marivaux
+Markevitch
+Markhor
+Markka
+Markova
+Marley
+Marlow
+Maronite
+Marquesan
+Marrakech
+Marrakesh
+Marriner
+Marsala
+Marseillaise
+Marseille
+Marshalsea
+Marston
+Martin
+Martinmas
+Martinon
+Marton
+Masai
+Mascagni
+Masefield
+Massawa
+Massenet
+Matabele
+Matabeleland
+Mathis
+Matorin
+Mattila
+Mauceri
+Maud
+Maugham
+Mauricio
+Maurist
+Mauser
+Mavourneen
+Mawson
+Maxim
+Mayakovski
+Mayan
+Mayen
+Mayotte
+Mazdaism
+Mbujimayi
+McNair
+Mccarthyism
+Mccartney
+Mccormack
+Mccullers
+Mcdiarmid
+Mcgonagall
+Mcluhan
+Mclure
+Mcmunn
+Mcmurdo
+Mcnaughten
+Mcqueen
+Meade
+Meccano
+Mechem
+Mechlin
+Mecklenburg
+Mede
+Medina
+Megaera
+Mehta
+Meissen
+Melaleuca
+Melanochroi
+Melchite
+Melchizedek
+Meleager
+Melitopol
+Melton
+Melungeon
+Memnon
+Memphian
+Mendeleyev
+Mendelism
+Menelik
+Mengelberg
+Menshevik
+Menton
+Mercian
+Mercouri
+Mercurian
+Mercurochrome
+Merionethshire
+Merovingian
+Merseburg
+Mersey
+Merseyside
+Merton
+Mesembryanthemum
+Mesple
+Messapian
+Metol
+Metternich
+Mexicali
+Meyerbeer
+Meyerhof
+Micah
+Michaelmas
+Micmac
+Microscopium
+Middelburg
+Middlesbrough
+Middlewood
+Midway
+Milashkina
+Milford
+Milhaud
+Milnes
+Milstein
+Mina
+Mindel
+Ming
+Mingrelian
+Minkowski
+Minorca
+Minorite
+Minton
+Minya
+Miquelon
+Miserere
+Mishima
+Mishnah
+Mithraism
+Mithras
+Mitropolous
+Mitropoulos
+Mittelland
+Mitterrand
+Mixtec
+Mizoguchi
+Mlle
+Mme
+Mnemosyne
+Modiolus
+Modred
+Mogilev
+Mohave
+Mohican
+Mohock
+Mojave
+Moldau
+Moldavian
+Moldavite
+Molech
+Moll
+Mollet
+Molokai
+Mommsen
+Momus
+Moncton
+Mondale
+Mondial
+Monegasque
+Mongo
+Mongol
+Mongolic
+Monmouthshire
+Monophysite
+Monteux
+Montezuma
+Montgomeryshire
+Montserrat
+Moorcock
+Moorland
+Moradabad
+Mordvin
+Mordvinian
+Moreton
+Morisco
+Moro
+Morocco
+Morpheus
+Moselle
+Mossi
+Mosul
+Mountbatten
+Mountie
+Moussorgsky
+Mousterian
+Mozambique
+Mozarab
+Mridang
+Muharram
+Mulciber
+Munch
+Munda
+Murdabad
+Murdoch
+Murillo
+Murmansk
+Musca
+Muskhogean
+Mussulman
+Muti
+Mwalimu
+Mweru
+Mycobacterium
+Myrica
+Myrmidon
+NCAR
+NGK
+NTP
+Naafi
+Nabataean
+Nabokov
+Nabonidus
+Nadia
+Naga
+Nagaland
+Nagana
+Nagano
+Nagari
+Nagpur
+Nagyszeben
+Nahuatl
+Nahum
+Nama
+Namaqualand
+Namibia
+Nana
+Nansen
+Napier
+Napierian
+Napoli
+Napravnik
+Narayanganj
+Narraganset
+Nathanael
+Nauru
+Navassa
+Nayarit
+Nazarite
+Nearctic
+Neblett
+Nederland
+Negress
+Negritic
+Negrito
+Negrophil
+Negrophobe
+Negus
+Nehemiah
+Nejd
+Nekrasov
+Nelly
+Nelson
+Nembutal
+Nemean
+Nemesia
+Neocene
+Neogaea
+Neogene
+Neotropical
+Neozoic
+Neptunian
+Nereis
+Neri
+Nestorianism
+Neubrandenburg
+Neville
+Nevis
+Nevski
+New
+Newburg
+Newcombe
+Newcomen
+Newfie
+Newgate
+Newham
+Newhaven
+Newmarket
+Newtonabbey
+Newtown
+Ngaio
+Ngaliema
+Ngoma
+Nguni
+Ngwee
+Nha
+Nicaea
+Nice
+Nicene
+Nicias
+Nicobar
+Nicol
+Nicola
+Nicolai
+Nicolesco
+Nicolson
+Nicotiana
+Niedersachsen
+Niersteiner
+Nietszche
+Niflheim
+Nijmegen
+Nikaria
+Nike
+Nikolainkaupunki
+Nikolayev
+Nilotic
+Nimitz
+Nimrod
+Nimwegen
+Ningpo
+Ninon
+Nipissing
+Nisei
+Nishapur
+Nissen
+Niue
+Nizam
+Noachian
+Noble
+Noctiluca
+Noguchi
+Noordholland
+Nordkyn
+Norland
+Normanton
+Norn
+Norseman
+Northallerton
+Northamptonshire
+Northcliffe
+Northcountryman
+Northman
+Northmen
+Northumbria
+Northumbrian
+Northumbrians
+Northwich
+Nostoc
+Notogaea
+Notornis
+Nototherium
+Notour
+Nottinghamshire
+Notus
+Novgorod
+Novokuznetsk
+Nuba
+Nucci
+Nuffield
+Nullstellensatz
+Nuneaton
+Nupe
+Nuremberg
+Nyanja
+Nyasaland
+Nynorsk
+Nyoro
+OSHA
+Oahu
+Oakham
+Oakville
+Oaxaca
+Obadiah
+Oberammergau
+Oberhausen
+Oberland
+Oberon
+Obraztsova
+Ochman
+Ockham
+Ocrea
+Octans
+Octavian
+Octobrist
+Odelsting
+Odontoglossum
+Ogham
+Oglethorpe
+Ogpu
+Ogygian
+Oidium
+Oireachtas
+Oistrakh
+Okayama
+Okeechobee
+Okefenokee
+Okhotsk
+Okie
+Olcott
+Oldcastle
+Oldham
+Oliveira
+Olynthus
+Ommiad
+Omsk
+Ophiuchus
+Oporto
+Oppens
+Orangeism
+Orangeman
+Oratorian
+Orcadian
+Ordovician
+Orenburg
+Orff
+Oriya
+Orleanist
+Ormandy
+Ormazd
+Ornithorhynchus
+Orphean
+Orphism
+Orpington
+Orsk
+Orvieto
+Osage
+Oscan
+Oshawa
+Oshogbo
+Osijek
+Osmanli
+Osnaburg
+Osset
+Ossetic
+Ossian
+Ostrogoth
+Ostyak
+Othin
+Ottley
+Ouija
+Ovambo
+Overijssel
+Oxbridge
+Oxfordshire
+Ozawa
+PABA
+PCB
+PCBS
+POBox
+PUC
+PWT
+Paal
+Pachisi
+Pachouli
+Pacific
+Paddywhack
+Paderewski
+Padus
+Pahari
+Pahlavi
+Paignton
+Paiute
+Palacio
+Palaearctic
+Palaeocene
+Palaeozoic
+Palau
+Palenque
+Pali
+Pallas
+Palmerston
+Panama
+Panathenaea
+Pandarus
+Pandean
+Panhellenic
+Panhellenism
+Panjabi
+Pantagruel
+Paphian
+Papiamento
+Papuan
+Paracel
+Paracelsus
+Parma
+Parnassian
+Parnassus
+Parsee
+Parthenopaeus
+Parthenope
+Parthenos
+Parthian
+Pasch
+Pashto
+Passamaquoddy
+Passiontide
+Pasteurism
+Pathan
+Patmos
+Pauk
+Paulinus
+Pavarotti
+Pavo
+Pawnee
+Pears
+Pecksniffian
+Pehlevi
+Pekin
+Pekingese
+Pelagian
+Pelagianism
+Pelasgian
+Peleus
+Pelew
+Pelias
+Pelmanism
+Peloponnesian
+Pelops
+Pembrokeshire
+Pentland
+Pentstemon
+Penutian
+Pepys
+Pequot
+Perceval
+Percheron
+Peritricha
+Perlman
+Persicaria
+Persis
+Persson
+Pesach
+Peterborough
+Peterlee
+Peterloo
+Peterman
+Petermann
+Petersham
+Petra
+Petrie
+Petrine
+Petronius
+Petropavlovsk
+Petrosian
+Petrov
+Petrovsk
+Petrozavodsk
+Peyer
+Pfalz
+Pforzheim
+Phaeacian
+Phaedrus
+Philadelphus
+Philippeville
+Philippic
+Philistia
+Philistinism
+Philoctetes
+Philomela
+Phlegethon
+Phoenician
+Phragmites
+Phrygian
+Phylloxera
+Pianola
+Piavko
+Picard
+Pickwickian
+Pictish
+Pierian
+Pierides
+Pierrot
+Pietermaritzburg
+Pieterson
+Pilsen
+Pilsudski
+Piltdown
+Pindaric
+Pinkerton
+Pinkster
+Pinsk
+Pisanello
+Pisano
+Piscis
+Pitcairn
+Pithecanthropus
+Pitta
+Plasson
+Plasticine
+Platonical
+Plattdeutsch
+Platte
+Platteland
+Plautus
+Podolsk
+Pogonia
+Pogorelich
+Polack
+Polanski
+Polje
+Pollack
+Pollini
+Pollyanna
+Polska
+Polycarp
+Pondo
+Pondoland
+Pons
+Pontic
+Popov
+Popp
+Porson
+Posen
+Positif
+Poulenc
+Powhatan
+Praesepe
+Praetorian
+Prakrit
+Pressburg
+Pretre
+Preussen
+Previn
+Prey
+Priapus
+Price
+Principe
+Priscian
+Procne
+Prokopyevsk
+Proterozoic
+Protophyta
+Provincetown
+Prunella
+Prussianism
+Pskov
+Psoralea
+Ptolemaist
+Puppis
+Purbeck
+Puseyism
+Pyrrhus
+Pythagoreanism
+Pythia
+Pythian
+Quadragesima
+Quassia
+Queenborough
+Queenstown
+Quimper
+Quinquagesima
+Quirites
+Quivar
+RI
+RTT
+Rabelais
+Rabelaisian
+Rabi
+Rabia
+Rackham
+Radetzky
+Radnorshire
+Rafflesia
+Raia
+Raimondi
+Rajput
+Rama
+Rambouillet
+Rameses
+Rampal
+Randova
+Ranki
+Rapallo
+Raphia
+Rastafarian
+Rattle
+Rauwolfia
+Ravel
+Rea
+Rebozo
+Recklinghausen
+Redbridge
+Redemptorist
+Redgrave
+Regensburg
+Rehoboam
+Reichsrat
+Reiner
+Remblai
+Reme
+Remex
+Renardy
+Renfrew
+Rensselaerite
+Resnik
+Respighi
+Reunion
+Rhadamanthus
+Rhaetian
+Rhaetic
+Rheinland
+Rhemish
+Rhodesian
+Rhodesoid
+Rhodian
+Rhodope
+Ricci
+Ricciarelli
+Riesling
+Rigsdaler
+Rijeka
+Rijksdaaler
+Rijn
+Rijswijk
+Riksdag
+Rimini
+Rimsky
+Ripuarian
+Riss
+Rivera
+Roanoke
+Robeson
+Robespierre
+Robson
+Rochberg
+Rochdale
+Rochelle
+Rockhampton
+Rockingham
+Rodin
+Rodrigo
+Rodzinski
+Roethke
+Rojak
+Rolf
+Rollo
+Roma
+Romagna
+Romaic
+Romains
+Romaji
+Romanes
+Romanic
+Romanies
+Romanism
+Romanist
+Romanov
+Romansch
+Romany
+Romberg
+Romero
+Romeros
+Romish
+Rommel
+Romney
+Roncesvalles
+Ronin
+Ronsard
+Rosalind
+Rosicrucian
+Rossini
+Rostov
+Rostropovich
+Rotherham
+Rothermere
+Rothesay
+Rotterdam
+Rouault
+Roubaix
+Roussillon
+Routemarch
+Rowan
+Rowbotham
+Rowicki
+Rowlandson
+Roxburgh
+Royden
+Rozhdestvensky
+Rubenstein
+Rubicon
+Rudesheimer
+Ruhr
+Rumpelstiltskin
+Rundstedt
+Rupert
+Rurik
+Ruritania
+Ruskin
+Russky
+Russophile
+Russophobe
+Ruthenian
+Rutherfordium
+Rutter
+Rybinsk
+Ryswick
+Ryukyu
+Ryurik
+Rzewski
+SNCC
+SNOBOL
+STOL
+Saadi
+Saar
+Saarinen
+Saarland
+Sabaean
+Sabaoth
+Sabbatarian
+Sabellian
+Sackville
+Sacramentarian
+Sadducee
+Saens
+Safar
+Safi
+Sahaptin
+Saharan
+Saint
+Saintpaulia
+Saiva
+Sakai
+Sakharov
+Sakyamuni
+Salford
+Salian
+Salicornia
+Sallinen
+Salminen
+Salol
+Salonen
+Salpa
+Salpiglossis
+Salvia
+Salzburg
+Samarkand
+Sambo
+Samian
+Samnite
+Samoyed
+Sanctus
+Sandhurst
+Sandringham
+Sandwich
+Sanforized
+Sanger
+Sangh
+Sangraal
+Sanjak
+Sankhya
+Santee
+Sao
+Sarajevo
+Sarangi
+Saransk
+Saratov
+Sard
+Sardinian
+Sardis
+Sardius
+Sardou
+Sargodha
+Sargon
+Sark
+Sarkis
+Sarracenia
+Sarsen
+Saschowa
+Sassanid
+Sassenach
+Satie
+Satsuma
+Saturnian
+Sauerbaum
+Sawney
+Saxe
+Scandian
+Schaerbeek
+Schaffhausen
+Schein
+Schenck
+Schiedam
+Schiff
+Schippers
+Schleiermacher
+Schlesien
+Schleswig
+Schliemann
+Schnecken
+Schnitzler
+Schwarz
+Schwarzkopf
+Sci
+Scimone
+Scleroderma
+Scofield
+Scopus
+Scorpius
+Scotism
+Scotswoman
+Scotticism
+Scotto
+Scriabin
+Scythian
+Seabee
+Sealyham
+Searle
+Seaton
+Sebastopol
+Secunderabad
+Sedgemoor
+Seebeck
+Seeger
+Seeland
+Seidlitz
+Seifert
+Selene
+Seleucid
+Selig
+Seljuk
+Semipalatinsk
+Semitics
+Senechal
+Senlac
+Sephardi
+Septembrist
+Septuagint
+Serapis
+Serb
+Serkin
+Sevastopol
+Severnaya
+Severus
+Sexagesima
+Shaban
+Shabuoth
+Shackleton
+Shaka
+Shakta
+Shakti
+Shang
+Shankar
+Shankaracharya
+Sharia
+Shavian
+Shaw
+Shawwal
+Shchedrin
+Shcheglovsk
+Shcherbakov
+Shechem
+Shekinah
+Shemite
+Shemitic
+Sheol
+Sherpa
+Sherrington
+Shetland
+Shiah
+Shiism
+Shimonoseki
+Shiraz
+Shluh
+Shoa
+Sholokhov
+Shona
+Shoshonean
+Shostakovich
+Shrewsbury
+Shropshire
+Shrovetide
+Shulamite
+Sibelius
+Sicanian
+Siddhartha
+Sierra
+Sihanouk
+Sika
+Silures
+Silurian
+Silvanus
+Simarouba
+Simbirsk
+Simeon
+Simferopol
+Sinaloa
+Sindhi
+Singhalese
+Sinhalese
+Sinicism
+Sinitic
+Sinopoli
+Sintow
+Siouan
+Siracusa
+Sisley
+Sitka
+Sivaism
+Sivan
+Siwash
+Sixtus
+Skelton
+Skijoring
+Skikda
+Skimmia
+Skipton
+Skokiaan
+Skolly
+Skrowaczewski
+Skua
+Slatkin
+Slavism
+Slavkov
+Slavonia
+Slavophile
+Slavophiles
+Slesvig
+Slovak
+Slovene
+Smeaton
+Smetana
+Smilax
+Smirnov
+Smolensk
+Smollett
+Sobranje
+Socinian
+Soderblom
+Soderstrom
+Sodom
+Soffel
+Sogdian
+Solenodon
+Solti
+Solutrean
+Solzhenitsyn
+Somaliland
+Sondheim
+Songhai
+Sorbian
+Sorbonne
+Sordello
+Sothic
+Sothis
+Sotho
+Souphanourong
+Souslik
+Sousse
+Souterrain
+Southdown
+Southern
+Southport
+Southron
+Southwark
+Sovetsk
+Soviet
+Soweto
+Soyinka
+Soyuz
+Spaak
+Spartacus
+Spassky
+Speenhamland
+Spenborough
+Spence
+Spengler
+Spenser
+Spenserian
+Spinoza
+Spinozism
+Spitsbergen
+Spivakov
+Spratly
+Springhaas
+Srbija
+Stade
+Stagirite
+Stakhanovism
+Stalinabad
+Stalingrad
+Stalinism
+Stalinogrod
+Stalinsk
+Stanislavsky
+Stanleyville
+Starker
+Stavanger
+Stavropol
+Steber
+Stefansson
+Stegodon
+Stegomyia
+Stegosaurus
+Steier
+Steiermark
+Stein
+Steinbeck
+Steinitz
+Stellite
+Stern
+Stijl
+Stillson
+Stillsons
+Stilton
+Stilwell
+Stockhausen
+Stockport
+Stockwood
+Stokowski
+Stokys
+Storting
+Stourbridge
+Stradivari
+Stradivarius
+Strafford
+Stralsund
+Stranraer
+Stratas
+Strathclyde
+Straus
+Stravaig
+Streisand
+Strelitzia
+Stretford
+Streusel
+Stroheim
+Strophanthus
+Strymon
+Stu
+Stylops
+Sudetenland
+Sudra
+Sufi
+Sufism
+Sultanabad
+Sulu
+Sumba
+Sumbawa
+Summers
+Sumo
+Sunderland
+Sunni
+Sunnite
+Suomi
+Surinam
+Suriname
+Susanna
+Susian
+Susu
+Sutcliffe
+Suvorov
+Suwannee
+Svalbard
+Sverdlovsk
+Svetlanov
+Swabia
+Swadeshi
+Swanee
+Swatow
+Swazi
+Swedenborg
+Swedenborgianism
+Sweeny
+Swithin
+Sylvan
+Symons
+Syriac
+Syrtis
+Szabadka
+Szczecin
+Szechwan
+Szeged
+Szell
+Szerying
+Szeryng
+Szewinska
+Szombathely
+Szymanowski
+TKO
+TP
+TWP
+Tabasco
+Tabriz
+Tacamahac
+Tacchino
+Tachina
+Tadzhiki
+Tagalog
+Tai
+Taichung
+Tainan
+Taino
+Taiping
+Taisho
+Tajik
+Talaing
+Talmudist
+Talvela
+Tambov
+Tamerlane
+Tamworth
+Tanagra
+Tanjungpriok
+Tannenberg
+Tardenoisian
+Targum
+Tarkington
+Tarnopol
+Tarpeia
+Tarpeian
+Tarquin
+Tartarean
+Tartaric
+Tartarus
+Tasmanian
+Tatar
+Tatary
+Tatum
+Taunton
+Tay
+Taymyr
+Tayra
+Tayside
+Tbilisi
+Tchad
+Te
+Teal
+Tear
+Tebaldi
+Technicolor
+Technion
+Tel
+Telegu
+Telescopium
+Telford
+Telstar
+Telugu
+Tema
+Temne
+Tempe
+Templar
+Tenebrae
+Tenerife
+Tennstedt
+Tenzi
+Terence
+Teresina
+Tereus
+Ternopol
+Terrani
+Tethys
+Teton
+Teucer
+Teucrian
+Teuton
+Teutonism
+Tewkesbury
+Thanatos
+Thebaid
+Themis
+Theodora
+Theodoric
+Theophilus
+Thermit
+Thersites
+Thetford
+Thomism
+Thorndike
+Thorvaldsen
+Thucydides
+Thuja
+Thurgau
+Thuringia
+Thuringian
+Thurn
+Thyestes
+Tiberius
+Tilburg
+Tilbury
+Tilsit
+Timor
+Timoshenko
+Timour
+Tintagel
+Tippett
+Tirol
+Tiruchirapalli
+Tirunelveli
+Tisa
+Tishab
+Tisiphone
+Titanesque
+Titanomachy
+Titograd
+Titoism
+Tivoli
+Tjirebon
+Tlaxcala
+Tlemcen
+Tlingit
+Tmesis
+Tobey
+Tobolsk
+Tobruk
+Tocharian
+Tocqueville
+Togliatti
+Togoland
+Tojo
+Tokay
+Tokelau
+Tokharian
+Tokoloshe
+Tokugawa
+Tolan
+Tolbert
+Tolima
+Tolkien
+Toller
+Tolly
+Toltec
+Toluca
+Tome
+Tomowa
+Tomsk
+Tonbridge
+Tonga
+Tonka
+Tonkin
+Tophet
+Torricellian
+Torsk
+Tourel
+Townsville
+Tractarianism
+Transcaucasia
+Transylvanian
+Trappist
+Treblinka
+Trent
+Trevino
+Treviso
+Tridentine
+Trinil
+Tripitaka
+Triticum
+Tromelin
+Trondheim
+Trowbridge
+Troyanos
+Truffaut
+Truro
+Tuamotu
+Tuareg
+Tucana
+Tucker
+Tuckwell
+Tunbridge
+Tungus
+Tungusic
+Tupi
+Turanian
+Turco
+Turkey
+Turki
+Turkic
+Turkism
+Turkmen
+Turkoman
+Turks
+Tuvalu
+Twelfthtide
+Twi
+Twickenham
+Tyche
+Tynwald
+Tyrannosaurus
+Tyrian
+Tyrol
+Tyrolienne
+Tyrone
+Tyrr
+Tyrrhenian
+UHF
+Ubangi
+Ubiquitarian
+Ude
+Ugrian
+Ugric
+Uhland
+Uhuru
+Uigur
+Uinta
+Uitlander
+Ujamaa
+Ujiji
+Ujjain
+Ujung
+Ukase
+Ukiyoe
+Ulbricht
+Ullswater
+Ulm
+Ulsterman
+Ulyanovsk
+Umbrian
+Umbriel
+Unalaska
+Uniat
+Union
+United
+Ural
+Uralic
+Uranian
+Uredo
+Uriah
+Uriel
+Urmston
+Urnfield
+Ustinov
+Uxbridge
+Uzbek
+VAC
+VAG
+VDU
+VLF
+VTOL
+Vaal
+Vaasa
+Vaishnava
+Valencia
+Valenciennes
+Valentinian
+Valjakka
+Vanda
+Vandyke
+Vanir
+Vanuatu
+Varady
+Varangian
+Varga
+Varuna
+Vaseline
+Vaticanism
+Veasy
+Veblen
+Vedalia
+Vedanta
+Vedda
+Veddoid
+Vedernikov
+Vedic
+Velsen
+Venda
+Veneti
+Venetia
+Venetic
+Venezia
+Venizelos
+Venora
+Venusberg
+Veracruz
+Vernoleninsk
+Veronal
+Veronese
+Verrett
+Vertumnus
+Vierne
+Vietcong
+Vietminh
+Vihuela
+Viipuri
+Vijayawada
+Vilayet
+Villach
+Villahermosa
+Villainage
+Villanovan
+Villars
+Villeneuve
+Villeurbanne
+Villiers
+Villon
+Vilnius
+Viminal
+Vincennes
+Vindhya
+Vineland
+Vinland
+Virchow
+Visakhapatnam
+Visayan
+Visby
+Visconti
+Viseu
+Vishakhapatnam
+Vishinsky
+Vitebsk
+Vizagapatam
+Vizcacha
+Vizsla
+Vlaardingen
+Vlach
+Vladikavkaz
+Vlaminck
+Vlei
+Vlissingen
+Vltava
+Voetsek
+Voetstoots
+Vogelweide
+Vogul
+Volans
+Volapuk
+Volga
+Volgograd
+Volsci
+Volscian
+Von
+Vorarlberg
+Voronezh
+Voroshilov
+Voroshilovgrad
+Voroshilovsk
+Vortumnus
+Votyak
+Vouvray
+Vries
+Vuelta
+Vulcanite
+Vulpecula
+Vyatka
+Vyshinsky
+Vyvyan
+WAAC
+WAAF
+Waart
+Waddenzee
+Waddington
+Wahhabi
+Waikato
+Waikiki
+Wajda
+Wakashan
+Wakayama
+Wakerife
+Waksman
+Walach
+Walachia
+Walbrzych
+Walcheren
+Waldemar
+Waldenburg
+Waldgrave
+Waldheim
+Waley
+Wallachia
+Walloon
+Wallsend
+Walpurgis
+Walsall
+Walsingham
+Walther
+Walvis
+Wand
+Wandsworth
+Wapentake
+Wappenshaw
+Waragi
+Warangal
+Warbeck
+Ward
+Warfarin
+Warhol
+Warison
+Warley
+Warren
+Warrington
+Wartburg
+Warwickshire
+Wasatch
+Waterford
+Watford
+Watling
+Watteau
+Wattenscheid
+Watts
+Watusi
+Waugh
+Wayland
+Webern
+Wedgwood
+Weigela
+Weikert
+Weikl
+Weill
+Weimar
+Weismannism
+Weisshorn
+Weizmann
+Wellingborough
+Wellingtonia
+Welsbach
+Welshman
+Welwitschia
+Wembley
+Wenceslaus
+Wendish
+Wenkel
+Wensleydale
+Westernism
+Westfalen
+Westmeath
+Westmorland
+Wetterhorn
+Wexford
+Weymouth
+Whikehart
+White
+Whiteboy
+Whitechapel
+Whitefield
+Whitlam
+Whitley
+Whitlow
+Whitsun
+Whitsuntide
+Whittington
+Wickersley
+Wickliffe
+Wicklow
+Widor
+Wiesbaden
+Wigner
+Wigtown
+Wijngaarden
+Wilberforce
+Willcocks
+Wilton
+Wimbledon
+Wimshurst
+Winceyette
+Winchesters
+Winckelmann
+Wiseman
+Wittenberg
+Witwatersrand
+Wixell
+Wobbegong
+Wodehouse
+Woden
+Woking
+Wokingham
+Wolds
+Wolffian
+Wolfram
+Wolfsburg
+Wollongong
+Wolof
+Wolverhampton
+Woodsia
+Woomera
+Wotton
+Woulfe
+Wraac
+Wrexham
+Wunderlich
+Wycliffite
+Wykeham
+Xeres
+Xmas
+Yablonovy
+Yahoo
+Yahweh
+Yakut
+Yakutsk
+Yalu
+Yangtze
+Yankeeism
+Yarborough
+Yarkand
+Yaroslavl
+Yashmak
+Yekaterinburg
+Yekaterinodar
+Yekaterinoslav
+Yelisavetgrad
+Yelisavetpol
+Yelizaveta
+Yenisei
+Yerba
+Yerkes
+Yevtushenko
+Yid
+Yorke
+Yorkist
+Yorkists
+Yoruba
+Yoshihito
+Youngberry
+Younker
+Ypres
+Yquem
+Yresko
+Ysaye
+Yser
+Yseult
+Yssel
+Yuga
+Yukawa
+Yuman
+Yurev
+Yurlov
+Yuzovka
+Zaandam
+Zabrze
+Zacatecas
+Zaccaria
+Zacharias
+Zaibatsu
+Zakai
+Zakuski
+Zambezi
+Zamboanga
+Zamenhof
+Zamia
+Zanasi
+Zanthoxylum
+Zapotec
+Zeebrugge
+Zeeland
+Zeeman
+Zemstvo
+Zend
+Zenobia
+Zepperitz
+Zermatt
+Zetland
+Zhdanov
+Zhitomir
+Zhivkov
+Zho
+Zhukov
+Zimbabwe
+Zindabad
+Zinman
+Zinovievsk
+Zinzendorf
+Zoa
+Zoroastrianism
+Zouave
+Zoysia
+Zuider
+Zuidholland
+Zukerman
+Zwilich
+aardwolf
+abac
+abaca
+abactinal
+abadan
+abaddon
+abakan
+abamp
+abampere
+abator
+abbasid
+abbatial
+abbess
+abcoulomb
+abdias
+abdominous
+abednego
+abeokuta
+aberdare
+abfarad
+abhenry
+abib
+abietic
+abilene
+abingdon
+abirritant
+abirritate
+abkhaz
+ablactation
+ablator
+abohm
+aboideau
+aborticide
+aboukir
+aboulia
+abranchiate
+abri
+abruzzi
+abseil
+absinthism
+absonant
+absorbefacient
+absorptivity
+absquatulate
+abstergent
+abukir
+abulia
+abvolt
+abwatt
+aby
+abydos
+abysm
+acajou
+acanthaceous
+acanthine
+acanthoid
+acanthous
+acariasis
+acarid
+acaroid
+acarology
+acarpous
+acas
+acaudal
+accad
+accentor
+accidie
+accipitrine
+accommodatory
+accouplement
+accrescent
+accutron
+acerate
+acerose
+acescent
+acetabulum
+acetanilide
+acetometer
+acetophenetidin
+acetum
+acetylcholine
+acetylide
+acetylsalicylic
+achaea
+achelous
+achene
+acheron
+acheulian
+achlamydeous
+achlorhydria
+achondrite
+achondroplasia
+achromatin
+achromatous
+achromic
+acicula
+aciculate
+aciculum
+acidometer
+acidophil
+acidophilus
+acidosis
+acierate
+acinaciform
+aciniform
+ackee
+acl
+aclinic
+acnode
+acol
+aconcagua
+aconite
+acotyledon
+acouchi
+acridine
+acriflavine
+acrilan
+acrocarpous
+acrodrome
+acrogen
+acrolein
+acrolith
+acromegaly
+acromion
+acrospire
+acroter
+acrylamide
+acrylonitrile
+acrylyl
+acta
+actin
+actinal
+actinidin
+actiniform
+actinochemistry
+actinoid
+actinomere
+actinomorphic
+actinomycete
+actinomycin
+actinomycosis
+actinon
+actinopod
+actinotherapy
+actinouranium
+actinozoan
+actomyosin
+aculeus
+acutance
+acyclical
+adactylous
+adamawa
+adamsite
+adana
+adaptably
+addax
+ademption
+adenectomy
+adenitis
+adenocarcinoma
+adenohypophysis
+adenoidectomy
+adenovirus
+adhibit
+adiaphorism
+adiaphorous
+adiathermancy
+adipocere
+adit
+adivasi
+admass
+admetus
+adminicle
+adnate
+adnominal
+adnoun
+adowa
+adrastus
+adscription
+adsorbtion
+adsuki
+adularia
+adumbral
+aduwa
+adventitia
+adversarial
+adygei
+adynamia
+adytum
+adzhar
+adzuki
+aeciospore
+aecium
+aedile
+aegospotami
+aegrotat
+aeneous
+aestheticism
+afebrile
+affettuoso
+afflatus
+affreightment
+aforemention
+aforetime
+afrit
+afrormosia
+afterbody
+afterbrain
+afterburning
+afterheat
+afterpains
+aftersensation
+aftershaft
+aga
+agadir
+agalloch
+agamogenesis
+agaric
+agartala
+agateware
+agegroup
+aggro
+agha
+agiotage
+agist
+aglet
+agley
+aglimmer
+agma
+agminate
+agnail
+agni
+agnus
+agora
+agraffe
+agram
+agranulocytosis
+agraphia
+agrestal
+agrestic
+agrigento
+agrippina
+agrose
+agrostology
+agrypnotic
+agueweed
+agulhas
+ahab
+ahimsa
+ahithophel
+ahura
+aiglet
+aiguille
+aiguillette
+aikido
+aikona
+ailurophile
+ailurophobe
+ain
+aintab
+airboat
+airbrick
+aircraftman
+airdrie
+aire
+airforce
+airgun
+airt
+aisha
+aisne
+ait
+aitchbone
+ajaccio
+ajmer
+akbar
+akela
+akene
+akhara
+akhenaten
+akihito
+akkerman
+aksum
+akure
+akvavit
+alagez
+alagoas
+alamode
+alanbrooke
+alanine
+alannah
+alap
+alar
+albacete
+albata
+albemarle
+alberti
+albertite
+albertus
+albescent
+albinus
+albite
+albuminate
+albuminuria
+albumose
+alburnum
+alcaeus
+alcahest
+alcaide
+alcalde
+alcan
+alcatraz
+alcheringa
+alcidine
+alcmene
+alcoholicity
+alcuin
+aldabra
+aldan
+aldershot
+aldis
+aldol
+aldosterone
+aldoxime
+alecost
+alecto
+alegar
+alekhine
+alembicated
+alessandria
+alethic
+aleurone
+alevin
+alexandretta
+alexipharmic
+alfieri
+alfilaria
+alforja
+algarroba
+algebraical
+algeciras
+alginic
+algoid
+algolagnia
+algology
+algometer
+algor
+algorism
+alible
+alicante
+aligarh
+aliped
+alit
+aliunde
+alkalic
+alkane
+alkene
+alkmaar
+alky
+alkyd
+alkylation
+alkyne
+allanite
+allantoid
+allantois
+allargando
+alleppey
+allethrin
+allhallows
+alloa
+allodial
+allodium
+allonym
+alloplasm
+allotts
+allyou
+almada
+almelo
+almemar
+almonry
+almucantar
+almuce
+alodium
+alopecia
+alost
+alow
+alpenhorn
+alpes
+alphatically
+alpheus
+alphonsus
+alphorn
+alphosis
+alsace
+alsike
+alt
+altdorf
+altdorfer
+alternant
+althing
+althorn
+altiplano
+altissimo
+altogther
+altona
+altostratus
+aludel
+alula
+aluminiferous
+aluminothermy
+alumroot
+alvey
+alvine
+amadavat
+amadou
+amagasaki
+amalekite
+amalthea
+amaranthaceous
+amaranthine
+amarelle
+amaryllidaceous
+amatol
+amaut
+amazonas
+ambala
+ambary
+amberjack
+amberoid
+amblygonite
+amblyopia
+ambo
+amboceptor
+amboise
+amboyna
+ambroid
+ambry
+amdahl
+ameba
+ameer
+amenhotep
+amesace
+amhara
+amharic
+amianthus
+amice
+amicus
+amidol
+amidship
+amin
+aminophenol
+aminopyridine
+aminopyrine
+amir
+ammendment
+ammendments
+ammine
+ammocoete
+ammon
+ammonal
+ammonate
+ammonic
+amoebaean
+amon
+amontillado
+amoroso
+amowt
+amphiarthrosis
+amphiaster
+amphibiotic
+amphiblastula
+amphibrach
+amphichroic
+amphicoelous
+amphictyon
+amphictyony
+amphidiploid
+amphigory
+amphimacer
+amphimixis
+amphiprostyle
+amphiprotic
+amphisbaena
+amphistylar
+amphithecium
+amphitricha
+amphora
+amphoteric
+ampulla
+amravati
+amrita
+amstrad
+amur
+amygdala
+amygdalate
+amygdale
+amygdalin
+amygdaline
+amygdaloidal
+amylaceous
+amylase
+amylene
+amyloid
+amylolysis
+amylopectin
+amylopsin
+amylose
+amyotonia
+anabantid
+anabolite
+anabranch
+anacardiaceous
+anachorism
+anaclinal
+anacoluthia
+anacoluthon
+anacoustic
+anacrusis
+anadem
+anadex
+anadromous
+anadyr
+anaglypta
+anagnorisis
+anagoge
+anak
+analcite
+analects
+anambra
+anamnesis
+anamorphism
+anamorphoscope
+anamorphosis
+anandrous
+ananthous
+anapaest
+anaphrodisiac
+anaplasty
+anaptyxis
+anapurna
+anarthria
+anarthrous
+anasarca
+anastomose
+anatase
+anatolia
+anatto
+anaxagoras
+anaximander
+anaximenes
+anbury
+anchoveta
+anchylose
+ancipital
+ancohuma
+ancon
+ancy
+ancylostomiasis
+andalusia
+anderlecht
+andizhan
+andreanof
+andreotti
+androcles
+androclinium
+androecium
+androgenous
+androgyne
+andros
+androsphinx
+androsterone
+andvari
+ane
+anear
+anelace
+anele
+anemochore
+anemography
+anemology
+anemophilous
+anemoscope
+anergy
+anestrus
+anethole
+aneto
+aneuploid
+aneurin
+angelico
+angell
+angelology
+angiology
+angioma
+angostura
+angra
+anguilliform
+anguine
+angwantibo
+anhalt
+anhinga
+anhwei
+aniakchak
+aniconic
+anil
+anilingus
+anima
+animatism
+animato
+anisodactyl
+anisogamy
+anisole
+anisometric
+anisometropia
+anking
+ankus
+ankylosaur
+ankylose
+ankylosis
+ankylostomiasis
+anlace
+anlage
+annaba
+annabergite
+annates
+annatto
+annecy
+annhilate
+anno
+annulose
+anoa
+anoestrus
+anole
+anorak
+anorthositic
+anoxaemia
+ansate
+anschluss
+anshan
+antemeridian
+antependium
+antepenultimate
+antetype
+anteversion
+antevert
+anthelmintic
+anthemion
+antheridium
+antherozoid
+anthocyanin
+anthophore
+anthotaxy
+anthozoan
+anthracene
+anthracoid
+anthraquinone
+anthropomorphosis
+anthropomorphous
+anthropopathy
+anthropophagi
+anthropophagite
+antibaryon
+antibes
+anticathode
+antichlor
+anticholinesterase
+antichrist
+anticlastic
+anticlinorium
+anticosti
+anticyclone
+anticyclones
+antidromic
+antiegalitarian
+antifebrile
+antifederalist
+antiferromagnetism
+antifluoridation
+antihalation
+antihelices
+antihelix
+antihero
+antiheros
+antilepton
+antileptons
+antilogism
+antilogy
+antimasque
+antimere
+antimilitarist
+antimilitarists
+antimissile
+antimissiles
+antimonous
+antimonyl
+antiochus
+antiparallel
+antipater
+antiperistalsis
+antipsychiatry
+antirachitic
+antiremonstrant
+antisana
+antiscorbutic
+antistatic
+antisthenes
+antitragus
+antitype
+antiworld
+antlia
+antlion
+antofagasta
+antoninus
+antonioni
+antonius
+antonomasia
+antre
+antrim
+antrum
+antung
+anu
+anuradhapura
+anuran
+anuresis
+anuria
+anurous
+anvers
+anyang
+anzio
+anzus
+aorangi
+aosta
+aoudad
+apagoge
+apanage
+aparri
+apatetic
+apeldoorn
+apelles
+apeman
+apennines
+apery
+apetalous
+aphagia
+apheliotropic
+aphesis
+aphonia
+aphtha
+apia
+apiezon
+apivorous
+aplanospore
+aplite
+apnoea
+apo
+apocarp
+apochromat
+apocopate
+apocynaceous
+apocynthion
+apoenzyme
+apogamy
+apogeotropism
+apollinaris
+apomict
+apopemptic
+apophasis
+apophthegm
+apophyge
+apophyllite
+apophysis
+apopolectic
+aposiopesis
+apospory
+apostil
+appaloosa
+apparitor
+appassionato
+appel
+appendicectomy
+appendicle
+appenzell
+applecart
+applecarts
+applesnits
+appointor
+appointors
+approximal
+approximator
+approximators
+appulse
+apriorism
+apteral
+apterygial
+apuleius
+apulia
+apure
+apurimac
+apyretic
+aqaba
+aqualung
+aquashow
+aquileia
+aquire
+aquit
+aquitaine
+aquittal
+ara
+arabica
+arabinose
+arad
+arafura
+aragats
+aragon
+aragonite
+araguaia
+arak
+arakan
+araks
+araldite
+araliaceous
+aram
+aran
+araneid
+arany
+arapaima
+ararat
+araroba
+aras
+araucania
+araxes
+arbalest
+arbil
+arbitress
+arboraceous
+arbroath
+arbuthnot
+arcature
+archaean
+archaeomagnetism
+archaeozoic
+archegonium
+archenteron
+archerfish
+archespore
+archicarp
+archidiaconal
+archidiaconate
+archiepiscopal
+archiepiscopate
+archil
+archilochus
+archimage
+archimandrite
+archine
+archipenko
+archiphoneme
+archiplasm
+archoplasm
+arcograph
+arcus
+ardeb
+ardennes
+areg
+arenicolous
+arenite
+areography
+aretino
+arezzo
+argal
+argali
+argand
+argenteuil
+argentum
+argil
+argilliferous
+argillite
+argol
+argolis
+argonon
+argovie
+arica
+arietta
+aril
+arillode
+arimathea
+ariminum
+ariose
+arioso
+ariosto
+arista
+aristaeus
+aristarchus
+aristophanes
+arjuna
+arkose
+arkwright
+arles
+arlon
+armagh
+armagnac
+armband
+armes
+armet
+armiger
+armillary
+arminius
+armipotent
+armorica
+armure
+arne
+arnhem
+arnica
+arnim
+arno
+aroid
+aroint
+arp
+arpent
+arquebus
+arran
+arrestable
+arretium
+arrivisme
+arroba
+arru
+arse
+arsenopyrite
+arsphenamine
+artaud
+artaxerxes
+arteriovenous
+arthralgia
+arthromere
+artic
+artifical
+artifically
+artistical
+artois
+arunachal
+arundel
+arundinaceous
+aruspex
+aruwimi
+arvo
+arytenoid
+asantehene
+asarabacca
+asben
+ascariasis
+ascarid
+asch
+asci
+asclepiadaceous
+ascocarp
+ascogonium
+ascoli
+ascomycete
+ascorbic
+aseity
+asepalous
+asgard
+ashcroft
+ashe
+ashet
+ashkey
+ashlar
+ashlared
+ashlaring
+ashlars
+ashplant
+ashtoreth
+ashurbanipal
+asir
+askari
+askja
+aslef
+asmara
+asmodeus
+aso
+asoka
+aspergillosis
+aspergillus
+asphyxiant
+asphyxiants
+aspinwall
+asquint
+asquith
+assad
+assentient
+asshur
+assibilate
+assiniboine
+assistents
+assiut
+associationism
+assuan
+assurbanipal
+astable
+astaire
+asternal
+asti
+astolat
+astomatous
+astraphobia
+astrict
+astrobotany
+astrocompass
+astrodynamics
+astrogeology
+astroid
+astrometry
+asturias
+astyanax
+asur
+aswan
+asyllabic
+asymptotical
+asyut
+atacama
+atactic
+ataghan
+atahualpa
+ataman
+atbara
+athabaska
+athamas
+athanasius
+athelstan
+athematic
+athermanous
+atheroma
+athodyd
+athos
+atli
+atmolysis
+atomy
+atrabilious
+attaboy
+attedance
+attemper
+attenuant
+attercliffe
+attlee
+attu
+atween
+aubade
+aube
+aude
+audiotypist
+audiphone
+auer
+auklet
+aulic
+aulis
+aurangzeb
+aurelian
+aureus
+auriferous
+auriol
+aurist
+aurum
+ausforming
+ausonius
+austen
+austenitic
+autacoid
+autarchy
+autarky
+autecious
+autecology
+auteur
+autochanger
+autochthon
+autocode
+autocue
+autocycle
+autoicous
+autokinetic
+autoload
+autoloaded
+autoloads
+autolycus
+autolyse
+automorphic
+autopista
+autoput
+autoradiographs
+autoroute
+autostability
+autostrada
+autotimer
+autotoxaemia
+autotoxin
+autotype
+autoxidation
+auvergne
+auxanometer
+auxochrome
+avadavat
+avagadro
+avalon
+avebury
+aveiro
+avellaneda
+avens
+averno
+aveyron
+avicenna
+aviemore
+avignon
+avizandum
+avlona
+avunculate
+awheel
+awlwort
+axseed
+axum
+ayacucho
+ayah
+ayahuasca
+aycliffe
+aydin
+ayesha
+ayr
+ayub
+ayurveda
+ayutthaya
+azan
+azazel
+azbine
+azikiwe
+aznavour
+azo
+azobenzene
+azoic
+azole
+azotemia
+azoth
+azotic
+baa
+baas
+baba
+babar
+babassu
+babbage
+babeuf
+babiche
+babirusa
+babu
+babul
+babur
+babylonia
+bacchius
+bacciform
+baccivorous
+baccy
+backbench
+backbencher
+backbenchers
+backblocks
+backbreaker
+backbreaking
+backchat
+backcloth
+backcomb
+backdate
+backdated
+backdates
+backdating
+backend
+backends
+backhaus
+backmost
+backscratcher
+backsheesh
+backstreet
+backus
+backwardation
+baclava
+bacolod
+bacteraemia
+bacteriological
+bacteriology
+bacteriolysis
+bacteriophage
+bacteriostasis
+bacteroid
+bactria
+baculiform
+baculum
+badajoz
+badalona
+badderlocks
+baddie
+badman
+badoglio
+baeda
+bael
+baeyer
+baez
+bagasse
+bagehot
+bagh
+baghlan
+bagie
+bagnio
+baguio
+bagwash
+bagwig
+bagworm
+bahadur
+bahasa
+bahia
+baht
+bahuvrihi
+baikal
+baile
+baines
+bairnsfather
+baja
+bajan
+bakeapple
+bakehouse
+bakewell
+bakra
+baksheesh
+bakst
+bakunin
+balaclava
+balanchine
+balas
+balata
+balbo
+balbriggan
+baldmoney
+baldric
+balibuntal
+balikpapan
+baliol
+balkh
+balkhash
+balladmonger
+ballance
+ballarat
+ballflower
+balliol
+ballocks
+ballonet
+balmain
+balmung
+balneal
+balneology
+balpa
+balsamiferous
+balsaminaceous
+banaras
+banat
+banc
+bandaranaike
+banderilla
+banderillero
+bandh
+bandicoot
+bandjarmasin
+bandobust
+bandoline
+bandore
+bandsaw
+bandspreading
+bandung
+bangalore
+bangka
+bangweulu
+banian
+banja
+banjermasin
+banjul
+banka
+banket
+banknote
+banknotes
+bannerol
+bansela
+banstead
+bant
+banting
+bap
+baranof
+baraza
+barbel
+barbellate
+barbet
+barbette
+barbican
+barbicel
+barbituric
+barbizon
+barbule
+barbusse
+barca
+barcarole
+barce
+barchart
+barcharts
+bardot
+barehanded
+bareilly
+barents
+baresark
+bargee
+bargepole
+barilla
+barite
+barkentine
+barkhan
+barletta
+barm
+barnardo
+barnaul
+barnsley
+barnum
+barocchio
+baroda
+baroja
+barong
+baroscope
+barostat
+barouche
+barozzi
+barque
+barquentine
+barquisimeto
+barracoon
+barracouta
+barranquilla
+barrault
+barrenwort
+barret
+barrie
+barros
+bartizan
+bartolommeo
+barycentre
+barye
+barysphere
+baryta
+barytes
+barytone
+basaltware
+bascinet
+baseburner
+basenji
+bashan
+bashibazouk
+basifixed
+basilan
+basildon
+basilicata
+basle
+basotho
+bassein
+bassenthwaite
+basseterre
+bastardry
+bastia
+bastinado
+bastnaesite
+bastogne
+batangas
+batata
+bateleur
+batesian
+bathetic
+batholith
+bathsheba
+bathyal
+bathymetry
+bathyscaph
+bathysphere
+batley
+battels
+battersea
+battik
+battledore
+battlepiece
+batum
+batwoman
+bauchi
+baucis
+baudouin
+bautzen
+bawbee
+bawdyhouse
+bawdyhouses
+bayern
+bayeux
+bayle
+baysian
+baywood
+bazoo
+bdellium
+beachie
+beadledom
+beanery
+beanfeast
+beano
+beanpole
+beasty
+beatles
+beatty
+beauharnais
+beaumarchais
+beaut
+beauvais
+beauvoir
+beaverbrook
+bebeerine
+bebel
+beccafico
+bechet
+becquerel
+beddable
+bedesman
+bedight
+bedivere
+bedizen
+bedrail
+bedsit
+bedsits
+bedsitter
+bedspaces
+bedwarmer
+bedwetting
+bedworth
+beeb
+beechnut
+beefburger
+beento
+beerbohm
+beersheba
+beeswing
+beetfly
+beetroot
+beetroots
+beezer
+beforeimage
+beforeimages
+begad
+beggarweed
+begird
+begorra
+begum
+behan
+behistun
+beiderbecke
+beigel
+beira
+bejabers
+bejewel
+belah
+belemnite
+belfort
+belga
+belitung
+bellarmine
+bellay
+belleau
+belletrist
+bellinzona
+belloc
+bellybutton
+belmopan
+belovo
+bemean
+benadryl
+benares
+bendel
+bendigo
+bendy
+benedicite
+benempt
+benevento
+benfleet
+bengaline
+benghazi
+benguela
+benoni
+bentinck
+bentwood
+benue
+benzaldehyde
+benzidine
+benzine
+benzoate
+benzocaine
+benzofuran
+benzoic
+benzoin
+benzol
+benzophenone
+benzoquinone
+benzoyl
+benzyl
+berar
+berbera
+berberidaceous
+berbice
+bergdama
+bergerac
+bergius
+beria
+bering
+berio
+beriosova
+berk
+berks
+berley
+berlichingen
+berlinguer
+berm
+bermejo
+bermondsey
+bernadette
+bernadotte
+bernhardt
+bernicle
+bernina
+berretta
+bersagliere
+berseem
+bertillon
+bertolucci
+berzelius
+bespangle
+bespread
+bestrode
+bethe
+bethral
+bethralled
+bethralling
+bethrals
+bethsaida
+betjeman
+betook
+betti
+betulaceous
+beuthen
+bevan
+bevanite
+bevanites
+bevatron
+bevin
+bevvy
+bexley
+beyrouth
+bezique
+bezoar
+bezonian
+bezwada
+bhagalpur
+bhai
+bhakti
+bhang
+bharal
+bharat
+bharatiya
+bhatpara
+bhavan
+bhavnagar
+bhindi
+bhishti
+bhopal
+bhubaneswar
+bhutto
+biafra
+biak
+biannulate
+biarritz
+biauriculate
+bibliomancy
+bicarb
+bicephalous
+bicester
+bicollateral
+bicorn
+bida
+bidarka
+biddle
+bidentate
+bidistill
+bidistilled
+bidistilling
+bidistills
+biel
+bield
+bienne
+bierkeller
+biestings
+bifarious
+biffin
+bifoliate
+bifoliolate
+biforate
+bifrost
+bigarreau
+bigener
+bigmouth
+bignoniaceous
+biguanide
+bihar
+bijapur
+bijugate
+bikaner
+bikie
+bikila
+bilander
+bilbao
+bilberry
+bilboes
+bilection
+bilestone
+bilirubin
+biliverdin
+billabong
+billfish
+billyo
+bilobate
+biltong
+bimah
+bimanous
+bimbo
+bimorph
+binal
+binate
+bingey
+binghi
+binh
+binodal
+binominal
+binturong
+biocellate
+biochip
+biochips
+bioclimatology
+biocycle
+biodynamics
+bioenergetics
+bioherm
+biolysis
+bioplasm
+biopoiesis
+bioscope
+bioscopy
+biosis
+biostatics
+biostrome
+biparietal
+biparous
+bipetalous
+bipyramidal
+biquadrate
+biquarterly
+birendra
+biriani
+biro
+birobidzhan
+biros
+birthweight
+birthweights
+birtwhistle
+bis
+bisayas
+biscay
+bise
+bisectrix
+biserrate
+bish
+bishopbird
+bisitun
+bisk
+biskra
+bismuthic
+bismuthinite
+bismuthous
+bissextile
+bist
+bistability
+bisulcate
+bisulphate
+bisulphide
+bisulphite
+bisutun
+bisymmetric
+bithynia
+bitolj
+bitterling
+bitterwood
+bivvy
+bizerte
+blackbuck
+blackbutt
+blackcurrant
+blackett
+blackmore
+blackpool
+blackshirt
+blackstrap
+blackwall
+blackwood
+bladdernose
+bladderwrack
+blague
+blah
+blain
+blamey
+blanquette
+blasco
+blastocoel
+blastocyst
+blastoderm
+blastoff
+blastogenesis
+blastomere
+blastopore
+blaubok
+blaydon
+bleb
+bleep
+bleeped
+bleeper
+bleeping
+blennioid
+blenny
+blent
+blepharitis
+blet
+blewits
+blida
+bligh
+blighty
+blimey
+blindage
+blindstorey
+blockboard
+bloemfontein
+blois
+bloodbaths
+bloodsport
+bloodsports
+bloomery
+blotto
+blowback
+blowie
+blowlamp
+blub
+bludge
+bluethroat
+bluetit
+blundell
+blunge
+blunger
+boabdil
+boadicea
+boarfish
+boarhound
+boarish
+boatbill
+boathook
+bobbysoxer
+bobfloat
+boblet
+bobol
+bobotie
+bobowler
+bobsleigh
+bocage
+boccaccio
+boccherini
+boccioni
+bochum
+bocklogged
+bodensee
+bodge
+bodger
+bodgie
+bodh
+bodmin
+bodybuild
+bodycheck
+boethius
+boeuf
+bofors
+bogan
+bogarde
+bogart
+bogbean
+bognor
+bogong
+bogor
+bogtrotter
+bogwood
+boh
+bohea
+bohol
+bohunk
+boiardo
+boileau
+boilover
+bokassa
+bokmakierie
+bolection
+boleyn
+bolide
+bolingbroke
+boliviano
+bollocks
+bolzano
+boma
+bombacaceous
+bombora
+bombycid
+bomu
+bonaire
+bonaventura
+bonce
+bondservant
+boneblack
+boneshaker
+bonhoeffer
+bonin
+bonism
+bonnard
+bonsela
+bontebok
+boobialla
+boobook
+boohoo
+bookeeper
+booklouse
+boole
+boomkin
+boomslang
+boong
+boothia
+boothroyd
+bootloader
+bophuthatswana
+boracic
+boracite
+boraginaceous
+borborygmus
+bordure
+borecole
+boree
+borehole
+boreholes
+borgerhout
+borges
+borgholm
+borgia
+bornholm
+bornu
+borodino
+borrowable
+bors
+borstal
+borzoi
+boschbok
+boschvark
+bosh
+bosk
+boskop
+bossa
+bossboy
+bossuet
+bosworth
+botargo
+botha
+bothnia
+bothwell
+bothy
+botryoidal
+bott
+botticelli
+bottlebrush
+bottlenose
+bottomost
+bottrop
+botvinnik
+boucicault
+boudicca
+boulanger
+bourges
+bourgogne
+bovid
+bovril
+bovver
+bowden
+bowsaw
+bowshot
+bowyangs
+boxboard
+boxfish
+boxroom
+boyla
+boyne
+boyoma
+boysenberry
+boz
+bozen
+brabant
+brach
+brachiopod
+brachycephalic
+brachydactylic
+brachylogy
+brachypterous
+brachyuran
+bracknell
+bracteate
+bracteole
+bradawl
+bradman
+bradycardia
+bradykinin
+braga
+brahe
+braillex
+braillink
+braillo
+brailtel
+brainchildren
+brakesman
+brakpan
+bramante
+bramley
+branchiopod
+brancusi
+brando
+branle
+brasenose
+brashy
+brasier
+brasil
+brasilein
+brasilin
+brassie
+bratislava
+braunite
+braunschweig
+bravais
+bravissimo
+braxy
+brazils
+breadline
+breadmaking
+breadnut
+breadnuts
+breakbone
+breakeven
+breastpin
+breathalyse
+breathalyzer
+brecht
+brecon
+breda
+brede
+bree
+breenger
+bregenz
+brekky
+brevier
+brewis
+brey
+brezhnev
+briand
+briarroot
+bricklay
+bricole
+bridie
+bridlewise
+bridoon
+brie
+brierroot
+brigalow
+brighouse
+brightside
+brinell
+brinjal
+brinny
+briony
+brittonic
+britzka
+brix
+broadbill
+broadmoor
+broca
+broch
+brocken
+broddle
+broderie
+broederbond
+brogan
+brolga
+bromal
+brome
+bromeosin
+bromoform
+bromsgrove
+bronchia
+bronchiectasis
+bronchopneumonia
+bronchoscope
+brookite
+brooklet
+brooklime
+brookweed
+broomgrove
+broomhill
+broonzy
+brose
+browband
+broz
+brubeck
+brucine
+bruges
+bruin
+brumal
+brumby
+brume
+brummell
+brummie
+brundisium
+brunel
+brunelleschi
+brunhild
+brusa
+brushless
+brutify
+brynhild
+bryology
+bryony
+bryozoan
+btu
+bub
+bubal
+bubaline
+buber
+bubonocele
+bucaramanga
+buccinator
+bucentaur
+buchan
+buchner
+buchu
+buckeen
+buckhound
+buckish
+buckjumper
+buckra
+buckram
+bucovina
+budgerigar
+budgetted
+budgetting
+budweis
+buffon
+buganda
+bugbane
+bugong
+buhl
+buibui
+buitenzorg
+bukavu
+bukhara
+bukharin
+bukovina
+bul
+bulawayo
+bulbiferous
+bulganin
+bulimia
+bulle
+bullpen
+bullroarer
+bulnbuln
+bumbailiff
+bumf
+bummaree
+bumph
+bumsucking
+bunche
+buncombe
+bundelkhand
+bundesrat
+bundh
+bundobust
+bunin
+bunraku
+buntal
+bunyip
+buonaparte
+buonarroti
+buoyage
+buprestid
+bur
+buran
+buraydah
+burbage
+burbot
+burgas
+burghley
+burgomaster
+burgomasters
+burgrave
+burhel
+burk
+burka
+burleigh
+burnet
+burney
+burnley
+buroo
+burrawang
+bursarial
+bursiform
+burstone
+buryat
+busbar
+busera
+bushbaby
+bushcraft
+bushhammer
+bushido
+bushie
+bushpig
+bushranger
+bushtit
+bushveld
+bushwheel
+busoni
+busra
+bustee
+busuuti
+butanone
+butat
+butcherbird
+butenedioic
+butskellism
+butskellite
+butterbur
+butterine
+buttonmould
+butung
+butyrin
+buzzsaw
+byelovo
+byng
+byrnie
+byssinosis
+byssus
+bytom
+cabanatuan
+cabbageworm
+cabezon
+cabimas
+cabob
+cabochon
+cabora
+cabral
+cabretta
+cabrilla
+cachexia
+cachinnate
+cachucha
+cacique
+caciquism
+cacodyl
+cacoepy
+cacoethes
+cacology
+cacomistle
+cadaster
+cadelle
+cadi
+caecilian
+caecum
+caen
+caenozoic
+caeoma
+caerleon
+caernarfon
+caesalpiniaceous
+caesaraugusta
+caesarea
+caesium
+caespitose
+caesura
+caetano
+cafard
+caff
+cagliari
+cagliostro
+cagmag
+cagney
+cagoule
+cagoules
+caiaphas
+cainogenesis
+cainozoic
+caird
+cairngorm
+caithness
+caius
+cajeput
+cajuput
+calabria
+calalu
+calamanco
+calamondin
+calandria
+calathus
+calaverite
+calcar
+calcariferous
+calceiform
+calces
+calchas
+calcicole
+calciferol
+calcitonin
+calcsinter
+calculational
+caldarium
+calefacient
+calefactory
+cali
+calices
+caliche
+calicle
+califate
+caligula
+calimere
+calipash
+calipee
+calisaya
+calix
+callais
+callao
+callicrates
+callimachus
+callipash
+callipygian
+callisthenics
+calor
+caloyer
+calpe
+caltanissetta
+calutron
+calvaria
+calvities
+calx
+calyces
+calycine
+calycle
+calyptra
+calyptrogen
+camail
+camass
+cambay
+camberwell
+cambist
+camboose
+cambrai
+cambrel
+cambria
+cambyses
+cameral
+camerlengo
+camiknickers
+camisado
+camoodi
+campagna
+campania
+campanulaceous
+campeche
+campestral
+campina
+campinas
+campo
+camus
+camwood
+canaigre
+canakin
+canaletto
+canaliculus
+canara
+canarese
+canaster
+candia
+candleberry
+candlefish
+candlelit
+candlenut
+candlewood
+candyfloss
+candytuft
+canea
+canella
+cangue
+canikin
+cannabin
+cannae
+cannelloni
+cannelure
+cannes
+cannock
+cannula
+cannulate
+canoewood
+canonicate
+canonry
+canoodle
+canova
+canso
+cantal
+cantala
+cantatrice
+cantharides
+cantilena
+cantorial
+cantoris
+cantrip
+canula
+canzona
+canzone
+canzonet
+capabilites
+caparison
+capelin
+capercaillie
+capillaceous
+caplin
+caporetto
+capote
+cappadocia
+capparidaceous
+cappie
+cappuccino
+capreolate
+capric
+capriccioso
+caprifig
+caprifoliaceous
+caproic
+capsaicin
+capsid
+capua
+capuche
+caput
+caracal
+caracalla
+caracara
+caracul
+carageen
+caramba
+carangid
+caratacus
+caravanserai
+carbamate
+carbamic
+carbamidine
+carbanion
+carbene
+carbineer
+carbonade
+carbonado
+carboxylase
+carburation
+carburetted
+carburetter
+carby
+carbylamine
+carcajou
+carcanet
+carcassonne
+carchemish
+carcinomatosis
+cardin
+cardinalate
+cardiod
+carditis
+cardoon
+carduaceous
+carducci
+caretaking
+carew
+carfax
+carfuffle
+caria
+caribbees
+cariboo
+caries
+carifta
+carillon
+carillonneur
+carina
+carinate
+carinthia
+cariocan
+cariogenic
+carline
+carlota
+carlow
+carmagnole
+carmarthen
+carminative
+carnarvon
+carnassial
+carnatic
+carnauba
+carnet
+carnify
+carniola
+carnot
+carnotite
+carny
+carolus
+carotenoid
+carotid
+carpel
+carpentaria
+carpentier
+carpogonium
+carpology
+carpometacarpus
+carpophagous
+carpophore
+carrack
+carrycot
+carryng
+carse
+carstensz
+cartagena
+carteret
+cartful
+carthorse
+cartouche
+cartulary
+cartwright
+caruncle
+carvel
+cary
+caryatid
+caryophyllaceous
+caryopsis
+carzey
+casablanca
+casals
+casaubon
+cascabel
+cascarilla
+casease
+casebound
+casefy
+caseload
+caseloads
+caseose
+caserta
+caseworm
+casimere
+cassareep
+cassata
+cassation
+cassatt
+cassel
+cassimere
+cassini
+cassiodorus
+cassirer
+cassiterite
+cassoulet
+cassowary
+castellammare
+castellan
+castellany
+castellated
+castiglione
+castile
+castries
+casuist
+catabasis
+catacaustic
+cataclasis
+cataclinal
+catalase
+catalo
+cataloguers
+catalonia
+catalyzed
+catamenia
+catamite
+catania
+catanzaro
+cataphoresis
+cataphyll
+cataplasia
+catarrhine
+catastrophism
+catchfly
+catchweight
+catechol
+catechu
+catechumen
+catenane
+catenoid
+catfall
+cathar
+cathepsin
+catholicon
+catiline
+catling
+catmint
+cato
+cattalo
+cattegat
+cattermole
+cattery
+catullus
+cauca
+caucasia
+caudad
+caudex
+caudine
+caulis
+causalgia
+cauterant
+cauvery
+cavafy
+cavalla
+cavan
+cavatina
+caveator
+cavefish
+cavicorn
+cavie
+cavite
+cavy
+cecity
+cecum
+cedi
+ceefax
+ceilidh
+celaya
+celestite
+cella
+celle
+cellini
+cellobiose
+celloidin
+cellulase
+cellulitis
+cellulous
+celom
+cembalo
+cementum
+cenacle
+cenesthesia
+cenis
+cenogenesis
+cenote
+centimetric
+centipoise
+centisecond
+centiseconds
+centrefold
+centreing
+centrobaric
+centroclinal
+centurial
+ceorl
+cep
+cephalalgia
+cephalin
+cephalochordate
+cephalometer
+cephalonia
+cephalopod
+cephalothorax
+ceram
+ceramal
+cerargyrite
+cerastes
+ceratoid
+cercaria
+cercopithecoid
+cercus
+cerebrospinal
+cerecloth
+ceresin
+ceria
+ceric
+cermet
+cero
+cerography
+ceroplastic
+ceroplastics
+cerotic
+cerotype
+cerous
+cerro
+cert
+cerussite
+cervelat
+cervicitis
+cervid
+cervin
+cesena
+cespitose
+cess
+cesser
+cessionary
+cestode
+cestoid
+cestus
+cesura
+cetane
+cetatea
+ceteris
+cetinje
+cetology
+ceuta
+chabazite
+chabrol
+chacma
+chaconne
+chadic
+chaeronea
+chaeta
+chaetognath
+chaetopod
+chaffinch
+chagall
+chagres
+chainman
+chainplate
+chairborne
+chalaza
+chalcanthite
+chalcidice
+chalcography
+chalcolithic
+chalcopyrite
+chaldea
+chaliapin
+chalicothere
+chalkpit
+chalkstone
+challah
+challis
+chalybeate
+chamade
+chamaephyte
+chambord
+chamonix
+champac
+champignon
+champollion
+chandernagore
+chandigarh
+chandragupta
+chanel
+changan
+changchiakow
+changchow
+changchun
+changsha
+changteh
+chanterelle
+chanukah
+chaoan
+chaochow
+chaparejos
+chapatti
+chappal
+chappie
+chapstick
+chapterhouse
+charas
+charcot
+chardin
+charente
+charivari
+charkha
+charladies
+charlady
+charleroi
+charlock
+charminar
+charollais
+charpoy
+charqui
+charr
+charterage
+charterhouse
+chartless
+chartography
+chasuble
+chauffer
+chaulmoogra
+chaunt
+chausses
+chavannes
+chayote
+cheb
+cheboksary
+checkbits
+checkerbloom
+checky
+cheddite
+cheekpiece
+cheerlead
+cheeseboard
+cheesemonger
+cheesewood
+chefoo
+cheiron
+cheju
+chekiang
+chela
+chelicera
+chelicerate
+cheliform
+cheloid
+chelp
+chemin
+chemisette
+chemmy
+chemnitz
+chemometrics
+chemosmosis
+chemosphere
+chemostat
+chemosynthesis
+chemotaxis
+chemotropism
+chempaduk
+chemulpo
+chemurgy
+chenab
+chenopod
+cheribon
+chersonese
+chervonets
+cheshunt
+chetah
+chevet
+chevrette
+chewa
+chewie
+chiack
+chiapas
+chiastic
+chiastolite
+chiat
+chiba
+chibouk
+chicane
+chiccory
+chichagof
+chichen
+chichester
+chichewa
+chichihaerh
+chickabiddy
+chickenpox
+chiclayo
+chiffchaff
+chifley
+chigetai
+chigwell
+chihli
+childbear
+childcare
+childminder
+childminders
+childminding
+chiliad
+chiliasm
+chilkoot
+chilli
+chillon
+chillum
+chilopod
+chilpancingo
+chilung
+chimb
+chimborazo
+chimbote
+chimkent
+chimneypot
+chinaberry
+chinagraph
+chinan
+chincapin
+chincherinchee
+chindit
+chindwin
+ching
+chinghai
+chingtao
+chinkapin
+chinkiang
+chino
+chinwag
+chios
+chipolata
+chippewa
+chippy
+chirac
+chirau
+chirico
+chirm
+chirurgeon
+chishima
+chisimaio
+chital
+chitarrone
+chittagong
+chiv
+chivaree
+chlamydate
+chlamydeous
+chlamydospore
+chlodwig
+chloracne
+chlorambucil
+chloramine
+chloramphenicol
+chlorenchyma
+chloroacetic
+chloropicrin
+chloroprene
+chloroquine
+chlorosis
+chlorothiazide
+chlorotic
+chlorous
+chlorpromazine
+chlorpropamide
+chlortetracycline
+choanocyte
+chogyal
+choiseul
+chokebore
+chokecherry
+chokedamp
+choko
+cholecalciferol
+cholecyst
+cholecystectomy
+choli
+cholic
+cholla
+chollers
+cholon
+cholula
+chon
+chondrify
+chondriosome
+chondroma
+chondrule
+choof
+chook
+choom
+chopine
+choplogic
+choragus
+chordophone
+chorea
+choreodrama
+choriamb
+chorley
+choroid
+chorology
+chorusmaster
+chota
+chott
+chough
+choux
+chrematistic
+chresard
+chrism
+chrismatory
+chrisom
+chromatology
+chromatolysis
+chromatophore
+chromogen
+chromogenic
+chromolithograph
+chromolithography
+chromomere
+chromonema
+chromophore
+chromoplast
+chromoprotein
+chromous
+chromyl
+chronaxie
+chronobiology
+chronon
+chrysalid
+chrysarobin
+chryselephantine
+chrysoberyl
+chrysoprase
+chrysostom
+chrysotile
+chthonian
+chubb
+chubbyness
+chudskoye
+chufa
+chukar
+chukka
+chukker
+chunder
+chunderous
+chunnel
+chunter
+chupatti
+chupattis
+chuppah
+chur
+churchgo
+churchwarden
+churchwardens
+churidars
+churinga
+churr
+chuttie
+chyack
+chyle
+chyme
+chymosin
+chymotrypsin
+chymotrypsinogen
+cibber
+ciborium
+cic
+cicala
+cicatricle
+cicatrix
+cicerone
+cichlid
+cichlids
+cienfuegos
+cig
+cii
+cil
+cilice
+cilicia
+ciliolate
+cilium
+cimabue
+cimex
+cimon
+cinchonidine
+cinchonine
+cinchonism
+cine
+cineaste
+cinematheque
+cinematographs
+cineol
+cinerarium
+cinereous
+cinerin
+cingulum
+cinna
+cinnamic
+cinquain
+cinque
+cinquecento
+cinzano
+cipolin
+circassia
+circlorama
+circumbendibus
+circummartian
+circumnutate
+circumsolar
+cirenaica
+cirencester
+cirrate
+cirri
+cirripede
+cirrocumulus
+cirrose
+cirrostratus
+cirsoid
+ciscaucasia
+cisco
+ciskei
+cispadane
+cissoid
+cistaceous
+cisterna
+cistron
+cithara
+cither
+citole
+citreous
+citriculture
+citrin
+citrine
+citrulline
+cittern
+citterns
+ciudad
+civ
+civism
+clachan
+clackmannan
+clactonian
+cladded
+cladoceran
+cladode
+cladophyll
+clairaudience
+clamworm
+clamworms
+clapperboard
+clapperboards
+clapperclaw
+clarino
+claro
+clarts
+clary
+classis
+clastic
+clathrate
+claudication
+clavate
+clavicembalo
+clavicorn
+claviform
+clavius
+claymore
+claypan
+claystone
+cleanskin
+cleanthes
+clearcole
+clearstory
+clearway
+clearways
+clearwing
+cleck
+cleek
+cleethorpes
+cleg
+cleidoic
+cleisthenes
+cleistogamy
+clem
+clemenceau
+cleon
+clepsydra
+cleptomania
+clerestory
+clerihew
+clerkess
+cleruchy
+cleveite
+clianthus
+clichy
+cliffhang
+clii
+clinandrium
+clingfish
+clinkstone
+clinostat
+clinquant
+clippie
+clishmaclaver
+clisthenes
+clitellum
+clitic
+cliv
+clix
+clockmaker
+clomb
+clonus
+closedown
+cloudberry
+cloudscape
+clouet
+clough
+clovis
+clubhaul
+clubland
+clubman
+clucky
+clueless
+clumber
+cluny
+clupeid
+clupeoid
+clustan
+clusterability
+clusterable
+clvi
+clvii
+clwyd
+clxi
+clxii
+clxiv
+clxix
+clxvi
+clxvii
+clydebank
+clype
+clypeus
+clyster
+cnidarian
+cnidoblast
+cnidus
+cnossus
+cnut
+coacervate
+coachwood
+coadjutant
+coagulum
+coahuila
+coalface
+coalfield
+coalfields
+coalfish
+coalmine
+coalmines
+coalport
+coaming
+coatee
+coati
+cobaltite
+cobaltous
+cobber
+cobden
+cobnut
+coburg
+coccid
+coccidioidomycosis
+cocciferous
+coccolith
+coccyx
+cochabamba
+cochleate
+cockalorum
+cockatiel
+cockayne
+cockboat
+cockchafer
+cockcroft
+cockleboat
+cockloft
+cockneyfy
+cocksfoot
+cockspur
+cockswain
+cockup
+cocopan
+cocotte
+cocoyam
+cocteau
+codasyl
+codder
+codicology
+codominate
+codominated
+codominates
+codominating
+codswallop
+coedit
+coelacanth
+coelenterate
+coelenteron
+coeliac
+coelom
+coelostat
+coenacle
+coenobite
+coenocyte
+coenurus
+coercibility
+coessential
+coetaneous
+coeur
+coexecutor
+coextend
+coff
+cofferdam
+coggan
+coglike
+cogon
+cohabitee
+cohabitees
+cohesional
+cohobate
+cohune
+coimbatore
+coimbra
+coir
+coire
+coit
+cokuloris
+colbert
+colcannon
+colchester
+colchicine
+colcothar
+colectomy
+colemanite
+coleopteran
+coleoptile
+coleorhiza
+coles
+colet
+colewort
+coley
+colicroot
+colicweed
+coligny
+collapsar
+collarette
+collectanea
+collembolan
+collenchyma
+collisionless
+collocutor
+colloid
+collop
+collotype
+colluvium
+collywobbles
+colmar
+colocynth
+colombes
+colonitis
+colonsay
+coloquintida
+colorate
+colossae
+colossians
+colotomy
+colpitis
+colporteur
+colquhoun
+colubrid
+colubrine
+colugo
+colum
+columbarium
+columbic
+columbite
+columbium
+columbous
+columella
+columnwise
+colure
+coly
+comaneci
+comate
+comatulid
+combe
+comecon
+comedo
+comenius
+comfrey
+comines
+comitia
+commeasure
+commedia
+commendam
+commines
+commis
+commo
+commodus
+commonable
+communicatie
+comnenus
+como
+comorin
+comoro
+comp
+compadre
+compander
+companders
+compilability
+complect
+compony
+compossible
+compostela
+compotation
+comprador
+comstockery
+comte
+conan
+conation
+conative
+conatus
+concelebrate
+concensus
+concent
+concertino
+concha
+conchie
+conchiferous
+conchiolin
+conchobar
+conchoid
+conchoidal
+conchology
+condillac
+condottiere
+condyle
+condyloid
+condyloma
+confessant
+configurationism
+confirmand
+confiteor
+confiture
+conformability
+congeneric
+congius
+conglobate
+conglutinant
+congou
+congrats
+congruential
+congruentially
+conidiophore
+conidium
+coniine
+coniology
+conjuction
+connacht
+connaught
+connemara
+connexions
+conodont
+conoid
+conoscenti
+conquian
+conscionably
+consentient
+conservatoire
+conservatorium
+consett
+consocies
+consolute
+constantan
+constatation
+contactor
+contango
+contemn
+continously
+conto
+contradance
+contrasuggestible
+contrate
+contravallation
+contrayerva
+contredanse
+controllee
+controllees
+conure
+convertite
+convolvulaceous
+cooee
+cookhouse
+coolabah
+coolgardie
+coom
+cooncan
+coontie
+cooperativity
+coopt
+coordinal
+cootch
+copaiba
+copal
+copalm
+copepod
+copita
+copley
+coprolalia
+coprology
+coprophagous
+coprophilia
+coprophilous
+copygraph
+copyread
+coquelicot
+coquilla
+coquito
+coraciiform
+coracle
+coracoid
+corallite
+coralloid
+coralroot
+coranto
+corban
+corbeil
+corbicula
+corbie
+corbusier
+corby
+corcyra
+corday
+cordeliers
+cordierite
+cordillera
+cordilleras
+cordoba
+cordova
+corella
+corelli
+corf
+corfam
+corfu
+corgi
+coriaceous
+corinthians
+coriolis
+corium
+corkage
+corkwood
+cormel
+cormophyte
+corncockle
+corncrake
+corneille
+cornel
+cornelian
+cornetcy
+cornett
+cornflakes
+cornflour
+cornhusk
+corniculate
+cornmonger
+corno
+cornstone
+cornu
+cornute
+corody
+corollaceous
+coromandel
+coronach
+corot
+corozo
+correggio
+corregidor
+correlator
+corrida
+corrientes
+corrival
+corrodent
+corrody
+corrugator
+corsac
+corselet
+corsetry
+corticosterone
+corticotrophin
+cortisol
+cortot
+corunna
+corves
+corvine
+corymb
+coryphaeus
+coryza
+cosa
+cosecant
+cosech
+coseismal
+cosenza
+cosgrave
+cosignatory
+cosmine
+cosmodrome
+cosmoid
+cosmopolis
+cosmotron
+cospar
+coss
+cossie
+costard
+costate
+costermonger
+costotomy
+costrel
+cotan
+cotemporary
+cotenant
+coterminosity
+coth
+cothurnus
+cotidal
+cotonou
+cotopaxi
+cotquean
+cotswold
+cotswolds
+cottbus
+cottian
+cottonade
+cottonweed
+cotyloid
+coucal
+couchant
+couchette
+coulee
+coulibiaca
+couloir
+coulometer
+coulometers
+coumarin
+coumarone
+counterattraction
+counterblast
+countercharge
+counterculture
+counterfactual
+counterglow
+counterinsurgency
+counterposition
+counterproof
+countershade
+countershaded
+countershades
+countershading
+countersubject
+countertype
+counterweigh
+counterword
+counterwork
+courante
+courantyne
+courbet
+courbevoie
+coureur
+courgette
+courlan
+coursework
+courtelle
+courtrai
+couthie
+couvade
+coverdale
+coverley
+coversed
+covin
+cowberry
+cowbind
+cowes
+cowfish
+cowherb
+cowitch
+cowk
+cowley
+cowpat
+cowper
+cowskin
+coxa
+coxalgia
+coxcombry
+coxsackie
+coxswain
+coyotillo
+coz
+crabbe
+crabmeat
+crabstick
+crackbrain
+crackbrained
+cracket
+crackjaw
+cracknel
+cracksman
+cracow
+craddock
+cradlesong
+craigie
+craiova
+crake
+crambo
+cramoisy
+cran
+cranach
+cranage
+cranesbill
+craniology
+craniometer
+craniometry
+craniotomy
+cranko
+crankpin
+cranmer
+crannog
+cranwell
+crapaud
+crapulent
+craquelure
+crashable
+crashaw
+crasis
+crassulaceous
+crassus
+cratch
+craunch
+crawley
+cray
+creamcups
+creamlaid
+creatine
+creatinine
+credendum
+creel
+creels
+creepie
+cremator
+cremona
+crenel
+creodont
+creophagous
+crepitus
+cressy
+cresylic
+creuse
+crewe
+cribellum
+cricoid
+crikey
+crim
+crimmer
+crimple
+crimplene
+cringle
+crinite
+crinkleroot
+criollo
+cripes
+crippen
+cripps
+criseyde
+crispate
+crispation
+crispbread
+crispi
+crissum
+crista
+cristate
+cristobalite
+croce
+crocein
+crocidolite
+crocoite
+croesus
+crombec
+cromlech
+cronk
+cronus
+crosier
+crossbeam
+crosscheck
+crosse
+crossfire
+crosshead
+crossjack
+crossopterygian
+crosspool
+crossruff
+crosstabulate
+crosstabulation
+crosstie
+crossties
+crotone
+crotonic
+croute
+crowboot
+crownpiece
+crownwork
+croze
+crozier
+cru
+cruces
+crucian
+cruck
+cruiserweight
+cruiseway
+crumhorn
+crummock
+crunode
+crura
+crural
+crus
+crusado
+cruse
+cruyff
+cruzado
+cruzeiro
+crwth
+cryer
+cryocable
+cryohydrate
+cryometer
+cryophyte
+cryoplankton
+cryptaesthesia
+cryptanalyze
+cryptoclastic
+cryptocrystalline
+cryptogam
+cryptozoic
+cryptozoite
+crystallographica
+ctenidium
+ctenoid
+ctenophore
+ctesiphon
+cubane
+cubeb
+cubiculum
+cubital
+cucking
+cuckooflower
+cuckoopint
+cuculiform
+cudbear
+cudgerie
+cudweed
+cuenca
+cuernavaca
+cuesta
+cufic
+cuirass
+cuirassier
+cuisse
+culch
+culebra
+culet
+culicid
+cullet
+cullis
+culloden
+cully
+culm
+culmiferous
+cultrate
+culverin
+cum
+cumae
+cumber
+cumbernauld
+cumbria
+cummerbund
+cumquat
+cumshaw
+cumulet
+cumuliform
+cumulonimbus
+cumulostratus
+cunaxa
+cuneal
+cuneo
+cunjevoi
+cupel
+cuppa
+cuprum
+curacy
+curare
+curarine
+curassow
+curch
+curiosa
+curitiba
+curlpaper
+currajong
+currawong
+currycomb
+curtin
+curzon
+cusco
+cusec
+cush
+cushat
+cusk
+cuso
+customable
+custos
+custumal
+cutcherry
+cuticula
+cutin
+cutis
+cuttack
+cuttle
+cutty
+cuvette
+cuxhaven
+cuyp
+cuzco
+cwmbran
+cyan
+cyanamide
+cyanine
+cyanite
+cyanocobalamin
+cyanogen
+cyanohydrin
+cyanosis
+cyanotype
+cybele
+cyber
+cybernate
+cyclamen
+cyclicity
+cycloalkane
+cyclograph
+cycloheptatrienyl
+cyclohexane
+cyclohexyl
+cyclonite
+cycloparaffin
+cyclopedia
+cyclopentadienyl
+cyclopentane
+cycloplegia
+cyclopropane
+cyclosis
+cyclostome
+cyclostyle
+cyclothymia
+cyclotomy
+cyder
+cydnus
+cylindroid
+cylix
+cyma
+cymar
+cymatium
+cymbalo
+cyme
+cymene
+cymogene
+cymograph
+cymoid
+cymophane
+cymose
+cymru
+cynghanedd
+cyperaceous
+cyprinid
+cyprinodont
+cyprinoid
+cypsela
+cyrenaica
+cyrene
+cystectomy
+cysticercoid
+cystine
+cystitis
+cystocarp
+cystocele
+cystoid
+cystolith
+cystoscope
+cystotomy
+cythera
+cytidine
+cytochemical
+cytochemically
+cytochrome
+cytogenesis
+cytogenetics
+cytokinesis
+cyton
+cytoplast
+cytotaxonomy
+cyzicus
+czardas
+czarevna
+dabchick
+dabster
+dace
+dacha
+dachau
+dachsund
+dacia
+dacoit
+dacoity
+dacron
+dactylogram
+dactylography
+dactylology
+dado
+dadra
+dagan
+dagga
+daggerboard
+dagoba
+dagon
+daguerre
+dahna
+daimyo
+dairen
+daisycutter
+dak
+dal
+daladier
+dalai
+dalasi
+dalesman
+dalhousie
+dallapiccola
+dalmatia
+damietta
+damodar
+dampcourse
+dampier
+damselfish
+dandie
+dandiprat
+daraf
+darbies
+dardanelles
+dardanus
+daresbury
+darfur
+darg
+dargah
+daric
+dario
+dariole
+darkend
+darlan
+darmstadt
+darnel
+darnley
+darogha
+dartboard
+dasheen
+dashiki
+dashpot
+dassie
+dasyure
+databank
+datary
+datatype
+datcha
+dato
+datolite
+datuk
+daube
+daubery
+daubigny
+daudet
+daugava
+daugavpils
+daumier
+davao
+daw
+dawes
+dayak
+dayan
+dayboy
+dayfile
+dayflower
+dayfly
+dayspring
+deaconry
+deadstarting
+deakin
+dealfish
+dearchive
+dearchived
+dearchives
+dearchiving
+deary
+deassignment
+deathtrap
+debag
+debarred
+debe
+debrecen
+debs
+debus
+debye
+decanal
+decane
+decanedioic
+decani
+decanoic
+decapolis
+decarboxylation
+decastyle
+deccan
+decelerometer
+decemvirate
+decenary
+decentralist
+decern
+decimetric
+decisionmaker
+declinometer
+declog
+declogged
+declogging
+declogs
+decluster
+declustered
+declustering
+declusters
+declutch
+declutched
+declutches
+declutching
+decoke
+decompound
+deconstruct
+decreet
+decubitus
+decurion
+decurrent
+decury
+dedal
+deek
+deemster
+deergrass
+deerhound
+deferable
+defilade
+definiendum
+definiens
+deflocculate
+degassed
+degasses
+deglutinate
+deglutition
+degression
+degust
+dehisce
+dehiscent
+dehorn
+dehra
+dehydrogenase
+dehydrogenate
+dehydroretinol
+deianira
+deicide
+deictic
+deific
+deiform
+deil
+deipnosophist
+deixis
+dejecta
+dekker
+dekko
+delacroix
+delagoa
+delaine
+delaunay
+dele
+deledda
+delegatory
+delgado
+delimeter
+delimeters
+deliquescence
+delitescence
+deltiology
+demavend
+deme
+dement
+demerara
+demesne
+demeter
+demibastion
+demicanton
+demilune
+demimondaine
+demimonde
+demirel
+demirelief
+demirep
+demisemiquaver
+demist
+demivierge
+demivolt
+demob
+democritus
+demoiselle
+demonism
+demonolater
+demonolatry
+demould
+demoulded
+demoulding
+demoulds
+dempster
+demulsify
+demy
+denarius
+denary
+dendral
+dendrochronologist
+dendrochronologists
+dendrochronology
+dendrogram
+dendrograms
+dengue
+denitrate
+deniz
+denning
+dentex
+dentilabial
+dentilingual
+dentoid
+denudate
+deodand
+deodar
+deontic
+deoxygenate
+departmentalism
+depasture
+dependant
+dependants
+depicture
+deplume
+depressomotor
+depside
+depurative
+deraign
+derailleur
+derain
+derbent
+deregister
+deregulatory
+derestrict
+derisible
+dermatitis
+dermatogen
+dermatoglyphics
+dermatome
+dermatophyte
+dermatophytosis
+dermatoplasty
+dermis
+dermoid
+dero
+derringer
+derry
+derv
+derwent
+derwentwater
+desai
+desalinate
+deschamps
+deschool
+descriptional
+descriptivism
+deselect
+deselected
+deselecting
+deselection
+deselections
+deselects
+desicate
+designational
+desinence
+deskill
+deskilled
+deskilling
+desman
+desmid
+desmoid
+desmoulins
+despenser
+despoilation
+despoliation
+despumate
+desquamate
+dessalines
+dessau
+dessertspoon
+dessiatine
+dessicator
+dessicators
+deterge
+detmold
+detrend
+detrended
+detrending
+detrends
+detrition
+detrude
+detruncate
+deurne
+deuteragonist
+deuteranope
+deuteride
+deuterogamy
+deutoplasm
+deutsch
+deva
+devanagari
+deventer
+devi
+devilfish
+dewan
+dewberry
+dewclaw
+dewsbury
+dextran
+dextrin
+dextroamphetamine
+dextroglucose
+dextrogyrate
+dextrorotation
+dextrorse
+dezhnev
+dhahran
+dhak
+dharna
+dhaulagiri
+dhobi
+dhole
+dhoti
+dhow
+diablerie
+diabolo
+diacaustic
+diacetylmorphine
+diacid
+diacidic
+diactinic
+diadelphous
+diadic
+diaeresis
+diagenesis
+diageotropism
+diaghilev
+diagraph
+diallage
+dialogism
+diamantine
+diamegnetism
+diamine
+diamondback
+diandrous
+dianetics
+dianoetic
+dianoia
+diapedesis
+diapente
+diaphoresis
+diaphoretic
+diaphototropism
+diaphysis
+diapir
+diarch
+dias
+diascope
+diastalsis
+diastase
+diastasis
+diastema
+diastyle
+diatessaron
+diathermancy
+diazine
+diazo
+diazole
+diazomethane
+diazonium
+dibasic
+dibbuk
+dibranchiate
+dibromide
+dicarbonyl
+dicast
+dicephalous
+dichasium
+dichlamydeous
+dichloroethanol
+dichromaticism
+dichromic
+dichroscope
+diclinous
+dicuss
+dicynodont
+diderot
+didgeridoo
+didymium
+didymous
+didynamous
+dieback
+diecious
+diefenbaker
+dien
+diencephalon
+dieppe
+diesis
+diestock
+diestrus
+diffusivity
+digamy
+digestant
+digged
+dight
+digitalism
+digitiform
+digitoxin
+digitron
+dihydric
+dihydrofolate
+dikkop
+diktat
+dilatancy
+dilatant
+dilly
+dimashq
+dimenhydrinate
+dimercaprol
+dimethylformamide
+dimethylpropane
+dimethylsulphoxide
+dimetric
+dimissory
+dimity
+dimorph
+dinar
+dineric
+dinge
+dinitrobenzene
+dinitrogen
+dink
+dinkum
+dinky
+dinoflagellate
+dinothere
+dio
+diodorus
+dioestrus
+diol
+diomede
+diomedes
+dionysius
+diophantus
+diopside
+dioptase
+dior
+dioxan
+dipeptide
+dipetalous
+diphenylamine
+diphenylhydantoin
+diphosgene
+diphyletic
+diphyllous
+diphyodont
+diplegia
+diploblastic
+diplocardiac
+diplococcus
+diplont
+diplopia
+diplopod
+diplosis
+diplostemonous
+dipnoan
+dippy
+diprotodont
+dipteral
+dipteran
+dipterocarpaceous
+dipterous
+diriment
+dirk
+dirndl
+disaccredit
+disafforest
+disbranch
+disbud
+discalced
+disciplinant
+disciplinarianism
+disclimax
+discobolus
+discommodity
+discommon
+disconsider
+discotheque
+discovert
+disembogue
+disembroil
+disenable
+disentail
+disentitle
+disentomb
+disentwine
+disepalous
+disforest
+dishpan
+dishtowel
+disject
+disjunctor
+disjunctors
+disoperation
+dispend
+dispermous
+dispersability
+dispersable
+dispersity
+dispersoid
+displayable
+disproven
+dissappear
+disseminule
+dissentious
+dissepiment
+distich
+distichous
+distrainee
+distringas
+distrito
+distrubuted
+disulfiram
+disulphate
+disulphide
+disulphuric
+dita
+ditheism
+dithionite
+dithionous
+dithyramb
+dithyrambic
+dittander
+dittany
+dittography
+diu
+diuresis
+diuretic
+div
+divaricator
+diversiform
+diverticulitis
+diverticulosis
+diverticulum
+divi
+divinylbenzene
+divisibly
+divulgate
+diyarbakir
+dizen
+djailolo
+djaja
+djajapura
+djambi
+djebel
+djerba
+djinni
+djokjakarta
+doab
+dobby
+dobla
+dobro
+dobruja
+dobsonfly
+dockland
+docklands
+doddle
+dodecagon
+dodecanese
+dodecanoic
+dodecaphonic
+dodecasyllable
+dodgem
+dodoma
+doek
+doenitz
+doeskin
+dogfishs
+dogger
+doggo
+dogman
+dogsbody
+dogvane
+dogy
+doh
+doha
+dojo
+dolabriform
+dolby
+dolerite
+dolichocephalic
+doline
+dollarbird
+dollarfish
+dollfuss
+dolman
+dolmas
+dolmen
+dolmetsch
+dolorimetry
+doloroso
+dom
+domett
+dominee
+dominie
+dominium
+dominoes
+donatello
+donatus
+donau
+donbass
+donga
+donjon
+donne
+donnert
+donny
+doodah
+doorframe
+doorn
+doornik
+dopa
+dordogne
+dordrecht
+dormobile
+dornbirn
+dornick
+dorp
+dorpat
+dorsad
+dorsiferous
+dorsigrade
+dorsiventral
+dorsoventral
+dorsum
+dort
+dorty
+dory
+dosshouse
+dost
+dotation
+dottle
+douai
+douala
+douay
+doublure
+doubs
+douc
+douceur
+doukhobors
+doum
+doura
+dourine
+douro
+douroucouli
+dovap
+dowable
+dowding
+dowery
+downcome
+downcomer
+downhole
+downpatrick
+downpipe
+downthrow
+downwash
+downweight
+downweighted
+downweighting
+downwell
+dowsabel
+doxastic
+doxographer
+doxology
+doxy
+doyen
+doyley
+drabbet
+draff
+draggletailed
+draghound
+dragoman
+dragonnade
+dragonroot
+dragrope
+drail
+dramatis
+drammen
+drancy
+drava
+drayhorse
+dree
+dreggy
+dreich
+dreiser
+drenthe
+dresden
+drillstock
+drin
+drinkwater
+dripstone
+drogheda
+drogue
+droit
+dromond
+drongo
+drongos
+droob
+dropsonde
+droshky
+druffen
+drunkeness
+drupelet
+dryopithecine
+drysdale
+drystone
+dubai
+dubbin
+dubrovnik
+dubuffet
+duccio
+duchamp
+dudeen
+duello
+duero
+dufy
+duhamel
+duiker
+duka
+dukhobors
+dulciana
+dulia
+dulosis
+dumas
+dumbell
+dumbells
+dumfries
+dumortierite
+dumyat
+duna
+dunaj
+dunant
+dundalk
+dundee
+dunfermline
+dungas
+dungeness
+dunite
+duniwassal
+dunkerque
+dunlin
+dunnage
+dunnakin
+dunnite
+dunno
+dunnock
+dunny
+dunois
+dunoon
+dunsany
+dunsinane
+dunstable
+dunstan
+dunt
+duntroon
+dunwoody
+duodenary
+duodenitis
+duotone
+dup
+duparc
+dupatta
+dupleix
+duplet
+dupondius
+duppy
+duque
+duramen
+durative
+durazzo
+durbar
+durex
+durgah
+durian
+durmast
+duro
+durra
+durst
+durum
+durzi
+dushanbe
+dustability
+dustable
+dustcart
+dustcarts
+dustmen
+dustsheet
+dustsheets
+duumvir
+duumvirate
+duvalier
+duvet
+dux
+dwale
+dybbuk
+dyfed
+dykes
+dynameter
+dynamicism
+dynamoelectric
+dyscrasia
+dysgraphia
+dysmenorrhoea
+dysphemism
+dyspnoea
+dysteleology
+dysthymia
+dysuria
+dytiscid
+dyula
+ealdorman
+ealing
+eanes
+earbash
+earhart
+earlap
+earless
+earom
+earthlight
+earthman
+earthmove
+earthnut
+earthrise
+eastmost
+eatage
+eblis
+ebon
+ebonite
+ebracteate
+ebullioscopy
+eburnation
+ecbatana
+ecbolic
+ecce
+ecchymosis
+ecclesall
+ecclesia
+ecclesiolatry
+eccrinology
+ecdysone
+ecevit
+echard
+echinate
+echinococcus
+echinoid
+echinus
+echoism
+echolalia
+echopraxia
+echovirus
+eck
+eckhart
+eclampsia
+eclipsis
+eclogite
+ecocide
+ecowas
+ecstacy
+ecthyma
+ectocrine
+ectoenzyme
+ectophyte
+ectopia
+ectoproct
+ectosarc
+ectype
+edale
+edam
+eddo
+eddystone
+ede
+edessa
+edgehill
+edgeworth
+edile
+edirne
+edom
+educatory
+educt
+eelpout
+eelworm
+eff
+effable
+effendi
+efficency
+effusiometer
+efta
+eftsoons
+egest
+egesta
+egis
+eigenfrequencies
+eigenfrequency
+eigenstructure
+eigensystem
+eigensystems
+eiger
+eightsome
+eirenic
+eirenicon
+eisegesis
+eisk
+elaeoptene
+elagabalus
+elam
+eland
+elasmobranch
+elasmosaur
+elastance
+elasticate
+elasticated
+elasticates
+elasticating
+elastoplast
+elat
+elaterid
+elaterin
+elaterium
+elbe
+elbrus
+elburz
+eld
+eldo
+eldritch
+elea
+elecampane
+electrochemist
+electrochemists
+electrograph
+electromerism
+electronvolt
+electrophone
+electrostriction
+electrotechnology
+electrotonus
+electrovalency
+electroviscous
+eleemosynary
+eleia
+elemi
+elenchus
+eleoptene
+eleusis
+elevon
+elflock
+elgon
+elidible
+elis
+elkhound
+eloign
+elsan
+elusion
+elyot
+embolectomy
+embolus
+embow
+embrectomy
+embryectomy
+embus
+emden
+emesis
+emetine
+emf
+emiscan
+emmen
+emmenagogue
+emmer
+emmetropia
+emotivism
+empale
+empassion
+empedocles
+emphasing
+empolder
+empyema
+empyrean
+empyreuma
+emulsoid
+enantiomorph
+enarthrosis
+enate
+encaenia
+enceladus
+encephalin
+encephalograph
+encephalography
+encephaloma
+encephalomyelitis
+enchiridion
+enchondroma
+enchorial
+encomiast
+encrinite
+enculturation
+enderby
+endo
+endocarditis
+endocardium
+endocarp
+endocentric
+endocranium
+endoneurium
+endopeptidase
+endosome
+endostosis
+endothecium
+endothelioma
+endothelium
+endover
+endplate
+endplay
+energid
+energumen
+enface
+enfeoff
+enfilade
+enforcable
+engadine
+engrail
+eniwetok
+ennage
+ennead
+enneagon
+enneahedron
+ennerdale
+ennervation
+ennis
+enniskillen
+ennius
+enosis
+enounce
+enow
+enphytotic
+enschede
+ensor
+entasis
+entebbe
+entelechy
+entellus
+enteritis
+enterogastrone
+enterokinase
+enteron
+enterostomy
+enterotomy
+enterovirus
+enthetic
+enthymeme
+entoblast
+entomic
+entomostracan
+entophyte
+entopic
+entozoic
+entozoon
+entrammel
+entrechat
+entremets
+entresol
+entryism
+entryist
+entryists
+entryname
+entrynames
+entrypoint
+entrypoints
+enugu
+enure
+enuresis
+enver
+enwomb
+enwreath
+enzed
+enzootic
+enzymolysis
+eobiont
+eogene
+eolian
+eolic
+eolipile
+eolith
+eolithic
+eonian
+eos
+eosin
+eosinophil
+epact
+epaminondas
+eparch
+eparchy
+epencephalon
+epenthesis
+epergne
+epexegesis
+ephah
+ephebe
+ephemeron
+ephesians
+ephod
+ephor
+epiblast
+epiboly
+epicalyx
+epicanthus
+epicedium
+epiclesis
+epicontinental
+epicotyl
+epicrisis
+epicritic
+epictetus
+epicycloidal
+epidaurus
+epideictic
+epidiascope
+epididymis
+epidote
+epidural
+epifocal
+epigastrium
+epigeal
+epigene
+epigenous
+epigeous
+epiglottis
+epigone
+epigynous
+epilate
+epileptoid
+epilimnion
+epimere
+epimerism
+epimorphosis
+epimysium
+epinasty
+epinephrine
+epineurium
+epiphenomenalism
+epiphenomenon
+epiphragm
+epiphytotic
+epirogeny
+epirus
+episcopacy
+episematic
+epispastic
+epistasis
+epistaxis
+episternum
+epithalamium
+epithelioma
+epizoic
+epizoon
+epizootic
+eponym
+eponymy
+epos
+epoxide
+epping
+eprom
+eproms
+epyllion
+equifrequent
+equifrequently
+equilibrant
+equimolecular
+equipartition
+equites
+equuleus
+eradiate
+erciyas
+erebus
+eremite
+erepsin
+erethism
+erevan
+erfurt
+ergastoplasm
+ergatocracy
+erhard
+ericaceous
+eridanus
+erinaceous
+eringo
+erinyes
+eris
+eristic
+erith
+erivan
+erk
+erlang
+erlangen
+erlanger
+erlking
+erne
+erotema
+erotology
+erotomania
+errhine
+errupt
+erruptive
+erst
+erubescence
+eruct
+erumpent
+erymanthus
+eryngo
+erysipelas
+erysipeloid
+erythema
+erythrism
+erythrite
+erythritol
+erythroblast
+erythroblastosis
+erythrocyte
+erythrocytometer
+erythromycin
+erythropoiesis
+erzgebirge
+erzurum
+esaki
+esau
+esbjerg
+escalope
+escaut
+eschalot
+escharotic
+eschatology
+escoffier
+escolar
+escribe
+escuage
+escudo
+escurial
+esdraelon
+eserine
+esher
+esky
+espalier
+esparto
+espoo
+esquimau
+esro
+essaouira
+essequibo
+essonite
+essonne
+estancia
+este
+esterase
+esterify
+esthonia
+estienne
+estipulate
+estival
+estivate
+estivation
+estoppel
+estovers
+estrade
+estradiol
+estragon
+estreat
+estremadura
+estrin
+estriol
+etaerio
+etalon
+etamine
+etaoin
+etchant
+eteocles
+eterne
+etesian
+ethene
+etherege
+etherify
+ethmoid
+ethnarch
+ethnobotany
+ethnogeny
+ethonone
+ethoxide
+ethoxyethane
+ethylbenzene
+ethyne
+etiolate
+etna
+etymon
+etzel
+eubacteria
+euboea
+eucaine
+eucalyptol
+euchlorine
+euchromatin
+eucken
+eudemon
+eudemonia
+eudemonics
+eudiometer
+eudoxus
+eugenol
+eulachon
+eulogia
+eupatrid
+eupen
+eupepsia
+euphausiid
+euphonic
+euphorbiaceous
+euphoriant
+euphrasy
+euphroe
+euploid
+eupnoea
+euratom
+eure
+eurhythmy
+euripus
+eurypterid
+eurythermal
+eurytropic
+eusebius
+eusporangiate
+eutectoid
+euxenite
+evacuant
+evaginate
+evanish
+evaporable
+evaporimeter
+evaporimeters
+evite
+exanthema
+exarate
+exarch
+exarchate
+excaudate
+exclaustration
+exeat
+executability
+exedra
+exemplum
+exequatur
+exequies
+exergue
+exigible
+eximious
+exine
+exitance
+exo
+exocarp
+exocentric
+exoderm
+exodontics
+exonym
+exopeptidase
+exophthalmic
+exophthalmos
+exoplasm
+exorable
+exosystem
+exosystems
+exotoxin
+expellant
+experientialism
+explicite
+explicitely
+explicity
+explictly
+exponible
+expressivity
+expresso
+exsanguine
+exsect
+exstrophy
+extention
+extentions
+extine
+extinguishant
+extracanonical
+extrados
+extraposition
+extremadura
+exuviae
+exuviate
+eyas
+eyebath
+eyeblack
+eyehook
+eyeleteer
+eyetie
+eyot
+eyots
+eyra
+eyrir
+eysenck
+fab
+fabaceous
+fabians
+fabius
+fabliau
+fabre
+facebar
+facetiae
+facia
+facilties
+faculae
+fadden
+fadge
+faecal
+faeces
+faenza
+faeroes
+faeroese
+faff
+fagaceous
+fahlband
+faial
+faille
+fairbanks
+fairweather
+fairyfloss
+faiyum
+falbala
+falchion
+falconiform
+falconine
+faldstool
+falerii
+fallal
+fallfish
+falseties
+falsety
+falsework
+falsies
+falster
+faltboat
+falun
+famagusta
+familist
+famulus
+fanagalo
+fandangle
+fanfani
+fanfaronade
+fangio
+fango
+fankle
+fanon
+fantail
+fantasm
+fantast
+fantoccini
+fantom
+faqir
+faradic
+faradism
+farandole
+farci
+farcy
+fard
+fardel
+farinaceous
+farinose
+farl
+farrier
+farriery
+farside
+fart
+fasciate
+fascine
+fash
+fashoda
+fastback
+fastigiate
+fatah
+fatidic
+faucal
+fauces
+faugh
+faunus
+fauteuil
+fauve
+faveolate
+favrile
+favus
+fayalite
+fayum
+feal
+fearnought
+featheredge
+featherstitch
+feaze
+febricity
+febrifacient
+febrifuge
+fechner
+feck
+fecula
+fedayee
+feedbag
+feeze
+feininger
+felafel
+fellmonger
+felloe
+felo
+felucca
+fencible
+fenestella
+fenestra
+fennelflower
+feoff
+feoffee
+feoffment
+ferbam
+fere
+feretory
+fergana
+feria
+fermanagh
+fernandel
+ferrari
+ferreous
+ferricyanic
+ferricyanide
+ferritin
+ferrocene
+ferrochromium
+ferroconcrete
+ferrocyanic
+ferrocyanide
+ferrofluid
+ferrol
+ferromagnesian
+ferromanganese
+ferrosilicon
+ferula
+ferule
+fesse
+festal
+festschrift
+fetial
+feticide
+fetiparous
+fetterlock
+feverfew
+feverwort
+feydeau
+fiacre
+fibrefill
+fibriform
+fibrinogen
+fibrinolysin
+fibrinolysis
+fibrinous
+fibro
+fibroblast
+fibrocement
+fibroid
+fibroin
+fibroma
+fibrositis
+fichte
+ficino
+ficticious
+fid
+fiddlewood
+fideicommissary
+fideicommissum
+fidelism
+fidge
+fidus
+fieldmouse
+fieldpiece
+fieldsman
+fieri
+fiesole
+fifa
+figuline
+figurant
+figwort
+filable
+filariasis
+filecard
+filefish
+filespace
+filestore
+filiate
+filicide
+fillagree
+fillmore
+filmset
+filmsetting
+filoplume
+filose
+filoselle
+fimble
+finable
+finalism
+finchley
+fineable
+finfoot
+fingerbreadth
+fingermark
+fingermarked
+fingermarking
+fingermarks
+fingerstall
+fingerstalls
+fingo
+finisterre
+finitary
+finnan
+finner
+finney
+finnmark
+fino
+finochio
+fiorin
+fipple
+firdausi
+fireback
+firebomb
+firebrat
+firecrest
+firedog
+firedrake
+firenze
+firepan
+firestorm
+firethorn
+firewarden
+firewater
+firkin
+firry
+fishbolt
+fishfinger
+fishgig
+fishskin
+fissipalmate
+fissiped
+fissirostral
+fistmele
+fistula
+fistulous
+fitchew
+fittipaldi
+fitzsimmons
+fiume
+fivepenny
+fivepins
+fizgig
+flabellum
+flagelliform
+flagellum
+flaggy
+flagrante
+flagstad
+flambeau
+flamborough
+flamelet
+flamelets
+flamingoes
+flamininus
+flaminius
+flamsteed
+flanch
+flannelette
+flashcube
+flashcubes
+flasket
+flatette
+flatfish
+flatfishes
+flatlet
+flatlets
+flatling
+flatmate
+flatmates
+flatways
+flaubert
+flaunch
+flavescent
+flavin
+flavine
+flavone
+flavoprotein
+flavopurpurin
+flavorous
+flaxman
+fleabite
+fleabites
+fleam
+fleapit
+fleapits
+fledgy
+flense
+fleurette
+fleury
+flexitime
+flexo
+fley
+fleysome
+flinders
+flitch
+flite
+floccose
+flocculant
+flocculants
+flocculent
+flocculus
+floccus
+flodden
+flong
+floreated
+flores
+florey
+floribunda
+florilegium
+florio
+flory
+flos
+flotow
+flowability
+flowerbed
+flowerless
+fluorene
+fluoric
+fluorometer
+fluorophore
+fluoroscope
+fluoroscopy
+fluorosis
+fluorosulphuric
+fluviomarine
+fluxmeter
+fluxmeters
+flyback
+flyblow
+flybook
+flyleaves
+flyte
+flytrap
+flytraps
+foch
+fock
+foehn
+foetal
+foetation
+foeticide
+foetor
+fogbow
+fogbows
+fogdog
+foggia
+foie
+foin
+folacin
+foliar
+folie
+foliolate
+foliose
+foliot
+foliots
+folium
+folkestone
+folketing
+folkmoot
+folliculin
+folsom
+fonda
+fondant
+fondants
+fonseca
+fontanelle
+fonteyn
+footpaths
+footplate
+footplates
+footsie
+footslogged
+footslogging
+footstalk
+footstock
+footworn
+foramen
+foraminifer
+forasmuch
+forby
+forcemeat
+fordone
+forecourse
+forecourt
+forecourts
+foredo
+foredoom
+foredoomed
+forefend
+foregut
+forehock
+foreshock
+forespent
+forestaysail
+foretooth
+foretop
+foretriangle
+forewent
+forewind
+forewing
+forfar
+forficate
+forgat
+forint
+forme
+formfeed
+formfeeds
+formicary
+formicate
+formication
+formulism
+formwork
+fornenst
+fornix
+forsee
+forseen
+forspeak
+forster
+forsterite
+fortaleza
+fortepiano
+fortis
+fortissimo
+fortuitism
+fortuna
+forwhy
+forzando
+fosbury
+fossa
+fosse
+fossette
+fossick
+fotheringhay
+foucault
+foucquet
+foulard
+fourpence
+fourpenny
+foveola
+fowey
+fowliang
+foxfire
+foyboat
+fractocumulus
+fractostratus
+frae
+fraenum
+fragonard
+fraise
+fraktur
+framboesia
+francolin
+franger
+frangipane
+frankalmoign
+frass
+fratchy
+fraxinella
+freebie
+freedomites
+freelance
+freemartin
+freemason
+freesheet
+freesheets
+freightliner
+fremantle
+fremitus
+frenulum
+frenum
+friarbird
+fricasee
+fringilline
+frippet
+frisket
+froe
+froebel
+frogfish
+frogged
+frogging
+froghopper
+frogmarch
+frogmouth
+frogspawn
+froissart
+frome
+fromenty
+fromm
+fronde
+frondescence
+frons
+frontenac
+frontlet
+frontogenesis
+frontolysis
+frontrunner
+frontwards
+frore
+froude
+frow
+frowst
+fructiferous
+frugivorous
+fruitarian
+frumentaceous
+frumenty
+frunze
+frustule
+frutescent
+fuad
+fubsy
+fuchsin
+fuckwit
+fucoid
+fugacious
+fugard
+fugato
+fugger
+fugio
+fukien
+fukuda
+fukuoka
+fukushima
+fula
+fulani
+fulgurite
+fulmar
+fulminic
+fulminous
+fulvous
+fumaric
+fumatorium
+fumatory
+fumitory
+funchal
+fundi
+fundus
+fundy
+funfair
+fungistat
+funicle
+furan
+furfur
+furfuraceous
+furfuraldehyde
+furfuran
+furioso
+furmenty
+furnivall
+furphy
+furred
+fusain
+fuscous
+fushih
+fushun
+fusionism
+fustanella
+fustic
+futtock
+futurist
+futurists
+futurology
+fuzzily
+fyke
+fylde
+fylfot
+fyn
+fyrd
+gabar
+gabelle
+gaberlunzie
+gabion
+gabionade
+gablet
+gabo
+gabor
+gaborone
+gaby
+gaddafi
+gadhelic
+gadid
+gadoid
+gadolinite
+gadroon
+gadsden
+gaea
+gaekwar
+gaffsail
+gagauzi
+gahnite
+gaikwar
+gaillard
+gaiseric
+gaitskell
+gaius
+galactagogue
+galactometer
+galactopoietic
+galah
+galangal
+galantine
+galanty
+galashiels
+galata
+galatians
+galba
+galbanum
+galbraith
+galea
+galileo
+galimatias
+galingale
+galiot
+galipot
+galle
+galleass
+gallfly
+gallia
+galliambic
+galliard
+gallice
+galligaskins
+gallimaufry
+gallinacean
+gallinaceous
+gallinas
+galliot
+gallipoli
+gallipot
+galliwasp
+gallnut
+galloglass
+galloon
+galloot
+gallous
+galoot
+galop
+galsworthy
+galvani
+galvanoscope
+galvanostat
+galvanotropism
+galvo
+galyak
+gama
+gamba
+gambado
+gambrel
+gambrinus
+gamelan
+gamesman
+gametangium
+gametocyte
+gametogenesis
+gametophore
+gametophyte
+gammadion
+gammer
+gamogenesis
+gamopetalous
+gamophyllous
+gamosepalous
+gamp
+gan
+gance
+gand
+gandalf
+gandhi
+gandy
+gandzha
+ganesa
+gangbang
+gangrel
+gangtok
+gangue
+ganister
+ganja
+ganof
+ganoid
+gansey
+gapeworm
+gapped
+garam
+garand
+garbanzo
+garbo
+garboard
+garboil
+gard
+garda
+gardant
+garderobe
+gardiner
+garfish
+garganey
+garget
+garnierite
+garonne
+garpike
+garrick
+gasconade
+gaselier
+gasiform
+gaskell
+gaskin
+gasman
+gasohol
+gasometry
+gasteropod
+gastralgia
+gastroenteric
+gastroenteritis
+gastroenterology
+gastroenterostomy
+gastrolith
+gastrology
+gastropod
+gastroscope
+gastrostomy
+gastrotomy
+gastrotrich
+gastrovascular
+gastrula
+gatehouse
+gatekeep
+gateshead
+gath
+gatling
+gatt
+gauffer
+gaugeing
+gauhati
+gaumless
+gauntry
+gaup
+gaussmeter
+gautama
+gautier
+gavage
+gavial
+gawp
+gaya
+gayomart
+gazankulu
+gazehound
+gaziantep
+gazump
+gdynia
+gean
+geanticline
+gearwheel
+geber
+gec
+gedact
+gedanken
+geelong
+gefilte
+gehlenite
+gelada
+gelatinoid
+gelibolu
+gell
+gelligaer
+gelt
+gemeinschaft
+gemmiparous
+gemmulation
+gemmule
+gemology
+gemot
+gen
+genappe
+generalism
+generalissimo
+genet
+genip
+genipap
+genitor
+genitourinary
+genizah
+genk
+genro
+gens
+genseric
+genstat
+gentianaceous
+gentianella
+genu
+geodynamics
+geognosy
+geoid
+geomechanics
+geometrid
+geophagy
+geosphere
+geostatic
+geostatics
+geosyncline
+geotaxis
+geotectonic
+gera
+gerah
+geraniaceous
+geranial
+geraniol
+geratology
+gerent
+gerenuk
+gerfalcon
+gerlachovka
+germander
+germanicus
+germanous
+germinant
+germiston
+gerona
+geronimo
+gerontological
+gers
+geryon
+gesellschaft
+gesso
+gest
+gestatorial
+gesualdo
+gey
+geyserite
+gezira
+ghat
+ghats
+gibberellic
+gibbsite
+gibeon
+gibli
+gibran
+gid
+gide
+gidgee
+gie
+giftwrap
+gifu
+gigabit
+gigabyte
+gigabytes
+gigaherz
+gigantomachy
+gigli
+gigue
+gilet
+gilgai
+gilgamesh
+gillies
+gillion
+gillray
+gillyflower
+gilolo
+gilsonite
+gilthead
+gimcrack
+gimel
+gimme
+gingiva
+gingivitis
+gink
+ginnel
+giorgione
+giotto
+gip
+gipon
+giraldus
+girandole
+girdlecake
+girgenti
+gironde
+gironny
+girosol
+gisarme
+gish
+gissing
+gittern
+giusto
+glabella
+glabrous
+glacialist
+gladbeck
+gladdon
+gladiate
+gladrags
+glaikit
+glair
+glaive
+glamorgan
+glandule
+glarus
+glaser
+glassman
+glastonbury
+glauce
+glauconite
+glebe
+gleeman
+gleet
+gleiwitz
+glencoe
+glendower
+glenoid
+glenrothes
+gley
+glia
+gliadin
+glissando
+glister
+gliwice
+globate
+globeflower
+globin
+globoid
+globose
+globuliferous
+glochidium
+glockenspiel
+glogg
+glomerate
+glomeration
+glomerule
+glomerulus
+glomma
+glossa
+glossator
+glossectomy
+glosseme
+glossitis
+glossography
+glossology
+glossopharyngeal
+glottic
+glottochronology
+gloze
+glucagon
+glucinum
+glucocorticord
+gluconeogenesis
+glucoprotein
+glucoside
+glucosuria
+glume
+gluon
+glutathione
+glutelin
+gluteus
+glyceric
+glycerophosphate
+glycogenesis
+glycolic
+glycolysis
+glyconeogenesis
+glycoside
+glycosuria
+glyoxaline
+glyphography
+glyptal
+glyptic
+glyptics
+glyptodont
+glyptography
+gnatcatcher
+gnathic
+gnathion
+gnathite
+gnathonic
+gnocchi
+gnosis
+gnotobiotics
+goalmouth
+goanna
+goatfish
+goatherd
+goatsbeard
+goatskin
+goatsucker
+gobbet
+gobi
+gobioid
+gobo
+gobstopper
+goby
+godard
+godavari
+godefroy
+goderich
+godown
+godroon
+gogga
+gogglebox
+goglet
+gogol
+gogra
+goldarn
+goldcrest
+goldeye
+goldilocks
+goldoni
+goldschmidt
+goldthread
+goliard
+goliardery
+golliwog
+gollop
+goloshes
+gombroon
+gomel
+gomorrah
+gompers
+gomphosis
+gomulka
+gomuti
+gonadotropin
+goncourt
+gondar
+gonfalon
+gonfalonier
+gongola
+gonidium
+goniometer
+gonk
+gonna
+gonococcus
+gonocyte
+gonof
+gonophore
+gonopore
+googly
+gook
+goole
+gooney
+goosander
+goosefoot
+goosegog
+goosegrass
+goosy
+gopak
+gorakhpur
+goral
+gorbals
+gorblimey
+goreng
+gorgerin
+gorgias
+gorgoneion
+gorica
+gorizia
+gormless
+gorsedd
+gosport
+gosse
+gossipmonger
+gossipmongers
+gossoon
+goster
+gotama
+gotta
+gouache
+gourami
+gourmont
+goutweed
+gowan
+gower
+gowk
+gowon
+goy
+gracile
+gracioso
+graduand
+gradus
+graecism
+graffito
+grahame
+graiae
+grainger
+grallatorial
+grama
+gramarye
+gramercy
+gramineous
+graminivorous
+grammatology
+grampian
+grampus
+granada
+granadilla
+granados
+grandaunt
+grandmaster
+grandmasters
+granduncle
+granduncles
+grangemouth
+granicus
+graniteware
+granitite
+granodiorite
+granolith
+granophyre
+granta
+granuloma
+granulose
+graphomotor
+grappa
+grappelli
+graptolite
+grasmere
+grassfinch
+grasshook
+grassquit
+grassroot
+gratian
+grattan
+gratulate
+graupel
+grav
+gravamen
+gravenhage
+gravettian
+gravimetrical
+graz
+gree
+greegree
+greeley
+greenaway
+greenbottle
+greenbrier
+greenfinch
+greenfly
+greengage
+greenhead
+greenheart
+greenock
+greenockite
+greensand
+greenshank
+greensickness
+greenstick
+greenstone
+greenstuff
+greige
+gremial
+gressorial
+greuze
+greyback
+greybeard
+greyhen
+greystones
+greywacke
+gribble
+griddlecake
+gridfile
+gridfiles
+grillparzer
+grilse
+grimalkin
+grimsby
+grindelwald
+grindery
+grisaille
+griseofulvin
+griseous
+grisette
+grishun
+griskin
+grisons
+grivation
+grivet
+grockle
+grodno
+grogram
+gromyko
+groningen
+gropius
+gros
+groschen
+grosgrain
+grosseteste
+grosswardein
+grosz
+grot
+grote
+grotius
+groundage
+groundsill
+groundsman
+groundspeed
+groundswell
+groupwork
+grouty
+grovet
+groyne
+grozing
+grozny
+grugru
+grumous
+grundy
+grysbok
+guacharo
+guaco
+guadalajara
+guadalcanal
+guadalquivir
+guadiana
+guaiacum
+guan
+guanabara
+guanaco
+guanajuato
+guanase
+guanosine
+guardafui
+guarneri
+guayaquil
+guayule
+gubbins
+gudeance
+gudrun
+guelders
+guenon
+guesthouse
+guidon
+guienne
+guilloche
+guipure
+guiscard
+guitarfish
+guizot
+gujranwala
+gulag
+gulags
+gular
+gulbenkian
+gulden
+gulfweed
+gumma
+gummite
+gummosis
+gummous
+gumshield
+gumtree
+gunge
+gunnel
+gunpaper
+gunstock
+gunter
+guntur
+gunwale
+gunyah
+gur
+gurdwara
+gurgitation
+gurglet
+gurjun
+gurkhali
+gurnard
+gustavo
+gutbucket
+guthrun
+gutta
+guv
+guyenne
+guyot
+gwalior
+gwelo
+gwent
+gwynedd
+gwyniad
+gyani
+gybe
+gymnasiarch
+gymnasiast
+gymslip
+gynaeceum
+gynaecocracy
+gynaecoid
+gynaecomastia
+gynandrous
+gynarchy
+gynecium
+gyniatrics
+gynophore
+gyronny
+gyrose
+gyrostatic
+gyrostatics
+gyve
+habu
+hachure
+hackamore
+hackbut
+hadaway
+hadhramaut
+hadj
+hadji
+hadrosaur
+hae
+haecceity
+haeckel
+haem
+haemachrome
+haemacytometer
+haemagglutinate
+haemagglutinin
+haemagogue
+haemal
+haematein
+haematemesis
+haematic
+haematin
+haematinic
+haematite
+haematoblast
+haematocele
+haematocrit
+haematocryal
+haematogenesis
+haematogenous
+haematoid
+haematological
+haematology
+haematolysis
+haematoma
+haematopoiesis
+haematosis
+haematothermal
+haematoxylin
+haematozoon
+haematuria
+haemic
+haemin
+haemochrome
+haemocoel
+haemocyanin
+haemocyte
+haemocytometer
+haemodialysis
+haemoflagellate
+haemoglobin
+haemoglobinuria
+haemoid
+haemolysin
+haemolysis
+haemophile
+haemophilia
+haemophiliac
+haemophilic
+haemopoiesis
+haemoptysis
+haemorrhage
+haemorrhagic
+haemorrhoidectomy
+haemorrhoids
+haemostasis
+haemostat
+haemostatic
+haeres
+haftarah
+hagar
+hagbut
+hagfish
+haggadah
+haggai
+hagiarchy
+hagiocracy
+hagiographer
+hagiolatry
+hagiology
+hagioscope
+hahnemann
+haidar
+haig
+haik
+haile
+hainaut
+haiphong
+hairball
+hairgrip
+hairif
+hairnet
+hairtail
+hairweaving
+hairworm
+hajj
+hake
+hakim
+hakluyt
+hakodate
+halafian
+halakah
+halal
+halation
+halberd
+halcyone
+haldane
+haleakala
+halesowen
+halfbeak
+halfwit
+halicarnassus
+hallah
+hallam
+hallel
+hallux
+halm
+halmahera
+halmstad
+halobiont
+haloid
+halophyte
+halothane
+hals
+haltemprice
+hama
+hamadryad
+hamadryas
+hamamatsu
+hamamelidaceous
+hambletonian
+hame
+hamelin
+hameln
+hamersley
+hamhung
+hamilcar
+hamm
+hammerfest
+hammersmith
+hammerstein
+hammurabi
+hampden
+hampstead
+hamshackle
+hamsun
+hamulus
+hamza
+hanaper
+hanau
+handbarrow
+handbell
+handbrake
+handfeed
+handleability
+handstroke
+hangbird
+hangchow
+hankerchief
+hankow
+hannover
+hanratty
+hapax
+haphtarah
+haplite
+haplography
+haplosis
+hapten
+hapteron
+haptic
+hapto
+haptotropism
+harakiri
+harald
+harambee
+harappa
+harar
+hardecanute
+hardhack
+hardicanute
+hardie
+hardily
+harebell
+hargeisa
+haricot
+harijan
+harikari
+harmattan
+harmonist
+harmonograph
+harmonographs
+harmotome
+harney
+harpenden
+harquebus
+harquebusier
+harrar
+harrogate
+harslet
+hartal
+harte
+hartebeest
+harthacanute
+hartlepool
+hartnell
+hartree
+hartshead
+harun
+haruspex
+harvestmen
+harwell
+harwich
+haryana
+harz
+hasa
+hasdrubal
+hashemite
+hask
+haslet
+hassan
+hasselt
+hatchback
+hatpin
+hatshepsut
+haubergeon
+hauberk
+haugh
+haulm
+hauraki
+haustellum
+haustorium
+havant
+havel
+havelock
+havildar
+havre
+hawes
+hawfinch
+hawhaw
+hawkbill
+hawksbill
+hawkweed
+haworth
+hawse
+hawsehole
+hawsepipe
+haybox
+hazelhen
+hazlitt
+headlamp
+headrace
+headrail
+headreach
+headscarf
+headsquare
+headward
+headwards
+heald
+healds
+hearths
+heartworm
+heathberry
+heathfowl
+heaume
+hebbel
+hebephrenia
+hebetate
+hebetic
+heckelphone
+hectocotylus
+hedjaz
+heehaw
+heelpost
+heenan
+heerlen
+heffer
+hegira
+hegumen
+heh
+heiduc
+heilbronn
+heilungkiang
+heirdom
+heitiki
+heitler
+hejira
+hekate
+hekla
+hel
+helichrysum
+helicline
+helicograph
+heliolithic
+heliotherapy
+heliotropin
+heliotype
+hellbent
+helle
+hellery
+helles
+helmand
+helminth
+helminthiasis
+helminthic
+helminthology
+helmont
+helpmann
+helsingborg
+helvellyn
+hemel
+hemelytron
+hemeralopia
+hemialgia
+hemianopsia
+hemicellulose
+hemichordate
+hemicycle
+hemidemisemiquaver
+hemielytron
+hemiola
+hemipode
+hemipteran
+hemipterous
+hemispheroid
+hemistich
+hemiterpene
+hemstitch
+henbit
+hencoop
+hendecagon
+hendecahedron
+henge
+hengelo
+hengist
+henhouse
+hepcat
+hepplewhite
+hepta
+heptad
+heptadecanoic
+heptahedron
+heptamerous
+heptangular
+heptarchy
+heptastich
+heptatriene
+heptavalent
+heptose
+hepworth
+heraclea
+heracles
+herakleion
+herby
+hercegovina
+herculaneum
+hereat
+heredes
+hereditable
+hereditist
+hereinto
+heresiarch
+hereward
+heriot
+herisau
+herl
+herm
+hermannstadt
+hermon
+hermosillo
+hermoupolis
+herne
+herniorrhaphy
+herod
+herodias
+herophilus
+herrick
+herriot
+herstmonceux
+hesiod
+hesperidin
+hesperidium
+hestia
+hetaera
+hetaerism
+heterocercal
+heterochromatic
+heterochromatin
+heterochromatins
+heterochromosome
+heterochromous
+heteroclite
+heterodactyl
+heterodont
+heterogenous
+heterography
+heterogynous
+heterolecithal
+heterologous
+heteromerous
+heteronym
+heteroplasty
+heterosporous
+heterostyly
+heterotaxis
+heterothallic
+heterotopia
+heth
+hevelius
+hevesy
+hexachloroethane
+hexachlorophene
+hexachord
+hexacosanoic
+hexadecane
+hexaemeron
+hexamerous
+hexangular
+hexanoic
+hexapla
+hexapody
+hexastich
+hexastyle
+hexavalent
+hexene
+hexone
+hexosan
+hexose
+hexyl
+hexylresorcinol
+heyduck
+heyerdahl
+hibernaculum
+hic
+hiddenite
+hiemal
+hieracosphinx
+hierocracy
+hierodule
+hierogram
+hierology
+hierophant
+highchair
+highjack
+highlife
+highveld
+hijaz
+hijinks
+hilla
+hillery
+hillfort
+hilliard
+hillingdon
+hilus
+hilversum
+himachal
+himalayas
+himeji
+himmler
+hin
+hinckley
+hindgut
+hindoo
+hindustan
+hinny
+hinshelwood
+hipparch
+hipparchus
+hippolyta
+hiragana
+hircine
+hiri
+hirohito
+hiroshige
+hirundine
+hispid
+histiocyte
+histogen
+histogenesis
+histoid
+histone
+historiated
+hitparade
+hmso
+hoactzin
+hoad
+hoarhound
+hoatching
+hoatzin
+hobbema
+hochhuth
+hockney
+hodden
+hodeida
+hodman
+hodometer
+hoek
+hofei
+hofmannsthal
+hofuf
+hogarth
+hogg
+hogged
+hogmanay
+hognosed
+hogtie
+hogue
+hogweed
+hohenlinden
+hohenlohe
+hohenstaufen
+hoick
+hoicks
+hoiden
+hokkaido
+hokku
+hokusai
+holarctic
+holbein
+holinshed
+holkar
+holmic
+holocaine
+holoenzyme
+holofernes
+holoplankton
+holothurian
+holp
+holpen
+hols
+holyhead
+holyoake
+holytide
+homebuild
+homecome
+homecraft
+homeopaths
+homeown
+homocentric
+homochromous
+homocyclic
+homodont
+homogenous
+homophobe
+homophobes
+homotaxis
+homothermal
+honan
+honecker
+honegger
+honewort
+honeybunch
+honeysucker
+honiara
+hoo
+hoofbound
+hoogh
+hooghly
+hooke
+hooknose
+hoopoe
+hoopoes
+hoovered
+hoovering
+hoovers
+hopeh
+hoplology
+hoppus
+hopsack
+horae
+horal
+hordein
+horeb
+horme
+hormuz
+hornbook
+hornby
+hornfels
+hornstone
+horologe
+horologium
+horoscopy
+horripilation
+horsa
+horsebox
+horseboxs
+horseleech
+horseleeches
+horseriding
+horst
+horta
+horthy
+horticulturalist
+hortus
+hosea
+hosier
+hospitalet
+hospitaller
+hospodar
+hosteller
+hostelling
+hostie
+hotien
+hotplate
+hotpot
+hotspur
+hottie
+houdon
+houmous
+hounslow
+housebuilding
+housecarl
+housel
+houseleek
+houseleeks
+houseline
+housemaster
+housemasters
+housman
+houting
+hovercraft
+hoverport
+hovertrain
+hovertrains
+howdah
+howitzer
+howlet
+howrah
+howtowdie
+hoxha
+hoylake
+hradec
+hrvatska
+hsi
+hsian
+hsiang
+hsining
+hsinking
+hua
+huambo
+huang
+hubble
+hubli
+huckel
+huckle
+hucklebone
+huelva
+huesca
+hufuf
+huggermugger
+hughie
+huhehot
+hula
+hulme
+humber
+humberside
+humblebee
+hunan
+hungnam
+huns
+huntingdon
+hunyadi
+huon
+hupeh
+huppah
+hurds
+hurstmonceux
+hus
+husain
+husein
+hushaby
+huss
+hussein
+husserl
+hutchie
+hutment
+hutu
+huygens
+huysmans
+hwang
+hwyl
+hyaluronic
+hydantoin
+hydathode
+hydatid
+hyderabad
+hydnocarpate
+hydnocarpic
+hydracid
+hydrastinine
+hydrazoic
+hydria
+hydriodic
+hydrobromic
+hydrocele
+hydrocellulose
+hydrocoral
+hydrocortisone
+hydrogenolysis
+hydrogenous
+hydrograph
+hydrolyte
+hydromedusa
+hydromel
+hydrometallurgy
+hydrometeor
+hydronaut
+hydrophilous
+hydropower
+hydroquinone
+hydrostat
+hydrosulphate
+hydrosulphide
+hydrosulphurous
+hydrotaxis
+hydrotherapeutics
+hydroxonium
+hydroxylamine
+hyetograph
+hyetography
+hygristor
+hygrophilous
+hygrostat
+hyksos
+hylomorphism
+hylophagous
+hylotheism
+hylozoism
+hymenopteran
+hymenopterous
+hymettus
+hymnist
+hyoid
+hyoscyamine
+hypabyssal
+hypaesthesia
+hypaethral
+hypallage
+hypanthium
+hyperaemia
+hyperbaton
+hypercatalectic
+hypercorrect
+hypercorrection
+hyperdulia
+hyperextension
+hyperfocal
+hyperglycaemia
+hyperinsulinism
+hyperion
+hyperkinesia
+hypermarket
+hyperpnoea
+hyperpyrexia
+hyperstability
+hyperstable
+hypersthene
+hyperterm
+hyperterms
+hypervitaminosis
+hypesthesia
+hypethral
+hyphae
+hypnology
+hypnopaedia
+hypnopompic
+hypoacidity
+hypoblast
+hypochondrium
+hypocotyl
+hypoderm
+hypoeutectic
+hypogastrium
+hypogeal
+hypogene
+hypogenous
+hypogeous
+hypogeum
+hypoglossal
+hypoglycaemia
+hypognathous
+hypogynous
+hypoid
+hypolimnion
+hypomania
+hyponasty
+hyponitrite
+hyponitrous
+hypophosphate
+hypophosphite
+hypophosphoric
+hypophosphorous
+hypophyge
+hypophysis
+hypopituitarism
+hypoplasia
+hypoploid
+hypopnoea
+hyposthenia
+hypostyle
+hyposulphite
+hyposulphurous
+hypotaxis
+hypothec
+hypoxanthine
+hyracoid
+hyrax
+hyrcania
+hyssop
+hysterogenic
+hysteroid
+hysterotomy
+hystricomorph
+iamb
+iata
+iatric
+ibadan
+ibarruri
+ibert
+ibibio
+ibiza
+ichang
+ichinomiya
+ichnography
+ichnology
+ichor
+ichthyic
+ichthyoid
+ichthyolite
+ichthyology
+ichthyophagous
+ichthyosaur
+ichthyosis
+iconium
+iconomatic
+iconostasis
+icterus
+ictinus
+ictus
+ide
+ideatum
+identifers
+identikit
+ideosyncrasies
+ideosyncrasy
+idioblast
+idiopathy
+idiophone
+idiosyncracies
+idiosyncracy
+idocrase
+idolum
+idun
+ieper
+ieyasu
+ife
+igbo
+igdrasil
+igfet
+ignis
+ignitability
+ignoratio
+ignotum
+igraine
+ihram
+ikan
+ikebana
+ikeja
+ikhnaton
+ilea
+ileac
+ileitis
+ileostomy
+ilesha
+ileus
+ilex
+ilia
+iliamna
+iligan
+ilion
+ilium
+ilkley
+illampu
+illawarra
+illich
+illimani
+illinium
+illocution
+illude
+illyria
+illyricum
+ilmen
+iloilo
+ilorin
+imagen
+imbros
+iminourea
+immersionism
+immobilism
+immortelle
+immoveables
+immunoassay
+immunoglobulin
+immunomicrosphere
+immunoreaction
+impanation
+imparipinnate
+imparisyllabic
+impaste
+impasto
+impearl
+impeccant
+impedimenta
+impennate
+imperium
+imperscriptible
+impetigo
+imphal
+impi
+implacental
+impolder
+impolicy
+imponderabilia
+imponent
+imposable
+impostume
+impower
+impresa
+imprescriptible
+impressure
+imprest
+improbity
+imroz
+inappellable
+inapprehensive
+inarch
+inartificial
+inbeing
+incaparina
+incapsulate
+incardinate
+incensory
+inchmeal
+inchon
+incipit
+incisure
+incluse
+incomprehensive
+incrementation
+incunabula
+indaba
+indeces
+indene
+indetermine
+indexation
+indigestive
+indigoid
+indiscernability
+indo
+indoleacetic
+indolebutyric
+indomethacin
+indophenol
+indore
+indorsee
+indoxyl
+indra
+indre
+induna
+induplicate
+indusium
+indy
+inearth
+inequable
+inerrable
+inescutcheon
+inessive
+inextirpable
+infallibilism
+infante
+infare
+infeudation
+infibulate
+infight
+infill
+infold
+infracostal
+infralapsarian
+infulae
+infundibuliform
+infundibulum
+infuscate
+infusionism
+inge
+ingeminate
+ingenerate
+ingesta
+ingleborough
+inglenook
+ingoing
+ingolstadt
+ingraft
+ingravescent
+ingres
+ingulf
+inhambane
+inhaul
+inhesion
+inkberry
+inkblot
+inlace
+inmesh
+inmigrant
+inniskilling
+innoxious
+innsbruck
+innumerate
+innutrition
+inoculable
+inodorous
+inofficious
+inqilab
+insalivate
+inscape
+insectarium
+inshrine
+insipience
+insnare
+insomuch
+instalation
+installant
+inswing
+intarsia
+integrant
+integratable
+intendancy
+interagency
+interbedded
+interchannel
+interconnectable
+interconsole
+interflow
+interfluent
+interfluve
+intergranal
+interjacent
+interlaken
+interlap
+interlay
+interlocation
+interlunation
+intermesh
+intermigration
+intermittency
+interosculate
+interpage
+interparticle
+interpellant
+interphone
+interpolant
+interprete
+interpretes
+interradial
+interrex
+interrobang
+interrogable
+interstratify
+intersystem
+intertexture
+intertrigo
+intracoastal
+intranational
+intranuclear
+intrasocietal
+intratelluric
+intravasation
+intuc
+intuitivism
+intwine
+inuit
+inurbane
+invercargill
+involucel
+involutory
+invultuation
+inwrap
+inyala
+iodism
+iodometry
+iolite
+iona
+ionone
+ionopause
+iontophoresis
+iphigenia
+ipoh
+ipsambul
+ipsus
+ipswich
+iqbal
+iquique
+iquitos
+iracund
+irade
+irbid
+irbil
+irenicon
+irian
+iridectomy
+irido
+iridotomy
+iritis
+ironbark
+ironfounding
+irradiant
+irrelievable
+irremissible
+irretentive
+irriguous
+irtysh
+isagoge
+isagogics
+isallobar
+isar
+isarithmic
+isatin
+isauria
+ischaemia
+ischia
+ischium
+isentropically
+isherwood
+islay
+ismailia
+iso
+isoamyl
+isobath
+isocept
+isochor
+isochroous
+isocracy
+isocrates
+isocyanic
+isocyanide
+isodiametric
+isodiaphere
+isodimorphism
+isodynamic
+isoelectric
+isoelectronic
+isoenergetic
+isogamete
+isogenous
+isogeotherm
+isogloss
+isogon
+isogonic
+isohel
+isohyet
+isolecithal
+isoleucine
+isolex
+isoline
+isologous
+isophone
+isopod
+isoprene
+isopropyl
+isorhythmic
+isosceles
+isoseismal
+isosmotic
+isospondylous
+isostasy
+isosteric
+isotactic
+isothere
+isotone
+isotron
+isotropical
+israfil
+issachar
+issus
+istana
+isthmian
+istle
+istria
+itacolumite
+itaconic
+italicity
+italicy
+ithunn
+ithyphallic
+iulus
+iviza
+ixtle
+iyar
+iyeyasu
+izmir
+izmit
+iznik
+izzard
+jacamar
+jacdaw
+jackeroo
+jackfish
+jackfruit
+jackshaft
+jacksmelt
+jacksnipe
+jackstay
+jackstraws
+jaconet
+jadeite
+jael
+jaffa
+jaffna
+jaguarondi
+jahveh
+jahweh
+jailhouse
+jaipur
+jalap
+jalapa
+jalisco
+jambeau
+jambi
+jambo
+jammu
+jammy
+jamnagar
+jampan
+jamshedpur
+jamshid
+jana
+janata
+janina
+jarl
+jarp
+jarrah
+jarrow
+jarry
+jarvey
+jassy
+jato
+javari
+jawan
+jawara
+jawbreak
+jaxartes
+jayawardena
+jaywalk
+jebel
+jedda
+jefe
+jehad
+jehol
+jehoshaphat
+jehu
+jekyll
+jellaba
+jellicoe
+jellify
+jellybean
+jemadar
+jemappes
+jembe
+jequirity
+jerba
+jerbil
+jerboa
+jerez
+jerid
+jerreed
+jevons
+jewelfish
+jewfish
+jhansi
+jhelum
+jibbons
+jibouti
+jidda
+jiggermast
+jihad
+jillaroo
+jillion
+jilolo
+jinghis
+jinja
+jinnah
+jipijapa
+jissom
+jitterbugger
+jitterbugging
+jiujitsu
+jobcentre
+jobcentres
+jobname
+jocko
+jodhpuri
+jodrell
+joffre
+jogged
+jogjakarta
+johore
+jokjakarta
+jollify
+jolo
+jongleur
+jonnock
+jook
+joppa
+jordaens
+jorum
+jos
+josquin
+jota
+jotter
+jotun
+joual
+journalled
+jowett
+joypop
+juba
+jubbah
+jube
+judezmo
+judicative
+judicator
+judogi
+judoka
+jugal
+jugfet
+juggins
+juglandaceous
+jugulate
+jugum
+jugurtha
+juiz
+jullundur
+jumbuck
+jumna
+juncaceous
+jungfrau
+junkman
+jupon
+juratory
+juryman
+jus
+justiceship
+justiciary
+justle
+juvenal
+kabalega
+kabaragoya
+kabbala
+kabob
+kachang
+kachina
+kadi
+kadiyevka
+kaduna
+kaffirs
+kafiristan
+kagera
+kagoshima
+kagu
+kaiak
+kaieteur
+kaif
+kaifeng
+kail
+kailyard
+kain
+kainogenesis
+kairouan
+kaka
+kakapo
+kakemono
+kaki
+kalat
+kalends
+kaleyard
+kalgan
+kalgoorlie
+kali
+kalian
+kalidasa
+kalif
+kalimantan
+kalinin
+kaliningrad
+kalisz
+kaliyuga
+kalmar
+kalong
+kalpa
+kalpak
+kalsomine
+kaluga
+kama
+kamakura
+kamala
+kamasutra
+kame
+kamerun
+kamet
+kami
+kampong
+kampuchea
+kamseen
+kana
+kanamycin
+kananga
+kanara
+kanazawa
+kanchenjunga
+kanchipuram
+kandahar
+kandy
+kanga
+kangwane
+kannada
+kano
+kanpur
+kansu
+kantar
+kanu
+kanzu
+kaohsiung
+kaolack
+kaoliang
+kaon
+kapellmeister
+kaph
+karabiner
+karafuto
+karaganda
+karakoram
+karakorum
+karamanlis
+karbala
+karelia
+kariba
+karnataka
+karoo
+kaross
+kart
+karyogamy
+karyokinesis
+karyolymph
+karyolysis
+karyoplasm
+karyosome
+karyotin
+karyotype
+kasai
+kasbah
+kasher
+kashgar
+kashmir
+kassa
+kassala
+kassel
+kat
+katabasis
+katabolism
+katakana
+katanga
+katar
+kathak
+katharevusa
+katharsis
+kathiawar
+katmai
+katsina
+kattegat
+katzenjammer
+kauai
+kaunas
+kaunda
+kauri
+kaveri
+kawasaki
+kayseri
+kazachok
+kazakh
+kazan
+kazantzakis
+kazbek
+kea
+kean
+kearney
+keble
+keck
+ked
+kedah
+kedge
+kedgeree
+kediri
+kedron
+keef
+keelung
+keepnet
+kef
+keffiyeh
+kegler
+keister
+keitel
+keitloa
+kekkonen
+kelantan
+keloid
+kelpie
+kelt
+kelter
+kemal
+kemble
+kemerovo
+kempe
+kempis
+kempt
+kenaf
+kendal
+kendo
+kenogenesis
+kenosis
+kenspeckle
+kente
+kentledge
+kenyatta
+keos
+kep
+kerala
+keramic
+keramics
+keratin
+keratitis
+keratogenous
+keratoid
+keratoplasty
+keratose
+keratosis
+kerb
+kerbaya
+kerbela
+kerbing
+kerbstone
+kerch
+kerf
+kerguelen
+kerkrade
+kerman
+kermes
+kermis
+kermits
+kero
+kerouac
+kersey
+kerseymere
+kesselring
+kesteven
+ketonuria
+ketoxime
+kevel
+kew
+kewpie
+kex
+keytop
+keytops
+kickdown
+kicksorter
+kicktail
+kidd
+kiddle
+kidron
+kief
+kike
+kilung
+kimberley
+kimberlite
+kina
+kinabalu
+kinase
+kincardine
+kinchinjunga
+kincob
+kinematograph
+kingbolt
+kingcraft
+kingcup
+kingwana
+kinin
+kino
+kioto
+kirtle
+kitbag
+kitbags
+kitchenless
+kitenge
+kithara
+kittiwake
+kitwe
+kiushu
+klaipeda
+klepht
+klieg
+klong
+klootchman
+klopstock
+knackwurst
+knag
+knap
+knar
+knawel
+knickpoint
+kniferest
+knop
+knossos
+knotgrass
+knotwork
+knurly
+koa
+koan
+kob
+kobarid
+kobe
+kobold
+kochi
+kodok
+koel
+kofta
+koftgar
+kofu
+kokura
+kolar
+kolding
+koniology
+konya
+koodoo
+koph
+korfball
+koto
+kurchatovium
+kyanite
+kylin
+kylix
+kyloe
+kymograph
+kymric
+kymry
+kyphosis
+kythera
+labarum
+labe
+labefaction
+labiche
+labionasal
+labiovelar
+lablab
+labret
+labroid
+labrum
+labuan
+labyrinthodont
+laccolith
+lacedaemon
+lacerant
+lacertilian
+lachlan
+lachryma
+lachrymatory
+laclos
+laconia
+lactalbumin
+lactam
+lactary
+lactescent
+lactiferous
+lactoflavin
+lactometer
+lactophenol
+lactoprotein
+lactoscope
+ladislaus
+ladoga
+ladrone
+ladyfy
+ladysmith
+ladysnow
+laertes
+laevogyrate
+laevorotatory
+laevulin
+laevulose
+laforgue
+lagan
+lagena
+lagerkvist
+lah
+laik
+lairy
+laius
+lala
+lalang
+lalapalooza
+lallans
+lallation
+lamartine
+lambdacism
+lambdoid
+lambkin
+lambrequin
+lamellicorn
+lamellirostral
+lamina
+laminitis
+lammergeier
+lampas
+lampedusa
+lampern
+lampeter
+lampholder
+lampion
+lamppost
+lampposts
+lamprophyre
+lampshade
+lampshades
+lanark
+lanate
+lancejack
+lancelot
+lancewood
+lanchow
+landammann
+landeshauptmann
+landgrave
+landgraviate
+landgravine
+landloper
+landor
+landowska
+landrace
+landscapist
+landscapists
+landseer
+landshark
+landshut
+landsknecht
+landtag
+landwaiter
+lanfranc
+langlauf
+langouste
+langrage
+langres
+langsyne
+langue
+languedoc
+languet
+laniard
+laniary
+laniferous
+lankester
+lanner
+lanneret
+lanose
+lansquenet
+lanthorn
+lanugo
+laoag
+laodicea
+laomedon
+laotze
+lapidate
+lapidify
+lapillus
+lapis
+lapsus
+laptev
+lardon
+largen
+larine
+larisa
+larmor
+larn
+larnax
+larousse
+larrigan
+larrikin
+larrup
+larum
+larwood
+laryngotomy
+lascaux
+lashio
+lashkar
+lasker
+lasket
+lassa
+lassalle
+lassus
+lat
+lateroversion
+lathi
+lathy
+latifundium
+latimer
+latium
+latria
+lattermost
+lauda
+lauraceous
+laurasia
+lauric
+laurier
+laurustinus
+lauryl
+lautrec
+lav
+laval
+lavolta
+lawbreak
+lawes
+lawgive
+lawks
+lawmake
+laxey
+layamon
+layard
+laycock
+layshaft
+lazaretto
+lazio
+lazuli
+lazulite
+lazurite
+leadbelly
+leadwort
+leafcutter
+leafletting
+leakey
+leal
+leaseback
+leat
+leatherhead
+leatherjacket
+leatherwood
+leavis
+leben
+lebkuchen
+leblanc
+lebowa
+lebrun
+lecce
+lech
+lecky
+leconte
+lector
+lecythus
+leet
+leeuwarden
+lefthand
+lefthanded
+leftwing
+leftwinger
+leftwingers
+legaspi
+legnica
+legumin
+lehmann
+lehmbruck
+lehr
+leiria
+leishmaniasis
+leister
+leitrim
+leix
+lek
+lekker
+lely
+leman
+lemniscate
+lemnos
+lempira
+lemuroid
+lenglen
+lengthman
+lentamente
+lentic
+lenticel
+lentigo
+leoben
+lepaya
+lepidopteran
+lepidote
+lepidus
+lepontine
+leporid
+leporine
+leprosarium
+leprose
+leptophyllous
+leptosome
+leptospirosis
+leptotene
+lesbos
+lesseps
+letchworth
+letterset
+leucas
+leuco
+leucocratic
+leucocyte
+leucocytosis
+leucoderma
+leucomaine
+leucopenia
+leucoplast
+leucopoiesis
+leucorrhoea
+leucotomy
+leuctra
+leukas
+leuven
+levalloisian
+leverrier
+leviable
+levkas
+lewes
+lexeme
+lexicology
+lexigraphy
+lexis
+liard
+liase
+liason
+libau
+libava
+libeccio
+liberec
+liberticide
+libia
+lichenin
+lichenology
+lichi
+liddell
+lidice
+liebig
+liebknecht
+liegeman
+liegnitz
+lienal
+lientery
+liestal
+lietuva
+liffey
+liftboy
+liftoff
+ligan
+liger
+ligeti
+ligniform
+lignocaine
+ligroin
+ligula
+liguria
+lii
+likasi
+liklihood
+likuta
+lilburne
+liliaceous
+lilienthal
+liliuokalani
+lille
+lilo
+lilongwe
+limacine
+limassol
+limbate
+limewater
+limicoline
+limicolous
+limitarian
+limoges
+limousin
+linacre
+linalool
+linares
+lincrusta
+linctus
+lindane
+lindesnes
+lindisfarne
+lindwall
+lineate
+lineations
+linefeed
+linefeeds
+linenumber
+linestyle
+linewidth
+lingam
+lingayen
+lingcod
+linguiform
+linguini
+linhay
+linkwork
+linlithgow
+linn
+linnaeus
+linnet
+linnhe
+lino
+linocut
+linolenic
+linstock
+lintwhite
+linz
+lionfish
+lipari
+lipase
+lipchitz
+lipography
+lipoid
+lipoma
+lipophilic
+lipoprotein
+lippe
+lippi
+lippie
+liquefacient
+liquesce
+liquidus
+liquorish
+liripipe
+lisieux
+literae
+lithoid
+lithomarge
+lithometeor
+lithotrity
+littoria
+liu
+livingstone
+livonia
+livorno
+livraison
+livy
+lix
+lixivium
+loadstar
+loadstone
+loanda
+lobengula
+lobito
+lobola
+lobworm
+lochia
+lockyer
+locl
+locoman
+locris
+locum
+lod
+lodi
+lodicule
+loewi
+lofoten
+loganberry
+loganiaceous
+logaoedic
+logicism
+loglog
+logoff
+logography
+logopaedics
+lohengrin
+loiret
+lollapalooza
+lomax
+lombok
+lombroso
+loment
+lomond
+londrina
+longan
+longcase
+longcloth
+longe
+longicorn
+longinus
+longlasting
+longleaf
+longship
+longshore
+longueuil
+longueur
+longus
+longways
+longyearbyen
+loofah
+lookin
+loopy
+loosebox
+lophobranch
+lophophore
+lor
+lordy
+lorentz
+lorica
+lorient
+lorikeet
+lorimer
+lorrain
+lorris
+losey
+lothair
+lothario
+lothian
+lothians
+lothringen
+lotic
+louche
+loudish
+loudspeak
+louth
+louvain
+louvar
+lovage
+lovat
+lovell
+lovey
+lowan
+lowerclassman
+lowestoft
+lowveld
+loyang
+lozengy
+lozi
+lualaba
+luanda
+luang
+luau
+lublin
+lubra
+lubumbashi
+lucarne
+lucca
+luce
+luciferin
+lucilius
+lucullus
+lud
+ludhiana
+ludo
+luff
+luffed
+luffing
+luffs
+lugo
+lugsail
+lugworm
+luichow
+luik
+lumberjacket
+lumbricalis
+lumbricoid
+lumiere
+lumisterol
+lumme
+lumpenproletariat
+lumumba
+luna
+lunarian
+lungan
+lungi
+lungki
+lungworm
+lungwort
+lunik
+luns
+lunula
+lunulate
+lupin
+lurdan
+lurex
+lusatia
+lusus
+luteolin
+lutestring
+luthern
+luthuli
+lutine
+lutist
+luxor
+luxulianite
+lvi
+lvii
+lxi
+lxii
+lxiv
+lxix
+lxvi
+lxvii
+lyallpur
+lyautey
+lycanthrope
+lycaon
+lycaonia
+lycia
+lycopod
+lycurgus
+lydda
+lyddite
+lydgate
+lyell
+lyly
+lymphangial
+lymphangitis
+lymphoadenoma
+lyncean
+lynchet
+lysias
+lysippus
+lysol
+lyssa
+lytic
+lytta
+lytton
+mabela
+mabuse
+macaco
+maccaroni
+macebearer
+macedoine
+machado
+machan
+machel
+machin
+machmeter
+machree
+machu
+macroclimate
+macroencephaly
+macrograph
+macrophysics
+macroprocessor
+macropterous
+macrosporangium
+macrospore
+macrosystem
+macruran
+macula
+macumba
+madafu
+madhya
+madina
+madre
+madrepore
+madura
+madurai
+maduro
+madwort
+maebashi
+maenad
+maestoso
+maestricht
+maewo
+mafeking
+maffick
+mag
+magallanes
+magdalena
+mage
+magen
+maggiore
+magilp
+maginot
+magistery
+magnetochemistry
+magnetopause
+magnetosheath
+magnificats
+magnoliaceous
+magnus
+magot
+magritte
+maguey
+mahabharata
+mahalla
+mahanadi
+maharashtra
+mahewu
+mahjong
+mahometan
+mahratta
+mahseer
+maidan
+maidstone
+maiduguri
+maigre
+maihem
+maikop
+mailcoach
+maillol
+maimonides
+mainbrace
+maintenence
+maintopsail
+mainz
+maiolica
+majunga
+makalu
+makarios
+makeyevka
+makhachkala
+makkah
+makurdi
+makuta
+malabo
+malachi
+malacophyllous
+malacopterygian
+maladdress
+malam
+malang
+malassimilation
+malatesta
+malatya
+maldon
+maleable
+malebranche
+maleic
+malevich
+malherbe
+malihini
+malimprinted
+malines
+malinke
+malkin
+mallam
+mallee
+mallenders
+malleolus
+mallorca
+malm
+malonic
+malonylurea
+malory
+malpighi
+malpighiaceous
+maltha
+malthus
+maltman
+maluku
+malvaceous
+malvern
+malwa
+mamaguy
+mamba
+mamelon
+mamilla
+mamillate
+mammee
+mammet
+mammiferous
+mammilla
+mampara
+manado
+managerialism
+manakin
+manassas
+manasseh
+manaus
+manche
+manchineel
+manchukuo
+manchuria
+mandatorily
+mandi
+mandir
+manet
+mangabey
+mangalore
+manganin
+mangelwurzel
+mangonel
+mangosteen
+mani
+manichaeus
+manilla
+manille
+maninke
+maniple
+manipur
+manisa
+manitoulin
+manizales
+manky
+mannar
+manolete
+manresa
+mansart
+mansholt
+manteau
+mantegna
+mantelletta
+manteltree
+mantilla
+mantinea
+mantoux
+mantova
+manufacturable
+manuka
+manukau
+manus
+manutius
+manyplies
+manzanilla
+manzoni
+maoism
+maputo
+maquette
+mara
+marabunta
+maraca
+maracanda
+maracay
+maraging
+marasca
+marat
+maravedi
+marcasite
+marcellus
+marcescent
+marche
+marcos
+marcuse
+marduk
+mardy
+maremma
+marg
+margaric
+margarite
+margate
+margravate
+margrave
+margravine
+margrethe
+marianao
+maribor
+mariculture
+mariposa
+maritage
+maritain
+maritsa
+marlite
+marmara
+marmite
+marmolada
+maroc
+marocain
+maroquin
+maros
+marprelate
+marquand
+marquesas
+marquessate
+marram
+marrano
+marriageability
+marron
+marryat
+marsilius
+marsipobranch
+martaban
+martagon
+martel
+martellato
+martello
+martineau
+marvell
+marxists
+masaccio
+masan
+masaryk
+masbate
+mascarene
+mascle
+mascon
+masharbrum
+mashhad
+mashie
+masinissa
+masjid
+maskanonge
+masqat
+massa
+massachuset
+massasauga
+massasoit
+massine
+massinissa
+massorete
+massotherapy
+mastaba
+mastigophoran
+mastitis
+masuria
+masurium
+matadi
+matamoros
+matanzas
+matapan
+matchbox
+matchmark
+matchstick
+mathura
+matlo
+matlock
+mato
+matoke
+matopo
+matozinhos
+matrass
+matriclinous
+matrilocal
+matroclinous
+matronage
+matsu
+matsuyama
+mattamore
+matterhorn
+matthias
+mattins
+mattoid
+mattrass
+matzoon
+maubeuge
+mauby
+maui
+maulana
+maulmain
+maulstick
+maumet
+mauna
+maund
+maunder
+maundy
+maungy
+maupassant
+maupertuis
+mauretania
+mauriac
+maurois
+maury
+maurya
+mawger
+mawkin
+mawsie
+maximin
+maximus
+maxint
+maxisingle
+maxixe
+mayday
+mayence
+mayon
+mazard
+mazarin
+mazuma
+mazzini
+mealworm
+meany
+meatus
+mecamylamine
+mechanotherapy
+mechelen
+meck
+meconium
+medan
+medawar
+mediastinum
+medway
+mee
+meed
+meerkat
+meerut
+mega
+megacephaly
+megadeath
+megaflop
+megaflops
+megalocardia
+megalocephaly
+megalosaur
+megapode
+megara
+megaron
+megathere
+megger
+meghalaya
+megiddo
+megilp
+mehemet
+meilhac
+meiny
+meir
+meitner
+mekka
+melanchthon
+melanous
+melaphyre
+melba
+melchior
+meliaceous
+melilla
+melilot
+melinite
+melisma
+melodeon
+meloid
+melos
+meltage
+mem
+memel
+memling
+memoire
+memorex
+memphremagog
+memsahib
+menadione
+menado
+menai
+menam
+menander
+menaquinone
+mencius
+menderes
+mendips
+menes
+mengistu
+meningocele
+menispermaceous
+meno
+menology
+menomini
+menon
+menotti
+mensa
+mentalism
+menuhin
+mepacrine
+meperidine
+meprobamate
+merano
+merbromin
+merca
+mercaptan
+mercaptide
+mercaptopurine
+merchet
+mercia
+mercians
+merengue
+mergui
+meristem
+meristic
+merkin
+merlon
+meroplankton
+merozoite
+merrymake
+merse
+mersin
+merthyr
+mesarch
+mesencephalon
+mesenchyme
+mesenteritis
+mesentery
+meshach
+meshuga
+mesitylene
+mesnalty
+mesobenthos
+mesocephalic
+mesocratic
+mesogastrium
+mesoglea
+mesognathous
+mesolithic
+mesolonghi
+mesomeric
+mesophyll
+mesophyte
+mesothelioma
+mesothelium
+messalina
+messene
+messenia
+messiaen
+messina
+messmate
+messmates
+mestee
+mester
+mestranol
+metacentres
+metacharacter
+metacharacters
+metachromatism
+metacinnabarite
+metafemale
+metagnathous
+metalline
+metallocene
+metallophone
+metamale
+metamer
+metanotion
+metanotions
+metaperiodate
+metaphosphoric
+metaphrase
+metaphrast
+metapolitics
+metaproduction
+metaproductions
+metasymbol
+metasymbols
+metasyntax
+metasyntaxes
+metatheory
+metatherian
+metathorax
+metaxylem
+metchnikoff
+metempirical
+metempirics
+metestrus
+methacrylic
+methaemoglobin
+methenamine
+metho
+methodius
+methotrexate
+methoxide
+meths
+methylcyclohexane
+methyldopa
+methylphthalate
+methylthionine
+metic
+metoestrus
+metonic
+metopic
+metricate
+metrify
+metritis
+metronidazole
+metronymic
+metrorrhagia
+metz
+meu
+meung
+meuse
+mezcal
+mezcaline
+mezereon
+mezereum
+mho
+miaou
+miaul
+micawber
+michelozzo
+mick
+mickery
+mickiewicz
+mickle
+microbalance
+microbalances
+microbarographs
+microbodies
+microbody
+microbrailler
+microchip
+microchips
+microconcrete
+microcrack
+microcracked
+microcracking
+microcracks
+microdetector
+microdont
+microdot
+microfabric
+microgel
+micrographs
+microkink
+microkinking
+micromixing
+micropalaeontology
+microphyte
+micropyrometer
+microsporophyll
+microstomatous
+microswitch
+microswitches
+microsystem
+microsystems
+microtherm
+microtomy
+microwatt
+microwatts
+microwriter
+microwriters
+micrurgy
+middlebreaker
+middlemost
+mideast
+midheaven
+midian
+midinette
+midiron
+midlothian
+mieres
+miffy
+mihrab
+milage
+milazzo
+mileometer
+miletus
+milkfish
+milkhouse
+milkwort
+millais
+millefleurs
+millepede
+millepore
+milli
+milligan
+millrun
+millwheel
+millwheels
+millwork
+milne
+milo
+milometer
+milometers
+milreis
+miltiades
+mimas
+mimetite
+mimir
+mimosaceous
+minacious
+minas
+minch
+mindoro
+mindszenty
+minelayer
+mineralocorticoid
+mineworker
+mineworkers
+minge
+mingus
+minho
+minibike
+minicab
+minicabs
+minimus
+minipill
+ministerialist
+ministerium
+minitab
+minivet
+minna
+minnesinger
+mintoff
+miombo
+mirabeau
+miracidium
+mirador
+miraflores
+mirepoix
+mirk
+mirza
+misallocate
+misallocated
+misallocates
+misallocating
+misallocation
+misapplys
+miscarrys
+misdeclared
+misdefined
+mise
+miseno
+misericord
+miskolc
+mislaid
+misplead
+misposition
+mispositioned
+mispositioning
+mispositions
+missal
+missals
+missel
+missis
+mississauga
+mississipi
+missolonghi
+misspelt
+missus
+mistal
+mistassini
+misti
+mistigris
+mistle
+mistral
+mistrals
+mither
+mithgarthr
+mithridate
+mithridates
+mithridatism
+miticide
+mitis
+mitrailleuse
+mitrewort
+mixolydian
+mizoram
+mizzen
+moa
+moab
+mobutu
+modena
+moderne
+modge
+modigliani
+modillion
+mofette
+mog
+mogador
+mogen
+moho
+mohole
+mohs
+mohur
+moidore
+moirai
+moke
+mokha
+mokpo
+molina
+molise
+mollah
+mollescent
+mollusc
+molluscoid
+molluscs
+mollweide
+molopo
+moltke
+molybdenous
+mombasa
+momism
+monacid
+monadelphous
+monadnock
+monaghan
+monal
+monanthous
+monas
+monaxial
+monazite
+monck
+monecious
+moneme
+monetarist
+moneychanger
+mong
+moniliform
+monkeypot
+monkfish
+monkshood
+monnet
+monoatomic
+monobasic
+monocarp
+monocarpellary
+monocarpic
+monocausal
+monochasium
+monochloride
+monochloroethanol
+monochord
+monoclinous
+monodispersity
+monody
+monohull
+monohydrate
+monohydric
+monohydroxy
+monoicous
+monolatry
+monoliths
+monomark
+monomerous
+mononucleosis
+monopetalous
+monophagous
+monophobia
+monophyllous
+monoplegia
+monopode
+monopodium
+monopteros
+monosemy
+monosepalous
+monosized
+monosodium
+monosome
+monospermous
+monostich
+monostichous
+monostome
+monostrophe
+monostylous
+monothetic
+monotower
+monotropism
+mons
+monsignor
+montagnard
+montagu
+montagues
+montale
+montane
+montauban
+montbretia
+montcalm
+montefiore
+montego
+monteith
+montenegro
+montero
+monterrey
+montesquieu
+montessori
+montfort
+montgolfier
+montherlant
+montmorillonite
+montparnasse
+montpellier
+montreuil
+montreux
+montrose
+monza
+monzonite
+moog
+moolvie
+moonfish
+moonflower
+moonraker
+moonshot
+moonwort
+moorfowl
+moorhen
+moorwort
+mopboard
+mopoke
+moquette
+mor
+mora
+moraceous
+morar
+morava
+morbific
+morbihan
+morbilli
+morcha
+mordecai
+mordred
+morea
+moreau
+morecambe
+moreen
+moreish
+morelia
+morello
+morelos
+morepork
+moresco
+morish
+mornay
+moroni
+morphallaxis
+morphogenesis
+morphophoneme
+morphosis
+morphotype
+morphotypes
+morphy
+morro
+mors
+morula
+morwong
+mos
+mosasaur
+moschatel
+moseley
+moshav
+moshesh
+moskva
+mosley
+mosotho
+mossbunker
+mossie
+mosso
+mosstrooper
+motherfucker
+motherwell
+motherwort
+mothy
+motmot
+motocross
+motorable
+motorbicycle
+motorbus
+motorcoach
+motown
+motte
+motu
+mouflon
+moujik
+mouldboard
+mouldy
+moulmein
+mousebird
+mousetail
+mousseline
+mouthbrooder
+mouthwash
+mouthwatering
+movietone
+moviola
+mowburnt
+moxa
+mucin
+muckamuck
+muckle
+mucksweat
+muckworm
+mucoid
+mucopolysaccharide
+mucoprotein
+mucopurulent
+mucro
+mucronate
+mudcat
+mudfish
+mudir
+mudlark
+mudpack
+mudra
+mudskipper
+mudskippers
+muenster
+muesli
+mufulira
+mugabe
+muggins
+mugwort
+muhammadan
+mujik
+muldoon
+muleta
+muleteer
+mulga
+mulhouse
+mulki
+mulley
+mulliken
+mullock
+mulloway
+multan
+multangular
+multeity
+multicide
+multidrop
+multifid
+multifile
+multiflora
+multifoil
+multifoliate
+multigravida
+multihop
+multihull
+multihulls
+multikey
+multikeys
+multilateralist
+multilateralists
+multimembered
+multinuclear
+multipacket
+multipara
+multiped
+multiplane
+multiplepoinding
+multipunch
+multipunched
+multireel
+multirole
+multiscreen
+multispectral
+multistorey
+multisubject
+multivariable
+multivibrator
+multivocal
+multiway
+multiword
+multure
+mumbo
+mumchance
+munga
+mungo
+muniment
+muniments
+munnion
+munro
+munsell
+munster
+munt
+muntin
+muntjac
+muntz
+murage
+murasaki
+murat
+murcia
+mure
+murex
+muricate
+murine
+murman
+murra
+murrelet
+murrhine
+murrumbidgee
+murther
+musaceous
+muscadel
+muscae
+muscarine
+muscid
+muscleman
+musclemen
+muscovado
+museology
+musil
+musjid
+muskeg
+muso
+musquash
+musset
+mustafa
+mustee
+musteline
+musth
+mutch
+mutchkin
+mutism
+mutsuhito
+muttonhead
+muttra
+mutule
+muzorewa
+muzz
+myalgia
+myalism
+myall
+myasthenia
+mycelium
+mycetoma
+mycetozoan
+mycin
+mycostatin
+mydriasis
+mydriatic
+myelencephalon
+myelin
+myelitis
+myeloma
+myiasis
+mylonite
+myna
+myocardiograph
+myogenic
+myograph
+myology
+myoma
+myope
+myrmecology
+myrmecophagous
+myrmecophile
+myrobalan
+myrtaceous
+mysia
+mystagogue
+mythopoeia
+mytilene
+myxoedema
+myxoma
+myxomatosis
+myxomycete
+myxovirus
+mzee
+mzungu
+nabis
+nabla
+nablas
+nablus
+nabob
+naboth
+nacre
+nae
+naevus
+nagor
+naha
+nailbrush
+nailfile
+nailhead
+nainsook
+naira
+nairn
+naissant
+naker
+nakhichevan
+nakuru
+nalchik
+nalgo
+namangan
+namas
+namelist
+namelists
+namen
+nametape
+namhoi
+namur
+nanak
+nanchang
+nanda
+nanga
+nankeen
+nanning
+nanometric
+nanoplankton
+nanterre
+nantes
+nantung
+naphtali
+naphthyl
+napiform
+nappa
+nara
+narbada
+narceine
+narcoanalysis
+narcosynthesis
+narcotism
+nardoo
+nares
+narial
+nark
+narmada
+narthex
+narva
+narvik
+naseberry
+naseby
+nashe
+nasho
+nasion
+nasofrontal
+nasopharynx
+nasser
+nastase
+natheless
+natrium
+natrolite
+natron
+natsopa
+natter
+natterjack
+naturism
+naturopathy
+nauch
+naucratis
+naumachia
+nauplius
+naur
+nautch
+nautiloid
+navar
+navarin
+navarino
+navarre
+navew
+navicert
+navratilova
+navvy
+naxalite
+naxos
+naze
+ndola
+neagh
+neap
+nearside
+neb
+nebo
+nebuchadnezzar
+neckar
+neckband
+neckcloth
+neckpiece
+neckwear
+necrobiosis
+necrolatry
+necromania
+necrophobia
+necrose
+necrotomy
+neddy
+needlecord
+needlecraft
+needlefish
+needleful
+neep
+nefertiti
+negev
+negresses
+negrillo
+negritude
+negropont
+negros
+neisse
+nek
+nekton
+neman
+nemathelminth
+nemea
+nemertean
+nemery
+nene
+neoarsphenamine
+neocolonialism
+neoconservative
+neoimpressionism
+neoplasty
+neoscholasticism
+neper
+nephogram
+nephograph
+nephology
+nephralgia
+nephridium
+nephrite
+nephritic
+nephritis
+nephron
+nephrosis
+nephrotomy
+nepos
+neral
+nereus
+neritic
+nernst
+neroli
+neruda
+nerva
+nerval
+nervate
+nervine
+nervure
+nesh
+nesselrode
+nessus
+nestorius
+netaji
+netball
+neto
+netsuke
+nett
+neume
+neurasthenia
+neurectomy
+neurilemma
+neuro
+neuroblast
+neurocoele
+neurogram
+neurohypophysis
+neurolemma
+neuroma
+neuropath
+neuropsychiatry
+neuropteran
+neuropterous
+neurotomy
+neurotransmitter
+neurotransmitters
+neurovascular
+neusatz
+neuss
+neustria
+neutretto
+newshawk
+newspeak
+ney
+nez
+niblick
+nicknack
+nickpoint
+nicotinism
+nictheroy
+nictitate
+nictitating
+nidaros
+niddering
+nide
+nidicolous
+nidify
+nidus
+niebuhr
+niello
+niemen
+nieve
+niff
+nightlife
+nightrider
+nightspot
+nightwear
+nigrescent
+nigrify
+nigritude
+nihon
+niigata
+nilgai
+nilgiri
+nim
+nimblewit
+nimonic
+ningsia
+ninus
+niobic
+niobous
+niort
+nipa
+nipigon
+nipplewort
+nippur
+nishinomiya
+nisus
+niton
+nitramine
+nitrobacteria
+nitrochloroform
+nitrohydrochloric
+nitrometer
+nitromethane
+nitroso
+nitrosyl
+nival
+nivation
+niven
+niveous
+nivernais
+nixie
+nizhni
+njord
+nkomo
+nkrumah
+nobbut
+nobiliary
+noctilucent
+noctuid
+noctule
+noesis
+nofretete
+noh
+noil
+noisette
+nolde
+nolle
+nomarch
+nomarchy
+nombles
+nombril
+nome
+nomen
+nomism
+nomocracy
+nonactive
+nonaggression
+nonaligned
+nonanalytic
+nonanoic
+nonappearance
+nonblank
+nonblanks
+noncausal
+noncomputable
+noncontributory
+noncritical
+nondirected
+nondispersive
+noneffective
+nonego
+nonet
+nonevent
+nonexecutable
+nong
+nonharmonic
+nonhierarchic
+nonhierarchical
+nonhuman
+nonidentical
+noninteger
+noninvertible
+nonnumeric
+nono
+nonowner
+nonowners
+nonparametrical
+nonparous
+nonparty
+nonproliferation
+nonrecursive
+nonrecursively
+nonredundant
+nonrelevance
+nonrelevant
+nonsequenced
+nonsmoker
+nonsmokers
+nonstarter
+nonstative
+nonstick
+nonstriated
+nonsuch
+nonsuit
+nonunionism
+nonvocal
+nonvoter
+nonvoting
+noordbrabant
+nopal
+nord
+nordau
+norepinephrine
+norge
+noria
+noricum
+norite
+nork
+norodom
+northmost
+noseband
+nosography
+nostology
+notelet
+noticeboard
+noticeboards
+notifiable
+notitia
+notochord
+notum
+noumenon
+novalis
+novara
+novation
+novaya
+novelese
+novello
+novercal
+nowel
+nowhence
+nowt
+nox
+noyade
+noyau
+noyon
+nubecula
+nubians
+nucha
+nuddy
+nudicaul
+nudum
+nuevo
+nuggar
+nuggety
+nuissance
+nuke
+nukus
+nullah
+nullarbor
+nullifidian
+nullipara
+numantia
+numbat
+numberplate
+numbfish
+numbles
+numdah
+numen
+numerary
+numidia
+nummary
+nummulite
+numnah
+nunatak
+nunc
+nuncio
+nuncle
+nunhood
+nunny
+nureyev
+nuri
+nuristan
+nurmi
+nusa
+nutant
+nutbrown
+nutcase
+nutgall
+nuthouse
+nutlet
+nutter
+nutwood
+nyala
+nyanza
+nyasa
+nyctaginaceous
+nyctalopia
+nyctinasty
+nyctitropism
+nyctophobia
+nye
+nyeman
+nyerere
+nylghau
+nympha
+nymphaeaceous
+nympho
+nystatin
+nyx
+oakum
+oarfish
+oarlock
+oast
+oates
+oba
+oban
+obasanjo
+obconic
+obedientiary
+oblanceolate
+obligato
+obmutescence
+obolus
+obote
+obreption
+obscurum
+obsecrate
+obsequent
+obstipation
+obvolute
+oca
+occasionalism
+occular
+occultate
+oceanid
+oceanus
+ochlophobia
+ochone
+ochrea
+ockeghem
+ocker
+ocode
+octachord
+octad
+octahedrite
+octamerous
+octanedioic
+octangle
+octangular
+octarchy
+octaroon
+octavalent
+octavo
+octocentenary
+octonary
+octu
+octuple
+octylphenylether
+ocularist
+oddfellow
+odense
+odoacer
+odontalgia
+odontoblast
+odontograph
+odontoid
+odontophore
+odovacar
+odra
+odyl
+oecology
+oenone
+oestrin
+oestrogen
+oestrone
+oestrous
+oestrus
+ofay
+offa
+offaly
+offcut
+offcuts
+officinal
+offline
+ogaden
+ogasawara
+ogbomosho
+ogdoad
+ogee
+ogun
+oho
+oilbird
+oilcup
+oilfield
+oilfired
+oise
+oita
+oka
+okavango
+oke
+okta
+oldwife
+oleaceous
+olecranon
+olefine
+olefinic
+oleic
+olein
+oleograph
+oleoresin
+oleum
+olibanum
+olid
+oligopsony
+oligotrophic
+oliguria
+olio
+oliphant
+olivaceous
+olivary
+olivenite
+olivier
+olla
+olm
+ology
+olomouc
+oloroso
+olszyn
+omadhaun
+omagh
+omar
+omasum
+omayyad
+ombre
+omdurman
+ommatidium
+ommatophore
+omnicompetent
+omnific
+omophagia
+omphale
+omphalos
+omuta
+onager
+onagraceous
+onassis
+ondes
+ondo
+ondograph
+ondometer
+onega
+onitsha
+onlook
+onomasiology
+onychophoran
+onymous
+oof
+oogamy
+oogenesis
+oogonium
+ooh
+oolite
+oology
+oolong
+oomiak
+oompah
+oont
+oophorectomy
+oophoritis
+oophyte
+oose
+oosperm
+oosphere
+oospore
+oostende
+ootheca
+ootid
+opah
+opalesce
+ope
+opencast
+operose
+ophicleide
+ophir
+ophthalmia
+ophthalmitis
+opisometer
+opisthobranch
+opisthognathous
+opiumism
+oppidan
+oppilate
+oppugnant
+opsimath
+optacon
+optacons
+optoelectronic
+optometer
+oracy
+oradea
+oran
+orc
+orcein
+orchestrina
+orchidaceous
+orchil
+orchitis
+orcinol
+orczy
+ordinator
+ordinators
+ordonnance
+ordzhonikidze
+oread
+orectic
+orel
+orense
+orfe
+orfray
+organogenesis
+organography
+organoleptic
+organology
+organon
+organotherapy
+organum
+organza
+organzine
+orgeat
+oribi
+oriel
+oriente
+origen
+orinasal
+orissa
+orizaba
+orjonikidze
+orkneys
+orle
+orlon
+orlop
+ormer
+ormolu
+ormuz
+orne
+ornis
+ornithischian
+ornithomancy
+ornithopod
+ornithopter
+ornithoscopy
+ornithosis
+orobanchaceous
+oroide
+orometer
+orontes
+orozco
+orpharion
+orphrey
+orpiment
+orpine
+orrery
+orris
+orsini
+ortegal
+orthohydrogen
+orthophosphoric
+orthophosphorous
+orthopter
+orthopterous
+orthoptic
+orthoptics
+orthostichy
+orthotone
+ortles
+oruro
+oryol
+oscitancy
+osculant
+oscular
+osman
+osmious
+ossa
+ossein
+ossetia
+ossie
+ossietzky
+ossiferous
+osso
+osteal
+ostend
+ostensory
+osteoclasis
+osteogenesis
+osteomalacia
+osteomyelitis
+osteotome
+osteotomy
+ostia
+ostinato
+ostiole
+ostium
+ostler
+ostmark
+ostosis
+ostracoderm
+ostracon
+ostrava
+ostwald
+otalgia
+othergates
+othman
+otho
+otic
+otitis
+otocyst
+otolaryngology
+otology
+otoscope
+otranto
+ottar
+ottava
+otterburn
+otway
+ouachita
+ouananiche
+oubangui
+oudh
+ouessant
+oujda
+oulu
+ouse
+ousel
+outasight
+outdate
+outjockey
+outlist
+outman
+outrunner
+outrush
+outswing
+outwash
+outwith
+ovenproof
+ovenproofed
+ovenproofing
+ovenproofs
+ovenware
+overachieve
+overachieved
+overachiever
+overachieves
+overachieving
+overarch
+overblouse
+overboot
+overcheck
+overcloud
+overcompetence
+overconsolidate
+overconsolidated
+overconsolidates
+overconsolidating
+overconsolidation
+overcrop
+overdetermine
+overdetermines
+overdetermining
+overdye
+overfold
+overground
+overhype
+overhyped
+overhypes
+overhyping
+overleaf
+overlive
+overmantel
+overmatter
+overnice
+overpitch
+overrunning
+overscale
+overscore
+overset
+oversew
+overside
+oversleeve
+overspent
+overstaff
+overstaffed
+overstaffing
+overstaffs
+overstepped
+overstress
+overstressed
+overstruck
+overtask
+overtype
+overtyping
+oviedo
+oviferous
+ovisac
+owelty
+owerri
+owt
+oxenstierna
+oxhide
+oxidimetry
+oxime
+oxon
+oxonium
+oxpecker
+oxter
+oxtongue
+oxus
+oxyacetylene
+oxyacid
+oxycephaly
+oxychloride
+oxyhaemoglobin
+oxysalt
+oxysulphide
+oxytetracycline
+oxytocic
+oxytocin
+oxytone
+oyer
+oyez
+oyo
+oystercatcher
+ozalid
+ozonolysis
+ozs
+pabulum
+paca
+paceway
+pacha
+pachalic
+pachuca
+pachuco
+padang
+padauk
+paddlefish
+pademelon
+paderborn
+padishah
+padma
+padouk
+padova
+padsaw
+padua
+paduasoy
+paederast
+paediatrician
+paediatrics
+paedogenesis
+paedology
+paedomorphosis
+paedophilia
+paeony
+pageful
+pagefuls
+pagurian
+pah
+pahang
+pahsien
+paigle
+paillasse
+paillette
+painkiller
+paintbox
+paisa
+paisano
+pakeha
+paki
+palaeanthropic
+palaeethnology
+palaeoanthropology
+palaeobotany
+palaeoclimatology
+palaeoecological
+palaeoecology
+palaeoethnobotany
+palaeogene
+palaeography
+palaeolith
+palaeolithic
+palaeomagnetism
+palaeontography
+palaeozoology
+palais
+palawan
+palea
+palembang
+palencia
+palestra
+palestrina
+paletot
+paley
+palikar
+palimpsest
+palindromicity
+palk
+palladic
+palladio
+palladous
+pallete
+palma
+palmaceous
+palmira
+palolo
+palooka
+palos
+palour
+palpebrate
+palsgrave
+palstave
+pamirs
+pampero
+pamphrey
+pamphylia
+pamplona
+panada
+panatella
+panatellas
+panay
+panchax
+panchayat
+panchen
+pancosmism
+pancreatin
+pandanaceous
+pandore
+pandour
+pandowdy
+pandurate
+pandy
+pandybat
+panellist
+panellists
+panettone
+panga
+panicmonger
+paniculate
+panjim
+pankhurst
+panmixia
+panmunjom
+pannage
+panne
+pannikin
+pannonia
+panocha
+panoptic
+pansophy
+pantechnicon
+pantelleria
+pantihose
+panto
+pantoum
+paoting
+paotow
+papadopoulos
+papain
+papandreou
+papaveraceous
+papaverine
+papaya
+papeete
+paperbark
+paperclip
+paperclips
+paperknife
+paperknives
+paperless
+paperthrow
+papeterie
+paphlagonia
+paphos
+papier
+papilionaceous
+pappus
+papule
+papyraceous
+papyrology
+parabasis
+parablast
+parabrake
+paracasein
+paracetamol
+parachronism
+paraclete
+paradrop
+paraesthesia
+paraformaldehyde
+paragoge
+parahydrogen
+paralanguage
+paraldehyde
+paralipomena
+paramaribo
+paramatta
+paramo
+paramorph
+paramorphine
+paramorphism
+parang
+parapraxis
+parashah
+parasitology
+parastichy
+parasyntheton
+parcae
+parcheesi
+parclose
+pardalote
+pardubice
+pareira
+parergon
+paresis
+paresthesia
+pareu
+pareve
+parfleche
+parget
+parhelic
+parhelion
+paripinnate
+parishad
+parison
+parisyllabic
+parkin
+parky
+parlando
+parleyvoo
+parliamentarianism
+parm
+parmenides
+parmentier
+parmigianino
+parnell
+paroicous
+parotic
+parotoid
+parousia
+parramatta
+parrel
+parrotfish
+parthia
+particlar
+partita
+partlet
+parturifacient
+parulis
+parzival
+pasargadae
+pasay
+pase
+pash
+pashalik
+pashka
+pashm
+pasionaria
+pasolini
+pasqueflower
+pasquinade
+passacaglia
+passade
+passant
+passepied
+passifloraceous
+passionflower
+pastis
+pasto
+patagium
+patellate
+pathfind
+pathic
+pathlength
+pathognomy
+patiala
+paticularly
+patin
+patisserie
+patmore
+patna
+paton
+patras
+patrial
+patriclinous
+patrilocal
+patroclus
+patrology
+pau
+paua
+paucal
+pauldron
+pauling
+paumotu
+pausanias
+pav
+pavage
+pavane
+pavis
+pavlodar
+pavlova
+pavonine
+pawky
+pawnees
+paxwax
+paynim
+peag
+peake
+pean
+pearlwort
+pearmain
+peart
+peary
+peasouper
+peau
+peavey
+pechora
+peckinpah
+peckish
+pectase
+pecten
+peculium
+pedalo
+pedate
+pedatifid
+pedi
+pedicular
+pediform
+pedunculate
+peebles
+peen
+peened
+peening
+peens
+peepshow
+peepul
+peetweet
+peewit
+pegmatite
+pegu
+peipus
+peiraeus
+peirce
+pejoration
+pekan
+peke
+pelagius
+pelargonic
+pelargonium
+pelerine
+pelf
+pelion
+pelisse
+pelite
+pella
+pelles
+pelletier
+pellicle
+pelmet
+peloponnese
+peltast
+peltier
+pemba
+pemphigus
+penang
+penchi
+pendente
+penderecki
+pendragon
+peneplain
+peneus
+pengpu
+penillion
+peninsulate
+penki
+pennine
+pennines
+penninite
+pennon
+pennoncel
+pennycress
+pennyweight
+pennywort
+pennyworth
+penrith
+penstemon
+penstock
+penta
+pentachlorophenol
+pentangular
+pentanoic
+pentaprism
+pentastich
+pentatomic
+pentelikon
+pentene
+penthesileia
+pentheus
+pentimento
+pentlandite
+pentose
+pentothal
+pentoxide
+pentyl
+pentylenetetrazol
+penuchle
+penza
+penzance
+pepin
+peplos
+peplum
+pepo
+pepperwort
+pepsinate
+pera
+peracid
+peraea
+perak
+perborate
+perchloric
+perchloride
+percoid
+perdido
+perdu
+pereira
+perfin
+pergamum
+pergolesi
+peri
+perianth
+periapt
+periblem
+periclase
+periclinal
+pericline
+pericope
+periglacial
+perigon
+perigordian
+perinephrium
+perineuritis
+perineurium
+periodate
+perionychium
+periosteum
+periostitis
+peripteral
+perique
+perisarc
+perisperm
+perispomenon
+perissodactyl
+peristalsis
+peristome
+peristyle
+perithecium
+peritoneum
+peritrack
+periwig
+perlis
+perlocution
+permanganate
+permanganic
+pernambuco
+pernickety
+pernik
+pernod
+perogative
+peroxysulphuric
+perpignan
+perrault
+perrin
+perron
+persalt
+perse
+persephone
+persepolis
+persiennes
+personalty
+perspectivism
+perspex
+persulphate
+persulphuric
+pertussis
+perugia
+perugino
+peruke
+perutz
+peruzzi
+perv
+pes
+pesade
+pesaro
+pescadores
+pescara
+peseta
+pesewa
+peshawar
+peshitta
+pestalozzi
+pesthole
+pesthouse
+petaliferous
+petalody
+petechia
+pethidine
+petrarch
+petrodollar
+petrograd
+petrolic
+petsamo
+pettifogging
+pettitoes
+petuntse
+pevsner
+pewit
+phagedaena
+phagomania
+phagophobia
+phalangeal
+phanerocrystalline
+phanerophyte
+phanerozoic
+pharmacophore
+pharmacophores
+pharmacophoric
+pharsalus
+pharyngology
+pharyngoscope
+pharyngotomy
+phatic
+pheidippides
+phelloderm
+phellogen
+phenacaine
+phenacetin
+phenacite
+phenanthrene
+phenazine
+phenetic
+phenformin
+phenix
+phenolphthalein
+phenomenom
+phenylamine
+phenylketonuria
+phew
+phidias
+phidippides
+philae
+philby
+philemon
+philhellene
+philibeg
+philippi
+philippics
+philippopolis
+philips
+philistines
+phillips
+phillumenist
+philomel
+phimosis
+phiz
+phlebosclerosis
+phlogopite
+phlyctena
+phnom
+phocaea
+phocine
+phocis
+phocomelia
+phoebus
+phoenicians
+phomvihane
+phonendoscope
+phonetist
+phonometer
+phonoscope
+phonotactics
+phonotype
+phonotypes
+phonotypy
+phooey
+phosgenite
+phosophoric
+phosphatase
+phosphaturia
+phosphino
+phosphonium
+phosphoprotein
+phosphorate
+phosphoroscope
+phossy
+phot
+photoactinic
+photoactive
+photochronograph
+photoconduction
+photoelastic
+photoelasticity
+photoelectrotype
+photofit
+photonasty
+photoneutron
+photophysical
+photophysics
+photopolymer
+photoselected
+photoselection
+phototherapy
+photothermic
+phototonus
+phototopography
+phototransistor
+phototype
+phototypeset
+photozincography
+phrasal
+phrenitis
+phrixus
+phrygia
+phthalein
+phthalic
+phthalocyanine
+phthiriasis
+phthisic
+phthisis
+phut
+phyfe
+phyllite
+phylloquinone
+phyllotaxis
+physicochemical
+physiocrat
+physoclistous
+physostomous
+phytogenesis
+phytohormone
+phytolith
+phytoliths
+phytotoxin
+phytotron
+piacenza
+piacular
+piaf
+piaffe
+piaget
+piave
+piaza
+picardy
+piccanin
+piccaninny
+piccard
+pichiciego
+pickerelweed
+pickin
+pico
+picong
+picot
+picotee
+picrate
+picric
+picrite
+picrotoxin
+pictogram
+pictor
+picts
+picul
+piddock
+piedmontite
+pieman
+piemonte
+pieria
+pieridine
+piero
+piezo
+piezochemistry
+pigface
+pigfaced
+pigfish
+piggin
+piggledy
+piggott
+pigmeat
+pignut
+pigswill
+pigweed
+pika
+pikelet
+pikeperch
+pilatus
+pilau
+pilch
+pilcomayo
+pileous
+pili
+piliferous
+piliform
+pilliwinks
+pillwort
+pilocarpine
+pilose
+pimiento
+pimpernel
+pinaceous
+pinchpenny
+pinckney
+pindar
+pindus
+pinero
+pinfeather
+pinfish
+pinguid
+pinite
+pinnatifid
+pinnatipartite
+pinnatiped
+pinnatisect
+pinny
+pinochet
+pinole
+pintadera
+pinturicchio
+pinwork
+pinworm
+piny
+piolet
+pipa
+pipeclay
+pipefitting
+piperaceous
+pipewort
+pipistrelle
+pipsqueak
+piragua
+pirandello
+piranesi
+pirhouette
+pirn
+pirog
+pirozhki
+piscary
+piscatorial
+pisgah
+pish
+pishogue
+pishpek
+pisistratus
+pissarro
+pistareen
+piste
+pistoia
+pitapat
+pitchometer
+pitchometers
+pithos
+pitot
+pitsaw
+pituri
+pityriasis
+piura
+pix
+pize
+pizzle
+placet
+placoderm
+placoid
+plafond
+plagioclimax
+plagiotropism
+plainchant
+plainsong
+planchette
+planform
+planimetry
+plano
+planogamete
+planometer
+plantagenet
+plantigrade
+plantocracy
+plash
+plashy
+plasmodesma
+plasmosome
+plassey
+plastometer
+plata
+plataea
+platan
+platelayer
+platelayers
+platemark
+platemarks
+plath
+platiniferous
+platiniridium
+platinocyanic
+platinocyanide
+platinoid
+platinotype
+platy
+platyhelminth
+platyrrhine
+plauen
+playgroup
+playgroups
+playlet
+playschool
+pleach
+pleasance
+pleb
+plebby
+plectognath
+pled
+pleiad
+pleiocene
+pleiotropism
+pleochroism
+pleomorphism
+pleonasm
+pleopod
+plesiosaur
+plessor
+plethysmograph
+pleurodynia
+pleuron
+pleuropneumonia
+pleurotomy
+pleuston
+pleven
+plexor
+plica
+plicate
+ploat
+plodge
+plonk
+plonko
+plotinus
+plottable
+ploughboys
+ploughmen
+ploughs
+ploughstaff
+plumate
+plumbaginaceous
+plumbicon
+plumbum
+pluriliteral
+pluripresence
+plutus
+pluviometer
+pluvious
+pma
+pneuma
+pneumobacillus
+pneumoconiosis
+pneumodynamics
+pneumogastric
+pneumograph
+pneumonectomy
+pneumonitis
+pneumothorax
+pnom
+poaceous
+pochard
+pococurante
+pocus
+poddy
+podesta
+podgorica
+podophyllin
+podsol
+poenology
+pogey
+pogge
+pogy
+pohai
+pohutukawa
+poind
+pointsman
+poitiers
+poitou
+pokeberry
+pokelogan
+pokeweed
+pokie
+pola
+polacre
+poleaxe
+polemarch
+polemoniaceous
+polenta
+poleyn
+pollaiuolo
+pollan
+pollinosis
+polliwog
+polony
+poltava
+poly
+polyadelphous
+polyamide
+polyatomic
+polybasic
+polybius
+polyconic
+polycrates
+polydemic
+polydeuces
+polydipsia
+polydisperse
+polydispersity
+polyembryony
+polygalaceous
+polygnotus
+polygonaceous
+polyhydric
+polyisoprene
+polymerous
+polynices
+polyoxyethene
+polyphosphoric
+polyphyodont
+polypod
+polyprotodont
+polypus
+polysulphide
+polysyllogism
+polythetic
+polythionic
+polyvinylidene
+polyxena
+pom
+pombal
+pombe
+pomfret
+pomiculture
+pommern
+pommy
+pomorze
+pompidou
+pondicherry
+pondokkie
+pondweed
+pone
+pongee
+pongid
+poniard
+ponta
+pontchartrain
+pontefract
+pontevedra
+pontianak
+pontifex
+pontil
+pontormo
+pontus
+pontypool
+pontypridd
+pooftah
+poon
+poona
+poonce
+poove
+popedom
+popeyed
+poppadom
+popsicle
+popsy
+porbeagle
+pori
+porirua
+porism
+porkpie
+pornocracy
+poromeric
+porosimeter
+porphyrogenite
+porsena
+portadown
+portfire
+portlaoise
+portobello
+portulacaceous
+posho
+posology
+poss
+possie
+postcava
+postcode
+postcodes
+postexilian
+posticous
+postie
+postil
+postimpressionism
+postliminy
+postmeridian
+postrider
+potamic
+potamology
+potatory
+potch
+potentiostat
+pothecary
+potherb
+potiche
+potiphar
+potman
+potoroo
+potyomkin
+pouncet
+powan
+powys
+poyang
+pozsony
+pozzuolana
+pozzuoli
+pozzy
+pracharak
+pradesh
+praemunire
+praenomen
+praetor
+praetorius
+pragmat
+pragmats
+praha
+prajna
+pralltriller
+prang
+prat
+prato
+prau
+praxiteles
+preadamite
+precall
+precatory
+precedential
+preceed
+precis
+precompile
+precompiled
+precompiles
+precompiling
+preconnected
+preconnection
+preconsolidate
+preconsolidated
+preconsolidates
+preconsolidating
+preconsolidation
+predella
+predeterminate
+predial
+predicant
+predikant
+prednisone
+predrilled
+prefill
+prefilled
+prefilling
+prefills
+preglacial
+preincubate
+preincubated
+preincubates
+preincubating
+prelacy
+prelatism
+prelect
+prelexical
+prelims
+premaxilla
+premedication
+premiership
+premultiplied
+premultiply
+premultiplying
+premultiplys
+prenomen
+prenominal
+preopened
+preoxidation
+prepositor
+prerelease
+presa
+prescan
+prescriptible
+prescriptivism
+presentationism
+pression
+prestel
+prestonpans
+prestwich
+preterhuman
+pretonic
+pretor
+pretorius
+previse
+priapism
+pribilof
+priestcraft
+prill
+primaeval
+primaquine
+primatives
+primigravida
+primine
+primordium
+primulaceous
+prisage
+proc
+procarp
+proceleusmatic
+prochronism
+proclus
+procopius
+proctoscope
+procuratory
+producable
+proem
+profiterole
+progenitive
+proleg
+prolegomenon
+prolepsis
+promethazine
+promycelium
+propanoic
+propenamide
+propene
+propertius
+propionic
+propjet
+propontis
+propylaeum
+propylite
+proserpina
+prostheses
+prostyle
+protagoras
+protandrous
+protanopia
+proters
+protestantism
+protoactinium
+protochordate
+protogynous
+protomorphic
+protosemitic
+prototherian
+protoxide
+protrusile
+protuberate
+protude
+protudes
+protuding
+protyle
+proudhon
+proustite
+prout
+proventriculus
+provo
+provocate
+provocations
+proxima
+prudentius
+prunelle
+prut
+prynne
+prytaneum
+psammite
+psephite
+pseudaxis
+pseudepigrapha
+pseudocarp
+pseudocode
+pseudomorph
+pseudomutuality
+pseudopodium
+pseudorandom
+pshaw
+psilocybin
+psilomelane
+psittacine
+psittacosis
+psoas
+psoriasis
+psst
+psychasthenia
+psychohistory
+psychomimetic
+psychotechnics
+ptah
+pteridology
+pteridophyte
+pteridosperm
+pteropod
+pterosaur
+pterygoid
+pteryla
+ptisan
+ptochocracy
+ptolemaeus
+ptosis
+ptyalin
+ptyalism
+pudsey
+puebla
+puerilism
+puffbird
+puffbirds
+puget
+puglia
+pugwash
+pula
+pullorum
+pulsatile
+pulsejet
+pulvinate
+punakha
+punce
+punchable
+punchbowl
+punchbowls
+pune
+punjab
+punka
+punnet
+punnets
+punta
+purana
+puri
+purim
+purpurin
+pushkin
+pushrod
+pushrods
+pushto
+putamen
+putto
+putumayo
+puvis
+puy
+pya
+pyaemia
+pydna
+pye
+pyelography
+pylorectomy
+pylos
+pym
+pyogenesis
+pyoid
+pyosis
+pyramus
+pyranometer
+pyrazole
+pyrenees
+pyroconductivity
+pyrogallate
+pyrognostics
+pyrographic
+pyrography
+pyrolysed
+pyrolysing
+pyromagnetic
+pyrone
+pyrophosphoric
+pyrophotometer
+pyrophyllite
+pyrostat
+pyrosulphate
+pyrosulphuric
+pyrrha
+pyrrho
+pyrrolidine
+pyrruvic
+pythias
+qaboos
+qaddafi
+qaddish
+qadi
+qairwan
+qattara
+qeshm
+qibla
+qintar
+qishm
+qoph
+quadragenarian
+quadragesimal
+quadraplegic
+quadrella
+quadriga
+quadrinomial
+quadriplegia
+quadrophonics
+quadrumanous
+quadruplex
+quaere
+quagga
+quaggy
+quaky
+quale
+quango
+quangos
+quaquaversal
+quare
+quarrian
+quarterlight
+quarterlights
+quartersaw
+quashi
+quasicontinuous
+quasiorder
+quasiperiodic
+quasistationary
+quass
+quathlamba
+quatre
+quebracho
+queencake
+queensberry
+quelpart
+quelquechose
+quemoy
+queneau
+quenelle
+quercetin
+quercine
+quesnay
+quetta
+quetzalcoatl
+quiberon
+quidnunc
+quillet
+quillon
+quilmes
+quim
+quinacrine
+quinary
+quinate
+quincentenary
+quindecagon
+quindecaplet
+quindecennial
+quinic
+quinnat
+quinol
+quinone
+quinonoid
+quinquagenarian
+quinquecentenary
+quinquefoliate
+quinquepartite
+quinquereme
+quinsy
+quintan
+quintana
+quintero
+quintilian
+quinze
+quipu
+quire
+quirinus
+quist
+quiverful
+qum
+qumran
+quokka
+quotha
+rabato
+rabaul
+rabbath
+rabbitfish
+rabbitoh
+racecard
+racecards
+racegoer
+racegoers
+raceme
+rachmanism
+rada
+radicel
+radiguet
+radioactivate
+radiocommunication
+radioligand
+radioluminescence
+radiomicrometer
+radiophonic
+radioscope
+radiotelegram
+radiotelemetry
+radioteletype
+radiothermy
+radiotoxic
+radom
+raeburn
+raf
+raffinate
+ragbolt
+ragusa
+ragworm
+ragworms
+ragwort
+rahman
+railcar
+railcars
+railwayman
+rainband
+rainbird
+raincheck
+rainforest
+rainout
+raison
+rajab
+rajahs
+rajasthan
+rajkot
+rajputana
+rajya
+rakata
+rakehell
+raki
+rallentando
+ralline
+rallycross
+ramachandra
+ramakrishna
+ramat
+ramayana
+rambert
+rambutan
+rameau
+ramjet
+ramjets
+rammish
+rampur
+ramsay
+ramsgate
+ramsons
+ramtil
+ramulose
+rancagua
+rance
+rancherie
+ranchero
+ranchi
+randan
+randers
+ranee
+rangefinder
+rani
+ranjit
+ranmoor
+ransome
+ranunculaceous
+rapacki
+rapeseed
+raphe
+raphide
+rapparee
+rara
+raree
+rareripe
+rarotonga
+rasbora
+rase
+rasht
+rask
+raspatory
+rasputin
+rasse
+ratan
+ratatouille
+ratbag
+ratbaggery
+ratbite
+rateen
+ratfink
+ratfish
+ratha
+rathenau
+ratiometer
+ratisbon
+ratite
+ratlam
+rato
+ratsbane
+rattigan
+rattish
+rattlebox
+rattoon
+ravelin
+ravenna
+ravin
+rawalpindi
+rawsthorne
+raylet
+razee
+razoo
+razzia
+razzle
+reade
+readonly
+readwrite
+realgar
+reallot
+reallotment
+reapplied
+reapplies
+reapply
+rearguard
+rearguards
+reassertion
+reassociation
+reast
+rebato
+rebec
+rebell
+rebellow
+rebid
+rebond
+rebonded
+rebonding
+rec
+recalesce
+recaption
+receiptor
+recept
+recipience
+recluster
+reclustering
+recodified
+recodifies
+recodify
+recodifying
+recognizee
+recompilation
+reconsolidate
+reconsolidating
+recrement
+rectillinear
+rectocele
+recuperator
+recurrency
+recursivity
+recurvate
+recurve
+redan
+redback
+redbrick
+redbug
+redcurrant
+redd
+redditch
+reddle
+redeye
+redfin
+rediffusion
+redingote
+redon
+redose
+redowa
+reductionalist
+redware
+reebok
+reedling
+reen
+reflate
+reflated
+reflates
+reflating
+reflet
+regelate
+reger
+reggae
+reggio
+regin
+regiomontanus
+rego
+regrate
+regulable
+reigate
+reims
+reinsertion
+reintroduction
+reinvoke
+reinvoking
+reith
+rejig
+rejuvenesce
+relatum
+relearn
+religionism
+reluct
+remainderman
+remittee
+remix
+remixes
+remixing
+remontant
+remontoir
+remora
+remould
+remoulded
+remoulding
+removalist
+remscheid
+rendzina
+renegado
+reni
+rennes
+renvoi
+reorientate
+reorientated
+reorientates
+reorientating
+repassivation
+repechage
+replevy
+replicable
+replicator
+replicators
+repoint
+repone
+repot
+reprocessor
+reprography
+reptant
+resample
+resampling
+resaturate
+resaturating
+resaturation
+rescissible
+reseat
+reseau
+reselection
+resequence
+resettle
+residentiary
+resiniferous
+resipiscence
+resistencia
+resit
+resnais
+resnatron
+respecifies
+respecify
+resrict
+restiform
+restorationism
+restransmit
+resubmission
+resurrectionism
+rete
+retene
+retension
+retensioned
+retentionist
+retiary
+retinite
+retro
+retroact
+retrochoir
+retrodiction
+retroject
+reuchlin
+reus
+reuter
+reutlingen
+reval
+revanchism
+revelationist
+reverberator
+reversi
+reverso
+revoice
+rewire
+rewiring
+rexine
+reynaud
+reynosa
+rhabdomyoma
+rhachis
+rhaetia
+rhee
+rhein
+rheobase
+rheotaxis
+rheotropism
+rhetic
+rheydt
+rhigolene
+rhinology
+rhinoplasty
+rhizomorph
+rhodic
+rhodinal
+rhodos
+rhotacism
+rhotic
+rhumbatron
+rhynchocephalian
+rhyton
+ria
+ribbentrop
+ribble
+ribbonfish
+ribbonwood
+ribera
+ribwort
+ribworts
+ricardo
+riccio
+ricercare
+richelieu
+richthofen
+ricinoleic
+rickettsial
+rident
+ridgetree
+ridgeway
+ridley
+riefenstahl
+riempie
+rienzi
+rightable
+righthand
+righthanded
+rightish
+righto
+rightwinger
+rightwingers
+rigi
+rigil
+rimester
+rimu
+rinforzando
+ringgit
+ringhals
+ringinglow
+ringster
+ripcord
+ripon
+ripplet
+rissole
+risus
+ritardando
+ritenuto
+ritornello
+rivage
+rizal
+rizzio
+roadholding
+roadroller
+roadrollers
+robben
+robbia
+roborant
+roca
+rocaille
+rockery
+rockweed
+rodomontade
+roentgenopaque
+roeselare
+rogatory
+roget
+rollaway
+rollbar
+rollmop
+rollmops
+rollneck
+rollway
+rone
+roneo
+ronggeng
+roo
+rooinek
+rootle
+ropable
+roquefort
+roquet
+roraima
+rorschach
+rort
+rosace
+rosario
+rosarium
+roscius
+roscoe
+roscommon
+roseberry
+rosehip
+rosewall
+rosh
+rosinante
+roskilde
+rospa
+rossetti
+rossiya
+rostand
+rostock
+roti
+rotorua
+roucou
+rouget
+roulers
+roumelia
+rowntree
+roxas
+rubbra
+rubby
+rubefy
+rubescent
+rubiaceous
+rubinstein
+rubrician
+rubstone
+rudderhead
+rudish
+ruisdael
+rumelia
+runcible
+runcorn
+ruthenia
+ruthful
+rutilated
+ruwenzori
+ruysdael
+ruyter
+ryazan
+rydal
+ryobu
+ryokan
+ryot
+sabadell
+sabah
+sabatier
+sabayon
+sabretache
+sabulous
+saccharic
+saccharoid
+sacco
+sadat
+saddlebill
+sade
+sadhu
+sadi
+sadiron
+sadowa
+saffian
+safid
+sagamore
+saghalien
+sagitta
+saguache
+saguenay
+saguia
+sagunto
+saharanpur
+sahitya
+saida
+saiga
+sainsbury
+saipan
+sakhalin
+saktas
+sakti
+salade
+saladin
+salado
+salamanca
+salambria
+salchow
+salduba
+salep
+salet
+salicaceous
+salicional
+salicylic
+saliferous
+salify
+salique
+sallee
+sallust
+salmanazar
+salonika
+saloop
+salop
+salopette
+salpicon
+salpingectomy
+salpingitis
+salpinx
+salta
+saltant
+saltchuck
+saltchucker
+saltfish
+saltigrade
+saltillo
+salto
+saltpan
+saltus
+salvatorian
+salween
+salyut
+salzgitter
+samarang
+samaria
+sambre
+samekh
+samfoo
+samiel
+samiti
+samizdat
+samnium
+samos
+samothrace
+samsara
+samshu
+samsun
+sanctitude
+sandakan
+sandfly
+sandgrouse
+sandhi
+sandpit
+sandwort
+sandworts
+sango
+sangre
+sangria
+sanies
+sankey
+sankt
+sanmicheli
+santalaceous
+santana
+santander
+saorstat
+sapajou
+sapanwood
+sapele
+saphena
+sapiential
+sapindaceous
+sapir
+sapotaceous
+sappanwood
+sapphira
+sapporo
+sapraemia
+sapropel
+sapwood
+saragossa
+sarawak
+sarcocarp
+sarcous
+sardar
+sardegna
+sarmatia
+sarmentose
+sarnen
+sarnia
+saronic
+saros
+sarpanch
+sarpedon
+sarraceniaceous
+sarraute
+sarre
+sarrusophone
+sarthe
+sarto
+sartor
+sarum
+sarvodaya
+sasebo
+sasin
+sassaby
+sassari
+sassoon
+sastruga
+satai
+satellitium
+satinflower
+satinpod
+satrap
+satrapy
+saturnism
+satyagraha
+satyagrahi
+saurischian
+saury
+saussure
+sav
+sava
+savaii
+savannahs
+savas
+saveloy
+savoie
+savoir
+savona
+sawbill
+sawder
+sawhorse
+sawn
+saxicolous
+saxifragaceous
+saxo
+saxons
+sayan
+sazerac
+scafell
+scaldfish
+scaleboard
+scalenus
+scaliger
+scall
+scaloppine
+scammel
+scandaroon
+scanderbeg
+scandic
+scansorial
+scapa
+scapewheel
+scaphopod
+scarabaeus
+scarcement
+scarificator
+scarlatina
+scarron
+scattergram
+scatterplot
+scatterplots
+scend
+schappe
+scheel
+scheele
+scheelite
+scheldt
+scherzando
+schiaparelli
+schickard
+schilling
+schizogenesis
+schizophyceous
+schizopod
+schizothymia
+schlegel
+schmo
+schmooze
+schnook
+schnorkle
+schnorrer
+schnozzle
+schola
+schongauer
+schoolie
+schorl
+schottische
+schouten
+schrodinger
+schul
+schwa
+schwaben
+schwann
+schwarzwald
+schweinfurt
+schweiz
+schwerin
+schwitters
+schwyz
+sciaenid
+sciamachy
+scienter
+scilly
+scincoid
+sciomachy
+scipio
+scire
+scissel
+scissure
+sciurine
+sciuroid
+sclera
+sclerenchyma
+scleritis
+sclerodermatous
+scleroid
+scleroma
+sclerometer
+sclerophyll
+scleroprotein
+sclerotomy
+sclerous
+scolopendrid
+scop
+scopas
+scorify
+scorpaenoid
+scorper
+scotopia
+scotswomen
+scotus
+scramb
+scran
+scraperboard
+scraperboards
+scrapheap
+scrapheaps
+scrimshank
+scrobiculate
+scroop
+scrophulariaceous
+scrump
+scrumpy
+scry
+scudo
+scullin
+scuncheon
+scunge
+scungy
+scunthorpe
+scut
+scuta
+scutage
+scutate
+scutch
+scutcheon
+scute
+scutellation
+scutellum
+scutiform
+scyphiform
+scyphistoma
+scyphozoan
+scyphus
+scyros
+seaborg
+seacock
+seakale
+seami
+seanad
+seasonality
+seato
+seawan
+seaworthyness
+sebacic
+sebiferous
+secam
+secern
+sech
+sectoral
+secundine
+secundines
+seddon
+seferis
+seg
+seif
+seise
+seismism
+seismometer
+seismoscope
+selah
+selangor
+selectedly
+selenodont
+selenomorphology
+seleucia
+seleucus
+selfheal
+sellotape
+selsyn
+selva
+semanteme
+semarang
+sematology
+semele
+sememe
+semeru
+semibituminous
+semibold
+semicompile
+semination
+seminumerical
+semipalmate
+semivitreous
+semivocal
+sempach
+sena
+senarmontite
+sendai
+sendal
+sendoff
+senegambia
+senghor
+sennacherib
+sennar
+senussi
+sepaloid
+seppuku
+septarium
+septavalent
+septenary
+septennium
+septet
+septicaemia
+septilateral
+septime
+septivalent
+septuagesima
+septuple
+septuplet
+septuplicate
+seq
+sequestrant
+serajevo
+seram
+serang
+sercq
+serdab
+serein
+seremban
+serenata
+sergipe
+seriema
+seringa
+seringapatam
+serjeant
+serotine
+serpigo
+serpulid
+serriform
+serrulate
+serrulation
+sertorius
+servetus
+servia
+servicewoman
+servicewomen
+servient
+sesotho
+sesquialtera
+sesquioxide
+sestos
+setiferous
+setiform
+sett
+settable
+sevan
+sewan
+sewell
+sexangular
+sexcentenary
+sexennial
+sexivalent
+sexpartite
+sextain
+sextan
+sextile
+seyfert
+seyhan
+sfax
+sforza
+sfumato
+sgraffito
+shaba
+shabbat
+shadrach
+shaduf
+shadwell
+shaef
+shaftesbury
+shaftsbury
+shahaptin
+shahjahanpur
+shakhty
+shamash
+shamba
+shameface
+shamo
+shangaan
+shango
+shanny
+shantow
+sharefarmer
+sharefarmers
+shareown
+sharksucker
+sharrow
+shavuot
+sheading
+shearlegs
+shearling
+sheba
+shechina
+sheene
+sheepcote
+sheepdog
+sheepwalk
+sheerlegs
+shellbark
+shelta
+shem
+shema
+shembe
+shenyang
+sherbrooke
+sheria
+sherwani
+shes
+shetlands
+shewbread
+shewn
+shiai
+shicker
+shickered
+shihchiachuang
+shikoku
+shillyshally
+shily
+shinar
+shinkin
+shinty
+shipka
+shiralee
+shirtsleeve
+shithead
+shittah
+shittim
+shiva
+shive
+shizuoka
+shockheaded
+shockstall
+shoeshine
+shoetree
+shofar
+sholapur
+shoogle
+shool
+shopfloor
+shopfloors
+shophar
+shopsoiled
+shopwalker
+shopwork
+shopworker
+shoreless
+shortlist
+shortlisted
+shortlisting
+shortlists
+shortlived
+shoshone
+shote
+shott
+shouse
+showd
+showerproof
+showgirl
+showjumping
+shrewdie
+shrewmouse
+shrieval
+shufty
+shufu
+shuggy
+shushan
+shuteye
+shypoo
+sialkot
+sialoid
+siang
+siangtan
+sibiu
+sicilia
+sickbay
+sickert
+sickie
+sicyon
+siddons
+sidechain
+sidechains
+sideffect
+sideffects
+sideplate
+sideplates
+siderophilin
+siderosis
+siderostat
+sidesman
+sidewheel
+sidewheeler
+sidi
+sidon
+sidra
+siegbahn
+siegler
+sieglinde
+sienkiewicz
+sifaka
+sightscreen
+sigil
+sigismund
+sigla
+siglos
+sigmate
+sigmoidoscope
+signac
+signore
+signorelli
+sigurd
+sikang
+silastic
+sile
+siliciferous
+silicium
+siliculose
+siliqua
+siloam
+silurid
+silverpoint
+silvertail
+simar
+simaroubaceous
+simchath
+simitar
+simla
+simoniac
+simonides
+simplicidentate
+simplon
+simsim
+simula
+simulant
+sinanthropus
+sinarquist
+sinatra
+singultus
+sinhailien
+sinistrodextral
+sinn
+sint
+siple
+siqueiros
+sirdar
+siret
+sisera
+sismondi
+sitar
+sitcom
+sitella
+sitfast
+sithole
+sitology
+sitsang
+situla
+sitwell
+sitz
+sitzkrieg
+sitzmark
+sixain
+sixte
+sjambok
+skagerrak
+skara
+skatepark
+skatole
+skaw
+skean
+skelf
+skelly
+skelmersdale
+sken
+skerrick
+sket
+skewwhiff
+skiamachy
+skibob
+skidlid
+skidpan
+skidproof
+skidway
+skillion
+skilly
+skiplane
+skippet
+skirret
+skite
+skydive
+skylab
+skyscape
+slade
+slaister
+slapshot
+slaughterman
+slaughtermen
+slavs
+sleave
+sleezy
+slezsko
+slickenside
+sligo
+slimmed
+slingback
+slipnoose
+slipperwort
+slipsheet
+slipway
+sloot
+sloughs
+slowcoach
+slowworm
+slubberdegullion
+slype
+smallage
+smallboy
+smallclothes
+smallholding
+smallmouth
+smallsword
+smaltite
+smalto
+smaragd
+smaragdite
+smarm
+smarmy
+smatch
+smew
+smilacaceous
+smit
+smokeho
+smokejack
+smoko
+smoodge
+smriti
+snackette
+sned
+snib
+snicket
+snipefish
+snog
+snorri
+snowberry
+snowbird
+snowblink
+snowdon
+snowdonia
+snowplough
+snuck
+snye
+soakaway
+soapberry
+soapolallie
+soares
+sobeit
+soche
+socinus
+sociobiology
+socman
+socred
+sodamide
+soddy
+soekarno
+soemba
+soembawa
+soenda
+soerabaja
+sofar
+softa
+sogat
+sogdiana
+soh
+soho
+soilage
+soissons
+sokoto
+sokotra
+solan
+solander
+solarimeter
+solarism
+soldo
+solent
+soleure
+solfeggio
+solferino
+soli
+solidary
+solifidian
+solihull
+soliman
+sollicker
+solonchak
+solothurn
+solum
+solvay
+solway
+solyman
+somewise
+somme
+somniloquy
+somnus
+sondage
+songkok
+soniferous
+sonobuoy
+soo
+soochow
+sook
+soong
+sophistocated
+sorata
+sorbefacient
+sorbic
+sorbitol
+soredium
+sorn
+sorocaba
+sororicide
+sorosis
+sorrento
+sosnowiec
+sotto
+soudan
+soult
+soundbox
+soundpost
+soupfin
+sourdine
+southmost
+soutine
+sozzled
+spacewalk
+spadefish
+spadiceous
+spagyric
+spalato
+spalpeen
+spam
+spancel
+sparable
+sparce
+sparerib
+sparid
+sparoid
+sparrowhawk
+sparry
+spatchcock
+spatterdash
+spearwort
+spectrobolometer
+speedo
+speedwriting
+speight
+spelaean
+spelk
+spellican
+speos
+spermatorrhoea
+spermic
+spermine
+spermogonium
+spermophyte
+spermous
+spey
+speyer
+sphenic
+sphenogram
+spheroidicity
+sphingomyelin
+sphragistics
+sphygmic
+sphygmoid
+spiderman
+spif
+spiffing
+spiflicate
+spignel
+spina
+spindlelegs
+spiniferous
+spinose
+spiritus
+spirketting
+spiroid
+spironolactone
+spitchcock
+spithead
+spitsticker
+spiv
+splake
+splanchnic
+splashback
+splashbacks
+splenitis
+splodge
+spock
+spode
+spoilfive
+spondulix
+spongin
+spongioblast
+sponsion
+spoonbill
+sporades
+sporocyte
+sporran
+sportscast
+sportswrite
+sporule
+sprag
+sprechgesang
+sprechstimme
+springhalt
+springhead
+springhouse
+springlet
+springvale
+spruik
+spue
+spuggy
+spumescent
+squacco
+squalane
+squarrose
+squattocracy
+squeteague
+squireen
+squirrelfish
+squit
+squiz
+srinagar
+stableboy
+stabroek
+stackframe
+stacte
+staddlestone
+stadholder
+stadiometer
+staffa
+staffman
+stagflation
+staggard
+stagira
+staines
+stairhead
+stambul
+staminode
+standalone
+standfast
+stane
+stanniferous
+stannite
+stannum
+stanovoi
+stans
+staphyloplasty
+staphylorrhaphy
+stara
+starflower
+startc
+starwort
+statius
+stauroscope
+staysail
+steakhouse
+steamie
+steamtight
+stearoptene
+steatorrhoea
+stecher
+stedfast
+stellarator
+stelliferous
+stellular
+stemhead
+stendhal
+stenopetalous
+stenophyllous
+stenotropic
+stepdame
+stercoricolous
+sterculiaceous
+stereochrome
+stereochromy
+stereometry
+stereotaxis
+stereotomy
+stereovision
+sterlitamak
+sterne
+stevenage
+stevengraph
+steyr
+sthenic
+stheno
+stibium
+stich
+stichometry
+stickybeak
+stilicho
+stillage
+stillicide
+stilliform
+stingo
+stinko
+stitchwort
+stiver
+stoa
+stob
+stockfish
+stockjobber
+stomack
+stomatic
+stomatoplasty
+stoneboat
+stonecast
+stonechat
+stonefish
+stonefly
+stoneground
+stonk
+stonkered
+stook
+stoppard
+storeyed
+storiated
+stormproof
+stornoway
+storr
+storrs
+stoss
+stot
+stotinka
+stotious
+stotter
+stound
+stoup
+stour
+stoush
+strabo
+strabotomy
+strachey
+strandloper
+strategem
+strategems
+stratificational
+stratigraphical
+stratigraphically
+stratopause
+strawworm
+streamy
+streetlight
+strepitous
+stretchy
+striction
+strigiform
+strimon
+strine
+strobic
+strobilaceous
+stroganoff
+strokefinder
+stromboli
+strongman
+strongyle
+strontian
+stroppy
+stroy
+strychnic
+stubbs
+studdingsail
+studwork
+sturmer
+sty
+stylostixis
+stypsis
+styracaceous
+styria
+suakin
+subacetate
+subah
+subangular
+subapostolic
+subaqua
+subarid
+subassemblage
+subassemblages
+subastral
+subauricular
+subaxillary
+subbass
+subcalibre
+subcartilaginous
+subception
+subchannels
+subcluster
+subclusters
+subdelirium
+subduct
+subelement
+subelements
+subepidermis
+subequatorial
+suberic
+suberin
+suberose
+subfloor
+subfusc
+subinstance
+subinstances
+subjectify
+sublanguage
+sublanguages
+sublapsarianism
+submental
+subordinary
+subordinationism
+subotica
+subpanel
+subpanels
+subparameter
+subparameters
+subprocessor
+subscan
+subscans
+subscapular
+subsocial
+subsolar
+substantialism
+substomatal
+subtangent
+subternatural
+subtorrid
+subtreasury
+subufd
+subufds
+suburbicarian
+subvene
+subzero
+succentor
+succeptibility
+successsive
+succinic
+succoth
+succursal
+succuss
+suckerfish
+sudarium
+sudbury
+sudd
+sudetes
+sudor
+suetonius
+sufferage
+suffiency
+sufflate
+suffruticose
+suffumigate
+sufu
+suggestibly
+suharto
+suisse
+sukarnapura
+sukhumi
+sukkoth
+suleiman
+sulla
+sulphadiazine
+sulphanilamide
+sulphathiazole
+sulphide
+sulphinyl
+sulphisoxazole
+sulphite
+sulphonamide
+sulphonate
+sulphonated
+sulphone
+sulphonic
+sulphonium
+sulphonmethane
+sulphonyl
+sulphurate
+sulphuret
+sulphuretted
+sulphuryl
+summerweight
+sump
+sumpter
+sumy
+sunbake
+sundog
+sundress
+sundresses
+sundsvall
+sungari
+sungkiang
+sunglow
+sungrebe
+sunhat
+sunray
+sunstar
+suntrap
+suo
+superaltar
+superbazaar
+supercede
+superceded
+supercedes
+supercolumnar
+supercomputing
+superconduction
+supercurrent
+superdense
+supererogate
+superfemale
+superfuse
+superglacial
+superhero
+superhet
+superhigh
+superhumeral
+superlanguage
+superload
+supermale
+supermodel
+supermodels
+supermundane
+supernational
+superorganic
+superoxide
+supersex
+superstruct
+suplex
+supralapsarian
+suprematism
+supremo
+suqutra
+sur
+sura
+surakarta
+sural
+surat
+surculose
+surd
+surfbird
+surfbirds
+surfcasting
+surfie
+surgeoncy
+surgeonfish
+suribachi
+suricate
+surrebuttal
+sursum
+susa
+susah
+suseptible
+suslik
+suss
+susso
+susurrate
+sutlej
+sutler
+suva
+sverige
+svizzera
+swacked
+swanage
+swaraj
+sward
+swarf
+sweelinck
+sweetiewife
+sweetman
+sweetmeal
+sweptback
+sweptwing
+sweven
+sweyn
+swiftie
+swiftlet
+swindon
+swinepox
+swingboat
+swingle
+swingometer
+swingometers
+switchgirl
+swob
+swordbill
+swordcraft
+swordsmen
+swordstick
+swordsticks
+swound
+swounds
+swy
+sybaris
+sydneysider
+syene
+syktyvkar
+syllabism
+syllabogram
+syllabography
+sylva
+sylvanus
+sympathectomy
+symphile
+sympodium
+symposiac
+synarchy
+syncarp
+synchrocyclotron
+synchrometer
+synclastic
+synclinorium
+syncom
+syncrisis
+syndactyl
+synecious
+synovia
+syntagma
+synthetism
+sypher
+syphiloma
+syr
+syssarcosis
+systematology
+sytactic
+syzran
+taata
+tabaret
+tabescent
+tachograph
+tachylyte
+tachymetry
+tachyphylaxis
+tacket
+tacmahack
+tadmor
+taegu
+taejon
+tael
+taenia
+taeniafuge
+taffrail
+tafia
+tafilelt
+taganrog
+taggers
+tagliatelle
+tagmeme
+tagmemics
+tagore
+tagus
+tahina
+tahr
+tahsil
+tahsildar
+taig
+tailpipe
+tailplane
+tailskid
+tailstock
+taimyr
+tain
+taine
+taiyuan
+taj
+tajo
+taka
+takahe
+takamatsu
+takao
+takeaway
+takin
+takoradi
+talapoin
+talaria
+talavera
+talbot
+talca
+talcahuano
+taliesin
+taligrade
+taliped
+tallinn
+tallis
+talos
+taluk
+talweg
+tamasha
+tamatave
+tamaulipas
+tambac
+tambora
+tamburlaine
+tamis
+tammerfors
+tammuz
+tammy
+tampere
+tampico
+tana
+tanana
+tancred
+tandjungpriok
+tandoori
+tanga
+tangleberry
+tangshan
+tanguy
+tanis
+tanist
+tanjore
+tanta
+tantalous
+tanto
+tantrism
+tapadera
+tapemark
+tapemarks
+taphouse
+tarabulus
+taradiddle
+taramasalata
+tarantass
+tarantella
+taranto
+tarawa
+tarbes
+tarentum
+tarim
+tarnal
+tarnation
+tarnishs
+tarpan
+tarradiddle
+tarragona
+tarrasa
+tarshish
+tarsia
+tarsometatarsus
+tartarous
+tartu
+tashi
+tashkent
+tasimeter
+tasman
+tasset
+tassie
+tassle
+tatchell
+tati
+tatouay
+tatra
+taupo
+tauranga
+tauromachy
+tav
+tavel
+tawney
+taxaceous
+taxiplane
+taxiplanes
+teacake
+teashop
+technocommercial
+technography
+tectorial
+tecumseh
+tedder
+teesside
+teet
+tef
+teg
+tegular
+tehuantepec
+teide
+teilhard
+tejo
+tela
+telanaipura
+telautograph
+telecom
+telecomunications
+telega
+telegenic
+telegnosis
+telegonus
+telemachus
+telescopy
+telescript
+telespectroscope
+telestereoscope
+telestich
+teletext
+teletranscription
+teletube
+teletypesetter
+televideo
+telewriter
+telexed
+telexes
+telexing
+telfer
+telferage
+tellurate
+tellurion
+tellus
+telpherage
+temuco
+tenaille
+tenedos
+teng
+tengri
+teniafuge
+teniers
+tenner
+tenniel
+tenno
+tenorite
+tenorrhaphy
+tenotomy
+tensible
+tentation
+tenzing
+tepal
+tepefy
+tephrite
+tepic
+teratism
+teratoid
+terbia
+terceira
+terephthalic
+tereshkova
+terminosity
+termor
+terne
+terni
+ternion
+terotechnology
+terrestial
+terrine
+territorian
+tertial
+tertium
+tertullian
+teruel
+terylene
+terza
+terzetto
+tesla
+tesseract
+tessin
+testbed
+testiculate
+testudinal
+tetrabrach
+tetrabutylammonium
+tetrachlorethylene
+tetracyclic
+tetragram
+tetraphenyl
+tetraplegia
+tetrapody
+tetrapterous
+tetrastich
+tetrastichous
+tetrasyllable
+tetrazzini
+tetroxide
+tetzel
+teutoburger
+tevere
+tevet
+textualism
+teyde
+tezel
+thackeray
+thaddeus
+thadentsonyane
+thales
+thalweg
+thammuz
+thanatopsis
+thanet
+thanjavur
+thapsus
+thatcherism
+thaumatology
+thaumatrope
+theaceous
+theanthropism
+thearchy
+thebaine
+thegn
+theine
+themistocles
+thenardite
+theocrasy
+theocritus
+theodorakis
+theomachy
+theomancy
+theomania
+theomorphic
+theopathy
+theophagy
+theophobia
+theophrastus
+theorbo
+theravada
+therezina
+therfore
+therianthropic
+thermaesthesia
+thermobarograph
+thermobarometer
+thermoelectricity
+thermogenesis
+thermomotor
+thermophysical
+thermoregularity
+thermostatical
+thermotensile
+thermotherapy
+theroid
+theropod
+thersitical
+thesauri
+thespis
+thickleaf
+thimblewit
+thingumabob
+thioalcohol
+thiofuran
+thionine
+thionyl
+thiopentone
+thiophen
+thiosinamine
+thiosulphate
+thiosulphuric
+thirdstream
+thirlage
+thirlmere
+thisbe
+tholos
+thonburi
+thoracoplasty
+thornbill
+thoron
+thoroughpaced
+thorp
+thorshavn
+thrave
+threadneedle
+threadworm
+threap
+throatlash
+thrombogen
+thrombose
+thumbnut
+thumbstall
+thummim
+thun
+thunderbox
+thundery
+thuner
+thuya
+thymelaeaceous
+thyristor
+tia
+tiberias
+tibesti
+tibiotarsus
+tibullus
+tibur
+ticino
+tiddler
+tiddly
+tidewaiter
+tiebreaker
+tiepolo
+tierra
+tiffin
+tiflis
+tightknit
+tiglic
+tigrinya
+tihwa
+tikoloshe
+tiliaceous
+tillicum
+timaru
+timberyard
+timbuktu
+timecard
+timescale
+timescales
+timeslice
+timeslices
+timestamp
+timestamped
+timestamping
+timestamps
+tindal
+tineid
+tinpot
+tintinnabulum
+tipcat
+tiptop
+tipu
+tiran
+tiresias
+tirich
+tiro
+tiros
+tirpitz
+tirso
+tisza
+titanite
+titanosaur
+titanothere
+titfer
+tithonus
+titicaca
+titman
+titubation
+tiu
+tiv
+toadeater
+toadeater's
+toadeaters
+toadfish
+toadfish's
+toadfishes
+toadflax
+toadstone
+toadstone's
+toadstones
+tobit
+tobol
+tocantins
+tocology
+toea
+toecap
+toey
+toheroa
+tolpuddle
+toluyl
+tolylphosphine
+tomalley
+toman
+tombola
+tombouctou
+tomograph
+tonle
+tonsillotomy
+toowoomba
+toparch
+topazolite
+topotype
+topspin
+torbay
+torc
+torchier
+toric
+torii
+torino
+torose
+torquay
+torquemada
+torre
+torrefy
+torres
+torricelli
+torsibility
+tortelier
+tortellini
+tortile
+tortola
+tortuga
+toscana
+toscanini
+toul
+toulon
+touraine
+tourane
+tourcoing
+touristy
+tournai
+tourneur
+toussaint
+touzle
+towbar
+towkay
+townhall
+townscape
+townshend
+toxaemia
+toxalbumin
+toyama
+trabzon
+tracasserie
+tracheostomy
+tracksuit
+tractile
+trad
+tradeability
+traditor
+traducianism
+trafalgar
+traherne
+trailblaze
+trajan
+tralee
+trammie
+tranformed
+tranmission
+tranmitted
+trannie
+transcalent
+transculturation
+transcurrent
+transformism
+transgranular
+transilient
+transkei
+transliterator
+translunar
+transmigrant
+transmittancy
+transmundane
+transpadane
+transpassive
+transpond
+transponders
+transportaion
+transput
+transputer
+transputers
+transshipped
+tranverse
+trapan
+trapani
+trapes
+trapeziform
+trappean
+trasimene
+travancore
+traymobile
+trebizond
+treen
+treename
+treenames
+treenware
+tref
+trehala
+treitschke
+trengganu
+trente
+trento
+tressure
+tret
+trevally
+trevithick
+triac
+triazole
+tribade
+triblet
+tribromoethanol
+tricarbonyl
+tricentenary
+trichinopoly
+trichloro
+trichloroethanol
+trichloroethylene
+trichology
+trichosis
+trichroism
+tricktrack
+tricostate
+tricritical
+tricriticality
+tricrotic
+tricyclohexyl
+tridactyl
+tridentate
+tridentum
+triecious
+trieste
+trifold
+trihedron
+trihydrate
+trihydric
+triiodomethane
+trike
+trilateration
+trilemma
+trilithon
+trimethadione
+trimetric
+trimolecular
+trimurti
+trinacria
+trincomalee
+trinitrobenzene
+trinitrocresol
+trinitroglycerin
+trinitrophenol
+trioecious
+triolein
+tripalmitin
+tripersonal
+triphenyl
+tripody
+tripolitania
+tripterous
+triptolemus
+triptyque
+tripura
+tripwire
+triserial
+triskaidekaphobia
+trismegistus
+tristich
+tristichous
+trisulphide
+tritanopia
+tritiate
+triunitarian
+trivandrum
+troas
+troat
+trobriand
+trocar
+trochelminth
+trode
+trog
+troilism
+troilus
+trois
+trollope
+tromba
+tropaeolin
+trophoplasm
+tropicbird
+tropine
+tropophyte
+troppo
+tropylium
+trossachs
+trotskyist
+trotyl
+troubador
+trouse
+troyes
+trucial
+truckie
+trudgen
+trug
+trugs
+truk
+trumeau
+tryma
+tryptophanyl
+tsade
+tsana
+tsarevitch
+tsarevna
+tsaritsyn
+tselinograd
+tshiluba
+tshombe
+tsinan
+tsinghai
+tsingtao
+tsingyuan
+tso
+tsonga
+tsotsi
+tsugaru
+tsukahara
+tsushima
+tsutsugamushi
+tswana
+tuart
+tuatara
+tubate
+tubman
+tubuai
+tubuliflorous
+tucotuco
+tugela
+tugrik
+tuileries
+tula
+tularaemia
+tull
+tully
+tumblehome
+tumefacient
+tumefy
+tumular
+tumulose
+tungstous
+tungting
+tunguska
+tunnage
+tupamaro
+tuppenny
+tupungato
+turaco
+turbary
+turbogenerator
+turdine
+turenne
+turgenev
+turgent
+turgite
+turgot
+turishcheva
+turkestan
+turku
+turncock
+turnround
+turpeth
+turpin
+tusculum
+tussaud
+tussis
+tutankhamen
+tutiorism
+tutsan
+tutsi
+tutty
+tutuila
+tuva
+tuxtla
+tver
+twat
+twattle
+twayblade
+twee
+tweeddale
+tweedledum
+tweedsmuir
+tweeny
+twelvemo
+twite
+tychism
+tycho
+tye
+tylopod
+tylosis
+tympanist
+tympanitis
+tyndall
+tyndareus
+tynemouth
+tyneside
+typebar
+typhlitis
+typhlology
+typhoeus
+typhogenic
+typhoidin
+typothetae
+tyr
+tyumen
+tzekung
+tzetze
+ubbelohde
+ubiety
+ucayali
+ucca
+uccello
+udaipur
+udal
+udine
+udmurt
+udo
+udometer
+uele
+ufa
+ufd
+ufo
+ufology
+ugali
+ugaritic
+ugli
+uhlan
+uintathere
+ulfilas
+ulmaceous
+ulpian
+ultramicrometer
+ultramicrometers
+ultramicroscopic
+ultramundane
+ultrared
+ultrathin
+ultravirus
+ultrawet
+umayyad
+umbellule
+umberto
+umbles
+umbo
+umbria
+umiak
+umpy
+umrcc
+umtali
+unaesthetic
+unallocateed
+unamuno
+unaneled
+unaskable
+unassign
+unban
+unbelt
+unbirthday
+unbonnet
+unchurch
+unclad
+unco
+uncodeable
+unconservative
+uncontroversial
+undated
+undefine
+underachieve
+underbuy
+undercart
+underclay
+undercroft
+undercutting
+underdevelop
+underemphasis
+underfelt
+underfilled
+underfloor
+underfur
+undergrown
+underhung
+underletting
+underlinen
+undermentioned
+undernourish
+underpainting
+underpay
+underpinned
+underpitch
+underpitched
+underpitches
+underpitching
+underprice
+underpriced
+underprices
+underpricing
+underprop
+underquote
+underseal
+underset
+undersheriff
+undersmooth
+undersmoothed
+undersmoothing
+undersmooths
+underspent
+understaff
+underthrust
+undertint
+undertrump
+undertype
+undialectical
+undirectional
+undro
+undset
+unenforcable
+unexcited
+unforced
+unforseen
+ungaretti
+ungava
+unguiculate
+unguinous
+unguis
+ungula
+unguligrade
+uni
+unibus
+unicef
+unicolour
+unicostate
+unidirection
+uniformally
+unilateralist
+unilateralists
+uniliteral
+unimak
+unimodular
+uninfluential
+uninterruptable
+unipersonal
+unipod
+uniseptate
+uniserial
+uniterm
+unlead
+unlettable
+unmodeled
+unmusical
+unpaddable
+unpolitic
+unprepossessing
+unreactive
+unreckonable
+unreligious
+unrepair
+unrwa
+unskilful
+unspecifed
+unspecify
+unsteel
+unsuggestive
+unsupportive
+unterwalden
+untravelled
+untypical
+unwarrant
+upanishad
+upcountry
+uphroe
+upolu
+upperbound
+upperbounds
+uppsala
+uprouse
+upsadaisy
+upsala
+upstand
+upstretched
+upswell
+upto
+uranalysis
+uranism
+uranite
+uredosorus
+uredospore
+uretic
+urey
+urfa
+urga
+urim
+urinant
+uriniferous
+urmia
+urogenous
+uroscopy
+urquhart
+urticaceous
+uruapan
+urumchi
+urundi
+username
+ushant
+ushas
+usnach
+uspallata
+usquebaugh
+ussher
+ussuri
+ustashi
+ustulation
+ustyurt
+usumbura
+utamaro
+utgard
+uther
+utriculitis
+utrillo
+uttar
+uvedale
+uvulitis
+uxmal
+vacherin
+vadodara
+vadose
+vagal
+vaginate
+vaginectomy
+vaginismus
+vaginitis
+vagotonia
+vagus
+vahana
+vaisya
+valais
+valdai
+valdemar
+valdivia
+valencies
+valency
+valens
+valera
+valerianaceous
+valeric
+valeta
+valetta
+valgus
+valladolid
+vallation
+vallecula
+vallombrosa
+valona
+valonia
+valuta
+valvate
+valvule
+valvulitis
+vambrace
+vanadate
+vanadic
+vanadinite
+vanadous
+vanaspati
+vanbrugh
+vang
+vansittart
+vanua
+vanzetti
+vaporescence
+vaporetto
+vaporific
+vaporimeter
+vara
+varactor
+varanasi
+vardar
+vardon
+varec
+varese
+vargas
+varia
+variablity
+varicella
+varicellate
+varicelloid
+varicocele
+varicosis
+varicotomy
+variola
+variolate
+variole
+variolite
+variscite
+varityper
+varna
+varro
+vas
+vasari
+vasco
+vashti
+vasoinhibitor
+vasoregulatory
+vaticide
+vauban
+vaucluse
+vaud
+vav
+vavasor
+vedette
+veg
+vegan
+veii
+veinstone
+veinule
+vela
+velate
+velcro
+veldskoen
+veleta
+veliger
+velites
+vellicate
+vellore
+vena
+venenose
+venepuncture
+venlo
+venose
+venosity
+ventris
+verbenaceous
+vercelli
+vercingetorix
+verderer
+verdun
+verecund
+vereeniging
+vergeboard
+verglas
+verifiably
+verkrampte
+verlaine
+verligte
+vermeer
+vermination
+vermis
+vermivorous
+verny
+verrazano
+verrocchio
+verruca
+verrucae
+verrucose
+versabraille
+versant
+versatec
+verst
+vert
+verticillaster
+verticillate
+vertu
+verulamium
+vervain
+vervet
+verwoerd
+vesalius
+vespasian
+vespertilionine
+vespucci
+vesuvius
+vetiver
+viareggio
+viator
+vibraculum
+vibronic
+vicenary
+vicenza
+vico
+vicomte
+victoriana
+videlicet
+videotex
+vidhan
+vienne
+viewport
+viewport's
+viewports
+viewscan
+vignola
+vigny
+vigo
+villous
+vimineous
+vina
+vinasse
+vinegarette
+vinificator
+vinnitsa
+violoncello
+violone
+viren
+virial
+virtu
+viscoid
+vistula
+vitaceous
+vitaphone
+vitascope
+vitoria
+vitrain
+vitrescence
+vitrescent
+vitric
+vitriform
+vitruvius
+vitta
+vittle
+vituline
+viverrine
+viyella
+vocate
+voidage
+voiotia
+voir
+voix
+vojvodina
+volitant
+vologda
+volost
+volsung
+volsunga
+voltaism
+voltammeter
+volturno
+volvulus
+vomer
+voortrekker
+vorster
+vosges
+vostok
+vouge
+vox
+vuillard
+vulgaris
+vulvovaginitis
+vyborg
+wabble
+wabbled
+wabbles
+wabbling
+wace
+wadai
+wadmal
+wadset
+wagram
+wagtail
+waistcloth
+walfish
+walhalla
+walkable
+walkley
+wallah
+wallasey
+wame
+wanderoo
+wandoo
+wanganui
+wanhsien
+wank
+wankel
+wankie
+wanna
+waratah
+wardian
+wardle
+wardmote
+warhorse
+warhorses
+warrigal
+warsle
+warta
+washaway
+washday
+washdays
+washerwomen
+washery
+washin
+washwomen
+wassermann
+wasteweir
+watap
+watchstrap
+waterage
+waterbrain
+waterbuck
+waterspout
+watertower
+wattlebird
+waul
+waveband
+wavebands
+wavefunction
+wavefunctions
+wavellite
+wavemeter
+waveoff
+waw
+wawa
+wawl
+waxberry
+waxbill
+waxplant
+wayzgoose
+waziristan
+weakfish
+weald
+weaponeer
+wearproof
+weasand
+weaverbird
+webbs
+webwheel
+weddell
+wedekind
+wedeling
+weedkiller
+weelkes
+ween
+weeny
+weighbridge
+weighbridges
+weightlifter
+weightlifting
+weihai
+weka
+welkom
+welland
+wellesz
+wellies
+welterweight
+welwyn
+wentletrap
+wernerite
+wersh
+weser
+wesker
+wessex
+westmost
+whacko
+whangarei
+whare
+wharfie
+wharve
+whatsit
+whaup
+wheatworm
+whereafter
+wherrit
+wheyface
+whidah
+whimbrel
+whin
+whinchat
+whinge
+whipstall
+whipworm
+whirlabout
+whitby
+whitebeam
+whitedamp
+whitefly
+whitethorn
+whitewood
+who've
+wholefood
+wholemeal
+wholism
+whortleberry
+whyalla
+whydah
+wicketkeeper
+wicketkeepers
+wicketkeeping
+wickthing
+wicopy
+widdershins
+widgery
+widgie
+widnes
+widukind
+wien
+wikiup
+wildcard
+wildcarded
+wildcarding
+wildcards
+wilde
+wilhelmshaven
+wilhelmstrasse
+willemstad
+willowherb
+wilmslow
+wilno
+wincey
+windbound
+windcheater
+windcheaters
+windchill
+windermere
+windflower
+windgall
+windhoek
+windhover
+windlestraw
+windrow
+windsail
+windsock
+winebibber
+winkelried
+winnipegosis
+winterfeed
+winterthur
+winterweight
+wipo
+wirepuller
+wiretapping
+wirewalker
+wirra
+wirral
+wis
+wishlist
+wishlists
+wislany
+wismar
+wist
+witan
+witchetty
+wite
+witenagemot
+withershins
+wittol
+wivern
+woad
+woaded
+woadwaxen
+woald
+wodge
+wodges
+wog
+woggle
+wolfbane
+wolfenden
+wolffish
+wolfit
+wolframite
+wolfsbane
+wollastonite
+wolly
+wolsey
+wolve
+wolver
+womera
+wonsan
+woodborer
+woodcarving
+woodchat
+woodgrouse
+woodhook
+woodlark
+woodlouse
+woodrush
+woodscrew
+woodseats
+woodwaxen
+woodworm
+woolf
+woolfell
+woolgrower
+woolley
+woollybutt
+woop
+woorali
+workaday
+workbag
+workfile
+workfiles
+workgroup
+workgroups
+workmate
+workmates
+workperson
+workshy
+worksop
+wormcast
+wormseed
+wormwood
+worsley
+wot
+wran
+wrapover
+wrapround
+wreckfish
+wreckful
+wrekin
+wroclaw
+wrongdo
+wrongdoers
+wroth
+wrybill
+wryneck
+wuchang
+wuhsien
+wuhu
+wulfenite
+wulfila
+wundt
+wuppertal
+wurley
+wurst
+wus
+wusih
+wuthering
+wutsin
+wycherley
+wycliffe
+wye
+wynd
+wyvern
+xanthein
+xanthippe
+xanthochroid
+xanthochroism
+xanthoma
+xanthophyll
+xanthous
+xanthus
+xci
+xcii
+xciv
+xcix
+xcvi
+xcvii
+xenakis
+xenocrates
+xenocryst
+xenogamy
+xenogenesis
+xenoglossia
+xenolith
+xenomorphic
+xenophanes
+xenophon
+xeroderma
+xeromorphic
+xerophthalmia
+xerophyte
+xerosere
+xerosis
+xhosa
+xiphisternum
+xiphoid
+xiphosuran
+xuthus
+xxi
+xxii
+xxiii
+xxiv
+xxix
+xxv
+xxvi
+xxvii
+xxviii
+xxx
+xxxi
+xxxii
+xxxiii
+xxxiv
+xxxix
+xxxv
+xxxvi
+xxxvii
+xxxviii
+xylan
+xylidine
+xylocarp
+xylograph
+xylography
+xyloid
+xylol
+xylophagous
+xylyl
+xyst
+xyster
+yabber
+yabby
+yaffle
+yafo
+yagi
+yahata
+yamagata
+yamani
+yamashita
+yammer
+yanina
+yapok
+yapon
+yarwood
+yataghan
+yate
+yauld
+yaunde
+yaup
+yaupon
+yautia
+yawata
+yawp
+yazd
+yean
+yeanling
+yegg
+yeld
+yelk
+yellowbark
+yellowbird
+yellowhammer
+yellowlegs
+yellowtail
+yellowweed
+yellowwood
+yenan
+yentai
+yerevan
+yestreen
+yeti
+yezd
+ygerne
+yike
+yingkow
+yippee
+yirr
+ylem
+ymir
+yob
+yod
+yodle
+yogh
+yohimbine
+yoicks
+yokefellow
+yola
+yom
+yoni
+yonne
+yonnie
+ytterbia
+ytterbite
+yttria
+yttriferous
+yuk
+yulan
+yurt
+yvelines
+ywis
+zacynthus
+zaffer
+zagazig
+zagreus
+zagros
+zama
+zamindar
+zamindari
+zamora
+zante
+zanu
+zapata
+zaporozhye
+zappa
+zapu
+zaqaziq
+zaragoza
+zarathustra
+zaratite
+zareba
+zarf
+zarga
+zaria
+zarzuela
+zastruga
+zayin
+zeami
+zebec
+zebedee
+zebrawood
+zebu
+zebulun
+zecchino
+zechariah
+zed
+zedekiah
+zedoary
+zee
+zein
+zeist
+zemindar
+zenana
+zener
+zephaniah
+zephyrus
+zeugma
+zeuxis
+zia
+ziaur
+zibeline
+zibet
+ziff
+ziggurat
+zigzagger
+zila
+zilpah
+zinciferous
+zincite
+zinckenite
+zincograph
+zincography
+zingiberaceous
+zinjanthropus
+zinkenite
+zipangu
+zircalloy
+ziska
+zlatoust
+zoaea
+zoan
+zoea
+zoffany
+zohar
+zola
+zond
+zonk
+zonking
+zonks
+zonule
+zoochemistry
+zoochore
+zoogloea
+zoography
+zooid
+zoolatry
+zoometry
+zoomorphism
+zoophile
+zoophilia
+zoophilism
+zoophobia
+zooplasty
+zoosperm
+zoosporangium
+zootomy
+zootoxin
+zootoxins
+zorilla
+zorrilla
+zoster
+zoug
+zsigmondy
+zucchetto
+zugzwang
diff --git a/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW Software Requirement with Recursion.xml b/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW Software Requirement with Recursion.xml
new file mode 100644
index 00000000000..0b6658e4ac0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW Software Requirement with Recursion.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>SRS</o:Title><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>Ryan Brooks</o:LastAuthor><o:Revision>11</o:Revision><o:TotalTime>5</o:TotalTime><o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted><o:Created>2007-04-21T15:49:00Z</o:Created><o:LastSaved>2008-10-03T20:33:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>7</o:Words><o:Characters>45</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>51</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="20007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="Courier"><w:panose-1 w:val="02070409020205020404"/><w:charset w:val="00"/><w:family w:val="Modern"/><w:notTrueType/><w:pitch w:val="fixed"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="003A6350"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F89E6E26"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="APPENDIX1"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="APPENDIX2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="APPENDIX3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="APPENDIX4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="APPENDIX5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="APPENDIX6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="APPENDIX7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="APPENDIX8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="APPENDIX9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="016D5431"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="98C65BCE"/><w:lvl w:ilvl="0" w:tplc="94D2C566"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="0C4D206D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="4B543E40"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="10AF29E5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="7520DAAE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="15EB1725"/><w:plt w:val="Multilevel"/><w:tmpl w:val="D902A83E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="1C970BBA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EB82E3A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="1D6C5FCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E710F038"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="APPENDIX %1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="720" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1440" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="1D753DB7"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="1EC51BCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="256F5D56"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="290A1130"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="299E4F07"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="46E2B8B2"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="29C240FD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FCA4DC08"/><w:lvl w:ilvl="0" w:tplc="B5146A3E"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl2"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1224"/></w:tabs><w:ind w:left="1224" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="29CA5728"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D00252C6"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="2A5411A0"/><w:plt w:val="Multilevel"/><w:tmpl w:val="C40CB9EC"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="2"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="24"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="2B1C06F5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3B98963A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="2B477730"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="33801DC4"/><w:lvl w:ilvl="0" w:tplc="2D8A4B4C"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl3"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3024"/></w:tabs><w:ind w:left="3024" w:hanging="2016"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2448"/></w:tabs><w:ind w:left="2448" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3168"/></w:tabs><w:ind w:left="3168" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3888"/></w:tabs><w:ind w:left="3888" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4608"/></w:tabs><w:ind w:left="4608" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5328"/></w:tabs><w:ind w:left="5328" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6048"/></w:tabs><w:ind w:left="6048" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6768"/></w:tabs><w:ind w:left="6768" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7488"/></w:tabs><w:ind w:left="7488" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2B5B6B3C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5CC8E874"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:first-line="763"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="2D6545A6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3F227848"/><w:name w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:caps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:vanish w:val="off"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:vertAlign w:val="baseline"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="listlvl2"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="-31680"/></w:tabs><w:ind w:left="1656" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl3"/><w:lvlText w:val="(%3)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2016"/></w:tabs><w:ind w:left="2016" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="listlvl4"/><w:lvlText w:val="(%4)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2376"/></w:tabs><w:ind w:left="2376" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl5"/><w:lvlText w:val="%5)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2736"/></w:tabs><w:ind w:left="2736" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="listlvl6"/><w:lvlText w:val="%6)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3096"/></w:tabs><w:ind w:left="3096" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl7"/><w:lvlText w:val="[%7]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3456"/></w:tabs><w:ind w:left="3456" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="[%8]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="308239DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="31A252E6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="A9D83578"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="3B97448F"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3C165F4A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79A06FE6"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="42BB3748"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DBE464B0"/><w:lvl w:ilvl="0" w:tplc="26BAF6B0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl1"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="648"/></w:tabs><w:ind w:left="648" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="5A401749"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CD8E61CE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="5A802BC9"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="5C3B1B76"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="5E371EBB"/><w:plt w:val="Multilevel"/><w:tmpl w:val="DA56D440"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="60B71688"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EA20814"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="6389497B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="AC5A6410"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="listlvl10"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="360" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1080" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1800" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2520" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3240" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3960" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="4680" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5400" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6120" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="6469691A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E5D02024"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="74BA49AE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart"/><w:styleLink w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="751E50EA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79E6FEDC"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="7D9D3B47"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="7F0F313D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F8FC63EE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="7F633FB7"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5F5A52E8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="23"/></w:list><w:list w:ilfo="2"><w:ilst w:val="12"/></w:list><w:list w:ilfo="3"><w:ilst w:val="18"/></w:list><w:list w:ilfo="4"><w:ilst w:val="14"/></w:list><w:list w:ilfo="5"><w:ilst w:val="5"/></w:list><w:list w:ilfo="6"><w:ilst w:val="25"/></w:list><w:list w:ilfo="7"><w:ilst w:val="4"/></w:list><w:list w:ilfo="8"><w:ilst w:val="13"/></w:list><w:list w:ilfo="9"><w:ilst w:val="29"/></w:list><w:list w:ilfo="10"><w:ilst w:val="6"/></w:list><w:list w:ilfo="11"><w:ilst w:val="18"/></w:list><w:list w:ilfo="12"><w:ilst w:val="26"/></w:list><w:list w:ilfo="13"><w:ilst w:val="34"/></w:list><w:list w:ilfo="14"><w:ilst w:val="2"/></w:list><w:list w:ilfo="15"><w:ilst w:val="27"/></w:list><w:list w:ilfo="16"><w:ilst w:val="17"/></w:list><w:list w:ilfo="17"><w:ilst w:val="30"/></w:list><w:list w:ilfo="18"><w:ilst w:val="3"/></w:list><w:list w:ilfo="19"><w:ilst w:val="20"/></w:list><w:list w:ilfo="20"><w:ilst w:val="15"/></w:list><w:list w:ilfo="21"><w:ilst w:val="35"/></w:list><w:list w:ilfo="22"><w:ilst w:val="22"/></w:list><w:list w:ilfo="23"><w:ilst w:val="24"/></w:list><w:list w:ilfo="24"><w:ilst w:val="32"/></w:list><w:list w:ilfo="25"><w:ilst w:val="0"/></w:list><w:list w:ilfo="26"><w:ilst w:val="31"/></w:list><w:list w:ilfo="27"><w:ilst w:val="21"/></w:list><w:list w:ilfo="28"><w:ilst w:val="16"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="18"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="1"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="2"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="3"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="4"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="5"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="6"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="7"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="8"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="31"><w:ilst w:val="11"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/></w:list><w:list w:ilfo="33"><w:ilst w:val="33"/></w:list><w:list w:ilfo="34"><w:ilst w:val="8"/></w:list><w:list w:ilfo="35"><w:ilst w:val="28"/></w:list><w:list w:ilfo="36"><w:ilst w:val="14"/></w:list><w:list w:ilfo="37"><w:ilst w:val="10"/></w:list><w:list w:ilfo="38"><w:ilst w:val="9"/></w:list><w:list w:ilfo="39"><w:ilst w:val="7"/></w:list><w:ilfoMacAtCleanup w:val="5"/></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:keepLines/><w:pageBreakBefore/><w:listPr><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:kern w:val="28"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="900"/></w:tabs><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading5"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading6"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1620"/></w:tabs><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:next w:val="paranormal"/><w:rsid w:val="00F4596F"/><w:pPr><w:pStyle w:val="Heading9"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="paranormal"><w:name w:val="para:normal"/><w:link w:val="paranormalChar"/><w:rsid w:val="009E6B3D"/><w:pPr><w:pStyle w:val="paranormal"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="64" w:after="80" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl3"><w:name w:val="list:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl3"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="2088"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang1"><w:name w:val="req lang:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A134C3"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:spacing w:before="20" w:after="0" w:line="180" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="proprietarycontd"><w:name w:val="proprietary:cont'd"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="proprietarycontd"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="200" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="16"/><w:sz-cs w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paracentered"><w:name w:val="para:centered"/><w:autoRedefine/><w:rsid w:val="00B43482"/><w:pPr><w:pStyle w:val="paracentered"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="80" w:after="80" w:line="240" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent2"><w:name w:val="para:indent2"/><w:autoRedefine/><w:rsid w:val="004417BE"/><w:pPr><w:pStyle w:val="paraindent2"/><w:tabs><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent3"><w:name w:val="para:indent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent3"/><w:tabs><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/><w:tab w:val="left" w:pos="9720"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="0085234B"/><w:pPr><w:pStyle w:val="Caption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9720"/><w:tab w:val="left" w:pos="10800"/><w:tab w:val="left" w:pos="11880"/><w:tab w:val="left" w:pos="12960"/><w:tab w:val="left" w:pos="14040"/><w:tab w:val="left" w:pos="15120"/><w:tab w:val="left" w:pos="16200"/><w:tab w:val="left" w:pos="17280"/><w:tab w:val="left" w:pos="18360"/><w:tab w:val="left" w:pos="19440"/><w:tab w:val="left" w:pos="20520"/><w:tab w:val="left" w:pos="21600"/><w:tab w:val="left" w:pos="22680"/><w:tab w:val="left" w:pos="23760"/><w:tab w:val="left" w:pos="24840"/><w:tab w:val="left" w:pos="25920"/><w:tab w:val="left" w:pos="27000"/><w:tab w:val="left" w:pos="28080"/><w:tab w:val="left" w:pos="29160"/><w:tab w:val="left" w:pos="30240"/><w:tab w:val="left" w:pos="31320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent1"><w:name w:val="para:indent1"/><w:autoRedefine/><w:rsid w:val="007D424E"/><w:pPr><w:pStyle w:val="paraindent1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl4"><w:name w:val="list:lvl 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl4"/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="11"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead"><w:name w:val="RowHead"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="100" w:after="100"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11"><w:name w:val="TableText11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOAHeading"/><w:spacing w:before="240" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHeadL"><w:name w:val="RowHeadL"/><w:basedOn w:val="RowHead"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHeadL"/><w:spacing w:before="60" w:after="60"/><w:jc w:val="left"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11B"><w:name w:val="TableText11B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText11B"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofAuthorities"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="8640"/></w:tabs><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofFigures"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00721F21"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D90577"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:dstrike w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/><w:vertAlign w:val="baseline"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead11"><w:name w:val="RowHead11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead11"/><w:listPr><w:ilvl w:val="12"/></w:listPr><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11C"><w:name w:val="TableText11C"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11C"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl1"><w:name w:val="list:lvl 1"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl1"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl5"><w:name w:val="list:lvl 5"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="left" w:pos="3384"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl2"><w:name w:val="list:lvl 2"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="AppendixTitle"><w:name w:val="Appendix Title"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="AppendixTitle"/><w:pageBreakBefore/><w:spacing w:before="120" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead10"><w:name w:val="RowHead10"/><w:basedOn w:val="RowHead11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC1"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="540"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="240"/><w:ind w:left="547" w:hanging="547"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:noProof/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC2"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="900"/><w:tab w:val="right" w:leader="dot" w:pos="9360"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="907" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC3"><w:name w:val="toc 3"/><wx:uiName wx:val="TOC 3"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC3"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1260"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1260" w:hanging="900"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC4"><w:name w:val="toc 4"/><wx:uiName wx:val="TOC 4"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC4"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1620"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1620" w:hanging="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC5"><w:name w:val="toc 5"/><wx:uiName wx:val="TOC 5"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC5"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1980"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1980" w:hanging="1260"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC6"><w:name w:val="toc 6"/><wx:uiName wx:val="TOC 6"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC6"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2340"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2340" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC7"><w:name w:val="toc 7"/><wx:uiName wx:val="TOC 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC7"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2700"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="0" w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="2700" w:hanging="1620"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC8"><w:name w:val="toc 8"/><wx:uiName wx:val="TOC 8"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC8"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2970"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2970" w:hanging="1710"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC9"><w:name w:val="toc 9"/><wx:uiName wx:val="TOC 9"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC9"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="3330"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="3330" w:hanging="1890"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeadingUnnumbered"><w:name w:val="Heading Unnumbered"/><w:next w:val="paranormal"/><w:autoRedefine/><w:rsid w:val="00107AA6"/><w:pPr><w:pStyle w:val="HeadingUnnumbered"/><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="24"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10"><w:name w:val="TableText10"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableTextBCentered"><w:name w:val="TableTextB Centered"/><w:basedOn w:val="Normal"/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableTextBCentered"/><w:spacing w:line="220" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10C"><w:name w:val="TableText10C"/><w:basedOn w:val="TableText11C"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10C"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10B"><w:name w:val="TableText10B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText10B"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="acronym"><w:name w:val="acronym"/><w:autoRedefine/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="acronym"/><w:tabs><w:tab w:val="left" w:pos="2160"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="40"/><w:ind w:left="2160" w:hanging="2160"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl6"><w:name w:val="list:lvl 6"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="clear" w:pos="4320"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr1L"><w:name w:val="hdr1L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr1L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr2L"><w:name w:val="hdr2L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr2L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="0" w:line="180" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl1"><w:name w:val="bullet:lvl 1"/><w:basedOn w:val="Normal"/><w:link w:val="bulletlvl1CharChar"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl2"><w:name w:val="bullet:lvl 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilfo w:val="2"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1224"/><w:tab w:val="left" w:pos="648"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1728" w:hanging="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent4"><w:name w:val="para:indent4"/><w:basedOn w:val="paraindent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent4"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl7"><w:name w:val="list:lvl 7"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="left" w:pos="3024"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCfiguretitle"><w:name w:val="TOC:figure title"/><w:basedOn w:val="Caption"/><w:autoRedefine/><w:rsid w:val="00894991"/><w:pPr><w:pStyle w:val="TOCfiguretitle"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note"><w:name w:val="note"/><w:basedOn w:val="Normal"/><w:rsid w:val="006E0AB6"/><w:pPr><w:pStyle w:val="note"/><w:spacing w:before="80" w:after="80"/><w:ind w:left="1656" w:right="720" w:hanging="936"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang2"><w:name w:val="req lang:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang2"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang3"><w:name w:val="req lang:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang4"><w:name w:val="req lang:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang4"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang5"><w:name w:val="req lang:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang5"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1800"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang6"><w:name w:val="req lang:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang6"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="2160"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="statedef"><w:name w:val="state def"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DE6BA0"/><w:pPr><w:pStyle w:val="statedef"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="80" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:caps/><w:color w:val="408040"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="intentblank"><w:name w:val="intent:blank"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="000B79E8"/><w:pPr><w:pStyle w:val="intentblank"/><w:spacing w:before="6480" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="code"><w:name w:val="code"/><w:basedOn w:val="Normal"/><w:rsid w:val="006D4514"/><w:pPr><w:pStyle w:val="code"/><w:spacing w:before="80" w:after="80" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="parapage"><w:name w:val="para:page"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00DD22A9"/><w:pPr><w:pStyle w:val="parapage"/><w:pageBreakBefore/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCtabletitle"><w:name w:val="TOC:table title"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00B869CD"/><w:pPr><w:pStyle w:val="TOCtabletitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRitem"><w:name w:val="RCR:item"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="007A1F4F"/><w:pPr><w:pStyle w:val="RCRitem"/><w:tabs><w:tab w:val="left" w:pos="1800"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="1800" w:right="720" w:hanging="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRheader"><w:name w:val="RCR:header"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006D781E"/><w:pPr><w:pStyle w:val="RCRheader"/><w:tabs><w:tab w:val="left" w:pos="792"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="right" w:leader="underscore" w:pos="8640"/></w:tabs><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="line"><w:name w:val="line"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006B63C2"/><w:pPr><w:pStyle w:val="line"/><w:spacing w:before="0" w:line="40" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="12"/><w:sz-cs w:val="12"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang7"><w:name w:val="req lang: 7"/><w:basedOn w:val="reqlang6"/><w:rsid w:val="00C0337E"/><w:pPr><w:pStyle w:val="reqlang7"/><w:ind w:left="2520"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang70"><w:name w:val="req lang:7"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang70"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang8"><w:name w:val="req lang:8"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang8"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang9"><w:name w:val="req lang:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="007534C9"/><w:pPr><w:pStyle w:val="reqlang9"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="3240"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AF20CB"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment1"><w:name w:val="comment:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment1"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment2"><w:name w:val="comment:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment2"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="720"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment3"><w:name w:val="comment:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1080"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment4"><w:name w:val="comment:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment4"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1440"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment5"><w:name w:val="comment:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment5"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment6"><w:name w:val="comment:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment6"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment7"><w:name w:val="comment:7"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment7"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2520"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment8"><w:name w:val="comment:8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment8"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2880"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment9"><w:name w:val="comment:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment9"/><w:spacing w:after="80"/><w:ind w:left="3240"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlheader"><w:name w:val="dl:header"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlheader"/><w:spacing w:before="240" w:after="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier" w:h-ansi="Courier"/><wx:font wx:val="Courier"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlbody"><w:name w:val="dl:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlbody"/><w:spacing w:before="0"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocheader"><w:name w:val="dl_proc:header"/><w:basedOn w:val="dlbody"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocheader"/><w:spacing w:before="240"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocbody"><w:name w:val="dl_proc:body"/><w:basedOn w:val="dlprocheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocbody"/><w:spacing w:before="0"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dldescription"><w:name w:val="dl:description"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dldescription"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapheader"><w:name w:val="bitmap:header"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapheader"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapbody"><w:name w:val="bitmap:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapbody"/><w:spacing w:before="0"/></w:pPr><w:rPr><wx:font wx:val="Courier"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX1"><w:name w:val="APPENDIX 1"/><w:basedOn w:val="Normal"/><w:next w:val="paranormal"/><w:rsid w:val="004978C4"/><w:pPr><w:pStyle w:val="APPENDIX1"/><w:listPr><w:ilfo w:val="25"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="152" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX2"><w:name w:val="APPENDIX 2"/><w:basedOn w:val="APPENDIX1"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX2"/><w:listPr><w:ilvl w:val="1"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX3"><w:name w:val="APPENDIX 3"/><w:basedOn w:val="APPENDIX2"/><w:next w:val="paranormal"/><w:rsid w:val="00E904D2"/><w:pPr><w:pStyle w:val="APPENDIX3"/><w:listPr><w:ilvl w:val="2"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage18pt"><w:name w:val="Title Page 18pt"/><w:basedOn w:val="Normal"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage18pt"/><w:spacing w:before="0" w:after="60" w:line="240" w:line-rule="auto"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz w:val="36"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage16pt"><w:name w:val="Title Page 16pt"/><w:basedOn w:val="TitlePage18pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage16pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage14pt"><w:name w:val="Title Page 14pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage14pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10pt"><w:name w:val="para 10pt"/><w:basedOn w:val="Normal"/><w:link w:val="para10ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para10pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10ptnospacing"><w:name w:val="para 10pt no spacing"/><w:basedOn w:val="para10pt"/><w:rsid w:val="004A1CCA"/><w:pPr><w:pStyle w:val="para10ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10nospacing"><w:name w:val="TableText10 no spacing"/><w:basedOn w:val="TableText10"/><w:rsid w:val="00D72507"/><w:pPr><w:pStyle w:val="TableText10nospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8pt"><w:name w:val="para 8pt"/><w:basedOn w:val="Normal"/><w:link w:val="para8ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para8pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paranormalChar"><w:name w:val="para:normal Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="paranormal"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="bulletlvl1CharChar"><w:name w:val="bullet:lvl 1 Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="bulletlvl1"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:before="0" w:after="120" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl10"><w:name w:val="list lvl 1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl10"/><w:listPr><w:ilfo w:val="9"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/></w:tabs><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX4"><w:name w:val="APPENDIX 4"/><w:basedOn w:val="APPENDIX3"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX4"/><w:listPr><w:ilvl w:val="3"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX5"><w:name w:val="APPENDIX 5"/><w:basedOn w:val="APPENDIX4"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX5"/><w:listPr><w:ilvl w:val="4"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX6"><w:name w:val="APPENDIX 6"/><w:basedOn w:val="APPENDIX5"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX6"/><w:listPr><w:ilvl w:val="5"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX7"><w:name w:val="APPENDIX 7"/><w:basedOn w:val="APPENDIX6"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX7"/><w:listPr><w:ilvl w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX8"><w:name w:val="APPENDIX 8"/><w:basedOn w:val="APPENDIX7"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX8"/><w:listPr><w:ilvl w:val="7"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX9"><w:name w:val="APPENDIX 9"/><w:basedOn w:val="APPENDIX8"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX9"/><w:listPr><w:ilvl w:val="8"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00B47E5D"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="list" w:styleId="listreset"><w:name w:val="listreset"/><w:basedOn w:val="NoList"/><w:rsid w:val="00D25E39"/><w:pPr><w:listPr><w:ilfo w:val="26"/></w:listPr></w:pPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl3"><w:name w:val="bullet:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00EF5226"/><w:pPr><w:pStyle w:val="bulletlvl3"/><w:listPr><w:ilfo w:val="28"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="3024"/><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1368" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage22pt"><w:name w:val="Title Page 22pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="005F35C4"/><w:pPr><w:pStyle w:val="TitlePage22pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="44"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para"><w:name w:val="para"/><w:basedOn w:val="Normal"/><w:link w:val="paraChar"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="para"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paraChar"><w:name w:val="para Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="para"/><w:rsid w:val="0057061B"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl20"><w:name w:val="list lvl 2"/><w:basedOn w:val="ListNumber3"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="listlvl20"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="008B1AB7"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="character" w:styleId="para8ptChar"><w:name w:val="para 8pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para8pt"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptunderline"><w:name w:val="para 8pt underline"/><w:basedOn w:val="para8pt"/><w:link w:val="para8ptunderlineChar"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptunderline"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="para8ptunderlineChar"><w:name w:val="para 8pt underline Char"/><w:basedOn w:val="para8ptChar"/><w:link w:val="para8ptunderline"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptnospacing"><w:name w:val="para 8pt no spacing"/><w:basedOn w:val="para8pt"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl0"><w:name w:val="list lvl 0"/><w:basedOn w:val="ListNumber"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="listlvl0"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="ListNumber"/><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="para10ptChar"><w:name w:val="para 10pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para10pt"/><w:rsid w:val="0015054E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00B8047C"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="29698"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:attachedTemplate w:val=""/><w:stylePaneFormatFilter w:val="3001"/><w:documentProtection w:formatting="on" w:enforcement="on" w:unprotectPassword="00000000"/><w:defaultTabStop w:val="720"/><w:doNotHyphenateCaps/><w:drawingGridHorizontalSpacing w:val="120"/><w:drawingGridVerticalSpacing w:val="120"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="3"/><w:useMarginsForDrawingGridOrigin/><w:doNotShadeFormData/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="29698"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/><w:p wsp:rsidR="006B4298" wsp:rsidRDefault="006B4298"/></w:endnote></w:endnotePr><w:compat><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00244327"/><wsp:rsid wsp:val="00244327"/><wsp:rsid wsp:val="006B4298"/><wsp:rsid wsp:val="00C02320"/><wsp:rsid wsp:val="00DD07E7"/></wsp:rsids></w:docPr><w:body><wx:sect><ns0:Artifact><w:p wsp:rsidR="00DD07E7" wsp:rsidRDefault="00DD07E7"><Set_Name><w:r wsp:rsidR="006B4298"><w:t>Default</w:t></w:r></Set_Name><Outline><HeadingAttribute><w:r wsp:rsidR="006B4298"><w:t>Name</w:t></w:r></HeadingAttribute><RecurseChildren><w:r wsp:rsidR="006B4298"><w:t>true</w:t></w:r></RecurseChildren></Outline><Attribute><Name><w:r wsp:rsidR="00C02320" wsp:rsidRPr="00C02320"><w:t>Word Template Content</w:t></w:r></Name></Attribute></w:p></ns0:Artifact><w:p wsp:rsidR="00DD07E7" wsp:rsidRDefault="00DD07E7"/><w:sectPr wsp:rsidR="00DD07E7" wsp:rsidSect="00DD07E7"><w:hdr w:type="odd"><w:p wsp:rsidR="00DD07E7" wsp:rsidRDefault="00DD07E7"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="432" w:footer="432" w:gutter="0"/><w:pgNumType w:start="1"/><w:cols w:space="475"/><w:noEndnote/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL.xml b/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL.xml
new file mode 100644
index 00000000000..72468b8bf77
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL.xml
@@ -0,0 +1,7688 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument w:embeddedObjPresent="no" w:macrosPresent="no" w:ocxPresent="no" xml:space="preserve" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ns0="http://www.w3.org/2001/XMLSchema" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint">
+ <w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/>
+ <o:DocumentProperties>
+ <o:Title>SRS</o:Title>
+ <o:Author>Ryan D. Brooks</o:Author>
+ <o:LastAuthor>b289820</o:LastAuthor>
+ <o:Revision>14</o:Revision>
+ <o:TotalTime>1282</o:TotalTime>
+ <o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted>
+ <o:Created>2007-04-21T15:49:00Z</o:Created>
+ <o:LastSaved>2008-01-15T18:48:00Z</o:LastSaved>
+ <o:Pages>1</o:Pages>
+ <o:Words>4</o:Words>
+ <o:Characters>29</o:Characters>
+ <o:Company>The Boeing Company</o:Company>
+ <o:Lines>1</o:Lines>
+ <o:Paragraphs>1</o:Paragraphs>
+ <o:CharactersWithSpaces>32</o:CharactersWithSpaces>
+ <o:Version>11.8134</o:Version>
+ </o:DocumentProperties>
+ <w:fonts>
+ <w:defaultFonts w:ascii="Times New Roman" w:cs="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman"/>
+ <w:font w:name="Helvetica">
+ <w:panose-1 w:val="020B0604020202020204"/>
+ <w:charset w:val="00"/>
+ <w:family w:val="Swiss"/>
+ <w:notTrueType/>
+ <w:pitch w:val="variable"/>
+ <w:sig w:csb-0="00000001" w:csb-1="00000000" w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000"/>
+ </w:font>
+ <w:font w:name="Courier">
+ <w:panose-1 w:val="02070409020205020404"/>
+ <w:charset w:val="00"/>
+ <w:family w:val="Modern"/>
+ <w:notTrueType/>
+ <w:pitch w:val="fixed"/>
+ <w:sig w:csb-0="00000001" w:csb-1="00000000" w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000"/>
+ </w:font>
+ <w:font w:name="Wingdings">
+ <w:panose-1 w:val="05000000000000000000"/>
+ <w:charset w:val="02"/>
+ <w:family w:val="Auto"/>
+ <w:pitch w:val="variable"/>
+ <w:sig w:csb-0="80000000" w:csb-1="00000000" w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000"/>
+ </w:font>
+ <w:font w:name="Tahoma">
+ <w:panose-1 w:val="020B0604030504040204"/>
+ <w:charset w:val="00"/>
+ <w:family w:val="Swiss"/>
+ <w:pitch w:val="variable"/>
+ <w:sig w:csb-0="000101FF" w:csb-1="00000000" w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000"/>
+ </w:font>
+ </w:fonts>
+ <w:lists>
+ <w:listDef w:listDefId="0">
+ <w:lsid w:val="FFFFFF7C"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="D440384C"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="1">
+ <w:lsid w:val="FFFFFF7D"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="6820FC02"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="2">
+ <w:lsid w:val="FFFFFF7F"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="2B10698A"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="3">
+ <w:lsid w:val="FFFFFF80"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="F4645DBA"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="4">
+ <w:lsid w:val="FFFFFF81"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="B29CAA58"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="5">
+ <w:lsid w:val="FFFFFF82"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="6C206602"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="6">
+ <w:lsid w:val="FFFFFF83"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="3ED012C8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="7">
+ <w:lsid w:val="FFFFFF89"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="EE3C3A12"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="8">
+ <w:lsid w:val="003A6350"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="F89E6E26"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:pStyle w:val="APPENDIX1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX2"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX4"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX5"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX6"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX7"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX8"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX9"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="9">
+ <w:lsid w:val="016D5431"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="98C65BCE"/>
+ <w:lvl w:ilvl="0" w:tplc="94D2C566">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="504" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="504"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="10">
+ <w:lsid w:val="0C4D206D"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="4B543E40"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="11">
+ <w:lsid w:val="0DE40F2C"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="12">
+ <w:lsid w:val="10AF29E5"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="7520DAAE"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="13">
+ <w:lsid w:val="15EB1725"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="D902A83E"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="14">
+ <w:lsid w:val="1C970BBA"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5EB82E3A"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="15">
+ <w:lsid w:val="1D6C5FCC"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="E710F038"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="APPENDIX %1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="0"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="16">
+ <w:lsid w:val="1EC51BCC"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="17">
+ <w:lsid w:val="256F5D56"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="EAC4E6B8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="18">
+ <w:lsid w:val="27437854"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="19">
+ <w:lsid w:val="290A1130"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="EAC4E6B8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="20">
+ <w:lsid w:val="299E4F07"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="46E2B8B2"/>
+ <w:lvl w:ilvl="0" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1512" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="1512"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="21">
+ <w:lsid w:val="29C240FD"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="FCA4DC08"/>
+ <w:lvl w:ilvl="0" w:tplc="B5146A3E">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:pStyle w:val="bulletlvl2"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1224" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1224"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tplc="04090019">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="0409001B">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="0409000F">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090019">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="0409001B">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="0409000F">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090019">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="0409001B">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="22">
+ <w:lsid w:val="29CA5728"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="D00252C6"/>
+ <w:lvl w:ilvl="0" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%1"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="23">
+ <w:lsid w:val="2A5411A0"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0D44492C"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading2"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading4"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading5"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading6"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading7"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading8"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading9"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="24">
+ <w:lsid w:val="2B1C06F5"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="3B98963A"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="25">
+ <w:lsid w:val="2B477730"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="33801DC4"/>
+ <w:lvl w:ilvl="0" w:tplc="2D8A4B4C">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:pStyle w:val="bulletlvl3"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3024" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="2016" w:left="3024"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2448" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2448"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:cs="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3168" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3168"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3888" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3888"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4608" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="4608"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:cs="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5328" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5328"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6048" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6048"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6768" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6768"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:cs="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="7488" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="7488"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="26">
+ <w:lsid w:val="2B5B6B3C"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5CC8E874"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:first-line="763" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="27">
+ <w:lsid w:val="2D6545A6"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="3F227848"/>
+ <w:name w:val="listreset"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1296" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1296"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ <w:b w:val="off"/>
+ <w:i w:val="off"/>
+ <w:caps w:val="off"/>
+ <w:strike w:val="off"/>
+ <w:dstrike w:val="off"/>
+ <w:outline w:val="off"/>
+ <w:shadow w:val="off"/>
+ <w:emboss w:val="off"/>
+ <w:imprint w:val="off"/>
+ <w:vanish w:val="off"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:vertAlign w:val="baseline"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl2"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="-31680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1656"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl3"/>
+ <w:lvlText w:val="(%3)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2016" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2016"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl4"/>
+ <w:lvlText w:val="(%4)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2376" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2376"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl5"/>
+ <w:lvlText w:val="%5)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2736" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl6"/>
+ <w:lvlText w:val="%6)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3096" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3096"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/>
+ <w:b w:val="off"/>
+ <w:i w:val="off"/>
+ <w:sz w:val="22"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl7"/>
+ <w:lvlText w:val="[%7]."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3456" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3456"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="[%8]."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="28">
+ <w:lsid w:val="308239DA"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="29">
+ <w:lsid w:val="31A252E6"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="A9D83578"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="30">
+ <w:lsid w:val="37365033"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="31">
+ <w:lsid w:val="3B97448F"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:name w:val="listrestart2"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="32">
+ <w:lsid w:val="3C165F4A"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="79A06FE6"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="33">
+ <w:lsid w:val="42BB3748"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="DBE464B0"/>
+ <w:lvl w:ilvl="0" w:tplc="26BAF6B0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:pStyle w:val="bulletlvl1"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="648" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="648"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3960"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="4680"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5400"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6120"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6840" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6840"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="34">
+ <w:lsid w:val="5A401749"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="CD8E61CE"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="35">
+ <w:lsid w:val="5A802BC9"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="CB0E7A2E"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="36">
+ <w:lsid w:val="5C3B1B76"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="CB0E7A2E"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="37">
+ <w:lsid w:val="5E371EBB"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="DA56D440"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="38">
+ <w:lsid w:val="60B71688"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5EA20814"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="39">
+ <w:lsid w:val="6389497B"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="AC5A6410"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl10"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3960"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4680"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5400"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="6120"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="40">
+ <w:lsid w:val="6469691A"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="E5D02024"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="41">
+ <w:lsid w:val="74BA49AE"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:name w:val="listrestart"/>
+ <w:styleLink w:val="listreset"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="42">
+ <w:lsid w:val="751E50EA"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="79E6FEDC"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="43">
+ <w:lsid w:val="7D9D3B47"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="44">
+ <w:lsid w:val="7F0F313D"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="F8FC63EE"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="45">
+ <w:lsid w:val="7F633FB7"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5F5A52E8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:list w:ilfo="1">
+ <w:ilst w:val="33"/>
+ </w:list>
+ <w:list w:ilfo="2">
+ <w:ilst w:val="21"/>
+ </w:list>
+ <w:list w:ilfo="3">
+ <w:ilst w:val="27"/>
+ </w:list>
+ <w:list w:ilfo="4">
+ <w:ilst w:val="23"/>
+ </w:list>
+ <w:list w:ilfo="5">
+ <w:ilst w:val="14"/>
+ </w:list>
+ <w:list w:ilfo="6">
+ <w:ilst w:val="35"/>
+ </w:list>
+ <w:list w:ilfo="7">
+ <w:ilst w:val="13"/>
+ </w:list>
+ <w:list w:ilfo="8">
+ <w:ilst w:val="22"/>
+ </w:list>
+ <w:list w:ilfo="9">
+ <w:ilst w:val="39"/>
+ </w:list>
+ <w:list w:ilfo="10">
+ <w:ilst w:val="15"/>
+ </w:list>
+ <w:list w:ilfo="11">
+ <w:ilst w:val="27"/>
+ </w:list>
+ <w:list w:ilfo="12">
+ <w:ilst w:val="36"/>
+ </w:list>
+ <w:list w:ilfo="13">
+ <w:ilst w:val="44"/>
+ </w:list>
+ <w:list w:ilfo="14">
+ <w:ilst w:val="10"/>
+ </w:list>
+ <w:list w:ilfo="15">
+ <w:ilst w:val="37"/>
+ </w:list>
+ <w:list w:ilfo="16">
+ <w:ilst w:val="26"/>
+ </w:list>
+ <w:list w:ilfo="17">
+ <w:ilst w:val="40"/>
+ </w:list>
+ <w:list w:ilfo="18">
+ <w:ilst w:val="12"/>
+ </w:list>
+ <w:list w:ilfo="19">
+ <w:ilst w:val="29"/>
+ </w:list>
+ <w:list w:ilfo="20">
+ <w:ilst w:val="24"/>
+ </w:list>
+ <w:list w:ilfo="21">
+ <w:ilst w:val="45"/>
+ </w:list>
+ <w:list w:ilfo="22">
+ <w:ilst w:val="32"/>
+ </w:list>
+ <w:list w:ilfo="23">
+ <w:ilst w:val="34"/>
+ </w:list>
+ <w:list w:ilfo="24">
+ <w:ilst w:val="42"/>
+ </w:list>
+ <w:list w:ilfo="25">
+ <w:ilst w:val="8"/>
+ </w:list>
+ <w:list w:ilfo="26">
+ <w:ilst w:val="41"/>
+ </w:list>
+ <w:list w:ilfo="27">
+ <w:ilst w:val="31"/>
+ </w:list>
+ <w:list w:ilfo="28">
+ <w:ilst w:val="25"/>
+ </w:list>
+ <w:list w:ilfo="29">
+ <w:ilst w:val="28"/>
+ </w:list>
+ <w:list w:ilfo="30">
+ <w:ilst w:val="27"/>
+ <w:lvlOverride w:ilvl="0">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="1">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="2">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="3">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="4">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="5">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="6">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="7">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="8">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ </w:list>
+ <w:list w:ilfo="31">
+ <w:ilst w:val="20"/>
+ </w:list>
+ <w:list w:ilfo="32">
+ <w:ilst w:val="9"/>
+ </w:list>
+ <w:list w:ilfo="33">
+ <w:ilst w:val="43"/>
+ </w:list>
+ <w:list w:ilfo="34">
+ <w:ilst w:val="16"/>
+ </w:list>
+ <w:list w:ilfo="35">
+ <w:ilst w:val="38"/>
+ </w:list>
+ <w:list w:ilfo="36">
+ <w:ilst w:val="23"/>
+ </w:list>
+ <w:list w:ilfo="37">
+ <w:ilst w:val="19"/>
+ </w:list>
+ <w:list w:ilfo="38">
+ <w:ilst w:val="17"/>
+ </w:list>
+ <w:list w:ilfo="39">
+ <w:ilst w:val="11"/>
+ </w:list>
+ <w:list w:ilfo="40">
+ <w:ilst w:val="7"/>
+ </w:list>
+ <w:list w:ilfo="41">
+ <w:ilst w:val="6"/>
+ </w:list>
+ <w:list w:ilfo="42">
+ <w:ilst w:val="5"/>
+ </w:list>
+ <w:list w:ilfo="43">
+ <w:ilst w:val="4"/>
+ </w:list>
+ <w:list w:ilfo="44">
+ <w:ilst w:val="3"/>
+ </w:list>
+ <w:list w:ilfo="45">
+ <w:ilst w:val="2"/>
+ </w:list>
+ <w:list w:ilfo="46">
+ <w:ilst w:val="1"/>
+ </w:list>
+ <w:list w:ilfo="47">
+ <w:ilst w:val="0"/>
+ </w:list>
+ <w:list w:ilfo="48">
+ <w:ilst w:val="30"/>
+ </w:list>
+ <w:list w:ilfo="49">
+ <w:ilst w:val="18"/>
+ </w:list>
+ <w:ilfoMacAtCleanup w:val="5"/>
+ </w:lists>
+ <w:styles>
+ <w:versionOfBuiltInStylenames w:val="4"/>
+ <w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/>
+ <w:style w:default="on" w:styleId="Normal" w:type="paragraph">
+ <w:name w:val="Normal"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:pPr>
+ <w:spacing w:after="40" w:before="40" w:line="240" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading1" w:type="paragraph">
+ <w:name w:val="heading 1"/>
+ <wx:uiName wx:val="Heading 1"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading1"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:pageBreakBefore/>
+ <w:listPr>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="0"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:kern w:val="28"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading2" w:type="paragraph">
+ <w:name w:val="heading 2"/>
+ <wx:uiName wx:val="Heading 2"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading2"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="1"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="320"/>
+ <w:outlineLvl w:val="1"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading3" w:type="paragraph">
+ <w:name w:val="heading 3"/>
+ <wx:uiName wx:val="Heading 3"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading3"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="2"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="900" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80" w:before="320"/>
+ <w:outlineLvl w:val="2"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading4" w:type="paragraph">
+ <w:name w:val="heading 4"/>
+ <wx:uiName wx:val="Heading 4"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading4"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="3"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="3"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading5" w:type="paragraph">
+ <w:name w:val="heading 5"/>
+ <wx:uiName wx:val="Heading 5"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading5"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="4"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="4"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading6" w:type="paragraph">
+ <w:name w:val="heading 6"/>
+ <wx:uiName wx:val="Heading 6"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading6"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="5"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="5"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading7" w:type="paragraph">
+ <w:name w:val="heading 7"/>
+ <wx:uiName wx:val="Heading 7"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading7"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="6"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1620" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="6"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading8" w:type="paragraph">
+ <w:name w:val="heading 8"/>
+ <wx:uiName wx:val="Heading 8"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading8"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="7"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="7"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:b-cs/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading9" w:type="paragraph">
+ <w:name w:val="heading 9"/>
+ <wx:uiName wx:val="Heading 9"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00B64BB6"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading9"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="8"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="8"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:default="on" w:styleId="DefaultParagraphFont" w:type="character">
+ <w:name w:val="Default Paragraph Font"/>
+ <w:semiHidden/>
+ </w:style>
+ <w:style w:default="on" w:styleId="TableNormal" w:type="table">
+ <w:name w:val="Normal Table"/>
+ <wx:uiName wx:val="Table Normal"/>
+ <w:semiHidden/>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman"/>
+ </w:rPr>
+ <w:tblPr>
+ <w:tblInd w:type="dxa" w:w="0"/>
+ <w:tblCellMar>
+ <w:top w:type="dxa" w:w="0"/>
+ <w:left w:type="dxa" w:w="108"/>
+ <w:bottom w:type="dxa" w:w="0"/>
+ <w:right w:type="dxa" w:w="108"/>
+ </w:tblCellMar>
+ </w:tblPr>
+ </w:style>
+ <w:style w:default="on" w:styleId="NoList" w:type="list">
+ <w:name w:val="No List"/>
+ <w:semiHidden/>
+ </w:style>
+ <w:style w:styleId="paranormal" w:type="paragraph">
+ <w:name w:val="para:normal"/>
+ <w:link w:val="paranormalChar"/>
+ <w:rsid w:val="009E6B3D"/>
+ <w:pPr>
+ <w:pStyle w:val="paranormal"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="64" w:line="240" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b-cs/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl3" w:type="paragraph">
+ <w:name w:val="list:lvl 3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl3"/>
+ <w:listPr>
+ <w:ilvl w:val="2"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="2088" w:val="left"/>
+ </w:tabs>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang1" w:type="paragraph">
+ <w:name w:val="req lang:1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang1"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Header" w:type="paragraph">
+ <w:name w:val="header"/>
+ <wx:uiName wx:val="Header"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A134C3"/>
+ <w:pPr>
+ <w:pStyle w:val="Header"/>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="center"/>
+ <w:tab w:pos="8640" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="0" w:before="20" w:line="180" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="proprietarycontd" w:type="paragraph">
+ <w:name w:val="proprietary:cont'd"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="proprietarycontd"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="60" w:before="60" w:line="200" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="16"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paracentered" w:type="paragraph">
+ <w:name w:val="para:centered"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00B43482"/>
+ <w:pPr>
+ <w:pStyle w:val="paracentered"/>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="80" w:line="240" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Helvetica" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent2" w:type="paragraph">
+ <w:name w:val="para:indent2"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="004417BE"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent2"/>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ <w:tab w:pos="5040" w:val="left"/>
+ <w:tab w:pos="5760" w:val="left"/>
+ <w:tab w:pos="6480" w:val="left"/>
+ <w:tab w:pos="7200" w:val="left"/>
+ <w:tab w:pos="7920" w:val="left"/>
+ <w:tab w:pos="8640" w:val="left"/>
+ <w:tab w:pos="9360" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="40" w:line="240" w:line-rule="at-least"/>
+ <w:ind w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent3" w:type="paragraph">
+ <w:name w:val="para:indent3"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="0071606D"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent3"/>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4680" w:val="left"/>
+ <w:tab w:pos="5400" w:val="left"/>
+ <w:tab w:pos="6120" w:val="left"/>
+ <w:tab w:pos="6840" w:val="left"/>
+ <w:tab w:pos="7560" w:val="left"/>
+ <w:tab w:pos="8280" w:val="left"/>
+ <w:tab w:pos="9000" w:val="left"/>
+ <w:tab w:pos="9720" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="40" w:line="240" w:line-rule="at-least"/>
+ <w:ind w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Caption" w:type="paragraph">
+ <w:name w:val="caption"/>
+ <wx:uiName wx:val="Caption"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:semiHidden/>
+ <w:rsid w:val="0085234B"/>
+ <w:pPr>
+ <w:pStyle w:val="Caption"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ <w:tab w:pos="5400" w:val="left"/>
+ <w:tab w:pos="6480" w:val="left"/>
+ <w:tab w:pos="7560" w:val="left"/>
+ <w:tab w:pos="8640" w:val="left"/>
+ <w:tab w:pos="9720" w:val="left"/>
+ <w:tab w:pos="10800" w:val="left"/>
+ <w:tab w:pos="11880" w:val="left"/>
+ <w:tab w:pos="12960" w:val="left"/>
+ <w:tab w:pos="14040" w:val="left"/>
+ <w:tab w:pos="15120" w:val="left"/>
+ <w:tab w:pos="16200" w:val="left"/>
+ <w:tab w:pos="17280" w:val="left"/>
+ <w:tab w:pos="18360" w:val="left"/>
+ <w:tab w:pos="19440" w:val="left"/>
+ <w:tab w:pos="20520" w:val="left"/>
+ <w:tab w:pos="21600" w:val="left"/>
+ <w:tab w:pos="22680" w:val="left"/>
+ <w:tab w:pos="23760" w:val="left"/>
+ <w:tab w:pos="24840" w:val="left"/>
+ <w:tab w:pos="25920" w:val="left"/>
+ <w:tab w:pos="27000" w:val="left"/>
+ <w:tab w:pos="28080" w:val="left"/>
+ <w:tab w:pos="29160" w:val="left"/>
+ <w:tab w:pos="30240" w:val="left"/>
+ <w:tab w:pos="31320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="120" w:before="120"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent1" w:type="paragraph">
+ <w:name w:val="para:indent1"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="007D424E"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent1"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4680" w:val="left"/>
+ <w:tab w:pos="5400" w:val="left"/>
+ <w:tab w:pos="6120" w:val="left"/>
+ <w:tab w:pos="6840" w:val="left"/>
+ <w:tab w:pos="7560" w:val="left"/>
+ <w:tab w:pos="8280" w:val="left"/>
+ <w:tab w:pos="9000" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="40" w:line="240" w:line-rule="at-least"/>
+ <w:ind w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Footer" w:type="paragraph">
+ <w:name w:val="footer"/>
+ <wx:uiName wx:val="Footer"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="Footer"/>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="center"/>
+ <w:tab w:pos="8640" w:val="right"/>
+ </w:tabs>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl4" w:type="paragraph">
+ <w:name w:val="list:lvl 4"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl4"/>
+ <w:listPr>
+ <w:ilvl w:val="3"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHead" w:type="paragraph">
+ <w:name w:val="RowHead"/>
+ <w:basedOn w:val="Heading1"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHead"/>
+ <w:listPr>
+ <w:ilfo w:val="0"/>
+ </w:listPr>
+ <w:spacing w:after="100" w:before="100"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText11" w:type="paragraph">
+ <w:name w:val="TableText11"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText11"/>
+ <w:spacing w:line="220" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOAHeading" w:type="paragraph">
+ <w:name w:val="toa heading"/>
+ <wx:uiName wx:val="TOA Heading"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOAHeading"/>
+ <w:spacing w:after="120" w:before="240"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:b-cs/>
+ <w:caps/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHeadL" w:type="paragraph">
+ <w:name w:val="RowHeadL"/>
+ <w:basedOn w:val="RowHead"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHeadL"/>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:jc w:val="left"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b w:val="off"/>
+ <w:b-cs/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText11B" w:type="paragraph">
+ <w:name w:val="TableText11B"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00913874"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText11B"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableofAuthorities" w:type="paragraph">
+ <w:name w:val="table of authorities"/>
+ <wx:uiName wx:val="Table of Authorities"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableofAuthorities"/>
+ <w:tabs>
+ <w:tab w:leader="dot" w:pos="8640" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="80" w:before="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableofFigures" w:type="paragraph">
+ <w:name w:val="table of figures"/>
+ <wx:uiName wx:val="Table of Figures"/>
+ <w:next w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableofFigures"/>
+ <w:tabs>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Hyperlink" w:type="character">
+ <w:name w:val="Hyperlink"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:rsid w:val="00721F21"/>
+ <w:rPr>
+ <w:color w:val="0000FF"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="PageNumber" w:type="character">
+ <w:name w:val="page number"/>
+ <wx:uiName wx:val="Page Number"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:rsid w:val="00D90577"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:dstrike w:val="off"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ <w:vertAlign w:val="baseline"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHead11" w:type="paragraph">
+ <w:name w:val="RowHead11"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHead11"/>
+ <w:listPr>
+ <w:ilvl w:val="12"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="80"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText11C" w:type="paragraph">
+ <w:name w:val="TableText11C"/>
+ <w:basedOn w:val="TableText11"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText11C"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman"/>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl1" w:type="paragraph">
+ <w:name w:val="list:lvl 1"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl1"/>
+ <w:listPr>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="936" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ <w:tab w:pos="5040" w:val="left"/>
+ <w:tab w:pos="5760" w:val="left"/>
+ <w:tab w:pos="6480" w:val="left"/>
+ <w:tab w:pos="7200" w:val="left"/>
+ <w:tab w:pos="7920" w:val="left"/>
+ <w:tab w:pos="8640" w:val="left"/>
+ <w:tab w:pos="9360" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="60" w:before="60" w:line="240" w:line-rule="at-least"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Helvetica" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl5" w:type="paragraph">
+ <w:name w:val="list:lvl 5"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl5"/>
+ <w:listPr>
+ <w:ilvl w:val="4"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="clear"/>
+ <w:tab w:pos="720" w:val="clear"/>
+ <w:tab w:pos="1080" w:val="clear"/>
+ <w:tab w:pos="1440" w:val="clear"/>
+ <w:tab w:pos="1800" w:val="clear"/>
+ <w:tab w:pos="2160" w:val="clear"/>
+ <w:tab w:pos="2520" w:val="clear"/>
+ <w:tab w:pos="2880" w:val="clear"/>
+ <w:tab w:pos="3240" w:val="clear"/>
+ <w:tab w:pos="3600" w:val="clear"/>
+ <w:tab w:pos="3384" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="40"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl2" w:type="paragraph">
+ <w:name w:val="list:lvl 2"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl2"/>
+ <w:widowControl w:val="off"/>
+ <w:listPr>
+ <w:ilvl w:val="1"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60" w:line="240" w:line-rule="at-least"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="AppendixTitle" w:type="paragraph">
+ <w:name w:val="Appendix Title"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="AppendixTitle"/>
+ <w:pageBreakBefore/>
+ <w:spacing w:after="240" w:before="120"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHead10" w:type="paragraph">
+ <w:name w:val="RowHead10"/>
+ <w:basedOn w:val="RowHead11"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHead10"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC1" w:type="paragraph">
+ <w:name w:val="toc 1"/>
+ <wx:uiName wx:val="TOC 1"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00003D10"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC1"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="540" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:before="240"/>
+ <w:ind w:hanging="547" w:left="547"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:caps/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC2" w:type="paragraph">
+ <w:name w:val="toc 2"/>
+ <wx:uiName wx:val="TOC 2"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00003D10"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC2"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="900" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9360" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:before="120"/>
+ <w:ind w:hanging="720" w:left="907"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC3" w:type="paragraph">
+ <w:name w:val="toc 3"/>
+ <wx:uiName wx:val="TOC 3"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC3"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="1260" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="900" w:left="1260"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC4" w:type="paragraph">
+ <w:name w:val="toc 4"/>
+ <wx:uiName wx:val="TOC 4"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC4"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="1620" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1080" w:left="1620"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC5" w:type="paragraph">
+ <w:name w:val="toc 5"/>
+ <wx:uiName wx:val="TOC 5"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC5"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="1980" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1260" w:left="1980"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC6" w:type="paragraph">
+ <w:name w:val="toc 6"/>
+ <wx:uiName wx:val="TOC 6"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC6"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="2340" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1440" w:left="2340"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC7" w:type="paragraph">
+ <w:name w:val="toc 7"/>
+ <wx:uiName wx:val="TOC 7"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC7"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="2700" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="0" w:before="0" w:line="240" w:line-rule="auto"/>
+ <w:ind w:hanging="1620" w:left="2700"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC8" w:type="paragraph">
+ <w:name w:val="toc 8"/>
+ <wx:uiName wx:val="TOC 8"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC8"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="2970" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1710" w:left="2970"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC9" w:type="paragraph">
+ <w:name w:val="toc 9"/>
+ <wx:uiName wx:val="TOC 9"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC9"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="3330" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1890" w:left="3330"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="HeadingUnnumbered" w:type="paragraph">
+ <w:name w:val="Heading Unnumbered"/>
+ <w:next w:val="paranormal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00107AA6"/>
+ <w:pPr>
+ <w:pStyle w:val="HeadingUnnumbered"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:spacing w:after="80" w:before="240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10" w:type="paragraph">
+ <w:name w:val="TableText10"/>
+ <w:basedOn w:val="TableText11"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableTextBCentered" w:type="paragraph">
+ <w:name w:val="TableTextB Centered"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00913874"/>
+ <w:pPr>
+ <w:pStyle w:val="TableTextBCentered"/>
+ <w:spacing w:line="220" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10C" w:type="paragraph">
+ <w:name w:val="TableText10C"/>
+ <w:basedOn w:val="TableText11C"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10C"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10B" w:type="paragraph">
+ <w:name w:val="TableText10B"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00913874"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10B"/>
+ <w:spacing w:line="220" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="acronym" w:type="paragraph">
+ <w:name w:val="acronym"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="acronym"/>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="40" w:before="40"/>
+ <w:ind w:hanging="2160" w:left="2160"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl6" w:type="paragraph">
+ <w:name w:val="list:lvl 6"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl6"/>
+ <w:listPr>
+ <w:ilvl w:val="5"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="clear"/>
+ <w:tab w:pos="720" w:val="clear"/>
+ <w:tab w:pos="1080" w:val="clear"/>
+ <w:tab w:pos="1440" w:val="clear"/>
+ <w:tab w:pos="1800" w:val="clear"/>
+ <w:tab w:pos="2160" w:val="clear"/>
+ <w:tab w:pos="2520" w:val="clear"/>
+ <w:tab w:pos="2880" w:val="clear"/>
+ <w:tab w:pos="3240" w:val="clear"/>
+ <w:tab w:pos="3600" w:val="clear"/>
+ <w:tab w:pos="3960" w:val="clear"/>
+ <w:tab w:pos="4320" w:val="clear"/>
+ </w:tabs>
+ <w:spacing w:after="40"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="hdr1L" w:type="paragraph">
+ <w:name w:val="hdr1L"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="hdr1L"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="4680" w:val="center"/>
+ <w:tab w:pos="9360" w:val="right"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="hdr2L" w:type="paragraph">
+ <w:name w:val="hdr2L"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="hdr2L"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="4680" w:val="center"/>
+ <w:tab w:pos="9360" w:val="right"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:before="0" w:line="180" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl1" w:type="paragraph">
+ <w:name w:val="bullet:lvl 1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="bulletlvl1CharChar"/>
+ <w:rsid w:val="00143D5A"/>
+ <w:pPr>
+ <w:pStyle w:val="bulletlvl1"/>
+ <w:listPr>
+ <w:ilfo w:val="1"/>
+ </w:listPr>
+ <w:spacing w:after="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl2" w:type="paragraph">
+ <w:name w:val="bullet:lvl 2"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00143D5A"/>
+ <w:pPr>
+ <w:pStyle w:val="bulletlvl2"/>
+ <w:widowControl w:val="off"/>
+ <w:listPr>
+ <w:ilfo w:val="2"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1224" w:val="clear"/>
+ <w:tab w:pos="648" w:val="left"/>
+ <w:tab w:pos="1008" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80"/>
+ <w:ind w:hanging="1080" w:left="1728"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent4" w:type="paragraph">
+ <w:name w:val="para:indent4"/>
+ <w:basedOn w:val="paraindent3"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="0071606D"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent4"/>
+ <w:ind w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl7" w:type="paragraph">
+ <w:name w:val="list:lvl 7"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl7"/>
+ <w:listPr>
+ <w:ilvl w:val="6"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="clear"/>
+ <w:tab w:pos="720" w:val="clear"/>
+ <w:tab w:pos="1080" w:val="clear"/>
+ <w:tab w:pos="1440" w:val="clear"/>
+ <w:tab w:pos="1800" w:val="clear"/>
+ <w:tab w:pos="2160" w:val="clear"/>
+ <w:tab w:pos="2520" w:val="clear"/>
+ <w:tab w:pos="2880" w:val="clear"/>
+ <w:tab w:pos="3240" w:val="clear"/>
+ <w:tab w:pos="3600" w:val="clear"/>
+ <w:tab w:pos="3960" w:val="clear"/>
+ <w:tab w:pos="3024" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="40"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOCfiguretitle" w:type="paragraph">
+ <w:name w:val="TOC:figure title"/>
+ <w:basedOn w:val="Caption"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00894991"/>
+ <w:pPr>
+ <w:pStyle w:val="TOCfiguretitle"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="note" w:type="paragraph">
+ <w:name w:val="note"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="006E0AB6"/>
+ <w:pPr>
+ <w:pStyle w:val="note"/>
+ <w:spacing w:after="80" w:before="80"/>
+ <w:ind w:hanging="936" w:left="1656" w:right="720"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang2" w:type="paragraph">
+ <w:name w:val="req lang:2"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang2"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang3" w:type="paragraph">
+ <w:name w:val="req lang:3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang3"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang4" w:type="paragraph">
+ <w:name w:val="req lang:4"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang4"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang5" w:type="paragraph">
+ <w:name w:val="req lang:5"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang5"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang6" w:type="paragraph">
+ <w:name w:val="req lang:6"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang6"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="statedef" w:type="paragraph">
+ <w:name w:val="state def"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00DE6BA0"/>
+ <w:pPr>
+ <w:pStyle w:val="statedef"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="0" w:before="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:caps/>
+ <w:color w:val="408040"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="intentblank" w:type="paragraph">
+ <w:name w:val="intent:blank"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="000B79E8"/>
+ <w:pPr>
+ <w:pStyle w:val="intentblank"/>
+ <w:spacing w:after="0" w:before="6480"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="code" w:type="paragraph">
+ <w:name w:val="code"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="006D4514"/>
+ <w:pPr>
+ <w:pStyle w:val="code"/>
+ <w:spacing w:after="80" w:before="80" w:line="220" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="18"/>
+ <w:sz-cs w:val="18"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="parapage" w:type="paragraph">
+ <w:name w:val="para:page"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00DD22A9"/>
+ <w:pPr>
+ <w:pStyle w:val="parapage"/>
+ <w:pageBreakBefore/>
+ <w:spacing w:after="80" w:before="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOCtabletitle" w:type="paragraph">
+ <w:name w:val="TOC:table title"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00B869CD"/>
+ <w:pPr>
+ <w:pStyle w:val="TOCtabletitle"/>
+ <w:spacing w:after="120" w:before="120"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RCRitem" w:type="paragraph">
+ <w:name w:val="RCR:item"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="007A1F4F"/>
+ <w:pPr>
+ <w:pStyle w:val="RCRitem"/>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:before="120"/>
+ <w:ind w:hanging="1800" w:left="1800" w:right="720"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RCRheader" w:type="paragraph">
+ <w:name w:val="RCR:header"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="006D781E"/>
+ <w:pPr>
+ <w:pStyle w:val="RCRheader"/>
+ <w:tabs>
+ <w:tab w:pos="792" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:leader="underscore" w:pos="8640" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="22"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="line" w:type="paragraph">
+ <w:name w:val="line"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="006B63C2"/>
+ <w:pPr>
+ <w:pStyle w:val="line"/>
+ <w:spacing w:before="0" w:line="40" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="12"/>
+ <w:sz-cs w:val="12"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang7" w:type="paragraph">
+ <w:name w:val="req lang: 7"/>
+ <w:basedOn w:val="reqlang6"/>
+ <w:rsid w:val="00C0337E"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang7"/>
+ <w:ind w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier New"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang70" w:type="paragraph">
+ <w:name w:val="req lang:7"/>
+ <w:basedOn w:val="reqlang7"/>
+ <w:rsid w:val="004C603C"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang70"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier New"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang8" w:type="paragraph">
+ <w:name w:val="req lang:8"/>
+ <w:basedOn w:val="reqlang7"/>
+ <w:rsid w:val="004C603C"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang8"/>
+ <w:ind w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier New"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang9" w:type="paragraph">
+ <w:name w:val="req lang:9"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="007534C9"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang9"/>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="DocumentMap" w:type="paragraph">
+ <w:name w:val="Document Map"/>
+ <w:basedOn w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00AF20CB"/>
+ <w:pPr>
+ <w:pStyle w:val="DocumentMap"/>
+ <w:shd w:color="auto" w:fill="000080" w:val="clear"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Tahoma" w:cs="Tahoma" w:h-ansi="Tahoma"/>
+ <wx:font wx:val="Tahoma"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment1" w:type="paragraph">
+ <w:name w:val="comment:1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment1"/>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="360"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment2" w:type="paragraph">
+ <w:name w:val="comment:2"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment2"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="720"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment3" w:type="paragraph">
+ <w:name w:val="comment:3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment3"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="1080"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment4" w:type="paragraph">
+ <w:name w:val="comment:4"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment4"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="1440"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment5" w:type="paragraph">
+ <w:name w:val="comment:5"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment5"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment6" w:type="paragraph">
+ <w:name w:val="comment:6"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment6"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment7" w:type="paragraph">
+ <w:name w:val="comment:7"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment7"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="2520"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment8" w:type="paragraph">
+ <w:name w:val="comment:8"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment8"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="2880"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment9" w:type="paragraph">
+ <w:name w:val="comment:9"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment9"/>
+ <w:spacing w:after="80"/>
+ <w:ind w:left="3240"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlheader" w:type="paragraph">
+ <w:name w:val="dl:header"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlheader"/>
+ <w:spacing w:after="0" w:before="240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier" w:h-ansi="Courier"/>
+ <wx:font wx:val="Courier"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlbody" w:type="paragraph">
+ <w:name w:val="dl:body"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlbody"/>
+ <w:spacing w:before="0"/>
+ <w:ind w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlprocheader" w:type="paragraph">
+ <w:name w:val="dl_proc:header"/>
+ <w:basedOn w:val="dlbody"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlprocheader"/>
+ <w:spacing w:before="240"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlprocbody" w:type="paragraph">
+ <w:name w:val="dl_proc:body"/>
+ <w:basedOn w:val="dlprocheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlprocbody"/>
+ <w:spacing w:before="0"/>
+ <w:ind w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dldescription" w:type="paragraph">
+ <w:name w:val="dl:description"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dldescription"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bitmapheader" w:type="paragraph">
+ <w:name w:val="bitmap:header"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="bitmapheader"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bitmapbody" w:type="paragraph">
+ <w:name w:val="bitmap:body"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="bitmapbody"/>
+ <w:spacing w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX1" w:type="paragraph">
+ <w:name w:val="APPENDIX 1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="004978C4"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX1"/>
+ <w:listPr>
+ <w:ilfo w:val="25"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="72" w:before="152" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="auto"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX2" w:type="paragraph">
+ <w:name w:val="APPENDIX 2"/>
+ <w:basedOn w:val="APPENDIX1"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX2"/>
+ <w:listPr>
+ <w:ilvl w:val="1"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX3" w:type="paragraph">
+ <w:name w:val="APPENDIX 3"/>
+ <w:basedOn w:val="APPENDIX2"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00E904D2"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX3"/>
+ <w:listPr>
+ <w:ilvl w:val="2"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage18pt" w:type="paragraph">
+ <w:name w:val="Title Page 18pt"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="0033770F"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage18pt"/>
+ <w:spacing w:after="60" w:before="0" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="36"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage16pt" w:type="paragraph">
+ <w:name w:val="Title Page 16pt"/>
+ <w:basedOn w:val="TitlePage18pt"/>
+ <w:rsid w:val="0033770F"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage16pt"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="32"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage14pt" w:type="paragraph">
+ <w:name w:val="Title Page 14pt"/>
+ <w:basedOn w:val="TitlePage16pt"/>
+ <w:rsid w:val="0033770F"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage14pt"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b w:val="off"/>
+ <w:sz w:val="28"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para10pt" w:type="paragraph">
+ <w:name w:val="para 10pt"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="para10ptChar"/>
+ <w:rsid w:val="004E3337"/>
+ <w:pPr>
+ <w:pStyle w:val="para10pt"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para10ptnospacing" w:type="paragraph">
+ <w:name w:val="para 10pt no spacing"/>
+ <w:basedOn w:val="para10pt"/>
+ <w:rsid w:val="004A1CCA"/>
+ <w:pPr>
+ <w:pStyle w:val="para10ptnospacing"/>
+ <w:spacing w:after="0" w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10nospacing" w:type="paragraph">
+ <w:name w:val="TableText10 no spacing"/>
+ <w:basedOn w:val="TableText10"/>
+ <w:rsid w:val="00D72507"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10nospacing"/>
+ <w:spacing w:after="0" w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8pt" w:type="paragraph">
+ <w:name w:val="para 8pt"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="para8ptChar"/>
+ <w:rsid w:val="004E3337"/>
+ <w:pPr>
+ <w:pStyle w:val="para8pt"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paranormalChar" w:type="character">
+ <w:name w:val="para:normal Char"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:link w:val="paranormal"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:b-cs/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl1CharChar" w:type="character">
+ <w:name w:val="bullet:lvl 1 Char Char"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:link w:val="bulletlvl1"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="ParagraphText" w:type="paragraph">
+ <w:name w:val="ParagraphText"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:pPr>
+ <w:pStyle w:val="ParagraphText"/>
+ <w:spacing w:after="120" w:before="0" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/>
+ <wx:font wx:val="Times New Roman"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl10" w:type="paragraph">
+ <w:name w:val="list lvl 1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl10"/>
+ <w:listPr>
+ <w:ilfo w:val="9"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="936" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX4" w:type="paragraph">
+ <w:name w:val="APPENDIX 4"/>
+ <w:basedOn w:val="APPENDIX3"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX4"/>
+ <w:listPr>
+ <w:ilvl w:val="3"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX5" w:type="paragraph">
+ <w:name w:val="APPENDIX 5"/>
+ <w:basedOn w:val="APPENDIX4"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX5"/>
+ <w:listPr>
+ <w:ilvl w:val="4"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX6" w:type="paragraph">
+ <w:name w:val="APPENDIX 6"/>
+ <w:basedOn w:val="APPENDIX5"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX6"/>
+ <w:listPr>
+ <w:ilvl w:val="5"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX7" w:type="paragraph">
+ <w:name w:val="APPENDIX 7"/>
+ <w:basedOn w:val="APPENDIX6"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX7"/>
+ <w:listPr>
+ <w:ilvl w:val="6"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX8" w:type="paragraph">
+ <w:name w:val="APPENDIX 8"/>
+ <w:basedOn w:val="APPENDIX7"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX8"/>
+ <w:listPr>
+ <w:ilvl w:val="7"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX9" w:type="paragraph">
+ <w:name w:val="APPENDIX 9"/>
+ <w:basedOn w:val="APPENDIX8"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX9"/>
+ <w:listPr>
+ <w:ilvl w:val="8"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="BalloonText" w:type="paragraph">
+ <w:name w:val="Balloon Text"/>
+ <w:basedOn w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00B47E5D"/>
+ <w:pPr>
+ <w:pStyle w:val="BalloonText"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Tahoma" w:cs="Tahoma" w:h-ansi="Tahoma"/>
+ <wx:font wx:val="Tahoma"/>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listreset" w:type="list">
+ <w:name w:val="listreset"/>
+ <w:basedOn w:val="NoList"/>
+ <w:rsid w:val="00D25E39"/>
+ <w:pPr>
+ <w:listPr>
+ <w:ilfo w:val="26"/>
+ </w:listPr>
+ </w:pPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl3" w:type="paragraph">
+ <w:name w:val="bullet:lvl 3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00EF5226"/>
+ <w:pPr>
+ <w:pStyle w:val="bulletlvl3"/>
+ <w:listPr>
+ <w:ilfo w:val="28"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="3024" w:val="clear"/>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="1008" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80"/>
+ <w:ind w:hanging="360" w:left="1368"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="CommentReference" w:type="character">
+ <w:name w:val="annotation reference"/>
+ <wx:uiName wx:val="Comment Reference"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00E40969"/>
+ <w:rPr>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="CommentText" w:type="paragraph">
+ <w:name w:val="annotation text"/>
+ <wx:uiName wx:val="Comment Text"/>
+ <w:basedOn w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00E40969"/>
+ <w:pPr>
+ <w:pStyle w:val="CommentText"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="CommentSubject" w:type="paragraph">
+ <w:name w:val="annotation subject"/>
+ <wx:uiName wx:val="Comment Subject"/>
+ <w:basedOn w:val="CommentText"/>
+ <w:next w:val="CommentText"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00E40969"/>
+ <w:pPr>
+ <w:pStyle w:val="CommentSubject"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:b-cs/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage22pt" w:type="paragraph">
+ <w:name w:val="Title Page 22pt"/>
+ <w:basedOn w:val="TitlePage16pt"/>
+ <w:rsid w:val="005F35C4"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage22pt"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="44"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para" w:type="paragraph">
+ <w:name w:val="para"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="paraChar"/>
+ <w:rsid w:val="0057061B"/>
+ <w:pPr>
+ <w:pStyle w:val="para"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraChar" w:type="character">
+ <w:name w:val="para Char"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:link w:val="para"/>
+ <w:rsid w:val="0057061B"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl20" w:type="paragraph">
+ <w:name w:val="list lvl 2"/>
+ <w:basedOn w:val="ListNumber3"/>
+ <w:rsid w:val="0057061B"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl20"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="ListNumber3" w:type="paragraph">
+ <w:name w:val="List Number 3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="0057061B"/>
+ <w:pPr>
+ <w:pStyle w:val="ListNumber3"/>
+ <w:tabs>
+ <w:tab w:pos="1512" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="1512"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableGrid" w:type="table">
+ <w:name w:val="Table Grid"/>
+ <w:basedOn w:val="TableNormal"/>
+ <w:rsid w:val="008B1AB7"/>
+ <w:pPr>
+ <w:spacing w:after="40" w:before="40" w:line="240" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman"/>
+ </w:rPr>
+ <w:tblPr>
+ <w:tblInd w:type="dxa" w:w="0"/>
+ <w:tblBorders>
+ <w:top w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:left w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:bottom w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:right w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:insideH w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:insideV w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ </w:tblBorders>
+ <w:tblCellMar>
+ <w:top w:type="dxa" w:w="0"/>
+ <w:left w:type="dxa" w:w="108"/>
+ <w:bottom w:type="dxa" w:w="0"/>
+ <w:right w:type="dxa" w:w="108"/>
+ </w:tblCellMar>
+ </w:tblPr>
+ </w:style>
+ <w:style w:styleId="para8ptChar" w:type="character">
+ <w:name w:val="para 8pt Char"/>
+ <w:basedOn w:val="paraChar"/>
+ <w:link w:val="para8pt"/>
+ <w:rsid w:val="007921D3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="16"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8ptunderline" w:type="paragraph">
+ <w:name w:val="para 8pt underline"/>
+ <w:basedOn w:val="para8pt"/>
+ <w:link w:val="para8ptunderlineChar"/>
+ <w:rsid w:val="007921D3"/>
+ <w:pPr>
+ <w:pStyle w:val="para8ptunderline"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8ptunderlineChar" w:type="character">
+ <w:name w:val="para 8pt underline Char"/>
+ <w:basedOn w:val="para8ptChar"/>
+ <w:link w:val="para8ptunderline"/>
+ <w:rsid w:val="007921D3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="16"/>
+ <w:u w:val="single"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8ptnospacing" w:type="paragraph">
+ <w:name w:val="para 8pt no spacing"/>
+ <w:basedOn w:val="para8pt"/>
+ <w:rsid w:val="007921D3"/>
+ <w:pPr>
+ <w:pStyle w:val="para8ptnospacing"/>
+ <w:spacing w:after="0" w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl0" w:type="paragraph">
+ <w:name w:val="list lvl 0"/>
+ <w:basedOn w:val="ListNumber"/>
+ <w:rsid w:val="00A233DA"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl0"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="ListNumber" w:type="paragraph">
+ <w:name w:val="List Number"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A233DA"/>
+ <w:pPr>
+ <w:pStyle w:val="ListNumber"/>
+ <w:tabs>
+ <w:tab w:pos="504" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="504"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para10ptChar" w:type="character">
+ <w:name w:val="para 10pt Char"/>
+ <w:basedOn w:val="paraChar"/>
+ <w:link w:val="para10pt"/>
+ <w:rsid w:val="0015054E"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="FollowedHyperlink" w:type="character">
+ <w:name w:val="FollowedHyperlink"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:rsid w:val="00B8047C"/>
+ <w:rPr>
+ <w:color w:val="800080"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ </w:styles>
+ <w:shapeDefaults>
+ <o:shapedefaults spidmax="35842" v:ext="edit"/>
+ <o:shapelayout v:ext="edit">
+ <o:idmap data="1" v:ext="edit"/>
+ </o:shapelayout>
+ </w:shapeDefaults>
+ <w:docPr>
+ <w:view w:val="print"/>
+ <w:zoom w:percent="100"/>
+ <w:displayBackgroundShape/>
+ <w:doNotEmbedSystemFonts/>
+ <w:bordersDontSurroundHeader/>
+ <w:bordersDontSurroundFooter/>
+ <w:attachedTemplate w:val=""/>
+ <w:stylePaneFormatFilter w:val="3001"/>
+ <w:documentProtection w:enforcement="on" w:formatting="on" w:unprotectPassword="00000000"/>
+ <w:autoFormatOverride/>
+ <w:defaultTabStop w:val="720"/>
+ <w:doNotHyphenateCaps/>
+ <w:drawingGridHorizontalSpacing w:val="120"/>
+ <w:drawingGridVerticalSpacing w:val="120"/>
+ <w:displayHorizontalDrawingGridEvery w:val="0"/>
+ <w:displayVerticalDrawingGridEvery w:val="3"/>
+ <w:useMarginsForDrawingGridOrigin/>
+ <w:doNotShadeFormData/>
+ <w:punctuationKerning/>
+ <w:characterSpacingControl w:val="CompressPunctuation"/>
+ <w:optimizeForBrowser/>
+ <w:validateAgainstSchema w:val="off"/>
+ <w:saveInvalidXML/>
+ <w:ignoreMixedContent w:val="off"/>
+ <w:alwaysShowPlaceholderText w:val="off"/>
+ <w:hdrShapeDefaults>
+ <o:shapedefaults spidmax="35842" v:ext="edit"/>
+ </w:hdrShapeDefaults>
+ <w:footnotePr>
+ <w:footnote w:type="separator">
+ <w:p>
+ <w:r>
+ <w:separator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:footnote>
+ <w:footnote w:type="continuation-separator">
+ <w:p>
+ <w:r>
+ <w:continuationSeparator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:footnote>
+ </w:footnotePr>
+ <w:endnotePr>
+ <w:endnote w:type="separator">
+ <w:p>
+ <w:r>
+ <w:separator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:endnote>
+ <w:endnote w:type="continuation-separator">
+ <w:p>
+ <w:r>
+ <w:continuationSeparator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:endnote>
+ </w:endnotePr>
+ <w:compat>
+ <w:footnoteLayoutLikeWW8/>
+ <w:shapeLayoutLikeWW8/>
+ <w:alignTablesRowByRow/>
+ <w:forgetLastTabAlignment/>
+ <w:doNotUseHTMLParagraphAutoSpacing/>
+ <w:layoutRawTableWidth/>
+ <w:layoutTableRowsApart/>
+ <w:useWord97LineBreakingRules/>
+ <w:dontAllowFieldEndSelect/>
+ <w:useWord2002TableStyleRules/>
+ </w:compat>
+ <wsp:rsids>
+ <wsp:rsidRoot wsp:val="00244327"/>
+ </wsp:rsids>
+ </w:docPr>
+ <w:body>
+ <wx:sect>
+ <ns0:Artifact>
+ <w:p>
+ <Set_Name>
+ <w:r>
+ <w:t>Default</w:t>
+ </w:r>
+ </Set_Name>
+ <Outline>
+ <HeadingAttribute>
+ <w:r>
+ <w:t>Name</w:t>
+ </w:r>
+ </HeadingAttribute>
+ <RecurseChildren>
+ <w:r>
+ <w:t>false</w:t>
+ </w:r>
+ </RecurseChildren>
+ </Outline>
+ <Attribute>
+ <Name>
+ <w:r>
+ <w:t>*</w:t>
+ </w:r>
+ </Name>
+ </Attribute>
+ </w:p>
+ </ns0:Artifact>
+ <w:p/>
+ <w:sectPr>
+ <w:hdr w:type="odd">
+ <w:p>
+ <w:pPr>
+ <w:pStyle w:val="Header"/>
+ </w:pPr>
+ </w:p>
+ </w:hdr>
+ <w:pgSz w:code="1" w:h="15840" w:w="12240"/>
+ <w:pgMar w:bottom="1440" w:footer="432" w:gutter="0" w:header="432" w:left="1440" w:right="1440" w:top="1440"/>
+ <w:pgNumType w:start="1"/>
+ <w:cols w:space="475"/>
+ <w:noEndnote/>
+ </w:sectPr>
+ </wx:sect>
+ </w:body>
+</w:wordDocument>
diff --git a/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL_RECURSE.xml b/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL_RECURSE.xml
new file mode 100644
index 00000000000..cd3e863ea15
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/templates/PREVIEW_ALL_RECURSE.xml
@@ -0,0 +1,7686 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument w:embeddedObjPresent="no" w:macrosPresent="no" w:ocxPresent="no" xml:space="preserve" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ns0="http://www.w3.org/2001/XMLSchema" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint">
+ <w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/>
+ <o:DocumentProperties>
+ <o:Title>SRS</o:Title>
+ <o:Author>Ryan D. Brooks</o:Author>
+ <o:LastAuthor>b289820</o:LastAuthor>
+ <o:Revision>6</o:Revision>
+ <o:TotalTime>1</o:TotalTime>
+ <o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted>
+ <o:Created>2008-01-15T17:10:00Z</o:Created>
+ <o:LastSaved>2008-01-15T19:54:00Z</o:LastSaved>
+ <o:Pages>1</o:Pages>
+ <o:Words>4</o:Words>
+ <o:Characters>28</o:Characters>
+ <o:Company>The Boeing Company</o:Company>
+ <o:Lines>1</o:Lines>
+ <o:Paragraphs>1</o:Paragraphs>
+ <o:CharactersWithSpaces>31</o:CharactersWithSpaces>
+ <o:Version>11.8134</o:Version>
+ </o:DocumentProperties>
+ <w:fonts>
+ <w:defaultFonts w:ascii="Times New Roman" w:cs="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman"/>
+ <w:font w:name="Helvetica">
+ <w:panose-1 w:val="020B0604020202020204"/>
+ <w:charset w:val="00"/>
+ <w:family w:val="Swiss"/>
+ <w:pitch w:val="variable"/>
+ <w:sig w:csb-0="000001FF" w:csb-1="00000000" w:usb-0="20007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000"/>
+ </w:font>
+ <w:font w:name="Courier">
+ <w:panose-1 w:val="02070409020205020404"/>
+ <w:charset w:val="00"/>
+ <w:family w:val="Modern"/>
+ <w:notTrueType/>
+ <w:pitch w:val="fixed"/>
+ <w:sig w:csb-0="00000001" w:csb-1="00000000" w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000"/>
+ </w:font>
+ <w:font w:name="Wingdings">
+ <w:panose-1 w:val="05000000000000000000"/>
+ <w:charset w:val="02"/>
+ <w:family w:val="Auto"/>
+ <w:pitch w:val="variable"/>
+ <w:sig w:csb-0="80000000" w:csb-1="00000000" w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000"/>
+ </w:font>
+ <w:font w:name="Tahoma">
+ <w:panose-1 w:val="020B0604030504040204"/>
+ <w:charset w:val="00"/>
+ <w:family w:val="Swiss"/>
+ <w:pitch w:val="variable"/>
+ <w:sig w:csb-0="000101FF" w:csb-1="00000000" w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000"/>
+ </w:font>
+ </w:fonts>
+ <w:lists>
+ <w:listDef w:listDefId="0">
+ <w:lsid w:val="FFFFFF7C"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="D440384C"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="1">
+ <w:lsid w:val="FFFFFF7D"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="6820FC02"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="2">
+ <w:lsid w:val="FFFFFF7F"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="2B10698A"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="3">
+ <w:lsid w:val="FFFFFF80"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="F4645DBA"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="4">
+ <w:lsid w:val="FFFFFF81"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="B29CAA58"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="5">
+ <w:lsid w:val="FFFFFF82"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="6C206602"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="6">
+ <w:lsid w:val="FFFFFF83"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="3ED012C8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="7">
+ <w:lsid w:val="FFFFFF89"/>
+ <w:plt w:val="SingleLevel"/>
+ <w:tmpl w:val="EE3C3A12"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="8">
+ <w:lsid w:val="003A6350"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="F89E6E26"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:pStyle w:val="APPENDIX1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX2"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX4"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX5"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX6"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX7"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX8"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="APPENDIX9"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="9">
+ <w:lsid w:val="016D5431"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="98C65BCE"/>
+ <w:lvl w:ilvl="0" w:tplc="94D2C566">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="504" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="504"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="10">
+ <w:lsid w:val="0C4D206D"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="4B543E40"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="11">
+ <w:lsid w:val="0DE40F2C"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="12">
+ <w:lsid w:val="10AF29E5"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="7520DAAE"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="13">
+ <w:lsid w:val="15EB1725"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="D902A83E"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="14">
+ <w:lsid w:val="1C970BBA"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5EB82E3A"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="15">
+ <w:lsid w:val="1D6C5FCC"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="E710F038"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="APPENDIX %1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="0"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="16">
+ <w:lsid w:val="1EC51BCC"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="17">
+ <w:lsid w:val="256F5D56"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="EAC4E6B8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="18">
+ <w:lsid w:val="290A1130"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="EAC4E6B8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="19">
+ <w:lsid w:val="299E4F07"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="46E2B8B2"/>
+ <w:lvl w:ilvl="0" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1512" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="1512"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="20">
+ <w:lsid w:val="29C240FD"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="FCA4DC08"/>
+ <w:lvl w:ilvl="0" w:tplc="B5146A3E">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:pStyle w:val="bulletlvl2"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1224" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1224"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tplc="04090019">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="0409001B">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="0409000F">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090019">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="0409001B">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="0409000F">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090019">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="0409001B">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="21">
+ <w:lsid w:val="29CA5728"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="D00252C6"/>
+ <w:lvl w:ilvl="0" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%1"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%4."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%5."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%6."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="4320"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5040"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5760"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="FFFFFFFF">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="right"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="180" w:left="6480"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="22">
+ <w:lsid w:val="2A5411A0"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="9A620CE6"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading2"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading4"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading5"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading6"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading7"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading8"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="Heading9"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="23">
+ <w:lsid w:val="2B1C06F5"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="3B98963A"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="24">
+ <w:lsid w:val="2B477730"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="33801DC4"/>
+ <w:lvl w:ilvl="0" w:tplc="2D8A4B4C">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:pStyle w:val="bulletlvl3"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3024" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="2016" w:left="3024"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2448" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2448"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:cs="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3168" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3168"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3888" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3888"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4608" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="4608"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:cs="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5328" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5328"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6048" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6048"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6768" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6768"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:cs="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="7488" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="7488"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="25">
+ <w:lsid w:val="2B5B6B3C"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5CC8E874"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:first-line="763" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="26">
+ <w:lsid w:val="2D6545A6"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="3F227848"/>
+ <w:name w:val="listreset"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl1"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1296" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1296"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ <w:b w:val="off"/>
+ <w:i w:val="off"/>
+ <w:caps w:val="off"/>
+ <w:strike w:val="off"/>
+ <w:dstrike w:val="off"/>
+ <w:outline w:val="off"/>
+ <w:shadow w:val="off"/>
+ <w:emboss w:val="off"/>
+ <w:imprint w:val="off"/>
+ <w:vanish w:val="off"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:vertAlign w:val="baseline"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl2"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="-31680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1656"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl3"/>
+ <w:lvlText w:val="(%3)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2016" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2016"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl4"/>
+ <w:lvlText w:val="(%4)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2376" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2376"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl5"/>
+ <w:lvlText w:val="%5)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2736" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl6"/>
+ <w:lvlText w:val="%6)."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3096" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3096"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/>
+ <w:b w:val="off"/>
+ <w:i w:val="off"/>
+ <w:sz w:val="22"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:pStyle w:val="listlvl7"/>
+ <w:lvlText w:val="[%7]."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3456" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3456"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="[%8]."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="27">
+ <w:lsid w:val="2E180A61"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="28">
+ <w:lsid w:val="308239DA"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="29">
+ <w:lsid w:val="31A252E6"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="A9D83578"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="30">
+ <w:lsid w:val="3B97448F"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:name w:val="listrestart2"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="31">
+ <w:lsid w:val="3C165F4A"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="79A06FE6"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="32">
+ <w:lsid w:val="42BB3748"/>
+ <w:plt w:val="HybridMultilevel"/>
+ <w:tmpl w:val="DBE464B0"/>
+ <w:lvl w:ilvl="0" w:tplc="26BAF6B0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:pStyle w:val="bulletlvl1"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="648" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="648"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3960"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="4680"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6" w:tentative="on" w:tplc="04090001">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="5400"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7" w:tentative="on" w:tplc="04090003">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="o"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6120"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8" w:tentative="on" w:tplc="04090005">
+ <w:start w:val="1"/>
+ <w:nfc w:val="23"/>
+ <w:lvlText w:val="ï‚·"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6840" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="6840"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="33">
+ <w:lsid w:val="5A401749"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="CD8E61CE"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="34">
+ <w:lsid w:val="5A802BC9"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="CB0E7A2E"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="35">
+ <w:lsid w:val="5C3B1B76"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="CB0E7A2E"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="36">
+ <w:lsid w:val="5E371EBB"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="DA56D440"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="37">
+ <w:lsid w:val="60B71688"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5EA20814"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman" w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="38">
+ <w:lsid w:val="6389497B"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="AC5A6410"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:pStyle w:val="listlvl10"/>
+ <w:lvlText w:val="%1."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:lvlText w:val="%2."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%3."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3600" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3960"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5040" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4680"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5760" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5400"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6480" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="6120"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="39">
+ <w:lsid w:val="6469691A"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="E5D02024"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="3082" w:left="3082"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="40">
+ <w:lsid w:val="72C94998"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="41">
+ <w:lsid w:val="74BA49AE"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:name w:val="listrestart"/>
+ <w:styleLink w:val="listreset"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="42">
+ <w:lsid w:val="751E50EA"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="79E6FEDC"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2405" w:left="2405"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2736" w:left="2736"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="43">
+ <w:lsid w:val="7D9D3B47"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="0409001D"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%1)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="360"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%2)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="720"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%3)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1080"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1440"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="1800"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2160"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="%7."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2520"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%8."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2880" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="2880"/>
+ </w:pPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="%9."/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="360" w:left="3240"/>
+ </w:pPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="44">
+ <w:lsid w:val="7F0F313D"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="F8FC63EE"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="%4)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="2520" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:lvlText w:val="(%5)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3240" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%6)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="3960" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="3600"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:listDef w:listDefId="45">
+ <w:lsid w:val="7F633FB7"/>
+ <w:plt w:val="Multilevel"/>
+ <w:tmpl w:val="5F5A52E8"/>
+ <w:lvl w:ilvl="0">
+ <w:start w:val="1"/>
+ <w:nfc w:val="3"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="APPENDIX %1. "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="461" w:left="461"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="1">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="734" w:left="734"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="2">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1066" w:left="1066"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="3">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1397" w:left="1397"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="4">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="1742" w:left="1742"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="5">
+ <w:start w:val="1"/>
+ <w:suff w:val="Nothing"/>
+ <w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:ind w:hanging="2074" w:left="2074"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="6">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%7)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="4680" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="4320"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="7">
+ <w:start w:val="1"/>
+ <w:nfc w:val="4"/>
+ <w:lvlText w:val="(%8)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="5400" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5040"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ <w:lvl w:ilvl="8">
+ <w:start w:val="1"/>
+ <w:nfc w:val="2"/>
+ <w:lvlText w:val="(%9)"/>
+ <w:lvlJc w:val="left"/>
+ <w:pPr>
+ <w:tabs>
+ <w:tab w:pos="6120" w:val="list"/>
+ </w:tabs>
+ <w:ind w:first-line="0" w:left="5760"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:hint="default"/>
+ </w:rPr>
+ </w:lvl>
+ </w:listDef>
+ <w:list w:ilfo="1">
+ <w:ilst w:val="32"/>
+ </w:list>
+ <w:list w:ilfo="2">
+ <w:ilst w:val="20"/>
+ </w:list>
+ <w:list w:ilfo="3">
+ <w:ilst w:val="26"/>
+ </w:list>
+ <w:list w:ilfo="4">
+ <w:ilst w:val="22"/>
+ </w:list>
+ <w:list w:ilfo="5">
+ <w:ilst w:val="14"/>
+ </w:list>
+ <w:list w:ilfo="6">
+ <w:ilst w:val="34"/>
+ </w:list>
+ <w:list w:ilfo="7">
+ <w:ilst w:val="13"/>
+ </w:list>
+ <w:list w:ilfo="8">
+ <w:ilst w:val="21"/>
+ </w:list>
+ <w:list w:ilfo="9">
+ <w:ilst w:val="38"/>
+ </w:list>
+ <w:list w:ilfo="10">
+ <w:ilst w:val="15"/>
+ </w:list>
+ <w:list w:ilfo="11">
+ <w:ilst w:val="26"/>
+ </w:list>
+ <w:list w:ilfo="12">
+ <w:ilst w:val="35"/>
+ </w:list>
+ <w:list w:ilfo="13">
+ <w:ilst w:val="44"/>
+ </w:list>
+ <w:list w:ilfo="14">
+ <w:ilst w:val="10"/>
+ </w:list>
+ <w:list w:ilfo="15">
+ <w:ilst w:val="36"/>
+ </w:list>
+ <w:list w:ilfo="16">
+ <w:ilst w:val="25"/>
+ </w:list>
+ <w:list w:ilfo="17">
+ <w:ilst w:val="39"/>
+ </w:list>
+ <w:list w:ilfo="18">
+ <w:ilst w:val="12"/>
+ </w:list>
+ <w:list w:ilfo="19">
+ <w:ilst w:val="29"/>
+ </w:list>
+ <w:list w:ilfo="20">
+ <w:ilst w:val="23"/>
+ </w:list>
+ <w:list w:ilfo="21">
+ <w:ilst w:val="45"/>
+ </w:list>
+ <w:list w:ilfo="22">
+ <w:ilst w:val="31"/>
+ </w:list>
+ <w:list w:ilfo="23">
+ <w:ilst w:val="33"/>
+ </w:list>
+ <w:list w:ilfo="24">
+ <w:ilst w:val="42"/>
+ </w:list>
+ <w:list w:ilfo="25">
+ <w:ilst w:val="8"/>
+ </w:list>
+ <w:list w:ilfo="26">
+ <w:ilst w:val="41"/>
+ </w:list>
+ <w:list w:ilfo="27">
+ <w:ilst w:val="30"/>
+ </w:list>
+ <w:list w:ilfo="28">
+ <w:ilst w:val="24"/>
+ </w:list>
+ <w:list w:ilfo="29">
+ <w:ilst w:val="28"/>
+ </w:list>
+ <w:list w:ilfo="30">
+ <w:ilst w:val="26"/>
+ <w:lvlOverride w:ilvl="0">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="1">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="2">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="3">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="4">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="5">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="6">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="7">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ <w:lvlOverride w:ilvl="8">
+ <w:startOverride w:val="1"/>
+ </w:lvlOverride>
+ </w:list>
+ <w:list w:ilfo="31">
+ <w:ilst w:val="19"/>
+ </w:list>
+ <w:list w:ilfo="32">
+ <w:ilst w:val="9"/>
+ </w:list>
+ <w:list w:ilfo="33">
+ <w:ilst w:val="43"/>
+ </w:list>
+ <w:list w:ilfo="34">
+ <w:ilst w:val="16"/>
+ </w:list>
+ <w:list w:ilfo="35">
+ <w:ilst w:val="37"/>
+ </w:list>
+ <w:list w:ilfo="36">
+ <w:ilst w:val="22"/>
+ </w:list>
+ <w:list w:ilfo="37">
+ <w:ilst w:val="18"/>
+ </w:list>
+ <w:list w:ilfo="38">
+ <w:ilst w:val="17"/>
+ </w:list>
+ <w:list w:ilfo="39">
+ <w:ilst w:val="11"/>
+ </w:list>
+ <w:list w:ilfo="40">
+ <w:ilst w:val="7"/>
+ </w:list>
+ <w:list w:ilfo="41">
+ <w:ilst w:val="6"/>
+ </w:list>
+ <w:list w:ilfo="42">
+ <w:ilst w:val="5"/>
+ </w:list>
+ <w:list w:ilfo="43">
+ <w:ilst w:val="4"/>
+ </w:list>
+ <w:list w:ilfo="44">
+ <w:ilst w:val="3"/>
+ </w:list>
+ <w:list w:ilfo="45">
+ <w:ilst w:val="2"/>
+ </w:list>
+ <w:list w:ilfo="46">
+ <w:ilst w:val="1"/>
+ </w:list>
+ <w:list w:ilfo="47">
+ <w:ilst w:val="0"/>
+ </w:list>
+ <w:list w:ilfo="48">
+ <w:ilst w:val="40"/>
+ </w:list>
+ <w:list w:ilfo="49">
+ <w:ilst w:val="27"/>
+ </w:list>
+ <w:ilfoMacAtCleanup w:val="5"/>
+ </w:lists>
+ <w:styles>
+ <w:versionOfBuiltInStylenames w:val="4"/>
+ <w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/>
+ <w:style w:default="on" w:styleId="Normal" w:type="paragraph">
+ <w:name w:val="Normal"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:pPr>
+ <w:spacing w:after="40" w:before="40" w:line="240" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading1" w:type="paragraph">
+ <w:name w:val="heading 1"/>
+ <wx:uiName wx:val="Heading 1"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading1"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:pageBreakBefore/>
+ <w:listPr>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="0"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:kern w:val="28"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading2" w:type="paragraph">
+ <w:name w:val="heading 2"/>
+ <wx:uiName wx:val="Heading 2"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading2"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="1"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="320"/>
+ <w:outlineLvl w:val="1"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading3" w:type="paragraph">
+ <w:name w:val="heading 3"/>
+ <wx:uiName wx:val="Heading 3"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading3"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="2"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="900" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80" w:before="320"/>
+ <w:outlineLvl w:val="2"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading4" w:type="paragraph">
+ <w:name w:val="heading 4"/>
+ <wx:uiName wx:val="Heading 4"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading4"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="3"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="3"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading5" w:type="paragraph">
+ <w:name w:val="heading 5"/>
+ <wx:uiName wx:val="Heading 5"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading5"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="4"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="4"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading6" w:type="paragraph">
+ <w:name w:val="heading 6"/>
+ <wx:uiName wx:val="Heading 6"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading6"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="5"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="5"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading7" w:type="paragraph">
+ <w:name w:val="heading 7"/>
+ <wx:uiName wx:val="Heading 7"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading7"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="6"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1620" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="6"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading8" w:type="paragraph">
+ <w:name w:val="heading 8"/>
+ <wx:uiName wx:val="Heading 8"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading8"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="7"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="7"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:b-cs/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Heading9" w:type="paragraph">
+ <w:name w:val="heading 9"/>
+ <wx:uiName wx:val="Heading 9"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="001B1D77"/>
+ <w:pPr>
+ <w:pStyle w:val="Heading9"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:listPr>
+ <w:ilvl w:val="8"/>
+ <w:ilfo w:val="36"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="360"/>
+ <w:outlineLvl w:val="8"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:default="on" w:styleId="DefaultParagraphFont" w:type="character">
+ <w:name w:val="Default Paragraph Font"/>
+ <w:semiHidden/>
+ </w:style>
+ <w:style w:default="on" w:styleId="TableNormal" w:type="table">
+ <w:name w:val="Normal Table"/>
+ <wx:uiName wx:val="Table Normal"/>
+ <w:semiHidden/>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman"/>
+ </w:rPr>
+ <w:tblPr>
+ <w:tblInd w:type="dxa" w:w="0"/>
+ <w:tblCellMar>
+ <w:top w:type="dxa" w:w="0"/>
+ <w:left w:type="dxa" w:w="108"/>
+ <w:bottom w:type="dxa" w:w="0"/>
+ <w:right w:type="dxa" w:w="108"/>
+ </w:tblCellMar>
+ </w:tblPr>
+ </w:style>
+ <w:style w:default="on" w:styleId="NoList" w:type="list">
+ <w:name w:val="No List"/>
+ <w:semiHidden/>
+ </w:style>
+ <w:style w:styleId="paranormal" w:type="paragraph">
+ <w:name w:val="para:normal"/>
+ <w:link w:val="paranormalChar"/>
+ <w:rsid w:val="009E6B3D"/>
+ <w:pPr>
+ <w:pStyle w:val="paranormal"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="64" w:line="240" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b-cs/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl3" w:type="paragraph">
+ <w:name w:val="list:lvl 3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl3"/>
+ <w:listPr>
+ <w:ilvl w:val="2"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="2088" w:val="left"/>
+ </w:tabs>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang1" w:type="paragraph">
+ <w:name w:val="req lang:1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang1"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Header" w:type="paragraph">
+ <w:name w:val="header"/>
+ <wx:uiName wx:val="Header"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A134C3"/>
+ <w:pPr>
+ <w:pStyle w:val="Header"/>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="center"/>
+ <w:tab w:pos="8640" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="0" w:before="20" w:line="180" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="proprietarycontd" w:type="paragraph">
+ <w:name w:val="proprietary:cont'd"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="proprietarycontd"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="60" w:before="60" w:line="200" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="16"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paracentered" w:type="paragraph">
+ <w:name w:val="para:centered"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00B43482"/>
+ <w:pPr>
+ <w:pStyle w:val="paracentered"/>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="80" w:line="240" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Helvetica" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent2" w:type="paragraph">
+ <w:name w:val="para:indent2"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="004417BE"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent2"/>
+ <w:tabs>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ <w:tab w:pos="5040" w:val="left"/>
+ <w:tab w:pos="5760" w:val="left"/>
+ <w:tab w:pos="6480" w:val="left"/>
+ <w:tab w:pos="7200" w:val="left"/>
+ <w:tab w:pos="7920" w:val="left"/>
+ <w:tab w:pos="8640" w:val="left"/>
+ <w:tab w:pos="9360" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="40" w:line="240" w:line-rule="at-least"/>
+ <w:ind w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent3" w:type="paragraph">
+ <w:name w:val="para:indent3"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="0071606D"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent3"/>
+ <w:tabs>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4680" w:val="left"/>
+ <w:tab w:pos="5400" w:val="left"/>
+ <w:tab w:pos="6120" w:val="left"/>
+ <w:tab w:pos="6840" w:val="left"/>
+ <w:tab w:pos="7560" w:val="left"/>
+ <w:tab w:pos="8280" w:val="left"/>
+ <w:tab w:pos="9000" w:val="left"/>
+ <w:tab w:pos="9720" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="40" w:line="240" w:line-rule="at-least"/>
+ <w:ind w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Caption" w:type="paragraph">
+ <w:name w:val="caption"/>
+ <wx:uiName wx:val="Caption"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:semiHidden/>
+ <w:rsid w:val="0085234B"/>
+ <w:pPr>
+ <w:pStyle w:val="Caption"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ <w:tab w:pos="5400" w:val="left"/>
+ <w:tab w:pos="6480" w:val="left"/>
+ <w:tab w:pos="7560" w:val="left"/>
+ <w:tab w:pos="8640" w:val="left"/>
+ <w:tab w:pos="9720" w:val="left"/>
+ <w:tab w:pos="10800" w:val="left"/>
+ <w:tab w:pos="11880" w:val="left"/>
+ <w:tab w:pos="12960" w:val="left"/>
+ <w:tab w:pos="14040" w:val="left"/>
+ <w:tab w:pos="15120" w:val="left"/>
+ <w:tab w:pos="16200" w:val="left"/>
+ <w:tab w:pos="17280" w:val="left"/>
+ <w:tab w:pos="18360" w:val="left"/>
+ <w:tab w:pos="19440" w:val="left"/>
+ <w:tab w:pos="20520" w:val="left"/>
+ <w:tab w:pos="21600" w:val="left"/>
+ <w:tab w:pos="22680" w:val="left"/>
+ <w:tab w:pos="23760" w:val="left"/>
+ <w:tab w:pos="24840" w:val="left"/>
+ <w:tab w:pos="25920" w:val="left"/>
+ <w:tab w:pos="27000" w:val="left"/>
+ <w:tab w:pos="28080" w:val="left"/>
+ <w:tab w:pos="29160" w:val="left"/>
+ <w:tab w:pos="30240" w:val="left"/>
+ <w:tab w:pos="31320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="120" w:before="120"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent1" w:type="paragraph">
+ <w:name w:val="para:indent1"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="007D424E"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent1"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4680" w:val="left"/>
+ <w:tab w:pos="5400" w:val="left"/>
+ <w:tab w:pos="6120" w:val="left"/>
+ <w:tab w:pos="6840" w:val="left"/>
+ <w:tab w:pos="7560" w:val="left"/>
+ <w:tab w:pos="8280" w:val="left"/>
+ <w:tab w:pos="9000" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="40" w:line="240" w:line-rule="at-least"/>
+ <w:ind w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Footer" w:type="paragraph">
+ <w:name w:val="footer"/>
+ <wx:uiName wx:val="Footer"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="Footer"/>
+ <w:tabs>
+ <w:tab w:pos="4320" w:val="center"/>
+ <w:tab w:pos="8640" w:val="right"/>
+ </w:tabs>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl4" w:type="paragraph">
+ <w:name w:val="list:lvl 4"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl4"/>
+ <w:listPr>
+ <w:ilvl w:val="3"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHead" w:type="paragraph">
+ <w:name w:val="RowHead"/>
+ <w:basedOn w:val="Heading1"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHead"/>
+ <w:listPr>
+ <w:ilfo w:val="0"/>
+ </w:listPr>
+ <w:spacing w:after="100" w:before="100"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText11" w:type="paragraph">
+ <w:name w:val="TableText11"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText11"/>
+ <w:spacing w:line="220" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOAHeading" w:type="paragraph">
+ <w:name w:val="toa heading"/>
+ <wx:uiName wx:val="TOA Heading"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOAHeading"/>
+ <w:spacing w:after="120" w:before="240"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:b-cs/>
+ <w:caps/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHeadL" w:type="paragraph">
+ <w:name w:val="RowHeadL"/>
+ <w:basedOn w:val="RowHead"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHeadL"/>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:jc w:val="left"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b w:val="off"/>
+ <w:b-cs/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText11B" w:type="paragraph">
+ <w:name w:val="TableText11B"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00913874"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText11B"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableofAuthorities" w:type="paragraph">
+ <w:name w:val="table of authorities"/>
+ <wx:uiName wx:val="Table of Authorities"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableofAuthorities"/>
+ <w:tabs>
+ <w:tab w:leader="dot" w:pos="8640" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="80" w:before="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableofFigures" w:type="paragraph">
+ <w:name w:val="table of figures"/>
+ <wx:uiName wx:val="Table of Figures"/>
+ <w:next w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableofFigures"/>
+ <w:tabs>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="Hyperlink" w:type="character">
+ <w:name w:val="Hyperlink"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:rsid w:val="00721F21"/>
+ <w:rPr>
+ <w:color w:val="0000FF"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="PageNumber" w:type="character">
+ <w:name w:val="page number"/>
+ <wx:uiName wx:val="Page Number"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:rsid w:val="00D90577"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:dstrike w:val="off"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ <w:vertAlign w:val="baseline"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHead11" w:type="paragraph">
+ <w:name w:val="RowHead11"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHead11"/>
+ <w:listPr>
+ <w:ilvl w:val="12"/>
+ </w:listPr>
+ <w:spacing w:after="80" w:before="80"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText11C" w:type="paragraph">
+ <w:name w:val="TableText11C"/>
+ <w:basedOn w:val="TableText11"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText11C"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Times New Roman"/>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl1" w:type="paragraph">
+ <w:name w:val="list:lvl 1"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl1"/>
+ <w:listPr>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="936" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ <w:tab w:pos="5040" w:val="left"/>
+ <w:tab w:pos="5760" w:val="left"/>
+ <w:tab w:pos="6480" w:val="left"/>
+ <w:tab w:pos="7200" w:val="left"/>
+ <w:tab w:pos="7920" w:val="left"/>
+ <w:tab w:pos="8640" w:val="left"/>
+ <w:tab w:pos="9360" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="60" w:before="60" w:line="240" w:line-rule="at-least"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Helvetica" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl5" w:type="paragraph">
+ <w:name w:val="list:lvl 5"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl5"/>
+ <w:listPr>
+ <w:ilvl w:val="4"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="clear"/>
+ <w:tab w:pos="720" w:val="clear"/>
+ <w:tab w:pos="1080" w:val="clear"/>
+ <w:tab w:pos="1440" w:val="clear"/>
+ <w:tab w:pos="1800" w:val="clear"/>
+ <w:tab w:pos="2160" w:val="clear"/>
+ <w:tab w:pos="2520" w:val="clear"/>
+ <w:tab w:pos="2880" w:val="clear"/>
+ <w:tab w:pos="3240" w:val="clear"/>
+ <w:tab w:pos="3600" w:val="clear"/>
+ <w:tab w:pos="3384" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="40"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl2" w:type="paragraph">
+ <w:name w:val="list:lvl 2"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl2"/>
+ <w:widowControl w:val="off"/>
+ <w:listPr>
+ <w:ilvl w:val="1"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60" w:line="240" w:line-rule="at-least"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="AppendixTitle" w:type="paragraph">
+ <w:name w:val="Appendix Title"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="AppendixTitle"/>
+ <w:pageBreakBefore/>
+ <w:spacing w:after="240" w:before="120"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RowHead10" w:type="paragraph">
+ <w:name w:val="RowHead10"/>
+ <w:basedOn w:val="RowHead11"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="RowHead10"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC1" w:type="paragraph">
+ <w:name w:val="toc 1"/>
+ <wx:uiName wx:val="TOC 1"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00003D10"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC1"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="540" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:before="240"/>
+ <w:ind w:hanging="547" w:left="547"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:caps/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC2" w:type="paragraph">
+ <w:name w:val="toc 2"/>
+ <wx:uiName wx:val="TOC 2"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00003D10"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC2"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="900" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9360" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:before="120"/>
+ <w:ind w:hanging="720" w:left="907"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC3" w:type="paragraph">
+ <w:name w:val="toc 3"/>
+ <wx:uiName wx:val="TOC 3"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC3"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="1260" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="900" w:left="1260"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC4" w:type="paragraph">
+ <w:name w:val="toc 4"/>
+ <wx:uiName wx:val="TOC 4"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC4"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="1620" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1080" w:left="1620"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC5" w:type="paragraph">
+ <w:name w:val="toc 5"/>
+ <wx:uiName wx:val="TOC 5"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC5"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="1980" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1260" w:left="1980"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC6" w:type="paragraph">
+ <w:name w:val="toc 6"/>
+ <wx:uiName wx:val="TOC 6"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC6"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="2340" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1440" w:left="2340"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:noProof/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC7" w:type="paragraph">
+ <w:name w:val="toc 7"/>
+ <wx:uiName wx:val="TOC 7"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC7"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="2700" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="0" w:before="0" w:line="240" w:line-rule="auto"/>
+ <w:ind w:hanging="1620" w:left="2700"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC8" w:type="paragraph">
+ <w:name w:val="toc 8"/>
+ <wx:uiName wx:val="TOC 8"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC8"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="2970" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1710" w:left="2970"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOC9" w:type="paragraph">
+ <w:name w:val="toc 9"/>
+ <wx:uiName wx:val="TOC 9"/>
+ <w:next w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TOC9"/>
+ <w:keepLines/>
+ <w:tabs>
+ <w:tab w:pos="3330" w:val="left"/>
+ <w:tab w:leader="dot" w:pos="9350" w:val="right"/>
+ </w:tabs>
+ <w:ind w:hanging="1890" w:left="3330"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="HeadingUnnumbered" w:type="paragraph">
+ <w:name w:val="Heading Unnumbered"/>
+ <w:next w:val="paranormal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00107AA6"/>
+ <w:pPr>
+ <w:pStyle w:val="HeadingUnnumbered"/>
+ <w:keepNext/>
+ <w:keepLines/>
+ <w:spacing w:after="80" w:before="240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:cs="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10" w:type="paragraph">
+ <w:name w:val="TableText10"/>
+ <w:basedOn w:val="TableText11"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableTextBCentered" w:type="paragraph">
+ <w:name w:val="TableTextB Centered"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00913874"/>
+ <w:pPr>
+ <w:pStyle w:val="TableTextBCentered"/>
+ <w:spacing w:line="220" w:line-rule="at-least"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10C" w:type="paragraph">
+ <w:name w:val="TableText10C"/>
+ <w:basedOn w:val="TableText11C"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10C"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10B" w:type="paragraph">
+ <w:name w:val="TableText10B"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00913874"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10B"/>
+ <w:spacing w:line="220" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="acronym" w:type="paragraph">
+ <w:name w:val="acronym"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="acronym"/>
+ <w:tabs>
+ <w:tab w:pos="2160" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="40" w:before="40"/>
+ <w:ind w:hanging="2160" w:left="2160"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl6" w:type="paragraph">
+ <w:name w:val="list:lvl 6"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl6"/>
+ <w:listPr>
+ <w:ilvl w:val="5"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="clear"/>
+ <w:tab w:pos="720" w:val="clear"/>
+ <w:tab w:pos="1080" w:val="clear"/>
+ <w:tab w:pos="1440" w:val="clear"/>
+ <w:tab w:pos="1800" w:val="clear"/>
+ <w:tab w:pos="2160" w:val="clear"/>
+ <w:tab w:pos="2520" w:val="clear"/>
+ <w:tab w:pos="2880" w:val="clear"/>
+ <w:tab w:pos="3240" w:val="clear"/>
+ <w:tab w:pos="3600" w:val="clear"/>
+ <w:tab w:pos="3960" w:val="clear"/>
+ <w:tab w:pos="4320" w:val="clear"/>
+ </w:tabs>
+ <w:spacing w:after="40"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="hdr1L" w:type="paragraph">
+ <w:name w:val="hdr1L"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="hdr1L"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="4680" w:val="center"/>
+ <w:tab w:pos="9360" w:val="right"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="hdr2L" w:type="paragraph">
+ <w:name w:val="hdr2L"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00721F21"/>
+ <w:pPr>
+ <w:pStyle w:val="hdr2L"/>
+ <w:tabs>
+ <w:tab w:pos="0" w:val="left"/>
+ <w:tab w:pos="4680" w:val="center"/>
+ <w:tab w:pos="9360" w:val="right"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:before="0" w:line="180" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl1" w:type="paragraph">
+ <w:name w:val="bullet:lvl 1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="bulletlvl1CharChar"/>
+ <w:rsid w:val="00143D5A"/>
+ <w:pPr>
+ <w:pStyle w:val="bulletlvl1"/>
+ <w:listPr>
+ <w:ilfo w:val="1"/>
+ </w:listPr>
+ <w:spacing w:after="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl2" w:type="paragraph">
+ <w:name w:val="bullet:lvl 2"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00143D5A"/>
+ <w:pPr>
+ <w:pStyle w:val="bulletlvl2"/>
+ <w:widowControl w:val="off"/>
+ <w:listPr>
+ <w:ilfo w:val="2"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1224" w:val="clear"/>
+ <w:tab w:pos="648" w:val="left"/>
+ <w:tab w:pos="1008" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80"/>
+ <w:ind w:hanging="1080" w:left="1728"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraindent4" w:type="paragraph">
+ <w:name w:val="para:indent4"/>
+ <w:basedOn w:val="paraindent3"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="0071606D"/>
+ <w:pPr>
+ <w:pStyle w:val="paraindent4"/>
+ <w:ind w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl7" w:type="paragraph">
+ <w:name w:val="list:lvl 7"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl7"/>
+ <w:listPr>
+ <w:ilvl w:val="6"/>
+ <w:ilfo w:val="11"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="clear"/>
+ <w:tab w:pos="720" w:val="clear"/>
+ <w:tab w:pos="1080" w:val="clear"/>
+ <w:tab w:pos="1440" w:val="clear"/>
+ <w:tab w:pos="1800" w:val="clear"/>
+ <w:tab w:pos="2160" w:val="clear"/>
+ <w:tab w:pos="2520" w:val="clear"/>
+ <w:tab w:pos="2880" w:val="clear"/>
+ <w:tab w:pos="3240" w:val="clear"/>
+ <w:tab w:pos="3600" w:val="clear"/>
+ <w:tab w:pos="3960" w:val="clear"/>
+ <w:tab w:pos="3024" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="40"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOCfiguretitle" w:type="paragraph">
+ <w:name w:val="TOC:figure title"/>
+ <w:basedOn w:val="Caption"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00894991"/>
+ <w:pPr>
+ <w:pStyle w:val="TOCfiguretitle"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="note" w:type="paragraph">
+ <w:name w:val="note"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="006E0AB6"/>
+ <w:pPr>
+ <w:pStyle w:val="note"/>
+ <w:spacing w:after="80" w:before="80"/>
+ <w:ind w:hanging="936" w:left="1656" w:right="720"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang2" w:type="paragraph">
+ <w:name w:val="req lang:2"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang2"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang3" w:type="paragraph">
+ <w:name w:val="req lang:3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang3"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="1080"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang4" w:type="paragraph">
+ <w:name w:val="req lang:4"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang4"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="1440"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang5" w:type="paragraph">
+ <w:name w:val="req lang:5"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang5"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang6" w:type="paragraph">
+ <w:name w:val="req lang:6"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00F25A7A"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang6"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="statedef" w:type="paragraph">
+ <w:name w:val="state def"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00DE6BA0"/>
+ <w:pPr>
+ <w:pStyle w:val="statedef"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="0" w:before="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:caps/>
+ <w:color w:val="408040"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="intentblank" w:type="paragraph">
+ <w:name w:val="intent:blank"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="000B79E8"/>
+ <w:pPr>
+ <w:pStyle w:val="intentblank"/>
+ <w:spacing w:after="0" w:before="6480"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="code" w:type="paragraph">
+ <w:name w:val="code"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="006D4514"/>
+ <w:pPr>
+ <w:pStyle w:val="code"/>
+ <w:spacing w:after="80" w:before="80" w:line="220" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="18"/>
+ <w:sz-cs w:val="18"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="parapage" w:type="paragraph">
+ <w:name w:val="para:page"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00DD22A9"/>
+ <w:pPr>
+ <w:pStyle w:val="parapage"/>
+ <w:pageBreakBefore/>
+ <w:spacing w:after="80" w:before="80"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TOCtabletitle" w:type="paragraph">
+ <w:name w:val="TOC:table title"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="00B869CD"/>
+ <w:pPr>
+ <w:pStyle w:val="TOCtabletitle"/>
+ <w:spacing w:after="120" w:before="120"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RCRitem" w:type="paragraph">
+ <w:name w:val="RCR:item"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="007A1F4F"/>
+ <w:pPr>
+ <w:pStyle w:val="RCRitem"/>
+ <w:tabs>
+ <w:tab w:pos="1800" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:before="120"/>
+ <w:ind w:hanging="1800" w:left="1800" w:right="720"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="RCRheader" w:type="paragraph">
+ <w:name w:val="RCR:header"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="006D781E"/>
+ <w:pPr>
+ <w:pStyle w:val="RCRheader"/>
+ <w:tabs>
+ <w:tab w:pos="792" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:leader="underscore" w:pos="8640" w:val="right"/>
+ </w:tabs>
+ <w:spacing w:after="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:sz-cs w:val="22"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="line" w:type="paragraph">
+ <w:name w:val="line"/>
+ <w:basedOn w:val="Normal"/>
+ <w:autoRedefine/>
+ <w:rsid w:val="006B63C2"/>
+ <w:pPr>
+ <w:pStyle w:val="line"/>
+ <w:spacing w:before="0" w:line="40" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="12"/>
+ <w:sz-cs w:val="12"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang7" w:type="paragraph">
+ <w:name w:val="req lang: 7"/>
+ <w:basedOn w:val="reqlang6"/>
+ <w:rsid w:val="00C0337E"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang7"/>
+ <w:ind w:left="2520"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier New"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang70" w:type="paragraph">
+ <w:name w:val="req lang:7"/>
+ <w:basedOn w:val="reqlang7"/>
+ <w:rsid w:val="004C603C"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang70"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier New"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang8" w:type="paragraph">
+ <w:name w:val="req lang:8"/>
+ <w:basedOn w:val="reqlang7"/>
+ <w:rsid w:val="004C603C"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang8"/>
+ <w:ind w:left="2880"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier New"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="reqlang9" w:type="paragraph">
+ <w:name w:val="req lang:9"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="007534C9"/>
+ <w:pPr>
+ <w:pStyle w:val="reqlang9"/>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="3240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/>
+ <wx:font wx:val="Courier New"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="DocumentMap" w:type="paragraph">
+ <w:name w:val="Document Map"/>
+ <w:basedOn w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00AF20CB"/>
+ <w:pPr>
+ <w:pStyle w:val="DocumentMap"/>
+ <w:shd w:color="auto" w:fill="000080" w:val="clear"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Tahoma" w:cs="Tahoma" w:h-ansi="Tahoma"/>
+ <wx:font wx:val="Tahoma"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment1" w:type="paragraph">
+ <w:name w:val="comment:1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment1"/>
+ <w:spacing w:after="60" w:before="60"/>
+ <w:ind w:left="360"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment2" w:type="paragraph">
+ <w:name w:val="comment:2"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment2"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="720"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:cs="Arial"/>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment3" w:type="paragraph">
+ <w:name w:val="comment:3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment3"/>
+ <w:tabs>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="720" w:val="left"/>
+ <w:tab w:pos="1080" w:val="left"/>
+ <w:tab w:pos="1440" w:val="left"/>
+ <w:tab w:pos="1800" w:val="left"/>
+ <w:tab w:pos="2160" w:val="left"/>
+ <w:tab w:pos="2520" w:val="left"/>
+ <w:tab w:pos="2880" w:val="left"/>
+ <w:tab w:pos="3240" w:val="left"/>
+ <w:tab w:pos="3600" w:val="left"/>
+ <w:tab w:pos="3960" w:val="left"/>
+ <w:tab w:pos="4320" w:val="left"/>
+ </w:tabs>
+ <w:autoSpaceDE w:val="off"/>
+ <w:autoSpaceDN w:val="off"/>
+ <w:adjustRightInd w:val="off"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="1080"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ <w:sz-cs w:val="22"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment4" w:type="paragraph">
+ <w:name w:val="comment:4"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment4"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="1440"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment5" w:type="paragraph">
+ <w:name w:val="comment:5"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment5"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="1800"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment6" w:type="paragraph">
+ <w:name w:val="comment:6"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment6"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="2160"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment7" w:type="paragraph">
+ <w:name w:val="comment:7"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment7"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="2520"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment8" w:type="paragraph">
+ <w:name w:val="comment:8"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment8"/>
+ <w:spacing w:after="80" w:before="60"/>
+ <w:ind w:left="2880"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="comment9" w:type="paragraph">
+ <w:name w:val="comment:9"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00111B46"/>
+ <w:pPr>
+ <w:pStyle w:val="comment9"/>
+ <w:spacing w:after="80"/>
+ <w:ind w:left="3240"/>
+ <w:contextualSpacing/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="FF0000"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlheader" w:type="paragraph">
+ <w:name w:val="dl:header"/>
+ <w:basedOn w:val="paranormal"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlheader"/>
+ <w:spacing w:after="0" w:before="240"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Courier" w:h-ansi="Courier"/>
+ <wx:font wx:val="Courier"/>
+ <w:sz w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlbody" w:type="paragraph">
+ <w:name w:val="dl:body"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlbody"/>
+ <w:spacing w:before="0"/>
+ <w:ind w:left="360"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlprocheader" w:type="paragraph">
+ <w:name w:val="dl_proc:header"/>
+ <w:basedOn w:val="dlbody"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlprocheader"/>
+ <w:spacing w:before="240"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dlprocbody" w:type="paragraph">
+ <w:name w:val="dl_proc:body"/>
+ <w:basedOn w:val="dlprocheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dlprocbody"/>
+ <w:spacing w:before="0"/>
+ <w:ind w:left="720"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="dldescription" w:type="paragraph">
+ <w:name w:val="dl:description"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="dldescription"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bitmapheader" w:type="paragraph">
+ <w:name w:val="bitmap:header"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="bitmapheader"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bitmapbody" w:type="paragraph">
+ <w:name w:val="bitmap:body"/>
+ <w:basedOn w:val="dlheader"/>
+ <w:rsid w:val="00071300"/>
+ <w:pPr>
+ <w:pStyle w:val="bitmapbody"/>
+ <w:spacing w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Courier"/>
+ <w:sz w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX1" w:type="paragraph">
+ <w:name w:val="APPENDIX 1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="004978C4"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX1"/>
+ <w:listPr>
+ <w:ilfo w:val="25"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="1440" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="72" w:before="152" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="auto"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX2" w:type="paragraph">
+ <w:name w:val="APPENDIX 2"/>
+ <w:basedOn w:val="APPENDIX1"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX2"/>
+ <w:listPr>
+ <w:ilvl w:val="1"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX3" w:type="paragraph">
+ <w:name w:val="APPENDIX 3"/>
+ <w:basedOn w:val="APPENDIX2"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="00E904D2"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX3"/>
+ <w:listPr>
+ <w:ilvl w:val="2"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage18pt" w:type="paragraph">
+ <w:name w:val="Title Page 18pt"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="0033770F"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage18pt"/>
+ <w:spacing w:after="60" w:before="0" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="center"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="36"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage16pt" w:type="paragraph">
+ <w:name w:val="Title Page 16pt"/>
+ <w:basedOn w:val="TitlePage18pt"/>
+ <w:rsid w:val="0033770F"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage16pt"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="32"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage14pt" w:type="paragraph">
+ <w:name w:val="Title Page 14pt"/>
+ <w:basedOn w:val="TitlePage16pt"/>
+ <w:rsid w:val="0033770F"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage14pt"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b w:val="off"/>
+ <w:sz w:val="28"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para10pt" w:type="paragraph">
+ <w:name w:val="para 10pt"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="para10ptChar"/>
+ <w:rsid w:val="004E3337"/>
+ <w:pPr>
+ <w:pStyle w:val="para10pt"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para10ptnospacing" w:type="paragraph">
+ <w:name w:val="para 10pt no spacing"/>
+ <w:basedOn w:val="para10pt"/>
+ <w:rsid w:val="004A1CCA"/>
+ <w:pPr>
+ <w:pStyle w:val="para10ptnospacing"/>
+ <w:spacing w:after="0" w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableText10nospacing" w:type="paragraph">
+ <w:name w:val="TableText10 no spacing"/>
+ <w:basedOn w:val="TableText10"/>
+ <w:rsid w:val="00D72507"/>
+ <w:pPr>
+ <w:pStyle w:val="TableText10nospacing"/>
+ <w:spacing w:after="0" w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8pt" w:type="paragraph">
+ <w:name w:val="para 8pt"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="para8ptChar"/>
+ <w:rsid w:val="004E3337"/>
+ <w:pPr>
+ <w:pStyle w:val="para8pt"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paranormalChar" w:type="character">
+ <w:name w:val="para:normal Char"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:link w:val="paranormal"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:b-cs/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl1CharChar" w:type="character">
+ <w:name w:val="bullet:lvl 1 Char Char"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:link w:val="bulletlvl1"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:color w:val="000000"/>
+ <w:sz w:val="22"/>
+ <w:sz-cs w:val="22"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="ParagraphText" w:type="paragraph">
+ <w:name w:val="ParagraphText"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00C93CA3"/>
+ <w:pPr>
+ <w:pStyle w:val="ParagraphText"/>
+ <w:spacing w:after="120" w:before="0" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/>
+ <wx:font wx:val="Times New Roman"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl10" w:type="paragraph">
+ <w:name w:val="list lvl 1"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A81E8C"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl10"/>
+ <w:listPr>
+ <w:ilfo w:val="9"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="936" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX4" w:type="paragraph">
+ <w:name w:val="APPENDIX 4"/>
+ <w:basedOn w:val="APPENDIX3"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX4"/>
+ <w:listPr>
+ <w:ilvl w:val="3"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX5" w:type="paragraph">
+ <w:name w:val="APPENDIX 5"/>
+ <w:basedOn w:val="APPENDIX4"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX5"/>
+ <w:listPr>
+ <w:ilvl w:val="4"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX6" w:type="paragraph">
+ <w:name w:val="APPENDIX 6"/>
+ <w:basedOn w:val="APPENDIX5"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX6"/>
+ <w:listPr>
+ <w:ilvl w:val="5"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX7" w:type="paragraph">
+ <w:name w:val="APPENDIX 7"/>
+ <w:basedOn w:val="APPENDIX6"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX7"/>
+ <w:listPr>
+ <w:ilvl w:val="6"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX8" w:type="paragraph">
+ <w:name w:val="APPENDIX 8"/>
+ <w:basedOn w:val="APPENDIX7"/>
+ <w:next w:val="paranormal"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX8"/>
+ <w:listPr>
+ <w:ilvl w:val="7"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="APPENDIX9" w:type="paragraph">
+ <w:name w:val="APPENDIX 9"/>
+ <w:basedOn w:val="APPENDIX8"/>
+ <w:rsid w:val="009B7093"/>
+ <w:pPr>
+ <w:pStyle w:val="APPENDIX9"/>
+ <w:listPr>
+ <w:ilvl w:val="8"/>
+ </w:listPr>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="BalloonText" w:type="paragraph">
+ <w:name w:val="Balloon Text"/>
+ <w:basedOn w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00B47E5D"/>
+ <w:pPr>
+ <w:pStyle w:val="BalloonText"/>
+ </w:pPr>
+ <w:rPr>
+ <w:rFonts w:ascii="Tahoma" w:cs="Tahoma" w:h-ansi="Tahoma"/>
+ <wx:font wx:val="Tahoma"/>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listreset" w:type="list">
+ <w:name w:val="listreset"/>
+ <w:basedOn w:val="NoList"/>
+ <w:rsid w:val="00D25E39"/>
+ <w:pPr>
+ <w:listPr>
+ <w:ilfo w:val="26"/>
+ </w:listPr>
+ </w:pPr>
+ </w:style>
+ <w:style w:styleId="bulletlvl3" w:type="paragraph">
+ <w:name w:val="bullet:lvl 3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00EF5226"/>
+ <w:pPr>
+ <w:pStyle w:val="bulletlvl3"/>
+ <w:listPr>
+ <w:ilfo w:val="28"/>
+ </w:listPr>
+ <w:tabs>
+ <w:tab w:pos="3024" w:val="clear"/>
+ <w:tab w:pos="360" w:val="left"/>
+ <w:tab w:pos="1008" w:val="left"/>
+ </w:tabs>
+ <w:spacing w:after="80"/>
+ <w:ind w:hanging="360" w:left="1368"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="CommentReference" w:type="character">
+ <w:name w:val="annotation reference"/>
+ <wx:uiName wx:val="Comment Reference"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00E40969"/>
+ <w:rPr>
+ <w:sz w:val="16"/>
+ <w:sz-cs w:val="16"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="CommentText" w:type="paragraph">
+ <w:name w:val="annotation text"/>
+ <wx:uiName wx:val="Comment Text"/>
+ <w:basedOn w:val="Normal"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00E40969"/>
+ <w:pPr>
+ <w:pStyle w:val="CommentText"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="20"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="CommentSubject" w:type="paragraph">
+ <w:name w:val="annotation subject"/>
+ <wx:uiName wx:val="Comment Subject"/>
+ <w:basedOn w:val="CommentText"/>
+ <w:next w:val="CommentText"/>
+ <w:semiHidden/>
+ <w:rsid w:val="00E40969"/>
+ <w:pPr>
+ <w:pStyle w:val="CommentSubject"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:b/>
+ <w:b-cs/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TitlePage22pt" w:type="paragraph">
+ <w:name w:val="Title Page 22pt"/>
+ <w:basedOn w:val="TitlePage16pt"/>
+ <w:rsid w:val="005F35C4"/>
+ <w:pPr>
+ <w:pStyle w:val="TitlePage22pt"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:sz w:val="44"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para" w:type="paragraph">
+ <w:name w:val="para"/>
+ <w:basedOn w:val="Normal"/>
+ <w:link w:val="paraChar"/>
+ <w:rsid w:val="0057061B"/>
+ <w:pPr>
+ <w:pStyle w:val="para"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ <w:jc w:val="both"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="paraChar" w:type="character">
+ <w:name w:val="para Char"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:link w:val="para"/>
+ <w:rsid w:val="0057061B"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl20" w:type="paragraph">
+ <w:name w:val="list lvl 2"/>
+ <w:basedOn w:val="ListNumber3"/>
+ <w:rsid w:val="0057061B"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl20"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="ListNumber3" w:type="paragraph">
+ <w:name w:val="List Number 3"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="0057061B"/>
+ <w:pPr>
+ <w:pStyle w:val="ListNumber3"/>
+ <w:tabs>
+ <w:tab w:pos="1512" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="1512"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="TableGrid" w:type="table">
+ <w:name w:val="Table Grid"/>
+ <w:basedOn w:val="TableNormal"/>
+ <w:rsid w:val="008B1AB7"/>
+ <w:pPr>
+ <w:spacing w:after="40" w:before="40" w:line="240" w:line-rule="at-least"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Times New Roman"/>
+ </w:rPr>
+ <w:tblPr>
+ <w:tblInd w:type="dxa" w:w="0"/>
+ <w:tblBorders>
+ <w:top w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:left w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:bottom w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:right w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:insideH w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ <w:insideV w:color="auto" w:space="0" w:sz="4" w:val="single" wx:bdrwidth="10"/>
+ </w:tblBorders>
+ <w:tblCellMar>
+ <w:top w:type="dxa" w:w="0"/>
+ <w:left w:type="dxa" w:w="108"/>
+ <w:bottom w:type="dxa" w:w="0"/>
+ <w:right w:type="dxa" w:w="108"/>
+ </w:tblCellMar>
+ </w:tblPr>
+ </w:style>
+ <w:style w:styleId="para8ptChar" w:type="character">
+ <w:name w:val="para 8pt Char"/>
+ <w:basedOn w:val="paraChar"/>
+ <w:link w:val="para8pt"/>
+ <w:rsid w:val="007921D3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="16"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8ptunderline" w:type="paragraph">
+ <w:name w:val="para 8pt underline"/>
+ <w:basedOn w:val="para8pt"/>
+ <w:link w:val="para8ptunderlineChar"/>
+ <w:rsid w:val="007921D3"/>
+ <w:pPr>
+ <w:pStyle w:val="para8ptunderline"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8ptunderlineChar" w:type="character">
+ <w:name w:val="para 8pt underline Char"/>
+ <w:basedOn w:val="para8ptChar"/>
+ <w:link w:val="para8ptunderline"/>
+ <w:rsid w:val="007921D3"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="16"/>
+ <w:u w:val="single"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para8ptnospacing" w:type="paragraph">
+ <w:name w:val="para 8pt no spacing"/>
+ <w:basedOn w:val="para8pt"/>
+ <w:rsid w:val="007921D3"/>
+ <w:pPr>
+ <w:pStyle w:val="para8ptnospacing"/>
+ <w:spacing w:after="0" w:before="0"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="listlvl0" w:type="paragraph">
+ <w:name w:val="list lvl 0"/>
+ <w:basedOn w:val="ListNumber"/>
+ <w:rsid w:val="00A233DA"/>
+ <w:pPr>
+ <w:pStyle w:val="listlvl0"/>
+ <w:spacing w:after="72" w:before="72" w:line="240" w:line-rule="auto"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ <w:color w:val="auto"/>
+ <w:sz w:val="24"/>
+ <w:sz-cs w:val="20"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="ListNumber" w:type="paragraph">
+ <w:name w:val="List Number"/>
+ <w:basedOn w:val="Normal"/>
+ <w:rsid w:val="00A233DA"/>
+ <w:pPr>
+ <w:pStyle w:val="ListNumber"/>
+ <w:tabs>
+ <w:tab w:pos="504" w:val="list"/>
+ </w:tabs>
+ <w:ind w:hanging="504" w:left="504"/>
+ </w:pPr>
+ <w:rPr>
+ <wx:font wx:val="Arial"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="para10ptChar" w:type="character">
+ <w:name w:val="para 10pt Char"/>
+ <w:basedOn w:val="paraChar"/>
+ <w:link w:val="para10pt"/>
+ <w:rsid w:val="0015054E"/>
+ <w:rPr>
+ <w:rFonts w:ascii="Arial" w:h-ansi="Arial"/>
+ <w:sz w:val="24"/>
+ <w:lang w:bidi="AR-SA" w:fareast="EN-US" w:val="EN-US"/>
+ </w:rPr>
+ </w:style>
+ <w:style w:styleId="FollowedHyperlink" w:type="character">
+ <w:name w:val="FollowedHyperlink"/>
+ <w:basedOn w:val="DefaultParagraphFont"/>
+ <w:rsid w:val="00B8047C"/>
+ <w:rPr>
+ <w:color w:val="800080"/>
+ <w:u w:val="single"/>
+ </w:rPr>
+ </w:style>
+ </w:styles>
+ <w:shapeDefaults>
+ <o:shapedefaults spidmax="37890" v:ext="edit"/>
+ <o:shapelayout v:ext="edit">
+ <o:idmap data="1" v:ext="edit"/>
+ </o:shapelayout>
+ </w:shapeDefaults>
+ <w:docPr>
+ <w:view w:val="print"/>
+ <w:zoom w:percent="100"/>
+ <w:displayBackgroundShape/>
+ <w:doNotEmbedSystemFonts/>
+ <w:bordersDontSurroundHeader/>
+ <w:bordersDontSurroundFooter/>
+ <w:attachedTemplate w:val=""/>
+ <w:stylePaneFormatFilter w:val="3001"/>
+ <w:documentProtection w:enforcement="on" w:formatting="on" w:unprotectPassword="00000000"/>
+ <w:defaultTabStop w:val="720"/>
+ <w:doNotHyphenateCaps/>
+ <w:drawingGridHorizontalSpacing w:val="120"/>
+ <w:drawingGridVerticalSpacing w:val="120"/>
+ <w:displayHorizontalDrawingGridEvery w:val="0"/>
+ <w:displayVerticalDrawingGridEvery w:val="3"/>
+ <w:useMarginsForDrawingGridOrigin/>
+ <w:doNotShadeFormData/>
+ <w:punctuationKerning/>
+ <w:characterSpacingControl w:val="CompressPunctuation"/>
+ <w:optimizeForBrowser/>
+ <w:validateAgainstSchema w:val="off"/>
+ <w:saveInvalidXML/>
+ <w:ignoreMixedContent w:val="off"/>
+ <w:alwaysShowPlaceholderText w:val="off"/>
+ <w:hdrShapeDefaults>
+ <o:shapedefaults spidmax="37890" v:ext="edit"/>
+ </w:hdrShapeDefaults>
+ <w:footnotePr>
+ <w:footnote w:type="separator">
+ <w:p>
+ <w:r>
+ <w:separator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:footnote>
+ <w:footnote w:type="continuation-separator">
+ <w:p>
+ <w:r>
+ <w:continuationSeparator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:footnote>
+ </w:footnotePr>
+ <w:endnotePr>
+ <w:endnote w:type="separator">
+ <w:p>
+ <w:r>
+ <w:separator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:endnote>
+ <w:endnote w:type="continuation-separator">
+ <w:p>
+ <w:r>
+ <w:continuationSeparator/>
+ </w:r>
+ </w:p>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ <w:p/>
+ </w:endnote>
+ </w:endnotePr>
+ <w:compat>
+ <w:footnoteLayoutLikeWW8/>
+ <w:shapeLayoutLikeWW8/>
+ <w:alignTablesRowByRow/>
+ <w:forgetLastTabAlignment/>
+ <w:doNotUseHTMLParagraphAutoSpacing/>
+ <w:layoutRawTableWidth/>
+ <w:layoutTableRowsApart/>
+ <w:useWord97LineBreakingRules/>
+ <w:dontAllowFieldEndSelect/>
+ <w:useWord2002TableStyleRules/>
+ </w:compat>
+ <wsp:rsids>
+ <wsp:rsidRoot wsp:val="00244327"/>
+ </wsp:rsids>
+ </w:docPr>
+ <w:body>
+ <wx:sect>
+ <ns0:Artifact>
+ <w:p>
+ <Set_Name>
+ <w:r>
+ <w:t>Default</w:t>
+ </w:r>
+ </Set_Name>
+ <Outline>
+ <HeadingAttribute>
+ <w:r>
+ <w:t>Name</w:t>
+ </w:r>
+ </HeadingAttribute>
+ <RecurseChildren>
+ <w:r>
+ <w:t>true</w:t>
+ </w:r>
+ </RecurseChildren>
+ </Outline>
+ <Attribute>
+ <Name>
+ <w:r>
+ <w:t>*</w:t>
+ </w:r>
+ </Name>
+ </Attribute>
+ </w:p>
+ </ns0:Artifact>
+ <w:p/>
+ <w:sectPr>
+ <w:hdr w:type="odd">
+ <w:p>
+ <w:pPr>
+ <w:pStyle w:val="Header"/>
+ </w:pPr>
+ </w:p>
+ </w:hdr>
+ <w:pgSz w:code="1" w:h="15840" w:w="12240"/>
+ <w:pgMar w:bottom="1440" w:footer="432" w:gutter="0" w:header="432" w:left="1440" w:right="1440" w:top="1440"/>
+ <w:pgNumType w:start="1"/>
+ <w:cols w:space="475"/>
+ <w:noEndnote/>
+ </w:sectPr>
+ </wx:sect>
+ </w:body>
+</w:wordDocument>
diff --git a/org.eclipse.osee.framework.ui.skynet/support/templates/Word Edit Template.xml b/org.eclipse.osee.framework.ui.skynet/support/templates/Word Edit Template.xml
new file mode 100644
index 00000000000..fff1ff5ab96
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/templates/Word Edit Template.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://BeforeGUID/PrePendAAABGPIkRqcBGh2XK2Kgvw/AfterGUID" xmlns:ns1="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>SRS</o:Title><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>Ryan Brooks</o:LastAuthor><o:Revision>3</o:Revision><o:TotalTime>1</o:TotalTime><o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted><o:Created>2008-09-01T23:47:00Z</o:Created><o:LastSaved>2008-10-03T20:33:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>7</o:Words><o:Characters>46</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>52</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Courier"><w:panose-1 w:val="02070409020205020404"/><w:charset w:val="00"/><w:family w:val="Modern"/><w:notTrueType/><w:pitch w:val="fixed"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="003A6350"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F89E6E26"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="APPENDIX1"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="APPENDIX2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="APPENDIX3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="APPENDIX4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="APPENDIX5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="APPENDIX6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="APPENDIX7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="APPENDIX8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="APPENDIX9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="016D5431"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="98C65BCE"/><w:lvl w:ilvl="0" w:tplc="94D2C566"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="0C4D206D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="4B543E40"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="0DE40F2C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="10AF29E5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="7520DAAE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="15EB1725"/><w:plt w:val="Multilevel"/><w:tmpl w:val="D902A83E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="1C970BBA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EB82E3A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="1D6C5FCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E710F038"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="APPENDIX %1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="720" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1440" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="1EC51BCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="256F5D56"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="290A1130"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="299E4F07"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="46E2B8B2"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="29C240FD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FCA4DC08"/><w:lvl w:ilvl="0" w:tplc="B5146A3E"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl2"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1224"/></w:tabs><w:ind w:left="1224" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="29CA5728"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D00252C6"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="2A5411A0"/><w:plt w:val="Multilevel"/><w:tmpl w:val="2660867C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="2B1C06F5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3B98963A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="2B477730"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="33801DC4"/><w:lvl w:ilvl="0" w:tplc="2D8A4B4C"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl3"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3024"/></w:tabs><w:ind w:left="3024" w:hanging="2016"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2448"/></w:tabs><w:ind w:left="2448" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3168"/></w:tabs><w:ind w:left="3168" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3888"/></w:tabs><w:ind w:left="3888" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4608"/></w:tabs><w:ind w:left="4608" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5328"/></w:tabs><w:ind w:left="5328" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6048"/></w:tabs><w:ind w:left="6048" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6768"/></w:tabs><w:ind w:left="6768" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7488"/></w:tabs><w:ind w:left="7488" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2B5B6B3C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5CC8E874"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:first-line="763"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="2D6545A6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3F227848"/><w:name w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:caps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:vanish w:val="off"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:vertAlign w:val="baseline"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="listlvl2"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="-31680"/></w:tabs><w:ind w:left="1656" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl3"/><w:lvlText w:val="(%3)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2016"/></w:tabs><w:ind w:left="2016" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="listlvl4"/><w:lvlText w:val="(%4)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2376"/></w:tabs><w:ind w:left="2376" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl5"/><w:lvlText w:val="%5)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2736"/></w:tabs><w:ind w:left="2736" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="listlvl6"/><w:lvlText w:val="%6)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3096"/></w:tabs><w:ind w:left="3096" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl7"/><w:lvlText w:val="[%7]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3456"/></w:tabs><w:ind w:left="3456" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="[%8]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="308239DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="31A252E6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="A9D83578"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="3B97448F"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3C165F4A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79A06FE6"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="42BB3748"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DBE464B0"/><w:lvl w:ilvl="0" w:tplc="26BAF6B0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl1"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="648"/></w:tabs><w:ind w:left="648" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="47E309C3"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="5A401749"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CD8E61CE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="5A802BC9"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="5C3B1B76"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="5E371EBB"/><w:plt w:val="Multilevel"/><w:tmpl w:val="DA56D440"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="60B71688"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EA20814"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="6389497B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="AC5A6410"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="listlvl10"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="360" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1080" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1800" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2520" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3240" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3960" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="4680" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5400" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6120" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="6469691A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E5D02024"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="69A642CA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="74BA49AE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart"/><w:styleLink w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="751E50EA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79E6FEDC"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="7D9D3B47"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="7F0F313D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F8FC63EE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="7F633FB7"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5F5A52E8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="23"/></w:list><w:list w:ilfo="2"><w:ilst w:val="12"/></w:list><w:list w:ilfo="3"><w:ilst w:val="18"/></w:list><w:list w:ilfo="4"><w:ilst w:val="14"/></w:list><w:list w:ilfo="5"><w:ilst w:val="6"/></w:list><w:list w:ilfo="6"><w:ilst w:val="26"/></w:list><w:list w:ilfo="7"><w:ilst w:val="5"/></w:list><w:list w:ilfo="8"><w:ilst w:val="13"/></w:list><w:list w:ilfo="9"><w:ilst w:val="30"/></w:list><w:list w:ilfo="10"><w:ilst w:val="7"/></w:list><w:list w:ilfo="11"><w:ilst w:val="18"/></w:list><w:list w:ilfo="12"><w:ilst w:val="27"/></w:list><w:list w:ilfo="13"><w:ilst w:val="36"/></w:list><w:list w:ilfo="14"><w:ilst w:val="2"/></w:list><w:list w:ilfo="15"><w:ilst w:val="28"/></w:list><w:list w:ilfo="16"><w:ilst w:val="17"/></w:list><w:list w:ilfo="17"><w:ilst w:val="31"/></w:list><w:list w:ilfo="18"><w:ilst w:val="4"/></w:list><w:list w:ilfo="19"><w:ilst w:val="20"/></w:list><w:list w:ilfo="20"><w:ilst w:val="15"/></w:list><w:list w:ilfo="21"><w:ilst w:val="37"/></w:list><w:list w:ilfo="22"><w:ilst w:val="22"/></w:list><w:list w:ilfo="23"><w:ilst w:val="25"/></w:list><w:list w:ilfo="24"><w:ilst w:val="34"/></w:list><w:list w:ilfo="25"><w:ilst w:val="0"/></w:list><w:list w:ilfo="26"><w:ilst w:val="33"/></w:list><w:list w:ilfo="27"><w:ilst w:val="21"/></w:list><w:list w:ilfo="28"><w:ilst w:val="16"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="18"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="1"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="2"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="3"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="4"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="5"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="6"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="7"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="8"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="31"><w:ilst w:val="11"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/></w:list><w:list w:ilfo="33"><w:ilst w:val="35"/></w:list><w:list w:ilfo="34"><w:ilst w:val="8"/></w:list><w:list w:ilfo="35"><w:ilst w:val="29"/></w:list><w:list w:ilfo="36"><w:ilst w:val="14"/></w:list><w:list w:ilfo="37"><w:ilst w:val="10"/></w:list><w:list w:ilfo="38"><w:ilst w:val="9"/></w:list><w:list w:ilfo="39"><w:ilst w:val="3"/></w:list><w:list w:ilfo="40"><w:ilst w:val="24"/></w:list><w:list w:ilfo="41"><w:ilst w:val="32"/></w:list><w:ilfoMacAtCleanup w:val="5"/></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:keepLines/><w:pageBreakBefore/><w:listPr><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:kern w:val="28"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="900"/></w:tabs><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading5"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading6"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1620"/></w:tabs><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading9"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="paranormal"><w:name w:val="para:normal"/><w:link w:val="paranormalChar"/><w:rsid w:val="009E6B3D"/><w:pPr><w:pStyle w:val="paranormal"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="64" w:after="80" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl3"><w:name w:val="list:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl3"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="2088"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang1"><w:name w:val="req lang:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A134C3"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:spacing w:before="20" w:after="0" w:line="180" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="proprietarycontd"><w:name w:val="proprietary:cont'd"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="proprietarycontd"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="200" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="16"/><w:sz-cs w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paracentered"><w:name w:val="para:centered"/><w:autoRedefine/><w:rsid w:val="00B43482"/><w:pPr><w:pStyle w:val="paracentered"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="80" w:after="80" w:line="240" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent2"><w:name w:val="para:indent2"/><w:autoRedefine/><w:rsid w:val="004417BE"/><w:pPr><w:pStyle w:val="paraindent2"/><w:tabs><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent3"><w:name w:val="para:indent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent3"/><w:tabs><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/><w:tab w:val="left" w:pos="9720"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="0085234B"/><w:pPr><w:pStyle w:val="Caption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9720"/><w:tab w:val="left" w:pos="10800"/><w:tab w:val="left" w:pos="11880"/><w:tab w:val="left" w:pos="12960"/><w:tab w:val="left" w:pos="14040"/><w:tab w:val="left" w:pos="15120"/><w:tab w:val="left" w:pos="16200"/><w:tab w:val="left" w:pos="17280"/><w:tab w:val="left" w:pos="18360"/><w:tab w:val="left" w:pos="19440"/><w:tab w:val="left" w:pos="20520"/><w:tab w:val="left" w:pos="21600"/><w:tab w:val="left" w:pos="22680"/><w:tab w:val="left" w:pos="23760"/><w:tab w:val="left" w:pos="24840"/><w:tab w:val="left" w:pos="25920"/><w:tab w:val="left" w:pos="27000"/><w:tab w:val="left" w:pos="28080"/><w:tab w:val="left" w:pos="29160"/><w:tab w:val="left" w:pos="30240"/><w:tab w:val="left" w:pos="31320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent1"><w:name w:val="para:indent1"/><w:autoRedefine/><w:rsid w:val="007D424E"/><w:pPr><w:pStyle w:val="paraindent1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl4"><w:name w:val="list:lvl 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl4"/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="11"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead"><w:name w:val="RowHead"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="100" w:after="100"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11"><w:name w:val="TableText11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOAHeading"/><w:spacing w:before="240" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHeadL"><w:name w:val="RowHeadL"/><w:basedOn w:val="RowHead"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHeadL"/><w:spacing w:before="60" w:after="60"/><w:jc w:val="left"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11B"><w:name w:val="TableText11B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText11B"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofAuthorities"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="8640"/></w:tabs><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofFigures"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00721F21"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D90577"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:dstrike w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/><w:vertAlign w:val="baseline"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead11"><w:name w:val="RowHead11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead11"/><w:listPr><w:ilvl w:val="12"/></w:listPr><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11C"><w:name w:val="TableText11C"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11C"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl1"><w:name w:val="list:lvl 1"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl1"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl5"><w:name w:val="list:lvl 5"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="left" w:pos="3384"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl2"><w:name w:val="list:lvl 2"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="AppendixTitle"><w:name w:val="Appendix Title"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="AppendixTitle"/><w:pageBreakBefore/><w:spacing w:before="120" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead10"><w:name w:val="RowHead10"/><w:basedOn w:val="RowHead11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC1"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="540"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="240"/><w:ind w:left="547" w:hanging="547"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:noProof/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC2"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="900"/><w:tab w:val="right" w:leader="dot" w:pos="9360"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="907" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC3"><w:name w:val="toc 3"/><wx:uiName wx:val="TOC 3"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC3"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1260"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1260" w:hanging="900"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC4"><w:name w:val="toc 4"/><wx:uiName wx:val="TOC 4"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC4"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1620"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1620" w:hanging="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC5"><w:name w:val="toc 5"/><wx:uiName wx:val="TOC 5"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC5"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1980"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1980" w:hanging="1260"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC6"><w:name w:val="toc 6"/><wx:uiName wx:val="TOC 6"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC6"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2340"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2340" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC7"><w:name w:val="toc 7"/><wx:uiName wx:val="TOC 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC7"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2700"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="0" w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="2700" w:hanging="1620"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC8"><w:name w:val="toc 8"/><wx:uiName wx:val="TOC 8"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC8"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2970"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2970" w:hanging="1710"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC9"><w:name w:val="toc 9"/><wx:uiName wx:val="TOC 9"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC9"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="3330"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="3330" w:hanging="1890"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeadingUnnumbered"><w:name w:val="Heading Unnumbered"/><w:next w:val="paranormal"/><w:autoRedefine/><w:rsid w:val="00107AA6"/><w:pPr><w:pStyle w:val="HeadingUnnumbered"/><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="24"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10"><w:name w:val="TableText10"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableTextBCentered"><w:name w:val="TableTextB Centered"/><w:basedOn w:val="Normal"/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableTextBCentered"/><w:spacing w:line="220" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10C"><w:name w:val="TableText10C"/><w:basedOn w:val="TableText11C"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10C"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10B"><w:name w:val="TableText10B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText10B"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="acronym"><w:name w:val="acronym"/><w:autoRedefine/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="acronym"/><w:tabs><w:tab w:val="left" w:pos="2160"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="40"/><w:ind w:left="2160" w:hanging="2160"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl6"><w:name w:val="list:lvl 6"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="clear" w:pos="4320"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr1L"><w:name w:val="hdr1L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr1L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr2L"><w:name w:val="hdr2L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr2L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="0" w:line="180" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl1"><w:name w:val="bullet:lvl 1"/><w:basedOn w:val="Normal"/><w:link w:val="bulletlvl1CharChar"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl2"><w:name w:val="bullet:lvl 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilfo w:val="2"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1224"/><w:tab w:val="left" w:pos="648"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1728" w:hanging="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent4"><w:name w:val="para:indent4"/><w:basedOn w:val="paraindent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent4"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl7"><w:name w:val="list:lvl 7"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="left" w:pos="3024"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCfiguretitle"><w:name w:val="TOC:figure title"/><w:basedOn w:val="Caption"/><w:autoRedefine/><w:rsid w:val="00894991"/><w:pPr><w:pStyle w:val="TOCfiguretitle"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note"><w:name w:val="note"/><w:basedOn w:val="Normal"/><w:rsid w:val="006E0AB6"/><w:pPr><w:pStyle w:val="note"/><w:spacing w:before="80" w:after="80"/><w:ind w:left="1656" w:right="720" w:hanging="936"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang2"><w:name w:val="req lang:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang2"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang3"><w:name w:val="req lang:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang4"><w:name w:val="req lang:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang4"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang5"><w:name w:val="req lang:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang5"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1800"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang6"><w:name w:val="req lang:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang6"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="2160"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="statedef"><w:name w:val="state def"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DE6BA0"/><w:pPr><w:pStyle w:val="statedef"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="80" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:caps/><w:color w:val="408040"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="intentblank"><w:name w:val="intent:blank"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="000B79E8"/><w:pPr><w:pStyle w:val="intentblank"/><w:spacing w:before="6480" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="code"><w:name w:val="code"/><w:basedOn w:val="Normal"/><w:rsid w:val="006D4514"/><w:pPr><w:pStyle w:val="code"/><w:spacing w:before="80" w:after="80" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="parapage"><w:name w:val="para:page"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00DD22A9"/><w:pPr><w:pStyle w:val="parapage"/><w:pageBreakBefore/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCtabletitle"><w:name w:val="TOC:table title"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00B869CD"/><w:pPr><w:pStyle w:val="TOCtabletitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRitem"><w:name w:val="RCR:item"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="007A1F4F"/><w:pPr><w:pStyle w:val="RCRitem"/><w:tabs><w:tab w:val="left" w:pos="1800"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="1800" w:right="720" w:hanging="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRheader"><w:name w:val="RCR:header"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006D781E"/><w:pPr><w:pStyle w:val="RCRheader"/><w:tabs><w:tab w:val="left" w:pos="792"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="right" w:leader="underscore" w:pos="8640"/></w:tabs><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="line"><w:name w:val="line"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006B63C2"/><w:pPr><w:pStyle w:val="line"/><w:spacing w:before="0" w:line="40" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="12"/><w:sz-cs w:val="12"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang7"><w:name w:val="req lang: 7"/><w:basedOn w:val="reqlang6"/><w:rsid w:val="00C0337E"/><w:pPr><w:pStyle w:val="reqlang7"/><w:ind w:left="2520"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang70"><w:name w:val="req lang:7"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang70"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang8"><w:name w:val="req lang:8"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang8"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang9"><w:name w:val="req lang:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="007534C9"/><w:pPr><w:pStyle w:val="reqlang9"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="3240"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AF20CB"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment1"><w:name w:val="comment:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment1"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment2"><w:name w:val="comment:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment2"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="720"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment3"><w:name w:val="comment:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1080"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment4"><w:name w:val="comment:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment4"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1440"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment5"><w:name w:val="comment:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment5"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment6"><w:name w:val="comment:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment6"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment7"><w:name w:val="comment:7"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment7"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2520"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment8"><w:name w:val="comment:8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment8"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2880"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment9"><w:name w:val="comment:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment9"/><w:spacing w:after="80"/><w:ind w:left="3240"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlheader"><w:name w:val="dl:header"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlheader"/><w:spacing w:before="240" w:after="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier" w:h-ansi="Courier"/><wx:font wx:val="Courier"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlbody"><w:name w:val="dl:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlbody"/><w:spacing w:before="0"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocheader"><w:name w:val="dl_proc:header"/><w:basedOn w:val="dlbody"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocheader"/><w:spacing w:before="240"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocbody"><w:name w:val="dl_proc:body"/><w:basedOn w:val="dlprocheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocbody"/><w:spacing w:before="0"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dldescription"><w:name w:val="dl:description"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dldescription"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapheader"><w:name w:val="bitmap:header"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapheader"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapbody"><w:name w:val="bitmap:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapbody"/><w:spacing w:before="0"/></w:pPr><w:rPr><wx:font wx:val="Courier"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX1"><w:name w:val="APPENDIX 1"/><w:basedOn w:val="Normal"/><w:next w:val="paranormal"/><w:rsid w:val="004978C4"/><w:pPr><w:pStyle w:val="APPENDIX1"/><w:listPr><w:ilfo w:val="25"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="152" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX2"><w:name w:val="APPENDIX 2"/><w:basedOn w:val="APPENDIX1"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX2"/><w:listPr><w:ilvl w:val="1"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX3"><w:name w:val="APPENDIX 3"/><w:basedOn w:val="APPENDIX2"/><w:next w:val="paranormal"/><w:rsid w:val="00E904D2"/><w:pPr><w:pStyle w:val="APPENDIX3"/><w:listPr><w:ilvl w:val="2"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage18pt"><w:name w:val="Title Page 18pt"/><w:basedOn w:val="Normal"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage18pt"/><w:spacing w:before="0" w:after="60" w:line="240" w:line-rule="auto"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz w:val="36"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage16pt"><w:name w:val="Title Page 16pt"/><w:basedOn w:val="TitlePage18pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage16pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage14pt"><w:name w:val="Title Page 14pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage14pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10pt"><w:name w:val="para 10pt"/><w:basedOn w:val="Normal"/><w:link w:val="para10ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para10pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10ptnospacing"><w:name w:val="para 10pt no spacing"/><w:basedOn w:val="para10pt"/><w:rsid w:val="004A1CCA"/><w:pPr><w:pStyle w:val="para10ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10nospacing"><w:name w:val="TableText10 no spacing"/><w:basedOn w:val="TableText10"/><w:rsid w:val="00D72507"/><w:pPr><w:pStyle w:val="TableText10nospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8pt"><w:name w:val="para 8pt"/><w:basedOn w:val="Normal"/><w:link w:val="para8ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para8pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paranormalChar"><w:name w:val="para:normal Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="paranormal"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="bulletlvl1CharChar"><w:name w:val="bullet:lvl 1 Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="bulletlvl1"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:before="0" w:after="120" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl10"><w:name w:val="list lvl 1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl10"/><w:listPr><w:ilfo w:val="9"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/></w:tabs><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX4"><w:name w:val="APPENDIX 4"/><w:basedOn w:val="APPENDIX3"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX4"/><w:listPr><w:ilvl w:val="3"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX5"><w:name w:val="APPENDIX 5"/><w:basedOn w:val="APPENDIX4"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX5"/><w:listPr><w:ilvl w:val="4"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX6"><w:name w:val="APPENDIX 6"/><w:basedOn w:val="APPENDIX5"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX6"/><w:listPr><w:ilvl w:val="5"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX7"><w:name w:val="APPENDIX 7"/><w:basedOn w:val="APPENDIX6"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX7"/><w:listPr><w:ilvl w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX8"><w:name w:val="APPENDIX 8"/><w:basedOn w:val="APPENDIX7"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX8"/><w:listPr><w:ilvl w:val="7"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX9"><w:name w:val="APPENDIX 9"/><w:basedOn w:val="APPENDIX8"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX9"/><w:listPr><w:ilvl w:val="8"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00B47E5D"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="list" w:styleId="listreset"><w:name w:val="listreset"/><w:basedOn w:val="NoList"/><w:rsid w:val="00D25E39"/><w:pPr><w:listPr><w:ilfo w:val="26"/></w:listPr></w:pPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl3"><w:name w:val="bullet:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00EF5226"/><w:pPr><w:pStyle w:val="bulletlvl3"/><w:listPr><w:ilfo w:val="28"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="3024"/><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1368" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage22pt"><w:name w:val="Title Page 22pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="005F35C4"/><w:pPr><w:pStyle w:val="TitlePage22pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="44"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para"><w:name w:val="para"/><w:basedOn w:val="Normal"/><w:link w:val="paraChar"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="para"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paraChar"><w:name w:val="para Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="para"/><w:rsid w:val="0057061B"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl20"><w:name w:val="list lvl 2"/><w:basedOn w:val="ListNumber3"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="listlvl20"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="008B1AB7"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="character" w:styleId="para8ptChar"><w:name w:val="para 8pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para8pt"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptunderline"><w:name w:val="para 8pt underline"/><w:basedOn w:val="para8pt"/><w:link w:val="para8ptunderlineChar"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptunderline"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="para8ptunderlineChar"><w:name w:val="para 8pt underline Char"/><w:basedOn w:val="para8ptChar"/><w:link w:val="para8ptunderline"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptnospacing"><w:name w:val="para 8pt no spacing"/><w:basedOn w:val="para8pt"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl0"><w:name w:val="list lvl 0"/><w:basedOn w:val="ListNumber"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="listlvl0"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="ListNumber"/><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="para10ptChar"><w:name w:val="para 10pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para10pt"/><w:rsid w:val="0015054E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00B8047C"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart8"><w:name w:val="micro:art8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart8"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart9"><w:name w:val="micro:art9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart9"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart10"><w:name w:val="micro:art10"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart10"/><w:spacing w:before="120" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="37890"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:attachedTemplate w:val=""/><w:stylePaneFormatFilter w:val="1F08"/><w:documentProtection w:formatting="on" w:enforcement="off"/><w:defaultTabStop w:val="720"/><w:doNotHyphenateCaps/><w:drawingGridHorizontalSpacing w:val="120"/><w:drawingGridVerticalSpacing w:val="120"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="3"/><w:useMarginsForDrawingGridOrigin/><w:doNotShadeFormData/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="37890"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/><w:p wsp:rsidR="00787401" wsp:rsidRDefault="00787401"/></w:endnote></w:endnotePr><w:compat><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00244327"/><wsp:rsid wsp:val="001766F7"/><wsp:rsid wsp:val="00244327"/><wsp:rsid wsp:val="00436451"/><wsp:rsid wsp:val="005501C9"/><wsp:rsid wsp:val="005C6782"/><wsp:rsid wsp:val="00787401"/><wsp:rsid wsp:val="007F3E1C"/><wsp:rsid wsp:val="00801B1F"/><wsp:rsid wsp:val="00B17C0D"/><wsp:rsid wsp:val="00DD246B"/></wsp:rsids></w:docPr><w:body><wx:sect><ns1:Artifact><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="005501C9"><Set_Name><w:r wsp:rsidR="00B17C0D"><w:t>Default</w:t></w:r></Set_Name><Outline><HeadingAttribute><w:r wsp:rsidR="00B17C0D"><w:t>Name</w:t></w:r></HeadingAttribute><RecurseChildren><w:r wsp:rsidR="00B17C0D"><w:t>false</w:t></w:r></RecurseChildren></Outline><Attribute><Name><w:r wsp:rsidR="001766F7" wsp:rsidRPr="001766F7"><w:t>Word Template Content</w:t></w:r></Name></Attribute></w:p></ns1:Artifact><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"/><w:sectPr wsp:rsidR="007F3E1C" wsp:rsidSect="007F3E1C"><w:hdr w:type="odd"><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="432" w:footer="432" w:gutter="0"/><w:pgNumType w:start="1"/><w:cols w:space="475"/><w:noEndnote/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.skynet/support/templates/Word Merge Template.xml b/org.eclipse.osee.framework.ui.skynet/support/templates/Word Merge Template.xml
new file mode 100644
index 00000000000..00a0addd86d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.skynet/support/templates/Word Merge Template.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://BeforeGUID/PrePendAAABG9urQeAB4H0+fU5xEg/AfterGUID" xmlns:ns1="http://www.w3.org/2001/XMLSchema" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>SRS</o:Title><o:Author>Ryan D. Brooks</o:Author><o:LastAuthor>Theron</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>1</o:TotalTime><o:LastPrinted>2007-03-22T22:27:00Z</o:LastPrinted><o:Created>2008-11-17T16:28:00Z</o:Created><o:LastSaved>2008-11-17T16:28:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>5</o:Words><o:Characters>33</o:Characters><o:Company>The Boeing Company</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>37</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Helvetica"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Courier"><w:panose-1 w:val="02070409020205020404"/><w:charset w:val="00"/><w:family w:val="Modern"/><w:notTrueType/><w:pitch w:val="fixed"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Tahoma"><w:panose-1 w:val="020B0604030504040204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="61007A87" w:usb-1="80000000" w:usb-2="00000008" w:usb-3="00000000" w:csb-0="000101FF" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="003A6350"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F89E6E26"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:pStyle w:val="APPENDIX1"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="APPENDIX2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="APPENDIX3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="APPENDIX4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="APPENDIX5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="APPENDIX6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="APPENDIX7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="APPENDIX8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="APPENDIX9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="016D5431"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="98C65BCE"/><w:lvl w:ilvl="0" w:tplc="94D2C566"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="0C4D206D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="4B543E40"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="0DE40F2C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="10AF29E5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="7520DAAE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="15EB1725"/><w:plt w:val="Multilevel"/><w:tmpl w:val="D902A83E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="1C970BBA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EB82E3A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="1D6C5FCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E710F038"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="APPENDIX %1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="0" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="720" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1440" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="1EC51BCC"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="256F5D56"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="290A1130"/><w:plt w:val="Multilevel"/><w:tmpl w:val="EAC4E6B8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="299E4F07"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="46E2B8B2"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="29C240FD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FCA4DC08"/><w:lvl w:ilvl="0" w:tplc="B5146A3E"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl2"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1224"/></w:tabs><w:ind w:left="1224" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="29CA5728"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="D00252C6"/><w:lvl w:ilvl="0" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="FFFFFFFF"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="FFFFFFFF" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="2A5411A0"/><w:plt w:val="Multilevel"/><w:tmpl w:val="2660867C"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="Heading1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="Heading2"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:pStyle w:val="Heading3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="Heading4"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:pStyle w:val="Heading5"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="Heading6"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:pStyle w:val="Heading7"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:pStyle w:val="Heading8"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:pStyle w:val="Heading9"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="2B1C06F5"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3B98963A"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="2B477730"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="33801DC4"/><w:lvl w:ilvl="0" w:tplc="2D8A4B4C"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl3"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3024"/></w:tabs><w:ind w:left="3024" w:hanging="2016"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2448"/></w:tabs><w:ind w:left="2448" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3168"/></w:tabs><w:ind w:left="3168" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3888"/></w:tabs><w:ind w:left="3888" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4608"/></w:tabs><w:ind w:left="4608" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5328"/></w:tabs><w:ind w:left="5328" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6048"/></w:tabs><w:ind w:left="6048" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6768"/></w:tabs><w:ind w:left="6768" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7488"/></w:tabs><w:ind w:left="7488" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="2B5B6B3C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5CC8E874"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:first-line="763"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="2D6545A6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="3F227848"/><w:name w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1296"/></w:tabs><w:ind w:left="1296" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:caps w:val="off"/><w:strike w:val="off"/><w:dstrike w:val="off"/><w:outline w:val="off"/><w:shadow w:val="off"/><w:emboss w:val="off"/><w:imprint w:val="off"/><w:vanish w:val="off"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:vertAlign w:val="baseline"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:pStyle w:val="listlvl2"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="-31680"/></w:tabs><w:ind w:left="1656" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl3"/><w:lvlText w:val="(%3)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2016"/></w:tabs><w:ind w:left="2016" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:pStyle w:val="listlvl4"/><w:lvlText w:val="(%4)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2376"/></w:tabs><w:ind w:left="2376" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl5"/><w:lvlText w:val="%5)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2736"/></w:tabs><w:ind w:left="2736" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:pStyle w:val="listlvl6"/><w:lvlText w:val="%6)."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3096"/></w:tabs><w:ind w:left="3096" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:hint="default"/><w:b w:val="off"/><w:i w:val="off"/><w:sz w:val="22"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="listlvl7"/><w:lvlText w:val="[%7]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3456"/></w:tabs><w:ind w:left="3456" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="[%8]."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="308239DA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="20"><w:lsid w:val="31A252E6"/><w:plt w:val="Multilevel"/><w:tmpl w:val="A9D83578"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="21"><w:lsid w:val="3B97448F"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart2"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="22"><w:lsid w:val="3C165F4A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79A06FE6"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="23"><w:lsid w:val="42BB3748"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="DBE464B0"/><w:lvl w:ilvl="0" w:tplc="26BAF6B0"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="bulletlvl1"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="648"/></w:tabs><w:ind w:left="648" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="ï‚·"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="24"><w:lsid w:val="47E309C3"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="25"><w:lsid w:val="5A401749"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CD8E61CE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="26"><w:lsid w:val="5A802BC9"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="27"><w:lsid w:val="5C3B1B76"/><w:plt w:val="Multilevel"/><w:tmpl w:val="CB0E7A2E"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="28"><w:lsid w:val="5E371EBB"/><w:plt w:val="Multilevel"/><w:tmpl w:val="DA56D440"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="29"><w:lsid w:val="60B71688"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5EA20814"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="30"><w:lsid w:val="6389497B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="AC5A6410"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:pStyle w:val="listlvl10"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="360" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="3"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1080" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:lvlText w:val="%3."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="1800" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2520" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3240" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="3960" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="4680" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5400" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6120" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="31"><w:lsid w:val="6469691A"/><w:plt w:val="Multilevel"/><w:tmpl w:val="E5D02024"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8.%9 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3082" w:hanging="3082"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="32"><w:lsid w:val="69A642CA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="33"><w:lsid w:val="74BA49AE"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:name w:val="listrestart"/><w:styleLink w:val="listreset"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="34"><w:lsid w:val="751E50EA"/><w:plt w:val="Multilevel"/><w:tmpl w:val="79E6FEDC"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2405" w:hanging="2405"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6.%7.%8 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2736" w:hanging="2736"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="35"><w:lsid w:val="7D9D3B47"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="36"><w:lsid w:val="7F0F313D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="F8FC63EE"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2160" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="2880" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3600" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="37"><w:lsid w:val="7F633FB7"/><w:plt w:val="Multilevel"/><w:tmpl w:val="5F5A52E8"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="3"/><w:suff w:val="Nothing"/><w:lvlText w:val="APPENDIX %1. "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="461" w:hanging="461"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="734" w:hanging="734"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1066" w:hanging="1066"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1397" w:hanging="1397"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1742" w:hanging="1742"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:suff w:val="Nothing"/><w:lvlText w:val="%1.%2.%3.%4.%5.%6 "/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2074" w:hanging="2074"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%7)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4320" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%8)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5040" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%9)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="5760" w:first-line="0"/></w:pPr><w:rPr><w:rFonts w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="23"/></w:list><w:list w:ilfo="2"><w:ilst w:val="12"/></w:list><w:list w:ilfo="3"><w:ilst w:val="18"/></w:list><w:list w:ilfo="4"><w:ilst w:val="14"/></w:list><w:list w:ilfo="5"><w:ilst w:val="6"/></w:list><w:list w:ilfo="6"><w:ilst w:val="26"/></w:list><w:list w:ilfo="7"><w:ilst w:val="5"/></w:list><w:list w:ilfo="8"><w:ilst w:val="13"/></w:list><w:list w:ilfo="9"><w:ilst w:val="30"/></w:list><w:list w:ilfo="10"><w:ilst w:val="7"/></w:list><w:list w:ilfo="11"><w:ilst w:val="18"/></w:list><w:list w:ilfo="12"><w:ilst w:val="27"/></w:list><w:list w:ilfo="13"><w:ilst w:val="36"/></w:list><w:list w:ilfo="14"><w:ilst w:val="2"/></w:list><w:list w:ilfo="15"><w:ilst w:val="28"/></w:list><w:list w:ilfo="16"><w:ilst w:val="17"/></w:list><w:list w:ilfo="17"><w:ilst w:val="31"/></w:list><w:list w:ilfo="18"><w:ilst w:val="4"/></w:list><w:list w:ilfo="19"><w:ilst w:val="20"/></w:list><w:list w:ilfo="20"><w:ilst w:val="15"/></w:list><w:list w:ilfo="21"><w:ilst w:val="37"/></w:list><w:list w:ilfo="22"><w:ilst w:val="22"/></w:list><w:list w:ilfo="23"><w:ilst w:val="25"/></w:list><w:list w:ilfo="24"><w:ilst w:val="34"/></w:list><w:list w:ilfo="25"><w:ilst w:val="0"/></w:list><w:list w:ilfo="26"><w:ilst w:val="33"/></w:list><w:list w:ilfo="27"><w:ilst w:val="21"/></w:list><w:list w:ilfo="28"><w:ilst w:val="16"/></w:list><w:list w:ilfo="29"><w:ilst w:val="19"/></w:list><w:list w:ilfo="30"><w:ilst w:val="18"/><w:lvlOverride w:ilvl="0"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="1"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="2"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="3"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="4"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="5"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="6"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="7"><w:startOverride w:val="1"/></w:lvlOverride><w:lvlOverride w:ilvl="8"><w:startOverride w:val="1"/></w:lvlOverride></w:list><w:list w:ilfo="31"><w:ilst w:val="11"/></w:list><w:list w:ilfo="32"><w:ilst w:val="1"/></w:list><w:list w:ilfo="33"><w:ilst w:val="35"/></w:list><w:list w:ilfo="34"><w:ilst w:val="8"/></w:list><w:list w:ilfo="35"><w:ilst w:val="29"/></w:list><w:list w:ilfo="36"><w:ilst w:val="14"/></w:list><w:list w:ilfo="37"><w:ilst w:val="10"/></w:list><w:list w:ilfo="38"><w:ilst w:val="9"/></w:list><w:list w:ilfo="39"><w:ilst w:val="3"/></w:list><w:list w:ilfo="40"><w:ilst w:val="24"/></w:list><w:list w:ilfo="41"><w:ilst w:val="32"/></w:list><w:ilfoMacAtCleanup w:val="5"/></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading1"/><w:keepNext/><w:keepLines/><w:pageBreakBefore/><w:listPr><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:kern w:val="28"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><wx:uiName wx:val="Heading 2"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading2"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><wx:uiName wx:val="Heading 3"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading3"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="900"/></w:tabs><w:spacing w:before="320" w:after="80"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><wx:uiName wx:val="Heading 4"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading4"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><wx:uiName wx:val="Heading 5"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading5"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><wx:uiName wx:val="Heading 6"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading6"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><wx:uiName wx:val="Heading 7"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading7"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="36"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1620"/></w:tabs><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><wx:uiName wx:val="Heading 8"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading8"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="7"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><wx:uiName wx:val="Heading 9"/><w:next w:val="paranormal"/><w:rsid w:val="009776CC"/><w:pPr><w:pStyle w:val="Heading9"/><w:keepNext/><w:keepLines/><w:listPr><w:ilvl w:val="8"/><w:ilfo w:val="36"/></w:listPr><w:spacing w:before="360" w:after="80"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="paranormal"><w:name w:val="para:normal"/><w:link w:val="paranormalChar"/><w:rsid w:val="009E6B3D"/><w:pPr><w:pStyle w:val="paranormal"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="64" w:after="80" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl3"><w:name w:val="list:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl3"/><w:listPr><w:ilvl w:val="2"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="2088"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang1"><w:name w:val="req lang:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A134C3"/><w:pPr><w:pStyle w:val="Header"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs><w:spacing w:before="20" w:after="0" w:line="180" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="proprietarycontd"><w:name w:val="proprietary:cont'd"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="proprietarycontd"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="200" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="16"/><w:sz-cs w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paracentered"><w:name w:val="para:centered"/><w:autoRedefine/><w:rsid w:val="00B43482"/><w:pPr><w:pStyle w:val="paracentered"/><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="80" w:after="80" w:line="240" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent2"><w:name w:val="para:indent2"/><w:autoRedefine/><w:rsid w:val="004417BE"/><w:pPr><w:pStyle w:val="paraindent2"/><w:tabs><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent3"><w:name w:val="para:indent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent3"/><w:tabs><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/><w:tab w:val="left" w:pos="9720"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="0085234B"/><w:pPr><w:pStyle w:val="Caption"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9720"/><w:tab w:val="left" w:pos="10800"/><w:tab w:val="left" w:pos="11880"/><w:tab w:val="left" w:pos="12960"/><w:tab w:val="left" w:pos="14040"/><w:tab w:val="left" w:pos="15120"/><w:tab w:val="left" w:pos="16200"/><w:tab w:val="left" w:pos="17280"/><w:tab w:val="left" w:pos="18360"/><w:tab w:val="left" w:pos="19440"/><w:tab w:val="left" w:pos="20520"/><w:tab w:val="left" w:pos="21600"/><w:tab w:val="left" w:pos="22680"/><w:tab w:val="left" w:pos="23760"/><w:tab w:val="left" w:pos="24840"/><w:tab w:val="left" w:pos="25920"/><w:tab w:val="left" w:pos="27000"/><w:tab w:val="left" w:pos="28080"/><w:tab w:val="left" w:pos="29160"/><w:tab w:val="left" w:pos="30240"/><w:tab w:val="left" w:pos="31320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent1"><w:name w:val="para:indent1"/><w:autoRedefine/><w:rsid w:val="007D424E"/><w:pPr><w:pStyle w:val="paraindent1"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4680"/><w:tab w:val="left" w:pos="5400"/><w:tab w:val="left" w:pos="6120"/><w:tab w:val="left" w:pos="6840"/><w:tab w:val="left" w:pos="7560"/><w:tab w:val="left" w:pos="8280"/><w:tab w:val="left" w:pos="9000"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="80" w:line="240" w:line-rule="at-least"/><w:ind w:left="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="Footer"/><w:tabs><w:tab w:val="center" w:pos="4320"/><w:tab w:val="right" w:pos="8640"/></w:tabs></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl4"><w:name w:val="list:lvl 4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl4"/><w:listPr><w:ilvl w:val="3"/><w:ilfo w:val="11"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead"><w:name w:val="RowHead"/><w:basedOn w:val="Heading1"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead"/><w:listPr><w:ilfo w:val="0"/></w:listPr><w:spacing w:before="100" w:after="100"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11"><w:name w:val="TableText11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOAHeading"/><w:spacing w:before="240" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:b-cs/><w:caps/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHeadL"><w:name w:val="RowHeadL"/><w:basedOn w:val="RowHead"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHeadL"/><w:spacing w:before="60" w:after="60"/><w:jc w:val="left"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11B"><w:name w:val="TableText11B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText11B"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofAuthorities"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="8640"/></w:tabs><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:next w:val="Normal"/><w:autoRedefine/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableofFigures"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="60" w:after="60"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00721F21"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="PageNumber"><w:name w:val="page number"/><wx:uiName wx:val="Page Number"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00D90577"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:dstrike w:val="off"/><w:sz w:val="20"/><w:sz-cs w:val="20"/><w:vertAlign w:val="baseline"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead11"><w:name w:val="RowHead11"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead11"/><w:listPr><w:ilvl w:val="12"/></w:listPr><w:spacing w:before="80" w:after="80"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText11C"><w:name w:val="TableText11C"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText11C"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Times New Roman"/><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl1"><w:name w:val="list:lvl 1"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl1"/><w:listPr><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="4320"/><w:tab w:val="left" w:pos="5040"/><w:tab w:val="left" w:pos="5760"/><w:tab w:val="left" w:pos="6480"/><w:tab w:val="left" w:pos="7200"/><w:tab w:val="left" w:pos="7920"/><w:tab w:val="left" w:pos="8640"/><w:tab w:val="left" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Helvetica"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl5"><w:name w:val="list:lvl 5"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl5"/><w:listPr><w:ilvl w:val="4"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="left" w:pos="3384"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl2"><w:name w:val="list:lvl 2"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilvl w:val="1"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="60" w:after="60" w:line="240" w:line-rule="at-least"/><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="AppendixTitle"><w:name w:val="Appendix Title"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="AppendixTitle"/><w:pageBreakBefore/><w:spacing w:before="120" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RowHead10"><w:name w:val="RowHead10"/><w:basedOn w:val="RowHead11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="RowHead10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC1"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="540"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="240"/><w:ind w:left="547" w:hanging="547"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:caps/><w:noProof/><w:sz w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC2"><w:name w:val="toc 2"/><wx:uiName wx:val="TOC 2"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00003D10"/><w:pPr><w:pStyle w:val="TOC2"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="900"/><w:tab w:val="right" w:leader="dot" w:pos="9360"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="907" w:hanging="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC3"><w:name w:val="toc 3"/><wx:uiName wx:val="TOC 3"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC3"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1260"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1260" w:hanging="900"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC4"><w:name w:val="toc 4"/><wx:uiName wx:val="TOC 4"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC4"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1620"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1620" w:hanging="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC5"><w:name w:val="toc 5"/><wx:uiName wx:val="TOC 5"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC5"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="1980"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="1980" w:hanging="1260"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC6"><w:name w:val="toc 6"/><wx:uiName wx:val="TOC 6"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC6"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2340"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2340" w:hanging="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:noProof/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC7"><w:name w:val="toc 7"/><wx:uiName wx:val="TOC 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC7"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2700"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:spacing w:before="0" w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="2700" w:hanging="1620"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC8"><w:name w:val="toc 8"/><wx:uiName wx:val="TOC 8"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC8"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="2970"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="2970" w:hanging="1710"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC9"><w:name w:val="toc 9"/><wx:uiName wx:val="TOC 9"/><w:next w:val="Normal"/><w:semiHidden/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TOC9"/><w:keepLines/><w:tabs><w:tab w:val="left" w:pos="3330"/><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:ind w:left="3330" w:hanging="1890"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="22"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="HeadingUnnumbered"><w:name w:val="Heading Unnumbered"/><w:next w:val="paranormal"/><w:autoRedefine/><w:rsid w:val="00107AA6"/><w:pPr><w:pStyle w:val="HeadingUnnumbered"/><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="80"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="24"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10"><w:name w:val="TableText10"/><w:basedOn w:val="TableText11"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableTextBCentered"><w:name w:val="TableTextB Centered"/><w:basedOn w:val="Normal"/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableTextBCentered"/><w:spacing w:line="220" w:line-rule="at-least"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10C"><w:name w:val="TableText10C"/><w:basedOn w:val="TableText11C"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="TableText10C"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10B"><w:name w:val="TableText10B"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00913874"/><w:pPr><w:pStyle w:val="TableText10B"/><w:spacing w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="acronym"><w:name w:val="acronym"/><w:autoRedefine/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="acronym"/><w:tabs><w:tab w:val="left" w:pos="2160"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="40" w:after="40"/><w:ind w:left="2160" w:hanging="2160"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl6"><w:name w:val="list:lvl 6"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl6"/><w:listPr><w:ilvl w:val="5"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="clear" w:pos="4320"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr1L"><w:name w:val="hdr1L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr1L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="hdr2L"><w:name w:val="hdr2L"/><w:basedOn w:val="Normal"/><w:rsid w:val="00721F21"/><w:pPr><w:pStyle w:val="hdr2L"/><w:tabs><w:tab w:val="left" w:pos="0"/><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="0" w:line="180" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl1"><w:name w:val="bullet:lvl 1"/><w:basedOn w:val="Normal"/><w:link w:val="bulletlvl1CharChar"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl1"/><w:listPr><w:ilfo w:val="1"/></w:listPr><w:spacing w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl2"><w:name w:val="bullet:lvl 2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00143D5A"/><w:pPr><w:pStyle w:val="bulletlvl2"/><w:widowControl w:val="off"/><w:listPr><w:ilfo w:val="2"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1224"/><w:tab w:val="left" w:pos="648"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1728" w:hanging="1080"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="paraindent4"><w:name w:val="para:indent4"/><w:basedOn w:val="paraindent3"/><w:autoRedefine/><w:rsid w:val="0071606D"/><w:pPr><w:pStyle w:val="paraindent4"/><w:ind w:left="1440"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl7"><w:name w:val="list:lvl 7"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl7"/><w:listPr><w:ilvl w:val="6"/><w:ilfo w:val="11"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="360"/><w:tab w:val="clear" w:pos="720"/><w:tab w:val="clear" w:pos="1080"/><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="clear" w:pos="2160"/><w:tab w:val="clear" w:pos="2520"/><w:tab w:val="clear" w:pos="2880"/><w:tab w:val="clear" w:pos="3240"/><w:tab w:val="clear" w:pos="3600"/><w:tab w:val="clear" w:pos="3960"/><w:tab w:val="left" w:pos="3024"/></w:tabs><w:spacing w:after="40"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCfiguretitle"><w:name w:val="TOC:figure title"/><w:basedOn w:val="Caption"/><w:autoRedefine/><w:rsid w:val="00894991"/><w:pPr><w:pStyle w:val="TOCfiguretitle"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note"><w:name w:val="note"/><w:basedOn w:val="Normal"/><w:rsid w:val="006E0AB6"/><w:pPr><w:pStyle w:val="note"/><w:spacing w:before="80" w:after="80"/><w:ind w:left="1656" w:right="720" w:hanging="936"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang2"><w:name w:val="req lang:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang2"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang3"><w:name w:val="req lang:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1080"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang4"><w:name w:val="req lang:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang4"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang5"><w:name w:val="req lang:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang5"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="1800"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang6"><w:name w:val="req lang:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00F25A7A"/><w:pPr><w:pStyle w:val="reqlang6"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="60" w:after="60"/><w:ind w:left="2160"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="statedef"><w:name w:val="state def"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DE6BA0"/><w:pPr><w:pStyle w:val="statedef"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/></w:tabs><w:spacing w:before="80" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:caps/><w:color w:val="408040"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="intentblank"><w:name w:val="intent:blank"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="000B79E8"/><w:pPr><w:pStyle w:val="intentblank"/><w:spacing w:before="6480" w:after="0"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="code"><w:name w:val="code"/><w:basedOn w:val="Normal"/><w:rsid w:val="006D4514"/><w:pPr><w:pStyle w:val="code"/><w:spacing w:before="80" w:after="80" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="parapage"><w:name w:val="para:page"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00DD22A9"/><w:pPr><w:pStyle w:val="parapage"/><w:pageBreakBefore/><w:spacing w:before="80" w:after="80"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCtabletitle"><w:name w:val="TOC:table title"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="00B869CD"/><w:pPr><w:pStyle w:val="TOCtabletitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRitem"><w:name w:val="RCR:item"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="007A1F4F"/><w:pPr><w:pStyle w:val="RCRitem"/><w:tabs><w:tab w:val="left" w:pos="1800"/></w:tabs><w:spacing w:before="120"/><w:ind w:left="1800" w:right="720" w:hanging="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="RCRheader"><w:name w:val="RCR:header"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006D781E"/><w:pPr><w:pStyle w:val="RCRheader"/><w:tabs><w:tab w:val="left" w:pos="792"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="right" w:leader="underscore" w:pos="8640"/></w:tabs><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:sz-cs w:val="22"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="line"><w:name w:val="line"/><w:basedOn w:val="Normal"/><w:autoRedefine/><w:rsid w:val="006B63C2"/><w:pPr><w:pStyle w:val="line"/><w:spacing w:before="0" w:line="40" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="12"/><w:sz-cs w:val="12"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang7"><w:name w:val="req lang: 7"/><w:basedOn w:val="reqlang6"/><w:rsid w:val="00C0337E"/><w:pPr><w:pStyle w:val="reqlang7"/><w:ind w:left="2520"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang70"><w:name w:val="req lang:7"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang70"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang8"><w:name w:val="req lang:8"/><w:basedOn w:val="reqlang7"/><w:rsid w:val="004C603C"/><w:pPr><w:pStyle w:val="reqlang8"/><w:ind w:left="2880"/></w:pPr><w:rPr><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="reqlang9"><w:name w:val="req lang:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="007534C9"/><w:pPr><w:pStyle w:val="reqlang9"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="3240"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="DocumentMap"><w:name w:val="Document Map"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00AF20CB"/><w:pPr><w:pStyle w:val="DocumentMap"/><w:shd w:val="clear" w:color="auto" w:fill="000080"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment1"><w:name w:val="comment:1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment1"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="360"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment2"><w:name w:val="comment:2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment2"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="720"/><w:jc w:val="both"/></w:pPr><w:rPr><w:rFonts w:cs="Arial"/><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment3"><w:name w:val="comment:3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment3"/><w:tabs><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="720"/><w:tab w:val="left" w:pos="1080"/><w:tab w:val="left" w:pos="1440"/><w:tab w:val="left" w:pos="1800"/><w:tab w:val="left" w:pos="2160"/><w:tab w:val="left" w:pos="2520"/><w:tab w:val="left" w:pos="2880"/><w:tab w:val="left" w:pos="3240"/><w:tab w:val="left" w:pos="3600"/><w:tab w:val="left" w:pos="3960"/><w:tab w:val="left" w:pos="4320"/></w:tabs><w:autoSpaceDE w:val="off"/><w:autoSpaceDN w:val="off"/><w:adjustRightInd w:val="off"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1080"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/><w:sz-cs w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment4"><w:name w:val="comment:4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment4"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1440"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment5"><w:name w:val="comment:5"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment5"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment6"><w:name w:val="comment:6"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment6"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2160"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment7"><w:name w:val="comment:7"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment7"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2520"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment8"><w:name w:val="comment:8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment8"/><w:spacing w:before="60" w:after="80"/><w:ind w:left="2880"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="comment9"><w:name w:val="comment:9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00111B46"/><w:pPr><w:pStyle w:val="comment9"/><w:spacing w:after="80"/><w:ind w:left="3240"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlheader"><w:name w:val="dl:header"/><w:basedOn w:val="paranormal"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlheader"/><w:spacing w:before="240" w:after="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier" w:h-ansi="Courier"/><wx:font wx:val="Courier"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlbody"><w:name w:val="dl:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlbody"/><w:spacing w:before="0"/><w:ind w:left="360"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocheader"><w:name w:val="dl_proc:header"/><w:basedOn w:val="dlbody"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocheader"/><w:spacing w:before="240"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dlprocbody"><w:name w:val="dl_proc:body"/><w:basedOn w:val="dlprocheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dlprocbody"/><w:spacing w:before="0"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="dldescription"><w:name w:val="dl:description"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="dldescription"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapheader"><w:name w:val="bitmap:header"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapheader"/></w:pPr><w:rPr><wx:font wx:val="Courier"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bitmapbody"><w:name w:val="bitmap:body"/><w:basedOn w:val="dlheader"/><w:rsid w:val="00071300"/><w:pPr><w:pStyle w:val="bitmapbody"/><w:spacing w:before="0"/></w:pPr><w:rPr><wx:font wx:val="Courier"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX1"><w:name w:val="APPENDIX 1"/><w:basedOn w:val="Normal"/><w:next w:val="paranormal"/><w:rsid w:val="004978C4"/><w:pPr><w:pStyle w:val="APPENDIX1"/><w:listPr><w:ilfo w:val="25"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="1440"/></w:tabs><w:spacing w:before="152" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX2"><w:name w:val="APPENDIX 2"/><w:basedOn w:val="APPENDIX1"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX2"/><w:listPr><w:ilvl w:val="1"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX3"><w:name w:val="APPENDIX 3"/><w:basedOn w:val="APPENDIX2"/><w:next w:val="paranormal"/><w:rsid w:val="00E904D2"/><w:pPr><w:pStyle w:val="APPENDIX3"/><w:listPr><w:ilvl w:val="2"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage18pt"><w:name w:val="Title Page 18pt"/><w:basedOn w:val="Normal"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage18pt"/><w:spacing w:before="0" w:after="60" w:line="240" w:line-rule="auto"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:color w:val="auto"/><w:sz w:val="36"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage16pt"><w:name w:val="Title Page 16pt"/><w:basedOn w:val="TitlePage18pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage16pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage14pt"><w:name w:val="Title Page 14pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="0033770F"/><w:pPr><w:pStyle w:val="TitlePage14pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b w:val="off"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10pt"><w:name w:val="para 10pt"/><w:basedOn w:val="Normal"/><w:link w:val="para10ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para10pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para10ptnospacing"><w:name w:val="para 10pt no spacing"/><w:basedOn w:val="para10pt"/><w:rsid w:val="004A1CCA"/><w:pPr><w:pStyle w:val="para10ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableText10nospacing"><w:name w:val="TableText10 no spacing"/><w:basedOn w:val="TableText10"/><w:rsid w:val="00D72507"/><w:pPr><w:pStyle w:val="TableText10nospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8pt"><w:name w:val="para 8pt"/><w:basedOn w:val="Normal"/><w:link w:val="para8ptChar"/><w:rsid w:val="004E3337"/><w:pPr><w:pStyle w:val="para8pt"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="16"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paranormalChar"><w:name w:val="para:normal Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="paranormal"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b-cs/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="bulletlvl1CharChar"><w:name w:val="bullet:lvl 1 Char Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="bulletlvl1"/><w:rsid w:val="00C93CA3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:color w:val="000000"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ParagraphText"><w:name w:val="ParagraphText"/><w:basedOn w:val="Normal"/><w:rsid w:val="00C93CA3"/><w:pPr><w:pStyle w:val="ParagraphText"/><w:spacing w:before="0" w:after="120" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"/><wx:font wx:val="Times New Roman"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl10"><w:name w:val="list lvl 1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A81E8C"/><w:pPr><w:pStyle w:val="listlvl10"/><w:listPr><w:ilfo w:val="9"/></w:listPr><w:tabs><w:tab w:val="left" w:pos="936"/></w:tabs><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX4"><w:name w:val="APPENDIX 4"/><w:basedOn w:val="APPENDIX3"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX4"/><w:listPr><w:ilvl w:val="3"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX5"><w:name w:val="APPENDIX 5"/><w:basedOn w:val="APPENDIX4"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX5"/><w:listPr><w:ilvl w:val="4"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX6"><w:name w:val="APPENDIX 6"/><w:basedOn w:val="APPENDIX5"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX6"/><w:listPr><w:ilvl w:val="5"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX7"><w:name w:val="APPENDIX 7"/><w:basedOn w:val="APPENDIX6"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX7"/><w:listPr><w:ilvl w:val="6"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX8"><w:name w:val="APPENDIX 8"/><w:basedOn w:val="APPENDIX7"/><w:next w:val="paranormal"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX8"/><w:listPr><w:ilvl w:val="7"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="APPENDIX9"><w:name w:val="APPENDIX 9"/><w:basedOn w:val="APPENDIX8"/><w:rsid w:val="009B7093"/><w:pPr><w:pStyle w:val="APPENDIX9"/><w:listPr><w:ilvl w:val="8"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00B47E5D"/><w:pPr><w:pStyle w:val="BalloonText"/></w:pPr><w:rPr><w:rFonts w:ascii="Tahoma" w:h-ansi="Tahoma" w:cs="Tahoma"/><wx:font wx:val="Tahoma"/><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="list" w:styleId="listreset"><w:name w:val="listreset"/><w:basedOn w:val="NoList"/><w:rsid w:val="00D25E39"/><w:pPr><w:listPr><w:ilfo w:val="26"/></w:listPr></w:pPr></w:style><w:style w:type="paragraph" w:styleId="bulletlvl3"><w:name w:val="bullet:lvl 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00EF5226"/><w:pPr><w:pStyle w:val="bulletlvl3"/><w:listPr><w:ilfo w:val="28"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="3024"/><w:tab w:val="left" w:pos="360"/><w:tab w:val="left" w:pos="1008"/></w:tabs><w:spacing w:after="80"/><w:ind w:left="1368" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentText"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:semiHidden/><w:rsid w:val="00E40969"/><w:pPr><w:pStyle w:val="CommentSubject"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TitlePage22pt"><w:name w:val="Title Page 22pt"/><w:basedOn w:val="TitlePage16pt"/><w:rsid w:val="005F35C4"/><w:pPr><w:pStyle w:val="TitlePage22pt"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="44"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para"><w:name w:val="para"/><w:basedOn w:val="Normal"/><w:link w:val="paraChar"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="para"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/><w:jc w:val="both"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="paraChar"><w:name w:val="para Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="para"/><w:rsid w:val="0057061B"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl20"><w:name w:val="list lvl 2"/><w:basedOn w:val="ListNumber3"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="listlvl20"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber3"><w:name w:val="List Number 3"/><w:basedOn w:val="Normal"/><w:rsid w:val="0057061B"/><w:pPr><w:pStyle w:val="ListNumber3"/><w:tabs><w:tab w:val="list" w:pos="1512"/></w:tabs><w:ind w:left="1512" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="008B1AB7"/><w:pPr><w:spacing w:before="40" w:after="40" w:line="240" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="character" w:styleId="para8ptChar"><w:name w:val="para 8pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para8pt"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptunderline"><w:name w:val="para 8pt underline"/><w:basedOn w:val="para8pt"/><w:link w:val="para8ptunderlineChar"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptunderline"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="para8ptunderlineChar"><w:name w:val="para 8pt underline Char"/><w:basedOn w:val="para8ptChar"/><w:link w:val="para8ptunderline"/><w:rsid w:val="007921D3"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="16"/><w:u w:val="single"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para8ptnospacing"><w:name w:val="para 8pt no spacing"/><w:basedOn w:val="para8pt"/><w:rsid w:val="007921D3"/><w:pPr><w:pStyle w:val="para8ptnospacing"/><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="listlvl0"><w:name w:val="list lvl 0"/><w:basedOn w:val="ListNumber"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="listlvl0"/><w:spacing w:before="72" w:after="72" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:color w:val="auto"/><w:sz w:val="24"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListNumber"><w:name w:val="List Number"/><w:basedOn w:val="Normal"/><w:rsid w:val="00A233DA"/><w:pPr><w:pStyle w:val="ListNumber"/><w:tabs><w:tab w:val="list" w:pos="504"/></w:tabs><w:ind w:left="504" w:hanging="504"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="character" w:styleId="para10ptChar"><w:name w:val="para 10pt Char"/><w:basedOn w:val="paraChar"/><w:link w:val="para10pt"/><w:rsid w:val="0015054E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="00B8047C"/><w:rPr><w:color w:val="800080"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart8"><w:name w:val="micro:art8"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart8"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart9"><w:name w:val="micro:art9"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart9"/><w:spacing w:before="0" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="microart10"><w:name w:val="micro:art10"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D1251A"/><w:pPr><w:pStyle w:val="microart10"/><w:spacing w:before="120" w:after="0" w:line="220" w:line-rule="at-least"/></w:pPr><w:rPr><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl1"><w:name w:val="Indent:Listlvl1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00B7285A"/><w:pPr><w:pStyle w:val="IndentListlvl1"/><w:spacing w:before="60" w:after="60"/><w:ind w:left="1296"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl2"><w:name w:val="Indent:Listlvl2"/><w:basedOn w:val="IndentListlvl1"/><w:rsid w:val="008B2A59"/><w:pPr><w:pStyle w:val="IndentListlvl2"/><w:ind w:left="1656"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl3"><w:name w:val="Indent:Listlvl3"/><w:basedOn w:val="IndentListlvl2"/><w:rsid w:val="008B2A59"/><w:pPr><w:pStyle w:val="IndentListlvl3"/><w:ind w:left="2016"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl4"><w:name w:val="Indent:Listlvl4"/><w:basedOn w:val="IndentListlvl3"/><w:rsid w:val="008B2A59"/><w:pPr><w:pStyle w:val="IndentListlvl4"/><w:ind w:left="2376"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl5"><w:name w:val="Indent:Listlvl5"/><w:basedOn w:val="IndentListlvl4"/><w:rsid w:val="008B2A59"/><w:pPr><w:pStyle w:val="IndentListlvl5"/><w:ind w:left="2736"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl6"><w:name w:val="Indent:Listlvl6"/><w:basedOn w:val="IndentListlvl5"/><w:rsid w:val="008B2A59"/><w:pPr><w:pStyle w:val="IndentListlvl6"/><w:ind w:left="3096"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IndentListlvl7"><w:name w:val="Indent:Listlvl7"/><w:basedOn w:val="IndentListlvl6"/><w:rsid w:val="008B2A59"/><w:pPr><w:pStyle w:val="IndentListlvl7"/><w:ind w:left="3456"/></w:pPr><w:rPr><wx:font wx:val="Arial"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="46082"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:displayBackgroundShape/><w:doNotEmbedSystemFonts/><w:bordersDontSurroundHeader/><w:bordersDontSurroundFooter/><w:attachedTemplate w:val=""/><w:documentProtection w:formatting="on" w:enforcement="off"/><w:defaultTabStop w:val="720"/><w:doNotHyphenateCaps/><w:drawingGridHorizontalSpacing w:val="120"/><w:drawingGridVerticalSpacing w:val="120"/><w:displayHorizontalDrawingGridEvery w:val="0"/><w:displayVerticalDrawingGridEvery w:val="3"/><w:useMarginsForDrawingGridOrigin/><w:doNotShadeFormData/><w:punctuationKerning/><w:characterSpacingControl w:val="CompressPunctuation"/><w:optimizeForBrowser/><w:validateAgainstSchema w:val="off"/><w:saveInvalidXML/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:hdrShapeDefaults><o:shapedefaults v:ext="edit" spidmax="46082"/></w:hdrShapeDefaults><w:footnotePr><w:footnote w:type="separator"><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/></w:footnote><w:footnote w:type="continuation-separator"><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/></w:footnote></w:footnotePr><w:endnotePr><w:endnote w:type="separator"><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"><w:r><w:separator/></w:r></w:p><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/></w:endnote><w:endnote w:type="continuation-separator"><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"><w:r><w:continuationSeparator/></w:r></w:p><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/><w:p wsp:rsidR="0036289B" wsp:rsidRDefault="0036289B"/></w:endnote></w:endnotePr><w:compat><w:footnoteLayoutLikeWW8/><w:shapeLayoutLikeWW8/><w:alignTablesRowByRow/><w:forgetLastTabAlignment/><w:doNotUseHTMLParagraphAutoSpacing/><w:layoutRawTableWidth/><w:layoutTableRowsApart/><w:useWord97LineBreakingRules/><w:dontAllowFieldEndSelect/><w:useWord2002TableStyleRules/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00244327"/><wsp:rsid wsp:val="000675EF"/><wsp:rsid wsp:val="00244327"/><wsp:rsid wsp:val="0036289B"/><wsp:rsid wsp:val="00391FB0"/><wsp:rsid wsp:val="0044041B"/><wsp:rsid wsp:val="004E1CA2"/><wsp:rsid wsp:val="005C2020"/><wsp:rsid wsp:val="005C6782"/><wsp:rsid wsp:val="006D2836"/><wsp:rsid wsp:val="00727815"/><wsp:rsid wsp:val="007F3E1C"/><wsp:rsid wsp:val="008B2A59"/><wsp:rsid wsp:val="009020C5"/><wsp:rsid wsp:val="00911F75"/><wsp:rsid wsp:val="009C3FEA"/><wsp:rsid wsp:val="00A57881"/><wsp:rsid wsp:val="00AE0097"/><wsp:rsid wsp:val="00B17C0D"/><wsp:rsid wsp:val="00B7285A"/><wsp:rsid wsp:val="00C07028"/><wsp:rsid wsp:val="00CC49D3"/><wsp:rsid wsp:val="00D86D66"/><wsp:rsid wsp:val="00E46F31"/></wsp:rsids></w:docPr><w:body><wx:sect><ns1:Artifact><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="004E1CA2"><Set_Name><w:r wsp:rsidR="00B17C0D"><w:t>Default</w:t></w:r></Set_Name><Attribute><Name><w:r wsp:rsidR="005C2020" wsp:rsidRPr="005C2020"><w:t>Word Template Content</w:t></w:r></Name></Attribute></w:p></ns1:Artifact><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"/><w:sectPr wsp:rsidR="007F3E1C" wsp:rsidSect="007F3E1C"><w:hdr w:type="odd"><w:p wsp:rsidR="007F3E1C" wsp:rsidRDefault="007F3E1C"><w:pPr><w:pStyle w:val="Header"/></w:pPr></w:p></w:hdr><w:pgSz w:w="12240" w:h="15840" w:code="1"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="432" w:footer="432" w:gutter="0"/><w:pgNumType w:start="1"/><w:cols w:space="475"/><w:noEndnote/></w:sectPr></wx:sect></w:body></w:wordDocument>\ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/.classpath b/org.eclipse.osee.framework.ui.swt/.classpath
new file mode 100644
index 00000000000..751c8f2e504
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/.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.framework.ui.swt/.project b/org.eclipse.osee.framework.ui.swt/.project
new file mode 100644
index 00000000000..3b8c7b8131f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.swt</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.swt/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.ui.swt/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.ui.swt/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.swt/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..05ea2728a70
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Swt Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.swt;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.swt.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.swt,
+ org.eclipse.jface,
+ org.eclipse.jface.text,
+ org.eclipse.ui
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.framework.ui.swt.styledText
+Bundle-ClassPath: library.jar,
+ .
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.framework.ui.swt/build.properties b/org.eclipse.osee.framework.ui.swt/build.properties
new file mode 100644
index 00000000000..2a9d9751686
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ library.jar,\
+ src/
+source.library.jar = src/
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ALayout.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ALayout.java
new file mode 100644
index 00000000000..22e68486a7a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ALayout.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.framework.ui.swt;
+
+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.ToolBar;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ALayout {
+
+ public static GridLayout getZeroMarginLayout(int numColumns, boolean equalColumnWidth) {
+ GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ layout.makeColumnsEqualWidth = equalColumnWidth;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ return layout;
+ }
+
+ public static GridLayout getZeroMarginLayout() {
+ return getZeroMarginLayout(1, false);
+ }
+
+ public static Composite createCommonPageComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = 0;
+ composite.setLayout(layout);
+
+ return composite;
+ }
+
+ public static ToolBar createCommonToolBar(Composite parent) {
+ Composite toolBarComposite = new Composite(parent, SWT.BORDER);
+ GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false, 1, 1);
+ toolBarComposite.setLayoutData(gridData);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ toolBarComposite.setLayout(layout);
+
+ ToolBar toolBar = new ToolBar(toolBarComposite, SWT.FLAT | SWT.RIGHT);
+ gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, true, 1, 1);
+ toolBar.setLayoutData(gridData);
+ return toolBar;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Activator.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Activator.java
new file mode 100644
index 00000000000..c458a7b6570
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Activator.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.framework.ui.swt;
+
+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 = "osee.swt";
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#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.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ColumnSorter.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ColumnSorter.java
new file mode 100644
index 00000000000..2326a0b007d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ColumnSorter.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.framework.ui.swt;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ColumnSorter extends ViewerSorter {
+ private final ITableLabelProvider labelProvider;
+ private int columnToSort;
+ private boolean ascending;
+
+ public ColumnSorter(ITableLabelProvider labelProvider) {
+ this(labelProvider, 0);
+ }
+
+ public ColumnSorter(ITableLabelProvider labelProvider, int columnToSort) {
+ this.labelProvider = labelProvider;
+ this.columnToSort = columnToSort;
+ this.ascending = true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ int value;
+
+ String str1 = labelProvider.getColumnText(o1, columnToSort);
+ String str2 = labelProvider.getColumnText(o2, columnToSort);
+
+ // Try to do numeric sorting
+ Integer val1 = null;
+ Integer val2 = null;
+ try {
+ val1 = getIntValue(str1);
+ } catch (NumberFormatException ex) {
+ // don't really care
+ }
+ try {
+ val2 = getIntValue(str2);
+ } catch (NumberFormatException ex) {
+ // don't really care
+ }
+
+ if (val1 != null && val2 != null) {
+ value = val1 - val2;
+ } else if (val1 == null ^ val2 == null) {
+ // Text goes after numbers
+ return val1 == null ? 1 : -1;
+ } else {
+ value = getComparator().compare(str1, str2);
+ }
+ return value * (ascending ? 1 : -1);
+ }
+
+ /**
+ * Try and retrieve a number from a string. If a "..." is in the string, then only the portion of the string prior to
+ * the "..." will be used.
+ *
+ * @param string
+ * @return
+ * @throws NumberFormatException
+ */
+ private int getIntValue(String string) throws NumberFormatException {
+ int elipseIndex;
+
+ elipseIndex = string.indexOf("...");
+ if (elipseIndex != -1) {
+ return Integer.parseInt(string.substring(0, elipseIndex));
+ } else {
+ return Integer.parseInt(string);
+ }
+ }
+
+ /**
+ * @param columnToSort The columnToSort to set.
+ */
+ public void setColumnToSort(int columnToSort) {
+ if (this.columnToSort == columnToSort) {
+ ascending = !ascending;
+ } else {
+ this.columnToSort = columnToSort;
+ ascending = true;
+ }
+ }
+
+ /**
+ * @return Returns the ascending.
+ */
+ public boolean isAscending() {
+ return ascending;
+ }
+
+ /**
+ * @param ascending The ascending to set.
+ */
+ public void setAscending(boolean ascending) {
+ this.ascending = ascending;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/CustomTableCellEditor.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/CustomTableCellEditor.java
new file mode 100644
index 00000000000..cfa3f3adfed
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/CustomTableCellEditor.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.framework.ui.swt;
+
+import java.util.BitSet;
+import org.eclipse.swt.widgets.TableItem;
+
+public abstract class CustomTableCellEditor<T> {
+
+ protected final BitSet doNotEditList = new BitSet();
+
+ /**
+ * Called when the user has typed a value and then presses <I><B>Enter</B></I>.
+ *
+ * @param itemIndex the zero relative index of the {@link TableItem} of the cell to be edited
+ * @param value the current selection in the cell before it lost focus
+ * @param previousValue the value that was in the cell before the edit took place
+ * @return the value that will be actually written into the table's cell
+ */
+ abstract protected T applyValue(final int itemIndex, final T value, final T previousValue);
+
+ /**
+ * Called when the cell editor has lost focus.
+ *
+ * @param itemIndex the row index of the TableItem's cell that has lost focus
+ * @param value the current value of the cell just before it lost focus
+ * @param previousValue the value of the cell before editing began
+ * @return the value that cekk will be set to when focus is lost
+ */
+ abstract protected T focusLost(final int itemIndex, final T value, final T previousValue);
+
+ /**
+ * Sets the rows of the table that will not be editted by this cell editor
+ *
+ * @param list a list of table row indices
+ */
+ public void setNotEditableList(final int... list) {
+ doNotEditList.clear();
+ for (int item : list) {
+ doNotEditList.set(item);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DialogUtil.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DialogUtil.java
new file mode 100644
index 00000000000..f9b5f253109
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DialogUtil.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.framework.ui.swt;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.DialogPage;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class DialogUtil {
+
+ /**
+ * Applies the status to a dialog page
+ */
+ public static void applyToStatusLine(DialogPage page, IStatus status) {
+ String errorMessage = null;
+ String warningMessage = null;
+ String statusMessage = status.getMessage();
+ if (statusMessage.length() > 0) {
+ if (status.matches(IStatus.ERROR)) {
+ errorMessage = statusMessage;
+ } else if (!status.isOK()) {
+ warningMessage = statusMessage;
+ }
+ }
+ page.setErrorMessage(errorMessage);
+ page.setMessage(warningMessage);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizard.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizard.java
new file mode 100644
index 00000000000..d5f33849297
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizard.java
@@ -0,0 +1,398 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+public abstract class DynamicWizard implements IWizard {
+ /**
+ * Image registry key of the default image for wizard pages (value
+ * <code>"org.eclipse.jface.wizard.Wizard.pageImage"</code>).
+ */
+ public static final String DEFAULT_IMAGE = "org.eclipse.jface.wizard.Wizard.pageImage"; //$NON-NLS-1$
+ /*
+ * Register the default page image
+ */
+ static {
+ JFaceResources.getImageRegistry().put(DEFAULT_IMAGE,
+ ImageDescriptor.createFromFile(Wizard.class, "images/page.gif"));//$NON-NLS-1$
+ }
+
+ /**
+ * The wizard container this wizard belongs to; <code>null</code> if none.
+ */
+ private IWizardContainer container = null;
+
+ /**
+ * This wizard's list of pages (element type: <code>IWizardPage</code>).
+ */
+ private Map<String, IWizardPage> pages = new HashMap<String, IWizardPage>();
+
+ /**
+ * Indicates whether this wizard needs a progress monitor.
+ */
+ private boolean needsProgressMonitor = false;
+
+ /**
+ * Indicates whether this wizard needs previous and next buttons even if the wizard has only one page.
+ */
+ private boolean forcePreviousAndNextButtons = false;
+
+ /**
+ * Indicates whether this wizard supports help.
+ */
+ private boolean isHelpAvailable = false;
+
+ /**
+ * The default page image for pages without one of their one; <code>null</code> if none.
+ */
+ private Image defaultImage = null;
+
+ /**
+ * The default page image descriptor, used for creating a default page image if required; <code>null</code> if
+ * none.
+ */
+ private ImageDescriptor defaultImageDescriptor = JFaceResources.getImageRegistry().getDescriptor(DEFAULT_IMAGE);
+
+ /**
+ * The color of the wizard title bar; <code>null</code> if none.
+ */
+ private RGB titleBarColor = null;
+
+ /**
+ * The window title string for this wizard; <code>null</code> if none.
+ */
+ private String windowTitle = null;
+
+ /**
+ * The dialog settings for this wizard; <code>null</code> if none.
+ */
+ private IDialogSettings dialogSettings = null;
+
+ private IWizardPage startingPage = null;
+
+ /**
+ * Creates a new empty wizard.
+ */
+ protected DynamicWizard() {
+ super();
+ }
+
+ /**
+ * Adds a new page to this wizard. The page is inserted at the end of the page list.
+ *
+ * @param page the new page
+ */
+ public void addPage(IWizardPage page) {
+ if (!pages.containsKey(page.getName())) {
+ pages.put(page.getName(), page);
+ page.setWizard(this);
+ }
+ }
+
+ /**
+ * The <code>Wizard</code> implementation of this <code>IWizard</code> method does nothing. Subclasses should
+ * extend if extra pages need to be added before the wizard opens. New pages should be added by calling
+ * <code>addPage</code>.
+ */
+ public void addPages() {
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public boolean canFinish() {
+ Set<String> keys = pages.keySet();
+ for (String key : keys) {
+ if (!pages.get(key).isPageComplete()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * The <code>Wizard</code> implementation of this <code>IWizard</code> method creates all the pages controls
+ * using <code>IDialogPage.createControl</code>. Subclasses should reimplement this method if they want to delay
+ * creating one or more of the pages lazily. The framework ensures that the contents of a page will be created before
+ * attempting to show it.
+ */
+ public void createPageControls(Composite pageContainer) {
+ // the default behavior is to create all the pages controls
+ Set<String> keys = pages.keySet();
+ for (String key : keys) {
+ IWizardPage page = pages.get(key);
+ page.createControl(pageContainer);
+ // page is responsible for ensuring the created control is
+ // accessable
+ // via getControl.
+ Assert.isNotNull(page.getControl());
+ }
+ }
+
+ /**
+ * The <code>Wizard</code> implementation of this <code>IWizard</code> method disposes all the pages controls
+ * using <code>DialogPage.dispose</code>. Subclasses should extend this method if the wizard instance maintains
+ * addition SWT resource that need to be disposed.
+ */
+ public void dispose() {
+ // notify pages
+ Set<String> keys = pages.keySet();
+ for (String key : keys) {
+ (pages.get(key)).dispose();
+ }
+ // dispose of image
+ if (defaultImage != null) {
+ JFaceResources.getResources().destroyImage(defaultImageDescriptor);
+ defaultImage = null;
+ }
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public IWizardContainer getContainer() {
+ return container;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public Image getDefaultPageImage() {
+ if (defaultImage == null) {
+ defaultImage = JFaceResources.getResources().createImageWithDefault(defaultImageDescriptor);
+ }
+ return defaultImage;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public IDialogSettings getDialogSettings() {
+ return dialogSettings;
+ }
+
+ public IWizardPage getPage(String name) {
+ return pages.get(name);
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard. The default behavior is to return the page that was
+ * added to this wizard after the given page.
+ */
+ public IWizardPage getNextPage(IWizardPage page) {
+ return page.getNextPage();
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public int getPageCount() {
+ return pages.size();
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public IWizardPage[] getPages() {
+ Collection<IWizardPage> collectionOfPages = pages.values();
+ return (IWizardPage[]) collectionOfPages.toArray(new IWizardPage[collectionOfPages.size()]);
+ }
+
+ public boolean containsPage(IWizardPage page) {
+ Set<String> pageNames = pages.keySet();
+ return pageNames.contains(page.getName());
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard. The default behavior is to return the page that was
+ * added to this wizard before the given page.
+ */
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ return page.getPreviousPage();
+ }
+
+ /**
+ * Returns the wizard's shell if the wizard is visible. Otherwise <code>null</code> is returned.
+ *
+ * @return Shell
+ */
+ public Shell getShell() {
+ if (container == null) return null;
+ return container.getShell();
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard. By default this is the first page inserted into the
+ * wizard.
+ */
+ public IWizardPage getStartingPage() {
+ return this.startingPage;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public RGB getTitleBarColor() {
+ return titleBarColor;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public String getWindowTitle() {
+ return windowTitle;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public boolean isHelpAvailable() {
+ return isHelpAvailable;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public boolean needsPreviousAndNextButtons() {
+ return forcePreviousAndNextButtons || pages.size() > 1;
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public boolean needsProgressMonitor() {
+ return needsProgressMonitor;
+ }
+
+ /**
+ * The <code>Wizard</code> implementation of this <code>IWizard</code> method does nothing and returns
+ * <code>true</code>. Subclasses should reimplement this method if they need to perform any special cancel
+ * processing for their wizard.
+ */
+ public boolean performCancel() {
+ return true;
+ }
+
+ /**
+ * Subclasses must implement this <code>IWizard</code> method to perform any special finish processing for their
+ * wizard.
+ */
+ public abstract boolean performFinish();
+
+ /*
+ * (non-Javadoc) Method declared on IWizard.
+ */
+ public void setContainer(IWizardContainer wizardContainer) {
+ container = wizardContainer;
+ }
+
+ /**
+ * Sets the default page image descriptor for this wizard.
+ * <p>
+ * This image descriptor will be used to generate an image for a page with no image of its own; the image will be
+ * computed once and cached.
+ * </p>
+ *
+ * @param imageDescriptor the default page image descriptor
+ */
+ public void setDefaultPageImageDescriptor(ImageDescriptor imageDescriptor) {
+ defaultImageDescriptor = imageDescriptor;
+ }
+
+ /**
+ * Sets the dialog settings for this wizard.
+ * <p>
+ * The dialog settings is used to record state between wizard invocations (for example, radio button selection, last
+ * import directory, etc.)
+ * </p>
+ *
+ * @param settings the dialog settings, or <code>null</code> if none
+ * @see #getDialogSettings
+ */
+ public void setDialogSettings(IDialogSettings settings) {
+ dialogSettings = settings;
+ }
+
+ /**
+ * Controls whether the wizard needs Previous and Next buttons even if it currently contains only one page.
+ * <p>
+ * This flag should be set on wizards where the first wizard page adds follow-on wizard pages based on user input.
+ * </p>
+ *
+ * @param b <code>true</code> to always show Next and Previous buttons, and <code>false</code> to suppress Next
+ * and Previous buttons for single page wizards
+ */
+ public void setForcePreviousAndNextButtons(boolean b) {
+ forcePreviousAndNextButtons = b;
+ }
+
+ /**
+ * Sets whether help is available for this wizard.
+ * <p>
+ * The result of this method is typically used by the container to show or hide the Help button.
+ * </p>
+ *
+ * @param b <code>true</code> if help is available, and <code>false</code> if this wizard is helpless
+ * @see #isHelpAvailable
+ */
+ public void setHelpAvailable(boolean b) {
+ isHelpAvailable = b;
+ }
+
+ /**
+ * Sets whether this wizard needs a progress monitor.
+ *
+ * @param b <code>true</code> if a progress monitor is required, and <code>false</code> if none is needed
+ * @see #needsProgressMonitor()
+ */
+ public void setNeedsProgressMonitor(boolean b) {
+ needsProgressMonitor = b;
+ }
+
+ /**
+ * Sets the title bar color for this wizard.
+ *
+ * @param color the title bar color
+ */
+ public void setTitleBarColor(RGB color) {
+ titleBarColor = color;
+ }
+
+ /**
+ * Sets the window title for the container that hosts this page to the given string.
+ *
+ * @param newTitle the window title for the container
+ */
+ public void setWindowTitle(String newTitle) {
+ windowTitle = newTitle;
+ if (container != null) container.updateWindowTitle();
+ }
+
+ public void setStartingPage(IWizardPage startingPage) {
+ this.startingPage = startingPage;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizardPage.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizardPage.java
new file mode 100644
index 00000000000..e8ac21bd216
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/DynamicWizardPage.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.framework.ui.swt;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+
+public abstract class DynamicWizardPage extends WizardPage {
+
+ private String previousPage;
+ private String nextPage;
+
+ protected DynamicWizardPage(String pageName, String previousPage, String nextPage) {
+ super(pageName);
+ this.previousPage = previousPage;
+ this.nextPage = nextPage;
+ }
+
+ public boolean onNextPressed() {
+ return true;
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ return this.getWizard().getPage(nextPage);
+ }
+
+ @Override
+ public IWizardPage getPreviousPage() {
+ return this.getWizard().getPage(previousPage);
+ }
+
+ public void setNextPage(String nextPage) {
+ this.nextPage = nextPage;
+ }
+
+ public void setPreviousPage(String previousPage) {
+ this.previousPage = previousPage;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnhancedTabFolder.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnhancedTabFolder.java
new file mode 100644
index 00000000000..0117e14a0b6
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnhancedTabFolder.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.framework.ui.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+
+public class EnhancedTabFolder implements ITabFolderItem {
+ private final TabFolder folder;
+ private TabFolderItem previousItem;
+
+ public EnhancedTabFolder(Composite parent, int style) {
+ folder = new TabFolder(parent, style);
+ folder.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent event) {
+ final TabFolderItem item = (TabFolderItem) ((TabItem) event.item).getControl();
+ if (item == previousItem) return;
+ if (previousItem != null) previousItem.OnTabDeselected();
+ item.OnTabSelected();
+ previousItem = item;
+ }
+
+ });
+
+ folder.addTraverseListener(new TraverseListener() {
+
+ public void keyTraversed(TraverseEvent e) {
+ switch (e.detail) {
+ case SWT.TRAVERSE_TAB_NEXT:
+ case SWT.TRAVERSE_ARROW_NEXT:
+ System.out.println("Next tab selected");
+ break;
+ case SWT.TRAVERSE_TAB_PREVIOUS:
+ System.out.println("previous tab selected");
+ }
+ }
+
+ });
+ }
+
+ public void setSelection(int index) {
+ final int selected = folder.getSelectionIndex();
+ if (selected != -1) {
+ previousItem = (TabFolderItem) folder.getItem(selected).getControl();
+ }
+ folder.setSelection(index);
+ }
+
+ public TabFolderItem getSelection() {
+ final int selected = folder.getSelectionIndex();
+ if (selected != -1) {
+ return (TabFolderItem) folder.getItem(selected).getControl();
+ } else {
+ return null;
+ }
+ }
+
+ public TabFolder getFolder() {
+ return folder;
+ }
+
+ public void addTab(String tabText, ITabFolderItem tab) {
+ TabItem item = new TabItem(folder, SWT.NONE);
+ item.setControl((Control) tab);
+ item.setText(tabText);
+ }
+
+ public void addTab(String tabText, String toolTip, ITabFolderItem tab) {
+ TabItem item = new TabItem(folder, SWT.NONE);
+ item.setControl((Control) tab);
+ item.setText(tabText);
+ item.setToolTipText(toolTip);
+ }
+
+ public void OnTabDeselected() {
+ final int index = folder.getSelectionIndex();
+ if (index != -1) {
+ ((TabFolderItem) folder.getItem(index).getControl()).OnTabSelected();
+ }
+ }
+
+ public void OnTabSelected() {
+ final int index = folder.getSelectionIndex();
+ if (index != -1) {
+ ((TabFolderItem) folder.getItem(index).getControl()).OnTabDeselected();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnumeratedCellEditor.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnumeratedCellEditor.java
new file mode 100644
index 00000000000..b49efb4b897
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/EnumeratedCellEditor.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * Edits column data in a table by using a combo control. The options in the combo box are enumeration constants that
+ * this is parameterized with.
+ *
+ * @author Ken J. Aguilar
+ */
+public abstract class EnumeratedCellEditor<T extends Enum<T>> extends CustomTableCellEditor<T> {
+ private final TableEditor editor;
+ private final Table table;
+ private final int columnIndex;
+ private final int comboStyle;
+ private final String toolTip;
+ private final Class<T> clazz;
+ private final String[] comboItems;
+ private boolean enabled;
+ private Color color;
+ private final class EditCellListener implements Listener {
+
+ public void handleEvent(Event event) {
+ final Point pt = new Point(event.x, event.y);
+ int index = table.getTopIndex();
+ while (index < table.getItemCount()) {
+ final int rowIndex = index;
+ final TableItem item = table.getItem(index);
+ final Rectangle rect = item.getBounds(columnIndex);
+ if (rect.contains(pt)) {
+ final T oldValue = clazz.getEnumConstants()[getIndexByText(item.getText(columnIndex))];
+ final CCombo combo = new CCombo(table, comboStyle);
+ combo.setBackground(color);
+ combo.setItems(comboItems);
+ combo.setToolTipText(toolTip);
+ final Listener textListener = new Listener() {
+ public void handleEvent(final Event e) {
+ final T value = clazz.getEnumConstants()[combo.getSelectionIndex()];
+ switch (e.type) {
+ case SWT.FocusOut:
+ item.setText(columnIndex, focusLost(rowIndex, value, oldValue).toString());
+ combo.dispose();
+ break;
+ case SWT.Traverse:
+ switch (e.detail) {
+ case SWT.TRAVERSE_RETURN:
+ item.setText(columnIndex, applyValue(rowIndex, value, oldValue).toString());
+ // FALL THROUGH
+ case SWT.TRAVERSE_ESCAPE:
+ combo.dispose();
+ e.doit = false;
+ }
+ break;
+ case SWT.Selection:
+ item.setText(columnIndex, applyValue(rowIndex, value, oldValue).toString());
+ combo.dispose();
+ break;
+ }
+ }
+ };
+ combo.addListener(SWT.FocusOut, textListener);
+ combo.addListener(SWT.Traverse, textListener);
+ combo.addListener(SWT.Selection, textListener);
+ combo.select(oldValue.ordinal());
+ editor.setEditor(combo, item, columnIndex);
+ combo.setFocus();
+ return;
+ }
+ index++;
+ }
+ }
+ }
+
+ private final EditCellListener tblListener = new EditCellListener();
+
+ /**
+ * Constructs a new Combo Cell Editor
+ *
+ * @param table
+ * @param columnIndex
+ * @param comboStyle
+ * @param toolTip
+ * @param clazz the Class of the <CODE>Enum</CODE> whose enumerations will appear as options in the cell editor's
+ * combo box
+ */
+ public EnumeratedCellEditor(final Table table, final int columnIndex, final int comboStyle, final String toolTip, final Class<T> clazz) {
+ this.table = table;
+ this.columnIndex = columnIndex;
+ this.comboStyle = comboStyle;
+ this.toolTip = toolTip;
+ this.clazz = clazz;
+ this.enabled = true;
+
+ comboItems = new String[clazz.getEnumConstants().length];
+ for (int i = 0; i < clazz.getEnumConstants().length; i++) {
+ comboItems[i] = clazz.getEnumConstants()[i].toString();
+ }
+
+ editor = new TableEditor(table);
+ editor.horizontalAlignment = SWT.LEFT;
+ editor.grabHorizontal = true;
+
+ color = table.getDisplay().getSystemColor(SWT.COLOR_WHITE);
+ table.addListener(SWT.MouseDown, tblListener);
+ }
+
+ private int getIndexByText(final String text) {
+ for (int i = 0; i < comboItems.length; i++) {
+ if (text.equals(comboItems[i])) {
+ return i;
+ }
+ }
+ throw new IllegalArgumentException("No combo item matching text: " + text);
+ }
+
+ /**
+ * Called when the user has typed a value and then presses <I><B>Enter</B></I>.
+ *
+ * @param itemIndex the zero relative index of the {@link TableItem} of the cell to be edited
+ * @param value the current selection in the cell before it lost focus
+ * @param previousValue the value that was in the cell before the edit took place
+ * @return the value that will be actually written into the table's cell
+ */
+ abstract protected T applyValue(final int itemIndex, final T value, final T previousValue);
+
+ /**
+ * Called when the cell editor has lost focus.
+ *
+ * @param itemIndex the row index of the TableItem's cell that has lost focus
+ * @param value the current value of the cell just before it lost focus
+ * @param previousValue the value of the cell before editing began
+ * @return the value that cekk will be set to when focus is lost
+ */
+ abstract protected T focusLost(final int itemIndex, final T value, final T previousValue);
+
+ /**
+ * Either enables or disables this cell editor. A disabled cell editor will not edit any cells in the entire column
+ * that this cell editor is attached to.
+ *
+ * @param enabled
+ */
+ public void setEnabled(boolean enabled) {
+ // do nothing if already enabled/disabled
+ if (this.enabled == enabled) return;
+
+ if (enabled) {
+ table.addListener(SWT.MouseDown, tblListener);
+ this.enabled = true;
+ } else {
+ table.removeListener(SWT.MouseDown, tblListener);
+ this.enabled = false;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionComposite.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionComposite.java
new file mode 100644
index 00000000000..db598ff3d36
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionComposite.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.framework.ui.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class ExceptionComposite extends Composite {
+
+ public ExceptionComposite(Composite parent, Exception ex) {
+ super(parent, SWT.NONE);
+ setLayout(ALayout.getZeroMarginLayout(1, true));
+ setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createErrorArea(this, ex);
+ }
+
+ private Control createErrorArea(Composite parent, Exception ex) {
+ Composite composite = new Composite(parent, SWT.BORDER);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+
+ Label imageLabel = new Label(composite, SWT.NONE);
+ imageLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, true));
+ Image image = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
+ imageLabel.setImage(image);
+ imageLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+
+ Text text = new Text(composite, SWT.WRAP);
+ text.setFont(parent.getFont());
+ text.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED));
+ text.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+ text.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true));
+ text.setText(ex.getLocalizedMessage());
+ return composite;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionDialog.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionDialog.java
new file mode 100644
index 00000000000..daa42d5f011
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ExceptionDialog.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.framework.ui.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * This class represents a dialog box that displays an exception that has occurred at runtime
+ *
+ * @author Ken J. Aguilar
+ */
+public class ExceptionDialog {
+
+ private final MessageBox messageBox;
+
+ public ExceptionDialog(final Shell shell, final Throwable e, final String additionalInfo) {
+ final String indent = "\n ";
+ messageBox = new MessageBox(shell, SWT.ICON_ERROR);
+ messageBox.setText(e.getClass().getName());
+ final StringBuilder msg = new StringBuilder(2048);
+ msg.append(e.getMessage());
+ msg.append("\n\nStack Trace:");
+ for (StackTraceElement element : e.getStackTrace()) {
+ msg.append(indent);
+ msg.append(element.toString());
+ }
+ msg.append("\n");
+ msg.append(additionalInfo);
+ messageBox.setMessage(msg.toString());
+ }
+
+ public ExceptionDialog(final Shell shell, final Throwable e) {
+ this(shell, e, "");
+ }
+
+ public void open() {
+ messageBox.open();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/FormattedText.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/FormattedText.java
new file mode 100644
index 00000000000..4858dd074ba
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/FormattedText.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import java.util.ArrayList;
+import java.util.List;
+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.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FormattedText extends Composite {
+
+ private List<StyleRange> styleArray;
+ private StyledText textArea;
+ private int height;
+ private int width;
+ private boolean editable;
+
+ public FormattedText(Composite parent, int style) {
+ this(parent, style, 300, 300, false);
+ }
+
+ public FormattedText(Composite parent, int style, boolean editable) {
+ this(parent, style, 300, 300, editable);
+ }
+
+ public FormattedText(Composite parent, int style, int height, int width) {
+ this(parent, style, height, width, false);
+ }
+
+ public FormattedText(Composite parent, int style, int height, int width, boolean editable) {
+ super(parent, style);
+ this.editable = editable;
+ this.height = height;
+ this.width = width;
+ this.styleArray = new ArrayList<StyleRange>();
+ createTextArea();
+ }
+
+ private void createTextArea() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ textArea = new StyledText(this, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.heightHint = height;
+ gd.widthHint = width;
+ textArea.setLayoutData(gd);
+ textArea.setEditable(editable);
+ textArea.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ textArea.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
+ textArea.setText("");
+ }
+
+ public String[] getCmdList() {
+ return textArea.getText().split("\n");
+ }
+
+ public void setTextAreaBackground(final int swtColor) {
+ textArea.setBackground(Display.getDefault().getSystemColor(swtColor));
+ }
+
+ public StyledText getStyledText() {
+ return textArea;
+ }
+
+ public void clearTextArea() {
+ textArea.setText("");
+ styleArray.clear();
+ }
+
+ public void addText(String textToAdd) {
+ addText(textToAdd, SWT.NORMAL, SWT.COLOR_BLACK);
+ }
+
+ public void addText(String textToAdd, int swtFontStyle, int swtColor) {
+ addText(textToAdd, swtFontStyle, swtColor, false);
+ }
+
+ public void addText(String textToAdd, int swtFontStyle, int swtColor, boolean underline) {
+ if (textToAdd != null) {
+ String temp = textArea.getText();
+ int startIndex = temp.length();
+ temp += textToAdd;
+ textArea.setText(temp);
+ StyleRange tempStyle = new StyleRange();
+ styleArray.add(tempStyle);
+ tempStyle.fontStyle = swtFontStyle;
+ tempStyle.start = startIndex;
+ tempStyle.length = textToAdd.length();
+ tempStyle.underline = underline;
+ tempStyle.foreground = Display.getDefault().getSystemColor(swtColor);
+ textArea.setStyleRanges(styleArray.toArray(new StyleRange[styleArray.size()]));
+ textArea.redraw();
+ }
+ }
+
+ public void dispose() {
+ super.dispose();
+ textArea.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IContentProviderRunnable.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IContentProviderRunnable.java
new file mode 100644
index 00000000000..1391f9ba433
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IContentProviderRunnable.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.framework.ui.swt;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IContentProviderRunnable {
+
+ public Object[] run(Object parent) throws Exception;
+
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IDirtiableEditor.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IDirtiableEditor.java
new file mode 100644
index 00000000000..a9db05f7365
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IDirtiableEditor.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.framework.ui.swt;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IDirtiableEditor {
+ public void onDirtied();
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IPAddressBox.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IPAddressBox.java
new file mode 100644
index 00000000000..a0bf286054d
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/IPAddressBox.java
@@ -0,0 +1,260 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import java.net.InetAddress;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * This is a custom widget that allows for a user to enter an IP Address (or net mask).
+ *
+ * @author Ken J. Aguilar
+ */
+public class IPAddressBox extends Composite {
+ private static final String PERIOD_SEPARATOR = ".";
+ private static final String DASH_SEPARATOR = "-";
+ private static final int NUM_BOXES = 4;
+
+ private final Text[] box = new Text[NUM_BOXES];
+ private Color background;
+
+ public IPAddressBox(final Composite parent) {
+ this(parent, true, SWT.BORDER);
+ }
+
+ public IPAddressBox(final Composite parent, boolean useDash, int style) {
+ super(parent, style);
+ Widgets.setFormLayout(this, 0, 0);
+
+ String separator = (useDash ? DASH_SEPARATOR : PERIOD_SEPARATOR);
+ if ((style & SWT.READ_ONLY) > 0) {
+ background = parent.getBackground();
+ } else {
+ background = getDisplay().getSystemColor(SWT.COLOR_WHITE);
+ }
+
+ setBackground(background);
+
+ int NO_BORDER_MASK = ~SWT.BORDER;
+
+ Label sep1 = new Label(this, SWT.CENTER);
+ sep1.setText(separator);
+ sep1.setBackground(background);
+ Widgets.attachToParent(sep1, SWT.LEFT, 25, 0);
+ Widgets.attachToParent(sep1, SWT.TOP, 0, 3);
+
+ Label sep2 = new Label(this, SWT.CENTER);
+ sep2.setText(separator);
+ sep2.setBackground(background);
+ Widgets.attachToParent(sep2, SWT.LEFT, 50, -2);
+ Widgets.attachToControl(sep2, sep1, SWT.TOP, SWT.TOP, 0);
+
+ Label sep3 = new Label(this, SWT.CENTER);
+ sep3.setText(separator);
+ sep3.setBackground(background);
+ Widgets.attachToParent(sep3, SWT.LEFT, 75, -2);
+ Widgets.attachToControl(sep3, sep1, SWT.TOP, SWT.TOP, 0);
+
+ box[0] = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ box[0].setTextLimit(3);
+ box[0].setBackground(background);
+ new Widgets.IntegerTextEntryHandler(box[0], false, 3) {
+ @Override
+ public void applyValue(long value) {
+ clamp(box[0], value);
+ }
+ };
+ Widgets.attachToParent(box[0], SWT.LEFT, 0, 2);
+ Widgets.attachToControl(box[0], sep1, SWT.RIGHT, SWT.LEFT, -2);
+ Widgets.attachToControl(box[0], sep1, SWT.TOP, SWT.CENTER, 0);
+
+ box[1] = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ box[1].setTextLimit(3);
+ box[1].setBackground(background);
+ new Widgets.IntegerTextEntryHandler(box[1], false, 3) {
+ @Override
+ public void applyValue(long value) {
+ clamp(box[1], value);
+ }
+ };
+ Widgets.attachToControl(box[1], sep1, SWT.LEFT, SWT.RIGHT, 2);
+ Widgets.attachToControl(box[1], sep2, SWT.RIGHT, SWT.LEFT, -2);
+ Widgets.attachToControl(box[1], sep1, SWT.TOP, SWT.CENTER, 0);
+
+ box[2] = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ box[2].setTextLimit(3);
+ box[2].setBackground(background);
+ new Widgets.IntegerTextEntryHandler(box[2], false, 3) {
+ @Override
+ public void applyValue(long value) {
+ clamp(box[2], value);
+ }
+ };
+ Widgets.attachToControl(box[2], sep2, SWT.LEFT, SWT.RIGHT, 2);
+ Widgets.attachToControl(box[2], sep3, SWT.RIGHT, SWT.LEFT, -2);
+ Widgets.attachToControl(box[2], sep1, SWT.TOP, SWT.CENTER, 0);
+
+ box[3] = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ box[3].setTextLimit(3);
+ box[3].setBackground(background);
+ new Widgets.IntegerTextEntryHandler(box[3], false, 3) {
+ @Override
+ public void applyValue(long value) {
+ clamp(box[3], value);
+ }
+ };
+ Widgets.attachToParent(box[3], SWT.RIGHT, 100, -2);
+ Widgets.attachToControl(box[3], sep3, SWT.LEFT, SWT.RIGHT, 2);
+ Widgets.attachToControl(box[3], sep1, SWT.TOP, SWT.CENTER, 0);
+ }
+
+ /**
+ * Creates a new IPAddressBox
+ *
+ * @param parent The parent to which this IPAddressBox will be a child of
+ */
+ public IPAddressBox(final Composite parent, boolean useDash) {
+ this(parent, useDash, SWT.BORDER);
+ }
+
+ private void clamp(Text txt, long value) {
+ if (value < 0) {
+ txt.setText(Integer.toString(0));
+ }
+ if (value > 255) {
+ txt.setText(Integer.toString(255));
+ }
+ }
+
+ @Override
+ public void setBackground(final Color color) {
+ super.setBackground(color);
+ for (Control ctrl : getChildren()) {
+ ctrl.setBackground(color);
+ }
+ background = color;
+ }
+
+ @Override
+ public void setForeground(final Color color) {
+ super.setForeground(color);
+ for (Control ctrl : getChildren()) {
+ ctrl.setForeground(color);
+ }
+ }
+
+ @Override
+ public Color getBackground() {
+ return background;
+ }
+
+ public int getIntValue() {
+ final String txt0 = box[0].getText();
+ final String txt1 = box[1].getText();
+ final String txt2 = box[2].getText();
+ final String txt3 = box[3].getText();
+
+ // System.out.println("get ip addr box value");
+ final int a = (txt0.equals("") ? 0 : (Integer.parseInt(txt0) & 0x000000FF));
+ // System.out.println("a = " + a);
+ // System.out.println(Integer.toBinaryString(a));
+ final int b = (txt1.equals("") ? 0 : (Integer.parseInt(txt1) & 0x000000FF));
+ // System.out.println("b = " + b);
+ // System.out.println(Integer.toBinaryString(b));
+ final int c = (txt2.equals("") ? 0 : (Integer.parseInt(txt2) & 0x000000FF));
+ // System.out.println("c = " + c);
+ // System.out.println(Integer.toBinaryString(c));
+ final int d = (txt3.equals("") ? 0 : (Integer.parseInt(txt3) & 0x000000FF));
+ // System.out.println("d = " + d);
+ // System.out.println(Integer.toBinaryString(d));
+ return (a << 24) | (b << 16) | (c << 8) | d;
+ }
+
+ /**
+ * Sets the ip address when given a string that is formatted as follows
+ * <P>
+ * <I> ###.###.###.### or as ###-###-###-### where ### is an integer between 0 and 255 inclusive. </I>
+ *
+ * @param txt
+ */
+ public void setTextValue(final String txt) {
+ final String[] bytes = txt.split("\\.|-");
+ if (bytes.length != 4) {
+ throw new IllegalArgumentException("Invalid IP Address format: " + txt);
+ }
+
+ for (final String bytestring : bytes) {
+ final int value = Integer.parseInt(bytestring);
+ if (value < 0 || value > 255) {
+ throw new IllegalArgumentException("Invalid IP Address format: " + txt);
+ }
+ }
+ box[0].setText(bytes[0]);
+ box[1].setText(bytes[1]);
+ box[2].setText(bytes[2]);
+ box[3].setText(bytes[3]);
+ }
+
+ /**
+ * sets the ip address when given an integer that represents 4 8-bit values. the leftmost 8 bits of the integer
+ * represent the first byte of the ip address.
+ *
+ * @param value
+ */
+ public void setIntValue(final int value) {
+ // System.out.println("set ip addr box value = " + value);
+ final int a = (value & 0xFF000000) >>> 24;
+ // System.out.println("a = " + a);
+ // System.out.println(Integer.toBinaryString(a));
+ final int b = (value & 0x00FF0000) >> 16;
+ // System.out.println("b = " + b);
+ // System.out.println(Integer.toBinaryString(b));
+ final int c = (value & 0x0000FF00) >> 8;
+ // System.out.println("c = " + c);
+ // System.out.println(Integer.toBinaryString(c));
+ final int d = (value & 0x000000FF);
+ // System.out.println("d = " + d);
+ // System.out.println(Integer.toBinaryString(d));
+ box[0].setText(Integer.toString(a));
+ box[1].setText(Integer.toString(b));
+ box[2].setText(Integer.toString(c));
+ box[3].setText(Integer.toString(d));
+
+ }
+
+ public static byte[] getByteArray(int value) {
+ final int a = (value & 0xFF000000) >>> 24;
+ final int b = (value & 0x00FF0000) >> 16;
+ final int c = (value & 0x0000FF00) >> 8;
+ final int d = (value & 0x000000FF);
+ return new byte[] {(byte) a, (byte) b, (byte) c, (byte) d};
+ }
+
+ public static int getInetAddressToInt(InetAddress address) {
+ byte[] bytes = address.getAddress();
+
+ return ((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16) | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);
+ }
+
+ public static String toString(final int value) {
+ final int a = (value & 0xFF000000) >>> 24;
+ final int b = (value & 0x00FF0000) >> 16;
+ final int c = (value & 0x0000FF00) >> 8;
+ final int d = (value & 0x000000FF);
+ return String.format("%03d.%03d.%03d.%03d", a, b, c, d);
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITabFolderItem.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITabFolderItem.java
new file mode 100644
index 00000000000..77cab0683c8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITabFolderItem.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.framework.ui.swt;
+
+public interface ITabFolderItem {
+ void OnTabSelected();
+
+ void OnTabDeselected();
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITreeNode.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITreeNode.java
new file mode 100644
index 00000000000..ab371f26c1b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/ITreeNode.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.framework.ui.swt;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface ITreeNode extends IAdaptable {
+
+ Object[] getChildren();
+
+ /**
+ * @param objChildren The children to set.
+ */
+ void setChildren(Object[] objChildren);
+
+ /**
+ * @return Returns the backingData.
+ */
+ Object getBackingData();
+
+ /**
+ * @return Returns the parent.
+ */
+ ITreeNode getParent();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/LatLongBox.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/LatLongBox.java
new file mode 100644
index 00000000000..e767871f4b5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/LatLongBox.java
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * This is a custom widget that handles latitude and longitude data entries in the form of degrees, minutes, and seconds
+ *
+ * @author Ken J. Aguilar
+ */
+public class LatLongBox extends Composite {
+
+ private final Text degreesTxt;
+ private final Text minutesTxt;
+ private final Text secondsTxt;
+
+ private Color background;
+
+ private boolean hasFocus = false;
+ private boolean[] boxTabFlag = new boolean[] {false, false, false};
+
+ private int maxDegrees = 360;
+ private int minDegrees = -360;
+
+ private Double dValue = null;
+
+ public LatLongBox(final Composite parent) {
+ this(parent, SWT.BORDER);
+ }
+
+ public LatLongBox(final Composite parent, int style) {
+ super(parent, style);
+ setToolTipText("Enter degrees, minutes, and seconds");
+ Widgets.setFormLayout(this, 0, 0);
+
+ if ((style & SWT.READ_ONLY) > 0) {
+ background = parent.getBackground();
+ } else {
+ background = getDisplay().getSystemColor(SWT.COLOR_WHITE);
+ }
+
+ setBackground(background);
+
+ int NO_BORDER_MASK = ~SWT.BORDER;
+
+ Label sep1 = new Label(this, SWT.CENTER);
+ sep1.setText(String.format("%c", 0xb0));
+ sep1.setBackground(background);
+ Widgets.attachToParent(sep1, SWT.LEFT, 33, 0);
+ Widgets.attachToParent(sep1, SWT.TOP, 0, 3);
+
+ Label sep2 = new Label(this, SWT.CENTER);
+ sep2.setText("'");
+ sep2.setBackground(background);
+ Widgets.attachToParent(sep2, SWT.LEFT, 66, -2);
+ Widgets.attachToControl(sep2, sep1, SWT.TOP, SWT.TOP, 0);
+
+ Label sep3 = new Label(this, SWT.CENTER);
+ sep3.setText("\"");
+ sep3.setBackground(background);
+ Widgets.attachToParent(sep3, SWT.LEFT, 100, -8);
+ Widgets.attachToControl(sep3, sep1, SWT.TOP, SWT.TOP, 0);
+
+ degreesTxt = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ degreesTxt.setTextLimit(4);
+ degreesTxt.setBackground(background);
+ Widgets.attachToParent(degreesTxt, SWT.LEFT, 0, 2);
+ Widgets.attachToControl(degreesTxt, sep1, SWT.RIGHT, SWT.LEFT, -2);
+ Widgets.attachToControl(degreesTxt, sep1, SWT.TOP, SWT.CENTER, 0);
+
+ minutesTxt = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ minutesTxt.setTextLimit(2);
+ minutesTxt.setBackground(background);
+ Widgets.attachToControl(minutesTxt, sep1, SWT.LEFT, SWT.RIGHT, 2);
+ Widgets.attachToControl(minutesTxt, sep2, SWT.RIGHT, SWT.LEFT, -2);
+ Widgets.attachToControl(minutesTxt, sep1, SWT.TOP, SWT.CENTER, 0);
+
+ secondsTxt = new Text(this, SWT.SINGLE | SWT.RIGHT | style & NO_BORDER_MASK);
+ secondsTxt.setTextLimit(2);
+ secondsTxt.setBackground(background);
+
+ Widgets.attachToControl(secondsTxt, sep2, SWT.LEFT, SWT.RIGHT, 2);
+ Widgets.attachToControl(secondsTxt, sep3, SWT.RIGHT, SWT.LEFT, -2);
+ Widgets.attachToControl(secondsTxt, sep1, SWT.TOP, SWT.CENTER, 0);
+
+ new Widgets.IntegerTextEntryHandler(degreesTxt, true, 4) {
+ @Override
+ public void keyTraversed(TraverseEvent e) {
+ try {
+ super.keyTraversed(e);
+ switch (e.detail) {
+ case SWT.TRAVERSE_ARROW_NEXT:
+ if (degreesTxt.getCaretPosition() == degreesTxt.getCharCount()) {
+ boxTabFlag[0] = false;
+ minutesTxt.setFocus();
+ }
+ break;
+ case SWT.TRAVERSE_TAB_NEXT:
+ boxTabFlag[0] = false;
+ break;
+ case SWT.TRAVERSE_TAB_PREVIOUS:
+ boxTabFlag[0] = true;
+ break;
+ }
+ } catch (RuntimeException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ super.focusGained(e);
+ boxTabFlag[0] = true;
+ if (!hasFocus) {
+ hasFocus = true;
+ generateCompositeFocusEvent(e, SWT.FocusIn);
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ try {
+ super.focusLost(e);
+ Control control = Display.getDefault().getCursorControl();
+ if (control != minutesTxt && control != secondsTxt && boxTabFlag[0]) {
+ // the latLongBox has lost focus. None of its Text fields have the focus
+ hasFocus = false;
+ generateCompositeFocusEvent(e, SWT.FocusOut);
+ }
+ } catch (RuntimeException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ @Override
+ public void applyValue(long value) {
+ try {
+ if (value > maxDegrees) {
+ value = maxDegrees;
+ degreesTxt.setText(Integer.toString(maxDegrees));
+ } else if (value < minDegrees) {
+ value = minDegrees;
+ degreesTxt.setText(Integer.toString(minDegrees));
+ }
+ if (value == maxDegrees) {
+ minutesTxt.setText("0");
+ secondsTxt.setText("0");
+ }
+ if (minutesTxt.getText().equals("")) {
+ minutesTxt.setText("0");
+ }
+ if (secondsTxt.getText().equals("")) {
+ secondsTxt.setText("0");
+ }
+ Long prevValue = getPreviousValue();
+ if (prevValue == null) {
+ prevValue = Long.MIN_VALUE;
+ }
+ if (value != prevValue.longValue()) {
+ double sign = value < 0 ? -1.0 : 1.0;
+ dValue =
+ (double) value + sign * (Integer.parseInt(minutesTxt.getText()) / 60.0 + Integer.parseInt(secondsTxt.getText()) / 3600.0);
+ System.out.println("latlong degrees changed: degrees = " + value + ", dValue=" + dValue);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ };
+
+ new Widgets.IntegerTextEntryHandler(minutesTxt, false, 2) {
+ @Override
+ public void keyTraversed(TraverseEvent e) {
+ try {
+ super.keyTraversed(e);
+ switch (e.detail) {
+ case SWT.TRAVERSE_ARROW_NEXT:
+ if (minutesTxt.getCaretPosition() == minutesTxt.getCharCount()) {
+ boxTabFlag[1] = false;
+ secondsTxt.setFocus();
+ }
+ break;
+ case SWT.TRAVERSE_ARROW_PREVIOUS:
+ if (minutesTxt.getCaretPosition() == 0) {
+ degreesTxt.setFocus();
+ }
+ boxTabFlag[1] = false;
+ case SWT.TRAVERSE_TAB_NEXT:
+ boxTabFlag[1] = false;
+ break;
+ case SWT.TRAVERSE_TAB_PREVIOUS:
+ boxTabFlag[1] = false;
+ break;
+ }
+ } catch (RuntimeException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ super.focusGained(e);
+ boxTabFlag[1] = true;
+ if (!hasFocus) {
+ hasFocus = true;
+ generateCompositeFocusEvent(e, SWT.FocusIn);
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ try {
+ super.focusLost(e);
+ Control control = Display.getDefault().getCursorControl();
+ if (control != degreesTxt && control != secondsTxt && boxTabFlag[1]) {
+ // the latLongBox has lost focus. None of its Text fields have the focus
+ hasFocus = false;
+ generateCompositeFocusEvent(e, SWT.FocusOut);
+ }
+ } catch (RuntimeException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ @Override
+ public void applyValue(long value) {
+ try {
+ int degrees;
+ String dTxt = degreesTxt.getText();
+ if (dTxt.equals("")) {
+ degrees = 0;
+ degreesTxt.setText("0");
+ } else {
+ degrees = Integer.parseInt(dTxt);
+ }
+ if (degrees == maxDegrees) {
+ value = 0;
+ } else if (value > 59) {
+ value = 59;
+ minutesTxt.setText(Integer.toString(59));
+ }
+ Long prevValue = getPreviousValue();
+ if (prevValue == null) {
+ prevValue = Long.MIN_VALUE;
+ }
+ if (value != prevValue) {
+ double sign = degrees < 0 ? -1.0 : 1.0;
+ String sTxt = secondsTxt.getText();
+ if (sTxt.equals("")) {
+ dValue = (double) degrees + sign * value / 60.0;
+ secondsTxt.setText("0");
+ } else {
+ dValue = (double) degrees + sign * (value / 60.0 + Integer.parseInt(sTxt) / 3600.0);
+ }
+ System.out.println("latlong minutes changed: minutes = " + value + ", dValue=" + dValue);
+ }
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+ };
+
+ new Widgets.IntegerTextEntryHandler(secondsTxt, false, 2) {
+ @Override
+ public void keyTraversed(TraverseEvent e) {
+ super.keyTraversed(e);
+ switch (e.detail) {
+ case SWT.TRAVERSE_ARROW_PREVIOUS:
+ if (secondsTxt.getCaretPosition() == 0) {
+ boxTabFlag[2] = false;
+ minutesTxt.setFocus();
+ }
+ case SWT.TRAVERSE_TAB_NEXT:
+ boxTabFlag[2] = true;
+ break;
+ case SWT.TRAVERSE_TAB_PREVIOUS:
+ boxTabFlag[2] = false;
+ break;
+ }
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ super.focusGained(e);
+ boxTabFlag[2] = true;
+ if (!hasFocus) {
+ hasFocus = true;
+ generateCompositeFocusEvent(e, SWT.FocusIn);
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ try {
+ super.focusLost(e);
+ Control control = Display.getDefault().getCursorControl();
+ if (control != minutesTxt && control != degreesTxt && boxTabFlag[2]) {
+ // the latLongBox has lost focus. None of its Text fields have the focus
+ hasFocus = false;
+ generateCompositeFocusEvent(e, SWT.FocusOut);
+ }
+ } catch (RuntimeException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ @Override
+ public void applyValue(long value) {
+ try {
+ int degrees;
+ String dTxt = degreesTxt.getText();
+ if (dTxt.equals("")) {
+ degrees = 0;
+ degreesTxt.setText("0");
+ } else {
+ degrees = Integer.parseInt(dTxt);
+ }
+ if (degrees == maxDegrees) {
+ value = 0;
+ } else if (value > 59) {
+ value = 59;
+ secondsTxt.setText(Integer.toString(59));
+ }
+ Long prevValue = getPreviousValue();
+ if (prevValue == null) {
+ prevValue = Long.MIN_VALUE;
+ }
+ if (value != prevValue) {
+ double sign = degrees < 0 ? -1.0 : 1.0;
+ String mTxt = minutesTxt.getText();
+ if (mTxt.equals("")) {
+ dValue = (double) degrees + sign * value / 3600.0;
+ minutesTxt.setText("0");
+ } else {
+ dValue = (double) degrees + sign * (Integer.parseInt(mTxt) / 60.0 + value / 3600.0);
+ }
+ System.out.println("latlong seconds changed: seconds = " + value + ", dValue=" + dValue);
+ }
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+ };
+ }
+
+ private void generateCompositeFocusEvent(FocusEvent e, int type) {
+ final Event event = new Event();
+ event.display = e.display;
+ event.time = e.time;
+ event.data = e.data;
+ event.widget = LatLongBox.this;
+ event.type = type;
+ notifyListeners(type, event);
+ }
+
+ @Override
+ public void setBackground(final Color color) {
+ super.setBackground(color);
+ for (Control ctrl : getChildren()) {
+ ctrl.setBackground(color);
+ }
+ background = color;
+ }
+
+ @Override
+ public void setForeground(final Color color) {
+ super.setForeground(color);
+ for (Control ctrl : getChildren()) {
+ ctrl.setForeground(color);
+ }
+ }
+
+ /**
+ * returns the value in degrees with a fractional part calculated from minutes and seconds. For example 50 degrees
+ * and 30 minutes would return 50.5 degrees
+ *
+ * @return
+ */
+ public Double getValue() {
+ return dValue;
+ }
+
+ public int getMinutes() {
+ return Integer.parseInt(minutesTxt.getText());
+ }
+
+ public int getSeconds() {
+ return Integer.parseInt(secondsTxt.getText());
+ }
+
+ @Override
+ public Color getBackground() {
+ return background;
+ }
+
+ public int getMaxDegrees() {
+ return maxDegrees;
+ }
+
+ public void setMaxDegrees(int maxDegrees) {
+ this.maxDegrees = maxDegrees;
+ }
+
+ public int getMinDegrees() {
+ return minDegrees;
+ }
+
+ public void setMinDegrees(int minDegrees) {
+ this.minDegrees = minDegrees;
+ }
+
+ public String toString() {
+ return String.format(degreesTxt.getText() + (char) 0xb0 + minutesTxt.getText() + "' " + secondsTxt.getText() + "\"");
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/MenuItems.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/MenuItems.java
new file mode 100644
index 00000000000..54f9c6235a5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/MenuItems.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.framework.ui.swt;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * @author Robert A. Fisher
+ */
+public final class MenuItems {
+
+ /**
+ * Builds a MenuItem based on the supplied Action.
+ *
+ * @param action The action to make a MenuItem of.
+ * @throws IllegalArgumentException if the action is null.
+ */
+ public static final MenuItem createMenuItem(Menu parent, int style, final Action action) {
+ if (action == null) throw new IllegalArgumentException("action can not be null");
+
+ MenuItem menuItem = new MenuItem(parent, style);
+ menuItem.setText(action.getText());
+ menuItem.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ action.run();
+ }
+ });
+
+ ImageDescriptor descriptor = action.getImageDescriptor();
+ if (descriptor != null) {
+ menuItem.setImage(descriptor.createImage());
+ }
+
+ return menuItem;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonBlankValidator.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonBlankValidator.java
new file mode 100644
index 00000000000..8fb73d39814
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonBlankValidator.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.framework.ui.swt;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class NonBlankValidator implements IInputValidator {
+ private String blankErrorMessage;
+
+ /**
+ * @param blankErrorMessage
+ */
+ public NonBlankValidator(String blankErrorMessage) {
+ this.blankErrorMessage = blankErrorMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
+ */
+ public String isValid(String newText) {
+ if (newText == null || newText.length() == 0) {
+ return blankErrorMessage;
+ }
+ return null; // to indicate the input is valid
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonmodalWizardDialog.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonmodalWizardDialog.java
new file mode 100644
index 00000000000..34bdfe3a048
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/NonmodalWizardDialog.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.framework.ui.swt;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+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;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Nonmodal Wizard Dialog
+ *
+ * @author Jeff C. Phillips
+ */
+
+public class NonmodalWizardDialog extends WizardDialog {
+ private Button backButton;
+ private Button nextButton;
+ private Button finishButton;
+ @SuppressWarnings("unused")
+ private Button cancelButton;
+ @SuppressWarnings("unused")
+ private Button helpButton;
+ private IWizard wizard;
+ private SelectionAdapter cancelListener;
+ private IWizardPage currentPage = null;
+
+ public NonmodalWizardDialog(Shell shell, Wizard wizard) {
+ super(new Shell(), wizard);
+ setShellStyle(SWT.MODELESS | SWT.SHELL_TRIM | SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.RESIZE | SWT.ON_TOP | getDefaultOrientation());
+
+ cancelListener = new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ cancelPressed();
+ }
+ };
+
+ this.wizard = getWizard();
+ }
+
+ protected void createButtonsForButtonBar(Composite parent) {
+ if (wizard.isHelpAvailable()) {
+ helpButton = createButton(parent, IDialogConstants.HELP_ID, IDialogConstants.HELP_LABEL, false);
+ }
+ if (wizard.needsPreviousAndNextButtons()) createPreviousAndNextButtons(parent);
+ finishButton = createButton(parent, IDialogConstants.FINISH_ID, IDialogConstants.FINISH_LABEL, true);
+ cancelButton = createCancelButton(parent);
+ }
+
+ private Button createCancelButton(Composite parent) {
+ // increment the number of columns in the button bar
+ ((GridLayout) parent.getLayout()).numColumns++;
+ Button button = new Button(parent, SWT.PUSH);
+ button.setText(IDialogConstants.CANCEL_LABEL);
+ setButtonLayoutData(button);
+ button.setFont(parent.getFont());
+ button.setData(new Integer(IDialogConstants.CANCEL_ID));
+ button.addSelectionListener(cancelListener);
+ return button;
+ }
+
+ private Composite createPreviousAndNextButtons(Composite parent) {
+ // increment the number of columns in the button bar
+ ((GridLayout) parent.getLayout()).numColumns++;
+ Composite composite = new Composite(parent, SWT.NONE);
+ // create a layout with spacing and margins appropriate for the font size.
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 0; // will be incremented by createButton
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.horizontalSpacing = 0;
+ layout.verticalSpacing = 0;
+ composite.setLayout(layout);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.VERTICAL_ALIGN_CENTER);
+ composite.setLayoutData(data);
+ composite.setFont(parent.getFont());
+ backButton = createButton(composite, IDialogConstants.BACK_ID, IDialogConstants.BACK_LABEL, false);
+ nextButton = createButton(composite, IDialogConstants.NEXT_ID, IDialogConstants.NEXT_LABEL, false);
+ nextButton.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent event) {
+ // System.out.println("the next button was pressed");
+ }
+ });
+ return composite;
+ }
+
+ public void updateButtons() {
+ boolean canFlipToNextPage = false;
+ boolean canFinish = wizard.canFinish();
+
+ this.currentPage = getCurrentPage();
+
+ if (backButton != null) backButton.setEnabled(currentPage.getPreviousPage() != null);
+ if (nextButton != null) {
+ canFlipToNextPage = currentPage.canFlipToNextPage();
+ nextButton.setEnabled(canFlipToNextPage);
+ }
+ finishButton.setEnabled(canFinish);
+ // finish is default unless it is diabled and next is enabled
+ if (canFlipToNextPage && !canFinish)
+ getShell().setDefaultButton(nextButton);
+ else
+ getShell().setDefaultButton(finishButton);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/OseeMessageDialog.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/OseeMessageDialog.java
new file mode 100644
index 00000000000..3cc0ad51cc7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/OseeMessageDialog.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.framework.ui.swt;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IconAndMessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+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;
+
+public class OseeMessageDialog extends IconAndMessageDialog {
+
+ private String[] buttonLabels;
+ private Button[] buttons;
+ private int defaultButtonIndex;
+ private String title;
+ private Image titleImage;
+ private Image image = null;
+ private Control customArea;
+
+ public OseeMessageDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, Image dialogImage, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell);
+ this.title = dialogTitle;
+ this.titleImage = dialogTitleImage;
+ this.message = dialogMessage;
+ this.image = dialogImage;
+ this.buttonLabels = dialogButtonLabels;
+ this.defaultButtonIndex = defaultIndex;
+ }
+
+ protected void buttonPressed(int buttonId) {
+ setReturnCode(buttonId);
+ close();
+ }
+
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ if (title != null) shell.setText(title);
+ if (titleImage != null) shell.setImage(titleImage);
+ }
+
+ protected void createButtonsForButtonBar(Composite parent) {
+ buttons = new Button[buttonLabels.length];
+ for (int i = 0; i < buttonLabels.length; i++) {
+ String label = buttonLabels[i];
+ Button button = createButton(parent, i, label, defaultButtonIndex == i);
+ buttons[i] = button;
+ }
+ }
+
+ /**
+ * Creates and returns the contents of an area of the dialog which appears below the message and above the button
+ * bar.
+ * <p>
+ * The default implementation of this framework method returns <code>null</code>. Subclasses may override.
+ * </p>
+ *
+ * @param parent parent composite to contain the custom area
+ * @return the custom area control, or <code>null</code>
+ */
+ protected Control createCustomArea(Composite parent) {
+ return null;
+ }
+
+ /**
+ * This implementation of the <code>Dialog</code> framework method creates and lays out a composite and calls
+ * <code>createMessageArea</code> and <code>createCustomArea</code> to populate it. Subclasses should override
+ * <code>createCustomArea</code> to add contents below the message.
+ */
+ protected Control createDialogArea(Composite parent) {
+ // create message area
+ createMessageArea(parent);
+ // create the top level composite for the dialog area
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ composite.setLayout(layout);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.horizontalSpan = 2;
+ composite.setLayoutData(data);
+ // allow subclasses to add custom controls
+ customArea = createCustomArea(composite);
+ // If it is null create a dummy label for spacing purposes
+ if (customArea == null) customArea = new Label(composite, SWT.NULL);
+ return composite;
+ }
+
+ /**
+ * Gets a button in this dialog's button bar.
+ *
+ * @param index the index of the button in the dialog's button bar
+ * @return a button in the dialog's button bar
+ */
+ protected Button getButton(int index) {
+ return buttons[index];
+ }
+
+ /**
+ * Returns the minimum message area width in pixels This determines the minimum width of the dialog.
+ * <p>
+ * Subclasses may override.
+ * </p>
+ *
+ * @return the minimum message area width (in pixels)
+ */
+ protected int getMinimumMessageWidth() {
+ return convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
+ }
+
+ /**
+ * Handle the shell close. Set the return code to <code>SWT.DEFAULT</code> as there has been no explicit close by
+ * the user.
+ *
+ * @see org.eclipse.jface.window.Window#handleShellCloseEvent()
+ */
+ protected void handleShellCloseEvent() {
+ // Sets a return code of SWT.DEFAULT since none of the dialog buttons
+ // were pressed to close the dialog.
+ super.handleShellCloseEvent();
+ setReturnCode(SWT.DEFAULT);
+ }
+
+ /*
+ * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int,
+ * java.lang.String, boolean)
+ */
+ protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
+ Button button = super.createButton(parent, id, label, defaultButton);
+ // Be sure to set the focus if the custom area cannot so as not
+ // to lose the defaultButton.
+ if (defaultButton && !customShouldTakeFocus()) button.setFocus();
+ return button;
+ }
+
+ /**
+ * Return whether or not we should apply the workaround where we take focus for the default button or if that should
+ * be determined by the dialog. By default only return true if the custom area is a label or CLabel that cannot take
+ * focus.
+ *
+ * @return boolean
+ */
+ protected boolean customShouldTakeFocus() {
+ if (customArea instanceof Label) return false;
+ if (customArea instanceof CLabel) return (customArea.getStyle() & SWT.NO_FOCUS) > 0;
+ return true;
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ /**
+ * An accessor for the labels to use on the buttons.
+ *
+ * @return The button labels to used; never <code>null</code>.
+ */
+ protected String[] getButtonLabels() {
+ return buttonLabels;
+ }
+
+ /**
+ * An accessor for the index of the default button in the button array.
+ *
+ * @return The default button index.
+ */
+ protected int getDefaultButtonIndex() {
+ return defaultButtonIndex;
+ }
+
+ /**
+ * A mutator for the array of buttons in the button bar.
+ *
+ * @param buttons The buttons in the button bar; must not be <code>null</code>.
+ */
+ protected void setButtons(Button[] buttons) {
+ if (buttons == null) {
+ throw new NullPointerException("The array of buttons cannot be null.");} //$NON-NLS-1$
+ this.buttons = buttons;
+ }
+
+ /**
+ * A mutator for the button labels.
+ *
+ * @param buttonLabels The button labels to use; must not be <code>null</code>.
+ */
+ protected void setButtonLabels(String[] buttonLabels) {
+ if (buttonLabels == null) {
+ throw new NullPointerException("The array of button labels cannot be null.");} //$NON-NLS-1$
+ this.buttonLabels = buttonLabels;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/PeriodicDisplayTask.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/PeriodicDisplayTask.java
new file mode 100644
index 00000000000..73986a81103
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/PeriodicDisplayTask.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.framework.ui.swt;
+
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Schedules a task to be executed in the display thread.
+ *
+ * @author Ken J. Aguilar
+ * @see org.eclipse.swt.widgets.Display#timerExec(int, java.lang.Runnable)
+ */
+public abstract class PeriodicDisplayTask {
+ protected final int period;
+ private final Display display;
+ private DisplayTask task = null;
+
+ /**
+ * Inner class used mainly to hide the run method from being exposed as a public method.
+ *
+ * @author Ken J. Aguilar
+ */
+ private final class DisplayTask implements Runnable {
+ /**
+ * once the specified period has elapsed this method will be called in the {@link Display}'s thread.
+ */
+ public void run() {
+ update();
+ // the call to the update method may have set done to true
+ schedule();
+ }
+ }
+
+ /**
+ * Creates a new PeriodicDisplayTask
+ *
+ * @param display The display containing the target of the update
+ * @param period the period in milliseconds <B>between</B> updates
+ */
+ protected PeriodicDisplayTask(final Display display, final int period) {
+ this.period = period;
+ this.display = display;
+ }
+
+ /**
+ * starts the periodic task
+ */
+ final public synchronized void start() {
+ if (task != null) {
+ stop();
+ }
+ task = new DisplayTask();
+ schedule();
+ }
+
+ /**
+ * Stops the Periodic updater from running. Any outstanding updates will be not be executed unless the update is
+ * already in execution. This PeriodicDisplayTask can be started again.
+ */
+ final public synchronized void stop() {
+ if (task != null) {
+ display.timerExec(-1, task);
+ task = null;
+ }
+ }
+
+ /**
+ * This method schedules the execution of the run method after the period has elapsed. This method must be called
+ * from a subclass's implementation of the run method if the run method must occur again. If the timer has been
+ * stopped then calling this method has no effect
+ */
+ final protected void schedule() {
+ if (task != null && !display.isDisposed()) {
+ display.timerExec(period, task);
+ }
+ }
+
+ protected abstract void update();
+
+ public Display getDisplay() {
+ return display;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Search.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Search.java
new file mode 100644
index 00000000000..2b264fd0849
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Search.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+
+/**
+ * A cell editor that presents a list of items in a combo box. The cell editor's value is the zero-based index of the
+ * selected item.
+ * <p>
+ * This class may be instantiated; it is not intended to be subclassed.
+ * </p>
+ */
+public class Search {
+
+ /**
+ * The list of items to present.
+ */
+ private String[] items;
+
+ /**
+ * The multi character search string
+ */
+ private String searchString = "";
+
+ private int firstIndex, lastIndex;
+ private boolean dirty;
+
+ /**
+ * Creates a new Search containing the given list of choices.
+ *
+ * @param items the list of strings
+ */
+ public Search(String[] items) {
+ this.items = items;
+ firstIndex = -1;
+ lastIndex = -1;
+ dirty = true;
+ }
+
+ /**
+ * Returns the list of choices for list
+ *
+ * @return the list of choices for the list
+ */
+ public String[] getItems() {
+ int range;
+
+ if (lastIndex == -1 || firstIndex == -1)
+ return items;
+ else
+ range = lastIndex - firstIndex;
+ String[] temp = new String[range];
+ System.arraycopy(items, firstIndex, temp, 0, range);
+ return temp;
+ }
+
+ /**
+ * @return the first index in the subarray
+ */
+ public int getFirstIndex() {
+ return this.firstIndex;
+ }
+
+ /**
+ * @return the last index in the subarray
+ */
+ public int getLastIndex() {
+ return this.lastIndex;
+ }
+
+ /**
+ * Performs the ProgressiveSearch on the list and populates the first and last index of the modified array
+ *
+ * @param e the key event
+ */
+ public void progressiveSearch(KeyEvent e) {
+ int first = -1;
+ int last = -1;
+
+ if (!Character.isISOControl(e.character)) // Looks for valid NON control character 0x20 - 0x7E
+ searchString = new String(searchString + e.character);
+ else if (e.character == SWT.BS) // Backspace Character
+ {
+ if (searchString.length() > 1)
+ searchString = new String(searchString.substring(0, searchString.length() - 1));
+ else if (searchString.length() == 1) // No more characters in search string... reset string;
+ this.reset();
+ else
+ return;
+ } else
+ // If invalid character.. do nothing
+ return;
+
+ // Look for first instance of substring
+ for (int i = 0; i < items.length; i++) {
+ if (items[i].length() >= searchString.length()) {
+ if (searchString.equalsIgnoreCase(items[i].substring(0, searchString.length()))) {
+ first = i;
+ break;
+ }
+ }
+ }
+ // Look for last instance of substring
+ if (first != -1) {
+ for (int i = first; i < items.length; i++) {
+ if (items[i].length() >= searchString.length()) {
+ if (!searchString.equalsIgnoreCase(items[i].substring(0, searchString.length()))) {
+ last = i;
+ break;
+ }
+ }
+ }
+ if (last == -1) lastIndex = items.length;
+ } else
+ // If substring is not found.. remove last character
+ searchString = new String(searchString.substring(0, searchString.length() - 1));
+
+ if (first != -1 && last != -1) {
+ firstIndex = first;
+ lastIndex = last;
+ dirty = true;
+ }
+ return;
+ }
+
+ /**
+ * Resets the search string as well as the first and last indexes
+ */
+ public void reset() {
+ firstIndex = 0;
+ lastIndex = items.length;
+ searchString = new String("");
+ dirty = true;
+ }
+
+ public int getLength() {
+ return searchString.length();
+ }
+
+ public boolean getDirty() {
+ return this.dirty;
+ }
+
+ public void setDirty(boolean value) {
+ this.dirty = value;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCCombo.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCCombo.java
new file mode 100644
index 00000000000..4a82cbd66bb
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCCombo.java
@@ -0,0 +1,1503 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.accessibility.AccessibleTextAdapter;
+import org.eclipse.swt.accessibility.AccessibleTextEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.TypedListener;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * The SearchCombo class represents a selectable user interface object that combines a text field and a list and issues
+ * notification when an item is selected from the list.
+ * <p>
+ * Note that although this class is a subclass of <code>Composite</code>, it does not make sense to add children to
+ * it, or set a layout on it.
+ * </p>
+ * <dl>
+ * <dt><b>Styles:</b>
+ * <dd>BORDER, READ_ONLY, FLAT</dd>
+ * <dt><b>Events:</b>
+ * <dd>Selection</dd>
+ * </dl>
+ */
+public final class SearchCCombo extends Composite {
+
+ Text text;
+ List list;
+ int visibleItemCount = 5;
+ Shell popup;
+ Button arrow;
+ boolean hasFocus;
+ Listener listener, filter;
+ Color foreground, background;
+ Font font;
+
+ /**
+ * Constructs a new instance of this class given its parent and a style value describing its behavior and appearance.
+ * <p>
+ * The style value is either one of the style constants defined in class <code>SWT</code> which is applicable to
+ * instances of this class, or must be built by <em>bitwise OR</em>'ing together (that is, using the
+ * <code>int</code> "|" operator) two or more of those <code>SWT</code> style constants. The class description
+ * lists the style constants that are applicable to the class. Style bits are also inherited from superclasses.
+ * </p>
+ *
+ * @param parent a widget which will be the parent of the new instance (cannot be null)
+ * @param style the style of widget to construct
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
+ * </ul>
+ * @see SWT#BORDER
+ * @see SWT#READ_ONLY
+ * @see SWT#FLAT
+ * @see Widget#getStyle()
+ */
+ public SearchCCombo(Composite parent, int style) {
+ super(parent, style = checkStyle(style));
+
+ int textStyle = SWT.SINGLE;
+ if ((style & SWT.READ_ONLY) != 0) textStyle |= SWT.READ_ONLY;
+ if ((style & SWT.FLAT) != 0) textStyle |= SWT.FLAT;
+ text = new Text(this, textStyle);
+ int arrowStyle = SWT.ARROW | SWT.DOWN;
+ if ((style & SWT.FLAT) != 0) arrowStyle |= SWT.FLAT;
+ arrow = new Button(this, arrowStyle);
+
+ listener = new Listener() {
+ public void handleEvent(Event event) {
+ if (popup == event.widget) {
+ popupEvent(event);
+ return;
+ }
+ if (text == event.widget) {
+ textEvent(event);
+ return;
+ }
+ if (list == event.widget) {
+ listEvent(event);
+ return;
+ }
+ if (arrow == event.widget) {
+ arrowEvent(event);
+ return;
+ }
+ if (SearchCCombo.this == event.widget) {
+ comboEvent(event);
+ return;
+ }
+ if (getShell() == event.widget) {
+ handleFocus(SWT.FocusOut);
+ }
+ }
+ };
+ filter = new Listener() {
+ public void handleEvent(Event event) {
+ Shell shell = ((Control) event.widget).getShell();
+ if (shell == SearchCCombo.this.getShell()) {
+ handleFocus(SWT.FocusOut);
+ }
+ }
+ };
+
+ int[] comboEvents = {SWT.Dispose, SWT.Move, SWT.Resize};
+ for (int i = 0; i < comboEvents.length; i++)
+ this.addListener(comboEvents[i], listener);
+
+ int[] textEvents = {SWT.KeyDown, SWT.KeyUp, SWT.Modify, SWT.MouseDown, SWT.MouseUp, SWT.Traverse, SWT.FocusIn};
+ for (int i = 0; i < textEvents.length; i++)
+ text.addListener(textEvents[i], listener);
+
+ int[] arrowEvents = {SWT.Selection, SWT.FocusIn};
+ for (int i = 0; i < arrowEvents.length; i++)
+ arrow.addListener(arrowEvents[i], listener);
+
+ createPopup(null, -1);
+ initAccessible();
+ }
+
+ static int checkStyle(int style) {
+ int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
+ return style & mask;
+ }
+
+ /**
+ * Adds the argument to the end of the receiver's list.
+ *
+ * @param string the new item
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see #add(String,int)
+ */
+ public void add(String string) {
+ checkWidget();
+ if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ list.add(string);
+ }
+
+ /**
+ * Adds the argument to the receiver's list at the given zero-relative index.
+ * <p>
+ * Note: To add an item at the end of the list, use the result of calling <code>getItemCount()</code> as the index
+ * or use <code>add(String)</code>.
+ * </p>
+ *
+ * @param string the new item
+ * @param index the index for the item
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list
+ * (inclusive)</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see #add(String)
+ */
+ public void add(String string, int index) {
+ checkWidget();
+ if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ list.add(string, index);
+ }
+
+ /**
+ * Adds the listener to the collection of listeners who will be notified when the receiver's text is modified, by
+ * sending it one of the messages defined in the <code>ModifyListener</code> interface.
+ *
+ * @param listener the listener which should be notified
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see ModifyListener
+ * @see #removeModifyListener
+ */
+ public void addModifyListener(ModifyListener listener) {
+ checkWidget();
+ if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ TypedListener typedListener = new TypedListener(listener);
+ addListener(SWT.Modify, typedListener);
+ }
+
+ /**
+ * Adds the listener to the collection of listeners who will be notified when the receiver's selection changes, by
+ * sending it one of the messages defined in the <code>SelectionListener</code> interface.
+ * <p>
+ * <code>widgetSelected</code> is called when the combo's list selection changes.
+ * <code>widgetDefaultSelected</code> is typically called when ENTER is pressed the combo's text area.
+ * </p>
+ *
+ * @param listener the listener which should be notified
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see SelectionListener
+ * @see #removeSelectionListener
+ * @see SelectionEvent
+ */
+ public void addSelectionListener(SelectionListener listener) {
+ checkWidget();
+ if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ TypedListener typedListener = new TypedListener(listener);
+ addListener(SWT.Selection, typedListener);
+ addListener(SWT.DefaultSelection, typedListener);
+ }
+
+ void arrowEvent(Event event) {
+ switch (event.type) {
+ case SWT.FocusIn: {
+ handleFocus(SWT.FocusIn);
+ break;
+ }
+ case SWT.Selection: {
+ dropDown(!isDropped());
+ break;
+ }
+ }
+ }
+
+ /**
+ * Sets the selection in the receiver's text field to an empty selection starting just before the first character. If
+ * the text field is editable, this has the effect of placing the i-beam at the start of the text.
+ * <p>
+ * Note: To clear the selected items in the receiver's list, use <code>deselectAll()</code>.
+ * </p>
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see #deselectAll
+ */
+ public void clearSelection() {
+ checkWidget();
+ text.clearSelection();
+ list.deselectAll();
+ }
+
+ void comboEvent(Event event) {
+ switch (event.type) {
+ case SWT.Dispose:
+ if (popup != null && !popup.isDisposed()) {
+ list.removeListener(SWT.Dispose, listener);
+ popup.dispose();
+ }
+ Shell shell = getShell();
+ shell.removeListener(SWT.Deactivate, listener);
+ Display display = getDisplay();
+ display.removeFilter(SWT.FocusIn, filter);
+ popup = null;
+ text = null;
+ list = null;
+ arrow = null;
+ break;
+ case SWT.Move:
+ dropDown(false);
+ break;
+ case SWT.Resize:
+ internalLayout(false);
+ break;
+ }
+ }
+
+ public Point computeSize(int wHint, int hHint, boolean changed) {
+ checkWidget();
+ int width = 0, height = 0;
+ String[] items = list.getItems();
+ int textWidth = 0;
+ GC gc = new GC(text);
+ int spacer = gc.stringExtent(" ").x; //$NON-NLS-1$
+ for (int i = 0; i < items.length; i++) {
+ textWidth = Math.max(gc.stringExtent(items[i]).x, textWidth);
+ }
+ gc.dispose();
+ Point textSize = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
+ Point arrowSize = arrow.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
+ Point listSize = list.computeSize(wHint, SWT.DEFAULT, changed);
+ int borderWidth = getBorderWidth();
+
+ height = Math.max(hHint, Math.max(textSize.y, arrowSize.y) + 2 * borderWidth);
+ width = Math.max(wHint, Math.max(textWidth + 2 * spacer + arrowSize.x + 2 * borderWidth, listSize.x));
+ return new Point(width, height);
+ }
+
+ void createPopup(String[] items, int selectionIndex) {
+ // create shell and list
+ popup = new Shell(getShell(), SWT.NO_TRIM | SWT.ON_TOP);
+ int style = getStyle();
+ int listStyle = SWT.SINGLE | SWT.V_SCROLL;
+ if ((style & SWT.FLAT) != 0) listStyle |= SWT.FLAT;
+ if ((style & SWT.RIGHT_TO_LEFT) != 0) listStyle |= SWT.RIGHT_TO_LEFT;
+ if ((style & SWT.LEFT_TO_RIGHT) != 0) listStyle |= SWT.LEFT_TO_RIGHT;
+ list = new List(popup, listStyle);
+ if (font != null) list.setFont(font);
+ if (foreground != null) list.setForeground(foreground);
+ if (background != null) list.setBackground(background);
+
+ int[] popupEvents = {SWT.Close, SWT.Paint, SWT.Deactivate};
+ for (int i = 0; i < popupEvents.length; i++)
+ popup.addListener(popupEvents[i], listener);
+ int[] listEvents = {SWT.MouseUp, SWT.Selection, SWT.Traverse, SWT.KeyDown, SWT.KeyUp, SWT.FocusIn, SWT.Dispose};
+ for (int i = 0; i < listEvents.length; i++)
+ list.addListener(listEvents[i], listener);
+
+ if (items != null) list.setItems(items);
+ if (selectionIndex != -1) list.setSelection(selectionIndex);
+ }
+
+ /**
+ * Deselects the item at the given zero-relative index in the receiver's list. If the item at the index was already
+ * deselected, it remains deselected. Indices that are out of range are ignored.
+ *
+ * @param index the index of the item to deselect
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void deselect(int index) {
+ checkWidget();
+ list.deselect(index);
+ }
+
+ /**
+ * Deselects all selected items in the receiver's list.
+ * <p>
+ * Note: To clear the selection in the receiver's text field, use <code>clearSelection()</code>.
+ * </p>
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see #clearSelection
+ */
+ public void deselectAll() {
+ checkWidget();
+ list.deselectAll();
+ }
+
+ void dropDown(boolean drop) {
+ if (drop == isDropped()) return;
+ if (!drop) {
+ popup.setVisible(false);
+ if (!isDisposed() && arrow.isFocusControl()) {
+ text.setFocus();
+ }
+ return;
+ }
+
+ if (getShell() != popup.getParent()) {
+ String[] items = list.getItems();
+ int selectionIndex = list.getSelectionIndex();
+ list.removeListener(SWT.Dispose, listener);
+ popup.dispose();
+ popup = null;
+ list = null;
+ createPopup(items, selectionIndex);
+ }
+
+ updateWidget();
+
+ popup.setVisible(true);
+ list.setFocus();
+ }
+
+ /*
+ * Recalculate the size of the drop down menu
+ */
+ public void updateWidget() {
+ Point size = getSize();
+ int itemCount = list.getItemCount();
+ itemCount = (itemCount == 0) ? visibleItemCount : Math.min(visibleItemCount, itemCount);
+ int itemHeight = list.getItemHeight() * itemCount;
+ Point listSize = list.computeSize(SWT.DEFAULT, itemHeight, false);
+ list.setBounds(1, 1, Math.max(size.x - 2, listSize.x), listSize.y);
+
+ int index = list.getSelectionIndex();
+ if (index != -1) list.setTopIndex(index);
+ Display display = getDisplay();
+ Rectangle listRect = list.getBounds();
+ Rectangle parentRect = display.map(getParent(), null, getBounds());
+ Point comboSize = getSize();
+ Rectangle displayRect = getMonitor().getClientArea();
+ int width = Math.max(comboSize.x, listRect.width + 2);
+ int height = listRect.height + 2;
+ int x = parentRect.x;
+ int y = parentRect.y + comboSize.y;
+ if (y + height > displayRect.y + displayRect.height) y = parentRect.y - height;
+ popup.setBounds(x, y, width, height);
+ }
+
+ /*
+ * Return the Label immediately preceding the receiver in the z-order,
+ * or null if none.
+ */
+ Label getAssociatedLabel() {
+ Control[] siblings = getParent().getChildren();
+ for (int i = 0; i < siblings.length; i++) {
+ if (siblings[i] == SearchCCombo.this) {
+ if (i > 0 && siblings[i - 1] instanceof Label) {
+ return (Label) siblings[i - 1];
+ }
+ }
+ }
+ return null;
+ }
+
+ public Control[] getChildren() {
+ checkWidget();
+ return new Control[0];
+ }
+
+ /**
+ * Gets the editable state.
+ *
+ * @return whether or not the reciever is editable
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @since 3.0
+ */
+ public boolean getEditable() {
+ checkWidget();
+ return text.getEditable();
+ }
+
+ /**
+ * Returns the item at the given, zero-relative index in the receiver's list. Throws an exception if the index is out
+ * of range.
+ *
+ * @param index the index of the item to return
+ * @return the item at the given index
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list
+ * minus 1 (inclusive)</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public String getItem(int index) {
+ checkWidget();
+ return list.getItem(index);
+ }
+
+ /**
+ * Returns the number of items contained in the receiver's list.
+ *
+ * @return the number of items
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int getItemCount() {
+ checkWidget();
+ return list.getItemCount();
+ }
+
+ /**
+ * Returns the height of the area which would be used to display <em>one</em> of the items in the receiver's list.
+ *
+ * @return the height of one item
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int getItemHeight() {
+ checkWidget();
+ return list.getItemHeight();
+ }
+
+ /**
+ * Returns an array of <code>String</code>s which are the items in the receiver's list.
+ * <p>
+ * Note: This is not the actual structure used by the receiver to maintain its list of items, so modifying the array
+ * will not affect the receiver.
+ * </p>
+ *
+ * @return the items in the receiver's list
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public String[] getItems() {
+ checkWidget();
+ return list.getItems();
+ }
+
+ char getMnemonic(String string) {
+ int index = 0;
+ int length = string.length();
+ do {
+ while ((index < length) && (string.charAt(index) != '&'))
+ index++;
+ if (++index >= length) return '\0';
+ if (string.charAt(index) != '&') return string.charAt(index);
+ index++;
+ } while (index < length);
+ return '\0';
+ }
+
+ /**
+ * Returns a <code>Point</code> whose x coordinate is the start of the selection in the receiver's text field, and
+ * whose y coordinate is the end of the selection. The returned values are zero-relative. An "empty" selection as
+ * indicated by the the x and y coordinates having the same value.
+ *
+ * @return a point representing the selection start and end
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public Point getSelection() {
+ checkWidget();
+ return text.getSelection();
+ }
+
+ /**
+ * Returns the zero-relative index of the item which is currently selected in the receiver's list, or -1 if no item
+ * is selected.
+ *
+ * @return the index of the selected item
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int getSelectionIndex() {
+ checkWidget();
+ return list.getSelectionIndex();
+ }
+
+ public int getStyle() {
+ int style = super.getStyle();
+ style &= ~SWT.READ_ONLY;
+ if (!text.getEditable()) style |= SWT.READ_ONLY;
+ return style;
+ }
+
+ /**
+ * Returns a string containing a copy of the contents of the receiver's text field.
+ *
+ * @return the receiver's text
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public String getText() {
+ checkWidget();
+ return text.getText();
+ }
+
+ /**
+ * Returns the height of the receivers's text field.
+ *
+ * @return the text height
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int getTextHeight() {
+ checkWidget();
+ return text.getLineHeight();
+ }
+
+ /**
+ * Returns the maximum number of characters that the receiver's text field is capable of holding. If this has not
+ * been changed by <code>setTextLimit()</code>, it will be the constant <code>Combo.LIMIT</code>.
+ *
+ * @return the text limit
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int getTextLimit() {
+ checkWidget();
+ return text.getTextLimit();
+ }
+
+ /**
+ * Gets the number of items that are visible in the drop down portion of the receiver's list.
+ *
+ * @return the number of items that are visible
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @since 3.0
+ */
+ public int getVisibleItemCount() {
+ checkWidget();
+ return visibleItemCount;
+ }
+
+ void handleFocus(int type) {
+ if (isDisposed()) return;
+ switch (type) {
+ case SWT.FocusIn: {
+ if (hasFocus) return;
+ if (getEditable()) text.selectAll();
+ hasFocus = true;
+ Shell shell = getShell();
+ shell.removeListener(SWT.Deactivate, listener);
+ shell.addListener(SWT.Deactivate, listener);
+ Display display = getDisplay();
+ display.removeFilter(SWT.FocusIn, filter);
+ display.addFilter(SWT.FocusIn, filter);
+ Event e = new Event();
+ notifyListeners(SWT.FocusIn, e);
+ break;
+ }
+ case SWT.FocusOut: {
+ if (!hasFocus) return;
+ Control focusControl = getDisplay().getFocusControl();
+ if (focusControl == arrow || focusControl == list || focusControl == text) return;
+ hasFocus = false;
+ Shell shell = getShell();
+ shell.removeListener(SWT.Deactivate, listener);
+ Display display = getDisplay();
+ display.removeFilter(SWT.FocusIn, filter);
+ Event e = new Event();
+ notifyListeners(SWT.FocusOut, e);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Searches the receiver's list starting at the first item (index 0) until an item is found that is equal to the
+ * argument, and returns the index of that item. If no item is found, returns -1.
+ *
+ * @param string the search item
+ * @return the index of the item
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int indexOf(String string) {
+ checkWidget();
+ if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ return list.indexOf(string);
+ }
+
+ /**
+ * Searches the receiver's list starting at the given, zero-relative index until an item is found that is equal to
+ * the argument, and returns the index of that item. If no item is found or the starting index is out of range,
+ * returns -1.
+ *
+ * @param string the search item
+ * @param start the zero-relative index at which to begin the search
+ * @return the index of the item
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int indexOf(String string, int start) {
+ checkWidget();
+ if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ return list.indexOf(string, start);
+ }
+
+ void initAccessible() {
+ AccessibleAdapter accessibleAdapter = new AccessibleAdapter() {
+ public void getName(AccessibleEvent e) {
+ String name = null;
+ Label label = getAssociatedLabel();
+ if (label != null) {
+ name = stripMnemonic(label.getText());
+ }
+ e.result = name;
+ }
+
+ public void getKeyboardShortcut(AccessibleEvent e) {
+ String shortcut = null;
+ Label label = getAssociatedLabel();
+ if (label != null) {
+ String text = label.getText();
+ if (text != null) {
+ char mnemonic = getMnemonic(text);
+ if (mnemonic != '\0') {
+ shortcut = "Alt+" + mnemonic; //$NON-NLS-1$
+ }
+ }
+ }
+ e.result = shortcut;
+ }
+
+ public void getHelp(AccessibleEvent e) {
+ e.result = getToolTipText();
+ }
+ };
+ getAccessible().addAccessibleListener(accessibleAdapter);
+ text.getAccessible().addAccessibleListener(accessibleAdapter);
+ list.getAccessible().addAccessibleListener(accessibleAdapter);
+
+ arrow.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+ public void getName(AccessibleEvent e) {
+ e.result = isDropped() ? SWT.getMessage("SWT_Close") : SWT.getMessage("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void getKeyboardShortcut(AccessibleEvent e) {
+ e.result = "Alt+Down Arrow"; //$NON-NLS-1$
+ }
+
+ public void getHelp(AccessibleEvent e) {
+ e.result = getToolTipText();
+ }
+ });
+
+ getAccessible().addAccessibleTextListener(new AccessibleTextAdapter() {
+ public void getCaretOffset(AccessibleTextEvent e) {
+ e.offset = text.getCaretPosition();
+ }
+ });
+
+ getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
+ public void getChildAtPoint(AccessibleControlEvent e) {
+ Point testPoint = toControl(e.x, e.y);
+ if (getBounds().contains(testPoint)) {
+ e.childID = ACC.CHILDID_SELF;
+ }
+ }
+
+ public void getLocation(AccessibleControlEvent e) {
+ Rectangle location = getBounds();
+ Point pt = toDisplay(location.x, location.y);
+ e.x = pt.x;
+ e.y = pt.y;
+ e.width = location.width;
+ e.height = location.height;
+ }
+
+ public void getChildCount(AccessibleControlEvent e) {
+ e.detail = 0;
+ }
+
+ public void getRole(AccessibleControlEvent e) {
+ e.detail = ACC.ROLE_COMBOBOX;
+ }
+
+ public void getState(AccessibleControlEvent e) {
+ e.detail = ACC.STATE_NORMAL;
+ }
+
+ public void getValue(AccessibleControlEvent e) {
+ e.result = getText();
+ }
+ });
+
+ text.getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
+ public void getRole(AccessibleControlEvent e) {
+ e.detail = text.getEditable() ? ACC.ROLE_TEXT : ACC.ROLE_LABEL;
+ }
+ });
+
+ arrow.getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
+ public void getDefaultAction(AccessibleControlEvent e) {
+ e.result = isDropped() ? SWT.getMessage("SWT_Close") : SWT.getMessage("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ });
+ }
+
+ boolean isDropped() {
+ return popup.getVisible();
+ }
+
+ public boolean isFocusControl() {
+ checkWidget();
+ if (text.isFocusControl() || arrow.isFocusControl() || list.isFocusControl() || popup.isFocusControl()) {
+ return true;
+ }
+ return super.isFocusControl();
+ }
+
+ void internalLayout(boolean changed) {
+ if (isDropped()) dropDown(false);
+ Rectangle rect = getClientArea();
+ int width = rect.width;
+ int height = rect.height;
+ Point arrowSize = arrow.computeSize(SWT.DEFAULT, height, changed);
+ text.setBounds(0, 0, width - arrowSize.x, height);
+ arrow.setBounds(width - arrowSize.x, 0, arrowSize.x, arrowSize.y);
+ }
+
+ void listEvent(Event event) {
+ switch (event.type) {
+ case SWT.Dispose:
+ if (getShell() != popup.getParent()) {
+ String[] items = list.getItems();
+ int selectionIndex = list.getSelectionIndex();
+ popup = null;
+ list = null;
+ createPopup(items, selectionIndex);
+ }
+ break;
+ case SWT.FocusIn: {
+ handleFocus(SWT.FocusIn);
+ break;
+ }
+ case SWT.MouseUp: {
+ if (event.button != 1) return;
+ dropDown(false);
+ break;
+ }
+ case SWT.Selection: {
+ int index = list.getSelectionIndex();
+ if (index == -1) return;
+ text.setText(list.getItem(index));
+ text.selectAll();
+ list.setSelection(index);
+ Event e = new Event();
+ e.time = event.time;
+ e.stateMask = event.stateMask;
+ e.doit = event.doit;
+ notifyListeners(SWT.Selection, e);
+ event.doit = e.doit;
+ break;
+ }
+ case SWT.Traverse: {
+ switch (event.detail) {
+ case SWT.TRAVERSE_RETURN:
+ case SWT.TRAVERSE_ESCAPE:
+ case SWT.TRAVERSE_ARROW_PREVIOUS:
+ case SWT.TRAVERSE_ARROW_NEXT:
+ event.doit = false;
+ break;
+ }
+ Event e = new Event();
+ e.time = event.time;
+ e.detail = event.detail;
+ e.doit = event.doit;
+ e.character = event.character;
+ e.keyCode = event.keyCode;
+ notifyListeners(SWT.Traverse, e);
+ event.doit = e.doit;
+ event.detail = e.detail;
+ break;
+ }
+ case SWT.KeyUp: {
+ Event e = new Event();
+ e.time = event.time;
+ e.character = event.character;
+ e.keyCode = event.keyCode;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.KeyUp, e);
+ break;
+ }
+ case SWT.KeyDown: {
+ if (event.character == SWT.ESC) {
+ // Escape key cancels popup list
+ dropDown(false);
+ }
+ if ((event.stateMask & SWT.ALT) != 0 && (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN)) {
+ dropDown(false);
+ }
+ if (event.character == SWT.CR) {
+ // Enter causes default selection
+ dropDown(false);
+ Event e = new Event();
+ e.time = event.time;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.DefaultSelection, e);
+ }
+ // At this point the widget may have been disposed.
+ // If so, do not continue.
+ if (isDisposed()) break;
+ Event e = new Event();
+ e.time = event.time;
+ e.character = event.character;
+ e.keyCode = event.keyCode;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.KeyDown, e);
+ break;
+
+ }
+ }
+ }
+
+ void popupEvent(Event event) {
+ switch (event.type) {
+ case SWT.Paint:
+ // draw black rectangle around list
+ Rectangle listRect = list.getBounds();
+ Color black = getDisplay().getSystemColor(SWT.COLOR_BLACK);
+ event.gc.setForeground(black);
+ event.gc.drawRectangle(0, 0, listRect.width + 1, listRect.height + 1);
+ break;
+ case SWT.Close:
+ event.doit = false;
+ dropDown(false);
+ break;
+ case SWT.Deactivate:
+ dropDown(false);
+ break;
+ }
+ }
+
+ public void redraw() {
+ super.redraw();
+ text.redraw();
+ arrow.redraw();
+ if (popup.isVisible()) list.redraw();
+ }
+
+ public void redraw(int x, int y, int width, int height, boolean all) {
+ super.redraw(x, y, width, height, true);
+ }
+
+ /**
+ * Removes the item from the receiver's list at the given zero-relative index.
+ *
+ * @param index the index for the item
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list
+ * minus 1 (inclusive)</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void remove(int index) {
+ checkWidget();
+ list.remove(index);
+ }
+
+ /**
+ * Removes the items from the receiver's list which are between the given zero-relative start and end indices
+ * (inclusive).
+ *
+ * @param start the start of the range
+ * @param end the end of the range
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_INVALID_RANGE - if either the start or end are not between 0 and the number of elements
+ * in the list minus 1 (inclusive)</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void remove(int start, int end) {
+ checkWidget();
+ list.remove(start, end);
+ }
+
+ /**
+ * Searches the receiver's list starting at the first item until an item is found that is equal to the argument, and
+ * removes that item from the list.
+ *
+ * @param string the item to remove
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * <li>ERROR_INVALID_ARGUMENT - if the string is not found in the list</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void remove(String string) {
+ checkWidget();
+ if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ list.remove(string);
+ }
+
+ /**
+ * Removes all of the items from the receiver's list and clear the contents of receiver's text field.
+ * <p>
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void removeAll() {
+ checkWidget();
+ text.setText(""); //$NON-NLS-1$
+ list.removeAll();
+ }
+
+ /**
+ * Removes the listener from the collection of listeners who will be notified when the receiver's text is modified.
+ *
+ * @param listener the listener which should no longer be notified
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see ModifyListener
+ * @see #addModifyListener
+ */
+ public void removeModifyListener(ModifyListener listener) {
+ checkWidget();
+ if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ removeListener(SWT.Modify, listener);
+ }
+
+ /**
+ * Removes the listener from the collection of listeners who will be notified when the receiver's selection changes.
+ *
+ * @param listener the listener which should no longer be notified
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @see SelectionListener
+ * @see #addSelectionListener
+ */
+ public void removeSelectionListener(SelectionListener listener) {
+ checkWidget();
+ if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ removeListener(SWT.Selection, listener);
+ removeListener(SWT.DefaultSelection, listener);
+ }
+
+ /**
+ * Selects the item at the given zero-relative index in the receiver's list. If the item at the index was already
+ * selected, it remains selected. Indices that are out of range are ignored.
+ *
+ * @param index the index of the item to select
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void select(int index) {
+ checkWidget();
+ if (index == -1) {
+ list.deselectAll();
+ text.setText(""); //$NON-NLS-1$
+ return;
+ }
+ if (0 <= index && index < list.getItemCount()) {
+ if (index != getSelectionIndex()) {
+ text.setText(list.getItem(index));
+ text.selectAll();
+ list.select(index);
+ list.showSelection();
+ }
+ }
+ }
+
+ public void setBackground(Color color) {
+ super.setBackground(color);
+ background = color;
+ if (text != null) text.setBackground(color);
+ if (list != null) list.setBackground(color);
+ if (arrow != null) arrow.setBackground(color);
+ }
+
+ /**
+ * Sets the editable state.
+ *
+ * @param editable the new editable state
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @since 3.0
+ */
+ public void setEditable(boolean editable) {
+ checkWidget();
+ text.setEditable(editable);
+ }
+
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ if (popup != null) popup.setVisible(false);
+ if (text != null) text.setEnabled(enabled);
+ if (arrow != null) arrow.setEnabled(enabled);
+ }
+
+ public boolean setFocus() {
+ checkWidget();
+ return text.setFocus();
+ }
+
+ public void setFont(Font font) {
+ super.setFont(font);
+ this.font = font;
+ text.setFont(font);
+ list.setFont(font);
+ internalLayout(true);
+ }
+
+ public void setForeground(Color color) {
+ super.setForeground(color);
+ foreground = color;
+ if (text != null) text.setForeground(color);
+ if (list != null) list.setForeground(color);
+ if (arrow != null) arrow.setForeground(color);
+ }
+
+ /**
+ * Sets the text of the item in the receiver's list at the given zero-relative index to the string argument. This is
+ * equivalent to <code>remove</code>'ing the old item at the index, and then <code>add</code>'ing the new item
+ * at that index.
+ *
+ * @param index the index for the item
+ * @param string the new text for the item
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list
+ * minus 1 (inclusive)</li>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void setItem(int index, String string) {
+ checkWidget();
+ list.setItem(index, string);
+ }
+
+ /**
+ * Sets the receiver's list to be the given array of items.
+ *
+ * @param items the array of items
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the items array is null</li>
+ * <li>ERROR_INVALID_ARGUMENT - if an item in the items array is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void setItems(String[] items) {
+ checkWidget();
+ list.setItems(items);
+ if (!text.getEditable()) text.setText(""); //$NON-NLS-1$
+ }
+
+ /**
+ * Sets the layout which is associated with the receiver to be the argument which may be null.
+ * <p>
+ * Note : No Layout can be set on this Control because it already manages the size and position of its children.
+ * </p>
+ *
+ * @param layout the receiver's new layout or null
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ //public void setLayout (Layout layout) {
+ // checkWidget ();
+ // return;
+ //}
+ /**
+ * Sets the selection in the receiver's text field to the range specified by the argument whose x coordinate is the
+ * start of the selection and whose y coordinate is the end of the selection.
+ *
+ * @param selection a point representing the new selection start and end
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the point is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void setSelection(Point selection) {
+ checkWidget();
+ if (selection == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ text.setSelection(selection.x, selection.y);
+ }
+
+ /**
+ * Sets the contents of the receiver's text field to the given string.
+ * <p>
+ * Note: The text field in a <code>Combo</code> is typically only capable of displaying a single line of text.
+ * Thus, setting the text to a string containing line breaks or other special characters will probably cause it to
+ * display incorrectly.
+ * </p>
+ *
+ * @param string the new text
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the string is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void setText(String string) {
+ checkWidget();
+ if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ int index = list.indexOf(string);
+ if (index == -1) {
+ list.deselectAll();
+ text.setText(string);
+ return;
+ }
+ text.setText(string);
+ text.selectAll();
+ list.setSelection(index);
+ list.showSelection();
+ }
+
+ /**
+ * Sets the maximum number of characters that the receiver's text field is capable of holding to be the argument.
+ *
+ * @param limit new text limit
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_CANNOT_BE_ZERO - if the limit is zero</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void setTextLimit(int limit) {
+ checkWidget();
+ text.setTextLimit(limit);
+ }
+
+ public void setToolTipText(String string) {
+ checkWidget();
+ super.setToolTipText(string);
+ arrow.setToolTipText(string);
+ text.setToolTipText(string);
+ }
+
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (!visible) popup.setVisible(false);
+ }
+
+ /**
+ * Sets the number of items that are visible in the drop down portion of the receiver's list.
+ *
+ * @param count the new number of items to be visible
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ * @since 3.0
+ */
+ public void setVisibleItemCount(int count) {
+ checkWidget();
+ if (count < 0) return;
+ visibleItemCount = count;
+ }
+
+ String stripMnemonic(String string) {
+ int index = 0;
+ int length = string.length();
+ do {
+ while ((index < length) && (string.charAt(index) != '&'))
+ index++;
+ if (++index >= length) return string;
+ if (string.charAt(index) != '&') {
+ return string.substring(0, index - 1) + string.substring(index, length);
+ }
+ index++;
+ } while (index < length);
+ return string;
+ }
+
+ public void setSelection(int start, int end) {
+ text.setSelection(start, end);
+ }
+
+ void textEvent(Event event) {
+ switch (event.type) {
+ case SWT.FocusIn: {
+ handleFocus(SWT.FocusIn);
+ break;
+ }
+ case SWT.KeyDown: {
+ if (event.character == SWT.CR) {
+ dropDown(false);
+ Event e = new Event();
+ e.time = event.time;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.DefaultSelection, e);
+ }
+ //At this point the widget may have been disposed.
+ // If so, do not continue.
+ if (isDisposed()) break;
+
+ if (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN) {
+ event.doit = false;
+ if ((event.stateMask & SWT.ALT) != 0) {
+ boolean dropped = isDropped();
+ text.selectAll();
+ if (!dropped) setFocus();
+ dropDown(!dropped);
+ break;
+ }
+
+ int oldIndex = getSelectionIndex();
+ if (event.keyCode == SWT.ARROW_UP) {
+ select(Math.max(oldIndex - 1, 0));
+ } else {
+ select(Math.min(oldIndex + 1, getItemCount() - 1));
+ }
+ if (oldIndex != getSelectionIndex()) {
+ Event e = new Event();
+ e.time = event.time;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.Selection, e);
+ }
+ //At this point the widget may have been disposed.
+ // If so, do not continue.
+ if (isDisposed()) break;
+ }
+
+ // Further work : Need to add support for incremental search in
+ // pop up list as characters typed in text widget
+
+ Event e = new Event();
+ e.time = event.time;
+ e.character = event.character;
+ e.keyCode = event.keyCode;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.KeyDown, e);
+ break;
+ }
+ case SWT.KeyUp: {
+ Event e = new Event();
+ e.time = event.time;
+ e.character = event.character;
+ e.keyCode = event.keyCode;
+ e.stateMask = event.stateMask;
+ notifyListeners(SWT.KeyUp, e);
+ break;
+ }
+ case SWT.Modify: {
+ list.deselectAll();
+ Event e = new Event();
+ e.time = event.time;
+ notifyListeners(SWT.Modify, e);
+ break;
+ }
+ case SWT.MouseDown: {
+ if (event.button != 1) return;
+ if (text.getEditable()) return;
+ boolean dropped = isDropped();
+ text.selectAll();
+ if (!dropped) setFocus();
+ dropDown(!dropped);
+ break;
+ }
+ case SWT.MouseUp: {
+ if (event.button != 1) return;
+ if (text.getEditable()) return;
+ text.selectAll();
+ break;
+ }
+ case SWT.Traverse: {
+ switch (event.detail) {
+ case SWT.TRAVERSE_RETURN:
+ case SWT.TRAVERSE_ARROW_PREVIOUS:
+ case SWT.TRAVERSE_ARROW_NEXT:
+ // The enter causes default selection and
+ // the arrow keys are used to manipulate the list contents so
+ // do not use them for traversal.
+ event.doit = false;
+ break;
+ }
+
+ Event e = new Event();
+ e.time = event.time;
+ e.detail = event.detail;
+ e.doit = event.doit;
+ e.character = event.character;
+ e.keyCode = event.keyCode;
+ notifyListeners(SWT.Traverse, e);
+ event.doit = e.doit;
+ event.detail = e.detail;
+ break;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCellEditor.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCellEditor.java
new file mode 100644
index 00000000000..0e23dfa8b62
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/SearchCellEditor.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import java.text.MessageFormat;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+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.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * A cell editor that presents a list of items in a combo box. The cell editor's value is the zero-based index of the
+ * selected item.
+ * <p>
+ * This class may be instantiated; it is not intended to be subclassed.
+ * </p>
+ */
+public class SearchCellEditor extends CellEditor {
+
+ /**
+ * The zero-based index of the selected item.
+ */
+ int selection;
+ int maxDisplayed = 5;
+
+ /**
+ * The custom combo box control.
+ */
+ SearchCCombo comboBox;
+
+ private Search searchControl;
+
+ /**
+ * Default SearchCellEditor style
+ */
+ private static final int defaultStyle = SWT.NONE;
+
+ public SearchCellEditor() {
+ setStyle(defaultStyle);
+ }
+
+ /**
+ * Creates a new cell editor with a combo containing the given list of choices and parented under the given control.
+ * The cell editor value is the zero-based index of the selected item. Initially, the cell editor has no cell
+ * validator and the first item in the list is selected.
+ *
+ * @param parent the parent control
+ * @param items the list of strings for the combo box
+ */
+ public SearchCellEditor(Composite parent, String[] items) {
+ this(parent, items, defaultStyle);
+ }
+
+ /**
+ * Creates a new cell editor with a combo containing the given list of choices and parented under the given control.
+ * The cell editor value is the zero-based index of the selected item. Initially, the cell editor has no cell
+ * validator and the first item in the list is selected.
+ *
+ * @param parent the parent control
+ * @param items the list of strings for the combo box
+ * @param style the style bits
+ * @since 2.1
+ */
+ public SearchCellEditor(Composite parent, String[] items, int style) {
+ super(parent, style);
+ searchControl = new Search(items);
+ setItems(items, true);
+ }
+
+ /**
+ * Returns the list of choices for the combo box
+ *
+ * @return the list of choices for the combo box
+ */
+ public String[] getItems() {
+ return searchControl.getItems();
+ }
+
+ /**
+ * Sets the list of choices for the combo box
+ *
+ * @param items the list of choices for the combo box
+ */
+ public void setItems(String[] items, boolean reset) {
+ Assert.isNotNull(items);
+ populateComboBoxItems(items, reset);
+ }
+
+ /**
+ * Sets the number of choices displayed
+ *
+ * @param count - number of items to display in list
+ */
+ public void setVisibleItemCount(int count) {
+ comboBox.setVisibleItemCount(count);
+ }
+
+ /**
+ * Sets the number of choices displayed up to maxDisplayed
+ */
+ public void setVisibleItemCount() {
+ if (comboBox.getItemCount() > maxDisplayed)
+ this.setVisibleItemCount(maxDisplayed);
+ else
+ this.setVisibleItemCount(comboBox.getItemCount());
+ comboBox.redraw();
+ }
+
+ /**
+ * Sets the maximum number of items to display
+ *
+ * @param max - maximum number of items to display
+ */
+ public void setMaxDisplayed(int max) {
+ maxDisplayed = max;
+ this.setVisibleItemCount();
+ }
+
+ /**
+ * Gets the maximum number of items to display
+ *
+ * @return number of items to display in list
+ */
+ public int getMaxDisplayed() {
+ return maxDisplayed;
+ }
+
+ /* (non-Javadoc)
+ * Method declared on CellEditor.
+ */
+ protected Control createControl(Composite parent) {
+
+ comboBox = new SearchCCombo(parent, getStyle());
+ comboBox.setFont(parent.getFont());
+
+ comboBox.addKeyListener(new KeyAdapter() {
+ // hook key pressed - see PR 14201
+ public void keyPressed(KeyEvent e) {
+ keyReleaseOccured(e);
+ }
+
+ public void keyReleased(KeyEvent e) {
+ comboBox.setSelection(0, searchControl.getLength());
+ }
+ });
+
+ comboBox.addSelectionListener(new SelectionAdapter() {
+ public void widgetDefaultSelected(SelectionEvent event) {
+ applyEditorValueAndDeactivate();
+ }
+
+ public void widgetSelected(SelectionEvent event) {
+ selection = comboBox.getSelectionIndex();
+ }
+ });
+
+ comboBox.addTraverseListener(new TraverseListener() {
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_ESCAPE || e.detail == SWT.TRAVERSE_RETURN) {
+ e.doit = false;
+ }
+ }
+ });
+
+ comboBox.addFocusListener(new FocusAdapter() {
+ public void focusLost(FocusEvent e) {
+ SearchCellEditor.this.focusLost();
+ }
+ });
+
+ return comboBox;
+ }
+
+ /**
+ * The <code>SearchCellEditor</code> implementation of this <code>CellEditor</code> framework method returns the
+ * zero-based index of the current selection.
+ *
+ * @return the zero-based index of the current selection wrapped as an <code>Integer</code>
+ */
+ protected Object doGetValue() {
+ if (searchControl.getFirstIndex() == -1)
+ return new Integer(selection);
+ else
+ return new Integer(selection + searchControl.getFirstIndex());
+ }
+
+ /* (non-Javadoc)
+ * Method declared on CellEditor.
+ */
+ protected void doSetFocus() {
+ comboBox.setFocus();
+ }
+
+ /**
+ * The <code>SearchCellEditor</code> implementation of this <code>CellEditor</code> framework method sets the
+ * minimum width of the cell. The minimum width is 10 characters if <code>comboBox</code> is not <code>null</code>
+ * or <code>disposed</code> eles it is 60 pixels to make sure the arrow button and some text is visible. The list
+ * of CCombo will be wide enough to show its longest item.
+ */
+ public LayoutData getLayoutData() {
+ LayoutData layoutData = super.getLayoutData();
+ if ((comboBox == null) || comboBox.isDisposed())
+ layoutData.minimumWidth = 60;
+ else {
+ // make the comboBox 10 characters wide
+ GC gc = new GC(comboBox);
+ layoutData.minimumWidth = (gc.getFontMetrics().getAverageCharWidth() * 10) + 10;
+ gc.dispose();
+ }
+ return layoutData;
+ }
+
+ /**
+ * The <code>SearchCellEditor</code> implementation of this <code>CellEditor</code> framework method accepts a
+ * zero-based index of a selection.
+ *
+ * @param value the zero-based index of the selection wrapped as an <code>Integer</code>
+ */
+ protected void doSetValue(Object value) {
+ Assert.isTrue(comboBox != null && ((value instanceof Integer) || (value instanceof String)));
+ if (value instanceof Integer) {
+ selection = ((Integer) value).intValue();
+ comboBox.select(selection);
+ } else if (value instanceof String) {
+ comboBox.setText((String) value);
+ }
+ }
+
+ /**
+ * Updates the list of choices for the combo box for the current control.
+ */
+ private void populateComboBoxItems(String[] items, boolean reset) {
+ if (comboBox != null && items != null) {
+ comboBox.removeAll();
+ for (int i = 0; i < items.length; i++)
+ comboBox.add(items[i], i);
+
+ setValueValid(true);
+ this.setVisibleItemCount();
+ if (reset) selection = 0;
+ }
+ }
+
+ /**
+ * Applies the currently selected value and deactiavates the cell editor
+ */
+ void applyEditorValueAndDeactivate() {
+ // must set the selection before getting value
+ selection = comboBox.getSelectionIndex();
+ Object newValue = doGetValue();
+ markDirty();
+ boolean isValid = isCorrect(newValue);
+ setValueValid(isValid);
+ if (!isValid) {
+ // try to insert the current value into the error message.
+ setErrorMessage(MessageFormat.format(getErrorMessage(), new Object[] {searchControl.getItems()[selection]}));
+ }
+ fireApplyEditorValue();
+ deactivate();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#focusLost()
+ */
+ protected void focusLost() {
+ if (isActivated()) {
+ applyEditorValueAndDeactivate();
+ }
+ selection = (Integer) this.doGetValue();
+ searchControl.reset();
+ setItems(searchControl.getItems(), false);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
+ */
+ protected void keyReleaseOccured(KeyEvent keyEvent) {
+ if (keyEvent.character == '\u001b') { // Escape character
+ fireCancelEditor();
+ } else if (keyEvent.character == '\t') { // tab key
+ applyEditorValueAndDeactivate();
+ } else if (keyEvent.character != 0x00) {
+ searchControl.progressiveSearch(keyEvent);
+ if (searchControl.getDirty()) {
+ setItems(searchControl.getItems(), true);
+ comboBox.select(selection);
+ comboBox.updateWidget();
+ comboBox.setSelection(0, searchControl.getLength());
+ searchControl.setDirty(false);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/StackedViewer.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/StackedViewer.java
new file mode 100644
index 00000000000..183c6c345cf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/StackedViewer.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.framework.ui.swt;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StackedViewer extends Composite {
+
+ public static final String DEFAULT_CONTROL = "DEFAULT_CONTROL";
+ private StackLayout stackLayout;
+ private Composite stackComposite;
+ private Map<String, Control> compositeMap;
+
+ public StackedViewer(Composite parent, int style) {
+ super(parent, style);
+ compositeMap = new HashMap<String, Control>();
+ create();
+ }
+
+ private void create() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ stackComposite = new Composite(this, SWT.NONE);
+ stackLayout = new StackLayout();
+ stackLayout.marginHeight = 0;
+ stackLayout.marginWidth = 0;
+ stackComposite.setLayout(stackLayout);
+ stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ compositeMap.clear();
+ compositeMap.put(DEFAULT_CONTROL, createDefault(stackComposite));
+
+ setCurrentControl(DEFAULT_CONTROL);
+ }
+
+ public Control addControl(String key, Control control) {
+ return compositeMap.put(key, control);
+ }
+
+ public Control removeControl(String key) {
+ return compositeMap.remove(key);
+ }
+
+ public int getControlCount() {
+ return compositeMap.size() - 1;
+ }
+
+ private Composite createDefault(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ label.setText("DEFAULT LAYER");
+ label.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ return composite;
+ }
+
+ public Composite getStackComposite() {
+ return stackComposite;
+ }
+
+ public void setCurrentControl(String key) {
+ Control control = compositeMap.get(key);
+ if (control == null) {
+ control = compositeMap.get(DEFAULT_CONTROL);
+ }
+ stackLayout.topControl = control;
+ stackComposite.layout();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Widget#dispose()
+ */
+ @Override
+ public void dispose() {
+ for (Control control : compositeMap.values()) {
+ Widgets.disposeWidget(control);
+ }
+ compositeMap.clear();
+ Widgets.disposeWidget(stackComposite);
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TabFolderItem.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TabFolderItem.java
new file mode 100644
index 00000000000..0a0918644d4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TabFolderItem.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.framework.ui.swt;
+
+import org.eclipse.swt.widgets.Composite;
+
+public abstract class TabFolderItem extends Composite implements ITabFolderItem {
+
+ public TabFolderItem(final EnhancedTabFolder folder, int style) {
+ super(folder.getFolder(), style);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TextCellEditor.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TextCellEditor.java
new file mode 100644
index 00000000000..d12b91c7400
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TextCellEditor.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Allows editing of cells within a table widget
+ *
+ * @author Ken J. Aguilar
+ */
+public abstract class TextCellEditor extends CustomTableCellEditor<String> {
+ private final TableEditor editor;
+ private final Table table;
+ private final int columnIndex;
+ private final int textStyle;
+ private final String toolTip;
+ private boolean enabled;
+
+ /**
+ * Listern that handles displaying and closing the edit box on the cell to be editted
+ *
+ * @author Ken J. Aguilar
+ */
+ private final class EditCellListener implements Listener {
+ public void handleEvent(Event event) {
+ final Point pt = new Point(event.x, event.y);
+ int index = table.getTopIndex();
+ while (index < table.getItemCount()) {
+ if (!doNotEditList.get(index)) {
+ final int rowIndex = index;
+ final TableItem item = table.getItem(index);
+ final Rectangle rect = item.getBounds(columnIndex);
+ if (rect.contains(pt)) {
+ final String oldText = item.getText(columnIndex);
+ final Text text = new Text(table, textStyle);
+ text.setToolTipText(toolTip);
+ final Listener textListener = new Listener() {
+ public void handleEvent(final Event e) {
+ final String value = text.getText();
+ switch (e.type) {
+ case SWT.FocusOut:
+ item.setText(columnIndex, focusLost(rowIndex, value, oldText));
+ text.dispose();
+ break;
+ case SWT.Traverse:
+ switch (e.detail) {
+ case SWT.TRAVERSE_RETURN:
+ item.setText(columnIndex, applyValue(rowIndex, value, oldText));
+ // FALL THROUGH
+ case SWT.TRAVERSE_ESCAPE:
+ text.dispose();
+ e.doit = false;
+ }
+ break;
+ }
+ }
+ };
+ text.addListener(SWT.FocusOut, textListener);
+ text.addListener(SWT.Traverse, textListener);
+ editor.setEditor(text, item, columnIndex);
+ text.setText(oldText);
+ text.selectAll();
+ text.setFocus();
+ return;
+ }
+ }
+ index++;
+ }
+ }
+ }
+
+ private final EditCellListener tblListener;
+
+ /**
+ * Creates a new Text Cell Editor on te specified table for the given column index.
+ *
+ * @param table the table that will host this Cell Editor
+ * @param columnIndex the index of the column this editor will edit cells for
+ * @param textStyle the style of the edit box
+ * @param toolTip the tool tip text of the edit box
+ */
+ public TextCellEditor(final Table table, final int columnIndex, final int textStyle, final String toolTip) {
+ this.table = table;
+ this.columnIndex = columnIndex;
+ this.textStyle = textStyle;
+ this.toolTip = toolTip;
+ this.enabled = true;
+ editor = new TableEditor(table);
+ editor.horizontalAlignment = SWT.LEFT;
+ editor.grabHorizontal = true;
+ tblListener = new EditCellListener();
+ table.addListener(SWT.MouseDown, tblListener);
+ }
+
+ /**
+ * Called when the user has typed a value and then presses <I><B>Enter</B></I>.
+ *
+ * @param itemIndex the zero relative index of the {@link TableItem} of the cell to be edited
+ * @param value the value that the user typed
+ * @param previousValue the value that was in the cell before the edit took place
+ * @return the value that will be actually written into the table's cell
+ */
+ abstract protected String applyValue(final int itemIndex, final String value, final String previousValue);
+
+ /**
+ * Called when the cell editor has lost focus.
+ *
+ * @param itemIndex
+ * @param value
+ * @param previousValue
+ * @return String
+ */
+ abstract protected String focusLost(final int itemIndex, final String value, final String previousValue);
+
+ /**
+ * Either enables or disables this cell editor. A disabled cell editor will not edit any cells in the entire column
+ * that this cell editor is attached to.
+ *
+ * @param enabled
+ */
+ public void setEnabled(boolean enabled) {
+ // do nothing if already enabled/disabled
+ if (this.enabled == enabled) return;
+
+ if (enabled) {
+ table.addListener(SWT.MouseDown, tblListener);
+ this.enabled = true;
+ } else {
+ table.removeListener(SWT.MouseDown, tblListener);
+ this.enabled = false;
+ }
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeNode.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeNode.java
new file mode 100644
index 00000000000..06340107a0a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeNode.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.framework.ui.swt;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class TreeNode implements ITreeNode, Serializable {
+ private static final long serialVersionUID = -4932401485883022954L;
+ private ITreeNode parent;
+ protected Object[] children;
+ private Object backingData;
+
+ /**
+ * Constructor for serialization.
+ */
+ protected TreeNode() {
+
+ }
+
+ /**
+ * Create a stand alone node backed by some data.
+ */
+ public TreeNode(Object backingData) {
+ this(null, null, backingData);
+ }
+
+ /**
+ * @param parent
+ * @param children
+ * @param backingData
+ */
+ public TreeNode(ITreeNode parent, Object[] children, Object backingData) {
+ this.parent = parent;
+ this.children = children;
+ this.backingData = backingData;
+ }
+
+ public Object[] getChildren() {
+ return children;
+ }
+
+ public void setChildren(Object[] objChildren) {
+ if (objChildren == null) {
+ this.children = new Object[0];
+ } else {
+ Collection<Object> newChildren = new ArrayList<Object>(objChildren.length);
+
+ for (Object obj : objChildren)
+ newChildren.add((obj instanceof ITreeNode) ? obj : getChild(obj));
+
+ this.children = newChildren.toArray();
+ }
+ }
+
+ public Object getBackingData() {
+ return backingData;
+ }
+
+ public ITreeNode getParent() {
+ return parent;
+ }
+
+ /**
+ * Subclasses should override this method so that calls to setChildren(objChildren) will result in a set of children
+ * that matches the subclass. The default implementation will setup the children as TreeNode's.
+ *
+ * @param backingData The data that should be placed on the child.
+ * @return A new node for the backing data.
+ */
+ protected ITreeNode getChild(Object backingData) {
+ return new TreeNode(this, null, backingData);
+ }
+
+ /**
+ * Recursively fill a node from a content provider runnable. If an exception is thrown from the provider then it will
+ * be set as the child of the node.
+ *
+ * @param node
+ * @param provider
+ */
+ public static void fillNode(ITreeNode node, IContentProviderRunnable provider) {
+ try {
+ node.setChildren(provider.run(node.getBackingData()));
+
+ for (Object child : node.getChildren())
+ fillNode((ITreeNode) child, provider);
+
+ } catch (Exception e) {
+ node.setChildren(new Object[] {e});
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == null)
+ throw new IllegalArgumentException("adapter can not be null");
+
+ else if (backingData instanceof IAdaptable) {
+ return ((IAdaptable) backingData).getAdapter(adapter);
+ }
+
+ else if (adapter.isInstance(backingData)) {
+ return backingData;
+ }
+
+ else if (adapter.isInstance(this)) {
+ return this;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeViewerUtility.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeViewerUtility.java
new file mode 100644
index 00000000000..51b7f06719c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/TreeViewerUtility.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.framework.ui.swt;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+
+/**
+ * Provides utility methods for the TreeViewer
+ *
+ * @author Jeff C. Phillips
+ * @author Robert A. Fisher
+ */
+public class TreeViewerUtility {
+ private static final Object dummy = new Object();
+
+ /**
+ * Retrieve a listing of all the selected items in preorder sequence.
+ *
+ * @param treeViewer The tree to be traversed
+ */
+ public static <A extends Object> void getPreorderSelection(TreeViewer treeViewer, List<A> selectedTreeItems) {
+ Map<A, Object> expansionHash = new HashMap<A, Object>();
+ Map<A, Object> selectionHash = new HashMap<A, Object>();
+ populateSelectionHash(treeViewer, selectionHash);
+ populateExpansionHash(treeViewer, expansionHash);
+ traverseTree(((ITreeContentProvider) treeViewer.getContentProvider()).getChildren(treeViewer.getInput()),
+ (ITreeContentProvider) treeViewer.getContentProvider(), selectedTreeItems, selectionHash, expansionHash);
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <A extends Object> void populateExpansionHash(TreeViewer tree, Map<A, Object> selectionHash) {
+
+ for (Object obj : tree.getExpandedElements()) {
+ selectionHash.put((A) obj, dummy);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <A extends Object> void populateSelectionHash(TreeViewer tree, Map<A, Object> selectionHash) {
+ Iterator iterator = ((IStructuredSelection) tree.getSelection()).iterator();
+
+ while (iterator.hasNext()) {
+ selectionHash.put((A) iterator.next(), dummy);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <A extends Object> void traverseTree(Object[] items, ITreeContentProvider contentProvider, List<A> selectedTreeItems, Map<A, Object> selectionHash, Map<A, Object> expandedHash) {
+ for (Object item : items) {
+ if (selectionHash.containsKey(item)) selectedTreeItems.add((A) item);
+ if (expandedHash.containsKey(item)) traverseTree(contentProvider.getChildren(item), contentProvider,
+ selectedTreeItems, selectionHash, expandedHash);
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Trees.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Trees.java
new file mode 100644
index 00000000000..26cb7245d42
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Trees.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.framework.ui.swt;
+
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+
+/**
+ * Convenience methods for working with SWT Trees
+ *
+ * @see org.eclipse.swt.widgets.Tree
+ * @author Robert A. Fisher
+ */
+public class Trees {
+
+ /**
+ * Pack all of the columns on a tree so that the columns fit the displayed data.
+ *
+ * @param tree
+ */
+ public static void packColumnData(Tree tree) {
+ TreeColumn[] columns = tree.getColumns();
+ for (TreeColumn column : columns) {
+ column.pack();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Widgets.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Widgets.java
new file mode 100644
index 00000000000..6d61dcf1446
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/Widgets.java
@@ -0,0 +1,825 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt;
+
+import java.util.regex.Pattern;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * Utility class that provides helper functions for SWT widgets
+ *
+ * @author Ken J. Aguilar
+ */
+public final class Widgets {
+ private static Composite targetContainer;
+
+ public static abstract class IntegerTextEntryHandler implements FocusListener, VerifyListener, TraverseListener {
+ private static final Pattern NEGATIVE_PATTERN = Pattern.compile("\\-?|\\-?\\d+");
+ private static final Pattern NON_NEGATIVE_PATTERN = Pattern.compile("\\d+");
+
+ private String currentTxt;
+ private final Pattern pattern;
+ private final Text txt;
+ private final StringBuilder str;
+
+ public IntegerTextEntryHandler(Text txt, boolean allowNegatives, int limit) {
+ this.txt = txt;
+ txt.addFocusListener(this);
+ txt.addVerifyListener(this);
+ txt.addTraverseListener(this);
+ str = new StringBuilder(limit + 2);
+ if (allowNegatives) {
+ pattern = NEGATIVE_PATTERN;
+ } else {
+ pattern = NON_NEGATIVE_PATTERN;
+ }
+ }
+
+ public void verifyText(VerifyEvent e) {
+ String text = txt.getText();
+ str.replace(0, text.length(), text);
+ str.setLength(text.length());
+ if (e.start == e.end) {
+ str.insert(e.start, e.text);
+ } else {
+ str.replace(e.start, e.end, e.text);
+ }
+ final String result = str.toString();
+ if (result.equals("")) {
+ e.doit = true;
+ } else {
+ e.doit = verifyValue(result);
+ }
+ }
+
+ public void focusGained(FocusEvent e) {
+ currentTxt = txt.getText();
+ txt.selectAll();
+ }
+
+ public void focusLost(FocusEvent e) {
+ try {
+ long value = Long.parseLong(txt.getText());
+ applyValue(value);
+ } catch (NumberFormatException ex) {
+ txt.setText(currentTxt);
+ }
+ }
+
+ public abstract void applyValue(long value);
+
+ public Long getPreviousValue() {
+ if (!currentTxt.equals("")) {
+ return Long.parseLong(currentTxt);
+ } else {
+ return null;
+ }
+ }
+
+ public void keyTraversed(TraverseEvent e) {
+ switch (e.detail) {
+ case SWT.TRAVERSE_ESCAPE:
+ txt.setText(currentTxt);
+ break;
+ case SWT.TRAVERSE_RETURN:
+ try {
+ Long value = Long.parseLong(txt.getText());
+ applyValue(value);
+ currentTxt = txt.getText();
+ } catch (NumberFormatException ex) {
+ txt.setText(currentTxt);
+ }
+ break;
+ }
+ }
+
+ private boolean verifyValue(String value) {
+ return pattern.matcher(value).matches();
+ }
+
+ }
+
+ public static abstract class RealNumberTextEntryHandler implements FocusListener, VerifyListener, TraverseListener {
+ private static final Pattern NON_NEGATIVE_PATTERN = Pattern.compile("\\d*\\.?\\d*");
+ private static final Pattern NEGATIVE_PATTERN = Pattern.compile("[\\-.]?|\\-?\\d*\\.?\\d*");
+ private String currentTxt;
+ private final Pattern pattern;
+ private final Text txt;
+ private final StringBuilder str;
+
+ public RealNumberTextEntryHandler(Text txt, boolean allowNegatives, int limit) {
+ this.txt = txt;
+ txt.addFocusListener(this);
+ txt.addVerifyListener(this);
+ txt.addTraverseListener(this);
+ str = new StringBuilder(limit + 2);
+ if (allowNegatives) {
+ pattern = NEGATIVE_PATTERN;
+ } else {
+ pattern = NON_NEGATIVE_PATTERN;
+ }
+ }
+
+ public void verifyText(VerifyEvent e) {
+ String text = txt.getText();
+ str.replace(0, text.length(), text);
+ str.setLength(text.length());
+ if (e.start == e.end) {
+ str.insert(e.start, e.text);
+ } else {
+ str.replace(e.start, e.end, e.text);
+ }
+ final String result = str.toString();
+ if (result.equals("")) {
+ e.doit = true;
+ } else {
+ e.doit = verifyValue(result);
+ }
+ }
+
+ public void focusGained(FocusEvent e) {
+ currentTxt = txt.getText();
+ txt.selectAll();
+ }
+
+ public void focusLost(FocusEvent e) {
+ try {
+ double value = Double.parseDouble(txt.getText());
+ applyValue(value);
+ } catch (NumberFormatException ex) {
+ txt.setText(currentTxt);
+ }
+ }
+
+ public Double getPreviousValue() {
+ if (!currentTxt.equals("")) {
+ return Double.parseDouble(currentTxt);
+ } else {
+ return null;
+ }
+ }
+
+ public abstract void applyValue(double value);
+
+ public void keyTraversed(TraverseEvent e) {
+ switch (e.detail) {
+ case SWT.TRAVERSE_ESCAPE:
+ txt.setText(currentTxt);
+ break;
+ case SWT.TRAVERSE_RETURN:
+ try {
+ double value = Double.parseDouble(txt.getText());
+ applyValue(value);
+ currentTxt = txt.getText();
+ } catch (NumberFormatException ex) {
+ txt.setText(currentTxt);
+ }
+ break;
+ }
+ }
+
+ private boolean verifyValue(String value) {
+ return pattern.matcher(value).matches();
+ }
+
+ }
+
+ public static void setTargetContainer(Composite target) {
+ targetContainer = target;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param grabVExcess
+ * @param halign
+ * @param valign
+ * @param hspan
+ * @return Return grid data reference
+ */
+ public static GridData positionGridItem(Control control, boolean grabHExcess, boolean grabVExcess, int halign, int valign, int hspan) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.grabExcessVerticalSpace = grabVExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param grabVExcess
+ * @param halign
+ * @param valign
+ * @param hspan
+ * @param vspan
+ * @return Return grid data reference
+ */
+ public static GridData positionGridItem(final Control control, final boolean grabHExcess, final boolean grabVExcess, final int halign, final int valign, final int hspan, final int vspan) {
+
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.grabExcessVerticalSpace = grabVExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ gd.verticalSpan = vspan;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param halign
+ * @param valign
+ * @param hspan
+ * @return return grid data reference
+ */
+ public static GridData positionGridItem(Control control, boolean grabHExcess, int halign, int valign, int hspan) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param halign
+ * @param valign
+ * @return return grid data reference
+ */
+ public static GridData positionGridItem(final Control control, final boolean grabHExcess, final int halign, final int valign) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.horizontalAlignment = halign;
+ gd.verticalAlignment = valign;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param halign
+ * @param valign
+ * @param hspan
+ * @param vspan
+ * @return return grid data reference
+ */
+ public static GridData positionGridItem(Control control, boolean grabHExcess, int halign, int valign, int hspan, int vspan) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ gd.verticalSpan = vspan;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param halign
+ * @param valign
+ * @param hspan
+ * @param vspan
+ * @param width
+ * @return return grid data reference
+ */
+ public static GridData positionGridItem(Control control, boolean grabHExcess, int halign, int valign, int hspan, int vspan, int width) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ gd.verticalSpan = vspan;
+ gd.widthHint = width;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ /**
+ * Positions the specified control within a grid layout
+ *
+ * @param control
+ * @param grabHExcess
+ * @param halign
+ * @param valign
+ * @param hspan
+ * @param vspan
+ * @param width
+ * @param height
+ * @return return grid data reference
+ */
+ public static GridData positionGridItem(Control control, boolean grabHExcess, int halign, int valign, int hspan, int vspan, int width, int height) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ gd.verticalSpan = vspan;
+ gd.heightHint = height;
+ gd.widthHint = width;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ public static GridData positionGridItem(Control control, boolean grabHExcess, boolean grabVExcess, int halign, int valign, int hspan, int vspan, int width, int height) {
+ final GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = grabHExcess;
+ gd.grabExcessVerticalSpace = grabVExcess;
+ gd.horizontalAlignment = halign;
+ gd.horizontalSpan = hspan;
+ gd.verticalAlignment = valign;
+ gd.verticalSpan = vspan;
+ gd.heightHint = height;
+ gd.widthHint = width;
+ control.setLayoutData(gd);
+ return gd;
+ }
+
+ public static Text createTxt(String defaultTxt, int limit) {
+ final Text txt = new Text(targetContainer, SWT.BORDER);
+ txt.setTextLimit(limit);
+ txt.setText(defaultTxt);
+ return txt;
+ }
+
+ /**
+ * @param comp
+ * @param defaultTxt
+ * @param limit
+ * @return Return composite text
+ */
+ public static Text createTxt(Composite comp, String defaultTxt, int limit) {
+ final Text txt = new Text(comp, SWT.BORDER);
+ txt.setTextLimit(limit);
+ txt.setText(defaultTxt);
+ return txt;
+ }
+
+ public static Text createTxt(Composite comp, final int style, String defaultTxt, int limit) {
+ final Text txt = new Text(comp, style);
+ txt.setTextLimit(limit);
+ txt.setText(defaultTxt);
+ return txt;
+ }
+
+ public static Text createTxt(Composite comp, final int style, String defaultTxt) {
+ final Text txt = new Text(comp, style);
+ txt.setText(defaultTxt);
+ return txt;
+ }
+
+ /**
+ * Creates a text box that only accepts numbers
+ *
+ * @param comp
+ * @param defaultTxt
+ * @param limit
+ * @return Return numeric text
+ */
+ public static Text createNumericTxt(Composite comp, String defaultTxt, int limit) {
+ return createNumericTxt(comp, defaultTxt, limit, SWT.BORDER);
+ }
+
+ public static Text createNumericTxt(Composite comp, String defaultTxt, int limit, int style) {
+ final Text txtBox = new Text(comp, style);
+ txtBox.setTextLimit(limit);
+ txtBox.setText(defaultTxt);
+ txtBox.addVerifyListener(new VerifyListener() {
+ public void verifyText(final VerifyEvent e) {
+ final StringBuilder str = new StringBuilder(txtBox.getText());
+ if (e.start == e.end) {
+ // user is typing a character
+ str.insert(e.start, e.text);
+ } else {
+ // user is replacing a range of values
+ str.replace(e.start, e.end, e.text);
+ }
+ final String txt = str.toString();
+ e.doit = txt.matches("\\d*");
+ }
+ });
+ return txtBox;
+ }
+
+ public static Text createDecimalText(Composite comp, String defaultTxt, int min, int max, int limit, int style) {
+ final Text txtBox = new Text(comp, style);
+ txtBox.setTextLimit(limit);
+ txtBox.setText(defaultTxt);
+ txtBox.addVerifyListener(new VerifyListener() {
+ public void verifyText(final VerifyEvent e) {
+ final StringBuilder str = new StringBuilder(txtBox.getText());
+ if (e.start == e.end) {
+ // user is typing a character
+ str.insert(e.start, e.text);
+ } else {
+ // user is replacing a range of values
+ str.replace(e.start, e.end, e.text);
+ }
+ final String txt = str.toString();
+ e.doit = txt.matches("\\d*");
+ }
+ });
+ return txtBox;
+ }
+
+ public static Label createLbl(String txt, int align) {
+ Label lbl = new Label(targetContainer, align);
+ lbl.setText(txt);
+ return lbl;
+ }
+
+ public static Label createLbl(Composite item, String txt, int align) {
+ final Label lbl = new Label(item, align);
+ lbl.setText(txt);
+ return lbl;
+ }
+
+ public static Group createGrp(Composite item, String txt) {
+ Group grp = new Group(item, SWT.NONE);
+ grp.setText(txt);
+ return grp;
+
+ }
+
+ public static Button createBtn(int style, String txt) {
+ final Button btn = new Button(targetContainer, style);
+ btn.setText(txt);
+ return btn;
+ }
+
+ public static Button createBtn(Composite comp, int style, String txt) {
+ final Button btn = new Button(comp, style);
+ btn.setText(txt);
+ return btn;
+ }
+
+ public static Button createBtn(Composite comp, int style, String txt, SelectionListener listener) {
+ final Button btn = new Button(comp, style);
+ btn.setText(txt);
+ btn.addSelectionListener(listener);
+ return btn;
+ }
+
+ public static Group createGrp(String txt) {
+ final Group grp = new Group(targetContainer, SWT.NONE);
+ grp.setText(txt);
+ return grp;
+ }
+
+ public static void setGridLayout(final Composite item, int numColumns, int columnSpacing) {
+ final GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ layout.horizontalSpacing = columnSpacing;
+ item.setLayout(layout);
+ }
+
+ public static void setRowLayout(final Composite item, final int style, final boolean wrap, final boolean pack) {
+ final RowLayout layout = new RowLayout(style);
+ layout.wrap = wrap;
+ layout.pack = pack;
+ item.setLayout(layout);
+ }
+
+ public static void setGridLayout(Composite item, int numColumns, int columnSpacing, boolean equal, int hpad) {
+ final GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ layout.horizontalSpacing = columnSpacing;
+ layout.makeColumnsEqualWidth = equal;
+ layout.marginLeft = hpad;
+ layout.marginRight = hpad;
+ item.setLayout(layout);
+ }
+
+ public static GridLayout setGridLayout(Composite item, int numColumns, int columnSpacing, int verticalSpacing, boolean equal, int hpad) {
+ final GridLayout layout = new GridLayout();
+ layout.numColumns = numColumns;
+ layout.horizontalSpacing = columnSpacing;
+ layout.makeColumnsEqualWidth = equal;
+ layout.marginLeft = hpad;
+ layout.marginRight = hpad;
+ layout.verticalSpacing = verticalSpacing;
+ layout.marginHeight = 0;
+ item.setLayout(layout);
+ return layout;
+ }
+
+ public static Combo createCombo(int style, Object[] list) {
+ final Combo cbx = new Combo(targetContainer, style);
+ for (Object element : list) {
+ cbx.add(element.toString());
+ }
+ cbx.select(0);
+
+ return cbx;
+ }
+
+ public static Combo createCombo(Composite item, int style, Object[] list) {
+ final Combo cbx = new Combo(item, style);
+ for (Object element : list) {
+ cbx.add(element.toString());
+ }
+ cbx.select(0);
+
+ return cbx;
+ }
+
+ public static Group createRadioGrp(final String txt, final int columns, final Object[] items) {
+ final Group grp = new Group(targetContainer, SWT.NONE);
+ grp.setText(txt);
+ setGridLayout(grp, columns, 10);
+ int count = 0;
+ for (Object obj : items) {
+
+ final Button rdo = new Button(grp, SWT.RADIO);
+ rdo.setText(obj.toString());
+ rdo.setData(obj);
+ rdo.setSelection((count == 0) ? true : false);
+ positionGridItem(rdo, false, SWT.BEGINNING, SWT.CENTER);
+ rdo.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ if (rdo.getSelection()) {
+ grp.setData(rdo.getData());
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+
+ }
+ });
+ count++;
+ }
+ return grp;
+ }
+
+ public static Group createRadioGrp(String txt, int columns, Object[] items, Button[] btns) {
+ final Group grp = new Group(targetContainer, SWT.NONE);
+ grp.setText(txt);
+ setGridLayout(grp, columns, 10);
+ int count = 0;
+ for (Object obj : items) {
+
+ final Button rdo = new Button(grp, SWT.RADIO);
+ btns[count] = rdo;
+ rdo.setText(obj.toString());
+ rdo.setData(obj);
+ rdo.setSelection((count == 0) ? true : false);
+ positionGridItem(rdo, false, SWT.BEGINNING, SWT.CENTER);
+ rdo.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ if (rdo.getSelection()) {
+ grp.setData(rdo.getData());
+ System.out.println(grp.getData().toString());
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+
+ }
+ });
+ count++;
+ }
+ return grp;
+ }
+
+ public static Group createRadioGrp(Composite comp, String txt, int columns, Object[] items) {
+ final Group grp = new Group(comp, SWT.NONE);
+ grp.setText(txt);
+ setGridLayout(grp, columns, 10);
+ int count = 0;
+ for (final Object item : items) {
+ final Button rdo = new Button(grp, SWT.RADIO);
+ rdo.setText(item.toString());
+ rdo.setSelection((count == 0) ? true : false);
+ positionGridItem(rdo, false, SWT.BEGINNING, SWT.CENTER);
+ rdo.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (rdo.getSelection()) {
+ grp.setData(item);
+ }
+ }
+ });
+ count++;
+ }
+ return grp;
+ }
+
+ public static Group createRadioGrp(Composite comp, String txt, int columns, Object[] items, Button[] btns) {
+ final Group grp = new Group(comp, SWT.NONE);
+ grp.setText(txt);
+ setGridLayout(grp, columns, 5);
+ int count = 0;
+ for (final Object obj : items) {
+
+ final Button rdo = new Button(grp, SWT.RADIO);
+ btns[count] = rdo;
+ rdo.setText(obj.toString());
+ rdo.setSelection((count == 0) ? true : false);
+ positionGridItem(rdo, false, SWT.CENTER, SWT.CENTER);
+ rdo.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (rdo.getSelection()) {
+ grp.setData(obj);
+ System.out.println(grp.getData().toString());
+ }
+ }
+ });
+ count++;
+ }
+ return grp;
+ }
+
+ /**
+ * Used in form layouts. Attaches the specified control to the specified edge of the item's parent
+ *
+ * @param control
+ * @param edge
+ * @param percent
+ * @param offset
+ */
+ public static void attachToParent(final Control control, final int edge, final int percent, final int offset) {
+ attachToParent(control, edge, percent, offset, SWT.DEFAULT, SWT.DEFAULT);
+ }
+
+ public static void attachToParent(final Control control, final int edge, final int percent, final int offset, int width, int height) {
+ final Object ld = control.getLayoutData();
+ final FormData fd = (ld != null) ? (FormData) ld : new FormData();
+ switch (edge) {
+ case SWT.LEFT:
+ fd.left = new FormAttachment(percent, offset);
+ break;
+ case SWT.RIGHT:
+ fd.right = new FormAttachment(percent, offset);
+ break;
+ case SWT.TOP:
+ fd.top = new FormAttachment(percent, offset);
+ break;
+ case SWT.BOTTOM:
+ fd.bottom = new FormAttachment(percent, offset);
+ break;
+ default:
+ throw new IllegalArgumentException("invalid edge specified");
+ }
+ fd.width = width;
+ fd.height = height;
+ control.setLayoutData(fd);
+ }
+
+ /**
+ * Used in form layouts. Attaches the specified control to the specified edge of another control
+ *
+ * @param control the parimary control that will be attached to another control
+ * @param itemToAttachTo the secondary control that the primary control will attach to
+ * @param edge the primary control's edge to attach
+ * @param itemToAttachToEdge the secondary control's edge
+ * @param offset the number of pixels between the two controls' edges
+ */
+ public static void attachToControl(final Control control, final Control itemToAttachTo, final int edge, final int itemToAttachToEdge, final int offset) {
+ attachToControl(control, itemToAttachTo, edge, itemToAttachToEdge, offset, SWT.DEFAULT, SWT.DEFAULT);
+ }
+
+ /**
+ * @param control
+ * @param itemToAttachTo
+ * @param edge
+ * @param itemToAttachToEdge
+ * @param offset
+ * @param width
+ * @param height
+ */
+ public static void attachToControl(final Control control, final Control itemToAttachTo, final int edge, final int itemToAttachToEdge, final int offset, final int width, final int height) {
+ final Object ld = control.getLayoutData();
+ final FormData fd = (ld != null) ? (FormData) ld : new FormData();
+ switch (edge) {
+ case SWT.LEFT:
+ fd.left = new FormAttachment(itemToAttachTo, offset, itemToAttachToEdge);
+ break;
+ case SWT.RIGHT:
+ fd.right = new FormAttachment(itemToAttachTo, offset, itemToAttachToEdge);
+ break;
+ case SWT.TOP:
+ fd.top = new FormAttachment(itemToAttachTo, offset, itemToAttachToEdge);
+ break;
+ case SWT.BOTTOM:
+ fd.bottom = new FormAttachment(itemToAttachTo, offset, itemToAttachToEdge);
+ break;
+ default:
+ throw new IllegalArgumentException("invalid edge specified");
+ }
+ fd.width = width;
+ fd.height = height;
+ control.setLayoutData(fd);
+ }
+
+ public static void setFormLayout(final Composite composite) {
+ composite.setLayout(new FormLayout());
+ }
+
+ /**
+ * sets the the layout of the specified composite to a form layout.
+ *
+ * @param composite
+ * @param marginWidth
+ * @param marginHeight
+ */
+ public static void setFormLayout(final Composite composite, final int marginWidth, final int marginHeight) {
+ final FormLayout fl = new FormLayout();
+ fl.marginWidth = marginWidth;
+ fl.marginHeight = marginHeight;
+ composite.setLayout(fl);
+ }
+
+ /**
+ * disposes all the supplied widgets if they are not null and not already disposed
+ *
+ * @param <T>
+ * @param widgets
+ */
+ public static <T extends Widget> void disposeWidgets(final T... widgets) {
+ if (widgets == null) return;
+ for (T widget : widgets) {
+ if (widget != null && !widget.isDisposed()) {
+ widget.dispose();
+ }
+ }
+ }
+
+ /**
+ * disposes all the controls including child controls if they are not null and not already disposed
+ *
+ * @param Control control to dispose
+ */
+ public static void disposeWidget(final Widget widget) {
+ if (isAccessible(widget)) {
+ if (widget instanceof Composite) {
+ for (Control child : ((Composite) widget).getChildren()) {
+ disposeWidget(child);
+ }
+ }
+ widget.dispose();
+ }
+ }
+
+ /**
+ * Checks if widget is accessible
+ *
+ * @return <b>true</b> if widget is not null and is not disposed
+ */
+ public static boolean isAccessible(Widget widget) {
+ return widget != null && !widget.isDisposed();
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ASpellWord.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ASpellWord.java
new file mode 100644
index 00000000000..351bb9d28f0
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ASpellWord.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.framework.ui.swt.styledText;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ASpellWord {
+ public String word;
+ public int start;
+
+ public ASpellWord(String word, int start) {
+ this.word = word;
+ this.start = start;
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/IDictionary.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/IDictionary.java
new file mode 100644
index 00000000000..05acdd1a3ae
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/IDictionary.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.framework.ui.swt.styledText;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IDictionary {
+
+ public abstract boolean isWord(String w);
+
+}
diff --git a/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ToolTip.java b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ToolTip.java
new file mode 100644
index 00000000000..10bbacaa04a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.swt/src/org/eclipse/osee/framework/ui/swt/styledText/ToolTip.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.swt.styledText;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class ToolTip {
+
+ Shell tipShell = null;
+ Label tipLabelText = null;
+ Shell parent = null;
+ String text = "ToolTip Text Not Set";
+
+ public ToolTip() {
+ }
+
+ public boolean isVisable() {
+ return (tipShell != null) && (tipShell.isVisible());
+ }
+
+ public void popUp(Display display) {
+ popUp(display.getCursorLocation());
+ }
+
+ public void popUp(Point location) {
+ // System.out.println("popupToolTip");
+ if (tipShell == null) {
+ create(parent);
+ open(getText(), location);
+ close();
+ }
+
+ if (isVisable()) {
+ return;
+ }
+
+ open(getText(), location);
+ }
+
+ public void popDown() {
+ close();
+ }
+
+ private void create(Composite parent) {
+
+ tipShell = new Shell(parent.getShell(), SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ gridLayout.marginWidth = 2;
+ gridLayout.marginHeight = 2;
+
+ tipShell.setLayout(gridLayout);
+ tipShell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ tipLabelText = new Label(tipShell, SWT.NONE);
+
+ tipLabelText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ tipLabelText.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ tipLabelText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
+
+ }
+
+ private void open(String text, Point loc) {
+
+ tipLabelText.setText(text);
+
+ // Size it
+ Rectangle displayBounds = tipShell.getDisplay().getBounds();
+ Rectangle shellBounds = tipShell.getBounds();
+ shellBounds.x = Math.max(Math.min(loc.x + 16, displayBounds.width - shellBounds.width), 0);
+ shellBounds.y = Math.max(Math.min(loc.y, displayBounds.height - shellBounds.height), 0);
+ tipShell.setBounds(shellBounds);
+
+ tipShell.pack();
+ tipShell.open();
+ tipShell.setVisible(true);
+
+ }
+
+ private void close() {
+ if (tipShell != null) tipShell.setVisible(false);
+ }
+
+ /**
+ * @return Returns the Text.
+ */
+ public String getText() {
+ return text;
+ }
+
+ /**
+ * @param text - The Text to set.
+ */
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ /**
+ * @return Returns the parent.
+ */
+ public Shell getParent() {
+ return parent;
+ }
+
+ /**
+ * @param parent The parent to set.
+ */
+ public void setParent(Shell parent) {
+ this.parent = parent;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath b/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath
new file mode 100644
index 00000000000..ad32c83a788
--- /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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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/.project b/org.eclipse.osee.framework.ui.workspacebundleloader/.project
new file mode 100644
index 00000000000..3bfb823ca79
--- /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 00000000000..934d11fb260
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+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.8.1.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator
+Bundle-Vendor: Eclpse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.workspacebundleloader
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 00000000000..6f20375d6c7
--- /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 00000000000..ea582c29e70
--- /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/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 00000000000..de9a429873d
--- /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.workspacebundleloader.internal.Activator;
+import org.eclipse.swt.widgets.Display;
+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() {
+ Display.getDefault().asyncExec(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/IJarChangeListener.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java
new file mode 100644
index 00000000000..cec9a2e31e5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.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.framework.ui.workspacebundleloader;
+
+import java.net.URL;
+
+/**
+ * @author Robert A. Fisher
+ *
+ */
+public interface IJarChangeListener <T extends JarCollectionNature> {
+
+ /**
+ * Called for each addition of bundle
+ *
+ * @param url
+ */
+ public void handleBundleAdded(URL url);
+
+ /**
+ * Called for each change of bundle
+ *
+ * @param url
+ */
+ public void handleBundleChanged(URL url);
+
+ /**
+ * Called for each removal of bundle
+ *
+ * @param url
+ */
+ 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
+ * @param nature
+ */
+ 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 00000000000..796a0e0208c
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.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.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;
+import org.osgi.framework.BundleException;
+
+/**
+ * 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;
+
+ /**
+ * @param natureId
+ * @param 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) {
+ // TODO
+ } catch (MalformedURLException ex) {
+ // TODO
+ }
+ }
+
+
+ /**
+ * @param event
+ * @throws CoreException
+ * @throws MalformedURLException
+ */
+ 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();
+ }
+ }
+ }
+
+
+ /**
+ * @param projectPath
+ * @param affectedChildren
+ * @throws BundleException
+ * @throws MalformedURLException
+ */
+ 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;
+ }
+ }
+
+ /**
+ * @param type
+ * @return
+ */
+ 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 00000000000..5f9e5efcd25
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.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.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+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.Manifest;
+import java.util.jar.Attributes.Name;
+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;
+
+ 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);
+ }
+
+ @Override
+ public void configure() throws CoreException {
+ }
+
+ @Override
+ public void deconfigure() throws CoreException {
+ }
+
+ @Override
+ public IProject getProject() {
+ return project;
+ }
+
+ @Override
+ public void setProject(IProject project) {
+ this.project = project;
+ }
+
+ public Collection<URL> getBundles() {
+ Collection<URL> urls = new ArrayList<URL>();
+ 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;
+ }
+
+ /**
+ * @param manifestFile
+ * @return
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ 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<T>();
+
+ 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 00000000000..9d9e23fbe1a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SafeWorkspaceTracker extends ServiceTracker implements IJarChangeListener<WorkspaceStarterNature> {
+
+ private Map<String, Bundle> installedBundles;
+ private Map<String, Bundle> runningBundles;
+ private Collection<Bundle> stoppedBundles;
+ private JarChangeResourceListener workspaceListener;
+ private SafeWorkspaceAccess service;
+
+ /**
+ * @param context
+ * @param filter
+ * @param customizer
+ */
+ public SafeWorkspaceTracker(BundleContext context) {
+ super(context, SafeWorkspaceAccess.class.getName(), null);
+ this.installedBundles = new HashMap<String, Bundle>();
+ this.runningBundles = new HashMap<String, Bundle>();
+ this.stoppedBundles = new LinkedList<Bundle>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
+ */
+ @Override
+ public Object addingService(ServiceReference reference) {
+ service = (SafeWorkspaceAccess) context.getService(reference);
+ setupWorkspaceBundleLoadingAfterBenchStartup();
+ return super.addingService(reference);
+ }
+
+ void setupWorkspaceBundleLoadingAfterBenchStartup() {
+ IWorkspace workspace = service.getWorkspace();
+
+ this.workspaceListener =
+ new JarChangeResourceListener<WorkspaceStarterNature>(WorkspaceStarterNature.NATURE_ID, this);
+ try {
+ installWorkspacePlugins();
+ } catch (CoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex.toString(), ex);
+ } catch (BundleException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex.toString(), ex);
+ }
+ workspace.addResourceChangeListener((JarChangeResourceListener) workspaceListener);
+ }
+
+ public synchronized void close() {
+ IWorkspace workspace = service.getWorkspace();
+ cleanupHandledBundles();
+ workspace.removeResourceChangeListener(workspaceListener);
+ super.close();
+ }
+
+ /**
+ *
+ */
+ private void cleanupHandledBundles() {
+ for (Bundle bundle : installedBundles.values()) {
+ try {
+ bundle.uninstall();
+ } catch (BundleException ex) {
+ }
+ }
+ for (Bundle bundle : runningBundles.values()) {
+ try {
+ bundle.stop();
+ bundle.uninstall();
+ } catch (BundleException ex) {
+ }
+ }
+ for (Bundle bundle : stoppedBundles) {
+ try {
+ bundle.uninstall();
+ } catch (BundleException ex) {
+ }
+ }
+ }
+
+ /**
+ * @throws CoreException
+ * @throws CoreException
+ * @throws BundleException
+ * @throws BundleException
+ */
+ private void installWorkspacePlugins() throws CoreException, BundleException {
+
+ for (WorkspaceStarterNature starterNature : WorkspaceStarterNature.getWorkspaceProjects()) {
+ for (URL url : starterNature.getBundles()) {
+ try {
+ handleBundleAdded(url);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ transitionInstalledPlugins();
+ }
+
+ /**
+ * @param url
+ * @throws BundleException
+ */
+ @Override
+ public void handleBundleAdded(URL url) {
+ try {
+ String urlString = url.toString();
+ installedBundles.put(urlString, context.installBundle(urlString));
+ } catch (BundleException ex) {
+ // TODO
+ }
+ }
+
+ /**
+ * @param stoppedBundles
+ * @param url
+ * @throws BundleException
+ */
+ @Override
+ public void handleBundleChanged(URL url) {
+ try {
+ String urlString = url.toString();
+
+ // Check to see if this is the first we've seen this
+ if (runningBundles.containsKey(urlString)) {
+ Bundle bundle = runningBundles.get(urlString);
+ System.out.println("\tUpdating plugin " + bundle.getSymbolicName());
+
+ bundle.update();
+ } else {
+ handleBundleAdded(url);
+ }
+ } catch (BundleException ex) {
+ // TODO
+ }
+ }
+
+ /**
+ * @param stoppedBundles
+ * @param url
+ * @throws BundleException
+ */
+ @Override
+ public void handleBundleRemoved(URL url) {
+ try {
+ String urlString = url.toString();
+ if (runningBundles.containsKey(urlString)) {
+ Bundle bundle = runningBundles.get(urlString);
+ System.out.println("\tStopping plugin " + bundle.getSymbolicName());
+
+ bundle.stop();
+ runningBundles.remove(urlString);
+ stoppedBundles.add(bundle);
+ }
+ } catch (BundleException ex) {
+ // TODO
+ }
+ }
+
+ /**
+ * @throws BundleException
+ */
+ private void transitionInstalledPlugins() throws BundleException {
+ Iterator<String> iter = installedBundles.keySet().iterator();
+ while (iter.hasNext()) {
+ String urlString = iter.next();
+ Bundle bundle = installedBundles.get(urlString);
+ try {
+ bundle.start();
+
+ iter.remove();
+ runningBundles.put(urlString, bundle);
+ } catch (Throwable th) {
+ OseeLog.log(Activator.class, Level.SEVERE, th);
+ }
+ }
+ }
+
+ /**
+ * @throws BundleException
+ */
+ private void transitionStoppedBundles() throws BundleException {
+ Iterator<Bundle> iter = stoppedBundles.iterator();
+ while (iter.hasNext()) {
+ Bundle bundle = iter.next();
+ try {
+ bundle.uninstall();
+
+ iter.remove();
+ } catch (Throwable th) {
+ OseeLog.log(Activator.class, Level.SEVERE, th);
+ }
+ }
+ }
+
+ @Override
+ public void handlePostChange() {
+ try {
+ transitionInstalledPlugins();
+ transitionStoppedBundles();
+ } catch (BundleException ex) {
+ // TODO
+ }
+ }
+
+ @Override
+ public void handleNatureClosed(WorkspaceStarterNature nature) {
+ closeAllPlugins(nature);
+ }
+
+ /**
+ * @param project
+ * @throws CoreException
+ * @throws BundleException
+ */
+ private void closeAllPlugins(WorkspaceStarterNature nature) {
+ for (URL url : nature.getBundles()) {
+ handleBundleRemoved(url);
+ }
+
+ try {
+ transitionStoppedBundles();
+ } catch (BundleException ex) {
+ // TODO
+ }
+ }
+}
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 00000000000..eeb2cd22012
--- /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 00000000000..39bab430fa5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 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 {
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.updater/.classpath b/org.eclipse.osee.framework.updater/.classpath
new file mode 100644
index 00000000000..1c92deb38df
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry exported="true" kind="lib" path="dlResources/"/>
+ <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.framework.updater/.project b/org.eclipse.osee.framework.updater/.project
new file mode 100644
index 00000000000..cce6098e7c9
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.updater</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.updater/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.framework.updater/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a8020f2dc2e
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Mar 28 14:00:57 GMT 2008
+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.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.framework.updater/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.updater/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..b0807a1adc2
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Updater Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.framework.updater;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.framework.updater.Activator
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.update.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.jdk.core
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.updater,
+ org.eclipse.osee.framework.updater.core
+Bundle-Vendor: Eclipse.org
+Bundle-ClassPath: .,
+ dlResources/
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.framework.updater/build.properties b/org.eclipse.osee.framework.updater/build.properties
new file mode 100644
index 00000000000..a0a85b1ef80
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/build.properties
@@ -0,0 +1,9 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ schema/,\
+ src/,\
+ bin/,\
+ dlResources/
diff --git a/org.eclipse.osee.framework.updater/buildJar.xml b/org.eclipse.osee.framework.updater/buildJar.xml
new file mode 100644
index 00000000000..aa665dd5b12
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/buildJar.xml
@@ -0,0 +1,17 @@
+<project name="Runtime" default="testrelease" basedir=".">
+ <target name="createrelease">
+ <jar jarfile="${PATH}/updater.jar" >
+ <fileset dir="src/"/>
+ <fileset dir="bin/"/>
+ <fileset dir="payload/"/>
+ <fileset dir="../osee.install.core/src/"/>
+ <fileset dir="../osee.install.core/bin/"/>
+ </jar>
+ </target>
+
+ <target name="testrelease">
+ <antcall target="createrelease">
+ <param name="PATH" value="../osee.update.container/" />
+ </antcall>
+ </target>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.framework.updater/plugin.xml b/org.eclipse.osee.framework.updater/plugin.xml
new file mode 100644
index 00000000000..507114c7eaf
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/plugin.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="InstallJob" name="InstallJob" schema="schema/InstallJob.exsd"/>
+ <extension
+ id="OseeInstallHandler"
+ name="Custom Install Handler"
+ point="org.eclipse.update.core.installHandlers">
+ <install-handler class="osee.updater.OseeInstallHandler"/>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.framework.updater/schema/InstallJob.exsd b/org.eclipse.osee.framework.updater/schema/InstallJob.exsd
new file mode 100644
index 00000000000..f6fa6c73850
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/schema/InstallJob.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.framework.updater">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.framework.updater" id="InstallJob" name="InstallJob"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="InstallJob"/>
+ </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="InstallJob">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="BaseInstallJob"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/Activator.java b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/Activator.java
new file mode 100644
index 00000000000..7c1a2e774c2
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/Activator.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.framework.updater;
+
+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.framework.updater";
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /*
+ * (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.framework.updater/src/org/eclipse/osee/framework/updater/BaseInstallJob.java b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/BaseInstallJob.java
new file mode 100644
index 00000000000..3c2d7aa169a
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/BaseInstallJob.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.framework.updater;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class BaseInstallJob implements IInstallJob {
+
+ public File getFile(String path) throws IOException {
+
+ URL url =
+ FileLocator.find(Platform.getBundle("org.eclipse.osee.framework.updater"), new Path("dlResources/" + path),
+ null);
+ url = FileLocator.resolve(url);
+ return new File(url.getFile());
+ }
+
+}
diff --git a/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/IInstallJob.java b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/IInstallJob.java
new file mode 100644
index 00000000000..5a47fbe8555
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/IInstallJob.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.framework.updater;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IInstallJob {
+ void run();
+}
diff --git a/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/OseeInstallHandler.java b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/OseeInstallHandler.java
new file mode 100644
index 00000000000..f92af8dfbcf
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/OseeInstallHandler.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies 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.updater;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.update.core.BaseInstallHandler;
+import org.eclipse.update.core.ContentReference;
+import org.eclipse.update.core.IFeatureContentConsumer;
+import org.eclipse.update.core.IFeatureContentProvider;
+import org.eclipse.update.core.INonPluginEntry;
+import org.eclipse.update.core.IVerificationListener;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeInstallHandler extends BaseInstallHandler {
+ private File pluginFile = null;
+
+ /**
+ * @throws InterruptedException
+ * @throws IOException
+ * @throws InvalidRegistryObjectException
+ * @throws ClassNotFoundException
+ * @throws IllegalAccessException
+ * @throws InstantiationException
+ * @throws SAXException
+ * @throws ParserConfigurationException
+ */
+ @SuppressWarnings("unchecked")
+ private void processInstallTaskExtensionPoints() throws InvalidRegistryObjectException, IOException, InterruptedException, ClassNotFoundException, InstantiationException, IllegalAccessException, ParserConfigurationException, SAXException {
+
+ if (pluginFile != null) {
+ Document doc = Jaxp.readXmlDocument(pluginFile);
+ NodeList list = doc.getElementsByTagName("extension");
+ for (int i = 0; i < list.getLength(); i++) {
+ Node node = list.item(i);
+ Node point = node.getAttributes().getNamedItem("point");
+ if (point.getTextContent().equals("org.eclipse.osee.framework.updater.InstallJob")) {
+ NodeList installJobElements = node.getChildNodes();
+
+ for (int j = 0; j < installJobElements.getLength(); j++) {
+ Node installJobElement = installJobElements.item(j);
+ System.out.println(installJobElement.getNodeType());
+ if (Node.ELEMENT_NODE == installJobElement.getNodeType()) {
+ System.out.println(installJobElement);
+ Node classNode = installJobElement.getAttributes().getNamedItem("class");
+ if (classNode != null) {
+ System.out.println(String.format("Searching for class [%s].", classNode.getTextContent()));
+ Class clazz =
+ Platform.getBundle("org.eclipse.osee.framework.updater").loadClass(
+ classNode.getTextContent());
+ IInstallJob job = (IInstallJob) clazz.newInstance();
+ System.out.println(String.format("Class found and instantiated."));
+ job.run();
+ System.out.println(String.format("Job Complete."));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void nonPluginDataDownloaded(INonPluginEntry[] nonPluginData, IVerificationListener listener) throws CoreException {
+
+ if (nonPluginData == null || nonPluginData.length == 0) return;
+
+ try {
+ URL url = FileLocator.find(Activator.getDefault().getBundle(), new Path("dlResources"), null);
+ url = FileLocator.resolve(url);
+ File copyToFolder = new File(url.getFile());
+
+ this.nonPluginEntries = nonPluginData;
+
+ IFeatureContentProvider provider = this.feature.getFeatureContentProvider();
+
+ for (int i = 0; i < this.nonPluginEntries.length; i++) {
+ ContentReference[] archives =
+ provider.getNonPluginEntryArchiveReferences(nonPluginEntries[i], this.monitor);
+ for (ContentReference archive : archives) {
+ try {
+ File destination = new File(copyToFolder, archive.getIdentifier());
+ destination.deleteOnExit();
+ File source = new File(archive.asFile().getAbsolutePath());
+
+ FileInputStream in = new FileInputStream(source);
+ destination.delete(); // to work around some file permission
+ destination.getParentFile().mkdirs();
+ FileOutputStream out = new FileOutputStream(destination);
+ byte[] bytes = new byte[(int) source.length()];
+ in.read(bytes);
+ out.write(bytes);
+ in.close();
+ out.close();
+
+ Lib.copyFile(new File(archive.asFile().getAbsolutePath()), destination);
+ System.out.println(archive.getIdentifier());
+ System.out.println(destination.getAbsolutePath());
+
+ if ("plugin.xml".equalsIgnoreCase(archive.getIdentifier())) {
+ this.pluginFile = destination;
+ }
+
+ } catch (IOException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ } catch (IOException ex1) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex1);
+ } catch (CoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.update.core.BaseInstallHandler#completeInstall(org.eclipse.update.core.IFeatureContentConsumer)
+ */
+ @Override
+ public void completeInstall(IFeatureContentConsumer consumer) throws CoreException {
+ super.completeInstall(consumer);
+ try {
+ processInstallTaskExtensionPoints();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ consumer.abort();
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/PostgresTasks.java b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/PostgresTasks.java
new file mode 100644
index 00000000000..5b1afa2d237
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/PostgresTasks.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.framework.updater.core;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PostgresTasks {//TODO move this to the correct project after the big structure refactor
+
+ private static File postgresBinDir = new File("C:\\postgres\\bin");
+
+ public static void launchPostGresInstaller(File installerDir) throws IOException, InterruptedException {
+ WindowsShell shell = new WindowsShell(installerDir);
+ shell.cmd("msiexec /i postgresql-8.2-int.msi /qr INTERNALLAUNCH=1 ADDLOCAL=server,psql,pgadmin SERVICEDOMAIN=\"%COMPUTERNAME%\" CREATESERVICEUSER=1 SERVICEPASSWORD=\"nEv.NifBi/BzeuUPFfdcng|RDWY|vD\" SUPERPASSWORD=\"postgres\" BASEDIR=\"c:\\postgres\" /l*v postsqlOSEELog.log");
+ shell.close();
+ }
+
+ public static void launchDbInit(File initFile) throws IOException, InterruptedException {
+ WindowsShell shell = new WindowsShell(postgresBinDir);
+ shell.cmd("psql.exe -a -e -f \"" + initFile.getAbsolutePath() + "\" -U postgres");
+ shell.close();
+ }
+
+ public static void launchDbInit(String args, File initFile, String user) throws IOException, InterruptedException {
+ WindowsShell shell = new WindowsShell(postgresBinDir);
+ shell.cmd("psql.exe " + args + " \"" + initFile.getAbsolutePath() + "\" -U " + user);
+ shell.close();
+ }
+
+ public static void launchDbRestore(File backupFile) throws IOException, InterruptedException {
+ WindowsShell shell = new WindowsShell(postgresBinDir);
+ shell.cmd("pg_restore.exe -i -h localhost -p 5432 -U postgres -d \"OSEE\" -v \"" + backupFile.getAbsolutePath() + "\"");
+ shell.close();
+ }
+
+ public static void writePasswordFile() throws FileNotFoundException {
+ File postgresqlFolder =
+ new File(
+ System.getProperty("user.home") + File.separator + "Application Data" + File.separator + "postgresql");
+ postgresqlFolder.mkdirs();
+ File passWordFile = new File(postgresqlFolder, "pgpass.conf");
+ PrintWriter wos = new PrintWriter(passWordFile);
+ wos.println("localhost:5432:*:postgres:postgres");
+ wos.flush();
+ wos.close();
+ }
+}
diff --git a/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/WindowsShell.java b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/WindowsShell.java
new file mode 100644
index 00000000000..8bdcd512b75
--- /dev/null
+++ b/org.eclipse.osee.framework.updater/src/org/eclipse/osee/framework/updater/core/WindowsShell.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.framework.updater.core;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+
+/*
+ * This class wraps up cmds as .bat files and runs them... this allows us to determine when the .bat file is
+ * complete.... running some things as just a cmd doesn't give us a consistant indication
+ * of when a cmd is completed.
+ */
+public class WindowsShell {//TODO move this to the correct project after the big structure refactor
+
+ // private PrintWriter writer;
+ // private StringWriter stringWriter;
+ // private int currentOutput = 0;
+
+ private PrintStream ps;
+ private final String prompt;
+ private File wd;
+
+ /*
+ * don't cd it'll screw up
+ */
+ public WindowsShell(File workingDir) throws IOException {
+ this.wd = workingDir;
+ prompt = workingDir.getAbsolutePath() + ">";
+ ProcessBuilder builder = new ProcessBuilder();
+ builder.directory(workingDir);
+ builder.command(new String[] {"cmd"});
+ Process proc = builder.start();
+ handleProcessOutput(proc);
+ ps = new PrintStream(proc.getOutputStream());//.write("installdb.bat")
+ }
+
+ private void handleProcessOutput(Process proc) {
+ final InputStream err = proc.getErrorStream();
+ final InputStream out = proc.getInputStream();
+
+ Thread errT = new Thread(new Runnable() {
+ public void run() {
+ processInputStream(err, System.err);
+ }
+ });
+ Thread outT = new Thread(new Runnable() {
+ public void run() {
+ processInputStream(out, System.out);
+ }
+ });
+
+ errT.start();
+ outT.start();
+ }
+
+ private void processInputStream(InputStream in, PrintStream out) {
+ int val;
+ try {
+ StringBuilder builder = new StringBuilder();
+ while ((val = in.read()) != -1) {
+ builder.append((char) val);
+ if (val == '\n' || val == '\r') {
+ if (builder.length() > 0) builder.delete(0, builder.length() - 1);
+ }
+ if (in.available() == 0) {
+ if (prompt.compareToIgnoreCase(builder.toString().trim()) == 0) {
+ notifyPrompt();
+ }
+ }
+ out.print((char) val);
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public synchronized void cmd(String cmd) throws InterruptedException, IOException {
+ OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File(wd, "launchHelper.bat")));
+ osw.append(cmd);
+ osw.flush();
+ osw.close();
+ ps.println("launchHelper.bat");
+ ps.flush();
+ this.wait();
+ }
+
+ public void close() {
+ ps.println("exit");
+ ps.flush();
+ }
+
+ /**
+ *
+ */
+ private synchronized void notifyPrompt() {
+ this.notify();
+ }
+
+}
diff --git a/org.eclipse.osee.master.feature/.project b/org.eclipse.osee.master.feature/.project
new file mode 100644
index 00000000000..67d0d41bdcc
--- /dev/null
+++ b/org.eclipse.osee.master.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.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.master.feature/build.properties b/org.eclipse.osee.master.feature/build.properties
new file mode 100644
index 00000000000..d4c4f61e69e
--- /dev/null
+++ b/org.eclipse.osee.master.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml
+generate.feature@org.eclipse.osee.define.feature.source = org.eclipse.osee.define.feature
+generate.feature@org.eclipse.osee.ats.feature.source = org.eclipse.osee.ats.feature
+generate.feature@org.eclipse.osee.framework.ui.feature.source = org.eclipse.osee.framework.ui.feature
+generate.feature@org.eclipse.osee.framework.feature.source = org.eclipse.osee.framework.feature
diff --git a/org.eclipse.osee.master.feature/feature.xml b/org.eclipse.osee.master.feature/feature.xml
new file mode 100644
index 00000000000..93ff8e2079f
--- /dev/null
+++ b/org.eclipse.osee.master.feature/feature.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.master.feature"
+ label="Eclipse OSEE Master Feature (Incubation)"
+ version="1.0.0.qualifier"
+ provider-name="Eclipse.org"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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>
+
+ <url>
+ <update label="OSEE Update Site" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <includes
+ id="org.eclipse.osee.external.feature"
+ version="0.0.0"/>
+
+ <includes
+ id="org.eclipse.osee.framework.feature"
+ version="0.0.0"/>
+
+ <includes
+ id="org.eclipse.osee.framework.ui.feature"
+ version="0.0.0"/>
+
+ <includes
+ id="org.eclipse.osee.define.feature"
+ version="0.0.0"/>
+
+ <includes
+ id="org.eclipse.osee.ats.feature"
+ version="0.0.0"/>
+
+ <includes
+ id="org.eclipse.osee.demo.feature"
+ version="0.0.0"/>
+
+ <includes id="org.eclipse.osee.define.feature.source" version="0.0.0"/>
+ <includes id="org.eclipse.osee.ats.feature.source" version="0.0.0"/>
+ <includes id="org.eclipse.osee.framework.feature.source" version="0.0.0"/>
+ <includes id="org.eclipse.osee.framework.ui.feature.source" version="0.0.0"/>
+</feature> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.client.msg/.classpath b/org.eclipse.osee.ote.client.msg/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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/.project b/org.eclipse.osee.ote.client.msg/.project
new file mode 100644
index 00000000000..721a67fef6d
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.project
@@ -0,0 +1,28 @@
+<?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>
+ </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/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ote.client.msg/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..c59ac876c8d
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Jan 19 15:41:22 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
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 00000000000..69c7ddb50e8
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+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: 1.1.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.client.msg.core.internal.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.ote.message,
+ 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.6
+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.org
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 00000000000..6f20375d6c7
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.client.msg/plugin.xml b/org.eclipse.osee.ote.client.msg/plugin.xml
new file mode 100644
index 00000000000..51fbb575938
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/plugin.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="org.wclipse.see.ote.client.msg.dBFactory" name="Message Database Factory" schema="schema/org.wclipse.see.ote.client.msg.dBFactory.exsd"/>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.client.msg/schema/org.wclipse.see.ote.client.msg.dBFactory.exsd b/org.eclipse.osee.ote.client.msg/schema/org.wclipse.see.ote.client.msg.dBFactory.exsd
new file mode 100644
index 00000000000..7e9af68725d
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/schema/org.wclipse.see.ote.client.msg.dBFactory.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.client.msg" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.ote.client.msg" id="org.wclipse.see.ote.client.msg.dBFactory" name="Message Database Factory"/>
+ </appinfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="DatabaseFactory"/>
+ </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="DatabaseFactory">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ote.client.msg.core.IMessageDbFactory"/>
+ </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.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 00000000000..40b10a22ba8
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.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.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.tool.IFileTransferHandle;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public interface IOteMessageService {
+ IMessageSubscription subscribe(String name);
+ 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 00000000000..bbaa752bf97
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.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.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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.client.msg.core.ISubscriptionListener#subscriptionCanceled(org.eclipse.osee.ote.client.msg.core.IMessageSubscription)
+ */
+ @Override
+ public void subscriptionCanceled(IMessageSubscription subscription) {
+ if (subscription.isResolved()) {
+ subscription.getMessage().removeListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.client.msg.core.ISubscriptionListener#subscriptionResolved(org.eclipse.osee.ote.client.msg.core.IMessageSubscription)
+ */
+ @Override
+ public void subscriptionResolved(IMessageSubscription subscription) {
+ if (subscription.isResolved()) {
+ subscription.getMessage().addListener(this);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.client.msg.core.ISubscriptionListener#subscriptionUnresolved(org.eclipse.osee.ote.client.msg.core.IMessageSubscription)
+ */
+ @Override
+ public void subscriptionUnresolved(IMessageSubscription subscription) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.listener.IOSEEMessageListener#onInitListener()
+ */
+ @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 00000000000..c114b3c6862
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.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.client.msg.core;
+
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.service.IMessageDictionary;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public interface IMessageDbFactory {
+
+ AbstractMessageDataBase createMessageDataBase(IMessageDictionary dictionary);
+}
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 00000000000..fda123e4772
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.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.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.MemType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public interface IMessageSubscription {
+ Message getMessage();
+
+ void cancel();
+
+ String getMessageClassName();
+
+ MessageMode getMessageMode();
+
+ MemType 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.
+ *
+ * @return
+ */
+ boolean isActive();
+ boolean isResolved();
+
+ void changeMemType(MemType type);
+
+ void send() throws Exception;
+
+ void setElementValue(List<Object> path, String value) throws Exception;
+
+ void zeroize(List<Object> path) throws Exception;
+
+ void changeMessageMode(MessageMode mode);
+
+ Set<MemType> 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 00000000000..cb08e2d56af
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.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.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
+ *
+ * @param subscription
+ */
+ 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.
+ *
+ * @param subscription
+ */
+ 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.
+ *
+ * @param subscription
+ */
+ void subscriptionUnresolved(IMessageSubscription subscription);
+
+ /**
+ * called upon successful registration with the test server. Message traffic
+ * is now possible
+ *
+ * @param subscription
+ */
+ void subscriptionActivated(IMessageSubscription subscription);
+
+ /**
+ * called when the {@link IMessageSubscription#cancel()} method is called.
+ * Any references and event listeners must be removed.
+ *
+ * @param subscription
+ */
+ 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.
+ *
+ * @param subscription
+ */
+ 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 00000000000..98c77d1894f
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+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.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+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;
+import org.eclipse.osee.ote.service.IMessageDictionary;
+
+/**
+ * @author 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 final IMessageDictionary dictionary;
+ private IMsgToolServiceClient client;
+ private IRemoteMessageService service;
+ private final DataReader reader = new DataReader(null, null, true, null, new EntityFactory() {
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ });
+
+ protected AbstractMessageDataBase(IMessageDictionary dictionary) {
+ this.dictionary = dictionary;
+ }
+
+ public MessageInstance findInstance(String name, MessageMode mode, MemType type) {
+ MessageReference reference = new MessageReference(type, mode, name);
+ return referenceToMsgMap.get(reference);
+ }
+
+ public MessageInstance acquireInstance(String name) throws Exception {
+ return acquireInstance(name, MessageMode.READER, null);
+ }
+
+ public MessageInstance acquireInstance(String name, MessageMode mode, MemType type) throws Exception {
+ if (type == null) {
+ Class<? extends Message> msgClass = dictionary.lookupMessage(name);
+ Message msg = createMessage(msgClass);
+ for (ArrayList<MessageData> dataList : (Collection<ArrayList<MessageData>>) msg.getAllData()) {
+ for (MessageData data : dataList) {
+ data.setReader(reader);
+ }
+ }
+ type = msg.getDefaultMessageData().getType();
+ }
+ MessageReference reference = new MessageReference(type, mode, name);
+ MessageInstance instance = referenceToMsgMap.get(reference);
+ if (instance == null) {
+ Class<? extends Message> msgClass = dictionary.lookupMessage(name);
+ 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 (service != null && !instance.isAttached()) {
+ doInstanceAttach(instance, service);
+ }
+ return instance;
+ }
+
+ public void releaseInstance(MessageInstance instance) throws Exception {
+ instance.decrementReferenceCount();
+ if (!instance.hasReferences()) {
+ if (instance.isAttached()) {
+ doInstanceDetach(instance, service);
+ }
+ 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(IRemoteMessageService service, IMsgToolServiceClient client) {
+ this.service = service;
+ this.client = client;
+ for (MessageInstance instance : referenceToMsgMap.values()) {
+ try {
+ doInstanceAttach(instance, service);
+ } catch (Exception e) {
+ OseeLog.log(AbstractMessageDataBase.class, Level.SEVERE, "could not attach instance for " + instance.toString(), e);
+ }
+ }
+ }
+
+ public void detachService(IRemoteMessageService service) {
+ this.service = null;
+ this.client = null;
+ for (MessageInstance instance : referenceToMsgMap.values()) {
+ doInstanceDetach(instance, service);
+ }
+
+ }
+
+ public MessageInstance findById(int id) {
+ return idToMsgMap.get(id);
+ }
+
+ private boolean doInstanceAttach(MessageInstance instance, IRemoteMessageService service) throws Exception {
+ Integer id = instance.attachToService(service, client);
+ if (id == null) {
+ // can't subscribe because environment does not support this type
+ return false;
+ }
+ idToMsgMap.put(id, instance);
+ return true;
+ }
+
+ private void doInstanceDetach(MessageInstance instance, IRemoteMessageService service) {
+ try {
+ Integer id = instance.getId();
+ if (id != null) {
+ idToMsgMap.remove(id);
+ }
+ instance.detachService(service, client);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected IMessageDictionary getDictionary() {
+ return dictionary;
+ }
+}
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 00000000000..81209b0d624
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.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.client.msg.core.db;
+
+import java.util.EnumSet;
+
+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.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+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 author Ken J. Aguilar
+ *
+ */
+public class MessageInstance {
+
+ private final MemType type;
+ private final MessageMode mode;
+ private final Message msg;
+ private SubscriptionKey serverSubscriptionKey = null;
+ private int refcount = 0;
+ private final EnumSet<MemType> availableTypes = EnumSet.noneOf(MemType.class);
+ private boolean supported = true;
+
+ public MessageInstance(Message msg, MessageMode mode, MemType 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(IRemoteMessageService service, IMsgToolServiceClient client) throws Exception {
+ SubscriptionDetails details = service.subscribeToMessage(new SubscribeToMessage(msg.getClass().getName(), type, mode, client));
+ if (details == null) {
+ supported = false;
+ return null;
+ }
+ supported = true;
+ msg.setData(details.getCurrentData());
+ availableTypes.clear();
+ availableTypes.addAll(details.getAvailableMemTypes());
+ serverSubscriptionKey = details.getKey();
+ return serverSubscriptionKey.getId();
+ }
+
+ public void detachService(IRemoteMessageService service, IMsgToolServiceClient client) throws Exception {
+ if (service != null) {
+ service.unsubscribeToMessage(new UnSubscribeToMessage(msg.getClass().getName(), mode, type, client));
+ }
+ availableTypes.clear();
+ 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 MemType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ public EnumSet<MemType> 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 00000000000..9fe317fd963
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.logging.Level;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.ote.client.msg.IOteMessageService;
+import org.eclipse.osee.ote.client.msg.core.IMessageDbFactory;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * 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 ServiceRegistration registration;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ this.context = context;
+ plugin = this;
+
+ ExtensionDefinedObjects<IMessageDbFactory> definedObjects = new ExtensionDefinedObjects<IMessageDbFactory>(
+ "org.wclipse.see.ote.client.msg.dBFactory", "DatabaseFactory", "className");
+ try {
+ List<IMessageDbFactory> providers = definedObjects.getObjects();
+ if (!providers.isEmpty()) {
+ MessageSubscriptionService service = new MessageSubscriptionService(providers.get(0));
+ registration = context.registerService(IOteMessageService.class.getName(), service, null);
+ } else {
+ OseeLog.log(Activator.class, Level.WARNING, "no message db factory found. Message Subscription Service not started");
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "failed to process message database factory extensions", ex);
+ }
+
+
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ if (registration != null) {
+ MessageSubscriptionService service = (MessageSubscriptionService) context.getService(registration.getReference());
+ service.shutdown();
+ registration.unregister();
+ registration = null;
+ }
+ 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 00000000000..b630765ed60
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.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.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.MemType;
+
+/**
+ * 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 MemType 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;
+ private final byte[] nameBuffer = new byte[128];
+
+ 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();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ 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, MemType memType) {
+ this.queue = new ArrayBlockingQueue<Task>(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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.ui.message.internal.core.IChannelHandler#process
+ * (java.nio.channels.SelectionKey)
+ */
+ 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
+ *
+ * @param data
+ * @param buffer
+ * @param time
+ */
+ protected void onUpdate(MessageInstance instance, ByteBuffer buffer, long time) {
+ MessageData msgData = instance.getMessage().getActiveDataSource(memType);
+ if (msgData != null) {
+ byte[] data = msgData.getMem().getData();
+ int remaining = buffer.remaining();
+ if (data.length < remaining) {
+ OseeLog.log(Activator.class, Level.WARNING, String.format("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);
+ 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/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 00000000000..6ea1b961c32
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.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.client.msg.core.internal;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public class MessageReference {
+
+ private final MemType type;
+ private final MessageMode mode;
+ private final String msgClassName;
+
+ public MessageReference(MemType 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 MemType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ 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/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 00000000000..d3dedb377aa
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.HashSet;
+import java.util.List;
+import java.util.Set;
+
+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.MemType;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+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 HashSet<ISubscriptionListener> listeners = new HashSet<ISubscriptionListener>();
+
+ /**
+ * creates a subscription with no reference to a message
+ *
+ * @param name
+ * @param subscriber
+ */
+ public MessageSubscription(MessageSubscriptionService msgService) {
+ this.msgService = msgService;
+ }
+
+ public synchronized void bind(String name) {
+ bind(name, null, MessageMode.READER);
+ }
+
+ private void bind(String name, MemType type, MessageMode mode) {
+ currentState = new UnresolvedState(name, this, type, mode);
+ }
+
+ @Override
+ public synchronized boolean isActive() {
+ return currentState != null ? currentState.isActive() : false;
+ }
+
+ @Override
+ public synchronized boolean isResolved() {
+ return currentState != null ? currentState.isResolved() : false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.IMessageSubscription#getMemType()
+ */
+ @Override
+ public synchronized MemType getMemType() {
+ return currentState.getMemType();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.IMessageSubscription#getMessageMode
+ * ()
+ */
+ @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(IRemoteMessageService service) {
+ currentState = currentState.onActivated();
+ }
+
+ public synchronized void detachService(IRemoteMessageService service) {
+ currentState = currentState.onDeactivated();
+ }
+
+ private void doCancel() {
+ if (currentState != null) {
+ currentState.onCanceled();
+ currentState = null;
+ }
+ }
+
+ @Override
+ public synchronized Set<MemType> getAvailableTypes() {
+ return currentState.getAvailableTypes();
+ }
+
+ @Override
+ public synchronized void changeMessageMode(MessageMode mode) {
+ if (mode == getMessageMode()) {
+ return;
+ }
+ String name = getMessageClassName();
+ MemType 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);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.IMessageSubscription#changeMemType
+ * (org.eclipse.osee.ote.message.enums.MemType)
+ */
+ @Override
+ public synchronized void changeMemType(MemType 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.getService() != null) {
+ attachService(msgService.getService());
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.IMessageSubscription#setElementValue
+ * (java.util.List, java.lang.String)
+ */
+ @Override
+ public void setElementValue(List<Object> path, String value) throws Exception {
+ final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), path, value);
+ msgService.getService().setElementValue(cmd);
+ }
+
+ @Override
+ public void send() throws Exception {
+ final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), null, null);
+ msgService.getService().setElementValue(cmd);
+ }
+
+ @Override
+ public void zeroize(List<Object> path) throws Exception {
+ final ZeroizeElement cmd = new ZeroizeElement(getMessageClassName(), getMemType(), path);
+ msgService.getService().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);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.client.msg.core.IMessageSubscription#
+ * addSubscriptionListener
+ * (org.eclipse.osee.ote.client.msg.core.ISubscriptionListener)
+ */
+ @Override
+ public 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.client.msg.core.IMessageSubscription#
+ * removeSubscriptionListener
+ * (org.eclipse.osee.ote.client.msg.core.ISubscriptionListener)
+ */
+ @Override
+ public boolean removeSubscriptionListener(ISubscriptionListener listener) {
+ return listeners.remove(listener);
+ }
+}
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 00000000000..918fe0994fd
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java
@@ -0,0 +1,418 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+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.ote.client.msg.IOteMessageService;
+import org.eclipse.osee.ote.client.msg.core.IMessageDbFactory;
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.RecordCommand.MessageRecordDetails;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystem;
+import org.eclipse.osee.ote.message.tool.IFileTransferHandle;
+import org.eclipse.osee.ote.message.tool.TransferConfig;
+import org.eclipse.osee.ote.message.tool.UdpFileTransferHandler;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.IMessageDictionary;
+import org.eclipse.osee.ote.service.IMessageDictionaryListener;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+
+/**
+ * @author author Ken J. Aguilar
+ *
+ */
+public class MessageSubscriptionService implements IOteMessageService, IMessageDictionaryListener, ITestConnectionListener, IMsgToolServiceClient {
+
+
+ /** * Static Fields ** */
+ private static final int MAX_CONCURRENT_WORKER_THREADS = Runtime.getRuntime().availableProcessors() + 1;
+
+ private final InetAddress localAddress;
+ private final LinkedList<MessageSubscription> subscriptions = new LinkedList<MessageSubscription>();
+ private IMsgToolServiceClient exportedThis = null;
+ private AbstractMessageDataBase msgDatabase;
+ private UdpFileTransferHandler fileTransferHandler;
+
+ 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;
+
+ 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 IRemoteMessageService service;
+
+ private final IMessageDbFactory messageDbFactory;
+ private final OteClientServiceTracker tracker;
+ private IOteClientService clientService;
+
+ public MessageSubscriptionService(IMessageDbFactory messageDbFactory) throws IOException {
+ tracker = new OteClientServiceTracker(this);
+ this.messageDbFactory = messageDbFactory;
+ localAddress = InetAddress.getLocalHost();
+ OseeLog.log(Activator.class, Level.INFO, "OTE client message service started on: " + localAddress.getHostAddress());
+ tracker.open();
+ }
+
+ void oteClientServiceAcquired(IOteClientService service) {
+ clientService = service;
+ clientService.addDictionaryListener(this);
+ clientService.addConnectionListener(this);
+ }
+
+ void oteClientServiceLost() {
+
+ }
+
+ public synchronized IMessageSubscription subscribe(String name) {
+ MessageSubscription subscription = new MessageSubscription(this);
+ subscription.bind(name);
+ if (msgDatabase != null) {
+ subscription.attachMessageDb(msgDatabase);
+ if (service != null) {
+ subscription.attachService(service);
+ }
+ }
+ 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() throws IOException {
+ if (clientService != null) {
+ clientService.removeDictionaryListener(this);
+ clientService.removeConnectionListener(this);
+ }
+ tracker.close();
+ shutdownDispatcher();
+ threadPool.shutdown();
+ try {
+ threadPool.awaitTermination(5, TimeUnit.SECONDS);
+ } catch (InterruptedException ex1) {
+ OseeLog.log(Activator.class, Level.WARNING, ex1.toString(), ex1);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ITestConnectionListener#onConnectionLost
+ * (org.eclipse.osee.connection.service.IServiceConnector,
+ * org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment)
+ */
+ @Override
+ public synchronized void onConnectionLost(IServiceConnector connector, IHostTestEnvironment testHost) {
+ OseeLog.log(Activator.class, Level.INFO, "connection lost: ote client message service halted");
+ shutdownDispatcher();
+ msgDatabase.detachService(null);
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.detachService(null);
+ }
+ exportedThis = null;
+ service = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ITestConnectionListener#onPostConnect(org
+ * .eclipse.osee.ote.service.ConnectionEvent)
+ */
+ @Override
+ public synchronized void onPostConnect(ConnectionEvent event) {
+ assert msgDatabase != null;
+ OseeLog.log(Activator.class, Level.INFO, "connecting OTE client message service");
+ if (event.getEnvironment() instanceof ITestEnvironmentMessageSystem) {
+ ITestEnvironmentMessageSystem env = (ITestEnvironmentMessageSystem) event.getEnvironment();
+ try {
+ service = env.getMessageToolServiceProxy();
+ if (service == null) {
+ throw new Exception("could not get message tool service proxy");
+ }
+ exportedThis = (IMsgToolServiceClient) event.getConnector().export(this);
+ } catch (Exception e) {
+ OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create exported Message Tool Client", e);
+ service = null;
+ exportedThis = null;
+ return;
+ }
+
+ try {
+ dispatcher = new UpdateDispatcher(service.getMsgUpdateSocketAddress());
+ } catch (Exception e) {
+ OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create update dispatcher", e);
+ service = null;
+ exportedThis = null;
+ return;
+ }
+
+ try {
+ createProccessors();
+ } catch (Exception e) {
+ OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create update processors", e);
+ service = null;
+ exportedThis = null;
+ return;
+ }
+
+ msgDatabase.attachToService(service, exportedThis);
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.attachService(service);
+ }
+ dispatcher.start();
+ }
+ }
+
+ private void createProccessors() throws IOException {
+ EnumSet<MemType> availableTypes = service.getAvailablePhysicalTypes();
+
+ int port = PortUtil.getInstance().getConsecutiveValidPorts(availableTypes.size());
+ for (MemType type : availableTypes) {
+ final ChannelProcessor handler;
+ switch (type) {
+ case MUX:
+ handler = new ChannelProcessor(20, 256, threadPool, msgDatabase, type);
+ break;
+ case MUX_LM:
+ handler = new ChannelProcessor(5, 256, threadPool, msgDatabase, type);
+ break;
+ case PUB_SUB:
+ handler = new ChannelProcessor(10, 65455, threadPool, msgDatabase, type);
+ break;
+ case WIRE_AIU:
+ // pass through
+ case WIRE_MP_DIRECT:
+ // pass through
+ case IGTTS_WIRE:
+ handler = new ChannelProcessor(5, 512, threadPool, msgDatabase, type);
+ break;
+ case ETHERNET:
+ handler = new ChannelProcessor(5, 2048, threadPool, msgDatabase, type);
+ break;
+ case SERIAL:
+ handler = new ChannelProcessor(3, 10000, threadPool, msgDatabase, type);
+ break;
+ case TS_META_DATA:
+ handler = new ChannelProcessor(3, 2048, threadPool, msgDatabase, type);
+ break;
+ default:
+ throw new Error("no case for mem type of " + type);
+ }
+ dispatcher.addChannel(localAddress, port, type, handler);
+ port++;
+ }
+ }
+
+ 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;
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ITestConnectionListener#onPreDisconnect(
+ * org.eclipse.osee.ote.service.ConnectionEvent)
+ */
+ @Override
+ public synchronized void onPreDisconnect(ConnectionEvent event) {
+ msgDatabase.detachService(service);
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.detachService(service);
+ }
+ try {
+ event.getConnector().unexport(this);
+ } catch (Exception e) {
+ OseeLog.log(MessageSubscriptionService.class, Level.WARNING, "problems unexporting Message Tool Client", e);
+ }
+ shutdownDispatcher();
+ exportedThis = null;
+ service = null;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient#
+ * changeIsScheduled(java.lang.String, boolean)
+ */
+ @Override
+ public void changeIsScheduled(String msgName, boolean isScheduled) throws RemoteException {
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient#changeRate
+ * (java.lang.String, double)
+ */
+ @Override
+ public void changeRate(String msgName, double rate) throws RemoteException {
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient#
+ * getAddressByType(java.lang.String, int)
+ */
+ @Override
+ public InetSocketAddress getAddressByType(String messageName, int memType) throws RemoteException {
+ final DatagramChannel channel = dispatcher.getChannel(MemType.values()[memType]);
+ OseeLog.log(Activator.class, Level.INFO, String.format("callback from remote msg manager: msg=%s, type=%s, ip=%s:%d\n", messageName,
+ MemType.values()[memType], localAddress.toString(), channel.socket().getLocalPort()));
+
+ return new InetSocketAddress(localAddress, channel.socket().getLocalPort());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient#
+ * getTestSessionKey()
+ */
+ @Override
+ public UserTestSessionKey getTestSessionKey() throws RemoteException {
+ return clientService.getSessionKey();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IMessageDictionaryListener#onDictionaryLoaded
+ * (org.eclipse.osee.ote.service.IMessageDictionary)
+ */
+ @Override
+ public void onDictionaryLoaded(IMessageDictionary dictionary) {
+ msgDatabase = messageDbFactory.createMessageDataBase(dictionary);
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.attachMessageDb(msgDatabase);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IMessageDictionaryListener#onDictionaryUnloaded
+ * (org.eclipse.osee.ote.service.IMessageDictionary)
+ */
+ @Override
+ public void onDictionaryUnloaded(IMessageDictionary dictionary) {
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.detachMessageDb(msgDatabase);
+ }
+ msgDatabase = null;
+ }
+
+ @Override
+ public IFileTransferHandle startRecording(String fileName, List<MessageRecordDetails> list) throws FileNotFoundException, IOException {
+ if (service == null) {
+ 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 = service.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(exportedThis, new InetSocketAddress(InetAddress.getLocalHost(), port), list);
+ service.startRecording(cmd);
+ OseeLog.log(Activator.class, Level.INFO, "recording started with " + list.size() + " entries, recorder output socket="
+ + recorderOutputAddress.toString());
+ return handle;
+ }
+
+ @Override
+ public void stopRecording() throws RemoteException, IOException {
+ try {
+ service.stopRecording();
+ } finally {
+ if (fileTransferHandler != null && fileTransferHandler.hasActiveTransfers()) {
+ fileTransferHandler.stopAllTransfers();
+ }
+ fileTransferHandler = null;
+ }
+ }
+
+ public AbstractMessageDataBase getMsgDatabase() {
+ return msgDatabase;
+ }
+
+ public IRemoteMessageService getService() {
+ return service;
+ }
+
+ public void removeSubscription(MessageSubscription subscription) {
+ subscriptions.remove(subscription);
+ }
+}
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 00000000000..13762d7b3c4
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.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;
+
+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 MessageSubscriptionService messageSubscriptionService;
+
+ OteClientServiceTracker(MessageSubscriptionService messageSubscriptionService) {
+ super(Activator.getDefault().getBundleContext(), IOteClientService.class.getName(), null);
+ this.messageSubscriptionService = messageSubscriptionService;
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
+ */
+ @Override
+ public Object addingService(ServiceReference reference) {
+ IOteClientService service = (IOteClientService) super.addingService(reference);
+ messageSubscriptionService.oteClientServiceAcquired(service);
+ return service;
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ messageSubscriptionService.oteClientServiceLost();
+ super.removedService(reference, service);
+ }
+
+
+}
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 00000000000..2682a8a7010
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.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.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.EnumMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.enums.MemType;
+
+/**
+ * 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 {
+ /** * Class Instance Fields ** */
+ private final EnumMap<MemType, DatagramChannel> channelMap = new EnumMap<MemType, DatagramChannel>(MemType.class);
+
+ 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(MemType type) {
+ return channelMap.get(type);
+ }
+
+ public SelectionKey addChannel(InetAddress localAddress, int port, MemType type, ChannelProcessor processor)
+ throws IOException {
+ final DatagramChannel channel = DatagramChannel.open();
+ channel.configureBlocking(false);
+ channel.socket().bind(new InetSocketAddress(localAddress, port));
+ channel.connect(remoteAddress);
+ if (channelMap.put(type, channel) != null) {
+ OseeLog.log(MessageSubscriptionService.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 MemType 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 00000000000..78eb33ea724
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.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.internal.state;
+
+import org.eclipse.osee.ote.client.msg.core.internal.MessageSubscription;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public abstract class AbstractSubscriptionState implements ISubscriptionState {
+
+ private final MemType type;
+ private final MessageMode mode;
+ private final MessageSubscription subscription;
+
+ protected AbstractSubscriptionState(MessageSubscription subscription, MemType 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 MemType 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 00000000000..827b23c2a4a
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.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.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.MemType;
+
+/**
+ * @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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #getMessage()
+ */
+ @Override
+ public Message getMessage() {
+ return instance.getMessage();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #getMsgClassName()
+ */
+ @Override
+ public String getMsgClassName() {
+ return instance.getMessage().getClass().getName();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onMessageDbClosing
+ * (org.eclipse.osee.ote.client.msg.core.internal.db.MessageDB)
+ */
+ @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(instance.getMessage().getName(), this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onMessageDbFound
+ * (org.eclipse.osee.ote.client.msg.core.internal.db.MessageDB)
+ */
+ @Override
+ public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+ throw new Error("Unexpected input for this state");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onServiceAttached
+ * (org.eclipse.osee.ote.message.interfaces.IRemoteMessageService)
+ */
+ @Override
+ public ISubscriptionState onActivated() {
+ throw new Error("Unexpected input for this state");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onServiceDetached
+ * (org.eclipse.osee.ote.message.interfaces.IRemoteMessageService)
+ */
+ @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<MemType> getAvailableTypes() {
+ return instance.getAvailableTypes();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #isActive()
+ */
+ @Override
+ public boolean isActive() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #isResolved()
+ */
+ @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 00000000000..fa3bae33ad8
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.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.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.MemType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public interface ISubscriptionState {
+ MemType getMemType();
+
+ MessageMode getMode();
+
+ String getMsgClassName();
+
+ Message getMessage();
+
+ Set<MemType> 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 00000000000..7b8067ecc0e
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.EnumSet;
+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.MemType;
+
+/**
+ * @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(instance.getMessage().getName(), 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() {
+ throw new Error("Unexpected input for this state");
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #getAvailableTypes()
+ */
+ @Override
+ public Set<MemType> getAvailableTypes() {
+ return EnumSet.noneOf(MemType.class);
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #isActive()
+ */
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #isResolved()
+ */
+ @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 00000000000..1cf20399e83
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.EnumSet;
+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.MemType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public class UnresolvedState extends AbstractSubscriptionState {
+
+ private MemType type;
+
+ private final String msgClassName;
+ private MessageInstance instance = null;
+
+ public UnresolvedState(String msgClassName, MessageSubscription subscription, MemType type, MessageMode mode) {
+ super(subscription, type, mode);
+ this.type = type;
+ this.msgClassName = msgClassName;
+ }
+
+ public UnresolvedState(String msgClassName, AbstractSubscriptionState previousState) {
+ super(previousState);
+ this.msgClassName = msgClassName;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #getMessage()
+ */
+ @Override
+ public Message getMessage() {
+ return instance != null ? instance.getMessage() : null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #getMsgClassName()
+ */
+ @Override
+ public String getMsgClassName() {
+ return msgClassName;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onLibraryLoaded()
+ */
+ @Override
+ public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+ try {
+ instance = msgDB.acquireInstance(msgClassName, getMode(), getMemType());
+ this.type = instance.getType();
+ getSubscription().notifyResolved();
+ return new InactiveState(instance, msgDB, this);
+ } catch (Exception e) {
+ OseeLog.log(UnresolvedState.class, Level.SEVERE, "problems acquring instance for " + getMsgClassName(), e);
+ getSubscription().notifyInvalidated();
+ return this;
+ }
+
+ }
+
+ @Override
+ public MemType getMemType() {
+ return type;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onLibraryUnloaded()
+ */
+ @Override
+ public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onServiceAttached()
+ */
+ @Override
+ public ISubscriptionState onActivated() {
+ return this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #onServiceDetached()
+ */
+ @Override
+ public ISubscriptionState onDeactivated() {
+ return this;
+ }
+
+ @Override
+ public Set<MemType> getAvailableTypes() {
+ return EnumSet.noneOf(MemType.class);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #isActive()
+ */
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState
+ * #isResolved()
+ */
+ @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 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.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.client/.project b/org.eclipse.osee.ote.client/.project
new file mode 100644
index 00000000000..449bfa761c7
--- /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/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.ote.client/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..6e177abc9c5
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Mon Aug 11 08:24:09 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=true
+resolve.requirebundle=false
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 00000000000..c8e68622566
--- /dev/null
+++ b/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Service (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.client;singleton:=true
+Bundle-Version: 1.0.1.qualifier
+Bundle-Activator: org.eclipse.osee.ote.service.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.jini.service.interfaces,
+ org.eclipse.osee.framework.messaging,
+ org.eclipse.osee.framework.messaging.id,
+ org.eclipse.osee.framework.plugin.core.util,
+ 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.message,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.ote.service,
+ org.eclipse.osee.ote.service.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+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 00000000000..6f20375d6c7
--- /dev/null
+++ b/org.eclipse.osee.ote.client/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.client/plugin.xml b/org.eclipse.osee.ote.client/plugin.xml
new file mode 100644
index 00000000000..d6c400faa34
--- /dev/null
+++ b/org.eclipse.osee.ote.client/plugin.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="org.eclipse.osee.ote.client.libraryProvidier" name="OTE Runtime Library Provider" schema="schema/org.eclipse.osee.ote.client.libraryProvidier.exsd"/>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.client/schema/org.eclipse.osee.ote.client.libraryProvidier.exsd b/org.eclipse.osee.ote.client/schema/org.eclipse.osee.ote.client.libraryProvidier.exsd
new file mode 100644
index 00000000000..b242bab99c6
--- /dev/null
+++ b/org.eclipse.osee.ote.client/schema/org.eclipse.osee.ote.client.libraryProvidier.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.client" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.ote.client" id="org.eclipse.osee.ote.client.libraryProvidier" name="OTE Runtime Library Provider"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="LibraryProvider"/>
+ </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="LibraryProvider">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ote.service.IOteRuntimeLibraryProvider"/>
+ </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.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 00000000000..640cf8d9931
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.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.service;
+
+import java.util.Hashtable;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.ote.service.core.OteClientEndpointReceive;
+import org.eclipse.osee.ote.service.core.OteClientEndpointSend;
+import org.eclipse.osee.ote.service.core.TestClientServiceImpl;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+
+ private ServiceRegistration registration;
+ private TestClientServiceImpl service;
+ private ServiceTracker connectionServiceTracker;
+ private MessagingGatewayBindTracker messagingGatewayTracker;
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
+ * )
+ */
+ public void start(BundleContext context) throws Exception {
+
+ connectionServiceTracker = new ServiceTracker(context, IConnectionService.class.getName(), null);
+ connectionServiceTracker.open();
+
+ OteClientEndpointReceive endpointReceive = new OteClientEndpointReceive();
+ OteClientEndpointSend endpointSend = new OteClientEndpointSend();
+
+ messagingGatewayTracker = new MessagingGatewayBindTracker(context, endpointSend, endpointReceive);
+ messagingGatewayTracker.open(true);
+
+ IConnectionService connectionService = (IConnectionService) connectionServiceTracker.getService();
+ service = new TestClientServiceImpl(connectionService, endpointSend, endpointReceive);
+
+ ExtensionDefinedObjects<IOteRuntimeLibraryProvider> definedObjects = new ExtensionDefinedObjects<IOteRuntimeLibraryProvider>(
+ "org.eclipse.osee.ote.client.libraryProvidier", "LibraryProvider", "className");
+ try {
+ List<IOteRuntimeLibraryProvider> providers = definedObjects.getObjects();
+ service.addLibraryProvider(providers);
+ } catch (Exception ex) {
+ log(Level.SEVERE, "failed to process OTE runtime library provider extensions", ex);
+ }
+
+ service.init();
+ // register the service
+ registration = context.registerService(IOteClientService.class.getName(), service, new Hashtable());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ IConnectionService connectionService = (IConnectionService) connectionServiceTracker.getService();
+ connectionService.removeListener(service);
+
+ // close the service tracker
+ messagingGatewayTracker.close();
+ connectionServiceTracker.close();
+ connectionServiceTracker = null;
+
+ service.stop();
+ service = null;
+ registration.unregister();
+ }
+
+ 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 00000000000..29318e450c6
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.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.service;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+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 UserTestSessionKey sessionKey;
+ private final OteServiceProperties props;
+
+ /**
+ * @param environment
+ * @param connector
+ * @param sessionKey
+ * @param properties
+ */
+ public ConnectionEvent(IServiceConnector connector, ITestEnvironment environment, UserTestSessionKey sessionKey) {
+ if (connector == null) {
+ throw new NullPointerException("connector cannot be null");
+ }
+ this.environment = environment;
+ this.connector = connector;
+ this.sessionKey = sessionKey;
+ 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 UserTestSessionKey getSessionKey() {
+ return sessionKey;
+ }
+
+ public OteServiceProperties getProperties() {
+ return props;
+ }
+
+}
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 00000000000..f174871a775
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.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.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IEnvironmentConfigurer {
+ void configure(ConnectionEvent event) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ILibraryLoader.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ILibraryLoader.java
new file mode 100644
index 00000000000..320da428d14
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ILibraryLoader.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.service;
+
+public interface ILibraryLoader {
+ /**
+ * loads a message class dictionary. If one is already loaded then it will
+ * be unloaded. Calls the
+ * {@link IMessageDictionaryListener#onDictionaryLoaded(IMessageDictionary)}
+ * method for all registered {@link IMessageDictionaryListener}s.
+ *
+ * @param dictionary
+ */
+ void loadMessageDictionary(IMessageDictionary dictionary);
+
+ /**
+ * unloads the current {@link IMessageDictionary} from the system. This
+ * method will call
+ * {@link IMessageDictionaryListener#onDictionaryUnloaded(IMessageDictionary)}
+ * for each registered {@link IMessageDictionaryListener} before actually
+ * unloading the dictionary.
+ */
+ void unloadMessageDictionary();
+
+ /**
+ * gets the currently loaded {@link IMessageDictionary}
+ *
+ * @return the {@link IMessageDictionary} or null if one is not loaded
+ */
+ IMessageDictionary getLoadedDictionary();
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionary.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionary.java
new file mode 100644
index 00000000000..53e67d616d7
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionary.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.service;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.Message;
+
+/**
+ * Allows the lookup of message definitions
+ *
+ * @author Ken J. Aguilar
+ */
+public interface IMessageDictionary {
+
+ /**
+ * Generates a listing of all messages and associated elements defined in the message jar. The intent is to provide a
+ * method for searching the message jar for certain messages
+ *
+ * @param sink
+ * @throws IOException
+ */
+ void generateMessageIndex(final MessageSink sink) throws Exception;
+
+ Class<? extends Message> lookupMessage(String messageName) throws ClassNotFoundException;
+
+ void dispose();
+
+ String getImplementationVersion(String file) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionaryListener.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionaryListener.java
new file mode 100644
index 00000000000..ec8b1b7857b
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IMessageDictionaryListener.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;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageDictionaryListener {
+
+ void onDictionaryLoaded(IMessageDictionary dictionary);
+
+ void onDictionaryUnloaded(IMessageDictionary dictionary);
+}
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 00000000000..880eefc27ce
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.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.service;
+
+import java.net.InetAddress;
+import java.util.Collection;
+
+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.UserTestSessionKey;
+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
+ *
+ * @param listener
+ */
+ 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.
+ *
+ * @param listener
+ */
+ void addConnectionListener(ITestConnectionListener listener);
+
+ void addConnectionFilters(ITestEnvironmentFilter filter);
+
+ /**
+ * adds a listener that will be notified of dictionary events. <B>NOTE: </B>if a dictionary was loaded prior to
+ * calling this method then the listener's {@link IMessageDictionaryListener#onDictionaryLoaded(IMessageDictionary)}
+ * will be called immediately
+ *
+ * @param listener
+ */
+ void addDictionaryListener(IMessageDictionaryListener listener);
+
+ void removeConnectionFilters(ITestEnvironmentFilter filter);
+
+ void removeConnectionListener(ITestConnectionListener listener);
+
+ void removeDictionaryListener(IMessageDictionaryListener 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.
+ *
+ * @param user
+ * @param address
+ */
+ 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>
+ *
+ * @see #setUser(OSEEPerson1_4, InetAddress)
+ * @param env
+ * @param config
+ * @param leaseTime
+ * @throws Exception
+ */
+ ConnectionEvent connect(IHostTestEnvironment env, IEnvironmentConfigurer configurer, TestEnvironmentConfig config) 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.
+ *
+ * @throws Exception
+ */
+ void disconnect() throws TestSessionException;
+
+ /**
+ * gets the currently connected test environment
+ *
+ * @return returns the connected {@link ITestEnvironment} or null if no connection exists
+ * @throws Exception
+ */
+ ITestEnvironment getConnectedEnvironment();
+
+ /** returns the connector for the currently connected test environment
+ *
+ * @return
+ */
+ 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.
+ *
+ * @param sessionDelegate
+ */
+ void setSessionDelegate(SessionDelegate sessionDelegate);
+
+ /**
+ * gets the currently loaded {@link IMessageDictionary}
+ *
+ * @return the {@link IMessageDictionary} or null if one is not loaded
+ */
+ IMessageDictionary getLoadedDictionary();
+
+ /**
+ * returns a collection of all the {@link IHostTestEnvironment} that are currently available.
+ *
+ * @return
+ */
+ Collection<IHostTestEnvironment> getAvailableTestHosts();
+
+ IServiceConnector getConnector(IHostTestEnvironment host);
+
+ UserTestSessionKey getSessionKey();
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteRuntimeLibraryProvider.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteRuntimeLibraryProvider.java
new file mode 100644
index 00000000000..088dcba0819
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteRuntimeLibraryProvider.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.service;
+
+import java.util.Collection;
+
+public interface IOteRuntimeLibraryProvider {
+ void initialize(ILibraryLoader libraryLoader);
+ Collection<IMessageDictionary> getLibraries();
+}
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 00000000000..c19877345cf
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.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.service;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @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.
+ * @param connector TODO
+ * @param testHost
+ */
+ void onConnectionLost(IServiceConnector connector, IHostTestEnvironment testHost);
+
+ /**
+ * 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.
+ *
+ * @param event
+ */
+ 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 00000000000..a76c7b6d48f
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.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.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.
+ *
+ * @param testEnvironment
+ * @param connector
+ * @param properties
+ */
+ void environmentAvailable(IHostTestEnvironment testEnvironment, IServiceConnector connector, OteServiceProperties properties);
+
+ /**
+ * this method will be called whenever a {@link IHostTestEnvironment} becomes unavailable.
+ *
+ * @param testEnvironment
+ * @param connector
+ * @param properties
+ */
+ void environmentUnavailable(IHostTestEnvironment testEnvironment, 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 00000000000..010c4306594
--- /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/MessageSink.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/MessageSink.java
new file mode 100644
index 00000000000..09822daf260
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/MessageSink.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.service;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface MessageSink {
+
+ /**
+ * called once for each message in the message list
+ */
+ public void absorbMessage(String messageName);
+
+ /**
+ * called once for each element in a message after absorbMessage is called for that message
+ */
+ public void absorbElement(String elementName);
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/MessagingGatewayBindTracker.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/MessagingGatewayBindTracker.java
new file mode 100644
index 00000000000..5e9b208d669
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/MessagingGatewayBindTracker.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.service;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.messaging.EndpointReceive;
+import org.eclipse.osee.framework.messaging.EndpointSend;
+import org.eclipse.osee.framework.messaging.MessagingGateway;
+import org.eclipse.osee.ote.service.core.OteClientEndpointSend;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessagingGatewayBindTracker extends ServiceTracker {
+
+ private EndpointSend send;
+ private EndpointReceive receive;
+
+ public MessagingGatewayBindTracker(BundleContext context, EndpointSend send, EndpointReceive receive) {
+ super(context, MessagingGateway.class.getName(), null);
+ this.send = send;
+ this.receive = receive;
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ Object obj = context.getService(reference);
+ MessagingGateway messagingGateway = (MessagingGateway)obj;
+ if(!messagingGateway.bind(send)){
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to bind %s to the MessagingGateway.", send.toString()));
+ }
+ if(!messagingGateway.bind(receive)){
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to bind %s to the MessagingGateway.", receive.toString()));
+ }
+ if(!messagingGateway.bindSendProtocol(OteClientEndpointSend.OTE_CLIENT_SEND_PROTOCOL, send)){
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to bind %s to %s through the MessagingGateway.", OteClientEndpointSend.OTE_CLIENT_SEND_PROTOCOL.toString(), send.toString()));
+ }
+ return super.addingService(reference);
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ Object obj = context.getService(reference);
+ MessagingGateway messagingGateway = (MessagingGateway)obj;
+ if(!messagingGateway.unbindSendProtocol(OteClientEndpointSend.OTE_CLIENT_SEND_PROTOCOL, send)){
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to bind %s to %s through the MessagingGateway.", OteClientEndpointSend.OTE_CLIENT_SEND_PROTOCOL.toString(), send.toString()));
+ }
+ if(!messagingGateway.unbind(send)){
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to unbind %s to the MessagingGateway.", send.toString()));
+ }
+ if(!messagingGateway.unbind(receive)){
+ OseeLog.log(Activator.class, Level.SEVERE, String.format("Unable to bind %s to the MessagingGateway.", receive.toString()));
+ }
+ super.removedService(reference, service);
+ }
+
+
+
+
+
+}
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 00000000000..c234a58a612
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.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.service;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedList;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class OteServiceProperties {
+ private final IServiceConnector connector;
+
+ private static final String NA = "N.A.";
+
+ public OteServiceProperties(IServiceConnector connector) {
+ this.connector = connector;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return (String) connector.getProperty("name", NA);
+ }
+
+ /**
+ * @return the station
+ */
+ public String getStation() {
+ return (String) connector.getProperty("station", NA);
+ }
+
+ /**
+ * @return the type
+ */
+ public String getType() {
+ return (String) connector.getProperty("type", NA);
+ }
+
+ /**
+ * @return the mode
+ */
+ public String getMode() {
+ return (String) connector.getProperty("mode", NA);
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return (String) connector.getProperty("version", NA);
+ }
+
+ /**
+ * @return the group
+ */
+ public String getGroup() {
+ return (String) connector.getProperty("groups", NA);
+ }
+
+ /**
+ * @return the comment
+ */
+ public String getComment() {
+ return (String) connector.getProperty("comment", NA);
+ }
+
+ /**
+ * @return the dateStart
+ */
+ public Date getDateStarted() {
+ return (Date) connector.getProperty("date", null);
+ }
+
+ public Collection<OSEEPerson1_4> getUserList() {
+ return (Collection<OSEEPerson1_4>) connector.getProperty("user_list", new LinkedList<OSEEPerson1_4>());
+ }
+
+ public void printStats() {
+ 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 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 00000000000..b3ea506b5f1
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.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.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;
+
+/**
+ * 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 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.
+ *
+ * @param path
+ * @return an array bytes that represent the content of the requested file
+ * @throws Exception
+ */
+ byte[] getFile(String path) throws Exception;
+ long getFileDate(String path) throws Exception;
+ String getFileVersion(String path) 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 00000000000..8a958d60cbf
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.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;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestSessionException extends Exception {
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public TestSessionException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ 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 00000000000..bbe8220e022
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
@@ -0,0 +1,232 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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.messaging.Message;
+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.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;
+
+
+ /**
+ * @param user
+ */
+ public ClientSession(OSEEPerson1_4 user, InetAddress address, OteClientEndpointReceive receive) {
+ super(user);
+ this.address = address;
+ this.receive = receive;
+ Activator.log(Level.INFO, String.format("Created OTE session for %s. Address=%s\n ", user.getName(),
+ address.toString()));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.AbstractRemoteSession#getAddress()
+ */
+ @Override
+ public String getAddress() throws RemoteException {
+ return address.getHostAddress();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.AbstractRemoteSession#getFile(java.lang.String)
+ */
+ @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");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.AbstractRemoteSession#getFileDate(java.lang.String)
+ */
+ @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");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.AbstractRemoteSession#getFileVersion(java.lang.String)
+ */
+ @Override
+ public String getFileVersion(String workspacePath) throws RemoteException {
+ if (sessionDelegate != null) {
+ try {
+ return sessionDelegate.getFileVersion(workspacePath);
+ } catch (Exception ex) {
+ throw new RemoteException("failed to get the file version" + workspacePath, ex);
+ }
+ }
+ throw new IllegalStateException("session delegate not set");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.AbstractRemoteSession#isAlive()
+ */
+ @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);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.IRemoteUserSession#initiateInformationalPrompt(java.lang.String)
+ */
+ public void initiateInformationalPrompt(String message) throws RemoteException {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.handleInformationPrompt(message);
+ } catch (Exception ex) {
+ throw new RemoteException("exception initiating prompt", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.IRemoteUserSession#initiatePassFailPrompt(org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse)
+ */
+ 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);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.IRemoteUserSession#initiateResumePrompt(org.eclipse.osee.ote.core.framework.prompt.IResumeResponse)
+ */
+ 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);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.IRemoteUserSession#initiateUserInputPrompt(org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse)
+ */
+ 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
+ *
+ * @param sessionDelegate
+ */
+ 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);
+ ConnectionRequestResult result = testHost.requestEnvironment(exportedSession, config);
+ if (result.getStatus().getStatus()) {
+ return new TestHostConnection(connector, 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.endConnection();
+ return;
+ } finally {
+ lock.unlock();
+ }
+ }
+ throw new IllegalStateException(LOCK_ERROR_MSG);
+ }
+
+ @Override
+ public void sendMessageToClient(Message message) throws RemoteException {
+ receive.receivedMessage(message);
+ }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/HostFilter.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/HostFilter.java
new file mode 100644
index 00000000000..42c312de0ff
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/HostFilter.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.service.core;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.eclipse.osee.connection.service.IConnectorFilter;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class HostFilter implements IConnectorFilter {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectorFilter#accept(org.eclipse.osee.connection.service.IServiceConnector)
+ */
+ @Override
+ public boolean accept(IServiceConnector connector) {
+ return connector.getService() instanceof IHostTestEnvironment;
+ }
+
+ public Collection<IServiceConnector> accept(Collection<IServiceConnector> connectors) {
+ HashSet<IServiceConnector> acceptableConnectors = new HashSet<IServiceConnector>();
+ for (IServiceConnector connector : connectors) {
+ if (accept(connector)) {
+ acceptableConnectors.add(connector);
+ }
+ }
+ return acceptableConnectors;
+ }
+
+}
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 00000000000..60e928c4e70
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.IMessageDictionary;
+import org.eclipse.osee.ote.service.IMessageDictionaryListener;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class ListenerNotifier {
+ private final ExecutorService executor = Executors.newCachedThreadPool();
+ private CopyOnWriteArraySet<ITestConnectionListener> testConnectionListeners = new CopyOnWriteArraySet<ITestConnectionListener>();
+
+ private final CopyOnWriteArraySet<IMessageDictionaryListener> dictionaryListeners = new CopyOnWriteArraySet<IMessageDictionaryListener>();
+
+ boolean addTestConnectionListener(ITestConnectionListener listener) {
+ return testConnectionListeners.add(listener);
+ }
+
+ boolean removeTestConnectionListener(ITestConnectionListener listener) {
+ return testConnectionListeners.remove(listener);
+ }
+
+ public boolean addDictionaryListener(
+ IMessageDictionaryListener listener) {
+ return dictionaryListeners.add(listener);
+ }
+
+ public void removeDictionaryListener(IMessageDictionaryListener listener) {
+ dictionaryListeners.remove(listener);
+ }
+
+ void notifyPostConnection(final ConnectionEvent event) {
+ executor.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ for (ITestConnectionListener listener : testConnectionListeners) {
+ try {
+ listener.onPostConnect(event);
+ } catch (Exception 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 (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE,
+ "exception notifying listener of disconnect event", ex);
+ }
+ }
+ }
+
+ void notifyConnectionLost(final IServiceConnector connector,
+ final IHostTestEnvironment testHost) {
+ executor.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ for (ITestConnectionListener listener : testConnectionListeners) {
+ try {
+ listener.onConnectionLost(connector, testHost);
+ } catch (Exception ex) {
+ OseeLog
+ .log(
+ Activator.class,
+ Level.SEVERE,
+ "exception notifying listener of connection error event",
+ ex);
+ }
+ }
+ }
+ });
+
+ }
+
+ void notifyDictionaryLoaded(final IMessageDictionary dictionary) {
+ executor.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ for (IMessageDictionaryListener listener : dictionaryListeners) {
+ try {
+ listener.onDictionaryLoaded(dictionary);
+ } catch (Exception e) {
+ Activator
+ .log(
+ Level.SEVERE,
+ "exception in listener during dictionary load event notification",
+ e);
+ }
+ }
+ }
+
+ });
+
+ }
+
+ void notifyDictionaryUnloaded(final IMessageDictionary dictionary) {
+ for (IMessageDictionaryListener listener : dictionaryListeners) {
+ try {
+ listener.onDictionaryUnloaded(dictionary);
+ } catch (Exception e) {
+ Activator
+ .log(
+ Level.SEVERE,
+ "exception in listener during dictionary unload event notification",
+ e);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointReceive.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointReceive.java
new file mode 100644
index 00000000000..eb5278a795f
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointReceive.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.service.core;
+
+import java.util.Properties;
+import org.eclipse.osee.framework.messaging.EndpointReceive;
+import org.eclipse.osee.framework.messaging.Message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OteClientEndpointReceive extends EndpointReceive {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointReceive#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointReceive#start(java.util.Properties)
+ */
+ @Override
+ public void start(Properties properties) {
+ }
+
+ public void receivedMessage(Message message) {
+ onReceive(message);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointSend.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointSend.java
new file mode 100644
index 00000000000..e923376f453
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteClientEndpointSend.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.service.core;
+
+import java.util.Properties;
+import org.eclipse.osee.framework.messaging.EndpointSend;
+import org.eclipse.osee.framework.messaging.ExceptionHandler;
+import org.eclipse.osee.framework.messaging.Message;
+import org.eclipse.osee.framework.messaging.id.ProtocolId;
+import org.eclipse.osee.framework.messaging.id.StringName;
+import org.eclipse.osee.framework.messaging.id.StringNamespace;
+import org.eclipse.osee.framework.messaging.id.StringProtocolId;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.service.IOteClientService;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClientEndpointSend implements EndpointSend {
+
+ public static ProtocolId OTE_CLIENT_SEND_PROTOCOL =
+ new StringProtocolId(new StringNamespace("org.eclipse.osee.ote.service.core"), new StringName(
+ "OteClientEndpointSend"));
+ private IOteClientService clientService;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointSend#send(org.eclipse.osee.framework.messaging.Message, org.eclipse.osee.framework.messaging.ExceptionHandler)
+ */
+ @Override
+ public void send(Message message, ExceptionHandler exceptionHandler) {
+ if (clientService == null) {
+ exceptionHandler.handleException(new Exception(String.format(
+ "Unable to send message [%s], no client service is available.", message.toString())));
+ } else {
+ ITestEnvironment env = clientService.getConnectedEnvironment();
+ if (env == null) {
+ exceptionHandler.handleException(new Exception(String.format(
+ "Unable to send message [%s], there is not a connected environment.", message.toString())));
+ } else {
+ try {
+ env.sendMessage(message);
+ } catch (Throwable th) {
+ exceptionHandler.handleException(new Exception(String.format("Unable to send message [%s]",
+ message.toString()), th));
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointSend#start(java.util.Properties)
+ */
+ @Override
+ public void start(Properties properties) {
+ }
+
+ /**
+ * @param testClientServiceImpl
+ */
+ public void setTestClientService(IOteClientService testClientServiceImpl) {
+ this.clientService = testClientServiceImpl;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteServiceStatusListener.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteServiceStatusListener.java
new file mode 100644
index 00000000000..467b84b77b4
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/OteServiceStatusListener.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.service.core;
+
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusData;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusListener;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public class OteServiceStatusListener implements IServiceStatusListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusListener#statusBoardUpdated(org.eclipse.osee.ote.core.environment.status.IServiceStatusData)
+ */
+ public void statusBoardUpdated(IServiceStatusData statusData) throws RemoteException {
+ }
+
+}
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 00000000000..89a68e6515a
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
@@ -0,0 +1,550 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+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.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+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.ILibraryLoader;
+import org.eclipse.osee.ote.service.IMessageDictionary;
+import org.eclipse.osee.ote.service.IMessageDictionaryListener;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.IOteRuntimeLibraryProvider;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.service.ITestEnvironmentAvailibilityListener;
+import org.eclipse.osee.ote.service.ITestEnvironmentFilter;
+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, ILibraryLoader {
+
+ private static final String NO_USER_MSG = "a user has not been set";
+ private final IConnectionService connectionService;
+ private final HashMap<IHostTestEnvironment, IServiceConnector> testHosts = new HashMap<IHostTestEnvironment, IServiceConnector>();
+ private final ListenerNotifier listenerNotifier = new ListenerNotifier();
+ private final HashSet<ITestEnvironmentAvailibilityListener> hostAvailabilityListeners = new HashSet<ITestEnvironmentAvailibilityListener>();
+ private final HostFilter hostFilter = new HostFilter();
+ private ClientSession session = null;
+ private volatile boolean stopped = false;
+ private final ArrayList<ITestEnvironmentFilter> environmentFilters = new ArrayList<ITestEnvironmentFilter>();
+ private IMessageDictionary dictionary;
+ private TestHostConnection testConnection;
+ private final HashSet<IOteRuntimeLibraryProvider> libraryProviders = new HashSet<IOteRuntimeLibraryProvider>();
+
+ private final OteClientEndpointSend endpointSend;
+ private final OteClientEndpointReceive endpointReceive;
+
+ public TestClientServiceImpl(IConnectionService connectionService, OteClientEndpointSend endpointSend, OteClientEndpointReceive endpointReceive) {
+ this.connectionService = connectionService;
+ this.endpointReceive = endpointReceive;
+ this.endpointSend = endpointSend;
+ endpointSend.setTestClientService(this);
+ connectionService.addListener(this);
+ }
+
+ public void init() {
+ for (IOteRuntimeLibraryProvider provider : libraryProviders) {
+ provider.initialize(this);
+ }
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ClientService#addEnvironmentAvailibiltyListener
+ * ()
+ */
+ @Override
+ public synchronized void addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener) {
+ checkState();
+ if (hostAvailabilityListeners.add(listener)) {
+ for (Entry<IHostTestEnvironment, IServiceConnector> entry : testHosts.entrySet()) {
+ listener.environmentAvailable(entry.getKey(), entry.getValue(), new OteServiceProperties(entry.getValue()));
+ }
+ }
+
+ }
+
+ public synchronized ConnectionEvent connect(IHostTestEnvironment testHost, IEnvironmentConfigurer configurer, TestEnvironmentConfig config) throws IllegalArgumentException, TestSessionException {
+ checkState();
+ 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");
+ }
+ try {
+ testConnection = session.connect(testHosts.get(testHost), testHost, config);
+ if (testConnection != null) {
+ // success
+ ConnectionEvent event =
+ new ConnectionEvent(testHosts.get(testConnection.getConnectedTestHost()),
+ testConnection.getConnectEnvironment(), testConnection.getSessionKey());
+ if (configurer != null) {
+ try {
+ configurer.configure(event);
+ } catch (Exception e) {
+ session.disconnect(testConnection);
+ throw new IllegalStateException("could not configure environment", e);
+ }
+ }
+ listenerNotifier.notifyPostConnection(event);
+ return event;
+ }
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "failed to establish connection", e);
+ testConnection = null;
+ }
+ return null;
+ }
+
+ @Override
+ public IServiceConnector getConnector(IHostTestEnvironment host) {
+ return testHosts.get(host);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.service.IOteClientService#disconnect()
+ */
+ @Override
+ public synchronized void disconnect() throws TestSessionException {
+ checkState();
+ 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.getConnectedTestHost());
+ testConnection = null;
+ } else {
+ ConnectionEvent event =
+ new ConnectionEvent(testHosts.get(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 void stop() {
+ 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();
+ }
+ }
+ if (dictionary != null) {
+ try {
+ unloadMessageDictionary();
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "exception while trying to unload dictionary during stop()", e);
+ }
+ }
+ stopped = true;
+ hostAvailabilityListeners.clear();
+ environmentFilters.clear();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ClientService#addConnectionListener(org.
+ * eclipse.osee.ote.service.ITestConnectionListener)
+ */
+ @Override
+ public synchronized void addConnectionListener(ITestConnectionListener listener) {
+ checkState();
+ if (listenerNotifier.addTestConnectionListener(listener)) {
+ if (session == null) {
+ return;
+ }
+ try {
+ // check to see if a connection already established
+ if (testConnection != null) {
+ listener.onPostConnect(new ConnectionEvent(testConnection.getServiceConnector(),
+ testConnection.getConnectEnvironment(), testConnection.getSessionKey()));
+ }
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "Exception notifying listener of connection event", e);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ClientService#removeConnectionListener(org
+ * .eclipse.osee.ote.service.ITestConnectionListener)
+ */
+ @Override
+ public void removeConnectionListener(ITestConnectionListener listener) {
+ listenerNotifier.removeTestConnectionListener(listener);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.service.ClientService#
+ * removeEnvironmentAvailibiltyListener
+ * (org.eclipse.osee.ote.service.TestEnvironmentAvailibilityListener)
+ */
+ @Override
+ public synchronized void removeEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener) {
+ checkState();
+ hostAvailabilityListeners.remove(listener);
+ }
+
+ private void checkState() {
+ if (stopped) {
+ throw new IllegalStateException("service stopped");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.ClientService#setUser(org.eclipse.osee.ote
+ * .core.OSEEPerson1_4)
+ */
+ @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, endpointReceive);
+ }
+
+ @Override
+ public OSEEPerson1_4 getUser() {
+ if (session != null) {
+ return session.getUser();
+ }
+ return null;
+ }
+
+ @Override
+ public UserTestSessionKey getSessionKey() {
+ return (testConnection != null) ? testConnection.getSessionKey() : null;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#setPromptHandler(org.eclipse
+ * .osee.ote.service.IPromptHandler)
+ */
+ @Override
+ public synchronized void setSessionDelegate(SessionDelegate sessionDelegate) {
+ checkState();
+ if (session == null) {
+ throw new IllegalStateException(NO_USER_MSG);
+ }
+ session.setSessionDelegate(sessionDelegate);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#addConnectionFilters()
+ */
+ @Override
+ public synchronized void addConnectionFilters(ITestEnvironmentFilter filter) {
+ checkState();
+ if (environmentFilters.add(filter)) {
+ Iterator<Entry<IHostTestEnvironment, IServiceConnector>> envIterator = testHosts.entrySet().iterator();
+ while (envIterator.hasNext()) {
+ Entry<IHostTestEnvironment, IServiceConnector> entry = envIterator.next();
+ OteServiceProperties props = new OteServiceProperties(entry.getValue());
+ if (!filter.accept(entry.getKey(), props)) {
+ notifyHostUnavailable(entry.getKey(), entry.getValue(), props);
+ envIterator.remove();
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#removeConnectionFilters
+ * (org.eclipse.osee.ote.service.ITestEnvironmentFilter)
+ */
+ @Override
+ public synchronized void removeConnectionFilters(ITestEnvironmentFilter filter) {
+ checkState();
+ if (environmentFilters.remove(filter)) {
+ for (IServiceConnector connector : connectionService.getAllConnectors()) {
+ if (!hostFilter.accept(connector)) {
+ // this connector does not connect to a test environment
+ // service
+ continue;
+ }
+ IHostTestEnvironment env = (IHostTestEnvironment) connector.getService();
+ OteServiceProperties props = new OteServiceProperties(connector);
+
+ if (!isAcceptableTestEnvironment(env, props)) {
+ // this environment did not pass the filters. If we were
+ // tracking this environment then we
+ // need to remove it
+ if (testHosts.containsKey(env)) {
+ // we were tracking this environment but our filters
+ // don't approve so we need to remove it
+ testHosts.remove(env);
+ notifyHostUnavailable(env, connector, props);
+ }
+ } else {
+ // the filters have accepted this environment. Lets see if
+ // we were tracking it
+ if (!testHosts.containsKey(env)) {
+ // we were not tracking this environment so go ahead and
+ // add it
+ testHosts.put(env, connector);
+ notifyHostAvailable(env, connector, props);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * compares the environment and its properties against all currently active filters
+ *
+ * @param env
+ * @param connector
+ * @return true if the environment was accepted by all filters, false otherwise
+ */
+ private boolean isAcceptableTestEnvironment(IHostTestEnvironment env, OteServiceProperties props) {
+ for (ITestEnvironmentFilter filter : environmentFilters) {
+ if (!filter.accept(env, props)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void notifyHostAvailable(IHostTestEnvironment env, IServiceConnector connector, OteServiceProperties props) {
+ for (ITestEnvironmentAvailibilityListener listener : hostAvailabilityListeners) {
+ listener.environmentAvailable(env, connector, props);
+ }
+ }
+
+ private void notifyHostUnavailable(IHostTestEnvironment env, IServiceConnector connector, OteServiceProperties props) {
+ for (ITestEnvironmentAvailibilityListener listener : hostAvailabilityListeners) {
+ try {
+ listener.environmentUnavailable(env, connector, props);
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "exception in listener during host unavailable event notification", e);
+ }
+ }
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#getConnectedEnvironment()
+ */
+ @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 : testConnection.getConnectedTestHost();
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.service.IOteClientService#getConnector()
+ */
+ @Override
+ public IServiceConnector getConnector() {
+ checkState();
+ return testConnection == null ? null : testConnection.getServiceConnector();
+ }
+
+/*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#addDictionaryListener(
+ * org.eclipse.osee.ote.service.IMessageDictionaryListener)
+ */
+ @Override
+ public void addDictionaryListener(IMessageDictionaryListener listener) {
+ if (listenerNotifier.addDictionaryListener(listener) && dictionary != null) {
+ listener.onDictionaryLoaded(dictionary);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#removeDictionaryListener
+ * (org.eclipse.osee.ote.service.IMessageDictionaryListener)
+ */
+ @Override
+ public void removeDictionaryListener(IMessageDictionaryListener listener) {
+ listenerNotifier.removeDictionaryListener(listener);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.service.IOteClientService#getAvailableTestHosts()
+ */
+ @Override
+ public synchronized Collection<IHostTestEnvironment> getAvailableTestHosts() {
+ return testHosts.keySet();
+ }
+
+ @Override
+ public boolean isConnected() {
+ return testConnection != null;
+ }
+
+ public void addLibraryProvider(Collection<IOteRuntimeLibraryProvider> provider) {
+ libraryProviders.addAll(provider);
+ }
+
+ @Override
+ public OteServiceProperties getProperties(IHostTestEnvironment testHost) {
+
+ IServiceConnector connector = testHosts.get(testHost);
+ if (connector != null) {
+ return new OteServiceProperties(connector);
+ }
+ return null;
+ }
+
+
+ @Override
+ public synchronized void loadMessageDictionary(IMessageDictionary newDictionary) {
+ checkState();
+ if (newDictionary == null) {
+ throw new NullPointerException("dictionary cannot be null");
+ }
+ if (dictionary != null) {
+ listenerNotifier.notifyDictionaryUnloaded(dictionary);
+ }
+ dictionary = newDictionary;
+ listenerNotifier.notifyDictionaryLoaded(newDictionary);
+ }
+
+ @Override
+ public synchronized void unloadMessageDictionary() {
+ checkState();
+ listenerNotifier.notifyDictionaryUnloaded(dictionary);
+ dictionary = null;
+ }
+
+ @Override
+ public synchronized IMessageDictionary getLoadedDictionary() {
+ return dictionary;
+ }
+
+ @Override
+ public void onConnectionServiceStopped() {
+ }
+
+ @Override
+ public synchronized void onConnectorsAdded(Collection<IServiceConnector> connectors) {
+ for (IServiceConnector connector : hostFilter.accept(connectors)) {
+ OteServiceProperties props = new OteServiceProperties(connector);
+ props.printStats();
+ IHostTestEnvironment env = (IHostTestEnvironment) connector.getService();
+ if (isAcceptableTestEnvironment(env, props)) {
+ testHosts.put(env, connector);
+ notifyHostAvailable(env, connector, props);
+ }
+ }
+ }
+
+ @Override
+ public synchronized void onConnectorRemoved(IServiceConnector connector) {
+ if (hostFilter.accept(connector)) {
+ IHostTestEnvironment env = (IHostTestEnvironment) connector.getService();
+ testHosts.remove(env);
+ notifyHostUnavailable(env, connector, new OteServiceProperties(connector));
+ IHostTestEnvironment connectedHost = getConnectedHost();
+ if (connectedHost != null && connectedHost.equals(env)) {
+ testConnection = null;
+ listenerNotifier.notifyConnectionLost(connector, env);
+ }
+ }
+ }
+
+}
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 00000000000..5f1a01b452a
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.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.service.core;
+
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+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 UserTestSessionKey sessionKey;
+
+ /**
+ * @param connectedTestHost
+ * @param connectEnvironment
+ * @param sessionKey
+ */
+ TestHostConnection(IServiceConnector connector, ITestEnvironment connectEnvironment, UserTestSessionKey sessionKey) {
+ // 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 (sessionKey == null) {
+ throw new NullPointerException("session key cannot be null");
+ }
+ this.serviceConnector = connector;
+ this.connectEnvironment = connectEnvironment;
+ this.sessionKey = sessionKey;
+ }
+
+ /**
+ * @return the connectedTestHost
+ */
+ public IHostTestEnvironment getConnectedTestHost() {
+ return (IHostTestEnvironment) serviceConnector.getService();
+ }
+
+ /**
+ * @return the connectEnvironment
+ */
+ public ITestEnvironment getConnectEnvironment() {
+ return connectEnvironment;
+ }
+
+ /**
+ * @return the sessionKey
+ */
+ public UserTestSessionKey getSessionKey() {
+ return sessionKey;
+ }
+
+ /**
+ * @return the serviceConnector
+ */
+ public IServiceConnector getServiceConnector() {
+ return serviceConnector;
+ }
+
+ /**
+ * @throws RemoteException
+ */
+ void endConnection() throws RemoteException {
+ // intentionally package-private
+
+ connectEnvironment.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 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.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.jini/.project b/org.eclipse.osee.ote.connection.jini/.project
new file mode 100644
index 00000000000..f58c70bae35
--- /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 00000000000..887c164d92a
--- /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.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.connection.jini.Activator
+Bundle-Vendor: Eclipse.org
+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.6
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 00000000000..6f20375d6c7
--- /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 00000000000..1eeb99023b5
--- /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/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 00000000000..d76cd7d4ca1
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.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.connection.jini;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.framework.jini.JiniClassServer;
+import org.eclipse.osee.framework.jini.discovery.RelaxedSecurity;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * 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 ServiceTracker connectionServiceTracker;
+ private ServiceTracker packageAdminTracker;
+ private JiniConnectorRegistrar registrar;
+
+ private ServiceRegistration registration;
+
+ private ExportClassLoader exportClassLoader;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ System.setSecurityManager(new RelaxedSecurity());
+ super.start(context);
+ plugin = this;
+
+
+
+ }
+
+ void startJini() throws Exception {
+ try {
+ JiniClassServer.getInstance();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ BundleContext context = getBundle().getBundleContext();
+ connectionServiceTracker = new ServiceTracker(context,
+ IConnectionService.class.getName(), null);
+ connectionServiceTracker.open();
+
+ packageAdminTracker = new ServiceTracker(context, PackageAdmin.class
+ .getName(), null);
+ packageAdminTracker.open();
+
+ PackageAdmin pa = (PackageAdmin) packageAdminTracker.getService();
+
+ exportClassLoader = new ExportClassLoader(pa);
+ IConnectionService service = (IConnectionService) connectionServiceTracker
+ .getService();
+
+ registrar = new JiniConnectorRegistrar(exportClassLoader, service);
+
+ // register the service
+ registration = context.registerService(IJiniConnectorRegistrar.class.getName(),
+ registrar, null);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ registrar.shutdown();
+ registration.unregister();
+ super.stop(context);
+ connectionServiceTracker.close();
+ packageAdminTracker.close();
+ exportClassLoader = null;
+ registrar = null;
+ plugin = null;
+ try {
+ JiniClassServer.stopServer();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 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 00000000000..eebad9eb415
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.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.connection.jini;
+
+import org.eclipse.osee.connection.service.IConnectorContributor;
+
+public class ConnectorContribution implements IConnectorContributor {
+
+ public ConnectorContribution() {
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public void init() throws Exception {
+ Activator.getDefault().startJini();
+ }
+
+}
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 00000000000..79d194dd480
--- /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 00000000000..d173d378cb8
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.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.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 00000000000..42960387049
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.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.connection.jini;
+
+import java.io.File;
+import java.net.URI;
+import java.rmi.RemoteException;
+
+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;
+ buildPropertiesFromEntries(serviceItem.attributeSets, getProperties());
+ link = (IJiniConnectorLink) getProperties().getProperty(LINK_PROPERTY);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getService()
+ */
+ @Override
+ public Object getService() {
+ return serviceItem.service;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getType()
+ */
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#upload(java.io.File)
+ */
+ @Override
+ public URI upload(File file) throws Exception {
+ return null;
+ }
+
+ @Override
+ public boolean ping() {
+ try {
+ return link.ping();
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+}
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 00000000000..292bbc576d6
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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;
+import org.eclipse.osee.framework.jini.service.core.PropertyEntry;
+
+/**
+ * @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<Object, ExportInfo>();
+ private final EnhancedProperties properties;
+ private final HashSet<IServicePropertyChangeListener> propertyChangeListeners = new HashSet<IServicePropertyChangeListener>();
+
+
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.connection.service.IServiceConnector#export(java.lang
+ * .Object)
+ */
+ @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);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.connection.service.IServiceConnector#unexport(java.lang
+ * .Object)
+ */
+ @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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.connection.service.IServiceConnector#stop()
+ */
+ @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 static void buildPropertiesFromEntries(Entry[] entries,
+ EnhancedProperties properties) {
+ for (Entry entry : entries) {
+ if (entry instanceof PropertyEntry) {
+ ((PropertyEntry) entry).fillProps(properties.asMap());
+ // } else if (entry instanceof ServiceInfo) {
+ // ServiceInfo si = (ServiceInfo) entry;
+ // properties.setProperty("name", si.name);
+ // properties.setProperty("model", si.model == null ? "N.A."
+ // : si.model);
+ // } else if (entry instanceof Comment) {
+ // properties.setProperty("comment", ((Comment) entry).comment);
+ // } else if (entry instanceof GroupEntry) {
+ // properties.setProperty("groups", ((GroupEntry) entry)
+ // .getFormmatedString());
+ // } else if (entry instanceof StaticStationInfo) {
+ // StaticStationInfo ssi = (StaticStationInfo) entry;
+ // properties.setProperty("type", ssi.type);
+ // properties.setProperty("station", ssi.station);
+ // properties.setProperty("mode", ssi.mode);
+ // properties.setProperty("date", ssi.dateStarted);
+ // properties.setProperty("version", ssi.version);
+ // } else if (entry instanceof Name) {
+ // properties.setProperty("name", ((Name) entry).name);
+ // } else if (entry instanceof VersionEntry) {
+ // properties.setProperty("version",
+ // ((VersionEntry) entry).version);
+ // } else if (entry instanceof TestEntry) {
+ // System.out.println("test entry data = "
+ // + ((TestEntry) entry).getData());
+ }
+ }
+ }
+
+ protected Entry[] createEntries() {
+ LinkedList<Entry> entries = new LinkedList<Entry>();
+ // GroupEntry group = new GroupEntry();
+ // group.group =
+ // OseeProperties.getInstance().getOseeJiniServiceGroups();
+ // entries.add(group);
+ // // entries.add(new StaticStationInfo((String) properties
+ // // .getProperty("station"), "", (String) properties
+ // // .getProperty("type"), "", "", new Date()));
+ // entries.add(new ServiceInfo((String) properties.getProperty("name"),
+ // "", "", "", "", ""));
+ // // entries.add(new TestEntry("this is test data"));
+ PropertyEntry entry = new PropertyEntry(properties.asMap());
+ assert entry.getProperty("date", null) != null;
+ entries.add(entry);
+ return entries.toArray(new Entry[entries.size()]);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.connection.service.IServiceConnector#getProperty(java
+ * .lang.String, java.lang.String)
+ */
+ @Override
+ public Serializable getProperty(String property, Serializable defaultValue) {
+ return properties.getProperty(property, defaultValue);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.connection.service.IServiceConnector#
+ * addPropertyChangeListener
+ * (org.eclipse.osee.connection.service.IServicePropertyChangeListener)
+ */
+ @Override
+ public void addPropertyChangeListener(
+ IServicePropertyChangeListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.connection.service.IServiceConnector#
+ * removePropertyChangeListener
+ * (org.eclipse.osee.connection.service.IServicePropertyChangeListener)
+ */
+ @Override
+ public void removePropertyChangeListener(
+ IServicePropertyChangeListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.connection.service.IServiceConnector#setProperty(java
+ * .lang.String, java.lang.String)
+ */
+ @Override
+ public void setProperty(String key, Serializable value) {
+ properties.setProperty(key, value);
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChanged(this, key, value);
+ }
+ }
+
+ protected EnhancedProperties getProperties() {
+ return properties;
+ }
+
+ public void entriesChanged(Entry[] entries) {
+ EnhancedProperties newProps = new EnhancedProperties();
+ buildPropertiesFromEntries(entries, newProps);
+ for (String key : properties.differences(newProps)) {
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener
+ .propertyChanged(this, key, properties.getProperty(key));
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnectorRegistrar.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnectorRegistrar.java
new file mode 100644
index 00000000000..ffc777006e9
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnectorRegistrar.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+
+import net.jini.config.Configuration;
+import net.jini.config.ConfigurationException;
+import net.jini.core.discovery.LookupLocator;
+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.core.lookup.ServiceTemplate;
+import net.jini.discovery.DiscoveryEvent;
+import net.jini.discovery.DiscoveryListener;
+import net.jini.discovery.LookupDiscoveryManager;
+import net.jini.lookup.LookupCache;
+import net.jini.lookup.ServiceDiscoveryEvent;
+import net.jini.lookup.ServiceDiscoveryListener;
+import net.jini.lookup.ServiceDiscoveryManager;
+
+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.jini.discovery.OseeJiniConfiguration;
+import org.eclipse.osee.framework.plugin.core.config.JiniLookupGroupConfig;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class JiniConnectorRegistrar implements IJiniConnectorRegistrar, IConnectorListener,
+ ServiceDiscoveryListener, DiscoveryListener {
+
+ private final HashMap<JiniServiceSideConnector, HashSet<ServiceRegistrar>> serverSideConnectors = new HashMap<JiniServiceSideConnector, HashSet<ServiceRegistrar>>();
+ private final HashSet<ServiceRegistrar> serviceRegistrars = new HashSet<ServiceRegistrar>();
+ private final IConnectionService connectionService;
+ private final HashMap<ServiceID, JiniClientSideConnector> clientSideConnectors = new HashMap<ServiceID, JiniClientSideConnector>();
+
+ private LookupDiscoveryManager lookupDiscoveryManager;
+ private ServiceDiscoveryManager serviceDiscoveryManager;
+ private LookupCache lookupCache;
+ private boolean isShutdown = false;
+
+ public JiniConnectorRegistrar(ClassLoader loader, IConnectionService connectionService)
+ throws Exception, ConfigurationException {
+ this.connectionService = connectionService;
+ connectionService.addListener(this);
+ String[] groups = JiniLookupGroupConfig.getOseeJiniServiceGroups();
+ if (groups == null) {
+ groups = new String[] {};
+ }
+ Configuration config = new OseeJiniConfiguration();
+ ClassLoader previousLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(loader);
+ lookupDiscoveryManager = new LookupDiscoveryManager(groups, null, this, config);
+ serviceDiscoveryManager = new ServiceDiscoveryManager(lookupDiscoveryManager, null, config);
+
+ lookupCache = serviceDiscoveryManager.createLookupCache(new ServiceTemplate(null,new Class[] {},null),
+ null,
+ this);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(previousLoader);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @seeorg.eclipse.osee.connection.service.IConnectorListener# onConnectionServiceStopped()
+ */
+ @Override
+ public void onConnectionServiceStopped() {
+ shutdown();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectorListener#onConnectorAdded
+ * (org.eclipse.osee.connection.service.IServiceConnector)
+ */
+ @Override
+ public synchronized void onConnectorsAdded(
+ Collection<IServiceConnector> connectors) {
+ for (IServiceConnector connector : connectors) {
+ if (connector.getConnectorType().equals(JiniServiceSideConnector.TYPE)) {
+ System.out.println("found jini server side connector");
+ JiniServiceSideConnector jiniConnector = (JiniServiceSideConnector) connector;
+ HashSet<ServiceRegistrar> list = new HashSet<ServiceRegistrar>(serviceRegistrars);
+ serverSideConnectors.put(jiniConnector, list);
+ for (ServiceRegistrar registrar : list) {
+ try {
+ final ServiceRegistration registration = registrar.register(
+ jiniConnector.getServiceItem(),
+ Long.MAX_VALUE);
+ jiniConnector.addRegistration(registration);
+ }
+ catch (RemoteException ex) {
+ Activator.log(Level.WARNING, "Error registering service", ex);
+ }
+ }
+
+ }
+ }
+ }
+
+ public synchronized void shutdown() {
+ if (!isShutdown) {
+ System.out.println("shuting down JiniRegistrar");
+ isShutdown = true;
+ lookupDiscoveryManager.terminate();
+ serviceDiscoveryManager.terminate();
+ serviceRegistrars.clear();
+ for (JiniServiceSideConnector connector : serverSideConnectors.keySet()) {
+ try {
+ connector.removeAllRegistrations();
+ }
+ catch (Exception ex) {
+ Activator.log(Level.WARNING, "Error removing registrations on shutdown", ex);
+ }
+ }
+ if (!connectionService.isStopped()) {
+ for (JiniServiceSideConnector connector : serverSideConnectors.keySet()) {
+ try {
+ connectionService.removeConnector(connector);
+ }
+ catch (Exception ex) {
+ Activator.log(Level.WARNING, "Error removing connectors on shutdown", ex);
+ }
+ }
+ for (JiniClientSideConnector connector : new ArrayList<JiniClientSideConnector>(
+ clientSideConnectors.values())) {
+ try {
+ connectionService.removeConnector(connector);
+ }
+ catch (Exception ex) {
+ Activator.log(Level.WARNING, "Error removing connectors on shutdown", ex);
+ }
+ }
+ }
+ serverSideConnectors.clear();
+ clientSideConnectors.clear();
+ }
+ }
+
+ @Override
+ public void addGroup(String... groups) throws IOException {
+ lookupDiscoveryManager.addGroups(groups);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectorListener#onConnectorRemoved
+ * (org.eclipse.osee.connection.service.IServiceConnector)
+ */
+ @Override
+ public synchronized void onConnectorRemoved(IServiceConnector connector) {
+ if (connector.getConnectorType().equals(JiniServiceSideConnector.TYPE)) {
+ JiniServiceSideConnector jiniConnector = (JiniServiceSideConnector) connector;
+ serverSideConnectors.remove(jiniConnector);
+ }
+ else if (connector.getConnectorType().equals(JiniClientSideConnector.TYPE)) {
+ Iterator<Entry<ServiceID, JiniClientSideConnector>> iter = clientSideConnectors.entrySet().iterator();
+ while (iter.hasNext()) {
+ final Entry<ServiceID, JiniClientSideConnector> entry = iter.next();
+ if (entry.getValue().equals(connector)) {
+ iter.remove();
+ }
+ }
+ }
+ }
+
+ @Override
+ public synchronized void discovered(DiscoveryEvent event) {
+ try {
+ for (ServiceRegistrar registrar : event.getRegistrars()) {
+ System.out.println("Lookup Discovered: Service ID= " + registrar.getServiceID());
+ try {
+ for (String group : registrar.getGroups()) {
+ Activator.log(Level.INFO, "found JINI registrar group: " + group);
+ }
+ }
+ catch (RemoteException ex) {
+ ex.printStackTrace();
+ }
+ serviceRegistrars.add(registrar);
+ for (Map.Entry<JiniServiceSideConnector, HashSet<ServiceRegistrar>> entry : serverSideConnectors.entrySet()) {
+ final ServiceRegistration registration = registrar.register(
+ entry.getKey().getServiceItem(),
+ Long.MAX_VALUE);
+ entry.getKey().addRegistration(registration);
+ entry.getValue().addAll(serviceRegistrars);
+ }
+ }
+ }
+ catch (Exception ex) {
+ Activator.log(Level.SEVERE, "Error processing service discovery", ex);
+ }
+ }
+
+ @Override
+ public synchronized void discarded(DiscoveryEvent event) {
+ this.serviceRegistrars.removeAll(Arrays.asList(event.getRegistrars()));
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceAdded(net.jini.lookup
+ * .ServiceDiscoveryEvent)
+ */
+ public synchronized void serviceAdded(ServiceDiscoveryEvent event) {
+ ServiceItem serviceItem = event.getPostEventServiceItem();
+ JiniClientSideConnector connector = new JiniClientSideConnector(serviceItem);
+ clientSideConnectors.put(serviceItem.serviceID, connector);
+ connectionService.addConnector(connector);
+ }
+
+ @Override
+ public synchronized void serviceRemoved(ServiceDiscoveryEvent event) {
+ JiniClientSideConnector connector = clientSideConnectors.remove(event.getPreEventServiceItem().serviceID);
+
+ if (connector != null) {
+ try {
+ connectionService.removeConnector(connector);
+ }
+ catch (Exception e) {
+ Activator.log(Level.SEVERE, "error processing removed service event", e);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.jini.lookup.ServiceDiscoveryListener#serviceChanged(net.jini.lookup
+ * .ServiceDiscoveryEvent)
+ */
+ public synchronized void serviceChanged(ServiceDiscoveryEvent event) {
+ ServiceItem item = event.getPostEventServiceItem();
+ JiniClientSideConnector connector = clientSideConnectors.get(item.serviceID);
+ if (connector != null) {
+ connector.entriesChanged(item.attributeSets);
+ }
+ }
+
+ @Override
+ public String[] getGroups() {
+ return lookupDiscoveryManager.getGroups();
+ }
+
+ @Override
+ public void addLocators(String... hosts) throws MalformedURLException, ClassNotFoundException, IOException {
+ LookupLocator[] locators = new LookupLocator[hosts.length];
+ int i = 0;
+ for (String host : hosts) {
+ locators[i++] = new LookupLocator(host);
+ }
+ lookupDiscoveryManager.addLocators(locators);
+ }
+
+ @Override
+ public LookupLocator[] getLocators() {
+ return lookupDiscoveryManager.getLocators();
+ }
+}
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 00000000000..0cc282561d1
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.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.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.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;
+
+import sun.reflect.generics.visitor.Reifier;
+
+/**
+ * @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 final Remote service;
+ private final Remote serviceProxy;
+ private final BasicJeriExporter serviceExporter;
+ private final ServiceID serviceId;
+ private final Timer timer = new Timer();
+ private final ServiceItem serviceItem;
+ private final BasicJeriExporter linkExporter;
+ private final IJiniConnectorLink exportedThis;
+ private boolean stopped = false;
+ 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 = (Remote) serviceExporter.export(service);
+ exportedThis = (IJiniConnectorLink) linkExporter.export(this);
+ props.setProperty(LINK_PROPERTY, (Serializable) exportedThis);
+ serviceItem = new ServiceItem(serviceId, serviceProxy, createEntries());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getService()
+ */
+ @Override
+ public Remote getService() {
+ return service;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.connection.service.IServiceConnector#stop()
+ */
+ @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) {
+ registrations
+ .put(registration, new LeaseRenewTask(timer, registration));
+ }
+
+ 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);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getType()
+ */
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.connection.jini.JiniConnector#setProperty(java.lang
+ * .String, java.lang.String)
+ */
+ @Override
+ public void setProperty(String key, Serializable value) {
+ super.setProperty(key, value);
+ setAttributes(createEntries());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.connection.service.IServiceConnector#upload(java.io.
+ * File)
+ */
+ @Override
+ public URI upload(File file) throws Exception {
+ return null;
+ }
+
+ @Override
+ public boolean ping() {
+ return true;
+ }
+
+}
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 00000000000..7950c3986a1
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.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.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>";
+ }
+
+ /**
+ * @param data
+ */
+ 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 00000000000..2124183e80e
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.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.connection.jini.util;
+
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+
+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 = 2 * 60 * 1000; // 2 minutes
+
+ private final ServiceRegistration registration;
+ private volatile boolean canceled = false;
+
+ public LeaseRenewTask(Timer timer, ServiceRegistration registration) {
+ this.registration = registration;
+ timer.scheduleAtFixedRate(this, 0, RENEWAL_TIME);
+ }
+
+ public void run() {
+ if (canceled) {
+ return;
+ }
+ try {
+ // Renew for the maximum amount of time allowed
+ registration.getLease().renew(RENEWAL_TIME + 10000);
+ } catch (Exception ex) {
+ Activator.log(Level.SEVERE, "error renewing lease", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.TimerTask#cancel()
+ */
+ @Override
+ public boolean cancel() {
+ canceled = true;
+ boolean result = super.cancel();
+ try {
+ 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 00000000000..02159672985
--- /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/.project b/org.eclipse.osee.ote.connection.service.test/.project
new file mode 100644
index 00000000000..c0ee3b315bd
--- /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/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.ote.connection.service.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..cc5fb64c419
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed May 07 16:07:05 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
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 00000000000..94ce8a9138c
--- /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: 1.0.0
+Bundle-Activator: org.eclipse.osee.ote.connection.service.test.Activator
+Bundle-Vendor: Eclipse.org
+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.6
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 00000000000..41eb6ade2b4
--- /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/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 00000000000..9f2891a0f34
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.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.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;
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ connectionServiceTracker = new ServiceTracker(context, IConnectionService.class.getName(), null);
+ connectionServiceTracker.open();
+ final IConnectionService service = getConnectionService();
+// Entry[] entries = new Entry[] {new ServiceInfo("Dummy Test Service", "boeing", "ken", "1.0.0", "test model", "")};
+ 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);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ 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 00000000000..f9b608f4fdc
--- /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 00000000000..02159672985
--- /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/.project b/org.eclipse.osee.ote.connection.service/.project
new file mode 100644
index 00000000000..ebc756852db
--- /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/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.ote.connection.service/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..32708001733
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Tue Aug 19 15:32:58 MST 2008
+eclipse.preferences.version=1
+pluginProject.extensions=true
+resolve.requirebundle=false
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 00000000000..9c9942d568a
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+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.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.connection.service.Activator
+Bundle-Vendor: Eclipse.org
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.logging,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.connection.service
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.equinox.ds,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core
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 00000000000..6f20375d6c7
--- /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 00000000000..fa5a2c3223d
--- /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/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 00000000000..5d3f994f132
--- /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/Activator.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/Activator.java
new file mode 100644
index 00000000000..349b31fc1ea
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/Activator.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.connection.service;
+
+import java.util.List;
+import java.util.logging.Level;
+
+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;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
+ * )
+ */
+ 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);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ 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/ConnectionServiceImpl.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/ConnectionServiceImpl.java
new file mode 100644
index 00000000000..40cb84dcfba
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/ConnectionServiceImpl.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.connection.service;
+
+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;
+
+class ConnectionServiceImpl implements IConnectionService {
+
+ private final HashSet<IServiceConnector> connectors = new HashSet<IServiceConnector>();
+ private final EventNotifier eventNotifier = new EventNotifier();
+
+ private boolean isStopped = false;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#addConnector(org.eclipse.osee.connection.service.IServiceConnector)
+ */
+ @Override
+ public void addConnector(IServiceConnector connector) {
+ addConnectors(Collections.singletonList(connector));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#addConnectors(java.util.Collection)
+ */
+ @Override
+ public synchronized void addConnectors(Collection<IServiceConnector> connectors) {
+ checkState();
+ this.connectors.addAll(connectors);
+ eventNotifier.notifyConnectorsAdded(connectors);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#addListener(org.eclipse.osee.connection.service.IConnectorListener)
+ */
+ @Override
+ public synchronized void addListener(IConnectorListener listener) {
+ checkState();
+ eventNotifier.addListener(listener);
+ listener.onConnectorsAdded(connectors);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#findConnectors(java.lang.String)
+ */
+ @Override
+ public synchronized List<IServiceConnector> findConnectors(IConnectorFilter[] filterChain) {
+ checkState();
+ ArrayList<IServiceConnector> matchingConnectors = new ArrayList<IServiceConnector>();
+ 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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#getAllConnectors()
+ */
+ @Override
+ public synchronized Collection<IServiceConnector> getAllConnectors() {
+ checkState();
+ return connectors;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#removeConnector(org.eclipse.osee.connection.service.IServiceConnector)
+ */
+ @Override
+ public synchronized void removeConnector(IServiceConnector connector) throws Exception {
+ checkState();
+ if (connectors.remove(connector)) {
+ eventNotifier.notifyConnectorRemoved(connector);
+ connector.stop();
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#removeListener(org.eclipse.osee.connection.service.IConnectorListener)
+ */
+ @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");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IConnectionService#isStopped()
+ */
+ @Override
+ public boolean isStopped() {
+ return isStopped;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/EventNotifier.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/EventNotifier.java
new file mode 100644
index 00000000000..8f56a3bffa4
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/EventNotifier.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.connection.service;
+
+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;
+
+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<IServiceConnector>(
+ 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.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 00000000000..14a922a6e8b
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.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.connection.service;
+
+import java.util.Collection;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectionService {
+
+ /**
+ * finds all currently existing connectors
+ *
+ * @return
+ */
+ Collection<IServiceConnector> getAllConnectors();
+
+ /**
+ * finds all available connectors that are accepted by all filters in the filter chain
+ *
+ * @param pattern
+ * @param filterChain
+ * @return
+ */
+ 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.
+ *
+ * @param listener
+ */
+ 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 00000000000..9fbd2144b10
--- /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 00000000000..1289bbe711d
--- /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 00000000000..f0b9ff680e4
--- /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 00000000000..89d49ad5ce5
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.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.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 00000000000..07f4d7e775d
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.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.connection.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.rmi.server.ExportException;
+
+/**
+ * Provides a communication pipe to a service.
+ *
+ * @author Ken J. Aguilar
+ */
+public interface IServiceConnector {
+
+ String getConnectorType();
+
+ /**
+ * gets the service provided by this connector
+ *
+ * @return
+ */
+ 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
+ *
+ * @param callback
+ * @return
+ * @throws Exception
+ */
+ Object export(Object callback) throws ExportException;
+
+ /**
+ * finds the matching exported representation of supplied object
+ *
+ * @param callback
+ * @return
+ * @throws Exception
+ */
+ 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.
+ *
+ * @param file
+ * @return
+ * @throws Exception
+ */
+ URI upload(File file) throws Exception;
+
+ boolean ping();
+}
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 00000000000..186ea4eab3e
--- /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 00000000000..869b6fb7a28
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.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.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 final Object service;
+ private final EnhancedProperties properties;
+
+ private final HashSet<IServicePropertyChangeListener> propertyChangeListeners =
+ new HashSet<IServicePropertyChangeListener>();
+
+ /**
+ * @param service
+ * @param properties
+ */
+ public LocalConnector(Object service, EnhancedProperties properties) {
+ this.service = service;
+ this.properties = properties;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getService()
+ */
+ @Override
+ public Object getService() {
+ return service;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#stop()
+ */
+ @Override
+ public void stop() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getType()
+ */
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#setProperty(java.lang.String, java.lang.String)
+ */
+ @Override
+ public void setProperty(String key, Serializable value) {
+ properties.setProperty(key, value);
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChanged(this, key, value);
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#getProperty(java.lang.String, java.lang.String)
+ */
+ @Override
+ public Serializable getProperty(String property, Serializable defaultValue) {
+ return properties.getProperty(property, defaultValue);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#export(java.lang.Object)
+ */
+ @Override
+ public Object export(Object callback) throws ExportException {
+ return callback;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#unexport(java.lang.Object)
+ */
+ @Override
+ public void unexport(Object callback) throws Exception {
+ }
+
+
+ @Override
+ public Object findExport(Object callback) {
+ return callback;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.connection.service.IServiceConnector#
+ * addPropertyChangeListener
+ * (org.eclipse.osee.connection.service.IServicePropertyChangeListener)
+ */
+ @Override
+ public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#removePropertyChangeListener(org.eclipse.osee.connection.service.IServicePropertyChangeListener)
+ */
+ @Override
+ public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.connection.service.IServiceConnector#upload(java.io.File)
+ */
+ @Override
+ public URI upload(File file) throws Exception {
+ return file.toURI();
+ }
+
+ @Override
+ public boolean ping() {
+ return true;
+ }
+
+}
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 00000000000..147ed6a308a
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.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.connection.service;
+
+import java.io.File;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class LocalFileKey implements IFileKey {
+
+ private final File file;
+
+ /**
+ * @param file
+ */
+ LocalFileKey(File file) {
+ this.file = file;
+ }
+
+ File getFile() {
+ return file;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/.classpath b/org.eclipse.osee.ote.core/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.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.core/.cvsignore b/org.eclipse.osee.ote.core/.cvsignore
new file mode 100644
index 00000000000..092357e47d3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.osee.ote.core/.project b/org.eclipse.osee.ote.core/.project
new file mode 100644
index 00000000000..1eb4976592c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.project
@@ -0,0 +1,28 @@
+<?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>
+ </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/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..6af798f24e3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,311 @@
+#Wed Apr 09 09:42:26 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=80
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=0
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=3
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=3
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..1180ef73fa1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,5 @@
+#Wed Apr 09 09:42:26 MST 2008
+eclipse.preferences.version=1
+formatter_profile=_OSEE Java Standard
+formatter_settings_version=11
+internal.default.compliance=default
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 00000000000..f8eac3656c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
@@ -0,0 +1,43 @@
+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.4.0.qualifier
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.ote.core,
+ 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.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.model,
+ org.eclipse.osee.ote.core.test.shells,
+ org.eclipse.osee.ote.core.test.tags,
+ org.eclipse.osee.ote.core.testPoint
+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,
+ org.eclipse.help
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Activator: org.eclipse.osee.ote.core.internal.Activator
+Import-Package: org.eclipse.osee.framework.messaging,
+ org.eclipse.osee.framework.messaging.id
diff --git a/org.eclipse.osee.ote.core/build.properties b/org.eclipse.osee.ote.core/build.properties
new file mode 100644
index 00000000000..383b8fd5cdb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/build.properties
@@ -0,0 +1,10 @@
+bin.includes = plugin.xml,\
+ META-INF/,\
+ src/,\
+ images/,\
+ .,\
+ help/
+source.. = src/
+output.. = bin/
+jars.compile.order = .
+src.includes = src/
diff --git a/org.eclipse.osee.ote.core/help/toc.xml b/org.eclipse.osee.ote.core/help/toc.xml
new file mode 100644
index 00000000000..1c3baa10d9a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/help/toc.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+<toc label="OSEE Test Environment (OTE)">
+ <topic label="Overview" href="src/org/eclipse/osee/ote/core/package.html" />
+ <topic label="Environments">
+ <anchor id="environments" />
+ <topic label="Core TestEnvironment" href="src/org/eclipse/osee/ote/core/environment/package.html" />
+ </topic>
+ <topic label="Models">
+ <topic label="Overview" href="src/org/eclipse/osee/ote/core/model/package.html" />
+ <anchor id="models" />
+ </topic>
+ <topic label="Tools">
+ <anchor id="tools" />
+ </topic>
+ <topic label="HOWTOs">
+ <anchor id="howTos" />
+ </topic>
+ <topic label="Reference">
+ <anchor id="reference" />
+ </topic>
+</toc> \ No newline at end of file
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 00000000000..b29b25ee454
--- /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 00000000000..77b808b56d3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/plugin.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ id="TestInterface"
+ name="TestInterface"
+ point="org.eclipse.osee.framework.jini.JiniInterface">
+ <Interface classname="org.eclipse.osee.ote.core.TestClient"/>
+ <Interface classname="org.eclipse.osee.ote.core.environment.jini.ITestEnvironmentCommandCallback"/>
+ <Interface classname="org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole"/>
+ <Interface
+ classname="org.eclipse.osee.ote.core.environment.status.IServiceStatusData">
+ </Interface>
+ <Interface
+ classname="org.eclipse.osee.ote.core.environment.status.IServiceStatusDataCommand">
+ </Interface>
+ </extension>
+ <extension
+ id="TestBundle"
+ name="TestBundle"
+ point="org.eclipse.osee.framework.jini.JiniInterface">
+ <RegisterBundle/>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="true">
+ </toc>
+ </extension>
+
+</plugin>
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 00000000000..636f3c05f24
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.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.rmi.RemoteException;
+
+public abstract class AbstractRemoteSession implements IRemoteUserSession {
+
+ private final OSEEPerson1_4 user;
+
+ protected AbstractRemoteSession(OSEEPerson1_4 user) {
+ this.user = user;
+ }
+
+ public OSEEPerson1_4 getUser() {
+ return user;
+ }
+
+ public abstract String getAddress() throws RemoteException;
+
+ public abstract byte[] getFile(String workspacePath) throws RemoteException;
+
+ public abstract long getFileDate(String workspacePath) throws RemoteException;
+
+ public abstract String getFileVersion(String workspacePath) throws RemoteException;
+
+ public abstract boolean isAlive() throws RemoteException;
+
+}
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 00000000000..491cf6c61c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.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;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ConnectionRequestResult implements Serializable {
+ private final ITestEnvironment environment;
+ private final UserTestSessionKey sessionKey;
+ private final ReturnStatus status;
+
+ /**
+ * @param environment
+ * @param sessionKey
+ * @param status
+ */
+ public ConnectionRequestResult(ITestEnvironment environment, UserTestSessionKey sessionKey, ReturnStatus status) {
+ this.environment = environment;
+ this.sessionKey = sessionKey;
+ this.status = status;
+ }
+
+ /**
+ * @return the environment
+ */
+ public ITestEnvironment getEnvironment() {
+ return environment;
+ }
+
+ /**
+ * @return the sessionKey
+ */
+ public UserTestSessionKey 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/ExecutionUnitException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java
new file mode 100644
index 00000000000..27478c8a0fa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.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;
+
+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 00000000000..3b3303ae294
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.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.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 final ConcurrentHashMap<String, WeakReference<Object>> map;
+ private static GCHelper singleton;
+
+ /**
+ *
+ */
+ public GCHelper() {
+ super();
+ map = new ConcurrentHashMap<String, WeakReference<Object>>(1024);
+ }
+
+ public static GCHelper getGCHelper() {
+ if (singleton == null) {
+ singleton = new GCHelper();
+ }
+ return singleton;
+ }
+
+ public void addRefWatch(Object obj) {
+ String key = obj.toString() + " [ " + obj.hashCode() + " ] ";
+ map.put(key, new WeakReference<Object>(obj));
+ }
+
+ public void printLiveReferences() {
+
+ StringBuilder builder = new StringBuilder(8000);
+ writeGCResults(builder);
+ OseeLog.log(GCHelper.class, Level.INFO, builder.toString());
+ }
+
+ public void writeGCResults(StringBuilder builder) {
+ TreeSet<String> live = new TreeSet<String>();
+ System.gc();
+ for (Map.Entry<String, WeakReference<Object>> entry : map.entrySet()) {
+ if (entry.getValue().get() != null) {
+ Object objectToFind = 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<Object>();
+ 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() {
+
+ 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 00000000000..d2d89d9339a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.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;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.framework.messaging.Message;
+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 {
+ public String getAddress() throws RemoteException;
+
+ public OSEEPerson1_4 getUser() throws RemoteException;
+
+ public byte[] getFile(String workspacePath) throws RemoteException;
+
+ public long getFileDate(String workspacePath) throws RemoteException;
+
+ public String getFileVersion(String workspacePath) throws RemoteException;
+
+ public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws RemoteException;
+
+ public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws RemoteException;
+
+ public void initiateResumePrompt(IResumeResponse prompt) throws RemoteException;
+
+ public void initiateInformationalPrompt(String message) throws RemoteException;
+
+ public boolean isAlive() throws RemoteException;
+
+ 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 00000000000..7fc880805df
--- /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 00000000000..271c63de943
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.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;
+
+import org.eclipse.osee.framework.messaging.Message;
+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;
+
+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
+ *
+ * @param workspacePath
+ * @return the byte contents of the requested file or null if it does not exist
+ * @throws Exception
+ */
+ public byte[] getFile(String workspacePath) throws Exception;
+
+ public long getFileDate(String workspacePath) throws Exception;
+
+ public String getFileVersion(String workspacePath) throws Exception;
+
+ public void initiateInformationalPrompt(String message) throws Exception;
+
+ public void initiatePassFailPrompt(IPassFailPromptResponse 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 boolean isAlive() 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 00000000000..1bb4a82e06e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.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;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class MethodFormatter implements Xmlizable {
+ private final ArrayList<String> variableClass;
+ private final ArrayList<String> variableValue;
+
+ public MethodFormatter() {
+ variableClass = new ArrayList<String>();
+ variableValue = new ArrayList<String>();
+ }
+
+ public MethodFormatter add(float value) {
+ variableClass.add(float.class.getName());
+ variableValue.add(Double.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(double value) {
+ variableClass.add(double.class.getName());
+ variableValue.add(Double.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(byte value) {
+ variableClass.add(byte.class.getName());
+ variableValue.add(Double.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(short value) {
+ variableClass.add(short.class.getName());
+ variableValue.add(Double.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(int value) {
+ variableClass.add(int.class.getName());
+ variableValue.add(Integer.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(long value) {
+ variableClass.add(long.class.getName());
+ variableValue.add(Double.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(char value) {
+ variableClass.add(char.class.getName());
+ variableValue.add(Integer.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(boolean value) {
+ variableClass.add(boolean.class.getName());
+ variableValue.add(Boolean.toString(value));
+ return this;
+ }
+
+ public MethodFormatter add(EnumBase value) {
+ variableClass.add(EnumBase.class.getName());
+ variableValue.add(value.getName());
+ return this;
+ }
+
+ public MethodFormatter add(EnumBase[] value) {
+ variableClass.add(EnumBase[].class.getName());
+ String arrayValues = "[";
+ for (int i = 0; i < value.length; i++) {
+ arrayValues.concat(value[i].getName() + ", ");
+ }
+ arrayValues = "]";
+ variableValue.add(arrayValues);
+ return this;
+ }
+
+ public MethodFormatter add(Object value) {
+ variableClass.add(value.getClass().getName());
+ variableValue.add(value.toString());
+ return this;
+ }
+
+ public String toString() {
+ String argumentString = "";
+
+ for (int i = 0; i < variableValue.size(); i++) {
+
+ if (i != 0) argumentString += ", ";
+ argumentString += "<" + variableClass.get(i) + ">" + variableValue.get(i);
+
+ }
+ return argumentString;
+ }
+
+ public Element toXml(Document doc) {
+ Element toReturn = doc.createElement("MethodArguments");
+
+ for (int i = 0; i < variableValue.size(); i++) {
+ Element element = doc.createElement("Argument");
+ element.appendChild(Jaxp.createElement(doc, "Type", variableClass.get(i).toString()));
+
+ Object obj = variableValue.get(i);
+ String toLog = (obj != null ? XmlSupport.format(obj.toString()) : "null");
+ element.appendChild(Jaxp.createElement(doc, "Value", toLog));
+
+ toReturn.appendChild(element);
+ }
+ return toReturn;
+ }
+}
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 00000000000..94f415f4c4c
--- /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 String name;
+
+ private String email;
+
+ private 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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ public String toString() {
+ return name + ":" + email + ":" + id + " hash=" + hashCode();
+ }
+}
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 00000000000..d193ecc0ba0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.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.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<OseeTestThread>(32);
+ private volatile Throwable causeOfDeath = null;
+ private volatile Date timeOfDeath = null;
+
+ /**
+ * Creates the thread with the given name and as a non daemon thread
+ *
+ * @param name
+ */
+ 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<TestEnvironment>(env);
+ thread = new Thread(group, name) {
+
+ public void run() {
+ try {
+ OseeTestThread.this.run();
+ synchronized (threadList) {
+ threadList.remove(OseeTestThread.this);
+ }
+ } catch (TestException e) {
+ logger.log(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() {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ "Calling interrupt() on " + thread.getName(), new RuntimeException("call trace"));
+ thread.interrupt();
+ }
+
+ /**
+ * This method will be called upon thread execution
+ *
+ * @throws TestException
+ */
+ 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 ((TestEnvironment) OseeTestThread.this.env.get());
+ }
+
+ public static Collection<OseeTestThread> getThreads() {
+ return threadList;
+ }
+
+ private synchronized void cleanupAfterException(Throwable t) {
+ causeOfDeath = t;
+ timeOfDeath = Calendar.getInstance().getTime();
+ ((TestEnvironment) 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/OteLevel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java
new file mode 100644
index 00000000000..dd80564392e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.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;
+
+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);
+
+ /**
+ * @param name
+ * @param value
+ */
+ 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 00000000000..e7ca91464a4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.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;
+
+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 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;
+ }
+
+ /**
+ * 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/ReturnStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
new file mode 100644
index 00000000000..028d2451666
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.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;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ReturnStatus implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -7774073812320127561L;
+
+
+ private boolean status;
+ private 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/StandardShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java
new file mode 100644
index 00000000000..56938314d1b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.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.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(){
+ 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"); {
+
+
+ };
+ }
+
+ /* (non-Javadoc)
+ * @see lba.ote.server.console.shell.ICommandShell#println(java.lang.String)
+ */
+ public void println(String string) {
+ System.out.println(string);
+ }
+
+ /* (non-Javadoc)
+ * @see lba.ote.server.console.shell.ICommandShell#print(java.lang.String)
+ */
+ public void print(String string) {
+ System.out.print(string);
+ }
+
+ /* (non-Javadoc)
+ * @see lba.ote.server.console.shell.ICommandShell#println()
+ */
+ 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 00000000000..b97a39f4e95
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java
@@ -0,0 +1,441 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.requirement.RequirementId;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+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(RequirementId) 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 {
+ protected ITestLogger logger;
+ private final WeakReference<ITestEnvironmentAccessor> environment;
+ private boolean standAlone;
+ public int testCaseNumber;
+ private final WeakReference<TestScript> testScript;
+ // private List tracability;
+
+ private TestDescriptionRecord testDescription;
+ protected ArrayList<RequirementRecord> scriptTraceability;
+
+ // private List<RequirementId> tracability;
+
+ /**
+ * TestCase Constructor.
+ *
+ * @param testScript
+ */
+ public TestCase(TestScript testScript) {
+ this(testScript, false);
+ }
+
+ /**
+ * TestCase Constructor.
+ *
+ * @param testScript
+ * @param standAlone
+ */
+ 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());
+ // 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.scriptTraceability = new ArrayList<RequirementRecord>();
+
+ this.standAlone = standAlone;
+ if (addToRunList) {
+ this.testCaseNumber = testScript.addTestCase(this);
+ }
+ this.testScript = new WeakReference<TestScript>(testScript);
+ this.environment = new WeakReference<ITestEnvironmentAccessor>(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.scriptTraceability = new ArrayList<RequirementRecord>();
+
+ this.standAlone = false;
+ ;
+ this.testCaseNumber = 1;
+ this.testScript = null;
+ this.environment = new WeakReference<ITestEnvironmentAccessor>(accessor);
+
+ }
+
+ /**
+ * Add a requirement id to the tracability list.
+ *
+ * @param reqId
+ */
+ // public void addTracability(RequirementId reqId) {
+ // tracability.add(reqId);
+ // }
+ /**
+ * Called by baseDoTestCase(). This is implemented by the tester's in each test case in the test script.
+ *
+ * @param environment The Test environment.
+ * @param logger
+ * @throws InterruptedException
+ */
+ public abstract void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException;
+
+ public Element getTastCaseNumberXml(Document doc) {
+ return Jaxp.createElement(doc, "Number", String.valueOf(testCaseNumber));
+ }
+
+ public Element getTestCaseClassName(Document doc) {
+ String name = this.getClass().getName();
+ if (name == null || name.length() == 0) {
+ name = "";
+ }
+ return Jaxp.createElement(doc, "Name", name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.TestAccessor#getTestCase()
+ */
+ public TestCase getTestCase() {
+ return this;
+ }
+
+ /**
+ * @return Returns the testCaseNumber.
+ */
+ public int getTestCaseNumber() {
+ return testCaseNumber;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.TestAccessor#getTestEnvironment()
+ */
+ public ITestEnvironmentAccessor getTestEnvironment() {
+ return environment.get();
+ }
+
+ public TestRecord getTestRecord() {
+ return new TestCaseRecord(getTestEnvironment(), this);
+ }
+
+ /**
+ * @return Returns the testScript.
+ */
+ public TestScript getTestScript() {
+ return testScript.get();
+ }
+
+ /**
+ * @return Returns reference to the tracability list.
+ */
+ // public List getTracability() {
+ // return tracability;
+ // }
+ public Element getTracabilityXml(Document doc) {
+ Element traceElement = doc.createElement("Tracability");
+ for (RequirementRecord record : scriptTraceability) {
+ 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);
+ }
+
+ public String toString() {
+ String description = getTestScript().getClass().getName() + "Test Case " + testCaseNumber + ":";
+ if (scriptTraceability != null) {
+ for (RequirementRecord record : scriptTraceability) {
+ description += "\n\t" + record;
+ }
+ }
+ return description;
+ }
+
+ public Element toXml(Document doc) {
+ Element testCaseElement = doc.createElement("TestCase");
+ testCaseElement.appendChild(getTastCaseNumberXml(doc));
+ testCaseElement.appendChild(getTestCaseClassName(doc));
+ testCaseElement.appendChild(getTracabilityXml(doc));
+ return testCaseElement;
+ }
+
+ /**
+ * Starts running the test case. Calls doTestCase(), which is implemented by the tester in each test case.
+ *
+ * @param environment The Test Enviornment.
+ * @throws InterruptedException
+ */
+ 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.log(TestEnvironment.class,
+ OteLevel.TEST_EVENT,
+ String.format("Starting Test Case %s.%s", this.getTestScript().getClass().getSimpleName(),
+ this.getClass().getSimpleName()));
+ doTestCase(environment, environment.getLogger());
+ }
+
+ public void abortTestScript() {
+ environment.get().abortTestScript();
+ }
+
+ public boolean addTask(EnvironmentTask task) {
+ return environment.get().addTask(task);
+ }
+
+ public void associateObject(Class<?> c, Object obj) {
+ environment.get().associateObject(c, obj);
+ }
+
+ public Object getAssociatedObject(Class<?> c) {
+ return environment.get().getAssociatedObject(c);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.environment.interfaces.ITestEnvironmentAccessor#getAssociatedObjects()
+ */
+ public Set<Class<?>> getAssociatedObjects() {
+ return environment.get().getAssociatedObjects();
+ }
+
+ /*
+ * public ITestEnvironmentCommandCallback getClientCallback() { return
+ * environment.getClientCallback(); }
+ */
+
+ // public EnvironmentType getEnvironmentType() {
+ // return environment.getEnvironmentType();
+ // }
+ public long getEnvTime() {
+ return environment.get().getEnvTime();
+ }
+
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return environment.get().getExecutionUnitManagement();
+ }
+
+ public ITestLogger getLogger() {
+ return environment.get().getLogger();
+ }
+
+ public IScriptControl getScriptCtrl() {
+ return environment.get().getScriptCtrl();
+ }
+
+ /*
+ * public StatusBoard getStatusBoard() { return environment.getStatusBoard(); }
+ */
+
+ public ITestStation getTestStation() {
+ return environment.get().getTestStation();
+ }
+
+ public ITimerControl getTimerCtrl() {
+ return environment.get().getTimerCtrl();
+ }
+
+ public void onScriptComplete() throws InterruptedException {
+ environment.get().onScriptComplete();
+ }
+
+ public void onScriptSetup() {
+ environment.get().onScriptSetup();
+ }
+
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return environment.get().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 ArrayList<RequirementRecord> getScriptReqRecordTraceability() {
+ return scriptTraceability;
+ }
+
+ public void addTraceability(String description) {
+ this.scriptTraceability.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?!?!?!?");
+ }
+
+ public void abortTestScript(Throwable t) {
+ testScript.get().abortDueToThrowable(t);
+ }
+
+} \ 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 00000000000..542b772eb86
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.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.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<IHealthStatus>();
+
+ 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();
+ }
+
+ /**
+ * @param status
+ */
+public TestException(String message, List<IHealthStatus> status) {
+ this(message, Level.SEVERE);
+ this.status = status;
+}
+
+public String getThreadName() {
+ return threadCauseName;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+/**
+ * @return
+ */
+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 00000000000..73594c737aa
--- /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.internal.Activator;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TestPointTally implements ITestPointTally {
+ private int testPointSuccesses;
+ private int testPointFailures;
+ private String testName;
+ private OTEStatusBoard statusBoard;
+
+ public TestPointTally(String testName){
+ this.testName = testName;
+ statusBoard = Activator.getInstance().getOteStatusBoard();
+ }
+
+ public void reset() {
+ this.testPointSuccesses = 0;
+ this.testPointFailures = 0;
+ sendUpdate();
+ }
+
+ public int tallyTestPoint(boolean pass) {
+ if (pass) {
+ testPointSuccesses++;
+ } else {
+ testPointFailures++;
+ }
+ sendUpdate();
+ return getTestPointTotal();
+ }
+
+ private void sendUpdate(){
+ statusBoard.onTestPointUpdate(testPointSuccesses, testPointFailures, testName);
+ }
+
+ 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 00000000000..6060cccd46b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.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;
+
+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 String prompt;
+ private boolean waitForResponse;
+ private boolean ofpStep;
+ private PromptResponseType type;
+
+ public TestPrompt(String prompt) {
+ this(prompt, PromptResponseType.NONE);
+ }
+
+ /**
+ *
+ */
+ public TestPrompt(String prompt, PromptResponseType type) {
+ super();
+ this.prompt = 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;
+ }
+
+ 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/TestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java
new file mode 100644
index 00000000000..60e366569e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java
@@ -0,0 +1,737 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.requirement.RequirementId;
+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.IExecutionUnitManagement;
+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.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.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.ScriptLogHandler;
+import org.eclipse.osee.ote.core.log.record.AttentionRecord;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+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;
+
+/**
+ * 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(RequirementId) 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 IUserSession userSession;
+ private boolean isBatchable;
+ private final ITestStation testStation;
+ private CommandDescription cmdDescription;
+ protected TestCase currentTestCase;
+ protected final TestEnvironment environment;
+ private boolean isMpLevel;
+ private IScriptInitializer scriptInitializer;
+ private ScriptLogHandler scriptLogHandler;
+ private final ScriptTypeEnum scriptType;
+ private final ArrayList<TestCase> selectiveRunList = new ArrayList<TestCase>(32);
+ private Date startTime;
+ private final ArrayList<TestCase> testCases = new ArrayList<TestCase>(32);
+ private 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 ScriptResultRecord sciprtResultRecord;
+ private int pass;
+ private int fail;
+ private ScriptLoggingListener loggingListener;
+ private Executor promptInitWorker;
+ private ITestRunListenerProvider listenerProvider;
+
+ /*
+ * @param testManager
+ */
+ public TestScript(TestEnvironment environment, IUserSession callback, ScriptTypeEnum scriptType, boolean isBatchable) {
+ constructed.incrementAndGet();
+ this.scriptType = scriptType;
+ this.userSession = callback;
+ this.isBatchable = isBatchable;
+ this.isMpLevel = false;
+
+ promptInitWorker = Executors.newSingleThreadExecutor();
+ sciprtResultRecord = 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());
+ }
+
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.TestAccessor#getTestCase()
+ */
+ 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<TestCase>();
+ testCaseList.add(getSetupTestCase());
+ testCaseList.addAll(testCases);
+ testCaseList.add(getTearDownTestCase());
+ return testCaseList;
+ }
+
+ public ITestEnvironmentAccessor getTestEnvironment() {
+ return environment;
+ }
+
+ public IUserSession getUserSession() {
+ return userSession;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.TestAccessor#getTestScript()
+ */
+ 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 synchronized String prompt(final TestPrompt prompt) throws InterruptedException {
+
+ if (environment.isInBatchMode()) {
+ promptInitWorker.execute(new Runnable() {
+ public void run() {
+ try {
+ userSession.initiateInformationalPrompt(prompt.toString());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ if (prompt.getType() == PromptResponseType.PASS_FAIL) {
+ getLogger().log(
+ new TestPointRecord(environment, new CheckPoint(prompt.toString(), "PROMPT DURING BATCH", "N/A",
+ false), true));
+ } else {
+ getLogger().log(new AttentionRecord(environment, prompt.getType().name() + " : " + prompt.toString(), true));
+ }
+ return "";
+ } else {
+
+ try {
+ final String returnValue;
+ final TestRecord testRecord;
+ final IServiceConnector connector = environment.getConnector();
+ switch (prompt.getType()) {
+ case NONE:
+ InformationalPrompt infoPrompt = new InformationalPrompt(connector, "", prompt.toString());
+ infoPrompt.open(getUserSession(), promptInitWorker);
+ infoPrompt.close();
+ returnValue = "";
+ testRecord = null;
+ break;
+ case PASS_FAIL:
+ PassFailPromptImpl passFailPrompt = new PassFailPromptImpl(connector, this, "", prompt.toString());
+ PassFailPromptResult result = passFailPrompt.open(promptInitWorker);
+ returnValue = result.getText();
+ passFailPrompt.close();
+ testRecord =
+ new TestPointRecord(getTestEnvironment(), new CheckPoint("Pass/Fail Prompt", prompt.toString(),
+ returnValue, result.isPass()), true);
+ break;
+ case SCRIPT_PAUSE:
+ ScriptPausePromptImpl scriptPausePrompt =
+ new ScriptPausePromptImpl(connector, this, "", prompt.toString());
+ returnValue = scriptPausePrompt.open(promptInitWorker);
+ scriptPausePrompt.close();
+ testRecord =
+ new AttentionRecord(getTestEnvironment(),
+ PromptResponseType.SCRIPT_PAUSE.name() + " : " + prompt.toString(), true);
+ ;
+ break;
+ case USER_INPUT:
+ UserInputPromptImpl userInputPrompt = new UserInputPromptImpl(connector, this, "", prompt.toString());
+ returnValue = userInputPrompt.open(promptInitWorker);
+ userInputPrompt.close();
+ testRecord =
+ new AttentionRecord(getTestEnvironment(),
+ PromptResponseType.USER_INPUT.name() + " : " + prompt.toString(), true);
+ break;
+ case SCRIPT_STEP:
+ returnValue = "";
+ testRecord =
+ new AttentionRecord(getTestEnvironment(),
+ 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());
+ getLogger().log(testRecord);
+ }
+ return returnValue;
+ } catch (Exception e) {
+
+ }
+ return "";
+ }
+
+ }
+
+ /**
+ * This method will display a null prompt to the console.
+ *
+ * @throws InterruptedException
+ */
+ public void prompt() throws InterruptedException {
+ getTestScript().prompt(new TestPrompt(null, PromptResponseType.NONE));
+ }
+
+ /**
+ * This method will display the message input to the console.
+ *
+ * @param message
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param message
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param message
+ * @throws InterruptedException
+ */
+ public void promptPause(String message) throws InterruptedException {
+ prompt(new TestPrompt(message, PromptResponseType.SCRIPT_PAUSE));
+ }
+
+ /**
+ * Takes result of test point and updates the total test point tally.
+ *
+ * @param passed
+ * @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(Xmlizable xml) {
+ sciprtResultRecord.addChildElement(xml);
+ }
+
+ /**
+ * Add a single test case to selective run list.
+ *
+ * @param testCaseNumber
+ * @throws IllegalArgumentException
+ */
+ 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.
+ *
+ * @param testCaseNumberStart
+ * @param testCaseNumberEnd
+ */
+ public void selectTestCases(int testCaseNumberStart, int testCaseNumberEnd) {
+ for (int i = testCaseNumberStart; i <= testCaseNumberEnd; i++) {
+ selectTestCase(i);
+ }
+ }
+
+ /**
+ * Sets the script initializer.
+ *
+ * @param scriptInitializer
+ */
+ 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.
+ *
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ public synchronized void testWait(int milliseconds) throws InterruptedException {
+ 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 {
+ 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.
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param testCase
+ * @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;
+ }
+
+ public void logTestPoint(boolean isPassed, String testPointName, String expected, String actual) {
+ this.getLogger().testpoint(this.getTestEnvironment(), this, this.getTestCase(), isPassed, testPointName,
+ expected, actual);
+ }
+
+ public boolean isTimedOut() {
+ return this.timedOut;
+ }
+
+ 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");
+ }
+
+ 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;
+ }
+
+ 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);
+ }
+ }
+ }
+
+ /**
+ * @param listenerProvider
+ */
+ public void setListenerProvider(ITestRunListenerProvider listenerProvider) {
+ this.listenerProvider = listenerProvider;
+ }
+
+ public boolean addTestRunListener(ITestRunListener listener) {
+ return this.listenerProvider.addTestRunListener(listener);
+ }
+
+ public boolean removeTestRunListener(ITestRunListener listener) {
+ return this.listenerProvider.removeTestRunListener(listener);
+ }
+
+ /**
+ * @return
+ */
+ public int getPasses() {
+ return pass;
+ }
+
+ /**
+ * @return
+ */
+ public int getFails() {
+ return fail;
+ }
+
+ @Deprecated
+ public ScriptResultRecord getScriptResultRecord() {
+ return this.sciprtResultRecord;
+ }
+
+ /**
+ * @return
+ */
+ public ScriptLogHandler getScriptLogHandler() {
+ return this.scriptLogHandler;
+ }
+
+ /**
+ * @param b
+ */
+ public void setAborted(boolean aborted) {
+ this.aborted = aborted;
+ }
+
+ /**
+ * @param currentTestCase the currentTestCase to set
+ */
+ void setTestCase(TestCase currentTestCase) {
+ this.currentTestCase = currentTestCase;
+ }
+
+ /**
+ * @return
+ */
+ 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 00000000000..7202e86efaf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.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;
+
+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"));
+ }
+ public Pattern bundleId() {
+ return null;
+ }
+
+ public Level getLoggerLevel() {
+ return level;
+ }
+
+ 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 00000000000..a7618d51a90
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.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.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((int) 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;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Command.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Command.java
new file mode 100644
index 00000000000..6aef6dd8821
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Command.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 Command {
+ Source getSource();
+ CommandId getId();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributer.java
new file mode 100644
index 00000000000..ce86906d87e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributer.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.cmd;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface CommandDistributer {
+ void distribute(Command command);
+ void registerHandler(CommandHandler commandHandler);
+ void unregisterHandler(CommandHandler commandHandler);
+ void shutdown();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributerImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributerImpl.java
new file mode 100644
index 00000000000..2a79ea6afae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandDistributerImpl.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.cmd;
+
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class CommandDistributerImpl implements CommandDistributer {
+ private final ExecutorService executor = Executors.newSingleThreadExecutor();
+ private final Set<CommandHandler> handlers = new CopyOnWriteArraySet<CommandHandler>();
+
+ public CommandDistributerImpl(){
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.cmd.CommandDistributer#distribute(org.eclipse.osee.ote.core.cmd.Command)
+ */
+ public void distribute(final Command command) {
+ executor.submit(new Runnable() {
+
+ public void run() {
+ for(CommandHandler handler:handlers){
+ try {
+ if(handler.canHandle(command.getId())){
+ handler.handle(command);
+ }
+ } catch (RuntimeException e) {
+ OseeLog.log(CommandDistributerImpl.class, Level.SEVERE, "Eception in handler for " + command.getId().toString(), e);
+ }
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.cmd.CommandDistributer#registerHandler(org.eclipse.osee.ote.core.cmd.CommandHandler)
+ */
+ public void registerHandler(CommandHandler commandHandler) {
+ handlers.add(commandHandler);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.cmd.CommandDistributer#unregisterHandler(org.eclipse.osee.ote.core.cmd.CommandHandler)
+ */
+ public void unregisterHandler(CommandHandler commandHandler) {
+ handlers.remove(commandHandler);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.cmd.CommandDistributer#shutdown()
+ */
+ public void shutdown() {
+ OseeLog.log(CommandDistributerImpl.class, Level.INFO, "Command distributor shutting down...");
+ handlers.clear();
+ executor.shutdown();
+ try {
+ executor.awaitTermination(30000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException ex) {
+ OseeLog.log(CommandDistributerImpl.class, Level.WARNING, "Interrupted while shutting down command distributor", ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandHandler.java
new file mode 100644
index 00000000000..a00402c55b0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandHandler.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.cmd;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface CommandHandler {
+ void handle(Command cmd);
+ boolean canHandle(CommandId id);
+}
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 00000000000..a2a3d737efe
--- /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 00000000000..6229c1b753d
--- /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 00000000000..51f534b2d59
--- /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/PropertyStoreCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/PropertyStoreCommand.java
new file mode 100644
index 00000000000..82fee788cc7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/PropertyStoreCommand.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.cmd;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class PropertyStoreCommand implements Command, Serializable {
+
+ private static final long serialVersionUID = 7685494212621558501L;
+
+ private CommandId commandId;
+ private Source source;
+ private IPropertyStore store;
+
+ public PropertyStoreCommand(CommandId commandId, Source source){
+ this.commandId = commandId;
+ this.source = source;
+ store = new PropertyStore("org.eclipse.osee.ote.core.cmd.PropertyStoreCommand");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.cmd.Command#getId()
+ */
+ public CommandId getId() {
+ return commandId;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.cmd.Command#getSource()
+ */
+ public Source getSource() {
+ return source;
+ }
+
+ public IPropertyStore getPropertyStore(){
+ return store;
+ }
+
+}
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 00000000000..d73c224c7f8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.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.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 00000000000..54abfdcc6a8
--- /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 Namespace namespace;
+ private 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;
+ }
+
+ public Name getName() {
+ return name;
+ }
+
+ 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 00000000000..42e80e71cb0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.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.cmd;
+
+import java.io.Serializable;
+
+public class StringName implements Name, Serializable {
+ private static final long serialVersionUID = -7215226960243262972L;
+ private 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 00000000000..8934bead46e
--- /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 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 00000000000..69f3171f6ea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.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.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 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 00000000000..9e8d0ec2234
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.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.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;
+
+}
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 00000000000..da2ae2b2735
--- /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 00000000000..0acf565009d
--- /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 00000000000..3a037bea1c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.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.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 00000000000..4826f1aa572
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.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.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 LinkedList<Runnable> jobs;
+ private static WeakHashMap<Object, AsynchRemoteJobs> map = new WeakHashMap<Object, AsynchRemoteJobs>();
+
+ 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<Runnable>();
+ 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();
+ }
+ }
+
+ 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/BasicEnv.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BasicEnv.java
new file mode 100644
index 00000000000..b85ae778c7b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BasicEnv.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;
+
+import org.eclipse.osee.ote.core.OseeTestThread;
+import org.eclipse.osee.ote.core.TestException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class BasicEnv extends OseeTestThread {
+
+ /**
+ * @param name
+ * @param env
+ */
+ public BasicEnv(String name, TestEnvironment env) {
+ super(name, env);
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.OseeTestThread#run()
+ */
+ protected void run() throws TestException {
+ getEnvironment().run();
+ }
+
+}
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 00000000000..10ac56d5f70
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.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.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 byte[] 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, byte[] 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 byte[] getMd5Digest() {
+ return md5Digest;
+ }
+}
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 00000000000..bbdea4f85ca
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.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.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;
+
+ /**
+ * @param message
+ * @param bundleExceptions
+ */
+ public BundleResolveException(String message, Collection<BundleException> bundleExceptions) {
+ super(message);
+ this.bundleExceptions = bundleExceptions;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Throwable#toString()
+ */
+ @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 00000000000..9bdc976b32a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.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;
+
+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;
+ }
+
+ public void run() {
+ try {
+ callback.initiateInformationalPrompt(message);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+}
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 00000000000..48a0a3e21a3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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 double hzRate;
+ private int phase;
+ private 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;
+ }
+
+ 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 00000000000..c699bd2ceaa
--- /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 00000000000..e24594f02c3
--- /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/OteEnvironmentTrackerCustomizer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteEnvironmentTrackerCustomizer.java
new file mode 100644
index 00000000000..a1585ca3203
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteEnvironmentTrackerCustomizer.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.environment;
+
+import org.eclipse.osee.framework.messaging.EndpointReceive;
+import org.eclipse.osee.framework.messaging.EndpointSend;
+import org.eclipse.osee.framework.messaging.MessagingGateway;
+import org.eclipse.osee.framework.messaging.id.ProtocolId;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OteEnvironmentTrackerCustomizer implements ServiceTrackerCustomizer {
+
+ private EndpointReceive receive;
+ private EndpointSend send;
+ private BundleContext context;
+ private ProtocolId protocolId;
+
+ public OteEnvironmentTrackerCustomizer(BundleContext context, EndpointReceive receive, EndpointSend send, ProtocolId protocolId){
+ this.context = context;
+ this.receive = receive;
+ this.send = send;
+ this.protocolId = protocolId;
+ }
+
+ public Object addingService(ServiceReference reference) {
+ MessagingGateway gateway = (MessagingGateway)context.getService(reference);
+ gateway.bind(receive);
+ gateway.bind(send);
+ gateway.bindSendProtocol(protocolId, send);
+ return null;
+ }
+
+ public void modifiedService(ServiceReference reference, Object service) {
+ }
+
+ public void removedService(ServiceReference reference, Object service) {
+ MessagingGateway gateway = (MessagingGateway)context.getService(reference);
+ gateway.unbind(receive);
+ gateway.unbindSendProtocol(protocolId, send);
+ gateway.unbind(send);
+ }
+}
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 00000000000..ad003c31e4e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.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.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 FileOutputStream fos;
+ private StringBuilder sb;
+ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+ public OteLogFile(File file) throws FileNotFoundException{
+ fos = new FileOutputStream(file);
+ sb = new StringBuilder();
+ }
+
+ 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/OteServerSideEndpointSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndpointSender.java
new file mode 100644
index 00000000000..21253821583
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndpointSender.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.environment;
+
+import java.util.Properties;
+import org.eclipse.osee.framework.messaging.EndpointSend;
+import org.eclipse.osee.framework.messaging.ExceptionHandler;
+import org.eclipse.osee.framework.messaging.Message;
+import org.eclipse.osee.framework.messaging.id.ProtocolId;
+import org.eclipse.osee.framework.messaging.id.StringName;
+import org.eclipse.osee.framework.messaging.id.StringNamespace;
+import org.eclipse.osee.framework.messaging.id.StringProtocolId;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteServerSideEndpointSender implements EndpointSend {
+
+ public static final ProtocolId OTE_SERVER_SIDE_SEND_PROTOCOL = new StringProtocolId(new StringNamespace("org.eclipse.osee.ote.core.environment"), new StringName("OteServerSideEndpointSender"));
+
+ private TestEnvironment testEnvironment;
+
+ public OteServerSideEndpointSender(TestEnvironment testEnvironment) {
+ this.testEnvironment = testEnvironment;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointSend#send(org.eclipse.osee.framework.messaging.Message, org.eclipse.osee.framework.messaging.ExceptionHandler)
+ */
+ public void send(Message message, ExceptionHandler exceptionHandler) {
+ try{
+ for(IUserSession session : testEnvironment.getUserSessions()){
+ session.sendMessageToClient(message);
+ }
+ } catch(Throwable th){
+ exceptionHandler.handleException(th);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointSend#start(java.util.Properties)
+ */
+ public void start(Properties properties) {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndprointRecieve.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndprointRecieve.java
new file mode 100644
index 00000000000..9f93d811e6c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteServerSideEndprointRecieve.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;
+
+import java.util.Properties;
+import org.eclipse.osee.framework.messaging.EndpointReceive;
+import org.eclipse.osee.framework.messaging.Message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OteServerSideEndprointRecieve extends EndpointReceive {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointReceive#start(java.util.Properties)
+ */
+ public void start(Properties properties) {
+ }
+
+ /**
+ * @param message
+ */
+ public void recievedMessage(Message message) {
+ onReceive(message);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.messaging.EndpointReceive#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+}
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 00000000000..c611591fa0d
--- /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 ReportData queueData;
+ // private ArrayList<ReportDataListener> queueListeners;
+ private ArrayList<ReportDataListener> queueListeners;
+
+ public ReportDataControl() {
+ this.queueListeners = new ArrayList<ReportDataListener>();
+ // ArrayList<String> queueHeaders = new ArrayList<String>();
+ ArrayList<String> queueHeaders = new ArrayList<String>();
+ queueHeaders.add("User");
+ queueHeaders.add("Script");
+ this.queueData = new ReportData(queueHeaders);
+ }
+
+ @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);
+ }
+ }
+
+ public void removeQueueListener(ReportDataListener listener) {
+ queueListeners.remove(listener);
+ }
+
+ @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 = (TestEnvironmentCommand) cmds.get(i);
+ values = new ArrayList<String>();
+ values.add((cmd.getUser() == null) ? "unknown" : cmd.getUser().getName());
+ 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 00000000000..2ab0026e131
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.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.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(){
+ }
+
+ public boolean isLocked(){
+ return false;
+ }
+
+ public boolean isExecutionUnitPaused() {
+ return isOfpPaused;
+ }
+
+ public boolean isScriptPaused() {
+ return isScriptPaused;
+ }
+
+ public boolean isScriptReady() {
+ return isScriptReady;
+ }
+
+
+ public void lock(){
+ }
+
+ public void setExecutionUnitPause(boolean pause) {
+ isOfpPaused = pause;
+ }
+
+ public void setScriptPause(boolean pause) {
+ isScriptPaused = pause;
+ }
+
+ public void setScriptReady(boolean ready){
+ isScriptReady = ready;
+ }
+
+ public boolean shouldStep(){
+ return (isScriptPaused() && !isExecutionUnitPaused());
+ }
+
+ public void unlock(){
+ }
+
+ public boolean hasLock(){
+ return false;
+ }
+
+ 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 00000000000..73eef452a14
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
@@ -0,0 +1,745 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.io.Serializable;
+import java.net.InetAddress;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.text.SimpleDateFormat;
+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.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+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.framework.messaging.Message;
+import org.eclipse.osee.framework.messaging.MessagingGateway;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+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.cmd.Command;
+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.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class TestEnvironment implements TestEnvironmentInterface, ITestEnvironmentAccessor, Runnable, ITestContext {
+
+ private final List<ITestEnvironmentListener> envListeners = new ArrayList<ITestEnvironmentListener>(32);
+ private IExecutionUnitManagement executionUnitManagement;
+ private volatile boolean done;
+ private OseeTestThread myThread;
+ private File outDir = null;
+ private ITestStation testStation;
+ private HashMap<Serializable, Object> users;
+ private volatile IUserSession activeUser = null;
+ private boolean batchMode = false;
+ private OteLogFile oteLog;
+ private final HashMap<String, Remote> controlInterfaces = new HashMap<String, Remote>();
+ private IEnvironmentFactory factory;
+ private IServiceConnector connector;
+ private final IRuntimeLibraryManager runtimeManager;
+
+
+ @Deprecated
+ private HashMap<Class<?>, Object> associatedObjects;
+ @Deprecated
+ private HashMap<Class<?>, ArrayList<IAssociatedObjectListener>> associatedObjectListeners;
+ @Deprecated
+ private boolean isEnvSetup = false;
+ @Deprecated
+ private List<IScriptCompleteEvent> scriptCompleteListeners = new ArrayList<IScriptCompleteEvent>();
+ @Deprecated
+ private List<IScriptSetupEvent> scriptSetupListeners = new ArrayList<IScriptSetupEvent>();
+
+ private OteServerSideEndprointRecieve oteServerSideEndpointRecieve;
+ private OteServerSideEndpointSender oteServerSideEndpointSender;
+ private ServiceTracker messagingServiceTracker;
+ ExecutorService execInitializationTasks;
+ LinkedBlockingQueue<Future> listOfThreadsToWaitOnInInit = new LinkedBlockingQueue<Future>();
+
+ protected TestEnvironment(IEnvironmentFactory factory) {
+ GCHelper.getGCHelper().addRefWatch(this);
+ execInitializationTasks = Executors.newCachedThreadPool();
+ this.factory = factory;
+ this.testStation = factory.getTestStation();
+ this.runtimeManager = factory.getRuntimeManager();
+ this.runtimeManager.addRuntimeLibraryListener(Activator.getInstance());
+
+ this.associatedObjectListeners = new HashMap<Class<?>, ArrayList<IAssociatedObjectListener>>();
+ this.associatedObjects = new HashMap<Class<?>, Object>(100);
+ this.batchMode = OteProperties.isOseeOteInBatchModeEnabled();
+ this.myThread = new BasicEnv("Test Environment Thread", this);
+ this.users = new HashMap<Serializable, Object>(32);
+
+ messagingServiceTracker = setupOteMessagingSenderAndReceiver();
+
+ setupOteServerLogFile();
+ }
+
+ public void init(IServiceConnector connector){
+ this.connector = connector;
+ initializationThreadAdd(new Callable(){
+ public Object call() throws Exception {
+ Activator.getInstance().registerTestEnvironment(TestEnvironment.this);
+ return null;
+ }
+ });
+ waitForWorkerThreadsToComplete();
+ }
+
+ public void waitForWorkerThreadsToComplete(){
+ while(!listOfThreadsToWaitOnInInit.isEmpty()){
+ Future future = listOfThreadsToWaitOnInInit.poll();
+ try {
+ future.get();
+ } catch (InterruptedException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+ } catch (ExecutionException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ }
+
+ public void initializationThreadAdd(Callable callable){
+ listOfThreadsToWaitOnInInit.add(execInitializationTasks.submit(callable));
+ }
+
+ /**
+ *
+ */
+ 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", System.getProperty("user.name"));
+ connector = new LocalConnector(this, props);
+ }
+
+ private void setupOteServerLogFile(){
+ try {
+ String saveFile = OteProperties.getOseeOteLogFilePath();
+ if (!Strings.isValid(saveFile)) {
+ saveFile = System.getProperty("user.home" + File.pathSeparator + "osee_log");
+ }
+ if (saveFile == null) {
+ saveFile = System.getProperty("user.home");
+ }
+
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH_mm_ss");
+ saveFile =
+ String.format("%s%s%s_%s_%s.xml", saveFile, System.getProperty("file.separator"),
+ InetAddress.getLocalHost().getHostName(), System.getProperty("user.name"), sdf.format(new Date()));
+ oteLog = new OteLogFile(new File(saveFile));
+ OseeLog.registerLoggerListener(oteLog);
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ 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 sendCommand(Command command){
+ Activator.getInstance().getCommandDistributer().distribute(command);
+ }
+
+ public void sendMessageToServer(Message message){
+ oteServerSideEndpointRecieve.recievedMessage(message);
+ }
+
+ public ServiceTracker getServiceTracker(String clazz, ServiceTrackerCustomizer customizer){
+ return Activator.getInstance().getServiceTracker(clazz, customizer);
+ }
+
+ public ServiceTracker getServiceTracker(String clazz){
+ return getServiceTracker(clazz, null);
+ }
+
+ public ICommandHandle addCommand(ITestServerCommand cmd) throws ExportException {
+ return factory.getCommandManager().addCommand(cmd, this);
+ }
+
+ public IRunManager getRunManager() {
+ return factory.getRunManager();
+ }
+
+ public IRuntimeLibraryManager getRuntimeManager(){
+ return this.runtimeManager;
+ }
+
+ public IEnvironmentFactory getEnvironmentFactory(){
+ return factory;
+ }
+
+ public boolean isInBatchMode() {
+ return batchMode;
+ }
+
+ public void setBatchMode(boolean isInBatchMode) {
+ if (!OteProperties.isOseeOteInBatchModeEnabled()) {
+ this.batchMode = isInBatchMode;
+ }
+ }
+
+ public void addEnvironmentListener(ITestEnvironmentListener listener) {
+ envListeners.add(listener);
+ }
+
+ public boolean addTask(EnvironmentTask task) {
+ factory.getTimerControl().addTask(task, this);
+ return true;
+ }
+
+ public UserTestSessionKey addUser(IUserSession user) throws Exception {
+ UserTestSessionKey key = new UserTestSessionKey(user.getUser());
+ users.put(key, user);
+ return key;
+ }
+
+ public boolean equals(ITestEnvironment testEnvironment) throws RemoteException {
+ if (testEnvironment.getUniqueId() == getUniqueId()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public long getEnvTime() {
+ return getTimerCtrl().getEnvTime();
+ }
+
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return this.executionUnitManagement;
+ }
+
+ public ITestLogger getLogger() {
+ return factory.getTestLogger();
+ }
+
+ public List<String> getQueueLabels() {
+ List<String> list = new ArrayList<String>();
+ list.add("Description");
+ return list;
+ }
+
+ public abstract Object getModel(String modelClassName);
+
+ /*
+ * public Remote getRemoteModel(String modelClassName) throws RemoteException { return
+ * getRemoteModel(modelClassName, new Class[] {}, new Object[] {}); }
+ */
+
+ public IScriptControl getScriptCtrl() {
+ return factory.getScriptControl();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.environment.jini.TestEnvironment#getScriptOutfile(java.lang.String)
+ */
+ 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);
+ }
+ }
+
+ public ITestStation getTestStation() {
+ return testStation;
+ }
+
+ public ITimerControl getTimerCtrl() {
+ return factory.getTimerControl();
+ }
+
+ public int getUniqueId() {
+ return this.hashCode();
+ }
+
+ public ArrayList<Serializable> getUserList() {
+ return new ArrayList<Serializable>(getSessionKeys());
+ }
+
+ public void disconnect(final UserTestSessionKey key) throws RemoteException {
+ try {
+ OseeLog.log(TestEnvironment.class, Level.INFO,
+ "Disconnecting user " + getUserSession(key).getUser().getName());
+ } catch (Exception ex) {
+ OseeLog.log(TestEnvironment.class, Level.INFO,
+ "problem with accessing user name from the useer session");
+ }
+ users.remove(key);
+ }
+
+ public Set<Serializable> getSessionKeys() {
+ return users.keySet();
+ }
+
+ public IUserSession getUserSession(final UserTestSessionKey key) {
+ return (IUserSession) users.get(key);
+ }
+
+ private final void removeAllTasks() {
+ factory.getTimerControl().cancelAllTasks();
+ }
+
+ public void removeUser(OSEEPerson1_4 user) {
+ if (users.containsKey(user)) {
+ users.put(user, new Integer((((Integer) users.get(user)).intValue()) - 1));
+ if (((Integer) users.get(user)).intValue() == 0) {
+ users.remove(user);
+ }
+ }
+ }
+
+ public void run() {
+ while (!done) {
+ step();
+ }
+ OseeLog.log(TestEnvironment.class, Level.FINE,
+ "Test Environment has shutdown");
+ }
+
+ public URL setBatchLibJar(byte[] batchJar) throws IOException {
+ String path = System.getProperty("user.home") + 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();
+ }
+
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return getTimerCtrl().setTimerFor(listener, time);
+ }
+
+ protected void setupOutfileDir(String outfileDir) throws IOException {
+ if (outfileDir != null && !outfileDir.equals("")) {
+ outDir = new File(outfileDir);
+ if (!outDir.isDirectory()) {
+ if (!outDir.mkdirs()) {
+ throw new IOException("Failed to create the output directory");
+ }
+ OseeLog.log(TestEnvironment.class, Level.INFO,
+ String.format("Outfile Dir [%s] created.", outDir.getAbsolutePath()));
+ } else {
+ OseeLog.log(TestEnvironment.class, Level.FINE,
+ String.format("Outfile Dir [%s] exists.", outDir.getAbsolutePath()));
+ }
+ } else {
+ throw new IOException("A valid outfile directory must be specified.");
+ }
+ }
+
+ public void shutdown() {
+ runtimeManager.cleanup();
+ 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) {
+ listener.onEnvironmentKilled(this);
+ }
+ envListeners.clear();
+ if (getRunManager() != null) {
+ getRunManager().clearAllListeners();
+ }
+ users.clear();
+ }
+
+ 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 (!this.myThread.isAlive()) {
+ myThread.start();
+ } else {
+ System.out.println("Why is start getting called twice??????????????????");
+ }
+ }
+
+ protected abstract void step();
+
+ protected void stop() {
+ done = true;
+ }
+
+ public IUserSession getActiveUser() {
+ return activeUser;
+ }
+
+ public File getClientResource(String workspacePath) throws Exception, IOException {
+ if (activeUser == null) {
+ throw new IllegalStateException("No active user");
+ }
+ String version = activeUser.getFileVersion(workspacePath);
+ File resource = getResourceFile(workspacePath, version);
+ if (!resource.exists()) {
+ byte[] bytes = activeUser.getFile(workspacePath);
+ if (bytes != null) {
+ Lib.writeBytesToFile(bytes, resource);
+ }
+ }
+ return resource;
+ }
+
+ private File getResourceDir() {
+ File file =
+ new File(
+ System.getProperty("java.io.tmpdir") + File.separator + System.getProperty("user.name") + File.separator + "oseeresources");
+ file.mkdirs();
+ return file;
+ }
+
+ private File getResourceFile(String workspacePath, String version) {
+ String filename = workspacePath.replace("/", "_");
+ int extension = filename.lastIndexOf('.');
+ filename = filename.substring(0, extension - 1) + version.toUpperCase() + filename.substring(extension);
+ return new File(getResourceDir(), filename);
+ }
+
+ public void setActiveUser(UserTestSessionKey key) {
+ activeUser = (IUserSession) users.get(key);
+ }
+
+ 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();
+ }
+ if (executionUnitManagement != null) {
+ try{
+ executionUnitManagement.dispose();
+ } catch (Throwable th){
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, th);
+ }
+ }
+ 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;
+ }
+
+ public File getOutDir() {
+ return outDir;
+ }
+
+ public List<IUserSession> getUserSessions() {
+ List<IUserSession> people = new ArrayList<IUserSession>();
+ for (Object user : users.values()) {
+ if (user instanceof IUserSession) {
+ people.add((IUserSession) user);
+ }
+ }
+ return people;
+ }
+
+ public Remote getControlInterface(String id) {
+ return controlInterfaces.get(id);
+ }
+
+ public void registerControlInterface(String id, Remote controlInterface) {
+ controlInterfaces.put(id, controlInterface);
+ }
+
+ public IServiceConnector getConnector() {
+ return connector;
+ }
+
+// public void setConnector(IServiceConnector connector) {
+// this.connector = connector;
+// }
+
+ public void setupClassLoaderAndJar(String[] jarVersions, String classPath) throws Exception {
+ setupClassLoaderAndJar(jarVersions, new String[] {classPath});
+ }
+
+ public void setupClassLoaderAndJar(String[] jarVersions, String[] classPaths) throws Exception {
+ getRuntimeManager().setupClassLoaderAndJar(jarVersions, classPaths);
+ }
+
+ @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
+ *
+ * @param t
+ * @param logLevel
+ */
+ public void handleException(Throwable t, Level logLevel) {
+ handleException(t, "An exception has occurred in the environment", logLevel, true);
+ }
+
+ @Deprecated
+ /**
+ * @param t
+ * @param logLevel
+ * @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();
+ }
+ }
+ }
+
+ @Deprecated
+ /**
+ * marks the script as ready as well as clears any objects that are associated with the environment.
+ */
+ public synchronized void onScriptSetup() {
+ factory.getScriptControl().setScriptReady(true);
+
+ for (IScriptSetupEvent listeners : scriptSetupListeners) {
+ listeners.scriptSetup();
+ }
+
+ this.associatedObjects.clear();
+ }
+
+ @Deprecated
+ public void removeQueueListener(ReportDataListener listener) throws RemoteException {
+ factory.getReportDataControl().removeQueueListener(listener);
+ }
+
+ @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)
+ removeAllTasks();
+ if (associatedObjects != null) {
+ this.associatedObjects.clear();// get rid of all models and support
+ }
+ }
+
+ @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 {
+ ((IAssociatedObjectListener) listeners.get(i)).updateAssociatedListener();
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class,
+ Level.SEVERE, e.getMessage(), e);
+ }
+
+ }
+ }
+ }
+
+ @Deprecated
+ public Object getAssociatedObject(Class<?> c) {
+ return associatedObjects.get(c);
+ }
+
+ @Deprecated
+ public Set<Class<?>> getAssociatedObjects() {
+ return associatedObjects.keySet();
+ }
+
+ @Deprecated
+ /**
+ * Use getRunManager().getCurrentScript() instead of this method.
+ */
+ public TestScript getTestScript() {
+ return getRunManager().getCurrentScript();
+ }
+
+ @Deprecated
+ public void abortTestScript() {
+ getRunManager().abort();
+ }
+
+ @Deprecated
+ public void abortTestScript(Throwable t) {
+ getRunManager().abort(t, false);
+ }
+}
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 00000000000..bc40c53bf1b
--- /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 00000000000..04b425d8b68
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.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.environment;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.net.URL;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+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 UserTestSessionKey addUser(IUserSession user) throws Exception;
+ 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 ArrayList<Serializable> getUserList() ;
+ public void disconnect(final UserTestSessionKey key) throws RemoteException ;
+ public Set<Serializable> getSessionKeys() ;
+ public IUserSession getUserSession(final UserTestSessionKey key) ;
+ public void removeUser(OSEEPerson1_4 user) ;
+ public URL setBatchLibJar(byte[] batchJar) throws IOException ;
+ public ICancelTimer setTimerFor(ITimeout listener, int time) ;
+ public void shutdown() ;
+ public IUserSession getActiveUser() ;
+ public File getClientResource(String workspacePath) throws Exception, IOException ;
+ public void setActiveUser(UserTestSessionKey key) ;
+ public File getOutDir() ;
+ public List<IUserSession> getUserSessions() ;
+ public Remote getControlInterface(String id) ;
+ public void registerControlInterface(String id, Remote controlInterface) ;
+ public IServiceConnector getConnector() ;
+ public void setupClassLoaderAndJar(String[] jarVersions, String classPath) throws Exception ;
+ public void setupClassLoaderAndJar(String[] jarVersions, String[] classPaths) throws Exception ;
+ public IEnvironmentFactory getEnvironmentFactory();
+ public void initializationThreadAdd(Callable callable);
+}
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 00000000000..5cbbae6ec9b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.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 java.util.logging.Level;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+
+public class TestEnvironmentLogFilter implements ILoggerFilter {
+ private static Level level;
+ static {
+ level = Level.parse(System.getProperty("ote.testenv.filter.level", "INFO"));
+ }
+ public Pattern bundleId() {
+ return null;
+ }
+
+ public Level getLoggerLevel() {
+ return level;
+ }
+
+ 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 00000000000..5992f05fd39
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.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;
+
+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);
+ }
+
+ protected String[] getStringTable() {
+ return stringTable;
+ }
+
+ 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 00000000000..6e80700b148
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.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;
+
+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;
+
+public abstract class TimerControl implements ITimerControl{
+
+ private final ScheduledExecutorService executor;
+
+ public TimerControl(int maxTimers){
+ executor = Executors.newScheduledThreadPool(maxTimers);
+ }
+
+ 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);
+ }
+
+ 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();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/UserTestSessionKey.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/UserTestSessionKey.java
new file mode 100644
index 00000000000..3c9d636dc10
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/UserTestSessionKey.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;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+
+
+public final class UserTestSessionKey implements Serializable{
+
+ private static final long serialVersionUID = -1445868944158880309L;
+
+ private final long value;
+ private final OSEEPerson1_4 user;
+
+ public UserTestSessionKey(OSEEPerson1_4 user) {
+ this.user = user;
+ value = System.nanoTime();
+ }
+
+ long getKeyValue() {
+ return value;
+ }
+
+ public boolean equals(Object obj) {
+ if (obj instanceof UserTestSessionKey) {
+ final UserTestSessionKey other = (UserTestSessionKey) obj;
+ return other.value == this.value;
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return (int) (value ^ (value >>> 32));
+ }
+
+ public OSEEPerson1_4 getUser() {
+ return user;
+ }
+}
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 00000000000..e693c1698b9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.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.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 GUID guid;
+ protected final String description;
+
+ /**
+ * CommandDescription Constructor. Sets the command's description.
+ *
+ * @param description
+ */
+ public CommandDescription(String description) {
+ super();
+ guid = new GUID();
+ this.description = description;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ 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 GUID getGuid() {
+ return guid;
+ }
+
+ 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 00000000000..3a31791298c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.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.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 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 00000000000..a20fabb0bb3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.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.core.environment.command;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+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 final UserTestSessionKey key;
+ private final CommandDescription commandDescription;
+
+ /**
+ * @param callback
+ */
+ public TestEnvironmentCommand(UserTestSessionKey key, CommandDescription commandDescription) {
+ this.key = key;
+ this.commandDescription = commandDescription;
+ }
+
+ public UserTestSessionKey getUserKey() {
+ return key;
+ }
+
+ public void executeBase(TestEnvironment environment) {
+ execute(environment);
+ }
+
+ /* (non-Javadoc)
+ * @see net.jini.service.interfaces.IServiceCommand#execute(net.jini.service.interfaces.IService)
+ */
+ public abstract void execute(TestEnvironment environment) throws TestException;
+
+ /**
+ *
+ */
+ public CommandDescription getDescription() {
+ return commandDescription;
+ }
+
+ public OSEEPerson1_4 getUser() {
+ return key.getUser();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/package.html
new file mode 100644
index 00000000000..56dd841ef02
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/package.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides commands the test client will use to control the test enviornment.
+
+
+<h2>Related Documentation</h2>
+
+For overviews, tutorials, examples, guides, and tool documentation, please see:
+<ul>
+ <li>Refer to the OSEE Team generated information included in the eclipse help subsystem.
+ <li><a href="http://java.sun.com/docs/white/langenv/index.html">White Paper - The Java Language Enviornment.</a>
+ <li><a href="http://java.sun.com/docs/books/tutorial/java/index.html">Trail - Learning The Java Language.</a>
+</ul>
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ 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 00000000000..b6d98d8ed21
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ScriptVersionConfig implements Xmlizable, Serializable {
+
+ private static final long serialVersionUID = -4021198751318075600L;
+ private String repositoryType;
+ private String location;
+ private String revision;
+ private String lastAuthor;
+ private String lastModificationDate;
+ private String modifiedFlag;
+
+ public ScriptVersionConfig() {
+ repositoryType = "UNKNOWN";
+ location = "-";
+ revision = "-";
+ lastAuthor = "-";
+ lastModificationDate = "-";
+ modifiedFlag = "-";
+ }
+
+ public ScriptVersionConfig(String repositoryType,
+ String location,
+ String revision,
+ String lastAuthor,
+ String lastModificationDate,
+ String modifiedFlag) {
+ this.repositoryType =repositoryType;
+ this.location =location;
+ this.revision = revision;
+ this.lastAuthor = lastAuthor;
+ this.lastModificationDate = lastModificationDate;
+ this.modifiedFlag = modifiedFlag;
+ }
+
+ /**
+ * @return the location
+ */
+ public String getLocation() {
+ return location;
+ }
+
+ /**
+ * @param location the location to set
+ */
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ /**
+ * @return the repositoryType
+ */
+ public String getRepositoryType() {
+ return repositoryType;
+ }
+
+ /**
+ * @param repositoryType the repositoryType to set
+ */
+ public void setRepositoryType(String repositoryType) {
+ this.repositoryType = repositoryType;
+ }
+
+ /**
+ * @return the revision
+ */
+ public String getRevision() {
+ return revision;
+ }
+
+ /**
+ * @param revision the revision to set
+ */
+ public void setRevision(String revision) {
+ this.revision = revision;
+ }
+
+ /**
+ * @return the lastAuthor
+ */
+ public String getLastAuthor() {
+ return lastAuthor;
+ }
+
+ /**
+ * @param lastAuthor the lastAuthor to set
+ */
+ public void setLastAuthor(String lastAuthor) {
+ this.lastAuthor = lastAuthor;
+ }
+
+ /**
+ * @return the lastDateModified
+ */
+ public String getLastModificationDate() {
+ return lastModificationDate;
+ }
+
+ /**
+ * @param lastModified the lastModified to set
+ */
+ public void setLastModificationDate(String lastModificationDate) {
+ this.lastModificationDate = lastModificationDate;
+ }
+
+ /**
+ * @return the modifiedFlag
+ */
+ public String getModifiedFlag() {
+ return modifiedFlag;
+ }
+
+ /**
+ * @param modifiedFlag the modifiedFlag to set
+ */
+ public void setModifiedFlag(String modifiedFlag) {
+ this.modifiedFlag = modifiedFlag;
+ }
+
+ public Element toXml(Document doc) {
+ Element scriptVersion = doc.createElement(BaseTestTags.SCRIPT_VERSION);
+ scriptVersion.setAttribute(BaseTestTags.REVISION_FIELD, getRevision());
+ 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;
+ }
+
+}
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 00000000000..b78e0a58ae9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.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.environment.config;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestScriptConfig implements Serializable {
+
+ private static final long serialVersionUID = 6791547338404192517L;
+ private String outFile;
+ private String fullScriptName;
+ private String[] classPathStrs;
+ private String cppExePath;
+ private boolean isExe;
+ private 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 String getCppExePath() {
+ return cppExePath;
+ }
+
+ 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 00000000000..bc41f61dff5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.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.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;
+ }
+
+ 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/config/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/package.html
new file mode 100644
index 00000000000..fa1c6efe3f6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/package.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides for configuration of the test enviornment.
+
+
+<h2>Related Documentation</h2>
+
+For overviews, tutorials, examples, guides, and tool documentation, please see:
+<ul>
+ <li>Refer to the OSEE Team generated information included in the eclipse help subsystem.
+ <li><a href="http://java.sun.com/docs/white/langenv/index.html">White Paper - The Java Language Enviornment.</a>
+ <li><a href="http://java.sun.com/docs/books/tutorial/java/index.html">Trail - Learning The Java Language.</a>
+</ul>
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
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 00000000000..9842b614d8b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.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.core.environment.console;
+
+import java.util.regex.Pattern;
+
+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 (args != null && !args.equals("")) {
+ argArray = SPLITTER.split(args);
+ } else {
+ argArray = new String[0];
+ }
+ final String[] switchesArray;
+ if (switches != null && !switches.equals("")) {
+ 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 00000000000..fe53715e14b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.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.console;
+
+import java.util.Collection;
+import java.util.Hashtable;
+
+public class ConsoleCommandManager implements ICommandManager{
+
+ private final Hashtable<String, ConsoleCommand> cmdMap = new Hashtable<String, ConsoleCommand>(64);
+
+ private boolean isShutdown = false;
+
+ 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");
+ }
+ }
+
+ 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");
+ }
+ }
+
+ public ConsoleCommand getCommand(String name) {
+ return cmdMap.get(name);
+ }
+
+ 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 00000000000..0d023b601b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.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.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<ICommandManager>(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
+ * @param save
+ */
+ 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 00000000000..ae30eaa0ff5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.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.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 00000000000..56e1ecc6b66
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.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.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);
+ }
+
+ 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 = (Benchmark) iter.next();
+ float val = ((float) bm.getLongestSample()) / 1000.0f;
+ buffer.append(bm.getName()).append(": total samples: ").append(bm.getTotalSamples());
+ buffer.append(". Max Time: ").append(val).append("ms. Min: ");
+ val = ((float) bm.getShortestSample()) / 1000.0f;
+ buffer.append(val).append("ms. Avg: ");
+ val = ((float) bm.getAverage()) / 1000.0f;
+ buffer.append(val).append("ms. Exceed Count: ").append(bm.getExceedCount()).append(" (threshold=").append(
+ bm.getThreshold() / 1000.0f);
+ val = ((float) 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 = (Benchmark) 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 00000000000..3a46d794651
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.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.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);
+ }
+
+ 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 00000000000..a9835275433
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.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.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);
+ }
+
+ 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 00000000000..2db109af5cc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.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.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);
+ }
+
+
+ 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 00000000000..55b6fc2e6cf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.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.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);
+ }
+
+ 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 00000000000..cd3855eaf07
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.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.environment.interfaces;
+
+public class BasicTimeout implements ITimeout {
+
+ private volatile boolean timeout;
+
+ public boolean isTimedOut() {
+ return timeout;
+ }
+
+ 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 00000000000..b21309b32e4
--- /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 00000000000..d50f2121601
--- /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 00000000000..5bbffa55256
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.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.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();
+ String getRuntimeLibraryConfiguration();
+}
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 00000000000..17c9ddeaf9f
--- /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 00000000000..60400838579
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.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 java.rmi.Remote;
+import java.rmi.RemoteException;
+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 {
+ ITestEnvironment[] getRemoteEnvironments() throws RemoteException;
+
+ byte[] getOutfileResultSummary() throws RemoteException;
+
+ ConnectionRequestResult requestEnvironment(IRemoteUserSession session, TestEnvironmentConfig config) 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 00000000000..6bed9298199
--- /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 00000000000..79e0a878a05
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.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;
+
+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 00000000000..6409543269b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.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.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 00000000000..bb5b36704d7
--- /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 00000000000..651c168348d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.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.interfaces;
+
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+
+public interface IReportData {
+ // void addQueueListener(ReportDataListener listener, List<TestEnvironmentCommand> cmds);
+ @SuppressWarnings("unchecked")
+ void addQueueListener(ReportDataListener listener, List cmds);
+
+ void removeQueueListener(ReportDataListener listener);
+
+ // void updateQueueListeners(List<TestEnvironmentCommand> cmds);
+ @SuppressWarnings("unchecked")
+ 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 00000000000..a2f925436ce
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.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.core.environment.interfaces;
+
+import java.io.IOException;
+import java.util.Collection;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.ote.core.ReturnStatus;
+import org.eclipse.osee.ote.core.environment.BundleDescription;
+
+
+public interface IRuntimeLibraryManager extends Xmlizable {
+ /**
+ * @param version
+ * @return
+ * @deprecated use isBundleAvailable
+ */
+ @Deprecated
+ boolean isMessageJarAvailable(String version);
+ boolean isBundleAvailable(String symbolicName, String version, byte[] md5Digest);
+
+ ReturnStatus isRunningJarVersions(String[] versions);
+ /**
+ * Sets up the class loader
+ * @param jarVersions
+ * @param classPaths
+ * @return true if there is no change in class loader configuration
+ * @throws Exception
+ */
+ boolean setupClassLoaderAndJar(String[] jarVersions, String[] classPaths) throws Exception;
+ void addRuntimeLibraryListener(RuntimeLibraryListener listener);
+ void removeRuntimeLibraryListener(RuntimeLibraryListener listener);
+
+ /**
+ * @param jarData
+ * @throws IOException
+ * @deprecated see loadBundle
+ */
+ @Deprecated
+ void addJarToClassLoader(byte[] jarData) throws IOException;
+ void loadBundles(Collection<BundleDescription> bundles) throws Exception;
+ void updateBundles(Collection<BundleDescription> bundles) throws Exception;
+
+ void resetScriptLoader(String[] strings) throws Exception;
+ Class<?> loadFromScriptClassLoader(String path) throws ClassNotFoundException;
+ Class<?> loadFromRuntimeLibraryLoader(String path) throws ClassNotFoundException;
+ void cleanup();
+
+ /**
+ * This will be replaced by using OSGi bundles and services in the future
+ * @deprecated
+ */
+ @Deprecated
+ void onRuntimeUnloaded();
+
+ /**
+ * This will be replaced by using OSGi bundles and services in the future
+ * @deprecated
+ */
+ @Deprecated
+ void onRuntimeLoaded();
+}
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 00000000000..729049df9e7
--- /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 00000000000..ef70de2e47c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.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.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 00000000000..2f2d048649e
--- /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 00000000000..509fc910800
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.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 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 00000000000..8fb4ddc800c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.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.environment.interfaces;
+
+import java.io.IOException;
+import java.net.URL;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+import org.eclipse.osee.framework.messaging.Message;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.cmd.Command;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusListener;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+import org.eclipse.osee.ote.core.model.IModelManagerRemote;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironment extends Remote {
+
+ Remote getControlInterface(String controlInterfaceID) throws RemoteException;
+
+ public Collection<OSEEPerson1_4> getUserList() throws RemoteException;
+
+ ICommandHandle addCommand(ITestServerCommand cmd) throws RemoteException;
+
+ void addEnvironmentListener(ITestEnvironmentListener listener) throws RemoteException;
+
+ void addStatusListener(IServiceStatusListener listener) throws RemoteException;
+
+ UserTestSessionKey addUser(IUserSession user) throws RemoteException, Exception;
+
+ void disconnect(UserTestSessionKey user) throws RemoteException;
+
+ boolean equals(ITestEnvironment testEnvironment) throws RemoteException;
+
+ List<String> getQueueLabels() throws RemoteException;
+
+ public IModelManagerRemote getModelManager() throws RemoteException;
+
+ public Remote getRemoteModel(String modelClassName, Class<?>[] methodParameterTypes, Object[] methodParameters) throws RemoteException;
+
+ public Remote getRemoteModel(String modelClassName) throws RemoteException;
+
+ byte[] getScriptOutfile(String outfilePath) throws RemoteException;
+
+ int getUniqueId() throws RemoteException;
+
+ void removeQueueListener(ReportDataListener listener) throws RemoteException;
+
+ void removeStatusListener(IServiceStatusListener listener) throws RemoteException;
+
+ URL setBatchLibJar(byte[] messageJar) throws RemoteException, IOException;
+
+ void onHostKilled() throws RemoteException;
+
+ void startup(String outfileDir) throws RemoteException;
+
+ void setClientClasses(URL[] urls) throws RemoteException;
+
+ IRemoteCommandConsole getCommandConsole() throws RemoteException;
+
+ public void closeCommandConsole(IRemoteCommandConsole console) throws RemoteException;
+
+ public void setBatchMode(boolean isBatched) throws RemoteException;
+
+ public void sendCommand(Command command) throws RemoteException;
+
+ public void sendMessage(Message message) 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 00000000000..32f39049193
--- /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 00000000000..99385da9bef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.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;
+
+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 00000000000..b0528125c64
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.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.environment.interfaces;
+
+import java.lang.reflect.Constructor;
+import org.eclipse.osee.ote.core.enums.SupportedScriptTypes;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TestServerMode;
+
+
+public interface ITestEnvironmentServiceConfig {
+ /**
+ * gets the maximum number of environments allowed
+ * in this service
+ * @return
+ */
+ public int getMaxEnvironments();
+
+ public int getMaxUsersPerEnvironment();
+
+ /**
+ *
+ * @return
+ */
+ public String getTypeName();
+ public TestServerMode getMode();
+ public String getServerTitle();
+ public String getOutfileLocation();
+ public SupportedScriptTypes getSupportedScriptTypes();
+
+ /**
+ * gets the Constructor for the creating new environments
+ * @return
+ */
+ public Constructor<? extends TestEnvironment> getEnvironmentConstructor();
+
+ /**
+ * gets the parameter instances need to calling the constructor when
+ * new environments are created
+ * @return
+ */
+ 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 00000000000..8f53c71c99e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.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.ArrayList;
+
+/**
+ * @author Robert A. Fisher
+ *
+ * The TestPoint interface should be implemented by objects that store
+ * pass/fail data.
+ */
+public interface ITestGroup extends ITestPoint {
+ public int size();
+ 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 00000000000..456b2eb036b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.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 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.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 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 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 00000000000..c5ebdf031bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.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;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+
+/**
+ * @author Robert A. Fisher
+ *
+ * The TestPoint interface should be implemented by objects that store
+ * pass/fail data.
+ */
+public interface ITestPoint extends Xmlizable {
+ 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 00000000000..82b67185d15
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.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 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 00000000000..140aeb20174
--- /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 00000000000..b857094a5f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.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.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 00000000000..810ca0966e6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.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.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+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();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeConfigurationInitilizer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeConfigurationInitilizer.java
new file mode 100644
index 00000000000..53f18cc89b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeConfigurationInitilizer.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.interfaces;
+
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface RuntimeConfigurationInitilizer {
+
+ /**
+ * @param bundleContext
+ */
+ void startRuntimeOsgiServices(BundleContext bundleContext);
+ void stopRuntimeOsgiServices();
+}
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 00000000000..0c1aa040a64
--- /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 00000000000..f666a8eba8b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.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.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(){
+
+ 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();
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ * @see java.io.Writer#write(char[], int, int)
+ */
+// public void write(byte[] cbuf, int off, int len) {
+// super.write(cbuf, off, len);
+// buffer.append(cbuf, off, len);
+// masterBuffer.append(cbuf, off, len);
+// }
+
+ /*
+ * (non-Javadoc)
+ * @see java.io.Writer#flush()
+ */
+ public void flush() {
+ if(builder.length() == 0) return;
+ AsynchRemoteJobs.getInstance(this).addJob(new ConsoleOutputJob(callback, builder.toString()));
+ builder.delete(0, builder.length());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.io.Writer#close()
+ */
+ 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);
+//}
+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();
+}
+
+public void print(boolean b) {
+ builder.append(b ? "true" : "false");
+ super.print(b);
+}
+public void print(char c) {
+ builder.append(c);
+ super.print(c);
+}
+public void print(char[] s) {
+ builder.append(s);
+ super.print(s);
+}
+public void print(double d) {
+ builder.append(d);
+ super.print(d);
+}
+public void print(float f) {
+ builder.append(f);
+ super.print(f);
+}
+public void print(int i) {
+ builder.append(i);
+ super.print(i);
+}
+public void print(long l) {
+ builder.append(l);
+ super.print(l);
+}
+public void print(Object obj) {
+ builder.append(String.valueOf(obj));
+ super.print(obj);
+}
+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);
+//}
+public void println() {
+ super.println();
+ newLine();
+}
+public void println(boolean x) {
+ super.println(x);
+ newLine();
+}
+public void println(char x) {
+ super.println(x);
+ newLine();
+}
+public void println(char[] x) {
+ super.println(x);
+ newLine();
+}
+public void println(double x) {
+ newLine();
+ super.println(x);
+}
+public void println(float x) {
+ super.println(x);
+ newLine();
+}
+public void println(int x) {
+ super.println(x);
+ newLine();
+}
+public void println(long x) {
+ super.println(x);
+ newLine();
+}
+public void println(Object x) {
+ super.println(x);
+ newLine();
+}
+public void println(String x) {
+ super.println(x);
+ newLine();
+}
+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 00000000000..5c5f0e4033f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.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.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 StringBuffer buffer;
+ private StringBuffer masterBuffer;
+
+ public EclipseConsoleWriter(IUserSession callback) {
+ this.callback = callback;
+ buffer = new StringBuffer(256);
+ masterBuffer = new StringBuffer(256);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.io.Writer#write(char[], int, int)
+ */
+ public void write(char[] cbuf, int off, int len) {
+ buffer.append(cbuf, off, len);
+ masterBuffer.append(cbuf, off, len);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.io.Writer#flush()
+ */
+ public 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) {
+ throw new IOException("failed to initate promt");
+ }
+ buffer.delete(0, buffer.length());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.io.Writer#close()
+ */
+ public void close() throws IOException {
+ flush();
+ }
+
+ public String getAllOutput() {
+ return masterBuffer.toString();
+ }
+
+}
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 00000000000..f66d8e0a9c7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.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.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 00000000000..44d26ba81a9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.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.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 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/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/package.html
new file mode 100644
index 00000000000..58ff2b6ea08
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/package.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<title>OSEE Core Test Environment</title>
+</head>
+<body bgcolor="white">
+
+<h1>OSEE Core Test Environment</h1>
+
+<p>
+TestEnvironment is the base class the provides the core execution management of tests to all of the other more specialized test environments. It manages models, test execution, and holds onto many interfaces that determine the behavior of the environment. It is the starting point for testing in OSEE.
+</p>
+
+</body>
+</html> \ No newline at end of file
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 00000000000..b9a2e72710f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.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.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() {
+ }
+
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public void set(CommandDescription description) {
+ this.description = description;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ 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 00000000000..83a042b9c24
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.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.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 00000000000..d87334c9855
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.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.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() {
+ }
+
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ 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 00000000000..631e93de6a6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.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.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 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 00000000000..be0ac274f66
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.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.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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ 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 00000000000..0748317c26c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.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 ExceptionEvent extends CommandStatusEvent implements Serializable{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -831107014787093973L;
+ private Throwable throwable;
+ /**
+ * @param description
+ * @param exception
+ */
+ 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 00000000000..4d5c60e4c3b
--- /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 00000000000..78447f90e7a
--- /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 00000000000..7370a5d4777
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.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;
+
+
+/**
+ * @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);
+
+/**
+ * @param testStart
+ */
+public void asTestStart(TestStart testStart);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusListener.java
new file mode 100644
index 00000000000..91145f971ae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusListener.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.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IServiceStatusListener extends Remote {
+ public void statusBoardUpdated(IServiceStatusData statusData) throws RemoteException;
+}
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 00000000000..07aa8fda500
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.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.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 addStatusListener(IServiceStatusListener listener);
+
+ 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 removeStatusListener(IServiceStatusListener listener);
+
+ 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);
+}
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 00000000000..ce338a61112
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.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.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;
+ }
+
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ 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 00000000000..e90cd3d611a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.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 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() {
+ }
+
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public CommandEndedStatusEnum getStatus() {
+ return status;
+ }
+
+ public void set(CommandDescription description, CommandEndedStatusEnum status) {
+ this.description = description;
+ this.status = status;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ 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 00000000000..d39829f2dc7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.rmi.ConnectException;
+import java.util.ArrayList;
+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.framework.command.ICommandHandle;
+
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class StatusBoard implements ITestEnvironmentListener, OTEStatusBoard{
+ private static final long TP_UPDATE_THROTTLE = 5000;
+ private CommandDescription currentCommand;
+ private ArrayList<IServiceStatusListener> listeners;
+
+ private long lastTpUpdateTime = 0;
+
+// private long tpSentCount;
+// private long tpCanceledCount;
+ /**
+ * @return the listeners
+ */
+ ArrayList<IServiceStatusListener> getListeners() {
+ return listeners;
+ }
+
+ private ThreadPoolExecutor executor ;
+ private ScheduledExecutorService scheduledExecutor;
+ private Object testPointLock = new Object();
+ private TestPointStatusBoardRunnable latestTestPointUpdate;
+ private AtomicBoolean executeLatestTestPointUpdate = new AtomicBoolean();
+// 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);
+ this.listeners = new ArrayList<IServiceStatusListener>(6);
+ executeLatestTestPointUpdate.set(false);
+ executor = (ThreadPoolExecutor)Executors.newFixedThreadPool(1);
+ scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
+ scheduledExecutor.scheduleAtFixedRate(new Runnable(){
+
+ 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);
+ }
+
+ /**
+ * Add UI listner to list of listners.
+ *
+ * @param listener Refernece to the UI listener.
+ */
+ public void addStatusListener(IServiceStatusListener listener) {
+ listeners.add(listener);
+ }
+
+ public void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd) {
+ CommandAdded cmdAdded = new CommandAdded();
+ cmdAdded.set(cmd.getDescription());
+ notifyListeners(cmdAdded);
+ }
+
+ public void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status) {
+ CommandRemoved cmdRemoved = new CommandRemoved();
+ cmdRemoved.setDescription(cmdDesc);
+ cmdRemoved.setReason(status);
+ notifyListeners(cmdRemoved);
+ }
+
+ public void onException(String message, Throwable t) {
+ EnvironmentError envError= new EnvironmentError();
+ envError.set(t);
+ notifyListeners(envError);
+ }
+
+ /**
+ * Remove UI listener from list of listners
+ *
+ * @param listener Reference to the UI listener.
+ */
+ public void removeStatusListener(IServiceStatusListener listener) {
+ listeners.remove(listener);
+ }
+
+
+ public void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc) {
+ this.currentCommand = cmdDesc;
+
+ SequentialCommandBegan seqCmdBegan= new SequentialCommandBegan();
+ seqCmdBegan.set(cmdDesc);
+ notifyListeners(seqCmdBegan);
+ }
+
+
+ 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);
+ notifyListeners(seqCmdEnded);
+ }
+
+
+ public void onTestPointUpdate(int pass, int fail, String testClassName) {
+ TestPointStatusBoardRunnable runnable = new TestPointStatusBoardRunnable(new TestPointUpdate(pass, fail, testClassName), this);
+ if(System.currentTimeMillis() - lastTpUpdateTime > TP_UPDATE_THROTTLE){
+ lastTpUpdateTime = System.currentTimeMillis();
+ executor.submit(runnable);
+ } else {
+ synchronized (testPointLock) {
+ latestTestPointUpdate = runnable;
+ executeLatestTestPointUpdate.set(true);
+ }
+ }
+ }
+
+
+
+ void notifyListeners(final IServiceStatusData data) {
+ IServiceStatusData classData = data;
+ executor.execute(new StatusBoardRunnable(classData) {
+ public void run() {
+
+ int size = listeners.size();
+ for (int i = 0; i < size; i++) {
+ try {
+ listeners.get(i).statusBoardUpdated(getData());
+ } catch (ConnectException e) {
+ OseeLog.log(TestEnvironment.class,Level.SEVERE,
+ e.getMessage(), e);
+ listeners.remove(i);
+ notifyListeners(getData());
+ return;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ }
+ }
+ }
+ });
+ }
+
+
+
+
+ public void onEnvironmentKilled(TestEnvironment env) {
+
+ }
+
+ public void dispose(){
+ currentCommand = null;
+ listeners.clear();
+ listeners = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener#onTestServerCommandFinished(org.eclipse.osee.ote.core.environment.TestEnvironment, org.eclipse.osee.ote.core.framework.command.ICommandHandle)
+ */
+ public void onTestServerCommandFinished(TestEnvironment env,
+ ICommandHandle handle) {
+ notifyListeners(new TestServerCommandComplete(handle));
+ }
+
+ public void onTestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus){
+ notifyListeners(new TestComplete(className, serverOutfilePath, clientOutfilePath, status, healthStatus));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener#onTestStart(java.lang.String)
+ */
+ public void onTestStart(String className) {
+ notifyListeners(new TestStart(className));
+ }
+
+} \ 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 00000000000..62a1f8b1951
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.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.environment.status;
+
+
+public abstract class StatusBoardRunnable implements Runnable {
+
+ private IServiceStatusData data;
+
+ public StatusBoardRunnable(IServiceStatusData data){
+ this.data = data;
+ }
+
+ protected IServiceStatusData 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 00000000000..816fed10682
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.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.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;
+ }
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ public void accept(IServiceStatusDataVisitor visitor) {
+ visitor.asTestComplete(this);
+ }
+ /**
+ * @return
+ */
+ public String getClassName() {
+ return className;
+ }
+ /**
+ * @return
+ */
+ public CommandEndedStatusEnum getStatus() {
+ return status;
+ }
+ /**
+ * @return
+ */
+ public String getServerOutfilePath() {
+ return serverOutfilePath;
+ }
+ /**
+ * @return
+ */
+ 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 00000000000..382aefaf137
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.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.environment.status;
+
+import java.rmi.ConnectException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TestPointStatusBoardRunnable extends StatusBoardRunnable {
+
+ private StatusBoard statusBoard;
+ /**
+ *
+ */
+ public TestPointStatusBoardRunnable(IServiceStatusData data, StatusBoard statusBoard) {
+ super(data);
+ this.statusBoard = statusBoard;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ int size = statusBoard.getListeners().size();
+ for (int i = 0; i < size; i++) {
+ try {
+ statusBoard.getListeners().get(i).statusBoardUpdated(getData());
+ } catch (ConnectException e) {
+ OseeLog.log(TestEnvironment.class,Level.SEVERE,
+ e.getMessage(), e);
+ statusBoard.getListeners().remove(i);
+ statusBoard.notifyListeners(getData());
+ return;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ }
+ }
+ }
+
+}
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 00000000000..94ba176986e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.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.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;
+ }
+
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public void set(int pass, int fail, CommandDescription description) {
+ this.pass = pass;
+ this.fail = fail;
+ this.description = description;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ 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 00000000000..de33fecb4ae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.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.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TestServerCommandComplete implements Serializable,
+IServiceStatusData {
+
+ private static final long serialVersionUID = -2678833105694275416L;
+ private ICommandHandle handle;
+
+ public TestServerCommandComplete(ICommandHandle handle){
+ this.handle = handle;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ public void accept(IServiceStatusDataVisitor visitor) {
+ visitor.asTestServerCommandComplete(this);
+ }
+
+ public ICommandHandle getHandle(){
+ return handle;
+ }
+}
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 00000000000..56382781911
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.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.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;
+
+ public TestStart(String testClassName){
+ this.testClassName = testClassName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.environment.status.IServiceStatusData#accept(org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor)
+ */
+ public void accept(IServiceStatusDataVisitor visitor) {
+ visitor.asTestStart(this);
+ }
+
+ public String getTestClassName(){
+ return testClassName;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/package.html
new file mode 100644
index 00000000000..38f7d502a34
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/package.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides for the handling of test enviornment status information.
+
+
+<h2>Related Documentation</h2>
+
+For overviews, tutorials, examples, guides, and tool documentation, please see:
+<ul>
+ <li>Refer to the OSEE Team generated information included in the eclipse help subsystem.
+ <li><a href="http://java.sun.com/docs/white/langenv/index.html">White Paper - The Java Language Enviornment.</a>
+ <li><a href="http://java.sun.com/docs/books/tutorial/java/index.html">Trail - Learning The Java Language.</a>
+</ul>
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
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 00000000000..21eae60ca15
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.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;
+
+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 {
+
+ public ITestContext getContext(final TestEnvironment testEnvironment, final ITestServerCommand cmd) {
+
+ return testEnvironment;
+ /*new ITestContext() {
+ public File getOutDir() {
+ return testEnvironment.getOutDir();
+ }
+
+ public IRunManager getRunManager() {
+ return testEnvironment.getRunManager();
+ }
+
+ public void setActiveUser(UserTestSessionKey key) {
+ testEnvironment.setActiveUser(key);
+ }
+
+ public void testComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus) {
+ testEnvironment.testComplete(className, serverOutfilePath, clientOutfilePath, status, healthStatus);
+ }
+
+ public void testStart(String string) {
+ testEnvironment.testStart(string);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.command.ITestContext#getControlInterface(java.lang.String)
+ */
+// public Object getControlInterface(String name) {
+// return null;
+// }
+//
+// };
+ }
+
+}
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 00000000000..baa2f988369
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.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.core.framework;
+
+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.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 ITestResultCollectorFactory resultCollectorFactory;
+ private ITestResultCollector resultCollector;
+
+
+ public BaseRunManager(ITestRunManager testRunManager, ITestLifecycleListenerProvider lifecycleListenerProvider, ITestResultCollectorFactory resultCollectorFactory) {
+ this.lifecycleListenerProvider = lifecycleListenerProvider;
+ this.testRunManager = testRunManager;
+ this.resultCollectorFactory = resultCollectorFactory;
+ }
+
+ public boolean addListener(ITestLifecycleListener listener) {
+ return lifecycleListenerProvider.addListener(listener);
+ }
+
+ public void clearAllListeners() {
+ lifecycleListenerProvider.clear();
+ }
+
+ public boolean removeListener(ITestLifecycleListener listener) {
+ return lifecycleListenerProvider.removeListener(listener);
+ }
+
+ 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()){
+ rb.append(lifecycleListenerProvider.notifyPostInstantiation(propertyStore, testRunManager.getTest(), env));
+ if(rb.isReturnStatusOK()){
+ rb.append(testRunManager.run(propertyStore, env));
+ }
+ 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();
+ status.setReturnCode(ReturnCode.ERROR);
+ status.addStatus(new BaseStatus(BaseRunManager.class.getName(), Level.SEVERE, th));
+ return status;
+ }
+ }
+
+ public boolean abort() {
+ return testRunManager.abort();
+ }
+
+ public boolean abort(Throwable th, boolean wait) {
+ return testRunManager.abort(th, wait);
+ }
+
+ public boolean isAborted(){
+ return testRunManager.isAborted();
+ }
+
+ public TestScript getCurrentScript() {
+ return testRunManager.getTest();
+ }
+}
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 00000000000..694d4e446b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.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.framework;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+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.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;
+
+ public BaseTestLifecycleListenerProvider(IEventDataProvider eventProvider) {
+ this.eventProvider = eventProvider;
+ listeners = new CopyOnWriteArrayList<ITestLifecycleListener>();
+ }
+
+ public void clear() {
+ listeners.clear();
+ }
+
+ public boolean addListener(ITestLifecycleListener listener) {
+ return listeners.add(listener);
+ }
+
+ public IMethodResult notifyPostDispose(IPropertyStore propertyStore, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, null);
+ MethodResultImpl result = MethodResultImpl.OK;
+ for (ITestLifecycleListener listener : listeners) {
+ result = collectStatus(result, listener.postDispose(eventData, env));
+ }
+ return result;
+ }
+
+ public IMethodResult notifyPostInstantiation(IPropertyStore propertyStore, TestScript test, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, test);
+ MethodResultImpl result = MethodResultImpl.OK;
+ for (ITestLifecycleListener listener : listeners) {
+ result = collectStatus(result, listener.postInstantiation(eventData, env));
+ }
+ return result;
+ }
+
+ public IMethodResult notifyPreDispose(IPropertyStore propertyStore, TestScript test, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, test);
+ MethodResultImpl result = MethodResultImpl.OK;
+ for (ITestLifecycleListener listener : listeners) {
+ result = collectStatus(result, listener.preDispose(eventData, env));
+ }
+ return result;
+ }
+
+ public IMethodResult notifyPreInstantiation(IPropertyStore propertyStore, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, null);
+ MethodResultImpl result = MethodResultImpl.OK;
+ for (ITestLifecycleListener listener : listeners) {
+ result = collectStatus(result, listener.preInstantiation(eventData, env));
+ }
+ return result;
+ }
+
+ public boolean removeListener(ITestLifecycleListener listener) {
+ return listeners.remove(listener);
+ }
+
+ private MethodResultImpl collectStatus(MethodResultImpl result,
+ IMethodResult listenerResult) {
+ if (listenerResult.getReturnCode() != ReturnCode.OK) {
+ if (result == MethodResultImpl.OK) {
+ result = new MethodResultImpl();
+ }
+ 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 00000000000..652aab8efae
--- /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 00000000000..74af875adac
--- /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 00000000000..d334a443577
--- /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 00000000000..071c89e7c8d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.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;
+
+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();
+}
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 00000000000..c17c58f0cc8
--- /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 00000000000..22304f6d8b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.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.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 00000000000..f6aec9f1324
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.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.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 final MethodResultImpl OK = new MethodResultImpl();
+
+ public static MethodResultImpl combine(IMethodResult result1, IMethodResult result2){
+ if(result1== OK && result2 == OK){
+ return OK;
+ } else {
+ return new MethodResultImpl(result1, result2);
+ }
+ }
+
+ private List<IHealthStatus> statuses;
+ private ReturnCode returnCode;
+
+ public MethodResultImpl(){
+ statuses = new ArrayList<IHealthStatus>();
+ returnCode = ReturnCode.OK;
+ }
+
+ private MethodResultImpl(IMethodResult result1, IMethodResult result2){
+ if(result1 != OK){
+ addStatus(result1.getStatus());
+ setReturnCode(result1.getReturnCode());
+ }
+ if(result2 != OK){
+ addStatus(result2.getStatus());
+ setReturnCode(result2.getReturnCode());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.IMethodResult#getReturnCode()
+ */
+ public ReturnCode getReturnCode() {
+ return returnCode;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.IMethodResult#getStatus()
+ */
+ public List<IHealthStatus> getStatus() {
+ return statuses;
+ }
+
+ public void setReturnCode(ReturnCode returnCode){
+ this.returnCode = returnCode;
+ }
+
+ public void addStatus(IHealthStatus status){
+ statuses.add(status);
+ }
+
+ /**
+ * @param status
+ */
+ public void addStatus(List<IHealthStatus> status) {
+ statuses.addAll(status);
+ }
+
+ 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 00000000000..2f55d8c2776
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.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;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class ResultBuilder {
+
+ private MethodResultImpl result;
+ private boolean logToHM;
+
+ public ResultBuilder(boolean logToHM){
+ result = new MethodResultImpl();
+ 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;
+ }
+
+ 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 00000000000..4fac19bf929
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.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;
+
+/**
+ * @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 00000000000..56867cf85e3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.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.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.event.IEventData;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestLifecycleListenerAdapter implements ITestLifecycleListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.ITestLifecycleListener#postDispose(org.eclipse.osee.ote.core.framework.event.IEventData)
+ */
+ public IMethodResult postDispose(IEventData eventData, TestEnvironment env) {
+ return MethodResultImpl.OK;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.ITestLifecycleListener#postInstantiation(org.eclipse.osee.ote.core.framework.event.IEventData)
+ */
+ public IMethodResult postInstantiation(IEventData eventData, TestEnvironment env) {
+ return MethodResultImpl.OK;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.ITestLifecycleListener#preDispose(org.eclipse.osee.ote.core.framework.event.IEventData)
+ */
+ public IMethodResult preDispose(IEventData eventData, TestEnvironment env) {
+ return MethodResultImpl.OK;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.ITestLifecycleListener#preInstantiation(org.eclipse.osee.ote.core.framework.event.IEventData)
+ */
+ public IMethodResult preInstantiation(IEventData eventData, TestEnvironment env) {
+ return MethodResultImpl.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 00000000000..24bcc0f2558
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.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.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.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.thread.OteThreadManager;
+
+public class BaseCommandManager implements ICommandManager {
+
+ private ExecutorService commands;
+ private ExecutorService commandResponse;
+ private 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<ITestServerCommand, Future<ITestCommandResult>>();
+ }
+
+ public ICommandHandle addCommand(ITestServerCommand cmd, TestEnvironment context) throws ExportException {
+ Future<ITestCommandResult> result = commands.submit(new TestCallableWrapper(this, cmd, context));
+ 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/CommandCompleteListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java
new file mode 100644
index 00000000000..c21c1a2974e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.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;
+
+/**
+ * @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 00000000000..52566094c66
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.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.command;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface ICommandHandle extends Remote {
+ boolean cancelAll(boolean mayInterruptIfRunning) throws RemoteException;
+ boolean cancelSingle(boolean mayInterruptIfRunning) throws RemoteException;
+ ITestCommandResult get() throws RemoteException;
+ boolean isCancelled() throws RemoteException;
+ boolean isDone() throws RemoteException;
+ String getCommandKey() throws RemoteException;
+}
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 00000000000..3d3bd9267c6
--- /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 00000000000..bb8203b4dc7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.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.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 00000000000..faca3813761
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.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.command;
+
+import java.io.File;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public interface ITestContext {
+ IRunManager getRunManager();
+ void setActiveUser(UserTestSessionKey key);
+ 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 00000000000..3b7b2767671
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.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;
+
+import java.rmi.server.ExportException;
+import java.util.concurrent.Future;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+
+
+public interface ITestServerCommand {
+
+ UserTestSessionKey getUserSessionKey();
+ ICommandHandle createCommandHandle(Future<ITestCommandResult> result, ITestContext context) throws ExportException;
+ ITestCommandResult execute(TestEnvironment context) throws Exception;
+ GUID getGUID();
+}
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 00000000000..ef057e81cd5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.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.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.environment.TestEnvironment;
+
+public class TestCallableWrapper implements Callable<ITestCommandResult> {
+
+ private ITestServerCommand cmd;
+ private TestEnvironment context;
+ private BaseCommandManager cmdManager;
+
+
+ public TestCallableWrapper( BaseCommandManager cmdManager, ITestServerCommand cmd, TestEnvironment context) {
+ this.cmd = cmd;
+ this.context = context;
+ this.cmdManager = cmdManager;
+ }
+
+ public ITestCommandResult call() throws Exception {
+ ITestCommandResult result;
+ try{
+ context.setActiveUser(cmd.getUserSessionKey());
+ result = cmd.execute(context);
+ 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 00000000000..7cea9d6e1eb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.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.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 TestEnvironment env;
+ private Future<ITestCommandResult> future;
+ private ITestServerCommand cmd;
+
+ /**
+ * @param future
+ */
+ public TestCommandComplete(TestEnvironment env, ITestServerCommand cmd, Future<ITestCommandResult> future) {
+ this.future = future;
+ this.cmd = cmd;
+ this.env = env;
+ }
+
+ /**
+ * @param handle
+ */
+ public TestCommandComplete(TestEnvironment env, ICommandHandle handle) {
+ this.env = env;
+ this.handle = handle;
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.Callable#call()
+ */
+ 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 00000000000..6f1f9c0f1c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.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.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;
+ }
+
+ /**
+ * @param fail2
+ * @param exception
+ */
+ public TestCommandResult(TestCommandStatus status, Throwable th) {
+ this.status = status;
+ this.th = th;
+ }
+
+ public TestCommandStatus getStatus() {
+ return status;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.command.ITestCommandResult#getException()
+ */
+ 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 00000000000..bf95ae4fb22
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.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.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 00000000000..403f50ef6eb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.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.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;
+ }
+
+ public TestScript getTest() {
+ return test;
+ }
+
+ public TestCase getTestCase() {
+ return testCase;
+ }
+
+ 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 00000000000..ab7c8af28c2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.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.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class BaseEventDataProvider implements IEventDataProvider {
+
+ 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 00000000000..a1c9ba6f00d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.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.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 00000000000..aa57fd2575b
--- /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 00000000000..31aba49889f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.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.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() {
+
+ 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 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();
+ } finally {
+ script.getTestEnvironment().getScriptCtrl().lock();
+ }
+ if (exception != null) {
+ throw exception;
+ }
+ 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 00000000000..7308c036d4b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.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.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;
+ /**
+ * @param id
+ * @param message
+ */
+ public AbstractRemotePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ this.connector = connector;
+ this.id = id;
+ this.message = message;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IPromptHandle#getPromptId()
+ */
+ public String getPromptId() throws RemoteException {
+ return id;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IPromptHandle#getPromptMessage()
+ */
+ 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
+ *
+ * @param <T>
+ * @param remoteInterface
+ * @return
+ * @throws ExportException
+ */
+ 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 00000000000..c6e3ecaaefa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.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.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;
+
+ /**
+ * @param id
+ * @param message
+ * @throws UnknownHostException
+ */
+ public BlockingMessagePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ super(connector, id, message);
+ }
+
+ /**
+ * @param session
+ * @param timeout
+ * @return true if the user did not respond within the time specified and false if the user responded in time
+ * @throws Exception
+ */
+ 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();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IResumeResponse#resume()
+ */
+ 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 00000000000..b387aff5c16
--- /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 00000000000..770a4ff4446
--- /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 00000000000..8dc952c4e3c
--- /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 00000000000..473df2e43ae
--- /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 00000000000..e4c30accf2d
--- /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/InformationalPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java
new file mode 100644
index 00000000000..c7858717b2d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.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.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.IUserSession;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class InformationalPrompt extends AbstractRemotePrompt {
+
+ /**
+ * @param id
+ * @param message
+ * @throws UnknownHostException
+ */
+ 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() {
+
+ public void run() {
+ try {
+ session.initiateInformationalPrompt(getPromptMessage());
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class,
+ Level.SEVERE, "exception while performing informational prompt", e);
+
+ }
+ }
+ });
+ } else {
+ session.initiateInformationalPrompt(getPromptMessage());
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.AbstractRemotePrompt#close()
+ */
+ @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 00000000000..273f62b85f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.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.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 {
+
+ /**
+ * @param id
+ * @param message
+ * @throws UnknownHostException
+ */
+ public NonBlockingMessagePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ super(connector, id, message);
+ }
+
+ /**
+ * @param session
+ * @param timeout
+ * @return true if the user did not respond within the time specified and false if the user responded in time
+ * @throws Exception
+ */
+ public void open(IUserSession session) throws Exception {
+
+ session.initiateResumePrompt(this);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IResumeResponse#resume()
+ */
+ 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 00000000000..1fe76ee1b96
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.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.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 {
+
+ /**
+ * @param script
+ * @param id
+ * @param message
+ * @throws UnknownHostException
+ */
+ public OfpDebugPrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.ScriptPausePromptImpl#resume()
+ */
+ @Override
+ public void resume() throws RemoteException {
+ super.resume();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.AbstractInteractivePrompt#waitForResponse(org.eclipse.osee.ote.core.TestScript, boolean)
+ */
+ @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 00000000000..20f76f8b1f7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.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.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 {
+
+ /**
+ * @param id
+ * @param message
+ */
+ public PassFailPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.BasicRemotePrompt#doPrompt(org.eclipse.osee.ote.core.IUserSession, org.eclipse.osee.ote.core.TestScript)
+ */
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiatePassFailPrompt(createRemoteReference(IPassFailPromptResponse.class));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse#respond(boolean)
+ */
+ 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 00000000000..6a761d6e0c6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.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.prompt;
+
+public class PassFailPromptResult {
+ private final boolean pass;
+ private final String text;
+
+ /**
+ * @param pass
+ * @param 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 00000000000..971982156f4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.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.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 {
+
+ /**
+ * @param id
+ * @param message
+ */
+ public ScriptPausePromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.BasicRemotePrompt#doPrompt(org.eclipse.osee.ote.core.IUserSession, org.eclipse.osee.ote.core.TestScript)
+ */
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateResumePrompt(createRemoteReference(IResumeResponse.class));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IScriptPauseResponse#resume()
+ */
+ 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 00000000000..2d03eabf16e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.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.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 {
+
+ /**
+ * @param id
+ * @param message
+ */
+ public ScriptSteppingPrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.BasicRemotePrompt#doPrompt(org.eclipse.osee.ote.core.IUserSession, org.eclipse.osee.ote.core.TestScript)
+ */
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateResumePrompt(createRemoteReference(IResumeResponse.class));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.ISteppingPrompt#step()
+ */
+ public void step() throws RemoteException {
+ // environment.singleStepEnv();
+ endPrompt("RESUME", null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IScriptPauseResponse#resume()
+ */
+ 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 00000000000..974aa175990
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.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 UserInputPromptImpl extends AbstractInteractivePrompt<String> implements IUserInputPromptResponse {
+
+ /**
+ * @param id
+ * @param message
+ */
+ public UserInputPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.BasicRemotePrompt#doPrompt(org.eclipse.osee.ote.core.IUserSession, org.eclipse.osee.ote.core.TestScript)
+ */
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateUserInputPrompt(createRemoteReference(IUserInputPromptResponse.class));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse#respond(java.lang.String)
+ */
+ 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/saxparse/ElementHandlers.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java
new file mode 100644
index 00000000000..64baccd40be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.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.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 String name;
+ private List<IBaseSaxElementListener> listeners = new ArrayList<IBaseSaxElementListener>();
+
+ 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.size() == 0) 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.size() == 0) 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 00000000000..e646939906d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.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;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface IBaseSaxElementListener {
+
+ /**
+ * @param obj
+ */
+ void onStartElement(Object obj);
+
+ /**
+ * @param 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 00000000000..08d95bfa3ee
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.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.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.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.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.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.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;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ *XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ CollectionParser handler = new CollectionParser(collectors);
+ xmlReader.setContentHandler(handler);
+ xmlReader.parse(new InputSource(inputStream));
+ *
+ */
+public class OteSaxHandler extends AbstractSaxHandler {
+
+ Map<String, ElementHandlers> handlers;
+
+ public OteSaxHandler() throws Exception {
+ handlers = new HashMap<String, ElementHandlers>();
+ 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 Qualification());
+ addHandlers(new Requirement());
+ addHandlers(new Result());
+ addHandlers(new RetryGroup());
+ 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 TestPointName());
+ addHandlers(new TestPointResults());
+ addHandlers(new TestScript());
+ addHandlers(new Time());
+ addHandlers(new TimeSummary());
+ addHandlers(new Tracability());
+ addHandlers(new Trace());
+ addHandlers(new Type());
+ addHandlers(new User());
+ addHandlers(new Value());
+ addHandlers(new Version());
+ addHandlers(new VersionInformation());
+ addHandlers(new Witnesses());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ ElementHandlers 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;
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String,
+ * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ ElementHandlers handler = handlers.get(name);
+ if(handler != null){
+ handler.startElementFound(uri, localName, name, attributes);
+ } else {
+ System.out.println(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/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 00000000000..e9fcbb29668
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.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.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{
+
+ /**
+ * @param name
+ */
+ public Actual() {
+ super("Actual");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..4658fd4fb9b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.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.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{
+
+ /**
+ * @param name
+ */
+ public AdditionalInfo() {
+ super("AdditionalInfo");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..8b2edc48b52
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.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.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{
+
+ /**
+ * @param name
+ */
+ public Argument() {
+ super("Argument");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b8d34b853ba
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.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;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class Attention extends ElementHandlers{
+
+ /**
+ * @param name
+ */
+ public Attention() {
+ super("Attention");
+ }
+
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..55c5dcf386a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.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;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class CheckGroup extends ElementHandlers{
+
+ /**
+ * @param name
+ */
+ public CheckGroup() {
+ super("CheckGroup");
+ }
+
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..5b29dcd6b9c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.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.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class CheckGroupData {
+
+ private String mode;
+
+ /**
+ * @return the mode
+ */
+ public String getMode() {
+ return mode;
+ }
+
+ /**
+ * @param name
+ */
+ 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 00000000000..ee48f54fe79
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.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.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{
+
+ /**
+ * @param name
+ */
+ public CheckPoint() {
+ super("CheckPoint");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..a0a6faea50c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.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.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{
+
+ /**
+ * @param name
+ */
+ public Config() {
+ super("Config");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..4097bd7e4b2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.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.framework.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class ConfigData {
+ private String machineName;
+ /**
+ * @return the machineName
+ */
+ public String getMachineName() {
+ return machineName;
+ }
+ /**
+ * @param machineName
+ * @param name
+ */
+ 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 00000000000..61089af2178
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.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.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{
+
+ /**
+ * @param name
+ */
+ public CurrentProcessor() {
+ super("CurrentProcessor");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..5d2f0ecd3f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.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.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{
+
+ /**
+ * @param name
+ */
+ public Debug() {
+ super("Debug");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b5b4cf457e1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.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.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{
+
+ /**
+ * @param name
+ */
+ public ElapsedTime() {
+ super("ElapsedTime");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..f5997053c0c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.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.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{
+
+ /**
+ * @param name
+ */
+ public Environment() {
+ super("Environment");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..ae17455b7bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.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.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 {
+
+ /**
+ * @param name
+ */
+ public ExecutedBy() {
+ super("ExecutedBy");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..20b0de2f3ba
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.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.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{
+
+ /**
+ * @param name
+ */
+ public ExecutionDate() {
+ super("ExecutionDate");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b3c92da9f9b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.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.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{
+
+ /**
+ * @param name
+ */
+ public Expected() {
+ super("Expected");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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/GroupName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java
new file mode 100644
index 00000000000..862b29f1161
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.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.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{
+
+ /**
+ * @param name
+ */
+ public GroupName() {
+ super("GroupName");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..c2280f116a9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.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.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{
+
+ /**
+ * @param name
+ */
+ public Info() {
+ super("Info");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b98df774257
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.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.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class InfoData {
+
+ private String title;
+ /**
+ * @param string
+ * @param name
+ */
+ 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 00000000000..eab1686f87d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.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.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{
+
+ /**
+ * @param name
+ */
+ public InfoGroup() {
+ super("InfoGroup");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..17f14112063
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.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;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class InfoGroupData {
+
+ private String title;
+ /**
+ * @param title
+ * @param name
+ */
+ 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 00000000000..e2c84fb1a63
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.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.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{
+
+ /**
+ * @param name
+ */
+ public Location() {
+ super("Location");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..8f021b01cf7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.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.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{
+
+ /**
+ * @param name
+ */
+ public Message() {
+ super("Message");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..f648d946c1b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.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.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{
+
+ /**
+ * @param name
+ */
+ public MethodArguments() {
+ super("MethodArguments");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..178743ac2d2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.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.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{
+
+ /**
+ * @param name
+ */
+ public MethodName() {
+ super("MethodName");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..378107be6b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.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.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{
+
+ /**
+ * @param name
+ */
+ public Name() {
+ super("Name");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..1ef3216b646
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.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.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 {
+
+ /**
+ * @param name
+ */
+ public Notes() {
+ super("Notes");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..7cc0a63dda0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.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.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{
+
+ /**
+ * @param name
+ */
+ public Number() {
+ super("Number");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..32589904099
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.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.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{
+
+ /**
+ * @param name
+ */
+ public NumberOfTransmissions() {
+ super("NumberOfTransmissions");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b51c032b63f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.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.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{
+
+ /**
+ * @param name
+ */
+ public ObjectName() {
+ super("ObjectName");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..7d0d5ace8e0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.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.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{
+
+ /**
+ * @param name
+ */
+ public OfpErrorEntry() {
+ super("OfpErrorEntry");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..f51c5bab08d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.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.framework.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OfpErrorEntryData {
+
+ private String nodeId;
+ private String count;
+ private String severity;
+ private 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;
+ }
+
+ /**
+ * @param nodeId
+ * @param value2
+ * @param value3
+ * @param value4
+ */
+ 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 00000000000..c5496a0dfbc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.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.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{
+
+ /**
+ * @param name
+ */
+ public OfpLoggingInfo() {
+ super("OfpLoggingInfo");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..6f3df78400f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.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.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{
+
+ /**
+ * @param name
+ */
+ public OteLog() {
+ super("OteLog");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..0d9aab71e87
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.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.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OteLogData {
+
+ private String level;
+ private String logger;
+
+ /**
+ * @param string2
+ * @param string
+ * @param name
+ */
+ 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/Qualification.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java
new file mode 100644
index 00000000000..032e530a019
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.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.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 {
+
+ /**
+ * @param name
+ */
+ public Qualification() {
+ super("Qualification");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..987e7623115
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.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.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class QualificationData {
+
+ private String buildId;
+ private String level;
+
+ /**
+ * @param value
+ * @param value2
+ */
+ 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 00000000000..9c8c3817dd2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.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.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{
+
+ /**
+ * @param name
+ */
+ public Requirement() {
+ super("Requirement");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..7e02ab8e234
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.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.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{
+
+ /**
+ * @param name
+ */
+ public Result() {
+ super("Result");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..fed041c4af0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.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.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{
+
+ /**
+ * @param name
+ */
+ public RetryGroup() {
+ super("RetryGroup");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..40a91d89c81
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.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.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class RetryGroupData {
+
+ private String mode;
+
+ /**
+ * @return the mode
+ */
+ public String getMode() {
+ return mode;
+ }
+
+ /**
+ * @param name
+ */
+ RetryGroupData(String mode) {
+ this.mode = mode;
+ }
+}
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 00000000000..d52585d953f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.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.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{
+
+ /**
+ * @param name
+ */
+ public RuntimeVersions() {
+ super("RuntimeVersions");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..8eae35d2719
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.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.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{
+
+ /**
+ * @param name
+ */
+ public ScriptInit() {
+ super("ScriptInit");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..ebe0a04587e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.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.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{
+
+ /**
+ * @param name
+ */
+ public ScriptName() {
+ super("ScriptName");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..755d793a324
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.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.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{
+
+ /**
+ * @param name
+ */
+ public ScriptResult() {
+ super("ScriptResult");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..8a77a0cc0ff
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.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.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{
+
+ /**
+ * @param name
+ */
+ public ScriptVersion() {
+ super("ScriptVersion");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..c3d810bf6d3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.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.core.framework.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class ScriptVersionData {
+
+ private String lastAuthor;
+ private String lastModified;
+ private String modifiedFlag;
+ private String repositoryType;
+ private String revision;
+ private String url;
+
+ /**
+ * @param string6
+ * @param string5
+ * @param string4
+ * @param string3
+ * @param string2
+ * @param string
+ * @param name
+ */
+ 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 00000000000..9b7ddb464ca
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.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.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 {
+
+ /**
+ * @param name
+ */
+ public SoftKeyInfoGroup() {
+ super("SoftKeyInfoGroup");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..4e0bc67f313
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.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;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SoftKeyInfoGroupData {
+
+ private String title;
+
+ /**
+ * @param title
+ * @param name
+ */
+ 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 00000000000..bf70af3805a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.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.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{
+
+ /**
+ * @param name
+ */
+ public Stacktrace() {
+ super("Stacktrace");
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..db12aa58c45
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.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.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class StacktraceData {
+
+ private String line;
+ private String source;
+
+ /**
+ * @param name
+ */
+ StacktraceData() {
+ }
+
+ /**
+ * @param value
+ * @param value2
+ */
+ 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 00000000000..d49277b0cfd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.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.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{
+
+ /**
+ * @param name
+ */
+ public Summary() {
+ super("Summary");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..7f5e7edba9c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.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.framework.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class SummaryData {
+
+ private String criticalCount;
+ private String exceptionCount;
+ private String informationCount;
+ private String minorCount;
+ private String nodeId;
+ private String seriousCount;
+ private String startNumber;
+
+
+ /**
+ * @param startNumber
+ * @param seriousCount
+ * @param nodeId
+ * @param minorCount
+ * @param informationCount
+ * @param exceptionCount
+ * @param criticalCount
+ * @param name
+ */
+ 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 00000000000..42a036e9bf2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.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.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{
+
+ /**
+ * @param name
+ */
+ public Support() {
+ super("Support");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..a0ad1cdeda4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.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;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class SystemInfo extends ElementHandlers{
+
+ /**
+ * @param name
+ */
+ public SystemInfo() {
+ super("SystemInfo");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..020f831ba70
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class SystemInfoData {
+
+ private String osArch;
+ private String osName;
+ private String osVersion;
+ private String oseeVersion;
+ private 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;
+ }
+ /**
+ * @param osArch
+ * @param osName
+ * @param osVersion
+ * @param oseeVersion
+ * @param 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 00000000000..13cfb85128a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.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.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{
+
+ /**
+ * @param name
+ */
+ public TestCase() {
+ super("TestCase");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..3b549852dcc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.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.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{
+
+ /**
+ * @param name
+ */
+ public TestPoint() {
+ super("TestPoint");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..28139709291
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.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.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{
+
+ /**
+ * @param name
+ */
+ public TestPointName() {
+ super("TestPointName");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..a5bbfa03dbf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.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.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{
+
+ /**
+ * @param name
+ */
+ public TestPointResults() {
+ super("TestPointResults");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..5fa28c27a5c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.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.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TestPointResultsData {
+
+ private 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 String fail;
+ private String pass;
+ private String total;
+
+ /**
+ * @param value
+ * @param value2
+ * @param value3
+ * @param value4
+ */
+ 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 00000000000..d92418c7d46
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.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.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{
+
+ /**
+ * @param name
+ */
+ public TestScript() {
+ super("TestScript");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..debee779bd8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.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.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{
+
+ /**
+ * @param name
+ */
+ public Time() {
+ super("Time");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..5946662da11
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.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.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{
+
+ /**
+ * @param name
+ */
+ public TimeSummary() {
+ super("TimeSummary");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..d055e0ffe2c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TimeSummaryData {
+
+ private 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 String endDate;
+ private String milliseconds;
+ private String startDate;
+ /**
+ * @param elapsed
+ * @param endDate
+ * @param milliseconds
+ * @param 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 00000000000..5c0c7ad22f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.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.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{
+
+ /**
+ * @param name
+ */
+ public Tracability() {
+ super("Tracability");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..e3543679fc4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.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.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{
+
+ /**
+ * @param name
+ */
+ public Trace() {
+ super("Trace");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..9aa567d148c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.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.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{
+
+ /**
+ * @param name
+ */
+ public Type() {
+ super("Type");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..e077628c367
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.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.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{
+
+ /**
+ * @param name
+ */
+ public User() {
+ super("User");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..26b804f75d1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.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.framework.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class UserData{
+
+ private String email;
+ private String id;
+ private String name;
+
+
+ /**
+ * @param name
+ * @param id
+ * @param email
+ * @param 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 00000000000..0cd6bb8d8ab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.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.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{
+
+ /**
+ * @param name
+ */
+ public Value() {
+ super("Value");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b847ea80e7b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.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.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{
+
+ /**
+ * @param name
+ */
+ public Version() {
+ super("Version");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..b98a7624e00
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.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.framework.saxparse.elements;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class VersionData {
+
+ private String name;
+ private String underTest;
+ private String version;
+ private String versionUnit;
+
+ /**
+ * @param versionUnit
+ * @param version
+ * @param underTest
+ * @param name
+ */
+ 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 00000000000..d3d16f28d48
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.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.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{
+
+ /**
+ * @param name
+ */
+ public VersionInformation() {
+ super("VersionInformation");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..a8d3fb2a857
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.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.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 {
+
+ /**
+ * @param name
+ */
+ public Witnesses() {
+ super("Witnesses");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers#createStartElementFoundObject(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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 00000000000..539feb83597
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.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.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);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunListenerDataProvider#createOnPostRun(org.eclipse.osee.ote.core.framework.data.IPropertyStore, org.eclipse.osee.ote.core.TestScript)
+ */
+ public IEventData createOnPostRun(IPropertyStore propertyStore, TestScript test) {
+ return new BaseEvent(propertyStore, test);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunListenerDataProvider#createOnPostTestCase(org.eclipse.osee.ote.core.framework.data.IPropertyStore, org.eclipse.osee.ote.core.TestScript, org.eclipse.osee.ote.core.TestCase)
+ */
+ public IEventData createOnPostTestCase(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+ return new BaseEvent(propertyStore, test, testCase);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunListenerDataProvider#createOnPreRun(org.eclipse.osee.ote.core.framework.data.IPropertyStore, org.eclipse.osee.ote.core.TestScript)
+ */
+ public IEventData createOnPreRun(IPropertyStore propertyStore, TestScript test) {
+ return new BaseEvent(propertyStore, test);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunListenerDataProvider#createOnPreTestCase(org.eclipse.osee.ote.core.framework.data.IPropertyStore, org.eclipse.osee.ote.core.TestScript, org.eclipse.osee.ote.core.TestCase)
+ */
+ 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 00000000000..4afb45f3292
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.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.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<ITestRunListener>();
+ }
+
+ public boolean addTestRunListener(ITestRunListener listener) {
+ return listeners.add(listener);
+ }
+
+ public boolean removeTestRunListener(ITestRunListener listener) {
+ return listeners.remove(listener);
+ }
+
+ public IMethodResult notifyPostRun(IEventData eventData) {
+ MethodResultImpl result = MethodResultImpl.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;
+ }
+
+ public IMethodResult notifyPostTestCase(IEventData eventData) {
+ MethodResultImpl result = MethodResultImpl.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;
+ }
+
+ public IMethodResult notifyPreRun(IEventData eventData) {
+ MethodResultImpl result = MethodResultImpl.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;
+ }
+
+ public IMethodResult notifyPreTestCase(IEventData eventData) {
+ MethodResultImpl result = MethodResultImpl.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 == MethodResultImpl.OK) {
+ result = new MethodResultImpl();
+ }
+ result.setReturnCode(listenerResult.getReturnCode());
+ result.addStatus(listenerResult.getStatus());
+ }
+ return result;
+ }
+
+ /**
+ * Clearing out the listeners.
+ */
+ 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 00000000000..e6f16c7d972
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.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.testrun;
+
+
+public class BaseTestRunListenerProviderFactory implements ITestRunListenerProviderFactory {
+
+ public ITestRunListenerDataProvider createListenerDataProvider() {
+ return new BaseTestRunListenerDataProvider();
+ }
+
+ 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 00000000000..62727365e9a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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;
+
+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;
+ }
+
+ public boolean abort() {
+ if(test != null){
+ test.abort();
+ }
+ aborted = true;
+ if (testRunThread != null) {
+ return testRunThread.abort();
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunManager#run(org.eclipse.osee.ote.core.framework.data.IPropertyStore)
+ */
+ public IMethodResult run(IPropertyStore propertyStore, TestEnvironment environment) {
+ IMethodResult result = MethodResultImpl.OK;
+ if( aborted )
+ {
+ aborted = false;
+ MethodResultImpl methodresult = new MethodResultImpl();
+ methodresult.setReturnCode(ReturnCode.ABORTED);
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "USER ABORTED"));
+ result = methodresult;
+ return result;
+ }
+ try {
+ testRunThread = new TestRunThread(propertyStore, test, environment, listenerProvider, dataProvider);
+ testRunThread.start();
+ testRunThread.join();
+ result = testRunThread.getResult();
+ } catch (Exception e) {
+ MethodResultImpl methodresult = new MethodResultImpl();
+ methodresult.setReturnCode(ReturnCode.ERROR);
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, e));
+ result = methodresult;
+ logException(e, "Exception setting up run thread:");
+ } finally {
+ aborted = false;
+ testRunThread = null;
+ }
+ return result;
+ }
+
+ public TestScript getTest() {
+ return test;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunManager#dispose()
+ */
+ public IMethodResult dispose() {
+ MethodResultImpl result = MethodResultImpl.OK;
+ try{
+ this.test.disposeTest();
+ this.dataProvider = null;
+ this.listenerProvider.clear();
+ this.listenerProvider = null;
+ this.test = null;
+ } catch (Exception e){
+ result = new MethodResultImpl();
+ result.setReturnCode(ReturnCode.ERROR);
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, e));
+ logException(e, "Exception in dispose:");
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.core.framework.testrun.ITestRunManager#initialize(org.eclipse.osee.ote.core.framework.data.IPropertyStore)
+ */
+ public IMethodResult initialize(TestEnvironment env, IPropertyStore propertyStore) {
+ MethodResultImpl result = MethodResultImpl.OK;
+ try{
+ aborted = false;
+ this.dataProvider = testRunListenerProviderFactory.createListenerDataProvider();
+ this.listenerProvider = testRunListenerProviderFactory.createRunListenerProvider();
+ this.test = testFactory.createInstance(env, propertyStore);
+ this.test.setListenerProvider(listenerProvider);
+ } catch (Exception e){
+ result = new MethodResultImpl();
+ result.setReturnCode(ReturnCode.ERROR);
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, e));
+ logException(e, "Exception initializing script:");
+ }
+ return result;
+ }
+
+ /**
+ * @param e
+ */
+ private void logException(Exception e, String message) {
+ OseeLog.log(this.getClass().getName(),
+ "org.eclipse.osee.ote.core",
+ Level.SEVERE, message, e);
+ }
+
+ public boolean abort(Throwable th, boolean wait) {
+ if(test != null){
+ test.abort();
+ }
+ aborted = true;
+ if (testRunThread != null) {
+ return testRunThread.abort(th, wait);
+ }
+ return true;
+ }
+
+ public boolean isAborted(){
+ return aborted;
+ }
+}
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 00000000000..94f074e4254
--- /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 00000000000..7af89ab272b
--- /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 00000000000..3d783f4fe30
--- /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 00000000000..1a7cd8683a8
--- /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 00000000000..7326f7ce7ce
--- /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 00000000000..9c2d6d9de78
--- /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 00000000000..5b90c452027
--- /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 00000000000..49c0b962989
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.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.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();
+}
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 00000000000..7358bc127e5
--- /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.concurrent.locks.ReentrantLock;
+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;
+
+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 ReentrantLock lock = new ReentrantLock();
+ private ResultBuilder rb = new ResultBuilder(false);
+
+ /**
+ * @param propertyStore
+ * @param test2
+ * @param env
+ * @param listenerProvider
+ * @param dataProvider
+ */
+ 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)));
+ //todo we need to make it so that the setup and teardown test casees get added to the list.... from the getTestCases() method
+ //we also need to make sure script initialization gets added through a prerun listener
+ if(rb.isReturnStatusOK()){
+ List<TestCase> testCases = test.getTestCases();
+ for (TestCase testCase : testCases) {
+ if (abort)
+ {
+ addAbortResult(null);
+ break;
+ }
+ rb.append(listenerProvider.notifyPreTestCase(dataProvider.createOnPreTestCase(propertyStore, test, testCase)));
+ lock.lock();
+ 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();
+ methodresult.setReturnCode(ReturnCode.ERROR);
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+ rb.append(methodresult);
+ OseeLog.log(this.getClass().getName(),
+ "org.eclipse.osee.ote.core",
+ Level.SEVERE,
+ "Exception running Test Case [" + testCase != null ? testCase.getClass().getName() : "uknown (null test case)" + "]",
+ ex );
+ }
+ } finally {
+ lock.unlock();
+ }
+ rb.append(listenerProvider.notifyPostTestCase(dataProvider.createOnPostTestCase(propertyStore, test, testCase)));
+ }
+ }
+ } finally {
+ rb.append(listenerProvider.notifyPostRun(dataProvider.createOnPostRun(propertyStore, test)));
+ }
+ }
+
+ /**
+ *
+ */
+ private void addAbortResult(Throwable th) {
+ if( rb.isReturnStatusOK() )
+ {
+ MethodResultImpl methodresult = new MethodResultImpl();
+ methodresult.setReturnCode(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 (lock.isLocked()) {
+ // test case is in process
+ this.interrupt();
+ }
+ try {
+ this.join(60000);
+
+ 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;
+ }
+ } catch (InterruptedException ex) {
+ OseeLog.reportStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "Failed to wait for abort to complete successfully.", ex));
+ 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);
+ }
+ //
+ if (lock.isLocked()) {
+ // test case is in process
+ this.interrupt();
+ }
+ return true;
+ }
+
+
+/**
+ * @return
+ */
+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 00000000000..add930bb711
--- /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 00000000000..b8f37cc663c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.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.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 List<WeakReference<OteThread>> threads;
+ private String threadName;
+
+ protected OteThreadFactory(String threadName) {
+ this.threadName = threadName;
+ this.threads = new CopyOnWriteArrayList<WeakReference<OteThread>>();
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ */
+ 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<OteThread>();
+ 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 00000000000..534000dad4a
--- /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 Map<String, OteThreadFactory> factories;
+
+ private OteThreadManager() {
+ this.factories = new HashMap<String, OteThreadFactory>();
+ }
+
+ 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 00000000000..5806b21e6bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OteProperties;
+import org.eclipse.osee.ote.core.StandardShell;
+import org.eclipse.osee.ote.core.cmd.CommandDistributer;
+import org.eclipse.osee.ote.core.cmd.CommandDistributerImpl;
+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.environment.interfaces.RuntimeConfigurationInitilizer;
+import org.eclipse.osee.ote.core.environment.interfaces.RuntimeLibraryListener;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.environment.status.StatusBoard;
+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, RuntimeLibraryListener {
+
+ private ServiceRegistration statusBoardRegistration;
+ private ServiceRegistration testEnvironmentRegistration;
+ private OTEStatusBoard statusBoard;
+ CommandDistributer commandDistributer;
+ private static Activator activator;
+ private BundleContext bundleContext;
+ private List<RuntimeConfigurationInitilizer> initializersToUninitialize = new ArrayList<RuntimeConfigurationInitilizer>();
+ private CompositeKeyHashMap<String, ServiceTrackerCustomizer, ServiceTracker> serviceTrackers = new CompositeKeyHashMap<String, ServiceTrackerCustomizer, ServiceTracker>();
+ private ConsoleCommandManager consoleCommandManager;
+ private StandardShell stdShell;
+ private ServiceRegistration consoleCommandRegistration;
+ private ServiceRegistration commandDistributerRegistration;
+
+ public void start(BundleContext context) throws Exception {
+ activator = this;
+ statusBoard = new StatusBoard();
+ bundleContext = context;
+ statusBoardRegistration = context.registerService(OTEStatusBoard.class.getName(),statusBoard, new Hashtable());
+ consoleCommandManager = new ConsoleCommandManager();
+ if (OteProperties.isOteCmdConsoleEnabled()) {
+ stdShell = new StandardShell(consoleCommandManager);
+ stdShell.start();
+ } else {
+ stdShell = null;
+ }
+ consoleCommandRegistration = context.registerService(ICommandManager.class.getName(), consoleCommandManager, new Hashtable());
+
+ commandDistributer = new CommandDistributerImpl();
+ commandDistributerRegistration = context.registerService(CommandDistributer.class.getName(), commandDistributer, new Hashtable());
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ commandDistributer.shutdown();
+ closeAllValidServiceTrackers();
+ statusBoardRegistration.unregister();
+ unregisterTestEnvironment();
+ stopRuntimeServices();
+ if (stdShell != null) {
+ stdShell.shutdown();
+ }
+ consoleCommandManager.shutdown();
+ consoleCommandRegistration.unregister();
+ commandDistributerRegistration.unregister();
+
+ }
+
+ public static Activator getInstance(){
+ return activator;
+ }
+
+ public OTEStatusBoard getOteStatusBoard(){
+ return statusBoard;
+ }
+
+ public CommandDistributer getCommandDistributer(){
+ return commandDistributer;
+ }
+
+ public void registerTestEnvironment(TestEnvironment env){
+ if(testEnvironmentRegistration != null){
+ testEnvironmentRegistration.unregister();
+ }
+ testEnvironmentRegistration = bundleContext.registerService(TestEnvironmentInterface.class.getName(), env, new Hashtable());
+ }
+
+ public void onPostRuntimeLibraryUpdated(ClassLoader classloader) {
+ TestEnvironmentInterface env = (TestEnvironmentInterface)getServiceTracker(TestEnvironmentInterface.class.getName(), null).getService();
+ String className = env.getEnvironmentFactory().getRuntimeLibraryConfiguration();
+ try {
+ Class<RuntimeConfigurationInitilizer> clazz = (Class<RuntimeConfigurationInitilizer>)classloader.loadClass(className).asSubclass(RuntimeConfigurationInitilizer.class);
+ RuntimeConfigurationInitilizer initilizer = clazz.newInstance();
+ initializersToUninitialize.add(initilizer);
+ initilizer.startRuntimeOsgiServices(bundleContext);
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Failure to start the runtime OTE osgi services.", ex);
+ for (IUserSession session : env.getUserSessions()) {
+ try {
+ session.initiateInformationalPrompt("Server initialization failed");
+ } catch (Exception e) {
+ OseeLog.log(Activator.class, Level.SEVERE, "could not initiate prompt.", e);
+ }
+
+ }
+ }
+ if (env != null && env instanceof TestEnvironment){
+ ((TestEnvironment)env).waitForWorkerThreadsToComplete();
+ }
+ }
+
+ public void onRuntimeLibraryUnload() {
+ stopRuntimeServices();
+ }
+
+ private void stopRuntimeServices(){
+ for(RuntimeConfigurationInitilizer initializer:initializersToUninitialize){
+ initializer.stopRuntimeOsgiServices();
+ }
+ initializersToUninitialize.clear();
+ }
+
+ /**
+ *
+ */
+ public void unregisterTestEnvironment() {
+ if(testEnvironmentRegistration != null){
+ testEnvironmentRegistration.unregister();
+ testEnvironmentRegistration = null;
+ }
+ }
+
+ /**
+ * @param clazz
+ * @param customizer
+ */
+ 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();
+ }
+ }
+ }
+}
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 00000000000..06fad081dd7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.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.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;
+ }
+
+ /**
+ * @param handlerType
+ * @param level
+ */
+ 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/ITestPointTally.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java
new file mode 100644
index 00000000000..3eb5216516b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.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;
+
+
+/**
+ * @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 00000000000..e9a5728344d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.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.core.log;
+
+import java.io.File;
+import java.io.IOException;
+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.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+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.w3c.dom.Document;
+import org.w3c.dom.Element;
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class ScriptLogHandler extends Handler {
+ private TestEnvironment testEnvironment;
+ protected Element testCaseElement;
+ protected Element parent;
+ protected Element child;
+ private OutputFormat format;
+ protected Element testScriptElement;
+ protected Element scriptInitElement;
+ protected Document document;
+ private File outFile;
+ private 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.
+ * @param string
+ */
+ public ScriptLogHandler(File outFile, TestEnvironment testEnvironment) {
+ super();
+ this.testEnvironment = testEnvironment;
+ this.outFile = outFile;
+ OseeLog.log(TestEnvironment.class, Level.FINE, outFile.getAbsolutePath());
+
+ try {
+ document = Jaxp.newDocument();
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+ }
+
+ // create an XMLOutputter that indents using 3 spaces and uses newlines
+ format = new OutputFormat(document);
+ format.setLineSeparator("\n");
+ format.setIndenting(true);
+ format.setIndent(3);
+
+ Jaxp.setXslProperty(document, getXSLTransformName());
+
+ records = new ArrayList<LogRecord>();
+
+ 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 {
+ if (testEnvironment.getTestScript() != null) {
+ testScriptElement.insertBefore(document.createComment(testEnvironment.getTestScript().getOutfileComment()),
+ testScriptElement.getFirstChild());
+ }
+ Jaxp.writeXmlDocument(document, outFile, format);
+ } catch (TransformerException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+ } catch (IOException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.util.logging.Handler#publish(java.util.logging.LogRecord)
+ */
+
+ public synchronized void publish(LogRecord logRecord) {
+ if (isLoggable(logRecord)) {
+ records.add(logRecord);
+ }
+ }
+
+ public synchronized void flushRecords() {
+ for (int i = 0; i < records.size(); i++) {
+ LogRecord 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 {
+
+ if (record instanceof TraceRecord) {
+ if (((TraceRecord) record).getStartFlag()) { // method began
+ parent.appendChild(child);
+ parent = child;
+ } else { // method ended
+ if (parent.getParentNode() != null) {
+ parent = (Element) parent.getParentNode();
+ }
+ }
+ } else {
+ parent.appendChild(child);
+ }
+ }
+ }
+ } 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);
+ }
+ }
+ }
+ records.clear();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.util.logging.Handler#close()
+ */
+ public void close() throws SecurityException {
+ writeOutFile();
+ }
+
+ /*
+ * (non-Javadoc) don't call this method
+ *
+ * @see java.util.logging.Handler#flush()
+ */
+ 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 00000000000..2607b891570
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.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.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 00000000000..39b95955831
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.ote.core.MethodFormatter;
+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.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.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.
+ */
+ 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.
+ */
+ 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.
+ */
+ 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.
+ */
+ 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.
+ */
+ 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).
+ * @param thrown
+ */
+ public void severe(Object source, Throwable thrown) {
+ throwing(source.getClass().getName(), null, thrown);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.environment.interfaces.ITestLogger#testpoint(osee.test.core.environment.interfaces.ITestEnvironmentAccessor,
+ * osee.test.core.TestScript, osee.test.core.TestCase, boolean, java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ 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));
+ }
+
+ public void testpoint(TestPointRecord record) {
+ log(record);
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.environment.interfaces.ITestLogger#testpoint(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, osee.test.core.TestScript, osee.test.core.TestCase, osee.test.core.environment.interfaces.ITestPoint)
+ */
+ 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.
+ */
+ 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).
+ * @param objectName
+ * @param methodName
+ * @param methodArguments
+ * @param startFlag
+ */
+ public void trace(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments,
+ boolean startFlag) {
+ log(new TraceRecord(source, objectName, methodName, methodArguments, startFlag));
+ }
+
+ /**
+ * 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).
+ */
+ 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.
+ */
+ 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, true);
+ }
+
+ /**
+ * 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.
+ */
+ 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.
+ */
+ 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, true);
+ }
+
+ /**
+ * 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).
+ */
+ public void methodEnded(ITestEnvironmentAccessor source) {
+ trace(source, "", "", new MethodFormatter(), false);
+ }
+
+ public void log(TestRecord record) {
+ this.log((LogRecord) record);
+ }
+
+ 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);
+ log(record);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/package.html
new file mode 100644
index 00000000000..a2529340fc1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/package.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides for logging capabilities within the test enviornment.
+
+
+<h2>Related Documentation</h2>
+
+For overviews, tutorials, examples, guides, and tool documentation, please see:
+<ul>
+ <li>Refer to the OSEE Team generated information included in the eclipse help subsystem.
+ <li><a href="http://java.sun.com/docs/white/langenv/index.html">White Paper - The Java Language Enviornment.</a>
+ <li><a href="http://java.sun.com/docs/books/tutorial/java/index.html">Trail - Learning The Java Language.</a>
+</ul>
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ 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 00000000000..daeff1decf0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.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.log.record;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @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);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/BaseTestRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/BaseTestRecord.java
new file mode 100644
index 00000000000..1d26e8d68b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/BaseTestRecord.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.core.log.record;
+
+import java.util.Date;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+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.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public abstract class BaseTestRecord extends LogRecord implements BaseTestTags, Xmlizable {
+ private Object source;
+ private long timeStamp;
+ private boolean printTimeStamp;
+
+ /**
+ * 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.
+ */
+ public BaseTestRecord(ITestEnvironmentAccessor source, Level level, String msg, boolean timeStamp) {
+ super(level, msg);
+
+ this.printTimeStamp = timeStamp;
+
+ if (timeStamp) {
+ if (source != null) {
+ if (source instanceof TestEnvironment) {
+ TestEnvironment env = (TestEnvironment) source;
+ this.timeStamp = System.currentTimeMillis() - (env.getTestScript().getStartTime().getTime());
+ }
+ } else {
+ this.timeStamp = (new Date()).getTime();
+ System.out.println("source was null?");
+ try {
+ throw new Exception("source was null");
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class,
+ Level.SEVERE, e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Converts log element to XML format.
+ *
+ * @return xml formated element.
+ */
+ public Element toXml(Document doc) {
+ Element recordElement = doc.createElement(getLevel().getName());
+
+ if (this.printTimeStamp) {
+ Element timeElement = doc.createElement(BaseTestTags.TIME_FIELD);
+ timeElement.setTextContent(Long.toString(this.timeStamp));
+
+ recordElement.appendChild(timeElement);
+ }
+ Element msgElement = doc.createElement(BaseTestTags.MESSAGE_FIELD);
+ msgElement.setTextContent(getMessage());
+
+ recordElement.appendChild(msgElement);
+ additionalXml(recordElement);
+ return recordElement;
+ }
+
+ /**
+ * This method is to be overriden by subclasses of TestRecord that wish to log additional information to the XML
+ * destination.
+ *
+ * @param baseElement This is the element that is being submitted by TestRecord for toXml().
+ */
+ protected void additionalXml(//@SuppressWarnings("unused")
+ Element baseElement) {
+ // This is intended to be overridden by subclasses that
+ // want to supply additional XML information.
+ }
+
+ public Object getSource() {
+ return source;
+ }
+
+ public long getTimeStamp() {
+ return this.timeStamp;
+ }
+
+ public boolean isTimeStampAvailable() {
+ return this.printTimeStamp;
+ }
+
+} \ 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 00000000000..e749a3a69ed
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.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.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 00000000000..5791c5765d3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.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.log.record;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.logging.Level;
+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 String executionResult;
+ private String executionMessage;
+ private 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();
+ }
+
+ 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;
+ }
+}
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 00000000000..581a13138c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.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.log.record;
+
+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);
+ }
+} \ 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 00000000000..2ba7f5bf826
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.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.core.log.record;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.logging.Level;
+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.
+ */
+ 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;
+ }
+
+ 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;
+
+ }
+} \ 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 00000000000..781d13dbf4f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.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.core.log.record;
+
+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 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;
+ }
+
+ 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"));
+ }
+
+} \ 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 00000000000..ae2867d0b29
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.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.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.logging.OseeLog;
+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 List<Xmlizable> childElements;
+ /**
+ * 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<Xmlizable>(1000);
+ }
+
+ public void addChildElement(Xmlizable xml){
+ childElements.add(xml);
+ }
+
+ /**
+ * Convert an element to XML format.
+ *
+ * @return XML formated config element.
+ */
+ public Element toXml(Document doc) {
+ Element result = doc.createElement("ScriptResult");
+ for(Xmlizable xml:childElements){
+ result.appendChild(xml.toXml(doc));
+ }
+ childElements.clear();
+ return result;
+ }
+} \ 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 00000000000..1edb14f92df
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.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 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 00000000000..f7951d80a08
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.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.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 00000000000..2448b54cc6c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.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.core.log.record;
+
+
+import java.util.logging.Level;
+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 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.
+ */
+ public Element toXml(Document doc) {
+ return testCase.toXml(doc);
+ }
+} \ 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 00000000000..505d40e6a96
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.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.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 BaseTestRecord{
+
+ 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;
+ }
+
+ 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 00000000000..2d0b394006c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.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.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+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 testPointNumber;
+ 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.testPointNumber = 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 script
+ * @param testCase
+ * @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);
+ }
+
+ /**
+ * 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);
+ }
+
+ /**
+ * @return Returns the testPoint.
+ */
+ public int getTestPointNumber() {
+ return testPointNumber;
+ }
+
+ /**
+ * @param testPointNumber
+ */
+ public void setTestPointNumber(int testPointNumber) {
+ this.testPointNumber = testPointNumber;
+ }
+
+ /**
+ * Converts element to XML formating.
+ *
+ * @return Element XML formated element.
+ */
+ public Element toXml(Document doc) {
+ Element tpElement = doc.createElement("TestPoint");
+ tpElement.appendChild(Jaxp.createElement(doc, "Number", String.valueOf(testPointNumber)));
+ 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;
+ }
+} \ 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 00000000000..17df224024b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.Level;
+import java.util.logging.LogRecord;
+import java.util.regex.Pattern;
+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.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Michael A. Winston
+ */
+public abstract class TestRecord extends LogRecord implements Xmlizable {
+ private static boolean filterTheStacktrace = true;
+
+ private static final ArrayList<Pattern> stacktraceExcludes = new ArrayList<Pattern>(32);
+ private static final ArrayList<Pattern> stacktraceIncludes = new ArrayList<Pattern>(32);
+
+ static {
+ filterTheStacktrace = (System.getProperty("org.eclipse.osee.ote.core.noStacktraceFilter") == null);
+ stacktraceExcludes.add(Pattern.compile("org\\.eclipse\\.osee\\..*"));
+ }
+
+ private final ITestEnvironmentAccessor source;
+ private long timeStamp;
+ private 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);
+ }
+ }
+ }
+ }
+
+ 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 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.
+ */
+ public Element toXml(Document doc) {
+ Element recordElement = doc.createElement(getLevel().getName());
+ recordElement.appendChild(getLocation(doc));
+ recordElement.appendChild(Jaxp.createElement(doc, "Message", getMessage()));
+
+ for (Xmlizable object : getAdditionalXml()) {
+ recordElement.appendChild(object.toXml(doc));
+ }
+ return recordElement;
+ }
+
+ /**
+ * This method is to be overriden by subclasses of TestRecord that wish to log additional information to the XML
+ * destination.
+ *
+ * @param baseElement This is the element that is being submitted by TestRecord for toXml().
+ */
+ protected List<Xmlizable> getAdditionalXml() {
+ // This is intended to be overridden by subclasses that
+ // want to supply additional XML information.
+ return new ArrayList<Xmlizable>(0);
+ }
+
+ 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;
+ }
+} \ No newline at end of file
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 00000000000..cd0cd047de3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.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.core.log.record;
+
+import java.util.ArrayList;
+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.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 String objectName;
+ private String methodName;
+ private MethodFormatter methodArguments;
+ private boolean startFlag;
+ private ArrayList<Xmlizable> additionalElements;
+
+ private static final String additionalString = "AdditionalInfo";
+
+ /**
+ * TraceRecord Constructor. Sets up a Trace log message.
+ *
+ * @param source The object requesting the logging.
+ * @param objectName
+ * @param methodName
+ * @param methodArguments
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ * @param startFlag
+ */
+ public TraceRecord(ITestEnvironmentAccessor source, String objectName, String methodName,
+ MethodFormatter methodArguments, boolean timeStamp, boolean startFlag) {
+ super(source, TestLevel.TRACE, "", timeStamp);
+ this.objectName = objectName;
+ this.methodName = methodName;
+ this.methodArguments = methodArguments;
+ this.startFlag = startFlag;
+ this.additionalElements = new ArrayList<Xmlizable>();
+ }
+
+ /**
+ * TraceRecord Constructor. Sets up a Trace log message.
+ *
+ * @param source The object requesting the logging.
+ * @param objectName
+ * @param methodName
+ * @param methodArguments
+ * @param startFlag
+ */
+ public TraceRecord(ITestEnvironmentAccessor source, String objectName, String methodName,
+ MethodFormatter methodArguments, boolean startFlag) {
+ this(source, objectName, methodName, methodArguments, true, startFlag);
+ }
+
+ /**
+ * Get the start flag.
+ *
+ * @return <b>true</b> if its the beginning of a method, or <b>false</b> if its the end of a
+ * method.
+ */
+ public boolean getStartFlag() {
+ return startFlag;
+ }
+
+ public void addAdditionalElement(Xmlizable object) {
+ if (object != null)
+ additionalElements.add(object);
+ }
+
+ /**
+ * Converts element to XML formating.
+ *
+ * @return Element XML formated element.
+ */
+ 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));
+ }
+ }
+ trElement.appendChild(getLocation(doc));
+ return trElement;
+ }
+} \ 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 00000000000..99f27acac7c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.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.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/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/package.html
new file mode 100644
index 00000000000..059e4a7fe46
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/package.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides for the recording of specific types of events in the logs.
+
+
+<h2>Related Documentation</h2>
+
+For overviews, tutorials, examples, guides, and tool documentation, please see:
+<ul>
+ <li>Refer to the OSEE Team generated information included in the eclipse help subsystem.
+ <li><a href="http://java.sun.com/docs/white/langenv/index.html">White Paper - The Java Language Enviornment.</a>
+ <li><a href="http://java.sun.com/docs/books/tutorial/java/index.html">Trail - Learning The Java Language.</a>
+</ul>
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
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 00000000000..b86c30202ce
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.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.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;
+ @SuppressWarnings("unchecked")
+ void init(TestEnvironment testEnvironment, ModelKey key) throws RemoteException;
+ ModelState getState() throws RemoteException;
+ @SuppressWarnings("unchecked")
+ <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 00000000000..1c42d704c8a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.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.model;
+
+import java.util.Collection;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface IModelKeyFactory {
+ @SuppressWarnings("unchecked")
+ 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 00000000000..5e9b651de16
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.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.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+@SuppressWarnings("unchecked")
+/**
+ * @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 00000000000..0c12232f8fa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.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.model;
+
+import java.rmi.RemoteException;
+import java.util.List;
+@SuppressWarnings("unchecked")
+/**
+ * @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 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);
+ void destroy();
+}
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 00000000000..dad7957dca8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.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.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.List;
+@SuppressWarnings("unchecked")
+/**
+ * @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 00000000000..02723ac7dfc
--- /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 00000000000..9c82ded1ee6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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;
+
+@SuppressWarnings("unchecked")
+/**
+ * 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
+ * @param <M>
+ */
+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;
+
+ /**
+ * @param className
+ */
+ public ModelKey(String className) {
+ this(className, null, null);
+ }
+
+ public ModelKey(ModelKey key)
+ {
+ this( key.className, key.name, null);
+ }
+
+ /**
+ * @param className
+ * @param name
+ */
+ public ModelKey(Class<M> clazz) {
+ this(clazz.getCanonicalName(),null, clazz);
+ }
+
+ /**
+ * @param className
+ * @param name
+ */
+ public ModelKey(Class<M> clazz, String name) {
+ this(clazz.getCanonicalName(),name, clazz);
+ }
+
+
+ /**
+ * @param className
+ * @param name
+ * @param modelClass
+ */
+ 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;
+ }
+
+ public boolean equals(Object obj)
+ {
+ return getClassName().equals(((ModelKey)obj).getClassName());
+ }
+
+ public int hashCode()
+ {
+ return getClassName().hashCode();
+ }
+
+ public int compareTo(Object o ) {
+ if( !(o instanceof ModelKey))
+ return -1;
+
+ ModelKey otherKey = (ModelKey)o;
+ return this.getName().compareTo(otherKey.getName());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelManager.java
new file mode 100644
index 00000000000..c097ea0ae07
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelManager.java
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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.lang.ref.WeakReference;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import javax.security.auth.Destroyable;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+import org.eclipse.osee.ote.core.framework.DestroyableService;
+
+@SuppressWarnings("unchecked")
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ModelManager implements IModelManager, DestroyableService {
+
+ private List<IModelListener> modelListeners;
+ private Map<ModelKey, List<IModelListener>> modelListenerMap;
+ private Map<ModelKey, IModel> models;
+ private List<ModelKey> registeredModels;
+ private Map<ModelKey, Integer> referenceCountOfModels;
+ private WeakReference<TestEnvironment> testEnvironment;
+
+ private final class ModelInfoCmd extends ConsoleCommand {
+
+ protected ModelInfoCmd() {
+ super("modinfo", "lists information about all currently running models");
+ }
+
+ @Override
+ protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+ for (Map.Entry<ModelKey, IModel> entry : models.entrySet()) {
+ try {
+ println(String.format("%s: state=%s", entry.getKey().getName(), entry.getValue().getState().name()));
+ } catch (Exception e) {
+ println("exception while getting model info for " + entry.getKey().getName());
+ printStackTrace(e);
+ }
+ }
+ }
+
+ }
+
+ public ModelManager(TestEnvironment testEnvironment) {
+ this.testEnvironment = new WeakReference<TestEnvironment>(testEnvironment);
+ models = new HashMap<ModelKey, IModel>();
+ registeredModels = new ArrayList<ModelKey>();
+ referenceCountOfModels = new HashMap<ModelKey, Integer>();
+ modelListeners = new ArrayList<IModelListener>();
+ modelListenerMap = new HashMap<ModelKey, List<IModelListener>>();
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.message.IModelManager#getModel(osee.test.core.message.ModelKey)
+ */
+ public <CLASSTYPE extends IModel> CLASSTYPE getModel(ModelKey<CLASSTYPE> key) {
+ if (models.containsKey(key)) {
+ referenceCountOfModels.put(key, referenceCountOfModels.get(key).intValue() + 1);
+ return (CLASSTYPE) models.get(key);
+ } else {
+ CLASSTYPE model = null;
+ try {
+ model = createModel(key);
+ } catch (Exception e) {
+ this.testEnvironment.get().getLogger().severe("COULD NOT CREATE MODEL:\n" + e);
+ OseeLog.log(TestEnvironment.class,
+ Level.SEVERE, e.getMessage(), e);
+ }
+
+ return model;
+ }
+ }
+
+ private IModel findModel(ModelKey key) {
+ return models.get(findModelKey(models.keySet(), key));
+ }
+
+ private ModelKey findModelKey(Collection<ModelKey> list, ModelKey key) {
+ for (ModelKey current : list) {
+ if (current.equals(key)) return current;
+ }
+ return null;
+ }
+
+ // private void incrementReferenceCount(ModelKey key)
+ // {
+ // ModelKey realKey = findModelKey(referenceCountOfModels.keySet(), key);
+ // referenceCountOfModels.put(realKey, referenceCountOfModels.get(key).intValue() + 1);
+ // }
+ //
+ // private void decrementReferenceCount(ModelKey key)
+ // {
+ // ModelKey realKey = findModelKey(referenceCountOfModels.keySet(), key);
+ // referenceCountOfModels.put(realKey, referenceCountOfModels.get(key).intValue() -1);
+ // }
+ //
+ // private Integer getReferenceCount(ModelKey key)
+ // {
+ // ModelKey realKey = findModelKey(referenceCountOfModels.keySet(), key);
+ // return referenceCountOfModels.get(realKey);
+ // }
+
+ /**
+ * @param <CLASSTYPE>
+ * @param key
+ * @return IModel
+ * @throws ClassNotFoundException
+ * @throws IllegalAccessException
+ * @throws InstantiationException
+ * @throws RemoteException
+ */
+ private <CLASSTYPE extends IModel> CLASSTYPE createModel(ModelKey<CLASSTYPE> key) throws ClassNotFoundException, InstantiationException, IllegalAccessException, RemoteException {
+ if (key == null) {
+ throw new IllegalArgumentException("key cannot be null");
+ }
+ notifyModelPreCreate(key);
+ CLASSTYPE model = (CLASSTYPE) key.getModelClass().newInstance();
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(key.getModelClass().getClassLoader());
+ model.init(testEnvironment.get(), key);
+ referenceCountOfModels.put(key, 1);
+ models.put(key, model);
+ this.registerModel(key);
+ notifyModelPostCreate(key);
+ return model;
+ } finally {
+ Thread.currentThread().setContextClassLoader(loader);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.message.IModelManager#addModelActivityManager(osee.test.core.message.IModelListener)
+ */
+ public void addModelActivityListener(IModelListener listener) {
+ if(listener == null){
+ OseeLog.log(ModelManager.class, Level.SEVERE, "null listener was being added to model managerl");
+ } else {
+ if (!collectionContainsListener(modelListeners, listener)) {
+ modelListeners.add(listener);
+ } else {
+ }
+ }
+ }
+
+ /**
+ * @param modelListeners2
+ * @param listener
+ * @return
+ */
+ private boolean collectionContainsListener(List<IModelListener> collection, IModelListener listener) {
+ try {
+ for (IModelListener current : collection) {
+ if (current.getHashCode() == listener.getHashCode()) return true;
+ }
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ }
+ return false;
+ }
+
+ public void addModelActivityListener(IModelListener listener, ModelKey key) {
+ if (listener == null) {
+ Exception e = new NullPointerException();
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ return;
+ }
+ if (modelListenerMap.containsKey(key)) {
+ if (!collectionContainsListener(modelListenerMap.get(key), listener)) {
+ modelListenerMap.get(key).add(listener);
+ }
+ } else {
+ List<IModelListener> newList = new ArrayList<IModelListener>();
+ newList.add(listener);
+ modelListenerMap.put(key, newList);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.model.IModelManager#removeModelActivityListener(osee.test.core.model.IModelListener)
+ */
+ public void removeModelActivityListener(IModelListener listener) {
+ try {
+ Iterator<IModelListener> iter = modelListeners.iterator();
+ while (iter.hasNext()) {
+ if (iter.next().getHashCode() == listener.getHashCode()) iter.remove();
+ }
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.model.IModelManager#removeModelActivityListener(osee.test.core.model.IModelListener)
+ */
+ public void removeModelActivityListener(IModelListener listener, ModelKey key) {
+ try {
+ if (modelListenerMap.containsKey(key)) {
+ List<IModelListener> list = modelListenerMap.get(key);
+ Iterator<IModelListener> iter = list.iterator();
+ while (iter.hasNext()) {
+ if (iter.next().getHashCode() == listener.getHashCode()) iter.remove();
+ }
+ }
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.message.IModelManager#disposeModel(osee.test.core.message.ModelKey)
+ */
+ public <CLASSTYPE extends IModel> void disposeModel(ModelKey key) {
+ IModel localModel = findModel(key);
+ // referenceCountOfModels.remove(findModelKey(referenceCountOfModels.keySet(),key));
+ referenceCountOfModels.remove(key);
+ models.remove(key);
+ try {
+ localModel.dispose();
+
+ notifyModelDispose(localModel.getKey());
+ } catch (RemoteException ex) {
+ throw new TestException("Could Not dispose of the model " + localModel + ":\n" + ex, Level.WARNING);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.message.IModelManager#getRegisteredModels()
+ */
+ public List<ModelKey> getRegisteredModels() {
+ return registeredModels;
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.message.IModelManager#releaseReference(osee.test.core.message.IModel)
+ */
+ public void releaseReference(IModel model) {
+ try {
+ if (models.containsKey(model.getKey())) {
+ referenceCountOfModels.put(model.getKey(), referenceCountOfModels.get(model.getKey()).intValue() - 1);
+ // decrementReferenceCount(model.getKey());
+ if (referenceCountOfModels.get(model.getKey()).intValue() <= 0) {
+ disposeModel(model.getKey());
+ }
+ }
+ } catch (RemoteException ex) {
+ throw new TestException("Could not release reference to " + model + ":\n" + ex, Level.WARNING);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.model.IModelManager#releaseAllReferences(osee.test.core.model.ModelKey)
+ */
+ public void releaseAllReferences(ModelKey key) {
+ if (!models.containsKey(key)) return;
+
+ referenceCountOfModels.remove(key);
+ disposeModel(key);
+
+ }
+
+ public void releaseReference(ModelKey key) {
+ if (models.containsKey(key)) this.releaseReference(models.get(key));
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.message.IModelManager#registerModel(osee.test.core.message.ModelKey)
+ */
+ public <CLASSTYPE extends IModel> void registerModel(ModelKey key) {
+ ModelKey cleanKey = new ModelKey(key);
+ if (!registeredModels.contains(cleanKey)) {
+ registeredModels.add(cleanKey);
+ }
+ // else {
+ // throw new TestException(String.format("[%s] is already registered to this model manager.", key.toString()), Level.WARNING);
+ // }
+ }
+
+ private <CLASSTYPE extends IModel> void notifyModelPreCreate(ModelKey key) throws RemoteException {
+ ModelKey cleanKey = new ModelKey(key);
+ for (IModelListener listener : modelListeners) {
+ listener.onModelPreCreate(cleanKey);
+ }
+
+ if (modelListenerMap.containsKey(cleanKey)) {
+ for (IModelListener listener : modelListenerMap.get(cleanKey))
+ listener.onModelPreCreate(cleanKey);
+ }
+ }
+
+ private <CLASSTYPE extends IModel> void notifyModelPostCreate(ModelKey key) throws RemoteException {
+ ModelKey cleanKey = new ModelKey(key);
+ for (IModelListener listener : modelListeners) {
+ listener.onModelPostCreate(cleanKey);
+ }
+
+ if (modelListenerMap.containsKey(cleanKey)) {
+ for (IModelListener listener : modelListenerMap.get(cleanKey))
+ listener.onModelPostCreate(cleanKey);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.model.IModelManager#updateModelActivityListener(osee.test.core.model.ModelKey, boolean)
+ */
+ public void notifyModeStateListener(ModelKey key, ModelState state) throws RemoteException {
+ ModelKey cleanKey = new ModelKey(key);
+ for (IModelListener listener : modelListeners) {
+ listener.onModelStateChange(cleanKey, state);
+ }
+
+ if (modelListenerMap.containsKey(cleanKey)) {
+ for (IModelListener listener : modelListenerMap.get(cleanKey))
+ listener.onModelStateChange(cleanKey, state);
+ }
+ }
+
+ private <CLASSTYPE extends IModel> void notifyModelDispose(ModelKey key) throws RemoteException {
+ ModelKey cleanKey = new ModelKey(key);
+ for (IModelListener listener : modelListeners) {
+ listener.onModelDispose(cleanKey);
+ }
+
+ if (modelListenerMap.containsKey(cleanKey)) {
+ for (IModelListener listener : modelListenerMap.get(cleanKey))
+ listener.onModelDispose(cleanKey);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.model.IModelManager#changeModelTaskState(osee.test.core.model.ModelKey, boolean)
+ */
+ public void changeModelState(ModelKey key, ModelState state) {
+ try {
+ if (state == ModelState.PAUSED) {
+ if (models.containsKey(key)) getModel(key).turnModelOff();
+ } else if (state == ModelState.RUNNING) {
+ getModel(key).turnModelOn();
+ } else
+ this.releaseAllReferences(key);
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ e.getMessage(), e);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.model.IModelManager#getModelState(osee.test.core.model.ModelKey)
+ */
+ public ModelState getModelState(ModelKey key) throws RemoteException {
+ if (models.containsKey(key))
+ return models.get(key).getState();
+ else
+ return ModelState.DISPOSED;
+ }
+
+ public void destroy(){
+ for(ModelKey modelKey :registeredModels){
+ releaseAllReferences(modelKey);
+ }
+ modelListeners.clear();
+ modelListenerMap.clear();
+ models.clear();
+ registeredModels.clear();
+ referenceCountOfModels.clear();
+ }
+
+}
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 00000000000..7c257d4ab7a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.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.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/model/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/package.html
new file mode 100644
index 00000000000..67b5adc7e5e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/package.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+<h1>Model Overview</h1>
+
+<p>
+Models in the OTE environment are intended to be java objects that 'model' some aspect
+of the test environment needed by the Unit Under Test. Most likely this will be an
+external device that communicates with the unit under test so that different scenarios
+can be recreated and tested.
+</p>
+<p>
+OTE provides management capabilities for models so that they can be easily accessed from both
+Java test programs and GUI's in the testers workbench.
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/package.html b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/package.html
new file mode 100644
index 00000000000..8d73ccdfda7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/package.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<title>OSEE Test Environment Overview</title>
+</head>
+<body bgcolor="white">
+
+<h1>OSEE Test Environment (OTE) Overview</h1>
+
+<p>
+OTE provides a framework for the testing of complex software systems. The test environment manages models, messages, remote communication, and logging.
+</p>
+
+<p>
+Environments provide the core configuration of the tests, there is generally a 1 to 1 mapping between environments and labs. Generally, tests are written which set input and check output against the unit under test. These tests are sent to the Test Environment which then will coordinate with the unit under test to run the submitted test, or set the requested input.
+</p>
+
+</body>
+</html> \ No newline at end of file
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 00000000000..24754d2c7f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.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.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 InputStream in;
+
+ private PrintStream out;
+
+ private InputBufferThread inputBuffer;
+
+// private String prompt = "$ ";
+
+ /**
+ * Connects telnet to the specified ipAddress and port
+ *
+ * @throws IOException
+ * @throws SocketException
+ */
+ 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
+ * @throws InterruptedException
+ */
+ 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
+ * @throws InterruptedException
+ */
+ 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 00000000000..8bcf47f5c54
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * 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);
+ private boolean done = false;
+
+ 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 (!done) {
+ in.read(buffer);
+ buffer.flip();
+ out.write(buffer);
+ buffer.compact();
+ }
+ } catch (IOException e) {
+ e.printStackTrace(System.err);
+ }
+ }
+ }
+
+ private TelnetClient telnet;
+ private InputStream in;
+ private OutputStream out;
+ private InputBufferThread inputBuffer;
+ private String prompt = "$ ";
+ private int currentOutput = 0;
+
+ /**
+ * Connects telnet to the specified ipAddress and port
+ *
+ * @param ipAddress
+ * @param port
+ * @throws IOException
+ * @throws SocketException
+ */
+ 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("\n".getBytes("us-ascii"));
+ out.flush();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ /**
+ * 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
+ * @throws InterruptedException
+ */
+ 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
+ * @return Returns the whole buffer up to the prompt
+ * @throws InterruptedException
+ */
+ 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");
+ int port = Integer.parseInt(reader.readLine());
+ 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();
+ }
+
+ 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);
+ }
+ }
+ }
+ }
+}
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 00000000000..5c6b2dd8ae6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.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.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 REQUIREMENT_ID_FIELD = "RequirementId";
+
+ 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 00000000000..ed520fc2eb4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.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.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 00000000000..f493287b31a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, 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 org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+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 String groupName;
+ private ArrayList<ITestPoint> testPoints;
+ private 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<ITestPoint>();
+ // this.allTrue = allTrue;
+ this.operation = operation;
+ this.groupName = groupName;
+ }
+
+ public CheckGroup add(ITestPoint testPoint) {
+ this.testPoints.add(testPoint);
+
+ return this;
+ }
+
+ public ArrayList<ITestPoint> getTestPoints() {
+ return testPoints;
+ }
+
+ /**
+ * @return The number of test points added to this check group so far
+ */
+ public int size() {
+ return this.testPoints.size();
+ }
+
+ 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;
+ }
+
+ public Element toXml(Document doc) {
+ return buildXml(doc, "CheckGroup");
+ }
+
+ 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;
+ }
+
+} \ 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 00000000000..7f457a894a5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.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.testPoint;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+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.
+ */
+ 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("") ? " " : this.convertNonPrintableCharacers(expected);
+ this.actual = actual.equals("") ? " " : this.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);
+ }
+ /**
+ * @return Returns the actual.
+ */
+ public String getActual() {
+ return actual;
+ }
+
+ /**
+ * @return Returns the expected.
+ */
+ public String getExpected() {
+ return expected;
+ }
+
+ /**
+ * @return Returns the pass.
+ */
+ public boolean isPass() {
+ return pass;
+ }
+
+
+ public void setExpected(String expected) {
+ this.expected = expected;
+ }
+
+ 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;
+ }
+
+ /**
+ * @return the elpasedTime
+ */
+ public long getElpasedTime() {
+ return elpasedTime;
+ }
+
+ /**
+ * @return the numTransmissions
+ */
+ public int getNumTransmissions() {
+ return numTransmissions;
+ }
+
+ private String convertNonPrintableCharacers( String message)
+ {
+ StringBuffer buff = new StringBuffer();
+ char currentChar;
+ for( int i = 0 ; i < message.length() ; i++ )
+ {
+ currentChar = message.charAt(i);
+ if( currentChar < 32 || currentChar > 126 )
+ {
+ buff.append(" ASCII=" + (int)currentChar + " ");
+ } else if (currentChar == '<'){
+ buff.append(" less-than ");
+ } else if (currentChar == '>'){
+ buff.append(" greater-than ");
+ } else if (currentChar == '&'){
+ buff.append(" ampersand ");
+ }
+ else
+ buff.append(currentChar);
+ }
+
+ return buff.toString();
+ }
+} \ 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 00000000000..40b112959c0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.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.testPoint;
+
+import javax.print.attribute.EnumSyntax;
+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);
+ }
+
+ public static Operation toEnum(String str) {
+ return (Operation) getEnum(str, stringTable, enumValueTable);
+ }
+
+ protected static Operation toEnum(int value) {
+ return (Operation) getEnum(value, enumValueTable);
+ }
+
+ protected String[] getStringTable() {
+ return stringTable;
+ }
+
+ 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/testPoint/RetryGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java
new file mode 100644
index 00000000000..3c4b31cf858
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.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.testPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RetryGroup extends CheckGroup {
+ ArrayList<Xmlizable> childElements;
+
+ public RetryGroup(String groupName) {
+ super(Operation.OR, groupName);
+ childElements = new ArrayList<Xmlizable>();
+
+ }
+
+ public Element toXml(Document doc) {
+ Element retVal = buildXml(doc, "RetryGroup");
+
+ for (Xmlizable object : childElements) {
+ retVal.appendChild(object.toXml(doc));
+ }
+ return retVal;
+ }
+
+ public void addChildElement(Xmlizable child) {
+ childElements.add(child);
+ }
+
+ public void addChildren(List<Xmlizable> children) {
+ childElements.addAll(children);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/support/overview.html b/org.eclipse.osee.ote.core/support/overview.html
new file mode 100644
index 00000000000..b1ea37a150b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/support/overview.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+This is the API specification for the OSEE Development System
+
+<h2>Related Documentation</h2>
+
+For overviews, tutorials, examples, guides, and tool documentation, please see:
+<ul>
+ <li>Refer to the OSEE Team generated information included in the eclipse help subsystem.
+ <li><a href="http://java.sun.com/docs/white/langenv/index.html">White Paper - The Java Language Enviornment.</a>
+ <li><a href="http://java.sun.com/docs/books/tutorial/java/index.html">Trail - Learning The Java Language.</a>
+ <li><a href="http://java.sun.com/j2se/javadoc/writingdoccomments/">How to Write Doc Comments.</a>
+</ul>
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/.classpath b/org.eclipse.osee.ote.define/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.define/.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.define/.project b/org.eclipse.osee.ote.define/.project
new file mode 100644
index 00000000000..d91fc9e4a6d
--- /dev/null
+++ b/org.eclipse.osee.ote.define/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.define</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.define/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.define/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..f4ace18e974
--- /dev/null
+++ b/org.eclipse.osee.ote.define/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Define Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.define;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.define.OteDefinePlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.core.filebuffers,
+ org.eclipse.core.filesystem,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.skynet.core
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.define,
+ org.eclipse.osee.ote.define.AUTOGEN,
+ org.eclipse.osee.ote.define.artifacts,
+ org.eclipse.osee.ote.define.jobs,
+ org.eclipse.osee.ote.define.operations,
+ org.eclipse.osee.ote.define.parser,
+ org.eclipse.osee.ote.define.parser.handlers,
+ org.eclipse.osee.ote.define.utilities
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.ote.define/build.properties b/org.eclipse.osee.ote.define/build.properties
new file mode 100644
index 00000000000..1e8a0318fac
--- /dev/null
+++ b/org.eclipse.osee.ote.define/build.properties
@@ -0,0 +1,11 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/,\
+ support/
+src.includes = plugin.xml,\
+ images/,\
+ META-INF/,\
+ support/ \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/plugin.xml b/org.eclipse.osee.ote.define/plugin.xml
new file mode 100644
index 00000000000..b95c523c4ba
--- /dev/null
+++ b/org.eclipse.osee.ote.define/plugin.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="OutfileParser" name="OutfileParser" schema="schema/OutfileParser.exsd"/>
+ <extension
+ id="OseeTypesOTE"
+ name="OseeTypesOTE"
+ point="org.eclipse.osee.framework.skynet.core.OseeTypes">
+ <ExcelFile
+ file="support/OseeTypes_OTE.xml">
+ </ExcelFile>
+ </extension>
+ <extension
+ id="MappedAttributeDataProvider"
+ name="MappedAttributeDataProvider"
+ point="org.eclipse.osee.framework.skynet.core.AttributeDataProvider">
+ <BinaryAttributeDataProvider
+ class="org.eclipse.osee.ote.define.artifacts.MappedAttributeDataProvider">
+ </BinaryAttributeDataProvider>
+ </extension>
+ <extension
+ id="OteOutfileParser"
+ point="org.eclipse.osee.ote.define.OutfileParser">
+ <OutfileParser
+ classname="org.eclipse.osee.ote.define.parser.OteOutfileParser"
+ supportedExtensions="tmo">
+ </OutfileParser>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.define/schema/OutfileParser.exsd b/org.eclipse.osee.ote.define/schema/OutfileParser.exsd
new file mode 100644
index 00000000000..7b3076cf9b1
--- /dev/null
+++ b/org.eclipse.osee.ote.define/schema/OutfileParser.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.define" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ote.define" id="OutfileParser" name="OutfileParser"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="OutfileParser"/>
+ </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="OutfileParser">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.osee.ote.define.parser.BaseOutfileParser:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="supportedExtensions" type="string" use="required">
+ <annotation>
+ <documentation>
+ Can be a list separated by &quot;;&quot;
+ </documentation>
+ </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.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ARTIFACTS.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ARTIFACTS.java
new file mode 100644
index 00000000000..7a575c4fb69
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ARTIFACTS.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.define.AUTOGEN;
+
+import org.eclipse.osee.framework.skynet.core.ISkynetType;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+
+public enum OTE_SKYNET_ARTIFACTS implements ISkynetType {
+ TEST_RUN(Requirements.TEST_RUN), TEST_SCRIPT(Requirements.TEST_CASE);
+
+ private String name;
+
+ private OTE_SKYNET_ARTIFACTS(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ATTRIBUTES.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ATTRIBUTES.java
new file mode 100644
index 00000000000..cc9ce03065f
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_ATTRIBUTES.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.define.AUTOGEN;
+
+import org.eclipse.osee.framework.skynet.core.ISkynetType;
+
+public enum OTE_SKYNET_ATTRIBUTES implements ISkynetType {
+ BUILD_ID("Build Id"),
+ CHECKSUM("Checksum"),
+ ELAPSED_DATE("Elapsed Date"),
+ END_DATE("End Date"),
+ EXTENSION("Extension"),
+ FAILED("Failed"),
+ IS_BATCH_MODE_ALLOWED("Is Batch Mode Allowed"),
+ LAST_AUTHOR("Last Author"),
+ LAST_DATE_UPLOADED("Last Date Uploaded"),
+ LAST_MODIFIED_DATE("Last Modified Date"),
+ MODIFIED_FLAG("Modified Flag"),
+ OSEE_SERVER_JAR_VERSION("OSEE Server Jar Version"),
+ OSEE_SERVER_TITLE("OSEE Server Title"),
+ OSEE_VERSION("OSEE Version"),
+ OS_ARCHITECTURE("OS Architecture"),
+ OS_NAME("OS Name"),
+ OS_VERSION("OS Version"),
+ OUTFILE_URL("Outfile URL"),
+ PASSED("Passed"),
+ PROCESSOR_ID("Processor ID"),
+ QUALIFICATION_LEVEL("Qualification Level"),
+ RAN_IN_BATCH_MODE("Ran In Batch Mode"),
+ REVISION("Revision"),
+ SCRIPT_ABORTED("Script Aborted"),
+ START_DATE("Start Date"),
+ TEST_SCRIPT_GUID("Test Script GUID"),
+ TEST_SCRIPT_URL("Test Script URL"),
+ TOTAL_TEST_POINTS("Total Test Points"),
+ USER_ID("User ID");
+
+ private String name;
+
+ private OTE_SKYNET_ATTRIBUTES(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_RELATIONS.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_RELATIONS.java
new file mode 100644
index 00000000000..4ff2d704af6
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/AUTOGEN/OTE_SKYNET_RELATIONS.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.define.AUTOGEN;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeTypeDoesNotExist;
+import org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration;
+import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
+import org.eclipse.osee.framework.skynet.core.relation.RelationSide;
+import org.eclipse.osee.framework.skynet.core.relation.RelationType;
+import org.eclipse.osee.framework.skynet.core.relation.RelationTypeManager;
+
+public enum OTE_SKYNET_RELATIONS implements IRelationEnumeration {
+ TEST_SCRIPT_TO_RUN_RELATION__TEST_SCRIPT(RelationSide.SIDE_A, "Test Script to Run Relation"),
+ TEST_SCRIPT_TO_RUN_RELATION__TEST_RUN(RelationSide.SIDE_B, "Test Script to Run Relation");
+ private final RelationSide relationSide;
+
+ private String typeName;
+
+ private OTE_SKYNET_RELATIONS(RelationSide relationSide, String typeName) {
+ this.relationSide = relationSide;
+ this.typeName = typeName;
+ }
+
+ /**
+ * @return Returns the sideName.
+ */
+ public boolean isSideA() {
+ return relationSide.isSideA();
+ }
+
+ public String getSideName() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return getRelationType().getSideName(relationSide);
+ }
+
+ /**
+ * @return Returns the typeName.
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public RelationType getRelationType() throws OseeTypeDoesNotExist, OseeDataStoreException {
+ return RelationTypeManager.getType(typeName);
+ }
+
+ public boolean isThisType(RelationLink link) {
+ return link.getRelationType().getTypeName().equals(typeName);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.relation.IRelationEnumeration#getSide()
+ */
+ @Override
+ public RelationSide getSide() {
+ return relationSide;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/OteDefinePlugin.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/OteDefinePlugin.java
new file mode 100644
index 00000000000..b81b1c1ab34
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/OteDefinePlugin.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.define;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class OteDefinePlugin extends OseeUiActivator {
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.define";
+
+ public OteDefinePlugin() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunField.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunField.java
new file mode 100644
index 00000000000..9361baa078d
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunField.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.define;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum TestRunField {
+
+ INVALID,
+ USER_ID,
+ USER_NAME,
+ SCRIPT_NAME,
+
+ SCRIPT_REVISION,
+ SCRIPT_MODIFIED_FLAG,
+ SCRIPT_LAST_AUTHOR,
+ SCRIPT_LAST_MODIFIED,
+ SCRIPT_URL,
+
+ SYSTEM_OS_ARCH,
+ SYSTEM_OS_NAME,
+ SYSTEM_OS_VERSION,
+ SYSTEM_OSEE_VERSION,
+ SYSTEM_OSEE_SERVER_TITLE,
+ SYSTEM_OSEE_SERVER_JAR_VERSIONS,
+
+ PROCESSOR_ID,
+ SCRIPT_START_DATE,
+ SCRIPT_END_DATE,
+ SCRIPT_ELAPSED_TIME,
+ SCRIPT_EXECUTION_TIME,
+ SCRIPT_EXECUTION_RESULTS,
+ SCRIPT_EXECUTION_ERRORS,
+
+ TEST_POINTS_PASSED,
+ TEST_POINTS_FAILED,
+ TOTAL_TEST_POINTS,
+ TEST_ABORT_STATUS,
+
+ QUALIFICATION_LEVEL,
+ BUILD_ID,
+
+ IS_BATCH_MODE_ALLOWED,
+ RAN_IN_BATCH_MODE;
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunStorageKey.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunStorageKey.java
new file mode 100644
index 00000000000..65afede8f8b
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/TestRunStorageKey.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.define;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunStorageKey {
+ public static final String STORAGE_ENABLED = "test.run.upload.enabled";
+ public static final String SELECTED_BRANCH_ID = "last.branch.id";
+ public static final String BRANCH_IDS = "all.branches.id";
+
+ private TestRunStorageKey() {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/MappedAttributeDataProvider.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/MappedAttributeDataProvider.java
new file mode 100644
index 00000000000..2797d9e77e9
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/MappedAttributeDataProvider.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.define.artifacts;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeDataStoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.jdk.core.util.HttpProcessor.AcquireResult;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.AbstractAttributeDataProvider;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.ICharacterAttributeDataProvider;
+import org.eclipse.osee.framework.skynet.core.attribute.utils.AttributeURL;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class MappedAttributeDataProvider extends AbstractAttributeDataProvider implements ICharacterAttributeDataProvider {
+ private String localUri;
+ private String remoteUri;
+ private IFile backingFile;
+
+ public MappedAttributeDataProvider(Attribute<?> attribute) {
+ super(attribute);
+ this.remoteUri = null;
+ this.localUri = null;
+ this.backingFile = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#getData()
+ */
+ @Override
+ public Object[] getData() throws OseeDataStoreException {
+ return new Object[] {"", remoteUri};
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#getDisplayableString()
+ */
+ @Override
+ public String getDisplayableString() {
+ return isFromLocalWorkspace() ? this.localUri : "Remote Content";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#loadData(java.lang.Object[])
+ */
+ @Override
+ public void loadData(Object... objects) throws OseeCoreException {
+ if (objects != null && objects.length > 1) {
+ remoteUri = (String) objects[1];
+ }
+ }
+
+ private String getOutfileName() throws OseeCoreException {
+ StringBuilder builder = new StringBuilder();
+ TestRunOperator operator = new TestRunOperator(getAttribute().getArtifact());
+ builder.append(operator.getDescriptiveName());
+ builder.append(".");
+ builder.append(operator.getChecksum());
+ builder.append(".");
+ String extension = operator.getOutfileExtension();
+ if (!Strings.isValid(extension)) {
+ extension = getAttribute().getAttributeType().getFileTypeExtension();
+ }
+ builder.append(extension);
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#persist()
+ */
+ @Override
+ public void persist(int storageId) throws OseeCoreException {
+ try {
+ if (isFromLocalWorkspace()) {
+ InputStream inputStream = null;
+ try {
+ URI sourceUri = new URI(localUri);
+ inputStream = sourceUri.toURL().openStream();
+ byte[] compressed = Lib.compressStream(inputStream, getOutfileName());
+ URL url =
+ AttributeURL.getStorageURL(storageId, getAttribute().getArtifact().getHumanReadableId(), "zip");
+ URI uri = HttpProcessor.save(url, new ByteArrayInputStream(compressed), "applization/zip", "ISO-8859-1");
+ if (uri != null) {
+ this.remoteUri = uri.toASCIIString();
+ this.localUri = null;
+ }
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+ } catch (OseeCoreException ex) {
+ throw ex; // keep exceptions of type OseeCoreException from being unnecessarily wrapped
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#purge()
+ */
+ @Override
+ public void purge() throws OseeCoreException {
+ try {
+ if (isRemoteUriValid()) {
+ URL url = AttributeURL.getAcquireURL(remoteUri);
+ String response = HttpProcessor.delete(url);
+ if (response != null && response.equals("Deleted: " + remoteUri)) {
+ remoteUri = null;
+ if (isBackingFileValid()) {
+ backingFile.delete(true, null);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider#setDisplayableString(java.lang.String)
+ */
+ @Override
+ public void setDisplayableString(String toDisplay) {
+ // Do Nothing
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.attribute.providers.ICharacterAttributeDataProvider#getValueAsString()
+ */
+ @Override
+ public String getValueAsString() throws OseeCoreException {
+ if (isRemoteUriValid() && isBackingFileValid() != true) {
+ try {
+ this.backingFile = requestRemoteFile();
+ this.localUri = null;
+ } catch (Exception ex) {
+ OseeLog.log(OteDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ String toReturn = this.localUri;
+ if (isBackingFileValid()) {
+ toReturn = backingFile.getLocationURI().toASCIIString();
+ }
+ return toReturn;
+ }
+
+ private boolean isBackingFileValid() {
+ return backingFile != null && backingFile.isAccessible();
+ }
+
+ public boolean setValue(String value) throws OseeCoreException {
+ // DO NOTHING
+ return false;
+ }
+
+ private IFile requestRemoteFile() throws Exception {
+ IFile file = null;
+ ByteArrayOutputStream downloadStream = new ByteArrayOutputStream();
+ URL url = AttributeURL.getAcquireURL(remoteUri);
+ AcquireResult results = HttpProcessor.acquire(url, downloadStream);
+ if (results.wasSuccessful()) {
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(downloadStream.toByteArray()));
+ ZipEntry entry = zipInputStream.getNextEntry();
+
+ file = OseeData.getIFile(entry.getName(), zipInputStream, true);
+ }
+ return file;
+ }
+
+ protected void setLocalUri(String localUri) {
+ this.localUri = localUri;
+ }
+
+ private boolean isRemoteUriValid() {
+ return remoteUri != null && remoteUri.length() > 0;
+ }
+
+ private boolean isFromLocalWorkspace() {
+ boolean toReturn = isRemoteUriValid() != true;
+ try {
+ toReturn |= new TestRunOperator(getAttribute().getArtifact()).isFromLocalWorkspace();
+ } catch (Exception ex) {
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteArtifactFetcher.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteArtifactFetcher.java
new file mode 100644
index 00000000000..3c2fb79cb0d
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteArtifactFetcher.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.define.artifacts;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.MultipleArtifactsExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.AUTOGEN.OTE_SKYNET_ARTIFACTS;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteArtifactFetcher<T extends Artifact> {
+ private OTE_SKYNET_ARTIFACTS oteArtifactType;
+
+ protected OteArtifactFetcher(OTE_SKYNET_ARTIFACTS oteArtifactType) {
+ this.oteArtifactType = oteArtifactType;
+ }
+
+ /**
+ * Creates a new Artifact in the specified branch
+ *
+ * @param branch
+ * @throws OseeCoreException
+ */
+ public T getNewArtifact(Branch branch) throws OseeCoreException {
+ checkForNull(branch);
+ return (T) ArtifactTypeManager.addArtifact(oteArtifactType.getName(), branch);
+ }
+
+ /**
+ * Retrieves a unique artifact matching input parameter
+ *
+ * @param typeName Attribute type name
+ * @param value attribute value to match
+ * @param branch to search in
+ * @return the unique artifact
+ * @throws MultipleArtifactsExist
+ * @throws ArtifactDoesNotExist
+ */
+ @SuppressWarnings("unchecked")
+ public T searchForUniqueArtifactMatching(String attributeTypeName, String attributeValue, Branch branch) throws OseeCoreException {
+ checkForNull(attributeTypeName);
+ checkForNull(attributeValue);
+ checkForNull(branch);
+ return (T) ArtifactQuery.getArtifactFromTypeAndAttribute(oteArtifactType.getName(), attributeTypeName,
+ attributeValue, branch);
+ }
+
+ /**
+ * Returns all artifact instances found in branch matching the type <b>T</b>
+ *
+ * @param branch to search in
+ * @return artifact instances
+ * @throws OseeArgumentException
+ */
+ @SuppressWarnings("unchecked")
+ public Set<T> getAllArtifacts(Branch branch) throws OseeArgumentException {
+ checkForNull(branch);
+ Set<T> toReturn = new HashSet<T>();
+ try {
+ Collection<Artifact> artifacts = ArtifactQuery.getArtifactsFromType(oteArtifactType.getName(), branch);
+ for (Artifact artifact : artifacts) {
+ toReturn.add((T) artifact);
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OteDefinePlugin.class, Level.WARNING, String.format("Search for all artifacts failed [%s, %s]",
+ oteArtifactType.getName(), branch.getBranchName()), ex);
+ }
+ return toReturn;
+ }
+
+ /**
+ * Returns all artifact instances found in branch matching the type <b>T</b> Results are indexed by artifact
+ * descriptive name.
+ *
+ * @param branch to search in
+ * @return artifact instances indexed by descriptive name
+ * @throws OseeArgumentException
+ */
+ public Map<String, T> getAllArtifactsIndexedByName(Branch branch) throws OseeArgumentException {
+ Map<String, T> toReturn = new HashMap<String, T>();
+ Set<T> testScripts = getAllArtifacts(branch);
+ for (T artifact : testScripts) {
+ toReturn.put(artifact.getDescriptiveName(), artifact);
+ }
+ return toReturn;
+ }
+
+ private void checkForNull(Object object) throws OseeArgumentException {
+ if (object == null) {
+ throw new OseeArgumentException("Object was null");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteToAttributeMap.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteToAttributeMap.java
new file mode 100644
index 00000000000..f7866ca9265
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/OteToAttributeMap.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.define.artifacts;
+
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.define.TestRunField;
+import org.eclipse.osee.ote.define.AUTOGEN.OTE_SKYNET_ATTRIBUTES;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteToAttributeMap {
+ private static final SimpleDateFormat scriptStartEndDataFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
+ private static final SimpleDateFormat lastModifiedFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
+
+ private static OteToAttributeMap instance = null;
+ private static Map<TestRunField, String> outfileFieldToAttributeMap;
+
+ private OteToAttributeMap() {
+ outfileFieldToAttributeMap = new HashMap<TestRunField, String>();
+
+ outfileFieldToAttributeMap.put(TestRunField.USER_ID, OTE_SKYNET_ATTRIBUTES.USER_ID.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_REVISION, OTE_SKYNET_ATTRIBUTES.REVISION.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_MODIFIED_FLAG, OTE_SKYNET_ATTRIBUTES.MODIFIED_FLAG.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_LAST_AUTHOR, OTE_SKYNET_ATTRIBUTES.LAST_AUTHOR.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_LAST_MODIFIED,
+ OTE_SKYNET_ATTRIBUTES.LAST_MODIFIED_DATE.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_URL, OTE_SKYNET_ATTRIBUTES.TEST_SCRIPT_URL.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.SYSTEM_OS_ARCH, OTE_SKYNET_ATTRIBUTES.OS_ARCHITECTURE.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SYSTEM_OS_NAME, OTE_SKYNET_ATTRIBUTES.OS_NAME.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SYSTEM_OS_VERSION, OTE_SKYNET_ATTRIBUTES.OS_VERSION.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SYSTEM_OSEE_VERSION, OTE_SKYNET_ATTRIBUTES.OSEE_VERSION.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SYSTEM_OSEE_SERVER_TITLE,
+ OTE_SKYNET_ATTRIBUTES.OSEE_SERVER_TITLE.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SYSTEM_OSEE_SERVER_JAR_VERSIONS,
+ OTE_SKYNET_ATTRIBUTES.OSEE_SERVER_JAR_VERSION.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.PROCESSOR_ID, OTE_SKYNET_ATTRIBUTES.PROCESSOR_ID.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_START_DATE, OTE_SKYNET_ATTRIBUTES.START_DATE.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_END_DATE, OTE_SKYNET_ATTRIBUTES.END_DATE.getName());
+ outfileFieldToAttributeMap.put(TestRunField.SCRIPT_ELAPSED_TIME, OTE_SKYNET_ATTRIBUTES.ELAPSED_DATE.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.TEST_POINTS_PASSED, OTE_SKYNET_ATTRIBUTES.PASSED.getName());
+ outfileFieldToAttributeMap.put(TestRunField.TEST_POINTS_FAILED, OTE_SKYNET_ATTRIBUTES.FAILED.getName());
+ outfileFieldToAttributeMap.put(TestRunField.TOTAL_TEST_POINTS, OTE_SKYNET_ATTRIBUTES.TOTAL_TEST_POINTS.getName());
+ outfileFieldToAttributeMap.put(TestRunField.TEST_ABORT_STATUS, OTE_SKYNET_ATTRIBUTES.SCRIPT_ABORTED.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.QUALIFICATION_LEVEL,
+ OTE_SKYNET_ATTRIBUTES.QUALIFICATION_LEVEL.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.BUILD_ID, OTE_SKYNET_ATTRIBUTES.BUILD_ID.getName());
+
+ outfileFieldToAttributeMap.put(TestRunField.IS_BATCH_MODE_ALLOWED,
+ OTE_SKYNET_ATTRIBUTES.IS_BATCH_MODE_ALLOWED.getName());
+ outfileFieldToAttributeMap.put(TestRunField.RAN_IN_BATCH_MODE, OTE_SKYNET_ATTRIBUTES.RAN_IN_BATCH_MODE.getName());
+
+ // outfileFieldToAttributeMap.put(TestRunField.SCRIPT_EXECUTION_TIME,
+ // OTE_SKYNET_ATTRIBUTES.EgetName());
+ // outfileFieldToAttributeMap.put(TestRunField.SCRIPT_EXECUTION_RESULTS,
+ // OTE_SKYNET_ATTRIBUTES.getName());
+ // outfileFieldToAttributeMap.put(TestRunField.SCRIPT_EXECUTION_ERRORS,
+ // OTE_SKYNET_ATTRIBUTES.getName());
+ }
+
+ public static OteToAttributeMap getInstance() {
+ if (instance == null) {
+ instance = new OteToAttributeMap();
+ }
+ return instance;
+ }
+
+ public String getAttributeName(String rawName) {
+ TestRunField field = getFieldId(rawName);
+ return outfileFieldToAttributeMap.get(field);
+ }
+
+ private TestRunField getFieldId(String name) {
+ TestRunField field = TestRunField.INVALID;
+ try {
+ field = TestRunField.valueOf(name);
+ } catch (Exception ex) {
+ field = TestRunField.INVALID;
+ }
+ return field;
+ }
+
+ public Object asTypedObject(String attribute, String value) throws Exception {
+ Object toReturn = null;
+ if (isDate(attribute) != false) {
+ toReturn = getFormat(attribute).parse(value);
+ } else if (isInteger(attribute) != false) {
+ if (Strings.isValid(value) != true) {
+ value = "0";
+ }
+ toReturn = new Integer(value);
+ } else if (isBoolean(attribute) != false) {
+ if (Strings.isValid(value) != true) {
+ value = "false";
+ }
+ toReturn = new Boolean(value);
+ } else {
+ toReturn = value;
+ }
+ return toReturn;
+ }
+
+ private SimpleDateFormat getFormat(String attribute) {
+ SimpleDateFormat toReturn = scriptStartEndDataFormat;
+ if (attribute.equals(OTE_SKYNET_ATTRIBUTES.LAST_MODIFIED_DATE.getName())) {
+ toReturn = lastModifiedFormat;
+ }
+ return toReturn;
+ }
+
+ private boolean isDate(String attribute) {
+ return attribute.equals(OTE_SKYNET_ATTRIBUTES.LAST_MODIFIED_DATE.getName()) || attribute.equals(OTE_SKYNET_ATTRIBUTES.START_DATE.getName()) || attribute.equals(OTE_SKYNET_ATTRIBUTES.END_DATE.getName());
+ }
+
+ private boolean isInteger(String attribute) {
+ return attribute.equals(OTE_SKYNET_ATTRIBUTES.TOTAL_TEST_POINTS.getName()) || attribute.equals(OTE_SKYNET_ATTRIBUTES.PASSED.getName()) || attribute.equals(OTE_SKYNET_ATTRIBUTES.FAILED.getName());
+ }
+
+ private boolean isBoolean(String attribute) {
+ return attribute.equals(OTE_SKYNET_ATTRIBUTES.SCRIPT_ABORTED.getName()) || attribute.equals(OTE_SKYNET_ATTRIBUTES.RAN_IN_BATCH_MODE.getName()) || attribute.equals(OTE_SKYNET_ATTRIBUTES.IS_BATCH_MODE_ALLOWED.getName());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/TestRunOperator.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/TestRunOperator.java
new file mode 100644
index 00000000000..49f15de94e2
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/artifacts/TestRunOperator.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ote.define.artifacts;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Date;
+import java.util.List;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeWrappedException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.attribute.Attribute;
+import org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider;
+import org.eclipse.osee.ote.define.AUTOGEN.OTE_SKYNET_ARTIFACTS;
+import org.eclipse.osee.ote.define.AUTOGEN.OTE_SKYNET_ATTRIBUTES;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunOperator {
+ private static final OteArtifactFetcher<Artifact> TEST_RUN_ARTIFACT_FETCHER =
+ new OteArtifactFetcher<Artifact>(OTE_SKYNET_ARTIFACTS.TEST_RUN);
+
+ private static final OteArtifactFetcher<Artifact> TEST_SCRIPT_ARTIFACT_FETCHER =
+ new OteArtifactFetcher<Artifact>(OTE_SKYNET_ARTIFACTS.TEST_SCRIPT);
+
+ private Artifact artifact;
+
+ public TestRunOperator(Artifact artifact) throws OseeArgumentException {
+ checkForNull(artifact);
+ checkForType(artifact);
+ this.artifact = artifact;
+ }
+
+ private void checkForNull(Artifact artifact) throws OseeArgumentException {
+ if (artifact == null) {
+ throw new OseeArgumentException("Artifact was null.");
+ }
+ }
+
+ private void checkForType(Artifact artifact) throws OseeArgumentException {
+ if (!artifact.isOfType(OTE_SKYNET_ARTIFACTS.TEST_RUN.getName())) {
+ throw new OseeArgumentException(String.format("Unable to operate on type [%s]. Only [%s] allowed.",
+ artifact.getArtifactTypeName(), OTE_SKYNET_ARTIFACTS.TEST_RUN.getName()));
+ }
+ }
+
+ public static TestRunOperator getNewArtifactWithOperator(Branch branch) throws OseeCoreException {
+ return new TestRunOperator(TEST_RUN_ARTIFACT_FETCHER.getNewArtifact(branch));
+ }
+
+ public static OteArtifactFetcher<Artifact> getTestRunFetcher() {
+ return TEST_RUN_ARTIFACT_FETCHER;
+ }
+
+ public static OteArtifactFetcher<Artifact> getTestScriptFetcher() {
+ return TEST_SCRIPT_ARTIFACT_FETCHER;
+ }
+
+ public Artifact getTestRunArtifact() {
+ return artifact;
+ }
+
+ public String getDescriptiveName() {
+ return artifact.getDescriptiveName();
+ }
+
+ public String getScriptRevision() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.REVISION.getName(), "");
+ }
+
+ public String getScriptUrl() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.TEST_SCRIPT_URL.getName(), "");
+ }
+
+ public void setLastDateUploaded(Date value) throws OseeCoreException {
+ artifact.setSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.LAST_DATE_UPLOADED.getName(), value);
+ }
+
+ public Date getLastDateUploaded() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.LAST_DATE_UPLOADED.getName(), null);
+ }
+
+ public void setChecksum(String value) throws OseeCoreException {
+ artifact.setSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.CHECKSUM.getName(), value);
+ }
+
+ public String getChecksum() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.CHECKSUM.getName(), "");
+ }
+
+ public String getOutfileExtension() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.EXTENSION.getName(), "");
+ }
+
+ public void setOutfileExtension(String outfile) throws OseeCoreException {
+ artifact.setSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.EXTENSION.getName(), outfile);
+ }
+
+ public boolean isFromLocalWorkspace() throws OseeCoreException, AttributeDoesNotExist {
+ return getLastDateUploaded() == null;
+ }
+
+ public void setLocalOutfileURI(String uri) throws OseeCoreException, AttributeDoesNotExist {
+ IAttributeDataProvider provider = getOutfileAttribute().getAttributeDataProvider();
+ if (provider instanceof MappedAttributeDataProvider) {
+ ((MappedAttributeDataProvider) provider).setLocalUri(uri);
+ }
+ }
+
+ public String getOutfileUrl() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.OUTFILE_URL.getName());
+ }
+
+ public String getOutfileContents() throws OseeCoreException {
+ try {
+ return Lib.inputStreamToString(new URI(getOutfileUrl()).toURL().openStream());
+ } catch (Exception ex) {
+ throw new OseeWrappedException(ex);
+ }
+ }
+
+ public Attribute<InputStream> getOutfileAttribute() throws AttributeDoesNotExist, OseeCoreException {
+ List<Attribute<InputStream>> attributes = artifact.getAttributes(OTE_SKYNET_ATTRIBUTES.OUTFILE_URL.getName());
+ return attributes != null && attributes.size() > 0 ? attributes.get(0) : null;
+ }
+
+ public boolean isScriptRevisionValid() {
+ boolean toReturn = false;
+ try {
+ URI url = new URI(getScriptUrl());
+ if (url != null) {
+ String revision = getScriptRevision();
+ if (Strings.isValid(revision)) {
+ toReturn = true;
+ }
+ }
+ } catch (Exception ex) {
+ }
+ return toReturn;
+ }
+
+ public boolean hasNotBeenCommitted() {
+ Artifact fetched = null;
+ try {
+ fetched =
+ getTestRunFetcher().searchForUniqueArtifactMatching(OTE_SKYNET_ATTRIBUTES.CHECKSUM.getName(),
+ getChecksum(), artifact.getBranch());
+ } catch (Exception ex) {
+ }
+ return fetched == null;
+ }
+
+ public boolean isCommitAllowed() {
+ return isScriptRevisionValid() && hasNotBeenCommitted();
+ }
+
+ public boolean hasValidArtifact() {
+ return artifact != null && artifact.isDeleted() != true;
+ }
+
+ public void createTestScriptSoftLink() throws OseeCoreException {
+ Artifact testScript =
+ getTestScriptFetcher().searchForUniqueArtifactMatching("Name", artifact.getDescriptiveName(),
+ artifact.getBranch());
+ if (testScript != null) {
+ artifact.setSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.TEST_SCRIPT_GUID.getName(), testScript.getGuid());
+ }
+ }
+
+ public String getPartition() {
+ String name = artifact.getDescriptiveName();
+ String[] data = name.split("\\.");
+ if (data.length - 3 > 0) {
+ name = data[data.length - 3];
+ }
+ return name;
+ }
+
+ public String getSubsystem() {
+ String name = artifact.getDescriptiveName();
+ String[] data = name.split("\\.");
+ if (data.length - 2 > 0) {
+ name = data[data.length - 2];
+ }
+ return name;
+ }
+
+ public int getTestPointsPassed() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.PASSED.getName());
+ }
+
+ public int getTestPointsFailed() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.FAILED.getName());
+ }
+
+ public int getTotalTestPoints() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.TOTAL_TEST_POINTS.getName());
+ }
+
+ public Date getEndDate() throws OseeCoreException {
+ return processDateAttribute(OTE_SKYNET_ATTRIBUTES.END_DATE);
+ }
+
+ public Date getLastModifiedDate() throws OseeCoreException {
+ return processDateAttribute(OTE_SKYNET_ATTRIBUTES.LAST_MODIFIED_DATE);
+ }
+
+ public Date getTestStartDate() throws OseeCoreException {
+ return processDateAttribute(OTE_SKYNET_ATTRIBUTES.START_DATE);
+ }
+
+ private Date processDateAttribute(OTE_SKYNET_ATTRIBUTES attributeType) throws OseeCoreException {
+ Date date = artifact.getSoleAttributeValue(attributeType.getName(), null);
+ if (date == null) {
+ date = new Date(0);
+ }
+ return date;
+ }
+
+ public boolean wasAborted() {
+ boolean toReturn = true;
+ try {
+ toReturn = artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.SCRIPT_ABORTED.getName(), false);
+ } catch (Exception ex) {
+ }
+ return toReturn;
+ }
+
+ public String getTestResultStatus() throws OseeCoreException {
+ String result = "FAILED";
+ if (wasAborted() != true) {
+ int total = getTotalTestPoints();
+ if (total > 0) {
+ if (getTestPointsFailed() <= 0) {
+ int passed = getTestPointsPassed();
+ if (passed == total) {
+ result = "PASSED";
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public boolean isBatchModeAllowed() {
+ boolean toReturn = false;
+ try {
+ toReturn = artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.IS_BATCH_MODE_ALLOWED.getName(), false);
+ } catch (Exception ex) {
+ }
+ return toReturn;
+ }
+
+ public String getOseeVersion() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.OSEE_VERSION.getName(), "").trim();
+ }
+
+ public String getOseeServerTitle() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.OSEE_SERVER_TITLE.getName(), "").trim();
+ }
+
+ public String getOseeServerVersion() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.OSEE_SERVER_JAR_VERSION.getName(), "").trim();
+ }
+
+ public String getProcessorId() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.PROCESSOR_ID.getName(), "");
+ }
+
+ public String getRunDuration() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.ELAPSED_DATE.getName(), "");
+ }
+
+ public String getQualificationLevel() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.QUALIFICATION_LEVEL.getName(), "");
+ }
+
+ public String getBuildId() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.BUILD_ID.getName(), "");
+ }
+
+ public String getRanOnOperatingSystem() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.OS_NAME.getName(), "");
+ }
+
+ public String getLastAuthor() throws OseeCoreException {
+ return artifact.getSoleAttributeValue(OTE_SKYNET_ATTRIBUTES.LAST_AUTHOR.getName(), null);
+ }
+
+ public String getScriptSimpleName() {
+ String rawName = getDescriptiveName();
+ String[] qualifiers = rawName.split("\\.");
+ return qualifiers[qualifiers.length - 1];
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/FindCommitableJob.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/FindCommitableJob.java
new file mode 100644
index 00000000000..485b2e144a1
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/FindCommitableJob.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.define.jobs;
+
+import java.util.ArrayList;
+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.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FindCommitableJob extends Job {
+
+ private static final String JOB_NAME = "Check commit allowed";
+ private Artifact[] artifactsToSort;
+ private Artifact[] itemsToCommit;
+ private Artifact[] nonCommitableItems;
+
+ public FindCommitableJob(Artifact... artifactsToSort) {
+ super(JOB_NAME);
+ setUser(true);
+ setPriority(Job.LONG);
+ this.artifactsToSort = artifactsToSort;
+ this.itemsToCommit = this.nonCommitableItems = new Artifact[0];
+ }
+
+ public Artifact[] getAll() {
+ return this.artifactsToSort;
+ }
+
+ public Artifact[] getCommitAllowed() {
+ return itemsToCommit;
+ }
+
+ public Artifact[] getCommitNotAllowed() {
+ return nonCommitableItems;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.progress.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ monitor.beginTask(getName(), artifactsToSort.length);
+ List<Artifact> commitable = new ArrayList<Artifact>();
+ List<Artifact> nonCommitable = new ArrayList<Artifact>();
+ for (Artifact artifact : artifactsToSort) {
+ try {
+ TestRunOperator operator = new TestRunOperator(artifact);
+ if (operator.isCommitAllowed() == true) {
+ commitable.add(artifact);
+ } else {
+ nonCommitable.add(artifact);
+ }
+ } catch (OseeArgumentException ex) {
+ OseeLog.log(OteDefinePlugin.class, Level.SEVERE, ex);
+ }
+
+ if (monitor.isCanceled() == true) {
+ break;
+ }
+ monitor.worked(1);
+ }
+ itemsToCommit = commitable.toArray(new Artifact[commitable.size()]);
+ nonCommitableItems = nonCommitable.toArray(new Artifact[nonCommitable.size()]);
+ if (monitor.isCanceled() != true) {
+ toReturn = Status.OK_STATUS;
+ }
+ monitor.subTask("Done");
+ monitor.done();
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/OutfileToArtifactJob.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/OutfileToArtifactJob.java
new file mode 100644
index 00000000000..df038edf145
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/OutfileToArtifactJob.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.define.jobs;
+
+import java.net.URI;
+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.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.operations.LinkTestRunToTestScriptOperation;
+import org.eclipse.osee.ote.define.operations.OutfileToArtifactOperation;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutfileToArtifactJob extends Job {
+
+ private static final String JOB_NAME = "Convert Outfile to Artifact";
+ private URI[] filesToImport;
+ private Artifact[] results;
+ private URI[] filesWithErrors;
+ private Branch branch;
+
+ public OutfileToArtifactJob(Branch branch, URI... filesToImport) {
+ super(JOB_NAME);
+ setUser(true);
+ setPriority(Job.LONG);
+ this.branch = branch;
+ this.filesToImport = filesToImport;
+ this.results = new Artifact[0];
+ this.filesWithErrors = new URI[0];
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.OK_STATUS;
+ try {
+ monitor.beginTask(getName(), filesToImport.length * 2);
+ OutfileToArtifactOperation outfileToArtifactOperation = new OutfileToArtifactOperation(branch, filesToImport);
+ outfileToArtifactOperation.execute(monitor);
+ results = outfileToArtifactOperation.getResults();
+ filesWithErrors = outfileToArtifactOperation.getUnparseableFiles();
+ if (monitor.isCanceled() != true) {
+ LinkTestRunToTestScriptOperation linkingOperation = new LinkTestRunToTestScriptOperation(results);
+ linkingOperation.execute(monitor);
+ }
+
+ } catch (Exception ex) {
+ toReturn = new Status(Status.ERROR, OteDefinePlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ } finally {
+ monitor.subTask("Done");
+ monitor.done();
+ }
+ return toReturn;
+ }
+
+ public Artifact[] getResults() {
+ return results;
+ }
+
+ public URI[] getUnparseableFiles() {
+ return filesWithErrors;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/RemoteResourceRequestJob.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/RemoteResourceRequestJob.java
new file mode 100644
index 00000000000..824fd2570d3
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/jobs/RemoteResourceRequestJob.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.define.jobs;
+
+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.core.runtime.jobs.Job;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.operations.RemoteResourceRequestOperation;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RemoteResourceRequestJob extends Job {
+ private static final String JOB_NAME = "Download Resource";
+ private String urlRequest;
+ private String targetFileName;
+ private IFile downloaded;
+
+ public RemoteResourceRequestJob(String urlRequest, String targetFileName) {
+ super(JOB_NAME);
+ this.urlRequest = urlRequest;
+ this.targetFileName = targetFileName;
+ setUser(false);
+ setPriority(Job.LONG);
+ }
+
+ public IFile getDownloadedFile() {
+ return downloaded;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus status = Status.CANCEL_STATUS;
+ try {
+ RemoteResourceRequestOperation remoteRequest =
+ new RemoteResourceRequestOperation("TEMP", urlRequest, targetFileName);
+ remoteRequest.execute(monitor);
+ downloaded = remoteRequest.getResults();
+ status = Status.OK_STATUS;
+ } catch (Exception ex) {
+ status =
+ new Status(Status.ERROR, OteDefinePlugin.PLUGIN_ID, String.format("Error downloading resource [%s]",
+ targetFileName), ex);
+ }
+ return status;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/AbstractRemoteResourceRequestTemplate.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/AbstractRemoteResourceRequestTemplate.java
new file mode 100644
index 00000000000..1ecfae418a2
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/AbstractRemoteResourceRequestTemplate.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.define.operations;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.logging.Level;
+import org.eclipse.core.filebuffers.manipulation.ContainerCreator;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractRemoteResourceRequestTemplate {
+ private static final int CONNECTION_TIMEOUT = 120000;
+ private static final int CONNECTION_READ_TIMEOUT = 10000;
+ private IFile remoteFile;
+ private String tempFolderName;
+ private String remoteRequestUrl;
+
+ public AbstractRemoteResourceRequestTemplate(String tempFolderName, String remoteRequestUrl) {
+ super();
+ this.tempFolderName = tempFolderName;
+ this.remoteRequestUrl = remoteRequestUrl;
+ this.remoteFile = null;
+ createTemporaryDirectory();
+ }
+
+ private void createTemporaryDirectory() {
+ try {
+ final IProject project = OseeData.getProject();
+ final IFolder folder = project.getFolder(tempFolderName + File.separator);
+ if (folder != null && folder.exists() != true) {
+ ContainerCreator containerCreator = new ContainerCreator(folder.getWorkspace(), folder.getFullPath());
+ containerCreator.createContainer(new NullProgressMonitor());
+ }
+ } catch (CoreException ex1) {
+ OseeLog.log(OteDefinePlugin.class, Level.SEVERE, ex1.toString(), ex1);
+ }
+ }
+
+ private boolean isLocalFileAvailable(IFile file) {
+ boolean found = false;
+ if (file != null) {
+ try {
+ IFileStore store = EFS.getStore(file.getLocationURI());
+ found = store.fetchInfo().exists();
+ } catch (Exception ex) {
+ OseeLog.log(OteDefinePlugin.class, Level.SEVERE, "Error retrieving file system. ", ex);
+ }
+ }
+ return found;
+ }
+
+ public IFile getResults() {
+ return remoteFile;
+ }
+
+ protected HttpURLConnection setupConnection(URL url) throws IOException {
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setConnectTimeout(CONNECTION_TIMEOUT);
+ connection.setReadTimeout(CONNECTION_READ_TIMEOUT);
+ return connection;
+ }
+
+ public int getTotalWork() throws Exception {
+ return isLocalFileAvailable(getLocalStorageIFile()) != true ? 4 : 1;
+ }
+
+ private boolean isRemoteRequestNeeded() throws Exception {
+ return isLocalFileAvailable(getLocalStorageIFile()) != true;
+ }
+
+ public void execute(IProgressMonitor monitor) throws Exception {
+ if (isRemoteRequestNeeded() != false) {
+ HttpURLConnection connection = null;
+ try {
+ monitor.setTaskName(String.format("Requesting Resource: [%s]", getRemoteFileName()));
+ connection = setupConnection(new URL(remoteRequestUrl));
+ connection.connect();
+ monitor.worked(1);
+ if (monitor.isCanceled() != true) {
+ this.remoteFile = handleTransfer(monitor, connection);
+ monitor.worked(1);
+ }
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ } else {
+ this.remoteFile = getLocalStorageIFile();
+ }
+ monitor.worked(1);
+ }
+
+ protected IFile getLocalStorageIFile() throws Exception {
+ return OseeData.getIFile(getLocalStorageName());
+ }
+
+ protected String getRemoteRequestUrl() {
+ return remoteRequestUrl;
+ }
+
+ protected String getTempFolderName() {
+ return tempFolderName;
+ }
+
+ protected abstract String getLocalStorageName() throws Exception;
+
+ protected abstract String getRemoteFileName();
+
+ protected abstract IFile handleTransfer(IProgressMonitor monitor, HttpURLConnection connection) throws Exception;
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/ImportOutfileOperation.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/ImportOutfileOperation.java
new file mode 100644
index 00000000000..b47219a214e
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/ImportOutfileOperation.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.define.operations;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.StringFormat;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.utility.Artifacts;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.define.jobs.FindCommitableJob;
+import org.eclipse.osee.ote.define.jobs.OutfileToArtifactJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImportOutfileOperation {
+
+ private URI[] fileSystemObjects;
+ private Branch selectedBranch;
+
+ public ImportOutfileOperation(Branch selectedBranch, URI... fileSystemObjects) throws OseeCoreException {
+ checkForNull(selectedBranch);
+ checkForNull(fileSystemObjects);
+ checkForEmpty(fileSystemObjects);
+
+ this.fileSystemObjects = fileSystemObjects;
+ this.selectedBranch = selectedBranch;
+ }
+
+ private void checkSuccessful(IStatus status) throws OseeStateException {
+ if (status.equals(Status.OK_STATUS) != true && status.equals(Status.OK) != true) {
+ throw new OseeStateException(String.format("Error detected: %s", status.getMessage()));
+ }
+ }
+
+ private void checkForEmpty(Object[] items) throws OseeArgumentException {
+ if (items.length <= 0) {
+ throw new OseeArgumentException("No items to process. Size was 0.");
+ }
+ }
+
+ private void checkForNull(Object object) throws OseeArgumentException {
+ if (object == null) {
+ throw new OseeArgumentException("Object cannot be null");
+ }
+ }
+
+ public void execute(IProgressMonitor monitor) throws Exception {
+ OutfileToArtifactJob job = new OutfileToArtifactJob(selectedBranch, fileSystemObjects);
+ job.setUser(false);
+ job.schedule();
+ job.join();
+
+ checkSuccessful(job.getResult());
+
+ // Report Parse Errors
+ URI[] itemsWithError = job.getUnparseableFiles();
+ if (itemsWithError.length > 0) {
+ throw new Exception(String.format("Error parsing files [%s]", Arrays.deepToString(itemsWithError)));
+ } else {
+ launchFindCommitableJob(monitor, "", job.getResults());
+ }
+ }
+
+ private void launchFindCommitableJob(IProgressMonitor monitor, String commitComment, final Artifact[] artifacts) throws Exception {
+ // Find Commit Allowed
+ FindCommitableJob job = new FindCommitableJob(artifacts);
+ job.setUser(false);
+ job.schedule();
+ job.join();
+
+ checkSuccessful(job.getResult());
+
+ Artifact[] notAllowed = job.getCommitNotAllowed();
+ if (notAllowed.length > 0) {
+ throw new IllegalArgumentException(String.format("Some items are not commitable. [%s]", toString(notAllowed)));
+ }
+ commitSelectedArtifacts(monitor, commitComment, job.getCommitAllowed());
+ }
+
+ private String toString(Artifact[] artifacts) {
+ List<String> toReturn = new ArrayList<String>();
+ for (Artifact artifact : artifacts) {
+ toReturn.add(artifact.getDescriptiveName());
+ }
+ return StringFormat.listToValueSeparatedString(toReturn, ",\n");
+ }
+
+ private void commitSelectedArtifacts(IProgressMonitor monitor, String commitComment, Object[] items) throws Exception {
+ Map<Branch, List<Artifact>> commitMap = getArtifactsByBranch(items);
+ for (Branch branch : commitMap.keySet()) {
+ monitor.setTaskName(String.format("Committing Artifacts into Branch: [%s]", branch.getBranchName()));
+ List<Artifact> artList = commitMap.get(branch);
+ commitTestRunTx(monitor, commitComment, branch, artList.toArray(new Artifact[artList.size()]));
+ }
+ }
+
+ private Map<Branch, List<Artifact>> getArtifactsByBranch(Object[] items) {
+ Map<Branch, List<Artifact>> branchMap = new HashMap<Branch, List<Artifact>>();
+ for (Object object : items) {
+ Artifact testRun = (Artifact) object;
+ Branch branch = testRun.getBranch();
+ List<Artifact> artList = branchMap.get(branch);
+ if (artList == null) {
+ artList = new ArrayList<Artifact>();
+ branchMap.put(branch, artList);
+ }
+ artList.add(testRun);
+ }
+ return branchMap;
+ }
+
+ public static void commitTestRunTx(IProgressMonitor monitor, String commitComment, Branch branch, Artifact... artifacts) throws OseeCoreException {
+ monitor.setTaskName("Persist Test Runs");
+ for (Artifact artifact : artifacts) {
+ monitor.subTask(String.format("Persisting: [%s] ", artifact.getDescriptiveName()));
+
+ TestRunOperator operator = new TestRunOperator(artifact);
+ operator.setLastDateUploaded(new Date());
+ if (monitor.isCanceled() != false) {
+ break;
+ }
+ monitor.worked(1);
+ }
+
+ Artifacts.persistInTransaction(commitComment, artifacts);
+ if (monitor.isCanceled() != false) {
+ throw new OseeCoreException("User Cancelled");
+ }
+ monitor.done();
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/LinkTestRunToTestScriptOperation.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/LinkTestRunToTestScriptOperation.java
new file mode 100644
index 00000000000..9928a00ba53
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/LinkTestRunToTestScriptOperation.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.define.operations;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LinkTestRunToTestScriptOperation {
+ private static final String OPERATION_NAME = "Link Test Run to Test Script";
+ private Artifact[] artifacts;
+ private List<Artifact> unlinked;
+ private List<Artifact> linked;
+
+ public LinkTestRunToTestScriptOperation(Artifact... artifacts) {
+ this.artifacts = artifacts;
+ this.unlinked = new ArrayList<Artifact>();
+ this.linked = new ArrayList<Artifact>();
+ }
+
+ public void execute(IProgressMonitor monitor) throws OseeArgumentException {
+ int count = 0;
+ monitor.setTaskName(OPERATION_NAME);
+ for (Artifact testRun : artifacts) {
+
+ monitor.subTask(String.format("Linking [%s] [%s of %s] ", testRun.getDescriptiveName(), ++count,
+ artifacts.length));
+ TestRunOperator operator = new TestRunOperator(testRun);
+ try {
+ operator.createTestScriptSoftLink();
+ linked.add(testRun);
+ } catch (Exception ex) {
+ unlinked.add(testRun);
+ }
+ if (monitor.isCanceled() == true) {
+ break;
+ }
+ monitor.worked(1);
+ }
+ }
+
+ public Artifact[] getLinkedArtifacts() {
+ return linked.toArray(new Artifact[linked.size()]);
+ }
+
+ public Artifact[] getUnlinkedArtifacts() {
+ return unlinked.toArray(new Artifact[unlinked.size()]);
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/OutfileToArtifactOperation.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/OutfileToArtifactOperation.java
new file mode 100644
index 00000000000..35f678bb164
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/OutfileToArtifactOperation.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.define.operations;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.define.parser.BaseOutfileParser;
+import org.eclipse.osee.ote.define.utilities.OutfileDataCollector;
+import org.eclipse.osee.ote.define.utilities.OutfileParserExtensionManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutfileToArtifactOperation {
+ private Branch branch;
+ private URI[] filesToImport;
+ private List<Artifact> results;
+ private List<URI> filesWithErrors;
+
+ public OutfileToArtifactOperation(Branch branch, URI... filesToImport) {
+ this.branch = branch;
+ this.filesToImport = filesToImport;
+ this.results = new ArrayList<Artifact>();
+ this.filesWithErrors = new ArrayList<URI>();
+ }
+
+ public void execute(IProgressMonitor monitor) throws Exception {
+ this.results.clear();
+ monitor.setTaskName("Outfiles to Artifact Conversion...");
+ for (URI targetUri : filesToImport) {
+ TestRunOperator operator = null;
+ try {
+ operator = TestRunOperator.getNewArtifactWithOperator(branch);
+
+ OutfileDataCollector collector = getOutfileData(monitor, targetUri.toURL());
+ collector.populate(operator.getTestRunArtifact());
+
+ String path = targetUri.toURL().toString();
+ operator.setLocalOutfileURI(path);
+ operator.setOutfileExtension(Lib.getExtension(path));
+ addChecksum(operator, targetUri.toURL());
+ results.add(operator.getTestRunArtifact());
+
+ if (monitor.isCanceled() == true) {
+ break;
+ }
+ } catch (Exception ex) {
+ if (operator.getTestRunArtifact() == null) {
+ throw new Exception(
+ "Unable to create Test Run Artifact. Make sure type information exists in the selected branch.");
+ }
+ filesWithErrors.add(targetUri);
+ }
+ operator = null;
+ monitor.worked(1);
+ }
+ }
+
+ private void addChecksum(TestRunOperator operator, URL targetURL) throws Exception {
+ InputStream inputStream = null;
+ try {
+ inputStream = targetURL.openStream();
+ String checkSum = ChecksumUtil.createChecksumAsString(inputStream, ChecksumUtil.MD5);
+ operator.setChecksum(checkSum);
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+
+ private OutfileDataCollector getOutfileData(IProgressMonitor monitor, URL fileToImport) throws Exception {
+ OutfileDataCollector collector = new OutfileDataCollector();
+ BaseOutfileParser outfileParser = OutfileParserExtensionManager.getInstance().getOutfileParserFor(fileToImport);
+ outfileParser.registerListener(collector);
+ outfileParser.execute(monitor, fileToImport);
+ outfileParser.deregisterListener(collector);
+ return collector;
+ }
+
+ public Artifact[] getResults() {
+ return results.toArray(new Artifact[results.size()]);
+ }
+
+ public URI[] getUnparseableFiles() {
+ return filesWithErrors.toArray(new URI[filesWithErrors.size()]);
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/RemoteResourceRequestOperation.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/RemoteResourceRequestOperation.java
new file mode 100644
index 00000000000..a3b8d7ed82b
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/operations/RemoteResourceRequestOperation.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.define.operations;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RemoteResourceRequestOperation extends AbstractRemoteResourceRequestTemplate {
+ private static final String STORAGE_PATH = "TEMP";
+ private String fileName;
+
+ public RemoteResourceRequestOperation(String tempFolderName, String remoteRequestUrl, String fileName) {
+ super(STORAGE_PATH, remoteRequestUrl);
+ this.fileName = fileName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.define.operations.AbstractRemoteResourceRequestTemplate#getLocalStorageName()
+ */
+ @Override
+ protected String getLocalStorageName() throws Exception {
+ StringBuilder builder = new StringBuilder();
+ builder.append(getTempFolderName());
+ builder.append(File.separator);
+ builder.append(fileName);
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.define.operations.AbstractRemoteResourceRequestTemplate#getRemoteFileName()
+ */
+ @Override
+ protected String getRemoteFileName() {
+ return fileName;
+ }
+
+ protected HttpURLConnection setupConnection(URL url) throws IOException {
+ HttpURLConnection connection = super.setupConnection(url);
+ connection.setAllowUserInteraction(false);
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+ connection.setInstanceFollowRedirects(true);
+ return connection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.define.operations.AbstractRemoteResourceRequestTemplate#handleTransfer(org.eclipse.core.runtime.IProgressMonitor, java.net.HttpURLConnection)
+ */
+ @Override
+ protected IFile handleTransfer(IProgressMonitor monitor, HttpURLConnection connection) throws Exception {
+ IFile file = null;
+ InputStream stream = null;
+ try {
+ int result = connection.getResponseCode();
+ if (result == 200) {
+ stream = (InputStream) connection.getContent();
+ file = getLocalStorageIFile();
+ file.create(stream, true, monitor);
+ monitor.setTaskName("File Transfer Complete.");
+ }
+ } finally {
+ if (stream != null) {
+ stream.close();
+ }
+ }
+ return file;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/BaseOutfileParser.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/BaseOutfileParser.java
new file mode 100644
index 00000000000..7e2d35dff5c
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/BaseOutfileParser.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.define.parser;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class BaseOutfileParser {
+ private Set<IDataListener> listeners;
+
+ public BaseOutfileParser() {
+ this.listeners = new HashSet<IDataListener>();
+ }
+
+ public void registerListener(IDataListener listener) {
+ listeners.add(listener);
+ }
+
+ public void deregisterListener(IDataListener listener) {
+ listeners.remove(listener);
+ }
+
+ protected Set<IDataListener> getDataListeners() {
+ return listeners;
+ }
+
+ protected void notifyOnDataEvent(String name, String value) {
+ for (IDataListener listener : listeners) {
+ listener.notifyDataEvent(name, value);
+ }
+ }
+
+ public final void execute(IProgressMonitor monitor, URL fileToParse) throws Exception {
+ long time = System.currentTimeMillis();
+ String file = new File(fileToParse.toURI()).getName();
+ monitor.subTask(String.format("Parsing: [%s]", file));
+ InputStream inputStream = null;
+ try {
+ inputStream = fileToParse.openStream();
+ doParse(monitor, file, inputStream);
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } finally {
+ long elapsedTime = System.currentTimeMillis() - time;
+ monitor.subTask(String.format("Parsed: [%s] in [%d] ms", file, elapsedTime));
+ }
+ }
+ }
+
+ public abstract boolean isValidParser(URL fileToParse);
+
+ protected abstract void doParse(IProgressMonitor monitor, String fileName, InputStream inputStream) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/CollectionParser.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/CollectionParser.java
new file mode 100644
index 00000000000..f00ea59fbe3
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/CollectionParser.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.define.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class CollectionParser extends AbstractSaxHandler implements ICollectionSource {
+
+ private List<SaxChunkCollector> collectors;
+
+ public CollectionParser(ArrayList<SaxChunkCollector> collectors) {
+ this.collectors = collectors;
+ }
+
+ public CollectionParser() {
+ collectors = new ArrayList<SaxChunkCollector>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ for (SaxChunkCollector collector : collectors) {
+ collector.endElementFound(localName, this);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String,
+ * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ for (SaxChunkCollector collector : collectors) {
+ collector.startElementFound(localName, attributes, this);
+ }
+ }
+
+ public List<SaxChunkCollector> getCollectors() {
+ return collectors;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ICollectionSource.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ICollectionSource.java
new file mode 100644
index 00000000000..d775451716d
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ICollectionSource.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.define.parser;
+
+public interface ICollectionSource {
+ String getContents();
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/IDataListener.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/IDataListener.java
new file mode 100644
index 00000000000..fb6cfb53eff
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/IDataListener.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.define.parser;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IDataListener {
+
+ public void notifyDataEvent(String name, String value);
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ISaxElementHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ISaxElementHandler.java
new file mode 100644
index 00000000000..49ff36869ce
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/ISaxElementHandler.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.define.parser;
+
+public interface ISaxElementHandler {
+
+ public void processSaxChunkCollectorData(String currentLocalName, String xmlData);
+
+ public void addListener(IDataListener listener);
+
+ public void removeListener(IDataListener listener);
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/OteOutfileParser.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/OteOutfileParser.java
new file mode 100644
index 00000000000..29e0a1eb664
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/OteOutfileParser.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.define.parser;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.define.parser.handlers.ConfigHandler;
+import org.eclipse.osee.ote.define.parser.handlers.CurrentProcessorHandler;
+import org.eclipse.osee.ote.define.parser.handlers.DemoInfoHandler;
+import org.eclipse.osee.ote.define.parser.handlers.ElapsedTimeHandler;
+import org.eclipse.osee.ote.define.parser.handlers.ExecutionStatusHandler;
+import org.eclipse.osee.ote.define.parser.handlers.RuntimeVersionsHandler;
+import org.eclipse.osee.ote.define.parser.handlers.SystemInfoHandler;
+import org.eclipse.osee.ote.define.parser.handlers.TestPointResultsHandler;
+import org.eclipse.osee.ote.define.parser.handlers.VersionInformationHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteOutfileParser extends BaseOutfileParser {
+ private ArrayList<SaxChunkCollector> collectors;
+
+ public OteOutfileParser() {
+ super();
+ collectors = new ArrayList<SaxChunkCollector>();
+ collectors.add(new SaxChunkCollector(new ConfigHandler(), "Config"));
+ collectors.add(new SaxChunkCollector(new RuntimeVersionsHandler(), "RuntimeVersions"));
+ collectors.add(new SaxChunkCollector(new SystemInfoHandler(), "SystemInfo"));
+ collectors.add(new SaxChunkCollector(new CurrentProcessorHandler(), "CurrentProcessor"));
+ collectors.add(new SaxChunkCollector(new ExecutionStatusHandler(), "ExecutionStatus"));
+ collectors.add(new SaxChunkCollector(new ElapsedTimeHandler(), "TimeSummary"));
+ collectors.add(new SaxChunkCollector(new VersionInformationHandler(), "Version"));
+ collectors.add(new SaxChunkCollector(new TestPointResultsHandler(), "TestPointResults"));
+ collectors.add(new SaxChunkCollector(new DemoInfoHandler(), "Qualification"));
+ }
+
+ public void registerListener(IDataListener listener) {
+ super.registerListener(listener);
+ for (SaxChunkCollector collector : collectors) {
+ collector.getHandler().addListener(listener);
+ }
+ }
+
+ public void deregisterListener(IDataListener listener) {
+ super.deregisterListener(listener);
+ for (SaxChunkCollector collector : collectors) {
+ collector.getHandler().removeListener(listener);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.define.parser.BaseOutfileParser#doParse(org.eclipse.core.runtime.IProgressMonitor, java.lang.String, java.io.InputStream)
+ */
+ @Override
+ protected void doParse(IProgressMonitor monitor, String fileName, InputStream inputStream) throws Exception {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ CollectionParser handler = new CollectionParser(collectors);
+ xmlReader.setContentHandler(handler);
+ xmlReader.parse(new InputSource(inputStream));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.define.parser.BaseOutfileParser#isValidParser(java.net.URL)
+ */
+ @Override
+ public boolean isValidParser(URL fileToParse) {
+ boolean result = false;
+ if (fileToParse != null) {
+ String extension = Lib.getExtension(fileToParse.getFile());
+ result = extension != null && extension.contains("tmo");
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/SaxChunkCollector.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/SaxChunkCollector.java
new file mode 100644
index 00000000000..ca930d4856c
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/SaxChunkCollector.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.define.parser;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.xml.sax.Attributes;
+
+public class SaxChunkCollector {
+
+ private Set<String> collectionElement;
+ private int currentDepth = 0;
+ private boolean isCollecting = false;
+ private StringBuilder builder;
+ private List<String> collectionChunks;
+ private ISaxElementHandler handler;
+ private String currentLocalName;
+
+ public SaxChunkCollector(ISaxElementHandler handler, String... collect) {
+ this.collectionElement = new HashSet<String>();
+ for (String item : collect) {
+ collectionElement.add(item);
+ }
+ this.handler = handler;
+ collectionChunks = new ArrayList<String>();
+ builder = new StringBuilder(5000);
+ }
+
+ /**
+ * @param localName
+ * @param collectionParser
+ */
+ public void endElementFound(String localName, ICollectionSource collectionSource) {
+ if (isCollecting) {
+ currentDepth--;
+ builder.append(collectionSource.getContents());
+ builder.append("</");
+ builder.append(localName);
+ builder.append(">");
+ if (currentDepth < 1) {
+ isCollecting = false;
+ String data = builder.toString();
+ collectionChunks.add(data);
+ handler.processSaxChunkCollectorData(currentLocalName, data);
+ builder.setLength(0);
+ }
+ }
+ }
+
+ public ISaxElementHandler getHandler() {
+ return handler;
+ }
+
+ /**
+ * @param localName
+ * @param attributes
+ * @param collectionParser
+ */
+ public void startElementFound(String localName, Attributes attributes, CollectionParser collectionParser) {
+ if (collectionElement.contains(localName)) {
+ isCollecting = true;
+ currentLocalName = localName;
+ }
+
+ if (isCollecting) {
+ currentDepth++;
+ builder.append("<");
+ builder.append(localName);
+ for (int i = 0; i < attributes.getLength(); i++) {
+ builder.append(" ");
+ builder.append(attributes.getLocalName(i));
+ builder.append("=\"");
+ builder.append(attributes.getValue(i));
+ builder.append("\"");
+ }
+ builder.append(" >");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/AbstractParseHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/AbstractParseHandler.java
new file mode 100644
index 00000000000..5b3ce19c330
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/AbstractParseHandler.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.define.parser.handlers;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.parser.IDataListener;
+import org.eclipse.osee.ote.define.parser.ISaxElementHandler;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractParseHandler implements ISaxElementHandler {
+ private Set<IDataListener> listeners;
+
+ protected AbstractParseHandler() {
+ this.listeners = Collections.synchronizedSet(new HashSet<IDataListener>());
+ }
+
+ public void addListener(IDataListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(IDataListener listener) {
+ if (listeners.contains(listener)) {
+ listeners.remove(listener);
+ }
+ }
+
+ public void notifyOnDataEvent(String name, String value) {
+ for (final IDataListener listener : listeners) {
+ listener.notifyDataEvent(name, value);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.ISaxElementHandler#processSaxChunkCollectorData(java.lang.String,
+ * java.lang.String)
+ */
+ public void processSaxChunkCollectorData(String currentLocalName, String xmlData) {
+ try {
+ Document doc = Jaxp.readXmlDocument(xmlData);
+ Element root = doc.getDocumentElement();
+ if (root != null) {
+ processSaxChunk(root);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ protected abstract void processSaxChunk(Element element);
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ConfigHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ConfigHandler.java
new file mode 100644
index 00000000000..fbbdcad014d
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ConfigHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ConfigHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ Element user = Jaxp.getChildDirect(element, "User");
+ if (user != null) {
+ notifyOnDataEvent(TestRunField.USER_ID.toString(), user.getAttribute("id"));
+ notifyOnDataEvent(TestRunField.USER_NAME.toString(), user.getAttribute("name"));
+ }
+ notifyOnDataEvent(TestRunField.SCRIPT_NAME.toString(), Jaxp.getChildTextTrim(element, "ScriptName"));
+ Element versionElement = Jaxp.getChild(element, "ScriptVersion");
+ if (versionElement != null) {
+ notifyOnDataEvent(TestRunField.SCRIPT_REVISION.toString(), versionElement.getAttribute("revision"));
+ notifyOnDataEvent(TestRunField.SCRIPT_MODIFIED_FLAG.toString(), versionElement.getAttribute("modifiedFlag"));
+ notifyOnDataEvent(TestRunField.SCRIPT_LAST_AUTHOR.toString(), versionElement.getAttribute("lastAuthor"));
+ notifyOnDataEvent(TestRunField.SCRIPT_LAST_MODIFIED.toString(), versionElement.getAttribute("lastModified"));
+ notifyOnDataEvent(TestRunField.SCRIPT_URL.toString(), versionElement.getAttribute("url"));
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/CurrentProcessorHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/CurrentProcessorHandler.java
new file mode 100644
index 00000000000..9d26dcac703
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/CurrentProcessorHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CurrentProcessorHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ notifyOnDataEvent(TestRunField.PROCESSOR_ID.toString(), element.getAttribute("proc"));
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/DemoInfoHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/DemoInfoHandler.java
new file mode 100644
index 00000000000..da8f3577dad
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/DemoInfoHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DemoInfoHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ String formalityLevel = element.getAttribute("level");
+ String buildId = element.getAttribute("buildId");
+
+ if (Strings.isValid(formalityLevel) != true) {
+ formalityLevel = "DEVELOPMENT";
+ }
+ notifyOnDataEvent(TestRunField.QUALIFICATION_LEVEL.toString(), formalityLevel.toUpperCase());
+
+ if (Strings.isValid(buildId) != true) {
+ buildId = "unknown";
+ }
+ notifyOnDataEvent(TestRunField.BUILD_ID.toString(), buildId);
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ElapsedTimeHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ElapsedTimeHandler.java
new file mode 100644
index 00000000000..9e2cb774c28
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ElapsedTimeHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ElapsedTimeHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ /*
+ * <RuntimeVersions> <Version>B3_V1_FTB1.PROPOSED.2007_08_28_14:12:23</Version>
+ * <Version>VER1__13-September-2007_03:19:29</Version> </RuntimeVersions>
+ *
+ * <ElapsedTime elapsed="0:01:28" endDate="Thu Sep 13 15:50:24 MDT 2007" milliseconds="88768"
+ * startDate="Thu Sep 13 15:48:55 MDT 2007"/> <TestPointResults fail="41" pass="167"
+ * total="208"/>
+ *
+ */
+ notifyOnDataEvent(TestRunField.SCRIPT_END_DATE.toString(), element.getAttribute("endDate"));
+ notifyOnDataEvent(TestRunField.SCRIPT_START_DATE.toString(), element.getAttribute("startDate"));
+ notifyOnDataEvent(TestRunField.SCRIPT_ELAPSED_TIME.toString(), element.getAttribute("elapsed"));
+ // callback.addOverviewData("Time Info", String.format("Elapsed [ %s ] Start [ %s ] Stop [
+ // %s ]", elapsed, startDate, endDate));
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ExecutionStatusHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ExecutionStatusHandler.java
new file mode 100644
index 00000000000..51ffaffe3a6
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/ExecutionStatusHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExecutionStatusHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ notifyOnDataEvent(TestRunField.SCRIPT_EXECUTION_TIME.toString(), Jaxp.getChildText(element, "Time"));
+ notifyOnDataEvent(TestRunField.SCRIPT_EXECUTION_RESULTS.toString(), Jaxp.getChildText(element, "ExecutionResult"));
+ notifyOnDataEvent(TestRunField.SCRIPT_EXECUTION_ERRORS.toString(), Jaxp.getChildText(element, "ExecutionDetails"));
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/RuntimeVersionsHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/RuntimeVersionsHandler.java
new file mode 100644
index 00000000000..aec739388a7
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/RuntimeVersionsHandler.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.define.parser.handlers;
+
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RuntimeVersionsHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ List<Element> versions = Jaxp.getChildDirects(element, "Version");
+ StringBuilder sb = new StringBuilder();
+ for (Element el : versions) {
+ sb.append(Jaxp.getElementCharacterData(el));
+ sb.append(" ");
+ }
+ notifyOnDataEvent(TestRunField.SYSTEM_OSEE_SERVER_JAR_VERSIONS.toString(), sb.toString());
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/SystemInfoHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/SystemInfoHandler.java
new file mode 100644
index 00000000000..38dd9b65e44
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/SystemInfoHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SystemInfoHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ /*
+ * <RuntimeVersions> <Version>B3_V1_FTB1.PROPOSED.2007_08_28_14:12:23</Version>
+ * <Version>VER1__13-September-2007_03:19:29</Version> </RuntimeVersions> <SystemInfo
+ * osArch="i386" osName="Linux" osVersion="2.6.11.12" oseeVersion="Development"/>
+ */
+ notifyOnDataEvent(TestRunField.SYSTEM_OS_ARCH.toString(), element.getAttribute("osArch"));
+ notifyOnDataEvent(TestRunField.SYSTEM_OS_NAME.toString(), element.getAttribute("osName"));
+ notifyOnDataEvent(TestRunField.SYSTEM_OS_VERSION.toString(), element.getAttribute("osVersion"));
+ notifyOnDataEvent(TestRunField.SYSTEM_OSEE_VERSION.toString(), element.getAttribute("oseeVersion"));
+ notifyOnDataEvent(TestRunField.SYSTEM_OSEE_SERVER_TITLE.toString(), element.getAttribute("oseeServerTitle"));
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/TestPointResultsHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/TestPointResultsHandler.java
new file mode 100644
index 00000000000..18261a8416b
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/TestPointResultsHandler.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.define.parser.handlers;
+
+import org.eclipse.osee.ote.define.TestRunField;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestPointResultsHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ notifyOnDataEvent(TestRunField.TEST_POINTS_PASSED.toString(), element.getAttribute("pass"));
+ notifyOnDataEvent(TestRunField.TEST_POINTS_FAILED.toString(), element.getAttribute("fail"));
+ notifyOnDataEvent(TestRunField.TOTAL_TEST_POINTS.toString(), element.getAttribute("total"));
+ notifyOnDataEvent(TestRunField.TEST_ABORT_STATUS.toString(), element.getAttribute("aborted"));
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/VersionInformationHandler.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/VersionInformationHandler.java
new file mode 100644
index 00000000000..0c1f1a13705
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/parser/handlers/VersionInformationHandler.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.define.parser.handlers;
+
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Element;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class VersionInformationHandler extends AbstractParseHandler {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.handlers.AbstractParseHandler#processSaxChunk(org.w3c.dom.Element)
+ */
+ @Override
+ protected void processSaxChunk(Element element) {
+ List<Element> versions = Jaxp.getChildDirects(element, "Version");
+ for (Element version : versions) {
+ notifyOnDataEvent("name", version.getAttribute("name"));
+ notifyOnDataEvent("underTest", version.getAttribute("underTest"));
+ notifyOnDataEvent("version", version.getAttribute("version"));
+ notifyOnDataEvent("versionUnit", version.getAttribute("versionUnit"));
+ // item.getChildren().add(new BaseOutfileTreeItem(name, versionTitle,
+ // String.format("unitId[%s] underTest[%s]", unit, underTest), null));
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileDataCollector.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileDataCollector.java
new file mode 100644
index 00000000000..e8618e57b25
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileDataCollector.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.define.utilities;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.TestRunField;
+import org.eclipse.osee.ote.define.artifacts.OteToAttributeMap;
+import org.eclipse.osee.ote.define.parser.IDataListener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutfileDataCollector implements IDataListener {
+ private static final OteToAttributeMap oteToAttributeMap = OteToAttributeMap.getInstance();
+
+ private Map<String, String> collectedData;
+
+ public OutfileDataCollector() {
+ this.collectedData = new HashMap<String, String>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.ui.define.parser.IDataListener#notifyDataEvent(java.lang.String,
+ * java.lang.String)
+ */
+ public void notifyDataEvent(String name, String value) {
+ collectedData.put(name, value);
+ }
+
+ public void populate(Artifact artifact) throws OseeCoreException {
+ checkForNull(artifact);
+ for (String fieldName : collectedData.keySet()) {
+ String attribute = oteToAttributeMap.getAttributeName(fieldName);
+ if (Strings.isValid(attribute) && artifact.isAttributeTypeValid(attribute)) {
+ try {
+ String value = collectedData.get(fieldName);
+ Object object = oteToAttributeMap.asTypedObject(attribute, value);
+ artifact.setSoleAttributeValue(attribute, object);
+ } catch (Exception ex) {
+ OseeLog.log(OteDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ artifact.setDescriptiveName(getField(TestRunField.SCRIPT_NAME.name()));
+ }
+
+ public String getField(String name) {
+ String toReturn = collectedData.get(name);
+ return Strings.isValid(toReturn) ? toReturn : "";
+ }
+
+ private void checkForNull(Object object) {
+ if (object == null) {
+ throw new IllegalArgumentException(String.format("Argument was null [%s]", object.getClass().getName()));
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileParserExtensionManager.java b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileParserExtensionManager.java
new file mode 100644
index 00000000000..a6a514edcd8
--- /dev/null
+++ b/org.eclipse.osee.ote.define/src/org/eclipse/osee/ote/define/utilities/OutfileParserExtensionManager.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.define.utilities;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.ote.define.OteDefinePlugin;
+import org.eclipse.osee.ote.define.parser.BaseOutfileParser;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutfileParserExtensionManager {
+
+ private static final String OUTFILE_PARSER = "OutfileParser";
+ private static final String CLASS_NAME = "classname";
+ private static final String SUPPORTED_EXTENSIONS = "supportedExtensions";
+ private final Map<String, BaseOutfileParser> contributions;
+ private final HashCollection<String, BaseOutfileParser> extensionsToParsers;
+
+ private static OutfileParserExtensionManager instance = null;
+
+ private OutfileParserExtensionManager() {
+ contributions = new HashMap<String, BaseOutfileParser>();
+ extensionsToParsers = new HashCollection<String, BaseOutfileParser>(false, HashSet.class);
+ }
+
+ public static OutfileParserExtensionManager getInstance() {
+ if (instance == null) {
+ instance = new OutfileParserExtensionManager();
+ }
+ return instance;
+ }
+
+ public String[] getSupportedExtensions() throws OseeCoreException {
+ checkObjectsLoaded();
+ Set<String> set = extensionsToParsers.keySet();
+ return set.toArray(new String[set.size()]);
+ }
+
+ public BaseOutfileParser getOutfileParserFor(URL fileToImport) throws OseeCoreException {
+ checkObjectsLoaded();
+ BaseOutfileParser toReturn = null;
+ for (BaseOutfileParser parser : getOutfileParsers()) {
+ if (parser.isValidParser(fileToImport)) {
+ toReturn = parser;
+ break;
+ }
+ }
+ if (toReturn == null) {
+ throw new OseeStateException(String.format("Unsupported outfile type [%s] no valid outfile parser found",
+ fileToImport));
+ }
+ return toReturn;
+ }
+
+ public BaseOutfileParser getOutfileParserById(String id) throws OseeCoreException {
+ checkObjectsLoaded();
+ return contributions.get(id);
+ }
+
+ public Collection<BaseOutfileParser> getOutfileParsers() throws OseeCoreException {
+ checkObjectsLoaded();
+ return contributions.values();
+ }
+
+ private void checkObjectsLoaded() throws OseeCoreException {
+ if (contributions.isEmpty()) {
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements(OteDefinePlugin.PLUGIN_ID + "." + OUTFILE_PARSER, OUTFILE_PARSER);
+ for (IConfigurationElement element : elements) {
+ IExtension extension = ((IExtension) element.getParent());
+ String identifier = extension.getUniqueIdentifier();
+ String bundleName = element.getContributor().getName();
+ String parserClassName = element.getAttribute(CLASS_NAME);
+ String supportedExtensions = element.getAttribute(SUPPORTED_EXTENSIONS);
+ Set<String> supportedSet = getSupportedExtensions(supportedExtensions);
+ BaseOutfileParser parser = (BaseOutfileParser) loadClass(bundleName, parserClassName);
+ if (parser != null) {
+ contributions.put(identifier, parser);
+ for (String extensionType : supportedSet) {
+ extensionsToParsers.put(extensionType, parser);
+ }
+ }
+ }
+ }
+ }
+
+ private Set<String> getSupportedExtensions(String rawExtensions) {
+ Set<String> toReturn = new HashSet<String>();
+ for (String value : rawExtensions.split(";")) {
+ value = value.trim();
+ if (Strings.isValid(value)) {
+ toReturn.add(value);
+ }
+ }
+ return toReturn;
+ }
+
+ private Object loadClass(String bundleName, String className) throws OseeCoreException {
+ Object object = null;
+ if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> taskClass = bundle.loadClass(className);
+ try {
+ Method getInstance = taskClass.getMethod("getInstance", new Class[] {});
+ object = getInstance.invoke(null, new Object[] {});
+ } catch (Exception ex) {
+ object = taskClass.newInstance();
+ }
+ } catch (Exception ex) {
+ throw new OseeCoreException(String.format("Unable to Load: [%s - %s]", bundleName, className), ex);
+ }
+ }
+ return object;
+ }
+}
diff --git a/org.eclipse.osee.ote.define/support/OseeTypes_OTE.xml b/org.eclipse.osee.ote.define/support/OseeTypes_OTE.xml
new file mode 100644
index 00000000000..2f28bdcf1e5
--- /dev/null
+++ b/org.eclipse.osee.ote.define/support/OseeTypes_OTE.xml
@@ -0,0 +1,1392 @@
+<?xml version="1.0"?>
+<?mso-application progid="Excel.Sheet"?>
+<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:x="urn:schemas-microsoft-com:office:excel"
+ xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
+ xmlns:html="http://www.w3.org/TR/REC-html40">
+ <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
+ <Author>Robert Fisher</Author>
+ <LastAuthor>b1122182</LastAuthor>
+ <LastPrinted>2006-03-15T03:49:16Z</LastPrinted>
+ <Created>2005-07-01T21:31:12Z</Created>
+ <LastSaved>2009-04-01T22:31:12Z</LastSaved>
+ <Company>The Boeing Company</Company>
+ <Version>11.9999</Version>
+ </DocumentProperties>
+ <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
+ <DoNotRelyOnCSS/>
+ </OfficeDocumentSettings>
+ <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
+ <WindowHeight>11685</WindowHeight>
+ <WindowWidth>19140</WindowWidth>
+ <WindowTopX>2505</WindowTopX>
+ <WindowTopY>660</WindowTopY>
+ <ProtectStructure>False</ProtectStructure>
+ <ProtectWindows>False</ProtectWindows>
+ </ExcelWorkbook>
+ <Styles>
+ <Style ss:ID="Default" ss:Name="Normal">
+ <Alignment ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font/>
+ <Interior/>
+ <NumberFormat/>
+ <Protection/>
+ </Style>
+ <Style ss:ID="s21">
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s22">
+ <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s23">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s24">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s25">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s26">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="Short Date"/>
+ </Style>
+ <Style ss:ID="s27">
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s28">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s29">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ <Interior/>
+ </Style>
+ <Style ss:ID="s30">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s31">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s32">
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s33">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s34">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat/>
+ </Style>
+ <Style ss:ID="s35">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s36">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s37">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
+ <Borders/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ </Style>
+ <Style ss:ID="s38">
+ <Borders>
+ <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s39">
+ <Font x:Family="Swiss" ss:Size="9" ss:Bold="1"/>
+ </Style>
+ <Style ss:ID="s40">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Borders>
+ <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"/>
+ <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"/>
+ </Borders>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="0"/>
+ </Style>
+ <Style ss:ID="s41">
+ <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
+ <Font x:Family="Swiss" ss:Size="9"/>
+ <NumberFormat ss:Format="@"/>
+ </Style>
+ </Styles>
+ <Worksheet ss:Name="OTE Skynet">
+ <Names>
+ <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="='OTE Skynet'!R83C1:R86C4"
+ ss:Hidden="1"/>
+ </Names>
+ <Table ss:ExpandedColumnCount="256" ss:ExpandedRowCount="90" x:FullColumns="1"
+ x:FullRows="1" ss:StyleID="s21" ss:DefaultRowHeight="12">
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="378"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="343.5"/>
+ <Column ss:StyleID="s21" ss:Width="108.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="143.25"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="147.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="84.75"/>
+ <Column ss:StyleID="s21" ss:AutoFitWidth="0" ss:Width="221.25"/>
+ <Column ss:StyleID="s21" ss:Width="58.5"/>
+ <Column ss:StyleID="s21" ss:Width="75.75" ss:Span="1"/>
+ <Row ss:AutoFitHeight="0" ss:Height="96">
+ <Cell ss:StyleID="s22"><Data ss:Type="String"># Copyright (c) 2004, 2007 Boeing.&#10;# All rights reserved. This program and the accompanying materials&#10;# are made available under the terms of the Eclipse Public License v1.0&#10;# which accompanies this distribution, and is available at&#10;# http://www.eclipse.org/legal/epl-v10.html&#10;# &#10;# Contributors:&#10;# Boeing - initial API and implementation</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Factory Class</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Super Type Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Case</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Unit</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s24"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Support</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Unit</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s27"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.artifact.factory.BasicArtifactFactory</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Test Run Disposition</Data></Cell>
+ <Cell ss:StyleID="s26"><Data ss:Type="String">Artifact</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Attribute Base Type</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">AttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Attribute Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">File Extension</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Tagger ID</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Default Value</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Validity Xml</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Min Occurrence</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Max Occurrence</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Tip Text</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">User Visible</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.ote.define.MappedAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Outfile URL</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">tmo</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">&quot;&quot;</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Test Run Content</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Script URL</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Url of the test script used</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Revision</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Modified Flag</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">File Modification Flag from Repository</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Last Author</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Last Author</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Last Modified Date</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Last Modified</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Architecture</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">OS Architecture</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Name</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">OS Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Version</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Version</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Server Title</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Server Title</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Server Jar Version</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Server Jar Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Processor ID</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Processor ID</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Start Date</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Start Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">End Date</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Stop Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Elapsed Date</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Time Elapsed from the start to the end of the script</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Passed</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Number of test points that passed</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Failed</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Number of test points that failed</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.IntegerAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Total Test Points</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Total test points</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Script Aborted</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Test Abort status</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Script GUID</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Test Case GUID</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Ran In Batch Mode</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">no</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Run was performed as part of a batch</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.BooleanAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Is Batch Mode Allowed</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">yes</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Whether Test Script is allowed to run as part of a batch</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">User ID</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Id of the user who ran the test</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DateAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Last Date Uploaded</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Last time outfile was uploaded</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qualification Level</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">DEVELOPMENT</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Qualification level</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Build Id</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">DefaultAttributeTaggerProvider</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">unknown</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Build Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Checksum</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Test Case Checksum</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Extension</Data></Cell>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s25"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">tmo</Data></Cell>
+ <Cell ss:StyleID="s30"/>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s31"><Data ss:Type="String">Outfile Extension</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s33"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.StringAttribute</Data></Cell>
+ <Cell ss:StyleID="s33"><Data ss:Type="String">org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</Data></Cell>
+ <Cell ss:StyleID="s34"><Data ss:Type="String">Disposition</Data></Cell>
+ <Cell ss:StyleID="s34"/>
+ <Cell ss:StyleID="s34"/>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s33"/>
+ <Cell ss:StyleID="s33"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s33"><Data ss:Type="Number">1</Data></Cell>
+ <Cell ss:StyleID="s35"><Data ss:Type="String">Disposition</Data></Cell>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s37"/>
+ <Cell ss:StyleID="s32"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="11.25"/>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s38"><Data ss:Type="String">Artifact Type Name</Data></Cell>
+ <Cell ss:StyleID="s38"><Data ss:Type="String">Attribute Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Script GUID</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Script URL</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Outfile URL</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">User ID</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Revision</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Modified Flag</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Last Author</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Last Modified Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Architecture</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Name</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OS Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Server Title</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">OSEE Server Jar Version</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Processor ID</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Start Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">End Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Elapsed Date</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Ran In Batch Mode</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Is Batch Mode Allowed</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Passed</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Failed</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Total Test Points</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Script Aborted</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Last Date Uploaded</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Qualification Level</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Build Id</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Checksum</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Extension</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run Disposition</Data></Cell>
+ <Cell ss:StyleID="s28"><Data ss:Type="String">Disposition</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="14.25"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># Side &quot;A/B&quot; Name should be a free text descriptive name for the user - links between sides and artifact types are performed in the table below.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Relation type name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Side A Name</Data></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">A to B Phrase</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Side B Name</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">B to A Phrase</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Short Name</Data></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Ordered</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Test Script to Run Relation</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Case</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">has many</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">is a result of</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">ScriptRun</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Uses</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">requirement</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">is used by</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Unit</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">uses</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Uses</Data></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">No</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5"/>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s39"><Data ss:Type="String">#the first max values specified for an &lt;artifact type, relation type&gt; pair is used, so put the constraint for a concreate type before the constraint for a supertype</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;A&quot;, &quot;Side A Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell><Data ss:Type="String"># An artifact of type &quot;Artifact Type&quot; can be on side &quot;B&quot;, &quot;Side B Max&quot; number of times for relation links of type &quot;Relation Type&quot;.</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Artifact Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Relation Type</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s23"><Data ss:Type="String">Side A Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s29"><Data ss:Type="String">Side B Max</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Case</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Test Script to Run Relation</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s40"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Run</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Test Script to Run Relation</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">1</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Unit</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s30"><Data ss:Type="String">Verification</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data><NamedCell
+ ss:Name="_FilterDatabase"/></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Requirement</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Uses</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s25"><Data ss:Type="String">Test Unit</Data></Cell>
+ <Cell ss:StyleID="s36"><Data ss:Type="String">Uses</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="Number">0</Data></Cell>
+ <Cell ss:StyleID="s25"><Data ss:Type="String">UNLIMITED</Data></Cell>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ </Row>
+ <Row ss:AutoFitHeight="0" ss:Height="13.5">
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s36"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ <Cell ss:StyleID="s28"/>
+ </Row>
+ <Row ss:AutoFitHeight="0">
+ <Cell ss:StyleID="s41"><Data ss:Type="String">#need method to record whether allocation has been verified as complete and re-verify if changes potentially impact the allocation</Data></Cell>
+ </Row>
+ </Table>
+ <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
+ <PageSetup>
+ <Layout x:Orientation="Landscape"/>
+ </PageSetup>
+ <Unsynced/>
+ <Print>
+ <ValidPrinterInfo/>
+ <HorizontalResolution>600</HorizontalResolution>
+ <VerticalResolution>600</VerticalResolution>
+ </Print>
+ <Selected/>
+ <LeftColumnVisible>1</LeftColumnVisible>
+ <Panes>
+ <Pane>
+ <Number>3</Number>
+ <ActiveRow>4</ActiveRow>
+ <ActiveCol>3</ActiveCol>
+ </Pane>
+ </Panes>
+ <ProtectObjects>False</ProtectObjects>
+ <ProtectScenarios>False</ProtectScenarios>
+ </WorksheetOptions>
+ <AutoFilter x:Range="R83C1:R86C4"
+ xmlns="urn:schemas-microsoft-com:office:excel">
+ </AutoFilter>
+ <Sorting xmlns="urn:schemas-microsoft-com:office:excel">
+ <Sort>Artifact Type Name</Sort>
+ </Sorting>
+ </Worksheet>
+</Workbook>
diff --git a/org.eclipse.osee.ote.feature/.project b/org.eclipse.osee.ote.feature/.project
new file mode 100644
index 00000000000..2fa1d35232d
--- /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 00000000000..add83c7a24c
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+ epl-v10.html,\
+ feature.properties,\
+ license.html,\
+ osee_32.png
diff --git a/org.eclipse.osee.ote.feature/epl-v10.html b/org.eclipse.osee.ote.feature/epl-v10.html
new file mode 100644
index 00000000000..ed4b196655e
--- /dev/null
+++ b/org.eclipse.osee.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.ote.feature/feature.properties b/org.eclipse.osee.ote.feature/feature.properties
new file mode 100644
index 00000000000..1d224decde4
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/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 (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.ote.feature/feature.xml b/org.eclipse.osee.ote.feature/feature.xml
new file mode 100644
index 00000000000..db12788d25e
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/feature.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.ote.feature"
+ label="%featureName"
+ version="1.0.0.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.osee.framework.ui.product">
+
+ <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="%licenseURL">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://www.eclipse.org/downloads/download.php?file=/technology/osee/updatesite"/>
+ </url>
+
+ <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.message"
+ 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.ui.mux"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.ui.host.cmd"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.ui.define"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.define"
+ 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"/>
+
+</feature>
diff --git a/org.eclipse.osee.ote.feature/license.html b/org.eclipse.osee.ote.feature/license.html
new file mode 100644
index 00000000000..c6af966b61e
--- /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/osee_32.png b/org.eclipse.osee.ote.feature/osee_32.png
new file mode 100644
index 00000000000..5e36a1842e6
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/osee_32.png
Binary files differ
diff --git a/org.eclipse.osee.ote.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.ote.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 00000000000..f6cd6d47325
--- /dev/null
+++ b/org.eclipse.osee.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.ote.message/.classpath b/org.eclipse.osee.ote.message/.classpath
new file mode 100644
index 00000000000..64ed6b3795d
--- /dev/null
+++ b/org.eclipse.osee.ote.message/.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.message/.cvsignore b/org.eclipse.osee.ote.message/.cvsignore
new file mode 100644
index 00000000000..092357e47d3
--- /dev/null
+++ b/org.eclipse.osee.ote.message/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.osee.ote.message/.project b/org.eclipse.osee.ote.message/.project
new file mode 100644
index 00000000000..d05513a0b43
--- /dev/null
+++ b/org.eclipse.osee.ote.message/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.message</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.message/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..da27f536284
--- /dev/null
+++ b/org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,256 @@
+#Wed Apr 09 09:42:31 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=80
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=0
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=3
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=3
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..b486dc19dbb
--- /dev/null
+++ b/org.eclipse.osee.ote.message/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Wed Apr 09 09:42:31 MST 2008
+eclipse.preferences.version=1
+formatter_profile=_OSEE Java Standard
+formatter_settings_version=11
diff --git a/org.eclipse.osee.ote.message/ElementTest.launch b/org.eclipse.osee.ote.message/ElementTest.launch
new file mode 100644
index 00000000000..9a11dd3380c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/ElementTest.launch
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.osee.ote.message"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.osee.ote.message/src&lt;org.eclipse.osee.ote.message.test"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osee.ote.message"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.ote.message/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.message/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..438fef330d0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Message Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.message;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Vendor: Eclipse.org
+Export-Package: 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.elements.test,
+ org.eclipse.osee.ote.message.enums,
+ 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.test,
+ 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
+Require-Bundle: org.eclipse.osee.ote.core,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.ote.messaging.dds,
+ org.junit4,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.help,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.osgi
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-Activator: org.eclipse.osee.ote.message.internal.Activator
diff --git a/org.eclipse.osee.ote.message/build.properties b/org.eclipse.osee.ote.message/build.properties
new file mode 100644
index 00000000000..309234b4bca
--- /dev/null
+++ b/org.eclipse.osee.ote.message/build.properties
@@ -0,0 +1,8 @@
+bin.includes = plugin.xml,\
+ META-INF/,\
+ src/,\
+ .,\
+ help/
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.eclipse.osee.ote.message/help/toc.xml b/org.eclipse.osee.ote.message/help/toc.xml
new file mode 100644
index 00000000000..33fc54826e0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/help/toc.xml
@@ -0,0 +1,3 @@
+<toc link_to="../org.eclipse.osee.ote.core/help/toc.xml#environments" label="Message System Test Environment">
+ <topic href="src/org/eclipse/osee/ote/message/package.html" label="Message System Test Environment"/>
+</toc> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/plugin.xml b/org.eclipse.osee.ote.message/plugin.xml
new file mode 100644
index 00000000000..755d0139459
--- /dev/null
+++ b/org.eclipse.osee.ote.message/plugin.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.osee.framework.jini.JiniInterface">
+ <RegisterBundle/>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java
new file mode 100644
index 00000000000..f08f368f911
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.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;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+/**
+ * @author 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.message/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java
new file mode 100644
index 00000000000..9811393a6d4
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.MemType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMemSourceChangeListener {
+ void onChange(MemType oldtype, MemType newType, Message<?,?,?> message);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java
new file mode 100644
index 00000000000..5ab66ffda52
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageDisposeListener.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;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageDisposeListener {
+ void onPreDispose(Message<?,?,?> message);
+ void onPostDispose(Message<?,?,?> message);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageHeader.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageHeader.java
new file mode 100644
index 00000000000..ebeaa23a26e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.
+ * @param data
+ */
+// public void copyData(byte[] data);
+ public byte[] getData();
+
+ public Element[] getElements();
+ /**
+ * @param data
+ */
+ public void setNewBackingBuffer(byte[] data);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageSendListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageSendListener.java
new file mode 100644
index 00000000000..8968de60942
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/IMessageTestContext.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageTestContext.java
new file mode 100644
index 00000000000..ceecd1f52d3
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IMessageTestContext.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;
+
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface IMessageTestContext extends ITestContext {
+ void resetScriptLoader(String[] strings) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java
new file mode 100644
index 00000000000..6f6938b49fc
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IOInstrumentationDB.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.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<String, IOInstrumentation>();;
+ 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.message/src/org/eclipse/osee/ote/message/IOteIO.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IOteIO.java
new file mode 100644
index 00000000000..b29179399a0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java
new file mode 100644
index 00000000000..f34042149db
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.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
+ *
+ */
+@Deprecated
+public interface IPreScriptInstantiation {
+ void run();
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/Message.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/Message.java
new file mode 100644
index 00000000000..5b6c6ab165f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/Message.java
@@ -0,0 +1,1172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+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.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.MemType;
+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 {
+ private static volatile AtomicLong constructed = new AtomicLong(0);
+ private static volatile AtomicLong finalized = new AtomicLong(0);
+ private final HashMap<String, Element> elementMap;
+ private String name;
+ private final MessageSystemListener listenerHandler;
+ protected final ArrayList<IMessageScheduleChangeListener> schedulingChangeListeners =
+ new ArrayList<IMessageScheduleChangeListener>(10);
+ private boolean destroyed = false;
+
+ private MemType currentMemType;
+ private final EnumMap<MemType, ArrayList<U>> memTypeToMessageMap = new EnumMap<MemType, ArrayList<U>>(MemType.class);
+ private final EnumMap<MemType, ArrayList<T>> memToDataMap = new EnumMap<MemType, ArrayList<T>>(MemType.class);
+ private final int phase;
+ protected double rate;
+ protected final double defaultRate;
+ private boolean isScheduled = false;
+ private boolean isScheduledFromStart;
+ private boolean regularUnscheduleCalled = false;
+ private boolean isTurnedOff = false;
+
+ private final EnumSet<MemType> memTypeActive = EnumSet.noneOf(MemType.class);
+ // private IOteIO io;
+
+ private T defaultMessageData;
+
+ private List<IMemSourceChangeListener> preMemSourceChangeListeners = new ArrayList<IMemSourceChangeListener>();
+ private List<IMemSourceChangeListener> postMemSourceChangeListeners = new ArrayList<IMemSourceChangeListener>();
+ private List<IMessageDisposeListener> preMessageDisposeListeners = new ArrayList<IMessageDisposeListener>();
+ private List<IMessageDisposeListener> postMessageDisposeListeners = new ArrayList<IMessageDisposeListener>();
+
+ // public int BIT_OFFSET = 0;
+
+ protected final MessageSystemListener removableListenerHandler;
+
+ public Message(String name, boolean isScheduled, int phase, double rate) {
+ constructed.incrementAndGet();
+ listenerHandler = new MessageSystemListener(this);
+ this.name = name;
+ elementMap = new LinkedHashMap<String, Element>(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();
+ }
+
+ /**
+ *
+ */
+ 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(MemType 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(MemType 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) {
+ Collection<T> dataList = memToDataMap.get(currentMemType);
+ if (dataList != null) {
+ for (T data : dataList) {
+ data.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(MemType 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, MemType type) {
+ return setMemSource(type);
+ }
+
+ /**
+ * Associates Messages to MemTypes based on the memType's physical availability
+ *
+ * @param accessor
+ */
+ // 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(MemType memType) {
+ checkState();
+ switchElementAssociation(getMessageTypeAssociation(memType));
+ }
+
+ public abstract void switchElementAssociation(Collection<U> messages);
+
+ public void addMessageTypeAssociation(MemType memType, U messageToBeAdded) {
+ checkState();
+ ArrayList<U> list;
+ if (!memTypeToMessageMap.containsKey(memType)) {
+ list = new ArrayList<U>(4);
+ memTypeToMessageMap.put(memType, list);
+ } else {
+ list = memTypeToMessageMap.get(memType);
+ }
+ list.add(messageToBeAdded);
+
+ // addMessageDataSource(messageToBeAdded.defaultMessageData);
+ }
+
+ protected Collection<U> getMessageTypeAssociation(MemType 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 MemType type = data.getType();
+ final ArrayList<T> list;
+ if (!memToDataMap.containsKey(type)) {
+ list = new ArrayList<T>(MemType.values().length);
+ memToDataMap.put(type, list);
+ } else {
+ list = memToDataMap.get(type);
+ }
+ list.add(data);
+ data.addMessage(this);
+ data.setScheduled(isScheduledFromStart);
+ }
+
+ public Collection<T> getMemSource(MemType type) {
+ checkState();
+ final ArrayList<T> list = memToDataMap.get(type);
+ if (list != null)
+ return Collections.unmodifiableCollection(list);
+ else
+ return new ArrayList<T>();
+ }
+
+ public boolean getMemSource(MemType type, Collection<T> listToAddto) {
+ checkState();
+ final ArrayList<T> list = memToDataMap.get(type);
+ if (list != null) {
+ return listToAddto.addAll(list);
+ }
+ return false;
+ }
+
+ public MemType getMemType() {
+ return currentMemType;
+ }
+
+ public void addElement(Element element) {
+ checkState();
+ elementMap.put(element.getName(), element);
+ }
+
+ /**
+ * Gets a list of all the message's data elements
+ *
+ * @return a collection of {@link Element}s
+ */
+ public Collection<Element> getElements() {
+ checkState();
+ return elementMap.values();
+ }
+
+ public void getAllElements(Collection<Element> elements) {
+ checkState();
+ elements.addAll(elementMap.values());
+ elements.addAll(Arrays.asList(getActiveDataSource().getMsgHeader().getElements()));
+ }
+
+ public Collection<Element> getElements(MemType type) {
+ checkState();
+ LinkedList<Element> list = new LinkedList<Element>();
+ 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));
+ }
+
+ /**
+ * @param elementPath
+ * @return boolean
+ */
+ 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 {
+ el = this.elementMap.get((String) elementPath.get(1));
+ 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, MemType type) {
+ return getElement(elementPath).switchMessages(this.getMessageTypeAssociation(type));
+ }
+
+ /**
+ *
+ * @param elementName
+ * @param 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, MemType type) {
+ checkState();
+ Element retVal = elementMap.get(elementName);
+ if( retVal == null )
+ {
+ throw new IllegalArgumentException(String.format("Element %s not found in message %s.", elementName, getName() ));
+ }
+ return retVal.switchMessages(this.getMessageTypeAssociation(type));
+ }
+
+ public Element getBodyOrHeaderElement(String elementName) {
+ return getBodyOrHeaderElement(elementName, currentMemType);
+ }
+
+ public Element getBodyOrHeaderElement(String elementName, MemType 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.
+ *
+ * @return boolean
+ */
+ public boolean isTurnedOff() {
+ return isTurnedOff;
+ }
+
+ private void setSchedule(boolean newValue) {
+ isScheduled = newValue;
+ getActiveDataSource().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(isScheduled);
+ }
+ }
+
+ /**
+ * 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(isScheduled);
+ }
+
+ /**
+ * This is a "soft" unschedule that is called during the registering of messages that will allow the messages to be
+ * scheduled after the control message goes out.
+ */
+ public void whenBeingRegisteredUnschedule() {
+ checkState();
+ setSchedule(false);
+ for (IMessageScheduleChangeListener listener : schedulingChangeListeners)
+ listener.isScheduledChanged(isScheduled);
+ }
+
+ /**
+ * Returns if the message is scheduled or not.
+ *
+ * @return boolean
+ */
+ public boolean isScheduled() {
+ return isScheduled && this.getActiveDataSource().isScheduled();
+ }
+
+ /**
+ * 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 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 MemType type) {
+ checkState();
+ this.listenerHandler.onDataAvailable(data, type);
+ }
+
+ /*
+ * public HashMap getTypeToMessageData(){ return typeToMessageData; }
+ */
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ private static final int TransmissionTimeoutDefault = 15000;
+
+ public String toString() {
+ return name;
+ }
+
+ /**
+ * @return Returns the messageName.
+ */
+ public String getMessageName() {
+ return name;
+ }
+
+ 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;
+ }
+
+ public void zeroize() {
+ checkState();
+ for (MemType memType : memToDataMap.keySet()) {
+ for (Element el : getElements(memType)) {
+ el.zeroize();
+ }
+ }
+ // for (ArrayList<T> list : memToDataMap.values()) {
+ // for (T md : list) {
+ // md.zeroize();
+ // }
+ // }
+ }
+
+ /**
+ * Verifies that the message is sent at least once using the default message timeout.
+ *
+ * @param accessor
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ public final boolean checkForTransmission(ITestAccessor accessor) throws InterruptedException {
+ return checkForTransmission(accessor, TransmissionTimeoutDefault);
+ }
+
+ /**
+ * Verifies that the message is sent at least once within the time specified.
+ *
+ * @param accessor
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ public final 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.
+ *
+ * @param accessor
+ * @param numTransmissions the number of transmissions to look for
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ public final 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 accessor
+ * @param numTransmissions the number of transmission to look for
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param milliseconds the amount to time (in milliseconds) to check
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ public boolean checkForNoTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int milliseconds) throws InterruptedException {
+ checkState();
+ if (accessor != 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.
+ *
+ * @param accessor
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ public boolean waitForTransmission(ITestEnvironmentMessageSystemAccessor accessor) throws InterruptedException {
+ return waitForTransmission(accessor, TransmissionTimeoutDefault);
+ }
+
+ /**
+ * Waits until message is sent at least once within the time specified.
+ *
+ * @param accessor
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param numTransmissions the number of transmissions to look for
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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(MemType 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.
+ *
+ * @param state
+ */
+ 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(MemType 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(MemType currentMemType) {
+ checkState();
+ this.currentMemType = currentMemType;
+ }
+
+ public boolean setMemSource(MemType type) {
+ checkState();
+ MemType oldMemType = getMemType();
+ notifyPreMemSourceChangeListeners(oldMemType, type, this);
+ this.switchElementAssociation(type);
+ setCurrentMemType(type);
+ notifyPostMemSourceChangeListeners(oldMemType, type, this);
+ return true;
+ }
+
+ public boolean activateMemSource(MemType type) {
+ checkState();
+ MemType oldMemType = getMemType();
+ notifyPreMemSourceChangeListeners(oldMemType, type, this);
+ // this.switchElementAssociation(type);
+ // setCurrentMemType(type);
+ notifyPostMemSourceChangeListeners(oldMemType, type, this);
+ return true;
+ }
+
+ /**
+ *
+ */
+ private void notifyPostMemSourceChangeListeners(MemType old, MemType 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(MemType old, MemType 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 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<MemType> getAvailableMemTypes() {
+ checkState();
+ return memToDataMap.keySet();
+ }
+
+ public Collection<T> getMessageData(MemType 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
+ */
+ protected void setDefaultMessageData(T defaultMessageData) {
+ checkState();
+ this.defaultMessageData = defaultMessageData;
+ addMessageDataSource((T) defaultMessageData);
+ addMessageTypeAssociation(defaultMessageData.getType(), (U) this);
+ }
+
+ public boolean isWriter() {
+ checkState();
+ return defaultMessageData.isWriter();
+ }
+
+ public void setMemTypeActive(MemType type) {
+ checkState();
+ memTypeActive.add(type);
+ notifyPostMemSourceChangeListeners(currentMemType, currentMemType, this);
+ }
+
+ public void setMemTypeInactive(MemType type) {
+ checkState();
+ memTypeActive.add(type);
+ notifyPostMemSourceChangeListeners(currentMemType, currentMemType, this);
+ }
+
+ public boolean isMemTypeActive(MemType 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();
+ }
+
+ /**
+ * @param element
+ * @return boolean
+ */
+ public boolean isValidElement(Element currentElement, Element proposedElement) {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java
new file mode 100644
index 00000000000..c384c66230f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.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;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @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.
+ *
+ * @return String
+ */
+ String singletonId();
+
+ String majorVersion();
+
+ String minorVersion();
+
+ InputStream getMetaInfo(String id) throws IOException;
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageEventLogger.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageEventLogger.java
new file mode 100644
index 00000000000..d73629360ed
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageEventLogger.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.ref.WeakReference;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.enums.MemType;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public class MessageEventLogger implements UniversalMessageListener{
+ private static final String BUNDLE = "org.eclipse.osee.ote.message";
+ private static final class StackTrace extends RuntimeException{
+ public StackTrace() {
+ super("Event stack trace");
+ }
+ }
+
+ private final WeakReference<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.get();
+ }
+
+
+ /**
+ * Creates a message event logger that also prints a stack trace when the event is fired
+ * @param message
+ * @param showStackTrace
+ */
+ public MessageEventLogger(Message<?,?,?> message, boolean showStackTrace) {
+ this.message = new WeakReference<Message<?,?,?>>(message);
+ modeStatus = message.isWriter() ? "wirter " : "reader";
+ message.addPostMemSourceChangeListener(this);
+ message.addPostMessageDisposeListener(this);
+ message.addPreMessageDisposeListener(this);
+ message.addSchedulingChangeListener(this);
+ this.showStackTrace = showStackTrace;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.IMemSourceChangeListener#onChange(org.eclipse.osee.ote.message.enums.MemType, org.eclipse.osee.ote.message.enums.MemType, org.eclipse.osee.ote.message.Message)
+ */
+ public void onChange(MemType oldtype, MemType 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);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.IMessageDisposeListener#onPostDispose(org.eclipse.osee.ote.message.Message)
+ */
+ public void onPostDispose(Message<?, ?, ?> message) {
+ log(Level.INFO, String.format(
+ "%s %s has been disposed",
+ message.getName(),
+ modeStatus), showStackTrace ? new StackTrace() : null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.IMessageDisposeListener#onPreDispose(org.eclipse.osee.ote.message.Message)
+ */
+ public void onPreDispose(Message<?, ?, ?> message) {
+ log(Level.INFO, String.format(
+ "%s %s is about to be disposed",
+ message.getName(),
+ modeStatus), showStackTrace ? new StackTrace() : null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener#isScheduledChanged(boolean)
+ */
+ public void isScheduledChanged(boolean isScheduled) {
+ log(Level.INFO, String.format(
+ "schedule status for %s %s has changed to %s. Env time is %d",
+ message.get().getName(),
+ modeStatus,
+ isScheduled ? "scheduled" : "not scheduled"), showStackTrace ? new StackTrace() : null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener#onRateChanged(org.eclipse.osee.ote.message.Message, double, double)
+ */
+ 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.message/src/org/eclipse/osee/ote/message/MessageState.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageState.java
new file mode 100644
index 00000000000..5cd13802ed5
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageState.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.message;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Set;
+
+import org.eclipse.osee.ote.message.enums.MemType;
+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 MemType currentMemType;
+ private final byte[] data;
+ private final EnumSet<MemType> availableMemTypes;
+ private final MessageMode mode;
+
+ public MessageState(final MemType currentMemType, final byte[] data, final Set<MemType> availableMemTypes, final MessageMode mode) {
+ this.currentMemType = currentMemType;
+ this.data = data;
+ this.availableMemTypes = EnumSet.copyOf(availableMemTypes);
+ this.mode = mode;
+ }
+
+ public MemType getCurrentMemType() {
+ return currentMemType;
+ }
+
+ public byte[] getData() {
+ return data;
+ }
+
+ public EnumSet<MemType> getAvailableMemTypes() {
+ return availableMemTypes;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemException.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemException.java
new file mode 100644
index 00000000000..07573a5d001
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemException.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.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.message/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java
new file mode 100644
index 00000000000..a57532fe5fa
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestCase.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;
+
+import java.lang.ref.WeakReference;
+
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.message.enums.MemType;
+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 WeakReference<ITestEnvironmentMessageSystemAccessor> msgSysTestEnvironment;
+
+ protected MessageSystemTestCase(TestScript testScript, boolean standAlone, boolean addToRunList) {
+ super(testScript, standAlone, addToRunList);
+ msgSysTestEnvironment = new WeakReference<ITestEnvironmentMessageSystemAccessor>((MessageSystemTestScript)testScript);
+ }
+ /**
+ * TestCase Constructor.
+ *
+ * @param testScript
+ * @param standAlone
+ */
+ public MessageSystemTestCase(TestScript testScript, boolean standAlone) {
+ this(testScript, standAlone, true);
+ }
+
+ /**
+ * TestCase Constructor.
+ *
+ * @param testScript
+ */
+ public MessageSystemTestCase(TestScript testScript) {
+ this(testScript, false);
+ }
+
+ public IMessageManager<?,?> getMsgManager() {
+ return msgSysTestEnvironment.get().getMsgManager();
+ }
+ public boolean isPhysicalTypeAvailable(MemType mux) {
+ return msgSysTestEnvironment.get().isPhysicalTypeAvailable(mux);
+ }
+ public void associateObject(Class<?> c, Object obj) {
+ msgSysTestEnvironment.get().associateObject(c, obj);
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java
new file mode 100644
index 00000000000..c0a3c46e292
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.BundleDescription;
+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.log.Env;
+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;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @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<IPreScriptInstantiation>();
+ protected boolean promptResponse= false;
+ private IOInstrumentationDB ioInstrumentation;
+
+
+ /**
+ * @throws IOException
+ * @throws UnknownHostException
+ * @throws MalformedURLException
+ */
+ 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();
+ }
+ }
+
+ public IMessageManager getMsgManager() {
+ ServiceTracker tracker = getServiceTracker(IMessageManager.class.getName());
+ return (IMessageManager)tracker.getService();
+ }
+
+ public IModelManager getModelManager() {
+ ServiceTracker tracker = getServiceTracker(IModelManager.class.getName());
+ return (IModelManager)tracker.getService();
+ }
+
+ @Deprecated
+ public boolean isMessageJarAvailable(String version) {
+ return getRuntimeManager().isMessageJarAvailable(version);
+ }
+
+ public boolean isBundleAvailable(String symbolicName, String version, byte[] md5Digest) {
+ return getRuntimeManager().isBundleAvailable(symbolicName, version, md5Digest);
+ }
+
+ public void shutdown() {
+ super.shutdown();
+ }
+
+ /**
+ * provides a way for sub classes to instantiate test scripts in their own way.
+ *
+ * @param scriptClass
+ * @param connection
+ * @return TestScript
+ * @throws NoSuchMethodException
+ * @throws InstantiationException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ protected abstract TestScript instantiateScriptClass(Class<?> scriptClass, IUserSession connection) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
+
+ @Deprecated
+ public void sendRuntimeJar(byte[] messageJar) throws IOException {
+ getRuntimeManager().addJarToClassLoader(messageJar);
+ }
+
+ public void sendRuntimeBundle(Collection<BundleDescription> bundles) throws Exception {
+ getRuntimeManager().loadBundles(bundles);
+ }
+
+ public void updateRuntimeBundle(Collection<BundleDescription> bundles) throws Exception {
+ getRuntimeManager().updateBundles(bundles);
+ }
+
+ public void cleanupRuntimeBundles() throws Exception {
+ if(isNoBundleCleanup()){
+ return;
+ } else {
+ getRuntimeManager().cleanup();
+ cleanupClassReferences();
+ }
+ }
+
+ private boolean isNoBundleCleanup() {
+ return Boolean.valueOf(System.getProperty("osee.ote.nobundlecleanup"));
+ }
+
+ public abstract void singleStepEnv();
+
+ public void wakeScript() {
+ synchronized (getTestScript()) {
+ System.out.println("notifying");
+ getTestScript().notifyAll();
+ }
+ }
+
+ protected synchronized boolean waitForPromptResponse() {
+ this.promptResponse = false;
+ int count = 0;
+ while (count < 120) {
+ if (this.promptResponse) {
+ return true;
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ex) {
+ Env.getInstance().exception(ex);
+ }
+ count++;
+ }
+ return false;
+ }
+
+ public void setClientClasses(URL[] urls) throws RemoteException {
+ clientClasses = urls;
+ }
+
+ @Override
+ protected void cleanupClassReferences() {
+ IMessageManager msgMngr = getMsgManager();
+ if(msgMngr != null){
+ msgMngr.destroy();
+ }
+ IModelManager modelMngr = getModelManager();
+ if(modelMngr != null) {
+ modelMngr.destroy();
+ }
+
+ super.cleanupClassReferences();
+ }
+
+ public void resetScriptLoader(String[] strings) throws Exception {
+ getRuntimeManager().resetScriptLoader(strings);
+ }
+
+ @Deprecated
+ public Class<?> loadClassFromScriptLoader(String path) throws ClassNotFoundException {
+ return getRuntimeManager().loadFromScriptClassLoader(path);
+ }
+
+ @Deprecated
+ public void addPreInstantiationListener(IPreScriptInstantiation listener) {
+ preInstantiation.add(listener);
+ }
+
+ @Deprecated
+ public void removePreInstantiationListener(IPreScriptInstantiation listener) {
+ preInstantiation.remove(listener);
+ }
+
+ @Deprecated
+ public void notifyPreInstantiationListeners() {
+ for (IPreScriptInstantiation pre : preInstantiation) {
+ pre.run();
+ }
+ }
+
+ @Deprecated
+ public IOInstrumentation getIOInstrumentation(String name) {//, IOInstrumentation io){
+ setupIOInstrumentation();
+ return ioInstrumentation.getIOInstrumentation(name);
+ }
+
+ @Deprecated
+ 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);
+ }
+
+ @Deprecated
+ public Class<?> loadClassFromMessageLoader(String path) throws ClassNotFoundException {
+ return getRuntimeManager().loadFromRuntimeLibraryLoader(path);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java
new file mode 100644
index 00000000000..e482e2909ab
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.ref.WeakReference;
+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.MemType;
+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 WeakReference<ITestEnvironmentMessageSystemAccessor> msgSysEnvironment;
+
+ public MessageSystemTestScript(TestEnvironment environment, IUserSession callback, ScriptTypeEnum scriptType, boolean isBatchable) {
+ super(environment, callback, scriptType, isBatchable);
+ msgSysEnvironment =
+ new WeakReference<ITestEnvironmentMessageSystemAccessor>(
+ (ITestEnvironmentMessageSystemAccessor) environment);
+
+ }
+
+ public IMessageManager<?, ?> getMsgManager() {
+ return msgSysEnvironment.get().getMsgManager();
+ }
+
+ public boolean isPhysicalTypeAvailable(MemType mux) {
+ return msgSysEnvironment.get().isPhysicalTypeAvailable(mux);
+ }
+
+ public void associateObject(Class<?> c, Object obj) {
+ msgSysEnvironment.get().associateObject(c, obj);
+ }
+
+ public Object getAssociatedObject(Class<?> c) {
+ return msgSysEnvironment.get().getAssociatedObject(c);
+ }
+
+ public Object getAssociatedObject() {
+ return msgSysEnvironment.get().getAssociatedObjects();
+ }
+
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return msgSysEnvironment.get().getExecutionUnitManagement();
+ }
+
+ public ITestStation getTestStation() {
+ return msgSysEnvironment.get().getTestStation();
+ }
+
+ public ITestLogger getLogger() {
+ return msgSysEnvironment.get().getLogger();
+ }
+
+ public ITimerControl getTimerCtrl() {
+ return msgSysEnvironment.get().getTimerCtrl();
+ }
+
+ public IScriptControl getScriptCtrl() {
+ return msgSysEnvironment.get().getScriptCtrl();
+ }
+
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return msgSysEnvironment.get().setTimerFor(listener, time);
+ }
+
+ public void onScriptSetup() {
+ msgSysEnvironment.get().onScriptSetup();
+ }
+
+ public void onScriptComplete() throws InterruptedException {
+ msgSysEnvironment.get().onScriptComplete();
+ }
+
+ public long getEnvTime() {
+ return msgSysEnvironment.get().getEnvTime();
+ }
+
+// public ITestPointTally getAttachedTestPointTally(TestScript script) {
+// return msgSysEnvironment.get().getAttachedTestPointTally(script);
+// }
+
+ // public EnvironmentType getEnvironmentType() {
+ // return msgSysEnvironment.getEnvironmentType();
+ // }
+ public void abortTestScript() {
+ msgSysEnvironment.get().abortTestScript();
+ }
+
+ public boolean addTask(EnvironmentTask task) {
+ return msgSysEnvironment.get().addTask(task);
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/OseeURLClassLoader.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/OseeURLClassLoader.java
new file mode 100644
index 00000000000..c62753ae34c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/OseeURLClassLoader.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.message;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLStreamHandlerFactory;
+
+import org.eclipse.osee.ote.core.GCHelper;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeURLClassLoader extends URLClassLoader {
+
+ private String name;
+
+ /**
+ * @param urls
+ * @param parent
+ */
+ public OseeURLClassLoader(String name, URL[] urls, ClassLoader parent) {
+ super(urls, parent);
+ this.name = name;
+ GCHelper.getGCHelper().addRefWatch(this);
+
+ }
+
+ /**
+ * @param urls
+ */
+ public OseeURLClassLoader(String name, URL[] urls) {
+ super(urls);
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.name = name;
+ }
+
+ /**
+ * @param urls
+ * @param parent
+ * @param factory
+ */
+ public OseeURLClassLoader(String name, URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
+ super(urls, parent, factory);
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.name = name;
+ }
+
+// /* (non-Javadoc)
+// * @see java.net.URLClassLoader#findClass(java.lang.String)
+// */
+// @Override
+// protected Class<?> findClass(String name) throws ClassNotFoundException {
+// Class myClass = super.findClass(name);
+// System.out.println("we loaded: " + myClass.getCanonicalName() + " [" + name + "]");
+// return myClass;
+// }
+ public String toString(){
+ return this.getClass().getName() + " [ " + name + " ] ";
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/UniversalMessageListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/UniversalMessageListener.java
new file mode 100644
index 00000000000..4e2440908b5
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/UniversalMessageListener.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.interfaces.IMessageScheduleChangeListener;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public interface UniversalMessageListener extends IMemSourceChangeListener, IMessageDisposeListener, IMessageScheduleChangeListener {
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java
new file mode 100644
index 00000000000..ebc81a0c91e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.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.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.message/src/org/eclipse/osee/ote/message/commands/RecordCommand.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/RecordCommand.java
new file mode 100644
index 00000000000..fbcaf1d60ca
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/RecordCommand.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.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+
+
+
+/**
+ * @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 MemType 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 MemType 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 MemType getType() {
+ return type;
+ }
+
+ }
+ private static final long serialVersionUID = -1000973301709084337L;
+
+ private final List<MessageRecordDetails> list;
+ private final InetSocketAddress destAddress;
+ private final IMsgToolServiceClient client;
+
+ public RecordCommand(
+ final IMsgToolServiceClient client,
+ InetSocketAddress destAddress,
+ List<MessageRecordDetails> list) {
+ this.client = client;
+ this.list = list;
+ this.destAddress = destAddress;
+ }
+
+ /**
+ * @return the destAddress
+ */
+ public InetSocketAddress getDestAddress() {
+ return destAddress;
+ }
+
+ public Collection<MessageRecordDetails> getMsgsToRecord() {
+ return list;
+ }
+
+
+ public IMsgToolServiceClient getClient() {
+ return client;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetElementValue.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetElementValue.java
new file mode 100644
index 00000000000..49ded8fa389
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetElementValue.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.message.commands;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.eclipse.osee.ote.message.enums.MemType;
+
+
+
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Ken J. Aguilar
+ */
+public 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 MemType type;
+
+ /**
+ *
+ */
+ public SetElementValue(String message, MemType type, List<Object> elementPath, String value) {
+ super();
+ this.message = message;
+ this.type = type;
+ this.element = elementPath;
+ this.value = value;
+ }
+
+
+
+ /**
+ * @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 MemType getMemType() {
+ return type;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java
new file mode 100644
index 00000000000..3ecbdd7339b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.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.message.commands;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+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 MemType type;
+ private final MessageMode oldMode;
+ private final MessageMode newMode;
+ private final IMsgToolServiceClient client;
+
+ public SetMessageModeCmd(String name, MemType type, MessageMode oldMode, MessageMode newMode, IMsgToolServiceClient client) {
+ this.name = name;
+ this.type = type;
+ this.oldMode = oldMode;
+ this.newMode = newMode;
+ this.client = client;
+ }
+
+ /**
+ * @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 IMsgToolServiceClient getClient() {
+ return client;
+ }
+
+ /**
+ * @return Returns the type.
+ */
+ public MemType getType() {
+ return type;
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java
new file mode 100644
index 00000000000..ab00bef3106
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.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 org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+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 MemType type;
+ private final MessageMode mode;
+ private final IMsgToolServiceClient callback;
+ /**
+ *
+ */
+ public SubscribeToMessage(String message, MemType type, MessageMode mode, IMsgToolServiceClient callback) {
+ super();
+ this.message = message;
+ this.type = type;
+ this.mode = mode;
+ this.callback = callback;
+ }
+
+ public IMsgToolServiceClient getCallback() {
+ return callback;
+ }
+
+ /**
+ * @param message The message to set.
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ public MemType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java
new file mode 100644
index 00000000000..0d93976f26f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.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.message.commands;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+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 IMsgToolServiceClient client;
+ private final MemType 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 MemType memTypeOrdinal, IMsgToolServiceClient client) {
+ this.messageName = messageName;
+ this.mode = mode;
+ this.client = client;
+ this.memTypeOrdinal = memTypeOrdinal;
+ }
+
+ public String getMessage() {
+ return messageName;
+ }
+
+ public IMsgToolServiceClient getClient() {
+ return client;
+ }
+
+ public MemType getMemTypeOrdinal() {
+ return memTypeOrdinal;
+ }
+
+ /**
+ * @return Returns the mode.
+ */
+ public MessageMode getMode() {
+ return mode;
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java
new file mode 100644
index 00000000000..dab2dbb6fc3
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.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.message.commands;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.eclipse.osee.ote.message.enums.MemType;
+
+
+
+
+/**
+ * @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 MemType type;
+
+ /**
+ *
+ */
+ public ZeroizeElement(String message, MemType 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 MemType getMemType() {
+ return type;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java
new file mode 100644
index 00000000000..d26d7e6f35e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AbstractCondition.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.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++;
+ }
+
+ public int getCheckCount() {
+ return checkCount;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AndCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AndCondition.java
new file mode 100644
index 00000000000..859b6ec862c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/AndCondition.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.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()]);
+ }
+
+ public boolean check() {
+ for (ICondition condition : conditions) {
+ if (condition.check()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java
new file mode 100644
index 00000000000..cd4ba4b620a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ChangesCondition.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.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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.IDiscreteElementCondition#getLastCheckValue()
+ */
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.ICondition#check(int)
+ */
+ @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.message/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java
new file mode 100644
index 00000000000..96aed6efaaf
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.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.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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.IDiscreteElementCondition#getLastCheckValue()
+ */
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.ICondition#check(int)
+ */
+ @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.message/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java
new file mode 100644
index 00000000000..9164ad2a4f9
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.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.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;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.IDiscreteElementCondition#getLastCheckValue()
+ */
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.ICondition#check(int)
+ */
+ @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.message/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java
new file mode 100644
index 00000000000..93cda5c509b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.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.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();
+ }
+
+ public Character getLastCheckValue() {
+ return lastValue;
+ }
+
+ public boolean check() {
+ lastValue = (char) element.getMsgData().getMem().getData()[offset];
+ return lastValue == (char) 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java
new file mode 100644
index 00000000000..08b515bb72a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualityOperation.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.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.message/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java
new file mode 100644
index 00000000000..d8f9011fd52
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/EqualsCondition.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.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.
+ *
+ * @param element
+ * @param notEquals
+ * @param value
+ */
+ public EqualsCondition(DiscreteElement<T> element, boolean notEquals, T value) {
+ this.element = element;
+ this.value = element.elementMask(value);
+ this.notEquals = notEquals;
+ }
+
+ public boolean check() {
+ actualValue = element.getValue();
+ return actualValue.equals(value) ^ notEquals;
+ }
+
+ public T getLastCheckValue() {
+ return actualValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ICondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ICondition.java
new file mode 100644
index 00000000000..eb25e8a4d15
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ICondition.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.condition;
+
+
+public interface ICondition {
+ boolean check();
+ boolean checkAndIncrement();
+ int getCheckCount();
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java
new file mode 100644
index 00000000000..77d029d1067
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java
new file mode 100644
index 00000000000..f1eeb000060
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/InRangeCondition.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.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;
+ }
+
+ 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);
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/condition/ListCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ListCondition.java
new file mode 100644
index 00000000000..f9f4777e136
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/ListCondition.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.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<T>(Arrays.asList(list));
+
+ }
+ public ListCondition(DiscreteElement<T> element, boolean inList, Collection<T> list) {
+ this.element = element;
+ this.inList = inList;
+ this.set = new HashSet<T>();
+ int i = 0;
+ for (T item : list) {
+ set.add(element.elementMask(item));
+ }
+
+ }
+
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java
new file mode 100644
index 00000000000..e3f0bb419bb
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.MemType;
+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;
+ /**
+ * @param count
+ * @param messageData
+ */
+ 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<MessageData>();
+ private final HashMap<MessageData, MessageCounter> hitCount = new HashMap<MessageData, MessageCounter>();
+
+
+ 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, MemType 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<MessageCounter>();
+ 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<MessageCounter>();
+ 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<MessageCounter>();
+ 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);
+ }
+
+ public static void main(String[] args) {
+ MultiMessageCondition mmc = new MultiMessageCondition();
+
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java
new file mode 100644
index 00000000000..a39ac711f2b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.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.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;
+ }
+
+ 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);
+ }
+
+ public T getLastCheckValue() {
+ return actualValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java
new file mode 100644
index 00000000000..371727b74c6
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.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.condition;
+
+/**
+ * @author 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.message/src/org/eclipse/osee/ote/message/condition/OrCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/OrCondition.java
new file mode 100644
index 00000000000..ec96733347f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/OrCondition.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.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()]);
+ }
+
+ public boolean check() {
+ for (ICondition condition : conditions) {
+ if (!condition.check()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/PulseCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/PulseCondition.java
new file mode 100644
index 00000000000..437e7ef835e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/PulseCondition.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.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);
+ }
+
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ public boolean check() {
+ lastValue = element.getValue();
+ if (lastValue.equals(pulsedValue)) {
+ pulses++;
+ } else if (pulses >= maxPulses && lastValue.equals(nonPulsedValue)) {
+ return true;
+ }
+ return false;
+ }
+
+ public int getPulses() {
+ return pulses;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java
new file mode 100644
index 00000000000..eeb73852ee3
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.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;
+
+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;
+ }
+
+ public boolean check() {
+ actualValue = element.getValue().trim();
+ return actualValue.equals(value);
+ }
+
+ public String getLastCheckValue() {
+ return actualValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java
new file mode 100644
index 00000000000..e9835536d14
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransitionCondition.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.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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.IDiscreteElementCondition#getLastCheckValue()
+ */
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.condition.ICondition#check(int)
+ */
+ @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.message/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java
new file mode 100644
index 00000000000..7363a8d65ea
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.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.condition;
+
+public class TransmissionCountCondition extends AbstractCondition {
+
+ private final int max;
+
+ public TransmissionCountCondition(int max) {
+ this.max = max;
+ }
+
+ public boolean check() {
+ return getCheckCount() >= max;
+ }
+
+ public int getMaxTransmitCount() {
+ return max;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java
new file mode 100644
index 00000000000..2886ea0007f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.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.data;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ByteArrayHolder {
+ private byte[] buffer;
+
+ public ByteArrayHolder(){
+
+ }
+
+ public ByteArrayHolder(byte[] buffer){
+ this.buffer = buffer;
+ }
+
+ public void set(byte[] buffer){
+ this.buffer = buffer;
+ }
+
+ public byte[] get(){
+ return this.buffer;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java
new file mode 100644
index 00000000000..91165ce8184
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.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.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 Key key;
+ private String readerName;
+ private String writerName;
+ private int size;
+
+ public DDSTypeSupport(Key key, String readerName, String writerName, int size){
+ this.key = key;
+ this.readerName = readerName;
+ this.writerName = writerName;
+ this.size = size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.messaging.dds.service.TypeSupport#getKey()
+ */
+ @Override
+ protected Key getKey() {
+ return key;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.messaging.dds.service.TypeSupport#getReaderName()
+ */
+ @Override
+ protected String getReaderName() {
+ return this.readerName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.messaging.dds.service.TypeSupport#getTypeDataSize()
+ */
+ @Override
+ protected int getTypeDataSize() {
+ return this.size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.messaging.dds.service.TypeSupport#getWriterName()
+ */
+ @Override
+ protected String getWriterName() {
+ return this.writerName;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/HeaderData.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/HeaderData.java
new file mode 100644
index 00000000000..3d25cc3b696
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/HeaderData.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.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.message/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java
new file mode 100644
index 00000000000..114f4a2e463
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/data/MemoryResource.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MemoryResource.java
new file mode 100644
index 00000000000..3dbfd0e8f52
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MemoryResource.java
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 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 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 (int) (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) {// 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 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);
+ if (ch != 0) {// NOTE this was done to be compatible with java
+ // Strings that don't null char termination
+ 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] &= (byte) 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] &= (byte) 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;
+ }
+
+ /**
+ * @param src
+ * @return
+ */
+ public void copyData(ByteBuffer src) {
+ copyData(0, src, src.remaining());
+ }
+
+ /**
+ * @param destOffset offset in this memory resource in which the copy will begin
+ * @param src
+ * @param length
+ */
+ 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.SEVERE);
+ }
+ src.mark();
+ src.get(byteArray.get(), destOffset, length);
+ Arrays.fill(byteArray.get(), destOffset + length, byteArray.get().length, (byte) 0);
+ _dataHasChanged = true;
+ src.reset();
+ }
+
+ public ByteBuffer getAsBuffer() {
+ return ByteBuffer.wrap(byteArray.get());
+ }
+
+ // 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.message/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java
new file mode 100644
index 00000000000..882a643f1aa
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java
@@ -0,0 +1,536 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 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.message/src/org/eclipse/osee/ote/message/data/MessageData.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MessageData.java
new file mode 100644
index 00000000000..d0d3d70e548
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/data/MessageData.java
@@ -0,0 +1,727 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.Collection;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+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.MemType;
+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;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageData implements DataReaderListener, DataWriterListener, Data, Key {
+
+ private DataWriter writer;
+ private DataReader reader;
+ private DataSample myDataSample;
+
+ private final MemoryResource mem;
+ private final String typeName;
+ private final String name;
+ @SuppressWarnings("unchecked")
+ private final CopyOnWriteArrayList<Message> messages = new CopyOnWriteArrayList<Message>();
+ private List<IMessageSendListener> messageSendListeners = new CopyOnWriteArrayList<IMessageSendListener>();
+ private final int defaultDataByteSize;
+ private final MemType memType;
+ private boolean isEnabled = true;
+ private long activityCount = 0;
+ private long sentCount;
+ private int currentLength;
+ private boolean isScheduled = false;
+
+ public MessageData(String typeName, String name, int dataByteSize, int offset, MemType 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;
+ GCHelper.getGCHelper().addRefWatch(this);
+ }
+
+ public MessageData(String typeName, String name, MemoryResource mem, MemType 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, MemType 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 abstract void zeroize();
+
+ public MemType 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
+ *
+ * @param message
+ */
+ @SuppressWarnings("unchecked")
+ 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
+ */
+ @SuppressWarnings("unchecked")
+ public Collection<Message> getMessages() {
+ 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() {
+ messages.clear();
+ if (writer != null) {
+ writer.getPublisher().deleteDataWriter(writer);
+ writer = null;
+ } else if (reader != null && reader.getSubscriber() != null) {
+ reader.getSubscriber().deleteDataReader(reader);
+ }
+ reader = 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 e) {
+ OseeLog.log(MessageSystemTestEnvironment.class,Level.WARNING,
+ String.format(
+ "increasing backing store for %s to %d. prev length: %d, recv cnt: %d",
+ getName(),
+ destOffset + length,
+ mem.getData().length,
+ this.activityCount),
+ e);
+ 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
+ *
+ * @throws MessageSystemException
+ */
+ @SuppressWarnings("unchecked")
+ public void notifyListeners() throws MessageSystemException {
+ final MemType memType = getType();
+ for (Message message : messages) {
+ 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.
+ *
+ * @param data
+ */
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onDataAvailable(org.eclipse.osee.ote.messaging.dds.entity.DataReader)
+ */
+ 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());
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onLivelinessChanged(org.eclipse.osee.ote.messaging.dds.entity.DataReader,
+ * org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus)
+ */
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onRequestedDeadlineMissed(org.eclipse.osee.ote.messaging.dds.entity.DataReader,
+ * org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus)
+ */
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onRequestedIncompatibleQos(org.eclipse.osee.ote.messaging.dds.entity.DataReader,
+ * org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus)
+ */
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onSampleLost(org.eclipse.osee.ote.messaging.dds.entity.DataReader,
+ * org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus)
+ */
+ public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onSampleRejected(org.eclipse.osee.ote.messaging.dds.entity.DataReader,
+ * org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus)
+ */
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener#onSubscriptionMatch(org.eclipse.osee.ote.messaging.dds.entity.DataReader,
+ * org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus)
+ */
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener#onDataSentToMiddleware(org.eclipse.osee.ote.messaging.dds.entity.DataWriter)
+ */
+ public synchronized void onDataSentToMiddleware(DataWriter theWriter) {
+ // header.setSequenceNumber(header.getSequenceNumber() + 1);
+ notifyListeners();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener#onLivelinessLost(org.eclipse.osee.ote.messaging.dds.entity.DataWriter,
+ * org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus)
+ */
+ public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener#onOfferedDeadlineMissed(org.eclipse.osee.ote.messaging.dds.entity.DataWriter,
+ * org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus)
+ */
+ public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener#onOfferedIncompatibleQos(org.eclipse.osee.ote.messaging.dds.entity.DataWriter,
+ * org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus)
+ */
+ public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener#onPublicationMatch(org.eclipse.osee.ote.messaging.dds.entity.DataWriter,
+ * org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus)
+ */
+ public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.Data#getKeyValue()
+ */
+ public Object getKeyValue() {
+ return null;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.Data#setFromByteArray(byte[])
+ */
+ public void setFromByteArray(byte[] input) {
+ try {
+ copyData(0, input, 0, input.length);
+ }
+ catch (MessageSystemException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,Level.WARNING,
+
+ String.format("Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(), this.mem.getData().length, input.length));
+ setNewBackingBuffer(input);
+ }
+ }
+
+
+ public void setFromByteBuffer(ByteBuffer buffer) {
+ try {
+ copyData(buffer);
+ } catch (Exception e) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ String.format("Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(), this.mem.getData().length, buffer.limit()));
+ setNewBackingBuffer(buffer);
+ }
+ }
+
+ public ByteBuffer toByteBuffer() {
+ return mem.getAsBuffer();
+ }
+
+ public void setFromByteArray(byte[] input, int length) {
+ try {
+ copyData(0, input, 0, length);
+ }
+ catch (MessageSystemException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE,
+ String.format("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.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ String.format("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.log(MessageSystemTestEnvironment.class, Level.SEVERE,
+ String.format("Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(), this.mem.getData().length, length));
+ setNewBackingBuffer(input);
+ }
+ }
+
+ 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();
+ // this.initializeDefaultHeaderValues();
+ getMem().setDataHasChanged(false);
+ writer.write(null, null, this, null);
+ incrementSentCount();
+ 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.
+ *
+ * @return boolean
+ */
+ protected boolean shouldSendData() {
+ return true;
+ }
+
+ /**
+ * @return
+ */
+ public TypeSupport getTypeSupport() {
+ return new DDSTypeSupport(this, getName(), getName(), getPayloadSize());
+ }
+
+ /**
+ * @return
+ */
+ public String getTopicName() {
+ return getName();
+ }
+
+ /**
+ * @return
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ public boolean isSameInstance(byte[] data1, byte[] data2) {
+ return true;
+ }
+
+ /**
+ * @return Object
+ */
+ 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() {
+
+ @SuppressWarnings("unchecked")
+ public void onPreDispose(Message message) {
+ messages.remove(message);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void onPostDispose(Message message) {
+ }
+
+ };
+
+
+ public void copyFrom(Data data) {
+ ByteBuffer buffer = data.toByteBuffer();
+ copyData(data.getOffset(), buffer, buffer.remaining());
+ }
+
+/* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getClass().getName() + ": name=" + getName();
+ }
+
+ 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 {
+ for (IMessageSendListener listener : messageSendListeners) {
+ listener.onPostSend(this);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Message.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ *
+ */
+ private void notifyPreSendListeners() {
+ try {
+ for (IMessageSendListener listener : messageSendListeners) {
+ listener.onPreSend(this);
+ }
+ } 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);
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/ArrayElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/ArrayElement.java
new file mode 100644
index 00000000000..3abfc933cd9
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/ArrayElement.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.message.elements;
+
+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 byte getValue(int index) {
+ return getValue(getMsgData().getMem(), index);
+ }
+
+ public byte getValue(MemoryResource mem, int index) {
+ return mem.getData()[index + mem.getOffset() + getArrayStartOffset()];
+
+ }
+
+ 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);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#switchMessages(org.eclipse.osee.ote.message.Message[])
+ */
+ @Override
+ public ArrayElement switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ return (ArrayElement) super.switchMessages(messages);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/BooleanElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/BooleanElement.java
new file mode 100644
index 00000000000..91baca3ed60
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/BooleanElement.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.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 new Boolean(getMsgData().getMem().getBoolean(byteOffset, msb, lsb));
+ }
+
+
+ @Override
+ public void setValue(Boolean obj) {
+ getMsgData().getMem().setBoolean((Boolean) obj, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public String toString(Boolean obj) {
+ return obj.toString();
+ }
+
+ @Override
+ public Boolean valueOf(MemoryResource mem) {
+ return new Boolean(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.message/src/org/eclipse/osee/ote/message/elements/CharElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/CharElement.java
new file mode 100644
index 00000000000..cd8f1a79483
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/CharElement.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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> {
+
+ /**
+ * @param message
+ * @param elementName
+ */
+ 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);
+ }
+
+ @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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ if (accessor != 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ if (accessor != 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();
+ }
+
+ /**
+ * @param string
+ * @param value
+ * @return
+ */
+ 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 accessor
+ * @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 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 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 accessor
+ * @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 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, 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)
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ else
+ checkGroup.add(passFail);
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+ }
+
+ public Character get(ITestEnvironmentAccessor accessor) {
+ return (Character) this.getValue();
+ }
+
+ /**
+ * Returns the string of length "stringLength" starting as the position of the element.
+ *
+ * @param accessor
+ * @param stringLength the length of the string to return
+ * @return the string starting with this element
+ */
+ public String getString(ITestEnvironmentAccessor accessor, int stringLength) {
+ return getASCIIString(stringLength);
+ }
+
+ /**
+ * Sets the element and the next ("value".length() -1) bytes to "value".charAt().
+ *
+ * @param accessor
+ * @param value the string to set the bytes to
+ */
+ 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());
+ }
+
+ setASCIIString(value);
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ public void set(ITestEnvironmentAccessor a, String value) {
+ parseAndSet(a, value);
+ }
+
+ public void setValue(String value) {
+ parseAndSet(null, value);
+ }
+
+ /**
+ * Sets the element and the next ("value".length() -1) bytes to "value".charAt() and immediately sends the message
+ * that contains it..
+ *
+ * @param accessor
+ * @param value the string to set the bytes to
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, String value) {
+ this.parseAndSet(accessor, value);
+ super.sendMessage();
+ }
+
+ /**
+ * 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 accessor
+ * @param value the string to set the bytes to
+ */
+ 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 accessor
+ * @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 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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue(java.lang.Object)
+ */
+ @Override
+ public void setValue(Character value) {
+ getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Character getValue() {
+ return (char) getMsgData().getMem().getInt(byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Character valueOf(MemoryResource otherMem) {
+ return new Character((char) otherMem.getInt(byteOffset, msb, lsb));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @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) {
+ getMsgData().getMem().setASCIIString(value, byteOffset);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asCharElement(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement(org.eclipse.osee.ote.message.elements.Element)
+ */
+ @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.message/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
new file mode 100644
index 00000000000..5be08edfa4e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
@@ -0,0 +1,1557 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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 {
+
+ 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),
+ this.msg.get());
+ }
+
+ 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),
+ this.msg.get());
+ }
+
+ 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),
+ this.msg.get());
+ 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),
+ this.msg.get());
+ 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+
+ InRangeCondition<T> c = new InRangeCondition<T>(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), this.msg.get());
+ InRangeCondition<T> c = new InRangeCondition<T>(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), this.msg.get());
+ InRangeCondition<T> c = new InRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive);
+ MsgWaitResult result = msg.get().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 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 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),
+ this.msg.get());
+ }
+
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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.
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+ }
+ EqualsCondition<T> c = new EqualsCondition<T>(this, value);
+ msg.get().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
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+ }
+ EqualsCondition<T> c = new EqualsCondition<T>(this, true, value);
+ msg.get().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
+ * @throws InterruptedException
+ */
+ 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),
+ this.msg.get());
+ }
+ InRangeCondition<T> c = new InRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive);
+ msg.get().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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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
+ * @throws InterruptedException
+ */
+ 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),
+ this.msg.get());
+ }
+
+ NotInRangeCondition<T> c = new NotInRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive);
+ msg.get().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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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.
+ * @throws InterruptedException
+ */
+ 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), msg.get());
+
+ EqualsCondition<T> c = new EqualsCondition<T>(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
+ * @throws InterruptedException
+ */
+ 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),
+ this.msg.get());
+
+ InRangeCondition<T> c = new InRangeCondition<T>(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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @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 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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.
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+ 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 accessor
+ * @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 accessor
+ * @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.
+ * @throws InterruptedException
+ */
+ 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 = msg.get().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
+ * @throws InterruptedException
+ */
+ 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),
+ this.msg.get());
+ 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),
+ this.msg.get());
+ MsgWaitResult cp =
+ msg.get().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 accessor
+ * @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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 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 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.
+ * @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.
+ * @param value
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+ EqualsCondition<T> c = new EqualsCondition<T>(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), this.msg.get());
+ EqualsCondition<T> c = new EqualsCondition<T>(this, value);
+ msg.get().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), this.msg.get());
+ EqualsCondition<T> c = new EqualsCondition<T>(this, true, value);
+ msg.get().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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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.
+ * @param value
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+
+ EqualsCondition<T> c = new EqualsCondition<T>(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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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
+ * @throws InterruptedException
+ */
+ 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),
+ this.msg.get());
+
+ InRangeCondition<T> c = new InRangeCondition<T>(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),
+ this.msg.get());
+ InRangeCondition<T> c = new InRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive);
+ msg.get().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
+ * @throws InterruptedException
+ */
+ 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),
+ this.msg.get());
+
+ NotInRangeCondition<T> c = new NotInRangeCondition<T>(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),
+ this.msg.get());
+
+ NotInRangeCondition<T> c = new NotInRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive);
+ msg.get().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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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) 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), this.msg.get());
+ final PulseCondition<T> c = new PulseCondition<T>(this, pulsedValue, nonPulsedValue);
+
+ MsgWaitResult result = msg.get().waitForCondition(accessor, c, false, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(getFullName(), toString(pulsedValue) + FOR_2_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();
+ }
+
+ /**
+ * @param accessor
+ * @param value
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+ return checkPulse(accessor, null, pulsedValue, nonPulsedValue);
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ public final boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+ return checkPulse(accessor, checkGroup, pulsedValue, nonPulsedValue, 1000);
+ }
+
+ public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+ return checkPulse(accessor, null, pulsedValue, nonPulsedValue, milliseconds);
+ }
+
+ public abstract T valueOf(MemoryResource mem);
+
+ @Override
+ public String toString() {
+
+ return elementName + "=" + getValue().toString();
+ }
+
+ public int compareTo(DiscreteElement<T> o) {
+ return getValue().compareTo(o.getValue());
+ }
+
+ /**
+ * Verifies that the element is set to a value in the "list".
+ *
+ * @param accessor
+ * @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 accessor
+ * @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 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 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
+ * @throws InterruptedException
+ */
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+ ListCondition<T> c = new ListCondition<T>(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), this.msg.get());
+
+ MsgWaitResult result = msg.get().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 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 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 accessor
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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, true, 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 accessor
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ * @throws InterruptedException
+ */
+ 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 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 list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ * @throws InterruptedException
+ */
+ 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 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 list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ * @throws InterruptedException
+ */
+ 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 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 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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<T>(this, isInList, list);
+ msg.get().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<T>(this, isInList, list);
+
+ MsgWaitResult result = msg.get().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 value 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 value, T[] list, long elapsedTime) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ (new MethodFormatter()).add(isInList).add(value).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 val : list) {
+ // Check if current item in the list matches.
+ checkGroup.add(new CheckPoint("List Item: " + i, value.toString(), val.toString(), val.equals(value),
+ elapsedTime));
+ i++;
+ }
+ } else {
+ checkGroup = new CheckGroup(Operation.AND, this.getFullName()); // Pass iff none of the
+ // items match
+ for (T val : list) {
+ checkGroup.add(new CheckPoint("List Item: " + i, not + value.toString(), val.toString(),
+ !val.equals(value), 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.
+ *
+ * @param accessor
+ * @param value1
+ * @param value2
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+
+ 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
+ *
+ * @param accessor
+ * @return
+ */
+ public T get(ITestEnvironmentAccessor accessor) {
+ accessor.getLogger().methodCalled(accessor, new MethodFormatter());
+ T v = getValue();
+ accessor.getLogger().methodEnded(accessor);
+ 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.message/src/org/eclipse/osee/ote/message/elements/Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Element.java
new file mode 100644
index 00000000000..5b983473d4b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Element.java
@@ -0,0 +1,305 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.MemType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class Element implements ITimeout {
+ protected WeakReference<Message<?,?,?>> msg;
+ protected String elementName;
+ private volatile boolean timedOut;
+ private List<Object> elementPath;
+ private String fullName;
+
+ protected int byteOffset;
+ protected int lsb;
+ protected WeakReference<MessageData> messageData;
+ protected int msb;
+ protected int originalMsb;
+ protected 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<Message<?,?,?>>(msg);
+ this.elementName = elementName;
+ this.messageData = new WeakReference<MessageData>(messageData);
+ this.byteOffset = byteOffset;
+ this.lsb = lsb;
+ this.msb = msb;
+ this.originalLsb = originalLsb;
+ this.originalMsb = originalMsb;
+ // if (msg!=null)
+ // msg.addElement(this);
+ elementPath = new ArrayList<Object>();
+ 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, 0, 0, 0, 0, 0);
+ this.byteOffset = bitOffset / 8;
+ 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.get();
+ }
+
+ 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;
+ }
+
+ public boolean isTimedOut() {
+ return this.timedOut;
+ }
+
+ public void setTimeout(boolean timeout) {
+ this.timedOut = timeout;
+ }
+
+ public MemType getType() {
+ return messageData.get().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.
+ */
+ 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.message/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java
new file mode 100644
index 00000000000..d5f995fd993
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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> {
+
+ /**
+ * @param message
+ * @param elementName
+ */
+ 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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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
+ public EmptyEnum_Element switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ // TODO Auto-generated method stub
+ return (EmptyEnum_Element) super.switchMessages(messages);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it.
+ *
+ * @param accessor
+ * @param enumeration The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, EmptyEnum enumeration) {
+ this.set(accessor, enumeration);
+ super.sendMessage();
+ }
+
+ /**
+ * Returns the current value of the element.
+ *
+ * @return The current value of the element.
+ */
+ public EmptyEnum get(ITestEnvironmentAccessor accessor) {
+ return (EmptyEnum) getValue();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @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.message/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java
new file mode 100644
index 00000000000..fe70af4c0b1
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 accessor
+ * @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 accessor
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ 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")
+ 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());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @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));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue(java.lang.Object)
+ */
+ @Override
+ public void setValue(T obj) {
+ getMsgData().getMem().setInt(obj.getIntValue(), byteOffset, msb, lsb);
+ }
+
+ public T[] getEnumValues() {
+ return clazz.getEnumConstants();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(T obj) {
+ return String.format("%s [%d]", obj.name(), obj.getIntValue());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @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);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asEnumeratedElement(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected NonMappingEnumeratedElement<T> getNonMappingElement() {
+ return new NonMappingEnumeratedElement<T>(this);
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java
new file mode 100644
index 00000000000..f33b5638c74
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java
@@ -0,0 +1,406 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 minVal;
+
+ 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 minVal, boolean signed, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, resolution, minVal, 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 minVal, 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.minVal = minVal;
+ }
+
+ public FixedPointElement(Message<?,?,?> message, String elementName, MessageData messageData, double resolution,
+ double minVal, boolean signed, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ this.resolution = resolution;
+ this.signed = signed;
+ this.minVal = minVal;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor
+ * @param value The value to set.
+ */
+ 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 accessor
+ * @param value The value to set.
+ */
+ 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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 minVal) {
+ 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 + (signed ? 0 : minVal);
+ }
+
+ private long toFixedLong(double value, boolean signed, double resolution, double minVal) {
+ long returnValue = Math.round((value - (signed ? 0 : minVal)) / resolution);
+
+ if(value > 0 && toFixed(returnValue, signed, resolution, minVal) < 0){
+ returnValue = Math.round(((value - resolution) - (signed ? 0 : minVal)) / resolution);
+ if(value > 0 && toFixed(returnValue, signed, resolution, minVal) < 0){
+ returnValue = Math.round(((value - (resolution*2)) - (signed ? 0 : minVal)) / resolution);
+ if(value > 0 && toFixed(returnValue, signed, resolution, minVal) < 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(((Double) obj), signed, resolution, minVal), 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, minVal);
+ }
+
+
+ @Override
+ public Double valueOf(MemoryResource mem) {
+ return toFixed(getRaw(mem), signed, resolution, minVal);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.message.RealElement#toDouble(long)
+ */
+ protected double toDouble(long value) {
+ return toFixed(value, signed, resolution, minVal);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.message.RealElement#toLong(double)
+ */
+ protected long toLong(double value) {
+ return toFixedLong(value, signed, resolution, minVal);
+ }
+
+ /**
+ * @return Returns the minVal.
+ */
+ public double getMinVal() {
+ return minVal;
+ }
+ /**
+ * @return Returns the resolution.
+ */
+ public double getResolution() {
+ return resolution;
+ }
+
+ /**
+ * @return Returns the signed.
+ */
+ public boolean isSigned() {
+ return signed;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.RealElement#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asFixedPointElement(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected NonMappingFixedPointElement getNonMappingElement() {
+ return new NonMappingFixedPointElement(this);
+ }
+
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup,
+ Double value, int milliseconds) throws InterruptedException {
+ // TODO Auto-generated method stub
+ return super.check(accessor, checkGroup, adjust(value), milliseconds);
+ }
+
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, Double value) {
+ // TODO Auto-generated method stub
+ 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 {
+ // TODO Auto-generated method stub
+ 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 {
+ // TODO Auto-generated method stub
+ 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.message/src/org/eclipse/osee/ote/message/elements/Float32Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Float32Element.java
new file mode 100644
index 00000000000..2ab965f85f6
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Float32Element.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.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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to set.
+ */
+ 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 accessor
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.RealElement#getValue()
+ */
+ @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)));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue(java.lang.Object)
+ */
+ @Override
+ public void setValue(Double obj) {
+ setValue(obj.floatValue());
+ }
+
+ public void setValue(Float obj) {
+ getMsgData().getMem().setInt(Float.floatToIntBits(obj), byteOffset, msb, lsb);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.message.RealElement#toDouble(long)
+ */
+ protected double toDouble(long value) {
+ return Float.intBitsToFloat((int) value);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.message.RealElement#toLong(double)
+ */
+ protected long toLong(double value) {
+ return Double.doubleToLongBits(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @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.message/src/org/eclipse/osee/ote/message/elements/Float64Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Float64Element.java
new file mode 100644
index 00000000000..33f1e9baba2
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/Float64Element.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to set.
+ */
+ 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 accessor
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ public void setNoLog(ITestEnvironmentAccessor accessor, double value) {
+ setValue(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.RealElement#getValue()
+ */
+ @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));
+ }
+
+/* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue(java.lang.Object)
+ */
+ @Override
+ public void setValue(Double obj) {
+ getMsgData().getMem().setLong(Double.doubleToLongBits((Double)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.
+ *
+ * @param bits
+ */
+ public void setRawBits(long bits) {
+ getMsgData().getMem().setLong(bits, byteOffset, msb, lsb);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.RealElement#toDouble(long)
+ */
+ @Override
+ protected double toDouble(long value) {
+ return Double.longBitsToDouble(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.RealElement#toLong(double)
+ */
+ @Override
+ protected long toLong(double value) {
+ return Double.doubleToLongBits(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected Element getNonMappingElement() {
+ return (NonMappingFloat64Element)new NonMappingFloat64Element(this);
+ }
+
+ @Override
+ public void setHex(long hex) {
+ getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java
new file mode 100644
index 00000000000..bcc330bb47f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/elements/IEnumValue.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IEnumValue.java
new file mode 100644
index 00000000000..70d78b4c7a0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IEnumValue.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.elements;
+
+public interface IEnumValue<T> {
+ public int getIntValue();
+ T getEnum(int value);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java
new file mode 100644
index 00000000000..59268c59451
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IRecordFactory.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 IRecordFactory {
+
+ RecordElement create(int i);
+ int getBitLength();
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java
new file mode 100644
index 00000000000..4432dd34a88
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.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.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 switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (InaccessibleElement) super.switchMessages(messages);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected Element getNonMappingElement() {
+ return null;
+ }
+
+public int compareTo(InaccessibleElement o) {
+ return 0;
+}
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IntegerElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IntegerElement.java
new file mode 100644
index 00000000000..c9ccab6de77
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/IntegerElement.java
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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> {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @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 switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ return (IntegerElement) super.switchMessages(messages);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(Integer obj) {
+ int value = elementMask(obj);
+ return value + "(0x" + Integer.toHexString(value).toUpperCase() + ")";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue()
+ */
+ @Override
+ public void setValue(Integer value) {
+ getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Integer getValue() {
+ return new Integer(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Integer valueOf(MemoryResource mem) {
+ return new Integer(mem.getInt(byteOffset, msb, lsb));
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, Integer value) throws InterruptedException {
+
+ int nonPulsedValue = 0;
+ if (value == 0) nonPulsedValue = 1;
+
+ checkPulse(accessor, value, nonPulsedValue);
+
+ }
+
+ /**
+ * Returns the current value of the element.
+ *
+ * @return The current value of the element.
+ */
+ public Integer get(ITestEnvironmentAccessor accessor) {
+ return this.getValue();
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor
+ * @param value The value to set.
+ */
+ 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 accessor
+ * @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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return (Integer) super.waitForRange(accessor, new Integer(minValue), minInclusive, new Integer(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return (Integer) super.waitForNotRange(accessor, new Integer(minValue), minInclusive, new Integer(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Integer.parseInt(value));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected Element getNonMappingElement() {
+ return (NonMappingIntegerElement) 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());
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.NumericElement#getNumericBitValue()
+ */
+ @Override
+ public long getNumericBitValue() {
+ return getValue() & 0xFFFFFFFFL;
+ }
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java
new file mode 100644
index 00000000000..98d2153bd23
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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> {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @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 switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ return (LongIntegerElement) super.switchMessages(messages);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(Long obj) {
+ long value = elementMask(obj);
+ return value + "(0x" + Long.toHexString(value).toUpperCase() + ")";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue()
+ */
+ @Override
+ public void setValue(Long value) {
+ getMsgData().getMem().setLong((Long) value, byteOffset, msb, lsb);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Long getValue() {
+ return new Long(getMsgData().getMem().getLong(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Long valueOf(MemoryResource mem) {
+ return new Long(mem.getLong(byteOffset, msb, lsb));
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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 accessor
+ * @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 accessor
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Long.parseLong(value));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected NonMappingLongIntegerElement getNonMappingElement() {
+ return new NonMappingLongIntegerElement(this);
+ }
+
+ @Override
+ public Long elementMask(Long value) {
+ return removeSign(value);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.NumericElement#getNumericBitValue()
+ */
+ @Override
+ public long getNumericBitValue() {
+ return getValue();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java
new file mode 100644
index 00000000000..14c25cd9238
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.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.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.message/src/org/eclipse/osee/ote/message/elements/NumericElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/NumericElement.java
new file mode 100644
index 00000000000..b9b67b81564
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/NumericElement.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;
+
+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.message/src/org/eclipse/osee/ote/message/elements/RealElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RealElement.java
new file mode 100644
index 00000000000..c41abf9451c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RealElement.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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;
+
+/**
+ * TODO:ANDY: Many check functions in this class are wrong, should be using all doubles without casting to/from int's.
+ *
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class RealElement extends NumericElement<Double> {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @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);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#switchMessages(org.eclipse.osee.ote.message.Message[])
+ */
+ @Override
+ public RealElement switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ return (RealElement) super.switchMessages(messages);
+ }
+
+ public void setValue(Float value) {
+ setValue(value.doubleValue());
+ }
+
+ 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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.NumericElement#getNumericBitValue()
+ */
+ @Override
+ public long getNumericBitValue() {
+ return getRaw();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordElement.java
new file mode 100644
index 00000000000..728ead0ac27
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordElement.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 Map<String, Element> elementMap;
+ private int recordBitSize;
+
+ private int bitOffset;
+ private int index;
+ private boolean isPartOfMap = true;
+ private 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<String, Element>();
+ 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);
+ }
+ }
+
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected NonMappingRecordElement getNonMappingElement() {
+ return (NonMappingRecordElement) new NonMappingRecordElement(this);
+ }
+
+ public RecordElement switchMessages(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();
+ }
+ }
+
+ public String getDescriptiveName(){
+ if(isPartOfMap){
+ return String.format("%s[%d]", getName(), index);
+ }
+ return getName();
+ }
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordMap.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordMap.java
new file mode 100644
index 00000000000..f6f63c37fc0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/RecordMap.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.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;
+
+ MessageData messageData;
+
+ private 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());
+ this.messageData = messageData;
+ NUMBER_OF_RECORDS = numberOfRecords;
+ records = new HashMap<Integer, T>(numberOfRecords);
+ this.factory = factory;
+ }
+
+ public RecordMap(Message<?,?,?> message, MessageData messageData, int firstRecordByteOffset, int recordByteSize,
+ int numberOfRecords) {
+ super(message, "", 1, messageData, 0, 0);
+ this.messageData = messageData;
+ NUMBER_OF_RECORDS = numberOfRecords;
+ records = new HashMap<Integer, T>(numberOfRecords);
+ }
+
+ public T get(int index) {
+ 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;
+ }
+
+ public void addPath(Object... objs){
+ for(Object obj: objs){
+ getElementPath().add(obj);
+ }
+ getElementPath().add(this.getName());
+ }
+
+ public void put(int index, RecordElement newRecord) {
+ records.put(index, (T)newRecord);
+ }
+
+ 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;
+// }
+
+ 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 (RecordElement element : this.records.values()) {
+ element.zeroize();
+ }
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java
new file mode 100644
index 00000000000..861782b240c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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> {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @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 switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ return (SignedInteger16Element) super.switchMessages(messages);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(Integer obj) {
+ return obj + "(0x" + Integer.toHexString(obj).toUpperCase() + ")";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue()
+ */
+ @Override
+ public void setValue(Integer value) {
+ getMsgData().getMem().setInt((Integer) value, byteOffset, msb, lsb);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Integer getValue() {
+ return new Integer(getMsgData().getMem().getSignedInt16(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Integer valueOf(MemoryResource mem) {
+ return new Integer(mem.getSignedInt16(byteOffset, msb, lsb));
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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 accessor
+ * @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 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
+ * @throws InterruptedException
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForRange(accessor, new Integer(minValue), minInclusive, new Integer(maxValue), maxInclusive,
+ milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return (Integer) super.waitForNotRange(accessor, new Integer(minValue), minInclusive, new Integer(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Integer.parseInt(value));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @Override
+ protected Element getNonMappingElement() {
+ return (NonMappingSignedInteger16Element) new NonMappingSignedInteger16Element(this);
+ }
+
+ @Override
+ public Integer elementMask(Integer value) {
+ return value;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.NumericElement#getNumericBitValue()
+ */
+ @Override
+ public long getNumericBitValue() {
+ return getValue() & 0xFFFFFFFFL;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/StringElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/StringElement.java
new file mode 100644
index 00000000000..91c25bebe2f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/StringElement.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.message.elements;
+
+import java.util.Collection;
+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> {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#visit(org.eclipse.osee.ote.message.elements.IElementVisitor)
+ */
+ @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 switchMessages(Collection<? extends Message<?, ?, ?>> messages) {
+ return (StringElement) super.switchMessages(messages);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(String obj) {
+ return obj;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue()
+ */
+ @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);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @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
+ *
+ * @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 boolean equals(String other) {
+ return getMsgData().getMem().asciiEquals(byteOffset, msb, lsb, other);
+ }
+
+ @Override
+ public String valueOf(MemoryResource mem) {
+ return mem.getASCIIString(byteOffset, msb, lsb);
+ }
+
+ public String get(ITestEnvironmentAccessor accessor) {
+ return getValue();
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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), this.msg.get());
+ final StringTrimCondition c = new StringTrimCondition(this, value);
+
+ MsgWaitResult result = msg.get().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 accessor
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, String value) {
+ parseAndSet(accessor, value);
+ super.sendMessage();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#getNonMappingElement()
+ */
+ @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),
+ this.msg.get());
+ final EmptyStringCondition c = new EmptyStringCondition(this);
+
+ MsgWaitResult result = msg.get().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),
+ this.msg.get());
+ final EmptyStringCondition c = new EmptyStringCondition(this);
+
+ MsgWaitResult result = msg.get().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.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java
new file mode 100644
index 00000000000..98701fc4cb2
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java
@@ -0,0 +1,1046 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+
+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(null, element.getElementName(), element.getMsgData(),
+ element.getByteOffset(), element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?,?,?>>(element.getMessage());
+ for(Object obj:element.getElementPath()){
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingCharElement(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 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param bitOffset
+ * @param bitLength
+ */
+ 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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ public void checkForwarding(ITestAccessor accessor, CharElement cause, char value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, String value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is not set to "value".
+ *
+ * @param 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 checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is set to "value".
+ *
+ * @param accessor
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, String value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is set to "value".
+ *
+ * @param 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, 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 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
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public char checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ public Character get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Returns the string of length "stringLength" starting as the position of the element.
+ *
+ * @param accessor
+ * @param stringLength the length of the string to return
+ * @return the string starting with this element
+ */
+ public String getString(ITestEnvironmentAccessor accessor, int stringLength) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Sets the element and the next ("value".length() -1) bytes to "value".charAt().
+ *
+ * @param accessor
+ * @param value the string to set the bytes to
+ */
+ 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 accessor
+ * @param value the string to set the bytes to
+ */
+ public void setNoLog(ITestEnvironmentAccessor accessor, String value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor
+ * @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 accessor
+ * @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 accessor
+ * @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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ protected String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue(java.lang.Object)
+ */
+ @Override
+ public void setValue(Character value) {
+
+ throwNoMappingElementException();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Character getValue() {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(Character obj) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java
new file mode 100644
index 00000000000..a586ccb512b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java
@@ -0,0 +1,417 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+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.
+ *
+ * @param element
+ */
+ public NonMappingEmptyEnumElement(EmptyEnum_Element element) {
+ super(null, element.getElementName(), element.getMsgData(), element
+ .getByteOffset(), element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash
+ // map.
+ this.msg = new WeakReference<Message<?, ?, ?>>(element.getMessage());
+ 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 null;
+ }
+
+ @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.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java
new file mode 100644
index 00000000000..021952d3edb
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java
@@ -0,0 +1,450 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+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(null, element.getElementName(), element.getEnumClass(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?, ?, ?>>(element.getMessage());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param msg
+ * @param elementName
+ * @param clazz
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalMsb
+ * @param originalLsb
+ */
+ 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);
+ }
+
+ /**
+ * @param msg
+ * @param elementName
+ * @param clazz
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param clazz
+ * @param messageData
+ * @param bitOffset
+ * @param bitLength
+ */
+ 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 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 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param enumeration The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param enumeration1
+ * @param enumeration2
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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 accessor
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ public T waitForInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param 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 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 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 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 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 enumeration Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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 enumeration value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 enumeration
+ * @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 milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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 enumeration
+ * @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 milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, T value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ protected T toEnum(int intValue) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ public T[] getEnumValues() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @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.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java
new file mode 100644
index 00000000000..6a1123324c9
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.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.message.elements.nonmapping;
+
+import java.lang.ref.WeakReference;
+
+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.
+ *
+ * @param element
+ */
+ public NonMappingFixedPointElement(FixedPointElement element) {
+ super(null, element.getElementName(), element.getMsgData(),
+ 0, false, element.getByteOffset(), element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?,?,?>>(element.getMessage());
+ for(Object obj:element.getElementPath()){
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param resolution
+ * @param signed
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param resolution
+ * @param minVal
+ * @param signed
+ * @param byteOffset
+ * @param msb
+ * @param 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param resolution
+ * @param signed
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param originalMsb
+ */
+ 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param resolution
+ * @param minVal
+ * @param signed
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param resolution
+ * @param minVal
+ * @param signed
+ * @param bitOffset
+ * @param bitLength
+ */
+ 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);
+ }
+
+
+ public void checkForwarding(ITestAccessor accessor, FixedPointElement cause, double value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @return Returns the minVal.
+ */
+ public double getMinVal() {
+ throwNoMappingElementException();
+ return 0;
+ }
+ /**
+ * @return Returns the resolution.
+ */
+ public double getResolution() {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * @return Returns the signed.
+ */
+ public boolean isSigned() {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java
new file mode 100644
index 00000000000..7b5b235fcef
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.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.message.elements.nonmapping;
+
+import java.lang.ref.WeakReference;
+
+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.
+ *
+ * @param element
+ */
+ public NonMappingFloat32Element(Float32Element element) {
+ super(null, element.getElementName(), element.getMsgData(),
+ element.getByteOffset(), element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?,?,?>>(element.getMessage());
+ for(Object obj:element.getElementPath()){
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingFloat32Element(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 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param bitOffset
+ * @param bitLength
+ */
+ public NonMappingFloat32Element(Message<?,?,?> message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public void checkForwarding(ITestAccessor accessor, Float32Element cause, double value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java
new file mode 100644
index 00000000000..8c4756ca8df
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.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.message.elements.nonmapping;
+
+import java.lang.ref.WeakReference;
+
+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.
+ *
+ * @param element
+ */
+ public NonMappingFloat64Element(Float64Element element) {
+ super(null, element.getElementName(), element.getMsgData(),
+ element.getByteOffset(), element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?,?,?>>(element.getMessage());
+ for(Object obj:element.getElementPath()){
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingFloat64Element(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 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);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param bitOffset
+ * @param bitLength
+ */
+ public NonMappingFloat64Element(Message<?,?,?> message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public void checkForwarding(ITestAccessor accessor, Float64Element cause, double value) throws InterruptedException {
+ throwNoMappingElementException();
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java
new file mode 100644
index 00000000000..402a2848ec1
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java
@@ -0,0 +1,993 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+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.
+ *
+ * @param element
+ */
+ public NonMappingIntegerElement(IntegerElement element) {
+ super(null, element.getElementName(), element.getMsgData(), element.getByteOffset(), element.getMsb(),
+ element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?, ?, ?>>(element.getMessage());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingIntegerElement(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 bitOffset
+ * @param bitLength
+ */
+ public NonMappingIntegerElement(Message<?, ?, ?> message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param originalMsb
+ */
+ 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);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#valueOf(java.lang.Object)
+ */
+ @Override
+ public String toString(Integer obj) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue()
+ */
+ @Override
+ public void setValue(Integer value) {
+ throwNoMappingElementException();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Integer getValue() {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ 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();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ // * @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
+ // * @throws InterruptedException
+ // */
+ // 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 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
+ // * @throws InterruptedException
+ // */
+ // 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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.
+ */
+ public Integer get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor
+ * @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 accessor
+ * @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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java
new file mode 100644
index 00000000000..8c97e44f777
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java
@@ -0,0 +1,984 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+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.
+ *
+ * @param element
+ */
+ public NonMappingLongIntegerElement(LongIntegerElement element) {
+ super(null, element.getElementName(), element.getMsgData(), element.getByteOffset(), element.getMsb(),
+ element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?, ?, ?>>(element.getMessage());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingLongIntegerElement(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 bitOffset
+ * @param bitLength
+ */
+ public NonMappingLongIntegerElement(Message<?, ?, ?> message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param originalMsb
+ */
+ 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);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#setValue()
+ */
+ @Override
+ public void setValue(Long value) {
+ throwNoMappingElementException();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.ote.message.elements.Element#getValue()
+ */
+ @Override
+ public Long getValue() {
+ throwNoMappingElementException();
+ return 0L;
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ 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();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ // * @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
+ // * @throws InterruptedException
+ // */
+ // 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 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
+ // * @throws InterruptedException
+ // */
+ // 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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 accessor
+ * @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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java
new file mode 100644
index 00000000000..cb31bc17d70
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.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.nonmapping;
+
+import java.lang.ref.WeakReference;
+
+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(null, element.getElementName(), element.getMsgData(),
+ element.getByteOffset(), element.getBitLength());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?,?,?>>(element.getMessage());
+ for(Object obj:element.getElementPath()){
+ this.getElementPath().add(obj);
+ }
+ }
+
+
+ /**
+ * @param message
+ * @param elementName
+ * @param index
+ * @param messageData
+ * @param firstRecordBitOffset
+ * @param recordBitSize
+ */
+ public NonMappingRecordElement(Message<?,?,?> message, String elementName, int index, MessageData messageData,
+ int firstRecordBitOffset, int recordBitSize) {
+ super(message, elementName, index, messageData, firstRecordBitOffset, recordBitSize);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param offset
+ * @param messageData
+ * @param firstRecordByteOffset
+ * @param recordByteSize
+ */
+ public NonMappingRecordElement(RecordElement message, String elementName, int offset, MessageData messageData,
+ int firstRecordByteOffset, int recordByteSize) {
+ super(message, elementName, offset, messageData, firstRecordByteOffset, recordByteSize);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param firstRecordByteOffset
+ * @param recordByteSize
+ */
+ public NonMappingRecordElement(Message<?,?,?> message, String elementName, MessageData messageData,
+ int firstRecordByteOffset, int recordByteSize) {
+ super(message, elementName, messageData, firstRecordByteOffset, recordByteSize);
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+
+public int compareTo(RecordElement o) {
+ throwNoMappingElementException();
+ return 0;
+}
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java
new file mode 100644
index 00000000000..522153ed566
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java
@@ -0,0 +1,981 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+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.
+ *
+ * @param element
+ */
+ public NonMappingSignedInteger16Element(SignedInteger16Element element) {
+ super(null, element.getElementName(), element.getMsgData(), element.getByteOffset(), element.getMsb(),
+ element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?, ?, ?>>(element.getMessage());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingSignedInteger16Element(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 bitOffset
+ * @param bitLength
+ */
+ public NonMappingSignedInteger16Element(Message<?, ?, ?> message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param originalMsb
+ */
+ 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 accessor
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ * @throws InterruptedException
+ */
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param accessor
+ * @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 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, 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 accessor
+ * @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 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 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 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.
+ * @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 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, 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 accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The value to be checked
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @throws InterruptedException
+ */
+ 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();
+ }
+
+ /**
+ * @param accessor
+ * @param checkGroup
+ * @param pulsedValue
+ * @param nonPulsedValue
+ * @param milliseconds
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 within the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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 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
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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 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 for the element to be outside the range.
+ * @return if the check passed
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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.
+ *
+ * @param accessor
+ * @param value
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ // * @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
+ // * @throws InterruptedException
+ // */
+ // 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 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
+ // * @throws InterruptedException
+ // */
+ // 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 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 maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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.
+ */
+ public Integer get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor
+ * @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 accessor
+ * @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 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.
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @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
+ * @throws InterruptedException
+ */
+ 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 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
+ * @throws InterruptedException
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @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.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java
new file mode 100644
index 00000000000..c1387c344ae
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 java.lang.ref.WeakReference;
+
+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.
+ *
+ * @param element
+ */
+ public NonMappingStringElement(StringElement element) {
+ super(null, element.getElementName(), element.getMsgData(),
+ element.getByteOffset(), element.getMsb(), element.getLsb());
+ // This is being done so it doesn't get added to the element list hash map.
+ this.msg = new WeakReference<Message<?,?,?>>(element.getMessage());
+ for(Object obj:element.getElementPath()){
+ this.getElementPath().add(obj);
+ }
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public NonMappingStringElement(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 bitOffset
+ * @param bitLength
+ */
+ public NonMappingStringElement(Message<?,?,?> message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param originalMsb
+ */
+ 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);
+ }
+
+ public String get(ITestEnvironmentAccessor accessor){
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param accessor
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 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.
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed. Either value expected or value found at timeout.
+ * @throws InterruptedException
+ */
+ 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 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
+ * @param milliseconds
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ 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 accessor
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ * @throws InterruptedException
+ */
+ public String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return "";
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#set(osee.test.core.environment.interfaces.ITestEnvironmentAccessor, java.lang.String)
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.Element#isNonMappingElement()
+ */
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/ISequenceHandle.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/ISequenceHandle.java
new file mode 100644
index 00000000000..ae1e5f03329
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/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.elements.test;
+
+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.message/src/org/eclipse/osee/ote/message/elements/test/SequenceHandle.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/SequenceHandle.java
new file mode 100644
index 00000000000..2781ece8e77
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/SequenceHandle.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.test;
+
+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;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.test.ISequenceHandle#waitForEndSequence()
+ */
+ @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.message/src/org/eclipse/osee/ote/message/elements/test/TestEnum.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnum.java
new file mode 100644
index 00000000000..f0f1c72ed1c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnum.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.elements.test;
+
+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;
+
+ public TestEnum getEnum(int value) {
+ if (value < 0 || value >= values().length) {
+ throw new IllegalArgumentException("no enum matching value of " + value);
+ }
+ return values()[value];
+ }
+
+ public int getIntValue() {
+ return ordinal();
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnumElementOperations.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnumElementOperations.java
new file mode 100644
index 00000000000..3594e0d6507
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestEnumElementOperations.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.test;
+
+import static org.eclipse.osee.ote.message.elements.test.TestEnum.*;
+
+import java.util.EnumSet;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+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.message/src/org/eclipse/osee/ote/message/elements/test/TestFloat32Operations.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestFloat32Operations.java
new file mode 100644
index 00000000000..cf447378ad8
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestFloat32Operations.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.elements.test;
+
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+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.message/src/org/eclipse/osee/ote/message/elements/test/TestIntegerOperations.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestIntegerOperations.java
new file mode 100644
index 00000000000..92bd527149a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestIntegerOperations.java
@@ -0,0 +1,295 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.test;
+
+
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestIntegerOperations extends TestCase{
+
+ 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);
+ 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.message/src/org/eclipse/osee/ote/message/elements/test/TestMessage.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessage.java
new file mode 100644
index 00000000000..9a58cf859b1
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessage.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.elements.test;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.enums.MemType;
+
+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;
+ private int defaultByteSize = 100;
+ private int defaultOffset = 0;
+
+ public TestMessage() {
+ super("TEST_MSG", true, 0, 50.0);
+ TestMessageData ethData =
+ new TestMessageData(this.getClass().getName(), getName(), getDefaultByteSize(), getDefaultOffset(),
+ MemType.ETHERNET);
+ TestMessageData serialData =
+ new TestMessageData(this.getClass().getName(), getName(), getDefaultByteSize(), getDefaultOffset(),
+ MemType.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<TestEnum>(this, "ENUM_ELEMENT_1", TestEnum.class, ethData, 22, 0, 7);
+ FLOAT32_ELEMENT_1 = new Float32Element(this, "FLOAT32_ELEMENT_1", ethData, 23, 0, 31);
+ addElements(INT_ELEMENT_1, STRING_ELEMENT_1, ENUM_ELEMENT_1, FLOAT32_ELEMENT_1);
+ setMemSource(MemType.ETHERNET);
+ }
+
+ @Override
+ public void switchElementAssociation(Collection<TestMessage> messages) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public int getDefaultByteSize() {
+ return defaultByteSize;
+ }
+
+ public int getDefaultOffset() {
+ return defaultOffset;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageData.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageData.java
new file mode 100644
index 00000000000..3a5f1e27600
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageData.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.elements.test;
+
+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.MemType;
+
+public class TestMessageData extends MessageData {
+
+ public TestMessageData(String typeName, String name, int dataByteSize,
+ int offset, MemType 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.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageOperations.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageOperations.java
new file mode 100644
index 00000000000..d26716bd027
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestMessageOperations.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.test;
+
+import junit.framework.TestCase;
+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.MemType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+public class TestMessageOperations extends TestCase {
+ 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();
+ }
+
+ public void testTransmissionRate() throws InterruptedException {
+ Benchmark.setBenchmarkingEnabled(true);
+ TestMessage msg = new TestMessage();
+ final Benchmark bm = new Benchmark("transmission rate");
+ msg.addListener(new IOSEEMessageListener() {
+ public void onDataAvailable(MessageData data, MemType type) throws MessageSystemException {
+ bm.samplePoint();
+ }
+
+ public void onInitListener() throws MessageSystemException {
+ // TODO Auto-generated method stub
+
+ }
+
+ });
+ 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);
+ assertEquals(expectedXmits, bm.getTotalSamples());
+ long avg = bm.getAverage() / 1000;
+ assertTrue("period is out of range:expected " + period + ", actual " + avg, support.inRange(period, 1, (int) avg));
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/elements/test/TestRecordElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestRecordElement.java
new file mode 100644
index 00000000000..d5871fe4eac
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/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.elements.test;
+
+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.message/src/org/eclipse/osee/ote/message/elements/test/TestStringOperations.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestStringOperations.java
new file mode 100644
index 00000000000..69400c687fd
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/TestStringOperations.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.message.elements.test;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestStringOperations extends TestCase {
+
+ 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.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestAccessor.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestAccessor.java
new file mode 100644
index 00000000000..fc7cfa74d93
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestAccessor.java
@@ -0,0 +1,672 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.test;
+
+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.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.MemType;
+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 trace(ITestEnvironmentAccessor source, String objectName,
+ String methodName, MethodFormatter methodArguments,
+ boolean startFlag) {
+ }
+
+ @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) {
+ // TODO Auto-generated method stub
+ super.log(record);
+ }
+
+ @Override
+ public void log(Level level, String msg) {
+ // TODO Auto-generated method stub
+ super.log(level, msg);
+ }
+
+ @Override
+ public void log(Level level, String msg, Object param1) {
+ // TODO Auto-generated method stub
+ super.log(level, msg, param1);
+ }
+
+ @Override
+ public void log(Level level, String msg, Object[] params) {
+ // TODO Auto-generated method stub
+ super.log(level, msg, params);
+ }
+
+ @Override
+ public void log(Level level, String msg, Throwable thrown) {
+ // TODO Auto-generated method stub
+ super.log(level, msg, thrown);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod,
+ String msg) {
+ // TODO Auto-generated method stub
+ super.logp(level, sourceClass, sourceMethod, msg);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod,
+ String msg, Object param1) {
+ // TODO Auto-generated method stub
+ super.logp(level, sourceClass, sourceMethod, msg, param1);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod,
+ String msg, Object[] params) {
+ // TODO Auto-generated method stub
+ super.logp(level, sourceClass, sourceMethod, msg, params);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod,
+ String msg, Throwable thrown) {
+ // TODO Auto-generated method stub
+ super.logp(level, sourceClass, sourceMethod, msg, thrown);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod,
+ String bundleName, String msg) {
+ // TODO Auto-generated method stub
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod,
+ String bundleName, String msg, Object param1) {
+ // TODO Auto-generated method stub
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg, param1);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod,
+ String bundleName, String msg, Object[] params) {
+ // TODO Auto-generated method stub
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg, params);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod,
+ String bundleName, String msg, Throwable thrown) {
+ // TODO Auto-generated method stub
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg, thrown);
+ }
+
+ @Override
+ public synchronized void removeHandler(Handler handler)
+ throws SecurityException {
+ // TODO Auto-generated method stub
+ super.removeHandler(handler);
+ }
+
+ @Override
+ public void setFilter(Filter newFilter) throws SecurityException {
+ // TODO Auto-generated method stub
+ super.setFilter(newFilter);
+ }
+
+ @Override
+ public void setLevel(Level newLevel) throws SecurityException {
+ // TODO Auto-generated method stub
+ super.setLevel(newLevel);
+ }
+
+ @Override
+ public void setParent(Logger parent) {
+ // TODO Auto-generated method stub
+ super.setParent(parent);
+ }
+
+ @Override
+ public synchronized void setUseParentHandlers(boolean useParentHandlers) {
+ // TODO Auto-generated method stub
+ super.setUseParentHandlers(useParentHandlers);
+ }
+
+ @Override
+ public void severe(String msg) {
+ // TODO Auto-generated method stub
+ super.severe(msg);
+ }
+
+ @Override
+ public void throwing(String sourceClass, String sourceMethod,
+ Throwable thrown) {
+ // TODO Auto-generated method stub
+ super.throwing(sourceClass, sourceMethod, thrown);
+ }
+
+ @Override
+ public void warning(String msg) {
+ // TODO Auto-generated method stub
+ super.warning(msg);
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ // TODO Auto-generated method stub
+ return super.clone();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ // TODO Auto-generated method stub
+ return super.equals(obj);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ // TODO Auto-generated method stub
+ super.finalize();
+ }
+
+ @Override
+ public int hashCode() {
+ // TODO Auto-generated method stub
+ return super.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ // TODO Auto-generated method stub
+ return super.toString();
+ }
+
+ };
+
+ private final ITimerControl timerCtrl = new ITimerControl() {
+
+ public void addTask(final EnvironmentTask task, TestEnvironment environment) {
+ final ScheduledFuture<?> handle = schedulePeriodicTask(new Runnable() {
+ 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);
+ }
+
+ public void cancelAllTasks() {
+ for (ScheduledFuture<?> handle : handleMap.values()) {
+ handle.cancel(false);
+ }
+ handleMap.clear();
+ }
+
+ public void cancelTimers() {
+ executor.shutdown();
+ }
+
+ public void dispose() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void envWait(ITimeout obj, int milliseconds)
+ throws InterruptedException {
+ synchronized (obj) {
+ obj.wait(milliseconds);
+ }
+ }
+
+ public void envWait(int milliseconds) throws InterruptedException {
+ envWait(new BasicTimeout(), milliseconds);
+ }
+
+ public int getCycleCount() {
+ return (int)System.currentTimeMillis()/20;
+ }
+
+ public long getEnvTime() {
+ return System.currentTimeMillis();
+ }
+
+ public void incrementCycleCount() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void removeTask(final EnvironmentTask task) {
+ ScheduledFuture<?> handle = handleMap.remove(task);
+ if (handle != null) {
+ handle.cancel(false);
+ }
+ }
+
+ public void setCycleCount(int cycle) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public ICancelTimer setTimerFor(final ITimeout objToNotify, int milliseconds) {
+ objToNotify.setTimeout(false);
+ final ScheduledFuture<?> handle = scheduleOneShotTask(new Runnable() {
+
+ public void run() {
+ synchronized(objToNotify) {
+ objToNotify.setTimeout(true);
+ objToNotify.notify();
+ }
+ }
+ }, milliseconds);
+
+ return new ICancelTimer() {
+
+ public void cancelTimer() {
+ handle.cancel(false);
+ }
+ };
+ }
+
+ public void step() {
+
+ }
+
+ };
+
+ public UnitTestAccessor() {
+
+ }
+
+ public IMessageManager getMsgManager() {
+ return null;
+ }
+
+ public boolean isPhysicalTypeAvailable(MemType physicalType) {
+ return physicalType == MemType.ETHERNET;
+ }
+
+ public void abortTestScript() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void abortTestScript(Throwable t) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean addTask(final EnvironmentTask task) {
+ timerCtrl.addTask(task, null);
+ return true;
+ }
+
+ public void addRunnable(Runnable r) {
+
+ }
+
+ public void associateObject(Class<?> c, Object obj) {
+
+ }
+
+ public Object getAssociatedObject(Class<?> c) {
+ return null;
+ }
+
+ public Set<Class<?>> getAssociatedObjects() {
+
+ return null;
+ }
+
+ public ITestPointTally getAttachedTestPointTally(TestScript script) {
+
+ return null;
+ }
+
+ public long getEnvTime() {
+ return timerCtrl.getEnvTime();
+ }
+
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return null;
+ }
+
+ public ITestLogger getLogger() {
+ return testLogger;
+ }
+
+ public IScriptControl getScriptCtrl() {
+ return scriptCtrl;
+ }
+
+ public TestScript getTestScript() {
+ return null;
+ }
+
+ public ITestStation getTestStation() {
+ return null;
+ }
+
+ public ITimerControl getTimerCtrl() {
+ return timerCtrl;
+ }
+
+ public void onScriptComplete() throws InterruptedException {
+
+ }
+
+ public void onScriptSetup() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setSequentialCmdFinished(CommandDescription description,
+ CommandEndedStatusEnum status) throws Exception {
+
+ }
+
+ 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();
+ }
+
+ public TestCase getTestCase() {
+
+
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestSupport.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestSupport.java
new file mode 100644
index 00000000000..084c20ab639
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/elements/test/UnitTestSupport.java
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.test;
+
+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 junit.framework.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.MemType;
+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() {
+
+ 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() {
+
+ 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;
+
+ public void onDataAvailable(MessageData data, MemType 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();
+ }
+ }
+
+ public void onInitListener() throws MessageSystemException {
+ // TODO Auto-generated method stub
+
+ }
+
+ };
+
+ // 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() {
+ 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.message/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java
new file mode 100644
index 00000000000..0b40e7d8c0a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/EmptyEnum.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.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<Integer, EmptyEnum>(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<String>();
+ 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);
+ }
+
+ public String getName()
+ {
+ return "EMPTY_ENUM_" + getValue();
+ }
+
+ public String toString()
+ {
+ return getName();
+ }
+
+
+ public int getValue()
+ {
+ return value;
+ }
+
+public int compareTo(EmptyEnum o) {
+ return value - o.value;
+}
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/MemType.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/MemType.java
new file mode 100644
index 00000000000..4157380f399
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/enums/MemType.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.message.enums;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.interfaces.INamespace;
+
+
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public enum MemType implements Serializable, INamespace {
+ TS_META_DATA,
+ PUB_SUB,
+ MUX,
+ WIRE_MP_DIRECT,
+ WIRE_AIU,
+ SERIAL,
+ ETHERNET,
+ IGTTS_WIRE,
+ MUX_LM;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java
new file mode 100644
index 00000000000..c8caa5d2755
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.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.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<InetSocketAddress>();
+ channel = DatagramChannel.open();
+ channel.configureBlocking(true);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.instrumentation.IOInstrumentation#command(byte[])
+ */
+ public void command(byte[] cmd) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.instrumentation.IOInstrumentation#register(java.net.InetSocketAddress)
+ */
+ public void register(InetSocketAddress address) {
+ if (address == null) {
+ throw new IllegalArgumentException("address cannot be null");
+ }
+ addresses.add(address);
+ }
+
+ 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();
+ for(InetSocketAddress address:addresses){
+ try {
+ channel.send(bytes, address);
+ bytes.reset();
+ }
+ catch (Exception ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ ex.toString(), ex);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java
new file mode 100644
index 00000000000..02fd11e1679
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.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.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.message/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java
new file mode 100644
index 00000000000..ce00c4d6f0e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.MemType;
+
+/**
+ * @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(MemType type);
+
+ Collection<U> getAllWriters(MemType type);
+
+ void init() throws Exception;
+
+ void publishMessages(boolean publish);
+
+ boolean isPhysicalTypeAvailable(MemType physicalType);
+
+ IMessageRequestor<T, U> createMessageRequestor(String name);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java
new file mode 100644
index 00000000000..fdd5c3373a7
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.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 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;
+
+ void remove(U message) throws TestException;
+
+ void dispose();
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java
new file mode 100644
index 00000000000..aed29615e71
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.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.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.message/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java
new file mode 100644
index 00000000000..bb952070125
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.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 java.net.InetSocketAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+
+
+public interface IMsgToolServiceClient extends Remote {
+ InetSocketAddress getAddressByType(String messageName, int memType) throws RemoteException;
+ void changeRate(String msgName, double rate) throws RemoteException;
+ void changeIsScheduled(String msgName, boolean isScheduled) throws RemoteException;
+ UserTestSessionKey getTestSessionKey() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/INamespace.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/INamespace.java
new file mode 100644
index 00000000000..71764b5c235
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java
new file mode 100644
index 00000000000..75b832e508b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.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.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.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java
new file mode 100644
index 00000000000..d3793aeda3b
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java
new file mode 100644
index 00000000000..d7865aed822
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.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.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.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java
new file mode 100644
index 00000000000..8c328122212
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java
new file mode 100644
index 00000000000..c038223cfe8
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.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.interfaces;
+
+import java.net.InetSocketAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.EnumSet;
+import java.util.Map;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.SetMessageModeCmd;
+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.MemType;
+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 extends Remote {
+
+ void unsubscribeToMessage(UnSubscribeToMessage cmd) throws RemoteException;
+
+ /**
+ * Sets a message element to a specified value
+ *
+ * @param cmd
+ * @throws RemoteException
+ */
+ void setElementValue(SetElementValue cmd) throws RemoteException;
+
+ void zeroizeElement(ZeroizeElement cmd) throws RemoteException;
+
+ // int changeSubscription(ChangeSubscription cmd) throws RemoteException;
+
+ /**
+ * Notifies service to send message updates to the specified ip address
+ *
+ * @param cmd
+ * @throws RemoteException
+ */
+ SubscriptionDetails subscribeToMessage(SubscribeToMessage cmd) throws RemoteException;
+
+ SubscriptionDetails setReaderWriterMode(SetMessageModeCmd cmd) throws RemoteException;
+
+ EnumSet<MemType> getAvailablePhysicalTypes() throws RemoteException;
+
+ boolean startRecording(RecordCommand cmd) throws RemoteException;
+
+ InetSocketAddress getRecorderSocketAddress() throws RemoteException;
+
+ InetSocketAddress getMsgUpdateSocketAddress() throws RemoteException;
+
+ void stopRecording() throws RemoteException;
+
+ void terminateService() throws RemoteException;
+
+ void reset() throws RemoteException;
+
+ void setupRecorder(IMessageEntryFactory factory)throws RemoteException;
+
+ public Map<String, Throwable> getCancelledSubscriptions()throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java
new file mode 100644
index 00000000000..cfe2aeec430
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.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.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();
+ public TestScript getTestScript();
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java
new file mode 100644
index 00000000000..31379d7fb7f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.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.interfaces;
+
+import java.rmi.RemoteException;
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.BundleDescription;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentMessageSystem extends ITestEnvironment {
+ IRemoteMessageService getMessageToolServiceProxy() throws RemoteException;
+ @Deprecated
+ boolean isMessageJarAvailable(String version) throws RemoteException;
+ boolean isBundleAvailable(String symbolicName, String version, byte[] md5Digest) throws RemoteException;
+ @Deprecated
+ void sendRuntimeJar(byte[] messageJar) throws RemoteException;
+ void sendRuntimeBundle(Collection<BundleDescription> bundles) throws RemoteException;
+ void updateRuntimeBundle(Collection<BundleDescription> bundles) throws RemoteException;
+ void cleanupRuntimeBundles() throws RemoteException;
+ void setupClassLoaderAndJar(String[] jarVersions, String classPath) throws RemoteException;
+ void setupClassLoaderAndJar(String[] jarVersion, String[] classPaths) throws RemoteException;
+ IOInstrumentation getIOInstrumentation(String name) throws RemoteException;
+ void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+ void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java
new file mode 100644
index 00000000000..83e2f6fc899
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.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.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.enums.MemType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentMessageSystemAccessor extends ITestEnvironmentAccessor {
+ @SuppressWarnings("unchecked")
+ IMessageManager getMsgManager();
+
+ boolean isPhysicalTypeAvailable(MemType physicalType);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/Namespace.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/Namespace.java
new file mode 100644
index 00000000000..3a76dc4f8e3
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/interfaces/Namespace.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.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Namespace implements INamespace{
+
+ private String namespace;
+ /**
+ * @param string
+ */
+ public Namespace(String string) {
+ namespace = string;
+ }
+
+ public String toString(){
+ return namespace;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ Namespace ns = (Namespace)obj;
+ return namespace.equals(ns.namespace);
+ }
+
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return namespace.hashCode();
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/Activator.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/Activator.java
new file mode 100644
index 00000000000..5351c3fe725
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/Activator.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.message.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+
+ private ServiceTracker testEnvTracker;
+ private static Activator me;
+ private MessageWatchActivator messageWatchActivator;
+ private BundleContext context;
+
+
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ me = this;
+ this.context = context;
+ testEnvTracker = new ServiceTracker(context, TestEnvironmentInterface.class.getName(), null);
+ testEnvTracker.open(true);
+
+ messageWatchActivator = new MessageWatchActivator(context);
+ messageWatchActivator.open(true);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ testEnvTracker.close();
+ messageWatchActivator.close();
+ context = null;
+ }
+
+ public static TestEnvironmentInterface getTestEnvironment(){
+ try {
+ return (TestEnvironmentInterface)me.testEnvTracker.waitForService(20000);
+ } catch (InterruptedException e) {
+ OseeLog.log(Activator.class, Level.SEVERE, e);
+ }
+ return null;
+ }
+
+ public static Activator getDefault() {
+ return me;
+ }
+
+ BundleContext getBundleContext() {
+ return context;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/MessageWatchActivator.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/MessageWatchActivator.java
new file mode 100644
index 00000000000..e3da5f1f0cf
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/internal/MessageWatchActivator.java
@@ -0,0 +1,66 @@
+package org.eclipse.osee.ote.message.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.message.tool.AbstractMessageToolService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class MessageWatchActivator extends ServiceTracker{
+
+ private ServiceRegistration registration;
+
+ MessageWatchActivator(BundleContext context) {
+ super(context, IMessageManager.class.getName(), null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
+ */
+ @Override
+ public IMessageManager addingService(ServiceReference reference) {
+ IMessageManager manager = (IMessageManager) super.addingService(reference);
+ try {
+ AbstractMessageToolService toolService = new AbstractMessageToolService(manager);
+ registration = context.registerService(IRemoteMessageService.class.getName(), toolService, null);
+ } catch (IOException e) {
+ OseeLog.log(MessageWatchActivator.class, Level.SEVERE, "failed to create message tool service", e);
+ }
+ return manager;
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ @Override
+ public synchronized void removedService(ServiceReference reference, Object service) {
+ disposeToolService();
+ super.removedService(reference, service);
+ }
+
+ private void disposeToolService() {
+ try {
+ AbstractMessageToolService toolService = (AbstractMessageToolService)context.getService(registration.getReference());
+ toolService.terminateService();
+ } finally {
+ registration.unregister();
+ registration = null;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#close()
+ */
+ @Override
+ public synchronized void close() {
+ if (registration != null){
+ disposeToolService();
+ }
+ super.close();
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java
new file mode 100644
index 00000000000..ab460ea8325
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.MemType;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageListener {
+ void onDataAvailable(MessageData data, MemType type) throws MessageSystemException;
+ void onInitListener() throws MessageSystemException;
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java
new file mode 100644
index 00000000000..3486e3abbbb
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+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.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.MessageSystemException;
+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.MemType;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageReaderListener;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageWriterListener;
+
+/**
+ * @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 Message message;
+ private WeakReference<Message<?,?,?>> message;
+ private static final Benchmark tbm = new Benchmark("Total Message System Listener", 2500);
+
+ private int messageCount = 0;
+
+// public static enum SPEED {
+//// FAST, SLOW
+// };
+
+ /**
+ * 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 CopyOnWriteArrayList<IOSEEMessageListener> fastListeners = new CopyOnWriteArrayList<IOSEEMessageListener>();
+ private final CopyOnWriteArrayList<IOSEEMessageListener> slowListeners = new CopyOnWriteArrayList<IOSEEMessageListener>();
+ /**
+ * 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<Message<?,?,?>>(msg);
+ }
+
+ /**
+ * returns the number of received messages since the last call to waitForData
+ *
+ * @return int
+ */
+ 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
+ *
+ * @return boolean
+ */
+ public boolean isTimedOut() {
+ return this.isTimedOut;
+ }
+
+ 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 = accessor.getEnvTime();
+ boolean pass = condition.check();
+ if (milliseconds > 0) {
+ boolean done = pass ^ maintain;
+ final ICancelTimer cancelTimer = accessor.setTimerFor(this, milliseconds);
+ while (!done) {
+ if (waitForData()) {
+ // we timed out
+ break;
+ } else {
+ pass = condition.checkAndIncrement();
+ done = pass ^ maintain;
+ }
+ }
+ cancelTimer.cancelTimer();
+ }
+ time = accessor.getEnvTime() - time;
+
+ 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
+ * "false" for isFastListener. "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 -
+ * @return Returns boolean success indication.
+ */
+ public boolean addListener(IOSEEMessageListener listener, SPEED listenerSpeed) {
+ Collection<IOSEEMessageListener> 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
+ * @param listener
+ * @param listenerSpeed
+ * @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.
+ * @param listener
+ * @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));
+ }
+
+ public synchronized void onDataAvailable(final MessageData data, MemType type) throws MessageSystemException{
+
+ tbm.startSample();
+ if (message.get().getMemType() == type) {
+ messageCount++;
+ masterMessageCount++;
+ notifyAll();
+ }
+
+ for (IOSEEMessageListener listener : fastListeners){
+ listener.onDataAvailable(data, type);
+ }
+ for (IOSEEMessageListener listener : slowListeners){
+ threadPool.execute(new SlowListenerNotifier(listener,
+ data, type, false));
+ }
+ tbm.endSample();
+ }
+
+ public synchronized void onInitListener() throws MessageSystemException{
+
+ for (IOSEEMessageListener listener : fastListeners){
+ listener.onInitListener();
+ }
+ for (IOSEEMessageListener listener : slowListeners){
+ 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 MemType type;
+
+ public SlowListenerNotifier(IOSEEMessageListener listener, MessageData data,
+ MemType type, boolean isOnInit) {
+ this.listener = listener;
+ this.data = data;
+ this.type = type;
+ this.isOnInit = isOnInit;
+ }
+
+ public void run() {
+ synchronized (listener) {
+ if (isOnInit)
+ listener.onInitListener();
+ else
+ listener.onDataAvailable(data, type);
+ }
+ }
+ }
+
+ public Collection<IOSEEMessageListener> getRegisteredFastListeners() {
+ return fastListeners;
+ }
+
+ public Collection<IOSEEMessageListener> getRegisteredSlowListeners() {
+ return slowListeners;
+ }
+
+ public void dispose(){
+ this.clearListeners();
+ }
+
+ public void clearListeners()
+ {
+ this.fastListeners.clear();
+ this.slowListeners.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/SPEED.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/SPEED.java
new file mode 100644
index 00000000000..14a71d60bfb
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/listener/SPEED.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.listener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum SPEED {
+FAST, SLOW
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java
new file mode 100644
index 00000000000..a8d39f82206
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.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.message.log.record;
+
+import java.io.File;
+import java.util.Map;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.TestLevel;
+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 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(), TestLevel.CONFIG, script.getClass().getName(), false);
+ this.jarVersions = jarVersions;
+ }
+
+ /**
+ * Convert an element to XML format.
+ *
+ * @return XML formated config element.
+ */
+ 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.message/src/org/eclipse/osee/ote/message/package.html b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/package.html
new file mode 100644
index 00000000000..c6e3ced3e5a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/package.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<title></title>
+</head>
+<body bgcolor="white">
+
+<h1>Message System Test Environment</h1>
+
+<p>
+The Message System Test Environment is the base environment that provides message and element support. This includes most of the element types such as Integer, Float, etc... and the checks that are available on both the message and the element. It also adds in the remote message service which enables all of the messaging based tools that remote clients use.
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float32ElementTest.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float32ElementTest.java
new file mode 100644
index 00000000000..8ea01592842
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float32ElementTest.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.test;
+
+import java.util.Random;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+
+public class Float32ElementTest extends TestCase{
+
+ 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;
+ if (el.getValue() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ el.get());
+ }
+ }
+ }
+
+ 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;
+ if (el.getValue() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Double.toHexString(expectedVals[i]),
+ Double.toHexString(el.get()));
+ }
+ }
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/test/Float64ElementTest.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float64ElementTest.java
new file mode 100644
index 00000000000..35d640a2a9e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/Float64ElementTest.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.message.test;
+
+import java.util.Random;
+
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+
+public class Float64ElementTest extends TestCase{
+
+ 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;
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ el.get());
+ }
+
+ }
+ }
+
+ 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;
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Double.toHexString(expectedVals[i]),
+ Double.toHexString(el.get()));
+ }
+ }
+ }
+
+ private void check(Float64Element[] e, double[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ Float64Element el = e[i];
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ e[i].get());
+ }
+
+ String v = Double.toString(expectedVals[i]);
+ if (!el.valueOf().equals(v)) {
+ failNotEquals(
+ 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.message/src/org/eclipse/osee/ote/message/test/IntegerElementTest.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/IntegerElementTest.java
new file mode 100644
index 00000000000..6010a7d9f73
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/IntegerElementTest.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.test;
+
+import java.util.Random;
+
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+public class IntegerElementTest extends TestCase{
+
+ public void test1BitInts() {
+ createTest(1);
+ }
+
+ public void test2BitInts() {
+ createTest(2);
+ }
+
+ public void test3BitInts() {
+ createTest(3);
+ }
+
+ public void test4BitInts() {
+ createTest(4);
+ }
+
+ public void test5BitInts() {
+ createTest(5);
+ }
+
+ public void test6BitInts() {
+ createTest(6);
+ }
+
+ public void test7BitInts() {
+ createTest(7);
+ }
+
+ public void test8BitInts() {
+ createTest(8);
+ }
+
+ public void test9BitInts() {
+ createTest(9);
+ }
+
+ public void test10BitInts() {
+ createTest(10);
+ }
+
+ public void test11BitInts() {
+ createTest(11);
+ }
+
+ public void test12BitInts() {
+ createTest(12);
+ }
+
+ public void test13BitInts() {
+ createTest(13);
+ }
+
+ public void test14BitInts() {
+ createTest(14);
+ }
+
+ public void test15BitInts() {
+ createTest(15);
+ }
+
+ public void test16BitInts() {
+ createTest(16);
+ }
+
+ public void test17BitInts() {
+ createTest(17);
+ }
+
+ public void test18BitInts() {
+ createTest(18);
+ }
+
+ public void test19BitInts() {
+ createTest(19);
+ }
+
+ public void test20BitInts() {
+ createTest(20);
+ }
+
+ public void test21BitInts() {
+ createTest(21);
+ }
+
+ public void test22BitInts() {
+ createTest(22);
+ }
+
+ public void test23BitInts() {
+ createTest(23);
+ }
+
+ public void test24BitInts() {
+ createTest(24);
+ }
+
+ public void test25BitInts() {
+ createTest(25);
+ }
+
+ public void test26BitInts() {
+ createTest(26);
+ }
+
+ public void test27BitInts() {
+ createTest(27);
+ }
+
+ public void test28BitInts() {
+ createTest(28);
+ }
+
+ public void test29BitInts() {
+ createTest(29);
+ }
+
+ public void test30BitInts() {
+ createTest(30);
+ }
+
+ 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;
+ }
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ el.get());
+ }
+ }
+ }
+
+ 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;
+ }
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Long.toHexString(expectedVals[i]),
+ Long.toHexString(el.get()));
+ }
+ }
+ }
+
+ private void check(IntegerElement[] e, int[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ IntegerElement el = e[i];
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ e[i].get());
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/LongIntegerElementTest.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/LongIntegerElementTest.java
new file mode 100644
index 00000000000..e7524e9e6e9
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/LongIntegerElementTest.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.message.test;
+
+import java.util.Random;
+
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+
+public class LongIntegerElementTest extends TestCase{
+
+
+ public void test1BitInts() {
+ createLongIntTest(1);
+ }
+
+
+ public void test2BitInts() {
+ createLongIntTest(2);
+ }
+
+
+ public void test3BitInts() {
+ createLongIntTest(3);
+ }
+
+
+ public void test4BitInts() {
+ createLongIntTest(4);
+ }
+
+
+ public void test5BitInts() {
+ createLongIntTest(5);
+ }
+
+
+ public void test8BitInts() {
+ createLongIntTest(8);
+ }
+
+
+ public void test10BitInts() {
+ createLongIntTest(10);
+ }
+
+
+ public void test12BitInts() {
+ createLongIntTest(12);
+ }
+
+
+ public void test16BitInts() {
+ createLongIntTest(16);
+ }
+
+
+ public void test20BitInts() {
+ createLongIntTest(20);
+ }
+
+
+ public void test22BitInts() {
+ createLongIntTest(22);
+ }
+
+
+ public void test24BitInts() {
+ createLongIntTest(24);
+ }
+
+
+ public void test25BitInts() {
+ createLongIntTest(25);
+ }
+
+
+ public void test26BitInts() {
+ createLongIntTest(26);
+ }
+
+
+ public void test27BitInts() {
+ createLongIntTest(27);
+ }
+
+
+ public void test30BitInts() {
+ createLongIntTest(30);
+ }
+
+
+ public void test31BitInts() {
+ createLongIntTest(31);
+ }
+
+
+
+ public void test32BitInts() {
+ createLongIntTest(32);
+ }
+
+
+ public void test40BitInts() {
+ createLongIntTest(40);
+ }
+
+
+ public void test48BitInts() {
+ createLongIntTest(48);
+ }
+
+
+ public void test50BitInts() {
+ createLongIntTest(50);
+ }
+
+
+ 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;
+ }
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Long.toHexString(expectedVals[i]),
+ Long.toHexString(el.get()));
+ }
+ }
+ }
+
+
+ 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;
+ }
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ el.get());
+ }
+ }
+ }
+
+ private void check(LongIntegerElement[] e, long[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ LongIntegerElement el = e[i];
+ if (el.get() != expectedVals[i]) {
+ failNotEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i],
+ e[i].get());
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/SignedInteger16ElementTest.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/SignedInteger16ElementTest.java
new file mode 100644
index 00000000000..b9fb2d7542d
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/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.test;
+
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+
+public class SignedInteger16ElementTest extends TestCase{
+
+
+ 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);
+ }
+
+ 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) {
+ if (e.get() != expectedVals) {
+ failNotEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", e.getName(), e.getMsb(), e.getLsb()),
+ expectedVals,
+ e.get());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/testStringElement.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/testStringElement.java
new file mode 100644
index 00000000000..13c940cf92a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/test/testStringElement.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.message.test;
+
+import junit.framework.TestCase;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+
+public class testStringElement extends TestCase{
+
+
+ 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, "");
+ }
+ }
+
+
+ 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));
+ }
+ }
+ }
+
+ 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);
+ }
+ }
+ }
+ private void check(StringElement elem, String value) {
+ if (!elem.getValue().equals(value)) {
+ failNotEquals(elem.getName(), value, elem.getValue());
+ }
+ }
+
+ private void checkEmpty(StringElement elem) {
+ if (!elem.isEmpty()) {
+ failNotEquals(elem.getName(), "rmpty", "not empty");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/AlarmClock.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/AlarmClock.java
new file mode 100644
index 00000000000..a00ace4bf8e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/AlarmClock.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.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 ITimeout sleeper;
+
+ /**
+ * @param sleeper
+ */
+ public AlarmClock(ITimeout sleeper) {
+ super();
+ this.sleeper = sleeper;
+ sleeper.setTimeout(false);
+ }
+
+ /**
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ synchronized(sleeper) {
+ sleeper.notify();
+ sleeper.setTimeout(true);
+ }
+ }
+
+ public void cancelTimer() {
+ this.cancel();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java
new file mode 100644
index 00000000000..51f1b4855f0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/CycleCountDown.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.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;
+
+
+/**
+ * @author Ryan D. Brooks
+ *
+ * This class is used as a 'Time Out' object while waiting for the desired message element value.
+ *
+ */
+public class CycleCountDown implements ICancelTimer {
+ private int cycleCount;
+ private ITimeout objToNotify;
+ private 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;
+ objToNotify.setTimeout(false);
+ }
+
+ /**
+ * @return true if the cycleCount == 0, otherwise false
+ */
+ public boolean cycleOccurred() {
+ if (cycleCount == -1){
+ return true;
+ }
+ if (cycleCount == 0) {
+ synchronized(objToNotify){
+ objToNotify.setTimeout(true);
+ objToNotify.notifyAll();
+ }
+ return true; // so that notify is only called after a countdown becomes zero for the first time
+ }
+ cycleCount--;
+ return false;
+ }
+
+ public void cancelTimer(){
+ this.cycleCount = -1;
+ if(this.scriptLock != null){
+ this.scriptLock.lock();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/RealTime.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/RealTime.java
new file mode 100644
index 00000000000..47185b120ba
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/RealTime.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.message.timer;
+
+import java.io.IOException;
+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
+ *
+ * @throws IOException
+ */
+ public RealTime() {
+ super((Runtime.getRuntime().availableProcessors() + 1) / 2 + 1);
+ }
+
+ public void addTask(final EnvironmentTask task, final TestEnvironment environment) {
+ if (!handleMap.containsKey(task)) {
+ final WeakReference<TestEnvironment> te = new WeakReference<TestEnvironment>(environment);
+ final ScheduledFuture<?> handle = schedulePeriodicTask(new Runnable() {
+ final Benchmark bm =
+ new Benchmark(task.getClass().getName() + ":" + task.getHzRate() + "Hz",
+ (long) (1000000.0 / task.getHzRate()));
+
+ 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);
+ }
+ }
+
+ public void removeTask(EnvironmentTask task) {
+ ScheduledFuture<?> handle = handleMap.remove(task);
+ if (handle != null) {
+ handle.cancel(false);
+ }
+ }
+
+ public long getEnvTime() {
+ return System.currentTimeMillis();
+ }
+
+ @Override
+ public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+ synchronized (obj) {
+ obj.wait(milliseconds);
+ }
+ }
+
+ public ICancelTimer setTimerFor(final ITimeout objToNotify, int milliseconds) {
+ objToNotify.setTimeout(false);
+ final ScheduledFuture<?> handle = scheduleOneShotTask(new Runnable() {
+
+ public void run() {
+ synchronized (objToNotify) {
+ objToNotify.setTimeout(true);
+ objToNotify.notifyAll();
+ }
+ }
+ }, milliseconds);
+
+ return new ICancelTimer() {
+
+ public void cancelTimer() {
+ handle.cancel(false);
+ }
+ };
+ }
+
+ public int getCycleCount() {
+ return (int) System.currentTimeMillis() / 20;
+ }
+
+ public void incrementCycleCount() {
+ }
+
+ public List<CycleCountDown> getCycleCounters() {
+ return null;
+ }
+
+ public void setCycleCounters(List<CycleCountDown> cycleCounters) {
+ }
+
+ public void setCycleCount(int cycle) {
+ }
+
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.environment.interfaces.ITimerControl#cancelAllTasks()
+ */
+ public void cancelAllTasks() {
+ for (ScheduledFuture<?> handle : handleMap.values()) {
+ handle.cancel(false);
+ }
+ handleMap.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see osee.test.core.environment.interfaces.ITimerControl#step()
+ */
+ public void step() {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java
new file mode 100644
index 00000000000..11e6e6e2169
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 IScriptControl scriptControl;
+ private int cycleCount;
+ private final CopyOnWriteArrayList<Task> tasks = new CopyOnWriteArrayList<Task>();
+
+ /**
+ * @param scriptControl -
+ * @throws IOException
+ */
+ public SimulatedTime(IScriptControl scriptControl) throws IOException {
+ super(3);
+ this.scriptControl = scriptControl;
+ this.cycleCounters = new HashSet<CycleCountDown>(32);
+ cycleCount = 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.test.core.environment.TestEnvironment#getEnvTime()
+ */
+ public long getEnvTime() {
+ return (long) (cycleCount * (1000.0 / EnvironmentTask.cycleResolution));
+ }
+
+ public ICancelTimer setTimerFor(ITimeout objToNotify, int milliseconds) {
+ try {
+
+ scriptControl.unlock();
+ } catch (IllegalMonitorStateException ex) {
+ if (!Thread.currentThread().getName().contains("(JSK) mux request dispatch") || !Thread.currentThread().getName().contains(
+ "(JSK) Mux request dispatch")) OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex.getMessage(), ex);
+ }
+ CycleCountDown cycleCountDown =
+ new CycleCountDown(scriptControl, objToNotify,
+ ((int) Math.rint(milliseconds / (1000.0 / EnvironmentTask.cycleResolution))) - 1);
+ synchronized (cycleCounters) {
+ cycleCounters.add(cycleCountDown);
+ }
+ return cycleCountDown;
+ }
+
+ public void addTask(EnvironmentTask task, TestEnvironment environment) {
+ if (!tasks.contains(task)) {
+ tasks.add(new Task(task, environment));
+ }
+ }
+
+ 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);
+ }
+ }
+
+ public void step() {
+
+ for (Task t : tasks) {
+ t.doTask(cycleCount);
+ }
+ incrementCycleCount();
+ }
+
+ public int getCycleCount() {
+ return cycleCount;
+ }
+
+ public Collection<CycleCountDown> getCycleCounters() {
+ return cycleCounters;
+ }
+
+ public void incrementCycleCount() {
+ cycleCount++;
+ }
+
+ public void setCycleCount(int cycle) {
+ cycleCount = cycle;
+ }
+
+ 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();
+ }
+ }
+ }
+ }
+
+ public void dispose() {
+ cycleCounters.clear();
+ tasks.clear();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/AbstractMessageToolService.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/AbstractMessageToolService.java
new file mode 100644
index 00000000000..47654eaf78a
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/AbstractMessageToolService.java
@@ -0,0 +1,964 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.SetMessageModeCmd;
+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.commands.RecordCommand.MessageRecordDetails;
+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.enums.MemType;
+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.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageReaderListener;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.message.internal.Activator;
+import org.eclipse.osee.ote.message.listener.MessageSystemListener;
+import org.eclipse.osee.ote.message.tool.rec.IMessageEntryFactory;
+import org.eclipse.osee.ote.message.tool.rec.MessageRecordConfig;
+import org.eclipse.osee.ote.message.tool.rec.MessageRecorder;
+
+/**
+ * Service that dispatches message updates to registered clients
+ *
+ * @author Andrew M. Finkbeiner
+ * @author Ken J. Aguilar
+ */
+public class AbstractMessageToolService implements IRemoteMessageService {
+
+ private static final boolean debugEnabled = false;
+
+ private final HashMap<String, Throwable> cancelledSubscriptions = new HashMap<String, Throwable>(40);
+ private final DatagramChannel channel;
+ private final HashMap<String, EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>>> messageMap =
+ new HashMap<String, EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>>>(100);
+
+ private final IMessageRequestor messageRequestor;
+ private MessageRecorder recorder;
+ private DatagramChannel recorderOutputChannel;
+ private volatile boolean terminated = false;
+ private final AtomicInteger idCounter = new AtomicInteger(0x0DEF0000);
+ private final class ClientInfo {
+ private final IMsgToolServiceClient remoteReference;
+
+ private final InetSocketAddress ipAddress;
+
+ public ClientInfo(final IMsgToolServiceClient remoteReference, final InetSocketAddress ipAddress) {
+ super();
+ this.remoteReference = remoteReference;
+ this.ipAddress = ipAddress;
+ }
+
+ public InetSocketAddress getIpAddress() {
+ return ipAddress;
+ }
+
+ public IMsgToolServiceClient getRemoteReference() {
+ return remoteReference;
+ }
+
+ @Override
+ public int hashCode() {
+ return ipAddress.hashCode() ^ remoteReference.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ ClientInfo client = (ClientInfo) obj;
+ return ipAddress.equals(client.ipAddress) && remoteReference.equals(client.remoteReference);
+ }
+
+ }
+
+ /**
+ * Associates a {@link Message} with a {@link IOSEEMessageReaderListener} and handles transmitting the message data
+ * upon a the method call
+ * {@link org.eclipse.osee.ote.message.listener.IOSEEMessageListener#onDataAvailable(MessageData, MemType)}. When a
+ * listener's {@link #onDataAvailable(MessageData, MemType)} method is invoked it will transmit the new data to all
+ * registered clients
+ *
+ * @author Ken J. Aguilar
+ */
+ private final class SubscriptionRecord implements IOSEEMessageReaderListener, IMessageScheduleChangeListener {
+
+ private final Message<?, ?, ?> msg;
+ private final HashSet<ClientInfo> clients = new HashSet<ClientInfo>(10);
+ private ByteBuffer buffer;
+ private int msgStartPos;
+ private ByteBuffer msgUpdatePart;
+ private long updateCount = 0;
+ private final SubscriptionKey key;
+ private StringBuilder strBuilder = new StringBuilder();
+
+ /**
+ * Creates a new listener. A listener is a one to one mapping of a message to a list of client addresses
+ *
+ * @param reader
+ * @param writer
+ * @param type
+ * @param clients
+ */
+ SubscriptionRecord(final Message<?, ?, ?> msg, final MemType type, final MessageMode mode, final ClientInfo... clients) {
+ this.msg = msg;
+ this.key = new SubscriptionKey(idCounter.incrementAndGet(), type, mode, msg.getName());
+
+ for (ClientInfo client : clients) {
+ this.clients.add(client);
+ }
+
+ allocateBackingBuffer(msg.getMaxDataSize(type));
+
+ MessageSystemListener systemListener = msg.getListener();
+ if (!systemListener.containsListener(this)) {
+ systemListener.addListener(this);
+ }
+ assert (systemListener.containsListener(this));
+
+ this.msg.addSchedulingChangeListener(this);
+ }
+
+ private void allocateBackingBuffer(int maxDataSize) {
+ final byte[] nameAsBytes = msg.getClass().getName().getBytes();
+ buffer = ByteBuffer.allocateDirect(maxDataSize + nameAsBytes.length + 100);
+ buffer.position(0);
+ buffer.putInt(key.getId());
+ msgUpdatePart = buffer.slice();
+ msgStartPos = buffer.position();
+ }
+
+ public synchronized String toString() {
+ String string =
+ String.format("Message Watch Entry: mem type=%s, mode=%s, upd cnt=%d", key.getType(), key.getMode(),
+ updateCount);
+ String string2 = " clients: ";
+ for (ClientInfo addr : clients) {
+ string2 = string2 + addr.ipAddress.toString() + " ";
+ }
+ return string + string2;
+ }
+
+ SubscriptionRecord(final Message<?, ?, ?> msg, final MemType type, final MessageMode mode, final ArrayList<ClientInfo> clients) {
+
+ this.msg = msg;
+ this.key = new SubscriptionKey(idCounter.incrementAndGet(), type, mode, msg.getName());
+
+
+ this.clients.addAll(clients);
+
+ final byte[] nameAsBytes = msg.getClass().getName().getBytes();
+ buffer = ByteBuffer.allocateDirect(msg.getMaxDataSize(type) + nameAsBytes.length + 100);
+ buffer.position(0);
+ buffer.putInt(key.getId());
+ msgUpdatePart = buffer.slice();
+ msgStartPos = buffer.position();
+
+
+ MessageSystemListener systemListener = msg.getListener();
+ if (!systemListener.containsListener(this)) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, "Installing listener on msg reader for " + msg.getMessageName());
+ systemListener.addListener(this);
+ } else {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, "this listener already installed on msg reader for " + msg.getMessageName());
+ }
+ this.msg.addSchedulingChangeListener(this);
+ }
+
+ /**
+ * Adds a new client who will be notified when new updates occur
+ *
+ * @param client
+ */
+ public synchronized void addClient(final ClientInfo client) {
+ clients.add(client);
+ }
+
+ public synchronized void removeClient(final ClientInfo client) {
+ clients.remove(client);
+ }
+
+ // public synchronized ClientInfo findClient(InetSocketAddress address) {
+ // for (ClientInfo client : clients) {
+ // if (client.getIpAddress().equals(address)) {
+ // return client;
+ // }
+ // }
+ // return null;
+ // }
+
+ public synchronized ClientInfo findClient(IMsgToolServiceClient client) {
+ for (ClientInfo clientInfo : clients) {
+ if (clientInfo.remoteReference.equals(client)) {
+ return clientInfo;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * removes this listener from the {@link Message} set of listeners. Thus no message updates will be sent to this
+ * listener any longer
+ */
+ public synchronized void unregister() {
+ msg.removeSchedulingChangeListener(this);
+ msg.getListener().removeListener(this);
+ }
+
+ /**
+ * checks to see if this listener is still registered for message updates
+ *
+ * @return true if the listener is registered
+ */
+ public synchronized boolean isRegistered() {
+ return msg.getListener().containsListener(this);
+ }
+
+ /**
+ * This is a callback from the underlying messaging system that is invoked when data is received for the
+ * particular message
+ *
+ * @see IOSEEMessageReaderListener
+ */
+ public synchronized void onDataAvailable(final MessageData data, final MemType type) {
+ final byte[] msgData = data.toByteArray();
+ final int msgLength = data.getCurrentLength();
+ /* do nothing if there is no clients registered for this type */
+ try {
+ if (key.getType() == type) {
+ msgUpdatePart.clear();
+ msgUpdatePart.putLong(Activator.getTestEnvironment().getEnvTime());
+ if (msgUpdatePart.remaining() < msgLength) {// != bodyLength + bodyStartPosition){
+ allocateBackingBuffer(msgLength);
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.WARNING,
+ String.format("Backing buffer was changed in AbstractMessageTool %s to %d", msg.getName(),
+ msgLength));
+ }
+ msgUpdatePart.put(msgData, 0, msgLength);
+
+ /* Message body data has changed so transmit the whole thing to clients */
+ buffer.limit(msgStartPos + msgUpdatePart.position()).position(0);
+ xmitMsg(clients, msg.getName(), buffer);
+ updateCount++;
+
+ }
+ } catch (Exception t) {
+ // stop listening for updates on this message
+ unregister();
+ cancelledSubscriptions.put(msg.getMessageName(), t);
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ String.format(
+ "Exception during processing of update for %s: data length=%d, payload size=%d, buf start=%d, buf cap=%d",
+ msg.getMessageName(), msgData.length, data.getPayloadSize(), msgStartPos,
+ msgUpdatePart.capacity()), t);
+ }
+ }
+
+ /**
+ * do nothing stub required for interface implementation
+ *
+ * @see IOSEEMessageReaderListener
+ */
+ public void onInitListener() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener#onRateChanged(double)
+ */
+ public void onRateChanged(Message<?, ?, ?> message, double old, double rate) {
+ try {
+ for (ClientInfo client : clients)
+ client.getRemoteReference().changeRate(msg.getClass().getName(), rate);
+ } catch (RemoteException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, ex.toString(), ex);
+ }
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ msg.getName() + " has a rate change to " + rate + " hz!!!!!");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener#isScheduledChanged(boolean)
+ */
+ public void isScheduledChanged(boolean isScheduled) {
+ try {
+ for (ClientInfo client : clients)
+ client.getRemoteReference().changeIsScheduled(msg.getClass().getName(), isScheduled);
+ } catch (RemoteException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, ex.toString(), ex);
+ }
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ msg.getName() + " scheduling has changed to " + isScheduled);
+ }
+
+ /**
+ * @return Returns the msg.
+ */
+ public Message<?, ?, ?> getMsg() {
+ return msg;
+ }
+
+ } /* end of MsgListener */
+
+ /**
+ * Constructs a new message manager service
+ *
+ * @param accessor
+ * @throws IOException
+ */
+ public AbstractMessageToolService(IMessageManager messageManager) throws IOException {
+
+ channel = DatagramChannel.open();
+ channel.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), PortUtil.getInstance().getValidPort()));
+ channel.configureBlocking(true);
+ recorderOutputChannel = DatagramChannel.open();
+ recorderOutputChannel.socket().bind(
+ new InetSocketAddress(InetAddress.getLocalHost(), PortUtil.getInstance().getValidPort()));
+ messageRequestor = messageManager.createMessageRequestor(getClass().getName());
+ }
+
+ public synchronized void setupRecorder(IMessageEntryFactory factory) {
+ if (recorder != null && recorder.isRecording()) {
+ throw new IllegalStateException("a record session is currently running");
+ }
+ recorder = new MessageRecorder(factory);
+ }
+
+ /**
+ * Attempts to set message data.
+ *
+ * @see IRemoteMessageService#setElementValue(SetElementValue)
+ */
+ public synchronized void setElementValue(SetElementValue cmd) throws RemoteException {
+ final String msgName = cmd.getMessage();
+ try {
+ final Class<?> msgWriterClass = Activator.getTestEnvironment().getRuntimeManager().loadFromRuntimeLibraryLoader(msgName);
+
+ /* check to see if an instance of a writer for the specified message exists */
+ Message<?, ?, ?> writer = messageRequestor.getMessageWriter(msgWriterClass);
+ if (writer == null) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ String.format("Attempting to set message data for %s even though no previous writer exist", msgName));
+ throw new Exception("Could not find the class definition for " + msgName + " message writer");
+ }
+
+ List<Object> elementPath = cmd.getElement();
+ if (elementPath != null) {
+ final Element element = writer.getElement(elementPath, cmd.getMemType());
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ "Updating message data for element " + element.getElementName() + " on message " + writer.getName() + "(mem type = " + writer.getMemType() + ") to " + cmd.getValue());
+ if (element instanceof DiscreteElement<?>) {
+ ((DiscreteElement<?>) element).parseAndSet((ITestEnvironmentAccessor)Activator.getTestEnvironment(), cmd.getValue());
+ } else {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.WARNING, "not a DiscreteElement: " + element.getName());
+ }
+ }
+ writer.send(cmd.getMemType());
+
+ } catch (Throwable t) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.WARNING,
+ "Exception occurred when attempting to set element value for message " + cmd.getMessage(), t);
+ throw new RemoteException(String.format("failed to set %s of %s to %s", cmd.getElement(), cmd.getMessage(),
+ cmd.getValue()), t);
+ }
+ }
+
+ public synchronized void zeroizeElement(ZeroizeElement cmd) throws RemoteException {
+ final String msgName = cmd.getMessage();
+ try {
+ final Class<?> msgWriterClass = Activator.getTestEnvironment().getRuntimeManager().loadFromRuntimeLibraryLoader(msgName);
+ /* check to see if an instance of a writer for the specified message exists */
+ Message<?, ?, ?> writer = messageRequestor.getMessageWriter(msgWriterClass);
+ if (writer == null) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ String.format("Attempting to zeroize data for %s even though no previous writer exist", msgName));
+ throw new Exception("Could not find the class definition for " + msgName + " message writer");
+ }
+ List<Object> elementPath = cmd.getElement();
+ if (elementPath != null) {
+ final Element element = writer.getElement(elementPath, cmd.getMemType());
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ "Zeroizing message data for element " + element.getElementName() + " on message " + writer.getName() + "(mem type = " + writer.getMemType());
+ element.zeroize();
+ } else {
+ writer.zeroize();
+ }
+ writer.send(cmd.getMemType());
+
+ } catch (Throwable t) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.WARNING,
+ "Exception occurred when attempting to set element value for message " + cmd.getMessage(), t);
+ throw new RemoteException(String.format("failed to zeroize element %s on %s", cmd.getElement(),
+ cmd.getMessage()), t);
+ }
+ }
+
+ /**
+ * Handles subscription request from remote clients.
+ *
+ * @return a {@link org.eclipse.osee.ote.message.MessageState} object detailing the current message state as it
+ * exists in the environment
+ * @see IRemoteMessageService
+ */
+ public synchronized SubscriptionDetails subscribeToMessage(final SubscribeToMessage cmd) throws RemoteException {
+ if (terminated) {
+ throw new IllegalStateException("tool service has been terminated");
+ }
+ final String name = cmd.getMessage();
+ UserTestSessionKey key = null;
+ Class<?> msgClass;
+ try {
+
+ msgClass = Activator.getTestEnvironment().getRuntimeManager().loadFromRuntimeLibraryLoader(name);
+ } catch (ClassNotFoundException e) {
+ throw new RemoteException(String.format("could find %s", name), e);
+ }
+ try {
+
+ /* check to see if an instance of a writer for the specified message exists */
+ Message<?, ?, ?> msgInstance =
+ cmd.getMode() == MessageMode.READER ? messageRequestor.getMessageReader(msgClass) : messageRequestor.getMessageWriter(msgClass);
+ if (msgInstance == null) {
+ throw new Exception("Could not instantiate reader for " + name);
+ }
+ final MemType type = cmd.getType();
+ if (!((MessageSystemTestEnvironment)Activator.getTestEnvironment()).isPhysicalTypeAvailable(type)) {
+ // the message can't exist in this environment return null;
+ return null;
+ }
+
+ /* ask the client for an address when given the message name and mem type */
+ IMsgToolServiceClient reference = cmd.getCallback();
+
+ key = reference.getTestSessionKey();
+ final InetSocketAddress address = reference.getAddressByType(msgInstance.getMessageName(), type.ordinal());
+ if (address == null) {
+ throw new Exception(
+ "client callback for user " + key.getUser().getName() + " returned a null address when subscribing to " + name);
+ }
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ String.format("Client %s at %s is subscribing to message %s: current mem=%s", key.getUser().getName(),
+ address.toString(), name, type));
+
+ EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>> memToModeMap = messageMap.get(name);
+ if (memToModeMap == null) {
+ memToModeMap = new EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>>(MemType.class);
+ messageMap.put(name, memToModeMap);
+ }
+ EnumMap<MessageMode, SubscriptionRecord> modeMap = memToModeMap.get(type);
+ if (modeMap == null) {
+ modeMap = new EnumMap<MessageMode, SubscriptionRecord>(MessageMode.class);
+ memToModeMap.put(type, modeMap);
+ }
+ SubscriptionRecord record = modeMap.get(cmd.getMode());
+ ClientInfo client = new ClientInfo(reference, address);
+ /* see if we have a listener already created for the specified message*/
+ if (record != null) {
+ /*
+ * make sure the listener is still registered for message update. This should always be
+ * the case
+ */
+ if (record.isRegistered()) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE,
+ String.format("Existing listener for %s (mem = %s) is not registered for updates", name, type));
+ }
+ /* there is atleast one client already registered, add this one as well */
+ record.addClient(client);
+ } else {
+ /* this is the first subscription request for this message */
+ assert (name.equals(msgInstance.getClass().getName()));
+ msgInstance.setMemTypeActive(type);
+ record = new SubscriptionRecord(msgInstance, type, cmd.getMode(), client);
+ modeMap.put(cmd.getMode(), record);
+ }
+
+ /*
+ * return the message state back to the client. if both a reader and a writer exist then
+ * always favor the writer
+ */
+ return new SubscriptionDetails(record.key, msgInstance.getActiveDataSource(type).toByteArray(),
+ msgInstance.getAvailableMemTypes());
+
+ } catch (Throwable ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.WARNING, "Exception occurred when subscribing to " + name, ex);
+ if (key != null) {
+ throw new RemoteException("User " + key.getUser().getName() + "Could not subscribe to message " + name, ex);
+ } else {
+ throw new RemoteException("Could not subscribe to message " + name, ex);
+ }
+ }
+ }
+
+ // public synchronized int changeSubscription(final ChangeSubscription cmd) throws RemoteException {
+ // final String name = cmd.getMsgName();
+ // final MemType oldMemType = MemType.values()[cmd.getOldMemTypeOrdinal()];
+ // final MemType newMemType = MemType.values()[cmd.getNewMemTypeOrdinal()];
+ // OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ // String.format("changing subscription for %s from %s to %s", name, oldMemType, newMemType));
+ // OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ // String.format("old address = %s. new address = %s", cmd.getOldAddress(), cmd.getNewAddress()));
+ //
+ // final EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>> memToModeMap = messageMap.get(name);
+ //
+ // if (memToModeMap != null) {
+ // final EnumMap<MessageMode, SubscriptionRecord> modeMap = memToModeMap.get(oldMemType);
+ // if (modeMap != null) {
+ // SubscriptionRecord record = modeMap.get(cmd.getMode());
+ // if (record != null) {
+ // /* remove the old destination address from the listener */
+ // ClientInfo client = record.findClient(cmd.getOldAddress());
+ // if (client == null) {
+ // OseeLog.log(MessageSystemTestEnvironment.class,
+ // Level.SEVERE, "we didn't find a client");
+ // }
+ // record.removeClient(client);
+ // if (record.clients.isEmpty()) {
+ // record.unregister();
+ // modeMap.remove(cmd.getMode());
+ // if (modeMap.isEmpty()) {
+ // modeMap.remove(oldMemType);
+ // }
+ // }
+ // EnumMap<MessageMode, SubscriptionRecord> newModeMap = memToModeMap.get(newMemType);
+ // if (newModeMap == null) {
+ // newModeMap = new EnumMap<MessageMode, SubscriptionRecord>(MessageMode.class);
+ // memToModeMap.put(newMemType, newModeMap);
+ // }
+ // SubscriptionRecord newListener = newModeMap.get(cmd.getMode());
+ // client = new ClientInfo(client.getRemoteReference(), cmd.getNewAddress());
+ // if (newListener == null) {
+ // record.msg.setMemTypeActive(newMemType);
+ // newListener = new SubscriptionRecord(record.msg, newMemType, record.key.getMode(), client);
+ // newModeMap.put(cmd.getMode(), newListener);
+ // } else {
+ // newListener.addClient(client);
+ // }
+ // return newMemType.ordinal();
+ // } else {
+ // OseeLog.log(
+ // MessageSystemTestEnvironment.class,
+ // "org.eclipse.osee.ote.message",
+ // Level.WARNING,
+ // String.format(
+ // "Can't change registration for %s from %s to %s: Subscription not for message mode of %s",
+ // name, oldMemType, newMemType, cmd.getMode()));
+ // return oldMemType.ordinal();
+ // }
+ // } else {
+ // OseeLog.log(
+ // MessageSystemTestEnvironment.class,
+ // "org.eclipse.osee.ote.message",
+ // Level.WARNING,
+ // String.format("Can't change registration for %s from %s to %s: Subscription not current mem type",
+ // name, oldMemType, newMemType));
+ // return oldMemType.ordinal();
+ // }
+ // } else {
+ // OseeLog.log(
+ // MessageSystemTestEnvironment.class,
+ // "org.eclipse.osee.ote.message",
+ // Level.WARNING,
+ // String.format("Can't change registration for %s from %s to %s: No subscriptions for this message", name,
+ // oldMemType, newMemType));
+ // return oldMemType.ordinal();
+ // }
+ // }
+
+ public synchronized void unsubscribeToMessage(final UnSubscribeToMessage cmd) throws RemoteException {
+ final String name = cmd.getMessage();
+ final MemType type = cmd.getMemTypeOrdinal();
+
+
+
+ final EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>> memToModeMap = messageMap.get(name);
+ if (memToModeMap == null) {
+ /* no listeners for this message so return */
+ return;
+ }
+ final EnumMap<MessageMode, SubscriptionRecord> modeMap = memToModeMap.get(type);
+ if (modeMap == null) {
+ throw new RemoteException(String.format("no subscription appears to exist for %s in %s mode", name,
+ type.name()));
+ }
+ final SubscriptionRecord record = modeMap.get(cmd.getMode());
+ ClientInfo client = record.findClient(cmd.getClient());
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ String.format("client at %s is unsubscribing to the %s for %s(%s)", client.ipAddress.toString(),
+ cmd.getMode(), name, type));
+
+ if (record != null) {
+ /* remove the client address from the listener's client list */
+
+ record.removeClient(client);
+
+ /*
+ * if the listener has no more clients then remove the listener and unregister the listener
+ * for message updates.
+ */
+ if (record.clients.isEmpty()) {
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ String.format("No longer listening for updates for message %s. Final update count=%d", name,
+ record.updateCount));
+ record.unregister();
+ record.msg.setMemTypeInactive(type);
+ messageRequestor.remove(record.msg);
+ modeMap.remove(cmd.getMode());
+ memToModeMap.remove(type);
+ assert (!memToModeMap.containsKey(type));
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.interfaces.IRemoteMessageService#startRecording(org.eclipse.osee.ote.message.commands.RecordCommand)
+ */
+ public synchronized boolean startRecording(RecordCommand cmd) throws RemoteException {
+ if (terminated) {
+ throw new IllegalStateException("tool service has been terminated");
+ }
+ String user;
+ try {
+ user = cmd.getClient().getTestSessionKey().getUser().getName();
+ } catch (Exception ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.WARNING, "Problems retrieving the active user", ex);
+ user = "N.A.";
+ }
+ try {
+ LinkedList<MessageRecordConfig> msgsToRecord = new LinkedList<MessageRecordConfig>();
+ for (MessageRecordDetails details : cmd.getMsgsToRecord()) {
+ String name = details.getName();
+ final Class<?> msgClass = Activator.getTestEnvironment().getRuntimeManager().loadFromRuntimeLibraryLoader(name);
+ /* check to see if an instance of a writer for the specified message exists */
+ Message<?, ?, ?> reader = messageRequestor.getMessageReader(msgClass);
+ if (reader == null) {
+ throw new RemoteException("Could not instantiate reader for " + name);
+ }
+ MemType type = details.getType();
+ List<List<Object>> elementNames = details.getBodyElementNames();
+ ArrayList<Element> elementsToRecord = new ArrayList<Element>(elementNames.size());
+ for (List<Object> elementName : elementNames) {
+ final Element element = reader.getElement(elementName, type);
+ if(element == null){
+
+ } else {
+ if (!element.isNonMappingElement()) {
+ elementsToRecord.add(element);
+ }
+ }
+ }
+
+ List<List<Object>> headerElementNames = details.getHeaderElementNames();
+ ArrayList<Element> headerElementsToRecord = new ArrayList<Element>(headerElementNames.size());
+ Element[] headerElements = reader.getActiveDataSource(type).getMsgHeader().getElements();
+ if(headerElements != null && headerElementNames != null){
+ for (List<Object> elementName : headerElementNames) {
+ if(elementName.size() == 2){
+ Object obj = elementName.get(1);
+ if(obj instanceof String){
+ String headerName = (String)obj;
+ for(Element element:headerElements){
+ if(element.getElementName().equals(headerName)){
+ headerElementsToRecord.add(element);
+ }
+ }
+ }
+ }
+ }
+ }
+ MessageRecordConfig config =
+ new MessageRecordConfig(reader, type, details.getHeaderDump(), headerElementsToRecord.toArray(new Element[headerElementsToRecord.size()]),
+ details.getBodyDump(), elementsToRecord.toArray(new Element[elementsToRecord.size()]));
+ msgsToRecord.add(config);
+ }
+ recorderOutputChannel.connect(cmd.getDestAddress());
+ recorder.startRecording(msgsToRecord, recorderOutputChannel);
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ "Recording start by user " + user + ", sending recorder output to " + cmd.getDestAddress().toString());
+ return true;
+ } catch (Throwable ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ "Exception while starting message recording for user " + user, ex);
+ throw new RemoteException("failed to start recording", ex);
+ }
+
+ }
+
+ public synchronized InetSocketAddress getRecorderSocketAddress() throws RemoteException {
+ if (terminated) {
+ throw new IllegalStateException("tool service has been terminated");
+ }
+ if (!recorderOutputChannel.isOpen()) {
+ throw new RemoteException("Recorder output channel is closed");
+ }
+ final DatagramSocket socket = recorderOutputChannel.socket();
+
+ return new InetSocketAddress(socket.getLocalAddress(), socket.getLocalPort());
+ }
+
+ public synchronized InetSocketAddress getMsgUpdateSocketAddress() throws RemoteException {
+ if (terminated) {
+ throw new IllegalStateException("tool service has been terminated");
+ }
+ final DatagramSocket socket = channel.socket();
+ return new InetSocketAddress(socket.getLocalAddress(), socket.getLocalPort());
+ }
+
+ public void stopRecording() throws RemoteException {
+ if (terminated) {
+ throw new IllegalStateException("tool service has been terminated");
+ }
+ if (recorder.isRecording()) {
+ try {
+ recorder.stopRecording(false);
+ } catch (IOException e) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, "Exception while stopping message recording", e);
+ throw new RemoteException("could not stop recorder", e);
+ } catch (InterruptedException e) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, "Exception while stopping message recording", e);
+ throw new RemoteException("could not stop recorder", e);
+ }
+ try {
+ recorderOutputChannel.disconnect();
+ } catch (IOException e) {
+ throw new RemoteException("could not disconnect recorder output channel", e);
+ }
+ }
+
+ }
+
+ /**
+ * terminates the message tool service
+ */
+ public void terminateService() {
+ if (terminated) {
+ return;
+ }
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ "terminate message tool service");
+ try {
+ for (EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>> memToModeMap : messageMap.values()) {
+ for (EnumMap<MessageMode, SubscriptionRecord> modeMap : memToModeMap.values()) {
+ for (SubscriptionRecord listener : modeMap.values()) {
+ /* unregister the listenr for message updates */
+ listener.unregister();
+ if (!listener.clients.isEmpty()) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.WARNING, "Message Watch clients still exist while terminateing message watch service");
+ }
+ }
+ modeMap.clear();
+ }
+ memToModeMap.clear();
+ }
+ messageMap.clear();
+ cancelledSubscriptions.clear();
+ try {
+ channel.close();
+ } catch (IOException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, ex.getMessage(), ex);
+ }
+ if (recorder != null && recorder.isRecording()) {
+ try {
+ recorder.stopRecording(false);
+ } catch (IOException e) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, "failed to stop recording", e);
+ } catch (InterruptedException e) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, "failed to stop recording", e);
+ }
+ }
+
+ try {
+ recorderOutputChannel.close();
+ } catch (IOException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, ex.getMessage(), ex);
+ }
+ } finally {
+ terminated = true;
+ }
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ "terminated message tool service");
+ }
+
+ /**
+ * sends the message update buffer to all of the specified addresses data
+ *
+ * @param sendToList
+ * @param msgName
+ * @param buffer
+ */
+ private void xmitMsg(final Collection<ClientInfo> sendToList, final String msgName, final ByteBuffer buffer) throws IOException {
+ assert (buffer.position() == 0);
+ assert (buffer.limit() > 0);
+ int limit = buffer.limit();
+ for (ClientInfo client : sendToList) {
+ if (debugEnabled) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, String.format("sending update for message %s to %s", msgName, client.toString()));
+ }
+ if (client == null) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, String.format("client was null %s", msgName, client.toString()));
+ } else if (client.getIpAddress() == null) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO, String.format("client ip address is null %s to %s", msgName, client.toString()));
+ } else {
+
+ channel.send(buffer, client.getIpAddress());
+ }
+ /*
+ * rewind the buffer for next address since we are sending the same data to each client
+ */
+ buffer.rewind();
+ }
+
+ }
+
+ public EnumSet<MemType> getAvailablePhysicalTypes() {
+ final EnumSet<MemType> available = EnumSet.noneOf(MemType.class);
+ for (MemType type : MemType.values()) {
+ if (((MessageSystemTestEnvironment)Activator.getTestEnvironment()).isPhysicalTypeAvailable(type)) {
+ available.add(type);
+ }
+ }
+ return available;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.interfaces.IRemoteMessageService#setReaderWriterMode(org.eclipse.osee.ote.message.tool.MessageMode)
+ */
+ public synchronized SubscriptionDetails setReaderWriterMode(SetMessageModeCmd cmd) throws RemoteException {
+ final String name = cmd.getName();
+
+ try {
+ final EnumMap<MemType, EnumMap<MessageMode, SubscriptionRecord>> memToModeMap = messageMap.get(name);
+ if (memToModeMap == null) {
+ throw new IllegalStateException("No subscriptions registered for message " + name);
+ }
+ final EnumMap<MessageMode, SubscriptionRecord> modeMap = memToModeMap.get(cmd.getType());
+ if (modeMap == null) {
+ throw new IllegalStateException("Could not find record for Mem Type of " + cmd.getType() + " for message ");
+ }
+ final SubscriptionRecord record = modeMap.get(cmd.getOldMode());
+ if (record == null) {
+ throw new IllegalStateException("Could not find record for " + cmd.getOldMode() + " of the message ");
+ }
+ ClientInfo client = record.findClient(cmd.getClient());
+ record.removeClient(client);
+ final InetSocketAddress address = client.ipAddress;
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ String.format("Client at %s is changing message mode for %s from %s to %s", address.toString(), name,
+ cmd.getOldMode(), cmd.getNewMode()));
+ if (record.clients.isEmpty()) {
+ record.unregister();
+ messageRequestor.remove(record.msg);
+ modeMap.remove(cmd.getOldMode());
+ }
+ SubscriptionRecord newRecord = modeMap.get(cmd.getNewMode());
+ if (newRecord == null) {
+ final Class<?> msgWriterClass = Activator.getTestEnvironment().getRuntimeManager().loadFromRuntimeLibraryLoader(name);
+ /* check to see if an instance of a writer for the specified message exists */
+ Message<?, ?, ?> newMsg =
+ cmd.getNewMode() == MessageMode.WRITER ? messageRequestor.getMessageWriter(msgWriterClass) : messageRequestor.getMessageReader(msgWriterClass);
+ if (newMsg == null) {
+ throw new ClassNotFoundException(
+ "Could not find class for the " + cmd.getNewMode().toString() + " of the message");
+ }
+ OseeLog.log(
+ MessageSystemTestEnvironment.class,
+ Level.INFO,
+ "Adding a subscription to: " + newMsg.getName() + " type[" + record.key.getType() + "] mode[" + cmd.getNewMode() + "]");
+ newRecord = new SubscriptionRecord(newMsg, record.key.getType(), cmd.getNewMode(), client);
+ newMsg.setMemTypeActive(record.key.getType());
+ modeMap.put(cmd.getNewMode(), newRecord);
+ } else {
+ newRecord.addClient(client);
+ }
+
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ "success changing reader/writer mode. New mode = " + newRecord.key.getMode());
+ return new SubscriptionDetails(newRecord.key, newRecord.msg.getActiveDataSource(cmd.getType()).toByteArray(), newRecord.msg.getAvailableMemTypes());
+ } catch (Throwable t) {
+ String title = "Could not set reader/writer for message " + name;
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO,
+ t.getMessage(), t);
+ throw new RemoteException(title, t);
+ }
+ }
+
+ public Map<String, Throwable> getCancelledSubscriptions() {
+ return cancelledSubscriptions;
+ }
+
+ public void reset() {
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java
new file mode 100644
index 00000000000..1ecebd2ea98
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java
new file mode 100644
index 00000000000..7d8c1d86cf1
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.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.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
+ * @param config
+ * @param t
+ */
+ void onTransferException(TransferConfig config, Throwable t);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/MessageMode.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/MessageMode.java
new file mode 100644
index 00000000000..ac6fb275f43
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java
new file mode 100644
index 00000000000..7e08074575c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.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.tool;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Set;
+import org.eclipse.osee.ote.message.enums.MemType;
+
+/**
+ * @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 EnumSet<MemType> availableMemTypes;
+
+ public SubscriptionDetails(SubscriptionKey key, byte[] currentData, Set<MemType> availableMemTypes) {
+ this.key = key;
+ this.currentData = currentData;
+ this.availableMemTypes = EnumSet.noneOf(MemType.class);
+ this.availableMemTypes.addAll(availableMemTypes);
+ }
+
+ public SubscriptionKey getKey() {
+ return key;
+ }
+
+ public byte[] getCurrentData() {
+ return currentData;
+ }
+
+ public EnumSet<MemType> getAvailableMemTypes() {
+ return availableMemTypes;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java
new file mode 100644
index 00000000000..6affd39318d
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.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.tool;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.enums.MemType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public final class SubscriptionKey implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 4385205425559852952L;
+
+ private final int id;
+ private final MemType type;
+ private final MessageMode mode;
+ private final String messageClassName;
+
+ public SubscriptionKey(int id, MemType type, MessageMode mode, String messageClassName) {
+ this.id = id;
+ this.type = type;
+ this.mode = mode;
+ this.messageClassName = messageClassName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public MemType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ public String getMessageClassName() {
+ return messageClassName;
+ }
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/TransferConfig.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/TransferConfig.java
new file mode 100644
index 00000000000..76b84d5fbb4
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/TransferConfig.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.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;
+
+ /**
+ * @param 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;
+ /**
+ * @param fileChannel
+ * @param sourceAddress
+ * @param port
+ * @param direction
+ */
+ public TransferConfig(
+ final String fileName,
+ final InetSocketAddress sourceAddress,
+ final InetSocketAddress destinationAddress,
+ final Direction direction,
+ final int blockCount) {
+ super();
+ this.fileName = fileName;
+ this.sourceAddress = sourceAddress;
+ this.destinationAddress = destinationAddress;
+ this.direction = direction;
+ this.blockCount = blockCount;
+
+ }
+ /**
+ * @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;
+ }
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java
new file mode 100644
index 00000000000..1a283e1b6fa
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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<SelectionKey, Handle>();
+ 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;
+
+ /**
+ * @param key
+ * @param config
+ * @param 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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.IFileTransferHandle#addListener(org.eclipse.osee.ote.message.tool.IUdpTransferListener)
+ */
+ public void addListener(IUdpTransferListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.IFileTransferHandle#stop()
+ */
+ 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.release();
+ lock.channel().close();
+ for (IUdpTransferListener listener : listeners) {
+ listener.onTransferComplete(config);
+ }
+ listeners.clear();
+ }
+ }
+
+ }
+
+ public UdpFileTransferHandler() throws IOException {
+ selector = Selector.open();
+ thread = new Thread(new Runnable() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ 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.getMessage(), ex);
+ }
+ } catch (IOException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, ex.getMessage(), ex);
+ }
+ }
+
+ });
+ thread.setName("UDP File Transfer Handler");
+ }
+
+ /**
+ * @param config
+ * @return true if successful or false if a lock on the file was not obtained
+ * @throws IOException
+ * @throws FileNotFoundException
+ */
+ 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;
+ if (config.getDirection() == TransferConfig.Direction.SOCKET_TO_FILE) {
+ FileOutputStream fos = new FileOutputStream(file);
+ fileChannel = fos.getChannel();
+ } else {
+ FileInputStream fis = new FileInputStream(file);
+ fileChannel = fis.getChannel();
+ }
+ final FileLock lock = fileChannel.tryLock();
+ 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 {
+ channel.socket().getReceiveBufferSize();
+ 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.getMessage(), ex);
+ } catch (FileNotFoundException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex.getMessage(), ex);
+ } catch (IOException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex.getMessage(), ex);
+ } catch (InterruptedException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex.getMessage(), ex);
+ }
+ }
+
+ /**
+ * stops all currently running file transfers but does not shutdown the file transfer service
+ *
+ * @throws IOException
+ */
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java
new file mode 100644
index 00000000000..4792cc41e50
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.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.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;
+ }
+
+ public void asCharElement(CharElement element) {
+ entry = new CharElementEntry(element);
+ }
+
+ public void asEnumeratedElement(EnumeratedElement<?> element) {
+ entry = new EnumeratedElementEntry(element);
+ }
+
+ public void asFixedPointElement(FixedPointElement element) {
+ entry = new RealElementEntry(element);
+ }
+
+ public void asFloat32(Float32Element element) {
+ entry = new RealElementEntry(element);
+ }
+
+ public void asFloat64(Float64Element element) {
+ entry = new RealElementEntry(element);
+ }
+
+ public void asGenericElement(Element element) {
+ }
+
+ public void asIntegerElement(IntegerElement element) {
+ entry = new IntegerElementEntry(element);
+ }
+
+ public void asRealElement(RealElement element) {
+ entry = new RealElementEntry(element);
+ }
+
+ public void asRecordElement(RecordElement element) {
+ entry = new RecordElementEntry(element);
+ }
+
+ public void asStringElement(StringElement element) {
+ entry = new StringElementEntry(element);
+ }
+
+
+ public void asBooleanElement(BooleanElement element) {
+ entry = new BooleanElementEntry(element);
+ }
+
+ public void asRecordMap(RecordMap<? extends RecordElement> element) {
+ entry = new RecordMapEntry(element);
+ }
+
+ public void asEmptyEnumElement(EmptyEnum_Element element) {
+ entry = new EmptyEnumEntry(element);
+ }
+
+ @Override
+ public void asArrayElement(ArrayElement element) {
+ entry = new ArrayElementEntry(element);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.IElementVisitor#asUnsignedIntegerElement(org.eclipse.osee.ote.message.elements.UnsignedIntegerElement)
+ */
+ public void asLongIntegerElement(LongIntegerElement element) {
+ entry = new LongIntegerElementEntry(element);
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java
new file mode 100644
index 00000000000..ffe02d341d6
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.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.tool.rec;
+
+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);
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java
new file mode 100644
index 00000000000..8e64759c069
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.MemType;
+
+public class MessageRecordConfig {
+ private final Message<?, ? , ?> msg;
+ private final Element[] headerElements;
+ private final Element[] bodyElements;
+ private final MemType type;
+ private final boolean headerDump;
+ private final boolean bodyDump;
+
+ public MessageRecordConfig(final Message<?,?,?> msg, final MemType 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 MemType 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 MemType getType() {
+ return type;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java
new file mode 100644
index 00000000000..c922955d856
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.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.tool.rec;
+
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+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.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.internal.Activator;
+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<IMessageEntry>(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 WeakReference<TestEnvironmentInterface> env;
+ private final ArrayBlockingQueue<ByteBuffer> bufferQueue = new ArrayBlockingQueue<ByteBuffer>(NUM_BUFFERS);
+
+ public MessageRecorder(IMessageEntryFactory factory) {
+ this.factory = factory;
+ this.env = new WeakReference<TestEnvironmentInterface>(Activator.getTestEnvironment());
+ 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 InterruptedException{
+ if (list == null) {
+ throw new IllegalArgumentException("list cannot be null");
+ }
+ if (channel == null) {
+ throw new IllegalArgumentException("channel cannot be null");
+ }
+ recLock.tryLock(2, TimeUnit.SECONDS);
+ this.channel = channel;
+ try {
+ 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 long getTimeStamp() {
+ return env.get().getEnvTime();
+ }
+
+ public void stopRecording(boolean closeOutputChannel) throws IOException, InterruptedException {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.INFO,
+ "stopping message recorder...");
+ isRecording = false;
+ recLock.tryLock(2, TimeUnit.SECONDS);
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java
new file mode 100644
index 00000000000..a041b6826f4
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.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.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
+ *
+ * @param byteValue
+ * @param 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java
new file mode 100644
index 00000000000..5c346d64948
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.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.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();
+ }
+
+ public ArrayElement getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java
new file mode 100644
index 00000000000..70b2515fbe0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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();
+ }
+
+ public BooleanElement getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java
new file mode 100644
index 00000000000..4697aa6dbca
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.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.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();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry#getElement()
+ */
+ public CharElement getElement() {
+ return element;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry#write(java.nio.ByteBuffer, org.eclipse.osee.ote.message.data.MemoryResource)
+ */
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java
new file mode 100644
index 00000000000..3174f16d79c
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.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.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();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry#getElement()
+ */
+ public Element getElement() {
+ return element;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry#write(java.nio.ByteBuffer, org.eclipse.osee.ote.message.data.MemoryResource)
+ */
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java
new file mode 100644
index 00000000000..9184052bd14
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.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.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();
+ }
+ }
+
+ public EnumeratedElement<?> getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java
new file mode 100644
index 00000000000..c5058ead5d9
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java
new file mode 100644
index 00000000000..28075c3b13e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java
new file mode 100644
index 00000000000..59cae1ea33e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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();
+ }
+
+ public IntegerElement getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java
new file mode 100644
index 00000000000..4565ff8d91e
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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();
+ }
+
+ public LongIntegerElement getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/MessageRecEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/MessageRecEntry.java
new file mode 100644
index 00000000000..85fe694d50f
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/MessageRecEntry.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.tool.rec.entry;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.WritableByteChannel;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.concurrent.ArrayBlockingQueue;
+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.message.IMessageHeader;
+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.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.enums.MemType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+import org.eclipse.osee.ote.message.tool.rec.ElementEntryFactory;
+import org.eclipse.osee.ote.message.tool.rec.MessageRecorder;
+import org.eclipse.osee.ote.message.tool.rec.RecUtil;
+
+public class MessageRecEntry<T extends Message<?, ?, T>> implements IMessageEntry, IOSEEMessageListener {
+ protected static final byte COMMA = ',';
+ protected static final byte EQUALS = '=';
+ protected static final byte NL = '\n';
+ protected static final byte[] BODY_HEX_DUMP_STR = "BODY HEX DUMP".getBytes();
+ protected static final byte[] HEADER_HEX_DUMP_STR = "HEADER HEX DUMP".getBytes();
+ protected final Benchmark bm;
+ protected final Benchmark pbm;
+ private final T msg;
+ private final byte[] nameAsBytes;
+ private final byte[] headerTypeAsBytes;
+ private static final int MAX_BUFFERS = 2;
+ private final ArrayBlockingQueue<ByteBuffer> buffers = new ArrayBlockingQueue<ByteBuffer>(MAX_BUFFERS);
+ private ByteBuffer currentBuffer;
+ private final int lowCapacitiyLevel;
+ private final IElementEntry[] headerEntries;
+ private final IElementEntry[] bodyEntries;
+ private volatile boolean enabled = false;
+ private int longestLength = 0;
+ private final MessageRecorder recorder;
+ private final MemType type;
+ private final int headerSize;
+ private final HashMap<MessageData, Byte> dataMap = new HashMap<MessageData, Byte>(16);
+ private boolean bodyDump;
+ private boolean headerDump;
+
+ public MessageRecEntry(T msg, MemType type, boolean headerDump, Element[] hdrElements, boolean bodyDump, Element[] bdyElements, MessageRecorder recorder) {
+ this.msg = msg;
+ this.type = type;
+ this.recorder = recorder;
+ this.bodyDump = bodyDump;
+ this.headerDump = headerDump;
+ bm = new Benchmark("rec time for " + msg.getName(), 0300);
+ pbm = new Benchmark("post process for " + msg.getName(), 10000);
+ headerEntries = new IElementEntry[hdrElements.length];
+ int i = 0;
+
+ for (MessageData data : msg.getMessageData(type)) {
+ dataMap.put(data, (byte) i);
+ i++;
+ }
+
+ i = 0;
+ for (Element element : hdrElements) {
+ headerEntries[i] = ElementEntryFactory.createEntry(element);
+ i++;
+ }
+ bodyEntries = new IElementEntry[bdyElements.length];
+
+ i = 0;
+ for (Element element : bdyElements) {
+ if (element.getMsgData().getType() != type) {
+ throw new IllegalArgumentException(String.format("all elements(%s) must have a mem type of %s",
+ element.getName(), type.toString()));
+ }
+ bodyEntries[i] = ElementEntryFactory.createEntry(element);
+ i++;
+ }
+ Arrays.sort(bodyEntries, new Comparator<IElementEntry>() {
+
+ public int compare(IElementEntry o1, IElementEntry o2) {
+ Element element1 = o1.getElement();
+ Element element2 = o2.getElement();
+ if (element1.getByteOffset() < element2.getByteOffset()) {
+ return -1;
+ } else if (element1.getByteOffset() == element2.getByteOffset()) {
+ if (element1.getMsb() < element2.getMsb()) {
+ return -1;
+ } else if (element1.getMsb() > element2.getMsb()) {
+ return 1;
+ } else if (element1.getLsb() < element2.getLsb()) {
+ return -1;
+ } else if (element1.getLsb() > element2.getLsb()) {
+ return 1;
+ }
+ return element1.getName().compareTo(element2.getName());
+
+ } else {
+ return 1;
+ }
+ }
+
+ });
+
+ // make the buffer big enough for about 2 seconds worth of message transmissions
+ //int size = (int) ((float)msg.getMaxDataSize() * msg.getRate()) * 3;
+
+ int size = 16384;
+ // if the buffer has capacity left for one more message then we should send it off to the file
+ lowCapacitiyLevel = 512;
+
+ for (i = 0; i < MAX_BUFFERS - 1; i++) {
+ buffers.add(ByteBuffer.allocate(size));
+ }
+ currentBuffer = ByteBuffer.allocate(size);
+
+ nameAsBytes = msg.getName().getBytes();
+ IMessageHeader header = msg.getActiveDataSource(type).getMsgHeader();
+ headerSize = header.getHeaderSize();
+ String hName = header.getClass().getCanonicalName();
+ hName = hName.substring(hName.lastIndexOf('.') + 1);
+ headerTypeAsBytes = hName.getBytes();
+ }
+
+ public T getMessage() {
+ return msg;
+ }
+
+ public synchronized void enable(boolean enable) {
+ T msg = getMessage();
+ if (enable) {
+ enabled = true;
+ msg.addListener(this);
+ } else {
+ enabled = false;
+ msg.removeListener(this);
+ finishUp();
+ }
+ }
+
+ private void finishUp() {
+ if (currentBuffer.position() > 0) {
+ try {
+ postProcess(currentBuffer);
+ } catch (Exception ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, "failed to write remaining contents of buffer for message " + msg.getName(), ex);
+ }
+ }
+ }
+
+ protected final int getLowCapacitiyLevel() {
+ return lowCapacitiyLevel;
+ }
+
+ protected final byte[] getNameAsBytes() {
+ return nameAsBytes;
+ }
+
+ public void onInitListener() throws MessageSystemException {
+ // do nothing
+ }
+
+ public synchronized void onDataAvailable(MessageData data, MemType type) throws MessageSystemException {
+ if (this.type == type && enabled) {
+ bm.startSample();
+ final int length = data.getCurrentLength();
+ if (length > longestLength) {
+ longestLength = length;
+ }
+ if (currentBuffer.remaining() < (length + 13)) {
+ try {
+ // hand off for post processing
+ handOffBufferForProcessing(currentBuffer);
+ // switch to another buffer
+ currentBuffer = buffers.take();
+
+ currentBuffer.putInt(length);
+ currentBuffer.putLong(recorder.getTimeStamp());
+ Byte dataID = dataMap.get(data);
+ if (dataID == null) {
+ throw new IllegalArgumentException(String.format("no data mapped for %s", data.getName()));
+ }
+ currentBuffer.put(dataID);
+ currentBuffer.put(data.toByteArray(), 0, length);
+ } catch (Throwable t) {
+ throw new MessageSystemException(
+ "problems handing off buffer(pos=" + currentBuffer.position() + ", remaing=" + currentBuffer.remaining() + ") for " + msg.getName(),
+ Level.SEVERE, t);
+ }
+ } else {
+ currentBuffer.putInt(length);
+ currentBuffer.putLong(recorder.getTimeStamp());
+ Byte dataID = dataMap.get(data);
+ if (dataID == null) {
+ throw new IllegalArgumentException(String.format("no data mapped for %s", data.getName()));
+ }
+ currentBuffer.put(dataID);
+ currentBuffer.put(data.toByteArray(), 0, length);
+ }
+
+ bm.endSample();
+ }
+ }
+
+ private void handOffBufferForProcessing(final ByteBuffer buffer) throws InterruptedException, IOException {
+
+ recorder.submitTask(new Runnable() {
+
+ public void run() {
+ try {
+ postProcess(buffer);
+ } catch (Throwable t) {
+ OseeLog.log(MessageSystemTestEnvironment.class,
+ Level.SEVERE, "failed to process buffer for message " + msg.getName(), t);
+ }
+ }
+
+ });
+
+ }
+
+ private void postProcess(final ByteBuffer bufferToProcess) throws InterruptedException, IOException {
+ pbm.startSample();
+ ByteBuffer fileWriteBuffer = recorder.acquireOutputBuffer();
+ try {
+ bufferToProcess.flip();
+ fileWriteBuffer.clear();
+ // fileWriteBuffer.put(String.format("%d, Start of post process by %s\n", recorder.getTimeStamp(),
+ // Thread.currentThread().getName()).getBytes());
+ final MemoryResource mem = new MemoryResource(new byte[longestLength], 0, longestLength);
+ while (bufferToProcess.hasRemaining()) {
+ final int length = bufferToProcess.getInt();
+ int bodySize = length - headerSize;
+ final long timeStamp = bufferToProcess.getLong();
+ final Byte dataID = bufferToProcess.get();
+ final byte[] data = mem.getData();
+ if (bufferToProcess.remaining() < length) {
+ throw new IllegalStateException(String.format(
+ "Invalid recording buffer for msg %s: buf remaining=%d, length expected=%d", msg.getName(),
+ bufferToProcess.remaining(), length));
+ }
+ bufferToProcess.get(data, 0, length);
+ fileWriteBuffer.put(Long.toString(timeStamp).getBytes()).put(COMMA);
+ fileWriteBuffer.put(nameAsBytes).put(COMMA);
+ fileWriteBuffer.put(headerTypeAsBytes).put(COMMA);
+ for (IElementEntry entry : headerEntries) {
+ entry.write(fileWriteBuffer, mem, headerSize);
+ }
+
+ for (IElementEntry entry : bodyEntries) {
+ final Element element = entry.getElement();
+ if (dataMap.get(element.getMsgData()).equals(dataID)) {
+ if (element.getByteOffset() < bodySize) {
+ entry.write(fileWriteBuffer, mem, bodySize);
+ } else {
+ break;
+ }
+ }
+ }
+
+ // hex dump
+ if(headerDump){
+ fileWriteBuffer.put(HEADER_HEX_DUMP_STR).put(COMMA);
+ for (int i = 0; i < headerSize; i++) {
+ fileWriteBuffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex(data[i], fileWriteBuffer);
+ }
+ }
+ if(bodyDump){
+ fileWriteBuffer.put(COMMA);
+ fileWriteBuffer.put(BODY_HEX_DUMP_STR).put(COMMA);
+ for (int i = headerSize; i < length; i++) {
+ fileWriteBuffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex(data[i], fileWriteBuffer);
+ }
+ }
+ fileWriteBuffer.put(NL);
+ flush(fileWriteBuffer);
+ }
+ bufferToProcess.clear();
+ } catch (RuntimeException e) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, "problems post processing " + msg.getName(), e);
+ } finally {
+ recorder.releaseOutputBuffer(fileWriteBuffer);
+ buffers.add(bufferToProcess);
+ }
+ pbm.endSample();
+ }
+
+ private void flush(ByteBuffer fileWriteBuffer) throws IOException {
+ fileWriteBuffer.flip();
+ final WritableByteChannel channel = recorder.getChannel();
+ synchronized (channel) {
+ int totalLimit = fileWriteBuffer.limit();
+ int position = fileWriteBuffer.position();
+ int chunkSize = 4096;
+ int limit = chunkSize;
+ int written = 0;
+ boolean moreToWrite = true;
+ if(totalLimit < limit){
+ limit = totalLimit;
+ }
+ while(moreToWrite){
+ fileWriteBuffer.position(position);
+ fileWriteBuffer.limit(limit);
+ int size = channel.write(fileWriteBuffer);
+ written += size;
+ position = size + position;
+ limit = position + chunkSize;
+ if(position == totalLimit){
+ moreToWrite = false;
+ } else if(totalLimit < limit){
+ limit = totalLimit;
+ }
+ }
+ }
+ fileWriteBuffer.clear();
+ }
+
+
+ @Override
+ public String toString() {
+ return String.format("Msg Rec Entry for %s memtype=%s", msg.getName(), type.name());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java
new file mode 100644
index 00000000000..ee32a965304
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.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.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();
+ }
+
+ public RealElement getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java
new file mode 100644
index 00000000000..54de974c4d0
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.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.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++;
+ }
+ }
+
+ public RecordElement getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java
new file mode 100644
index 00000000000..79e3eb14a66
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.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.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));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry#getElement()
+ */
+ public Element getElement() {
+ return element;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry#write(java.nio.ByteBuffer, org.eclipse.osee.ote.message.data.MemoryResource)
+ */
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java
new file mode 100644
index 00000000000..710973e0d89
--- /dev/null
+++ b/org.eclipse.osee.ote.message/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();
+ }
+
+ public SignedInteger16Element getElement() {
+ return element;
+ }
+
+ 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.message/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java
new file mode 100644
index 00000000000..2f62a03aac3
--- /dev/null
+++ b/org.eclipse.osee.ote.message/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.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.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();
+ }
+
+ public StringElement getElement() {
+ return element;
+ }
+
+ 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.messaging.dds/.classpath b/org.eclipse.osee.ote.messaging.dds/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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/.project b/org.eclipse.osee.ote.messaging.dds/.project
new file mode 100644
index 00000000000..f1f576b1716
--- /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/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ote.messaging.dds/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..0e20e00415a
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Mon Jul 14 17:46:08 MST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
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 00000000000..cec8198b5d7
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+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.4.0.qualifier
+Bundle-Vendor: Eclipse.org
+Bundle-Localization: plugin
+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.6
+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 00000000000..5aa5ba727c8
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/build.properties
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+ .
+jars.compile.order = .
+source.. = src/
+output.. = bin/
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 00000000000..cca5dfcb273
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.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;
+
+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 00000000000..e6af3092979
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.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.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 WeakReference<Data> data;
+ private SampleInfo sampleInfo;
+
+ /**
+ * Create a data sample that is used for propogating data through
+ * the system.
+ *
+ * @param data
+ * @param sampleInfo
+ */
+ public DataSample(Data data, SampleInfo sampleInfo) {
+ this.data = new WeakReference<Data>(data);
+ this.sampleInfo = sampleInfo;
+ }
+
+ /**
+ * Create a data sample that can be used for receiving propogated data.
+ *
+ * @param data
+ */
+ public DataSample(Data data) {
+ super();
+ this.data = new WeakReference<Data>(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 00000000000..579651668a0
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.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;
+
+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.
+ *
+ * @param theData
+ * @param theTopicDescription
+ * @param theWriter
+ */
+ 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 00000000000..7e33b5d82d2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.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.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 00000000000..9dc74165826
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.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.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 00000000000..c7e7f0ef6e0
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.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;
+
+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.
+ * @return
+ */
+ 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 00000000000..30601da2805
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.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.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 00000000000..01d445c649f
--- /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 00000000000..4911e7896ef
--- /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 00000000000..b6141483a5d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.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.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 String kindName;
+ private long kindId;
+
+ /**
+ * @param kindName
+ * @param 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 00000000000..4d92f940e60
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.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.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 00000000000..f41fda65281
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.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;
+
+/**
+ * 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 int value;
+ private String description;
+
+ /**
+ * Creates a new <code>ReturnCode</code> with a given value and description.
+ *
+ * @param value
+ * @param 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 00000000000..1be40aa2038
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.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.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 00000000000..7f2e661e256
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.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.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 00000000000..4a279e18e95
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.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.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;
+ }
+
+ /**
+ * @param seconds
+ * @param nanoSeconds
+ */
+ 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 00000000000..e9cf069f53b
--- /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 00000000000..64ce0bc7b5d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.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.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 00000000000..8c970a8c363
--- /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 00000000000..de76e37e77f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.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.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 String queryExpression;
+ private Collection<String> queryArguments;
+
+ /**
+ * @param queryExpression
+ * @param 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 00000000000..7c37aa6d2e2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.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.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 DataReader dataReader;
+ private Collection<?> sampleStateKinds;
+ private Collection<?> viewStateKinds;
+ private Collection<?> instanceStateKinds;
+
+ /**
+ * @param dataReader
+ * @param sampleStateKinds
+ * @param viewStateKinds
+ * @param 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 00000000000..e359502a49e
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.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.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 Collection<?> enabledStatuses;
+ private 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 00000000000..e8d72d87a02
--- /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 00000000000..5cd97914ec1
--- /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 00000000000..c0eb1350996
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java
@@ -0,0 +1,601 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 final TopicDescription topicDescription;
+ private final 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.
+ *
+ * @return
+ * <ul>
+ * <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.
+ *
+ * @return
+ * <ul>
+ * <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.
+ *
+ * @return
+ * <ul>
+ * <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;
+ }
+
+ /**
+ * This is intended to be called whenever new data is "published" to the Service. Calls
+ * onDataAvailable on the attached <code>DataReaderListener</code> as appropriate.
+ *
+ * @param theData
+ */
+ 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 00000000000..07289fc53c4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java
@@ -0,0 +1,359 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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);
+ }
+
+ /**
+ * 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
+ *
+ * @return <ul>
+ * <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) {
+
+ // 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 diposeWithTimestamp(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 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 00000000000..10000f78d7f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.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.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 {
+
+ /**
+ * @param enabled
+ * @param parentFactory
+ */
+ 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 00000000000..f869fee5f8c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
@@ -0,0 +1,574 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 org.eclipse.osee.framework.jdk.core.type.CompositeKey;
+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 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<Publisher>(); // Thread Safe
+ this.subscribers = new CopyOnWriteArrayList<Subscriber>(); // Thread Safe
+ this.topics =
+ new CompositeKeyHashMap<String, String, Topic>(new ConcurrentHashMap<CompositeKey<String, String>, Topic>(
+ 512));
+ 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 00000000000..17743953510
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 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 (DomainParticipant) domain.iterator().next();
+ // Otherwise, no such participant exists
+ else
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.messaging.dds.entity.EntityFactory#isEnabled()
+ */
+ 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 00000000000..56e2c379116
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 StatusCondition statusCondition; //DONT_NEED This has not been implemented, but is called out in the spec
+ private 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.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;
+ }
+}
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 00000000000..1732ce4fa28
--- /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 00000000000..6c19def2130
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.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.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 {
+
+ /**
+ * @param participant
+ * @param typeName
+ * @param name
+ * @param enabled
+ * @param listener
+ * @param parentFactory
+ */
+ 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 00000000000..6458785769f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java
@@ -0,0 +1,365 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 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<DataWriter>();
+ publicationQueue = new ArrayList<DataStoreItem>();
+ pendingQueue = new ArrayList<DataStoreItem>();
+ }
+
+ /**
+ * 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;
+
+ if (dataWriters.remove(dataWriter)) {
+ dataWriter.markAsDeleted();
+ 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 00000000000..752b63dc92b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.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.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 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);
+ }
+
+ 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 00000000000..c9c14009a28
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java
@@ -0,0 +1,278 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 00000000000..462ea8521c7
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.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.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 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<DataReader>();
+ 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 00000000000..81f8454f4d4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.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.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 {
+
+ /**
+ * @param participant
+ * @param typeName
+ * @param name
+ * @param enabled
+ * @param listener
+ * @param parentFactory
+ */
+ 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 00000000000..1fbc70131cf
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * 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 Collection<DataReader> dataReaders;
+ private Collection<DataWriter> dataWriters;
+
+ // Local variables to implement the TopicDescription interface
+ private DomainParticipant participant;
+ private TypeSignature typeSignature;
+ private String name;
+ private 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.
+ *
+ * @param participant
+ * @param typeName
+ * @param name
+ */
+ 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<DataReader>();
+ dataWriters = new Vector<DataWriter>();
+ count = 1;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the participant.
+ */
+ public DomainParticipant getParticipant() {
+ return participant;
+ }
+
+ /**
+ * @return Returns the typeName.
+ */
+ 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);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof Topic) {
+ Topic topic = (Topic) obj;
+ return name.equals(topic.getName()) && namespace.equals(topic.getNamespace());
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return name.hashCode() ^ namespace.hashCode();
+ }
+
+ /* (non-Javadoc)
+ * @see osee.messaging.dds.service.TopicDescription#getNamespace()
+ */
+ 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 00000000000..e4fedf69ff6
--- /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 00000000000..fad88c4124f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.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.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 00000000000..8eb3865d08d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.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.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 00000000000..408074ff57b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.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.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 00000000000..42893be880c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.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.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 00000000000..06db6909975
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.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 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 00000000000..ef9cf9d6105
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.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.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 00000000000..6cc4b834a8b
--- /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 00000000000..221975004cc
--- /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 00000000000..d7808a66144
--- /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 00000000000..70e8bfb3faa
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.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.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 String policyName;
+ private long policyId;
+
+
+ /**
+ * @param policyName
+ * @param 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 00000000000..b12eb4b942b
--- /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 00000000000..46536f50124
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.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.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 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+
+ if (obj instanceof DomainId) {
+ DomainId domainId = (DomainId)obj;
+ return domainId.id == this.id;
+ }
+
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ 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 00000000000..6590358c86b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.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.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 00000000000..6161741decf
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.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.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 00000000000..a3e7861acde
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.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.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 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 00000000000..cf693efa38f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.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.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 String typeName;
+ private int typeDataSize;
+ private WeakReference<Key> key;
+ private String readerName;
+ private String writerName;
+ private 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>(key);
+ this.readerName = readerName;
+ this.writerName = writerName;
+ this.classLoader = new WeakReference<ClassLoader>( 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;
+ }
+
+ 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;
+ }
+
+ 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 00000000000..77fa57bb052
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.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.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 00000000000..0357634f5c9
--- /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 00000000000..68755fb64a2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.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.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 long totalCount;
+ private 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 00000000000..a6585965579
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.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 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 00000000000..e4243f6b29b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.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.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 long activeCount;
+ private long activeCountChange;
+ private long inactiveCount;
+ private 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 00000000000..31a649b3c25
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.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 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 00000000000..ad4ffc9d8f2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.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.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 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 00000000000..3a1cd1e9e4f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.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.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 long lastPolicyId;
+ private 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<QosPolicy>(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 00000000000..e2ff0e7f4e8
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.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.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 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 00000000000..ada4b9649eb
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.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.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 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 00000000000..3c5abab6b5b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.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.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 long lastPolicyId;
+ private 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<QosPolicy>(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 00000000000..df6c26f3516
--- /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 00000000000..ff73a85e0e6
--- /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 SampleRejectedStatusKind lastReason;
+ private 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 00000000000..4a6b295d002
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.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.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 int value;
+ private 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 00000000000..e2140434d17
--- /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 00000000000..ea9e731bb7d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.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.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 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 00000000000..5ddecf71453
--- /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 00000000000..06ad4b78b82
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 DomainParticipant domainParticipant;
+ private Publisher publisher;
+ private Subscriber subscriber;
+ private 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");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.TopicListener#onInconsistentTopic(osee.messaging.dds.entity.Topic, osee.messaging.dds.status.InconsistentTopicStatus)
+ */
+ public void onInconsistentTopic(Topic theTopic, InconsistentTopicStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.SubscriberListener#onDataOnReaders(osee.messaging.dds.entity.Subscriber)
+ */
+ public void onDataOnReaders(Subscriber theSubscriber) {
+ System.out.println ("++onDataOnReaders was called");
+ //theSubscriber.getDataReaders();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onDataAvailable(osee.messaging.dds.entity.DataReader)
+ */
+ public void onDataAvailable(DataReader theReader) {
+ System.out.println("**Data available from system: " + theReader.getTopicDescription().getName());
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onSampleRejected(osee.messaging.dds.entity.DataReader, osee.messaging.dds.status.SampleRejectedStatus)
+ */
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onLivelinessChanged(osee.messaging.dds.entity.DataReader, osee.messaging.dds.status.LivelinessChangedStatus)
+ */
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onRequestedDeadlineMissed(osee.messaging.dds.entity.DataReader, osee.messaging.dds.status.RequestedDeadlineMissedStatus)
+ */
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onRequestedIncompatibleQos(osee.messaging.dds.entity.DataReader, osee.messaging.dds.status.RequestedIncompatibleQosStatus)
+ */
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onSubscriptionMatch(osee.messaging.dds.entity.DataReader, osee.messaging.dds.status.SubscriptionMatchStatus)
+ */
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataReaderListener#onSampleLost(osee.messaging.dds.entity.DataReader, osee.messaging.dds.status.SampleLostStatus)
+ */
+ public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataWriterListener#onLivelinessLost(osee.messaging.dds.entity.DataWriter, osee.messaging.dds.status.LivelinessLostStatus)
+ */
+ public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataWriterListener#onOfferedDeadlineMissed(osee.messaging.dds.entity.DataWriter, osee.messaging.dds.status.OfferedDeadlineMissedStatus)
+ */
+ public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataWriterListener#onOfferedIncompatibleQos(osee.messaging.dds.entity.DataWriter, osee.messaging.dds.status.OfferedIncompatibleQosStatus)
+ */
+ public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataWriterListener#onPublicationMatch(osee.messaging.dds.entity.DataWriter, osee.messaging.dds.status.PublicationMatchStatus)
+ */
+ public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DataWriterListener#onDataTaken()
+ */
+ public void onDataSentToMiddleware(DataWriter theWriter) {
+ System.out.println("@@onDataTaken called");
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.listener.DomainParticipantListener#onPublishNotifyMiddleware(osee.messaging.dds.DataStoreItem)
+ */
+ 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 00000000000..be78e9d7428
--- /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 00000000000..35cf987fec2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.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.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 IntMessage intMessage;
+ /**
+ * @param topicDescription
+ * @param subscriber
+ * @param enabled
+ * @param listener
+ * @param parentFactory
+ */
+ 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 {
+
+ public synchronized void onDataAvailable(DataReader theReader) {
+ System.out.println ("onDataAvailable Called for " + theReader.getTopicDescription().getName());
+ }
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) { }
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) { }
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) { }
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) { }
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) { }
+ public void onSampleLost(DataReader theReader, SampleLostStatus status) { }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.entity.DataReader#takeNextSample(osee.messaging.dds.DataSample)
+ */
+ 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 00000000000..e97e30b6338
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.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.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 {
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.TypeSupport#getTypeDataSize()
+ */
+ protected int getTypeDataSize() {
+ return Integer.SIZE/8;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.TypeSupport#getKey()
+ */
+ protected Key getKey() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.TypeSupport#getReaderName()
+ */
+ protected String getReaderName() {
+ return IntMessageReader.class.getCanonicalName();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.TypeSupport#getWriterName()
+ */
+ 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 00000000000..aae17122282
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.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.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 IntegerData buffer;
+ /**
+ * @param topic
+ * @param publisher
+ * @param enabled
+ * @param listener
+ * @param parentFactory
+ */
+ public IntMessageWriter(Topic topic, Publisher publisher, Boolean enabled, DataWriterListener listener, EntityFactory parentFactory) {
+ super(topic, publisher, enabled, listener, parentFactory);
+ buffer = new IntegerData(0);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.entity.DataWriter#write(osee.messaging.dds.Data, osee.messaging.dds.InstanceHandle)
+ */
+ 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 00000000000..68f8a135bd7
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.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.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;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.Data#toByteArray()
+ */
+ 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);
+ }
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.Data#setFromByteArray(byte[])
+ */
+ 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;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see osee.messaging.dds.Data#getKeyValue()
+ */
+ 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 00000000000..b377ff77953
--- /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 00000000000..0726a37860f
--- /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.runtimeManager/.classpath b/org.eclipse.osee.ote.runtimeManager/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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/.project b/org.eclipse.osee.ote.runtimeManager/.project
new file mode 100644
index 00000000000..61c8edd0f21
--- /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/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..833e3a7eed9
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri Apr 03 14:47:49 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 00000000000..62f2b2aad5d
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,4 @@
+#Wed Apr 08 16:55:12 MST 2009
+eclipse.preferences.version=1
+pluginProject.extensions=true
+resolve.requirebundle=false
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 00000000000..1615310fd2b
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: RuntimeManager Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.runtimeManager;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.runtimemanager.RuntimeManager
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.jdt.core,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.server,
+ org.eclipse.osee.framework.ui.plugin.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.workspacebundleloader,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.ote.runtimemanager
+Require-Bundle: org.eclipse.osgi
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
diff --git a/org.eclipse.osee.ote.runtimeManager/build.properties b/org.eclipse.osee.ote.runtimeManager/build.properties
new file mode 100644
index 00000000000..6f20375d6c7
--- /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 00000000000..300833be708
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/plugin.xml
@@ -0,0 +1,32 @@
+<?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>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/BundleInfo.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/BundleInfo.java
new file mode 100644
index 00000000000..8318d017051
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/BundleInfo.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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 byte[] md5Digest;
+
+ /**
+ * @param symbolicName
+ * @param version
+ * @param systemLocation
+ * @throws IOException
+ */
+ 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;
+ }
+
+ /**
+ * @param jarManifest
+ * @return the name of the bundle
+ */
+ public static String generateBundleName(Manifest jarManifest) {
+ String nameEntry = jarManifest.getMainAttributes().getValue("Bundle-SymbolicName");
+
+ // 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;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getSymbolicName() + ":" + getVersion();
+ }
+
+ /**
+ * @return the systemLibrary
+ */
+ public boolean isSystemLibrary() {
+ return systemLibrary;
+ }
+
+ /**
+ * @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;
+ }
+}
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 00000000000..e0e697b61e4
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.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 java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.swt.widgets.Display;
+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() {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Bundle bundle = Platform.getBundle("org.eclipse.osee.ote.runtimeManager");
+ bundle.start();
+ workspaceTracker = new SafeWorkspaceTracker(bundle.getBundleContext());
+ workspaceTracker.open(true);
+ } catch (BundleException ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex.toString(), 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 00000000000..9873682b67a
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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;
+
+/**
+ * @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<String>();
+ this.changedBundles = new HashSet<String>();
+ this.removedBundles = new HashSet<String>();
+ }
+
+ @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<S>(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);
+ }
+
+ /**
+ * @param url
+ * @return
+ * @throws IOException
+ */
+ 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 00000000000..02fd690391d
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.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.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;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class LibJarListener<T extends JarCollectionNature> implements IJarChangeListener<T> {
+
+ private static final boolean VERBOSE_DEBUG = true;
+
+ 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<URL>();
+ this.changedBundles = new HashSet<URL>();
+ this.removedBundles = new HashSet<URL>();
+ }
+
+ @Override
+ public void handleBundleAdded(URL url) {
+ synchronized (bundleSynchronizer) {
+ newBundles.add(url);
+ changedBundles.remove(url);
+ removedBundles.remove(url);
+ }
+ debugEcho(url);
+ }
+
+ @Override
+ public void handleBundleChanged(URL url) {
+ synchronized (bundleSynchronizer) {
+ changedBundles.add(url);
+ newBundles.remove(url);
+ removedBundles.remove(url);
+ }
+ debugEcho(url);
+ }
+
+ @Override
+ public void handleBundleRemoved(URL url) {
+ synchronized (bundleSynchronizer) {
+ removedBundles.add(url);
+ newBundles.remove(url);
+ changedBundles.remove(url);
+ }
+ debugEcho(url);
+ }
+
+ /**
+ * @param 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) {
+ 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<S>(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);
+ }
+
+ /**
+ * @param url
+ * @return
+ * @throws IOException
+ */
+ 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/OteBundleLocator.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteBundleLocator.java
new file mode 100644
index 00000000000..fc563d280a8
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/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.runtimemanager;
+
+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.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 00000000000..584077ff629
--- /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 00000000000..0e3f630eaa0
--- /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/RuntimeManager.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java
new file mode 100644
index 00000000000..51804380c44
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.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.runtimemanager;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ *
+ * @author Robert A. Fisher
+ */
+public class RuntimeManager implements BundleActivator {
+ private static RuntimeManager instance;
+
+ public static RuntimeManager getDefault() {
+ return instance;
+ }
+
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ instance = null;
+ }
+}
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 00000000000..e6970690e61
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.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.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.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarChangeResourceListener;
+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.BundleException;
+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<OteUserLibsNature> userLibResourceListener;
+ private LibJarListener<OteSystemLibsNature> systemLibListener;
+ private LibJarListener<OteUserLibsNature> userLibListener;
+ private ProjectChangeResourceListener projectChangeResourceListener;
+ private RuntimeBundleServer bundleServer;
+ private SafeWorkspaceAccess service;
+ private BundleContext context;
+
+ /**
+ * @param context
+ * @param filter
+ * @param customizer
+ */
+ public SafeWorkspaceTracker(BundleContext context){
+ super(context, SafeWorkspaceAccess.class.getName(), null);
+ this.context = context;
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
+ */
+ @Override
+ public Object addingService(ServiceReference reference) {
+ this.systemLibListener = new LibJarListener<OteSystemLibsNature>();
+ this.userLibListener = new LibJarListener<OteUserLibsNature>();
+ this.systemLibResourceListener = new JarChangeResourceListener<OteSystemLibsNature>(OteSystemLibsNature.NATURE_ID, systemLibListener);
+ this.userLibResourceListener = new JarChangeResourceListener<OteUserLibsNature>(OteUserLibsNature.NATURE_ID, userLibListener);
+ this.projectChangeResourceListener = new ProjectChangeResourceListener();
+ service = (SafeWorkspaceAccess)context.getService(reference);
+ IWorkspace workspace = service.getWorkspace();
+ try {
+ scrapeAllLibs();
+ } catch (CoreException ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex.toString(), ex);
+ } catch (BundleException ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex.toString(), ex);
+ }
+ workspace.addResourceChangeListener(systemLibResourceListener);
+ workspace.addResourceChangeListener(userLibResourceListener);
+
+ this.bundleServer = new RuntimeBundleServer(this);
+
+ context.registerService(OteBundleLocator.class.getName(), this, new Hashtable());
+
+ return super.addingService(reference);
+ }
+
+ private void scrapeAllLibs() throws CoreException, BundleException {
+ 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());
+ }
+ }
+
+ public synchronized void close() {
+ IWorkspace workspace = service.getWorkspace();
+ if(workspace != null){
+ workspace.removeResourceChangeListener(systemLibResourceListener);
+ workspace.removeResourceChangeListener(userLibResourceListener);
+ }
+ 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
+ * @throws IOException
+ * @throws CoreException
+ */
+ 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<String, BundleInfo>();
+ Collection<BundleInfo> runtimeInfos = new LinkedList<BundleInfo>();
+
+ // 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
+ * @throws CoreException
+ */
+ public Collection<URL> getSystemLibUrls() throws CoreException {
+ Collection<URL> libs = new LinkedList<URL>();
+ 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
+ * @throws CoreException
+ */
+ public Collection<URL> getUserLibUrls() throws CoreException {
+ Collection<URL> libs = new LinkedList<URL>();
+ for (OteUserLibsNature userNature : OteUserLibsNature.getWorkspaceProjects()) {
+ libs.addAll(userNature.getBundles());
+ }
+
+ return libs;
+ }
+
+ /**
+ * @param url
+ * @return
+ * @throws IOException
+ */
+ 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.
+ *
+ * @throws CoreException
+ * @throws IOException
+ */
+ public Collection<BundleInfo> consumeModifiedLibs() throws IOException, CoreException {
+ Collection<BundleInfo> modifiedLibs = new LinkedList<BundleInfo>();
+
+ 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<URL>(sysNewBundles.size() + sysChangedBundles.size());
+ sysNewModLibs.addAll(sysNewBundles);
+ sysNewModLibs.addAll(sysChangedBundles);
+
+ Collection<URL> userNewModLibs = new ArrayList<URL>(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 00000000000..76d50e2e430
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.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.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.framework.plugin.core.server.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/internal/ProjectChangeResourceListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java
new file mode 100644
index 00000000000..80d042af5f3
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.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.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) {
+ }
+
+ /**
+ * @param project
+ */
+ 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 00000000000..01c15404664
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.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.runtimemanager.internal;
+
+import java.net.BindException;
+import java.net.InetAddress;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.client.CorePreferences;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.server.ClassServer;
+import org.eclipse.osee.framework.plugin.core.server.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
+ * @param safeWorkspaceTracker
+ *
+ * @param testManager
+ */
+ public RuntimeBundleServer(SafeWorkspaceTracker safeWorkspaceTracker) {
+ try {
+ InetAddress useHostAddress = CorePreferences.getDefaultInetAddress();
+ classServer = new ClassServer(0, InetAddress.getLocalHost()){
+ @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();
+
+ 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 00000000000..57a447081c9
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.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.runtimemanager.internal;
+
+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.framework.plugin.core.server.ResourceFinder;
+import org.eclipse.osee.ote.runtimemanager.BundleInfo;
+import org.eclipse.osee.ote.runtimemanager.SafeWorkspaceTracker;
+
+/**
+ * @author Robert A. Fisher
+ *
+ */
+public class RuntimeLibResourceFinder extends ResourceFinder {
+ private SafeWorkspaceTracker safeWorkspaceTracker;
+
+ /**
+ * @param safeWorkspaceTracker
+ * @param runtimeManager
+ */
+ 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.fileToBytes(info.getFile());
+ }
+ }
+ } catch (CoreException ex) {
+ // TODO
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/.classpath b/org.eclipse.osee.ote.ui.define/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/.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.ui.define/.project b/org.eclipse.osee.ote.ui.define/.project
new file mode 100644
index 00000000000..97c63cfa9bd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui.define</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.define/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.define/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..9d98927681a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/META-INF/MANIFEST.MF
@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE UI Define Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.define;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.define.OteUiDefinePlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.ui.ide,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.ote.define,
+ org.eclipse.osee.ote.ui,
+ org.apache.commons.lang,
+ org.eclipse.core.filesystem,
+ org.eclipse.osee.ote.ui.test.manager,
+ org.eclipse.osee.framework.svn,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.ote.core,
+ org.eclipse.nebula.widgets.xviewer
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.ui.define,
+ org.eclipse.osee.ote.ui.define.dialogs,
+ org.eclipse.osee.ote.ui.define.importer,
+ org.eclipse.osee.ote.ui.define.jobs,
+ org.eclipse.osee.ote.ui.define.panels,
+ org.eclipse.osee.ote.ui.define.reports,
+ org.eclipse.osee.ote.ui.define.reports.output,
+ org.eclipse.osee.ote.ui.define.utilities,
+ org.eclipse.osee.ote.ui.define.viewers,
+ org.eclipse.osee.ote.ui.define.viewers.actions,
+ org.eclipse.osee.ote.ui.define.viewers.data,
+ org.eclipse.osee.ote.ui.define.views
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: com.lowagie.text,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.client.server,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.ui.forms.widgets
diff --git a/org.eclipse.osee.ote.ui.define/build.properties b/org.eclipse.osee.ote.ui.define/build.properties
new file mode 100644
index 00000000000..968006212be
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/build.properties
@@ -0,0 +1,12 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/,\
+ templates/,\
+ help/
+src.includes = META-INF/,\
+ images/,\
+ plugin.xml,\
+ templates/
diff --git a/org.eclipse.osee.ote.ui.define/help/contexts.xml b/org.eclipse.osee.ote.ui.define/help/contexts.xml
new file mode 100644
index 00000000000..1f929a576b7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/help/contexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="testRunView" title="Test Run View">
+ <description>View current and saved test runs.</description>
+ <topic href="help/testRunView.html" label="Test Run View"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.ote.ui.define/help/testRunView.html b/org.eclipse.osee.ote.ui.define/help/testRunView.html
new file mode 100644
index 00000000000..aab128ef4a1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/help/testRunView.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+<h1>Test Run View</h1>
+
+<img src="testrunview.jpg"/>
+
+<p>
+The test run view is used for viewing test run results. It can view a summary of output files that exist on a file system and it will upload those output files to the OSEE data store. It can also be used to view previous test runs that have been uploaded to the OSEE data store.
+</p>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/help/testrunview.jpg b/org.eclipse.osee.ote.ui.define/help/testrunview.jpg
new file mode 100644
index 00000000000..f7fb3967e0b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/help/testrunview.jpg
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/help/testrunview.xcf b/org.eclipse.osee.ote.ui.define/help/testrunview.xcf
new file mode 100644
index 00000000000..75d3f072d17
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/help/testrunview.xcf
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/help/toc.xml b/org.eclipse.osee.ote.ui.define/help/toc.xml
new file mode 100644
index 00000000000..8359ba92cdf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/help/toc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.osee.ote.core/help/toc.xml#tools" label="Mux View">
+ <topic href="help/testRunView.html" label="Test Run View">
+ </topic>
+
+
+</toc> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/images/addition.gif b/org.eclipse.osee.ote.ui.define/images/addition.gif
new file mode 100644
index 00000000000..05a9f5a6832
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/addition.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/childBranch.gif b/org.eclipse.osee.ote.ui.define/images/childBranch.gif
new file mode 100644
index 00000000000..5211f45e5fd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/childBranch.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/chkbox_disabled.gif b/org.eclipse.osee.ote.ui.define/images/chkbox_disabled.gif
new file mode 100644
index 00000000000..7aa131aedb6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/chkbox_disabled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/chkbox_enabled.gif b/org.eclipse.osee.ote.ui.define/images/chkbox_enabled.gif
new file mode 100644
index 00000000000..9cacb96dca9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/chkbox_enabled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/collapseState.gif b/org.eclipse.osee.ote.ui.define/images/collapseState.gif
new file mode 100644
index 00000000000..e38d016fb46
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/collapseState.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/commit.gif b/org.eclipse.osee.ote.ui.define/images/commit.gif
new file mode 100644
index 00000000000..b67692df435
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/commit.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/commit_wiz.png b/org.eclipse.osee.ote.ui.define/images/commit_wiz.png
new file mode 100644
index 00000000000..8c1c2d97d9a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/commit_wiz.png
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/confauto_ov.gif b/org.eclipse.osee.ote.ui.define/images/confauto_ov.gif
new file mode 100644
index 00000000000..e1fd67f06ee
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/confauto_ov.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/delete.gif b/org.eclipse.osee.ote.ui.define/images/delete.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/delete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/deleteAll.gif b/org.eclipse.osee.ote.ui.define/images/deleteAll.gif
new file mode 100644
index 00000000000..28a3785aaca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/deleteAll.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/expandState.gif b/org.eclipse.osee.ote.ui.define/images/expandState.gif
new file mode 100644
index 00000000000..41ab5707b8d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/expandState.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/filter_history.gif b/org.eclipse.osee.ote.ui.define/images/filter_history.gif
new file mode 100644
index 00000000000..6fe6f0e10a1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/filter_history.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/flat_layout.gif b/org.eclipse.osee.ote.ui.define/images/flat_layout.gif
new file mode 100644
index 00000000000..1ef74cf98f4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/flat_layout.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/latest_versions.gif b/org.eclipse.osee.ote.ui.define/images/latest_versions.gif
new file mode 100644
index 00000000000..4fc84e4c3ae
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/latest_versions.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/obstructed.gif b/org.eclipse.osee.ote.ui.define/images/obstructed.gif
new file mode 100644
index 00000000000..3f43a29d901
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/obstructed.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/obstructed_16x16.gif b/org.eclipse.osee.ote.ui.define/images/obstructed_16x16.gif
new file mode 100644
index 00000000000..fd3b845c28d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/obstructed_16x16.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/outfile_import.gif b/org.eclipse.osee.ote.ui.define/images/outfile_import.gif
new file mode 100644
index 00000000000..22fddb030a2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/outfile_import.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/parentBranch.gif b/org.eclipse.osee.ote.ui.define/images/parentBranch.gif
new file mode 100644
index 00000000000..9c4a6755758
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/parentBranch.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/refresh.gif b/org.eclipse.osee.ote.ui.define/images/refresh.gif
new file mode 100644
index 00000000000..a063c230aca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/refresh.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/remove.gif b/org.eclipse.osee.ote.ui.define/images/remove.gif
new file mode 100644
index 00000000000..2cd9c544436
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/remove.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/removeAll.gif b/org.eclipse.osee.ote.ui.define/images/removeAll.gif
new file mode 100644
index 00000000000..28a3785aaca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/removeAll.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/repository.gif b/org.eclipse.osee.ote.ui.define/images/repository.gif
new file mode 100644
index 00000000000..0470e1588d9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/repository.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/switched.gif b/org.eclipse.osee.ote.ui.define/images/switched.gif
new file mode 100644
index 00000000000..288b56c78de
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/switched.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/synch.gif b/org.eclipse.osee.ote.ui.define/images/synch.gif
new file mode 100644
index 00000000000..153fb24506b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/synch.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/testRunView.gif b/org.eclipse.osee.ote.ui.define/images/testRunView.gif
new file mode 100644
index 00000000000..e32b79455ff
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/testRunView.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/tree_layout.gif b/org.eclipse.osee.ote.ui.define/images/tree_layout.gif
new file mode 100644
index 00000000000..234486172ca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/tree_layout.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/images/version_controlled.gif b/org.eclipse.osee.ote.ui.define/images/version_controlled.gif
new file mode 100644
index 00000000000..eb71a3c742e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/images/version_controlled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.define/plugin.xml b/org.eclipse.osee.ote.ui.define/plugin.xml
new file mode 100644
index 00000000000..16874e78ed0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/plugin.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="ITestRunReport" name="ITestRunReport" schema="schema/ITestRunReport.exsd"/>
+ <extension
+ point="org.eclipse.ui.importWizards">
+ <wizard
+ category="org.eclipse.osee.define.import.category"
+ class="org.eclipse.osee.ote.ui.define.importer.OutfileImportWizard"
+ icon="images/outfile_import.gif"
+ id="org.eclipse.osee.ote.ui.define.importer.outfileImportWizard"
+ name="Test Outfiles">
+ </wizard>
+ </extension>
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ id="osee.test.category"
+ name="OSEE Test">
+ </category>
+ <view
+ allowMultiple="false"
+ category="osee.test.category"
+ class="org.eclipse.osee.ote.ui.define.views.TestRunView"
+ icon="images/testRunView.gif"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView"
+ name="Test Run View">
+ </view>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ote.ui.OteNavigateItem">
+ <IOteNavigateItem
+ classname="org.eclipse.osee.ote.ui.define.views.TestRunViewNavigateItem">
+ </IOteNavigateItem>
+ </extension>
+ <extension
+ point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension
+ targetID="org.eclipse.osee.ote.ui.define.views.TestRunView">
+ <viewShortcut
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView">
+ </viewShortcut>
+ </perspectiveExtension>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.skynet.core.HttpServerRequest">
+ <IHttpServerRequest
+ classname="org.eclipse.osee.ote.ui.define.reports.HttpReportRequest">
+ </IHttpServerRequest>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ description="Display test runs grouped by branch"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.flatPresentation.command"
+ name="By Branch">
+ </command>
+ <command
+ description="Displays test runs grouped by script name and revision"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.groupedPresentation.command"
+ name="By Script Revision">
+ </command>
+ <command
+ description="Displays items in long notation"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.longNamesPresentation.command"
+ name="Long">
+ </command>
+ <command
+ description="Displays items in short notation"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.shortNamesPresentation.command"
+ name="Short">
+ </command>
+ <command
+ description="Displays the latest test run of each script."
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.latestOnlyFilterHandler.command"
+ name="Show only the latest run">
+ </command>
+ </extension>
+ <extension
+ name="Test Run View Commands"
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.osee.ote.ui.define.views.handlers.FlatPresentationHandler"
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.flatPresentation.command">
+ </handler>
+ <handler
+ class="org.eclipse.osee.ote.ui.define.views.handlers.GroupedPresentationHandler"
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.groupedPresentation.command">
+ </handler>
+ <handler
+ class="org.eclipse.osee.ote.ui.define.views.handlers.LongNamesPresentationHandler"
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.longNamesPresentation.command">
+ </handler>
+ <handler
+ class="org.eclipse.osee.ote.ui.define.views.handlers.ShortNamesPresentationHandler"
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.shortNamesPresentation.command">
+ </handler>
+ <handler
+ class="org.eclipse.osee.ote.ui.define.views.handlers.ToggleFilterHandler"
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.latestOnlyFilterHandler.command">
+ </handler>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="menu:org.eclipse.osee.ote.ui.define.views.TestRunView">
+ <menu
+ label="Group By">
+ <command
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.groupedPresentation.command"
+ icon="images/tree_layout.gif"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.groupedCommand"
+ style="radio">
+ </command>
+ <command
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.flatPresentation.command"
+ icon="images/flat_layout.gif"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.flatCommand"
+ style="radio">
+ </command>
+ </menu>
+ <menu
+ label="Notation">
+ <command
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.longNamesPresentation.command"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.longNamesCommand"
+ style="radio">
+ </command>
+ <command
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.shortNamesPresentation.command"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.shortNamesCommand"
+ style="radio">
+ </command>
+ </menu>
+ <menu
+ label="Filters">
+ <command
+ commandId="org.eclipse.osee.ote.ui.define.views.TestRunView.latestOnlyFilterHandler.command"
+ icon="images/latest_versions.gif"
+ id="org.eclipse.osee.ote.ui.define.views.TestRunView.latestOnlyFilterCommand"
+ style="toggle">
+ </command>
+ </menu>
+ </menuContribution>
+ </extension>
+ <extension
+ id="org.eclipse.osee.ote.ui.define.reports.HighLevelSummary"
+ name="High Level Test Run Summary"
+ point="org.eclipse.osee.ote.ui.define.ITestRunReport">
+ <ITestRunReport
+ classname="org.eclipse.osee.ote.ui.define.reports.HighLevelSummary"
+ icon="images/latest_versions.gif">
+ </ITestRunReport>
+ </extension>
+ <extension
+ id="org.eclipse.osee.ote.ui.define.reports.HistoricalTestRunData"
+ name="Historical Test Run Report"
+ point="org.eclipse.osee.ote.ui.define.ITestRunReport">
+ <ITestRunReport
+ classname="org.eclipse.osee.ote.ui.define.reports.HistoricalTestRunData"
+ icon="images/latest_versions.gif">
+ </ITestRunReport>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ote.ui.test.manager.AdvancedPageContribution">
+ <AdvancedPageContribution
+ classname="org.eclipse.osee.ote.ui.define.test.manager.TestRunArtifactOptions">
+ </AdvancedPageContribution>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="help/contexts.xml">
+ </contexts>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.define/schema/ITestRunReport.exsd b/org.eclipse.osee.ote.ui.define/schema/ITestRunReport.exsd
new file mode 100644
index 00000000000..4ee6931be3e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/schema/ITestRunReport.exsd
@@ -0,0 +1,115 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.ui.define">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ote.ui.define" id="ITestRunReport" name="ITestRunReport"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="ITestRunReport"/>
+ </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" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="ITestRunReport">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ote.ui.define.reports.ITestRunReport"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string">
+ <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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteDefineImage.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteDefineImage.java
new file mode 100644
index 00000000000..0f7ff643430
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteDefineImage.java
@@ -0,0 +1,28 @@
+package org.eclipse.osee.ote.ui.define;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum OteDefineImage implements OseeImage {
+ TEST_RUN_VIEW("testRunView.gif");
+
+ private final String fileName;
+
+ private OteDefineImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(OteUiDefinePlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ @Override
+ public String getImageKey() {
+ return OteUiDefinePlugin.PLUGIN_ID + ".images." + fileName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteUiDefinePlugin.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteUiDefinePlugin.java
new file mode 100644
index 00000000000..a8ceb10d173
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/OteUiDefinePlugin.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.define;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class OteUiDefinePlugin extends OseeUiActivator {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.define";
+
+ // The shared instance
+ private static OteUiDefinePlugin plugin;
+
+ /*
+ * (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);
+ }
+
+ public static OteUiDefinePlugin getInstance() {
+ return plugin;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/BranchComboDialog.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/BranchComboDialog.java
new file mode 100644
index 00000000000..b467ccd162e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/BranchComboDialog.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.ui.define.dialogs;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.panels.BranchSelectSimpleComposite;
+import org.eclipse.osee.ote.define.TestRunStorageKey;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchComboDialog extends TitleAreaDialog implements Listener {
+ private static final Image TITLE_BAR_IMAGE = OteUiDefinePlugin.getInstance().getImage("childBranch.gif");
+ private static final Image MESSAGE_IMAGE = OteUiDefinePlugin.getInstance().getImage("commit_wiz.png");
+ private static final String MESSAGE_TITLE = "Select a Working Branch";
+ private static final String TITLE_BAR_TEXT = "Working Branch";
+ private static final String MESSAGE = "Select a working branch";
+
+ protected static final int COMBO_HISTORY_LENGTH = 5;
+
+ private BranchSelectSimpleComposite branchSelectComposite;
+
+ private BranchComboDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite content = (Composite) super.createDialogArea(parent);
+
+ branchSelectComposite = BranchSelectSimpleComposite.createWorkingBranchSelectComposite(content, SWT.NONE);
+ restoreWidgetValues();
+ branchSelectComposite.addListener(this);
+ setTitle(MESSAGE_TITLE);
+ setTitleImage(MESSAGE_IMAGE);
+ setMessage(MESSAGE);
+ getShell().setText(TITLE_BAR_TEXT);
+ getShell().setImage(TITLE_BAR_IMAGE);
+
+ return branchSelectComposite;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control toReturn = super.createButtonBar(parent);
+ checkState();
+ return toReturn;
+ }
+
+ public Branch getSelection() {
+ return branchSelectComposite.getSelectedBranch();
+ }
+
+ private boolean isValid() {
+ return getSelection() != null;
+ }
+
+ private void checkState() {
+ getButton(IDialogConstants.OK_ID).setEnabled(isValid());
+ if (isValid() != true) {
+ setErrorMessage("Branch cannot be empty.");
+ } else {
+ setErrorMessage(null);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ @Override
+ protected void okPressed() {
+ saveWidgetValues();
+ super.okPressed();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ checkState();
+ }
+
+ protected void restoreWidgetValues() {
+ IDialogSettings settings = OteUiDefinePlugin.getInstance().getDialogSettings();
+ if (settings != null) {
+ String[] branchIds = settings.getArray(TestRunStorageKey.BRANCH_IDS);
+ String lastSelected = settings.get(TestRunStorageKey.SELECTED_BRANCH_ID);
+ branchSelectComposite.restoreWidgetValues(branchIds, lastSelected);
+ }
+ }
+
+ protected void saveWidgetValues() {
+ IDialogSettings settings = OteUiDefinePlugin.getInstance().getDialogSettings();
+ if (settings != null) {
+ // update source names history
+ String[] branchIds = settings.getArray(TestRunStorageKey.BRANCH_IDS);
+ if (branchIds == null) {
+ branchIds = new String[0];
+ }
+
+ Branch branch = getSelection();
+ try {
+ if (branch != null && branch.hasParentBranch()) {
+ String lastBranchSelected = Integer.toString(branch.getBranchId());
+
+ List<String> history = new ArrayList<String>(Arrays.asList(branchIds));
+ history.remove(lastBranchSelected);
+ history.add(0, lastBranchSelected);
+ if (history.size() > COMBO_HISTORY_LENGTH) {
+ history.remove(COMBO_HISTORY_LENGTH);
+ }
+ branchIds = new String[history.size()];
+ history.toArray(branchIds);
+
+ settings.put(TestRunStorageKey.BRANCH_IDS, branchIds);
+ settings.put(TestRunStorageKey.SELECTED_BRANCH_ID, lastBranchSelected);
+ try {
+ settings.save(this.getClass().getName());
+ } catch (IOException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public static Branch getBranchFromUser() throws OseeCoreException {
+ Branch toReturn = null;
+ BranchComboDialog branchSelection =
+ new BranchComboDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell());
+ int result = branchSelection.open();
+ if (result == Window.OK) {
+ toReturn = branchSelection.getSelection();
+ if (toReturn != null && toReturn.hasParentBranch() == false) {
+ toReturn = null;
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/CommitDialog.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/CommitDialog.java
new file mode 100644
index 00000000000..cc02579b30a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/CommitDialog.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.ui.define.dialogs;
+
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.panels.CommentComposite;
+import org.eclipse.osee.ote.ui.define.panels.IOverrideHandler;
+import org.eclipse.osee.ote.ui.define.panels.SelectionComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.graphics.Image;
+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;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CommitDialog extends TitleAreaDialog {
+
+ private static final Image MESSAGE_IMAGE = OteUiDefinePlugin.getInstance().getImage("commit_wiz.png");
+ private static final Image TITLE_BAR_IMAGE = OteUiDefinePlugin.getInstance().getImage("commit.gif");
+
+ private static final String MESSAGE_TITLE = "Enter a commit comment";
+ private static final String TITLE_BAR_TEXT = "OSEE Commit";
+ private static final String COMMENT_GROUP_TEXT = "Comment";
+ private static final String MESSAGE =
+ "You can specify a comment describing the changes in the area below. " + "Empty comments are allowed, but adding a comment would help others understand your changes. \n";
+ private static final String CONFLICT_MESSAGE =
+ "NOTE: Exclamation marks denote items that already exist in the repository or are missing revision infromation. These items will not be committed. \n";
+
+ private SelectionComposite selectionComposite;
+ private CommentComposite commentComposite;
+ private ITableLabelProvider tableLabelProvider;
+ private Object[] selectable;
+ private Object[] unselectable;
+ private Object[] selected;
+ private String[] columnNames;
+ private IOverrideHandler overrideHandler;
+
+ public CommitDialog(Shell parent, String[] columnNames, ITableLabelProvider tableLabelProvider) {
+ super(parent);
+ setShellStyle(SWT.SHELL_TRIM);
+ this.columnNames = columnNames;
+ this.tableLabelProvider = tableLabelProvider;
+ this.selectable = this.selected = new Object[0];
+ this.overrideHandler = null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createButtonBar(Composite parent) {
+ Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
+ separator.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
+ return super.createButtonBar(parent);
+ }
+
+ /*
+ * @see Dialog#createDialogArea(Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ Composite content = (Composite) super.createDialogArea(parent);
+
+ Composite composite = new Composite(content, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ SashForm sash = new SashForm(composite, SWT.VERTICAL);
+ sash.setLayout(new GridLayout());
+ sash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createCommentArea(sash);
+ createCommitArea(sash);
+ sash.setWeights(new int[] {1, 2});
+
+ setTitle(MESSAGE_TITLE);
+ setTitleImage(MESSAGE_IMAGE);
+ setMessage(MESSAGE + (unselectable != null && unselectable.length > 0 ? CONFLICT_MESSAGE : ""));
+ getShell().setText(TITLE_BAR_TEXT);
+ getShell().setImage(TITLE_BAR_IMAGE);
+ return sash;
+ }
+
+ private void createCommentArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, true));
+
+ Group group = new Group(composite, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText(COMMENT_GROUP_TEXT);
+
+ commentComposite = new CommentComposite(group, SWT.NONE);
+ commentComposite.setLayout(new GridLayout());
+ commentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ Label separator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
+ separator.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
+ }
+
+ private void createCommitArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.verticalSpacing = 0;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ selectionComposite =
+ new SelectionComposite(composite, SWT.BORDER, columnNames, tableLabelProvider, selectable, true, selected,
+ unselectable, overrideHandler);
+ selectionComposite.setLayout(new GridLayout());
+ selectionComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ }
+
+ public void setInput(Object[] input) {
+ this.selectable = input;
+ }
+
+ public void setSelected(Object[] selected) {
+ this.selected = selected;
+ }
+
+ public void setUnSelectable(Object[] unselectable) {
+ this.unselectable = unselectable;
+ }
+
+ public void setOverrideHandler(IOverrideHandler overrideHandler) {
+ this.overrideHandler = overrideHandler;
+ }
+
+ public String getComments() {
+ return commentComposite.getMessage();
+ }
+
+ public Object[] getSelectedResources() {
+ return selectionComposite.getSelectedResources();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/OverrideInvalidScriptRevisions.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/OverrideInvalidScriptRevisions.java
new file mode 100644
index 00000000000..f1ce85d9e41
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/OverrideInvalidScriptRevisions.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.define.dialogs;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.panels.IOverrideHandler;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OverrideInvalidScriptRevisions implements IOverrideHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.panels.IOverrideHandler#getText()
+ */
+ public String getText() {
+ return "Allow Invalid Script Revisions.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.panels.IOverrideHandler#getToolTipText()
+ */
+ public String getToolTipText() {
+ return "Allows invalid script revisions to be committed.\nWARNING: Duplicate commits are not overridable.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.panels.IOverrideHandler#handleEvent(java.util.HashSet)
+ */
+ public Set<Object> getOverridableFromUnselectable(Set<Object> unselectable) throws OseeCoreException {
+ Set<Object> toReturn = new HashSet<Object>();
+ for (Object object : unselectable) {
+ if (object instanceof Artifact) {
+ TestRunOperator operator = new TestRunOperator(((Artifact) object));
+ if (operator.hasNotBeenCommitted() != false) {
+ toReturn.add(object);
+ }
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ReportsDialog.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ReportsDialog.java
new file mode 100644
index 00000000000..341a50b7176
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ReportsDialog.java
@@ -0,0 +1,525 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.dialogs;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+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.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.osee.ote.define.jobs.RemoteResourceRequestJob;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.panels.ListSelectionPanel;
+import org.eclipse.osee.ote.ui.define.panels.PreviewPanel;
+import org.eclipse.osee.ote.ui.define.panels.PreviewPanel.PanelEnum;
+import org.eclipse.osee.ote.ui.define.reports.ExtensionDefinedReports;
+import org.eclipse.osee.ote.ui.define.reports.HttpReportRequest;
+import org.eclipse.osee.ote.ui.define.reports.ITestRunReport;
+import org.eclipse.osee.ote.ui.define.reports.output.OutputFactory;
+import org.eclipse.osee.ote.ui.define.reports.output.OutputFormat;
+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.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.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReportsDialog extends TitleAreaDialog {
+ private static final Image MESSAGE_IMAGE = OteUiDefinePlugin.getInstance().getImage("commit_wiz.png");
+ private static final Image TITLE_BAR_IMAGE = OteUiDefinePlugin.getInstance().getImage("commit.gif");
+
+ private static final String MESSAGE_TITLE = "Select a report";
+ private static final String TITLE_BAR_TEXT = "OSEE Test Run Reports";
+ private static final String MESSAGE = "The preview window displays an example of the selected report.";
+ private static final String REPORT_SELECTION_TITLE = "Select a Report";
+ private static final String PREVIEW_TITLE = "Preview";
+ private static final String FORMAT_TITLE = "Select a Format";
+ private static final String REPORT_DESCRIPTION = "Report Description";
+ private static final String PREVIEW_DESCRIPTION = "Enter Preview Size";
+
+ private static final String REPORT_STORE_ID = ReportsDialog.class.getName() + ".reportId";
+ private static final String FORMAT_STORE_ID = ReportsDialog.class.getName() + ".formatId";
+ private static final String PREVIEW_SIZE_STORE_ID = ReportsDialog.class.getName() + ".previewSize";
+
+ private static final int DEFAULT_PREVIEW_SIZE = 5;
+
+ private PreviewPanel previewPanel;
+ private org.eclipse.osee.ote.ui.define.panels.ListSelectionPanel listSelectionPanel;
+ private SelectionChangedListener selectionChangedListener;
+ private Text descriptionArea;
+ private Text previewSizeArea;
+ private String selectedReportId;
+ private OutputFormat selectedReportFormat;
+ private List<IFile> filesToDelete;
+ private Map<OutputFormat, Button> formatButtons;
+
+ public ReportsDialog(Shell parent) {
+ super(parent);
+ this.filesToDelete = new ArrayList<IFile>();
+ setShellStyle(SWT.SHELL_TRIM);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createButtonBar(Composite parent) {
+ Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
+ separator.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
+ return super.createButtonBar(parent);
+ }
+
+ /*
+ * @see Dialog#createDialogArea(Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ Composite content = (Composite) super.createDialogArea(parent);
+
+ Composite composite = new Composite(content, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setFont(parent.getFont());
+
+ SashForm sash = new SashForm(composite, SWT.HORIZONTAL);
+ sash.setLayout(new GridLayout());
+ sash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ sash.setFont(parent.getFont());
+
+ createReportSelectionArea(sash);
+
+ Composite panel = new Composite(sash, SWT.NONE);
+ GridLayout gL1 = new GridLayout();
+ gL1.marginHeight = 0;
+ gL1.marginWidth = 0;
+ panel.setLayout(gL1);
+ panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ createFormatAndDescriptionArea(panel);
+ createPreviewArea(panel);
+ sash.setWeights(new int[] {1, 2});
+
+ setTitle(MESSAGE_TITLE);
+ setTitleImage(MESSAGE_IMAGE);
+ setMessage(MESSAGE);
+ getShell().setText(TITLE_BAR_TEXT);
+ getShell().setImage(TITLE_BAR_IMAGE);
+ attachListeners();
+ restoreDialog();
+ return sash;
+ }
+
+ private void restoreDialog() {
+ IDialogSettings settings = OteUiDefinePlugin.getInstance().getDialogSettings();
+ if (settings != null) {
+ String reportSelected = settings.get(REPORT_STORE_ID);
+ String format = settings.get(FORMAT_STORE_ID);
+
+ int value = 0;
+ try {
+ value = settings.getInt(PREVIEW_SIZE_STORE_ID);
+ } catch (Exception ex) {
+ value = DEFAULT_PREVIEW_SIZE;
+ }
+ clamp(previewSizeArea, value);
+
+ OutputFormat outputFormat = OutputFormat.HTML;
+ int index = 0;
+ if (Strings.isValid(reportSelected) && Strings.isValid(format)) {
+ Pair<String, String> pair = ExtensionDefinedReports.getInstance().getIdAndName(reportSelected);
+ index = listSelectionPanel.indexOf(pair);
+ outputFormat = OutputFormat.fromString(format);
+ }
+ if (index > -1) {
+ listSelectionPanel.setSelection(index);
+ }
+ setReportFormat(outputFormat);
+ for (OutputFormat key : formatButtons.keySet()) {
+ Button button = formatButtons.get(key);
+ button.setSelection(key.equals(outputFormat));
+ }
+ }
+ }
+
+ private void saveDialog() {
+ IDialogSettings settings = OteUiDefinePlugin.getInstance().getDialogSettings();
+ if (settings != null) {
+ String reportSelected = getReportSelected();
+ String format = getReportFormat();
+ int previewSize = getPreviewSize();
+ settings.put(REPORT_STORE_ID, reportSelected);
+ settings.put(FORMAT_STORE_ID, format);
+ settings.put(PREVIEW_SIZE_STORE_ID, previewSize);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ @Override
+ protected void okPressed() {
+ saveDialog();
+ cleanUp(filesToDelete);
+ super.okPressed();
+ }
+
+ private void createReportSelectionArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setFont(parent.getFont());
+ composite.setText(REPORT_SELECTION_TITLE);
+
+ listSelectionPanel = new ListSelectionPanel(composite, SWT.NONE, 300, 300, new ListLabelProvider());
+ listSelectionPanel.setSorter(new ViewerSorter() {
+
+ @SuppressWarnings("unchecked")
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ Pair<String, String> pair1 = (Pair<String, String>) o1;
+ Pair<String, String> pair2 = (Pair<String, String>) o2;
+ return getComparator().compare(pair1.getValue(), pair2.getValue());
+ }
+
+ });
+ Pair<String, String>[] reportNames = ExtensionDefinedReports.getInstance().getIdsAndNames();
+ listSelectionPanel.setInput(reportNames);
+ listSelectionPanel.setSelection(0);
+ }
+
+ private void createFormatAndDescriptionArea(Composite parent) {
+ Composite composite = new Composite(parent, 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, true, false));
+ createFormatArea(composite);
+
+ Composite panel = new Composite(composite, SWT.NONE);
+ GridLayout gL1 = new GridLayout();
+ gL1.marginHeight = 0;
+ gL1.marginWidth = 0;
+ panel.setLayout(gL1);
+ panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ createDescriptionArea(panel);
+ createPreviewSizeArea(panel);
+ }
+
+ private void createPreviewSizeArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setFont(parent.getFont());
+ group.setText(PREVIEW_DESCRIPTION);
+
+ previewSizeArea = new Text(group, SWT.SINGLE | SWT.BORDER);
+ previewSizeArea.setTextLimit(2);
+ GridData gd = new GridData(SWT.RIGHT, SWT.FILL, false, false);
+ gd.heightHint = convertHeightInCharsToPixels(1);
+ gd.widthHint = convertWidthInCharsToPixels(4);
+ previewSizeArea.setLayoutData(gd);
+ new Widgets.IntegerTextEntryHandler(previewSizeArea, false, 2) {
+ @Override
+ public void applyValue(long value) {
+ clamp(previewSizeArea, value);
+ }
+ };
+
+ Label label = new Label(group, SWT.NONE);
+ label.setText("[ 0-10 ]");
+ label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ }
+
+ private void clamp(Text text, long value) {
+ if (value < 0) {
+ previewSizeArea.setText(Integer.toString(0));
+ }
+ if (value > 10) {
+ previewSizeArea.setText(Integer.toString(10));
+ }
+ }
+
+ private void createDescriptionArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setFont(parent.getFont());
+ group.setText(REPORT_DESCRIPTION);
+
+ descriptionArea = new Text(group, SWT.WRAP | SWT.MULTI);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
+ gd.heightHint = 100;
+ gd.widthHint = 100;
+ descriptionArea.setLayoutData(gd);
+ descriptionArea.setEditable(false);
+ }
+
+ private void createFormatArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+ group.setFont(parent.getFont());
+ group.setText(FORMAT_TITLE);
+
+ this.formatButtons = new HashMap<OutputFormat, Button>();
+ for (OutputFormat format : OutputFormat.values()) {
+ Button button = new Button(group, SWT.RADIO);
+ button.setText(format.name());
+ button.setData(format);
+ if (format.equals(OutputFormat.HTML)) {
+ button.setSelection(true);
+ }
+ button.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ Button button = (Button) e.getSource();
+ if (button.getSelection() != false) {
+ setReportFormat((OutputFormat) button.getData());
+ }
+ }
+ });
+ formatButtons.put(format, button);
+ }
+ }
+
+ private void createPreviewArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setFont(parent.getFont());
+ group.setText(PREVIEW_TITLE);
+ previewPanel = new PreviewPanel(group, SWT.NONE);
+ }
+
+ private void attachListeners() {
+ listSelectionPanel.addDoubleClickListener(new IDoubleClickListener() {
+ @SuppressWarnings("unchecked")
+ public void doubleClick(DoubleClickEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ if (selection != null) {
+ Pair<String, String> item = (Pair<String, String>) selection.getFirstElement();
+ if (item != null) {
+ selectedReportId = item.getKey();
+ }
+ }
+ okPressed();
+ }
+ });
+
+ selectionChangedListener = new SelectionChangedListener();
+ listSelectionPanel.addSelectionChangedListener(selectionChangedListener);
+ }
+
+ public String getReportSelected() {
+ return selectedReportId;
+ }
+
+ public String getReportFormat() {
+ return selectedReportFormat.name();
+ }
+
+ private void setReportFormat(OutputFormat reportFormat) {
+ this.selectedReportFormat = reportFormat;
+ selectionChangedListener.selectionChanged(null);
+ }
+
+ private PanelEnum asPanelEnum(OutputFormat format) {
+ PanelEnum toReturn = PanelEnum.DEFAULT;
+ switch (format) {
+ case HTML:
+ case PDF:
+ case EXCEL:
+ case RTF:
+ toReturn = PanelEnum.BROWSER;
+ break;
+ default:
+ toReturn = PanelEnum.DEFAULT;
+ break;
+ }
+ return toReturn;
+ }
+
+ private void updatePanel(final PanelEnum panelId, final URI uri, final String description, final List<IFile> oldIFiles) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ previewPanel.updatePreview(panelId, uri);
+ previewPanel.setDisplay(panelId);
+ descriptionArea.setText(description);
+ }
+ });
+ cleanUp(oldIFiles);
+ }
+
+ private int getPreviewSize() {
+ int toReturn = DEFAULT_PREVIEW_SIZE;
+ String value = previewSizeArea.getText();
+ try {
+ toReturn = Integer.parseInt(value);
+ } catch (Exception ex) {
+ toReturn = DEFAULT_PREVIEW_SIZE;
+ updatePreviewSizeValue(toReturn);
+ }
+ return toReturn;
+ }
+
+ private void updatePreviewSizeValue(final int value) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ previewSizeArea.setText(Integer.toString(value));
+ }
+ });
+ }
+
+ private void generatePreview(final OutputFormat outputFormat, final String reportId, final ITestRunReport report) throws URISyntaxException, OseeStateException {
+ String urlRequest = HttpReportRequest.getUrl(reportId, outputFormat.name(), "local", getPreviewSize());
+ String fileName = OutputFactory.getOutputFilename(outputFormat, reportId);
+ switch (outputFormat) {
+ case HTML:
+ updatePanel(asPanelEnum(outputFormat), new URI(urlRequest), report.getDescription(), filesToDelete);
+ break;
+ default:
+ remoteFileToLocal(outputFormat, urlRequest, fileName, report);
+ break;
+ }
+ }
+
+ private void remoteFileToLocal(final OutputFormat outputFormat, final String urlRequest, final String fileName, final ITestRunReport report) {
+ RemoteResourceRequestJob requestJob = new RemoteResourceRequestJob(urlRequest, fileName);
+ requestJob.addJobChangeListener(new PreviewUpdateJobChangeListener(report, outputFormat));
+ requestJob.getDownloadedFile();
+ requestJob.schedule();
+ }
+
+ private final class SelectionChangedListener implements ISelectionChangedListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ @SuppressWarnings("unchecked")
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = listSelectionPanel.getSelection();
+ if (selection != null) {
+ Pair<String, String> item = (Pair<String, String>) selection.getFirstElement();
+ if (item != null) {
+ ITestRunReport report = ExtensionDefinedReports.getInstance().getReportGenerator(item.getKey());
+ if (report != null) {
+ selectedReportId = item.getKey();
+ try {
+ generatePreview(selectedReportFormat, selectedReportId, report);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private final class ListLabelProvider extends LabelProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public Image getImage(Object element) {
+ Image toReturn = null;
+ if (element instanceof Pair) {
+ toReturn = ExtensionDefinedReports.getInstance().getImage(((Pair<String, String>) element).getKey());
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public String getText(Object element) {
+ if (element instanceof Pair) {
+ return ((Pair<String, String>) element).getValue();
+ }
+ return super.getText(element);
+ }
+ }
+
+ private final class PreviewUpdateJobChangeListener extends JobChangeAdapter {
+ private ITestRunReport report;
+ private OutputFormat format;
+
+ private PreviewUpdateJobChangeListener(ITestRunReport report, OutputFormat format) {
+ this.report = report;
+ this.format = format;
+ }
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ IStatus status = event.getResult();
+ if (status.equals(Status.OK_STATUS) || status.getCode() == Status.OK) {
+ IFile iFile = ((RemoteResourceRequestJob) event.getJob()).getDownloadedFile();
+ if (iFile != null) {
+ updatePanel(asPanelEnum(format), iFile.getLocationURI(), report.getDescription(), filesToDelete);
+ filesToDelete.add(iFile);
+ }
+ }
+ }
+ }
+
+ private void cleanUp(final List<IFile> iFiles) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ for (IFile iFile : iFiles) {
+ if (iFile != null && iFile.exists()) {
+ try {
+ iFile.delete(true, new NullProgressMonitor());
+ filesToDelete.remove(iFile);
+ } catch (CoreException ex) {
+ // Do Nothing
+ }
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ResourceSelectionDialog.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ResourceSelectionDialog.java
new file mode 100644
index 00000000000..9e0da0306fe
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/dialogs/ResourceSelectionDialog.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.define.dialogs;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+
+public class ResourceSelectionDialog extends CheckedTreeSelectionDialog {
+
+ public ResourceSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
+ super(parent, labelProvider, contentProvider);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ applyDialogFont(composite);
+
+ Label messageLabel = createMessageArea(composite);
+ CheckboxTreeViewer treeViewer = createTreeViewer(composite);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.widthHint = convertWidthInCharsToPixels(80);
+ data.heightHint = convertHeightInCharsToPixels(16);
+ Tree treeWidget = treeViewer.getTree();
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ boolean wasChecked = event.getChecked();
+ CheckboxTreeViewer viewer = getTreeViewer();
+ TreeItem[] items = viewer.getTree().getItems();
+ for (int i = 0; i < items.length; i++) {
+ viewer.setSubtreeChecked(items[i], false);
+ }
+ event.getCheckable().setChecked(event.getElement(), wasChecked);
+ }
+
+ });
+ treeWidget.setLayoutData(data);
+ treeWidget.setFont(parent.getFont());
+ messageLabel.setEnabled(true);
+ treeWidget.setEnabled(true);
+ return composite;
+ }
+};
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/ImportOutfileUIOperation.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/ImportOutfileUIOperation.java
new file mode 100644
index 00000000000..e0852ff11ca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/ImportOutfileUIOperation.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.ui.define.importer;
+
+import java.net.URI;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.ote.define.jobs.FindCommitableJob;
+import org.eclipse.osee.ote.define.jobs.OutfileToArtifactJob;
+import org.eclipse.osee.ote.ui.define.jobs.CommitTestRunJob;
+import org.eclipse.osee.ote.ui.define.jobs.ReportErrorsJob;
+import org.eclipse.osee.ote.ui.define.utilities.CommitConfiguration;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ImportOutfileUIOperation {
+
+ private URI[] fileSystemObjects;
+ private Branch selectedBranch;
+
+ public ImportOutfileUIOperation(Branch selectedBranch, URI... fileSystemObjects) {
+ this.fileSystemObjects = fileSystemObjects;
+ this.selectedBranch = selectedBranch;
+ }
+
+ public boolean execute() {
+ boolean toReturn = true;
+ if (fileSystemObjects.length > 0) {
+ launchImportJob();
+ } else {
+ toReturn = false;
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MessageDialog.openInformation(shell, "Information", "There were no resources currently selected for import.");
+ }
+ return toReturn;
+ }
+
+ private void launchImportJob() {
+ OutfileToArtifactJob convertJob = new OutfileToArtifactJob(selectedBranch, fileSystemObjects);
+ convertJob.addJobChangeListener(new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (wasJobSuccessful(event)) {
+ OutfileToArtifactJob job = (OutfileToArtifactJob) event.getJob();
+
+ URI[] itemsWithError = job.getUnparseableFiles();
+ Artifact[] artifacts = job.getResults();
+ // Report Parse Errors
+ if (itemsWithError.length > 0) {
+ reportFilesWithErrors(itemsWithError, artifacts);
+ } else {
+ launchFindCommitableJob(artifacts);
+ }
+ }
+ }
+ });
+ convertJob.schedule();
+ }
+
+ private void launchCommitJob(final FindCommitableJob job) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ CommitTestRunJob newJob =
+ new CommitTestRunJob(job.getAll(), job.getCommitAllowed(), job.getCommitNotAllowed(),
+ CommitConfiguration.isCommitOverrideAllowed());
+ newJob.schedule();
+ }
+ });
+ }
+
+ private void launchFindCommitableJob(final Artifact[] artifacts) {
+ // Find Commit Allowed
+ FindCommitableJob commitableJob = new FindCommitableJob(artifacts);
+ commitableJob.addJobChangeListener(new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (wasJobSuccessful(event)) {
+ FindCommitableJob job = (FindCommitableJob) event.getJob();
+ launchCommitJob(job);
+ }
+ }
+ });
+ commitableJob.schedule();
+ }
+
+ private void reportFilesWithErrors(final Object[] items, final Artifact[] artifacts) {
+ String title = "Outfile Import Error";
+ String message = "The following file(s) had errors during the parsing operation: ";
+
+ JobChangeAdapter listener = new JobChangeAdapter() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+ */
+ @Override
+ public void done(IJobChangeEvent event) {
+ launchFindCommitableJob(artifacts);
+ }
+ };
+
+ ReportErrorsJob.openError(title, message, listener, items);
+ }
+
+ private boolean wasJobSuccessful(IJobChangeEvent event) {
+ IStatus status = event.getResult();
+ return status.equals(Status.OK_STATUS) || status.equals(Status.OK);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportPage.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportPage.java
new file mode 100644
index 00000000000..f069d8b5c41
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportPage.java
@@ -0,0 +1,386 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.importer;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
+import org.eclipse.osee.framework.ui.skynet.widgets.XBranchSelectWidget;
+import org.eclipse.osee.ote.define.TestRunStorageKey;
+import org.eclipse.osee.ote.define.utilities.OutfileParserExtensionManager;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+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.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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
+import org.eclipse.ui.dialogs.WizardDataTransferPage;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutfileImportPage extends WizardDataTransferPage {
+ private static final String PAGE_NAME = "Outfile Import";
+
+ private CheckboxTreeViewer treeViewer;
+ private final IStructuredSelection startingResourceSelection;
+ private final boolean treeSelectionMode;
+ private final ITreeContentProvider contentProvider;
+ private final ILabelProvider labelProvider;
+ private final List<ViewerFilter> filters;
+ private final Object treeInput;
+ private XBranchSelectWidget branchSelect;
+
+ /**
+ * @param pageName
+ */
+ protected OutfileImportPage(IStructuredSelection selection) {
+ super(PAGE_NAME);
+ this.treeInput = ResourcesPlugin.getWorkspace().getRoot();
+ this.treeSelectionMode = true;
+ this.contentProvider = new WorkbenchContentProvider();
+ this.labelProvider = new WorkbenchLabelProvider();
+ this.filters = new ArrayList<ViewerFilter>();
+ // this.filters.add(new FileFilter());
+ this.startingResourceSelection = selection;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.WizardDataTransferPage#allowNewContainerName()
+ */
+ @Override
+ protected boolean allowNewContainerName() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ public void handleEvent(Event event) {
+ updateWidgetEnablements();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+ composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ composite.setFont(parent.getFont());
+
+ Group group = new Group(composite, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText("Select a Branch to import files into");
+ group.setToolTipText("Opens the branch selection dialog");
+ branchSelect = new XBranchSelectWidget("branch");
+ branchSelect.createWidgets(group, SWT.BORDER | SWT.READ_ONLY);
+
+ createFileSelectArea(composite);
+
+ restoreWidgetValues();
+ updateWidgetEnablements();
+ setErrorMessage(null); // should not initially have error message
+ setControl(composite);
+ }
+
+ private void createFileSelectArea(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ group.setLayout(layout);
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ group.setText("Select Files");
+ group.setToolTipText("Select files to import");
+
+ Composite composite = new Composite(group, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ composite.setFont(parent.getFont());
+
+ if (treeSelectionMode) {
+ treeViewer = new ContainerCheckedTreeViewer(composite, SWT.BORDER);
+ } else {
+ treeViewer = new CheckboxTreeViewer(composite, SWT.BORDER);
+ }
+
+ treeViewer.setContentProvider(contentProvider);
+ treeViewer.setLabelProvider(labelProvider);
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ setPageComplete(determinePageCompletion());
+ }
+ });
+ if (filters != null) {
+ for (int i = 0; i != filters.size(); i++) {
+ treeViewer.addFilter(filters.get(i));
+ }
+ }
+ treeViewer.setInput(treeInput);
+
+ Tree treeWidget = treeViewer.getTree();
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ data.widthHint = convertWidthInCharsToPixels(80);
+ data.heightHint = convertHeightInCharsToPixels(16);
+ treeWidget.setLayout(new GridLayout());
+ treeWidget.setLayoutData(data);
+ treeWidget.setFont(composite.getFont());
+ treeWidget.setEnabled(true);
+
+ createSelectionButtons(composite);
+ }
+
+ private Button createButton(Composite parent, int id, String label, boolean defaultButton) {
+ // increment the number of columns in the button bar
+ ((GridLayout) parent.getLayout()).numColumns++;
+ Button button = new Button(parent, SWT.PUSH);
+ button.setText(label);
+ button.setFont(JFaceResources.getDialogFont());
+ button.setData(new Integer(id));
+ setButtonLayoutData(button);
+ return button;
+ }
+
+ private Composite createSelectionButtons(Composite composite) {
+ Composite buttonComposite = new Composite(composite, SWT.RIGHT);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ buttonComposite.setLayout(layout);
+ buttonComposite.setFont(composite.getFont());
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
+ data.grabExcessHorizontalSpace = true;
+ composite.setData(data);
+ Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, "Select All", false);
+ SelectionListener listener = new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object[] viewerElements = contentProvider.getElements(treeInput);
+ if (treeSelectionMode) {
+ treeViewer.setCheckedElements(viewerElements);
+ } else {
+ for (int i = 0; i < viewerElements.length; i++) {
+ treeViewer.setSubtreeChecked(viewerElements[i], true);
+ }
+ }
+ updateWidgetEnablements();
+ }
+ };
+ selectButton.addSelectionListener(listener);
+ Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, "Deselect All", false);
+ listener = new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.setCheckedElements(new Object[0]);
+ updateWidgetEnablements();
+ }
+ };
+ deselectButton.addSelectionListener(listener);
+ return buttonComposite;
+ }
+
+ @Override
+ protected void restoreWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ String lastSelected = settings.get(TestRunStorageKey.SELECTED_BRANCH_ID);
+ try {
+ branchSelect.setBranch(BranchManager.getBranch(Integer.parseInt(lastSelected)));
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ onStartSelectedResource();
+ }
+
+ private void onStartSelectedResource() {
+ if (startingResourceSelection != null) {
+ if (startingResourceSelection.size() > 0) {
+ for (Object firstElement : startingResourceSelection.toArray()) {
+ if (firstElement instanceof IAdaptable) {
+ Object resource = ((IAdaptable) firstElement).getAdapter(IResource.class);
+ if (resource != null) {
+ IResource currentResource = (IResource) resource;
+ if (currentResource.getType() == IResource.FILE) {
+ IResource parentResource = currentResource.getParent();
+ if (parentResource != null && parentResource.isAccessible() != false) {
+ treeViewer.expandToLevel(parentResource, IResource.DEPTH_ONE);
+ treeViewer.setChecked(currentResource, true);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected boolean validateSourceGroup() {
+ boolean toReturn = super.validateSourceGroup();
+ URI[] selectedResources = getSelectedResources();
+ if (selectedResources.length == 0) {
+ setMessage(null);
+ setErrorMessage("There are no resources currently selected for import.");
+ toReturn &= false;
+ }
+ return toReturn;
+ }
+
+ @Override
+ protected boolean validateDestinationGroup() {
+ boolean toReturn = super.validateDestinationGroup();
+ Branch branch = branchSelect.getData();
+ try {
+ if (branch == null) {
+ setMessage(null);
+ setErrorMessage("Please select a working branch. Cannot import into a null branch.");
+ toReturn &= false;
+ } else if (!branch.hasParentBranch()) {
+ setMessage(null);
+ setErrorMessage("Please select a working branch. Cannot import into a top-level branch.");
+ toReturn &= false;
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ return toReturn;
+ }
+
+ @Override
+ protected void updateWidgetEnablements() {
+ boolean pageComplete = determinePageCompletion();
+ setPageComplete(pageComplete);
+ if (pageComplete) {
+ setMessage(null);
+ }
+ super.updateWidgetEnablements();
+ }
+
+ @Override
+ protected void saveWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ // update source names history
+ String[] branchIds = settings.getArray(TestRunStorageKey.BRANCH_IDS);
+ if (branchIds == null) {
+ branchIds = new String[0];
+ }
+
+ Branch branch = branchSelect.getData();
+ try {
+ if (branch != null && branch.hasParentBranch() != false) {
+ String lastBranchSelected = Integer.toString(branch.getBranchId());
+ branchIds = addToHistory(branchIds, lastBranchSelected);
+
+ settings.put(TestRunStorageKey.BRANCH_IDS, branchIds);
+ settings.put(TestRunStorageKey.SELECTED_BRANCH_ID, lastBranchSelected);
+ try {
+ settings.save(this.getClass().getName());
+ } catch (IOException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ private URI[] getSelectedResources() {
+ Object[] selected = treeViewer.getCheckedElements();
+ List<URI> selectedResources = new ArrayList<URI>();
+ for (Object object : selected) {
+ if (object instanceof IFile) {
+ IFile iFile = (IFile) object;
+ selectedResources.add(iFile.getLocationURI());
+ }
+ }
+ return selectedResources.toArray(new URI[selectedResources.size()]);
+ }
+
+ public boolean finish() {
+ saveWidgetValues();
+ return new ImportOutfileUIOperation(branchSelect.getData(), getSelectedResources()).execute();
+ }
+
+ private final static class FileFilter extends ViewerFilter {
+
+ private static final String BIN_EXTENSION = "bin";
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (element instanceof IProject) {
+ if (((IProject) element).isOpen()) {
+ return true;
+ }
+ } else if (element instanceof IContainer) {
+ IContainer container = (IContainer) element;
+ String name = container.getName();
+ if (!name.startsWith(".") && !name.equals(BIN_EXTENSION)) {
+ return true;
+ }
+ } else if (element instanceof IFile) {
+ IFile aFile = (IFile) element;
+ String currentExtension = aFile.getFileExtension();
+ try {
+ for (String value : OutfileParserExtensionManager.getInstance().getSupportedExtensions()) {
+ if (currentExtension.equalsIgnoreCase(value)) {
+ return true;
+ }
+ }
+ } catch (Exception ex) {
+ // Do Nothing
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportWizard.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportWizard.java
new file mode 100644
index 00000000000..4556de99877
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/importer/OutfileImportWizard.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.ui.define.importer;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutfileImportWizard extends Wizard implements IImportWizard {
+ private static final String TITLE = "Import outfiles into Define";
+ private static final ImageDescriptor WIZARD_IMAGE =
+ OteUiDefinePlugin.getInstance().getImageDescriptor("commit_wiz.png");
+ private OutfileImportPage mainPage;
+
+ public OutfileImportWizard() {
+ super();
+ setDialogSettings(OteUiDefinePlugin.getInstance().getDialogSettings());
+ setWindowTitle("Outfile Import Wizard");
+ setDefaultPageImageDescriptor(WIZARD_IMAGE);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.wizard.Wizard#performFinish()
+ */
+ @Override
+ public boolean performFinish() {
+ return mainPage.finish();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.mainPage = new OutfileImportPage(selection);
+ mainPage.setTitle(TITLE);
+ mainPage.setDescription("Import artifacts into Define");
+ addPage(mainPage);
+ }
+
+ @Override
+ public IWizardPage getNextPage(IWizardPage page) {
+ return null;
+ }
+
+ @Override
+ public IWizardPage getPreviousPage(IWizardPage page) {
+ return null;
+ }
+
+ @Override
+ public boolean canFinish() {
+ return mainPage.isPageComplete();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/AddArtifactsToViewerJob.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/AddArtifactsToViewerJob.java
new file mode 100644
index 00000000000..13ab3bb2891
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/AddArtifactsToViewerJob.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.ui.define.jobs;
+
+import java.util.List;
+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.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.viewers.XViewerDataManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AddArtifactsToViewerJob extends Job {
+ private static final String JOB_NAME = "Adding Artifacts to Table";
+ private final List<Artifact> artifacts;
+ private final XViewerDataManager viewerDataManager;
+
+ public AddArtifactsToViewerJob(XViewerDataManager viewerDataManager, final List<Artifact> artifacts) {
+ super(JOB_NAME);
+ this.artifacts = artifacts;
+ this.viewerDataManager = viewerDataManager;
+ setUser(true);
+ setPriority(Job.LONG);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ monitor.beginTask(getName(), artifacts.size());
+ try {
+ viewerDataManager.addArtifacts(monitor, artifacts);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ return new Status(Status.ERROR, OteUiDefinePlugin.PLUGIN_ID, -1, ex.getMessage(), ex);
+ }
+ if (monitor.isCanceled() != true) {
+ toReturn = Status.OK_STATUS;
+ }
+ monitor.done();
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitJobDialog.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitJobDialog.java
new file mode 100644
index 00000000000..db6acd1e910
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitJobDialog.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.jobs;
+
+import java.util.Arrays;
+import java.util.HashSet;
+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.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.dialogs.CommitDialog;
+import org.eclipse.osee.ote.ui.define.dialogs.OverrideInvalidScriptRevisions;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+class CommitJobDialog extends UIJob {
+ private static final Image CHILD_BRANCH_IMAGE = OteUiDefinePlugin.getInstance().getImage("childBranch.gif");
+
+ private static String JOB_NAME = "Commit Test Run";
+ private String message;
+ private Object[] items;
+
+ private Artifact[] allItems;
+ private Artifact[] preSelected;
+ private Artifact[] unselectable;
+ private boolean isOverrideAllowed;
+
+ public CommitJobDialog(Artifact[] allitems, Artifact[] preSelected, boolean isOverrideAllowed) {
+ this(allitems, preSelected, null, isOverrideAllowed);
+ }
+
+ public CommitJobDialog(Artifact[] allitems, Artifact[] preSelected, Artifact[] unselectable, boolean isOverrideAllowed) {
+ super(JOB_NAME);
+ this.allItems = allitems;
+ this.preSelected = preSelected;
+ this.unselectable = unselectable;
+ setUser(false);
+ setPriority(Job.LONG);
+ if (unselectable == null) {
+ unselectable = new Artifact[0];
+ }
+ this.isOverrideAllowed = isOverrideAllowed;
+ this.message = null;
+ this.items = null;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public Object[] getSelected() {
+ return items;
+ }
+
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ monitor.setTaskName(getName());
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ CommitDialog dialog = new CommitDialog(shell, CommitColumnEnum.toStringArray(), new TestRunTableLabelProvider());
+ dialog.setBlockOnOpen(true);
+ dialog.setInput(allItems);
+ dialog.setUnSelectable(unselectable);
+ dialog.setSelected(preSelected);
+ if (isOverrideAllowed != false) {
+ dialog.setOverrideHandler(new OverrideInvalidScriptRevisions());
+ }
+ int result = dialog.open();
+ if (result == Window.OK) {
+ message = dialog.getComments();
+ items = dialog.getSelectedResources();
+ toReturn = Status.OK_STATUS;
+ }
+ return toReturn;
+ }
+
+ private enum CommitColumnEnum {
+
+ Branch, Name, Id, Outfile;
+
+ public static String[] toStringArray() {
+
+ CommitColumnEnum[] cols = CommitColumnEnum.values();
+ String[] toReturn = new String[cols.length];
+ for (int index = 0; index < cols.length; index++) {
+ toReturn[index] = cols[index].name();
+ }
+ return toReturn;
+ }
+ }
+
+ private final class TestRunTableLabelProvider extends BaseLabelProvider implements ITableLabelProvider {
+ private HashSet<Object> unselectableItems = new HashSet<Object>();
+ private final int DUMMY_COLUMNS = 1;
+
+ public TestRunTableLabelProvider() {
+ if (unselectable != null) {
+ this.unselectableItems.addAll(Arrays.asList(unselectable));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ Image toReturn = null;
+ if (columnIndex >= DUMMY_COLUMNS) {
+ CommitColumnEnum column = CommitColumnEnum.values()[columnIndex - DUMMY_COLUMNS];
+ switch (column) {
+ case Branch:
+ toReturn = CHILD_BRANCH_IMAGE;
+ break;
+ default:
+ break;
+ }
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ String toReturn = "";
+ if (columnIndex >= DUMMY_COLUMNS) {
+ if (element instanceof Artifact) {
+ Artifact artifact = (Artifact) element;
+ if (artifact != null && artifact.isDeleted() != true) {
+ CommitColumnEnum column = CommitColumnEnum.values()[columnIndex - DUMMY_COLUMNS];
+ switch (column) {
+ case Branch:
+ toReturn = artifact.getBranch().getBranchName();
+ break;
+ case Id:
+ try {
+ toReturn = new TestRunOperator(artifact).getChecksum();
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, "Error getting Checksum", ex);
+ }
+ break;
+ case Name:
+ toReturn = artifact.getDescriptiveName();
+ break;
+ case Outfile:
+ try {
+ toReturn = new TestRunOperator(artifact).getOutfileAttribute().getDisplayableString();
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, "Error getting Outfile", ex);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitTestRunJob.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitTestRunJob.java
new file mode 100644
index 00000000000..55f7a93b479
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/CommitTestRunJob.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.jobs;
+
+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.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.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.define.operations.ImportOutfileOperation;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CommitTestRunJob extends Job {
+
+ private static final String JOB_NAME = "Commit Test Runs";
+
+ private CommitJobDialog jobDialog;
+ private Artifact[] committed;
+
+ public CommitTestRunJob(Artifact[] allitems, Artifact[] preSelected, boolean isOverrideAllowed) {
+ this(allitems, preSelected, null, isOverrideAllowed);
+ }
+
+ public CommitTestRunJob(Artifact[] allitems, Artifact[] preSelected, Artifact[] unselectable, boolean isOverrideAllowed) {
+ super(JOB_NAME);
+ jobDialog = new CommitJobDialog(allitems, preSelected, unselectable, isOverrideAllowed);
+ }
+
+ public Artifact[] getCommitted() {
+ return committed;
+ }
+
+ protected IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ jobDialog.schedule();
+ try {
+ jobDialog.join();
+ } catch (InterruptedException ex1) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex1.toString(), ex1);
+ }
+
+ toReturn = jobDialog.getResult();
+ if (toReturn.getSeverity() == IStatus.OK) {
+ Object[] items = jobDialog.getSelected();
+ String comment = jobDialog.getMessage();
+ monitor.beginTask("Commit Artifacts", items.length * 2);
+ try {
+ commitSelectedArtifacts(monitor, comment, items);
+ toReturn = Status.OK_STATUS;
+ committed = verifyItemsCommitted(monitor, items);
+ } catch (Exception ex) {
+ if (monitor.isCanceled() != true) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, "Error committing Artifacts.", ex);
+ toReturn = new Status(Status.ERROR, OteUiDefinePlugin.PLUGIN_ID, "Error committing Artifacts.", ex);
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ private void commitSelectedArtifacts(IProgressMonitor monitor, String comment, Object[] items) throws Exception {
+ Map<Branch, List<Artifact>> commitMap = getArtifactsByBranch(items);
+ for (Branch branch : commitMap.keySet()) {
+ monitor.setTaskName(String.format("Committing Artifacts into Branch: [%s]", branch.getBranchName()));
+ List<Artifact> artList = commitMap.get(branch);
+ ImportOutfileOperation.commitTestRunTx(monitor, comment, branch, artList.toArray(new Artifact[artList.size()]));
+ }
+ }
+
+ private Artifact[] verifyItemsCommitted(IProgressMonitor monitor, Object[] items) throws OseeArgumentException {
+ monitor.setTaskName("Verify committed...");
+ List<Artifact> committedList = new ArrayList<Artifact>();
+ for (Object object : items) {
+ Artifact artifact = (Artifact) object;
+ if (new TestRunOperator(artifact).isCommitAllowed() != true) {
+ committedList.add(artifact);
+ }
+ monitor.worked(1);
+ }
+ return committedList.toArray(new Artifact[committedList.size()]);
+ }
+
+ private Map<Branch, List<Artifact>> getArtifactsByBranch(Object[] items) {
+ Map<Branch, List<Artifact>> branchMap = new HashMap<Branch, List<Artifact>>();
+ for (Object object : items) {
+ Artifact testRun = (Artifact) object;
+ Branch branch = testRun.getBranch();
+ List<Artifact> artList = branchMap.get(branch);
+ if (artList == null) {
+ artList = new ArrayList<Artifact>();
+ branchMap.put(branch, artList);
+ }
+ artList.add(testRun);
+ }
+ return branchMap;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/ReportErrorsJob.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/ReportErrorsJob.java
new file mode 100644
index 00000000000..8197de7bb69
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/jobs/ReportErrorsJob.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.ui.define.jobs;
+
+import java.util.Arrays;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+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.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReportErrorsJob extends UIJob {
+
+ private Object[] objectsWithErrors;
+ private String message;
+
+ private ReportErrorsJob(String title, String message, Object... objectsWithErrors) {
+ super(title);
+ setUser(false);
+ setPriority(LONG);
+ this.objectsWithErrors = objectsWithErrors;
+ this.message = message;
+ }
+
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ final String errorMessage = Arrays.deepToString(objectsWithErrors).replaceAll(",", ",\n");
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ ResourceErrorDialog dialog = new ResourceErrorDialog(shell, getName(), message, errorMessage);
+ dialog.open();
+ return Status.OK_STATUS;
+ }
+
+ public static void openError(final String title, final String message, final Object... objectsWithErrors) {
+ openError(title, message, null, objectsWithErrors);
+ }
+
+ public static void openError(final String title, final String message, final IJobChangeListener listener, final Object... objectsWithErrors) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ ReportErrorsJob errorDialog = new ReportErrorsJob(title, message, objectsWithErrors);
+ if (listener != null) {
+ errorDialog.addJobChangeListener(listener);
+ }
+ errorDialog.schedule();
+ }
+ });
+ }
+ private final class ResourceErrorDialog extends MessageDialog {
+
+ private String errorMessage;
+
+ public ResourceErrorDialog(Shell parentShell, String dialogTitle, String dialogMessage, String errorMessage) {
+ super(parentShell, dialogTitle, PlatformUI.getWorkbench().getSharedImages().getImage(
+ ISharedImages.IMG_OBJS_ERROR_TSK), dialogMessage, MessageDialog.ERROR,
+ new String[] {IDialogConstants.OK_LABEL}, 0);
+ this.errorMessage = errorMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout());
+
+ Text text = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ data.heightHint = 300;
+ data.widthHint = 300;
+ data.minimumWidth = 300;
+ data.minimumHeight = 300;
+ text.setLayoutData(data);
+ text.setEditable(false);
+ text.setText(errorMessage);
+ text.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+ return composite;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/CommentComposite.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/CommentComposite.java
new file mode 100644
index 00000000000..cb8c331434b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/CommentComposite.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.ui.define.panels;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CommentComposite extends Composite {
+
+ protected Text textArea;
+ protected String message;
+
+ public CommentComposite(Composite parent, int style) {
+ super(parent, style);
+ this.message = "";
+ createControls();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ textArea.setText(message);
+ }
+
+ private void createControls() {
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ this.setLayout(layout);
+
+ this.textArea = new Text(this, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.heightHint = 80;
+ this.textArea.setLayoutData(data);
+ this.textArea.selectAll();
+
+ this.textArea.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ message = textArea.getText();
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/GrayableBranchSelectionComposite.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/GrayableBranchSelectionComposite.java
new file mode 100644
index 00000000000..9314cd3cb6e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/GrayableBranchSelectionComposite.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.panels;
+
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.skynet.core.event.AccessControlEventType;
+import org.eclipse.osee.framework.skynet.core.event.IAccessControlEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.panels.BranchSelectSimpleComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class GrayableBranchSelectionComposite extends Composite implements IAccessControlEventListener {
+
+ private static final String GROUP_TEXT = "Upload results into OSEE";
+ private static final String CHECK_BUTTON_TEXT = "Enable upload";
+ private static final String CHECK_BUTTON_TOOL_TIP =
+ "Select to store outfiles as Test Run Artifacts.\n" + "NOTE: User must be authenticated to create Artifacts.";
+ private static final String AUTHENTICATION_WARNING_MESSAGE =
+ "Authentication failure - Outfile upload not allowed. Double-Click on the lock icon at the bottom of the screen to authenticate.";
+ private static final String FEATURE_DISABLED = "Feature disabled.";
+
+ private BranchSelectSimpleComposite branchSelectComposite;
+ private Button branchSelectEnabled;
+ private Composite statusComposite;
+ private Composite selectableComposite;
+ private Label statusLabel;
+ private StackLayout stackedLayout;
+ private Group group;
+ private boolean featureEnabled;
+
+ public GrayableBranchSelectionComposite(Composite parent, int style) {
+ super(parent, style);
+ createControl(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IAccessControlEventListener#handleAccessControlArtifactsEvent(org.eclipse.osee.framework.ui.plugin.event.Sender, org.eclipse.osee.framework.skynet.core.eventx.AccessControlModType, org.eclipse.osee.framework.skynet.core.utility.LoadedArtifacts)
+ */
+ @Override
+ public void handleAccessControlArtifactsEvent(Sender sender, AccessControlEventType accessControlModType, LoadedArtifacts loadedArtifactss) {
+ if (accessControlModType == AccessControlEventType.UserAuthenticated) {
+ handleUserAuthenticated();
+ }
+ }
+
+ private void createControl(Composite parent) {
+ GridLayout gL = new GridLayout();
+ gL.marginWidth = 0;
+ gL.marginHeight = 0;
+ parent.setLayout(gL);
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ group = new Group(parent, SWT.NONE);
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ stackedLayout = new StackLayout();
+ group.setLayout(stackedLayout);
+ group.setText(GROUP_TEXT);
+
+ createStatusBar(group);
+ createSelectableArea(group);
+ handleBranchSelectEnabled(false);
+ OseeEventManager.addListener(this);
+ }
+
+ private void createSelectableArea(Composite parent) {
+ selectableComposite = new Composite(parent, SWT.NONE);
+ selectableComposite.setLayout(new GridLayout());
+ selectableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ branchSelectEnabled = new Button(selectableComposite, SWT.CHECK);
+ branchSelectEnabled.setText(CHECK_BUTTON_TEXT);
+ branchSelectEnabled.setToolTipText(CHECK_BUTTON_TOOL_TIP);
+
+ branchSelectEnabled.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleBranchSelectEnabled(branchSelectEnabled.getSelection());
+ }
+ });
+ this.branchSelectComposite =
+ BranchSelectSimpleComposite.createWorkingBranchSelectComposite(selectableComposite, SWT.NONE);
+ }
+
+ private void createStatusBar(Composite parent) {
+ statusComposite = new Composite(parent, SWT.BORDER);
+ statusComposite.setLayout(new GridLayout(2, false));
+ statusComposite.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false));
+ statusComposite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ statusComposite.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+
+ Label imageLabel = new Label(statusComposite, SWT.NONE);
+ imageLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+ imageLabel.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK));
+ imageLabel.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ imageLabel.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+
+ statusLabel = new Label(statusComposite, SWT.NONE);
+ statusLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ statusLabel.setText("");
+ statusLabel.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ statusLabel.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+ }
+
+ private void handleBranchSelectEnabled(boolean isSelected) {
+ setSelectable(true);
+ if (ClientSessionManager.isSessionValid() != true) {
+ statusLabel.setText(AUTHENTICATION_WARNING_MESSAGE);
+ setSelectable(false);
+ isSelected = false;
+ }
+ branchSelectEnabled.setSelection(isSelected);
+ branchSelectComposite.setEnabled(isSelected);
+ for (Control control : branchSelectComposite.getChildren()) {
+ control.setEnabled(isSelected);
+ }
+ }
+
+ public Branch getSelectedBranch() {
+ return branchSelectComposite.getSelectedBranch();
+ }
+
+ public boolean isBranchSelectEnabled() {
+ return branchSelectEnabled.getSelection();
+ }
+
+ public void setFeatureEnabled(final boolean isEnabled) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ featureEnabled = isEnabled;
+ handleBranchSelectEnabled(false);
+ statusLabel.setText(featureEnabled != true ? FEATURE_DISABLED : "");
+ setEnabled(featureEnabled);
+ setSelectable(featureEnabled);
+ }
+ });
+ }
+
+ private boolean isFeatureEnabled() {
+ return featureEnabled;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
+ */
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ for (Control child : group.getChildren()) {
+ child.setEnabled(enabled);
+ }
+ branchSelectEnabled.setEnabled(enabled);
+ }
+
+ public String[] getBranchIds() {
+ return branchSelectComposite.getBranchIds();
+ }
+
+ public void restoreWidgetValues(boolean saveAsArtifact, String[] branchIds, String lastSelected) {
+ branchSelectEnabled.setSelection(saveAsArtifact && ClientSessionManager.isSessionValid());
+ branchSelectComposite.restoreWidgetValues(branchIds, lastSelected);
+ }
+
+ private void setSelectable(final boolean isSelectable) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (isSelectable != false) {
+ stackedLayout.topControl = selectableComposite;
+ } else {
+ stackedLayout.topControl = statusComposite;
+ }
+ group.layout();
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Widget#dispose()
+ */
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ private void handleUserAuthenticated() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (branchSelectEnabled != null && branchSelectEnabled.isDisposed() != true && isFeatureEnabled() != false) {
+ handleBranchSelectEnabled(branchSelectEnabled.getSelection());
+ }
+ }
+ });
+ }
+
+ public boolean runOnEventInDisplayThread() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/IOverrideHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/IOverrideHandler.java
new file mode 100644
index 00000000000..8e41c6e6a09
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/IOverrideHandler.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.ui.define.panels;
+
+import java.util.Set;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOverrideHandler {
+
+ public String getText();
+
+ public String getToolTipText();
+
+ public Set<Object> getOverridableFromUnselectable(Set<Object> unselectable) throws OseeCoreException;
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/ListSelectionPanel.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/ListSelectionPanel.java
new file mode 100644
index 00000000000..cabfed826e5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/ListSelectionPanel.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.ui.define.panels;
+
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+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.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ListSelectionPanel extends Composite {
+
+ private TableViewer tableViewer;
+ private IBaseLabelProvider labelProvider;
+ private int width;
+ private int height;
+
+ public ListSelectionPanel(Composite parent, int style, int width, int height, IBaseLabelProvider labelProvider) {
+ super(parent, style);
+ this.width = width;
+ this.height = height;
+ this.labelProvider = labelProvider;
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+
+ parent.setLayout(layout);
+ parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ tableViewer = new TableViewer(parent, getTableStyle());
+ tableViewer.setContentProvider(new ArrayContentProvider());
+ tableViewer.setLabelProvider(labelProvider);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = width;
+ gd.widthHint = height;
+ Table table = tableViewer.getTable();
+ table.setLayoutData(gd);
+ table.setFont(parent.getFont());
+ }
+
+ private int getTableStyle() {
+ return SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
+ }
+
+ public void addDoubleClickListener(IDoubleClickListener listener) {
+ tableViewer.addDoubleClickListener(listener);
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ tableViewer.addSelectionChangedListener(listener);
+ }
+
+ public void setInput(Object input) {
+ tableViewer.setInput(input);
+ }
+
+ public void setSelection(int index) {
+ tableViewer.getTable().select(index);
+ }
+
+ public void setSorter(ViewerSorter sorter) {
+ tableViewer.setSorter(sorter);
+ }
+
+ public IStructuredSelection getSelection() {
+ return (IStructuredSelection) tableViewer.getSelection();
+ }
+
+ public int indexOf(Object object) {
+ int found = -1;
+ TableItem[] items = tableViewer.getTable().getItems();
+ for (int index = 0; index < items.length; index++) {
+ TableItem item = items[index];
+ if (item.getData().equals(object)) {
+ found = index;
+ break;
+ }
+ }
+ return found;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/PreviewPanel.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/PreviewPanel.java
new file mode 100644
index 00000000000..4c1f1e1f11a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/PreviewPanel.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.ui.define.panels;
+
+import java.net.URI;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.graphics.Font;
+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.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PreviewPanel extends Composite {
+ private static final String PREVIEW_DEFAULT_TITLE = "Preview Not Available";
+
+ public enum PanelEnum {
+ DEFAULT, BROWSER;
+ }
+
+ private Composite stackedComposite;
+ private StackLayout stackLayout;
+ private Composite defaultComposite;
+ private Browser browser;
+
+ public PreviewPanel(Composite parent, int style) {
+ super(parent, style);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ this.setLayout(layout);
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ stackedComposite = new Composite(parent, SWT.BORDER);
+ stackLayout = new StackLayout();
+ stackLayout.marginWidth = 0;
+ stackLayout.marginHeight = 0;
+ stackedComposite.setLayout(stackLayout);
+ stackedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createBrowserArea(stackedComposite);
+ createPreviewNotAllowed(stackedComposite);
+ }
+
+ private void createBrowserArea(Composite parent) {
+ browser = new Browser(parent, SWT.EMBEDDED | SWT.BORDER);
+ browser.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+ browser.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
+ }
+
+ private void createPreviewNotAllowed(Composite parent) {
+ defaultComposite = new Composite(parent, SWT.BORDER);
+ defaultComposite.setLayout(new GridLayout());
+ defaultComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ defaultComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ Label label = new Label(defaultComposite, SWT.NONE);
+ Font font = new Font(PlatformUI.getWorkbench().getDisplay(), "Courier New", 10, SWT.BOLD);
+ label.setFont(font);
+ label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED));
+ label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+ label.setText(PREVIEW_DEFAULT_TITLE);
+ label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ }
+
+ private Control getControl(PanelEnum panelId) {
+ Control control = defaultComposite;
+ if (panelId.equals(PanelEnum.BROWSER)) {
+ control = browser;
+ }
+ return control;
+ }
+
+ public void setDisplay(final PanelEnum panelId) {
+ Control control = getControl(panelId);
+ stackLayout.topControl = control;
+ stackedComposite.layout();
+ stackedComposite.getParent().layout();
+ getParent().layout();
+ getParent().getParent().layout();
+ }
+
+ public void updatePreview(final PanelEnum panelId, final URI uri) {
+ try {
+ if (panelId.equals(PanelEnum.BROWSER)) {
+ browser.setUrl(uri.toURL().toString());
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, String.format("Error Updating Preview [%s]", panelId), ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/SelectionComposite.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/SelectionComposite.java
new file mode 100644
index 00000000000..d17ed994bb7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/panels/SelectionComposite.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.ui.define.panels;
+
+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.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CellLabelProvider;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.type.MutableBoolean;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.swt.SWT;
+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.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SelectionComposite extends Composite {
+ private static final Image CONFLICT_IMAGE = OteUiDefinePlugin.getInstance().getImage("obstructed_16x16.gif");
+ private static final Image CHECKED_IMAGE = OteUiDefinePlugin.getInstance().getImage("chkbox_enabled.gif");
+ private static final Image UNCHECKED_IMAGE = OteUiDefinePlugin.getInstance().getImage("chkbox_disabled.gif");
+ private static Image CHECK_OVERRIDEN_IMAGE = null;
+ private static Image UNCHECKED_OVERRIDEN_IMAGE = null;
+
+ private ITableLabelProvider tableLabelProvider;
+ private TableViewer tableViewer;
+ private Object[] resources;
+ private boolean isSelectAllByDefault;
+ private Map<Object, MutableBoolean> selectableMap;
+ private Set<Object> userSelectedResources = new HashSet<Object>();
+ private Set<Object> notSelectableResources = new HashSet<Object>();
+ private Set<Object> overridable = new HashSet<Object>();
+ private String[] columnNames;
+ private Label lblSelectedResourcesNumber;
+ private IOverrideHandler overrideHandler;
+ private boolean areOverridesAllowed;
+
+ public SelectionComposite(Composite parent, int style, String[] columnNames, ITableLabelProvider tableLabelProvider, Object[] resources, boolean isSelectAllByDefault, IOverrideHandler overrideHandler) throws OseeCoreException {
+ this(parent, style, columnNames, tableLabelProvider, resources, isSelectAllByDefault, null, null, overrideHandler);
+ }
+
+ public SelectionComposite(Composite parent, int style, String[] columnNames, ITableLabelProvider tableLabelProvider, Object[] resources, boolean isSelectAllByDefault, Object[] userSelectedResources, Object[] unSelectableResources, IOverrideHandler overrideHandler) {
+ super(parent, style);
+ this.columnNames = columnNames;
+ this.tableLabelProvider = tableLabelProvider;
+ this.selectableMap = new HashMap<Object, MutableBoolean>();
+ this.resources = resources;
+ this.isSelectAllByDefault = isSelectAllByDefault;
+ if (userSelectedResources != null) {
+ this.userSelectedResources.addAll(Arrays.asList(userSelectedResources));
+ }
+ if (unSelectableResources != null) {
+ this.notSelectableResources.addAll(Arrays.asList(unSelectableResources));
+ }
+ this.overrideHandler = overrideHandler;
+ if (overrideHandler != null) {
+ try {
+ this.overridable.addAll(overrideHandler.getOverridableFromUnselectable(notSelectableResources));
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ this.areOverridesAllowed = false;
+ createControls();
+ }
+
+ private void createControls() {
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.marginHeight = 0;
+ gridLayout.marginWidth = 0;
+ this.setLayout(gridLayout);
+
+ createTableArea(this);
+ Composite buttonComposite = createButtonArea(this);
+ createLabelArea(buttonComposite);
+ }
+
+ private void createTableArea(Composite parent) {
+ int style = SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER;
+ Table table = new Table(parent, style);
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+ TableLayout layout = new TableLayout();
+ table.setLayout(layout);
+
+ this.tableViewer = new TableViewer(table);
+ this.tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
+ this.tableViewer.setLabelProvider(this.tableLabelProvider);
+ this.tableViewer.setContentProvider(new TableContentProvider());
+ this.tableViewer.setSorter(new ViewerSorter());
+
+ TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
+ viewerColumn.setEditingSupport(new CheckColumnEditingSupport(tableViewer));
+ viewerColumn.setLabelProvider(new CheckCellLabelProvider());
+
+ createColumns();
+
+ initializeSelections();
+ this.tableViewer.setInput(this.resources);
+ packColumnData();
+ }
+
+ private void packColumnData() {
+ TableColumn[] columns = tableViewer.getTable().getColumns();
+ for (TableColumn column : columns) {
+ column.pack();
+ }
+ }
+
+ private void createColumns() {
+ Table table = tableViewer.getTable();
+ for (String item : columnNames) {
+ TableColumn column = new TableColumn(table, SWT.NONE);
+ column.setResizable(true);
+ column.setText(item);
+ }
+ }
+
+ private void createLabelArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.horizontalSpacing = 0;
+ layout.marginWidth = 0;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ this.lblSelectedResourcesNumber = new Label(composite, SWT.RIGHT);
+ this.lblSelectedResourcesNumber.setText(selectItemsToString(getSelectedCount()));
+ this.lblSelectedResourcesNumber.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ }
+
+ private Composite createButtonArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.RIGHT);
+ GridLayout gLayout = new GridLayout();
+ gLayout.numColumns = overrideHandler != null ? 4 : 3;
+ gLayout.marginWidth = 0;
+ composite.setLayout(gLayout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Button selectButton = new Button(composite, SWT.PUSH);
+ selectButton.setText("Select All");
+ selectButton.setLayoutData(new GridData());
+ selectButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ setAllItemsChecked(true);
+ }
+ });
+
+ Button deselectButton = new Button(composite, SWT.PUSH);
+ deselectButton.setText("Deselect All");
+ deselectButton.setLayoutData(new GridData());
+ deselectButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ setAllItemsChecked(false);
+ }
+ });
+
+ if (overrideHandler != null) {
+ final Button overrideButton = new Button(composite, SWT.CHECK);
+ overrideButton.setText(overrideHandler.getText());
+ overrideButton.setToolTipText(overrideHandler.getToolTipText());
+ overrideButton.setLayoutData(new GridData());
+ overrideButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ areOverridesAllowed = overrideButton.getSelection();
+ if (areOverridesAllowed != false) {
+ for (Object object : overridable) {
+ selectableMap.put(object, new MutableBoolean(false));
+ }
+ } else {
+ for (Object object : overridable) {
+ selectableMap.remove(object);
+ }
+ }
+ refresh();
+ }
+ });
+ }
+ return composite;
+ }
+
+ private void setAllItemsChecked(boolean state) {
+ for (Object key : selectableMap.keySet()) {
+ MutableBoolean mutable = selectableMap.get(key);
+ mutable.setValue(state);
+ selectableMap.put(key, mutable);
+ }
+ refresh();
+ }
+
+ private void refresh() {
+ lblSelectedResourcesNumber.setText(selectItemsToString(getSelectedCount()));
+ tableViewer.refresh();
+ }
+
+ protected void initializeSelections() {
+ for (Object object : resources) {
+ if (notSelectableResources.contains(object) != true) {
+ boolean initialValue = userSelectedResources.contains(object) || isSelectAllByDefault;
+ selectableMap.put(object, new MutableBoolean(initialValue));
+ }
+ }
+ }
+
+ protected String selectItemsToString(int value) {
+ return String.format("Selected: %s of %s", String.valueOf(value), String.valueOf(resources.length));
+ }
+
+ public void addOverrideHandler(IOverrideHandler overrideHandler) {
+ this.overrideHandler = overrideHandler;
+ }
+
+ public Object[] getSelectedResources() {
+ return getSelectedItems(true);
+ }
+
+ public Object[] getNotSelectedResources() {
+ return getSelectedItems(false);
+ }
+
+ private Object[] getSelectedItems(boolean thatMatchTrue) {
+ List<Object> toReturn = new ArrayList<Object>();
+ for (Object key : selectableMap.keySet()) {
+ if (selectableMap.get(key).getValue() == thatMatchTrue) {
+ toReturn.add(key);
+ }
+ }
+ return toReturn.toArray(new Object[toReturn.size()]);
+ }
+
+ public int getSelectedCount() {
+ int count = 0;
+ for (MutableBoolean value : selectableMap.values()) {
+ if (value.getValue() == true) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private boolean isOverridable(Object element) {
+ return overridable.contains(element) != false && areOverridesAllowed != false;
+ }
+
+ private final class TableContentProvider implements IStructuredContentProvider {
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return resources;
+ }
+ }
+
+ private final class CheckCellLabelProvider extends CellLabelProvider {
+
+ public CheckCellLabelProvider() {
+ super();
+ }
+
+ @Override
+ public void update(ViewerCell cell) {
+ if (cell.getColumnIndex() == 0) {
+ Object data = cell.getItem().getData();
+ if (notSelectableResources.contains(data) && isOverridable(data) != true) {
+ cell.setImage(CONFLICT_IMAGE);
+ } else {
+ MutableBoolean isSelectedObject = selectableMap.get(data);
+ boolean isSelected = isSelectedObject != null && isSelectedObject.getValue() == true;
+ boolean isOverriden = overridable.contains(data);
+ cell.setImage(getImage(isSelected, isOverriden));
+ }
+ }
+ }
+
+ private Image getImage(boolean isChecked, boolean isOverriden) {
+ Image toReturn = isChecked != false ? CHECKED_IMAGE : UNCHECKED_IMAGE;
+ if (isOverriden != false) {
+ if (CHECK_OVERRIDEN_IMAGE == null || UNCHECKED_OVERRIDEN_IMAGE == null) {
+ DecorationOverlayIcon overlay =
+ new DecorationOverlayIcon(toReturn, OteUiDefinePlugin.getInstance().getImageDescriptor(
+ "switched.gif"), IDecoration.BOTTOM_RIGHT);
+
+ Image overlayedImage = overlay.createImage();
+ if (isChecked != false) {
+ CHECK_OVERRIDEN_IMAGE = overlayedImage;
+ } else {
+ UNCHECKED_OVERRIDEN_IMAGE = overlayedImage;
+ }
+ }
+ toReturn = isChecked != false ? CHECK_OVERRIDEN_IMAGE : UNCHECKED_OVERRIDEN_IMAGE;
+ }
+ return toReturn;
+ }
+ }
+
+ private final class CheckColumnEditingSupport extends EditingSupport {
+
+ private CheckboxCellEditor editor;
+
+ public CheckColumnEditingSupport(ColumnViewer viewer) {
+ super(viewer);
+ this.editor = new CheckboxCellEditor((Composite) viewer.getControl());
+ viewer.setCellEditors(new CellEditor[] {editor});
+ }
+
+ @Override
+ protected boolean canEdit(Object element) {
+ return notSelectableResources.contains(element) != true || overridable.contains(element);
+ }
+
+ @Override
+ protected CellEditor getCellEditor(Object element) {
+ return editor;
+ }
+
+ @Override
+ protected Object getValue(Object element) {
+ MutableBoolean value = selectableMap.get(element);
+ return value != null ? value.getValue() : false;
+ }
+
+ @Override
+ protected void setValue(Object element, Object value) {
+ MutableBoolean object = selectableMap.get(element);
+ if (object != null) {
+ object.setValue((Boolean) value);
+ }
+ refresh();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ExtensionDefinedReports.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ExtensionDefinedReports.java
new file mode 100644
index 00000000000..5162417e524
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ExtensionDefinedReports.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.define.reports;
+
+import java.net.URL;
+import java.util.HashMap;
+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.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExtensionDefinedReports {
+ private static final String EXTENSION_ID = "ITestRunReport";
+ private Map<String, ReportData> reportMap;
+ private Map<String, Pair<String, String>> idsAndNameMap;
+
+ private static ExtensionDefinedReports instance = null;
+
+ private ExtensionDefinedReports() {
+ this.reportMap = new HashMap<String, ReportData>();
+ loadReports();
+ }
+
+ public static ExtensionDefinedReports getInstance() {
+ if (instance == null) {
+ instance = new ExtensionDefinedReports();
+ }
+ return instance;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Pair<String, String>[] getIdsAndNames() {
+ if (idsAndNameMap == null) {
+ this.idsAndNameMap = new HashMap<String, Pair<String, String>>();
+ Set<String> ids = reportMap.keySet();
+ for (String id : ids) {
+ ReportData data = reportMap.get(id);
+ this.idsAndNameMap.put(id, new Pair<String, String>(id, data.getName()));
+ }
+ }
+ return idsAndNameMap.values().toArray(new Pair[idsAndNameMap.size()]);
+ }
+
+ public Image getImage(String key) {
+ ReportData data = reportMap.get(key);
+ Image toReturn = data.getIcon();
+ return toReturn != null ? toReturn : ImageManager.getImage(FrameworkImage.MISSING);
+ }
+
+ public ITestRunReport getReportGenerator(String key) {
+ ReportData data = reportMap.get(key);
+ return data != null ? data.getTestRunReport() : null;
+ }
+
+ public Pair<String, String> getIdAndName(String id) {
+ return idsAndNameMap.get(id);
+ }
+
+ private void loadReports() {
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements(OteUiDefinePlugin.getInstance(), EXTENSION_ID, EXTENSION_ID);
+ for (IConfigurationElement element : elements) {
+ IExtension extension = ((IExtension) element.getParent());
+ String identifier = extension.getUniqueIdentifier();
+ String name = extension.getLabel();
+ String className = element.getAttribute("classname");
+ String iconName = element.getAttribute("icon");
+ String bundleName = element.getContributor().getName();
+
+ if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> taskClass = bundle.loadClass(className);
+ ITestRunReport object = (ITestRunReport) taskClass.newInstance();
+ if (object != null) {
+ URL url = bundle.getEntry(iconName);
+ ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(url);
+ reportMap.put(identifier, new ReportData(identifier, name, object, imageDescriptor.createImage()));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE,
+ String.format("Error loading report [%s]", className), ex);
+ }
+ }
+ }
+ }
+
+ private final class ReportData {
+ private String id;
+ private String name;
+ private Image icon;
+ private ITestRunReport testRunReport;
+
+ public ReportData(String id, String name, ITestRunReport testRunReport, Image icon) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.icon = icon;
+ this.testRunReport = testRunReport;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @param id the id to set
+ */
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the icon
+ */
+ public Image getIcon() {
+ return icon;
+ }
+
+ /**
+ * @return the testRunReport
+ */
+ public ITestRunReport getTestRunReport() {
+ return testRunReport;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HighLevelSummary.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HighLevelSummary.java
new file mode 100644
index 00000000000..4082ae30786
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HighLevelSummary.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.reports;
+
+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.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.utility.Requirements;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HighLevelSummary implements ITestRunReport {
+ private static final String[] HEADER =
+ new String[] {Requirements.PARTITION, Requirements.SUBSYSTEM, "ScriptCount", "RunTime Issues",
+ "Scripts with Failures", "Scripts Pass"};
+ private Map<String, CollectedData> dataMap;
+
+ public HighLevelSummary() {
+ this.dataMap = new HashMap<String, CollectedData>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#generate()
+ */
+ public void gatherData(IProgressMonitor monitor, TestRunOperator... items) throws Exception {
+ clear();
+ for (int index = 0; index < items.length; index++) {
+ TestRunOperator operator = items[index];
+ monitor.subTask(String.format("Processing [%s of%s]", index + 1, items.length));
+ String partition = operator.getPartition();
+ String subsystem = operator.getSubsystem();
+ String key = String.format("%s:%s", partition, subsystem);
+ CollectedData data = dataMap.get(key);
+ if (data == null) {
+ data = new CollectedData(partition, subsystem);
+ dataMap.put(key, data);
+ }
+ try {
+ processData(data, operator);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ if (monitor.isCanceled()) {
+ break;
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getBody()
+ */
+ public String[][] getBody() {
+ int numRows = dataMap.size();
+ List<String> keys = new ArrayList<String>(dataMap.keySet());
+ String[][] toReturn = new String[numRows][getHeader().length];
+ for (int row = 0; row < numRows; row++) {
+ String key = keys.get(row);
+ CollectedData collectedData = dataMap.get(key);
+ toReturn[row] = addRow(collectedData);
+ }
+ return toReturn;
+ }
+
+ private String[] addRow(CollectedData data) {
+ List<String> values = new ArrayList<String>();
+ values.add(data.getPartition());
+ values.add(data.getSubsytem());
+ values.add(Integer.toString(data.getScriptCount()));
+ values.add(Integer.toString(data.getRunTimeIssues()));
+ values.add(Integer.toString(data.getScriptWithFailures()));
+ values.add(Integer.toString(data.getScriptPassed()));
+ return values.toArray(new String[values.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getHeader()
+ */
+ public String[] getHeader() {
+ return HEADER;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getReportTitle()
+ */
+ public String getTitle() {
+ return "High Level Test Run Summary";
+ }
+
+ private void processData(CollectedData data, TestRunOperator operator) throws OseeCoreException {
+ data.incrementScriptCount();
+
+ int failed = operator.getTestPointsFailed();
+ int passed = operator.getTestPointsPassed();
+ int total = operator.getTotalTestPoints();
+ boolean wasAborted = operator.wasAborted();
+
+ if (wasAborted) {
+ data.incrementRunTimeIssues();
+ } else if (total == 0) {
+ data.incrementRunTimeIssues();
+ } else if (failed > 0) {
+ data.incrementScriptWithFailures();
+ } else if (passed == total && failed == 0) {
+ data.incrementScriptPassed();
+ }
+ }
+
+ private final class CollectedData {
+ private String partition;
+ private String subsytem;
+ private int scriptCount;
+ private int runTimeIssues;
+ private int scriptWithFailures;
+ private int scriptPassed;
+
+ public CollectedData(String partition, String subsytem) {
+ this.partition = partition;
+ this.subsytem = subsytem;
+ this.scriptCount = 0;
+ this.runTimeIssues = 0;
+ this.scriptWithFailures = 0;
+ this.scriptPassed = 0;
+ }
+
+ public String getPartition() {
+ return partition;
+ }
+
+ public String getSubsytem() {
+ return subsytem;
+ }
+
+ public int getScriptCount() {
+ return scriptCount;
+ }
+
+ public int getRunTimeIssues() {
+ return runTimeIssues;
+ }
+
+ public int getScriptWithFailures() {
+ return scriptWithFailures;
+ }
+
+ public int getScriptPassed() {
+ return scriptPassed;
+ }
+
+ public void incrementScriptCount() {
+ this.scriptCount++;
+ }
+
+ public void incrementRunTimeIssues() {
+ this.runTimeIssues++;
+ }
+
+ public void incrementScriptWithFailures() {
+ this.scriptWithFailures++;
+ }
+
+ public void incrementScriptPassed() {
+ this.scriptPassed++;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getDescription()
+ */
+ public String getDescription() {
+ return "Generates a summary report of all test runs.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#reset()
+ */
+ @Override
+ public void clear() {
+ this.dataMap.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HistoricalTestRunData.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HistoricalTestRunData.java
new file mode 100644
index 00000000000..32cb1607e32
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HistoricalTestRunData.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.define.reports;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HistoricalTestRunData implements ITestRunReport {
+ private static final String DATE_HEADER = "Date";
+ private static final String[] PER_SCRIPT_HEADER = new String[] {"Passed", "Failed", "Total", "Status"};
+
+ private static final DateFormat formatter = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
+
+ private HashMap<Date, Map<String, TestRunOperator>> runByCollection;
+ private Set<String> runsByName;
+
+ public HistoricalTestRunData() {
+ this.runByCollection = new HashMap<Date, Map<String, TestRunOperator>>();
+ this.runsByName = new TreeSet<String>();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#gatherData(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.osee.ote.define.artifacts.TestRunOperator[])
+ */
+ public void gatherData(IProgressMonitor monitor, TestRunOperator... artifacts) throws Exception {
+ clear();
+ for (TestRunOperator operator : artifacts) {
+ try {
+ Date date = operator.getEndDate();
+ Map<String, TestRunOperator> theMap = runByCollection.get(date);
+ if (theMap == null) {
+ theMap = new HashMap<String, TestRunOperator>();
+ runByCollection.put(date, theMap);
+ }
+ String name = operator.getScriptSimpleName();
+ theMap.put(name, operator);
+ runsByName.add(name);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getBody()
+ */
+ public String[][] getBody() {
+ String[][] toReturn = new String[runByCollection.size() + 1][getHeader().length];
+ int index = 0;
+ toReturn[index++] = getTitleRow();
+ List<Date> dateList = new ArrayList<Date>(runByCollection.keySet());
+ Collections.sort(dateList);
+ for (Date date : dateList) {
+ Map<String, TestRunOperator> theMap = runByCollection.get(date);
+ toReturn[index++] = getRow(date, theMap);
+ }
+ return toReturn;
+ }
+
+ private String[] getRow(Date date, Map<String, TestRunOperator> theMap) {
+ List<String> row = new ArrayList<String>();
+ row.add(formatter.format(date));
+ for (String name : runsByName) {
+ TestRunOperator operator = theMap.get(name);
+ for (String entry : getData(operator)) {
+ row.add(entry);
+ }
+ }
+ return row.toArray(new String[row.size()]);
+ }
+
+ private String[] getData(TestRunOperator operator) {
+ String[] data = new String[PER_SCRIPT_HEADER.length];
+ Arrays.fill(data, ONE_SPACE_STRING);
+ try {
+ if (operator != null) {
+ data[0] = Integer.toString(operator.getTestPointsPassed());
+ data[1] = Integer.toString(operator.getTestPointsFailed());
+ data[2] = Integer.toString(operator.getTotalTestPoints());
+ data[3] = operator.getTestResultStatus();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ return data;
+ }
+
+ private String[] getTitleRow() {
+ List<String> header = new ArrayList<String>();
+ header.add(ONE_SPACE_STRING);
+ for (int index = 0; index < runsByName.size(); index++) {
+ header.addAll(Arrays.asList(PER_SCRIPT_HEADER));
+ }
+ return header.toArray(new String[header.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getDescription()
+ */
+ public String getDescription() {
+ return "Creates a table of run results by date.";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getHeader()
+ */
+ public String[] getHeader() {
+ List<String> header = new ArrayList<String>();
+ header.add(DATE_HEADER);
+ for (String name : runsByName) {
+ header.add(name);
+ header.add(ONE_SPACE_STRING);
+ header.add(ONE_SPACE_STRING);
+ header.add(ONE_SPACE_STRING);
+ }
+ return header.toArray(new String[header.size()]);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#getTitle()
+ */
+ public String getTitle() {
+ return "Test Run Historical Trend";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.ITestRunReport#clear()
+ */
+ @Override
+ public void clear() {
+ this.runByCollection.clear();
+ this.runsByName.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HttpReportRequest.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HttpReportRequest.java
new file mode 100644
index 00000000000..fb964408f5b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/HttpReportRequest.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.define.reports;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.core.client.server.HttpRequest;
+import org.eclipse.osee.framework.core.client.server.HttpResponse;
+import org.eclipse.osee.framework.core.client.server.HttpUrlBuilder;
+import org.eclipse.osee.framework.core.client.server.IHttpServerRequest;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.reports.output.IReportWriter;
+import org.eclipse.osee.ote.ui.define.reports.output.OutputFactory;
+import org.eclipse.osee.ote.ui.define.reports.output.OutputFormat;
+import org.eclipse.osee.ote.ui.define.utilities.SelectionHelper;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HttpReportRequest implements IHttpServerRequest {
+ private static final String REQUEST_TYPE = "GET.REPORT";
+ private static final String REPORT_ID = "id";
+ private static final String REPORT_FORMAT = "format";
+ private static final String REPORT_SOURCE = "source";
+ private static final String PREVIEW_SIZE = "preview";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.linking.IHttpServerRequest#getRequestType()
+ */
+ public String getRequestType() {
+ return REQUEST_TYPE;
+ }
+
+ public static String getUrl(String id, String format, String source) throws OseeStateException {
+ return getUrl(id, format, source, -1);
+ }
+
+ public static String getUrl(String id, String format, String source, int preview) throws OseeStateException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ parameters.put(REPORT_ID, id);
+ parameters.put(REPORT_FORMAT, format);
+ parameters.put(REPORT_SOURCE, source);
+ if (preview > -1) {
+ parameters.put(PREVIEW_SIZE, Integer.toString(preview));
+ }
+ return HttpUrlBuilder.getInstance().getUrlForLocalSkynetHttpServer(HttpReportRequest.REQUEST_TYPE, parameters);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.linking.IHttpServerRequest#processRequest(org.eclipse.osee.framework.skynet.core.linking.HttpRequest, org.eclipse.osee.framework.skynet.core.linking.HttpResponse)
+ */
+ public void processRequest(HttpRequest httpRequest, HttpResponse httpResponse) {
+ if (httpRequest.getOriginatingAddress().isLoopbackAddress()) {
+ String reportId = httpRequest.getParameter(REPORT_ID);
+ String format = httpRequest.getParameter(REPORT_FORMAT);
+
+ try {
+ OutputFormat outputFormat = OutputFormat.fromString(format);
+ ITestRunReport report = ExtensionDefinedReports.getInstance().getReportGenerator(reportId);
+ report.gatherData(new NullProgressMonitor(), getSourceData(httpRequest));
+
+ IReportWriter writer = OutputFactory.getReportWriter(outputFormat);
+ writer.writeTitle(report.getTitle());
+ writer.writeHeader(report.getHeader());
+ String[][] body = report.getBody();
+ for (int index = 0; index < body.length; index++) {
+ writer.writeRow(body[index]);
+ }
+ report.clear();
+
+ if (outputFormat.equals(OutputFormat.HTML) != true) {
+ httpResponse.setReponseHeader("Accept-Ranges", "bytes");
+ httpResponse.setContentEncoding("ISO-8859-1");
+ String fileName = URLEncoder.encode(OutputFactory.getOutputFilename(outputFormat, reportId), "UTF-8");
+ httpResponse.setContentDisposition(String.format("attachment; filename=%s", fileName));
+ }
+ httpResponse.setContentType(OutputFactory.getContentType(outputFormat));
+ httpResponse.sendResponseHeaders(200, writer.length());
+ writer.writeToOutput(httpResponse.getOutputStream());
+
+ } catch (Exception ex) {
+ handleException(httpRequest, httpResponse, ex);
+ }
+ }
+ }
+
+ private TestRunOperator[] getSourceData(HttpRequest httpRequest) {
+ String source = httpRequest.getParameter(REPORT_SOURCE);
+
+ List<TestRunOperator> toReturn = new ArrayList<TestRunOperator>();
+ if (source.equals("local")) {
+ LocalSourceSelection selection = new LocalSourceSelection();
+ Display.getDefault().asyncExec(selection);
+ TestRunOperator[] data = selection.getArtifacts();
+ addData(httpRequest, data, toReturn);
+ }
+ return toReturn.toArray(new TestRunOperator[toReturn.size()]);
+ }
+
+ private void addData(HttpRequest httpRequest, TestRunOperator[] source, List<TestRunOperator> destination) {
+ String previewSize = httpRequest.getParameter(PREVIEW_SIZE);
+ if (Strings.isValid(previewSize)) {
+ int size = 5;
+ try {
+ size = Integer.parseInt(previewSize);
+ } catch (Exception ex) {
+ size = 5;
+ }
+ if (size > source.length) {
+ size = source.length;
+ }
+ for (int index = 0; index < size; index++) {
+ destination.add(source[index]);
+ }
+ } else {
+ destination.addAll(Arrays.asList(source));
+ }
+ }
+
+ private void handleException(HttpRequest httpRequest, HttpResponse httpResponse, Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, "Exception occurred.", ex);
+ }
+
+ private final class LocalSourceSelection implements Runnable {
+
+ private TestRunOperator[] artifacts;
+ private boolean done = false;
+
+ public TestRunOperator[] getArtifacts() {
+ while (this.isDone() != true)
+ ;
+ return artifacts;
+ }
+
+ public void run() {
+ done = false;
+ List<TestRunOperator> toReturn = new ArrayList<TestRunOperator>();
+ StructuredViewer viewer = TestRunView.getViewer();
+ if (viewer != null) {
+ toReturn.addAll(SelectionHelper.getInstance().getSelections(viewer));
+ }
+ artifacts = toReturn.toArray(new TestRunOperator[toReturn.size()]);
+ done = true;
+ }
+
+ public boolean isDone() {
+ return done;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ITestRunReport.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ITestRunReport.java
new file mode 100644
index 00000000000..d068d5c6809
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/ITestRunReport.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.ui.define.reports;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITestRunReport {
+
+ public static final String ONE_SPACE_STRING = " ";
+ public static final String EMPTY_STRING = "";
+ public static final String FLOAT_TYPE = "float";
+
+ public void gatherData(IProgressMonitor monitor, TestRunOperator... artifacts) throws Exception;
+
+ public String getTitle();
+
+ public String[] getHeader();
+
+ public String[][] getBody();
+
+ public String getDescription();
+
+ public void clear();
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTable.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTable.java
new file mode 100644
index 00000000000..5295bc520fb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTable.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.reports.html;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.utilities.HtmlStringUtils;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HtmlActiveTable {
+ private static final String TEMPLATE_PATH = "templates/HtmlActiveTableTemplate";
+
+ private static final String ELEMENT_NAME_TAG = "##ELEMENT_NAME##";
+ private static final String TABLE_HEIGHT = "##HEIGHT##";
+ private static final String TABLE_WIDTH = "##WIDTH##";
+ private static final String TABLE_TITLE = "##TABLE_TITLE##";
+
+ private static final String TABLE_DATA_TAG = "##TABLE_DATA##";
+ private static final String CUSTOM_FUNCTIONS_TAG = "##CUSTOM_FUNCTIONS##";
+ private static final String COLUMN_METADATA_TAG = "##COLUMN_DATA##";
+ private static final String COLUMN_CUSTOMIZATIONS_TAG = "##COLUMN_CUSTOMIZATIONS_DATA##";
+ private static final String AUTO_EXPAND_ON_COLUMN = "##AUTO_EXPAND_COLUMN##";
+
+ private String elementName;
+ private String tableHeight;
+ private String tableWidth;
+ private String tableTitle;
+ private List<List<String>> rowData;
+ private List<HtmlActiveTableColumnData> columnList;
+
+ public HtmlActiveTable() {
+ super();
+ this.rowData = new ArrayList<List<String>>();
+ this.columnList = new ArrayList<HtmlActiveTableColumnData>();
+ this.elementName = "ID";
+ this.tableHeight = "";
+ this.tableWidth = "";
+ this.tableTitle = this.getClass().getName();
+ }
+
+ public void setElementName(String elementName) {
+ this.elementName = elementName;
+ }
+
+ public void setTableHeight(String tableHeight) {
+ this.tableHeight = tableHeight;
+ }
+
+ public void setTableWidth(String tableWidth) {
+ this.tableWidth = tableWidth;
+ }
+
+ public void setTableTitle(String tableTitle) {
+ this.tableTitle = tableTitle;
+ }
+
+ private URL getTemplate() throws IOException {
+ URL url = null;
+ Bundle bundle = OteUiDefinePlugin.getInstance().getBundle();
+ if (bundle != null) {
+ url = bundle.getEntry(TEMPLATE_PATH);
+ url = FileLocator.resolve(url);
+ }
+ return url;
+ }
+
+ public void addColumn(HtmlActiveTableColumnData columnData) {
+ this.columnList.add(columnData);
+ }
+
+ private String getColumnDataStoreInfo() {
+ StringBuilder builder = new StringBuilder();
+ int size = columnList.size();
+ for (int index = 0; index < size; index++) {
+ HtmlActiveTableColumnData data = columnList.get(index);
+ builder.append(data.asMetaData());
+ if (index + 1 < size) {
+ builder.append(",\n");
+ }
+ }
+ return builder.toString();
+ }
+
+ private String getColumnCustomizations() {
+ StringBuilder builder = new StringBuilder();
+ int size = columnList.size();
+ for (int index = 0; index < size; index++) {
+ HtmlActiveTableColumnData data = columnList.get(index);
+ String row = data.asColumnCustomization();
+
+ if (index == 0) {
+ row = row.substring(1, row.length());
+ builder.append("{ id:");
+ String name = data.getName().toLowerCase();
+ builder.append(HtmlStringUtils.addSingleQuotes(HtmlStringUtils.escapeString(name)));
+ builder.append(", ");
+ }
+ builder.append(row);
+ if (index + 1 < size) {
+ builder.append(",\n");
+ }
+ }
+ return builder.toString();
+ }
+
+ public String generate() throws IOException {
+ URL url = getTemplate();
+ String template = Lib.inputStreamToString(url.openStream());
+
+ try {
+ template = template.replace(ELEMENT_NAME_TAG, elementName);
+ String widthEntry = "autoWidth: true";
+ if (Strings.isValid(tableWidth)) {
+ widthEntry = "width: " + tableWidth;
+ }
+ template = template.replace(TABLE_WIDTH, widthEntry);
+ String heightEntry = "autoHeight: true";
+ if (Strings.isValid(tableHeight)) {
+ heightEntry = "height: " + tableHeight;
+ }
+ template = template.replace(TABLE_HEIGHT, heightEntry);
+ template = template.replace(TABLE_TITLE, tableTitle);
+ template = template.replace(COLUMN_METADATA_TAG, getColumnDataStoreInfo());
+ template = template.replace(TABLE_DATA_TAG, generateTableData());
+ template = template.replace(CUSTOM_FUNCTIONS_TAG, getCustomFunction());
+ template = template.replace(COLUMN_CUSTOMIZATIONS_TAG, getColumnCustomizations());
+ template = template.replace(AUTO_EXPAND_ON_COLUMN, getAutoExpandColumn());
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return template;
+ }
+
+ private String getAutoExpandColumn() {
+ StringBuilder builder = new StringBuilder();
+ if (columnList.size() > 0) {
+ builder.append("autoExpandColumn: ");
+ HtmlActiveTableColumnData data = columnList.get(0);
+ String name = data.getName().toLowerCase();
+ builder.append(HtmlStringUtils.addSingleQuotes(HtmlStringUtils.escapeString(name)));
+ builder.append(", autoExpandMin: ");
+ builder.append(data.getWidth());
+ builder.append(", autoExpandMax: ");
+ builder.append(data.getWidth() * 10);
+ }
+ return builder.toString();
+ }
+
+ private String generateTableData() {
+ StringBuilder builder = new StringBuilder();
+ for (int index = 0; index < rowData.size(); index++) {
+ builder.append(processRow(rowData.get(index)));
+ if (index + 1 < rowData.size()) {
+ builder.append(", ");
+ }
+ }
+ return builder.toString();
+ }
+
+ private String processRow(List<String> values) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("[ ");
+ for (int index = 0; index < values.size(); index++) {
+ String rawData = values.get(index);
+ String data = HtmlStringUtils.escapeString(rawData != null ? rawData : "");
+ HtmlActiveTableColumnData metaData = columnList.get(index);
+ if (Strings.isValid(metaData.getType()) != true || metaData.getType().equalsIgnoreCase("string")) {
+ data = HtmlStringUtils.addSingleQuotes(data);
+ }
+ builder.append(data);
+ if (index + 1 < values.size()) {
+ builder.append(",");
+ }
+ }
+ builder.append(" ]\n");
+ return builder.toString();
+ }
+
+ public void addDataRow(String... values) {
+ this.rowData.add(Arrays.asList(values));
+ }
+
+ public String getElementName() {
+ return elementName;
+ }
+
+ private String getCustomFunction() {
+ StringBuilder builder = new StringBuilder();
+ // TODO: Create Custom Colors
+ // function change(val){
+ // if(val > 0){
+ // return '<span style="color:green;">' + val + '</span>';
+ // }else if(val < 0){
+ // return '<span style="color:red;">' + val + '</span>';
+ // }
+ // return val;
+ // }
+ return builder.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTableColumnData.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTableColumnData.java
new file mode 100644
index 00000000000..df1a8712140
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlActiveTableColumnData.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.define.reports.html;
+
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.ui.define.utilities.HtmlStringUtils;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HtmlActiveTableColumnData {
+
+ private String name;
+ private String type;
+ private String dataFormat;
+ private boolean sortable;
+ private int width;
+
+ public HtmlActiveTableColumnData(String name) {
+ this(name, "");
+ }
+
+ public HtmlActiveTableColumnData(String name, String type) {
+ super();
+ this.name = name;
+ this.type = type;
+ this.dataFormat = "";
+ this.sortable = true;
+ this.width = name.length();
+ }
+
+ public String asMetaData() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append("name: ");
+ builder.append(escapeString(getName().toLowerCase()));
+ if (Strings.isValid(getType())) {
+ builder.append(", type: ");
+ builder.append(escapeString(getType()));
+ }
+ if (Strings.isValid(getDataFormat())) {
+ builder.append(", dateFormat: ");
+ builder.append(escapeString(getDataFormat()));
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+
+ public String asColumnCustomization() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("{");
+ builder.append("header: ");
+ builder.append("\"");
+ builder.append(HtmlStringUtils.escapeString(getName()));
+ builder.append("\"");
+ // builder.append(", width: ");
+ // builder.append(getWidth());
+ builder.append(", sortable: ");
+ builder.append(isSortable());
+
+ //TODO: Add special renderer calls
+
+ builder.append(", dataIndex: ");
+ builder.append(escapeString(getName().toLowerCase()));
+ builder.append("}");
+ return builder.toString();
+ }
+
+ private String escapeString(String value) {
+ return HtmlStringUtils.addSingleQuotes(HtmlStringUtils.escapeString(value));
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getDataFormat() {
+ return dataFormat;
+ }
+
+ public void setDataFormat(String dataFormat) {
+ this.dataFormat = dataFormat;
+ }
+
+ public boolean isSortable() {
+ return sortable;
+ }
+
+ public void setSortable(boolean sortable) {
+ this.sortable = sortable;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlTableReport.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlTableReport.java
new file mode 100644
index 00000000000..4a116f3ddba
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/html/HtmlTableReport.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.ui.define.reports.html;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HtmlTableReport {
+ private static String HTML_HEADER =
+ "<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"><head>";
+ private static String HTML_FOOTER = "</body></html>";
+
+ private String reportTitle;
+ private HtmlActiveTable activeTable;
+
+ public HtmlTableReport() {
+ this.activeTable = new HtmlActiveTable();
+ this.reportTitle = "Report";
+ }
+
+ public void setReportTitle(String title) {
+ this.reportTitle = title;
+ }
+
+ public HtmlActiveTable getActiveTable() {
+ return activeTable;
+ }
+
+ public String generate() throws IOException {
+ StringBuilder builder = new StringBuilder();
+ builder.append(HTML_HEADER);
+ builder.append("<title>");
+ builder.append(reportTitle);
+ builder.append("</title>");
+ builder.append(activeTable.generate());
+ builder.append("</head>");
+ builder.append(getReportSummary());
+ builder.append("<br/>");
+ builder.append("<div id=\"");
+ builder.append(activeTable.getElementName());
+ builder.append("\" style=\"width:100%;\">");
+ builder.append("</div>");
+ builder.append(HTML_FOOTER);
+ return builder.toString();
+ }
+
+ private String getReportSummary() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<div id=\"title\" class=\"x-grid3-hd-text\" style=\"color:#15428b;background:#ebf3fd;border:1px solid #aaccf6;\">");
+ builder.append("<table class=\" x-grid3-summary-row x-grid3-hd-text\" style=\"width:95%;color:#15428b;\">");
+ builder.append("<tr>");
+ builder.append("<td style=\"text-align:left; font-size:14px;\"><b>");
+ builder.append(reportTitle);
+ builder.append("</b></td>");
+ builder.append("<td style=\"text-align:right; font-size:14px;\"><b>");
+ builder.append(SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(new Date()));
+ builder.append("</b></td>");
+ builder.append("</tr>");
+ builder.append("</table>");
+ builder.append("</div>");
+ return builder.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ExcelReportWriter.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ExcelReportWriter.java
new file mode 100644
index 00000000000..5f91f01d6ea
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ExcelReportWriter.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.define.reports.output;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExcelReportWriter implements IReportWriter {
+ private ISheetWriter sheetWriter;
+ private StringWriter stringWriter;
+ private String result;
+ private String title;
+
+ public ExcelReportWriter() {
+ this.title = Long.toString(new Date().getTime());
+ this.stringWriter = new StringWriter();
+ try {
+ this.sheetWriter = new ExcelXmlWriter(stringWriter);
+ } catch (IOException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#getReport()
+ */
+ public String getReport() throws IOException {
+ if (result == null) {
+ generate();
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#length()
+ */
+ public int length() throws IOException {
+ if (result == null) {
+ generate();
+ }
+ return result.length();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeHeader(java.lang.String[])
+ */
+ public void writeHeader(String[] headers) {
+ try {
+ this.sheetWriter.startSheet(title, headers.length);
+ this.sheetWriter.writeRow(headers);
+ } catch (IOException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeRow(java.lang.String[])
+ */
+ public void writeRow(String... cellData) {
+ try {
+ this.sheetWriter.writeRow(cellData);
+ } catch (IOException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeTitle(java.lang.String)
+ */
+ public void writeTitle(String title) {
+ this.title = title;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeToOutput(java.io.OutputStream)
+ */
+ public void writeToOutput(OutputStream outputStream) throws IOException {
+ if (result == null) {
+ generate();
+ }
+ outputStream.write(result.getBytes("UTF-8"));
+ }
+
+ private void generate() throws IOException {
+ this.sheetWriter.endSheet();
+ this.sheetWriter.endWorkbook();
+ this.result = stringWriter.toString();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/HtmlReportWriter.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/HtmlReportWriter.java
new file mode 100644
index 00000000000..fedd63c6f6d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/HtmlReportWriter.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.ui.define.reports.output;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Date;
+import org.eclipse.osee.ote.ui.define.reports.html.HtmlActiveTable;
+import org.eclipse.osee.ote.ui.define.reports.html.HtmlActiveTableColumnData;
+import org.eclipse.osee.ote.ui.define.reports.html.HtmlTableReport;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HtmlReportWriter implements IReportWriter {
+
+ private HtmlTableReport report;
+ private String reportHtml;
+
+ public HtmlReportWriter() {
+ this.report = new HtmlTableReport();
+ report.getActiveTable().setTableTitle("Results");
+ }
+
+ public void writeTitle(String title) {
+ report.getActiveTable().setElementName("tbl" + new Date().getTime());
+ report.setReportTitle(title);
+ }
+
+ public void writeHeader(String[] headers) {
+ HtmlActiveTable table = report.getActiveTable();
+ String[] metadata = new String[headers.length];
+ Arrays.fill(metadata, "");
+ for (int index = 0; index < headers.length; index++) {
+ table.addColumn(new HtmlActiveTableColumnData(headers[index], metadata[index]));
+ }
+ }
+
+ public void writeRow(String... cellData) {
+ report.getActiveTable().addDataRow(cellData);
+ }
+
+ public int length() throws IOException {
+ if (reportHtml == null) {
+ generate();
+ }
+ return reportHtml.length();
+ }
+
+ public String getReport() throws IOException {
+ if (reportHtml == null) {
+ generate();
+ }
+ return reportHtml;
+ }
+
+ public void writeToOutput(OutputStream outputStream) throws IOException {
+ outputStream.write(getReport().getBytes("UTF-8"));
+ }
+
+ private void generate() throws IOException {
+ reportHtml = report.generate();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/IReportWriter.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/IReportWriter.java
new file mode 100644
index 00000000000..2083cebf3fa
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/IReportWriter.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.ui.define.reports.output;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IReportWriter {
+
+ public void writeTitle(String title);
+
+ public void writeHeader(String[] headers);
+
+ public void writeRow(String... cellData);
+
+ public int length() throws Exception;
+
+ public String getReport() throws IOException;
+
+ public void writeToOutput(OutputStream outputStream) throws IOException;
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFactory.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFactory.java
new file mode 100644
index 00000000000..4b8dfd32519
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFactory.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.ui.define.reports.output;
+
+import java.util.Date;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OutputFactory {
+ private static final String SEPARATOR = ".";
+
+ private OutputFactory() {
+ }
+
+ public static IReportWriter getReportWriter(OutputFormat format) {
+ IReportWriter toReturn = null;
+ switch (format) {
+ case EXCEL:
+ toReturn = new ExcelReportWriter();
+ break;
+ case PDF:
+ case HTML:
+ case RTF:
+ toReturn = new ReportWriter(format.name());
+ break;
+ default:
+ throw new IllegalArgumentException(String.format("Unsupported format [%s]", format));
+ }
+ return toReturn;
+ }
+
+ public static String getOutputFilename(OutputFormat format, String reportId) {
+ String extension = "";
+ switch (format) {
+ case HTML:
+ extension = "html";
+ break;
+ case EXCEL:
+ extension = "xml";
+ break;
+ case PDF:
+ extension = "pdf";
+ break;
+ case RTF:
+ extension = "rtf";
+ break;
+ default:
+ throw new IllegalArgumentException(String.format("Unsupported format [%s]", format));
+ }
+ StringBuilder builder = new StringBuilder(reportId);
+ builder.append(SEPARATOR);
+ builder.append(Long.toString(new Date().getTime()));
+ builder.append(SEPARATOR);
+ builder.append(extension);
+ return builder.toString();
+ }
+
+ public static String getContentType(OutputFormat format) {
+ String toReturn = "";
+ switch (format) {
+ case HTML:
+ toReturn = "text/html";
+ break;
+ case EXCEL:
+ toReturn = "application/excel";
+ break;
+ case PDF:
+ toReturn = "application/pdf";
+ break;
+ case RTF:
+ toReturn = "application/rtf";
+ break;
+ default:
+ throw new IllegalArgumentException(String.format("Unsupported format [%s]", format));
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFormat.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFormat.java
new file mode 100644
index 00000000000..7b2a7b60a66
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/OutputFormat.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.ui.define.reports.output;
+
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public enum OutputFormat {
+
+ HTML, PDF, RTF, EXCEL;
+
+ public static OutputFormat fromString(String value) {
+ OutputFormat toReturn = OutputFormat.HTML;
+ if (Strings.isValid(value)) {
+ try {
+ toReturn = OutputFormat.valueOf(value.toUpperCase());
+ } catch (Exception ex) {
+ toReturn = OutputFormat.HTML;
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ReportWriter.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ReportWriter.java
new file mode 100644
index 00000000000..86840a450bf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/reports/output/ReportWriter.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.ui.define.reports.output;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.core.util.TableWriterAdaptor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ReportWriter implements IReportWriter {
+ private TableWriterAdaptor tableWriterAdapter;
+ private ByteArrayOutputStream outputStream;
+
+ public ReportWriter(String writerId) {
+ try {
+ this.outputStream = new ByteArrayOutputStream();
+ this.tableWriterAdapter = new TableWriterAdaptor(writerId, outputStream);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#getReport()
+ */
+ public String getReport() throws IOException {
+ return outputStream.toString(TableWriterAdaptor.ENCODING);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#length()
+ */
+ public int length() throws Exception {
+ if (!tableWriterAdapter.isCompleted()) {
+ try {
+ tableWriterAdapter.openDocument();
+ tableWriterAdapter.writeDocument();
+ } finally {
+ tableWriterAdapter.close();
+ }
+ }
+ return outputStream.toByteArray().length;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeHeader(java.lang.String[])
+ */
+ public void writeHeader(String[] headers) {
+ try {
+ tableWriterAdapter.writeHeader(headers);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeRow(java.lang.String[])
+ */
+ public void writeRow(String... cellData) {
+ tableWriterAdapter.writeRow(cellData);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeTitle(java.lang.String)
+ */
+ public void writeTitle(String title) {
+ tableWriterAdapter.writeTitle(title);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.reports.output.IReportWriter#writeToOutput(java.io.OutputStream)
+ */
+ public void writeToOutput(OutputStream outputStream) throws IOException {
+ outputStream.write(this.outputStream.toByteArray());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/test/manager/TestRunArtifactOptions.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/test/manager/TestRunArtifactOptions.java
new file mode 100644
index 00000000000..aecb5a77069
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/test/manager/TestRunArtifactOptions.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.ui.define.test.manager;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.ote.define.TestRunStorageKey;
+import org.eclipse.osee.ote.ui.define.panels.GrayableBranchSelectionComposite;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunArtifactOptions implements IAdvancedPageContribution {
+
+ private GrayableBranchSelectionComposite panel;
+
+ public Control createControl(Composite parent) {
+ this.panel = new GrayableBranchSelectionComposite(parent, SWT.NONE);
+ this.panel.setFeatureEnabled(true);
+ return this.panel;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.IAdvancedPageOptionsWidget#load(org.eclipse.osee.ote.core.framework.data.IPropertyStore)
+ */
+ public void load(IPropertyStore propertyStore) {
+ boolean widgetEnabled = propertyStore.getBoolean(TestRunStorageKey.STORAGE_ENABLED);
+ String lastBranchSelected = propertyStore.get(TestRunStorageKey.SELECTED_BRANCH_ID);
+ String[] branchIds = propertyStore.getArray(TestRunStorageKey.BRANCH_IDS);
+
+ this.panel.restoreWidgetValues(widgetEnabled, branchIds, lastBranchSelected);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.IAdvancedPageOptionsWidget#save(org.eclipse.osee.ote.core.framework.data.IPropertyStore)
+ */
+ public void save(IPropertyStore propertyStore) {
+ propertyStore.put(TestRunStorageKey.STORAGE_ENABLED, this.panel.isBranchSelectEnabled());
+
+ propertyStore.put(TestRunStorageKey.BRANCH_IDS, this.panel.getBranchIds());
+
+ Branch branch = this.panel.getSelectedBranch();
+ int branchId = -1;
+ if (branch != null) {
+ branchId = branch.getBranchId();
+ }
+ propertyStore.put(TestRunStorageKey.SELECTED_BRANCH_ID, branchId);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#areSettingsValidForRun()
+ */
+ @Override
+ public boolean areSettingsValidForRun() {
+ boolean result = true;
+ if (this.panel.isBranchSelectEnabled() != false) {
+ result &= this.panel.getSelectedBranch() != null;
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#getErrorMessage()
+ */
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ if (areSettingsValidForRun() != true) {
+ builder.append("Artifact Upload: Please select a branch to upload test runs into.");
+ }
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#getPriority()
+ */
+ public int getPriority() {
+ return 2;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/CommitConfiguration.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/CommitConfiguration.java
new file mode 100644
index 00000000000..78bc977f996
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/CommitConfiguration.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.ui.define.utilities;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.skynet.core.User;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.relation.CoreRelationEnumeration;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CommitConfiguration {
+ private static final CommitConfiguration instance = new CommitConfiguration();
+
+ private CommitConfiguration() {
+ }
+
+ private boolean isUserAllowedToOverride() {
+ boolean isAllowed = false;
+
+ try {
+ User user = UserManager.getUser();
+ Collection<Artifact> teams = user.getRelatedArtifacts(CoreRelationEnumeration.TeamMember_Team);
+ for (Artifact team : teams) {
+ if (team.getDescriptiveName().equals("OSEE")) {
+ isAllowed = true;
+ }
+ }
+ } catch (Exception ex) {
+ // Do Nothing!
+ }
+ return isAllowed;
+ }
+
+ public static boolean isCommitOverrideAllowed() {
+ return instance.isUserAllowedToOverride();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/EditorUtility.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/EditorUtility.java
new file mode 100644
index 00000000000..6a9e9157d8f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/EditorUtility.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.ui.define.utilities;
+
+import java.io.File;
+import java.net.URL;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.osee.ote.define.jobs.RemoteResourceRequestJob;
+import org.eclipse.osee.ote.ui.define.reports.HttpReportRequest;
+import org.eclipse.osee.ote.ui.define.reports.output.OutputFactory;
+import org.eclipse.osee.ote.ui.define.reports.output.OutputFormat;
+import org.eclipse.swt.program.Program;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EditorUtility {
+
+ private EditorUtility() {
+ }
+
+ public static void openEditor(String reportId, String format) {
+ try {
+ OutputFormat outputFormat = OutputFormat.fromString(format);
+ String url = HttpReportRequest.getUrl(reportId, outputFormat.name(), "local");
+ String tempFileName = OutputFactory.getOutputFilename(outputFormat, reportId);
+ switch (outputFormat) {
+ case HTML:
+ openAsHtml(reportId, url);
+ break;
+ case EXCEL:
+ case PDF:
+ default:
+ openAsNative(tempFileName, url);
+ break;
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private static void openAsHtml(String fileName, String url) throws Exception {
+ IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+ IWebBrowser browser = browserSupport.createBrowser(IWorkbenchBrowserSupport.AS_EDITOR, fileName, fileName, "");
+ browser.openURL(new URL(url));
+ }
+
+ private static void openAsNative(String fileName, final String url) throws Exception {
+ Job job = new RemoteResourceRequestJob(url, fileName);
+ job.addJobChangeListener(new JobChangeAdapter() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
+ */
+ @Override
+ public void done(IJobChangeEvent event) {
+ org.eclipse.core.runtime.IStatus status = event.getResult();
+ if (status.equals(Status.OK_STATUS) || status.getCode() == Status.OK) {
+ IFile file = ((RemoteResourceRequestJob) event.getJob()).getDownloadedFile();
+ if (file != null && file.exists()) {
+ Program.launch(new File(file.getLocationURI()).getAbsolutePath());
+ }
+ }
+ }
+ });
+ job.schedule();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/HtmlStringUtils.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/HtmlStringUtils.java
new file mode 100644
index 00000000000..d2dd0e8a3b3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/HtmlStringUtils.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.ui.define.utilities;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class HtmlStringUtils {
+ private HtmlStringUtils() {
+
+ }
+
+ public static String addSingleQuotes(String value) {
+ return "'" + value + "'";
+ }
+
+ public static String escapeString(String value) {
+ return value.replaceAll("'", "\\'");
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/SelectionHelper.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/SelectionHelper.java
new file mode 100644
index 00000000000..9bc778f6946
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/utilities/SelectionHelper.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.ui.define.utilities;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.viewers.data.ArtifactItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SelectionHelper {
+
+ private static SelectionHelper instance = null;
+
+ private SelectionHelper() {
+ }
+
+ public static SelectionHelper getInstance() {
+ if (instance == null) {
+ instance = new SelectionHelper();
+ }
+ return instance;
+ }
+
+ public TestRunOperator getSelection(StructuredViewer viewer) {
+ TestRunOperator toReturn = null;
+ if (viewer != null) {
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+ if (selection != null && selection.size() == 1) {
+ Object object = selection.getFirstElement();
+ TestRunOperator operator = asTestRunOperator(object);
+ if (operator != null && operator.hasValidArtifact() != false) {
+ toReturn = operator;
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ public TestRunOperator asTestRunOperator(Object object) {
+ TestRunOperator operator = null;
+ if (object instanceof ArtifactItem) {
+ ArtifactItem artItem = (ArtifactItem) object;
+ operator = artItem.getOperator();
+ }
+ return operator;
+ }
+
+ public List<TestRunOperator> getSelections(StructuredViewer viewer) {
+ List<TestRunOperator> toReturn = new ArrayList<TestRunOperator>();
+ if (viewer != null) {
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+ if (selection != null && selection.isEmpty() != true) {
+ Iterator<?> iterator = selection.iterator();
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+ TestRunOperator operator = asTestRunOperator(object);
+ if (operator != null && operator.hasValidArtifact() != false) {
+ toReturn.add(operator);
+ }
+ }
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/DragDropHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/DragDropHandler.java
new file mode 100644
index 00000000000..c326e5db096
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/DragDropHandler.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.viewers;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer;
+import org.eclipse.osee.ote.define.AUTOGEN.OTE_SKYNET_ARTIFACTS;
+import org.eclipse.osee.ote.define.jobs.OutfileToArtifactJob;
+import org.eclipse.osee.ote.define.utilities.OutfileParserExtensionManager;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.dialogs.BranchComboDialog;
+import org.eclipse.osee.ote.ui.define.jobs.AddArtifactsToViewerJob;
+import org.eclipse.osee.ote.ui.define.jobs.ReportErrorsJob;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.Transfer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DragDropHandler {
+
+ private XViewerDataManager viewerDataManager;
+
+ public DragDropHandler(XViewerDataManager viewerDataManager) {
+ this.viewerDataManager = viewerDataManager;
+ setupDropSupport();
+ setupDragSupport();
+ }
+
+ private void setupDropSupport() {
+ DropTarget dropTarget = new DropTarget(viewerDataManager.getControl(), DND.DROP_COPY);
+ dropTarget.setTransfer(new Transfer[] {LocalSelectionTransfer.getTransfer(), ArtifactTransfer.getInstance(),});
+ dropTarget.addDropListener(new DropTargetAdapter() {
+
+ public void drop(DropTargetEvent event) {
+ performDrop(event);
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ event.detail = DND.DROP_COPY;
+ }
+ });
+ }
+
+ private void setupDragSupport() {
+ DragSource dragSource = new DragSource(viewerDataManager.getControl(), DND.DROP_COPY);
+ dragSource.setTransfer(new Transfer[] {ArtifactTransfer.getInstance()});
+ dragSource.addDragListener(new DragSourceListener() {
+
+ public void dragFinished(DragSourceEvent event) {
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ List<Artifact> artifacts = viewerDataManager.getSelectedArtifacts();
+ if (artifacts.size() > 0) {
+ event.data =
+ new ArtifactData(artifacts.toArray(new Artifact[artifacts.size()]), "", TestRunView.VIEW_ID);
+ }
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ event.doit = false;
+ List<Artifact> artifacts = viewerDataManager.getSelectedArtifacts();
+ if (artifacts.size() > 0) {
+ event.doit = true;
+ }
+ }
+ });
+
+ }
+
+ private void performDrop(DropTargetEvent e) {
+ Object object = e.data;
+ if (object instanceof ArtifactData) {
+ handleArtifactDrops((ArtifactData) object);
+ } else if (object instanceof TreeSelection) {
+ StructuredSelection selection = ((StructuredSelection) object);
+ if (selection.size() > 0) {
+ URI[] iFiles = toResourceArray(selection.toArray());
+ if (iFiles.length > 0) {
+ try {
+ handleResourceDrops(iFiles);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ } else {
+ OseeLog.log(OteUiDefinePlugin.class, Level.WARNING, "No valid files dropped");
+ }
+ }
+ }
+ }
+
+ private URI[] toResourceArray(Object[] objects) {
+ List<URI> toReturn = new ArrayList<URI>();
+ for (Object object : objects) {
+ if (object instanceof IAdaptable) {
+ Object resource = ((IAdaptable) object).getAdapter(IResource.class);
+ if (resource != null) {
+ IResource iResource = (IResource) resource;
+ if (isResourceAllowed(iResource)) {
+ toReturn.add(iResource.getLocationURI());
+ }
+ }
+ }
+ }
+ return toReturn.toArray(new URI[toReturn.size()]);
+ }
+
+ private boolean isResourceAllowed(IResource resource) {
+ if ((resource.getType() == IResource.FILE) && resource.isAccessible()) {
+ String toCheck = resource.getFileExtension();
+ try {
+ for (String extension : OutfileParserExtensionManager.getInstance().getSupportedExtensions()) {
+ if (toCheck.equalsIgnoreCase(extension)) {
+ return true;
+ }
+ }
+ } catch (OseeCoreException ex) {
+ // Do Nothing
+ }
+ }
+ return false;
+
+ }
+
+ private void handleArtifactDrops(ArtifactData artifactData) {
+ Artifact[] artifactsDropped = artifactData.getArtifacts();
+ Set<Artifact> artifactsToAdd = new HashSet<Artifact>();
+ for (Artifact artifact : artifactsDropped) {
+ if (artifact.isOfType(OTE_SKYNET_ARTIFACTS.TEST_RUN.getName())) {
+ artifactsToAdd.add(artifact);
+ }
+ }
+ addArtifactsToTable(new ArrayList<Artifact>(artifactsToAdd));
+ }
+
+ private void handleResourceDrops(URI[] iFiles) throws OseeCoreException {
+ Branch branch = BranchComboDialog.getBranchFromUser();
+ if (branch != null) {
+ OutfileToArtifactJob artifactJob = new OutfileToArtifactJob(branch, iFiles);
+ artifactJob.addJobChangeListener(new JobChangeAdapter() {
+
+ public void done(IJobChangeEvent event) {
+ IStatus status = event.getResult();
+ if (status.equals(Status.OK_STATUS)) {
+ OutfileToArtifactJob job = ((OutfileToArtifactJob) event.getJob());
+ Artifact[] results = job.getResults();
+ URI[] unparseable = job.getUnparseableFiles();
+ reportUnparseableItems(unparseable);
+ addArtifactsToTable(Arrays.asList(results));
+ }
+ }
+ });
+ artifactJob.schedule();
+ }
+ }
+
+ private void addArtifactsToTable(final List<Artifact> artifacts) {
+ Job job = new AddArtifactsToViewerJob(viewerDataManager, artifacts);
+ job.schedule();
+ }
+
+ private void reportUnparseableItems(final URI[] unparseable) {
+ if (unparseable.length > 0) {
+ String title = "Artifact Drop Error";
+ String message = "The following file(s) had errors during the parsing operation: ";
+ ReportErrorsJob.openError(title, message, (Object[]) unparseable);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/IDataChangedListener.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/IDataChangedListener.java
new file mode 100644
index 00000000000..74558641fbe
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/IDataChangedListener.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.define.viewers;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IDataChangedListener {
+
+ public abstract void onDataChanged();
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewer.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewer.java
new file mode 100644
index 00000000000..8edc53c88c1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewer.java
@@ -0,0 +1,299 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.viewers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+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.resource.ImageDescriptor;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.jobs.CommitTestRunJob;
+import org.eclipse.osee.ote.ui.define.utilities.CommitConfiguration;
+import org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler;
+import org.eclipse.osee.ote.ui.define.viewers.actions.LaunchReportsAction;
+import org.eclipse.osee.ote.ui.define.viewers.actions.OpenAssociatedOutfile;
+import org.eclipse.osee.ote.ui.define.viewers.actions.OpenAssociatedScript;
+import org.eclipse.osee.ote.ui.define.viewers.actions.OpenInArtifactEditor;
+import org.eclipse.osee.ote.ui.define.viewers.data.ArtifactItem;
+import org.eclipse.osee.ote.ui.define.viewers.data.DataItemContentProvider;
+import org.eclipse.osee.ote.ui.define.viewers.data.DataItemLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunXViewer extends XViewer {
+
+ private static final ImageDescriptor COMMIT_IMAGE = OteUiDefinePlugin.getInstance().getImageDescriptor("commit.gif");
+ private static final ImageDescriptor REMOVE_IMAGE = OteUiDefinePlugin.getInstance().getImageDescriptor("remove.gif");
+ private static final ImageDescriptor REMOVE_ALL_IMAGE =
+ OteUiDefinePlugin.getInstance().getImageDescriptor("removeAll.gif");
+ private XViewerDataManager dataManager;
+ private final List<AbstractActionHandler> actionList = new ArrayList<AbstractActionHandler>();
+ private Action editDisposition;
+
+ public TestRunXViewer(Composite parent) {
+ super(parent, //SWT.VIRTUAL |
+ SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, new TestRunXViewerFactory());
+ setSorter(null);
+ setContentProvider(new DataItemContentProvider());
+ setLabelProvider(new DataItemLabelProvider(this));
+ setUseHashlookup(true);
+ setupActions();
+ getMenuManager().addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ customActions();
+ }
+ });
+ }
+
+ private void customActions() {
+ MenuManager manager = getMenuManager();
+ manager.insertBefore(XViewer.MENU_GROUP_PRE, editDisposition);
+ manager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+ manager.add(new Separator());
+ for (int index = 0; index < actionList.size(); index++) {
+ Action action = actionList.get(index);
+ if (index + 1 >= actionList.size() || index + 2 >= actionList.size() || index == 3) {
+ manager.add(new Separator());
+ }
+ manager.add(action);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewer#createSupportWidgets(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected void createSupportWidgets(Composite parent) {
+ super.createSupportWidgets(parent);
+ this.dataManager = new XViewerDataManager(this);
+ new DragDropHandler(dataManager);
+ }
+
+ public void registerListener(IDataChangedListener listener) {
+ dataManager.registerListener(listener);
+ }
+
+ public void deRegisterListener(IDataChangedListener listener) {
+ dataManager.deRegisterListener(listener);
+ }
+
+ private void setupActions() {
+ try {
+ editDisposition = new Action("Edit Disposition", Action.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ try {
+ handleChangeDisposition();
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+ };
+
+ actionList.add(new OpenInArtifactEditor(this, "Open as Artifact"));
+ actionList.add(new OpenAssociatedOutfile(this, "Open Outfile"));
+ actionList.add(new OpenAssociatedScript(this, "Open Script"));
+ actionList.add(new RemoveAction("Remove", REMOVE_IMAGE));
+ actionList.add(new RemoveAllAction("Remove All", REMOVE_ALL_IMAGE));
+ actionList.add(new LaunchReportsAction(this, "Reports..."));
+ actionList.add(new CommitAction("Commit Test Runs...", COMMIT_IMAGE));
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ @Override
+ public void refresh() {
+ super.refresh();
+ try {
+ if (getTree() == null || getTree().isDisposed() || actionList == null) return;
+ for (AbstractActionHandler action : actionList) {
+ action.updateState();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private final class CommitAction extends AbstractActionHandler {
+
+ public CommitAction(String text, ImageDescriptor image) throws Exception {
+ super(TestRunXViewer.this, text, image);
+ }
+
+ @Override
+ public void run() {
+ Artifact[] preSelected = dataManager.getSelectedForCommit();
+ Artifact[] unSelectable = dataManager.getUnCommitable();
+
+ Job job = new CommitTestRunJob(getAllItemsList(), preSelected, unSelectable, isOverrideAllowed());
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ Artifact[] committed = ((CommitTestRunJob) event.getJob()).getCommitted();
+ dataManager.removeFromCommitable(Arrays.asList(committed));
+ }
+ });
+ job.schedule();
+ }
+
+ @Override
+ public void updateState() {
+ boolean haveUnCommitableItems = dataManager.getUnCommitable().length > 0;
+ boolean haveCommitableItems = dataManager.getAllCommitable().length > 0;
+ this.setEnabled(haveCommitableItems || (CommitConfiguration.isCommitOverrideAllowed() && haveUnCommitableItems));
+ }
+
+ private boolean isOverrideAllowed() {
+ return CommitConfiguration.isCommitOverrideAllowed();
+ }
+
+ private Artifact[] getAllItemsList() {
+ List<Artifact> allItems = new ArrayList<Artifact>();
+ allItems.addAll(Arrays.asList(dataManager.getAllCommitable()));
+ if (isOverrideAllowed() != false) {
+ allItems.addAll(Arrays.asList(dataManager.getUnCommitable()));
+ }
+ return allItems.toArray(new Artifact[allItems.size()]);
+ }
+ }
+
+ private final class RemoveAllAction extends AbstractActionHandler {
+
+ public RemoveAllAction(String text, ImageDescriptor image) throws Exception {
+ super(TestRunXViewer.this, text, image);
+ }
+
+ @Override
+ public void run() {
+ dataManager.removeAll();
+ }
+
+ @Override
+ public void updateState() {
+ this.setEnabled(dataManager.isEmpty() != true);
+ }
+ }
+
+ private final class RemoveAction extends AbstractActionHandler {
+
+ public RemoveAction(String text, ImageDescriptor image) throws Exception {
+ super(TestRunXViewer.this, text, image);
+ }
+
+ @Override
+ public void run() {
+ dataManager.removeSelected();
+ }
+
+ @Override
+ public void updateState() {
+ this.setEnabled(getSelection().isEmpty() != true);
+ }
+ }
+
+ public boolean handleChangeDisposition() throws OseeCoreException {
+ if (!getSelectedArtifacts().isEmpty()) {
+ return setDisposition(getSelectedArtifacts());
+ }
+ return false;
+ }
+
+ @Override
+ public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
+ Object holder = treeItem.getData();
+ boolean returnValue = false;
+ if (holder instanceof ArtifactItem) {
+ if (xCol.equals(TestRunXViewerFactory.DISPOSITION)) {
+ ArrayList<Artifact> list = new ArrayList<Artifact>();
+ list.add(((ArtifactItem) holder).getData());
+ try {
+ returnValue = setDisposition(list);
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return returnValue;
+ }
+
+ private boolean setDisposition(ArrayList<Artifact> selectedArtifacts) throws OseeCoreException {
+ boolean returnValue = false;
+ ArrayList<Artifact> dispositionArtifacts = new ArrayList<Artifact>();
+ for (Artifact artifact : selectedArtifacts) {
+ if (artifact.isOfType("Test Run")) {
+ String name = artifact.getSoleAttributeValueAsString("Name", "");
+ if (name != "") {
+ Artifact dispoArtifact = null;
+ try {
+ dispoArtifact =
+ ArtifactQuery.getArtifactFromTypeAndAttribute("Test Run Disposition", "Name", name, artifact.getBranch());
+ } catch (ArtifactDoesNotExist ex) {
+ dispoArtifact = ArtifactTypeManager.getType("Test Run Disposition").makeNewArtifact(artifact.getBranch());
+ dispoArtifact.setDescriptiveName(name);
+ }
+ if (dispoArtifact != null) {
+ dispositionArtifacts.add(dispoArtifact);
+ }
+ }
+ }
+ }
+ try {
+ returnValue =
+ ArtifactPromptChange.promptChangeStringAttribute("Disposition", "Edit Disposition",
+ dispositionArtifacts, true, false);
+ refresh();
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ return returnValue;
+ }
+
+ public ArrayList<Artifact> getSelectedArtifacts() {
+ ArrayList<Artifact> arts = new ArrayList<Artifact>();
+ TreeItem items[] = getTree().getSelection();
+ if (items.length > 0) {
+ for (TreeItem item : items) {
+ if (item.getData() instanceof ArtifactItem) {
+ arts.add(((ArtifactItem) item.getData()).getData());
+ }
+ }
+ }
+ return arts;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewerFactory.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewerFactory.java
new file mode 100644
index 00000000000..1cd2e7845b8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/TestRunXViewerFactory.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.ui.define.viewers;
+
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.SkynetXViewerFactory;
+import org.eclipse.osee.framework.ui.skynet.widgets.xviewer.skynet.column.XViewerArtifactNameColumn;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.swt.SWT;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunXViewerFactory extends SkynetXViewerFactory {
+
+ private static XViewerArtifactNameColumn nameCol = new XViewerArtifactNameColumn("Name");
+ public static final XViewerColumn DISPOSITION =
+ new XViewerColumn("ote.test.run.view.Disposition", "Disposition", 300, SWT.LEFT, true, SortDataType.String,
+ true, null);
+
+ public TestRunXViewerFactory() {
+ super(TestRunView.VIEW_ID);
+ registerAllAttributeColumns();
+ registerColumn(new XViewerColumn("ote.test.run.view.Name", "Name", 150, SWT.LEFT, true, SortDataType.String,
+ false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Passed", "Passed", 50, SWT.LEFT, true, SortDataType.Integer,
+ false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Failed", "Failed", 50, SWT.LEFT, true, SortDataType.Integer,
+ false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Total Test Points", "Total Test Points", 50, SWT.LEFT, false,
+ SortDataType.Integer, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Status", "Status", 150, SWT.LEFT, true, SortDataType.String,
+ false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Script Aborted", "Script Aborted", 150, SWT.LEFT, false,
+ SortDataType.Boolean, false, null));
+
+ registerColumn(new XViewerColumn("ote.test.run.view.Ran In Batch Mode", "Ran In Batch Mode", 150, SWT.LEFT,
+ false, SortDataType.Boolean, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Is Batch Mode Allowed", "Is Batch Mode Allowed", 150,
+ SWT.LEFT, false, SortDataType.Boolean, false, null));
+
+ registerColumn(new XViewerColumn("ote.test.run.view.Start Date", "Start Date", 150, SWT.LEFT, false,
+ SortDataType.Date, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.End Date", "End Date", 150, SWT.LEFT, false,
+ SortDataType.Date, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Elapsed Date", "Elapsed Date", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+
+ registerColumn(new XViewerColumn("ote.test.run.view.Processor ID", "Processor ID", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Build Id", "Build Id", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Qualification Level", "Qualification Level", 150, SWT.LEFT,
+ true, SortDataType.String, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Last Author", "Last Author", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Last Modified Date", "Last Modified Date", 150, SWT.LEFT,
+ false, SortDataType.Date, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.Revision", "Revision", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+
+ registerColumn(new XViewerColumn("ote.test.run.view.OS Name", "OS Name", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+ registerColumn(new XViewerColumn("ote.test.run.view.User ID", "User ID", 150, SWT.LEFT, false,
+ SortDataType.String, false, null));
+ registerColumn(DISPOSITION);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.widgets.xviewer.XViewerFactory#getDefaultTableCustomizeData()
+ */
+ @Override
+ public CustomizeData getDefaultTableCustomizeData() {
+ CustomizeData custData = new CustomizeData();
+ custData.getSortingData().setSortingNames("ote.test.run.view.Name");
+ custData.getColumnData().setColumns(getColumns());
+ custData.setNameSpace(getNamespace());
+ custData.setName("Artifacts");
+ return custData;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/XViewerDataManager.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/XViewerDataManager.java
new file mode 100644
index 00000000000..8ff12cb9570
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/XViewerDataManager.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.viewers;
+
+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;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.db.connection.exception.AttributeDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.framework.ui.skynet.artifact.massEditor.MassXViewerFactory;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.viewers.data.ArtifactItem;
+import org.eclipse.osee.ote.ui.define.viewers.data.BranchItem;
+import org.eclipse.osee.ote.ui.define.viewers.data.DataItem;
+import org.eclipse.osee.ote.ui.define.viewers.data.ScriptItem;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XViewerDataManager {
+
+ private final XViewer xViewer;
+ private final List<DataItem> commitableItems;
+ private final List<DataItem> uncommitableItems;
+ private final Map<Branch, DataItem> branchMap;
+ private final List<DataItem> backingData;
+ private final Collection<IDataChangedListener> listeners;
+ private boolean isInitialized;
+
+ public XViewerDataManager(XViewer xViewer) {
+ super();
+ this.backingData = new ArrayList<DataItem>();
+ this.isInitialized = false;
+ this.xViewer = xViewer;
+ this.branchMap = new HashMap<Branch, DataItem>();
+ this.commitableItems = new ArrayList<DataItem>();
+ this.uncommitableItems = new ArrayList<DataItem>();
+ this.listeners = Collections.synchronizedSet(new HashSet<IDataChangedListener>());
+ }
+
+ private void ensureInitialized() {
+ if (isInitialized != true) {
+ isInitialized = true;
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ xViewer.setInput(backingData);
+ }
+ });
+ }
+ }
+
+ public void addArtifacts(IProgressMonitor monitor, final List<Artifact> artifacts) throws OseeCoreException, AttributeDoesNotExist {
+ if (branchMap.size() == 0) {
+ if (xViewer.getXViewerFactory() instanceof MassXViewerFactory) {
+ ((MassXViewerFactory) xViewer.getXViewerFactory()).registerAllAttributeColumnsForArtifacts(artifacts, true);
+ }
+ }
+ int total = artifacts.size();
+ for (int index = 0; index < artifacts.size(); index++) {
+ Artifact artifact = artifacts.get(index);
+ monitor.subTask(String.format("Adding to Table: [%s] [%s of %s]", artifact.getDescriptiveName(), index + 1,
+ total));
+
+ DataItem branchItem = getBranchItem(artifact);
+ DataItem scriptItem = getScriptItem(branchItem, artifact);
+
+ ArtifactItem tempItem = new ArtifactItem(xViewer, artifact, null);
+
+ DataItem itemFound = scriptItem.getChild(tempItem.getKey());
+ if (itemFound == null) {
+ scriptItem.addChild(tempItem.getKey(), tempItem);
+ tempItem.setParent(scriptItem);
+ TestRunOperator operator = tempItem.getOperator();
+ if (operator.isFromLocalWorkspace()) {
+ if (operator.isCommitAllowed()) {
+ commitableItems.add(tempItem);
+ } else {
+ uncommitableItems.add(tempItem);
+ }
+ }
+ }
+ monitor.worked(1);
+ }
+
+ refresh();
+ }
+
+ private void refresh() {
+ ensureInitialized();
+ notifyOnDataChanged();
+
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ xViewer.refresh();
+ };
+ });
+ }
+
+ private DataItem getScriptItem(DataItem branchItem, Artifact artifact) throws OseeCoreException {
+ TestRunOperator testRunArtifact = new TestRunOperator(artifact);
+ DataItem tempItem = new ScriptItem(testRunArtifact.getScriptUrl(), testRunArtifact.getScriptRevision(), null);
+ DataItem scriptItem = branchItem.getChild(tempItem.getKey());
+ if (scriptItem == null) {
+ scriptItem = tempItem;
+ scriptItem.setParent(branchItem);
+ branchItem.addChild(scriptItem.getKey(), scriptItem);
+ }
+ return scriptItem;
+ }
+
+ private DataItem getBranchItem(Artifact artifact) {
+ Branch branch = artifact.getBranch();
+ DataItem toReturn = branchMap.get(branch);
+ if (toReturn == null) {
+ toReturn = new BranchItem(branch, null);
+ branchMap.put(branch, toReturn);
+ backingData.add(toReturn);
+ }
+ return toReturn;
+ }
+
+ private void removeHelper(DataItem item) {
+ if (item != null) {
+ DataItem parent = item.getParent();
+ if (parent != null) {
+ parent.removeChild(item);
+ if (parent.hasChildren() != true) {
+ removeHelper(parent);
+ parent.dispose();
+ }
+ } else {
+ branchMap.remove(item.getKey());
+ backingData.remove(item);
+ }
+ }
+ }
+
+ public void removeSelected() {
+ List<DataItem> items = getSelected();
+ for (DataItem item : items) {
+ removeHelper(item);
+ item.dispose();
+ commitableItems.remove(item);
+ uncommitableItems.remove(item);
+ }
+ refresh();
+ }
+
+ public void removeAll() {
+ commitableItems.clear();
+ uncommitableItems.clear();
+ for (DataItem dataItem : branchMap.values()) {
+ dataItem.dispose();
+ }
+ branchMap.clear();
+ backingData.clear();
+ refresh();
+ }
+
+ public Control getControl() {
+ return xViewer.getTree();
+ }
+
+ private List<DataItem> getSelected() {
+ List<DataItem> toReturn = new ArrayList<DataItem>();
+ TreeItem items[] = xViewer.getTree().getSelection();
+ if (items.length > 0) {
+ for (TreeItem item : items) {
+ toReturn.add((DataItem) item.getData());
+ }
+ }
+ return toReturn;
+ }
+
+ public List<Artifact> getSelectedArtifacts() {
+ List<Artifact> toReturn = new ArrayList<Artifact>();
+ for (DataItem item : getSelected()) {
+ Object object = item.getData();
+ if (object instanceof Artifact) {
+ toReturn.add((Artifact) object);
+ }
+ }
+ return toReturn;
+ }
+
+ public Artifact[] getUnCommitable() {
+ return getArtifactsFromDataItemList(uncommitableItems);
+ }
+
+ public Artifact[] getAllCommitable() {
+ return getArtifactsFromDataItemList(commitableItems);
+ }
+
+ private Artifact[] getArtifactsFromDataItemList(List<DataItem> sourceList) {
+ List<Artifact> toReturn = new ArrayList<Artifact>();
+ for (DataItem item : sourceList) {
+ toReturn.add((Artifact) (item.getData()));
+ }
+ return toReturn.toArray(new Artifact[toReturn.size()]);
+ }
+
+ public Artifact[] getSelectedForCommit() {
+ List<Artifact> toReturn = new ArrayList<Artifact>();
+ for (DataItem item : getSelected()) {
+ if (commitableItems.contains(item)) {
+ toReturn.add((Artifact) (item.getData()));
+ }
+ }
+ return toReturn.toArray(new Artifact[toReturn.size()]);
+ }
+
+ public void removeFromCommitable(final Collection<Artifact> artifacts) {
+ removeArtifactsFromDataItemList(commitableItems, artifacts);
+ removeArtifactsFromDataItemList(uncommitableItems, artifacts);
+ refresh();
+ }
+
+ private void removeArtifactsFromDataItemList(List<DataItem> sourceList, final Collection<Artifact> artifactsToRemove) {
+ List<DataItem> itemsToRemove = new ArrayList<DataItem>();
+ for (DataItem item : sourceList) {
+ Object object = item.getData();
+ if (artifactsToRemove.contains(object)) {
+ itemsToRemove.add(item);
+ }
+ }
+ sourceList.removeAll(itemsToRemove);
+ }
+
+ private void notifyOnDataChanged() {
+ synchronized (listeners) {
+ for (IDataChangedListener listener : listeners) {
+ listener.onDataChanged();
+ }
+ }
+ }
+
+ public void registerListener(IDataChangedListener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ }
+
+ public void deRegisterListener(IDataChangedListener listener) {
+ synchronized (listeners) {
+ if (listeners.contains(listener)) {
+ listeners.remove(listener);
+ }
+ }
+ }
+
+ public boolean isEmpty() {
+ return branchMap.size() == 0;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/AbstractActionHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/AbstractActionHandler.java
new file mode 100644
index 00000000000..43efbd33f0e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/AbstractActionHandler.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.ui.define.viewers.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class AbstractActionHandler extends Action implements ISelectionChangedListener {
+
+ private final StructuredViewer viewer;
+
+ public AbstractActionHandler(StructuredViewer viewer, String text) throws Exception {
+ super(text);
+ updateState();
+ this.viewer = viewer;
+ viewer.addSelectionChangedListener(this);
+ }
+
+ public AbstractActionHandler(StructuredViewer viewer, String text, ImageDescriptor image) throws Exception {
+ super(text, image);
+ updateState();
+ this.viewer = viewer;
+ viewer.addSelectionChangedListener(this);
+ }
+
+ protected StructuredViewer getViewer() {
+ return viewer;
+ }
+
+ public abstract void updateState() throws Exception;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ try {
+ updateState();
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ };
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/EditDispositionAction.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/EditDispositionAction.java
new file mode 100644
index 00000000000..dac5d1215cc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/EditDispositionAction.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.ui.define.viewers.actions;
+
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.utilities.SelectionHelper;
+
+/**
+ * @author Theron Virgin
+ */
+public class EditDispositionAction extends AbstractActionHandler {
+
+ public EditDispositionAction(StructuredViewer viewer, String text) throws Exception {
+ super(viewer, text);
+ }
+
+ public EditDispositionAction(StructuredViewer viewer, String text, ImageDescriptor image) throws Exception {
+ super(viewer, text, image);
+ }
+
+ @Override
+ public void run() {
+ try {
+ TestRunOperator operator = SelectionHelper.getInstance().getSelection(getViewer());
+ if (isValidSelection(operator)) {
+ Artifact artifact = operator.getTestRunArtifact();
+ checkPermissions(artifact);
+ ArtifactEditor.editArtifact(artifact);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, "Unable to open artifact.", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler#updateState()
+ */
+ @Override
+ public void updateState() throws OseeCoreException {
+ TestRunOperator operator = SelectionHelper.getInstance().getSelection(getViewer());
+ setEnabled(isValidSelection(operator));
+ }
+
+ private boolean isValidSelection(TestRunOperator operator) throws OseeCoreException {
+ return operator != null && operator.hasValidArtifact() && operator.isFromLocalWorkspace() != true;
+ }
+
+ private void checkPermissions(Artifact artifact) throws OseeCoreException {
+ if (true != AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ throw new OseeArgumentException(String.format("The user %s does not have read access to %s",
+ UserManager.getUser(), artifact));
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/LaunchReportsAction.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/LaunchReportsAction.java
new file mode 100644
index 00000000000..7c01ffb04c5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/LaunchReportsAction.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.ui.define.viewers.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.ote.ui.define.dialogs.ReportsDialog;
+import org.eclipse.osee.ote.ui.define.utilities.EditorUtility;
+import org.eclipse.osee.ote.ui.define.utilities.SelectionHelper;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LaunchReportsAction extends AbstractActionHandler {
+
+ public LaunchReportsAction(StructuredViewer viewer, String text) throws Exception {
+ super(viewer, text);
+ }
+
+ public LaunchReportsAction(StructuredViewer viewer, String text, ImageDescriptor image) throws Exception {
+ super(viewer, text, image);
+ }
+
+ @Override
+ public void run() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ ReportsDialog dialog = new ReportsDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell());
+ int result = dialog.open();
+ if (result == Window.OK) {
+ String reportId = dialog.getReportSelected();
+ String format = dialog.getReportFormat();
+ EditorUtility.openEditor(reportId, format);
+ }
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler#updateState()
+ */
+ @Override
+ public void updateState() {
+ if (getViewer() != null) {
+ setEnabled(SelectionHelper.getInstance().getSelections(getViewer()).size() > 0);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedOutfile.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedOutfile.java
new file mode 100644
index 00000000000..7f881cb2162
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedOutfile.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.viewers.actions;
+
+import java.net.URI;
+import java.util.logging.Level;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.utilities.SelectionHelper;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenAssociatedOutfile extends AbstractActionHandler {
+
+ public OpenAssociatedOutfile(StructuredViewer viewer, String text) throws Exception {
+ super(viewer, text);
+ }
+
+ public OpenAssociatedOutfile(StructuredViewer viewer, String text, ImageDescriptor image) throws Exception {
+ super(viewer, text, image);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler#updateState()
+ */
+ @Override
+ public void updateState() {
+ TestRunOperator artifact = SelectionHelper.getInstance().getSelection(getViewer());
+ setEnabled(artifact != null);
+ }
+
+ @Override
+ public void run() {
+ TestRunOperator operator = SelectionHelper.getInstance().getSelection(getViewer());
+ try {
+ String targetFile = operator.getOutfileUrl();
+ openEditorUtility(new URI(targetFile));
+ } catch (Exception ex) {
+ handleException(ex);
+ }
+ }
+
+ private void openEditorUtility(final URI resource) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IDE.openEditorOnFileStore(page, EFS.getStore(resource));
+ } catch (Exception ex) {
+ handleException(ex);
+ }
+ }
+ });
+ }
+
+ private void handleException(Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.WARNING, "Unable to open outfile.", ex);
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MessageDialog.openError(shell, "Open Outfile", "Unable to open outfile.");
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedScript.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedScript.java
new file mode 100644
index 00000000000..895c156381d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenAssociatedScript.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.ui.define.viewers.actions;
+
+import java.net.URL;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.svn.VersionControl;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.utilities.SelectionHelper;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenAssociatedScript extends AbstractActionHandler {
+ private static final SelectionHelper selectionHelper = SelectionHelper.getInstance();
+
+ public OpenAssociatedScript(StructuredViewer viewer, String text) throws Exception {
+ super(viewer, text);
+ }
+
+ public OpenAssociatedScript(StructuredViewer viewer, String text, ImageDescriptor image) throws Exception {
+ super(viewer, text, image);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler#updateState()
+ */
+ @Override
+ public void updateState() {
+ TestRunOperator operator = selectionHelper.getSelection(getViewer());
+ setEnabled(operator != null);
+ }
+
+ @Override
+ public void run() {
+ try {
+ TestRunOperator operator = selectionHelper.getSelection(getViewer());
+ if (operator.isScriptRevisionValid()) {
+ openRemoteScript(operator.getScriptUrl(), operator.getScriptRevision());
+ } else {
+ handleException();
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
+ }
+ }
+
+ private void handleException() {
+ MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(), "Open Script",
+ "Unable to open script with invalid url.");
+ }
+
+ private void openRemoteScript(String scriptUrl, String revision) {
+ try {
+ VersionControl.getInstance().getLocalFileMatchingRepositoryUrl(scriptUrl, revision);
+
+ URL urlToOpen = new URL(scriptUrl);
+ if (urlToOpen != null) {
+ IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+ IWebBrowser browser =
+ browserSupport.createBrowser(IWorkbenchBrowserSupport.AS_EDITOR, "org.eclipse.ui.browser.editor",
+ scriptUrl, "");
+ browser.openURL(urlToOpen);
+ }
+ } catch (Exception ex) {
+ handleException();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenInArtifactEditor.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenInArtifactEditor.java
new file mode 100644
index 00000000000..201a0f7adf1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/actions/OpenInArtifactEditor.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.ui.define.viewers.actions;
+
+import java.util.logging.Level;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.skynet.core.access.AccessControlManager;
+import org.eclipse.osee.framework.skynet.core.access.PermissionEnum;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.utilities.SelectionHelper;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OpenInArtifactEditor extends AbstractActionHandler {
+
+ public OpenInArtifactEditor(StructuredViewer viewer, String text) throws Exception {
+ super(viewer, text);
+ }
+
+ public OpenInArtifactEditor(StructuredViewer viewer, String text, ImageDescriptor image) throws Exception {
+ super(viewer, text, image);
+ }
+
+ @Override
+ public void run() {
+ try {
+ TestRunOperator operator = SelectionHelper.getInstance().getSelection(getViewer());
+ if (isValidSelection(operator)) {
+ Artifact artifact = operator.getTestRunArtifact();
+ checkPermissions(artifact);
+ ArtifactEditor.editArtifact(artifact);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, "Unable to open artifact.", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler#updateState()
+ */
+ @Override
+ public void updateState() throws OseeCoreException {
+ TestRunOperator operator = SelectionHelper.getInstance().getSelection(getViewer());
+ setEnabled(isValidSelection(operator));
+ }
+
+ private boolean isValidSelection(TestRunOperator operator) throws OseeCoreException {
+ return operator != null && operator.hasValidArtifact() && operator.isFromLocalWorkspace() != true;
+ }
+
+ private void checkPermissions(Artifact artifact) throws OseeCoreException {
+ if (true != AccessControlManager.checkObjectPermission(artifact, PermissionEnum.READ)) {
+ throw new OseeArgumentException(String.format("The user %s does not have read access to %s",
+ UserManager.getUser(), artifact));
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ArtifactItem.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ArtifactItem.java
new file mode 100644
index 00000000000..889294af9e6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ArtifactItem.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.viewers.data;
+
+import java.util.Date;
+import java.util.logging.Level;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.db.connection.exception.ArtifactDoesNotExist;
+import org.eclipse.osee.framework.db.connection.exception.OseeArgumentException;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeType;
+import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
+import org.eclipse.osee.framework.skynet.core.attribute.DateAttribute;
+import org.eclipse.osee.framework.skynet.core.event.FrameworkTransactionData;
+import org.eclipse.osee.framework.skynet.core.event.IFrameworkTransactionEventListener;
+import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
+import org.eclipse.osee.framework.skynet.core.event.Sender;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage;
+import org.eclipse.osee.framework.ui.plugin.util.OverlayImage.Location;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.ote.define.artifacts.TestRunOperator;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.TreeColumn;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ArtifactItem extends DataItem implements IXViewerItem, IFrameworkTransactionEventListener {
+ private static Image FROM_LOCAL_WS_COMMIT_ALLOWED_IMAGE = null;
+ private static Image FROM_DATABASE_IMAGE = null;
+ private static Image FROM_LOCAL_WS_COMMIT_NOT_ALLOWED_IMAGE = null;
+ private static Image INVALID_SCRIPT_IMAGE = null;
+ private static boolean isFullDescriptionMode = true;
+
+ private final XViewer xViewer;
+ private Artifact artifact;
+ private TestRunOperator operator;
+ private String key;
+
+ public ArtifactItem(XViewer xViewer, Artifact artifact, DataItem parent) throws OseeArgumentException {
+ super(parent);
+ this.xViewer = xViewer;
+ setArtifact(artifact);
+ OseeEventManager.addListener(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.DataItem#getData()
+ */
+ @Override
+ public Artifact getData() {
+ return artifact;
+ }
+
+ @Override
+ public void dispose() {
+ OseeEventManager.removeListener(this);
+ super.dispose();
+ }
+
+ private void setArtifact(Artifact artifact) throws OseeArgumentException {
+ this.artifact = artifact;
+ this.operator = new TestRunOperator(artifact);
+ try {
+ this.key =
+ String.format("%s:%s:%s", getOperator().getChecksum(), getOperator().isFromLocalWorkspace(),
+ getOperator().hasNotBeenCommitted());
+ } catch (Exception ex) {
+ this.key = "";
+ }
+ }
+
+ public XViewer getXViewer() {
+ return xViewer;
+ }
+
+ public TestRunOperator getOperator() {
+ return operator;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.IXViewerItem#getLabel(int)
+ */
+ public String getLabel(int index) {
+ String toReturn = "";
+ Artifact artifact = getData();
+ try {
+ if (artifact != null && artifact.isDeleted() != true) {
+
+ if (index <= (xViewer.getTree().getColumns().length - 1)) {
+
+ TreeColumn treeCol = xViewer.getTree().getColumns()[index];
+ String colName = treeCol.getText();
+ if (colName.equals("HRID")) {
+ toReturn = artifact.getHumanReadableId();
+ } else if (colName.equals("GUID")) {
+ toReturn = artifact.getGuid();
+ } else if (colName.equals("Artifact_Type")) {
+ toReturn = artifact.getArtifactTypeName();
+ if (getOperator().isFromLocalWorkspace()) {
+ toReturn += " (Local)";
+ }
+ } else if (colName.equals("Status")) {
+ try {
+ toReturn = getOperator().getTestResultStatus();
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ toReturn = ex.getLocalizedMessage();
+ }
+ } else if (colName.equals("Disposition")) {
+ //Special case for the Disposition Artifact
+ String name = artifact.getSoleAttributeValueAsString("Name", "");
+ if (name != "") {
+ try {
+ Artifact dispoArtifact =
+ ArtifactQuery.getArtifactFromTypeAndAttribute("Test Run Disposition", "Name", name,
+ artifact.getBranch());
+ if (dispoArtifact != null) {
+ return dispoArtifact.getSoleAttributeValueAsString("Disposition", "");
+ }
+ } catch (ArtifactDoesNotExist ex) {
+ //ignore if not defined
+ }
+ }
+ return "";
+ } else {
+ if (artifact.isAttributeTypeValid(colName)) {
+ AttributeType attributeType = AttributeTypeManager.getType(colName);
+ if (attributeType.getBaseAttributeClass().equals(DateAttribute.class)) {
+ Date date = null;
+ try {
+ date = artifact.getSoleAttributeValue(colName);
+ } catch (Exception ex) {
+ // Do Nothing;
+ }
+ if (date != null) {
+ toReturn = DateAttribute.MMDDYYHHMM.format(date);
+ } else {
+ toReturn = "NOT SET";
+ }
+ } else {
+ toReturn = artifact.getAttributesToString(colName);
+ if (colName.equals("Name")) {
+ toReturn = getArtifactName(toReturn);
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ toReturn = ex.getLocalizedMessage();
+ }
+ return toReturn;
+ }
+
+ private String getArtifactName(String rawName) throws Exception {
+ String name = rawName;
+ if (isFullDescriptionModeEnabled() != true) {
+ String[] qualifiers = rawName.split("\\.");
+ name = qualifiers[qualifiers.length - 1];
+ }
+ return String.format("%s%s [%s]", getOperator().isFromLocalWorkspace() ? "> " : "", name,
+ getOperator().getChecksum());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.IXViewerItem#getImage()
+ */
+ public Image getImage() {
+ Image toReturn = null;
+ try {
+ Artifact artifact = getData();
+ if (artifact != null && artifact.isDeleted() != true) {
+ if (areImagesInitialized() != true) {
+ initializeImages();
+ }
+ TestRunOperator operator = getOperator();
+ if (operator.isFromLocalWorkspace() == true) {
+ if (operator.isCommitAllowed() == true) {
+ toReturn = FROM_LOCAL_WS_COMMIT_ALLOWED_IMAGE;
+ } else {
+ if (operator.isScriptRevisionValid() != true) {
+ toReturn = INVALID_SCRIPT_IMAGE;
+ } else {
+ toReturn = FROM_LOCAL_WS_COMMIT_NOT_ALLOWED_IMAGE;
+ }
+ }
+ } else {
+ toReturn = FROM_DATABASE_IMAGE;
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
+ }
+ return toReturn;
+ }
+
+ private boolean areImagesInitialized() {
+ return FROM_LOCAL_WS_COMMIT_ALLOWED_IMAGE != null && FROM_DATABASE_IMAGE != null && FROM_LOCAL_WS_COMMIT_NOT_ALLOWED_IMAGE != null;
+ }
+
+ private void initializeImages() throws OseeArgumentException {
+ Artifact artifact = getData();
+ Image defaultImage = ImageManager.getImage(artifact);
+ OseeUiActivator plugin = OteUiDefinePlugin.getInstance();
+ DecorationOverlayIcon overlay = null;
+ if (FROM_LOCAL_WS_COMMIT_ALLOWED_IMAGE == null) {
+ OverlayImage overlayImage =
+ new OverlayImage(defaultImage, plugin.getImageDescriptor("addition.gif"), Location.BOT_RIGHT);
+ FROM_LOCAL_WS_COMMIT_ALLOWED_IMAGE = overlayImage.createImage();
+ }
+ if (FROM_LOCAL_WS_COMMIT_NOT_ALLOWED_IMAGE == null) {
+ overlay =
+ new DecorationOverlayIcon(defaultImage, plugin.getImageDescriptor("confauto_ov.gif"),
+ IDecoration.BOTTOM_RIGHT);
+ FROM_LOCAL_WS_COMMIT_NOT_ALLOWED_IMAGE = overlay.createImage();
+ }
+ if (FROM_DATABASE_IMAGE == null) {
+ overlay =
+ new DecorationOverlayIcon(defaultImage, plugin.getImageDescriptor("version_controlled.gif"),
+ IDecoration.BOTTOM_RIGHT);
+ FROM_DATABASE_IMAGE = overlay.createImage();
+ }
+ if (INVALID_SCRIPT_IMAGE == null) {
+ overlay =
+ new DecorationOverlayIcon(defaultImage, plugin.getImageDescriptor("obstructed.gif"),
+ IDecoration.BOTTOM_RIGHT);
+ INVALID_SCRIPT_IMAGE = overlay.createImage();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.DataItem#getKey()
+ */
+ @Override
+ public Object getKey() {
+ return key;
+ }
+
+ public static void setFullDescriptionModeEnabled(boolean isEnabled) {
+ ArtifactItem.isFullDescriptionMode = isEnabled;
+ }
+
+ public static boolean isFullDescriptionModeEnabled() {
+ return ArtifactItem.isFullDescriptionMode;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.skynet.core.eventx.IFrameworkTransactionEventListener#handleFrameworkTransactionEvent(org.eclipse.osee.framework.ui.plugin.event.Sender.Source, org.eclipse.osee.framework.skynet.core.eventx.FrameworkTransactionData)
+ */
+ @Override
+ public void handleFrameworkTransactionEvent(Sender sender, FrameworkTransactionData transData) throws OseeCoreException {
+ if (artifact.isDeleted()) return;
+ if (transData.isDeleted(artifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (!xViewer.getTree().isDisposed()) xViewer.remove(this);
+ dispose();
+ }
+ });
+ return;
+ }
+ if (transData.isRelAddedChangedDeleted(artifact) || transData.isChanged(artifact)) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ if (!xViewer.getTree().isDisposed())
+ xViewer.remove(this);
+ else
+ xViewer.update(this, null);
+ }
+ });
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/BranchItem.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/BranchItem.java
new file mode 100644
index 00000000000..775c9897f64
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/BranchItem.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.define.viewers.data;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.skynet.core.artifact.Branch;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class BranchItem extends DataItem implements IXViewerItem {
+
+ private Branch branch;
+ private static boolean isScriptItemGrouped = true;
+
+ public BranchItem(Branch branch, DataItem parentItem) {
+ super(parentItem);
+ this.branch = branch;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.DataItem#getData()
+ */
+ @Override
+ public String getData() {
+ return branch.getBranchName();
+ }
+
+ public Image getImage() {
+ return OteUiDefinePlugin.getInstance().getImage("childBranch.gif");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.IXViewerItem#getLabel(int)
+ */
+ public String getLabel(int index) {
+ return index == 0 ? getData() : "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.DataItem#getKey()
+ */
+ @Override
+ public Object getKey() {
+ return branch;
+ }
+
+ @Override
+ public DataItem[] getChildren() {
+ DataItem[] toReturn = super.getChildren();
+ if (isGroupModeEnabled() != true) {
+ List<DataItem> tempList = new ArrayList<DataItem>();
+ for (DataItem item : toReturn) {
+ if (item.hasChildren()) {
+ for (DataItem itemX : item.getChildren()) {
+ tempList.add(itemX);
+ }
+ }
+ }
+ toReturn = tempList.toArray(new DataItem[tempList.size()]);
+ }
+ return toReturn;
+ }
+
+ public static void setGroupModeEnabled(boolean isEnabled) {
+ BranchItem.isScriptItemGrouped = isEnabled;
+ }
+
+ public static boolean isGroupModeEnabled() {
+ return BranchItem.isScriptItemGrouped;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItem.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItem.java
new file mode 100644
index 00000000000..38d0f0a4691
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItem.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.define.viewers.data;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract class DataItem {
+
+ private DataItem parentItem;
+ private Map<Object, DataItem> childrenMap;
+
+ public DataItem(DataItem parentItem) {
+ this.parentItem = parentItem;
+ this.childrenMap = new HashMap<Object, DataItem>();
+ }
+
+ public void addChild(Object key, DataItem child) {
+ childrenMap.put(key, child);
+ child.setParent(this);
+ }
+
+ public void removeChild(DataItem child) {
+ childrenMap.remove(child.getKey());
+ child.setParent(null);
+ child.dispose();
+ }
+
+ public DataItem[] getChildren() {
+ Collection<DataItem> collection = childrenMap.values();
+ return collection.toArray(new DataItem[collection.size()]);
+ }
+
+ public boolean hasChildren() {
+ return childrenMap.size() > 0;
+ }
+
+ public void setParent(DataItem parent) {
+ this.parentItem = parent;
+ }
+
+ public DataItem getParent() {
+ return this.parentItem;
+ }
+
+ public void dispose() {
+ if (hasChildren() != false) {
+ for (DataItem item : getChildren()) {
+ item.dispose();
+ }
+ }
+ }
+
+ public abstract Object getData();
+
+ public abstract Object getKey();
+
+ public boolean hasItem(Object key) {
+ return childrenMap.containsKey(key);
+ }
+
+ public DataItem getChild(Object key) {
+ return childrenMap.get(key);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemContentProvider.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemContentProvider.java
new file mode 100644
index 00000000000..91e524eb1df
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemContentProvider.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.ui.define.viewers.data;
+
+import java.util.Collection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataItemContentProvider implements ITreeContentProvider {
+
+ private static final Object[] EMPTY_ARRAY = new Object[0];
+
+ @SuppressWarnings("unchecked")
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection) {
+ return ((Collection) parentElement).toArray();
+ }
+ if (parentElement instanceof DataItem) {
+ return ((DataItem) parentElement).getChildren();
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public Object getParent(Object element) {
+ if (element instanceof DataItem) {
+ return ((DataItem) element).getParent();
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof Collection) return true;
+ if (element instanceof DataItem) {
+ return ((DataItem) element).hasChildren();
+ }
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof String) return new Object[] {inputElement};
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemLabelProvider.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemLabelProvider.java
new file mode 100644
index 00000000000..bc402aee479
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/DataItemLabelProvider.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.define.viewers.data;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class DataItemLabelProvider extends XViewerLabelProvider {
+
+ /**
+ * @param viewer
+ */
+ public DataItemLabelProvider(XViewer viewer) {
+ super(viewer);
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn col, int columnIndex) {
+ Image toReturn = null;
+ if (columnIndex == 0) {
+ if (element instanceof IXViewerItem) {
+ toReturn = ((IXViewerItem) element).getImage();
+ }
+ }
+ return toReturn;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn col, int columnIndex) {
+ String toReturn = "";
+ if (element instanceof String && columnIndex == 1) {
+ toReturn = (String) element;
+ } else if (element instanceof IXViewerItem) {
+ toReturn = ((IXViewerItem) element).getLabel(columnIndex);
+ }
+ return toReturn;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/IXViewerItem.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/IXViewerItem.java
new file mode 100644
index 00000000000..5037be849e6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/IXViewerItem.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.define.viewers.data;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IXViewerItem {
+
+ public abstract Image getImage();
+
+ public abstract String getLabel(int index);
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ScriptItem.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ScriptItem.java
new file mode 100644
index 00000000000..0c6607aa13c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/viewers/data/ScriptItem.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.ui.define.viewers.data;
+
+import java.net.URI;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptItem extends DataItem implements IXViewerItem {
+ private static final Matcher urlMatcher = Pattern.compile("(.*)?/(branches|trunk|tags)?(.*)").matcher("");
+ private static final String DEFAULT_SCRIPT_NAME = "Script Unknown";
+ private static final String DEFAULT_REVISION = "?";
+ private static boolean isFullDescriptionMode = true;
+
+ private String scriptUrl;
+ private String revision;
+ private Integer key;
+
+ public ScriptItem(String scriptUrl, String revision, DataItem parentItem) {
+ super(parentItem);
+ setScriptUrlAndRevision(scriptUrl, revision);
+ this.key = generateKey();
+ }
+
+ private void setScriptUrlAndRevision(String scriptUrl, String revision) {
+ boolean wasThereAnError = false;
+ try {
+ URI url = new URI(scriptUrl);
+ if (url != null) {
+ this.scriptUrl = scriptUrl;
+ } else {
+ wasThereAnError = true;
+ }
+ } catch (Exception ex) {
+ wasThereAnError = true;
+ }
+ try {
+ if (Strings.isValid(revision)) {
+ this.revision = revision;
+ } else {
+ wasThereAnError = true;
+ }
+ } catch (Exception ex) {
+ wasThereAnError = true;
+ }
+
+ if (wasThereAnError == true) {
+ setDefaultValues();
+ }
+ }
+
+ private void setDefaultValues() {
+ this.scriptUrl = DEFAULT_SCRIPT_NAME;
+ this.revision = DEFAULT_REVISION;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.DataItem#getData()
+ */
+ @Override
+ public String getData() {
+ return String.format("[%s][%s]", scriptUrl, revision);
+ }
+
+ public Image getImage() {
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.IXViewerItem#getLabel(int)
+ */
+ public String getLabel(int index) {
+ String toReturn = "";
+ if (index == 0) {
+ if (scriptUrl.equals(DEFAULT_SCRIPT_NAME) != true && revision.equals(DEFAULT_REVISION) != true && isFullDescriptionModeEnabled() != false) {
+ toReturn = getFullLabel();
+ } else {
+ toReturn = getShortLabel();
+ }
+ }
+ return toReturn;
+ }
+
+ private String getFullLabel() {
+ String repository = null;
+ String type = null;
+ String path = null;
+ urlMatcher.reset(scriptUrl);
+ if (urlMatcher.find()) {
+ repository = urlMatcher.group(1);
+ type = urlMatcher.group(2);
+ if (!Strings.isValid(type)) {
+ type = "";
+ }
+ path = urlMatcher.group(3);
+ }
+ return String.format("%s [%s] [%s, %s: %s]", getScriptName(), revision, repository, StringUtils.capitalize(type),
+ path);
+ }
+
+ private String getScriptName() {
+ String url = scriptUrl;
+ int lastIndex = url.lastIndexOf("/") + 1;
+ url = url.substring(lastIndex, url.length());
+ return Lib.removeExtension(url);
+ }
+
+ private String getShortLabel() {
+ String url = scriptUrl;
+ if (!DEFAULT_SCRIPT_NAME.equals(scriptUrl)) {
+ url = getScriptName();
+ }
+ return String.format("%s [%s]", url, revision);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.data.DataItem#getKey()
+ */
+ @Override
+ public Object getKey() {
+ return key;
+ }
+
+ private Integer generateKey() {
+ int value = 0;
+ for (byte aByte : (scriptUrl + revision).getBytes()) {
+ value += aByte;
+ }
+ return new Integer(value);
+ }
+
+ public static void setFullDescriptionModeEnabled(boolean isEnabled) {
+ ScriptItem.isFullDescriptionMode = isEnabled;
+ }
+
+ public static boolean isFullDescriptionModeEnabled() {
+ return ScriptItem.isFullDescriptionMode;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunView.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunView.java
new file mode 100644
index 00000000000..ed14e63fd07
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunView.java
@@ -0,0 +1,282 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.define.views;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.Displays;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
+import org.eclipse.osee.ote.ui.define.viewers.IDataChangedListener;
+import org.eclipse.osee.ote.ui.define.viewers.TestRunXViewer;
+import org.eclipse.osee.ote.ui.define.viewers.data.ArtifactItem;
+import org.eclipse.osee.ote.ui.define.viewers.data.BranchItem;
+import org.eclipse.osee.ote.ui.define.viewers.data.ScriptItem;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunView extends ViewPart implements IActionable, IDataChangedListener {
+ public static final String VIEW_ID = TestRunView.class.getName();
+ private static final String BEGIN_MESSAGE =
+ "To begin, drag and drop a test run artifact from artifact explorer or from an artifact search result window. Alternatively, you can drag and drop a test outfile onto this view.";
+
+ private Action expandAction, collapseAction, refreshAction;
+ private static TestRunXViewer viewer = null;
+ @SuppressWarnings("unused")
+ private IHandlerService handlerService;
+ private ShowOnlyLatestRuns latestRunFilter;
+ private boolean isFilterOn;
+
+ // private static final String FLAT_KEY = "flat";
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ parent.setLayout(new GridLayout());
+
+ PlatformUI.getWorkbench().getService(IHandlerService.class);
+ handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+
+ viewer = new TestRunXViewer(parent);
+ Tree tree = viewer.getTree();
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.minimumHeight = 350;
+ tree.setLayoutData(gridData);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ tree.setFont(parent.getFont());
+
+ parent.layout();
+ createActions();
+ createMenus();
+ createToolbar();
+
+ latestRunFilter = new ShowOnlyLatestRuns();
+ isFilterOn = false;
+ viewer.registerListener(this);
+ viewer.getTree().addKeyListener(new KeyAdapter() {
+
+ public void keyPressed(KeyEvent event) {
+ if (event.stateMask == SWT.CTRL && (event.keyCode == 'A' || event.keyCode == 'a')) {
+ Object object = event.getSource();
+ if (object instanceof Tree) {
+ Tree tree = (Tree) object;
+ tree.selectAll();
+ }
+ }
+ }
+ });
+ onDataChanged();
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.osee.ote.ui.define.testRunView");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ats.IActionable#getActionDescription()
+ */
+ public String getActionDescription() {
+ return "";
+ }
+
+ protected void createActions() {
+ expandAction = new Action("Expand All") {
+
+ public void run() {
+ viewer.getTree().setRedraw(false);
+ viewer.expandAll();
+ viewer.getTree().setRedraw(true);
+ }
+ };
+ expandAction.setImageDescriptor(OteUiDefinePlugin.getInstance().getImageDescriptor("expandState.gif"));
+ expandAction.setToolTipText("Expand All");
+
+ collapseAction = new Action("Collapse All") {
+
+ public void run() {
+ viewer.getTree().setRedraw(false);
+ viewer.collapseAll();
+ viewer.getTree().setRedraw(true);
+ }
+ };
+ collapseAction.setImageDescriptor(OteUiDefinePlugin.getInstance().getImageDescriptor("collapseState.gif"));
+ collapseAction.setToolTipText("Collapse All");
+
+ refreshAction = new Action("Refresh") {
+
+ public void run() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ public void run() {
+ viewer.refresh();
+ };
+ });
+ }
+ };
+ refreshAction.setToolTipText("Refresh Table");
+ refreshAction.setImageDescriptor(OteUiDefinePlugin.getInstance().getImageDescriptor("refresh.gif"));
+
+ }
+
+ private void createMenus() {
+ MenuManager menuManager = new MenuManager();
+ getSite().registerContextMenu(VIEW_ID, menuManager, viewer);
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ menuManager.setParent(getViewSite().getActionBars().getMenuManager());
+ fillMenu(menuManager);
+ getSite().setSelectionProvider(viewer);
+ OseeAts.addBugToViewToolbar(this, this, OteUiDefinePlugin.getInstance(), VIEW_ID, "Test Run View");
+ }
+
+ private void fillMenu(IMenuManager menuManager) {
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void createToolbar() {
+ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
+ toolbarManager.add(refreshAction);
+ toolbarManager.add(expandAction);
+ toolbarManager.add(collapseAction);
+ }
+
+ public void setDescription(final String message) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ setContentDescription(message);
+ }
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.define.viewers.IDataChangedListener#onDataChanged()
+ */
+ public void onDataChanged() {
+ String message = BEGIN_MESSAGE;
+ Object object = viewer.getInput();
+ if (object != null && object instanceof Collection) {
+ if (((Collection<?>) object).isEmpty() != true) {
+ message = "";
+ }
+ }
+ setDescription(message);
+ }
+
+ public static StructuredViewer getViewer() {
+ return viewer;
+ }
+
+ public void presentGroupedByBranch() {
+ BranchItem.setGroupModeEnabled(true);
+ viewer.refresh();
+ }
+
+ public void presentGroupedByScript() {
+ BranchItem.setGroupModeEnabled(false);
+ viewer.refresh();
+ }
+
+ public void presentWithShortNames() {
+ ScriptItem.setFullDescriptionModeEnabled(false);
+ ArtifactItem.setFullDescriptionModeEnabled(false);
+ viewer.refresh();
+ }
+
+ public void presentWithLongNames() {
+ ScriptItem.setFullDescriptionModeEnabled(true);
+ ArtifactItem.setFullDescriptionModeEnabled(true);
+ viewer.refresh();
+ }
+
+ public void toggleFilter() {
+ latestRunFilter.clear();
+ if (isFilterOn != true) {
+ isFilterOn = true;
+ viewer.addFilter(latestRunFilter);
+ } else {
+ isFilterOn = false;
+ viewer.removeFilter(latestRunFilter);
+ }
+ viewer.refresh();
+ }
+
+ private final class ShowOnlyLatestRuns extends ViewerFilter {
+ private Map<String, ArtifactItem> latestMap = new HashMap<String, ArtifactItem>();
+
+ public Object[] filter(Viewer viewer, Object parent, Object[] elements) {
+ return super.filter(viewer, parent, elements);
+ }
+
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ boolean toReturn = false;
+ if (element instanceof ArtifactItem) {
+ ArtifactItem item1 = (ArtifactItem) element;
+ String name = item1.getOperator().getDescriptiveName();
+
+ ArtifactItem item2 = latestMap.get(name);
+ if (item2 == null) {
+ latestMap.put(name, item1);
+ toReturn = true;
+ } else {
+ try {
+ Date date1 = item1.getOperator().getEndDate();
+ Date date2 = item2.getOperator().getEndDate();
+ if (date1.after(date2) || date1.equals(date2)) {
+ latestMap.put(name, item1);
+ toReturn = true;
+ }
+ } catch (Exception ex) {
+ OseeLog.log(OteUiDefinePlugin.class, Level.WARNING, "Error comparing run dates.", ex);
+ }
+ }
+ } else {
+ toReturn = true;
+ }
+ return toReturn;
+ }
+
+ public void clear() {
+ latestMap.clear();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunViewNavigateItem.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunViewNavigateItem.java
new file mode 100644
index 00000000000..7c6207c991c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/TestRunViewNavigateItem.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.define.views;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.framework.ui.plugin.util.ViewPartUtil;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.ote.ui.define.OteDefineImage;
+import org.eclipse.osee.ote.ui.navigate.IOteNavigateItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestRunViewNavigateItem implements IOteNavigateItem {
+
+ public TestRunViewNavigateItem() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.navigate.IOteNavigateItem#getSearchNavigateItems()
+ */
+ public List<XNavigateItem> getNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+
+ XNavigateItem msgItem = new XNavigateItem(null, "Test Analysis", FrameworkImage.FOLDER);
+ new XNavigateItemAction(msgItem, new OpenTestRunView(), OteDefineImage.TEST_RUN_VIEW, false);
+ items.add(msgItem);
+
+ return items;
+ }
+
+ private final class OpenTestRunView extends Action {
+
+ public OpenTestRunView() {
+ super("Open Test Run View");
+ }
+
+ @Override
+ public void run() {
+ ViewPartUtil.openOrShowView(TestRunView.class.getName());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/FlatPresentationHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/FlatPresentationHandler.java
new file mode 100644
index 00000000000..b396a01f2fc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/FlatPresentationHandler.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.define.views.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class FlatPresentationHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((TestRunView) HandlerUtil.getActivePartChecked(event)).presentGroupedByScript();
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/GroupedPresentationHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/GroupedPresentationHandler.java
new file mode 100644
index 00000000000..bf4d1e2fc8a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/GroupedPresentationHandler.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.define.views.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class GroupedPresentationHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((TestRunView) HandlerUtil.getActivePartChecked(event)).presentGroupedByBranch();
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/LongNamesPresentationHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/LongNamesPresentationHandler.java
new file mode 100644
index 00000000000..3255f674bc2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/LongNamesPresentationHandler.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.define.views.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class LongNamesPresentationHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((TestRunView) HandlerUtil.getActivePartChecked(event)).presentWithLongNames();
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ShortNamesPresentationHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ShortNamesPresentationHandler.java
new file mode 100644
index 00000000000..813f48e991c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ShortNamesPresentationHandler.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.define.views.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class ShortNamesPresentationHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((TestRunView) HandlerUtil.getActivePartChecked(event)).presentWithShortNames();
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ToggleFilterHandler.java b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ToggleFilterHandler.java
new file mode 100644
index 00000000000..f1ec8f337be
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/src/org/eclipse/osee/ote/ui/define/views/handlers/ToggleFilterHandler.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.ui.define.views.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.osee.ote.ui.define.views.TestRunView;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ToggleFilterHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ((TestRunView) HandlerUtil.getActivePartChecked(event)).toggleFilter();
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
+ */
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.define/templates/HtmlActiveTableTemplate b/org.eclipse.osee.ote.ui.define/templates/HtmlActiveTableTemplate
new file mode 100644
index 00000000000..627e41a5ce7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.define/templates/HtmlActiveTableTemplate
@@ -0,0 +1,43 @@
+<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" />
+<script type="text/javascript" src="adapter/ext/ext-base.js"></script>
+
+<script type="text/javascript" src="ext-all.js"></script>
+<link rel="stylesheet" type="text/css" href="examples/grid/grid-examples.css" />
+<link rel="stylesheet" type="text/css" href="examples/examples.css" />
+<link rel="stylesheet" type="text/css" href="examples/lib.css" />
+<script type="text/javascript">
+ Ext.onReady(function(){
+ Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
+
+ var myData = [##TABLE_DATA##];
+
+ ##CUSTOM_FUNCTIONS##
+
+ // create the data store
+ var store = new Ext.data.SimpleStore({
+ fields: [##COLUMN_DATA##]
+ });
+ store.loadData(myData);
+
+ // create the Grid
+ var grid = new Ext.grid.GridPanel({
+ store: store,
+ columns: [ ##COLUMN_CUSTOMIZATIONS_DATA##],
+ stripeRows: true,
+ viewConfig: {
+ autoFill: true
+ },
+ sm: new Ext.grid.RowSelectionModel({singleSelect:true}),
+ ##HEIGHT##,
+ ##WIDTH##,
+ autoSizeColumns: true,
+ ##AUTO_EXPAND_COLUMN##,
+ renderTo: '##ELEMENT_NAME##',
+ title:'##TABLE_TITLE##'
+ });
+ grid
+ grid.getSelectionModel().selectFirstRow();
+});
+</script>
+
+
diff --git a/org.eclipse.osee.ote.ui.host.cmd/.classpath b/org.eclipse.osee.ote.ui.host.cmd/.classpath
new file mode 100644
index 00000000000..64ed6b3795d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/.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.host.cmd/.project b/org.eclipse.osee.ote.ui.host.cmd/.project
new file mode 100644
index 00000000000..0093ca23012
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui.host.cmd</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.host.cmd/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.host.cmd/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..b4cbb5350da
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE UI Host Cmd Plugin (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.host.cmd;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.host.cmd.UiPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.framework.jini,
+ net.jini,
+ org.eclipse.osee.framework.ui.service.control,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osgi,
+ org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Export-Package: org.eclipse.osee.ote.ui.host.cmd
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.ote.ui.host.cmd/build.properties b/org.eclipse.osee.ote.ui.host.cmd/build.properties
new file mode 100644
index 00000000000..8a33b335c37
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/
diff --git a/org.eclipse.osee.ote.ui.host.cmd/images/console.gif b/org.eclipse.osee.ote.ui.host.cmd/images/console.gif
new file mode 100644
index 00000000000..a598f6082f6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/images/console.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.host.cmd/images/test_server.gif b/org.eclipse.osee.ote.ui.host.cmd/images/test_server.gif
new file mode 100644
index 00000000000..c52ee5689bf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/images/test_server.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.host.cmd/images/user.gif b/org.eclipse.osee.ote.ui.host.cmd/images/user.gif
new file mode 100644
index 00000000000..5e6e549598a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/images/user.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.host.cmd/plugin.xml b/org.eclipse.osee.ote.ui.host.cmd/plugin.xml
new file mode 100644
index 00000000000..bcbfbda3040
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/plugin.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension
+ point="org.eclipse.osee.framework.ui.service.control.ServiceView">
+ <ServiceHandler
+ ServiceIcon="images/test_server.gif"
+ ServiceInterface="org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment"
+ ServiceRenderer="org.eclipse.osee.ote.ui.host.cmd.TestServerConsoleServiceRenderer"/>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/CategoryNode.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/CategoryNode.java
new file mode 100644
index 00000000000..7ab4275065d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/CategoryNode.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.ui.host.cmd;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class CategoryNode extends TreeParent {
+
+ /**
+ * @param name
+ */
+ public CategoryNode(String name) {
+ super(name);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/ConsoleNode.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/ConsoleNode.java
new file mode 100644
index 00000000000..f03b4cf389b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/ConsoleNode.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.ui.host.cmd;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ConsoleNode extends TreeObject {
+
+ private final IRemoteCommandConsole console;
+ private String users;
+
+ public ConsoleNode(IRemoteCommandConsole console, OSEEPerson1_4[] users) {
+ super("Console");
+ this.console = console;
+ if (users.length > 1) {
+ StringBuilder sb = new StringBuilder(128);
+ sb.append(users[0].getName());
+ sb.append(", ");
+ for (int i = 1; i < users.length - 1; i++) {
+ sb.append(users[i].getName());
+ sb.append(", ");
+ }
+ sb.append(users[users.length -1]);
+ this.users = sb.toString();
+ } else {
+ this.users = users.length == 0 ? "<none>" : users[0].getName();
+ }
+ }
+
+ public IRemoteCommandConsole getConsole() {
+ return console;
+ }
+
+ public String getUsers() {
+ return users;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/EnvironmentViewer.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/EnvironmentViewer.java
new file mode 100644
index 00000000000..de04af0202f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/EnvironmentViewer.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.host.cmd;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentViewer extends Composite {
+
+ private static final Image ENVIRONMENT_IMAGE = PlatformUI.getWorkbench().getSharedImages().getImage(
+ ISharedImages.IMG_OBJ_FOLDER);
+
+ private static final Image USER_IMAGE = UiPlugin.getInstance().getImage("user.gif");
+
+ private static final Image CONSOLE_IMAGE = UiPlugin.getInstance().getImage("console.gif");
+
+ protected enum ColumnEnum {
+ Service(SWT.LEFT), Users;
+
+ private int alignment;
+
+ private ColumnEnum() {
+ this.alignment = SWT.CENTER;
+ }
+
+ private ColumnEnum(int alignment) {
+ this.alignment = alignment;
+ }
+
+ public int getAlignment() {
+ return alignment;
+ }
+
+ public static String[] toArray() {
+ ColumnEnum[] enumArray = ColumnEnum.values();
+ String[] toReturn = new String[enumArray.length];
+ for (int index = 0; index < enumArray.length; index++) {
+ toReturn[index] = enumArray[index].toString();
+ }
+ return toReturn;
+ }
+ }
+
+ private TreeViewer viewer;
+
+ public EnvironmentViewer(Composite parent, int style) {
+ super(parent, style);
+ createControl();
+ }
+
+ public void createControl() {
+ this.setLayout(new GridLayout());
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ createTreeArea(this);
+ createColumns();
+ attachListeners();
+ packColumnData();
+ }
+
+ private void createTreeArea(Composite parent) {
+ viewer = new TreeViewer(parent, SWT.SINGLE | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ ((TreeViewer) viewer).getTree().setHeaderVisible(true);
+ ((TreeViewer) viewer).getTree().setLinesVisible(true);
+ viewer.setUseHashlookup(true);
+ viewer.setColumnProperties(ColumnEnum.toArray());
+ viewer.setContentProvider(new TreeContentProvider());
+ viewer.setLabelProvider(new TreeLabelProvider());
+ viewer.setSorter(new ViewerSorter());
+ viewer.setInput(new ArrayList<String>());
+ viewer.getControl().setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ }
+
+ private void createColumns() {
+ for (ColumnEnum columnEnum : ColumnEnum.values()) {
+ TreeColumn column = new TreeColumn(viewer.getTree(), SWT.CENTER, columnEnum.ordinal());
+ column.setText(columnEnum.toString());
+ column.setWidth(columnEnum.toString().length());
+ column.setAlignment(columnEnum.getAlignment());
+ }
+ }
+
+ public void packColumnData() {
+ TreeColumn[] columns = viewer.getTree().getColumns();
+ for (TreeColumn column : columns) {
+ column.pack();
+ }
+ }
+
+ private void attachListeners() {
+ viewer.addTreeListener(new ITreeViewerListener() {
+
+ public void treeCollapsed(TreeExpansionEvent event) {
+ packColumnData();
+ }
+
+ public void treeExpanded(TreeExpansionEvent event) {
+ packColumnData();
+ }
+
+ });
+ }
+
+ private class TreeLabelProvider implements ITableLabelProvider, ILabelProvider {
+
+ public Image getImage(Object obj) {
+ Image toReturn = null;
+ if (obj instanceof UserNode) {
+ toReturn = USER_IMAGE;
+ }
+ else if (obj instanceof ConsoleNode) {
+ toReturn = CONSOLE_IMAGE;
+ } else if (obj instanceof TreeParent) {
+ toReturn = ENVIRONMENT_IMAGE;
+ }
+ return toReturn;
+ }
+
+ public String getText(Object obj) {
+ if (obj instanceof ConsoleNode) {
+ ((ConsoleNode)obj).getName();
+ }
+ return obj.toString();
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ Image toReturn = null;
+ ColumnEnum column = ColumnEnum.values()[columnIndex];
+ switch (column) {
+ case Service:
+ if (element instanceof UserNode) {
+ toReturn = USER_IMAGE;
+ }
+ else if (element instanceof ConsoleNode) {
+ toReturn = CONSOLE_IMAGE;
+ } else if (element instanceof TreeParent) {
+ toReturn = ENVIRONMENT_IMAGE;
+ }
+ break;
+ default:
+ break;
+ }
+ return toReturn;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ String toReturn = null;
+ ColumnEnum column = ColumnEnum.values()[columnIndex];
+ switch (column) {
+ case Service:
+ if (element instanceof ConsoleNode) {
+ toReturn = ((ConsoleNode) element).getName();
+ } else if (element instanceof TreeParent) {
+ toReturn = element.toString();
+ }
+ break;
+ case Users:
+ if (element instanceof ConsoleNode) {
+ toReturn = ((ConsoleNode)element).getUsers();
+ }
+ break;
+ default:
+ break;
+ }
+ return toReturn;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+ }
+
+ private class TreeContentProvider implements ITreeContentProvider {
+
+ public void dispose() {
+ }
+
+ 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];
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement != null && inputElement instanceof Collection) {
+ Collection<?> elementArray = (Collection<?>) inputElement;
+ return elementArray.toArray();
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ if (element != null && element instanceof TreeObject) {
+ TreeObject child = (TreeObject) element;
+ return child.getParent();
+ }
+ return new Object();
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof TreeParent) {
+ TreeParent parent = (TreeParent) element;
+ return parent.hasChildren();
+ }
+ return false;
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ public boolean setFocus() {
+ return this.viewer.getControl().setFocus();
+ }
+
+ public StructuredViewer getViewer() {
+ return viewer;
+ }
+
+ public void setInput(List<TreeParent> input) {
+ viewer.setInput(input);
+ }
+
+ public void refresh() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ packColumnData();
+ viewer.refresh();
+ }
+ });
+ }
+
+ public void dispose() {
+ viewer.getControl().dispose();
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TestServerConsoleServiceRenderer.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TestServerConsoleServiceRenderer.java
new file mode 100644
index 00000000000..13e318ebd41
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TestServerConsoleServiceRenderer.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.host.cmd;
+
+import java.util.Hashtable;
+import java.util.logging.Level;
+import net.jini.core.lookup.ServiceItem;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.service.control.renderer.IServiceRenderer;
+import org.eclipse.osee.framework.ui.swt.Widgets;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+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.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Font;
+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.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Created on Oct 9, 2006
+ */
+public class TestServerConsoleServiceRenderer implements IServiceRenderer {
+ private IHostTestEnvironment testService;
+ private Group composite;
+ private Hashtable<ITestEnvironment, IRemoteCommandConsole> consoles;
+ private volatile IRemoteCommandConsole selectedConsole;
+ private Text outputTxt;
+ private Text inputTxt;
+ private Button sendCmdBtn;
+ private EnvironmentViewer envViewer;
+ private InputManager<TreeParent> inputManager;
+
+ public TestServerConsoleServiceRenderer() {
+ this.consoles = new Hashtable<ITestEnvironment, IRemoteCommandConsole>(24);
+ this.selectedConsole = null;
+ this.inputManager = new InputManager<TreeParent>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.service.control.renderer.IServiceRenderer#refresh()
+ */
+ public void refresh() {
+ Display.getCurrent().asyncExec(new Runnable() {
+
+ public void run() {
+ if (composite != null && !composite.isDisposed() && testService != null) {
+ cleanupService();
+ try {
+ ITestEnvironment[] envs = testService.getRemoteEnvironments();
+ consoles.clear();
+ if (envs.length > 0) {
+ for (ITestEnvironment env : envs) {
+ consoles.put(env, env.getCommandConsole());
+ }
+ selectedConsole = consoles.get(envs[0]);
+ } else {
+ selectedConsole = null;
+ }
+
+ envViewer.setInput(inputManager.getInputList());
+ TreeBuilder.buildTree(inputManager, testService, consoles);
+ envViewer.refresh();
+
+ } catch (Throwable t) {
+ OseeLog.log(UiPlugin.class, Level.SEVERE, "exception getting hosts", t);
+ }
+ }
+ }
+ });
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.service.control.renderer.IServiceRenderer#setService(net.jini.core.lookup.ServiceItem)
+ */
+ public void setService(ServiceItem serviceItem) {
+ OseeLog.log(UiPlugin.class, Level.INFO, "setting test environment service");
+ testService = (IHostTestEnvironment) serviceItem.service;
+ if (outputTxt != null && !outputTxt.isDisposed()) {
+ outputTxt.setText("");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.service.control.renderer.IServiceRenderer#disconnect()
+ */
+ public void disconnect() {
+ consoles.clear();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.service.control.renderer.IServiceRenderer#dispose()
+ */
+ public void dispose() {
+ cleanupService();
+ Widgets.disposeWidgets(composite, outputTxt, inputTxt, sendCmdBtn);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see osee.service.control.renderer.IRenderer#renderInComposite(org.eclipse.swt.widgets.Composite)
+ */
+ public Control renderInComposite(Composite parent) {
+ composite = new Group(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setText("Test Server Console");
+
+ SashForm sashForm = new SashForm(composite, SWT.NONE);
+ sashForm.setLayout(new GridLayout());
+ sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ sashForm.setOrientation(SWT.VERTICAL);
+ sashForm.SASH_WIDTH = 3;
+
+ envViewer = new EnvironmentViewer(sashForm, SWT.NONE);
+ envViewer.getViewer().addDoubleClickListener(new IDoubleClickListener() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
+ */
+ public void doubleClick(DoubleClickEvent event) {
+ Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();
+ if (element != null && element instanceof ConsoleNode) {
+ selectedConsole = ((ConsoleNode) element).getConsole();
+ outputTxt.setText("");
+ }
+ }
+
+ });
+ createConsoleArea(sashForm);
+
+ sashForm.setWeights(new int[] {3, 7});
+ return composite;
+ }
+
+ private void createConsoleArea(Composite parent) {
+ Group composite = new Group(parent, SWT.NONE);
+ Widgets.setFormLayout(composite, 5, 5);
+ composite.setText("Interact");
+
+ outputTxt =
+ Widgets.createTxt(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY | SWT.BORDER, "");
+ outputTxt.setTabs(4);
+ outputTxt.setBackground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_BLACK));
+ outputTxt.setForeground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_GREEN));
+ outputTxt.setFont(new Font(Display.getDefault(), "Courier", 10, SWT.NORMAL));
+ Widgets.attachToParent(outputTxt, SWT.TOP, 0, 5);
+ Widgets.attachToParent(outputTxt, SWT.BOTTOM, 75, 0);
+ Widgets.attachToParent(outputTxt, SWT.LEFT, 0, 5);
+ Widgets.attachToParent(outputTxt, SWT.RIGHT, 100, -5);
+
+ inputTxt = Widgets.createTxt(composite, SWT.SINGLE | SWT.BORDER, "");
+ inputTxt.addTraverseListener(new TraverseListener() {
+
+ public void keyTraversed(TraverseEvent event) {
+ if (event.detail == SWT.TRAVERSE_RETURN) {
+ sendCmd(inputTxt.getText());
+ }
+ }
+
+ });
+ Widgets.attachToControl(inputTxt, outputTxt, SWT.LEFT, SWT.LEFT, 0);
+ sendCmdBtn = Widgets.createBtn(composite, SWT.PUSH, "Execute");
+ sendCmdBtn.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent arg0) {
+ sendCmd(inputTxt.getText());
+ }
+
+ });
+ Widgets.attachToControl(sendCmdBtn, outputTxt, SWT.TOP, SWT.BOTTOM, 5);
+ Widgets.attachToControl(sendCmdBtn, outputTxt, SWT.RIGHT, SWT.RIGHT, 0);
+ Widgets.attachToControl(inputTxt, sendCmdBtn, SWT.RIGHT, SWT.LEFT, -5);
+ Widgets.attachToControl(inputTxt, sendCmdBtn, SWT.TOP, SWT.CENTER, 0);
+ }
+
+ private void sendCmd(String cmd) {
+ try {
+ if (selectedConsole != null) {
+ outputTxt.append(selectedConsole.doCommand(cmd));
+ inputTxt.setText("");
+ } else {
+ outputTxt.append("No Consoles Available\n");
+ }
+ } catch (Throwable t) {
+ OseeLog.log(UiPlugin.class, Level.SEVERE, "Exception trying to execute test service console command " + cmd, t);
+ outputTxt.append("Exception ocurred when executing command\n");
+
+ }
+ }
+
+ private void cleanupService() {
+ consoles.clear();
+ inputManager.removeAll();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TreeBuilder.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TreeBuilder.java
new file mode 100644
index 00000000000..77bb76c0785
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/TreeBuilder.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.ui.host.cmd;
+
+import java.util.Collection;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.type.InputManager;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TreeBuilder {
+
+ public static void buildTree(InputManager<TreeParent> inputManager, IHostTestEnvironment host, Map<ITestEnvironment, IRemoteCommandConsole> consoles) throws Exception {
+
+ TreeParent treeParent = new TreeParent("Test Service");
+ CategoryNode categoryNode = new CategoryNode("Consoles");
+ treeParent.addChild(categoryNode);
+ for (ITestEnvironment env : host.getRemoteEnvironments()) {
+ Collection<OSEEPerson1_4> users = env.getUserList();
+ categoryNode.addChild(new ConsoleNode(consoles.get(env), users.toArray(new OSEEPerson1_4[users.size()])));
+ }
+ inputManager.addNode(treeParent);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UiPlugin.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UiPlugin.java
new file mode 100644
index 00000000000..71402d0adc6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UiPlugin.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.ui.host.cmd;
+
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class UiPlugin extends OseeUiActivator {
+
+ private static UiPlugin plugin;
+
+ public UiPlugin() {
+ plugin = this;
+ }
+
+ public static UiPlugin getInstance() {
+ return plugin;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UserNode.java b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UserNode.java
new file mode 100644
index 00000000000..4583010b6e0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.host.cmd/src/org/eclipse/osee/ote/ui/host/cmd/UserNode.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.ui.host.cmd;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class UserNode extends TreeObject {
+
+ /**
+ * @param name
+ */
+ public UserNode(String name) {
+ super(name);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/.classpath b/org.eclipse.osee.ote.ui.markers/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.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.ui.markers/.project b/org.eclipse.osee.ote.ui.markers/.project
new file mode 100644
index 00000000000..2cf24a360a4
--- /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 00000000000..6191c7b82a6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+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.4.0.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.6
+Import-Package: org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.core.framework.saxparse,
+ org.eclipse.osee.ote.core.framework.saxparse.elements
+Bundle-Vendor: Eclipse.org
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 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
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 00000000000..fac38d9fee8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.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.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 00000000000..409a3ed947d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.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.ui.markers;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Element;
+
+public class CheckPointHelper implements Comparable<CheckPointHelper> {
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return String.format("%s[%s, %s]", testPointName, expected, actual);
+ }
+
+ /**
+ *
+ */
+ public void increment() {
+ count++;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CheckPointHelper) {
+ return key.equals(((CheckPointHelper) obj).key);
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ private String testPointName;
+ private String expected;
+ private String actual;
+ private 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;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ 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/FileWatchList.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java
new file mode 100644
index 00000000000..eaeeaaad3d8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 List<FileWatchItem> fileWatchItems;
+
+ public FileWatchList() {
+ fileWatchItems = new CopyOnWriteArrayList<FileWatchItem>();
+ }
+
+ 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.log(FileWatchList.class, Level.INFO, String.format("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.toString(), ex);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return
+ */
+ 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;
+ }
+ }
+
+ /**
+ * @param file
+ * @return
+ */
+ 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 00000000000..1e2a0f00eab
--- /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 String file;
+ private int line;
+ private 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 00000000000..fa47e4daa8d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.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.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.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.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class MarkerPlugin extends OseeUiActivator {
+
+ private FileWatchList filesToWatch;
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.markers";
+
+ // The shared instance
+ private static MarkerPlugin plugin;
+
+ /**
+ * The constructor
+ */
+ public MarkerPlugin() {
+ }
+
+ /*
+ * (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;
+ filesToWatch = new FileWatchList();
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
+
+ public void resourceChanged(final IResourceChangeEvent event) {
+ IResourceDelta delta = event.getDelta();
+ try {
+ delta.accept(new IResourceDeltaVisitor() {
+ 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.ADDED:
+ // OseeLog.log(Activator.class, Level.INFO, String.format("ADDED %s updating
+ // markers - delta kind: %d", file.getName(), delta.getKind()));
+ // addMarkers(file);
+ break;
+ case IResourceDelta.CHANGED:
+ // OseeLog.log(Activator.class, Level.INFO, String.format("CHANGED %s updating
+ // markers - delta kind: %d", file.getName(), delta.getKind()));
+ // updateMarkers(file);
+ break;
+ case IResourceDelta.REMOVED:
+ // OseeLog.log(Activator.class, Level.INFO, String.format("removing %s markers -
+ // delta kind: %d", file.getName(), delta.getKind()));
+ removeMarkers(file);
+ break;
+ }
+ }
+ }
+ }
+ if (delta.getAffectedChildren().length > 0) return true;
+ return false;
+ }
+ });
+ } catch (CoreException ex) {
+ OseeLog.log(MarkerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ }, IResourceChangeEvent.POST_CHANGE);
+ }
+
+ /*
+ * (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 MarkerPlugin getDefault() {
+ return plugin;
+ }
+
+ public void addMarkers(IFile file) {
+ removeMarkers(file);
+ Jobs.runInJob("OTE Marker Processing", new ProcessOutfileSax(this, file), MarkerPlugin.class, MarkerPlugin.PLUGIN_ID, false);
+ }
+
+ public void removeMarkers(IFile file) {
+ List<IMarker> markers = filesToWatch.get(file);
+ if (markers != null) {
+ for (IMarker marker : markers) {
+ try {
+ marker.delete();
+ } catch (CoreException ex) {
+ }
+ }
+ }
+ }
+
+ synchronized void updateMarkerInfo(IFile file, List<IMarker> markers) {
+ List<IMarker> oldMarkers = filesToWatch.get(file);
+ if(oldMarkers != null){
+ oldMarkers.addAll(markers);
+ } else {
+ filesToWatch.put(file, markers);
+ }
+ }
+}
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 00000000000..7b292191ede
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.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.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.plugin.util.AWorkspace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteMarkerHelper {
+
+ private List<MarkerInfo> markerInfo;
+ private List<IMarker> markersToDelete;
+ private Map<CheckPointHelper, CheckPointHelper> count = new HashMap<CheckPointHelper, CheckPointHelper>();
+ private StringBuilder builder = new StringBuilder();
+ private List<TestPointData> testPonitDatas;
+
+ /**
+ * @param testPointDatas
+ */
+ public OteMarkerHelper(List<TestPointData> testPointDatas) {
+ this.testPonitDatas = testPointDatas;
+ markerInfo = new ArrayList<MarkerInfo>();
+ markersToDelete = new ArrayList<IMarker>();
+
+ 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);
+
+ 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<String>();
+ Map<String, IResource> resources = new HashMap<String, IResource>();
+
+ for (MarkerInfo marker : markerInfo) {
+ try {
+ if (!fileAlreadyLookedFor.contains(marker.getFile())) {
+ fileAlreadyLookedFor.add(marker.getFile());
+ IResource resource = AWorkspace.findWorkspaceFile(marker.getFile());
+ if (resource != null) {
+ resources.put(marker.getFile(), resource);
+ }
+ }
+
+ IResource resourceToMark = resources.get(marker.getFile());
+ if (resourceToMark != null) {
+ Map<String, Object> scriptMarkerMap = new HashMap<String, Object>();
+ 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);
+ }
+ }
+ }
+
+ /**
+ * @return
+ */
+ 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 00000000000..3e0bc12ca27
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.util.ArrayList;
+import java.util.List;
+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.plugin.util.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.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ProcessOutfileSax implements IExceptionableRunnable {
+
+ private IFile file;
+ private MarkerPlugin plugin;
+
+ private static final int _1_MB = 1048576;
+ private static final int _20_MB = _1_MB * 20;
+ private static final int _30_MB = _1_MB * 30;
+
+ private List<TestPointData> testPointDatas = new ArrayList<TestPointData>();
+ private TestPointData currentData = null;
+ private CheckPointData currentCheckPoint = null;
+ protected StackTraceCollection currentStackTrace;
+
+ public ProcessOutfileSax(MarkerPlugin plugin, IFile file) {
+ this.file = file;
+ this.plugin = plugin;
+ }
+
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ File outfile = AWorkspace.iFileToFile(file);
+ if (outfile.length() > _20_MB) {
+ OseeLog.log(MarkerPlugin.class, Level.WARNING, String.format(
+ "%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.log(MarkerPlugin.class, Level.WARNING, String.format("%s is not synchronized.", file.getName()));
+ file.refreshLocal(0, monitor);
+ }
+
+ monitor.setTaskName(String.format("Computing overview information for [%s].", file.getName()));
+ 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
+
+ handler.getHandler("TestPoint").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (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) {
+ 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(file.getContents()));
+
+ OteMarkerHelper helper = new OteMarkerHelper(this.testPointDatas);
+ plugin.updateMarkerInfo(file, helper.getMarkers());
+
+ return Status.OK_STATUS;
+ }
+
+ 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 00000000000..fa7287e351b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.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.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<StacktraceData>();
+
+ 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 00000000000..16347264f9c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.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.ui.markers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TestPointData {
+
+ private boolean isFailed;
+ private List<CheckPointData> data = new ArrayList<CheckPointData>();
+ 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.mux/.classpath b/org.eclipse.osee.ote.ui.mux/.classpath
new file mode 100644
index 00000000000..02159672985
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/.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.ui.mux/.project b/org.eclipse.osee.ote.ui.mux/.project
new file mode 100644
index 00000000000..b8d1a2b72cf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui.mux</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.mux/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.mux/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..bb68429cd3f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: MuxTool Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.mux;singleton:=true
+Bundle-Version: 0.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.mux.MuxToolPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.client,
+ org.eclipse.osee.ote.ui,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.help
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.ote.ui.mux/build.properties b/org.eclipse.osee.ote.ui.mux/build.properties
new file mode 100644
index 00000000000..db90a42cf7f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+ META-INF/,\
+ .,\
+ icons/,\
+ help/
diff --git a/org.eclipse.osee.ote.ui.mux/help/contexts.xml b/org.eclipse.osee.ote.ui.mux/help/contexts.xml
new file mode 100644
index 00000000000..8aa3a236f0e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/help/contexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="muxView" title="Mux View">
+ <description>Mux View</description>
+ <topic href="help/package.html" label="Mux View"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.ote.ui.mux/help/muxView.JPG b/org.eclipse.osee.ote.ui.mux/help/muxView.JPG
new file mode 100644
index 00000000000..7b5d9543f19
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/help/muxView.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.mux/help/package.html b/org.eclipse.osee.ote.ui.mux/help/package.html
new file mode 100644
index 00000000000..f7d0033ab76
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/help/package.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<title>
+Mux View
+</title>
+<body>
+<h1>Mux View</h1>
+
+<img src="muxView.JPG"/>
+
+<p>
+The mux view allows the user to monitor and simulate mux messages.
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.mux/help/toc.xml b/org.eclipse.osee.ote.ui.mux/help/toc.xml
new file mode 100644
index 00000000000..43a8de22a9d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/help/toc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.osee.ote.core/help/toc.xml#tools" label="Mux View">
+ <topic href="help/package.html" label="Mux View">
+ </topic>
+
+
+</toc>
diff --git a/org.eclipse.osee.ote.ui.mux/icons/1553.gif b/org.eclipse.osee.ote.ui.mux/icons/1553.gif
new file mode 100644
index 00000000000..b50eb79de05
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/icons/1553.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.mux/plugin.xml b/org.eclipse.osee.ote.ui.mux/plugin.xml
new file mode 100644
index 00000000000..0d347f58d8f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ name="OSEE Test"
+ id="osee.test.category">
+ </category>
+ <view
+ name="MuxView"
+ icon="icons/1553.gif"
+ category="osee.test.category"
+ class="org.eclipse.osee.ote.ui.mux.view.MuxView"
+ id="osee.test.muxTool.views.MuxView">
+ </view>
+ </extension>
+ <extension
+ point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension
+ targetID="org.eclipse.osee.ote.ui.TestPerspective">
+ <viewShortcut
+ id="osee.test.muxTool.views.MuxView">
+ </viewShortcut>
+ </perspectiveExtension>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ote.ui.OteNavigateItem">
+ <IOteNavigateItem
+ category="Messaging"
+ classname="org.eclipse.osee.ote.ui.mux.actions.MuxViewNavigatorItem">
+ </IOteNavigateItem>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="help/contexts.xml">
+ </contexts>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/MuxToolPlugin.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/MuxToolPlugin.java
new file mode 100644
index 00000000000..4dfc84def2c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/MuxToolPlugin.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.mux;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class MuxToolPlugin extends AbstractUIPlugin {
+
+ private ServiceTracker oteClientServiceTracker;
+
+ // The shared instance.
+ private static MuxToolPlugin plugin;
+
+
+ public static String PLUGIN_ID = "org.eclipse.osee.ote.ui.mux";
+ /**
+ * The constructor.
+ */
+ public MuxToolPlugin() {
+ plugin = this;
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ oteClientServiceTracker = new ServiceTracker(context,
+ IOteClientService.class.getName(), null);
+ oteClientServiceTracker.open();
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ oteClientServiceTracker.close();
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static MuxToolPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in
+ * relative path.
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(
+ "org.eclipse.osee.ote.ui.mux", path);
+ }
+
+ public IOteClientService getOteClientService() {
+ return (IOteClientService) oteClientServiceTracker.getService();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/OteMuxImage.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/OteMuxImage.java
new file mode 100644
index 00000000000..195c8b6f2b8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/OteMuxImage.java
@@ -0,0 +1,34 @@
+/*
+ * Created on Jun 12, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.ui.mux;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author b1528444
+ *
+ */
+public enum OteMuxImage implements OseeImage {
+ MUX("1553.gif");
+
+ private final String fileName;
+
+ private OteMuxImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(MuxToolPlugin.PLUGIN_ID, "icons", fileName);
+ }
+
+ @Override
+ public String getImageKey() {
+ return MuxToolPlugin.PLUGIN_ID + ".icons." + fileName;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/MuxViewNavigatorItem.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/MuxViewNavigatorItem.java
new file mode 100644
index 00000000000..024c5132c03
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/MuxViewNavigatorItem.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.mux.actions;
+
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItemAction;
+import org.eclipse.osee.ote.ui.mux.OteMuxImage;
+import org.eclipse.osee.ote.ui.navigate.IOteNavigateItem;
+
+public class MuxViewNavigatorItem implements IOteNavigateItem {
+
+ public MuxViewNavigatorItem() {
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public List<XNavigateItem> getNavigateItems() {
+ XNavigateItem action = new XNavigateItemAction(null,
+ new OpenMuxViewAction(), OteMuxImage.MUX, false);
+
+ return Collections.singletonList(action);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/OpenMuxViewAction.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/OpenMuxViewAction.java
new file mode 100644
index 00000000000..c25410c9444
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/actions/OpenMuxViewAction.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.ui.mux.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.ote.ui.mux.view.MuxView;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+public class OpenMuxViewAction extends Action {
+
+ public OpenMuxViewAction() {
+ super("Open Mux View");
+ }
+
+ @Override
+ public void run() {
+ try {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ .getActivePage().showView(MuxView.VIEW_ID);
+ } catch (Exception e) {
+ MessageDialog.openError(Display.getDefault().getActiveShell(),
+ "Error", "got an exception");
+ }
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DataNode.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DataNode.java
new file mode 100644
index 00000000000..cb70f826a0f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DataNode.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.ui.mux.datatable;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Ky Komadino
+ */
+public class DataNode {
+ RowNode row1, row2, row3, row4;
+ byte[] temp;
+
+ public DataNode() {
+ row1 = new RowNode();
+ row2 = new RowNode();
+ row3 = new RowNode();
+ row4 = new RowNode();
+ temp = new byte[16];
+ }
+
+ public RowNode getRow(int row) {
+ switch (row) {
+ case 1: return row1;
+ case 2: return row2;
+ case 3: return row3;
+ case 4: return row4;
+ default: return row1;
+ }
+ }
+
+ public synchronized void setData(ByteBuffer data) {
+ // discard header bytes
+ if (data.remaining() <= 15)
+ return;
+ else {
+ temp = new byte[15];
+ data.get(temp, 0, 15);
+ }
+
+ int copySize = data.remaining() >= 16 ? 16 : data.remaining();
+ temp = new byte[copySize];
+ data.get(temp, 0, copySize);
+ row1.setData(temp);
+ copySize = data.remaining() >= 16 ? 16 : data.remaining();
+ temp = new byte[copySize];
+ data.get(temp, 0, copySize);
+ row2.setData(temp);
+ copySize = data.remaining() >= 16 ? 16 : data.remaining();
+ temp = new byte[copySize];
+ data.get(temp, 0, copySize);
+ row3.setData(temp);
+ copySize = data.remaining() >= 16 ? 16 : data.remaining();
+ temp = new byte[copySize];
+ data.get(temp, 0, copySize);
+ row4.setData(temp);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordContentProvider.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordContentProvider.java
new file mode 100644
index 00000000000..ecf660a1082
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordContentProvider.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.ui.mux.datatable;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ote.ui.mux.model.DatawordModel;
+
+/**
+ * @author Ky Komadino
+ *
+ */
+public class DatawordContentProvider implements IStructuredContentProvider {
+ private final static Object[] EMPTY_ARRAY = new Object[0];
+ private Viewer viewer;
+
+ public void refresh() {
+ viewer.refresh();
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ viewer = v;
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ if (parent instanceof DatawordModel) {
+ return ((DatawordModel)parent).getChildren();
+ }
+ else {
+ return EMPTY_ARRAY;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordLabelProvider.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordLabelProvider.java
new file mode 100644
index 00000000000..96d294b1e66
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/DatawordLabelProvider.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.mux.datatable;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.osee.ote.ui.mux.msgtable.MessageNode;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ky Komadino
+ *
+ */
+public class DatawordLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public String getColumnText(Object obj, int index) {
+ if (obj != null && obj instanceof RowNode) {
+ if (index >= 0 && index <= 7)
+ return String.valueOf(((RowNode)obj).getDataword(index));
+ else
+ return "";
+ }
+ else
+ return "";
+ }
+
+ public Image getColumnImage(Object obj, int index) {
+ return getImage(obj);
+ }
+
+ public String getText(Object obj) {
+ return ((MessageNode)obj).getName();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/RowNode.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/RowNode.java
new file mode 100644
index 00000000000..4a29aba47bc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/datatable/RowNode.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.ui.mux.datatable;
+
+/**
+ * @author Ky Komadino
+ *
+ */
+public class RowNode {
+ private byte[] databytes;
+ private int numDatabytes;
+
+ public RowNode() {
+ databytes = new byte[16];
+ numDatabytes = 0;
+ }
+
+ public synchronized void setData(byte[] data) {
+ numDatabytes = data.length;
+ for (int i = 0; i < data.length && i < databytes.length; i++)
+ databytes[i] = data[i];
+ }
+
+ public synchronized void setDataword(int data, int index) {
+ databytes[index * 2] = (byte)((data & 0x0000FF00) >> 8);
+ databytes[index * 2 + 1] = (byte)(data & 0x000000FF);
+ }
+
+ public synchronized byte getDatabyte(int index) {
+ return databytes[index];
+ }
+
+ public synchronized String getDataword(int index) {
+ if (numDatabytes > index * 2 + 1)
+ return String.format("%02X%02X", (short)(databytes[index * 2] & 0x00FF),
+ (short)(databytes[index * 2 + 1] & 0x00FF));
+ else
+ return "";
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/DatawordModel.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/DatawordModel.java
new file mode 100644
index 00000000000..0605164dff6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/DatawordModel.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.ui.mux.model;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.util.HashMap;
+import org.eclipse.osee.ote.ui.mux.datatable.DataNode;
+
+/**
+ * @author Ky Komadino
+ *
+ */
+public class DatawordModel {
+ private final static Object[] EMPTY_ARRAY = new Object[0];
+ private HashMap<String, DataNode> dataNodes;
+ private final CharBuffer buffer = ByteBuffer.allocate(16).asCharBuffer();
+ private String currentNode = null;
+
+ public DatawordModel() {
+ dataNodes = new HashMap<String, DataNode>();
+ };
+
+ /**
+ * @param muxId - message ID
+ * @param node - node to add to list
+ */
+ public void addNode(String muxId, DataNode node) {
+ dataNodes.put(muxId, node);
+ }
+
+ /**
+ *
+ * @param node - currently selected node
+ */
+ public void setCurrentNode(String node) {
+ currentNode = node;
+ }
+
+ /**
+ * @return - values in list
+ */
+ public Object[] getChildren() {
+ if (currentNode != null) {
+ DataNode node = dataNodes.get(currentNode);
+ Object nodes[] = new Object[] {node.getRow(1), node.getRow(2), node.getRow(3), node.getRow(4)};
+ return nodes;
+ }
+ return EMPTY_ARRAY;
+ }
+
+ public void removeDatawords() {
+ dataNodes.clear();
+ }
+
+ public void onDataAvailable(ByteBuffer data) {
+ buffer.clear();
+ buffer.append(String.format("%02d", ((short)(data.array()[1] & 0x00F8)) >> 3));
+ final char transmitReceive = (data.array()[1] & 0x04) >> 2 == 1 ? 'T' : 'R';
+ buffer.append(transmitReceive);
+ buffer.append(String.format("%02d", (((short)(data.array()[1] & 0x0003)) << 3) +
+ (((short)(data.array()[2] & 0x00E0)) >> 5)));
+ String muxId = buffer.flip().toString();
+ DataNode receiveData = dataNodes.get(muxId);
+ if (receiveData == null) {
+ receiveData = new DataNode();
+ addNode(muxId, receiveData);
+ }
+ receiveData.setData(data);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/MessageModel.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/MessageModel.java
new file mode 100644
index 00000000000..e6a95a39c2e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/model/MessageModel.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.ui.mux.model;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.util.Collection;
+import java.util.HashMap;
+import org.eclipse.osee.ote.ui.mux.msgtable.MessageNode;
+
+/**
+ * @author Ky Komadino
+ */
+public class MessageModel {
+ private HashMap<String, MessageNode> messageNodes;
+ private final CharBuffer buffer = ByteBuffer.allocate(16).asCharBuffer();
+
+ public MessageModel() {
+ messageNodes = new HashMap<String, MessageNode>();
+ };
+
+ /**
+ * @param muxId - message ID
+ * @param node - node to add to list
+ */
+ public void addNode(String muxId, MessageNode node) {
+ messageNodes.put(muxId, node);
+ }
+
+ /**
+ * @return - values in list
+ */
+ public Collection<MessageNode> getChildren() {
+ return messageNodes.values();
+ }
+
+ public void removeMessages() {
+ messageNodes.clear();
+ }
+
+ public void onDataAvailable(ByteBuffer data) {
+ // if this is the "T" side of an RT-RT message, then discard
+ if ((data.array()[1] & 0x04) >> 2 == 1 && data.array()[3] != 0 && data.array()[4] != 0)
+ return;
+
+ buffer.clear();
+ buffer.append(String.format("%02d", ((short)(data.array()[1] & 0x00F8)) >> 3));
+ final char transmitReceive = (data.array()[1] & 0x04) >> 2 == 1 ? 'T' : 'R';
+ buffer.append(transmitReceive);
+ buffer.append(String.format("%02d", (((short)(data.array()[1] & 0x0003)) << 3) +
+ (((short)(data.array()[2] & 0x00E0)) >> 5)));
+ String muxId = buffer.flip().toString();
+ MessageNode receiveMessage = messageNodes.get(muxId);
+ if (receiveMessage == null) {
+ receiveMessage = new MessageNode(muxId);
+ addNode(muxId, receiveMessage);
+ }
+ receiveMessage.setData(data);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MessageNode.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MessageNode.java
new file mode 100644
index 00000000000..df5cedc0c88
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MessageNode.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.mux.msgtable;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+
+/**
+ * @author Ky Komadino
+ */
+public class MessageNode {
+ private final String name;
+ private int rt;
+ private String rtRt;
+ private int transmitReceive;
+ private int subaddress;
+ private int wordCount;
+ private String statusWord;
+ private String emulation;
+ private String bus;
+ private int activity;
+ private int errCount;
+ private String errType;
+ private CharBuffer temp = ByteBuffer.allocate(32).asCharBuffer();
+
+ public MessageNode(String muxId) {
+ this.name = muxId;
+ }
+
+ /**
+ *
+ * @param data - raw mux data from 1553 driver
+ */
+ public synchronized void setData(ByteBuffer data) {
+ if (data.array()[3] == 0 && data.array()[4] == 0) { // not an RT-RT msg
+ rt = ((short)(data.array()[1] & 0x00F8)) >> 3;
+ transmitReceive = ((short)(data.array()[1] & 0x0004)) >> 2;
+ subaddress = (((short)(data.array()[1] & 0x0003)) << 3) + (((short)(data.array()[2] & 0x00E0)) >> 5);
+ temp.clear();
+ temp.append(String.format(" "));
+ rtRt = temp.flip().toString();
+ }
+ else { // is an RT-RT msg, reference the "T" side datawords
+ rt = ((short)(data.array()[3] & 0x00F8)) >> 3;
+ transmitReceive = ((short)(data.array()[3] & 0x0004)) >> 2;
+ subaddress = (((short)(data.array()[3] & 0x0003)) << 3) + (((short)(data.array()[4] & 0x00E0)) >> 5);
+ temp.clear();
+ temp.append(String.format("%02d", ((short)(data.array()[3] & 0x00F8)) >> 3));
+ temp.append((data.array()[3] & 0x0004) >> 2 == 1 ? 'T' : 'R');
+ temp.append(String.format("%02d", (((short)(data.array()[3] & 0x0003)) << 3) +
+ (((short)(data.array()[4] & 0x00E0)) >> 5)));
+ rtRt = temp.flip().toString();
+ }
+
+ if (subaddress == 0 || subaddress == 31)
+ wordCount = (short)(data.array()[2] & 0x001F) >= 16 ? 1 : 0;
+ else
+ wordCount = (short)(data.array()[2] & 0x001F) == 0 ? 32 : (short)(data.array()[2] & 0x001F);
+
+ temp.clear();
+ temp.append(String.format("0x%02X%02X", data.array()[5], data.array()[6]));
+ statusWord = temp.flip().toString();
+
+ temp.clear();
+ switch (((short)(data.array()[9] & 0x00C0)) >> 6) {
+ case 1: temp.append("-/B");
+ break;
+ case 2: temp.append("A/-");
+ break;
+ case 3: temp.append("A/B");
+ break;
+ default: temp.append("MON");
+ }
+ emulation = temp.flip().toString();
+
+ temp.clear();
+ if ((short)(data.array()[10] & 0x0008) == 0)
+ temp.append(String.format("PRI"));
+ else
+ temp.append(String.format("SEC"));
+ bus = temp.flip().toString();
+
+ activity++;
+
+ temp.clear();
+ if ((short)(data.array()[10] & 0x0080) == 0) {
+ temp.append(" ");
+ }
+ else {
+ errCount++;
+ temp.append("NO RESPONSE");
+ }
+ errType = temp.flip().toString();
+ }
+
+ /**
+ * @return Returns the activity.
+ */
+ public synchronized int getActivity() {
+ return activity;
+ }
+
+ /**
+ * @return Returns the bus.
+ */
+ public synchronized String getBus() {
+ return bus.toString();
+ }
+
+ /**
+ * @return Returns the emulation.
+ */
+ public synchronized String getEmulation() {
+ return emulation.toString();
+ }
+
+ /**
+ * @return Returns the errCount.
+ */
+ public synchronized int getErrCount() {
+ return errCount;
+ }
+
+ /**
+ * @return Returns the errType.
+ */
+ public synchronized String getErrType() {
+ return errType.toString();
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public synchronized String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the rt.
+ */
+ public synchronized int getRt() {
+ return rt;
+ }
+
+ /**
+ * @return Returns the rtRt.
+ */
+ public synchronized String getRtRt() {
+ return rtRt.toString();
+ }
+
+ /**
+ * @return Returns the statusWord.
+ */
+ public synchronized String getStatusWord() {
+ return statusWord.toString();
+ }
+
+ /**
+ * @return Returns the subaddress.
+ */
+ public synchronized int getSubaddress() {
+ return subaddress;
+ }
+
+ /**
+ * @return Returns the transmitReceive.
+ */
+ public synchronized int getTransmitReceive() {
+ return transmitReceive;
+ }
+
+ /**
+ * @return Returns the wordCount.
+ */
+ public synchronized int getWordCount() {
+ return wordCount;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgContentProvider.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgContentProvider.java
new file mode 100644
index 00000000000..ed527f60297
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgContentProvider.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.mux.msgtable;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ote.ui.mux.model.MessageModel;
+
+/**
+ * @author Ky Komadino
+ *
+ */
+public class MuxMsgContentProvider implements IStructuredContentProvider {
+ private final static Object[] EMPTY_ARRAY = new Object[0];
+ private Viewer viewer;
+
+ public void refresh() {
+ viewer.refresh();
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ viewer = v;
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ if (parent instanceof MessageModel) {
+ return ((MessageModel)parent).getChildren().toArray();
+ }
+ else {
+ return EMPTY_ARRAY;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgLabelProvider.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgLabelProvider.java
new file mode 100644
index 00000000000..c619d1e550e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/msgtable/MuxMsgLabelProvider.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.ui.mux.msgtable;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Ky Komadino
+ *
+ */
+public class MuxMsgLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public String getColumnText(Object obj, int index) {
+ if (obj != null && obj instanceof MessageNode) {
+ switch (index) {
+ case 0:
+ return ((MessageNode)obj).getName();
+ case 1:
+ return ((MessageNode)obj).getRtRt();
+ case 2:
+ return String.valueOf(((MessageNode)obj).getWordCount());
+ case 3:
+ return ((MessageNode)obj).getStatusWord();
+ case 4:
+ return ((MessageNode)obj).getEmulation();
+ case 5:
+ return ((MessageNode)obj).getBus();
+ case 6:
+ return String.valueOf(((MessageNode)obj).getActivity());
+ case 7:
+ return String.valueOf(((MessageNode)obj).getErrCount());
+ case 8:
+ return ((MessageNode)obj).getErrType();
+ default:
+ return "";
+ }
+ }
+ else
+ return "";
+ }
+
+ public Image getColumnImage(Object obj, int index) {
+ return getImage(obj);
+ }
+
+ public String getText(Object obj) {
+ return ((MessageNode)obj).getName();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/IRegistrationListener.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/IRegistrationListener.java
new file mode 100644
index 00000000000..f3b99788341
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/IRegistrationListener.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.ui.mux.view;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+/**
+ * @author Ken J. Aguilar
+ *
+ */
+public interface IRegistrationListener extends Remote, IInstrumentationRegistrationListener {
+
+ void onRegistered(String name, IOInstrumentation instrumentation) throws RemoteException;
+
+ void onDeregistered(String name) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/MuxView.java b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/MuxView.java
new file mode 100644
index 00000000000..3ec829e28d9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.mux/src/org/eclipse/osee/ote/ui/mux/view/MuxView.java
@@ -0,0 +1,927 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.mux.view;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+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.ui.swt.PeriodicDisplayTask;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystem;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.ui.mux.MuxToolPlugin;
+import org.eclipse.osee.ote.ui.mux.datatable.DatawordContentProvider;
+import org.eclipse.osee.ote.ui.mux.datatable.DatawordLabelProvider;
+import org.eclipse.osee.ote.ui.mux.datatable.RowNode;
+import org.eclipse.osee.ote.ui.mux.model.DatawordModel;
+import org.eclipse.osee.ote.ui.mux.model.MessageModel;
+import org.eclipse.osee.ote.ui.mux.msgtable.MessageNode;
+import org.eclipse.osee.ote.ui.mux.msgtable.MuxMsgContentProvider;
+import org.eclipse.osee.ote.ui.mux.msgtable.MuxMsgLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ControlEditor;
+import org.eclipse.swt.custom.TableCursor;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The
+ * sample creates a dummy model on the fly, but a real implementation would connect to the model available either in
+ * this or another plug-in (e.g. the workspace). The view is connected to the model using a content provider.
+ * <p>
+ * The view uses a label provider to define how model objects should be presented in the view. Each view can present the
+ * same model objects using different labels and icons, if needed. Alternatively, a single label provider can be shared
+ * between views in order to ensure that objects of the same type are presented in the same way everywhere.
+ * <p>
+ */
+
+public class MuxView extends ViewPart implements ITestConnectionListener, IInstrumentationRegistrationListener, Remote {
+ private TableViewer msgViewer1, msgViewer2, msgViewer3, msgViewer5;
+ private TableViewer dataViewer1, dataViewer2, dataViewer3, dataViewer5;
+ private MessageModel chan1Msgs, chan2Msgs, chan3Msgs, chan5Msgs;
+ private DatawordModel chan1Dwrds, chan2Dwrds, chan3Dwrds, chan5Dwrds;
+ private IOInstrumentation muxProbe;
+ private PeriodicDisplayTask task;
+ private ListenerThread thread;
+ private int port;
+ private int selectedChannel;
+ private int selectedRt;
+ private int selectedTR;
+ private int selectedSubaddr;
+ private final static Color GRAY = Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
+ private final static Color WHITE = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
+
+ private IInstrumentationRegistrationListener exportedThis;
+
+ public static final String VIEW_ID = "osee.test.muxTool.views.MuxView";
+ class NameSorter extends ViewerSorter {
+ }
+
+ /**
+ * The constructor.
+ */
+ public MuxView() {
+ super();
+ }
+
+ /**
+ * This is a callback that will allow us to create the viewers and initialize them.
+ */
+ public void createPartControl(Composite parent) {
+ final TabFolder tabFolder = new TabFolder(parent, SWT.WRAP);
+ tabFolder.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ switch (tabFolder.getSelectionIndex()) {
+ case 0:
+ selectedChannel = 1;
+ break;
+ case 1:
+ selectedChannel = 2;
+ break;
+ case 2:
+ selectedChannel = 3;
+ break;
+ case 3:
+ selectedChannel = 5;
+ break;
+ default:
+ selectedChannel = 1;
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ // Setup Channel 1 display
+ TabItem chan1Tab = new TabItem(tabFolder, SWT.NONE);
+ chan1Tab.setText("Channel 1");
+ Composite chan1TabComp = new Composite(tabFolder, SWT.NONE);
+ chan1Tab.setControl(chan1TabComp);
+ GridLayout chan1Layout = new GridLayout(1, false);
+ chan1TabComp.setLayout(chan1Layout);
+ msgViewer1 = new TableViewer(chan1TabComp, SWT.BORDER | SWT.FULL_SELECTION);
+ msgViewer1.setContentProvider(new MuxMsgContentProvider());
+ msgViewer1.setLabelProvider(new MuxMsgLabelProvider());
+ msgViewer1.setSorter(new NameSorter());
+ createMsgTable(msgViewer1);
+ Composite bottom1 = new Composite(chan1TabComp, SWT.NONE);
+ bottom1.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ bottom1.setLayout(new GridLayout(2, false));
+
+ Composite data1 = new Composite(bottom1, SWT.NONE);
+ RowLayout dataLayout1 = new RowLayout(SWT.HORIZONTAL);
+ data1.setLayout(dataLayout1);
+
+ Composite labels1 = new Composite(data1, SWT.NONE);
+ RowLayout labelLayout1 = new RowLayout(SWT.VERTICAL);
+ labelLayout1.marginTop = 5;
+ labelLayout1.spacing = 1;
+ labels1.setLayout(labelLayout1);
+ Label label1_1 = new Label(labels1, SWT.NONE);
+ label1_1.setText("Datawords 1-8");
+ Label label2_1 = new Label(labels1, SWT.NONE);
+ label2_1.setText("Datawords 9-16");
+ Label label3_1 = new Label(labels1, SWT.NONE);
+ label3_1.setText("Datawords 17-24");
+ Label label4_1 = new Label(labels1, SWT.NONE);
+ label4_1.setText("Datawords 25-32");
+
+ Composite datawords1 = new Composite(data1, SWT.NONE);
+ datawords1.setLayout(new GridLayout(1, false));
+ dataViewer1 = new TableViewer(datawords1, SWT.BORDER | SWT.FULL_SELECTION);
+ dataViewer1.setContentProvider(new DatawordContentProvider());
+ dataViewer1.setLabelProvider(new DatawordLabelProvider());
+ createDwordTable(dataViewer1);
+ msgViewer1.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ MessageNode node = (MessageNode) selection.getFirstElement();
+ if (node != null) {
+ selectedRt = node.getRt();
+ selectedTR = node.getTransmitReceive();
+ selectedSubaddr = node.getSubaddress();
+ chan1Dwrds.setCurrentNode(node.getName());
+ }
+ }
+ });
+ final Button reset1 = new Button(bottom1, SWT.PUSH);
+ reset1.setText("Reset Display");
+ reset1.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL));
+ reset1.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ selectedRt = 0;
+ selectedTR = 0;
+ selectedSubaddr = 0;
+ chan1Msgs.removeMessages();
+ chan1Dwrds.setCurrentNode(null);
+ }
+ });
+
+ // Setup Channel 2 display
+ TabItem chan2Tab = new TabItem(tabFolder, SWT.NONE);
+ chan2Tab.setText("Channel 2");
+ Composite chan2TabComp = new Composite(tabFolder, SWT.NONE);
+ chan2Tab.setControl(chan2TabComp);
+ GridLayout chan2Layout = new GridLayout(1, false);
+ chan2TabComp.setLayout(chan2Layout);
+ msgViewer2 = new TableViewer(chan2TabComp, SWT.BORDER | SWT.FULL_SELECTION);
+ msgViewer2.setContentProvider(new MuxMsgContentProvider());
+ msgViewer2.setLabelProvider(new MuxMsgLabelProvider());
+ msgViewer2.setSorter(new NameSorter());
+ createMsgTable(msgViewer2);
+ Composite bottom2 = new Composite(chan2TabComp, SWT.NONE);
+ bottom2.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ bottom2.setLayout(new GridLayout(2, false));
+
+ Composite data2 = new Composite(bottom2, SWT.NONE);
+ RowLayout dataLayout2 = new RowLayout(SWT.HORIZONTAL);
+ data2.setLayout(dataLayout2);
+
+ Composite labels2 = new Composite(data2, SWT.NONE);
+ RowLayout lableLayout2 = new RowLayout(SWT.VERTICAL);
+ lableLayout2.marginTop = 5;
+ lableLayout2.spacing = 1;
+ labels2.setLayout(lableLayout2);
+ Label label1_2 = new Label(labels2, SWT.NONE);
+ label1_2.setText("Datawords 1-8");
+ Label label2_2 = new Label(labels2, SWT.NONE);
+ label2_2.setText("Datawords 9-16");
+ Label label3_2 = new Label(labels2, SWT.NONE);
+ label3_2.setText("Datawords 17-24");
+ Label label4_2 = new Label(labels2, SWT.NONE);
+ label4_2.setText("Datawords 25-32");
+
+ Composite datawords2 = new Composite(data2, SWT.NONE);
+ datawords2.setLayout(new GridLayout(1, false));
+ dataViewer2 = new TableViewer(datawords2, SWT.BORDER | SWT.FULL_SELECTION);
+ dataViewer2.setContentProvider(new DatawordContentProvider());
+ dataViewer2.setLabelProvider(new DatawordLabelProvider());
+ createDwordTable(dataViewer2);
+ msgViewer2.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ MessageNode node = (MessageNode) selection.getFirstElement();
+ if (node != null) {
+ selectedRt = node.getRt();
+ selectedTR = node.getTransmitReceive();
+ selectedSubaddr = node.getSubaddress();
+ chan2Dwrds.setCurrentNode(node.getName());
+ }
+ }
+ });
+ final Button reset2 = new Button(bottom2, SWT.PUSH);
+ reset2.setText("Reset Display");
+ reset2.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL));
+ reset2.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ selectedRt = 0;
+ selectedTR = 0;
+ selectedSubaddr = 0;
+ chan2Msgs.removeMessages();
+ chan2Dwrds.setCurrentNode(null);
+ }
+ });
+
+ // Setup Channel 3 display
+ TabItem chan3Tab = new TabItem(tabFolder, SWT.NONE);
+ chan3Tab.setText("Channel 3");
+ Composite chan3TabComp = new Composite(tabFolder, SWT.NONE);
+ chan3Tab.setControl(chan3TabComp);
+ GridLayout chan3Layout = new GridLayout(1, false);
+ chan3TabComp.setLayout(chan3Layout);
+ msgViewer3 = new TableViewer(chan3TabComp, SWT.BORDER | SWT.FULL_SELECTION);
+ msgViewer3.setContentProvider(new MuxMsgContentProvider());
+ msgViewer3.setLabelProvider(new MuxMsgLabelProvider());
+ msgViewer3.setSorter(new NameSorter());
+ createMsgTable(msgViewer3);
+ Composite bottom3 = new Composite(chan3TabComp, SWT.NONE);
+ bottom3.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ bottom3.setLayout(new GridLayout(2, false));
+
+ Composite data3 = new Composite(bottom3, SWT.NONE);
+ RowLayout dataLayout3 = new RowLayout(SWT.HORIZONTAL);
+ data3.setLayout(dataLayout3);
+
+ Composite labels3 = new Composite(data3, SWT.NONE);
+ RowLayout lableLayout3 = new RowLayout(SWT.VERTICAL);
+ lableLayout3.marginTop = 5;
+ lableLayout3.spacing = 1;
+ labels3.setLayout(lableLayout3);
+ Label label1_3 = new Label(labels3, SWT.NONE);
+ label1_3.setText("Datawords 1-8");
+ Label label2_3 = new Label(labels3, SWT.NONE);
+ label2_3.setText("Datawords 9-16");
+ Label label3_3 = new Label(labels3, SWT.NONE);
+ label3_3.setText("Datawords 17-24");
+ Label label4_3 = new Label(labels3, SWT.NONE);
+ label4_3.setText("Datawords 25-32");
+
+ Composite datawords3 = new Composite(data3, SWT.NONE);
+ datawords3.setLayout(new GridLayout(1, false));
+ dataViewer3 = new TableViewer(datawords3, SWT.BORDER | SWT.FULL_SELECTION);
+ dataViewer3.setContentProvider(new DatawordContentProvider());
+ dataViewer3.setLabelProvider(new DatawordLabelProvider());
+ createDwordTable(dataViewer3);
+ msgViewer3.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ MessageNode node = (MessageNode) selection.getFirstElement();
+ if (node != null) {
+ selectedRt = node.getRt();
+ selectedTR = node.getTransmitReceive();
+ selectedSubaddr = node.getSubaddress();
+ chan3Dwrds.setCurrentNode(node.getName());
+ }
+ }
+ });
+ final Button reset3 = new Button(bottom3, SWT.PUSH);
+ reset3.setText("Reset Display");
+ reset3.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL));
+ reset3.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ selectedRt = 0;
+ selectedTR = 0;
+ selectedSubaddr = 0;
+ chan3Msgs.removeMessages();
+ chan3Dwrds.setCurrentNode(null);
+ }
+ });
+
+ // Setup Channel 5 display
+ TabItem chan5Tab = new TabItem(tabFolder, SWT.NONE);
+ chan5Tab.setText("Channel 5");
+ Composite chan5TabComp = new Composite(tabFolder, SWT.NONE);
+ chan5Tab.setControl(chan5TabComp);
+ GridLayout chan5Layout = new GridLayout(1, false);
+ chan5TabComp.setLayout(chan5Layout);
+ msgViewer5 = new TableViewer(chan5TabComp, SWT.BORDER | SWT.FULL_SELECTION);
+ msgViewer5.setContentProvider(new MuxMsgContentProvider());
+ msgViewer5.setLabelProvider(new MuxMsgLabelProvider());
+ msgViewer5.setSorter(new NameSorter());
+ createMsgTable(msgViewer5);
+ Composite bottom5 = new Composite(chan5TabComp, SWT.NONE);
+ bottom5.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ bottom5.setLayout(new GridLayout(2, false));
+
+ Composite data5 = new Composite(bottom5, SWT.NONE);
+ RowLayout dataLayout5 = new RowLayout(SWT.HORIZONTAL);
+ data5.setLayout(dataLayout5);
+
+ Composite labels5 = new Composite(data5, SWT.NONE);
+ RowLayout lableLayout5 = new RowLayout(SWT.VERTICAL);
+ lableLayout5.marginTop = 5;
+ lableLayout5.spacing = 1;
+ labels5.setLayout(lableLayout5);
+ Label label1_5 = new Label(labels5, SWT.NONE);
+ label1_5.setText("Datawords 1-8");
+ Label label2_5 = new Label(labels5, SWT.NONE);
+ label2_5.setText("Datawords 9-16");
+ Label label3_5 = new Label(labels5, SWT.NONE);
+ label3_5.setText("Datawords 17-24");
+ Label label4_5 = new Label(labels5, SWT.NONE);
+ label4_5.setText("Datawords 25-32");
+
+ Composite datawords5 = new Composite(data5, SWT.NONE);
+ datawords5.setLayout(new GridLayout(1, false));
+ dataViewer5 = new TableViewer(datawords5, SWT.BORDER | SWT.FULL_SELECTION);
+ dataViewer5.setContentProvider(new DatawordContentProvider());
+ dataViewer5.setLabelProvider(new DatawordLabelProvider());
+ createDwordTable(dataViewer5);
+ msgViewer5.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ MessageNode node = (MessageNode) selection.getFirstElement();
+ if (node != null) {
+ selectedRt = node.getRt();
+ selectedTR = node.getTransmitReceive();
+ selectedSubaddr = node.getSubaddress();
+ chan5Dwrds.setCurrentNode(node.getName());
+ }
+ }
+ });
+ final Button reset5 = new Button(bottom5, SWT.PUSH);
+ reset5.setText("Reset Display");
+ reset5.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL));
+ reset5.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ selectedRt = 0;
+ selectedTR = 0;
+ selectedSubaddr = 0;
+ chan5Msgs.removeMessages();
+ chan5Dwrds.setCurrentNode(null);
+ }
+ });
+ msgViewer1.setInput(chan1Msgs = new MessageModel());
+ dataViewer1.setInput(chan1Dwrds = new DatawordModel());
+ msgViewer2.setInput(chan2Msgs = new MessageModel());
+ dataViewer2.setInput(chan2Dwrds = new DatawordModel());
+ msgViewer3.setInput(chan3Msgs = new MessageModel());
+ dataViewer3.setInput(chan3Dwrds = new DatawordModel());
+ msgViewer5.setInput(chan5Msgs = new MessageModel());
+ dataViewer5.setInput(chan5Dwrds = new DatawordModel());
+ updateColors(false);
+ try {
+ thread = new ListenerThread();
+ } catch (Exception e) {
+ OseeLog.log(MuxView.class, Level.SEVERE, "Mux View could not start listening thread", e);
+ MessageDialog.openError(parent.getShell(), "Error", "Mux View could not initialize. See Error Log for details");
+ return;
+ }
+ thread.start();
+
+ task = new PeriodicDisplayTask(Display.getDefault(), 333) {
+ @Override
+ protected void update() {
+ try {
+ msgViewer1.refresh();
+ dataViewer1.refresh();
+ msgViewer2.refresh();
+ dataViewer2.refresh();
+ msgViewer3.refresh();
+ dataViewer3.refresh();
+ msgViewer5.refresh();
+ dataViewer5.refresh();
+ } catch (Throwable t) {
+ OseeLog.log(MuxToolPlugin.class, Level.SEVERE, "problems refreshing viewer", t);
+ stop();
+ }
+ }
+ };
+ task.start();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.osee.ote.ui.mux.muxView");
+ MuxToolPlugin.getDefault().getOteClientService().addConnectionListener(this);
+ }
+
+ /**
+ * Create the Mux Message Tree
+ */
+ private void createMsgTable(TableViewer parent) {
+ final Table table = parent.getTable();
+ GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
+ int height = table.getItemHeight() * 20;
+ Rectangle trim = table.computeTrim(0, 0, 0, height);
+ gridData.heightHint = trim.height;
+ table.setLayoutData(gridData);
+ table.setHeaderVisible(true);
+ TableColumn column = new TableColumn(table, SWT.CENTER, 0);
+ column.setText("Message");
+ column.setWidth(70);
+ column = new TableColumn(table, SWT.CENTER, 1);
+ column.setText("RT-RT");
+ column.setWidth(60);
+ column = new TableColumn(table, SWT.CENTER, 2);
+ column.setText("Word Cnt");
+ column.setWidth(70);
+ column = new TableColumn(table, SWT.CENTER, 3);
+ column.setText("StatusWd");
+ column.setWidth(70);
+ column = new TableColumn(table, SWT.CENTER, 4);
+ column.setText("Emulation");
+ column.setWidth(70);
+ column = new TableColumn(table, SWT.CENTER, 5);
+ column.setText("Bus");
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 6);
+ column.setText("Activity");
+ column.setWidth(60);
+ column = new TableColumn(table, SWT.CENTER, 7);
+ column.setText("Error Cnt");
+ column.setWidth(70);
+ column = new TableColumn(table, SWT.CENTER, 8);
+ column.setText("Error Type");
+ column.setWidth(150);
+
+ table.addMouseListener(new MouseAdapter() {
+ public void mouseDown(final MouseEvent event) {
+ if (event.button == 3) {
+ Menu menu = new Menu(table.getShell(), SWT.POP_UP);
+ MenuItem enableBoth = new MenuItem(menu, SWT.PUSH);
+ enableBoth.setText("Emulate RT (Pri + Sec)");
+ enableBoth.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (muxProbe != null) {
+ byte[] cmd = new byte[4];
+ cmd[0] = 'R'; // RT simulation cmd
+ cmd[1] = (byte) selectedChannel;
+ cmd[2] = (byte) selectedRt;
+ cmd[3] = (byte) 3;
+ try {
+ muxProbe.command(cmd);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.WARNING,
+ "MuxView unable to send RT simulation command");
+ }
+ }
+ }
+ });
+ MenuItem enableA = new MenuItem(menu, SWT.PUSH);
+ enableA.setText("Emulate RT (Pri Only)");
+ enableA.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (muxProbe != null) {
+ byte[] cmd = new byte[4];
+ cmd[0] = 'R'; // RT simulation cmd
+ cmd[1] = (byte) selectedChannel;
+ cmd[2] = (byte) selectedRt;
+ cmd[3] = (byte) 1;
+ try {
+ muxProbe.command(cmd);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.WARNING,
+ "MuxView unable to send RT simulation command");
+ }
+ }
+ }
+ });
+ MenuItem enableB = new MenuItem(menu, SWT.PUSH);
+ enableB.setText("Emulate RT (Sec only)");
+ enableB.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (muxProbe != null) {
+ byte[] cmd = new byte[4];
+ cmd[0] = 'R'; // RT simulation cmd
+ cmd[1] = (byte) selectedChannel;
+ cmd[2] = (byte) selectedRt;
+ cmd[3] = (byte) 2;
+ try {
+ muxProbe.command(cmd);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.WARNING,
+ "MuxView unable to send RT simulation command");
+ }
+ }
+ }
+ });
+ new MenuItem(menu, SWT.SEPARATOR);
+ MenuItem disableBoth = new MenuItem(menu, SWT.PUSH);
+ disableBoth.setText("Monitor RT (Pri + Sec)");
+ disableBoth.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ if (muxProbe != null) {
+ byte[] cmd = new byte[4];
+ cmd[0] = 'R'; // RT simulation cmd
+ cmd[1] = (byte) selectedChannel;
+ cmd[2] = (byte) selectedRt;
+ cmd[3] = (byte) 0;
+ try {
+ muxProbe.command(cmd);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.WARNING,
+ "MuxView unable to send RT simulation command");
+ }
+ }
+ }
+ });
+
+ // draws pop up menu:
+ Point pt = new Point(event.x, event.y);
+ pt = table.toDisplay(pt);
+ menu.setLocation(pt.x, pt.y);
+ menu.setVisible(true);
+ }
+ }
+ });
+
+ }
+
+ /**
+ * Create the Datawords Tree
+ */
+ private void createDwordTable(final TableViewer parent) {
+ final Table table = parent.getTable();
+ GridData gridData = new GridData();
+ int height = table.getItemHeight() * 2;
+ Rectangle trim = table.computeTrim(0, 0, 0, height);
+ gridData.heightHint = trim.height;
+ table.setLayoutData(gridData);
+ table.setHeaderVisible(false);
+ table.setLinesVisible(true);
+
+ TableColumn column = new TableColumn(table, SWT.CENTER, 0);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 1);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 2);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 3);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 4);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 5);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 6);
+ column.setWidth(50);
+ column = new TableColumn(table, SWT.CENTER, 7);
+ column.setWidth(50);
+
+ table.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+
+ final TableCursor cursor = new TableCursor(table, SWT.NONE);
+ final ControlEditor editor = new ControlEditor(cursor);
+ editor.grabHorizontal = true;
+ editor.grabVertical = true;
+
+ cursor.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ final Text text = new Text(cursor, SWT.NONE);
+ text.setTextLimit(4);
+ TableItem row = cursor.getRow();
+ int column = cursor.getColumn();
+ text.setText(row.getText(column));
+ text.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent e) {
+ // close the text editor and copy the data over
+ // when the user hits "ENTER"
+ if (e.character == SWT.CR) {
+ TableItem row = cursor.getRow();
+ int column = cursor.getColumn();
+ int newVal = Integer.parseInt(text.getText(), 16);
+ row.setText(column, text.getText());
+ text.dispose();
+ cursor.dispose();
+ if (muxProbe != null) {
+ byte[] cmd = new byte[100];
+ int index = 0;
+ cmd[index++] = 'S'; // set 1553 data cmd
+ cmd[index++] = (byte) selectedChannel;
+ cmd[index++] = (byte) selectedRt;
+ cmd[index++] = (byte) selectedTR;
+ cmd[index++] = (byte) selectedSubaddr;
+ Object[] o = ((DatawordModel) parent.getInput()).getChildren();
+ ((RowNode) o[table.indexOf(row)]).setDataword(newVal, column);
+ for (Object r : o) {
+ for (int i = 0; i < 16; i++) {
+ cmd[index++] = ((RowNode) r).getDatabyte(i);
+ }
+ }
+ try {
+ muxProbe.command(cmd);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.WARNING,
+ "MuxView unable to send RT simulation command");
+ }
+ }
+ }
+ // close the text editor when the user hits
+ // "ESC"
+ if (e.character == SWT.ESC) {
+ text.dispose();
+ cursor.dispose();
+ }
+ // allow only hexadecimal characters, backspace,
+ // delete,
+ // left and right arrow keys
+ if (e.character >= 0x30 && e.character <= 0x39 || e.character >= 0x41 && e.character <= 0x46 || e.character >= 0x61 && e.character <= 0x66 || e.character == SWT.BS || e.character == SWT.DEL || e.keyCode == SWT.ARROW_LEFT || e.keyCode == SWT.ARROW_RIGHT)
+ e.doit = true;
+ else
+ e.doit = false;
+ }
+ });
+ // close the text editor when the user clicks away
+ text.addFocusListener(new FocusAdapter() {
+ public void focusLost(FocusEvent e) {
+ text.dispose();
+ cursor.dispose();
+ }
+ });
+ editor.setEditor(text);
+ text.setFocus();
+ }
+ });
+ table.deselectAll();
+ }
+ });
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ // msgViewer1.getControl().setFocus();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.ui.test.manager.data.plugin.TestToolViewPart#dispose
+ * ()
+ */
+ @Override
+ public void dispose() {
+ MuxToolPlugin.getDefault().getOteClientService().removeConnectionListener(this);
+ ITestEnvironment env = MuxToolPlugin.getDefault().getOteClientService().getConnectedEnvironment();
+ if (env != null) {
+ try {
+ ((ITestEnvironmentMessageSystem) env).removeInstrumentationRegistrationListener(exportedThis);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxView.class, Level.WARNING, "could not deregister instrumentation registration listener", ex);
+ }
+ IServiceConnector connector = MuxToolPlugin.getDefault().getOteClientService().getConnector();
+ try {
+ connector.unexport(this);
+ } catch (Exception ex) {
+ OseeLog.log(MuxView.class, Level.WARNING, "could not unexport this", ex);
+ }
+ }
+ if (muxProbe != null) {
+ try {
+ muxProbe.unregister(thread.address);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxView.class, Level.WARNING, "could not disconnect from mux probe", ex);
+ }
+ muxProbe = null;
+ }
+ if (task != null) {
+ task.stop();
+ }
+ thread.shutdown();
+
+ super.dispose();
+ }
+
+ class ListenerThread extends Thread {
+ private volatile boolean done = false;
+ private final DatagramChannel channel;
+ private final InetSocketAddress address;
+
+ public ListenerThread()throws IOException {
+ super("Mux View Listener Thread");
+ channel = DatagramChannel.open();
+ port = PortUtil.getInstance().getValidPort();
+ address = new InetSocketAddress(InetAddress.getLocalHost(), port);
+ channel.socket().bind(address);
+ OseeLog.log(MuxToolPlugin.class, Level.INFO,
+ "MuxView connection - host: " + address.getHostName() + " port: " + address.getPort());
+ }
+
+ public void run() {
+ final ByteBuffer buffer = ByteBuffer.wrap(new byte[256]);
+ try {
+ while (!done) {
+ buffer.clear();
+ channel.receive(buffer);
+ buffer.flip();
+ switch (buffer.array()[0]) {
+ case 1:
+ chan1Msgs.onDataAvailable(buffer);
+ chan1Dwrds.onDataAvailable(buffer);
+ break;
+ case 2:
+ chan2Msgs.onDataAvailable(buffer);
+ chan2Dwrds.onDataAvailable(buffer);
+ break;
+ case 3:
+ chan3Msgs.onDataAvailable(buffer);
+ chan3Dwrds.onDataAvailable(buffer);
+ break;
+ case 5:
+ chan5Msgs.onDataAvailable(buffer);
+ chan5Dwrds.onDataAvailable(buffer);
+ }
+ }
+ } catch (InterruptedIOException e) {
+ Thread.currentThread().interrupt();
+ } catch (IOException e) {
+ if (!isInterrupted()) {
+ OseeLog.log(MuxToolPlugin.class, Level.SEVERE, "Interrupted", e);
+ }
+ } finally {
+ try {
+ channel.close();
+ } catch (IOException e) {
+ // do nothing
+ }
+ }
+ }
+
+ public void shutdown() {
+ done = true;
+ interrupt();
+ try {
+ thread.join(5000);
+ assert !channel.isOpen();
+ } catch (InterruptedException e) {
+ OseeLog.log(MuxView.class, Level.SEVERE, "could not join wiht listener thread", e);
+ }
+ }
+ }
+
+ @Override
+ public void onConnectionLost(IServiceConnector connector, IHostTestEnvironment testHost) {
+ handleConnectionLostStatus();
+ }
+
+ @Override
+ public void onPostConnect(final ConnectionEvent event) {
+ final ITestEnvironmentMessageSystem environment = (ITestEnvironmentMessageSystem) event.getEnvironment();
+ if (environment != null) {
+ // we are connected
+ try {
+ exportedThis = (IInstrumentationRegistrationListener) event.getConnector().findExport(MuxView.this);
+ if (exportedThis == null) {
+ exportedThis = (IInstrumentationRegistrationListener) event.getConnector().export(MuxView.this);
+ }
+ environment.addInstrumentationRegistrationListener(exportedThis);
+ } catch (Exception ex) {
+ OseeLog.log(MuxView.class, Level.SEVERE, "could not register for instrumentation events", ex);
+ Display.getDefault().asyncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Connect Error", "Could not register for instrumentation events. See Error Log for details");
+ }
+
+ });
+
+ }
+ }
+
+ }
+
+ private void detach() {
+
+ }
+
+ @Override
+ public void onPreDisconnect(ConnectionEvent event) {
+ final ITestEnvironmentMessageSystem environment = (ITestEnvironmentMessageSystem) event.getEnvironment();
+ try {
+ environment.removeInstrumentationRegistrationListener(exportedThis);
+ } catch (RemoteException ex1) {
+ OseeLog.log(MuxToolPlugin.class, Level.SEVERE, "Problem unregistering instrumentation registration listener", ex1);
+ }
+
+ if (muxProbe != null) {
+ try {
+ muxProbe.unregister(thread.address);
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.SEVERE, "Problem unregistering socket address", ex);
+ } finally {
+ muxProbe = null;
+ }
+ }
+ handleConnectionLostStatus();
+ }
+
+ private void handleConnectionLostStatus() {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ updateColors(false);
+ // we are not connected
+ if (task != null) {
+ task.stop();
+ }
+ }
+ });
+ }
+
+ private void updateColors(boolean connected) {
+ msgViewer1.getTable().setBackground(connected ? WHITE : GRAY);
+ msgViewer2.getTable().setBackground(connected ? WHITE : GRAY);
+ msgViewer3.getTable().setBackground(connected ? WHITE : GRAY);
+ msgViewer5.getTable().setBackground(connected ? WHITE : GRAY);
+ dataViewer1.getTable().setBackground(connected ? WHITE : GRAY);
+ dataViewer2.getTable().setBackground(connected ? WHITE : GRAY);
+ dataViewer3.getTable().setBackground(connected ? WHITE : GRAY);
+ dataViewer5.getTable().setBackground(connected ? WHITE : GRAY);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.IInstrumentationRegistrationListener#onDeregistered(java.lang.String)
+ */
+ @Override
+ public void onDeregistered(String name) throws RemoteException{
+ if (muxProbe != null && name.equals("MUXIO")) {
+ muxProbe = null;
+ handleConnectionLostStatus();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.IInstrumentationRegistrationListener#onRegistered(java.lang.String, org.eclipse.osee.ote.message.instrumentation.IOInstrumentation)
+ */
+ @Override
+ public void onRegistered(String name, IOInstrumentation instrumentation) throws RemoteException{
+ try {
+ if (muxProbe == null && name.equals("MUXIO")) {
+ muxProbe = instrumentation;
+ Display.getDefault().asyncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ if (task != null) task.start();
+ updateColors(true);
+ }
+
+ });
+ muxProbe.register(thread.address);
+
+
+ }
+ } catch (RemoteException ex) {
+ OseeLog.log(MuxToolPlugin.class, Level.SEVERE,
+ "Problem registering socket address with remote instrumentation service", ex);
+ }
+
+ }
+}
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 00000000000..0bd94243f0a
--- /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="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.ui.test.manager/.project b/org.eclipse.osee.ote.ui.test.manager/.project
new file mode 100644
index 00000000000..3893fc2b846
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.project
@@ -0,0 +1,28 @@
+<?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>
+ </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/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osee.ote.ui.test.manager/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..5ebe512e636
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Mon Dec 19 15:23:15 MST 2005
+eclipse.preferences.version=1
+encoding//support/output.xsd=UTF8
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 00000000000..3b133b2d3b6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF
@@ -0,0 +1,51 @@
+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.4.0.qualifier
+Bundle-ClassPath: manager.jar
+Bundle-Activator: org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin
+Bundle-Vendor: Eclipse.org
+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.ui.skynet,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.framework.svn,
+ 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
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.jdt.core,
+ org.eclipse.osee.framework.db.connection.exception
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 00000000000..b0bf0fe54c1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/build.properties
@@ -0,0 +1,11 @@
+source.manager.jar = src/
+output.manager.jar = bin/
+bin.includes = plugin.xml,\
+ manager.jar,\
+ support/output.xsd,\
+ images/,\
+ META-INF/,\
+ src/,\
+ contexts/,\
+ help/,\
+ references/
diff --git a/org.eclipse.osee.ote.ui.test.manager/contexts/tmAdvancedPage.xml b/org.eclipse.osee.ote.ui.test.manager/contexts/tmAdvancedPage.xml
new file mode 100644
index 00000000000..82d9f6f21e3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/contexts/tmAdvancedPage.xml
@@ -0,0 +1,8 @@
+<contexts>
+ <context id="tm_advanced_page" title="Test Manager Advanced Page">
+ <description>Provides options of the execution and analysis of OSEE test programs.</description>
+ <topic href="references/tm_advancedPage_scriptOptions.html" label="Script Options"/>
+ <topic href="references/tm_advancedPage_executionOptions.html" label="Execution Options"/>
+ <topic href="references/tm_advancedPage_markerOptions.html" label="Marker Options"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/contexts/tmHostsPage.xml b/org.eclipse.osee.ote.ui.test.manager/contexts/tmHostsPage.xml
new file mode 100644
index 00000000000..884231b23fe
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/contexts/tmHostsPage.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="tm_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="references/tm_hostsPage.html" label="Connecting to and Viewing Test Servers"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/contexts/tmOverviewPage.xml b/org.eclipse.osee.ote.ui.test.manager/contexts/tmOverviewPage.xml
new file mode 100644
index 00000000000..51bf2b36f44
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/contexts/tmOverviewPage.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="tm_overview_page" title="Test Manager Overview Page">
+ <description>Displays overview information and provides a bug report mechanism.</description>
+ <topic label="Report a bug" href="../osee.ats/reference/report_a_bug.html"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/contexts/tmScriptsPage.xml b/org.eclipse.osee.ote.ui.test.manager/contexts/tmScriptsPage.xml
new file mode 100644
index 00000000000..7f29692deb5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/contexts/tmScriptsPage.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="tm_scripts_page" title="Test Manager Scripts Page">
+ <description>Controls the exections of test programs.</description>
+ <topic href="references/tm_scriptsPage.html" label="Running Test Programs"/>
+ </context>
+</contexts> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/SourcePage.JPG b/org.eclipse.osee.ote.ui.test.manager/help/SourcePage.JPG
new file mode 100644
index 00000000000..bc468f9e2dc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/SourcePage.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/advancedPage.JPG b/org.eclipse.osee.ote.ui.test.manager/help/advancedPage.JPG
new file mode 100644
index 00000000000..18e68528c09
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/advancedPage.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/advancedPage.html b/org.eclipse.osee.ote.ui.test.manager/help/advancedPage.html
new file mode 100644
index 00000000000..e734625ac4c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/advancedPage.html
@@ -0,0 +1,20 @@
+<html>
+
+ <head>
+ <title>Test Manager Hosts Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Test Manager Advanced Page</h1>
+ <p>The Advanced Page of the Test Manager is the page where configuration
+ options can be set.&nbsp; This page can be tailored to the individual
+ needs of the project that is employing the Test Manager.&nbsp; In the
+ example shown, the term ofp is the name for the code that is being
+ tested.</p>
+
+ <h2><img border="0" src="advancedPage.JPG" width="827" height="731"></h2>
+ <h2>&nbsp;</h2>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/hostsPage.JPG b/org.eclipse.osee.ote.ui.test.manager/help/hostsPage.JPG
new file mode 100644
index 00000000000..3a9b982546c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/hostsPage.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/hostsPage.html b/org.eclipse.osee.ote.ui.test.manager/help/hostsPage.html
new file mode 100644
index 00000000000..3d5520aff89
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/hostsPage.html
@@ -0,0 +1,27 @@
+<html>
+
+ <head>
+ <title>Test Manager Hosts Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Test Manager Hosts Page</h1>
+ <p>The Hosts page of Test Manager shows the test servers that are available for the user to
+ connect to. These test servers are the services that the test scripts code is actually run.&nbsp; Below is a screenshot showing an example of the Hosts tab with a test server available
+ to be connected to before the user is connected. A user can connect a test server from
+ this page.&nbsp; This table is an XViewer Table which allows the user to
+ employ column sorting.</p>
+
+ <h2><img border="0" src="hostsPage.JPG"></h2>
+ <p>&nbsp;</p>
+ <p>&nbsp;</p>
+
+ <p>Below is the same example after a user named osee has connected to the test server.
+ Notice the lightning bolt in the left column of the server entry in the table and the
+ user's name in the User column.<p>
+
+ <h2><img border="0" src="hostsPage2.JPG"></h2>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/hostsPage2.JPG b/org.eclipse.osee.ote.ui.test.manager/help/hostsPage2.JPG
new file mode 100644
index 00000000000..eebf6f4694c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/hostsPage2.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/overview.html b/org.eclipse.osee.ote.ui.test.manager/help/overview.html
new file mode 100644
index 00000000000..d6acedff706
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/overview.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+<h1>Test Manager Overview</h1>
+
+<p>
+The test manager is the application that is used to run test programs in the OTE (OSEE Test
+Environment). The Test Manager is in the editor area of Eclipse.
+</p>
+<p>
+In the OTE, tests are run which are referred to as test scripts. The Test Manager has multiple
+pages which are used to manage the running of these scripts. To navigate to each page, the user selects
+the associated tab on the bottom of the Test Manager. The Overview page can be configured
+with some basic overview info for the particular configuration that is extending the OTE.
+The Hosts page allows the user to see and connect to test environments that are used in the running
+of scripts. The Scripts page is the page where the scripts are actually run. The Advanced page
+has many configuration options related to the running of scripts. The Source page is where codes
+to run the scripts against can be specified.
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/overviewPage.html b/org.eclipse.osee.ote.ui.test.manager/help/overviewPage.html
new file mode 100644
index 00000000000..000bfd98e0a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/overviewPage.html
@@ -0,0 +1,16 @@
+<html>
+
+ <head>
+ <title>Test Manager Overview Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Test Manager Overview Page</h1>
+ The Overview page of Test Manager allows for some brief overview information related
+ to the configuration of the Test Manager.
+
+ <h2><img border="0" src="overviewPage.jpg"></h2>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/overviewPage.jpg b/org.eclipse.osee.ote.ui.test.manager/help/overviewPage.jpg
new file mode 100644
index 00000000000..1e28862c8b9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/overviewPage.jpg
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.JPG b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.JPG
new file mode 100644
index 00000000000..c6ca61a9013
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.html b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.html
new file mode 100644
index 00000000000..0e863240e40
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage.html
@@ -0,0 +1,57 @@
+<html>
+
+ <head>
+ <title>Test Manager Hosts Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Test Manager Scripts Page</h1>
+ <p>The Scripts page of Test Manager is the page that is the main
+ controller of running test scripts.&nbsp; Below is a screenshot of the
+ Script page with no scripts in it.&nbsp; There is a box near the bottom
+ that has information related to the running of the scripts.&nbsp; There
+ are also widgets along the top of the page that allow for saving and
+ loading of script run lists, clearing out of scripts highlighted, code
+ to run against selection, and a test server connection widget.&nbsp; The
+ running and aborting widgets are there as well, though they are grayed
+ out since the user is not connected to a test server yet.&nbsp;
+ </p>
+
+ <h2>
+ <img border="0" src="scriptsPage.JPG" width="819" height="707"></h2>
+
+ <p>&nbsp;<p>&nbsp;<p>Below, the user has put some test scripts in the
+ Script page.&nbsp; The check box to the left is for determining if the
+ script will be run when the play button (which is still grayed out).&nbsp;
+ The names of the test scripts are in the Test column.&nbsp; The Status
+ column shows the current status of the test script, and they all show
+ NOT_CONNECTED when the Test Manager is not connected to a test server.&nbsp;
+ The location of the test script is also shown.<p>
+ <img border="0" src="scriptsPage2.JPG" width="819" height="707"></p>
+ <p>&nbsp;</p>
+ <p>
+ &nbsp;</p>
+ <p>
+ In this shot, the Test Manager has now connected to a test server.&nbsp;
+ The status of the scripts is shown as READY, and the test server
+ connection widget is now shown as a lightning bolt.&nbsp; Also, notice
+ that the green play button is not grayed out anymore.&nbsp; It can be
+ selected to start the running of the selected test scripts.</p>
+ <p><img border="0" src="scriptsPage3.JPG" width="819" height="707"></p>
+ <p>
+ &nbsp;</p>
+ <p>
+ &nbsp;</p>
+ <p>Below, the test script run is in progress.&nbsp; Notice the first
+ script is completed and there is a checkmark in the Output File column.&nbsp;
+ That signifies that an output file has been created for the completed
+ run.&nbsp; The user can double-click the checkmark to open the output
+ file.&nbsp; The results of the run are shown in the Result column, and
+ it even shows the results while in progress.&nbsp; The first script
+ passed all 721 test point.&nbsp; The 2nd script&nbsp; is still running
+ and has failed 1 of the 9 test points so far.</p>
+ <p><img border="0" src="scriptsPage4.JPG" width="819" height="707"></p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage2.JPG b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage2.JPG
new file mode 100644
index 00000000000..9ff4571c43a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage2.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage3.JPG b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage3.JPG
new file mode 100644
index 00000000000..979b725108d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage3.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage4.JPG b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage4.JPG
new file mode 100644
index 00000000000..d251fed6d46
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/scriptsPage4.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/sourcePage.html b/org.eclipse.osee.ote.ui.test.manager/help/sourcePage.html
new file mode 100644
index 00000000000..858509ff8a1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/sourcePage.html
@@ -0,0 +1,17 @@
+<html>
+
+ <head>
+ <title>Test Manager Overview Tab</title>
+ <LINK rel="stylesheet" type="text/css" href="../../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h1>Test Manager Source Page</h1>
+ The Source page of Test Manager allows the user to enter source code
+ location to run against.&nbsp; It also contains the location to place
+ the Description information that shows up on the Overview Page.
+
+ <h2><img border="0" src="SourcePage.JPG" width="827" height="731"></h2>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/testing.html b/org.eclipse.osee.ote.ui.test.manager/help/testing.html
new file mode 100644
index 00000000000..9cd2adbb8a8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/testing.html
@@ -0,0 +1,19 @@
+<html>
+
+ <head>
+ <title>Testing Overview</title>
+ </head>
+
+ <body>
+ <h1>Testing Overview</h1>
+ The purpose of this section is to familiarize testers with the information
+ needed to perform test development and debugging using Eclipse. The first
+ section refers to the OSEE User Training and all others will guide you through
+ the test-specific information.
+ <br></br>
+ <a href="training.html">Training</a><br></br>
+
+ <a href="train_cvs.html">CVS Repository</a><br></br>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/testing.xml b/org.eclipse.osee.ote.ui.test.manager/help/testing.xml
new file mode 100644
index 00000000000..445eb1d1186
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/testing.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Testing" topic="help/testing.html">
+
+ <topic label="Training" href="help/training.html"/>
+
+</toc>
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/toc.html b/org.eclipse.osee.ote.ui.test.manager/help/toc.html
new file mode 100644
index 00000000000..880d2e4f5b3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/toc.html
@@ -0,0 +1,19 @@
+
+<html>
+
+ <head>
+ <title>OSEE Test Manager Users Guide</title>
+ </head>
+
+ <body>
+ <h1>OSEE Test Manager Users Guide</h1>
+ <p></p>
+ The OSEE Test Manager Users guide is for any person who will be using OSEE for testing.
+ <br></br>
+ <a href="training.html">Training</a><br></br>
+ <p></p>
+ <a href="testing.html">Testing</a><br></br>
+ <p></p>
+ </body>
+
+</html>
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/toc.xml b/org.eclipse.osee.ote.ui.test.manager/help/toc.xml
new file mode 100644
index 00000000000..a46b77a0252
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/toc.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.osee.ote.core/help/toc.xml#tools" label="OSEE Test Manager Users Guide" topic="help/help.html">
+
+ <topic label="Test Manager">
+ <topic label="Overview" href="help/overview.html" />
+ <topic label="Overview Page" href="help/overviewPage.html" />
+ <topic label="Hosts Page" href="help/hostsPage.html" />
+ <topic label="Scripts Page" href="help/scriptsPage.html" />
+ <topic label="Advanced Page" href="help/advancedPage.html" />
+ <topic label="Source Page" href="help/sourcePage.html" />
+ </topic>
+
+</toc>
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/train_javadev.html b/org.eclipse.osee.ote.ui.test.manager/help/train_javadev.html
new file mode 100644
index 00000000000..b704148182d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/train_javadev.html
@@ -0,0 +1,24 @@
+<html>
+
+ <head>
+ <title>OSEE Java Development Environment</title>
+ </head>
+
+ <body>
+ <h1>OSEE Java Development Environment</h1>
+
+ <br></br>
+ The purpose of this section is to focus the training of the
+ <b><font color = "midnightblue">Java Development Users Guide</font></b>
+ specifically for OSEE Test Users.
+ <br></br>
+ It is recommend that OSEE Test Users read through all information contained in this
+ section of the training.
+ <br></br>
+ <font size="-1">Note: All information in the
+ <b><font color = "midnightblue">Java Development Users Guide</font></b> is
+ useful but the information contained in this section has been selected
+ to focus on for the purpose of introductory training. As time permits other topics
+ should be read for further training.</font>
+ </body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/train_javaprog.html b/org.eclipse.osee.ote.ui.test.manager/help/train_javaprog.html
new file mode 100644
index 00000000000..0d58ea7694b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/train_javaprog.html
@@ -0,0 +1,25 @@
+<html>
+
+ <head>
+ <title>Java Programming Language</title>
+ </head>
+
+ <body>
+ <h1>Java Programming Language</h1>
+
+ <p>The purpose of this section is to provide resources to train engineers of various
+ experience levels in the Java programming language.</p>
+ <p>Select one or more of the following resources for Java Programming Language training
+ (more options will be added later for different levels of programming experience):</p>
+
+ <p></p>
+ <a href="http://java.sun.com/docs/white/langenv/index.html" target="_blank">Beginner Java - Overview</a><br></br>
+ or copy and paste <b>http://java.sun.com/docs/white/langenv/index.html</b> into your browser <p></p>
+ <a href="http://java.sun.com/docs/books/tutorial/java/index.html" target="_blank">Beginner Java Training</a><br></br>
+ or copy and paste <b>http://java.sun.com/docs/books/tutorial/java/index.html</b> into your browser <p></p>
+ <p></p>
+
+ <p></p>
+ <p></p>
+ </body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/train_wbench.html b/org.eclipse.osee.ote.ui.test.manager/help/train_wbench.html
new file mode 100644
index 00000000000..d7d6072196c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/train_wbench.html
@@ -0,0 +1,32 @@
+<html>
+
+ <head>
+ <title>OSEE Workbench</title>
+ </head>
+
+ <body>
+ <h1>OSEE Workbench</h1>
+
+ <p>The purpose of this section is to focus the training of the <img src="../icons/document_sm.gif" alt=""/>
+ <b><font color = "midnightblue">Workbench Users Guide</font></b> specifically for OSEE Users.
+ The following sections should be read for training on the OSEE Workbench:
+ </p>
+
+ <ul><li>Basic Tutorial</li>
+ <li>Workbench</li>
+ <li>Perspectives</li>
+ <li>Editors</li>
+ <li>Toolbars</li>
+ <li>Help System</li>
+ <li>Team programming with CVS</li></ul>
+
+
+ <p>
+ <font size="-1"/>Note: All information in the <img src="../icons/document_sm.gif" alt=""/>
+ <font color="midnightblue"/><b>Workbench Users Guide</b><font color="black"/> is
+ useful but the above areas have been selected to focus on for the purpose
+ of introductory training. As time permits other topics should be read for
+ further training.
+ </p>
+ </body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/training.html b/org.eclipse.osee.ote.ui.test.manager/help/training.html
new file mode 100644
index 00000000000..e8a7e45af67
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/training.html
@@ -0,0 +1,25 @@
+
+<html>
+
+ <head>
+ <title>Training</title>
+ </head>
+
+ <body>
+ <h1>Training</h1>
+ <p></p>
+ <p>The purpose of this section is to provide training to all OSEE Test Users.
+ The three topics of training listed below should be completed in the order in which you see.
+ </p>
+ <p></p>
+ <p> </p>
+
+ <a href="train_wbench.html">OSEE Workbench</a><br></br>
+ <p></p>
+ <a href="train_javadev.html">Java Development Environment</a><br></br>
+ <p></p>
+ <a href="train_javaprog.html">Java Programming Language</a><br></br>
+ <p></p>
+ </body>
+
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/help/training.xml b/org.eclipse.osee.ote.ui.test.manager/help/training.xml
new file mode 100644
index 00000000000..0bb6cd6a866
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/help/training.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Training" topic="help/training.html">
+ <topic label="OSEE Workbench" href="help/train_wbench.html">
+ <link toc = "../org.eclipse.platform.doc.user/topics_GettingStarted.xml"/>
+ <link toc = "../org.eclipse.platform.doc.user/topics_Concepts.xml"/>
+ </topic>
+ <topic label="OSEE Java Development Environment"
+ href="help/train_javadev.html">
+ <link toc = "../org.eclipse.jdt.doc.user/topics_GettingStarted.xml"/>
+ <link toc = "../org.eclipse.jdt.doc.user/topics_Concepts.xml"/>
+ </topic>
+ <topic label="Java Programming Language" href="help/train_javaprog.html"/>
+</toc>
+
+
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 00000000000..6cf3b5f1cad
--- /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 00000000000..7a49f6d4548
--- /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 00000000000..b04deb3c266
--- /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 00000000000..6b3078b35cf
--- /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 00000000000..7aa131aedb6
--- /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 00000000000..9cacb96dca9
--- /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 00000000000..8290462e353
--- /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 00000000000..8493df40dfe
--- /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 00000000000..b397d8b2c1c
--- /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 00000000000..d18ebcb646c
--- /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 00000000000..2e74d0afbe9
--- /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 00000000000..2cd9c544436
--- /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 00000000000..61648a3d153
--- /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 00000000000..f3377f38f83
--- /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 00000000000..8612eaff599
--- /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 00000000000..e61fc24f930
--- /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 00000000000..7ccc6a70317
--- /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 00000000000..45699b57dbb
--- /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 00000000000..bbfa55fe565
--- /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 00000000000..64b499c97ff
--- /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 00000000000..b6858690c89
--- /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 00000000000..9bdbc128f49
--- /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 00000000000..1c36fc1a906
--- /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 00000000000..d38085ad9c2
--- /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 00000000000..4bc7dd4930c
--- /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 00000000000..f92b0e803f7
--- /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 00000000000..eea29736686
--- /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 00000000000..12c79020162
--- /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 00000000000..d19d763eb3f
--- /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 00000000000..df3ed441bf2
--- /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 00000000000..9302c4ec688
--- /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 00000000000..d7f9c614496
--- /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 00000000000..6cb4431c61b
--- /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 00000000000..a1feb00a6bc
--- /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 00000000000..41991b2e3ec
--- /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 00000000000..e1dde912dcb
--- /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 00000000000..da16deae3cf
--- /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 00000000000..e7903b5c4db
--- /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 00000000000..dcdb06c0f73
--- /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 00000000000..f96466208d2
--- /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 00000000000..7793f3b823e
--- /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 00000000000..ad403d95d3b
--- /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 00000000000..b8e969feb97
--- /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 00000000000..07c5346e0c4
--- /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 00000000000..0849e03b62b
--- /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 00000000000..8fa8ea101db
--- /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 00000000000..f0b55748b75
--- /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 00000000000..4a70a050ca0
--- /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 00000000000..170b0e15f22
--- /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 00000000000..d4848c0e18a
--- /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 00000000000..c0b47e1958b
--- /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 00000000000..96f464d6798
--- /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 00000000000..28f1fd5eecb
--- /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 00000000000..9ba15cf846f
--- /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 00000000000..deee2f43c6c
--- /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 00000000000..d7726f75b57
--- /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 00000000000..d0a18fa7a9d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/plugin.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="AdvancedPageContribution" name="AdvancedPageContribution" schema="schema/AdvancedPageContribution.exsd"/>
+
+ <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.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ <toc
+ file="help/training.xml">
+ </toc>
+ <toc
+ file="help/testing.xml">
+ </toc>
+ </extension>
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ objectClass="org.eclipse.jdt.core.ICompilationUnit"
+ nameFilter="*"
+ id="org.eclipse.osee.ote.ui.test.manager.contribution1">
+ <menu
+ label="Test Manager"
+ path="additions"
+ id="org.eclipse.osee.ote.ui.test.manager.menu1">
+ <separator
+ name="markers">
+ </separator>
+ </menu>
+ <action
+ enablesFor="1"
+ 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.test.manager.menu1/markers"
+ 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.jdt.ui.source.menu"
+ id="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerEditorAction"
+ class="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerEditorAction"/>
+ </viewerContribution>
+ <objectContribution
+ adaptable="true"
+ id="org.eclipse.osee.ote.ui.test.manager.TestManagerMenu"
+ objectClass="org.eclipse.jdt.core.IJavaProject">
+ <menu
+ id="org.eclipse.osee.ote.ui.test.manager.menu1"
+ label="Test Batch"
+ path="additions">
+ <separator
+ name="separator1">
+ </separator>
+ </menu>
+ </objectContribution>
+ <objectContribution
+ id="org.eclipse.osee.ote.ui.test.manager.TestBatchActions"
+ objectClass="org.eclipse.jdt.core.IJavaProject">
+ <visibility>
+ <not>
+ <objectState
+ name="nature"
+ value="org.eclipse.osee.ote.ui.test.manager.TestBatchProjectNature">
+ </objectState>
+ </not>
+ </visibility>
+ <action
+ class="org.eclipse.osee.ote.ui.test.manager.batches.actions.AddTestBatchProjectNature"
+ enablesFor="1"
+ icon="images/add.gif"
+ id="org.eclipse.osee.ote.ui.test.manager.action1"
+ label="Add Test Batch Nature"
+ menubarPath="org.eclipse.osee.ote.ui.test.manager.menu1/separator1">
+ </action>
+ </objectContribution>
+ <objectContribution
+ id="org.eclipse.osee.ote.ui.test.manager.TestBatchProjects"
+ objectClass="org.eclipse.jdt.core.IJavaProject">
+ <visibility>
+ <objectState
+ name="nature"
+ value="org.eclipse.osee.ote.ui.test.manager.TestBatchProjectNature">
+ </objectState>
+ </visibility>
+ <action
+ class="org.eclipse.osee.ote.ui.test.manager.batches.actions.RemoveTestBatchProjectNature"
+ enablesFor="1"
+ icon="images/delete.gif"
+ id="org.eclipse.osee.ote.ui.test.manager.action2"
+ label="Remove Test Batch Nature"
+ menubarPath="org.eclipse.osee.ote.ui.test.manager.menu1/separator1">
+ </action>
+ </objectContribution>
+ </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.help.contexts">
+ <contexts file="contexts/tmAdvancedPage.xml"/>
+ <contexts file="contexts/tmHostsPage.xml"/>
+ <contexts file="contexts/tmScriptsPage.xml"/>
+ <contexts file="contexts/tmOverviewPage.xml"/>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ote.ui.test.manager.AdvancedPageContribution">
+ <AdvancedPageContribution
+ classname="org.eclipse.osee.ote.ui.test.manager.pages.contributions.ScriptExecutionContribution">
+ </AdvancedPageContribution>
+ </extension>
+ <extension
+ id="TestBatchProjectNature"
+ name="Test Batch Nature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.osee.ote.ui.test.manager.batches.TestBatchProjectNature">
+ </run>
+ </runtime>
+ </extension>
+ <extension
+ point="org.eclipse.ui.decorators">
+ <decorator
+ adaptable="true"
+ class="org.eclipse.osee.ote.ui.test.manager.batches.TestBatchDecorator"
+ icon="images/test.gif"
+ id="org.eclipse.osee.ote.ui.test.manager.decorator"
+ label="Test Batch Project"
+ lightweight="true"
+ location="TOP_RIGHT"
+ state="true">
+ <description>
+ A Test Batch Project contains project set files and test manager batch config files which allow users to quickly setup their test manager and workspace.
+ </description>
+ <enablement>
+ <or>
+ <and>
+ <objectClass name="org.eclipse.jdt.core.IJavaProject"/>
+ <objectState
+ value="org.eclipse.osee.ote.ui.test.manager.TestBatchProjectNature"
+ name="nature"/>
+ </and>
+ <and>
+ <objectClass name="org.eclipse.core.resources.IProject"/>
+ <objectState
+ value="org.eclipse.osee.ote.ui.test.manager.TestBatchProjectNature"
+ name="nature"/>
+ </and>
+ </or>
+ </enablement>
+ </decorator>
+ </extension>
+ <extension
+ point="org.eclipse.osee.ote.ui.OteNavigateItem">
+ <IOteNavigateItem
+ classname="org.eclipse.osee.ote.ui.test.manager.batches.navigate.TestBatchSetupViewItems">
+ </IOteNavigateItem>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_executionOptions.html b/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_executionOptions.html
new file mode 100644
index 00000000000..e6e6cbb85c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_executionOptions.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h2>Help Under Construction</h2>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_markerOptions.html b/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_markerOptions.html
new file mode 100644
index 00000000000..e6e6cbb85c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_markerOptions.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h2>Help Under Construction</h2>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_scriptOptions.html b/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_scriptOptions.html
new file mode 100644
index 00000000000..e6e6cbb85c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/references/tm_advancedPage_scriptOptions.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h2>Help Under Construction</h2>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/references/tm_hostsPage.html b/org.eclipse.osee.ote.ui.test.manager/references/tm_hostsPage.html
new file mode 100644
index 00000000000..c8bae8da010
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/references/tm_hostsPage.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h2>Help Under Construction</h2>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/references/tm_overviewPage.html b/org.eclipse.osee.ote.ui.test.manager/references/tm_overviewPage.html
new file mode 100644
index 00000000000..e6e6cbb85c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/references/tm_overviewPage.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h2>Help Under Construction</h2>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/references/tm_scriptsPage.html b/org.eclipse.osee.ote.ui.test.manager/references/tm_scriptsPage.html
new file mode 100644
index 00000000000..e6e6cbb85c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/references/tm_scriptsPage.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>Artifact Explorer</title>
+ <LINK rel="stylesheet" type="text/css" href="../../osee.help/html/style.css">
+ </head>
+
+ <body>
+ <h2>Help Under Construction</h2>
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/schema/AdvancedPageContribution.exsd b/org.eclipse.osee.ote.ui.test.manager/schema/AdvancedPageContribution.exsd
new file mode 100644
index 00000000000..a158a5985ac
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/schema/AdvancedPageContribution.exsd
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.ui.test.manager">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ote.ui.test.manager" id="AdvancedPageContribution" name="AdvancedPageContribution"/>
+ </appInfo>
+ <documentation>
+ Contributions to this extension point provide contributions to the Test Manager Advanced Page.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="AdvancedPageContribution"/>
+ </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="AdvancedPageContribution">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution"/>
+ </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>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/Debug.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/Debug.java
new file mode 100644
index 00000000000..bf860a58298
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/Debug.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.ui.test.manager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class Debug extends org.eclipse.osee.framework.ui.plugin.util.Debug {
+
+ /**
+ * @param debugOn
+ * @param timeStampOn
+ * @param nameSpace
+ */
+ public Debug(boolean debugOn, boolean timeStampOn, String nameSpace) {
+ super(debugOn, timeStampOn, nameSpace);
+ }
+
+ /**
+ * @param debugOn
+ * @param nameSpace
+ */
+ public Debug(boolean debugOn, String nameSpace) {
+ super(debugOn, nameSpace);
+ }
+
+ protected String getPluginName() {
+ return TestManagerPlugin.getInstance().getPluginName();
+ }
+}
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 00000000000..1da8e47a88f
--- /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 00000000000..9ea6ee6d3a8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java
@@ -0,0 +1,36 @@
+/*
+ * Created on Jun 12, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.ui.test.manager;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author b1528444
+ *
+ */
+public enum OteTestManagerImage implements OseeImage {
+ PROJECT_SET_IMAGE("import_wiz.gif"),
+ TEST_BATCH_IMAGE("file.gif"),
+ TEST_MANAGER("tm.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/TestManagerPlugin.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/TestManagerPlugin.java
new file mode 100644
index 00000000000..422ee9179f7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/TestManagerPlugin.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.ui.test.manager;
+
+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.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;
+ /**
+ * Returns the shared instance.
+ */
+ public static TestManagerPlugin getInstance() {
+ return pluginInstance;
+ }
+ public String getPluginName() {
+ return pluginInstance.toString();
+ }
+
+ 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();
+ pluginInstance = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ oteClientServiceTracker = new ServiceTracker(context,
+ IOteClientService.class.getName(), null);
+ oteClientServiceTracker.open();
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ oteClientServiceTracker.close();
+ }
+
+
+ public IOteClientService getOteClientService() {
+ return (IOteClientService) oteClientServiceTracker.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/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 00000000000..0287f623657
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.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.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.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 {
+
+
+ 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(iFile.getLocation().toOSString());
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ 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 00000000000..4313c9341cb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.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.ui.test.manager.actions;
+
+import java.util.Iterator;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.ote.ui.test.manager.operations.AddIFileToTestManager;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+public class AddToTestManagerPopupAction implements IWorkbenchWindowActionDelegate {
+
+ public static String getSelection() {
+ StructuredSelection sel = AWorkspace.getSelection();
+ Iterator<?> i = sel.iterator();
+ String selection = "";
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+ if (resource != null) selection = resource.getLocation().toOSString();
+ } else if (obj instanceof ICompilationUnit) {
+ ICompilationUnit resource = (ICompilationUnit) obj;
+ if (resource != null) selection = resource.getResource().getLocation().toOSString();
+ }
+ }
+ return selection;
+ }
+
+ IWorkbenchWindow activeWindow = null;
+
+ // IWorkbenchWindowActionDelegate method
+ public void dispose() {
+ // nothing to do
+ }
+
+ // IWorkbenchWindowActionDelegate method
+ public void init(IWorkbenchWindow window) {
+ activeWindow = window;
+ }
+
+ public void run(IAction proxyAction) {
+ String file = getSelection();
+ if (file == null || file.equals("")) {
+ AWorkbench.popup("ERROR", "Can't retrieve file");
+ return;
+ }
+ AddIFileToTestManager.getOperation().addIFileToScriptsPage(file);
+ }
+
+ // IActionDelegate method
+ 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 00000000000..9b6bb788db1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.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.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 {
+
+ public void run(IAction action) {
+
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ 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/batches/TestBatchDecorator.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchDecorator.java
new file mode 100644
index 00000000000..8f32af493ea
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchDecorator.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.ui.test.manager.batches;
+
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.batches.util.SelectionUtil;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IDecoratorManager;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestBatchDecorator extends LabelProvider implements ILightweightLabelDecorator {
+ private static final String DECORATOR_ID = "org.eclipse.osee.ote.ui.test.manager.decorator";
+ private static final ImageDescriptor IMAGE = TestManagerPlugin.getInstance().getImageDescriptor("test.gif");
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
+ */
+ public void decorate(Object element, IDecoration decoration) {
+ try {
+ IProject project = null;
+ if (element instanceof IJavaProject) {
+ project = ((IJavaProject) element).getProject();
+ } else {
+ project = (IProject) element;
+ }
+ if (project.isOpen() && project.hasNature(TestBatchProjectNature.NATURE_ID)) {
+ decoration.addOverlay(IMAGE);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, SelectionUtil.getStatusMessages(ex));
+ }
+ }
+
+ private void startDecoratorUpdate(IProject project) {
+ final LabelProviderChangedEvent evnt = new LabelProviderChangedEvent(this, project);
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ fireLabelProviderChanged(evnt);
+ }
+ });
+ }
+
+ public static void performLabelDecoratorUpdate(IProject project) {
+ IDecoratorManager decoratorManager = TestManagerPlugin.getInstance().getWorkbench().getDecoratorManager();
+ IBaseLabelProvider provider = decoratorManager.getBaseLabelProvider(DECORATOR_ID);
+ if (provider != null) {
+ TestBatchDecorator decorator = (TestBatchDecorator) provider;
+ decorator.startDecoratorUpdate(project);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchProjectNature.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchProjectNature.java
new file mode 100644
index 00000000000..a453ee9dcae
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/TestBatchProjectNature.java
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.batches;
+
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+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.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.batches.navigate.TestBatchRegistry;
+import org.eclipse.osee.ote.ui.test.manager.batches.navigate.TestBatchSetupViewItems;
+import org.eclipse.osee.ote.ui.test.manager.batches.util.ResourceFinder;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestBatchProjectNature implements IProjectNature {
+ public static final String NATURE_ID = "org.eclipse.osee.ote.ui.test.manager.TestBatchProjectNature";
+ private IProject project;
+ private ResourceFinder resourceFinder;
+ private IResourceChangeListener resourceChangeListener;
+ private IResourceChangeListener projectClosedListener;
+ private IResourceChangeListener projectDeletedListener;
+ private FindResourceWorker worker;
+
+ public TestBatchProjectNature() {
+ this.resourceFinder = new ResourceFinder();
+ this.resourceChangeListener = new TestBatchResourceChangeListener();
+ this.projectClosedListener = new TestBatchProjectClosedListener();
+ this.projectDeletedListener = new TestBatchProjectDeletedListener();
+ this.worker = new FindResourceWorker(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#configure()
+ */
+ @Override
+ public void configure() throws CoreException {
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ workspace.addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
+ workspace.addResourceChangeListener(projectClosedListener, IResourceChangeEvent.PRE_CLOSE);
+ workspace.addResourceChangeListener(projectDeletedListener, IResourceChangeEvent.PRE_DELETE);
+ ResourcesPlugin.getWorkspace().getRoot().getWorkspace().run(worker, new NullProgressMonitor());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#deconfigure()
+ */
+ @Override
+ public void deconfigure() throws CoreException {
+ TestBatchRegistry registry = TestBatchSetupViewItems.getInstance().getRegistry();
+ for (String key : resourceFinder.getIds()) {
+ registry.deregisterTestBatch(key);
+ }
+ TestBatchDecorator.performLabelDecoratorUpdate(project);
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ workspace.removeResourceChangeListener(resourceChangeListener);
+ workspace.removeResourceChangeListener(projectClosedListener);
+ workspace.removeResourceChangeListener(projectDeletedListener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#getProject()
+ */
+ @Override
+ public IProject getProject() {
+ return this.project;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
+ */
+ @Override
+ public void setProject(IProject project) {
+ this.project = project;
+ }
+
+ public ResourceFinder getResourceFinder() {
+ return resourceFinder;
+ }
+
+ public FindResourceWorker getWorker() {
+ return worker;
+ }
+
+ public static void initializeProjectSet() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+ for (IProject project : projects) {
+ try {
+ if (project != null && project.isOpen() == true) {
+ IProjectNature nature = project.getNature(TestBatchProjectNature.NATURE_ID);
+ if (nature != null) {
+ nature.configure();
+ }
+ }
+ } catch (CoreException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "Error initializing project nature", ex);
+ }
+ }
+ }
+ });
+ }
+
+ private final class TestBatchProjectDeletedListener implements IResourceChangeListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ try {
+ IResource resource = event.getResource();
+ if (resource != null) {
+ IProject project = resource.getProject();
+ if (project != null) {
+ final IProjectNature nature = project.getNature(NATURE_ID);
+ if (nature != null) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ TestBatchProjectNature batchProjectNature = (TestBatchProjectNature) nature;
+ TestBatchRegistry registry = TestBatchSetupViewItems.getInstance().getRegistry();
+ for (String key : batchProjectNature.getResourceFinder().getIds()) {
+ registry.deregisterTestBatch(key);
+ }
+ }
+ });
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "Error during resource change event", ex);
+ }
+ }
+
+ }
+
+ private final class TestBatchProjectClosedListener implements IResourceChangeListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ try {
+ IResource resource = event.getResource();
+ if (resource != null) {
+ IProject project = resource.getProject();
+ if (project != null) {
+ final IProjectNature nature = project.getNature(NATURE_ID);
+ if (nature != null) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ TestBatchProjectNature tbpNature = (TestBatchProjectNature) nature;
+ TestBatchRegistry registry = TestBatchSetupViewItems.getInstance().getRegistry();
+ for (String key : tbpNature.getResourceFinder().getIds()) {
+ registry.deregisterTestBatch(key);
+ }
+ }
+ });
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "Error during resource change event", ex);
+ }
+ }
+ }
+
+ private final class TestBatchResourceChangeListener implements IResourceChangeListener {
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ try {
+ IResourceDelta delta = event.getDelta();
+ IResourceDelta[] children = delta.getAffectedChildren();
+ for (IResourceDelta childDelta : children) {
+ IResource resource = childDelta.getResource();
+ if (resource != null) {
+ IProject project = resource.getProject();
+ if (project != null) {
+ if (project.isOpen() != false && project.isNatureEnabled(NATURE_ID)) {
+ final IProjectNature nature = project.getNature(NATURE_ID);
+ if (nature != null) {
+ handleProjectFilesChanging((TestBatchProjectNature) nature);
+ }
+ }
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "Error during resource change event", ex);
+ }
+ }
+
+ private void handleProjectFilesChanging(final TestBatchProjectNature nature) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ nature.getWorker().run(new NullProgressMonitor());
+ } catch (CoreException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+ };
+
+ private final class FindResourceWorker implements IWorkspaceRunnable {
+
+ private TestBatchProjectNature nature;
+
+ public FindResourceWorker(TestBatchProjectNature nature) {
+ this.nature = nature;
+ }
+
+ @Override
+ public void run(IProgressMonitor monitor) throws CoreException {
+ ResourceFinder finder = nature.getResourceFinder();
+ finder.findBatchAndProjectFiles(nature.getProject());
+ TestBatchRegistry registry = TestBatchSetupViewItems.getInstance().getRegistry();
+ for (String key : finder.getIds()) {
+ Pair<IFile, IFile> fileSet = finder.getFileSet(key);
+ registry.registerTestBatch(key, fileSet.getKey().getLocationURI(), fileSet.getValue().getLocationURI());
+ }
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ TestBatchDecorator.performLabelDecoratorUpdate(nature.getProject());
+ }
+ });
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/AddTestBatchProjectNature.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/AddTestBatchProjectNature.java
new file mode 100644
index 00000000000..a6a7ad07f6b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/AddTestBatchProjectNature.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.ui.test.manager.batches.actions;
+
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.ApplicationWindow;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.batches.TestBatchProjectNature;
+import org.eclipse.osee.ote.ui.test.manager.batches.util.SelectionUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AddTestBatchProjectNature implements IObjectActionDelegate {
+ private static final String NATURE_ADDED = "Test Batch Nature Added";
+ private static final String ADDING_NATURE = "Adding Test Batch Nature";
+
+ private IJavaProject currentJavaProject;
+ private IProject currentProject;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ // Do Nothing
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+ */
+ public void run(IAction action) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ Cursor waitCursor = new Cursor(window.getShell().getDisplay(), SWT.CURSOR_WAIT);
+ try {
+ window.getShell().setCursor(waitCursor);
+ ((ApplicationWindow) window).setStatus(ADDING_NATURE);
+
+ //new way
+ if (currentJavaProject == null) {
+ // if the java nature is not present
+ // it must be added, along with the test batch nature
+ IProjectDescription description = currentProject.getDescription();
+ String[] natureIds = description.getNatureIds();
+ String[] newNatures = new String[natureIds.length + 2];
+ System.arraycopy(natureIds, 0, newNatures, 0, natureIds.length);
+ newNatures[newNatures.length - 2] = JavaCore.NATURE_ID;
+ newNatures[newNatures.length - 1] = TestBatchProjectNature.NATURE_ID;
+ description.setNatureIds(newNatures);
+ currentProject.setDescription(description, null);
+
+ currentJavaProject = (IJavaProject) JavaCore.create((IProject) currentProject);
+ } else {
+ //add the test batch nature, the java nature is already present
+ IProjectDescription description = currentJavaProject.getProject().getDescription();
+ String[] natures = description.getNatureIds();
+ String[] newNatures = new String[natures.length + 1];
+ System.arraycopy(natures, 0, newNatures, 0, natures.length);
+ newNatures[natures.length] = TestBatchProjectNature.NATURE_ID;
+ description.setNatureIds(newNatures);
+ currentJavaProject.getProject().setDescription(description, null);
+ }
+
+ // refresh project so user sees new files, libraries, etc
+ currentJavaProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
+ ((ApplicationWindow) window).setStatus(NATURE_ADDED);
+
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, String.format("Error adding test batch nature on [%s]",
+ currentJavaProject.getProject().getName()), ex);
+ Shell shell = new Shell();
+ MessageDialog.openInformation(shell, TestManagerPlugin.PLUGIN_ID,
+ "Error adding test batch nature:\n" + SelectionUtil.getStatusMessages(ex));
+ } finally {
+ window.getShell().setCursor(null);
+ waitCursor.dispose();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ currentJavaProject = SelectionUtil.findSelectedJavaProject(selection);
+ if (currentJavaProject == null) {
+ currentProject = SelectionUtil.findSelectedProject(selection);
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/RemoveTestBatchProjectNature.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/RemoveTestBatchProjectNature.java
new file mode 100644
index 00000000000..13967c1ce08
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/actions/RemoveTestBatchProjectNature.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.test.manager.batches.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.ApplicationWindow;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.batches.TestBatchProjectNature;
+import org.eclipse.osee.ote.ui.test.manager.batches.util.SelectionUtil;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RemoveTestBatchProjectNature implements IObjectActionDelegate {
+ private static final String NATURE_REMOVED = "Test Batch Nature Removed";
+ private static final String REMOVING_NATURE = "Removing Test Batch Nature";
+ private IJavaProject currentJavaProject;
+ private IProject currentProject;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ // Do Nothing
+ }
+
+ private static String[] removeTestBatchNature(String[] natures) {
+ List<String> list = new ArrayList<String>();
+
+ for (int i = 0; i < natures.length; i++) {
+ if (!(natures[i].equalsIgnoreCase(TestBatchProjectNature.NATURE_ID))) {
+ list.add(natures[i]);
+ }
+ }
+ String[] newNatures = new String[list.size()];
+ for (int i = 0; i < list.size(); i++) {
+ newNatures[i] = (String) list.get(i);
+ }
+ return newNatures;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+ */
+ public void run(IAction action) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ try {
+ ((ApplicationWindow) window).setStatus(REMOVING_NATURE);
+
+ if (currentJavaProject == null) {
+ currentJavaProject = JavaCore.create(currentProject);
+ }
+ // //Shutdown server if running for the current project
+ // if (DerbyServerUtils.getDefault().getRunning(currentJavaProject.getProject())) {
+ // DerbyServerUtils.getDefault().stopDerbyServer(currentJavaProject.getProject());
+ // }
+ // IClasspathEntry[] rawClasspath = currentJavaProject.getRawClasspath();
+ //
+ // List<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>();
+ // for (IClasspathEntry e : rawClasspath) {
+ // if (e.getEntryKind() != IClasspathEntry.CPE_CONTAINER) {
+ // newEntries.add(e);
+ // } else if (!e.getPath().equals(DerbyClasspathContainer.CONTAINER_ID)) {
+ // newEntries.add(e);
+ // }
+ // }
+
+ // IClasspathEntry[] newEntriesArray = new IClasspathEntry[newEntries.size()];
+ // newEntriesArray = (IClasspathEntry[]) newEntries.toArray(newEntriesArray);
+ // currentJavaProject.setRawClasspath(newEntriesArray, null);
+
+ IProjectDescription description = currentJavaProject.getProject().getDescription();
+ String[] natures = description.getNatureIds();
+
+ description.setNatureIds(removeTestBatchNature(natures));
+ currentJavaProject.getProject().setDescription(description, null);
+ // refresh project so user sees changes
+ currentJavaProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
+ ((ApplicationWindow) window).setStatus(NATURE_REMOVED);
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, String.format("Error removing test batch nature on [%s]",
+ currentJavaProject.getProject().getName()), ex);
+ Shell shell = new Shell();
+ MessageDialog.openInformation(shell, TestManagerPlugin.PLUGIN_ID,
+ "Error removing test batch nature:\n" + SelectionUtil.getStatusMessages(ex));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ currentJavaProject = SelectionUtil.findSelectedJavaProject(selection);
+ if (currentJavaProject == null) {
+ currentProject = SelectionUtil.findSelectedProject(selection);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ITestBatchDataListener.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ITestBatchDataListener.java
new file mode 100644
index 00000000000..32c5685a5d8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ITestBatchDataListener.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.ui.test.manager.batches.navigate;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITestBatchDataListener {
+
+ public void dataAddedEvent(TestBatchData data);
+
+ public void dataRemovedEvent(TestBatchData data);
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ProjectSetupItem.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ProjectSetupItem.java
new file mode 100644
index 00000000000..eaaca7ef500
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/ProjectSetupItem.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.ui.test.manager.batches.navigate;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.svn.CheckoutProjectSetJob;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class ProjectSetupItem extends XNavigateItem implements Runnable {
+ private URI projectSetFile;
+ private String jobName;
+
+ public ProjectSetupItem(XNavigateItem parent, String name, OseeImage oseeImage, URI projectSetFile) {
+ super(parent, name, oseeImage);
+ this.jobName = String.format("Project Configuration: [%s]", name);
+ this.projectSetFile = projectSetFile;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ try {
+ URL url = projectSetFile.toURL();
+ Job job = new CheckoutProjectSetJob(jobName, getName(), url);
+ job.setUser(true);
+ job.schedule();
+ } catch (MalformedURLException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/RefreshOteNavigator.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/RefreshOteNavigator.java
new file mode 100644
index 00000000000..20fd77f526a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/RefreshOteNavigator.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.ui.test.manager.batches.navigate;
+
+import org.eclipse.osee.ote.ui.navigate.OteNavigateView;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RefreshOteNavigator implements ITestBatchDataListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.batches.navigate.ITestBatchDataListener#dataAddedEvent(org.eclipse.osee.ote.ui.test.manager.batches.navigate.TestBatchData)
+ */
+ @Override
+ public void dataAddedEvent(TestBatchData data) {
+ OteNavigateView navigator = getOteNavigator();
+ if (navigator != null) {
+ navigator.refresh();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.batches.navigate.ITestBatchDataListener#dataRemovedEvent(org.eclipse.osee.ote.ui.test.manager.batches.navigate.TestBatchData)
+ */
+ @Override
+ public void dataRemovedEvent(TestBatchData data) {
+ OteNavigateView navigator = getOteNavigator();
+ if (navigator != null) {
+ navigator.refresh();
+ }
+ }
+
+ private OteNavigateView getOteNavigator() {
+ OteNavigateView toReturn = null;
+ IWorkbenchPage[] pages = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPages();
+ for (IWorkbenchPage page : pages) {
+ IViewPart part = page.findView(OteNavigateView.VIEW_ID);
+ if (part != null) {
+ if (part instanceof OteNavigateView) {
+ toReturn = (OteNavigateView) part;
+ break;
+ }
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchData.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchData.java
new file mode 100644
index 00000000000..083b04686a1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchData.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.batches.navigate;
+
+import java.net.URI;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestBatchData {
+
+ private String name;
+ private XNavigateItem itemFolder;
+ private URI testBatchFile;
+ private URI projectSetFile;
+
+ protected TestBatchData(XNavigateItem itemFolder, String name, URI projectSetFile, URI testBatchFile) {
+ this.name = name;
+ this.testBatchFile = testBatchFile;
+ this.projectSetFile = projectSetFile;
+ this.itemFolder = itemFolder;
+ }
+
+ public String getId() {
+ return name;
+ }
+
+ public URI getTestBatchFile() {
+ return testBatchFile;
+ }
+
+ public URI getProjectSetFile() {
+ return projectSetFile;
+ }
+
+ public XNavigateItem getXNavigateItem() {
+ return itemFolder;
+ }
+
+ public void dispose() {
+ XNavigateItem parent = itemFolder.getParent();
+ if (parent != null) {
+ parent.removeChild(itemFolder);
+ itemFolder.setParent(null);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchRegistry.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchRegistry.java
new file mode 100644
index 00000000000..84397823a10
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchRegistry.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.batches.navigate;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestBatchRegistry {
+
+ private final Map<String, TestBatchData> itemsMap;
+ private final Set<ITestBatchDataListener> listeners;
+ private final XNavigateItem parent;
+
+ public TestBatchRegistry(XNavigateItem parent) {
+ this.itemsMap = new HashMap<String, TestBatchData>();
+ this.listeners = new HashSet<ITestBatchDataListener>();
+ this.parent = parent;
+ }
+
+ public List<XNavigateItem> getXNavigateItems() {
+ List<XNavigateItem> toReturn = new ArrayList<XNavigateItem>();
+ for (TestBatchData data : itemsMap.values()) {
+ toReturn.add(data.getXNavigateItem());
+ }
+ return toReturn;
+ }
+
+ public void deregisterTestBatch(String id) {
+ TestBatchData data = this.itemsMap.get(id);
+ if (data != null) {
+ data.dispose();
+ this.itemsMap.remove(id);
+ notifyAddEvent(data);
+ }
+ }
+
+ public void registerTestBatch(String id, URI projectSetFile, URI testBatchFile) {
+ if (itemsMap.containsKey(id) != true) {
+ TestBatchData data = createNewTestBatchItem(id, projectSetFile, testBatchFile);
+ this.itemsMap.put(data.getId(), data);
+ notifyRemoveEvent(data);
+ }
+ }
+
+ public void addListener(ITestBatchDataListener listener) {
+ synchronized (listeners) {
+ listeners.add(listener);
+ }
+ }
+
+ public void removeListener(ITestBatchDataListener listener) {
+ synchronized (listeners) {
+ listeners.remove(listener);
+ }
+ }
+
+ private void notifyAddEvent(final TestBatchData data) {
+ synchronized (listeners) {
+ for (ITestBatchDataListener listener : listeners) {
+ listener.dataAddedEvent(data);
+ }
+ }
+ }
+
+ private void notifyRemoveEvent(final TestBatchData data) {
+ synchronized (listeners) {
+ for (ITestBatchDataListener listener : listeners) {
+ listener.dataRemovedEvent(data);
+ }
+ }
+ }
+
+ private TestBatchData createNewTestBatchItem(String id, URI projectSetFile, URI testBatchFile) {
+ // Chain Items
+ XNavigateItem parentFolder = new XNavigateItem(parent, id, FrameworkImage.FOLDER);
+ new ProjectSetupItem(parentFolder, id + " Checkout", OteTestManagerImage.PROJECT_SET_IMAGE, projectSetFile);
+ new TestBatchSetupItem(parentFolder, id + " Test Manager Batch Config", OteTestManagerImage.TEST_BATCH_IMAGE, testBatchFile);
+
+ // Store into dataObject
+ return new TestBatchData(parentFolder, id, projectSetFile, testBatchFile);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupItem.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupItem.java
new file mode 100644
index 00000000000..5975d4084b5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupItem.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.batches.navigate;
+
+import java.io.File;
+import java.net.URI;
+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.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.configuration.LoadConfigurationOperation;
+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.progress.UIJob;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class TestBatchSetupItem extends XNavigateItem implements Runnable {
+ private URI testBatchFile;
+ private String jobName;
+
+ public TestBatchSetupItem(XNavigateItem parent, String name, OseeImage oseeImage, URI testBatchFile) {
+ super(parent, name, oseeImage);
+ this.jobName = String.format("Test Manager Configuration: [%s]", name);
+ this.testBatchFile = testBatchFile;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ Job job = new UIJob(jobName) {
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ IStatus status = Status.CANCEL_STATUS;
+ if (PluginUtil.areTestManagersAvailable() != true) {
+ Exception exception =
+ new IllegalStateException("Test Manager was not opened before this operation was selected.");
+ status =
+ new Status(Status.ERROR, TestManagerPlugin.PLUGIN_ID, Status.ERROR,
+ "A Test Manager must be opened for this operation to work.", exception);
+ } else {
+ TestManagerEditor[] itemsToOpen = PluginUtil.getTestManagers();
+ if (itemsToOpen.length > 1) {
+ itemsToOpen = TestManagerSelectDialog.getTestManagerFromUser();
+ }
+
+ if (itemsToOpen.length > 0) {
+ boolean result = configureSelectedItems(itemsToOpen);
+ if (result != false) {
+ status = Status.OK_STATUS;
+ } else {
+ Exception exception = new IllegalStateException("Test Manager setup failed.");
+ status =
+ new Status(Status.ERROR, TestManagerPlugin.PLUGIN_ID,
+ "Test Manager configuration failed for some unknown reason. Please try again.",
+ exception);
+ }
+ } else {
+ Exception exception = new IllegalStateException("No Test Manager was selected.");
+ status =
+ new Status(Status.ERROR, TestManagerPlugin.PLUGIN_ID,
+ "A Test Manager must be selected for this operation to work.", exception);
+ }
+ }
+ return status;
+ }
+
+ private boolean configureSelectedItems(TestManagerEditor[] items) {
+ boolean result = true;
+ for (TestManagerEditor testManager : items) {
+ result &= LoadConfigurationOperation.load(testManager, new File(testBatchFile));
+ }
+ return result;
+ }
+ };
+ job.setUser(true);
+ job.schedule();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupViewItems.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupViewItems.java
new file mode 100644
index 00000000000..10eb1672a31
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/navigate/TestBatchSetupViewItems.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.batches.navigate;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.ote.ui.navigate.IOteNavigateItem;
+import org.eclipse.osee.ote.ui.test.manager.batches.TestBatchProjectNature;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestBatchSetupViewItems implements IOteNavigateItem {
+ private static final String PARENT_FOLDER_NAME = "Test Batch Setup";
+
+ private static TestBatchSetupViewItems instance = null;
+ private TestBatchRegistry registry;
+ private XNavigateItem parentFolder;
+
+ public TestBatchSetupViewItems() {
+ this.parentFolder = new XNavigateItem(null, PARENT_FOLDER_NAME, FrameworkImage.FOLDER);
+ this.registry = new TestBatchRegistry(parentFolder);
+ this.registry.addListener(new RefreshOteNavigator());
+
+ TestBatchProjectNature.initializeProjectSet();
+ }
+
+ public static TestBatchSetupViewItems getInstance() {
+ if (instance == null) {
+ instance = new TestBatchSetupViewItems();
+ }
+ return instance;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.navigate.IOteNavigateItem#getNavigateItems()
+ */
+ public List<XNavigateItem> getNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+ items.add(parentFolder);
+ return items;
+ }
+
+ public TestBatchRegistry getRegistry() {
+ return registry;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/ResourceFinder.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/ResourceFinder.java
new file mode 100644
index 00000000000..bfbd2644d01
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/ResourceFinder.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.batches.util;
+
+import java.util.Collection;
+import java.util.Set;
+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.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.jdk.core.type.HashCollection;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ResourceFinder {
+ private static final String PROJECT_SET_EXTENSION = "psf";
+ private static final String TEST_BATCH_SET_EXTENSION = "xml";
+
+ private HashCollection<String, IFile> resourceMap;
+
+ public ResourceFinder() {
+ this.resourceMap = new HashCollection<String, IFile>();
+ }
+
+ public Set<String> getIds() {
+ return resourceMap.keySet();
+ }
+
+ public Pair<IFile, IFile> getFileSet(String key) {
+ IFile project = null;
+ IFile testBatch = null;
+
+ Collection<IFile> items = this.resourceMap.getValues(key);
+ for (IFile file : items) {
+ if (file.getFileExtension().equals(PROJECT_SET_EXTENSION)) {
+ project = file;
+ } else {
+ testBatch = file;
+ }
+ }
+ return new Pair<IFile, IFile>(project, testBatch);
+ }
+
+ public void findBatchAndProjectFiles(IProject project) {
+ final HashCollection<String, IFile> localMap = new HashCollection<String, IFile>();
+
+ try {
+ project.accept(new IResourceVisitor() {
+
+ @Override
+ public boolean visit(IResource resource) throws CoreException {
+ if (resource instanceof IFile) {
+ IFile file = (IFile) resource;
+ if (isValid(file) != false) {
+ String key = file.getName();
+ key = key.replace(file.getFileExtension(), "");
+ if (key.endsWith(".")) {
+ key = key.substring(0, key.length() - 1);
+ }
+ localMap.put(key, file);
+ }
+ }
+ return true;
+ }
+ });
+
+ } catch (CoreException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ // Remove incompletes
+ this.resourceMap.clear();
+ for (String key : localMap.keySet()) {
+ Collection<IFile> values = localMap.getValues(key);
+ if (values != null && values.size() == 2) {
+ this.resourceMap.put(key, values);
+ }
+ }
+ }
+
+ private boolean isValid(IFile file) {
+ boolean result = false;
+ if (file != null && file.isAccessible() != false) {
+ String extension = file.getFileExtension();
+ result =
+ extension.equalsIgnoreCase(PROJECT_SET_EXTENSION) || extension.equalsIgnoreCase(TEST_BATCH_SET_EXTENSION);
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/SelectionUtil.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/SelectionUtil.java
new file mode 100644
index 00000000000..db8231b27c8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/batches/util/SelectionUtil.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.test.manager.batches.util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SelectionUtil {
+ public static IProject findSelectedProject(ISelection selection) {
+ IProject currentProject = null;
+ if (selection != null) {
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection) selection;
+ Object obj = ss.getFirstElement();
+ if (obj instanceof IProject) {
+ currentProject = (IProject) obj;
+ }
+ }
+ }
+ return currentProject;
+ }
+
+ public static IJavaProject findSelectedJavaProject(ISelection selection) {
+ IJavaProject currentProject = null;
+ if (selection != null) {
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection) selection;
+ Object obj = ss.getFirstElement();
+ if (obj instanceof IJavaProject) {
+ currentProject = (IJavaProject) obj;
+ }
+ }
+ }
+ return currentProject;
+ }
+
+ public static String getStatusMessages(Exception e) {
+ String msg = e.getMessage();
+ if (e instanceof CoreException) {
+ CoreException ce = (CoreException) e;
+ IStatus status = ce.getStatus();
+ IStatus[] children = status.getChildren();
+ for (int i = 0; i < children.length; i++)
+ msg += "\n" + children[i].getMessage();
+ System.err.println(msg);
+ ce.printStackTrace(System.err);
+ }
+ return msg;
+ }
+}
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 00000000000..ac9dcac0245
--- /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.TestManagerPlugin;
+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.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 00000000000..266f26e10f9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.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.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.
+ *
+ * @param sourceDoc
+ * @param fileString
+ * @throws Exception
+ */
+ 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.newDocument();
+ Element root = doc.createElement("TestManagerConfig");
+ root.appendChild(doc.importNode(sourceDoc.getDocumentElement(), true));
+ doc.appendChild(root);
+ }
+ Jaxp.writeXmlDocument(doc, file, Jaxp.getPrettyFormat(doc));
+ }
+
+ 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 00000000000..3e3be515fc3
--- /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 00000000000..c5133645a56
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.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.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 00000000000..c227c3a55f2
--- /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.ote.ui.test.manager.TestManagerPlugin;
+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,
+ TestManagerPlugin.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 00000000000..99081bde19c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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 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(plugin.getImage("fldr_obj.gif"));
+ menuItem.addSelectionListener(new SelectionAdapter() {
+
+ 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 (result != null && !result.equals("")) {
+ 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(plugin.getImage("loadConfig.gif"));
+ item.setToolTipText("Load current page configuration from file");
+ item.addSelectionListener(new SelectionAdapter() {
+ 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 00000000000..37fdc48538f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.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.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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.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 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(plugin.getImage("saveas_edit.gif"));
+ saveAsMenuItem.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ 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 (result != null && !result.equals("")) {
+ 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(plugin.getImage("save_edit.gif"));
+ item.setToolTipText("Saves current page configuration to file");
+ item.addSelectionListener(new SelectionAdapter() {
+ 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,
+ TestManagerPlugin.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 00000000000..7e3f8c9744a
--- /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,175 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ILoadConfig;
+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.eclipse.swt.widgets.Display;
+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 ScriptPage scriptPage;
+ private ScriptTableViewer scriptTableViewer;
+ private Vector<ScriptTask> scriptTasks;
+
+ public LoadScriptPage(ScriptPage tmPage) {
+ this.scriptPage = tmPage;
+ this.scriptTableViewer = scriptPage.getScriptTableViewer();
+ scriptTasks = new Vector<ScriptTask>();
+ }
+
+ 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);
+
+ Display.getDefault().syncExec(new Runnable() {
+ 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 String path;
+
+ public LoadScriptHelper(String path) {
+ this.path = path;
+ }
+
+ public void run() {
+ if (!MessageDialog.openQuestion(
+ Display.getDefault().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;
+ }
+ }
+
+ /**
+ * @return
+ */
+ public boolean stop() {
+ return stopLoading;
+ }
+ }
+
+ private class GetWidgetInfo implements Runnable {
+
+ private String path;
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ path = scriptPage.getTestManager().getAlternateOutputDir();
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ }
+
+ 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++) {
+ 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);
+ Display.getDefault().syncExec(helper);
+ if (helper.stop()) {
+ break;
+ }
+ }
+ }
+ }
+
+}
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 00000000000..019539e7a96
--- /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,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.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.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.TestManagerPlugin;
+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.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 Document doc;
+ private Element root;
+ private ScriptPage scriptPage;
+
+ public SaveScriptPage(ScriptPage tmPage) throws ParserConfigurationException {
+ this.scriptPage = tmPage;
+ doc = Jaxp.newDocument();
+ root = doc.createElement(ScriptPageConstants.SCRIPTPAGE_CONFIG);
+ doc.appendChild(root);
+ }
+
+ public void printXmlTree() {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "Script Page Tree: ");
+ try {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, Jaxp.xmlToString(doc, Jaxp.getPrettyFormat(doc)));
+ }
+ catch (IOException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ 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());
+ }
+
+ 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 00000000000..e63f9864443
--- /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 00000000000..639c8aaa865
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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.ote.core.environment.UserTestSessionKey;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusListener;
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+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.swt.widgets.Display;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class ScriptManager implements Runnable {
+ private final Map<String, ScriptTask> guidToScriptTask = new HashMap<String, ScriptTask>();
+ 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 UserTestSessionKey sessionKey;
+
+ public ScriptManager(TestManagerEditor testManager, StructuredViewer stv) {
+ this.testManager = testManager;
+ this.stv = stv;
+
+ tasksToUpdate = new HashSet<ScriptTask>();
+ updater = Executors.newScheduledThreadPool(1, new ThreadFactory() {
+
+ 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) {
+ guidToScriptTask.remove(task);
+ }
+ }
+
+ /**
+ * 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
+ * @throws RemoteException
+ */
+ public boolean connect(ConnectionEvent event) {
+
+ connectedEnv = event.getEnvironment();
+ sessionKey = event.getSessionKey();
+ try {
+ /*
+ * Setup the status listener for commands
+ */
+ statusListenerImpl = new TestManagerStatusListener(testManager, this);
+
+ connectedEnv.addStatusListener((IServiceStatusListener) event.getConnector().export(statusListenerImpl));
+ 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();
+ try {
+
+ event.getEnvironment().removeStatusListener((IServiceStatusListener) event.getConnector().findExport(statusListenerImpl));
+ return false;
+ } catch (RemoteException e) {
+ TestManagerPlugin.log(Level.SEVERE, "problems removing listener", e);
+ return true;
+ }
+ }
+
+ public boolean onConnectionLost(IHostTestEnvironment testHost) {
+ connectedEnv = null;
+ sessionKey = null;
+ guidToScriptTask.clear();
+ return false;
+ }
+
+ public ScriptTask getScriptTask(String name) {
+ return guidToScriptTask.get(name);
+ }
+
+ public void notifyScriptQueued(GUID theGUID, final ScriptTask script) {
+ guidToScriptTask.put(script.getScriptModel().getTestClass(), script);
+ script.setStatus(ScriptStatusEnum.IN_QUEUE);
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (stv.getControl().isDisposed()) {
+ return;
+ }
+ stv.refresh(script);
+ }
+ });
+ }
+
+ public void updateScriptTableViewer(final ScriptTask task) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (stv.getControl().isDisposed()) {
+ return;
+ }
+ stv.refresh(task);
+ }
+ });
+ }
+
+ public void updateScriptTableViewerTimed(ScriptTask task) {
+ updateScriptTable = true;
+ synchronized (tasksToUpdate) {
+ tasksToUpdate.add(task);
+ }
+ }
+
+ public void run() {
+ if (updateScriptTable) {
+ updateScriptTable = false;
+ Display.getDefault().asyncExec(new Runnable() {
+ 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);
+
+ /**
+ * @param task
+ */
+ public void notifyScriptStart(final ScriptTask task) {
+ task.setStatus(ScriptStatusEnum.RUNNING);
+ Display.getDefault().asyncExec(new Runnable() {
+ 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 UserTestSessionKey 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 00000000000..7397b636e2f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.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.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 List<ScriptTask> scripts;
+ private TestManagerEditor testManager;
+
+ public ScriptQueue(List<ScriptTask> scripts, TestManagerEditor testManager) {
+ super();
+ this.scripts = scripts;
+ this.testManager = testManager;
+ }
+
+ 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 00000000000..9a76b02f4fe
--- /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 00000000000..d3d10223b48
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.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.ui.test.manager.connection;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+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/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 00000000000..24801d8b208
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java
@@ -0,0 +1,425 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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.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.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+import org.eclipse.osee.ote.ui.TestCoreGuiPlugin;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+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.widgets.Display;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class TestManagerServiceStatusDataVisitor implements IServiceStatusDataVisitor {
+
+ private final ScriptManager scriptManager;
+ private final TestManagerEditor testManagerEditor;
+ private ExecutorService executor;
+
+ protected TestManagerServiceStatusDataVisitor(ScriptManager scriptManager, TestManagerEditor testManagerEditor) {
+ this.scriptManager = scriptManager;
+ this.testManagerEditor = testManagerEditor;
+ executor = Executors.newSingleThreadExecutor();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asCommandAdded
+ * (org.eclipse.osee.ote.core.environment.status.CommandAdded)
+ */
+ 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();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asCommandRemoved
+ * (org.eclipse.osee.ote.core.environment.status.CommandRemoved)
+ */
+ 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);
+ // userEnvironment.notifyScriptDequeued(task.getGuid());
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asEnvironementError
+ * (org.eclipse.osee.ote.core.environment.status.EnvironmentError)
+ */
+ 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();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asSequentialCommandBegan
+ * (org.eclipse.osee.ote.core.environment.status.SequentialCommandBegan)
+ */
+ 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.log(TestManagerPlugin.class, Level.INFO, String.format("Script Task: [%s]", task));
+ logOnConsole(Level.INFO, String.format("Test Starting: [%s]", task.getName()));
+ task.setStatus(ScriptStatusEnum.RUNNING);
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asSequentialCommandEnded
+ * (org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded)
+ */
+ 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.log(TestManagerPlugin.class, Level.INFO, String.format("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;
+ }
+ // onOutfileSave(task, sequentialCommandEnded.getDescription(),
+ // isValidRun);
+ logOnConsole(Level.INFO, String.format("Test Completed: [%s]", task.getName()));
+ notifyExecutionComplete(task);
+ // userEnvironment.notifyScriptDequeued(task.getGuid());
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asTestPointUpdate
+ * (org.eclipse.osee.ote.core.environment.status.TestPointUpdate)
+ */
+ 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());
+ // final ScriptTask task = getScriptTask(testPointUpdate);
+ if (task != null) {
+ 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)) {
+ TestCoreGuiPlugin.getDefault().getConsole().writeError(msg);
+ } else {
+ TestCoreGuiPlugin.getDefault().getConsole().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) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ TestCoreGuiPlugin.getDefault().getConsole().writeError(cause);
+ }
+ });
+ }
+
+ private void logServiceStatusData(IServiceStatusDataCommand statusData) {
+ OseeLog.log(TestManagerPlugin.class, Level.FINE, String.format("%s: %s ", statusData.getClass().getName(),
+ statusData.getDescription()));
+ }
+
+ private ScriptTask getScriptTask(IServiceStatusDataCommand statusData) {
+ // statusData.getDescription().getDescription()
+ return scriptManager.getScriptTask(statusData.getDescription().getDescription());
+ }
+
+ private void notifyExecutionComplete(ScriptTask scriptTask) {
+ // if (userEnvironment.getLastGUIDToRun() != null &&
+ // scriptTask.getGuid().equals(userEnvironment.getLastGUIDToRun())) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ testManagerEditor.executionCompleted();
+ }
+ });
+ logExecutorSize();
+ // }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asTestServerCommandComplete
+ * (org.eclipse.osee.ote.core.environment.status.TestServerCommandComplete)
+ */
+ public void asTestServerCommandComplete(final TestServerCommandComplete end) {
+
+ executor.submit(new StatusBoardRecieveEvent<TestServerCommandComplete>(end) {
+ @Override
+ public void run() {
+ try {
+ ITestCommandResult result = end.getHandle().get();
+ TestCommandStatus status = result.getStatus();
+ Throwable th = result.getThrowable();
+ if (th != null) {
+ th.printStackTrace();
+ }
+ if (status != null) {
+ System.out.println(status.name());
+ }
+ } catch (RemoteException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+
+ notifyExecutionComplete(null);
+ }
+ });
+ logExecutorSize();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asTestComplete
+ * (org.eclipse.osee.ote.core.environment.status.TestComplete)
+ */
+ 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.log(TestManagerPlugin.class, Level.INFO, String.format("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();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor
+ * #asTestStart(org.eclipse.osee.ote.core.environment.status.TestStart)
+ */
+ 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.log(TestManagerServiceStatusDataVisitor.class, Level.FINE, String.format("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 00000000000..67852dac4eb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.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.connection;
+
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusData;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusListener;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public final class TestManagerStatusListener implements IServiceStatusListener {
+
+ private TestManagerServiceStatusDataVisitor testManagerServiceDataVisitor;
+
+ public TestManagerStatusListener(TestManagerEditor testManagerEditor, ScriptManager userEnvironment) {
+ this.testManagerServiceDataVisitor = new TestManagerServiceStatusDataVisitor(userEnvironment, testManagerEditor);
+ }
+
+ public void statusBoardUpdated(IServiceStatusData statusData) throws RemoteException {
+ statusData.accept(testManagerServiceDataVisitor);
+ }
+}
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 00000000000..ce6f90993e8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.core.environment.interfaces.IHostTestEnvironment;
+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.OverviewPage;
+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 OverviewPage overviewPage;
+ protected ScriptPage scriptPage;
+ private List<TestManagerPage> pages;
+
+ private TestManagerEditor testManager;
+ private ITestManagerFactory factory;
+
+ public PageManager(ITestManagerFactory factory, TestManagerEditor testManager) {
+ this.factory = factory;
+ this.testManager = testManager;
+ this.pages = new ArrayList<TestManagerPage>();
+ }
+
+ protected void createPages(Composite parent) {
+ overviewPage = new OverviewPage(parent, SWT.NONE, testManager);
+ registerPage(overviewPage);
+
+ hostPage = new HostPage(parent, SWT.NONE, testManager);
+ registerPage(hostPage);
+
+ scriptPage = this.factory.getScriptPageNewInstance(parent, SWT.NONE, testManager);
+ scriptPage.createPage();
+ registerPage(scriptPage);
+
+ advancedPage = this.factory.getAdvancedPageNewInstance(parent, SWT.NONE, testManager);
+ advancedPage.createPage();
+ registerPage(advancedPage);
+
+
+ }
+
+ private void registerPage(TestManagerPage page) {
+ pages.add(page);
+ testManager.registerPage(testManager.addPage(page), page.getPageName());
+ }
+
+ /**
+ * 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 overviewPage
+ */
+ public OverviewPage getOverviewPage() {
+ return overviewPage;
+ }
+
+ /**
+ * @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:[");
+ builder.append(pageMessage);
+ builder.append("]");
+ }
+ }
+ 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;
+ }
+
+ /**
+ * @param testHost
+ * @return
+ */
+ public boolean onConnectionLost(IHostTestEnvironment testHost) {
+ boolean problemEncountered = false;
+ for (TestManagerPage page : pages) {
+ problemEncountered |= page.onConnectionLost(testHost);
+ }
+ 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 00000000000..b13f6253723
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+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.osee.connection.service.IServiceConnector;
+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.Lib;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+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.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.ExtensionContributions;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.TestManagerStorageKeys;
+import org.eclipse.osee.ote.ui.testclassserver.ClassServerInst;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+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 IActionable, ITestConnectionListener {
+ private static final Image errorImage = TestManagerPlugin.getInstance().getImage("error.gif");
+ 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 TestManagerModel model;
+
+ private boolean reloadSourcePage = false;
+
+ private int scriptPageIndex;
+
+ private TextEditor sourceEditor;
+
+ private int sourcePage;
+
+ private final ITestManagerFactory testManagerFactory;
+
+ private IFile thisIFile = null;
+
+ private String xmlText;
+
+ private final IPropertyStore propertyStore;
+
+ private final PageManager pageManager;
+ private final ExtensionContributions extensionContributions;
+
+ private ITestEnvironment connectedEnv = null;
+ private IServiceConnector connector = null;
+ public TestManagerEditor(final ITestManagerFactory testManagerFactory) {
+ super();
+
+ this.testManagerFactory = testManagerFactory;
+ this.pageManager = new PageManager(testManagerFactory, this);
+ this.extensionContributions = new ExtensionContributions();
+ this.model = new TestManagerModel();
+ this.propertyStore = new PropertyStore(testManagerFactory.getClass().getSimpleName());
+ }
+
+ public void activateScriptsPage() {
+ setActivePage(scriptPageIndex);
+ }
+
+ public void addFile(String fullPath) {
+ pageManager.getScriptPage().addFile(fullPath);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPart#dispose()
+ */
+ 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.
+ */
+ public void doSave(IProgressMonitor monitor) {
+ if (getActivePage() != sourcePage) {
+ pageSourceLoad();
+ }
+ 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.
+ */
+ public void doSaveAs() {
+ if (getActivePage() != sourcePage) {
+ pageSourceLoad();
+ }
+ IEditorPart editor = getEditor(sourcePage);
+ editor.doSaveAs();
+ setPageText(sourcePage, "Source");
+ setInput(editor.getEditorInput());
+ readXmlData();
+ doSave();
+ }
+
+ protected void registerPage(int pageNumber, String pageName) {
+ setPageText(pageNumber, pageName);
+ }
+
+ 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 TestManagerModel getModel() {
+ return model;
+ }
+
+ public String getName() {
+ return this.getTitle();
+ }
+
+ public ClassServerInst getScriptClassServer() {
+ return ClassServerInst.getInstance();
+ }
+
+ public ITestManagerFactory getTestManagerFactory() {
+ return testManagerFactory;
+ }
+
+ 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);
+ }
+
+ public boolean isDirty() {
+ if (super.isDirty()) {
+ return true;
+ }
+ return fileIsDirty;
+ }
+
+ 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();
+ if (coreinput instanceof IFileEditorInput) {
+ IFileEditorInput input = (IFileEditorInput) getEditorInput();
+ thisIFile = input.getFile();
+ String name = thisIFile.getName();
+ this.setPartName(name);
+ model.setConfiguration(name);
+ if (thisIFile != null) {
+ IPath containerPath = thisIFile.getRawLocation();
+ model.filename = containerPath.toOSString();
+ 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);
+ model.setConfiguration(name);
+ xmlText = input.getDefaultXML();
+ }
+ }
+
+ /**
+ * Creates the pages of the multi-page editor.
+ */
+ protected void createPages() {
+ readXmlData();
+
+ if (model.setFromXml(xmlText)) {
+ pageManager.createPages(getContainer());
+ pageSourceCreate();
+
+ fileIsDirty = false;
+ reloadSourcePage = false;
+ pageSourceCheck();
+ restoreSettings();
+ }
+ // If parse errors, send to sourcePage and set error on page
+ else {
+ if (sourceEditor == null) {
+ pageSourceCreate();
+ setActivePage(sourcePage);
+ return;
+ }
+ pageSourceCheck();
+ setPageImage(sourcePage, errorImage);
+ setActivePage(sourcePage);
+ }
+ fileIsDirty = false;
+ firePropertyChange(PROP_DIRTY);
+ TestManagerPlugin.getInstance().getOteClientService().addConnectionListener(this);
+ }
+
+ protected void handleSelection() {
+ fireSaveNeeded();
+ reloadSourcePage = true;
+ }
+
+ /**
+ * reloads pages as necessary
+ */
+ 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)) {
+ setActivePage(sourcePage);
+ setPageError(sourcePage, true);
+ MessageDialog.openError(getSite().getShell(), "Source Page Error",
+ "Error parsing Source page\n\n" + model.getParseExceptions());
+ return;
+ }
+ setPageError(sourcePage, false);
+ }
+ }
+ }
+ lastPageIndex = newPageIndex;
+ }
+
+ 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() {
+
+ readXmlData();
+ model.setFromXml(xmlText);
+ pageManager.save();
+ try {
+ File file = OseeData.getFile("testManagerSettings.xml");
+ getPropertyStore().save(file.getAbsolutePath());
+ } catch (Exception ex) {
+ TestManagerPlugin.log(Level.SEVERE, "Error storing settings.", ex);
+ }
+ }
+
+ public void restoreSettings() {
+ try {
+ File file = OseeData.getFile("testManagerSettings.xml");
+ getPropertyStore().load(file.getAbsolutePath());
+ pageManager.restore();
+ } catch (Exception ex) {
+ TestManagerPlugin.log(Level.WARNING, "Stored settings not available. Using defaults.", ex);
+ }
+ }
+
+ public IPropertyStore getPropertyStore() {
+ return propertyStore;
+ }
+
+ public PageManager getPageManager() {
+ return pageManager;
+ }
+
+ public ExtensionContributions getContributions() {
+ return extensionContributions;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.framework.jdk.core.ats.IActionable#getActionDescription
+ * ()
+ */
+ public String getActionDescription() {
+ String version =
+ (String) Platform.getBundle("org.eclipse.osee.ote.ui.test.manager").getHeaders().get("Bundle-Version");
+ String serverVersion = "";
+ try {
+ serverVersion = (String) Platform.getBundle("org.eclipse.osee.ote.core").getHeaders().get("Bundle-Version");
+ } catch (Exception ex) {
+ // do nothing
+ }
+ StringBuilder builder = new StringBuilder();
+ builder.append("Problem found on OSEE TM Version: ");
+ builder.append(version);
+ builder.append("\nServer Version: ");
+ builder.append(serverVersion);
+ builder.append("\nTM File: ");
+ builder.append(getTitle());
+ builder.append("\n");
+ builder.append("OFP: \"");
+ builder.append(pageManager.getScriptPage().getOFP());
+ builder.append("\"\n");
+ builder.append("Scripts: \n");
+ builder.append(pageManager.getScriptPage().getScripts());
+ builder.append("\n");
+
+ builder.append(getPropertyStore().toString());
+
+ return builder.toString();
+ }
+
+ @Override
+ public void onConnectionLost(IServiceConnector connector, IHostTestEnvironment testHost) {
+ connectedEnv = null;
+ connector = null;
+ boolean problemEncountered = pageManager.onConnectionLost(testHost);
+ if (problemEncountered) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Disconnect Error",
+ "Test manager has encountered a problem while processing the disconnect event. See Error Log for details");
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onPostConnect(ConnectionEvent event) {
+ connectedEnv = event.getEnvironment();
+ connector = event.getConnector();
+ boolean problemEncountered = pageManager.onPostConnect(event);
+ if (problemEncountered) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openError(Display.getDefault().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) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Disconnect Error",
+ "Test manager has encountered a problem while processing the disconnect event. See Error Log for details");
+ }
+ });
+ }
+ }
+
+ public boolean isConnected() {
+ return connectedEnv != null;
+ }
+
+ public ITestEnvironment getConnectedEnvironment() {
+ return connectedEnv;
+ }
+
+ public IServiceConnector getConnector() {
+ return connector;
+ }
+ public abstract void createHostWidget(Composite parent);
+
+
+ /**
+ * @param array
+ */
+ 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 00000000000..9aaf8dd3788
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.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.ui.test.manager.core;
+
+import java.util.logging.Level;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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();
+ }
+
+ 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);
+ try {
+ /*Job addStatusLineManager = new Job("TM contributing to the status line.") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ OseeContributionItem.addTo(statusLineManager);
+ } catch (Throwable th) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, th.getMessage(), th);
+ return Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ addStatusLineManager.schedule();*/
+
+ } catch (Throwable th) {
+ OseeLog.log(TestManagerPlugin.class, Level.WARNING, "Unable to contribute to the status line.", th);
+ }
+ }
+
+}
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 00000000000..9b6076f4df1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.plugin.util.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 IFile iFile;
+
+ public TestManagerEditorInput(File file) {
+ this(AWorkspace.fileToIFile(file));
+ }
+
+ public TestManagerEditorInput(IFile iFile) {
+ super();
+ this.iFile = iFile;
+ }
+
+ /*
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ 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()
+ */
+ public boolean exists() {
+ return true;
+ }
+
+ /*
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return iFile.getAdapter(adapter);
+ }
+
+ public String getFactoryId() {
+ return FACTORY_ID;
+ }
+
+ public IFile getFile() {
+ return iFile;
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ 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()
+ */
+ public String getName() {
+ return iFile.getName();
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return this;
+ }
+
+ public IStorage getStorage() throws CoreException {
+ return new IStorage() {
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return iFile.getAdapter(adapter);
+ }
+
+ public InputStream getContents() throws CoreException {
+ return iFile.getContents();
+ }
+
+ public IPath getFullPath() {
+ return iFile.getFullPath();
+ }
+
+ public String getName() {
+ return iFile.getName();
+ }
+
+ public boolean isReadOnly() {
+ return false;
+ }
+
+ };
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return iFile.getName();
+ }
+
+ /*
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return iFile.hashCode();
+ }
+
+ 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 00000000000..3fb8ea8ab53
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.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.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() {
+ }
+
+ public IAdaptable createElement(IMemento memento) {
+ String path = memento.getString("path");
+ File file = new File(path);
+ TestManagerEditorInput input = new TestManagerEditorInput(file);
+ return input;
+ }
+}
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 00000000000..47c0cfe5a92
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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 HashMap<String, String> keyValue;
+
+ public TestManagerInput() {
+ keyValue = new HashMap<String, String>();
+ loadFromFile();
+ }
+
+ public boolean equals(Object object) {
+ if (object instanceof TestManagerInput) return true;
+ return false;
+ }
+
+ public boolean exists() {
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public String getDefaultXML() {
+ return "<testManager>" + "<contact></contact>" + "<description>Test Manager</description>" + "</testManager>";
+
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return "TestManager";
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ 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.newDocument();
+ Element root = document.createElement("ValuePairs");
+ document.appendChild(root);
+
+ Iterator<String> it = keyValue.keySet().iterator();
+ while (it.hasNext()) {
+ String key = (String) 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(document));
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerModel.java
new file mode 100644
index 00000000000..50d8bf950c5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerModel.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.jdk.core.util.AFile;
+import org.eclipse.osee.framework.jdk.core.util.AXml;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Base Class for all TestManagers
+ */
+public class TestManagerModel {
+
+
+ final static String CONFIGURATION = "configuration";
+ final static String CONTACT = "contact";
+ final static String DESCRIPTION = "description";
+ final static String MACHINE = "machine";
+ final static String OFP = "ofp";
+ final static String PORT = "port";
+ final static String ROOTNAME = "testManager";
+ final static String TARGET = "target";
+ public boolean finished = false;
+ private String configuration = "";
+ private String contact = "";
+ private String description = "";
+ private String[] ofps = null;
+ private List<String> parseExceptions = new ArrayList<String>();
+ private String rawXml = "";
+ private String[] targets = null;
+ protected String filename = "";
+
+ public TestManagerModel() {
+ }
+
+ /**
+ * @return Returns the configuration.
+ */
+ public String getConfiguration() {
+ return configuration;
+ }
+
+ /**
+ * @return Returns the contact.
+ */
+ public String getContact() {
+ return contact;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @return Returns the ofps.
+ */
+ public String[] getOfps() {
+ return ofps;
+ }
+
+ /**
+ * @return Returns the parseExceptions.
+ */
+ public String getParseExceptions() {
+ String str = "";
+ for (int i = 0; i < parseExceptions.size(); i++) {
+ str += parseExceptions.get(i) + "\n";
+ }
+ return str;
+ }
+
+ /**
+ * @return Returns the rawXml.
+ */
+ public String getRawXml() {
+ return rawXml;
+ }
+
+ /**
+ * @return Returns the targets.
+ */
+ public String[] getTargets() {
+ return targets;
+ }
+
+ public boolean hasParseExceptions() {
+ return !parseExceptions.isEmpty();
+ }
+
+ /**
+ * @param configuration The configuration to set.
+ */
+ public void setConfiguration(String configuration) {
+ this.configuration = configuration;
+ }
+
+ /**
+ * @param contact The contact to set.
+ */
+ public void setContact(String contact) {
+ this.contact = contact;
+ }
+
+ /**
+ * @param description The description to set.
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * load model from xmlString; return true if successful
+ */
+ public boolean setFromXml(String xmlString) {
+ parseExceptions.clear();
+ try {
+ // Create a DOM builder and parse the fragment
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ // Call this to catch parse errors
+ factory.newDocumentBuilder().parse(new InputSource(new StringReader(xmlString)));
+
+ parseDocument(xmlString);
+
+ }
+ catch (ParserConfigurationException e) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, e.toString());
+ parseExceptions.add(e.toString());
+ return false;
+ }
+ catch (SAXException e) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, e.toString());
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "xmlText *" + xmlString + "*");
+ parseExceptions.add(e.toString());
+ return false;
+ }
+ catch (IOException e) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, e.toString());
+ parseExceptions.add(e.toString());
+ return false;
+ }
+ rawXml = xmlString;
+ return true;
+ }
+
+ /**
+ * load model from filename
+ *
+ * @param filename the Name of the file to be read
+ */
+ public void setFromXmlFile(String filename) {
+ this.filename = filename;
+ setFromXml(AFile.readFile(filename));
+ }
+
+ /**
+ * @param ofps The ofps to set.
+ */
+ public void setOfps(String[] ofps) {
+ this.ofps = ofps;
+ }
+
+ /**
+ * @param targets The targets to set.
+ */
+ public void setTargets(String[] targets) {
+ this.targets = targets;
+ }
+
+ private void parseDocument(String xmlString) {
+ description = AXml.getTagData(xmlString, DESCRIPTION);
+ contact = AXml.getTagData(xmlString, CONTACT);
+ ofps = AXml.getTagDataArray(xmlString, OFP);
+ String targetArray[] = AXml.getTagDataArray(xmlString, TARGET);
+ List<String> targetVector = new ArrayList<String>();
+ for (int i = 0; i < targetArray.length; i++) {
+ String machine = AXml.getTagData(targetArray[i], MACHINE);
+ String port = AXml.getTagData(targetArray[i], PORT);
+ if (machine != null && port != null)
+ targetVector.add(machine + "," + port);
+ }
+ targets = targetVector.toArray(new String[targetVector.size()]);
+
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "description *" + description + "*");
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "contact *" + contact + "*");
+ for (int i = 0; i < ofps.length; i++) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "ofp *" + ofps[i] + "*");
+ }
+ for (int i = 0; i < targets.length; i++) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "target *" + targets[i] + "*");
+ }
+ }
+}
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 00000000000..ce8d76d6c39
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.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.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.ote.ui.test.manager.TestManagerPlugin;
+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.scriptTable.ScriptTask;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @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<IStatus>();
+ 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(Status.ERROR, TestManagerPlugin.PLUGIN_ID, "could not access " + fileName));
+ } else if (!file.getParentFile().canWrite()) {
+ failedLocations.add(new Status(Status.ERROR, TestManagerPlugin.PLUGIN_ID, "could not access " + fileName));
+ }
+ }
+ if (failedLocations.isEmpty()) {
+ return Status.OK_STATUS;
+ } else {
+ return new Status(Status.ERROR, TestManagerPlugin.PLUGIN_ID, "unable to access out files") {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Status#isMultiStatus()
+ */
+ @Override
+ public boolean isMultiStatus() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Status#getChildren()
+ */
+ @Override
+ public IStatus[] getChildren() {
+ return failedLocations.toArray(new IStatus[failedLocations.size()]);
+ }
+
+ };
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ final IStatus status = verifyOutfileLocations();
+
+ if (status != Status.OK_STATUS) {
+ Display.getDefault().syncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ ErrorDialog.openError(
+ Display.getDefault().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.log(TestManagerPlugin.class, Level.FINE, String.format("%d milliseconds to initialize the running of scripts.", elapsed));
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, String.format("%d scripts have been batched.", runTasks.size()));
+
+ Display.getDefault().syncExec(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();
+
+ }
+
+ 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 00000000000..c91449f1dc5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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.skynet.core.utility.AIFile;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.framework.ui.plugin.util.OseeConsole;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.ui.TestCoreGuiPlugin;
+import org.eclipse.osee.ote.ui.markers.MarkerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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.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 boolean isValidRun;
+ private final TestManagerEditor testManagerEditor;
+ private final ITestEnvironment env;
+
+ private String clientOutfilePath;
+
+ private 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(Status.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();
+ }
+// Display.getDefault().asyncExec(new Runnable() {
+// public void run() {
+ 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()) {
+ TestCoreGuiPlugin.getDefault().getConsole().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
+ TestCoreGuiPlugin.getDefault().getConsole().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);
+ }
+ // else {
+ // task.getScriptModel().getOutputModel().getIFile().delete(true, null);
+ // }
+ IFile file = AIFile.constructIFile(clientOutfilePath);
+ if (file != null) {
+ AIFile.writeToFile(file, new ByteArrayInputStream(outBytes));
+ MarkerPlugin.getDefault().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();
+ int fileNum = 1;
+ File destFile =
+ new File(oldFile.getAbsoluteFile().toString().replaceFirst(outputExtension,
+ "." + fileNum + outputExtension));
+ if (destFile.exists()) {
+ while (destFile.exists()) {
+ fileNum++;
+ destFile =
+ new File(oldFile.getAbsoluteFile().toString().replaceFirst(outputExtension,
+ "." + 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 00000000000..b4d6107db69
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.util.logging.Level;
+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.AFile;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.ui.PlatformUI;
+
+
+
+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.
+ */
+ public IFile getIFile() {
+ if (iFile == null) {
+ if (path.equals("")) {
+ if (!rawFilename.equals("")) {
+ iFile = AWorkspace.getIFile(rawFilename);
+ }
+ }
+ }
+ return iFile;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return AFile.justFilename(rawFilename);
+ }
+
+ /**
+ * @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.exists()) {
+ return null;
+ } else {
+ return ifile.getFullPath().toString();
+ }
+ }
+
+ public String getText() {
+ if (iFile == null)
+ getIFile();
+ if (iFile == null)
+ return "";
+ if (text == null || iFile.getModificationStamp() != lastModified) {
+ text = AFile.readFile(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());
+ }
+ }
+
+ 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 00000000000..f51cbb5bdab
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.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.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.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 {
+
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#endElementFound(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler#startElementFound(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ @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;
+ }
+
+/**
+ * @return
+ */
+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 00000000000..bc716d4df80
--- /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 00000000000..e16c10fe887
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.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.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 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/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 00000000000..6ecbae346b6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.svn.VersionControl;
+import org.eclipse.osee.framework.svn.entry.IRepositoryEntry;
+import org.eclipse.osee.framework.ui.plugin.util.AJavaProject;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+
+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() {
+ ScriptVersionConfig scriptVersion = new ScriptVersionConfig();
+ File javaFile = new File(rawFileName);
+ if (javaFile != null && javaFile.exists() && javaFile.canRead()) {
+ IRepositoryEntry entry = VersionControl.getInstance()
+ .getRepositoryEntry(javaFile);
+ if (entry != null) {
+ scriptVersion.setRevision(entry.getVersion());
+ scriptVersion.setLocation(entry.getURL());
+ scriptVersion.setRepositoryType(entry
+ .getVersionControlSystem());
+ scriptVersion.setLastAuthor(entry.getLastAuthor());
+ scriptVersion.setLastModificationDate(entry
+ .getLastModificationDate());
+ scriptVersion.setModifiedFlag(entry.getModifiedFlag());
+ }
+ }
+ return scriptVersion;
+ }
+ }
+
+ private TestFileData javaFileData;
+ private OutputModel outputModel;
+ private TestScript testScript;
+
+
+ /**
+ * @param rawFilename
+ * @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 (alternateOutputDir == null || alternateOutputDir.equals("")) {
+ 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 00000000000..652cb0b76ac
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.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.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) {
+ handleItemsSelected(itemsToOpen, fullPath);
+ }
+ } else {
+ handleItemsSelected(itemsToOpen, fullPath);
+ }
+ }
+
+ 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 00000000000..529a0c264ee
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.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.ui.test.manager.pages;
+
+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.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution;
+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";
+
+ public AdvancedPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style, parentTestManager);
+ }
+
+ 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));
+
+ List<IAdvancedPageContribution> contributions =
+ getTestManager().getContributions().getAdvancedPageContributions();
+ Collections.sort(contributions, new Comparator<IAdvancedPageContribution>() {
+
+ @Override
+ public int compare(IAdvancedPageContribution o1, IAdvancedPageContribution o2) {
+ return Integer.valueOf(o1.getPriority()).compareTo(Integer.valueOf(o2.getPriority()));
+ }
+ });
+ for (IAdvancedPageContribution widget : contributions) {
+
+ try {
+ widget.createControl(extensionPanel);
+ } catch (Throwable e) {
+ TestManagerPlugin.log(Level.SEVERE,
+ "problem creating advance page contribution", e);
+ }
+ }
+
+ createBlankArea(parent, 0, true);
+ computeScrollSize();
+ TestManagerPlugin.getInstance().setHelp(this, "tm_advanced_page");
+ }
+
+ @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);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#saveData()
+ */
+ @Override
+ public void saveData() {
+ IPropertyStore propertyStore = getTestManager().getPropertyStore();
+ List<IAdvancedPageContribution> contributions =
+ getTestManager().getContributions().getAdvancedPageContributions();
+ for (IAdvancedPageContribution contribution : contributions) {
+ contribution.save(propertyStore);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#restoreData()
+ */
+ @Override
+ public void restoreData() {
+ IPropertyStore propertyStore = getTestManager().getPropertyStore();
+ List<IAdvancedPageContribution> contributions =
+ getTestManager().getContributions().getAdvancedPageContributions();
+ for (IAdvancedPageContribution contribution : contributions) {
+ contribution.load(propertyStore);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#areSettingsValidForRun()
+ */
+ @Override
+ public boolean areSettingsValidForRun() {
+ boolean result = true;
+ List<IAdvancedPageContribution> contributions =
+ getTestManager().getContributions().getAdvancedPageContributions();
+ for (IAdvancedPageContribution contribution : contributions) {
+ result &= contribution.areSettingsValidForRun();
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#getErrorMessage()
+ */
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ List<IAdvancedPageContribution> contributions =
+ getTestManager().getContributions().getAdvancedPageContributions();
+ for (IAdvancedPageContribution contribution : contributions) {
+ 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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#onConnectionLost(org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment)
+ */
+ @Override
+ public boolean onConnectionLost(IHostTestEnvironment testHost) {
+ 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 00000000000..52685e55471
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.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.ui.test.manager.pages;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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();
+ TestManagerPlugin.getInstance().setHelp(this, "tm_hosts_page");
+ }
+
+ @Override
+ public String getPageName() {
+ return pageName;
+ }
+
+ 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);
+ computeScrollSize();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#
+ * areSettingsValidForRun()
+ */
+ @Override
+ public boolean areSettingsValidForRun() {
+ return getTestManager().isConnected();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#restoreData()
+ */
+ @Override
+ public void restoreData() {
+ // Do Nothing
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#saveData()
+ */
+ @Override
+ public void saveData() {
+ // Do Nothing
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#getErrorMessage
+ * ()
+ */
+ @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;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#onConnectionLost
+ * (org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment)
+ */
+ @Override
+ public boolean onConnectionLost(IHostTestEnvironment testHost) {
+ 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/OverviewPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/OverviewPage.java
new file mode 100644
index 00000000000..cce7167e34b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/OverviewPage.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author David Diepenbrock
+ */
+public class OverviewPage extends TestManagerPage implements IActionable {
+
+ private static final String pageName = "Overview";
+ private static final String release = "";
+ Map<LabelEnum, Label> labelMap;
+
+ private enum LabelEnum {
+ TM_Release("This Test Manager will only work with TM Server Release " + release),
+ Configuration,
+ Contact,
+ Description;
+
+ private String toolTip;
+
+ LabelEnum() {
+ this("");
+ }
+
+ LabelEnum(String toolTip) {
+ this.toolTip = toolTip;
+ }
+
+ public String getToolTipText() {
+ return toolTip;
+ }
+
+ public String toString() {
+ return name().replaceAll("_", " ");
+ }
+ }
+
+ /**
+ * Creates and populates the Overview Page
+ *
+ * @param parent
+ * @param style
+ * @param parentTestManager
+ */
+ public OverviewPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style, parentTestManager);
+ createPage();
+ updateLabelText();
+ computeScrollSize();
+ TestManagerPlugin.getInstance().setHelp(this, "tm_overview_page");
+ }
+
+ /**
+ * @return Returns the pageName.
+ */
+ public String getPageName() {
+ return pageName;
+ }
+
+ /**
+ * Refreshes the label's text based upon the test manager's model.
+ */
+ public void updateLabelText() {
+ for (LabelEnum enumEntry : LabelEnum.values()) {
+ String toSet = "";
+ Label label = labelMap.get(enumEntry);
+ switch (enumEntry) {
+ case TM_Release:
+ toSet = release;
+ break;
+ case Configuration:
+ toSet = getTestManager().getModel().getConfiguration();
+ break;
+ case Contact:
+ toSet = getTestManager().getModel().getContact();
+ break;
+ case Description:
+ toSet = getTestManager().getModel().getDescription();
+ break;
+ default:
+ break;
+ }
+ label.setText(toSet);
+ }
+ }
+
+ protected void createPage() {
+ super.createPage();
+ Composite parent = (Composite) getContent();
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ labelMap = new HashMap<LabelEnum, Label>();
+ for (LabelEnum enumEntry : LabelEnum.values()) {
+ Label label = new Label(composite, SWT.NONE);
+ label.setText(enumEntry.toString() + ": ");
+
+ Label updateableLabel = new Label(composite, SWT.NONE);
+ updateableLabel.setToolTipText(enumEntry.getToolTipText());
+
+ labelMap.put(enumEntry, updateableLabel);
+
+ if (enumEntry.equals(LabelEnum.TM_Release)) {
+ updateableLabel.addMouseListener(new MouseAdapter() {
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // Double right click here to turn on the debug for the plug-in
+ if (e.button == 3) {
+ debug.setGlobalDebug();
+ }
+ }
+ });
+ }
+ }
+ OseeAts.addButtonToEditorToolBar(this, TestManagerPlugin.getInstance(), composite, TestManagerEditor.namespace,
+ "Test Manager");
+
+ }
+
+ public String getActionDescription() {
+ return "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#areSettingsValidForRun()
+ */
+ @Override
+ public boolean areSettingsValidForRun() {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#restoreData()
+ */
+ @Override
+ public void restoreData() {
+ // Do Nothing
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#saveData()
+ */
+ @Override
+ public void saveData() {
+ // Do Nothing
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#getErrorMessage()
+ */
+ @Override
+ public String getErrorMessage() {
+ return "";
+ }
+
+ @Override
+ public boolean onConnection(ConnectionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean onDisconnect(ConnectionEvent event) {
+ return false;
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#onConnectionLost(org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment)
+ */
+ @Override
+ public boolean onConnectionLost(IHostTestEnvironment testHost) {
+ return false;
+ }
+
+}
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 00000000000..095a1a69c29
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java
@@ -0,0 +1,475 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.TestCoreGuiPlugin;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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.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.Display;
+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;
+import org.eclipse.ui.PlatformUI;
+
+public abstract class ScriptPage extends TestManagerPage {
+
+ private static final String NOT_CONNECTED = "<< NOT_CONNECTED >>";
+
+ 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 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);
+ }
+
+ 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});
+ computeScrollSize();
+
+ TestManagerPlugin.getInstance().setHelp(this, "tm_scripts_page");
+ }
+
+ 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) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ 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(plugin.getImage("file_delete.gif"));
+ deleteButton.setToolTipText("Deletes Selected (highlighted) Scripts");
+ deleteButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleDeleteButton();
+ }
+ });
+ deleteButton.addListener(SWT.MouseUp, new Listener() {
+ 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(plugin.getImage("sel_run_exec.gif"));
+ runButton.setDisabledImage(plugin.getImage("unsel_run_exec.gif"));
+ runButton.setToolTipText("Runs the Checked Scripts");
+ runButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleRunButton();
+ }
+ });
+ runButton.addListener(SWT.MouseUp, new Listener() {
+ 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(plugin.getImage("sel_abort_stop.gif"));
+ abortButton.setDisabledImage(plugin.getImage("unsel_abort_stop.gif"));
+ abortButton.setToolTipText("Abort Currently Running Script");
+ abortButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), 30000);
+ }
+ });
+ abortButton.addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event e) {
+ if (e.button == 3) {
+ handleAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), 30000);
+ }
+ }
+ });
+ abortButton.setEnabled(false);
+
+ abortBatchButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+ abortBatchButton.setImage(plugin.getImage("sel_batch_abort_stop.gif"));
+ abortBatchButton.setDisabledImage(plugin.getImage("unsel_batch_abort_stop.gif"));
+ abortBatchButton.setToolTipText("Abort Script Batch");
+ abortBatchButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleBatchAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), 30000);
+ }
+ });
+ abortBatchButton.addListener(SWT.MouseUp, new Listener() {
+ public void handleEvent(Event e) {
+ if (e.button == 3) {
+ handleBatchAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), 30000);
+ }
+ }
+ });
+ 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 (selectedFile == null || selectedFile.equals("")) {
+ 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() {
+ TestCoreGuiPlugin.getDefault().getConsole().write(
+ "Aborting Test Script...");
+ try {
+ getScriptManager().abortScript(false);
+ } catch (RemoteException e) {
+ TestCoreGuiPlugin.getDefault().getConsole().writeError(
+ Lib.exceptionToString(e));
+ }
+ }
+
+ // TODO this stuff needs some updating too...
+ protected void handleBatchAbortButton() {
+ TestCoreGuiPlugin.getDefault().getConsole().write(
+ "Aborting Test Script Batch...");
+ try {
+ getScriptManager().abortScript(true);
+ } catch (RemoteException e) {
+ TestCoreGuiPlugin.getDefault().getConsole().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(Display.getDefault().getActiveShell(), "Error", "Test Manager Settings Error");
+ }
+ }
+
+ private class EnabledAbortsTimer extends TimerTask {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.util.TimerTask#run()
+ */
+ @Override
+ public void run() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ if (!runButton.isEnabled()) {
+ abortBatchButton.setEnabled(true);
+ abortButton.setEnabled(true);
+ }
+ } catch (Throwable th) {
+
+ }
+ }
+ });
+
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#areSettingsValidForRun()
+ */
+ @Override
+ public boolean areSettingsValidForRun() {
+ return getScriptTableViewer().getRunTasks().size() > 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage#getErrorMessage()
+ */
+ @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);
+ Display.getDefault().asyncExec(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;
+ }
+
+ public boolean onDisconnect(ConnectionEvent event) {
+ boolean result = getScriptManager().disconnect(event);
+ Display.getDefault().asyncExec(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 boolean onConnectionLost(IHostTestEnvironment testHost) {
+ boolean result = getScriptManager().onConnectionLost(testHost);
+ Display.getDefault().asyncExec(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();
+
+ /**
+ * @param files
+ */
+ 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 00000000000..05ac950b7d3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.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.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.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StatusWindowWidget {
+ private Map<String, Map<EntryAttribute, Object>> labelValueMap;
+ private List<String> keys;
+ private FormattedText statusTextArea;
+
+ private enum EntryAttribute {
+ LABEL, VALUE, STYLE, COLOR;
+ }
+
+ public StatusWindowWidget(Composite parent) {
+ keys = new ArrayList<String>();
+ labelValueMap = new HashMap<String, Map<EntryAttribute, Object>>();
+ 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<EntryAttribute, Object>();
+ 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() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ 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 00000000000..34e756d770f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.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.ui.test.manager.pages;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.Debug;
+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 {
+
+ protected Debug debug;
+ private final TestManagerEditor testManager;
+ private Composite mainComposite;
+
+ /**
+ * @param parent
+ * @param style
+ */
+ public TestManagerPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style | SWT.H_SCROLL | SWT.V_SCROLL);
+ this.testManager = parentTestManager;
+ debug = new Debug(false, this.getClass().getName());
+ }
+
+ 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);
+ }
+
+ 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.
+ *
+ * @param event
+ * @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(IHostTestEnvironment testHost);
+
+ @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/ExtensionContributions.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ExtensionContributions.java
new file mode 100644
index 00000000000..4a4507511d6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ExtensionContributions.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.ui.test.manager.pages.contributions;
+
+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.plugin.core.util.ExtensionDefinedObjects;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ExtensionContributions {
+
+ private static String ADVANCED_PAGE_EXTENSION_ELEMENT = "AdvancedPageContribution";
+ private static String ADVANCED_PAGE_EXTENSION_ID =
+ TestManagerPlugin.PLUGIN_ID + "." + ADVANCED_PAGE_EXTENSION_ELEMENT;
+ private static String EXTENSION_ATTRIBUTE = "classname";
+
+ private ExtensionDefinedObjects<IAdvancedPageContribution> advancedPageContributions;
+
+ public ExtensionContributions() {
+ this.advancedPageContributions =
+ new ExtensionDefinedObjects<IAdvancedPageContribution>(ADVANCED_PAGE_EXTENSION_ID,
+ ADVANCED_PAGE_EXTENSION_ELEMENT, EXTENSION_ATTRIBUTE);
+ }
+
+ public List<IAdvancedPageContribution> getAdvancedPageContributions() {
+ List<IAdvancedPageContribution> toReturn = new ArrayList<IAdvancedPageContribution>();
+ try {
+ toReturn = advancedPageContributions.getObjects();
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex.getMessage(), ex);
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/IAdvancedPageContribution.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/IAdvancedPageContribution.java
new file mode 100644
index 00000000000..0032ba253e5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/IAdvancedPageContribution.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.ui.test.manager.pages.contributions;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IAdvancedPageContribution {
+
+ public Control createControl(Composite parent);
+
+ public void save(IPropertyStore propertyStore);
+
+ public void load(IPropertyStore propertyStore);
+
+ public boolean areSettingsValidForRun();
+
+ public String getErrorMessage();
+
+ public int getPriority();
+}
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 00000000000..f675857eace
--- /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,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.test.manager.pages.contributions;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+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 IAdvancedPageContribution {
+ 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;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ 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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#load(org.eclipse.osee.ote.core.framework.data.IPropertyStore)
+ */
+ 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.loggingPanel.setSelected(propertyStore.get(TestManagerStorageKeys.LOGGING_LEVEL_KEY));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#save(org.eclipse.osee.ote.core.framework.data.IPropertyStore)
+ */
+ 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());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#areSettingsValidForRun()
+ */
+ @Override
+ public boolean areSettingsValidForRun() {
+ return scriptDirectoryPanel.isValid();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#getErrorMessage()
+ */
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ if (scriptDirectoryPanel.isValid() != true) {
+ builder.append("Script Output Directory: ");
+ builder.append(scriptDirectoryPanel.getErrorMessage());
+ }
+ return builder.toString();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.contributions.IAdvancedPageContribution#getPriority()
+ */
+ 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 00000000000..814e1fd3ccc
--- /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,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.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 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 00000000000..af78a6c582c
--- /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,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.pages.scriptTable;
+
+public interface ITaskListViewer {
+
+ /**
+ * Update the view to reflect the fact that a task was added to the task list
+ *
+ * @param task
+ */
+ public void addTask(ScriptTask task);
+
+ /**
+ * Update the view to reflect the fact that multiple tasks were added to the task list
+ *
+ * @param tasks
+ */
+ public void addTasks(ScriptTask[] tasks);
+
+ /**
+ * Update the view to reflect the fact that a task was removed from the task list
+ *
+ * @param task
+ */
+ public void removeTask(ScriptTask task);
+
+ /**
+ * Update the view to reflect the fact that one of the tasks was modified
+ *
+ * @param task
+ */
+ 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 00000000000..f80a1f2ba0b
--- /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,502 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.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.skynet.core.utility.OseeData;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.ui.markers.MarkerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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.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.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;
+
+public class ScriptTableViewer {
+ private static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+
+ private 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;
+
+ /**
+ * @param parent
+ */
+ 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,
+ TestManagerPlugin.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.log(TestManagerPlugin.class, Level.INFO, String.format("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,
+ TestManagerPlugin.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.log(TestManagerPlugin.class, Level.SEVERE, String.format(
+ "Unable to add file [%s] to script view.", script), ex);
+ }
+ }
+ }
+ }
+ }
+ 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 = ((ScriptTask) 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() {
+ public void menuAboutToShow(IMenuManager manager) {
+ getPopupMenu();
+ }
+ });
+ }
+
+ private void attachDragDropListener() {
+ final FileTransfer fileTransfer = FileTransfer.getInstance();
+ final Transfer types[] = new Transfer[] {fileTransfer};
+ // Add Drag/Drop to Table
+ DropTargetListener scriptDropTargetListener = new DropTargetAdapter() {
+ public void drop(DropTargetEvent event) {
+ if (fileTransfer.isSupportedType(event.currentDataType)) {
+ processDroppedFiles((String[]) event.data);
+ }
+ }
+ };
+ // 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",
+ plugin.getImageDescriptor("chkbox_enabled.gif")) {
+ @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",
+ plugin.getImageDescriptor("chkbox_disabled.gif")) {
+ @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",
+ plugin.getImageDescriptor("chkbox_enabled.gif")) {
+ @Override
+ public void run() {
+ setAllTasksRun(true);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Deselect All to Run",
+ plugin.getImageDescriptor("chkbox_disabled.gif")) {
+ @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()){
+ Object obj = it.next();
+ OutputModelJob.getSingleton().addTask((ScriptTask)obj);
+ }
+ }
+ }
+ }
+
+ 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();
+ if (newTask.getScriptModel().getOutputModel() != null) {
+ if (newTask.getScriptModel().getOutputModel().getIFile() != null) {
+ MarkerPlugin.getDefault().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"), TestManagerPlugin.getStackMessages(ex)));
+ }
+ }
+
+ /**
+ * @return StructuredViewer
+ */
+ public StructuredViewer getXViewer() {
+ return scriptTable;
+ }
+
+ private void attachKeyListeners() {
+ scriptTable.getTree().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ }
+
+ public void keyReleased(KeyEvent e) {
+ // If they press enter, do the same as a double click
+ if (e.character == SWT.DEL) {
+ removeSelectedTasks();
+ refresh();
+ }
+ if (e.character == 'r') {
+ refresh();
+ }
+ }
+ });
+ }
+
+ /**
+ * @param files
+ */
+ 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 00000000000..d3b06dbcc8a
--- /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,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.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 rawFilename
+ * @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 (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 00000000000..df56f434be0
--- /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,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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 Set<ITaskListViewer> changeListeners = new HashSet<ITaskListViewer>();
+ private Vector<ScriptTask> tasks = new Vector<ScriptTask>();
+ private boolean isConnected = false;
+
+ /**
+ * Constructor
+ */
+ public ScriptTaskList() {
+ super();
+ }
+
+ /**
+ * @param viewer
+ */
+ 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();
+ }
+
+ /**
+ * @param viewer
+ */
+ public void removeChangeListener(ITaskListViewer viewer) {
+ changeListeners.remove(viewer);
+ }
+
+ /**
+ * @param task
+ */
+ public void removeTask(ScriptTask task) {
+ tasks.remove(task);
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).removeTask(task);
+ }
+
+ /**
+ * @param task
+ */
+ public void taskChanged(ScriptTask task) {
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext())
+ (iterator.next()).updateTask(task);
+ }
+
+ public String toString() {
+ String str = "";
+ for (int i = 0; i < tasks.size(); i++) {
+ ScriptTask task = (ScriptTask) tasks.get(i);
+ str += "\nTask " + task.getName() + " Status: " + task.getStatus();
+ }
+ return str + "\n\n";
+ }
+
+ /**
+ * @param newTask
+ * @return
+ */
+ 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 00000000000..027c9331de0
--- /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,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.pages.scriptTable.xscript;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.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 {
+
+ /**
+ * @param parent
+ * @param style
+ * @param namespace
+ * @param viewerFactory
+ */
+ public XScriptTable(Composite parent, int style) {
+ super(parent, style, new XScriptTableFactory(), false, false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewer#handleDoubleClick()
+ */
+ @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();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewer#handleLeftClick(org.eclipse.swt.widgets.TreeColumn, org.eclipse.swt.widgets.TreeItem)
+ */
+ @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);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewer#handleLeftClickInIconArea(org.eclipse.swt.widgets.TreeColumn, org.eclipse.swt.widgets.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<ScriptTask>();
+ 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<ScriptTask>();
+ for (Object obj : objs) {
+ runs.add((ScriptTask) obj);
+ }
+ return runs;
+ }
+
+}
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 00000000000..b6c1874ebb6
--- /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,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.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 {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ITaskListViewer#addTask(org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask)
+ */
+ @Override
+ public void addTask(ScriptTask task) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ITaskListViewer#addTasks(org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask[])
+ */
+ @Override
+ public void addTasks(ScriptTask[] tasks) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ITaskListViewer#removeTask(org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask)
+ */
+ @Override
+ public void removeTask(ScriptTask task) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ITaskListViewer#updateTask(org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask)
+ */
+ @Override
+ public void updateTask(ScriptTask task) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if(parentElement instanceof ScriptTaskList){
+ return ((ScriptTaskList)parentElement).getTasks().toArray();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ @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 00000000000..59a670e582b
--- /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,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.pages.scriptTable.xscript;
+
+import java.io.File;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.XViewerColumn.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.customize.FileStoreCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.skynet.core.utility.OseeData;
+import org.eclipse.swt.SWT;
+
+/**
+ * @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, SWT.LEFT, true, SortDataType.Boolean, false, null);
+ public static XViewerColumn TEST =
+ new XViewerColumn(COLUMN_NAMESPACE + ".test", "Test", 275, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn STATUS =
+ new XViewerColumn(COLUMN_NAMESPACE + ".status", "Status", 125, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn RESULT =
+ new XViewerColumn(COLUMN_NAMESPACE + ".result", "Result", 125, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn OUPUT_FILE =
+ new XViewerColumn(COLUMN_NAMESPACE + ".outfile", "Output File", 70, SWT.LEFT, true, SortDataType.String, false, null);
+ public static XViewerColumn TEST_LOCATION =
+ new XViewerColumn(COLUMN_NAMESPACE + ".testlocation", "Test Location", 160, SWT.LEFT, true, SortDataType.String, false, null);
+
+ private 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.toString(), ex);
+ folder = new File(System.getProperty("java.io.tmpdir"));
+ }
+ propertyStoreCustomizations = new FileStoreCustomizations(folder, "OteScript", ".xml", "DefaultOteScript.xml", defaultCustomDataXml);
+ registerColumn(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 00000000000..4f803e36783
--- /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,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.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.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.ui.test.manager.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 = plugin.getImage("chkbox_enabled.gif");
+ private static Image outputImage = plugin.getImage("check.gif");
+ private static Map<ScriptStatusEnum, Image> statusImage = new HashMap<ScriptStatusEnum, Image>();
+ private static Image uncheckedImage = plugin.getImage("chkbox_disabled.gif");
+
+ public XScriptTableLabelProvider(XScriptTable viewer) {
+ super(viewer);
+ if (statusImage.size() == 0) {
+ statusImage.put(ScriptStatusEnum.NOT_CONNECTED, plugin.getImage("alert_obj.gif"));
+ statusImage.put(ScriptStatusEnum.READY, plugin.getImage("scriptReady_sm.gif"));
+ statusImage.put(ScriptStatusEnum.IN_QUEUE, plugin.getImage("scriptInQueue_sm.gif"));
+ statusImage.put(ScriptStatusEnum.RUNNING, plugin.getImage("scriptRunning.gif"));
+ statusImage.put(ScriptStatusEnum.COMPLETE, plugin.getImage("scriptComplete_sm.gif"));
+ statusImage.put(ScriptStatusEnum.CANCELLED, plugin.getImage("scriptCancelled_sm.gif"));
+ statusImage.put(ScriptStatusEnum.CANCELLING, plugin.getImage("scriptCancelling_sm.gif"));
+ statusImage.put(ScriptStatusEnum.INVALID, plugin.getImage("error_stack.gif"));
+ statusImage.put(ScriptStatusEnum.INCOMPATIBLE, plugin.getImage("error_stack.gif"));
+ }
+ };
+
+
+ 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 (Image) 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 (Image) statusImage.get(status);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider#getColumnImage(java.lang.Object, org.eclipse.nebula.widgets.xviewer.XViewerColumn, int)
+ */
+ @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;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider#getColumnText(java.lang.Object, org.eclipse.nebula.widgets.xviewer.XViewerColumn, int)
+ */
+ @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 "";
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
+ */
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ @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 00000000000..599266124f4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.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.ui.test.manager.panels;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.ui.test.manager.TestManagerPlugin;
+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;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FileOrDirectorySelectionPanel extends Composite {
+
+ private static final Image FILE_SELECT_IMAGE = TestManagerPlugin.getInstance().getImage("file.gif");
+ 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 String labelText;
+ private String toolTipText;
+ private 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() {
+ public void widgetSelected(SelectionEvent e) {
+ createDialog();
+ }
+ });
+
+ }
+
+ private void createDialog() {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().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 00000000000..3234f0c9d2b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.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.panels;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.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;
+ }
+
+ public static LoggingLevel fromString(String value) {
+ LoggingLevel toReturn = LoggingLevel.Detailed;
+ if (Strings.isValid(value) != false) {
+ for (LoggingLevel formatType : LoggingLevel.values()) {
+ if (formatType.name().equalsIgnoreCase(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<LoggingLevel, Button>();
+ 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() {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @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.log(TestManagerPlugin.class, Level.WARNING, String.format("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 00000000000..9753ebacbd2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.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.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;
+
+ 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.");
+ }
+
+ public boolean isKeepOldCopiesEnabled() {
+ return saveOutputCheck.getSelection();
+ }
+
+ public boolean isBatchModeEnabled() {
+ return batchModeCheck.getSelection();
+ }
+
+ public void setKeepOldCopiesEnabled(boolean isEnabled) {
+ saveOutputCheck.setSelection(isEnabled);
+ }
+
+ public void setBatchModeEnabled(boolean isEnabled) {
+ batchModeCheck.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 00000000000..3b057361796
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.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.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.ote.ui.test.manager.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;
+
+ public void init(IWorkbench workbench) {
+ // Initialize the preference store we wish to use
+ setPreferenceStore(TestManagerPlugin.getInstance().getPreferenceStore());
+ }
+
+ 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:");
+ }
+
+ protected Control createContents(Composite parent) {
+
+ createPageDescription(parent);
+ createBlankArea(parent, 0, false);
+ createDefaultEvironmentVariablesArea(parent);
+ // createBlankArea(parent, 300, true);
+
+ return parent;
+ }
+
+ protected void performApply() {
+ performOk();
+ }
+
+ 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 00000000000..9c42902431c
--- /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,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.preferences.environment;
+
+import java.util.ArrayList;
+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.Display;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPageDataViewer {
+
+ private Group environmentVariable;
+ private EnvironmentPreferenceNode nodeToDisplay;
+ private ArrayList<StyleRange> styleArray;
+ private StyledText textArea;
+
+ public EnvironmentPageDataViewer(Composite parent) {
+ createArea(parent);
+ styleArray = new ArrayList<StyleRange>();
+ }
+
+ 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 = Display.getDefault().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 = Display.getDefault().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(Display.getDefault().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 00000000000..bbc893ed517
--- /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,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.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.ote.ui.test.manager.util.EnvVariableDetailsDialogHelper;
+import org.eclipse.osee.ote.ui.test.manager.util.EnvVariableDialogHelper;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPageEventHandler {
+
+ private EnvironmentPreferenceNode currentSelection;
+ private EnvironmentPageDataViewer environmentPageDataViewer;
+ private ArrayList<EnvironmentPreferenceNode> treeInputList;
+ private 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());
+ Display.getDefault().syncExec(selection);
+ if (selection.getResult() != Window.CANCEL) {
+ node.setValue(selection.getSelection());
+ environmentPageDataViewer.update();
+ }
+ }
+
+ public void handleAddEnvironmentVariableEvent() {
+ EnvVariableDialogHelper selection = new EnvVariableDialogHelper();
+ Display.getDefault().syncExec(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 00000000000..854431cf47c
--- /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,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.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;
+ }
+
+ public boolean isChecked() {
+ return checked;
+ }
+
+ 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 00000000000..553ffeb900d
--- /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,308 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.ote.ui.test.manager.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<String, String>();
+
+ ArrayList<EnvironmentPreferenceNode> envList = loadVariables();
+
+ for (EnvironmentPreferenceNode node : envList) {
+ if (node.isChecked()) {
+ String name = node.getEnvName();
+ String value = node.getValue();
+ if (name != null && !name.equals("")) {
+ environmentVariables.put(name, value != null ? value : "");
+ }
+ }
+ }
+ return environmentVariables;
+ }
+
+ private static ArrayList<EnvironmentPreferenceNode> loadVariables() {
+ ArrayList<EnvironmentPreferenceNode> list = new ArrayList<EnvironmentPreferenceNode>();
+ 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 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() {
+ public void keyPressed(KeyEvent e) {
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (e.character == SWT.DEL)
+ environmentPageEventHandler.handleRemoveSelectedViewEvent();
+ }
+ });
+
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ environmentPageEventHandler.handleTreeSelectionEvent(event);
+ }
+ });
+
+ treeViewer.getTree().addMouseListener(new MouseListener() {
+ public void mouseDoubleClick(MouseEvent e) {
+ environmentPageEventHandler.handleEditVariableEvent();
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseUp(MouseEvent e) {
+ }
+ });
+
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+
+ 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() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ environmentPageEventHandler.handleAddEnvironmentVariableEvent();
+ }
+ });
+
+ removeButton = new Button(buttonComposite, SWT.PUSH);
+ removeButton.setText("Remove");
+ removeButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ 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() {
+
+ public void dispose() {
+
+ }
+
+ 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];
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement != null && inputElement instanceof ArrayList) {
+ ArrayList<?> elementArray = (ArrayList<?>) inputElement;
+ return elementArray.toArray();
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ if (element != null && element instanceof TreeObject) {
+ TreeObject child = (TreeObject) element;
+ return child.getParent();
+ }
+ return new Object();
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof TreeParent) {
+ TreeParent parent = (TreeParent) element;
+ return parent.hasChildren();
+ }
+ return false;
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+ }
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public Image getImage(Object obj) {
+ return TestManagerPlugin.getInstance().getImage("environment.gif");
+ }
+
+ 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/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 00000000000..020dc5c7e56
--- /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 00000000000..e1856e738ba
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.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 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() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = true;
+
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ 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() {
+
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog dialog = new FileDialog(EnvVariableDetailsDialog.this.getShell(), SWT.OPEN);
+
+ String result = dialog.open();
+ if (result != null && !result.equals("")) {
+ 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.getMessage(), 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() {
+ 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 00000000000..00f4c8b8695
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.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 EnvVariableDetailsDialogHelper implements Runnable {
+
+ private 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;
+ }
+
+ 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 00000000000..939bd152ee0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.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.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 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() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = true;
+
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ 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() {
+
+ 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 00000000000..8546d2978cc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.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.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;
+ }
+
+ 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/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 00000000000..bc7eb52ad2d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.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.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.IViewPart;
+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<IViewReference>();
+ 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 IViewPart findView(String viewID) {
+ IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows();
+ IWorkbenchPage pages[];
+ for (int i = 0; i < windows.length; i++) {
+ pages = windows[i].getPages();
+ for (int j = 0; j < pages.length; j++)
+ return pages[j].findView(viewID);
+ }
+ return null;
+ }
+
+ public static IViewPart findViews(String viewID) {
+ IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows();
+ IWorkbenchPage pages[];
+ for (int i = 0; i < windows.length; i++) {
+ pages = windows[i].getPages();
+ for (int j = 0; j < pages.length; j++)
+ return pages[j].findView(viewID);
+ }
+ return null;
+ }
+
+ public static boolean areTestManagersAvailable() {
+ return getTestManagers().length > 0;
+ }
+
+ public static TestManagerEditor[] getTestManagers() {
+ List<TestManagerEditor> tmes = new ArrayList<TestManagerEditor>();
+ 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 00000000000..d737acc4355
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.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.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.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.swt.widgets.Display;
+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(Display.getCurrent().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<TestManagerEditor>();
+ 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 00000000000..b08d01d00bd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.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.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 00000000000..5c98084c8cd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.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.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.
+ */
+
+ 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)
+ */
+ 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.
+ */
+ public boolean performFinish() {
+ final String containerName = page.getContainerName();
+ final String fileName = page.getFileName();
+ IRunnableWithProgress op = new IRunnableWithProgress() {
+ 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() {
+ 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</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 00000000000..306d917831c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.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.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.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 ISelection selection;
+
+ /**
+ * Constructor for SampleNewWizardPage.
+ *
+ * @param selection
+ */
+ 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)
+ */
+ 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() {
+ public void modifyText(ModifyEvent e) {
+ dialogChanged();
+ }
+ });
+
+ Button button = new Button(container, SWT.PUSH);
+ button.setText("Browse...");
+ button.addSelectionListener(new SelectionAdapter() {
+ 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() {
+ 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() == ContainerSelectionDialog.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 00000000000..e1d32dbe07e
--- /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 00000000000..ad32c83a788
--- /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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <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/.project b/org.eclipse.osee.ote.ui/.project
new file mode 100644
index 00000000000..34fe749ab13
--- /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/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.ote.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..000e91fb1ec
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri Jun 12 15:55:43 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
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 00000000000..070ac6b5754
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+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.4.0.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.TestCoreGuiPlugin
+Bundle-Vendor: Eclipse.org
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.skynet.core,
+ org.eclipse.osee.framework.ui.skynet,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.svn,
+ org.eclipse.core.resources,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.client,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.help,
+ org.eclipse.osee.framework.ui.service.control,
+ org.eclipse.osee.framework.db.connection
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.ui,
+ org.eclipse.osee.ote.ui.navigate,
+ org.eclipse.osee.ote.ui.testclassserver
+Bundle-ClassPath: library.jar
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.jdt.core,
+ org.eclipse.jdt.ui,
+ org.eclipse.osee.framework.core.client,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.runtimemanager
diff --git a/org.eclipse.osee.ote.ui/build.properties b/org.eclipse.osee.ote.ui/build.properties
new file mode 100644
index 00000000000..212649ce999
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/build.properties
@@ -0,0 +1,13 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ library.jar,\
+ plugin.xml,\
+ images/,\
+ build.properties,\
+ help/
+jars.compile.order = .,\
+ library.jar
+source.library.jar = src/
+output.library.jar = bin/
diff --git a/org.eclipse.osee.ote.ui/help/contexts.xml b/org.eclipse.osee.ote.ui/help/contexts.xml
new file mode 100644
index 00000000000..8a26bfc262b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/help/contexts.xml
@@ -0,0 +1,6 @@
+<contexts>
+ <context id="oteNavigator" title="OTE Navigator">
+ <description>Shortcut view to common OTE tasks.</description>
+ <topic href="src/org/eclipse/osee/ote/ui/navigate/package.html" label="OTE Navigator"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.osee.ote.ui/help/toc.xml b/org.eclipse.osee.ote.ui/help/toc.xml
new file mode 100644
index 00000000000..9d46199d0a6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/help/toc.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.osee.ote.core/help/toc.xml#tools" label="OTE Navigator">
+ <topic href="src/org/eclipse/osee/ote/ui/navigate/package.html" label="OTE Navigator">
+ <anchor id="otenavigator"/>
+ </topic>
+
+
+</toc> \ No newline at end of file
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 00000000000..e7b7fb4d8aa
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/checkout.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/config.gif b/org.eclipse.osee.ote.ui/images/config.gif
new file mode 100644
index 00000000000..9ac596da3a4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/config.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 00000000000..b397d8b2c1c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/connected_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/file.gif b/org.eclipse.osee.ote.ui/images/file.gif
new file mode 100644
index 00000000000..7ccc6a70317
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/file.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/function.gif b/org.eclipse.osee.ote.ui/images/function.gif
new file mode 100644
index 00000000000..0aa75fe7047
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/function.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/outfile_import.gif b/org.eclipse.osee.ote.ui/images/outfile_import.gif
new file mode 100644
index 00000000000..22fddb030a2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/outfile_import.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/procedure.gif b/org.eclipse.osee.ote.ui/images/procedure.gif
new file mode 100644
index 00000000000..d11c996e570
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/procedure.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/testrun.gif b/org.eclipse.osee.ote.ui/images/testrun.gif
new file mode 100644
index 00000000000..2b347ac4582
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/testrun.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 00000000000..311f57fe951
--- /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 00000000000..b088ec4c5d4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/plugin.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="OteNavigateItem" name="OteNavigateItem" schema="schema/OteNavigateItem.exsd"/>
+ <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
+ point="org.eclipse.osee.ote.ui.OteNavigateItem">
+ <IOteNavigateItem
+ classname="org.eclipse.osee.ote.ui.navigate.WorkspaceSetupViewItems">
+ </IOteNavigateItem>
+ </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
+ id="OteUI"
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="help/contexts.xml">
+ </contexts>
+ </extension>
+ <extension
+ point="org.eclipse.help.toc">
+ <toc
+ file="help/toc.xml"
+ primary="false">
+ </toc>
+ </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.osee.framework.ui.skynet.ArtifactImageProvider">
+ <ArtifactImageProvider
+ class="org.eclipse.osee.ote.ui.OteArtifactImageProvider">
+ </ArtifactImageProvider>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.ui/schema/OteNavigateItem.exsd b/org.eclipse.osee.ote.ui/schema/OteNavigateItem.exsd
new file mode 100644
index 00000000000..c6de66a35a3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/schema/OteNavigateItem.exsd
@@ -0,0 +1,109 @@
+<?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="OteNavigateItem" name="OteNavigateItem"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="IOteNavigateItem"/>
+ </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="IOteNavigateItem">
+ <complexType>
+ <attribute name="classname" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.ote.ui.navigate.IOteNavigateItem"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="category" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </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/schema/WorkspaceSetup.exsd b/org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd
new file mode 100644
index 00000000000..d201759ff7b
--- /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/OteArtifactImageProvider.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteArtifactImageProvider.java
new file mode 100644
index 00000000000..89387528aca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteArtifactImageProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Created on Jun 8, 2009
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.ui;
+
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteArtifactImageProvider extends ArtifactImageProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.ui.skynet.ArtifactImageProvider#init()
+ */
+ @Override
+ public void init() throws OseeCoreException {
+ ImageManager.registerBaseImage("Test Procedure", OteImage.TEST_PROCEDURE);
+ ImageManager.registerBaseImage("Test Configuration", OteImage.TEST_CONFIG);
+ ImageManager.registerBaseImage("Test Run", OteImage.TEST_RUN);
+ ImageManager.registerBaseImage("Test Case", OteImage.TEST_CASE);
+ ImageManager.registerBaseImage("Test Support", OteImage.TEST_SUPPORT);
+ }
+} \ No newline at end of file
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 00000000000..73d779dd2c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java
@@ -0,0 +1,35 @@
+package org.eclipse.osee.ote.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.skynet.ImageManager;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum OteImage implements OseeImage {
+ CHECKOUT("checkout.gif"),
+ CONNECTED("connected_sm.gif"),
+ OTE("welcome_item3.gif"),
+ TEST_PROCEDURE("procedure.gif"),
+ TEST_CONFIG("config.gif"),
+ TEST_RUN("testrun.gif"),
+ TEST_CASE("file.gif"),
+ TEST_SUPPORT("function.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 00000000000..49adf6b632c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.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;
+
+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.IHostTestEnvironment;
+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;
+
+public class OteRemoteConsole implements IConsoleInputListener, ITestConnectionListener {
+
+ private IRemoteCommandConsole remoteConsole;
+ private ITestEnvironment env;
+
+ public OteRemoteConsole() throws RemoteException {
+
+ }
+
+ @Override
+ public void lineRead(String line) {
+ try {
+ String result = remoteConsole.doCommand(line);
+ TestCoreGuiPlugin.getDefault().getConsole().write(result);
+ } catch (RemoteException e) {
+ TestCoreGuiPlugin.log(Level.SEVERE, "exception executing command "
+ + line, e);
+ TestCoreGuiPlugin.getDefault().getConsole().writeError(
+ "Exception during executing of command. See Error Log");
+ }
+ }
+
+ public void close() throws RemoteException {
+ if (env != null) {
+ try {
+ env.closeCommandConsole(remoteConsole);
+ } catch (Exception e) {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.INFO,
+ "failed to close remote terminal", e);
+ }
+ }
+ if (TestCoreGuiPlugin.getDefault() != null
+ && TestCoreGuiPlugin.getDefault().getConsole() != null) {
+ TestCoreGuiPlugin.getDefault().getConsole().removeInputListener(
+ this);
+ } else {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.INFO,
+ "OteRemoteConsole is null");
+ }
+ env = null;
+ }
+
+ @Override
+ public void onConnectionLost(IServiceConnector connector, IHostTestEnvironment testHost) {
+ if (TestCoreGuiPlugin.getDefault() != null
+ && TestCoreGuiPlugin.getDefault().getConsole() != null) {
+ TestCoreGuiPlugin.getDefault().getConsole().removeInputListener(
+ this);
+ } else {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.INFO,
+ "OteRemoteConsole is null");
+ }
+ env = null;
+ }
+
+ @Override
+ public void onPostConnect(ConnectionEvent event) {
+ try {
+ env = event.getEnvironment();
+ remoteConsole = env.getCommandConsole();
+ TestCoreGuiPlugin.getDefault().getConsole().addInputListener(this);
+ } catch (RemoteException e) {
+ TestCoreGuiPlugin.log(Level.SEVERE,
+ "exception acquiring remote console", e);
+ }
+ }
+
+ @Override
+ public void onPreDisconnect(ConnectionEvent event) {
+ try {
+ close();
+ } catch (RemoteException e) {
+ TestCoreGuiPlugin.log(Level.SEVERE,
+ "exception while closing remote console", e);
+ }
+ }
+
+}
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 00000000000..b7ff820704b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.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.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<IProject>();
+
+ 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/TestCoreGuiPlugin.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestCoreGuiPlugin.java
new file mode 100644
index 00000000000..ceb137e9819
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestCoreGuiPlugin.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this 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.logging.Level;
+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.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.skynet.core.UserManager;
+import org.eclipse.osee.framework.ui.plugin.OseeFormActivator;
+import org.eclipse.osee.framework.ui.plugin.util.OseeConsole;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class TestCoreGuiPlugin extends OseeFormActivator {
+ private static TestCoreGuiPlugin pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui";
+ private ServiceTracker oteClientServiceTracker;
+
+ private OseeConsole console = null;
+ private OteRemoteConsole remoteConsole = null;
+
+ public TestCoreGuiPlugin() {
+ super();
+ pluginInstance = this;
+ }
+
+ private void ensureConsole() {
+ if (console == null) {
+ console = new OseeConsole("OTE Console");
+ console.popup();
+ }
+ }
+
+ public OseeConsole getConsole() {
+ ensureConsole();
+ return console;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ getOteClientService().removeConnectionListener(remoteConsole);
+ oteClientServiceTracker.close();
+ pluginInstance = null;
+ remoteConsole.close();
+ super.stop(context);
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ oteClientServiceTracker = new ServiceTracker(context, IOteClientService.class.getName(), null);
+ oteClientServiceTracker.open();
+ remoteConsole = new OteRemoteConsole();
+ getOteClientService().addConnectionListener(remoteConsole);
+
+ startOTEArtifactBulkLoad();
+ }
+
+ private void startOTEArtifactBulkLoad() {
+ Jobs.runInJob("OTE Persistance Bulk Load", new IExceptionableRunnable() {
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ UserManager.getUser();
+ return Status.OK_STATUS;
+ }
+ }, TestCoreGuiPlugin.class, "org.eclipse.osee.ote.ui", false);
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static TestCoreGuiPlugin getDefault() {
+ return pluginInstance;
+ }
+
+ public boolean runOnEventInDisplayThread() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.osee.framework.jdk.core.util.plugin.OseePlugin#getPluginName
+ * ()
+ */
+ @Override
+ protected String getPluginName() {
+ return PLUGIN_ID;
+ }
+
+ public static void log(Level level, String message) {
+ log(level, message, null);
+ }
+
+ public static void log(Level level, String message, Throwable t) {
+ OseeLog.log(TestCoreGuiPlugin.class, level, message, t);
+ }
+
+ public IOteClientService getOteClientService() {
+ return (IOteClientService) oteClientServiceTracker.getService();
+ }
+
+} \ No newline at end of file
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 00000000000..d87724cde9a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.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;
+
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView;
+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();
+ }
+
+ public void createInitialLayout(IPageLayout layout) {
+ defineActions(layout);
+ defineLayout(layout);
+ }
+
+ public void defineActions(IPageLayout layout) {
+
+ // Add "show views".
+ layout.addShowViewShortcut(ServiceManagerView.VIEW_ID);
+ 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);
+
+ layout.addActionSet(JavaUI.ID_ACTION_SET);
+ layout.addActionSet(JavaUI.ID_ELEMENT_CREATION_ACTION_SET);
+ layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/IOteNavigateItem.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/IOteNavigateItem.java
new file mode 100644
index 00000000000..35922c5dacd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/IOteNavigateItem.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.ui.navigate;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public interface IOteNavigateItem {
+
+ public List<XNavigateItem> getNavigateItems();
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteExtensionPointData.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteExtensionPointData.java
new file mode 100644
index 00000000000..cf7f057dc61
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteExtensionPointData.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.ui.navigate;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+/**
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OteExtensionPointData {
+ private String category;
+ private IOteNavigateItem navigateItem;
+
+ public OteExtensionPointData(String category, IOteNavigateItem navigateItem){
+ this.category = category;
+ this.navigateItem = navigateItem;
+ }
+
+ public String[] getItemPath(){
+ if(category != null && category.length()>0){
+ return category.split("\\.");
+ } else {
+ return new String[0];
+ }
+ }
+
+ public List<XNavigateItem> getNavigateItems(){
+ return navigateItem.getNavigateItems();
+ }
+
+ public String getCategory() {
+ return category;
+ }
+
+}
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 00000000000..5c8a9de2087
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.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.ui.navigate;
+
+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.jface.viewers.IStructuredSelection;
+import org.eclipse.osee.framework.ui.skynet.ats.IActionable;
+import org.eclipse.osee.framework.ui.skynet.ats.OseeAts;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.ote.ui.TestCoreGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Insert the type's description here.
+ *
+ * @see ViewPart
+ */
+public class OteNavigateView extends ViewPart implements IActionable {
+
+ public static final String VIEW_ID = "org.eclipse.osee.ote.ui.navigate.OteNavigateView";
+ private XNavigateComposite xNavComp;
+
+ /**
+ * The constructor.
+ */
+ public OteNavigateView() {
+ }
+
+ public void setFocus() {
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ public void createPartControl(Composite parent) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.osee.ote.ui.oteNavigator");
+ xNavComp = new XNavigateComposite(new OteNavigateViewItems(), parent, SWT.NONE);
+
+ xNavComp.getFilteredTree().getViewer().setSorter(new OteNavigateViewerSorter());
+
+ createActions();
+ xNavComp.refresh();
+
+ addExtensionPointListenerBecauseOfWorkspaceLoading();
+ }
+
+ private void addExtensionPointListenerBecauseOfWorkspaceLoading(){
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ extensionRegistry.addListener(new IRegistryEventListener(){
+ @Override
+ public void added(IExtension[] extensions) {
+ refresh();
+ }
+
+ @Override
+ public void added(IExtensionPoint[] extensionPoints) {
+ refresh();
+ }
+
+ @Override
+ public void removed(IExtension[] extensions) {
+ refresh();
+ }
+
+ @Override
+ public void removed(IExtensionPoint[] extensionPoints) {
+ refresh();
+ }
+ }, "org.eclipse.osee.ote.ui.OteNavigateItem");
+ }
+
+ protected void createActions() {
+ Action refreshAction = new Action("Refresh") {
+
+ public void run() {
+ xNavComp.refresh();
+ }
+ };
+ refreshAction.setImageDescriptor(TestCoreGuiPlugin.getDefault().getImageDescriptor("refresh.gif"));
+ refreshAction.setToolTipText("Refresh");
+
+ OseeAts.addBugToViewToolbar(this, this, TestCoreGuiPlugin.getDefault(), VIEW_ID, "OTE Navigator");
+
+ }
+
+ public String getActionDescription() {
+ IStructuredSelection sel = (IStructuredSelection) xNavComp.getFilteredTree().getViewer().getSelection();
+ if (sel.iterator().hasNext()) return String.format("Currently Selected - %s",
+ ((XNavigateItem) sel.iterator().next()).getName());
+ return "";
+ }
+
+ public void refresh() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ 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 00000000000..f80526c4306
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.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.navigate;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateViewItems;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteNavigateViewItems extends XNavigateViewItems {
+ private static OteNavigateViewItems navigateItems = new OteNavigateViewItems();
+
+ public OteNavigateViewItems() {
+ super();
+ }
+
+ public static OteNavigateViewItems getInstance() {
+ return navigateItems;
+ }
+
+ @Override
+ public List<XNavigateItem> getSearchNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+ addExtensionPointItems(items);
+ return items;
+ }
+
+ private void addExtensionPointItems(List<XNavigateItem> items) {
+ List<OteExtensionPointData> oteNavigateItemExtensions = getExtensionPointData();
+ Map<String, XNavigateItem> categoryToNavigateItem =
+ createCategoriesAndAddToItems(items, oteNavigateItemExtensions);
+ for (OteExtensionPointData data : oteNavigateItemExtensions) {
+ XNavigateItem item = categoryToNavigateItem.get(data.getCategory());
+ if (item == null) {
+ items.addAll(data.getNavigateItems());
+ } else {
+ for (XNavigateItem navItem : data.getNavigateItems()) {
+ item.addChild(navItem);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param oteNavigateItemExtensions
+ * @return
+ */
+ private Map<String, XNavigateItem> createCategoriesAndAddToItems(List<XNavigateItem> items, List<OteExtensionPointData> oteNavigateItemExtensions) {
+ Map<String, XNavigateItem> categoryToNavigateItem = new HashMap<String, XNavigateItem>();
+ for (OteExtensionPointData data : oteNavigateItemExtensions) {
+ if (!categoryToNavigateItem.containsKey(data.getCategory())) {
+ String[] path = data.getItemPath();
+ String key = "";
+ XNavigateItem lastItem = null;
+ for (int i = 0; i < path.length; i++) {
+
+ key += path[i];
+ XNavigateItem foundItem = categoryToNavigateItem.get(key);
+ if (foundItem == null) {
+ foundItem = new XNavigateItem(lastItem, path[i], FrameworkImage.FOLDER);
+ categoryToNavigateItem.put(key, foundItem);
+ // if(lastItem != null){
+ // lastItem.addChild(foundItem);
+ // }
+ if (i == 0) {
+ items.add(foundItem);
+ }
+ }
+ lastItem = foundItem;
+ key += ".";
+ }
+ }
+ }
+ return categoryToNavigateItem;
+ }
+
+ private List<OteExtensionPointData> getExtensionPointData() {
+ List<OteExtensionPointData> data = new ArrayList<OteExtensionPointData>();
+ List<IConfigurationElement> elements =
+ ExtensionPoints.getExtensionElements("org.eclipse.osee.ote.ui.OteNavigateItem", "IOteNavigateItem");
+ for (IConfigurationElement element : elements) {
+ String className = element.getAttribute("classname");
+ String category = element.getAttribute("category");
+ String bundleName = element.getContributor().getName();
+
+ if (Strings.isValid(bundleName) && Strings.isValid(className)) {
+ try {
+ Bundle bundle = Platform.getBundle(bundleName);
+ Class<?> taskClass = bundle.loadClass(className);
+ Object object;
+ try {
+ Method getInstance = taskClass.getMethod("getInstance", new Class[] {});
+ object = getInstance.invoke(null, new Object[] {});
+ } catch (Exception ex) {
+ object = taskClass.newInstance();
+ }
+ data.add(new OteExtensionPointData(category, (IOteNavigateItem) object));
+ } catch (Exception ex) {
+ throw new IllegalArgumentException(String.format("Unable to Load: [%s - %s]", bundleName, className), ex);
+ }
+ }
+ }
+ return data;
+ }
+}
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 00000000000..2eb605a260b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.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.navigate;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteNavigateViewerSorter extends ViewerSorter {
+
+ /**
+ * @param treeViewer
+ */
+ public OteNavigateViewerSorter() {
+ super();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @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.ui/src/org/eclipse/osee/ote/ui/navigate/WorkspaceSetupViewItems.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/WorkspaceSetupViewItems.java
new file mode 100644
index 00000000000..07d9fdb221b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/WorkspaceSetupViewItems.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.navigate;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionPoints;
+import org.eclipse.osee.framework.svn.CheckoutProjectSetJob;
+import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.skynet.OseeImage;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.skynet.widgets.xnavigate.XNavigateComposite.TableLoadOption;
+import org.eclipse.osee.ote.ui.OteImage;
+import org.eclipse.osee.ote.ui.TestCoreGuiPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class WorkspaceSetupViewItems implements IOteNavigateItem {
+ private static final String PARENT_FOLDER_NAME = "Workspace Operations";
+
+ public WorkspaceSetupViewItems() {
+ super();
+ }
+
+ public List<XNavigateItem> getNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<XNavigateItem>();
+ XNavigateItem parentFolder = new XNavigateItem(null, PARENT_FOLDER_NAME, FrameworkImage.FOLDER);
+ workspaceSetupFactory(parentFolder);
+ items.add(parentFolder);
+ return items;
+ }
+
+ private void workspaceSetupFactory(XNavigateItem parent) {
+ List<IConfigurationElement> configurationElements =
+ ExtensionPoints.getExtensionElements("org.eclipse.osee.ote.ui.WorkspaceSetup", "WorkspaceConfig");
+ for (IConfigurationElement configElement : configurationElements) {
+ IExtension extension = (IExtension) configElement.getParent();
+ String shortCutName =
+ (extension.getLabel() == null || extension.getLabel().length() == 0) ? extension.getSimpleIdentifier() : extension.getLabel();
+ String resourceName = configElement.getAttribute("configFile");
+ String bundleName = configElement.getContributor().getName();
+ if (Strings.isValid(shortCutName) && Strings.isValid(bundleName) && Strings.isValid(resourceName)) {
+ try {
+ URL configPath = getWorkspaceConfig(bundleName, resourceName);
+ if (configPath != null) {
+ new XNavigateItemRunnable(parent, shortCutName, OteImage.CHECKOUT, configPath);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.WARNING, String.format("Unable to Load: [%s.%s - %s]",
+ bundleName, resourceName, OteImage.CHECKOUT.toString()), ex);
+ }
+ }
+ }
+ }
+
+ private URL getResource(String bundleName, String resourceName) throws IOException {
+ Bundle bundle = Platform.getBundle(bundleName);
+ URL url = bundle.getEntry(resourceName);
+ url = FileLocator.resolve(url);
+ return url;
+ }
+
+ private URL getWorkspaceConfig(String bundleName, String configName) throws IOException {
+ return getResource(bundleName, configName);
+ }
+
+ private final class XNavigateItemRunnable extends XNavigateItem {
+ private URL projectSetFile;
+ private String jobName;
+
+ public XNavigateItemRunnable(XNavigateItem parent, String name, OseeImage oseeImage, URL projectSetFile) {
+ super(parent, name, oseeImage);
+ this.jobName = String.format("Workspace Configuration: [%s]", name);
+ this.projectSetFile = projectSetFile;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Runnable#run()
+ */
+ public void run(TableLoadOption... tableLoadOptions) {
+ Job job = new CheckoutProjectSetJob(jobName, getName(), projectSetFile);
+ job.setUser(true);
+ job.schedule();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/oteNavigator.JPG b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/oteNavigator.JPG
new file mode 100644
index 00000000000..6f4815f9c67
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/oteNavigator.JPG
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/package.html b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/package.html
new file mode 100644
index 00000000000..9b0df2f7f97
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/package.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<title>OTE Navigator</title>
+</head>
+<body bgcolor="white">
+<h1>OTE Navigator</h1>
+
+<img src="oteNavigator.JPG"/>
+<p>
+OTE navigator is a view that provides quick navigation to many of the GUI's and features of OTE.
+</p>
+
+<p>
+By default it can be found on the left side of eclipse in the OSEE Test Perspective.
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/testclassserver/ClassServerInst.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/testclassserver/ClassServerInst.java
new file mode 100644
index 00000000000..60a358dc3c5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/testclassserver/ClassServerInst.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.ui.testclassserver;
+
+import java.io.File;
+import java.net.BindException;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+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.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.JavaCore;
+import org.eclipse.osee.framework.core.client.CorePreferences;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.server.ClassServer;
+import org.eclipse.osee.framework.plugin.core.server.PathResourceFinder;
+import org.eclipse.osee.framework.ui.plugin.util.AJavaProject;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkspace;
+import org.eclipse.osee.ote.runtimemanager.UserLibResourceFinder;
+import org.eclipse.osee.ote.ui.TestCoreGuiPlugin;
+
+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
+ *
+ * @param testManager
+ */
+ private ClassServerInst() {
+ try {
+ InetAddress useHostAddress = CorePreferences.getDefaultInetAddress();
+ classServer = new ClassServer(0, InetAddress.getLocalHost())//;
+ {
+ @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(pathResourceFinder);
+ classServer.start();
+
+ classServerPath = "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(TestCoreGuiPlugin.class, Level.SEVERE, th.getMessage(), th);
+ }
+ return Status.OK_STATUS;
+ }
+
+ };
+ job.schedule();
+ } catch (BindException ex) {
+ OseeLog.log(
+ TestCoreGuiPlugin.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(TestCoreGuiPlugin.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<String>();
+
+ 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 = AJavaProject.getJavaProjectProjectDependancies(JavaCore.create(project));
+ for (File file : fileList)
+ list.add(file.getAbsolutePath());
+ }
+ } catch (CoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ return list.toArray(new String[list.size()]);
+ }
+}
diff --git a/org.eclipse.osee.support.admin/.project b/org.eclipse.osee.support.admin/.project
new file mode 100644
index 00000000000..e32e5630bf6
--- /dev/null
+++ b/org.eclipse.osee.support.admin/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.support.admin</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.support.admin/legal/Contribution_Questionnaire.xls b/org.eclipse.osee.support.admin/legal/Contribution_Questionnaire.xls
new file mode 100644
index 00000000000..7fa78aff14d
--- /dev/null
+++ b/org.eclipse.osee.support.admin/legal/Contribution_Questionnaire.xls
Binary files differ
diff --git a/org.eclipse.osee.support.admin/openDO/meeting.txt b/org.eclipse.osee.support.admin/openDO/meeting.txt
new file mode 100644
index 00000000000..aedb68c1d51
--- /dev/null
+++ b/org.eclipse.osee.support.admin/openDO/meeting.txt
@@ -0,0 +1,74 @@
+Paul Meyers - manager of advances services group
+development process to produce high integrity software
+everything must be requirement driven
+source, test, test output, coverage output
+
+http://www.stsc.hill.af.mil/crosstalk/2008/11/0811FromtheSponsor.html
+Ms. Kristen Baldwin serves as Deputy Director for Software Engineering and System Assurance in the Office of the Under Secretary of Defense for Acquisition, Technology and Logistics (OUSD (AT&L)).
+
+gps
+
+gnat bench
+
+use ECORE for meta-data model
+Doug Gaff and Wind River
+
+Open DO-178B
+
+config set of DO-178B workflows into OSEE
+import the DO-178B into OSEE
+integrate output from project coverage
+
+___________________________________
+2008-11-20
+Bruce Lewis worked with SEI - came up with an idea with AADL - University in Pairs working on AADL OSATE
+
+DO-178x categories:
+ development tools - has possibility of introducing
+ verification tools -
+ applications
+
+Willie Fizpatrick
+
+Topcased to become and Eclipse project
+
+http://www.slideshare.net/AdaCore/opendo-initial-concepts-and-idea
+
+
+need: PSAC, SAS, DTP, 66 objectives,
+software development plan can be the PSAC
+Configuration Management Plan
+Plan of Software Aspects of Certification
+workflows should have a review with a checklist of what should be in the document
+get DO-178B: www.avionics.com
+DO-254
+DO-248: clarification
+DO-278: for ground systems
+CAS papers of FAA website
+
+Vance Hilderman and Tony Baghai
+
+
+
+
+
+Egineering Process Group: CCMI
+__________________________________
+
+Test Suite - parent of test cases and/or test suites
+
+Test Case - test program the traces to the software requiements and verifies the code unit
+
+Code Unit - application code that traces to the software requiements
+
+
+need attribute to reference workspace file
+on edit launch the predefined workspace editor
+preview should translate to html
+
+inside test case use an annotation like "@Interesting 1" and "@InterestingEnd 1" to mark section of file
+
+
+fitnesse ochem@adacore.com
+
+AdaCore is a major sponsor of this event and Franco Gasperoni will be giving a talk entitled “Open-DO: A Call to Action for DO-178B and other Safety-Critical Software†\ No newline at end of file
diff --git a/org.eclipse.osee.support.admin/presentations/EclipseCon2009_Developing_High_Integrity_Software.html b/org.eclipse.osee.support.admin/presentations/EclipseCon2009_Developing_High_Integrity_Software.html
new file mode 100644
index 00000000000..0884c0612f5
--- /dev/null
+++ b/org.eclipse.osee.support.admin/presentations/EclipseCon2009_Developing_High_Integrity_Software.html
@@ -0,0 +1,27 @@
+Title: Developing High Integrity Software
+Difficulty: Intermediate
+Category: Eclipse Ecosystem - Business and Industry
+
+
+<p>Whether you develop mission/safety-critical systems or simply want the benefits of high quality engineering processes, this talk is for you.</p>
+
+<p>The development of high-integrity systems is governed by stringent standards which require engineers to provide sufficient evidence of the quality of the developed artifacts. For instance, DO-178B "Software Considerations in Airborne Systems and Equipment Certification" provides guidelines for the production of avionics software: any software flying on civil aircraft must follow DO-178. Similar standards exist for other domains, such as automotive and industrial automation.</p>
+
+<p>One of the most costly processes to put in place when developing high-quality software is providing end-to-end traceability between requirements, design elements, source code, test cases, and documentation. This evidence is needed to increase the confidence that the software satisfies stakeholders’ expectations. Since this evidence involves artifacts across the full development life-cycle, an integrated solution is needed in order to provide the required evidence in a cost effective manner.</p>
+
+<p><a href="http://www.eclipse.org/osee">Open System Engineering Environment</a> (OSEE) is an integrated environment that enables developers to apply software engineering principles needed to build high integrity software. Using a user definable process and workflow and bidirectional traceability across the full development life-cycle, OSEE facilities the creation and management of the engineering artifacts that can be used as evidence when certifying the product’s integrity.</p>
+
+<p>In this presentation and live demonstration, we show how OSEE facilitates the qualification of a verification tool in the context of DO-178 level A (the highest criticality level). We use OSEE to design a traceability model across all development artifacts, and to put them in relation with our specific workflow, so as to assure that each development step is allocated, tracked and produces the expected output. In addition, we exploit OSEE’s reporting capabilities to generate documented evidence of end-to-end traceability.</p>
+
+<p>This presentation is prepared by Boeing and AdaCore. The OSEE team at Boeing provided support in the use of OSEE for the qualification of AdaCore tools in the context of DO-178. The lessons learned from this collaboration are expected to be applicable to anyone involved with DO-178B and more generally to those who are developing high integrity software.</p>
+
+_____________OLD
+
+
+<p>Whether you develop mission/safety-critical systems or simply value high quality code, this talk is for you. Developing high integrity software in a cost effective manner, especially for complex systems, requires an integrated engineering environment to guide developers through the development process and facilitate and automate as many engineering steps as possible.</p>
+
+<p>The <a href="http://www.eclipse.org/osee">Open System Engineering Environment</a> (OSEE) enables developers to apply software engineering principles needed to build high integrity software. Using an integrated, user definable process and workflow and bidirectional traceability across the full development life-cycle, OSEE facilities the creation and management of the engineering artifacts that can be used as evidence when certifying the product’s integrity.</p>
+
+<p>AdaCore is the leading provider of commercial, open software solutions for long-lived applications where reliability, efficiency and safety are absolutely critical. AdaCore is working with the OSEE project to use OSEE for tool qualification for DO-178B of some of AdaCore’s tools such as GNATcheck and its open source code coverage tool. The lessons learned from this collaboration are expected to be useful to anyone involved with DO-178B and more generally those developing high integrity software.</p>
+
+<p>DO-178B "Software Considerations in Airborne Systems and Equipment Certification" provides guidelines for the production of avionics software and its use it accepted by certification authorities such as the FAA and EASA.</p>
diff --git a/org.eclipse.osee.support.admin/presentations/EclipseCon2009_OSEE_Test Environment.html b/org.eclipse.osee.support.admin/presentations/EclipseCon2009_OSEE_Test Environment.html
new file mode 100644
index 00000000000..0663df03290
--- /dev/null
+++ b/org.eclipse.osee.support.admin/presentations/EclipseCon2009_OSEE_Test Environment.html
@@ -0,0 +1,47 @@
+<p>
+Title: A Framework for Testing the Software of Complex Systems
+</p>
+
+<p>
+The <a href="http://www.eclipse.org/osee">Open System Engineering Environment</a> Test Environemnt (OTE) was created as a solution for verifying the
+software of the next generation Apache attack helicopter. OTE is intended for requirements based
+testing of software that is part of a larger complex system.
+</p>
+
+<p>
+Some of the features of the system are:
+ <li>
+ A Messaging system that supports the following external I/O: ethernet, mux, serial, and wire.
+ </li>
+ <li>
+ Tools for monitoring and manipulation of messages.
+ </li>
+ <li>
+ A Framework for modeling different components that interact with the software.
+ </li>
+ <li>
+ Support multiple levels of test fidelity; from a simulated environment to labs with varying degrees of actual hardware to production line test stations to debug problems and verify that hardware is properly connected.
+ </li>
+ <li>
+ Remote connection to the environment including the ability to manipulate messages and models.
+ </li>
+ <li>
+ Support for the running of thousands of tests that takes hundreds of hours to run to completion.
+ </li>
+ <li>
+ Traceability from requirements to tests to test runs.
+ </li>
+ <li>
+ History of test runs and a record of how failures were dispositioned.
+ </li>
+ <li>
+ Support for publishing various documents that are delivered to the customer.
+ </li>
+
+<p>
+
+<p>
+Our environment supports different types of users; from the test team who write and run the tests to requirements writers who debug the software requirements,
+ to manufacturing personal who perform checks on the final product. In our talk we will discuss the current state of our environment, how it may be used by
+ other organizations, and what our future plans are.
+</p>
diff --git a/org.eclipse.osee.support.admin/presentations/EclipseFoundation_2008-02-13.pdf b/org.eclipse.osee.support.admin/presentations/EclipseFoundation_2008-02-13.pdf
new file mode 100644
index 00000000000..aa00b06977f
--- /dev/null
+++ b/org.eclipse.osee.support.admin/presentations/EclipseFoundation_2008-02-13.pdf
Binary files differ
diff --git a/org.eclipse.osee.support.admin/presentations/SummitEurope_2008-11-19_OSEEintegratedSolution.pdf b/org.eclipse.osee.support.admin/presentations/SummitEurope_2008-11-19_OSEEintegratedSolution.pdf
new file mode 100644
index 00000000000..b26769585bf
--- /dev/null
+++ b/org.eclipse.osee.support.admin/presentations/SummitEurope_2008-11-19_OSEEintegratedSolution.pdf
Binary files differ
diff --git a/org.eclipse.osee.support.build/.classpath b/org.eclipse.osee.support.build/.classpath
new file mode 100644
index 00000000000..ad32c83a788
--- /dev/null
+++ b/org.eclipse.osee.support.build/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.support.build/.project b/org.eclipse.osee.support.build/.project
new file mode 100644
index 00000000000..07c9661aa51
--- /dev/null
+++ b/org.eclipse.osee.support.build/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.support.build</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.support.build/META-INF/MANIFEST.MF b/org.eclipse.osee.support.build/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..c751c3ec46b
--- /dev/null
+++ b/org.eclipse.osee.support.build/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Build Plug-in
+Bundle-SymbolicName: org.eclipse.osee.support.build
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Eclpse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/org.eclipse.osee.support.build/build.properties b/org.eclipse.osee.support.build/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.support.build/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.support.build/support/build.properties b/org.eclipse.osee.support.build/support/build.properties
new file mode 100644
index 00000000000..be0a148d9ba
--- /dev/null
+++ b/org.eclipse.osee.support.build/support/build.properties
@@ -0,0 +1,239 @@
+###############################################################################
+# Copyright (c) 2003, 2006 IBM Corporation 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+#####################
+# Parameters describing how and where to execute the build.
+# Typical users need only update the following properties:
+# baseLocation - where things you are building against are installed
+# bootclasspath - The base jars to compile against (typicaly rt.jar)
+# configs - the list of {os, ws, arch} configurations to build.
+#
+# Of course any of the settings here can be overridden by spec'ing
+# them on the command line (e.g., -DbaseLocation=d:/eclipse
+
+#The type of the top level element we are building, generally "feature"
+topLevelElementType = feature
+#The id of the top level element we are building
+topLevelElementId = ${master.feature}
+
+############# PRODUCT/PACKAGING CONTROL #############
+#product=/plugin or feature id/path/to/.product
+runPackager=true
+
+#Set the name of the archive that will result from the product build.
+#archiveNamePrefix=
+
+# The prefix that will be used in the generated archive.
+archivePrefix=osee
+
+# The location under which all of the build output will be collected. Must be equal to archivePrefix due to a bug in the eclpse build scripts
+collectingFolder=${archivePrefix}
+
+# The list of {os, ws, arch} configurations to build. This
+# value is a '&' separated list of ',' separate triples. For example,
+# configs=win32,win32,x86 & linux,motif,x86
+# By default the value is *,*,*
+configs = *, *, *
+#configs=win32, win32, x86 & \
+# linux, gtk, ppc &\
+# linux, gtk, x86 & \
+# linux, gtk, x86_64 & \
+# linux, motif, x86 & \
+# solaris, motif, sparc & \
+# solaris, gtk, sparc & \
+# aix, motif, ppc & \
+# hpux, motif, PA_RISC & \
+# macosx, carbon, ppc
+
+# By default PDE creates one archive (result) per entry listed in the configs property.
+# Setting this value to true will cause PDE to only create one output containing all
+# artifacts for all the platforms listed in the configs property.
+# To control the output format for the group, add a "group, group, group - <format>" entry to the
+# archivesFormat.
+#groupConfigurations=true
+
+#The format of the archive. By default a zip is created using antZip.
+#The list can only contain the configuration for which the desired format is different than zip.
+#archivesFormat=win32, win32, x86 - antZip& \
+# linux, gtk, ppc - antZip &\
+# linux, gtk, x86 - antZip& \
+# linux, gtk, x86_64 - antZip& \
+# linux, motif, x86 - antZip& \
+# solaris, motif, sparc - antZip& \
+# solaris, gtk, sparc - antZip& \
+# aix, motif, ppc - antZip& \
+# hpux, motif, PA_RISC - antZip& \
+# macosx, carbon, ppc - antZip
+
+#Set to true if you want the output to be ready for an update jar (no site.xml generated)
+outputUpdateJars = true
+
+#Set to true for Jnlp generation
+#codebase should be a URL that will be used as the root of all relative URLs in the output.
+#generateJnlp=false
+#jnlp.codebase=<codebase url>
+#jnlp.j2se=<j2se version>
+#jnlp.locale=<a locale>
+#jnlp.generateOfflineAllowed=true or false generate <offlineAllowed/> attribute in the generated features
+#jnlp.configs=${configs} #uncomment to filter the content of the generated jnlp files based on the configuration being built
+
+#Set to true if you want to sign jars
+#signJars=false
+#sign.alias=<alias>
+#sign.keystore=<keystore location>
+#sign.storepass=<keystore password>
+
+#Arguments to send to the zip executable
+zipargs=
+
+#Arguments to send to the tar executable
+tarargs=
+
+#Control the creation of a file containing the version included in each configuration - on by default
+generateVersionsLists=true
+
+############## BUILD NAMING CONTROL ################
+# The directory into which the build elements are fetched and where
+# the build takes place.
+# buildDirectory=${basedir}/sandbox
+
+# Type of build. Used in naming the build output. Typically this value is
+# one of I, N, M, S, ...
+buildType=M
+
+# ID of the build. Used in naming the build output.
+buildId=${releaseVersion}
+
+# Label for the build. Used in naming the build output
+buildLabel=${buildType}.${buildId}
+
+# Timestamp for the build. Used in naming the build output
+#timestamp=007
+
+#The value to be used for the qualifier of a plugin or feature when you want to override the value computed by pde.
+#The value will only be applied to plugin or features indicating build.properties, qualifier = context
+forceContextQualifier=${DSTAMP}${TSTAMP}
+
+#Enable / disable the generation of a suffix for the features that use .qualifier.
+#The generated suffix is computed according to the content of the feature
+generateFeatureVersionSuffix=false
+
+############# BASE CONTROL #############
+# Settings for the base Eclipse components and Java class libraries
+# against which you are building.
+# Base location for anything the build needs to compile against. For example,
+# in most RCP app or a plug-in, the baseLocation should be the location of a previously
+# installed Eclipse against which the application or plug-in code will be compiled and the RCP delta pack.
+# baseLocation is a java system property set earlier
+
+#Os/Ws/Arch/nl of the eclipse specified by baseLocation
+baseos=win32
+basews=win32
+basearch=x86
+
+#this property indicates whether you want the set of plug-ins and features to be considered during the build to be limited to the ones reachable from the features / plugins being built
+filteredDependencyCheck=true
+
+#this property indicates whether the resolution should be done in development mode (i.e. ignore multiple bundles with singletons)
+resolution.devMode=true
+
+#pluginPath is a list of locations in which to find plugins and features. This list is separated by the platform file separator (; or :)
+#a location is one of:
+#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
+#- a directory that contains a /plugins or /features subdirectory
+#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
+#pluginPath=
+
+skipBase=true
+eclipseURL=<url for eclipse download site>
+eclipseBuildId=<Id of Eclipse build to get>
+eclipseBaseURL=${eclipseURL}/eclipse-platform-${eclipseBuildId}-win32.zip
+
+
+############# MAP FILE CONTROL ################
+# This section defines CVS tags to use when fetching the map files from the repository.
+# If you want to fetch the map file from repository / location, change the getMapFiles target in the customTargets.xml
+
+skipMaps=true
+mapsRepo=:pserver:anonymous@example.com/path/to/repo
+mapsRoot=path/to/maps
+mapsCheckoutTag=HEAD
+
+#tagMaps=true
+mapsTagTag=v${buildId}
+
+
+############ REPOSITORY CONTROL ###############
+# This section defines properties parameterizing the repositories where plugins, fragments
+# bundles and features are being obtained from.
+
+# The tags to use when fetching elements to build.
+# By default thebuilder will use whatever is in the maps.
+# This value takes the form of a comma separated list of repository identifier (like used in the map files) and the
+# overriding value
+# For example fetchTag=CVS=HEAD, SVN=v20050101
+#fetchTag=HEAD
+#skipFetch=true
+
+
+############# JAVA COMPILER OPTIONS ##############
+# The location of the Java jars to compile against. Typically the rt.jar for your JDK/JRE
+#bootclasspath=${java.home}/lib/rt.jar
+
+# specific JRE locations to compile against. These values are used to compile bundles specifying a
+# Bundle-RequiredExecutionEnvironment. Uncomment and set values for environments that you support
+#CDC-1.0/Foundation-1.0= /path/to/rt.jar
+#CDC-1.1/Foundation-1.1=
+#OSGi/Minimum-1.0=
+#OSGi/Minimum-1.1=
+#JRE-1.1=
+#J2SE-1.2=
+#J2SE-1.3=
+#J2SE-1.4=
+#J2SE-1.5=
+#JavaSE-1.6=
+#PersonalJava-1.1=
+#PersonalJava-1.2=
+#CDC-1.0/PersonalBasis-1.0=
+#CDC-1.0/PersonalJava-1.0=
+#CDC-1.1/PersonalBasis-1.1=
+#CDC-1.1/PersonalJava-1.1=
+
+# Specify the output format of the compiler log when eclipse jdt is used
+logExtension=.log
+
+# Whether or not to include debug info in the output jars
+javacDebugInfo=false
+
+# Whether or not to fail the build if there are compiler errors
+javacFailOnError=true
+
+# Enable or disable verbose mode of the compiler
+javacVerbose=false
+
+# Extra arguments for the compiler. These are specific to the java compiler being used.
+#compilerArg=
+
+# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
+javacSource=1.6
+
+# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
+javacTarget=1.6
+
+buildingOSGi=true
+recursiveGeneration=true
+generate.p2.metadata=true
+p2.metadata.repo=file:${buildDirectory}/repository
+p2.artifact.repo=file:${buildDirectory}/repository
+p2.metadata.repo.name=OSEE Update Site
+p2.artifact.repo.name=OSEE Update Site - artifacts
+p2.publish.artifacts=true
+p2.flavor=tooling
+
diff --git a/org.eclipse.osee.support.build/support/config.ini b/org.eclipse.osee.support.build/support/config.ini
new file mode 100644
index 00000000000..479a4497a99
--- /dev/null
+++ b/org.eclipse.osee.support.build/support/config.ini
@@ -0,0 +1,8 @@
+osgi.bundles=org.eclipse.equinox.common@2:start, org.eclipse.update.configurator@3:start, org.eclipse.osee.framework.osgi@4:start
+osgi.noShutdown=true
+osee.log.default=INFO
+eclipse.ignoreApp=true
+equinox.ds.debug=true
+org.osgi.service.http.port=8015
+osgi.compatibility.bootdelegation=true
+osee.check.tag.queue.on.startup=true \ No newline at end of file
diff --git a/org.eclipse.osee.support.build/support/osee.map b/org.eclipse.osee.support.build/support/osee.map
new file mode 100644
index 00000000000..f7a8c34cdda
--- /dev/null
+++ b/org.eclipse.osee.support.build/support/osee.map
@@ -0,0 +1,115 @@
+feature@org.eclipse.osee.framework.server.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.artifact.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.branch.management=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.branch.management.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.client.info.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.resource.locator.attribute=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.resource.management=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.resource.management.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.resource.provider.attribute=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.resource.provider.common=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.search.engine=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.search.engine.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.server.admin=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.server.lookup.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.session.management.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.core.server=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.db.connection=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.jdk.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.logging=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.osgi=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.manager.servlet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.oracle=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.postgresql=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.framework.server.external.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.master.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.framework.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@net.jini=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.core.client=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.core.server=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.database=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.db.connection=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.derby=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.jdbcodbc=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.jdk.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.jini=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.logging=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.messaging=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.messaging.event.skynet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.oracle=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.plugin.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.postgresql=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.skynet.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.svn=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.templates=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.updater=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.framework.ui.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.nebula.widgets.calendarcombo=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/technology,path=org.eclipse.swt.nebula/org.eclipse.nebula.widgets.calendarcombo,tag=HEAD
+plugin@org.eclipse.nebula.widgets.xviewer=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.admin=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.branch.graph=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.data.model.editor=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.encrypter=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.jdk=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.plugin=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.product=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.security=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.service.control=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.skynet=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.swt=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.framework.ui.workspacebundleloader=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.external.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+!plugin@org.eclipse.team.svn.ui=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.subversive,tag=branches/svn1.6
+!plugin@org.eclipse.team.svn=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.subversive,tag=branches/svn1.6
+!plugin@org.eclipse.team.svn.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.subversive,tag=branches/svn1.6
+plugin@derby.driver=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+!plugin@javax.activation=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/javax.activation,tag=HEAD
+!plugin@javax.mail.glassfish=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/javax.mail.glassfish,tag=HEAD
+!plugin@javax.servlet=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/javax.servlet,tag=HEAD
+! *** plugin@org.apache.commons.codec=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.commons.codec/source-bundle,tag=HEAD
+!plugin@org.apache.commons.codec=GET,http://download.eclipse.org/tools/orbit/downloads/drops/R20090529135407/bundles/org.apache.commons.codec_1.3.0.v20080530-1600.jar
+! *** plugin@org.apache.commons.el=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.commons.el/source-bundle,tag=HEAD
+!plugin@org.apache.commons.el=GET,http://download.eclipse.org/tools/orbit/downloads/drops/R20090529135407/bundles/org.apache.commons.el_1.0.0.v200806031608.jar
+! *** plugin@org.apache.commons.httpclient=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.commons.httpclient/source-bundle,tag=HEAD
+!plugin@org.apache.commons.httpclient=p2IU,id=org.apache.commons.httpclient,version=3.1.0.v20080605-1935,repository=http://download.eclipse.org/tools/orbit/downloads/drops/R20090529135407/updateSite
+!plugin@org.apache.commons.lang=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.commons.lang/source-bundle,tag=HEAD
+!plugin@org.apache.commons.logging=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.commons.logging/source-bundle,tag=HEAD
+! *** plugin@org.apache.commons.net=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.commons.net/source-bundle,tag=HEAD
+!plugin@org.apache.commons.net=p2IU,id=org.apache.commons.net,version=2.0.0.v200905272248,repository=http://download.eclipse.org/tools/orbit/downloads/drops/R20090529135407/updateSite
+!plugin@org.apache.oro=CVS,cvsRoot=:pserver;proxy=www-slb-proxy.boeing.com;proxyport=31060:anonymous@dev.eclipse.org:/cvsroot/tools,path=org.eclipse.orbit/org.apache.oro/source-bundle,tag=HEAD
+!plugin@org.mortbay.jetty=p2IU,id=org.mortbay.jetty,version=5.1.14.v200806031611,repository=http://download.eclipse.org/tools/orbit/downloads/drops/R20090529135407/updateSite
+
+feature@org.eclipse.osee.define.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.define=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.ats.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ats=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.demo.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ats.config.demo=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.demo.db.connection=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.support.test.util=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+
+feature@org.eclipse.osee.ote.feature=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.client=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.client.msg=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.connection.jini=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.connection.service=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.core=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.define=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.message=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.messaging.dds=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.runtimeManager=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.ui=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.ui.define=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.ui.host.cmd=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.ui.markers=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.ui.mux=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk
+plugin@org.eclipse.osee.ote.ui.test.manager=SVN,url=https://dev.eclipse.org/svnroot/technology/org.eclipse.osee,tag=trunk \ No newline at end of file
diff --git a/org.eclipse.osee.support.build/support/osee_client_build.xml b/org.eclipse.osee.support.build/support/osee_client_build.xml
new file mode 100644
index 00000000000..5c1e31802f6
--- /dev/null
+++ b/org.eclipse.osee.support.build/support/osee_client_build.xml
@@ -0,0 +1,14 @@
+<project name="Osee Client Build" default="build" basedir=".">
+ <!-- since this ant file is assumed to be located at <workspace>\org.eclipse.osee.buildsupport, basedir will be the same -->
+
+ <import file="${basedir}/osee_common_build.xml" />
+
+ <target name="build">
+ <property name="releaseVersion" value="0.8.1RC" />
+ <property name="master.feature" value="org.eclipse.osee.master.feature" />
+ <property name="filteredDependencyCheck" value="false" />
+ <echo message="http.proxyHost=${http.proxyHost}: http.proxyPort=${http.proxyPort}" />
+ <antcall target="PdeBuild" />
+ </target>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.support.build/support/osee_common_build.xml b/org.eclipse.osee.support.build/support/osee_common_build.xml
new file mode 100644
index 00000000000..519deedd87f
--- /dev/null
+++ b/org.eclipse.osee.support.build/support/osee_common_build.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Osee Common Build Tasks" default="PdeBuild" basedir=".">
+ <!-- this ant file is assumed to be located at <workspace>\org.eclipse.osee.support.build\support, basedir will be the same -->
+
+ <target name="PdeBuild">
+ <tstamp />
+ <property name="builder" value="${basedir}" />
+ <dirname property="baseLocation" file="${eclipse.launcher}" />
+ <dirname property="workspaceLocationSub" file="${basedir}" />
+ <dirname property="workspaceLocation" file="${workspaceLocationSub}" />
+ <property name="buildDirectory" value="${workspaceLocation}/sandbox" />
+
+ <delete dir="${buildDirectory}/features" />
+ <delete dir="${buildDirectory}/repository" />
+
+ <copy todir="${buildDirectory}/maps">
+ <fileset file="${basedir}/osee.map" />
+ </copy>
+ <antcall target="copySupplementalMapFile" />
+
+ <!-- ${equinoxLauncherPluginVersion} -->
+ <ant antfile="${baseLocation}/plugins/org.eclipse.pde.build_3.4.1.R34x_v20081217/scripts/build.xml" target="${pdeTarget}" />
+
+ <antcall target="internalPostBuild" />
+
+ <antcall target="copyToUpdatesite" />
+ </target>
+
+
+ <target name="internalPostBuild" if="postBuildFile">
+ <ant antfile="${postBuildFile}" target="${postBuildTarget}" />
+ </target>
+
+ <target name="copyToUpdatesite" if="update.site">
+ <delete failonerror="false">
+ <fileset dir="${update.site}" includes="**/*" defaultexcludes="false" />
+ </delete>
+
+ <copy todir="${update.site}">
+ <fileset dir="${buildDirectory}/repository" />
+ </copy>
+ </target>
+
+ <target name="copySupplementalMapFile" if="mapFile">
+ <copy todir="${buildDirectory}/maps">
+ <fileset file="${mapFile}" />
+ </copy>
+ </target>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.support.build/support/osee_server_build.xml b/org.eclipse.osee.support.build/support/osee_server_build.xml
new file mode 100644
index 00000000000..05ec25193d8
--- /dev/null
+++ b/org.eclipse.osee.support.build/support/osee_server_build.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Osee Server Build Tasks" default="build" basedir=".">
+ <!-- this ant file is assumed to be located at <workspace>\org.eclipse.osee.support.build\support, basedir will be the same -->
+
+ <import file="${basedir}/osee_common_build.xml" />
+
+ <target name="build">
+ <property name="releaseVersion" value="0.8.1" />
+ <property name="forceContextQualifier" value="200906250923" />
+ <property name="master.feature" value="org.eclipse.osee.framework.server.feature" />
+ <property name="pdeTarget" value="main" />
+ <property name="postBuildFile" value="${ant.file}" />
+ <property name="postBuildTarget" value="postBuild" />
+
+ <antcall target="PdeBuild" />
+ </target>
+
+ <target name="postBuild">
+ <copy todir="${buildDirectory}/repository/configuration/">
+ <fileset file="${basedir}/config.ini" />
+ </copy>
+
+ <move todir="${buildDirectory}/repository">
+ <fileset dir="${buildDirectory}/repository/plugins">
+ <include name="org.eclipse.equinox.launcher_*.jar" />
+ </fileset>
+ </move>
+ </target>
+</project>
+
+<!--
+eclipsec -application org.eclipse.ant.core.antRunner -buildfile c:\UserData\workspace\org.eclipse.osee.support.build\support\osee_server_build.xml
+C:\UserData\workspace\sandbox\repository>java -Xmx512m -Dosee.db.connection.id=oracle8 -jar org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar -console
+--> \ No newline at end of file
diff --git a/org.eclipse.osee.support.config/.project b/org.eclipse.osee.support.config/.project
new file mode 100644
index 00000000000..64c985f98c3
--- /dev/null
+++ b/org.eclipse.osee.support.config/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.support.config</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.support.config/DemoSetup.txt b/org.eclipse.osee.support.config/DemoSetup.txt
new file mode 100644
index 00000000000..d1370fdb293
--- /dev/null
+++ b/org.eclipse.osee.support.config/DemoSetup.txt
@@ -0,0 +1,53 @@
+Todo:
+ fix broken link "Eclipse OSEE download information page." on http://osee.microdoc.com/node/2
+
+ 0.4.0 2008-09-24 13:40
+
+C:\UserData\archives\winscp380.exe
+
+Download Eclipse Classic 3.4.1 from http://www.eclipse.org/downloads/
+install OSEE updatesite
+set proxy info if behind firewall
+http://osee.microdoc.com/downloads/osee/add-ons/0.4/updatesite/
+need specialized ini file
+
+MicroDoc
+ update http://osee.microdoc.com/node/2 with new release date
+ need the all-in-one download link fix
+ image on page banner looks corrupted
+
+Drop all in one to the following path:
+/var/www/downloads/osee/all-in-one/0.4/all-in-one-0.4.0.200809261535.zip
+
+copy download files to /home/data/users/<user>/downloads/technology/osee/
+it may take 15 minutes or so to replicate to the main mirror and longer for others
+
+http://www.eclipse.org/downloads/download.php?file=/technology/osee/0.4/update-site/content.xml
+http://www.eclipse.org/downloads/download.php?file=/technology/osee/0.4/org.eclipse.osee.zip
+http://www.eclipse.org/downloads/download.php?file=/technology/osee/0.4/test.txt
+
+____________________________________________________________________________________
+ <b>NOTE</b>: For Eclipse 3.4/Ganymede, you <b>must</b> use this update site and not the other update sites
+ given below.
+ <p>
+ <ul>
+ <li>In Eclipse 3.4/Ganymede, choose <b>Help -> Software Updates...</b>
+
+ </li>
+ <li>Click on <b>Available Features</b> tab.
+ </li>
+ <li>Click on <b>Manage Sites...</b> button.
+ </li>
+ <li>Drag and drop the following URL from your browser to the list in the Manage Sites window:
+ <p>
+ <b><a href="http://download.eclipse.org/technology/ecf/2.0/3.4/updateSite/site.xml">http://download.eclipse.org/technology/ecf/2.0/3.4/updateSite/site.xml</a></b>
+ <p>
+ </li>
+ <li>As a result of the drag and drop, you should see the above URL appear as an update site in the list.</li>
+ <li>Click <b>OK</b> in the Manage Sites window</li>.
+ <li>You should see the <b>Eclipse Communication Framework (ECF)</b> category in the Available Features window.</li>
+ <li>Open the category and select both the two ECF features.</li>
+ <li>Click Install...</li>
+ <li>Follow through remaining dialogs to complete install.</li>
+ </ul>
+ <p></p> \ No newline at end of file
diff --git a/org.eclipse.osee.support.config/launchConfig/DB Config [localhost, skynet import].launch b/org.eclipse.osee.support.config/launchConfig/DB Config [localhost, skynet import].launch
new file mode 100644
index 00000000000..86c23504537
--- /dev/null
+++ b/org.eclipse.osee.support.config/launchConfig/DB Config [localhost, skynet import].launch
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<stringAttribute key="application" value="org.eclipse.osee.framework.database.configClient"/>
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/DB Config [localhost, skynet import]"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx768M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.application.server=http://localhost:8089&#13;&#10;-Dosee.import.on.db.init=true&#13;&#10;-Dosee.choice.on.db.init=&quot;Base - for importing USG branches&quot;&#13;&#10;-Dosee.authentication.protocol=trustAll"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="lba.ote.server.LbaTestServerProduct"/>
+<booleanAttribute key="restart" value="false"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="false"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.config/launchConfig/DB Config [localhost].launch b/org.eclipse.osee.support.config/launchConfig/DB Config [localhost].launch
new file mode 100644
index 00000000000..d6ec9cf098b
--- /dev/null
+++ b/org.eclipse.osee.support.config/launchConfig/DB Config [localhost].launch
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<stringAttribute key="application" value="org.eclipse.osee.framework.database.configClient"/>
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/DB Config [localhost]"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx768M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.application.server=http://localhost:8089&#13;&#10;-Dosee.authentication.protocol=trustAll"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="lba.ote.server.LbaTestServerProduct"/>
+<booleanAttribute key="restart" value="false"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="false"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.config/launchConfig/OSEE Application Server [derby].launch b/org.eclipse.osee.support.config/launchConfig/OSEE Application Server [derby].launch
new file mode 100644
index 00000000000..c3a9204292d
--- /dev/null
+++ b/org.eclipse.osee.support.config/launchConfig/OSEE Application Server [derby].launch
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bad_container_name" value="\sampleOsgiServletSample\s"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/OSEE Application Server [derby]"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Declipse.ignoreApp=false&#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Dequinox.ds.debug=true&#13;&#10;-Dorg.osgi.service.http.port=8089&#13;&#10;-Dosee.db.connection.id=derby&#13;&#10;-Dosee.derby.server=0.0.0.0:1621"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="org.eclipse.osgi.services@default:default,org.apache.commons.codec@default:default,org.apache.commons.httpclient@default:default,javax.servlet.jsp@default:default,org.eclipse.core.runtime@default:default,org.eclipse.equinox.common@default:default,org.apache.commons.logging@default:default,org.eclipse.equinox.app@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.equinox.registry@default:default,org.eclipse.help@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.osgi@:,org.eclipse.equinox.util@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.swt@default:default,org.mortbay.jetty@default:default,org.junit4@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.jobs@default:default,javax.servlet@default:default,org.junit@default:default,org.eclipse.equinox.ds@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.runtime.compatibility.auth@default:default"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.osee.framework.resource.locator.attribute.test@default:default,org.eclipse.osee.framework.db.connection@default:default,org.eclipse.osee.framework.core@default:default,org.eclipse.osee.framework.osgitest@default:default,org.eclipse.osee.framework.session.management.servlet@default:default,org.eclipse.osee.framework.logging@default:default,org.eclipse.osee.framework.branch.management.servlet@default:default,org.eclipse.osee.framework.search.engine.servlet@default:default,org.eclipse.osee.framework.session.management.servlet.test@default:default,org.postgresql.driver@default:default,org.eclipse.osee.framework.search.engine@default:default,org.eclipse.osee.framework.resource.management.test@default:default,org.eclipse.osee.framework.manager.servlet@default:default,org.eclipse.osee.framework.resource.provider.attribute@default:default,org.eclipse.osee.framework.branch.management@default:default,org.eclipse.osee.framework.jdk.core@default:default,org.eclipse.osee.framework.server.lookup.servlet@default:default,org.eclipse.osee.framework.resource.management.servlet@default:default,org.eclipse.osee.framework.client.info.servlet@default:default,org.eclipse.osee.framework.resource.management.servlet.test@default:default,lba.db.connection@default:default,org.eclipse.osee.framework.resource.management@default:default,org.eclipse.osee.framework.resource.locator.attribute@default:default,org.eclipse.osee.framework.postgresql@default:default,org.eclipse.osee.framework.server.admin@default:default,org.eclipse.osee.demo.db.connection@default:default,org.eclipse.osee.framework.resource.provider.common@default:default,derby.driver@default:default,org.eclipse.osee.framework.core.server@default:default,org.eclipse.osee.framework.derby@4:default,org.eclipse.osee.framework.search.engine.test@default:default,org.eclipse.osee.framework.artifact.servlet@default:default"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.config/launchConfig/OSEE Demo Application Server [localhost].launch b/org.eclipse.osee.support.config/launchConfig/OSEE Demo Application Server [localhost].launch
new file mode 100644
index 00000000000..df91576f83f
--- /dev/null
+++ b/org.eclipse.osee.support.config/launchConfig/OSEE Demo Application Server [localhost].launch
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bad_container_name" value="\sampleOsgiServletSample\s"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/OSEE Demo Application Server [localhost]"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="4"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Declipse.ignoreApp=true&#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Dequinox.ds.debug=true&#13;&#10;-Dorg.osgi.service.http.port=8089&#13;&#10;-Dosee.db.connection.id=postgresqlLocalhost"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="org.eclipse.equinox.app@default:default,org.eclipse.equinox.registry@default:default,javax.servlet@default:default,org.eclipse.equinox.util@default:default,org.eclipse.core.runtime@default:default,org.apache.commons.httpclient@default:default,org.eclipse.equinox.ds@default:default,com.lowagie.itext@default:default,org.eclipse.equinox.common@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.osgi.services@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.osgi@:,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.jobs@default:default,org.apache.commons.codec@default:default,org.eclipse.core.contenttype@default:default,org.mortbay.jetty@default:default,org.apache.commons.logging@default:default,org.eclipse.equinox.http.servlet@default:default"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.eclipse.osee.framework.resource.management@default:default,org.eclipse.osee.framework.branch.management@default:default,org.eclipse.osee.framework.search.engine@default:default,org.eclipse.osee.demo.db.connection@default:default,org.eclipse.osee.framework.resource.locator.attribute@default:default,org.eclipse.osee.framework.resource.management.servlet@default:default,org.eclipse.osee.framework.postgresql@default:default,org.eclipse.osee.framework.server.admin@default:default,org.eclipse.osee.framework.jdk.core@default:default,org.eclipse.osee.framework.server.lookup.servlet@default:default,org.eclipse.osee.framework.search.engine.servlet@default:default,org.eclipse.osee.framework.resource.provider.common@default:default,org.eclipse.osee.framework.logging@default:default,org.eclipse.osee.framework.session.management.servlet@default:default,org.eclipse.osee.framework.client.info.servlet@default:default,org.eclipse.osee.framework.artifact.servlet@default:default,org.eclipse.osee.framework.resource.provider.attribute@default:default,org.eclipse.osee.framework.core.server@default:default,org.eclipse.osee.framework.manager.servlet@default:default,org.eclipse.osee.framework.db.connection@default:default,org.eclipse.osee.framework.core@default:default,org.postgresql.driver@default:default,org.eclipse.osee.framework.branch.management.servlet@default:default"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.config/launchConfig/OSEE Demo product [localhost].launch b/org.eclipse.osee.support.config/launchConfig/OSEE Demo product [localhost].launch
new file mode 100644
index 00000000000..24d04b600a8
--- /dev/null
+++ b/org.eclipse.osee.support.config/launchConfig/OSEE Demo product [localhost].launch
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/OSEE Demo product [localhost]"/>
+<booleanAttribute key="default" value="false"/>
+<stringAttribute key="deselected_workspace_plugins" value="lba.ats.config.v13.processor,lba.ats.config.blk3.mp,lba.ats.config.tools,lba.ats.config.process,lba.ats.config.blk3.pids"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.arbitration.server=http://localhost:8089&#13;&#10;-Dosee.authentication.protocol=demo"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.osee.framework.ui.product.osee"/>
+<stringAttribute key="selected_target_plugins" value="com.ibm.icu,com.ibm.icu.source,com.jcraft.jsch,com.lowagie.itext,javax.servlet,javax.servlet.jsp,javax.servlet.jsp.source,javax.servlet.source,javax.xml,org.apache.ant,org.apache.ant.source,org.apache.commons.codec,org.apache.commons.el,org.apache.commons.el.source,org.apache.commons.httpclient,org.apache.commons.logging,org.apache.commons.logging.source,org.apache.jasper,org.apache.jasper.source,org.apache.lucene,org.apache.lucene.analysis,org.apache.lucene.analysis.source,org.apache.lucene.source,org.eclipse.ant.core,org.eclipse.ant.ui,org.eclipse.birt.chart.engine,org.eclipse.birt.core,org.eclipse.compare,org.eclipse.core.boot,org.eclipse.core.commands,org.eclipse.core.contenttype,org.eclipse.core.databinding,org.eclipse.core.databinding.beans,org.eclipse.core.expressions,org.eclipse.core.filebuffers,org.eclipse.core.filesystem,org.eclipse.core.filesystem.win32.x86,org.eclipse.core.jobs,org.eclipse.core.net,org.eclipse.core.net.win32.x86,org.eclipse.core.resources,org.eclipse.core.resources.compatibility,org.eclipse.core.resources.win32.x86,org.eclipse.core.runtime,org.eclipse.core.runtime.compatibility,org.eclipse.core.runtime.compatibility.auth,org.eclipse.core.runtime.compatibility.registry,org.eclipse.core.variables,org.eclipse.cvs,org.eclipse.cvs.source,org.eclipse.debug.core,org.eclipse.debug.ui,org.eclipse.draw2d,org.eclipse.draw2d.doc.isv,org.eclipse.ecf,org.eclipse.ecf.filetransfer,org.eclipse.ecf.identity,org.eclipse.ecf.ssl,org.eclipse.emf.common,org.eclipse.emf.ecore,org.eclipse.emf.ecore.xmi,org.eclipse.equinox.app,org.eclipse.equinox.common,org.eclipse.equinox.ds,org.eclipse.equinox.frameworkadmin,org.eclipse.equinox.frameworkadmin.equinox,org.eclipse.equinox.http.jetty,org.eclipse.equinox.http.registry,org.eclipse.equinox.http.servlet,org.eclipse.equinox.jsp.jasper,org.eclipse.equinox.jsp.jasper.registry,org.eclipse.equinox.launcher,org.eclipse.equinox.launcher.win32.win32.x86,org.eclipse.equinox.p2.artifact.repository,org.eclipse.equinox.p2.core,org.eclipse.equinox.p2.jarprocessor,org.eclipse.equinox.p2.metadata,org.eclipse.equinox.p2.metadata.generator,org.eclipse.equinox.p2.metadata.repository,org.eclipse.equinox.preferences,org.eclipse.equinox.registry,org.eclipse.equinox.security,org.eclipse.equinox.security.win32.x86,org.eclipse.equinox.util,org.eclipse.gef,org.eclipse.gef.doc.isv,org.eclipse.gef.examples.ui.pde,org.eclipse.gef.source,org.eclipse.help,org.eclipse.help.appserver,org.eclipse.help.base,org.eclipse.help.ui,org.eclipse.help.webapp,org.eclipse.jdt,org.eclipse.jdt.apt.core,org.eclipse.jdt.apt.pluggable.core,org.eclipse.jdt.apt.ui,org.eclipse.jdt.compiler.apt,org.eclipse.jdt.compiler.tool,org.eclipse.jdt.core,org.eclipse.jdt.core.manipulation,org.eclipse.jdt.debug,org.eclipse.jdt.debug.ui,org.eclipse.jdt.doc.isv,org.eclipse.jdt.doc.user,org.eclipse.jdt.junit,org.eclipse.jdt.junit.runtime,org.eclipse.jdt.junit4.runtime,org.eclipse.jdt.launching,org.eclipse.jdt.source,org.eclipse.jdt.ui,org.eclipse.jface,org.eclipse.jface.databinding,org.eclipse.jface.text,org.eclipse.jsch.core,org.eclipse.jsch.ui,org.eclipse.ltk.core.refactoring,org.eclipse.ltk.ui.refactoring,org.eclipse.osgi,org.eclipse.osgi.services,org.eclipse.osgi.util,org.eclipse.pde,org.eclipse.pde.build,org.eclipse.pde.core,org.eclipse.pde.doc.user,org.eclipse.pde.junit.runtime,org.eclipse.pde.runtime,org.eclipse.pde.source,org.eclipse.pde.ui,org.eclipse.pde.ui.templates,org.eclipse.platform,org.eclipse.platform.doc.isv,org.eclipse.platform.doc.user,org.eclipse.platform.source,org.eclipse.rcp,org.eclipse.rcp.source,org.eclipse.sdk,org.eclipse.search,org.eclipse.swt,org.eclipse.swt.win32.win32.x86,org.eclipse.team.core,org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.svn*0.7.7.I20090422-1500,org.eclipse.team.svn*0.7.7.I20090224-1900,org.eclipse.team.svn.core*0.7.7.I20090224-1900,org.eclipse.team.svn.core*0.7.7.I20090422-1500,org.eclipse.team.svn.ui*0.7.7.I20090422-1500,org.eclipse.team.svn.ui*0.7.7.I20090224-1900,org.eclipse.team.ui,org.eclipse.text,org.eclipse.ui,org.eclipse.ui.browser,org.eclipse.ui.cheatsheets,org.eclipse.ui.console,org.eclipse.ui.editors,org.eclipse.ui.externaltools,org.eclipse.ui.forms,org.eclipse.ui.ide,org.eclipse.ui.ide.application,org.eclipse.ui.intro,org.eclipse.ui.intro.universal,org.eclipse.ui.navigator,org.eclipse.ui.navigator.resources,org.eclipse.ui.net,org.eclipse.ui.presentations.r21,org.eclipse.ui.views,org.eclipse.ui.views.log,org.eclipse.ui.views.properties.tabbed,org.eclipse.ui.win32,org.eclipse.ui.workbench,org.eclipse.ui.workbench.compatibility,org.eclipse.ui.workbench.texteditor,org.eclipse.update.configurator,org.eclipse.update.core,org.eclipse.update.core.win32,org.eclipse.update.scheduler,org.eclipse.update.ui,org.eclipse.zest.core,org.eclipse.zest.layouts,org.junit,org.junit.source,org.junit4,org.mortbay.jetty,org.mortbay.jetty.source,org.mozilla.rhino,org.polarion.eclipse.team.svn.connector"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.osee.framework.database,org.eclipse.nebula.widgets.xviewer,org.eclipse.osee.ats.feature.source,org.eclipse.osee.framework.ui.service.control,org.eclipse.osee.framework.ui.encrypter,org.eclipse.osee.ats,org.eclipse.nebula.widgets.calendarcombo,org.eclipse.osee.framework.updater,org.eclipse.osee.ats.test,org.eclipse.osee.framework.ui.skynet.test,org.eclipse.osee.ats.config.demo,org.eclipse.osee.framework.ui.skynet,org.eclipse.osee.framework.skynet.core.test,org.eclipse.osee.framework.svn,org.eclipse.osee.framework.core,org.eclipse.osee.framework.feature.source,org.eclipse.osee.framework.ui.data.model.editor,org.apache.commons.net,org.eclipse.osee.framework.db.connection,org.eclipse.osee.framework.plugin.core,org.eclipse.osee.framework.ui.swt,org.eclipse.osee.framework.postgresql,org.eclipse.osee.framework.ui.admin,org.eclipse.osee.framework.jini,org.eclipse.osee.framework.skynet.core,org.eclipse.osee.framework.ui.skynet.zest,org.eclipse.osee.framework.logging,org.eclipse.osee.framework.core.client,org.eclipse.osee.framework.templates,org.eclipse.osee.support.test.util,org.eclipse.osee.framework.messaging.event.skynet,org.eclipse.osee.framework.ui.jdk,org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.ui.product,net.jini,org.eclipse.osee.define,javax.mail.glassfish,org.postgresql.driver,org.eclipse.osee.framework.ui.security,org.apache.commons.lang,org.eclipse.osee.framework.ui.plugin,org.eclipse.osee.framework.ui.feature.source"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="true"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.config/launchConfig/OSEE Demo product [microdoc].launch b/org.eclipse.osee.support.config/launchConfig/OSEE Demo product [microdoc].launch
new file mode 100644
index 00000000000..ba1c0f305e1
--- /dev/null
+++ b/org.eclipse.osee.support.config/launchConfig/OSEE Demo product [microdoc].launch
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/OSEE Demo product [derby localhost]"/>
+<booleanAttribute key="default" value="false"/>
+<stringAttribute key="deselected_workspace_plugins" value="lba.ats.config.v13.processor,lba.ats.config.blk3.mp,lba.ats.config.tools,lba.ats.config.process,lba.ats.config.blk3.pids"/>
+<booleanAttribute key="includeFragments" value="false"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/runtime-workspace"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dosee.arbitration.server=http://osee.microdoc.com:8089&#13;&#10;-Dosee.authentication.protocol=demo"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.osee.framework.ui.product.osee"/>
+<stringAttribute key="selected_target_plugins" value="org.eclipse.platform.source,org.eclipse.pde.build,org.eclipse.update.core,org.eclipse.pde.doc.user,org.eclipse.jdt.apt.core,org.eclipse.core.filesystem,javax.servlet,org.eclipse.pde.runtime,org.eclipse.core.boot,com.ibm.icu.source,org.polarion.eclipse.team.svn.connector,org.eclipse.ui.workbench.texteditor,org.eclipse.platform.doc.user,org.eclipse.team.cvs.ssh,org.eclipse.help.base,org.eclipse.gef.examples.logic,org.eclipse.jdt.debug.ui,org.eclipse.equinox.common,org.eclipse.ant.core,org.eclipse.compare,org.apache.commons.el.source,org.eclipse.core.runtime.compatibility.registry,org.apache.jasper,org.eclipse.ui.workbench.compatibility,org.eclipse.jdt.apt.pluggable.core,org.eclipse.gef.doc.isv,org.eclipse.core.jobs,org.eclipse.update.scheduler,org.eclipse.cvs.source,org.eclipse.jdt.junit,org.eclipse.platform.doc.isv,org.eclipse.ui,org.eclipse.equinox.http.registry,org.eclipse.equinox.launcher,org.eclipse.equinox.jsp.jasper.registry,org.eclipse.ui.views.properties.tabbed,org.eclipse.ltk.ui.refactoring,org.eclipse.platform,org.eclipse.equinox.http.jetty,org.eclipse.core.runtime.compatibility,org.eclipse.jdt.junit.runtime,org.eclipse.help.webapp,org.eclipse.help.appserver,org.eclipse.ui.ide,org.eclipse.ui.win32,org.eclipse.ui.console,org.eclipse.core.resources.compatibility,org.eclipse.update.ui,org.eclipse.jdt.core.manipulation,org.eclipse.jdt.doc.isv,org.eclipse.core.resources,org.eclipse.draw2d.doc.isv,org.apache.commons.logging,org.eclipse.equinox.preferences,org.eclipse.equinox.http.servlet,org.eclipse.pde.junit.runtime,org.eclipse.rcp.source,org.eclipse.core.runtime.compatibility.auth,org.eclipse.ui.navigator,org.eclipse.pde.ui.templates,org.eclipse.debug.ui,org.eclipse.ui.externaltools,org.apache.commons.logging.source,org.apache.lucene.analysis,org.eclipse.pde.ui,org.eclipse.ui.workbench,org.eclipse.ui.intro.universal,org.eclipse.swt.win32.win32.x86,org.eclipse.ui.net,org.eclipse.ui.intro,org.eclipse.core.filesystem.win32.x86,org.eclipse.osgi.util,org.eclipse.core.expressions,org.eclipse.gef.examples.ui.pde,org.eclipse.draw2d,org.eclipse.jdt.apt.ui,org.eclipse.ui.navigator.resources,org.apache.jasper.source,org.eclipse.pde,org.eclipse.equinox.registry,org.eclipse.ui.cheatsheets,org.eclipse.team.cvs.core,javax.servlet.source,org.eclipse.jdt.source,org.mortbay.jetty.source,org.eclipse.update.core.win32,org.eclipse.ui.ide.application,org.eclipse.team.cvs.ssh2,org.eclipse.core.filebuffers,org.apache.lucene.analysis.source,org.junit.source,org.eclipse.gef,org.eclipse.cvs,org.eclipse.team.svn.ui.nl1,org.eclipse.jdt.compiler.tool,org.eclipse.ltk.core.refactoring,org.eclipse.core.contenttype,org.eclipse.jface.databinding,org.eclipse.jface.text,org.eclipse.pde.core,com.jcraft.jsch,org.eclipse.team.cvs.ui,org.eclipse.jdt.debug,org.eclipse.core.net,org.eclipse.core.databinding,org.mortbay.jetty,org.eclipse.team.svn.ui,org.eclipse.osgi,org.eclipse.ant.ui,org.eclipse.help.ui,org.eclipse.jsch.ui,org.eclipse.rcp,org.apache.commons.el,org.eclipse.search,org.eclipse.jsch.core,org.eclipse.core.variables,org.eclipse.equinox.jsp.jasper,org.eclipse.sdk,org.eclipse.gef.examples.text,org.eclipse.ui.forms,org.eclipse.text,org.eclipse.help,org.eclipse.ui.editors,org.eclipse.team.svn,org.eclipse.jface,org.eclipse.ui.views,org.eclipse.gef.examples.source,org.eclipse.equinox.app,org.eclipse.jdt.ui,org.eclipse.jdt.junit4.runtime,org.eclipse.ui.presentations.r21,org.eclipse.core.runtime,org.junit4,org.eclipse.jdt.core,com.ibm.icu,org.eclipse.osgi.services,org.apache.lucene,org.eclipse.jdt,javax.servlet.jsp.source,org.eclipse.jdt.compiler.apt,org.eclipse.jdt.launching,org.junit,org.apache.lucene.source,org.eclipse.update.configurator,org.eclipse.team.ui,org.eclipse.team.svn.core.nl1,org.apache.ant,org.eclipse.core.databinding.beans,org.eclipse.debug.core,org.eclipse.equinox.launcher.win32.win32.x86,org.eclipse.pde.source,javax.servlet.jsp,org.apache.ant.source,org.eclipse.team.core,org.eclipse.gef.source,org.eclipse.swt,org.eclipse.team.svn.core,org.eclipse.ui.browser,org.eclipse.gef.examples.shapes,org.eclipse.jdt.doc.user,org.eclipse.core.commands,org.eclipse.gef.examples.flow"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.osee.framework.database,org.eclipse.osee.ats.feature.source,org.eclipse.osee.framework.ui.service.control,org.eclipse.osee.framework.ui.encrypter,org.eclipse.osee.ote.messaging.dds,org.eclipse.osee.ats,org.eclipse.nebula.widgets.calendarcombo,lba.feature.source,org.eclipse.osee.framework.updater,org.eclipse.osee.ote.ui.host.cmd,org.eclipse.zest.core,org.eclipse.osee.ote.message,lba.ote.shared.memory,com.lowagie,org.eclipse.osee.ats.config.demo,org.eclipse.osee.framework.ui.skynet,org.eclipse.osee.framework.svn,org.eclipse.osee.framework.feature.source,lba.ote.test.manager,org.eclipse.osee.framework.plugin.core,org.eclipse.osee.framework.ui.swt,org.eclipse.osee.framework.ui.admin,org.eclipse.osee.ote.core,org.eclipse.osee.ote.define,lba.ote.server,lba.ote.crewinput,org.eclipse.osee.framework.jini,org.eclipse.osee.ote.ui.define,org.eclipse.osee.framework.skynet.core,org.eclipse.osee.ote.feature.source,org.eclipse.osee.framework.ui.skynet.zest,org.eclipse.zest.layouts,org.eclipse.osee.ote.ui.message,lba.define,org.eclipse.osee.framework.templates,org.eclipse.osee.framework.messaging.event.skynet,lba.ote.core,org.eclipse.osee.framework.ui.jdk,org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.ui.product,org.eclipse.osee.ote.ui.test.manager,net.jini,org.eclipse.osee.define,org.eclipse.osee.ote.ui.test.output,org.eclipse.osee.ote.ui,lba.framework.ui.skynet,org.eclipse.osee.framework.ui.security,org.eclipse.osee.ote.ui.mux,org.apache.commons.lang,org.eclipse.osee.framework.ui.plugin,org.eclipse.osee.framework.ui.feature.source"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value=""/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="true"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.config/osee_team_3.4.epf b/org.eclipse.osee.support.config/osee_team_3.4.epf
new file mode 100644
index 00000000000..eb7f4349fe1
--- /dev/null
+++ b/org.eclipse.osee.support.config/osee_team_3.4.epf
@@ -0,0 +1,915 @@
+#Wed Jul 30 08:20:33 MST 2008
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_parentheses_in_expressions=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/provider=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/description=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/suffix=eclipse
+/instance/org.eclipse.team.ui/org.eclipse.team.ui.first_time=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/provider=
+/instance/org.eclipse.ant.ui/useQuickDiffPrefPage=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/suffix=artifacts.xml
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/enabled=false
+/instance/org.eclipse.ui.workbench/resourcetypes=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<editors version\="3.1">\r\n<info extension\="shapes" name\="*">\r\n<editor id\="GEF Shapes Editor"/>\r\n<defaultEditor id\="GEF Shapes Editor"/>\r\n</info>\r\n<info extension\="cspex" name\="*">\r\n<editor id\="org.eclipse.buckminster.ui.editors.CSPEXEditor"/>\r\n<defaultEditor id\="org.eclipse.buckminster.ui.editors.CSPEXEditor"/>\r\n</info>\r\n<info extension\="text" name\="*">\r\n<editor id\="org.eclipse.gef.TextEditor"/>\r\n<defaultEditor id\="org.eclipse.gef.TextEditor"/>\r\n</info>\r\n<info extension\="rmap" name\="*">\r\n<editor id\="org.eclipse.buckminster.ui.editors.RMAPEditor"/>\r\n<defaultEditor id\="org.eclipse.buckminster.ui.editors.RMAPEditor"/>\r\n</info>\r\n<info extension\="properties" name\="sample">\r\n<editor id\="org.eclipse.pde.ui.sampleEditor"/>\r\n<defaultEditor id\="org.eclipse.pde.ui.sampleEditor"/>\r\n</info>\r\n<info extension\="flow" name\="*">\r\n<editor id\="GEF Flow Editor"/>\r\n<defaultEditor id\="GEF Flow Editor"/>\r\n</info>\r\n<info extension\="jpage" name\="*">\r\n<editor id\="org.eclipse.jdt.debug.ui.SnippetEditor"/>\r\n</info>\r\n<info extension\="shtml" name\="*">\r\n<editor id\="org.eclipse.ui.browser.editorSupport"/>\r\n</info>\r\n<info extension\="logic" name\="*">\r\n<editor id\="Logic Graphical Editor"/>\r\n<defaultEditor id\="Logic Graphical Editor"/>\r\n</info>\r\n<info extension\="cquery" name\="*">\r\n<editor id\="org.eclipse.buckminster.ui.editor.QueryEditor"/>\r\n<defaultEditor id\="org.eclipse.buckminster.ui.editor.QueryEditor"/>\r\n</info>\r\n<info extension\="cspec" name\="*">\r\n<editor id\="org.eclipse.buckminster.ui.editors.CSPECEditor"/>\r\n<defaultEditor id\="org.eclipse.buckminster.ui.editors.CSPECEditor"/>\r\n</info>\r\n<info extension\="htm" name\="*">\r\n<editor id\="org.eclipse.ui.browser.editorSupport"/>\r\n</info>\r\n<info extension\="html" name\="*">\r\n<editor id\="org.eclipse.ui.browser.editorSupport"/>\r\n</info>\r\n<info extension\="jardesc" name\="*">\r\n<editor id\="org.eclipse.jdt.ui.JARDescEditor"/>\r\n<defaultEditor id\="org.eclipse.jdt.ui.JARDescEditor"/>\r\n</info>\r\n</editors>
+/instance/org.eclipse.wst.sse.ui/useQuickDiffPrefPage=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/version=1.0.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/name=Eclipse Project Update Site
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_extras/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/suffix=content.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_uml2_updates_/isSystem=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_private_constructors=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/url=file\:/C\:/Program Files/OSEE_3.4/configuration/org.eclipse.osgi/bundles/69/data/listener_1925729951/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_emft_updates_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.continuation_indentation=2
+/instance/org.eclipse.jdt.ui/_patternFilterId_*.ajsym=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/url=http\://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/isSystem=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/isSystem=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/name=C\:\\Program Files\\OSEE_3.4\\.eclipseextension
+/instance/org.eclipse.team.ui/org.eclipse.team.ui.sychronizing_default_participant=org.polarion.team.svn.ui.synchronize.update.SynchronizeParticipant
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/name=download cache
+/instance/org.eclipse.mylyn.context.core/mylyn.attention.migrated=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/description=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_emf_updates_/isSystem=false
+/instance/org.eclipse.jdt.ui/useAnnotationsPrefPage=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.eclipse.org_modeling_emft_?project\=search\#search/enabled=false
+/instance/org.eclipse.jdt.ui/formatter_profile=_OSEE Java Standard
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/description=
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_override_annotations=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+/instance/org.eclipse.debug.ui/preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane|
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/version=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+@org.eclipse.ui.navigator=3.3.100.I20080606-1300
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/version=1
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+@org.eclipse.jdt.core=3.4.0.v_874
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_epp_updates_1.0_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_gmf_update-site_releases_site.xml/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+/instance/org.eclipse.jdt.ui/sp_cleanup.sort_members=false
+/instance/org.polarion.team.svn.ui/preference.annotate.changePerspective=0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/isSystem=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_update-site_releases_site.xml/url=http\://download.eclipse.org/tools/gef/update-site/releases/site.xml
+/instance/org.eclipse.team.svn.ui/org.eclipse.team.svn.ui.panel.callback.PromptCredentialsPanel.height=231
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.ExpressionView+org.eclipse.debug.ui.ShowTypesAction=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_cdt_releases_ganymede/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_europa/isSystem=false
+/instance/org.eclipse.pde.runtime/orderType=2
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/description=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/description=
+/instance/org.eclipse.jdt.debug.ui/org.eclipse.jdt.debug.ui.javaDebug.alertHCRFailed=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/name=artifact listener file\:/C\:/Program Files/OSEE_3.4/.eclipseextension
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/version=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.classpathVariable.JRE_SRC=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates/url=http\://update.eclipse.org/updates
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/configuration/org.eclipse.osgi/bundles/63/data/listener_1149808244/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__eclipse.org_tptp_updates_/enabled=false
+/instance/org.eclipse.core.resources/description.snapshotinterval=120000
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.eclipse.org_modeling_emft_?project\=search\#search/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_gmf_update-site_releases_site.xml/url=http\://download.eclipse.org/modeling/gmf/update-site/releases/site.xml
+/instance/org.eclipse.jsch.core/org.eclipse.jsch.core.hasMigratedSsh2Preferences=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0
+/instance/org.eclipse.ui.views.log/show_filter_text=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/type=org.eclipse.equinox.p2.updatesite.metadataRepository
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_dltk_updates_/enabled=false
+/instance/org.eclipse.team.svn.ui/history.repositoryUser=cmJyb29rcw\=\=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_emft_updates_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.editor.tab.width=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/type=org.eclipse.equinox.p2.updatesite.metadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/name=C\:\\Program Files\\Eclipse 3.4\\eclipse\\.eclipseextension
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_variable_declarations_final=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+/instance/org.eclipse.core.resources/version=1
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/url=http\://download.eclipse.org/tools/buckminster/updates
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/name=Bundle pool
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/description=
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.javadoclocations.migrated=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_birt_update-site_2.3/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_imports=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/description=
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_type_abstract_if_missing_method=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/name=Ganymede
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/description=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_stp_updates/url=http\://download.eclipse.org/stp/updates
+/instance/org.polarion.team.svn.ui/preference.annotate.useQuickDiff=0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_e3.4/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/isSystem=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+/instance/org.eclipse.jdt.ui/fontPropagated=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/name=artifact listener dropins
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/name=Buckminster Artifacts
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/isSystem=true
+/instance/org.eclipse.ui.workbench/ENABLED_DECORATORS=org.eclipse.jdt.ui.override.decorator\:true,org.eclipse.jdt.ui.interface.decorator\:false,org.eclipse.mylyn.context.ui.decorator.interest\:true,org.eclipse.mylyn.tasks.ui.decorators.task\:true,org.eclipse.mylyn.team.ui.changeset.decorator\:true,org.eclipse.pde.ui.binaryProjectDecorator\:false,org.eclipse.team.cvs.ui.decorator\:true,org.eclipse.team.svn.ui.decorator.wrapper.ProjectDecoratorWrapper\:true,org.eclipse.team.svn.ui.decorator.wrapper.ResourceDecoratorWrapper\:true,org.eclipse.team.svn.ui.decorator.wrapper.WorkingSetDecoratorWrapper\:true,org.eclipse.ui.LinkedResourceDecorator\:true,org.eclipse.ui.ContentTypeDecorator\:true,
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_rap_update-site/enabled=false
+/instance/org.eclipse.ui.workbench/RUN_IN_BACKGROUND=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_epp_updates_1.0_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+@org.eclipse.ui=3.4.0.I20080610-1200
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.eclipse.org_modeling_emft_?project\=search\#search/url=http\://www.eclipse.org/modeling/emft/?project\=search\#search
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/description=
+/configuration/org.eclipse.core.net/nonProxiedHosts=127.0.0.1|localhost
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_private_fields_final=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/description=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.director_rollback/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/p2/org.eclipse.equinox.p2.director/rollback
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_stp_updates/enabled=false
+/instance/org.eclipse.jdt.ui/proposalOrderMigrated=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/configuration/org.eclipse.osgi/bundles/69/data/listener_1925729951/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_m2t_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/url=http\://download.eclipse.org/tools/gef/updates/releases/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/name=The Eclipse Project Updates
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_birt_update-site_2.3/url=http\://download.eclipse.org/birt/update-site/2.3
+/configuration/org.eclipse.core.net/proxyData/HTTP/host=www-slb-proxy.boeing.com
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/isSystem=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_this_for_non_static_field_access=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/enabled=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_dsdp_dd_updates/url=http\://download.eclipse.org/dsdp/dd/updates
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_dltk_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/provider=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+/instance/org.eclipse.debug.ui/Console.lowWaterMark=800000
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces_all=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates_3.3/enabled=false
+/instance/org.eclipse.team.cvs.core/repositories/%extssh%rbrooks@dev.eclipse.org%%cvsroot%org.eclipse/location=\:extssh\:rbrooks@dev.eclipse.org\:/cvsroot/org.eclipse
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates_3.0/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates_3.0/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_uml2_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/type=org.eclipse.equinox.p2.extensionlocation.artifactRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.tabulation.size=3
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+/instance/org.eclipse.jdt.ui/useQuickDiffPrefPage=true
+/instance/org.eclipse.pde.runtime/column4=150
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_m2m_updates_/isSystem=false
+/instance/org.eclipse.pde.runtime/column3=150
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/provider=
+/instance/org.eclipse.pde.runtime/column2=607
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.director_rollback/enabled=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_cdt_releases_ganymede/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_tools_ve_updates_1.0/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/suffix=artifacts.xml
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_emf_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_emft_updates_/isSystem=false
+/configuration/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.exception.name=ex
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_mdt_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_epp_updates_1.0_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+/instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/name=metadata listener dropins
+@org.eclipse.team.cvs.core=3.3.100.I20080605
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/type=org.eclipse.equinox.p2.updatesite.artifactRepository
+/instance/org.eclipse.jdt.ui/sp_cleanup.never_use_blocks=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/isSystem=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_serial_version_id=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/isSystem=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/description=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_e3.4/url=http\://download.eclipse.org/tools/mylyn/update/e3.4
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/version=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+/instance/org.eclipse.jst.jsp.core/org.eclipse.jst.jsp.core.taglib.TaglibIndex=CLEAN
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_mdt_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_birt_update-site_2.3/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_tools_ve_updates_1.0/url=http\://update.eclipse.org/tools/ve/updates/1.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/name=artifact listener file\:/C\:/Program Files/Eclipse 3.4/eclipse/.eclipseextension
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indentation.size=3
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+\!/=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/name=download cache
+/instance/org.polarion.team.svn.ui/preference.repository.repositoryBrowser=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_dltk_updates_/url=http\://download.eclipse.org/technology/dltk/updates/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.director_rollback/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+/instance/org.eclipse.jdt.debug.ui/org.eclipse.debug.ui.ExpressionView.org.eclipse.jdt.debug.ui.show_constants=true
+@org.eclipse.jsch.core=1.1.100.I20080604
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.director_rollback/version=1.0.0
+/instance/org.eclipse.jdt.ui/content_assist_proposals_foreground=0,0,0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/.eclipseextension
+@org.eclipse.ui.editors=3.4.0.v20080603-2000
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/url=http\://download.eclipse.org/eclipse/updates/3.4
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+/instance/org.eclipse.jst.j2ee.webservice.ui/areThereWebServices=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_rap_update-site/url=http\://download.eclipse.org/technology/rap/update-site
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_nls_tags=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/url=file\:/C\:/Program Files/OSEE_3.4/.eclipseextension
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_cdt_releases_ganymede/url=http\://download.eclipse.org/tools/cdt/releases/ganymede
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/enabled=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/suffix=site.xml
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+/instance/org.eclipse.ui.ide/platformState=1216082515670
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/name=http\://download.eclipse.org/technology/subversive/0.7/update-site/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_cdt_releases_ganymede/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/type=org.eclipse.equinox.p2.updatesite.metadataRepository
+@org.eclipse.team.cvs.ui=3.3.100.I20080604
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_method_access=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_this_for_non_static_method_access=false
+/instance/org.eclipse.ant.ui/useAnnotationsPrefPage=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_europa/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/version=1.0.0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/type=org.eclipse.equinox.p2.updatesite.metadataRepository
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/name=GEF Update Site
+/instance/org.eclipse.ui.editors/lineNumberRuler=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/suffix=content.xml
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_emft_updates_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/url=file\:/C\:/Program Files/OSEE_3.4/configuration/org.eclipse.osgi/bundles/69/data/listener_1925729951/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_dltk_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/provider=
+/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code_changes_only=false
+/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES_PROTOCOL=3
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+/instance/org.polarion.team.svn.ui/history.proxyHost=MTI3LjAuMC4x;d3d3LXNsYi1wcm94eS5ib2VpbmcuY29t;Ymx2LXJlYWwtcHJveHkuYm9laW5nLmNvbQ\=\=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.eclipse.org_modeling_emft_?project\=search\#search/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_emf_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.classpathVariable.JRE_SRCROOT=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+/instance/org.eclipse.team.svn.ui/history.repositoryURL=aHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvc3Zucm9vdC90ZWNobm9sb2d5L29yZy5lY2xpcHNlLm9zZWU\=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_emf_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+/instance/org.eclipse.debug.ui/Console.highWaterMark=808000
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/provider=
+/instance/org.polarion.team.svn.ui/history.repositoryUser=cmJyb29rcw\=\=;cnlhbi5kLmJyb29rcw\=\=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_uml2_updates_/enabled=false
+@org.eclipse.help.ui=3.3.100.v20080521
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_e3.4/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/url=file\:/C\:/Program Files/OSEE_3.4/configuration/org.eclipse.osgi/bundles/63/data/listener_450946960/
+/configuration/org.eclipse.core.net/proxyData/HTTPS/hasAuth=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_webtools_updates/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/version=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.eclipse.org_modeling_emft_?project\=search\#search/url=http\://www.eclipse.org/modeling/emft/?project\=search\#search
+/instance/org.eclipse.core.net/proxiesEnabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/p2/org.eclipse.equinox.p2.core/cache/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_emft_updates_/url=http\://download.eclipse.org/technology/emft/updates/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_gmf_update-site_releases_site.xml/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/type=org.eclipse.equinox.p2.extensionlocation.metadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/description=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/name=metadata listener file\:/C\:/Program Files/Eclipse 3.4/eclipse/.eclipseextension
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_extras/url=http\://download.eclipse.org/tools/mylyn/update/extras
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<launchPerspectives/>\r\n
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/suffix=content.xml
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_local_variables=false
+@org.eclipse.team.core=3.4.0.I20080605
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/.eclipseextension
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/isSystem=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_members=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_uml2_updates_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/name=artifact listener dropins
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.gettersetter.use.is=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
+/instance/org.eclipse.debug.ui/DEBUG.consoleOpenOnOut=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_dsdp_tm_updates_3.0/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/isSystem=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates_3.0/url=http\://update.eclipse.org/updates/3.0
+/instance/org.eclipse.jdt.ui/spelling_locale_initialized=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/url=http\://download.eclipse.org/tools/gef/updates/releases/
+/instance/org.eclipse.jdt.ui/sp_cleanup.convert_to_enhanced_for_loop=false
+/instance/org.eclipse.jdt.launching/org.eclipse.jdt.launching.PREF_VM_XML=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<vmSettings defaultVM\="57,org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType13,1213726052145" defaultVMConnector\="">\r\n<vmType id\="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType">\r\n<vm id\="1208192918430" javadocURL\="http\://java.sun.com/javase/6/docs/api/" name\="OSEE_RC" path\="C\:\\Program Files\\OSEE_RC"/>\r\n<vm id\="1213726052145" javadocURL\="http\://java.sun.com/javase/6/docs/api/" name\="eclipse" path\="C\:\\UserData\\eclipse"/>\r\n</vmType>\r\n</vmSettings>\r\n
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_update-site_releases_site.xml/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_gmf_update-site_releases_site.xml/url=http\://download.eclipse.org/modeling/gmf/update-site/releases/site.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/enabled=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_dltk_updates_/isSystem=false
+/configuration/org.eclipse.ui.ide/SHOW_WORKSPACE_SELECTION_DIALOG=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.ExpressionView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684"/>
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_emf_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/name=metadata listener dropins
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_tools_ve_updates_1.0/url=http\://update.eclipse.org/tools/ve/updates/1.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+/instance/osee.skynet/LastDefaultBranch=99
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_deprecated_annotations=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/url=file\:/C\:/Program Files/OSEE_3.4/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+/instance/org.eclipse.wst.sse.ui/useAnnotationsPrefPage=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_rap_update-site/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/isSystem=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/enabled=true
+/instance/org.eclipse.ui.views.log/orderType=2
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_update-site_releases_site.xml/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/type=org.eclipse.equinox.p2.extensionlocation.artifactRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/suffix=content.xml
+/instance/org.eclipse.ui.ide/EXIT_PROMPT_ON_CLOSE_LAST_WINDOW=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/name=Bundle pool
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_datatools_updates/url=http\://download.eclipse.org/datatools/updates
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/version=1.0.0
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_methods=true
+/instance/org.eclipse.team.cvs.ui/pref_first_startup=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_m2t_updates_/url=http\://download.eclipse.org/modeling/m2t/updates/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/version=1
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_field_access=false
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="java" deleted\="false" description\="adviceexecution pointcut (AspectJ)" enabled\="true" name\="adviceexecution">adviceexecution()</template><template autoinsert\="true" context\="java" deleted\="false" description\="after returning advice (AspectJ)" enabled\="true" name\="after_returning">after(${args}) returning() \: ${pointcut_expression} {}</template><template autoinsert\="true" context\="java" deleted\="false" description\="after throwing advice (AspectJ)" enabled\="true" name\="after_throwing">after(${args}) throwing() \: ${pointcut_expression} {}</template><template autoinsert\="true" context\="java" deleted\="false" description\="around advice (AspectJ)" enabled\="true" name\="around">around(${args}) \: ${pointcut_expression} {}</template><template autoinsert\="true" context\="java" deleted\="false" description\="before advice (AspectJ)" enabled\="true" name\="before">before(${args}) \: ${pointcut_expression} {}</template><template autoinsert\="true" context\="java" deleted\="false" description\="call constructor pointcut (AspectJ)" enabled\="true" name\="call_cons">call(${modifier_pattern} ${type_pattern}.new(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="call method declaration (AspectJ)" enabled\="true" name\="call_method">call(${modifiers_pattern} ${ret_type_pattern} ${type_pattern}.${id_pattern}(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="cflow pointcut (AspectJ)" enabled\="true" name\="cflow">cflow(${pointcut_expression})</template><template autoinsert\="true" context\="java" deleted\="false" description\="cflowbelow pointcut (AspectJ)" enabled\="true" name\="cflowbelow">cflowbelow(${pointcut_expression})</template><template autoinsert\="true" context\="java" deleted\="false" description\="declare error (AspectJ)" enabled\="true" name\="dece">declare error \: ${pointcut_expression} \: "";</template><template autoinsert\="true" context\="java" deleted\="false" description\="declare parents (AspectJ)" enabled\="true" name\="decp_extends">declare parents \: ${type_pattern} extends ${type};</template><template autoinsert\="true" context\="java" deleted\="false" description\="declare parents (AspectJ)" enabled\="true" name\="decp_implements">declare parents \: ${type_pattern} implements ${type};</template><template autoinsert\="true" context\="java" deleted\="false" description\="declare soft (AspectJ)" enabled\="true" name\="decs">declare soft \: ${exception_type} \: ${pointcut_expression};</template><template autoinsert\="true" context\="java" deleted\="false" description\="declare warning (AspectJ)" enabled\="true" name\="decw">declare warning \: ${pointcut_expression} \: "";</template><template autoinsert\="true" context\="java" deleted\="false" description\="execution of a constructor pointcut (AspectJ)" enabled\="true" name\="execution_cons">execution(${modifier_pattern} ${type_pattern}.new(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="execution of a method pointcut (AspectJ)" enabled\="true" name\="execution_method">execution(${modifier_pattern} ${ret_type_pattern} ${type_pattern}.${id_pattern}(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="get pointcut (AspectJ)" enabled\="true" name\="get">get(${modifier_pattern} ${ret_type_pattern} ${type_pattern}.${id_pattern})</template><template autoinsert\="true" context\="java" deleted\="false" description\="handler pointcut (AspectJ)" enabled\="true" name\="handler">handler(${type_pattern})</template><template autoinsert\="true" context\="java" deleted\="false" description\="initialization pointcut (AspectJ)" enabled\="true" name\="initialization">initialization(${modifier_pattern} ${type_pattern}.new(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="pointcut declaration (AspectJ)" enabled\="true" name\="pc">pointcut ${name}() \: ${pointcut_expression};</template><template autoinsert\="true" context\="java" deleted\="false" description\="percflow (AspectJ)" enabled\="true" name\="percflow">percflow(${pointcut_expression})</template><template autoinsert\="true" context\="java" deleted\="false" description\="percflowbelow (AspectJ)" enabled\="true" name\="percflowbelow">percflowbelow(${pointcut_expression})</template><template autoinsert\="true" context\="java" deleted\="false" description\="pertarget (AspectJ)" enabled\="true" name\="pertarget">pertarget(${pointcut_expression})</template><template autoinsert\="true" context\="java" deleted\="false" description\="perthis (AspectJ)" enabled\="true" name\="perthis">perthis(${pointcut_expression})</template><template autoinsert\="true" context\="java" deleted\="false" description\="pertypewithin (AspectJ)" enabled\="true" name\="pertypewithin">pertypewithin(${type_pattern})</template><template autoinsert\="true" context\="java" deleted\="false" description\="preinitialization pointcut (AspectJ)" enabled\="true" name\="preinitialization">preinitialization(${modifier_pattern} ${type_pattern}.new(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="set pointcut (AspectJ)" enabled\="true" name\="set">set(${modifier_pattern} ${ret_type_pattern} ${type_pattern}.${id_pattern})</template><template autoinsert\="true" context\="java" deleted\="false" description\="staticinitialization pointcut (AspectJ)" enabled\="true" name\="staticinitialization">staticinitialization(${type_pattern})</template><template autoinsert\="true" context\="java" deleted\="false" description\="thisJoinPoint (AspectJ)" enabled\="true" name\="thisJoinPoint">thisJoinPoint</template><template autoinsert\="true" context\="java" deleted\="false" description\="thisJoinPointStaticPart (AspectJ)" enabled\="true" name\="thisJoinPointStaticPart">thisJoinPointStaticPart</template><template autoinsert\="true" context\="java" deleted\="false" description\="within pointcut (AspectJ)" enabled\="true" name\="within">within(${type_pattern})</template><template autoinsert\="true" context\="java" deleted\="false" description\="withincode of a constructor pointcut (AspectJ)" enabled\="true" name\="withincode_cons">withincode(${modifier_pattern} ${type_pattern}.new(..))</template><template autoinsert\="true" context\="java" deleted\="false" description\="withincode of a method pointcut (AspectJ)" enabled\="true" name\="withincode_method">withincode(${modifier_pattern} ${ret_type_pattern} ${type_pattern}.${id_pattern}(..))</template></templates>
+/instance/org.eclipse.jdt.ui/formatter_settings_version=11
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates_3.3/url=http\://update.eclipse.org/updates/3.3
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+/instance/org.eclipse.jdt.ui/sp_cleanup.never_use_parentheses_in_expressions=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/isSystem=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+@org.eclipse.pde.core=3.4.0.v20080604-2000
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/version=1.0.0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates/enabled=true
+/instance/org.eclipse.osee.framework.ui.skynet.branch.BranchView/flat=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_gmf_update-site_releases_site.xml/enabled=false
+/instance/org.eclipse.ui.browser/browsers=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<web-browsers current\="0">\r\n<system/>\r\n<external location\="C\:\\Program Files\\Mozilla Firefox\\firefox.exe" name\="Firefox"/>\r\n<external location\="C\:\\Program Files\\Internet Explorer\\iexplore.exe" name\="Internet Explorer"/>\r\n</web-browsers>
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_uml2_updates_/url=http\://download.eclipse.org/tools/uml2/updates/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
+/instance/org.eclipse.jdt.ui/tabWidthPropagated=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.ajdt.ui/ajde.version.at.previous.startup=@AJDEVERSION@
+/instance/org.eclipse.ui.ide/PROBLEMS_FILTERS=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<filters>\r\n<filter IMemento.internal.id\="Default" contains\="true" description\="" enabled\="true" onResource\="3" selectBySeverity\="false" selectionStatus\="org.eclipse.core.resources.problemmarker\:true\:org.eclipse.osee.ote.ui.output.errorMarker\:true\:org.eclipse.jdt.core.buildpath_problem\:true\:org.eclipse.jdt.apt.core.configproblem\:true\:org.eclipse.wst.common.project.facet.core.validation.marker\:true\:org.eclipse.jst.common.frameworks.javaVersionMismatch\:true\:org.eclipse.jst.j2ee.differentRuntimesDetected\:true\:org.eclipse.osee.ote.ui.test.output.errorMarker\:true\:org.eclipse.jdt.apt.core.buildproblem\:true\:org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdoclet.marker\:true\:org.eclipse.wst.validation.problemmarker\:true\:org.eclipse.jst.j2ee.ejb.EJBValidatorMarker\:true\:org.eclipse.wst.common.modulecore.ModuleCoreValidatorMarker\:true\:org.eclipse.jpt.core.jpaProblemMarker\:true\:org.eclipse.jst.jsf.core.JSPSemanticsValidatorMarker\:true\:org.eclipse.wst.wsdl.validation.validationMarker\:true\:org.eclipse.jst.j2ee.ClasspathDependencyValidatorMarker\:true\:org.eclipse.jst.j2ee.EARValidatorMarker\:true\:org.eclipse.jdt.core.problem\:true\:org.eclipse.osee.ote.ui.test.output.manualTestPointMarker\:true\:org.eclipse.xsd.diagnostic\:true\:org.eclipse.datatools.sqltools.sqleditor.syntaxproblem\:true\:org.eclipse.pde.core.problem\:true\:org.eclipse.ant.ui.buildFileProblem\:true\:org.eclipse.emf.ecore.diagnostic\:true\:org.eclipse.osee.ote.ui.test.output.tracabilityMarker\:true\:org.eclipse.jdt.launching.jreContainerMarker\:true\:org.eclipse.jdt.apt.core.compile.problem\:true\:org.eclipse.ajdt.ui.problemmarker\:true\:org.eclipse.datatools.connectivity.ui.profileFailure\:true\:" severity\="0"/>\r\n</filters>
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<profiles version\="11">\r\n<profile kind\="CodeFormatterProfile" name\="OSEE Java Standard" version\="11">\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_field" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_after_package" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.continuation_indentation" value\="2"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_package" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.source" value\="1.5"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_line_comments" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.lineSplit" value\="120"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indentation.size" value\="3"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_assignment" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value\="error"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.tabulation.char" value\="space"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_method" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_switch" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value\="error"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_block" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.compact_else_if" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.tabulation.size" value\="3"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_empty_lines" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.compliance" value\="1.5"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value\="2"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value\="16"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.line_length" value\="120"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_html" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_source_code" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value\="0"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value\="1.5"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_header" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.comment.format_block_comments" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value\="80"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value\="end_of_line"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value\="1"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value\="true"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value\="insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value\="do not insert"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value\="false"/>\r\n<setting id\="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value\="false"/>\r\n</profile>\r\n</profiles>\r\n
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_m2m_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/description=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_webtools_updates/enabled=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_emft_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/isSystem=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_webtools_updates/url=http\://download.eclipse.org/webtools/updates
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_stp_updates/isSystem=false
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=11
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+/instance/org.eclipse.team.ui/org.eclipse.team.ui.sychronizing_default_participant_sec_id=1197473737700
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_m2m_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_dsdp_tm_updates_3.0/url=http\://download.eclipse.org/dsdp/tm/updates/3.0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_europa/url=http\://download.eclipse.org/releases/europa
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_gmf_update-site_releases_site.xml/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__eclipse.org_tptp_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_emf_updates_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/suffix=eclipse
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/description=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_mdt_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/type=org.eclipse.equinox.p2.extensionlocation.metadataRepository
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/isSystem=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/description=
+/instance/org.eclipse.debug.ui/org.eclipse.debug.uiinspectPopupSashWeights=572\:427
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_stp_updates/enabled=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_default_serial_version_id=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_m2m_updates_/url=http\://download.eclipse.org/modeling/m2m/updates/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_rap_update-site/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_m2t_updates_/isSystem=false
+@org.eclipse.pde.ui=3.4.0.v20080530
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/url=http\://download.eclipse.org/tools/buckminster/updates
+/instance/org.polarion.team.svn.ui/preference.commitDialog.height=406
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_mdt_updates_/url=http\://download.eclipse.org/modeling/mdt/updates/
+@org.eclipse.ui.workbench=3.4.0.I20080606-1300
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+/instance/org.eclipse.ui.views.log/orderValue=-1
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_update-site_releases_site.xml/url=http\://download.eclipse.org/tools/gef/update-site/releases/site.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_webtools_updates_/url=http\://download.eclipse.org/webtools/updates/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_emf_updates_/url=http\://download.eclipse.org/tools/emf/updates/
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+/instance/org.eclipse.jdt.ui/sp_cleanup.organize_imports=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_cdt_releases_ganymede/url=http\://download.eclipse.org/tools/cdt/releases/ganymede
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_datatools_updates/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/url=http\://download.eclipse.org/technology/subversive/0.7/update-site/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_emft_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.eclipse.org_modeling_emft_?project\=search\#search/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.line_length=120
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/url=http\://download.eclipse.org/releases/ganymede
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.jst.jsp.core/jspIndexState=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.jdt.debug.ui/org.eclipse.debug.ui.VariableView.org.eclipse.jdt.debug.ui.show_null_entries=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_dsdp_dd_updates/enabled=false
+/instance/org.eclipse.team.svn.ui/history.proxyHost=d3d3LXNsYi1wcm94eS5ib2VpbmcuY29t
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/url=file\:/C\:/Program Files/OSEE_3.4/.eclipseextension
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.localSuffixes=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/isSystem=false
+@org.eclipse.core.resources=3.4.0.v20080604-1400
+/instance/org.eclipse.team.ui/org.eclipse.team.ui.sychronizing_default_perspective_to_show=always
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/url=file\:/C\:/Program Files/OSEE_3.4/p2/org.eclipse.equinox.p2.core/cache/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_dsdp_dd_updates/url=http\://download.eclipse.org/dsdp/dd/updates
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/name=GEF Artifacts
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/isSystem=true
+@org.eclipse.search=3.4.0.v20080603-2000
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/name=http\://update.eclipse.org/updates/3.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/version=1.0.0
+/instance/org.eclipse.ui/SHOW_TEXT_ON_PERSPECTIVE_BAR=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+/instance/org.polarion.team.svn.ui/preference.core.svnclient=org.polarion.team.client.javasvn.standard.core
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/name=http\://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.classpathVariable.JRE_LIB=C\:/UserData/eclipse/jre/lib/rt.jar
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/provider=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.lineSplit=120
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_dsdp_dd_updates/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/suffix=artifacts.xml
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/suffix=content.xml
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_birt_update-site_2.3/isSystem=false
+@org.eclipse.ui.ide=3.4.0.I20080606-1300
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/provider=
+/instance/org.eclipse.jdt.ui/editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+/instance/org.eclipse.ui.workbench/overridepresentation=true
+/instance/org.eclipse.core.net/nonProxiedHosts=127.0.0.1|localhost
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/description=
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_rap_update-site/url=http\://download.eclipse.org/technology/rap/update-site
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.UseContextualLaunch=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_blocks=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_cdt_releases_ganymede/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_emf_updates_/url=http\://download.eclipse.org/modeling/emf/updates/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_html=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+/instance/org.eclipse.help.ui/browser.y=5
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_europa/enabled=false
+/instance/org.eclipse.help.ui/browser.x=2
+/instance/org.eclipse.help.ui/browser.w=1406
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/suffix=content.xml
+/instance/org.eclipse.ui/PROJECT_OPEN_NEW_PERSPECTIVE=NO_NEW_PERSPECTIVE
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_extras/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_dsdp_tm_updates_3.0/enabled=false
+/instance/org.eclipse.help.ui/browser.h=844
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/isSystem=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__eclipse.org_tptp_updates_/url=http\://eclipse.org/tptp/updates/
+/instance/org.eclipse.jdt.debug.ui/org.eclipse.debug.ui.ExpressionView.org.eclipse.jdt.debug.ui.show_null_entries=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.correct_indentation=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_source_code=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/name=Agent Metadata Cache
+@org.eclipse.debug.core=3.4.0.v20080612
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+/instance/org.eclipse.jdt.ui/LexicalSortingAction.isChecked=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/url=http\://download.eclipse.org/technology/subversive/0.7/update-site/
+/configuration/org.eclipse.core.net/proxyData/HTTPS/port=31060
+file_export_version=3.0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_stp_updates/isSystem=false
+/instance/org.eclipse.pde.core/platform_path=C\:\\UserData\\eclipse
+@org.eclipse.jdt.debug.ui=3.3.0.v20080603
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_birt_update-site_2.3/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates/name=Eclipse Update Site
+/configuration/org.eclipse.core.net/proxiesEnabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/enabled=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_m2t_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_extras/enabled=false
+/instance/org.eclipse.pde.ui/DependenciesView.show.callers=true
+/instance/org.eclipse.team.svn.ui/org.eclipse.team.svn.ui.panel.callback.PromptCredentialsPanel.width=470
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates_3.3/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_emf_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/configuration/org.eclipse.osgi/bundles/63/data/listener_1149808244/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/suffix=content.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/enabled=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_webtools_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/name=metadata listener file\:/C\:/Program Files/OSEE_3.4/.eclipseextension
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/suffix=content.xml
+/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES=C\:\\UserData\\workspace1\nC\:\\UserData\\workspace\nC\:\\UserData\\workspaceLocal\nC\:\\UserData\\workspaceRel\nC\:\\UserData\\workspace2
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_casts=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.cancel_launch_with_compile_errors=always
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/version=1
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_epp_updates_1.0_/url=http\://download.eclipse.org/technology/epp/updates/1.0/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_emft_updates_/url=http\://download.eclipse.org/modeling/emft/updates/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/isSystem=false
+@org.eclipse.ant.ui=3.3.0.v20080529
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.JavaOutlinePage.SyntheticMembersFilter=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+/instance/org.eclipse.jdt.ui/CustomFiltersActionGroup.org.eclipse.jdt.ui.JavaOutlinePage.TAG_DUMMY_TO_TEST_EXISTENCE=storedViewPreferences
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_e3.4/enabled=false
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.overrideannotation=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.sort_members_all=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/version=1.0.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/isSystem=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+/instance/org.eclipse.ui.views.log/activate=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__eclipse.org_tptp_updates_/url=http\://eclipse.org/tptp/updates/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+/instance/org.eclipse.equinox.p2.ui.sdk/autoUpdateInit=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.jdt.ui/lastRecentlyUsedFilters=org.eclipse.ajdt.ui.editor.outline.DeclarationFilter,org.eclipse.jdt.ui.JavaOutlinePage.ImportDeclarationFilter,
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_update-site_releases_site.xml/isSystem=false
+/instance/org.eclipse.jdt.ui/org.eclipse.ajdt.ui.editor.outline.DeclarationFilter=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/description=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/name=C\:\\Program Files\\Eclipse 3.4\\eclipse\\.eclipseextension
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.navigator.layout=2
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.VariableView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684"/>
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_emf_updates_/url=http\://download.eclipse.org/tools/emf/updates/
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_parameters_final=false
+/instance/org.eclipse.ui.ide/SWITCH_PERSPECTIVE_ON_PROJECT_CREATION=never
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/version=1.0.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/suffix=artifacts.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/isSystem=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_empty_lines=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+/instance/org.eclipse.ui/showIntro=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.director_rollback/isSystem=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_m2t_updates_/url=http\://download.eclipse.org/modeling/m2t/updates/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/url=http\://download.eclipse.org/eclipse/updates/3.4
+@org.eclipse.team.svn.ui=0.7.1.I20080612-1500
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/isSystem=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.localPrefixes=
+/instance/org.eclipse.osee.framework.ui.skynet.branch.BranchView/show_transactions=true
+/instance/org.eclipse.jdt.ui/MemberFilterActionGroup.org.eclipse.jdt.ui.JavaOutlinePage.1=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_extras/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/suffix=artifacts.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/version=1.0.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_epp_updates_1.0_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/name=http\://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
+/instance/org.eclipse.jdt.ui/spelling_user_dictionary_encoding=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/version=1.0.0
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_annotations=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/configuration/org.eclipse.osgi/bundles/69/data/listener_1925729951/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/url=http\://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/suffix=artifacts.xml
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/provider=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/type=org.eclipse.equinox.p2.updatesite.artifactRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_emft_updates_/url=http\://download.eclipse.org/modeling/emft/updates/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/name=Buckminster Update Site
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.JavaOutlinePage.ImportDeclarationFilter=true
+@org.eclipse.mylyn.context.core=3.0.0.v20080619-1900
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_emft_updates_/url=http\://download.eclipse.org/technology/emft/updates/
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_dsdp_dd_updates/isSystem=false
+@org.eclipse.equinox.p2.ui.sdk=1.0.0.v20080605-1731
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+@org.eclipse.jdt.launching=3.4.0.v20080529-1300
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/name=Agent rollback repository
+/instance/org.eclipse.wst.server.core/module-start-timeout=300000
+@org.eclipse.ui.views.log=1.0.0.v20080522-2200
+/instance/org.polarion.team.svn.ui/history.comment=QXBwbGllZCB1cGRhdGVkIGphdmEgY29kZSBmb3JtYXR0aW5nIHN0YW5kYXJk;W0NRIDE3Mjld;U2hhcmUgcHJvamVjdCAnamFrYXJ0YS5jb21tb25zLm5ldCcgaW50byAnaHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvc3Zucm9vdC90ZWNobm9sb2d5Jw\=\=;W0NRIDE4NzNd;U2hhcmUgcHJvamVjdCAnb3JnLmFwYWNoZS5jb21tb25zLmxhbmcnIGludG8gJ2h0dHBzOi8vZGV2LmVjbGlwc2Uub3JnL3N2bnJvb3QvdGVjaG5vbG9neSc\=
+@org.eclipse.pde.runtime=3.4.0.v20080530-1200
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_update-site_releases_site.xml/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.compliance=1.6
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates/url=http\://update.eclipse.org/updates
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks_only_for_return_and_throw=false
+/instance/org.eclipse.pde.runtime/activate=true
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.user_view_bindings=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<viewBindings>\r\n<view id\="org.eclipse.debug.ui.ExpressionView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="opened"/>\r\n</view>\r\n<view id\="org.eclipse.ui.console.ConsoleView">\r\n<perspective id\="org.polarion.team.svn.ui.repository.RepositoryPerspective" userAction\="opened"/>\r\n<perspective id\="org.eclipse.osee.ats.ATSPerspective" userAction\="opened"/>\r\n<perspective id\="osee.define.PerspectiveFactory" userAction\="opened"/>\r\n<perspective id\="org.eclipse.team.ui.TeamSynchronizingPerspective" userAction\="opened"/>\r\n<perspective id\="org.eclipse.jdt.ui.JavaPerspective" userAction\="opened"/>\r\n</view>\r\n</viewBindings>\r\n
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_buckminster_updates/description=
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_generated_serial_version_id=false
+/configuration/org.eclipse.ui.ide/MAX_RECENT_WORKSPACES=5
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_dsdp_tm_updates_3.0/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_uml2_updates_/url=http\://download.eclipse.org/tools/uml2/updates/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.source=1.6
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_tools_ve_updates_1.0/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.director_rollback/name=Agent rollback repository
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/version=1.0.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/provider=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_epp_updates_1.0_/url=http\://download.eclipse.org/technology/epp/updates/1.0/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/version=1.0.0
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_local_variable_final=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_fields=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_dsdp_tm_updates_3.0/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_e3.4/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_datatools_updates/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_p2_org.eclipse.equinox.p2.core_cache_/url=file\:/C\:/Program Files/Eclipse 3.4/eclipse/p2/org.eclipse.equinox.p2.core/cache/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_m2m_updates_/url=http\://download.eclipse.org/modeling/m2m/updates/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_mdt_updates_/url=http\://download.eclipse.org/modeling/mdt/updates/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_birt_update-site_2.3/url=http\://download.eclipse.org/birt/update-site/2.3
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+/instance/org.eclipse.pde.runtime/orderValue=-1
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_emft_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_m2m_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_webtools_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/suffix=site.xml
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_datatools_updates/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.director_rollback/url=file\:/C\:/Program Files/OSEE_3.4/p2/org.eclipse.equinox.p2.director/rollback
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_emft_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_dsdp_tm_updates_3.0/url=http\://download.eclipse.org/dsdp/tm/updates/3.0
+/instance/org.eclipse.ui.workbench/editors=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<editors>\r\n<descriptor class\="org.eclipse.gef.examples.shapes.ShapesEditor" id\="GEF Shapes Editor" image\="shapes.gif" internal\="true" label\="GEF Shapes Example" openMode\="1" open_in_place\="false" plugin\="org.eclipse.gef.examples.shapes"/>\r\n<descriptor class\="org.eclipse.buckminster.ui.editor.rmap.RMAPEditor" id\="org.eclipse.buckminster.ui.editors.CSPEXEditor" image\="icons/cspex.png" internal\="true" label\="Buckminster CSPEX Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.buckminster.ui"/>\r\n<descriptor class\="org.eclipse.gef.examples.text.TextEditor" id\="org.eclipse.gef.TextEditor" image\="text.gif" internal\="true" label\="GEF WYSIWYG Document Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.gef.examples.text"/>\r\n<descriptor class\="org.eclipse.buckminster.ui.editor.rmap.RMAPEditor" id\="org.eclipse.buckminster.ui.editors.RMAPEditor" image\="icons/rmap.png" internal\="true" label\="Buckminster Resource Map Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.buckminster.ui"/>\r\n<descriptor class\="org.eclipse.pde.internal.ui.samples.SampleEditor" id\="org.eclipse.pde.ui.sampleEditor" image\="$nl$/icons/obj16/build_exec.gif" internal\="true" label\="Code Sample Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.pde.ui"/>\r\n<descriptor class\="org.eclipse.gef.examples.flow.ui.FlowEditor" id\="GEF Flow Editor" image\="view.gif" internal\="true" label\="GEF Flow Example" openMode\="1" open_in_place\="false" plugin\="org.eclipse.gef.examples.flow"/>\r\n<descriptor class\="org.eclipse.jdt.internal.debug.ui.snippeteditor.JavaSnippetEditor" id\="org.eclipse.jdt.debug.ui.SnippetEditor" image\="$nl$/icons/full/obj16/jsbook_obj.gif" internal\="true" label\="Scrapbook" openMode\="1" open_in_place\="false" plugin\="org.eclipse.jdt.debug.ui"/>\r\n<descriptor id\="org.eclipse.ui.browser.editorSupport" image\="$nl$/icons/obj16/internal_browser.gif" internal\="false" label\="Web Browser" launcher\="org.eclipse.ui.internal.browser.BrowserLauncher" openMode\="4" open_in_place\="false" plugin\="org.eclipse.ui.browser"/>\r\n<descriptor class\="org.eclipse.gef.examples.logicdesigner.LogicEditor" id\="Logic Graphical Editor" image\="logic.gif" internal\="true" label\="Logic Graphical Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.gef.examples.logic"/>\r\n<descriptor class\="org.eclipse.buckminster.ui.editor.query.QueryEditor" id\="org.eclipse.buckminster.ui.editor.QueryEditor" image\="icons/cquery.png" internal\="true" label\="Component Query Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.buckminster.ui"/>\r\n<descriptor class\="org.eclipse.buckminster.ui.editor.cspec.CSpecEditor" id\="org.eclipse.buckminster.ui.editors.CSPECEditor" image\="icons/cspec.png" internal\="true" label\="Buckminster CSPEC Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.buckminster.ui"/>\r\n<descriptor class\="org.eclipse.ui.editors.text.TextEditor" id\="org.eclipse.jdt.ui.JARDescEditor" image\="$nl$/icons/full/obj16/jar_desc_obj.gif" internal\="true" label\="JAR Description Editor" openMode\="1" open_in_place\="false" plugin\="org.eclipse.jdt.ui"/>\r\n</editors>
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_europa/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.compact_else_if=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+/instance/org.eclipse.wst.xml.ui/lastActivePage=1
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_enum_constants=80
+/instance/org.eclipse.jdt.ui/content_assist_proposals_background=255,255,255
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_header=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.tabulation.char=space
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/name=http\://download.eclipse.org/technology/subversive/0.7/update-site/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_datatools_updates/url=http\://download.eclipse.org/datatools/updates
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/description=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/url=http\://update.eclipse.org/updates/3.0
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/name=http\://update.eclipse.org/updates/3.3
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/version=1.0.0
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_stp_updates/url=http\://download.eclipse.org/stp/updates
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_tools_gef_updates_releases_/description=
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_dltk_updates_/url=http\://download.eclipse.org/technology/dltk/updates/
+/instance/org.eclipse.debug.core/prefWatchExpressions=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<watchExpressions/>\r\n
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/version=1.0.0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+@org.eclipse.team.ui=3.4.0.I20080604
+/instance/org.eclipse.ui.navigator/org.eclipse.ui.navigator.ProjectExplorer.filterActivation=\:org.eclipse.jst.j2ee.navigator.ui.filters.jetemitters\:org.eclipse.jdt.java.ui.filters.HideSyntheticMembers\:org.eclipse.jdt.java.ui.filters.HideImportDeclaration\:org.eclipse.jdt.java.ui.filters.HideInnerClassFiles\:org.eclipse.jdt.java.ui.filters.HideEmptyInnerPackages\:org.eclipse.jdt.java.ui.filters.HidePackageDeclaration\:
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/provider=
+/instance/org.eclipse.ui.editors/overviewRuler_migration=migrated_3.1
+/instance/org.eclipse.osee.framework.skynet.core/LastDefaultBranch=336
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/version=1
+/instance/org.eclipse.ui.views.log/column4=150
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+/instance/org.eclipse.ui.views.log/column3=150
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+/instance/org.eclipse.ui.views.log/column2=938
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_modeling_m2t_updates_/isSystem=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_emf_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+/instance/org.eclipse.help.ui/browser.maximized=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/version=1
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/url=file\:/C\:/Program Files/OSEE_3.4/p2/org.eclipse.equinox.p2.core/cache/
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+/instance/org.eclipse.team.svn.ui/preference.repository.repositoryBrowser=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+/instance/org.eclipse.team.core/file_types=jtpl\n1\nxls\n2\ncom\n2\njpeg\n2\ntif\n2\ntag\n1\npdf\n2\nemof\n1\ndadx\n1\njpage\n1\njavajet\n1\nMF\n1\ncxx\n1\njar\n2\nwml\n1\nphp\n1\ntmo\n1\njetinc\n1\ndtd\n1\nhtm\n1\nhpp\n1\ntiff\n2\njsp\n1\ncpp\n1\nso\n2\ncvsignore\n1\nmod\n1\nxmi\n1\njsv\n1\nclass\n2\nxsd2ecore\n1\nxml\n1\necore2ecore\n1\nproperties\n1\nppt\n2\nini\n1\nclasspath\n1\njspx\n1\nbmp\n2\nproject\n1\noverride\n1\nnst\n1\njardesc\n1\nshtml\n1\ndll\n2\necore\n1\nhtpl\n1\ncss\n1\ncc\n1\nexe\n2\ngif\n2\ncdtbuild\n1\npropertiesjet\n1\njspf\n1\nwsdl\n1\nxhtml\n1\nexsd\n1\nlaunch\n1\nico\n2\nhh\n1\ncdtproject\n1\ntxt\n1\necore2xml\n1\nprefs\n1\nmxsd\n1\njsf\n1\noptions\n1\nxsl\n1\nzip\n2\nc\n1\ntagx\n1\na\n2\nbeaninfoConfig\n1\no\n2\nshtm\n1\nent\n1\nxmljet\n1\nh\n1\njpg\n2\nproduct\n1\ngenmodel\n1\ntagf\n1\nxslt\n1\npng\n2\nxsd\n1\ndoc\n2\ndatagraph\n1\njava\n1\nhtml\n1\ntld\n1\n
+/instance/org.eclipse.ui.ide/tipsAndTricks=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_dsdp_dd_updates/enabled=false
+/instance/org.eclipse.search/org.eclipse.search.defaultPerspective=org.eclipse.search.defaultPerspective.none
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.0/version=1
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/version=1.0.0
+/instance/org.eclipse.jdt.ui/sp_cleanup.on_save_use_additional_actions=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/type=org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_tools_ve_updates_1.0/enabled=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_parentheses_in_expressions=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_tools_ve_updates_1.0/isSystem=false
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_configuration_org.eclipse.osgi_bundles_63_data_listener_1149808244_/description=
+/configuration/org.eclipse.core.net/proxyData/HTTPS/host=www-slb-proxy.boeing.com
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__update.eclipse.org_updates/enabled=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_69_data_listener_1925729951_/enabled=true
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_configuration_org.eclipse.osgi_bundles_63_data_listener_450946960_/url=file\:/C\:/Program Files/OSEE_3.4/configuration/org.eclipse.osgi/bundles/63/data/listener_450946960/
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_eclipse_updates_3.4/isSystem=false
+@org.eclipse.debug.ui=3.4.0.v20080529-1300
+/instance/org.polarion.team.svn.ui/history.repositoryURL=aHR0cHM6Ly9zdW44MDEubXNjLmF6LmJvZWluZy5jb20vbGJhX3N2bi9vc2Vl;aHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvc3Zucm9vdC90ZWNobm9sb2d5;aHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvc3ZudGVjaC8\=;c3ZuOi8vMTI3LjAuMC4xOjM2OTAvc3Zucm9vdC90ZWNobm9sb2d5;c3ZuK3NzaDovLzEyNy4wLjAuMTozNjkwL3N2bnJvb3QvdGVjaG5vbG9neQ\=\=
+@org.eclipse.core.net=1.1.0.I20080604
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_emf_updates_/url=http\://download.eclipse.org/modeling/emf/updates/
+/instance/org.eclipse.jdt.ui/org.eclipse.jface.textfont=1|Courier New|10.0|0|WINDOWS|1|0|0|0|0|0|0|0|0|1|0|0|0|0|Courier New;
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_datatools_updates/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+/configuration/org.eclipse.core.net/proxyData/HTTP/hasAuth=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.javadoc=true
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_extras/url=http\://download.eclipse.org/tools/mylyn/update/extras
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_.eclipseextension/provider=
+@org.eclipse.jdt.ui=3.4.0.v20080603-2000
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/name=C\:\\Program Files\\OSEE_3.4\\.eclipseextension
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_.eclipseextension/isSystem=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_nls_tags=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_modeling_mdt_updates_/enabled=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_p2_org.eclipse.equinox.p2.core_cache_/name=Agent Metadata Cache
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_ganymede/name=Ganymede
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__www.polarion.org_projects_subversive_download_eclipse_2.0_update-site_/provider=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+/instance/org.eclipse.wst.xsd.ui/org.eclipse.wst.xsd.ui.internal.defaultPage=org.eclipse.wst.xsd.ui.internal.sourcePage
+/configuration/org.eclipse.core.net/proxyData/HTTP/port=31060
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_tools_mylyn_update_e3.4/url=http\://download.eclipse.org/tools/mylyn/update/e3.4
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+@org.eclipse.ui.browser=3.2.200.v20080507
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_methods=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_types=true
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.switch_perspective_on_suspend=always
+/instance/org.eclipse.jdt.ui/content_assist_lru_history=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><history maxLHS\="100" maxRHS\="10"><lhs name\="java.lang.CharSequence"><rhs name\="java.lang.StringBuilder"/></lhs><lhs name\="java.lang.AbstractStringBuilder"><rhs name\="java.lang.StringBuilder"/></lhs><lhs name\="java.lang.Appendable"><rhs name\="java.lang.StringBuilder"/><rhs name\="java.io.FileWriter"/></lhs><lhs name\="org.eclipse.core.runtime.IAdaptable"><rhs name\="org.eclipse.osee.framework.skynet.core.artifact.DeleteBranchJob"/></lhs><lhs name\="org.eclipse.core.internal.jobs.InternalJob"><rhs name\="org.eclipse.osee.framework.skynet.core.artifact.DeleteBranchJob"/></lhs><lhs name\="org.eclipse.core.runtime.PlatformObject"><rhs name\="org.eclipse.osee.framework.skynet.core.artifact.DeleteBranchJob"/></lhs><lhs name\="org.eclipse.core.runtime.jobs.Job"><rhs name\="org.eclipse.osee.framework.skynet.core.artifact.DeleteBranchJob"/></lhs><lhs name\="org.eclipse.swt.graphics.Resource"><rhs name\="org.eclipse.swt.graphics.Color"/></lhs><lhs name\="org.eclipse.osee.ats.editor.SMAManager"><rhs name\="org.eclipse.osee.ats.editor.SMAManager"/></lhs><lhs name\="java.io.Closeable"><rhs name\="java.io.FileWriter"/></lhs><lhs name\="java.io.Flushable"><rhs name\="java.io.FileWriter"/></lhs><lhs name\="java.io.Writer"><rhs name\="java.io.FileWriter"/></lhs><lhs name\="java.io.File"><rhs name\="java.io.File"/></lhs></history>
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__update.eclipse.org_updates_3.3/url=http\://update.eclipse.org/updates/3.3
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_Eclipse\ 3.4_eclipse_/type=org.eclipse.equinox.p2.artifact.repository.simpleRepository
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/file\:_C\:_Program\ Files_OSEE_3.4_/provider=
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__eclipse.org_tptp_updates_/isSystem=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__download.eclipse.org_releases_europa/url=http\://download.eclipse.org/releases/europa
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_subversive_0.7_update-site_/provider=
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_technology_rap_update-site/isSystem=false
+/instance/org.eclipse.team.ui/pref_generichistory_view_linking=true
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+/configuration/org.eclipse.equinox.p2.artifact.repository/repositories/http\:__eclipse.org_tptp_updates_/enabled=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+/configuration/org.eclipse.equinox.p2.metadata.repository/repositories/http\:__download.eclipse.org_releases_ganymede/url=http\://download.eclipse.org/releases/ganymede
+/instance/org.eclipse.team.svn.ui/preference.synchronize.fastReport=false
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
diff --git a/org.eclipse.osee.support.config/projectSets/OseeAppServerProjectSet.psf b/org.eclipse.osee.support.config/projectSets/OseeAppServerProjectSet.psf
new file mode 100644
index 00000000000..fee7b416a55
--- /dev/null
+++ b/org.eclipse.osee.support.config/projectSets/OseeAppServerProjectSet.psf
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<psf version="2.0">
+<provider id="org.eclipse.team.svn.core.svnnature">
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.demo.db.connection,org.eclipse.osee.demo.db.connection,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.artifact.servlet,org.eclipse.osee.framework.artifact.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.branch.management,org.eclipse.osee.framework.branch.management,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.branch.management.servlet,org.eclipse.osee.framework.branch.management.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.client.info.servlet,org.eclipse.osee.framework.client.info.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.core,org.eclipse.osee.framework.core,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.core.server,org.eclipse.osee.framework.core.server,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.db.connection,org.eclipse.osee.framework.db.connection,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.derby,org.eclipse.osee.framework.derby,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.jdbcodbc,org.eclipse.osee.framework.jdbcodbc,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.jdk.core,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.logging,org.eclipse.osee.framework.logging,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.oracle,org.eclipse.osee.framework.oracle,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.osgitestrunner,org.eclipse.osee.framework.osgitestrunner,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.postgresql,org.eclipse.osee.framework.postgresql,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.locator.attribute,org.eclipse.osee.framework.resource.locator.attribute,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.locator.attribute.test,org.eclipse.osee.framework.resource.locator.attribute.test,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.management,org.eclipse.osee.framework.resource.management,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.management.servlet,org.eclipse.osee.framework.resource.management.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.management.servlet.test,org.eclipse.osee.framework.resource.management.servlet.test,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.management.test,org.eclipse.osee.framework.resource.management.test,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.provider.attribute,org.eclipse.osee.framework.resource.provider.attribute,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.resource.provider.common,org.eclipse.osee.framework.resource.provider.common,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.search.engine,org.eclipse.osee.framework.search.engine,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.search.engine.servlet,org.eclipse.osee.framework.search.engine.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.search.engine.test,org.eclipse.osee.framework.search.engine.test,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.server.admin,org.eclipse.osee.framework.server.admin,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.server.external.feature,org.eclipse.osee.framework.server.external.feature,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.server.feature,org.eclipse.osee.framework.server.feature,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.server.lookup.servlet,org.eclipse.osee.framework.server.lookup.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.session.management.servlet,org.eclipse.osee.framework.session.management.servlet,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.session.management.servlet.test,org.eclipse.osee.framework.session.management.servlet.test,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+<project reference="1.0.1,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.support.config,org.eclipse.osee.support.config,20e8dd35273c001e1ca7a6f57d385965;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk;true;ee007c2a-0a25-0410-9ab9-bf268980928c;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;;false;&lt;https://dev.eclipse.org:443&gt; Eclipse Account;;22"/>
+</provider>
+</psf> \ No newline at end of file
diff --git a/org.eclipse.osee.support.config/projectSets/OseeClientProjectSet.psf b/org.eclipse.osee.support.config/projectSets/OseeClientProjectSet.psf
new file mode 100644
index 00000000000..583535aa6d3
--- /dev/null
+++ b/org.eclipse.osee.support.config/projectSets/OseeClientProjectSet.psf
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<psf version="2.0">
+<provider id="org.eclipse.team.svn.core.svnnature">
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/jakarta.commons.net,jakarta.commons.net,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/javax.mail,javax.mail,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/net.jini,net.jini,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.apache.commons.lang,org.apache.commons.lang,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.ats,org.eclipse.osee.ats,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.ats.config.demo,org.eclipse.osee.ats.config.demo,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.ats.feature,org.eclipse.osee.ats.feature,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.ats.test,org.eclipse.osee.ats.test,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.define,org.eclipse.osee.define,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.define.feature,org.eclipse.osee.define.feature,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.demo.db.connection,org.eclipse.osee.demo.db.connection,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.antsupport,org.eclipse.osee.framework.antsupport,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.database,org.eclipse.osee.framework.database,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.db.connection,org.eclipse.osee.framework.db.connection,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.feature,org.eclipse.osee.framework.feature,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.jdk.core,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.jini,org.eclipse.osee.framework.jini,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.logging,org.eclipse.osee.framework.logging,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.messaging.event.skynet,org.eclipse.osee.framework.messaging.event.skynet,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.plugin.core,org.eclipse.osee.framework.plugin.core,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.skynet.core,org.eclipse.osee.framework.skynet.core,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.skynet.core.test,org.eclipse.osee.framework.skynet.core.test,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.svn,org.eclipse.osee.framework.svn,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.templates,org.eclipse.osee.framework.templates,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.admin,org.eclipse.osee.framework.ui.admin,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.encrypter,org.eclipse.osee.framework.ui.encrypter,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.feature,org.eclipse.osee.framework.ui.feature,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.feature.source,org.eclipse.osee.framework.ui.feature.source,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.jdk,org.eclipse.osee.framework.ui.jdk,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.plugin,org.eclipse.osee.framework.ui.plugin,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.product,org.eclipse.osee.framework.ui.product,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.security,org.eclipse.osee.framework.ui.security,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.service.control,org.eclipse.osee.framework.ui.service.control,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.skynet,org.eclipse.osee.framework.ui.skynet,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.skynet.zest,org.eclipse.osee.framework.ui.skynet.zest,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.ui.swt,org.eclipse.osee.framework.ui.swt,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+<project reference="1.0.0,https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.updater,org.eclipse.osee.framework.updater,10ecb824973c001d1dcfa4a6fd880dc1;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;https://dev.eclipse.org/svnroot/technology/org.eclipse.osee;branches;tags;trunk"/>
+</provider>
+</psf> \ No newline at end of file
diff --git a/org.eclipse.osee.support.dev/.project b/org.eclipse.osee.support.dev/.project
new file mode 100644
index 00000000000..a5c5122eab4
--- /dev/null
+++ b/org.eclipse.osee.support.dev/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.support.dev</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.support.dev/database/db_performance.txt b/org.eclipse.osee.support.dev/database/db_performance.txt
new file mode 100644
index 00000000000..0fdfdbadc7e
--- /dev/null
+++ b/org.eclipse.osee.support.dev/database/db_performance.txt
@@ -0,0 +1,112 @@
+turn off auto db stat collection
+
+Oracle document ids:
+ Note:260942.1
+ Note:557661.1
+ Note:215187.1
+ Note:445126.1 How to manually store an outline using V$SQL and DBMS_OUTLN.CREATE_OUTLINE
+ Note:555579.1 10.2.0.4 Patch Set - Availability and Known Issues
+ NOTE:601739.1 11.1.0.7 Patch Set - List of Bug Fixes by Problem Type
+ Doc ID:
+
+SQL Ids:
+ 67mynxt63pr82: this is the SQL ID for the show all trax related actions
+
+-- dbms.stat no_invalidate is set to auto: "false"
+
+telnet sun802.msc.az.boeing.com
+cd /las_ora_apps/sqlt/sqlt/run
+sqlplus user/password@service
+start sqltxtract.sql 6gdcn1fq2sxtq
+
+select * from v$sql, v$sql_shared_cursor where v$sql.sql_id = '67mynxt63pr82' and v$sql.sql_id =v$sql_shared_cursor.sql_id;
+select * from v$sql_shared_cursor where sql_id = '67mynxt63pr82';
+select * from v$sql where sql_id = '67mynxt63pr82';
+select to_char(last_active_time,'MM-dd-yy hh24:mi:ss') from v$sql where sql_id = '67mynxt63pr82';
+select * from V$sql_plan where sql_id = '5vmmky8ka6b36';
+
+Questions:
+ What causes the creation of child cursors that have all 'N' in the v$sql_shared_cursor?
+
+remove histogram
+need to patch bug 6810189
+
+Steps Taken:
+ newest patches applied (over 1000 bugs fixed)
+ dbms.stat no_invalidate changed from "auto" to "false"
+ large log file removed
+
+======= chained rows =======
+SELECT count (1) from chained_rows;
+ANALYZE TABLE osee_define_txs LIST CHAINED ROWS INTO chained_rows;
+SELECT count (1) from chained_rows;
+
+======= tracing =======
+$ORACLE_HOME/admin/lba7/udump
+
+======= stored outlines =======
+Doc ID: Note:6336044.8 which is preventing creating a stored outline
+
+-- do this:
+select * from v$parameter where name like '%cursor%';
+alter system set use_stored_outlines=true;
+alter session set create_stored_outlines = true;
+-- now execute exact sql (copy from enterprise manager) and the outline will automatically be created
+alter session set create_stored_outlines = false;
+
+-- on Oracle 11g:
+ -- must be done each time the database instance is restarted or write database startup trigger
+ alter system set use_stored_outlines=true;
+ login as admin
+ select hash_value, child_number, plan_hash_value from v$sql where sql_id = 'ggbncw5fg04sn';
+
+
+ -- create the outline
+declare begin dbms_outln.create_outline(hash_value, child_number); end;
+
+ -- now test for success
+ select * from dba_outlines;
+ select * from user_outlines;
+ select * from dba_outline_hints where name = 'SYS_OUTLINE_08111414044364301' order by join_pos;
+
+======= table information =======
+select * from dba_tables where owner='OSEE' and table_name='OSEE_DEFINE_TXS';
+select * from dba_objects where owner='OSEE' and object_name='OSEE_DEFINE_TXS';
+select * from dba_tablespaces where tablespace_name ='OSEE_DATA';
+
+======= sql plus =======
+!stty erase ^H
+set pagesize 300
+set linesize 120
+
+======= ashrpt =======
+cd $ORACLE_HOME/rdbms/admin
+sqlplus osee_admin/osee_admin@lba7
+@ashrpt
+-2:00
+/lba_users/rbrooks/workarea/ashrpt.html
+
+
+cudx4784s2fx1 490550842 45.86 CPU + Wait for CPU 44.29 SELECT rel_link_id, a_art_id,...
+ latch: cache buffers chains 1.52
+3902zvx99s9rm 3655678348 38.68 CPU + Wait for CPU 37.22 SELECT art1.art_id, txd1.bran...
+
+_____________________
+How to Transfer Stored Outlines from One Database to Another (9i and above)
+ Doc ID: NOTE:728647.1
+______________________________
+select t.* from v$sql s, table(dbms_xplan.display_cursor(s.sql_id, s.child_number, 'TYPICAL ALLSTATS LAST')) t where s.sql_id = '254fj1vwk9x18' ;
+____________________________
+
+
+create or replace trigger enables_outlines_trigger
+after startup on database
+begin
+execute immediate('alter system set use_stored_outlines=true');
+end;
+/
+
+
+ /*+ ordered */
+http://www.dba-oracle.com/oracle11g/oracle_11g_extended_optimizer_statistics.htm
+http://www.dba-oracle.com/art_otn_cbo_p7.htm \ No newline at end of file
diff --git a/org.eclipse.osee.support.dev/design/openOffice.txt b/org.eclipse.osee.support.dev/design/openOffice.txt
new file mode 100644
index 00000000000..f423a35fa44
--- /dev/null
+++ b/org.eclipse.osee.support.dev/design/openOffice.txt
@@ -0,0 +1,11 @@
+implement IRenderer for OO
+implement ArtifactExtractor for OO
+new attribute type OO and Dash-10 artifact type
+availability of OO for users
+investigate how to embed custom XML in ODT
+investigate API and how to control OO from Java
+
+Import/Export
+ Convert From: document to RTF/MS Word
+ Convert Graphics to: picture only
+ "No Hidden Components"? \ No newline at end of file
diff --git a/org.eclipse.osee.support.dev/process/basis.html b/org.eclipse.osee.support.dev/process/basis.html
new file mode 100644
index 00000000000..d4e6933bc2c
--- /dev/null
+++ b/org.eclipse.osee.support.dev/process/basis.html
@@ -0,0 +1,95 @@
+Beginnings: The code debt was so high that we declared bankruptcy.
+
+<ul><h4>Pay attention to</h4>
+<li>Emergent Design</li>
+<li>refactoring</li>
+<li>testability</li>
+<li>thesis, antithesis, synthesis</li>
+<li>contained polymorphism (Gang of Four)</li>
+<li></li>
+</ul>
+
+<ul><h4>Process Inputs</h4>
+<li>bright, highly motivated engineers</li>
+</ul>
+
+
+
+<ul><h4>Process Steps</h4>
+<li>re-plan weekly</li>
+<li>review all design</li>
+<li>develop user stories + plus what could go wrong</li>
+<li>prototype high risk storeis</li>
+<li>pair-wise developement</li>
+<li>metrics to manage a project: position and velocity</li>
+</ul>
+
+
+
+<ul><h4>Philosophy</h4>
+<li>embrace change</li>
+<li>on teaching: my goal is not to tell you something truely new, rather to suggest what to pay attention to and what you can ignore</li>
+<li>The apparent increase in uncertainty provided by the agile approach is actually greater reality not greater risk.</li>
+<li>You can only teach someone something that he almost already knows.</li>
+<li>Hope is not a plan, but it is essential to success.</li>
+<li>Don't give up quickly. You are smart enough.</li>
+<li>Only degrade your code consciously.</li>
+<li>Unquestioned assumptions are treated as facts until you are smacked in the face by reality</li>
+<li>The main benefit of OO is not reuse, rather it facilitates cleanly separating usage from construction from definition.</li>
+<li>Identify differences and invent a concept that allows you to ignore them.</li>
+<li>Use intension-revealing names</li>
+<li>Don't think of objects as data with methods, rather as entities with well defined responsibilities.</li>
+<li>Use private access by policy and reveal reluctantly</li>
+<li>Typing is not the bottle-neck</li>
+<li>Abstraction is more than just data abstraction - it includes behavior abstraction</li>
+<li>Patterns as recipes are limited but patterns as ideas are very powerful.</li>
+<li>The trap: change is painful, thus my mission in life is to prevent change. The alternative: develop high quality code and localize change so you are empowered to embrace change.</li>
+<li>Do not be risk adverse, instead spike a solution</li>
+<li>Shift your thinking from procedural to asserting that an object fulfill its responsibilities</li>
+<li>Don't have an implementation that inherits from another implementation - only inherit from concepts.</li>
+<li>How do you eat an elephant? One bite at a time.</li>
+<li>I'll see it when I believe it.</li>
+<li>Patterns aren't merely recipes, but patterns are about "What are the forces?", what should we pay attention to?</li></ul>
+<li>just being aware of an issue helps solve it. Often we are far more capable but we just fial to pay attention</li>
+
+<ul><h4>Code Quality</h4>
+<li>simplicity</li>
+<li>readability</li>
+<li>driven by testability of interfaces</li>
+<li>strong cohesion: object is focused</li>
+<li>loose coupling: objects are not interdependent</li>
+<li>minimize redudancy</li>
+<li>encapsulation</li>
+<li></li>
+</ul>
+
+
+<ul><h4>Core Competencies</h4>
+<li>effectively applies design patterns</li>
+<li>understands and pays attension to code quality</li>
+<li>facilities team cohesion and effectily uses pair-wise development</li>
+<li></li>
+<li></li>
+<li></li>
+</ul>
+
+
+
+
+
+<ul><h4>References</h4>
+<li>Effective Java™ Programming Language Guide
+Joshua Bloch
+Publisher: Addison Wesley Professional
+ISBN: 0-201-31005-8</li>
+<li>Concurrent Programming in Java™: Design Principles and Pattern
+Douglas Lea
+Publisher: Addison Wesley Professional
+ISBN: 0-201-31009-0
+</li>
+<li>Inside Java 2 Platform Security: Architecture, API Design, and Implementation (2nd Edition)
+Li Gong
+ISBN: 0201787911
+</li>
+<li>The Portland Pattern Repository was the first wiki, established by Ward Cunningham in 1995 [1] (http://c2.com/cgi/wiki?WikiHistory). He invented the wiki name and concept, and implemented the first wiki engine.</li>
+</ul> \ No newline at end of file
diff --git a/org.eclipse.osee.support.dev/techNotes/CDT.txt b/org.eclipse.osee.support.dev/techNotes/CDT.txt
new file mode 100644
index 00000000000..5d4aeef7433
--- /dev/null
+++ b/org.eclipse.osee.support.dev/techNotes/CDT.txt
@@ -0,0 +1,7 @@
+download and install MinGW-3.1.0-1.exe from www.mingw.org/download.shtml#hdr1
+
+Eclipse (and plug-ins) download site: http://www.eclipse.org/downloads/index.php
+
+
+For CDT use the following URL in a Site Bookmark in the update manager: http://update.eclipse.org/tools/cdt/releases/new
+To access the Update Manager, select Software Updates->Find and Install... from the Help menu. To access the update site listed above, select Search for New Features to Install and click on Next. Add a new remote site with the URL provided above, and then expand the site node to reveal the available downloads.
diff --git a/org.eclipse.osee.support.test.util/.classpath b/org.eclipse.osee.support.test.util/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.support.test.util/.project b/org.eclipse.osee.support.test.util/.project
new file mode 100644
index 00000000000..ff143d5e8dd
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.support.test.util</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.support.test.util/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.support.test.util/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..77dd83d8ad4
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu May 21 15:27:46 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.support.test.util/META-INF/MANIFEST.MF b/org.eclipse.osee.support.test.util/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..d35d7d246c2
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Demo Plug-in
+Bundle-SymbolicName: org.eclipse.osee.support.test.util
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.osee.support.test.util.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.core;bundle-version="0.5.0",
+ org.eclipse.osee.framework.db.connection;bundle-version="0.4.0",
+ org.eclipse.osee.framework.core.client;bundle-version="0.5.0",
+ org.eclipse.osee.framework.logging;bundle-version="0.4.0",
+ org.junit4;bundle-version="4.3.1"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.osee.support.test.util
diff --git a/org.eclipse.osee.support.test.util/build.properties b/org.eclipse.osee.support.test.util/build.properties
new file mode 100644
index 00000000000..41eb6ade2b4
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/Activator.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/Activator.java
new file mode 100644
index 00000000000..0e248a24af0
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/Activator.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.support.test.util;
+
+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.support.test.demo";
+
+ // 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.support.test.util/src/org/eclipse/osee/support/test/util/AtsUserCommunity.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/AtsUserCommunity.java
new file mode 100644
index 00000000000..d02bc7e841b
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/AtsUserCommunity.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.support.test.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum AtsUserCommunity {
+ Program_1, Program_2, Tools, Processes, Other;
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoActionableItems.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoActionableItems.java
new file mode 100644
index 00000000000..3659194d5ec
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoActionableItems.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.support.test.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoActionableItems {
+
+ Actionable_Items,
+ SAW_CSCI,
+ SAW_Code,
+ Test_Page,
+ SAW_Test,
+ RunLists,
+ SAW_Requirements,
+ SAW_HW,
+ Adapter,
+ Manual,
+ Screen,
+ Case,
+ SAW_SW_Design,
+ CIS_CSCI,
+ CIS_Code,
+ CIS_Test,
+ CIS_Requirements,
+ CIS_SW_Design,
+ Tools,
+ Website,
+ Reader,
+ Timesheet,
+ Results_Reporter,
+ Processes,
+ Coding_Standards,
+ Config_Mgmt,
+ Reviews,
+ New_Employee_Manual,
+ Facilities,
+ Network,
+ Vending_Machines,
+ Computers,
+ Break_Room,
+ Backups;
+
+ public String getName() {
+ return name().replaceAll("_", " ");
+ }
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCISBuilds.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCISBuilds.java
new file mode 100644
index 00000000000..1696f4dbc7d
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCISBuilds.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.support.test.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoCISBuilds {
+ CIS_Bld_1, CIS_Bld_2, CIS_Bld_3;
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCscis.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCscis.java
new file mode 100644
index 00000000000..a4e7f258b9b
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoCscis.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.support.test.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoCscis {
+ Sights, Navigation, Visual, Interface;
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoProgramAttributes.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoProgramAttributes.java
new file mode 100644
index 00000000000..b598767e9b5
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoProgramAttributes.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.support.test.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoProgramAttributes {
+
+ Crew_Interface_Requirement, Timing_Critical, Obsolescence_date, Complexity_Factor,
+ //
+ Weight,
+ Content_URL,
+ Imported_Paragraph_Number,
+ Legacy_Id,
+ Level_2_IPT,
+ Level_3_IPT,
+ //
+ Support_IPT,
+ System_Security_Requirement,
+ Training_Effectivity,
+ CSCI,
+ Subsystem,
+ //
+ Qualification_Method,
+ Execution_Date,
+ Test_Status,
+ Test_Pass,
+ Test_Fail,
+ Version,
+ //
+ Repository_Type,
+ Modification_Flag,
+ Test_Log,
+ Safety_Criticality;
+
+ @Override
+ public String toString() {
+ return name().replace("_", " ");
+ }
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSawBuilds.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSawBuilds.java
new file mode 100644
index 00000000000..b9632e50f9d
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSawBuilds.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.support.test.util;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoSawBuilds {
+ SAW_Bld_1, SAW_Bld_2, SAW_Bld_3;
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSubsystems.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSubsystems.java
new file mode 100644
index 00000000000..35acca7d2aa
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoSubsystems.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.support.test.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoSubsystems {
+ Robot_API, Robot_Survivability_Equipment, Robot_Systems_Management, Chasis, Cognitive_Decision_Aiding,
+ //
+ SAW_Product_Decomposition,
+ Communications,
+ Controls_and_Displays,
+ Data_Management,
+ Drive_Train,
+ Electrical,
+ Controls,
+ //
+ Hydraulics,
+ Mission_Systems_Management,
+ Navigation,
+ Propulsion,
+ Sights,
+ Unknown,
+ Unspecified;
+
+ public static String[] getSubsystemArray() {
+ return getSubsystems().toArray(new String[getSubsystems().size()]);
+ }
+
+ public static Collection<String> getSubsystems() {
+ ArrayList<String> subsystems = new ArrayList<String>();
+ for (DemoSubsystems subsystem : DemoSubsystems.values()) {
+ subsystems.add(subsystem.name());
+ }
+ return subsystems;
+ }
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoUsers.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoUsers.java
new file mode 100644
index 00000000000..8e449cfdd6d
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/DemoUsers.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.support.test.util;
+
+import org.eclipse.osee.framework.core.data.IOseeUserInfo;
+
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+/**
+ * @author Donald G. Dunne
+ */
+public enum DemoUsers implements IOseeUserInfo {
+ Joe_Smith("Joe Smith", "Joe Smith", "", true),
+ Kay_Jones("Kay Jones", "Kay Jones", "", true),
+ Jason_Michael("Jason Michael", "Jason Michael", "", true),
+ Alex_Kay("Alex Kay", "Alex Kay", "", true);
+ private final String name;
+ private final String email;
+ private final String userID;
+ private final boolean active;
+
+ DemoUsers(String name, String email, String userId, boolean active) {
+ this.name = name;
+ this.email = email;
+ this.userID = userId;
+ this.active = active;
+ }
+
+ /**
+ * @return Returns the email.
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the userID.
+ */
+ public String getUserID() {
+ return userID;
+ }
+
+ /**
+ * @return Returns the active.
+ */
+ public boolean isActive() {
+ return active;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.framework.core.data.IOseeUserInfo#isCreationRequired()
+ */
+ @Override
+ public boolean isCreationRequired() {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/TestUtil.java b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/TestUtil.java
new file mode 100644
index 00000000000..9e547f41db5
--- /dev/null
+++ b/org.eclipse.osee.support.test.util/src/org/eclipse/osee/support/test/util/TestUtil.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.support.test.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+import java.util.logging.Level;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.core.data.OseeInfo;
+import org.eclipse.osee.framework.db.connection.exception.OseeCoreException;
+import org.eclipse.osee.framework.db.connection.exception.OseeStateException;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.logging.SevereLoggingMonitor;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class TestUtil {
+ private static final String DEMO_DB_TYPE = "demo";
+ public static final String DEMO_CODE_TEAM_WORKFLOW_ARTIFACT = "Demo Code Team Workflow";
+ public static final String DEMO_REQ_TEAM_WORKFLOW_ARTIFACT = "Demo Req Team Workflow";
+ public static final String DEMO_TEST_TEAM_WORKFLOW_ARTIFACT = "Demo Test Team Workflow";
+ public static final Collection<String> ignoreLogging =
+ Arrays.asList("No image was defined for art type", "Unable to load the image for [SAVED]");
+
+ public static boolean isProductionDb() throws OseeCoreException {
+ return ClientSessionManager.isProductionDataStore();
+ }
+
+ public static boolean isTestDb() throws OseeCoreException {
+ return !isProductionDb(); // && !isDemoDb();
+ }
+
+ public static boolean isDemoDb() throws OseeCoreException {
+ String dbType = OseeInfo.getValue("osee.db.type");
+ return DEMO_DB_TYPE.equals(dbType);
+ }
+
+ public static void sleep(long milliseconds) throws Exception {
+ System.out.println("Sleeping " + milliseconds);
+ Thread.sleep(milliseconds);
+ System.out.println("Awake");
+ }
+
+ public static SevereLoggingMonitor severeLoggingStart() throws Exception {
+ SevereLoggingMonitor monitorLog = new SevereLoggingMonitor();
+ OseeLog.registerLoggerListener(monitorLog);
+ return monitorLog;
+ }
+
+ public static int getNumberOfLogsAtLevel(SevereLoggingMonitor monitorLog, Level level) {
+ int count = 0;
+ for (IHealthStatus hStatus : monitorLog.getLogsAtLevel(level)) {
+ // do not count the valid ignored logs
+ for (String str : ignoreLogging) {
+ if (hStatus.getMessage().startsWith(str) == false) {
+ count++;
+ }
+ }
+ }
+ return count++;
+ }
+
+ public static void severeLoggingEnd(SevereLoggingMonitor monitorLog) throws Exception {
+ OseeLog.unregisterLoggerListener(monitorLog);
+ Collection<IHealthStatus> healthStatuses = monitorLog.getAllLogs();
+ int numExceptions = 0;
+ if (healthStatuses.size() > 0) {
+ for (IHealthStatus status : healthStatuses) {
+ if (status.getLevel() != Level.INFO) {
+ boolean ignoreIt = false;
+ for (String str : ignoreLogging) {
+ if (status.getMessage().startsWith(str)) {
+ ignoreIt = true;
+ }
+ }
+ if (ignoreIt) {
+ continue;
+ }
+ if (status.getException() != null) {
+ StringBuilder sb = new StringBuilder();
+ exceptionToString(status.getException(), sb);
+ System.err.println("SevereLogging Exception: " + sb.toString());
+ } else {
+ System.err.println("SevereLogging Exception: " + status.getMessage());
+ }
+ }
+ }
+ if (numExceptions > 0) {
+ throw new OseeStateException("SevereLoggingMonitor found " + numExceptions + " exceptions!");
+ }
+ }
+ }
+
+ private static void exceptionToString(Throwable ex, StringBuilder sb) {
+ if (ex == null) {
+ sb.append("Exception == null; can't display stack");
+ return;
+ }
+ sb.append(ex.getMessage() + "\n");
+ StackTraceElement st[] = ex.getStackTrace();
+ for (int i = 0; i < st.length; i++) {
+ StackTraceElement ste = st[i];
+ sb.append(" at " + ste.toString() + "\n");
+ }
+ Throwable cause = ex.getCause();
+ if (cause != null) {
+ sb.append(" caused by ");
+ exceptionToString(cause, sb);
+ }
+ }
+
+ public static void checkThatIncreased(Map<String, Integer> prevCount, Map<String, Integer> postCount) {
+ for (String name : prevCount.keySet()) {
+ String incStr = postCount.get(name) > prevCount.get(name) ? "Increased" : "ERROR, Not Increased";
+ System.out.println(String.format(incStr + ": [%s] pre[%d] vs post[%d]", name, prevCount.get(name),
+ postCount.get(name)));
+ }
+ for (String name : prevCount.keySet()) {
+ TestCase.assertTrue(String.format("[%s] did not increase as expected: pre[%d] vs post[%d]", name,
+ prevCount.get(name), postCount.get(name)), postCount.get(name) > prevCount.get(name));
+ }
+ }
+
+ public static void checkThatEqual(Map<String, Integer> prevCount, Map<String, Integer> postCount) {
+ for (String tableName : prevCount.keySet()) {
+ String equalStr = postCount.get(tableName).equals(prevCount.get(tableName)) ? "Equal" : "ERROR, NotEqual";
+ System.out.println(String.format(equalStr + ": [%s] pre[%d] post[%d]", tableName, prevCount.get(tableName),
+ postCount.get(tableName)));
+ }
+ for (String tableName : prevCount.keySet()) {
+ TestCase.assertTrue(String.format("[%s] count not equal pre[%d] post[%d]", tableName,
+ prevCount.get(tableName), postCount.get(tableName)), postCount.get(tableName).equals(
+ prevCount.get(tableName)));
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.support.test/.classpath b/org.eclipse.osee.support.test/.classpath
new file mode 100644
index 00000000000..8a8f1668cdc
--- /dev/null
+++ b/org.eclipse.osee.support.test/.classpath
@@ -0,0 +1,7 @@
+<?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.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.support.test/.project b/org.eclipse.osee.support.test/.project
new file mode 100644
index 00000000000..65a30c391b0
--- /dev/null
+++ b/org.eclipse.osee.support.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.support.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.support.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osee.support.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..f5cf7881eb6
--- /dev/null
+++ b/org.eclipse.osee.support.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Tue May 12 10:54:24 MST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/org.eclipse.osee.support.test/META-INF/MANIFEST.MF b/org.eclipse.osee.support.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..ff12f032146
--- /dev/null
+++ b/org.eclipse.osee.support.test/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Plug-in
+Bundle-SymbolicName: org.eclipse.osee.support.test;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: org.eclipse.osee.support.test.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.framework.logging;bundle-version="0.4.0",
+ org.eclipse.osee.framework.plugin.core;bundle-version="0.4.0",
+ org.eclipse.osee.framework.ui.plugin;bundle-version="0.4.0",
+ org.eclipse.osee.framework.ui.skynet;bundle-version="0.4.0",
+ org.eclipse.osee.framework.core.client;bundle-version="0.5.0",
+ org.junit4;bundle-version="4.3.1",
+ org.eclipse.osee.support.test.util;bundle-version="1.0.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: org.eclipse.osee.ats.test,
+ org.eclipse.osee.ats.test.cases,
+ org.eclipse.osee.ats.test.util,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.db.connection.exception,
+ org.eclipse.osee.framework.skynet.core.test,
+ org.eclipse.osee.framework.skynet.core.test.cases
+Export-Package: org.eclipse.osee.support.test
diff --git a/org.eclipse.osee.support.test/MasterTestSuite_DemoDbTests.launch b/org.eclipse.osee.support.test/MasterTestSuite_DemoDbTests.launch
new file mode 100644
index 00000000000..457c2704869
--- /dev/null
+++ b/org.eclipse.osee.support.test/MasterTestSuite_DemoDbTests.launch
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="askclear" value="false"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="true"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+<booleanAttribute key="default" value="false"/>
+<stringAttribute key="deselected_workspace_plugins" value="lba.utility.ada.editor,org.eclipse.osee.ote.logging,org.eclipse.osee.ote.messaging.dds,lba.feature.source,org.eclipse.osee.ote.ui.host.cmd,lba.tte,org.eclipse.osee.ote.message,lba.ote.shared.memory,lba.ats.config.v11reu.processor,lba.ats.config.v13.processor,lba.help,lba.ote.test.manager,lba.ote.ui.mp.versions,lba.utility.workspace.status,lba.utility.count,org.eclipse.osee.ote.core,org.eclipse.osee.ote.define,lba.ats.config.blk3.pids,lba.ats.config.deliverable,lba.ote.server,lba.ote.crewinput,org.eclipse.osee.ote.ui.markers,lba.ote.message.support,org.eclipse.osee.ote.ui.define,lba.ats.config.osee,org.eclipse.osee.ote.feature.source,org.eclipse.osee.ote.ui.output,lba.ats.config.common.test,lba.test.support.libraries,lba.utility.feature.source,org.eclipse.osee.ote.ui.message,lba.ats.config.tools,lba.ats.config.process,lba.define,lba.ote.core,org.eclipse.osee.ote.ui.test.manager,lba.ats.config.common,lba.skynet.config,org.eclipse.osee.ote.ui.test.output,org.eclipse.osee.ote.ui,lba.ote.msg.gen,lba.framework.ui.skynet,lba.utility.external.editor,lba.ats.config.blk3.mp,lba.db.connection,lba.ote.autoGen.testGen,org.eclipse.osee.ote.ui.mux"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../junit-workspace-atsTest"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_DemoDbTests.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.osee.support.test.MasterTestSuite_DemoDbTests"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osee.support.test"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#13;&#10;-XX:MaxPermSize=256m&#13;&#10;-Dosee.log.default=INFO&#13;&#10;-Dequinox.ds.debug=true &#13;&#10;-Dosee.application.server=http://localhost:8089&#13;&#10;-Dosee.authentication.protocol=demo"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.osee.framework.ui.product.osee"/>
+<stringAttribute key="selected_target_plugins" value="com.ibm.icu,com.ibm.icu.source,com.jcraft.jsch,com.lowagie.itext,javax.servlet,javax.servlet.jsp,javax.servlet.jsp.source,javax.servlet.source,javax.xml,org.apache.ant,org.apache.ant.source,org.apache.commons.codec,org.apache.commons.el,org.apache.commons.el.source,org.apache.commons.httpclient,org.apache.commons.logging,org.apache.commons.logging.source,org.apache.jasper,org.apache.jasper.source,org.apache.lucene,org.apache.lucene.analysis,org.apache.lucene.analysis.source,org.apache.lucene.source,org.eclipse.ant.core,org.eclipse.ant.ui,org.eclipse.birt.chart.engine,org.eclipse.birt.core,org.eclipse.compare,org.eclipse.core.boot,org.eclipse.core.commands,org.eclipse.core.contenttype,org.eclipse.core.databinding,org.eclipse.core.databinding.beans,org.eclipse.core.expressions,org.eclipse.core.filebuffers,org.eclipse.core.filesystem,org.eclipse.core.filesystem.win32.x86,org.eclipse.core.jobs,org.eclipse.core.net,org.eclipse.core.net.win32.x86,org.eclipse.core.resources,org.eclipse.core.resources.compatibility,org.eclipse.core.resources.win32.x86,org.eclipse.core.runtime,org.eclipse.core.runtime.compatibility,org.eclipse.core.runtime.compatibility.auth,org.eclipse.core.runtime.compatibility.registry,org.eclipse.core.variables,org.eclipse.cvs,org.eclipse.cvs.source,org.eclipse.debug.core,org.eclipse.debug.ui,org.eclipse.draw2d,org.eclipse.draw2d.doc.isv,org.eclipse.ecf,org.eclipse.ecf.filetransfer,org.eclipse.ecf.identity,org.eclipse.ecf.ssl,org.eclipse.emf.common,org.eclipse.emf.ecore,org.eclipse.emf.ecore.xmi,org.eclipse.equinox.app,org.eclipse.equinox.common,org.eclipse.equinox.ds,org.eclipse.equinox.frameworkadmin,org.eclipse.equinox.frameworkadmin.equinox,org.eclipse.equinox.http.jetty,org.eclipse.equinox.http.registry,org.eclipse.equinox.http.servlet,org.eclipse.equinox.jsp.jasper,org.eclipse.equinox.jsp.jasper.registry,org.eclipse.equinox.launcher,org.eclipse.equinox.launcher.win32.win32.x86,org.eclipse.equinox.p2.artifact.repository,org.eclipse.equinox.p2.core,org.eclipse.equinox.p2.jarprocessor,org.eclipse.equinox.p2.metadata,org.eclipse.equinox.p2.metadata.generator,org.eclipse.equinox.p2.metadata.repository,org.eclipse.equinox.preferences,org.eclipse.equinox.registry,org.eclipse.equinox.security,org.eclipse.equinox.security.win32.x86,org.eclipse.equinox.util,org.eclipse.gef,org.eclipse.gef.doc.isv,org.eclipse.gef.examples.ui.pde,org.eclipse.gef.source,org.eclipse.help,org.eclipse.help.appserver,org.eclipse.help.base,org.eclipse.help.ui,org.eclipse.help.webapp,org.eclipse.jdt,org.eclipse.jdt.apt.core,org.eclipse.jdt.apt.pluggable.core,org.eclipse.jdt.apt.ui,org.eclipse.jdt.compiler.apt,org.eclipse.jdt.compiler.tool,org.eclipse.jdt.core,org.eclipse.jdt.core.manipulation,org.eclipse.jdt.debug,org.eclipse.jdt.debug.ui,org.eclipse.jdt.doc.isv,org.eclipse.jdt.doc.user,org.eclipse.jdt.junit,org.eclipse.jdt.junit.runtime,org.eclipse.jdt.junit4.runtime,org.eclipse.jdt.launching,org.eclipse.jdt.source,org.eclipse.jdt.ui,org.eclipse.jface,org.eclipse.jface.databinding,org.eclipse.jface.text,org.eclipse.jsch.core,org.eclipse.jsch.ui,org.eclipse.ltk.core.refactoring,org.eclipse.ltk.ui.refactoring,org.eclipse.nebula.widgets.calendarcombo,org.eclipse.nebula.widgets.calendarcombo,org.eclipse.osgi,org.eclipse.osgi.services,org.eclipse.osgi.util,org.eclipse.pde,org.eclipse.pde.build,org.eclipse.pde.core,org.eclipse.pde.doc.user,org.eclipse.pde.junit.runtime,org.eclipse.pde.runtime,org.eclipse.pde.source,org.eclipse.pde.ui,org.eclipse.pde.ui.templates,org.eclipse.platform,org.eclipse.platform.doc.isv,org.eclipse.platform.doc.user,org.eclipse.platform.source,org.eclipse.rcp,org.eclipse.rcp.source,org.eclipse.sdk,org.eclipse.search,org.eclipse.swt,org.eclipse.swt.win32.win32.x86,org.eclipse.team.core,org.eclipse.team.cvs.core,org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui,org.eclipse.team.svn,org.eclipse.team.svn.core,org.eclipse.team.svn.help,org.eclipse.team.svn.ui,org.eclipse.team.ui,org.eclipse.text,org.eclipse.ui,org.eclipse.ui.browser,org.eclipse.ui.cheatsheets,org.eclipse.ui.console,org.eclipse.ui.editors,org.eclipse.ui.externaltools,org.eclipse.ui.forms,org.eclipse.ui.ide,org.eclipse.ui.ide.application,org.eclipse.ui.intro,org.eclipse.ui.intro.universal,org.eclipse.ui.navigator,org.eclipse.ui.navigator.resources,org.eclipse.ui.net,org.eclipse.ui.presentations.r21,org.eclipse.ui.views,org.eclipse.ui.views.log,org.eclipse.ui.views.properties.tabbed,org.eclipse.ui.win32,org.eclipse.ui.workbench,org.eclipse.ui.workbench.compatibility,org.eclipse.ui.workbench.texteditor,org.eclipse.update.configurator,org.eclipse.update.core,org.eclipse.update.core.win32,org.eclipse.update.scheduler,org.eclipse.update.ui,org.eclipse.zest.core,org.eclipse.zest.layouts,org.junit,org.junit.source,org.junit4,org.mortbay.jetty,org.mortbay.jetty.source,org.mozilla.rhino,org.polarion.eclipse.team.svn.connector"/>
+<stringAttribute key="selected_workspace_plugins" value="org.eclipse.osee.framework.skynet.core.test2,org.eclipse.osee.framework.session.management.servlet,org.eclipse.osee.framework.search.engine.servlet,org.eclipse.osee.framework.database,org.eclipse.nebula.widgets.xviewer,org.eclipse.osee.framework.resource.provider.common,org.eclipse.osee.ats.feature.source,org.eclipse.osee.framework.branch.management,org.eclipse.osee.framework.jdbcodbc,org.eclipse.osee.framework.ui.service.control,org.eclipse.osee.framework.ui.encrypter,org.eclipse.osee.framework.resource.locator.attribute.test,org.eclipse.osee.ote.messaging.dds,org.eclipse.osee.ote.connection.service,org.eclipse.osee.ats,org.eclipse.osee.framework.updater,org.eclipse.osee.framework.derby,org.eclipse.osee.ats.test,org.eclipse.osee.framework.client.info.servlet,org.eclipse.osee.ote.message,org.eclipse.osee.framework.resource.management.test,org.eclipse.osee.framework.ui.skynet.test,org.eclipse.osee.ats.config.demo,org.eclipse.osee.framework.ui.skynet,org.eclipse.osee.framework.skynet.core.test,org.eclipse.osee.framework.svn,org.eclipse.osee.framework.antsupport,org.eclipse.osee.framework.core,org.eclipse.osee.framework.feature.source,org.apache.commons.net,org.eclipse.osee.framework.db.connection,org.eclipse.osee.framework.messaging,org.eclipse.osee.framework.server.lookup.servlet,org.eclipse.osee.demo.db.connection,org.eclipse.osee.framework.plugin.core,org.eclipse.osee.framework.ui.swt,org.eclipse.osee.framework.postgresql,org.eclipse.osee.framework.ui.admin,lba.define.test,org.eclipse.osee.ote.core,org.eclipse.osee.ote.define,org.eclipse.osee.framework.search.engine,org.eclipse.osee.framework.resource.management,org.eclipse.osee.framework.jini,org.eclipse.osee.framework.resource.management.servlet,org.eclipse.osee.ote.ui.markers,org.eclipse.osee.ote.ui.define,org.eclipse.osee.framework.skynet.core,derby.driver,org.eclipse.osee.framework.ui.skynet.zest,org.eclipse.osee.framework.core.server,lba.ats.config.common.test,org.eclipse.osee.support.test,org.eclipse.osee.framework.logging,org.eclipse.osee.framework.core.client,org.eclipse.osee.framework.templates,lba.define,org.eclipse.osee.framework.resource.locator.attribute,org.eclipse.osee.support.test.util,org.eclipse.osee.framework.messaging.event.skynet,org.eclipse.osee.framework.server.admin,org.eclipse.osee.framework.ui.jdk,org.eclipse.osee.framework.jdk.core,org.eclipse.osee.framework.ui.product,org.eclipse.osee.ote.ui.test.manager,org.eclipse.osee.framework.branch.management.servlet,net.jini,lba.ats.config.common,org.eclipse.osee.define,javax.mail.glassfish,org.eclipse.osee.ote.ui,org.postgresql.driver,jakarta.commons.net,org.eclipse.osee.framework.resource.management.servlet.test,lba.framework.ui.skynet,org.eclipse.osee.framework.ui.security,org.eclipse.osee.ote.client,oracle.driver,org.apache.commons.lang,org.eclipse.osee.framework.ui.plugin,org.eclipse.osee.framework.resource.provider.attribute,org.eclipse.osee.framework.ui.feature.source,org.eclipse.osee.framework.artifact.servlet"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="false"/>
+<booleanAttribute key="useProduct" value="true"/>
+</launchConfiguration>
diff --git a/org.eclipse.osee.support.test/build.properties b/org.eclipse.osee.support.test/build.properties
new file mode 100644
index 00000000000..6f20375d6c7
--- /dev/null
+++ b/org.eclipse.osee.support.test/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/Activator.java b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/Activator.java
new file mode 100644
index 00000000000..d9436f74b95
--- /dev/null
+++ b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/Activator.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.support.test;
+
+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.support.test";
+
+ // 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.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_DemoDbTests.java b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_DemoDbTests.java
new file mode 100644
index 00000000000..009538d2189
--- /dev/null
+++ b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_DemoDbTests.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.support.test;
+
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.ats.test.AtsTest_Config_Suite;
+import org.eclipse.osee.ats.test.AtsTest_Demo_Suite;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.skynet.core.test.FrameworkCore_Demo_Suite;
+import org.eclipse.osee.framework.ui.skynet.test.FrameworkUi_Demo_Suite;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsTest_Config_Suite.class, AtsTest_Demo_Suite.class, FrameworkUi_Demo_Suite.class,
+ FrameworkCore_Demo_Suite.class})
+/**
+ * This suite should contain all cases and suites that can be run against a Demo Db Init and Demo Populated osee
+ * database.
+ *
+ * @author Donald G. Dunne
+ */
+public class MasterTestSuite_DemoDbTests {
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertTrue("Should be run on demo datbase.", TestUtil.isDemoDb());
+ assertTrue("Demo Application Server must be running.",
+ ClientSessionManager.getAuthenticationProtocols().contains("demo"));
+ assertTrue("Client must authenticate using demo protocol",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+}
diff --git a/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_ProductionDbTests.java b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_ProductionDbTests.java
new file mode 100644
index 00000000000..d08f9c3494b
--- /dev/null
+++ b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_ProductionDbTests.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.support.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.ats.test.AtsTest_Config_Suite;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.skynet.core.test.FrameworkCore_Production_Suite;
+import org.eclipse.osee.framework.ui.skynet.test.FrameworkUi_Production_Suite;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsTest_Config_Suite.class, FrameworkUi_Production_Suite.class,
+ FrameworkCore_Production_Suite.class})
+/**
+ * This suite should contain any test that can be run against a deployed OSEE database.<br>
+ * <br>
+ * Example test cases would be database health checks.
+ *
+ * @author Donald G. Dunne
+ */
+public class MasterTestSuite_ProductionDbTests {
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertTrue("Should be run on production datbase.", TestUtil.isProductionDb());
+ assertFalse("Application Server must be running.", ClientSessionManager.getAuthenticationProtocols().contains(
+ "demo"));
+ assertFalse("Client can't authenticate using demo protocol",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+}
diff --git a/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_TestDbTests.java b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_TestDbTests.java
new file mode 100644
index 00000000000..8fc3091eaf5
--- /dev/null
+++ b/org.eclipse.osee.support.test/src/org/eclipse/osee/support/test/MasterTestSuite_TestDbTests.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.support.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.eclipse.osee.ats.test.AtsTest_TestDb_Suite;
+import org.eclipse.osee.framework.core.client.ClientSessionManager;
+import org.eclipse.osee.framework.ui.skynet.test.FrameworkUi_TestDb_Suite;
+import org.eclipse.osee.support.test.util.TestUtil;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {AtsTest_TestDb_Suite.class, FrameworkUi_TestDb_Suite.class})
+/**
+ * This Test Suite is to run against a postgres database with ATS Developer as the DbInit.<br>
+ * <br>
+ * Example test cases would be a test that purges or corrupts database data
+ *
+ * @author Donald G. Dunne
+ */
+public class MasterTestSuite_TestDbTests {
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ assertTrue("Should be run on production datbase.", TestUtil.isTestDb());
+ assertFalse("Application Server must be running.", ClientSessionManager.getAuthenticationProtocols().contains(
+ "demo"));
+ assertFalse("Can't run using Demo Application Server",
+ ClientSessionManager.getSession().getAuthenticationProtocol().equals("demo"));
+ }
+
+}
diff --git a/org.eclipse.osee.updatesite/.project b/org.eclipse.osee.updatesite/.project
new file mode 100644
index 00000000000..4fcf0a8b8e5
--- /dev/null
+++ b/org.eclipse.osee.updatesite/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.updatesite</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.updatesite/site.xml b/org.eclipse.osee.updatesite/site.xml
new file mode 100644
index 00000000000..9686b06685d
--- /dev/null
+++ b/org.eclipse.osee.updatesite/site.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+ <feature url="features/org.eclipse.osee.master.feature_1.0.0.qualifier.jar" id="org.eclipse.osee.master.feature" version="1.0.0.qualifier">
+ <category name="OSEE"/>
+ </feature>
+ <category-def name="OSEE" label="OSEE"/>
+</site>

Back to the top